ZGlmZiAtLWdpdCBhLy5jdnNpZ25vcmUgYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI2YzMyLi4wMDAwMDAwCi0tLSBhLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0qLWFsbAotKi1jbwotKi1kaXJzCi0qLWRvbmUKLSotaW5zdGFsbC1pbmZvCi0qLXNyYwotKi1zdGFtcC0qCi0qLXRhZ2dlZAotYmxvY2tpdAotY2ZnLXBhcGVyLmluZm8KLWNvbmZpZy5zdGF0dXMKLWNvbmZpZ3VyZS5hdXgKLWNvbmZpZ3VyZS5jcAotY29uZmlndXJlLmNwcwotY29uZmlndXJlLmR2aQotY29uZmlndXJlLmZuCi1jb25maWd1cmUuZm5zCi1jb25maWd1cmUua3kKLWNvbmZpZ3VyZS5reXMKLWNvbmZpZ3VyZS5sb2cKLWNvbmZpZ3VyZS5wZwotY29uZmlndXJlLnBncwotY29uZmlndXJlLnRvYwotY29uZmlndXJlLnRwCi1jb25maWd1cmUudHBzCi1jb25maWd1cmUudnIKLWNvbmZpZ3VyZS52cnMKLWRpci5pbmZvCi1NYWtlZmlsZQotbG9zdCtmb3VuZApkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvQ09QWUlORworKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0JCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgICAgICAgICAgICAgICAgICAgICAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZQotc29mdHdhcmUtLXRvIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gIFRoaXMKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uJ3Mgc29mdHdhcmUgYW5kIHRvIGFueSBvdGhlciBwcm9ncmFtIHdob3NlIGF1dGhvcnMgY29tbWl0IHRvCi11c2luZyBpdC4gIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSBpcyBjb3ZlcmVkIGJ5Ci10aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgIFlvdSBjYW4gYXBwbHkgaXQgdG8KLXlvdXIgcHJvZ3JhbXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UKLWRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCi1ncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQKLXlvdSBoYXZlLiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlCi1zb3VyY2UgY29kZS4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyCi1yaWdodHMuCi0KLSAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAotKDIpIG9mZmVyIHlvdSB0aGlzIGxpY2Vuc2Ugd2hpY2ggZ2l2ZXMgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwKLWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGUgc29mdHdhcmUuCi0KLSAgQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1zb2Z0d2FyZS4gIElmIHRoZSBzb2Z0d2FyZSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCi10aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uIHRoZSBvcmlnaW5hbAotYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0KLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCByZWRpc3RyaWJ1dG9ycyBvZiBhIGZyZWUKLXByb2dyYW0gd2lsbCBpbmRpdmlkdWFsbHkgb2J0YWluIHBhdGVudCBsaWNlbnNlcywgaW4gZWZmZWN0IG1ha2luZyB0aGUKLXByb2dyYW0gcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueQotcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4KLQwKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgYXBwbGllcyB0byBhbnkgcHJvZ3JhbSBvciBvdGhlciB3b3JrIHdoaWNoIGNvbnRhaW5zCi1hIG5vdGljZSBwbGFjZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXIgc2F5aW5nIGl0IG1heSBiZSBkaXN0cmlidXRlZAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoZSAiUHJvZ3JhbSIsIGJlbG93LAotcmVmZXJzIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iCi1tZWFucyBlaXRoZXIgdGhlIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OgotdGhhdCBpcyB0byBzYXksIGEgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwKLWVpdGhlciB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyCi1sYW5ndWFnZS4gIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluCi10aGUgdGVybSAibW9kaWZpY2F0aW9uIi4pICBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KLQotQWN0aXZpdGllcyBvdGhlciB0aGFuIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQgbW9kaWZpY2F0aW9uIGFyZSBub3QKLWNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlOyB0aGV5IGFyZSBvdXRzaWRlIGl0cyBzY29wZS4gIFRoZSBhY3Qgb2YKLXJ1bm5pbmcgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0KLWlzIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtIChpbmRlcGVuZGVudCBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLgotV2hldGhlciB0aGF0IGlzIHRydWUgZGVwZW5kcyBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCi0KLSAgMS4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzCi1zb3VyY2UgY29kZSBhcyB5b3UgcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UKLWNvbnNwaWN1b3VzbHkgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUKLWNvcHlyaWdodCBub3RpY2UgYW5kIGRpc2NsYWltZXIgb2Ygd2FycmFudHk7IGtlZXAgaW50YWN0IGFsbCB0aGUKLW5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzIExpY2Vuc2UgYW5kIHRvIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsKLWFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UKLWFsb25nIHdpdGggdGhlIFByb2dyYW0uCi0KLVlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAoteW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KLQotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBZb3UgbXVzdCBjYXVzZSB0aGUgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCi0gICAgd2hvbGUgb3IgaW4gcGFydCBjb250YWlucyBvciBpcyBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0gb3IgYW55Ci0gICAgcGFydCB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQKLSAgICBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBjKSBJZiB0aGUgbW9kaWZpZWQgcHJvZ3JhbSBub3JtYWxseSByZWFkcyBjb21tYW5kcyBpbnRlcmFjdGl2ZWx5Ci0gICAgd2hlbiBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaAotICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KLSAgICBhbm5vdW5jZW1lbnQgaW5jbHVkaW5nIGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kIGEKLSAgICBub3RpY2UgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUKLSAgICBhIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyCi0gICAgdGhlc2UgY29uZGl0aW9ucywgYW5kIHRlbGxpbmcgdGhlIHVzZXIgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMKLSAgICBMaWNlbnNlLiAgKEV4Y2VwdGlvbjogaWYgdGhlIFByb2dyYW0gaXRzZWxmIGlzIGludGVyYWN0aXZlIGJ1dAotICAgIGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2ggYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24KLSAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKLQwKLVRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiAgSWYKLWlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sCi1hbmQgY2FuIGJlIHJlYXNvbmFibHkgY29uc2lkZXJlZCBpbmRlcGVuZGVudCBhbmQgc2VwYXJhdGUgd29ya3MgaW4KLXRoZW1zZWx2ZXMsIHRoZW4gdGhpcyBMaWNlbnNlLCBhbmQgaXRzIHRlcm1zLCBkbyBub3QgYXBwbHkgdG8gdGhvc2UKLXNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gIEJ1dCB3aGVuIHlvdQotZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkCi1vbiB0aGUgUHJvZ3JhbSwgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd2hvbGUgbXVzdCBiZSBvbiB0aGUgdGVybXMgb2YKLXRoaXMgTGljZW5zZSwgd2hvc2UgcGVybWlzc2lvbnMgZm9yIG90aGVyIGxpY2Vuc2VlcyBleHRlbmQgdG8gdGhlCi1lbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIFByb2dyYW0uCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIFByb2dyYW0KLXdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhIHdvcmsgYmFzZWQgb24gaXQsCi11bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybSB1bmRlciB0aGUgdGVybXMgb2YKLVNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUKLSAgICBzb3VyY2UgY29kZSwgd2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMKLSAgICAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKLQotICAgIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlCi0gICAgeWVhcnMsIHRvIGdpdmUgYW55IHRoaXJkIHBhcnR5LCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZSB0aGFuIHlvdXIKLSAgICBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCi0gICAgbWFjaGluZS1yZWFkYWJsZSBjb3B5IG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBjb2RlLCB0byBiZQotICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtCi0gICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYykgQWNjb21wYW55IGl0IHdpdGggdGhlIGluZm9ybWF0aW9uIHlvdSByZWNlaXZlZCBhcyB0byB0aGUgb2ZmZXIKLSAgICB0byBkaXN0cmlidXRlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUuICAoVGhpcyBhbHRlcm5hdGl2ZSBpcwotICAgIGFsbG93ZWQgb25seSBmb3Igbm9uY29tbWVyY2lhbCBkaXN0cmlidXRpb24gYW5kIG9ubHkgaWYgeW91Ci0gICAgcmVjZWl2ZWQgdGhlIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaAotICAgIGFuIG9mZmVyLCBpbiBhY2NvcmQgd2l0aCBTdWJzZWN0aW9uIGIgYWJvdmUuKQotCi1UaGUgc291cmNlIGNvZGUgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZQotY29kZSBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKLWFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0bwotY29udHJvbCBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgSG93ZXZlciwgYXMgYQotc3BlY2lhbCBleGNlcHRpb24sIHRoZSBzb3VyY2UgY29kZSBkaXN0cmlidXRlZCBuZWVkIG5vdCBpbmNsdWRlCi1hbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeQotZm9ybSkgd2l0aCB0aGUgbWFqb3IgY29tcG9uZW50cyAoY29tcGlsZXIsIGtlcm5lbCwgYW5kIHNvIG9uKSBvZiB0aGUKLW9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGV4ZWN1dGFibGUgcnVucywgdW5sZXNzIHRoYXQgY29tcG9uZW50Ci1pdHNlbGYgYWNjb21wYW5pZXMgdGhlIGV4ZWN1dGFibGUuCi0KLUlmIGRpc3RyaWJ1dGlvbiBvZiBleGVjdXRhYmxlIG9yIG9iamVjdCBjb2RlIGlzIG1hZGUgYnkgb2ZmZXJpbmcKLWFjY2VzcyB0byBjb3B5IGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCB0aGVuIG9mZmVyaW5nIGVxdWl2YWxlbnQKLWFjY2VzcyB0byBjb3B5IHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcwotZGlzdHJpYnV0aW9uIG9mIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotDAotICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLWV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQKLW90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2Ugb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpcwotdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91ciByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlLgotSG93ZXZlciwgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIKLXRoaXMgTGljZW5zZSB3aWxsIG5vdCBoYXZlIHRoZWlyIGxpY2Vuc2VzIHRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoCi1wYXJ0aWVzIHJlbWFpbiBpbiBmdWxsIGNvbXBsaWFuY2UuCi0KLSAgNS4gWW91IGFyZSBub3QgcmVxdWlyZWQgdG8gYWNjZXB0IHRoaXMgTGljZW5zZSwgc2luY2UgeW91IGhhdmUgbm90Ci1zaWduZWQgaXQuICBIb3dldmVyLCBub3RoaW5nIGVsc2UgZ3JhbnRzIHlvdSBwZXJtaXNzaW9uIHRvIG1vZGlmeSBvcgotZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBvciBpdHMgZGVyaXZhdGl2ZSB3b3Jrcy4gIFRoZXNlIGFjdGlvbnMgYXJlCi1wcm9oaWJpdGVkIGJ5IGxhdyBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5Ci1tb2RpZnlpbmcgb3IgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kCi1hbGwgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpbmcgb3IgbW9kaWZ5aW5nCi10aGUgUHJvZ3JhbSBvciB3b3JrcyBiYXNlZCBvbiBpdC4KLQotICA2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1Qcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bwotdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIKLXJlc3RyaWN0aW9ucyBvbiB0aGUgcmVjaXBpZW50cycgZXhlcmNpc2Ugb2YgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmVpbi4KLVlvdSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHRvCi10aGlzIExpY2Vuc2UuCi0KLSAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgotYW55IHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0bwotYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKLWNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSwgd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotDAotICA4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlCi1tYXkgYWRkIGFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcKLXRob3NlIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcKLWNvdW50cmllcyBub3QgdGh1cyBleGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcwotdGhlIGxpbWl0YXRpb24gYXMgaWYgd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMKLW9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAotYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCi1hZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KLQotRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUgUHJvZ3JhbQotc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKLWxhdGVyIHZlcnNpb24iLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLWVpdGhlciBvZiB0aGF0IHZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mCi10aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLgotCi0gIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBkaWZmZXJlbnQsIHdyaXRlIHRvIHRoZSBhdXRob3IKLXRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcyBjb3B5cmlnaHRlZCBieSB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzCi1tYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2Fscwotb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZAotb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nIGFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTyBXQVJSQU5UWQotRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOCi1PVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCi1QUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRAotT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLU1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMKLVRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUKLVBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLAotUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTIuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORwotV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgotUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywKLUlOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORwotT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRAotVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZCi1ZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUgotUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFCi1QT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLQkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAotZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCi0KLSAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Ci10aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSAxOXl5ICA8bmFtZSBvZiBhdXRob3I+Ci0KLSAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0KLQotQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKLXdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6Ci0KLSAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKLSAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCi0gICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KLQotVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCi1wYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5Ci1iZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKLW1vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCi0KLVlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCi1zY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgotbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgotCi0gIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KLSAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCi0KLSAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5Ci0gIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCi0KLVRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bwotcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKLWNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQotbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCi1QdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL0NPUFlJTkcuTElCIGIvQ09QWUlORy5MSUIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MWEzZDEuLjAwMDAwMDAKLS0tIGEvQ09QWUlORy5MSUIKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLQkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCi0KLSBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQotIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcwotIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgotCi1bVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZWQgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBHUEwuICBJdCBpcwotIG51bWJlcmVkIDIgYmVjYXVzZSBpdCBnb2VzIHdpdGggdmVyc2lvbiAyIG9mIHRoZSBvcmRpbmFyeSBHUEwuXQotCi0JCQkgICAgUHJlYW1ibGUKLQotICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYXJlIGRlc2lnbmVkIHRvIHRha2UgYXdheSB5b3VyCi1mcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgaXQuICBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZXMgYXJlIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZQotZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLgotCi0gIFRoaXMgbGljZW5zZSwgdGhlIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBzb21lCi1zcGVjaWFsbHkgZGVzaWduYXRlZCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUsIGFuZCB0byBhbnkKLW90aGVyIGxpYnJhcmllcyB3aG9zZSBhdXRob3JzIGRlY2lkZSB0byB1c2UgaXQuICBZb3UgY2FuIHVzZSBpdCBmb3IKLXlvdXIgbGlicmFyaWVzLCB0b28uCi0KLSAgV2hlbiB3ZSBzcGVhayBvZiBmcmVlIHNvZnR3YXJlLCB3ZSBhcmUgcmVmZXJyaW5nIHRvIGZyZWVkb20sIG5vdAotcHJpY2UuICBPdXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZXMgYXJlIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHlvdQotaGF2ZSB0aGUgZnJlZWRvbSB0byBkaXN0cmlidXRlIGNvcGllcyBvZiBmcmVlIHNvZnR3YXJlIChhbmQgY2hhcmdlIGZvcgotdGhpcyBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0Ci1pZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdAotaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgotCi0gIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gbWFrZSByZXN0cmljdGlvbnMgdGhhdCBmb3JiaWQKLWFueW9uZSB0byBkZW55IHlvdSB0aGVzZSByaWdodHMgb3IgdG8gYXNrIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4KLVRoZXNlIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYKLXlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUgbGlicmFyeSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KLQotICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCB3aGV0aGVyIGdyYXRpcwotb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBnaXZlIHRoZSByZWNpcGllbnRzIGFsbCB0aGUgcmlnaHRzIHRoYXQgd2UgZ2F2ZQoteW91LiAgWW91IG11c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZQotY29kZS4gIElmIHlvdSBsaW5rIGEgcHJvZ3JhbSB3aXRoIHRoZSBsaWJyYXJ5LCB5b3UgbXVzdCBwcm92aWRlCi1jb21wbGV0ZSBvYmplY3QgZmlsZXMgdG8gdGhlIHJlY2lwaWVudHMgc28gdGhhdCB0aGV5IGNhbiByZWxpbmsgdGhlbQotd2l0aCB0aGUgbGlicmFyeSwgYWZ0ZXIgbWFraW5nIGNoYW5nZXMgdG8gdGhlIGxpYnJhcnkgYW5kIHJlY29tcGlsaW5nCi1pdC4gIEFuZCB5b3UgbXVzdCBzaG93IHRoZW0gdGhlc2UgdGVybXMgc28gdGhleSBrbm93IHRoZWlyIHJpZ2h0cy4KLQotICBPdXIgbWV0aG9kIG9mIHByb3RlY3RpbmcgeW91ciByaWdodHMgaGFzIHR3byBzdGVwczogKDEpIGNvcHlyaWdodAotdGhlIGxpYnJhcnksIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwKLXBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBsaWJyYXJ5LgotCi0gIEFsc28sIGZvciBlYWNoIGRpc3RyaWJ1dG9yJ3MgcHJvdGVjdGlvbiwgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4KLXRoYXQgZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlCi1saWJyYXJ5LiAgSWYgdGhlIGxpYnJhcnkgaXMgbW9kaWZpZWQgYnkgc29tZW9uZSBlbHNlIGFuZCBwYXNzZWQgb24sIHdlCi13YW50IGl0cyByZWNpcGllbnRzIHRvIGtub3cgdGhhdCB3aGF0IHRoZXkgaGF2ZSBpcyBub3QgdGhlIG9yaWdpbmFsCi12ZXJzaW9uLCBzbyB0aGF0IGFueSBwcm9ibGVtcyBpbnRyb2R1Y2VkIGJ5IG90aGVycyB3aWxsIG5vdCByZWZsZWN0IG9uCi10aGUgb3JpZ2luYWwgYXV0aG9ycycgcmVwdXRhdGlvbnMuCi0MCi0gIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlCi1wYXRlbnRzLiAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgY29tcGFuaWVzIGRpc3RyaWJ1dGluZyBmcmVlCi1zb2Z0d2FyZSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCB0aHVzIGluIGVmZmVjdAotdHJhbnNmb3JtaW5nIHRoZSBwcm9ncmFtIGludG8gcHJvcHJpZXRhcnkgc29mdHdhcmUuICBUbyBwcmV2ZW50IHRoaXMsCi13ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MKLWZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCi0KLSAgTW9zdCBHTlUgc29mdHdhcmUsIGluY2x1ZGluZyBzb21lIGxpYnJhcmllcywgaXMgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB3aGljaCB3YXMgZGVzaWduZWQgZm9yIHV0aWxpdHkgcHJvZ3JhbXMuICBUaGlzCi1saWNlbnNlLCB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgYXBwbGllcyB0byBjZXJ0YWluCi1kZXNpZ25hdGVkIGxpYnJhcmllcy4gIFRoaXMgbGljZW5zZSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JkaW5hcnkKLW9uZTsgYmUgc3VyZSB0byByZWFkIGl0IGluIGZ1bGwsIGFuZCBkb24ndCBhc3N1bWUgdGhhdCBhbnl0aGluZyBpbiBpdCBpcwotdGhlIHNhbWUgYXMgaW4gdGhlIG9yZGluYXJ5IGxpY2Vuc2UuCi0KLSAgVGhlIHJlYXNvbiB3ZSBoYXZlIGEgc2VwYXJhdGUgcHVibGljIGxpY2Vuc2UgZm9yIHNvbWUgbGlicmFyaWVzIGlzIHRoYXQKLXRoZXkgYmx1ciB0aGUgZGlzdGluY3Rpb24gd2UgdXN1YWxseSBtYWtlIGJldHdlZW4gbW9kaWZ5aW5nIG9yIGFkZGluZyB0byBhCi1wcm9ncmFtIGFuZCBzaW1wbHkgdXNpbmcgaXQuICBMaW5raW5nIGEgcHJvZ3JhbSB3aXRoIGEgbGlicmFyeSwgd2l0aG91dAotY2hhbmdpbmcgdGhlIGxpYnJhcnksIGlzIGluIHNvbWUgc2Vuc2Ugc2ltcGx5IHVzaW5nIHRoZSBsaWJyYXJ5LCBhbmQgaXMKLWFuYWxvZ291cyB0byBydW5uaW5nIGEgdXRpbGl0eSBwcm9ncmFtIG9yIGFwcGxpY2F0aW9uIHByb2dyYW0uICBIb3dldmVyLCBpbgotYSB0ZXh0dWFsIGFuZCBsZWdhbCBzZW5zZSwgdGhlIGxpbmtlZCBleGVjdXRhYmxlIGlzIGEgY29tYmluZWQgd29yaywgYQotZGVyaXZhdGl2ZSBvZiB0aGUgb3JpZ2luYWwgbGlicmFyeSwgYW5kIHRoZSBvcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi10cmVhdHMgaXQgYXMgc3VjaC4KLQotICBCZWNhdXNlIG9mIHRoaXMgYmx1cnJlZCBkaXN0aW5jdGlvbiwgdXNpbmcgdGhlIG9yZGluYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGZvciBsaWJyYXJpZXMgZGlkIG5vdCBlZmZlY3RpdmVseSBwcm9tb3RlIHNvZnR3YXJlCi1zaGFyaW5nLCBiZWNhdXNlIG1vc3QgZGV2ZWxvcGVycyBkaWQgbm90IHVzZSB0aGUgbGlicmFyaWVzLiAgV2UKLWNvbmNsdWRlZCB0aGF0IHdlYWtlciBjb25kaXRpb25zIG1pZ2h0IHByb21vdGUgc2hhcmluZyBiZXR0ZXIuCi0KLSAgSG93ZXZlciwgdW5yZXN0cmljdGVkIGxpbmtpbmcgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgd291bGQgZGVwcml2ZSB0aGUKLXVzZXJzIG9mIHRob3NlIHByb2dyYW1zIG9mIGFsbCBiZW5lZml0IGZyb20gdGhlIGZyZWUgc3RhdHVzIG9mIHRoZQotbGlicmFyaWVzIHRoZW1zZWx2ZXMuICBUaGlzIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0bwotcGVybWl0IGRldmVsb3BlcnMgb2Ygbm9uLWZyZWUgcHJvZ3JhbXMgdG8gdXNlIGZyZWUgbGlicmFyaWVzLCB3aGlsZQotcHJlc2VydmluZyB5b3VyIGZyZWVkb20gYXMgYSB1c2VyIG9mIHN1Y2ggcHJvZ3JhbXMgdG8gY2hhbmdlIHRoZSBmcmVlCi1saWJyYXJpZXMgdGhhdCBhcmUgaW5jb3Jwb3JhdGVkIGluIHRoZW0uICAoV2UgaGF2ZSBub3Qgc2VlbiBob3cgdG8gYWNoaWV2ZQotdGhpcyBhcyByZWdhcmRzIGNoYW5nZXMgaW4gaGVhZGVyIGZpbGVzLCBidXQgd2UgaGF2ZSBhY2hpZXZlZCBpdCBhcyByZWdhcmRzCi1jaGFuZ2VzIGluIHRoZSBhY3R1YWwgZnVuY3Rpb25zIG9mIHRoZSBMaWJyYXJ5LikgIFRoZSBob3BlIGlzIHRoYXQgdGhpcwotd2lsbCBsZWFkIHRvIGZhc3RlciBkZXZlbG9wbWVudCBvZiBmcmVlIGxpYnJhcmllcy4KLQotICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAotbW9kaWZpY2F0aW9uIGZvbGxvdy4gIFBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhCi0id29yayBiYXNlZCBvbiB0aGUgbGlicmFyeSIgYW5kIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBsaWJyYXJ5Ii4gIFRoZQotZm9ybWVyIGNvbnRhaW5zIGNvZGUgZGVyaXZlZCBmcm9tIHRoZSBsaWJyYXJ5LCB3aGlsZSB0aGUgbGF0dGVyIG9ubHkKLXdvcmtzIHRvZ2V0aGVyIHdpdGggdGhlIGxpYnJhcnkuCi0KLSAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciBhIGxpYnJhcnkgdG8gYmUgY292ZXJlZCBieSB0aGUgb3JkaW5hcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgcmF0aGVyIHRoYW4gYnkgdGhpcyBzcGVjaWFsIG9uZS4KLQwKLQkJICBHTlUgTElCUkFSWSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KLQotICAwLiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGFwcGxpZXMgdG8gYW55IHNvZnR3YXJlIGxpYnJhcnkgd2hpY2gKLWNvbnRhaW5zIGEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBvciBvdGhlciBhdXRob3JpemVkCi1wYXJ0eSBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpYnJhcnkKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgKGFsc28gY2FsbGVkICJ0aGlzIExpY2Vuc2UiKS4gIEVhY2ggbGljZW5zZWUgaXMKLWFkZHJlc3NlZCBhcyAieW91Ii4KLQotICBBICJsaWJyYXJ5IiBtZWFucyBhIGNvbGxlY3Rpb24gb2Ygc29mdHdhcmUgZnVuY3Rpb25zIGFuZC9vciBkYXRhCi1wcmVwYXJlZCBzbyBhcyB0byBiZSBjb252ZW5pZW50bHkgbGlua2VkIHdpdGggYXBwbGljYXRpb24gcHJvZ3JhbXMKLSh3aGljaCB1c2Ugc29tZSBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIGRhdGEpIHRvIGZvcm0gZXhlY3V0YWJsZXMuCi0KLSAgVGhlICJMaWJyYXJ5IiwgYmVsb3csIHJlZmVycyB0byBhbnkgc3VjaCBzb2Z0d2FyZSBsaWJyYXJ5IG9yIHdvcmsKLXdoaWNoIGhhcyBiZWVuIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZXNlIHRlcm1zLiAgQSAid29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkiIG1lYW5zIGVpdGhlciB0aGUgTGlicmFyeSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyCi1jb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIExpYnJhcnkgb3IgYQotcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZAotc3RyYWlnaHRmb3J3YXJkbHkgaW50byBhbm90aGVyIGxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcwotaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikKLQotICAiU291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgotbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICBGb3IgYSBsaWJyYXJ5LCBjb21wbGV0ZSBzb3VyY2UgY29kZSBtZWFucwotYWxsIHRoZSBzb3VyY2UgY29kZSBmb3IgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQKLWludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbCBjb21waWxhdGlvbgotYW5kIGluc3RhbGxhdGlvbiBvZiB0aGUgbGlicmFyeS4KLQotICBBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyBhIHByb2dyYW0gdXNpbmcgdGhlIExpYnJhcnkgaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCBvdXRwdXQgZnJvbQotc3VjaCBhIHByb2dyYW0gaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnkgKGluZGVwZW5kZW50IG9mIHRoZSB1c2Ugb2YgdGhlIExpYnJhcnkgaW4gYSB0b29sIGZvcgotd3JpdGluZyBpdCkuICBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIExpYnJhcnkgZG9lcwotYW5kIHdoYXQgdGhlIHByb2dyYW0gdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IGRvZXMuCi0gIAotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBMaWJyYXJ5J3MKLWNvbXBsZXRlIHNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0Ci15b3UgY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbgotYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QKLWFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55Ci13YXJyYW50eTsgYW5kIGRpc3RyaWJ1dGUgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZQotTGlicmFyeS4KLQotICBZb3UgbWF5IGNoYXJnZSBhIGZlZSBmb3IgdGhlIHBoeXNpY2FsIGFjdCBvZiB0cmFuc2ZlcnJpbmcgYSBjb3B5LAotYW5kIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYQotZmVlLgotDAotICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBMaWJyYXJ5IG9yIGFueSBwb3J0aW9uCi1vZiBpdCwgdGh1cyBmb3JtaW5nIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGNvcHkgYW5kCi1kaXN0cmlidXRlIHN1Y2ggbW9kaWZpY2F0aW9ucyBvciB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDEKLWFib3ZlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6Ci0KLSAgICBhKSBUaGUgbW9kaWZpZWQgd29yayBtdXN0IGl0c2VsZiBiZSBhIHNvZnR3YXJlIGxpYnJhcnkuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSB0aGUgZmlsZXMgbW9kaWZpZWQgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICBzdGF0aW5nIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgotCi0gICAgYykgWW91IG11c3QgY2F1c2UgdGhlIHdob2xlIG9mIHRoZSB3b3JrIHRvIGJlIGxpY2Vuc2VkIGF0IG5vCi0gICAgY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgICBkKSBJZiBhIGZhY2lsaXR5IGluIHRoZSBtb2RpZmllZCBMaWJyYXJ5IHJlZmVycyB0byBhIGZ1bmN0aW9uIG9yIGEKLSAgICB0YWJsZSBvZiBkYXRhIHRvIGJlIHN1cHBsaWVkIGJ5IGFuIGFwcGxpY2F0aW9uIHByb2dyYW0gdGhhdCB1c2VzCi0gICAgdGhlIGZhY2lsaXR5LCBvdGhlciB0aGFuIGFzIGFuIGFyZ3VtZW50IHBhc3NlZCB3aGVuIHRoZSBmYWNpbGl0eQotICAgIGlzIGludm9rZWQsIHRoZW4geW91IG11c3QgbWFrZSBhIGdvb2QgZmFpdGggZWZmb3J0IHRvIGVuc3VyZSB0aGF0LAotICAgIGluIHRoZSBldmVudCBhbiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgc3VjaCBmdW5jdGlvbiBvcgotICAgIHRhYmxlLCB0aGUgZmFjaWxpdHkgc3RpbGwgb3BlcmF0ZXMsIGFuZCBwZXJmb3JtcyB3aGF0ZXZlciBwYXJ0IG9mCi0gICAgaXRzIHB1cnBvc2UgcmVtYWlucyBtZWFuaW5nZnVsLgotCi0gICAgKEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uIGluIGEgbGlicmFyeSB0byBjb21wdXRlIHNxdWFyZSByb290cyBoYXMKLSAgICBhIHB1cnBvc2UgdGhhdCBpcyBlbnRpcmVseSB3ZWxsLWRlZmluZWQgaW5kZXBlbmRlbnQgb2YgdGhlCi0gICAgYXBwbGljYXRpb24uICBUaGVyZWZvcmUsIFN1YnNlY3Rpb24gMmQgcmVxdWlyZXMgdGhhdCBhbnkKLSAgICBhcHBsaWNhdGlvbi1zdXBwbGllZCBmdW5jdGlvbiBvciB0YWJsZSB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gbXVzdAotICAgIGJlIG9wdGlvbmFsOiBpZiB0aGUgYXBwbGljYXRpb24gZG9lcyBub3Qgc3VwcGx5IGl0LCB0aGUgc3F1YXJlCi0gICAgcm9vdCBmdW5jdGlvbiBtdXN0IHN0aWxsIGNvbXB1dGUgc3F1YXJlIHJvb3RzLikKLQotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgTGlicmFyeSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBMaWJyYXJ5LCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZQotaXQuCi0KLVRodXMsIGl0IGlzIG5vdCB0aGUgaW50ZW50IG9mIHRoaXMgc2VjdGlvbiB0byBjbGFpbSByaWdodHMgb3IgY29udGVzdAoteW91ciByaWdodHMgdG8gd29yayB3cml0dGVuIGVudGlyZWx5IGJ5IHlvdTsgcmF0aGVyLCB0aGUgaW50ZW50IGlzIHRvCi1leGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKLWNvbGxlY3RpdmUgd29ya3MgYmFzZWQgb24gdGhlIExpYnJhcnkuCi0KLUluIGFkZGl0aW9uLCBtZXJlIGFnZ3JlZ2F0aW9uIG9mIGFub3RoZXIgd29yayBub3QgYmFzZWQgb24gdGhlIExpYnJhcnkKLXdpdGggdGhlIExpYnJhcnkgKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5KSBvbiBhIHZvbHVtZSBvZgotYSBzdG9yYWdlIG9yIGRpc3RyaWJ1dGlvbiBtZWRpdW0gZG9lcyBub3QgYnJpbmcgdGhlIG90aGVyIHdvcmsgdW5kZXIKLXRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMy4gWW91IG1heSBvcHQgdG8gYXBwbHkgdGhlIHRlcm1zIG9mIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UgdG8gYSBnaXZlbiBjb3B5IG9mIHRoZSBMaWJyYXJ5LiAgVG8gZG8KLXRoaXMsIHlvdSBtdXN0IGFsdGVyIGFsbCB0aGUgbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSwgc28KLXRoYXQgdGhleSByZWZlciB0byB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwKLWluc3RlYWQgb2YgdG8gdGhpcyBMaWNlbnNlLiAgKElmIGEgbmV3ZXIgdmVyc2lvbiB0aGFuIHZlcnNpb24gMiBvZiB0aGUKLW9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGhhcyBhcHBlYXJlZCwgdGhlbiB5b3UgY2FuIHNwZWNpZnkKLXRoYXQgdmVyc2lvbiBpbnN0ZWFkIGlmIHlvdSB3aXNoLikgIERvIG5vdCBtYWtlIGFueSBvdGhlciBjaGFuZ2UgaW4KLXRoZXNlIG5vdGljZXMuCi0MCi0gIE9uY2UgdGhpcyBjaGFuZ2UgaXMgbWFkZSBpbiBhIGdpdmVuIGNvcHksIGl0IGlzIGlycmV2ZXJzaWJsZSBmb3IKLXRoYXQgY29weSwgc28gdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMgdG8gYWxsCi1zdWJzZXF1ZW50IGNvcGllcyBhbmQgZGVyaXZhdGl2ZSB3b3JrcyBtYWRlIGZyb20gdGhhdCBjb3B5LgotCi0gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSB3aXNoIHRvIGNvcHkgcGFydCBvZiB0aGUgY29kZSBvZgotdGhlIExpYnJhcnkgaW50byBhIHByb2dyYW0gdGhhdCBpcyBub3QgYSBsaWJyYXJ5LgotCi0gIDQuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYSBwb3J0aW9uIG9yCi1kZXJpdmF0aXZlIG9mIGl0LCB1bmRlciBTZWN0aW9uIDIpIGluIG9iamVjdCBjb2RlIG9yIGV4ZWN1dGFibGUgZm9ybQotdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWNjb21wYW55Ci1pdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlIGNvZGUsIHdoaWNoCi1tdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlIG9uIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KLQotICBJZiBkaXN0cmlidXRpb24gb2Ygb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weSB0aGUKLXNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2Ugc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCB0bwotZGlzdHJpYnV0ZSB0aGUgc291cmNlIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdAotY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4KLQotICA1LiBBIHByb2dyYW0gdGhhdCBjb250YWlucyBubyBkZXJpdmF0aXZlIG9mIGFueSBwb3J0aW9uIG9mIHRoZQotTGlicmFyeSwgYnV0IGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgTGlicmFyeSBieSBiZWluZyBjb21waWxlZCBvcgotbGlua2VkIHdpdGggaXQsIGlzIGNhbGxlZCBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIuICBTdWNoIGEKLXdvcmssIGluIGlzb2xhdGlvbiwgaXMgbm90IGEgZGVyaXZhdGl2ZSB3b3JrIG9mIHRoZSBMaWJyYXJ5LCBhbmQKLXRoZXJlZm9yZSBmYWxscyBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgSG93ZXZlciwgbGlua2luZyBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeQotY3JlYXRlcyBhbiBleGVjdXRhYmxlIHRoYXQgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5IChiZWNhdXNlIGl0Ci1jb250YWlucyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSksIHJhdGhlciB0aGFuIGEgIndvcmsgdGhhdCB1c2VzIHRoZQotbGlicmFyeSIuICBUaGUgZXhlY3V0YWJsZSBpcyB0aGVyZWZvcmUgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UuCi1TZWN0aW9uIDYgc3RhdGVzIHRlcm1zIGZvciBkaXN0cmlidXRpb24gb2Ygc3VjaCBleGVjdXRhYmxlcy4KLQotICBXaGVuIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB1c2VzIG1hdGVyaWFsIGZyb20gYSBoZWFkZXIgZmlsZQotdGhhdCBpcyBwYXJ0IG9mIHRoZSBMaWJyYXJ5LCB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIG1heSBiZSBhCi1kZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnkgZXZlbiB0aG91Z2ggdGhlIHNvdXJjZSBjb2RlIGlzIG5vdC4KLVdoZXRoZXIgdGhpcyBpcyB0cnVlIGlzIGVzcGVjaWFsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIHdvcmsgY2FuIGJlCi1saW5rZWQgd2l0aG91dCB0aGUgTGlicmFyeSwgb3IgaWYgdGhlIHdvcmsgaXMgaXRzZWxmIGEgbGlicmFyeS4gIFRoZQotdGhyZXNob2xkIGZvciB0aGlzIHRvIGJlIHRydWUgaXMgbm90IHByZWNpc2VseSBkZWZpbmVkIGJ5IGxhdy4KLQotICBJZiBzdWNoIGFuIG9iamVjdCBmaWxlIHVzZXMgb25seSBudW1lcmljYWwgcGFyYW1ldGVycywgZGF0YQotc3RydWN0dXJlIGxheW91dHMgYW5kIGFjY2Vzc29ycywgYW5kIHNtYWxsIG1hY3JvcyBhbmQgc21hbGwgaW5saW5lCi1mdW5jdGlvbnMgKHRlbiBsaW5lcyBvciBsZXNzIGluIGxlbmd0aCksIHRoZW4gdGhlIHVzZSBvZiB0aGUgb2JqZWN0Ci1maWxlIGlzIHVucmVzdHJpY3RlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGxlZ2FsbHkgYSBkZXJpdmF0aXZlCi13b3JrLiAgKEV4ZWN1dGFibGVzIGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgY29kZSBwbHVzIHBvcnRpb25zIG9mIHRoZQotTGlicmFyeSB3aWxsIHN0aWxsIGZhbGwgdW5kZXIgU2VjdGlvbiA2LikKLQotICBPdGhlcndpc2UsIGlmIHRoZSB3b3JrIGlzIGEgZGVyaXZhdGl2ZSBvZiB0aGUgTGlicmFyeSwgeW91IG1heQotZGlzdHJpYnV0ZSB0aGUgb2JqZWN0IGNvZGUgZm9yIHRoZSB3b3JrIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDYuCi1BbnkgZXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGF0IHdvcmsgYWxzbyBmYWxsIHVuZGVyIFNlY3Rpb24gNiwKLXdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGxpbmtlZCBkaXJlY3RseSB3aXRoIHRoZSBMaWJyYXJ5IGl0c2VsZi4KLQwKLSAgNi4gQXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBTZWN0aW9ucyBhYm92ZSwgeW91IG1heSBhbHNvIGNvbXBpbGUgb3IKLWxpbmsgYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHdpdGggdGhlIExpYnJhcnkgdG8gcHJvZHVjZSBhCi13b3JrIGNvbnRhaW5pbmcgcG9ydGlvbnMgb2YgdGhlIExpYnJhcnksIGFuZCBkaXN0cmlidXRlIHRoYXQgd29yawotdW5kZXIgdGVybXMgb2YgeW91ciBjaG9pY2UsIHByb3ZpZGVkIHRoYXQgdGhlIHRlcm1zIHBlcm1pdAotbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGZvciB0aGUgY3VzdG9tZXIncyBvd24gdXNlIGFuZCByZXZlcnNlCi1lbmdpbmVlcmluZyBmb3IgZGVidWdnaW5nIHN1Y2ggbW9kaWZpY2F0aW9ucy4KLQotICBZb3UgbXVzdCBnaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCBlYWNoIGNvcHkgb2YgdGhlIHdvcmsgdGhhdCB0aGUKLUxpYnJhcnkgaXMgdXNlZCBpbiBpdCBhbmQgdGhhdCB0aGUgTGlicmFyeSBhbmQgaXRzIHVzZSBhcmUgY292ZXJlZCBieQotdGhpcyBMaWNlbnNlLiAgWW91IG11c3Qgc3VwcGx5IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuICBJZiB0aGUgd29yawotZHVyaW5nIGV4ZWN1dGlvbiBkaXNwbGF5cyBjb3B5cmlnaHQgbm90aWNlcywgeW91IG11c3QgaW5jbHVkZSB0aGUKLWNvcHlyaWdodCBub3RpY2UgZm9yIHRoZSBMaWJyYXJ5IGFtb25nIHRoZW0sIGFzIHdlbGwgYXMgYSByZWZlcmVuY2UKLWRpcmVjdGluZyB0aGUgdXNlciB0byB0aGUgY29weSBvZiB0aGlzIExpY2Vuc2UuICBBbHNvLCB5b3UgbXVzdCBkbyBvbmUKLW9mIHRoZXNlIHRoaW5nczoKLQotICAgIGEpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nCi0gICAgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSBmb3IgdGhlIExpYnJhcnkgaW5jbHVkaW5nIHdoYXRldmVyCi0gICAgY2hhbmdlcyB3ZXJlIHVzZWQgaW4gdGhlIHdvcmsgKHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKLSAgICBTZWN0aW9ucyAxIGFuZCAyIGFib3ZlKTsgYW5kLCBpZiB0aGUgd29yayBpcyBhbiBleGVjdXRhYmxlIGxpbmtlZAotICAgIHdpdGggdGhlIExpYnJhcnksIHdpdGggdGhlIGNvbXBsZXRlIG1hY2hpbmUtcmVhZGFibGUgIndvcmsgdGhhdAotICAgIHVzZXMgdGhlIExpYnJhcnkiLCBhcyBvYmplY3QgY29kZSBhbmQvb3Igc291cmNlIGNvZGUsIHNvIHRoYXQgdGhlCi0gICAgdXNlciBjYW4gbW9kaWZ5IHRoZSBMaWJyYXJ5IGFuZCB0aGVuIHJlbGluayB0byBwcm9kdWNlIGEgbW9kaWZpZWQKLSAgICBleGVjdXRhYmxlIGNvbnRhaW5pbmcgdGhlIG1vZGlmaWVkIExpYnJhcnkuICAoSXQgaXMgdW5kZXJzdG9vZAotICAgIHRoYXQgdGhlIHVzZXIgd2hvIGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIGRlZmluaXRpb25zIGZpbGVzIGluIHRoZQotICAgIExpYnJhcnkgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgYWJsZSB0byByZWNvbXBpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgdG8gdXNlIHRoZSBtb2RpZmllZCBkZWZpbml0aW9ucy4pCi0KLSAgICBiKSBBY2NvbXBhbnkgdGhlIHdvcmsgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdAotICAgIGxlYXN0IHRocmVlIHllYXJzLCB0byBnaXZlIHRoZSBzYW1lIHVzZXIgdGhlIG1hdGVyaWFscwotICAgIHNwZWNpZmllZCBpbiBTdWJzZWN0aW9uIDZhLCBhYm92ZSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUKLSAgICB0aGFuIHRoZSBjb3N0IG9mIHBlcmZvcm1pbmcgdGhpcyBkaXN0cmlidXRpb24uCi0KLSAgICBjKSBJZiBkaXN0cmlidXRpb24gb2YgdGhlIHdvcmsgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MgdG8gY29weQotICAgIGZyb20gYSBkZXNpZ25hdGVkIHBsYWNlLCBvZmZlciBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZSBhYm92ZQotICAgIHNwZWNpZmllZCBtYXRlcmlhbHMgZnJvbSB0aGUgc2FtZSBwbGFjZS4KLQotICAgIGQpIFZlcmlmeSB0aGF0IHRoZSB1c2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIGEgY29weSBvZiB0aGVzZQotICAgIG1hdGVyaWFscyBvciB0aGF0IHlvdSBoYXZlIGFscmVhZHkgc2VudCB0aGlzIHVzZXIgYSBjb3B5LgotCi0gIEZvciBhbiBleGVjdXRhYmxlLCB0aGUgcmVxdWlyZWQgZm9ybSBvZiB0aGUgIndvcmsgdGhhdCB1c2VzIHRoZQotTGlicmFyeSIgbXVzdCBpbmNsdWRlIGFueSBkYXRhIGFuZCB1dGlsaXR5IHByb2dyYW1zIG5lZWRlZCBmb3IKLXJlcHJvZHVjaW5nIHRoZSBleGVjdXRhYmxlIGZyb20gaXQuICBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uLAotdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcyBub3JtYWxseQotZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCi1jb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uCi13aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzCi10aGUgZXhlY3V0YWJsZS4KLQotICBJdCBtYXkgaGFwcGVuIHRoYXQgdGhpcyByZXF1aXJlbWVudCBjb250cmFkaWN0cyB0aGUgbGljZW5zZQotcmVzdHJpY3Rpb25zIG9mIG90aGVyIHByb3ByaWV0YXJ5IGxpYnJhcmllcyB0aGF0IGRvIG5vdCBub3JtYWxseQotYWNjb21wYW55IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgU3VjaCBhIGNvbnRyYWRpY3Rpb24gbWVhbnMgeW91IGNhbm5vdAotdXNlIGJvdGggdGhlbSBhbmQgdGhlIExpYnJhcnkgdG9nZXRoZXIgaW4gYW4gZXhlY3V0YWJsZSB0aGF0IHlvdQotZGlzdHJpYnV0ZS4KLQwKLSAgNy4gWW91IG1heSBwbGFjZSBsaWJyYXJ5IGZhY2lsaXRpZXMgdGhhdCBhcmUgYSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSBzaWRlLWJ5LXNpZGUgaW4gYSBzaW5nbGUgbGlicmFyeSB0b2dldGhlciB3aXRoIG90aGVyIGxpYnJhcnkKLWZhY2lsaXRpZXMgbm90IGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSBzdWNoIGEgY29tYmluZWQKLWxpYnJhcnksIHByb3ZpZGVkIHRoYXQgdGhlIHNlcGFyYXRlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBiYXNlZCBvbgotdGhlIExpYnJhcnkgYW5kIG9mIHRoZSBvdGhlciBsaWJyYXJ5IGZhY2lsaXRpZXMgaXMgb3RoZXJ3aXNlCi1wZXJtaXR0ZWQsIGFuZCBwcm92aWRlZCB0aGF0IHlvdSBkbyB0aGVzZSB0d28gdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSBjb21iaW5lZCBsaWJyYXJ5IHdpdGggYSBjb3B5IG9mIHRoZSBzYW1lIHdvcmsKLSAgICBiYXNlZCBvbiB0aGUgTGlicmFyeSwgdW5jb21iaW5lZCB3aXRoIGFueSBvdGhlciBsaWJyYXJ5Ci0gICAgZmFjaWxpdGllcy4gIFRoaXMgbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gICAgU2VjdGlvbnMgYWJvdmUuCi0KLSAgICBiKSBHaXZlIHByb21pbmVudCBub3RpY2Ugd2l0aCB0aGUgY29tYmluZWQgbGlicmFyeSBvZiB0aGUgZmFjdAotICAgIHRoYXQgcGFydCBvZiBpdCBpcyBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnksIGFuZCBleHBsYWluaW5nCi0gICAgd2hlcmUgdG8gZmluZCB0aGUgYWNjb21wYW55aW5nIHVuY29tYmluZWQgZm9ybSBvZiB0aGUgc2FtZSB3b3JrLgotCi0gIDguIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgbGluayB3aXRoLCBvciBkaXN0cmlidXRlCi10aGUgTGlicmFyeSBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueQotYXR0ZW1wdCBvdGhlcndpc2UgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIKLXJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuICBIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywKLW9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMKLXRlcm1pbmF0ZWQgc28gbG9uZyBhcyBzdWNoIHBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA5LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBMaWJyYXJ5IG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIExpYnJhcnkgKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBMaWJyYXJ5IG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDEwLiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQotb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSwgbGluayB3aXRoIG9yIG1vZGlmeSB0aGUgTGlicmFyeQotc3ViamVjdCB0byB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQwKLSAgMTEuIElmLCBhcyBhIGNvbnNlcXVlbmNlIG9mIGEgY291cnQganVkZ21lbnQgb3IgYWxsZWdhdGlvbiBvZiBwYXRlbnQKLWluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCi1jb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCi1vdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90Ci1leGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdAotZGlzdHJpYnV0ZSBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcwotTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdQotbWF5IG5vdCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiBhIHBhdGVudAotbGljZW5zZSB3b3VsZCBub3QgcGVybWl0IHJveWFsdHktZnJlZSByZWRpc3RyaWJ1dGlvbiBvZiB0aGUgTGlicmFyeSBieQotYWxsIHRob3NlIHdobyByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuCi10aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCBpdCBhbmQgdGhpcyBMaWNlbnNlIHdvdWxkIGJlIHRvCi1yZWZyYWluIGVudGlyZWx5IGZyb20gZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5LgotCi1JZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYW55Ci1wYXJ0aWN1bGFyIGNpcmN1bXN0YW5jZSwgdGhlIGJhbGFuY2Ugb2YgdGhlIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gYXBwbHksCi1hbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlciBjaXJjdW1zdGFuY2VzLgotCi1JdCBpcyBub3QgdGhlIHB1cnBvc2Ugb2YgdGhpcyBzZWN0aW9uIHRvIGluZHVjZSB5b3UgdG8gaW5mcmluZ2UgYW55Ci1wYXRlbnRzIG9yIG90aGVyIHByb3BlcnR5IHJpZ2h0IGNsYWltcyBvciB0byBjb250ZXN0IHZhbGlkaXR5IG9mIGFueQotc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQotaW50ZWdyaXR5IG9mIHRoZSBmcmVlIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gd2hpY2ggaXMKLWltcGxlbWVudGVkIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gIE1hbnkgcGVvcGxlIGhhdmUgbWFkZQotZ2VuZXJvdXMgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZAotdGhyb3VnaCB0aGF0IHN5c3RlbSBpbiByZWxpYW5jZSBvbiBjb25zaXN0ZW50IGFwcGxpY2F0aW9uIG9mIHRoYXQKLXN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlIGF1dGhvci9kb25vciB0byBkZWNpZGUgaWYgaGUgb3Igc2hlIGlzIHdpbGxpbmcKLXRvIGRpc3RyaWJ1dGUgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdAotaW1wb3NlIHRoYXQgY2hvaWNlLgotCi1UaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8KLWJlIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgotCi0gIDEyLiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIExpYnJhcnkgaXMgcmVzdHJpY3RlZCBpbgotY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCi1vcmlnaW5hbCBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIExpYnJhcnkgdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQKLWFuIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAotc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCi1leGNsdWRlZC4gIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUgbGltaXRhdGlvbiBhcyBpZgotd3JpdHRlbiBpbiB0aGUgYm9keSBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTMuIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3Ci12ZXJzaW9ucyBvZiB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLgotU3VjaCBuZXcgdmVyc2lvbnMgd2lsbCBiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLAotYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBMaWJyYXJ5Ci1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQKLSJhbnkgbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQKLWNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgTGlicmFyeSBkb2VzIG5vdCBzcGVjaWZ5IGEKLWxpY2Vuc2UgdmVyc2lvbiBudW1iZXIsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotDAotICAxNC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIExpYnJhcnkgaW50byBvdGhlciBmcmVlCi1wcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlc2UsCi13cml0ZSB0byB0aGUgYXV0aG9yIHRvIGFzayBmb3IgcGVybWlzc2lvbi4gIEZvciBzb2Z0d2FyZSB3aGljaCBpcwotY29weXJpZ2h0ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb247IHdlIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuICBPdXIKLWRlY2lzaW9uIHdpbGwgYmUgZ3VpZGVkIGJ5IHRoZSB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMKLW9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQgb2YgcHJvbW90aW5nIHRoZSBzaGFyaW5nCi1hbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgotCi0JCQkgICAgTk8gV0FSUkFOVFkKLQotICAxNS4gQkVDQVVTRSBUSEUgTElCUkFSWSBJUyBMSUNFTlNFRCBGUkVFIE9GIENIQVJHRSwgVEhFUkUgSVMgTk8KLVdBUlJBTlRZIEZPUiBUSEUgTElCUkFSWSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCi1FWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUgotT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBMSUJSQVJZICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKLUtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi1QVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUKLUxJQlJBUlkgSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIExJQlJBUlkgUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FCi1USEUgQ09TVCBPRiBBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCi0KLSAgMTYuIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4KLVdSSVRJTkcgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZCi1BTkQvT1IgUkVESVNUUklCVVRFIFRIRSBMSUJSQVJZIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVQotRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkgR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUgotQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUKLUxJQlJBUlkgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcKLVJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQgUEFSVElFUyBPUiBBCi1GQUlMVVJFIE9GIFRIRSBMSUJSQVJZIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgU09GVFdBUkUpLCBFVkVOIElGCi1TVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi1EQU1BR0VTLgotCi0JCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0MCi0gICAgIEFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgTGlicmFyaWVzCi0KLSAgSWYgeW91IGRldmVsb3AgYSBuZXcgbGlicmFyeSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAotcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHdlIHJlY29tbWVuZCBtYWtpbmcgaXQgZnJlZSBzb2Z0d2FyZSB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UuICBZb3UgY2FuIGRvIHNvIGJ5IHBlcm1pdHRpbmcKLXJlZGlzdHJpYnV0aW9uIHVuZGVyIHRoZXNlIHRlcm1zIChvciwgYWx0ZXJuYXRpdmVseSwgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotb3JkaW5hcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSkuCi0KLSAgVG8gYXBwbHkgdGhlc2UgdGVybXMsIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIGxpYnJhcnkuICBJdCBpcwotc2FmZXN0IHRvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKLWNvbnZleSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0IHRoZQotImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KLQotICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBsaWJyYXJ5J3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+Ci0gICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgIE1BIDAyMTExLTEzMDcsIFVTQQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIGxpYnJhcnksIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUKLSAgbGlicmFyeSBgRnJvYicgKGEgbGlicmFyeSBmb3IgdHdlYWtpbmcga25vYnMpIHdyaXR0ZW4gYnkgSmFtZXMgUmFuZG9tIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5OTAKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhhdCdzIGFsbCB0aGVyZSBpcyB0byBpdCEKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhYTc1Yy4uMDAwMDAwMAotLS0gYS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw2NTU2ICswLDAgQEAKLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGRpc3RyaWJ1dGlvbiB0YXJnZXRzIHRvIHVzZSBiemlwMiBpbnN0ZWFkIG9mCi0JZ3ppcC4KLQkoVEVYSU5GT19TVVBQT1JUKTogU2V0IHRvIGp1c3QgdGV4aW5mby90ZXhpbmZvLnRleC4KLQkodGF6KTogRG9uJ3QgdXNlIHRleGluZm8vZ3BsLnRleGluZm8gb3IgdGV4aW5mby9sZ3BsLnRleGluZm8uCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBtY29yZSB0YXJnZXQuCi0KLVN1biBNYXkgMzAgMTY6MDM6MTYgMTk5OSAgQ29ydCBEb3VnYW4gIDxjb3J0QGNzLm5tdC5lZHU+Ci0KLQkqIGNvbmZpZy5ndWVzcyAocHBjLSotbGludXgtZ251KTogQWxzbyB1c2UgbGQgZW11bCBlbGYzMnBwY2xpbnV4LgotCi0xOTk5LTA1LTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBFR0NTIHZlcnNpb24uCi0KLTE5OTktMDQtMzAgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBbbW9kZSBsaW5rXSBBbHdheXMgdXNlIENDIGdpdmVuIGJ5IGx0Y29uZmlnLgotCi0xOTk5LTA0LTIzICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMmYuCi0KLTE5OTktMDQtMjAgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgbGlic3R1YiBmb3IgYXJtLWVsZiB0YXJnZXRzLgotCShub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBhbnkgYnNwIHN0dWZmIGZvciBmb3IgYXJtLW9hYmkgdGFyZ2V0cy4KLQlCYWQgbWVyZ2UgcmVtb3ZlZCB0aGVzZSB0d28gY2hhbmdlcy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpPzg2LSotYmVvcyopOiBEbyBjb25maWcgZ3BlcmY7IGRvbid0IGNvbmZpZwotCWdkYiwgbmV3bGliLCBvciBsaWJnbG9zcy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIG1jb3JlIHRhcmdldHMuCi0KLTE5OTktMDQtMDcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKik6IFVzZSBjb25maWcvbXQtZDMwdiBhcyBtYWtlZmlsZSBmcmFnbWVudCwKLQlub3QgbXQtb3NwYWNlLCBpbiBvcmRlciB0byBzaHV0IHVwIGFzc2VtYmxlciB3YXJuaW5nIGFib3V0IHVzaW5nCi0Jc3ltYm9scyB0aGF0IGFyZSBuYW1lZCB0aGUgc2FtZSBhcyByZWdpc3RlcnMuCi0KLTE5OTktMDQtMDcgIERyZXcgTW9zZWxleSAgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWN5Z21vbik6IEFkZGVkIGFsbC10YXJnZXQtYnNwIHRvIHRoZQotCWRlcGVuZGVuY3kgbGlzdCBmb3IgYWxsLXRhcmdldC1jeWdtb24uCi0KLTE5OTktMDQtMDUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBDaGVjayAkaG9zdCwgbm90ICR0YXJnZXQsIGZvciBzZWxlY3RpdmUgbXVsdGlsaWJzLgotCShhcm0tKi0qKTogQWxsb3cgZGlzYWJsaW5nIG9mIGJpZW5kaWFuLCBoL3cgZnAsIDI2IGJpdCBhcGNzLAotCXRodW1iIGludGVyd29ya2luZywgYW5kIHVuZGVyc2NvcmUgcHJlZml4IG11bHRpbGlicy4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG1pc3Npbmc6IFVwZGF0ZSB0byB2ZXJzaW9uIGZyb20gY3VycmVudCBhdXRvbWFrZS4KLQotRnJpIEFwciAgMiAxNToxMTozMiAxOTk5ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogUmVtb3ZlZC4KLQotCSogY29uZmlndXJlLmluIChneHhfaW5jbHVkZV9kaXIpOiBIYW5kbGUgaXQuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLTE5OTktMDMtMjkgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViIChtaXBzNjR2cjQxMTEsbWlwczY0dnI0MTExZWwpIEFkZC4KLQotMTk5OS0wMy0yMSAgQmVuIEVsbGlzdG9uICA8YmplQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IENvcnJlY3QgdHlwbyBmb3IgZGV0ZWN0aW5nIEVMRiBvbiBGcmVlQlNELgotCi1UaHUgTWFyIDE4IDAwOjE3OjUwIDE5OTkgIE1hcmsgRWxicmVjaHQgPHNub3diYWxsM0B1c2EubmV0PgotCi0JKiBjb25maWcvbWgtZ28zMjogRGVsZXRlLgotCSogY29uZmlnL21oLWRqZ3BwOiBOZXcuIFJlbmFtZWQgZnJvbSBtaC1nbzMyLgotCSogY29uZmlndXJlLmluIChwYy1tc2Rvc2RqZ3BwKTogU2V0IGhvc3RfbWFrZWZpbGVfZnJhZyB0bwotCWNvbmZpZy9taC1kamdwcC4KLQotVGh1IE1hciAxMSAxODozNzoyMyAxOTk5ICBEcmV3IE1vc2VsZXkgIDxkbW9zZWxleUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC1ic3ApOiBBZGRlZCBhbGwtZ2NjIGFsbC1iaW51dGlscyBhbmQKLQlhbGwtdGFyZ2V0LW5ld2xpYiB0byBkZXBlbmRlbmN5IGxpc3QgZm9yIGFsbC10YXJnZXQtYnNwLgotCi1UaHUgTWFyIDExIDAxOjE5OjMxIDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuc3ViOiBBZGQgaTM4Ni11d2luIHN1cHBvcnQuCi0JKiBjb25maWcuZ3Vlc3M6IExpa2V3aXNlLgotCi1UaHUgTWFyIDExIDAxOjA3OjU1IDE5OTkgIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPgotCi0JKiBjb25maWd1cmUuaW46IGNsZWFudXAsIGFkZCBtaC0qcGljIGhhbmRsaW5nIGZvciBhcm0sIHNwZWNpYWwKLQljYXNlIHBvd2VycGMqLSotYWl4KgotCi1XZWQgTWFyIDEwIDE4OjM1OjA3IDE5OTkgIEplZmYgSm9obnN0b24gIDxqam9obnN0bkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZWQgdGFyZ2V0LWxpYmdsb3NzIHNvIGxpYm5vc3lzLmEKLQljYW4gYmUgYnVpbHQuCi0KLVdlZCBNYXIgMTAgMTc6Mzk6MDkgMTk5OSAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBic3Agc3VwcG9ydCB0byBhcm0tKi1jb2ZmIGFuZCBhcm0tKi1lbGYKLSAJdGFyZ2V0cy4KLQotMTk5OS0wMy0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVuYW1lIENZR05VUyBMT0NBTCB0byBFR0NTIExPQ0FMCi0KLVN1biBGZWIgMjggMDI6MjA6MDAgMTk5OSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQ2hlY2sgZm9yICJjeWd3aW4qIiByYXRoZXIgdGhhbiAiY3lnd2luMzIqIgotCi0xOTk5LTAyLTI0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBGaXggdHlwbyBpbiBhcm0gcmVjb2duaXRpb24uCi0KLVdlZCBGZWIgMjQgMTM6NTE6NDAgMTk5OSAgRHJldyBNb3NlbGV5ICA8ZG1vc2VsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBDaGFuZ2VkIHRhcmdldF9jb25maWdkaXJzIHRvCi0JaW5jbHVkZSB0YXJnZXQtYnNwIG9ubHkgZm9yIG02OGstKi1lbGYqIGFuZCBtNjhrLSotY29mZioKLQlyYXRoZXIgdGhhbiBtNjhrLSotKiBzaW5jZSBpdCBpcyBub3Qga25vd24gdG8gd29yayBvbgotCW02OGstYW91dC4gRGl0dG8gZm9yIGFybS0qLSpvYWJpLgotCi1XZWQgRmViIDI0IDEyOjUyOjE3IDE5OTkgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotd2luZG93cyopOiBSZW1vdmUsIG5vIGxvbmdlciB1c2VkLgotCSogY29uZmlnL21oLXdpbmRvd3M6IERpdHRvLgotCi0xOTk5LTAyLTE5ICBCZW4gRWxsaXN0b24gPGJqZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IEF1dG9tYXRpY2FsbHkgcmVjb2duaXNlIEVMRiBvbiBGcmVlQlNELiBGcm9tIE5pYWxsCi0JU21hcnQgYW5kIGltcHJvdmVkIGJ5IEFuZHJldyBDYWduZXkuCi0KLVRodSBGZWIgMTggMTk6NTU6MDkgMTk5OSAgTWFyYyBFc3BpZSA8ZXNwaWVAY3ZzLm9wZW5ic2Qub3JnPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBvcGVuYnNkLSotaHBwYS4KLQotV2VkIEZlYiAxNyAwMTozODo1OSAxOTk5ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIE1ha2VmaWxlLmluIChSRUFMTFlfU0VUX0xJQl9QQVRIKTogQXBwZW5kICQkJChSUEFUSF9FTlZWQVIpCi0Jb25seSBpZiBpdCBpcyBub3QgZW1wdHkuCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBmcm9tOiBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQkKLQkqIGNvbmZpZy5ndWVzczogTW9kaWZpZWQgdG8gcmVjb2duaXplIHVuYW1lJ3MgYXJtdiogc3ludGF4LiAKLQotCSogY29uZmlnLnN1YjogTW9kaWZpZWQgdG8gcmVjb2duaXplIHVuYW1lJ3MgYXJtdiogc3ludGF4LgotCi0xOTk5LTAyLTE3ICBNYXJrIFNhbHRlciAgPG1zYWx0ZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCB0YXJnZXQtYnNwIGZvciBzcGFyY2xpdGUuCi0KLU1vbiBGZWIgIDggMTQ6MTc6MjQgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGFscGhhcGNhNVs2N10gYW5kIHVwIHRvIGFscGhhZXY4LgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gcG9ydC4KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBzdHJvbmdhcm0gdGFyZ2V0LgotCi1TdW4gRmViICA3IDE4OjAxOjU0IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCQotCSogY29uZmlndXJlLmluICgqLSotY3lnd2luMzIqKTogVXNlIGNvbmZpZy9taC1jeWd3aW4gaW5zdGVhZCBvZgotCXRoZSBvbGQgbmFtZSBjb25maWcvbWgtY3lnd2luMzIuCi0JRW5hYmxlIHRleGluZm8uCi0KLVRodSBGZWIgIDQgMjA6NDM6MjUgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvIGJ1aWxkIGxkIGZvciBpeDg2IFNvbGFyaXMuCi0KLVR1ZSBGZWIgIDIgMTk6NDY6NDAgMTk5OSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogIFNldCBBUiB0byAkQVIgaW5zdGVhZCBvZgotCSRBUl9GT1JfVEFSR0VULiAgTGlrZXdpc2UgZm9yIFJBTkxJQi4KLQotVHVlIEZlYiAgMiAyMDowNTowNSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcuc3ViIChvYWJpKTogIFJlY29nbml6ZS4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGFybS0qLW9hYmkpOiAgSGFuZGxlLgotCi1TYXQgSmFuIDMwIDA2OjA5OjAwIDE5OTkgIFJvYmVydCBMaXBlICAocm9iZXJ0bGlwZUB1c2EubmV0KQotCi0JKiBjb25maWcuZ3Vlc3M6IEltcHJvdmUgZGV0ZWN0aW9uIG9mIGk2ODYgb24gVW5peFdhcmUgNy4KLQotU2F0IEphbiAzMCAwODowNDowMCAxOTk5ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgaTM4Ni1wYy1pbnRlcml4LgotCSogY29uZmlnLnN1YjogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlnL21oLWludGVyaXg6IE5ldyBmaWxlLgotCi1Nb24gSmFuIDE4IDEzOjU5OjIwIDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgdW5uZWVkZWQgYWxsLXRhcmdldC1saWJpbyBmcm9tCi0JZnJvbSBhbGwtdGFyZ2V0LXdpbnN1cCB0YXJnZXQgc2luY2UgaXQgaXMgbm93IHVubmVlZGVkLgotCUFkZCBhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgaW4gaXRzIHBsYWNlIHNpbmNlIGl0IGlzIG5vdwotCW5lZWRlZC4KLQotV2VkIERlYyAzMCAyMDozNDo1MiAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IG1ha2VmaWxlIHN0dWIgZm9yIGN5Z3dpbiB0YXJnZXQgaXMgcHJvYmFibHkKLQl1bm5lY2Vzc2FyeS4gIFJlbW92ZSBpdCBmb3Igbm93LgotCSogY29uZmlnL210LWN5Z3dpbjogUmVtb3ZlLgotCi1XZWQgRGVjIDMwIDAxOjEzOjAzIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogbGlidGVybWNhcC5hIHNob3VsZCBiZSBidWlsdCB3aGVuIGN5Z3dpbiBpcyB0aGUKLQl0YXJnZXQgYXMgd2VsbCBhcyB0aGUgaG9zdC4KLQkqIGNvbmZpZy5ndWVzczogQWxsb3cgbWl4ZWQgY2FzZSBpbiBjeWd3aW4gdW5hbWUgb3V0cHV0LgotCSogTWFrZWZpbGUuaW46IEFkZCBsaWJ0ZXJtY2FwIHRhcmdldC4KLQkqIGNvbmZpZy9tdC1jeWd3aW46IE5ldyBmaWxlLiAgbGlidGVybWNhcCB0YXJnZXQgaW5mby4KLQotVHVlIERlYyAxNSAxNzowMjo1OCAxOTk4ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgY3lnbW9uIGZvciB4ODYtY29mZiBhbmQgeDg2LWVsZi4gQ29uZmlndXJlCi0gCWN5Z21vbiBmb3IgYWxsIHNwYXJjbGl0ZSB0YXJnZXRzLCByZWdhcmRsZXNzIG9mIG9iamVjdCBmb3JtYXQuCi0KLTE5OTgtMTItMTUgIE1hcmsgU2FsdGVyICA8bXNhbHRlckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIHRhcmdldC1ic3AgZm9yIHNldmVyYWwgdGFyZ2V0IGFyY2hpdGVjdHVyZXMuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBydWxlcyBmb3IgYnNwLgotCi1XZWQgRGVjIDIzIDAwOjIwOjUwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQ2xlYW4gdXAgaGFuZGxpbmcgb2YgaHBwYTIuMC4KLQotVHVlIERlYyAyMiAyMzo1NjozMSAxOTk4ICBSb2RuZXkgQnJvd24gIChyb2RuZXlicm93bkBwbXNjLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgQyBjb2RlIHRvIGlkZW50aWZ5IG1vcmUgSFAgbWFjaGluZXMuCi0KLVRodSBEZWMgMTcgMDE6MjI6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBIYW5kbGUgaHBwYTIuMC4KLQotRnJpIERlYyAgNCAwMTozNDowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogSW1wcm92ZSBkZXRlY3Rpb24gb2YgaHBwYTIuMCBwcm9jZXNzb3JzLgotCi1GcmkgRGVjICA0IDAxOjMzOjA1IDE5OTggIE5pYWxsIFNtYXJ0IDxuaWFsbHNAZXVyaXN0aXguaWU+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEZyZWVCU0QgdXNpbmcgRUxGIGF1dG9tYXRpY2FsbHkuCi0KLTE5OTgtMTEtMjYgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChza2lwLXRoaXMtZGlyKTogQWRkIGhhbmRsaW5nIGZvciBuZXcgc2hlbGwgc2NyaXB0LCB3aGljaAotCW1pZ2h0IGJlIGNyZWF0ZWQgYnkgYSBzdWItZGlyZWN0b3J5J3MgY29uZmlndXJlIHRvIGluZGljYXRlLCB0aGlzIHBhcnRpY3VsYXIKLQlkaXJlY3RvcnkgaXMgInVud2FudGVkIi4KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBMaWtld2lzZS4KLQotCi1XZWQgTm92IDE4IDE4OjI4OjQ1IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBpbXBvcnQgZnJvbSBsaWJ0b29sLCBhZnRlciBjaGFuZ2luZyBsaWJ0b29sIHRvCi0JYWNjb3VudCBmb3IgdGhlIGN5Z3dpbiBuYW1lIGNoYW5nZS4KLQotV2VkIE5vdiAxOCAxODowOToxNCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ0NfRk9SX1RBUkdFVCBhbmQgQ1hYX0ZPUl9UQVJHRVQgc2hvdWxkIGFsc28KLQlpbmNsdWRlIG5ld2xpYi9saWJjL3N5cy9jeWd3aW4gYW5kIG5ld2xpYi9saWJjL3N5cy9jeWd3aW4zMi4KLQotV2VkIE5vdiAxOCAyMDoxMzoyOSAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBsaWJ0ZXJtY2FwIHRvIGxpc3Qgb2YgY3lnd2luIGRlcGVuZGVuY2llcy4KLQotVHVlIE5vdiAxNyAxNjo1Nzo1MSAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogTWFrZWZpbGUuaW46IG1vZGlmeSBDQ19GT1JfVEFSR0VUIGFuZCBDWFhfRk9SX1RBUkdFVCBzbyB0aGF0Ci0gICAgICAgIHRoZXkgaW5jbHVkZSB3aW5zdXAvaW5jbHVkZSB3aGVuIGl0J3MgYSBjeWd3aW4gdGFyZ2V0LgotCi0xOTk4LTExLTEyICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZGVkIHppcC4KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmphdmEpOiBEZXBlbmQgb24gYWxsLXppcC4KLQkoYWxsLXppcCk6IE5ldyB0YXJnZXQuCi0JKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLXppcC4KLQkoTkFUSVZFX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay16aXAuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtemlwLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4temlwLgotCi1UaHUgTm92IDEyIDE3OjI3OjIxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBsb3NlICIzMiIgZnJvbSBjb21tZW50IGFib3V0IGN5Z3dpbi4KLQotVGh1IE5vdiAgNSAxNTowMDozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAtT3MgdG8gYnVpbGQgdGFyZ2V0IGxpYnJhcmllcyBmb3IgdGhlIGZyMzAuCi0KLVdlZCBOb3YgIDQgMTg6NDk6NDMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgZnIzMC4KLQotTW9uIE5vdiAgMiAxNToxOTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkcm9wICIzMiIgZnJvbSBjb25maWcvbWgtY3lnd2luMzIuICBDaGVjawotCWN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0JKiBjb25maWcuc3ViOiBDaGVjayBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqLgotCi0xOTk4LTEwLTIwICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIGNvbmZpZ3VyZS5pbjogQWRkIHRoZSBhYmlsaXR5IHRvIHVzZSB0Y2w4LjEgYW5kIHRrOC4xCi0JaWYgZGVzaXJlZC4KLQotU3VuIE9jdCAxOCAxODozNDo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5pZiAoY3h4X2ludGVyZmFjZSwgbGlic3RkY3h4X2ludGVyZmFjZSk6IERvIG5vdCB0cnkgdG8gc2V0Ci0JdGhlc2UgaWYgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcyB0byBub3QgZXhpc3QuCi0KLVdlZCBPY3QgMTQgMTA6Mjk6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGNvbmZpZy5pZi4KLQotVHVlIE9jdCAxMyAwOToxNzowNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEJyaW5nIGJhY2sgbG9zdCBzcGFyY3Y5LgotCi1XZWQgU2VwIDMwIDIyOjIwOjUwIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIGlbMzQ1NjddODYtcGMtdWRrLgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotV2VkIFNlcCAzMCAxOToyMzo0OCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGJ6aXAyIHBhY2thZ2UgYnVpbGRpbmcgYml0cyBmb3IgdXNlcgotCXRvb2xzIG1vZHVsZQotCSogY29uZmlndXJlLmluOiBkaXR0bwotCi0xOTk4LTA5LTMwICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkgKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBSZW1vdmUgZHVwbGljYXRlIGxpbmUuCi0KLVR1ZSBTZXAgMjkgMjI6NDU6NDEgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWF1dG9tYWtlKTogZml4IGRlcGVuZGVuY2llcy4KLQotTW9uIFNlcCAyOCAwNDowNDoyNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWlub3IgY2xlYW51cHMgZm9yIGJ1aWxkaW5nIGluIHRoZSAkKHRhcmdldF9hbGlhcykKLQlzdWJkaXIuCi0KLTE5OTgtMDktMjIgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IFNldCByIGFuZCBzIGJlZm9yZSBtYWtlIGFsbC4gIFVzZQotCUJBU0VfRkxBR1NfVE9fUEFTUyBpbiBtYWtlIGFsbC4KLQkoY3Jvc3MpOiBMaWtld2lzZS4KLQotMTk5OC0wOS0yMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcCk6IFBhc3MgVEFSR0VUX0ZMQUdTX1RPX1BBU1MgdG8gYG1ha2UgYWxsJy4KLQotCi1TdW4gU2VwIDIwIDAwOjEzOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgotCi0xOTk4LTA5LTE5ICBNaWNoYWVsIEhheWVzICA8bS5oYXllc0BlbGVjLmNhbnRlcmJ1cnkuYWMubno+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBDNHggdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotMTk5OC0wOS0xMyAgRGF2aWQgUy4gTWlsbGVyICA8ZGF2ZW1AcGllcmRvbC5jb2JhbHRtaWNyby5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBzcGFyY3Y5IGp1c3QgbGlrZSBzcGFyYzY0LgotCi1XZWQgU2VwICA5IDE1OjQ0OjUyIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNYXRjaCAiUGVudCBJSSIgb3IgIlBlbnRJSSIgZm9yIE9wZW5TZXJ2ZXIuCi0KLVR1ZSBTZXAgIDggMDE6MTg6MzkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IENvcnJlY3RseSBpZGVudGlmeSBQZW50aXVtIElJIHNjbyBib3hlcy4KLQotCSogY29uZmlnLmd1ZXNzOiBGaXggInRyIiBjb2RlLiAgRnJvbSBXZWl3ZW4gTGl1LgotCi1TYXQgU2VwICA1IDEzOjU2OjUyIDE5OTggIEpvaG4gSHVnaGVzICA8am9obkBDYWx2YS5DT00+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbm90IGFzc3VtZSB4ODYtc3ZyNCBvciB4ODYtdW5peHdhcmUgY2FuIGhhbmRsZQotCXN0YWJzLgotCi1TYXQgU2VwICA1IDAyOjEyOjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTKTogQWRkIGxpYmNoaWxsLgotCShBTExfVEFSR0VUX01PRFVMRVMpOiBBZGQgYWxsLXRhcmdldC1saWJjaGlsbC4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTLCBDSEVDS19UQVJHRVRfTU9EVUxFUyk6IFNpbWlsYXJseS4KLQkoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUywgQ0xFQU5fVEFSR0VUX01PRFVMRVMpOiBTaW1pbGFybHkuCi0JKGFsbC10YXJnZXQtbGliY2hpbGwpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IEFkZCBsaWJjaGlsbC4KLQotU3VuIEF1ZyAzMCAyMjoyNzowMiAxOTk4ICBMdXR6IFdvaGxyYWIgPGx1dHoud29obHJhYkBpbmZvcm1hdGlrLnR1LWNoZW1uaXR6LmRlPgotCi0JKiBjb25maWcuZ3Vlc3M6IEF2b2lkIGFzc3VtcHRpb25zIGFib3V0ICJ0ciIgYmVoYXZlcyB3aGVuCi0JTEFORyBpcyBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gRW5nbGlzaC4KLQotU3VuIEF1ZyAzMCAyMjoxNDo0NCAxOTk4ICBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogQ2hhbmdlZCB0bwotCScke3ByZWZpeH0vaW5jbHVkZS9nKysnLSR7bGlic3RkY3h4X2ludGVyZmFjZX0uCi0KLQkqIGNvbmZpZy5pZjogTmV3IHRvIGRldGVybWluZSB0aGUgaW50ZXJmYWNlcy4KLQotU3VuIEF1ZyAzMCAyMToxNToxOSAxOTk4ICBNYXJrIEtsZWluIChta2xlaW5AZGlzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBEZXRlY3QgYW5kIGhhbmRsZSBNUEUvSVguCi0JKiBjb25maWcuc3ViOiBEZWFsIHdpdGggTVBFL0lYLgotCi1TYXQgQXVnIDI5IDE0OjMyOjU1IDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1haXg0My4KLQotMTk5OC0wNy0yOSAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmU6IEZpeCAtLXdpdGhvdXQvLS1kaXNhYmxlIGNhc2VzIGZvciBneHgtaW5jbHVkZS1kaXIuCi0KLUZyaSBBdWcgMjggMTI6Mjg6MjYgMTk5OCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+Ci0KLQkqIG1kYXRhLXNoOiAgSW1wb3J0ZWQuICBOZWVkZWQgZm9yIGF1dG9tYWtlIHN1cHBvcnQuCi0KLVRodSBBdWcgMTMgMTI6NDk6MjkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogVHJ5ICJjaG1vZCAtUiBvZz11IC4iIGJlZm9yZSAKLQkiY2htb2Qgb2c9dSBgZmluZCAuIC1wcmludGAiLgotCi1GcmkgSnVsIDMxIDA5OjM4OjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBBZGQgYXJtLWVsZiBhbmQgdGh1bWItZWxmIHN1cHBvcnQuCi0KLU1vbiBKdWwgMjcgMTY6MjM6NTggMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVuZG8gcHJldmlvdXMgcGF0Y2guCi0KLUZyaSBKdWwgMjQgMTk6NTU6MjQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfVEFSR0VUKTogTW92ZSBFWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMKLQl0byBoZXJlIC4uLgotCShpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMpOiBhbmQgaGVyZQotCShJTlNUQUxMX01PRFVMRVMpOiAuLi4gZnJvbSBoZXJlLgotCi1GcmkgSnVsIDI0IDE3OjAxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBGU0YuCi0KLQkqIGNvbmZpZy5ndWVzczogTWVyZ2Ugd2l0aCBGU0YuCi0KLUZyaSBKdWwgMjQgMDg6NDM6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChleHRyYWNvbmZpZ2RpcnMpOiBOZXcgdmFyaWFibGUuCi0JKFNVQkRJUlMpOiBBZGQgZXh0cmFjb25maWdkaXJzIGFuZCByZWN1cnNlIG9uIHRoZW0gdG9vLgotCSogTWFrZWZpbGUuaW4gKGFsbCk6IE1vdmUgaGlnaGVyIGluIGZpbGUuCi0JKEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTKTogTmV3IHZhcmlhYmxlLgotCShFWFRSQV9UQVJHRVRfSE9TVF97SU5TVEFMTCxDSEVDS31fTU9EVUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKEFMTF9NT0RVTEVTKTogQWRkIEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkIEVYVFJBX1RBUkdFVF9IT1NUX0NIRUNLX01PRFVMRVMuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZCBFWFRSQV9UQVJHRVRfSE9TVF9JTlNUQUxMX01PRFVMRVMuCi0KLTE5OTgtMDctMjMgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmphdmEpOiBEZXBlbmQgb24gYWxsLWdjYyBhbmQKLQlhbGwtdGFyZ2V0LW5ld2xpYi4KLQkoY29uZmlndXJlLXRhcmdldC1saWJqYXZhKTogRGVwZW5kIG9uICQoQUxMX0dDQykuCi0KLVNhdCBKdWwgMTggMTQ6MzI6NDMgQ0RUIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAoKi1wYy1zY28zLjJ2NSkgQWRkIGRldGVjdGlvbiBmb3IgUGVudGl1bSBJSS4KLQkoKi1wYy11bml4d2FyZTcpIEFkZCBkZXRlY3Rpb24gZm9yIFBlbnRpdW0gSUksIFBlbnRpdW0gUHJvLgotCi1GcmkgSnVsIDE3IDEzOjMwOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeWx3cmFwOiBDaGFuZ2UgYWJzb2x1dGUgcGF0aCBjaGVja3MgdG8gY2hlY2sgZm9yIERPUyBzdHlsZSBwYXRoCi0JbmFtZXMuCi0KLQkqIHlsd3JhcDogRG9uJ3QgdXNlIGEgZnVsbCBwYXRoIG5hbWUgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIGluIHRoZQotCXNhbWUgZGlyZWN0b3J5LiAgRnJvbSBoamxAbHVjb24ub3JnIChILkouIEx1KS4KLQotCSogY29uZmlnLW1sLmluOiBEZWZhdWx0IHRvIGJlaW5nIHZlcmJvc2UsIHRvIG1hdGNoIEZlYiAxOCBjaGFuZ2UgdG8KLQljb25maWd1cmUuCi0KLVRodSBKdWwgMTYgMTI6Mjk6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQnJvdWdodCBvdmVyIGZyb20gZWdjczoKLQotCVNhdCBKdW4gMjcgMjI6NDY6MzIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBTZXQgdG8gJHt0YXJnZXRfYWxpYXN9IGluc3RlYWQKLQlvZiAibGlicmFyaWVzIi4KLQotCU1vbiBTZXAgIDEgMTY6NDU6NDQgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9zdWJkaXIpOiBTZXQgdG8gbGlicmFyaWVzIGlmIGVuYWJsZV9tdWx0aWxpYi4KLQotV2VkIEp1bCAxNSAwMTowMDo1NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBJZiB0aGVyZSBhcmUgYW55Ci0JbXVsdGlsaWJzLCBmb3JjZSByZWNvbmZpZ3VyYXRpb24gdGhlIGZpcnN0IHRpbWUgd2UgY3JlYXRlCi0JbXVsdGlsaWIub3V0IGluIGEgc3ViZGlyZWN0b3J5LCBpbiBjYXNlIFRBUkdFVF9TVUJESVIgaXMgYC4nLgotCi1UdWUgSnVsIDE0IDIzOjQxOjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTdHJpcCBhbnkgLS1ubyBvcHRpb24gZnJvbSBDT05GSUdfQVJHVU1FTlRTLCB0bwotCWF2b2lkIGNvbmZ1c2lvbiB3aXRoIC0tbm8tcmVjdXJzaW9uLgotCi1UdWUgSnVsIDE0IDE1OjM3OjQxIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogV2luMzIgaG9zdHMgc2hvdWxkbid0IHVzZSBpbnN0YWxsIC14Ci0JKiBpbnN0YWxsLXNoOiByZW1vdmUgLXggb3B0aW9uLCBhbmQgc3BlY2lhbCAuZXhlLWhhbmRsaW5nCi0JaGFjay4KLQotVHVlIEp1bCAxNCAxNToyODo0MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpNTg2LXBjLWJlb3MuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIHNvbWUgYml0cyBmb3IgYmVvcy4KLQotVHVlIEp1bCAxNCAxMzoyMjoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgQ0MgaXMgc2V0IGJ1dCBDRkxBR1MgaXMgbm90LCBhbmQgQ0MgaXMgZ2NjLCBtYWtlCi0JQ0ZMQUdTIGRlZmF1bHQgdG8gLU8yLgotCi0JKiBsdG1haW4uc2g6IEFkZCBzb21lIGhhY2tzIHRvIG1ha2UgU3VuT1MgLS1lbmFibGUtc2hhcmVkIHdvcmsKLQl3aGVuIHVzaW5nIEdOVSBsZC4KLQotRnJpIEp1bCAxMCAxMzoxODoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0bWFpbi5zaDogQ29ycmVjdCBpbnN0YWxsIHdoZW4gdXNpbmcgYSBkaWZmZXJlbnQgc2hlbGwuCi0KLVR1ZSBKdWwgIDcgMTU6MjQ6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgdG8gbGlidG9vbCAxLjJiLgotCi1UaHUgSnVsICAyIDEzOjU3OjM2IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcm1pLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFVwZGF0ZSB0byBidWlsZCBiaW51dGlscy9tYWtlZmlsZS52bXMuICBBZGQgaW5zdGFsbAotCXRhcmdldC4KLQotV2VkIEp1bCAgMSAxNjo0NToyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgdG8gY29ycmVjdCBBSVggaGFuZGxpbmcuCi0KLVNhdCBKdW4gMjcgMjI6NDY6MzIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogQWRkIFRBUkdFVF9TVUJESVIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byAke3RhcmdldF9hbGlhc30gaW5zdGVhZAotCW9mICJsaWJyYXJpZXMiLgotCi0xOTk4LTA2LTI2ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBBZGQgZ2NjX3ZlcnNpb25fdHJpZ2dlci4KLQkoTWFrZWZpbGUpOiBEZXBlbmQgb24gJChnY2NfdmVyc2lvbl90cmlnZ2VyKS4KLQotCSogY29uZmlndXJlIChnY2NfdmVyc2lvbik6IENoYW5nZSBkZWZhdWx0IGluaXRpYWxpemVyIHRvIGVtcHR5Ci0Jc3RyaW5nLgotCShnY2NfdmVyc2lvbl90cmlnZ2VyKTogTmV3IHZhcmlhYmxlOyBwYXNzIHRoaXMgdmFyaWFibGUgZG93bgotCXRvIHN1YmRpciBjb25maWd1cmVzIHRvIGVuYWJsZSB0aGVtIGNoZWNraW5nIGdjYydzIHZlcnNpb24KLQl0aGVtc2VsdmVzLiBFbWl0IG1ha2UgbWFjcm9zIGZvciBib3RoIGdjY192ZXJzaW9uIHZhcnMuCi0JKHRvcHNyY2Rpcik6IEluaXRpYWxpemUgcmVsaWFibHkuCi0JKHJlY3Vyc2lvbiBsaW5lKTogUmVtb3ZlIC0td2l0aC1nY2MtdmVyc2lvbj0ke2djY192ZXJzaW9ufS4KLQotMTk5OC0wNi0yNCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyk6IEltcGxlbWVudCBuZXcgZmxhZwotCS0tZW5hYmxlLXZlcnNpb24tc3BlY2lmaWMtcnVudGltZS1saWJzIHdoaWNoIGluc3RhbGxzIEMrKyBydW50aW1lIHN0dWZmCi0JaW4gJChsaWJzdWJkaXIpOyBlbWl0IGRlZmluaXRpb24gaW4gZWFjaCBnZW5lcmF0ZWQgTWFrZWZpbGUuCi0JKGd4eF9pbmNsdWRlX2Rpcik6IEluaXRpYWxpemUgZGVwZW5kaW5nIG9uCi0JJGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicy4KLQotMTk5OC0wNi0yNCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUgKGdjY192ZXJzaW9uKTogSW5pdGlhbGl6ZSBwcm9wZXJseSBkZXBlbmRpbmcgb24KLQlob3cgYW5kIHdoZXJlIGNvbmZpZ3VyZSBpcyBzdGFydGVkLgotCShyZWN1cnNpb24gbGluZSk6IFBhc3MgYSAtLXdpdGgtZ2NjLXZlcnNpb249JHtnY2NfdmVyc2lvbn0KLQl0byBjb25maWd1cmVzIGluIHN1YmRpcnMuCi0KLVdlZCBKdW4gMjQgMTY6MDE6NTkgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgY29uZmlndXJlIHBhdHRlcm4gZm9yIG1pcHMgdHgzOQotIAljeWdtb24KLQotVHVlIEp1biAyMyAyMjo0MjozMiAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGN5Z21vbiBhbmQgbGlic3R1YiBzdXBwb3J0IGZvciBtbjEwMjAwLgotCi0xOTk4LTA2LTE5ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAoZ2NjX3ZlcnNpb24pOiBBZGQgbmV3IHZhcmlhYmxlIGRlc2NyaWJpbmcgdGhlCi0JcGFydGljdWxhciBnY2MgdmVyc2lvbiB3ZSdyZSBidWlsZGluZy4KLQkqIE1ha2VmaWxlLmluIChsaWJzdWJkaXIpOiBBZGQgbmV3IG1hY3JvIGZvciB0aGUgZGlyZWN0b3J5Ci0JaW4gd2hpY2ggdGhlIGNvbXBpbGVyIGZpbmRzIGV4ZWN1dGFibGVzLCBsaWJyYXJpZXMsIGV0Yy4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGdjY192ZXJzaW9uLCB0YXJnZXRfYWxpYXMKLQlhbmQgbGlic3ViZGlyLgotCi1GcmkgSnVuIDE5IDAyOjM2OjU5IDE5OTggIEFsZXhhbmRyZSBPbGl2YSA8b2xpdmFAZGNjLnVuaWNhbXAuYnI+Ci0KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1jbGVhbik6IHJlbW92ZSAqLmxvZwotCSh3YXJuaW5nLmxvZyk6IGJ1aWx0IHdpdGggd2Fybl9zdW1tYXJ5IGZyb20gYnVpbGQubG9nCi0JKG1haWwtcmVwb3J0LmxvZyk6IHJ1biB0ZXN0X3N1bW1hcnkKLQkobWFpbC1yZXBvcnQtd2l0aC13YXJuaW5ncy5sb2cpOiBydW4gdGVzdF9zdW1tYXJ5IGluY2x1ZGluZwotCXdhcm5pbmcubG9nIGluIHRoZSByZXBvcnQKLQotVGh1IEp1biAxOCAxMToyNjowMyAxOTk4ICBSb2JlcnQgTGlwZSAgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogRGV0ZWN0aW9uIG9mIFBlbnRpdW0gSUkgZm9yICotc2NvLTMuMnY1Ki4KLQotTW9uIEp1biAxNSAxNDo1Mzo1NCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChncmVwKTogR3JlcCBubyBsb25nZXIgZGVwZW5kcyBvbiBsaWJpYmVydHkuCi0KLUZyaSBKdW4gMTIgMTQ6MDM6MzQgMTk5OCAgU3lkIFBvbGsgIDxzcG9sa0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWxsLXNuYXZpZ2F0b3IgbmVlZHMgYWxsLWxpYmd1aS4KLQotVGh1IEp1biAxMSAxOTo0Mzo0NyAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGN5Z21vbiBhbmQgbGlic3R1YiBzdXBwb3J0IGZvciBtbjEwMzAwLgotCi1XZWQgSnVuIDEwIDExOjE5OjQ3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlzc2luZzogVXBkYXRlIHRvIHZlcnNpb24gZnJvbSBhdXRvbWFrZSAxLjMuCi0KLQkqIGx0bWFpbi5zaDogT24gaW5zdGFsbGF0aW9uLCBkb24ndCBnZXQgY29uZnVzZWQgaWYgdGhlIHNhbWUgbmFtZQotCWFwcGVhcnMgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGxpc3Qgb2YgbGlicmFyeSBuYW1lcy4KLQotV2VkIEp1biAgMyAxNDo1MTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCBtNjgwNjAgYW5kIG01MjAwIGFzIENQVSBuYW1lcy4KLQotTW9uIEp1biAgMSAxNzoyNToxNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogVXNlICYmIHJhdGhlciB0aGFuIHVzaW5nIC1hIGluIHRlc3QsIGJlY2F1c2Ugb2RkCi0Jc3RyaW5ncyBjYW4gY29uZnVzZSB0ZXN0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQotVGh1IE1heSAyOCAxOTozMToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IEJyaW5nIGluIFZpc3VhbCBDKysgc3VwcG9ydC4KLQotU2F0IE1heSAyMyAyMzo0NDoxMyAxOTk4ICBBbGV4YW5kcmUgT2xpdmEgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vc3RyYXAyLWxlYW4sIGJvb3RzdHJhcDMtbGVhbiwKLQlib290c3RyYXA0LWxlYW4pOiBuZXcgdGFyZ2V0cwotCi1Nb24gTWF5IDExIDIzOjExOjM0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogQ09QWUlORy5MSUI6IFVwZGF0ZSBGU0YgYWRkcmVzcy4KLQotRnJpIE1heSAgOCAwMTozMDoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnLCBsdG1haW4uc2g6IFVwZGF0ZSB0byBsaWJ0b29sIDEuMmEuCi0KLQkqIE1ha2VmaWxlLmluIChHQVNCX1NVUFBPUlRfRElSUyk6IFJlbW92ZSBpbnRsOyBhbHJlYWR5IGluY2x1ZGVkIHZpYQotCUdBU19TVVBQT1JUX0RJUlMuCi0KLVRodSBNYXkgIDcgMTc6Mjc6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBBdm9pZCBwcm9kdWNpbmcgYSB2ZXJzaW9uIG51bWJlciBpZgotCS12ZXJzaW9uLWluZm8gd2FzIG5vdCB1c2VkLgotCi1UdWUgTWF5ICA1IDE4OjAyOjI0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgLS13aXRoLW5ld2xpYiB0byBDT05GSUdfQVJHVU1FTlRTIGlmIHdlIGFyZQotCWJ1aWxkaW5nIHdpdGggbmV3bGliLgotCi0xOTk4LTA0LTMwICBQYXVsIEVnZ2VydCAgPGVnZ2VydEB0d2luc3VuLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBSZW1vdmUgYmFja3NsYXNoIGF0IGVuZDsKLSAgICAgICAgU29sYXJpcyBgbWFrZScgY2F1c2VzIGl0IHRvIGNvbnRpbnVlIHRvIG5leHQgZGVmaW5pdGlvbi4gCi0KLVR1ZSBBcHIgMjggMTg6MTE6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBhbHBoYSB0byBhbHBoYSogaW4gc2V2ZXJhbCBwbGFjZXMuCi0KLVR1ZSBBcHIgMjggMDc6NDI6MDAgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgc3BhcmM4NnguCi0KLVR1ZSBBcHIgMjggMDc6MzU6MDIgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0gCi0JKiBjb25maWd1cmUuaW4gKC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSk6IFJlbW92ZSBkZWJ1ZyBlY2hvLgotCi1UaHUgQXByIDIzIDIxOjMxOjE2IDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBTZXQgQ1hYRkxBR1MgZnJvbSBDWFhGTEFHUywgbm90IENGTEFHUy4KLQotVGh1IEFwciAyMyAxMjoyNjozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgY3lnd2luMzIgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMpOiBBZGQgaW50bC4KLQkoQklOVVRJTFNfU1VQUE9SVF9ESVJTLCBHQVNCX1NVUFBPUlRfRElSUyk6IExpa2V3aXNlLgotCShHREJfU1VQUE9SVF9ESVJTKTogTGlrZXdpc2UuCi0KLVdlZCBBcHIgMjIgMTI6MzA6MTAgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X21ha2VmaWxlX2ZyYWcpOiBJZiAtLWVuYWJsZS10YXJnZXQtb3B0c3BhY2UsCi0JdXNlIC1PcyB0byBjb21waWxlIHRhcmdldCBsaWJyYXJpZXMgcmF0aGVyIHRoYW4gLU8yLiAgRGVmYXVsdCB0bwotCXVzaW5nIC1PcyBmb3IgZDEwdiBhbmQgbTMyciBpZiAtLXtlbmFibGUsZGlzYWJsZX0tdGFyZ2V0LW9wdHNwYWNlIGlzCi0Jbm90IHVzZWQuCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9jZmxhZ3MpOiBEaXR0byBmb3IgZDMwdi4KLQotVHVlIEFwciAyMSAyMzowNjo1NCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtYmZkKTogRGVwZW5kIG9uIGFsbC1pbnRsLgotCShhbGwtYmludXRpbHMpOiBMaWtld2lzZS4KLQkoYWxsLWdhcyk6IExpa2V3aXNlLgotCShhbGwtZ3Byb2YpOiBMaWtld2lzZS4KLQkoYWxsLWxkKTogTGlrZXdpc2UuCi0KLQotMTk5OC0wNC0xOSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogRml4IHR5cG8sIGxidG9vbCAtPiBsaWJ0b29sLgotCi1GcmkgQXByIDE3IDE2OjIwOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iZmQpOiBEZXBlbmQgdXBvbiBhbGwtbGliaWJlcnR5LgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBCcmluZyBpbiBuZXdlciBjeWd3aW4zMiBzdXBwb3J0LgotCi1GcmkgQXByIDE3IDEyOjIyOjIyIDE5OTggIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGxpYnN0dWIuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRGl0dG8uIEJ1aWxkIGxpYnN0dWIgZm9yIHRhcmdldHMgdGhhdCBoYXZlIGN5Z21vbgotCXN1cHBvcnQuCi0KLVR1ZSBBcHIgMTQgMTg6MDE6NTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBQSUNGTEFHIG9uIGl4ODYtY3lnd2luMzIuCi0KLVR1ZSBBcHIgMTQgMTI6MjQ6NDUgMTk5OCAgSi4gS2VhbiBKb2huc3RvbiAgPGprakBzY28uY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbmlzZSBpWzM0NTZdOTYtKi1zeXN2NSogYXMgYSB2YWxpZCBob3N0LCBhbmQKLQl1c2UgbWgtc3lzdjUgaWYgc3BlY2lmaWVkLiAgU3VwcG9ydCBncHJvZiBvbiBTQ08gT3BlbiBTZXJ2ZXIuCi0KLVR1ZSBBcHIgMTQgMTE6MzM6NTEgMTk5OCAgS3Jpc3RlciBXYWxmcmlkc3NvbiA8Y2F0b0BkZi5sdGguc2U+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmaW5lIERFRkFVTFRfTTQgYnkgc2VhcmNoaW5nIFBBVEguCi0JKiBNYWtmaWxlLmluOiBVc2UgREVGQVVMVF9NNC4KLQotTW9uIEFwciAxMyAxNTozNzoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGx0Y29uZmlnOiBBZGQgY3lnd2luMzIgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQWRkIGxpYnRvb2wgYXMgYSBuYXRpdmUgb25seSBkaXJlY3RvcnkKLSAJdG8gY29uZmlndXJlIGFuZCBidWlsZC4KLQotV2VkIEFwciAgOCAxMzoxODo1NiAxOTk4ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQG1hY3FlbC5iZT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IFhGT08gbGluZXMgc2hvcnRlbmVkLgotCi1UaHUgQXByICAyIDE0OjQ4OjQ0IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBhZGQgYXNoIG1ha2UgcnVsZXMKLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGFzaCB0byBuYXRpdmVfb25seSBhbmQgaG9zdF90b29scyBsaXN0cwotCi1UaHUgTWFyIDI2IDEyOjUzOjIwIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZXR0ZXh0LCBhbGwtaW50bCk6IE5ldyB0YXJnZXRzLgotCShBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1nZXR0ZXh0LCBhbGwtaW50bC4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEFkZGVkIGNoZWNrLWdldHRleHQsIGNoZWNrLWludGwuCi0JKElOU1RBTExfTU9EVUxFUyk6IEFkZGVkIGluc3RhbGwtZ2V0dGV4dCwgaW5zdGFsbC1pbnRsLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4tZ2V0dGV4dCwgY2xlYW4taW50bC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkZWQgZ2V0dGV4dC4KLQkobmF0aXZlX29ubHkpOiBMaWtld2lzZS4KLQkobm9jb25maWdkaXJzKSBbdmFyaW91cyBjYXNlc106IExpa2V3aXNlLgotCShob3N0X2xpYnMpOiBBZGRlZCBpbnRsLgotCi1XZWQgTWFyIDI1IDExOjQ5OjEyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkoYWxsLXRhcmdldC13aW5zdXApOiAgYWxsLXRhcmdldC1saWJyeCBzdGF5cyBvdXQgb2YgaGVyZS4KLQotVHVlIE1hciAyNCAxNjo1ODoyOSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9DT05GSUdESVJTLCBBTExfVEFSR0VUX01PRFVMRVMsIAotCUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUywgQ0hFQ0tfVEFSR0VUX01PRFVMRVMsIAotCUlOU1RBTExfVEFSR0VUX01PRFVMRVMsIENMRUFOX1RBUkdFVF9NT0RVTEVTLCBhbGwtdGFyZ2V0LXdpbnN1cCk6IAotCVJlbW92ZSByZWZlcmVuY2VzIHRvIGxpYnJ4IGFuZCBsaWJnKysuCi0KLVR1ZSBNYXIgMjQgMTg6Mjg6MTIgMTk5OCAgRXJpYyBNdW1wb3dlciAgPG5vY3R1cm5lQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBQYXNzICQobGlzcGRpcikgZG93biB0bwotCXJlY3Vyc2l2ZSBtYWtlcwotCi1UdWUgTWFyIDI0IDExOjM3OjQ1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBVc2UgJChUQVJHRVRfU1VCRElSKSB3aGVuIHBhc3NpbmcgLUIKLQlmb3IgbmV3bGliIGRpcmVjdG9yeS4KLQkoQ1hYX0ZPUl9UQVJHRVQpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyMyAxMTozMDoyMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGx0Y29uZmlnOiBVcGRhdGUgYWZ0ZXIgbGlidG9vbC9sdGNvbmZpZy5pbiBjaGFuZ2UgZm9yCi0JaHB1eDExLgotCi1GcmkgTWFyIDIwIDE4OjUxOjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWcsIGx0bWFpbi5zaDogVXBkYXRlIHRvIGxpYnRvb2wgMS4yLgotCi1GcmkgTWFyIDIwIDA5OjMyOjE0IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZ2NjKTogRG9uJ3Qgc3BlY2lmeSBMQU5HVUFHRVMgaGVyZS4KLQkoaW5zdGFsbC1nY2MtY3Jvc3MpOiBJbnN0ZWFkLCBvdmVycmlkZSBMQU5HVUFHRVMgaGVyZS4KLQotMTk5OC0wMy0xOCAgRGF2ZSBMb3ZlICA8ZC5sb3ZlQGRsLmFjLnVrPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogU2V0IENPTkZJR19TSVRFIHRvIGEKLQlub24tZXhpc3RlbnQgZmlsZSBzaW5jZSAvZGV2L251bGwgbG9zZXMgd2l0aCBiYXNoIDIuMC9hdXRvY29uZiAyLjEyLgotCi1XZWQgTWFyIDE4IDA5OjI0OjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIFRodW1iLXBlIHRhcmdldC4KLQotVHVlIE1hciAxNyAxNjo1OTowMCAxOTk4ICBTeWQgUG9sayA8c3BvbGtAY3lnbnVzLmNvbT4KLQkqIE1ha2VmaWxlLmluIC0gY2hhbmdlZCBzbiB0YXJnZXRzIHRvIHNuYXZpZ2F0b3IKLQkqIGNvbmZpZ3VyZS5pbiAtIGNoYW5nZWQgc24gdGFyZ2V0cyB0byBzbmF2aWdhdG9yCi0KLVR1ZSBNYXIgMTcgMTA6MzM6MjggMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWctbWwuaW46IEFmdGVyIGJ1aWxkaW5nIHN5bWxpbmsgdHJlZSBjYWxsIG1ha2UgZGlzdGNsZWFuCi0JaWYgYSBNYWtlZmlsZSBnb3QgbGlua2VkIGludG8gJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgdGhpcyBoYXBwZW5zCi0JdG8gYmUgdGhlIGNhc2UgZm9yIGxpYmliZXJ0eS4KLQotVHVlIE1hciAxNyAxMDoyMjozNyAxOTk4ICBILkouIEx1ICAoaGpsQGdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWd1cmU6IFdoZW4gbWFraW5nIGxpbmssIGFsc28gY2hlY2sgdGhlIGN1cnJlbnQKLQlkaXJlY3RvcnkuIFRoZSBjb25maWd1cmUgc2NyaXB0cyBtYXkgY3JlYXRlIG9uZS4KLQotRnJpIE1hciAgNiAwMTowMjowMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgYWxwaGFwY2E1NiBhbmQgYWxwaGFldjYgcHJvcGVybHkuCi0KLUZyaSBNYXIgIDYgMDA6MTQ6NTUgMTk5OCAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmV2ZXJ0IDMgSmFuIGNoYW5nZSBmb3IgcG93ZXJwYy1saW51eC1nbnVsaWJjMS4KLQotCi1Nb24gRmViIDIzIDE1OjA5OjE4IDE5OTggIEJydW5vIEhhaWJsZSA8YnJ1bm9AbGludWl4Lm1hdGhlbWF0aWsudW5pLWthcmxzcnVoZS5kZQotCi0gICAgICAgICogY29uZmlnLnN1YiAoc2NvNSk6IEZpeCB0eXBvLgotCi1Nb24gRmViIDIzIDE0OjQ2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTU9EVUxFUyk6IE1vdmUgaW5zdGFsbC10Y2wgYmVmb3JlCi0JaW5zdGFsbC1pdGNsLgotCShpbnN0YWxsLWl0Y2wpOiBSZW1vdmUgZGVwZW5kZW5jeSBvbiBpbnN0YWxsLXRjbC4KLQotTW9uIEZlYiAyMyAwOTo1MzoyOCAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxpYmdsb3NzIGZyb20gbm9jb25maWdkaXJzIGZvciBNTjEwMzAwLgotCi1GcmkgRmViIDIwIDE2OjQ3OjI0IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCBsZXQgYnVpbGRzIGJlIGRvbmUgaW4gc291cmNlIHRyZWUuCi0KLVRodSBGZWIgMTkgMTM6NDA6NDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIGxpYmd1aSBmb3IgYSBjeWd3aW4zMiB0YXJnZXQgd2hlbiBub3Qgb24KLQlhIGN5Z3dpbjMyIGhvc3QuCi0KLVdlZCBGZWIgMTggMTI6Mjk6MDAgMTk5OCAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAocmVkaXJlY3QpOiBTZXQgdG8gbnVsbCwgc28gZGVmYXVsdCBiZWhhdmlvciBvZgotCWNvbmZpZ3VyZSBpcyBub3cgLS12ZXJib3NlLgotCi0xOTk4LTAyLTE2ICBEYXZlIExvdmUgIDxkLmxvdmVAZGwuYWMudWs+Ci0KLQkqIE1ha2VmaWxlLmluICgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBSdW4gY29uZmlndXJlIHdpdGgKLQlDT05GSUdfU0lURT0vZGV2L251bGwgdG8gZm9yZXN0YWxsIGxvc3NhZ2Ugd2l0aCBzaXRlIGNvbmZpZ3VyYXRpb24uCi0KLU1vbiBGZWIgMTYgMTI6MjM6NTMgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxNYW5mcmVkLkhvbGxzdGVpbkBrcy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUywgRVhUUkFfVEFSR0VUX0ZMQUdTKTogUmVhbGx5IGFkZAotCXRoaXMgY2hhbmdlIHRvIHN5bmMgTWFrZWZpbGUuaW4gd2l0aCBpdHMgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLVRodSBGZWIgMTIgMTU6MDM6MDggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsdG1haW4uc2ggKG1rZGlyKTogQ2hlY2sgdGhhdCB0aGUgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QKLQliZWZvcmUgd2UgZXhpdCB3aXRoIGVycm9yLCBzbyB0aGF0IHdlIGRvbid0IGdldCByYWNlcyBkdXJpbmcKLQlwYXJhbGxlbCBidWlsZHMuCi0KLVNhdCBGZWIgIDcgMTU6MTk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGkuCi0KLUZyaSBGZWIgIDYgMDE6MzM6NTIgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogRG9uJ3QgcGFzcyBQSUNGTEFHIGFuZAotCVBJQ0ZMQUdfRk9SX1RBUkdFVC4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRG9uJ3QgcGFzcyBQSUNGTEFHX0ZPUl9UQVJHRVQuCi0KLQkqIGNvbmZpZ3VyZTogRW1pdCBhIGRlZmluaXRpb24gZm9yIHRoZSBuZXcgbWFjcm8gZW5hYmxlX3NoYXJlZAotCWludG8gZWFjaCBNYWtlZmlsZS4KLQotCSogY29uZmlnL21oLXNwYXJjcGljIChQSUNGTEFHKTogRGVmaW5lIHRvIHByb3Blcmx5IGFjY29yZGluZwotCXRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQkqIGNvbmZpZy9tdC1zcGFyY3BpYyAoUElDRkxBR19GT1JfVEFSR0VUKTogRGVmaW5lIHRvIHByb3Blcmx5Ci0JYWNjb3JkaW5nIHRvIGN1cnJlbnQgbXVsdGlsaWIgY29uZmlndXJhdGlvbi4KLQotVGh1IEZlYiAgNSAxNzowMToxMiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzLCBuYXRpdmVfb25seSk6IEFkZCBsaWJ0b29sLgotCi1XZWQgRmViICA0IDE2OjUzOjU4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIHRhcmdldC1ncGVyZiB0byBub2NvbmZpZ2RpcnMgZm9yIEN5Z3dpbjMyLgotCUZpeCB0eXBvIGluIG1pbmcgY29uZmlnIGNvbW1lbnQuCi0KLVdlZCBGZWIgIDQgMTg6NTY6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBVcGRhdGUgZnJvbSBsaWJ0b29sIDEuMGguCi0KLU1vbiBGZWIgIDIgMTk6Mzg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgdGljMzAgY2FzZXMsIGFuZCBtYXAgYzMwIHRvIHRpYzMwLgotCi1GcmkgSmFuIDMwIDE3OjE4OjMyIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFJlbW92ZSBleHBlY3QgZnJvbSBub2NvbmZpZ2RpcnMgd2hlbiB0YXJnZXQKLSAgICAgICAgaXMgY3lnd2luMzIuICBPSyB0byBidWlsZCBleHBlY3QgYW5kIGRlamFnbnUgd2l0aCBDYW5hZGlhbgotICAgICAgICBDcm9zcy4KLQotV2VkIEphbiAyOCAxMjo1ODo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZXhwZWN0LCBkZWphZ251LCBhbmQgY3Zzc3JjIGZvciBhIGN5Z3dpbjMyCi0JaG9zdC4KLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgJHtVTkFNRV9NQUNISU5FfSByYXRoZXIgdGhhbiBpMzg2IGZvciBjeWd3aW4zMgotCWFuZCBtaW5ndzMyLgotCi1XZWQgSmFuIDI4IDEwOjI2OjM3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBwYXNzaW5nICQobG9jYWxfcHJlZml4KQotCWhlcmUgYXMgaXQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHRvcGxldmVsIE1ha2VmaWxlLgotCi1UdWUgSmFuIDI3IDIzOjI1OjA2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlndXJlIChwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWcpOiBOZXcgdmFyaWFibGUsIHdoaWNoIG5hbWVzCi0JYSBmaWxlIHdpdGggZ2VuZXJpYyBydWxlcywgLi4uCi0JQ2hhbmdlIGNvbW1lbnQgdG8gbWVudGlvbiB3ZSBub3cgaGF2ZSBGSVZFIHBhcnRzLgotCSogY29uZmlndXJlOiBVbmRvIGxhc3QgY2hhbmdlLgotCi1UdWUgSmFuIDI3IDIzOjE1OjU1IDE5OTggIExhc3NpIEEuIFR1dXJhICA8bGF0QGlraS5maT4KLQotCSogY29uZmlnLmd1ZXNzOiBNb3JlIGFjY3VyYXRlIGRldGVybWluYXRpb24gb2YgSFAgcHJvY2Vzc29yIHR5cGVzLgotCSogY29uZmlnLnN1YjogTW9yZSBhY2N1cmF0ZSBkZXRlcm1pbmF0aW9uIG9mIEhQIHByb2Nlc3NvciB0eXBlcy4KLQotU2F0IEphbiAyNCAwMTo1OTo0NSAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGNvbmZpZ3VyZSAocGFja2FnZV9tYWtlZmlsZV9mcmFnKTogTW92ZSBpbnNlcnRpbmcgdGhlCi0JJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IHRvIHdoZXJlIGl0IHNob3VsZCBiZSBhY2NvcmRpbmcKLQl0byB0aGUgY29tbWVudC4KLQotRnJpIEphbiAyMyAwMDozMDoyMSAxOTk4ICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgc3VwcG9ydCBmb3IgTGludXgvQVJNLgotCi1UaHUgSmFuIDIyIDE1OjE0OjAxIDE5OTggIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiAuY3ZzaWdub3JlOiBSZW1vdmUgKi1pbmZvIGFuZCAqLWluc3RhbGwgc2luY2UgdGhleSBtYXRjaAotCXJlbGVhc2UtaW5mbyBhbmQgbXB3LWluc3RhbGwsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8ganVzdCBpZ25vcmUuCi0KLVRodSBKYW4gMjIgMDE6Mzg6MzMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXZlcnQgMyBKYW4gY2hhbmdlIGZvciBhbHBoYS1saW51eC1nbnVsaWJjMS4KLQotU2F0IEphbiAxNyAyMToyODowOCAxOTk4ICBQaWV0ZXIgTmFnZWwgPHBuYWdlbEBlcGl1c2UuY28uemE+Ci0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGdjY19pbmNsdWRlX2RpciBhbmQKLQlsb2NhbF9wcmVmaXggdG8gc3ViLW1ha2UgaW52b2NhdGlvbnMuCi0KLVNhdCBKYW4gMTcgMjE6MDQ6NTkgMTk5OCBILkouIEx1ICAoaGpsQGdudS5vcmcpCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgbWFrZWZpbGUgZnJhZ21lbnRzIGluIHRoZSBzb3VyY2UKLQlkaXJlY3RvcnkuCi0KLUZyaSBKYW4gMTYgMDA6NDE6MzcgMTk5OCAgQWxleGFuZHJlIE9saXZhIDxvbGl2YUBkY2MudW5pY2FtcC5icj4KLQotCSogY29uZmlndXJlLmluOiBjaGVjayB3aGV0aGVyIGhvc3QgYW5kIHRhcmdldCBtYWtlZmlsZQotCWZyYWdtZW50cyBleGlzdCBiZWZvcmUgYWRkaW5nIHRoZW0gdG8gKl9tYWtlZmlsZV9mcmFnCi0KLVdlZCBKYW4gMTQgMjM6Mzk6MTAgMTk5OCAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2NvbmZpZ2RpcnMpOiBBZGQgY3lnbW9uIGZvciBzcGFyYzY0LWVsZi4KLQkKLVdlZCBKYW4gMTQgMTI6NDg6MDcgMTk5OCAgS2VpdGggU2VpdHogIDxrZWl0aHNAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgd2Ugb25seSByZXBsYWNlIFJQQVRIX0VOVlZBUiBvbgotCWxpbmVzIHdoaWNoIGJlZ2luIHdpdGggUlBBVEhfRU5WVkFSLCBpLmUuIGFkZCAiXiIgdG8gdGhlCi0JcmVnZXhwIHRvIHNlZC4KLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFBhc3MgUlJQQVRIX0VOVlZBUiBkb3duCi0JdG8gc3ViLW1ha2VzLgotCi0xOTk4LTAxLTEzICBMZWUgSXZlcnNvbiAgIChsZWVpQGFpLnNyaS5jb20pCi0KLQkqIGNvbmZpZy1tbC5pbiAobXVsdGktZG8pOiBMREZMQUdTIG11c3QgaW5jbHVkZSBtdWx0aWxpYgotCWRlc2lnbmF0b3IuCi0KLVR1ZSBKYW4gMTMgMDE6MTM6MjQgMTk5OCAgIFJvYmVydCBMaXBlIChyb2JlcnRsQGRnaWkuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpWzM0NTZdLWk1ODYtVW5peFdhcmU3LXN5c3Y1LgotCi1TdW4gSmFuICA0IDAxOjA2OjU1IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBjb25maWcuc3ViOiBBZGQgbWluZ3czMiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiBMaWtld2lzZS4KLQkqIG1oLW1pbmd3MzI6IE5ldyBmaWxlLgotCi1TYXQgSmFuICAzIDEyOjExOjA1IDE5OTggRnJhbnogU2lybCA8ZnJhbnouc2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRmluYWxpemUgc3VwcG9ydCBmb3Ige2FscGhhfHBvd2VycGN9Ki0qLWxpbnV4LWdudWxpYmMxCi0KLVN1biBEZWMgMjggMTE6Mjg6NTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9UQVJHRVQpOiBEbyBpbnN0YWxsLWdjYyBmaXJzdC4KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogUHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIHN1YmRpcnMKLQl3aGljaCBkbyBub3QgdXNlIGF1dG9jb25mLgotCi1XZWQgRGVjIDI0IDIyOjQ2OjU1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBTeW5jIHdpdGggZWdjcy4gIFBpY2tzIHVwIG5ldyBhbHBoYSBzdXBwb3J0LAotCUJlT1MgJiBzb21lIGFkZGl0aW9uYWwgbGludXggc3VwcG9ydC4KLQotVHVlIERlYyAyMyAxMjo0NTo1MCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogSFAgOTAwMC84MDMgaXMgYSBQQTEuMSBtYWNoaW5lLgotCi0KLVN1biBEZWMgMjEgMTY6NTM6MTIgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnLCB0YXJnZXRfbWFrZWZpbGVfZnJhZyk6Ci0gICAgICAgIEhhbmRsZSBtdWx0aXBsZSBjb25maWcgZmlsZXMuCi0gICAgICAgIChhbHBoYS0qLWxpbnV4Kik6IFRyZWF0IGFscGhhLSotbGludXgqIGFzIGFscGhhLSotbGludXgqIGFuZAotICAgICAgICBhbHBoYS0qLSouCi0KLVRodSBEZWMgMTggMTM6MTM6MDMgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbWtkZXA6IE5ldyBmaWxlLgotCi1XZWQgRGVjIDE3IDA5OjUzOjAyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKi0qKTogQWxsb3cgY29uZmlndXJpbmcgb2YgbGliaWRlLCB2bWFrZSwgZXRjLgotCi1UdWUgRGVjIDE2IDE3OjM2OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBsaWJndWkgZGlyZWN0b3J5LgotCShHREJfVEspOiBBZGQgYWxsLWxpYmd1aS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpYmd1aSBkaXJlY3RvcnkuCi0JKiBjb25maWd1cmU6IEFkZCBhbGwtbGliZ3VpIHRvIEdEQl9USy4KLQotTW9uIERlYyAxNSAxNjoxMjoyOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKG11bHRpZGlycyk6IEFkZCBtMzJyIHRvIG11bHRpbGliIGxpc3QuCi0KLUZyaSBEZWMgMTIgMTA6NDM6MzEgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWdwZXJmKTogQ2hhbmdlIGRlcGVuZGVuY3kgdG8KLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotVGh1IERlYyAxMSAyMzozMDo1MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAbmluZW1vb25zLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgQmVPUyBzdXBwb3J0LgotCi1XZWQgRGVjIDEwIDE1OjEwOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNvdXJjZSBkaXJlY3RvcnkgY3ZzIHJlbmFtZWQgdG8gY3Zzc3JjOgotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQ2hhbmdlIGN2cyB0byBjdnNzcmMuCi0JKG5hdGl2ZV9vbmx5KTogTGlrZXdpc2UuCi0JKG5vY29uZmlnZGlycykgW3ZhcmlvdXMgY2FzZXNdOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IENoYW5nZSBhbGwtY3ZzIHRvIGFsbC1jdnNzcmMuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBDaGFuZ2UgY2hlY2stY3ZzIHRvIGNoZWNrLWN2c3NyYy4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQ2hhbmdlIGluc3RhbGwtY3ZzIHRvIGluc3RhbGwtY3Zzc3JjLgotCShDTEVBTl9NT0RVTEVTKTogQ2hhbmdlIGNsZWFuLWN2cyB0byBjbGVhbi1jdnNzcmMuCi0JKGFsbC1jdnNzcmMpOiBSZW5hbWUgdGFyZ2V0IGZyb20gYWxsLWN2cy4KLQotV2VkIERlYyAgMyAwNzo1NTo1OSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAoZ3h4X2luY2x1ZGVfZGlyKTogRml4IHRoaW5rby4KLQotVHVlIERlYyAgMiAxMDo1NTozNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVF9DUk9TUyk6IERlZmluZS4KLQkoaW5zdGFsbC1jcm9zcywgaW5zdGFsbC1nY2MtY3Jvc3MpOiBOZXcgdGFyZ2V0cy4KLQotVHVlIERlYyAgMiAxMDowODozMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIFRodW1iIHRhcmdldC4KLQotU3VuIE5vdiAzMCAxNjoxMjoyNyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBydWxlcyBmb3IgY3lnbW9uLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGN5Z21vbiBmb3Igc3BhcmMtZWxmIGFuZCBzcGFyY2xpdGUtYW91dC4KLQotVGh1IE5vdiAyNyAwMTozMTozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1RBUkdFVCk6IERvIGluc3RhbGwtZ2NjIGZpcnN0LgotCSogY29uZmlndXJlIChneHhfaW5jbHVkZV9kaXIpOiBQcm92aWRlIGEgZGVmaW5pdGlvbiBmb3Igc3ViZGlycwotCXdoaWNoIGRvIG5vdCB1c2UgYXV0b2NvbmYuCi0KLVdlZCBOb3YgMjYgMTE6NTM6MzMgMTk5NyAgS2VpdGggU2VpdHogIDxrZWl0aHNAb25pb25zLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbiwgQ2hhbmdlTG9nOiBtZXJnZSB3aXRoIGZvdW5kcnkncwotCTExLzE4Lzk3IGJ1aWxkIAotCi1XZWQgTm92IDI2IDE2OjA4OjUwIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogRnJvbSBGcmFueiBTaXJsLgotCSogY29uZmlnLmd1ZXNzIChwb3dlcnBjKi0qLWxpbnV4KTogSGFuZGxlIGdsaWJjMiBiZXRhIHJlbGVhc2UKLQlmb3VuZCBvbiBSZWRIYXQgTGludXggc3lzdGVtcy4KLQotRnJpIE5vdiAyMSAwOTo1MTowMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoYWxwaGEgc3R1ZmYpOiBNZXJnZSB3aXRoIEZTRiB0byBhdm9pZCBpbmNvcnJlY3QKLQlndWVzc2VzLgotCi1UaHUgTm92IDEzIDExOjM4OjM3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtbmNyLXN5c3Y0LjMqKTogVHdlYWsuCi0KLU1vbiBOb3YgMTAgMTU6MjM6MjEgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbHRtYWluLnNoOiBJZiBta2RpciBmYWlscywgY2hlY2sgd2hldGhlciB0aGUgZGlyZWN0b3J5IHdhcyBjcmVhdGVkCi0JYW55aG93IGJ5IHNvbWUgb3RoZXIgcHJvY2Vzcy4KLQotTW9uIE5vdiAxMCAxNDozODowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMzB2LSotKik6IENvbmZpZ3VyZSBhbGwgZGlyZWN0b3JpZXMuCi0KLVN1biBOb3YgIDkgMTc6MzY6MjAgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgbmV3bGliLCBsaWJpYmVydHkgZGlyZWN0b3JpZXMKLQlmb3IgdGhlIEQzMFYuCi0KLVNhdCBOb3YgIDggMTQ6NDI6NTkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgdGFyZ2V0LWxpYmdsb3NzIG9uIHRoZSBEMzBWLgotCi1GcmkgTm92ICA3IDEwOjM0OjA5IDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAZGFya3N0YXIuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGluY2x1ZGUvbGliaWJlcnR5Lmg6IEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3Jtcy4KLSAgICAgICAgKiBpbmNsdWRlL3JlbW90ZS1zaW0uaDogIEFkZCBleHRlcm4gIkMiIHsgc28gaXQgY2FuIGJlIHVzZWQgd2l0aCBDKysKLSAgICAgICAgcHJvZ3JhbXMuCi0KLVRodSBPY3QgMzAgMTE6MDk6MjkgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZDMwdi0qLSopOiBDb25maWd1cmUgR0NDIG5vdy4KLQotTW9uIE9jdCAyNyAxMzoxNzoyNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGEgInNlY29uZCBwYXNzIiBvZiB0d2Vha2luZyBub2NvbmZpZ2RpcnMsCi0JaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLQotTW9uIE9jdCAyNyAxMjowMzo1MyAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBjaGVjay10YXJnZXQtbGliaW8gZGVwZW5kcyBvbiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKy4KLQotU3VuIE9jdCAyNiAxMTo0ODoyNyAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgKG1hbmZyZWRAcy1kaXJla3RuZXQuZGUpCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAtbGVhbik6IENvbWJpbmVkIHdpdGggYG5vcm1hbCcgYm9vdHN0cmFwCi0JdGFyZ2V0cyB1c2luZyAiJEAiIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3Igc2ltaWxhciBidXQgbm90IGlkZW50aWNhbAotCXRhcmdldHMgd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIGNvZGUuCi0KLU1vbiBPY3QgMjAgMTU6Mjg6NDkgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRml4IHRvIHdvcmsgd2l0aCBERUMgQy4KLQotVHVlIE9jdCAgNyAyMzo1ODo1NyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWRkIG1pcHMtdHgzOS1lbGYgdG8gbWFya2V0aW5nIG5hbWVzLgotCi1UdWUgT2N0ICA3IDE0OjI0OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbHRtYWluLnNoOiBIYW5kbGUgc3ltbGlua3MgaW4gZ2VuZXJhdGVkIHNjcmlwdC4KLQotV2VkIE9jdCAgMSAxMzoxMToyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIGF1dG9jb25mIHN0eWxlIGRpcmVjdG9yeSBvcHRpb25zOiAtLWJpbmRpciwKLQktLWRhdGFkaXIsIC0taW5jbHVkZWRpciwgLS1pbmZvZGlyLCAtLWxpYmRpciwgLS1saWJleGVjZGlyLAotCS0tbWFuZGlyLCAtLW9sZGluY2x1ZGVkaXIsIC0tc2JpbmRpciwgLS1zaGFyZWRzdGF0ZWRpciwKLQktLXN5c2NvbmZkaXIuCi0JKiBNYWtlZmlsZS5pbiAoc2JpbmRpciwgbGliZXhlY2Rpciwgc3lzY29uZmRpcik6IE5ldyB2YXJpYWJsZXMuCi0JKHNoYXJlZHN0YXRlZGlyLCBsb2NhbHN0YXRlZGlyLCBvbGRpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIGJpbmRpciwgZGF0YWRpciwgaW5jbHVkZWRpciwKLQlpbmZvZGlyLCBsaWJkaXIsIGxpYmV4ZWNkaXIsIGxvY2Fsc3RhdGVkaXIsIG1hbmRpciwgb2xkaW5jbHVkZWRpciwKLQlzYmluZGlyLCBzaGFyZWRzdGF0ZWRpciwgYW5kIHN5c2NvbmZkaXIuCi0KLU1vbiBTZXAgMjkgMDA6Mzg6MDggMTk5NyBBYXJvbiBKYWNrc29uIDxqYWNrc29uQG5lZ3JpbC5tc3JjZS5ob3dhcmQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoYm9vdHN0cmFwLWxlYW4pOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDI0IDE4OjA2OjI3IDE5OTcgIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJhYnlsb24tNS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYpOiAgUmVtb3ZlIHRjbCwgdGssIGV4cGVjdCwgZ2RiLCBpdGNsLCB0aXgsIGRiLAotIAlzbiwgYW5kIGdudXNlcnYgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVdlZCBTZXAgMjQgMTU6MTg6MzIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsdG1haW4uc2g6IFR3ZWFrIHNoZWxsIHBhdHRlcm4gdG8gYXZvaWQgYnVnIGluIE5ldEJTRCAvYmluL3NoLgotCi1UaHUgU2VwIDE4IDIzOjU4OjI3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotKiBNYWtlZmlsZS5pbiAoY3Jvc3MpOiBOZXcgdGFyZ2V0LgotCi1UaHUgU2VwIDE4IDIxOjQzOjIzIDE5OTcgIEFsZXhhbmRyZSBPbGl2YSAgPG9saXZhQGRjYy51bmljYW1wLmJyPgotCQkJICBKZWZmIExhdyAgICAgICAgIDxsYXdAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBOZXcgdGFyZ2V0cy4KLQkoYWxsLWJvb3RzdHJhcCk6IFJlbW92ZSBvdXRkYXRlZCBhbmQgY29uZnVzaW5nIHRhcmdldC4KLQkoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogRG9uJ3QgcGFzcyBCT09UX0NGTEFHUyBkb3duLgotCi0KLTE5OTctMDktMTUgMDI6MzcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbXQtbGludXg6IERlZmluZSBDWFhGTEFHUyB0byBtYWtlIHN1cmUgLWZ2dGFibGUtdGh1bmtzIGlzCi0JdXNlZC4KLQkqIGNvbmZpZ3VyZS5pbjogTmFtZSBMaW51eCB0YXJnZXQgZnJhZ21lbnQuCi0KLQkqIGNvbmZpZ3VyZTogUmV3cml0ZSBzbyB0aGF0IHByb2plY3QgTWFrZWZpbGUgZnJhZ21lbnQgaXMgaW5zZXJ0ZWQKLQlmaXJzdCBhbmQgYXBwZWFycyBsYXN0IGluIHRoZSByZXN1bHRpbmcgTWFrZWZpbGUuCi0KLVR1ZSBTZXAgMTYgMDk6NTU6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pdGNsKTogSW5zdGFsbCB0Y2wgZmlyc3QuCi0KLVN1biBTZXAgMTQgMjA6NTM6NDIgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWN5Z3dpbjMyOiBvayB0byBidWlsZCBzcGxpdCB0ZXhpbmZvIGZpbGVzCi0KLUZyaSBTZXAgMTIgMTY6MTk6MjAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQkKLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIGJpc29uIGZyb20gbm9jb25maWdkaXJzIGZvciBDeWd3aW4zMiBob3N0Ci0KLVRodSBTZXAgMTEgMTY6NDA6NDYgMTk5NyAgSC5KLiBMdSAgKGhqbEBnbnUuYWkubWl0LmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGxvY2FsLWRpc3RjbGVhbik6IEFsc28gcmVtb3ZlIG1oLWZyYWcgbXQtZnJhZy4KLQotCSogY29uZmlndXJlLmluIChza2lwZGlycyk6IEFkZCB0YXJnZXQtbGlicnggZm9yIExpbnV4LgotCShhbHBoYS0qLWxpbnV4Kik6IFVzZSBjb25maWcvbWgtZWxmYWxwaGFwaWMgYW5kIGNvbmZpZy9tdC1lbGZhbHBoYXBpYy4KLQotV2VkIFNlcCAxMCAyMToyOTo1NCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXApOiBOZXcgdGFyZ2V0LgotCi1XZWQgU2VwIDEwIDE1OjE5OjIyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0ICdhbWlnYWRvcycgZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkuCi0KLU1vbiBTZXAgIDggMjA6NDY6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IE1lcmdlIHdpdGggRlNGLgotCi1TdW4gU2VwICA3IDE1OjU1OjI4IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBBZGQgIm1hcmtldGluZy1uYW1lcyIgcGF0Y2guCi0KLUZyaSBTZXAgIDUgMTY6MTE6MjggMTk5NyAgSm9lbCBTaGVycmlsbCAgKGpvZWxAT0FSY29ycC5jb20pCi0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKCotKi1ydGVtcyopOiBEbyBub3QgYnVpbGQgbGliZ2xvc3MgZm9yIHJ0ZW1zLgotCi1GcmkgU2VwICA1IDEyOjI3OjE3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogSGFuZGxlIHY4NTAtZWxmLgotCi1XZWQgU2VwICAzIDEyOjE1OjI0IDE5OTcgIENocmlzIFByb3Zlbnphbm8gIDxwcm92ZW5AY3lnbnVzLmNvbT4KLQotCSogbHRjb25maWc6IFNldCBDT05GSUdfU0hFTEwgaW4gbGlidG9vbC4KLQkqIGx0bWFpbi5zaDogVXNlIENPTkZJR19TSEVMTCBpbnN0ZWFkIG9mIC9iaW4vc2gKLQotTW9uIFNlcCAgMSAxNjo0NTo0NCAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X3N1YmRpcik6IFNldCB0byBsaWJyYXJpZXMgaWYgZW5hYmxlX211bHRpbGliLgotCi1XZWQgQXVnIDI3IDE2OjE1OjExIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBVcGRhdGUgZnJvbSBnY2MgZGlyZWN0b3J5LgotCi1UdWUgQXVnIDI2IDE2OjQ2OjQ2IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1zaW0pOiBEZXBlbmRzIG9uIGFsbC1yZWFkbGluZS4KLQotV2VkIEF1ZyAyMCAxOTo1NzozNyAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTiwgWUFDQyk6IFVzZSAkJHMuCi0JKGFsbC1iaXNvbik6IERlcGVuZCBvbiBhbGwtdGV4aW5mby4KLQotVHVlIEF1ZyAxOSAwMTo0MTozMiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IEFkZCAtTCBmbGFnLgotCShZQUNDKTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMTggMTE6MzA6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LiAKLQkKLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQotTW9uIEF1ZyAxOCAxMTozMDo1MCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LiAKLQkKLQkqIGNvbmZpZy5zdWIgKG1heWJlX29zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMDk6MjQ6MDYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBtaXBzdHgzOS4gIERlbGV0ZSByMzkwMC4KLQotTW9uIEF1ZyAxOCAxNzoyMDoxMCAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWF1dG9jb25mKTogRGVwZW5kcyBvbiBhbGwtdGV4aW5mby4KLQotRnJpIEF1ZyAxNSAyMzowOToyNiAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluICh7cG93ZXJwYyxyczYwMDB9Ki0qLSopOiBVcGRhdGUgdG8gY3VycmVudCBBSVggYW5kCi0JZWFiaSB0YXJnZXRzLgotCi1UaHUgQXVnIDE0IDE0OjQyOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBHZXQgQ0ZMQUdTIGFuZCBDWFhGTEFHUyBmcm9tIE1ha2VmaWxlLCBpZiBwb3NzaWJsZS4KLQotCSogY29uZmlndXJlOiBXaGVuIGhhbmRsaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIGhhbmRsZSBZQUNDIGFzIHdlbGwgYXMKLQlCSVNPTi4gIEp1c3Qgc2V0IEJJU09OIHRvIGJpc29uLiAgV2hlbiBzZXR0aW5nIFlBQ0MsIHByZWZlciBiaXNvbi4KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoYWxsLWJpc29uKTogRGVwZW5kIHVwb24gYWxsLXRleGluZm8uCi0KLVR1ZSBBdWcgMTIgMjA6MDk6NDggMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBiaXNvbiwgbm90IGJ5YWNjIG9yIGJpc29uIC15LgotCShZQUNDKTogYmlzb24gLXkgb3IgYnlhY2Mgb3IgeWFjYy4KLQkodmFyaW91cyk6IEFkZCAqLWJpc29uIGFzIGFwcHJvcHJpYXRlLgotCSh0YXopOiBObyBuZWVkIHRvIG1lc3Mgd2l0aCBCSVNPTiBhbnltb3JlLgotCi1UdWUgQXVnIDEyIDIyOjMzOjA4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBPU1RZUEUgbWF0Y2hlcyAqd2luMzIqLCB0cnkgdG8gZmluZCBhIGdvb2QgdmFsdWUgZm9yCi0JQ09ORklHX1NIRUxMLgotCi1TdW4gQXVnIDEwIDE0OjQxOjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEdldCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSBBTV9JTklUX0FVVE9NQUtFIGluCi0JY29uZmlndXJlLmluIGlmIGl0IGlzIHByZXNlbnQuCi0KLVNhdCBBdWcgIDkgMDA6NTg6MDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTERfRk9SX1RBUkdFVCk6IENoYW5nZSBsZC5uZXcgdG8gbGQtbmV3LgotCi1GcmkgQXVnICA4IDE2OjMwOjEzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBgYXJjJyBjcHUuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogY29uZmlnLW1sLmluOiBMaWtld2lzZS4KLQotVGh1IEF1ZyAgNyAxMTowMjozNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKElOU1RBTExfWDExX01PRFVMRVMpKTogRGVwZW5kIHVwb24gaW5zdGFsbGRpcnMuCi0KLVdlZCBBdWcgIDYgMTY6Mjc6MjkgMTk5NyAgQ2hyaXMgUHJvdmVuemFubyAgPHByb3ZlbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IENoYW5nZWQgc2VkIGRlbGltaXRlciBmcm9tICc6JyB0byAnfCcgd2hlbgotCWF0dGVtcHRpbmcgdG8gc3Vic3RpdHV0ZSAke2NvbmZpZ19zaGVsbH0gZm9yIFNIRUxMLiBPbgotCU5UICR7Y29uZmlnX3NoZWxsfSBtYXkgY29udGFpbiBhICc6JyBpbiBpdC4KLQotV2VkIEF1ZyAgNiAxMjoyOTowNSAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBGaXggZm9yIG5vbi1iYXNoIHNoZWxscy4KLQotV2VkIEF1ZyAgNiAwMDo0MjozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBU19GT1JfVEFSR0VUKTogQ2hhbmdlIGFzLm5ldyB0byBhcy1uZXcuCi0KLVR1ZSBBdWcgIDUgMTQ6MDg6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTk1fRk9SX1RBUkdFVCk6IENoYW5nZSBubS5uZXcgdG8gbm0tbmV3LgotCi0JKiB5bHdyYXA6IElmIHRoZSBwcm9ncmFtIGlzIGEgcmVsYXRpdmUgcGF0aCwgZm9yY2UgaXQgdG8gYmUKLQlhYnNvbHV0ZS4KLQotVHVlIEF1ZyAgNSAxMjoxMjo0NCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAodG9vbGRpcik6IFNldCBCSVNPTiB0byBgYmlzb24gLXknIGFuZCBub3QganVzdCBiaXNvbi4KLQotTW9uIEF1ZyAgNCAyMjo1OTowMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogV2hlbiB3aW5zdXAvTWFrZWZpbGUgcHJlc2VudCwKLSAJY29ycmVjdGx5IHNwZWNpZnkgdGhlIHRhcmdldCBidWlsZCBkaXJlY3RvcnkgJChUQVJHRVRfU1VCRElSKS93aW5zdXAKLSAJZm9yIGxpYnJhcmllcy4KLQotTW9uIEF1ZyAgNCAxMjo0MDoyNCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChFWFRSQV9HQ0NfRkxBR1MpOiBGaXggaGFuZGxpbmcgb2YgbWFjcm9zIHdpdGggdmFsdWVzCi0gCXNlcGFyYXRlZCBieSBzcGFjZXMuCi0KLVRodSBKdWwgMzEgMTk6NDk6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB5bHdyYXA6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6IEFkZCB5bHdyYXAuCi0KLQkqIGx0bWFpbi5zaDogSGFuZGxlIC9iaW4vc2ggYXQgc3RhcnQgb2YgaW5zdGFsbCBwcm9ncmFtLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGx0Y29uZmlnLCBsdG1haW4uc2gsIGFuZCBtaXNzaW5nLgotCi0JKiBsdGNvbmZpZywgbHRtYWluLnNoOiBOZXcgZmlsZXMsIGZyb20gbGlidG9vbCAxLjAuCi0JKiBtaXNzaW5nOiBOZXcgZmlsZSwgZnJvbSBhdXRvbWFrZSAxLjIuCi0KLVRodSBKdWwgMjQgMTI6NTc6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVHJlYXQgdGl4IGxpa2UgdGssIHB1dHRpbmcgaXQgaW4gWDExX01PRFVMRVMuICBBZGQKLQljaGVjay10ayB0byBDSEVDS19YMTFfTU9EVUxFUy4KLQotV2VkIEp1bCAyMyAxNzowMzoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIHdpdGggRlNGLgotCi1UdWUgSnVsIDIyIDE5OjA4OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIEZTRi4KLQotVHVlIEp1bCAyMiAxNDo1MDo0MiAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGNvbmZpZ3VyZTogVHJlYXQgbXNkb3NkamdwcCBsaWtlIGdvMzIuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLiAgRG9uJ3QgcmVtb3ZlIGdwcm9mIGZvciBnbzMyLgotCi0JKiBjb25maWd1cmU6IENoYW5nZSBNYWtlZmlsZS50ZW0yIHRvIE1ha2VmaWxlLnRtMi4KLQotTW9uIEp1bCAyMSAxMDozMToyNiAxOTk3ICBTdGVwaGVuIFBldGVycyAgPHNwZXRlcnNAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBGb3IgYWxwaGEtZGVjLW9zZiosIGRvbid0IGlnbm9yZSBncmVwLgotCi1UdWUgSnVsIDE1IDE0OjMzOjAzIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogaW5zdGFsbC1zaCAoY2htb2RjbWQpOiBTZXQgdG8gbnVsbCBpZiB0aGUgRFNUIGRpcmVjdG9yeSBhbHJlYWR5Ci0JZXhpc3RzLiAgU2FtZSBhcyBOb3YgMTF0aCBjaGFuZ2UuCi0KLU1vbiBKdWwgMTQgMTE6MDE6MTUgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoR0RCX1RLKTogTmVlZHMgaXRjbCBhbmQgdGl4LiAKLQotTW9uIEp1bCAxNCAwMDozMjoxMCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogVXBkYXRlIGZyb20gRlNGLgotCi1GcmkgSnVsIDExIDExOjU3OjExIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoR0RCX1RLKTogRGVwZW5kIG9uIGl0Y2wgYW5kIHRpeC4KLQotRnJpIEp1bCAgNCAxMzoyNTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1BST0dSQU1fQVJHUyk6IE5ldyB2YXJpYWJsZS4KLQkoSU5TVEFMTF9QUk9HUkFNKTogVXNlICQoSU5TVEFMTF9QUk9HUkFNX0FSR1MpLgotCShJTlNUQUxMX1NDUklQVCk6IE5ldyB2YXJpYWJsZS4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBkb3duIElOU1RBTExfU0NSSVBULgotCSogY29uZmlndXJlLmluOiBJZiBob3N0IGlzICotKi1jeWd3aW4zMiosIHNldCBJTlNUQUxMX1BST0dSQU1fQVJHUwotCXRvIC14LgotCSogaW5zdGFsbC1zaDogQWRkIHN1cHBvcnQgZm9yIC14IG9wdGlvbi4KLQotTW9uIEp1biAzMCAxNTo1MTozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IFRyZWF0IHRpeCBsaWtlIGl0Y2wuCi0KLVRodSBKdW4gMjYgMTM6NTk6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoV0lORFJFUyk6IE5ldyB2YXJpYWJsZS4KLQkoV0lORFJFU19GT1JfVEFSR0VUKTogTmV3IHZhcmlhYmxlLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBBZGQgV0lORFJFU19GT1JfVEFSR0VULgotCShFWFRSQV9IT1NUX0ZMQUdTKTogQWRkIFdJTkRSRVMuCi0JKEVYVFJBX1RBUkdFVF9GTEFHUyk6IEFkZCBXSU5EUkVTLgotCShFWFRSQV9HQ0NfRkxBR1MpOiBBZGQgV0lORFJFUy4KLQkoJChET19YKSk6IFBhc3MgZG93biBXSU5EUkVTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUykpOiBTZXQgV0lORFJFUyB3aGVuIGNvbmZpZ3VyaW5nLgotCSogY29uZmlndXJlOiBUcmVhdCBXSU5EUkVTIGxpa2UgRExMVE9PTCwgYW5kIFdJTkRSRVNfRk9SX1RBUkdFVCBsaWtlCi0JRExMVE9PTF9GT1JfVEFSR0VULgotCi1XZWQgSnVuIDI1IDE1OjAxOjI2IDE5OTcgIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgc2ltIGJlZm9yZSBnZGIgZm9yIHdpbjMyLXgtcHBjCi0KLVdlZCBKdW4gMjUgMTI6MTg6NTQgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JTW92ZSBncGVyZiBpbnRvIHRoZSB0b3BsZXZlbCwgZnJvbSBsaWJnKysuCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF90b29scyk6IEFkZCB0YXJnZXQtZ3BlcmYuCi0JKG5hdGl2ZV9vbmx5KTogQWRkIHRhcmdldC1ncGVyZi4KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWdwZXJmKTogTmV3IHRhcmdldCwgZGVwZW5kIG9uCi0JYWxsLXRhcmdldC1saWJnKysuCi0JKGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYpOiBFbXB0eSBydWxlLgotCShBTExfVEFSR0VUX01PRFVMRVMpOiBBZGQgYWxsLXRhcmdldC1ncGVyZi4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogQWRkIGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYuCi0JKENIRUNLX1RBUkdFVF9NT0RVTEVTKTogQWRkIGNoZWNrLXRhcmdldC1ncGVyZi4KLQkoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBpbnN0YWxsLXRhcmdldC1ncGVyZi4KLQkoQ0xFQU5fVEFSR0VUX01PRFVMRVMpOiBBZGQgY2xlYW4tdGFyZ2V0LWdwZXJmLgotCi1Nb24gSnVuIDIzIDEwOjUxOjUzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLSAKLQkqIGNvbmZpZy5zdWIgKG1uMTAyMDApOiBSZWNvZ25pemUgbmV3IGJhc2ljIG1hY2hpbmUuCi0KLVRodSBKdW4gMTkgMTQ6MTY6NDIgMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBFTkFCTEVfTVVMVElMSUIsIHNvIHdlJ2xsIGJlIHBhc3NpbmcKLQktLWVuYWJsZS1tdWx0aWxpYiBkb3duIHRvIHN1YmRpcnM7IHNldHRpbmcgVEFSR0VUX1NVQkRJUiB3YXMgZW5vdWdoLgotCi1UdWUgSnVuIDE3IDE1OjMxOjIwIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJZiB3ZSdyZSBidWlsZGluZyBtaXBzLXNnaS1pcml4NiogbmF0aXZlLCB0dXJuIG9uCi0JRU5BQkxFX01VTFRJTElCIGFuZCBzZXQgVEFSR0VUX1NVQkRJUi4KLQotVHVlIEp1biAxNyAxMjoyMDo1OSAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtc24pOiBEZXBlbmQgb24gYWxsLWdyZXAuCi0KLU1vbiBKdW4gMTYgMTE6MTE6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtaC1wcGNwaWMgYW5kIG10LXBwY3BpYyBmb3IgcG93ZXJwYyotKiB0YXJnZXRzLgotCi0JKiBjb25maWd1cmU6IFNldCBDRkxBR1MgYW5kIENYWEZMQUdTLCBhbmQgc3Vic3RpdHV0ZSB0aGVtIGludG8KLQlNYWtlZmlsZS4gIEZyb20gSmVmZiBNYWtleSA8amVmZkBjdHMuY29tPi4KLQkqIE1ha2VmaWxlLmluOiBBZGQgY29tbWVudCBmb3IgQ0ZMQUdTIGFuZCBDWFhGTEFHUy4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RCSVNPTkZJTEVTKTogUmVtb3ZlLgotCSh0YXopOiBEb24ndCBmdXR6IHdpdGggRElTVEJJU09ORklMRVMuICBDaGFuZ2UgQklTT04gdG8gdXNlCi0JJChERUZBVUxUX1lBQ0MpLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGl0bCwgZGIsIHNuLCBldGMuLCB3aGVuIGJ1aWxkaW5nIGZvciBuYXRpdmUKLSAJY3lnd2luMzIuCi0KLQkqIE1ha2VmaWxlLmluIChMRCk6IE5ldyB2YXJpYWJsZS4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFBhc3MgZG93biBMRC4KLQkoJChET19YKSk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDE2IDExOjEwOjM1IDE5OTcgIFBoaWxpcCBCbHVuZGVsbCAgPFBoaWxpcC5CbHVuZGVsbEBwb2JveC5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlICQoU0hFTEwpIHdoZW4gZXhlY3V0aW5nIGluc3RhbGwtc2guCi0KLUZyaSBKdW4gMTMgMTA6MjI6NTYgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2FyZ3MpOiBTdHJpcCBvdXQgYW55IHN1cHBsaWVkIC0tYnVpbGQgYXJndW1lbnQKLSAJYmVmb3JlIGFkZGluZyBvdXIgb3duLiBBbHdheXMgYWRkIC0tYnVpbGQuCi0KLVRodSBKdW4gMTIgMjE6MTI6MjggMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2FyZ3MpOiBQYXNzIC0tYnVpbGQgaWYgd2UncmUgZG9pbmcKLQlhIGNyb3NzLWNvbXBpbGUuCi0KLUZyaSBKdW4gIDYgMjE6Mzg6NDAgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBjaGluYWRvbGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBVc2UgJ3wnIGluc3RlYWQgb2YgIjoiIGFzIHRoZSBzZXBlcmF0b3IgaW4KLQlzZWQuIE90aGVyd2lzZSBzZWQgY2hva2VzIG9uIE5UIHBhdGggbmFtZXMgd2l0aCBkcml2ZQotCWRlc2lnbmF0b3JzLiBBbHNvIGxvb2sgZm9yICI/OioiIGFzIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgaW4gYW4KLQlhYnNvbHV0ZSBwYXRobmFtZS4KLQotTW9uIEp1biAgMiAxMzowNToyMCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogU3VwcG9ydCBmb3IgcjM5MDAuCi0KLVdlZCBNYXkgMjEgMTc6MzM6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBpbnN0YWxsLXNoLCBub3QgaW5zdGFsbC5zaC4KLQotV2VkIE1heSAxNCAxNjowNjo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBJbXByb3ZlIGNoZWNrIGZvciBCSVNPTiBzbyBpdCBkb2Vzbid0IHRyeSB0bwotCWFwcGx5IGl0IHR3aWNlLgotCi1GcmkgTWF5ICA5IDE3OjIyOjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTU9EVUxFUyk6IFB1dCBpbnN0YWxsLW9wY29kZXMgYmVmb3JlCi0JaW5zdGFsbC1iaW51dGlscy4KLQotVGh1IE1heSAgOCAxNzoyOTo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYXV0b21ha2UgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IEFkZCBhdXRvbWFrZS4KLQotVHVlIE1heSAgNiAxNTo0OTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmYXVsdCBDWFggdG8gYysrLCBub3QgZ2NjLgotCSogTWFrZWZpbGUuaW4gKENYWCk6IFNldCB0byBjKyssIG5vdCBnY2MuCi0JKENYWF9GT1JfVEFSR0VUKTogV2hlbiBjcm9zcywgdHJhbnNmb3JtIGMrKywgbm90IGdjYy4KLQotVGh1IE1heSAgMSAxMDoxMTo0MyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLXNoOiB0cnkgYXBwZW5kaW5nIGEgLmV4ZSBpZiBzb3VyY2UgZmlsZSBkb2Vzbid0Ci0JZXhpc3QKLQotV2VkIEFwciAzMCAxMjowNTozNiAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVHVybiBvbiBtdWx0aWxpYiBieSBkZWZhdWx0LgotCShjcm9zc19vbmx5KTogUmVtb3ZlIHRhcmdldC1saWJpYmVydHkuCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogRG9uJ3QgZGVwZW5kIG9uIGxpYmliZXJ0eS4KLQotTW9uIEFwciAyOCAxODozOTo0NSAxOTk3ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IGltcHJvdmUgYWxnb3JpdGhtIGZvciByZWNvZ25pemluZyBHbnUgSHVyZCB4ODYuCi0KLVRodSBBcHIgMjQgMTk6MzA6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIG1wdy1pbnN0YWxsLgotCShESVNUQklTT05GSUxFUyk6IEFkZCBsZC9NYWtlZmlsZS5pbgotCi1UdWUgQXByIDIyIDE3OjE3OjI4IDE5OTcgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaWYgdGFyZ2V0IGlzIGN5Z3dpbjMyIGJ1dCBob3N0IGlzbid0IGN5Z3dpbjMyLAotCWRvbid0IGNvbmZpZ3VyZSBnZGIgdGNsIHRrIGV4cGVjdCwgbm90IGp1c3QgZ2RiLgotCi1Nb24gQXByIDIxIDEzOjMzOjM5IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBnbnVzZXJ2IGV2ZXJ5d2hlcmUgc24gYXBwZWFycy4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWdudXNlcnYuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1nbnVzZXJ2LgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWdudXNlcnYuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1nbnVzZXJ2LgotCShhbGwtZ251c2Vydik6IE5ldyB0YXJnZXQuCi0KLVRodSBBcHIgMTcgMTM6NTc6MDYgMTk5NyAgUGVyIEZvZ2Vsc3Ryb20gIDxwZWZvQG9wZW5ic2Qub3JnPgotCi0JKiBjb25maWcuZ3Vlc3M6IEZpeGVzIGZvciBNSVBTIE9wZW5CU0Qgc3lzdGVtcy4KLQotVHVlIEFwciAxNSAxMjoyMTowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNKTogUmVtb3ZlLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgSU5TVEFMTF9YRk9STS4KLQotCSogbWtpbnN0YWxsZGlyczogTmV3IGZpbGUsIGNvcGllZCBmcm9tIGF1dG9tYWtlLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxkaXJzKTogUmVuYW1lIGZyb20gaW5zdGFsbC1kaXJzLiAgVXNlCi0JbWtpbnN0YWxsZGlycy4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKERFVk9fU1VQUE9SVCk6IEFkZCBta2luc3RhbGxkaXJzLgotCi1Nb24gQXByIDE0IDExOjIxOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW5zdGFsbC1zaDogUmVuYW1lIGZyb20gaW5zdGFsbC5zaC4KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQkoREVWT19TVVBQT1JUKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZ3VyZTogVXNlICR7Y29uZmlnX3NoZWxsfSB3aXRoICR7bW92ZWlmY2hhbmdlfS4gIEZyb20gVGhvbWFzCi0JR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+LgotCi1GcmkgQXByIDExIDE2OjM3OjEwIDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIE9wZW5CU0Qgc3lzdGVtcyBjb3JyZWN0bHkuCi0KLUZyaSBBcHIgMTEgMTc6MDc6MDQgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogUkVBRE1FLCBNYWtlZmlsZS5pbiAoRVRDX1NVUFBPUlQpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bwotCWNmZy1wYXBlciosIGNvbmZpZ3VyZS57dGV4aSxtYW4saW5mbyp9Ll8KLQotU3VuIEFwciAgNiAxODo0Nzo1NyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC5ub3JtYWwpOiBFbnN1cmUgdGhhdCBnY2MgaXMgYnVpbHQgYWZ0ZXIgYWxsCi0JdGhlIHgxMSAtIGllIGdkYiAtIHRhcmdldHMuCi0KLVR1ZSBBcHIgIDEgMTY6Mjg6NTAgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRG9uJ3QgcnVuIGNvbmYtYS1nYXMuCi0KLU1vbiBNYXIgMzEgMTY6MjY6NTUgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGhwcGExLjEtKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KLQotU3VuIE1hciAzMCAxMjozODoyNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbm9jb25maWdkaXJzIGNhc2Ugc2luY2UgZ2RiIGFsc28KLQljb25maWd1cmVzIGFuZCBidWlsZHMgZm9yIHRpYzgwLWNvZmYuCi0KLUZyaSBNYXIgMjggMTg6Mjg6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBjYWNoZV9maWxlIHRvIGNvbmZpZy5jYWNoZS4KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1kaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi1XZWQgTWFyIDI2IDE4OjQ5OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1XZWQgTWFyIDI2IDEwOjM4OjI1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHRpYzgwLSotKik6IFJlbW92ZSBHKysgbGlicmFyaWVzIGFuZCBsaWJnbG9zcyBmcm9tCi0Jbm9jb25maWdkaXJzLgotCi1Nb24gTWFyIDI0IDE1OjAyOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGlycyk6IERvbid0IGNyYXNoIGlmIHByZWZpeCwgYW5kIGhlbmNlCi0JTUFLRURJUlMsIGlzIGVtcHR5LgotCi1Nb24gTWFyIDI0IDEyOjQwOjU1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFR3ZWFrIG1uMTAzMDAgZW50cnkuCi0KLUZyaSBNYXIgMjEgMTU6MzU6MjcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF90b29scyk6IFB1dCBzaW0gYmVmb3JlIGdkYiwgc28gZ2RiJ3MKLQljb25maWd1cmUudGd0IGNhbiBkZXRlcm1pbmUgaWYgdGhlIHNpbXVsYXRvciB3YXMgY29uZmlndXJlZC4KLQotU3VuIE1hciAxNiAxNjowNzowOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTW92ZSBCZU9TICRvcyBjYXNlIHRvIGJlIHdpdGggb3RoZXIgQ3lnbnVzCi0JbG9jYWwgY2FzZXMuCi0KLVN1biBNYXIgMTYgMDE6MzQ6NTUgMTk5NyAgTWFydGluIEh1bnQgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVtb3ZlIG1pc3BsYWNlZCBjb21tZW50IHRoYXQgYnJva2UgTGludXguCi0KLVNhdCBNYXIgMTUgMjI6NTA6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCBCZU9TIHN1cHBvcnQuCi0KLU1vbiBNYXIgMTAgMTM6MzA6MTEgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tfWDExX01PRFVMRVMpOiBEb24ndCBydW4gY2hlY2stdGsuCi0KLVdlZCBNYXIgIDUgMTI6MDk6MjkgMTk5NyAgTWFydGluICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFJlbW92ZSB0Y2wgYW5kIHRrIGZyb20KLQlub2NvbmZpZ2RpcnMgZm9yIGN5Z3dpbjMyIGJ1aWxkcy4KLQotRnJpIEZlYiAyOCAxODoyMDoxNSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBSZW1vdmUgbGQgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVRodSBGZWIgMjcgMTQ6NTc6MjYgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChHQVNfU1VQUE9SVF9ESVJTLCBCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBSZW1vdmUKLQltYWtlLWFsbC5jb20sIHVzZSBtYWtlZmlsZS52bXMgaW5zdGVhZC4KLQotVHVlIEZlYiAyNSAxODo0NjoxNCAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtbG5ld3MqLgotCi1UdWUgRmViIDI1IDEzOjE5OjE0IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC50cGdpLmNvbS5hdT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIHRhcmdldC1uZXdsaWIsCi0gCXRhcmdldC1leGFtcGxlcyBhbmQgdGFyZ2V0LWxpYmliZXJ0eSBmb3IgZDMwdi4KLQotRnJpIEZlYiAyMSAxNzo1NjoyNSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBFbmFibGUgbGQgZm9yIGQzMHYuCi0KLUZyaSBGZWIgMjEgMjA6NTg6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogQnVpbGQgY29tcGlsZXIuCi0KLVN1biBGZWIgMTYgMTU6NDE6MDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQzMHYtKik6IFJlbW92ZSBzaW0gZGlyZWN0b3J5IGZyb20gbGlzdCBvZgotIAl1bnN1cHBvcnRlZCBkMzB2IGRpcmVjdG9yaWVzCi0KLVR1ZSBGZWIgMTggMTc6MzI6NDIgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbjogQWRkIGQzMHYgdGFyZ2V0IGNwdS4gCi0JCi1UaHUgRmViIDEzIDIyOjA0OjQ0IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCSogbWFrZS1hbGwuY29tOiBSZW1vdmUuCi0KLVdlZCBGZWIgMTIgMTI6NTQ6MTggMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogQWRkIExJQkdDQzJfREVCVUdfQ0ZMQUdTLgotCi1TYXQgRmViICA4IDIwOjM2OjQ5IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWl0Y2wpOiBUaGUgcnVsZSBpcyBhbGwtaXRjbCwgbm90IGFsbC10Y2wuCi0KLVR1ZSBGZWIgIDQgMTE6Mzk6MjkgMTk5NyAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01PRFVMRVMpOiBBZGRlZCBhbGwtZGIuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlYyBjaGVjay1kYi4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1kYi4KLQkoQ0xFQU5fTU9EVUxFUyk6IEFkZGVkIGNsZWFuLWRiLgotCi1Nb24gRmViICAzIDEzOjI5OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotVHVlIEphbiAyOCAwOToyMDozNyAxOTk3ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEFkZGVkIGFsbC1pdGNsLgotCShDUk9TU19DSEVDS19NT0RVTEVTKTogQWRkZWQgY2hlY2staXRjbC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogQWRkZWQgaW5zdGFsbC1pdGNsLgotCShDTEVBTl9NT0RVTEVTKTogQWRkZWQgY2xlYW4taXRjbC4KLQotVGh1IEphbiAyMyAwMTo0NDoyNyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGJ1aWxkIGdkYiBmb3IgbW4xMDIwMAotCi1GcmkgSmFuIDE3IDE1OjMyOjE1IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LXdpbnN1cCk6IERlcGVuZCBvbiBhbGwtdGFyZ2V0LWxpYmlvLgotCi1Nb24gSmFuIDEzIDIyOjQ2OjU0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0aWM4MC0qLSopOiBUdXJuIG9mZiBtb3N0IHRhcmdldHMgcmlnaHQgbm93LgotCi1GcmkgSmFuICAzIDE2OjA0OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1BS0VJTkZPKTogQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIE1ha2VmaWxlLAotCXJhdGhlciB0aGFuIHRoZSBtYWtlaW5mbyBwcm9ncmFtLgotCShkby1pbmZvKTogRGVwZW5kIHVwb24gYWxsLXRleGluZm8uCi0KLVR1ZSBEZWMgMzEgMTY6MDA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSB1c2VzIG9mIGNvbmZpZy9taC1saW51eC4KLQotCSogY29uZmlnLnN1YiwgY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotRnJpIERlYyAyNyAyMzowNDozMyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoY2FzZSAkYmFzaWNfbWFjaGluZSk6IEFkZCB0aWM4MCBlbnRyaWVzLgotCi1GcmkgRGVjIDI3IDEyOjA3OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlnLmd1ZXNzOiBNZXJnZSB3aXRoIGxhdGVzdCBGU0Ygc291cmNlcy4KLQotV2VkIERlYyAxOCAyMjo0NjozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1idWlsZC5pbjogQnVpbGQgbGQgYmVmb3JlIGdjYywgdXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZS4KLQkqIG1wdy1jb25maWcuaW46IFRlc3QgZm9yIE5ld0ZvbGRlclJlY3Vyc2l2ZS4KLQkqIG1wdy1pbnN0YWxsOiBVc2Ugc3ltYm9saWMgbmFtZSBmb3Igc3RhcnR1cCBmaWxlbmFtZS4KLQkqIG1wdy1SRUFETUU6IEFkZCB2YXJpb3VzIGFkZGl0aW9uYWwgZGV0YWlscy4KLQotV2VkIERlYyAxOCAxMzoxMTo0NiAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6IFJlbW92ZSBiaW51dGlscyBmcm9tIG5vY29uZmlnZGlycy4KLQotV2VkIERlYyAxOCAxMDoyOTozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gYnVpbGQgZ2NjIGFuZCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBmb3IKLQl0aGUgbW4xMDIwMC4KLQotV2VkIERlYyAgNCAxNjo1MzowNSAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGF2b2lkIGJ1aWxkaW5nIGdkYiBmb3IgbW4xMDMwMCBhbnkgbW9yZQotCSogTWFrZWZpbGUuaW46IGRvdWJsZS1xdW90ZSBHQ0NfRk9SX1RBUkdFVCBsaW5lIGluIEVYVFJBX0dDQ19GTEFHUwotCWluc3RlYWQgb2Ygc2luZ2xlLXF1b3RpbmcgaXQuCi0KLVR1ZSBEZWMgIDMgMjM6MjY6NTAgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSAtLXdpdGgtc3RhYnMgb24gSVJJWCA2LgotCi1UdWUgRGVjICAzIDA5OjA1OjI1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTMycik6IEJ1aWxkIGdkYiwgbGliZysrIG5vdy4KLQotU3VuIERlYyAgMSAwMDoxODo1OSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6ICBSZW1vdmUgZ2RiIGFuZCByZWxhdGVkCi0JZGlyZWN0b3JpZXMgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVR1ZSBOb3YgMjYgMTE6NDU6MzMgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGJhc2ljX21hY2hpbmUpOiBhZGRlZCBtaXBzMTYgY29uZmlndXJhdGlvbgotCi1TYXQgTm92IDIzIDE5OjI2OjIyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogSGFuZGxlIGQxMHYtdW5rbm93bi4KLQotU2F0IE5vdiAyMyAxMDoyMzowMSAxOTk2ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogSGFuZGxlIHY4NTAtdW5rbm93bi4KLQotVGh1IE5vdiAyMSAxNjoxOTo0NCAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGZpbmR1dGlscwotCSogY29uZmlndXJlLmluOiBhZGQgZmluZHV0aWxzIHRvIGxpc3Qgb2YgaG9zdF90b29scwotCi1XZWQgTm92IDIwIDEwOjA5OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogSGFuZGxlIG1uMTAyMDAgYW5kIG1uMTAzMDAuCi0KLVR1ZSBOb3YgMTkgMTY6MzU6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKik6IERvIG5vdCBidWlsZCBsaWJyeC4KLQotTW9uIE5vdiAxOCAxMzoyODo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobW4xMDMwMCk6IEJ1aWxkIGV2ZXJ5dGhpbmcgZXhjZXB0IGdkYiAmIGxpYmdsb3NzLgotCi1XZWQgTm92IDEzIDE0OjU5OjQ2IDE5OTYgIFBlciBCb3RobmVyICA8Ym90aG5lckBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6ICBQYXRjaCBmb3IgRGFuc2sgRGF0YSBFbGVrdHJvbmlrIHNlcnZlcnMsCi0JZnJvbSBOaWVscyBTa291IE9sc2VuIDxuc29AZGRlLmRrPi4KLQotCUZvciBuY3IsIHVzZSAvYmluL3VuYW1lIHJhdGhlciB0aGFuIHVuYW1lLCBzaW5jZSBHTlUgdW5hbWUgZG9lcyBub3QKLQlzdXBwb3J0IC1wLiAgU3VnZ2VzdGVkIGJ5IE1hcmsgTWl0Y2hlbGwgPG1taXRjaGVsbEB1c2EubmV0Pi4KLQotCVBhdGNoIGZvciBNSVBTIFI0MDAwIHJ1bm5pbmcgU3lzdGVtIFYsCi0JZnJvbSBFcmljIFMuIFJheW1vbmQgPGVzckBzbmFyay50aHlyc3VzLmNvbT4uCi0KLQlGaXggdGhpbmtvIGZvciBuZXh0c3RlcC4KLQotCVBhdGNoIGZvciBPU0YxIGluIGk/ODYsIGZyb20gRGFuIE11cnBoeSA8ZGxtQG9zZi5vcmc+IHZpYSBIYXJsYW4gU3Rlbm4uCi0KLQlTYXQgSnVuIDI0IDE4OjU4OjE3IDE5OTUgIE1vcnRlbiBXZWxpbmRlciAgPHRlcnJhK0Bjcy5jbXUuZWR1PgotCSogY29uZmlnLmd1ZXNzOiBHdWVzcyBtaXBzLWRlYy1tYWNoX2JzZDQuMy4KLQotCVRodSBPY3QgMTAgMDQ6MDc6MDQgMTk5NiAgSGFybGFuIFN0ZW5uIDxoYXJsYW5AcGZjcy5jb20+Ci0JKiBjb25maWcuZ3Vlc3MgKGk/ODYtbmNyLXN5c3YqKTogIEVtaXQganVzdCBlbm91Z2ggb2YgdGhlIG1pbm9yCi0JcmVsZWFzZSBudW1iZXJzLgotCSogY29uZmlnLmd1ZXNzIChtaXBzLW1pcHMtcmlzY29zKik6ICBFbWl0IGp1c3QgZW5vdWdoIG9mIHRoZQotCXJlbGVhc2UgbnVtYmVyLgotCi0JVHVlIE9jdCAgOCAxMDozNzoyMiAxOTk2ICBGcmFuayBWYW5jZSA8ZnZhbmNlQHdhaWkuY29tPgotCSogY29uZmlnLmd1ZXNzIChzcGFyYy1hdXNwZXgtc3Vub3MqKTogIEFkZGVkLgotCShmMzAwLWZ1aml0c3UtKik6IEFkZGVkLgotCi0JV2VkIFNlcCAyNSAyMjowMDozNSAxOTk2ICBKZWZmIFdvb2xzZXkgPHdvb2xzZXlAamx3LmNvbT4KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBhIFRhZHBvbGUgYXMgYSBzcGFyYy4KLQotV2VkIE5vdiAxMyAwMDo1MzowOSAxOTk2ICBEYXZpZCBKLiBNYWNLZW56aWUgIDxkam1AY2h1cmNoeS5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiBEb24ndCBhc3N1bWUgdGhhdCBOZXh0U3RlcCB2ZXJzaW9uIGlzIGVpdGhlciAyIG9yCi0JMy4gIE5leHRTdGVwIDQgKGFrYSBPcGVuU3RlcCA0KSBoYXMgY29tZSBvdXQgbm93LgotCi1Nb24gTm92IDExIDIzOjUyOjAzIDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBjaHVyY2h5LmdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3M6IFN1cHBvcnQgQ3JheSBUOTAgdGhhdCByZXBvcnRzIGl0c2VsZiBhcyAiQ1JBWSBUUyIuCi0JRnJvbSBSaWsgRmFpdGggPGZhaXRoQGNzLnVuYy5lZHU+LgotCi1GcmkgTm92ICA4IDExOjM0OjU4IDE5OTYgIERhdmlkIEouIE1hY0tlbnppZSAgPGRqbUBnZWVjaC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLnN1YjogQ29udHJpYnV0aW9ucyBmcm9tIGJ1Zy1nbnUtdXRpbHMgdG86Ci0JU3VwcG9ydCBwbGFpbiAiaHBwYSIgKG5vIHZlcnNpb24gZ2l2ZW4pIGFyY2hpdGVjdHVyZSwgcmVwb3J0ZWQgYnkKLQlPcGVuU3RlcC4KLQlPcGVuQlNEIGxpa2UgTmV0QlNELgotCUx5bnhPcyBpcyBub3QgYSBoYXJkd2FyZSBzdXBwbGllci4KLQotCSogY29uZmlnLmd1ZXNzOiBDb250cmlidXRpb25zIGZyb20gYnVnLWdudS11dGlscyB0byBhZGQgc3VwcG9ydCBmb3I6Ci0gCU9wZW5CU0QgbGlrZSBOZXRCU0QuCi0JU3RyYXR1cyBzeXN0ZW1zLgotCU1vcmUgUHlyYW1pZCBzeXN0ZW1zLgotCWlbbj40XTg2IEludGVsIGNoaXBzLgotCU02ODBbbj40XTAgTW90b3JvbGEgY2hpcHMuCi0JVXNlIHVua25vd24gaW5zdGVhZCBvZiBseW54IGZvciBoYXJkd2FyZSBtYW51ZmFjdHVyZXIuCi0KLU1vbiBOb3YgMTEgMTA6MDk6MDggMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBpbnN0YWxsLnNoIChjaG1vZGNtZCk6IFNldCB0byBudWxsIGlmIHRoZSBEU1QgZGlyZWN0b3J5IGFscmVhZHkKLQlleGlzdHMuCi0KLU1vbiBOb3YgMTEgMTA6NDM6NDEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLXtlYWJpLGVsZixsaW51eCxydGVtLHN5c3Ysc29sYXJpc30qKTogRG8KLQlub3QgdXNlIG10LXBwYyB0YXJnZXQgTWFrZWZpbGUgZnJhZ21lbnQgYW55IG1vcmUuCi0KLVN1biBOb3YgIDMgMTk6MTc6MDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotd2luZG93cyk6ICBFeGNsdWRlIGV2ZXJ5dGhpbmcgYnV0IHRob3NlIGRpcnMKLQluZWVkZWQgdG8gYnVpbGQgd2luZG93cy4KLQotVHVlIE9jdCAyOSAxNjo0MTozMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXRhcmdldC13aW5zdXApOiBEZXBlbmQgb24gYWxsLXRhcmdldC1saWJyeC4KLQotTW9uIE9jdCAyOCAxNzozMjo0NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBFeGNsdWRlIG1tYWxsb2MgZnJvbSBpMzg2LXdpbmRvd3MuCi0JKiBjb25maWcvbWgtd2luZG93czogIEFkZCBydWxlcyBmb3IgYnVpbGRpbmcgTVNWQyBtYWtlZmlsZXMuCi0KLVRodSBPY3QgMjQgMDk6MjI6NDYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogVW5kbyBteSBwcmV2aW91cyBjaGFuZ2UuCi0KLVRodSBPY3QgMjQgMTI6MTI6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhUUkFfR0NDX0ZMQUdTKTogUGFzcyBkb3duIEdDQ19GT1JfVEFSR0VUCi0JdW5jb25kaXRpb25hbGx5LgotCShNQUtFT1ZFUlJJREVTKTogRGVmaW5lIChyZXZlcnQgdGhpcyBwYXJ0IG9mIE9jdG9iZXIgMTggY2hhbmdlKS4KLQotVGh1IE9jdCAyNCAwOTowMjowNyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRkxBR1NfVE9fUEFTUyk6ICBBZGQgJChIT1NUX0ZMQUdTKSB0byBhbGxvdyB0aGUKLQlob3N0IHRvIGFkZCBpdCdzIG93biBmbGFncy4KLQkqIGNvbmZpZy9taC13aW5kb3dzIChIT1NUX0ZMQUdTKTogIFNldCBzcmNyb290LCB3aGljaCBpcyBuZWVkZWQKLQlmb3IgTVNWQyBidWlsZCBwcm9jZWR1cmUuCi0KLVR1ZSBPY3QgMjIgMTU6MjA6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEhhbmRsZSBHQ0NfRk9SX1RBUkdFVCBsaWtlIENDX0ZPUl9UQVJHRVQuCi0KLUZyaSBPY3QgMTggMTM6Mzc6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IENoZWNrIGZvciB4Z2NjLCBub3QgTWFrZWZpbGUuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0JKEdDQ19GT1JfVEFSR0VUKTogRGVmaW5lLgotCShCQVNFX0ZMQUdTX1RPX1BBU1MpOiBSZW1vdmUgR0NDX0ZPUl9UQVJHRVQuCi0JKEVYVFJBX0dDQ19GTEFHUyk6IERlZmluZSBHQ0NfRk9SX1RBUkdFVCBiYXNlZCBvbiB3aGV0aGVyCi0JQ0NfRk9SX1RBUkdFVCB3YXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0JKE1BS0VPVkVSUklERVMpOiBEb24ndCBkZWZpbmUuCi0KLVRodSBPY3QgMTcgMTA6Mjc6NTYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtMzJyKTogRml4IHNwZWxsaW5nIG9mIGxpYmcrKyBsaWJzLgotCi1UaHUgT2N0IDEwIDEwOjM3OjE3IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiAoLWFwcGxlKik6IFJlbW92ZSwgbm93IHJlZHVuZGFudC4KLQotVGh1IE9jdCAxMCAxMjozMDo1NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IENQVS1WRU5ET1ItbGludXgtZ251LgotCi0JKiBjb25maWd1cmU6IFJld29yayB5ZXN0ZXJkYXkncyBzZWQgc2NyaXB0IHBhdGNoLgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIEZTRi4KLQotV2VkIE9jdCAgOSAxNzoyNDo1OSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0YuCi0KLQkxOTk2LTA5LTEyICBSaWNoYXJkIFN0YWxsbWFuICA8cm1zQGV0aGFub2wuZ251LmFpLm1pdC5lZHU+Ci0gICAgICAgICogY29uZmlnLmd1ZXNzOiBVc2UgcGMgaW5zdGVhZCBvZiB1bmtub3duLCBmb3IgcGMgY2xvbmUgc3lzdGVtcy4KLSAgICAgICAgQ2hhbmdlIGxpbnV4IHRvIGxpbnV4LWdudS4KLQotCU1vbiBKdWwgMTUgMjM6NTE6MTEgMTk5NiAgS2FybCBIZXVlciAgPGt3emhAZ251LmFpLm1pdC5lZHU+Ci0gICAgICAgICogY29uZmlnLmd1ZXNzOiBBdm9pZCBub24tcG9ydGFibGUgdHIgc3ludGF4LgotCi1XZWQgT2N0ICA5IDA2OjA2OjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tayAoSE9MRVMpOiBBZGQgInhhcmdzIiBmb3IgZ2RiLgotCi0JKiBjb25maWd1cmU6IEF2b2lkIGhwdXgxMC4yMCBzZWQgYnVnLgotCi1UdWUgT2N0ICA4IDA4OjMyOjQ4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiBjb25maWcvbWgtd2luZG93czogIEFkZCBzdXBwb3J0IGZvciB3aW5kb3dzIGhvc3QKLQkodGhhdCBpcyBhIGJ1aWxkIGRvbmUgdW5kZXIgdGhlIE1pY3Jvc29mdCBidWlsZCBlbnZpcm9ubWVudCkuCi0KLVR1ZSBPY3QgIDggMTA6Mzk6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSBhbGwgdXNlcyBvZiBzcmNyb290IHdpdGggcywgdG8gc2hyaW5rCi0JY29tbWFuZCBsaW5lIGxlbmd0aHMuCi0KLQlQYXRjaGVzIGZyb20gR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbjogSWYgY29uZmlndXJpbmcgZm9yIG5ld2xpYiwgcGFzcyAtLXdpdGgtbmV3bGliIHRvCi0Jc3ViZGlyZWN0b3JpZXMuCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IElmIHdpbnN1cC9NYWtlZmlsZSBleGlzdHMsIHBhc3MgYQotCS1CbmV3bGliLyBhbmQgLUx3aW5zdXAgdG8gZ2NjLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICA3IDEwOjU5OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVUQ19TVVBQT1JUKTogQWRkIGNvbmZpZ3VyZS4KLQotRnJpIE9jdCAgNCAxMjoyMjo1OCAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgY29uZmlnL21oLWRndXgzODYgZm9yIGlbMzQ1XTg2LWRnLWRndXggCi0JaG9zdCBjb25maWd1cmF0aW9uIGZpbGUuCi0KLVRodSBPY3QgIDMgMDk6Mjg6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJyZWFrIG1uMTB4MDAgc3VwcG9ydCBpbnRvIHNlcGFyYXRlCi0JbW4xMDIwMCBhbmQgbW4xMDMwMCBjb25maWd1cmF0aW9ucy4KLQkqIGNvbmZpZy5zdWI6IExpa2V3aXNlLgotCi1XZWQgT2N0ICAyIDIyOjI3OjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgbG90cyBvZiBzdHVmZiB0byBub2NvbmZpZ2RpcnMgZm9yCi0JdGhlIG1uMTB4MDAgdGFyZ2V0cy4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgbW4xMHgwMCBzdXBwb3J0LgotCi1XZWQgT2N0ICAyIDE1OjUyOjM2IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlLWFsbC5jb206IENhbGwgY29uZi1hLWdhcywgbm90IGNvbmZpZy1hLWdhcy4KLQotVHVlIE9jdCAgMSAwMToyODo0MSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRG9uJ3QgYnVpbGQgbGliZ2xvc3MgZm9yIGFybS1jb2ZmCi0gCXRhcmdldHMuCi0KLU1vbiBTZXAgMzAgMTQ6MjQ6MDEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctUkVBRE1FOiBBZGQgbXVjaCBtb3JlIGRldGFpbCBmb3IgbmF0aXZlIFBvd2VyTWFjLgotCSogbXB3LWluc3RhbGw6IE5ldyBmaWxlLgotCSogbXB3LWNvbmZpZ3VyZTogQWRkIC0tbm9yZWN1cnNpb24gYW5kIC0taGVscCBvcHRpb25zLgotCSogbXB3LWNvbmZpZy5pbjogVHJhbnNsYXRlIHJlYWRtZSBhbmQgaW5zdGFsbCBmaWxlcyB3aGVuCi0JY29weWluZyB0byBvYmpkaXIuCi0JKiBtcHctYnVpbGQuaW46IERvbid0IGFsd2F5cyBkZXBlbmQgb24gYnlhY2MgYW5kIGZsZXguCi0JKGluc3RhbGwtb25seS10b3ApOiBOZXcgYWN0aW9uLgotCi1GcmkgU2VwIDI3IDE3OjM5OjQ0IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFlvdSBjYW4gbm93IGNvbmZpZ3VyZSBHREIgZm9yIHRoZSB2ODUwLgotCi1UdWUgU2VwIDI0IDE5OjA1OjEyIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBjb25maWd1cmUgYW55IEMrKyBkaXJzCi0JaWYgdGFyZ2V0aW5nIEQxMFYuCi0KLVR1ZSBTZXAgMTcgMTI6MTU6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgbWlwczY0dnI1MDAwLgotCi1Nb24gU2VwIDE2IDE3OjAwOjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgYSBzaW5nbGUgbGluZSBmb3IgaG9zdF90b29scyBhbmQgbmF0aXZlX29ubHkuCi0KLU1vbiBTZXAgIDkgMTI6MjE6MzAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluOiBBZGQgZW50cmllcyBmb3IgbTMyci4KLQotVGh1IFNlcCAgNSAxMzo1Mjo0NyAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5ldC1pbnN0YWxsKTogRG9uJ3QgcnVuIGluc3RhbGwtZ3ppcC4KLQotV2VkIFNlcCAgNCAxNzoyNjoxMyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBEb24ndCBjb25maWcgbG90cyBvZiB0aGluZ3MgZm9yICotKi13aW5kb3dzKi4KLQotU2F0IEF1ZyAzMSAxMTo0NTo1NyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFRlc3QgZm9yIG1wdy10cnVlLCB0cnVlLCBhbmQgbnVsbC1jb21tYW5kIHNjcmlwdHMuCi0JKGhvc3RfbGlicywgaG9zdF90b29scyk6IENvcHkgZnJvbSBjb25maWd1cmUuaW4uCi0JKiBtcHctY29uZmlndXJlOiBEb24ndCBjb21wbGFpbiBhYm91dCBkaXJlY3RvcmllcyBub3QgZm91bmQuCi0KLVRodSBBdWcgMjkgMTY6NDQ6NTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2KTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCShpWzM0NTZdODYtKi1kZ3V4Kik6IFVzZSBjb25maWcvbWgtc3lzdiBmb3IgdGhlIGhvc3QgY29uZmlndXJhdGlvbgotCWZpbGUuCi0KLQkqIGNvbmZpZy5ndWVzcyAoaVszNDVdODYpOiBEaXR0by4KLQotTW9uIEF1ZyAyNiAxODozNDo0MiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBSZW1vdmVkIGdkYiBmb3IgRDEwVi4KLQotVGh1IEF1ZyAyMiAxNzoxMzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGxkLCB0YXJnZXQtbGliaW8sIHRhcmdldC1saWJnKyssIGFuZAotCXRhcmdldC1saWJzdGRjKysgZnJvbSBub2NvbmZpZ2RpcnMuCi0KLVdlZCBBdWcgMjEgMTg6NTY6MzggMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRml4IHRocmVlIGxvY2F0aW9ucyB3aGVyZSBzaGVsbCBzY3JpcHRzIHdlcmUKLQliZWluZyBydW4gZGlyZWN0bHkgcmF0aGVyIHRoYW4gd2l0aCBjb25maWdfc2hlbGwuCi0KLVR1ZSBBdWcgMjAgMTM6MDg6NDcgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodjg1MC0qLSopOiBTZXQgdXAgaW5pdGlhbCAkbm9jb25maWdkaXJzLgotCSogY29uZmlnLnN1YiAoYmFzaWNfbWFjaGluZSk6IFJlY29nbml6ZSB2ODUwLgotCi1UaHUgQXVnIDE1IDEyOjE5OjMzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSGFuZGxlIG11bHRpcGxlIGVuYWJsZS9kaXNhYmxlIG9wdGlvbnMgYW5kCi0JcGFzcyB0aGVtIGRvd24gcmVjdXJzaXZlbHksIGhhbmRsZSAtYyBhbmQgLXMgZmxhZ3MgYXBwcm9wcmlhdGVseQotCWRlcGVuZGluZyBvbiBjaG9pY2Ugb2YgY29tcGlsZXIsIGFkZCBlc2NhcGUgbWVjaGFuaXNtIGZvcgotCXF1b3RlZCBhcmd1bWVudHMgdG8gZ0MuCi0KLU1vbiBBdWcgMTIgMTM6MTU6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBvd2VycGMqLSotKik6IEZvciBlYWJpLCBzeXN0ZW0gVi40LCBMaW51eCwgYW5kCi0Jc29sYXJpcyB0YXJnZXRzLCB1c2UgY29uZmlnL210LXBwYyB0byBzZXQgQ3ssWFh9RkxBR1NfRk9SX1RBUkdFVFMKLQlzbyB0aGF0IC1tcmVsb2NhdGFibGUtbGliIGFuZCAtbW5vLWVhYmkgYXJlIHVzZWQuCi0KLQkqIE1ha2VmaWxlLmluIChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOiBJZiB0YXJnZXQgY29tcGlsZXIgZG9lcwotCW5vdCBzdXBwb3J0IC0tcHJpbnQtbXVsdGktbGliLCBkb24ndCBhYm9ydC4KLQotU3VuIEF1ZyAxMSAyMDo1MTo1MCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtY3lnd2luMzIgKENGTEFHUyk6ICBEZWZpbmUgX1dJTjMyIHRvIGJlIGNvbXBhdGlibGUKLQl3aXRoIG5vcm1hbCBXaW5kb3dzIGNvbXBpbGF0aW9uIGVudmlyb25tZW50LgotCi1UaHUgQXVnICA4IDEyOjE4OjU5IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlLWFsbC5jb206IFJ1biBjb25maWctYS1nYXMuCi0JKiBzZXR1cC5jb206IERvbid0IGNvcHkgc3ViZGlyZWN0b3J5IGZpbGVzIGFyb3VuZC4KLQotVHVlIEp1bCAzMCAxNzo0OTozMSAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1vc2UpOiBSZW1vdmUgZXhjbHVzaW9uIG9mIGxpYmdsb3NzIGZvciB0aGlzCi0JdGFyZ2V0LCBpdCBub3cgY29tcGlsZXMgY29ycmVjdGx5LgotCi1TYXQgSnVsIDI3IDE1OjEwOjQzIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogR2VuZXJhdGUgTWFjIGluY2x1ZGUgZm9yIGVsZi9kd2FyZjIuaC4KLQotVHVlIEp1bCAyMyAxMDo0NzowNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IFJlbW92ZSBsZCBmcm9tICRub2NvbmZpZ2RpcnMuIAotCi1Nb24gSnVsIDIyIDEzOjI4OjUxIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChuYXRpdmVfb25seSk6IEFkZCBwcm1zLgotCi1Nb24gSnVsIDIyIDEyOjI3OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEdBU19TVVBQT1JUX0RJUlMpOiBBZGQgbWFrZS1hbGwuY29tIGFuZCBzZXR1cC5jb20uCi0JKEJJTlVUSUxTX1NVUFBPUlRfRElSUyk6IExpa2V3aXNlLgotCi1UaHUgSnVsIDE4IDEyOjU1OjQwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IERvbid0IGNvbmZpZ3VyZSBsZCBvciBnZGIgdW50aWwgdGhlCi0JZDEwdiBzdXBwb3J0IGlzIGFkZGVkLgotCi1XZWQgSnVsIDE3IDE0OjMzOjA5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGQxMHYtKi0qKTogTmV3IHRhcmdldC4KLQotTW9uIEp1bCAxNSAxMTo1MzowMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoSFAgOTAwMC84MTEpOiBSZWNvZ25pemUgdGhpcyBhcyBhIFBBMS4xCi0JbWFjaGluZS4KLQotRnJpIEp1bCAxMiAyMzoyMToxNyAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvLXRhci1neik6IE5ldyB0YXJnZXQsIHNwbGl0IG91dCBmcm9tIHRhaWwgZW5kIG9mCi0JdGF6IHRhcmdldC4gIFJ1biBlYWNoIGNvbW1hbmQgc2VwYXJhdGVseSwgZG9uJ3QgdXNlIHBpcGVzLgotCSh0YXopOiBVc2UgaXQuCi0KLUZyaSBKdWwgMTIgMTI6MDg6MDQgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlOiBMb29rIGZvciBnLW1wdy1tYWtlLnNlZCBpbiBjb25maWcvbXB3LgotCSogbXB3LWJ1aWxkLmluOiBObyBidWlsZHMgc2hvdWxkIGRlcGVuZCBvbiBidWlsZGluZyBieWFjYyBvciBmbGV4LAotCXRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgaW5zdGFsbGVkIGFscmVhZHkuCi0KLUZyaSBKdWwgMTIgMDk6NTI6NTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogU2V0IHIgZW52aXJvbm1lbnQKLQl2YXJpYWJsZSB0aGF0IENDX0ZPUl9UQVJHRVQgbmVlZHMuCi0KLVRodSBKdWwgMTEgMTA6MDk6NDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogRGV0ZXJtaW5lIGlmIHRoZSBtdWx0bGliCi0Jb3B0aW9ucyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgc3ViZGlyZWN0b3J5IHdhcwotCWNvbmZpZ3VyZWQsIGFuZCBpZiBpdCBoYXMsIHJlY29uZmlndXJlLgotCShDTEVBTl9UQVJHRVRfTU9EVUxFUyk6IERlbGV0ZSBtdWx0aWxpYi5vdXQgYW5kIHRtcG11bHRpLm91dCwgd2hpY2gKLQlDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMgdXNlcyB0byByZW1lbWJlciB0aGUgb2xkIG11bHRpbGliIG9wdGlvbnMuCi0KLVdlZCBKdWwgMTAgMTg6NTY6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTLENST1NTX0NIRUNLX01PRFVMRVMsSU5TVEFMTF9NT0RVTEVTLAotCUNMRUFOX01PRFVMRVMpOiBBZGQgYmFzaC4KLQkoYWxsLWJhc2gpOiBOZXcgdGFyZ2V0LgotCi1Nb24gSnVsICA4IDE3OjMzOjE0IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLXNnaS1pcml4NiopOiBVc2UgbWgtaXJpeDYgaW5zdGVhZCBvZiBtaC1pcml4NS4KLQotTW9uIEp1bCAgMSAxMzozMTozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGJhc2ljX21hY2hpbmUpOiBSZWNvZ25pemUgZDEwdiBhcyBhIHZhbGlkIHByb2Nlc3Nvci4KLQotRnJpIEp1biAyOCAxMjoxNDozNSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciAtLWJpbmRpci4KLQkqIG1wdy1idWlsZC5pbjogVXNlIGEgR0NDLXNwZWNpZmljIGJ1aWxkIHNjcmlwdCBmb3IgR0NDIGFjdGlvbnMuCi0KLVdlZCBKdW4gMjYgMTc6MjA6MTIgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgYmFzaCwgdGltZSwgZ2F3ayB0byBsaXN0IG9mIGhvc3R0b29scyBhbmQgdGhpbmdzCi0JdG8gb25seSBidWlsZCBmb3IgbmF0aXZlIHRvb2xjaGFpbnMKLQotVHVlIEp1biAyNSAyMzowOTowMyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZG9jZGlyKTogUmVtb3ZlLgotCi1UdWUgSnVuIDI1IDE5OjAwOjA4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogU2V0IHRvICQocHJlZml4KS9zaGFyZS4KLQotTW9uIEp1biAyNCAyMzoyNjowNyAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGJ1aWxkIGRpZmYgYW5kIHBhdGNoIGZvciBjeWd3aW4zMi1ob3N0ZWQKLQl0b29sY2hhaW5zLgotCi1Nb24gSnVuIDI0IDE1OjAxOjEyIDE5OTYgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG1lcmxpbi5nY3MucmVkc3RvbmUuYXJteS5taWw+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtcnRlbXMqLgotCi1TdW4gSnVuIDIzIDIyOjQxOjU0IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGVuYWJsZSBkb3NyZWwgZm9yIGN5Z3dpbjMyLWhvc3RlZCBidWlsZHMsCi0gICAgICAgICAgICAgICAgcmVtb3ZlIGRpZmYgZnJvbSB0aGUgbGlzdCBvZiB0aGluZ3Mgbm90IGJ1aWxkYWJsZQotICAgICAgICAgICAgICAgIHZpYSBDYW5hZGlhbiBDcm9zcwotCi1TYXQgSnVuIDIyIDExOjM5OjAxIDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdFVF9TVUJESVIpOiBNb3ZlIGNvbW1lbnQgdG8gcHJldmlvdXMgbGluZSBzbyB3ZQotIAlkb24ndCBnZXQgIi4gIi4KLQotRnJpIEp1biAyMSAxNzoyNDo0OCAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotc2dpLWlyaXg2Kik6IFNldCBub2NvbmZpZ2RpcnMgYXBwcm9wcmlhdGVseS4KLQotVGh1IEp1biAyMCAxNjo1Nzo0MCAxOTk2ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEhhbmRsZSBjYXNlIHdoZXJlIHRleDNwYXRjaCBkaWRuJ3QgZXZlbiBnZXQKLQljaGVja2VkIG91dC4gIEFsc28sIGlmIGl0IHdhcyBmb3VuZCwgcHV0IHRoZSBzeW1saW5rIGluIGEgbmV3IHV0aWwKLQlzdWJkaXJlY3RvcnkuCi0KLVRodSBKdW4gMjAgMTI6MjA6MzMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogQWRkIHN1cHBvcnQgZm9yIFBvd2VyUEMgTGludXguCi0KLVR1ZSBKdW4gMTggMTQ6MjQ6MTIgMTk5NiAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSAtb3BlbnZtcy4KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotKnZtcyopOiBTZXQgbm9jb25maWdkaXJzLgotCSogbWFrZS1hbGwuY29tLCBzZXR1cC5jb206IE5ldyBmaWxlcy4KLQotTW9uIEp1biAxNyAxNjozNDo0NiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiB0ZXgzcGF0Y2ggbW92ZWQgdG8gdGV4aW5mby91dGlsLgotCi1TYXQgSnVuIDE1IDE3OjEzOjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgbWFrZSBmcm9tIGRpc2FibGUtaWYtQ2FuLUNyb3NzIGxpc3QKLQkJZW5hYmxlIGdkYiBpZiAke2hvc3R9IGFuZCAke3RhcmdldH0gYXJlIGN5Z3dpbjMyCi0KLUZyaSBKdW4gIDcgMTg6MTY6NTIgMTk5NiAgSGFybGFuIFN0ZW5uIDxoYXJsYW5AcGZjcy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoaT84Ni1uY3Itc3lzdiopOiAgRW1pdCBtaW5vciByZWxlYXNlIG51bWJlcnMuCi0JUmVjb2duaXplIHRoZSBOQ1IgNDg1MCBtYWNoaW5lIGFuZCBOQ1IgUGVudGl1bS1iYXNlZCBwbGF0Zm9ybXMuCi0KLVdlZCBKdW4gIDUgMDA6MDk6MTcgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHdvbWJhdC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiAgQ29tYmluZSBtaXBzLW1pcHMtcmlzY29zIGNhc2VzLCBhbmQgdXNlIGNwcCB0bwotCWRpc3Rpbmd1aXNoIHN5c3Yvc3ZyNC9ic2QgdmFyaWFudHMuCi0JQmFzZWQgb24gYSBwYXRjaCBmcm9tIEhhcmxhbiBTdGVubiA8aGFybGFuQHBmY3MuY29tPi4KLQotRnJpIEp1biAgNyAxNDoyNDo0OSAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGNyZWNoZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIGNvcHlyaWdodCBub3RpY2UuCi0JKiBtb3ZlLWlmLWNoYW5nZTogQWRkZWQgY29weXJpZ2h0IG5vdGljZS4KLQotVGh1IEp1biAgNiAxNjoyNzowNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlLSotc29sYXJpcyopOiBVbnRpbCB3ZSBnZXQgc2hhcmVkCi0JbGlicmFyaWVzIHdvcmtpbmcsIGRvbid0IGJ1aWxkIGdkYiwgc2ltLCBtYWtlLCB0Y2wsIHRrLCBvcgotCWV4cGVjdC4KLQotVHVlIEp1biAgNCAyMDo0MTo0NSAxOTk2ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0Y6Ci0KLQlNb24gSnVuICAzIDA4OjQ5OjE0IDE5OTYgIEthcmwgSGV1ZXIgIDxrd3poQGdudS5haS5taXQuZWR1PgotCSogY29uZmlnLmd1ZXNzICgqOkxpbnV4Oio6Kik6IEFkZCBndWVzcyBmb3Igc3BhcmMtdW5rbm93bi1saW51eC4KLQotCUZyaSBNYXkgMjQgMTg6MzQ6NTMgMTk5NiAgUm9sYW5kIE1jR3JhdGggIDxyb2xhbmRAZGVsYXN5ZC5nbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy5ndWVzcyAoQVZpaU9OOmRndXg6KjoqKTogRml4IHR5cG8gaW4gcmVjb2duaXppbmcgbWM4ODExMC4KLQotCUZyaSBBcHIgMTIgMjA6MDM6NTkgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHNwaWZmLmdudS5haS5taXQuZWR1PgotCSogY29uZmlnLmd1ZXNzOiAgQ29tYmluZSB0d28gT1NGMSBydWxlcy4KLQlBbHNvIHJlY29nbml6ZSBmaWVsZCB0ZXN0IHZlcnNpb25zLiAgRnJvbSBtanJAemszLmRlYy5jb20uCi0JKiBjb25maWcuZ3Vlc3MgKGRndXgpOiAgVXNlIC91c3IvYmluL3VuYW1lIHJhdGhlciB0aGFuIHVuYW1lLAotCWJlY2F1c2UgR05VIHVuYW1lIGRvZXMgbm90IHN1cHBvcnQgLXAuICBGcm9tIHBtckBwYWphdG8uY29tLgotCi1UdWUgSnVuICA0IDExOjA3OjI1IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRURJUlMpOiBSZW1vdmVkICQodG9vbGRpcikuCi0KLVR1ZSBNYXkgMjggMTI6MzA6NTAgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctUkVBRE1FOiBEb2N1bWVudCBHQ0NJbmNsdWRlcy4KLQotU3VuIE1heSAyNiAxNToxNjoyNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLWxpbnV4Kik6IFNldCBlbmFibGVfc2hhcmVkIHRvIHllcy4KLQotVHVlIE1heSAyMSAxNTo0MTozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEhhbmRsZSAtLWVuYWJsZS1GT08gYW5kIC0tZGlzYWJsZS1GT08uCi0KLU1vbiBNYXkgMjAgMTA6MTI6MjkgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotY3lnd2luMzIpOiBDb25maWd1cmUgbWFrZS4KLQotVHVlIE1heSAgNyAxNDoxOTo0MiAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNudWZmbGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluZXQtaW5zdGFsbCk6IFF1b3RlIHZhbHVlIG9mIElOU1RBTExfTU9EVUxFUy4KLQotRnJpIE1heSAgMyAwODo1NzoxNyAxOTk2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGxpc2EuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC1wZXJsLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5ldC1pbnN0YWxsKTogTmV3IHRhcmdldC4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC10Y2wuCi0JKGFsbC1pbmV0KTogRGVwZW5kIG9uIGFsbC1zZW5kLXByLgotCi1UdWUgQXByIDMwIDEzOjU1OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjbGUtKi1zb2xhcmlzKik6IFR1cm4gb2ZmIHRrIGFuZCB0Y2wKLQl0ZW1wb3JhcmlseS4KLQotVGh1IEFwciAyNSAxMTo0ODoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgY29uZmlndXJlIC0td2l0aC1nbnUtbGQgb24gQUlYLgotCi1UaHUgQXByIDI1IDA2OjMzOjM2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlLSotc29sYXJpcyopOiBUdXJuIG9mZiBnZGIgdGVtcG9yYXJpbHkuCi0KLVR1ZSBBcHIgMjMgMDk6MDc6MzkgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogQWRkZWQgYWxsLWluZXQuCi0JKENST1NTX0NIRUNLX01PRFVMRVMpOiBBZGRlZCBjaGVjay1pbmV0LgotCShJTlNUQUxMX01PRFVMRVMpOiBBZGRlZCBpbnN0YWxsLWluZXQuCi0JKENMRUFOX01PRFVMRVMpOiBBZGRlZCBjbGVhbi1pbmV0LgotCShhbGwtaW5kZW50KTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogQWRkZWQgaW5ldC4KLQkobmF0aXZlX29ubHkpOiBBZGRlZCBpbmV0LgotCShub2NvbmZpZ2RpcnMpOiBBZGRlZCBpbmV0LgotCi1GcmkgQXByIDE5IDE1OjM1OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGliZ2xvc3MgaWYgd2UgYXJlIG5vdCBjb25maWd1cmluZwotCW5ld2xpYi4KLQotV2VkIEFwciAxNyAxOTozMDowMSAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNvbmZpZ3VyZSBsaWJnbG9zcyBmb3IgdW5zdXBwb3J0ZWQKLQlhcmNoaXRlY3R1cmVzLgotCi1UdWUgQXByIDE2IDExOjE3OjA1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENMRUFOX01PRFVMRVMpOiBBZGQgY2xlYW4tYXBhY2hlLgotCi1Nb24gQXByIDE1IDE1OjA5OjA1IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3JlY2hlLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTU9EVUxFUyk6IEluY2x1ZGUgYWxsLWFwYWNoZS4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stYXBhY2hlLgotCShJTlNUQUxMX01PRFVMRVMpOiBJbmNsdWRlIGluc3RhbGwtYXBhY2hlLgotCShhbGwtYXBhY2hlKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBhcGFjaGUgZXZlcnl3aGVyZSBwZXJsIGlzIHNlZW4uCi0KLU1vbiBBcHIgMTUgMTQ6NTk6MTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHN1cHBvcnQgZm9yIGNsZWFuLXttb2R1bGV9IGFuZAotCWNsZWFuLXRhcmdldC17bW9kdWxlfSBydWxlcy4KLQotV2VkIEFwciAxMCAyMTozNzo0MSBQRFQgMTk5NiAgTWFyaWx5biBFLiBTYW5kZXIgPG1zYW5kZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLSotb3NlKSBkbyBub3QgYnVpbGQgbGliZ2xvc3MuCi0KLU1vbiBBcHIgIDggMTY6MTY6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKHByZXAqOlN1bk9TOjUuKjoqKTogVHVybiBpbnRvCi0JcG93ZXJwZWxlLXVua25vd24tc29sYXJpczIuCi0KLU1vbiBBcHIgIDggMTQ6NDU6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQotRnJpIEFwciAgNSAwODoxNzo1NyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1zb2xhcmlzKTogUGFzcyBvbmx5IHRoZSBmaXJzdCB3b3JkIG9mICRDQwotCXRvIC91c3IvYmluL3doaWNoIHdoZW4gY2hlY2tpbmcgaWYgd2UncmUgdXNpbmcgL3Vzci9jY3MvYmluL2NjLgotCi1GcmkgQXByICA1IDAzOjE2OjEzIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQkFTRV9GTEFHU19UT19QQVNTKTogcGFzcyBkb3duICQoTUFLRSkuCi0KLVRodSBNYXIgMjggMTQ6MTE6MTEgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjcmVjaGUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NT0RVTEVTKTogSW5jbHVkZSBhbGwtcGVybC4KLQkoQ1JPU1NfQ0hFQ0tfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stcGVybC4KLQkoSU5TVEFMTF9NT0RVTEVTKTogSW5jbHVkZSBpbnN0YWxsLXBlcmwuCi0JKEFMTF9YMTFfTU9EVUxFUyk6IEluY2x1ZGUgYWxsLWd1aWxlLgotCShDSEVDS19YMTFfTU9EVUxFUyk6IEluY2x1ZGUgY2hlY2stZ3VpbGUuCi0JKElOU1RBTExfWDExX01PRFVMRVMpOiBJbmNsdWRlIGluc3RhbGwtZ3VpbGUuCi0JKGFsbC1wZXJsKTogTmV3IHRhcmdldC4KLQkoYWxsLWd1aWxlKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChob3N0X3Rvb2xzKTogSW5jbHVkZSBwZXJsIGFuZCBndWlsZS4KLQkobmF0aXZlX29ubHkpOiBJbmNsdWRlIHBlcmwgYW5kIGd1aWxlLgotCShub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBndWlsZSBhbmQgcGVybDsgbm8gcG9ydHMgaGF2ZSBiZWVuCi0JZG9uZS4KLQotVHVlIE1hciAyNiAyMToxODo1MCAxOTk2ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGtyZW12YXguaGlnaGxhbmQuY29tLmF1PgotCi0gICAgICAgICogY29uZmlndXJlICgtLWVuYWJsZS0qKTogSGFuZGxlIHF1b3RlZCBvcHRpb24gbGlzdHMgc3VjaCBhcwotICAgICAgICAtLWVuYWJsZS1zaW0tY2ZsYWdzPSctZzAgLU8nIGJldHRlci4KLQotVGh1IE1hciAyMSAxMTo1MzowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh7LGluc3R9YWxsLXRhcmdldCk6IE5ldyBydWxlIHNvIHdlIGNhbiBtYWtlIGFuZAotCWluc3RhbGwgYWxsIG9mIHRoZSB0YXJnZXQgZGlyZWN0b3JpZXMgZWFzaWx5LgotCi1XZWQgTWFyIDIwIDE4OjEwOjU3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtaXNzaW5nIGdsb2JhbCBmbGFnIGluIHNlZCBzdWJzdGl0dXRpb24gd2hlbgotCWRlbGV0aW5nIGB0YXJnZXQtJyBmcm9tICR7Y29uZmlnZGlyc30uCi0KLVRodSBNYXIgMTQgMTk6MTU6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRE9fWCk6IERvbid0IGdldCBjb25mdXNlZCBpZiBDQyBjb250YWlucyBgPScgaW4gYW4KLQlvcHRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcyotbmVjLXN5c3ZyNCopOiBVc2UgYSBob3N0X21ha2VmaWxlX2ZyYWcgb2YKLQljb25maWcvbWgtbmVjdjQuCi0KLQkqIGluc3RhbGwuc2g6IENvcnJlY3QgbWlzc3BlbGxpbmcgb2YgdHJhbnNmb3JtYmFzZW5hbWUuCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG1pcHMtKi1zeXN2Ki4KLQotTW9uIE1hciAxMSAxNTozNjo0MiAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBtb245NjAuCi0KLVN1biBNYXIgMTAgMTM6MTg6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlc3RvcmUgQ2FuYWRpYW4gQ3Jvc3MgaGFuZGxpbmcgb2YgQklTT04gYW5kIExFWCwKLQlyZW1vdmVkIGluIEZlYiAyMCBjaGFuZ2UuCi0KLUZyaSBNYXIgIDggMjA6MDc6MDkgMTk5NiAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogIFN1Z2dlc3Rpb25zIGZyb20gVG9yYmpvcm4gR3Jhbmx1bmQgPHRlZ2VAbWF0ZW1hdGlrLnN1LnNlPjoKLQlNZW50aW9uIG1ha2UgaW5zdGFsbC4gIFJlbW92ZSB0aGUgb2xkIGNvcHlyaWdodCBkYXRlIGFzIHdlbGwgdGhlCi0JY2x1bXN5IGFuZCByYXRoZXIgcG9pbnRsZXNzIGNvcHlyaWdodCBvbiB0aGUgUkVBRE1FIGZpbGUuCi0KLUZyaSBNYXIgIDggMTc6NTE6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogSWYgdGhlcmUgaXMgYQotCU1ha2VmaWxlIGFmdGVyIHJ1bm5pbmcgc3ltbGluay10cmVlLCB0aGVuIHJ1biBgbWFrZSBkaXN0Y2xlYW4nIHRvCi0JYXZvaWQgY2xvYmJlcmluZyBhbnkgZ2VuZXJhdGVkIGZpbGVzIGluIHNyY2Rpci4KLQotVHVlIE1hciAgNSAwODoyMTo0NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLW5ldGJzZCopOiBCdWlsZCBldmVyeXRoaW5nIG5vdy4KLQotV2VkIEZlYiAyOCAxMjoyNTo0NiAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBGaXggcXVvdGluZy4KLQotVHVlIEZlYiAyNyAxMTozMzo1NyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyY2xldC0qLSopOiBCdWlsZCBldmVyeXRoaW5nIG5vdy4KLQotVHVlIEZlYiAyNyAxNDozMTo1MSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmluIChtNjhrLSotbGludXgqKTogTmV3IGhvc3QuCi0KLU1vbiBGZWIgMjYgMTQ6MzI6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IENoZWNrIGZvciBiaXNvbiBiZWZvcmUgYnlhY2MuCi0KLVR1ZSBGZWIgMjAgMjM6MTI6MzUgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gY29uZmlndXJlOiAgQ2hhbmdlIHRoZSB3YXkgTEVYIGFuZCBCSVNPTi9ZQUNDIGFyZQotCXNldC4gIGNvbmZpZ3VyZSBub3cgZGVmaW5lcyBERUZBVUxUX0xFWCBhbmQgREVGQVVMVF9ZQUNDIGJ5Ci0Jc2VhcmNoaW5nIFBBVEguICBUaGVzZSBhcmUgdXNlZCBhcyBmYWxsYmFja3MgYnkgTWFrZWZpbGUuaW4gaWYKLQlmbGV4L2Jpc29uL2J5YWNjIGFyZW4ndCBpbiBvYmpkaXIuCi0KLU1vbiBGZWIgMTkgMTE6NDU6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSBldmVyeXRoaW5nIHdoaWNoIGRlcGVuZHMgdXBvbiBhbGwtYmZkIGFsc28KLQlkZXBlbmQgdXBvbiBhbGwtb3Bjb2RlcywgaW4gY2FzZSAtLXdpdGgtY29tbW9uYmZkbGliIGlzIHVzZWQuCi0KLVRodSBGZWIgMTUgMTk6NTA6NTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgKi0qLWN5Z3dpbjMyKTogRG9uJ3QgYnVpbGQgZ2RiIGlmIHdlIGFyZQotCWJ1aWxkaW5nIE5UIG5hdGl2ZSBjb21waWxlcnMgb24gVW5peC4KLQotVGh1IEZlYiAxNSAxNzo0MjoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgZ2V0IENDIGZyb20gdGhlIGhvc3QgTWFrZWZpbGUgZnJhZ21lbnQgaWYgd2UKLQljYW4gZmluZCBnY2MgaW4gUEFUSCwgb3IgaWYgdGhpcyBpcyBhIENhbmFkaWFuIENyb3NzLiAgTW92ZSB0aGUKLQlTb2xhcmlzIHRlc3QgZm9yIC91c3IvdWNiL2NjIHRvIHRoZSBwb3N0IHRhcmdldCBzY3JpcHQsIGp1c3QgYWZ0ZXIKLQl0aGUgY29tcGlsZXIgc2FuaXR5IHRlc3QuCi0KLVdlZCBGZWIgMTQgMTY6NTc6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBNZXJnZSB3aXRoIEZTRi4KLQotVHVlIEZlYiAxMyAxNDoyNzo0OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSUEFUSF9FTlZWQVIpOiBOZXcgdmFyaWFibGUuCi0JKFJFQUxMWV9TRVRfTElCX1BBVEgpOiBVc2UgaXQuCi0JKiBjb25maWd1cmUuaW46IE9uIEhQL1VYLCBzZXQgUlBBVEhfRU5WVkFSIHRvIFNITElCX1BBVEguCi0KLU1vbiBGZWIgMTIgMTU6Mjg6NDkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIHNwYXJjbGV0IGNwdS4KLQotTW9uIEZlYiAxMiAxNTozMzo1OSAxOTk2ICBDaHJpc3RpYW4gQmF1ZXJuZmVpbmQgPGNocmlzYmZkQHRoZW9yaWUzLnBoeXNpay51bmktZXJsYW5nZW4uZGU+Ci0KLQkqIGNvbmZpZy5ndWVzczogIFN1cHBvcnQgbTY4ay1jYm0tc3lzdjQuCi0KLVNhdCBGZWIgMTAgMTI6MDY6NDIgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBHdWVzcyBtNjhrLXVua25vd24tbGludXggYW5kCi0JbTY4ay11bmtub3duLWxpbnV4YW91dCBmcm9tIGxpbmtlciBoZWxwIHN0cmluZy4gIFB1dCBxdW90ZXMgYXJvdW5kCi0JJGxkX2hlbHBfc3RyaW5nLgotCi1UaHUgRGVjICA3IDA5OjAzOjI0IDE5OTUgIFRvbSBIb3JzbGV5ICA8VG9tLkhvcnNsZXlAbWFpbC5oY3NjLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgpOiBBZGQgZ3Vlc3MgZm9yIHBvcnQKLQl0byBuZXcgdGFyZ2V0LgotCi1UaHUgRmViICA4IDE1OjM3OjUyIDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzIChVTkFNRV9WRVJTSU9OKTogUmVjb2duaXplIFg0LnggYXMgYW4gT1NGIHZlcnNpb24uCi0KLU1vbiBGZWIgIDUgMTY6MzY6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIC0tZW5hYmxlLXNoYXJlZCB3YXMgdXNlZCwgc2V0IFNFVF9MSUJfUEFUSCB0bwotCSQoUkVBTExZX1NFVF9MSUJfUEFUSCkgaW4gTWFrZWZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoU0VUX0xJQl9QQVRIKTogTmV3IHZhcmlhYmxlLgotCShSRUFMTFlfU0VUX0xJQl9QQVRIKTogTmV3IHZhcmlhYmxlLgotCSgkKERPX1gpKTogVXNlICQoU0VUX0xJQl9QQVRIKS4KLQkoaW5zdGFsbC5hbGwsIGdjYy1uby1maXhlZGluY2x1ZGVzLCAkKEFMTF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKE5BVElWRV9DSEVDS19NT0RVTEVTKSwgJChDUk9TU19DSEVDS19NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKElOU1RBTExfTU9EVUxFUyksICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKEFMTF9UQVJHRVRfTU9EVUxFUyksICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpKTogTGlrZXdpc2UuCi0JKCQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyksICQoQUxMX1gxMV9NT0RVTEVTKSk6IExpa2V3aXNlLgotCSgkKENIRUNLX1gxMV9NT0RVTEVTKSwgJChJTlNUQUxMX1gxMV9NT0RVTEVTKSk6IExpa2V3aXNlLgotCShhbGwtZ2NjLCBhbGwtYm9vdHN0cmFwLCBjaGVjay1nY2MsIGluc3RhbGwtZ2NjKTogTGlrZXdpc2UuCi0JKGluc3RhbGwtZG9zcmVsKTogTGlrZXdpc2UuCi0JKGFsbC1vcGNvZGVzKTogRGVwZW5kIHVwb24gYWxsLWxpYmliZXJ0eS4KLQotU3VuIEZlYiAgNCAxNjo1MToxMSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKCo6Q1lHV0lOKik6IE5ldwotCi1TYXQgRmViICAzIDEwOjQyOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC10YXJnZXQtd2luc3VwKTogQWxsIGFsbC10YXJnZXQtbGliaWJlcnR5LgotCi1GcmkgRmViICAyIDE3OjU4OjU2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBBZGQgbWlzc2luZyAjIGluIGZyb250IG9mIGNvbW1lbnQuCi0KLVRodSBGZWIgIDEgMTQ6Mzg6MTMgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBhZGQgc2Vjb25kIHBhc3MgdG8gdGhpbmdzIGFkZGVkIHRvIG5vY29uZmlnZGlycwotCXNvICotZ20tbWFnaWMgY2FuIGV4Y2x1ZGUgbGliZ2xvc3MgcHJvcGVybHkuCi0KLVRodSBGZWIgIDEgMTE6MTA6MTYgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlndXJlIChleHRyYWxpYnNfbmFtZSwgcmV6X25hbWUpOiBTZXQgY29ycmVjdGx5Ci0JZm9yIE1XQzY4SyBjb21waWxlci4KLQotCSogbXB3LVJFQURNRTogQWRkIG1vcmUgaW5mbyBvbiB0aGUgbmVjZXNzYXJ5IGJ1aWxkIHRvb2xzLgotCi1UaHUgRmViICAxIDEwOjIyOjM4IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLnN1YjogUmVjb2duaXplIGN5Z3dpbjMyLgotCi1XZWQgSmFuIDMxIDE0OjE3OjEwIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBBL1VYLgotCi1XZWQgSmFuIDMxIDEzOjUyOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2Ugd2l0aCBnY2MvY29uZmlnLnN1Yi4KLQotVGh1IEphbiAyNSAxMTowMToxMCAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHctYnVpbGQuaW4gKGRvLWJpbnV0aWxzKTogQWRkIGJ1aWxkIG9mIHN0YW1wcy4KLQotVGh1IEphbiAyNSAxNzowNToyNiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy5zdWI6IEFkZCByZWNvZ25pdGlvbiBmb3IgbWlwczY0dnI0MTAwKi0qIHRhcmdldHMuCi0KLVdlZCBKYW4gMjQgMTI6NDc6NTUgMTk5NiAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBBZGQgY2hlY2tpbmcgb2YgYGhwdXg5JyByYXRoZXIgdGhhbiBqdXN0IGBocHV4Jy4KLQlBZGQgY3JlYXRpb24gb2YgZ2NvbmZpZ2FyZ3Mgd2l0aCBgLS1lbmFibGUtc2hhcmVkJyB0dXJuZWQgb24uCi0JKCQoaG9zdCktc3RhbXAtc3RhZ2UyLWNvbmZpZ3VyZWQpOiBQYXNzICQoZ2NvbmZpZ2FyZ3MpLgotCSgkKGhvc3QpLXN0YW1wLXN0YWdlMy1jb25maWd1cmVkKTogTGlrZXdpc2UuCi0JKEhPTEVTKTogQWRkIGNoYXRyIGFuZCBsZGQuCi0JKGkzODYtbmNyLXN5c3Y0LjMqKTogQWRkIHVzZSBvZiAvdXNyL2Njcy9iaW4gaW4gdGhlIFBBVEggYW5kIEhPTEVfRElSUy4KLQotV2VkIEphbiAyNCAyMDozMjozMCAxOTk2ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAbm9pc3kubWF0ZW1hdGlrLnN1LnNlPgotCi0JKiBjb25maWd1cmU6IFBhc3MgLS1uZnAgdG8gcmVjdXJzaXZlIGNvbmZpZ3VyZXMuCi0KLU1vbiBKYW4gMjIgMTA6NDE6NTYgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERMTFRPT0wpOiBOZXcuCi0JKERMTFRPT0xfRk9SX1RBUkdFVCk6IE5ldy4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFBhc3MgZG93biBETExUT09MLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQkoRVhUUkFfR0NDX0ZMQUdTKTogRGl0dG8uCi0JKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IERpdHRvLgotCShET19YKTogRGl0dG8uCi0JKiBjb25maWd1cmU6IEFkZCBETExUT09MLgotCi1GcmkgSmFuIDE5IDEzOjMwOjE1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCVNDTyBPcGVuU2VydmVyIDUgY2hhbmdlcyBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1zY28zLjJ2NSopOiBVc2UgbWgtc3lzdiBpbnN0ZWFkIG9mCi0JbWgtc2NvLCBzaW5jZSBvbGQgd29ya2Fyb3VuZHMgbm8gbG9uZ2VyIG5lZWRlZCwgYW5kIGRvbid0Ci0JYnVpbGQgbGQsIHNpbmNlIGxpYnJhcmllcyBoYXZlIHdlYWsgc3ltYm9scyBpbiBDT0ZGLgotCi1TdW4gSmFuIDE0IDIzOjAxOjMxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogQWRkIG1pc3NpbmcgJzsnLgotCi1GcmkgSmFuIDEyIDE1OjI1OjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIHN1cmUgdGhhdCAke0NDfSBjYW4gYmUgdXNlZCB0byBjb21waWxlIGFuCi0JZXhlY3V0YWJsZS4KLQotV2VkIEphbiAgMyAxNzo1NDo0MSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobmV3bGliLnRhci5neik6IERlbGV0ZSBidWlsZGluZyBvZiBuZXdsaWIncyBpbmZvIGZpbGVzLgotCi1Nb24gSmFuICAxIDE5OjA5OjE0IDE5OTYgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IFB1dCBsZCBvciBnYXMgaW4gdGhpcyBlYXJseSwgaWYgdGhlCi0JdXNlciBzcGVjaWZpY2FsbHkgdXNlZCAtLXdpdGgtZ251LWxkPW5vIG9yIC0td2l0aC1nbnUtYXM9bm8uCi0KLVNhdCBEZWMgMzAgMTY6MDg6NTcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBBZGQgc3VwcG9ydCBmb3IKLQktLWRpc2FibGUte3NvZnRmbG9hdCxtNjg4ODEsbTY4MDAwLG02ODAyMH0gb24gbTY4Ki0qLSouCi0JU2ltcGxpZnkgc2V0dGluZyBvZiBtdWx0aWRpcnMgZnJvbSAtLWRpc2FibGUtZm9vLgotCi1GcmkgRGVjIDI5IDA3OjU2OjExIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEVYVFJBX0dDQ19GTEFHUyk6IElmIGFueSBvZiB0aGUgbWFrZSB2YXJpYWJsZXMKLQlMQU5HVUFHRVMsIEJPT1RfQ0ZMQUdTLCBTVE1QX0ZJWFBST1RPLCBMSU1JVFNfSF9URVNULAotCUxJQkdDQzFfVEVTVCwgTElCR0NDMl9DRkxBR1MsIExJQkdDQzJfSU5DTFVERVMsIGFuZCBFTlFVSVJFIGFyZQotCW5vbi1lbXB0eSwgcGFzcyB0aGVtIG9uIHRvIHRoZSAJR0NDIG1ha2UuCi0JKGFsbC1ib290c3RyYXApOiBOZXcgcnVsZSB0aGF0IGlzIGxpa2UgYWxsLWdjYywgZXhjZXB0IGl0IGV4ZWN1dGVzCi0JdGhlIEdDQyBib290c3RyYXAgcnVsZSBpbnN0ZWFkIG9mIHRoZSBHQ0MgYWxsIHJ1bGUuCi0KLVdlZCBEZWMgMjcgMTU6NTE6NDggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluIChtbF9yZWFsc3JjZGlyKTogTmV3LCB0byBhY2NvdW50IGZvciAke3N1YmRpcn0uCi0KLVR1ZSBEZWMgMjYgMTE6NDU6MzEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3MgKEFWaWlPTjpkZ3V4Oio6Kik6IFVwZGF0ZSBmcm9tIEZTRiB0byBhZGQgcGVudGl1bQotCURHL1VYIHN1cHBvcnQuCi0KLUZyaSBEZWMgMTUgMTA6MDE6MjcgMTk5NSAgU3RhbiBDb3ggIDxjb3hzQGRnLXJ0cC5kZy5jb20+Ci0KLQkqIGNvbmZpZy5zdWIgKGkqODYqKSBDaGFuZ2UgWzM0NV0gdG8gWzM0NTZdCi0KLVdlZCBEZWMgMjAgMTc6NDE6NDAgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEFkZCBnYXMgb3IgbGQgaWYgLS13aXRoLWdudS1hcz1ubyBvcgotCS0td2l0aC1nbnUtbGQ9bm8uCi0KLVdlZCBEZWMgMjAgMTU6MTU6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW4gKHJzNjAwMCosIHBvd2VycGMqKTogQWRkIHN3aXRjaGVzIHRvIGNvbnRyb2wgd2hpY2gKLQlBSVggbXVsdGlsaWJzIGdldCBidWlsdC4KLQotTW9uIERlYyAxOCAxNzo1NTo0NiAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LXdpbjMyKTogRG9uJ3QgYnVpbGQgZXhwZWN0IGlmIHdlJ3JlIG5vdAotCWJ1aWxkaW5nIHRoZSB0Y2wgc3ViZGlyLgotCi1Nb24gRGVjIDE4IDExOjQ3OjE5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IChjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzLCBhbGwtdGFyZ2V0LWV4YW1wbGVzKToKLQlOZXcgdGFyZ2V0cywgY29uZmlndXJlIGFuZCBidWlsZCBleGFtcGxlIHByb2dyYW1zLgotCi1GcmkgRGVjIDE1IDE2OjEzOjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogSWYgYW4gbXB3LWNvbmZpZy5pbiBnZW5lcmF0ZWQgYSBmaWxlIG1rLnNlZCwKLQl1c2UgaXQgYXMgaW5wdXQgdG8gc2VkaXQgdGhlIGdlbmVyYXRlZCBNUFcgbWFrZWZpbGUuCi0JKiBtcHctUkVBRE1FOiBBZGQgYSBzdWdnZXN0aW9uIGFib3V0IEdlc3RhbHQuaC4KLQotV2VkIERlYyAxMyAxNjo0Mzo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAqLSotaWVlZSouCi0KLVR1ZSBEZWMgMTIgMTE6NTI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG9jYWwtZGlzdGNsZWFuKTogUmVtb3ZlICQoVEFSR0VUX1NVQkRJUikuICBGcm9tCi0JUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotTW9uIERlYyAxMSAxNTozMTo1OCAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0PT1wb3dlcnBjLXBlKTogQWRkIG1hbnkgZGlyZWN0b3JpZXMgdG8gbm9jb25maWdkaXJzCi0JZm9yIHBvd2VycGMtcGUgbmF0aXZlLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgdGNsLCBtYWtlIHRvIG5vY29uZmlnZGlycyBpZiBjYW5hZGlhbiBjcm9zcy4KLQkodGFyZ2V0PT1wb3dlcnBjLXBlKTogZHVwbGljYXRlIGkzODYtd2luMzIgZW50cnkuCi0KLVNhdCBEZWMgIDkgMTQ6NTg6MjggMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IEV4Y2x1ZGUgdGFyZ2V0LW5ld2xpYiBmb3IgYWxsIHZlcnNpb25zCi0Jb2Ygdnh3b3Jrcywgbm90IGp1c3Qgdnh3b3JrczUuMS4KLQotTW9uIERlYyAgNCAxMjowNTo0MCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciBleGVjLXByZWZpeC4KLQotTW9uIERlYyAgNCAxMDoyMjo1MCAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSFAgbW9kZWwgODE2IG1hY2hpbmVzIGFzIGhhdmluZwotCWEgUEExLjEgcHJvY2Vzc29yLgotCi1Nb24gRGVjICA0IDEyOjM4OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZ25vcmUgbmV3IGF1dG9jb25mIGNvbmZpZ3VyZSBvcHRpb25zLgotCi1UaHUgTm92IDMwIDE0OjQ1OjI1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL210LXY4MTAgKENDX0ZPUl9UQVJHRVQpOiBBZGQgLWFuc2kgZmxhZy4gIE5FQyBjb21waWxlcgotIAlkZWZhdWx0cyB0byBLJlIgbW9kZSwgYnV0IGRvZXNuJ3QgaGF2ZSB2YXJhcmdzLmgsIHNvIHdlIGhhdmUgdG8gCi0JY29tcGlsZSBpbiBBTlNJIG1vZGUuCi0KLVRodSBOb3YgMzAgMTY6NTc6MzMgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQHdvbWJhdC5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIFBlbnRpdW0gdW5kZXIgU0NPLgotCUZyb20gUm9iZXJ0IExpcGUgPHJvYmVydGxAYXJuZXQuY29tPi4KLQotV2VkIE5vdiAyOSAxMzo0OTowOCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSB0YXJnZXQtbGliaW8gb24gdjgxMC0qLSouCi0JKiBjb25maWcvbXQtdjgxMCAoQ0NfRk9SX1RBUkdFVCwgQVNfRk9SX1RBUkdFVCwgQVJfRk9SX1RBUkdFVCwKLQlSQU5MSUJfRk9SX1RBUkdFVCk6IFNldCBhcyBhcHByb3ByaWF0ZSBmb3IgTkVDIHY4MTAgdG9vbGNoYWluLgotCi1XZWQgTm92IDI5IDEyOjEyOjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgZ2FzIGZvciBhbHBoYS1kZWMtb3NmKi4KLQotVHVlIE5vdiAyOCAxNzoxNjo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmYXVsdCB0byAtLXdpdGgtc3RhYnMgZm9yIHNvbWUgdGFyZ2V0cyBmb3Igd2hpY2gKLQlpdCBtYWtlcyBzZW5zZTogbWlwcyotKi0qLCBhbHBoYSotKi1vc2YqLCBpWzM0NV04NiotKi1zeXN2NCogYW5kCi0JaVszNDVdODYqLSotdW5peHdhcmUqLgotCi1Nb24gTm92IDI3IDEzOjQ0OjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLW1sLmluOiBHZXQgbGlzdCBvZiBtdWx0aWRpcnMgdXNpbmcgZ2NjIC0tcHJpbnQtbXVsdGktbGliCi0JcmF0aGVyIHRoYW4gYmFzaW5nIGl0IG9uIHRoZSB0YXJnZXQuICBTaW1wbGlmeSBoYW5kbGluZyBvZiBvcHRpb25zCi0JY29udHJvbGxpbmcgd2hpY2ggZGlyZWN0b3JpZXMgdG8gY29uZmlndXJlLiAgUmVtb3ZlIGV4dHJhbmVvdXMKLQlzbGFzaCBpbiBtdWx0aS1jbGVhbiB0YXJnZXQuCi0KLUZyaSBOb3YgMjQgMTc6Mjk6MjkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWctbWwuaW46IFByZWZpeCBtb3JlIHZhcmlhYmxlcyB3aXRoIG1sXyBzbyB0aGV5IGRvbid0IGNvbGxpZGUKLQl3aXRoIGNvbmZpZ3VyZSdzLgotCi1XZWQgTm92IDIyIDExOjI3OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCB0dXJuIC12IGludG8gLS12LgotCi1UdWUgTm92IDIxIDE2OjQ4OjAyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnYXJncyk6IEZpeCB0eXBvLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIHN5bWxpbmstdHJlZS4KLQotVHVlIE5vdiAyMSAxNDowODoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3RyaXAgLS1ob3N0IGFuZCAtLXRhcmdldCBvcHRpb25zIGZyb20KLQlDT05GSUdfQVJHVU1FTlRTLCBhbmQgYWx3YXlzIGNvbmZpZ3VyZSBmb3IgLS1ob3N0IG9ubHkuICBBZGQKLQktLXdpdGgtY3Jvc3MtaG9zdCBvcHRpb24gd2hlbiBidWlsZGluZyB3aXRoIGEgY3Jvc3MtY29tcGlsZXIuCi0JKiBjb25maWd1cmU6IENhbm9uaWNhbGl6ZSB0aGUgYXJndW1lbnRzIHB1dCBpbnRvIGNvbmZpZy5zdGF0dXMgYnkKLQlhbHdheXMgdXNpbmcgYD0nIGZvciBhbiBvcHRpb24gd2l0aCBhbiBhcmd1bWVudC4gIFBhc3MgYSBwcmVzdW1lZAotCS0taG9zdCBvciAtLXRhcmdldCBleHBsaWNpdGx5LgotCi1GcmkgTm92IDE3IDE3OjUwOjMwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTWVyZ2UgLW1hY29zKiwgLW1hZ2ljKiwgLXBlKiwgYW5kIC13aW4zMiBjYXNlcwotCWludG8gZ2VuZXJhbCBPUyByZWNvZ25pdGlvbiBjYXNlLgotCi1GcmkgTm92IDE3IDE3OjQyOjI1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9jb25maWdkaXJzKTogYWRkIHRhcmdldC13aW5zdXAgb25seQotCWZvciB3aW4zMiB0YXJnZXQgc3lzdGVtcy4KLQotVGh1IE5vdiAxNiAxNDowNDo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwtdGFyZ2V0LWxpYmdsb3NzKTogRGVwZW5kIHVwb24KLQljb25maWd1cmUtdGFyZ2V0LW5ld2xpYiwgc2luY2Ugd2hlbiBsaWJnbG9zcyBpcyBidWlsdCBpdCBsb29rcyB0bwotCXNlZSBpZiB0aGUgbmV3bGliIGRpcmVjdG9yeSBleGlzdHMuCi0KLVdlZCBOb3YgMTUgMTQ6NDc6NTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBVc2UgY29uZmlnLW1sLmluIGluc3RlYWQgb2YKLQljZmctbWwtKi5pbi4KLQotV2VkIE5vdiAxNSAxMTo0NToyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIExEIGFuZCBMRF9GT1JfVEFSR0VUIHdoZW4gY29uZmlndXJpbmcgYQotCUNhbmFkaWFuIENyb3NzLgotCi1UdWUgTm92IDE0IDE1OjAzOjEyIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaTM4NndpbjMyOiBhZGQgTERfRk9SX1RBUkdFVC4KLQotVHVlIE5vdiAxNCAxNDo1NjoxMSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6IGFkZCB0YXJnZXQtd2luc3VwLgotCSh0YXJnZXQ9PWkzODYtd2luMzIpOiBhZGQgcGF0Y2ggZGlmZiBmbGV4IG1ha2UgdG8gJG5vY29uZmlnZGlycy4KLQkodGFyZ2V0PT1wcGNsZS1wZSk6IHJlbW92ZSBsZCBmcm9tICRub2NvbmZpZ2RpcnMuCi0KLVR1ZSBOb3YgMTQgMDE6MjU6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyk6IFBhc3MgLS13aXRoLXRhcmdldC1zdWJkaXIuCi0JUHJlc2VydmUgcmVsYXRpdmUgcGF0aCBuYW1lcyBpbiAkc3JjZGlyLiAgQnVpbGQgc3ltbGluayB0cmVlIGlmCi0JY29uZmlndXJpbmcgY3Jvc3MgdGFyZ2V0IGRpciBhbmQgc3JjZGlyPS4gKD0gbm8gVlBBVEggc3VwcG9ydCkuCi0JKGNvbmZpZ3VyZS10YXJnZXQtbGliZysrKTogRGVwZW5kIG9uIGNvbmZpZ3VyZS10YXJnZXQtbGlicnguCi0JKiBjZmctbWwtY29tLmluLCBjZmctbWwtcG9zLmluOiBEZWxldGVkLgotCSogY29uZmlnLW1sLmluOiBOZXcgZmlsZS4KLQkqIHN5bWxpbmstdHJlZTogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IEVuc3VyZSBzcmNkaXI9Ii4iIGlmIHRoYXQncyB3aGF0IGl0IGlzLgotCi1Nb24gTm92IDEzIDEyOjM0OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LVJFQURNRTogQ2xhcmlmeSBzb21lIHBocmFzaW5nLCBhZGQgbm90ZXMgYWJvdXQgQ29kZVdhcnJpb3IKLQlpbmNsdWRlcyBhbmQgRkxFWF9TS0VMRVRPTiBzZXR0aW5nLgotCSogbXB3LWNvbmZpZ3VyZSAoLS13aXRoLWdudS1sZCk6IE5ldyBvcHRpb24sIGNvbnRyb2xzIHdoZXRoZXIKLQl0byB1c2UgUFBDTGluayBvciBsZCB3aXRoIFBvd2VyTWFjIEdDQy4KLQkqIG1wdy1idWlsZC5pbiAoYWxsLWdyZXosIGRvLWdyZXosIGluc3RhbGwtZ3Jleik6IE5ldyB0YXJnZXRzLgotCSogbXB3LWNvbmZpZy5pbjogQ29uZmlndXJlIGdyZXogaWYgdGFyZ2V0aW5nIE1hYy4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IHBtYWMgYW5kIHBtYWMtbXB3IGFzIG5hbWVzIGZvciBQb3dlck1hY3MsCi0gCWFjY2VwdCBtcHcgYW5kIG1hYy1tcHcgYXMgbmFtZXMgZm9yIG02OGsgTWFjcywgY2hhbmdlIG1hY29zNyB0bwotIAlqdXN0IG1hY29zLgotCSogY29uZmlndXJlLmluOiBDb25maWd1cmUgZ3JleiByZXNvdXJjZSBjb21waWxlciBpZiB0YXJnZXRpbmcgTWFjLgotCSogTWFrZWZpbGUuaW4gKGFsbC1ncmV6LCBpbnN0YWxsLWdyZXopOiBOZXcgdGFyZ2V0cy4KLQotV2VkIE5vdiAgOCAxNzozMzo1MSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQ1hYIGRlZmF1bHRzIHRvIGdjYywgbm90IGcrKy4gIElmIHdlIGZpbmQKLSAJZ2NjIGluIHRoZSBwYXRoLCBzZXQgQ0MgdG8gZ2NjIC1PMi4KLQotVHVlIE5vdiAgNyAxNTo0NToxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogRGVmYXVsdCAke2J1aWxkfSBjb3JyZWN0bHkuICBBdm9pZCBwaWNraW5nIHVwIGV4dHJhCi0Jc3BhY2VzIHdoZW4gcmVhZGluZyBDQyBhbmQgQ1hYIGZyb20gTWFrZWZpbGUuICBXaGVuIGRvaW5nIGEKLQlDYW5hZGlhbiBDcm9zcywgdXNlIHBsYXVzaWJsZSBkZWZhdWx0IHZhbHVlcyBmb3IgbnVtZXJvdXMKLQl2YXJpYWJsZXMuCi0JKiBjb25maWd1cmUuaW46IFdoZW4gZG9pbmcgYSBDYW5hZGlhbiBDcm9zcywgZG9uJ3QgdHJ5IHRvCi0JY29uZmlndXJlIHRvb2xzIHdob3NlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgaGFuZGxlIGl0LgotCi1Nb24gTm92ICA2IDE5OjMyOjE3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoc2gtKi0qKTogQWRkIG0yIGFuZCBtbC9tMiB0byBtdWx0aWRpcnMuCi0KLVN1biBOb3YgIDUgMDA6MTU6NDEgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogIFJlbW92ZSBkdWJpb3VzIGJ1ZyByZXBvcnRpbmcgYWRkcmVzcy4KLQotRnJpIE5vdiAgMyAwODoxNzo1NCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKSk6ICBJZiBzdWJkaXIgaGFzCi0JY29uZmlndXJlIHNjcmlwdCwgcnVuIHRoYXQgaW5zdGVhZCBvZiB0aGlzIGRpcmVjdG9yeSdzIGNvbmZpZ3VyZS4KLQlJbiBlaXRoZXIgY2FzZSwgcHJpbnQgYSBtZXNzYWdlIHRoYXQgd2UncmUgY29uZmlndXJpbmcgdGhlIHN1Yi1kaXIuCi0KLVRodSBOb3YgIDIgMjM6MjM6MzYgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQmVmb3JlIGNoZWNraW5nIGZvciB0aGUgZXhpc3RlbmNlIG9mIHZhcmlvdXMgZmlsZXMsCi0JdXNlIHNlZCB0byBmaWx0ZXIgb3V0ICJ0YXJnZXQtIi4KLQotVGh1IE5vdiAgMiAxMzoyNDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChET19YKTogU3BsaXQgcnVsZSB0byBkZWNyZWFzZSBjb21tYW5kIGxpbmUgbGVuZ3RoCi0JZm9yIHN5c3RlbXMgd2l0aCBzbWFsbCBBUkdfTUFYIHZhbHVlcy4gIEZyb20gcGhkbUBpbmZvLnVjbC5hYy5iZQotCShQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDE1OjE4OjM1IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXBhdGNoKTogZGVwZW5kIG9uIGFsbC1saWJpYmVydHkuCi0KLVdlZCBOb3YgIDEgMTI6MjM6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IElmIHRoZSBvbmx5IGRpcmVjdG9yeSBpbiB0YXJnZXRfY29uZmlnZGlycyB3aGljaAotCWFjdHVhbGx5IGV4aXN0cyBpcyBsaWJpYmVydHksIHRoZW4gc2V0IHRhcmdldF9jb25maWdkaXJzIHRvIGVtcHR5LAotCXRvIGF2b2lkIHRyeWluZyB0byBidWlsZCBhIHRhcmdldCBsaWJpYmVydHkgaW4gYSBnYXMgb3IgZ2RiCi0JZGlzdHJpYnV0aW9uLgotCi1UdWUgT2N0IDMxIDE3OjUyOjM5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BzbGF2ZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfbWFrZWZpbGVfZnJhZyk6IFVzZSBtNjhrLXN1bi1zdW5vcyogaW5zdGVhZAotIAlvZiBtNjhrLXN1bi0qIHdoZW4gc2VsZWN0aW5nIG1oLXN1bjMgdG8gYXZvaWQgbWF0Y2hpbmcgTmV0QlNEL3N1bjMKLSAJc3lzdGVtcy4KLQotVHVlIE9jdCAzMSAxNjo1NzozMiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY29weV9kaXJzKTogVXNlIHN5cy1pbmNsdWRlIGluc3RlYWQgb2YgaW5jbHVkZQotCWZvciAtLXdpdGgtaGVhZGVycyBvcHRpb24uCi0KLVR1ZSBPY3QgMzEgMTA6Mjk6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogTWFrZSB3aW5zdXAgYnVpbGRzIHdvcmsgd2l0aAotCW5ldyBzY2hlbWUuCi0KLU1vbiBPY3QgMzAgMTg6NTc6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIHRoZSBsaW5rZXIgb24gQUlYLgotCi1Nb24gT2N0IDMwIDEyOjI3OjE2IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgQ1hYX0ZPUl9UQVJHRVQpOiAgQWRkICQoVEFSR0VUX1NVQkRJUikKLQl3aGVyZSBuZWVkZWQuCi0KLU1vbiBPY3QgMzAgMTI6NDU6MjUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdjYyk6IEZpeCB0eXBvLgotCi1TYXQgT2N0IDI4IDEwOjI3OjU5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChDSEVDS19UQVJHRVRfTU9EVUxFUykpOiAgRml4IHR5cG8uCi0KLUZyaSBPY3QgMjcgMjM6MTQ6MTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbmFtZSBsaWJGT08gdG8gdGFyZ2V0LWxpYkZPTywgYW5kIHhpYmVydHkKLQl0byB0YXJnZXQteGliZXJ0eSwgdG8gcHJvdmlkZSBtb3JlIGZsZXhpYmlsaXR5LgotCSh0YXJnZXRfc3ViZGlyKTogIERlZmluZS4gIENyZWF0ZSBpZiBjcm9zcy4KLQlTZXQgVEFSR0VUX1NVQkRJUiBpbiBNYWtlZmlsZSB0byAke3RhcmdldF9zdWJkaXJ9LgotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgYWxsLWxpYkZPTyAtPiBhbGwtdGFyZ2V0LWxpYkZPTywgYWxsLXhpYmVydHkKLQktPiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSwgY29uZmlndXJlLWxpYkZPTyAtPiBjb25maWd1cmUtdGFyZ2V0LWxpYkZPTywKLQljaGVjay1saWJGT08gLT4gY2hlY2stdGFyZ2V0LWxpYkZPTywgZXRjLgotCSgkKERPX1gpKTogIEl0ZXJhdGUgb3ZlciBUQVJHRVRfQ09ORklHRElSUyBhZnRlciBTVUJESVJTLgotCSgkKENPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyksICQoQ0hFQ0tfVEFSR0VUX01PRFVMRVMpLAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSwgJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSk6IFVwZGF0ZSBhY2NvcmRpbmdseS4KLQkoY29uZmlndXJlLXRhcmdldC1YWFgpOiAgRGVwZW5kIG9uICQoQUxMX0dDQyksIG5vdCBhbGwtZ2NjLCB0bwotCWFsbG93IEFMTF9HQ0M9IiIgdG8gb25seSBjb25maWd1cmUuCi0JKERFVk9fU1VQUE9SVCk6ICBBZGQgY2ZnLW1sLWNvbS5pbiBhbmQgY2ZnLW1sLXBvcy5pbi4KLQkoRVRDX1NVUFBPUlQsIEVUQ19TVVBQT1JUX1BGWCk6ICBNZXJnZTsgIHVwZGF0ZSAndGF6JyBhY2NvcmRpbmdseS4KLQkoTElCR1hYX1NVUFBPUlRfRElSUyk6ICBSZW1vdmUgeGliZXJ0eS4KLQotU2F0IE9jdCAyOCAwMTo1Mzo0OSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEJ1aWxkICJpbmZvIiBpbiBldGMgZXhwbGljaXRseS4KLQotRnJpIE9jdCAyNyAwOTozMjozMCAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIHN1cmUgdGhhdCBDQyBpcyB1bmRlZmluZWQgKGFzIG9wcG9zZWQgdG8KLQludWxsKSBpZiB0b3BsZXZlbC9jb25maWcvbWgte2hvc3R9IGRvZXNuJ3QgZGVmaW5lIGl0LiAgRml4ZXMgYQotCXByb2JsZW0gd2l0aCBhdXRvY29uZiB0cnlpbmcgdG8gY29uZmlndXJlIG9uIGEgaG9zdCB3aXRob3V0IEdDQy4KLQotVGh1IE9jdCAyNiAyMjozNTowMSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWd1cmU6IFNldCBob3N0IGFsaWFzIGZyb20gY2hvaWNlIG9mIGhvc3QgY29tcGlsZXIsCi0Jb25seSB1c2UgZ2VuZXJpYyBNUFcgTWFrZWZpbGUgc2VkIGlmIHByZXNlbnQsIGVkaXQgYSBmaWxlCi0JbmFtZWQgImhhY2tlZF9NYWtlZmlsZS5pbiIgaW5zdGVhZCBvZiAiTWFrZWZpbGUuaW4iIGlmIHByZXNlbnQuCi0JKiBtcHctUkVBRE1FOiBBZGQgcHJvYmxlbSBub3RlcyBhYm91dCBDVzYgYW5kIENXNy4KLQotVGh1IE9jdCAyNiAwNTo0NToxMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHRheik6IFVzZSAiOyIgaW5zdGVhZCBvZiAiOzsiLgotCi1XZWQgT2N0IDI1IDE1OjE4OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIEdyZXAgZm9yICdeZGlzdHN0dWZmOicgb3IgJ15pbmZvOicgaW4KLQlzdWItZGlyZWN0b3J5IE1ha2VmaWxlcywgaW5zdGVhZCBvZiB1c2luZyBESVNUU1RVRkZESVJTIGFuZAotCURJU1RET0NESVJTLgotCShESVNUU1RVRkZESVJTLCBESVNURE9DRElSUyk6ICBSZW1vdmVkIC0gbm8gbG9uZ2VyIHVzZWQuCi0JKG5ld2xpYi50YXIuZ3opOiAgRG9uJ3QgcGFzcyBESVNURE9DRElSUyB0byByZWN1cnNpdmUgbWFrZS4KLQotV2VkIE9jdCAyNSAxNDo0Mzo1NSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogIFJlbW92ZSBsZCBncHJvZiBibnV0aWxzIGdhcyBsaWJnKysgZ2RiCi0JYW5kIGduYXRzLCBiZWNhdXNlIHRoZXkgYXJlIG5vdyBzdWJzdW1lZCBieSBESVNUU1RVRkZESVJTLgotCU1vdmUgYmZkIHRvIERJU1RTVFVGRkRJUlMuCi0KLVR1ZSBPY3QgMjQgMTg6MTk6MDkgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYMTFfTElCKTogUmVtb3ZlZC4KLQkoWDExX0ZMQUdTX1RPX1BBU1MpOiBwYXNzIG9ubHkgWDExX0VYVFJBX0NGTEFHUyBhbmQgWDExX0VYVFJBX0xJQlMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogbWgtYWl4ICYgbWgtc3VuIHJlbW92ZWQuCi0KLVN1biBPY3QgMjIgMTM6MDQ6NDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKik6IFNob3J0ZW4gc29tZSBvZiB0aGUgbXVsdGlsaWIgZGlyZWN0b3J5Ci0JbmFtZXMuCi0KLUZyaSBPY3QgMjAgMTg6MDI6MTAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi1lYWJpKik6IEFkZCBtY2FsbC1haXhkZXNjIHZhcmllbnRzLgotCi1UaHUgT2N0IDE5IDEwOjQwOjU3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi13aW4zMik6IEFsd2F5cyBidWlsZCBuZXdsaWIuCi0JRG9uJ3QgY29uZmlndXJlIGN2cywgYXV0b2NvbmYgb3IgdGV4aW5mby4KLQkqIE1ha2VmaWxlLmluIChMRF9GT1JfVEFSR0VUKTogTmV3LgotCShCQVNFX0ZMQUdTX1RPX1BBU1MsIEVYVFJBX1RBUkdFVF9GTEFHUywgQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKToKLQlQYXNzIGRvd24gTERfRk9SX1RBUkdFVC4KLQotV2VkIE9jdCAxOCAxNTo1Mzo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3aW5zdXA6IE5ldyBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgd2luc3VwLgotCSogY29uZmlndXJlLmluOiBXaW5zdXAgaXMgY29uZmlndXJlZCB3aGVuIHRhcmdldCBpcyB3aW4zMi4KLQlDYW4gb25seSBidWlsZCB3aW4zMiB0YXJnZXQgR0RCIHdoZW4gbmF0aXZlLgotCQotTW9uIE9jdCAxNiAwOTo0MjozMSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIEhQIG1vZGVsIDgxOSBtYWNoaW5lcyBhcyBoYXZpbmcKLQlhIFBBIDEuMSBwcm9jZXNzb3IuCi0KLU1vbiBPY3QgMTYgMTA6NDk6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEZpeCBzZWQgbG9vcCB3aGljaCBzdWJzdGl0dXRlcyBmb3IgQ0MgYW5kIENYWCB0bwotCWF2b2lkIGJ1ZyBmb3VuZCBpbiB2YXJpb3VzIHNlZCBpbXBsZW1lbnRhdGlvbnMuCi0KLVdlZCBPY3QgMTEgMTY6MTY6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjLSotZWFiaXNpbSk6IERlbGV0ZSBzZXBhcmF0ZSBydWxlIGZvcgotCXNpbXVsYXRvci4gIFVzZSBzdGFuZGFyZCBwb3dlcnBjLSotZWFiaSouCi0KLU1vbiBPY3QgIDkgMTc6MjE6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0b3AgcHV0dGluZyBnYXMgYW5kIGJpbnV0aWxzIGluIG5vY29uZmlnZGlycyBmb3IKLQlwb3dlcnBjLSotYWl4KiBhbmQgcnM2MDAwLSotKi4KLQotTW9uIE9jdCAgOSAxMjozODo0MCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZwotCS1tY2FsbC1haXhkZXNjIGxpYnJhcmllcy4KLQotRnJpIE9jdCAgNiAxNjoxNzo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy5zdWIgKGFybSB8IGFybWVsIHwgYXJtZWIpOiBGaXggc2hlbGwgc3ludGF4LgotCi1GcmkgT2N0ICA2IDE0OjQwOjI4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAoe3Bvd2VycGMscnM2MDAwfS1pYm0tYWl4Kik6IEFkZCBtdWx0aWxpYnMgZm9yCi0JLW1zb2Z0LWZsb2F0IGFuZCAtbWNwdT1jb21tb24gc3VwcG9ydC4KLQkocG93ZXJwYyotKi1lYWJpc2ltKik6IEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyAtbWNhbGwtYWl4Ci0JbGlicmFyaWVzLgotCi1UaHUgT2N0ICA1IDEzOjI2OjM3IDE5OTUgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBbGxvdyBjb25maWd1cmF0aW9uIGFuZCBidWlsZCBvZiBlbWFjczE5IGZvciB0aGUgYWxwaGEuCi0KLVdlZCBPY3QgIDQgMjI6MDU6MzYgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoQ0MpOiBHZXQgXkNDLCBub3QganVzdCBhbnkgb2xkIENDLCBmcm9tCi0JJHtob3N0X21ha2VmaWxlX2ZyYWd9LgotCi1XZWQgT2N0ICA0IDIxOjU1OjAwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKENDKTogVHJ5IHRvIGdldCBDQyBmcm9tIAotCSR7c3JjZGlyfS8ke2hvc3RfbWFrZWZpbGVfZnJhZ30sIG5vdCAke2hvc3RfbWFrZWZpbGVfZnJhZ30uCi0KLVdlZCBPY3QgIDQgMjE6NDQ6MTIgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IGNvbmZpZ3VyZSB0YXJnZXRkaXJzCi0Jb25seSBpZiBpdCBleGlzdHMgaW4gJChzcmNkaXIpLgotCi1XZWQgT2N0ICA0IDExOjUyOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBJZiBDQyBhbmQgQ1hYIGFyZSBub3Qgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgc2V0Ci0JdGhlbSwgYmFzZWQgb24gZWl0aGVyIGFuIGV4aXN0aW5nIE1ha2VmaWxlIG9yIG9uIHNlYXJjaGluZyBmb3IgZ2NjCi0JaW4gUEFUSC4gIFN1YnN0aXR1dGUgZm9yIENDIGFuZCBDWFggaW4gTWFrZWZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBsaWJtIGZyb20gdGFyZ2V0X2xpYnMuICBTZXBhcmF0ZQotCXRhcmdldF9jb25maWdkaXJzIGZyb20gY29uZmlnZGlycy4gIElmIENDIGlzIG5vdCBzZXQgaW4KLQllbnZpcm9ubWVudCwgdHJ5IHRvIGdldCBpdCBmcm9tIGEgaG9zdCBNYWtlZmlsZSBmcmFnbWVudC4gIFJld3JpdGUKLQljaGFuZ2VzIG9mIGNvbmZpZ2RpcnMgdG8gdXNlIHNraXBkaXJzIGluc3RlYWQuICBBIGZldyBtaW5vcgotCXR3ZWFrcy4gIFRha2UgZGlyZWN0b3JpZXMgb3V0IG9mIHRhcmdldF9jb25maWdkaXJzIGFzIHRoZXkgYXJlCi0JdGFrZW4gb3V0IG9mIGNvbmZpZ2RpcnMuICBSZW1vdmUgZXhpc3RpbmcgTWFrZWZpbGUgZmlsZXMgZnJvbQotCXN1YmRpcmVjdG9yaWVzLiAgU3Vic3RpdHV0ZSBmb3IgVEFSR0VUX0NPTkZJR0RJUlMgYW5kCi0JQ09ORklHX0FSR1VNRU5UUyBpbiBNYWtlZmlsZS4KLQkqIE1ha2VmaWxlLmluIChUQVJHRVRfQ09ORklHRElSUyk6IE5ldyB2YXJpYWJsZSwgYXV0b21hdGljYWxseSBzZXQKLQlieSBjb25maWd1cmUuaW4uCi0JKENPTkZJR19BUkdVTUVOVFMpOiBMaWtld2lzZS4KLQkoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKTogTmV3IHZhcmlhYmxlLgotCSgkKERPX1gpKTogTG9vcCBvdmVyIFRBUkdFVF9DT05GSUdESVJTIGFzIHdlbGwgYXMgU1VCRElSUy4KLQkoJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpKTogTmV3IHRhcmdldC4KLQkoY29uZmlndXJlLWxpYmcrKywgY29uZmlndXJlLWxpYmlvKTogTmV3IHRhcmdldHMuCi0JKGFsbC1saWJnKyspOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliZysrLgotCShhbGwtbGliaW8pOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbGliaW8uCi0JKGNvbmZpZ3VyZS1saWJnbG9zcywgYWxsLWxpYmdsb3NzKTogTmV3IHRhcmdldHMuCi0JKGNvbmZpZ3VyZS1saWJzdGRjKyspOiBOZXcgdGFyZ2V0LgotCShhbGwtbGlic3RkYysrKTogRGVwZW5kIHVwb24gY29uZmlndXJlLWxpYnN0ZGMrKy4KLQkoY29uZmlndXJlLWxpYnJ4LCBhbGwtbGlicngpOiBOZXcgdGFyZ2V0cy4KLQkoY29uZmlndXJlLW5ld2xpYik6IE5ldyB0YXJnZXQuCi0JKGFsbC1uZXdsaWIpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUtbmV3bGliCi0JKGNvbmZpZ3VyZS14aWJlcnR5KTogTmV3IHRhcmdldC4KLQkoYWxsLXhpYmVydHkpOiBEZXBlbmQgdXBvbiBjb25maWd1cmUteGliZXJ0eS4KLQotU2F0IFNlcCAzMCAwNDozMjo1OSAxOTk1ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6ICBFeHBhbmQgdGhlCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1UaHUgU2VwIDI4IDIxOjE4OjQ5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZ3VyZTogRml4IHNlZCBjb21tYW5kIGZpbGUgbmFtZS4KLQotVGh1IFNlcCAyOCAxNzozOTo1NiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3QgaVszNDVdODYtKi13aW4zMik6IFJlZHVjZSB0aGUgCi0Jbm9jb25maWdkaXJzIGFnYWluLgotCi1XZWQgU2VwIDI3IDEyOjI0OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGQgYW5kIGdkYiBmb3IgcG93ZXJwYyotKi13aW5udCoKLQlvciBwb3dlcnBjKi0qLXBlKiwgc2luY2UgdGhleSBhcmUgbm90IHlldCBzdXBwb3J0ZWQuCi0KLVR1ZSBTZXAgMjYgMTQ6MzA6MDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JQWRkIFBvd2VyTWFjIHN1cHBvcnQgYW5kIG1hbnkgb3RoZXIgZW5oYW5jZW1lbnRzLgotCSogbXB3LWNvbmZpZ3VyZTogTmV3IG9wdGlvbiAtLWNjIHRvIHNlbGVjdCBjb21waWxlciB0byB1c2UsCi0JcGFzdGUgb3B0aW9ucyBzZXQgYWNjb3JkaW5nIHRvIC0tY2MgaW50byB0aGUgZ2VuZXJhdGVkCi0JTWFrZWZpbGUsIGdlbmVyYXRlIHRoZSBNYWtlZmlsZSBieSBzZWQnaW5nIHRoZSBVbml4IE1ha2VmaWxlLmluCi0JaWYgbXB3LW1ha2Uuc2VkIGlzIHByZXNlbnQuCi0JKiBtcHctY29uZmlnLmluOiBEb24ndCB0ZXN0IGZvciBnQzEsIHRlc3QgZm9yIG1wdy10b3VjaCwKLQlhZGQgZm9yd2FyZCBpbmNsdWRlcyBmb3IgUG93ZXJQQyBpbmNsdWRlIGZpbGVzLgotCSogbXB3LWJ1aWxkLmluOiBCdWlsZCB1c2luZyBNYWtlZmlsZS5QUEMgaWYgcHJlc2VudC4KLQkoZG8tYnlhY2MsIGV0Yyk6IFJlbW92ZSBzZXBhcmF0ZSB2ZXJzaW9uIHJlc291cmNlIGJ1aWxkcy4KLQkoZG8tZ2FzKTogQnVpbGQgInN0YW1wcyIgYmVmb3JlICJhbGwiLgotCShkby1nY2MpOiBCdWlsZCAic3RhbXBzLWgiIGFuZCAic3RhbXBzLWMiIGJlZm9yZSAiYWxsIi4KLQkqIG1wdy1SRUFETUU6IFVwZGF0ZSB0byByZWZsZWN0IC0tY2Mgb3B0aW9uLCBQb3dlck1hYyBzdXBwb3J0LAotCWFuZCByZWNlbnRseS1yZXBvcnRlZCBjb21wYXRpYmlsaXR5IHByb2JsZW1zLgotCi1GcmkgU2VwIDIyIDEyOjE1OjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAobTY4Ki0qLSopOiBPbmx5IGJ1aWxkIG11bHRpbGlicyBmb3IKLQllbWJlZGRlZCBtNjhrIHN5c3RlbXMgKC1hb3V0LCAtY29mZiwgLWVsZiwgLXZ4d29ya3MpLgotCSgtLXdpdGgtbXVsdGlsaWItdG9wKTogUGFzcyB0byByZWN1cnNpdmUgaW52b2NhdGlvbnMuCi0KLVR1ZSBTZXAgMTkgMTM6NTE6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRGlzYWJsZSBsaWJnKysgYW5kIGxpYnN0ZGMrKyBvbgotCXY4MTAtKi0qLgotCi1Nb24gU2VwIDE4IDIzOjA4OjI2IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEaXNhYmxlIGJmZCwgYmludXRpbHMsIGdhcywgZ2NjLAotCWdkYiwgbGQgYW5kIG9wY29kZXMgb24gdjgxMC0qLSouCi0KLVNhdCBTZXAgMTYgMTg6MzE6MDggUERUIDE5OTUgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgPGFuZ2VsYUBjeWdudXMuY29tPgotCQotCSogY29uZmlnL21oLW5jcnN2cjQzOiBSZW1vdmVkIEFSX0ZMQUdTCi0KLVR1ZSBTZXAgMTIgMTg6MDM6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRE9fWCk6IENoYW5nZSBkby1yZWFsY2xlYW4gdG8gZG8tbWFpbnRhaW5lci1jbGVhbi4KLQkobG9jYWwtbWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0JKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCShyZWFsY2xlYW4pOiBKdXN0IGRlcGVuZCB1cG9uIG1haW50YWluZXItY2xlYW4uCi0KLUZyaSBTZXAgIDggMTc6MTE6MTQgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyk6IERpc2FibGUgZ2RiIG9uIG02OGstKi1uZXRic2QqLgotCi1GcmkgU2VwICA4IDE2OjQ2OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBsZCBpbiBtaXBzKi0qLWJzZCogY2FzZS4KLQotVGh1IFNlcCAgNyAyMDowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1saXRlcyogT1MuICBGcm9tIElhbiBEYWxsLgotCi1GcmkgU2VwICAxIDA4OjA2OjU4IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiByZWNvZ25pc2UgbWlwczY0dnI0MzAwIGFuZCBtaXBzNjR2cjQzMDBlbCBhcyB2YWxpZAotIAl0YXJnZXRzLgotCi1XZWQgQXVnIDMwIDIxOjA2OjUwIDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHRyZWF0IGkzODYtd2luMzIgY2FuYWRpYW4gY3Jvc3MgdGhlIHNhbWUgYXMKLQlpMzg2LWdvMzIgY2FuYWRpYW4gY3Jvc3MuCi0KLVRodSBBdWcgMjQgMTQ6NTM6MjAgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluIChwb3dlcnBjKi0qLWVhYmlzaW0pOiBBZGQgc3VwcG9ydCBmb3IgUG93ZXJQQwotCXJ1bm5pbmcgdW5kZXIgdGhlIHNpbXVsYXRvciB0byBidWlsZCBhIHJlZHVjZWQgc2V0IG9mIGxpYnJhcmllcy4KLQkocG93ZXJwYy0qLWVhYmlhaXgpOiBBZGQgZmluZSBncmFpbmVkIG11bHRpbGliIHN1cHBvcnQgYWRkZWQgdG8KLQlvdGhlciBwb3dlcnBjIHRhcmdldHMgeWVzdGVyZGF5LgotCi1XZWQgQXVnIDIzIDA5OjQxOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY2ZnLW1sLWNvbS5pbiAocG93ZXJwYyopOiBBZGQgc3VwcG9ydCBmb3IgLWRpc2FibGUtYmllbmRpYW4sCi0JLWRpc2FibGUtc29mdGZsb2F0LCAtZGlzYWJsZS1yZWxvY2F0YWJsZSwgLWRpc2FibGUtYWl4LCBhbmQKLQktZGlzYWJsZS1zeXN2IHRvIGNvbnRyb2wgd2hpY2ggbXVsdGlsaWIgbGlicmFyaWVzIGdldCBidWlsdC4KLQotVGh1IEF1ZyAxNyAxNjowMzo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQWRkIE1ha2VmaWxlLnRlbSB0byBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSBpbiB0cmFwCi0JaGFuZGxlci4KLQotTW9uIEF1ZyAxNCAxOToyNzo1NiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzICgqTGludXgqKTogIEFkZCBtaXNzaW5nICJleGl0InMuCi0JQWxzbywgbmVlZCBzcGVjaWZpYyBjaGVjayBmb3IgYWxwaGEtdW5rbm93bi1saW51eCAodXNlcyBDT0ZGKS4KLQotRnJpIEF1ZyAxMSAxNTozODoyMCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2Ugd2l0aCBGU0Y6Ci0KLQlXZWQgSnVuIDI4IDE3OjU3OjI3IDE5OTUgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCSogY29uZmlnLmd1ZXNzIChBSVg0KTogTW9yZSByb2J1c3QgcmVsZWFzZSBudW1iZXJpbmcgZGlzY292ZXJ5LgotCi0JVGh1IEp1biAyMiAxOTowMToyNCAxOTk1ICBLZW5uZXRoIFN0YWlsZXkgIChrc3RhaWxleUBlYWdsZS5kb2wtZXNhLmdvdikKLQkqIGNvbmZpZy5ndWVzcyAoaTM4Ni1zZXF1ZW50LXB0eCk6IFByb3Blcmx5IGdldCB2ZXJzaW9uIG51bWJlci4KLQotCVRodSBKdW4gMjIgMTg6MzY6NDIgMTk5NSAgVXdlIFNlaW1ldCAgKHNlaW1ldEBpcmlzMS5jaGVtaWUudW5pLWtsLmRlKQotCSogY29uZmlnLmd1ZXNzIChtaXBzOio6NCo6VU1JUFMpOiBOZXcgY2FzZS4KLQotTW9uIEF1ZyAgNyAwOToyMTozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtZ28zMiBob3N0KTogRml4IHR5cG8gKGRlamEtZ251IC0+IGRlamFnbnUpLgotCShpMzg2LXdpbjMyIGhvc3QpOiBMaWtld2lzZS4gIERvbid0IGJ1aWxkIHJlYWRsaW5lLgotCi1GcmkgQXVnICA0IDEzOjA0OjM2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoR0RCX1NVUFBPUlRfRElSUyk6IEFkZCB1dGlscy4KLQkoREVWT19TVVBQT1JUKTogQWRkIG1wdy1SRUFETUUsIG1wdy1idWlsZC5pbiwgbXB3LWNvbmZpZy5oIGFuZAotCW1wdy1jb25maWd1cmUuCi0KLVdlZCBBdWcgIDIgMTY6MzI6NDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYXBwZGlycyk6IFVzZSA9LCBub3QgPT0sIGluIHRlc3QgZXhwcmVzc2lvbiB3aGVuCi0JdHJ5aW5nIHRvIGJ1aWxkIHRoZSB0ZXh0IHRvIHByaW50IGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UgZm9yCi0JU29sYXJpcyB1c2Vycy4KLQotTW9uIEp1bCAzMSAwOTo1NjoxOCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluICh6OGstKi1jb2ZmKTogQWRkICdzdGQnIG11bHRpbGliIGJ1aWxkLgotCi1GcmkgSnVsIDI4IDAwOjE2OjMxIDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBseW54LTIuMy4KLQotVGh1IEp1bCAyNyAxNTo0Nzo1OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViICh6OGtzaW0pOiBEZWxldGVkCi0JKHo4ay0qLWNvZmYpOiBOZXcsIHRoaXMgaXMgdGhlIG9uZSB0cnVlIG5hbWUgb2YgdGhlIHRhcmdldC4KLQotVGh1IEp1bCAyNyAxNDozMzozMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtcG9zLmluIChkb3Rkb3QpOiBXb3JrIGFyb3VuZCBTdW5PUyBzZWQgYnVnLgotCi1UaHUgSnVsIDI3IDEzOjMxOjA1IDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKCo6TGludXg6KjoqKTogRmlyc3QgdHJ5IGFza2luZyB0aGUgbGlua2VyIHdoYXQgdGhlCi0JZGVmYXVsdCBvYmplY3QgZmlsZSBmb3JtYXQgaXMgKGVsZiwgYW91dCwgb3IgY29mZikuICBUaGVuIGlmIHRoaXMKLQlmYWlscywgdHJ5IHByZXZpb3VzIG1ldGhvZHMuCi0KLVRodSBKdWwgMjcgMTE6Mjg6MTcgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5ld2xpYiBmb3IgKi0qLXZ4d29ya3M1LjEuCi0KLVRodSBKdWwgMjcgMTE6MTg6NDcgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJ1aWxkIG5ld2xpYiBmb3IgYTI5ay0qLXZ4d29ya3M1LjEuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBBZGQgc2V0dGluZyBvZiAtLXdpdGgtaGVhZGVycyBmb3IgYTI5ay12eHdvcmtzNS4xLgotCi1UdWUgSnVsIDI1IDIxOjI1OjM5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNmZy1tbC1wb3MuaW4gKE1VTFRJVE9QKTogVHJpbSBleGNlc3MgdHJhaWxpbmcgIi8uIi4KLQotRnJpIEp1bCAyMSAxMDo0MToxMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZmctbWwtY29tLmluOiBOZXcgZmlsZS4KLQkqIGNmZy1tbC1wb3MuaW46IE5ldyBmaWxlLgotCi1XZWQgSnVsIDE5IDAwOjM3OjI3IDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBDT1BZSU5HLk5FV0xJQjogQWRkIEhQIGZyZWUgY29weXJpZ2h0IHRvIGxpc3QuCi0KLVR1ZSBKdWwgMTggMTA6NTg6NTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgLWVhYmkqIGZvciB0aGUgc3lzdGVtLCBub3QganVzdCAtZWFiaS4KLQotTW9uIEp1bCAgMyAxMzo0NDo1MSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtmaWxlLmluIChETExUT09MX0ZPUl9UQVJHRVQpOiBOZXcgbmFtZSwgcGFzcyBpdCBkb3duLgotCSogY29uZmlnLnN1YiwgY29uZmlndXJlLmluICh3aW4zMik6IE5ldyB0YXJnZXQgYW5kIGhvc3QuCi0KLVdlZCBKdW4gMjggMjM6NTc6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgaTM4Ni1wZSBjb25maWd1cmF0aW9uLgotCi1GcmkgSnVuIDIzIDE0OjI4OjQ0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWJ1aWxkLmluIChpbnN0YWxsKTogSW5zdGFsbCBHREIgYWZ0ZXIgTEQuCi0KLVRodSBKdW4gMjIgMTc6MTA6NTMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChlbGYvbWlwcy5oKTogQWx3YXlzIGZvcndhcmQtaW5jbHVkZSwgbmVlZGVkCi0JZm9yIEdEQiB0byBidWlsZC4KLQotV2VkIEp1biAyMSAxNToxNzozMCAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIHRlc3RzdWl0ZTogTmV3IGRpcmVjdG9yeSBmb3IgY3VzdG9tZXIgYWNjZXB0YW5jZSBhbmQgd2hvbGUgdG9vbAotCWNoYWluIHRlc3RzLgotCi1XZWQgSnVuIDIxIDE2OjUwOjI5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgcGVyLWhvc3QgbGluZSBpc24ndCBmb3VuZCwgYnV0IEFDX09VVFBVVCBpcyBmb3VuZAotCWFuZCBhIGNvbmZpZ3VyZSBzY3JpcHQgZXhpc3RzLCBydW4gaXQgaW5zdGVhZC4KLQotVGh1IEp1biAxNSAyMTowOToyNCAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLCBmb3IgYWxwaGEtZGVjLXdpbm50My41IGFuZCAgQ3JheXMuCi0KLVR1ZSBKdW4gMTMgMjE6NDM6MjcgMTk5NSAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBidWlsZF97Y3B1LHZlbmRvcixvcyxhbGlhc30gdG8gaG9zdCB2YWx1ZXMgd2hlbgotCS0tYnVpbGQgaXNuJ3Qgc3BlY2lmaWVkLgotCi1Nb24gSnVuICA1IDE4OjI2OjM2IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoUElDRkxBRywgUElDRkxBR19GT1JfVEFSR0VUKTogTmV3IG1hY3Jvcy4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgdGhlbS4KLQkoRVhUUkFfVEFSR0VUX0ZMQUdTKTogRGl0dG8uCi0KLQkqIGNvbmZpZy9tPy0qcGljOiBEZWZpbmUgUElDRkxBRyogaW5zdGVhZCBvZiBMSUIqRkxBR1MqLgotCi1XZWQgTWF5IDMxIDIyOjI3OjQyIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1saWJnKyspOiBEZXBlbmQgb24gYWxsLWxpYnN0ZGMrKy4KLQotVGh1IE1heSAyNSAyMjo0MDo1OSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobm9jb25maWdkaXJzKTogRW5hYmxlIGFsbCBwYWNrYWdlcyBmb3IKLQkgIGkzODYtdW5rbm93bi1uZXRic2QuCi0KLVNhdCBNYXkgMjAgMTM6MjI6MzEgMTk5NSAgQW5nZWxhIE1hcmllIFRob21hcyAgPGFuZ2VsYUBjaXJkYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBjb25maWd1cmUgdGsgZm9yIGkzODYtZ28zMgotCWhvc3RlZCBidWlsZHMgKERPUyBidWlsZHMpCi0KLVRodSBNYXkgMTggMTg6MDg6NDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmb3IgQVJNIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSaWNoYXJkIEVhcm5zaGF3OgotCSogY29uZmlnLnN1YjogSGFuZGxlIGFybWViIGFuZCBhcm1lbC4KLQkqIGNvbmZpZ3VyZS5pbjogT21pdCBhcm0gbGlua2VyIG9ubHkgZm9yIHJpc2NpeC4KLQotVGh1IE1heSAxMSAxNzoyMzoyNiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLgotCi1UdWUgTWF5ICA5IDE1OjUyOjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgcG93ZXJwY2xlIGFzIHRoZSBsaXR0bGUgZW5kaWFuIHZhcmllbnQgb2YKLQl0aGUgUG93ZXJQQy4gIFJlY2dvbml6ZSBwcGMgYXMgYSBQb3dlclBDIHZhcmlhbnQsIGFuZCBwcGNsZSBhcyBhCi0JcG93ZXJwY2xlIHZhcmlhbnQuICBDb252ZXJ0IHBlbnRpdW0gaW50byBpNTg2LCBub3QgaTQ4Ni4gIEFkZCBwNQotCWFsaWFzIGZvciBpNTg2LiAgTWFwIG5ldyB4ODYgdmFyaWFudHMgcDYsIGs1LCBuZXhnZW4gaW50byBpNTg2Ci0JdGVtcG9yYXJpbHkuCi0KLVR1ZSBNYXkgIDIgMTY6Mjk6NDEgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1saXRlcyopOiBUcmVhdCBsaWtlIGhwcGEqLSotKmVsZiouCi0KLVN1biBBcHIgMzAgMjE6Mzg6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtbGl0ZXMqIGFzIGEgYmFzaWMgc3lzdGVtIHR5cGUuCi0KLVRodSBBcHIgMjcgMTE6MzM6MjkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoKjpMaW51eDoqOiopOiBDaGVjayBmb3Igd2hldGhlciB0aGUgcHJlLUJGRCBsaW5rZXIgaXMKLQlpbnN0YWxsZWQsIGFuZCBpZiBzbyByZXR1cm4gbGludXhvbGRsZCBhcyB0aGUgc3lzdGVtIG5hbWUuCi0KLVdlZCBBcHIgMjYgMTA6NTk6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIGhwcGExLjEtaHAtbGl0ZXMgc3VwcG9ydC4KLQotVHVlIEFwciAyNSAxMTowODoxMSAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmV3bGliIGZvciBtNjhrLXZ4d29ya3M1LjEuCi0KLVdlZCBBcHIgMTkgMTc6MDI6NDMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXg2KTogVXNlIG1oLWlyaXg1LgotCi1GcmkgQXByIDE0IDE1OjIxOjE3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nY2MpOiBEZXBlbmQgb24gYWxsLWxkIChmb3IgbGliZ2NjMS10ZXN0KS4KLQotV2VkIEFwciAxMiAxNjowNjowMSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogdGVzdC1idWlsZC5tazogRW5hYmxlIGJ1aWxkaW5nIG9mIHNoYXJlZCBsaWJyYXJpZXMgb24gSVJJWCA1IGFuZAotICAgICAgICBPU0YvMS4gIEZpeCBjb21waWxlciBmbGFncy4KLQkqIGJ1aWxkLWFsbC5tazogU3VwcG9ydCBMaW51eCBhbmQgT1NGLzEgMy4wLiAgRml4IGNvbXBpbGVyIGZsYWdzLgotCi1UdWUgQXByIDExIDE4OjU1OjQwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIC0td2l0aC1uZXdsaWIuCi0JKHNwYXJjLSotc3Vub3M0Kik6IEJ1aWxkIHNpbSwgZGVqYWdudSwgZXhwZWN0LCB0Y2wgaWYgY3Jvc3MgdGFyZ2V0LgotCi1Nb24gQXByIDEwIDExOjQyOjIyIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgotCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBnZW5lcmljIGluY2x1ZGUgZm9yd2FyZHMgZm9yIGNwdS1zcGVjaWZpYwotCWluY2x1ZGUgZmlsZXMgaW4gYW91dCBhbmQgZWxmIGRpcmVjdG9yaWVzLgotCi0JKiBtcHctY29uZmlndXJlOiBBZGRlZCBjb3B5cmlnaHQuCi0JKiBtcHctY29uZmlnLmluOiBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgcmVxdWlyZWQgYnVpbGQgdG9vbHMuCi0JKHRhcmdldF9saWJzKTogQWRkIG5ld2xpYi4KLQkodGFyZ2V0X3Rvb2xzKTogQWRkIGV4YW1wbGVzLgotCShSZWFkIE1lKTogR2VuZXJhdGUgYXMgIlJlYWQgTWUgZm9yIE1QVyIgaW5zdGVhZC4KLQkqIG1wdy1idWlsZC5pbjogQmFzZSBzdWItYnVpbGRzIG9uIGFsbC1mb28gaW5zdGVhZCBvZiBkby1mb28uCi0JKGFsbC1ieWFjYywgZG8tYnlhY2MsIGFsbC1mbGV4LCBkby1mbGV4LCBkby1uZXdsaWIpOiBOZXcgYWN0aW9ucy4KLQkoZG8tZ2FzLCBkby1nY2MsIGRvLWdkYiwgZG8tbGQpOiBCdWlsZCBWZXJzaW9uLnIgZmlyc3QuCi0KLQkqIG1wdy1jb25maWd1cmU6IFJlbW92ZSBzdWJkaXItc3BlY2lmaWMgbWFrZWZpbGUgaGFja2VyeSwKLQlkZWxldGUgbWsudG1wIGFmdGVyIHVzaW5nIGl0LgotCi0JKiBtcHctYnVpbGQuaW4gKGFsbCk6IERpc3BsYXkgc3RhcnQgYW5kIGVuZCB0aW1lcy4KLQotCSogbXB3LWNvbmZpZ3VyZSAoaG9zdF9jYW5vbmljYWwpOiBTZXQuCi0JKHRhcmdldF9jcHUpOiBBbHdheXMgYWRkIHRvIG1ha2VmaWxlcy4KLQkoQVJDSERFRlMsIEVNVUwpOiBBZGQgdG8gbWFrZWZpbGUgb25seSBpZiBub25lbXB0eS4KLQkoVE1fRklMRSwgWE1fRklMRSwgTk1fRklMRSk6IE5vIGxvbmdlciBhZGQgdG8gbWFrZWZpbGUuCi0JKG1wdy1taC1tcHcpOiBMb29rIGZvciBpbiBzcmNkaXIgYW5kIHNyY3Jvb3QuCi0JVXNlIHNlZCBpbnN0ZWFkIG9mIG1wdy1lZGl0LXByZWZpeCB0byBlZGl0IHByZWZpeCBkZWZpbml0aW9ucy4KLQotCSogbXB3LWJ1aWxkLmluOiAoaW5zdGFsbC1vbmx5KTogTmV3IHRhcmdldC4KLQotCSogbXB3LWNvbmZpZ3VyZSAoaG9zdF9hbGlhcywgdGFyZ2V0X2FsaWFzKTogUmVuYW1lIGZyb20gaG9zdGFsaWFzCi0JYW5kIHRhcmdldGFsaWFzLCBhZGQgaW50byBnZW5lcmF0ZWQgTWFrZWZpbGUuCi0JKG1rLnRtcCk6IElmIHByZXNlbnQsIGFkZCBpbnRvIGdlbmVyYXRlZCBNYWtlZmlsZS4KLQkqIG1wdy1idWlsZC5pbiAoYWxsLWdhcyk6IEJ1aWxkIGNvbmZpZy5oIGZpcnN0IGJlZm9yZSBnYXMgcHJvcGVyLgotCi0JKiBtcHctY29uZmlndXJlIChjb25maWcuc3RhdHVzKTogV3JpdGUgb25seSBpZiBjaGFuZ2VkLgotCSogbXB3LWNvbmZpZy5pbiAocmVhZGxpbmUpOiBDb25maWd1cmUgaXQgKG5vdCBidWlsdCwganVzdCB1c2VkIGZvcgotCWRlZmluaXRpb25zKS4KLQotCSogbXB3LWNvbmZpZy5pbiAoZWxmL21pcHMuaCk6IEFkZCBhIGZvcndhcmQgaW5jbHVkZS4KLQotCSogbXB3LWNvbmZpZy5pbjogRm9yd2FyZC1pbmNsdWRlIG1vc3QgLmggZmlsZXMgaW4gaW5jbHVkZSBpbnRvCi0JZXh0cmEtaW5jbHVkZS4KLQkocmVhZGxpbmUpOiBEb24ndCBidWlsZC4KLQltcHctYnVpbGQuaW4gKGluc3RhbGwpOiBJbnN0YWxsIEdEQi4KLQotCSogbXB3LWNvbmZpZ3VyZSAocHJlZml4LCBtcHdfcHJlZml4KTogSGFuZGxlIGl0LgotCSogbXB3LWNvbmZpZy5pbiAobW1hbGxvYywgcmVhZGxpbmUpOiBEb24ndCBjb25maWd1cmUuCi0JKiBtcHctYnVpbGQuaW4gKHRoaXNzY3JpcHQpOiBSZW5hbWUgdG8gVGhpc1NjcmlwdC4KLQlVc2UgbXB3LWJ1aWxkIGluc3RlYWQgb2YgQnVpbGRQcm9ncmFtIGV2ZXJ5d2hlcmUuCi0JKG1tYWxsb2MsIHJlYWRsaW5lKTogRG9uJ3QgYnVpbGQuCi0JKiBtcHctUkVBRE1FOiBOZXcgZmlsZSwgYmFzaWMgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgTVBXIHBvcnQuCi0KLQkqIG1wdy1jb25maWcuaW46IFVzZSBmb3J3YXJkLWluY2x1ZGUgdG8gY3JlYXRlIGluY2x1ZGUgZmlsZXMuCi0KLQkqIG1wdy1jb25maWd1cmU6IEFkZCBtb3JlIHRoaW5ncyB0byB0aGUgdG9wIG9mIGVhY2ggY29uZmlndXJlZAotCU1ha2VmaWxlLCBpbmNsdWRpbmcgY29udGVudHMgb2YgY29uZmlnL21wdy1taC1tcHcuCi0JKiBtcHctY29uZmlnLmluIChleHRyYS1pbmNsdWRlKTogQ3JlYXRlIHRoaXMgZGlyZWN0b3J5IGFuZCBmaWxsIGl0Ci0Jd2l0aCBQb3NpeC1saWtlIGluY2x1ZGUgZmlsZXMgd2hlbiBjb25maWd1cmluZy4KLQotCSogY29uZmlnLnN1YiAoYXBwbGUsIG1hYywgbXB3KTogQWRkIHZhcmlvdXMgYWxpYXNlcy4KLQotCSogbXB3LWJ1aWxkLmluOiBOZXcgZmlsZSwgdG9wLWxldmVsIGJ1aWxkIHNjcmlwdCBmcmFnbWVudCBmb3IgTVBXLgotCSogbXB3LWNvbmZpZ3VyZTogTmV3IGZpbGUsIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIE1QVy4KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBjb25maWcgZnJhZ21lbnQgZm9yIE1QVy4KLQotRnJpIEFwciAgNyAxOTozMzoxNiAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0X2xpYnMpOiBSZW1vdmUgZ2xvYiwgc2luY2UgaXQgaXMgZ29uZSBmcm9tIHRoZQotCXNvdXJjZXMuCi0KLUZyaSBNYXIgMzEgMTE6MzY6MTcgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgZW1wdHkgR0RCX05MTV9ERVBTIHZhci4KLQotCSogY29uZmlndXJlLmluKHRhcmdldF9tYWtlZmlsZV9mcmFnKTogdXNlIGNvbmZpZy9tdC1uZXR3YXJlCi0JZm9yIG5ldHdhcmUgdGFyZ2V0cy4KLQotVGh1IE1hciAzMCAxMzo1MTo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1lcmdlIGluIHJlY2VudCBGU0YgY2hhbmdlcy4gIFJlbW92ZSBsaW51eCBzcGVjaWFsCi0JY2FzZXMuCi0KLVR1ZSBNYXIgMjggMTQ6NDc6MzQgMTk5NSAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCWJ1aWxkLWFsbC5tayxjb25maWcvbWgtc29sYXJpczogIHJldmVydCB0aGVzZSB0d28gY2hhbmdlczoKLQotCVR1ZSBNYXIgMzAgMTA6MDM6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JCSogYnVpbGQtYWxsLm1rOiBVc2UgQ0M9Y2MgLVhzIG9uIFNvbGFyaXMuCi0KLQlNb24gTWFyIDI5IDE5OjU5OjI2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCQkqIGNvbmZpZy9taC1zb2xhcmlzOiBTdW5QUk8gQyBuZWVkcyAtWHMgdG8gYmUgYWJsZSB0byBnZXQgYQotCQl3b3JraW5nIHhtYWtlZmlsZSBmb3IgRW1hY3MuCi0KLVR1ZSBNYXIgMjEgMTA6NDM6MzIgMTk5NSAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGdsb2IvKjogUmVtb3ZlZC4gIFNjaGF1ZXIncyAyNCBGZWIgMTk5NCByZWFkbGluZSBjaGFuZ2UgbWFkZSB1cwotCXN0b3AgdXNpbmcgaXQuCi0JKiBNYWtlZmlsZS5pbjogTnVrZSBhbGwgcmVmZXJlbmNlcyB0byBnbG9iIHN1YmRpcmVjdG9yeS4KLQotVGh1IE1hciAxNiAxMzozNTozMCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGaXggLS1lbmFibGUtc2hhcmVkIGxvZ2ljIGluIHBlci1ob3N0LgotCi1Nb24gTWFyIDEzIDEyOjMzOjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICgqLWhwLWhwdXhbNzhdKik6IFVzZSBtaC1ocHV4OC4KLQotTW9uIE1hciAgNiAxMDoyMTo1OCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChub2NvbmZpZ2RpcnMpOiBEb24ndCBidWlsZCBnYXMgb24gQUlYLCBmb3IKLQlwb3dlcnBjKi0qLWFpeCogYXMgd2VsbCBhcyBmb3IgcnM2MDAwKi0qLWFpeCouCi0KLVdlZCBNYXIgIDEgMTI6NTE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEZpeCAtLWNhY2hlLWZpbGUgdG8gd29yayBpZiB0aGUgZmlsZSBhcmd1bWVudCBpcyBhCi0JcmVsYXRpdmUgcGF0aC4KLQotVHVlIEZlYiAyOCAxNzozNjowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogSWYgdGhlIC0tY2FjaGUtZmlsZSBpcyB1c2VkLCBwYXNzIGl0IGRvd24gdG8KLQljb25maWd1cmUgaW4gc3ViZGlyZWN0b3JpZXMuCi0KLU1vbiBGZWIgMjcgMTI6NTI6NDYgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogYWRkIHZ4d29ya3MyOWsgY29uZmlndXJhdGlvbi4KLQotRnJpIEZlYiAxMCAxNjoxMjoyNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogRG8gImRpc3RzdHVmZiIgcGFydCBxdWlldGx5LgotCi1TdW4gRmViICA1IDE0OjE2OjM1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5zdWI6IE1pbmktbWVyZ2Ugd2l0aCBnY2MvY29uZmlnLnN1Yi4KLQotU2F0IEZlYiAgNCAxMjoxMTozNSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzcyAoSVJJWCk6IFNlZCAtIHRvIF8uCi0KLUZyaSBGZWIgIDMgMTE6NTQ6NDIgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoc291cmNlLXZhdWx0LCBiaW5hcnktdmF1bHQpOiBOZXcgdGFyZ2V0cy4KLQotVGh1IEphbiAyNiAxMzowMDoxMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIC1lYWJpIGFzIGEgYmFzaWMgc3lzdGVtIHR5cGUuCi0KLVRodSBKYW4gMTIgMTM6MTM6MjMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW5hYmxlX3NoYXJlZCBzdHVmZik6IEZpeCB0eXBvLgotCi1UaHUgSmFuIDEyIDAxOjM2OjUxIDE5OTUgIGRlYW5tQG1lZHVsbGEuTEFCUy5URUsuQ09NIChEZWFuIE1lc3NpbmcpCi0KLQkqIE1ha2VmaWxlLmluIChCQVNFX0ZMQUdTX1RPX1BBU1MpOiBGaXggdHlwbyBpbiBwYXNzaW5nIExJQkNYWEZMQUdTKi4KLQotV2VkIEphbiAxMSAxNjoyOTo1MyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpOiBBZGQgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMuCi0KLU1vbiBKYW4gIDkgMTI6NDg6MDEgMTk5NSAgSmltIEtpbmdkb24gIDxraW5nZG9uQGxpb3RoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDAwLSotKik6IERvbid0IGJ1aWxkIGdhcy4KLQotV2VkIEphbiAgNCAyMzo1Mzo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBVc2UgL3gveC8gaW5zdGVhZCBvZiAvYnJva2Vuc2VkL2Jyb2tlbnNlZC8sIHRvCi0JcmVkdWNlIGNvbW1hbmQgbGluZSBsZW5ndGguCi0JKEFTX0ZPUl9UQVJHRVQpOiBDaGVjayBmb3IgYXMubmV3LCBub3QgTWFrZWZpbGUuCi0JKE5NX0ZPUl9UQVJHRVQpOiBDaGVjayBmb3Igbm0ubmV3LCBub3QgTWFrZWZpbGUuCi0KLVdlZCBKYW4gIDQgMTM6MDI6MzkgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIGZyb20gRlNGLgotCi1UaHUgRGVjIDE1IDE3OjExOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBEb24ndCB1c2UgJCB3aGVuIGhhbmRsaW5nIHByb2dyYW1fc3VmZml4LgotCi1Nb24gRGVjIDEyIDEyOjA5OjM3IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENvbmZpZ3VyZSB0ayBmb3IgaHBwYS9ocHV4LgotCi1GcmkgRGVjICAyIDE1OjU1OjM4IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTElCR1hYX1NVUFBPUlRfRElSUyk6ICBBZGQgbGlic3RkYysrLgotCi1UdWUgTm92IDI5IDE5OjM3OjU2IDE5OTQgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogIE1vdmUgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZSBmcm9tIENYWEZMQUdTCi0JdG8gTElCQ1hYRkxBR1MuICBUZXN0cyBhcmUgYmV0dGVyIHJ1biB3aXRob3V0IGl0LgotCi1XZWQgTm92IDIzIDEwOjI5OjI1IDE5OTQgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1pc3BlbGwpOiBEZXBlbmQgb24gYWxsLWVtYWNzMTkgaW5zdGVhZCBvZiBhbGwtZW1hY3MuCi0KLU1vbiBOb3YgMjEgMTE6MTQ6MDEgMTk5NCAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlKik6IERvbid0IGNvbmZpZ3VyZSB4aWJlcnR5LgotCi1Nb24gTm92IDE0IDA4OjQ5OjE1IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFJlbW92ZSB0ayBmcm9tIG5hdGl2ZV9vbmx5IGxpc3QuCi0KLUZyaSBOb3YgMTEgMTU6MzE6MjYgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IEFkZCBtaXBzLW5jZC1lbGYgdGFyZ2V0IHRvIHN1bjQgdGFyZ2V0cwotCSAgZm9yIHNwZWNpYWwgTkNEIGJ1aWxkLgotCi1Nb24gTm92ICA3IDIwOjU4OjE3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChERVZPX1NVUFBPUlQpOiBSZW1vdmUgY29uZmlndXJlLmJhdCBhbmQKLQltYWtlYWxsLmJhdCwgdGhleSdyZSBvbmx5IHVzZWZ1bCBmb3IgYmludXRpbHMgc25hcHNob3RzLgotCShiaW51dGlscy50YXIuZ3osIGdhcytiaW51dGlscy50YXIuZ3opOiBBZGQgY29uZmlndXJlLmJhdCBhbmQKLQltYWtlYWxsLmJhdCB0byBzcGVjaWZpZWQgU1VQUE9SVF9GSUxFUy4KLQotTW9uIE5vdiAgNyAxNzoyNToxOCAxOTk0ICBCaWxsIENveCAgKGJpbGxAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5tazogQWRkIEVyaWNzc29uIHRhcmdldHMgdG8gc3VuNCBhbmQgc29sYXJpcwotCSAgaG9zdHMuICBBZGQgIEJOUidzIHN1bjQgdGFyZ2V0IHRvIHNvbGFyaXMgaG9zdCwgc28gdGhlaXIKLQkgIGJ1aWxkLWZyb20tc291cmNlIHdpbGwgYmUgdGVzdGVkIGluLWhvdXNlIGZpcnN0LgotCi1TYXQgTm92ICA1IDE4OjQzOjMwIDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTElCQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShDRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShMSUJDRkxBR1NfRk9SX1RBUkdFVCk6IERpdHRvLgotCShMSUJDWFhGTEFHUyk6IERpdHRvLgotCShDWFhGTEFHU19GT1JfVEFSR0VUKTogRGl0dG8uCi0JKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpOiBEaXR0by4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyB0aGVtLgotCShFWFRSQV9UQVJHRVRfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbVt0aF0tKnBpYzogU3VwcG9ydCAtLWVuYWJsZS1zaGFyZWQuCi0KLVNhdCBOb3YgIDUgMTU6NDQ6MDAgMTk5NCAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0X2xpYnMpOiAgSW5jbHVkZSBsaWJzdGRjKysgYWdhaW4uCi0JKiBjb25maWcuZ3Vlc3M6ICBVcGRhdGUgZnJvbSBGU0YgKGZvciBGcmVlQlNEKS4KLQotVGh1IE5vdiAgMyAxNjozMjozMCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogSW5jbHVkZSBjb25maWd1cmUuYmF0IGFuZAotCW1ha2VhbGwuYmF0LgotCShESVNURE9DRElSUyk6IEFkZCBgZXRjJy4KLQkoRVRDX1NVUFBPUlRfUEZYKTogTmV3IHZhcmlhYmxlLgotCSh0YXopOiBJbmNsdWRlIGFueXRoaW5nIGZyb20gZXRjIHN0YXJ0aW5nIHdpdGggYSB3b3JkIGluCi0JRVRDX1NVUFBPUlRfUEZYLgotCi1XZWQgT2N0IDI2IDE2OjE5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogVXBkYXRlIGZvciByZWNlbnQgRlNGIGNoYW5nZXMuICBSZW1vdmUgb2Jzb2xldGUKLQloODMwMGhkcyBlbnRyeS4gIEFkZCAtd2luZG93cyogYW5kIC1vc3ggYXMgYmFzaWMgb3MuICBNaW5vcgotCXNwYWNpbmcgY2hhbmdlcy4KLQotVGh1IE9jdCAyMCAxODo0MTo1NiAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh0YXJnZXRfbGlicyk6ICBSZW1vdmUgbGlic3RkYysrIGZvciBsaWJnKystMi42LjEuCi0KLQkqIGNvbmZpZy5ndWVzczogIE1lcmdlIHdpdGggRlNGLgotCSogY29uZmlndXJlLmluOiAgTWF0Y2ggb24gaT84Ni1uY3Itc3lzdjQuMywgbm90IGk/ODYtbmNyLXN5c3Y0My4KLQotVGh1IE9jdCAyMCAxOToyNjo1NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNpbmNlIHRoZSAidHJhcCAwIiBoYW5kbGVyIHdpbGwgb3ZlcnJpZGUgdGhlIGV4aXQKLQlzdGF0dXMgb24gbWFueSBzeXN0ZW1zLCBvbmx5IHVzZSBpdCBmb3IgImV4aXQgMSIsIGFuZCBtYWtlIGl0IHNldAotCWEgbm9uLXplcm8gZXhpdCBzdGF0dXM7IHJlc2V0IGl0IGJlZm9yZSAiZXhpdCAwIi4gIEFsc28sIGNoZWNrCi0JZXhpdCBzdGF0dXMgb2YgY29uZmlnLnN1YiwgYW5kIGVycm9yIG91dCBpZiBpdCBmYWlsZWQuCi0KLVdlZCBPY3QgMTkgMTg6NDk6NTUgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogKEFMTF9UQVJHRVRfTU9EVUxFUyxJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBCdWlsZAotCWFuZCBpbnN0YWxsIGxpYmdsb3NzLgotCi1UdWUgT2N0IDE4IDE1OjI1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1iaW51dGlscyk6IERlcGVuZCB1cG9uIGFsbC1ieWFjYy4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBlbWFjcyBvbiBJcml4IDUuCi0KLU1vbiBPY3QgMTcgMTY6MjI6MTIgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlKik6IEFkZCBsaWJpby4KLQotVGh1IE9jdCAxMyAxNTo1MToyMCAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9UQVJHRVRfTU9EVUxFUyk6IEFkZCBsaWJzdGRjKysuCi0JKENIRUNLX1RBUkdFVF9NT0RVTEVTKTogRGl0dG8uCi0JKElOU1RBTExfVEFSR0VUX01PRFVMRVMpOiBEaXR0by4KLQkoVEFSR0VUX0xJQlMpOiBEaXR0by4KLQkoYWxsLWxpYnN0ZGMrKyk6IE5vdGUgZGVwZW5kZW5jaWVzLgotCi1UaHUgT2N0IDEzIDAxOjQzOjA4IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBBZGQgZ2FzLgotCi1UdWUgT2N0IDExIDEyOjEyOjI5IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ1hYRkxBR1MpOiBVc2UgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMgaW5zdGVhZCBvZgotCS1mZXh0ZXJuYWwtdGVtcGxhdGVzLgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldF9saWJzKTogQWRkIGxpYnN0ZGMrKy4KLQkobm9jb25maWdkaXJzKTogQWRkIGxpYnN0ZGMrKyBhcyBhcHByb3ByaWF0ZS4KLQotVGh1IE9jdCAgNiAxODowMDo1NCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgVXBkYXRlIGZyb20gRlNGLgotCi1UdWUgT2N0ICA0IDEyOjA1OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBVc2UgJHtjb25maWdfc2hlbGx9IHdoZW4gcnVubmluZyAke2NvbmZpZ3N1Yn0uCi0KLU1vbiBPY3QgIDMgMTQ6Mjg6MzQgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnN1YjogTm8gbG9uZ2VyIHJlY29nbml6ZSBoODMwMGguCi0KLU1vbiBPY3QgIDMgMTI6NDA6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuc3ViOiBSZW1vdmUgZXh0cmFuZW91cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbmZpZy5zdWIgYW5kCi0JZ2NjL2NvbmZpZy5zdWIuCi0KLVNhdCBPY3QgIDEgMDA6MjM6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRkRJUlMpOiBBZGQgZ2FzLgotCi1UaHUgU2VwIDIyIDE5OjA0OjU1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIENPUFlJTkcuTkVXTElCOiBOZXcgZmlsZS4KLQotTW9uIFNlcCAxOSAxODoyNTo0MCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChIUC1VWCk6ICBQYXRjaCBmcm9tIEhhcmxhbiBTdGVubgotCTxoYXJsYW5AbGFuZG1hcmsuY29tPiB0byBhbHNvIGVtaXQgcmVsZWFzZSBsZXZlbC4KLQotV2VkIFNlcCAgNyAxMzoxNToyNSAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAoc3VuNCo6U3VuT1M6KjoqKTogQ2hhbmdlICctSkwnIHRvICdfSkwnLgotCi1UdWUgU2VwICA2IDIzOjIzOjE4IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgTWVyZ2UgbmV4dHN0ZXAgY2xlYW51cCBmcm9tIEZTRi4KLQotTW9uIFNlcCAgNSAwNTowMTozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhcm0tKi0qKTogRG9uJ3QgY29uZmlndXJlIGxkIGZvciB0aGlzIHRhcmdldC4KLQotVGh1IFNlcCAgMSAwOTozNTowMCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLW5ldHdhcmUpOiBkb24ndCBjb25maWd1cmUgbGliZysrLCBsaWJpbywKLQkgIGxpYnJ4LCBvciBuZXdsaWIuCi0KLVdlZCBBdWcgMzEgMTM6NTI6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGFscGhhLWRlYy1vc2YqKTogVXNlIG9zZiosIG5vdCBvc2YxKi4gIERvbid0Ci0JY29uZmlndXJlIGxkLS1pdCB3b3JrcywgYnV0IGl0IGRvZXNuJ3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi1TdW4gQXVnIDI4IDE4OjEzOjQ1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3MgKCotdW5rbm93bi1mcmVlYnNkKik6ICBHZXQgcmlkIG9mIHBvc3NpYmxlCi0JdHJhaWxpbmcgIihSZWxlYXNlKSIgaW4gdmVyc2lvbiBzdHJpbmcuCi0JUGF0Y2ggZnJvbSBQYXVsIFJpY2hhcmRzIDxwYXVsQGlzbC5jZi5hYy51az4uCi0KLVNhdCBBdWcgMjcgMTU6MDA6NDkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEZpeCBpNDg2LW5jci1zeXN2NDMgLT4gaTQ4Ni1uY3Itc3lzdjQuMy4KLQlGaXggdHlwZTogKi1uZXh0LW5lc3RzdGVwIC0+ICotbmV4dC1uZXh0c3RlcC4KLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0Y6Ci0KLQlGcmkgQXVnIDI2IDE4OjQ1OjI1IDE5OTQgIFBoaWxpcHBlIERlIE11eXRlciAocGhkbUBpbmZvLnVjbC5hYy5iZSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgcG93ZXJwYy1pYm0tYWl4My4yLjUuCi0KLQlXZWQgQXByIDIwIDA2OjM2OjMyIDE5OTQgIFBoaWxpcHBlIERlIE11eXRlciAgKHBoZG1AaW5mby51Y2wuYWMuYmUpCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIFVuaXhXYXJlIDEuMSAoVU5BTUVfU1lTVEVNIGlzIFNZU1RFTV9WCi0JaW5zdGVhZCBvZiBVTklYX1NWIGZvciBVbml4V2FyZSAxLjApLgotCi1TYXQgQXVnIDI3IDAxOjU2OjMwIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2RiKTogIEFkZCBkZXBlbmRlbmNpZXMgb24gYWxsLWdjYyBhbmQgYWxsLWxkCi0JdG8gbWFrZSBnZGIvbmxtLyogYnVpbGQgYWZ0ZXIgdGhlIGNvbXBpbGVyIGFuZCBsaW5rZXIuCi0KLUZyaSBBdWcgMjYgMTQ6MzA6MDUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzcyAobmV0YnNkLCBmcmVlYnNkLCBsaW51eCk6ICBBY2NlcHQgYW55IG1hY2hpbmUsCi0Jbm90IGp1c3QgaVszNF04Ni4KLQkobTY4ay1hdGFyaS1zeXN2NCk6ICBSZWxvY2F0ZSB0byBtYXRjaCBGU0YgdmVyc2lvbi4KLQotCSogY29uZmlnLmd1ZXNzOiAgTW9yZSBtZXJnZXMgZnJvbSB0aGUgRlNGOgotCi0JQWRkIGEgc3BhY2UgYmVmb3JlIGZ1bmN0aW9uIGNhbGwgb3IgbWFjcm8gaW52b2NhdGlvbi4KLQotCVR1ZSBNYXkgMTAgMTY6NTM6NTUgMTk5NCAgUm9sYW5kIE1jR3JhdGggKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEFkZCB0cmFwIGNtZCB0byByZW1vdmUgZHVtbXkuYyBhbmQgZHVtbXkgd2hlbgotCWludGVycnVwdGVkLgotCi0JV2VkIEFwciAyMCAxODowNzoxMyAxOTk0ICBSb2xhbmQgTWNHcmF0aCAocm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzcyAoZHVtbXkuYyk6IFJlZGlyZWN0IHN0ZGVyciBmb3IgYGhvc3RpbmZvJyBjb21tYW5kLgotCShkdW1teSk6IFJlZGlyZWN0IHN0ZGVyciBmcm9tIGNvbXBpbGF0aW9uIG9mIGR1bW15LmMuCi0KLQlTYXQgQXByICA5IDE0OjU5OjI4IDE5OTQgIENocmlzdGlhbiBLcmFueiAgKGtyYW56QHNlbnQ1LnVuaS1kdWlzYnVyZy5kZSkKLQotCSogY29uZmlnLmd1ZXNzOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIE5lWFRTdGVwIDIuMSBhbmQgMy54LgotCi1GcmkgQXVnIDI2IDEzOjQyOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBBY2NlcHQgYW5kIGlnbm9yZSAtLWNhY2hlKiwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotCW5ldyBhdXRvY29uZi4KLQotRnJpIEF1ZyAyNiAxMzowNToyNyAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgTWVyZ2UgZnJvbSBGU0Y6Ci0KLQlUaHUgQXVnIDI1IDIwOjI4OjUxIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIDxybXNAbW9sZS5nbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnLmd1ZXNzIChQeXJhbWlkKjpPU3gqOio6Kik6IE5ldyBjYXNlLgotICAgICAgICAoUEFUSCk6IEFkZCAvLmF0dGJpbiBhdCBlbmQgZm9yIGZpbmRpbmcgdW5hbWUuCi0gICAgICAgIChkdW1teS5jKTogSGFuZGxlIGk4NjAtYWxsaWFudC1ic2QuICBGb2xsb3cgd2hpdGVzcGFjZSBjb252ZW50aW9ucy4KLQotCVdlZCBBdWcgMTcgMTg6MjE6MDIgMTk5NCAgVG9yIEVnZ2UgICh0ZWdnZUBwdnYudW5pdC5ubykKLQotICAgICAgICAqIGNvbmZpZy5ndWVzcyAoTTg4KjpEb2xwaGluT1M6KjoqKTogTmV3IGNhc2UuCi0KLQlUaHUgQXVnIDExIDE3OjAwOjEzIDE5OTQgIFN0YW4gQ294ICAoY294c0BkZy1ydHAuZGcuY29tKQotCi0gICAgICAgICogY29uZmlnLmd1ZXNzIChBVmlpT046ZGd1eDoqOiopOiBVc2UgVEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0UKLSAgICAgICAgdG8gc2VsZWN0IHdoZXRoZXIgdG8gdXNlIEVMRiBvciBDT0ZGLgotCi0JU3VuIEp1bCAyNCAxNjoyMDo1MyAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICA8cm1zQG1vbGUuZ251LmFpLm1pdC5lZHU+Ci0KLSAgICAgICAgKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBpODYwLXN0YXJkZW50LXN5c3YgYW5kIGk4NjAtdW5rbm93bi1zeXN2LgotCi0JU3VuIE1heSAgMSAxMDoyMzoxMCAxOTk0ICBSaWNoYXJkIFN0YWxsbWFuICAocm1zQG1vbGUuZ251LmFpLm1pdC5lZHUpCi0KLQkqIGNvbmZpZy5ndWVzczogR3Vlc3MgdGhlIE9TIHZlcnNpb24gZm9yIEhQVVguCi0KLQlUdWUgTWFyICAxIDIxOjUzOjAzIDE5OTQgIEthcmwgSGV1ZXIgIChrd3poQGhhbC5nbnUuYWkubWl0LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzIChVTkFNRV9WRVJTSU9OKTogUmVjb2duaXplIGFpeDMuMi40IGFuZCBhaXgzLjIuNS4KLQotRnJpIEF1ZyAyNiAxMToxOTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIC0td2l0aC1oZWFkZXJzLCAtLXdpdGgtbGlicywgYW5kCi0JLS13aXRob3V0LW5ld2xpYi4KLQkqIE1ha2VmaWxlLmluIChhbGwteGliZXJ0eSk6IERlcGVuZCB1cG9uIGFsbC1sZC4KLQotV2VkIEF1ZyAyNCAxMjozNjo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGlbMzRdODYgdG8gaVszNDVdODYuCi0KLU1vbiBBdWcgMjIgMTA6NTg6MzMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUgKHZlcnNpb24pOiBBIGZldyBtb3JlIHR3ZWFrcyB0byBoZWxwIG1lc3NhZ2UuCi0KLUZyaSBBdWcgMTkgMTI6NDA6MjUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlIChmb3Igbm93KSBsaWJyeCBhcyBhIGhvc3QgbGlicmFyeSwKLQlub3cgdGhhdCB3ZSdyZSBidWlsZGluZyBpdCBmb3IgdGFyZ2V0LgotCi1GcmkgQXVnIDE5IDEwOjQ5OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBGaXggdXAgaGVscCBtZXNzYWdlOyBmcm9tIGthcmxAb3dsLmhxLmlsZWFmLmNvbQotCShLYXJsIEJlcnJ5KS4KLQotVHVlIEF1ZyAxNiAxNjoxMTowOCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWxzbyBjb25maWd1cmUgbGlicnguCi0KLU1vbiBBdWcgMTUgMTY6NTE6NDUgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIHZhcmlvdXMgcnVsZXMgdG8gcmVmbGVjdCB0aGF0IGxpYnJ4Ci0JaXMgbm93IG5lZWRlZCBmb3IgbGliZysrLgotCi1GcmkgQXVnIDEyIDE4OjA3OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IG1pcHM2NG9yaW9uIGFuZCBtaXBzNjRvcmlvbmVsIGFzIGEgQ1BVIG5hbWUuCi0KLU1vbiBBdWcgIDggMTE6MzY6MTcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LgotCi1UaHUgQXVnICA0IDE2OjEyOjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBTaW1wbGlmeSBKdW4gMiAxOTk0IGNoYW5nZS4KLQotV2VkIEF1ZyAgMyAwNDo1ODoxNiAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNoYW5nZSBDQyB0byAvdXNyL2xhdGVzdC9iaW4vZ2NjIGZvciBseW54IGhvc3QgYnVpbGRzLCBzaW5jZQotCS9iaW4vZ2NjIGlzbid0IGdvb2QgZW5vdWdoIHRvIGJ1aWxkIGdjYy4KLQotV2VkIEp1bCAyNyAwOTowNzoxNCAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEdEQl9TVVBQT1JUX0ZJTEVTKTogUmVtb3ZlCi0JKHNldHVwLWRpcnMtZ2RiLCBnZGIudGFyLmd6LCBtYWtlLWdkYi50YXIuZ3opOiAgUmVtb3ZlIG9sZCBydWxlcy4KLQkoZ2RiLnRhci5neik6IEFkZCBuZXcgcnVsZSB0byB1c2Ugc3RhbmRhcmQgZGlzdHJpYnV0aW9uIGJ1aWxkaW5nCi0JbWVjaGFuaXNtLgotCi1Nb24gSnVsIDI1IDExOjEwOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBXYXJuIGFib3V0IHVzZSBvZiAvdXNyL3VjYi9jYyBvbiBTb2xhcmlzLiAgRnJvbQotCUJpbGwgQ294IDxiaWxsQGN5Z251cy5jb20+LgotCi1TYXQgSnVsIDIzIDEyOjE5OjQ2IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgSVNDLiAgUGF0Y2ggZnJvbSBrd3poQGdudS5haS5taXQuZWR1LgotCi1GcmkgSnVsIDIyIDE3OjUzOjU5IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIFNlYXJjaCBjdXJyZW50IGRpciBmaXJzdCBpbiAuZ2RiaW5pdC4KLQotRnJpIEp1bCAyMiAxMToyODozMCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIFJlY29nbml6ZSBmcmVlYnNkIChtZXJnZWQgZnJvbSBnY2MgY29uZmlnLnN1YikuCi0KLVRodSBKdWwgMjEgMTQ6MTA6NTIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBSZWZlciB0byBOZVhUJ3Mgb3BlcmF0aW5nIHN5c3RlbSBhcyBuZXh0c3RlcC4KLQotCSogY29uZmlnLnN1YiAoY2FzZSAkYmFzaWNfbWFjaGluZSk6ICBSZS1vcmRlciB0aGUgY2FzZXMsIHRvIG1hdGNoCi0JdGhlIG9yZGVyIGluIHRoZSBGU0YgdmVyc2lvbiAod2hpY2ggaXMgbW9zdGx5IGFscGhhYmV0aGljYWwpLgotCU1lcmdlIGluIHNvbWUgYWRkaXRpb25zIGFuZCBjaGFuZ2VzIGZyb20gdGhlIEZTRi4KLQotU2F0IEp1bCAxNiAxMjowMzowOCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG02OGstYXRhcmktc3lzdjQgYW5kIG04OGstaGFycmlzLWNzdXg3LgotCSogY29uZmlnLnN1YjogUmVjb2duaXplIGN4dXg3LgotCSogY29uZmlndXJlLmluOiBVc2UgbWgtY3h1eCBmb3IgbTg4ay1oYXJyaXMtY3h1eCouCi0KLU1vbiBKdWwgMTEgMTQ6Mzc6MzkgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBGaXggdHlwbyBwb3dlcnBjIC0+IHBvd2VycGMtKi4KLQotU2F0IEp1bCAgOSAxMzowMzo0MyAxOTk0ICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGJsdWVzLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBgYWxsLWVtYWNzMTknIGRlcGVuZHMgb24gYGFsbC1ieWFjYycuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWVtYWNzMTkgYW5kIGluc3RhbGwtZW1hY3MxOSBydWxlcyAoaW4KLQlwYXJhbGxlbCB3aXRoIGFsbC1lbWFjcyBhbmQgaW5zdGFsbC1lbWFjcykuICBUb3AtbGV2ZWwgY29tbWFuZAotCWBtYWtlIGFsbC1lbWFjczE5IENDPWdjYycgbm93IGJlaGF2ZXMgYXMgYG1ha2UgYWxsLWVtYWNzIENDPWdjYycuCi0KLVRodSBKdW4gMzAgMTY6NTM6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rICgkKGhvc3QpLXN0YW1wLXN0YWdlMi1pbnN0YWxsZWQpOiBSZW1vdmUKLQkkKHJlbGJpbmRpcikvbWFrZSBiZWZvcmUgZG9pbmcgYGBtYWtlIGluc3RhbGwnJywgYW5kIHVzZQotCSQoR05VX01BS0UpIHdoaWxlIGRvaW5nIGl0LiAgQXZvaWRzIHByb2JsZW0gb24gU3VuT1Mgd2l0aAotCWluc3RhbGxpbmcgb3ZlciBydW5uaW5nIG1ha2UgYmluYXJ5LgotCSgkKGhvc3QpLXN0YW1wLXN0YWdlMy1pbnN0YWxsZWQpOiBMaWtld2lzZS4KLQotVHVlIEp1biAyOCAxMzo0MzoyNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgTWFjaC4KLQotTW9uIEp1biAyNyAxNjo0MToxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQ2hlY2sgJHtleGVjX3ByZWZpeG9wdGlvbn0sIG5vdCAke2V4ZWNfcHJlZml4fSwgdG8KLQlzZWUgd2hldGhlciAtLWV4ZWMtcHJlZml4IHdhcyB1c2VkLgotCi1TdW4gSnVuIDI2IDIxOjE1OjU0IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBFeHBsaWNpdGx5IG1lbnRpb24gbGliZysrL1JFQURNRS4gIChab28ncyBpZGVhLikKLQotVHVlIEp1biAyMSAxMjo0NTo1NSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtbGlicnggdGFyZ2V0IHNpbWlsYXIgdG8gYWxsLWxpYnByb2MuCi0KLVdlZCBKdW4gIDggMjM6MTE6NTUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVhcnJhbmdlIHRlc3RzIGZvciBBbHBoYS1PU0YxIHRvIHByb3Blcmx5IGRlYWwKLQl3aXRoIHBvc3QgMS4yIHVuYW1lIGJvZ29zaXR5LgotCi1UaHUgSnVuICA5IDAwOjI3OjU5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBSZW1vdmUgdGVtcG9yYXJ5IGZpbGVzIG9uIHJlY2VpcHQgb2YgYSBzaWduYWwuCi0KLVR1ZSBKdW4gIDcgMTI6MDY6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIHRoZXJlIGlzIGEgcGFja2FnZV9tYWtlZmlsZV9mcmFnLCByZW1vdmUKLQkke3N1YmRpcn0vTWFrZWZpbGUudGVtIGFmdGVyIGNvcHlpbmcgaXQgaW4uCi0KLU1vbiBKdW4gIDYgMjE6MzU6MDIgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBidWlsZF9hbGwubWs6IHN1cHBvcnQgcnM2MDAwIGx5bnggaWRlbnRpZmllcyBpdHNlbGYgYXMKLQlyczYwMDAtbHlueC1seW54b3MyLjIuMi4gIEFsc28sIHVzZSAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9iaW4vZ2NjCi0Jc2luY2UgL2Jpbi9nY2MgaXMgdG9vIGZlZWJsZSB0byBjb21waWxlIGEgbW9kZXJuIGdjYy4KLQotTW9uIEp1biAgNiAxNjowNjozNCAxOTk0ICBLYXJlbiBDaHJpc3RpYW5zZW4gKGthcmVuQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBicm91Z2h0IGRldm8vdGVzdC1idWlsZC5tayB1cGRhdGUtdG8tZGF0ZSB3aXRoIHByb2dyZXNzaXZlLwotCSAgdGVzdC1idWlsZC5tay4gQWRkIGx5bnggdGFyZ2V0cyBhbmQgaHBwYSBmbGFnIGluZm8uCi0KLVNhdCBKdW4gIDQgMTc6MjM6NTQgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBtaC1uY3JzdnI0My4gIFBhdGNoIGZyb20KLQlUb20gTWNDb25uZWxsIDx0bWNjb25uZUBzZWRvbmEuaW50ZWwuY29tPi4KLQotRnJpIEp1biAgMyAxNzo0NzoyNCAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChpMzg2LXVua25vd24tYnNkaSk6ICBObyBsb25nZXIgbmVlZCB0bwotCWNoZWNrICNpZiBkZWZpbmVkKF9fYnNkaV9fKSAmJiBkZWZpbmVkKF9faTM4Nl9fKS4KLQotVGh1IEp1biAgMiAxODo1Njo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU2V0IHByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb24gY29ycmVjdGx5LgotCi1UaHUgSnVuICAyIDEwOjU3OjA2IDE5OTQgIEthcmVuIENocmlzdGlhbnNlbiAoa2FyZW5AY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGJyb3VnaHQgYnVpbGQtYWxsLm1rIHVwZGF0ZS10by1kYXRlIHdpdGggcHJvZ3Jlc3NpdmUgYnVpbGQtYWxsLm1rLAotCSAgYWRkZWQgbmV3IHRhcmdldHMgYW5kIGhwcGEgaW5mby4KLQkKLVRodSBKdW4gIDIgMDA6MTI6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIGNvbmZpZy5ndWVzcyByZXN1bHQgaXMgYSBwcmVmaXggb2YgdGhlIHVzZXIKLQlzcGVjaWZpZWQgdGFyZ2V0LCBhc3N1bWUgYSBuYXRpdmUgYnVpbGQgYW5kIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQKLQl0YXJnZXQgYXMgdGhlIGhvc3QgYWxpYXMuICBSZW1vdmUgU3VuT1MgcGF0Y2ggc3VmZml4IHJlbW92YWwgaGFjay4KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIFN1bk9TIHBhdGNoIHN1ZmZpeCByZW1vdmFsIGhhY2suCi0KLQkqIE1ha2VmaWxlLmluIChDUk9TU19DSEVDS19NT0RVTEVTKTogUmVtb3ZlIGNoZWNrLWZsZXgsIHNpbmNlIGl0J3MKLQlpbiBOQVRJVkVfQ0hFQ0tfTU9EVUxFUy4KLQotV2VkIEp1biAgMSAxMDo0OTo0MSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW5hbWUgSE9TVF9PTkxZIHRvIE5BVElWRS4KLQkqIGNvbmZpZ3VyZTogRGVsZXRlIFN1bk9zIHBhdGNoIHN1ZmZpeCBmcm9tIGhvc3RfY2Fub25pY2FsCi0JICBhbmQgYnVpbGRfY2Fub25pY2FsIHZhcmlhYmxlcyB0aGF0IGFyZSBwcmVwZW5kZWQgdG8gTWFrZWZpbGVzLgotCSogY29uZmlndXJlLmluOiBBZGQgY29tbWVudHMgZm9yIGVhc2llciBtYWludGVuYW5jZS4KLQotVHVlIE1heSAzMSAxOTozOTo0NyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBhbGwtbGlicHJvYyB0YXJnZXQgc2ltaWxhciB0byBhbGwtZ3VpLgotCi1UdWUgTWF5IDMxIDE3OjE2OjMzIDE5OTQgIFRvbSBMb3JkICAobG9yZEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQ0hFQ0tfTU9EVUxFUyk6IHNwbGl0IGludG8KLQlIT1NUX09OTFlfQ0hFQ0tfTU9EVUxFUyBhbmQgQ1JPU1NfQ0hFQ0tfTU9EVUxFUy4KLQotVHVlIE1heSAzMSAxNjozNjozNiAxOTk0ICBQYXVsIEVnZ2VydCAgKGVnZ2VydEB0d2luc3VuLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzIChpMzg2LXVua25vd24tYnNkaSk6IE5ldyBzeXN0ZW0gdG8gZ3Vlc3MuCi0KLVdlZCBNYXkgMjUgMTY6NDc6MTAgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgYWxsLWd1aSB0YXJnZXQgKGJ1dCBub3QgeWV0IGJ1aWxkIGJ5ICJhbGwiKS4KLQotVGh1IE1heSAyNiAwODo1MzoxOSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IE1vdmUgZGVsZXRpb24gb2YgcGF0Y2ggc3VmZml4IGZyb20gaGVyZS4uLgotCSogY29uZmlndXJlLmluOiBUbyBoZXJlLCBhdCBJYW4ncyBzdWdnZXN0aW9uLiAgVGhlIHRvcC0KLQkgIGxldmVsIHNjcmlwdHMgbWlnaHQgbmVlZCB0byBrbm93IG9mIGEgcGF0Y2ggbGV2ZWwuCi0KLVdlZCBNYXkgMjUgMDk6MTU6NTQgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBTdHJpcCBvZmYgcGF0Y2ggc3VmZml4IHNvIHJ0bCBpcyByZWNvZ25pemVkCi0JICBhcyBhIHN1bm9zNC4xLjMgbWFjaGluZSwgZXZlbiB0aG91Z2ggaXQncyBiZWVuIHBhdGNoZWQuCi0KLUZyaSBNYXkgMjAgMDg6MjU6NDkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTEFTVCk6IERlbGV0ZS4KLQkoSU5TVEFMTF9ET1NSRUwpOiBOZXcuCi0KLVRodSBNYXkgMTkgMTc6MTI6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBsZCBmb3IgaVszNF04Ni0qLXN5c3Y0KiBhbmQgc3BhcmMtKi1zb2xhcmlzMiouCi0JRG9uJ3Qgc2V0IHVzZV9nbnVfbGQgdG8gbm8gZm9yICotKi1zeXN2NDsgdGhhdCBvbmx5IGNvbnRyb2xzCi0Jd2hldGhlciB3ZSBwYXNzIGRvd24gLS13aXRoLWdudS1sZCBhbnlob3cuCi0KLVRodSBNYXkgMTkgMDk6Mjk6MTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTExfTEFTVCk6IENoYW5nZSBvcGVyYXRpb24gc28gaXQgd29ya3MKLQlvbiBtb3JlIGZsYXZvcnMgb2YgbWFrZS4KLQkqIGNvbmZpZ3VyZS5pbiAoZ28zMik6IERvbid0IGJ1aWxkIGxpYmcrKyBvciBsaWJpby4KLQotRnJpIE1heSAxMyAxMzoyODozNCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTW92ZSBIT1NUX1BSRUZJWF8xIGFuZCBmcmllbmRzIHVwIHNvCi0JdGhleSBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHRlbXBsYXRlcy4KLQotU2F0IE1heSAgNyAxNjo0Njo0NCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldD09Z28zMik6IERvbid0IGJ1aWxkIGdkYi4KLQkqIGRvc3JlbDogTmV3IGRpcmVjdG9yeS4KLQotRnJpIE1heSAgNiAxNDoxOToyNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PWdvMzIpOiBDb25maWd1cmUgZG9zcmVsIHRvby4KLQkqIE1ha2VmaWxlLmluIChJTlRBTExfVEFSR0VUKTogQ2FsbCBJTlNUQUxMX0xBU1QgbGFzdC4KLQkoSE9TVF9DQywgSE9TVF9QUkVGSVgsIEhPU1RfUFJFRklYXzEpOiBVbmRlZmluZSwgdGhleSBzaG91bGQKLQliZSBzZXQgYnkgaW5jb21pbmcgbmFtZXMgb3IgdGVtcGxhdGVzLgotCShJTlNUQUxMX0xBU1QpOiBOZXcgcnVsZS4KLQkqIGNvbmZpZy9taC1nbzMyOiBOZXcgZnJhZ21lbnQuCi0KLVRodSBNYXkgIDUgMTc6MzU6MDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChzcGFyY2xpdGVmcncsIHNwYXJjbGl0ZWZyd2NvbXBhdCk6IERvbid0IHNldCB0aGUgb3MuCi0KLVRodSBNYXkgIDUgMjA6MDY6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWx5bnhyczZrOiBSZW5hbWVkIGZyb20gbWgtbHlueG9zcnM2aywgdG8gbWFrZSBpdAotCXVuaXF1ZSBpbiA4LjMgbmFtaW5nIHNjaGVtZXMuCi0JKiBjb25maWd1cmUuaW4gKGFwcGRpcnMpOiBOZXcgdmFyaWFibGUuICBDdXJyZW50bHkgZW1wdHksIGJ1dCB3aWxsCi0JYmUgdXNlZCBpbiBnYXMgZGlzdHJpYnV0aW9uLiAgSWYgbm9uZW1wdHksIGxpc3RzIGEgc2V0IG9mCi0JZGlyZWN0b3JpZXMgYXQgbGVhc3Qgb25lIG9mIHdoaWNoIG11c3QgZ2V0IGNvbmZpZ3VyZWQsIG9yIHRvcAotCWxldmVsIGNvbmZpZ3VyYXRpb24gaXMgY29uc2lkZXJlZCB0byBoYXZlIGZhaWxlZC4KLQkocnM2MDAwLSotbHlueG9zKik6IFVzZSBuZXcgZmlsZSBuYW1lLgotCi1UaHUgTWF5ICA1IDEzOjM4OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUVsaW1pbmF0ZSBYVFJBRkxBR1MuCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IElmIG5ld2xpYiBleGlzdHMsIHJlZmVyIHRvIHRoZQotCW5ld2xpYiBpbmNsdWRlIGZpbGVzIHVzaW5nIC1pZGlyYWZ0ZXIsIGFuZCBhbHNvIHVzZSAtbm9zdGRpbmMuCi0JKENYWF9GT1JfVEFSR0VUKTogTGlrZXdpc2UuCi0JKFhUUkFGTEFHUyk6IFJlbW92ZWQuCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBYVFJBRkxBR1NfRk9SX1RBUkdFVC4KLQkoRVhUUkFfSE9TVF9GTEFHUyk6IFJlbW92ZSBYVFJBRkxBR1MuCi0JKEVYVFJBX1RBUkdFVF9GTEFHUywgRVhUUkFfR0NDX0ZMQUdTKTogTGlrZXdpc2UuCi0JKCQoRE9fWCkpOiBEb24ndCBwYXNzIGRvd24gWFRSQUZMQUdTLgotCi1UaHUgTWF5ICA1IDAwOjE2OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLWRlYy1ic2QqKTogTmV3IHRhcmdldDsgZG8gYnVpbGQgbGlua2VyLgotCShtaXBzKi0qLWJzZCopOiBOZXcgdGFyZ2V0OyBkb24ndCBidWlsZCBsaW5rZXIuCi0KLVdlZCBNYXkgIDQgMjA6MTA6MTAgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHN1cHBvcnQgcnM2MDAwLSotbHlueG9zKiBjb25maWd1cmF0aW9uLgotCXN1cHBvcnQgc3Vub3M0IGFzIGEgY3Jvc3MgdGFyZ2V0LgotCi0JKiBjb25maWcuc3ViOiBsb29rIGZvciBseW54Kiwgbm90IGx5bnggc2luY2UgdGhlIE9TIHZlcnNpb24gbWF5Ci0JbGVnaXRpbWF0ZWx5IGJlIHBhcnQgb2YgdGhlIG5hbWUuCi0KLVR1ZSBNYXkgIDMgMjE6NDg6MTEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc2NvKik6IE1vdmUgdG8gYmUgd2l0aCBvdGhlciBpMzg2Ci0JdGFyZ2V0cy4KLQkocm9tcC0qLSopOiBOZXcgdGFyZ2V0LiAgU2tpcCB2YXJpb3VzIGJpbmFyeSB1dGlsaXRpZXMuCi0JKHZheC0qLSopOiBOZXcgdGFyZ2V0LiAgRG9uJ3QgYnVpbGQgbmV3bGliLgotCSh2YXgtKi12bXMpOiBSZW5hbWVkIGZyb20gKi0qLXZtcy4gIERvbid0IGJ1aWxkIG9wY29kZXMgb3IgbmV3bGliLgotCi1UaHUgQXByIDI4IDE1OjAzOjA1IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBPbmx5IHNldCBob3N0X21ha2VmaWxlX2ZyYWcgaWYgY29uZmlnCi0JZGlyZWN0b3J5IGV4aXN0cy4KLQotV2VkIEFwciAyNyAxMjoxNDozMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IElmICRkc3RkaXIgZXhpc3RzLCBkb24ndCBjaGVjayB3aGV0aGVyIGVhY2gKLQljb21wb25lbnQgZG9lcy4KLQotVHVlIEFwciAyNiAxODoxMTozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkIHNsZWVwOyB1c2VkIGJ5IHJjcy9zcmMvY29uZi5zaC4KLQotTW9uIEFwciAyNSAxNTowNjozNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLSAJKiBjb25maWd1cmUuaW4gKCotKi1seW54b3MqKTogRG9uJ3QgY29uZmlndXJlIG5ld2xpYiBmb3IgZWl0aGVyCi0gCW5hdGl2ZSBvciBjcm9zcyBMeW54LgotCi1TYXQgQXByIDE2IDExOjU4OjE2IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKHNwYXJjNjQtZWxmKTogRml4IG9zLgotCSh6OGspOiBSZW1vdmUgZHVwbGljYXRlLgotCi1UaHUgQXByIDE0IDIzOjMzOjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdjYy1uby1maXhlZGluY2x1ZGVzKTogVG91Y2ggZ2NjL2luY2x1ZGUvZml4ZWQsIG5vdAotCWdjYy9zdG1wLWZpeHByb3RvLCB0byB0cnkgdG8gcHJldmVudCBmaXhwcm90byBmcm9tIGJlaW5nIHJ1bi4KLQotV2VkIEFwciAxMyAxNToxNDo1MiAxOTk0ICBCaWxsIENveCAgKGJpbGxAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBNYWtlIGZpbGUgbGlua3MgY2xlYW5seSBldmVuIGlmIEx5bnggZmFpbHMgb24KLSAgICAgICAgICBhbiBORlMgc3ltbGluayAoYXQgbGVhc3QgZmFpbCBjbGVhbmx5KS4KLQotTW9uIEFwciAxMSAxMDo1ODo1NiAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKENDKTogRm9yIG1pcHMtc2dpLWlyaXg0LCBjaGFuZ2UgLVhOaDE1MDAgdG8KLQktWE5oMjAwMC4KLQotU2F0IEFwciAgOSAxNToxMDo0NSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogVW5rbm93biBvcHRpb25zIGFyZSBmYXRhbCBhZ2Fpbi4KLQotRnJpIEFwciAgOCAxMjowMTo0MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJZ25vcmUgLS14LWluY2x1ZGVzIGFuZCAtLXgtbGlicmFyaWVzLCBmb3IgQXV0b2NvbmYKLQljb21wYXRpYmlsaXR5LiAKLQotVGh1IEFwciAgNyAxNzozMTo0MyAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IEFkZCBgY2xlYW4nIHRhcmdldC4KLQotV2VkIEFwciAgNiAyMDo0NDo1NiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZy5ndWVzczogIEFkZCBTSU5JWCBzdXBwb3J0LgotCSogY29uZmlndXJlLmluOiAgQWRkIG1pcHMtKi1zeXN2NCogc3VwcG9ydC4KLQotTW9uIEFwciAgNCAxNzo0MTo0NCAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IERvY3VtZW50IGFsbCB1c2VmdWwgdGFyZ2V0cy4KLQlJZiBjYW5vbmhvc3QgaXMgc3BhcmMtc3VuLXNvbGFyaXMyLjMsIGNoYW5nZSBpdCB0byBzcGFyYy1zdW4tc29sYXJpczIuCi0JSWYgY2Fub25ob3N0IGlzIG1pcHMtc2dpLWlyaXg0LjAuNUgsIGNoYW5nZSBpdCB0byBtaXBzLXNnaS1pcml4NC4KLQotVGh1IE1hciAzMSAwNDo1NTo1NyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU3VwcG9ydCAtLXNpbGVudCwgLS1xdWlldC4KLQotV2VkIE1hciAzMCAyMTozNzozOCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogU3VwcG9ydCAtLWRpc2FibGUtRkVBVFVSRS4KLQotVHVlIE1hciAyOSAxOToxNTowNSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgTkNSIHJ1bm5pbmcgU1ZSNC4zLgotCi1Nb24gTWFyIDI4IDE0OjU1OjE1IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBNYWtlIEJTREkgZ2VuZXJhdGUgaTM4Ni11bmtub3duLWJzZDM4Ni4KLQlQYXRjaCBmcm9tIFBhdWwgRWdnZXJ0IDxlZ2dlcnRAdHdpbnN1bi5jb20+LgotCi1Nb24gTWFyIDI4IDEyOjU0OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwb3dlcnBjLSotYWl4Kik6IFRyZWF0IGxpa2UgcnM2MDAwLSotKi4KLQotU2F0IE1hciAyNiAxMToyNTo0OCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogTWFrZSB1bnJlY29nbml6ZWQgb3B0aW9ucyBnaXZlIG5vbmZhdGFsIHdhcm5pbmdzCi0JaW5zdGVhZCBvZiBmYXRhbCBlcnJvcnMsIGFuZCBwYXNzIHRoZW0gdG8gYW55IHN1YmRpcmVjdG9yeQotCWNvbmZpZ3VyZXMgaW4gY2FzZSB0aGV5IHJlY29nbml6ZSB0aGVtLgotCU1ha2UgLS14IGVxdWl2YWxlbnQgdG8gLS13aXRoLXguCi0KLUZyaSBNYXIgMjUgMjE6NTI6MTAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFkZCAtLWVuYWJsZS0qIG9wdGlvbnMuICBDbGVhbiB1cCB1c2FnZSBtZXNzYWdlIGFuZAotCXNvbWUgY29tbWVudHMuCi0KLVRodSBNYXIgMjQgMDk6MTI6NTMgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE5NX0ZPUl9UQVJHRVQpOiBCdWlsZCB0cmVlIHZlcnNpb24gaXMgbm93IG5tLm5ldy4KLQotU3VuIE1hciAyMCAxMToyODoyMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLSopOiBFbmFibGUgYmludXRpbHMuCi0KLVNhdCBNYXIgMTkgMTE6NTA6MTYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBjaXNjby4KLQotRnJpIE1hciAxOCAxNjo0MjozMiAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENYWEZMQUdTKTogQWRkIC1mZXh0ZXJuYWwtdGVtcGxhdGVzLgotCi1UdWUgTWFyIDE1IDExOjI1OjU1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGFib3V0IHRhcmdldCAqLWhpdGFjaGktaGl1eHdlMiwgZG9uJ3QgcHJpbnQgbW9yZQotCXRoYW4gb25lIGNvbmZpZ3VyYXRpb24gbmFtZS4gIEFkZCBjb21tZW50LgotCi1TdW4gTWFyICA2IDIzOjEzOjM4IDE5OTQgIEhpc2FzaGkgTUlOQU1JTk8gIChtaW5hbWlub0BzcmEuY28uanApCi0KLQkqIGNvbmZpZy5ndWVzczogYWJvdXQgdGFyZ2V0ICotaGl0YWNoaS1oaXV4d2UyLCBmaXhlZAotCW1hY2hpbmUgZ3Vlc3Npbmcgb3JkZXIuICBbSGl0YWNoaSdzIENQVV9JU19IUF9NQzY4SwotCW1hY3JvIGlzIGluY29ycmVjdC5dCi0KLVN1biBNYXIgMTMgMDk6MTA6MDggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogSnVzdCBidWlsZCBUQUdTIGluIGVhY2ggc3ViZGlyZWN0b3J5LCByYXRoZXIKLQl0aGFuIHRoZSAibWFrZSBscyIgc3R1ZmYgd2hpY2ggdXNlZCB0byBiZSBoZXJlLgotCi1GcmkgTWFyIDExIDEyOjUyOjM5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaVszNF04Ni11bmtub3duLWZyZWVic2QuCi0JRnJvbSBTaGF3biBNIENhcmV5IDxzbWNhcmV5QHJvZGFuLnN5ci5lZHU+LgotCi1UaHUgTWFyICAzIDE0OjI0OjIxIDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG5vY29uZmlnZGlycyBmb3IgYWxwaGEpOiBSZW1vdmUgbGliZysrIGFuZCBsaWJpby4KLQotV2VkIE1hciAgMiAxMzoyODo0OCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBDaGVjayBmb3IgcHR4LgotCi1Nb24gRmViIDI4IDE2OjQ2OjUwIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFkZCBvczlrIGNoZWNraW5nLgotCi1UaHUgRmViIDI0IDA3OjA5OjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcuZ3Vlc3M6IEhhbmRsZSBPU0YxIHJ1bm5pbmcgb24gSFBQQSBwcm9jZXNzb3JzCi0KLUZyaSBGZWIgMTggMTQ6MTQ6MDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IElmIHN1YmRpciBjb25maWd1cmUgZmFpbHMsIHByaW50IG91dCBhIG1lc3NhZ2Ugd2l0aAotCXN1YmRpcmVjdG9yeSBuYW1lLCBpbiBjYXNlIHN1YmRpcidzIGNvbmZpZ3VyZSBjb2RlIGRpZG4ndCBpZGVudGlmeQotCWl0c2VsZi4KLQotRnJpIEZlYiAxOCAxMjo1MDoxNSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGVtYmVkZGVkIG5ld2xpbmVzIGZyb20gY29uZmlnZGlycy4KLQlBdm9pZCBtaXNtYXRjaGVzIG9mIHN1YnN0cmluZ3MuICBGaXggbWF0Y2hpbmcgc3RyaW5ncyBhdCBlbmQKLQlvZiBjb25maWdkaXJzLgotCi1GcmkgRmViIDExIDE1OjMzOjMzIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEFkZCBMeW54L3JzNjAwMCBjb25maWcgc3VwcG9ydC4KLQotVHVlIEZlYiAgOCAxMzo0MTowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtZGVjLW9zZjEqLCBhbHBoYSotKi0qKTogQnVpbGQgZ2FzLgotCi1Nb24gRmViICA3IDE1OjQyOjM2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1vc2YqKTogVHJlYXQgdGhpcyBqdXN0IGxpa2UgbW9zdCBvdGhlcgotCVBBIGNvbmZpZ3VyYXRpb25zIChlZyBubyBiaW51dGlscyBvciBsZCkuCi0JKGhwcGEqLSotKmVsZiopOiBUaGVzZSBjb25maWd1cmF0aW9ucyBoYXZlIGJpbnV0aWxzIGFuZCBsZC4KLQotU3VuIEZlYiAgNiAxNjozNTowNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLnN1YiAoaGl1eCk6IEZpeCB0eXBvLiAgRnJvbSBtLWthc2FockBzcmFtaGMuc3JhLmNvLkpQLgotCi1TYXQgRmViICA1IDAxOjAwOjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChyczYwMDAtKi0qKTogQnVpbGQgZ2FzLgotCi1XZWQgRmViICAyIDEzOjU3OjU3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogTWFrZWZpbGUuaW46ICBBdm9pZCBidWcgaW4gbG9zaW5nIGhwdXggc2VkLgotCi1XZWQgRmViICAyIDE0OjUzOjA1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgdGVzdC1idWlsZC5tazogUmVtb3ZlIE1VTkNIX05NOyBpdCB3YXMgb25seSBuZWVkZWQKLQlmb3IgR0RCIGFuZCBHREIgaGFzIGJlZW4gZml4ZWQgdG8gbm90IG5lZWQgaXQuCi0KLU1vbiBKYW4gMzEgMTg6NDA6NTUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWx5bnhvc3JzNms6ICBBY2NvdW50IGZvciBsYWNrIG9mIHJhbmxpYiEKLQotU3VuIEphbiAzMCAxNzo1ODowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSB2YXggaG9zdHMuCi0KLUZyaSBKYW4gMjggMTU6Mjk6MzggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh3aGlsZSBsb29wKTogRG9uJ3QgdXNlICJicmVhayAyIiBpbnNpZGUgY2FzZQotCXN0YXRlbWVudCAtLSB0aGUgY2FzZSBzdGF0ZW1lbnQgaXNuJ3QgYW4gZW5jbG9zaW5nIGxvb3AuCi0KLU1vbiBKYW4gMjQgMTg6NDA6MDYgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIENsZWFuIHVwIE5lWFQgc3VwcG9ydCwgdG8gYWxsb3cgbmV4dHN0ZXAKLQlvbiBJbnRlbCBtYWNoaW5lcy4gIE1ha2UgT1MgYmUgbmV4dHN0ZXAuCi0KLVN1biBKYW4gMjMgMTg6NDc6MjIgMTk5NCAgUmljaGFyZCBLZW5uZXIgIChrZW5uZXJAdmxzaTEudWx0cmEubnl1LmVkdSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGQgYWx0ZXJuYXRlIGZvcm1zIGZvciBDb252ZXguCi0KLVRodSBKYW4gMjAgMTY6MTM6NDEgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQ29tcGxldGVseSByZXdyaXRlIG9wdGlvbiBwcm9jZXNzaW5nLiAgVGFrZQotCWFkdmFudGFnZSBvZiBwYXR0ZXJuLW1hdGNoaW5nIHRvIGF2b2lkIGludm9raW5nIHRlc3QgZnJlcXVlbnRseS4KLQlBbHNvIGNsZWFuIHVwIGhvc3QgYW5kIHRhcmdldCBkZWZhdWx0aW5nIGxvZ2ljLgotCi1Nb24gSmFuIDE3IDE1OjA2OjU2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGFsbCBvY2N1cnJhbmNlcyBvZiAicm9vdG1lIiB3aXRoICJyIiBhbmQKLQkiJCR7cm9vdG1lfSIgd2l0aCAiJCRyIiwgdG8gaW5jcmVhc2UgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgZG8tKgotCWNvbW1hbmRzIChwbHVzIHVzZXIgZW52aXJvbm1lbnQpIHdpbGwgZml0IFNDTyBsaW1pdHMuCi0KLVRodSBKYW4gIDYgMTE6MjA6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGlzc3VlIHdhcm5pbmdzIGFib3V0IGRpcmVjdG9yaWVzIHdoaWNoIGFyZQotCW5vdCBiZWluZyBjb25maWd1cmVkIGlmIC1ub3JlY3Vyc2lvbiBpcyBzZXQuICBDb3JyZWN0IHRlc3QgZm9yCi0JLS13aXRoLWdudS1hcyBhbmQgLS13aXRoLWdudS1sZCB0byBub3QgZ2V0IGNvbmZ1c2VkIGJ5IHN1YnN0cmluZwotCW1hdGNoZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgZ2FzIGZvciBhbHBoYS1kZWMtb3NmMSouCi0KLVR1ZSBKYW4gIDQgMTc6MTA6MTkgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQmFjayBvdXQgUGVyJ3MgY2hhbmdlIG9mIDEyLzE5LzE5OTMuICBJdCBjaGFuZ2VzIHRoZQotCWJlaGF2aW9yIG9mIGNvbmZpZ3VyZSBpbiB1bmV4cGVjdGVkIGFuZCBjb25mdXNpbmcgd2F5cy4KLQotCUFsc28sIHVzZSBkaWZmZXJlbnQgZGVsaW0gY2hhciB3aGVuIGNhbGN1bGF0aW5nCi0JcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSBzbyB0aGF0IHRoZSBuYW1lIGNhbiBjb250YWluIHNsYXNoZXMuCi0KLVNhdCBKYW4gIDEgMTM6NDU6MzEgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy5zdWI6IEFkZCBzdXBwb3J0IGZvciBWU1RhIG1pY3JvLWtlcm5lbC4KLQotU2F0IERlYyAyNSAyMDowMDo0NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluOiBOdWtlIGhhY2tzIHdoaWNoIHdlcmUgdXNlZCB0byBnZXQgYSBzcGVjaWFsCi0JdmVyc2lvbiBvZiBHQVMgZm9yIEhQUEEgY29uZmlndXJhdGlvbnMuCi0KLVN1biBEZWMgMTkgMjA6NDA6NDQgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIElmIG9ubHkgJHt0YXJnZXRfYWxpYXN9IGlzIGdpdmVuLCB1c2UgdGhhdAotCWFzIHRoZSBkZWZhdWx0IGZvciAke2hvc3RfYWxpYXN9LgotCSogY29uZmlndXJlOiAgQWRkIG1pc3NpbmcgYmFjay1zbGFzaGVzIGJlZm9yZSBuZXN0ZWQgcXVvdGVzLgotCi1XZWQgRGVjIDE1IDE4OjA3OjE4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IGFkZCBZQUNDPSQoQklTT04pCi0KLVR1ZSBEZWMgMTQgMjE6MjU6MzMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIFJlY29nbml6ZSBzb21lIFRla3Ryb25peCBjb25maWd1cmF0aW9ucy4KLQlGcm9tIEthdmVoIFIuIEdoYXppIDxnaGF6aUBub2MucnV0Z2Vycy5lZHU+LgotCi1TYXQgRGVjIDExIDExOjE4OjAwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBNYXRjaCBhbnkgZmxhdm9yIG9mIFNILgotCi1UaHUgRGVjICAyIDE3OjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgdHJ5IHRvIGNvbmZpZ3VyZSBuZXdsaWIgZm9yIEFscGhhLgotCi1UaHUgRGVjICAyIDE0OjM1OjU0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBidWlsZCBsZCBmb3IgSXJpeCA1LiAgRG9uJ3QgYnVpbGQgZ2FzLAotCWxpYmcrKyBvciBsaWJpbyBmb3IgYW55IEFscGhhIHRhcmdldC4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi1zZ2ktaXJpeDUqKTogTmV3IHRhcmdldDsgdXNlIG1oLWlyaXg1LgotCSogY29uZmlnL21oLWlyaXg1LiBOZXcgZmlsZSBmb3IgSXJpeCA1LgotCi1XZWQgRGVjICAxIDE3OjAwOjMzIDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR1pJUFBST0cpOiBSZW5hbWVkIGZyb20gR1pJUCwgd2hpY2ggZ3ppcCB1c2VzIGZvcgotCWRlZmF1bHQgYXJndW1lbnRzIC0tIHNvIGl0IHRyaWVkIHRvIGNvbXByZXNzIGl0c2VsZi4KLQotVHVlIE5vdiAzMCAxMzo0NToxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobm90c3VwcCk6IGVuc3VyZSB0aGF0IGEgc3BhY2UgaXMgYWx3YXlzIGF0IHRoZSBlbmQKLQkgIG9mIHRoZSBjb25maWdkaXJzIGxpc3QsIHNpbmNlIHRoZSBncmVwIGNoZWNrcyBmb3IgYW4gZXhwbGljaXQgc3BhY2UKLQotVHVlIE5vdiAxNiAxNTowNDoyNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGkzODYtc3lzdjQuMik6IGRvbid0IGJ1aWxkIGxkLCBzaW5jZSBzdGF0aWMKLQkgIHZlcnNpb25zIG9mIG1hbnkgbGlicmFyaWVzIGFyZSBub3QgYXZhaWxhYmxlLgotCi1UdWUgTm92IDE2IDE0OjI4OjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBBcG9sbG9zICh1c2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMpLgotCSogY29uZmlndXJlLmluOiBEb24ndCBjb25maWd1cmUgbGQsIGJpbnV0aWxzLCBvciBncHJvZiBmb3IgQXBvbGxvLgotCi1UaHUgTm92IDExIDEyOjAzOjUwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBTb255IG5ld3MgbWlwcyBydW5uaW5nIG5ld3Nvcy4KLQotV2VkIE5vdiAxMCAxNjo1NzowMCAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWN5Z251cywgYnVpbGQtY3lnbnVzKTogImZpIGVsc2UiIG5lZWRzIHRvIGJlCi0JImZpIDsgZWxzZSIgZm9yIGJhc2guCi0KLVR1ZSBOb3YgIDkgMTU6NTQ6MDEgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IHBhc3MgU0hFTEwuCi0KLUZyaSBOb3YgIDUgMDg6MDc6MjcgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBibHVlcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhY2NlcHQgdW5peHdhcmUgYXMgYW4gYWxpYXMgZm9yIHN2cjQuMi4KLQlGaXggc29tZSBpbmNvbnNpc3RhbmNpZXMgd2l0aCB0aGUgZ2NjIHZlcnNpb24uCi0KLUZyaSBOb3YgIDUgMTU6MTQ6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNURE9DRElSUyk6ICBBZGQgZ2RiLgotCi1GcmkgTm92ICA1IDExOjU5OjQyIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRElTVERPQ0RJUlMpOiAgQWRkIGxpYmcrKyBhbmQgbGliaW8uCi0KLUZyaSBOb3YgIDUgMTA6MzU6MDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0YXopOiBPbmx5IGJ1aWxkICJpbmZvIiBpbiBESVNURE9DRElSUy4KLQkoRElTVERPQ0RJUlMpOiBEb24ndCBhc3N1bWUgbGliZysrIGFuZCBnZGIgZm9sa3MgbmVjZXNzYXJpbHkgd2FudAotCXRoaXMgbm93LgotCi1UaHUgTm92ICA0IDE4OjU4OjIzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBBY2NlcHQgaGl1eCogYXMgYW4gT1MgbmFtZS4KLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNUX0ZMQUdTIGJhY2sgdG8gUlVOVEVTVEZMQUdTIHBlcgotCWV0Yy9tYWtlLXN0ZHMudGV4aS4gIFRoZSB1bmRlcnNjb3JlIGNhbWUgZnJvbSBnY2MsIGFuZCBkamUgbm93Ci0JYWdyZWVzIHRoYXQgUlVOVEVTVEZMQUdTIGlzIHRoZSBjb3JyZWN0IG5hbWUuCi0KLVRodSBOb3YgIDQgMTA6NDk6MDEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6ICBSZW1vdmUgJ3NldCAtZScuICBJdCBtYWtlcyBhbnkgY29uZGl0aW9uYWxzCi0JaW4gdGhlIHNjcmlwdCB1c2VsZXNzLgotCi0JKiBjb25maWcuZ3Vlc3M6IEF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGFybS1hY29ybi1yaXNjaXgKLQlQYXRjaCBmcm9tIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZTExQGNsLmNhbS5hYy51aykuCi0KLVRodSBOb3YgMDQgMDg6MDg6MDQgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBSVU5URVNURkxBR1MgdG8gUlVOVEVTVF9GTEFHUwotCi1XZWQgTm92ICAzIDIyOjA5OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RET0NESVJTKTogTmV3IHZhcmlhYmxlLgotCSh0YXopOiBFZGl0IGxvY2FsIE1ha2VmaWxlLmluIHNvb25lciwgaW5zdGVhZCBvZiBwcm90by10b3BsZXYKLQlNYWtlZmlsZS5pbiBsYXRlci4gIEJ1aWxkICJpbmZvIiBhbmQgImR2aSIgaW4gRElTVERPQ0RJUlMuICAKLQotV2VkIE5vdiAgMyAyMTozMTo1MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSB0YXJnZXQpOiBjaGVjayB0aGUgc291cmNlIGRpcmVjdG9yeSBmb3IgdGhlCi0JICBwYWdhcyBzdWItZGlyZWN0b3J5Ci0KLVdlZCBOb3YgIDMgMTE6MTI6MjIgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWxsb3cgLWFvdXQqIGFuZCAtZWxmKi4KLQotV2VkIE5vdiAgMyAxMTowODozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbGQgb24gaTM4Ni1zb2xhcmlzMiwgc2FtZSBhcyBmb3IKLQlzcGFyYy1zb2xhcmlzMi4KLQotVHVlIE5vdiAgMiAxNDoyMToyNSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEFkZCB0ZXhpbmZvL2xncGwudGV4aW5mbyAoZm9yIGxpYmcrKykuCi0KLVR1ZSBOb3YgIDIgMTM6Mzg6MzAgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBDb25maWd1cmUgZ2RiIGZvciBhbHBoYS4KLQotTW9uIE5vdiAgMSAxMDo0Mjo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENYWEZMQUdTKTogQWRkIC1PLgotCi1XZWQgT2N0IDI3IDEwOjQ1OjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGRlZCBzdXBwb3J0IGZvciBERyBBdmlpb24KLQotVHVlIE9jdCAyNiAxNDozNzozNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBQcm9kdWNlIHdhcm5pbmcgbWVzc2FnZSBmb3Igc3ViZGlyZWN0b3JpZXMgbm90Ci0JY29uZmlndXJhYmxlIGZvciB0aGlzIGhvc3QvdGFyZ2V0IGNvbWJpbmF0aW9uLiAgRG9uJ3QgdHJ5IHRvCi0JY29uZmlndXJlIGdkYiBmb3Igdm1zLgotCi1Nb24gT2N0IDI1IDExOjIyOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogUmVwbGFjZSAiYnlhY2MiIHdpdGggImJpc29uIC15IiBpbiB0aGUKLQlhcHByb3ByaWF0ZSBmaWxlcyBiZWZvcmUgbWFraW5nICJkaXN0c3R1ZmYiLgotCShESVNUQklTT05GSUxFUyk6IE5ldyB2YXI6IGxpc3Qgb2YgZmlsZXMgdG8gYmUgZWRpdGVkLgotCShESVNUU1RVRkZESVJTKTogQWRkIGJpbnV0aWxzLgotCi1GcmkgT2N0IDIyIDIwOjMyOjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogYWxzbyBoYW5kbGUgbWlwc2VsIGFuZCBtaXBzNjRlbCAoZm9yIGxpdHRsZSBlbmRpYW4gbWlwcykKLQotRnJpIE9jdCAyMiAwNzo1OToyMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UaHUgT2N0IDIxIDExOjM4OjI4IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBuZXdsaWIgZm9yIEx5bnhPUyBuYXRpdmUuCi0KLVdlZCBPY3QgMjAgMDk6NTY6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogQWRkIHN1cHBvcnQgZm9yIGRlbHRhIDg4ayBydW5uaW5nIFNWUjMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnQgYWJvdXQgSFAgY29tcGlsZXIgdnMuIGVtYWNzLgotCi1UdWUgT2N0IDE5IDE2OjAyOjIyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCBidWlsZCBsZCBvbiBzb2xhcmlzMiAobm90IGEgdmlhYmxlIG9wdGlvbgotCSAgZHVlIHRvIGJ1Z3MgaW4gZ2V0cHduYW0gJiBnZXRwd3VpZCkKLQotVHVlIE9jdCAxOSAxNToxMzo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IGFscGhhLWRlYy1vc2YxKiwgbm90IGp1c3QgLW9zZjEsIHNpbmNlCi0JY29uZmlnLmd1ZXNzIHdpbGwgcHJvZHVjZSBhIGZ1bGwgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBPY3QgMTkgMTU6NTg6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGxpbmtlciBhbmQgYmludXRpbHMgZm9yIGFscGhhLWRlYy1vc2YxLgotCi1UdWUgT2N0IDE5IDExOjQxOjU1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIC1PIGZyb20gQ1hYRkxBR1MgZm9yIGNvbnNpc3RlbmN5IHdpdGggQ0ZMQUdTLAotCWFuZCBnZGIvdGVzdHN1aXRlL01ha2VmaWxlLmluLgotCi1TYXQgT2N0ICA5IDE4OjM5OjA3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbWlwcyotIGluc3RlYWQgb2YgbWlwcy0KLQotRnJpIE9jdCAgOCAxNDoxNTozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IGxpbnV4KmNvZmYgYW5kIGxpbnV4KmVsZiBhcyBvcGVyYXRpbmcKLQlzeXN0ZW1zLgotCi1UaHUgT2N0ICA3IDEyOjU3OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVjb2duaXplIG1pcHM2NCwgYW5kIG1pcHMzIGFzIGFuIGFsaWFzIGZvciBpdC4KLQotV2VkIE9jdCAgNiAxMzo1NDoyMSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIGFscGhhLWRlYy1vc2YqLCBubyBsb25nZXIgbmVjZXNzYXJ5IG5vdyB0aGF0Ci0JZ2RiIGtub3dzIGhvdyB0byBoYW5kbGUgT1NGLzEgc2hhcmVkIGxpYnJhcmllcy4KLQotVHVlIE9jdCAgNSAxMTo1NTowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaHBwYSotKi1oaXV4KiAoY3VycmVudGx5IHN5bm9ueW0gZm9yIGhwdXgpLgotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgSGl0YWNoaSdzIEhJVVguCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgaDMwNTByKiBhbmQgaHBwYWhpdGFjaGkuCi0JUmVtb3ZlIHJlZHVuZGFudCBjYXNlcyBmb3IgaHA5a1syM10qLgotCi1Nb24gT2N0ICA0IDE2OjE1OjA5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkZWZhdWx0IHRvICctLXdpdGgtZ251LWFzJyBhbmQgJy0td2l0aC1nbnUtbGQnCi0JaWYgZ2FzIGFuZCBsZCBhcmUgaW4gdGhlIHNvdXJjZSB0cmVlIGFuZCBhcmUgaW4gJHtjb25maWdkaXJzfS4KLQlJZiAke3VzZV9nbnVfYXN9IG9yICR7dXNlX2dudV9sZH0gYXJlICdubycsIHRoZW4gZG9uJ3Qgc2V0IHRoZQotCXRoZSAtLXdpdGggb3B0aW9ucyAoYnV0IHN0aWxsIHBhc3MgdGhlbSBkb3duIG9uIHRoZSBjb21tYW5kIGxpbmUsCi0JaWYgdGhleSB3ZXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkKS4KLQotRnJpIFNlcCAyNCAxOToxMToxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogc3Vic3RpdHV0ZSBTSEVMTCB2YWx1ZSBpbiBNYWtlZmlsZS5pbiB3aXRoCi0JJHtDT05GSUdfU0hFTEx9Ci0KLVRodSBTZXAgMjMgMTg6MDU6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGdhcywgbGQsIGFuZCBiaW51dGlscyBmb3IgKi0qLXN5c3Y0KiBhbmQKLQkqLSotc29sYXJpczIqIHRhcmdldHMuCi0KLVN1biBTZXAgMTkgMTc6MDE6NDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIE00LCBhbmQgcGFzcyBpdCBkb3duIHRvIHN1Yi1tYWtlczsKLQlhbGwtYXV0b2NvbmYgbm93IGRlcGVuZHMgb24gYWxsLW00Ci0KLVNhdCBTZXAgMTggMDA6Mzg6MjMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoe0FSLFJBTkxJQn1fRk9SX1RBUkdFVCk6IG1ha2UgY29udGluZ2VudCBvbgotCXByZXNlbmNlIG9mIHthcixyYW5saWJ9IGluc3RlYWQgb2YgYSBjb25maWd1cmVkIGRpcmVjdG9yeQotCi1XZWQgU2VwIDE1IDA4OjQxOjQ0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBBY2NlcHQgMzQ/PyBhcyB3ZWxsIGFzIDMzPz8gZm9yIE5DUi4KLQotTW9uIFNlcCAxMyAxMjoyODo0MyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZ3JhYiBtdC1ocHBhIGZvciBIUFBBIHRhcmdldHM7IHVzZSAnZ2FzICcgaW5zdGVhZAotCW9mICdnYXMnIGluIHNlZCBjb21tYW5kcywgc2luY2UgJ2dhc2gnIGlzIG5vdyBpbiB0aGUgdHJlZSBhcyB3ZWxsLgotCi1GcmkgU2VwIDEwIDExOjIzOjUyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBncmFiIHZhbHVlcyBmb3IgJChDQykgYW5kICQoQ1hYKSBmcm9tIHRoZQotCWVudmlyb25tZW50LCBzbyB0aGF0IHNvbWVvbmUgY2FuIGRvICJDQz1nY2MgY29uZmlndXJlOyBtYWtlIiBhbmQKLQloYXZlIGl0IHdvcmsgcmlnaHQgKG1hdGNoaW5nIHRoZSB3YXkgdGhhdCBhdXRvY29uZiB3b3JrcyBub3cpCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGFkZCBzdXBwb3J0IGZvciBnYXNoLCB0aGUgdGNsCi0JaW50ZXJmYWNlIHRvIEdhbGF4eQotCi0JKiBjb25maWcuZ3Vlc3M6IGFkZCBOZXRCU0QgdmFyaWFudHMgKGhwMzAwLCB4ODYpCi0KLVRodSBTZXAgIDkgMTY6NDg6NTIgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IFN1cHBvcnQgLWQgb3B0aW9uIChpbiB0aGUgbWFubmVyIG9mIFN1bk9TIDQgaW5zdGFsbCwKLQlhcyBpdCBpcyBtb3JlIGRldGVybWluaXN0aWMgdGhhbiB0aGF0IG9mIEdOVSBpbnN0YWxsKQotCShjaG1vZGNtZCk6IFNldCBmaWxlIHRvIG1vZGUgNzU1IGJ5IGRlZmF1bHQgKHNob3VsZCBhbHNvIGRvIGRlZmF1bHQKLQljaGdycCBhbmQgY2hvd24sIGJ1dCBJIGRvbid0IGZlZWwgbGlrZSBkZWFsaW5nIHdpdGggdGhhdCBub3cpCi0KLVR1ZSBTZXAgIDcgMTE6NTk6MzkgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogUmVtb3ZlIGg4MzAwaGhtcyBhbGlhcy4KLQotVHVlIEF1ZyAzMSAxMTowMDowOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNYXRjaCAqLSotc29sYXJpczIqIG5vdCAqLXN1bi1zb2xhcmlzMiouCi0KLU1vbiBBdWcgMzAgMTg6Mjk6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2NjLW5vLWZpeGVkaW5jbHVkZXMpOiB0b3VjaCBzdG1wLWZpeHByb3RvIGFzIHdlbGwKLQlhcyBzdG1wLWZpeGluYwotCi1XZWQgQXVnIDI1IDE2OjM1OjU5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVjb2duaXplIG04ODExMC1idWctY29mZi4KLQotVHVlIEF1ZyAyNCAxMDoyMzoyNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtbGliaW8pOiBhbGwgZGVwZW5kZW5jaWVzIG9uIHRoZSB0b29sY2hhaW4gdXNlZAotCXRvIGJ1aWxkIHRoaXMgKGdjYywgZ2FzLCBsZCwgZXRjKQotCi1GcmkgQXVnIDIwIDE3OjI0OjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IERlYWwgd2l0aCBPU0YvMSAxLjMgb24gYWxwaGEuCi0KLVRodSBBdWcgMTkgMTE6NDM6MDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLnNoOiBhZGQgc29tZSAnZWxzZSB0cnVlJyBjbGF1c2VzIGZvciBwb3J0YWJpbGl0eQotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGJ1aWxkIGxpYmlvIGZvciBoOFszNV0wMC0qLSogdGFyZ2V0cwotCi1UdWUgQXVnIDE3IDE5OjAyOjMxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBzdXBwb3J0IGZvciBuZXcgbGliaW8uCi0KLVN1biBBdWcgMTUgMjA6NDg6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IElmIG9uZSBjb21tYW5kIGZhaWxzLCBkb24ndCB0cnkgdGhlIHJlc3QuICBEb24ndCB0cnkKLQl0byByZW1vdmUgJGRzdHRtcCAodmlhIHRyYXApIHVubGVzcyB3ZSBoYXZlIGFscmVhZHkgY3JlYXRlZCBpdC4KLQlJZiAkc3JjIGRvZXNuJ3QgZXhpc3QsIGRldGVjdCBpdCBhbmQgZXhpdCB3aXRoIGFuIGVycm9yLgotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBCU0Qgb24gaHAzMDAuCi0KLVdlZCBBdWcgMTEgMTg6MzU6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIE1hcCAoOTAwMC9bMzRdPz86SFAtVVg6KjoqKSB0byBtNjhrLWhwLWhwdXguCi0JQnVnIHJlcG9ydCBmcm9tICJIYW1pc2ggKEguSS4pIE1hY2RvbmFsZCIgPGhhbWlzaEBibnIuY2E+LgotCi1XZWQgQXVnIDExIDE1OjM3OjUxIDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLXNlbmQtcHIpOiBkZXBlbmRzIG9uIGFsbC1wcm1zCi0KLVdlZCBBdWcgMTEgMTY6NTY6MDMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogRml4IHR5cG8gKDkwMDAvOD8/OjQuM2JzZCAtPiA5MDAwLzc/Pzo0LjNic2QpLgotCi1GcmkgQXVnICA2IDE0OjQ1OjAyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBGcm9tIG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2EgKE1pY2hhZWwgUmVuZGVsbCk6Ci0JQWRkZWQgdGVzdCBmb3IgbWlwcy1taXBzLXJpc2NvczUuCi0KLVRodSBBdWcgIDUgMTU6NDU6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHVzZSBtaC1ocDMwMCBmb3IgNjhrIEhQIGhvc3RzCi0KLU1vbiBBdWcgIDIgMTE6NTY6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZCBzdXBwb3J0IGZvciBDT05GSUdfU0hFTEwsIHNvIHRoYXQgeW91IGNhbiB1c2UKLQlzb21lIGFsdGVybmF0ZSBzaGVsbCBmb3IgZXZhbHVhdGluZyBjb25maWd1cmUgc2NyaXB0cwotCi1TdW4gQXVnICAxIDExOjM2OjI3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLmd6KTogIFNlZCBidWcgcmVwb3J0aW5nIGFkZHJlc3MKLQlpbiBjb25maWd1cmUgc2NyaXB0IHRvIGJ1Zy1nZGJAcHJlcC5haS5taXQuZWR1IHdoZW4gYnVpbGRpbmcKLQlkaXN0cmlidXRpb24gYXJjaGl2ZS4KLQkqIE1ha2VmaWxlLmluIChDT01QUkVTUyk6ICBSZW1vdmUgZGVmLgotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuZ3osIG1ha2UtZ2RiLnRhci5neik6ICBSZW5hbWVkIGZyb20KLQlnZGIudGFyLlogYW5kIG1ha2UtZ2RiLnRhci5aIHJlc3BlY3RpdmVseS4KLQkqIE1ha2VmaWxlLmluIChtYWtlLWdkYi50YXIuZ3opOiAgTm93IG9ubHkgYnVpbGQgZ3ppcCdkIGFyY2hpdmUuCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLmd6KTogIE1pbm9yIGNoYW5nZXMgdG8gbW92ZSBjbG9zZXIKLQl0byBjb252ZXJnZW5jZSB3aXRoICd0YXonIHRhcmdldCBpbiBNYWtlZmlsZS5pbi4KLQotRnJpIEp1bCAzMCAxMjozNDo1NyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2ggKGRzdHRtcCk6IHVzZSB0cmFwIHRvIGVuc3VyZSB0aGF0IHRtcCBmaWxlcyBnbwotCWF3YXkgb24gZXJyb3IgY29uZGl0aW9ucwotCi1XZWQgSnVsIDI4IDExOjU3OjM2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJBU0VfRkxBR1NfVE9fUEFTUyk6IHJlbW92ZSBMT0FETElCRVMKLQotVHVlIEp1bCAyNyAxMjo0Mzo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGlycyk6IERlYWwgd2l0aCBhIHByZWZpeCBsaWtlIC9nbnU7Ci0JaXRzIHBhcmVudCBpcyAnLycgbm90ICcnLgotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogQWRkIGNvbW1lbnRzIGFib3V0IENoYW5nZUxvZy4KLQotRnJpIEp1bCAyMyAwOTo1MzozNyAxOTkzICBKYXNvbiBNZXJyaWxsICAoamFzb25Ad2FoaW5pLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogaWYgJHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZSBkb2Vzbid0IGV4aXN0LCBkb24ndCBhc3N1bWUKLQl0aGF0ICR7bmV3c3JjZGlyfS9jb25maWd1cmUuaW4gZG9lcy4KLQotVHVlIEp1bCAyMCAxMToyODo1MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHN1cHBvcnQgZm9yIENPTkZJR19TSEVMTAotCi1Nb24gSnVsIDE5IDIxOjU0OjQ2IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChuZXR3YXJlKTogIEFkZCBhcyBhIGJhc2ljIHN5c3RlbSB0eXBlLgotCi1XZWQgSnVsIDE0IDEyOjAzOjExIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogZGVwZW5kIG9uIGNvbmZpZ3VyZS5pbi4gIEFsc28gZHJvcCB0aGUKLQkgICQoc3JjZGlyKS8gZnJvbSB0aGUgZGVwZW5kZW5jeSBvbiBNYWtlZmlsZS5pbi4KLQotVHVlIEp1bCAxMyAyMDoxMDo1OCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBSZWNvZ25pemUgaDgzMDBoaG1zIGFzIGg4MzAwaC1oaXRhY2hpLWhtcy4KLQkoaDgzMDBoaG1zIGlzIHRlbXBvcmFyeSB1bnRpbCBtdWx0aS1saWJyYXJpZXMgYXJlIGltcGxlbWVudGVkKS4KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIGg4MzAwaCB0b28uCi0KLVN1biBKdWwgMTEgMTc6MzU6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGRweC8yIGFzIG02OGstYnVsbC1zeXN2My4KLQotVGh1IEp1bCAgOCAxODoyNjoxMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgUmVtb3ZlIGV4dHJhbmVvdXMgb3V0cHV0IHdoZW4gZ3Vlc3NpbmcgaG9zdCB0eXBlLgotCSogY29uZmlnLmd1ZXNzOiAgUmVtb3ZlIGV4dHJhbmVvdXMgb3V0cHV0IHdoZW4gZ3Vlc3NpbmcgdXNpbmcgQwotCWNvbXBpbGVyIHJhdGhlciB0aGFuIHVuYW1lLCBvciB3aGVuIGd1ZXNzaW5nIGZhaWxzLgotCi1XZWQgSnVsICA3IDE3OjU4OjE0IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBhbGwuY3Jvc3MgYW5kIGluc3RhbGwuY3Jvc3MgdGFyZ2V0cwotCi0JKiBjb25maWd1cmU6IHJlbW92ZSBDUk9TUz0tRENST1NTX0NPTVBJTEUgYW5kIEFMTD1hbGwuY3Jvc3MKLQkgIGRlZmluaXRpb25zCi0KLVR1ZSBKdWwgIDYgMTA6Mzk6NDQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICh0YXJnZXQgc2gpOiBCdWlsZCBncHJvZi4KLQotVGh1IEp1bCAgMSAxNjo1Mjo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGNoYW5nZSAtc29sYXJpcyB0byAtc29sYXJpczIKLQotVGh1IEp1bCAgMSAxNTo0NjoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgY29uZmlnL21oLXJpc2NvcyBmb3IgbWlwcy0qLXN5c3YqLgotCi1XZWQgSnVuIDMwIDA5OjMxOjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDb3JyZWN0IGVycm9yIG1lc3NhZ2UgZm9yIG1pc3NpbmcgTWFrZWZpbGUuaW4gdG8KLQlwcmludCBjb3JyZWN0IGRpcmVjdG9yeS4KLQotVHVlIEp1biAyOSAxMzo1MjoxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGluc3RhbGwuc2g6IGtsdWRnZSBhcm91bmQgMzg2QlNEIHNoZWxsIGJ1ZwotCi1UdWUgSnVuIDI5IDEzOjA2OjQ5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIE5lWFQuCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaTQ4Ni1uY3Itc3lzdjQuCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogIHJtICQoVE9PTCktJCRWRVIgYmVmb3JlIGxpbmtpbmcuCi0KLVR1ZSBKdW4gMjkgMTI6NTA6NTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFLRUlORk9GTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgTUFLRUlORk8gYXMgTUFLRUlORk8gTUFLRUlORk9GTEFHUy4KLQkqIGJ1aWxkLWFsbC5taywgdGVzdC1idWlsZC5tazogUGFzcyBkb3duIC0tbm8tc3BsaXQgYXMKLQlNQUtFSU5GT0ZMQUdTIHdoZW4gaG9zdGVkIG9uIERPUy4gIENvbXBpbGUgRE9TIGhvc3RlZCB3aXRob3V0IC1nLgotCi1UaHUgSnVuIDI0IDEzOjM5OjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVk9fU1VQUE9SVCk6ICBBZGQgQ09QWUlORyBDT1BZSU5HLkxJQiBpbnN0YWxsLnNoLgotCi1XZWQgSnVuIDIzIDEyOjU5OjIxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxpYmcrKy50YXIueik6ICBOZXcgcnVsZS4KLQkqIE1ha2VmaWxlLmluICh0YXopOiAgUmVwbGFjZSAnY29uZmlndXJlIC1ybScgYnkgJ21ha2UgZGlzdGNsZWFuJy4KLQkqIE1ha2VmaWxlLmluICh0YXopOiAgT25seSBkbyBhIHNpbmdsZSBjaG1vZC4KLQotRnJpIEp1biAxOCAxMjowMzoxMCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgbWFqaXBvb3IuY3lnbnVzLmNvbSkKLQotCSogaW5zdGFsbC5zaDogZG9uJ3QgdXNlIGRpcm5hbWUgYW55bW9yZSAocmVwbGFjZWQgd2l0aCBzZWQgdXNhZ2UpCi0KLVRodSBKdW4gMTcgMTg6NDM6NDIgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIGV4dGVuc2lvbiBmb3IgZ3ppcCdkIGZpbGVzIGZyb20gJy56JyB0bwotCScuZ3onIHBlciBuZXcgRlNGIHN0YW5kYXJkIHVzYWdlLgotCi1UaHUgSnVuIDE3IDE2OjU4OjUwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBtYWppcG9vci5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHB1dCBxdW90ZXMgYXJvdW5kIHRoZSBmaW5hbCB2YWx1ZSBvZiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0KLVR1ZSBKdW4gMTUgMTY6NDg6NTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IGluc3RhbGwuc2ggc3VwcG9ydDsgdXBkYXRlIGluc3RhbGwtaW5mbyBydWxlcwotCi1XZWQgSnVuICA5IDEyOjMxOjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBCdWlsZCBkaWZmIGZvciBjcm9zc2VzLCBidXQgbm90IGZvciBnbzMyIGhvc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQnVpbGQgZ3Byb2Ygb25seSBmb3IgbmF0aXZlLCBhbmQgZG9uJ3QgYnVpbGQgaXQKLQlmb3IgbWlwcy0qLSosIHJzNjAwMC0qLSosIG9yIGlbMzRdODYtKi1zY28qLgotCi1Nb24gSnVuICA3IDEzOjEyOjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGRvbid0IGJ1aWxkIGdhcyxsZCxiaW51dGlscyBvbiBmb3IgKi0qLXN5c3Y0Ci0KLU1vbiBKdW4gIDcgMTE6NDA6MTEgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGhvc3RfdG9vbHMpOiBBZGQgcHJtcy4KLQotRnJpIEp1biAgNCAxMzozMDo0MiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbnN0YWxsIGdjYywgZG8gaW5zdGFsbGF0aW9uIG9mICQoSU5TVEFMTF9NT0RVTEVTKQotCXdpdGggJChGTEFHU19UT19QQVNTKSBvbiB0aGUgY29tbWFuZCBsaW5lCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBseW54IGFuZCBseW54b3MKLQotRnJpIEp1biAgNCAxMDo1OTo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IEFjY2VwdCAtZWNvZmYqLCBub3QganVzdCAtZWNvZmYuCi0KLVRodSBKdW4gIDMgMTc6Mzg6NTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogVXNlIC5neiBzdWZmaXggaW5zdGVhZCBvZiAuei4KLQkoYmludXRpbHMudGFyLmd6LCBnYXMrYmludXRpbHMudGFyLmd6LCBnYXMudGFyLmd6KTogRml4ZWQgdGFyZ2V0Ci0JbmFtZXMuCi0KLVRodSBKdW4gIDMgMDA6Mjc6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodmF1bHQtaW5zdGFsbCk6IGFkZCBhbiAnZWxzZSB0cnVlJyAoZm9yIFVsdHJpeCkKLQotV2VkIEp1biAgMiAxODoxOToxNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMpOiAgaW5zdGFsbCBnY2MgbGFzdCwgc28KLQl0aGF0IHJlYnVpbGRzIHRoYXQgbWlnaHQgaGFwcGVuIGR1cmluZyAnbWFrZSBpbnN0YWxsJyBkb24ndCBnZXQKLQlib2d1cyBnY2MgaW5jbHVkZSBmaWxlcwotCi1XZWQgSnVuICAyIDE2OjE0OjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUNoYW5nZSBmcm9tIFV0YWggZm9yIEhQUEEgc3VwcG9ydDoKLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIGhwcGExLngtaHAtYnNkLgotCi1XZWQgSnVuICAyIDExOjUzOjMzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgQWRkIHN1cHBvcnQgZm9yIE1vdG9yb2xhIERlbHRhIDY4aywgdXAgdG8gcjN2Ny4KLQlQYXRjaCBmcm9tIHBvdEBmbHkuY251Y2UuY25yLml0IChGcmFuY2VzY28gUG90b3J0aWApLgotCi1UdWUgSnVuICAxIDE3OjQ4OjQyIDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWRkIHN1cHBvcnQgZm9yIHJvbTY4ayBhbmQgYnVnIGJvb3QgbW9uaXRvcnMuCi0KLU1vbiBNYXkgMzEgMDk6MzY6MzcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlIGFsbC1vcGNvZGVzIGRlcGVuZCBvbiBhbGwtYmZkLgotCi1UaHUgTWF5IDI3IDA4OjA1OjMxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBBZGRlZCBzcGVjaWFsIGNoZWNrIGZvciBpWzM0XTg2LXVuaXZlbC1zeXN2NCouCi0KLVdlZCBNYXkgMjYgMTY6MzM6NDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IEZvciBpWzM0XTg2LXVua25vd24tc3lzdjQgdXNlIFVOQU1FX01BQ0hJTkUgZm9yCi0JdGhlIHByb2Nlc3NvciByYXRoZXIgdGhhbiBhc3N1bWluZyBpNDg2LgotCi1XZWQgTWF5IDI2IDA5OjQwOjE4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IFJlY29nbml6ZSBTdW5PUzYgYXMgU29sYXJpczMuCi0KLVR1ZSBNYXkgMjUgMjM6MDM6MTEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogIEZpeCB0eXBvLiAgQXZvaWQgI2VsaWYgKG5vdCBpbiBLJlIgMSkuCi0JUmVjb2duaXplIFN1bk9TIDUuKiBvbmx5IChhbmQgbm90IFs2LTldLiopIGFzIGJlaW5nIFNvbGFyaXMyLgotCi1UdWUgTWF5IDI1IDEyOjQ0OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rIChhbGwtY3Jvc3MpOiBOZXcgdGFyZ2V0IGZvciBDYW5hZGlhbiBDcm9zcy4KLQlBZGRlZCBRMiBnbzMyIHRhcmdldHMuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBDb25maWd1cmUgZ28zMiBjcm9zcyBzcGFyY2xpdGUtYW91dCBhbmQKLQltaXBzLWlkdC1lY29mZiAtd2l0aC1nbnUtbGQuICBNb3ZlZCBidWlsZCBiaW5hcnkgZGlyZWN0b3J5IGZyb20KLQlQQVJUSUFMX0hPTEVfRElSUyB0byBCVUlMRF9IT0xFU19ESVJTLgotCi1Nb24gTWF5IDI0IDE1OjMwOjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBmaXggQWxwaGEgR0RCIHR5cG87IGFsc28sIGRvbid0IGJ1aWxkIERlamFHbnUgZm9yCi0JR08zMiBob3N0ZWQgdG9vbGNoYWlucwotCi1Nb24gTWF5IDI0IDE0OjE4OjQxIDE5OTMgIFJvYiBTYXZveWUgIChyb2IgYXQgZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBjaGFuZ2UgIHNvICItZXhlYy1wcmVmaXgiIGdldHMgcGFzc2VkIGRvd24gcmF0aGVyCi0JdGhhbiAiLWV4ZWNfcHJlZml4IiBzbyBhdXRvY29uZiBnZW5lcmF0ZWQgTWFrZWZpbGVzIGdldCB0aGUKLQlleGVjX3ByZWZpeCBzZXQgcmlnaHQuCi0KLUZyaSBNYXkgMjEgMTA6NDI6MjUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6IGdldCB0aGUgU29sYXJpczIgbWlub3IgdmVyc2lvbiBudW1iZXIKLQotCSogTWFrZWZpbGUuaW46IGFkZCBzdGFuZGFyZHMudGV4aSBhbmQgbWFrZS1zdGRzLnRleGkgdG8gRVRDX1NVUFBPUlQKLQotRnJpIE1heSAyMSAwNjoyMDo1MiAxOTkzICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIHNvbWUgU2VxdWVudCBwbGF0Zm9ybXMuCi0KLVRodSBNYXkgMjAgMTQ6MzM6NDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdGhlIHZhdWx0LWluc3RhbGwgdGFyZ2V0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogYWN0dWFsbHkgdXNlIHRoZSBTdW4zIG1ha2VmaWxlIGZyYWdtZW50IHRoYXQncyBpbgotCWNvbmZpZywgYWxzbyBhZGRlZCB0aGUgcmVsZWFzZSBkaXIgdG8gY29uZmlnZGlycwotCi1UaHUgTWF5IDIwIDE0OjE5OjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRheik6IEZpeCBtb2RlcyBvbiBzdHVmZiBpbiAkKFRPT0wpIGRpciBhbHNvLgotCi1UdWUgTWF5IDE4IDIwOjI2OjQxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZW1vdmUgc29tZSBwcm9ncmFtIGZyb20gQWxwaGEgdGFyZ2V0dGVkIHRvb2xjaGFpbnMKLQotVHVlIE1heSAxOCAxNToyMzoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRkRJUlMpOiBSZW5hbWVkIGZyb20gUFJPVE9ESVJTLiAgQWRkIGxkIGFuZAotCWdwcm9mLgotCSh0YXopOiBSdW4gIm1ha2UgZGlzdHN0dWZmIiBpbiB0aG9zZSBkaXJlY3RvcmllcyBpbnN0ZWFkIG9mICJtYWtlCi0JcHJvdG8tZGlyIi4gIExvb2sgZm9yICJWRVJTSU9OPSIgb25seSBhdCBzdGFydCBvZiBsaW5lIGluIHN1YmRpcgotCU1ha2VmaWxlLiAgVXNlICJnemlwIC05IiBmb3IgY29tcHJlc3Npb24uCi0JKFRFWElORk9fU1VQUE9SVCwgRElTVF9TVVBQT1JULCBCSU5VVElMU19TVVBQT1JUX0RJUlMpOiBOZXcgdmFycy4KLQkoYmludXRpbHMudGFyLnopOiBOZXcgdGFyZ2V0LgotCi1Nb24gTWF5IDE3IDE3OjAxOjE1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGF6KTogSW5jbHVkZSBncGwudGV4aW5mby4KLQotRnJpIE1heSAxNCAwNjo0ODozOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMpOiBNZXJnZWQgaW50byAidGF6IiB0YXJnZXQuCi0JKHRheik6IE9ubHkgZG8gYHByb3RvLWRpcicgc3R1ZmYgaWYgYSBkaXJlY3RvcnkgaXMgYWN0dWFsbHkgbmVlZGVkCi0JZm9yIHRoaXMgdGFyZ2V0LgotCi1XZWQgTWF5IDEyIDEzOjA5OjQ0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1VTkNIX05NKTogTmV3IHZhcmlhYmxlLCBkZWZpbmVkIHRvIGJlICQoTk0pLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIE1VTkNIX05NLgotCShIT1NUX0NDLCBIT1NUX1BSRUZJWCwgSE9TVF9QUkVGSVhfMSk6IE5ldyB2YXJpYWJsZXMuCi0JKEVYVFJBX0dDQ19GTEFHUyk6IFBhc3MgZG93biBIT1NUXyogdmFyaWFibGVzLgotCShnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IENvcnJlY3QgZm9yIGN1cnJlbnQgZ2NjIE1ha2VmaWxlLgotCi1UdWUgTWF5IDExIDEwOjE0OjI1IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgQWRkIGNvbmZpZ3VyZSwgY29uZmlnLmd1ZXNzLAotCWNvbmZpZy5zdWIsIGFuZCBtb3ZlLWlmLWNoYW5nZSB0byBnZGIgdGVzdHN1aXRlIGRpc3RyaWJ1dGlvbgotCWFyY2hpdmUsIHNvIHRoZSB0ZXN0c3VpdGUgY2FuIGJlIGV4dHJhY3RlZCwgY29uZmlndXJlZCwgYW5kCi0JcnVuIHNlcGFyYXRlbHkgZnJvbSB0aGUgZ2RiIGRpc3RyaWJ1dGlvbi4gIEJsb3cgYXdheSB0aGUgQ2hpbGwKLQl0ZXN0cyB0aGF0IHJlcXVpcmUgYSBDaGlsbCBjb21waWxlZCBleGVjdXRhYmxlLCBzaW5jZSBHTlUgQ2hpbGwKLQlpcyBub3QgeWV0IHB1YmxpY2FsbHkgYXZhaWxhYmxlLgotCi1Nb24gTWF5IDEwIDE3OjIyOjI2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIHNpbmdsZSBjb21tYW5kLAotCWluc3RlYWQgb2YgYSBsaXN0IG9mIGFzc2lnbm1lbnRzIGFuZCBleHBvcnRzCi0KLQkqIGNvbmZpZy5ndWVzczogcmVjb2duaXplIEFscGhhL09TRjEgc3lzdGVtcwotCi1Nb24gTWF5IDEwIDE0OjU1OjUxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBDaGFuZ2UgaGVscCBtZXNzYWdlIHRvIHByZWZlciAtLW9wdGlvbnMgcmF0aGVyIHRoYW4KLQkgIC1vcHRpb25zLgotCi1Nb24gTWF5IDEwIDA1OjU4OjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBDb252ZXJnZW50IFRlY2guICJtaW5pZnJhbWUiIHVzZXMgbTY4MDEwLCBzZXoKLQl6aXBweUBlY3N0LmNzdWNoaWNvLmVkdS4KLQkqIGNvbmZpZy5ndWVzczogUmVjb2duaXplIG1pbmlmcmFtZS4KLQotU3VuIE1heSAgOSAxNzo0Nzo1NyAxOTkzICBSb2IgU2F2b3llICAocm9iIGF0IGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLSAgICAgICAqIE1ha2VmaWxlLmluOiBVc2Ugc3Jjcm9vdCB0byBmaW5kIHJ1bnRlc3QgcmF0aGVyIHRoYW4gcm9vdG1lLgotICAgICAgIFBhc3MgUlVOVEVTVEZMQUdTIGFuZCBFWFBFQ1QgZG93biBpbiBCQVNFX0ZMQUdTX1RPX1BBU1MuCi0KLUZyaSBNYXkgIDcgMTQ6NTU6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIHN1cHBvcnQgYnVpbGRpbmcgb24gYQotCW1hY2hpbmUgb3RoZXIgdGhhbiB0aGUgaG9zdC4KLQotV2VkIE1heSAgNSAwODozNTowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh0b29sZGlyKTogRml4IGZvciBpMzg2LWFpeCBhZ2Fpbi4KLQotTW9uIE1heSAgMyAxOTowMDoyNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogIENoYW5nZSBkZWZpbml0aW9uIG9mICQodG9vbGRpcikKLQl0byBtYXRjaCB0aGUgRlNGLgotCi1GcmkgQXByIDMwIDE1OjU1OjIxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgaVszNF04Ni9TVlI0LgotCi1GcmkgQXByIDMwIDE1OjUyOjQ2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLWdkYik6IGdkYiBkZXBlbmRzIG9uIHNpbS4KLQotVGh1IEFwciAyOSAyMzozMDo0OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGdkYi50YXIuWik6ICBNYWtlIHByb3RvdHlwZSBnZGIgdGVzdHN1aXRlIGRpcmVjdG9yeQotCWF0IHRoZSBzYW1lIHRpbWUgd2UgbWFrZSB0aGUgcHJvdG90eXBlIGdkYiBkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgTWFrZSB0aGUgdGVzdHN1aXRlIGRpc3RyaWJ1dGlvbgotCWZpbGVzIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIGdkYiBiYXNlIHJlbGVhc2UgZGlzdHJpYnV0aW9uLgotCi1UaHUgQXByIDI5IDEyOjUwOjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogVXNlIGluZGl2aWR1YWwgY2hlY2sgdGFyZ2V0cyByYXRoZXIgdGhhbgotCURPX1ggcnVsZS4KLQkoY2hlY2stZ2NjKTogQWRkZWQuCi0KLVRodSBBcHIgMjkgMDk6NTA6MDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFVzZSBzeXN2My4yIG5vdCBzeXN2MzIgZm9yIGNhbm9uaWNhbCBPUwotCWZvciBTeXN0ZW0gViByZWxlYXNlIDMuMi4KLQotVGh1IEFwciAyOSAxMDozMzoyMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSBocHBhb3NmLgotCSogY29uZmlndXJlLmluOiBEbyBjb25maWd1cmUgbGQvYmludXRpbHMvZ2FzIGZvciBpdC4KLQotVHVlIEFwciAyNyAwNjoyNTozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlICh0b29sZGlyKTogQWx0ZXIgc3ludGF4IHVzZWQgdG8gc2V0IHRoaXMsIGZvciBzeXN0ZW1zCi0Jd2hlcmUgIlwkIiBpc24ndCBoYW5kbGVkIHJpZ2h0LCBsaWtlIGkzODYtYWl4LgotCi1UaHUgQXByIDIyIDA4OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBQYXNzIHByb2dyYW0tdHJhbnNmb3JtLW5hbWUsIG5vdAotCXByb2dyYW1fdHJhbnNmb3JtX25hbWUsIHRvIHJlY3Vyc2l2ZSBjb25maWd1cmVzLgotCi1UaHUgQXByIDIyIDAyOjU4OjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2FzK2JpbnV0aWxzLnRhci56KTogTmV3IHJ1bGUgZm9yIGJ1aWxkaW5nIHNuYXBzaG90cwotCW9mIGdhcytsZCtiaW51dGlscy4KLQotTW9uIEFwciAxOSAxNzo0MTozMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiAgUmVjb2duaXplIEFJWDMuMiBhcyBkaXN0aW5jdCBmcm9tIDMuMS4KLQotU2F0IEFwciAxNyAxNzoxOTo1MCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVuYW1lIG04OGstbW90b3JvbGEtbTg4a2JjcyB0byBtODhrLW1vdG9yb2xhLXN5c3YKLQotCSogY29uZmlnL21oLWRlbHRhODg6IHJlbW92ZSBleHRyYW5lb3VzIEdDQyByZWZlcmVuY2VzCi0KLVR1ZSBBcHIgMTMgMTY6NTI6MTYgMTk5MyAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUFJNUyk6IFNldCBiYWNrIHRvIGFsbC1wcm1zLgotCi1TYXQgQXByIDEwIDEyOjA0OjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogUGFzcyAtd2l0aC1nbnUtYXMgZm9yIGtub3duIE1JUFMgbmF0aXZlIGFuZCBNSVBTCi0JdGFyZ2V0cywgcmF0aGVyIHRoYW4gZm9yIE1JUFMgaG9zdHMuCi0KLUZyaSBBcHIgIDkgMTM6NTE6MDYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBjb21tZW50IGZvciAtLXdpdGgteCBkZWZhdWx0IHZhbHVlcwotCi0JKiBjb25maWcuZ3Vlc3M6IGhhbmRsZSBNb3Rvcm9sYSBEZWx0YTg4IGJveCBmb3IgU1ZSMyBhbmQgU1ZSNC4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBjaGVjay0qIHRhcmdldHMgZm9yIGVhY2ggb2YgdGhlIGRpcmVjdG9yaWVzIGluCi0JdGhlIHRyZWUuICBBZGQgYSBkZWZpbml0aW9uIG9mIFJVTlRFU1QgdGhhdCB3aWxsIHVzZSB0aGUgb25lIHdlCi0JanVzdCBidWlsdCwgaWYgaXQgZXhpc3RzLiAgUGFzcyB0aGlzIGRvd24gdmlhIEZMQUdTX1RPX1BBU1MuCi0KLVRodSBBcHIgIDggMDk6MjE6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZWQgb2Jzb2xldGUgcmVmZXJlbmNlcyB0byBiZmRfdGFyZ2V0IGFuZAotCXRhcmdldF9tYWtlZmlsZV9mcmFnLgotCi0JKiBidWlsZC1hbGwubWs6IFNldCBhc3NvcnRlZCB0YXJnZXRzIGZvciBRMi4KLQkqIGNvbmZpZy5zdWI6IFJlY29nbml6ZSB6OGstc2ltIGFuZCBoODMwMC1obXMuCi0JKiB0ZXN0LWJ1aWxkLm1rOiBSZWFsbHkgZG9uJ3QgcGFzcyBob3N0IHRvIGNvbmZpZ3VyZS4KLQkoSE9MRVMpOiBBZGRlZCB1bmFtZS4KLQotV2VkIEFwciAgNyAxNTo0ODoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogSGFuZGxlIGFuIGVtcHR5IHByb2dyYW0tcHJlZml4LCBwcm9ncmFtLXN1ZmZpeCBvcgotCXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgY29ycmVjdGx5LgotCi1UdWUgQXByICA2IDEzOjQ4OjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYnVpbGQtYWxsLm1rOiAtRyA4IG5vIGxvbmdlciByZXF1aXJlZCBmb3IgTUlQUyB0YXJnZXRzLgotCSogdGVzdC1idWlsZC5tazogRG9uJ3QgcGFzcyBob3N0IGFyZ3VtZW50IHRvIGNvbmZpZ3VyZTsgbWFrZSBpdAotCWd1ZXNzLgotCi1UdWUgQXByICA2IDEwOjM2OjUzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2RiLnRhci5aKTogIEZpeCBmb3IgYnVpbGRpbmcgZ3ppcCdkIGRpc3RyaWJ1dGlvbi4KLQkqIE1ha2VmaWxlLmluIChDT01QUkVTUyk6ICBOZXcgbWFjcm8sIGxpa2UgR1pJUC4KLQotRnJpIEFwciAgMiAwOTowMjozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IFVzZSAtd2l0aC1nbnUtYXMgZm9yIG1pcHMtc2dpLWlyaXg0IGFzIHdlbGwuCi0KLQkqIGJ1aWxkLWFsbC5tazogU2V0IEdDQyB0byBnY2MgLU8gLUcgOCBmb3IgTUlQUyB0YXJnZXRzLCBzaW5jZSBnY2MKLQl3aXRoIGdhcyBjdXJyZW50bHkgZGVmYXVsdHMgdG8gLUcgMC4KLQotVGh1IEFwciAgMSAwODoyNTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZmxleCk6IGZsZXggZGVwZW5kcyBvbiBieWFjYy4KLQotCSogYnVpbGQtYWxsLm1rOiBJZiBob3N0IG5vdCBzcGVjaWZpZWQsIHVzZSBjb25maWcuZ3Vlc3MuICBQYXNzIFRBRwotCXRvIHRlc3QtYnVpbGQubWsgYXMgUkVMRUFTRV9UQUcuCi0JKiB0ZXN0LWJ1aWxkLm1rIChjb25maWdhcmdzKTogTmV3IHZhcmlhYmxlIGNvbnRhaW5pbmcgYXJndW1lbnRzIHRvCi0JcGFzcyB0byBjb25maWd1cmUuICBTZXQgdG8gLXdpdGgtZ251LWFzIG9uIG1pcHMtZGVjLXVsdHJpeC4KLQkoRkxBR1NfVE9fUEFTUyk6IFBhc3MgZG93biBSRUxFQVNFX1RBRy4KLQotCSogY29uZmlnLmd1ZXNzOiBVc2UgL2Jpbi91bmFtZSB3aGVuIGNoZWNraW5nIC1YIGFyZ3VtZW50IG9uIFNDTywKLQl0byBhdm9pZCBpbnZva2luZyBHTlUgdW5hbWUgd2hpY2ggZG9lc24ndCB1bmRlcnN0YW5kIC1YLgotCi0JKiB0ZXN0LWJ1aWxkLm1rOiBEb24ndCB1c2UgL3Vzci91bnN1cHBvcnRlZC9iaW4vYXMgb24gQUlYLgotCi0JKiBjb25maWd1cmUuaW46IEJ1aWxkIGdhcyBmb3IgbWlwcy0qLSouCi0KLVdlZCBNYXIgMzEgMjE6MjA6NTggMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLm5vcm1hbCk6IGluc2VydCBtaXNzaW5nIGJhY2tzbGFzaC4KLQotV2VkIE1hciAzMSAxMjozMTo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJ1aWxkLWFsbC5taywgY29uZmlnL21oLWlyaXg0OiBCdW1wIC1YTmggdmFsdWUgdG8gMTUwMCB0byBtYXRjaAotCWdjYyByZXF1aXJlbWVudHMuCi0KLQkqIE1ha2VmaWxlLmluOiBDb21wbGV0ZSBvdmVyaGF1bCB0byBtZXJnZSBtYW55IGFsbW9zdCBpZGVudGljYWwKLQl0YXJnZXRzLgotCi1UdWUgTWFyIDMwIDIwOjE3OjAxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMtZ2RiKTogUmVuYW1lZCBmcm9tIHNldHVwLWRpcnMuCi0JKGdkYi50YXIuWik6IEFkanVzdGVkLgotCi0JKiBNYWtlZmlsZS5pbiAoc2V0dXAtZGlycywgdGF6KTogTmV3IHRhcmdldHM7IHNob3VsZCBiZSBnZW5lcmFsCi0JZW5vdWdoIHRvIGFkYXB0IGZvciBnZGIgc29tZXRpbWUuICBCdWlsZCBvbmx5IC56IGZpbGUuCi0JKGdhcy50YXIueik6IE5ldyB0YXJnZXQuCi0KLVR1ZSBNYXIgMzAgMTA6MDM6MDkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBidWlsZC1hbGwubWs6IFVzZSBDQz1jYyAtWHMgb24gU29sYXJpcy4KLQotTW9uIE1hciAyOSAxOTo1OToyNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zdW4zOiBjYyBuZWVkcyAtSiB0byBjb21waWxlIGNwLXBhcnNlLmMgY29ycmVjdGx5Ci0KLQkqIGNvbmZpZy9taC1zb2xhcmlzOiBTdW5QUk8gQyBuZWVkcyAtWHMgdG8gYmUgYWJsZSB0byBnZXQgYQotCXdvcmtpbmcgeG1ha2VmaWxlIGZvciBFbWFjcy4KLQotVGh1IE1hciAyNSAxNToxNDozMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBJbmNvcnBvcmF0ZSBjaGFuZ2VzIHN1Z2dlc3RlZCBieSB3aWxzb25AY3lnbnVzLmNvbQotCWZvciBoYW5kbGluZyBCSVNPTiBmb3IgRlNGIHJlbGVhc2VzLgotCi1UaHUgTWFyIDI1IDA2OjE5OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IEFjdHVhbGx5IGltcGxlbWVudCB0aGUgY2hhbmdlIHpvbyBqdXN0IGRvY3VtZW50ZWQuCi0KLVdlZCBNYXIgMjQgMTM6MDI6NDQgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogd2hlbiB1c2luZyBjb25maWcuZ3Vlc3MsIG9ubHkgc2V0IHRhcmdldF9hbGlhcyB3aGVuCi0JaXQncyBub3QgYWxyZWFkeSBiZWVuIHNldCAoaWUsIG9uIHRoZSBjb21tYW5kIGxpbmUpCi0KLU1vbiBNYXIgMjIgMjM6MDc6MzkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGluc3RhbGxjaGVjayB0YXJnZXQsIHNldCBQUk1TIHRvIGluc3RhbGwtcHJtcwotCi1TdW4gTWFyIDIxIDE2OjQ2OjEyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGQgc3VwcG9ydCBmb3IgcGFja2FnZV9tYWtlZmlsZV9mcmFnbWVudCwgaGFuZGxlIHRoZQotCWNhc2Ugd2hlcmUgYSBkaXJlY3RvcnkgaGFzIGEgY29uZmlndXJlLmluIGZpbGUgYnV0IG5vIE1ha2VmaWxlLmluCi0JbW9yZSBncmFjZWZ1bGx5ICh3aXRoIGFuIGFjdHVhbCB1bmRlcnN0YW5kYWJsZSBlcnJvciBtZXNzYWdlLCBldmVuKTsKLQlhZGQgc3VwcG9ydCBmb3IgLS13aXRob3V0IChhbmQgYWRkIHRoaXMgdG8gdGhlIHVzYWdlIG1lc3NhZ2UpOyBhbHNvCi0JZXhwbGljaXRseSBhZGQgYSAtLWhvc3Q9JHtob3N0X2FsaWFzfSB0byB0aGUgY29tbWFuZCBsaW5lIHdoZW4KLQljb25maWcuZ3Vlc3MgaXMgdXNlZAotCi1TdW4gTWFyIDIxIDEyOjExOjU4IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBNdXN0IHVzZSBib3RoIC0taG9zdCBhbmQgLS10YXJnZXQgaW4gcmVjdXJzaXZlIGNhbGxzLgotCi1UaHUgTWFyIDE4IDEyOjMxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBkZWphLWdudSB0byBkZWphZ251LgotCi1Nb24gTWFyIDE1IDE1OjQ0OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChoODMwMC0qLSosIGg4NTAwLSotKik6IERvbid0IGJ1aWxkIGxpYmcrKy4KLQotRnJpIE1hciAxMiAxODozMDoxNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogY2Fub25pY2FsaXplIGFsbCBpbnN0YW5jZXMgdG8gKi0qLXNvbGFyaXMyKiwKLQlhbHNvIHN0cmlwIG91dCBhIG51bWJlciBvZiB0b29scyB0byBub3QgYnVpbGQgZm9yIGdvMzIgaG9zdAotCi1XZWQgTWFyIDEwIDEyOjA4OjI3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmd1ZXNzOiBhZGQgR1BMLgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmd1ZXNzLCBjb25maWcuc3ViLCBjb25maWd1cmU6IGJ1bXAKLQkgIGNvcHlyaWdodHMgdG8gOTMuCi0KLVdlZCBNYXIgMTAgMDc6MTI6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZG8taW5mbyk6IFJlbW92ZWQgb2Jzb2xldGUgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZgotCWxvY2FsZW52IGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCi1XZWQgTWFyIDEwIDAzOjExOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGEgY291cGxlIG9mICdlbHNlIHRydWUnIGZvciBkZWNzdGF0aW9uLAotCXN1cHBvcnQgZm9yIFRjbFgKLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgdGNsWCB0b287IGRvbid0IHJlbW92ZSBUayBvbiBSUy82MDAwIGFueW1vcmUKLQotVHVlIE1hciAgOSAxNjowNjoxMiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHNldHVwLWRpcnMpOiBjaGFuZ2UgaW52b2NhdGlvbiBvZiBtYWtlIHRvICQoTUFLRSkuCi0KLU1vbiBNYXIgIDggMTQ6NTI6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZSkKLQotCSogY29uZmlnLmd1ZXNzOiBSZWNvZ25pemUgaTM4Ni1pYm0tYWl4IChQUy8yKS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGNvbmZpZy9taC1haXgzODYgZmlsZSBmb3IgaXQuCi0KLU1vbiBNYXIgIDggMTE6MTI6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoR0NDX0ZPUl9UQVJHRVQpOiBFbGltaW5hdGVkIGRlZmluaXRpb247IHVzZQotCUNDX0ZPUl9UQVJHRVQgaW5zdGVhZC4KLQkoQkFTRV9GTEFHU19UT19QQVNTKTogUGFzcyBHQ0NfRk9SX1RBUkdFVD0kKENDX0ZPUl9UQVJHRVQpLgotCi1XZWQgTWFyICAzIDE2OjAwOjI4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQG9rLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc2ltIHRvIGxpc3Qgb2YgZGlyZWN0b3JpZXMgc2VudCB3aXRoIGdkYgotCi1XZWQgTWFyICAzIDExOjQyOjM5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFB1dCBiYWNrIG1pcHMtZGVjLWJzZCogY2FzZS4KLQotVHVlIE1hciAgMiAyMToxNTo1OCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCShVbHRyaXggMi4yIHN1cHBvcnQgZnJvbSBNaWNoYWVsIFJlbmRlbGwgPG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2E+KQotCSogY29uZmlndXJlLmluICh2YXgtKi11bHRyaXgyKik6ICBBZGQgVWx0cml4IDIuMiB0cmlwbGV0LgotCSogY29uZmlnLmd1ZXNzOiAgQ2hhbmdlICdWQVgqOlVMVFJJWDoqOionIHRvICdWQVgqOlVMVFJJWCo6KjoqJy4KLQkqIGNvbmZpZy9taC12YXh1bHQyOiAgTmV3IGZpbGUuCi0KLVR1ZSBNYXIgIDIgMTg6MTE6MDMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBuby1vcCBtaXBzLWRlYy1ic2QqIGluICJjYXNlICR0YXJnZXQiCi0KLQkqIE1ha2VmaWxlLmluIChkaXIuaW5mbyk6IG9ubHkgcnVuIGdlbi1pbmZvLWRpciBpZiBpdCBleGlzdHMsCi0JKGluc3RhbGwtaW5mbyk6IGluc3RhbGwgZGlyLmluZm8gb25seSBpZiBpdCBleGlzdHMsCi0JKGFsbC1leHBlY3QsIGluc3RhbGwtZXhwZWN0KTogcGFzcyBhbG9uZyBYMTFfRkxBR1NfVE9fUEFTUwotCi1UdWUgTWFyICAyIDA5OjAxOjMwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEZvciB2bXMgdGFyZ2V0LCBza2lwIGJmZCwgbGQsIGJpbnV0aWxzLiAgRG8gYnVpbGQKLQlnYXMgZm9yIG1pcHMtZGVjLWJzZC4KLQotVHVlIE1hciAgMiAwODozNToyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSAobWFrZXNyY2Rpcik6IElmICR7c3JjZGlyfSBpcyByZWxhdGl2ZSBhbmQgbm90ICIuIiwKLQlhbmQgJHtzdWJkaXJ9IGlzIG5vdCAiLiIsIHNldCBtYWtlc3JjZGlyIGJhc2VkIG9uICR7aW52c3ViZGlyfS4KLQotVHVlIEZlYiAyMyAxNDoxODoyOCAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkICJkZWphZ251IiB0byBob3N0dG9vbHMgbGlzdC4KLQotTW9uIEZlYiAyMiAyMzoyODozOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIsIGNvbmZpZ3VyZS5pbiwgY29uZmlnLmd1ZXNzOiAgQWRkIHN1cHBvcnQKLQlmb3IgQm9zeCwgYW4gQUlYIHZhcmlhbnQgZnJvbSBCdWxsLgotCVBhdGNoZXMgZnJvbSBGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIuCi0KLVN1biBGZWIgMjEgMTE6MTU6MjIgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZGV2by9kZWphZ251OiBJbml0aWFsIGNyZWF0aW9uIG9mIGRldm8vZGVqYWdudS4KLQlNaWdyYXRlZCBkZWphZ251IHRlc3RjYXNlcyBhbmQgc3VwcG9ydCBmaWxlcyBmb3IgdGVzdGluZyBzb2Z0d2FyZQotCXRvb2xzIHRvIHJlc2lkZSBhcyBzdWJkaXJlY3RvcmllcywgY3VycmVudGx5IGNhbGxlZCAidGVzdHN1aXRlIiwKLQl3aXRoaW4gdGhlIGRpcmVjdG9yeSBvZiB0aGUgc29mdHdhcmUgdG9vbC4gIE1pZ3JhdGVkIGFsbCBwcm9ncmFtcywKLQlzdXBwb3J0IGxpYnJhcmllcywgZXRjLiBiZWxvZ2luZyB0byBkZWphZ251IHByb3BlciBmcm9tCi0JZGV2by9kZWphLWdudSB0byBkZXZvL2RlamFnbnUuCVRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgotCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4JVGhlIGNoYW5nZXMgdG8gdGhlc2UgZmlsZXMgd2hpY2ggd2lsbAotCWFsbG93IHRoZW0gdG8gY29uZmlndXJlLCBidWlsZCwgYW5kIGV4ZWN1dGUgcHJvcGVybHkgd2lsbCBiZSBtYWRlCi0JaW4gYSBmdXR1cmUgdXBkYXRlLgotCi1GcmkgRmViIDE5IDIwOjE5OjM5IDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZSBzZW5kX3ByIHRvIHNlbmQtcHIuCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCSogc2VuZF9wcjogUmVuYW1lZCBkaXJlY3RvcnkgdG8gc2VuZC1wci4KLQotRnJpIEZlYiAxOSAxOTowMDoxMyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgc29tZSBleHRyYSBzZW1pLWNvbG9ucyAobmVlZGVkIGlmIFNIRUxMPWJhc2gpLgotCi1GcmkgRmViIDE5IDAwOjU5OjMzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBVcGRhdGUgZm9yIGdkYi00LjggcmVsZWFzZS4KLQkqIE1ha2VmaWxlLmluIChnZGIudGFyLlopOiAgQWRkIHRleGluZm8vdGV4M3BhdGNoLiAgQnVpbGQKLQlnZGIteHh4LnRhci56IChnemlwJ2QpIGZpbGUgYWxzby4KLQotVGh1IEZlYiAxOCAwOToxNjoxNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWtlIGFsbC1kaWZmIGRlcGVuZCBvbiBhbGwtbGliaWJlcnR5Ci0KLVR1ZSBGZWIgMTYgMTY6MDY6MzEgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5ndWVzczogYWRkIHZheC11bHRyaXggaW4gdGhlIHNwaXJpdCBvZiBtaXBzLXVsdHJpeC4KLQotVHVlIEZlYiAxNiAwNTo1NzoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IGFkZCBoZWxsbywgdGFyLCBnemlwLCByZWNvZGUsIGluZGVudAotCi1UdWUgRmViIDE2IDAwOjU4OjIwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVWT19TVVBQT1JUKTogIFJlbW92ZSBldGMgZGlyZWN0b3J5Ci0JKEVUQ19TVVBQT1JUKTogIE9ubHkgYWRkIHRoZSBmaWxlcyBHREIgd2FudHMgZnJvbSBldGMvLgotCShnZGIudGFyLlopOiAgVXNlIEVUQ19TVVBQT1JULiAgVXNlIGJ5YWNjIHdoZW4gYnVpbGRpbmcgdGhlIGZpbGUuCi0KLVRodSBGZWIgMTEgMjA6MTQ6MjggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIG1ha2VpbmZvIGJpbmFyeSBpcyBpbiBhIG5ldyBsb2NhdGlvbgotCi1UdWUgRmViICA5IDEyOjQyOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogQWNjZXB0IC1lY29mZiBhcyBhbiBPUy4KLQotCSogTWFrZWZpbGUuaW46IFZhcmlvdXMgY2hhbmdlcyB0byBlbGltaW5hdGUgYSBsZXZlbCBvZiBtYWtlCi0JcmVjdXJzaW9uIGFuZCByZWR1Y2UgdGhlIHJlcXVpcmVkIGNvbW1hbmQgbGluZSBsZW5ndGguCi0JKEJBU0VfRkxBR1NfVE9fUEFTUyk6IE5ldyB2YXJpYWJsZSBob2xkaW5nIGZsYWdzIHBhc3NlZCB0byBhbGwKLQlzdWItbWFrZXMuCi0JKEVYVFJBX0hPU1RfRkxBR1MsIEVYVFJBX1RBUkdFVF9GTEFHUywgRVhUUkFfR0NDX0ZMQUdTKTogTmV3Ci0JdmFyaWFibGVzIGhvbGRpbmcgc2V0dGluZ3MgZm9yIHNwZWNpZmljIHN1Yi1tYWtlcy4KLQkoRkxBR1NfVE9fUEFTUywgVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIEdDQ19GTEFHU19UT19QQVNTKTogUmV3cm90ZQotCWluIHRlcm1zIG9mIEJBU0VfRkxBR1NfVE9fUEFTUy4KLQkoVEFSR0VUX0xJQlMpOiBOZXcgdmFyaWFibGUgbGlzdGluZyBkaXJlY3RvcmllcyB3aGljaCB1c2UKLQlUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLQkoc3ViZGlyX2RvKTogRWxpbWluYXRlZC4KLQkoZG8tKik6IE5ldyBzZXQgb2YgdGFyZ2V0cyB0byByZXBsYWNlIHN1YmRpcl9kby4KLQkodmFyaW91cyk6IEFsbCB0YXJnZXRzIHdoaWNoIHVzZWQgc3ViZGlyX2RvIG5vdyBkZXBlbmQgb24gZG8tKi4KLQkobG9jYWwtY2xlYW4pOiBSZW5hbWVkIGZyb20gZG9fY2xlYW4uCi0JKGxvY2FsLWRpc3RjbGVhbik6IE5ldyB0YXJnZXQsIGRlcGVuZGVuY3kgb2YgZGlzdGNsZWFuIGFuZAotCXJlYWxjbGVhbi4KLQkoaW5zdGFsbC1pbmZvKTogRG9uJ3QgY3JlYXRlIGRpcmVjdG9yaWVzLiAgRGVwZW5kIG9uIGRpci5pbmZvCi0JcmF0aGVyIHRoYW4gY2FsbGluZyBtYWtlIHJlY3Vyc2l2ZWx5LgotCShpbnN0YWxsLWRpci5pbmZvKTogRWxpbWluYXRlZC4KLQkoaW5zdGFsbC1pbmZvLWRpcnMpOiBDcmVhdGUgYWxsIGluZm8gZGlyZWN0b3JpZXMgaGVyZS4KLQkoZGlyLmluZm8pOiBEZXBlbmQgdXBvbiBkby1pbnN0YWxsLWluZm8uCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkZWQgZmFsc2UuCi0KLVNhdCBGZWIgIDYgMTQ6MDU6MDkgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuZ3Vlc3M6ICBSZWNvZ25pemUgQlNESSBhbmQgQlNESiAoSm9saXR6IDM4NmJzZCkuCi0KLVRodSBGZWIgIDQgMjA6NDk6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5mbyk6IHJlbW92ZSBkZXBlbmRlbmN5IG9uIGFsbC10ZXhpbmZvLiAgVGhlCi0JcHJvYmxlbSB3YXMgcmVhbGx5IGluIHRleGluZm8vQywgbm90IGF0IHRoaXMgbGV2ZWwuCi0KLVRodSBGZWIgIDQgMTM6Mzg6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5mbyk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYWxsLXRleGluZm8gKFBSIDIxMTIpLgotCi1UaHUgRmViICA0IDAxOjUwOjUzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgQ2hhbmdlIEJJU09OIHRvICdiaXNvbiAteScgZm9yCi0JR0RCIHJlbGVhc2VzLgotCi1XZWQgRmViICAzIDE3OjIyOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBJbmNsdWRlIHNyY2RpciBpbiBtZXNzYWdlIGFib3V0IHRhcmdldCBvZiBsaW5rIG5vdAotCWJlaW5nIGZvdW5kLiAgRG9uJ3QgY29udmVydCBgLScgdG8gYF8nIGluIGB3aXRoJyBvcHRpb25zIGJlaW5nCi0JcGFzc2VkIHRvIHN1YmRpcnMuCi0KLVR1ZSBGZWIgIDIgMTg6NTc6NTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCB1dWRlY29kZSB0byBob3N0X3Rvb2xzCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB7YWxsLGluc3RhbGx9LXV1ZGVjb2RlIHRhcmdldHMsIGFkZGVkIHRoZW0gdG8KLQl0aGUgYXBwcm9wcmlhdGUgbGlzdHMKLQotVHVlIEZlYiAgMiAxMTo0NTo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtZ2NjKTogQWRkZWQgZGVwZW5kZW5jeSBvbiBhbGwtZ2FzLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi0qKTogQnVpbGQgbGQgYW5kIGJpbnV0aWxzLgotCi1Nb24gRmViICAxIDEyOjM1OjQxIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBjaGVjayByZXR1cm4gY29kZSBmcm9tIG1rZGlyLCBwcmludCBlcnJvciBtZXNzYWdlIGFuZAotCSAgZXhpdCBvbiBmYWlsdXJlLgotCi1TYXQgSmFuIDMwIDE2OjQwOjI4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nZGIudGFyLlopOiAgTmV3IGxvY2F0aW9uIGZvciB0ZXhpbmZvLnRleC4KLQotVGh1IEphbiAyOCAxNTowOTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWsgKEhPTEVTKTogQWRkZWQgdGFyLCBjcGlvIGFuZCB1dWRlY29kZS4KLQotV2VkIEphbiAyNyAxNjo1MDozMiAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKGg4NTAwKTogIFJlY29nbml6ZSB0aGlzIGFzIGEgY3B1IHR5cGUuCi0KLVNhdCBKYW4gMjMgMjA6MzI6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IHNvdXJjZSBkaXJlY3RvcnkgbWlzc2luZyBpcyBubyBsb25nZXIgYSB3YXJuaW5nCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGlyaXhbMzRdKiBpbnN0ZWFkIG9mIGlyaXhbMzRdCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgYW5kIHBhc3MgZG93biBYMTFfTElCCi0KLQkqIGNvbmZpZy9taC1zY286IGRlZmluZSBYMTFfTElCIHRvIHRoZSBtZXNzIHRoYXQgU0NPIE9EVCByZXF1aXJlcwotCi1TYXQgSmFuIDIzIDEzOjQ5OjQwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBndWVzcy1zeXN0eXBlOiBSZW5hbWVkIHRvIC4uLgotCSogY29uZmlnLmd1ZXNzOiAgLi4uIGJ5IHBvcHVsYXIgcmVxdWVzdC4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46ICBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLVRodSBKYW4gMjEgMTI6MjA6NTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGd1ZXNzLXN5c3R5cGU6ICBQYXRjaGVzIGZyb20gSm9obiBFYXRvbiA8andlQGNoZS51dGV4YXMuZWR1PjoKLQkrIEFkZCBDb252ZXgsIENyYXkvVW5pY29zLCBhbmQgRW5jb3JlL011bHRpbWF4IHN1cHBvcnQuCi0JKyBFeGVjdXRlIC4vZHVtbXkgaW5zdGVhZCBvZiBhc3N1bWluZyAuIGlzIGluIFBBVEguCi0KLVR1ZSBKYW4gMTkgMTc6MTg6MDYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGd1ZXNzLXN5c3R5cGU6ICBOZXcgc2hlbGwgc2NyaXB0LiAgQXR0ZW1wdHMgdG8gZ3Vlc3MgdGhlCi0JY2Fub25pY2FsIGhvc3QgbmFtZSBvZiB0aGUgZXhlY3V0aW5nIGhvc3QuCi0JT25seSBhIGZldyBob3N0cyBhcmUgc3VwcG9ydGVkIHNvIGZhci4KLQkqIGNvbmZpZ3VyZTogIENhbGwgZ3Vlc3Mtc3lzdHlwZSBpZiBubyBob3N0IGlzIHNwZWNpZmllZC4KLQotVHVlIEphbiAxOSAwODoyNjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChnY2Mtbm8tZml4ZWRpbmNsdWRlcyk6IE1hZGUgdG8gd29yayB3aXRoIGN1cnJlbnQKLQlnY2MgTWFrZWZpbGUuCi0KLQotRnJpIEphbiAxNSAxMDoyNzowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHQ0NfRkxBR1NfVE9fUEFTUyk6IE5ldyB2YXJpYWJsZS4KLQkoYWxsLWdjYywgaW5zdGFsbC1nY2MsIHN1YmRpcl9kbyk6IFVzZSBpdC4KLQotV2VkIEphbiAxMyAxNzowNjo0NSAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBSZW5hbWUgdW5pbnN0YWxsZWQgZ2NjIGRyaXZlciBmcm9tIGdjYyB0byB4Z2NjLgotCi1XZWQgSmFuICA2IDIwOjI5OjE2IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlZCBleHBsaWNpdCBzZXR0aW5nIG9mIFNVQkRJUlMuIFNVQkRJUlMgaXMgbm93Ci0JICBzZXQgZXhjbHVzaXZlbHkgYnkgY29uZmlndXJlLCB1c2luZyBjb25maWd1cmUuaW4gLgotCi1XZWQgSmFuICA2IDEzOjQ0OjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogc2V0ICRQQVRIIGZvciBhbGwgYnVpbGRzCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIFRBUkdFVF9GTEFHU19UT19QQVNTIGZvciB4aWJlcnR5IGFuZCBsaWJtCi0KLVdlZCBKYW4gIDYgMTE6MDI6MTAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChHQ0NfRk9SX1RBUkdFVCk6ICBTdXBwbHkgYSBkZWZhdWx0IHRoYXQgbWF0Y2hlcwotCXRoZSBvbmUgdXNlZCBpbiBnY2MvTWFrZWZpbGUuaW4sIHNvIHRoYXQgYSBudWxsIGV4cGFuc2lvbiBkb2Vzbid0Ci0Jb3ZlcnJpZGUgdGhlIG9uZSBuZWVkZWQgdG8gYnVpbGQgZ2NjIHdpdGggYSBuYXRpdmUgY2MuCi0KLQotVHVlIEphbiAgNSAwNzo1NToxMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWNjZXB0IC13aXRoIGFyZ3VtZW50cy4KLQotU3VuIEphbiAgMyAxNToxNTowOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGg4MzAwc2ltCi0KLVR1ZSBEZWMgMjkgMTU6MDY6MDAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc2NvOiBEb24ndCBvdmVycmlkZSBCSVNPTiBkZWZpbml0aW9uLgotCi0JKiBidWlsZC1hbGwubWs6IElmIGNhbm9uaG9zdCBpcyBpMzg2LXVua25vd24tc2NvMy4ydjQsIGNoYW5nZSBpdAotCXRvIGkzODYtc2NvMy4ydjQuICBTZXQgVEFSR0VUUyBhbmQgQ0ZMQUdTIGZvciBpMzg2LXNjbzMuMnY0LgotCShhbGwtY3lnbnVzLCBuYXRpdmUsIGJ1aWxkLWN5Z251cyk6IE1ha2UKLQkkKGNhbm9uaG9zdCktc3RhbXAtM3N0YWdlLWRvbmUsIG5vdCAkKGhvc3QpLi4uLgotCSogdGVzdC1idWlsZC5tayAoc3RhbXAtM3N0YWdlLWNvbXBhcmVkKTogVXNlIHRhaWwgKzEwYyBmb3IKLQlpMzg2LXNjbzMuMnY0LiAgQWRkZWQgZWxzZSB0cnVlIHRvIGlmIGNvbW1hbmQuCi0KLU1vbiBEZWMgMjggMTI6MDg6NTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IChmcm9tIEZTRikgU2VxdWVudCB1c2VzIGEgQlNELWxpa2UgT1MuCi0KLU1vbiBEZWMgMjggMDg6MzI6MDYgMTk5MiAgTWluaCBUcmFuLUxlICAobXRyYW5sZUBwYXJpcy5pbnRlbGxpY29ycC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLWlzYyopOiBhZGRlZDsgdXNlcyBtaC1zeXN2LgotCi1UaHUgRGVjIDI0IDE3OjI2OjI0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkb24ndCByZW1vdmUgYmludXRpbHMgZnJvbSBTb2xhcmlzIGJ1aWxkcwotCi1UaHUgRGVjIDI0IDE0OjA4OjM4IDE5OTIgZGF2aWQgZGB6b28nIHp1aG4gICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGdldCByaWQgb2YgZWFybGllciBkZWZpbml0aW9ucyBmb3IgKmNsZWFuLAotCWFsc28gaGFuZGxlIHRoZSByZWN1cnNpdmUgaW5mbyBydWxlIGJldHRlcgotCi1UaHUgRGVjIDI0IDEyOjQwOjIxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuLCBkaXN0Y2xlYW4sIHJlYWxjbGVhbik6ICBGaXggdG8KLQlkbyBtb3JlLW9yLWxlc3MgdGhlIHJpZ2h0IHRoaW5nLgotCi1XZWQgRGVjIDE2IDEwOjI1OjMxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBsaW5lcyBkZWZpbmluZyBDQyBhbmQgQ1hYLCBhbmQgdXNlIENYWCByYXRoZXIKLQl0aGFuIGdjYyBpbiBkZWZpbml0aW9ucyBvZiBDWFhfRk9SX0JVSUxEIGFuZCBDWFhfRk9SX1RBUkdFVC4KLQotVHVlIERlYyAxNSAwMDozNDozMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGFuZ2UgYWxsICQoaG9zdF9jcHUpLSQoaG9zdF92ZW5kb3IpLSQoaG9zdF9vcykgdG8KLQkkKGhvc3RfY2Fub25pY2FsKS4KLQotCSogY29uZmlndXJlLmluOiBzcGxpdCB0aGUgY29uZmlnZGlycyBsaXN0IGludG8gNCBjYXRlZ29yaWVzIChuYXRpdmUKLQl2LiBjcm9zcywgbGlicmFyeSB2LiB0b29sKSBhbmQgaGFuZGxlIHRoZSBjcm9zcy1vbmx5IGFuZCBuYXRpdmUtCi0Jb25seSBpbiBtb3JlIHJlYXNvbmFibGUgKGFuZCBjb3JyZWN0ISkgd2F5LgotCi1Nb24gRGVjIDE0IDE3OjA0OjIyIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qKTogIERvbid0IHJlbW92ZSBiZmQgYW5kIGdkYiBmcm9tCi0JY29uZmlnZGlycyBhbnltb3JlLgotCi1TdW4gRGVjIDEzIDAwOjM3OjI2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGV4dGVuc2l2ZSBjbGVhbnVwOjogIHJlbW92ZWQgYWxsIG9mIHRoZSBleHBsaWNpdAotCWNsZWFuLSogdGFyZ2V0cywgY29sbGFwc2VkIG1hbnkgd3JhcHBlcnMgYXJvdW5kIHN1YmRpcl9kbyBpbnRvCi0Jb25lLCBhZGRlZCBhZGRpdGlvbmFsIHRhcmdldHMgdG8gc2F0aXNmeSBzdGFuZGFyZHMudGV4aSwgZGVsZXRlZAotCXNvbWUgb2xkIHRhcmdldHMsIHNvbWUgY2hhbmdlcyBmb3IgY29uc2lzdGVuY3kKLQotRnJpIERlYyAxMSAyMDoxODowMiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIHNvbWUgcHJvZ3JhbXMgYXMgY3Jvc3Mtb25seSwgYW5kIG90aGVycyBhcwotCW5hdGl2ZSBvbmx5Ci0KLQkqIHRlc3QtYnVpbGQubWs6IGhhbmRsZSBwYXJ0aWFsIGhvbGVzIGluIGEgbW9yZSBnZW5lcmljIG1hbm5lcgotCi0JKiBNYWtlZmlsZS5pbjogbTQgZGVwZW5kcyBvbiBsaWJpYmVydHkKLQotTW9uIERlYyAgNyAwNjo0MzoyNyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zY286IGRvbid0IGRlZmF1bHQgJChDQykgdG8gZ2NjCi0KLVRodSBEZWMgIDMgMjE6NTI6MTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBtNCwgdGV4dHV0aWxzLCBmaWxldXRpbHMsIHNlZCwgc2hlbGx1dGlscywKLQl0aW1lLCB3ZGlmZiwgYW5kIGZpbmQgdG8gY29uZmlnZGlycwotCi0JKiBNYWtlZmlsZS5pbjogYWxsLCBjbGVhbiwgYW5kIGluc3RhbGwgcnVsZXMgZm9yIHRoZSBuZXcgcHJvZ3JhbXMKLQlhZGRlZCB0byBjb25maWd1cmUuaW4KLQotTW9uIE5vdiAzMCAxNDo1NDozNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIG1oLXN1biBmb3IgYWxsICotc3VuLSogaG9zdHMKLQotCSogY29uZmlnL21oLXNvbGFyaXM6IHJld29yayBzdGFuZGFyZCBYIGxvY2F0aW9uIHRvIHVzZQotCSRPUEVOV0lOSE9NRSwgaWYgZGVmaW5lZC4KLQotCSogY29uZmlnL21oLXN1bjogaGFuZGxlIFgxMSBpbmNsdWRlIGxvY2F0aW9ucwotCi0JKiBjb25maWcvbWgtZGVjc3RhdGlvbjogZGVmaW5lIE5lZWRGdW5jdGlvblByb3RvdHlwZXMgdG8gMCwgdG8KLQl3b3JrIGFyb3VuZCBkYWluLWJyYW1hZ2VkIERFQ3dpbmRvd3MgaW5jbHVkZSBmaWxlcwotCi1GcmkgTm92IDI3IDE4OjM1OjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBmbGFncyBmb3IgWDExIGluY2x1ZGUgZmlsZXMgYW5kIGxpYnJhcnkgZmlsZQotCWxvY2F0aW9ucywgcGFzcyB0aGVtIGRvd24gdG8gdGhlIHByb2dyYW1zIHRoYXQgbmVlZCB0aGlzIGluZm8KLQotCSogYnVpbGQtYWxsLm1rOiBhZGRlZCBhICduYXRpdmUnIHRhcmdldCwgdG8gM3N0YWdlIHRoZSBuYXRpdmUgdG9vbGNoYWluCi0KLQkqIGNvbmZpZy97bWgtaHB1eCxtaC1zb2xhcmlzfTogZGVmaW5lIHRoZSAic3RhbmRhcmQiIGxvY2F0aW9ucyBmb3IKLQl0aGUgdmVuZG9yIHN1cHBsaWVkIFgxMSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMKLQotU3VuIE5vdiAyMiAxODo1OToxMyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogc3RhcnQgYnVpbGRpbmcgbGliZysrIGZvciBIUC1VWCB0YXJnZXRzCi0KLVdlZCBOb3YgMTggMTk6MzM6MTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIFVwZGF0ZSByZWZlcmVuY2VzIHRvIGZpbGVzIG1vdmVkIGludG8gZXRjLy4KLQotU3VuIE5vdiAxNSAwOTozNjowOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoaTM4NnNvbDIsIGk0ODZzb2wyKTogIGlbMzRdODYtdW5rbm93bi1zb2xhcmlzMi4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXNvbGFyaXMyKik6ICBVc2UgY29uZmlnL21oLXN5c3Y0LgotCi1UaHUgTm92IDEyIDA4OjUwOjQyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhY2NlcHQgZGFzaCBhcyB3ZWxsIGFzIHVuZGVyc2NvcmUgaW4gbG9uZyBvcHRpb24KLQluYW1lcyBmb3IgRlNGIGNvbXBhdGliaWxpdHkuCi0KLVdlZCBOb3YgMTEgMDg6MDQ6MzcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhZGRlZCAtc2NvMy4ydjQgc3VwcG9ydCBmcm9tIEZTRi4KLQotU3VuIE5vdiAgOCAyMToxNDozMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZXhwYW5kIHRoZSBzZWN0aW9uIHRoYXQgYWRkcyBvciByZW1vdmVzCi0JZGlyZWN0b3JpZXMgZnJvbSB0aGUgbGlzdCBvZiBwcm9ncmFtcyB0byBidWlsZCwgdG8gaGFuZGxlIG5hdGl2ZQotCXZzLiBjcm9zcyBpbiBhZGRpdGlvbiB0byBob3N0IHYuIG5hdGl2ZQotCi1TYXQgTm92ICA3IDE4OjUyOjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZXBsYWNlIEMrKyBpbiBtYWNybyBuYW1lcyB3aXRoIENYWC4KLQlUaGlzIGlzIGxlc3MgbGlrZWx5IHRvIGJyZWFrIC4uLgotCi1TYXQgTm92ICA3IDE1OjE2OjU4IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogdGVzdC1idWlsZC5tazogYWRkIC13IHRvIEdOVV9NQUtFCi0KLUZyaSBOb3YgIDYgMjM6MTA6MzcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiByZW1vdmUgJ3NwYXJjJy0tPidzcGFyYy1zdW4nIGRlZmF1bHQgdHJhbnNmb3JtYXRpb24sCi0JYWRkICdzcGFyYycgdG8gbGlzdCBvZiByZWNvZ25pemVkIGNwdXMuICBUaGlzIG5lZWRlZCB0byBtYWtlCi0JJ3NwYXJjLWFvdXQnIGV4cGFuZCB0byAnc3BhcmMtdW5rbm93bi1hb3V0JyBpbnN0ZWFkIG9mICdzcGFyYy1zdW4tYW91dCcuCi0JRGVsZXRlIHNvbWUgcmVkdW5kYW50IG9zZTY4IHZhcmlhbnRzLiAgUmVjb2duaXplIC13cnMgYXMgYW4gb3MsCi0JdGhlbiBjaGFuZ2VzIHRoYXQgaW50byAkQ1BVLXdycy12eHdvcmtzLgotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBtb3N0IHJlZmVyZW5jZXMgdG8gZ2RidGVzdCwgcmVndWxhcml6ZQotCXRhcmdldCBiYXNlZCBwcm9ncmFtIHJlbW92YWwKLQotCSogdGVzdC1idWlsZC5tazogaW1wb3J0IGZyb20gcDMgdHJlZSAobWFueSBmaXhlcyBhbmQgY2hhbmdlcykKLQotRnJpIE5vdiAgNiAyMDo1OTowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHJ1bGVzIHRvIGhhbmRsZSB0Y2wsIHRrLCBhbmQgZXhwZWN0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIHRob3NlIGRpcmVjdG9yaWVzIGlmIHRoZXkgZXhpc3QKLQotVGh1IE5vdiAgNSAxNDozNTo0MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IHJlbW92ZWQgYm9ndXMgaHBwYWJzZCBhbmQgaHBwYWhwdXggbmFtZXMsIHNpbmNlCi0JImhwcGEiIGlzIG5vdCBhIHZhbGlkIGNwdSAoaHBwYTEuMSBvciBocHBhMS4wIGFyZSwgdGhvdWdoKQotCi1UaHUgT2N0IDI5IDAwOjEyOjQxIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsbC1nY2Mgbm93IGRlcGVuZHMgb24gYWxsLWJpbnV0aWxzLiAgYWxsLWxpYmcrKwotCWRlcGVuZHMgdXBvbiBhbGwteGliZXJ0eQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlcyBmcm9tIHAzLCBpbmNsdWRpbmc6Ci0KLQlUaHUgT2N0ICA4IDE1OjAwOjE3IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFhUUkFGTEFHUyk6IGluY2x1ZGUgbmV3bGliIGRpcmVjdG9yaWVzIGlmCi0JbmV3bGliL01ha2VmaWxlIGV4aXN0cywgcmF0aGVyIHRoYW4gaWYgaG9zdCAhPSB0YXJnZXQuCi0KLQlGcmkgU2VwIDI1IDEzOjQxOjUyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1ub3N0ZGluYyB0byBYVFJBRkxBR1MgaWYgd2UgYXJlIHVzaW5nIGdjYwotCWZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUgYW5kIG5vdCBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyLiAgVGhpcwotCW1hdHRlcnMgZm9yIHRoZSBsaWJnKysgY29uZmlndXJhdGlvbiBpZiByZWNvbmZpZ3VyaW5nIGEgdHJlZSB0aGF0Ci0JaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQuCi0KLQlUaHUgU2VwIDEwIDEwOjM1OjUxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1JIGZvciBuZXdsaWIvdGFyZy1pbmNsdWRlIHRvIFhUUkFGTEFHUywgdG8KLQlwaWNrIHVwIHRoZSBtYWNoaW5lIGFuZCBzeXN0ZW0gc3BlY2lmaWMgaGVhZGVyIGZpbGVzLgotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgQVNfRk9SX1RBUkdFVCwgcGFzc2VkIGRvd24gaW4KLQlUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIEFkZGVkIENDX0ZPUl9CVUlMRCwgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUKLQl0aGUgQyBjb21waWxlciB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIGFyZSBydW4gaW4gdGhlCi0JYnVpbGQgZW52aXJvbm1lbnQsIHNldCBpdCB0byBkZWZhdWx0IHRvICQoQ0MpLCBhbmQgcGFzc2VkIGl0IGRvd24KLQlpbiBGTEFHU19UT19QQVNTIGFuZCBUQVJHRVRfRkxBR1NfVE9fUEFTUy4KLQotCU1vbiBTZXAgIDcgMjI6MzQ6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCAkKGhvc3QpID0gJCh0YXJnZXQpIHRlc3RzIGJhY2sgdG8gKl9GT1JfVEFSR0VULgotCVdlIG5lZWQgdGhlbSBmb3IgdW51c3VhbCBuYXRpdmUgYnVpbGRzLCBsaWtlIHN5c3RlbXMgd2l0aG91dAotCXJhbmxpYi4KLQotCSogY29uZmlndXJlOiBhbHNvIGRlZmluZSAkKGhvc3RfY2Fub25pY2FsKSBhbmQKLSAgICAgICAgJCh0YXJnZXRfY2Fub25pY2FsKSwgd2hpY2ggYXJlIHRoZSBmdWxsLCBjYW5vbmljYWwgbmFtZXMgZm9yIHRoZQotICAgICAgICBnaXZlbiBob3N0IGFuZCB0YXJnZXQKLQotU3VuIE5vdiAgMSAxNjozODoxNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBzZXBhcmF0ZSBkZWZpbml0aW9ucyBmb3IgQysrLgotCi1GcmkgT2N0IDMwIDExOjM3OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiAgQWRkIGRlamEtZ251LgotCi1GcmkgT2N0IDIzIDAwOjM5OjE4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBVcGRhdGUgZm9yIGNvbmZpZ3VyZS50ZXhpIGFuZCBnZGItNC43IHJlbGVhc2UuCi0KLVdlZCBPY3QgMjEgMjE6NTQ6MjcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTW92ZSAiYWxsIiB0YXJnZXQgdG8gdG9wIG9mIGZpbGUuCi0JUHJldmlvdXNseSwgZmlyc3QgdGFyZ2V0IHdhcyAiLlBIT05ZIiB3aGljaCBjYXVzZWQgQlNENC40IG1ha2UKLQl0byBidWlsZCAuUEhPTlkgd2hlbiBtYWtlIHdhcyBydW4gd2l0aG91dCBhcmd1bWVudHMuCi0KLU1vbiBPY3QgMTkgMDE6MTc6NTQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIENPUFlJTkcuTElCIHRvIEdEQiByZWxlYXNlcywgbm93IHRoYXQgdGhlcmUncwotCUxpYnJhcnktY29weWxlZnRlZCBjb2RlIGluIGxpYmliZXJ0eS4KLQotVHVlIE9jdCAxMyAwMToyMjozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIFJlcGxhY2UgbTY4a21vdGUgd2l0aCBwbGFpbiBvbGQgbTY4ay4KLQotRnJpIE9jdCAgOSAwMzoxNDoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgc3BhY2UgZnJvbSBibGFuayBsaW5lLCBhdm9pZCBNYWtlIGNvbXBsYWludHMuCi0KLVRodSBPY3QgIDggMTg6NDE6NDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IENvbXBsYWluIGlmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLiAgQWRkZWQgc3VwcG9ydCBmb3IKLQkzODZic2QgYXMgT1MgYW5kIHRhcmdldCBhbGlhcy4KLQotVGh1IE9jdCAgOCAxNTowNzoyMiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChYVFJBRkxBR1MpOiBpbmNsdWRlIG5ld2xpYiBkaXJlY3RvcmllcyBpZgotCW5ld2xpYi9NYWtlZmlsZSBleGlzdHMsIHJhdGhlciB0aGFuIGlmIGhvc3QgIT0gdGFyZ2V0LgotCi1Nb24gT2N0ICA1IDAzOjAwOjA5IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogcmVjb2duaXplIHNwYXJjbGl0ZS13cnMtdnh3b3Jrcy4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwteGliZXJ0eSk6IGFkZGVkICoteGliZXJ0eSBtYWtlIHJ1bGVzIChmcm9tCi0JcDMuKSBBZGRlZCBjbGVhbi14aWJlcnR5IHRvIGNsZWFuLgotCi1UaHUgT2N0ICAxIDE3OjU5OjE5IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgKi0qLSogaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMgZm9yIGhvc3QgYW5kIHRhcmdldAotCi1UdWUgU2VwIDI5IDE0OjExOjE4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIC1ub3N0ZGluYyB0byBYVFJBRkxBR1MgaWYgd2UgYXJlIHVzaW5nIGdjYwotCWZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUgYW5kIG5vdCBidWlsZGluZyBhIGNyb3NzLWNvbXBpbGVyLiAgVGhpcwotCW1hdHRlcnMgZm9yIHRoZSBsaWJnKysgY29uZmlndXJhdGlvbiBpZiByZWNvbmZpZ3VyaW5nIGEgdHJlZSB0aGF0Ci0JaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQuCi0KLVNlcCAyMCAwODo1MzoxMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAoaTQ4NnYvaTQ4NnY0KTogIE1lcmdlIGluIGZyb20gRlNGIHZlcnNpb24uCi0KLUZyaSBTZXAgMTggMDA6MzI6MDAgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBvbmx5IHNldCBQV0QgaWYgaXQgaXMgYWxyZWFkeSBzZXQuCi0KLVRodSBTZXAgMTcgMjM6MDU6NTMgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBqdXN0IHNldCBQV0Q9YHB3ZGAgYXQgdGhlIHRvcCwgc2luY2UgVWx0cml4IHNoCi0JZG9lc24ndCBoYXZlIHVuc2V0IGFuZCBhbGwgc3VjY2VzcyBwYXRocyAoYW5kIG1vc3QgZXJyb3IgcGF0aHMpCi0Jb3V0IHNldCBpdCBhbnl3YXkuIChOb3RlOiBzaG91bGQgY2hhbmdlIGFsbCB1c2VzIG9mICR7UFdEPWBwd2RgfQotCXRvIGp1c3QgJHtQV0R9IHRvIGF2b2lkIGNvbmZ1c2lvbi4pCi0KLVR1ZSBTZXAgMTUgMTY6MDA6NTQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFsd2F5cyBzZXQgJCh0b29sZGlyKSB0byAkKGxpYmRpcikvJCh0YXJnZXRfYWxpYXMpLAotCWV2ZW4gZm9yIGEgbmF0aXZlIGNvbXBpbGF0aW9uLgotCi1UdWUgU2VwIDE1IDAyOjIyOjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2hhbmdlcyB0byBtYWtlIHRoZSBnZGIudGFyLlogcnVsZSB3b3JrIGJldHRlci4KLQotCSogTWFrZWZpbGUuaW4gKEdEQl9TVVBQT1JUX0RJUlMpOiAgQWRkIG9wY29kZXMuCi0JKERFVk9fU1VQUE9SVCk6ICBBZGQgY29uZmlndXJlLnRleGkuCi0JKGJmZC1pbHJ0LnRhci5aKTogIFJlbW92ZSBhbmNpZW50IHJ1bGUuCi0KLVRodSBTZXAgMTAgMTA6NDM6MTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLUkgZm9yIG5ld2xpYi90YXJnLWluY2x1ZGUgdG8gWFRSQUZMQUdTLCB0bwotCXBpY2sgdXAgdGhlIG1hY2hpbmUgYW5kIHN5c3RlbSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnLnN1YjogYWRkZWQgbmV3IHRhcmdldCBtNjgwMTAtYWRvYmUtc2NvdXQsCi0Jd2l0aCBhbGlhcyBvZiBhZG9iZTY4ay4gIENoYW5nZWQgY29uZmlndXJlLmluIHRvIGNoZWNrIGZvcgotCS1zY291dCBiZWZvcmUgLXNjbyogdG8gYXZvaWQgYSBmYWxzZSBtYXRjaC4KLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIEFTX0ZPUl9UQVJHRVQsIHBhc3NlZCBkb3duIGluCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MuICBBZGRlZCBDQ19GT1JfQlVJTEQsIHdoaWNoIGlzIGludGVuZGVkIHRvIGJlCi0JdGhlIEMgY29tcGlsZXIgdG8gdXNlIHRvIGNyZWF0ZSBwcm9ncmFtcyB3aGljaCBhcmUgcnVuIGluIHRoZQotCWJ1aWxkIGVudmlyb25tZW50LCBzZXQgaXQgdG8gZGVmYXVsdCB0byAkKENDKSwgYW5kIHBhc3NlZCBpdCBkb3duCi0JaW4gRkxBR1NfVE9fUEFTUyBhbmQgVEFSR0VUX0ZMQUdTX1RPX1BBU1MuCi0KLVdlZCBTZXAgIDkgMTI6MjE6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIENDX0ZPUl9UQVJHRVQsCi0JQVJfRk9SX1RBUkdFVCwgUkFOTElCX0ZPUl9UQVJHRVQsIE5NX0ZPUl9UQVJHRVQuICBQYXNzCi0JVEFSR0VUX0ZMQUdTX1RPX1BBU1MsIHdoaWNoIGRlZmluZXMgQ0MsIEFSLCBSQU5MSUIgYW5kIE5NIGFzIHRoZQotCUZPUl9UQVJHRVQgdmFyaWFudHMsIHRvIG5ld2xpYiBhbmQgbGliZysrLgotCi1UdWUgU2VwICA4IDE3OjI4OjMwIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nYXMsIGFsbC1nZGIpOiBSZXF1aXJlIGFsbC1vcGNvZGVzIHRvIGJlIGJ1aWx0Ci0JZmlyc3QuCi0KLVdlZCBTZXAgIDIgMDI6NTA6MDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBY2NlcHQgYGVsZicgYXMgYW4gZW52aXJvbm1lbnQuCi0KLVR1ZSBTZXAgIDEgMTU6NDg6MzAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtb3Bjb2Rlcyk6ICBjZCBpbnRvIHRoZSByaWdodCBkaXJlY3RvcnkKLQotU3VuIEF1ZyAzMCAyMToxMjoxMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgLXByb2dyYW1fdHJhbnNmb3JtX25hbWUgb3B0aW9uLCB1c2VkIGFzCi0JYXJndW1lbnQgdG8gc2VkIHdoZW4gaW5zdGFsbGluZyBwcm9ncmFtcy4KLQljb25maWd1cmUudGV4aTogYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgLXByb2dyYW1fcHJlZml4LAotCS1wcm9ncmFtX3N1ZmZpeCBhbmQgLXByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLVRodSBBdWcgMjcgMjE6NTk6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBY2NlcHQgaTQ4NiB3aGVyZSBpMzg2IG9rLgotCi1UaHUgQXVnIDI3IDEzOjA0OjQyIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiBhY2NlcHQgd2UzMmsKLQotTW9uIEF1ZyAyNCAxNDowNToxNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLSAJKiBjb25maWcuc3ViLCBjb25maWd1cmUuaW46IGFjY2VwdCBPU0U2ODAwMCBhbmQgT1NFNjhrLgotCi0JKiBNYWtlZmlsZS5pbjogZG9uJ3QgY3JlYXRlIGFsbCBkaXJlY3RvcmllcyBmb3IgYGBtYWtlIGluc3RhbGwnJzsKLQlsZXQgdGhlIHN1YmRpcmVjdG9yaWVzIGNyZWF0ZSB0aGUgb25lcyB0aGV5IG5lZWQuCi0KLVR1ZSBBdWcgMTEgMjM6MTM6MTcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0gICAgICAgICogQ09QWUlORzogbmV3IGZpbGUsIEdQTCB2MgotCi1UdWUgQXVnICA0IDAxOjEyOjQzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSB0aGUgbmV3IGdlbi1pbmZvLWRpciwgd2hpY2ggbmVlZHMgYSB0ZW1wbGF0ZQotCWFyZ3VtZW50ICh3aGljaCBhbHNvIGxpdmVzIGluIHRleGluZm8pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpLCBzdGFuZGFyZHMudGV4aTogZml4IElORk8tRElSLUVOVFJZCi0KLU1vbiBBdWcgIDMgMTU6NDE6MjggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc29sYXJpczogcmVtb3ZlZCB0aGUgLXhzIGZyb20gQ0ZMQUdTIChsZXQgdGhlIHBlb3BsZQotCXdpdGggU3VuJ3MgQyBjb21waWxlciBkZWFsIHdpdGggaXQgdGhlbXNlbHZlZCkKLQotTW9uIEF1ZyAgMyAwMDozNDoxNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiAobmNyMzAwMCk6ICBDaGFuZ2UgaTM4NiB0byBpNDg2LgotCi1UaHUgSnVsIDIzIDAwOjEyOjE3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsLXJjcywgaW5zdGFsbC1ncmVwIHRvCi0JaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzLCByZW1vdmVkIGluc3RhbGwtYmlzb24gYW5kIGluc3RhbGwtbGliZ2NjCi0KLVR1ZSBKdWwgMjEgMDE6MDE6NTAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBncmFiIHRoZSBIUFVYIG1ha2VmaWxlIGZyYWdtZW50IGlmIG9uIEhQVVgKLQotTW9uIEp1bCAyMCAxMTowMjowOSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBlcmFkaWNhdGUgYmlzb24gc3Bvb3IgKGRpdHRvIGxpYmdjYykuCi0JIGNvbmZpZ3VyZS5pbjogcmVjb2duaXNlIG02OHtrLDAwMH0tZXJpY3Nzb24tT1NFLgotCSBlczE4MDAgaXMgYWxpYXMgZm9yIG02OGstZXJpY3Nzb24tT1NFCi0KLVN1biBKdWwgMTkgMTc6NDk6MDIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlYXJyYW5nZSB0aGUgcGFydHMgdGhhdCByZW1vdmUgcHJvZ3JhbXMgZnJvbQotCWNvbmZpZ2RpcnMsIGJhc2VkIG5vdyBvbiBIT1NUPT1UQVJHRVQgb3IgYnkgY2Fub25pY2FsIHRyaXBsZS4KLQotRnJpIEp1bCAxNyAyMjo1Mjo0OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIHRlc3QtYnVpbGQubWs6IHJlY3Vyc2UgZXhwbGljaXRseSB3aXRoIC1mIHRlc3QtYnVpbGQubWsgd2hlbgotCSAgYXBwcm9wcmlhdGUuICBwcmVkaWNhdGUgc3RhZ2UzIGFuZCBjb21wYXJpc29uIG9uIHRoZSBleGlzdGVuY2UKLQkgIG9mIGdjYy4gIFRoYXQgaXMsIGlmIGdjYyBpc24ndCBhcm91bmQsIHdlIGFyZW4ndCB0aHJlZS1zdGFnaW5nLgotCSAgT24gdmVyeSBjbGVhbiwgYWxzbyByZW1vdmUgLi4uc3RhbXAtY28uICBCdWlsZCBpbi1wbGFjZSBiZWZvcmUKLQkgIGRvaW5nIG90aGVyIGJ1aWxkcy4KLQotVGh1IEp1bCAxNiAxODozMzowOSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogYWRkIHRnYXMKLQotVGh1IEp1bCAxNiAxNjowNToyOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhIG51bWJlciBvZiBjaGFuZ2VzIG1lcmdlZCBpbiBmcm9tIHByb2dyZXNzaXZlLgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBsaWJtLgotCi0JKiAuY3ZzaWdub3JlOiBpZ25vcmUgc29tZSBzdHVmZiB0aGF0IGNvbWVzIGZyb20gdGVzdC1idWlsZC5tay4KLQotV2VkIEp1bCAgOCAwMDowMTozMCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc29sYXJpczogIFVzZSAteHMgd2hlbiBjb21waWxpbmcgc28gdGhhdCBTdW4tQyBwdXRzCi0JYSBzeW1ib2wtdGFibGUgaW50byB0aGUgZXhlY3V0YWJsZS4KLQotVHVlIEp1bCAgNyAwMDoyNDo1MiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFkZCBlczE4MDAgKG02OGstZXJpY3Nzb24tZXMxODAwKS4KLQotVHVlIEp1biAzMCAyMDoyNDo0MSAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKLQkqIE1ha2VmaWxlLmluOiBhZGp1c3QgZGlyZWN0b3J5LWNyZWF0aW5nIHNjcmlwdCBmb3IgbG9zaW5nIGRlY3N0YXRpb24KLQotTW9uIEp1biAyMiAyMzo0Mzo0OCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgTWlub3IgJHN1YmRpci1yZWxhdGVkIGZpeGVzLgotCi1Nb24gSnVuIDIyIDE4OjMwOjI2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGZpeCB2YXJpb3VzIHByb2JsZW1zIHdpdGggcHJvcG9nYXRpbmcKLQltYWtlZmlsZV90YXJnZXRfZnJhZyBpbiBzdWJkaXJzLgotCSogY29uZmlndXJlLmluOiBjb25maWcgbGliZ2NjIGlmIGl0cyB0aGVyZQotCi1GcmkgSnVuIDE5IDE1OjE5OjQwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBIUFBBIG1lcmdlLgotCi1Nb24gSnVuIDE1IDEyOjMxOjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoSU5TVEFMTCk6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCBpcyBicm9rZW4gb24gbmNyIDMwMDAncy4KLQotU3VuIEp1biAxNCAxMDoyOToxOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZXBsYWNlIGFsbC1iaXNvbiB3aXRoIGFsbC1ieWFjYyBpbiBhbGwKLQlkZXBlbmRlbmN5IGxpbmVzIGZvciBvdGhlciB0b29scyAod2hpY2ggbm93IHVzZSBieWFjYykuCi0KLUZyaSBKdW4gMTIgMjI6MjE6NTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3VuNHNvbDIgPT4gc3BhcmMtc3VuLXNvbGFyaXMyLgotCi1UdWUgSnVuICA5IDE3OjE4OjExIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIEFkZCBJTlNUQUxMLgotCi1UaHUgSnVuICA0IDEyOjA3OjMyIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWtlIGdwcm9mIHJ1bGVzIHNpbWlsYXIgdG8gYnlhY2MgcnVsZXMgKGluc3RlYWQgb2YKLQl2ZXN0aWdhbCAkKHVuc3ViZGlyKSB0aGF0IGRpZG4ndCB3b3JrLi4uKQotCi1UaHUgSnVuICA0IDAwOjM3OjA1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIEFkZCBzdXBwb3J0IGZvciBMaW51eC4KLQkqIE1ha2VmaWxlLmluOiAgVXNlICQoRkxBR1NfVE9fUEFTUykgbW9yZSBjb25zaXN0ZW50bHkKLQkoYXQgbGVhc3QgZm9yIGxpYmcrKykuCi0KLVR1ZSBKdW4gMDIgMjA6MDM6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IGZpeCBkb2MgZm9yIHRoZSAtbmZwIG9wdGlvbiB0byBjb25maWd1cmUKLQotVHVlIEp1biAgMiAxNzoyMDo1MiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwtYmludXRpbHMpOiBhciBuZWVkcyBmbGV4LCBzbyBkZXBlbmQgb24gYWxsLWZsZXguCi0KLVN1biBNYXkgMzEgMTU6MDQ6MDggMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogY2hhbmdlZCBbXi1dKyB0byBbXi1dW14tXSogc28gdGhhdCBpdCB3b3JrcyB1bmRlcgotCVN1biBzZWQuIChCU0QgNC4zIHNlZCBkb2Vzbid0IGhhbmRsZSBbXi1dKyBlaXRoZXIuKQotCSogY29uZmlndXJlLmluOiBhZGRlZCBzb2xhcmlzKiBob3N0X21ha2VmaWxlX2ZyYWcgaG9vay4KLQotU3VuIE1heSAzMSAwMToxMDozNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6IGNoYW5nZWQgcmVjb2duaXRpb24gb2YgbTY4MDAwIHNvIHRoYXQgdmFyaW91cwotCW02OGsgdHlwZXMgY2FuIGJlIHNwZWNpZmllZCB2aWEgbTY4MFswMTIzNF0wCi0KLVNhdCBNYXkgMzAgMjE6MDE6MDYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViIChiYXNpY19tYWNoaW5lKTogZml4IHNlZCBzbyB0aGF0ICctZm9vJyBpc24ndAotCWNvbXBsZXRlbHkgc3Vic3RpdHV0ZWQgb3V0IHdoaWxlIC4rJy1mb28nIGxvc2VzIHRoZSAnLWZvbycKLQotV2VkIE1heSAyNyAyMzoxODo1MiAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViICgkb3MpOiBBZGQgLWFvdXQuCi0KLUZyaSBNYXkgMjIgMTQ6MDA6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIElmIGhvc3RfbWFrZWZpbGVfZnJhZyBpcyBhYnNvbHV0ZSwgZG9uJ3QKLQlwcmVmaXggJHtpbnZzdWJkaXJ9IChyZWxldmFudCB0byBsaWJnKysgYXV0by1jb25maWd1cmUpLgotCi1UaHUgTWF5IDIxIDE4OjAwOjA5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh0b29sZGlyKTogRGVmaW5lIGl0LgotCShhbGwtbGQpOiBEZXBlbmQgb24gYWxsLWZsZXguCi0KLVN1biBNYXkgMTAgMjE6NDU6NTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiAgRml4IGxpYmcrKyBzcGVjaWFsIGNhc2UuCi0KLUZyaSBNYXkgIDggMDg6MzE6NDEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZG8gbm90IGJ1cnkgYHB3ZGAgaW50byBjb25maWcuc3RhdHVzLCB0aHVzIGRvIGZld2VyCi0JICBwd2Qncy4KLQotCSogY29uZmlndXJlOiBwcmludCB0aGUgIkJ1aWxkaW5nIGluIiBtZXNzYWdlIG9ubHkgd2hlbiBidWlsZGluZyBpbgotCSAgb3RoZXIgdGhhbiAiLiIgQU5EIHZlcmJvc2UuCi0KLQkqIGNvbmZpZ3VyZTogcmVtb3ZlIC1zLCByZXdvcmsgLXYgdG8gYmV0dGVyIGFjY29tb2RhdGUgZ3Vlc3RlZAotCSAgY29uZmlndXJlcy4KLQotCSogc3RhbmRhcmRzLnRleGk6IHVwZGF0ZWQgdG8gMyBtYXksIGZpeGVkIGxpYnJpZCA8LT4gbGliZGlyIHR5cG8uCi0KLUZyaSBNYXkgIDEgMTg6MDA6NTAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYWNyb2l6ZSBmbGFncyBwYXNzZWQgb24gcmVjdXJzaW9uLiAgcmVtb3ZlCi0JICBmaWxldXRpbHMuCi0KLVRodSBBcHIgMzAgMDg6NTY6MjAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogZ2V0IG1ha2VzcmNkaXIgcmlnaHQgZm9yIHN1YmRpcnMgZGVlcGVyIHRoYW4gMS4KLQotCSogTWFrZWZpbGUuaW46IHBhc3MgSU5TVEFMTCwgSU5TVEFMTF9EQVRBLCBJTlNUQUxMX1BST0dSQU0gb24KLQkgIGluc3RhbGwuCi0KLUZyaSBBcHIgMjQgMTU6NTE6NTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkb24ndCBwcmludCBzdWJkaXJfZG8gb3IgcmVjdXJzaW9uIGxpbmVzLgotCi1GcmkgQXByIDI0IDE1OjIyOjA0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogYWRkZWQgbWVudSBpdGVtLgotCi0JKiBNYWtlZmlsZS5pbjogYnVpbGQgYW5kIGluc3RhbGwgc3RhbmRhcmRzLmluZm8uCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBuZXcgZmlsZS4KLQotV2VkIEFwciAyMiAxODowNjo1NSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogdGVzdCBmb3IgYW5kIG1vdmUgY29uZmlnLnN0YXR1cyBwaWVjZXMgZnJvbQotCSAgJHtzdWJkaXJ9Ly4KLQotV2VkIEFwciAyMiAxNDozODozNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWRlbHRhODgsIGNvbmZpZy9taC1uY3IzMDAwOiAgUmVwbGFjZSBNSU5VU19HIHdpdGgKLQlDRkxBR1MgcGVyIG5ldyBjb25maWd1cmF0aW9uIHN0cmF0ZWd5LgotCSogY29uZmlndXJlOiAgVGVzdCBmb3IgZXhpc3RhbmNlIG9mIGZpbGVzIGJlZm9yZSB0cnlpbmcgdG8gbXYKLQl0aGVtLCB0byBhdm9pZCBudW1lcm91cyBub24tZXhpc3RhbmNlIG1lc3NhZ2VzLgotCi1UdWUgQXByIDIxIDEyOjMxOjMzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGNvcnJlY3QgZmluYWwgbGluZSBvZiBjb25maWcuc3RhdHVzLgotCi0JKiBjb25maWd1cmU6IHBhdGNoIGZyb20gZWdnZXJ0LiAgQXZvaWRzIGEgcHJvdGVjdGlvbiBwcm9ibGVtIGlmCi0JICB0aGUgb3JpZ2luYWwgTWFrZWZpbGUuaW4gaXMgcmVhZCBvbmx5LgotCi0JKiBjb25maWd1cmU6IHVzZSBtb3ZlLWlmLWNoYW5nZSBmcm9tIGdjYyB0byBjcmVhdGUgY29uZmlnLnN0YXR1cy4KLQkgIFNvbWUgbWFrZWZpbGVzIGRlcGVuZCBvbiBjb25maWcuc3RhdHVzIHRvIHRlbGwgaWYgYSBkaXJlY3RvcnkKLQkgIGhhcyBiZWVuIHJlY29uZmlndXJlZCBmb3IgYSBkaWZmZXJlbnQgaG9zdC4gIFRoaXMgY2hhbmdlCi0JICBwcmV2ZW50cyB0aG9zZSBkaXJlY3RvcmllcyBmcm9tIHJlbWFraW5nIGV2ZXJ5dGhpbmcgaW4gdGhlIGNhc2UKLQkgIHdoZXJlIHRoZSByZWNvbmZpZyB3YXMgb25seSBpbnRlbmRlZCB0byByZWJ1aWxkIGEgTWFrZWZpbGUuCi0KLQkqIGNvbmZpZ3VyZTogdGVzdCBmb3IgY29uZmlnLnN1YiB3aXRoICJjb25maWcuc3ViIHN1bjQiIHJhdGhlcgotCSAgdGhhbiAiY29uZmlnLnN1YiAke2hvc3RfYWxpYXN9Ii4gIE90aGVyd2lzZSB3ZSBjYW4ndCB0ZWxsIGEgYmFkCi0JICBob3N0IGFsaWFzIGZyb20gYSBtaXNzaW5nIGNvbmZpZy5zdWIuCi0KLU1vbiBBcHIgMjAgMTg6MTY6MzYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZXhwbGljaXRseSBwYXNzIENGTEFHUyBvbiByZWN1cnNpb24uIG5vIGxvbmdlciBwYXNzCi0JICBNSU5VU19HICh0aGlzIGNhbiBiZSBkb25lIHdpdGggQ0ZMQUdTKS4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1GcmkgQXByIDE3IDE4OjI3OjUxIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IG1rZGlyICR7c3ViZGlyfSBhcyBuZWVkZWQuCi0KLVdlZCBBcHIgMTUgMTc6Mzc6MjIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLGNvbmZpZ3VyZS5pbjogYWRkZWQgYXV0b2NvbmYuCi0KLVdlZCBBcHIgMTUgMTc6Mjc6MzQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbm8gbG9uZ2VyIHBhc3MgYWdhaW5zdCBvbiByZWN1cnNpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCAuTk9FWFBPUlQ6IHNvIHRoYXQgc3RyYXkgbWFrZWZpbGVfZnJhZwotCSAgZGVmaW5pdGlvbnMgYXJlIG5vdCBpbmhlcml0ZWQuCi0KLQkqIGNvbmZpZ3VyZTogY29ycmVjdCBtYWtlc3JjZGlyIHdoZW4gc3ViZGlyIGlzIC4KLQotVHVlIEFwciAxNCAxMTo1NjowOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiAgQWRkIHN1cHBvcnQgZm9yICdzdWJkaXJzJyB2YXJpYWJsZSwgd2hpY2ggaXMKLQlsaWtlICdjb25maWdkaXJzJywgZXhjZXB0IHRoYXQgY29uZmlndXJlIGRvZXNuJ3QgcmUtaW52b2tlCi0JaXRzZWxmIGZvciBzdWJkaXJzLCBpdCBqdXN0IGNyZWF0ZXMgYSBNYWtlZmlsZSBmb3IgZWFjaCBzdWJkaXIuCi0JKiBjb25maWd1cmUudGV4aTogIERvY3VtZW50IHN1YmRpcnMuCi0KLU1vbiBBcHIgMTMgMTg6NTA6MTYgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIGZsZXggdG8gY29uZmlnZGlycwotCi1Nb24gQXByIDEzIDE4OjQzOjU1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIGNsZWFuLXN0YW1wcyBmcm9tIGNsZWFuLgotCi1TYXQgQXByIDExIDAzOjUyOjAzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBBZGQgZ2RidGVzdCB0byBjb25maWdkaXJzLgotCi1GcmkgQXByIDEwIDIzOjExOjQ5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBBZGQgbWFjcm8sIGRlZmF1bHQgdG8gLWcsIHBhc3Mgb24KLQl0byByZWN1cnNpdmUgbWFrZXMuCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmV3IG5jcjMwMDAgY29uZmlnLgotCi1XZWQgQXByICA4IDIzOjA4OjEyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHJlZmVyZW5jZXMgdG8gZ2RibS4KLQotVHVlIEFwciAgNyAxNjo0ODoyMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YjogIERvbid0IGNhbm9uaWNhbGl6ZSBvcyB2YWx1ZQotCW5ld3NvcyogdG8gYnNkIChyZWFkbGluZSBuZWVkcyB0byBjaGVjayBmb3IgbmV3c29zKS4KLQkoVGhpcyBmaXggd2FzIGVhcmxpZXIgbWFkZSBKYW4gMzEsIGJ1dCBnb3QgcmUtYnJva2VuLikKLQotTW9uIEFwciAgNiAxNDozNDowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBzY28gaXMgYW4gb3MsIG5vdCBhIHZlbmRvciEKLQotCSogY29uZmlndXJlOiAgUXVvdGUgJCggYmV0dGVyLiAgS2VlcCB2YXJpb3VzIHNoZWxscyBoYXBweS4KLQotVHVlIE1hciAzMSAxNjozMjo1NyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGVsaW1pbmF0ZSBzdGFtcC1maWxlcy4KLQotTW9uIE1hciAzMCAyMjoyMDoyMyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBzZW5kX3ByLiAgcmVtb3ZlICJmb3JjZSIgZnJvbSAuc3RtcC1ncHJvZiBydWxlLgotCSAgU3VwcmVzcyBlY2hvaW5nIG9mIGFsbCB0aGUgImlmIFsgLWQgLi4uICQoTUFLRSkiIGxpbmVzLgotCi1XZWQgTWFyIDI1IDE1OjIwOjA0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBmaXggaXJpcy9pcmlzMy4KLQotV2VkIE1hciAyNSAxMDozNDoxOSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiByZS1hZGQgLXJtLgotCi1UdWUgTWFyIDI0IDIzOjUwOjE2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYXNrZWZpbGUuaW46IGFkZCAuc3RtcC1yY3MgdG8gYWxsLgotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBnYXMgZnJvbSByczYwMDAgYnVpbGQsIHVzZSBhaXggaG9zdCBmcmFnbWVudC4KLQotTW9uIE1hciAyMyAxOTo0MzozNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBwYXNzIGRvd24gc2l0ZV9vcHRpb24gZHVyaW5nIHJlY3Vyc2lvbi4KLQotVGh1IE1hciAxOSAxNjo0OTozNiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYWxsLmNyb3NzKTogIEFkZCAuc3RtcC1iZmQgLnN0bXAtcmVhZGxpbmUuCi0KLVdlZCBNYXIgMTggMTU6Mjk6MzMgMTk5MiAgTWlrZSBTdHVtcCAgKG1yc0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IENoYW5nZSBleGVjX3ByZWZpeCBzbyB0aGF0IGl0IHJlYWxseSBkZWZhdWx0cyB0byBwcmVmaXguCi0KLVNhdCBNYXIgMTQgMTc6MjA6MzggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46ICBBZGQgc3VwcG9ydCBmb3IgbW1hbGxvYyBsaWJyYXJ5LgotCi1GcmkgTWFyIDEzIDE4OjQ0OjE4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIHN0bXAgZGVwZW5kZW5jaWVzIGZvciBhIGZldyBtb3JlIHRoaW5ncy4KLQotVGh1IE1hciAxMiAwNDo1NjoyNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBhZGp1c3RlZCBlcnJvciBtZXNzYWdlIG9uIG9iamRpci9zcmNkaXIgY29uZmlndXJlCi0JICBjb2xsaXNpb24sIHBlciBqb2huJ3Mgc3VnZ2VzdGlvbi4KLQotCSogTWFrZWZpbGUuaW46IGFkZCBsaWJpYmVydHkgc3RtcCB0byBhbGwgYW5kIGFsbC5jcm9zcy4KLQotV2VkIE1hciAxMSAwMjowNzo1MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBmb3JjZSBkZXBlbmRlbmNpZXMsIGFkZCBncmVwIHRvIGFsbC4KLQotVHVlIE1hciAxMCAyMTo0OToxOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAbWFycy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZHJvcCBmbGV4LiAgbWFrZSBzdGFtcCBmaWxlcyB3b3JrLgotCi0JKiBjb25maWd1cmU6IGFkZGVkIHRlc3QgZm9yIGNvbmZsaWN0aW5nIGNvbmZpZ3VyYXRpb24gaW4gc3JjZGlyLAotCSAgcmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgZnJvbSBzcmNkaXIuICBPdGhlcndpc2UgZW1hY3MgZ2RiIG1vZGUKLQkgIGdldHMgY3Jhbmt5LiAgdXNlIHJlbGF0aXZlIHBhdGhzIGZvciBjb25maWd1cmUgYW5kIHNyY2RpcgotCSAgd2hlbmV2ZXIgcG9zc2libGUuICBTZW5kIHNvbWUgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyIHRoYXQgd2VyZQotCSAgZ29pbmcgdG8gc3Rkb3V0LgotCi1UdWUgTWFyIDEwIDE4OjAxOjU1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEZpeCBsaWJnKysgcnVsZSB0byBjaGVjayBmb3IgZ2NjIGRpcmVjdG9yeQotCWJlZm9yZSB1c2luZyBnY2MvZ2NjLiAgQWxzbyBwYXNzIFhUUkFGTEFHUy4KLQotVGh1IE1hciAgNSAyMTo0NTowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3RtcC1maWxlcyBzbyB0aGF0IGRpcmVjdG9yaWVzIGFyZW4ndCBwb2xsZWQKLQkgIHdoZW4gdGhleSBhcmUgYWxyZWFkeSBidWlsdC4KLQotCSogY29uZmlndXJlLnRleGk6IGZpeGVkIGEgbm9kZSBwb2ludGVyIHByb2JsZW0uCi0KLVRodSBNYXIgIDUgMTI6MDU6NTggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnN1YiBjb25maWd1cmUuaW4gY29uZmlnL21oLWlyaXg0IGdkYi9jb25maWd1cmUuaW4KLQlnZGIvbWlwcy10ZGVwLmMgZ2RiL21pcHNyZWFkLmMgZ2RiL3Byb2Nmcy5jIGdkYi9zaWduYW1lLmgKLQlnZGIvdG0taXJpeDMuaCBnZGIvdG0tbWlwcy5oIGdkYi94bS1pcml4NC5oIGdkYi9jb25maWcvbXQtaXJpeDMKLQlnZGIvY29uZmlnL21oLWlyaXg0IHRleGluZm8vY29uZmlndXJlLmluOiAgUG9ydCB0byBTR0kgSXJpeC00LnguCi0KLVdlZCBNYXIgIDQgMDI6NTc6NDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IC1yZWN1cnJpbmcgYmVjb21lcyAtc2lsZW50LiAgY29ycmVjdGVkIGhlbHAgbWVzc2FnZQotCSAgZm9yIC1zaXRlPSBvcHRpb24uCi0KLQkqIE1ha2VmaWxlLmluOiBta2RpciAkKGV4ZWNfcHJlZml4KSBhbmQgJCh0b29sZGlyKS4KLQotVHVlIE1hciAgMyAxNDo1MToyMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogd2hlbiBidWlsZGluZyBNYWtlZmlsZSBmb3IgY3Jvc3NlcywgcmVwbGFjZQotCSAgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguICBkZWZhdWx0IHNyY2RpciBmcm9tIGxvY2F0aW9uIG9mCi0JICBjb25maWcuc3ViLiAgcmVtb3ZlICJmb3IgaG9zdCBpbiBob3N0cyIgYW5kICJmb3IgdGFyZ2V0IGluCi0JICB0YXJnZXRzIiBsb29wcy4KLQotV2VkIEZlYiAyNiAxOTo0ODoyNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBEbyBub3QgcGFzcyBiaW5kaXIgb3IgbWFuZGlyIHRvIGN2cy4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiByZW1vdmUgbW9zdCByZWZlcmVuY2VzIHRvIG11bHRpcGxlIGhvc3RzLAotCSAgbXVsdGlwbGUgdGFyZ2V0cywgc3ViZGlycywgZXRjLgotCi0JKiBjb25maWd1cmUubWFuOiByZW1vdmVkIHJjc2lkLiByZWZlcmVuY2UgY29uZmlnLnN1YiBub3QKLQkgIGNvbmZpZy5zdWJyLgotCi0JKiBNYWtlZmlsZS5pbjogbWtkaXIgJChpbmZvZGlyKSBvbiBpbnN0YWxsLWluZm8uCi0KLVdlZCBGZWIgMTkgMTU6NDE6MTMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS50ZXhpOiAgRXhwbGFpbiBiZXR0ZXIgYWJvdXQgLmdkYmluaXQgYW5kIGFib3V0Ci0JdGhlIGVudmlyb25tZW50IHRoYXQgY29uZmlndXJlLmluIHNlY3Rpb25zIHJ1biBpbi4KLQotRnJpIEZlYiAgNyAwNzo1NTowMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgVWx0cml4IGlzIG9ubHkgYSBkZWNzdGF0aW9uIGlmIGl0J3MgYSBNSVBTLgotCi1GcmkgSmFuIDMxIDIxOjU0OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6ICBET0MuY29uZmlndXJlID0+IGNmZy1wYXBlci50ZXhpLgotCi1GcmkgSmFuIDMxIDIxOjQ4OjE4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWIgKG5lYXIgY2FzZSAkb3MpOiAgRG9uJ3QgY29udmVydCBuZXdzb3MqIHRvIGJzZCEKLQotRnJpIEphbiAzMSAwMjoyNzozMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZWluc3RhbGwgY2hhbmdlIGZyb20gZ2RiLTQuMyB0aGF0IHJlZHVjZXMKLQl0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiBDT1BZSU5HIHRoYXQgZ28gaW50byB0aGUgR0RCIHRhciBmaWxlLgotCi1UaHUgSmFuIDMwIDE2OjE3OjMwIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC9jb25maWd1cmUuaW4sIGNvbmZpZy9taC1zY28sIGdkYi9jb25maWcvbWgtaTM4NnNjbywKLQlnZGIvY29uZmlnL210LWkzODZ2MzIsIGdkYi9jb25maWd1cmUuaW4sIHJlYWRsaW5lL2NvbmZpZ3VyZS5pbjoKLQlGaXggU0NPIGNvbmZpZ3VyYXRpb24gc3R1ZmYuCi0KLVR1ZSBKYW4gMjggMjM6NTE6MDcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgRm9yIGxpYmcrKywgbWFrZSBzdXJlIHRoZSAtSSBwb2ludGluZwotCXRvIHRoZSBnY2MgZGlyZWN0b3J5IGdvZXMgKmFmdGVyKiBhbGwgdGhlIGxpYmcrKy1sb2NhbCAtSSBmbGFncy4KLQlBbHNvLCBtb3ZlIGp1c3QtZ2NjIGRlcGVuZGVuY3kgZnJvbSBqdXN0LWxpYmcrKyB0byBhbGwtbGliZysrLgotCi1UdWUgSmFuIDI4IDEyOjU2OjI0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogIENoYW5nZSAteCB0byAtZiB0byBrZWVwIFVsdHJpeCAvYmluL3Rlc3QgaGFwcHkuCi0KLVNhdCBKYW4gMTggMTc6NDU6MTEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1ha2UtZ2RiLnRhci5aKTogIFJlbW92ZSB0ZXhpbmZvIHRhcmdldHMuCi0KLVNhdCBKYW4gMTggMTc6MDM6MjEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5zdWI6ICBBZGQgc3RyYXR1cyBjb25maWd1cmF0aW9uIGZyYWdzLiAgQWxzbwotCXN1Ym1pdHRlZCB0byBGU0YuCi0KLVNhdCBKYW4gMTggMTU6MzU6MjkgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERFVl9TVVBQT1JUKTogIGFkZCBjb25maWd1cmUubWFuLgotCi0JKiBjb25maWcuc3ViKERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMpOiAgYWRkIC1ub25lKi4KLQotRnJpIEphbiAxNyAxNzo1ODowNSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIHJlbW92ZSBmb3JtIGZlZWRzIHRvIG1ha2UgU3VuJ3MgbWFrZSBoYXBweS4KLQkoREVWT19TVVBQT1JUKTogIERPQy5jb25maWd1cmUgPT4gY2ZnLXBhcGVyLnRleGkuCi0KLVNhdCBKYW4gIDQgMTY6MTE6NDQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBNYWtlIHF1aWV0ZXIuCi0KLVRodSBKYW4gIDIgMjI6NTc6MTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBsaWJnKysuCi0JKiBjb25maWd1cmU6ICBXaGVuIHZlcmJvc2UsIGRvbid0IG91dHB1dCB0aGUgY29tbWFuZCBsaW5lIGF0IGVhY2gKLQlsZXZlbDsgaXQgd2lsbCBiZSB1bnJlbWFya2FibHkgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHZlcnNpb24sCi0Jd2hpY2ggd2lsbCBiZSB0aGUgc2FtZSBhcyB3aGF0IHRoZSB1c2VyIHR5cGVkLgotCi1GcmkgRGVjIDI3IDE2OjI2OjQ3IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBmaXggY2xlYW4taW5mbywgYWRkIGZsZXguICBhZGQKLQkgIGZpbGV1dGlscy4KLQotCSogY29uZmlndXJlOiBiZSBsZXNzIHNlbnNpdGl2ZSB0byBzcGFjZXMgaW4gTWFrZWZpbGUuaW4uICBEbyBub3QKLQkgIGxvb2sgZm9yIHNvdXJjZXMgaW4gIi4uIi4gIERvaW5nIHNvIGJyZWFrcyBzdWJkaXJlY3RvcmllcyB0aGF0Ci0JICBtaWdodCBoYXZlIHRoZWlyIG93biBjb25maWd1cmUuICBJZiBhIHN1YmRpciBoYXMgaXQncyBvd24KLQkgIGNvbmZpZ3VyZSBzY3JpcHQsIHVzZSBpdC4KLQotVGh1IERlYyAyNiAxNjozMDoyNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY2ZnLXBhcGVyLnRleGk6IHNvbWUgY2hhbmdlcyBzdWdnZXN0ZWQgYnkgcm1zLgotCi1UaHUgRGVjIDI2IDEwOjEzOjM2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcuc3ViOiAgTWVyZ2UgaW4gc29tZSBzbWFsbCBhZGRpdGlvbnMgZnJvbSB0aGUgRlNGIHZlcnNpb24sCi0JdGFrZW4gZnJvbSB0aGUgZ2NjIGRpc3RyaWJ1dGlvbiwgdG8gYnJpbmcgdGhlIEN5Z251cyBhbmQgRlNGCi0JdmVyc2lvbnMgaW50byBjbG9zZXIgc3luYy4KLQotRnJpIERlYyAyMCAxMTozNDoxOCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlZCBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuCi0KLVRodSBEZWMgMTkgMTU6NTQ6MjkgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogYWRkZWQgLVYgZm9yIHZlcnNpb24gbnVtYmVyIG9wdGlvbi4KLQotV2VkIERlYyAxOCAxNTozOTozNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogRE9DLmNvbmZpZ3VyZSwgY2ZnLXBhcGVyLnRleGk6IHJldmlzZWQsIHVwZGF0ZWQsIGFuZCB0ZXhpbmZvJ2QuCi0JICByZW5hbWVkIGZyb20gRE9DLmNvbmZpZ3VyZSB0byBjZmctcGFwZXIudGV4aS4KLQotTW9uIERlYyAxNiAyMzowNToxOSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLnN1YnIsIGNvbmZpZy5zdWI6IGNvbmZpZy5zdWJyIGlzIG5vdwotCSAgY29uZmlnLnN1YiBhZ2Fpbi4KLQotRnJpIERlYyAxMyAwMToxNzowNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IG5ldyBmaWxlLCBpbiBwcm9ncmVzcy4KLQotCSogTWFrZWZpbGUuaW46IGJ1aWxkIGluZm8gZmlsZSBhbmQgaW5zdGFsbCB0aGUgbWFuIHBhZ2UgZm9yCi0JICBjb25maWd1cmUuCi0KLQkqIGNvbmZpZ3VyZS5tYW46IG5ldyBmaWxlLCBmaXJzdCBjdXQuCi0KLQkqIGNvbmZpZ3VyZTogZmluZCBjb25maWcuc3ViciBhZ2FpbiBub3cgdGhhdCBjb25maWd1cmF0aW9uICJub25lIgotCSAgaGFzIGdvbmUuICByZW1vdmVkIGFsbCB0cmFjZXMgb2YgdGhlIC1hbnNpIG9wdGlvbi4gIHJlbW92ZWQgYWxsCi0JICB0cmFjZXMgb2YgdGhlIC1sYW5ndWFnZXMgb3B0aW9uLgotCi0JKiBjb25maWcuc3VicjogcmVzeW5jIGZyb20gcm1zLgotCi1XZWQgRGVjIDExIDIyOjI1OjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLCBjb25maWcuc3ViLCBjb25maWcuc3VicjogbWVyZ2UgY29uZmlnLnN1YiBpbnRvCi0JICBjb25maWcuc3ViciwgY2FsbCB0aGUgcmVzdWx0IGNvbmZpZy5zdWJyLCByZW1vdmUgY29uZmlnLnN1YiwgdXNlCi0JICBjb25maWcuc3Vici4KLQotCSogTWFrZWZpbGUuaW46IHJldmlzZWQgaW5zdGFsbCBmb3IgZGlyLmluZm8uCi0KLVR1ZSBEZWMgMTAgMDA6MDQ6MzUgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCBkZWNzdGF0aW9uIGhvc3QgbWFrZWZpbGUgZnJhZy4KLQotCSogTWFrZWZpbGUuaW46IEJJU09OIG5vdyBiaXNvbiAteSBhZ2Fpbi4gIGFsc28gaW5zdGFsbC1nY2Mgb24KLQkgIGluc3RhbGwuICBjbGVhbi1nZGJtIG9uIGNsZWFuLiAgaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0JICBNYWtlIGRpcmVjdG9yaWVzIGZvciBpbmZvIGluc3RhbGwuICBCdWlsZCBkaXIuaW5mbyBoZXJlIHRoZW4KLQkgIGluc3RhbGwgaXQuCi0KLU1vbiBEZWMgIDkgMTY6NDg6MzMgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IGZvciBiYWQgZGlyZWN0b3J5IHRlc3RzLgotCi1TYXQgRGVjICA3IDAwOjE3OjAxIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlOiBcezEsMlx9IGFwcGVhcnMgdG8gYmUgYSBzeXN2J2lzbS4gIFVzZSBhIGRpZmZlcmVudAotCSAgcmVnZXhwLiAgLXNyY2RpciByZWxhdGl2ZSB3YXMgYmVpbmcgaGFuZGxlZCBpbmNvcnJlY3RseS4KLQotCSogTWFrZWZpbGUuaW46IHVud3JhcHBlZCBzb21lIGZvciBsb29wcyBzbyB0aGF0IHBhcmFsbGVsIG1ha2VzCi0JICB3b3JrIGFnYWluIGFuZCBzbyBvbmUgY2FuIGZvY3VzIG9uZSdzIGF0dGVudGlvbiBvbiBhIHBhcnRpY3VsYXIKLQkgIHBhY2thZ2UuCi0KLUZyaSBEZWMgIDYgMDA6MjI6MDggMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmU6IGFkZGVkIFBXRCBhcyBhIHN0YW5kIGluIGZvciBgcHdkYCAoZm9yIHNwZWVkKS4gdXNlCi0JICBlbGlmIHdoZXJldmVyIHBvc3NpYmxlLiAgbWFrZSAtc3JjZGlyIHdvcmsgd2l0aG91dCAtb2JqZGlyLgotCSAgLW9iamRpcj0gY29tbWVudGVkIG91dC4KLQotVGh1IERlYyAgNSAyMjo0Njo1MiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZTogK29wdGlvbnMgYmVjb21lIC0tb3B0aW9ucy4gIC1zdWJkaXJzIGNvbW1lbnRlZCBvdXQuCi0JICBhZGRlZCAtaG9zdCwgLWRhdGFkaXIuICBSZW5hbWVkIC1kZXN0ZGlyIHRvIC1wcmVmaXguICBDb21tZW50IGluCi0JICBNYWtlZmlsZSBub3cgYXQgdG9wIG9mIGdlbmVyYXRlZCBNYWtlZmlsZS4gIFJlbW92ZWQgY3ZzIGxvZwotCSAgZW50cmllcy4gIGFkZGVkIC1zcmNkaXIuICBjcmVhdGUgLmdkYmluaXQgb25seSBpZiB0aGVyZSBpcyBvbmUKLQkgIGluICR7c3JjZGlyfS4KLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotRnJpIE5vdiAyMiAwNzozODoxMSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIEZyZXNobHkgY3JlYXRlZCBDaGFuZ2VMb2cuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzYKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZTg4YjQuLjAwMDAwMDAKLS0tIGEvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxODE3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIHN1YmRpcnMgdG8gYnVpbGQuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotIyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0KLXNyY2RpciA9IC4KLQotcHJlZml4ID0gL3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAkKHByZWZpeCkKLQotYmluZGlyPSR7ZXhlY19wcmVmaXh9L2Jpbgotc2JpbmRpcj0ke2V4ZWNfcHJlZml4fS9zYmluCi1saWJleGVjZGlyPSR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMKLWRhdGFkaXI9JHtwcmVmaXh9L3NoYXJlCi1zeXNjb25mZGlyPSR7cHJlZml4fS9ldGMKLXNoYXJlZHN0YXRlZGlyPSR7cHJlZml4fS9jb20KLWxvY2Fsc3RhdGVkaXI9JHtwcmVmaXh9L3ZhcgotbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgotaW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQotb2xkaW5jbHVkZWRpcj0vdXNyL2luY2x1ZGUKLWluZm9kaXI9JHtwcmVmaXh9L2luZm8KLW1hbmRpcj0ke3ByZWZpeH0vbWFuCi1neHhfaW5jbHVkZV9kaXI9JHtpbmNsdWRlZGlyfS9nKysKLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0KQotCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0KLQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1tYW4yZGlyID0gJChtYW5kaXIpL21hbjIKLW1hbjNkaXIgPSAkKG1hbmRpcikvbWFuMwotbWFuNGRpciA9ICQobWFuZGlyKS9tYW40Ci1tYW41ZGlyID0gJChtYW5kaXIpL21hbjUKLW1hbjZkaXIgPSAkKG1hbmRpcikvbWFuNgotbWFuN2RpciA9ICQobWFuZGlyKS9tYW43Ci1tYW44ZGlyID0gJChtYW5kaXIpL21hbjgKLW1hbjlkaXIgPSAkKG1hbmRpcikvbWFuOQotaW5mb2RpciA9ICQocHJlZml4KS9pbmZvCi1pbmNsdWRlZGlyID0gJChwcmVmaXgpL2luY2x1ZGUKLSMgRGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlciBmaW5kcyBleGVjdXRhYmxlcywgbGlicmFyaWVzLCBldGMuCi1saWJzdWJkaXIgPSAkKGxpYmRpcikvZ2NjLWxpYi8kKHRhcmdldF9hbGlhcykvJChnY2NfdmVyc2lvbikKLUdEQl9OTE1fREVQUyA9IAotCi1TSEVMTCA9IC9iaW4vc2gKLQotIyBJTlNUQUxMX1BST0dSQU1fQVJHUyBpcyBjaGFuZ2VkIGJ5IGNvbmZpZ3VyZS5pbiB0byB1c2UgLXggZm9yIGEKLSMgY3lnd2luIGhvc3QuCi1JTlNUQUxMX1BST0dSQU1fQVJHUyA9Ci0KLUlOU1RBTEwgPSAkKFNIRUxMKSAkJHMvaW5zdGFsbC1zaCAtYwotSU5TVEFMTF9QUk9HUkFNID0gJChJTlNUQUxMKSAkKElOU1RBTExfUFJPR1JBTV9BUkdTKQotSU5TVEFMTF9TQ1JJUFQgPSAkKElOU1RBTEwpCi1JTlNUQUxMX0RBVEEgPSAkKElOU1RBTEwpIC1tIDY0NAotCi1JTlNUQUxMX0RPU1JFTCA9IGluc3RhbGwtZG9zcmVsLWZha2UKLQotQVMgPSBhcwotQVIgPSBhcgotQVJfRkxBR1MgPSByYwotQ0MgPSBjYwotCi0jIFNwZWNpYWwgdmFyaWFibGVzIHBhc3NlZCBkb3duIGluIEVYVFJBX0dDQ19GTEFHUy4gIFRoZXkgYXJlIGRlZmluZWQKLSMgaGVyZSBzbyB0aGF0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnkgTWFrZWZpbGUgZnJhZ21lbnRzLgotSE9TVF9DQyA9ICQoQ0NfRk9SX0JVSUxEKQotSE9TVF9QUkVGSVggPSAKLUhPU1RfUFJFRklYXzEgPSBsb3Nlci0KLQotIyBUaGVzZSBmbGFnIHZhbHVlcyBhcmUgbm9ybWFsbHkgb3ZlcnJpZGRlbiBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4KLUNGTEFHUyA9IC1nCi1DWFhGTEFHUyA9IC1nIC1PMgotCi1MSUJDRkxBR1MgPSAkKENGTEFHUykKLUNGTEFHU19GT1JfVEFSR0VUID0gJChDRkxBR1MpCi1MREZMQUdTX0ZPUl9UQVJHRVQgPSAKLUxJQkNGTEFHU19GT1JfVEFSR0VUID0gJChDRkxBR1NfRk9SX1RBUkdFVCkKLVBJQ0ZMQUcgPSAKLVBJQ0ZMQUdfRk9SX1RBUkdFVCA9IAotCi1DSElMTEZMQUdTID0gJChDRkxBR1MpCi1DSElMTF9MSUIgPSAtbGNoaWxsCi1DWFggPSBjKysKLQotIyBVc2UgLU8yIHRvIHN0cmVzcyB0ZXN0IHRoZSBjb21waWxlci4KLUxJQkNYWEZMQUdTID0gJChDWFhGTEFHUykgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMgLWZleGNlcHRpb25zCi1DWFhGTEFHU19GT1JfVEFSR0VUID0gJChDWFhGTEFHUykKLUxJQkNYWEZMQUdTX0ZPUl9UQVJHRVQgPSAkKENYWEZMQUdTX0ZPUl9UQVJHRVQpIC1mbm8taW1wbGljaXQtdGVtcGxhdGVzIC1mZXhjZXB0aW9ucwotCi1SQU5MSUIgPSByYW5saWIKLQotRExMVE9PTCA9IGRsbHRvb2wKLVdJTkRSRVMgPSB3aW5kcmVzCi0KLU5NID0gbm0KLQotTEQgPSBsZAotCi1CWklQUFJPRyA9IGJ6aXAyCi0KLSMgVGhlc2UgdmFsdWVzIGFyZSBzdWJzdGl0dXRlZCBieSBjb25maWd1cmUuCi1ERUZBVUxUX1lBQ0MgPSB5YWNjCi1ERUZBVUxUX0xFWCA9IGxleAotREVGQVVMVF9NNCA9IG00Ci0KLUJJU09OID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLUwgJCRzL2Jpc29uLyA7IFwKLQkgZWxzZSBcCi0JICAgIGVjaG8gYmlzb24gOyBcCi0JIGZpYAotCi1ZQUNDID0gYGlmIFsgLWYgJCRyL2Jpc29uL2Jpc29uIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYmlzb24vYmlzb24gLXkgLUwgJCRzL2Jpc29uLyA7IFwKLQllbGlmIFsgLWYgJCRyL2J5YWNjL2J5YWNjIF0gOyB0aGVuIFwKLQkgICAgZWNobyAkJHIvYnlhY2MvYnlhY2MgOyBcCi0JZWxzZSBcCi0JICAgIGVjaG8gJHtERUZBVUxUX1lBQ0N9IDsgXAotCWZpYAotCi1MRVggPSBgaWYgWyAtZiAkJHIvZmxleC9mbGV4IF0gOyBcCi0JdGhlbiBlY2hvICQkci9mbGV4L2ZsZXggOyBcCi0JZWxzZSBlY2hvICR7REVGQVVMVF9MRVh9IDsgZmlgCi0KLU00ID0gYGlmIFsgLWYgJCRyL200L200IF0gOyBcCi0JdGhlbiBlY2hvICQkci9tNC9tNCA7IFwKLQllbHNlIGVjaG8gJHtERUZBVUxUX000fSA7IGZpYAotCi1NQUtFSU5GTyA9IGBpZiBbIC1mICQkci90ZXhpbmZvL21ha2VpbmZvL01ha2VmaWxlIF0gOyBcCi0JdGhlbiBlY2hvICQkci90ZXhpbmZvL21ha2VpbmZvL21ha2VpbmZvIDsgXAotCWVsc2UgZWNobyBtYWtlaW5mbyA7IGZpYAotCi0jIFRoaXMganVzdCBiZWNvbWVzIHBhcnQgb2YgdGhlIE1BS0VJTkZPIGRlZmluaXRpb24gcGFzc2VkIGRvd24gdG8KLSMgc3ViLW1ha2VzLiAgSXQgbGV0cyBmbGFncyBiZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIHdoaWxlIHN0aWxsCi0jIHVzaW5nIHRoZSBtYWtlaW5mbyBmcm9tIHRoZSBvYmplY3QgdHJlZS4KLU1BS0VJTkZPRkxBR1MgPQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvZXhwZWN0L2V4cGVjdCBdIDsgXAotCXRoZW4gZWNobyAkJHIvZXhwZWN0L2V4cGVjdCA7IFwKLQllbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi0KLVJVTlRFU1QgPSBgaWYgWyAtZiAkJHMvZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQkcy9kZWphZ251L3J1bnRlc3QgOyBcCi0JZWxzZSBlY2hvIHJ1bnRlc3QgOyBmaWAKLQotCi0jIGNvbXBpbGVycyB0byB1c2UgdG8gY3JlYXRlIHByb2dyYW1zIHdoaWNoIG11c3QgYmUgcnVuIGluIHRoZSBidWlsZAotIyBlbnZpcm9ubWVudC4KLUNDX0ZPUl9CVUlMRCA9ICQoQ0MpCi1DWFhfRk9SX0JVSUxEID0gJChDWFgpCi0KLVNVQkRJUlMgPSAidGhpcyBpcyBzZXQgdmlhIGNvbmZpZ3VyZSwgZG9uJ3QgZWRpdCB0aGlzIgotT1RIRVJTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgd2hpY2gKLSMgc2hvdWxkIGJlIGJ1aWx0IHVzaW5nIHRoZSB0YXJnZXQgdG9vbHMuCi0KLQotVEFSR0VUX0NPTkZJR0RJUlMgPSBsaWJpYmVydHkgbGliZ2xvc3MgJChTUEVDSUFMX0xJQlMpIG5ld2xpYiBsaWJpbyBsaWJyeCBsaWJzdGRjKysgbGliZysrIHdpbnN1cCBvcGNvZGVzIGJzcCBsaWJzdHViIGN5Z21vbgotCi0jIFRhcmdldCBsaWJyYXJpZXMgYXJlIHB1dCB1bmRlciB0aGlzIGRpcmVjdG9yeToKLSMgQ2hhbmdlZCBieSBjb25maWd1cmUgdG8gJCh0YXJnZXRfYWxpYXMpIGlmIGNyb3NzLgotVEFSR0VUX1NVQkRJUiA9IC4KLQotIyBUaGlzIGlzIHNldCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCB0byB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBjb25maWd1cmUuCi1DT05GSUdfQVJHVU1FTlRTID0gCi0KLSMgVGhpcyBpcyBzZXQgYnkgY29uZmlndXJlIHRvIFJFQUxMWV9TRVRfTElCX1BBVEggaWYgLS1lbmFibGUtc2hhcmVkCi0jIHdhcyB1c2VkLgotU0VUX0xJQl9QQVRIID0KLQotIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2VkIGZvciB0aGUgcGF0aCB0bwotIyB0aGUgbGlicmFyaWVzLiAgVGhpcyBtYXkgYmUgY2hhbmdlZCBieSBjb25maWd1cmUuaW4uCi1SUEFUSF9FTlZWQVIgPSBMRF9MSUJSQVJZX1BBVEgKLQotIyBjb25maWd1cmUuaW4gc2V0cyBTRVRfTElCX1BBVEggdG8gdGhpcyBpZiAtLWVuYWJsZS1zaGFyZWQgd2FzIHVzZWQuCi1SRUFMTFlfU0VUX0xJQl9QQVRIID0gXAotICBpZiBbIHgiJCQkKFJQQVRIX0VOVlZBUikiICE9IHggXTsgdGhlbiBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM6JCQkKFJQQVRIX0VOVlZBUik7IFwKLSAgZWxzZSBcCi0gICAgJChSUEFUSF9FTlZWQVIpPSQkci9iZmQ6JCRyL29wY29kZXM7IFwKLSAgZmk7IFwKLSAgZXhwb3J0ICQoUlBBVEhfRU5WVkFSKTsKLQotQUxMID0gYWxsLm5vcm1hbAotSU5TVEFMTF9UQVJHRVQgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotSU5TVEFMTF9UQVJHRVRfQ1JPU1MgPSBpbnN0YWxsZGlycyBcCi0JaW5zdGFsbC1nY2MtY3Jvc3MgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX0RPU1JFTCkKLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgY2FzZSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgaW4gXAotICAgICAgICBpWzM0NTZdODYtKi1jeWd3aW4qKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtQiQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi8gLUwkJHIvJChUQVJHRVRfU1VCRElSKS93aW5zdXAgLWlkaXJhZnRlciAkJHIvJChUQVJHRVRfU1VCRElSKS9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL3dpbnN1cC9pbmNsdWRlIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvc3lzL2N5Z3dpbiAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luMzIgLW5vc3RkaW5jOyBcCi0gICAgICAgICAgOzsgXAotICAgICAgICAqKSBcCi0gICAgICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLyAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLQkgIDs7IFwKLSAgICAgIGVzYWMgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvZ2NjL3hnY2MgLUIkJHIvZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLSMgSWYgQ0NfRk9SX1RBUkdFVCBpcyBub3Qgb3ZlcnJpZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gdGhpcwotIyB2YXJpYWJsZSBpcyBwYXNzZWQgZG93biB0byB0aGUgZ2NjIE1ha2VmaWxlLCB3aGVyZSBpdCBpcyB1c2VkIHRvCi0jIGJ1aWxkIGxpYmdjYzIuYS4gIFdlIGRlZmluZSBpdCBoZXJlIHNvIHRoYXQgaXQgY2FuIGl0c2VsZiBiZQotIyBvdmVycmlkZGVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCi1HQ0NfRk9SX1RBUkdFVCA9ICQkci9nY2MveGdjYyAtQiQkci9nY2MvCi0KLUNISUxMX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGVjaG8gJCRyL2djYy94Z2NjIC1CJCRyL2djYy8gLUwkJHIvZ2NjL2NoL3J1bnRpbWUvOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBnY2MgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUNYWF9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBjYXNlICIkKHRhcmdldF9jYW5vbmljYWwpIiBpbiBcCi0gICAgICAgIGlbMzQ1Nl04Ni0qLWN5Z3dpbiopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1CJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliLyAtTCQkci8kKFRBUkdFVF9TVUJESVIpL3dpbnN1cCAtaWRpcmFmdGVyICQkci8kKFRBUkdFVF9TVUJESVIpL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHMvd2luc3VwL2luY2x1ZGUgLWlkaXJhZnRlciAkJHMvbmV3bGliL2xpYmMvaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9zeXMvY3lnd2luIC1pZGlyYWZ0ZXIgJCRzL25ld2xpYi9saWJjL3N5cy9jeWd3aW4zMiAtbm9zdGRpbmM7IFwKLSAgICAgICAgICA7OyBcCi0gICAgICAgICopIFwKLSAgICAgICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvIC1pZGlyYWZ0ZXIgJCRyLyQoVEFSR0VUX1NVQkRJUikvbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQkcy9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotCSAgOzsgXAotICAgICAgZXNhYyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci9nY2MveGdjYyAtQiQkci9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBjKysgfCBzZWQgLWUgJ3MveC94LycgJCR0OyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUFTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvZ2FzL2FzLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvZ2FzL2FzLW5ldyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUyk7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhcyB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLUxEX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvbGQvbGQtbmV3IF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9sZC9sZC1uZXcgOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIiQoaG9zdF9jYW5vbmljYWwpIiA9ICIkKHRhcmdldF9jYW5vbmljYWwpIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoTEQpOyBcCi0gICAgZWxzZSBcCi0gICAgICAgdD0nJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSc7IGVjaG8gbGQgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1ETExUT09MX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvZGxsdG9vbCBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvZGxsdG9vbCA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChETExUT09MKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIGRsbHRvb2wgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1XSU5EUkVTX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvYmludXRpbHMvd2luZHJlcyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvd2luZHJlcyA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChXSU5EUkVTKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIHdpbmRyZXMgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1BUl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL2FyIF0gOyB0aGVuIFwKLSAgICBlY2hvICQkci9iaW51dGlscy9hciA7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiJChob3N0X2Nhbm9uaWNhbCkiID0gIiQodGFyZ2V0X2Nhbm9uaWNhbCkiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChBUik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyBhciB8IHNlZCAtZSAncy94L3gvJyAkJHQgOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLVJBTkxJQl9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL3JhbmxpYiBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvcmFubGliIDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKFJBTkxJQik7IFwKLSAgICBlbHNlIFwKLSAgICAgICB0PSckKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpJzsgZWNobyByYW5saWIgfCBzZWQgLWUgJ3MveC94LycgJCR0IDsgXAotICAgIGZpOyBcCi0gIGZpYAotCi1OTV9GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyL2JpbnV0aWxzL25tLW5ldyBdIDsgdGhlbiBcCi0gICAgZWNobyAkJHIvYmludXRpbHMvbm0tbmV3IDsgXAotICBlbHNlIFwKLSAgICBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKE5NKTsgXAotICAgIGVsc2UgXAotICAgICAgIHQ9JyQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSknOyBlY2hvIG5tIHwgc2VkIC1lICdzL3gveC8nICQkdCA7IFwKLSAgICBmaTsgXAotICBmaWAKLQotIyBUaGUgZmlyc3QgcnVsZSBpbiB0aGUgZmlsZSBoYWQgYmV0dGVyIGJlIHRoaXMgb25lLiAgRG9uJ3QgcHV0IGFueSBhYm92ZSBpdC4KLSMgVGhpcyBsaXZlcyBoZXJlIHRvIGFsbG93IG1ha2VmaWxlIGZyYWdtZW50cyB0byBjb250YWluIGRlcGVuZGVuY2llcy4KLWFsbDogYWxsLm5vcm1hbAotLlBIT05ZOiBhbGwKLQotIyBUaGVzZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb25maWcvbXQtKi4KLSMgVGhlIF9UQVJHRVRfIGlzIGJlY2F1c2UgdGhleSdyZSBzcGVjaWZpZWQgaW4gbXQtZm9vLgotIyBUaGUgX0hPU1RfIGlzIGJlY2F1c2UgdGhleSdyZSBwcm9ncmFtcyB0aGF0IHJ1biBvbiB0aGUgaG9zdC4KLUVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTID0KLUVYVFJBX1RBUkdFVF9IT1NUX0lOU1RBTExfTU9EVUxFUyA9Ci1FWFRSQV9UQVJHRVRfSE9TVF9DSEVDS19NT0RVTEVTID0KLQotIyMjIyBob3N0IGFuZCB0YXJnZXQgc3BlY2lmaWMgbWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLSMjIwotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBhbGwgc3ViLW1ha2VzLgotIyBQbGVhc2Uga2VlcCB0aGVzZSBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi1CQVNFX0ZMQUdTX1RPX1BBU1MgPSBcCi0JIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCi0JIkFSX0ZPUl9UQVJHRVQ9JChBUl9GT1JfVEFSR0VUKSIgXAotCSJBU19GT1JfVEFSR0VUPSQoQVNfRk9SX1RBUkdFVCkiIFwKLQkiQklTT049JChCSVNPTikiIFwKLQkiQ0NfRk9SX0JVSUxEPSQoQ0NfRk9SX0JVSUxEKSIgXAotCSJDQ19GT1JfVEFSR0VUPSQoQ0NfRk9SX1RBUkdFVCkiIFwKLQkiQ0ZMQUdTPSQoQ0ZMQUdTKSIgXAotCSJDRkxBR1NfRk9SX1RBUkdFVD0kKENGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDSElMTEZMQUdTPSQoQ0hJTExGTEFHUykiIFwKLQkiQ0hJTExfRk9SX1RBUkdFVD0kKENISUxMX0ZPUl9UQVJHRVQpIiBcCi0JIkNISUxMX0xJQj0kKENISUxMX0xJQikiIFwKLQkiQ1hYX0ZPUl9CVUlMRD0kKENYWF9GT1JfQlVJTEQpIiBcCi0JIkNYWEZMQUdTPSQoQ1hYRkxBR1MpIiBcCi0JIkNYWEZMQUdTX0ZPUl9UQVJHRVQ9JChDWFhGTEFHU19GT1JfVEFSR0VUKSIgXAotCSJDWFhfRk9SX1RBUkdFVD0kKENYWF9GT1JfVEFSR0VUKSIgXAotCSJETExUT09MX0ZPUl9UQVJHRVQ9JChETExUT09MX0ZPUl9UQVJHRVQpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCi0JIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLQkiSU5TVEFMTF9TQ1JJUFQ9JChJTlNUQUxMX1NDUklQVCkiIFwKLQkiTERGTEFHUz0kKExERkxBR1MpIiBcCi0JIkxFWD0kKExFWCkiIFwKLQkiTERfRk9SX1RBUkdFVD0kKExEX0ZPUl9UQVJHRVQpIiBcCi0JIkxJQkNGTEFHUz0kKExJQkNGTEFHUykiIFwKLQkiTElCQ0ZMQUdTX0ZPUl9UQVJHRVQ9JChMSUJDRkxBR1NfRk9SX1RBUkdFVCkiIFwKLQkiTElCQ1hYRkxBR1M9JChMSUJDWFhGTEFHUykiIFwKLQkiTElCQ1hYRkxBR1NfRk9SX1RBUkdFVD0kKExJQkNYWEZMQUdTX0ZPUl9UQVJHRVQpIiBcCi0JIk00PSQoTTQpIiBcCi0JIk1BS0U9JChNQUtFKSIgXAotCSJNQUtFSU5GTz0kKE1BS0VJTkZPKSAkKE1BS0VJTkZPRkxBR1MpIiBcCi0JIk5NX0ZPUl9UQVJHRVQ9JChOTV9GT1JfVEFSR0VUKSIgXAotCSJSQU5MSUJfRk9SX1RBUkdFVD0kKFJBTkxJQl9GT1JfVEFSR0VUKSIgXAotCSJSUEFUSF9FTlZWQVI9JChSUEFUSF9FTlZWQVIpIiBcCi0JIlNIRUxMPSQoU0hFTEwpIiBcCi0JIkVYUEVDVD0kKEVYUEVDVCkiIFwKLQkiUlVOVEVTVD0kKFJVTlRFU1QpIiBcCi0JIlJVTlRFU1RGTEFHUz0kKFJVTlRFU1RGTEFHUykiIFwKLQkiVEFSR0VUX1NVQkRJUj0kKFRBUkdFVF9TVUJESVIpIiBcCi0JIldJTkRSRVNfRk9SX1RBUkdFVD0kKFdJTkRSRVNfRk9SX1RBUkdFVCkiIFwKLQkiWUFDQz0kKFlBQ0MpIiBcCi0JImJpbmRpcj0kKGJpbmRpcikiIFwKLQkiZGF0YWRpcj0kKGRhdGFkaXIpIiBcCi0JImV4ZWNfcHJlZml4PSQoZXhlY19wcmVmaXgpIiBcCi0JImluY2x1ZGVkaXI9JChpbmNsdWRlZGlyKSIgXAotCSJpbmZvZGlyPSQoaW5mb2RpcikiIFwKLQkibGliZGlyPSQobGliZGlyKSIgXAotCSJsaWJleGVjZGlyPSQobGliZXhlY2RpcikiIFwKLQkibGlzcGRpcj0kKGxpc3BkaXIpIiBcCi0JImxvY2Fsc3RhdGVkaXI9JChsb2NhbHN0YXRlZGlyKSIgXAotCSJtYW5kaXI9JChtYW5kaXIpIiBcCi0JIm9sZGluY2x1ZGVkaXI9JChvbGRpbmNsdWRlZGlyKSIgXAotCSJwcmVmaXg9JChwcmVmaXgpIiBcCi0JInNiaW5kaXI9JChzYmluZGlyKSIgXAotCSJzaGFyZWRzdGF0ZWRpcj0kKHNoYXJlZHN0YXRlZGlyKSIgXAotCSJzeXNjb25mZGlyPSQoc3lzY29uZmRpcikiIFwKLQkidG9vbGRpcj0kKHRvb2xkaXIpIiBcCi0JImd4eF9pbmNsdWRlX2Rpcj0kKGd4eF9pbmNsdWRlX2RpcikiIFwKLQkiZ2NjX3ZlcnNpb249JChnY2NfdmVyc2lvbikiIFwKLQkiZ2NjX3ZlcnNpb25fdHJpZ2dlcj0kKGdjY192ZXJzaW9uX3RyaWdnZXIpIiBcCi0JInRhcmdldF9hbGlhcz0kKHRhcmdldF9hbGlhcykiIFwKLQkibGlic3ViZGlyPSQobGlic3ViZGlyKSIKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbW9zdCBzdWItbWFrZXMsIGluIHdoaWNoIHdlJ3JlIGJ1aWxkaW5nIHdpdGgKLSMgdGhlIGhvc3QgZW52aXJvbm1lbnQuCi0jIElmIGFueSB2YXJpYWJsZXMgYXJlIGFkZGVkIGhlcmUsIHRoZXkgbXVzdCBiZSBhZGRlZCB0byBkby0qLCBiZWxvdy4KLUVYVFJBX0hPU1RfRkxBR1MgPSBcCi0JJ0FSPSQoQVIpJyBcCi0JJ0FTPSQoQVMpJyBcCi0JJ0NDPSQoQ0MpJyBcCi0JJ0NYWD0kKENYWCknIFwKLQknRExMVE9PTD0kKERMTFRPT0wpJyBcCi0JJ0xEPSQoTEQpJyBcCi0JJ05NPSQoTk0pJyBcCi0JJ1JBTkxJQj0kKFJBTkxJQiknIFwKLQknV0lORFJFUz0kKFdJTkRSRVMpJwotCi1GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfSE9TVF9GTEFHUykKLQotIyBGbGFncyB0aGF0IGFyZSBjb25jZXJuZWQgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlIFgxMSBpbmNsdWRlIGZpbGVzCi0jIGFuZCBsaWJyYXJ5IGZpbGVzCi0jCi0jIE5PVEU6IHVudGlsIHRoZSB0b3AtbGV2ZWwgaXMgZ2V0dGluZyB0aGUgdmFsdWVzIHZpYSBhdXRvY29uZiwgaXQgb25seQotIyBjYXVzZXMgcHJvYmxlbXMgdG8gaGF2ZSB0aGlzIHRvcC1sZXZlbCBNYWtlZmlsZSBvdmVycmlkaW5nIHRoZSBhdXRvY29uZi1zZXQKLSMgdmFsdWVzIGluIGNoaWxkIGRpcmVjdG9yaWVzLiAgT25seSB2YXJpYWJsZXMgdGhhdCBkb24ndCBjb25mbGljdCB3aXRoCi0jIGF1dG9jb25mJ2VkIG9uZXMgc2hvdWxkIGJlIHBhc3NlZCBieSBYMTFfRkxBR1NfVE9fUEFTUyBmb3Igbm93LgotIwotWDExX0ZMQUdTX1RPX1BBU1MgPSBcCi0JJ1gxMV9FWFRSQV9DRkxBR1M9JChYMTFfRVhUUkFfQ0ZMQUdTKScgXAotCSdYMTFfRVhUUkFfTElCUz0kKFgxMV9FWFRSQV9MSUJTKScKLQotIyBGbGFncyB0byBwYXNzIGRvd24gdG8gbWFrZXMgd2hpY2ggYXJlIGJ1aWx0IHdpdGggdGhlIHRhcmdldCBlbnZpcm9ubWVudC4KLSMgVGhlIGRvdWJsZSAkIGRlY3JlYXNlcyB0aGUgbGVuZ3RoIG9mIHRoZSBjb21tYW5kIGxpbmU7IHRoZSB2YXJpYWJsZXMKLSMgYXJlIHNldCBpbiBCQVNFX0ZMQUdTX1RPX1BBU1MsIGFuZCB0aGUgc3ViLW1ha2Ugd2lsbCBleHBhbmQgdGhlbS4KLSMgSWYgYW55IHZhcmlhYmxlcyBhcmUgYWRkZWQgaGVyZSwgdGhleSBtdXN0IGJlIGFkZGVkIHRvIGRvLSosIGJlbG93LgotRVhUUkFfVEFSR0VUX0ZMQUdTID0gXAotCSdBUj0kJChBUl9GT1JfVEFSR0VUKScgXAotCSdBUz0kJChBU19GT1JfVEFSR0VUKScgXAotCSdDQz0kJChDQ19GT1JfVEFSR0VUKScgXAotCSdDRkxBR1M9JCQoQ0ZMQUdTX0ZPUl9UQVJHRVQpJyBcCi0JJ0NYWD0kJChDWFhfRk9SX1RBUkdFVCknIFwKLQknQ1hYRkxBR1M9JCQoQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknRExMVE9PTD0kJChETExUT09MX0ZPUl9UQVJHRVQpJyBcCi0JJ0xEPSQkKExEX0ZPUl9UQVJHRVQpJyBcCi0JJ0xJQkNGTEFHUz0kJChMSUJDRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTElCQ1hYRkxBR1M9JCQoTElCQ1hYRkxBR1NfRk9SX1RBUkdFVCknIFwKLQknTk09JCQoTk1fRk9SX1RBUkdFVCknIFwKLQknUkFOTElCPSQkKFJBTkxJQl9GT1JfVEFSR0VUKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknCi0KLVRBUkdFVF9GTEFHU19UT19QQVNTID0gJChCQVNFX0ZMQUdTX1RPX1BBU1MpICQoRVhUUkFfVEFSR0VUX0ZMQUdTKQotCi0jIEZsYWdzIHRvIHBhc3MgZG93biB0byBnY2MuICBnY2MgYnVpbGRzIGEgbGlicmFyeSwgbGliZ2NjLmEsIHNvIGl0Ci0jIHVuZm9ydHVuYXRlbHkgbmVlZHMgdGhlIG5hdGl2ZSBjb21waWxlciBhbmQgdGhlIHRhcmdldCBhciBhbmQKLSMgcmFubGliLgotIyBJZiBhbnkgdmFyaWFibGVzIGFyZSBhZGRlZCBoZXJlLCB0aGV5IG11c3QgYmUgYWRkZWQgdG8gZG8tKiwgYmVsb3cuCi0jIFRoZSBIT1NUXyogdmFyaWFibGVzIGFyZSBhIHNwZWNpYWwgY2FzZSwgd2hpY2ggYXJlIHVzZWQgZm9yIHRoZSBnY2MKLSMgY3Jvc3MtYnVpbGRpbmcgc2NoZW1lLgotRVhUUkFfR0NDX0ZMQUdTID0gXAotCSdBUj0kKEFSKScgXAotCSdBUz0kKEFTKScgXAotCSdDQz0kKENDKScgXAotCSdDWFg9JChDWFgpJyBcCi0JJ0RMTFRPT0w9JCQoRExMVE9PTF9GT1JfVEFSR0VUKScgXAotCSdIT1NUX0NDPSQoQ0NfRk9SX0JVSUxEKScgXAotCSdIT1NUX1BSRUZJWD0kKEhPU1RfUFJFRklYKScgXAotCSdIT1NUX1BSRUZJWF8xPSQoSE9TVF9QUkVGSVhfMSknIFwKLQknTk09JChOTSknIFwKLQknUkFOTElCPSQoUkFOTElCKScgXAotCSdXSU5EUkVTPSQkKFdJTkRSRVNfRk9SX1RBUkdFVCknIFwKLQkiR0NDX0ZPUl9UQVJHRVQ9JChHQ0NfRk9SX1RBUkdFVCkiIFwKLQkiYGVjaG8gJ0xBTkdVQUdFUz0kKExBTkdVQUdFUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnU1RNUF9GSVhQUk9UTz0kKFNUTVBfRklYUFJPVE8pJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJTUlUU19IX1RFU1Q9JChMSU1JVFNfSF9URVNUKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdMSUJHQ0MxX1RFU1Q9JChMSUJHQ0MxX1RFU1QpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfQ0ZMQUdTPSQoTElCR0NDMl9DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfREVCVUdfQ0ZMQUdTPSQoTElCR0NDMl9ERUJVR19DRkxBR1MpJyB8IHNlZCAtZSBzLy4qPSQkL1hGT089L2AiIFwKLQkiYGVjaG8gJ0xJQkdDQzJfSU5DTFVERVM9JChMSUJHQ0MyX0lOQ0xVREVTKScgfCBzZWQgLWUgcy8uKj0kJC9YRk9PPS9gIiBcCi0JImBlY2hvICdFTlFVSVJFPSQoRU5RVUlSRSknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIgXAotCSJgZWNobyAnQk9PVF9DRkxBR1M9JChCT09UX0NGTEFHUyknIHwgc2VkIC1lIHMvLio9JCQvWEZPTz0vYCIKLQotR0NDX0ZMQUdTX1RPX1BBU1MgPSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgJChFWFRSQV9HQ0NfRkxBR1MpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaCBhcmUgY29tcGlsZWQKLSMgdXNpbmcgJChGTEFHU19UT19QQVNTKS4KLUFMTF9NT0RVTEVTID0gXAotCWFsbC1hcGFjaGUgXAotCWFsbC1hc2ggXAotCWFsbC1hdXRvY29uZiBcCi0JYWxsLWF1dG9tYWtlIFwKLQlhbGwtYmFzaCBcCi0JYWxsLWJmZCBcCi0JYWxsLWJpbnV0aWxzIFwKLQlhbGwtYmlzb24gXAotCWFsbC1ieWFjYyBcCi0JYWxsLWJ6aXAyIFwKLQlhbGwtY3Zzc3JjIFwKLQlhbGwtZGIgXAotCWFsbC1kZWphZ251IFwKLQlhbGwtZGlmZiBcCi0JYWxsLWRvc3V0aWxzIFwKLQlhbGwtZXRjIFwKLQlhbGwtZmlsZXV0aWxzIFwKLQlhbGwtZmluZHV0aWxzIFwKLQlhbGwtZmluZCBcCi0JYWxsLWZsZXggXAotCWFsbC1nYXMgXAotCWFsbC1nYXdrIFwKLQlhbGwtZ2V0dGV4dCBcCi0JYWxsLWdudXNlcnYgXAotCWFsbC1ncHJvZiBcCi0JYWxsLWdyZXAgXAotCWFsbC1ncmV6IFwKLQlhbGwtZ3ppcCBcCi0JYWxsLWhlbGxvIFwKLQlhbGwtaW5kZW50IFwKLQlhbGwtaW5ldCBcCi0JYWxsLWludGwgXAotCWFsbC1pc3BlbGwgXAotCWFsbC1pdGNsIFwKLQlhbGwtbGQgXAotCWFsbC1saWJndWkgXAotCWFsbC1saWJpYmVydHkgXAotCWFsbC1saWJ0b29sIFwKLQlhbGwtbTQgXAotCWFsbC1tYWtlIFwKLQlhbGwtbW1hbGxvYyBcCi0JYWxsLW9wY29kZXMgXAotCWFsbC1wYXRjaCBcCi0JYWxsLXBlcmwgXAotCWFsbC1wcm1zIFwKLQlhbGwtcmNzIFwKLQlhbGwtcmVhZGxpbmUgXAotCWFsbC1yZWxlYXNlIFwKLQlhbGwtcmVjb2RlIFwKLQlhbGwtc2VkIFwKLQlhbGwtc2VuZC1wciBcCi0JYWxsLXNoZWxsdXRpbHMgXAotCWFsbC1zaW0gXAotCWFsbC10YXIgXAotCWFsbC10Y2wgXAotCWFsbC10Y2w4LjEgXAotCWFsbC10ZXhpbmZvIFwKLQlhbGwtdGV4dHV0aWxzIFwKLQlhbGwtdGdhcyBcCi0JYWxsLXRpbWUgXAotCWFsbC11dWRlY29kZSBcCi0JYWxsLXdkaWZmIFwKLQlhbGwtemlwIFwKLQkkKEVYVFJBX1RBUkdFVF9IT1NUX0FMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoRkxBR1NfVE9fUEFTUykuCi0jCi0jIFRoZSBsaXN0IGlzIGluIHR3byBwYXJ0cy4gIFRoZSBmaXJzdCBsaXN0cyB0aG9zZSB0b29scyB3aGljaAotIyBhcmUgdGVzdGVkIGFzIHBhcnQgb2YgdGhlIGhvc3QncyBuYXRpdmUgdG9vbC1jaGFpbiwgYW5kIG5vdAotIyB0ZXN0ZWQgaW4gYSBjcm9zcyBjb25maWd1cmF0aW9uLgotTkFUSVZFX0NIRUNLX01PRFVMRVMgPSBcCi0JY2hlY2stYmlzb24gXAotCWNoZWNrLWJ5YWNjIFwKLQljaGVjay1mbGV4IFwKLQljaGVjay16aXAKLQotQ1JPU1NfQ0hFQ0tfTU9EVUxFUyA9IFwKLQljaGVjay1hcGFjaGUgXAotCWNoZWNrLWFzaCBcCi0JY2hlY2stYXV0b2NvbmYgXAotCWNoZWNrLWF1dG9tYWtlIFwKLQljaGVjay1iYXNoIFwKLQljaGVjay1iZmQgXAotCWNoZWNrLWJpbnV0aWxzIFwKLQljaGVjay1iemlwMiBcCi0JY2hlY2stY3Zzc3JjIFwKLQljaGVjay1kYiBcCi0JY2hlY2stZGVqYWdudSBcCi0JY2hlY2stZGlmZiBcCi0JY2hlY2stZXRjIFwKLQljaGVjay1maWxldXRpbHMgXAotCWNoZWNrLWZpbmR1dGlscyBcCi0JY2hlY2stZmluZCBcCi0JY2hlY2stZ2FzIFwKLQljaGVjay1nYXdrIFwKLQljaGVjay1nZXR0ZXh0IFwKLQljaGVjay1nbnVzZXJ2IFwKLQljaGVjay1ncHJvZiBcCi0JY2hlY2stZ3JlcCBcCi0JY2hlY2stZ3ppcCBcCi0JY2hlY2staGVsbG8gXAotCWNoZWNrLWluZGVudCBcCi0JY2hlY2staW5ldCBcCi0JY2hlY2staW50bCBcCi0JY2hlY2staXNwZWxsIFwKLQljaGVjay1pdGNsIFwKLQljaGVjay1sZCBcCi0JY2hlY2stbGliZ3VpIFwKLQljaGVjay1saWJpYmVydHkgXAotCWNoZWNrLWxpYnRvb2wgXAotCWNoZWNrLW00IFwKLQljaGVjay1tYWtlIFwKLQljaGVjay1tbWNoZWNrb2MgXAotCWNoZWNrLW9wY29kZXMgXAotCWNoZWNrLXBhdGNoIFwKLQljaGVjay1wZXJsIFwKLQljaGVjay1wcm1zIFwKLQljaGVjay1yY3MgXAotCWNoZWNrLXJlYWRsaW5lIFwKLQljaGVjay1yZWNvZGUgXAotCWNoZWNrLXNlZCBcCi0JY2hlY2stc2VuZC1wciBcCi0JY2hlY2stc2hlbGx1dGlscyBcCi0JY2hlY2stc2ltIFwKLQljaGVjay10YXIgXAotCWNoZWNrLXRjbCBcCi0JY2hlY2stdGV4aW5mbyBcCi0JY2hlY2stdGV4dHV0aWxzIFwKLQljaGVjay10Z2FzIFwKLQljaGVjay10aW1lIFwKLQljaGVjay11dWRlY29kZSBcCi0JY2hlY2std2RpZmYgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfQ0hFQ0tfTU9EVUxFUykKLQotQ0hFQ0tfTU9EVUxFUz0kKE5BVElWRV9DSEVDS19NT0RVTEVTKSAkKENST1NTX0NIRUNLX01PRFVMRVMpCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKEZMQUdTX1RPX1BBU1MpLgotIyBXZSBwdXQgaW5zdGFsbC1vcGNvZGVzIGJlZm9yZSBpbnN0YWxsLWJpbnV0aWxzIGJlY2F1c2UgdGhlIGluc3RhbGxlZAotIyBiaW51dGlscyBtaWdodCBiZSBvbiBQQVRILCBhbmQgdGhleSBtaWdodCBuZWVkIHRoZSBzaGFyZWQgb3Bjb2RlcwotIyBsaWJyYXJ5LgotIyBXZSBwdXQgaW5zdGFsbC10Y2wgYmVmb3JlIGluc3RhbGwtaXRjbCBiZWNhdXNlIGl0Y2wgd2FudHMgdG8gcnVuIGEKLSMgcHJvZ3JhbSBvbiBpbnN0YWxsYXRpb24gd2hpY2ggdXNlcyB0aGUgVGNsIGxpYnJhcmllcy4KLUlOU1RBTExfTU9EVUxFUyA9IFwKLQlpbnN0YWxsLWFwYWNoZSBcCi0JaW5zdGFsbC1hc2ggXAotCWluc3RhbGwtYXV0b2NvbmYgXAotCWluc3RhbGwtYXV0b21ha2UgXAotCWluc3RhbGwtYmFzaCBcCi0JaW5zdGFsbC1iZmQgXAotCWluc3RhbGwtYnppcDIgXAotCWluc3RhbGwtb3Bjb2RlcyBcCi0JaW5zdGFsbC1iaW51dGlscyBcCi0JaW5zdGFsbC1iaXNvbiBcCi0JaW5zdGFsbC1ieWFjYyBcCi0JaW5zdGFsbC1jdnNzcmMgXAotCWluc3RhbGwtZGIgXAotCWluc3RhbGwtZGVqYWdudSBcCi0JaW5zdGFsbC1kaWZmIFwKLQlpbnN0YWxsLWRvc3V0aWxzIFwKLQlpbnN0YWxsLWV0YyBcCi0JaW5zdGFsbC1maWxldXRpbHMgXAotCWluc3RhbGwtZmluZHV0aWxzIFwKLQlpbnN0YWxsLWZpbmQgXAotCWluc3RhbGwtZmxleCBcCi0JaW5zdGFsbC1nYXMgXAotCWluc3RhbGwtZ2F3ayBcCi0JaW5zdGFsbC1nZXR0ZXh0IFwKLQlpbnN0YWxsLWdudXNlcnYgXAotCWluc3RhbGwtZ3Byb2YgXAotCWluc3RhbGwtZ3JlcCBcCi0JaW5zdGFsbC1ncmV6IFwKLQlpbnN0YWxsLWd6aXAgXAotCWluc3RhbGwtaGVsbG8gXAotCWluc3RhbGwtaW5kZW50IFwKLQlpbnN0YWxsLWluZXQgXAotCWluc3RhbGwtaW50bCBcCi0JaW5zdGFsbC1pc3BlbGwgXAotCWluc3RhbGwtdGNsIFwKLQlpbnN0YWxsLXRjbDguMSBcCi0JaW5zdGFsbC1pdGNsIFwKLQlpbnN0YWxsLWxkIFwKLQlpbnN0YWxsLWxpYmd1aSBcCi0JaW5zdGFsbC1saWJpYmVydHkgXAotCWluc3RhbGwtbGlidG9vbCBcCi0JaW5zdGFsbC1tNCBcCi0JaW5zdGFsbC1tYWtlIFwKLQlpbnN0YWxsLW1tYWxsb2MgXAotCWluc3RhbGwtcGF0Y2ggXAotCWluc3RhbGwtcGVybCBcCi0JaW5zdGFsbC1wcm1zIFwKLQlpbnN0YWxsLXJjcyBcCi0JaW5zdGFsbC1yZWFkbGluZSBcCi0JaW5zdGFsbC1yZWNvZGUgXAotCWluc3RhbGwtc2VkIFwKLQlpbnN0YWxsLXNlbmQtcHIgXAotCWluc3RhbGwtc2hlbGx1dGlscyBcCi0JaW5zdGFsbC1zaW0gXAotCWluc3RhbGwtdGFyIFwKLQlpbnN0YWxsLXRleGluZm8gXAotCWluc3RhbGwtdGV4dHV0aWxzIFwKLQlpbnN0YWxsLXRnYXMgXAotCWluc3RhbGwtdGltZSBcCi0JaW5zdGFsbC11dWRlY29kZSBcCi0JaW5zdGFsbC13ZGlmZiBcCi0JaW5zdGFsbC16aXAgXAotCSQoRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTKQotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlIGNvbXBpbGVkCi0jIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQUxMX1gxMV9NT0RVTEVTID0gXAotCWFsbC1lbWFjcyBcCi0JYWxsLWVtYWNzMTkgXAotCWFsbC1nZGIgXAotCWFsbC1leHBlY3QgXAotCWFsbC1nYXNoIFwKLQlhbGwtZ3VpbGUgXAotCWFsbC10Y2xYIFwKLQlhbGwtdGsgXAotCWFsbC10azguMSBcCi0JYWxsLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBjaGVjayB0YXJnZXRzIGZvciBhbGwgb2YgdGhlIG1vZHVsZXMgd2hpY2ggYXJlCi0jIGNvbXBpbGVkIHVzaW5nICQoWDExX0ZMQUdTX1RPX1BBU1MpLgotQ0hFQ0tfWDExX01PRFVMRVMgPSBcCi0JY2hlY2stZW1hY3MgXAotCWNoZWNrLWdkYiBcCi0JY2hlY2stZ3VpbGUgXAotCWNoZWNrLWV4cGVjdCBcCi0JY2hlY2stZ2FzaCBcCi0JY2hlY2stdGNsWCBcCi0JY2hlY2stdGsgXAotCWNoZWNrLXRpeAotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSBpbnN0YWxsIHRhcmdldHMgZm9yIGFsbCB0aGUgbW9kdWxlcyB3aGljaCBhcmUKLSMgY29tcGlsZWQgdXNpbmcgJChYMTFfRkxBR1NfVE9fUEFTUykuCi1JTlNUQUxMX1gxMV9NT0RVTEVTID0gXAotCWluc3RhbGwtZW1hY3MgXAotCWluc3RhbGwtZW1hY3MxOSBcCi0JaW5zdGFsbC1nZGIgXAotCWluc3RhbGwtZ3VpbGUgXAotCWluc3RhbGwtZXhwZWN0IFwKLQlpbnN0YWxsLWdhc2ggXAotCWluc3RhbGwtdGNsWCBcCi0JaW5zdGFsbC10ayBcCi0JaW5zdGFsbC10azguMSBcCi0JaW5zdGFsbC10aXgKLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBjb21waWxlZAotIyB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUFMTF9UQVJHRVRfTU9EVUxFUyA9IFwKLQlhbGwtdGFyZ2V0LWxpYmlvIFwKLQlhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JYWxsLXRhcmdldC1saWJyeCBcCi0JYWxsLXRhcmdldC1saWJnKysgXAotCWFsbC10YXJnZXQtbmV3bGliIFwKLQlhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWFsbC10YXJnZXQtd2luc3VwIFwKLQlhbGwtdGFyZ2V0LWxpYmdsb3NzIFwKLQlhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JYWxsLXRhcmdldC1ncGVyZiBcCi0JYWxsLXRhcmdldC1leGFtcGxlcyBcCi0JYWxsLXRhcmdldC1saWJzdHViIFwKLQlhbGwtdGFyZ2V0LWJzcCBcCi0JYWxsLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY29uZmlndXJlIHRhcmdldHMgZm9yIGFsbCBvZiB0aGUgbW9kdWxlcyB3aGljaAotIyBhcmUgY29tcGlsZWQgdXNpbmcgdGhlIHRhcmdldCB0b29scy4KLUNPTkZJR1VSRV9UQVJHRVRfTU9EVUxFUyA9IFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmlvIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJyeCBcCi0JY29uZmlndXJlLXRhcmdldC1saWJnKysgXAotCWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmdsb3NzIFwKLQljb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY29uZmlndXJlLXRhcmdldC1ncGVyZiBcCi0JY29uZmlndXJlLXRhcmdldC1leGFtcGxlcyBcCi0JY29uZmlndXJlLXRhcmdldC1saWJzdHViIFwKLQljb25maWd1cmUtdGFyZ2V0LWJzcCBcCi0JY29uZmlndXJlLXRhcmdldC1jeWdtb24KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiB0aGUgY2hlY2sgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUNIRUNLX1RBUkdFVF9NT0RVTEVTID0gXAotCWNoZWNrLXRhcmdldC1saWJpbyBcCi0JY2hlY2stdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JY2hlY2stdGFyZ2V0LWxpYmcrKyBcCi0JY2hlY2stdGFyZ2V0LW5ld2xpYiBcCi0JY2hlY2stdGFyZ2V0LXdpbnN1cCBcCi0JY2hlY2stdGFyZ2V0LWxpYmliZXJ0eSBcCi0JY2hlY2stdGFyZ2V0LWdwZXJmCi0KLSMgVGhpcyBpcyBhIGxpc3Qgb2YgdGhlIGluc3RhbGwgdGFyZ2V0cyBmb3IgYWxsIG9mIHRoZSBtb2R1bGVzIHdoaWNoIGFyZQotIyBjb21waWxlZCB1c2luZyAkKFRBUkdFVF9GTEFHU19UT19QQVNTKS4KLUlOU1RBTExfVEFSR0VUX01PRFVMRVMgPSBcCi0JaW5zdGFsbC10YXJnZXQtbGliaW8gXAotCWluc3RhbGwtdGFyZ2V0LWxpYnN0ZGMrKyBcCi0JaW5zdGFsbC10YXJnZXQtbGliZysrIFwKLQlpbnN0YWxsLXRhcmdldC1uZXdsaWIgXAotCWluc3RhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgXAotCWluc3RhbGwtdGFyZ2V0LXdpbnN1cCBcCi0JaW5zdGFsbC10YXJnZXQtbGliZ2xvc3MgXAotCWluc3RhbGwtdGFyZ2V0LWxpYmliZXJ0eSBcCi0JaW5zdGFsbC10YXJnZXQtYnNwIFwKLQlpbnN0YWxsLXRhcmdldC1ncGVyZgotCi0jIFRoaXMgaXMgYSBsaXN0IG9mIHRoZSB0YXJnZXRzIGZvciB3aGljaCB3ZSBjYW4gZG8gYSBjbGVhbi17dGFyZ2V0fS4KLUNMRUFOX01PRFVMRVMgPSBcCi0JY2xlYW4tYXBhY2hlIFwKLQljbGVhbi1hc2ggXAotCWNsZWFuLWF1dG9jb25mIFwKLQljbGVhbi1hdXRvbWFrZSBcCi0JY2xlYW4tYmFzaCBcCi0JY2xlYW4tYmZkIFwKLQljbGVhbi1iaW51dGlscyBcCi0JY2xlYW4tYmlzb24gXAotCWNsZWFuLWJ5YWNjIFwKLQljbGVhbi1iemlwMiBcCi0JY2xlYW4tY3Zzc3JjIFwKLQljbGVhbi1kYiBcCi0JY2xlYW4tZGVqYWdudSBcCi0JY2xlYW4tZGlmZiBcCi0JY2xlYW4tZG9zdXRpbHMgXAotCWNsZWFuLWV0YyBcCi0JY2xlYW4tZmlsZXV0aWxzIFwKLQljbGVhbi1maW5kdXRpbHMgXAotCWNsZWFuLWZpbmQgXAotCWNsZWFuLWZsZXggXAotCWNsZWFuLWdhcyBcCi0JY2xlYW4tZ2F3ayBcCi0JY2xlYW4tZ2V0dGV4dCBcCi0JY2xlYW4tZ251c2VydiBcCi0JY2xlYW4tZ3Byb2YgXAotCWNsZWFuLWdyZXAgXAotCWNsZWFuLWdyZXogXAotCWNsZWFuLWd6aXAgXAotCWNsZWFuLWhlbGxvIFwKLQljbGVhbi1pbmRlbnQgXAotCWNsZWFuLWluZXQgXAotCWNsZWFuLWludGwgXAotCWNsZWFuLWlzcGVsbCBcCi0JY2xlYW4taXRjbCBcCi0JY2xlYW4tbGQgXAotCWNsZWFuLWxpYmd1aSBcCi0JY2xlYW4tbGliaWJlcnR5IFwKLQljbGVhbi1saWJ0b29sIFwKLQljbGVhbi1tNCBcCi0JY2xlYW4tbWFrZSBcCi0JY2xlYW4tbW1hbGxvYyBcCi0JY2xlYW4tb3Bjb2RlcyBcCi0JY2xlYW4tcGF0Y2ggXAotCWNsZWFuLXBlcmwgXAotCWNsZWFuLXBybXMgXAotCWNsZWFuLXJjcyBcCi0JY2xlYW4tcmVhZGxpbmUgXAotCWNsZWFuLXJlbGVhc2UgXAotCWNsZWFuLXJlY29kZSBcCi0JY2xlYW4tc2VkIFwKLQljbGVhbi1zZW5kLXByIFwKLQljbGVhbi1zaGVsbHV0aWxzIFwKLQljbGVhbi1zaW0gXAotCWNsZWFuLXRhciBcCi0JY2xlYW4tdGNsIFwKLQljbGVhbi10ZXhpbmZvIFwKLQljbGVhbi10ZXh0dXRpbHMgXAotCWNsZWFuLXRnYXMgXAotCWNsZWFuLXRpbWUgXAotCWNsZWFuLXV1ZGVjb2RlIFwKLQljbGVhbi13ZGlmZiBcCi0JY2xlYW4temlwCi0KLSMgQWxsIG9mIHRoZSB0YXJnZXQgbW9kdWxlcyB0aGF0IGNhbiBiZSBjbGVhbmVkCi1DTEVBTl9UQVJHRVRfTU9EVUxFUyA9IFwKLQljbGVhbi10YXJnZXQtbGliaW8gXAotCWNsZWFuLXRhcmdldC1saWJzdGRjKysgXAotCWNsZWFuLXRhcmdldC1saWJyeCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmcrKyBcCi0JY2xlYW4tdGFyZ2V0LW5ld2xpYiBcCi0JY2xlYW4tdGFyZ2V0LXdpbnN1cCBcCi0JY2xlYW4tdGFyZ2V0LWxpYmdsb3NzIFwKLQljbGVhbi10YXJnZXQtbGliaWJlcnR5IFwKLQljbGVhbi10YXJnZXQtZ3BlcmYgXAotCWNsZWFuLXRhcmdldC1leGFtcGxlcyBcCi0JY2xlYW4tdGFyZ2V0LWxpYnN0dWIgXAotCWNsZWFuLXRhcmdldC1ic3AgXAotCWNsZWFuLXRhcmdldC1jeWdtb24KLQotIyBBbGwgb2YgdGhlIHgxMSBtb2R1bGVzIHRoYXQgY2FuIGJlIGNsZWFuZWQKLUNMRUFOX1gxMV9NT0RVTEVTID0gXAotCWNsZWFuLWVtYWNzIFwKLQljbGVhbi1lbWFjczE5IFwKLQljbGVhbi1nZGIgXAotCWNsZWFuLWV4cGVjdCBcCi0JY2xlYW4tZ2FzaCBcCi0JY2xlYW4tZ3VpbGUgXAotCWNsZWFuLXRjbFggXAotCWNsZWFuLXRrIFwKLQljbGVhbi10aXgKLQotIyBUaGUgdGFyZ2V0IGJ1aWx0IGZvciBhIG5hdGl2ZSBidWlsZC4KLS5QSE9OWTogYWxsLm5vcm1hbAotYWxsLm5vcm1hbDogXAotCSQoQUxMX01PRFVMRVMpIFwKLQkkKEFMTF9YMTFfTU9EVUxFUykgXAotCSQoQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JYWxsLWdjYwotCi0jIERvIGEgdGFyZ2V0IGZvciBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzLiAgQSBgYG1ha2UgZG8tWCcnIHdpbGwgZG8gYQotIyBgYG1ha2UgWCcnIGluIGFsbCBzdWJkaXJlY3RvcmllcyAoYmVjYXVzZSwgaW4gZ2VuZXJhbCwgdGhlcmUgaXMgYQotIyBkZXBlbmRlbmN5IChiZWxvdykgb2YgWCB1cG9uIGRvLVgsIGEgYGBtYWtlIFgnJyB3aWxsIGFsc28gZG8gdGhpcywKLSMgYnV0IGl0IG1heSBkbyBhZGRpdGlvbmFsIHdvcmsgYXMgd2VsbCkuCi0jIFRoaXMgdGFyZ2V0IGVuc3VyZXMgdGhhdCAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYXBwZWFycyBvbmx5IG9uY2UsCi0jIGJlY2F1c2UgaXQgaXMgc28gbGFyZ2UgdGhhdCBpdCBjYW4gZWFzaWx5IG92ZXJmbG93IHRoZSBjb21tYW5kIGxpbmUKLSMgbGVuZ3RoIGxpbWl0IG9uIHNvbWUgc3lzdGVtcy4KLURPX1ggPSBcCi0JZG8tY2xlYW4gXAotCWRvLWRpc3RjbGVhbiBcCi0JZG8tZHZpIFwKLQlkby1pbmZvIFwKLQlkby1pbnN0YWxsLWluZm8gXAotCWRvLWluc3RhbGxjaGVjayBcCi0JZG8tbW9zdGx5Y2xlYW4gXAotCWRvLW1haW50YWluZXItY2xlYW4gXAotCWRvLVRBR1MKLS5QSE9OWTogJChET19YKQotJChET19YKToKLQlAdGFyZ2V0PWBlY2hvICRAIHwgc2VkIC1lICdzL15kby0vLydgOyBcCi0Jcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQlmb3IgaSBpbiAkKFNVQkRJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgLi8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGNhc2UgJCRpIGluIFwKLQkgICAgZ2NjKSBcCi0JICAgICAgZm9yIGZsYWcgaW4gJChFWFRSQV9HQ0NfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgICopIFwKLQkgICAgICBmb3IgZmxhZyBpbiAkKEVYVFJBX0hPU1RfRkxBR1MpOyBkbyBcCi0JCWV2YWwgYGVjaG8gIiQkZmxhZyIgfCBzZWQgLWUgInN8XlwoW149XSpcKT1cKC4qXCl8XDE9J1wyJ3wiYDsgXAotCSAgICAgIGRvbmU7IFwKLQkgICAgICA7OyBcCi0JICAgIGVzYWMgOyBcCi0JICAgIGV4cG9ydCBBUiBBUyBDQyBDWFggTEQgTk0gUkFOTElCIERMTFRPT0wgV0lORFJFUzsgXAotCSAgICBpZiAoY2QgLi8kJGk7IFwKLQkgICAgICAgICQoTUFLRSkgJChCQVNFX0ZMQUdTX1RPX1BBU1MpICJBUj0kJHtBUn0iICJBUz0kJHtBU30iIFwKLQkJCSJDQz0kJHtDQ30iICJDWFg9JCR7Q1hYfSIgIkxEPSQke0xEfSIgIk5NPSQke05NfSIgXAotCQkJIlJBTkxJQj0kJHtSQU5MSUJ9IiBcCi0JCQkiRExMVE9PTD0kJHtETExUT09MfSIgIldJTkRSRVM9JCR7V0lORFJFU30iIFwKLQkJCSQke3RhcmdldH0pOyBcCi0JICAgIHRoZW4gdHJ1ZTsgZWxzZSBleGl0IDE7IGZpOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCUB0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvXmRvLS8vJ2A7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWZvciBpIGluICQoVEFSR0VUX0NPTkZJR0RJUlMpIC1kdW1teS07IGRvIFwKLQkgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJGkvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgIGZvciBmbGFnIGluICQoRVhUUkFfVEFSR0VUX0ZMQUdTKTsgZG8gXAotCQlldmFsIGBlY2hvICIkJGZsYWciIHwgc2VkIC1lICJzfF5cKFtePV0qXCk9XCguKlwpfFwxPSdcMid8ImA7IFwKLQkgICAgZG9uZTsgXAotCSAgICBleHBvcnQgQVIgQVMgQ0MgQ1hYIExEIE5NIFJBTkxJQiBETExUT09MIFdJTkRSRVM7IFwKLQkgICAgaWYgKGNkICQoVEFSR0VUX1NVQkRJUikvJCRpOyBcCi0JICAgICAgICAkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSAiQVI9JCR7QVJ9IiAiQVM9JCR7QVN9IiBcCi0JCQkiQ0M9JCR7Q0N9IiAiQ1hYPSQke0NYWH0iICJMRD0kJHtMRH0iICJOTT0kJHtOTX0iIFwKLQkJCSJSQU5MSUI9JCR7UkFOTElCfSIgXAotCQkJIkRMTFRPT0w9JCR7RExMVE9PTH0iICJXSU5EUkVTPSQke1dJTkRSRVN9IiBcCi0JCQkkJHt0YXJnZXR9KTsgXAotCSAgICB0aGVuIHRydWU7IGVsc2UgZXhpdCAxOyBmaTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQotIyBIZXJlIGFyZSB0aGUgdGFyZ2V0cyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBkby1YIHRhcmdldHMuCi0KLS5QSE9OWTogaW5mbyBpbnN0YWxsY2hlY2sgZHZpIGluc3RhbGwtaW5mbwotLlBIT05ZOiBjbGVhbiBkaXN0Y2xlYW4gbW9zdGx5Y2xlYW4gbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4KLS5QSE9OWTogbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuIGxvY2FsLW1haW50YWluZXItY2xlYW4KLWluZm86IGRvLWluZm8KLWluc3RhbGxjaGVjazogZG8taW5zdGFsbGNoZWNrCi1kdmk6IGRvLWR2aQotCi0jIE1ha2Ugc3VyZSBtYWtlaW5mbyBpcyBidWlsdCBiZWZvcmUgd2UgZG8gYSBgbWFrZSBpbmZvJy4KLWRvLWluZm86IGFsbC10ZXhpbmZvCi0KLWluc3RhbGwtaW5mbzogZG8taW5zdGFsbC1pbmZvIGRpci5pbmZvCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCWlmIFsgLWYgZGlyLmluZm8gXSA7IHRoZW4gXAotCSAgJChJTlNUQUxMX0RBVEEpIGRpci5pbmZvICQoaW5mb2RpcikvZGlyLmluZm8gOyBcCi0JZWxzZSB0cnVlIDsgZmkKLQotbG9jYWwtY2xlYW46Ci0JLXJtIC1mICouYSBURU1QIGVycnMgY29yZSAqLm8gKn4gXCMqIFRBR1MgKi5FICoubG9nCi0KLWxvY2FsLWRpc3RjbGVhbjoKLQktcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgbWgtZnJhZyBtdC1mcmFnCi0JLWlmIFsgIiQoVEFSR0VUX1NVQkRJUikiICE9ICIuIiBdOyB0aGVuIFwKLQkgIHJtIC1yZiAkKFRBUkdFVF9TVUJESVIpOyBcCi0JZWxzZSB0cnVlOyBmaQotCi1sb2NhbC1tYWludGFpbmVyLWNsZWFuOgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1jbGVhbjogZG8tY2xlYW4gbG9jYWwtY2xlYW4KLW1vc3RseWNsZWFuOiBkby1tb3N0bHljbGVhbiBsb2NhbC1jbGVhbgotZGlzdGNsZWFuOiBkby1kaXN0Y2xlYW4gbG9jYWwtY2xlYW4gbG9jYWwtZGlzdGNsZWFuCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1tYWludGFpbmVyLWNsZWFuIGRvLW1haW50YWluZXItY2xlYW4gbG9jYWwtY2xlYW4gCi1tYWludGFpbmVyLWNsZWFuOiBsb2NhbC1kaXN0Y2xlYW4KLXJlYWxjbGVhbjogbWFpbnRhaW5lci1jbGVhbgotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNsZWFuIHNwZWNpZmljIG1vZHVsZXMuCi0uUEhPTlk6ICQoQ0xFQU5fTU9EVUxFUykgJChDTEVBTl9YMTFfTU9EVUxFUykgY2xlYW4tZ2NjCi0kKENMRUFOX01PRFVMRVMpICQoQ0xFQU5fWDExX01PRFVMRVMpIGNsZWFuLWdjYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NsZWFuLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2xlYW4pOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotLlBIT05ZOiAkKENMRUFOX1RBUkdFVF9NT0RVTEVTKQotJChDTEVBTl9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jbGVhbi10YXJnZXQtLy8nYDsgXAotCXJtIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9tdWx0aWxpYi5vdXQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTsgJChNQUtFKSAkKFRBUkdFVF9GTEFHU19UT19QQVNTKSBjbGVhbik7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi1jbGVhbi10YXJnZXQ6ICQoQ0xFQU5fVEFSR0VUX01PRFVMRVMpCi0KLSMgQ2hlY2sgdGFyZ2V0LgotCi0uUEhPTlk6IGNoZWNrCi1jaGVjazogJChDSEVDS19NT0RVTEVTKSBcCi0JJChDSEVDS19UQVJHRVRfTU9EVUxFUykgXAotCSQoQ0hFQ0tfWDExX01PRFVMRVMpIFwKLQljaGVjay1nY2MKLQotIyBBdXRvbWF0ZWQgcmVwb3J0aW5nIG9mIHRlc3QgcmVzdWx0cy4KLQotd2FybmluZy5sb2c6IGJ1aWxkLmxvZwotCSQoc3JjZGlyKS9jb250cmliL3dhcm5fc3VtbWFyeSBidWlsZC5sb2cgPiAkQAotCi1tYWlsLXJlcG9ydC5sb2c6Ci0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotbWFpbC1yZXBvcnQtd2l0aC13YXJuaW5ncy5sb2c6IHdhcm5pbmcubG9nCi0JaWYgdGVzdCB4JyQoQk9PVF9DRkxBR1MpJyAhPSB4Jyc7IHRoZW4gXAotCSAgICBCT09UX0NGTEFHUz0nJChCT09UX0NGTEFHUyknOyBleHBvcnQgQk9PVF9DRkxBR1M7IFwKLQlmaTsgXAotCSQoc3JjZGlyKS9jb250cmliL3Rlc3Rfc3VtbWFyeSAtdCAtaSB3YXJuaW5nLmxvZyA+JEAKLQljaG1vZCAreCAkQAotCWVjaG8gSWYgeW91IHJlYWxseSB3YW50IHRvIHNlbmQgZS1tYWlsLCBydW4gLi8kQCBub3cKLQotIyBJbnN0YWxsYXRpb24gdGFyZ2V0cy4KLQotLlBIT05ZOiBpbnN0YWxsIGluc3RhbGwtY3Jvc3MgdW5pbnN0YWxsIHNvdXJjZS12YXVsdCBiaW5hcnktdmF1bHQgdmF1bHQtaW5zdGFsbAotaW5zdGFsbDogJChJTlNUQUxMX1RBUkdFVCkgCi1pbnN0YWxsLWNyb3NzOiAkKElOU1RBTExfVEFSR0VUX0NST1NTKSAKLQotdW5pbnN0YWxsOgotCUBlY2hvICJ0aGUgdW5pbnN0YWxsIHRhcmdldCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgdHJlZSIKLQotc291cmNlLXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSBzb3VyY2UtdmF1bHQKLQotYmluYXJ5LXZhdWx0OgotCSQoTUFLRSkgLWYgLi9yZWxlYXNlL0J1aWxkLUEtUmVsZWFzZSBcCi0JCWhvc3Q9JChob3N0X2FsaWFzKSB0YXJnZXQ9JCh0YXJnZXRfYWxpYXMpCi0KLXZhdWx0LWluc3RhbGw6Ci0JQGlmIFsgLWYgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgXSA7IHRoZW4gXAotCSAgLi9yZWxlYXNlL3ZhdWx0LWluc3RhbGwgJChob3N0X2FsaWFzKSAkKHRhcmdldF9hbGlhcykgOyBcCi0JZWxzZSBcCi0JICB0cnVlIDsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC5hbGwKLWluc3RhbGwuYWxsOiBpbnN0YWxsLW5vLWZpeGVkaW5jbHVkZXMKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JCXI9YHB3ZGAgOyBleHBvcnQgciA7IFwKLQkJJChTRVRfTElCX1BBVEgpIFwKLQkJKGNkIC4vZ2NjOyBcCi0JCSQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsLWhlYWRlcnMpIDsgXAotCWVsc2UgXAotCQl0cnVlIDsgXAotCWZpCi0KLSMgaW5ldC1pbnN0YWxsIGlzIHVzZWQgYmVjYXVzZSB0aGUgSSpOZXQgd2FudHMgRGVqYUdOVSBpbnN0YWxsZWQgYnV0Ci0jIG5vdCBidWlsdC4gIFNpbWlsYXJseSwgZ3ppcCBpcyBidWlsdCBidXQgbm90IGluc3RhbGxlZC4KLWluZXQtaW5zdGFsbDoKLQkkKE1BS0UpIElOU1RBTExfTU9EVUxFUz0iYGVjaG8gJChJTlNUQUxMX01PRFVMRVMpIHwgc2VkIC1lICdzL2luc3RhbGwtZGVqYWdudS8vJyAtZSAncy9pbnN0YWxsLWd6aXAvLydgIiBpbnN0YWxsCi0KLSMgaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzIGlzIHVzZWQgYmVjYXVzZSBDeWdudXMgY2FuIG5vdCBkaXN0cmlidXRlCi0jIHRoZSBmaXhlZCBoZWFkZXIgZmlsZXMuCi0uUEhPTlk6IGluc3RhbGwtbm8tZml4ZWRpbmNsdWRlcwotaW5zdGFsbC1uby1maXhlZGluY2x1ZGVzOiBcCi0JaW5zdGFsbGRpcnMgXAotCSQoSU5TVEFMTF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKSBcCi0JJChJTlNUQUxMX1gxMV9NT0RVTEVTKSBcCi0JZ2NjLW5vLWZpeGVkaW5jbHVkZXMgCi0KLSMgSW5zdGFsbCB0aGUgZ2NjIGhlYWRlcnMgZmlsZXMsIGJ1dCBub3QgdGhlIGZpeGVkIGluY2x1ZGUgZmlsZXMsCi0jIHdoaWNoIEN5Z251cyBpcyBub3QgYWxsb3dlZCB0byBkaXN0cmlidXRlLiAgVGhpcyBydWxlIGlzIHZlcnkKLSMgZGVwZW5kZW50IG9uIHRoZSB3b3JraW5ncyBvZiB0aGUgZ2NjIE1ha2VmaWxlLmluLgotLlBIT05ZOiBnY2Mtbm8tZml4ZWRpbmNsdWRlcwotZ2NjLW5vLWZpeGVkaW5jbHVkZXM6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXTsgdGhlbiBcCi0JICBybSAtcmYgZ2NjL3RtcC1pbmNsdWRlOyBcCi0JICBtdiBnY2MvaW5jbHVkZSBnY2MvdG1wLWluY2x1ZGUgMj4vZGV2L251bGw7IFwKLQkgIG1rZGlyIGdjYy9pbmNsdWRlOyBcCi0JICBjcCAkKHNyY2RpcikvZ2NjL2dzeXNsaW1pdHMuaCBnY2MvaW5jbHVkZS9zeXNsaW1pdHMuaDsgXAotCSAgdG91Y2ggZ2NjL3N0bXAtZml4aW5jIGdjYy9pbmNsdWRlL2ZpeGVkOyBcCi0JICBybSAtZiBnY2Mvc3RtcC1oZWFkZXJzIGdjYy9zdG1wLWludC1oZHJzOyBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgIDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgLi9nY2M7IFwKLQkgICAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGluc3RhbGwpOyBcCi0JICBybSAtcmYgZ2NjL2luY2x1ZGU7IFwKLQkgIG12IGdjYy90bXAtaW5jbHVkZSBnY2MvaW5jbHVkZSAyPi9kZXYvbnVsbDsgXAotCWVsc2UgdHJ1ZTsgZmkKLQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLiAgVG8KLSMgYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0jCi0jIGFsbC1ndWksIGFuZCBhbGwtbGlicHJvYyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYmVjYXVzZQotIyB0aGV5IGFyZSBzdGlsbCBleHBlcmltZW50YWwsIGFuZCBpZiB0aGV5IGZhaWwgdG8gYnVpbGQsIHRoYXQKLSMgc2hvdWxkbid0IHN0b3AgIm1ha2UgYWxsIi4KLS5QSE9OWTogJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYwotJChBTExfTU9EVUxFUykgYWxsLWd1aSBhbGwtbGlicHJvYzoKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2FsbC0vLydgOyBcCi0JaWYgWyAtZiAuLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoZXNlIHJ1bGVzIGFyZSB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBjaGVjay1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgY2hlY2suICBTb21lCi0jIG1vZHVsZXMgYXJlIG9ubHkgdGVzdGVkIGluIGEgbmF0aXZlIHRvb2xjaGFpbi4KLQotLlBIT05ZOiAkKENIRUNLX01PRFVMRVMpICQoTkFUSVZFX0NIRUNLX01PRFVMRVMpICQoQ1JPU1NfQ0hFQ0tfTU9EVUxFUykKLSQoTkFUSVZFX0NIRUNLX01PRFVMRVMpOgotCUBpZiBbICIkKGhvc3RfY2Fub25pY2FsKSIgPSAiJCh0YXJnZXRfY2Fub25pY2FsKSIgXSA7IHRoZW4gXAotCSAgZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQkgIGlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICAoY2QgJCR7ZGlyfTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCSAgZWxzZSBcCi0JICAgIHRydWU7IFwKLQkgIGZpOyBcCi0JZmkKLQotJChDUk9TU19DSEVDS19NT0RVTEVTKToKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2NoZWNrLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKElOU1RBTExfTU9EVUxFUykKLSQoSU5TVEFMTF9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBtb2R1bGVzIHdoaWNoIGFyZSBidWlsdCB3aXRoIHRoZQotIyB0YXJnZXQgdG9vbHMuCi0uUEhPTlk6ICQoQ09ORklHVVJFX1RBUkdFVF9NT0RVTEVTKQotJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgJChDQ19GT1JfVEFSR0VUKSAtLXByaW50LW11bHRpLWxpYiA+ICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgMj4gL2Rldi9udWxsOyBcCi0JICBpZiBbIC1zICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS90bXBtdWx0aS5vdXQgXTsgdGhlbiBcCi0JICAgIGlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCBdOyB0aGVuIFwKLQkgICAgICBpZiBjbXAgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vdG1wbXVsdGkub3V0ID4gL2Rldi9udWxsOyB0aGVuIFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dDsgXAotCSAgICAgIGVsc2UgXAotCQllY2hvICJNdWx0aWxpYnMgY2hhbmdlZCBmb3IgJCR7ZGlyfSwgcmVjb25maWd1cmluZyI7IFwKLQkJcm0gLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L211bHRpbGliLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGU7IFwKLQkJbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgICAgZmk7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgbXYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L3RtcG11bHRpLm91dCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vbXVsdGlsaWIub3V0OyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWZpOyBleGl0IDAJIyBicmVhayBjb21tYW5kIGludG8gdHdvIHBpZWNlcwotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY29uZmlndXJlLXRhcmdldC0vLydgOyBcCi0JaWYgWyAhIC1kICQoVEFSR0VUX1NVQkRJUikgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxpZiBlY2hvICIgJChUQVJHRVRfQ09ORklHRElSUykgIiB8IGdyZXAgIiAkJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlmIFsgLWQgJChzcmNkaXIpLyQke2Rpcn0gXTsgdGhlbiBcCi0JICAgIFsgLWQgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9IF0gfHwgbWtkaXIgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9O1wKLQkgICAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgICAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgICBBUj0iJChBUl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUjsgXAotCSAgICBBUz0iJChBU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBBUzsgXAotCSAgICBDQz0iJChDQ19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDQzsgXAotCSAgICBDRkxBR1M9IiQoQ0ZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENGTEFHUzsgXAotCSAgICBDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IENYWDsgXAotCSAgICBDWFhGTEFHUz0iJChDWFhGTEFHU19GT1JfVEFSR0VUKSI7IGV4cG9ydCBDWFhGTEFHUzsgXAotCSAgICBETExUT09MPSIkKERMTFRPT0xfRk9SX1RBUkdFVCkiOyBleHBvcnQgRExMVE9PTDsgXAotCSAgICBMRD0iJChMRF9GT1JfVEFSR0VUKSI7IGV4cG9ydCBMRDsgXAotICAgICAgICAgICAgTERGTEFHUz0iJChMREZMQUdTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IExERkxBR1M7IFwKLQkgICAgTk09IiQoTk1fRk9SX1RBUkdFVCkiOyBleHBvcnQgTk07IFwKLQkgICAgUkFOTElCPSIkKFJBTkxJQl9GT1JfVEFSR0VUKSI7IGV4cG9ydCBSQU5MSUI7IFwKLQkgICAgV0lORFJFUz0iJChXSU5EUkVTX0ZPUl9UQVJHRVQpIjsgZXhwb3J0IFdJTkRSRVM7IFwKLQkgICAgZWNobyBDb25maWd1cmluZyBpbiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07IFwKLQkgICAgY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgIGNhc2UgJChzcmNkaXIpIGluIFwKLQkgICAgLyopIFwKLQkgICAgICB0b3BkaXI9JChzcmNkaXIpIDs7IFwKLQkgICAgKikgXAotCSAgICAgIGNhc2UgIiQoVEFSR0VUX1NVQkRJUikiIGluIFwKLQkgICAgICAuKSB0b3BkaXI9Ii4uLyQoc3JjZGlyKSIgOzsgXAotCSAgICAgICopIHRvcGRpcj0iLi4vLi4vJChzcmNkaXIpIiA7OyBcCi0JICAgICAgZXNhYyA7OyBcCi0JICAgIGVzYWM7IFwKLQkgICAgaWYgWyAiJChzcmNkaXIpIiA9ICIuIiBdIDsgdGhlbiBcCi0JICAgICAgaWYgWyAiJChUQVJHRVRfU1VCRElSKSIgIT0gIi4iIF0gOyB0aGVuIFwKLQkJaWYgJChTSEVMTCkgJCRzL3N5bWxpbmstdHJlZSAkJHt0b3BkaXJ9LyQke2Rpcn0gIm5vLXN1Y2gtZmlsZSIgOyB0aGVuIFwKLQkJICBpZiBbIC1mIE1ha2VmaWxlIF07IHRoZW4gXAotCQkgICAgaWYgJChNQUtFKSBkaXN0Y2xlYW47IHRoZW4gXAotCQkgICAgICB0cnVlOyBcCi0JCSAgICBlbHNlIFwKLQkJICAgICAgZXhpdCAxOyBcCi0JCSAgICBmaTsgXAotCQkgIGVsc2UgXAotCQkgICAgdHJ1ZTsgXAotCQkgIGZpOyBcCi0JCWVsc2UgXAotCQkgIGV4aXQgMTsgXAotCQlmaTsgXAotCSAgICAgIGVsc2UgXAotCQl0cnVlOyBcCi0JICAgICAgZmk7IFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPS4iOyBcCi0JICAgICAgbGlic3JjZGlyPSIuIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSQke3RvcGRpcn0vJCR7ZGlyfSI7IFwKLQkgICAgICBsaWJzcmNkaXI9IiQkcy8kJHtkaXJ9IjsgXAotCSAgICBmaTsgXAotCSAgICBpZiBbIC1mICQke2xpYnNyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHtsaWJzcmNkaXJ9L2NvbmZpZ3VyZSBcCi0JCSQoQ09ORklHX0FSR1VNRU5UUykgJCR7c3JjZGlyb3B0aW9ufSBcCi0JCS0td2l0aC10YXJnZXQtc3ViZGlyPSIkKFRBUkdFVF9TVUJESVIpIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICBybSAtZiBuby1zdWNoLWZpbGUgc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIENPTkZJR19TSVRFPW5vLXN1Y2gtZmlsZSAkKFNIRUxMKSAkJHMvY29uZmlndXJlIFwKLQkJJChDT05GSUdfQVJHVU1FTlRTKSAkJHtzcmNkaXJvcHRpb259IFwKLQkJLS13aXRoLXRhcmdldC1zdWJkaXI9IiQoVEFSR0VUX1NVQkRJUikiOyBcCi0JICAgIGZpOyBcCi0JICAgIGlmIFsgLWYgc2tpcC10aGlzLWRpciBdIDsgdGhlbiBcCi0JICAgICAgc2ggc2tpcC10aGlzLWRpcjsgXAotCSAgICAgIHJtIC1mIHNraXAtdGhpcy1kaXI7IFwKLQkgICAgICBjZCAuLjsgcm1kaXIgJCR7ZGlyfSB8fCB0cnVlOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIHRydWU7IFwKLQkgICAgZmk7IFwKLQkgIGVsc2UgXAotCSAgICB0cnVlOyBcCi0JICBmaTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gYnVpbGQgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBhbGwtWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChBTExfVEFSR0VUX01PRFVMRVMpCi0kKEFMTF9UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9hbGwtdGFyZ2V0LS8vJ2A7IFwKLQlpZiBbIC1mICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn07ICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgVGhpcyBydWxlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIG1vZHVsZXMgd2hpY2ggdXNlIFRBUkdFVF9GTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiAkKENIRUNLX1RBUkdFVF9NT0RVTEVTKQotJChDSEVDS19UQVJHRVRfTU9EVUxFUyk6Ci0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9jaGVjay10YXJnZXQtLy8nYDsgXAotCWlmIFsgLWYgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQoVEFSR0VUX1NVQkRJUikvJCR7ZGlyfTskKE1BS0UpICQoVEFSR0VUX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTtcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZQotIyBUQVJHRVRfRkxBR1NfVE9fUEFTUy4gIFRvIGJ1aWxkIGEgdGFyZ2V0IGluc3RhbGwtWCBtZWFucyB0byBjZCB0byBYCi0jIGFuZCBtYWtlIGluc3RhbGwuCi0uUEhPTlk6ICQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUykKLSQoSU5TVEFMTF9UQVJHRVRfTU9EVUxFUyk6IGluc3RhbGxkaXJzCi0JQGRpcj1gZWNobyAkQCB8IHNlZCAtZSAncy9pbnN0YWxsLXRhcmdldC0vLydgOyBcCi0JaWYgWyAtZiAkKFRBUkdFVF9TVUJESVIpLyQke2Rpcn0vTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgJChUQVJHRVRfU1VCRElSKS8kJHtkaXJ9OyBcCi0JICAgICQoTUFLRSkgJChUQVJHRVRfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgYWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBhbGwuCi0uUEhPTlk6ICQoQUxMX1gxMV9NT0RVTEVTKQotJChBTExfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvYWxsLS8vJ2A7IFwKLQlpZiBbIC1mIC4vJCR7ZGlyfS9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCAkJHtkaXJ9OyBcCi0JICAgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoWDExX0ZMQUdTX1RPX1BBU1MpIGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIFRoaXMgcnVsZSBpcyB1c2VkIHRvIGNoZWNrIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgY2hlY2stWCBtZWFucyB0byBjZCB0byBYIGFuZCBtYWtlIGFsbC4KLS5QSE9OWTogJChDSEVDS19YMTFfTU9EVUxFUykKLSQoQ0hFQ0tfWDExX01PRFVMRVMpOgotCUBkaXI9YGVjaG8gJEAgfCBzZWQgLWUgJ3MvY2hlY2stLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgY2hlY2spOyBcCi0JZWxzZSBcCi0JICB0cnVlOyBcCi0JZmkKLQotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBYMTFfRkxBR1NfVE9fUEFTUy4KLSMgVG8gYnVpbGQgYSB0YXJnZXQgaW5zdGFsbC1YIG1lYW5zIHRvIGNkIHRvIFggYW5kIG1ha2UgaW5zdGFsbC4KLS5QSE9OWTogJChJTlNUQUxMX1gxMV9NT0RVTEVTKQotJChJTlNUQUxMX1gxMV9NT0RVTEVTKTogaW5zdGFsbGRpcnMKLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07IFwKLQkgICAkKE1BS0UpICQoRkxBR1NfVE9fUEFTUykgJChYMTFfRkxBR1NfVE9fUEFTUykgaW5zdGFsbCk7IFwKLQllbHNlIFwKLQkgIHRydWU7IFwKLQlmaQotCi0jIGdjYyBpcyB0aGUgb25seSBtb2R1bGUgd2hpY2ggdXNlcyBHQ0NfRkxBR1NfVE9fUEFTUy4KLS5QSE9OWTogYWxsLWdjYwotYWxsLWdjYzoKLQlAaWYgWyAtZiAuL2djYy9NYWtlZmlsZSBdIDsgdGhlbiBcCi0JICByPWBwd2RgOyBleHBvcnQgcjsgXAotCSAgcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSAgJChTRVRfTElCX1BBVEgpIFwKLQkgIChjZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgYWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLSMgQnVpbGRpbmcgR0NDIHVzZXMgc29tZSB0b29scyBmb3IgcmVidWlsZGluZyAic291cmNlIiBmaWxlcwotIyBsaWtlIHRleGluZm8sIGJpc29uL2J5YWNjLCBldGMuICBTbyB3ZSBtdXN0IGRlcGVuZCBvbiB0aG9zZS4KLSMKLSMgV2hpbGUgYnVpbGRpbmcgR0NDLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHJ1biB2YXJpb3VzIHRhcmdldAotIyBwcm9ncmFtcyBsaWtlIHRoZSBhc3NlbWJsZXIsIGxpbmtlciwgZXRjLiAgU28gd2UgZGVwZW5kIG9uCi0jIHRob3NlIHRvby4KLSMKLSMgSW4gdGhlb3J5LCBvbiBhbiBTTVAgYWxsIHRob3NlIGRlcGVuZGVuY2llcyBjYW4gYmUgcmVzb2x2ZWQKLSMgaW4gcGFyYWxsZWwuCi0jCi0uUEhPTlk6IGJvb3RzdHJhcCBib290c3RyYXAtbGVhbiBib290c3RyYXAyIGJvb3RzdHJhcDItbGVhbiBib290c3RyYXAzIGJvb3RzdHJhcDMtbGVhbiBib290c3RyYXA0IGJvb3RzdHJhcDQtbGVhbgotYm9vdHN0cmFwIGJvb3RzdHJhcC1sZWFuIGJvb3RzdHJhcDIgYm9vdHN0cmFwMi1sZWFuIGJvb3RzdHJhcDMgYm9vdHN0cmFwMy1sZWFuIGJvb3RzdHJhcDQgYm9vdHN0cmFwNC1sZWFuOiBhbGwtdGV4aW5mbyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1iaW51dGlscyBhbGwtZ2FzIGFsbC1sZAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkkKFNFVF9MSUJfUEFUSCkgXAotCWVjaG8gIkJvb3RzdHJhcHBpbmcgdGhlIGNvbXBpbGVyIjsgXAotCWNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSAkQAotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQljYXNlICIkQCIgaW4gXAotCSAgKmJvb3RzdHJhcDQtbGVhbiApIFwKLQkJCW1zZz0iQ29tcGFyaW5nIHN0YWdlMyBhbmQgc3RhZ2U0IG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlMy1sZWFuIDs7IFwKLQkgICpib290c3RyYXA0ICkgbXNnPSJDb21wYXJpbmcgc3RhZ2UzIGFuZCBzdGFnZTQgb2YgdGhlIGNvbXBpbGVyIjsgXAotCSAgCQljb21wYXJlPWNvbXBhcmUzIDs7IFwKLQkgICotbGVhbiApCW1zZz0iQ29tcGFyaW5nIHN0YWdlMiBhbmQgc3RhZ2UzIG9mIHRoZSBjb21waWxlciI7IFwKLQkgIAkJY29tcGFyZT1jb21wYXJlLWxlYW4gOzsgXAotCSAgKiApCQltc2c9IkNvbXBhcmluZyBzdGFnZTIgYW5kIHN0YWdlMyBvZiB0aGUgY29tcGlsZXIiOyBcCi0JICAJCWNvbXBhcmU9Y29tcGFyZSA7OyBcCi0JZXNhYzsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiJCRtc2ciOyBcCi0JY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpICQkY29tcGFyZQotCUByPWBwd2RgOyBleHBvcnQgcjsgXAotCXM9YGNkICQoc3JjZGlyKTsgcHdkYCA7IGV4cG9ydCBzOyBcCi0JJChTRVRfTElCX1BBVEgpIFwKLQllY2hvICJCdWlsZGluZyBydW50aW1lIGxpYnJhcmllcyI7IFwKLQkkKE1BS0UpICQoQkFTRV9GTEFHU19UT19QQVNTKSBhbGwKLQotLlBIT05ZOiBjcm9zcwotY3Jvc3M6IGFsbC10ZXhpbmZvIGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWJpbnV0aWxzIGFsbC1nYXMgYWxsLWxkCi0JQHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0Jcz1gY2QgJChzcmNkaXIpOyBwd2RgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgdGhlIEMgYW5kIEMrKyBjb21waWxlciI7IFwKLQljZCBnY2M7ICQoTUFLRSkgJChHQ0NfRkxBR1NfVE9fUEFTUykgTEFOR1VBR0VTPSJjIGMrKyIKLQlAcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQlzPWBjZCAkKHNyY2Rpcik7IHB3ZGAgOyBleHBvcnQgczsgXAotCSQoU0VUX0xJQl9QQVRIKSBcCi0JZWNobyAiQnVpbGRpbmcgcnVudGltZSBsaWJyYXJpZXMiOyBcCi0JJChNQUtFKSAkKEJBU0VfRkxBR1NfVE9fUEFTUykgYWxsIExBTkdVQUdFUz0iYyBjKysiCi0KLS5QSE9OWTogY2hlY2stZ2NjCi1jaGVjay1nY2M6Ci0JQGlmIFsgLWYgLi9nY2MvTWFrZWZpbGUgXSA7IHRoZW4gXAotCSAgcj1gcHdkYDsgZXhwb3J0IHI7IFwKLQkgIHM9YGNkICQoc3JjZGlyKTsgcHdkYDsgZXhwb3J0IHM7IFwKLQkgICQoU0VUX0xJQl9QQVRIKSBcCi0JICAoY2QgZ2NjOyAkKE1BS0UpICQoR0NDX0ZMQUdTX1RPX1BBU1MpIGNoZWNrKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MKLWluc3RhbGwtZ2NjOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLS5QSE9OWTogaW5zdGFsbC1nY2MtY3Jvc3MKLWluc3RhbGwtZ2NjLWNyb3NzOgotCUBpZiBbIC1mIC4vZ2NjL01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkIGdjYzsgJChNQUtFKSAkKEdDQ19GTEFHU19UT19QQVNTKSBMQU5HVUFHRVM9ImMgYysrIiBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0jIEVYUEVSSU1FTlRBTCBTVFVGRgotIyBUaGlzIHJ1bGUgaXMgdXNlZCB0byBpbnN0YWxsIHRoZSBtb2R1bGVzIHdoaWNoIHVzZSBGTEFHU19UT19QQVNTLgotIyBUbyBidWlsZCBhIHRhcmdldCBpbnN0YWxsLVggbWVhbnMgdG8gY2QgdG8gWCBhbmQgbWFrZSBpbnN0YWxsLgotLlBIT05ZOiBpbnN0YWxsLWRvc3JlbAotaW5zdGFsbC1kb3NyZWw6IGluc3RhbGxkaXJzIGluZm8KLQlAZGlyPWBlY2hvICRAIHwgc2VkIC1lICdzL2luc3RhbGwtLy8nYDsgXAotCWlmIFsgLWYgLi8kJHtkaXJ9L01ha2VmaWxlIF0gOyB0aGVuIFwKLQkgIHI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JICBzPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IGV4cG9ydCBzOyBcCi0JICAkKFNFVF9MSUJfUEFUSCkgXAotCSAgKGNkICQke2Rpcn07ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBpbnN0YWxsKTsgXAotCWVsc2UgXAotCSAgdHJ1ZTsgXAotCWZpCi0KLWluc3RhbGwtZG9zcmVsLWZha2U6Ci0KLQotIyBUaGlzIGlzIGEgbGlzdCBvZiBpbnRlci1kZXBlbmRlbmNpZXMgYW1vbmcgbW9kdWxlcy4KLWFsbC1hcGFjaGU6Ci1hbGwtYXNoOgotYWxsLWF1dG9jb25mOiBhbGwtbTQgYWxsLXRleGluZm8KLWFsbC1hdXRvbWFrZTogYWxsLW00IGFsbC10ZXhpbmZvCi1hbGwtYmFzaDoKLWFsbC1iZmQ6IGFsbC1saWJpYmVydHkgYWxsLWludGwKLWFsbC1iaW51dGlsczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1mbGV4IGFsbC1iaXNvbiBhbGwtYnlhY2MgYWxsLWludGwKLWFsbC1iaXNvbjogYWxsLXRleGluZm8KLWNvbmZpZ3VyZS10YXJnZXQtYnNwOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWJzcDogY29uZmlndXJlLXRhcmdldC1ic3AgYWxsLWdjYyBhbGwtYmludXRpbHMgYWxsLXRhcmdldC1uZXdsaWIKLWFsbC1ieWFjYzoKLWFsbC1iemlwMjoKLWFsbC1jdnNzcmM6Ci1jb25maWd1cmUtdGFyZ2V0LWN5Z21vbjogJChBTExfR0NDKQotYWxsLXRhcmdldC1jeWdtb246IGNvbmZpZ3VyZS10YXJnZXQtY3lnbW9uIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbyBhbGwtdGFyZ2V0LWxpYnN0dWIgYWxsLXRhcmdldC1ic3AKLWFsbC1kYjoKLWFsbC1kZWphZ251OiBhbGwtdGNsIGFsbC1leHBlY3QgYWxsLXRrCi1hbGwtZGlmZjogYWxsLWxpYmliZXJ0eQotYWxsLWVtYWNzOgotYWxsLWVtYWNzMTk6IGFsbC1iaXNvbiBhbGwtYnlhY2MKLWFsbC1ldGM6Ci1jb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWV4YW1wbGVzOiBjb25maWd1cmUtdGFyZ2V0LWV4YW1wbGVzCi1hbGwtZXhwZWN0OiBhbGwtdGNsIGFsbC10awotYWxsLWZpbGV1dGlsczogYWxsLWxpYmliZXJ0eQotYWxsLWZpbmR1dGlsczoKLWFsbC1maW5kOgotYWxsLWZsZXg6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYwotYWxsLWdhczogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1pbnRsCi1hbGwtZ2FzaDogYWxsLXRjbAotYWxsLWdhd2s6Ci1BTExfR0NDID0gYWxsLWdjYwotYWxsLWdjYzogYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLWFsbC1ib290c3RyYXA6IGFsbC1saWJpYmVydHkgYWxsLWJpc29uIGFsbC1ieWFjYyBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtbGQKLUdEQl9USyA9IGFsbC10ayBhbGwtdGNsIGFsbC1pdGNsIGFsbC10aXggYWxsLWxpYmd1aQotYWxsLWdkYjogYWxsLWxpYmliZXJ0eSBhbGwtb3Bjb2RlcyBhbGwtYmZkIGFsbC1tbWFsbG9jIGFsbC1yZWFkbGluZSBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1zaW0gJChnZGJubG1yZXF1aXJlbWVudHMpICQoR0RCX1RLKQotYWxsLWdldHRleHQ6Ci1hbGwtZ251c2VydjoKLWNvbmZpZ3VyZS10YXJnZXQtZ3BlcmY6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtZ3BlcmY6IGNvbmZpZ3VyZS10YXJnZXQtZ3BlcmYgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1saWJzdGRjKysKLWFsbC1ncHJvZjogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1pbnRsCi1hbGwtZ3JlejogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzCi1hbGwtZ3VpOiBhbGwtZ2RiIGFsbC1saWJwcm9jIGFsbC10YXJnZXQtbGlicngKLWFsbC1ndWlsZToKLWFsbC1nemlwOiBhbGwtbGliaWJlcnR5Ci1hbGwtaGVsbG86IGFsbC1saWJpYmVydHkKLWFsbC1pbmRlbnQ6Ci1hbGwtaW5ldDogYWxsLXRjbCBhbGwtc2VuZC1wciBhbGwtcGVybAotYWxsLWludGw6Ci1hbGwtaXNwZWxsOiBhbGwtZW1hY3MxOQotYWxsLWl0Y2w6IGFsbC10Y2wgYWxsLXRrIGFsbC10Y2w4LjEgYWxsLXRrOC4xCi1hbGwtbGQ6IGFsbC1saWJpYmVydHkgYWxsLWJmZCBhbGwtb3Bjb2RlcyBhbGwtYmlzb24gYWxsLWJ5YWNjIGFsbC1mbGV4IGFsbC1pbnRsCi1jb25maWd1cmUtdGFyZ2V0LWxpYmcrKzogJChBTExfR0NDKSBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1hbGwtdGFyZ2V0LWxpYmcrKzogY29uZmlndXJlLXRhcmdldC1saWJnKysgYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmlvIGFsbC10YXJnZXQtbGlicnggYWxsLXRhcmdldC1saWJzdGRjKysKLWNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3M6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliZ2xvc3M6IGNvbmZpZ3VyZS10YXJnZXQtbGliZ2xvc3MgY29uZmlndXJlLXRhcmdldC1uZXdsaWIKLWNvbmZpZ3VyZS10YXJnZXQtbGliaW86ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaW86IGNvbmZpZ3VyZS10YXJnZXQtbGliaW8gYWxsLWdhcyBhbGwtbGQgYWxsLWdjYyBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LW5ld2xpYgotY2hlY2stdGFyZ2V0LWxpYmlvOiBhbGwtdGFyZ2V0LWxpYnN0ZGMrKwotYWxsLWxpYmd1aTogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEgYWxsLWl0Y2wKLWFsbC1saWJpYmVydHk6Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnJ4OiAkKEFMTF9HQ0MpIGNvbmZpZ3VyZS10YXJnZXQtbmV3bGliCi1hbGwtdGFyZ2V0LWxpYnJ4OiBjb25maWd1cmUtdGFyZ2V0LWxpYnJ4Ci1jb25maWd1cmUtdGFyZ2V0LWxpYnN0ZGMrKzogJChBTExfR0NDKQotYWxsLXRhcmdldC1saWJzdGRjKys6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3RkYysrIGFsbC1nYXMgYWxsLWxkIGFsbC1nY2MgYWxsLXRhcmdldC1saWJpYmVydHkgYWxsLXRhcmdldC1uZXdsaWIgYWxsLXRhcmdldC1saWJpbwotY29uZmlndXJlLXRhcmdldC1saWJzdHViOiAkKEFMTF9HQ0MpCi1hbGwtdGFyZ2V0LWxpYnN0dWI6IGNvbmZpZ3VyZS10YXJnZXQtbGlic3R1YgotYWxsLWxpYnRvb2w6Ci1hbGwtbTQ6IGFsbC1saWJpYmVydHkKLWFsbC1tYWtlOiBhbGwtbGliaWJlcnR5Ci1hbGwtbW1hbGxvYzoKLWNvbmZpZ3VyZS10YXJnZXQtbmV3bGliOiAkKEFMTF9HQ0MpCi1jb25maWd1cmUtdGFyZ2V0LWxpYnRlcm1jYXA6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbmV3bGliOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYiBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtdGFyZ2V0LWxpYnRlcm1jYXA6IGNvbmZpZ3VyZS10YXJnZXQtbGlidGVybWNhcCBhbGwtYmludXRpbHMgYWxsLWdhcyBhbGwtZ2NjCi1hbGwtb3Bjb2RlczogYWxsLWJmZCBhbGwtbGliaWJlcnR5Ci1hbGwtcGF0Y2g6IGFsbC1saWJpYmVydHkKLWFsbC1wZXJsOgotYWxsLXBybXM6IGFsbC1saWJpYmVydHkKLWFsbC1yY3M6Ci1hbGwtcmVhZGxpbmU6Ci1hbGwtcmVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VkOiBhbGwtbGliaWJlcnR5Ci1hbGwtc2VuZC1wcjogYWxsLXBybXMKLWFsbC1zaGVsbHV0aWxzOgotYWxsLXNpbTogYWxsLWxpYmliZXJ0eSBhbGwtYmZkIGFsbC1vcGNvZGVzIGFsbC1yZWFkbGluZQotYWxsLXRhcjogYWxsLWxpYmliZXJ0eQotYWxsLXRjbDoKLWFsbC10Y2w4LjE6Ci1hbGwtdGNsWDogYWxsLXRjbCBhbGwtdGsKLWFsbC10azogYWxsLXRjbAotYWxsLXRrOC4xOiBhbGwtdGNsOC4xCi1hbGwtdGV4aW5mbzogYWxsLWxpYmliZXJ0eQotYWxsLXRleHR1dGlsczoKLWFsbC10Z2FzOiBhbGwtbGliaWJlcnR5IGFsbC1iZmQgYWxsLW9wY29kZXMKLWFsbC10aW1lOgotYWxsLXRpeDogYWxsLXRjbCBhbGwtdGsgYWxsLXRjbDguMSBhbGwtdGs4LjEKLWFsbC13ZGlmZjoKLWFsbC10YXJnZXQtd2luc3VwOiBhbGwtdGFyZ2V0LW5ld2xpYiBhbGwtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtdGFyZ2V0LWxpYnRlcm1jYXAgY29uZmlndXJlLXRhcmdldC13aW5zdXAKLWNvbmZpZ3VyZS10YXJnZXQtd2luc3VwOiBjb25maWd1cmUtdGFyZ2V0LW5ld2xpYgotYWxsLXV1ZGVjb2RlOiBhbGwtbGliaWJlcnR5Ci1hbGwtemlwOgotY29uZmlndXJlLXRhcmdldC1saWJpYmVydHk6ICQoQUxMX0dDQykKLWFsbC10YXJnZXQtbGliaWJlcnR5OiBjb25maWd1cmUtdGFyZ2V0LWxpYmliZXJ0eSBhbGwtZ2NjIGFsbC1sZCBhbGwtdGFyZ2V0LW5ld2xpYgotYWxsLXRhcmdldDogJChBTExfVEFSR0VUX01PRFVMRVMpCi1pbnN0YWxsLXRhcmdldDogJChJTlNUQUxMX1RBUkdFVF9NT0RVTEVTKQotIyMjIG90aGVyIHN1cHBvcnRpbmcgdGFyZ2V0cwotCi1NQUtFRElSUz0gXAotCSQocHJlZml4KSBcCi0JJChleGVjX3ByZWZpeCkKLS5QSE9OWTogaW5zdGFsbGRpcnMKLWluc3RhbGxkaXJzOiBta2luc3RhbGxkaXJzCi0JJChTSEVMTCkgJChzcmNkaXIpL21raW5zdGFsbGRpcnMgJChNQUtFRElSUykKLQotZGlyLmluZm86IGRvLWluc3RhbGwtaW5mbwotCWlmIFsgLWYgJChzcmNkaXIpL3RleGluZm8vZ2VuLWluZm8tZGlyIF0gOyB0aGVuIFwKLQkgICQoc3JjZGlyKS90ZXhpbmZvL2dlbi1pbmZvLWRpciAkKGluZm9kaXIpICQoc3JjZGlyKS90ZXhpbmZvL2Rpci5pbmZvLXRlbXBsYXRlID4gZGlyLmluZm8ubmV3IDsgXAotCSAgbXYgLWYgZGlyLmluZm8ubmV3IGRpci5pbmZvIDsgXAotCWVsc2UgdHJ1ZSA7IFwKLQlmaQotCi1kaXN0OgotCUBlY2hvICJCdWlsZGluZyBhIGZ1bGwgZGlzdHJpYnV0aW9uIG9mIHRoaXMgdHJlZSBpc24ndCBkb25lIgotCUBlY2hvICJ2aWEgJ21ha2UgZGlzdCcuICBDaGVjayBvdXQgdGhlIGV0Yy8gc3ViZGlyZWN0b3J5IiAKLQotZXRhZ3MgdGFnczogVEFHUwotCi0jIFJpZ2h0IG5vdyB0aGlzIGp1c3QgYnVpbGRzIFRBR1MgaW4gZWFjaCBzdWJkaXJlY3RvcnkuICBlbWFjczE5IGhhcyB0aGUKLSMgYWJpbGl0eSB0byB1c2Ugc2V2ZXJhbCB0YWdzIGZpbGVzIGF0IG9uY2UsIHNvIHRoZXJlIGlzIHByb2JhYmx5IG5vIG5lZWQKLSMgdG8gY29tYmluZSB0aGVtIGludG8gb25lIGJpZyBUQUdTIGZpbGUgKGxpa2UgQ1ZTIDEuMyBkb2VzKS4gIFdlIGNvdWxkCi0jIChpZiB3ZSBmZWx0IGxpa2UgaXQpIGhhdmUgdGhpcyBNYWtlZmlsZSB3cml0ZSBhIHBpZWNlIG9mIGVsaXNwIHdoaWNoCi0jIHRoZSB1c2VyIGNvdWxkIGxvYWQgdG8gdGVsbCBlbWFjczE5IHdoZXJlIGFsbCB0aGUgVEFHUyBmaWxlcyB3ZSBqdXN0Ci0jIGJ1aWx0IGFyZS4KLVRBR1M6IGRvLVRBR1MKLQotIyB3aXRoIHRoZSBnbnUgbWFrZSwgdGhpcyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCi0KLU1ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWd1cmUuaW4gJChob3N0X21ha2VmaWxlX2ZyYWcpICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpICQoZ2NjX3ZlcnNpb25fdHJpZ2dlcikKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIwotIyBTdXBwb3J0IGZvciBidWlsZGluZyBuZXQgcmVsZWFzZXMKLQotIyBGaWxlcyBpbiBkZXZvIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1ERVZPX1NVUFBPUlQ9IFJFQURNRSBNYWtlZmlsZS5pbiBjb25maWd1cmUgY29uZmlndXJlLmluIFwKLQljb25maWcuZ3Vlc3MgY29uZmlnLmlmIGNvbmZpZy5zdWIgY29uZmlnIG1vdmUtaWYtY2hhbmdlIFwKLQltcHctUkVBRE1FIG1wdy1idWlsZC5pbiBtcHctY29uZmlnLmluIG1wdy1jb25maWd1cmUgbXB3LWluc3RhbGwgXAotCUNPUFlJTkcgQ09QWUlORy5MSUIgaW5zdGFsbC1zaCBjb25maWctbWwuaW4gc3ltbGluay10cmVlIFwKLQlta2luc3RhbGxkaXJzIGx0Y29uZmlnIGx0bWFpbi5zaCBtaXNzaW5nIHlsd3JhcAotCi0jIEZpbGVzIGluIGRldm8vZXRjIHVzZWQgaW4gYW55IG5ldCByZWxlYXNlLgotIyBDaGFuZ2VMb2cgb21pdHRlZCBiZWNhdXNlIGl0IG1heSByZWZlciB0byBmaWxlcyB3aGljaCBhcmUgbm90IGluIHRoaXMKLSMgZGlzdHJpYnV0aW9uIChwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byBpbmNsdWRlIGl0IGFueXdheSkuCi1FVENfU1VQUE9SVD0gTWFrZWZpbGUuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBzdGFuZGFyZHMudGV4aSBcCi0JbWFrZS1zdGRzLnRleGkgc3RhbmRhcmRzLmluZm8qCi0KLSMgV2hlbiB5b3UgdXNlIGBtYWtlIHNldHVwLWRpcnMnIG9yIGBtYWtlIHRheicgeW91IHNob3VsZCBhbHdheXMgcmVkZWZpbmUKLSMgdGhpcyBtYWNyby4KLVNVUFBPUlRfRklMRVMgPSBsaXN0LW9mLXN1cHBvcnQtZmlsZXMtZm9yLXRvb2wtaW4tcXVlc3Rpb24KLQotLlBIT05ZOiB0YXoKLQotdGF6OiAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSB0ZXhpbmZvL3RleGluZm8udGV4Ci0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gYSBmZXcgcGxhY2VzLgotCXNlZCAtZSAnL15hbGxcLm5vcm1hbDogL3MvXGFsbC10ZXhpbmZvIC8vJyBcCi0JICAgIC1lICcvXglpbnN0YWxsLXRleGluZm8gL2QnIFwKLQk8TWFrZWZpbGUuaW4gPnRtcAotCW12IC1mIHRtcCBNYWtlZmlsZS5pbgotCSMKLQkuL2NvbmZpZ3VyZSBzdW40Ci0JWyAteiAiJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIiBdIFwKLQkgIHx8ICQoTUFLRSkgJChDT05GSUdVUkVfVEFSR0VUX01PRFVMRVMpIEFMTF9HQ0M9IiIgXAotCSAgICBDQ19GT1JfVEFSR0VUPSIkKENDKSIgQ1hYX0ZPUl9UQVJHRVQ9IiQoQ1hYKSIKLQkjIE1ha2UgbGlua3MsIGFuZCBydW4gIm1ha2UgZGlzdHN0dWZmIiBvciAibWFrZSBpbmZvIiB3aGVuIG5lZWRlZC4KLQlybSAtcmYgcHJvdG8tdG9wbGV2IDsgbWtkaXIgcHJvdG8tdG9wbGV2Ci0Jc2V0IC1lIDsgZGlycz0iJChUT09MKSAkKERFVk9fU1VQUE9SVCkgJChTVVBQT1JUX0ZJTEVTKSIgOyBcCi0JZm9yIGQgaW4gJCRkaXJzIDsgZG8gXAotCSAgaWYgWyAtZCAkJGQgXTsgdGhlbiBcCi0JICAgIGlmIFsgISAtZiAkJGQvTWFrZWZpbGUgXSA7IHRoZW4gdHJ1ZSA7IFwKLQkgICAgZWxpZiBncmVwICdeZGlzdHN0dWZmOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkJKGNkICQkZCA7ICQoTUFLRSkgZGlzdHN0dWZmICkgfHwgZXhpdCAxIDsgXAotCSAgICBlbGlmIGdyZXAgJ15pbmZvOicgJCRkL01ha2VmaWxlID4vZGV2L251bGwgOyB0aGVuIFwKLQkgICAgICAgIChjZCAkJGQgOyAkKE1BS0UpIGluZm8gKSB8fCBleGl0IDEgOyBcCi0JICAgIGZpIDsgXAotCSAgICBpZiBbIC1kICQkZC9wcm90by0kJGQuZGlyIF07IHRoZW4gXAotCSAgICAgIGxuIC1zIC4uLyQkZC9wcm90by0kJGQuZGlyIHByb3RvLXRvcGxldi8kJGQgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGxuIC1zIC4uLyQkZCBwcm90by10b3BsZXYvJCRkIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgbG4gLXMgLi4vJCRkIHByb3RvLXRvcGxldi8kJGQgOyBmaSA7IFwKLQlkb25lCi0JY2QgZXRjIDsgJChNQUtFKSBpbmZvCi0JJChNQUtFKSBkaXN0Y2xlYW4KLQkjCi0JbWtkaXIgcHJvdG8tdG9wbGV2L2V0YwotCShjZCBwcm90by10b3BsZXYvZXRjOyBcCi0JIGZvciBpIGluICQoRVRDX1NVUFBPUlQpOyBkbyBcCi0JCWxuIC1zIC4uLy4uL2V0Yy8kJGkgLiA7IFwKLQkgZG9uZSkKLQkjCi0JIyBUYWtlIG91dCB0ZXhpbmZvIGZyb20gY29uZmlndXJhYmxlIGRpcnMKLQlybSBwcm90by10b3BsZXYvY29uZmlndXJlLmluCi0Jc2VkIC1lICcvXmhvc3RfdG9vbHM9L3MvdGV4aW5mbyAvLycgXAotCSAgICA8Y29uZmlndXJlLmluID5wcm90by10b3BsZXYvY29uZmlndXJlLmluCi0JIwotCW1rZGlyIHByb3RvLXRvcGxldi90ZXhpbmZvCi0JbG4gLXMgLi4vLi4vdGV4aW5mby90ZXhpbmZvLnRleAkJcHJvdG8tdG9wbGV2L3RleGluZm8vCi0JaWYgdGVzdCAtciB0ZXhpbmZvL3V0aWwvdGV4M3BhdGNoIDsgdGhlbiBcCi0JICBta2RpciBwcm90by10b3BsZXYvdGV4aW5mby91dGlsICYmIFwKLQkgIGxuIC1zIC4uLy4uLy4uL3RleGluZm8vdXRpbC90ZXgzcGF0Y2gJcHJvdG8tdG9wbGV2L3RleGluZm8vdXRpbCA7IFwKLQllbHNlIHRydWU7IGZpCi0JY2htb2QgLVIgb2c9dSAuIHx8IGNobW9kIG9nPXUgYGZpbmQgLiAtcHJpbnRgCi0JaWYgZ3JlcCBBTV9JTklUX0FVVE9NQUtFICQoVE9PTCkvY29uZmlndXJlLmluID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICB2ZXI9YHNlZCA8ICQoVE9PTCkvY29uZmlndXJlLmluIC1uICdzL0FNX0lOSVRfQVVUT01BS0VbXixdKiwgKlwoW14pXSpcKSkvXDEvcCdgOyBcCi0JZWxzZSBcCi0JICB2ZXI9YHNlZCA8JChUT09MKS9NYWtlZmlsZS5pbiAtbiAncy9eVkVSU0lPTiAqPSAqLy9wJ2A7IFwKLQlmaTsgXAotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gZG8tdGFyLWJ6MiBUT09MPSQoVE9PTCkgVkVSPSQkdmVyCi0KLWRvLXRhci1iejI6Ci0JZWNobyAiPT0+IE1ha2luZyAkKFRPT0wpLSQoVkVSKS50YXIuYnoyIgotCS1ybSAtZiAkKFRPT0wpLSQoVkVSKQotCWxuIC1zIHByb3RvLXRvcGxldiAkKFRPT0wpLSQoVkVSKQotCXRhciBjZmggJChUT09MKS0kKFZFUikudGFyICQoVE9PTCktJChWRVIpCi0JJChCWklQUFJPRykgLXYgLTkgJChUT09MKS0kKFZFUikudGFyCi0KLVRFWElORk9fU1VQUE9SVD0gdGV4aW5mby90ZXhpbmZvLnRleAotRElTVF9TVVBQT1JUPSAkKERFVk9fU1VQUE9SVCkgJChURVhJTkZPX1NVUFBPUlQpCi0KLS5QSE9OWTogZ2FzLnRhci5iejIKLUdBU19TVVBQT1JUX0RJUlM9IGJmZCBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcwotZ2FzLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKEdBU19TVVBQT1JUX0RJUlMpIGdhcwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z2FzIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChHQVNfU1VQUE9SVF9ESVJTKSIKLQotIyBUaGUgRlNGICJiaW51dGlscyIgcmVsZWFzZSBpbmNsdWRlcyBncHJvZiBhbmQgbGQuCi0uUEhPTlk6IGJpbnV0aWxzLnRhci5iejIKLUJJTlVUSUxTX1NVUFBPUlRfRElSUz0gYmZkIGdhcyBpbmNsdWRlIGxpYmliZXJ0eSBvcGNvZGVzIGxkIGdwcm9mIGludGwgc2V0dXAuY29tIG1ha2VmaWxlLnZtcwotYmludXRpbHMudGFyLmJ6MjogJChESVNUX1NVUFBPUlQpICQoQklOVVRJTFNfU1VQUE9SVF9ESVJTKSBiaW51dGlscwotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9YmludXRpbHMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEJJTlVUSUxTX1NVUFBPUlRfRElSUykgbWFrZWFsbC5iYXQgY29uZmlndXJlLmJhdCIKLQotLlBIT05ZOiBnYXMrYmludXRpbHMudGFyLmJ6MgotR0FTQl9TVVBQT1JUX0RJUlM9ICQoR0FTX1NVUFBPUlRfRElSUykgYmludXRpbHMgbGQgZ3Byb2YKLWdhcytiaW51dGlscy50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHQVNCX1NVUFBPUlRfRElSUykgZ2FzCi0JJChNQUtFKSAtZiBNYWtlZmlsZS5pbiB0YXogVE9PTD1nYXMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdBU0JfU1VQUE9SVF9ESVJTKSBtYWtlYWxsLmJhdCBjb25maWd1cmUuYmF0IgotCi0uUEhPTlk6IGxpYmcrKy50YXIuYnoyCi1MSUJHWFhfU1VQUE9SVF9ESVJTPWluY2x1ZGUgbGlic3RkYysrIGxpYmlvIGxpYnJ4IGxpYmliZXJ0eQotbGliZysrLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSBsaWJnKysKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWxpYmcrKyBcCi0JCVNVUFBPUlRfRklMRVM9IiQoTElCR1hYX1NVUFBPUlRfRElSUykiCi0KLUdOQVRTX1NVUFBPUlRfRElSUz1pbmNsdWRlIGxpYmliZXJ0eSBzZW5kLXByCi1nbmF0cy50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHTkFUU19TVVBQT1JUX0RJUlMpIGduYXRzCi0JJChNQUtFKSAtZiAgTWFrZWZpbGUuaW4gdGF6IFRPT0w9Z25hdHMgXAotCQlTVVBQT1JUX0ZJTEVTPSIkKEdOQVRTX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogZ2RiLnRhci5iejIKLUdEQl9TVVBQT1JUX0RJUlM9IGJmZCBpbmNsdWRlIGxpYmliZXJ0eSBtbWFsbG9jIG9wY29kZXMgcmVhZGxpbmUgc2ltIHV0aWxzIGludGwKLWdkYi50YXIuYnoyOiAkKERJU1RfU1VQUE9SVCkgJChHREJfU1VQUE9SVF9ESVJTKSBnZGIKLQkkKE1BS0UpIC1mIE1ha2VmaWxlLmluIHRheiBUT09MPWdkYiBcCi0JCVNVUFBPUlRfRklMRVM9IiQoR0RCX1NVUFBPUlRfRElSUykiCi0KLS5QSE9OWTogbmV3bGliLnRhci5iejIKLU5FV0xJQl9TVVBQT1JUX0RJUlM9bGliZ2xvc3MKLSMgdGF6IGNvbmZpZ3VyZXMgZm9yIHRoZSBzdW40IHRhcmdldCB3aGljaCB3b24ndCBjb25maWd1cmUgbmV3bGliLgotIyBXZSBuZWVkIG5ld2xpYiBjb25maWd1cmVkIHNvIHRoYXQgdGhlIC5pbmZvIGZpbGVzIGFyZSBtYWRlLgotIyBVbmZvcnR1bmF0ZWx5LCBpdCBpcyBub3QgZW5vdWdoIHRvIGp1c3QgY29uZmlndXJlIG5ld2xpYiBzZXBhcmF0ZWx5OgotIyB0YXogd2lsbCBidWlsZCB0aGUgLmluZm8gZmlsZXMgYnV0IHNpbmNlIFNVQkRJUlMgd29uJ3QgY29udGFpbiBuZXdsaWIsCi0jIGRpc3RjbGVhbiB3b24ndCBiZSBydW4gKGxlYXZpbmcgTWFrZWZpbGUsIGNvbmZpZy5zdGF0dXMsIGFuZCB0aGUgdG1wIGZpbGVzCi0jIHVzZWQgaW4gYnVpbGRpbmcgdGhlIC5pbmZvIGZpbGVzLCBlZzogKi5kZWYsICoucmVmKS4KLSMgVGhlIHByb2JsZW0gaXNuJ3Qgc29sdmFibGUgaG93ZXZlciB3aXRob3V0IGEgbG90IG9mIGV4dHJhIHdvcmsgYmVjYXVzZQotIyB0YXJnZXQgbGlicmFyaWVzIGFyZSBidWlsdCBpbiBzdWJkaXIgJCh0YXJnZXRfYWxpYXMpIHdoaWNoIGdldHMgbnVrZWQgZHVyaW5nCi0jIHRoZSBtYWtlIGRpc3RjbGVhbi4gIEZvciBub3cgcHVudCBvbiB0aGUgaXNzdWUgb2Ygc2hpcHBpbmcgbmV3bGliIGluZm8gZmlsZXMKLSMgd2l0aCBuZXdsaWIgbmV0IHJlbGVhc2VzIGFuZCB3YWl0IGZvciBhIGRheSB3aGVuIHNvbWUgbmF0aXZlIHRhcmdldCAoc3VuND8pCi0jIHN1cHBvcnRzIG5ld2xpYiAoaWYgb25seSBtaW5pbWFsbHkpLgotbmV3bGliLnRhci5iejI6ICQoRElTVF9TVVBQT1JUKSAkKE5FV0xJQl9TVVBQT1JUX0RJUlMpIG5ld2xpYgotCSQoTUFLRSkgLWYgTWFrZWZpbGUuaW4gdGF6IFRPT0w9bmV3bGliIFwKLQkJU1VQUE9SVF9GSUxFUz0iJChORVdMSUJfU1VQUE9SVF9ESVJTKSIgXAotCQlERVZPX1NVUFBPUlQ9IiQoREVWT19TVVBQT1JUKSBDT1BZSU5HLk5FV0xJQiIgbmV3bGliCi0KLS5OT0VYUE9SVDoKLU1BS0VPVkVSUklERVM9Ci0KLSMgZW5kIG9mIE1ha2VmaWxlLmluCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMGU0MzYuLjAwMDAwMDAKLS0tIGEvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotCQkgICBSRUFETUUgZm9yIEdOVSBkZXZlbG9wbWVudCB0b29scwotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB2YXJpb3VzIEdOVSBjb21waWxlcnMsIGFzc2VtYmxlcnMsIGxpbmtlcnMsIAotZGVidWdnZXJzLCBldGMuLCBwbHVzIHRoZWlyIHN1cHBvcnQgcm91dGluZXMsIGRlZmluaXRpb25zLCBhbmQgZG9jdW1lbnRhdGlvbi4KLQotSWYgeW91IGFyZSByZWNlaXZpbmcgdGhpcyBhcyBwYXJ0IG9mIGEgR0RCIHJlbGVhc2UsIHNlZSB0aGUgZmlsZSBnZGIvUkVBRE1FLgotSWYgd2l0aCBhIGJpbnV0aWxzIHJlbGVhc2UsIHNlZSBiaW51dGlscy9SRUFETUU7ICBpZiB3aXRoIGEgbGliZysrIHJlbGVhc2UsCi1zZWUgbGliZysrL1JFQURNRSwgZXRjLiAgVGhhdCdsbCBnaXZlIHlvdSBpbmZvIGFib3V0IHRoaXMKLXBhY2thZ2UgLS0gc3VwcG9ydGVkIHRhcmdldHMsIGhvdyB0byB1c2UgaXQsIGhvdyB0byByZXBvcnQgYnVncywgZXRjLgotCi1JdCBpcyBub3cgcG9zc2libGUgdG8gYXV0b21hdGljYWxseSBjb25maWd1cmUgYW5kIGJ1aWxkIGEgdmFyaWV0eSBvZgotdG9vbHMgd2l0aCBvbmUgY29tbWFuZC4gIFRvIGJ1aWxkIGFsbCBvZiB0aGUgdG9vbHMgY29udGFpbmVkIGhlcmVpbiwKLXJ1biB0aGUgYGBjb25maWd1cmUnJyBzY3JpcHQgaGVyZSwgZS5nLjoKLQotCS4vY29uZmlndXJlIAotCW1ha2UKLQotVG8gaW5zdGFsbCB0aGVtIChieSBkZWZhdWx0IGluIC91c3IvbG9jYWwvYmluLCAvdXNyL2xvY2FsL2xpYiwgZXRjKSwKLXRoZW4gZG86Ci0JbWFrZSBpbnN0YWxsCi0KLShJZiB0aGUgY29uZmlndXJlIHNjcmlwdCBjYW4ndCBkZXRlcm1pbmUgeW91ciB0eXBlIG9mIGNvbXB1dGVyLCBnaXZlIGl0Ci10aGUgbmFtZSBhcyBhbiBhcmd1bWVudCwgZm9yIGluc3RhbmNlIGBgLi9jb25maWd1cmUgc3VuNCcnLiAgWW91IGNhbgotdXNlIHRoZSBzY3JpcHQgYGBjb25maWcuc3ViJycgdG8gdGVzdCB3aGV0aGVyIGEgbmFtZSBpcyByZWNvZ25pemVkOyBpZgotaXQgaXMsIGNvbmZpZy5zdWIgdHJhbnNsYXRlcyBpdCB0byBhIHRyaXBsZXQgc3BlY2lmeWluZyBDUFUsIHZlbmRvciwKLWFuZCBPUy4pCi0KLUlmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgY29tcGlsZXIgb24geW91ciBzeXN0ZW0sIGl0IGlzIG9mdGVuIGJlc3QgdG8KLWV4cGxpY2l0bHkgc2V0IENDIGluIHRoZSBlbnZpcm9ubWVudCBiZWZvcmUgcnVubmluZyBjb25maWd1cmUsIGFuZCB0bwotYWxzbyBzZXQgQ0Mgd2hlbiBydW5uaW5nIG1ha2UuICBGb3IgZXhhbXBsZSAoYXNzdW1pbmcgc2gvYmFzaC9rc2gpOgotCi0JQ0M9Z2NjIC4vY29uZmlndXJlCi0JbWFrZQotCi1BIHNpbWlsYXIgZXhhbXBsZSB1c2luZyBjc2g6Ci0KLQlzZXRlbnYgQ0MgZ2NjCi0JLi9jb25maWd1cmUKLQltYWtlCi0KLU11Y2ggb2YgdGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZW5jbG9zZWQgaXMgY29weXJpZ2h0IGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBvcgotQ09QWUlORy5MSUIgaW4gdGhlIHZhcmlvdXMgZGlyZWN0b3JpZXMsIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdGVybXMgdW5kZXIgd2hpY2ggeW91IGNhbiBjb3B5IHRoZSBmaWxlcy4KLQotUkVQT1JUSU5HIEJVR1M6IEFnYWluLCBzZWUgZ2RiL1JFQURNRSwgYmludXRpbHMvUkVBRE1FLCBldGMuLCBmb3IgaW5mbwotb24gd2hlcmUgYW5kIGhvdyB0byByZXBvcnQgcHJvYmxlbXMuCmRpZmYgLS1naXQgYS9iZmQvQ09QWUlORyBiL2JmZC9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU0OWJlLi4wMDAwMDAwCi0tLSBhL2JmZC9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvYmZkL0NoYW5nZUxvZyBiL2JmZC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTY3OGYuLjAwMDAwMDAKLS0tIGEvYmZkL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDM3NTYgKzAsMCBAQAotMTk5OS0wNi0yNyAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChNSVBTX0VMRl9TUkRBVEFfU0VDVElPTl9OQU1FKTogTmV3IG1hY3JvLgotCShNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSk6IExpa2V3aXNlLgotCShNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRSk6IExpa2V3aXNlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIHRoZW0uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLiAgQWRkIC5zcmRhdGEgdG8gdGhlIGxpc3QKLQlvZiBHUC1yZWxhdGl2ZSBzZWN0aW9ucy4KLQkoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFVzZSB0aGVtLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFNoYXJlIGNvZGUgYmV0d2VlbiAuc2RhdGEgYW5kCi0JLmxpdDQvLmxpdDggc2VjdGlvbnMuICBTZXQgYXBwcm9wcmlhdGUgZmxhZ3MgZm9yIC5zcmRhdGEuCi0JKG1pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogQWRkIGhhbmRsaW5nIGZvcgotCVBUX01JUFNfT1BUSU9OUyBzZWdtZW50IG9uIElSSVg2LgotCShtaXBzX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBMaWtlaXdzZS4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IFNldCBFRl9NSVBTX0NQSUMgd2hlbiByZXF1aXJlZCBieSB0aGUgQUJJLgotCUluY2x1ZGUgdGhlIG9wdGlvbnMgc2VjdGlvbnMgb24gSVJJWDYuICBEb24ndCBsb29rIGZvciBHUC1yZWxhdGl2ZQotCXNlY3Rpb25zIGJ5IG5hbWU7IHVzZSBTSEZfTUlQU19HUFJFTCBpbnN0ZWFkLgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IEFkanVzdCB0byB1c2UgL3Vzci9saWIzMi9saWJjLnNvLjEgZm9yCi0JdGhlIE4zMiBBQkkuCi0JKG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgbXVjayBhYm91dCB3aXRoIHNlY3Rpb24KLQlhbGlnbm1lbnRzIGFuZCBzdWNoIG9uIElSSVg2LgotCShtaXBzX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLiBBZGp1c3QgdG8gaGFuZGxlIHRoZQotCWZhY3QgdGhhdCBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiBpcyBubyBsb25nZXIgYSBjb25zdGFudC4gIFVzZQotCWJmZF96YWxsb2MgcmF0aGVyIHRoYW4gYmZkX2FsbG9jIGFuZCBtZW1zZXQuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZSBNSVBTX0VMRl9TVFVCX1NFQ1RJT05fTkFNRS4KLQlEb24ndCBhc3NlcnQgdGhlIGV4aXN0ZW5jZSBvZiAucmxkX21hcCBvbiBJUklYNi4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUuCi0JCQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9hZGp1c3RfZHluaW5keCk6IFJlbW92ZS4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIF9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHgKLQlpbnN0ZWFkLgotCi0xOTk5LTA2LTI2ICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3N3YXBfbXN5bV9pbik6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfc3dhcF9tc3ltX291dCk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGZfY3JlYXRlX21zeW1fc2VjdGlvbik6IExpa2V3aXNlLgotCShNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSk6IE5ldyBtYWNyby4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IHNoX2xpbmsgZm9yIC5tc3ltLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVqZWN0IGFuIFNIVF9NSVBTX01TWU0KLQlzZWN0aW9uIG5vdCBuYW1lZCAubXN5bS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogVXNlIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FLCBub3QKLQkubXN5bSBkaXJlY3RseS4gIFNldCBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIGZvciB0aGUgLm1zeW0KLQlzZWN0aW9uLgotCShtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgbWluX2R5bl9yZWxvY19pbmRleCBmaWVsZC4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBDbGVhciBpdC4KLQkobWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBDcmVhdGUgdGhlIC5tc3ltIHNlY3Rpb24KLQlvbiBJUklYNi4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUKLQkubXN5bSBzZWN0aW9uLiAgQWRkIGEgRFRfTUlQU19NU1lNIGVudHJ5LgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBXcml0ZSBvdXQgYSAubXN5bSBlbnRyeSBmb3IKLQl0aGUgc3ltYm9sLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEFzc2lnbiBhIHZhbHVlIGZvcgotCURUX01JUFNfTVNZTS4gIEFkZCAubXN5bSBlbnRyaWVzIGZvciB0aGUgc2VjdGlvbiBzeW1ib2xzIGFzIHdlbGwuCi0KLQkqIGVsZjMyLW1pcHMuYyAoaXJpeF9jb21wYXRfdCk6IE5ldyBlbnVtZXJhdGlvbi4KLQkoQUJJX04zMl9QKTogTmV3IG1hY3JvLgotCShJUklYX0NPTVBBVCk6IExpa2V3aXNlLgotCShTR0lfQ09NUEFUKTogSW1wbGVtZW50IGluIHRlcm1zIG9mIElSSVhfQ09NUEFULgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHR5cG8uCi0JCi0xOTk5LTA2LTI2ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IE1hcmsgbm9uIHJlYWRvbmx5IEJGRCBzZWN0aW9ucwotCWFzIHdyaXRhYmxlIFBFIHNlY3Rpb25zLgotCi0xOTk5LTA2LTI2ICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBhcmFuZ2UpOiBOZXcgdHlwZS4KLQkoc3RydWN0IGNvbXBfdW5pdCk6IFJlcGxhY2UgTE9XIGFuZCBISUdIIGJ5IG1lbWJlciBBUkFOR0UuCi0JKGFyYW5nZV9hZGQpOiBOZXcgZnVuY3Rpb24uCi0JKGRlY29kZV9saW5lX2luZm8pOiBLZWVwIHRyYWNrIG9mIGFkZHJlc3MgcmFuZ2VzIHRoYXQgYSBjb21waWxhdGlvbgotCXVuaXQgY292ZXJzLgotCShjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyk6IFJldHVybiB0cnVlIGlmIGFkZHJlc3MgaXMgY29udGFpbmVkCi0JaW4gX2FueV8gb2YgdGhlIGFkZHJlc3MgcmFuZ2VzIGFzc29jaWF0ZWQgd2l0aCBhIGNvbXBpbGF0aW9uIHVuaXQuCi0JKF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lKTogQ2FsbCBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUKLQlvbiB0aGUgZmlyc3QgY29tcF91bml0IHRoYXQgY29udGFpbnMgdGhlIGFkZHJlc3MuCi0KLTE5OTktMDYtMjYgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBkd2FyZjIuYyAoc3RydWN0IGR3YXJmMl9kZWJ1Zyk6IEFkZCBtZW1iZXIgZHdhcmZfbGluZV9idWZmZXIuCi0JKGRlY29kZV9saW5lX2luZm8pOiBBZGQgdmFyaWFibGUgU1RBU0ggYW5kIGluaXRpYWxpemUgaXQgdG8gcG9pbnQKLQl0byB0aGUgcGVyLWJmZCBkd2FyZjJfZGVidWcgaW5mby4gIFJlbW92ZSBzdGF0aWMgdmFyaWFibGUKLQlkd2FyZl9saW5lX2J1ZmZlciBhbmQgdXNlIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlciBpbiBpdHMgcGxhY2UuCi0KLTE5OTktMDYtMjYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBJdCdzIE9LIGZvciBhIC1Cc3ltYm9saWMKLQlzaGFyZWQgbGlicmFyeSB0byBoYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0KLQlGcm9tIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPjoKLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggbGFzdCBwYXRjaC4KLQotVGh1IEp1biAyNCAyMDo1OToxMSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1ocHBhLmMgKGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1ocHBhLmM6IFJlbW92ZSBldmVyeXRoaW5nIHJlbGF0ZWQgdG8gc3ltYm9sIGV4dGVuc2lvbgotCXNlY3Rpb25zICYgcmVjb3Jkcy4gIFVzZSB0aGUgY29tbW9uIGVsZl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuCi0KLTE5OTktMDYtMjIgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIHVzZXItc3BlY2lmaWVkIGluaXQvZmluaQotCWZ1bmN0aW9ucyBpbnN0ZWFkIG9mIF9pbml0L19maW5pIGlmIHJlcXVlc3RlZC4KLQotMTk5OS0wNi0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBdm9pZCBjcmFzaGluZyBvbiBhIGJvZ3VzIHNoX2xpbmsKLQlmaWVsZC4KLQotMTk5OS0wNi0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEZyYW56IFNpcmwgPEZyYW56LlNpcmwta2VybmVsQGxhdXRlcmJhY2guY29tPjoKLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB1bnVzZWQgZHluaW5keAotCWZpZWxkIHRvIDAsIG5vdCAtMS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENoZWNrIGZvciBwb3NpdGl2ZSBzZWN0aW9uCi0JZHluaW5keCBmaWVsZCwgcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgLTEuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IE9ubHkgcmV0dXJuIGZhbHNlIGlmIHVuZGVmaW5lZF9zeW1ib2wKLQlvciByZWxvY19vdmVyZmxvdyBmYWlsLCBub3QgYWx3YXlzIHVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yLgotCi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGxpbmtfcmVhZF9yZWxvY3MpOiBFeHBsaWNpdGx5IGNhc3QgZXh0ZXJuYWxfcmVsb2NzIHRvCi0JYmZkX2J5dGUgKiBiZWZvcmUgcGVyZm9ybWluZyBwb2ludGVyIGFyaXRobWV0aWMuCi0KLVR1ZSBKdW4gMjIgMTM6MDY6MjUgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtaHBwYS5oOiBOZXcgZmlsZS4gIENvbW1vbiBzdHVmZiBmb3IgZWxmMzIgYW5kIGVsZjY0IFBBCi0Jc3VwcG9ydC4KLQkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBlbGYtaHBwYS5oLgotCShBUkNIX1NJWkUpOiBEZWZpbmUuCi0JKGVsZl9ocHBhX3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlLiAgRm91bmQgaW4gdGhlIGNvbW1vbiBjb2RlCi0Jbm93LgotCShlbGYzMl9ocHBhX2luZm9fdG9faG93dG8pOiBTaW1pbGFybHkuCi0JKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogU2ltaWxhcmx5LgotCShlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IFNpbWlsYXJseS4KLQkoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBTaW1pbGFybHkuCi0JKiBlbGYzMi1ocHBhLmggKEVMRl9IT1dUT19UQUxCRSwgTl9QQVJJU0NfUkVMT0NTKTogRGVsZXRlLgotCi0xOTk5LTA2LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDYXRjaCBvdmVyZmxvdwotCWhhbmRsaW5nIFJfVjg1MF8yMl9QQ1JFTCByZWxvY2F0aW9uLgotCi0xOTk5LTA2LTIxICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29mZi1hcm0uYyAoYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5KTogRXhwbGljaXRseSBkZWNsYXJlIHJldHVybgotCXR5cGUuCi0KLVN1biBKdW4gMjAgMTQ6MTM6NTcgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBJZ25vcmUgc2VjdGlvbnMKLQlESVNDQVJEZWQgYnkgdGhlIGxpbmsgc2NyaXB0LgotCi0xOTk5LTA2LTE5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMpOgotCVJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgc3BwLgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGNyYXNoIGlmCi0JdGhlIGVudHJ5IHN5bWJvbCBpcyBub3Qgc2V0LgotCi1GcmkgSnVuIDE4IDA0OjI0OjU3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBhZGp1c3QKLQlHUERJU1Agb3IgTElUVVNFIGluIGEgcmVsb2NhdGFibGUgbGluay4KLQotVGh1IEp1biAxNyAyMToyNDo0MyAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGR3YXJmMS5jIChhbGxvY19kd2FyZjFfdW5pdCk6IEFsbG9jYXRlIHVzaW5nIGJmZF96YWxsb2MuCi0JKiAoYWxsb2NfZHdhcmYxX2Z1bmMpOiBMaWtld2lzZS4KLQotV2VkIEp1biAxNiAwMzowOTo1NyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaDogRml4IHZhcmlvdXMgZm9ybWF0dGluZyBlcnJvcnMuCi0JKGFzc2VtYmxlXzMpOyBSZXdyaXRlIHVzaW5nIENBVEVOQVRFLgotCShhc3NlbWJsZV8xNyk6IEZpeCB2YXJpb3VzIGJ1Z3MuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1jb3JlLmMgKFJfTUNPUkVfUkFXKTogRml4IGRlZmluaXRpb24uCi0KLTE5OTktMDYtMTUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNlY3Rpb24uYyAoU0VDX1NIT1JUKTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyk6Ci0JUmVtb3ZlIGFiZmQgcGFyYW1ldGVyLiAgVXNlIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dC4KLQkoYmZkX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBBZGp1c3QgY2FsbGVycyBhY2NvcmRpbmdseS4KLQkKLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCk6IERlZmluZSBpdC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfcmVtb3ZlX3NlY3Rpb25fYW5kX2FkanVzdF9keW5pbmRpY2VzKTogTmV3Ci0JZnVuY3Rpb24uCi0JKGJmZF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXNlIGl0LgotCi0xOTk5LTA2LTEzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfMzg2X1BDOCBmcm9tCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQgdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi0xOTk5LTA2LTEzICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX3JlYWRfcmVsb2NzX2Zyb21fc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwKLQlzcGxpdCBvdXQgZnJvbSAuLi4KLQkoZWxmX2xpbmtfcmVhZF9yZWxvY3MpOiBIZXJlLiAgVXNlIGl0IGZvciBib3RoIHJlbG9jYXRpb24KLQlzZWN0aW9ucy4KLQotMTk5OS0wNi0xMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uKTogRG9uJ3QgYXNzdW1lCi0JYXNlY3QtPnJlbG9jX2NvdW50IGlzIHZhbGlkLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZjMyX3NlY3Rpb25fcHJvY2Vzc2luZyk6IFBlcm1pdCBhCi0JU0hUX01JUFNfUkVHSU5GTyBzZWN0aW9uIHRvIGhhdmUgYSBzaXplIG9mIDAuCi0KLTE5OTktMDYtMTIgIERhdmlkIE8nQnJpZW4gIDxvYnJpZW5AZnJlZWJzZC5vcmc+Ci0KLQkqIGNvbmZpZy5iZmQgKGFscGhhKi0qLWZyZWVic2QqKTogTmV3IHRhcmdldC4KLQkoaVszNDU2XTg2LSotZnJlZWJzZCopOiBOb3cgZGVmYXVsdHMgdG8gRUxGLgotCi0xOTk5LTA2LTExICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVsb2MuYyAoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IFBlcm1pdCBiaXRmaWVsZCByZWxvY2F0aW9ucyB0bwotCXdyYXAgaWYgdGhlIHJlbG9jYXRpb24gY292ZXJzIHRoZSBoaWdoIGJpdCBvZiBhbiBhZGRyZXNzLgotCi0JKiBkd2FyZjIuYyAoZGVjb2RlX2xpbmVfaW5mbyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgZmlyc3RfdGltZS4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBlbGY2NF9zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlIFJfU1BBUkNfbWF4X3N0ZAotCWluc3RlYWQgb2YgUl9TUEFSQ19tYXguCi0JKHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8pOiBMaWtld2lzZS4KLQkqIGVsZjMyX3NwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfaW5mb190b19ob3d0byk6IExpa2V3aXNlOyBoYW5kbGUgdnRhYmxlIHJlbG9jYXRpb25zLgotCi0xOTk5LTA2LTA3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IFJlbW92ZSBvdXRwdXQKLQlzZWN0aW9ucyB3aXRoIG5vIGluaXRpYWwgbGlua19vcmRlci4KLQotMTk5OS0wNi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTg4ay5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0KLU1vbiBKdW4gIDcgMTE6NDk6NDMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoU09VUkNFX0hGSUxFUyk6IEFkZCBtaXNzaW5nIGhlYWRlcnMuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDYtMDYgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2RhdGEpOiBSZWNvZ25pemUKLQl0aGUgTjMyIEFCSS4KLQotMTk5OS0wNi0wNCAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBiYXJmIG9uIG91dCBvZgotCXJhbmdlIHVuZGVmd2VhayBzeW1ib2xzLgotCSogaGFzaC5jOiBBZGQgbWlzc2luZyBjb21tYSBhZnRlciBAeHJlZnt9Ci0JKiBsaW5rZXIuYzogTGlrZXdpc2UuCi0KLTE5OTktMDYtMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZnh4LXRhcmdldC5oIChFTEZfTUFYUEFHRVNJWkUpOiBQcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UKLQlpZiBub3QgZGVmaW5lZC4KLQkqIGVsZjMyLWdlbi5jIChFTEZfTUFYUEFHRVNJWkUpOiBEZWZpbmUuCi0JKiBlbGYzMi1pODYwLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQkqIGVsZjMyLWk5NjAuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCSogZWxmNjQtZ2VuLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotMTk5OS0wNi0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZHdhcmYxLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZHdhcmYxLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBlcG9jLWFybS1wZSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIHBlLWFybS5jOiBPbmx5IHJlZGVmaW5lIGludGVyd29ya2luZyBmdW5jdGlvbiBuYW1lcyBpZiB0aGV5IGhhdmUKLQlub3QgYWxyZWFkeSBiZWVuIHJlZGVmaW5lZC4KLQkqIHBlaS1hcm0uYzogT25seSByZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgaWYgdGhleSBoYXZlCi0Jbm90IGFscmVhZHkgYmVlbiByZWRlZmluZWQuCi0JKiBlcG9jLXBlLWFybS5jOiBSZWRlZmluZSBpbnRlcndvcmtpbmcgZnVuY3Rpb24gbmFtZXMgdG8gYXZvaWQgYQotCW5hbWUgc3BhY2UgY2xhc2guCi0JKiBlcG9jLXBlaS1hcm0uYzogUmVkZWZpbmUgaW50ZXJ3b3JraW5nIGZ1bmN0aW9uIG5hbWVzIHRvIGF2b2lkIGEKLQluYW1lIHNwYWNlIGNsYXNoLgotCi0xOTk5LTA2LTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoRUxGX01BWFBBR0VTSVpFKTogRGVmYXVsdCB0byAweDEwMDAgbm90IDEuCi0KLUZyaSBKdW4gIDQgMTA6MDU6MTEgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBVbmRvIGNoYW5nZSBvZiAxOTk5LTA1LTEwLgotCi1GcmkgSnVuICA0IDAzOjEwOjQ5IDE5OTkgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZWxmMzItc2guYyAoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEZpeCBzZXR0aW5nIG9mCi0Jc3RhcnQgLyBzdG9wIGZvciByZWNhbGN1bGF0aW5nIG9mIHJfYWRkZW5kIG9mIFJfU0hfU1dJVENIKi4KLQotRnJpIEp1biAgNCAwMjo1MzoxMyAxOTk5ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBIYW5kbGUgUl9TSF9TV0lUQ0gzMgotCWluIG90aGVyIHRleHQgc2VjdGlvbnMuCi0KLUZyaSBKdW4gIDQgMDI6Mjk6MzQgMTk5OSAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBsaWJiZmQuYyAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2gpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmLXNoLmMgKHNoX21lcmdlX3ByaXZhdGVfZGF0YSk6IERlbGV0ZS4KLQkoY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSB0bwotCV9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoLgotCShlbGYzMi1zaC5jKTogYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhOiBEZWZpbmUuCi0KLTE5OTktMDYtMDMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1hcm0uaDogRml4IHR5cG86IGNoYW5nZSBFTEZfTUFYUEFHRV9TSVpFIHRvIEVMRl9NQVhQQUdFU0laRS4KLQotMTk5OS0wNi0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6IENvcnJlY3QKLQlwcm90b3R5cGUuCi0JKGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTAzICBEYXZpZCBNb3NiZXJnZXIgIDxkYXZpZG1AaHBsLmhwLmNvbT4KLQotCSogZHdhcmYyLmMgKHN0cnVjdCBsaW5lX2luZm8pOiBBZGQgbWVtYmVyIEVORF9TRVFVRU5DRSB0byBrZWVwCi0JdHJhY2sgb2YgZW5kX3NlcXVlbmNlIG1hcmtlcnMuCi0JKGFkZF9saW5lX2luZm8pOiBBZGQgRU5EX1NFUVVFTkNFIGFyZy4KLQkoZGVjb2RlX2xpbmVfaW5mbyk6IERvbid0IHRyeSB0byBpbmZlciBsb19wYyBhbmQgaGlfcGMgZnJvbSB0aGUKLQlkZWJ1Zy1saW5lIGluZm8tLS1pdCBkb2Vzbid0IHdvcmsgcmlnaHQgaWYgYSBjb21waWxhdGlvbiB1bml0Ci0JY29uc2lzdHMgb2YgbXVsdGlwbGUgZGlzY29udGlndW91cyBjb2RlLXNlcXVlbmNlcy4gIEl0IHdvdWxkIGJlCi0Jd29ydGh3aGlsZSB0byBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGEgY29tcGlsYXRpb24KLQl1bml0IHJlc3VsdHMgaW4gYSBjb250aWd1b3VzIHNldCBvZiBjb2RlIHNlcXVlbmNlcywgYnV0IHRoaXMgaXMKLQlxdWl0ZSB0cmlja3kgdG8gZ2V0IHJpZ2h0IGZvciBhcmJpdHJhcnkgRFdBUkYyIGZpbGVzLgotCShsb29rdXBfYWRkcmVzc19pbl9saW5lX2luZm9fdGFibGUpOiBEb24ndCB1c2UgdGhlIGxhc3QgbGluZSBlbnRyeQotCWZvciBhIGNvbXBpbGF0aW9uIHVuaXQgZm9yIGFueXRoaW5nIHdpdGggYW4gYWRkcmVzcyBoaWdoZXIgdGhhbgotCXRoaXMgbGluZSBlbnRyeS4gIEFsc28sIGNoZWNrIGZvciBlbmRfc2VxdWVuY2UgbWFya2VycyB0bwotCWNvcnJlY3RseSBoYW5kbGUgZGlzY29udGludWl0aWVzLgotCShfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSk6IFdoZW4gY2hlY2tpbmcgcHJldmlvdXNseSBsb2FkZWQKLQljb21waWxhdGlvbiB1bml0cywgY2hlY2sgYWxsIGNvbXBpbGF0aW9uIHVuaXRzIHdpdGggZWFjaC0+aGlnaD09MAotCWp1c3QgbGlrZSB3aGVuIHJlYWRpbmcgY29tcGlsYXRpb24gdW5pdHMuCi0KLQkqIGR3YXJmMi5jIChkZWNvZGVfbGluZV9pbmZvKTogSW5pdGlhbGl6ZSB0YWJsZS0+ZmlsZXMgYW5kCi0JdGFibGUtPmxhc3RfbGluZSB0byBOVUxMIHRvIGF2b2lkIHNlZ2ZhdWx0cyBkdWUgdG8gcmFuZG9tCi0JdmFsdWVzIGluIHRoZXNlIG1lbWJlcnMuCi0JKGNvbmNhdF9maWxlbmFtZSk6IENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgZmlsZSBudW1iZXIgYmVmb3JlCi0JaW5kZXhpbmcgZmlsZW5hbWUgdGFibGUuICBTZWdmYXVsdHMgc3Vjay4KLQotCSogZHdhcmYyLmMgKGRlY29kZV9saW5lX2luZm8pOiBEb24ndCB0cnVuY2F0ZSBhZGRyZXNzIHRvIGxlYXN0Ci0Jc2lnbmlmaWNhbnQgMzIgYml0cyAoYnJlYWtzIDY0IGJpdCB0YXJnZXRzKS4KLQkobG9va3VwX2FkZHJlc3NfaW5fZnVuY3Rpb25fdGFibGUpOiBEaXR0by4KLQkoY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MpOiBEaXR0by4KLQotMTk5OS0wNi0wMiAgTWFyayBNaXRjaGVsbCAgPE1hcmsgTWl0Y2hlbGwgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgUl9NSVBTX0pBTFIuCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsYSk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24sCi0Jc3BsaXQgb3V0IGZyb20gLi4uCi0JKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IEhlcmUuICBVc2UgaXQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEKLQlzaW5nbGUgc2VjdGlvbiBoYXMgdHdvIGFzc29jaWF0ZWQgcmVsb2NhdGlvbiBzZWN0aW9ucy4KLQotMTk5OS0wNi0wMiAgTWFyayBTYWx0ZXIgIDxtc2FsdGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogU2V0IGxtYSBmcm9tIHNfdmFkZHIgaWYKLQlDT0ZGX1dJVEhfUEUgZGVmaW5lZC4KLQotMTk5OS0wNi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGUtYXJtLmM6IFJlbmFtZSBnbG9iYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMgdG8gYXZvaWQgbmFtZQotCWNvbGxpc2lvbiB3aGVuIGFsbCB0YXJnZXRzIEJGRCBpcyBidWlsdC4KLQkqIHBlaS1hcm0uYzogRGl0dG8uCi0KLTE5OTktMDUtMzEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSB1c2VfcmVsYV9wLiAgQWRkCi0JbWF5X3VzZV9yZWxfcCwgbWF5X3VzZV9yZWxhX3AsIGRlZmF1bHRfdXNlX3JlbGFfcC4KLQkoYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgdXNlX3JlbGFfcC4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBTZXQgdXNlX3JlbGFfcCBhcHByb3ByaWF0ZWx5LgotCShfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rKTogTGlrZXdpc2UuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogVXNlIG1heV91c2VfcmVsYV9wLCBldGMuLCBpbnN0ZWFkIG9mCi0JdXNlX3JlbGFfcC4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENvcHkgdXNlX3JlbGFfcC4KLQkqIGVsZmNvZGUuaCAod3JpdGVfcmVsb2NzKTogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHVzZSByZWxhCi0JcmVsb2NzIGJhc2VkIG9uIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gaGVhZGVyLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBkZWZhdWx0X3VzZV9yZWxhX3AKLQlpbnN0ZWFkIG9mIHVzZV9yZWxhX3AuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxwKTogTmV3IG1hY3JvLgotCShlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcCk6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9kZWZhdWx0X3VzZV9yZWxhX3ApOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogVXNlIHRoZW0uCi0KLVdlZCBKdW4gIDIgMTI6Mzg6NDkgMTk5OSAgTWlvZHJhZyBWYWxsYXQgPG1pb2RyYWdAbXVsdGltYW5pYS5jb20+Ci0KLQkqIGhvc3RzL2FscGhhbGludXguaCAoVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRCk6IEV4cGFuZCB0byA0MDk2LgotCi1UdWUgSnVuICAxIDE3OjU3OjU4IDE5OTkgIE1hcmsgUC4gTWl0Y2hlbGwgIDxtaXRjaGVsbEBuMDIuYWNsLmxhbmwuZ292PgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfTUlQU19TVUIpOiBOZXcgcmVsb2NhdGlvbi4KLQkoQkZEX1JFTE9DX01JUFNfR09UX1BBR0UpOiBMaWtld2lzZS4KLQkoQkZEX1JFTE9DX01JUFNfR09UX09GU1QpOiBMaWtld2lzZS4KLQkoQkZEX1JFTE9DX01JUFNfR09UX0RJU1ApOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBsaWJiZmQuaDogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfaW5mb190b19ob3d0b19yZWxhKTogTmV3IGZ1bmN0aW9uLgotCShVU0VfUkVMKTogQWRqdXN0IGZvciBuZXcgY29udmVudGlvbnMuCi0JKE1JTlVTX09ORSk6IE5ldyBtYWNyby4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgUl9NSVBTX1NVQi4KLQkobWlwc19yKTogQWRkIGVudHJpZXMgZm9yIE1JUFNfU1VCLCBNSVBTX0dPVF9QQUdFLCBNSVBTX0dPVF9PRlNULAotCWFuZCBNSVBTX0dPVF9ESVNQLgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogU2V0IHNoX2xpbmssIG5vdCBzaF9pbmZvLCBmb3IgYQotCS5NSVBTLmNvbnRlbnQgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogVHJlYXQgYWxsIHNlY3Rpb25zIHRoYXQgYmVnaW4KLQl3aXRoIC5NSVBTLmNvbnRlbnQgYXMgLk1JUFMuY29udGVudCBzZWN0aW9ucy4gIFNldAotCVNIRl9NTklQU19OT1NUUklQIGZvciBzdWNoIHNlY3Rpb24uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIHRvIG1pcHNfaW5mb190b19ob3d0b19yZWxhLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX3IpOiAgQWRkIGVudHJpZXMgZm9yIE1JUFNfU1VCLCBNSVBTX0dPVF9QQUdFLAotCU1JUFNfR09UX09GU1QsIGFuZCBNSVBTX0dPVF9ESVNQLgotCi1XZWQgSnVuICAyIDExOjUxOjEyIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdm1zLW1pc2MuYyAoX2JmZF92bXNfaGFzaF9uZXdmdW5jKTogRml4IHVzZSBvZiB1bmluaXRpYWxpemVkCi0JdmFyaWFibGUuCi0KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQXZvaWQgYW1iaWdvdXMKLQlgZWxzZScuCi0KLTE5OTktMDUtMzAgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFJlaW5zdGF0ZSBjaGFuZ2Ugb2YKLQkxOTkzLTAzLTI1ICghISkuICBUYWtlIGludG8gYWNjb3VudCB0aGUgYml0bWFza3MgZm9yIHRoZSByZWxvYyBzbwotCXRoZSBhZGRlbmQgZG9lcyBub3Qgb3ZlcmZsb3cgaW50byB0aGUgcmVzdCBvZiB0aGUgd29yZC4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6IEFtZW5kIHByb3RvdHlwZSBmb3IKLQliZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gLgotCSogYmZkLWluLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZmFybS1vYWJpLmMgKE5VTV9FTEVNKTogTmV3IG1hY3JvOiBDb21wdXRlIHRoZSBudW1iZXIgb2YKLQllbGVtZW50cyBpbiBhIGZpeGVkIHNpemVkIGFycmF5LgotCShBUk1fRUxGX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShBUk1fRUxGX09TX0FCSV9WRVJTSU9OKTogRGVmaW5lLgotCShSX0FSTV9USE1fQUJTNSk6IEZpeCByaWdodHNoaWZ0IGFuZCBzaXplLgotCShSX0FSTV9USE1fUEMyMik6IEZpeCBzaXplLgotCShSX0FSTV9QTFQzMik6IERlZmluZSBIb3d0by4KLQkoZmluZF9ob3d0byk6IE5ldyBmdW5jdGlvbjogTG9jYXRlIGEgaG93dG8gYmFzZWQgb24gYSByZWxvYwotCW51bWJlci4KLQkoZWxmMzJfYXJtX2luZm9fdG9faG93dG8pOiBVc2UgZmluZF9ob3d0byBpZiBuZWNlc3NhcnkuCi0JKGVsZjMyX2FybV9yZWxvY19tYXApOiBDaGFuZ2UgdHlwZSBvZiBmaWVsZCBiZmRfcmVsb2NfdmFsIHRvCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLgotCShlbGYzMl9hcm1fcmVsb2NfbWFwW10pOiBBZGQgZW50cmllcyBmb3IgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0JYW5kIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkuCi0JKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6IFVzZSBmaW5kX2hvd3RvIGlmIG5lY2Vzc2FyeS4KLQotCSogZWxmYXJtLW5hYmkuYyAoTlVNX0VMRU0pOiBOZXcgbWFjcm86IENvbXB1dGUgdGhlIG51bWJlciBvZgotCWVsZW1lbnRzIGluIGEgZml4ZWQgc2l6ZWQgYXJyYXkuCi0JKEFSTV9FTEZfQUJJX1ZFUlNJT04pOiBEZWZpbmUuCi0JKEFSTV9FTEZfT1NfQUJJX1ZFUlNJT04pOiBEZWZpbmUuCi0JKFJfQVJNX1RITV9BQlM1KTogRml4IHJpZ2h0c2hpZnQgYW5kIHNpemUuCi0JKFJfQVJNX1RITV9QQzIyKTogRml4IHNpemUuCi0JKGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvX3JlbCk6IFJlbmFtZSB0byBlbGYzMl9hcm1faW5mb190b19ob3d0by4KLQkoZWxmMzJfYXJtX3JlbG9jX21hcCk6IENoYW5nZSB0eXBlIG9mIGZpZWxkIGJmZF9yZWxvY192YWwgdG8KLQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUuCi0KLQkqIGVsZjMyLWFybS5oIChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBuZXcgZmllbGQ6Ci0Jbm9fcGlwZWxpbmVfa25vd2xlZGdlLgotCShlbGYzMl9hcm1fbGlua19oYXNoX2NyZWF0ZSk6IEluaXRpYWxpc2UgbmV3IGZpZWxkIHRvIHplcm8uCi0JKGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IEFkZCBuZXcgcGFyYWVtdGVyOgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZS4gIFVzZSB0aGlzIHBhcmFtZXRlciB0byBpbml0aWFsaXNlIHRoZSBmaWVsZAotCWluIHRoZSBnbG9iYWxzIGRhdGEgc3RydWN0dXJlLgotCShlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6IE9ubHkgYWRkIGluIHBpcGVsaW5lIG9mZnNldCBpZgotCW5vX3BpcGVsaW5lX2tub3dsZWRnZSBpcyBmYWxzZSBhbmQgdGhlIGJpbmFyeSBpcyBmcm9tIGFuIG9sZAotCXRvb2xjaGFpbi4KLQkoZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfZGF0YSk6IEdlbmVyYXRlIGFuIGVycm9yIGlmIGFuIGF0dGVtcHQgaXMKLQltYWRlIHRvIGxpbmwgdG9nZXRoZXIgYmlnIGVuZGlhbiBhbmQgbGl0dGxlIGVuZGlhbiBjb2RlLgotCShlbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBOZXcgZnVuY3Rpb246ICBJbml0aWFsaXNlIHRoZQotCUVJX09TQUJJIGFuZCBFSV9BQklWRVJTSU9OIGZpZWxkcyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBFTEYgcHJvZ3JhbQotCWhlYWRlci4KLQkoZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBEZWZpbmUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkOgotCWVsZl9iYWNrZW5kX3Bvc3RfcHJvY2Vzc19oZWFkZXJzLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpOiBEZWZpbmUgdG8KLQlOVUxMIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKGVsZk5OX2JlZCk6IEluaXRpYWxpc2UgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMgZmllbGQuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBTZXQgdGhlIEVJX09TQUJJIGFuZCBFSV9BQklWRVJTSU9OIGZpZWxkcwotCXRvIHplcm8uCi0JKF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENhbGwKLQllbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycyBpZiBkZWZpbmVkLgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayB3aGV0aGVyIGdldHVpZCBhbmQgZ2V0Z2lkIGV4aXN0LgotCSogYXJjaGl2ZS5jOiBEZWZpbmUgZ2V0dWlkIGFuZCBnZXRnaWQgYXMgbWFjcm9zIGlmIEhBVkVfR0VUVUlEIG9yCi0JSEFWRV9HRVRHSUQgYXJlIG5vdCBkZWZpbmVkLCByZXNwZWN0aXZlbHkuCi0JKGJmZF93cml0ZV9hcm1hcCk6IERvbid0IHNwZWNpYWwgY2FzZSBvbiBfV0lOMzIgZm9yIGdldHVpZCBhbmQKLQlnZXRnaWQuCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IGFjX2N2X2Z1bmNfZ2V0e3VnfWlkIGZvciAqLSotd2luZG93cyouCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNS0yOCAgTWFydGluIERvcmV5ICA8bWRvcmV5QG1hZGdlLmNvbT4KLQotCSogZWxmMzItaTk2MC5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgYmZkX2FyY2hfaTk2MC4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgJmJmZF9lbGYzMl9pOTYwX3ZlYy4KLQkqIGNvbmZpZy5iZmQgKGk5NjAtKi1lbGYqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjMyX2k5NjBfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBNYWtlZmlsZS5hbSAoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItaTk2MC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLWk5NjAuYy4KLQkqIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLTE5OTktMDUtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1vYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEFkZCBlbnRyeSBmb3IKLQlSX0FSTV9QTFQzMi4KLQkoZmluZF9ob3d0byk6IE5ldyBmdW5jdGlvbjogRmluZCBlbnRyaWVzIGluIHRoZQotCWVsZjMyX2FybV9ob3d0b190YWJsZS4KLQkoZWxmMzJfYXJtX2luZm9fdG9faG93dG8pOiBVc2UgZmluZF9ob3d0byBpZiB0aGUgZW50cnkgY2Fubm90IGJlCi0JY29tcHV0ZWQgc2ltcGx5LgotCShlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgbG9va3VwIGZvcgotCUJGRF9SRUxPQ19BUk1fUExUMzIuCi0KLTE5OTktMDUtMjUgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBiZmQvZWxmMzItYXJtLmggKGVsZjMyX2FybV9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UgYWJvdmUgZnVuY3Rpb24gYXMgdGhlCi0JY29uc3RydWN0b3IgZm9yIGhhc2ggdGFibGUgZW50cmllcy4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBBdm9pZCBjcmFzaCB3aGVuIHRoZXJlIGlzIG5vIG91dHB1dAotCXNlY3Rpb24uCi0JKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IHBhcmFtZXRlciBoLgotCShlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFBhc3Mgc3ltYm9sIGhhc2ggZW50cnkgdG8gYWJvdmUKLSAJcm91dGluZS4KLQkoZWxmMzJfYXJtX2djX3N3ZWVwX2hvb2ssIGVsZjMyX2FybV9jaGVjayByZWxvY3MpOiBDb3JyZWN0Ci0JY29tbWVudHMuCi0KLTE5OTktMDUtMjUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGVtaXQKLSAgICAgICAgYmFzZSBmaWxlIGVudHJpZXMgZm9yIHBjLXJlbGF0aXZlIHZhbHVlcy4KLQotMTk5OS0wNS0yNSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3N5bV9pbik6IFdoZW4gd2UgY3JlYXRlIHRoZSBhY3R1YWwgc2VjdGlvbgotCXRvIHJlZmxlY3QgdGhlIG5vdC10aGVyZSBzZWN0aW9uIENfU0VDVElPTiBzeW1ib2xzIHJlZmVyIHRvLAotCWNoYW5nZSB0aGUgc3ltYm9sIGNsYXNzIHRvIENfU1RBVCBhcyB0aGUgc2VjdGlvbiBpcyBub3cgcmVhbGx5Ci0JdGhlcmUuCi0KLTE5OTktMDUtMjQgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBVbmRvIGNoYW5nZSBvZgotIAkxOTk5LTAzLTI1LgotCi1Nb24gTWF5IDE3IDEzOjM1OjM1IDE5OTkgIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzKTogQ2hhbmdlZAotCUZfUElDX0lOVCB0byBGX1BJQy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkZWQgRl9BUk1fMmEsIGFuZAotCUZfQVJNXzNNIGxhYmVscy4gIENoYW5nZWQgRl9QSUNfSU5UIHRvIEZfUElDLgotCi0xOTk5LTA1LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKGluX3JlbG9jX3ApOiBSZWluc3RhdGUuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NQ09SRV9SVkEpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0JKiBjb2ZmLW1jb3JlLmMgKGluX3JlbG9jX3ApOiBSZW1vdmUgZGVmaW50aW9uLgotCShtY29yZV9jb2ZmX2hvd3RvKTogQWRkIElNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKG1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXApOiBNYXAgQkZEX1JFTE9DX1JWQSB0bwotCUlNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKGNvZmZfbWNvcmVfcnR5cGVfdG9faG93dG8pOiBBZGQgc3BlY2lhbCBwcm9jZXNzaW5nIGZvcgotCUlNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBzdXBwb3J0IGZvcgotCUlNQUdFX1JFTF9NQ09SRV9SVkEuCi0JKiBlbGYzMi1tY29yZSAobWNvcmVfZWxmX2hvd3RvXyk6IEFkZCBSX01DT1JFX1JFTEFUSVZFLgotCShtY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXApOiBNYXAgQkZEX1JFTE9DX1JWQSB0bwotCVJfTUNPUkVfUkVMQVRJVkUuCi0JKG1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVsZXRlIHJlZHVuZGFudCBjYXNlIGxhYmVscy4KLQotRnJpIE1heSAxNCAxMDo1OTo1NSAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEZpeCBvcGVyYXRvcgotIAlwcmVjZWRlbmNlIGJldHdlZW4gYml0LWFuZCBhbmQgY29tcGFyaXNvbi4KLQotVGh1IE1heSAxMyAwOTo0NToyMyAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tKQotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdODYqLSotcnRlbXMqLCBtNjhrKi0qLXJ0ZW1zKik6IEFkZGVkIHRvCi0JbGlzdCBvZiB0YXJnZXQgZm9ybWF0cyAodGFyZ19zZWx2ZWNzKS4KLQkoaVszNDU2XTg2Ki0qLXJ0ZW1zZWxmKiwgbWlwcyplbC0qLXJ0ZW1zKik6IE5ldyB0YXJnZXRzLgotCShwb3dlcnBjbGUqLSpydGVtcyosIHNoLSotcnRlbXNlbGYqKTogTmV3IHRhcmdldHMuCi0KLTE5OTktMDUtMTAgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwKTogZ2l2ZSB0aGUgc3ltdGFiIGVsZW1lbnQgYQotCXJlYXNvbmFibGUgbW9kZSB1bnRpbCAiYXIgeCIgaXMgc21hcnQgZW5vdWdoIHRvIHNraXAgaXQgKGZpeGVzCi0JZ2NjL2xpYmdjYy5hIGJ1aWxkcyBvbiBtaXBzLWVjb2ZmIHRhcmdldHMKLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBFeHBsYWluIGhvdyBDT01EQVRzIGFyZSBzdXBwb3NlZAotCXRvIHdvcmsuICBIYWNrIHRvIHN1cHBvcnQgTVMgaW1wb3J0IGxpYnJhcmllcywgd2hpY2ggdXNlIGRpZmZlcmVudAotCUNPTURBVCB0eXBlcyB0aGFuIEdOVS4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDX1NFQ1RJT04gc3ltYm9scyBhcmUgbG9jYWw7IHRoZXkgcmVmZXIKLQl0byBpbXBsaWVkIHplcm8tbGVuZ3RoIHNlY3Rpb25zIChzZWUgcGVpY29kZSBiZWxvdykKLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBQcm9wZXJseSByZWFkIGxvbmcgTVMKLQlmaWxlbmFtZSBzeW1ib2xzLCB3aGljaCB1c2Ugb25lICpvciBtb3JlKiBhdXhlbnRzLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IGRpdHRvCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBCdWlsZCB0aGUgaW1wbGllZCB6ZXJvLWxlbmd0aAotCXNlY3Rpb25zCi0KLVR1ZSBNYXkgMTEgMTU6NTE6NTggMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2hvd3RvX3RhYmxlKTogTWFrZSBwYXJ0aWFsX2lucGxhY2UgZmFsc2UKLQlmb3IgYWxsIHJlbG9jYXRpb25zLgotCi0xOTk5LTA1LTEwICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGJmZC1pbi5oIChiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyk6ICBTdGF0aWMKLSAgICAgICAgaWYgQ09GRl9JTUFHRV9XSVRIX1BFLgotICAgICAgICAoYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0gICAgICAgIChiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyk6IExpa2V3aXNlLgotICAgICAgICAqIGNvZmYtYXJtLmM6IExpa2V3aXNlLgotICAgICAgICAqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGFybXBlX2xpdHRsZV92ZWMpOiBSZW1vdmUgY29mZi1hcm0ubG8uCi0gICAgICAgIChhcm1wZV9iaWdfdmVjKTogTGlrZXdpc2UuCi0gICAgICAgICogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayBmb3IgLnJlbC4gYXMgc3RhcnQgb2YgcmVsCi0Jc2VjdGlvbiwgbm90IGp1c3QgLnJlbC4gIFNhbWUgZm9yIC5yZWxhLgotCi0xOTk5LTA1LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmMgKGNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbik6IFJlcGxhY2UgYXNzZXJ0IGFib3V0Ci0JZW5kaWFuaXNtIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KLQotVGh1IE1heSAgNiAxNzowOTowOSAxOTk5ICBGcmVkIEZpc2ggIDxmbmZAYmUuY29tPgotCi0JKiBkd2FyZjIuYyAocmVhZF9hYmJyZXZzKTogQ2hhbmdlIGNhc3Qgb2YgZHdhcmZfYWJicmV2X2J1ZmZlcgotCWFzc2lnbm1lbnQgZnJvbSAidW5zaWduZWQgY2hhciAqIiB0byAiY2hhciAqIi4KLQkoZGVjb2RlX2xpbmVfaW5mbyk6IExpa2V3aXNlIGZvciBkd2FyZl9saW5lX2J1ZmZlciBhc3NpZ25tZW50LgotCi0xOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgQWRkIG9uZSB0bwotICAgICAgICBhZGRyZXNzIG9mIEFSTV9SVkEzMiB0aHVtYiBmdW5jdGlvbnMuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItbTY4ay5jIChlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3LgotICAgICAgICAoZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0gICAgICAgIChlbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0gICAgICAgIChlbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0gICAgICAgIChDUFUzMl9GTEFHKTogRGVmaW5lLgotICAgICAgICAoUExUX0NQVTMyX0VOVFJZX1NJWkUpOiBEZWZpbmUuCi0gICAgICAgIChlbGZfY3B1MzJfcGx0MF9lbnRyeSk6IERlY2xhcmUuCi0gICAgICAgIChlbGZfY3B1MzJfcGx0X2VudHJ5KTogRGVjbGFyZS4KLSAgICAgICAgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEdlbmVyYXRlIGNwdTMyIHBsdCBlbnRyaWVzLgotICAgICAgICAoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0gICAgICAgIChlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotICAgICAgICAoZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplKTogUmVtb3ZlIGRlZmluaXRpb24uCi0gICAgICAgIChiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLSAgICAgICAgKGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLSAgICAgICAgKGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEZWZpbmUuCi0gICAgICAgIChiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0KLU1vbiBNYXkgIDMgMDk6MjQ6NDkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2ZpeHVwX2Zvcm1hdHMpOiBGaXggY29tbWVudHMgZm9yIFJfU0hPUlRfUENSRUxfTU9ERQotCWFuZCBSX0xPTkdfUENSRUxfTU9ERS4KLQotMTk5OS0wNC0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1tY29yZS5jIChjb2ZmX21jb3JlX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwb3MuCi0KLUZyaSBBcHIgMjggMTY6MzY6MTkgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSW5jbHVkZSByZWxvY2F0aW9uIGFkZGVuZAotCWluIHJlbG9jYXRpb24gY2FsY3VsYXRpb24uCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLW1jb3JlLmM6IEFkZCBzdXBwb3J0IGZvciBtY29yZSByZWxvY3MuCi0KLTE5OTktMDQtMjAgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IFNjcmFwIHRoZQotCWluY29ycmVjdCB1c2UgRUZfTUlQU194eEJJVFBUUlMuCi0KLTE5OTktMDQtMTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZCBsb2NhbAotCXZhcmlhYmxlIGluc24uCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1TYXQgQXByIDE3IDIwOjU1OjE1IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9ydHlwZV90b19ob3d0byk6IFJlbW92ZSBBUk0yNkQgdHJhbnNmb3JtLgotCShjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uKTogIEFkZCBBUk0yNkQgdHJhbnNmb3JtLiAgT25seQotCWNoYW5nZSB0byBBUk0yNkQgZm9yIHJlbG9jYXRlYWJsZSBsaW5rcy4KLQotMTk5OS0wNC0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCShiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0KLTE5OTktMDQtMTUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmggKGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlKTogIEZvciBSX0FSTV9USE1fQUJTNSwKLQlyZWZldGNoIGFkZGVuZCBpZiBVU0VfUkVMLCBhZGQgbWFueSBjb21tZW50cyByZWdhcmRpbmcgY3VycmVudCBzdGF0ZS4KLQlGb3IgUl9BUk1fVEhNX1BDMjIsIHJlZmV0Y2ggYWRkZW5kIGlmIFVTRV9SRUwsIHNpbXBsaWZ5LgotCSogZWxmYXJtLW5hYmkuYyAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKTogRm9yIFJfQVJNX1RITV9BQlM1LCBmaXgKLQlzaXplIGFuZCByaWdodHNoaWZ0LiAgRm9yIFJfQVJNX1RITV9QQzIyLCBmaXggYml0c2l6ZS4KLQkqIGVsZmFybS1vYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IERpdHRvLgotCi1XZWQgQXByIDE0IDE0OjMzOjA4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBaZXJvIGBkZWJ1ZycuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8pOiBMaWtld2lzZS4KLQotMTk5OS0wNC0xMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMi5jIChkZWNvZGVfbGluZV9pbmZvKTogRG9uJ3QgdHJ1bmNhdGUgYWRkcmVzcyB0byBsZWFzdAotCXNpZ25pZmljYW50IDMyIGJpdHMgKGJyZWFrcyA2NCBiaXQgdGFyZ2V0cykuCi0JKGxvb2t1cF9hZGRyZXNzX2luX2Z1bmN0aW9uX3RhYmxlKTogRGl0dG8uCi0JKGNvbXBfdW5pdF9jb250YWluc19hZGRyZXNzKTogRGl0dG8uCi0KLVR1ZSBBcHIgMTMgMjE6Mjc6MTkgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSk6IE5ldyByb3V0aW5lLgotCShBMlQzX09GRlNFVCk6IERlZmluZS4KLQkoVDJBM19PRkZTRVQpOiBEZWZpbmUuCi0JKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgRW1pdCBiYXNlIGZpbGUgZW50cmllcyBmb3IgaW50ZXJ3b3JraW5nCi0Jc3R1YnMuCi0KLTE5OTktMDQtMTMgIFBoaWxpcCBCbHVuZGVsbCAgPHBoaWxiQGdudS5vcmc+Ci0KLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEFkZCBkdW1teSBlbnRyaWVzIGZvcgotCXJlbG9jcyAxNyB0aHJvdWdoIDE5LgotCi1TdW4gQXByIDExIDAxOjI1OjE3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaDogUmVtb3ZlIGZubWF0Y2guaC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uKTogQ2FsbCBiYWNrIHRvIGxkCi0JaW5zdGVhZCBvZiBjYWxsaW5nIGZubWF0Y2guCi0KLQkqIGNvbmZpZy5iZmQgKGk/ODYtKi1iZW9zZWxmKTogSW5jbHVkZSBwZSB2ZWNzLgotCi1TdW4gQXByIDExIDAxOjE0OjA2IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBBbGxvdyAucGx0Ci0JdG8gZ28gbWlzc2luZy4KLQotMTk5OS0wNC0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTWluZCBub191bmRlZmluZWQKLQl3aGVuIHRyeWluZyB0byByZXNvbHZlIGR5bmFtaWMgc3ltYm9sIHJlZmVyZW5jZXMuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0KLVNhdCBBcHIgMTAgMTU6MTI6MDkgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc2VjdGlvbi5jIChfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQpOiBOZXcgZnVuY3Rpb24gbW92ZWQgZnJvbQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IC4uLiBoZXJlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgaXQuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogVXBkYXRlLgotCi0xOTk5LTA0LTA5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZWxmNjQtc3BhcmMuYzogRml4IGluY29ycmVjdCBjYWxscyB0byBiZmRfY2hlY2tfb3ZlcmZsb3cuCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWNvcmUuYzogTmV3IEZpbGU6IFN1cHBvcnQgZm9yIG1jb3JlLXBlIHRhcmdldHMuCi0JKiBjcHUtbWNvcmUuYzogTmV3IEZpbGU6IFN1cHBvcnQgZm9yIG1jb3JlIHRhcmdldHMuCi0JKiBlbGYzMi1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCBmb3IgbWNvcmUtZWxmIHRhcmdldC4KLQkqIHBlLW1jb3JlLmM6IE5ldyBGaWxlOiBEZWZpbml0aW9ucyBmb3IgbWNvcmUtcGUgdGFyZ2V0LgotCSogcGVpLW1jb3JlLmM6IE5ldyBGaWxlOiBEZWZpbml0aW9ucyBmb3IgbWNvcmUtcGVpIHRhcmdldC4KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBNQ29yZSB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogYXJjaHVyZXMuYzogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIGFyY2hpdGVjdHVyZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGNvZmZjb2RlLmg6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXRzLgotCSogZWxmLmM6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1lbGYgdGFyZ2V0LgotCSogcmVsb2MuYzogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHJlbG9jcy4KLQkqIHRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIE1Db3JlIHRhcmdldHMuCi0KLTE5OTktMDQtMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IEFkZCBlbnRyaWVzIGZvcgotCVJfQVJNX1hQQzI1IGFuZCBSX0FSTV9USE1fWFBDMjIuCi0JKGVsZjMyX2FybV9yZWxvY19tYXApOiBSZW1vdmUgcmVkdW5kYW50IGVudHJpZXMuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBzeXNkZXAuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0KLTE5OTktMDQtMDYgIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9jaGVja19vdmVyZmxvdyk6IEFkZCBhZGRyc2l6ZSBwYXJhbWV0ZXIuICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4gIFJld3JpdGUgY29tcGxldGVseS4KLQkoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IFJld3JpdGUgb3ZlcmZsb3cgY2hlY2tpbmcuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLTE5OTktMDQtMDUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBHYWJyaWVsIFBhdWJlcnQgPHBhdWJlcnRAaXJhbS5lcz46Ci0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBTZXQgUl9QUENfR09UMTZfTE8sCi0JUl9QUENfUExUMTZfTE8gYW5kIFJfUFBDX1NFQ1RPRkZfTE8gdG8gYmUgY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4KLQlTZXQgUl9QUENfUExUMTZfSEEsIFJfUFBDX1NFQ1RPRkZfSEEgYW5kIFJfUFBDX0VNQl9OQUREUjE2X0hBIHRvCi0JaGF2ZSBhIHJpZ2h0c2hpZnQgb2YgMTYgYW5kIHVzZSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYy4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF92ZWMpOiBVc2UgbGl0dGxlIGVuZGlhbiByb3V0aW5lcyBmb3IKLQloZWFkZXJzLgotCi0JKiBlbGYuYyAoZWxmY29yZV9zdHJuZHVwKTogT25seSBkZWZpbmUgaWYgaXQgd2lsbCBiZSB1c2VkLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsYXhfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGlyZWwKLQlhbmQgaXJlbGVuZC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGkuCi0JKHBwY19lbGZfZ2NfbWFya19ob29rKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0KLQlGcm9tIEJlcm5kIE5pdHpsZXIgPG5pdHpsZXJAa2FnY3BkMDEuYWcwMS5rb2Rhay5DT00+OgotCSogc3JlYy5jIChzcmVjX3NjYW4pOiBBY2NlcHQgXHIgaW4gc3ltYm9sIGRlZmluaXRpb25zLgotCShzcmVjX29iamVjdF9wKTogU2V0IEhBU19TWU1TIGlmIHdlIHNhdyBhbnkgc3ltYm9scy4KLQkoc3ltYm9sc3JlY19vYmplY3RfcCk6IExpa2V3aXNlLgotCi0xOTk5LTA0LTA0ICBEb24gQm93bWFuIDxkb25AcGl4c2NpLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIG1pcHMqZWwtKi12eHdvcmtzKiBhbmQgbWlwcyotKi12eHdvcmtzKi4KLQotMTk5OS0wNC0wNCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGR3YXJmMS5jIChwYXJzZV9saW5lX3RhYmxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgbGFzdF9wYyBhbmQKLQlsYXN0X2xpbmUuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkcik6IERlY2xhcmUuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogUmVtb3ZlIHVudXNlZAotCWxvY2FsIGkuCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogUmVtb3ZlIHVudXNlZAotCWxvY2FsIHZhbC4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIHRhcmdldHMuYzogQWRkIHN1cHBvcnQgZm9yIGFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvZmYtYXJtLmM6IEFsbG93IGhlYWRlciBmaWxlcyB0byBvdmVycmlkZSBkZWZpbml0aW9uIG9mCi0JVEFSR0VUX1VOREVSU0NPUkUgYW5kIFVTRVJfTEFCRUxfUFJFRklYLgotCSogcGUtYXJtLmg6IEFsbG93IHByZXZpb3VzIGhlYWRlciBmaWxlcyB0byBvdmVycmlkZSBkZWZpbml0aW9uIG9mCi0JVEFSR0VUX0xJVFRMRV9TWU0gYW5kIFRBUkdFVF9CSUdfU1lNLgotCSogcGVpLWFybS5oOiBBbGxvdyBwcmV2aW91cyBoZWFkZXIgZmlsZXMgdG8gb3ZlcnJpZGUgZGVmaW5pdGlvbiBvZgotCVRBUkdFVF9MSVRUTEVfU1lNIGFuZCBUQVJHRVRfQklHX1NZTS4KLQkqIGVwb2MtcGUtYXJtLmM6IE5ldyBmaWxlLiAgU3VwcG9ydCBhcm0tZXBvYy1wZSB0YXJnZXQuCi0JKiBlcG9jLXBlaS1hcm0uYzogTmV3IGZpbGUuICBTdXBwb3J0IGFybS1lcG9jLXBlaSB0YXJnZXQuCi0KLTE5OTktMDMtMzAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChlbGZfbWFwX3N5bWJvbHMpOiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc2VjdGlvbgotCXN5bWJvbHMgYXJlIGdlbmVyYXRlZCBmb3IgY29udGVudC1sZXNzIHNlY3Rpb25zIHdoaWNoIGFyZQotCW5vdCBtYXBwZWQgdG8gdGhlIG91dHB1dCBmaWxlLgotCi0JKiBsaW5rZXIuYzogUmVwbGFjZSBkaXJlY3QgcmVmZXJlbmNlcyB0byBmaWVsZHMgaW4gQkZEIHN0cnVjdHVyZQotCXdpdGggYWNjZXNzb3IgbWFjcm9zLgotCi0JKiBlbGZsaW5rLmg6IFJlcGxhY2UgZGlyZWN0IHJlZmVyZW5jZXMgdG8gZmllbGRzIGluIEJGRCBzdHJ1Y3R1cmUKLQl3aXRoIGFjY2Vzc29yIG1hY3Jvcy4KLQotMTk5OS0wMy0yNSAgUGhpbGlwIEJsdW5kZWxsICA8cGJAbmV4dXMuY28udWs+Ci0KLQkqIGNvbmZpZy5iZmQ6IEVsaW1pbmF0ZSByZWR1bmRhbmN5IGluIGNoZWNrcyBmb3IgTGludXgvQVJNLgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBUYWtlIHRoZSByaWdodHNoaWZ0IGludG8KLQlhY2NvdW50IHdoZW4gYWRqdXN0aW5nIHNlY3Rpb24gc3ltYm9scyBkdXJpbmcgYSBwYXJ0aWFsIGxpbmsuCi0KLTE5OTktMDMtMjQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc3BhcmMuYyAoc3RydWN0IGNvZmZfcmVsb2NfbWFwKTogQ2hhbmdlIHR5cGUgb2YgZmllbGQKLQkgICdiZmRfcmVsb2NfdmFsJyB0byBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUuCi0JKiBlbGYtbTEwMjAwLmMgKHN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmLW0xMDMwMC5jIChzdHJ1Y3QgbW4xMDMwMF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLWFyYy5jIChzdHJ1Y3QgYXJjX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItZDEwdi5jIChzdHJ1Y3QgZDEwdl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLWQzMHYuYyAoc3RydWN0IGQzMHZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1mcjMwLmMgKHN0cnVjdCBmcjMwX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItbTMyci5jIChzdHJ1Y3QgbTMycl9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjMyLXNoLmMgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGYzMi1zcGFyYy5jIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmMzItdjg1MC5jIChzdHJ1Y3Qgdjg1MF9yZWxvY19tYXApOiBEaXR0by4KLQkqIGVsZjY0LXNwYXJjLmMgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTogRGl0dG8uCi0JKiBlbGZhcm0tbmFiaS5jIChzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCk6IERpdHRvLgotCSogZWxmYXJtLW9hYmkuYyAoc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXApOiBEaXR0by4KLQotMTk5OS0wMy0xNyAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBDaGFuZ2VkIHRoaXMKLQlmdW5jdGlvbiBzbyBzb3VyY2UtbGV2ZWwgYXNzZW1ibHkgd29ya3MuICBJZiBtdWx0aXBsZSBOX1NPcwotCWFyZSBzZWVuIHdpdGhvdXQgYW5kIE5fRlVOcywgY3JlYXRlIGFuIGluZGV4dGFibGUgZW50cnkgd2l0aAotCWEgTlVMTCBmdW5jdGlvbiBuYW1lLgotCi0xOTk5LTAzLTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIEFsbG93IG1lcmdpbmcKLQlvZiBjZXJ0aWFuIHNpbWlsYXIgY3B1cy4KLQotMTk5OS0wMy0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQlBZGQgdGhlIDUwMDAuICBDaGFuZ2UgdGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhlIDU0MDAgdG8gbWlwczQuCi0JKGVsZl9taXBzX21hY2gpOiBBZGQgcjUwMDAuCi0KLTE5OTktMDMtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY3B1LWk5NjAuYyAoc2Nhbl9pOTYwX21hY2gpOiBSZWNvZ25pemUgaTk2MDprYV9zYSBhbmQgaTk2MDprYl9zYi4KLQotMTk5OS0wMy0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEdlbmVyYXRlIHdhcm5pbmcgYWJvdXQKLQlodWdlIGZpbGUgb2Zmc2V0cyBmb3IgYW55IHNlY3Rpb24gdGhhdCB3aWxsIG9jY3VweSBmaWxlIHNwYWNlLCBub3QKLQlqdXN0IHRob3NlIHRoYXQgYXJlIGxvYWRhYmxlLgotCi0xOTk5LTAyLTI0ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlIGFmdGVyIE5pY2sgQ2xpZnRvbidzIEZlYiAxNyBjaGFuZ2VzLgotCi0xOTk5LTAyLTIyICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmM6IEFkZCBwcGNfZWxmX3JlbGF4X3NlY3Rpb24oKSBmb3IgdGhlIGxkIG9wdGlvbiBtcGM4NjBjMC4KLQotTW9uIEZlYiAyMiAxODoyNjo1MSAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTogRGVmaW5lLgotCSogZWxmbGluay5oOiBSZXZlcnQgYWxsIGNoYW5nZXMgc2luY2UgRmViIDE2LiAgSW5zdGVhZDoKLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogU2V0IFJFRl9SRUdVTEFSX05PTldFQUsgZmxhZyBpZgotCWFwcHJvcHJpYXRlLiAgQ29weSBpdCB0byB2ZXJzaW9uIHN5bWJvbHMuCi0JKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogU2V0IFJFRl9SRUdVTEFSX05PTldFQUsgZm9yIG5vbiBFTEYKLQlzeW1ib2xzIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogU2V0IFJFRl9SRUdVTEFSX05PTldFQUsgZm9yIHdlYWtkZWYKLQlzeW1ib2wgaWYgYXBwcm9wcmlhdGUuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBJZiBzeW1ib2wgaXMgbWFya2VkIGFzIHVuZGVmaW5lZCwgYW5kCi0JaGFzIG5vIG5vbndlYWsgcmVmZXJlbmNlcywgbWFyayBpdCBhcyB3ZWFrIHVuZGVmaW5lZC4KLQotRnJpIEZlYiAxOSAxNjowMToxMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IFdoZW4gb3ZlcnJpZGluZyBhIGR5bmFtaWMKLQlkZWZpbml0aW9uIHdpdGggYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2wsIHNldCBORUVEU19QTFQgaWYgaXQgaXMgYQotCWZ1bmN0aW9uLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBjb3B5IHRoZSBvdGhlciBmaWVsZCBpZiB3ZQotCWFyZSBvdmVycmlkZGluZy4KLQotVGh1IEZlYiAxOCAxODowNzo0MyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IERvIG5vdCBtZXJnZSBhbnkgc3ltYm9sIGZyb20gYQotCXNoYXJlZCBvYmplY3Qgd2l0aCBhIHdlYWsgdW5kZWZpbmVkIHN5bWJvbC4KLQotMTk5OS0wMi0xOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmYXJtLW5hYmkuYzogU2V0IHBhcnRpYWxfaW5wbGFjZSBiYWNrIHRvIGZhbHNlLgotCi0xOTk5LTAyLTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IFJlLWVuYWJsZS4KLQkoVVNFUl9MQUJFTF9QUkVGSVgpOiBTZXQgdG8gIl8iLgotCi0JVGhlIGZvbGxvd2luZyBwYXRjaGVzIGFyZSBmcm9tOiBTY290dCBCYW1icm91Z2gKLQk8c2NvdHRiQGNvcmVsY29tcHV0ZXIuY29tPgotCi0JKiBsaWJhb3V0LmggKE1fQVJNNl9ORVRCU0QpOiBTZXQgdG8gMTQzLgotCi0JKiByZWxvYy5jOiBBZGQgQVJNIFBJQyByZWxvY3M6ICAgQkZEX1JFTE9DX0FSTV9HT1QxMiwKLQlCRkRfUkVMT0NfQVJNX0dPVDMyLCBCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVCwgQkZEX1JFTE9DX0FSTV9DT1BZLAotCUJGRF9SRUxPQ19BUk1fR0xPQl9EQVQsIEJGRF9SRUxPQ19BUk1fUExUMzIsCi0JQkZEX1JFTE9DX0FSTV9SRUxBVElWRSwgQkZEX1JFTE9DX0FSTV9HT1RPRkYsIEJGRF9SRUxPQ19BUk1fR09UUEMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9ob3d0b190YWJsZSk6IFNldCBwYXJ0aWFsX2lucGxhY2UgdG8KLQkndHJ1ZScgYXMgUkVMIHJlbG9jcyBhcmUgbm93IGJlaW5nIHVzZWQuICBBZGQgbmV3IFBJQyByZWxvY3M6Ci0JUl9BUk1fQ09QWSwgUl9BUk1fR0xPQl9EQVQsIFJfQVJNX0pVTVBfU0xPVCwgUl9BUk1fUkVMQVRJVkUsCi0JUl9BUk1fR09UT0ZGLCBSX0FSTV9HT1RQQywgUl9BUk1fR09UMzIsIFJfQVJNX1BMVDMyLgotCi0JKiBlbGYzMi1hcm0uaCAoZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGVjayBieXRlIG9yZGVyCi0Jb2YgdGFyZ2V0cy4KLQkoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBDaGFuZ2UgcGFyYW1ldGVycyBzbyB0aGF0IGVudGlyZQotCXJlbG9jIGlzIHBhc3NlZC4gIEFkZCBzdXBwb3J0IGZvciBQSUMgcmVsb2NzLgotCShlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFBhc3MgZW50aXJlIHJlbG9jIHRvCi0JZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0JKGVsZjMyX2FybV9jaGVja19yZWxvY3MpOiBIYW5kbGUgbmV3IFBJQyByZWxvY3MuCi0JKGVsZjMyX2FybV9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2FybV9kaXNjYXJkX2NvcGllcyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLgotCShFTEZfTUFYUEFHRV9TSVpFKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IERlZmluZS4KLQkoZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0KTogRGVmaW5lLgotCShlbGZfYmFja2VuZF93YW50X3BsdF9zeW0pOiBEZWZpbmUuCi0KLVdlZCBGZWIgMTcgMTI6MDI6MjYgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IE1ha2UgcmVnaW5mbwotCXNlY3Rpb25zIFNFQ19MSU5LX09OQ0UgYW5kIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAxNyAxMjowNzoyMyAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLSAgICAgICAgKiBlbGZhcm0tb2FiaS5jIChiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucywKLSAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IERlZmluZSB0byBhdm9pZCBjbGFzaAotICAgICAgICB3aXRoIGVsZmFybS1uYWJpLmMuCi0KLSAgICAgICAgKiBlbGYzMi1hcm0uaDogRG9uJ3QgZGVjbGFyZSBlbGYzMl9hcm1faW5mb190b19ob3d0by4KLSAgICAgICAgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViLCBlbGYzMl9hcm1fdG9fdGh1bWJfc3R1YiwKLSAgICAgICAgZWxmMzJfYXJtX2ZpbmRfbmVhcmVzdF9saW5lKTogTWFrZSB0aGVtIHN0YXRpYy4KLQotVHVlIEZlYiAxNiAyMjo0NDozNyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IEFkZCBwZmxhZ3MgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBEbyBub3QgbWVyZ2UgYSBkZWZpbml0aW9uIGZyb20gYSBzaGFyZWQgb2JqZWN0IHdpdGggYQotCXdlYWsgdW5kZWZpbmVkIHN5bWJvbC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG8gbm90IGNoYW5nZSB0aGUgc3ltYm9sIHR5cGUgb3IKLQlzaXplIGlmIHRoZSBvbGQgc3ltYm9sIG92ZXJyaWRlcyB0aGUgbmV3IG9uZS4KLQotMTk5OS0wMi0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIHN0cm9uZ2FybSB0YXJnZXQuCi0KLU1vbiBGZWIgIDggMTE6MTg6MTQgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKHJlbG9jX21hcCk6IFVzZSB0aGUgY29ycmVjdCB0eXBlcyBmb3IgdGhlIHN0cnVjdAotCWZpZWxkcyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBGZWIgIDUgMDA6MjI6MzYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEZlYiAgNCAyMjozMDoxMyAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgUmVtb3ZlIEFNX0NZR1dJTjMyLgotCUNoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhUIGFuZCBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuICBBZGQgY29tbWVudHMgdG8gdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2luY2x1ZGUubTQ6IEFkZCBjb21tZW50cyB0byB1c2VzIG9mIEFDX0RFRklORS4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGN1cnJlbnQgYXV0b2NvbmYvYXV0b21ha2UuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIGNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLTE5OTktMDItMDQgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAocmVhbF9yZWFkKTogZG9uJ3QgY2FsbCBmcmVhZCBmb3IgemVybyBieXRlcy4gIFRoaXMKLQljb3ZlcnMgdXAgYSBidWcgKG9yIG1pc3VzZSBvZiBiZmQpIHRoYXQncyBleHBvc2VkIGJ5IFNvbGFyaXMuCi0KLVRodSBGZWIgIDQgMTI6Mzg6MTAgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEluc3VyZSB0aGF0IHRoZSB0YXJnZXQKLQlvZiBhIGp1bXAgaXMgaW4gdGhlIGN1cnJlbnQgMjU2IE1CIHJlZ2lvbi4KLQotVGh1IEZlYiAgNCAxMjoxNTozOCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBDaGFuZ2UgbGFzdCBwYXRjaCB0byBvbmx5Ci0JdGFrZSBlZmZlY3QgZm9yIHRoZSBiaW5hcnkgdGFyZ2V0LgotCi1XZWQgRmViICAzIDE5OjQwOjEyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfQ1RPUi4KLQotV2VkIEZlYiAgMyAxNTowMjo0NCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3IHJvdXRpbmUuCi0KLVR1ZSBGZWIgIDIgMjE6Mzg6MjggMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogSWYgdGhlIHRhcmdldCB3YXMKLQlwcmV2aW91c2x5IHNwZWNpZmllZCwgZG9uJ3QgY2hlY2sgb3RoZXIgdGFyZ2V0cyB3aGVuIGNoZWNraW5nIGZvcgotCWFuIGFyY2hpdmUgZmlsZS4KLQotVHVlIEZlYiAgMiAxODoxNjo0MyAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLWFybS5oIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIFJlbW92ZWQuCi0gICAgICAgIChlbGYzMl9hcm1fcmVsb2NfdHlwZV9sb29rdXApOiAgUmVtb3ZlZAotICAgICAgICAqIGVsZmFybS1uYWJpLmMgKGVsZjMyX2FybV9yZWxvY19tYXApOiAgTmV3LgotICAgICAgICAoZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwKTogIE5ldy4KLSAgICAgICAgKiBlbGZhcm0tb2FiaS5jIChlbGYzMl9hcm1fcmVsb2NfbWFwKTogIE5ldy4KLSAgICAgICAgKGVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCk6ICBOZXcuCi0KLU1vbiBGZWIgIDEgMTk6NDk6MjEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGZhcm0tbmFiaS5jOiAgUmVuYW1lZCBmcm9tIGVsZjMyLWFybS1uZXdhYmkuYy4KLSAgICAgICAgKiBlbGZhcm0tb2FiaS5jOiAgUmVuYW1lZCBmcm9tIGVsZjMyLWFybS1vbGRhYmkuYwotICAgICAgICAqIE1ha2VmaWxlLmFtOiAgVXNlIG5ldyBmaWxlcy4KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogIFJlZ2VuZXJhdGUuCi0gICAgICAgICogY29uZmlndXJlLmluOiAgVXNlIG5ldyBmaWxlcy4KLSAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotCi0xOTk5LTAyLTAxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZWxmX2djX21hcmtfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1Nb24gRmViICAxIDEyOjIxOjQ3IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6ICBBZGQgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotICAgICAgICBhbmQgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYy4KLQotTW9uIEZlYiAgMSAxMTo0NjozMSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtIChlbGYzMi1hcm0tb2xkYWJpLmxvKTogIE5ldy4KLSAgICAgICAgKGVsZjMyLWFybS1uZXdhYmkubG8pOiAgTmV3LgotICAgICAgICAqIE1ha2VmaWxlLmluOiAgUmVnZW5lcmF0ZS4KLSAgICAgICAgKiBjb25maWcuYmZkICh0aHVtYi0qLWVsZik6ICBSZW1vdmUgZGVmaW5pdGlvbiBvZiB0YXJnX3VuZGVyc2NvcmUuCi0gICAgICAgIChhcm0tKi1lbGYpOiAgTGlrZXdpc2UuCi0gICAgICAgIChhcm0tKi1vYWJpKTogIE5ldy4KLSAgICAgICAgKHRodW1iLSotb2FiaSk6ICBOZXcuCi0gICAgICAgICogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMpOiAgTmV3LgotICAgICAgICAoYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYyk6ICBOZXcuCi0gICAgICAgICogZWxmMzItYXJtLW5ld2FiaS5jOiAgTmV3LgotICAgICAgICAqIGVsZjMyLWFybS1vbGRhYmkuYzogIE5ldy4KLSAgICAgICAgKiBlbGYzMi1hcm0uYzogIFJlbW92ZWQuCi0gICAgICAgICogZWxmMzItYXJtLmg6ICBOZXcuCi0KLU1vbiBGZWIgIDEgMTE6NTI6MTIgMTk5OSAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IE9taXQgd2FybmluZ3MgZm9yCi0JdW5sb2FkYWJsZSBzZWN0aW9ucy4KLQotMTk5OS0wMS0zMSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGN7LGxlfS0qLXZ4d29ya3MqKTogQWRkIGFsaWFzZXMgdG8KLQlwb3dlcnBjeyxsZX0tKi1lYWJpLgotCi0xOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAocmVhZF91bnNpZ25lZF9sZWIxMjgpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQkqIGR3YXJmMi5jIChyZWFkX3NpZ25lZF9sZWIxMjgpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotRnJpIEphbiAyOSAwMDo0NzoyMSAxOTk5ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogT25seSBhZGp1c3QKLQlwX2FsaWduIHdoZW4gbmVlZGVkLgotCi1UaHUgSmFuIDI4IDIwOjA1OjIyIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IHJldHVybiBlYXJseSBmb3IgYQotIAlub24tbG9hZGFibGUgc2VjdGlvbiwgaW4gY2FzZSB0aGUgZmlyc3Qgc2VjdGlvbiBpcyBub24tbG9hZGFibGUuCi0gIAlEb24ndCBzZXQgdGhlIGxvdyBsbWEgZm9yIGEgU0VDX05FVkVSX0xPQUQgc2VjdGlvbi4gIEZyb20gTWFjaWVqCi0JVy4gUm96eWNraSA8bWFjcm9AZHMyLnBnLmdkYS5wbD4uCi0KLTE5OTktMDEtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9yZWxvY19tYXApOiBBZGQgUl9GUjMwX0dOVV9WVElOSEVSSVQgYW5kCi0JUl9GUjMwX0dOVV9WVEVOVFJZIHJlbG9jcy4KLQotVGh1IEphbiAyOCAxMTowODoxNiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfc3ltKTogIFplcm8gc3ltcyB3aGljaCBhcmUKLSAgICAgICBwYXJ0IG9mIHNlY3Rpb25zIHdoaWNoIGhhdmUgYmVlbiBleGNsdWRlZC4KLQotV2VkIEphbiAyNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyk6IENoYW5nZWQgRl9QSUMKLQl0byBGX1BJQ19JTlQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IFJlbW92ZWQgRl9BUk1fMmEgYW5kCi0JRl9BUk1fM00gbGFiZWxzLiAgQ2hhbmdlZCBGX1BJQyB0byBGX1BJQ19JTlQuCi0KLTE5OTktMDEtMjcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9lbGZfaG93dG9fdGFibGUpOiBGaXggbmFtZSBvZiBSX0ZSMzBfNDgKLQlyZWxvY2F0aW9uLgotCShmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBVc2UgY29tcHV0ZWQgdmFsdWUgYXMgcmVzdWx0IG9mCi0JcmVsb2NhdGlvbi4KLQotMTk5OS0wMS0yNiAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEVtaXQgd2FybmluZyBmb3IKLQlodWdlIGZpbGUgb2Zmc2V0cyBkdWUgdG8gd2lkZWx5LWRpc3BlcnNlZCBzZWN0aW9uIExNQXMuCi0KLU1vbiBKYW4gMTggMDM6MzU6MzUgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IElmIG5vdCBEX1BBR0VELAotCWFsaWduIGZpcnN0IHNlY3Rpb24gdG8gbGFyZ2VzdCBzZWN0aW9uIGFsaWdubWVudCwgbm90IGZpcnN0Ci0Jc2VjdGlvbiBhbGlnbm1lbnQuCi0KLTE5OTktMDEtMDQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTIuMSBvciBoaWdoZXIuCi0KLVR1ZSBEZWMgMjIgMTU6MjE6NDEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcmNodXJlcy5jIChiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4KTogIERlZmluZS4KLSAgICAgICAgKiBiZmQtaW4yLmg6ICBMaWtld2lzZS4KLSAgICAgICAgKiBjcHUtaTM4Ni5jIChiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCk6ICBOZXcuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jLGJmZC1pbjIuaCAoYmZkX21hY2hfbWlwczQxMTEpOiBOZXcuCi0JKiBjcHUtbWlwcy5jOiBBZGQgc3VwcG9ydCBmb3IgYW5kIGluZGVwZW5kZW50IDQxMTEuCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX21hY2gpOiBFX01JUFNfTUFDSF80MTExIC0+IGJmZF9tYWNoX21pcHM0MTExLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOgotCWJmZF9tYWNoX21pcHM0MTExIC0+IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTExLgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19hYmlfbmFtZSk6IE5ldy4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ29tcGFyZSBFRl9NSVBTX0FCSSBmbGFncy4KLQotMTk5OC0xMi0xMiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKToKLQlIYW5kbGUgYmZkX21hY2hfbWlwczQzMDAuCi0KLTE5OTgtMTItMTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmM6IFJlbW92ZSBsZWFrZWQgZGV2ZWxvcG1lbnQgY29kZSBmcm9tIHBhdGNoCi0JMTk5OC0xMi0xMCBieSBSaWNoYXJkIEhlbmRlcnNvbi4KLQotMTk5OC0xMi0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZmFpbCByZWxvY2F0aW9ucwotCWluIGRlYnVnIHNlY3Rpb25zIGZvciBzeW1ib2wgZGVmaW5lZCBleHRlcm5hbGx5LgotCi1UaHUgRGVjIDEwIDEwOjU4OjM4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZSBkdXBsaWNhdGUgZW50cnkgZm9yCi0JdGVraGV4X3ZlYy4KLQotMTk5OC0xMi0wOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9ob3d0b190YWJsZSk6IFNldCBzcmNfbWFzayBmaWVsZHMgdG8gMAotCXNpbmNlIHdlIGFyZSB1c2luZyBSRUxBcy4KLQotVHVlIERlYyAgOCAyMjoxNTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTQ08gT3BlbiBTZXJ2ZXIgUmVsZWFzZSA1IGNvcmUgZmlsZSBzdXBwb3J0LCBmcm9tIEpvdWtlIE51bWFuCi0JPGpudW1hbkBoaXNjb20ubmw+OgotCSogc2NvNS1jb3JlLmM6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChpWzM0NTZdODYtKi1zY28zLjJ2NSopOiBVc2Ugc2NvNS1jb3JlLmxvLgotCShzY281LWNvcmUubG8pOiBEZWZpbmUgU0NPNV9DT1JFIGluIENPUkVGTEFHLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShPUFRJT05BTF9CQUNLRU5EUyk6IEFkZCBzY281LWNvcmUubG8uCi0JKE9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBzY281LWNvcmUuYy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBzY281X2NvcmVfZGF0YSBmaWVsZCB0byB0ZGF0YS4KLQkqIHRhcmdldHMuYyAoc2NvNV9jb3JlX3ZlYyk6IEFkZCB0byB0YXJnZXQgbGlzdCBpZiBTQ081X0NPUkUuCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTk6Mzg6NDIgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgotCi0JKiBjb25maWcuYmZkIChocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19IRUFERVJfRElSRU5ULgotCShocHBhKi0qLW1wZWl4Kik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaG9zdCAoaHBwYSotKi1tcGVpeCopOiBOZXcgaG9zdC4KLQkqIGhwdXgtY29yZS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4gIFVzZSBIQVZFX0RJUkVOVF9IIGFuZAotCWZyaWVuZHMgcmF0aGVyIHRoYW4ganVzdCBpbmNsdWRpbmcgPHN5cy9kaXIuaD4uCi0JKiBzb20uaCAoc3RydWN0IHNvbV9zeW1ib2wpOiBBZGQgaHBwYV9wcml2X2xldmVsIGFuZCBhcHRvCi0JdGNfZGF0YS4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKHN0cnVjdCBzb21kYXRhKTogQWRkIGNvbXBfdW5pdCBmaWVsZC4KLQkob2JqX3NvbV9jb21waWxhdGlvbl91bml0KTogRGVmaW5lLgotCShiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml4KTogRGVjbGFyZS4KLQkqIHNvbS5jOiBDaGVjayBIT1NUX0hQUEFNUEVJWC4KLQkoc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvKTogQWRkIG5ldyBmaWVsZCBwcml2X2xldmVsLgotCShzb21fb2JqZWN0X3NldHVwKTogQWRkIGN1cnJlbnRfb2Zmc2V0IHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShzZXR1cF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShzb21fb2JqZWN0X3ApOiBGb3IgRVhFQ0xJQk1BR0lDLCByZWFkIHRoZSBsc3QgaGVhZGVyLgotCShzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MpOiBBZGQgY29tcGlsYXRpb25fdW5pdCBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBXcml0ZSBvdXQgY29tcGlsYXRpb25fdW5pdC4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFNldCBwcml2X2xldmVsLgotCShzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSk6IFNldCB4bGVhc3QgZmllbGQgdG8gMy4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBzeW1ib2wgcHJpdl9sZXZlbC4KLQkoYmZkX3NvbV9hdHRhY2hfY29tcGlsYXRpb25fdW5pdCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBTZXQgeGxlYXN0IGZpZWxkIHRvIDMuICBTZXQKLQlwcml2X2xldmVsIGludG8gc3ltYm9sX3ZhbHVlLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVR1ZSBEZWMgIDggMTY6MjE6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogQ2hhbmdlIGNhbGwgdG8gbm9uZXhpc3RlbnQKLQl3YXJuaW5nIGZ1bmN0aW9uIHRvIGNhbGwgX2JmZF9lcnJvcl9oYW5kbGVyIGluc3RlYWQuCi0KLQkqIGxpYmJmZC5jIChDT0VSQ0UzMik6IENhc3QgdGhyb3VnaCB1bnNpZ25lZCBsb25nIGFuZCBsb25nIHRvCi0JYXZvaWQgYnVnIGluIG9sZCB2ZXJzaW9uIG9mIGdjYy4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBSZW1vdmUuCi0JKGVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogRG9uJ3QgZGVmaW5lLgotCi0xOTk4LTEyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfZmluYWxfbGlua19yZWxvY2F0ZSk6IEZpeCBQQyByZWxhdGl2ZQotCXJlbG9jYXRpb25zIHRvIGluY2x1ZGUgb2Zmc2V0IG9mIDIgaW5jbHVkZWQgaW4gdGhlIGluc25zLCBhbmQgdGhlCi0Jb2Zmc2V0IG9mIHRoZSByZWxvY3Mgd2l0aGluIHRoZSBzZWN0aW9uLgotCi1XZWQgRGVjICAyIDE1OjAzOjU5IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBEYXZpZCBUYXlsb3IKLSAJPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiwgRWRpdGggRXBzdGVpbgotIAk8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+LCBKaW0gQmxhbmR5Ci0gCTxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4sIGFuZCBFbGVuYSBaYW5ub25pCi0gCTxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiB0aGUgcHJvamVjdCB0byBtZXJnZSBpbgotIAljaGFuZ2VzIG9yaWdpbmFsbHkgbWFkZSBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nCi0gCWVudHJpZXMuCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbHQgdXNpbmcgbGF0ZXN0Ci0gCWF1dG9tYWtlIG1hY3JvIGxpYnJhcnkuCi0KLQkqIGhwdXgtY29yZS5jIChocHV4X2NvcmVfY29yZV9maWxlX3ApOiB0aGlzIGZ1bmN0aW9uIG5vdwotIAl1bmRlcnN0YW5kcyBIUFVYIDEwLjMwIHRocmVhZCBpbmZvLiBZZXMsIHRoZSB0aHJlYWQgc3RhY2tzIGNhbiBiZQotIAlmb3VuZCBpbiB0aGUgY29yZWZpbGUhIEFsc28sIGluIGhwdXhfY29yZV9jb3JlX2ZpbGVfcCwgaWYgd2UKLSAJZW5jb3VudGVyIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZSwgZG9uJ3QgcHVudC4gIEluc3RlYWQsCi0gCWp1c3Qgc2tpcCBpdC4gIEFsc28sIGNvdW50IHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgb2Yga25vd24gdHlwZQotIAl0aGF0IHdlIGVuY291bnRlci4gIElmIHdlIGVuY291bnRlciBhdCBsZWFzdCBvbmUgZ29vZCBvbmUsIHRoZW4KLSAJd2UnbGwgZGVjbGFyZSB0aGF0IHRoZSBmaWxlIGlzIGEgY29yZSBmaWxlLiAgSWYgd2UgZW5jb3VudGVyIGFueQotIAl1bmtub3duIG9uZXMgYnV0IHNvbWUga25vd24gb25lcywgdGhlbiB3ZSdsbCBpc3N1ZSBhIHdhcm5pbmcgKGJ1dAotIAlzdGlsbCBkZWNsYXJlIGl0IHRvIGJlIGEgY29yZSBmaWxlKS4gQWxzbywgY29ycmVjdGx5IGRlY2lkZSB3aGVuIGEKLSAJZmlsZSBpcyBub3QgYSBjb3JlLgotCShQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCk6IGRlZmluZSBpZiBDT1JFX0FOT05fU0hNRU0gZGVmaW5lZC4KLQkoQ09SRV9BTk9OX1NITUVNKTogZGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShocHV4X2NvcmVfc3RydWN0KTogYWRkIG1lbWJlcnMgbHdwaWQgYW5kIHVzZXJfdGlkLgotCShjb3JlX2tlcm5lbF90aHJlYWRfaWQsIGNvcmVfdXNlcl90aHJlYWRfaWQpOiBuZXcgbWFjcm9zLgotCShtYWtlX2JmZF9hc2VjdGlvbik6IHVzZSBiZmRfYWxsb2MgdG8gYWxsb2NhdGUgcm9vbSBmb3IgYSBjb3B5IG9mCi0gCXRoZSBuYW1lIGJlZm9yZSBzdG9yaW5nIGl0IGluIHRoZSBiZmQuCi0JKGhwdXhfY29yZV9jb3JlX2ZpbGVfcCk6IGhhbmRsZSB0aHJlYWRzLgotCi0JKiBsaWJocHBhLmggKEdFVF9GSUVMRCk6IHByb3RlY3QgYWdhaW5zdCByZWRlZmluaXRpb24uCi0JKEhQUEFfV0lERSk6IGRlZmluZS4KLQkoR0VUX0ZJRUxEKTogZGVmaW5lLgotCShHRVRfQklUKTogZGVmaW5lLgotCShNQVNLKTogZGVmaW5lLgotCShDQVRFTkFURSk6IGRlZmluZS4KLQkoRUxFVkVOKTogZGVmaW5lLgotCShzaWduX2V4dGVuZCk6IHJlZGVmaW5lLgotCShhc3NlbWJsZV82KTogZGVmaW5lLgotCShhc3NlbWJsZV8xMik6IHJld3JpdGUuCi0JKGFzc2VtYmxlXzE2KTogZGVmaW5lLgotCShhc3NlbWJsZV8xNmEpOiBkZWZpbmUuCi0JKGFzc2VtYmxlXzE3KTogcmV3cml0ZS4KLQkoYXNzZW1ibGVfMjIpOiBkZWZpbmUuCi0KLTE5OTgtMTItMDcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYyAoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogVXNpbmcgc2lnbmVkCi0JcmVsb2NhdGlvbnMgZm9yIHNpZ25lZCB2YWx1ZXMuCi0KLVN1biBEZWMgIDYgMTY6MzA6MzMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzYnNkLmMgKE1ZKHNldF9hcmNoX21hY2gpKTogTWFrZSBzdGF0aWMuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEZvciBiZmRfYXJjaF9taXBzLCB1c2UKLQliZmRfbWFjaF9taXBzKiBtYWNyb3MgcmF0aGVyIHRoYW4gc2ltcGxlIG51bWJlcnMuCi0KLQlDT0ZGIHdlYWsgc3ltYm9sIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNYXJrIEVsYnJlY2h0Ci0JPHNub3diYWxsM0B1c2EubmV0PjoKLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSGFuZGxlIENfV0VBS0VYVC4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0pOiBMaWtld2lzZS4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFsd2F5cyBpbml0aWFsaXplIHRoZQotCWluY2x1ZGVzX3BoZHJzIGZpZWxkLgotCi0JKiBlbGZsaW5rLmggKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogQ2hlY2sgZm9yIGNhc2Ugd2hlcmUgYSBub24tRUxGCi0JZmlsZSBkZWZpbmVzIGEgc3ltYm9sIGZpcnN0IG1lbnRpb25lZCBpbiBhbiBFTEYgZmlsZS4KLQotCSogYmZkLWluLmg6IEFsd2F5cyBkZWZpbmUgQkZEX0hPU1RfNjRfQklUIGFuZCBCRkRfSE9TVF9VXzY0X0JJVCBpZgotCXBvc3NpYmxlLCByYXRoZXIgdGhhbiBvbmx5IGlmIEJGRDY0LgotCSogZWxmbGluay5oIChjb21wdXRlX2J1Y2tldF9jb3VudCk6IEp1c3QgY2hlY2sgQkZEX0hPU1RfVV82NF9CSVQsCi0Jbm90IF9fR05VQ19fLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDb3JyZWN0IHRlc3QgdG8gYXZvaWQKLQlzd2l0Y2hpbmcgdG8gNCBieXRlIGFkZHJlc3NlcyBhZnRlciBzZWVpbmcgYSBzZWNvbmQgc2VjdGlvbiB3aGljaAotCXJlcXVpcmVzIDMgYnl0ZSBhZGRyZXNzZXMuICBGcm9tIEpvZWwgU2NoYW50egotCTxqb2VsLnNjaGFudHpAYXJnb3N5cy5ib2VpbmcuY29tPi4KLQotCSogY29uZmlnLmJmZCAobTY4Ki0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBBeW1lcmljIFZpbmNlbnQKLQk8YXltZXJpYy52aW5jZW50QGVtaS51LWJvcmRlYXV4LmZyPi4KLQotMTk5OC0xMi0wNCAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRml4IGxvZ2ljIHRvCi0JZGVjaWRlIHdoZXRoZXIgdGhlIG91dHB1dCBmaWxlIGlzIC1tcmVsb2NhdGFibGUtbGliLAotCS1tcmVsb2NhdGFibGUsIG9yIG5laXRoZXIuICAoZ2RiLmJhc2Uvbm9kZWJ1Zy5leHApCi0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWZyMzAuYzogQWRkIHN1cHBvcnQgZm9yIFJfRlIzMF80OCByZWxvYy4KLQkqIHJlbG9jLmM6IEFkZCBCRkRfUkVMT0NfRlIzMF80OCByZWxvY2F0aW9uLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUKLQotV2VkIERlYyAgMiAwMDo1ODozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFdhcm4gb24gYW4gYXR0ZW1wdCB0bwotCWxpbmsgYWdhaW5zdCBhIGR5bmFtaWMgc3ltYm9sIHdpdGggbm8gdHlwZSBvciBzaXplLgotCi0xOTk4LTEyLTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChpMzg2X2NoZWNrX3JlbG9jcykgW1JfMzg2XzMyXTogRG9uJ3QgZW1pdAotCXJlbG9jYXRpb24gZm9yIHNlY3Rpb24gd2hpY2ggZG9lcyBub3QgZ2V0IGxvYWRlZC4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbikgW1JfMzg2XzMyXTogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgIDEgMTE6MzM6MzMgMTk5OCAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTWFrZSByZWxvY19zaXplLAotCXJlbG9jX2NvdW50IGFuZCBpIGxvbmcgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLiAgSGFuZGxlIGVycm9yCi0JcmV0dXJuIGZyb20gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQotMTk5OC0xMi0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGV0ZWN0IHRoZSBhYnNlbmNlIG9mCi0JYSBoYXNoIHRhYmxlLgotCi1Nb24gTm92IDMwIDE1OjI4OjA5IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZWxmMzItc2guYyAoZWxmL3NoLmgpOiBJbmNsdWRlLgotCXNoX3JlbG9jX3R5cGU6IERlbGV0ZS4gIENoYW5nZWQgYWxsIHJlZmVyZW5jZXMgdG8gZWxmX3NoX3JlbG9jX3R5cGUuCi0JKHNoX2VsZl9ob3d0b190YWIpOiBBZGQgSE9XVE8gZm9yIFJfU0hfU1dJVENIOC4KLQkoc2hfcmVsb2NfbWFwKTogTWFwIEJGRF9SRUxPQ184X1BDUkVMIHRvIFJfU0hfU1dJVENIOC4KLQkoc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEhhbmRsZSBSX1NIX1NXSVRDSDguCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY3kgb2YgZWxmMzItc2gubG8gb24gJChJTkNESVIpL2VsZi9zaC5oLgotCi1GcmkgTm92IDI3IDE3OjUxOjM4IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZmxpbmsuaCAoY29tcHV0ZV9idWNrZXRfY291bnQpOiBEb24ndCBhbGxvdyBtaW5zaXplPT0wLCBpdAotCWNhdXNlcyBkaXZpc2lvbiBieSB6ZXJvIGxhdGVyIG9uLgotCi1UaHUgTm92IDI2IDExOjE5OjM1IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9wYzlfcmVsb2MsZnIzMF9lbGZfcGMxMl9yZWxvYyk6IE5vdAotCW5lZWRlZC4KLQotMTk5OC0xMS0yNSAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChpM2NvZmZfb2JqZWN0X3ApOiBSZW1vdmUgaGFjay4gIFVzZSBuZXcgZW11bGF0aW9uCi0JaG9vayBub3cuCi0KLVR1ZSBOb3YgMjQgMTA6MjU6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2FsbAotCWZyMzBfZmluYWxfbGlua19yZWxvY2F0ZS4KLQkoZnIzMF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgSTIwIGFuZCBJMzIKLQlyZWxvY3MuCi0JKGZyMzBfZWxmX2kzMl9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIEkzMiByZWxvY3MuCi0JKGZyMzBfZWxmX3BjOV9yZWxvYyk6IE5ldyBmdW5jdGlvbjogSGFuZGxlIDlfUENSRUwgcmVsb2NzLgotCShmcjMwX2VsZl9wYzEyX3JlbG9jKTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUgMTJfUENSRUwgcmVsb2NzLgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXNldCBoaTE2cyByZWxvYwotCWNoYWluIHRvIGVtcHR5LgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIGFyZSBiYXNlZCBvbiBhIHBhdGNoIHN1Ym1pdHRlZCBieSBHaWFubHVjYQotCU1vcm8gPGdsY3RyQGFiYy5pdD46Ci0KLQkodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogT25seSB1cGRhdGUgYSBoaTE2cyByZWxvYyBpZiBpdCBoYXMKLQlub3QgYWxyZWFkeSBiZWVuIHVwZGF0ZWQuCi0JKGZpbmRfcmVtZW1iZXJlZF9oaTE2c19yZWxvYyk6IE5ldyBwYXJhbWV0ZXIgJ2FscmVhZHlfZm91bmQnCi0JcmV0dXJucyBzdGF0ZSBvZiByZW1lbWJlcmVkIGhpMTZzIHJlbG9jLgotCShyZW1lbWJlcl9oaTE2c19yZWxvYyk6IFNldCAnZm91bmQnIGZpZWxkIHRvIGZhbHNlLgotCShoaTE2c19sb2NhdGlvbik6IEFkZCAnZm91bmQnIGZpZWxkLgotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGJmZF9wZV9kbGxfbm90X3JlY29nbml6ZWRfaGFjayk6IHRoZSBsaW5rZXIgd2FudHMKLQl0byBzZWUgLkRMTCBmaWxlcyBhcyB1bnJlY29nbml6ZWQuCi0JKGkzY29mZl9vYmplY3RfcCk6IFNvcnJ5LCBoYWQgdG8gaGFjayBpdCB0byBub3QgcmVjb2duaXplIHRoZXNlCi0JZmlsZXMgKHBlaS1pMzg2KSBvbiByZXF1ZXN0LgotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogb3BuY2xzLmMgKGJmZF9tYWtlX3JlYWRhYmxlKTogbmVlZCBtb3JlIGNsZWFudXAgZm9yIHN5bWJvbHMgYW5kCi0JcmVsZW50cy4gIENhbGwgYmZkX2NoZWNrX2Zvcm1hdCB0byByZWluaXRpYWxpemUuCi0KLUZyaSBOb3YgMjAgMTQ6MjE6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZnIzMC5jIChmcjMwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHNwdXJpb3VzCi0Jd2FybmluZ3MuCi0KLVRodSBOb3YgMTkgMTQ6NDI6MTUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogcmVnZW5lcmF0ZQotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBOb3YgMTcgMjA6MjM6MzUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2dGFibGVfZW50cmllc19zaXplLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2xlYXIgaXQuCi0JKiBlbGZsaW5rLmggKGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCk6IENvcHkgaXQsIGFuZAotCXJlc3BlY3QgaXQgYXMgYW4gdXBwZXIgYm91bmQgb24gd2hhdCBtZW1vcnkgdG8gcmVmZXJlbmNlLgotCShlbGZfZ2Nfc21hc2hfdW51c2VkX3Z0ZW50cnlfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IEhhbmRsZSBhcy15ZXQgdW5kZWZpbmVkIHZ0YWJsZXMuICBTZXQgYW5kCi0JdXBkYXRlIHZ0YWJsZV9lbnRyaWVzX3NpemUgYXBwcm9wcmlhdGVseS4KLQotVHVlIE5vdiAxNyAxNToyODozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1mcjMwLmMgKGZyMzBfcmVsb2NfdHlwZV9sb29rdXApOiBVc2VkIGludGVnZXJzIHRvIGhvbGQKLQlyZWxvYyBudW1iZXIuCi0KLU1vbiBOb3YgMTYgMjI6MTk6MjEgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0pOiBzdXBwb3J0IEJGRF9JTl9NRU1PUlkKLSAJYmZkczsgdGhleSBoYXZlIG5vICJmaWxlIiBzbyB3ZSBmYWtlIGl0LgotCSogYmZkLWluMi5oOiBhZGQgYmZkX21ha2Vfd3JpdGFibGUgYW5kIGJmZF9tYWtlX3JlYWRhYmxlIChyZWdlbikKLQkqIGxpYmJmZC5jIChiZmRfd3JpdGUpOiBBbGxvdyB3cml0aW5nIHRvIEJGRF9JTl9NRU1PUlkgYmZkcyBieQotIAlyZXNpemluZyB0aGUgbWVtb3J5IGJ1ZmZlci4KLQkqIG9wbmNscy5jIChiZmRfbWFrZV93cml0YWJsZSk6IE5ldyBmdW5jdGlvbjsgbGV0cyB5b3Ugd3JpdGUgYQotIAliZmRfY3JlYXRlJ2QgYmZkIHRvIGFuIGluLW1lbW9yeSBidWZmZXIuCi0JKGJmZF9tYWtlX3JlYWRhYmxlKTogTmV3IGZ1bmN0aW9uOyBsZXRzIHlvdSByZWFkIGJhY2sgdGhhdCBidWZmZXIKLSAJYXMgaWYgaXQgd2VyZSBmcm9tIGJmZF9vcGVuci4gIFVzZWQgdG8gYnVpbGQgZ2VuZXJhdGVkIGFyY2hpdmUKLSAJbWVtYmVycyAod2luc3VwJ3MgbGQncyBkbGx0b29sKQotCi1Nb24gTm92IDE2IDE5OjE1OjE5IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vYmZkLnBvdDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBOb3YgMTYgMTA6NTc6MDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChoaTE2c19sb2NhdGlvbik6IFJlcGxhY2VkIGZpeGVkIHNpemUgYXJyYXkgd2l0aAotCWxpbmtlZCBsaXN0LgotCi1TdW4gTm92IDE1IDIwOjI4OjI1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBTZWFyY2ggZm9yIHRoZSBwcm9wZXIKLQllbGVtZW50IG9mIHRoZSBnb3RlbnRyeSBsaXN0IGZvciBsb2NhbCBzeW1ib2xzIHRvby4KLQkoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFVuaWZ5IGxvY2FsIGFuZCBnbG9iYWwgaGFuZGxpbmcuCi0JQXNzZXJ0IHRoYXQgZ290ZW50LT51c2VfY291bnQgPiAwLgotCi1TYXQgTm92IDE0IDE1OjE2OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluICh2bXNfYWxwaGFfdmVjKTogUmVuYW1lIGZyb20gZXZheF9hbHBoYV92ZWMsIGFuZAotCXVwZGF0ZSBmb3IgZmlsZSBuYW1lIGNoYW5nZXMgb2YgSnVseSAyLCAxOTk4LgotCSh2bXNfdmF4X3ZlYyk6IE5ldy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE5vdiAxMiAxOToxOTo1NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2JmZC5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDEwIDE2OjE3OjA2IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNCwgY29uZmlnLmJmZDogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotVHVlIE5vdiAxMCAxNToxMzo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIGJmZF9hcmNoX2ZyMzAuCi0KLVR1ZSBOb3YgMTAgMTM6Mzc6MzYgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBhY2luY2x1ZGUubTQgKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKLSAJQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUik6IGRpZG4ndCBkZWZpbmUgbWFjcm8gd2hlbiB2YWx1ZQotIAl3YXMgY2FjaGVkLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiByZWdlbmVyYXRlZC4KLQotVHVlIE5vdiAxMCAxNDozMTowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLWQxMHYuYyAocmVsb2NfdHlwZSk6ICBBZGQgUl9EMTBWX0dOVV9WVElOSEVSSVQgYW5kCi0gICAgICAgIFJfRDEwVl9HTlVfVlRFTlRSWSByZWxvY3MuCi0gICAgICAgIChlbGZfZDEwdl9ob3d0b190YWJsZSk6ICBMaWtld2lzZS4KLSAgICAgICAgKGQxMHZfcmVsb2NfbWFwIGQxMHZfcmVsb2NfbWFwKTogIExpa2V3aXNlLgotICAgICAgICAoZWxmMzJfZDEwdl9nY19tYXJrX2hvb2spOiAgTmV3LgotICAgICAgICAoZWxmMzJfZDEwdl9nY19zd2VlcF9ob29rKTogIE5ldy4KLSAgICAgICAgKGVsZjMyX2QxMHZfY2hlY2tfcmVsb2NzKTogIE5ldy4KLSAgICAgICAgKGVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbik6ICBOZXcuCi0gICAgICAgIChlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogIERlZmluZS4KLSAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLVNhdCBOb3YgIDcgMTg6MDc6NTEgMTk5OCAgUGV0ZXIgU2NoYXVlciAgPHBldGVyLnNjaGF1ZXJAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4KLQotCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogTW92ZSB2bXMgZmlsZXMgaGVyZS4uLgotCShCRkQ2NF9CQUNLRU5EUyk6IC4uLmZyb20gaGVyZS4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogTW92ZSB2bXMgZmlsZXMgaGVyZS4uLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiAuLi5mcm9tIGhlcmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIE5vdiAgNCAxNTo1ODo0OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogQWRkIEZSMzAgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IEFkZCBGUjMwIHRhcmdldC4KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwLgotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yIEZSMzAuCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBGUjMwLgotCSogcmVsb2MuYzogQWRkIHN1cHBvcnQgZm9yIEZSMzAgcmVsb2NhdGlvbnMuCi0JKiB0YXJnZXRzLmM6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHJlbG9jYXRpb25zLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogbGliYmZkLmg6ICBSZWdlbmVyYXRlLgotCSogY3B1LWZyMzAuYzogTmV3IGZpbGUuCi0JKiBlbGYzMi1mcjMwLmM6IE5ldyBmaWxlLgotCi1Nb24gTm92ICAyIDE0OjU5OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1TdW4gTm92ICAxIDE5OjMyOjI4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogRG8gbm90IHVzZSBhbGxvY2EsCi0JdXNlIGJmZF9tYWxsb2MgYW5kIGZyZWUgaW5zdGVhZCBhbmQgY2hlY2sgcmV0dXJuIHZhbHVlIGZyb20gYmZkX21hbGxvYy4KLQotU3VuIE5vdiAgMSAxNjoyMDozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzKTogQ29tbWVudCBvdXQuCi0JKFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUyk6IExpa2V3aXNlLgotCShNSVBTX1RFWFRfRFlOU1lNX1NFQ04pOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHNoX2luZm8gZmllbGQgb2YgYSAuaGFzaAotCXNlY3Rpb24uCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBSZW1vdmUgZHluc3ltX3NlY19zdHJpbmRleAotCWZpZWxkLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRG9uJ3QgaW5pdGlhbGl6ZQotCWR5bnN5bV9zZWNfc3RyaW5kZXguCi0JKG1pcHNfZWxmX2djX21hcmtfaG9vayk6IEFkZCBkZWZhdWx0IGNhc2UgdG8gYXZvaWQgd2FybmluZy4KLQkobWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogR2VuZXJhdGUgYSBzZWN0aW9uIHN5bWJvbCBmb3IKLQlldmVyeSBvdXRwdXQgc2VjdGlvbi4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBDb3VudCBhbGwgc2VjdGlvbnMgZm9yCi0JRFRfTUlQU19VTlJFRkVYVE5PLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IFVzZSBkeW5hbWljIHN5bWJvbHMgZm9yIGFsbAotCW91dHB1dCBzZWN0aW9ucy4KLQotU3VuIE5vdiAgMSAxMjo0Njo1MyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBBbGxvY2F0ZSB0d28gc2xvdHMKLQlmb3IgbGF0ZXIgUExUIGVudHJpZXMgaW4gbGFyZ2UgUExUcy4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBBbGxvdyBmb3IgdGhlIGV4dHJhIHNsb3RzLgotCi1TYXQgT2N0IDMxIDIwOjEwOjA5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2FkX3NlY3Rpb24pOiBGaXggdHlwby4KLQotMTk5OC0xMC0yNiAxNTo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkIGVsZl9oYXNoX3ZhbHVlLgotCSogZWxmbGluay5oIChlbGZfY29sbGVjdF9oYXNoX2NvZGVzKTogTmV3IGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcwotCWNhbGxlZCBmb3IgZWFjaCBleHBvcnRlZCBzeW1ib2wgYW5kIHdlIGNvbXB1dGUgdGhlIEVMRiBoYXNoIHZhbHVlIGZvcgotCWl0LgotCShjb21wdXRlX2J1Y2tldF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4gIEl0IGlzIGNhbGxlZCBmcm9tCi0Jc2l6ZV9keW5hbWljX3NlY3Rpb25zIHRvIGRldGVybWluZSB0aGUgaGFzaCB0YWJsZSBzaXplLiAgV2hlbiB3ZSBhcmUKLQlvcHRpbWl6aW5nIGEgYmV0dGVyLCBidXQgc2xvd2VyLCBhbGdvcml0aG0gaXMgdXNlZC4KLQkoc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBjb21wdXRlX2J1Y2tldF92YWx1ZS4KLQotCSogZWxmLmMgKGJmZF9lbGZfaGFzaCk6IE9wdGltaXplIHRoZSBoYXNoIGZ1bmN0aW9uIGEgYml0LgotCi1Nb24gT2N0IDE5IDIwOjAzOjIxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItc2guYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX1NIX0dOVV9WVElOSEVSSVQgYW5kCi0gICAgICAgIFJfU0hfR05VX1ZURU5UUlkuCi0gICAgICAgIChzaF9lbGZfZ2NfbWFya19ob29rKTogIE5ldy4KLSAgICAgICAgKHNoX2VsZl9nY19zd2VlcF9ob29rKTogIE5ldy4KLSAgICAgICAgKHNoX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgotICAgICAgICAoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogIERlZmluZS4KLQotTW9uIE9jdCAxOSAxNjo1NzowNSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogdW5kbyBwcmV2aW91cyBnZXR0ZXh0IGNoYW5nZQotCSogYWNsb2NhbC5tNDogcmVidWlsZCB3aXRoIHJpZ2h0IHZlcnNpb24gb2YgYWNsb2NhbC4KLQotTW9uIE9jdCAxOSAwMTo0NzoyMSAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNCwgYWNsb2NhbC5tNDogbW92ZSBnZXR0ZXh0LXJlbGF0ZWQgZnJhZ21lbnRzIGZyb20KLSAJYWNsb2NhbC5tNCB0byBhY2luY2x1ZGUubTQsIHNvIHRoZXkgZG9uJ3QgZ2V0IGxvc3QuCi0KLQkqIGVsZmNvcmUuaDogcmV3cml0ZSBmb3IgYmV0dGVyIGNvcmVmaWxlIHN1cHBvcnQuCi0JKiBlbGYuYyAoZWxmY29yZV8qKTogbmV3IGZ1bmN0aW9ucy4KLQkqIGVsZi1iZmQuaCAoZWxmX29ial90ZGF0YSk6IG5ldyBzdHJ1Y3R1cmUgbWVtYmVycy4KLQkqIGFjY29uZmlnLmgsIGFjaW5jbHVkZS5tNCwgY29uZmlndXJlLmluOiBhZGQgZmVhdHVyZS10ZXN0cyBmb3IKLSAJZmxhdm9yIG9mIHByb2Nmcy4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZy5pbiwgY29uZmlndXJlLCBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZWQuCi0KLUZyaSBPY3QgMTYgMTQ6MDc6NDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1tMzJyLmM6ICBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9NMzJSX0dOVV9WVElOSEVSSVQKLSAgICAgICAgYW5kIFJfTTMyUl9HTlVfVlRFTlRSWS4KLSAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0gICAgICAgIChtMzJyX2VsZl9jaGVja19yZWxvY3MpOiAgTmV3LgotICAgICAgICAobTMycl9lbGZfZ2NfbWFya19ob29rKTogIE5ldy4KLSAgICAgICAgKG0zMnJfZWxmX2djX3N3ZWVwX2hvb2spOiAgTmV3LgotICAgICAgICAobTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbik6ICBIYW5kbGUgVlQgcmVsb2NzLgotCi1Nb24gT2N0IDEyIDE0OjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFybV9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlIHJlZHVuZGFudCB0ZXN0LgotCi0JKiBiZmQtaW4yLmggKHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBJbXByb3ZlIGNvbW1lbnQgdG8gbWFrZQotCWNsZWF0IHRoYXQgdGhlICdiaXRzaXplJyBmaWVsZCBpcyB0aGUgc2l6ZSBvZiB0aGUgYml0ZmllbGQgQUZURVIKLQlyZWxvY2F0aW9uIG5vdCBiZWZvcmUuCi0KLQkqIGVsZjMyLW0zMnIuYyAoUl9NMzJSXzE4X1BDUkVMKTogRml4IHNpemUgb2YgYml0ZmllbGQuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX2hpKTogQ29wZSB3aXRoIG1pc3NpbmcgcmVmaGkgb3IgcmVmbG8KLQlyZWxvY3MuCi0KLVR1ZSBPY3QgIDYgMDk6MjA6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1zcGFyYy5jOiAgQWRkIEhPV1RPIGVudHJpZXMgZm9yIFJfU1BBUkNfR05VX1ZUSU5IRVJJVCBhbmQKLSAgICAgICAgUl9TUEFSQ19HTlVfVlRFTlRSWS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgdGhlbS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwKTogIExpa2V3aXNlLgotICAgICAgICAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6ICBMaWtld2lzZS4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2djX21hcmtfaG9vayk6ICBOZXcuCi0gICAgICAgIChlbGYzMl9zcGFyY19nY19zd2VlcF9ob29rKTogIE5ldy4KLQotTW9uIE9jdCAgNSAxNDo1NTozMCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fZmluaXNoX3dyaXRpbmcpOiBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyB3aGVuCi0Jd3JpdGluZyBhbiBleGVjdXRhYmxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCi1Nb24gT2N0ICA1IDEyOjAyOjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjEuYyA6IE5ldyBmaWxlLiAgQWRkcyBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZS4KLQkqIGNvbmZpZ3VyZS5pbiAoZWxmKTogQWRkIGR3YXJmMS5sby4KLQkqIGVsZl9iZmQuaCAoZWxmX29iX3RkYXRhKTogQWRkIGR3YXJmMV9maW5kX2xpbmVfaW5mby4KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IEFkZCBjYWxsIHRvCi0JX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOgotCUFkZCBjYWxsIHRvIF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gT2N0ICA1IDEwOjA2OjIyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmbGluay5oIChlbGZfZ2Nfc2VjdGlvbnMpOiAgRG8gbm90IGFsbG93IGdhcmJhZ2UKLSAgICAgICAgY29sbGVjdGlvbiBpZiBkeW5hbWljIHNlY3Rpb25zIGhhdmUgYmVlbiBjcmVhdGVkLgotCi1Nb24gT2N0ICA1IDA5OjA3OjM3IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmMzItdjg1MC5jOiBBZGQgSE9XVE8gZW50cmllcyBmb3IgUl9WODUwX0dOVV9WVElOSEVSSVQgYW5kCi0gICAgICAgIFJfVjg1MF9HTlVfVlRFTlRSWS4KLSAgICAgICAgKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6ICBIYW5kbGUgVlRJTkhFUklUIGFuZCBWVEVOVFJZIHJlbG9jcy4KLSAgICAgICAgKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBMaWtld2lzZS4KLSAgICAgICAgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTGlrZXdpc2UuCi0gICAgICAgICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogIExpa2V3aXNlLgotICAgICAgICAodjg1MF9lbGZfZ2Nfc3dlZXBfaG9vayk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKHY4NTBfZWxmX2djX21hcmtfaG9vayk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6ICBEZWZpbmUuCi0KLU1vbiBPY3QgIDUgMDk6MDQ6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiAgRG9uJ3QgYXNzdW1lCi0gICAgICAgIHRoYXQgZHlub2JqIGV4aXN0cy4KLQotU3VuIE9jdCAgNCAyMzoyOTozNCAxOTk4ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOgotCURlY2xhcmUgc2l6ZSBhcyBiZmRfc2l6ZV90eXBlLgotCShyczYwMDBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVjbGFyZSBjb3VudCBhcyBiZmRfc2l6ZV90eXBlLgotCi1TdW4gT2N0ICA0IDIwOjM4OjI5IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY3B1LWhwcGEuYyAoYmZkX2hwcGEyMF9hcmNoKTogRGVmaW5lLiAgTGluayBpdCBpbnRvIHRoZSBiZmRfaHBwYV9hcmNoCi0Jc3RydWN0dXJlLgotCSogc29tLmMgKENQVV9QQV9SSVNDMl8wKTogRGVmaW5lLgotCShfUEFfUklTQzJfMF9JRCk6IExpa2V3aXNlLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBVc2UgQ1BVX1BBX1JJU0MyXzAgZm9yIHRoZSBzeXN0ZW1faWQgYXMgbmVlZGVkLgotCi1TdW4gT2N0ICA0IDIxOjE5OjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBXaGVuIGEgdmVyc2lvbmVkIHN5bWJvbAotCWhhcyBhIGJhc2Ugd2hpY2ggaXMgYWxyZWFkeSBkZWZpbmVkLCBvbmx5IGFkZCB0aGUgcmVmZXJlbmNlZAotCXN5bWJvbCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgaWYgaXQgaXMgZGVmaW5lZCBvciByZWZlcmVuY2VkCi0JYnkgYSByZWd1bGFyIGZpbGUuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBIYW5kbGUgdnRhYmxlIHJlbG9jcwotCWNvcnJlY3RseS4KLQotMTk5OC0wOS0yNyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLSAgICAgICAgKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFVuZG8gbGFzdCBjaGFuZ2UuCi0KLVdlZCBTZXAgMjMgMTY6MDk6MzEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgcmVjb3JkIGEgZHluYW1pYwotICAgICAgICBzeW1ib2wgZm9yIHRoZSBpbmRpcmVjdCBhbGlhcyB0byBhIHZlcnNpb25lZCBzeW1ib2wuCi0KLU1vbiBTZXAgMjEgMTI6MTU6MjIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1pMzg2LmMgKGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvKTogTmV3LgotICAgICAgICAoZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvKTogTmV3LgotICAgICAgICAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiAgUmV0dXJuIGVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bwotICAgICAgICBvciBlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0byAgb24gbG9va3VwLgotCi1TdW4gU2VwIDIwIDAwOjQ4OjA3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmM6IEluY2x1ZGUgImVsZi9tNjhrLmgiLiAgUmVtb3ZlIGRlZmluaXRpb24gb2YgZW51bQotCXJlbG9jX3R5cGUuICBSZW5hbWUgUl82OEtfX21heCB0byBSXzY4S19tYXguCi0JKGhvd3RvX3RhYmxlKTogVXNlIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4gZm9yIGEgVlRFTlRSWQotCXJlbG9jLgotCi1TdW4gU2VwIDIwIDAwOjA5OjI1IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0YjMyKTogUmV3cml0ZSBleHByZXNzaW9uIHRvIGdldCBiZXR0ZXIgY29kZS4KLQkoYmZkX2dldGwzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfZ2V0bF9zaWduZWRfMzIpOiBMaWtld2lzZS4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogQ2FzdCB0byBiZmRfdm1hIGJlZm9yZSBzaGlmdGluZywgbm90Ci0JYWZ0ZXIuCi0KLVNhdCBTZXAgMTkgMjI6NDI6MjMgMTk5OCAgRG91ZyBSYWJzb24gIDxkZnJAbmxzeXN0ZW1zLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBFbnN1cmUgdGhhdCB0aGUgd2FybmluZwotCW1lc3NhZ2UgaGFzIGEgbnVsbCBieXRlIHRlcm1pbmF0b3IuCi0KLUZyaSBTZXAgMTggMTQ6MzU6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24pOiBJZ25vcmUgY29udGVudHMgb2YKLQl3b3JkIHN1YmplY3QgdG8gUl9WODUwXzMyIHJlbG9jYXRpb24uCi0KLVRodSBTZXAgMTcgMTc6MjA6MzYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmM6IEFkZCBjb21tZW50IGRlc2NyaWJpbmcgcHJvYmxlbSBjb21wdXRpbmcgbGluZSBudW1iZXJzCi0JZm9yIHVuZGVmaW5lZCBzeW1ib2xzIGF0IGxpbmsgdGltZS4KLQotVGh1IFNlcCAxNyAxNjowMzoyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0gICAgICAgICogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QKLSAgICAgICAgdHJhbnNmb3JtIGEgZGVmd2VhayBpbnRvIGEgcGx0IGVudHJ5LgotICAgICAgICAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBBbGxvdyByb29tIGZvciBzZWNvbmRhcnkKLSAgICAgICAgcGx0IGVudHJ5IHJlZmVyZW5jZXMgdG8gcmVjZWl2ZSBhIFJFTEFUSVZFIHJlbG9jLgotICAgICAgICAoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRmlsbCB0aGVtIGluLgotICAgICAgICAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEFzc2VydCB3ZSBkb24ndCBvdmVycnVuCi0gICAgICAgIHRoZSBhbGxvY2F0ZWQgcmVsb2NhdGlvbiBzcGFjZS4KLQotV2VkIFNlcCAxNiAxODowMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IEFsd2F5cyB0cmVhdCBzZWN0aW9uIHN5bWJvbHMgYXMKLQlzcGVjaWFsLCBldmVuIGlmIHRoZXkgYXJlIGF0dGFjaGVkIHRvIGEgY29tbW9uIHNlY3Rpb24uCi0KLVdlZCBTZXAgMTYgMTA6MzQ6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IE1vdmUgc3ltYm9scyBpbgotCXNlY3Rpb25zIHdpdGggdjg1MCBjb21tb24gc2VjdGlvbiBhdHRyaWJ1dGVzIGludG8gbmFtZWQgdjg1MAotCWNvbW1vbiBzZWN0aW9ucy4KLQkodjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rKTogTW92ZSBzeW1ib2xzIGluIHNlY3Rpb25zIHdpdGggdjg1MAotCWNvbW1vbiBzZWN0aW9uIGF0dHJpYnV0ZXMgaW50byBuYW1lZCB2ODUwIGNvbW1vbiBzZWN0aW9ucy4KLQotV2VkIFNlcCAxNiAxMToyNjo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2djX21hcmtfaG9vayk6ICBSZW1vdmUgcHJpbnQKLSAgICAgICAgc3RhdGVtZW50LgotCi0xOTk4LTA5LTE1ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmV2ZXJzZSBvdXRwdXRfb2Zmc2V0Ci0JcGFydCBvZiBWbGFkaW1pcidzIGNoYW5nZSBvZiAxOTk4LTA4LTE5LiAgTWFrZSBhIFJfUFBDX1NEQVJFTDE2Ci0JcmVsb2MgdG8gdGhlIHdyb25nIHNlY3Rpb24gYSB3YXJuaW5nLCBub3QgYW4gZXJyb3IuICAuZHluc2JzcwotCWlzIG5vdCBhbiBvdXRwdXQgc2VjdGlvbiwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBmb3IgaXQuCi0KLVR1ZSBTZXAgMTUgMTI6NDA6MDUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZi1iZmQuaDogIEFkZCBhcmd1bWVudCB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0KLVR1ZSBTZXAgMTUgMDg6MzQ6NDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIFBhc3MgdHlwZSB0byBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUuCi0gICAgICAgKiBlbGYzMi1hcm0uYzogIEFkZCBIT1dUTyBlbnRyaWVzIGZvciBSX0FSTV9HTlVfVlRJTkhFUklUIGFuZAotICAgICAgIFJfQVJNX0dOVV9WVEVOVFJZLgotICAgICAgIChlbGYzMl9hcm1fZ2NfbWFya19ob29rKTogTmV3LgotICAgICAgIChlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2NoZWNrX3JlbG9jcyk6IE5ldy4KLSAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgSGFuZGxlIFZUSU5IRVJJVCBhbmQgVlRFTlRSWQotICAgICAgIHJlbG9jYXRpb25zLgotICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBWVElOSEVSSVQgYW5kIFZURU5UUlkKLSAgICAgICByZWxvY2F0aW9ucy4KLQotMTk5OC0wOS0xMCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotICAgICAgICAqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBkeW5vYmogaXMgTlVMTCwKLSAgICAgICAgYXNzdW1lIHRoZXJlIGlzIG5vIFBMVCBvciBHT1QuCi0KLVdlZCBTZXAgIDkgMTQ6MjQ6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmMgKGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZSk6IE5ldyBmdW5jdGlvbjogIGp1c3QKLQlsaWtlIF9lbGZfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkgZXhjZXB0IHRoYXQgU1RUX0FSTV9URlVOQyBpcwotCWFsc28gYWNjZXB0ZWQgYXMgYSBmdW5jdGlvbiBzeW1ib2wgdHlwZS4KLQotTW9uIFNlcCAgNyAxMzoyNDowMyAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKF9MT05HX0xPTkcpOiAgRGVmaW5lIGZvciBBSVggNC54IG9ubHkuCi0KLVNhdCBTZXAgIDUgMjA6NDA6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9ub2xpbmtfYmZkX2djX3NlY3Rpb25zKTogQ29ycmVjdCBkZWZpbml0aW9uIHRvCi0JbWF0Y2ggZGVmaW5pdGlvbiBvZiBfYmZkX2djX3NlY3Rpb25zIGZpZWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLUZyaSBTZXAgIDQgMTM6NTQ6MjMgMTk5OCAgRGF2aWQgTWlsbGVyICA8ZGF2ZW1AZG0uY29iYWx0bWljcm8uY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUHJvcGVybHkgYWRqdXN0Ci0JdGhlIGFkZGVuZCBvZiBhIGR5bmFtaWMgcmVsb2NhdGlvbiByZWZlcmVuY2luZyBhIHNlY3Rpb24uCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpeCB0aGUgUExUIHJlbG9jYXRpb24gb2Zmc2V0LgotCi1UaHUgU2VwICAzIDE3OjI4OjUwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoYmZkX2VsZk5OX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFZlcmlmeSB0aGF0IHRoZQotCWJlZCBoYXMgYSBzaXplX2R5bmFtaWNfc2VjdGlvbnMgcm91dGluZSBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdC4KLQotTW9uIEF1ZyAzMSAxNDo0OToyMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2dudV92dGVudHJ5X2hvd3RvKTogVXNlCi0JX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbi4KLQotTW9uIEF1ZyAzMSAxMDoyMzo0MCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtOiAgQWRkIGVsZjMyLWFybS5jLgotICAgICAgICAqIE1ha2VmaWxlLmluOiAgUmVidWlsZC4KLSAgICAgICAgKiBlbGYtYmZkLmg6ICBBZGQgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotICAgICAgICAqIGVsZi5jIChzd2FwX291dF9zeW1zKTogIElmIGRlZmluZWQsIGNhbGwKLSAgICAgICAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotICAgICAgICAqIGVsZjMyLWFybS5jOiBEZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotICAgICAgICAoZWxmMzJfYXJtX2dldF9zeW1ib2wtdHlwZSk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6ICBDaGFuZ2UgdG8gdXNlIFNUVF9BUk1fVEZVTkMuCi0gICAgICAgIChiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiAgQ2hhbmdlIHRvCi0gICAgICAgIGNoZWNrIGZvciBTVFRfQVJNX1RGVU5DLgotICAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgTGlrZXdpc2UuCi0gICAgICAgICogZWxmeHgtdGFyZ2V0Lmg6ICBBZGQgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLgotCi1GcmkgQXVnIDI4IDE5OjQ0OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX2FscGhhX2V2WzQ1Nl0pOiBOZXcuCi0JKiBjcHUtYWxwaGEuYzogUmV3b3JrIHRvIG1hdGNoIHRoZXNlIHR5cGVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgQXVnIDI4IDE5OjM4OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbik6IERlY2xhcmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbik6IE5ldy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBBZGQgdnRhYmxlIHJlbG9jcy4KLQkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBSZWNvZ25pemUgdGhlbS4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogUGFzcyB0aGVtIG9mZiB0byBnZW5lcmljIGNvZGUuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZ25vcmUgdGhlbS4KLQkoZWxmX2kzODZfZ2NfbWFya19ob29rLCBlbGZfaTM4Nl9nY19zd2VlcF9ob29rKTogTmV3LgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBUcnVlLgotCi1UaHUgQXVnIDIwIDE1OjAzOjQ1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWFybS5jIChlbGYzMl90aHVtYl90b19hcm1fc3R1Yik6IENoZWNrIHN5bV9zZWMgaXMgbm90IE5VTEwKLQliZWZvcmUgbG9va2luZyBhdCBvd25lciBmaWVsZC4KLQkoZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIpOiBEaXR0by4KLQkoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBDb21wdXRlIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQllbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSgpLgotCi1UaHUgQXVnIDIwIDExOjMwOjE3IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIGVsZi5jOiBjb21tZW50IGFuZCBmb3JtYXR0aW5nIGNsZWFudXBzLgotCSogZWxmY29yZS5oOiBkaXR0by4KLQotV2VkIEF1ZyAxOSAxNTo0MzoyNiAxOTk4ICBNaWNoYWVsIFNueWRlciAgPG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJlamVjdCBmaWxlcyBvZiBoZWFkZXIgdHlwZSBFVF9DT1JFCi0JKGNvcmUgZmlsZXMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkgdGhhbiBvYmplY3QgZmlsZXMpLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLQliZmRfZWxmX21rY29yZWZpbGUpOiBkZWNsYXJlLgotCSogZWxmeHgtdGFyZ2V0LmggKF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzLAotCWJmZF9lbGZfbWtjb3JlZmlsZSk6IGFkZCB0byBiZmRfdGFyZ2V0IHZlY3Rvci4KLQkqIGVsZmNvcmUuaCAoZWxmX2NvcmVfZmlsZV9wKTogc2F2ZSB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUsCi0JYW5kIHNldCB0aGUgYmZkIGFyY2hpdGVjdHVyZSBmcm9tIHRoZSBlbGYgZmlsZSBoZWFkZXIuCi0JKiBlbGYuYyAoYmZkX2VsZl9ta2NvcmVmaWxlKTogbmV3IGZ1bmN0aW9uLgotCShfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyk6IG5ldyBmdW5jdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IGFkZCBjYXNlcyBmb3IgaGFuZGxpbmcKLQlQVF9OT1RFIHNlZ21lbnRzLiAgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKToKLQljb3JlIGZpbGVzIHNob3VsZCBiZSBoYW5kbGVkIHRoZSBzYW1lIGFzIGV4ZWMgZmlsZXMuCi0JKHByZXBfaGVhZGVycyk6IGlkZW50aWZ5IGNvcmUgZmlsZXMgYXMgdHlwZSBFVF9DT1JFLgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBpZGVudGlmeSB0aGUgc2VjdGlvbnMgYmVsb25naW5nIHRvCi0JdGhlIFBUX05PVEUgc2VnbWVudC4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JYWRkIGJyZWFrIHN0YXRlbWVudCB0byBkZWZhdWx0IGNhc2UuCi0KLTE5OTgtMDgtMTkgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgdGhhdCBvdXRwdXQKLQlzZWN0aW9uIChub3QgaW5wdXQpIHdpbGwgYmUgaW4gc2VjdGlvbnMgIi5zYnNzIiwgIi5zYnNzMiIsCi0JIi5zZGF0YSIsIGFuZCAiLnNkYXRhIiBmb3IgUl9QUENfU0RBUkVMMTYsIFJfUFBDX0VNQl9TREEyUkVMLAotCVJfUFBDX0VNQl9TREEyMSwgUl9QUENfRU1CX1JFTFNEQS4gIEluIGFsbCB0aGVzZSBjYXNlcyBhbHNvIGlnbm9yZQotCW91dHB1dF9vZmZzZXQgZm9yIGNvcnJlY3QgZXZhbHVhdGlvbiBvZiBhZGRlbmQuCi0KLVR1ZSBBdWcgMTggMTE6NDg6MTIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbGYzMi1hcm0uYzogQWRkIHByZWZpeCBiZmRfIHRvIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgIGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgYW5kCi0gICAgICAgIGVsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uLgotCi1UdWUgQXVnIDE4IDExOjQ2OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBiZmQtaW4uaDogQW1tZW5kIHByb3RvdHlwZSBmb3IKLSAgICAgICAgZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gdG8gcmVtb3ZlIHN1cnBsdXMgdGhpcmQKLSAgICAgICAgYXJndW1lbnQuCi0KLSAgICAgICAgKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGUuCi0KLVNhdCBBdWcgMTUgMjA6NTU6MDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSBpbmRpcmVjdCBzeW1ib2xzLgotCi1GcmkgQXVnIDE0IDA5OjEyOjI4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBVc2UgdGhlIHJlbG9jYXRpb24gYWxyZWFkeQotCWNhbGN1bGF0ZWQgZm9yIFJFTE9DX1NQQVJDX1JFVjMyIGNhc2UuCi0KLVRodSBBdWcgMTMgMTQ6MDI6MDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGJmZC1pbi5oOiAgQWRkIHByb3RvdHlwZXMgZm9yIGVsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcsCi0gICAgICAgZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBhbmQKLSAgICAgICBlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbi4KLSAgICAgICAqIGJmZC1pbjIuaDogIFJlZ2VuZXJhdGVkLgotICAgICAgICogZWxmMzItYXJtLmMgRGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUuCi0gICAgICAgKGluc2VydF90aHVtYl9icmFuY2gpOiBOZXcgcm91dGluZS4KLSAgICAgICAoZmluZF90aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGZpbmRfYXJtX2dsdWUpOiBOZXcgcm91dGluZS4KLSAgICAgICAocmVjb3JkX2FybV90b190aHVtYl9nbHVlKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpIE5ldyByb3V0aW5lLgotICAgICAgIChlbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbikgTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX3RodW1iX3RvX2FybV9zdHViKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX2FybV90b190aHVtYl9zdHViKTogTmV3IHJvdXRpbmUuCi0gICAgICAgKGVsZjMyX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggdHlwby4KLSAgICAgICAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgQWRkIGFyZ3VtZW50IHN5bV9zZWMuCi0gICAgICAgQ2hlY2sgZm9yIGJyYW5jaGVzIHRvIHRodW1iIHN5bWJvbHMgaW4gY2FzZSBSX0FSTV9QQzI0LgotICAgICAgIENoZWNrIGZvciBicmFuY2hlcyB0byBhcm0gc3ltYm9scyBpbiBjYXNlIFJfQVJNX1RITV9QQzIyLgotICAgICAgIChlbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6ICBQYXNzIHN5bWJvbCBzZWN0aW9uIHRvCi0gICAgICAgZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0KLVdlZCBBdWcgMTIgMTk6MDA6MzkgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgUExUCi0JZW50cmllcyB1bmxlc3MgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxlOyBpbgotCXBhcnRpY3VsYXIsIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbHMgZ2V0IGEgUExUIGVudHJ5LgotCi1XZWQgQXVnIDEyIDE0OjQ4OjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQgdG8gYXZvaWQgd2FybmluZy4KLQotV2VkIEF1ZyAxMiAwODoxMDoxMSAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmV3b3JrCi0gICAgICAgUl9BUk1fUEMyNCByZWxvY2F0aW9uLgotCi1UdWUgQXVnIDExIDE0OjQyOjI2IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbGYzMi1hcm0uYyAoZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiAgUmVtb3ZlIHVudXNlZAotICAgICAgIGFyZ3VtZW50IGlzX2xvY2FsLiAgQWRkIGFyZ3VtZW50IHN5bV9mbGFncy4gIENoZWNrIHN5bV9mbGFncwotICAgICAgIGluIFJfQVJNX0FCUzMyIGNhc2UuICBJbmNsdWRlIGFkZGVuZCBmb3IgUl9BUk1fVEhNX1BDMjIgY2FzZS4KLSAgICAgICAoZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiAgRG9uJ3QgcGFzcyBsb2NhbCBzeW0gYW5kIHBhc3MKLSAgICAgICBzeW1fZmxhZ3MgdG8gZWxmMzJfYXJtX2ZpbmFsX2xpbmtfcmVsb2NhdGUuCi0KLU1vbiBBdWcgMTAgMjA6Mzg6MzkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfY2FsY19keW5yZWxfc2l6ZXMpOiBDb3JyZWN0IGxhc3QgY2hhbmdlCi0JdG8gbm90IGNvdW50IHRvbyBmZXcgcmVsb2NzIGZvciBkeW5hbWljbHkgbGlua2VkIGV4ZWN1dGFibGVzLgotCi1Nb24gQXVnIDEwIDE1OjM1OjM0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogTmV2ZXIgY29uc2lkZXIKLQlzeW1ib2xzIHdpdGhvdXQgYSBkeW5hbWljIGluZGV4IGR5bmFtaWMuICBDb25zaWRlciBhbGwgd2VhawotCXN5bWJvbHMgZHluYW1pYy4KLQkoZWxmNjRfYWxwaGFfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCk6IERvbid0IGFzc3VtZSAxLTEKLQljb3JyZXNwb25kYW5jZSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgc2VjdGlvbnMuCi0KLU1vbiBBdWcgMTAgMTU6MzE6MzkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IEZvciBiYWNrZW5kcwotCXRoYXQgdXNlIGEgLmdvdC5wbHQgc2VjdGlvbiBzdGFydCB0aGUgZ290IG9mZnNldCBhdCB6ZXJvLgotCi1Nb24gQXVnIDEwIDE3OjMxOjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3dyaXRlX3Byb2Nlc3Nvcik6IENvcnJlY3QgdGhlIHByb2Nlc3NvciBJRCB3cml0dGVuCi0Jb3V0IGZvciBiZmRfYXJjaF9tNjhrLCBhY2NvbW1vZGF0aW5nIGNoYW5nZSBvZiBNYXJjaCAyNS4KLQotU3VuIEF1ZyAgOSAyMDo1NTo0NCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZjMyLWFybS5jIChlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSk6ICBSZXdvcmsKLSAgICAgICAgUl9BUk1fVEhNX1JQQzIyIHJlbG9jYXRpb25zLgotCi1TYXQgQXVnICA4IDE1OjE1OjMwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogVW5kZWYgd2VhayBzeW1ib2xzCi0JYXJlIGFsd2F5cyBkeW5hbWljLgotCShlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcyk6IEFsbG93IGVub3VnaCByb29tIGZvciBSRUxBVElWRQotCS5nb3QgcmVsb2NzIGluIC1Cc3ltYm9saWMgc2hhcmVkIG9iamVjdHMuCi0KLVdlZCBBdWcgIDUgMTU6NDg6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItYXJtLmM6IEFkZCBwcml2YXRlIGZsYWdzIHRvIEVMRiBoZWFkZXIuCi0JKGVsZjMyX2FybV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3IEZ1bmN0aW9uLgotCShlbGYzMl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgRnVuY3Rpb24uCi0JKGVsZjMyX2FybV9jb3B5X3ByaXZhdGVfZmxhZ3MpOiBOZXcgRnVuY3Rpb24uCi0JKGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IEZ1bmN0aW9uLgotCi1Nb24gQXVnICAzIDE3OjEwOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogUGVybWl0IFdQTFQzMCBhZ2FpbnN0Ci0JYSBsb2NhbCBzeW1ib2wuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotU3VuIEF1ZyAgMiAwMzoxOToyMyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBJbml0IHNnb3QgdG8gTlVMTC4gIENyZWF0ZSB0aGUKLQkuZ290IGlmIGFueSByZWxvY2F0aW9uIHJlZmVycnMgdG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQdWxsIHNnb3QgYW5kIHNwbHQgc2VhcmNoIHRvIHRoZSBzdGFydAotCW9mIHRoZSBmdW5jdGlvbi4gIFJlY29nbml6ZSBubyAucGx0IGFzIHN0YXRpYyBsaW5raW5nLgotCi0xOTk4LTA4LTAxICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgcGFzcwotCSIubGlibGlzdCIgc3RyaW5nIHRocm91Z2ggZ2V0dGV4dC4KLQotRnJpIEp1bCAzMSAxNjozODoxNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgZWxmMzItYXJtLmxvLgotICAgICAgICAqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotICAgICAgICAqIGNvbmZpZy5iZmQgKGFybS0qLWVsZik6ICBEZWZpbmUgdGFyZ19kZWZ2ZWMgYW5kIHRhcmdfc2VsdmVjcy4KLSAgICAgICAgKHRodW1iLSotZWxmKTogRGVmaW5lIHRhcmdfZGVmdmVjIGFuZCB0YXJnX3NlbHZlY3MuCi0gICAgICAgICogY29uZmlndXJlLmluOiAgSGFuZGxlIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjIGFuZCBiZmRfZWxmMzJfYmlnYXJtX3ZlYy4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0gICAgICAgICogZWxmLmM6IChwcmVwX2hlYWRlcnMpOiAgU3VwcG9ydCBhcmNoX3R5cGUgb2YgRU1fQVJNLgotICAgICAgICAqIHRhcmdldHMuYzogIFN1cHBvcnQgbmV3IHRhcmdldHMgYmZkX2VsZjMyX2JpZ2FybV92ZWMgYW5kCi0gICAgICAgIGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMuCi0gICAgICAgICogZWxmMzItYXJtLmM6ICBOZXcgZmlsZS4KLQotVHVlIEp1biAyOCAxOTowNToyOCAxOTk4ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChNX1NQQVJDTElURV9MRSk6IE5ldyBtYWNoaW5lLgotCSogc3Vub3MuYyAoTUFDSFRZUEVfT0spOiBBZGQgbWFjaGluZSBNX1NQQVJDTElURV9MRS4KLQkqIGFvdXRmMS5oIChzdW5vc19zZXRfYXJjaF9tYWNoKTogQWRkIG1hY2hpbmUgTV9TUEFSQ0xJVEVfTEUuCi0JKHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogQWRkIHJlbG9jYXRpb24gUl9TUEFSQ19SRVYzMi4KLQkoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpIEFkZCBtYWNoaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZQotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBBZGQgUkVMT0NfU1BBUkNfUkVWMzIgc3VwcG9ydC4KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlLCBzcGFyY19yZWxvY19tYXAsCi0JZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbmFtZSBSX1NQQVJDXzMyTEUgdG8gYmUgUl9TUEFSQ19SRVYzMgotCSogbGliYmZkLmggKGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXMpOiBSZW5hbWUgQkZEX1JFTE9DX1NQQVJDXzMyTEUgdG8KLQliZSBCRkRfUkVMT0NfU1BBUkNfUkVWMzIuCi0JKiByZWxvYy5jOiBEaXR0by4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjODZ4LSotYW91dCk6IE5ldwotCi1GcmkgSnVsIDI0IDEzOjU0OjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEFsbG9jYXRlIE5VTEwgc3ltYm9sIGJlZm9yZQotCWFjdHVhbGx5IG1hcHBpbmcgdGhlIG91dHB1dCBzZWN0aW9ucy4KLQotRnJpIEp1bCAyNCAxMToyNDoyOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQotCSogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9ob3d0byk6IEFkZCBSX01OMTAzMDBfMjQgZW50cnkuCi0JKG1uMTAzMDBfZWxmX3JlbG9jX21hcCk6IFNpbWlsYXJseS4KLQkobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEhhbmRsZSBSX01OMTAzMDBfMjQuCi0KLUZyaSBKdWwgMjQgMTI6MzY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogQWRkIHJlbG9jIHR5cGVzIHVzZWQgb24KLQlJcml4IDYuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgZGVmYXVsdCBjYXNlLgotCSogZWxmNjQtbWlwcy5jOiBSZXBsYWNlIGFsbCB1c2VzIG9mIG1pcHNfZWxmNjRfcmVsb2NfdHlwZSB3aXRoCi0JZWxmX21pcHNfcmVsb2NfdHlwZSBkZWZpbmVkIGluIGVsZi9taXBzLmguCi0KLTE5OTgtMDctMjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmM6IFJlbW92ZSByZWxvY190eXBlIGRlZmluaXRpb24gY29tcGxldGVseS4gIEl0J3Mgbm93Ci0JaW4gZWxmL21pcHMuaC4KLQotVGh1IEp1bCAyMyAxMzozMzoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGY2NC1taXBzLmMgKG1pcHNfZWxmNjRfcmVsb2NfdHlwZSk6ICNpZiAwIG91dCBtb3JlIHJlbG9jYXRpb25zCi0JYXMgdGhleSBhcmUgZGVmaW5lZCBpbiBlbGYvbWlwcy5oIG5vdy4KLQotVGh1IEp1bCAyMyAxMToyOTo0MyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQotCSogUmUtYWRkIGxvc3QgY2hhbmdlOgotICAgICAgICAqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkCi0gICAgICAgICJtb3ZtX3N0YWNrX3NpemUiLgotICAgICAgICAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEluY2x1ZGUgc3RhY2sgc3BhY2UgZm9yIHJlZ2lzdGVyIHNhdmVzCi0gICAgICAgIGluIHRoZSBpbW04IGZpZWxkIG9mIGEgImNhbGwiIGluc3RydWN0aW9uLgotICAgICAgICAoY29tcHV0ZV9mdW5jdGlvbl9pbmZvKTogRGV0ZXJtaW5lIGhvdyBtdWNoIHN0YWNrIGlzIGFsbG9jYXRlZCBieQotICAgICAgICB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIEZpeCB0eXBvLgotICAgICAgICAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbW92bV9zdGFja19zaXplLgotCi1UaHUgSnVsIDIzIDExOjM4OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplKTogRGVmaW5lIGFzIDQuCi0JKiBlbGY2NC1zcGFyYy5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUgYXMgOC4KLQotMTk5OC0wNy0yMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jOiBDaGFuZ2UgdXNlIG9mIHBwX3JlbG9jX3R5cGUgdG8gZWxmX3BwY19yZWxvY190eXBlLgotCi1XZWQgSnVsIDIyIDE2OjI3OjE4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWhwcGEuaDogTGV0IEVMRiBoZWFkZXIgZGVmaW5lIHRoZSBlbnVtIGNvbnRhaW5pbmcgdGhlCi0JZXh0ZXJuYWwgcmVsb2MgbnVtYmVycy4KLQkqIGVsZjMyLWkzODYuaDogTGlrZXdpc2UuCi0KLTE5OTgtMDctMjIgMTQ6NTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBlbGYtbTEwMzAwLmM6IExldCBFTEYgaGVhZGVyIG5vdyBkZWZpbmUgdGhlIG1hY3JvcyB0byBnZXQgdGhlIGVudW0uCi0JKiBlbGYzMi1taXBzLmM6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmM6IExpa2V3aXNlLgotCi1XZWQgSnVsIDIyIDEzOjUzOjUyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbjIuaDogQ2hhbmdlIHR5cGUgb2YgJ2NsYXNzJyBwYXJhbWV0ZXIgdG8gJ3Vuc2lnbmVkIGludCcgaW4KLQliZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKCksIGluIG9yZGVyIHRvIGF2b2lkIEsmUiBjb21wYXRhYmlsaXR5Ci0JcHJibGVtcy4KLQkqIGJmZC1pbi5oOiBSZWdlbmVyYXRlLgotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogQ2hhbmdlIHR5cGUgb2YgJ2NsYXNzJwotCXBhcmFtZXRlciB0byAndW5zaWduZWQgaW50JyB0byBhdm9pZCBLJlIgY29tcGF0YWJpbGl0eSBwcm9ibGVtcy4KLQotV2VkIEp1bCAyMiAxNjo0MzoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9maW5kX25lYXJlc3RfbGluZSk6IENoYW5nZSBmaWxlbmFtZV9wdHIgYW5kCi0JZnVuY3Rpb25uYW1lX3B0ciB0byBiZSBjb25zdC4gIENoYW5nZSBsaW5lX3B0ciB0byBiZSB1bnNpZ25lZC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pOiBTaW1wbGlmeSBoYW5kbGluZyB3aGVuCi0JbWFjcm8gaXMgbm90IGRlZmluZWQuICBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciBmcm9tIGJmZF9saW5rX2luZm8KLQl0byBjb2ZmX2ZpbmFsX2xpbmtfaW5mby4gIEFkZCBwcm90b3R5cGUuCi0JKGNvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KTogU2ltcGxpZnkgaGFuZGxpbmcgd2hlbiBtYWNybyBpcyBub3QKLQlkZWZpbmVkLiAgQWRkIHByb3RvdHlwZS4KLQotMTk5OC0wNy0yMiAxMzowOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZi1tbjEwMzAwLmM6IEJlZm9yZSBpbmNsdWRlIHN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyIGRlZmluZQotCVNUQVJUX1JFTE9DX05VTUJFUlMsIFJFTE9DX05VTUJFUiwgYW5kIEVORF9SRUxPQ19OVU1CRVJTLgotCSogZWxmMzItbWlwcy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jOiBMaWtld2lzZS4KLQotV2VkIEp1bCAyMiAxMzo0Njo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9yZWxvY190eXBlKTogQ29weSBVbHJpY2gncyBlbGYzMi1taXBzLmMKLQl0ZW1wb3JhcnkgcGF0Y2ggb3ZlciB0byBlbGY2NC1taXBzLmMgYXMgd2VsbC4KLQotMTk5OC0wNy0yMSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAocmVsb2NfdHlwZSk6IFRlbXBvcmFyaWx5IGRpc2FibGUgZGVmaW5pdGlvbiBvZgotCXN0YW5kYXJkIHJlbG9jYXRpb24gc2luY2UgdGhleSBhcmUgbm93IGRlZmluZWQgaW4gZWxmL21pcHMuaC4KLQotVHVlIEp1bCAyMSAwOTo0NzowMCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVsZi1tMTAyMDAuYyAobW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6Ci0gICAgICAgIE1vZGlmeSByYW5nZSB0ZXN0IGZvciBjYXNlIFJfTU4xMDIwMF84LgotCi0gICAgICAgICogZWxmLW0xMDMwMC5jIChtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKToKLSAgICAgICAgTW9kaWZ5IHJhbmdlIHRlc3QgZm9yIGNhc2UgUl9NTjEwMzAwXzguCi0KLU1vbiBKdWwgMjAgMTg6NTA6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBnb3RfICYgcGx0X2hlYWRlcl9zaXplLgotCSogZWxmMzItaTM4Ni5jIChlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUpOiBEZWZpbmUuCi0JKGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSk6IERlZmluZS4KLQkqIGVsZjMyLW02OGsuYywgZWxmMzItbWlwcy5jLCBlbGYzMi1wcGMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jLCBlbGY2NC1hbHBoYS5jLCBlbGY2NC1zcGFyYy5jOiBMaWtld2lzZS4KLQkqIGVsZnh4LXRhcmdldC5oOiBQcm92aWRlIGEgZGVmYXVsdCBvZiB6ZXJvLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBVc2UgZ290X2hlYWRlcl9zaXplLgotCSogZWxmbGluay5oIChlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IHJlbW92ZSBhIFBMVAotCWVudHJ5IGZyb20gYW4gZXhlY3V0YWJsZSwgZXZlbiBpZiB0aGUgcGx0IHJlZmNvdW50IGdvZXMgdG8gMC4KLQotTW9uIEp1bCAyMCAxMjo0NzoyNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IEFsc28gcmVtZW1iZXIgdGhlCi0JZGlyZWN0b3J5IG5hbWUgYXQgdGhlIGxpbmUgbnVtYmVyLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBBbHNvIGNvbnNpZGVyIHN5bWJvbHMKLQl3aXRoIGFuIHVuc3BlY2lmaWVkIHR5cGUuCi0KLVdlZCBKdWwgMTUgMTE6MjA6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jOiBBZGQgdW5kZWYgb2YgdmFsaWQgdG8gYXZvaWQgcHJvYmxlbSBvbiBTdW5PUy4KLQotVHVlIEp1bCAxNCAxNTozMDo1OSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpPzg2LXBjLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgotCi1UdWUgSnVsIDE0IDExOjIyOjIxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IEFsc28gcmVmZXJlbmNlIGNvdW50Ci0JUl82OEtfUEN4eCBhbmQgUl82OEtfeHggcmVsb2NhdGlvbnMuICBNYWtlIHN1cmUgdGhhdAotCUVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGlzIGFsd2F5cyBzZXQgZm9yIGEgUExUIHJlbG9jIHJlZmVyZW5jZS4KLQkoZWxmX202OGtfZ2Nfc3dlZXBfaG9vayk6IEFsc28gcmVmZXJlbmNlIGNvdW50IFJfNjhLX1BDeHggYW5kCi0JUl82OEtfeHggcmVsb2NhdGlvbnMuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlc2V0IHRoZSBwbHQgb2Zmc2V0IG9mIGEgc3ltYm9sCi0JdGhhdCBoYXMgbm8gcGx0IGVudHJ5LgotCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSWdub3JlIHRoZSBwbHQgb2Zmc2V0IGluIGEgc3RhdGljCi0JbGluay4KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlc2V0IHRoZSBwbHQgb2Zmc2V0IGZvcgotCWFuIGlnbm9yZWQgc3ltYm9sLgotCShlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogU2V0IHRoZSBnb3Qgb2Zmc2V0cyBhbHNvIGluCi0JYSBzdGF0aWMgbGluay4KLQotCSogZWxmMzItbTY4ay5jIChSXzY4S19HTlVfVlRJTkhFUklULCBSXzY4S19HTlVfVlRFTlRSWSk6IE5ldyByZWxvYwotCXR5cGVzLgotCShob3d0b190YWJsZSwgcmVsb2NfbWFwKTogQWRkIGVudHJpZXMgZm9yIHRoZW0uCi0JKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSB0aGVtLiAgSW1wbGVtZW50IHJlZmVyZW5jZQotCWNvdW50aW5nIGZvciBnb3QgYW5kIHBsdCBlbnRyaWVzLgotCShlbGZfbTY4a19nY19tYXJrX2hvb2ssIGVsZl9tNjhrX2djX3N3ZWVwX2hvb2spOiBOZXcgZnVuY3Rpb25zLgotCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBIYW5kbGUgdW5yZWZlcmVuY2VkIHBsdAotCXN5bWJvbHMuCi0JKHJ0eXBlX3RvX2hvd3RvX3JlbCwgZWxmX2luZm9fdG9faG93dG9fcmVsKTogRGVsZXRlLgotCShlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHRoZSBuZXcgcmVsb2MgdHlwZXMuCi0JKGJmZF9lbGYzMl9iZmRfZmluYWxfbGluaywgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAotCWVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2ssIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyk6IERlZmluZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBjcmVhdGluZyBhbgotCWluZGlyZWN0IHJlZmVyZW5jZSBmb3Igc3ltYm9sIHZlcnNpb25pbmcgYWxzbyBjb3B5IHRoZSBwbHQKLQlvZmZzZXQuCi0JKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogV2hlbiBjbGVhcmluZyB0aGUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQKLQlmbGFnIGFsc28gcmVzZXQgdGhlIHBsdCBvZmZzZXQuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IExpa2V3aXNlLgotCShlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzKTogSW5jcmVtZW50IHRoZSBnb3Qgb2Zmc2V0IGJ5Ci0JdGhlIHNpemUgb2YgdGhlIGVudHJ5IGluIGJ5dGVzLgotCShlbGZfZ2NfYWxsb2NhdGVfZ290X29mZnNldHMpOiBMaWtld2lzZS4KLQotVHVlIEp1bCAxNCAxMToxODoxNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2djX3NlY3Rpb25zKTogUmV0dXJuIHRydWUgcmF0aGVyIHRoYW4gZmFsbGluZyBvZmYKLQl0aGUgYm90dG9tLgotCi0JKiBjb2ZmZ2VuLmMgKGJmZF9jb2ZmX3NldF9zeW1ib2xfY2xhc3MpOiBDYWxsIGJmZF9hbGxvYywgbm90Ci0JeG1hbGxvYy4KLQotTW9uIEp1bCAxMyAxMTowNjozMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBTdXByZXNzIGRlZmluaXRpb24gb2YgVEFSR0VUX1VOREVSU0NPUkUgYW5kIGFkZCBhCi0JY29tbWVudCBkZXNjcmliaW5nIHdoZW4gaXQgc2hvdWxkIGJlIGVuYWJsZWQuCi0JQ2hhbmdlZCBkZWZpbml0aW9uIG9mIFVTRVJfTEFCRUxfUFJFRklYIHRvICIiLCB0byBmYWxsIGludG8gbGluZQotCXdpdGggR0NDIHNvdXJjZXMuCi0KLU1vbiBKdWwgMTMgMTM6MDY6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IEhhbmRsZSBjYWxsIG9wdGltaXphdGlvbgotCWluZm9ybWF0aW9uIEFUTiByZWNvcmRzLgotCi1GcmkgSnVsIDEwIDE2OjMxOjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBTZWxlY3QgYW4gYXBwcm9wcmlhdGUKLQlzZWN0aW9uIGZvciBhbiBhYnNvbHV0ZSBzeW1ib2wgaW4gYSBmdWxseSBsaW5rZWQgZmlsZS4gIEJhc2VkIG9uCi0JcGF0Y2ggZnJvbSBDaHJpc3RpYW4gSG9sbGFuZCA8Q0hvbGxhbmRAZGUubHVjZW50LmNvbT4uCi0KLVdlZCBKdWwgIDggMTE6Mjk6NTYgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb2ZmLW04OGsuYyAobTg4a19zcGVjaWFsX3JlbG9jKTogRG9uJ3QgbG9zZSB0aGUgaW5mb3JtYXRpb24KLQl0aGF0IGEgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotVHVlIEp1bCAgNyAyMTo0NzowMiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCi1Nb24gSnVsICA2IDExOjM1OjUwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvKTogRG8gbm90IGNvbXBsYWluIGFib3V0Ci0Jb3ZlcmZsb3dzIGluIEFSTV8yNkQgcGF0Y2hlcywgc2luY2UgdGhleSBoYXZlIGFscmVhZHkgYmVlbgotCWltcGxtZW50ZWQuICBQYXRjaCBzdWJtaXR0ZWQgYnkgRHIuIFIuSi4gQmxhY2sgPHJqYkBkY3MuZ2xhLmFjLnVrPgotCi1TYXQgSnVsICA0IDEyOjI1OjM2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiB3ZSBoYXZlIGFueSBsb25nCi0Jc2VjdGlvbiBuYW1lcywgY2FsbCBjb2ZmX3dyaXRlX3N5bWJvbHMgZXZlbiBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzLgotCi1GcmkgSnVsICAzIDEzOjExOjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE9ubHkgc2V0IHBoZHJfaW5jbHVkZWQgb25jZSBmb3IgYQotCVBUX0xPQUQgc2VnbWVudCwgcmF0aGVyIHRoYW4gb25seSBzZXR0aW5nIGl0IG9uY2UgZm9yIHRoZSBlbnRpcmUKLQlmaWxlLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IFdoZW4gc2V0dGluZyB0aGUgTE1BLAotCXJhdGhlciB0aGFuIGlnbm9yaW5nIGV2ZXJ5IHBoZHIgd2l0aCBhIHBfcGFkZHIgb2YgMCwgaWdub3JlIGFsbAotCXRoZSBwaGRycyBpZiB0aGV5IGFsbCBoYXZlIGEgcF9wYWRkciBvZiAwLgotCi0JKiBzdGFicy5jIChfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyk6IENoZWNrIHdoZXRoZXIgdGhlIC5zdGFic3RyCi0Jc2VjdGlvbiB3YXMgZGlzY2FyZGVkIGZyb20gdGhlIGxpbmsuCi0KLUZyaSBKdWwgIDMgMTQ6Mzk6MDUgMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb2ZmLXNoLmMgKHNoX2luc25fdXNlc19mcmVnKTogSWdub3JlIGxvd2VzdCBiaXQgb2YgcmVnaXN0ZXIgbnVtYmVyLgotCi1GcmkgSnVsICAzIDE0OjM1OjQ4IDE5OTggIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29mZi1zaC5jIChzaF9pbnNuc19jb25mbGljdCk6IExvYWQgb2YgZnBzY3IgY29uZmxpY3RzIHdpdGgKLQlmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLgotCi1UaHUgSnVsICAyIDE4OjM3OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2tpcCB1bmRlZmluZWQgZ2xvYmFsCi0JZnVuY3Rpb24gc3ltYm9scy4KLQotVGh1IEp1bCAgMiAxNDo1OTo0MiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotCU1lcmdlIG9mIHZheC92bXMgKHJlYWQtb25seSkgc3VwcG9ydAotCSogY29uZmlndXJlLmNvbTogU3VwcG9ydCBWYXggdGFyZ2V0LgotCSogbWFrZWZpbGUudm1zOiBTdXBwb3J0IFZheCB0YXJnZXQuCi0gICAgICAgICogdm1zLmg6IFJlbmFtZWQgZnJvbSBldmF4LmgsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpIHN1cHBvcnQuCi0JKiB2bXMuYzogUmVuYW1lZCBmcm9tIGV2YXgtYWxwaGEuYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLWhkci5jOiBSZW5hbWVkIGZyb20gZXZheC1lbWguYywgbWVyZ2VkIHZheC92bXMgKHJlYWQtb25seSkKLQlzdXBwb3J0LgotCSogdm1zLWdzZC5jOiBSZW5hbWVkIGZyb20gZXZheC1lZ3NkLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIHZtcy10aXIuYzogUmVuYW1lZCBmcm9tIGV2YXgtZXRpci5jLCBtZXJnZWQgdmF4L3ZtcyAocmVhZC1vbmx5KQotCXN1cHBvcnQuCi0JKiB2bXMtbWlzYy5jOiBSZW5hbWVkIGZyb20gZXZheC1taXNjLmMsIG1lcmdlZCB2YXgvdm1zIChyZWFkLW9ubHkpCi0Jc3VwcG9ydC4KLQkqIGxpYmJmZC5jIChyZWFsX3JlYWQpOiBVc2UgdW5idWZmZXJlZCByZWFkIG9uIFZNUy9WYXguCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfb3ZheF9mbGF2b3VyKTogTmV3IGZsYXZvdXIuCi0JKHZtc19hbHBoYV92ZWMpOiBSZW5hbWVkIGZyb20gZXZheF9hbHBoYV92ZWMuCi0JKHZtc192YXhfdmVjKTogTmV3LgotCSh0YXJnZXRfdmVjdG9yKTogVXBkYXRlIGFjY29yZGluZ2x5LgotCSogY29uZmlnLmJmZCAoYWxwaGEqLSotKnZtcyopOiBVc2Ugdm1zX2FscGhhX3ZlYywgbm90Ci0JZXZheF9hbHBoYV92ZWMuCi0JKHZheCotKi0qdm1zKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIGZvciByZW5hbWVkIGZpbGVzLiAgUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkLgotCi1UaHUgSnVsICAyIDEzOjMxOjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gTWF0dCBTZW1lcnNreSA8bWF0dHNAc2NkLmhwLmNvbT46Ci0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBGb3JjZSBhIHRyYWlsaW5nIE5VTEwKLQlwb2ludGVyIG9uIGFiZmQtPm91dHN5bWJvbHMuCi0JKGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wpOiBIYW5kbGUgTlVMTCBzeW0gcGFyYW1ldGVyLgotCi1XZWQgSnVsICAxIDE3OjA1OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgc3VwcG9ydCBmb3IgY2hhbmdpbmcgVk1BIG9yCi0JTE1BIG9mIHNlY3Rpb25zLgotCi1XZWQgSnVsICAxIDE2OjU4OjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBDb3JyZWN0IGFkZHJlc3MgY29tcGFyaXNvbnMKLSAJd2hlbiBoYW5kbGluZyAzMiBiaXQgaW1tZWRpYXRlIHJlbG9jcy4KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQotVHVlIEp1biAzMCAwOTo1NTowMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiBBY2NvdW50IGZvciByZWNlbnRseSBhZGRlZCBnY19tYXJrCi0JZmllbGQgaW4gc3RydWN0IGFzZWN0aW9uLgotCi0JKiBlbGYtbTEwMzAwLmMgKGJmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUuCi0KLVRodSBKdW4gMjUgMTg6MzE6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCUVMRiBTZWN0aW9uLWxldmVsIEdhcmJhZ2UgQ29sbGVjdGlvbjoKLQkqIGJmZC5jIChiZmRfZ2Nfc2VjdGlvbnMpOiBOZXcuCi0JKiBhb3V0LWFkb2JlLmM6IEhvb2sgdG8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4KLQkqIGFvdXQtdGFyZ2V0LmgsIGFvdXQtdGljMzAuYywgYmluYXJ5LmMsIGJvdXQuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jLCBjb2ZmY29kZS5oOiBMaWtld2lzZS4KLQkqIGV2YXgtYWxwaGEuYywgaTM4Nm1zZG9zLmMsIGkzODZvczlrLmMsIGllZWUuYzogTGlrZXdpc2UuCi0JKiBpaGV4LmMsIG5sbS10YXJnZXQuaCwgb2FzeXMuYywgcHBjYm9vdC5jLCBzcmVjLmM6IExpa2V3aXNlLgotCSogdGVraGV4LmMsIHZlcnNhZG9zLmM6IExpa2V3aXNlLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9saW5rX2JmZF9nY19zZWN0aW9ucyk6IE5ldy4KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfTElOSyk6IEFkZCBfYmZkX2djX3NlY3Rpb25zLgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpOiBOZXcuCi0JKGJmZF9nZW5lcmljX2djX3NlY3Rpb25zKTogTmV3LgotCSogc2VjdGlvbi5jIChTRUNfS0VFUCk6IE5ldy4KLQkoYXNlY3Rpb24pOiBBZGQgZ2NfbWFyayBtZW1iZXIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2djKik6IE5ldyBuYW1lIHJlbWFwcGluZ3MuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHNldCBjb250ZW50cyBvbiBzdGFicwotCXNlY3Rpb25zIHRvIGJlIGV4Y2x1ZGVkLgotCShlbGZfZ2NfbWFyaywgZWxmX2djX3N3ZWVwLCBlbGZfZ2Nfc3dlZXBfc3ltYm9sKTogTmV3LgotCShlbGZfZ2NfcHJvcG9nYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQpOiBOZXcuCi0JKGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MpOiBOZXcuCi0JKGVsZl9nY19zZWN0aW9ucywgZWxmX2djX3JlY29yZF92dGluaGVyaXQsIGVsZl9nY19yZWNvcmRfdnRlbnRyeSk6IE5ldy4KLQkoZWxmX2djX2NvbW1vbl9maW5hbGl6ZV9nb3Rfb2Zmc2V0cyk6IE5ldy4KLQkoZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzLCBlbGZfZ2NfY29tbW9uX2ZpbmFsX2xpbmspOiBOZXcuCi0JKiBlbGZ4eC10YXJnZXQuaDogQWRkIGFuZCBkZWZhdWx0IGdjIGhvb2tzLgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogU3dhcCBnb3Rfb2Zmc2V0L3BsdF9vZmZzZXQKLQlmb3IgdW5pb25zLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IExpa2V3aXNlIGZvciBsb2NhbF9nb3Rfb2Zmc2V0cy4KLQkqIGVsZi5jLCBlbGYtaTM4Ni5jLCBlbGYzMi1tNjhrLmMsIGVsZjMyLW1pcHMuYzogVXBkYXRlIGFsbCB1c2VzLgotCSogZWxmMzItcHBjLmMsIGVsZjMyLXNwYXJjLmMsIGVsZjY0LWFscGhhLmM6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYywgZWxmbGluay5oOiBMaWtld2lzZS4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2dGFibGUgbWVtYmVycy4KLQkoRUxGX0xJTktfSEFTSF9NQVJLKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBHQyBob29rcy4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFplcm8gdnRhYmxlIG1lbWJlcnMuCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfY2hlY2tfcmVsb2NzKTogTmV3LgotCShtbjEwMzAwX2VsZl9nY19tYXJrX2hvb2spOiBOZXcuCi0JKFJfTU4xMDMwMF9HTlVfVlRJTkhFUklULCBSX01OMTAzMDBfR05VX1ZURU5UUlkpOiBOZXcuCi0JKGVsZl9tbjEwMzAwX2hvd3RvLCBtbjEwMzAwX3JlbG9jX21hcCk6IEhhbmRsZSB0aGVtLgotCShtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogTGlrZXdpc2UuCi0JKG1uMTAzMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCSogZWxmMzItbWlwcy5jIChSX01JUFNfR05VX1ZUSU5IRVJJVCwgUl9NSVBTX0dOVV9WVEVOVFJZKTogTmV3LgotCShlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvLCBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byk6IE5ldy4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSB0aGVtLgotCShtaXBzX2luZm9fdG9faG93dG9fcmVsKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2djX21hcmtfaG9vaywgbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayk6IE5ldy4KLQkoZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zKTogRGVmaW5lLgotCSogZWxmMzItcHBjLmMgKFJfUFBDX0dOVV9WVElOSEVSSVQsIFJfUFBDX0dOVV9WVEVOVFJZKTogTmV3LgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IEhhbmRsZSB0aGVtLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlZmVyZW5jZSBjb3VudCAuZ290IGFuZCAucGx0IGVudGlyZXMuCi0JSGFuZGxlIG5ldyB2dGFibGUgcmVsb2NzLgotCShwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJlY29nbml6ZSB1bnVzZWQgLnBsdCBlbnRyaWVzLgotCShwcGNfZWxmX2djX21hcmtfaG9vaywgcHBjX2VsZl9nY19zd2VlcF9ob29rKTogTmV3LgotCShlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMpOiBEZWZpbmUuCi0KLUZyaSBKdW4gMjYgMTA6NDg6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9tbjEwMzAwKTogRGVmaW5lLgotCSogZWxmLW0xMDMwMC5jOiBJbmNsdWRlIGVsZi9tbjEwMzAwLmgKLQkoZWxmX21uMTAzMDBfbWFjaCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTGlrZXdpc2UuCi0JKF9iZmRfbW4xMDMwMF9lbGZfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRmaW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IExpa2V3aXNlLgotCi1UaHUgSnVuIDI1IDE4OjMxOjA4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogRml4IEhJMTZfUwotCXJlbG9jYXRpb24uCi0KLVdlZCBKdW4gMjQgMTc6MTc6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IExvb3Agb3ZlciBpbnB1dF9iZmRzIHVzaW5nIHRoZQotCWxpbmtfbmV4dCBmaWVsZCwgbm90IHRoZSBuZXh0IGZpZWxkLgotCi1TdW4gSnVuIDIxIDE5OjM4OjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IENoZWNrIHRoZSBzZWN0aW9uIGFkZHJlc3MKLQlhZ2FpbnN0IHRoZSBwaGRyIHNpemUgYm90aCB3aXRoIGFuZCB3aXRob3V0IGEgbW9kdWxvIG9mCi0JbWF4cGFnZXNpemUuCi0KLUZyaSBKdW4gMTkgMTc6MDg6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgc3RyaXAgYQotCWxpbmtlciBjcmVhdGVkIGVtcHR5IGlucHV0IHNlY3Rpb24gaWYgdGhlIG91dHB1dCBzZWN0aW9uIGhhcyB0aGUKLQlzYW1lIG5hbWUuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFByaW50IGFuIGVycm9yIG1lc3NhZ2UgaWYKLQlfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gZmFpbHMuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBDYWxsIGJmZF9zZXRfZXJyb3Igb24KLQlmYWlsdXJlLgotCi1UdWUgSnVuIDE2IDExOjU1OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEltcHJvdmUgaGFuZGxpbmcgb2YgU29sYXJpcwotIAluYXRpdmUgbGlua2VyIG91dHB1dC4gIEF2b2lkIHB1dHRpbmcgYW4gZW1wdHkgc2VjdGlvbiBpbiBtb3JlIHRoYW4KLSAJb25lIHNlZ21lbnQuCi0KLUZyaSBKdW4gMTIgMTM6MzA6MTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLUZyaSBKdW4gMTIgMTM6MzQ6MDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBOZXcgYXJnIHJlbG9jYXRhYmxlX3AuCi0JRG9uJ3QgYWRkIHNlY3Rpb24gVk1BIHRvIHN5bWJvbHMgZm9yIHJlbG9jYXRhYmxlIG91dHB1dC4KLQkoX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogVXBkYXRlIGNhbGwgdG8KLQlzd2FwX291dF9zeW1zLgotCi1Nb24gSnVuICA4IDE1OjIwOjU3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcGVyZm9ybV9yZWxvY2F0aW9uKTogTWFrZSBjb21wYXJpc29ucwotCWFnYWluc3QgJ2FkZGVuZCcgYmUgc2lnbmVkIHJhdGhlciB0aGFuIHVuc2lnbmVkLgotCi1TYXQgSnVuICA2IDAwOjMxOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYzogQWRkIHByb3RvdHlwcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQotCSogY29mZi1hcm0uYzogQWRkIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0KLUZyaSBKdW4gIDUgMTc6MjE6NTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGVsZl9zb3J0X3NlY3Rpb25zKTogU29ydCBieSBMTUEgZmlyc3QgdGhlbiBWTUEsIHNpbmNlIHRoZQotCUxNQSBpcyB1c2VkIHRvIG9yZGVyIHNlY3Rpb25zIGluIGEgc2VnbWVudC4KLQotCSogZWxmMzItdjg1MC5jOiBBZGQgcHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4KLQlDaGFuZ2UgdHlwZSBvZiBhZGRlbmQgcGFyYW1ldGVyIHRvIGJmZF92bWEgaW4gdmFyaW91cyBmdW5jdGlvbnMuCi0KLUZyaSBKdW4gIDUgMTg6MDk6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBDaGFuZ2UgUkVMT0NfQkFTRTEzIHRvIHVzZQotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCBpbnN0ZWFkIG9mIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLgotCi1GcmkgSnVuICA1IDE1OjExOjExIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYuYyAoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3QgYWRkIHNlY3Rpb24gVk1BIHRvIHN5bWJvbCB2YWx1ZQotCXdoZW4gY29tcGFyaW5nIGFnYWluc3QgMC4KLQotV2VkIEp1biAgMyAxNzo1Mjo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgSnVuICAzIDEyOjE4OjI0IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBHaXZlIGFuCi0JZXJyb3IgaWYgcHJldmlvdXMgb2JqZWN0IGVuZGlhbm5lc3MgZG9lc24ndCBtYXRjaCBjdXJyZW50IG9iamVjdC4KLQotVHVlIEp1biAgMiAxNzo1MDo1OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBDYWxsCi0JX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZSliZmRfZGF0YSAoKS4KLQotVHVlIEp1biAgMiAxNToyOTozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbCk6IERvbid0IGFsd2F5cyBzZXQgdHlwZV9jaGFuZ2Vfb2sKLQlhbmQgc2l6ZV9jaGFuZ2Vfb2suCi0gCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgdHlwZV9jaGFuZ2Vfb2sgYW5kCi0Jc2l6ZV9jaGFuZ2Vfb2sgYmVmb3JlIGNhbGxpbmcgZWxmX21lcmdlX3N5bWJvbC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgd2UgaXNzdWUgYW4KLQl1bmRlZmluZWQgc3ltYm9sIGVycm9yLCBkb24ndCBhbHNvIGlzc3VlIGFuIG92ZXJmbG93IGVycm9yLgotCi1UdWUgSnVuICAyIDEzOjUxOjAwIDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBUaGUgdGFyZ2V0IG9mIGFuCi0JUl9QUENfTE9DQUwyNFBDIHJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2FsOyBpZiBub3QsIHByaW50IGFuIGVycm9yCi0JbWVzc2FnZSBpbnN0ZWFkIG9mIGNyYXNoaW5nLgotCi1Nb24gSnVuICAxIDE4OjIzOjEyIDE5OTggIFl1bGkgQmFyY29oZW4gIDx5dWxpLmJhcmNvaGVuQHRlbHJhZC5jby5pbD4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfY3B1MzIpOiBEZWZpbmUuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBBZGQgY2FzZSBmb3IgNjgwNjAuICBGaXggNjgzMzIgY2FzZSB0byB1c2UKLQliZmRfbWFjaF9jcHUzMi4KLQkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbTY4azpjcHUzMi4KLQkqIGllZWUuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGllZWVfb2JqZWN0X3ApOiBQYXJzZSBvdXQgcHJvY2VzcyBJRCBzdHJpbmcgdG8gbWFrZSBpdCBtb3JlCi0JbGlrZWx5IHRvIGJlIGFjY2VwdGFibGUgZm9yIGJmZF9zY2FuX2FyY2guCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBKdW4gIDEgMTE6MTI6MDIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWxzbyBjYWxsCi0JX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSgpIHNvIHRoYXQgdGhlIHByb2dyYW0gaGVhZGVyIHdpbGwKLQliZSBkaXNwbGF5ZWQuCi0KLU1vbiBKdW4gIDEgMTI6MTQ6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zeW1faW4pOiBDaGVjayBmb3IgQ19TRUNUSU9OIHJhdGhlciB0aGFuCi0JMHg2OC4gIFJlaW5kZW50LiAgQWRkIHNvbWUgY29tbWVudHMuCi0KLUZyaSBNYXkgMjkgMDk6NTg6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkanVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mCi0Jc2VnbWVudCBpbiBvdXRwdXQgQkZEIHRvIGNvbnRhaW4gTE1BcyBvZiBpdHMgc2VjdGlvbnMuCi0KLVR1ZSBNYXkgMjYgMTk6Mzc6NDcgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUsIHNwYXJjX3JlbG9jX21hcCwKLQllbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogQWRkZWQgUl9TUEFSQ18zMkxFIGZvciBsaXR0bGUKLQllbmRpYW4gZGF0YSAzMiBiaXQgcmVsb2NhdGlvbnMuCi0JKGVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDaGVjayBpZiBsaW5raW5nIGxpdHRsZQotCWVuZGlhbiBvYmplY3RzIHdpdGggYmlnIGVuZGlhbiBvYmplY3RzLgotCShlbGYzMl9zcGFyY19vYmplY3RfcCk6IFNldCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUuCi0JKGVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBTZXQgRUZfU1BBUkNfTEVEQVRBIGluIGVfZmxhZ3MuCi0JKiBsaWJiZmQuaCAoYmZkX3JlbG9jX2NvZGVfcmVhbF9uYW1lcyk6IEFkZGVkIEJGRF9SRUxPQ19TUEFSQ18zMkxFLgotCSogcmVsb2MuYzogU2FtZS4KLQkqIGNwdS1zcGFyYy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkZWQgc3BhcmM6c3BhcmNsaXRlX2xlCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOiBOZXcuCi0JKiBiZmQtaW4yLmggKEJGRF9SRUxPQ19TUEFSQ18zMkxFLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOiBOZXcuCi0KLVRodSBNYXkgMjEgMTY6NTk6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IEZpeCBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycyBpbiBpZiAoKQotCXN0YXRlbWVudC4KLQotVHVlIE1heSAxOSAxODo0MToxOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oOiBNb3ZlIG92ZXIgcGF0Y2ggdG8gYmZkLWluMi5oLgotCi0JKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBBZGQgY2FzdHMgYmVmb3JlIHNoaWZ0cyB3aGljaCBtYXkKLSAJbm90IGZpdCBpbiAzMiBiaXRzLgotCShfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLU1vbiBNYXkgMTggMTQ6NDQ6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChhZGRfZGF0YV9lbnRyeSk6IElmIHRoZSBzZWN0aW9uIGhhcyBubyBwcml2YXRlIGRhdGEKLQl0aGVuIGRvIG5vdCBjcmVhdGUgYSBEYXRhIERpY3Rpb25hcnkgZW50cnkgZm9yIGl0LgotCi1Nb24gTWF5IDE4IDAwOjA5OjI4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbGF4X3NlY3Rpb24pOiBTZXQgYWdhaW4gb24gY2hhbmdlcy4KLQkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMsIGVsZjY0X2FscGhhX21lcmdlX2dvdHMsCi0JZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMpOiBSZXdyaXRlLCBoYW5kbGluZyBtdWx0aXBsZSBnb3QKLQlzdWJzZWN0aW9ucyBkdXJpbmcgcmVsYXhhdGlvbiBtb3JlIGNvcnJlY3RseS4KLQotVGh1IE1heSAxNCAxNDoyMjo1OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmQtaW4yLmg6IEFkZCBuZXcgcHJvdG90eXBlOiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzICgpLgotCUFkZCBleHRyYSBhcmd1bWVudCB0byBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKCkuCi0JKiBiZmQtaW4uaDogUmVmbGVjdCBjaGFuZ2VzIG1hZGUgaW4gYmZkLWluMi5oLgotCSogY29mZmdlbi5jIChiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHRoZQotCWNvZmYgY2xhc3Mgb2YgYSBCRkQgc3ltYm9sLgotCSogY29mZi1hcm0uYzogQWRkIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIFRodW1iIGNvZGUgYW5kCi0Jbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4KLQotU3VuIE1heSAxMCAyMjozMzo1OSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVRodSBNYXkgIDcgMTc6NDA6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmaWxlbW9kZS5jOiBSZW1vdmU7IG5vdCB1c2VkLgotCi0JSWYgc3lzZGVwLmggaW5jbHVkZXMgYSBoZWFkZXIgZmlsZSwgZG9uJ3QgaW5jbHVkZSBpdCBhZ2FpbjoKLQkqIGFpeDM4Ni1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+LCA8c3RkZGVmLmg+LCBvcgotCTxlcnJuby5oPi4KLQkqIGFvdXR4Lmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4gIFVzZSAic3lzZGVwLmgiIHJhdGhlciB0aGFuCi0JPHN5c2RlcC5oPi4KLQkqIGFyY2hpdmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RyaW5nLmg+IG9yIDxlcnJuby5oPi4KLQkqIGV2YXgtYWxwaGEuYzsgRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4uCi0JKiBldmF4LWVnc2QuYzogTGlrZXdpc2UuCi0JKiBldmF4LWV0aXIuYzogTGlrZXdpc2UuCi0JKiBldmF4LW1pc2MuYzogTGlrZXdpc2UuCi0JKiBldmF4LWVtaC5jOiBMaWtld2lzZS4gIEFsc28sIGRvbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQkqIGhwcGFic2QtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN5cy90eXBlcy5oPiwgb3IKLQk8ZXJybm8uaD4uCi0JKiBocHV4LWNvcmUuYzogTGlrZXdpc2UuCi0JKiBuZXRic2QtY29yZS5jOiBMaWtld2lzZS4KLQkqIHNvbS5jOiBMaWtld2lzZS4KLQkqIGxpYmJmZC5jOiBEb24ndCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4uCi0JKiBubG1jb2RlLmg6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPi4KLQkqIG9zZi1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN0cmluZy5oPiBvciA8c3RkaW8uaD4uCi0JKiBwdHJhY2UtY29yZS5jOiBEb24ndCBpbmNsdWRlIDxzdGRpby5oPiwgPHN5cy90eXBlcy5oPiwKLQk8ZXJybm8uaD4sIG9yIDx1bmlzdGQuaD4uCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4gb3IgPHN5cy90eXBlcy5oPi4KLQotVGh1IE1heSAgNyAxMzoxMjo1MCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogSWYgdGhlIHZlcnNpb24gbnVtYmVyIGNhbiBub3QgYmUgZm91bmQgaW4KLQljb25maWd1cmUuaW4sIHNldCBpdCB0byAidW5rbm93biIgcmF0aGVyIHRoYW4gIjIuOC4xIi4KLQotV2VkIE1heSAgNiAwOTo0NjowNSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19tYWNoKTogTmV3LgotCShfYmZkX21pcHNfZWxmX29iamVjdF9wKTogVXNlIGVsZl9taXBzX21hY2guCi0JKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZSB0aGUgbmFtZXMKLQlvZiBtYWNoaW5lcywgcmF0aGVyIHRoYW4gdGhlIG51bWJlcnMuICBTZXQgYm90aCB0aGUgQVJDSAotCWFuZCBNQUNIIGluIGVfZmxhZ3MuICBIYW5kbGUgYSBmZXcgbW9yZSBzcGVjaWZpYyBtYWNoaW5lcy4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTWVyZ2UgYm90aAotCUVGX01JUFNfQVJDSCBhbmQgRUZfTUlQU19NQUNILgotCi1UdWUgTWF5ICA1IDIxOjAxOjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogUmV2ZXJ0IGxhc3QgY2hhbmdlLgotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBEaXNjYXJkIGRlYnVnZ2luZyBzeW1ib2xzLgotCi1UdWUgTWF5ICA1IDIzOjM2OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCSogc29tLmg6IERvbid0IGluY2x1ZGUgc3lzZGVwLmguCi0KLVR1ZSBNYXkgIDUgMTg6Mjk6MjQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmJmZC1pbi5oOiBSZW1vdmVkIGdldHRleHQgaW5jbHVkZXMgYW5kIGRlZmluZXMuCi0JKiBzeXNkZXAuaDogTW92ZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzIGhlcmUuCi0KLVR1ZSBNYXkgIDUgMTY6NDc6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsIHJhdGhlciB0aGFuCi0JYW4gYWQtaG9jIHRlc3QuICBLaWxsIGJvZ3VzICNpZiAwIGNvZGUuCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IENvbnNpZGVyIEJTRl9ERUJVR0dJTkcgc3ltYm9scyBsb2NhbC4KLQotTW9uIE1heSAgNCAxNjoxMDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBEb24ndCB1c2UgdGhlIFBMVCBhZGRyZXNzCi0Jd2hlbiBnZW5lcmF0aW5nIGEgbm9ybWFsIGV4ZWN1dGFibGUgZm9yIGEgc3ltYm9sIGRlZmluZWQgaW4gYQotCXJlZ3VsYXIgZmlsZS4gIFdoZW4gY29weWluZyBhIHJlbG9jIGludG8gdGhlIG91dHB1dCBmaWxlLCBhZGp1c3QKLQl0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLgotCi1Nb24gTWF5ICA0IDEwOjA4OjE4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQtaW4uaCAoXyk6IERlZmluZSBhcyBkZ2V0dGV4dC4KLQotTW9uIE1heSAgNCAxMTowMjoyMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBDYXN0IHRvIGJmZF9zaWduZWRfdm1hLAotCW5vdCBzaWduZWQuCi0JKiBwZWljb2RlLmggKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBVc2UgUEFSQU1TCi0Jd2hlbiBkZWNsYXJpbmcgcGFyYW1ldGVyIHR5cGVzLgotCShwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQotV2VkIEFwciAyOSAxNTozNTowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IElmIHdlIGluY2x1ZGUgYW55IEVMRiB0YXJnZXRzIGluIHRhcmdfZGVmdmVjIGFuZC9vcgotCXRhcmdfc2VsdmVjcywgdGhlbiBhZGQgdGhlIGdlbmVyaWMgRUxGIHRhcmdldHMgdG8gdGFyZ19zZWx2ZWNzLgotCSogZWxmMzItZ2VuLmMgKGR1bW15KTogTmV3IHN0YXRpYyBjb25zdCB2YXJpYWJsZS4KLQkoZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgYXMgZWxmX2dlbmVyaWNfaW5mb190b19ob3d0by4KLQkoZWxmX2luZm9fdG9faG93dG9fcmVsKTogRGVmaW5lIGFzIGVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsLgotCSogZWxmNjQtZ2VuLmM6IFNhbWUgY2hhbmdlcyBhcyBlbGYzMi1nZW4uYy4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogRm9yIHRoZSBnZW5lcmljIHRhcmdldCwgaWdub3JlIGEKLQlmYWlsdXJlIG9mIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2guICBGaXggaW5kZW50YXRpb24gYSBiaXQuCi0KLVR1ZSBBcHIgMjggMjA6MDU6NTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKFdJTjMyTElCQUREKTogQWRkIC1saW50bCBvbiBjeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEFwciAyOCAxMjoxNjo1NyAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogIFVwZGF0ZSBPU1I1L1VuaXh3YXJlIHBhdHRlcm5zLgotCi1Nb24gQXByIDI3IDE4OjAyOjI0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWxsb3cgZm9yIGhvbGVzCi0JYmV0d2VlbiBzZWN0aW9ucyBhZGRlZCBieSBhIGxpbmsgc2NyaXB0LgotCi1Nb24gQXByIDI3IDExOjQ5OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogZWxmLmMgKGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmX2dldF9iZmRfbmVlZGVkX2xpc3QpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1TYXQgQXByIDI1IDIwOjA3OjUzIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvKTogUmVwbGFjZSBlbGZzeW0gd2l0aCBvdGhlci4KLQlDaGFuZ2UgYWxsIHVzZXJzLgotCi1TYXQgQXByIDI1IDE4OjI5OjA3IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvKTogQWRkIHRzZWMgJiBlbGZzeW0gbWVtYmVycy4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IEZpbGwgdGhlbSBpbi4KLQkoZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwpOiBJbXBsZW1lbnQgbW9yZSB0aGFuIGEgc3R1Yi4KLQkoZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IFNFQ19MT0FEIG9yIGRlZmF1bHQKLQlhbGlnbm1lbnQgb24gLnNjb21tb24uCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBNZXJnZSB1c2UgY291bnRzIGFzIHdlbGwuCi0KLVNhdCBBcHIgMjUgMTQ6MDc6MjkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbik6IFVzZSB0aGUgcHJvcGVyIHNlY3Rpb24KLQlmb3IgY2FsY3VsYXRpbmcgYSBsb2NhbCBzeW1ib2wncyBhZGRyZXNzLgotCShlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzKTogU2tpcCBlbnRyaWVzIHdpdGggMCB1c2UgY291bnQuCi0JU2V0IHRoZSAuZ290J3MgY29va2VkIHNpemUgYXMgd2VsbCBhcyB0aGUgcmF3IHNpemUuCi0KLUZyaSBBcHIgMjQgMDk6MTY6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkCi0JaW50ZXJuYXRpb25hbGlzYXRpb24gb2YgcHJpbnRlZCBpbmZvcm1hdGlvbi4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IEFkZAotCWludGVybmF0aW9uYWxpc2F0aW9uIG9mIHByaW50ZWQgaW5mb3JtYXRpb24uCi0KLUZyaSBBcHIgMjQgMTI6MDk6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1zLmMgKHN0cnVjdCBpbmRleGVudHJ5KTogQ2hhbmdlIGRpcmVjdG9yeV9uYW1lLCBmaWxlX25hbWUsCi0JYW5kIGZ1bmN0aW9uX25hbWUgZmllbGRzIHRvIGNoYXIgKi4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogQ2hhbmdlIGNhY2hlZF9maWxlX25hbWUgZmllbGQgdG8gY2hhciAqLgotCi1UaHUgQXByIDIzIDA4OjEzOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoZGlyX25hbWVzKTogQWRkIG1pc3NpbmcgTl8oKSBtYWNyb3MgdG8gZGlyX25hbWVzIGFycmF5LgotCi1XZWQgQXByIDIyIDEzOjA2OjE1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAxNzo0ODo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWRhdGEtbG9jYWwpOiBNYWtlICQoaW5jbHVkZWRpcikuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEFwciAyMiAxMzowNjoxNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oOiBVc2UgYGdldHRleHQnIGFuZCBub3QgYGRnZXR0ZXh0JyBmb3Igbm93LgotCi1XZWQgQXByIDIyIDEyOjUzOjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogQWRkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsZCBmb3IgTmljaydzIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMjEgMjM6MTE6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogRml4IGxvc3NhZ2UgaW4gbGFzdAotCWNoYW5nZSB3cnQgbGVuZ3RoID09IG1heF9uYW1lbGVuLgotCi1UdWUgQXByIDIxIDIxOjE5OjM2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBsaWJiZmQtaW4uaDogQWRkZWQgZ2V0dGV4dCBpbmNsdWRlcyBhbmQgZGVmaW5lcy4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBBZGRlZCBwby4KLQkoUE9URklMRVMpOiBOZXcgbWFjcm8uCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkoU09VUkNFX0hGSUxFUyk6IE5ldyBtYWNyby4KLQkoSEZJTEVTKTogVXNlIGl0LgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2JmZC5wb3Q6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAyMSAxMzozODoxOCAxOTk4IFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMpOiAgQ29weSBjb3JlX3Byc3RhdHVzIGZyb20gdGhlIGZpcnN0Ci0JTlRfUFJTVEFUVVMgbm90ZSBzZWN0aW9uIGVuY291bnRlcmVkLCBpdCBjb250YWlucyB0aGUgc3RhdHVzIG9mCi0JdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGhyZWFkIHdoZW4gdGhlIGNvcmUgZmlsZSB3YXMgd3JpdHRlbi4KLQotVHVlIEFwciAyMSAxMDowMDoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLmg6IEFkZCBleHRyYSBwYXJhbWV0ZXIgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gb3ZlcnJpZGVhYmxlIGZ1bmN0aW9uLgotCSogY29mZmxpbmsuYzogUGFzcyBleHRyYSBwYXJhbWV0ZXIgdG8KLQliZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gZnVuY3Rpb24uCi0JKiBiZmQtaW4uaDogQWRkIHByb3RvdHlwZXMgZm9yIGV4cG9ydGVkIEFSTSBpbnRlcndvcmtpbmcKLQlmdW5jdGlvbnMuCi0JKiBwZWljb2RlLmg6IEFSTSBzcGVjaWZpYyBjb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gQkZECi0JY29kaW5nIGNvbnZlbnRpb25zLgotCSogY29mZmNvZGUuaDogQVJNIHNwZWNpZmljIGNvZGUgcmVvcmdhbmlzZWQgdG8gY29uZm9ybSB0byBCRkQKLQljb2RpbmcgY29udmVudGlvbnMuCi0JKiBjb2ZmLWFybS5jOiBDb2RlIHJlb3JnYW5pc2VkIHRvIGNvbmZvcm0gdG8gdGhlIEJGRCBjb2RpbmcKLQljb252ZW50aW9ucy4gIEdsb2JhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYW4gQVJNCi0Jc3BlY2lmaWMgaGFzaCB0YWJsZSBzdHJ1Y3R1cmUgYW5kIGEgbmV3IGZ1bmN0aW9uOgotCWJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nKCkgaGFzIGJlZW4gY3JlYXRlZCB3aGljaCBpcwotCWNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cy4KLQotVHVlIEFwciAyMSAwMDoxMTo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBTaW1wbGlmeSBlbmQtb2YtbmFtZSB0ZXN0LgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcyk6IFJlbmFtZWQgZnJvbQotCWVsZjY0X2FscGhhX3JlbGF4X2ZpbmRfcmVsb2Nfb2ZzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkoZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rKTogUHV0IHNtYWxsIGNvbW1vbnMgaW4gLnNjb21tb24gbm90IC5zYnNzLgotCShlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucyk6IERvbid0IG1lcmdlIC5nb3Qgc2VjdGlvbnMgdHdpY2UuCi0KLVNhdCBBcHIgMTggMDE6MjE6MDQgMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZGVkIHNwYXJjODZ4IHN1cHBvcnQuCi0KLUZyaSBBcHIgMTcgMjI6Mjk6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEbyBub3QgY29tcGxhaW4gYWJvdXQKLQlhbiBvdXQgb2YgcmFuZ2UgcGMtcmVsYXRpdmUganVtcC9jYWxsIHRvIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQotVGh1IEFwciAxNiAxMzo0OTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3ApOiBEbyBhbGwgZ3BkaXNwCi0JY29tcGFyaXNvbnMgc2lnbmVkLgotCi1UaHUgQXByIDE2IDExOjQzOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBJZiBhIHNsdXJwIHN1YnJvdXRpbmUgcmV0dXJucwotIAlhbiBlcnJvciBvdGhlciB0aGFuIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwgc2V0IHRoZSBlcnJvciB0bwotIAliZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKSBbU0VMRUNUX1ZFQ1Mgbm90IGRlZmluZWRdOiBBZGQKLQliZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYy4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IElmIGFsbCB0aGUgcF9wYWRkciBmaWVsZHMgaW4gdGhlCi0JcHJvZ3JhbSBzZWdtZW50cyBhcmUgemVybywgZG9uJ3Qgc2V0IHBfcGFkZHJfdmFsaWQuCi0KLVdlZCBBcHIgMTUgMjI6MTU6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYzogSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiByZWxheGF0aW9uIC0tCi0JKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIHVzZV9jb3VudCBtZW1iZXIuCi0JKGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyk6IEluaXRpYWxpemUgYW5kIGluY3JlbWVudCBpdC4KLQkoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMpOiBDaGVjayBpdCB3aGVuIGNvbnNpZGVyaW5nIG1lcmdpbmcuCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBEcm9wIGVudHJpZXMgd2l0aCB6ZXJvIHVzZS4KLQkoZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogU3BsaXQgb3V0IGdvdCBzaXppbmcgLi4uCi0JKGVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zKTogLi4uIGhlcmUuICBOZXcgZnVuY3Rpb24uCi0JKGVsZjY0X2FscGhhX3JlbGF4X2ZpbmRfcmVsb2Nfb2ZzKTogTmV3IGZ1bmN0aW9uLgotCShlbGY2NF9hbHBoYV9yZWxheF93aXRoX2xpdHVzZSk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZSk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9yZWxheF9vcHRfY2FsbCk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCShlbGY2NF9hbHBoYV9ob3d0b190YWJsZSk6IEltcGxlbWVudCBHUFJFTEhJR0gvTE9XICYgSU1NRURfR1BfMTYuCi0JKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQotV2VkIEFwciAxNSAxNjowODo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogVXNlIG5ldyBFTV9TUEFSQ1Y5IHN5bWJvbC4KLQkqIGVsZjY0LXNwYXJjLmMgKEVMRl9NQUNISU5FX0NPREUpOiBMaWtld2lzZS4KLQkoRUxGX01BQ0hJTkVfQUxUMSk6IE5ldy4gIFNldCB0byBFTV9PTERfU1BBUkM2NC4KLQotV2VkIEFwciAxNSAxMTozNDozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIC1sa2VybmVsMzIgdG8gV0lOMzJMSUJBREQgb24gY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBBcHIgMTMgMTY6NDY6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGliYmZkX2xhX0xJQkFERCk6IEFkZCBAV0lOMzJMSUJBRERALgotCShsaWJiZmRfbGFfTERGTEFHUyk6IEFkZCBAV0lOMzJMREZMQUdTQC4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIGFuZCBzdWJzdGl0dXRlIFdJTjMyTERGTEFHUyBhbmQKLQlXSU4zMkxJQkFERC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTAgMTM6NDQ6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1vdmUgYSBQRSBDT01EQVQgc3ltYm9sCi0JYmVmb3JlIGFueSBvdGhlciBzeW1ib2xzIGluIHRoZSBzYW1lIHNlY3Rpb24uCi0KLVdlZCBBcHIgIDggMTQ6NTA6MjMgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGMqLSotKik6IFJlbW92ZSBQb3dlclBDIE5UIHN1cHBvcnQgZnJvbSBFTEYKLQlzeXN0ZW1zLgotCi1UdWUgQXByICA3IDE2OjI1OjMxIDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAoY29tcF91bml0KTogTW92ZSBpdCBlYXJsaWVyIGluIHRoZSBzb3VyY2UuIEFkZAotCWFkZHJfc2l6ZS4KLQkocmVhZF9hZGRyZXNzKTogUmVwbGFjZSAnYmRmKicgYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0gICAgICAgIFVzZSBhZGRyX3NpemUgZm9yIGFkZHJlc3Mgc2l6ZSwgcmF0aGVyIHRoYW4gc2l6ZW9mKGJmZF92bWEpLgotCShyZWFkX2F0dHJpYnV0ZSk6IFJlcGxhY2UgYmRmKiBhcmd1bWVudCB3aXRoICdjb21wX3VuaXQqJyBhcmd1bWVudC4KLQlGaXggY2FsbCB0byByZWFkX2FkZHJlc3MuCi0JKGRlY29kZV9saW5lX2luZm8pOiBSZXBsYWNlIGJkZiogYXJndW1lbnQgd2l0aCAnY29tcF91bml0KicgYXJndW1lbnQuCi0JU2NyYXAgb3RoZXIgdW5uZWVkZWQgYXJndW1lbnRzLiAgRml4IGNhbGwgdG8gcmVhZF9hZGRyZXNzLgotCShzY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyk6IEZpeCBjYWxsIHRvIHJlYWRfYXR0cmlidXRlLgotCShwYXJzZV9jb21wX3VuaXQpOiBXZSBub3cgaGFuZGxlIG1vcmUgdmFsdWVzIGZvciBhZGRyX3NpemUuCi0JU2V0IGFkZHJfc2l6ZSBpbiB1bml0LiAgRml4IGNhbGwgdG8gcmVhZF9hdHRyaWJ1dGUgYW5kCi0JZGVjb2RlX2xpbmVfaW5mby4KLQotVHVlIEFwciAgNyAxNTo0NDo0NyAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuYyAocGFyc2VfY29tcF91bml0KTogRHJvcCB1c2Ugb2YgdW5pdC0+bmFtZSB3aGVuIGl0IGlzIG51bGwuCi0KLVR1ZSBBcHIgIDcgMTI6MzU6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogQWRkIG02OGsgY2FzZXMgYmFjayB0byBkZWZhdWx0Ci0Jc3dpdGNoLCByZXZlcnRpbmcgcGF0Y2ggb2YgTWFyY2ggMjUsIHNpbmNlIElFRUUgc3VwcG9ydCBkZXBlbmRzCi0JdXBvbiB0aGVtLgotCi1Nb24gQXByICA2IDE0OjA2OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotU3VuIEFwciAgNSAxNjoyMTo0NCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IEZpeCBjb21wdXRhdGlvbiBvZgotCXNvbV9vZmZzZXQgd2hlbiB3ZSBoYXZlIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLVN1biBBcHIgIDUgMTY6MDQ6MzkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAoc3RhbXAtbGliKTogQ2hlY2sgdGhhdCAubGlicy9saWJiZmQuYSBleGlzdHMgYmVmb3JlCi0JdHJ5aW5nIHRvIGNvcHkgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAgMyAxMTowOTo0MiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBHZW5lcmF0ZSBzZWN0aW9uCi0Jc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKGVsZl9tNjhrX2FkanVzdF9keW5pbmR4KTogTmV3IGZ1bmN0aW9uLCB1c2VkIGJ5IGFib3ZlIGNvZGUuCi0JKGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSB0aGUgc2VjdGlvbgotCXN5bWJvbHMuCi0JKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGFuZ2UgYWJvcnQgdG8gQkZEX0FTU0VSVC4KLQotV2VkIEFwciAgMSAxNjowNDowMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChpbl9yZWxvY19wKTogVXNlIEFSTV9SVkEzMiBpbiBwbGFjZSBvZiBjb25zdGFudAotCXZhbHVlIDExLgotCi1XZWQgQXByICAxIDEzOjM2OjU4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24sIGNhc2UgUl82OEtfUExUKk8pOiBGaXgKLQlhc3NlcnRpb24uCi0KLVR1ZSBNYXIgMzEgMDA6MTI6MTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBDb3JyZWN0bHkgaGFuZGxlCi0JYWJzb2x1dGUgc3ltYm9scy4KLQotTW9uIE1hciAzMCAxMjo0NjoxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotTW9uIE1hciAzMCAxMjoyMDo1MCAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+Ci0KLQkqIHN5bXMuYyAoRU5BQkxFX0NBQ0hJTkcpOiBEZWZpbmUuCi0JKHN0cnVjdCBpbmRleGVudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3Qgc3RhYl9jYWNoZSk6IFJlbW92ZS4KLQkoY21waW5kZXhlbnRyeSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IEFkZCBuZXcgZmllbGRzOiBpbmRleHRhYmxlLAotCWluZGV4dGFibGVzaXplLCBjYWNoZWRfaW5kZXhlbnRyeSwgY2FjaGVkX29mZnNldCwgY2FjaGVkX3N0YWIsIGFuZAotCWNhY2hlZF9maWxlX25hbWUuICBSZW1vdmUgZmllbGRzOiBmaWxlX2NhY2hlLCBmdW5jdGlvbl9jYWNoZSwgYW5kCi0JbGluZV9jYWNoZS4KLQkoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBSZXdyaXRlIHRvIGJ1aWxkIGEgc29ydGVkCi0JaW5kZXggdGFibGUgYW5kIHNlYXJjaCBpdC4KLQotTW9uIE1hciAzMCAxMDozOTozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2FsbAotCWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBvbmNlIHdlJ3ZlIHNlZW4gdGhlIGxhc3QgU0VDX0FMTE9DIHNlY3Rpb24uCi0KLQkqIGNwdS1taXBzLmM6IFJlbW92ZSB0cmFpbGluZyBjb21tYSBhdCBlbmQgb2YgZW51bWVyYXRpb24gbGlzdC4KLQotU2F0IE1hciAyOCAxNjozMzowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IERlZmluZSBhbGwgZ2xvYmFsbHkgdmlzaWJsZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucwotCW9ubHkgd2hlbiBDT0ZGX1dJVEhfUEUgaXMgbm90IGRlZmluZWQuCi0JKiBjb25maWd1cmUuaW4gKGFybXBlX2xpdHRsZV92ZWMsIGFybXBlX2JpZ192ZWMpOiBBZGQKLQljb2ZmLWFybS5sby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyNyAxNjowNjowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhb3V0LWFybS5jIChNWShmaXhfcGNyZWxfMjYpKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogYXJjaGl2ZS5jIChfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHJfbWFnKTogTGlrZXdpc2UuCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogTGlrZXdpc2UuCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogTGlrZXdpc2UuCi0JKiBiaW5hcnkuYyAobWFuZ2xlX25hbWUpOiBMaWtld2lzZQotCSogY29mZi1hcm0uYyAoYW91dGFybV9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KLQkqIGNvZmYtc2guYyAoc2hfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1zdGdvMzIuYyAoY3JlYXRlX2dvMzJfc3R1Yik6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9saW5lX3RhYmxlKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX2FybWFwKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IExpa2V3aXNlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IExpa2V3aXNlLgotCShtYW5nbGVfbmFtZSk6IExpa2V3aXNlLgotCSogcmlzY2l4LmMgKHJpc2NpeF9maXhfcGNyZWxfMjYpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19zY2FuKTogTGlrZXdpc2UuCi0JKiBzdGFicy5jIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGFvdXQtbnMzMmsuYyAoX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guICBEZWNsYXJlIHBhcmFtZXRlcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IEFkZCBicmFjZXMgdG8gYXZvaWQgYW1iaWd1b3VzIGlmCi0Jd2FybmluZy4KLQkqIGVsZi5jIChlbGZfc29ydF9zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogY29mZi1hcm0uYyAoY29mZl90aHVtYl9wY3JlbF9jb21tb24pOiBJbml0aWFsaXplIHJlbG9jYXRpb24uCi0JQWRkIGRlZmF1bHQgY2FzZXMgdG8gc3dpdGNoZXMuCi0JKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcy4KLQlBbHdheXMgc2V0IHJzdGF0LgotCShjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBDaGFuZ2UgZmxhZyB2YXJpYWJsZSB0byB0eXBlCi0JZmxhZ3dvcmQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogSW5pdGlhbGl6ZSB1c2VfbG8uCi0JKiBjb2ZmLXBwYy5jIChwcGNfcmVjb3JkX3RvY19lbnRyeSk6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkoZHVtcF90b2MpOiBDaGFuZ2UgY2F0IHRvIGNvbnN0LCBhbmQgaW5pdGlhbGl6ZSBpdC4KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogSW5pdGlhbGl6ZSBzdGFydCBhbmQgdm9mZi4KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkoc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbml0aWFsaXplIHJfc3ltbmR4LgotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBPbmx5IGRlY2xhcmUKLQlvbGRfc29mYXIgaWYgQUxJR05fU0VDVElPTlNfSU5fRklMRS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsaXplIGNzeW0uCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBNYWtlIHR5cGUgYW5kIGNsYXNzIHVuc2lnbmVkLgotCSogY3B1LW5zMzJrLmMgKF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudCk6IEFkZCBkZWZhdWx0IGNhc2UgdG8KLQlzd2l0Y2guCi0JKiBkd2FyZjIuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkocmVhZF8yX3NpZ25lZF9ieXRlcywgcmVhZF80X3NpZ25lZF9ieXRlcyk6IENvbW1lbnQgb3V0LgotCShkZWNvZGVfbGluZV9pbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZXMuCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX3NkYTE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfc3RvcmVfYWRkZW5kX2luX2luc24pOiBMaWtld2lzZS4KLQkodjg1MF9lbGZfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVsZi1iZmQuaCAoZWxmX2xpbmtlcl9zZWN0aW9uX3QpOiBNYWtlIGFsaWdubWVudCB1bnNpZ25lZC4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBNYWtlIGN2ZXJkZWZzIGFuZCBjdmVycmVmcyB1bnNpZ25lZC4KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogQWx3YXlzIHNldCBhZGp1c3QuCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEluaXRpYWxpemUgdG1wX2FkZHIuICBGdWxseQotCXBhcmVudGhlc2l6ZSBleHByZXNzaW9uLgotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWx3YXlzIGluaXRpYWxpemUgaC4KLQkobTMycl9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KLQkobTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIGxhc3QuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogSW5pdGlhbGl6ZSBsYXN0IGFuZCBkaW5keC4KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBSZXR1cm4gYSB2YWx1ZS4KLQkodjg1MF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2Ugc3ltY291bnQgYW5kIGkgdG8KLQl1bnNpZ25lZCBsb25nLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDaGFuZ2UgdmVybnVtIHRvCi0JdW5zaWduZWQgaW50LCBhbmQgaW5pdGlhbGl6ZSBpdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2FzdCAtMSB0byBiZmRfc2l6ZV90eXBlCi0Jd2hlbiBzZXR0aW5nIG9yIGNvbXBhcmluZyB0byBzb25hbWVfaW5keC4KLQkoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogQ2hhbmdlIG51bV9zeW1ib2xzIHRvCi0JdW5zaWduZWQgaW50LgotCSogbGliY29mZi1pbi5oIChjb2ZmX2RhdGFfdHlwZSk6IENoYW5nZSBmbGFncyB0byBmbGFnd29yZC4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBJbml0aWFsaXplIGlkeC4gIENoYW5nZSBqIHRvCi0JYmZkX3NpemVfdHlwZS4gIEluaXRpYWxpemUgaGludF9tZW1iZXIuICBSZW1vdmUgdXNlbGVzcyB0ZXN0IHRvCi0JdGltZV9zdGFtcC4KLQkocGVfcHJpbnRfZWRhdGEpOiBDaGFuZ2UgbnVtX2Z1bmN0aW9ucyBhbmQgbnVtX25hbWVzIGluIHN0cnVjdAotCUVEVF90eXBlIHRvIHVuc2lnbmVkIGxvbmcuICBSZW1vdmUgY2FzdC4gIENoYW5nZSBmcHJpbnRmIGZvcm1hdAotCXN0cmluZy4KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9vYmplY3RfcCk6IENoYW5nZSBpIHRvIHNpemVfdC4KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB1bnNpZ25lZAotCWludC4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIHNocmlua3MgdG8KLQlpbnQgKi4gIFVwZGF0ZSB1c2VzLiAgQ2hhbmdlIGogdG8gbG9uZy4KLQkqIGJmZC1pbjIuaCwgbGliY29mZi5oOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDEwOjEwOjQ2IDE5OTggIENhdGhlcmluZSBNb29yZSA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyBSZW1vdmUgZGVmaW5pdGlvbiBvZiBVU0VfUkVMLgotCSh2ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbGEpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBSZW5hbWVkIGZyb20KLQl2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbi4gIFJlbW92ZWQgcmVwbGFjZSBhcmd1bWVudC4KLQkodjg1MF9lbGZfcmVsb2MpOiBzdG9yZSB0aGUgcmVsb2NhdGlvbiBpbiB0aGUgYWRkZW5kIGZpZWxkIGluc3RlYWQKLQlvZiB0aGUgaW5zbi4KLQkodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6ICBOb3cgY2FsbHMKLQl2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24uCi0JKHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgUmVtb3ZlIGNvZGUgdG8gZ2VuZXJhdGUgUkVMCi0JcmVsb2NhdGlvbnMuCi0KLVRodSBNYXIgMjYgMTM6MzI6MTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UKLQljbGFzcyBpbiB0aGUgbmF0aXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBhbGxvY2F0ZWQgZm9yIGEgbmV3IHNlY3Rpb24KLQlzeW1ib2wuCi0KLVRodSBNYXIgMjYgMTA6MTM6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oOiBDaGFpbiB0b2dldGhlciBjYWxscyB0bwotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKLQljb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgcHJvdG90eXBlcyBmb3IKLQljb2ZmX2FybV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBhbmQKLQljb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLgotCi1XZWQgTWFyIDI1IDE1OjQ1OjU1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IFNldCBwcml2YXRlIGZhbGdzIGV2ZW4gZm9yIGEgUEUKLQlidWlsZC4KLQotCSogcGVpY29kZS5oOiBDYWxsIGFybS1jb2ZmIHByaXZhdGUgZGF0YSBmdW5jdGlvbnMgYWZ0ZXIgaGFuZGxpbmcKLQlwZSBwcml2YXRlIGRhdGEuCi0KLQkqIGNvZmYtYXJtLmM6IFR1cm4gc3RhdGljcyBpbnRvIGdsb2JhbHMgc28gdGhhdCB0aGV5IGNhbiBiZSBzaGFyZWQKLQlib3RoIHBlIGFuZCBwZWkgYmFja2VuZHMuCi0KLVdlZCBNYXIgMjUgMTU6MTk6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoc3Vub3Nfc2V0X2FyY2hfbWFjaCk6IFVzZSBiZmRfbWFjaF9tNjgqIHJhdGhlciB0aGFuCi0JcGxhaW4gbnVtYmVycy4KLQkoc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBMaWtld2lzZS4KLQotV2VkIE1hciAyNSAxMzo1OToyNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbTY4Kik6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyBtNjhrCi0JdmFyaWFudHMuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBSZW1vdmUgbTY4ayBzcGVjaWFsIGNhc2VzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbWlwc2JzZC5jIChNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIGJmZF9tYWNoX202OCogcmF0aGVyCi0JdGhhbiBwbGFpbiBudW1iZXJzLgotCSogc3BhcmNseW54LmMgKE5BTUUobHlueCxzZXRfYXJjaF9tYWNoKSk6IExpa2V3aXNlLgotCSogY3B1LW02OGsuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLiAgQWRkIGVudHJ5IGZvcgotCW02OGs6NjgwMDAuCi0JKGJmZF9tNjhrX2FyY2gpOiBTZXQgbWFjaCBmaWVsZCB0byB6ZXJvIHRvIHNpZ25hbCBubyBleHBsaWNpdAotCXNlbGVjdGlvbiwgY2hhbmdlIHByaW50YWJsZV9uYW1lIHRvIGp1c3QgIm02OGsiIGFuZCBtYWtlIHRoYXQgdGhlCi0JZGVmYXVsdCBpbnN0ZWFkIG9mIG02OGs6NjgwMjAuCi0KLQkqIGFvdXQtdGljMzAuYyAoTkFNRSk6IERlZmluZSB0aGlzIHRvIGF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zCi0JZnJvbSBhb3V0eC5oLgotCShNWV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZSBhcyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0JcmF0aGVyIHRoYW4gTkFNRShhb3V0LGdldF9zZWN0aW9uX2NvbnRlbnRzKS4KLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBGaXggY2FzdC4KLQotCSogZXZheC1hbHBoYS5jIChldmF4X3NldF9hcmNoX21hY2gpOiBPbmx5IGFjY2VwdCBiZmRfYXJjaF9hbHBoYQotCWFuZCBjYWxsIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggdG8gZG8gdGhlIHJlYWwgd29yay4KLQotV2VkIE1hciAyNSAxMDo0MTozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBib3V0LmMgKEJBTFgpOiBJbmNsdWRlIHJldHVybiByZWdpc3RlciBnMTQgYXMgcGFydCBvZiB0aGUgaW5zbi4KLQkoQkFMWF9NQVNLKTogTmV3LgotCShjYWxsanhfY2FsbGJhY2spOiBVc2UgaXQuCi0KLVdlZCBNYXIgMjUgMTE6MTk6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoQkZEX0FMSUdOKTogQ2FzdCB0aGlzIHBhcmFtZXRlciB0byBiZmRfdm1hLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSk6IENoYW5nZQotCWJ5dGVfY291bnQgdG8gdW5zaWduZWQgaW50LgotCShtbjEwMzAwX2VsZl9yZWxheF9zZWN0aW9uKTogSW5pdGlhbGl6ZSBpbnRlcm5hbF9yZWxvY3MuICBSZW1vdmUKLQl1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfY2xvc2VfYW5kX2NsZWFudXApOiBSZW1vdmUgdW51c2VkIGxvY2FsCi0JdmFyaWFibGVzIGVyIGFuZCBlcjEuCi0KLQkqIGNwdS12ODUwLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShzY2FuKTogQ2FzZSBpc2RpZ2l0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIuCi0KLQlGcm9tIFlhbiBNZXJvdGggPFlBTi5NRVJPVEhAc3QuY29tPjoKLQkqIGloZXguYyAoaWhleF9zY2FuKTogQWRkIGV4dGJhc2UgdmFyaWFibGUgc28gdGhhdCBnZXR0aW5nIGFuCi0gCWV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZCBkb2VzIG5vdCBpZ25vcmUgYW55IHByZXZpb3VzCi0gCWV4dGVuZGVkIGFkZHJlc3MuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV2hlbiB3cml0aW5nIG91dCBhbiBleHRlbmRlZCBsaW5lYXIKLSAJYWRkcmVzcyByZWNvcmQsIHplcm8gb3V0IGFueSBwcmV2aW91cyBleHRlbmRlZCBhZGRyZXNzLgotCi1UdWUgTWFyIDI0IDE2OjA5OjQzIDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogaWVlZS5jIChkb19vbmUpOiBDaGVjayBzZWN0aW9uIGJlZm9yZSBkZXJlZmVyZW5jaW5nIGl0LgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlIHdpdGggc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIuCi0JKGllZWVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogTGlrZXdpc2Ugd2l0aCBhYmZkLT5teV9hcmNoaXZlLgotCi1Nb24gTWFyIDIzIDE4OjUxOjQ3IDE5OTggIEpvZWwgU2hlcnJpbGwgIDxqb2VsQE9BUmNvcnAuY29tPgotCi0JKiBjb25maWcuYmZkOiAoc2gqLSotcnRlbXMqKTogU3dpdGNoZWQgZnJvbSBFTEYgdG8gQ09GRi4KLQotTW9uIE1hciAyMyAxNDoyMzozNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucyB0byBwZSBiYWNrZW5kcy4KLQotRnJpIE1hciAyMCAxODo0NzoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFNX0RJU0FCTEVfU0hBUkVELgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLUZyaSBNYXIgMjAgMTE6MjU6NDEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IEJldHRlciBlcnJvciBtZXNzYWdlcwotCXdoZW4gaW50ZXJvd3JraW5nIGNvbmZsdWN0cyBvY2N1ci4gIENvdXJ0ZXN5IG9mIEpvbmF0aGFuIFdhbHRvbgotCWFuZCBUb255IFRob21wc29uLgotCShhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byk6IEZpeGVkIGJpdHNpemUgZmllbGRzIG9mIHJpZ2h0c2hpZnRlZAotCXJlbG9jYXRpb25zLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uIGFuZCBUb255Ci0JVGhvbXBzb24uCi0KLUZyaSBNYXIgMjAgMDI6MjY6NDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV2ZXJ0Ci0JcGFydCBvZiBGZWIgMjIgY2hhbmdlIGNvbnRyb2xpbmcgd2hlbiB0byBvdmVycmlkZSB0aGUgZXhpc3RpbmcKLQlzeW1ib2wgd2l0aCB0aGUgLnBsdCBlbnRyeS4KLQotV2VkIE1hciAxOCAwOToyNjoyNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFkZCB0aHVtYi1wZSB0YXJnZXQuCi0KLQkqIGNvZmZjb2RlLmggKE9USEVSX0dMT0JBTF9DTEFTUyk6IFN1cHBvcnQgdGh1bWIgZXh0ZXJuYWwKLQlmdW5jdGlvbnMgaW4gUEUgYnVpbGQuCi0KLVN1biBNYXIgIDggMjM6Mzc6MjYgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoc3BhcmNsaXRlLSotZWxmKik6IEFkZGVkLgotCi1Nb24gRmViIDIzIDE5OjMxOjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgZWxmLmxvIHRvIGVsZiBzaGVsbCB2YXJpYWJsZS4KLQkqIE1ha2VmaWxlLmFtIChCRkRfTElCUyk6IFJlbW92ZSBlbGYubG8uCi0JKEJGRF9MSUJTX0NGSUxFUyk6IFJlbW92ZSBlbGYuYy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmLmxvLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmLmMuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk4LTAyLTIzIDE1OjUzICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBBIHBjLXJlbGF0aXZlCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGEgbm93LWxvY2FsIHN5bWJvbCBzaG91bGQgbm90IGhhdmUgYSBkeW5hbWljCi0JcmVsb2NhdGlvbi4KLQotTW9uIEZlYiAyMyAxNjoxNzowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEb24ndCBzZXQgQkZEIGZsYWcgSEFTX1NZTVMgaW4KLQlDT0ZGIGZpbGVoZHIgZmxhZ3MuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQcmludCBQRSBmbGFncy4gIEZyb20gTWlrZXkKLQk8amVmZmRiQG5ldHpvbmUuY29tPi4KLQotU3VuIEZlYiAyMiAyMDozOTowMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBjcmVhdGUKLSAJYSBwbHQgZW50cnkgd2hlbiB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgd2UgYXV0aG9yaXRhdGl2ZWx5IGRlZmluZQotIAl0aGUgc3ltYm9sLgotCi1TdW4gRmViIDIyIDIwOjMzOjA1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQ09SRUZJTEUgc2VsZWN0aW9uKTogUmVtb3ZlIHNwYXJjLSotbGludXgqLiAgVGhleQotCWRvbid0IGFjdHVhbGx5IHVzZSB0cmFkLWNvcmUsIGJ1dCBhIFN1bk9TLXN0eWxlIGNvcmUgZmlsZSBoYW5kbGVkCi0JYnkgZ2RiIGRpcmVjdGx5LgotCSogaG9zdHMvc3BhcmNsaW51eC5oOiBSZW1vdmUuCi0KLVdlZCBGZWIgMTggMTU6MzE6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogSWYgdGhlcmUgaXMgbm8gLmlkYXRhIHNlY3Rpb24sIGxvb2sKLQlmb3IgdGhlIGltcG9ydCB0YWJsZXMgaW4gc29tZSBvdGhlciBzZWN0aW9uLiAgTWFrZSB0aGUgaW5pdGlhbAotCWxhYmVsIGxpbmUgdXAgYmV0dGVyIHdpdGggdGhlIGRhdGEuICBQcmludCB0aGUgaW1wb3J0IGFkZHJlc3MKLQl0YWJsZSBldmVuIGlmIHRoZXJlIGlzIG5vIGltcG9ydCBuYW1lIHRhYmxlLiAgSWYgdGhlIGltcG9ydAotCWFkZHJlc3MgdGFibGUgaG9sZHMgYWN0dWFsIGFkZHJlc3NlcywgcHJpbnQgdGhlbS4KLQotVHVlIEZlYiAxNyAxMjo1ODozNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IElmIGZzZWVrIGZhaWxzLCBzYXZlIGVycm5vIGFyb3VuZCBjYWxsIHRvCi0JYmZkX3RlbGwuICBJZiBlcnJubyBpcyBFSU5WQUwsIHNldCBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsIG5vdAotCWJmZF9lcnJvcl9zeXN0ZW1fY2FsbC4KLQotRnJpIEZlYiAxMyAxMzoxMTozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0KLQlGcm9tIEguSi4gTHUgPGhqbEBnbnUub3JnPjoKLQkqIE1ha2VmaWxlLmFtIChsaWJiZmRfbGFfTERGTEFHUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgRmViIDEyIDE3OjMxOjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU5ldEJTRCBwYXRjaGVzIGZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogbmV0YnNkLmggKE1BQ0hUWVBFX09LKTogRGVmaW5lLgotCShNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogVXNlIERFRkFVTFRfQVJDSCBhbmQgREVGQVVMVF9NSUQgd2hlbgotCWNhbGxpbmcgTl9TRVRfTUFDSFRZUEUsIHJhdGhlciB0aGFuIGhhdmluZyBhIHN3aXRjaC4KLQkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBBZGQgTV9QTUFYX05FVEJTRCwgTV9WQVhfTkVUQlNELAotCWFuZCBNX0FMUEhBX05FVEJTRC4KLQkqIGkzODZuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbTY4azRrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERvbid0IGRlZmluZS4KLQkoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbTY4a25ldGJzZC5jOiAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogbnMzMmtuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCSogc3BhcmNuZXRic2QuYyAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUuCi0JKERFRkFVTFRfTUlEKTogRGVmaW5lLgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiB2YXhuZXRic2QuYzogTmV3IGZpbGUuCi0JKiBuZXRic2QtY29yZS5jOiBDbGVhbiB1cC4gIFJlbW92ZSB1bnVzZWQgbWFjcm9zLiAgVXNlIG5ldGJzZAotCXJhdGhlciB0aGFuIG5ldGJzZF9jb3JlLgotCSogdGFyZ2V0cy5jICh2YXhuZXRic2RfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgdmF4bmV0YnNkX3ZlYy4gIElmIE5FVEJTRF9DT1JFIGlzCi0JZGVmaW5lZCwgYWRkIG5ldGJzZF9jb3JlX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IENPUkVGSUxFIGZvciBhbHBoYSotKi1uZXRic2QqIGFuZAotCXBvd2VycGMtKi1uZXRic2QqIHRvIG5ldGJzZC1jb3JlLmxvLiAgSWYgQ09SRUZJTEUgaXMKLQluZXRic2QtY29yZS5sbywgc2V0IENPUkVGTEFHIHRvIC1ETkVUQlNEX0NPUkUuCi0JKiBjb25maWcuYmZkIChhbHBoYSotKi1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHZheG5ldGJzZC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIHZheG5ldGJzZC5jLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSB0aGUgb2xkIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkIHN0dWZmLiAgV2UKLQlub3cgdXNlIGxpYnRvb2wgaW5zdGVhZC4KLQotV2VkIEZlYiAxMSAxNzoxMzowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgdGVraGV4X2luaXQuCi0KLVR1ZSBGZWIgMTAgMTk6MjM6MjggMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUuaW46IFRha2Ugc3RhYi1zeW1zLmxvIG91dCBvZiBzcGFyY2xpbnV4X3ZlYyBsaXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRmViIDEwIDE1OjE2OjM4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0JKiBlbGYzMi12ODUwLmMgKHJlbWVtYmVyX2hpMTZzX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHY4NTBfZWxmX3N0b3JlX2FkZGVuZF9pbl9pbnNuKTogVXNlIHRoZSBhYm92ZSBuZXcgZnVuY3Rpb25zIHRvCi0JbWF0Y2ggdXAgSEk2UyByZWxvY3Mgd2l0aCBMTzE2IHJlbG9jcy4KLQotVHVlIEZlYiAxMCAxNTowMTozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdDogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDkgMTk6NDA6NTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IEZpeCBhbm90aGVyCi0JTE8xNi9ISTE2UyBidWcgYW5kIGltcHJvdmUgY29tbWVudHMgYWJvdXQgd2hhdCBpcyBnb2luZyBvbi4KLQotU2F0IEZlYiAgNyAxNToyNzowMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1GcmkgRmViICA2IDE0OjQ4OjIwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERvIG5vdCBjb21wbGFpbgotCXdoZW4gbWVyZ2luZyB2ODUwIGNvZGUgaW50byB2ODUwZS92ODUwZWEgY29kZS4gIERvIG5vdCBpbml0aWFsaXNlCi0Jb3V0cHV0IGZsYWdzIGlmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUuCi0KLUZyaSBGZWIgIDYgMTE6NTA6MjIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1taXBzLmMgKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBGb3IgQkZEX1JFTE9DX0NUT1IKLQlnZXQgdGhlIHNpemUgZnJvbSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIGluc3RlYWQgb2YgZGlyZWN0bHkKLQlmcm9tIHRoZSBpc2EuCi0KLVRodSBGZWIgIDUgMTQ6MjE6MzQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC1pbi5oIChCRkRfQUxJR04pOiBJZiByb3VuZGluZyB1cCB3b3VsZCBjYXVzZSB0aGUgYWRkcmVzcwotCXRvIHdyYXAsIGp1c3QgcmV0dXJuIGFsbCAxJ3MgYml0cyBpbnN0ZWFkLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgIDUgMTE6NTE6MDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9wZV9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uCi0JaWYgQ09GRl9XSVRIX1BFLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBDT0ZGX1dJVEhfUEUsIGRlZmluZSBhcwotCWNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsCi0Jc2tpcCBlbXB0eSBzZWN0aW9ucywgdG8gbWF0Y2ggY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuCi0KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQpOiBTd2FwIG91dCByX2FkZGVuZCwKLSAJcmF0aGVyIHRoYW4gc3dhcHBpbmcgb3V0IHJfb2Zmc2V0IHR3aWNlLiAgRnJvbSBMdWtlIERlbGxlcgotIAk8bHVrZWRAY3NlLnVuc3cuZWR1LmF1Pi4KLQotV2VkIEZlYiAgNCAxOToxMToyOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGxpYnRvb2xfZW5hYmxlX3NoYXJlZCByYXRoZXIgdGhhbgotCWxpYnRvb2xfc2hhcmVkLiAgUmVtb3ZlIGRpdmVyc2lvbiBoYWNrLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkCi0Jd2l0aCBuZXcgbGlidG9vbC4KLQotV2VkIEZlYiAgNCAxNjoxMDoyMSAxOTk4ICBCcmVudCBCYWNjYWxhICA8YmFjY2FsYUBmcmVlc29mdC5vcmc+Ci0KLQkqIHN5bXMuYyAoc3RydWN0IHN0YWJfY2FjaGUpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyk6IFJlbW92ZSBjYWNoZWRfb2Zmc2V0LCBjYWNoZWRfc3RhYiwKLQljYWNoZWRfc3RyLCBhbmQgY2FjaGVkX3N0cm9mZiBmaWVsZHMuICBBZGQgZmlsZV9jYWNoZSwKLQlmdW5jdGlvbl9jYWNoZSwgYW5kIGxpbmVfY2FjaGUgZmllbGRzLgotCShfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IFVzZSBleHRlbnNpdmUgY2FjaGluZyB0bwotCXNwZWVkIHVwIHNlYXJjaGVzLgotCi1XZWQgRmViICA0IDEzOjM0OjIyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IENoZWNrIGZvciBpbXBvcnQgb2Ygb3JkaW5hbCByYXRoZXIKLQl0aGFuIG5hbWUuCi0JKHBlX3ByaW50X2VkYXRhKTogSWYgdGhlcmUgaXMgbm8gLmVkYXRhIHNlY3Rpb24sIGxvb2sgZm9yIHRoZQotCWV4cG9ydCBkYXRhIGluIHNvbWUgb3RoZXIgc2VjdGlvbi4KLQotTW9uIEZlYiAgMiAyMDowNTo0MiAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiB0byAyLjguNC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLU1vbiBGZWIgIDIgMTc6Mzk6MzkgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCUFkZCB0bXMzMjBjMzAgc3VwcG9ydDoKLQkqIGNwdS10aWMzMC5jOiBOZXcgZmlsZS4KLQkqIGFvdXQtdGljMzAuYzogTmV3IGZpbGUuCi0JKiBjb2ZmLXRpYzMwLmM6IE5ldyBmaWxlLgotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2hfdGljMzApOiBEZWZpbmUuCi0JKGJmZF90aWMzMF9hcmNoKTogRGVjbGFyZS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX3RpYzMwX2FyY2guCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHRpYzMwX2FvdXRfdmVjIGFuZAotCXRpYzMwX2NvZmZfdmVjLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1RJQzMwX0xEUCk6IERlZmluZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWRkIHRpYzMwIGNhc2UuCi0JKGNvZmZfc2V0X2ZsYWdzKTogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkICh0aWMzMC0qLSphb3V0KiwgdGljMzAtKi0qY29mZiopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAodGljMzBfYW91dF92ZWMsIHRpYzMwX2NvZmZfdmVjKTogTmV3IHZlY3RvcnMuCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtdGljMzAubG8uCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LXRpYzMwLmMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQtdGljMzAubG8gYW5kIGNvZmYtdGljMzAubG8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBhb3V0LXRpYzMwLmMgYW5kIGNvZmYtdGljMzAuYy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDIgMTI6MjU6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbik6IEFsbG93IEhJMTZfUyByZWxvYwotCXRvIGxhZyBiZWhpbmQgTE8xNiByZWxvYyBieSBhIGNvdXBsZSBvZiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBGZWIgIDIgMTQ6MDk6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoJChzcmNkaXIpL2JmZC1pbjIuaCk6IEFkZCBkdW1teSBjb21tYW5kIHRvIGZvcmNlCi0JbWFrZSB0byByZWV4YW1pbmUgdGhlIGZpbGUgdGltZXN0YW1wLgotCSgkKHNyY2RpcikvbGliYmZkLmgsICQoc3JjZGRpcikvbGliY29mZi5oKTogTGlrZXdpc2UuCi0KLQkqIGVsZjY0LWFscGhhLmMgKEVMRl9NQVhQQUdFU0laRSk6IENoYW5nZSB0byAweDEwMDAwIGZyb20KLQkweDEwMDAwMC4KLQotRnJpIEphbiAzMCAxOTowNzowNyAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBwcm9jZWR1cmUKLQl0byBjcmVhdGUgLmR5bnNic3MgYW5kIC5yZWxhLnNic3Mgc2VjdGlvbnMuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUHV0IHNwYWNlIGZvciBzbWFsbCBkYXRhIHRvIGJlCi0JY29waWVkIGZyb20gZHluYW1pYyBvYmplY3RzIGludG8gLnNic3MuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogU3RyaXAgLnJlbGEuc2JzcyBpZiB3ZSBkb24ndAotCXVzZSBpdC4gIENvcnJlY3QgdHlwbyBvZiAucmVsYS5zZGF0YTIuCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgcmVsb2MgdG8gd2hlcmUgd2UKLQlwdXQgdGhlIGRhdGEsIHdoaWNoIG1heSBub3cgYmUgaW4gLnNic3MuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEEgU0RBUkVMMTYgcmVsb2MgY2FuIGJlIGluIGR5bnNic3MuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVmaW5lIGFzCi0JcHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgZW1pdCBSX1BQQ19SRUwqIHJlbG9jcwotCWFnYWluc3QgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLgotIAkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgZW1pdCBSX1BQQ19SRUwzMiByZWxvY3MgaW4KLQlzaGFyZWQgbGlicmFyaWVzIHdoaWNoIHJlZmVyIHRvIGxvY2FsIHN5bWJvbHMuICBNYWtlIHN1cmUgdGhhdCB0aGUKLQl0ZXN0IGZvciBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIHJlbG9jIGluIGEgc2hhcmVkIG9iamVjdCBpcyB0aGUKLQlzYW1lIGFzIHRoZSB0ZXN0IGZvciBlbWl0dGluZyBhIHJlbG9jLgotCi1UaHUgSmFuIDI5IDE1OjU1OjM1IDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuICA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBjb25maWcuYmZkIChpWzM0NTZdLSotbWluZ3czMiopOiBOZXcgdGFyZ2V0LgotCSogYWNpbmNsdWRlLm00IChCRkRfQklOQVJZX09QRU4pOiBDaGVjayBmb3IgbWluZ3czMi4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAyOCAxMzo0MToyNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cCk6IE9ubHkgY2hlY2sgdGhlIHN0cnRhYiBpZiB3ZQotCWhhdmUgYSBiZmRfb2JqZWN0LgotCi1UdWUgSmFuIDI3IDIxOjQzOjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQlTcGFyYyB2OSBBQkkgY29tcGxpYW50IFBMVDoKLQkqIGVsZjY0LXNwYXJjLmMgKFBMVF9IRUFERVJfU0laRSk6IFY5IEFCSSB1c2VzIDQgZW50cmllcy4KLQkocGx0X3RlbXBsYXRlcywgc3BhcmM2NF9lbGZfYnVpbGRfcGx0X2VudHJ5KTogRGVsZXRlLgotCShMQVJHRV9QTFRfVEhSRVNIT0xEKTogTmV3IGRlZmluZS4KLQkoR09UX1JFU0VSVkVEX0VOVFJJRVMpOiBWOSBBQkkgb25seSB1c2VzIDEuCi0JKHNwYXJjNjRfZWxmX2J1aWxkX3BsdCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCk6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9wbHRfcHRyX29mZnNldCk6IExpa2V3aXNlLgotCShzcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDaGFuZ2UgaC0+cGx0X29mZnNldCB0bwotCWNvbnRhaW4gdGhlIGluZGV4IGZvciBjb252ZW5pZW5jZS4gIFNraXAgdGhlIGluaXRpYWwgZW50cmllcwotCWluIC5yZWxhLnBsdC4KLQkoc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogWmVybyB0aGUgYWxsb2NhdGVkIGNvbnRlbnRzCi0JbWVtb3J5IGZvciB0aGUgYmVuZWZpdCBvZiAucmVsYS5wbHQuCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDYWxsIHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQuCi0JKHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEtpbGwgdGVtcGxhdGUgc3R1ZmYuICBVc2UKLQlzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0ICYgc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgZm9yIHJlbG9jLgotCShzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERUX1BMVEdPVCBwb2ludHMgdG8gLnBsdC4KLQlDYWxsIHNwYXJjNjRfZWxmX2J1aWxkX3BsdC4KLQkoZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0KTogTm8uCi0JKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IE5vLgotCShlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50KTogOC4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2Nsb3NlX2FuZF9jbGVhbnVwKTogTmV3IGZ1bmN0aW9uOyBmcmVlIHRoZSBzaHN0cnRhYi4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXApOiBEZWNsYXJlIGl0LgotCSogZWxmeHgtdGFyZ2V0LmggKGJmZF9lbGZOTl9jbG9zZV9hbmRfY2xlYW51cCk6IEFycmFuZ2UgZm9yIGl0Ci0JdG8gYmUgY2FsbGVkLgotCi1UdWUgSmFuIDI3IDIxOjQ1OjE1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfbWlwcyopOiBBZGQgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgTUlQUwotCXByb2Nlc3NvcnMuCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG1pcHMgdmFyaWFudHMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVR1ZSBKYW4gMjcgMTU6MDY6MDQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IFByZXNlcnZlIHRoZSBjb250ZW50cyBvZgotCXQyYTNfYl9pbnNuLgotCi1UdWUgSmFuIDI3IDEyOjQ3OjI3IDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LXNjbzMuMnY1Kik6IEVMRiBub3cgdGhlIGRlZmF1bHQuCi0JKGlbMzQ1Nl04NnNjbzMuMnY1KmNvZmYpOiBOZXcgdGFyZ2V0LgotCi1Nb24gSmFuIDI2IDE1OjQxOjMwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluMi5oOiBSZWJ1aWxkIHdpdGggY2hhbmdlcyB0byBjaGV3LS10YWIgZXhwYW5zaW9uLgotCi1UaHUgSmFuIDIyIDIxOjI2OjQ4IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfZ2V0X2Vycm9yX2hhbmRsZXIpOiBBZGQgb3J0aG9nb25hbCBmdW5jdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQotVGh1IEphbiAyMiAyMToxMzozOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0ZWtoZXguYyAodGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGZvciBubyBzeW1ib2xzLgotCi1XZWQgSmFuIDIxIDIxOjE5OjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0byk6IElmIENPRkZfV0lUSF9QRSwgZG9uJ3QKLSAJYWRqdXN0IGFkZGVuZCBmb3IgYW4gb3V0cHV0IGNvbW1vbiBzeW1ib2wgKGZyb20gSmltbXkgQmxhaXIKLSAJPGppbW15YkB3cnMuY29tPikuICBJZiBDT0ZGX1dJVEhfUEUsIGFkanVzdCBhZGRlbmQgZm9yIFBDIHJlbGF0aXZlCi0gCWRlZmluZWQgc3ltYm9sIHRvIGNvdW50ZXJhY3QgYWRqdXN0bWVudCBtYWRlIGluIGdlbmVyaWMgcmVsb2NhdGlvbgotIAljb2RlLgotCi0JKiBkd2FyZjIuYzogSW5jbHVkZSBzeXNkZXAuaCwgbm90IHN0ZGlvLmggYW5kIHN0ZGxpYi5oLgotCi1XZWQgSmFuIDIxIDIxOjE2OjA2IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29mZi1tODhrLmMgKEdFVF9TQ05ESFJfTlJFTE9DKTogRml4IHR5cG8gaW4gbWFjcm8gbmFtZS4KLQkoR0VUX1NDTkRIUl9OTE5OTyk6IExpa2V3aXNlLgotCi1Nb24gSmFuIDE5IDEyOjQ5OjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LXNoLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDb3JyZWN0IG5leHQgZmllbGQgb2Ygc2gzZS4KLQotV2VkIEphbiAxNCAxNzoyMzoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmM6IEFkZCBtYWNyb3MgdG8gaGFuZGxlIE5PUCBpbnNlcnRpb24uCi0KLVdlZCBKYW4gMTQgMTY6MTU6MjIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmtfc3ltYm9sKTogRG9uJ3QgbWFyayB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQkoeGNvZmZfbWFyayk6IExpa2V3aXNlLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBNYXJrIGFic29sdXRlIHN5bWJvbHMuCi0KLVdlZCBKYW4gMTQgMTY6MDM6MTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpOiBTb3J0IHN5bWJvbHMgYmVmb3JlIG91dHB1dAotCXRvIGtlZXAge0NBTEwsQkFMfU5BTUUgc3ltYm9scyBhZGphY2VudC4KLQkoYl9vdXRfc3ltYm9sX2NtcCk6IE5ldyBmdW5jdGlvbi4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05Njk3Ci0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvQ2hhbmdlTG9nLTkxOTMgYi9iZmQvQ2hhbmdlTG9nLTkxOTMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YWY5MzEuLjAwMDAwMDAKLS0tIGEvYmZkL0NoYW5nZUxvZy05MTkzCisrKyAvZGV2L251bGwKQEAgLTEsNzg1MSArMCwwIEBACi1GcmkgRGVjIDMxIDE2OjIzOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCU1pbm9yIGNsZWFudXBzIHN1Z2dlc3RlZCBieSBDb2RlQ2VudGVyLgotCSogYW91dHguaCwgY29mZmdlbi5jLCBlY29mZi5jLCBlY29mZmxpbmsuYywgZWxmLmMsIGxpYmJmZC5jLAotCWxpbmtlci5jLCByZWxvYy5jLCBzZWN0aW9uLmMsIHNyZWMuYzogQWRkZWQgLypBUkdTVVNFRCovIGFzCi0JYXBwcm9wcmlhdGUuCi0JKiBhb3V0eC5oIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyk6IFJlbW92ZWQgdW5uZWNlc3NhcnkgZGVjbGFyYXRpb24uCi0JKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogU2V0IHNvbWUgdGRhdGEgcG9pbnRlcnMgdG8gTlVMTC4KLQkoYWRqdXN0X3pfbWFnaWMpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUgZGF0YV92bWEuCi0JKHN0cmluZ3RhYl9pbml0KTogSW5pdGlhbGl6ZSBoYXNoX3plcm8uCi0JKGFkZF90b19zdHJpbmd0YWIpOiBSZW1vdmVkIHVudXNlZCBmb3VydGggYXJndW1lbnQuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogUmVtb3ZlZCB1c2VsZXNzIHZhcmlhYmxlCi0Jcl9hZGRlbmQuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uKTogQWRkZWQgc29tZSBjYXN0cy4KLQkqIGFyY2hpdmUuYyAoZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lLCBkb19zbHVycF9jb2ZmX2FybWFwLAotCWJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtLCBic2Rfd3JpdGVfYXJtYXAsIGNvZmZfd3JpdGVfYXJtYXApOgotCU1pbm9yIGNvZGUgcmV3cml0aW5nIHRvIG1ha2UgaXQgbW9yZSBDIGxpa2UuCi0JKGRvX3NsdXJwX2JzZF9hcm1hcCk6IEFkZGVkIHNvbWUgY2FzdHMuCi0JKiBlY29mZi5jIChlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUKLQlzY25fYmFzZS4KLQkoZWNvZmZfd3JpdGVfYXJtYXApOiBBZGRlZCBzb21lIGNhc3RzLiAgVXNlICIiIHJhdGhlciB0aGFuICJcMCIuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnKTogQWRkZWQgYSBjYXN0LgotCSogbGliYW91dC5oIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk6IFJlbW92ZWQgdW5uZWNlc3NhcnkKLQlkZWNsYXJhdGlvbi4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfaW5kaXJlY3RfbGlua19vcmRlcik6IEFkZGVkIGEgY2FzdC4KLQkqIG9wbmNscy5jIChuZXdfYmZkKTogUmVtb3ZlZCBhIGNhc3QuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBZGRlZAotCXNvbWUgY2FzdHMuCi0JKiBzcmVjLmMgKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlZCB1c2VsZXNzCi0JdmFyaWFibGUgYnl0ZXNfd3JpdHRlbi4KLQotRnJpIERlYyAzMSAxMTo0NjoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGkzODZtYWNoMy5jIChOX1RYVEFERFIpOiBEb24ndCBkZWZpbmUgYWZ0ZXIgYWxsLgotCShURVhUX1NUQVJUX0FERFIpOiBEb24ndCBpbmNsdWRlIGV4ZWMgaGVhZGVyIHNpemUgaW4gdmFsdWUuCi0KLVRodSBEZWMgMzAgMTU6NDc6NTQgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpMzg2bWFjaDMuYyAoTl9UWFRBRERSKTogRGVmaW5lLgotCi1UaHUgRGVjIDMwIDEzOjM3OjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUV4dGVuc2l2ZSBjaGFuZ2VzIHRvIG1vdmUgdGhlIGJ1bGsgb2YgdGhlIGxpbmtlciBpbnRvIEJGRCBzbyB0aGF0Ci0JbW9yZSBlZmZpY2llbnQgYmFja2VuZCBjb2RlIGNhbiBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyBvYmplY3QKLQlmaWxlcy4gIE9ubHkgZXhpc3RpbmcgZWZmaWNpZW50IGJhY2tlbmQgaXMgYS5vdXQuCi0JKiBzZWNsZXQuYywgc2VjbGV0Lmg6IFJlbW92ZWQuCi0JKiBoYXNoLmMsIGxpbmtlci5jLCBnZW5saW5rLmg6IE5ldyBmaWxlcy4KLQkqIGJmZC1pbi5oOiBSZW1vdmVkIGJmZF9lcnJvcl92ZWN0b3IuICBEZWNsYXJlZCBoYXNoIHRhYmxlCi0Jc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zLgotCShKVU1QX1RBQkxFKTogUmVtb3ZlZCBiZmRfc2VjbGV0X2xpbmssIGFkZGVkCi0JYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzIGFuZAotCWJmZF9maW5hbF9saW5rLgotCSogQWxsIGJhY2tlbmRzOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkZWQgbGlua19uZXh0IGFuZCBhcmNoaXZlX3Bhc3MgZmllbGRzLgotCVJlbW92ZWQgbGRfc3ltYm9scyBmaWVsZC4KLQkoYmZkX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwgYmZkX3VuZGVmaW5lZF9zeW1ib2wsCi0JYmZkX3JlbG9jX3ZhbHVlX3RydW5jYXRlZCwgYmZkX3JlbG9jX2lzX2Rhbmdlcm91cywKLQliZmRfZXJyb3JfdmVjdG9yKTogUmVtb3ZlZC4KLQkoYmZkX2RlZmF1bHRfZXJyb3JfdHJhcCwgYmZkX2Vycm9yX3RyYXAsCi0JYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibHRyYXApOiBSZW1vdmVkLgotCShiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogUGFzcyBsaW5rX2luZm8uICBQYXNzCi0JbGlua19vcmRlciBpbnN0ZWFkIG9mIHNlY2xldC4gIFBhc3Mgc3ltYm9scy4KLQkoYmZkX3JlbGF4X3NlY3Rpb24pOiBQYXNzIGxpbmtfaW5mby4KLQkoYmZkX3NlY2xldF9saW5rKTogUmVtb3ZlZC4KLQkoYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIGJmZF9saW5rX2FkZF9zeW1ib2xzLAotCWJmZF9maW5hbF9saW5rKTogTmV3IG1hY3Jvcy4KLQkqIGxpYmJmZC1pbi5oOiBJZiBfX0dOVUNfXyBpcyBkZWZpbmVkIGFuZCBhbGxvY2EgaXMgbm90LCBkZWZpbmUKLQlhbGxvY2EgYXMgX19idWlsdGluX2FsbG9jYS4gIERlY2xhcmUgaW50ZXJuYWwgbGlua2luZyBmdW5jdGlvbnMuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IENvbW1lbnQgb3V0IGZzZWVrIGFzc2VydGlvbi4gIEl0J3Mgd29ya2VkCi0JZm9yIG1vbnRocy4KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBBZGRlZCBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50IHRvCi0Jc3BlY2lhbF9mdW5jdGlvbiBmaWVsZC4gIENoYW5nZWQgYWxsIGNhbGxlcnMgYW5kIGFsbCBkZWZpbml0aW9ucy4KLQkoYmZkX2dldF9yZWxvY19zaXplKTogTWFrZSBhcmd1bWVudCBhIGNvbnN0IHBvaW50ZXIuCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGQgZXJyb3JfbWVzc2FnZSBhcmd1bWVudCB0byBob2xkCi0Jc3RyaW5nIHNldCBpZiByZXR1cm4gdmFsdWUgaWYgYmZkX3JlbG9jX2Rhbmdlcm91cy4gIENoYW5nZWQgYWxsCi0JY2FsbGVycy4KLQkoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlLCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNlY3Rpb24uYyAoYXNlY3Rpb24pOiBSZW5hbWVkIHNlY2xldHNfaGVhZCBhbmQgc2VjbGV0c190YWlsIHRvCi0JbGlua19vcmRlcl9oZWFkIGFuZCBsaW5rX29yZGVyX3RhaWwuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZXBsYWNlZCBzZWNsZXQgYXJndW1lbnQgd2l0aCBsaW5rX2luZm8KLQlhbmQgbGlua19vcmRlciBhbmQgc3ltYm9scyBhcmd1bWVudHMgaW4KLQliZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLiAgQWRkZWQgc3ltYm9scyBhcmd1bWVudCB0bwotCWJmZF9yZWxheF9zZWN0aW9uLiAgUmVtb3ZlZCBiZmRfc2VjbGV0X2xpbmsuICBBZGRlZAotCWJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlLCBiZmRfbGlua19hZGRfc3ltYm9scyBhbmQKLQliZmRfZmluYWxfbGluay4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRkYXRhKTogQWRkZWQgZXh0ZXJuYWxfc3ltcywKLQlleHRlcm5hbF9zeW1fY291bnQsIGV4dGVybmFsX3N0cmluZ3MsIHN5bV9oYXNoZXMgZmllbGRzLgotCShvYmpfYW91dF9leHRlcm5hbF9zeW1zLCBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQsCi0Jb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncywgb2JqX2FvdXRfc3ltX2hhc2hlcyk6IE5ldyBhY2Nlc3NvcgotCW1hY3Jvcy4KLQkoV1JJVEVfSEVBREVSUyk6IE9ubHkgb3V0cHV0IHN5bWJvbHMgaWYgb3V0c3ltYm9scyBpcyBub3QgTlVMTC4KLQkqIGFvdXR4Lmg6IFdyb3RlIG5ldyBiYWNrIGVuZCBsaW5rZXIgcm91dGluZXMuCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogUmV0dXJuIGJvb2xlYW4gdmFsdWUuICBEb24ndCB1c2UKLQliZmRfZXJyb3JfdmVjdG9yLgotCShOQU1FKGFvdXQsd3JpdGVfc3ltcykpOiBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4gIENoZWNrIHJldHVybiB2YWx1ZQotCW9mIHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzIGFuZCBiZmRfd3JpdGUuCi0JKiBhb3V0LXRhcmdldC5oIChmaW5hbF9saW5rX2NhbGxiYWNrKTogTmV3IGZ1bmN0aW9uLgotCShNWV9iZmRfZmluYWxfbGluayk6IE5ldyBmdW5jdGlvbi4KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4KLQl2YWx1ZSBvZiBhb3V0XzMyX3dyaXRlX3N5bXMuCi0JKiBocDMwMGhwdXguYyAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYyAoV1JJVEVfSEVBREVSUyk6IExpa2V3aXNlLgotCSogbGliYW91dC5oIChXUklURV9IRUFERVJTKTogTGlrZXdpc2UuCi0JKiBib3V0LmM6IENoYW5nZWQgZnVuY3Rpb25zIHRvIHVzZSBsaW5rX2luZm8tPmNhbGxiYWNrcyByYXRoZXIKLQl0aGFuIGJmZF9lcnJvcl92ZWN0b3IsIGFuZCBsaW5rX29yZGVycyByYXRoZXIgdGhhbiBzZWNsZXRzLgotCSogY29mZi1hbHBoYS5jOiBMaWtld2lzZS4KLQkqIGNvZmYtaDgzMDAuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4NTAwLmM6IExpa2V3aXNlLgotCSogY29mZi1zaC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtejhrLmM6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExvb2sKLQl1cCBfZ3AgaW4gdGhlIGhhc2ggdGFibGUgcmF0aGVyIHRoYW4gaW4gb3V0c3ltYm9scy4KLQkqIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKTogUGFzcyBlcnJvcnMgYmFjayBpbiBuZXcgZXJyb3JfbWVzc2FnZQotCWFyZ3VtZW50IHJhdGhlciB0aGFuIHByaW50aW5nIHRoZW0uCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogVGFrZSBsaW5rX2luZm8gYW5kCi0JbGlua19vcmRlciBhcmd1bWVudHMgcmF0aGVyIHRoYW4gc2VjbGV0LiAgQ2hhbmdlZCBhbGwgdXNlcyBhbmQKLQlkZWZpbml0aW9ucy4KLQkoYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSk6IFBhc3MgbGlua19pbmZvIGFyZ3VtZW50cy4gIENoYW5nZWQKLQlhbGwgdXNlcyBhbmQgZGVmaW5pdGlvbnMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBlY29mZi5jIChlY29mZl9nZXRfZXh0cik6IElmIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGxpbmtlciwgYnV0Ci0Jbm90IGJ5IEVDT0ZGLCBtYWtlIGl0IHNjQWJzLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IFJlbmFtZWQgZnJvbSBlY29mZl9iZmRfc2VjbGV0X2xpbmsgYW5kCi0JcmV3cml0dGVuLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogUmVuYW1lZCBmcm9tCi0JbWlwc19lbGZfc2VjbGV0X2xpbmsgYW5kIHJld3JpdHRlbi4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uKTogQWRkZWQgbGlua19pbmZvCi0JZmllbGQuCi0JKG5ld19zdHViLCBhZGRfc3R1Yl9ieV9uYW1lLCBocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YiwKLQlocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViLCBocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOgotCUFkZGVkIGxpbmtfaW5mbyBhcmd1bWVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgcXVpdCBpZiBvdXRzeW1ib2xzIGlzCi0Jbm90IE5VTEwuCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9zZWN0aW9ucyk6IFJldHVybiBib29sZWFuIHZhbHVlIHJhdGhlciB0aGFuCi0JdXNpbmcgYmZkX2Vycm9yX3ZlY3Rvci4KLQkob2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0Jb2FzeXNfd3JpdGVfc2VjdGlvbnMuCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBEb24ndCBkZWNsYXJlIHFzb3J0IG9yIHN0cnRvbC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBSZW1vdmVkIHNlY2xldC5vLiAgQWRkZWQgaGFzaC5vIGFuZCBsaW5rZXIuby4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBzZWNsZXQuYy4gIEFkZGVkIGhhc2guYyBhbmQgbGlua2VyLmMuCi0JKEhGSUxFUyk6IFJlbW92ZWQgc2VjbGV0LmguICBBZGRlZCBnZW5saW5rLmguCi0KLVRodSBEZWMgMzAgMDc6NDE6MzYgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6ICBSZXR1cm4gemVybyBmaWxsZWQgYnVmZmVyCi0JaWYgc2VjdGlvbiBoYXMgbm8gY29udGVudHMuCi0KLVR1ZSBEZWMgMjggMTI6NDM6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2VsZl9nZW5lcmljX3JlbG9jKTogSWYgdGhpcyBpcyBub3QgYW4gaW5wbGFjZSByZWxvYywKLQl0aGVuIHNraXAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBldmVuIGlmIHRoZSBhZGRlbmQgaXMgbm9uLXplcm8uCi0KLVR1ZSBEZWMgMjEgMDk6MjI6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcykgW1NXQVBfT1VUX1JFTE9DX09GRlNFVF06IENvcHkKLQlhZGRlbmQgdG8gcl9vZmZzZXQgZmllbGQuCi0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGRlZCBjb2ZmLXNwYXJjLmMuICBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogY29mZi1zcGFyYy5jIChTV0FQX0lOX1JFTE9DX09GRlNFVCwgU1dBUF9PVVRfUkVMT0NfT0ZGU0VULAotCUNBTENfQURERU5EKTogRGVmaW5lLgotCi0JKiBhaXgzODYtY29yZS5jIChhaXgzODZfY29yZV9maWxlX3ApOiBVc2UgY2RfcmVnc1swXSBmb3IgY29tcHV0aW5nCi0JdGhlIG9mZnNldG9mIGJlY2F1c2UgQUlYIC9iaW4vY2MgZG9lcyBub3QgbGlrZSB0byB0YWtlIHRoZSBhZGRyZXNzCi0Jb2YgYW4gYXJyYXkuICAoRnJvbSBNaW5oIFRyYW4tTGUuKQotCi1UaHUgRGVjIDE2IDEzOjA2OjMyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBUaHUgRGVjIDE2IDE1OjQxOjA2IDE5OTMgIFBldGVyIEhvb2dlbmJvb20gIChob29nZW5AY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBNYWtlIHN1cmUgdG8gY29weQotCXRoZSByZXR1cm4gcG9pbnRlciBpbnRvICVyMiBpZiBubyBqdW1wLWluLWNhbGwtZGVsYXktc2xvdAotCW9wdGltaXphdGlvbiB3YXMgZG9uZS4KLQotCSogaG9zdHMvaHAzMDBic2QuaDogQ29ycmVjdGx5IGlkZW50aWZ5IDQuM0JTRCB2cyA0LjRCU0QuCi0KLVdlZCBEZWMgMTUgMDg6MDQ6MTYgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiAodGltZSk6IERvbid0IGRlY2xhcmU7IGNvbmZsaWN0cyBvbiBNYWNoMy4KLQotCSogaG9zdHMvaTM4Nm1hY2gzLmggKEhPU1RfUEFHRV9TSVpFKTogU2V0IHRvIDEgdG8gYXZvaWQgcGFkZGluZy4KLQkoSE9TVF9TRUdNRU5UX1NJWkUpOiBTZXQgdG8gMCBmb3Igc2FtZSByZWFzb24uCi0KLQkqIGkzODZtYWNoMy5jIChQQUdFX1NJWkUsIFNFR01FTlRfU0laRSk6IFNhbWUgY2hhbmdlcyBhcyBhYm92ZS4KLQkoVEVYVF9TVEFSVF9BRERSKTogQ29ycmVjdC4KLQkoTVlfYmFja2VuZF9kYXRhKTogRGVmaW5lLgotCi0JKiBhb3V0eC5oIChhZGp1c3Rfb19tYWdpYywgYWRqdXN0X3pfbWFnaWMsIGFkanVzdF9uX21hZ2ljKToKLQlOZXcgZnVuY3Rpb25zOyBjb2RlIG1vdmVkIGZyb20gYW91dF88c2l6ZT5fYWRqdXN0X3NpemVzX2FuZF92bWFzLgotCi1UdWUgRGVjIDE0IDIxOjQ4OjMzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0gICAgICAgICogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRml4IHRoaW5rb3MgaW4gYXV4aWxpYXJ5IGhlYWRlcgotCXN1cHBvcnQuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBMaWtld2lzZS4KLQotTW9uIERlYyAxMyAyMzozNDo0OCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSAnVCcgZmllbGQKLQlzZWxlY3RvcnMgZm9yIFBJQyBjb2RlLgotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgJ1QnIGZpZWxkIHNlbGVjdG9ycy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0RMVF9SRUwsIFJfRlNFTCwgUl9SU0VMLCBSX0xTRUwKLQlyZWxvY2F0aW9ucyBuZWVkZWQgYnkgUElDLgotCi1UdWUgRGVjICA3IDE1OjQ3OjUxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaDogIEZpeGVzIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLi4uCi0KLVR1ZSBEZWMgIDcgMTU6MTA6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJubG0uaCAobmxtX2JhY2tlbmRfZGF0YSk6IFJlbW92ZWQgbWFjcm8gZGVmaW5pdGlvbi4KLQkobmxtX2FscGhhX2JhY2tlbmRfZGF0YSk6IEFkanVzdGVkIGFjY29yZGluZ2x5LgotCi1TdW4gRGVjICA1IDE5OjMyOjA4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGbGVzaCBvdXQgY29kZSBmb3IgaGFuZGxpbmcgc2ltcGxlCi0JYXV4aWxpYXJ5IGhlYWRlcnMuCi0JKGJmZF9zb21fYXR0YWNoX2F1eF9oZHIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tZGF0YSk6IEFkZCBmaWVsZHMgZm9yIGF0dGFjaGluZyB2ZXJzaW9uIGFuZAotCWNvcHlyaWdodCBoZWFkZXJzLiAgQWRkIGFjY2Vzc29yIG1hY3Jvcy4KLQotCSogc29tLmMgKFJfRExUX1JFTCwgUl9BVVhfVU5XSU5ELCBSX1NFQ19TVE1UKTogQWRkIHByb3RlY3RlZAotCWRlZmluaXRpb25zIGZvciBvbGQgdmVyc2lvbnMgb2YgSFBVWCB3aGljaCBmYWlsIHRvIGRlZmluZSB0aGVtLgotCShzb21faHBwYV9ob3d0b190YWxiZSk6IEFkZCBSX0RMVF9SRUwsIFJfQVVYX1VOV0lORCwgYW5kIFJfU0VDX1NUTVQKLQlub3cgdGhhdCB0aGV5J3JlIHNhZmUuICBEZWxldGUgYm9ndXMgUl9TVEFURU1FTlQgcmVsb2NhdGlvbnMuCi0KLQkqIHNvbS5jIChzb21faHBwYV9ob3d0b190YWJsZSk6IEFkZCBtaXNzaW5nIFJfRU5EX1RSWS4gIERlbGV0ZSAKLQlleHRyYSBSX0RBVEFfT1ZFUlJJREUuCi0JKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogR2VuZXJhdGUgYSByZWxvY2F0aW9uIGZvciB0aGUgcm91bmRpbmcKLQltb2RlIHNlbGVjdG9yIGlmIG5lZWRlZC4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSByZXF1ZXN0cyBmb3IgYSBjaGFuZ2UgaW4gdGhlIGRlZmF1bHQKLQlyb3VuZGluZyBtb2RlLiAgUm91bmRpbmcgbW9kZXMgZG8gbm90IGNvbnN1bWUgaW5wdXQgYnl0ZXMsIGJ1dAotCWFyZSBqdXN0IG1hcmtlcnMgbXVjaCBsaWtlIFJfRU5UUlkgYW5kIFJfRVhJVC4KLQotU2F0IERlYyAgNCAxOTo0MDozMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCUZyaSBEZWMgIDMgMDk6NTU6MTcgMTk5MyAgUGV0ZSBIb29nZW5ib29tICAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9yZWxvYyk6ICBEbyBub3QgZG8gY29kZSByZW9yZGVyaW5nIHdoZW4KLQl0aGUgYnJhbmNoIGluc3RydWN0aW9uIGFzIG9yaWdpbmFsbHkgYmVlbiBudWxsaWZpZWQuCi0JaHBwYV9lbGZfcmVsb2MpOiAgQXZvaWQgdXNlbGVzcyBjYWxsIHRvIGJmZF9wdXRfMzIgKCkgaW4gdGhlCi0JY2FzZSBvZiBubyBjb2RlIHJlb3JkZXJpbmcgZHVlIHRvIGFuIExETyBpbnN0cnVjdGlvbiBpbiB0aGUKLQlkZWxheSBzbG90IG9mIHRoZSBicmFuY2guICBNYWtlIHN1cmUgdG8gcmVsb2NhdGUgdGhlIGNvcnJlY3QKLQlpbnN0cnVjdGlvbi4gIERvIG5vdCBwZXJmb3JtIGluc3RydWN0aW9uIHJlb3JkZXJpbmcgZm9yIG1pbGxpY29kZQotCWNhbGxzLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6ICBDaGFuZ2UgdGhlIHJlbG9jYXRpb24gdHlwZQotCXRvIFJfSFBQQV9TVFVCX0NBTExfMTcgd2hlbiBzcGVjaWFsIHByb2Nlc3NpbmcgbWlnaHQgYmUgbmVlZGVkLgotCShocHBhX2VsZl9idWlsZF9sb25nX2JyYW5jaF9zdHViKTogUHJldmVudCBjb2RlIHJlb3JkZXJpbmcgb24KLQlhIGNhbGwgZnJvbSBhIGxpbmtlciBzdHViIHRvIGFub3RoZXIgbGlua2VyIHN0dWIgYW5kIGZvciBtaWxsaWNvZGUKLQljYWxscy4gIERvIG5vdCB0cmFzaCB0aGUgcmV0dXJuIHJlZ2lzdGVyIGZvciBjYWxscyBmcm9tIG9uZSBsaW5rZXIKLQlzdHViIHRvIGEgc2Vjb25kIGxpbmtlciBzdHViLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGZfaHBwYV9ob3d0b190YWJsZSk6ICBQTEFCRUwgYW5kIERMVAotCXJlbG9jYXRpb25zIGFyZSBub3QgcGMtcmVsYXRpdmUuCi0KLQkqIGhwcGFfc3R1YnMuaDogKEJMRV9OX1hYWF8wXzMxKTogIE5ldyBpbnN0cnVjdGlvbiB1c2VkIGluCi0JbGlua2VyIHN0dWIgY29kZS4gCi0JKENPUFlfMl8zMSk6ICBMaWtld2lzZS4KLQotRnJpIERlYyAgMyAxODo0MDo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zb2xhcmlzMi5taCAoSERFRklORVMpOiBSZW1vdmUgLURjb25zdD0KLQkqIGhvc3RzL3NvbGFyaXMuaDogSWYgbm90IF9fR05VQ19fLCBkZWZpbmUgY29uc3QgYXMgZW1wdHkuCi0KLVRodSBEZWMgIDIgMTU6NDM6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jOiBBZGRlZCB2YXJpb3VzIGNhc3RzIGZvciAzMi82NCBiaXQgY3Jvc3MgdGFyZ2V0aW5nLgotCShlY29mZl9ta29iamVjdF9ob29rKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBmb3IgdGhlIC5yZWdpbmZvCi0Jc2VjdGlvbiBzbyB0aGF0IHRoZSBsaW5rZXIgaWdub3JlcyBpdC4KLQkqIGVjb2ZmbGluay5jOiBBZGRlZCB2YXJpb3VzIGNhc3RzIGZvciAzMi82NCBiaXQgY3Jvc3MgdGFyZ2V0aW5nLgotCShlY29mZl9hZGRfYnl0ZXMpOiBDaGFuZ2VkIG5lZWQgYXJndW1lbnQgdG8gc2l6ZV90LgotCShiZmRfZWNvZmZfZGVidWdfbGlua19vdGhlcik6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWVjb2ZmX2FkZF9zdHJpbmcuCi0KLQkqIGxpYmJmZC1pbi5oIChuZXdfYmZkKTogVXNlIHZvaWQgcmF0aGVyIHRoYW4gYW4gZW1wdHkgcGFyYW1ldGVyCi0JbGlzdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9vYmpfdGRhdGEpOiBOZXcgZmllbGQgYmFja2VuZF9kYXRhLgotCShubG1fYmFja2VuZF9kYXRhLCBubG1fYWxwaGFfYmFja2VuZF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQgbm9fdW5pbml0aWFsaXplZF9kYXRhLgotCShubG1fbm9fdW5pbml0aWFsaXplZF9kYXRhKTogTmV3IGFjY2Vzc29yIG1hY3JvLgotCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSGFuZGxlCi0Jbm9fdW5pbml0aWFsaXplZF9kYXRhLgotCShubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSk6IFNvcnQgcmVsb2NzIGJ5IGFkZHJlc3MgZm9yIGEKLQlwYXJ0aWN1bGFyIHN5bWJvbCwgdG8gbWFrZSB0aGUgc29ydCBtb3JlIHN0YWJsZS4KLQkobmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhc3QgdGhlIGFyZ3VtZW50cyB0byBxc29ydC4gIEdldCB0aGUKLQl2YWx1ZSBvZiBhIGRlYnVnZ2luZyBzeW1ib2wgdGhlIHNhbWUgd2F5IHdlIGdldCB0aGUgdmFsdWUgb2YgYQotCW5vcm1hbCBzeW1ib2wuCi0JKiBubG0zMi1hbHBoYS5jOiBWYXJpb3VzIGNoYW5nZXMuICBXcml0ZSBvdXQgR1AgYW5kIC5saXRhIHJlbG9jcy4KLQlTZXQgbm9fdW5pbml0aWFsaXplZF9kYXRhIHRvIHRydWUuCi0JKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCksIG5sbTMyLXNwYXJjLmMKLQkobmxtMzJfc3BhcmNfYmFja2VuZCk6IFNldCBub191bmluaXRpYWxpemVkX2RhdGEgZmllbGQgZmFsc2UuCi0JKiBubG1zd2FwLmggKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQpOiBaZXJvIG91dCBkZXN0aW5hdGlvbgotCWJlZm9yZSBmaWxsaW5nIGl0IGluLgotCi1XZWQgRGVjICAxIDIxOjQ3OjU4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NlY3Rpb25fdHlwZSwgc29tX2RlY29kZV9zeW1jYWxzcyk6IE5ldyBmdW5jdGlvbnMuCi0JKHNvbV9nZXRfc3ltYm9sX2luZm8pOiBVc2UgdGhlbS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCB0aGUgc2VjdGlvbiBvZiBjb21tb24gYW5kIHVuZGVmaW5lZAotCXN5bWJvbHMgY29ycmVjdGx5LgotCi1XZWQgRGVjICAxIDE0OjE1OjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEluaXRpYWxpemUgbG9jYWwgdmFyIExBU1RfU1lNX0lEWCwgdG8KLQltYWtlIGdjYyBoYXBweS4KLQotCSogbWlwc2JzZC5jOiBDaGFuZ2VzIGZyb20gUmFscGggQ2FtcGJlbGw6Ci0JKG1pcHNfaG93dG9fdGFibGVfZXh0KTogTUlQU19SRUxPQ19MTzE2IHNob3VsZCB1c2UKLQljb21wbGFpbl9vdmVyZmxvd19kb250LgotCShhb3V0X21pcHNfKl92ZWMpOiBNYWtlIG5hbWUgdXNlICJhLm91dCIgaW5zdGVhZCBvZiAiYW91dCIsIHRvCi0JbWFrZSBnZGIgaGFwcHkuCi0KLQkqIGJmZC5jIChiZmRfZXJybXNncyk6IFJld29yZCBpbnZhbGlkLXRhcmdldCBtZXNzYWdlLgotCi0JKiBjb25maWcuYmZkOiBGb3Igc3BhcmMqLSotY29mZiwgdXNlIHNwYXJjLWNvZmYuCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBzcGFyY2NvZmZfdmVjLgotCSogdGFyZ2V0cy5jIChzcGFyY2NvZmZfdmVjKTogRGVjbGFyZS4KLQotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogTmV3IGZ1bmN0aW9uLgotCShzdHJ1Y3QgcmVsb2NfaG93dG9fdHlwZSk6IFVwZGF0ZSBkb2N1bWVudGF0aW9uIG9mIHNpemUgZmllbGQuCi0KLVdlZCBEZWMgIDEgMTQ6Mzk6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG0zMi1hbHBoYS5jOiBOZXcgZmlsZTsgcHJlbGltaW5hcnkgQWxwaGEgTmV0V2FyZSBzdXBwb3J0LgotCSogY29uZmlnLmJmZCAoYWxwaGEtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQ7IHVzZSBhbHBoYS1ubG0uCi0JKiBjb25maWcvYWxwaGEtbmxtLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfYWxwaGFfdmVjKTogTmV3IHZlY3RvcjsgdXNlIG5sbTMyLWFscGhhLm8sCi0JbmxtMzIubywgYW5kIG5sbS5vLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkZWQgbmxtMzItYWxwaGEuby4KLQkoQ0ZJTEVTKTogQWRkZWQgbmxtMzItYWxwaGEuYy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkqIHRhcmdldHMuYyAobmxtMzJfYWxwaGFfdmVjKTogRGVjbGFyZS4KLQotCSogbGlibmxtLmggKHN0cnVjdCBubG1fYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkcwotCW9wdGlvbmFsX3ByZWZpeF9zaXplLCBubG1fYmFja2VuZF9vYmplY3RfcCwgbmxtX3dyaXRlX3ByZWZpeCwKLQlubG1fc2V0X3B1YmxpY19zZWN0aW9uLCBubG1fZ2V0X3B1YmxpY19vZmZzZXQuICBSZW1vdmVkIHVudXNlZAotCW5sbV93cml0ZV9yZWxvYyBmaWVsZC4gIENoYW5nZWQgbmxtX3dyaXRlX2ltcG9ydCB0byByZW1vdmUKLQl1bm5lY2Vzc2FyeSBzeW1ib2wgYXJndW1lbnQuICBSZW5hbWVkIG5sbV93cml0ZV9leHRlcm5hbHMgdG8KLQlubG1fd3JpdGVfZXh0ZXJuYWwsIGFuZCBjaGFuZ2VkIGNvdW5kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYSB0bwotCWJmZF9zaXplX3R5cGUuCi0JKG5sbV9vcHRpb25hbF9wcmVmaXhfc2l6ZSwgbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYywKLQlubG1fd3JpdGVfcHJlZml4X2Z1bmMsIG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYywKLQlubG1fZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyk6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCi0JKG5sbV93cml0ZV9yZWxvY19mdW5jKTogUmVtb3ZlZC4KLQkobmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMpOiBBZGp1c3RlZCBmb3IgZmllbGQgcmVuYW1pbmcuCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3dyaXRlX2ltcG9ydCk6IFJlbmFtZWQgZnJvbQotCW5sbV9pMzg2X3dyaXRlX3JlbG9jLiAgUmVtb3ZlZCBvbGQgbmxtX2kzODZfd3JpdGVfaW1wb3J0IHdoaWNoCi0JanVzdCBjYWxsZWQgb2xkIG5sbV9pMzg2X3dyaXRlX3JlbG9jLgotCShubG1faTM4Nl93cml0ZV9leHRlcm5hbCk6IFJlbmFtZWQgZnJvbSBubG1faTM4Nl93cml0ZV9leHRlcm5hbHMuCi0JRGVjbGFyZWQuICBDaGFuZ2VkIHNlY29uZCBhcmd1bWVudCBmcm9tIGJmZF92bWEgdG8gYmZkX3NpemVfdHlwZS4KLQkobmxtMzJfaTM4Nl9iYWNrZW5kKTogQWRqdXN0ZWQgZm9yIGNoYW5nZXMgdG8gZmllbGRzIGFuZCBuYW1lcy4KLQkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19tYW5nbGVfcmVsb2NzKTogUmVtb3ZlZCB1bnVzZWQsCi0JaWZkZWZmZWQgb3V0IGNvZGUuCi0JKG5sbV9zcGFyY193cml0ZV9pbXBvcnQpOiBSZW1vdmVkIHNlY29uZCBhcmd1bWVudC4KLQkobmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsKTogUmVuYW1lZCBmcm9tCi0JbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFscy4gIENoYW5nZWQgc2Vjb25kIGFyZ3VtZW50IGZyb20gYmZkX3ZtYQotCXRvIGJmZF9zaXplX3R5cGUuCi0JKG5sbTMyX3NwYXJjX2JhY2tlbmQpOiBBZGp1c3RlZCBmb3IgY2hhbmdlcyB0byBmaWVsZHMgYW5kIG5hbWVzLgotCSogbmxtY29kZS5oOiBSZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCi0JKG5sbV9vYmplY3RfcCk6IERvbid0IGRlc3Ryb3kgdGRhdGEgcG9pbnRlci4gIENhbGwKLQliYWNrZW5kX29iamVjdF9wIGZ1bmN0aW9uIGlmIGl0IGV4aXN0cy4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlIHJjb3VudC4gIENhbGwKLQlzZXRfcHVibGljX3NlY3Rpb25fZnVuYyBpZiBpdCBleGlzdHMgaW5zdGVhZCBvZiBjaGVja2luZwotCU5MTV9ISUJJVC4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFjY291bnQgZm9yCi0Jb3B0aW9uYWxfcHJlZml4X3NpemUuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBBY2NvdW50IGZvciBvcHRpb25hbF9wcmVmaXhfc2l6ZS4KLQlSZW1vdmVkIHVzZWxlc3MgdmFyaWFibGUgd3JpdGVfcmVsb2NfZnVuYy4gIENoYW5nZWQgZGVjbGFyYXRpb24KLQlhbmQgY2FsbCBvZiB3cml0ZV9pbXBvcnRfZnVuYy4gIENhbGwgd3JpdGVfcHJlZml4X2Z1bmMgaWYgaXQKLQlleGlzdHMuICBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZXMgbGVuIGFuZCB0ZW1wLiAgQ2FsbAotCWdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMgaWYgaXQgZXhpc3RzIHJhdGhlciB0aGFuIHNldHRpbmcgTkxNX0hJQklULgotCSogbmxtc3dhcC5oOiBEZWNsYXJlIGZ1bmN0aW9ucy4KLQotCSogYmZkLWluLmggKHVpbnQ2NF90eXBlTE9XLCB1aW50NjRfdHlwZUhJR0gpOiBGdWxseSBwYXJlbnRoZXNpemUKLQlmb3IgY2xhcml0eS4KLQkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogVXNlICVseCwgbm90ICV4LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogaG9zdHMvYWxwaGFvc2YuaCAodWludDY0X3R5cGVMT1csIHVpbnQ2NF90eXBlSElHSCk6IENhc3QgcmVzdWx0cwotCXRvIHVuc2lnbmVkIGxvbmcuCi0KLQkqIGNvbmZpZy5iZmQ6IERvbid0IHNldCB0YXJnZXQ2NCBoZXJlLCBhcyB0aGUgc2V0dGluZyBpcyBpZ25vcmVkLgotCSogY29uZmlndXJlLmluIChlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBTZXQgdGFyZ2V0NjQuCi0KLQkqIGNvbmZpZy9hbHBoYW9zZi5tdCAoVERFRklORVMpOiBSZW1vdmVkOyBzZXR0aW5nIGhvc3QgcGFyYW1ldGVycwotCWluIFRERUZJTkVTIGlzIHdyb25nLgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBvdXRwdXRfc2VjdGlvbi4KLQotVHVlIE5vdiAzMCAxNjo0NToyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGlyaXgtY29yZS5jOiBOZXcgZmlsZSBmb3IgSXJpeCA0IGFuZCBJcml4IDUgY29yZSBzdXBwb3J0LgotCUZ1bmN0aW9ucyB0YWtlbiBvdXQgb2YgY29mZi1taXBzLmMuICBIYW5kbGUgdm1hcCB0eXBlIFZNQVBGSUxFLgotCSogY29mZi1taXBzLmM6IElyaXggNCBjb3JlIGZpbGUgc3VwcG9ydCBtb3ZlZCB0byBpcml4LWNvcmUuYy4KLQkqIHRhcmdldHMuYzogSWYgSVJJWF9DT1JFIGRlZmluZWQsIGluY2x1ZGUgaXJpeF9jb3JlX3ZlYyBpbgotCXRhcmdldF92ZWN0b3IuCi0JKiBjb25maWcvaXJpeDQubWggKEhERUZJTkVTKTogQWRkIC1ESVJJWF9DT1JFLgotCShIREVQRklMRVMpOiBEZWZpbmUgdG8gYmUgaXJpeC1jb3JlLm8uCi0JKiBjb25maWcvaXJpeDUubWggKEhERUZJTkVTKTogRGVmaW5lIHRvIGJlIC1ESVJJWF9DT1JFLgotCShIREVQRklMRVMpOiBEZWZpbmUgdG8gYmUgaXJpeC1jb3JlLm8uCi0JKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiBBZGRlZCBpcml4LWNvcmUuby4gIFJlbW92ZWQKLQlzY28tY29yZS5vLCB3aGljaCBubyBsb25nZXIgZXhpc3RzLgotCShDRklMRVMpOiBBZGRlZCBhbGwgKi1jb3JlLmMgZmlsZXMuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLVdlZCBOb3YgMjQgMDI6MDI6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogUmVzdG9yZSBjaGVjayBvZiBmaWxlX3NpemUgIT0KLQltZW1fc2l6ZSwgYnV0IG9ubHkgaWYgU0hUX1BST0dCSVRTLgotCi0JKiBlY29mZmxpbmsuYzogTmV3IGZpbGUgdG8gaG9sZCBFQ09GRiBkZWJ1ZyBpbmZvcm1hdGlvbiBsaW5raW5nCi0Jcm91dGluZXMuCi0JKiBlY29mZi5jIChlY29mZl9jbGVhcl9vdXRwdXRfZmxhZ3MsIGVjb2ZmX3JlbCwgZWNvZmZfZHVtcF9zZWNsZXQsCi0JZWNvZmZfYWRkX3N0cmluZywgZWNvZmZfZ2V0X2RlYnVnKTogUmVtb3ZlZC4gIEZ1bmN0aW9uYWxpdHkgbm93IGluCi0JZWNvZmZsaW5rLmMuCi0JKGVjb2ZmX2dldF9leHRyLCBlY29mZl9zZXRfaW5kZXgpOiBOZXcgZnVuY3Rpb25zLgotCShlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogRG9uJ3Qgc2F2ZSByYXdfc2l6ZS4KLQkoZWNvZmZfYmZkX3NlY2xldF9saW5rKTogUmV3cm90ZSB0byB1c2UgZWNvZmZsaW5rLmMgZnVuY3Rpb25zLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndCBzZXQgRVhFQ19QIGp1c3QKLQliZWNhdXNlIHRoZXJlIGlzIGEgc3RhcnQgYWRkcmVzcy4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGV4dGVybmFsIHN5bWJvbHMgaGVyZS4gIFVzZQotCWVjb2ZmbGluay5jIGZ1bmN0aW9ucyB0byB3cml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8sIG1pcHNfZWxmX2dldF9leHRyLAotCW1pcHNfZWxmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMuCi0JKG1pcHNfZWxmX3NlY2xldF9saW5rKTogRGlzY2FyZCBlbXB0eSBzZWN0aW9ucywgdGhlIC5vcHRpb25zCi0Jc2VjdGlvbiBhbmQgLmdwdGFiIHNlY3Rpb25zLiAgSGFuZGxlIGxpbmtpbmcgLm1kZWJ1ZyBzZWN0aW9uLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogUmVtb3ZlZCByYXdfc2l6ZSBhbmQgaWZkYmFzZS4KLQkqIGxpYmVsZi5oIChlbGZfc3ltYm9sX3R5cGUpOiBBZGRlZCBtaXBzX2V4dHIgdG8gdGNfZGF0YSB1bmlvbi4KLQkqIGJmZC1pbi5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciByb3V0aW5lcyBpbiBlY29mZmxpbmsuYyAoc29tZSBhcmUKLQljYWxsZWQgYnkgZ2FzLCBzbyB0aGV5IGFyZSBwdWJsaWMpLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogQWRkZWQgZWNvZmZsaW5rLm8uCi0JKENGSUxFUyk6IEFkZGVkIGVjb2ZmbGluay5jLgotCShlY29mZmxpbmsubyk6IE5ldyB0YXJnZXQuICBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotTW9uIE5vdiAyMiAyMjoyNjo0MiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfb2JqZWN0X3ApOiBBbHNvIHJlY29nbml6ZSBTSEFSRURfTUFHSUNfQ05YIGFzCi0JYSB2YWxpZCBtYWdpYyBudW1iZXIgaWYgaXQncyBiZWVuIGRlZmluZWQuCi0KLU1vbiBOb3YgMjIgMTQ6MTc6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdCk6IERvbid0IGNyZWF0ZSAuc2NvbW1vbiBzZWN0aW9uOyBsaW5rZXIKLQlubyBsb25nZXIgcmVxdWlyZXMgaXQuCi0JKGVjb2ZmX2JmZF9zZWNsZXRfbGluaywgZWNvZmZfc2l6ZW9mX2hlYWRlcnMsCi0JZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgdHJlYXQgLnNjb21tb24gc2VjdGlvbgotCXNwZWNpYWxseS4KLQotTW9uIE5vdiAyMiAxMDo1NDoyNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20ga2V2QHNwdWRzLmdlZy5tb3QuY29tIChLZXZpbiBBLiBCdWV0dG5lcik6Ci0JKiBiZmQvY29uZmlnL2RlbHRhODgubWggKEhERUZJTkVTKTogRGVmaW5lIHRoaXMgdG8gYmUgLURQVFJBQ0VfQ09SRS4KLQkqIGJmZC9jb25maWcvZGVsdGE4OC5taCAoSERFUEZJTEVTKTogRGVmaW5lZCB0byBiZSBwdHJhY2UtY29yZS5vLgotCSogYmZkL3B0cmFjZS1jb3JlLmM6ICBOZXcgZmlsZSBmb3IgZGVhbGluZyB3aXRoIGNvcmUgZmlsZXMgd2l0aAotCXN0YXJ0IHdpdGggdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSBmb3VuZCBvbiBCQ1MgY29tcGxpYW50IHN5c3RlbXMuCi0JKiBiZmQvdGFyZ2V0cy5jIChwdHJhY2VfY29yZV92ZWMpOiAgTmV3IHZlY3Rvci4KLQotTW9uIE5vdiAyMiAwMjozMzoxMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWluaW1hbCBzdXBwb3J0IGZvciByZWFkaW5nIFNPTSBmaXh1cCBzdHJlYW1zLiAgQWxsb3dzCi0Jb2JqZHVtcCAtciB0byBkbyBzb21ldGhpbmcgcmVhc29uYWJsZS4KLQkqIHNvbS5jIChzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogSW1wbGVtZW50LgotCShzb21fY2Fub25pY2FsaXplX3JlbG9jKTogSW1wbGVtZW50LgotCShzb21fc2V0X3JlbG9jX2luZm8sIHNvbV9zbHVycF9yZWxvY190YWJsZSk6IE5ldyBmdW5jdGlvbnMuCi0KLVN1biBOb3YgMjEgMTM6NDY6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBob3N0cy9seW54LmggKEZQUklOVEZfQUxSRUFEWV9ERUNMQVJFRCk6IERlZmluZS4KLQkqIGhvc3RzL3NwYXJjbHlueC5oOiBJbmNsdWRlIGx5bnguaCBpbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIGl0LgotCi1GcmkgTm92IDE5IDE0OjM0OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBGb3IgUl9JUkVMLCBkb24ndCBsZWZ0IHNoaWZ0Ci0Jc2lnbmVkX3ZhbHVlIGJlZm9yZSBzaWduIGV4dGVuZGluZyBpdC4gIERvbid0IHN1YnRyYWN0IG91dAotCXJlbG9jX2VudHJ5LT5hZGRyZXNzLiAgVGhpcyBtYWtlcyBpdCBjb21wYXRpYmxlIHdpdGggd2hhdCBnYXMgaXMKLQlnZW5lcmF0aW5nLgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQWNjZXB0IC5zYnNzIGFzIHRoZSBuYW1lIGZvciBhCi0JU0hUX05PQklUUyBzZWN0aW9ucy4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBEb24ndCBsZWF2ZSB0aGUgbG9vcCBhZnRlciB0aGUgZmlyc3QKLQlTSFRfTk9CSVRTIHNlY3Rpb24uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogT25seSBmb3JjZSBzaF9vZmZzZXQgYW5kCi0Jc2hfYWRkciB0byBtYXRjaCBtb2R1bG8gbWF4cGFnZXNpemUgZm9yIGEgc2VjdGlvbiB3aGljaCBpcyBub3QKLQlTSFRfTk9CSVRTLiAgQ2hhbmdlZCB0aGUgbWV0aG9kIHVzZWQgdG8gZm9yY2UgcGFnZSBhbGlnbm1lbnQgYWZ0ZXIKLQlhIFNIVF9OT0JJVFMgc2VjdGlvbiB0byBvbmx5IGRvIGl0IGZvciB0aGUgbGFzdCBzdWNoIGNvbnNlY3V0aXZlCi0Jc2VjdGlvbiwgYW5kIHRvIHJlYWxseSBmb3JjZSBwYWdlIGFsaWdubWVudC4KLQotRnJpIE5vdiAxOSAwNDowMjowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUHJpbnQgbW9yZSB2ZXJib3NlIG1lc3NhZ2UKLQlpbiB0aGUgY2FzZSBvZiBhbiB1bmtub3duIChvciB1bmhhbmRsZWQpIHN0b3JhZ2UgY2xhc3MuCi0KLQkqIGNvbmZpZy9pMzg2LWx5bngubXQgKFRERUZJTkVTKTogRlBSSU5URl9BTFJFQURZX0RFQ0xBUkVEIHNob3VsZAotCW5vdCBiZSBkZWZpbmVkIGhlcmUsIHNpbmNlIGl0IGlzIGEgaG9zdCBhdHRyaWJ1dGUsIG5vdCBhIHRhcmdldAotCW9uZS4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQsIGNvbmZpZy9zcGFyYy1seW54Lm10OiBEaXR0by4KLQotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeQotCWRlZmluZWQuCi0KLQkqIGNvZmYtc3BhcmMuYzogRGVmaW5lIHNvbWUgcmVsb2NhdGlvbnMsIGJhc2VkIG9uIEVMRiByZWxvY2F0aW9ucy4KLQkoZW51bSByZWxvY190eXBlLCBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlLAotCXN0cnVjdCBjb2ZmX3JlbG9jX21hcCwgc3BhcmNfcmVsb2NfbWFwLAotCWNvZmZfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXApOiBCb3Jyb3dlZCBmcm9tIGVsZjMyLXNwYXJjLmMgYW5kCi0JZWxmLmMsIHJlbmFtZWQuCi0JKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lIHRvIGJlIGNvZmZfc3BhcmNfcmVsb2NfLi4uLgotCShydHlwZTJob3d0byk6IEluZGV4IGludG8gY29mZl9zcGFyY19ob3d0b190YWJsZSB1c2luZwotCWRzdC0+cl90eXBlLgotCi1UaHUgTm92IDE4IDExOjQ1OjM5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1pcml4NSopOiBOZXcgdGFyZ2V0OyB1c2UgbWlwc2JlbGYuCi0JKiBjb25maWd1cmUuaG9zdCAobWlwcy1zZ2ktaXJpeDUqKSBOZXcgaG9zdDsgdXNlIGlyaXg1IChubwotCWhvc3RzL2lyaXg1LmggY3JlYXRlZDsganVzdCB1c2Ugc3RkLWhvc3QuaCkuCi0JKiBjb25maWcvaXJpeDUubWg6IE5ldyBmaWxlOyBsaWtlIGlyaXg0Lm1oLCBidXQgZG9uJ3QgdXNlIC1HIG9yCi0JLWxtYWxsb2MuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVjb2Zmc3dhcC5oOiBDaGFuZ2VkIHR5cGUgb2YgaW50ZXJuYWwgcG9pbnRlcnMgZm9yIHN3YXAgb3V0Ci0JZnVuY3Rpb25zIHRvIGNvbnN0ICouCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZ290MTZfcmVsb2MpOiBOZXcgZnVuY3Rpb24uICBIYW5kbGUgR09UMTYKLQljb3JyZWN0bHkgZm9yIGFzc2VtYmxlciwgYnV0IGxpbmtlciBzdXBwb3J0IG5vdCBpbXBsZW1lbnRlZC4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBVc2UgbWlwc19lbGZfZ290MTZfcmVsb2MgZm9yIEdPVDE2LgotCShtaXBzX2VsZl9zeW1faXNfZ2xvYmFsKTogTmV3IGZ1bmN0aW9uOyBhdCBsZWFzdCBvbiBJcml4IDUsIGFsbAotCW5vbiBzZWN0aW9uIHN5bWJvbHMgYXJlIGNvbnNpZGVyZWQgZ2xvYmFsLgotCShlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKTogRGVmaW5lLgotCShtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLiAgU2V0IHRoZSBNSVBTCi0JYXJjaGl0ZWN0dXJlIGxldmVsIGNvcnJlY3RseS4KLQkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IERlZmluZS4KLQkobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfT1BUSU9OUy4KLQkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBlbnRzaXplIG9mIC5tZGVidWcgb3IgLnJlZ2luZm8KLQlzZWN0aW9uIHRvIDEuICBIYW5kbGUgLm9wdGlvbnMgc2VjdGlvbi4KLQkobWlwc19lbGZfYWNvbV9zZWN0aW9uLCBtaXBzX2VsZl9hY29tX3N5bWJvbCwKLQltaXBzX2VsZl9hY29tX3N5bWJvbF9wdHIpOiBOZXcgc3RhdGljIHZhcmlhYmxlcywgdXNlZCB0byBidWlsZCBhCi0JZ2VuZXJpYyAuYWNvbW1vbiBzZWN0aW9uIHRvIGhvbGQgU0hOX01JUFNfQUNPTU1PTiBzeW1ib2xzLgotCShtaXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IEhhbmRsZSBTSE5fTUlQU19BQ09NTU9OIHN5bWJvbHMgYnkKLQlwdXR0aW5nIHRoZW0gYWxsIGluIGEgZ2xvYmFsIC5hY29tbW9uIHNlY3Rpb24uCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgZHVtcCBjb3JlIGlmIHRhcmdldAotCXNlY3Rpb24gaGFzIG5vIEVMRiBzZWN0aW9uIGRhdGEuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogU2V0IGFkZHJhbGlnbiBvZiByZWxvYyBzZWN0aW9uIHRvIDQuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKToJRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IERvbid0IGNvbnNpZGVyIHNlY3Rpb24gMC4KLQlJbiB0aGUgbWFpbiBsb29wLCBza2lwIHRoZSBzeW10YWIgYW5kIHN0cnRhYiBzZWN0aW9ucywgc2luY2UgdGhlaXIKLQlwb3NpdGlvbnMgYXJlIHNldCBlbHNld2hlcmUuCi0JKHN3YXBfb3V0X3N5bXMpOiBTZXQgYWRkcmFsaWduIG9mIHN5bXRhYiBzZWN0aW9uIHRvIDQuICBTZXQKLQlhZGRyYWxpZ24gb2Ygc3RydGFiIHNlY3Rpb25zIHRvIDEuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogRG9uJ3QgY29uc2lkZXIgc2VjdGlvbiAwLgotCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB3cml0ZSBvdXQgc2VjdGlvbiAwLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBmaWVsZHMKLQllbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsIGFuZCBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZjMyX2JlZCk6IEFkZGVkIGNvcnJlc3BvbmRpbmcgaW5pdGlhbGl6ZXJzLgotCSogZWxmNjQtdGFyZ2V0LmggKGVsZjY0X2JlZCk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChzeW1faXNfZ2xvYmFsKTogVGFrZSBhYmZkIGFyZ3VtZW50LiAgQ2FsbAotCWVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwgaWYgaXQgaXMgbm90IE5VTEwuCi0JKGVsZl9tYXBfc3ltYm9scyk6IFBhc3MgYWJmZCB0byBzeW1faXNfZ2xvYmFsLgotCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLQlpZiBpdCBpcyBkZWZpbmVkLgotCi1XZWQgTm92IDE3IDE4OjQzOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliZWNvZmYuaDogSW5jbHVkZSBjb2ZmL2Vjb2ZmLmguCi0JKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBNb3ZlIGV4dGVybmFsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCWZpZWxkcyBpbnRvIGEgc2luZ2xlIGZpZWxkIHBvaW50aW5nIHRvIGFuIGVjb2ZmX2RlYnVnX3N3YXAKLQlzdHJ1Y3R1cmUuCi0JKGVjb2ZmX2RhdGFfdHlwZSk6IE1vdmUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZpZWxkcyBpbnRvIGEgc2luZ2xlCi0JZmllbGQgcG9pbnRpbmcgdG8gYW4gZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuCi0JKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jLCBlY29mZi5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVdlZCBOb3YgMTcgMTc6Mzg6NTggMTk5MyAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG5sbXN3YXAuaDogTmV3IGZpbGUgdG8gc3dhcCBmaXhlZCBoZWFkZXIuICBJbmNsdWRlZCBieSBOTE0KLQliYWNrZW5kcy4KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgcmVsb2NfYW5kX3NlYyk6IERlZmluZS4KLQkoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGZpeGVkX2hlYWRlcl9zaXplLAotCW5sbV9yZWFkX2ltcG9ydCwgbmxtX3dyaXRlX2ltcG9ydCwgbmxtX3N3YXBfZmhkcl9pbiwKLQlubG1fc3dhcF9maGRyX291dC4KLQkobmxtX2ZpeGVkX2hlYWRlcl9zaXplLCBubG1fcmVhZF9pbXBvcnRfZnVuYywKLQlubG1fd3JpdGVfaW1wb3J0X2Z1bmMsIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jLAotCW5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXRfZnVuYywgbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMpOiBOZXcKLQlhY2Nlc3NvciBtYWNyb3MuCi0JKiBubG1jb2RlLmg6IFVzZSBuZXcgZnVuY3Rpb25zLgotCSogbmxtMzItaTM4Ni5jOiBQcm92aWRlIG5ldyBmdW5jdGlvbnMuCi0JKiBubG0zMi1zcGFyYy5jOiBOZXcgZmlsZTsgU1BBUkMgTkxNIGJhY2tlbmQuCi0KLVdlZCBOb3YgMTcgMTM6NTY6MTAgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2bHlueC5jIChzd2FwX3N0ZF9yZWxvY19pbiwgc3dhcF9leHRfcmVsb2NfaW4pOiBJZ25vcmUKLQlnYXJiYWdlIGJpdHMgYXBwZWFyaW5nIGluIHRoZSB1cHBlciBlbmQgb2Ygc3ltYm9sbnVtcy4KLQotCSogY29uZmlnL3NwYXJjLWx5bngubXQgKFRERUZJTkVTKTogQWRkIC1ERlBSSU5URl9BTFJFQURZX0RFQ0xBUkVELgotCi1UdWUgTm92IDE2IDE3OjAzOjQxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGx5bngtY29yZS5jIChseW54X2NvcmVfZmlsZV9wKTogIENoYW5nZSBiZmRfemFsbG9jIHRvIGJmZF9hbGxvYy4KLQkqIG02OGtseW54LmM6ICBEZWZpbmUgY29yZSBmaWxlIG1hY3Jvcy4KLQkqIGhvc3RzL2kzODZseW54LmgsIGhvc3RzL202OGtseW54LmgsIGhvc3RzL2x5bnguaDogIE1vdmUgYWxsCi0Jbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBzdHVmZiBpbnRvIGx5bnguaC4KLQotVHVlIE5vdiAxNiAxNTo0NTo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaTM4NmxpbnV4LmM6IERlZmluZSBuZXcgbWFjcm8gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSB0byAxMDI0LCBhbmQKLQljaGFuZ2UgUEFHRV9TSVpFIHRvIDQwOTYuCi0KLU1vbiBOb3YgMTUgMTE6NDg6MDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQotCSogVkVSU0lPTjogVXBkYXRlZC4KLQotU3VuIE5vdiAxNCAyMzozMzowMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9vYmplY3Rfc2V0dXApOiBEbyBub3QgY3JlYXRlIGR1bW15ICIudGV4dCIsICIuZGF0YSIsCi0JYW5kICIuYnNzIiBzZWN0aW9ucy4KLQkoc2V0dXBfc2VjdGlvbnMpOiBEbyBub3Qgc2V0IFNFQ19IQVNfQ09OVEVOVFMgaWYgYSBzZWN0aW9uJ3Mgc2l6ZQotCWlzIHplcm8uICBSZWNvZ25pemUgQlNTIHR5cGUgc2VjdGlvbnMgYW5kIHR1cm4gb2ZmIFNFQ19MT0FEIGFuZAotCVNFQ19EQVRBIChzbyBiaW51dGlscy9zaXplIHdvcmtzKS4gIFNldCB0aGUgY29ycmVjdCB2YWx1ZSBmb3IKLQlhIHNlY3Rpb24ncyBfcmF3X3NpemUuCi0JKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBQcm9ncmFtIGVudHJ5IHBvaW50cywgYW5kIG1pbGxpY29kZSBhcmUKLQlhbHNvIGZ1bmN0aW9ucy4gIE1hcmsgdGhlbSBhcyBzdWNoLiAgQWxzbyBtYXJrIEwkKiBzeW1ib2xzIGFzCi0JZGVidWdnaW5nIHN5bWJvbHMuCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotU2F0IE5vdiAxMyAxNToyNzoxNSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgbWlzc2luZyBwcm90b3R5cGUuICBSZXR1cm5zCi0JYSBwb2ludGVyIHRvIGNvbnN0YW50IGRhdGEuICBEZWxldGUgYm9ndXMgI2RlZmluZSB3aGljaCBtYWRlIHRoZSAKLQlmdW5jdGlvbiB1c2VsZXNzLgotCi0JKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBOZXcgZnVuY3Rpb24uCi0KLUZyaSBOb3YgMTIgMTU6Mjk6MzYgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG8gbm90IGFib3J0LiAgRmxlc2ggb3V0LgotCShzb21fc2V0X3NlY3Rpb25fY29udGVudHMpOiBEbyBub3QgYWJvcnQuICBGbGVzaCBvdXQuCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfaGVhZGVycyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX3ByZXBfaGVhZGVycyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIHNvbS5jIChzb21fc2l6ZW9mX2hlYWRlcnMpOiBBZGQgbWlzc2luZyBwcm90b3R5cGUuCi0JKHNvbV9zZXRfYXJjaF9tYWNoKTogRG8gbm90IGFib3J0LgotCi0JKiBzb20uYyAoc29tX2NvdW50X3NwYWNlcyk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2NvdW50X3N1YnNwYWNlcyk6IE5ldyBmdW5jdGlvbi4KLQkoY29tcGFyZV9zeW1zKTogTmV3IGZ1bmN0aW9uLgotCShzb21fY29tcHV0ZV9jaGVja3N1bSk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogTmV3IGZ1bmN0aW9uLgotCShzb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAodHJ5X3ByZXZfZml4dXApOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9yZWxvY19za2lwKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcmVsb2NfYWRkZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcmVsb2NfY2FsbCk6IE5ldyBmdW5jdGlvbi4KLQotCSogc29tLmMgKHNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlKTogTmV3IGZ1bmN0aW9uLgotCShzb21fcmVsb2NfcXVldWVfaW5zZXJ0KTogTGlrZXdpc2UuCi0JKHNvbV9yZWxvY19xdWV1ZV9maXgpOiBMaWtld2lzZS4KLQkoc29tX3JlbG9jX3F1ZXVlX2ZpbmQpOiBMaWtld2lzZS4KLQotCSogc29tLmMgKHNvbV9ocHBhX2hvd3RvX3RhYmxlKTogU09NIGhvd3RvIHJlbG9jYXRpb24gdGFibGUuCi0JKGhwcGFfc29tX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBzb20uYyAoc3RydWN0IHJlbG9jX3F1ZXVlKTogTmV3IHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mCi0JdGhlIGxhc3QgZm91ciBtdWx0aWJ5dGUgcmVsb2NhdGlvbnMgZW1pdHRlZC4KLQkoZW51bSBwYV9zeW1ib2xfdHlwZSk6IFR5cGUgdG8gZnVsbHkgZGVzY3JpYmUgdGhlIHN5bWJvbCB0eXBlcwotCWFzc29jaWF0ZWQgd2l0aCAuaW1wb3J0Ly5leHBvcnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCi0KLQkqIHNvbS5jOiBJbmNsdWRlIGxpYmhwcGEuaAotCi0JKiBzb20uYyAoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KLQkoYmZkX3NvbV9zZXRfc3ltYm9MX3R5cGUpOiBMaWtld2lzZS4KLQkoYmZkX3NvbV9hdHRhY2hfdW53aW5kX2luZm8pOiBMaWtld2lzZS4KLQkqIHNvbS5oOiBEZWNsYXJlIG5ldyBleHBvcnRlZCBmdW5jdGlvbnMuCi0KLQkqIHNvbS5oIChzdHJ1Y3Qgc29tX3N5bWJvbCk6IEFkZCBuZXcgZmllbGRzIHRvIGhvbGQgYWRkaXRpb25hbAotCWluZm9ybWF0aW9uIG5lZWRlZCB0byBidWlsZC93cml0ZSBzeW1ib2wgdGFibGVzIGFuZCBmaXh1cCBzdHJlYW1zLgotCShzdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBBZGQgbmV3IGZpZWxkcyB0byBob2xkIGFkZGl0aW9uYWwKLQlpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQvd3JpdGUgc3BhY2UgYW5kIHN1YnNwYWNlIGhlYWRlcnMuCi0JKHNvbV9zeW1ib2xfZGF0YSk6IE5ldyBhY2Nlc3NvciBtYWNybyBmb3IgU09NIHN5bWJvbCBpbmZvcm1hdGlvbi4KLQkoUl9IUFBBXyopOiBCYXNpYyByZWxvY2F0aW9uIHR5cGVzIHRvIGJlIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4KLQotRnJpIE5vdiAxMiAxMTowMDoyOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9jb3JlX2ZpbGVfcCk6IElmIG5ldyBob29rCi0JVFJBRF9DT1JFX0FMTE9XX0FOWV9FWFRSQV9TSVpFIGRlZmluZWQsIHRoZW4gc2tpcCB0aGUgY2hlY2sgZm9yIHRoZQotCWNvcmVmaWxlIGJlaW5nIHRvbyBiaWcuCi0JKiBob3N0cy9pMzg2c2NvLmg6IERlZmluZSBpdC4KLQotVGh1IE5vdiAxMSAxNToxNjoyOCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIGhwcGFic2RfY29yZV9kYXRhLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogQWRkIGhwcGFic2RfY29yZV92ZWMuCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX2NvcmVfZmlsZV9wKTogRmFpbCBpZiBhbiB1bmtub3duIGNvcmUKLQlzZWN0aW9uIGlzIGVuY291bnRlcmVkIGR1cmluZyBjb3JlIHNlY3Rpb24gc2Nhbm5pbmcuCi0JKiBocHBhYnNkLWNvcmUuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvaHBwYWJzZC5taDogRW5hYmxlIEhQUEEgQlNEIGNvcmUgZmlsZXMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2MpOiBSZW1vdmUgREVGVU4gY3J1ZC4gIFJlbW92ZSBjb2RlCi0Jd2hpY2ggaXMgZWl0aGVyIGNvbW1lbnRlZCBvdXQgb3IgaWZkZWYnZCBvdXQuICBBZGQsIHVwZGF0ZSBhbmQKLQljbGVhbiBjb21tZW50cy4gIEZpeCB2YXJpb3VzIGluZGVudGlvbiBhbmQgc3BhY2luZyBwcm9ibGVtcy4gIEhhbmRsZQotCXByb2JsZW1zIHJlbGF0ZWQgdG8gdXNpbmcgImJsZSIgdG8ganVtcCB0byBhIHN0dWIgcmF0aGVyIHRoYW4gImJsIgotCSglcjMxIGlzIHRyYXNoZWQgYnkgImJsZSIsIGJ1dCBub3QgYnkgImJsIikuCi0JKE5FV19JTlNUUlVDVElPTik6IFB1dCBpbnNpZGUgY3VybHkgYnJhY2VzLgotCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogRml4IGluZGVudGlvbiBwcm9ibGVtcy4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBGaXggaW5kZW50aW9uIGFuZCBzcGFjaW5nIHByb2JsZW1zLgotCUFkZCwgdXBkYXRlIGFuZCBjbGVhbiBjb21tZW50cy4gIEhhbmRsZSAiYmxlIiAlcjMxIGxvc3NhZ2UgcHJvYmxlbXMuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBMaWtld2lzZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGhwcGFfZWxmX3N0dWJfY2hlY2spOiBSZW1vdmUgb2Jzb2xldGUgZnVuY3Rpb24uCi0KLQkqIGhwcGFfc3R1YnMuaDogQWRkIG5ldyBpbnN0cnVjdGlvbnMgdG8gZGVhbCB3aXRoICVyMzEgbG9zc2FnZQotCXByb2JsZW1zLiAgRGVsZXRlIHVudXNlZCBpbnN0cnVjdGlvbnMuCi0JCi1UdWUgTm92ICA5IDExOjQwOjI3IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogbTY4a2x5bnguYyAoVEFSR0VUX0lTX0JJR19FTkRJQU5fUCk6IERlZmluZS4KLQotVHVlIE5vdiAgOSAxMToyNjowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogUmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoIGFuIGFycmF5Ci0Jb2YgYXJjaGl0ZWN0dXJlcywgZ2V0IHRoZSBFTEYgRU1feHh4IGNvZGUgZnJvbSB0aGUgYmFja2VuZAotCWluZm9ybWF0aW9uLiAgTGV0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQgbWF0Y2ggYW55IEVNX3h4eCBjb2RlIG5vdAotCW1hdGNoZWQgYnkgYW5vdGhlciBFTEYgdGFyZ2V0LiAgQ2FsbCBlbGZfYmFja2VuZF9vYmplY3RfcCB0byBsZXQKLQl0aGUgYmFja2VuZCBkbyBtb3JlIGNoZWNrcyBhbmQgc2V0IGdsb2JhbCBpbmZvcm1hdGlvbi4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGVsZl9tYWNoaW5lX2NvZGUgYW5kCi0JZWxmX2JhY2tlbmRfb2JqZWN0X3AgZmllbGRzLgotCShzdHJ1Y3QgYmZkX2VsZl9hcmNoX21hcCk6IFJlbW92ZWQuCi0JKGJmZF9lbGZfYXJjaF9tYXAsIGJmZF9lbGZfYXJjaF9tYXBfc2l6ZSk6IERvbid0IGRlY2xhcmUuCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0Lmg6IEluaXRpYWxpemUgZWxmX21hY2hpbmVfY29kZQotCWZpZWxkIHdpdGggRUxGX01BQ0hJTkVfQ09ERS4gIEluaXRpYWxpemUgZWxmX2JhY2tlbmRfb2JqZWN0X3AKLQlmaWVsZCB3aXRoIGVsZl9iYWNrZW5kX29iamVjdF9wIChpZiBpdCBpcyBkZWZpbmVkKS4KLQkqIGVsZjMyLWdlbi5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLWkzODYuYywgZWxmMzItaTg2MC5jLAotCWVsZjMyLW02OGsuYywgZWxmMzItbTg4ay5jLCBlbGYzMi1taXBzLmMsIGVsZjMyLXNwYXJjLmMsCi0JZWxmNjQtZ2VuLmMgKEVMRl9NQUNISU5FX0NPREUpOiBEZWZpbmVkLgotCSogZWxmMzItbWlwcy5jOiBJbmNsdWRlIGVjb2Zmc3dhcC5oIHRvIGdldCBFQ09GRiBzd2FwcGluZwotCXJvdXRpbmVzLgotCShtaXBzX2VsZl9vYmplY3RfcCk6IFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuCi0JKG1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmVkLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IERlZmluZWQgdG8gYmUgbWlwc19lbGZfb2JqZWN0X3AuCi0JKGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmVkIHRvIGJlCi0JbWlwc19lbGZfZWNvZmZfZGVidWdfc3dhcC4KLQkqIGVsZi5jIChiZmRfZWxmX2FyY2hfbWFwLCBiZmRfZWxmX2FyY2hfbWFwX3NpemUpOiBSZW1vdmVkLgotCi0JKiBsaWJiZmQtaW4uaCAodGFyZ2V0X3ZlY3RvciwgZGVmYXVsdF92ZWN0b3IpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBmb3JtYXQuYyAodGFyZ2V0X3ZlY3RvciwgZGVmYXVsdF92ZWN0b3IpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogRG9uJ3QgY29tcGxhaW4gb24gb3ZlcmZsb3cKLQlmb3IgUl9NSVBTXzI2LiAgQ29ycmVjdCBvdmVyZmxvdyBkZXRlY3Rpb24gcmVxdWlyZXMgbWF0Y2hpbmcgdGhlCi0JdXBwZXIgZm91ciBiaXRzIG9mIHRoZSBkZXN0aW5hdGlvbiBhZ2FpbnN0IHRoZSBQQy4gIEZyb20gVGVkIExlbW9uCi0JPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4uCi0KLQkqIGJvdXQuYyAoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBSZXR1cm4gdHlwZSBzaG91bGQgcG9pbnQgdG8KLQljb25zdCBkYXRhLgotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCkpOiBMaWtld2lzZS4KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBNYWRlIGhvd3RvIGNvbnN0LgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfZGF0YSk6IE1hZGUgaG93IGNvbnN0LgotCi0JKiBsaWJlbGYuaDogQWRkZWQgc29tZSBjb21tZW50cy4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGRlZCBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCi0JZmllbGQuICBSZW1vdmVkIHVudXNlZCB3cml0ZV9yZWxvY3MgZmllbGQuCi0JKiBlbGYzMi10YXJnZXQuaDogQWRqdXN0ZWQgZWxmX2JhY2tlbmRfZGF0YSBpbml0aWFsaXphdGlvbgotCWFjY29yZGluZ2x5LgotCSogZWxmNjQtdGFyZ2V0Lmg6IENvcnJlY3RlZCBlbGZfYmFja2VuZF9kYXRhIGluaXRpYWxpemF0aW9uIHRvCi0JZmlsbCBpbiBhbGwgZmllbGRzIGFuZCB0byBzZXQgZWxmXzY0X3AgdG8gMS4KLQotTW9uIE5vdiAgOCAxODoxMzoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogUmVtb3ZlIGR1cGxpY2F0ZSBhc3NpZ25tZW50Ci0JdG8gZmlsZXBvcyBpbiBTSFRfU1RSVEFCIGNhc2UuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uKTogU2V0IEJGRCBzZWN0aW9uIGZpbGVwb3MgYXMKLQl3ZWxsIGFzIEVMRiBzZWN0aW9uIHNoX29mZnNldC4KLQotCSogcmVsb2MuYzogVXNlIGNvbnN0IGluc3RlYWQgb2YgQ09OU1QuCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBNYWtlIHZhcmlhYmxlIGhvd3RvIGEgY29uc3QgcG9pbnRlci4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLU1vbiBOb3YgIDggMTI6MTk6MTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChyZWFsY2xlYW4pOiBEb24ndCByZW1vdmUgZ2VuZXJhdGVkIGhlYWRlcnMuICBSZXZlcnRzCi0JY2hhbmdlIG9mIDIgSnVsIDE5OTMuCi0KLU1vbiBOb3YgIDggMDY6MDg6MzEgMTk5MyAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmJmZDogbWFrZSB1bml4d2FyZSBlcXVpdmFsZW50IHRvIHN5c3Y0LgotCi0JKiBjb25maWcvaTM4Ni1ubG0ubXQ6IGJyaW5nIGluIGVsZiBjb25maWc7IG1ha2UgaXQgdGhlIGRlZmF1bHQuCi0KLVN1biBOb3YgIDcgMjA6MjE6MzggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmJmZC5jIChiZmRfcHV0XzgpOiBBZGQgcGFyZW5zIGFyb3VuZCByZWZlcmVuY2UgdG8gInZhbCIKLQlhcmd1bWVudC4KLQotRnJpIE5vdiAgNSAyMTo0NTowOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZtYWNoMy5oIChIT1NUX1NFR01FTlRfU0laRSksCi0JaTM4Nm1hY2gzLmMgKFNFR01FTlRfU0laRSwgVEVYVF9TVEFSVF9BRERSKTogQ29ycmVjdCB2YWx1ZXMgKD8pLgotCi1GcmkgTm92ICA1IDE1OjE3OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBaZXJvIG91dCBpbnRlcm5hbF9hLgotCi1GcmkgTm92ICA1IDEwOjQxOjA3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBiZmQuYywgY2FjaGUuYywgY29mZmNvZGUuaCwKLQljb3JlLmMsIGN0b3IuYywgZm9ybWF0LmMsIGluaXQuYywgbGliYmZkLmMsIG9wbmNscy5jLCByZWxvYy5jLAotCXNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmM6Ci0JRG9jIGNsZWFudXAgKHNwZWxsaW5nLCBwdW5jdHVhdGlvbiwgZ3JhbW1hciwgZm9ybWF0dGluZykuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1UaHUgTm92ICA0IDE0OjQ2OjE0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKGJmZF9nZXRfY2FjaGVhYmxlLCBiZmRfc2V0X2NhY2hlYWJsZSk6ICBOZXcgYWNjZXNzb3JzLgotCSogYmZkLmMsIG9wbmNscy5jOiAgSW1wcm92ZSBjb21tZW50cyBvbiBmaWxlIGRlc2NyaXB0b3IgY2FjaGVpbmcuCi0KLVRodSBOb3YgIDQgMDg6NTQ6MzAgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEZyb20gUGV0ZSBIb29nZW5ib29tIChob29nZW5AY3MudXRhaC5lZHUpCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRml4IGxvZ2ljIGVycm9yCi0JaW4gbGFzdCBjaGFuZ2UuICBBbHdheXMgcmVidWlsZCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gdGhlIGZpcnN0Ci0JdGltZSB0aG91Z2ggaWYgb3V0cHV0IHNlY3Rpb25zIGV4aXN0IChmaXhlcyBsZCAtciBwcm9ibGVtcykuCi0KLVRodSBOb3YgMDQgMDg6MDg6NDYgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCAuUEhPTlkgZm9yIGNoZWNrIGFuZCBpbnN0YWxsY2hlY2sgcnVsZXMuCi0KLVR1ZSBOb3YgIDIgMTQ6NDI6MjcgMTk5MyAgQmlsbCBDb3ggKGJpbGxAdGFya2FzLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChhcnRkYXRhKTogVXNlIGxvbmcsIG5vdCB0aW1lX3QgZm9yIHBvcnRhYmlsaXR5LCBhdAotCSAgbGVhc3QgdG8gSFBVWC4gIEZpbGUgYmVsb3cgaXMgYSBkZXJpdmVkIGZpbGUuCi0KLVR1ZSBOb3YgIDIgMTQ6NDI6MjcgMTk5MyAgQmlsbCBDb3ggKGJpbGxAdGFya2FzLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5oIChhcnRkYXRhKTogVXNlIGxvbmcsIG5vdCB0aW1lX3QgZm9yIHBvcnRhYmlsaXR5LCBhdAotCSAgbGVhc3QgdG8gSFBVWC4KLQotVHVlIE5vdiAgMiAwOTozMjoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIGJpZ21pcHMgZm9yIG1pcHMqLSotYnNkKi4KLQotTW9uIE5vdiAgMSAxNDozMDowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jYV90YWJsZSwgZWxmX3NsdXJwX3JlbG9jX3RhYmxlKToKLQlIYW5kbGUgc3ltYm9sIG51bWJlciBvZiB6ZXJvLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZAotCUJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEJGRF9SRUxPQ19NSVBTX0dPVDE2LAotCUJGRF9SRUxPQ19NSVBTX0NBTEwxNiwgQkZEX1JFTE9DX01JUFNfR1BSRUwzMi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZQotCUJGRF9SRUxPQ19NSVBTX0xJVEVSQUwuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfcmVsb2NfbWFwKTogSGFuZGxlIG5ldyByZWxvY3MuCi0JKG1pcHNfZWxmX2hpMTZfcmVsb2MsIG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBSZWFycmFuZ2UgX2dwX2Rpc3AKLQljaGVja3Mgc2xpZ2h0bHkuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCBNWV9iZmRfZGVidWdfaW5mb19lbmQsCi0JTVlfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0IFtzaWNdKTogUmVtb3ZlIHVudXNlZCBkZWZpbml0aW9ucy4KLQkoTVlfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgTVlfYmZkX3JlbGF4X3NlY3Rpb24sCi0JTVlfYmZkX3NlY2xldF9saW5rKTogRGVmaW5lLgotCShNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgZnJvbQotCU1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwLgotCShNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBSZW5hbWUgZnJvbSBNWV9tYWtlX2RlYnVnX3N5bWJvbC4KLQkoTVkodmVjKSk6IFVzZSBKVU1QX1RBQkxFIHJhdGhlciB0aGFuIGxpc3RpbmcgZnVuY3Rpb25zLgotCSogaHAzMDBocHV4LmMgKE1ZX2dldF9zeW10YWIsIE1ZX2dldF9zeW10YWJfdXBwZXJfYm91bmQsCi0JTVlfY2Fub25pY2FsaXplX3JlbG9jLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBkZWZpbmUgaW4KLQl0ZXJtcyBvZiBNWSwgYmVjYXVzZSB0aGF0IGNhdXNlcyBhIHJlY3VzaXZlIGludm9jYXRpb24gb2YgQ0FUIHdoZW4KLQlleHBhbmRlZCB3aXRoaW4gSlVNUF9UQUJMRSwgYW5kIEFOU0kgY29tcGlsZXJzIGRvbid0IGV4cGFuZAotCXJlY3Vyc2l2ZSBtYWNyb3MuCi0JKiBtaXBzYnNkLmMgKE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSBmcm9tCi0JTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXAsIGFuZCBkb24ndCBkZWZpbmUgaW4gdGVybXMgb2YgTVkuCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IERvbid0IGRlZmluZSBpbiB0ZXJtcyBvZiBNWS4KLQkoYW91dF9taXBzX2xpdHRsZV92ZWMsIGFvdXRfbWlwc19iaWdfdmVjKTogVXNlIEpVTVBfVEFCTEUgcmF0aGVyCi0JdGhhbiBsaXN0aW5nIGZ1bmN0aW9ucy4KLQotTW9uIE5vdiAgMSAwOToxMjoyNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIG02OGstZWxmIGZvciBtNjgqLSotc3lzdjQqLgotCi1TdW4gT2N0IDMxIDA5OjM1OjQ5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmM6IE1vdmUgZW51bSB0YXJnZXRfZmxhdm91ciBvdXRzaWRlIG9mIHN0cnVjdCBhbmQgY2hhbmdlCi0JdGhlIG5hbWUgdG8gZW51bSBiZmRfZmxhdm91ci4gIFRoaXMgbWVhbnMgYmZkIGNsaWVudHMgY2FuIHVzZSBpdC4KLQkqIGJmZC1pbi5oOiBBZGQgbWFjcm8gYmZkX2dldF9mbGF2b3VyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBzb20uYzogQWRkIGNvbW1lbnQgYWJvdXQgaG93IGFib3J0KCkgb24gY29ycnVwdCBleGVjdXRhYmxlIGlzIGV2aWwuCi0KLVNhdCBPY3QgMzAgMTI6Mjc6MDkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKTogQXZvaWQgYSBnb3RvLgotCi1GcmkgT2N0IDI5IDE2OjA0OjMzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2VuLWFvdXQuYywgbGliYmZkLmM6IGV4aXQoMSkgaW5zdGVhZCBvZiBleGl0KC0xKS4KLQotRnJpIE9jdCAyOSAxMzoxNzoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBBZGRlZCBjb21tYW5kcyBmb3Igb2JqZWN0IGZpbGUgZmxhZyB2YWx1ZXMuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IElmIHR5cGUgaXMgRVRfRFlOLCBzZXQgRFlOQU1JQyBmbGFnLAotCW5vdCBFWEVDX1AuCi0JKiBib3V0LmMsIGNvZmYtaDgzMDAuYywgY29mZi1zaC5jOiBBZGQgQkZEX0lTX1JFTEFYQUJMRSB0bwotCW9iamVjdF9mbGFncyBmaWVsZCBmb3IgdGFyZ2V0IHZlY3Rvci4KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtYWRvYmUuYywgYW91dC10YXJnZXQuaCwgYm91dC5jLCBjb2ZmLWEyOWsuYywKLQljb2ZmLWFscGhhLmMsIGNvZmYtYXBvbGxvLmMsIGNvZmYtaDgzMDAuYywgY29mZi1oODUwMC5jLAotCWNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLCBjb2ZmLW1pcHMuYywKLQljb2ZmLXJzNjAwMC5jLCBjb2ZmLXNoLmMsIGNvZmYtd2UzMmsuYywgY29mZi16OGsuYywgaHB1eC1jb3JlLmMsCi0JaWVlZS5jLCBtaXBzYnNkLmMsIG5sbS10YXJnZXQuaCwgb2FzeXMuYywgb3NmLWNvcmUuYywgc29tLmMsCi0Jc3JlYy5jLCB0ZWtoZXguYywgdHJhZC1jb3JlLmM6CVJlbW92ZSBEWU5BTUlDIGZyb20gb2JqZWN0X2ZsYWdzCi0JZmllbGQgZm9yIHRhcmdldCB2ZWN0b3IuCi0KLVRodSBPY3QgMjggMjA6MDI6MzEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBEb24ndCBkZWNsYXJlIHRpbWU7IGNhdXNlcyBlcnJvciBvbiBtYWNoMy4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Nm1hY2gzX3ZlYyk6IFJlcXVpcmUgYW91dDMyLm8gc3RhYi1zeW1zLm8uCi0KLVRodSBPY3QgMjggMTY6MzM6MjYgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JTHlueE9TIGFuZCBTcGFyYyBMeW54T1MgY2hhbmdlczoKLQkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBzcGFyYy0qLWx5bnhvcyouCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIHNwYXJjLSotbHlueG9zKi4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIFNwYXJjIEx5bnggdmVjdG9ycy4KLQkqIHRhcmdldHMuYyAoc3BhcmNseW54X2FvdXRfdmVjKTogRGVjbGFyZS4KLQkoc3BhcmNseW54X2NvZmZfdmVjKTogRGVjbGFyZS4KLQkodGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aGVtLgotCSogY2YtaTM4Nmx5bnguYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBpMzg2bHlueC1jZi5jLgotCSogY2YtbTY4a2x5bnguYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBtNjhrbHlueC1jZi5jLgotCSogY2Ytc3BhcmNseW54LmM6IE5ldyBmaWxlLCBzdXBwb3J0IGZvciBjb2ZmIGluIFNwYXJjIEx5bnhPUy4KLQkqIGNvZmYtc3BhcmMuYzogTmV3IGZpbGUsIGJhc2ljIFNwYXJjIGNvZmYgc3VwcG9ydC4KLQkqIHNwYXJjbHlueC5jOiBOZXcgZmlsZSwgc3VwcG9ydCBmb3IgYS5vdXQgaW4gU3BhcmMgTHlueE9TLgotCSogTWFrZWZpbGUuaW46IENoYW5nZSBmaWxlbmFtZXMgYXBwcm9wcmlhdGVseSwgYWRkIFNwYXJjIHJ1bGVzLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBSZWNvZ25pemUgU3BhcmMgbWFnaWMKLQludW1iZXIuCi0JKGNvZmZfc2V0X2ZsYWdzKTogVXNlIEx5bnhPUyBtYWdpYyBudW1iZXIgZm9yIGkzODYsIG02OGssIGFuZAotCVNwYXJjIEx5bnhPUywgc2V0IFNwYXJjIG1hZ2ljIG51bWJlciBmb3IgU3BhcmNzLgotCSogY29uZmlnL202OGstbHlueC5tdCAoU0VMRUNUX1ZFQ1MpOiBSZW1vdmUgcmVkdW5kYW50IHZlY3Rvci4KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGhvc3RzL2kzODZseW54Lmg6IENvc21ldGljIGltcHJvdmVtZW50cy4KLQkqIGhvc3RzL202OGtseW54Lmg6IEFkZCBpZmRlZnMsICNkZWZpbmUgb2YgY2ZyZWUuCi0JKiBob3N0cy9zcGFyY2x5bnguaDogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjggMTY6MjM6NDAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBEZWNsYXJlIHJldHVybiB0eXBlLgotCVJlbW92ZSB1c2VsZXNzIHN0YXRlbWVudCBwcm9iYWJseSBsZWZ0IGJ5IGNvZGUgY29weS4KLQkqIGNwdS1pOTYwLmMgKGNvbXBhdGlibGUpOiBGdWxseSBicmFja2V0IG1hdHJpeCBpbml0aWFsaXplci4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBVc2UgYmZkX3htYWxsb2MKLQlyYXRoZXIgdGhhbiB4bWFsbG9jLiAgVXNlIHJlYWxsb2MgYW5kIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKLQlyYXRoZXIgdGhhbiB4cmVhbGxvYy4KLQkoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBBZGQgc29tZSBjYXN0cy4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBSZW1vdmUgdW51c2VkCi0JdmFyaWFibGUuICBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQkqIGhwMzAwaHB1eC5jOiBEZWNsYXJlIGFvdXRfMzJfd3JpdGVfc3ltcy4KLQkqIGkzODZic2QuYywgaTM4NmxpbnV4LmMsIG5ldGJzZDM4Ni5jIChOX1NIQVJFRF9MSUIpOiBEZWZpbmUgYXMgMAotCShkZWZpbml0aW9uIGZyb20gYW91dC9hb3V0NjQuaCBpcyBhbHdheXMgMCBhbnlob3cpLgotCSogaTM4Nmx5bnguYyAoc3dhcF9zdGRfcmVsb2NfaW4pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCSogaWVlZS5jIChpZWVlX3dyaXRlX2lkKTogbGVuZ3RoIGNhbiBuZXZlciBiZSBuZWdhdGl2ZS4KLQkocmVhZF9pZCk6IExpa2V3aXNlLgotCShpZWVlX2FyY2hpdmVfcCk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUuCi0JKiBsaWJjb2ZmLWluLmggKGJmZF9wZXJmb3JtX3NsaXApOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBSZW1vdmUgemVybyBpbml0aWFsaXphdGlvbiBvZgotCXN0YXRpYyBzdHJ1Y3R1cmUuCi0JKiByZWxvYzE2LmM6IEluZGVudGF0aW9uIGNoYW5nZS4KLQotV2VkIE9jdCAyNyAxNjo1MToyOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvaTM4Ni1tYWNoMy5tdDogVXBkYXRlIGZvciBuZXcgY29uZmlndXJhdGlvbgotCSgtLXdpdGgtdGFyZ2V0cwlhbmQgc28gb24pLgotCSogaG9zdHMvaTM4Nm1hY2gzLmg6IERlY2xhcmUgZXJybm8uCi0JKiB0YXJnZXRzLmM6IERlY2xhcmUgaTM4Nm1hY2gzX3ZlYy4KLQotV2VkIE9jdCAyNyAxMjoxODowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4sCi0JbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogSGFuZGxlIHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0Ci0JYW5kIHNoYXJlZERlYnVnUmVjb3JkQ291bnQgZmllbGRzLgotCi1UdWUgT2N0IDI2IDE2OjIxOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZW1vdmUgU0NPX0NPUkUuICBPbiBTZXAgMTEgMTk5MywKLQl3ZSBzdGFydGVkIHVzaW5nIHRyYWQtY29yZS5jIGZvciBTQ08gaW5zdGVhZC4KLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogUmUtZW5hYmxlIGdlbmVyaWMgRUxGIGFuZCBOTE0gdGFyZ2V0cy4KLQotVHVlIE9jdCAyNiAxNjo1MzoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBBbGlnbiBzaF9vZmZzZXQgdG8KLQlzaF9hZGRyYWxpZ24gKHRoaXMgaXMgd2hhdCBVbml4V2FyZSBkb2VzLCBhbmQgaXQgc2hvdWxkbid0IGh1cnQpLgotCi1UdWUgT2N0IDI2IDEwOjE2OjU0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JRnJvbSBKZWZmIExhdyBhbmQgUGV0ZSBIb29nZW5ib29tIGF0IFV0YWg6Ci0KLQkqIGVsZjMyLWhwcGEuaCAoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBBZGQgcHJvdG90eXBlLgotCShFTEYzMl9IUFBBX1JfQVJHX1JFTE9DKTogUmVuYW1lZCB3aXRob3V0IHRoZSBFTEYzMiBwcmVmaXgKLQlhbmQgbW92ZWQgaW50byBsaWJocHBhLmguICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCShFTEYzMl9IUFBBX1JfQ09OU1RBTlQsIEVMRjMyX0hQUEFfUl9BRERFTkQpOiBMaWtld2lzZS4KLQkoZ2V0X29wY29kZSBhbmQgb3Bjb2RlIGRlZmluZXMpOiBNb3ZlIGludG8gbGliaHBwYS5oCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2luc24yZm10KTogUmVuYW1lIGFuZCBtb3ZlIGluZm8KLQlsaWJocHBhLmguCi0JKiBsaWJocHBhLmggKEhQUEFfUl8qKTogTW92ZWQgaGVyZS4gIFJlZm9ybWF0dGVkIHNsaWdodGx5IHRvIG1ha2UKLQlmb3IgZWFzaWVyIHJlYWRpbmcuCi0JKGdldF9vcGNvZGUpOiBNb3ZlZCBoZXJlLiAgRklYTUUhIHRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIEMgZnVuY3Rpb24KLQlpbnNpZGUgdGhlIG9wY29kZSBsaWJyYXJ5IQotCShiZmRfaHBwYV9pbnNuMmZtdCk6IExpa2V3aXNlLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBFbmFibGUgZWxmMzItaHBwYSB2ZWN0b3IuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBBZGQgbmV3IGNvbW1lbnRzCi0JYW5kIGNsYXJpZnkgZXhpc3RpbmcgY29tbWVudHMuICBEbyBub3QgdXNlIERFRlVOIHRvIGRlY2xhcmUgdGhpcwotCWZ1bmN0aW9uLiAgRml4IG51bWVyb3VzIGluZGVudGlvbiBwcm9ibGVtcy4gIENvcnJlY3RseSBoYW5kbGUgY2FzZXMKLQl3aGVyZSBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb24gbWF5IG5lZWQgdG8gYmUgcmVhZCBmcm9tIGRpc2ssIAotCXJlYWQgZnJvbSBtZW1vcnksIG9yIGJ1aWx0IHRoZW4gcmVhZCBmcm9tIG1lbW9yeS4KLQotCSogZWxmMzItaHBwYS5oOiBSZWZvcm1hdCB3aXRoIGdudS1pbmRlbnQgYW5kIGhhbmQgZml4IG51bWVyb3VzCi0JZm9ybWF0dGluZyBhbmQgaW5kZW50aW9uIHByb2JsZW1zIGdudS1pbmRlbnQgY2FuIG5vdCBoYW5kbGUuCi0JQ2xhcmlmeSBzb21lIGNvbW1lbnRzIGFib3V0IHJlbG9jYXRpb24gdHlwZXMuICBDb21tZW50IGJhc2ljCi0JcmVsb2NhdGlvbiAiY2xhc3NlcyIuICBHcm91cCBQQVJBTSBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuCi0JKEhQUEFfU1hUX3tOVUxMLCBTWU1ORFgsIFJHX1JFTE9DfSk6IE1ha2UgbWVtYmVycyBvZiBhIG5ldyAKLQllbnVtZXJhdGVkIHR5cGUgcmF0aGVyIHRoYW4gI2RlZmluZXMuCi0KLVR1ZSBPY3QgMjYgMDI6NDA6NDYgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc29tLmMgKGhwcGFfb2JqZWN0X3NldHVwKTogIFNldCBTRUNfQ09ERSBmb3IgLnRleHQgc2VjdGlvbiBzbwotCXRoYXQgR0RCIGNhbiBmaWd1cmUgb3V0IHRleHRfc3RhcnQgYW5kIHRleHRfZW5kLgotCi1Nb24gT2N0IDI1IDE2OjA1OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUZpeCB1cCB3YXJuaW5ncyBmcm9tIGdjYyAtV2FsbDoKLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBVc2UgJWx4IGFuZCBjYXN0IG5fdmFsdWUgdG8KLQl1bnNpZ25lZCBsb25nLiAgVXNlICVsZCBmb3IgdGFnbmR4LiAgVXNlICVseCBmb3Igb2Zmc2V0ICsgdm1hIGFuZAotCWNhc3QgaXQgdG8gdW5zaWduZWQgbG9uZy4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2VtaXRfYWdncmVnYXRlKTogVXNlICVsZC4JCi0JKGVjb2ZmX3ByaW50X3N5bWJvbCk6IFVzZSAlbGQsIGFuZCBjYXN0IGluZHggYW5kIHN5bV9iYXNlIHRvIGxvbmcuCi0JKiBjb2ZmY29kZS5oIChkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogU3BlY2lmeSByZXR1cm4gdHlwZS4KLQotCSogbGliYmZkLmMgKGJmZF93cml0ZSk6IElmIG5vdCBldmVyeXRoaW5nIGlzIHdyaXR0ZW4gb3V0LCBzZXQKLQliZmRfZXJyb3IgdG8gc3lzdGVtX2NhbGxfZXJyb3IuICBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzCi0Jbm9uLW5lZ2F0aXZlLCBzZXQgZXJybm8gdG8gRU5PU1BDIChpZiBFTk9TUEMgaXMgZGVmaW5lZCkuCi0JKGJmZF9zZWVrKTogSWYgdGhlIHNlZWsgZmFpbHMsIHNldCBiZmRfZXJyb3IgdG8gc3lzdGVtX2NhbGxfZXJyb3IuCi0JKGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRm9yIGEgYmFkIG9mZnNldCArIGNvdW50LCBzZXQKLQliZmRfZXJyb3IgdG8gYmFkX3ZhbHVlLgotCSogc2VjbGV0LmMgKHJlbCk6IERvbid0IGFib3J0LiAgSW5zdGVhZCwgcmV0dXJuIGZhbHNlLgotCi1Nb24gT2N0IDI1IDA5OjU5OjM3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChyZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMi4KLQotRnJpIE9jdCAyMiAyMDozNTo1NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IGhhbmRsZSBtaXBzKi0qIGluc3RlYWQgb2YgbWlwcy0qLCB1c2UgbWlwcyplbAotCSAgaW5zdGVhZCBvZiBtaXBzLSotKmwKLQotRnJpIE9jdCAyMiAxNDowMzozMyAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBtNjhrLWx5bngubXQsIGkzODYtbHlueC5tdCAoVERFRklORVMpOiBzZXQKLQlGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQgYmVjYXVzZSB0aGUgb2JqZHVtcC5jIGRlY2xhcmF0aW9uIG9mCi0JZnByaW50ZiBjb2xsaWRlcyB3aXRoIHRoZSBuYXRpdmUgb25lLgotCi1GcmkgT2N0IDIyIDExOjUwOjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogRW5hYmxlIE1JUFMgRUxGIHZlY3RvcnMuCi0KLUZyaSBPY3QgMjIgMDc6NTE6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IFVzZSBiaWdtaXBzIGZvciBtaXBzLXNvbnktYnNkKi4KLQotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IEFkZCAqIHRvIGVuZCBvZiBhbGwgT1MgbmFtZXMuCi0KLVRodSBPY3QgMjEgMTI6MTY6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoRklMRV9BTElHTik6IFJlbmFtZWQgZnJvbSBFQUxJR04sIHRvIGF2b2lkIGNvbmZsaWN0Ci0Jd2l0aCBVbHRyaXggaGVhZGVyIGZpbGVzLgotCi0JKiBzb20uaCAoc3RydWN0IHNvbV9zZWN0aW9uX2RhdGFfc3RydWN0KTogUmVuYW1lZCBmcm9tCi0Jc29tX3NlY3Rpb25fZGF0YSB0byBhdm9pZCBjb25mbGljdCB3aXRoIG1hY3JvIGJ5IHRoYXQgbmFtZS4KLQotCUNoYW5nZXMgZnJvbSBKZWZmIExhdyBhbmQgUGV0ZXIgSG9vZ2VuYm9vbSBhdCBVdGFoOgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogIFRhcmdldCByZWdpc3RlciBmb3IgYSAnanVtcAotCWluIGRlbGF5IHNsb3QnIG9wdGltaXphdGlvbiBpbiBjb21iaW5hdGlvbiB3aXRoIGEgbG9uZyBjYWxsCi0Jc3R1YiBzaG91bGQgYWx3YXlzIGJlIHIzMS4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IFRvIGJlIGNvbnNpc3RlbnQKLQlhY3Jvc3MgYWxsIHJlbG9jYXRpb24gdHlwZXMsIHJldHJpZXZlIGluc3RydWN0aW9uIGFkZGVuZHMgZnJvbQotCXRoZSByZWxvY2F0aW9uIGVudHJ5IHJhdGhlciB0aGFuIGZyb20gdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KLQotCSogZWxmMzItaHBwYS5jOiAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IEZpeCBhIHJlbG9jYXRpb24KLQllcnJvciB0aGF0IG9ubHkgb2NjdXJyZWQgd2hlbiB0aGUgYWRkZW5kIG9mIGFuICdhZGRpbCcgb3IKLQknbGRpbCcgd2FzIGxhcmdlciB0aGFuIDIxIGJpdHMgYW5kIHZlcnkgY2xvc2UgdG8gYSAySyBieXRlCi0JYm91bmRhcnkuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX3JlbG9jKTogIEhhbmRsZSB0aGUgb3B0aW1pemF0aW9uIGluCi0Jd2hpY2ggYSBqdW1wIGlzIHBsYWNlZCBpbiB0aGUgZGVsYXkgc2xvdCBvZiBhIGZ1bmN0aW9uIGNhbGwuCi0JVGhlIGp1bXAgd2FzIGJlaW5nIGFjY29tcGxpc2hlZCB2aWEgYW4gYWRqdXN0bWVudCB0byB0aGUKLQlyZXR1cm4gcG9pbnRlci4gIFRoaXMgb3B0aW1pemF0aW9uIHdvdWxkIGJyZWFrIHRoZSBsb25nIGNhbGwKLQlzdHViIGNvZGUsIGlmIHRoZXJlIHdhcyBhbnkuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBDb3JyZWN0aW9ucwotCXRvIGxvbmcgYnJhbmNoIHN0dWJzIHRvIGF2b2lkIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIDIuCi0KLQkqIGhwcGFfc3R1YnMuaDogTmV3IHN0dWIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBlbGZjb2RlLmg6IERlY2xhcmUgYmZkX2VsZl9maW5kX3NlY3Rpb24uCi0KLQkqIHNvbS5oIChzb21fc2VjdGlvbl9kYXRhKTogQWRkIG5ldyAic3Vic3BhY2VfaW5kZXgiIGZpZWxkLgotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBTYXZlIHRoZSBvcmlnaW5hbCBTT00gc3Vic3BhY2UgaW5kZXgKLQlpbiB0aGUgQkZEIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoYXQgc3Vic3BhY2UuICAKLQkoc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBJbXBsZW1lbnQuCi0JKHNvbV9nZXRfc3ltdGFiKTogSW1wbGVtZW50LgotCShzb21fcHJpbnRfc3ltYm9sKTogSW1wbGVtZW50LgotCShzb21fc2x1cnBfc3RyaW5nX3RhYmxlKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgYSBzdHJpbmcgdGFibGUKLQlmcm9tIGEgU09NIG9iamVjdCBmaWxlLgotCShzb21fc2VjdGlvbl9mcm9tX3N1YnNwYWNlX2luZGV4KTogTmV3IGZ1bmN0aW9uIHRvIHJldHVybiB0aGUKLQlzZWN0aW9uIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgU09NIHN1YnNwYWNlIGluZGV4LgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgdGhlIHN5bWJvbAotCXRhYmxlIGZyb20gYSBTT00gb2JqZWN0IGZpbGUuCi0JKHNvbV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGZvciBlcnJvcnMgZnJvbSBiZmRfemFsbG9jLgotCShzb21fbmV3X3NlY3Rpb25faG9vayk6IEluaXRpYWxpemUgc3Vic3BhY2VfaW5kZXggZmllbGQgdG8KLQktMSBpbnN0ZWFkIG9mIDAuCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogRml4IHBvbGFyaXR5IG9mIHRlc3QgdG8gc2V0IEhBU19SRUxPQy4KLQlTZXQgRVhFQ19QIGZvciBleGVjdXRhYmxlcy4KLQkoc2V0dXBfc2VjdGlvbnMpOiBDb3JyZWN0bHkgaWRlbnRpZnkgd2hlbiBhIHNlY3Rpb24gaGFzCi0JcmVsb2NhdGlvbnMuCi0JKGxvZzIpOiBOZXcgZnVuY3Rpb24uCi0JKHNldHVwX3NlY3Rpb25zKTogQ29ycmVjdGx5IGNvbnZlcnQgYmV0d2VlbiBTT00gYWxpZ25tZW50cyBhbmQgQkZECi0JYWxpZ25tZW50cy4KLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogRG8gbm90IHNldCBTRUNfQUxMT0Mgb3IgU0VDX0xPQUQKLQlmb3Igc2VjdGlvbnMgd2hpY2ggY29ycmVzcG9uZCB0byBTT00gc3BhY2VzLCBkb2luZyBzbyBjb25mdXNlcwotCW1hbnkgdXRpbGl0aWVzLiAgU2V0IGFzc29ydGVkIFNFQ18qIGZsYWdzIGZvciBTT00gc3Vic3BhY2VzCi0Jd2hpY2ggY29ycmVzcG9uZCB0byBCRkQgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLWhwcGEuYzogKGVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogVGhlIHN0YWIKLQlzdHJpbmcgdGFibGUgc2hvdWxkIGhhdmUgc2hfdHlwZSA9PSBTSFRfU1RSVEFCLiAgQWRkCi0JcHJvY2Vzc2luZyB0byBtYWtlIGl0IHNvLgotCi0JKiBlbGZjb2RlLmg6IChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdHJpbmcgdGFibGVzIChvdGhlcgotCXRoYW4gLnN0cnRhYikgd2VyZSBub3QgZ2V0dGluZyB0aGUgZmlsZSBvZmZzZXRzIHJlY29yZGVkLCBzbwotCXRoZXkgY291bGQgbm90IGJlIHJlYWQgZnJvbSBkaXNrLgotCi0JKiBlbGZjb2RlLmg6IChlbGZfbWFrZV9zZWN0aW9ucyk6ICBMZWF2ZSB0aGUgc2hfYWRkciBmaWVsZCBvZgotCXRoZSBzZWN0aW9uIGhlYWRlciBhbmQgdGhlIHZtYSBmaWVsZCBvZiBhIHNlY3Rpb24gYXQgMCBpZiB0aGUKLQlzZWN0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBwcm9ncmFtIGV4ZWN1dGlvbiBpbWFnZS4gKGUuZy4sCi0JLnN0YWIpCi0KLQkqIHNvbS5baGNdOiBDaGFuZ2UgdGFyZ2V0IHZlY3RvciBwcmVmaXggZnJvbSAiaHBwYSIgdG8gInNvbSIuCi0JQ29uc2lzdGVudGx5IHVzZSBvYmpfc29tIHByZWZpeCB0byBhY2Nlc3MgZmllbGRzIGluIGJhY2tlbmQgZGF0YQotCXN0cnVjdHVyZXMuICBGaXggYWxsIGNhbGxlcnMvcmVmZXJlbmNlcy4KLQotCSogc29tLmg6IERvIG5vdCBpbmNsdWRlIGZpbGVzIG9ubHkgbmVlZGVkIGZvciBjb3JlIGZpbGUgcmVhZGluZyBoZXJlLgotCUluY2x1ZGUgYS5vdXQgZm9yIGJvdGggSE9TVF9IUFBBSFBVWCBhbmQgSE9TVF9IUFBBQlNELiAgRGVsZXRlCi0JZm9yd2FyZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zLCB0aGV5IGFyZSB1bm5lY2Vzc2FyeS4KLQkoc3RydWN0IHNvbWRhdGEpOiBEZWxldGUgYXV4X2hkciwgYW5kIGhwX3N5bWJvbF9lbnRyeV9zaXplIGZpZWxkcy4KLQlDaGFuZ2UgInN5bWJvbHMiIHRvICJzeW10YWIiLiAgQWRkICJzdHJpbmd0YWIiIGFuZCAicmVsb2NfZmlsZXBvcyIKLQlmaWVsZHMgZm9yIGZ1dHVyZSB1c2UuICBDaGFuZ2Ugb2JqX3NvbV8qIG1hY3JvcyBhcyBhcHByb3ByaWF0ZS4KLQkoc29tX3NlY3Rpb25fZGF0YSk6IE5ldyBzdHJ1Y3R1cmUgdG8ga2VlcCBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24KLQlhYm91dCBCRkQgc2VjdGlvbnMgKGZvciBmdXR1cmUgdXNlKS4KLQotCSogc29tLmM6IFByb3ZpZGUgUEFSQU1TIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGZ1bmN0aW9ucyBjdXJyZW50bHkKLQlpbiB0aGlzIGZpbGUuCi0JKHN0cnVjdCBjb250YWluZXIpOiBEZWxldGUgdW53YW50ZWQgc3RydWN0dXJlIGRlZmluaXRpb24uCi0JKHNvbV9vYmplY3Rfc2V0dXApOiBBZGQgY29tbWVudHMuICBVc2Ugc29tX21rb2JqZWN0IHRvIGFsbG9jYXRlCi0JU09NIHNwZWNpZmljIGluZm9ybWF0aW9uIGluIHRoZSBCRkQ7IHVzZSBpbmZvcm1hdGlvbiBmcm9tIHRoZQotCWZpbGUgYW5kIChwb3NzaWJseSBlbXB0eSkgYXV4aWxpYXJ5IGhlYWRlcnMgdG8gaW5pdGlhbGl6ZSB0aGlzCi0JaW5mb3JtYXRpb24uICBEZWxldGUgcmVkdW5kYW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICJjYWxscyIuCi0JKHNldHVwX3NlY3Rpb25zKTogUmV0dXJuIHR5cGUgaXMgbm93IGJvb2xlYW4sIGZpeCByZXR1cm4gc3RhdGVtZW50cy4KLQkiRml4IiBoYW5kbGluZyBvZiBCU1MgbGlrZSBzdWJzcGFjZXMgaW4gdGhlIGNvbXB1dGF0aW9uIG9mIHRoZQotCWNvbnRhaW5pbmcgc3BhY2UncyBzaXplLiAgSWYgdGhlIHN1YnNwYWNlIGhhcyByZWxvY2F0aW9ucywgc2V0IHRoZQotCWFwcHJvcHJpYXRlIEJGRCBzZWN0aW9uIGZsYWdzIGFuZCByZWNvcmQgdGhlIGluZGV4IGludG8gYW5kIHRoZQotCXNpemUgb2YgdGhlIGZpeHVwIHN0cmVhbS4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkoc29tX29iamVjdF9wKTogU2V0IGJmZF9lcnJvciBhcHByb3ByaWF0ZWx5IGlmIGVycm9ycyBhcmUgZGV0ZWN0ZWQKLQlmcm9tIGJmZF97cmVhZCxzZWVrfSBmdW5jdGlvbnMuICBIYW5kbGUgRVhFQ0xJQk1BR0lDIHR5cGUgZmlsZXMuCi0JRG8gbm90IHRyeSB0byByZWFkIGEgbm9uLWV4aXN0YW50IGF1eGlsaWFyeSBoZWFkZXIuCi0JKHNvbV9ta29iamVjdCk6IEZsZXNoIG91dC4KLQkoc29tX3NlY3Rpb25faG9vayk6IEFsbG9jYXRlIHNwYWNlIHRvIGhvbGQgU09NIHNwZWNpZmljIGluZm9ybWF0aW9uCi0JYWJvdXQgc2VjdGlvbnMuCi0KLVRodSBPY3QgMjEgMTI6NDE6MzQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQlnY2MgLVdhbGwgbGludDoKLQkqIGNvZmYtaDgzMDAuYywgY29mZmNvZGUuaDogQ2hhbmdlIHNocmluayBwYXJhbWV0ZXIKLQlpbiAqX3JlbG9jMTZfZXN0aW1hdGUgdG8gdW5zaWduZWQgdG8gbWF0Y2ggcHJvdG90eXBlLgotCSogYXJjaGl2ZS5jOiBBdm9pZCAiLyoiIGluIGNvbW1lbnQuCi0KLVRodSBPY3QgMjEgMTM6MDU6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkZXAtaW4uc2VkOiBDcmVhdGUgb3VyIG93biBsaW5lIGJyZWFrcyBmb3IgYSBtb3JlIGFlc3RoZXRpYwotCU1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGYzMi1taXBzLmM6IEluY2x1ZGUgInNlY2xldC5oIi4KLQkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IEZvcmNlIHNpemUgb2YgLnJlZ2luZm8gc2VjdGlvbiB0byBzaXplb2YKLQlFbGYzMl9FeHRlcm5hbF9SZWdJbmZvLgotCShtaXBzX2VsZl9zZWNsZXRfbGluayk6IE5ldyBmdW5jdGlvbi4gIExpbmsgdGhlIC5yZWdpbmZvIHNlY3Rpb24KLQlzcGVjaWFsbHksIGFuZCBwYXNzIGV2ZXJ5dGhpbmcgZWxzZSB0byB0aGUgZ2VuZXJpYyByb3V0aW5lLgotCShiZmRfZWxmMzJfYmZkX3NlY2xldF9saW5rKTogRGVmaW5lIG1hY3JvLgotCSogZWxmMzItdGFyZ2V0Lmg6IElmIGJmZF9lbGYzMl9iZmRfc2VjbGV0X2xpbmsgaXMgYWxyZWFkeSBkZWZpbmVkLAotCWRvbid0IG92ZXJyaWRlIGl0LgotCi1XZWQgT2N0IDIwIDEyOjIyOjM3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlibmxtLmggKG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBzaWduYXR1cmUgZmllbGQuCi0JKG5sbV9zaWduYXR1cmUpOiBOZXcgbWFjcm8uCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCwgbmxtX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSB0aGUgTkxNCi0Jc2lnbmF0dXJlIGZyb20gdGhlIGJhY2tlbmQgcmF0aGVyIHRoYW4gdGhlIGNvbnN0YW50IE5MTV9TSUdOQVRVUkUuCi0JKiBubG0zMi1pMzg2LmMgKG5sbTMyX2kzODZfYmFja2VuZCk6IEluaXRpYWxpemUgc2lnbmF0dXJlIGZpZWxkLgotCi0JKiBhb3V0ZjEuaCAoTUFDSFRZUEVfT0spOiBBY2NlcHQgTV9VTktOT1dOLgotCShOQU1FKHN1bm9zLHNldF9hcmNoX21hY2gpKTogVHJlYXQgTV9VTktOT1dOIGFzIDY4MDAwLCBub3QgNjgwMjAuCi0KLVdlZCBPY3QgMjAgMTA6Mjg6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZic2QuaCBbX19ic2RpX19dOiBEZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIuCi0KLVdlZCBPY3QgMjAgMTA6MTA6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChIRklMRVMpOiBOZXcgdmFyaWFibGUsIGZvciB1c2UgaW4gIm1ha2UgZGVwIi4KLQkoLmRlcCk6IERlcGVuZCBvbiAkKENGSUxFUykgYW5kICQoSEZJTEVTKS4gIERlbGV0ZSAuZGVwMSBhbmQKLQlyZW1ha2UgaXQsIHNvIHRoYXQgIiQ/IiBpcyBjb21wbGV0ZS4KLQkoLmRlcDEpOiBEb24ndCBuZWVkIHRvIHJlbW92ZSAuZGVwMSBmaXJzdC4KLQkoZGVwLnNlZCk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzLCBub3QgTWFrZWZpbGUuCi0JKENGSUxFUyk6IEFkZCBubG0uYy4KLQotVHVlIE9jdCAxOSAxNToyNjoyNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYzogSW1wbGVtZW50ZWQgcmVsb2MgaGFuZGxpbmcgZm9yIHRoZSBsaW5rZXIsIG1hZGUKLQl2YXJpb3VzIG90aGVyIHJlbGF0ZWQgY2hhbmdlcy4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIHJkYXRhX2luX3RleHQgZmllbGQuCi0JUmVuYW1lZCBmaW5pc2hfcmVsb2MgdG8gYWRqdXN0X3JlbG9jX2luLiAgQWRkZWQgYWRqdXN0X3JlbG9jX291dAotCWZpZWxkLgotCShlY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3QgZGVmaW5lLgotCSogZWNvZmYuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MsIGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKToKLQlIYW5kbGUgLmxpdGEgc2VjdGlvbi4KLQkoZWNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBIYW5kbGUgUkVMT0NfU0VDVElPTl9GSU5JLgotCWZpbmlzaF9yZWxvYyBiYWNrZW5kIGZpZWxkIHJlbmFtZWQgdG8gYWRqdXN0X3JlbG9jX2luLgotCShlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBBZGp1c3QgbnVtYmVyIG9mIGF1eCBlbnRyaWVzIHRvCi0JZGVidWdfYWxpZ24gYm91bmRhcnkuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIHJkYXRhX2luX3RleHQgcHV0Ci0JLnJkYXRhIHNlY3Rpb24gaW4gdGV4dCBzZWdtZW50LCBub3QgZGF0YSBzZWdtZW50LiAgUHV0IC5wZGF0YQotCXNlY3Rpb24gaW4gdGV4dCBzZWdtZW50LgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIEFsc28sIGNhbGwKLQlhZGp1c3RfcmVsb2Nfb3V0LCBhbmQgaGFuZGxlIC5saXRhLCAueGRhdGEsIC5wZGF0YSwgLmZpbmkgYW5kCi0JYWJzb2x1dGUgc2VjdGlvbnMgd2hlbiB3cml0aW5nIG91dCByZWxvY3MuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBGb3IgQUxQSEFFQ09GRiwgb3V0cHV0IDIgZm9yCi0JYmxkcmV2IGZpZWxkLCBhcyBvbiBBbHBoYSBPU0YvMS4gIFBhZGRpbmcgZmllbGQgaXMgbm93IDIgYnl0ZXMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IEFkZGVkIGFzc2VydGlvbi4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBSZW5hbWVkIGZyb20gbWlwc19maW5pc2hfcmVsb2MuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX291dCk6IE5ldyBmdW5jdGlvbiAoZG9lcyBub3RoaW5nKS4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGlvbl9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lIHRvIGJlCi0JYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkZWQgY2FzdHMgdG8gYXZvaWQgQWxwaGEKLQlPU0YvMSBjYyBidWcuCi0KLVRodSBPY3QgMTQgMDE6MTA6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQWRkIGNvbW1lbnRzIGF0dGVtcHRpbmcgdG8KLQlleHBsYWluIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zLgotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IERvbid0IHNldCBTRUNfREVCVUdHSU5HIHVudGlsIGl0Ci0JaXMgbWFkZSB0byB3b3JrLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJlbW92ZSBjaGVjayBmb3IKLQlVU0VfRElTQ0FSREVEX1NFQ1RJT05TX0NPVU5ULgotCSogY29mZi1pMzg2LmM6IERvbid0IGRlZmluZSBVU0VfRElTQ0FSREVEX1NFQ1RJT05TX0NPVU5ULiAgQmFzaW5nCi0JaXQgb24gaG9zdCBkZWZpbmVzIGlzIHdyb25nLgotCi0JKiBlY29mZi5jIChlY29mZl9iZmRfc2VjbGV0X2xpbmspOiBEb24ndCBsaW5rIGEgLnJlZ2luZm8gc2VjdGlvbi4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgcmVxdWlyZSB0aGUgLnJlZ2luZm8gc2VjdGlvbgotCXRvIGJlIGEgcGFydGljdWxhciBzaXplLgotCi1XZWQgT2N0IDEzIDE4OjM5OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlcC1pbik6IE5ldyBydWxlLCBmb3IgZWRpdGluZyBkZXBlbmRlbmNpZXMgaW50bwotCU1ha2VmaWxlLmluIGluICQoc3JjZGlyKS4gIFVzZSBtb3ZlLWlmLWNoYW5nZS4KLQkoLmRlcDEsIGRlcCk6IFVzZSBtb3ZlLWlmLWNoYW5nZS4KLQkoQ0ZJTEVTKTogQWRkIGNvZmYtYXBvbGxvLmMuCi0KLQlTdW4gT2N0IDEwIDE4OjAyOjU2IDE5OTMgIFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LkVEVS5BVSkKLQotCSogTWFrZWZpbGUuaW46IFJlY29nbmlzZSBuZXcgZmlsZSwgY29mZi1hcG9sbG8ubwotCi0JKiBjb2ZmLWFwb2xsby5jOiBOZXcgZmlsZQotCi0JKiBjb2ZmY29kZS5oOiBSZWNvZ25pc2UgYXBvbGxvIG1hZ2ljIG51bWJlcnMgYW5kIHdyaXRhYmxlIHRleHQKLQotCSogY29mZnN3YXAuaDogU3dhcCBBcG9sbG8gb3B0aW9uYWwgaGVhZGVyIGVudHJpZXMKLQotCSogY29uZmlnLmJmZDogQWRkIGxpbmUgZm9yIEFwb2xsbwotCi0JKiBjb25maWd1cmUuaG9zdDogUmVwbGFjZSBhcG9sbG82OGIgYW5kIGFwb2xsbzY4diB3aXRoIEFwb2xsbwotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbmlzZSBhcG9sbG9jb2ZmX3ZlYwotCi0JKiB0YXJnZXRzLmM6IExpa2V3aXNlCi0KLQkqIGNvbmZpZy9hcG9sbG8ubWgsIGNvbmZpZy9hcG9sbG8ubXQ6IE5ldyBmaWxlcwotCi0JKiBob3N0cy9hcG9sbG82OC5oOiBSZW1vdmUgaW5jbHVzaW9uIG9mIHN0cmluZ3MuaAotCi1XZWQgT2N0IDEzIDE0OjI4OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2LmMgKGkzY29mZl9vYmplY3RfcCk6IE5vdyBzdGF0aWMuCi0KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGVkIGRlcGVuZGVuY2llcy4KLQkoLmRlcCwgLmRlcDEsIGRlcC5zZWQpOiBOZXcgdGFyZ2V0cywgdG8gbWFrZSAibWFrZSBkZXAiIHdvcmsKLQliZXR0ZXIuCi0JKiBkZXAtaW4uc2VkOiBOZXcgZmlsZS4KLQotCSogbTY4a2x5bngtY2YuYyAoT05MWV9ERUNMQVJFX1JFTE9DUyk6IERlZmluZSwgdG8gYXZvaWQgbmFtZQotCWNvbmZsaWN0cyB3aGVuICItLXdpdGgtdGFyZ2V0cz1hbGwiLgotCSogY29mZi1tNjhrLmMgKG02OGtjb2ZmX2hvd3RvX3RhYmxlLCBtNjhrX3J0eXBlMmhvd3RvLAotCW02OGtfaG93dG8ycnR5cGUpOiBSZW5hbWUgdmlhIG1hY3JvcyB0byBrZWVwIG5hbWVzcGFjZSBjbGVhbi4KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIG02OGtseW54X2NvZmZfdmVjLCBpbmNsdWRlIGNvZmYtbTY4ay5vIGZvcgotCW5vdy4KLQotVHVlIE9jdCAxMiAxNzowMzoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1pcHMuYzogRXh0ZW5zaXZlIGFkZGl0aW9ucyB0byBkbyByZWxvY2F0aW9ucyBhbmQgdG8KLQloYW5kbGUgTUlQUyBzcGVjaWZpYyBzZWN0aW9ucy4KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9kYXRhKTogUGFzcyBmb3VydGggYXJndW1lbnQgdG8KLQllbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gdG8gcGVybWl0IGl0IHRvIGNvbnRyb2wgdGhlCi0Jc2VjdGlvbiBpbmRleCB0byB1c2UuCi0JKGVsZl9vYmpfdGRhdGEpOiBBZGQgZ3AgYW5kIGdwX3NpemUgZmllbGRzLgotCShlbGZfZ3AsIGVsZl9ncF9zaXplKTogTmV3IGFjY2Vzc29yIG1hY3Jvcy4KLQkqIGVsZmNvZGUuaDogUmVtb3ZlZCBhIG51bWJlciBvZiB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENsZWFyIHNlY3Rpb24gaGVhZGVyIGJlZm9yZSBjYWxsaW5nCi0JZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucywgbm90IGFmdGVyLgotCShwcmVwX2hlYWRlcnMpOiBSZXR1cm4gdHJ1ZSBhdCBlbmQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBQYXNzIHJldHZhbCBhcmd1bWVudCB0bwotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbi4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6Ci0JQWNjZXB0IGFuZCBpZ25vcmUgbmV3IHJldHZhbCBhcmd1bWVudC4KLQkqIGJmZC5jOiBJbmNsdWRlIGxpYmVsZi5oLgotCShiZmRfc2V0X2dwX3NpemUpOiBIYW5kbGUgRUxGIHRhcmdldHMuCi0JKiBNYWtlZmlsZS5pbiAoYmZkLm8pOiBEZXBlbmRzIHVwb24gbGliZWxmLmguCi0JKGVsZjMyLW1pcHMubyk6IERlcGVuZHMgdXBvbiAkKElOQ0RJUikvZWxmL21pcHMuaC4KLQotTW9uIE9jdCAxMSAxNzoyNToxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0KTogQ2hlY2sgYmZkX21ha2Vfc2VjdGlvbiByZXR1cm4gdmFsdWUuCi0JKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX25ld19zZWN0aW9uX2hvb2ssIGVjb2ZmX3NpemVvZl9oZWFkZXJzLAotCWVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgZWNvZmZfc2V0X3NlY3Rpb25fY29udGVudHMsCi0JZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSGFuZGxlIGR1bW15IFJFR0lORk8gc2VjdGlvbi4KLQkoZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBOZXcgZnVuY3Rpb24gdG8gaGFuZGxlIHJlYWRpbmcKLQlSRUdJTkZPIHNlY3Rpb24uCi0JKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IENoYW5nZSBmcm9tIG1hY3JvCi0JZGVmaW5pdGlvbiB0byBmdW5jdGlvbiBwcm90b3R5cGUuCi0JKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBOZXcgcHJvdG90eXBlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9ta29iamVjdF9ob29rKTogUmVtb3ZlZC4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogVXNlIGVjb2ZmX21rb2JqZWN0X2hvb2suCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9ta29iamVjdF9ob29rKTogUmVtb3ZlZC4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgZWNvZmZfbWtvYmplY3RfaG9vay4KLQotRnJpIE9jdCAgOCAxNToyNTozMyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0KjMyLCBiZmRfZ2V0KjY0KTogIFByZXZlbnQgQU5TSSBzaWduIGV4dGVuc2lvbgotCWJ5IGNhc3RpbmcgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSB0byBiZmRfdm1hLgotCi1GcmkgT2N0ICA4IDAyOjM0OjIxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmluOiAgRG8gbm90IGRlZmluZSBTRUxFQ1RfVkVDUywgU0VMRUNUX0FSQ0hJVEVDVFVSRVMKLQlpZiBjb25maWd1cmluZyAtLXdpdGgtdGFyZ2V0cz1hbGwuCi0KLVRodSBPY3QgIDcgMTc6MzQ6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQpOiBDb3JyZWN0IHRoZSAic2l6ZSIgZmllbGQgaW4gc29tZQotCWVudHJpZXMuCi0KLQkqIHJlbG9jLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBDaGFuZ2UgZG9jdW1lbnRhdGlvbiB0byBkaXNwZWwgYW55Ci0Jbm90aW9uIHRoYXQgdGhlICJzaXplIiBmaWVsZCBpcyBhIHBvd2VyLW9mLXR3byBpbmRpY2F0b3IuCi0KLVRodSBPY3QgIDcgMTA6NTA6MzggMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotICAgICAgICogY29mZnN3YXAuaDogKGJmZF9zd2FwX3JlbG9jX2luKTogYSBzeW1uZHggaXMgc2lnbmVkLgotCi0JTWFrZSBzdXBwb3J0IGZvciByZWxheGluZyBtb3JlIGdlbmVyaWMuCi0JKiByZWxvYzE2LmM6IEFkZCBuZXcgdGFyZ2V0IGVudHJ5IC0gYmZkX2NvZmZfcmVsb2MxNl9lc3RpbWF0ZSwKLQlmaXggYml0IHJvdC4KLQkqIGxpYmNvZmYuaCwgbGliY29mZi1pbi5oOiBkZWNsYXJhdGlvbnMuIFByb3RvdHlwZXMKLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogQWRkIGNhbGxzIHRvCi0JY29mZl9yZWxvY18xNl9leHRyYV9jYXNlcyBhbmQgY29mZl9yZWxvYzE2X2VzdGltYXRlLgotCShkdW1teV9yZWxvYzE2X2VzdGltYXRlKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogTmV3IGZ1bmN0aW9uCi0KLVRodSBPY3QgIDcgMTQ6MjQ6MTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKEVBTElHTik6IERlZmluZSwgZGVwZW5kZW50IG9uIEFSQ0hfU0laRS4KLQkoYWxpZ25fZmlsZV9wb3NpdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2xvY2F0ZV9zaCk6IERpc2FibGVkIGZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc3ltdGFiX2FuZF9zdHJ0YWJzKTogQWxpZ24gcG9zaXRpb24sCi0JdGhlbiBwbGFjZSBzeW10YWIsIHRoZW4gZG8gb3RoZXIgc2VjdGlvbnMuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQWxpZ24gcHJvZ3JhbSBoZWFkZXIuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWxpZ24gc2VjdGlvbiBoZWFkZXJzLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IEFsaWduIHJlbG9jYXRpb24gc2VjdGlvbnMuCi0KLVR1ZSBPY3QgIDUgMTA6NDQ6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBSZWNvZ25pemUgaHBwYSotKi1oaXV4KiAoY3VycmVudGx5IHN5bm9ueW0gZm9yIGhwdXgpLgotCUNoYW5nZSBvdGhlciBocHBhIGVudHJpZXMgdG8gdXNlIC0qLSBub3QgLWhwLS4KLQkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBocHBhKi0qLWhpdXgqIChjdXJyZW50bHkgc3lub255bSBmb3IgaHB1eCkuCi0KLQkqIGNvZmYtcnM2MDAwLmMsIGNwdS1yczYwMDAuYywgcnM2MDAwLWNvcmUuYzogQ2hhbmdlIG5vbi1BU0NJSQotCWNoYXJhY3RlcnMgaW4gY29tbWVudCB0byBvY3RhbCBlc2NhcGVzLgotCi1TdW4gT2N0ICAzIDEyOjM1OjE1IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2bHlueC5jOiBSZW1vdmVkLCBuYW1lIHRvbyBsb25nLgotCSogaTM4Nmx5bngtY2YuYzogTmV3IGZpbGUsIHdhcyBjb2ZmLWkzODZseW54LmMuCi0JKiBjb25maWd1cmUuaW46IFJlZmxlY3QgZmlsZSBuYW1lIGNoYW5nZXMuCi0JKiBNYWtlZmlsZS5pbjogTWVudGlvbiBMeW54LXJlbGF0ZWQgZmlsZXMuCi0KLQkqIGkzODZseW54LmMgKGx5bnhfMzJfc3dhcF9leHRfcmVsb2NfaW4pOiBnZXQgcmVsb2MgYml0cyBpbiBpMzg2Ci0JTHlueC1zcGVjaWZpYyB3YXkuCi0KLQkqIG02OGtseW54LWNmLmM6IE5ldyBmaWxlLCBkZWZpbmVzIGNvZmYgZm9ybWF0IGZvciBNNjhLIEx5bnhPUy4KLQkqIG02OGtseW54LmM6IFJlbW92ZSBjb2ZmIHZlY3RvciBkZWZpbml0aW9uLCBub3cgaW4gbTY4a2x5bngtY2YuYy4KLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBTZXQgc2VjdGlvbiBmbGFnIHRvIFNUWVBfSU5GTwotCWZvciAuc3RhYiwgLnN0YWJzdHIgYW5kIC5kZWJ1ZyBzZWN0aW9ucywgYW5kIHNldCBTRUNfREVCVUdHSU5HIGZvcgotCXNlY3Rpb25zIG9mIHR5cGUgU1RZUF9JTkZPLiAgKGZyb20gTWluaCBUcmFuLUxlKQotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEFkZCBkaXNjYXJkZWRfc2VjdGlvbnNfY291bnQKLQl0byBhYmZkLT5zZWN0aW9uX2NvdW50LCB3aGljaCBoZWxwcyBgc3RyaXAnIGtlZXAgdGhlIHNpemUKLQlvZiB0aGUgZXhlY3V0YWJsZSBoZWFkZXIgY29uc3RhbnQuCi0JKiBjb2ZmLWkzODYuYyAoZGlzY2FyZGVkX3NlY3Rpb25zX2NvdW50KTogTmV3IHZhcmlhYmxlLCBpbml0aWFsaXplZAotCXRvIHplcm8uICBGb3IgdXNlIGJ5IGBzdHJpcCcuICBDdXJyZW50bHkgYmVpbmcgdXNlZCBvbmx5IGluIGFpeDM4NgotCWNvZmYsIGJ1dCBtYXkgYmUgdXNlZnVsIGZvciBvdGhlciBjb2ZmIHN5c3RlbXMuICAoZnJvbSBNaW5oIFRyYW4tTGUpCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9maWxlaGRyX291dCk6IEFkZGVkIGEgbWlzc2luZyBjYXN0LgotCi0JKiBhcmNoaXZlLmM6IENvc21ldGljIGltcHJvdmVtZW50cy4KLQkqIG9wbmNscy5jOiBDb3NtZXRpYyBpbXByb3ZlbWVudHMuCi0JKG5ld19iZmQpOiBSZW1vdmVkIHJlZHVuZGFudCBzdHJ1Y3R1cmUgc2xvdCBpbml0LgotCi1TYXQgT2N0ICAyIDE4OjQ4OjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbmV3cy1taXBzLm1oLCBob3N0cy9uZXdzLW1pcHMuaDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBuZXdzLW1pcHMgZm9yIG1pcHMtc29ueS1ic2QqLgotCi1GcmkgT2N0ICAxIDEzOjE0OjE3IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBpMzg2bHlueF9jb2ZmX3ZlYyByZXF1aXJlcyBjb2ZmLWkzODZseW54Lm8uCi0JKiBjb2ZmLWkzODZseW54LmM6IE5ldyBmaWxlLCBkZWZpbmVzIEx5bnggdGFyZ2V0IHZlY3RvciBhbmQgbmFtZSwKLQlpbmNsdWRlcyBjb2ZmLWkzODYuYy4KLQkqIGNvZmYtaTM4Ni5jIChpMzg2Y29mZl92ZWMpOiBBbGxvdyByZWRlZmluaXRpb24gb2YgdGFyZ2V0IHZlY3RvcgotCXN5bWJvbCBhbmQgbmFtZSwgaWYgVEFSR0VUX1NZTSBhbmQvb3IgVEFSR0VUX05BTUUgYXJlIGRlZmluZWQuCi0JKiBpMzg2bHlueC5jOiBSZW1vdmUgY29mZiB2ZWN0b3IgZGVmaW5pdGlvbiBlbnRpcmVseS4KLQkobHlueF8zMl9zd2FwX2V4dF9yZWxvY19pbik6IERlZmluZS4KLQkobHlueF8zMl9zd2FwX3N0ZF9yZWxvY19pbik6IERlZmluZSwgZ2V0IHJlbG9jIGJpdHMgaW4gaTM4NgotCUx5bngtc3BlY2lmaWMgd2F5LgotCShseW54XzMyX3N3YXBfZXh0X3JlbG9jX291dCk6IERlZmluZS4KLQkobHlueF8zMl9zd2FwX3N0ZF9yZWxvY19vdXQpOiBEZWZpbmUuCi0JKGx5bnhfMzJfc2x1cnBfcmVsb2NfdGFibGUpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0JKGx5bnhfMzJfc3F1aXJ0X291dF9yZWxvY3MpOiBEZWZpbmUsIGNhbGwgTHlueCBzd2FwcGluZyBmbnMuCi0JKGx5bnhfMzJfY2Fub25pY2FsaXplX3JlbG9jKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgotCShXUklURV9IRUFERVJTKTogRGVmaW5lLCBjYWxsIEx5bnggc3dhcHBpbmcgZm5zLgotCi0JKiBjb25maWcvaTM4Ni1seW54Lm10IChTRUxFQ1RfVkVDUyk6IFJlbW92ZSByZWR1bmRhbnQgdmVjdG9yLgotCi1UaHUgU2VwIDMwIDE3OjUwOjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfdHlwZSk6IEFkZCBsaW5rYWdlLXRhYmxlIHJlbGF0aXZlCi0JcmVsb2NhdGlvbnMgb2Ygc2l6ZSA4LCAxNiwgMzIuICBTb3J0IGdlbmVyaWMgcmVsb2NzIGJ5IHR5cGUgcmF0aGVyCi0JdGhhbiBzaXplLiAgQWRkZWQgYSBsaXR0bGUgZG9jdW1lbnRhdGlvbiB0b28uCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCk6IEFkZCBCQVNFMTYgYW5kIEJBU0UzMiByZWxvY3MuCi0JKFRBQkxFX1NJWkUpOiBOZXcgbWFjcm8uCi0JKHJlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ197MTYsMzJ9X0JBU0VSRUwgZm9yIHN0ZAotCXJlbG9jcy4KLQkoc3dhcF9zdGRfcmVsb2Nfb3V0KTogV3JpdGUgYmFzZXJlbCByZWxvY3MgY29ycmVjdGx5LgotCShzd2FwX3N0ZF9yZWxvY19pbik6IEhhbmRsZSByX2Jhc2VyZWwgZmllbGQuICBBc3NlcnQgdGhhdAotCXJfam1wdGFibGUgYW5kIHJfcmVsYXRpdmUgZmllbGRzIGFyZSBjbGVhciwgYW5kIHRoYXQgdGhlIGNvbXB1dGVkCi0JaW5kZXggZG9lcyByZWZlciB0byBhIGRlZmluZWQgZW50cnkgb2YgdGhlIGhvd3RvIHRhYmxlLgotCi1UdWUgU2VwIDI4IDE0OjQ3OjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogTmV3IGZ1bmN0aW9uLgotCSogc2VjdGlvbi5jOiBDaGFuZ2UgY29tbWVudHMgdG8gc2F5IHNldmVyYWwgc2VjdGlvbnMgY2FuIGhhdmUKLQl0aGUgc2FtZSBuYW1lLgotCSogYmZkLWluMi5oOiBSZS1nZW5lcmF0ZSB0byByZWZsZWN0IGFib3ZlIGNoYW5nZS4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogQ2FsbCBiZmRfbWFrZV9zZWN0aW9uX2FueXdheQotCWlmIHN0aWxsIG5vIHNlY3Rpb24gYWZ0ZXIgdGhlIGJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rLgotCSogY29mZmNvZGUuaDogQWRkIGNvbW1lbnQgYWJvdXQgVFdPX0RBVEFfU0VDUy4KLQotVHVlIFNlcCAyOCAwMzoyMjoyNCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiAgQWx3YXlzIGRldGVybWluZSByYXdfc2l6ZQotCWV4cGxpY2l0bHkuCi0JKiBlY29mZi5jIChlY29mZl9zZWNfdG9fc3R5cF9mbGFncywgZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiAgSGFuZGxlCi0JLmZpbmkgc2VjdGlvbi4KLQotTW9uIFNlcCAyNyAxODoyOToxOCAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgY29uZmlndXJlLmhvc3Q6IE1hdGNoIG9uICotbHlueG9zKiBmb3IgTHlueE9TLAotCWFkZCBtNjgqLSotbHlueG9zKi4KLQkqIGNvbmZpZ3VyZS5pbiA6IFJlcGxhY2VkIGkzODZseW54X3ZlYyB3aXRoIGkzODZseW54X2FvdXRfdmVjCi0JYW5kIGkzODZseW54X2NvZmZfdmVjLgotCUFkZGVkIG02OGtseW54X2FvdXRfdmVjIGFuZCBtNjhrbHlueF9jb2ZmX3ZlYy4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IFJlbW92ZWQgaTM4Nmx5bnhfdmVjLCBhZGRlZAotCXtpMzg2LG02OGt9bHlueF97YW91dCxjb2ZmfV92ZWMuCi0JKiBpMzg2bHlueC5jOiBBZGRlZCBjb3B5IG9mIGkzODZjb2ZmLmMsIHJlbmFtZWQgYmZkIHRhcmdldCB0bwotCWkzODZseW54X2NvZmZfdmVjLgotCSogbTY4a2x5bnguYzogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1seW54Lm10OiBSZXBsYWNlZCBpMzg2bHlueF92ZWMgd2l0aCBpMzg2bHlueF9hb3V0X3ZlYwotCWFuZCBpMzg2bHlueF9jb2ZmX3ZlYy4KLQkqIGNvbmZpZy9tNjhrLWx5bngubXQ6IE5ldyBmaWxlLgotCSogaG9zdHMvaTM4Nmx5bnguaDogQWRkZWQgZGVmaW5pdGlvbiBvZiBjZnJlZSBhcyBmcmVlIChmcm9tIEVpY2hpbikuCi0JKiBob3N0cy9tNjhrbHlueC5oOiBOZXcgZmlsZS4KLQotTW9uIFNlcCAyNyAxODowMDo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jOiBEZWZpbmUgb2Zmc2V0b2YgaGVyZS4KLQkqIGhvc3RzLyouaDogRG9uJ3QgZGVmaW5lIGl0IGhlcmUuCi0KLU1vbiBTZXAgMjcgMTk6MDk6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFNldCBmaWxlcG9zIGZvciBTSFRfU1RSVEFCCi0Jc2VjdGlvbi4KLQotRnJpIFNlcCAyNCAxNTo0Nzo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaHB1eC1jb3JlLmM6IEFkZCBjb21tZW50IGFib3V0IGhwdXggdmVyc2lvbiA3LgotCi1GcmkgU2VwIDI0IDE2OjUwOjI2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGx5bngtY29yZS5jIChseW54X2NvcmVfZmlsZV9wKTogIENoYW5nZSBwZXItdGhyZWFkIHJlZ2lzdGVyCi0Jc2VjdGlvbiBuYW1lcyBmcm9tIC5yZWdYWFggdG8gLnJlZy9YWFggdG8gYXZvaWQgcGFyc2luZyBhbWJpZ3VpdHkKLQlpbiBnZGIvY29yZWxvdy5jLiAgQ3JlYXRlIGFsaWFzIC5yZWcgc2VjdGlvbiBmb3IgdGhlIGN1cnJlbnRseQotCXJ1bm5pbmcgdGhyZWFkLgotCi1GcmkgU2VwIDI0IDEzOjIyOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliZWNvZmYuaCAoZWNvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBiaWdfbWFnaWMgYW5kCi0JbGl0dGxlX21hZ2ljIGZpZWxkcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlZCBpbml0aWFsaXphdGlvbgotCW9mIGJpZ19tYWdpYyBhbmQgbGl0dGxlX21hZ2ljLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rKTogTWFrZSBzdXJlIG1hZ2ljIG51bWJlcgotCW1hdGNoZXMgZW5kaWFuZXNzIG9mIGJmZC4KLQkobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmVkIGluaXRpYWxpemF0aW9uIG9mIGJpZ19tYWdpYyBhbmQKLQlsaXR0bGVfbWFnaWMuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBTZXQgTUlQUyBtYWNoaW5lIG51bWJlcgotCWJhc2VkIG9uIG1hZ2ljIG51bWJlci4gIFN1cHBvcnQgcjQwMDAgbWFnaWMgbnVtYmVycy4KLQkoZWNvZmZfZ2V0X21hZ2ljKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgZWNvZmZfZ2V0X21hZ2ljLCBub3QgZmllbGRzIGluCi0JdGhlIGJhY2tlbmQgc3RydWN0dXJlLgotCSogY3B1LW1pcHMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZGVkIGNhc2UgZm9yIHI2MDAwLgotCi0JRm9yIE1JUFMgY29uZmlndXJhdGlvbnMgcHV0IGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIHZlcnNpb25zIGluCi0JdGhlIGxpc3Qgb2YgdGFyZ2V0czsgdGhlIGNvZGUgaXMgZ2V0dGluZyBjb21waWxlZCBpbiBhbnlob3cuCi0JKiBiaWdtaXBzLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9saXR0bGVfdmVjLgotCSogZGVjc3RhdGlvbi5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgZWNvZmZfYmlnX3ZlYy4KLQkqIG1pcHNiZWxmLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMuCi0JKiBtaXBzbGVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBEZWZpbmUgdG8gYmUgYmZkX2VsZjMyX2JpdG1pcHNfdmVjLgotCSogcmlzY29zLm10IChTRUxFQ1RfVkVDUyk6IERlZmluZSB0byBiZSBlY29mZl9saXR0bGVfdmVjLgotCi1GcmkgU2VwIDI0IDAwOjQyOjIzIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogb3NmLWNvcmUuYzogIE5ldyBmaWxlIGZvciBPU0YvMSBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGNvbmZpZy9hbHBoYW9zZi5taCAoSERFRklORVMpOiAgQWRkIC1ET1NGX0NPUkUuCi0JKEhERVBGSUxFUyk6ICBTZXQgdG8gb3NmLWNvcmUuby4KLQkqIGJmZC1pbjIuaCAodW5pb24gdGRhdGEpOiAgQWRkIG9zZl9jb3JlX2RhdGEgbWVtYmVyLgotCSogdGFyZ2V0cy5jOiAgSWYgT1NGX0NPUkUgaXMgZGVmaW5lZCwgYWRkIG9zZl9jb3JlX3ZlYyB0byB0YXJnZXQgbGlzdC4KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6ICBBZGQgb3NmLWNvcmUuby4KLQkob3NmLWNvcmUubyk6ICBOZXcgZGVwZW5kZW5jeS4KLQotVGh1IFNlcCAyMyAyMTowNDo1MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogVE9ETzogUmVtb3ZlIG5vdGUgYWJvdXQgbWFraW5nIC0td2l0aC1iZmQtdGFyZ2V0cyB1c2UgY2Fub25pY2FsCi0JdGFyZ2V0IGNvbmZpZ3VyYXRpb24gbmFtZSAoYWxyZWFkeSBkb25lKTsgcmV3b3JkIGl0ZW0gYWJvdXQKLQlzZXBhcmF0aW5nIHJlYWRpbmcgYW5kIHdyaXRpbmcgc3R1ZmYgdG8gbm90IHJlZmVyIHRvIGEKLQlub24tZXhpc3RlbnQgaXRlbS4KLQotCSogZWNvZmYuaCAoZWNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQWNjZXB0IE1JUFNfTUFHSUNfTElUVExFMgotCWFuZCBNSVBTX01BR0lDX0JJRzIuCi0KLVRodSBTZXAgMjMgMTE6MDY6MzQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBnZW4tYW91dC5jIChtYWluKTogT3V0cHV0IG5ld2xpbmUgYWZ0ZXIgZW5kIG9mIGNvbW1lbnQsIG5vdAotCWJlZm9yZS4gIChSZXBvcnRlZCBieSBKb25hdGhhbiBTdG9uZSwKLQlqb25hdGhhbkBvc2Nhci5zdGFuZm9yZC5lZHUpLgotCi1UaHUgU2VwIDIzIDEwOjQ4OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChjb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFB1dCB3ZWFrIHN5bWJvbHMgaW4gdGhlCi0JYXJtYXAuCi0KLQkqIGVsZmNvZGUuaCAoZml4X3VwX3N0cnRhYnMpOiBTZXQgc2hfZW50c2l6ZSBmb3IgdGhlIC5zdGFiCi0Jc2VjdGlvbiwgbm90IHRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgU2V0IHRoZSB0eXBlIG9mIHRoZSAuc3RhYnN0cgotCXNlY3Rpb24gdG8gU0hUX1NUUlRBQi4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IEhhbmRsZSBTSFRfU1RSVEFCIHNlY3Rpb25zLgotCi0JKiBzZWN0aW9uLmMgKFNFQ19ERUJVR0dJTkcpOiBOZXcgc2VjdGlvbiBmbGFnLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiBzZWN0aW9uIGlzIFNIVF9QUk9HQklUUywKLQlhbmQgdGhlIG5hbWUgc3RhcnRzIHdpdGggLmRlYnVnLCAubGluZSBvciAuc3RhYiwgc2V0Ci0JU0VDX0RFQlVHR0lORy4gIElmIFNIVF9TVFJUQUIsIGNoZWNrIGZvciAuZGVidWcgYW5kIC5zdGFiLgotCSogZWxmMzItdGFyZ2V0LmggKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkCi0JU0VDX0RFQlVHR0lORyB0byBzZWN0aW9uX2ZsYWdzLgotCSogZWxmNjQtdGFyZ2V0LmggKFRBUkdFVF9CSUdfU1lNLCBUQVJHRVRfTElUVExFX1NZTSk6IEFkZGVkCi0JU0VDX0RFQlVHR0lORyBhbmQgU0VDX0NPREUgdG8gc2VjdGlvbl9mbGFncy4KLQkqIGJmZC1pbjIuaDogVXBkYXRlZC4KLQotV2VkIFNlcCAyMiAxNjozNDoxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jICh0ZGF0YSk6IEFkZCBseW54X2NvcmVfZGF0YS4KLQotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2V0IGZpbGVwb3MgZm9yCi0Jc2VjdGlvbnMgd2l0aCBTRUNfTE9BRCBzZXQsIGV2ZW4gaWYgU0VDX0hBU19DT05URU5UUyBpcyBjbGVhci4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3Qgc2V0IHNjbnB0ciB0byB6ZXJvIGp1c3QKLQliZWNhdXNlIHNpemUgb2Ygc2VjdGlvbiBpcyB6ZXJvLiAgTmVlZGVkIGZvciBJcml4IDQuMC41Ri4KLQotV2VkIFNlcCAyMiAwOTo0OTozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZDogVXNlIGk5NjAtYm91dCwgbm90IGk5NjAtY29mZiBmb3IgaTk2MC0qLW5pbmR5Ki4KLQotV2VkIFNlcCAyMiAwNzozNDowOSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoT1BUSU9OQUxfQkFDS0VORFMpOiAgQWRkIGx5bngtY29yZS5vLgotCSogYmZkLWluMi5oICh0ZGF0YSk6ICBBZGQgbHlueF9jb3JlX2RhdGE7Ci0JKiBjb25maWcuYmZkIGNvbmZpZ3VyZS5ob3N0OiAgR2V0IHJpZCBvZiBzdXBlcmZsdW91cyBuZXRic2QgYW5kCi0JbHlueG9zIGVudHJpZXMuCi0JKiBjb25maWd1cmUuaW46ICBBZGQgbHlueC1jb3JlLm8gdG8gTHlueCBjb25maWcuCi0JKiBpMzg2bHlueC5jOiAgQWRkIGRlZnMgZm9yIGNvcmUgZmlsZSBzdXBwb3J0LgotCSogbHlueC1jb3JlLmM6ICBOZXcgZmlsZSB3aXRoIEx5bnggY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBob3N0cy9pMzg2bHlueC5oOiAgTW92ZSBsb3RzIG9mIGhvc3Qgc3BlY2lmaWMgaW5jbHVkZXMgdG8gaGVyZS4KLQlBZGQgZGVmIG9mIEhPU1RfTFlOWC4gIFJlbW92ZSB1bm5lY2Vzc2FyeSBkZWZzLgotCi1Nb24gU2VwIDIwIDE5OjE4OjEwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBPbmx5IHNldCBTRUNfREFUQSBmb3IgYQotCVNIRl9QUk9HQklUUyBvciBTSFRfU1RSVEFCIHNlY3Rpb24gaWYgU0VDX0FMTE9DIGlzIHNldC4gIE5ldmVyIHNldAotCVNFQ19EQVRBIGZvciBhIFNIRl9OT0JJVFMgc2VjdGlvbi4KLQotCSogbmxtMzItaTM4Ni5jIChubG1faTM4Nl9tYW5nbGVfcmVsb2NzKTogQ2hlY2sgU0VDX0xPQUQgcmF0aGVyCi0JdGhhbiBTRUNfQ09ERSB8IFNFQ19EQVRBLiAgQWRkIHNvbWUgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0JKiBubG1jb2RlLmg6IEFkZCBzb21lIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWdub3JlIHJlbG9jcyBmb3Igc2VjdGlvbnMgdGhhdCBhcmUKLQluZWl0aGVyIGNvZGUgbm9yIGRhdGEuICBKdXN0IHVzZSB0aGUgc3ltYm9sIHZhbHVlIGZvciBkZWJ1Z2dpbmcKLQlzeW1ib2xzOyBkb24ndCBvZmZzZXQgYnkgdGhlIHNlY3Rpb24gdm1hLgotCi1GcmkgU2VwIDE3IDE4OjA4OjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IHJldHVybiBhbiBlcnJvciB3aGVuCi0JcGVyZm9ybWluZyBhIHJlbG9jIGFnYWluc3QgYW4gdW5kZWZpbmVkIHdlYWsgc3ltYm9sLgotCSogc3ltcy5jIChiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmKTogU2hvdyB2YWx1ZSBvZiBCU0ZfV0VBSyByYXRoZXIKLQl0aGFuIG9ic29sZXRlIEJTRl9FWFBPUlQuCi0KLUZyaSBTZXAgMTcgMDI6MDQ6MzEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3thbHBoYW9zZi5oLCBhbWl4LmgsIGFwb2xsbzY4LmgsIGFwb2xsb3Y2OC5oLAotCWRlY3N0YXRpb24uaCwgZGVsdGE4OC5oLCBkZ3V4LmgsIGRvc2UuaCwgZ28zMi5oLCBoYXJyaXMuaCwKLQlocDMwMC5oLCBocDMwMGJzZC5oLCBocHBhYnNkLmgsIGhwcGFocHV4LmgsIGkzODZhaXguaCwgaTM4NmJzZC5oLAotCWkzODZsaW51eC5oLCBpMzg2bHlueC5oLCBpMzg2di5oLCBpMzg2djQuaCwgaXJpeDMuaCwgaXJpeDQuaCwKLQltaXBzYnNkLmgsIG5jcjMwMDAuaCwgcnM2MDAwLmgsIHJ0YnNkLmgsIHNvbGFyaXMyLmgsIHNwYXJjLWxsLmgsCi0Jc3RkLWhvc3QuaCwgc3RyYXR1cy5oLCBzdW4zLmgsIHN5c3Y0LmgsIHRhaG9lLmgsIHVsdHJhMy5oLAotCXZheHVsdC5oLCB2YXh1bHQyLmgsIHdlMzJrLmh9OiAgTWFrZSBzdXJlIHRoYXQgIm9mZnNldG9mIiBpcwotCWRlZmluZWQgb24gYWxsIGhvc3RzLCBub3cgdGhhdCBhcmNoaXZlLmMgdXNlcyBpdC4KLQotVGh1IFNlcCAxNiAxODoyMDozMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogQ3JlYXRlIHNlY3Rpb24gc3ltYm9scyBmb3IgYWxsCi0Jc2VjdGlvbnMsIG5vdCBqdXN0IGFsbG9jYXRlZCBzZWN0aW9uczsgZGVidWdnaW5nIHNlY3Rpb25zIGNhbiBoYXZlCi0JcmVsb2NzLgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IElmIHRoZXJlIGlzIGFuIG91dHB1dCBzZWN0aW9uLCB1c2UKLQl0aGUgc2VjdGlvbiBpbmRleCBmcm9tIHRoYXQgcmF0aGVyIHRoYW4gdGhlIGlucHV0IHNlY3Rpb24uCi0KLVRodSBTZXAgMTYgMTI6MjA6NTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChiZmRfZmx1c2gsIGJmZF9zdGF0KTogUmVmbGVjdCBKb2huJ3MgY2hhbmdlcyB0bwotCWxpYmJmZC5oLCB3aGljaCBpcyByZWdlbmVyYXRlZCBmcm9tIHRoaXMgZmlsZS4KLQotCSogYmZkLWluLmggKHN5bXR5cGUpOiBEZWxldGVkIHR5cGVkZWYuCi0KLVdlZCBTZXAgMTUgMTE6NDg6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQuYyAoQ09FUkNFeHgpOiBDYXN0IHggdG8gYmZkX3NpZ25lZF92bWEgYmVmb3JlIGRvaW5nIHRoZQotCXhvciBhbmQgc3VidHJhY3QuICBPdGhlcndpc2UgaXQgd2lsbCBub3Qgc2lnbiBleHRlbmQgaWYgdGhlIHR5cGUKLQlvZiBiZmRfdm1hIGlzIGxhcmdlciB0aGFuIGludC4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luKTogR2V0IHJlZ29mZnNldCwgaW9wdCwgZnJlZ29mZnNldAotCWFuZCBmcmFtZW9mZnNldCBhcyBzaWduZWQgbnVtYmVycy4gIEZyb20gUGV0ZXIgU2NoYXVlci4KLQotVHVlIFNlcCAxNCAxODoyMDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogQWRkIGJmZF9lbGZfZ2VuZXJpY19yZWxvYwotCXNwZWNpYWwgZnVuY3Rpb24gZm9yIGFsbCByZWxvYyBlbnRyaWVzLgotCSogZWxmMzItdGFyZ2V0LmggKFRBUkdFVF9MSVRUTEVfU1lNKTogQWRkIFNFQ19DT0RFIHRvCi0Jc2VjdGlvbl9mbGFncy4KLQkqIGxpYmVsZi5oIChlbGZfc3ltYm9sX3R5cGUpOiBSZW1vdmUgZGVzYywgdHlwZSBhbmQgb3RoZXIgZmllbGRzLgotCSogTWFrZWZpbGUuaW4gKGVsZjMyLSoubyk6IFRoZXNlIGRlcGVuZCB1cG9uIGVsZjMyLXRhcmdldC5oLgotCi1UdWUgU2VwIDE0IDE0OjM0OjQ1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChzdHJ1Y3QgYXJ0ZGF0YSk6ICBBZGQgYXJtYXBfdGltZXN0YW1wIGFuZAotCWFybWFwX2RhdGVwb3MgaGVyZSB0b28uCi0KLU1vbiBTZXAgMTMgMjE6MDM6MTggMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGNhY29waG9ueS5jeWdudXMuY29tKQotCi0JSW1wcm92ZSB0aW1lc3RhbXAgc3VwcG9ydCBpbiBCU0QgYXJjaGl2ZSBmaWxlcyB0byBhdm9pZCBsaW5rZXIKLQl3YXJuaW5ncy4KLQotCSogbGliYmZkLmggKHN0cnVjdCBhcnRkYXRhKTogIEFkZCBhcm1hcF90aW1lc3RhbXAgYW5kIGFybWFwX2RhdGVwb3MuCi0JKGJmZF9mbHVzaCwgYmZkX3N0YXQpOiAgQWRkIHByb3RvdHlwZXMuCi0JKiBsaWJiZmQuYyAoYmZkX2ZsdXNoKTogIEFkZCwgZG9lcyBmZmx1c2ggb24gYSBCRkQuCi0JKGJmZF9zdGF0KTogIEFkZCwgZG9lcyBmc3RhdCBvbiBhIEJGRC4KLQotCSogYXJjaGl2ZS5jIChfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBBdCBlbmQgb2YgZmlsZSB3cml0aW5nLAotCXZlcmlmeSBhbmQgcG9zc2libHkgdXBkYXRlIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGFybWFwLCBpZiBhIEJTRAotCWFyY2hpdmUuICBGSVhNRSEgIEtsdWRnZSByZWNvZ25pemVzIEJTRCBhcmNoaXZlLCByYXRoZXIgdGhhbgotCXZlY3RvcmluZyBwcm9wZXJseS4gIFNob3VsZCBhZGQgdG8geHZlYy4KLQkoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiAgTW92ZSBwcm90b3R5cGUgdG8gdG9wLCBhdm9pZCBQUk9UTy4KLQkoYnNkX3dyaXRlX2FybWFwKTogU2F2ZSB0aW1lc3RhbXAgYW5kIGZpbGUgbG9jYXRpb24gdGhlcmVvZiwgd2hlbgotCXdyaXRpbmcgdGhlIGFybWFwIGluIGEgQlNEIGZpbGUuCi0JKGJzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogIE5ldyBmdW5jdGlvbiB0byBjaGVjayBhbmQKLQlyZXdyaXRlIHRoZSB0aW1lc3RhbXAuCi0KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKG9mZnNldG9mKTogIERlZmluZSwgaWYgbm90IGFscmVhZHksIGZvciBhcmNoaXZlLmMuCi0KLVNhdCBTZXAgMTEgMTg6MTM6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZzY28uaDogRGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYgZm9yIGNvcmUgZmlsZXMuCi0JKiBzY28tY29yZS5jOiBSZW1vdmUsIHJlcGxhY2UgYnkgdHJhZC1jb3JlLmMuCi0JKiB0cmFkLWNvcmUuYzogSWYgSE9TVF9TVEFDS19TVEFSVF9BRERSIGlzIGRlZmluZWQsIHVzZSBpdC4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oOiBVc2UgdHJhZC1jb3JlIG5vdCBzY28tY29yZS4KLQkqIGhvc3RzL2kzODZpc2MuaCwgY29uZmlnL2kzODZpc2MubWg6IFJlbW92ZS4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgaTM4NnNjbyBmb3IgaXNjLgotCSogY29uZmlnL2kzODYtc2NvLm10OiBSZW1vdmUsIGlkZW50aWNhbCB0byBpMzg2LWNvZmYubXQuCi0JKiBjb25maWcuYmZkOiBVc2UgaTM4Ni1jb2ZmIG5vdCBpMzg2LXNjby4KLQotCSogY29uZmlnLmJmZDogUmVjb2duaXplIGlbMzRdODYtKi1zb2xhcmlzMiogc3BlY2lmaWNhbGx5IHJhdGhlcgotCXRoYW4gdXNpbmcgKi0qLXNvbGFyaXMyKiAoaTQ4Ni11bmtub3duLXNvbGFyaXMyIGlzIGkzODYtZWxmLCBub3QKLQlpNDg2LWVsZiB3aGljaCBkb2Vzbid0IGV4aXN0KS4KLQotRnJpIFNlcCAxMCAxMjo1NjozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IEZvciBBTFBIQUVDT0ZGLCBmb3JjZQotCXBhZGRpbmcgZmllbGQgdG8gemVyby4KLQotCSogY29uZmlnLmJmZCAoaVszNF04Ni0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0OyB1c2UgaTM4Ni1uZXRic2QuCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBib2d1cyBuZXRic2QzODYgaGFuZGxpbmcuCi0KLQkqIGNvZmYtbWlwcy5jOiBEb24ndCB3YXJuIGFib3V0IG92ZXJmbG93IGZvciBNSVBTX1JfSk1QQUREUiByZWxvYy4KLQlDb3JyZWN0IG92ZXJmbG93IGRldGVjdGlvbiByZXF1aXJlcyBtYXRjaGluZyB0aGUgdXBwZXIgZm91ciBiaXRzCi0Jb2YgdGhlIGRlc3RpbmF0aW9uIGFnYWluc3QgdGhlIFBDLgotCi1UaHUgU2VwICA5IDE2OjU3OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBNYWtlIDY0LWJpdCBzdHVmZiB3b3JrIHdpdGggIi0td2l0aC10YXJnZXRzPWFsbCIuCi0KLVR1ZSBTZXAgIDcgMTQ6MTc6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJiZmQtaW4uaDogUmVtb3ZlZCBzd2FwcGluZyByb3V0aW5lcyBkZWNsYXJhdGlvbnMuCi0JKiBiZmQtaW4uaDogQWRkZWQgc3dhcHBpbmcgcm91dGluZSBkZWNsYXJhdGlvbnMsIGFuZCByZW5hbWVkIHRoZW0KLQlmcm9tIF9kb18qIHRvIGJmZF8qLgotCSogbGliYmZkLmM6IFJlbmFtZWQgc3dhcHBpbmcgcm91dGluZXMgZnJvbSBfZG9fKiB0byBfYmZkXyouCi0JKiBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVidWlsdC4KLQotTW9uIFNlcCAgNiAxNToyODowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2hvd3RvX3RhYmxlKTogU2V0IHBjcmVsX29mZnNldCB0byB0cnVlIGZvcgotCVJfMzg2X1BDMzIuCi0KLUZyaSBTZXAgIDMgMTM6MDY6MTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlb3JnYW5pemVkIHNldHRpbmcgb2YgbWFrZWZpbGUgdmFyaWFibGVzIHNvCi0JNjQtYml0IHN0dWZmIHdvcmtzIGFnYWluLgotCi0JKiBsaWJiZmQtaW4uaCAoX2RvX2dldCosIF9kb19wdXQqKTogUmVuYW1lZCB2aWEgbWFjcm9zIHRvIGNsZWFuIHVwCi0JbmFtZXNwYWNlLgotCi0JKiBsaWJlbGYuaCAoZWxmMzJfc3ltYm9sX3R5cGUsIGVsZjY0X3N5bWJvbF90eXBlKTogRGVsZXRlZAotCSJuYXRpdmVfZWxmX3N5bSIgZmllbGQsIG1lcmdlZCB0byBtYWtlIG5ldyB0eXBlICJlbGZfc3ltYm9sX3R5cGUiLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEZpZWxkIHN5bWJvbHMgaXMgbm93IGVsZl9zeW1ib2xfdHlwZSouCi0JRGVsZXRlZCBmaWVsZCByYXdfc3ltcy4KLQkob2JqX3N5bWJvbHMpOiBSZW1vdmUgY2FzdC4KLQkob2JqX3Jhd19zeW1zKTogRGVsZXRlZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHNldCByYXdfc3ltcyBvcgotCW5hdGl2ZV9lbGZfc3ltIGZpZWxkcy4KLQkqIGVsZjMyLWhwcGEuYzogQ2hhbmdlZCB1c2VzIG9mIGVsZjMyX3N5bWJvbF90eXBlIHRvCi0JZWxmX3N5bWJvbF90eXBlLgotCi0JRnJvbSBQZXRlIEhvb2dlbmJvb20gYW5kIEplZmYgTGF3OgotCi0JKiBlbGYzMi1ocHBhLmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV90Y19zeW1ib2wpOiBJZiB0aGUgYXJndW1lbnQgcmVsb2NhdGlvbgotCWJpdHMgYXJlIHplcm8gKGUuZy4sIHRoZXkgc3BlY2lmeSBubyByZWxvY2F0aW9ucyksIHRoZW4gZG8gbm90Ci0JZXZlbiBib3RoZXIgYWRkaW5nIHRoZWlyIGVudHJpZXMgdG8gdGhlIHN5bWV4dG4gc2VjdGlvbi4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV90Y19zeW1ib2wpOiBBbnkgZnVuY3Rpb24sIHJlZ2FyZGxlc3MKLQlvZiBzY29wZSBjYW4gaGF2ZSBhbiBhcmd1bWVudCByZWxvY2F0aW9uIHN0dWIuCi0KLQkqIGVsZjMyLWhwcGEuYzogKEVsZjMyX2hwcGFfU3R1Yl9kZXNjcmlwdGlvbik6ICBSZW5hbWUgdGhpcwotCXN0cnVjdHVyZSBhbmQgdHlwZSB0byBlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24uICBUaGlzIG1ha2VzCi0JaXQgY29uc2lzdGVudCB3aXRoIHRoZSBHTlUgY29kaW5nIGNvbnZlbnRpb25zLgotCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBhICduZXh0JyBmaWVsZCB0byBhbGxvdwotCWxpbmtpbmcgb2Ygc3R1YiBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmVzLgotCShlbGYzMl9ocHBhX3N0dWJfZGVzY3JpcHRpb24pOiBBZGRlZCBhICdzdHViX2xpc3RQJyBmaWVsZCB0bwotCWtlZXAgdHJhY2sgb2YgaW5kaXZpZHVhbCBzdHVicy4KLQkoRWxmMzJfaHBwYV9TdHViX2xpc3QsIEVsZjMyX2hwcGFfU3R1Yl9saXN0X3N0cnVjdCk6ICBSZW1vdmVkLgotCUNvbWJpbmVkIHdpdGggdGhlIGVsZjMyX2hwcGFfc3R1Yl9kZXNjcmlwdGlvbiBzdHJ1Y3R1cmUuCi0JKGVsZjMyX2hwcGFfc3R1Yl9uYW1lX2xpc3QpOiAgTmV3IHR5cGUgdG8ga2VlcCB0cmFjayBvZgotCWluZGl2aWR1YWwgc3R1YnMuCi0JKGFkZF9zdHViKTogIFJlbW92ZWQuCi0JKGFkZF9zdHViX2J5X25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbmRfc3R1Yl9ieV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IEFsbG93IHJldXNpbmcgc3R1YnMgdGhhdAotCWFscmVhZHkgZXhpc3QuCi0JKGhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiBBbGxvdyByZXVzaW5nIHN0dWJzIHRoYXQKLQlhbHJlYWR5IGV4aXN0LgotCi0JKiBlbGYzMi1ocHBhLmM6IChyZXR2YWxfbWlzbWF0Y2hlcyk6ICBUaGUgZGlyZWN0aW9uIG9mIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiB3YXMgcmV2ZXJzZWQuCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogUmV0dXJuIGFkZHJlc3Mgd2FzIG5vdCBiZWluZwotCXJlc3RvcmVkLgotCShocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3ApOiBBZGQgYXJndW1lbnQgY29udGFpbmluZyBjYWxsZXIKLQlhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgc28gdGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiB0aGUgY2hlY2sKLQlmb3IgcGxhYmVsIHN0dWJzLgotCShocHBhX2VsZl9zdHViX2NoZWNrKTogUGFzcyBjYWxsZXIgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGludG8KLQlocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3AoKS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogQWRkIGNoZWNrIGZvciBwbGFiZWwgc3R1YnMgYW5kCi0JcGFzcyBjYWxsZXIgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzIGludG8KLQlocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3AoKS4KLQotVGh1IFNlcCAgMiAwMDo1OTo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChocHBhX2ZpZWxkX2FkanVzdCk6IFJlbW92ZSB1bnVzZWQgYGluaXRfdmFsdWUnIHZhcmlhYmxlLgotCi0JKiBob3N0cy9kZWx0YTg4djQuaDogTmV3IGZvciBTVlI0LgotCSogY29uZmlndXJlLmhvc3RzOiBVc2UgaXQuCi0KLVdlZCBTZXAgIDEgMTQ6MjM6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCwgbmV0YnNkMzg2LmM6IENoYW5nZSBNX0kzODYgdG8gTV8zODZfTkVUQlNELiAgTV9JMzg2Ci0JaXMgYW4gU0NPIHByZS1kZWZpbmUuCi0KLVR1ZSBBdWcgMzEgMTI6NTA6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IFNldCBIQVNfU1lNUyBpZiB0aGVyZSBhcmUgZXh0ZXJuYWwKLQlyZWZlcmVuY2VzLgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc197aW4sb3V0fSk6IFRoZSBjb3B5cmlnaHQgbGVuZ3RoIGlzCi0Jb25seSBvbmUgYnl0ZS4KLQkobmxtX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBJbmNsdWRlIGRlYnVnZ2luZyBzeW1ib2xzIGluIHN5bWJvbAotCWNvdW50LgotCShubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogTWFrZSBzeW1sZW5ndGggdW5zaWduZWQuICBSZWFkIGRlYnVnZ2luZwotCXN5bWJvbHMgYXMgQkZEIGxvY2FsIHN5bWJvbHMuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBib3RoZXIgd3JpdGluZyBvdXQgZXhwb3J0ZWQKLQlzeW1ib2xzIG1vcmUgdGhhbiBvbmNlOyB0aGV5IG5vdyBhcHBlYXIgaW4gdGhlIHN5bWJvbCB0YWJsZSBtb3JlCi0JdGhhbiBvbmNlICh3aXRoIGFuZCB3aXRob3V0IGEgcHJlZml4KSBpZiBuZWNlc3NhcnkuICBTZXQgb2Zmc2V0Ci0JdmFsdWVzIHRvIGJlIG5vbi16ZXJvIGFzIE5MTUxJTksgZG9lcy4KLQotVHVlIEF1ZyAzMSAxMjowNzo0MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oOiBSZXN0b3JlICN1bmRlZnMgb2YgZV9mc2VsIGFuZCBvdGhlciBlXyogc3ltYm9scy4KLQotRnJpIEF1ZyAyNyAxNjo0MzozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IHNlYyk6IE1vdmUgcG9zaXRpb24gb2YgdXNlcl9zZXRfdm1hLCBhbmQKLQlkb2N1bWVudCBpdC4KLQkoU0VDX0JBTElHTik6IERpc2FibGUgZm9yIG5vdy4gIEkgZG9uJ3QgdGhpbmsgaXQncyBjdXJyZW50bHkgdXNlZC4KLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9ob3d0b190YWJsZSk6IE5vdyBzdGF0aWMuCi0JKHN5bWV4dF9yb290UCwgc3ltZXh0X2xhc3RQLCBnbG9iYWxfdmFsdWUsIEdPVF92YWx1ZSwKLQlnbG9iYWxfc3ltYm9sLCBnbG9iYWxfc3ltX2RlZmluZWQsIHN5bWV4dG5fY29udGVudHMsCi0Jc3ltZXh0bl9jb250ZW50c19yZWFsX3NpemUsIGVsZl9ocHBhX3N0dWJfcm9vdFAsCi0JZWxmMzJfaHBwYV9zeW1leHRuX21hcCwgZWxmMzJfaHBwYV9zeW1leHRuX21hcF9zaXplKTogUmVseSBvbgotCWRlZmF1bHQgaW5pdGlhbGl6YXRpb24uCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogTWFjcm8gIlVOREVGSU5FRCIgZG9lc24ndCBuZWVkIGEKLQl0cmFpbGluZyBzZW1pY29sb24uCi0JKGhwcGFfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IEludHJvZHVjZSB0ZW1wb3JhcmllcyB0byBtYWtlCi0JY29kZSBtb3JlIHJlYWRhYmxlIGluIDgwIGNvbHVtbnMuCi0KLQkqIGxpYmhwcGEuaCAoYWxsIGZ1bmN0aW9ucyk6IE5vdyBpbmxpbmUgdW5kZXIgR05VIEMuCi0KLQlNb3JlIHBhdGNoZXMgZnJvbSBKZWZmIExhdzoKLQotCSogZWxmMzItaHBwYS5jIChBUl9XQVJOKTogR2l2ZSBhcmd1bWVudCB3aGljaCBjYXVzZWQgdGhlCi0JaW52YWxpZCBhcmd1bWVudCByZWxvY2F0aW9uLgotCShBUl9VTklNUCk6IERlbGV0ZSB1bnVzZWQgbWFjcm8uCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfdGFibGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nOiBMaWtld2lzZS4KLQotCSogc29tLmM6IE5ldyBmaWxlIGNvbnRhaW5pbmcgU09NIHNwZWNpZmljIGNvZGUgZXh0cmFjdGVkCi0JZnJvbSBocHBhLmMKLQotCSogc29tLmg6IE5ldyBmaWxlIGNvbnRhaW5pbmcgU09NIHNwZWNpZmljIGNvZGUgZXh0cmFjdGVkCi0JZnJvbSBsaWJocHBhLmgKLQotCSogaHBwYS5jOiBEZWxldGVkLgotCi0JKiBsaWJocHBhLmg6IERlbGV0ZSBTT00gc3BlY2lmaWMgY29kZS4gIEFkZCBnZW5lcmljIFBBCi0JY29kZSB3aGljaCBjYW4gYmUgc2hhcmVkIGJ5IGJvdGggU09NIGFuZCBFTEYgYmFja2VuZHMuCi0KLQkqIE1ha2VmaWxlLmluOiBSZXBsYWNlIGhwcGEuYyB3aXRoIHNvbS5jLiAgZWxmMzItaHBwYS5vCi0JZGVwZW5kcyBvbiBsaWJocHBhLmggbm93LgotCi0JKiBjb25maWd1cmUuaW4gKGhwcGFfdmVjKTogTmVlZHMgc29tLm8gbW9kdWxlIGluc3RlYWQgb2YKLQlocHBhLm8uCi0KLQkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBsaWJocHBhLmguICBEbyBub3QgZGVmaW5lCi0JQllURVNfSU5fV09SRC4KLQotCSogZWxmMzItaHBwYS5oIChocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUpOiBEZWxldGUKLQlub3cgbGl2ZXMgaW4gbGliaHBwYS5oLgotCShocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0KTogTGlrZXdpc2UuCi0KLQkqIGhvc3RzL2hwcGFic2QuaDogSW5jbHVkZSA8c3RkbGliLmg+IGFuZCA8dW5pc3RkLmg+LiAgRG8gbm90Ci0JZGVmaW5lIG1hbGxvYyBvciBmcmVlLgotCi0JKiBjb25maWcvaHBwYS1lbGYubXQgKFNFTEVDVF9BUkNISVRFQ1RVUkVTKTogRG9uJ3QgZGVmaW5lCi0JU0VMRUNUX1ZFQ1MuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfdW53aW5kX3RhYmxlKTogRGVsZXRlIHVudXNlZAotCXZhcmlhYmxlcy4KLQkoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCShocHBhX2VsZl9hcmdfcmVsb2NfbmVlZGVkX3ApOiBMaWtld2lzZS4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IExpa2V3aXNlLgotCShlbGZfcmVsb2NfbWFwKTogRGVsZXRlLCBubyBsb25nZXIgdXNlZC4KLQkoZWxmX2hwcGFfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfc3ltZXh0bl9tYXBfbWF4X3NpemUpOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9nZXRfc3ltX2V4dG4pOiBBYm9ydCBpZiB0eXBlIGlzIGJvZ3VzLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmFja2VuZF9mYWtlX3NlY3Rpb25zKTogQWRkIHByb2Nlc3NpbmcKLQlvZiB0aGUgLmhwcGFfdW53aW5kIHNlY3Rpb24uCi0KLVdlZCBBdWcgMjUgMTY6MTM6NDkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiByZWNvZ25pemUgbTg4MTEwLgotCi1UdWUgQXVnIDI0IDE2OjMyOjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gSmVmZiBMYXcgYW5kIFBldGUgSG9vZ2VuYm9vbSBhdCBVdGFoOgotCi0JKiBlbGZjb2RlLmggKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBBZGQgZGV0ZWN0aW9uIG9mCi0JU0hUX05PVEUgc2VjdGlvbnMuCi0KLQkqIGVsZjMyLWhwcGEuYzoKLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1YixocHBhX2VsZl9sb25nX2JyYW5jaF9uZWVkZWRfcCk6Ci0JTmV3IGZ1bmN0aW9ucyBmb3Igc3VwcG9ydCBvZiBsb25nIGJyYW5jaCBzdHVicy4KLQkoaHBwYV9lbGZfc3R1Yl9jaGVjayxocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiAgQWRkCi0JY2hlY2sgZm9yIGxvbmcgYnJhbmNoIHN0dWJzLgotCShocHBhX2xvb2tfZm9yX3N0dWJzKTogIFVudXNlZCBmdW5jdGlvbi4gIFJlbW92ZWQuCi0JKGhwcGFfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSW1wbGVtZW50IGEgUEEvRUxGLXNwZWNpZmljCi0JdmVyc2lvbiBvZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMuCi0JKGhwcGFfZWxmX2xvbmdfYnJhbmNoX25lZWRlZF9wKTogT25seSBvdXRwdXQgZGVidWdnaW5nIGRpYWdub3N0aWNzCi0Jd2hlbiBCRkQgaXMgY29uZmlndXJlZCBmb3IgZGVidWdnaW5nLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGYzMl9ocHBhX2dldF9zeW1leHRuX2NoYWluKTogIE5ldyBmdW5jdGlvbgotCXRvIHJldHVybiBhIGxpc3Qgb2Ygc3ltYm9scyB0aGF0IGhhdmUgbm9uLXplcm8gYXJndW1lbnQKLQlyZWxvY2F0aW9uIGJpdHMuCi0JKGhwcGFfZWxmX3N0dWJfZmluaXNoKTogTWFrZSBzdXJlIHN0dWIgZ2VuZXJhdGlvbiBpcyBkb25lIG9ubHkKLQlvbmNlLgotCi0JKiBlbGYzMi1ocHBhLmM6IChocHBhX2VsZl9zdHViX3JlbG9jKTogIE5ldyBmdW5jdGlvbiBmb3IKLQlnZW5lcmF0aW9uIHJlbG9jYXRpb24gZW50cmllcyB3aXRoaW4gYSBzdHViLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IENvcnJlY3Rpb25zIHRvIGFyZ3VtZW50Ci0JcmVsb2NhdGlvbiBzdHVicy4KLQotCSogZWxmMzItaHBwYS5jOiBOZXcgI2RlZmluZSdzIGZvciBhcmd1bWVudCByZWxvY2F0aW9uIHR5cGVzLgotCShtaXNtYXRjaGVzLCByZXR2YWxfbWlzbWF0Y2hlcyk6IFVwZGF0ZWQgdG8gcmVmbGVjdCBuZXcKLQlhcmd1bWVudCByZWxvY2F0aW9uIHR5cGVzLgotCShDVVJSRU5UX1NUVUJfT0ZGU0VUKTogTmV3IG1hY3JvLgotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogU2V0IHRoZSBQRl9YIGJpdCBmb3IgZGF0YQotCXNlZ21lbnRzLgotCi0JKiBlbGYzMi1ocHBhLmM6IChlbGZfaHBwYV9ob3d0b190YWJsZSk6IEFkZAotCVJfSFBQQV9TVFVCX0NBTExfMTcgZm9yIHN1cHBvcnQgb2YgbGlua2VyIHN0dWIgZ2VuZXJhdGlvbi4KLQkoaHBwYV9lbGZfcmVsb2MpOiBBZGQgc3VwcG9ydCBvZiBSX0hQUEFfU1RVQl9DQUxMXzE3Ci0JcmVsb2NhdGlvbiB0eXBlLgotCi0JKiBlbGYzMi1ocHBhLmg6IChlbGYzMl9ocHBhX3JlbG9jX3R5cGUpOiBBZGQKLQlSX0hQUEFfU1RVQl9DQUxMXzE3IGZvciBzdXBwb3J0IG9mIGxpbmtlciBzdHViIGdlbmVyYXRpb24uCi0KLQkqIGhwcGFfc3R1YnMuaDogQWRkIG5ldyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiBsaW5rZXIKLQlzdHViIGdlbmVyYXRpb24uCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfdW53aW5kX3RhYmxlKTogVGhlIG9mZnNldHMgaW4gYW4KLQl1bndpbmQgZGVzY3JpcHRvciB3ZXJlIGluY29ycmVjdC4KLQotCSogbGliZWxmLmggKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogRGVjbGFyZS4KLQotCSogZWxmMzItaHBwYS5jOiAoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKTogIE5ldwotCWZ1bmN0aW9uIGluIHBsYWNlIG9mIGdsb2JhbF9zeW0gZmllbGQgaW4gZWxmX2JhY2tlbmRfZGF0YQotCXN0cnVjdHVyZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nLAotCWVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMsCi0JZWxmMzJfaHBwYV9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotCWVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiAgTmV3IGZ1bmN0aW9ucyB0bwotCXByb3ZpZGUgc3VwcG9ydCBvZiBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zIGFuZCBhcmd1bWVudAotCXJlbG9jYXRpb24gc3R1YnMuCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogIFJlbW92ZSBjYWxsIHRvIGFib3J0KCkuCi0KLQkqIGVsZjMyLXRhcmdldC5oOiAgU3VwcG9ydCBmb3Igc3BlY2lhbCBwcm9jZXNzaW5nIGJ5IHRoZSBiYWNrZW5kLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6ICBBZGRlZCBlbGZfYmFja2VuZF9zeW1ib2xfcHJvY2Vzc2luZywKLQllbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLQllbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotCWVsZl9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMsIGFuZAotCWVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiBmaWVsZHMuCi0JKiBlbGZjb2RlLmg6IChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBBZGQgYSBjaGVjayBmb3IKLQlwcm9jZXNzb3Itc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiAgQWRkIGEgY2hlY2sgZm9yIHByb2Nlc3Nvci1zcGVjaWZpYwotCXNlY3Rpb24gdHlwZXMuCi0JKGJmZF9lbGYzMl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgQWRkIGEgY2hlY2sgdG8gc2VlIGlmCi0JdGhlcmUgaXMgYW55IGZpbmFsIHNlY3Rpb24gcHJvY2Vzc2luZyB0byBiZSBkb25lIGJ5IHRoZQotCWJhY2tlbmQuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiAgQWRkIGEgY2hlY2sgZm9yCi0JcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiAgUmVtb3ZlIHJlZmVyZW5jZSB0byBnbG9iYWxfc3ltIGluIHRoZQotCWVsZl9iYWNrZW5kX2RhdGEgc3RydWN0dXJlLiAgUmVwbGFjZSBpdCB3aXRoIGEgY2FsbCB0bwotCWVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLgotCSogbGliZWxmLmg6IFJlbW92ZSBnbG9iYWxfc3ltIGZpZWxkIGluIHRoZSBlbGZfYmFja2VuZF9kYXRhCi0Jc3RydWN0dXJlLiAgUmVwbGFjZSBpdCB3aXRoIGEgc2VyaWVzIG9mIGJhY2tlbmQtc3BlY2lmaWMKLQlmdW5jdGlvbnMuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9icmFuY2hfcmVsb2MpOiBUaGUgZm9ybWFsIGFyZ3VtZW50Ci0Jc3R1Yl9zeW0gc2hvdWxkIGJlIGNhbGxlZCB0YXJnZXRfc3ltLgotCShocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1Yik6IFJlZmVyIHRvIHRoZSBzdHViIGJmZCAoYWJmZCkKLQlyYXRoZXIgdGhhbiB0aGUgb3V0cHV0IGJmZCAob3V0cHV0X2JmZCkuCi0JKGhwcGFfZWxmX3JlbG9jKTogR2V0IHJpZCBvZiByZWZlcmVuY2VzIHRvIHRoZSBnbG9iYWxfc3ltIGZpZWxkIGluCi0JdGhlIGVsZl9iYWNrZW5kX2RhdGEgc3RydWN0dXJlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9mYWtlX3NlY3Rpb25zKTogQ2hlY2sgdGhlIGNvcnJlY3QgY29uZGl0aW9uIGZvcgotCS5ic3MuICBBbHNvLCBkZXRlY3QgdGhlIGV4aXN0ZW5jZSBvZiBhIC5ub3RlIHNlY3Rpb24uCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfcmVsb2NhdGVfaW5zbik6IHJfZm9ybWF0IGFyZ3VtZW50IHNob3VsZAotCWhhdmUgYmVlbiByX2ZpZWxkLgotCi0JKiBob3N0cy9ocHBhYnNkLmggKEhPU1RfTUFDSElORV9BUkNIKTogUmVmZXJlbmNlIHRvIGJmZF9hcmNoX202OGsKLQlzaG91bGQgYmUgYSByZWZlcmVuY2UgdG8gYmZkX2FyY2hfaHBwYS4KLQotCSogaHBwYS5jIChocHBhX3ZlYyk6IFJlcGxhY2UgYmZkX2ZhbHNlIHdpdGggX2JmZF9kdW1teV90YXJnZXQgaW4KLQl0aGUgYmZkX2NoZWNrX2Zvcm1hdCBzdHJ1Y3R1cmUgdG8gYXZvaWQgYSB0eXBlIG1pc21hdGNoLgotCi1Nb24gQXVnIDIzIDE5OTMgIFNlYW4gRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQkJIGFuZCBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCUFkZCBOZXRCU0Qgc3VwcG9ydDoKLQkqIG5ldGJzZDM4Ni5jOiBOZXcgZmlsZS4KLQkqIGFvdXR4Lmg6IE1ha2Ugc3ltX2lzX2RlYnVnZ2VyX2luZm8gdHJ1ZSBmb3IgTl9GTi4KLQkqIE1ha2VmaWxlLmluLCBhb3V0LXRhcmdldC5oLCBjb25maWcuYmZkLCBjb25maWd1cmUuaG9zdCwgY29uZmlndXJlLmluLAotCWxpYmFvdXQuaCwgdGFyZ2V0cy5jOiBPdGhlciBjaGFuZ2VzLgotCi1GcmkgQXVnIDIwIDE3OjA0OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTg4ay1lbGYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZDogVXNlIGl0IGZvciBtODgqLSotc3lzdjQqLgotCi1GcmkgQXVnIDIwIDE1OjE2OjU4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChlbGZfYnVpbGRfcGhkcnMpOiBVbnVzZWQgZnVuY3Rpb24gZGVsZXRlZC4KLQkoYmZkX3NoZHJfZnJvbV9zZWN0aW9uKTogRGl0dG8uCi0JKHdyaXRlX3JlbG9jcyk6IERvbid0IGNoYW5nZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBhZGRlbmQuCi0JKGVsZl9sb2NhdGVfc2gpOiBSZXR1cm4gdHlwZSBpcyBub3cgYWx3YXlzIGVsZl9pbnRlcm5hbF9zaGRyLAotCXNpbmNlIHRoZSBvdGhlciB0eXBlcyB3ZXJlIHJlYWxseSBhbGlhc2VzIGZvciB0aGlzIHR5cGUgYW55d2F5cy4KLQlEb24ndCBjb21waWxlIHRoaXMgZnVuY3Rpb24sIHNpbmNlIGl0IGlzIHN0YXRpYyBhbmQgZG9lc24ndCBhcHBlYXIKLQl0byBiZSB1c2VkIGluIHRoaXMgZmlsZS4KLQkoc3ltX2lzX2dsb2JhbCk6IFJldHVybiBub24temVybyBmb3Igd2VhayBzeW1ib2xzLiAgQWJvcnQgaWYKLQlzZWN0aW9uIHBvaW50ZXIgaXMgbnVsbC4KLQkoc3dhcF9vdXRfc3ltcyk6IFJlb3JkZXIgdGVzdHMgc28gZnVuY3Rpb24gc3ltYm9scyBjYW4gYmUgd2Vhay4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHVzZSBCU0ZfRVhQT1JULgotCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogTWFrZSBSRUxPQ19QUk9DRVNTSU5HIHNlY3Rpb24gc21hbGxlciBieQotCWV4dHJhY3Rpbmcgb3V0IHNvbWUgY29tbW9uIGNvZGUuICBBYm9ydCBpZiBCRkQgc2VjdGlvbiBzeW1ib2wgaGFzCi0JbnVsbCBuYW1lLgotCShlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBUcmFuc2xhdGUgRUxGIHNlY3Rpb24gc3ltYm9scyBpbnRvIEJGRAotCXNlY3Rpb24gc3ltYm9scy4gIERvbid0IHJlYWQgc2VjdGlvbiBjb250ZW50cyB0byBmaWxsIGluIGFkZGVuZAotCWZpZWxkLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9ob3d0b190YWJsZSk6IEFsbCBwYXJ0aWFsX2lucGxhY2UgZmllbGRzCi0Jc2hvdWxkIGJlICJ0cnVlIi4KLQotCSogTWVyZ2VkIGZyb20gT1NGOgotCi0JVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogbGliZWxmLmggKHN0cnVjdCBFbGZfU3ltX0V4dHJhKTogTmV3IHN0cnVjdHVyZSB0byBjb250YWluIEVMRgotCXNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gIFB1dCBpbiBlbGZfc3ltX251bSwgd2hpY2gKLQlnaXZlcyB0aGUgZXh0ZXJuYWwgc3ltYm9sIG51bWJlciBpbiB0aGUgZWxmIG9iamVjdCBmaWxlLCBzaW5jZQotCWxvY2FsIHN5bWJvbHMgbXVzdCBjb21lIGJlZm9yZSBnbG9iYWwgc3ltYm9scy4KLQkoZWxmX3N5bV9leHRyYSk6IE5ldyBtYWNyby4KLQkoZWxmX3N5bXRhYl9tYXApOiBEZWxldGUsIGluIGZhdm9yIG9mIHVzaW5nIEVsZl9TeW1fRXh0cmEuCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IFVzZSBFbGZfU3ltX0V4dHJhIHRvIG1hcCBpbnRlcm5hbAotCXN5bWJvbCBudW1iZXIgdG8gZXh0ZXJuYWwgbnVtYmVyLiAgU3RvcmUgdGhlIGFkZHJlc3Mgb2YgdGhlCi0JRWxmX1N5bV9FeHRyYSBmaWVsZCBmb3IgdGhlIHN5bWJvbCBpbiB0aGUgdWRhdGEgZmllbGQuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgRWxmX1N5bV9FeHRyYSB0byBtYXAgb3V0IHN5bWJvbHMuCi0KLQlTdW4gSnVuIDIwIDE2OjMwOjExIDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGQgdG8gY291bnQgdGhlIHNpemUgb2YgdGhlCi0JYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2VjdGlvbiBzeW1ib2xzLgotCShlbGZfbWFwX3N5bWJvbHMpOiBCdW1wIHRoZSBtYXggaW5kZXggb2YgdGhlIHNlY3Rpb24gc3ltYm9scyBzbwotCXRoYXQgd2UgZG9uJ3Qgb3ZlcndyaXRlIG1lbW9yeS4gIFN0b3JlIHRoZSBtYXggaW5kZXggaW50byB0aGUKLQllbGZfb2JqX3RkYXRhIGZpZWxkLgotCi0JU2F0IEp1biAxOSAxMDoxMjoyNyAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfb2JqX3RkYXRhKTogQWRkIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcG9pbnRlcnMKLQl0byB0aGUgc2VjdGlvbiBzeW1ib2xzIHdlIGNyZWF0ZWQuICBSZW1vdmUgdW51c2VkIGZpZWxkCi0JaW50ZXJuYWxfc3ltcy4KLQkoZWxmX21hcF9zeW1ib2xzKTogRmlsbCBpbiBhcnJheSBvZiBwb2ludGVycyB0byBzZWN0aW9uIHN5bWJvbHMuCi0JT25seSBjcmVhdGUgc2VjdGlvbiBzeW1ib2xzIGZvciBzZWN0aW9ucyB0aGF0IGhhdmUgU0VDX0FMTE9DIHNldCwKLQlhbmQgaGF2ZSBub24temVybyBzaXplLgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IElmIHVkYXRhIGlzIE5VTEwsIGFuZCB0aGlzIGlzIGEKLQlzZWN0aW9uIHN5bWJvbCwgbG9vayB1cCB0aGUgc2VjdGlvbiBpbiB0aGUgbGlzdCBvZiBzZWN0aW9uCi0Jc3ltYm9scywgYW5kIHNldCB0aGUgdWRhdGEgcG9pbnRlciBhcHByb3ByaWF0ZWx5LiAgT3RoZXJ3aXNlLCBpZgotCXVkYXRhIGlzIHN0aWxsIE5VTEwsIGZhaWwgYW4gYXNzZXJ0aW9uLCBhbmQgdXNlIDAsIGluc3RlYWQgb2YKLQlkcm9wcGluZyBjb3JlLgotCi1GcmkgQXVnIDIwIDEyOjE4OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAobWlwcy0qLWVsZmwqLCBtaXBzLSotZWxmKik6IE5ldyB0YXJnZXRzLCB1c2luZwotCW1pcHNsZWxmIGFuZCBtaXBzYmVsZiByZXNwZWN0aXZlbHkuCi0JKiBjb25maWcvbWlwc2xlbGYubXQsIGNvbmZpZy9taXBzYmVsZi5tdDogTmV3IGZpbGVzLgotCSogZWxmMzItbWlwcy5jOiBBZGRlZCBzb21lIHJlbG9jIGluZm9ybWF0aW9uLgotCSogY29uZmlndXJlLmluOiBGaXhlZCBlcnJvciBtZXNzYWdlLgotCi0JKiBlY29mZi5jIChFQ09GRl9MT05HX1NJWkUpOiBSZW1vdmVkLiAgSnVzdCB1c2UgY29uc3RhbnRzLgotCi1UaHUgQXVnIDE5IDA5OjQ1OjUxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTLCBBTExfTUFDSElORVMsIEJGRDMyX0JBQ0tFTkRTLCBCRkQ2NF9CQUNLRU5EUywKLQlPUFRJT05BTF9CQUNLRU5EUyk6IEFscGhhYmV0aXplIGVudHJpZXMgYW5kIGFkZCBhIGZldyBtaXNzaW5nIG9uZXMuCi0JKiBhcmNodXJlcy5jOiBBbHBoYWJldGl6ZSBkZWNscy4KLQotCSogY29uZmlndXJlLmluLCB0YXJnZXRzLmM6IEFkZCBtaXNzaW5nIHZlY3RvcnMgdG8gdGhlIHRhYmxlcy4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3RvcikgWyFTRUxFQ1RfVkVDU106IEFkZCBERUZBVUxUX1ZFQ1RPUi4KLQlSZW1vdmUgaHAzMDBic2RfdmVjIGR1ZSB0byBjbGFzaCB3aXRoIHN1bm9zX2JpZ192ZWMuCi0KLVR1ZSBBdWcgMTcgMTg6MTI6MzIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2kzODZ7bWFjaDMsb3NmMW1rfS5oOiBOZXcgZmlsZXMsIGZvciBNYWNoIGhvc3RpbmcuCi0JKiBob3N0cy9pMzg2bWFjaC5oOiByZW1vdmVkLCByZXBsYWNlZCBieSBpMzg2b3NmMW1rLmguCi0JKiBjb25maWcvaTM4Nm1hY2gzLm10LCBpMzg2bWFjaDMuYzogTmV3IGZpbGVzLCBmb3IgTWFjaCBhLm91dCBmb3JtYXQuCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmhvc3QsIGNvbmZpZy5iZmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGhvc3RzL2RlY3N0YXRpb24uaDogSW5jbHVkZSA8c3lzL3BhcmFtLmg+IG5vdCA8bWFjaGluZS9wYXJhbS5oPi4KLQotVHVlIEF1ZyAxNyAxNToxOTo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IElmIHNlY3Rpb24ncyBvdXRwdXRfc2VjdGlvbiBpcwotCW5vdCB5ZXQgc2V0LCBwb2ludCB0byBpdHNlbGYuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgaXMKLQljYWxsZWQgb24gdGhlIG91dHB1dCBmaWxlLCBub3QgdGhlIGlucHV0IGZpbGUuCi0KLQkqIGNvZmYtcnM2MDAwLmMgKGR1bW15X3JlbG9jLCBSVFlQRTJIT1dUTyk6IFNldCBob3d0byBmaWVsZCB0byBhCi0JZHVtbXkgdmFsdWUsIHJhdGhlciB0aGFuIGxlYXZpbmcgaXQgTlVMTC4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCk6IFNldCBiZmRfZXJyb3Igb24KLQlmYWlsdXJlLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9hcmNoX21hY2gpKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4KLQotVHVlIEF1ZyAxNyAwOTo0MjoxNiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQgKGNwdSk6IEV4dHJhY3QgZnJvbSBjYW5vbmljYWwgbmFtZSB3aXRoIHNlZC4KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcGFzcyBpdC4KLQotU3VuIEF1ZyAxNSAyMDo0NTo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6IFJlbW92ZSB7QllURSxXT1JELExPTkd9X1NJWkU7IHRoZXkgYXJlIHBvaW50bGVzcyBhbmQKLQlCWVRFX1NJWkUgY29uZmxpY3RzIHdpdGggYSBNYWNoIGhlYWRlci4KLQkqIGVjb2ZmLmM6IENoYW5nZSBMT05HX1NJWkUgdG8gRUNPRkZfTE9OR19TSVpFIGFuZCBkZWZpbmUgaXQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBNYWtlIHN1cmUgYWxsIE9TIGZpZWxkcyBlbmQgaW4gKi4KLQotRnJpIEF1ZyAxMyAxNjozMzozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogVXNlIGJmZF9hYnNfc2VjdGlvbiBmb3IKLQlSRUxPQ19TRUNUSU9OX05PTkUgYW5kIFJFTE9DX1NFQ1RJT05fQUJTLiAgSWYgYSByZWxvYyBzZWN0aW9uCi0JZG9lc24ndCBleGlzdCwgZG9uJ3QgdHJ5IHRvIGNyZWF0ZSBpdC4KLQotCSogbmxtY29kZS5oIChubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogcHJvY2VkdXJlIG9mZnNldHMgYXJlCi0JZnJvbSBzdGFydCBvZiBjb2RlIHNlZ21lbnQsIG5vdCBzdGFydCBvZiBmaWxlLgotCSogY29uZmlnL2kzODYtbmxtLm10IChERUZBVUxUX1ZFQ1RPUik6IEl0J3MgbmxtMzJfaTM4Nl92ZWMsIG5vdAotCWJmZF9ubG0zMl9pMzg2X3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoU0VMRUNUX1ZFQ1Mgc3dpdGNoKTogTGlrZXdpc2UuCi0KLVRodSBBdWcgMTIgMTA6MzI6NDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IElmIHRoZSB0YXJnZXQgbWF0Y2hlcyB0aGUgZGVmYXVsdAotCXRhcmdldCwgc2V0IG1hdGNoX2NvdW50IHRvIDEsIHRvIGlnbm9yZSBhbnkgcHJldmlvdXMgbWF0Y2hlcy4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIHNyZWMubywgYWRkIHJlbG9jMTYuby4KLQotCSogY29uZmlndXJlLmluOiBBZGQgcmVsb2MxNi5vIHdoZW4gd2UgYWRkCi0JY29mZi1oODMwMC5vLCBjb2ZmLWg4NTAwLm8sIGNvZmYtc2gubywgY29mZi16OGsuby4KLQlNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBSZW1vdmUgcmVsb2MxNi5vLgotCi0JKiBjb25maWcvdTY4ay1jb2ZmLm10OiBGaXggdHlwbywgREVGQVVMVF9UQVJHRVQgZm9yCi0JREVGQVVMVF9WRUNUT1IuCi0KLQkqIGNvbmZpZy9oODMwMC1jb2ZmLm10LCBoODUwMC1jb2ZmLm10LCBzaC1jb2ZmLm10LCBzdDIwMDAubXQsCi0JejhrLWNvZmYubXQgKERFRkFVTFRfVkVDVE9SKTogRGVmaW5lLiAgRG9uJ3QgZXhwbGljaXRseSBhZGQKLQlTLXJlY29yZHMgdmlhIFNFTEVDVF9WRUNTLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpLCBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBbHdheXMKLQlzdXBwb3J0IFMtcmVjb3JkcywgZm9yIGNvbnZlbmllbmNlLgotCi1UaHUgQXVnIDEyIDA4OjMwOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9ob3d0b190YWJsZSwgYWxwaGFfZmluaXNoX3JlbG9jLAotCWFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfe2luLG91dH0sIGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6Ci0JUmVhZCBhbmQgd3JpdGUgQWxwaGEgcmVsb2NzLiAgQ2FuJ3QgcHJvY2VzcyB0aGVtIHlldC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogUmVjb2duaXplIG5ldyByZWxvYyBzZWN0aW9ucy4KLQlJZiB0aGUgc2VjdGlvbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBjcmVhdGUgaXQuCi0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl97aW4sb3V0fSk6IEhhbmRsZSBuZXcgZmllbGRzIGRlZmluZWQKLQlvbiB0aGUgQWxwaGEuCi0KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIGNvbnN0cnVjdG9yX3JlbG9jIGFuZAotCWZpbmlzaF9yZWxvYyBmaWVsZHMuCi0JKiBlY29mZi5jOiBNb3ZlIE1JUFMgcmVsb2Mgc3VwcG9ydCBmcm9tIGhlcmUuLi4KLQkqIGNvZmYtbWlwcy5jOiB0byBoZXJlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogR2V0IGNvbnN0cnVjdG9yIHJlbG9jIGhvd3RvCi0JZnJvbSBiYWNrZW5kLgotCShlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IFJlbW92ZWQgTUlQUyBzcGVjaWZpYyBzdHVmZi4gIENhbGwKLQlmaW5pc2hfcmVsb2MgYmFja2VuZCBmdW5jdGlvbi4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlZCBNSVBTIHNwZWNpZmljIGFzc2VydGlvbnMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19maW5pc2hfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogRmlsbCBpbiBuZXcgZmllbGRzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBVc2UgTlVMTCBmb3IgbmV3Ci0JZmllbGRzLgotCSogdGFyZ2V0cy5jOiBBZGRlZCBleHRlcm4gZm9yIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYy4KLQotCSogYmZkLmMgKF9iZmRfaG9zdF9iaWdfZW5kaWFuKTogUmVtb3ZlZC4KLQkqIGJmZC1pbi5oIChIT1NUX0JZVEVfT1JERVJfQklHX1AsIGJmZF9oZWFkZXJfdHdpZGRsZV9yZXF1aXJlZCk6Ci0JUmVtb3ZlZC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVdlZCBBdWcgMTEgMTI6MTE6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBOZXcgZmlsZSwgYnJva2VuIG91dCBvZiBjb25maWd1cmUuaW4uCi0JKiBjb25maWd1cmUuaW46IFVzZSBpdCwgYW5kIHVzZSBzdGFuZGFyZCB0YXJnZXQgbmFtZXMgZm9yCi0JLS13aXRoLXRhcmdldHMsIHJlcGxhY2luZyAtLXdpdGgtYmZkLXRhcmdldHMuCi0KLQkqIGFyY2h1cmVzLmMgKGFyY2h1cmVzX2luaXRfdGFibGUpOiBBZGQgYmZkX3NoX2FyY2guCi0KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBjb2ZmLW02OGsubyBmb3IgbTY4a2NvZmZ1bl92ZWMuCi0JSW5jbHVkZSBubG0zMi5vIGFuZCBubG0ubyBmb3IgYmZkX25sbTMyX2kzODZfdmVjLgotCUZpeCBlcnJvciBpbiBlcnJvciBtZXNzYWdlLgotCi0JKiBvYXN5cy5jOiBNYWtlIGJmZF9lcnJvcl92ZWN0b3IgZXh0ZXJuLgotCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgc3RhYi1zeW1zLm8gZm9yIGEub3V0L2Iub3V0IHRhcmdldHMKLQlhbmQgaHAzMDB7YnNkLGhwdXh9LgotCi1XZWQgQXVnIDExIDA2OjQwOjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRkIHRoZSAuYnNzCi0Jc2VjdGlvbiBiZWZvcmUgc2V0dGluZyBvdXRwdXRfaGFzX2JlZ3VuLgotCShubG1fc2V0X3NlY3Rpb25fY29udGVudHMpOiBSZW1vdmUgYXJndW1lbnQgbmFtZXMgZnJvbQotCW1hbmdsZV9yZWxvY3NfZnVuYyBwcm90b3R5cGUuCi0JKG5sbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgc2hhZG93aW5nIGxvY2FsIHZhcmlhYmxlLgotCURvbid0IHdyaXRlIG91dCBkZWJ1Z2dpbmcgc3ltYm9scyBpZiBkZWJ1Z0luZm9PZmZzZXQgaXMgLTEuICBBZGQKLQl0aGUgY29kZUltYWdlT2Zmc2V0IHRvIHRoZSBzdGFydCwgZXhpdCwgYW5kIGNoZWNrIHByb2NlZHVyZQotCW9mZnNldHMuCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3dyaXRlX3JlbG9jLCBubG1faTM4Nl9tYW5nbGVfcmVsb2NzKToKLQlEb24ndCBjaGVjayBwYXJ0aWFsX2lucGxhY2UgZmllbGQ7IGl0cyB2YWx1ZSBpcyBpcnJlbGV2YW50LgotCi0JKiBCYXNlIHVzZSBvZiBzY28tY29yZSBvbiBob3N0LCBub3QgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKGlbMzRdODYtKi1zY28qKTogVXNlIGkzODZzY28gcmF0aGVyIHRoYW4gaTM4NnYuCi0JKiBjb25maWcvaTM4Ni1zY28ubXQgKFRERUZJTkVTKTogUmVtb3ZlZC4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oOiBOZXcgZmlsZSB0byB1c2Ugc2NvLWNvcmUuCi0JKiBob3N0cy9pMzg2c2NvLmg6IE5ldyBmaWxlOyBqdXN0IGluY2x1ZGVzIGhvc3RzL2kzODZ2LmguCi0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3toZHIsZXh0fV97aW4sb3V0fSk6IFVzZSBzaWduZWQKLQljb252ZXJzaW9ucyBmb3Igc29tZSBmaWVsZHMuCi0KLVR1ZSBBdWcgMTAgMTM6MzI6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9ncHJlbF9yZWxvYyk6IElmIF9ncCBpcyBub3QgZGVmaW5lZCwgZ2l2ZSBhbgotCWVycm9yIHJhdGhlciB0aGFuIGFib3J0aW5nLgotCi0JKiBsaWJubG0uaCAoc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBtYWNoIGZpZWxkLgotCShubG1fbWFjaGluZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIG5sbS5jIChubG1fbWtvYmplY3QpOiBTZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGZyb20gYmFja2VuZAotCWluZm9ybWF0aW9uLgotCSogbmxtMzItaTM4Ni5jIChubG0zMl9pMzg2X2JhY2tlbmQpOiBJbml0aWFsaXplIG5ldyBtYWNoIGZpZWxkLgotCi1UdWUgQXVnIDEwIDA5OjMxOjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZXBsYWNlIGNhbGxzIHRvIHNvcnQgd2l0aCBzaGVsbCBjb2RlCi0JdG8gdW5pcSB0aGUgbGlzdHMuCi0KLVR1ZSBBdWcgMTAgMDY6MjM6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEluY2x1ZGUgYW91dDMyLm8gZm9yIGFueSBhLm91dC9iLm91dCBmb3JtYXRzLgotCi1Nb24gQXVnICA5IDA5OjM3OjE4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2kzODYtbGludXgubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBiZmRfZWxmMzJfaTM4Nl92ZWMuCi0JKiBjb25maWcvbTY4ay1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBtNjhrY29mZl92ZWMuCi0JKiBjb25maWcvaTM4Ni1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBpMzg2Y29mZl92ZWMuCi0JKiBjb25maWcvaHBwYS1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBocHBhX3ZlYy4KLQkqIGNvbmZpZy9zcGFyYy1lbGYubXQgKFNFTEVDVF9WRUNTKTogU3VwcG9ydCBzdW5vc19iaWdfdmVjLgotCSogY29uZmlnL2kzODYtc2NvLm10IChTRUxFQ1RfVkVDUyk6IERvbid0IGRlZmluZTsgSWFuIHNheXMgaXQgd2FzCi0JanVzdCBhIGhhY2suCi0KLU1vbiBBdWcgIDkgMTM6MTU6MDAgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTg4ay1jb2ZmLm10IChERUZBVUxUX1ZFQyAtPiBERUZBVUxUX1ZFQ1RPUik6IHJlbmFtZWQuCi0KLU1vbiBBdWcgIDkgMTQ6MjY6NDUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzeW1zLmMgKEJTRl9FWFBPUlQpOiBOb3cgc2FtZSBhcyBCU0ZfR0xPQkFMLgotCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogTmV3IGZ1bmN0aW9uLgotCi1Nb24gQXVnICA5IDExOjI5OjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKGJmZF9nZXRfYXJjaGl0ZWN0dXJlLCBiZmRfZ2V0X21hY2hpbmUpOiBSZW1vdmVkCi0Jb2Jzb2xldGUgbWFjcm9zLgotCSogYmZkLWluMi5oOiBVcGRhdGVkLgotCi0JKiBlY29mZi5jIChlY29mZl9zbHVycF9hcm1hcCk6IENvcnJlY3QgYnVnIGluIGluaXRpYWxpemF0aW9uIG9mCi0Jc3RyaW5nYmFzZS4KLQotU3VuIEF1ZyAgOCAxMjoyMToxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIHVubmVlZGVkIHRlc3QuCi0KLVN1biBBdWcgIDggMTI6NDE6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh7ZGlzdCxyZWFsfWNsZWFuKTogVXNlICQoTUFLRSksIG5vdCBtYWtlLgotCi1TYXQgQXVnICA3IDA5OjE0OjIxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N0MjAwMC5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgTVJJOyBub3QgdXNlZC4KLQotCSogUE9SVElORywgVE9ETywgY29uZmlnL1JFQURNRTogVXBkYXRlIHRvIHJlZmxlY3QgYmVsb3cgY2hhbmdlcy4KLQotCSogY29uZmlndXJlLmluOiBSZXBsYWNlIE1JTklNSVpFIGFuZCAtLXdpdGgtbWluaW1hbC1iZmQgd2l0aAotCS0td2l0aC1iZmQtdGFyZ2V0cz0idGFyZ2V0MSx0YXJnZXQyLC4uLiIgYW5kIHRoZSBzcGVjaWFsIHRhcmdldAotCSJhbGwiIHRvIGdldCB0aGUgcHJldmlvdXMgZGVmYXVsdCBiZWhhdmlvci4KLQlGaWd1cmUgb3V0IHdoaWNoIGFyY2hpdGVjdHVyZSBhbmQgYmFja2VuZCAubyBmaWxlcyBhcmUgbmVlZGVkIGZyb20KLQlERUZBVUxUX1ZFQ1RPUiwgU0VMRUNUX1ZFQ1MsIGFuZCBTRUxFQ1RfQVJDSElURUNUVVJFUyBhcyBzZXQgaW4KLQl0aGUgLm10IGZpbGVzLiAgRGVmaW5lIFRERUZBVUxUUyBiYXNlZCBvbiB0aGVtLCBhbHNvLgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gTUlOSU1JWkUuCi0JKiBhcmNodXJlcy5jLCB0YXJnZXRzLmM6IERpdHRvLgotCi0JKiBjb25maWcvKi5tdDogRGVmaW5lIERFRkFVTFRfVkVDVE9SLCBTRUxFQ1RfVkVDUywgYW5kCi0JU0VMRUNUX0FSQ0hJVEVDVFVSRVMgYXMgdmFyaWFibGVzIHJhdGhlciB0aGFuIGFzIC1EIGFyZ3VtZW50cyB0bwotCVRERUZBVUxUUy4KLQotCSogY29uZmlnL2EyOWstY29mZi5tdCxhbHBoYW9zZi5tdCwgaTM4Ni1zY28ubXQsIGk5NjAtYm91dC5tdCwKLQlpOTYwLWNvZmYubXQgKFRERUZBVUxUUyk6IERvbid0IHB1dCB0aGUgZGVmYXVsdCB2ZWN0b3IgaW4KLQlTRUxFQ1RfVkVDUyBtYW51YWxseTsgaXQncyBhdXRvbWF0aWMgbm93LgotCi0JKiBjb25maWcvaTM4Ni1zY28ubXQgKFRERUZBVUxUUyk6IERvbid0IHB1dCAmc2NvX2NvcmVfdmVjIGluCi0JU0VMRUNUX1ZFQ1MgbWFudWFsbHk7IC1EU0NPX0NPUkUgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IG5vdy4KLQotCSogY29uZmlnL2g4MzAwLWNvZmYubXQsaDg1MDAtY29mZi5tdCxzaC1jb2ZmLm10LHN0MjAwMC5tdCx6OGstY29mZi5tdAotCShUREVGQVVMVFMpOiBEb24ndCBkZWZpbmUgQkZEOyBub3QgdXNlZC4KLQotCSogY29uZmlnL2hwcGFvc2YubWggKEhERUZJTkVTKTogRG9uJ3QgZGVmaW5lIFNFTEVDVF9BUkNISVRFQ1RVUkVTOwotCXRoaXMgaXMgYSBob3N0LCBub3QgYSB0YXJnZXQuCi0KLVNhdCBBdWcgIDcgMDU6Mjg6MDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogIEFkZCBjb21tZW50IGFib3V0IHdoYXQgdGhpcyBmdW5jdGlvbgotCWRvZXMgYW5kIHRvIHdhdGNoIG91dCBmb3Igc2lkZSBlZmZlY3RzLiAgQWRkIEZJWE1FIGZvciBtZW1vcnkgbGVha3MuCi0JRml4IGNvbW1lbnQgYWJvdXQgY2hlY2tpbmcgZm9yIG1hdGNoaW5nIGJ5dGUgb3JkZXIuICBQcmVzZXJ2ZQotCXBvaW50ZXIgdG8gb2xkIHRkYXRhIChpZiBhbnkpLCBhbmQgcmVzdG9yZSBpdCBpZiB3ZSBkb24ndCBtYXRjaAotCWZpbGUgd2l0aCB0YXJnZXQgdmVjdG9yLiAgSWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBnb3RvJ3MsIHVzZSB0aGVtCi0JY29uc2lzdGVudGx5IGFuZCBtYWludGFpbmFibHkuCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6ICBFeHBhbmQgY29tbWVudHMgYWJvdXQgbGVha2VkIG1lbW9yeQotCXRvIG5vdGUgdGhhdCB0aGUgcHJvYmxlbSBpcyBldmVuIG1vcmUgc2VyaW91cyB0aGFuIGp1c3QgbGVha2VkCi0JbWVtb3J5LiAgUmVwbGFjZSBnb3RvIHdpdGggbW9yZSB0cmFkaXRpb25hbCByZXR1cm4uCi0KLUZyaSBBdWcgIDYgMTI6MDA6MDMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JRml4IGluY29ycmVjdCBvciB1c2VsZXNzIG1ha2VmaWxlIHZhcmlhYmxlIGRlZmluaXRpb25zOgotCSogY29uZmlnL25ld3MubXQsIGNvbmZpZy91NjhrLWNvZmYubXQgKFRERUZBVUxUUyk6IFVzZSB0aGlzIHRvCi0JZGVmaW5lIERFRkFVTFRfVkVDVE9SLCBpbnN0ZWFkIG9mIFRERUZJTkVTLgotCSogY29uZmlnL2kzODZhaXgubWggKE1JTklNSVpFKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL2hwcGFvc2YubWggKE1JTklNSVpFKTogRG9uJ3QgY29uZGl0aW9uYWxpemUuCi0JKiBjb25maWcvcnM2MDAwLm1oIChBTExPQ0EpLAotCSogY29uZmlnL2kzODZ2Lm1oIChBTExPQ0EpLAotCSogY29uZmlnL2kzODZsaW51eC5taCAoQUxMT0NBKSwKLQkqIGNvbmZpZy9pMzg2aXNjLm1oIChBTExPQ0EpLAotCSogY29uZmlnL2dvMzIubWggKEVYVFJBTElCUyk6IERvbid0IGRlZmluZTsgbm90IHVzZWQuCi0JKiBjb25maWcvc29sYXJpczIubWggKEhERUZJTkVTKTogUmVuYW1lZCBmcm9tIEhfREVGSU5FUy4KLQkqIGNvbmZpZy9hbHBoYW9zZi5tdCAoVERFRklORVMpOiBTZXQgaXQsIG5vdCBIREVGSU5FUy4KLQkqIGNvbmZpZy96OGstY29mZi5tdCAoQ0MpOiBEb24ndCBkZWZpbmUuICBJdCdzIGEgdGFyZ2V0LCBub3QgYSBob3N0LgotCi0JKiBjb25maWcvUkVBRE1FOiBOZXcgZmlsZSwgZXhwbGFpbmluZyB0aGUgdmFyaWFibGVzLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBBZGQgaHAzMDBfYnNkX3ZlYy4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUywgQ0ZJTEVTKTogQWRkIGhwMzAwYnNkLgotCShocDMwMGJzZC5vKTogTmV3IHJ1bGUuCi0KLUZyaSBBdWcgIDYgMTU6MTM6MjIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoTkFNRSk6IFByb3ZpZGUgYSBkZWZhdWx0IGRlZmluaXRpb24sIHRoYXQncyBuZWl0aGVyCi0JZm9yIDMyIGJpdHMgbm9yIGZvciA2NC4KLQotCVR1ZSBKdW4gMTUgMTQ6Mzg6MzIgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGxpYmVsZi5oIChlbGZfaGFzaCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byBiZmRfZWxmX2hhc2gsIHNpbmNlCi0JdGhhdCBpcyB3aGF0IGlzIGluIGVsZi5jLgotCi1GcmkgQXVnICA2IDEyOjI4OjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogUmVtb3ZlZCBzcGVjaWFsIGhhbmRsaW5nIGZvcgotCXNjQnNzIGFuZCBzY1NCc3Mgc3ltYm9scywgc2luY2UgaXQgd2FzIHdyb25nLgotCi0JKiBNYWtlZmlsZS5pbiAoY29mZi1taXBzLm8sIGNvZmYtYWxwaGEubyk6IERvbid0IGRlcGVuZCBvbgotCWNvZmZjb2RlLmguCi0KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSW5zcGlyZWQgYnkgbWJAdHRpLkNPTSAoTWljaGFlbAotCUJsb29tKTogT25seSBzZXQgU1RZUF9CU1MgZm9yIFNFQ19BTExPQyBzZWN0aW9ucy4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2x1cnBfYXJtYXApOiBGcm9tIEFybmUgSGVucmlrIEp1dWwKLQk8YXJuZWpAa2FyaS5mbS51bml0Lm5vPjogSGFuZGxlIGEgQ09GRiBzdHlsZSBhcm1hcC4KLQotRnJpIEF1ZyAgNiAwOTo1OTo0NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaHB1eC1jb3JlLmM6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20gYmZkX3phbGxvYy4KLQotVGh1IEF1ZyAgNSAxMzoyMjo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGxvZzIpOiBEZWxldGUgaTM4Ny1zcGVjaWZpYyBjb2RlLgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBBbHdheXMgaW5jbHVkZSBlbGYuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBEb24ndCBpbmNsdWRlIGVsZi5vIGhlcmUuCi0JKG9maWxlcyk6IERlbGV0ZSByZWZlcmVuY2VzIHRvIG9maWxlczIgYW5kIG9maWxlczMuCi0JKGRvX2NsZWFuKTogRGVsZXRlIG9maWxlcy4KLQkoQkZESU5fSCk6IENoYW5nZWQgcmVmZXJlbmNlcyB0byAkKHNyY2RpcikvYmZkLWluMi5oLgotCShzdG1wLWJmZC5oKTogVXNlIGJmZC5oLW5ldyBhcyB0ZW1wb3JhcnkgbmFtZSwgbm90IGJmZC5oMi4KLQkoaGVhZGVycyk6IFVzZSBiZmQtaW4yLmgtbmV3IGFzIHRlbXBvcmFyeSBuYW1lLCBub3QgYmZkLmgtbmV3LgotCi0JKiBiZmQtaW4uaDogUmV3b3JkZWQgY29tbWVudCB0byBtYWtlIGl0IGNsZWFyIHRoYXQgYmZkLWluMi5oIGlzIGEKLQlnZW5lcmF0ZWQgZmlsZS4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkZWQgaTM4Ni1lbGYgcmVsb2MgdHlwZXMKLQkoZnJvbSBNZWlzc25lcidzIGFkZGl0aW9ucyB0byBiZmQtaW4yLmgpLgotCi0JKiBlbGYzMi1pMzg2LmMgKEVMRl9NQVhQQUdFU0laRSk6IERlZmluZS4KLQotCU1lcmdlZDoKLQotCVdlZCBKdW4gMjMgMDY6MDU6NTggMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGRyb3AgY29yZSBpZgotCWVsZl9zeW1ib2xfZnJvbSByZXR1cm5zIGEgTlVMTCBwb2ludGVyIHdoZW4gcHJvY2Vzc2luZyBhIG5vbi1lbGYKLQlzeW1ib2wsIHVzZSBhIDAgc2l6ZSBpbnN0ZWFkLgotCi0JVHVlIEp1biAxNSAxNDozODozMiAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmY29kZS5oIChlbGZfaGFzaCk6IERlbGV0ZSBtYWNybyBtYXBwaW5nIGVsZl9oYXNoIHRvCi0JYmZkX2VsZjMyX2hhc2gsIHNpbmNlIHRoZSBoYXNoIHRhYmxlIGlzIGluZGVwZW5kZW50IG9mIHRoZSAzMi82NAotCWJpdCBzeXN0ZW0uCi0KLQkqIGxpYmVsZi5oIChlbGZfaGFzaCk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byBiZmRfZWxmX2hhc2gsIHNpbmNlCi0JdGhhdCBpcyB3aGF0IGlzIGluIGVsZi5jLgotCi0JU2F0IEp1biAxOSAxMDoxMjoyNyAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogZWxmMzItaTM4Ni5oIChyZWxvY190eXBlKTogUmVmb3JtYXQgc3BhY2luZy4KLQkoZWxmX2hvd3RvX3RhYmxlKTogQWRkIHRoZSByZXN0IG9mIHRoZSAzODYvRUxGIHJlbG9jYXRpb25zLgotCShlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IERpdHRvLgotCShlbGZfaTM4Nl9pbmZvX3RvX2hvd3RvKTogRGl0dG8uCi0JKGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsKTogRGl0dG8uCi0KLVRodSBBdWcgIDUgMTA6MDc6NDMgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCk6ICBUZXN0IHJldHVybiB2YWx1ZQotCW9mIG5sbV9zbHVycF9zeW1ib2xfdGFibGUgYXMgYm9vbGVhbiwgbm90IHBvaW50ZXIuCi0JKiBubG1jb2RlLmggKG5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiAgVGVzdCByZXR1cm4gdmFsdWUKLQlvZiBubG1fc2x1cnBfcmVsb2NfZml4dXBzIGFzIGJvb2xlYW4sIG5vdCBwb2ludGVyLgotCi1XZWQgQXVnICA0IDE2OjIyOjU1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWg6IHJlbW92ZSBIREVGSU5FUzsgc2luY2UgX19NU0RPU19fIGFuZCBfX0dPMzJfXwotCWFyZSBub3cgcHJlZGVmaW5lZCBieSBHQ0MKLQotV2VkIEF1ZyAgNCAxNjowNjoyOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBBZGQgdGhlIHNlY3Rpb24gb2Zmc2V0IHRvIHRoZQotCWxpbmUgbnVtYmVyIGFkZHJlc3MsIHNvIGl0J3MgcHJpbnRlZCB0aGUgc2FtZSB3YXkgYXMgdGhlIGZ1bmN0aW9uCi0JYWRkcmVzcy4gIE9ubHkgc2hvd2VkIHVwIGZvciBsaW5lIG51bWJlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIGZpcnN0Ci0Jc2VjdGlvbiAoLnRleHQpLgotCi1XZWQgQXVnICA0IDA4OjMzOjU1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlibmxtLmggKG5sbV9iYWNrZW5kX2RhdGEpOiBBZGRlZCBubG1fbWFuZ2xlX3JlbG9jcy4KLQkobmxtX21hbmdsZV9yZWxvY3NfZnVuYyk6IE5ldyBtYWNyby4KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfd3JpdGVfcmVsb2MpOiBSZXdyb3RlIGNvcnJlY3RseS4KLQkobmxtX2kzODZfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQkqIG5sbWNvZGUuaCAobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE1vdmUgYWxsIGNvbW1vbgotCXN5bWJvbHMgaW50byB0aGUgLmJzcyBzZWN0aW9uLgotCShubG1fc2V0X3NlY3Rpb25fY29udGVudHMpOiBDYWxsIHRoZSBtYW5nbGVfcmVsb2NzIGZ1bmN0aW9uLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGFueSBkZWZpbmVkCi0Jc3ltYm9sIGFzIGFuIGludGVybmFsIHJlbG9jLiAgRml4IGJ1ZyBpbiBleHRlcm5hbCByZWxvYyBjb3VudGluZy4KLQlHZXQgdGhlIG9mZnNldCBhbmQgZGVidWdnaW5nIHR5cGUgcmlnaHQgZm9yIC5ic3Mgc3ltYm9scy4gIE9ubHkKLQlvdXRwdXQgZGVidWdnaW5nIHN5bWJvbHMgZm9yIGRlZmluZWQgc3ltYm9scy4KLQotCSogY29mZi1oODUwMC5jIChydHlwZTJob3d0byk6IERvIGFuIGZwcmludGYgdG8gc3RkZXJyIHJhdGhlciB0aGFuCi0JdXNpbmcgcHJpbnRmLgotCSogY29mZi16OGsuYyAocnR5cGUyaG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoVFJBQ0UpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlLCBzd2FwX3N0ZF9yZWxvY19pbik6IExpa2V3aXNlLgotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IERvIGFuIGZwcmludGYgdG8gdGhlIGZpbGUKLQlhcmd1bWVudCByYXRoZXIgdGhhbiB1c2luZyBwcmludGYuCi0KLVR1ZSBBdWcgIDMgMTg6MTc6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2Zmc3dhcC5oOiBBZGRlZCBtYWNyb3MgdXNlZCB3aGVuIGFjY2Vzc2luZyBzZXZlcmFsIGZpZWxkczsKLQlkZWZhdWx0IGlzIHRoZSBzYW1lIGFzIGJlZm9yZS4KLQkoY29mZl9zd2FwX2FvdXRoZHJfe2luLG91dH0pOiBIYW5kbGUgdGhlIEFscGhhIEVDT0ZGIGZpZWxkcy4KLQkqIGNvZmYtYWxwaGEuYzogRGVmaW5lZCBtYWNyb3MgdG8gdXNlIHRoZSByaWdodCBzaXplcyBpbgotCWNvZmZzd2FwLmguCi0JKiBsaWJlY29mZi5oOiBCYWNrZW5kIGluZm9ybWF0aW9uIGlzIG5vdyBpbiB0YXJnZXQgdmVjdG9yLCBub3QKLQlCRkQuICBTdGFydCBvZiBiYWNrZW5kIGluZm9ybWF0aW9uIGlzIENPRkYgYmFja2VuZCBpbmZvcm1hdGlvbi4KLQkqIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmM6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoQVJNQVBfU1RBUlQpOiBDaGFuZ2VkIGludG8gYmFja2VuZCBpbmZvcm1hdGlvbiwgc2luY2UgQWxwaGEgdXNlcwotCWEgZGlmZmVyZW50IG5hbWUuCi0JKGVjb2ZmX3NsdXJwX2FybWFwKTogRG9uJ3Qgb3ZlcmxheSBhcmNoaXZlIGhlYWRlci4KLQkqIGJmZC5jOiBJbmNsdWRlIGxpYmNvZmYuaC4KLQotVHVlIEF1ZyAgMyAxNjozMzoxMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRml4IHNoIHN5bnRheCBlcnJvci4KLQotCSogYW91dGYxLmg6IE1ha2UgYmZkX2Vycm9yX3RyYXAgZXh0ZXJuOyBpdCdzIGRlZmluZWQgaW4gYmZkLmMuCi0KLVR1ZSBBdWcgIDMgMTU6MTk6MDkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbV9zbHVycF9zeW1ib2xfdGFibGU6IERvbid0IHVzZSAnJicgb24gYXJyYXlzLgotCi1UdWUgQXVnICAzIDExOjA2OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYzogTmV3IGZpbGUgZm9yIGdlbmVyaWMgRUNPRkYgZnVuY3Rpb25zLgotCSogZWNvZmZzd2FwLmg6IE5ldyBmaWxlIGZvciBFQ09GRiBzd2FwcGluZyBmdW5jdGlvbnMgd2hpY2ggZGlmZmVyCi0Jb25seSBzbGlnaHRseSBmb3IgZGlmZmVyZW50IHRhcmdldHMuCi0JKiBsaWJlY29mZi5oOiBBZGRlZCBwcm90b3R5cGVzIGZvciBlY29mZi5jIGZ1bmN0aW9ucy4KLQkoZWNvZmZfYmFja2VuZF9kYXRhKTogTmV3IHN0cnVjdHVyZS4KLQkoZWNvZmZfdGRhdGEpOiBBZGRlZCBiYWNrZW5kX2RhdGEgZmllbGQuICBDaGFuZ2VkIGV4dGVybmFsIGRhdGEKLQlwb2ludGVycyB0byBiZSBQVFIgcmF0aGVyIHRoYW4gdG8gYSBwYXJ0aWN1bGFyIHN0cnVjdC4KLQkoZWNvZmZfc3ltYm9sX3N0cnVjdCk6IE1vdmVkIGluIGZyb20gY29mZi1taXBzLmMuCi0JKiBjb2ZmLWFscGhhLmMsIGNvZmYtbWlwcy5jOiBNb3ZlZCBjb21tb24gZnVuY3Rpb25zIGludG8gZWNvZmYuYy4KLQlBZGRlZCBFQ09GRiBiYWNrZW5kIHN0cnVjdHVyZXMuICBJbmNsdWRlIGVjb2Zmc3dhcC5oLgotCSogY29mZi1tc3ltLmM6IFJlbW92ZWQ7IHN1cGVyc2VkZWQgYnkgZWNvZmZzd2FwLmguCi0JKiBiZmQuYzogSW5jbHVkZSBjb2ZmL2ludGVybmFsLmguCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBSZW1vdmVkIGNvZmYtbWlwcy5vIGFuZCBjb2ZmLW1zeW0uby4KLQlBZGRlZCBlY29mZi5vLgotCShCRkQ2NF9CQUNLRU5EUyk6IEFkZGVkIGNvZmYtYWxwaGEuby4KLQkoQ0ZJTEVTKTogUmVtb3ZlZCBjb2ZmLW1zeW0uYy4gIEFkZGVkIGVjb2ZmLmMuCi0JKGJmZC5vKTogQWRkZWQgZGVwZW5kZW5jeSBvbiAkKElOQ0RJUikvY29mZi9zeW0uaC4KLQkoY29mZi1taXBzLm8pOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGVjb2Zmc3dhcC5oIGFuZCBjb2ZmL2Vjb2ZmLmguCi0JKGVjb2ZmLm8sIGNvZmYtYWxwaGEubyk6IE5ldyB0YXJnZXRzLgotCShjb2ZmLW1zeW0ubyk6IFJlbW92ZWQgdGFyZ2V0LgotCi1Nb24gQXVnICAyIDIzOjMzOjM4IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmgsIGhvc3RzLyo6ICBSZW1vdmUgKG9uZSBtb3JlIHRpbWUpIGFsbCBvY2N1cnJhbmNlcwotCW9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcy4gIEhlYXZlIGhvIQotCi1Nb24gQXVnICAyIDE2OjQ1OjU3IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogIEFkZCBjaGVjayBmb3IgSTM4NkxZTlhNQUdJQy4KLQotTW9uIEF1ZyAgMiAxMjoxODowMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogcmVtb3ZlIHNvbWUgbW9yZSBjb25mbGljdGluZyBkZWNscwotCi1Nb24gQXVnICAyIDExOjQ4OjIzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmM6ICBSZW1vdmUgdW5uZWNlc3NhcnkgZGVmIG9mIE5fSEVBREVSX0lOX1RFWFQsCi0JcmVkZWZpbmUgVEVYVF9TVEFSVF9BRERSIHRvIGJlIDAuCi0KLVN1biBBdWcgIDEgMjI6NTQ6MDggMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3QsIGNvbmZpZ3VyZS5pbiwgaG9zdHMvaTM4Nmx5bnguaDogIEx5bngvMzg2Ci0JaG9zdCBhbmQgdGFyZ2V0IGluZm8uCi0KLUZyaSBKdWwgMzAgMTg6MDg6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG0zMi1pMzg2LmM6IE5ldyBmaWxlLiAgRmlyc3QgY3V0IGF0IGkzODYgTkxNIGNvZGUuCi0JKiBsaWJubG0uaDogQWRkZWQgc29tZSBtb3JlIHByb3RvdHlwZXMuCi0JKHN0cnVjdCBubG1fcmVsZW50KTogTmV3IHN0cnVjdHVyZS4KLQkobmxtTkFNRShzeW1ib2xfdHlwZSkpOiBBZGRlZCByY250IGFuZCByZWxvY3MgZmllbGRzLgotCShzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IEFkZGVkIG5ldyBmaWVsZHM6IG5sbV9zeW1ib2xzLAotCW5sbV90ZXh0X2xvdywgbmxtX2RhdGFfbG93LCBubG1fcmVsb2NfZml4dXBzLAotCW5sbV9yZWxvY19maXh1cF9zZWNzLgotCShzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSk6IE5ldyBzdHJ1Y3R1cmUsIHdpdGggYWNjZXNzb3IgbWFjcm9zLgotCSogbmxtY29kZS5oOiBVc2UgTkxNX0hJQklUIHJhdGhlciB0aGFuIE1TQi4KLQkobmxtX29iamVjdF9wKTogU2V0IFNFQ19SRUxPQyBmb3IgLnRleHQgYW5kIC5kYXRhLiAgRG9uJ3Qgc2V0Ci0JU0VDX0RBVEEgZm9yIC5ic3MuICBTZXQgSEFTX1JFTE9DIGFuZCBIQVNfU1lNUyBmb3IgYWJmZC4gIFNldCB0aGUKLQlhcmNoaXRlY3R1cmUuCi0JKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQsCi0JZmluZF9ub256ZXJvLCBubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBOZXcgb3V0Ym91bmQKLQlzd2FwcGluZyBmdW5jdGlvbnMuCi0JKG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBubG1fc2x1cnBfc3ltYm9sX3RhYmxlKTogSW5jbHVkZQotCWV4dGVybmFsIHJlZmVyZW5jZXMgaW4gc3ltYm9sIHRhYmxlIGFzIHVuZGVmaW5lZCBzeW1ib2xzLgotCShubG1fZ2V0X3N5bXRhYiwgbmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IEZpbGwgaW4gYWxvY2F0aW9uCi0JYXJndW1lbnQgaW4gZ2V0X3N5bXRhYiByYXRoZXIgdGhhbiBpbiBzbHVycF9zeW1ib2xfdGFibGUuCi0JKG5sbV9zbHVycF9zeW1ib2xfdGFibGUpOiBTYXZlIHN5bWJvbCBpbmZvcm1hdGlvbiBpbiB0ZGF0YS4KLQkobmxtX3ByaW50X3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkobmxtX3NsdXJwX3JlbG9jX2ZpeHVwcywgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCwKLQlubG1fY2Fub25pY2FsaXplX3JlbG9jKTogTmV3IGZ1bmN0aW9ucyB0byByZWFkIHJlbG9jcy4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgbmxtX3NldF9zZWN0aW9uX2NvbnRlbnRzLAotCW5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlLCBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTmV3Ci0JZnVuY3Rpb25zIHRvIGNyZWF0ZSBOTE0gZmlsZXMuCi0JKiBubG0tdGFyZ2V0Lmg6IERlZmluZSBhbGwgdGhlIG5sbSBmdW5jdGlvbnMgaGVyZSBlaXRoZXIgYXMKLQlkZWZhdWx0IHZhbHVlcyBvciBpbiB0ZXJtcyBvZiBubG1OQU1FLiAgVXNlIEpVTVBfVEFCTEUobmxtKS4gIFNldAotCXRoZSBiYWNrZW5kX2RhdGEgZmllbGQgdG8gVEFSR0VUX0JBQ0tFTkRfREFUQS4KLQkqIG5sbTMyLWdlbi5jLCBubG02NC1nZW4uYzogRG9uJ3QgZGVmaW5lIGZ1bmN0aW9uIG1hY3JvcyBoZXJlOwotCXRoZXkgYXJlIG5vdyBpbiBubG0tdGFyZ2V0LmguCi0JKFRBUkdFVF9CQUNLRU5EX0RBVEEpOiBEZWZpbmUgYXMgTlVMTC4KLQkqIG5sbS5jIChubG1fbWtvYmplY3QpOiBEbyBhbGxvY2F0ZSB0aGUgdGRhdGEgZmllbGQuCi0JKG5sbV9zZXRfYXJjaF9tYWNoKTogTmV3IGZ1bmN0aW9uLgotCSogdGFyZ2V0cy5jOiBBZGRlZCBubG0zMl9pMzg2X3ZlYy4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZGVkIG5sbTMyLWkzODYuby4KLQkoQ0ZJTEVTKTogQWRkZWQgbmxtMzItaTM4Ni5jLgotCShubG0zMi1nZW4ubywgbmxtNjQtZ2VuLm8pOiBEZXBlbmQgb24gbmxtLXRhcmdldC5oLgotCShubG0zMi1pMzg2Lm8pOiBOZXcgdGFyZ2V0LgotCi1UaHUgSnVsIDI5IDIwOjIwOjM5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiByZW1vdmUgc29tZSBmdW5jdGlvbiBkZWNscyB0aGF0IGNvbmZsaWN0IHcvIEFOU0kKLQlDLCBhbmQgYXJlbid0IG5lZWRlZCBhbnl3YXkgKHJldHVybiBpbnQpCi0KLVdlZCBKdWwgMjggMTU6NDY6MzggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IFVzZSBjYXN0cyB3aXRoIGJmZF9hbGxvYyBhbmQgYWxsb2NhLgotCi1UdWUgSnVsIDI3IDEyOjUxOjQzIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG17MzIsNjR9LWdlbi5jIChKVU1QX1RBQkxFX1BSRUZJWCk6ICBEZWxldGUuCi0JKiBubG17MzIsNjR9LWdlbi5jIChKVU1QX1RBQkxFX0lOSVQpOiAgTmV3IG1hY3JvIHRoYXQgd29ya3Mgd2l0aAotCW9sZGVyIGNwcCdzLCB0aGF0IGRvbid0IGRvIGFkZGl0aW9uYWwgcmVwbGFjZW1lbnQgb24gdGhlIEpVTVBfVEFCTEUKLQltYWNybydzIGFyZ3VtZW50LgotCSogbmxtLXRhcmdldC5oIChKVU1QX1RBQkxFX0lOSVQpOiAgVXNlIG5ldyBtYWNybyBpbiBwbGFjZSBvZgotCUpVTVBfVEFCTEUgbWFjcm8uCi0KLU1vbiBKdWwgMjYgMTc6Mzk6MDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQlZZXQgYW5vdGhlciB0cmFkLWNvcmUgdmFyaWFudDoKLQkqIGNvbmZpZy9lc2l4Lm1oLCBob3N0cy9lc2l4Lmg6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5ob3N0czogVXNlIHRoZW0uCi0KLU1vbiBKdWwgMjYgMTM6MjI6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogSGFuZGxlIHRoZSBjYXNlIG9mCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHJpZ2h0c2hpZnQgPiBiaXRwb3MsIGFuZCBhIG5lZ2F0aXZlCi0JbnVtYmVyLgotCi1Nb24gSnVsIDI2IDE0OjQwOjEwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oOiBSZWltcGxlbWVudCBzZWdtZW50IHdyaXRpbmcuCi0JKGVsZl93cml0ZV9waGRycyk6IFVzZSBwcmVjb21wdXRlZCBlX3Bob2ZmIHJhdGhlciB0aGFuIG1ha2luZwotCWFzc3VtcHRpb25zLgotCShlbGZfYnVpbGRfcGhkcnMpOiBEaXNhYmxlZCwgZm9yIG5vdy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBEb24ndCBjaGFuZ2UgZmlsZSBvZmZzZXQgZm9yCi0JU0hUX05PQklUUy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zeW10YWJfYW5kX3N0cnRhYnMpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCBzZWdfaW5mbyk6IE5ldyB0eXBlLgotCShtYXBfcHJvZ3JhbV9zZWdtZW50cyk6IE5ldyBmdW5jdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBGb3IgZXhlY3V0YWJsZXMsIGxlYXZlCi0Jc2VjdGlvbiBoZWFkZXJzICZjIGZvciBsYXN0LCBhbmQgcHJvcGVybHkgYWxpZ24gYWxsIHNlY3Rpb25zIHdpdGgKLQlmbGFnIFNIRl9BTExPQyBzZXQuCi0JKHByZXBfaGVhZGVycyk6IE5vIGxvbmdlciBhYm9ydCB3aGVuIEVYRUNfUCBpcyBzZXQuCi0JKHdyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVsZXRlZCBhbGwgY29kZSByZWxhdGluZyB0byBwcm9ncmFtCi0Jc2VnbWVudHMuCi0KLQkqIGVsZmNvZGUuaCAodmFyaW91cyk6IERlbGV0ZWQgc29tZSB1bnVzZWQgY29kZSwgYW5kIGRlYnVnZ2luZwotCSJtYWxsb2MoMCkiIGNhbGxzLgotCSh3cml0ZV9yZWxvY3MpOiBDYWNoZSB2YWx1ZSBvZiBsYXN0IHN5bWJvbCBsb29rZWQgdXAsIHRvIHNhdmUKLQl0aW1lIGlmIHRoZSBzeW1ib2wgaXMgcmVmZXJyZWQgdG8gcmVwZWF0ZWRseS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayBvbmx5IFNFQ19SRUxPQyBmbGFnLCBub3QgbnVtYmVyIG9mCi0JcmVsb2NzLgotCShhc3NpZ25fc2VjdGlvbl9udW1iZXJzKTogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluIChvZmlsZXMpOiBTdGFycyBpbiB3aWxkY2FyZHMgYmVsb25nIG91dHNpZGUgcXVvdGVzLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBOZXcgZmllbGQsIG1heHBhZ2VzaXplLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IE5ldyBmaWVsZCwgcGhkci4KLQkqIGVsZjMyLXRhcmdldC5oIChlbGYzMl9iZWQpOiBJbml0aWFsaXplIG1heHBhZ2VzaXplIGZyb20KLQlFTEZfTUFYUEFHRVNJWkUuCi0JKEVMRl9NQVhQQUdFU0laRSk6IERlZmF1bHQgdG8gMS4KLQkqIGVsZjY0LXRhcmdldC5oIChlbGY2NF9iZWQsIEVMRl9NQVhQQUdFU0laRSk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCShlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBBbGwgcmVsb2NzIHNob3VsZCBoYXZlIHBjcmVsX29mZnNldD10cnVlLgotCU1vc3Qgc2hvdWxkIGhhdmUgbGVuZ3RoIGZpZWxkIG9mIGAyJy4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSA2NC1iaXQgcmVsb2NzLgotCi0JKiBjb25maWcvc3BhcmMtYW91dC5tdCAoVEFSR0VUX0JBQ0tFTkRTKTogRGVmaW5lLgotCi1Nb24gSnVsIDI2IDA4OjU2OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCBsb29rIGluICR7c3JjZGlyfSBmb3IgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ307Ci0JdGhlIHRvcCBsZXZlbCBzY3JpcHQgaGFzIGFscmVhZHkgYWRqdXN0ZWQgZm9yIGl0LgotCi1Nb24gSnVsIDI2IDA4OjA5OjE5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogIEdldCBDUiBMRiBpbiB0aGUgcmlnaHQgb3JkZXIuCi0KLU1vbiBKdWwgMjYgMDI6MDg6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3ZheGJzZC5oOiBJbmNsdWRlIHN0ZC1ob3N0LmguICBEb24ndCBpbmNsdWRlIDxtYWNoaW5lL3BhcmFtLmg+LgotCi1TYXQgSnVsIDI0IDE2OjEzOjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEhhbmRsZSBjYXNlIG9mIHJpZ2h0c2hpZnQgIT0KLQliaXRwb3Mgd2hlbiBvdmVyZmxvdyBjaGVja2luZy4KLQotRnJpIEp1bCAyMyAxMDoyMDoyNyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiwgYmZkX3VuZGVmaW5lZF9zeW1ib2wsCi0JYmZkX3JlbG9jX3ZhbHVlX3RydW5jYXRlZCwgYmZkX3JlbG9jX2lzX2Rhbmdlcm91cywgYmZkX2Fzc2VydCk6Ci0JU2VuZCBlcnJvciBtZXNzYWdlcyB0byBzdGRlcnIuCi0KLVRodSBKdWwgMjIgMTU6NTc6MjkgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbXszMiw2NH0tdGFyZ2V0Lmg6ICBSZW1vdmUuCi0JKiBubG0tdGFyZ2V0Lmg6ICBOZXcgZmlsZSwgbWVyZ2VkIGZyb20gbmxtezMyLDY0fS10YXJnZXQuaAotCSogbGlibmxtLmggKE5MTV9BUkNIX1NJWkUpOiAgRGVmaW5lIHRvIEFSQ0hfU0laRS4KLQkqIG5sbS5jIChBUkNIX1NJWkUpOiAgUmVtb3ZlIGRlZmluZSB0byB6ZXJvLgotCSogbmxtMzItZ2VuLmMgKEFSQ0hfU0laRSk6ICBEZWZpbmUgdG8gMzIuCi0JKiBubG0zMi1nZW4uYyAoSlVNUF9UQUJMRV9QUkVGSVgpOiAgRGVmaW5lIHRvIG5sbTMyLgotCSogbmxtezMyLDY0fS1nZW4uYyAobmxtLXRhcmdldC5oKTogIEluY2x1ZGUuCi0JKiB0YXJnZXRzLmMsIGxpYm5sbS5oLCBubG0uYywgbmxtezMyLDY0fS1nZW4uYywgbmxtezMyLDY0fS5jLAotCW5sbWNvZGUuaDogIENvbnZlcnQgcHJlZml4ZXMgZnJvbSBiZmRfbmxtPHNpemU+IHRvIGp1c3QKLQlubG08c2l6ZT4sIGFuZCB1c2UgbWFjcm9zIHNlbGVjdCBzaXplLgotCi1UaHUgSnVsIDIyIDE1OjQwOjE0IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogYWRkIGNvbmZpZ3VyZS5pbiwgZHJvcCByZWR1bmRhbnQKLQkgICQoc3JjZGlyKSwgZHJvcCByZWR1bmRhbnQgLi8KLQotVGh1IEp1bCAyMiAxMzozNDo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGhwdXgtY29yZS5jOiBOZXcgZmlsZTsgYmFja2VuZCBmb3IgSFAvVVggc3R5bGUgY29yZSBmaWxlcy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IFJlbmFtZWQgaHBwYV9jb3JlX2RhdGEgZmllbGQgdG8KLQlocHV4X2NvcmVfZGF0YS4KLQkqIGJmZC1pbjIuaDogVXBkYXRlZC4KLQkqIGhwcGEuYyAobWFrZV9iZmRfYXNlY3Rpb24sIGhwcGFfY29yZV9maWxlX3AsCi0JaHBwYV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kLCBocHBhX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCwKLQlocHBhX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6IE1vdmVkIGludG8gaHB1eC1jb3JlLmMuCi0JUmVtb3ZlZCBmcm9tIHRhcmdldCB2ZWN0b3IuCi0JKiBsaWJocHBhLmggKHN0cnVjdCBocHBhX2NvcmVfc3RydWN0IGFuZCBhY2Nlc3NvciBtYWNyb3MpOiBNb3ZlZAotCWludG8gaHB1eC1jb3JlLmMuCi0JKiB0YXJnZXRzLmM6IElmIEhQVVhfQ09SRSBpcyBkZWZpbmVkLCBhZGQgaHB1eF9jb3JlX3ZlYyB0bwotCXRhcmdldCBsaXN0LgotCSogY29uZmlnL2hwMzAwLm1oIChIREVGSU5FUyk6IFNldCB0byAtREhQVVhfQ09SRS4KLQkoSERFUEZJTEVTKTogU2V0IHRvIGhwdXgtY29yZS5vLgotCSogY29uZmlnL2hwcGFic2QubWgsIGNvbmZpZy9ocHBhaHB1eC5taDogTGlrZXdpc2UuCi0JKiBob3N0cy9ocDMwMC5oIChIT1NUX0hQMzAwSFBVWCk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluIChPUFRJT05BTF9CQUNLRU5EUyk6IEFkZGVkIHNjby1jb3JlLm8sCi0JYWl4Mzg2LWNvcmUubywgaHB1eC1jb3JlLm8uCi0JKHNjby1jb3JlLm8sIGFpeDM4Ni1jb3JlLm8sIGhwdXgtY29yZS5vKTogTmV3IGRlcGVuZGVuY2llcy4KLQotCSogcmVsb2MuYyAoZW51bSBjb21wbGFpbl9vdmVyZmxvdyk6IE5ldyBlbnVtZXJhdGlvbiB3aXRoIHRoZQotCXZhcmlvdXMgZmxhdm91cnMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcuCi0JKHNydHVjdCByZWxvY19ob3d0b19zdHJ1Y3QpOiBDaGFuZ2VkIGNvbXBsYWluX29uX292ZXJmbG93IGZpZWxkCi0JZnJvbSBib29sZWFuIHRvIGVtdW0gY29tcGxhaW5fb3ZlcmZsb3cuICBSZW1vdmVkIG9ic29sZXRlIGFic29sdXRlCi0JZmllbGQuCi0JKEhPV1RPKTogUmVtb3ZlZCBhYnNvbHV0ZSBhcmd1bWVudC4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvIG92ZXJmbG93IGNoZWNraW5nIG9uIGFsbCB0eXBlcyBvZgotCWZpZWxkcy4KLQkqIGJmZC1pbjIuaDogVXBkYXRlZCBhY2NvcmRpbmdseS4KLQkqIGFsbCB0YXJnZXRzOiBVcGRhdGVkIGluaXRpYWxpemF0aW9uIG9mIHJlbG9jIGhvd3RvIHRhYmxlcy4KLQotV2VkIEp1bCAyMSAyMDozNDozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG9wbmNscy5jIChiZmRfY3JlYXRlKTogRG9uJ3QgdXNlIEMrKyBrZXl3b3JkICJ0ZW1wbGF0ZSIgYXMgYSBDCi0JdmFyaWFibGUgbmFtZS4KLQotVHVlIEp1bCAyMCAxNTowMjoyMyAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKG02OGtfaG93dG8ycnR5cGUpOiAgTWFrZSBhcmcgQ09OU1QgdG8gbWF0Y2ggY2FsbGVycy4KLQotCSogZWxmY29kZS5oOiAgRml4IHNldmVyYWwgaWxsZWdhbCBwb2ludGVyIGNvbWJpbmF0aW9uIHdhcm5pbmdzIGZvcgotCXVzYWdlcyBvZiBiZmRfYWxsb2MgYW5kIGFsbG9jYS4KLQotCSogbGlibmxtLmggKG5sbV9vYmpfdGRhdGEpOiAgUmVuYW1lIGhpZGRlbiBzdHJ1Y3QgbWVtYmVycyB0byBhdm9pZAotCWFwcGFyZW50IFN1biBDIHByZXByb2Nlc3NvciByZWN1cnNpb24uICBGaXggYWNjZXNzIG1hY3Jvcy4KLQkqIG5sbWNvZGUuaDogIFJlbW92ZSBzcHVyaW91cyAnJicgYmVmb3JlIHNldmVyYWwgYXJyYXkgcmVmZXJlbmNlcy4KLQotVHVlIEp1bCAyMCAxNDozNjoyNyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lIGZvciBET1MgdW5pcXVlbmVzczogY29mZi1tNjhrLXVuLmMgLT4gY29mZi11NjhrLmMKLQljb25maWcvbTY4ay1jb2ZmdW4ubXQgLT4gdTY4ay1jb2ZmLm10LgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UdWUgSnVsIDIwIDE2OjIxOjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRG9uJ3QgdXNlICImIiBiZWZvcmUKLQlmdW5jdGlvbiBuYW1lOyBpdCdzIHZhbGlkIHdpdGhvdXQsIGFuZCBzb21lIGNvbXBpbGVycyBnaXZlCi0Jd2FybmluZ3Mgd2l0aCBpdCB0aGVyZS4KLQotVHVlIEp1bCAyMCAwODoyMToxNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6ICBBcHBseSBzb21lIG9mIHRoZSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlIHRvIGJmZC1pbjIuaC4KLQkqIGJmZC5jICh1bmlvbiB0ZGF0YSk6ICBBZGQgbmxtX29ial9kYXRhOwotCSogdGFyZ2V0cy5jIChlbnVtIHRhcmdldF9mbGF2b3VyKTogIEFkZCBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLgotCi1Nb24gSnVsIDE5IDIwOjQ2OjE4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXR3YXJlLCBpWzM0XTg2LSotbmV0d2FyZSk6ICBOZXcgY29uZmlncy4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6ICBBZGQgbmxtLm8sIG5sbTMyLm8sIG5sbTMyLWdlbi5vLgotCSogTWFrZWZpbGUuaW4gKEJGRDY0X0JBQ0tFTkRTKTogIEFkZCBubG02NC5vLCBubG02NC1nZW4uby4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIG5sbXszMiw2NH0uYywgbmxtezMyLDY0fS1nZW4uYy4KLQkqIE1ha2VmaWxlLmluIChubG0ubywgbmxtezMyLDY0fS5vLCBubG17MzIsNjR9LWdlbi5vOiAgTmV3IHRhcmdldHMuCi0JKiBiZmQtaW4yLmggKElOTElORSk6ICBEZWZpbmVzIG1vdmVkIGhlcmUuCi0JKiB7YW91dHguaCwgZWxmLmMsIGVsZmNvZGUuaH06ICBNb3ZlIElOTElORSBkZWZpbmVzIHRvIGJmZC1pbjIuaC4KLQkqIGxpYmVsZi5oIChDQVQ0KTogIE1vdmUgZGVmaW5lIHRvIGJmZC1pbjIuaC4KLQkqIGJmZC1pbjIuaCAoQ0FUNCk6ICBNZXJnZSBDQVQ0IG1hY3JvIHdpdGggb3RoZXIgQ0FUIG1hY3Jvcy4KLQkqIGJmZC1pbjIuaCAodW5pb24gdGRhdGEpOiAgQWRkIG5sbV9vYmpfZGF0YS4KLQkqIGJmZC1pbjIuaCAoZW51bSB0YXJnZXRfZmxhdm91cik6ICBBZGQgYmZkX3RhcmdldF9ubG1fZmxhdm91ci4KLQkqIHRhcmdldHMuYyAoYmZkX25sbXszMiw2NH1fe2JpZyxsaXR0bGV9X3ZlYyk6ICBBZGQgcHJvdG90eXBlcy4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBBZGQgYmZkX25sbXszMiw2NH1fe2JpZyxsaXR0bGV9X3ZlYy4KLQkqIChsaWJubG0uaCwgbmxtLmMsIG5sbWNvZGUuaCwgbmxtezMyLDY0fS1nZW4uYywKLQlubG17MzIsNjR9LXRhcmdldC5oLCBubG17MzIsNjR9LmMsIGNvbmZpZy9pMzg2LW5sbS5tdCk6ICBOZXcgZmlsZXMKLQlmb3IgTkxNIHN1cHBvcnQuCi0KLU1vbiBKdWwgMTkgMTU6MDk6MDEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUue2hvc3RzLGlufTogYWRkIGlbMzRdODYtKi1seW54b3MqIHN1cHBvcnQKLQotTW9uIEp1bCAxOSAxNDo1MzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGVsZi5jLCBlbGZjb2RlLmgsIGxpYmVsZi5oOiBTZXJpb3VzIHJlb3JnYW5pemF0aW9uLgotCURlbGV0ZWQgYHRodW5rJyBzdHJ1Y3R1cmUsIG1lcmdlZCBpbnRvIHRkYXRhLCBkdXBsaWNhdGUgZGF0YQotCWVsaW1pbmF0ZWQuCi0JUmVhcnJhbmdlZCBmdW5jdGlvbnMsIGdyb3VwaW5nIGJ5IGZ1bmN0aW9uYWxpdHkuCi0JQnJva2UgdXAgbWFueSBmdW5jdGlvbnMgaW4gZWxmY29kZS5oLCByZS1vcmRlcmVkIG1hbnkgcGFydHMgb2YKLQlmaWxlIHdyaXRpbmcgdG8gaGFuZGxlIHVucHJlZGljdGFibGUgc3RhdGUgb2Ygc2VjdGlvbiByZWxvY2F0aW9uCi0JdGFibGUgYXMgcHJvdmlkZWQgYnkgdmFyaW91cyBhcHBsaWNhdGlvbnMuCi0JU3RpbGwgbmVlZHMgY2xlYW51cDogTWVyZ2UgZnVuY3Rpb25zIGJhY2sgdG9nZXRoZXIsIHNwbGl0IG91dAotCWRhdGEgc3RydWN0dXJlIHdpdGggb25seSBkYXRhIHRoYXQgaXMgdXNlZCBvbmx5IHdoZW4gd3JpdGluZyBvdXQKLQlvYmplY3QgZmlsZS4KLQotCSogZWxmLmMgKGJmZF9lbGZfZ2VuZXJpY19yZWxvYyk6IE5ldyBmdW5jdGlvbiwgdGFrZW4gZnJvbQotCWNvZmYtbWlwcy5jLgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogVXNlIGl0LCB0byB3b3JrIGFyb3VuZAotCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gbG9zc2FnZS4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogSW5jbHVkZSBjb2ZmLW1pcHMubyBhbmQgY29mZi1tc3ltLm8sIHNvCi0JdGhhdCBnZGIgd2lsbCBsaW5rLgotCShvZmlsZXMpOiBEb24ndCB1c2Ugc29ydCBvciB1bmlxOyBkbyBpdCB3aXRoIHNoIGNvbnN0cnVjdHMuCi0KLVN1biBKdWwgMTggMTk6NDI6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBSZWNvZ25pemUgSTM4NlBUWE1BR0lDLgotCSogYW91dGYxLmgsIGxpYmFvdXQuaDogQWRkIE1fMzg2X0RZTklYLgotCSogdHJhZC1jb3JlLmMgKFRSQURfQ09SRV9VU0VSX09GRlNFVCwgVFJBRF9DT1JFX1NUQUNLX0ZJTEVQT1MpOgotCU5ldyBtYWNyb3M7IHVzZSBpdCBpZiBkZWZpbmVkLgotCSogY29uZmlnL3N5bW1ldHJ5Lm1oLCBob3N0cy9zeW1tZXRyeS5oOiBOZXcgZmlsZXMuCi0KLUZyaSBKdWwgMTYgMTQ6NTY6MzEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBSZW5hbWUgZWxmezMyLDY0fS1nZW5lcmljLmMgdG8gKi1nZW4uYyBmb3IgMTQgY2hhciBmaWxlbmFtZXMuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFjY29yZGluZ2x5LgotCShDRklMRVMpOiBBZGQgZWxmNjQtZ2VuLmMuCi0KLUZyaSBKdWwgMTYgMDk6NTM6MjMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYzogVXNlIE1JUFNfQU9VVF97T1p9TUFHSUMgcmF0aGVyIHRoYW4ge09afU1BR0lDLgotCi1UaHUgSnVsIDE1IDE2OjAyOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tODhrLmMgKGhvd3RvX3RhYmxlKTogQ29ycmVjdGVkIGJpdHNpemUgZm9yIFJfUENSMjZMIGZyb20KLQkxNiB0byAyNi4KLQotV2VkIEp1bCAxNCAxNToyOTo1NiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIFtIT1NUX0hQUEFCU0RdOiBVc2UgaHB1eC1zdHlsZSBjb3JlIGZpbGVzLgotCSogbGliaHBwYS5oIFtIT1NUX0hQUEFCU0RdOiBJbmNsdWRlIGhwdXggdmVyc2lvbiBvZiBjb3JlLmgKLQotV2VkIEp1bCAxNCAwOTozMDo0OCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBoODMwMGgtKi0qLgotCi1UdWUgSnVsIDEzIDEyOjAzOjAwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDg1MDAuYyAocmVsb2NfcHJvY2Vzc2luZywgcnR5cGUyaG93dG8pOiBOZXcgcmVsb2NhdGlvbgotCXR5cGUgUl9IODUwMF9ISUdIXzE2LgotCSogY29mZi1zaC5jIChyX2ltbTMyKTogR2V0IHRoZSB3aWR0aCBvZiB0aGUgcmVsb2MgcmlnaHQuCi0KLVR1ZSBKdWwgMTMgMTY6NDg6NTYgMTk5MyAgRnJlZGVyaWMgUGllcnJlc3RlZ3V5IChGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIpCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG5ldyB0YXJnZXQgbTY4ay1jb2ZmdW4gdG8gdGhlIGRweC8yLgotCSogY29uZmlnL202OGstY29mZnVuLm10OiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIGNvbmZpZy9kcHgyLm10LgotCi1Nb24gSnVsIDEyIDEwOjQyOjQ5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBNb3ZlIFNQQVJDX0JBU0UxMyByZWxvYyBpbnRvCi0Jc3BhcmMtYW91dC1zcGVjaWZpYyBsaXN0LgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgZmllbGQgYHRodW5rJy4KLQotCSogY29uZmlnL3NwYXJjLWVsZi5tdCAoVEFSR0VUX0JBQ0tFTkRTKTogTmV3IG1ha2UgdmFyaWFibGUuCi0KLVRodSBKdWwgIDEgMTQ6NTI6NDcgMTk5MyAgRnJlZGVyaWMgUGllcnJlc3RlZ3V5IChGLlBpZXJyZXN0ZWd1eUBmcmNsLmJ1bGwuZnIpCi0JCQkgIGFuZCBKaW0gS2luZ2RvbiAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmg6IFVzZSBtZW1zZXQgbm90IGJ6ZXJvLgotCSogdHJhZC1jb3JlLmM6IERvbid0IGluY2x1ZGUgPHN5cy9maWxlLmg+LgotCSogaTM4NmxpbnV4Lmg6IEluY2x1ZGUgPHN5cy9maWxlLmg+LgotCSogY29mZi1tNjhrLXVuLmM6IG5ldyBmaWxlIHRvIGhhbmRsZSBuYW1lcyB3aXRoIHVuZGVyc2NvcmVzIG9uCi0Jc3ZyMyBtYWNoaW5lcy4KLQkqIGNvZmYtbTY4ay5jIChtNjhrX3J0eXBlMmhvd3RvKTogYWRkZWQgI2lmZGVmIE9OTFlfREVDTEFSRV9SRUxPQ1MKLQl0byBub3QgZHVwbGljYXRlIHRoZSBmdW5jdGlvbiBpbiB0aGUgZXhlY3V0YWJsZS4KLQkoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUsIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSk6IG5ldyBtYWNyb3MgbmVlZGVkCi0JYnkgY29mZi1tNjhrLXVuLmMuCi0JKiBjb2ZmY29kZS5oIChNQzY4S0JDU01BR0lDKTogY2FzZSBhZGRlZC4KLQkqIHRhcmdldHMuYzogQWRkIG02OGtjb2ZmdW5fdmVjLgotCSogY29uZmlndXJlLmhvc3Q6IGFkZGVkIHN1cHBvcnQgZm9yIEJ1bGwgZHB4LzIuCi0JKiBjb25maWcvZHB4Mi5taCwgaG9zdHMvZHB4Mi5oOiBuZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgdGFyZ2V0IGNvZmYtbTY4ay11bi4KLQotRnJpIEp1bCAgOSAwMDo0MzowNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmg6IEFkZCBkZWZpbml0aW9uIG9mIE1BQ0hUWVBFX09LLgotCi1UaHUgSnVsICA4IDE0OjM3OjQ0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IHN1YnRyYWN0IHRoZSBhZGRlbmQKLQlhZ2FpbiBmb3IgY29mZi4KLQotCSogc3ltcy5jLCBiZmQtaW4yLmg6IERvYyBmaXguCi0KLQkqIGNvZmZjb2RlLmggKENBTENfQURERU5EKTogQ2hlY2sgZm9yIGNvbW1vbiBzZWN0aW9uIHVzaW5nIHRoZQotCXNlY3Rpb24gZmxhZyBhcyB3ZWxsIGFzIHRoZSBzeW1ib2wgZmxhZy4KLQotVGh1IEp1bCAgOCAxMzo0Mzo1MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmJzZC5oOiBDb25kaXRpb25hbGl6ZSBIT1NUX1NUQUNLX0VORF9BRERSIG9uIF9fYnNkaV9fLgotCWkzODZic2QuYzogUmVtb3ZlIGRlZmluZXMgb2YgTl9UWFQqOyB0aGUgdmVyc2lvbnMgaW4gYW91dDY0Lmggc2hvdWxkCi0JYmUgc3VmZmljaWVudC4gIERlZmluZSBURVhUX1NUQVJUX0FERFIuCi0KLVdlZCBKdWwgIDcgMTA6NTY6MjEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogUmVtb3ZlZCBzdGF0ZXAKLQlhcmd1bWVudC4gIEp1c3QgbGV0IGFuIGluZGlyZWN0IHN5bWJvbCBwb2ludCB0byB0aGUgbmV4dCBzeW1ib2wKLQl3aXRob3V0IGZvcmNpbmcgdGhlIG5leHQgc3ltYm9sIHRvIGJlIHVuZGVmaW5lZC4gIENoYW5nZWQgYWxsCi0JY2FsbGVycy4KLQkqIGhwMzAwaHB1eC5jIChzbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2VkIGNhbGwgdG8KLQl0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLgotCSogdGFyZ2V0cy5jOiBBZGRlZCBocDMwMGhwdXhfdmVjLgotCSogTWFrZWZpbGUuaW4gKGhwMzAwaHB1eC5vKTogQWRkZWQgZGVwZW5kZW5jaWVzLgotCi1UdWUgSnVsICA2IDEzOjI0OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogUHV0IHNpbXBsZSBwb3dlci1vZi10d28KLQlyZWxvY3MgdG9nZXRoZXIsIGFuZCBhZGQgNjQtYml0IHZlcnNpb25zLgotCShiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBBcmd1bWVudCB0byBhbGxvY2EKLQlpcyBzaXplX3QuCi0KLQkqIGxpYmJmZC5jIChiZmRfeG1hbGxvY19ieV9zaXplX3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBvcG5jbHMuYyAoYmZkX2NhY2hlX2luaXQsIGJmZF9vcGVuX2ZpbGUpOiBBZGQgcHJvdG90eXBlcyB0bwotCWRlY2xhcmF0aW9ucy4KLQkob2JzdGFja19jaHVua19hbGxvYyk6IFVzZSBiZmRfeG1hbGxvY19ieV9zaXplX3QuCi0JKG5ld19iZmQpOiBQcm90b3R5cGUtc3R5bGUgZGVmaW5pdGlvbiwgdXNpbmcgREVGVU4uCi0JKGJmZF9hbGxvY19ncm93LCBiZmRfYWxsb2MsIGJmZF96YWxsb2MsIGJmZF9yZWFsbG9jKTogU2l6ZQotCWFyZ3VtZW50IGlzIHR5cGUgc2l6ZV90LCBub3QgYmZkX3NpemVfdHlwZS4KLQkqIGllZWUuYyAob2JzdGFja19jaHVua19hbGxvYyk6IFVzZSBiZmRfeG1hbGxvY19ieV9zaXplX3QuCi0JKiBiZmQuYyAoYmZkX2RlZmF1bHRfZXJyb3JfdHJhcCwgYmZkX2Vycm9yX3RyYXAsCi0JYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibHRyYXApOiBQcm90b3R5cGVzLgotCSogbGliYmZkLWluLmggKGJmZF9hbGxvYywgYmZkX3phbGxvYywgYmZkX3JlYWxsb2MsCi0JYmZkX2FsbG9jX2dyb3cpOiBBZGp1c3RlZCBwcm90b3R5cGVzIGZvciBhcmcgdHlwZSBjaGFuZ2UuCi0JKiBhcmNoaXZlLmMgKGdldF9lbHRfYXRfZmlsZXBvcywgZG9fc2x1cnBfYnNkX2FybWFwLCBub3JtYWxpemUsCi0JZG9fc2x1cnBfY29mZl9hcm1hcCwgYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKToKLQlQcm90b3R5cGVzLgotCSogZWxmY29kZS5oIChlbGZfc3RyaW5nX2Zyb21fZWxmX3N0cnRhYik6IFByb3RvdHlwZXMuCi0JKiBsaWJlbGYuaCAoZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uLCBlbGZfZ2V0X3N0cl9zZWN0aW9uKToKLQlQcm90b3R5cGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogUmVuYW1lZCBmcm9tIEJGRF9NQUNISU5FUy4KLQkob2ZpbGVzKTogTmV3IHRhcmdldC4gIEJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZmlsZSBuYW1lcywgaW4gY2FzZQotCWFueSBnb3QgZHVwbGljYXRlZC4KLQkoVEFSR0VUTElCKTogVXNlIGxpc3Qgb2YgZmlsZXMgZnJvbSBvZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFNldCBCRkRfTUFDSElORVMgYW5kIEJGRF9CQUNLRU5EUyBkZXBlbmRpbmcgb24KLQltaW5pbWFsLWJmZCBmbGFnIGFuZCB0YXJnZXQgbWFrZWZpbGUgZnJhZyBjb250ZW50cy4KLQotCSogZWxmY29kZS5oIChlbGZfcmVhZCk6IERlbGV0ZSBzdGF0aWMgZGVjbGFyYXRpb24sIHNpbmNlIGZ1bmN0aW9uCi0JaGFzIG1vdmVkLgotCShlbGZfbWFwX3N5bWJvbHMpOiBXcml0ZSBvdXQgc2VjdGlvbiBzeW1ib2xzIGZvciBhbGwgc2VjdGlvbnMsIGZvcgotCW5vdy4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBBbGxvdyBtYXRjaCBpZiBib3RoIHN5bWJvbHMgYXJlCi0Jc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgc2FtZSBzZWN0aW9uLgotCShlbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBEb24ndCBwcmludCBtZXNzYWdlLCBqdXN0IHJldHVybiBmYWxzZS4KLQotCSogbGliZWxmLmggKGJmZF9lbGZfbG9jYXRlX3NoKTogRGVjbGFyYXRpb24gZGVsZXRlZC4KLQotTW9uIEp1bCAgNSAxNjo0ODoxMSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjcHUtaDgzMDAuYyAoaDgzMDBfc2Nhbik6IEZpeCBwYXJzaW5nIG9mIGFyY2hpdGVjdHVyZSBzdHJpbmcuCi0KLUZyaSBKdWwgIDIgMTg6Mjc6MDAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IFJlbW92ZSBiZmQuaCBhbmQgc3RtcC1iZmQuaC4KLQkocmVhbGNsZWFuKTogUmVtb3ZlIGdlbmVyYXRlZCBoZWFkZXJzLgotCi1GcmkgSnVsICAyIDE0OjUxOjUxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc2VjdGlvbi5jIChiZmRfc2V0X3NlY3Rpb25fY29udGVudCk6ICBEZW55IGlmIGZpbGUgaXMgbm90IG9wZW5lZCB3aXRoCi0JdGhlIHByb3BlciBtb2RlLCBzZXQgb3V0cHV0X2hhc19iZWd1biBpZiBmaWxlIGlzIG9wZW5lbmVkIGZvciB1cGRhdGUuCi0JKiBhb3V0eC5oIChhb3V0Xypfc2V0X3NlY3Rpb25fY29udGVudCk6ICBSZW1vdmUgY2hlY2tzIHRoYXQgYXJlIG5vdwotCWRvbmUgaW4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnQuCi0KLUZyaSBKdWwgIDIgMDk6MjU6MjAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oOiBSZW1vdmVkIGRlY2xhcmF0aW9ucyBvZiBwcmludGYsIGZwcmludGYsCi0JZmNudGwsIGZyZWFkIGFuZCBmd3JpdGUuICBUaGV5IGFyZSBhbGwgZXJyb3IgcHJvbmUgZm9yIG9uZSByZWFzb24KLQlvciBhbm90aGVyLiAgQ2hhbmdlZCBkZWNsYXJhdGlvbiBvZiBtZW1jaHIgZnJvbSBjaGFyICogdG8gUFRSLgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1yaXNjb3MqKTogTmV3IHRhcmdldDsgdXNlIHJpc2Nvcy4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLSotcmlzY29zKik6IE5ldyBob3N0OyB1c2UgcmlzY29zLgotCSogY29uZmlnL3Jpc2Nvcy5taCAoSERFRklORVMpOiBBZGQgLUcgNC4KLQotCSogbGliYW91dC5oIChHRVRfU1dPUkQpOiBVc2UgdGhlIGJmZF9oX2dldF9zaWduZWQgZW50cnkgcG9pbnRzCi0JcmF0aGVyIHRoYW4gY2FzdGluZyB0aGUgcmVzdWx0IG9mIGJmZF9oX2dldC4KLQotRnJpIEp1bCAgMiAxMDoxMzo0OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBob3N0cy9kZWx0YTY4LmgsIGNvbmZpZy9kZWx0YTY4Lm1oOiBBZGQgc3R1ZmYgZm9yCi0JTW90b3JvbGEgRGVsdGEgNjguCi0KLVdlZCBKdW4gMzAgMDY6MDI6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGY2NF97YmlnLGxpdHRsZX1fZ2VuZXJpY192ZWMpOiBEZWNsYXJlLCBhbmQKLQlpbmNsdWRlIGluIHNlYXJjaCBsaXN0IGlmIEJGRDY0IGlzIGRlZmluZWQuCi0KLQkqIGxpYmVsZi5oIChDQVQ0KTogQWRkZWQgYSB2ZXJzaW9uIGZvciBTYWJlci1DLCBBTlNJIG1vZGUuCi0JKGJmZF9lbGY2NF8qKTogRGVjbGFyYXRpb25zIGZvciA2NC1iaXQgdmVyc2lvbnMgb2YgbWFueSByb3V0aW5lcy4KLQotVHVlIEp1biAyOSAyMjo1MDo1OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZjY0LXRhcmdldC5oLCBlbGY2NC1nZW5lcmljLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChCRkQ2NF9CQUNLRU5EUyk6IEluY2x1ZGUgZWxmNjQtZ2VuZXJpYy5vLgotCShlbGY2NC1nZW5lcmljLm8pOiBMaXN0IGRlcGVuZGVuY2llcy4KLQotCSogTWFrZWZpbGUuaW46IExpc3QgdGFyZ2V0IGBhbGwnIGV4cGxpY2l0bHkgYmVmb3JlIGhvc3QvdGFyZ2V0Ci0JbWFrZWZpbGUgZnJhZ21lbnRzIGFyZSBpbmNsdWRlZCwgaW4gY2FzZSB0aGV5IGRlZmluZSBhbnkgbmV3Ci0JdGFyZ2V0cy4KLQotCSogZWxmY29kZS5oIChFTEZfUl9JTkZPLCBFTEZfUl9TWU0pOiBEZWZpbmUgYXMgMzItIG9yIDY0LWJpdAotCXZlcnNpb25zIGFzIGFwcHJvcHJpYXRlLiAgVXNlcyB1cGRhdGVkLgotCShlbGZfZGVidWdfc2VjdGlvbik6IERlY2xhcmUgYmVmb3JlIHVzZS4KLQkoZWxmX2RlYnVnX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkciwgYmZkX3NoZHJfZnJvbV9zZWN0aW9uLCBlbGZfZmFrZV9zZWN0aW9ucyk6Ci0JQWxpZ25tZW50IHZhbHVlIGluIHNlY3Rpb24gaGVhZGVyIGlzIG5fYnl0ZXMsIG5vdCBsb2cyLgotCShuZXdfc2VjdGlvbl9ob29rKTogRG8gbm90aGluZyBmb3Igbm93LgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgRWxmX0V4dGVybmFsX1JlbFthXSwgbm90IDMyLWJpdAotCXZlcnNpb24gZXhwbGljaXRseS4KLQkoZWxmX2NvcmVfZmlsZV9wKTogU2ltcGxpZnkgY2hlY2sgZm9yIGNvcnJlY3QgY2xhc3MgKHdvcmQgc2l6ZSkuCi0JKGVsZl9tYWtlX3NlY3Rpb25zLCBlbGZfZmFrZV9zZWN0aW9ucywgZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6Ci0JSW5pdGlhbGl6ZSBhbGwgZmllbGRzIHdoZW4gY3JlYXRpbmcgZGF0YSBzdHJ1Y3R1cmVzLgotCShlbGZfbG9jYXRlX3NoKTogUmVuYW1lZCBmcm9tIGJmZF9lbGZYWF9sb2NhdGVfc2gsIG1hZGUgc3RhdGljLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2V0IGNvcnJlY3QgY2xhc3MgaW4gb3V0cHV0Ci0JZmlsZS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNlY3Rpb24gc3ltYm9scyBoYXZlIGVtcHR5IG5hbWVzIGluCi0Jb3V0cHV0IGZpbGUuCi0KLQkqIGxpYmJmZC5jIChiZmRfeG1hbGxvYywgemFsbG9jKTogQmUgc3VyZSB0byBjYXN0IG1hbGxvYywgbWVtc2V0Ci0JYXJncyB0byBzaXplX3QgYmVmb3JlIGNhbGwuCi0JKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKTogQ2FzdCB6YWxsb2MgYXJnIHRvIGJmZF9zaXplX3R5cGUuCi0KLVR1ZSBKdW4gMjkgMTA6NDk6NDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBJZiBwcm9jZWR1cmUgaGFzIG5vIGxpbmUKLQludW1iZXIgaW5mb3JtYXRpb24sIHJldHVybiAwIGZvciBsaW5lIG51bWJlci4KLQotTW9uIEp1biAyOCAxMDo0NTowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogSWYgKm9sZHJhd3B0ciBpcyBub24tTlVMTCwgY29weSBpdAotCWludG8gKnJhd3B0ci4KLQotU3VuIEp1biAyNyAwOTowNToxOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvcmlzY29zLmg6IERlZmluZSBOQlBHIGFuZCBVUEFHRVMuCi0KLVN1biBKdW4gMjcgMTY6Mjg6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHVzZSBvYmpfcmF3X3N5bXMgYXMKLQlsdmFsdWU7IGl0IGNvbnRhaW5zIGEgY2FzdC4KLQotRnJpIEp1biAyNSAxNzowOTo1NSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGhhc2gsIGNvbXBhcmUsIHN0cnVjdCBzdHJpbmd0YWJfZW50cnksIGFkZF90b19zdHJpbmd0YWIpOgotCVVzZSB1bnNpZ25lZCBoYXNoIHZhbHVlcyBmb3IgYmV0dGVyIGhhc2hpbmcuCi0JKGhhc2gpOiBIYXNoIGluIHRoZSBzdHJpbmcgbGVuZ3RoIGZvciBsb25nIHN0cmluZ3MuCi0KLVRodSBKdW4gMjQgMTU6NDc6NTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChjb21wYXJlKTogUmVwbGFjZSAzIGlmJ3Mgd2l0aCBhIHN1YnRyYWN0aW9uLgotCSh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncywgYWRkX3RvX3N0cmluZ3RhYik6IFJlb3JkZXIgdGVzdHMKLQlpbiBkZWNyZWFzaW5nIG9yZGVyIG9mIHN1Y2Nlc3MsIGFzIGFuIG9wdGltaXphdGlvbi4KLQkoaGFzaCk6IFRha2UgYSBsZW5ndGggYXJnOyBpZ25vcmUgY2hhcnMgYWZ0ZXIgIzI1LCBmb3Igc3BlZWQuCi0JKGFkZF90b19zdHJpbmd0YWIpOiBQYXNzIGxlbmd0aCB0byBoYXNoLgotCi1UaHUgSnVuIDI0IDE3OjI1OjUxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBlbGYzMi1zcGFyYy5jIChzcGFyY19yZWxvY19tYXApOiBBZGQgU1BBUkNfV0RJU1AyMiByZWxvYy4KLQotCSogZWxmY29kZS5oIChlbGZfbmV3X3NlY3Rpb25faG9vayk6IERvIG5vdGhpbmcgZm9yIG5vdy4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE91dHB1dCBjb21tb24gc3ltYm9scyB0aGUgd2F5IEVMRgotCXdhbnRzIHRoZW0uCi0KLVdlZCBKdW4gMjMgMTY6MjA6MDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSBhbmQgYXNzb2NpYXRlZCBtYWNyb3MpOiBNb3ZlZAotCWhlcmUgZnJvbSBlbGZjb2RlLmguICBBIGNvdXBsZSBvZiBzaXplLXNwZWNpZmljIHN0cnVjdHVyZSBwb2ludGVycwotCXdlcmUgY2hhbmdlZCB0byBQVFI7IHVzZXMgZml4ZWQgYXBwcm9wcmlhdGVseS4KLQkoZWxmMzJfc3ltYm9sX3R5cGUsIGVsZjY0X3N5bWJvbF90eXBlKTogU2VwYXJhdGVkIGRlZmluaXRpb25zLgotCShiZmRfZWxmX21rb2JqZWN0KTogUmVuYW1lZCBmcm9tIGJmZF9lbGYzMl9ta29iamVjdC4KLQkoYmZkX2VsZjMyX21rb2JqZWN0LCBiZmRfZWxmNjRfbWtvYmplY3QsIGVsZl9ta29iamVjdCk6IE5ldwotCXRlbXBvcmFyeSBtYWNyb3MgdG8gZWFzZSBuYW1lIGNoYW5nZS4KLQkqIGVsZi5jIChlbGZfcmVhZCwgZWxmX21rb2JqZWN0LCBlbGZfZ2V0X3N0cl9zZWN0aW9uLAotCWVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiwgYmZkX2VsZl9maW5kX3NlY3Rpb24pOiBNb3ZlZCBoZXJlCi0JZnJvbSBlbGZjb2RlLmguCi0JKiBkb2MvTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogUHJvY2VzcyBlbGYuYyB0b28uCi0JKiBNYWtlZmlsZS5pbiAoZWxmLm8pOiBOb3RlIG5ldyBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZmNvZGUuaDogTG90cyBvZiBzdHVmZiBtb3ZlZCBlbHNld2hlcmUuICBEZWxldGVkIHNvbWUgdW51c2VkCi0JY29kZSwgdHdlYWtlZCBzb21lIGRlYnVnIGhvb2tzLgotCShlbGZfc2x1cnBfcmVsb2NhX3RhYmxlKTogVHJhbnNsYXRlIEVMRiBzZWN0aW9uIHN5bWJvbHMgaW50byBCRkQKLQlzZWN0aW9uIHN5bWJvbHMuCi0KLVdlZCBKdW4gMjMgMTE6MzQ6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3Jpc2Nvcy5oOiBOZXcgZmlsZS4KLQotVHVlIEp1biAyMiAxNDozNToyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGNhc2UgU0hUX1BST0dCSVRTKTogRXZlbiBpZgotCXNlY3Rpb24gYWxyZWFkeSBleGlzdHMsIHVzZSBpdHMgcG9pbnRlciB0byBmaWxsIGluIHJhd2RhdGEgc2xvdC4KLQotVHVlIEp1biAyMiAxNjozNjo1MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogUmV0dXJuIHZhbHVlIG9mIHB1dHMgYW5kIGZwdXRzIGlzIGludCBub3Qgdm9pZC4KLQotVHVlIEp1biAyMiAxNDoyNTo1OCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX2V4dCk6IENvbW1lbnQgdGhlIGZpZWxkIG5hbWVzLgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBtYXggYW5kIG1pbiB2YWx1ZXMuCi0KLU1vbiBKdW4gMjEgMTg6MTk6MTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGYzMi1ocHBhLmMsIGVsZmNvZGUuaDogVXNlIG5ldwotCXNpemUtaW5kZXBlbmRlbnQgZWxmIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4KLQkqIGVsZmNvZGUuaCAocHV0X3dvcmQsIGdldF93b3JkKTogRGVmaW5lIGFzIGFwcHJvcHJpYXRlIGZvcgotCWFyY2hpdGVjdHVyZSB3b3JkIHNpemUuICBTdHJ1Y3R1cmUgc3dhcHBpbmcgZnVuY3Rpb25zIGNoYW5nZWQgdG8KLQl1c2UgdGhlbSBhcyBhcHByb3ByaWF0ZS4KLQotCSogY29uZmlndXJlLmluOiBJZiBjb21waWxpbmcgNjQtYml0IGJhY2sgZW5kcywgZG8gdGhlbSBiZWZvcmUKLQkzMi1iaXQgb25lcy4KLQotCSogbGliZWxmLmg6IFVzZSBuZXcgc2l6ZS1pbmRlcGVuZGVudCB2ZXJzaW9ucyBvZiBlbGYgaW50ZXJuYWwgZGF0YQotCXN0cnVjdHVyZXMuCi0JKHN5bWJvbF90eXBlKTogUmVvcmRlcmVkIHRvIHB1dCBhbnkgZmllbGRzIGRlcGVuZGVudCBvbiB0YXJnZXQKLQlzaXplIGF0IHRoZSBlbmQuCi0JKGVsZl9iYWNrZW5kX2RhdGEpOiBSZW5hbWVkIGZyb20gZWxmIyNfYmFja2VuZF9kYXRhIGFuZCBtYWRlCi0Jc2l6ZS1pbmRlcGVuZGVudC4KLQkoZWxmX3NlY3RfdGh1bmspOiBOb3cgc2l6ZS1pbmRlcGVuZGVudC4KLQotCSogbGliYmZkLmMgKGJmZF9sb2cyKTogTm93IHJldHVybnMgdW5zaWduZWQgaW50LgotCi1Nb24gSnVuIDIxIDEyOjMwOjQ3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBSZW5hbWUgY29uZmlnL204OGstYW91dC5tdCB0byBjb25maWcvbm9vcC5tdC4KLQljb25maWd1cmUuaW46IFVzZSBpdCBmb3IgbWlwcy0qLWJzZCouCi0KLVN1biBKdW4gMjAgMjA6MzI6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBFbGltaW5hdGUgInBhcnRpYWxseSBicmFja2V0ZWQKLQlpbml0aWFsaXplciIgd2FybmluZyBmcm9tIGdjYy4KLQkqIGNwdS1oODUwMC5jIChhcmNoX2luZm9fc3RydWN0KTogTGlrZXdpc2UuCi0JKiBjcHUtc2guYyAoYXJjaF9pbmZvX3N0cnVjdCk6IExpa2V3aXNlLgotCi0JKiBjcHUtaDgzMDAuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwLCBob3d0bypfY2FsbGJhY2ssCi0JaG93dG9fKik6IFVudXNlZCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBjb21tZW50ZWQgb3V0LgotCSogY3B1LXo4ay5jIChsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGhvd3RvKl9jYWxsYmFjaywKLQlob3d0b18qKTogTGlrZXdpc2UuCi0JKiBjcHUtaDg1MDAuYyAoY29tcGF0aWJsZSk6IExpa2V3aXNlLgotCSogY3B1LXNoLmMgKGNvbXBhdGlibGUpOiBMaWtld2lzZS4KLQotCSogaHAzMDBocHV4LmMgKHN3YXBfc3RkX3JlbG9jX2luKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMuCi0JQWx3YXlzIHNldCBhIHZhbGlkIGxlbmd0aCB2YWx1ZSwgZXZlbiBmb3IgaW52YWxpZCBpbnB1dC4KLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3N5bWJvbHMpOiBVc2Ugc3ByaW50Zl92bWEuCi0KLQkqIGJmZC1pbi5oICh1aW50NjRfdHlwZUxPVywgdWludDY0X3R5cGVISUdILCBpbnQ2NF90eXBlLAotCXVpbnQ2NF90eXBlKTogUHJvdmlkZSBkZWZhdWx0IGRlZmluaXRpb25zLgotCSogaG9zdHMvc3RkLWhvc3QuaCAoaW50NjQgc3R1ZmYpOiBSZW1vdmUgdGhlbSBmcm9tIGhlcmUuCi0KLQkqIGJmZC1pbi5oIChzcHJpbnRmX3ZtYSk6IERlZmluZSBwYXJhbGxlbCB0byBmcHJpbnRmX3ZtYS4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY190eXBlX2xvb2t1cCk6IERlbGV0ZSB1bnVzZWQKLQl2YXJpYWJsZS4gIEFkZGVkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBCZWZvcmUgY2FzdGluZwotCXBvaW50ZXJzIHRvIGludGVnZXJzLCBtYWtlIHN1cmUgdGhlIGludGVnZXIgdHlwZSBpcyB3aWRlIGVub3VnaC4KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBEaXR0by4KLQotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBTaW5jZSBgY291bnQnIGlzIHVuc2lnbmVkLAotCWRvbid0IGJvdGhlciBjb21wYXJpbmcgZm9yIGxlc3MtdGhhbi16ZXJvLgotCShiZmRfc2V0X3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQotCSogZWxmY29kZS5oIChiZmRfYWRkX3RvX3N0cnRhYik6IE5vdyBzdGF0aWMuCi0JKHN5bV9pc19nbG9iYWwpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9tYXBfc3ltYm9scyk6IENhbGwgaXQuICBOb3cgcmV0dXJucyB2b2lkLiAgUmVtb3ZlZCB1bnVzZWQKLQlsb2NhbCB2YXJpYWJsZS4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFyayBzdHJpbmcgdGFibGVzIG90aGVyIHRoYW4gZm9yIHNlY3Rpb24KLQlhbmQgc3ltYm9sIG5hbWVzIGFzIG5vcm1hbCBzZWN0aW9ucyBoYXZpbmcgY29udGVudHMuCi0JKGZpeF91cF9zdHJ0YWJzKTogTmV3IGZ1bmN0aW9uOyBmaXhlcyB1cCBFTEYgaGVhZGVyIGZpZWxkcyBmb3IKLQlzdGFiIHNlY3Rpb25zIHdpdGggc3RyaW5nIHRhYmxlcyBhc3NvY2lhdGVkLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFwIGZpeF91cF9zdHJ0YWJzIG92ZXIgYWxsIEJGRAotCXNlY3Rpb25zLiAgUmVvcmRlcmVkIGNvbmRpdGlvbiB0ZXN0cyBmb3Igc3ltYm9sIGZsYWdzOyBkZWZhdWx0IHRvCi0JbG9jYWwtb2JqZWN0IHZhbHVlIGluc3RlYWQgb2YgZ2xvYmFsLW9iamVjdC4KLQkoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBIaWQgY29uZGl0aW9uYWxseS11c2VkIHZhcmlhYmxlCi0JaW5zaWRlIGNvbmRpdGlvbiB0ZXN0LgotCShlbGZfcHJpbnRfc3ltYm9sKTogVXNlIGZwcmludGZfdm1hLgotCShlbGZfaWR4X29mX3N5bSwgYmZkX3NoZHJfZnJvbV9zZWN0aW9uKTogVW51c2VkIGZ1bmN0aW9ucwotCWNvbW1lbnRlZCBvdXQuCi0KLQkqIGJmZC1pbi5oIChpbnQ2NF90eXBlLCB1aW50NjRfdHlwZSk6IERlZmluZSB0aGVzZSBpZiB3ZSBmYWxsCi0JYmFjayB0byAibG9uZyBsb25nIiBmb3IgSE9TVF82NF9CSVQuCi0KLQkqIGxpYmVsZi5oIChlbGZOQU1FLCBFbGZOQU1FKTogTmV3IHZlcnNpb25zIHRvIGdldCBkZXNpcmVkIHJlc3VsdHMKLQl3aXRob3V0IHVzaW5nIGludmFsaWQgQU5TSSBDIHByZXByb2Nlc3NpbmcgdG9rZW5zLgotCi0JKiBlbGYzMi10YXJnZXQuaCAoYmZkX2VsZjMyX25ld19zZWN0aW9uX2hvb2spOiBEZWxldGUgbWFjcm8uCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX25ld19zZWN0aW9uX2hvb2spOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChuZXdfc2VjdGlvbl9ob29rKTogRGVmaW5lIGhlcmUuCi0KLQkqIGhvc3RzL3NwYXJjLmgsIGhvc3RzL3N0ZC1ob3N0LmgsIGhvc3RzL2kzODZic2QuaDogUHJvdGVjdAotCWFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQotCSogaG9zdHMvbmV3cy5oOiBJbmNsdWRlIGhvc3RzL3N0ZC1ob3N0LmgsIG5vdCBwbGFpbiBzdGQtaG9zdC5oLgotCi0JKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiBHZW5lcmF0ZSBpbnRvIGN1cnJlbnQgZGlyZWN0b3J5IGJ5IGdyYWJiaW5nCi0JNjQtYml0IGRlZmluaXRpb24gKGlmIGFueSkgZnJvbSBzeXNkZXAuaC4KLQkqIGJmZC1pbi5oOiBQdXQgaW4gbWFya2VyIGZvciBzeXNkZXAuaCBpbmNsdXNpb24uCi0KLUZyaSBKdW4gMTggMTk6NTc6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogQ2hlY2sgZm9yIG92ZXJmbG93IG9uCi0JcGMtcmVsYXRpdmUgcmVsb2NhdGlvbnMgaWYgdGhlIGhvd3RvIGFza2VkIGZvciBpdC4KLQotRnJpIEp1biAxOCAxNjowMDoyMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBJZ25vcmUgbm9uemVybyBleGl0IHN0YXR1cyBmcm9tIGdyZXAuCi0KLUZyaSBKdW4gMTggMTY6NTQ6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9yaXNjb3MubXtoLHR9OiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUue2hvc3QsaW59OiBVc2UgdGhlbS4KLQotRnJpIEp1biAxOCAxMjo1NToxMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jOiBjb21tZW50IGNoYW5nZS4gIFRoaXMgaXMgYSBtaXBzIGZpbGUsIG5vdCA4OGsuCi0KLU1vbiBKdW4gMTQgMTQ6MDI6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNhY2hlLmMgKGJmZF9jYWNoZV9pbml0KTogSW5jcmVtZW50IG9wZW5fZmlsZXMgYW5kIGNhbGwgY2xvc2Vfb25lCi0JaWYgbmVjZXNzYXJ5LgotCShiZmRfb3Blbl9maWxlKTogRG9uJ3QgaW5jcmVtZW50IG9wZW5fZmlsZXMgaGVyZS4KLQotRnJpIEp1biAxOCAxMDowMDoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlbHRhODgubWg6IERvbid0IHNldCBDQy4KLQotCSogTWFrZWZpbGUuaW46IEFkZCBlbGYzMi17bWlwcyxtODhrLGdlbmVyaWN9LgotCWVsZjMyLXttaXBzLG04OGssZ2VuZXJpY30uYzogTmV3IGZpbGVzLgotCXRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6IEluY2x1ZGUgYmZkX2VsZjMyX3ttaXBzLG04OGssZ2VuZXJpY31fdmVjLgotCWVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogTWF0Y2ggZWxmMzItZ2VuZXJpYyBmb3IgYWxsIG1hY2hpbmVzIHdoaWNoCi0JZG9uJ3QgbWF0Y2ggYSBkaWZmZXJlbnQgdGFyZ2V0LgotCi1GcmkgSnVuIDE4IDAzOjEyOjEyIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JRWxpbWluYXRlICJpbnQ4X3R5cGUiLCAiaW50MTZfdHlwZSIsICJpbnQzMl90eXBlIiwgYW5kIHRoZWlyCi0JdmFyaWFudHMgZnJvbSB0aGUgQkZEIHVuaXZlcnNlLiAgTGVhdmUgdGhlIDY0LWJpdCB0eXBlcyBmb3Igbm93LAotCXNpbmNlIHRoZXkgYXJlIGluIGZsdXguCi0KLQkqIGFvdXR4LmgsIGhwMzAwaHB1eC5jOiAgRWxpbWluYXRlIG5lZWRsZXNzIChpbnQzMl90eXBlKSBjYXN0cy4KLQkqIGxpYmFvdXQuaCAoR0VUX1NXT1JEKTogIENvbnZlcnQgKGludDMyX3R5cGUpIHRvIChpbnQpLgotCSogaWVlZS5jOiAgQ29udmVydCB1aW50OGVfdHlwZSA9PiB1bnNpZ25lZCBjaGFyLgotCSogb2FzeXMuYzogIEV4dGVuc2l2ZSBjaGFuZ2VzIHRvIGVsaW1pbmF0ZSBvYnNvbGV0ZSB0eXBlcy4KLQlUaGVzZSBkZXBlbmQgb24gY2hhbmdlcyBpbiAuLi9pbmNsdWRlL29hc3lzLmggYXMgd2VsbC4KLQkqIGhvc3RzLyouaDogIFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YgYWxsIHRoZXNlIHR5cGVzLgotCi1Nb24gSnVuIDE0IDE0OjAyOjQxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBob3N0cy9kZWx0YTg4Lmg6ICNpZiAwIG91dCBzb21lIGRlY2xhcmF0aW9ucyB3aGljaCBjb25mbGljdCB3aXRoCi0Jc3lzdGVtIGhlYWRlcnMuCi0KLU1vbiBKdW4gMTQgMTc6MDg6MTggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IHJlbW92ZSBwYXJlbnRkaXIgY3J1ZnQKLQotTW9uIEp1biAxNCAxOTowNDowOSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBocHBhLmMgKGhwcGFfZ2V0X3N5bWJvbF9pbmZvKTogIFJlbW92ZSByZWR1bmRhbnQgY29weS4KLQkqIEV4cHVyZ2F0ZSByYW5kb20gREVGVU5zIHRoYXQgaGF2ZSBjcmVwdCBpbi4KLQotTW9uIEp1biAxNCAxMDoyMzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDb25zdHJ1Y3RvciBzZWN0aW9ucyBzaG91bGQKLQlvbmx5IGJlIGFsaWduZWQgdG8gYSA0IGJ5dGUgYm91bmRhcnkuCi0KLVNhdCBKdW4gMTIgMTY6MTM6MTcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0LmggKHN0cnVjdCBpbnQ2NGVfc3RydWN0KTogUmVtb3ZlIG5lZWRsZXNzIHR5cGVkZWYKLQlrZXl3b3JkLgotCi1GcmkgSnVuIDExIDE0OjI1OjM0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGZsYWdzIHRvIDEsIGJyZWFraW5nCi0JMTkyNyBidXQgZml4aW5nIHNvbWUgb3RoZXIgaW1wb3J0YW50IHRoaW5ncy4KLQotVGh1IEp1biAxMCAyMDozNjoyMiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdGQtaG9zdC5oIChpbnQ2NGVfdHlwZSk6IEZpeCBkZWZpbml0aW9uLgotCi1UaHUgSnVuIDEwIDExOjQ4OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogVXNlIFNUWVBfTUlQU19JTklUIGZvcgotCXNlY3Rpb24gbmFtZWQgX0lOSVQuICBEb24ndCBzZXQgU1RZUF9URVhUIHVubGVzcyBTRUNfQ09ERSBpcyBzZXQuCi0JKGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogVHJlYXQgYSBTVFlQX01JUFNfSU5JVCBzZWN0aW9uIGxpa2UKLQlhIFNUWVBfVEVYVCBzZWN0aW9uLgotCi1XZWQgSnVuICA5IDE2OjQ4OjEzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwsIGhlYWRlcnMpOiBkb24ndCBwdXQgY29tbWVudHMgYWZ0ZXIgYSB0YWIKLQlpbiB0aGUgYWN0aW9ucyBzZWN0aW9uIG9mIGEgcnVsZQotCi1XZWQgSnVuICA5IDE1OjAwOjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBNYXJrIFpNQUdJQyBmaWxlcyBhcyBEX1BBR0VELgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBub3QgRF9QQUdFRCwgZG9uJ3QgYWRkIHRoZQotCXNlY3Rpb24gaGVhZGVycyB0byB0ZXh0X3NpemUuICBJZiBub3QgRF9QQUdFRCwgc2V0IHRoZSBtYWdpYwotCW51bWJlciB0byBPTUFHSUMgcmF0aGVyIHRoYW4gWk1BR0lDLiAgSWYgY3JlYXRpbmcgYSBEX1BBR0VECi0JZXhlY3V0YWJsZSwgdGhlIGV4ZWN1dGFibGUgbXVzdCBmdWxseSBvY2N1cHkgYW4gZXZlbiBudW1iZXIgb2YKLQlwYWdlcy4KLQkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvLCBtYWtlX2JmZF9hc2VjdGlvbiwgZWNvZmZfbGl0dGxlX3ZlYywKLQllY29mZl9iaWdfdmVjKTogQ29uc2lzdGVudGx5IHNldCBzZWN0aW9uIGFsaWdubWVudCBwb3dlciB0byA0LAotCXNpbmNlIEVDT0ZGIHNlY3Rpb25zIHNob3VsZCBiZSBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCi0JKGVjb2ZmX2xpdHRsZV92ZWMsIGVjb2ZmX2JpZ192ZWMpOiBBZGRlZCBEX1BBR0VEIHRvIG9iamVjdF9mbGFncy4KLQlNYWRlIGFyX3BhZF9jaGFyIGFuZCBhcl9tYXhfbmFtZWxlbiBhZ3JlZSBmb3IgYm90aC4KLQotVHVlIEp1biAgOCAyMDoyODowMiAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyKQotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBzdWJ0cmFjdCBzZWN0aW9uIHZtYSBmcm9tCi0Jc3ltYm9sIHZhbHVlLCBzaW5jZSBiZmQgc3ltYm9scyBhcmUgc2VjdGlvbiByZWxhdGl2ZSwgYnV0IEVMRgotCXN5bWJvbHMgYXJlbid0LgotCi1UdWUgSnVuICA4IDEyOjA4OjI3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNwdS1pOTYwLmMsIGNwdS1oODMwMC5jIChjb21wYXRpYmxlKTogTWFrZSBzdGF0aWMuCi0KLVR1ZSBKdW4gIDggMTQ6Mjc6NTYgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9uZXdzLmgsIGNvbmZpZy9uZXdzLm1oOiBOZXcgZmlsZXMuCi0KLVR1ZSBKdW4gIDggMTI6MDg6MjcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogYmZkLWluMi5oLCBhcmNodXJlcy5jIChiZmRfbWFjaF9oODMwMFtoXSk6IG5ldyBkZWZpbmVzLgotCSogY29mZi1oODMwMC5jOiBNb3JlIGFkZHJlc3NpbmcgbW9kZXMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IENvcGUgd2l0aCBIODMwMCBtYWdpYwotCW51bWJlci4KLQkqIGNwdS1oODMwMC5jOiBSZW1vdmVkIGRpc2Fzc2VtYmxlIHN0dWZmLiAoaDgzMDBfc2Nhbik6IFJlY29nbmlzZQotCUg4LzMwMEggbmFtZS4gKGNvbXBhdGlibGUpOiBOZXcgZnVuY3Rpb24uCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWMpOiBDb3BlIHdpdGggbW9yZQotCWFkZHJlc3NpbmcgbW9kZXMuCi0KLVR1ZSBKdW4gIDggMTA6MzA6MTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAotCWVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE9ubHkgcm91bmQgdG8gcGFnZSBib3VuZGFyaWVzIGlmCi0JRF9QQUdFRCBmbGFnIGlzIHNldCBmb3IgdGhlIG91dHB1dCBCRkQuCi0KLUZyaSBKdW4gIDQgMTU6NDc6NTIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoZ2V0X2luZGV4LCBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IEZpeCBwb2ludGVyCi0JY2FzdHMgdG8gd29yayBvbiBtYWNoaW5lIHdoZXJlIHNpemVvZihsb25nKSAhPSBzaXplb2YoaW50KSAhPQotCXNpemVvZihjaGFyICopLgotICAgICAgICAqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBEaXR0by4KLQkqIGNwdS1oODMwMC5jIGNvZmYtaDgzMDAuYzogU3VwcG9ydCBmb3IgSDgvMzAwLUguCi0KLUZyaSBKdW4gIDQgMTU6MjQ6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfd3JpdGVfc3ltYm9scyk6IEZvciBlbXB0eSBzdHJpbmcgdGFibGUsIHdyaXRlCi0Jb3V0IDQgaW4gY29ycmVjdCBieXRlIG9yZGVyLiAgKGZyb20gbWlueWFyZEBibnIuY2EpCi0KLQkqIGVsZjMyLWhwcGEuYzogRG9uJ3QgaW5jbHVkZSBsaWJocHBhLmggZm9yIG5vdzsgZGVmaW5lCi0JQllURVNfSU5fV09SRCBpbnN0ZWFkLCB1bnRpbCBVdGFoIHNlbmRzIGEgYmV0dGVyIGZpeC4KLQkoaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIpOiBVc2UgeG1hbGxvYyBhbmQgeHJlYWxsb2MgaW5zdGVhZAotCW9mIG1hbGxvYyBhbmQgcmVhbGxvYy4KLQotRnJpIEp1biAgNCAwNzo0OTowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWVjb2ZmbCopOiBOZXcgdGFyZ2V0OyB1c2UgZGVjc3RhdGlvbi4KLQkobWlwcy0qLWVjb2ZmKik6IEFkZGVkIHRyYWlsaW5nICcqJy4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2dldF9kZWJ1Zyk6IEdldCB0aGUgb2Zmc2V0IGZyb20gdGhlIGZpcnN0IFBEUgotCWZvciB0aGUgRkRSLCBub3QgZnJvbSB0aGUgZmlyc3QgUERSIGluIHRoZSBmaWxlLgotCi1UaHUgSnVuICAzIDE2OjQxOjEwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuYyAoaHBwYV9nZXRfc3ltYm9sX2luZm8pOiAgTmV3IGZ1bmMgbmVlZGVkIGZvciBKVU1QX1RBQkxFLgotCi1UaHUgSnVuICAzIDE1OjMzOjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX2dldF9zeW1ib2xfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQotVGh1IEp1biAgMyAxMzowNzo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3QgY3Jhc2ggaWYgbm8gc3ltYm9scyBoYXZlIGJlZW4KLQlhbGxvY2F0ZWQgeWV0LgotCi0JRnJvbSBQZXRlciBIb29nZW5ib29tIChob29nZW5Ac2NoYWZlci5jcy51dGFoLmVkdSk6Ci0JKiBsaWJocHBhLmggKE1BWENPTUxFTik6IERlZmluZSB1bmNvbmRpdGlvbmFsbHkuCi0JKF9QQV9SSVNDX0lEKTogT25seSBkZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIGVsZjMyLWhwcGEuYzogSW5jbHVkZSBsaWJocHBhLmguCi0KLQlGcm9tIFJhbHBoIENhbXBiZWxsOgotCSogaG9zdHMvbWlwc2JzZC5oIChIT1NUX0RBVEFfU1RBUlRfQUREUik6IERlbGV0ZSBkZWZpbml0aW9uLgotCi0JKiBlbGYzMi1ocHBhLmggKHN5bWV4dF9yb290UCwgc3ltZXh0X2xhc3RQKTogRGVsZXRlIGRlY2xzLgotCi1UaHUgSnVuICAzIDAwOjIzOjUzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWg6IGRlZmluZSBFWFRSQUxJQkVTIHRvIC1sbSAoZm9yIGJpbnV0aWxzKSwgYWxzbwotCXJlbW92ZSBkZWZpbmVzIG9mIF9fTVNET1NfXyBhbmQgX19HTzMyX18gKHRoZXNlIGFyZSBpbiB0aGUKLQljb21waWxlciBub3cpLgotCi1XZWQgSnVuICAyIDE3OjU3OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCUZyb20gVXRhaDoKLQkqIGhvc3RzL2hwcGFic2QuaDogRWxpbWluYXRlIHVzZSBvZiBvYnNvbGV0ZSBFWEZVTi4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oOiBEb24ndCB1c2UgcmFubGliLgotCi1UdWUgSnVuICAxIDA0OjE1OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBlbGYuYzogTmV3IGZpbGUsIGZvciB3b3JkLXNpemUgaW5kZXBlbmRlbnQgY29kZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2hhc2gpOiBNb3ZlZCB0byB0aGVyZSwgcmVuYW1lZCBiZmRfZWxmX2hhc2guCi0JKiBNYWtlZmlsZS5pbjogSW5jbHVkZSBlbGYubyBpbiBzdGFuZGFyZCBvYmplY3RzLgotCi0JKiBiZmQtaW4uaCAoQ0FUMyk6IERlZmluZSBoZXJlLgotCSogbGliYW91dC5oLCBsaWJlbGYuaDogTm90IGhlcmUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3Qgc3RydGFiKTogRGVmaW5lIGhlcmUuCi0JKGJmZF9lbGZfbG9jYXRlX3NoKTogRGVjbGFyZSBoZXJlLgotCSogZWxmY29kZS5oIChzdHJ1Y3Qgc3RydGFiKTogRGVmaW5pdGlvbiBkZWxldGVkLgotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwpOiBBZGRlZCBIUFBBX1BDUkVMX0NBTExfMTIuCi0KLQkqIE1ha2VmaWxlLmluOiBNYWtlICJhbGwiLCBub3QgImJmZC5oIiwgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0LgotCShzdG1wLWJmZC5oKTogTmV3IHRhcmdldDsgcHJldmVudHMgcmVidWlsZGluZyB3b3JsZCBpZiBiZmQuaAotCWhhc24ndCByZWFsbHkgY2hhbmdlZC4KLQotCVR1ZSBNYXkgMjUgMTI6MTU6MTUgMTk5MyAgTWljaGFlbCBNZWlzc25lciAgKG1laXNzbmVyQG9zZi5vcmcpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2hhc2gpOiBQcm92aWRlIGVsZiBzdGFuZGFyZCBoYXNoIGZ1bmN0aW9uLgotCSh2YXJpb3VzKTogS2V5IG9mZiBvZiB0aGUgbWFjaGluZXMgdXNlX3JlbGFfcCBmaWVsZCB0byBkZXRlcm1pbmUKLQl3aGV0aGVyIHRvIHVzZSBSRUwgb3IgUkVMQSByZWxvY2F0aW9ucy4KLQkoZWxmX3N3YXBfcmVsb2Nfb3V0LCBlbGZfc3dhcF9yZWxvY19pbik6IE5ldyBmdW5jdGlvbnMuCi0JKGVsZl9tYWtlX3NlY3Rpb25zKTogQWxsb2NhdGUgYSBwb2ludGVyIHRvIGhvbGQgYWxsIGRhdGEgZm9yIGEKLQlnaXZlbiBzZWN0aW9uLCBhbmQgY29weSBlYWNoIGZyYWdtZW50IGludG8gdGhlIGRhdGEgcmVnaW9uLgotCVVwZGF0ZSB0aGUgc2VjdGlvbidzIHBvaW50ZXIgd2l0aCB0aGUgUkVMIGltcGxpY2l0IGFkZGVuZHMgaWYgdGhlCi0JbWFjaGluZSB1c2VzIFJFTCByZWxvY2F0aW9uLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBSZW5hbWUgdG8KLQllbGZfaTM4Nl9iZmRfcmVsb2NfdHlwZV9sb29rdXAsIGFuZCB1c2UgY3BwIHRvIG1hcCB0aGUgbmFtZSBiYWNrCi0JaW50byB3YXMgZWxmMzItdGFyZ2V0LmggZXhwZWN0cy4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBSZW5hbWUgdG8gZWxmX2kzODZfaW5mb190b19ob3d0by4KLQkoZWxmX2kzODZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHJlbG9jYXRpb24gc3VwcG9ydC4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0byk6IEFkZCBtaW5pbWFsIHJlbG9jYXRpb24gc3VwcG9ydC4KLQotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgdXNlX3JlbGFfcCwgZWxmXzY0X3AsCi0JZWxmX2luZm9fdG9faG93dG9fcmVsIGZpZWxkcy4KLQotCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iZWQpOiBBZGQgc3VwcG9ydCBmb3IgbmV3IGZpZWxkcyBpbgotCWVsZl9iYWNrZW5kX2RhdGEuCi0KLQlTdW4gTWF5IDMwIDE2OjM4OjI0IDE5OTMgIFBldGVyIEhvb2dlbmJvb20gIChob29nZW5AZmFzdC5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jOiBBZGQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIHN1cHBvcnQsIGZpeAotCXJlbG9jYXRpb24gaG93dG8gdGFibGUsIGFkZCBzdHViIGdlbmVyYXRpb24gc3VwcG9ydC4KLQotCSogZWxmMzItaHBwYS5oOiBBZGQgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uIHN1cHBvcnQsIGZpeAotCXJlbG9jYXRpb24gaG93dG8gdGFibGUsIGFkZCBzdHViIGdlbmVyYXRpb24gc3VwcG9ydC4KLQotCSogZWxmY29kZS5oIChiZmRfZWxmX2xvY2F0ZV9zaCk6IE5ldyBmdW5jdGlvbiB0byBsb2NhdGUgRUxGCi0Jc2VjdGlvbiBoZWFkZXIuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX2FkZF90b19zdHJ0YWIpOiBNYWRlIG5vbi1zdGF0aWMgZHVlIHRvIGEgY2FsbAotCWZyb20gZWxmMzItaHBwYS5jLgotCi0JKiBlbGZjb2RlLmggKGVsZl9pZHhfb2Zfc3ltKTogUmV0dXJuIFNUTl9VTkRFRiBpbnN0ZWFkIG9mIDAgd2hlbgotCXRoZSBzeW1ib2wgaXMgbm90IGZvdW5kLgotCi0JKiBlbGZjb2RlLmggKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBOb3QgYWxsIHNlY3Rpb24KLQlmaWxlIHBvc2l0aW9ucyB3ZXJlIGNvbXB1dGVkLgotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc2VjdF90aHVuayk6IE5ldyBmdW5jdGlvbi4KLQotCSogaHBwYS5jIChzaWduX2V4dCk6IFJlaW1wbGVtZW50LgotCi0JKiBocHBhLmMgKHJvdW5kX2Rvd24scm91bmQscm91bmRfdXAsTCxSLExTLFJTLExELFJELExSLFJSKTogTWFrZQotCXRoZXNlIGZ1bmN0aW9ucyBzdGF0aWMuCi0KLVR1ZSBKdW4gIDEgMTQ6NDA6NDEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYmZkLmgpOiAgTW92ZSBjbG9zZXIgdG8gaGVhZGVycyAtIGFuZCBhZnRlciAnYWxsJyEKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6ICBEb24ndCBzZXQKLQlCU0ZfREVCVUdHSU5HIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzLCBvbmx5IEJTRl9DT05TVFJVQ1RPUi4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogIFRyYW5zbGF0ZQotCWNvbnN0cnVjdG9yIHN5bWJvbHMgcHJvcGVybHkuCi0KLVRodSBNYXkgMjcgMTY6MDk6MDQgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QpOiB1c2UgNCBieXRlIGFsaWdubWVudCBhcyBhCi0JbWluaW11bS4KLQkqIGFvdXQtdGFyZ2V0LmggKG1pbmltdW1fYWxpZ25tZW50KTogOCBieXRlIGFsaWdubWVudCBpcyByaWdodC4KLQkoZml4IGxkLzI2ODApCi0KLVRodSBNYXkgMjcgMTM6Mzg6NDcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBCdWlsZCBiZmQtaW4yLmggaW4gc291cmNlIGRpcmVjdG9yeSwKLQlmcm9tIGJmZC1pbi5oIGFuZCAuYyBmaWxlcy4gIEJ1aWxkIGJmZC5oIGluIGJ1aWxkIGRpcmVjdG9yeSwKLQlzdWJzdGl0dXRpbmcgaW4gcmVxdWVzdGVkIHRhcmdldCB3b3JkIHNpemUuICBJbnNlcnQgd29yZCBzaXplIGludG8KLQltYWtlZmlsZSwgYW5kIG1heWJlIGVuYWJsZSA2NC1iaXQgdGFyZ2V0cy4KLQotCSogYmZkLWluLmgsIGxpYmJmZC5jLCBkZW1vNjQuYywgdGFyZ2V0cy5jOiBEZWZpbmUgQkZENjQgaWYgNjQgYml0cwotCWFyZSBhdmFpbGFibGUuICBDb25kaXRpb25hbGl6ZSBvbiB0aGlzLiAgQXNzdW1lIEhPU1RfNjRfQklUCi0Jd2lsbCBiZSBkZWZpbmVkIGlmIG5lZWRlZCwgc28gNjQtYml0IHRhcmdldHMgYXJlIGNvbmRpdGlvbmFsaXplZAotCW9ubHkgaW4gdGhlIE1ha2VmaWxlLgotCi1UdWUgTWF5IDI1IDE0OjAzOjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMgKENPRVJDRTY0KTogUmV3cml0ZSB0byBhdm9pZCBvdXQtb2YtcmFuZ2UgdmFsdWVzLgotCi0JKiBjb2ZmLXNoLmMgKHJ0eXBlMmhvd3RvKTogUHV0IGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyLgotCShleHRyYV9jYXNlKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZS4KLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3ByaW50X3N5bWJvbCk6IENhc3QgYmZkX3ZtYSB2YWx1ZXMgdG8gbG9uZwotCWJlZm9yZSBjYWxsaW5nIHByaW50Zi4KLQotCSogZWxmY29kZS5oOiBOZXcgZmlsZSwgYWxtb3N0IGNvbXBsZXRlbHkgZGVyaXZlZCBmcm9tIG9sZCBlbGYzMi5jLgotCSogZWxmMzIuYzogTm93IGp1c3QgZGVmaW5lIEFSQ0hfU0laRSBhbmQgaW5jbHVkZSBlbGZjb2RlLmguCi0JKiBNYWtlZmlsZS5pbiAoZWxmNjQubyk6IExpc3QgZGVwZW5kZW5jaWVzLCBkb24ndCBidWlsZCBieQotCWRlZmF1bHQuCi0JKGVsZjY0LmMpOiBBZGQgdG8gbGlzdCBvZiBzb3VyY2VzLgotCShlbGYzMi5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGVsZjMyLSouYzogVXBkYXRlZCB0eXBlL21hY3JvL3N0cnVjdHVyZSBuYW1lcy4gIENsZWFuZWQgdXAKLQluYW1lc3BhY2UgcG9sbHV0aW9uOyByZW5hbWUgdmVjdG9ycy4KLQkqIHRhcmdldHMuYywgY29uZmlnLyotZWxmLm10OiBVcGRhdGVkLgotCSogQWxsIHVzZXMgb2YgMzItYml0IHZlcnNpb25zIG9mIHN0cnVjdHVyZXMsIHJvdXRpbmVzLCBhbmQgbWFjcm9zCi0JcmVuYW1lZC4KLQotCSogTWFrZWZpbGUuaW4gKGFyY2h1cmVzLm8sIHRhcmdldHMubyk6IERlcGVuZCBvbiBNYWtlZmlsZS4KLQotTW9uIE1heSAyNCAxNTo1MzoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbnVtIHJlbG9jX3R5cGUpOiBObyBjb21tYSBhZnRlciBsYXN0IGVudW1lcmF0b3IuCi0KLQkqIGVsZjMyLmMgKGVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbik6IEhhbmRsZSBpbmRleCBvZiB6ZXJvCi0Jc3BlY2lhbGx5LgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIsIGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBuZWVkIHRvIGRvCi0Jc28gaGVyZS4KLQkoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlbGV0ZWQgb25lIHVudXNlZCB2YXJpYWJsZSBhbmQKLQlpbml0aWFsaXplZCBhbm90aGVyIHRvIGF2b2lkIGdjYyB3YXJuaW5ncy4KLQkoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZS4KLQotRnJpIE1heSAyMSAxOTowNDoyMSAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBpMzg2bHlueC5jOiAgTmV3IG1vZHVsZSBmb3IgTHlueCB2YXJpYW50IG9mIGEub3V0LgotCSogTWFrZWZpbGUuaW4gKEJGRF9CQUNLRU5EUyBDRklMRVMgZGVwZW5kcyk6ICBBZGQgaTM4Nmx5bnguYy4KLQkqIGdlbi1hb3V0LmM6ICBHZXQgcmlkIG9mIGRlZnVuY3QgZW5kaWFuIHN0dWZmLCBwcmludCBvdXQgdHJ1ZQotCXBhZ2VzaXplLgotCSogdGFyZ2V0cy5jICh0YXJnZXRfdmVjdG9yKTogIEFkZCBpMzg2bHlueF92ZWMuCi0KLUZyaSBNYXkgMjEgMTc6MDI6MjIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGkzODYtc2NvLm10IGZvciBpWzM2XTg2LSotaXNjKi4KLQotRnJpIE1heSAyMSAxMzo0NDoxOCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtdGFyZ2V0LmgsIGFvdXR4LmgsIGNvZmYtYWxwaGEuYywKLQljb2ZmLW1pcHMuYywgY29mZmdlbi5jLCBlbGYzMi5jLCBpZWVlLmMsIGxpYmFvdXQuaCwgbGliY29mZi1pbi5oLAotCWxpYmVsZi5oLCBtaXBzYnNkLmMsIG9hc3lzLmMsIHNjby1jb3JlLmMsIHNyZWMuYywgdGVraGV4LmMsCi0JdHJhZC1jb3JlLmM6IERlZmluZSBhIFRBUkdFVF9nZXRfc3ltYm9sX2luZm8gZnVuY3Rpb24gb3IgbWFjcm8uCi0JUmVtb3ZlIHRoZSBiZmRfcHJpbnRfc3ltYm9sX25tIGNhc2UgZnJvbSBUQVJHRVRfcHJpbnRfc3ltYm9sLgotCi0JKiBiZmQtaW4uaDogRG9uJ3QgZGVmaW5lIGJmZF9wcmludF9zeW1ib2xfbm0uCi0JRGVmaW5lIHN5bWJvbF9pbmZvIHR5cGUuCi0JKEpVTVBfVEFCTEUpOiBTZXQgX2dldF9zeW1ib2xfaW5mbyBlbGVtZW50LgotCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlLCBiZmRfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb25zLgotCShiZmRfZGVjb2RlX3N5bWNsYXNzKTogVXNlIGNvZmZfc2VjdGlvbl90eXBlLgotCi0JKiB0YXJnZXRzLmM6IEFkZCBiZmRfZ2V0X3N5bWJvbF9pbmZvIGNhbGwuCi0KLVdlZCBNYXkgMTkgMTU6MzA6NTIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6ICBVc2UgdW5zaWduZWQgY2hhciB0byBhdm9pZAotCWNvbXBsYWludHMgZnJvbSBhbmNpZW50IGdjYydzLgotCi1XZWQgTWF5IDE5IDE1OjUxOjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYzogIENoZWNrIG1hY3JvIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQuCi0JaG9zdHMvaTM4NmxpbnV4Lmg6ICBEZWZpbmUgaXQuCi0KLU1vbiBNYXkgMTcgMTU6MDA6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIFZFUlNJT04sIGJmZC1pbi5oOiBCdW1wIHZlcnNpb24gbnVtYmVyIHRvIDIuMi4KLQotCSogaHBwYS5jIChhc3NlbWJsZV8zLCBkaXNfYXNzZW1ibGVfMywgYXNzZW1ibGVfMTIsCi0JZGlzX2Fzc2VtYmxlXzEyLCBhc3NlbWJsZV8xNywgZGlzX2Fzc2VtYmxlXzE3LCBhc3NlbWJsZV8yMSwKLQlkaXNfYXNzZW1ibGVfMjEsIHNpZ25fZXh0LCBvbmVzLCBzaWduX3VuZXh0LCBsb3dfc2lnbl9leHQsCi0JbG93X3NpZ25fdW5leHQsIHJvdW5kX2Rvd24sIHJvdW5kLCByb3VuZF91cCwgTCwgUiwgTFMsIFJTLCBMRCwgUkQsCi0JTFIsIFJSLCBocHBhX2ZpZWxkX2FkanVzdCk6IE5ldyBmdW5jdGlvbnMuCi0KLU1vbiBNYXkgMTcgMTA6MDQ6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQWRkZWQgc3VwcG9ydCBmb3IgaW5kaXJlY3QKLQlzdGFicyBzeW1ib2xzLCBpbmNsdWRpbmcgbmV3IGluZGlyZWN0X3B0cl9wdHIgYXJndW1lbnQuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFBhc3MgbmV3IGFyZ3VtZW50IGluIGNhbGxzIHRvCi0JZWNvZmZfc2V0X3N5bWJvbF9pbmZvLgotCi1GcmkgTWF5IDE0IDAwOjA1OjA2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBGb3IgbTY4ayBzeXN2IHN5c3RlbXMsIHVzZSBtNjhrLWNvZmYuCi0KLQkqIGNvbmZpZy9ocHBhLWVsZi5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgREVGQVVMVF9WRUNUT1IgaGVyZS4KLQkoVERFRkFVTFRTKTogRGVmaW5lIGl0IGhlcmUuICBVc2UgdGhlIG5ldyBuYW1lLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZl9ocHBhX2JhY2tlbmRfZGF0YSk6IERlbGV0ZTsgcmVseSBvbiBkZWZhdWx0Ci0JdmFsdWVzIGluc3RlYWQuCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZCBzb21lIEhQUEEgcmVsb2MgdHlwZXMuCi0KLQkqIGFpeDM4Ni1jb3JlLmMgKE5PX0dFVFMpOiBGaXggUFJPVE8gaW52b2NhdGlvbiB0byBoYXZlIGNvcnJlY3QKLQludW1iZXIgb2YgYXJndW1lbnRzLgotCShhaXgzODZfY29yZV9maWxlX3ApOiBJbml0aWFsaXplIGNvcmVfc2l6ZSB0byBjb3JyZWN0IHZhbHVlLgotCi1XZWQgTWF5IDEyIDE0OjM5OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9CVUlMRCk6IE5ldyB2YXJpYWJsZSwgc2V0IHRvICQoQ0MpLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIENDX0ZPUl9CVUlMRC4KLQotCSogYm91dC5jIChhb3V0MzJfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZSB0byBiZQotCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSByYXRoZXIgdGhhbiBiZmRfdHJ1ZS4KLQotCSogY29mZi1taXBzLmM6IEluY2x1ZGUgbGliYW91dC5oIGFuZCBhb3V0L2FvdXQ2NC5oIHRvIGdldAotCWRlZmluaXRpb25zIGZvciBOX1NFVFtBVERCXS4KLQkoZWNvZmZfaG93dG9fdGFibGUpOiBNb3ZlZCBuZWFyIHRvcCBvZiBmaWxlLgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBJZiBhIFNUQUJTIHN5bWJvbCBvZiB0eXBlIE5fU0VUW0FUREJdIGlzCi0Jc2VlbiwgY29vayB1cCBhIGNvbnN0cnVjdG9yIHNlY3Rpb24gb2YgdGhlIHNhbWUgbmFtZSBhbmQgcHV0IGluIGEKLQlyZWxvYyBwb2ludGluZyB0byB0aGUgc3ltYm9sLiAgVGhpcyBsZXRzIHRoZSBHTlUgbGlua2VyIGJ1aWxkCi0JZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgd2l0aG91dCB1c2luZyBjb2xsZWN0LgotCi1UdWUgTWF5IDExIDAwOjMzOjMxIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYyAobTg4a2Jjc192ZWMpOiAgU3ltYm9scyBoYXZlIHVuZGVyYmFycy4KLQotTW9uIE1heSAxMCAwNTo1NTo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvbWluaWZyYW1lLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBpdC4KLQotU3VuIE1heSAgOSAxNjozNjo1OSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qLWJzZCk6ICBDaGFuZ2UgdG8gaHBwYSotKi1ic2QqCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotaHB1eCk6ICBDaGFuZ2UgdG8gaHBwYSotKi1ocHV4KgotCSogY29uZmlndXJlLmluIChtNjgqLWhwLWJzZCk6ICBDaGFuZ2UgdG8gbTY4Ki1ocC1ic2QqCi0JKiBjb25maWd1cmUuaW4gKG02OCotKi1ocHV4KTogIENoYW5nZSB0byBtNjgqLSotaHB1eCoKLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLWJzZCk6ICBDaGFuZ2UgdG8gKi0qLWJzZCoKLQotV2VkIE1heSAgNSAxNjowODozMiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5jIChlbGZfaHBwYV9yZWxvY190eXBlX2xvb2t1cCk6ICBDYXN0IGVudW1zIHRvCi0JaW50LCBmb3IgdGhlIHNha2Ugb2YgdGhlIG9sZCBQb3J0YWJsZSBDIENvbXBpbGVyLgotCi1Nb24gTWF5ICAzIDE0OjM3OjAxIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiAgQWRkIGNwdS1zaC5jIGFuZCBjb2ZmLXNoLmMuCi0KLU1vbiBNYXkgIDMgMTQ6MDM6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IHRhcmdldCBuYW1lIHJpZ2h0IGZvciBtNjgqLSotaHB1eC4KLQotU3VuIE1heSAgMiAxMTozOTo0NCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKE5PX1NJR05FRF9HRVQpOiAgTmV3IG1hY3JvLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfY29yZV92ZWMpOiAgVXNlIG5ldyBOT19TSUdORURfR0VUIGluc3RlYWQgb2YKLQlzaWduZWQgTk9fR0VULCB3aGVyZSBhcHByb3ByaWF0ZS4KLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotbGludXgqKTogIEFkZDsgYmZkX3RhcmdldCA9IGkzODYtbGludXguCi0JKiBjb25maWd1cmUuaW4gKCotKi1saW51eCopOiAgUmVtb3ZlIHVudGlsIGxpbnV4IHBvcnQgZm9yIGEKLQlub24taTM4Ni9pNDg2IHN5c3RlbSBpcyBhY3R1YWxseSBhdmFpbGFibGUuCi0KLUZyaSBBcHIgMzAgMjA6MDQ6MTAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oOiAgI3VuZGVmIGVfKiBzeW1ib2xzIHdoaWNoIGNvbWUgZnJvbSA8bWFjaGluZS9zb20uaD4KLQl3aGVuIGNvbXBpbGluZyB1bmRlciBIUFVYLgotCi1GcmkgQXByIDMwIDE3OjI1OjIzIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIFRoZSBmb2xsb3dpbmcgcGF0Y2hlcyBhcmUgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KLQkqIGhwcGEuYyAoaHBwYV9jb3JlX2ZpbGVfcCk6IFByb3ZpZGUgYSB0ZW1wb3JhcnkgZHVtbXkgcm91dGluZQotCWZvciBIT1NUX0hQUEFCU0QuCi0JKiBiZmQvaG9zdHMvaHBwYWJzZC5oOiBGaXggZGVjbGFyYXRpb25zIG9mIG1hbGxvYyBhbmQgZnJlZS4KLQkqIGJmZC9saWJocHBhLmg6IEluY2x1ZGUgc3lzZGVwIGhlcmUuICBDb25kaXRpb25hbGl6ZQotCWluY2x1ZGVzIGJhc2VkIG9uIEhPU1RfSFBQQUhQVVggb3IgSE9TVF9IUFBBQlNELgotCVByb3ZpZGUgZGVmaW5pdGlvbnMgZm9yIE1BWENPTUxFTiBhbmQgX1BBX1JJU0NfSUQgc3VpdGFibGUKLQlmb3IgQlNELgotCi1GcmkgQXByIDMwIDE3OjM0OjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5jOiBEb24ndCBpbmNsdWRlIGEub3V0LmguICBBcHBhcmVudGx5IG5vdCBldmVuIHRoZQotCUdOVSB2ZXJzaW9uIGlzIG5lZWRlZC4KLQotRnJpIEFwciAzMCAwOTozODo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogdXNlIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMgcmF0aGVyIHRoYW4gY2FzdGluZyBhYm9ydC4KLQotVGh1IEFwciAyOSAxMTozMDozMiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEJ1aWxkIGVsZjMyLWhwcGEuby4KLQotCSogc3ltcy5jIChCU0ZfRlVOQ1RJT04pOiBOZXcgc3ltYm9sIGZsYWcuCi0KLQkqIGVsZjMyLWhwcGEuYzogRml4ZWQgdG8gd29yayB3aXRoIGVsZjMyLXRhcmdldC5oLgotCi0JKiBocDMwMGhwdXguYyAoTkFNRSwgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luKTogRml4IGZvcgotCXRyYWRpdGlvbmFsIEMuCi0JKiBsaWJhb3V0LmggKE5BTUUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBsaWJlbGYuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JKGVsZl9zeW1ib2xfdHlwZSk6IE1vdmVkIGhlcmUsIGFkZGVkIG5ldyBmaWVsZHMuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogTmV3IGZpZWxkIGBnbG9iYWxfc3ltJzsgSSBzdXNwZWN0IHRoaXMKLQltYXkgYmUgbWlzcGxhY2VkLgotCSogZWxmMzIuYyAoZWxmX3N5bWJvbF90eXBlKTogRGVsZXRlZCBmcm9tIGhlcmUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogTmV3IGZpZWxkcyByYXdfc3ltcyBhbmQgaW50ZXJuYWxfc3ltcywgdG8KLQlwb2ludCB0byBiYWNrZW5kIHZlcnNpb25zIG9mIHN5bWJvbHMuCi0JKG9ial9zeW1ib2xzLCBvYmpfcmF3X3N5bXMsIG9ial9pbnRlcm5hbF9zeW1zKTogTmV3IG1hY3Jvcy4KLQkoZWxmX3N3YXBfcGhkcl9vdXQsIGVsZl9idWlsZF9waGRycywgZWxmX3dyaXRlX3BoZHJzKTogTmV3Ci0JZnVuY3Rpb25zLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogV3JpdGUgcHJvZ3JhbSBoZWFkZXJzIGlmIGFwcHJvcHJpYXRlLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVbm5hbWVkIHNlY3Rpb25zIGdldCBlbXB0eSBzdHJpbmcgZm9yCi0JbmFtZSwgbm90ICJ1bm5hbWVkIi4gIEhhbmRsZSBTSFRfTk9CSVRTIHNlcGFyYXRlbHkgZnJvbQotCVNIVF9QUk9HQklUUywgYW5kIHNldCBzb21lIGRpZmZlcmVudCBmbGFncy4KLQkoZWxmX2ZpbGVfcCk6IE5ldyByb3V0aW5lLgotCShlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6IENhbGwgaXQuCi0JKGVsZl9vYmplY3RfcCk6IEhhbmRsZSBFTV9IUFBBLgotCShlbGZfc3ltYm9sX2Zyb20sIGVsZl9pZHhfb2Zfc3ltKTogTmV3IGZ1bmN0aW9ucy4KLQkoZWxmX21ha2Vfc2VjdGlvbnMpOiBHZXQgc3ltYm9sIG51bWJlciByaWdodCBmb3IgcmVsb2NhdGlvbnMuICBTZXQKLQlTSEZfQUxMT0MsIFNIRl9XUklURSwgU0hGX0VYRUNJTlNUUiB3aGVuIGFwcHJvcHJpYXRlLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IEJTUyBzZWN0aW9uIHNob3VsZCBiZSBTSFRfTk9CSVRTLCBub3QKLQlTSFRfUFJPR0JJVFMuICBBbHdheXMgZ2VuZXJhdGUgc3ltdGFiIGFuZCBzdHJ0YWIsIG5vdCBvbmx5IGlmCi0JcmVsb2NhdGlvbnMgYXJlIG5lZWRlZC4gIFNldCBTSEZfKiBmbGFncyBhcyBhcHByb3ByaWF0ZS4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEhhbmRsZSBiZmRfYXJjaF9ocHBhLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gc3ltYm9sIGNvdW50LgotCVN0b3JlIGEgY29ycmVjdCB2YWx1ZSBmb3IgdGhlIHN5bWJvbDsgd3JpdGUgdGhlIHNpemUgZmllbGQKLQlwcm9wZXJseTsgbWFrZSBzb21lIGd1ZXNzZXMgYWJvdXQgdGhlIHR5cGUgZmllbGQuICBTZXQgc2VjdGlvbgotCXR5cGUgY29ycmVjdGx5IGZvciBzdHJpbmcgdGFibGVzLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogQ2hlY2sgZm9yIGFic29sdXRlIGFuZCBjb21tb24gc2VjdGlvbnMKLQlmaXJzdC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERpdHRvLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogVXNlIGVsZl9zeW1ib2xfdHlwZSBpbnN0ZWFkIG9mIGFzeW1ib2wuCi0JVXNlIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJ1bm5hbWVkIiBmb3IgbmFtZWxlc3Mgc3ltYm9scy4KLQlIYW5kbGUgU1RUWV9GVU5DIHR5cGUsIGFuZCB3ZWlyZG5lc3Mgd2l0aCAiJGdsb2JhbCQiIHN5bWJvbCBmb3IKLQlIUFBBIChvbmx5PykuICBEb24ndCBmcmVlIHJhdyBzeW1ib2xzOyBrZWVwIHRoZSBwb2ludGVyIGFyb3VuZCBmb3IKLQlsYXRlci4KLQkoZWxmX3NldF9hcmNoX21hY2gpOiBIYW5kbGUgYmZkX2FyY2hfaHBwYS4KLQkoZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogSnVzdCByZXR1cm4gZmFsc2UuCi0JKGVsZl93cml0ZV9vYmplY3RfY29udGVudHMsIGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldAotCW91dHB1dF9oYXNfYmVndW4gZmllbGQgYWZ0ZXIgY29tcHV0aW5nIGZpbGUgcG9zaXRpb25zLgotCShlbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBXcml0ZSBzZWN0aW9uIGNvbnRlbnRzIGltbWVkaWF0ZWx5LAotCXJhdGhlciB0aGFuIGNhY2hpbmcgdGhlIHdob2xlIGZpbGUgYW5kIHdyaXRpbmcgaXQgYXQgY2xvc2UgdGltZS4KLQotCSogbGliaHBwYS5oIChlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSwgZW51bQotCWhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwX2FsdCwgZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZSwgZW51bQotCWhwcGFfcmVsb2NfZXhwcl90eXBlX2FsdCk6IE5ldyBlbnVtZXJhdG9yIHR5cGVzLgotCi0JKiBjb25maWcvaHBwYS1lbGYubXQsLiBjb25maWcvaHBwYW9zZi5taDogSFAgUEEvT1NGIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZS5ob3N0OiBVc2UgdGhlbS4KLQotV2VkIEFwciAyOCAyMzoyMTowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXRhcmdldC5oOiBBbGxvdyBvdmVycmlkZXMgb2YgYXJtYXAgZGVmYXVsdHMuCi0KLQkqIGVsZjMyLWhwcGEuYywgZWxmMzItaHBwYS5oOiBOZXcgZmlsZXMuCi0KLQkqIGNvbmZpZy9ocDMwMGhwdXgubXQ6IE5ldyBmaWxlLgotCi1UdWUgQXByIDI3IDA1OjM5OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhaXgzODYtY29yZS5jIChOT19HRVRTKTogTmV3IG1hY3JvOyBOT19HRVQgZm9yIHNpZ25lZCB2YWx1ZXMuCi0JKGFpeDM4Nl9jb3JlX3ZlYyk6IFVwZGF0ZSBmb3IgbmV3IGZpZWxkcy4KLQotCSogYXJjaGl2ZS5jIChiZmRfZ2VuZXJpY19hcmNoaXZlX3ApOiBDYWxsIHRhcmdldC1zcGVjaWZpYwotCXNsdXJwX2FybWFwIGNvZGUsIGluc3RlYWQgb2YgYmZkX3NsdXJwX2FybWFwLgotCShiZmRfc2x1cnBfYnNkX2FybWFwX2YyKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBEZWNsYXJlIGl0LgotCSogYW91dC10YXJnZXQuaCAoQVJfUEFEX0NIQVIpOiBEZWZpbmUgaXQgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkodmVjKTogVXNlIGl0LgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBOZXcgZmllbGQgZm9yIHN1YmZvcm1hdCwgZm9yCi0JZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gaGlnaGx5IHNpbWlsYXIgYS5vdXQgZm9ybWF0cy4KLQkqIGFvdXR4LmggKE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbik6IE5ldyBtYWNybywgZGVmYXVsdHMgdG8gbG9jYWwKLQl2ZXJzaW9uIG9mIGZ1bmN0aW9uLgotCShzd2FwX2V4ZWNfaGVhZGVyX2luKTogRG9uJ3QgZGVmaW5lIGlmIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBpcwotCWFscmVhZHkgZGVmaW5lZC4KLQkqIGhwMzAwaHB1eC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBJbmNsdWRlIGl0LgotCi1Nb24gQXByIDI2IDEzOjI0OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgdGFyZ2V0cy5jOiBTdXBwb3J0IGZvcgotCUhpdGFjaGkgU0guCi0KLU1vbiBBcHIgMjYgMTM6NTU6NDIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDaGVjayB0aGUgZmlsZSBzaXplLgotCi1Nb24gQXByIDI2IDEzOjI0OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmM6IFJlbW92ZSBkdXBsaWNhdGUgZnVuY3Rpb24gYW5kIGFkZCB3YXJuaW5ncy4KLQotTW9uIEFwciAyNiAxMToyNTo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNjby1jb3JlLmMgKHNjb19jb3JlX3ZlYyk6IEFkZCBpbml0aWFsaXplcnMgZm9yIG5ldyB0YXJnZXQKLQlmaWVsZHMuCi0KLVNhdCBBcHIgMjQgMjE6MzM6NDUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggW19MSVRdOiBSZWNvZ25pemUgLmxpdCBzZWN0aW9uLgotCi1GcmkgQXByIDIzIDE5OjAwOjM2IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMsIGNwdS1hbHBoYS5jLCBjb25maWcvYWxwaGFvc2YubXQsCi0JY29uZmlnL2FscGhhb3NmLm10LCBob3N0cy9hbHBoYW9zZi5oOiAgTmV3IGZpbGVzLgotCi1GcmkgQXByIDIzIDE2OjQ4OjQ2IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIE1lcmdlIGluIEhQUEEvQlNEIGNoYW5nZXMgZnJvbSBVdGFoLgotCSogaHBwYS5jOiAgVXNlIHRoaXMgZm9yIGJvdGggSFBVWCAmIEJTRC4KLQkqIHRhcmdldHMuYzogIEVuYWJsZSBocHBhX3ZlYyBmb3IgYm90aCBIUFVYICYgQlNELgotCSogY29uZmlnL2hwcGFic2QubXQ6ICBUREVGSU5FUyA9PiBUREVGQVVMVFMuCi0JKiBob3N0cy9ocHBhYnNkLmg6ICAjZGVmaW5lIEhPU1RfSFBQQUJTRC4KLQotV2VkIEFwciAyMSAwMTo1MDoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmM6ICBXaGl0ZXNwYWNlIGNoYW5nZXMgYXJvdW5kIGJ5dGVzd2FwIG1hY3Jvcy4KLQkqIGxpYmJmZC1pbi5oOiAgV2hpdGVzcGFjZSBjaGFuZ2VzIGFyb3VuZCBieXRlc3dhcCBkZWNsYXJhdGlvbnMuCi0KLVR1ZSBBcHIgMjAgMTU6NTk6MDcgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBEb24ndCBkZWZhdWx0IGJmZF9lcnJvciB0bwotCXN5c3RlbV9lcnJvciBhbnltb3JlLiAgSXQgY29uZnVzZXMgYmZkX2NoZWNrX2Zvcm1hdCgpLgotCi1Nb24gQXByIDE5IDIzOjAzOjA4IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiAgQWRkIHNnaV9jb3JlX2RhdGEgdG8gdGRhdGEgdW5pb24uCi0JKiBjb2ZmLW1pcHMuYzogIEFkZCBJcml4IDQueCBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL2lyaXg0Lmg6ICAjZGVmaW5lIEhPU1RfSVJJWDQuCi0KLU1vbiBBcHIgMTkgMTg6NTI6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBDaGVjayB0aGF0IHRoZQotCXN5bWJvbCdzIHNlY3Rpb24gZG9lcyBnZXQgc2V0LgotCShzbHVycF9zeW1ib2xfdGFibGUpOiBaZXJvIGluZGV4IG1lYW5zIG51bGwtc3RyaW5nIG5hbWUuCi0KLQkqIGFvdXR4LmggKHN0cnVjdCBzdHJpbmd0YWJfZW50cnksIHN0cnVjdCBzdHJpbmd0YWJfZGF0YSk6IE5ldwotCWRhdGEgc3RydWN0dXJlcy4KLQkoaGFzaCwgc3RyaW5ndGFiX2luaXQsIGFkZF90b19zdHJpbmd0YWIsIGVtaXRfc3RydGFiLCBjb21wYXJlKToKLQlOZXcgZnVuY3Rpb25zLgotCSh3cml0ZV9zeW1zKTogVXNlIHRoZW0sIHRvIHJlZHVjZSBzdHJpbmcgdGFibGUgc2l6ZS4KLQotTW9uIEFwciAxOSAxNjo0NToxMiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfY29yZV92ZWMpOiAgQWRkIDYgbmV3IGluaXRpYWxpemVycyB0byBtYXRjaAotCSAgbmV3IHNpZ25lZCBnZXQvcHV0IGZpZWxkcy4gIE1pbm9yIHJlZm9ybWF0dGluZyB0byBsYWJlbAotCSAgc29tZSBmaWVsZHMuCi0KLU1vbiBBcHIgMTkgMDY6MDk6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oOiBJbnNlcnQgY29tbWVudCBhYm91dCBTVlIzIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBob3N0cy97aHAzMDAsaTM4NmlzYyxpMzg2dn0uaDogUmVtb3ZlIHVudXNlZCAjZGVmaW5lcyBvZiB7cix9aW5kZXgKLQkoYmZkIHVzZXMgc3RyY2hyIGFuZCB0aGUgYnJva2VuIFNWUjMuMiBjcHAgbG9zZXMgd2l0aCB0aGUgZGVmaW5lcykuCi0KLQkqIGxpYmJmZC5jOiBiZmRfcHV0KjogUmVtb3ZlIGNhc3RzIHRvIGJmZF92bWEuCi0KLUZyaSBBcHIgMTYgMTc6NDk6MjcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChpbnRlcm5hbF9zdW5vc19jb3JlKTogTWFrZSBjX3N0YWNrdG9wIGEgYmZkX3ZtYS4KLQkoc3dhcGNvcmVfc3BhcmMpOiBNYWtlIHNwIGEgYmZkX3ZtYS4KLQotVGh1IEFwciAxNSAwOTowOToxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmM6IEFkZCBzaWduZWQgdmVyc2lvbnMgb2YgYmZkX3toXyx9e2dldCxwdXR9X3NpZ25lZF88c2l6ZT4uCi0JbGliYmZkLmMsIGxpYmJmZC1pbi5oOiBBZGQgX2RvKnNpZ25lZCouCi0JdGFyZ2V0cy5jLCBhbGwgdGFyZ2V0czogQWRkIGJmZCpzaWduZWQqLgotCWJmZC1pbi5oOiBBZGQgYmZkX3NpZ25lZF92bWEuICBBZGQgY29tbWVudHMuCi0KLQkqIGJmZC1pbi5oIChiZmRfZXJyb3IpLCBiZmQuYyAoYmZkX2Vycm1zZ3MpOiBBZGQgZmlsZV90cnVuY2F0ZWQuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZXJyb3IpOiBDaGVjayBlcnJvciByZXR1cm4gZnJvbQotCV9iZmRfY2hlY2tfZm9ybWF0IHJvdXRpbmVzLgotCi1XZWQgQXByIDE0IDIzOjQ4OjI1IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6IEltcHJvdmUgZXJyb3IgY2hlY2tpbmcgYW5kCi0JcmVjb2duaXplIC5kYXRhIHNlY3Rpb24gaWYgcHJlc2VudC4KLQotVGh1IEFwciAxNSAwMTowMDoyOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF8qX2FkanVzdF9zaXplc19hbmRfdm1hcyk6ICBBdm9pZCBgc2FuaXR5JwotCWNoZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciBzZXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBCU1MKLQlzZWN0aW9uIChhbmQgdGhlIGZpbGUgaGVhZGVyIGNhbid0IHNwZWNpZnkgdGhpcykuICBMZXQgdGhlIHVzZXIKLQlzZXQgaXQgd2hlcmV2ZXIgdGhleSB3YW50LCByZWdhcmRsZXNzIG9mIHdoYXQgZ29lcyBpbiB0aGUgaGVhZGVyLgotCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfc2VjdGlvbnMpOiAgUGFzcyBhbGwgaWVlZSBzZWN0aW9uIG5hbWVzCi0Jc3RyYWlnaHQgdGhyb3VnaCBpbnRvIEJGRCBzZWN0aW9ucy4gIEFkZCBjb21tZW50cy4KLQotV2VkIEFwciAxNCAyMDozNDo1NCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFudXAgaW4gcHJlcGFyYXRpb24gZm9yIGJldHRlciA2NC1iaXQgaG9zdCBzdXBwb3J0LgotCi0JKiBiZmQtaW4uaCAoYmZkXzY0X3R5cGUpOiAgUmVtb3ZlLgotCSogbGliYmZkLmMgKF9kb19nZXRiNjQsIF9kb19wdXRiNjQpOiAgVXNlIGJmZF92bWEsIG5vdCBiZmRfNjRfdHlwZS4KLQotCSogYmZkLWluLmggKGJmZF9zaXplKTogIFJlbW92ZS4KLQotCSogYmZkLWluLmggKGJmZF9vZmZzZXQpOiAgUmVtb3ZlLCBhZnRlciBmaXhpbmcgbGQvbGRsYW5nLltjaF0uCi0KLQkqIGJmZC1pbi5oIChiZmRfd29yZCk6ICBSZW1vdmUuCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogIFJlcGxhY2UgYmZkX3dvcmQgd2l0aCBiZmRfdm1hLgotCi0JKiBiZmQtaW4uaCAocmF3ZGF0YV9vZmZzZXQpOiAgUmVtb3ZlLgotCSogcmVsb2MuYyAoYXJlbGVudCk6ICBSZXBsYWNlIHJhd2RhdGFfb2Zmc2V0IHdpdGggYmZkX3NpemVfdHlwZS4KLQkoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6ICBMaW50LgotCShlbnVtIGJmZF9yZWxvY19zdGF0dXMpOiAgQ29tbWVudCBjbGVhbnVwLgotCi0JKiBhb3V0LWFkb2JlLmMsIGNwdS1oODMwMC5jLCBtaXBzYnNkLmMsIHNyZWMuYzogbGludCAtV2FsbC4KLQotVHVlIEFwciAxMyAxMToxOTo1MiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN3YXBjb3JlX3NwYXJjKTogR3Vlc3MgdGhlIHJpZ2h0IHZhbHVlIG9mIFVTUlNUQUNLLgotCi1Nb24gQXByIDEyIDE0OjE4OjAwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBlbGYzMi5jOiAgQ2xlYW4gdXAgb2xkIGNvbW1lbnRzLgotCi1GcmkgQXByICA5IDEwOjQzOjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3N1bjMuaDogU3RyaW5nIGFyZ3VtZW50IHRvIGZwcmludGYgaXMgY29uc3QuCi0KLQkqIGNvZmYtbWlwcy5jOiBSZW5hbWVkIFBBR0VfU0laRSB0byBST1VORF9TSVpFLCB0byBhdm9pZCBjb25mdXNpb24KLQlvbiBzeXN0ZW1zIHdoaWNoIGRlZmluZSBQQUdFX1NJWkUgaW4gPGxpbWl0cy5oPi4KLQotVGh1IEFwciAgOCAxMDoyODowMCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKTogVXNlIG5ldyBtYWNybwotCVRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwgdG8gYWxsb3cgaG9zdCBmaWxlcyB0byBzcGVjaWZ5Ci0JdGhlIGNvcmUgZmlsZSBmYWlsaW5nIHNpZ25hbC4KLQkqIGhvc3RzL2RlY3N0YXRpb24uaCAoVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTCk6IERlZmluZQotCXRvIHN1cHBseSB0aGUgY29yZSBmaWxlIGZhaWxpbmcgc2lnbmFsLgotCi1UaHUgQXByICA4IDA5OjE3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBPbmx5IHNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yCi0JYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaWYgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQotCWlzIGRlZmluZWQuICBPbiBtYW55IENPRkYgdGFyZ2V0cyBTVFlQX0JTUyBpcyBhbHdheXMgU1RZUF9OT0xPQUQuCi0JKiBjb2ZmLWkzODYuaCAoQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWSk6IERlZmluZS4KLQotV2VkIEFwciAgNyAxMTozMzowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChQQUdFU0laRSk6IENvcnJlY3QgdmFsdWUuCi0KLVR1ZSBBcHIgIDYgMTI6MDU6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBBZGRyZXNzIG9mIGZpcnN0IFBEUiBpcwotCWFuIG9mZnNldCAocGF0Y2ggZnJvbSBKZWFuLURhbmllbCBGZWtldGUgPGpkZkBscmkubHJpLmZyPikuCi0KLU1vbiBBcHIgIDUgMTI6MDc6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIGEKLQlTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24uICBEb24ndCBzZXQgU0VDX05FVkVSX0xPQUQgZm9yIGEKLQlTVFlQX0lORk8gc2VjdGlvbi4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3JjZSB2bWEgYW5kIGxtYSBvZiBfTElCCi0Jc2VjdGlvbiB0byBiZSB6ZXJvLgotCShjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ291bnQgbnVtYmVyIG9mIGVudHJpZXMgaW4gbmV3IGxtYQotCWZpZWxkLCBub3QgaW4gdm1hLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBGb3JjZSBsaW5lbm9fY291bnQgb2YKLQlTRUNfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbiB0byBiZSB6ZXJvLCBzaW5jZSBpdCBpcyBub24temVybyBvbiB0aGUKLQlTQ08gMy4ydjQgc2hhcmVkIGxpYnJhcnkuCi0JKiBzZWNsZXQuYyAocmVsKTogQ29weSBvdmVyIGFueSBzZWN0aW9uIHdpdGggY29udGVudHMsIG5vdCBqdXN0Ci0JbG9hZGFibGUgc2VjdGlvbnMuCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9tYWtlX2VtcHR5X3N5bWJvbCk6IFplcm8gb3V0IG5ld2x5IGFsbG9jYXRlZAotCXN5bWJvbC4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9yZWxvYyk6IE5ldyBmdW5jdGlvbiwgdG8gZ2VuZXJhdGUKLQlyZWxvY2F0ZWFibGUgb3V0cHV0IGNvcnJlY3RseS4KLQkoaG93dG9fdGFibGUpOiBVc2UgY29mZl9pMzg2X3JlbG9jIGZvciBhbGwgcmVsb2MgdHlwZXMuCi0JKENBTENfQURERU5EKTogVXNlIGEgbW9yZSBlZmZpY2llbnQgaGFjayB0byBnZXQgdGhlIGNvcnJlY3QgYWRkZW5kCi0JZm9yIGEgY29tbW9uIHN5bWJvbC4KLQkoaTM4NmNvbW1fdmFsdWUpOiBSZW1vdmVkOyBubyBsb25nZXIgbmVlZGVkLgotCi1TdW4gQXByICA0IDE1OjA4OjQ4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRG9uJ3Qgd3JpdGUgb3V0Ci0Jc2VjdGlvbnMgd2l0aG91dCBhIGZpbGVwb3MuCi0KLUZyaSBBcHIgIDIgMTQ6MzU6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzZWNsZXQuYyAoc2VjbGV0X2R1bXBfc2VjbGV0KTogQ29ycmVjdCBTRUNfSEFTX0NPTlRFTlRTIHRlc3QuCi0KLVdlZCBNYXIgMzEgMTc6NDE6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpOiBBZGRlZCBCRkRfUkVMT0NfTUlQU19HUFJFTC4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2RhdGFfdHlwZSk6IEFkZGVkIGdwX3NpemUgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgZ3Bfc2l6ZSB0byA4LgotCShlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBDb21wYXJlIGFnYWluc3QgZ3Bfc2l6ZSwgbm90IGhhcmRjb2RlZCA4LgotCVNldCBmbGFncyB0byAwIGZvciBsYXJnZSBjb21tb24gc3ltYm9scy4KLQkoZWNvZmZfZ3ByZWxfcmVsb2MpOiBIYW5kbGUgbm9uLXplcm8gYWRkZW5kIGZvciBleHRlcm5hbCBzeW1ib2xzLAotCXdoaWNoIGNhbiBvY2N1ciBmb3IgZ2FzLWdlbmVyYXRlZCByZWxvY3MuCi0JKGVjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZGVkIEJGRF9SRUxPQ19NSVBTX0dQUkVMIGNhc2UuCi0JKiBiZmQuYyAoYmZkX2dldF9ncF9zaXplLCBiZmRfc2V0X2dwX3NpemUpOiBOZXcgZnVuY3Rpb25zLgotCSogTWFrZWZpbGUuaW4gKGJmZC5vKTogTm93IGRlcGVuZHMgb24gY29mZi9zeW0uaCBhbmQgbGliZWNvZmYuaC4KLQotVHVlIE1hciAzMCAwOTozMzoxNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogVXNlIGxtYSBmaWVsZCBmb3IgbG9hZAotCWFkZHJlc3MuCi0JKiBzZWN0aW9uLmM6IEFkZCBkZWNsYXJhdGlvbiBvZiBsbWEgZmllbGQgdG8gc2VjdGlvbiBzdHJ1Y3R1cmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFVzZSBsbWEgZmllbGQgZm9yIGxvYWQKLQlhZGRyZXNzLgotCSogYmZkLWluLmggKGJmZF9zZXRfc2VjdGlvbl92bWEpOiBTZXQgbG1hIGFsb25nIHdpdGggdm1hLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogTm93IGhhbmRsZXMgaW5kaXJlY3QKLQlzeW1ib2xzIGluIGEgYmV0dGVyIHdheS4gKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWcpOiBTZXQgdGhlCi0JTl9JTkRSIGJpdCB3aGVuIG5lY2Vzc2FyeS4gKGFvdXQ8PnNsdXJwX3N5bWJvbF90YWJsZSk6IE1haW50YWluCi0JaW5kaXJlY3Qgc3RhdGUuCi0JKiBzZWN0aW9uLmM6IEFkZGVkIEJGRF9JTkRfU0VDVElPTl9OQU1FIGFuZCBiZmRfaW5kX3NlY3Rpb24uCi0JKGJmZF9tYWtlX3NlY3Rpb24pOiBDb3BlIHdpdGggbmV3IGJ1aWx0aW4gc2VjdGlvbi4KLQkqIHN5bXMuYyAoYmZkX2RlY29kZV9zeW1jbGFzcyk6IENhbiBub3cgcHJpbnQgaW5kaXJlY3Qgc2VjdGlvbgotCWluZm8uCi0KLVdlZCBNYXIgMjQgMTM6MzY6MzMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWShvYmplY3RfcCkpOiAgRmFpbCBpZiBNQUNIVFlQRV9PSyBpcwotCWRlZmluZWQsIGFuZCB5aWVsZHMgZmFsc2UuCi0JKiBhb3V0LW1pcHNic2QuYywgaTM4NmJzZC5jOiAgRGVmaW5lIE1BQ0hUWVBFX09LIGFwcHJvcHJpYXRlbHkuCi0KLQkqIGFyY2hpdmUuYyAoc25hcmZfYXJfaGRyKTogIEFkZCBzdXBwb3J0IGZvciByZWFkaW5nIChvbmx5LAotCXNvIGZhcikgQlNELTQuNC1zdHlsZSBleHRlbmRlZCBoZWFkZXJzLgotCSogYXJjaGl2ZS5jOiAgU29tZSBtb3JlIGNvbW1lbnRzLgotCi1XZWQgTWFyIDI0IDAyOjA1OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZml4IHJ1bGUgZm9yIGR2aSBhbmQgaW5mbywgc28gdGhhdCB0aGUgcmVjdXJzaXZlCi0JbWFrZXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcsIGluc3RlYWQgb2YgYWx3YXlzIGluZm8KLQotV2VkIE1hciAyNCAwMjo1Njo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IERpc2FibGUgb3B0aW1pemVkIGhhbmRsaW5nIGZvciBhcmNoaXZlcyBhbmQKLQlhcmNoaXZlIG1lbWJlcnM7IHRoZXkgbmVlZCBtb3JlIHNwZWNpYWwgcmVhdG1lbnQuICBGb3Igbm93LCB2ZXJpZnkKLQl0aGF0IGNvbXB1dGVkIGFuZCBhY3R1YWwgZmlsZSBwb3NpdGlvbnMgY29ycmVzcG9uZC4KLQotVHVlIE1hciAyMyAwODo0NTozMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1pcHNic2QuYzogUmVuYW1lZCBmcm9tIGFvdXQtbWlwc2JzZC5jLgotCShzZXRfYXJjaF9tYWNoKTogRGVsZXRlIG5vbi1NSVBTIGNvZGUuCi0JKHJlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKiBNYWtlZmlsZS5pbjogQWRqdXN0ZWQuCi0KLQkqIGxpYmJmZC5jIChiZmRfdGVsbCk6IFVwZGF0ZSBgd2hlcmUnIGZpZWxkLgotCShiZmRfc2Vlayk6IERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG5vdCBjaGFuZ2luZyB0aGUgZmlsZQotCXBvc2l0aW9uLiAgSWYgRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWCBpcyBkZWZpbmVkLCBjaGVjayBgd2hlcmUnCi0JZmllbGQgYWdhaW5zdCBhIFNFRUtfU0VUIHJlcXVlc3QuICBDYWxsIGJmZF90ZWxsIHRvIHJlLXVwZGF0ZQotCWB3aGVyZScgZmllbGQgd2hlbiBkb25lLgotCShiZmRfcmVhZCwgYmZkX3dyaXRlKSBbRklMRV9PRkZTRVRfSVNfQ0hBUl9JTkRFWF06IE1haW50YWluCi0JYHdoZXJlJyBmaWVsZC4KLQkqIGhvc3RzL3NwYXJjLmg6IERlZmluZSBGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYLgotCi1Nb24gTWFyIDIyIDIzOjE4OjEwIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGluc3RhbGxjaGVjayB0YXJnZXQKLQotTW9uIE1hciAyMiAxNDo1NzoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBSZWxvY2F0ZSBlbmNhcHN1bGF0ZWQgc3RhYnMKLQlpZiB0aGUgdHlwZSBpcyBub3Qgc3ROaWwuCi0KLVR1ZSBNYXIgMTYgMTA6MzU6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLmMgKGVsZl9saXR0bGVfdmVjLCBlbGZfYmlnX3ZlYyk6IERlbGV0ZSBub3ctaW52YWxpZAotCWZvcndhcmQgZGVjbGFyYXRpb25zLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfc3BhcmNfaG93dG9fdGFibGUpOiBEb24ndCB1c2UgQ09OU1QgaGVyZSwKLQlpdCdzIGltcGxpZWQgYnkgdGhlIHR5cGUuCi0KLUZyaSBNYXIgMTIgMTg6NTg6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogcmVjb2duaXplIHNwYXJjLXN1bi1zb2xhcmlzMiogaW5zdGVhZCBvZiBzcGFyYy1zdW4tc29sYXJpcyoKLQotVHVlIE1hciAgOSAwOToyMzoxMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogcnM2MDAwLWNvcmUuYzogQWRkIC5sZGluZm8gc2VjdGlvbi4KLQotRnJpIE1hciAxMiAxMTo1Nzo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUtFT1ZFUlJJREVTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCi1GcmkgTWFyIDEyIDA4OjMyOjExIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IHdoaXRlc3BhY2UKLQkqIHNlY2xldC5jIChzZWNsZXRfZHVtcF9zZWNsZXQpOiBEb24ndCB0cnkgYW5kIGZpbGwgc2VjdGlvbnMgd2l0aAotCW5vIGNvbnRlbnRzLgotCi1UaHUgTWFyIDExIDE5OjI2OjE1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvZ28zMi5oOiBkb24ndCBkZWZpbmUgUE9TSVhfVVRJTUUKLQotVHVlIE1hciAgOSAxMDo1MjowMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmMzIuYyAoZWxmX29iamVjdF9wKTogIFVzZSBFTEZfQVJDSCBzdG9yZWQgaW4geHZlYyB0byBtYXRjaAotCWFnYWluc3QgbWFjaGluZSBhcmNoaXRlY3R1cmUgc3RvcmVkIGluIHRoZSBFTEYgaGVhZGVyLCB0byByZXNvbHZlCi0JYW1iaWd1aXRpZXMuCi0JKiBlbGYzMi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgQmZkX21ha2Vfc2VjdGlvbiBjYW4gcmV0dXJuCi0JTlVMTCwgc28gb25seSB1c2UgcmVzdWx0cyB3aGVuIG5vbi1OVUxMLgotCSogdGFyZ2V0cy5jIChlbGYzMl9tNjhrX3ZlYywgZWxmMzJfaTg2MF92ZWMpOiAgQWRkIGV4dGVybiBkZWNscwotCWFuZCBhZGQgdG8gdmVjdG9yIG9mIHRhcmdldHMuCi0KLU1vbiBNYXIgIDggMTU6MTM6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogRW5jYXBzdWxhdGVkIFNUQUJTIHN5bWJvbHMKLQlhcmUgYWx3YXlzIGp1c3QgZGVidWdnaW5nIHN5bWJvbHMuCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9bZ3NdZXRfc3ltX2luZGV4KTogTW92ZWQgbWFjcm9zIGZyb20gaGVyZS4uLgotCWxpYmVjb2ZmLmggKGVjb2ZmX1tnc11ldF9zeW1faW5kZXgpOiAuLi50byBoZXJlLgotCi1Nb24gTWFyICA4IDE0OjU1OjEzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChfUEFfUklTQ19JRCk6IERlZmluZWQgaWYgbm90IGFscmVhZHkgZGVmaW5lZCAoZS5nLiwgZm9yCi0JaHB1eCA3KS4gIFBhdGNoIGZyb20gZnJpZWRtYW5AZ251LmFpLm1pdC5lZHUuCi0JKGhwcGFfb2JqZWN0X3ApOiBPbmx5IGNoZWNrIGZvciBETF9NQUdJQyBhbmQgU0hMX01BR0lDIGlmIHRoZXkncmUKLQlkZWZpbmVkLCB3aGljaCB0aGV5IGFyZW4ndCBpbiBocHV4IDcuMC4KLQotCSogYWl4Mzg2LWNvcmUuYzogSW5jbHVkZSB1aW5mby5oIGFuZCBjb3JlZHVtcC5oLiAgUGF0Y2ggZnJvbSBNaW5oCi0JVHJhbi1MZSwgdHJhbmxlQGludGVsbGljb3JwLmNvbS4KLQotRnJpIE1hciAgNSAxNDo1NDoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtbWlwcy5jIChlY29mZl9nZW5lcmljX3JlbG9jKTogSWYgdGhlIGFkZGVuZCBpcyBub24temVybywgZ28KLQlhaGVhZCBhbmQgZG8gdGhlIHJlbG9jYXRpb24uCi0JKGVjb2ZmX3JlZmhpX3JlbG9jKTogRG9uJ3QgdG8gdGhlIHJlbG9jYXRpb24gaGVyZSwganVzdCByZW1lbWJlcgotCXdoYXQgbmVlZHMgdG8gYmUgZG9uZS4KLQkoZWNvZmZfcmVmbG9fcmVsb2MpOiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbiBoZXJlLgotCi1UaHUgTWFyICA0IDE0OjQ0OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQWRkZWQgQkZEX0FTU0VSVCBjYWxscyB0byBlbnN1cmUKLQlyZWxvY3MgYXJlIHJlYXNvbmFibGUuCi0JKiBjb2ZmLW1zeW0uYzogRWxpbWluYXRlZCB1c2VzIG9mIERFRlVOLgotCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBNYXIgIDIgMTc6NTI6NTggMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkoVWx0cml4IDIuMiBzdXBwb3J0IGZyb20gTWljaGFlbCBSZW5kZWxsIDxtaWNoYWVsQG1lcmN1cnkuY3MubXVuLmNhPikKLQkqIGNvbmZpZ3VyZS5ob3N0ICh2YXgtKi11bHRyaXgyKik6ICBBZGQgdHJpcGxldC4KLQkqIGhvc3RzL3ZheHVsdDIuaDogIE5ldyBmaWxlLgotCSogY29uZmlnL3ZheHVsdDIubWg6ICBOZXcgZmlsZS4KLQotCSogYW91dHguaCAoc3RyaW5nLmgpOiAgSW5jbHVkZSBmb3Igc3RyY2hyIGFuZCBmcmllbmRzLgotCSogYXJjaGl2ZS5jIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBtZW1jaHIgYW5kIGZyaWVuZHMuCi0JKiBlbGYzMi5jIChzdHJpbmcuaCk6ICBJbmNsdWRlIGZvciBzdHJyY2hyIGFuZCBmcmllbmRzLgotCi1TYXQgRmViIDI3IDAwOjQ0OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmMgKHN1bm9zNF9yZWxvY190eXBlX2xvb2t1cCk6IFVudXNlZDsgZGVsZXRlZC4KLQkoTVlfc2V0X3NpemVzKTogVXNlIHN1bm9zNF9zZXRfc2l6ZXMuCi0KLQkqIGVsZjMyLmM6IFJlbmFtZWQgZnJvbSBlbGYuYy4gIFNldmVyYWwgQ1BVLXNwZWNpZmljIGZ1bmN0aW9ucwotCWRlbGV0ZWQsIGFzIHdlbGwgYXMgZWxmLWJpZyBhbmQgZWxmLWxpdHRsZSB0YXJnZXRzLgotCSogbGliZWxmLmg6IE5ldyBmaWxlLgotCSogZWxmMzItc3BhcmMuYywgZWxmMzItaTM4Ni5jLCBlbGYzMi1pODYwLmMsIGVsZjMyLW02OGsuYzogTmV3Ci0JZmlsZXMsIG5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy8qLWVsZi5tdCwgdGFyZ2V0cy5jOiBBZGp1c3RlZC4KLQotCSogaTM4NmxpbnV4LmMgKFRBUkdFVE5BTUUpOiBVc2UgaHlwaGVucyBpbnN0ZWFkIG9mIHBhcmVudGhlc2VzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0IG5lZWQKLQl2YXJpYWJsZSAib2xkX3NvZmFyIiBpZiBjb21waWxpbmcgZm9yIGk5NjAuCi0KLQkqIHJlbG9jLmMgKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogRmlyc3QgYXJndW1lbnQgaXMgbm93IGEKLQliZmQgcG9pbnRlci4KLQkqIGxpYmJmZC5oOiBVcGRhdGVkLgotCi0JKiBpZWVlLmMgKGV4dGVuLCBlbnZpKTogInN0YXRpYyIgYmVsb25ncyBmaXJzdCBpbiBkZWNsYXJhdGlvbi4KLQotRnJpIEZlYiAyNiAxNzozNzozNCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jOiBhZGQgc3VwcG9ydCBmb3Igc3ltYm9sc3JlYywgc3JlY29yZHMgd2l0aCBzeW1ib2xzIGluCi0JdGhlbS4KLQotVGh1IEZlYiAyNSAxMTo0MzozMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY2Fjb3Bob255LmN5Z251cy5jb20pCi0KLQkqIGllZWUuYzogIGNhc3QgYWxsIGFyZ3VtZW50cyBvZiBpZWVlX3dyaXRlX2J5dGUgdG8gYmZkX2J5dGUKLQl0byBhdm9pZCBsaW50IGNvbXBsYWludHMuCi0KLVRodSBGZWIgMjUgMDI6MTU6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNlY3Rpb24gIi5zaHN0cnRhYiIgc2hvdWxkIGJlCi0JdHlwZSBTSFRfU1RSVEFCLiAgRG9uJ3QgYWx0ZXIgZmlsZSBvZmZzZXQgZm9yIHNlY3Rpb24gMC4KLQkocmVsb2NfdHlwZV9uYW1lcyk6IE5vdyBhbiBhcnJheSBpbnN0ZWFkIG9mIGEgbWFjcm8uICBTdGlsbCBpbnNpZGUKLQkiI2lmIDAiLCBzaW5jZSBpdCdzIHVzZWQgb25seSBpbiBkZWJ1Z2dpbmcgY29kZSBhbHNvIGluICIjaWYgMCIuCi0JKHN0cnVjdCBlbGZfcmVsb2NfbWFwX2VsdCwgc3RydWN0IGVsZl9yZWxvY19tYXApOiBOZXcgdHlwZXMuCi0JKHNvcnRfcmVsb2NfbWFwKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19yZWxvY19tYXApOiBOZXcgdmFyaWFibGUuCi0JKGVsZl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBGZWIgMjMgMTI6MTc6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZGVkIGJmZF9yZWxvY190eXBlX2xvb2t1cCBhbmQKLQliZmRfbWFrZV9kZWJ1Z19zeW1ib2w7IHRoZXkgd2VyZSBhbHJlYWR5IGluIHRoZSB0YXJnZXQgc3RydWN0dXJlLgotCSogQWRqdXN0ZWQgYWxsIHVzZXMgb2YgSlVNUF9UQUJMRS4KLQkqIGNvZmZnZW4uYywgbGliY29mZi1pbi5oIChjb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCk6IFJlbmFtZWQKLQlmcm9tIGNvZmZfbWFrZV9kZWJ1Z19zeW1ib2wuCi0JKiBsaWJjb2ZmLmg6IFVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0KLQkqIE1pbm9yIGNsZWFudXBzIHByb3Zva2VkIGJ5IGdjYyB3YXJuaW5nczoKLQkqIGFvdXR4LmggKE5BTUUoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApKSwKLQljcHUtaDgzMDAuYyAobG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwKSwKLQljcHUtejhrLmMgKGxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZGVkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaGVzLgotCSogYXJjaGl2ZS5jIChkb19zbHVycF9ic2RfYXJtYXAsIGRvX3NsdXJwX2NvZmZfYXJtYXApLAotCWllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpLAotCWVsZi5jIChlbGZfbWFrZV9zZWN0aW9ucywgZWxmX2Zha2Vfc2VjdGlvbnMsCi0JZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywgZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyk6Ci0JUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzLgotCSogYXJjaHVyZXMuYzogUmVtb3ZlZCAvKiBmcm9tIHdpdGhpbiBjb21tZW50LgotCSogYm91dC5jIChiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6IEluaXRpYWxpemUgcl9leHRlcm4uCi0JKiBvYXN5cy5jIChvYXN5c193cml0ZV9kYXRhKTogSW5pdGlhbGl6ZSBpLgotCi1Nb24gRmViIDIyIDE4OjQwOjA2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGliY29mZi5oIChvYmpfcmF3X3N5bWVudF9jb3VuKTogIE5ldyBtYWNyby4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiAgSW5pdGlhbGl6ZQotCXJhd19zeW1lbnRfY291bnQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiAgTnVtZXJvdXMgbGl0dGxlIGZpeGVzLgotCi1Nb24gRmViIDIyIDE1OjAzOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IHN0QmxvY2sgc3ltYm9scyBhcmUgYWx3YXlzCi0JZGVidWdnaW5nIHN5bWJvbHMuCi0JKGVjb2ZmX2dldF9kZWJ1Zyk6IE9mZnNldCB0aGUgZmRyIGFkciBieSB0aGUgYWRyIG9mIHRoZSBmaXJzdCBwZHIsCi0JZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0b29scyBmcm9tIE1JUFMuCi0KLQkqIGNvbmZpZy9iaWdtaXBzLm10OiBOZXcgZmlsZTsgZGVmYXVsdCB2ZWN0b3IgaXMgZWNvZmZfYmlnX3ZlYy4KLQkqIGNvbmZpZy9pcml4My5tdCwgY29uZmlnL2lyaXg0Lm10OiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChtaXBzLSotZWNvZmYpOiBOZXcgdGFyZ2V0OyB1c2VzIGJpZ21pcHMubXQuCi0JKG1pcHMtc2dpLSosIG1pcHMtYmlnLSopOiBVc2UgYmlnbWlwcyByYXRoZXIgdGhhbiBpcml4My4KLQotV2VkIEZlYiAxNyAyMzo0MDo0MSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaHAzMDBic2QuaDogIEFkZCBncm9zcyBoYWNrIHRvIGRldGVybWluZSB3aGV0aGVyIHdlCi0JYXJlIHJ1bm5pbmcgb24gQlNEIDQuMyBvciBCU0QgNC40LCBhbmQgdXNlIGFwcHJvcHJpYXRlIGluY2x1ZGUKLQlmaWxlcyAoYW5kIHNldCBvdGhlciBwYXJhbWV0ZXJzKSB0byBtYXRjaC4KLQotV2VkIEZlYiAxNyAxMjoyODoxMyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9tYWtlX2VtcHR5X3N5bWJvbCk6IHdyYXAgUEFSQU1TIGFyb3VuZCBhbgotCSAgYW5zaSBkZWZpbml0aW9uIHdoaWNoIG90aGVyd2lzZSBjb25mdXNlcyBub24tYW5zaSBjb21waWxlcnMuCi0KLQkqIGFvdXQtYWRvYmUuYyAoYW91dF9hZG9iZV9vYmplY3RfcCk6IGVsaW1pbmF0ZSBhIHdhcm5pbmcgZnJvbSB2YXgKLQkgIHVsdHJpeCBjYyBieSBmb3J3YXJkIGRlY2xhcmluZyBnZXRlbnYgYXMgaXMgZG9uZSBpbgotCSAgYmZkX2ZpbmRfdGFyZ2V0LgotCi1UdWUgRmViIDE2IDE3OjU2OjU4IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX2luZm9fdG9faG93dG8pOiBjYXN0IGFuIGVudW0gaW50byB1bnNpZ25lZCBjaGFyCi0JICBhdm9pZGluZyBhIGZhdGFsIGVycm9yIGluIHZheCB1bHRyaXggNC4yIGNjLgotCi1UdWUgRmViIDE2IDAwOjQ0OjU0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCwgVkVSU0lPTjogIFJvbGwgdG8gdmVyc2lvbiAyLjEuCi0KLU1vbiBGZWIgMTUgMjA6NDM6NTEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG9hc3lzLmMgKG9hc3lzX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBMaW50LgotCSogc3JlYy5jOiAgV2hpdGVzcGFjZSBjbGVhbnVwLgotCi1GcmkgRmViIDEyIDE0OjIzOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IFByaW50IGNvcnJlY3QgdGFnbmR4IHZhbHVlOwotCWNsZWFuZWQgdXAgb3V0cHV0IGZvcm1hdHRpbmcgYSBiaXQuCi0KLUZyaSBGZWIgMTIgMDg6Mjg6NTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogKkZJWE1FKiB0aGUgSDgvMzAwIGlzIGFsd2F5cwotCXJlbGF4YWJsZS4gIFNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUgZWxzZS4KLQotVGh1IEZlYiAxMSAxNDowOTo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtbWlwc2JzZC5jOiBFbGltaW5hdGVkIHVzZXMgb2YgREVGVU4uCi0JKGFvdXRfbWlwc18qX3ZlYyk6IEFkZGVkIHNlY2xldF9saW5rIGVsZW1lbnQuCi0KLQkqIE1ha2VmaWxlLmluIChCRkRfQkFDS0VORFMsIENGSUxFUywgYW91dC1taXBzYnNkLm8pOiBBZGRlZAotCXN1cHBvcnQgZm9yIGFvdXQtbWlwc2JzZCB0YXJnZXQuCi0KLQkqIGJvdXQuYyAoZ2V0X3ZhbHVlKTogRG9uJ3QgdHJ1bmNhdGUgMzItYml0IGFkZGVuZCB0byAxNiBiaXRzLgotCi1GcmkgRmViICA1IDA4OjA4OjQzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcHUtaDg1MDAuYyAoc2Nhbl9tYWNoKTogcmV0dXJuIGZhbHNlIGlmIGl0J3Mgbm90IGFuIEg4LzUwMAotCi1UaHUgRmViICA0IDEyOjUyOjQwIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JQWRkIHN1cHBvcnQgZm9yIHRoZSBIOC81MDAKLQotCSogY29mZi1oODUwMC5jLCBjcHUtaDg1MDAuYywgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgdGFyZ2V0cy5jCi0KLVRodSBGZWIgIDQgMTI6MzU6MDIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaWJlY29mZi5oOiBOZXcgZmlsZS4gIERlZmluZXMgRUNPRkYgYmFja2VuZCBkYXRhIGZvciBnZGIuCi0JKiBjb2ZmLW1pcHMuYzogTm93IGluY2x1ZGVzIGxpYmVjb2ZmLmguCi0JKGVjb2ZmX2RhdGFfdHlwZSk6IE1vdmVkIHRvIGxpYmVjb2ZmLmguCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBNYWRlIGdsb2JhbGx5IHZpc2libGUgc28gdGhhdCBnZGIgY2FuCi0JY2FsbCBpdC4gIElmIHRoZXJlIGlzIGV2ZXIgYW5vdGhlciBFQ09GRiB0YXJnZXQsIHRoaXMgYW5kIHRoZQotCXN3YXBwaW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgYWNjZXNzZWQgdmlhIGFuIEVDT0ZGIHNwZWNpZmljIHRhcmdldAotCXZlY3Rvci4KLQkqIE1ha2VmaWxlLmluIChjb2ZmLW1pcHMubyk6IERlcGVuZHMgb24gbGliZWNvZmYuaC4KLQotV2VkIEZlYiAgMyAwOToxNDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IFJlbW92ZWQgTUlQUyBzcGVjaWZpYyBpbmZvcm1hdGlvbiwgc2luY2UgY29mZi1taXBzLmMKLQlubyBsb25nZXIgaW5jbHVkZXMgdGhpcyBmaWxlLgotCi0JKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9mZHJfaW4sIGVjb2ZmX3N3YXBfZXh0X2luKTogU2V0IHJlc2VydmVkCi0JYml0cyB0byAwIHRvIG1ha2UgY29tcGFyaXNvbiB0ZXN0IHVzZWZ1bC4KLQotCSogY29uZmlnL2lyaXgzLm1oLCBjb25maWcvaXJpeDQubWggKEhERUZJTkVTKTogU2V0IHRvIC1HIDQgdG8KLQlhdm9pZCBvdmVyZmxvd2luZyBHUCBhY2Nlc3NpYmxlIHNlY3Rpb25zIGluIGJpbnV0aWxzL29iamR1bXAuCi0KLVR1ZSBGZWIgIDIgMTU6MzY6NTUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogIE1hZGUgc3ltYm9sCi0JcmVhZGluZyBtb3JlIHJvYnVzdDogIEZhaWwgaWYgc3RyaW5nIGluZGV4IGlzIG91dCBvZiBzdHJpbmcKLQl0YWJsZSByYW5nZS4KLQotVHVlIEZlYiAgMiAxMTo0MzoyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLCBjYXNlcyBQQ1JFTDI0IGFuZAotCVBDUkVMMTMpOiBEb24ndCB0YWtlIGRzdF9hZGRyZXNzIGludG8gYWNjb3VudDsgdGhlIGlucHV0IGZpbGUgaGFzCi0JYWxyZWFkeSB0YWtlbiBjYXJlIG9mIHRoYXQuCi0KLVR1ZSBGZWIgIDIgMTE6NDE6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1pcHMuYzogQ29tcGxldGVkIHN1cHBvcnQgZm9yIGxpbmtlciBhbmQgYmludXRpbHMuCi0KLU1vbiBGZWIgIDEgMTQ6NDU6MzggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgY2FzZSBBQlMzMik6IEtlZXAKLQlvcmlnaW5hbCBhZGRlbmQgZnJvbSBzZWN0aW9uIGNvbnRlbnRzLgotCi1UaHUgSmFuIDI4IDIxOjAxOjM3IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JRml4IG1pbm9yIGJ1Z3MgcmVwb3J0ZWQgYnkgQ2FybCBHcmVjbywgPGNncmVjb0BwYXJyb3QuY3JlaWdodG9uLmVkdT46Ci0JKiBob3N0cy9kZWx0YTg4LmggKHN0cnRvbCk6ICBGaXggcHJvdG90eXBlLgotCSogY29uZmlnL204OGstY29mZi5tdCAoU0VMRUNUX0FSQ0hJVEVDVFVSRVMpOiAgRml4IG5hbWUuCi0KLVdlZCBKYW4gMjcgMTc6MTY6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBlbGYuYzogR2V0IHJpZCBvZiAiI2lmZGVmIHNwYXJjIi4KLQkoUkVMT0NfVFlQRV9OQU1FUyk6IE5ldmVyIHVzZWQgKGN1cnJlbnRseSksIHNvIGRvbid0IGluY2x1ZGUgaXQuCi0JKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFJlbmFtZWQgZnJvbSBlbGZfaG93dG9fdGFibGUsIGFuZCBhbHdheXMKLQl1c2VkLgotCShlbGZfaW5mb190b19ob3d0byk6IFVzZSBydW50aW1lIGNvbmRpdGlvbmFscyBvbiBDUFUgdHlwZSwgbm90Ci0JY29tcGlsZSB0eXBlIGNvbmRpdGlvbmFscyBvbiBob3N0IENQVS4KLQkoZWxmX2xpdHRsZV92ZWMsIGVsZl9iaWdfdmVjKTogVXNlIGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwLAotCW5vdCBudWxsIHBvaW50ZXIuCi0JKHJlbG9jX3R5cGUsIFJFTE9DX1RZUEVfTkFNRVMpOiBJbmNsdWRlIGkzODYgdmFsdWVzLgotCi1UdWUgSmFuIDI2IDExOjQzOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTRUNfSVNfQ09NTU9OKTogTmV3IHNlY3Rpb24gZmxhZywgbmVlZGVkIGZvciBNSVBTCi0JRUNPRkYgd2hpY2ggaGFzIHR3byBjb21tb24gc2VjdGlvbnMuCi0JKGJmZF9jb21fc2VjdGlvbik6IFNldCBTRUNfSVNfQ09NTU9OIGZsYWcuCi0JKiBiZmQtaW4uaCAoYmZkX2lzX2NvbV9zZWN0aW9uKTogTmV3IG1hY3JvIHRvIHRlc3QgU0VDX0lTX0NPTU1PTi4KLQkqIGFvdXR4LmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLWEyOWsuYywgY29mZi1tODhrLmMsCi0JY29mZi1taXBzLmMsIGNvZmZnZW4uYywgaWVlZS5jLCBvYXN5cy5jLCByZWxvYy5jLCBzeW1zLjogVXNlCi0JYmZkX2lzX2NvbV9zZWN0aW9uIG1hY3JvIHJhdGhlciB0aGFuIGNoZWNraW5nIGZvciBlcXVhbGl0eSB0bwotCWJmZF9jb21fc2VjdGlvbi4KLQotTW9uIEphbiAyNSAxNToyNzozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKF9iZmRfY29mZl9ta29iamVjdF9ob29rKTogUGFzcyBhb3V0aGRyIGFyZ3VtZW50LgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBBY2NlcHQgYW91dGhkciBhcmd1bWVudC4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogUGFzcyBhb3V0aGRyIHRvIG1rb2JqZWN0X2hvb2suCi0JSGFuZGxlIE5VTEwgYW91dGhkciBhcmd1bWVudC4KLQkoY29mZl9vYmplY3RfcCk6IElmIHRoZXJlIGlzIG5vIGFvdXRoZHIsIHBhc3MgaXQgYXMgTlVMTCB0bwotCWNvZmZfcmVhbF9vYmplY3RfcC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdCBmb3IgbWtvYmplY3RfaG9vayBjaGFuZ2VzLgotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbiwgY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBTd2FwCi0JYWRkaXRpb25hbCBNSVBTIEVDT0ZGIGZpZWxkcy4KLQotU2F0IEphbiAyMyAxODozNjoyMCBQU1QgMTk5MyAgUmFscGggQ2FtcGJlbGwgIChyYWxwaGNAcHlyYW1pZC5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBhZGRlZCBtaXBzLWRlYy1ic2QqCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIG1pcHMtZGVjLWJzZCoKLQkqIGFvdXQtbWlwc2JzZC5jOiBuZXcgZmlsZSBmb3IgbWlwcy1kZWMtYnNkKgotCSogYW91dC10YXJnZXQuaDogZG9uJ3QgZGVmaW5lICcnIGlmICdNWV9CRkRfVEFSR0VUJyBpcyBkZWZpbmVkLgotCSogYW91dHguaDogYWRkZWQgbWlwcyBzdXBwb3J0LgotCSogYXJjaHVyZXMuYzogYWRkZWQgbWlwcyBzdXBwb3J0IHRvIGJmZF9kZWZhdWx0X3NjYW4oKS4KLQkqIGNwdS1taXBzLmM6IGFkZGVkIHN1cHBvcnQgZm9yIFI0MDAwICh1bnRlc3RlZCkuCi0JKiBsaWJhb3V0Lmg6IGFkZGVkIE1JUFMxICYgTUlQUzIgbWFnaWMgbnVtYmVycy4KLQkqIHJlbG9jLmM6IGZpeCB0eXBvJ3MgaW4gY29tbWVudHMuIEFkZGVkIEJGRF9SRUxPQyBlbnRyaWVzIHdoaWNoIEkKLQkJaG9wZSB3aWxsIG1ha2UgaXQgaW50byBpbmNsdWRlL2JmZC5oLgotCSogdGFyZ2V0cy5jOiBhZGRlZCBhb3V0X21pcHNfKl92ZWMuCi0KLVdlZCBKYW4gMjAgMTc6MTU6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVjc3RhdGlvbi5tdDogU2V0IERFRkFVTFRfVkVDVE9SIHRvIGVjb2ZmX2xpdHRsZV92ZWMuCi0KLVR1ZSBKYW4gMTkgMDk6MDY6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2FzeW1ib2xfdmFsdWUpOiBBZGQgbmVlZGVkIHBhcmVudGhlc2VzLgotCi0JKiBsaWJjb2ZmLWluLmg6IFVwZGF0ZSBwcm90b3R5cGUgZm9yIGNvZmZfY291bnRfbGluZW51bWJlcnMuCi0KLUZyaSBKYW4gMTUgMTg6MTM6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9oZHJfb3V0LCBlY29mZl9zd2FwX2Zkcl9vdXQsCi0JZWNvZmZfc3dhcF9wZHJfb3V0LCBlY29mZl9zd2FwX3N5bV9vdXQsIGVjb2ZmX3N3YXBfZXh0X291dCwKLQllY29mZl9zd2FwX3JuZHhfb3V0LCBlY29mZl9zd2FwX3JmZF9vdXQsIGVjb2ZmX3N3YXBfb3B0X2luLAotCWVjb2ZmX3N3YXBfb3B0X291dCwgZWNvZmZfc3dhcF9kbnJfaW4sIGVjb2ZmX3N3YXBfZG5yX291dCk6IE5ldwotCWZ1bmN0aW9ucy4KLQkqIGNvZmZzd2FwLmg6IElmIE5PX0NPRkZfUkVMT0NTIGlzIGRlZmluZWQsIGRvbid0IGRlZmluZQotCWJmZF9zd2FwX3JlbG9jX2luIG9yIGNvZmZfc3dhcF9yZWxvY19vdXQuCi0JKiBjb2ZmLW1pcHMuYzogQWRkZWQgY29kZSB0byBsaW5rIGFuZCB3cml0ZSBvdXQgc3ltYm9saWMgZGVidWdnaW5nCi0JaW5mb3JtYXRpb24sIGFuZCB0byBzd2FwIHJlbG9jcyBpbiBhbmQgb3V0LgotCi1UaHUgSmFuIDE0IDE1OjUxOjU4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsaWJjb2ZmLmgsIGNvZmZnZW4uYyAoY29mZl9jb3VudF9saW5lbnVtYmVycyksIGNvZmZjb2RlLmgKLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIHJldHVybnMgdGhlCi0JbnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgaXQgZm91bmQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9saW5lbnVtYmVycyk6IG9ubHkgd3JpdGUgb3V0IGxpbmUgbnVtYmVycwotCWluIHRoZSBzZWN0aW9uIHRoZXkgYmVsb25nIHRvLgotCi1Nb24gSmFuIDExIDE4OjMyOjIyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkZWQgcmVsb2NhdGVhYmxlIGFyZ3VtZW50IHRvCi0JX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMuICBBZGRlZCBfYmZkX3NlY2xldF9saW5rCi0JdGFyZ2V0IHZlY3RvciBmb3IgbGlua2VyIHVzZS4KLQkqIGJmZC5jIChiZmRfc2VjbGV0X2xpbmspOiBOZXcgbWFjcm8uCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZGVkIF9iZmRfc2VjbGV0X2xpbmsuCi0JKiBzZWNsZXQuYyAocmVsLCBzZWNsZXRfZHVtcF9zZWNsZXQpOiBBZGRlZCByZWxvY2F0ZWFibGUgYXJndW1lbnQKLQlhbmQgYm9vbGVhbiByZXR1cm4gdmFsdWUuICBNYWRlIHN0YXRpYy4KLQkoYmZkX2dlbmVyaWNfc2VjbGV0X2xpbmspOiBSZW5hbWVkIGZyb20gc2VjbGV0X2R1bXAuICBBZGRlZAotCXJlbG9jYXRlYWJsZSBhcmd1bWVudC4KLQkqIHJlbG9jLmMgKGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCi0JcmVsb2NhdGVhYmxlIGFyZ3VtZW50IChpZiByZWxvY2F0ZWFibGUsIHNhdmVzIHJlbG9jcykuCi0JKiBib3V0LmMgKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksCi0JcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IEFkZGVkCi0JcmVsb2NhdGVhYmxlIGFyZ3VtZW50IChpZiByZWxvY2F0ZWFibGUsIGp1c3QgY2FsbHMKLQliZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpLgotCSogbGliY29mZi1pbi5oIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IEFkZGVkIHJlbG9jYXRlYWJsZQotCWFyZ3VtZW50IHRvIHByb3RvdHlwZS4KLQkqIEFsbCB0YXJnZXRzOiBTZXQgbmV3IF9iZmRfc2VjbGV0X2xpbmsgdmVjdG9yIHRvCi0JYmZkX2dlbmVyaWNfc2VjbGV0X2xpbmsuCi0KLVNhdCBKYW4gIDkgMjE6Mjk6MzIgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jOiAgI2luY2x1ZGUgc2VjbGV0LmguCi0KLVNhdCBKYW4gIDkgMTk6NDg6MTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jIChocHBhX29iamVjdF9zZXR1cCk6ICBHZXQgcmlkIG9mIGFsbCBrbm93bGVkZ2Ugb2Ygc3RhYnMKLQlkZWJ1ZyBpbmZvLiAgU2V0dXAgaW5mbyBhYm91dCBsaW5rZXIgc3ltYm9scyBvbmx5LCBhbmQgdXNlCi0Jc3RhbmRhcmQgYmZkIGZpZWxkcyB0byBob2xkIHRoZSBpbmZvLgotCSogKGhwcGFfb2JqZWN0X3ApOiAgUmVtb3ZlIHVubmVlZGVkIGRlY2xzLgotCSogKGhwcGFfbmV3X3NlY3Rpb25faG9vayk6ICBHZXQgcmlkIG9mIG1vc3Qgb2YgdGhpcy4KLQkqIGxpYmhwcGEuaCAoc3RydWN0IGhwcGFkYXRhKTogIFJlbW92ZSB0ZW4gcG91bmRzIG9mIHVzZWxlc3MgdWdseQotCWZhdC4gIFJlbW92ZSBhbGwga25vd2xlZGdlIG9mIHN0YWJzLCByZW1vdmUgcmVkdW5kYW50IGtub3dsZWRnZSBvZgotCWxpbmtlciBzeW1ib2xzLgotCSogUmVtb3ZlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGZpZWxkcyB3aGljaCBhcmUgbm93IGdvbmUuCi0KLUZyaSBKYW4gIDggMTU6MjA6MDAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogYWxsb3cgU0VDX05FVkVSX0xPQUQgdG8gdHVybiBvbgotCVNUWVBfTk9MT0FEIGJpdC4KLQkqIGNvZmYtejhrLmM6IGRlbGV0ZSB1bnVzZWQgcmVsb2MgZnVuY3Rpb25zCi0KLUZyaSBKYW4gIDggMTU6NDc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBBZGRlZCBlY29mZl90ZGF0YSB0byB0ZGF0YSB1bmlvbi4KLQkqIHRhcmdldHMuYyAoZW51bSB0YXJnZXRfZmxhdm91cik6IEFkZGVkIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ci4KLQkqIGNvZmYtbXN5bS5jOiBVc2UgREVGVU4gZm9yIGZ1bmN0aW9uIGRlZmluaXRvbnMuCi0JKiBjb2ZmLW1pcHMuYzogQWRkZWQgY29kZSB0byByZWFkIGFuZCBwcmludCBzeW1ib2xzLCBhbmQgdG8gZmluZAotCWxpbmUgbnVtYmVycy4KLQotCSogY29mZmNvZGUuaDogTW92ZWQgbWFueSBnZW5lcmljIGZ1bmN0aW9ucyBpbnRvIGNvZmZnZW4uYy4gIE1vdmVkCi0Jc3dhcHBpbmcgZnVuY3Rpb25zIGludG8gY29mZnN3YXAuaCBmb3IgRUNPRkYgdXNlLiAgTW92ZWQKLQlyZWxvY2F0aW9uIGZ1bmN0aW9ucywgb25seSB1c2VkIGJ5IGg4MzAwIGFuZCB6OGssIGludG8gcmVsb2MxNi5jLgotCUFkZGVkIGhvb2tzIGZvciBjb2ZmZ2VuLmMgZnVuY3Rpb25zIHRvIGJhY2tlbmQgZGF0YSBzdHJ1Y3R1cmUsIGFuZAotCWFkZGVkIGhvb2sgZnVuY3Rpb25zLiAgU3RpbGwgbW9yZSBjb3VsZCBiZSBkb25lLgotCSogY29mZnN3YXAuaDogTmV3IGZpbGUgdG8gaG9sZCBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLgotCSogY29mZmdlbi5jOiBOZXcgZmlsZSB0byBob2xkIGdlbmVyaWMgQ09GRiBmdW5jdGlvbnMuCi0JKiByZWxvYzE2LmM6IE5ldyBmaWxlIHRvIGhvbGQgaDgzMDAgYW5kIHo4ayBzcGVjaWZpYyByZWxvY2F0aW9uCi0JZnVuY3Rpb25zLgotCSogbGliY29mZi1pbi5oOiBBZGRlZCBkZWNsYXJhdGlvbnMgZm9yIGZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQgdG8gaW5jb3Jwb3JhdGUgY2hhbmdlcy4KLQkqIGNvZmYtaDgzMDAuYzogRnVuY3Rpb24gbmFtZSBjaGFuZ2VzLgotCSogY29mZi16OGsuYzogRnVuY3Rpb24gbmFtZSBjaGFuZ2VzLiAgVXNlIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcwotCWhvb2sgcmF0aGVyIHRoYW4gZGVmaW5pbmcgRVhUUkFfQ0FTRVMuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgbmV3IGZpbGVzIGNvZmZnZW4gYW5kIHJlbG9jMTYuICBBZGRlZAotCWRlcGVuZGVuY2llcyBvZiBjb2ZmLSoubyBvbiBjb2Zmc3dhcC5oIGFuZCBzZWNsZXQuaC4KLQotVGh1IEphbiAgNyAxNjoxNjoyNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25zKTogIEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcKLQlhYm91dCBkaXNjYXJkaW5nIGNvbnN0LgotCi1XZWQgSmFuICA2IDAwOjE2OjQ5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jLCBzZWNsZXQuYywgZWxmLmMgdXNlIGJmZF94bWFsbG9jIGluc3RlYWQgb2YgbWFsbG9jCi0KLVR1ZSBKYW4gIDUgMDk6MzU6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHBvc3QtdGFyZ2V0KTogSWYgLS13aXRoLW1pbmltYWwtYmZkIGlzIHNwZWNpZmllZCwKLQlzZXQgTUlOSU1JWkU9MS4KLQotTW9uIEphbiAgNCAwNzoyMDowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZHMpOiBvbmUgb2YgbXkgYm9hcmRzIHdhbnRzIGEgQ1IgYmV0d2VlbgotCXJlY29yZHMuCi0KLVdlZCBEZWMgMzAgMTI6NDY6MzAgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiBzZXQgc3ltZGVmX2NvdW50IGNvcnJlY3RseQotCShpdCBicm9rZSBhIGNvdXBsZSBvZiB3ZWVrcyBhZ28pLgotCi1UdWUgRGVjIDI5IDIxOjQxOjA1IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogU3dpdGNoIGJhY2sgdG8gInN0cnVjdCAuLi4iIGZvcgotCXJldHVybiB0eXBlLCBzbyBsaWJiZmQuaCBkb2Vzbid0IHJlZmVyZW5jZSB1bmRlZmluZWQgdHlwZWRlZm5hbWVzLgotCi1UdWUgRGVjIDI5IDEzOjU0OjM1IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogdXNlIG5hbWUgSTM4NkFJWE1BR0lDIHJhdGhlcgotCXRoYW4gSTM4NlNWTUFHSUMuCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXgpOiBkb24ndCBwb2ludGVyaXplIGEgbmVnYXRpdmUgdGFnbmR4Ci0JKHNvbWV0aW1lcyBnZW5lcmF0ZWQgYnkgU0NPIDMuMnY0IGNjKS4KLQotCSogYm91dC5jIChjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrLAotCWJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IHdhcm4gaWYgcmVsb2NhdGluZyBhZ2FpbnN0Ci0JYW4gdW5kZWZpbmVkIHN5bWJvbC4KLQotTW9uIERlYyAyOCAxNDozMDo1NSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmM6ICBHZXQgcmlkIG9mIERFRlVOLCB1c2UgbW9yZSBjb252ZW50aW9uYWwgcHJvbG9nIHN0dWZmLgotCU1ha2UgYSBidW5jaCBtb3JlIHJvdXRpbmVzIGJlIHN0YXRpYy4KLQkqIGhwcGEuYyAoZmlsbF9zcGFjZXMpOiAgR2V0IHJpZCBvZiB0aGlzLCByZXBsYWNlIHdpdGggbXVjaCBiZXR0ZXIKLQl3cml0dGVuIHNldHVwX3NlY3Rpb25zKCkuCi0JKiAoc2V0dXBfc2VjdGlvbnMpOiAgTmV3IHJvdXRpbmUgdG8gY3JlYXRlIEJGRCBzZWN0aW9ucyBmb3IgZWFjaAotCXNwYWNlIGFuZCBzdWJzcGFjZSBpbiBTT00gZmlsZXMuCi0JKiAoaHBwYV9vYmplY3Rfc2V0dXApOiAgVXNlIEJGRCBzZWN0aW9ucyBjcmVhdGVkIGJ5Ci0Jc2V0dXBfc2VjdGlvbnMoKSB0byBsb2NhdGUgR0RCIHN5bWJvbCB0YWJsZSBpbmZvLgotCSogKG1ha2VfdW5pcXVlX3NlY3Rpb24pOiAgTmV3IHJvdXRpbmUgdG8gY3JlYXRlIGEgQkZEIHNlY3Rpb24uICBJdAotCWVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gbmFtZSBpcyB1bmlxdWUsIGFuZCB3aWxsIGdlbmVyYXRlIGEgdW5pcXVlCi0Jb25lIGlmIG5lY2Vzc2FyeS4KLQkqIChocHBhX29iamVjdF9wKTogIEJlY29tZSBtdWNoIG1vcmUgcGFyYW5vaWQgYWJvdXQgZmlsZSBoZWFkZXIuCi0JKiAobWFrZV9iZmRfYXNlY3Rpb24pOiAgQ2FsbCBiZmRfbWFrZV9zZWN0aW9uIHRvIGRvIHRoZSBkaXJ0eQotCXdvcmsuICBTaW1wbGlmeSBjb2RlIHNvbWV3aGF0LgotCSogKGhwcGFfY29yZV9maWxlX3ApOiAgVXNlIHByb3BlciBuYW1lIGZvciBzdGFjayBzZWN0aW9uLgotCSogbGliaHBwYS5oOiAgUmVtb3ZlIG1pbGxpY29kZV9zdGFydCwgbWlsbGljb2RlX2VuZCBkZWNscy4KLQotTW9uIERlYyAyOCAxMTowMzoyMiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvZmYtd2UzMmsubywgY29mZi16OGsubyk6IE5vdGUgZGVwZW5kZW5jaWVzLgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRm9yIG5vcm1hbCAyLSBvciA0LWJ5dGUKLQlyZWxvY3MsIGRvbid0IGJvdGhlciBkb2luZyB0aGUgYWRqdXN0bWVudCBpZiB0aGUgdmFsdWUgdG8gYWRkIGlzCi0JemVyby4KLQotU3VuIERlYyAyNyAxNzo0NTowNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfc2l6ZSk6ICBOZXcgZnVuY3Rpb24gdGhhdCBnZXRzIGFuIHVwcGVyIGJvdW5kCi0Jb24gdGhlIHBvc3NpYmxlIHNpemUgb2YgYW55IG9iamVjdCBpbiBhIGJmZC4KLQkqIGVsZi5jIChiZmRfZWxmX2ZpbmRfc2VjdGlvbiwgZWxmX2dldF9zdHJfc2VjdGlvbiwKLQllbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6ICBSZXdyaXRlIHRvIGF2b2lkIE5VTEwgcG9pbnRlcgotCWRlcmVmZXJlbmNlcy4KLQkqIGVsZi5jIChlbGZfYmlnX3ZlYywgZWxmX2xpdHRsZV92ZWMpOiAgRG9jdW1lbnQgbGFzdCB0aHJlZQotCW1lbWJlcnMgaW5pdGlhbGl6ZWQgdG8gTlVMTC4KLQotVGh1IERlYyAyNCAxNzo0OTowOSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogY2hhbmdlIGEgJ2NvbnN0JyB0byAnQ09OU1QnLCBvciBlbHNlIEhQIEMgY29tcGlsZXIgZGllcwotCi1Nb24gRGVjIDIxIDE2OjMzOjM0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3RkLWhvc3QuaDogIE5ldyBmaWxlLiAgQXR0ZW1wdCBhdCBhIGdlbmVyaWMvZGVmYXVsdAotCXNldCBvZiBkZWZpbml0aW9ucywgdG8gZGlzY291cmFnZSBwb3J0aW5nIHRvIG5ldyBob3N0cyBieSBjb3B5aW5nLgotCSogaG9zdHMvbmV3cy5oOiAgUmVtb3ZlZC4KLQkqIGhvc3RzL3NwYXJjLmg6ICBVc2Ugc3RkLWhvc3QuaC4KLQkqIGJmZC1pbi5oOiAgTmV3IG1hY3JvcyBiZmRfYXN5bWJvbF9iZmQgYW5kIGJmZF9hc3ltYm9sX2ZsYXZvdXI7Ci0JcGVyaGFwcyB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIHRoZSB0aGVfYmZkIGZpZWxkIGZyb20gZWFjaCBzeW1ib2wuCi0JKiBzeW1zLmMgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkpOiAgUmVtb3ZlIHVudXNlZCBmaWVsZAotCWFwcF9kYXRhLiAgQWRkIGNvbW1lbnQgbm90aW5nIHRoYXQgdGhlX2JmZCBpcyBhbG1vc3QgcmVkdW5kYW50LAotCWJ1dCBub3QgcXVpdGUuCi0JKiBhb3V0eC5oLCBjb2ZmLWEyOWsuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmY29kZS5oOgotCVVzZSBuZXcgbWFjcm9zIGJmZF9hc3ltYm9sX2JmZCBhbmQgYmZkX2FzeW1ib2xfZmxhdm91ci4KLQkqIGhwcGEuYyAoZmlsbF9zcGFjZXMpOiAgTWFrZSBzbGlnaHRseSBtb3JlIHJlYnVzdC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFsbG93IHN0ZC1ob3N0IGFzIHRoZSAiZGVmYXVsdCIgaG9zdC4KLQotTW9uIERlYyAyMSAxNzoyNDoxMyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIEFkZCBzdHJ1Y3QgaHBwYV9jb3JlX2RhdGEgdG8gdGRhdGEgdW5pb24uCi0JKiBocHBhLmM6ICBDb25kaXRpb25hbGl6ZSBvbiBIT1NUX0hQUEFIUFVYIGluc3RlYWQgb2YgaHA5MDAwczgwMC4KLQlHZXQgcmlkIG9mIEhQUEEvQlNEIHNwZWNpZmljIGNvZGUuICBUaGF0IHdpbGwgZ28gc29tZXdoZXJlIGVsc2UKLQlzb21lZGF5LgotCSogKGZpbGxfc3BhY2VzKTogIERvbid0IHNwaW4gZm9yZXZlciBhbmQgZGllIGlmIHlvdSBkb24ndCBmaW5kCi0JJE1JTExJQ09ERSQgc3Vic3BhY2UuCi0JKiAoaHBwYV9vYmplY3RfcCk6ICBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgcmVhbCBob25lc3QtdG8tY3RodWx1Ci0JZXhlYyBmaWxlIQotCSogKGhwcGFfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsLCBocHBhX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOgotCU1ha2UgdGhlc2Ugd29yayBmb3IgSFBVWC4KLQkqIChtYWtlX2JmZF9hc2VjdGlvbik6ICBOZXcgcm91dGluZSB0byBtYWtlIHNlY3Rpb24gY3JlYXRpb24gYQotCWxpdHRsZSBlYXNpZXIuCi0JKiAoaHBwYV9jb3JlX2ZpbGVfcCk6ICBDb21wbGV0ZWx5IHJld3JpdGUsIGxlYXZlIG91dCBidWdzLgotCSogbGliaHBwYS5oOiAgI2luY2x1ZGUgdGhlIHJpZ2h0IHN5c3RlbSBmaWxlcy4gIFJlZGVmaW5lIGFsbCBvZgotCXRoZSBzdHJ1Y3RzL21hY3JvcyBmb3IgaGFja2luZyBjb3JlIGZpbGVzIHRvIHVzZSBtb3JlIHNlbnNpYmxlCi0JSFBVWCBjb3JlIGZpbGUgc3RydWN0dXJlcy4KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBDb25kaXRpb25hbGl6ZSBocHBhX3ZlYyBvbgotCUhPU1RfSFBQQUhQVVgsIG5vdCBocDkwMDBzODAwLgotCSogaG9zdHMvaHBwYWhwdXguaDogICNpbmNsdWRlIHN0ZGxpYi5oIHRvIGdldCBjb3JyZWN0IGRlY2xzIGZvcgotCW1hbGxvYyBhbmQgcmVhbGxvYy4gICNkZWZpbmUgSE9TVF9IUFBBSFBVWC4KLQotTW9uIERlYyAyMSAxMjo0MDoxMCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIFBhdGNoZXMgZnJvbSBNaW5oIFRyYW4tbGUgPG10cmFubGVAcGFyaXMuaW50ZWxsaWNvcnAuY29tPi4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWlzYyosIGkzODYtKi1haXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmUuaG9zdCAoaTM4Ni0qLWlzYyosIGkzODYtKi1haXgqKTogTmV3IGhvc3RzLgotCSogaG9zdHMvaTM4NmlzYy5oLCBjb25maWcvaTM4NmlzYy5taDogTmV3IGZpbGVzIGZvciBJbnRlcmFjdGl2ZQotCVVuaXguCi0JKiBob3N0cy9pMzg2YWl4LmgsIGNvbmZpZy9pMzg2YWl4Lm1oOiBOZXcgZmlsZXMgZm9yIEFJWCBvbiBQUy8yLgotCSogYWl4Mzg2LWNvcmUuYzogTmV3IGZpbGUgZm9yIGhhbmRsaW5nIGNvcmUgZmlsZXMgb24gQUlYIG9uIFBTLzIuCi0JKiB0YXJnZXRzLmM6IGlmIEFJWDM4Nl9DT1JFLCB1c2UgYWl4Mzg2X2NvcmVfdmVjLgotCSogY29mZmNvZGUuaCAoY29mZl9yZWFsX29iamVjdF9wKTogY2hlY2sgZm9yIEkzODZTVk1BR0lDIGFzIHdlbGwKLQlhcyBJMzg2TUFHSUMuCi0KLUZyaSBEZWMgMTggMTA6MjA6MjcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGZsYWdzIHRvIDAsIGZpeGluZwotCTE5MjcuCi0KLVRodSBEZWMgMTcgMTk6MzU6MzIgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHZpIHRhcmdldAotCi1UaHUgRGVjIDE3IDAwOjM2OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIFVzZSByaWdodCBuYW1lIGZvciB0ZWtoZXggdGRhdGEgc3RydWN0LgotCSogdGVraGV4LmM6ICBJbnNlcnQgbGVhZGluZ19jaGFyICgwKSBpbnRvIGJmZF90YXJnZXQgc3RydWN0LiAgU3R5bGUuCi0JKiBsaWJjb2ZmLmg6ICBVcGRhdGVkIHRvIGdldCBzcGFjaW5nIGNoYW5nZSBmcm9tIGNvZmZjb2RlLmguCi0JKiB0cmFkLWNvcmUuYzogIGxlYWRpbmdfY2hhciBpcyAwIChubyBzeW1ib2xzISksIG5vdCAnXycuCi0KLVR1ZSBEZWMgMTUgMTU6NDA6MzAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfYnNkX2FybWFwLCBkb19zbHVycF9jb2ZmX2FybWFwKTogIE5ldwotCWZ1bmN0aW9ucywgd2l0aCB0aGUgImd1dHMiIG9mIHRoZSBvbGQgYmZkX3NsdXJwX2JzZF9hcm1hcAotCWFuZCBiZmRfc2x1cnBfY29mZl9hcm1hcCwgYnV0IGFzc3VtaW5nIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZAotCWlmIHRoZSBhcm1hcCBpcyBwcmVzZW50IG9yIG5vdC4KLQlBbHNvLCByZXdyaXRlIGEgYml0IHRvIGF2b2lkIGtlZXBpbmcgYXJvdW5kIG9ic3RhY2sgZGF0YQotCXRoYXQgd2UgZG9uJ3QgbmVlZC4KLQkqIGFyY2hpdmUuYyAoc25hcmZfYXJfaGVhZGVyLCBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOgotCVZhcmlvdXMgZml4ZXMgdG8gY29ycmVjdGx5IGhhbmRsZSBDT0ZGX3N0eWxlIGFyY2hpdmVzIG5hbWVzLgotCShOb3RlIHRoYXQgYmVjYXVzZSB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgJy8nLCB0aGUgbmFtZXMgY2FuCi0JaGF2ZSBlbWJlZGRlZCBzcGFjZXMuKQotCSogYXJjaGl2ZS5jIChiZmRfc2x1cnBfYXJtYXApOiAgTmV3IGZ1bmN0aW9uLCByZXBsYWNlcyBvbGQKLQliZmRfc2x1cnBfYnNkX2FybWFwIGFuZCBiZmRfc2x1cnBfY29mZl9hcm1hcC4gIFJlY29nbml6ZXMKLQlfZWl0aGVyXyBmb3JtYXQsIGFuZCBjYWxscyBkb19zbHVycF9ic2RfYXJtYXAgb3IKLQlkb19zbHVycF9jb2ZmX2FybWFwIGlmIGVpdGhlciBmb3JtIG9mIG1hcCBpcyBzZWVuLgotCSogbGliYmZkLWluLmg6ICBDaGFuZ2VkIGJmZF9zbHVycF9ic2RfYXJtYXAgYW5kCi0JYmZkX3NsdXJwX2NvZmZfYXJtYXAgaW50byBtYWNybyBzeW5vbnltcyBmb3IgYmZkX3NsdXJwX2FybWFwLgotCSogZWxmLmMgKGVsZl9zbHVycF9hcm1hcCwgZWxmX3dyaXRlX2FybWFwKTogIEZpeC4KLQkqIE1ha2VmaWxlLmluIChBUl9GTEFHUyk6ICBVc2UgcmMgaW5zdGVhZCBvZiBub24tc3RhbmRhcmQgcWMuCi0KLU1vbiBEZWMgMTQgMTc6MDg6MDggMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaHBwYS5jOiAgI2luY2x1ZGUgInN5c2RlcC5oIiwgbm90IDxzeXNkZXAuaD4uCi0JKiBsaWJocHBhLmg6ICBNYWtlIG1pbGxpY29kZV9zdGFydCBhbmQgbWlsbGljb2RlX2VuZCBiZSB1bnNpZ25lZAotCWludCB0byBiZSBzYW1lIHR5cGUgYXMgQ09SRV9BRERSIGluIEdEQi4gIFdoeSBhcmUgdGhlc2UgaGVyZT8KLQotU2F0IERlYyAxMiAxNTo1NDozNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaTM4Ni5jIChDQUxDX0FEREVORCk6IGlmIHJlbG9jIGlzIFBDIHJlbGF0aXZlLCBhZGQgdGhlCi0JdmFkZHIgb2YgdGhlIHNlY3Rpb24gdG8gdGhlIGFkZGVuZC4KLQkqIHRhcmdldHMuYzogaWYgTUlOSU1JWkUgaXMgMSwgYW5kIFNDT19DT1JFIGlzIGRlZmluZWQsIGFkZAotCVNDT19DT1JFIHRvIFNFTEVDVF9WRUNTLgotCSh0YXJnZXRfdmVjdG9yKTogYWRkIHNjb19jb3JlX3ZlYy4KLQkqIHNjby1jb3JlLmMgKHNjb19jb3JlX3ZlYyk6IGFkZCBsZWFkaW5nIHVuZGVyc2NvcmUgaW5pdGlhbGl6ZXIuCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zY28qKTogdXNlIHRhcmdldCBpMzg2LXNjby4KLQkqIGNvbmZpZy9pMzg2LXNjby5tdDogbmV3IGZpbGU7IGRlZmluZSBTQ09fQ09SRS4KLQotVGh1IERlYyAxMCAwMjoxMzoxNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX29iamVjdF9wKTogIEZpeCAhc3RyY21wIHRoaW5rby4KLQotRnJpIERlYyAgNCAxNDowMjo0OSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogTm93IHN0YXRpYyBhbmQgY29uc3QuCi0KLVRodSBEZWMgIDMgMTY6NTQ6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bGludXguaDogSW5jbHVkZSB1bmlzdGQuaC4KLQotCSogYW91dHguaCAocHJpbnRfc3ltYm9sKTogYW91dF9zdGFiX25hbWUgcmV0dXJucyBhIGNvbnN0YW50Ci0Jc3RyaW5nLgotCSogbGliYW91dC5oIChhb3V0X3N0YWJfbmFtZSk6IEZpeCBwcm90b3R5cGUuCi0JKiBzdGFiLXN5bXMuYyAoYW91dF9zdGFiX25hbWVzKTogQXJyYXkgaXMgbm93IGNvbnN0LgotCShhb3V0X3N0YWJfbmFtZSk6IFJldHVybiB2YWx1ZSBpcyBub3cgcG9pbnRlciB0byBjb25zdC4KLQotCSogYW91dHguaCwgYXJjaGl2ZS5jLCBhcmNodXJlcy5jLCBjb2ZmY29kZS5oLCBjdG9yLmMsIHJlbG9jLmMsCi0Jc3ltcy5jOiBEb2MgZml4ZXMuCi0KLQkqIHN5bXMuYyAoYXN5bWJvbCk6IEFkZGVkIG5ldyBmaWVsZCAiYXBwX2RhdGEiLCBmb3IgZGF0YQotCXBhcnRpY3VsYXIgdG8gdGhlIGFwcGxpY2F0aW9uLiAgU29tZSBvZiB0aGUgbGlua2VyIGZsYWdzIG91Z2h0IHRvCi0JZ2V0IG1vdmVkIHRvIHRoaXMgZmllbGQgc29tZWRheS4KLQotCSogYXJjaHVyZXMuYyAoYmZkX2RlZmF1bHRfc2Nhbik6IFJlY29nbml6ZSBhIGZldyBtb3JlIG51bWJlcnM6Ci0JODA0ODYsIDgwOTYwLCBhbmQgOTYwLgotCi0JKiBiZmQtaW4uaCAoQ09GRl9TV0FQX1RBQkxFKTogTmV3IGlzIGp1c3QgYWRkcmVzcyBvZgotCWJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlLCBjYXN0IHRvIFBUUi4KLQkqIGJmZC5jIChiZmRfY29mZl9zd2FwXyopOiBEZWxldGVkIG1hY3Jvcy4KLQkqIHRhcmdldHMuYyAoc3RydWN0IGJmZF90YXJnZXQpOiBEZWxldGVkIENPRkYtc3BlY2lmaWMgc3dhcHBpbmcKLQlyb3V0aW5lIHBvaW50ZXJzLgotCSogY29mZmNvZGUuaCAodHlwZSBiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBOZXcgc3RydWN0dXJlIHR5cGUsCi0JY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIENPRkYtc3BlY2lmaWMgc3dhcHBpbmcgcm91dGluZXMuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogTmV3IGRhdGEgc3RydWN0dXJlLCB0byBiZSB1c2VkIHdoZW4KLQlOT19DT0ZGX1NZTUJPTFMgYW5kIE5PX0NPRkZfTElORU5PUyBhcmUgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N3YXBfKik6IE5ldyBtYWNyb3MuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19jb2ZmX3N3YXBfdGFibGUpOiBOZXcgZGF0YSBzdHJ1Y3R1cmUuCi0JKGVjb2ZmX2JpZ192ZWMpOiBVc2UgaXQuCi0JKiBBbGwgQ09GRiB0YXJnZXRzOiBNb3ZlZCBDT0ZGX1NXQVBfVEFCTEUgdG8gdGFyZ2V0LXNwZWNpZmljIGRhdGEuCi0JKiBBbGwgb3RoZXIgdGFyZ2V0czogRGVsZXRlZCBjb2ZmLXNwZWNpZmljIHZlY3RvciBlbnRyaWVzLgotCi0JKiB0cmFkLWNvcmUuYzogRml4ZWQgc29tZSBgUEFSQU1TJyB1c2VzIHRoYXQgd2VyZSBtaXNzaW5nCi0JcGFyZW50aGVzZXMuCi0KLVN1biBOb3YgMjkgMDg6Mzc6MTMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBQcm90ZWN0IGFyZyBwcm90b3R5cGUgaW4KLQljYWxsYmFja190b19yZWFsX29iamVjdF9wIHdpdGggUEFSQU1TIG1hY3JvIGZvciBub24tQU5TSSBjb21waWxlcnMuCi0KLVNhdCBOb3YgMjggMDQ6MDE6MjEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmgsIGFvdXRmMS5oLCB0cmFkLWNvcmUuYywgY29mZmNvZGUuaCwgbGliYW91dC5oLAotCWxpYmJmZC1pbi5oLCBiZmQtaW4uaDogRWxpbWluYXRlIGFsbCBQUk9UTyBjYWxscywgcmVwbGFjZSB3aXRoCi0JUEFSQU1TIGZvciByZWFkYWJpbGl0eS4KLQotCSogYW91dHguaDogIEFkZCB0eXBlIHRvIGNhbGxiYWNrIHBhcmFtZXRlci4KLQkqIGNvZmYtbWlwcy5jOiAgRG9uJ3QgY2FsbCB0cmFkLWNvcmUuaCwgbm90IG5lZWRlZC4KLQkqIHRyYWQtY29yZS5jOiAgSW5jb3Jwb3JhdGUgdHJhZC1jb3JlLmggZGVjbGFyYXRpb25zLiAgRml4IGNvbW1lbnRzLgotCSogdHJhZC1jb3JlLmg6ICBFbGltaW5hdGUsIHVudXNlZC4KLQotV2VkIE5vdiAxOCAxMzoxNjoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXQpOiBpZiBkZWZhdWx0IHRhcmdldCBpc24ndCBmb3VuZAotCXRoZW4gbG9vayB0aHJvdWdoIHRoZSBlbnRpcmUgbGlzdCByYXRoZXIgdGhhbiByZXR1cm4gZWFybHkuCi0KLU1vbiBOb3YgMTYgMTQ6MzM6MDMgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTk2MC1jb2ZmLm10OiByZW9yZGVyIHZlYyB0byBtYXRjaCBiZmRfY2hlY2tfZm9ybWF0IChmcm9tIFBlcikKLQotVGh1IE5vdiAxMiAxNzowMTo0MSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gcHJlZml4IGFuZCBleGVjX3ByZWZpeCBpbiBGTEFHU19UT19QQVNTCi0KLVRodSBOb3YgMTIgMDk6NDY6NDcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtejhrLmM6IGNoZWNrcG9pbnQsIG1vcmUgYWRkcmVzc2luZyBtb2RlcyBoYW5kbGVkCi0JKiBjb2ZmY29kZS5oIChnZXRfdmFsdWUpOiBkb24ndCB0cnVuY2F0ZSByZWxvYy0+YWRkZW5kIGZpZWxkLCBpdCdzCi0JYSBsb25nIG5vdy4KLQotV2VkIE5vdiAxMSAyMzo1Nzo1NSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiB3ZTMyay5tdCAoVERFRkFVTFRTKTogVXNlIHdlMzJrY29mZl92ZWMsIG5vdCBpMzg2Y29mZl92ZWMuCi0KLVR1ZSBOb3YgMTAgMTQ6MDQ6MzggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWlub3IgdHdlYWtzIHRvIG1ha2UgJChDQykgY29tbWFuZCBsaW5lcyBtb3JlIGNvbnNpc3RlbnQKLQotTW9uIE5vdiAgOSAyMzo1ODoxNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yLCBiZmRfY2xvc2UpOiAgQWRkIGRvYyBhYm91dCBjYWNoZWluZwotCWFuZCBhYm91dCB3aGVuIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGNsb3NlZC4KLQotU2F0IE5vdiAgNyAwMDo0MjoyMCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBNYWtlIHN1cmUgYWxpZ25tZW50IHJlbG9jcyBnZXQKLQl3cml0dGVuIG91dCBjb3JyZWN0bHkuCi0KLVRodSBOb3YgIDUgMTU6MzQ6MTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmM6IE5ldyBzZWN0aW9uIGJpdCBTRUNfU0hBUkVEX0xJQlJBUlkuCi0JY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBpZiBTVFlQX05PTE9BRCAmJiAoU1RZUF9URVhUIHx8Ci0JU1RZUF9EQVRBKSwgc2V0IFNFQ19TSEFSRURfTElCUkFSWS4gIFRoaXMgc2VlbXMgdG8gYmUgY29ycmVjdCBmb3IKLQlpMzg2LXN5c3YuCi0KLVRodSBOb3YgIDUgMDQ6NDM6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHRhcmdldC5jIChzdHJ1Y3QgYmZkX3RhcmdldCk6ICBFbGltaW5hdGUgdGhlIFNERUYgYW5kIFNERUZfRk1UCi0JbWFjcm9zOyB1c2UgUEFSQU1TIHRvIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIGludm9sdmVkLgotCi0JKiBiZmQtaW4uaCwgYmZkLmMsIGxpYmJmZC5oLCByZWxvYy5jLCBzZWNsZXQuaCwgc2VjdGlvbi5jLAotCXRhcmdldHMuYzogUmVuYW1lIHN0cnVjdCBiZmRfc2VjbGV0X3N0cnVjdCB0byBzdHJ1Y3QgYmZkX3NlY2xldC4KLQotVGh1IE5vdiAgNSAwMjo1OTowOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFudXA6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcywgd2l0aCBQQVJBTVMuCi0KLQkqIGFyY2h1cmVzLmMsIHJlbG9jLmMsIHNlY3Rpb24uYywgdGVraGV4LmM6ICBVc2UgUEFSQU1TIGluCi0JZGVjbGFyaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KLQkqIGNhY2hlLmMsIGVsZi5jOiAgTW92ZSBzdGF0aWMgZnVuY3Rpb24gZGVjbHMgdG8gdG9wLCB1c2UgUEFSQU1TLgotCSogc2VjbGV0Lmg6ICBEZWNsYXJlIGV4dGVybmFsIGZ1bmN0aW9uIHdpdGggUEFSQU1TLgotCi0JKiBkb2MvY2hldy5jIChleGZ1bnN0dWZmKTogIEVsaW1pbmF0ZS4KLQkocGFyYW1zdHVmZik6ICBSZXBsYWNlIGV4ZnVuc3R1ZmYgd2l0aCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBQQVJBTVMuCi0JKiBkb2MvcHJvdG8uc3RyOiAgVXNlIHBhcmFtc3R1ZmYgcmF0aGVyIHRoYW4gZXhmdW5zdHVmZi4KLQotCSogbGliYmZkLmg6ICBVcGRhdGUsIGJhc2VkIG9uIGNoYW5nZXMgaW4gc291cmNlIGNvZGUgYW5kIGNoZXcuCi0KLVdlZCBOb3YgIDQgMjI6NDc6MjkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGxpYmllZWUuaDogIEFkZCBGSVhNRSBhYm91dCByZW1vdmluZyBsaW1pdCBvbiBudW1iZXIgb2Ygc2VjdGlvbnMuCi0JKiBiZmQtaW4uaDogIEltcHJvdmUgY29tbWVudHMgdG8gbWFrZSBpdCBjbGVhciB0aGF0IGJmZC5oIGlzCi0JdGhlIHdyb25nIHBsYWNlIHRvIGVkaXQgdGhpcyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiAgSW5zdGFsbCBhbnNpZGVjbC5oIGFuZCBvYnN0YWNrLmggaW4gdGhlCi0Jc2FtZSBwbGFjZXMgd2hlcmUgd2UgaW5zdGFsbCBiZmQuaC4KLQotV2VkIE5vdiAgNCAxMzo0MDoyMyAxOTkyICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9vdXQsIGNvZmZfc3dhcF9hdXhfaW4pOiAgY2hlY2sgZm9yCi0Jc3ltYm9sIHR5cGUgYmVmb3JlIGJsaW5kbHkgbW9kaWZ5aW5nIHRoZSBhdXhlbnQuICBTcGVjaWZpY2FsbHksCi0Jb25seSBtb2RpZnkgdGhlIGVuZG5keCBmaWVsZHMgZm9yIHR5cGVzIHRoYXQgbmVlZCBpdCwgYW5kIGRvbid0Ci0Jc2V0IHRoZSBhcnJheSBpbmZvcm1hdGlvbiBmb3Igbm9uLWFycmF5cy4KLQotV2VkIE5vdiAgNCAwOTozMDo1MCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogU2VjdGlvbiBsaXN0IHNob3VsZCBiZSBzZXQgdXAKLQljb3JyZWN0bHkgYW55d2F5czsgZG9uJ3QgaGF2ZSB0byBzZXQgdXAgIm5leHQiIHBvaW50ZXJzIG1hbnVhbGx5LgotCi1Nb24gTm92ICAyIDEyOjM2OjE0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlbHRhODgubWgsIGNvbmZpZy9ocDMwMC5taCwgY29uZmlnL2hwcGFocHV4Lm1oLAotCWNvbmZpZy9pMzg2di5taDogcmVtb3ZlZCAtRFVTRyBmcm9tIEhERUZJTkVTLgotCWhvc3RzL2RlbHRhODguaCwgaG9zdHMvaHAzMDAuaCwgaG9zdHMvaHBwYWhwdXguaCwgaG9zdHMvaTM4NnYuaDoKLQlkZWZpbmVkIFVTRV9VVElNRS4KLQlob3N0cy9pMzg2di5oOiBkb24ndCBkZWZpbmUgUE9TSVhfVVRJTUUuCi0KLUZyaSBPY3QgMzAgMTY6MTM6NTIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9zZWN0aW9ucyk6IG1ha2UgYSBwcml2YXRlIGNvcHkgb2YgdGhlCi0Jc2VjdGlvbidzIG5hbWUgYmVmb3JlIHRydW5jYXRpbmcgaXQuCi0KLVRodSBPY3QgMjkgMDg6MzA6NTAgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuYzogYWRkIHN5bWJvbF9sZWFkaW5nX2NoYXIgZW50cnkgaW4gdHJhbnNmZXIgdmVjCi0KLSxXZWQgT2N0IDI4IDE2OjExOjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpZWVlLmMgKGdldF9zeW1ib2wpOiBjYW4gbm93IGNvcGUgd2hlbiB0d28gc3ltYm9scyBvZiBhCi0JZGlmZmVyZW50IGNsYXNzLCBidXQgdGhlIHNhbWUgaW5kZXggbnVtYmVyIG9jY3VyIGNvbnNlY3V0aXZlbHkuCi0JKGdldF9zZWN0aW9uX2VudHJ5KTogbmljZXIgbmFtZSBmb3Igc2VjdGlvbnMgYmVpbmcgZm9yd2FyZAotCXJlZmVyZW5jZWQuIChpZWVlX2FyY2hpdmVfcCk6IGRvbid0IGZyZWUgdGhlIGZpbGVuYW1lIHN0cmluZywKLQlzaW5jZSBpdCB3YXMgbmV2ZXIgbWFsbG9jZWQuCi0KLVdlZCBPY3QgMjggMTM6NDI6MDkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogIFplcm8gdGltZXN0YW1wIGZpZWxkLgotCi1UdWUgT2N0IDI3IDEyOjI0OjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9vdXQpOiBzZXQgdGhlIGZjbmFyeSBpbmZvIGJlZm9yZQotCW9wdGlvbmFsbHkgc2V0dGluZyB0aGUgZGltZW4gaW5mbywgc2luY2UgdGhleSBhcmUgaW4gdGhlIHNhbWUKLQltZW1vcnkgbG9jYXRpb25zLiAgQWxzbyB6ZXJvIG91dCBleHRlcm5hbCBhdXhlbnQuCi0JKGNvZmZfd3JpdGVfc3ltYm9sKTogZG9uJ3QgemVybyBleHRlcm5hbCBhdXhlbnQ7IG5vdyBkb25lIGluCi0JY29mZl9zd2FwX2F1eF9vdXQuCi0KLUZyaSBPY3QgMjMgMTM6NTU6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBDaGVjayBmY2xvc2UgcmV0dXJuIHZhbHVlIGZvciBlcnJvcnMuCi0JbGliYmZkLmg6IGJmZF9jYWNoZV9jbG9zZSBub3cgcmV0dXJucyBhIGJvb2xlYW4uCi0JY2FjaGUuYyAoYmZkX2NhY2hlX2RlbGV0ZSk6IHJldHVybiBmY2xvc2Ugc3VjY2VzcyB2YWx1ZS4KLQkoYmZkX2NhY2hlX2Nsb3NlKTogcmV0dXJuIGJmZF9jYWNoZV9kZWxldGUgcmV0dXJuIHZhbHVlLgotCW9wbmNscy5jIChiZmRfY2xvc2UsIGJmZF9jbG9zZV9hbGxfZG9uZSk6IHJldHVybiByZXN1bHQgb2YKLQliZmRfY2FjaGVfY2xvc2UuCi0KLUZyaSBPY3QgMjMgMTA6MzI6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNlY2xldC5jIChyZWwpOiBkb24ndCBsb2FkIHNlY3Rpb25zIHdpdGhvdXQgdGhlIFNFQ19MT0FEIGJpdC4KLQotVGh1IE9jdCAxNSAxMDoxNjozNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKG02OGtfaG93dG8ydHlwZSwgU0VMRUNUX1JFTE9DKTogbmV3IGZ1bmN0aW9uIHRvCi0Jd29yayBvdXQgYSBjb2ZmIHJlbG9jYXRpb24gdHlwZSBmcm9tIGEgaG93dG8ncyBhdHRyaWJ1dGVzIHJhdGhlcgotCXRoYW4gdXNpbmcgdGhlIGlucHV0IHJfdHlwZSBmaWVsZC4gVGhpcyBmaXhlcyBQUjE2NzcgYW5kIGFsbG93cwotCWNvbnZlcnNpb24gb2YgYS5vdXQgcmVsb2NzIHRvIGNvZmYgcmVsb2NzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IGlmIHN1cHBsaWVkIGEgcmVsb2NhdGlvbgotCXJlbGF0aXZlIHRvIGFuIGFic29sdXRlIHN5bWJvbCwgdXNlIHRoZSByaWdodCBzeW1ib2wgaW5kZXguCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBkbyBhIHBhcnRpYWwgbGluayBmb3IgY29mZgotCXJlbG9jcyByaWdodC4KLQotRnJpIE9jdCAyMyAwODoxNTo1NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNoYW5nZXMgdG8gc3VwcG9ydCBpMzg2LXN5c3Ygd2l0aCBzaGFyZWQgbGlicmFyaWVzOgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBpZiBUV09fREFUQV9TRUNTIGlzIGRlZmluZWQsCi0JY2hlY2sgZm9yIC5kYXRhMjsgaWYgX0xJQiBpcyBkZWZpbmVkLCBjaGVjayBmb3IgaXQ7IG1hcAotCVNFQ19ORVZFUl9MT0FEIHRvIFNUWVBfTk9MT0FELgotCShzdHlwX3RvX3NlY19mbGFncyk6IG1hcCBTVFlQX05PTE9BRCB0byBTRUNfTkVWRVJfTE9BRC4KLQkobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogaWYgVFdPX0RBVEFfU0VDUywgYWNjZXB0IC5kYXRhMi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBmb3JjZSB2YWRkciBvZiAubGliIHRvIDA7IHNldCBzY25wdHIKLQlpZiBzZWN0aW9uIGhhcyBjb250ZW50cywgbm90IGp1c3QgaWYgaXQgaXMgbG9hZGFibGU7IGlmCi0JVFdPX0RBVEFfU0VDUywgY2hlY2sgZm9yIC5kYXRhMgotCShjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogc2V0IHZtYSBvZiAubGliIHNlY3Rpb24gdG8gbnVtYmVyIG9mCi0JLmxpYiBzZWN0aW9ucy4KLQkqIGNvZmYtaTM4Ni5jOiBkZWZpbmUgVFdPX0RBVEFfU0VDUzsgdXNlIGEgc3BlY2lhbCBDQUxDX0FEREVORDsKLQlkb24ndCBkZWZpbmUgY29mZl93cml0ZV9hcm1hcCB0byBic2Rfd3JpdGVfYXJtYXAuCi0JKiBob3N0cy9pMzg2di5oOiBkb24ndCBpbmNsdWRlIDx1dGltZS5oPiwgc2luY2UgaXQgaXMgbm90IHByb3ZpZGVkCi0JYnkgU1ZSMy4yLgotCi1UaHUgT2N0IDIyIDIyOjQwOjIwIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogc29sYXJpczIuaDogR2V0IHRoZSBkZWZpbml0aW9uIG9mIGFsbG9jYSBmcm9tIGFsbG9jYS5oIGlmIHdlCi0JYXJlbid0IHVzaW5nIGdjYy4KLQotVGh1IE9jdCAyMiAwMzowNzoyOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpOTYwLSote2FvdXQsYm91dH0pOiAgU3VwcG9ydCB0aGVzZS4KLQotV2VkIE9jdCAyMSAwMzo0NjozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2EyOWstYW91dC5tdCAoREVGQVVMVF9UQVJHRVQpOiAgU2V0IHRvIG9uZSB0aGF0IGV4aXN0cy4KLQotVGh1IE9jdCAxNSAxNTowNTozOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXBvbGxvNjguaCwgYXBvbGxvdjY4LmgsIGhwMzAwLmgsIGkzODZ2LmgsIGlyaXgzLmg6IFJlbW92ZQotCW5vLWxvbmdlci11c2VkIGRlZmluaXRpb25zIG9mIExfU0VUIGFuZCBMX0lOQ1IuCi0JKiBpMzg2bGludXguaDogIFR3ZWFrcyB0byBzbW9vdGggTGludXggYnVpbGQuCi0KLVRodSBPY3QgMTUgMDE6MzI6MjIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHNlY2xldC5oOiAgQWRkIGVudW0gdGFnIHRvIGJmZF9zZWNsZXRfZW51bV90eXBlLgotCi0JKiBiZmQtaW4uaCAoZmlsZV9wdHIpOiAgVXBkYXRlIGNvbW1lbnRzLCBtYWtlIEZJWE1FIHJlIG9mZl90LgotCi0JKiBhb3V0LWFkb2JlLmMsIGFvdXRmMS5oLCBhcmNoaXZlLmMsIGJvdXQuYywgY29mZi1yczYwMDAuYywKLQljb2ZmY29kZS5oLCBlbGYuYywgaWVlZS5jLCBsaWJhb3V0LmgsIGxpYmJmZC5jLCBvYXN5cy5jLAotCXNjby1jb3JlLmM6ICBMaW50OiAgU2Vjb25kIGFyZ3VtZW50IG9mIGJmZF9zZWVrIGlzIGFsd2F5cyBmaWxlX3B0ci4KLQlUaGlyZCBhcmd1bWVudCBpcyBTRUVLX1NFVCBvciBTRUVLX0NVUi4gIFJlc3VsdCBpcyBhbHdheXMgMCBvciAtMS4KLQotCSogYW91dC1hZG9iZS5jLCBhb3V0ZjEuaCwgYW91dHguaCwgYm91dC5jIGNvZmYtbTY4ay5jLCBjb2ZmLXo4ay5jLAotCWNvZmZjb2RlLmgsIGVsZi5jLCBsaWJhb3V0LmgsIGxpYmJmZC1pbi5oLCBzcmVjLmM6ICBMaW50LgotCi1GcmkgT2N0ICA5IDAzOjQ2OjM3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogIE5ldyBmaWxlLCBjb250YWlucyBtYXBwaW5nIG9mIGhvc3QgY29uZmlncwotCXRvIGhvc3Qgc3VwcG9ydCBmaWxlIG5hbWVzIGZvciBiZmQsIGJpbnV0aWxzLCBvcGNvZGVzLgotCSogY29uZmlndXJlLmluOiAgVXNlIGl0LgotCSogaTM4NmFvdXQuYzogIENsZWFudXAsIGR1bXAgVEFSR0VUX0lTX0xJVFRMRV9FTkRJQU5fUC4KLQkqIGkzODZic2QuYzogIENsZWFudXAsIHJlZm9ybWF0LgotCSogY29uZmlnL2kzODYtYnNkLm10OiAgQ29tbWVudCBjaGFuZ2VzLgotCSogY29uZmlnL2kzODZic2QubWg6ICBOZXcgZmlsZSBmb3IgY29yZSBmaWxlIHN1cHBvcnQuCi0JKiBob3N0cy9pMzg2YnNkLmg6ICBNZXJnZSBjaGFuZ2VzIGZyb20gUGV0ZXIgU2NoYXVlci4KLQkqIGJvdXQuYyAoQUxJR04pOiAgUmVuYW1lIHRvIEFMSUdORVIsIHNpbmNlIHN5c3RlbSBoZWFkZXIgZmlsZXMKLQlvbiBCU0QgNC40IGRlZmluZSBBTElHTiAoc2lnaCEpLgotCi1UaHUgT2N0ICA4IDIyOjE4OjEwIDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IHR3ZWVkbGVkdW1iZXIuY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChhb3V0X2JhY2tlbmRfZGF0YSk6IGFkZGVkIGV4ZWNfaGVhZGVyX25vdF9jb3VudGVkCi0JZmllbGQuIEZvciBaTUFHSUMgZmlsZXMgb25seSwgd2hlbiB0ZXh0X2luY2x1ZGVzX2hlYWRlciBpcyBzZXQsIGJ5Ci0JZGVmYXVsdCB0aGUgbGVuZ3RoIG9mIHRoZSBleGVjIGhlYWRlciBpcyBjb3VudGVkIGluIHRoZSB0ZXh0Ci0Jc2VjdGlvbiBzaXplLiBGb3IgZ28zMiwgZXhlYyBoZWFkZXIgaXMgbWFwcGVkIGluIGJ1dCBkb2VzICpub3QqCi0JY29udHJpYnV0ZSB0byB0aGUgc2l6ZSBvZiBzZWN0aW9uLgotCSogYW91dHguaCAoYW91dF9hZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiBpZiBleGVjX2hlYWRlcl9ub3RfY291bnRlZAotCWlzIG5vdCBzZXQsIGJ1dCB6dGloIGlzLCBhZGQgdGhlIHNpemUgb2YgdGhlIGV4ZWMgaGVhZGVyIHRvIHRoZQotCXJlY29yZGVkIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbi4KLQkqIGFvdXRmMS5oIChzdW5vczRfYW91dF9iYWNrZW5kKTogY2xlYXIgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQuCi0JKiBpMzg2YW91dC5jIChpMzg2YW91dF9iYWNrZW5kX2RhdGEpOiBzZXQgZXhlY19oZWFkZXJfbm90X2NvdW50ZWQuCi0JQWxzbyBzZXQgdGV4dF9pbmNsdWRlc19oZWFkZXIuCi0JKiBhb3V0LXRhcmdldC5oICgqX2JhY2tlbmRfZGF0YSk6IGNsZWFyZSBleGVjX2hlYWRlcl9ub3RfY291bnRlZAotCWJ5IGRlZmF1bHQgaW4gTVkoYmFja2VuZF9kYXRhKS4KLQotVGh1IE9jdCAgOCAxODoxMjo0OSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoY2FsbGJhY2spOiBEb24ndCBkZWZpbmUgdGhpcyBmdW5jdGlvbiBpZiBpdCB3b24ndCBiZQotCXVzZWQuCi0KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6IFJlc3RvcmUgb2xkIGFvdXRfZGF0YSB2YWx1ZSBpZiB0aGlzCi0JdHlwZSBkb2Vzbid0IG1hdGNoLiAgRG9uJ3QgbG9zZSBpZiBmaWxlIHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCi0JY3JlYXRlZC4KLQkoc2V0X2FyY2hfbWFjaCk6IFNldCByZWxvY19lbnRyeV9zaXplLgotCShzbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgYmZkX2hfZ2V0X3sxNiw4fSBmb3IgcmVhZWRpbmcgc3ltYm9sIGRhdGEuCi0KLQkqIGhvc3RzL2kzODZic2QuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSBpWzM0XTg2LSotYnNkIGhvc3QuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKGNhbGxiYWNrLCB3cml0ZV9vYmplY3RfY29udGVudHMpOiBEZWxldGUgdW51c2VkCi0JdmFyaWFibGVzLgotCi0JKiBhb3V0eC5oIChyZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogVXNlIGl0IGFzIGRlZmF1bHQuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogRGVsZXRlZC4KLQkoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBEb24ndCBkZWZpbmUgaXQuCi0KLQkqIGFvdXR4LmggKGFkanVzdF9zaXplc19hbmRfdm1hcyk6IERvbid0IGJvdGhlciB3aXRoIHBhZGRpbmcgZm9yCi0JT01BR0lDIGZpbGVzLgotCShzbHVycF9zeW1ib2xfdGFibGUpOiBVc2UgaGVhZGVyIGJ5dGUgb3JkZXIsIG5vdCB0YXJnZXQgYnl0ZQotCW9yZGVyLCBmb3IgcmVhZGluZyBzeW1ib2wgZGF0YS4KLQotVGh1IE9jdCAgOCAxNzozMzozOSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgVW5kbyBzb21lIGJyYWluIGRhbWFnZSBpbiB0aGUgaG9zdCBzZWN0aW9uLgotCSogY29uZmlndXJlLmluOiAgUmVmb3JtYXQgdGhlIHRhcmdldCBzZWN0aW9uLCB0ZXN0IG1hbnkgY29uZmlncy4KLQkqIE1ha2VmaWxlLmluIChtYWtlKTogIFJlbW92ZSBvYnNvbGV0ZSBgbWFrZSBtYWtlJy4KLQkqIGFvdXR4LmggKHNvbWVfYW91dF9vYmplY3RfcCk6ICBNYWtlIGRlZmluZXMgbGluZSB1cC4KLQotVGh1IE9jdCAgOCAwODo1Mjo0OCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCU5vdyBhIGJmZCBrbm93cyB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSBub3JtYWxseSBwcmVwZW5kZWQKLQl0byBzeW1ib2xzIGluIGl0cyBmaWxlIGZvcm1hdC4KLQotCSogYW91dC1hZG9iZS5jLCBhb3V0LXRhcmdldC5oLCBib3V0LmMsIGNvZmYtYTI5ay5jLCBjb2ZmLWg4MzAwLmMsCi0JY29mZi16OGsuYzogdGFyZ2V0cyBzZXQgc28gdGhleSBoYXZlIGxlYWRpbmcgdW5kZXJzY29yZQotCSogY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYywgY29mZi1taXBzLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtcnM2MDAwLmMsIGNvZmYtd2UzMmsuYywgZWxmLmMsIGllZWUuYywgc3JlYy5jOiB0YXJnZXRzIHNldAotCXdpdGhvdXQgbGVhZGluZyB1bmRlcnNjb3JlIGZsYWcKLQkqIHRhcmdldHMuYzogYWRkIHN5bWJvbCBsZWFkaW5nIGNoYXIgdG8geHZlYyBkZXNjcmlwdGlvbgotCSogYmZkLWluLmggKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcik6IG5ldyBtYWNyby4KLQotTW9uIE9jdCAgNSAxNDozMjo1NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jOiAgTWFrZSBlcnJubyBnbG9iYWwuCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6ICBJZiByZWFkIGZhaWxzIChhbmQKLQllcnJubyE9MCkgc2V0IGJmZF9lcnJvciB0byBtYWxmb3JtZWRfYXJjaGl2ZSAoc2luY2UgdGhpcyBwcm9iYWJseQotCWluZGljYXRlcyBhIHRydW5jYXRlZCBhcmNoaXZlKSwgcmF0aGVyIHRoYW4gc3lzdGVtX2NhbGxfZXJyb3IuCi0KLU1vbiBPY3QgIDUgMDM6MzM6MzkgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgdHdlZWRsZWR1bWJlci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgcnVsZXMgZm9yIGkzODZic2QuYwotCSogaTM4NmJzZC5jOiBuZXcgZmlsZSwgc3VwcG9ydGluZyAzODZic2QuCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBpMzg2LSotYnNkIHRhcmdldC4KLQkqIGNvbmZpZy9pMzg2LWJzZC5tdDogbmV3IGZpbGUgLSAzODZic2QgdGFyZ2V0IGNvbmZpZ3VyYXRpb24uCi0KLVRodSBPY3QgIDEgMTc6NTE6MDcgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlLWFycmFuZ2UgaG9zdCBzZWN0aW9uIHRvIHVzZSAqLSotKiBub3RhdGlvbiwKLQljbGVhbiB1cCBzb21lIG9mIHRoZSB0YXJnZXQgc2VjdGlvbiBhcyB3ZWxsCi0KLQkqIHNlY2xldC5jOiBjYXN0IHJlc3VsdCBvZiBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHRvCi0JYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLQotVHVlIFNlcCAyOSAxMzoyNDowOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9zZWN0aW9uX3N5bWJvbCk6IENyZWF0ZSBzZWN0aW9uIGlmIGl0IGRvZXNuJ3QKLQlhbHJlYWR5IGV4aXN0LgotCi0JKiBib3V0LmM6IFJlbW92ZWQgc29tZSB1bnVzZWQgdmFyaWFibGVzLgotCi1UdWUgU2VwIDI5IDA4OjMwOjIxIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogUG9ydGFiaWxpdHkgZml4ZXMgZnJvbSBwMzoKLQljb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IHJlbW92ZWQgc2FuaXR5IGNoZWNrIHVudGlsIGl0Ci0Jd29ya3Mgb24gYWxsIHRhcmdldHMgKHBlciBhZHZpY2UgZnJvbSBzYWMpLgotCWNvbmZpZy9ocDkwMDAubWg6IG5ldyBmaWxlIHRvIGRlZmluZSBVU0cuCi0JaHBwYS5jOiAjdW5kZWYgaHBwYSBiZWZvcmUgdGhlIEpVTVBfVEFCTEUuCi0JaG9zdHMvaHBwYWhwdXguaDogI2RlZmluZSBOQVRJVkVfSFBQQUhQVVhfQ09NUElMRVIgaWYgbm90Ci0JX19TVERDX18uCi0JdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X2xpc3QpOiBpZiBOQVRJVkVfSFBQQUhQVVhfQ09NUElMRVIsIG1ha2UKLQlsb2NhbCB2YXJpYWJsZSB0YXJnZXQgdm9sYXRpbGUgdG8gYXZvaWQgbXlzdGVyaW91cyBidWcgaW4KLQlIUDkwMDAvNzAwIGNjLgotCi1TYXQgU2VwIDI2IDAzOjU4OjQ5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaHBwYWJzZC5taCwgY29uZmlnLmhwcGFocHV4Lm1oOiAgUmVtb3ZlIHZhcmlvdXMgYm9nb3NpdHkuCi0JKiBob3N0cy9ocHBhaHB1eC5oOiAgUmVtb3ZlIGJjb3B5IGFuZCBpbmRleCBjaXJjdW12ZW50aW9ucy4KLQotRnJpIFNlcCAyNSAyMjozNjo1MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29mZi16OGsuYyAoZnVuY19kYSwgZnVuY19qcik6ICBMaW50LgotCSogY29mZmNvZGUuaDogIFVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCi0JKiBlbGYuYzogIFVzZSBtZW1jcHkgcmF0aGVyIHRoYW4gYmNvcHkuCi0JKiB0ZWtoZXguYzogIFVzZSBtZW1zZXQgcmF0aGVyIHRoYW4gYnplcm8uCi0KLUZyaSBTZXAgMjUgMTk6MTQ6NDggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQlBZGQgQWRvYmUgYS5vdXQgc3VwcG9ydC4KLQotCSogYW91dC1hZG9iZS5jOiAgTmV3IGZpbGUuICBTbyBmYXIsIG9ubHkgcmVhZHMgYS5vdXQuYWRvYmUuICBGSVhNRS4KLQkqIGNvbmZpZy9hZG9iZS5tdDogIEFkZC4KLQkqIGNvbmZpZ3VyZS5pbiAoKi1hZG9iZS0qIHRhcmdldCk6ICBBZGQuCi0JKiB0YXJnZXRzLmMgKGFfb3V0X2Fkb2JlX3ZlYyk6ICBBZGQuCi0JKiBNYWtlZmlsZS5pbjogIGFkZCBhb3V0LWFkb2JlLmMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFB1dCB0d28gZGFzaGVzIGluIGFsbCBlbnRyaWVzIHRvIGJlIG1hdGNoZWQuCi0JQWRkIGNvbW1lbnRzIHRvIHJlbWluZCBwZW9wbGUgdG8gZG8gdGhpcy4KLQlSZW9yZGVyIGFsbCBlbnRyaWVzIHRoYXQgbWF0Y2ggbWFudWZhY3R1cmVyIG5hbWVzLCB0byBvY2N1cgotCWxhc3QsIHNvIHRoZXkgd2lsbCBvbmx5IGJlIG1hdGNoZWQgaWYgbm8gbW9yZSBzcGVjaWZpYyBtYXRjaAotCW9jY3Vycy4gIFJlbW92ZSBtYW51ZmFjdHVyZXJzIGBhb3V0JywgYGJvdXQnLCBgY29mZicsIGFuZCBgZWxmJy4KLQotRnJpIFNlcCAyNSAxNTowMzoyMiAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBSZXR1cm4gYmZkX2Fic19zZWN0aW9uLCBub3QgMCwKLQlzaW5jZSB3ZSBzaG91bGQgbmV2ZXIgaGF2ZSBhIE5VTEwgc2VjdGlvbi4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIHN0X3NobmR4IGRvZXNuJ3QgbWF0Y2ggYW55IG9mIG91cgotCXRlc3RzLCBzZXQgdGhlIHNlY3Rpb24gdG8gYmZkX2Fic19zZWN0aW9uLgotCi1GcmkgU2VwIDI1IDExOjExOjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXo4ay5jOiBnZXR0aW5nIGNsb3NlcgotCSogY29mZmNvZGUuaCAoY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBhbGxvdwotCUVYVFJBX0NBU0VTIGhvb2tzIGZvciBkaWZmZXJlbnQgYXJjaGVzIHRvIHByb3ZpZGUgZGlmZmVyZW50IHJlbG9jCi0JdHlwZXMuCi0JKiBzZWNsZXQuaDogI2lmbmRlZiBhcm91bmQgaXQgdG8gYWxsb3cgbXVsdGlwbGUgaW5jbHVzaW9uCi0JKiBzcmVjLmM6IG1pbm9yIGRvYyBmaXgKLQotTW9uIFNlcCAyMSAxNDozMzo1OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2hwOTAwMC5oLCBob3N0cy9pcml4My5oOiBjaGFuZ2VzIGZyb20gV1JTLgotCi1TdW4gU2VwIDIwIDA4OjQ4OjI1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBVc2UgaTM4Ni1lbGYgZm9yIGFsbCBpMzg2L2k0ODYgc3lzdjQgaG9zdHMsIG5vdAotCWp1c3QgbmNyLgotCi1UaHUgU2VwIDE3IDA2OjQwOjQ2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSk6IENsZWFyIGhvd3RvIGZpZWxkIGJlZm9yZQotCWZpbGxpbmcgaW4gcmVsb2MsIGluIGNhc2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNvZGUgZG9lc24ndCBzZXQKLQlpdC4KLQotRnJpIFNlcCAxMSAxNTozNzowNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IHNldCB0aGUgbGFzdCByZW51bWJlcmVkCi0Jc3ltYm9sIHBvaW50ZXIgdG8gTlVMTCwgYXMgZXhwZWN0ZWQgYnkgY29mZl93cml0ZV9saW5lbnVtYmVycy4KLQkoY29mZl93cml0ZV9yZWxvY3MpOiBhcHBhcmVudGx5IGEgbm9uLXplcm8gYWRkZW5kIGlzIE9LIGZvciByZWxvYwotCXR5cGUgUl9JSENPTlNUIHVzZWQgb24gdGhlIDI5ay4KLQotVGh1IFNlcCAxMCAxMzoyODoyNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIERldGVybWluZSB3aGV0aGVyIHRvIGZkb3BlbiBmb3IKLQl1cGRhdGUsIGJhc2VkIG9uIGhvdyB0aGUgdW5kZXJseWluZyBmaWxlIHdhcyBvcGVuZWQuICBPYnNvbGV0ZXMKLQlGQVNDSVNUX0ZET1BFTi4KLQkqIGhvc3RzL3JzNjAwMC5oLCBob3N0cy90YWhvZS5oLCBob3N0cy92YXhic2QuaDogIFJlbW92ZQotCWFsbCBGQVNDSVNUX0ZET1BFTiBjb25maWcgZGVmaW5lcy4KLQotVHVlIFNlcCAgOCAyMTozNzo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jOiBNb3ZlZCB0byBvcGNvZGVzIGxpYnJhcnksIG5vdyB0aGF0IHdlIGhhdmUgb25lLgotCSogTWFrZWZpbGU6IERvbid0IGNvbXBpbGUgaXQuCi0KLVR1ZSBTZXAgIDggMTA6MTA6MzQgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oOiBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgZGlkIG5vdCByZXR1cm4gYW55dGhpbmcuCi0KLVRodSBTZXAgIDMgMTk6Mjk6MDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKGJmZF9zZXRfc2VjdGlvbl9mbGFncyk6ICBSZW1vdmUgYSBzYW5pdHkgY2hlY2suCi0JSXQgaXMgdW5mb3J0dW5hdGVseSBicm9rZW4sIGFuZCBwcmV2ZW50cyBzdHJpcCBmcm9tIHdvcmtpbmcuCi0KLVRodSBTZXAgIDMgMTY6MTQ6NDAgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1vcGMuYyAoY29uZHIpOiBSZW1vdmUgZXh0cmFuZW91cywgYnV0IGhhcm1sZXNzLCBiYWNrbGFzaAotCWNyZWF0ZWQgYnkgbGFzdCBjaGFuZ2UuCi0KLVRodSBTZXAgIDMgMTM6NTI6MzggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b19zdHJ1Y3QpOiAgTWFrZSBzaXplIGZpZWxkIGJlIHVuc2lnbmVkLgotCSogYmZkLWluLmg6ICBCdW1wIHRvIHZlcnNpb24gMi4wLgotCi1UaHUgU2VwICAzIDA5OjA1OjM3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYywgY3B1LXo4ay5jOiAgVXNlIGVudW1zIHdoZW4gaW5pdGlhbGl6aW5nIHN0cnVjdHMgdG8ga2VlcAotCWJyYWluZGFtYWdlZCBIUC9BcG9sbG8gY29tcGlsZXIgaGFwcHkuCi0KLVdlZCBTZXAgIDIgMDI6NTM6MjkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGZvcm1hdC5jOiAgRml4IGRlc2NyaXB0aW9uIG9mIHNlYXJjaCBmb3IgbWF0Y2hpbmcgdGFyZ2V0LgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIFNldCBTRUNfQ09ERSBhbmQgU0VDX0RBVEEuCi0JKiB0YXJnZXRzLmM6ICBVcGRhdGUgZGVzY3JpcHRpb24gb2Ygc2VhcmNoIGZvciBtYXRjaGluZyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoZG9fY2xlYW4sIGNsZWFuKTogIEZpeCBpbmZhbnQgbW9ydGFsaXR5IHR5cG8uCi0JKGRvY2Rpcik6ICBTZXQgdG8gLi9kb2MsIG5vdCAke3NyY2Rpcn0vZG9jLCB3aGljaCBoYXMgbm8gbWFrZWZpbGUuCi0JKHo4ayBhbmQgd2UzMmsgZmlsZXMpOiAgYCoubzogKi5jJzogYXZvaWQgU3VuIE1ha2UgYnVnLgotCi1XZWQgU2VwICAyIDAwOjI2OjMyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBtb3N0bHljbGVhbi9jbGVhbi9kaXN0Y2xlYW4gcnVsZXMuCi0KLVR1ZSBTZXAgIDEgMTM6Mzg6NDAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAodGFyZ2V0X3ZlY3Rvcik6ICBUYWtlIG91dCBvYXN5cyAodW5sZXNzIHRoYXQgaXMKLQl0aGUgZGVmYXVsdCk6ICBCZWNhdXNlIHRoZXJlIGlzIG5vIG1hZ2ljIG51bWJlciBpbiBhcmNoaXZlcywKLQl0aGVyZSBjYW4gYmUgYW5ub3lpbmcgdGFyZ2V0IG1pcy1tYXRjaGVzLgotCi1Nb24gQXVnIDMxIDEwOjExOjM3IDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6IFJpZ29yb3VzbHkgdXBkYXRlZCB0byBtYXRjaCBhcmNoaXRlY3R1cmUgbWFudWFsLgotCi1Nb24gQXVnIDMxIDA4OjA3OjU4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0PG4+c3dhcF9leHRfcmVsb2Nfb3V0KSwgYm91dC5jCi0JKGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzKTogZml4IGJ1ZyAxNTA2IHdoZXJlIGFicyBzeW1ib2xzIGF0dGFjaGVkCi0JdG8gdGhlIGJ1aWx0LWluIGFic19zZWN0aW9uIHdlcmUgbm90IHdyaXR0ZW4gb3V0IGNvcnJlY3RseS4KLQotRnJpIEF1ZyAyOCAxNjoyOToxNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2JzZF9hcm1hcCk6IGlmIHRoZSBzeW1kZWZfY291bnQgaXMgdG9vCi0JbGFyZ2UsIGFzc3VtZSB3ZSdyZSB1c2luZyBhIHN3YXBwZWQgYnl0ZSBvcmRlciBhbmQgZmFpbCB3aXRoCi0Jd3JvbmdfZm9ybWF0IHJhdGhlciB0aGFuIGR1bXBpbmcgY29yZS4KLQotRnJpIEF1ZyAyOCAxNTozODowMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogUmVuYW1lZCBvcGMtc3BhcmMuYyB0byBzcGFyYy1vcGMuYyBmb3Igc3lzdGVtcyB3aXRoIHNob3J0Ci0JZmlsZW5hbWUgY29uc3RyYWludHMuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCB0byByZWZsZWN0IGNoYW5nZS4KLQotVGh1IEF1ZyAyNyAxMzowNToyOCAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JQWRkIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHRoZSB3ZTMyazoKLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvZmZvY29kZS5oLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYzoKLQlNaW5vciBlZGl0cy4KLQkqIGNvZmYtd2UzMmsuYywgY3B1LXdlMzJrLmMsIGNvbmZpZy93ZTMyay5tdCwgaG9zdHMvd2UzMmsuaDogTmV3IGZpbGVzLgotCi1XZWQgQXVnIDI2IDE0OjIwOjE2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBib3V0LmM6IGFkZGVkIHN1cHBvcnQgZm9yIHJlbGF4YWJsZSBhbGlnbm1lbnQgcmVsb2NzLgotCi0JKiBzZWNsZXQuYyAocmVsLCBzZWNsZXRfZHVtcF9zZWNsZXQsIHNlY2xldF9kdW1wKTogZ2V0IHRoZSBhcHAgdG8KLQlwYXNzIGRvd24gcG9pbnRlciB0byBwbGF5IGFyZWEgcmF0aGVyIHRoYW4gdXNlIGFsbG9jYQotCi0JKiBjcHUtejhrLmMgKGNvbXBhdGlibGUpOiBtYWRlIHN0YXRpYyB0byByZWR1Y2UgbmFtZSBzcGFjZQotCXBvbHV0aW9uLgotCi1UdWUgQXVnIDI1IDA4OjM5OjEwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgICAgIEFkZCBiYXNpYyBzdXBwb3J0IGZvciB0aGUgejhrOgotCi0JKiBNYWtlZmlsZS5pbiwgYXJjaHVyZXMuYywgY29mZmNvZGUuaCwgY29uZmlndXJlLmluLCByZWxvYy5jLAotCXNlY3Rpb24uYywgdGFyZ2V0cy5jLAotCi0JKiBzeW1zLmM6IG1vdmUgbWlzLWluc2VydGVkIHBhdGNoLgotCi1GcmkgQXVnIDE0IDE1OjM5OjI5IFBEVCAxOTkyICBIb3dhcmQgQ2h1ICAoaHljQGhhbmF1bWEuanBsLm5hc2EuZ292KQotCi0JRG9jdW1lbnRhdGlvbiBmaXhlczoKLQkqIGN0b3JzLmMsIGZvcm1hdC5jLCBzZWN0aW9uLmMsIHJlbG9jLmM6IGFwcGVuZCAiIC0iIHRvIGl0ZW0gdGFncy4KLQkqIHJlbG9jLmMsIHNlY3Rpb24uYywgc3ltcy5jLCB0YXJnZXRzLmM6IGFkZCBET0NERCBiZWZvcmUgQG5vZGUKLQkJY29tbWVudHMuCi0JKiByZWxvYy5jOiBicmVhayBvdXQgYWRkZW5kIGl0ZW0gZnJvbSBzdXJyb3VuZGluZyB0ZXh0LgotCi0JKiBkb2Muc3RyIChET0NERCk6IERlZmluZWQuIEFkZHMgdGV4dCB0byBvdXRwdXQuCi0JKGJvZHl0ZXh0KTogUHV0IGJ1bGxldGl6ZSBiZWZvcmUga2lsbF9ib2d1c19saW5lcy4KLQkqIGNoZXcuYyAoYnVsbGV0aXplKTogRW5kIGl0ZW1pemF0aW9uIGFmdGVyIGEgYmxhbmsgbGluZSwgdG8KLQlwcmV2ZW50IGZvbGxvd2luZyB0ZXh0IGZyb20gYmVpbmcgc3dhbGxvd2VkIHVwIGluIGFuIGl0ZW0uCi0KLU1vbiBBdWcgMjQgMjA6NTA6MjIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIHNwYXJjbGl0ZSBhcyBhIHRhcmdldC4KLQotTW9uIEF1ZyAyNCAxMjowNjozMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaWVlZS5jIChpZWVlX2dldF9zeW10YWIpOiBhbHdheXMgbnVsbCB0ZXJtaW5hdGUgdGhlIHN5bWJvbCBsaXN0LAotCWxpbnQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IGlmIHN5bWJvbHMgZG9uJ3QgY29tZQotCWZyb20gYSBjb2ZmIGZpbGUgKGNzeW0gaXMgbnVsbCksIGRvbnQgZGVyZWYgdGhlbQotCi0JKiBpZWVlLmMgKHBhcnNlX2V4cHJlc3Npb24pOiBnZXQgdGhlIGFuc3dlciByaWdodCB3aGVuIGFkZGluZyBhbgotCWFicysoc2VjK29mZiksIChpZWVlX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IGNhbGwgaWVlZV9vYmplY3RfcAotCW9uIGVsdHMgc28gdGhhdCBmaWxlbmFtZSBpcyBmaWxsZWQgaW4uCi0KLVRodSBBdWcgMjAgMTk6MDU6NDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoaG93dG9fYWxpZ25fdGFibGUpOiBOZXcgc2V0IG9mIHJlbG9jcywgd2l0aCBlbm91Z2gKLQlkYXRhIGZvciAib2JqZHVtcCAtciIgdG8gd29yay4KLQkoYl9vdXRfcmVsb2NfdHlwZV9sb29rdXApOiBSZWNvZ25pemUgYWxpZ25tZW50IHJlbG9jcy4KLQotVHVlIEF1ZyAxOCAxMjo1Nzo0NSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLSAJKiBNYWtlZmlsZS5pbjogYWRkZWQgRkxBR1NfVE9fUEFTUywgYW5kIHVzZWQgaXQgZm9yIGFsbCByZWN1cnNpdmUKLQlpbnZvY2F0aW9ucyBvZiBtYWtlLiAgQWxzbywgYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24KLQlkaXJlY3Rvcmllcy4KLQotCSogY29uZmlnL2Fwb2xsb3Y2OC5taDogcmVtb3ZlZCAtZyBmcm9tIENDIGRlZmluaXRpb24uCi0KLU1vbiBBdWcgMTcgMTM6NDA6MDggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWNzdGF0aW9uLm1oIChIREVGSU5FUyk6IFNwZWNpZnkgIi1HIDQiIHRvIGF2b2lkCi0Jb3ZlcmZsb3dpbmcgZ3Atb2Zmc2V0IHJhbmdlLgotCi1Nb24gQXVnIDE3IDExOjQ0OjI4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBkb24ndCB3cml0ZSBvdXQgc2VjdGlvbnMKLQl3aXRob3V0IHRoZSBMT0FEIGFuZCBBTExPQyBhdHRyaWJ1dGVzCi0KLU1vbiBBdWcgMTcgMTE6NTU6MDcgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jLCBjcHUtbTY4ay5jLCBjcHUtc3BhcmMuYzogVW5kbyAxNiBKdW5lIGNoYW5nZXMuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IE5ldyBjYWxsYmFjayAic2V0X3NpemVzIi4KLQkqIGFvdXQtdGFyZ2V0LmggKGNhbGxiYWNrKTogRG9uJ3Qgc2V0IHBhZ2Uvc2VnIHNpemVzLgotCShta29iamVjdCk6IERpdHRvLgotCShzZXRfc2l6ZXMpOiBOZXcgcm91dGluZS4KLQkoYmFja2VuZF9kYXRhKTogUG9pbnQgdG8gaXQuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3NldF9zaXplcyk6IEhlZWQgYXJjaGl0ZWN0dXJlIHdoZW4gc2V0dGluZyBzaXplcy4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IFBvaW50IHRvIGl0LgotCSogYW91dHguaCAoc2V0X2FyY2hfbWFjaCk6IENhbGwgc2V0X3NpemVzIGNhbGxiYWNrLgotCi1GcmkgQXVnIDE0IDE5OjIyOjE4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oOiAgTWFrZSBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgYmUKLQl0aGUgZGVmYXVsdC4gIEdpdmVuIHRoYXQgd2UgKndyaXRlKiB0aGUgc3Vja2VycyAoZm9yIGxvbmcKLQlhcmNoaXZlIG1lbWJlciBuYW1lcyksIHdlIHJlYWxseSBvdWdodCB0byBiZSBhYmxlIHRvIHJlYWQgdGhlbSEKLQkqIHRyYWQtY29yZS5jOiAgRG9uJ3QgaW5jbHVkZSA8bWFjaGluZS9yZWcuaD4uICBJdCBkb2Vzbid0Ci0Jc2VlbSB0byBiZSBuZWVkZWQsIGFuZCBtYW55IG1hY2hpbmVzIGRvbid0IGhhdmUgaXQuCi0KLVRodSBBdWcgMTMgMDk6NTM6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jICh2ZWN0b3IpOiByZWFkIGFuZCB3cml0ZSBhcmNoaXZlcyBpbiBjb2ZmIGZvcm1hdC4KLQotVHVlIEF1ZyAxMSAxMjoxOTo0MiAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogb3BjLXNwYXJjLmM6IE5ldyBmaWxlLgotCi1TYXQgQXVnICA4IDIzOjE1OjM1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBib3V0LmMgKGJmZF9yZWxvY19zdGF0dXNfdHlwZSwgY2FsbGpfY2FsbGJhY2spOiAgQ2FzdCB2b2lkKgotCXBvaW50ZXJzIHRvIGJmZF9ieXRlKiBiZWZvcmUgcGVyZm9ybWluZyBhcml0aG1ldGljIG9uIHRoZW0uICBTdWNoCi0JdXNlIHdpdGggYmFyZSB2b2lkKiBwb2ludGVycyBpcyBhIGdjYyBleHRlbnNpb24uCi0JKiBjYWNoZS5jIChiZmRfY2FjaGVfZGVsZXRlKTogIEZvcndhcmQgZGVjbCB3aXRoIHByb3RvdHlwZSBmb3JtLgotCSogYXJjaGl2ZSAobm9ybWFsaXplKTogIEFkZCB0byBDT05TVCB0byBtYXRjaCBhY3R1YWwgdXNhZ2VzIHdpdGgKLQlDT05TVC4KLQotTW9uIEF1ZyAgMyAwMDozNToyOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIGk0ODYgaG9zdCBjcHUsIGFuZCB1c2UgaTM4Ni1lbGYKLQlmb3IgaTQ4Ni1uY3Itc3lzdjQuCi0KLVNhdCBBdWcgIDEgMTM6NDk6NTkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zdHJhdHVzLm10IChDQyk6ICBSZW1vdmUgZGVmaW5pdGlvbi4KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgVGVzdCBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybnMgTlVMTCBhbmQgZG9uJ3QgZGVyZWZlcmVuY2UgaXQuCi0KLU1vbiBKdWwgMjAgMDI6NDY6MDkgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBhZGQgaHBwYV9kYXRhIHRvIGJmZCB0ZGF0YSAoaW5kaXJlY3RseSB2aWEgc2VmKS4KLQotCSogY29uZmlnL2hwcGFocHV4Lm1oOiBocHV4IGlzIC1EVVNHIChwYXRjaCBieSBzZWYpCi0KLVNhdCBKdWwgMTggMTU6NTA6MTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGVycm9yIG1lc3NhZ2VzIHRvIHN0ZGVyciwgbm90IHN0ZG91dAotCi1GcmkgSnVsIDE3IDE4OjMyOjQ2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMsIGNhY2hlLmMsIGNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsCi0JICBjb2ZmLW02OGsuYywgY29mZi1tODhrLmMsIGRlbW82NC5jLCBsaWJhb3V0LmgsIGxpYmJmZC5jLAotCSAgb2FzeXMuYywgb3BuY2xzLmMsIHN1bm9zLmMsIHRhcmdldHMuYzogcmVtb3ZlZCByY3NpZCdzLgotCi1GcmkgSnVsIDE3IDE3OjA2OjU2IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaHBwYSogaW5zdGVhZCBvZiBocHBhCi0KLVRodSBKdWwgMTYgMTY6Mzk6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtbTY4ay5jOiBhZGRlZCBSX1JFTExPTkdfTkVHIHJlbG9jIHR5cGUsIGFuZCBjaGFuZ2VkCi0JUlRZUEUySE9XVE8gdG8gY29wZSB3aXRoIHNhbWUuCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogYWRkZWQgc3VwcG9ydCBmb3Igc2l6ZSBvZiAtMgotCShzdWJ0cmFjdCBhIHdvcmQgcmVsb2MgdHlwZSkuIFVwZGF0ZWQgZG9jLgotCi1UaHUgSnVsIDE2IDE2OjI4OjA5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1lcmdlZCBjaGFuZ2VzIGZyb20gcHJvZ3Jlc3NpdmUsIHJlbW92ZWQgcmNzaWQuCi0KLQkqIGFyY2h1cmVzLmMsIGFyY2hpdmUuYywgTWFrZWZpbGUuZG9zOiByZW1vdmVkIHJjc2lkLgotCi1UaHUgSnVsIDE2IDA4OjA4OjI1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCA6IGFkZCBCRkRfSVNfUkVMQVhBQkxFIGZsYWcKLQkqIGJvdXQuYyAoYm91dF9zd2FwX2V4ZWNfaGVhZGVyX1tpbl9vdXRdKTogbmV3IGZpZWxkIGluIGV4ZWMKLQloZWFkZXIgZV9yZWxheGFibGUsIG1ham9yIGhhY2tlcnkgaW4gY2FsbGJhY2tzCi0JKiBsaWJhb3V0LmggOiBhZGQgc3BhY2UgZm9yIGFfcmVsYXhhYmxlLgotCSogc2VjbGV0LmMgKHJlbCk6IGRvbid0IHJlbGF4IGVtcHR5IHNlY3Rpb25zCi0KLQotV2VkIEp1bCAxNSAwNzo1Nzo0NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChTVERfU0VDVElPTik6IGFkZCBzb21lIGNhc3RzIHRvIHRoZSBpbml0aWFsaXplcnMgZm9yCi0JZHVtYiBjb21waWxlcnMKLQotVHVlIEp1bCAxNCAxNDowNjoyOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByczYwMDAtY29yZS5jIChyczYwMDBjb2ZmX2NvcmVfcCk6ICBHcmVhdGx5IHNpbXBsaWZ5IGV4cHJlc3Npb24sCi0JYW5kIGFkZCBhcHByb3ByaWF0ZSBjYXN0cyB0byBrZWVwIChwaWNheXVuZSkgYWl4LWNjIGhhcHB5LgotCi1Nb24gSnVsIDEzIDA1OjA2OjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBOb3cgMm5kIGFyZyBpcyB3aGVyZSB0byB3cml0ZQotCXN5bWJvbCBwb2ludGVycy4gIFB1bnQgZXhwZW5zaXZlICYgdXNlbGVzcyBiZmRfcmVhbGxvYy4gIFVzZQotCW1hbGxvYyBmb3IgcmF3IHN5bWJvbHMsIGFuZCBmcmVlIGl0IGJlZm9yZSByZXR1cm5pbmcuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBEbyBub3Qgc2x1cnAgc3ltYm9sIHRhYmxlIHVudGlsIHBvbGl0ZWx5Ci0JYXNrZWQuIAlEbyBub3QgZXZlbiBzbHVycCBzdHJpbmcgdGFibGVzLgotCShlbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6ICBDb3VudCAnZW0gd2l0aG91dCByZWFkaW5nIHRoZW0uCi0JKGVsZl9nZXRfc3ltdGFiKTogIFRoaXMgaXMgaG93IHRvIHBvbGl0ZWx5IGFzay4gIFNjaGx1cnAhCi0JVGhpcyBzaG91bGQgcHJvYmFibHkganVzdCAqYmVjb21lKiBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlLCBGSVhNRS4KLQotV2VkIEp1bCAgOCAxNjoyNDozMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiB3cml0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZQotCWFyY2hpdmUgaGVhZGVyIHRvIGJlIGp1c3QgYSBsaXR0bGUgYml0IGxhdGVyIHRoYW4gdGhlIHRpbWVzdGFtcCBvZgotCXRoZSBmaWxlLCBvdGhlcndpc2UgdGhlIGxpbmtlciB3aWxsIGNvbXBsYWluIHRoYXQgdGhlIGluZGV4IGlzCi0Jb3V0IG9mIGRhdGUuCi0KLVR1ZSBKdWwgIDcgMDA6MjM6MjMgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG02OGstZXJpY3Nzb24tKi4KLQotU2F0IEp1bCAgNCAwMzoyOTo0MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltcy5oOiAgRGVmaW5lIEJTRl9GSUxFLCB1cGRhdGUgQlNGX1NFQ1RJT05fU1lNIGRlc2MuCi0JKiBlbGYuYzogIFJlbW92ZSB1bmNvbmRpdGlvbmFsIGRlYnVnIHByaW50ZidzLgotCShlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEhhbmRsZQotCUJTRl9TRUNUSU9OX1NZTSA8PT4gU1RUX1NFQ1RJT04sIEJTRl9GSUxFIDw9PiBTVFRfRklMRS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBIYW5kIG91dCBzeW1ib2xzIGluIGZvcndhcmQsIG5vdAotCXJldmVyc2Ugb3JkZXIuICBTaW1wbGlmeSBkdXBsaWNhdGUgY29kZS4KLQotRnJpIEp1bCAgMyAyMDoyMzozNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBSZW1vdmUgIih2b2lkKSIgY2FzdHMgZnJvbSBmdW5jdGlvbiBjYWxscyB3aGVyZSB0aGUKLQlyZXR1cm4gdmFsdWUgaXMgaWdub3JlZCwgaW4gYWNjb3JkYW5jZSB3aXRoIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1UdWUgSnVuIDMwIDE2OjQ5OjEyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBocHBhLmM6ICBBcHBseSBKb2huJ3Mgc3RhbmRhcmQgZml4IHRvIGF2b2lkICJlbXB0eSB0cmFuc2xhdGlvbgotCXVuaXQiIHdhcm5pbmdzIGZyb20gc29tZSBBTlNJLUMgY29tcGlsZXJzLgotCi1UaHUgSnVuIDI1IDA0OjM5OjI1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9zb2xhcmlzMi5oOiAgQ29uZmlndXJlIHNhbWUgYXMgc3lzdjQuCi0KLVR1ZSBKdW4gMjMgMjE6NTQ6NDQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCAoYmZkX3NlZWspOiAgTWFrZSBwcm90b3R5cGUgbWF0Y2ggZGVmaW5pdGlvbi4KLQkqIHJlbG9jLmMgKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogIE1ha2UgY2FzdCBvbiByZXR1cm4KLQl0eXBlIG1hdGNoIGFjdHVhbCByZXR1cm4gdHlwZS4KLQkqIGVsZl9wcmludF9zeW1ib2wgKHNlY3Rpb25fbmFtZSk6ICBNYWtlIENPTlNULgotCi1Nb24gSnVuIDIyIDE3OjM1OjI0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBpMzg2bGludXguYywgaG9zdHMvaTM4NmxpbnV4LmgsIGNvbmZpZy9pMzg2LWxpbnV4Lm10OgotCU5ldyBmaWxlcywgZm9yIExpbnV4IChhIGZyZWUgVW5peCBjbG9uZSBmb3IgMzg2IG1hY2hpbmVzKS4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW4sIHRhcmdldHMuYzogIFVwZGF0ZSBhY2NvcmRpbmdseS4KLQotRnJpIEp1biAxOSAyMDoyMzoyMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQlMaW50cyBmb3IgYmZkX3JlbG9jX2NvZGVfdHlwZS0+YmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLCBhbmQKLQljb3JyZWN0IGNhbGxpbmcgb2YgaG93dG8gc3BlY2lhbCBmdW5jdGlvbnMgYW5kIGZpeGVzIGZyb20gUmFlYnVybgotCWZvciBnYXM8PmJmZG5lc3MKLQkqIGFyY2h1cmVzLmM6IG51a2UgYmZkX3JlbG9jX2NvZGVfdHlwZQotCSogYm91dC5jLCBjcHUtaDgzMDAuYywgY29mZi1pOTYwLmMsIGNvZmYtbTg4ay5jOiBzcGVjaWFsIGZ1bmN0aW9uIGxpbnQKLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogU1RZUF9JTkZPIGlzIG1hcmtlZCBhcwotCVNFQ19ORVZFUl9MT0FELCB2YXJpb3VzIG90aGVyIGJmZGdhcyBuZXduZXNzCi0JKiByZWxvYy5jLT5saWJiZmQuaDogY2hhbmdlIHByb3R5cGUgb2YgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQkqIHRhcmdldHMuYzogY2hhbmdlIGp1bXAgdGFibGUgdmVjdG9yIHRvIGFib3ZlCi0KLQotRnJpIEp1biAxOSAxOTowMDo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGJmZF9lbGZfZmluZF9zZWN0aW9uKTogIE1hcmsgYXMgSU5URVJOQUxfRlVOQ1RJT04gc28KLQlpdHMgcHJvdG90eXBlIHdpbGwgYmUgaW5jbHVkZWQgaW4gbGliYmZkLmguICBDaGFuZ2UgcmVzdWx0IHR5cGUKLQl0byBzdHJ1Y3QgKiAocmF0aGVyIHRoYW4gZXF1aXZhbGVudCB0eXBlZGVmKSBzbyBpdCBjYW4gYmUgdXNlZCBpbgotCXRoZSBwcm90b3R5cGUsIHdoZXJlIHRoZXkgdHlwZWRlZiB3b24ndCBiZSBrbm93bi4KLQkqIGxpYmJmZC5oOiAgVXBkYXRlZCB2ZXJzaW9uLgotCi1GcmkgSnVuIDE5IDE1OjIxOjU2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhcmNodXJlcy5jLCBjb25maWd1cmUuaW4sIGNwdS1ocHBhLmMsIGhwcGEuYywgbGliaHBwYS5oLAotCXRhcmdldHMuYzogIEhQUEEgbWVyZ2UuCi0KLUZyaSBKdW4gMTkgMTI6MjE6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIFNlcGFyYXRlIFNvbGFyaXMyIGZyb20gU1lTVjQgb24gU1BBUkMuCi0JKiBjb25maWcvc29sYXJpczIubWg6ICBLbHVkZ2UgYXJvdW5kIFN1biBjb21waWxlciBidWcuCi0KLVdlZCBKdW4gMTcgMTQ6MDI6NDYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChhb3V0X2JhY2tlbmRfZGF0YSk6ICBDaGFuZ2UgZGVmcyBvZiB0d28gYml0ZmllbGRzIHRvCi0JYmUgdW5zaWduZWQgY2hhcnMgaW5zdGVhZCB0byBnZXQgYXJvdW5kIHJzNjAwMCBjb21waWxlciBwcm9ibGVtLgotCi1XZWQgSnVuIDE3IDEzOjU1OjMxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyLCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKToKLQlDb3JyZWN0IG1pc2NvbmNlcHRpb24gdGhhdCB0aGVyZSBjYW4gYmUgb25seSBvbmUgc3ltYm9sIHRhYmxlLgotCU9ubHkgY2FsbCBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlIG9uIHRoZSBmdWxsIHN5bWJvbCB0YWJsZSwgbm90Ci0JdGhlIGR5bmFtaWMgb25lIHdoaWNoIGlzIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGZ1bGwgb25lLgotCi1XZWQgSnVuIDE3IDE1OjU0OjU3IDE5OTIgIEtlbiBSYWVidXJuICAoUmFlYnVybkBDeWdudXMuQ09NKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvciBJOTYwLAotCWRvbid0IGFsaWduIHNlY3Rpb25zIGluIGZpbGUuCi0KLVR1ZSBKdW4gMTYgMDY6Mjg6MjEgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIHRhcmdldHMuYyAoc3RydWN0IGJmZF90YXJnZXQpOiBBZGRlZCBmaWVsZCBmb3IgdGFyZ2V0LXNwZWNpZmljCi0JKGJ1dCBub3QgZmlsZS1zcGVjaWZpYykgZGF0YSwgZm9yIGRpc3Rpbmd1aXNoaW5nIG1pbm9yCi0JY2hhcmFjdGVyaXN0aWNzIGJldHdlZW4gKGUuZy4pIGEub3V0IGZvcm1hdHMuCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IHNlYyk6IE5ldyBmaWVsZCB1c2VyX3NldF92bWEgaW5kaWNhdGVzIHZtYQotCWZpZWxkIHNob3VsZCBiZSBoZWVkZWQsIG5vdCBhc3N1bWVkIHRvIGJlIHVuc2V0LgotCShTVERfU0VDVElPTik6IEluaXRpYWxpemUgdGhhdCBmaWVsZCBvZiBzdGFuZGFyZCBzZWN0aW9ucyB0byB6ZXJvLgotCSogYmZkLWluLmggKGJmZF9zZXRfc2VjdGlvbl92bWEpOiBTZXQgdXNlcl9zZXRfdm1hIHRvIHRydWUuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfcmVsb2NzKTogV3JpdGUgb3V0IHN3YXBwZWQgcmVsb2MsIG5vdAotCXByZS1zd2FwcGVkIHZlcnNpb24uCi0KLQkqIGFyY2h1cmVzLmMgKHN0cnVjdCBiZmRfYXJjaF9pbmZvKTogRml4ZWQgb3JkZXIgb2YgY29tbWVudCBhbmQKLQlmaWVsZCBkZWNsLiAgTmV3IGZpZWxkcyBpbmRpY2F0ZSBzaXplIG9mIHBhZ2UgYW5kIHNlZ21lbnQgZm9yCi0JYXJjaGl0ZWN0dXJlLgotCSogY3B1LW02OGsuYyAoTik6IEZpbGwgaW4gdmFsdWVzLgotCSogY3B1LXNwYXJjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBEaXR0by4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBWYXJpb3VzIGJpdHMgb2YgZGF0YSAobm90Ci0JYWxsIHVzZWQgY3VycmVudGx5KSB3aXRoIGNoYXJhY3RlcmlzdGljcyBvZiBhLm91dCBpbXBsZW1lbnRhdGlvbi4KLQlJbXBvcnRhbnQgZmllbGQgZm9yIG5vdyBpcyB0ZXh0X2luY2x1ZGVzX2hlYWRlciwgaW5kaWNhdGluZyB0aGF0Ci0JdGhlIHRleHQgc2VjdGlvbiBzdGFydHMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZpbGUgaGVhZGVyLCB3aGljaAotCWdldHMgbWFwcGVkIGluIHdpdGggaXQuCi0JKHN0cnVjdCBhb3V0X2RhdGEpOiBOZXcgZmllbGRzIGluZGljYXRlIHdoZXRoZXIgdm1hIGhhcyBiZWVuCi0JYWRqdXN0ZWQgeWV0IChub3QgeWV0IHVzZWQpLCBhbmQgd2hhdCBtYWdpYyBudW1iZXIgd2lsbCBiZSB1c2VkIGluCi0JdGhlIG91dHB1dCBmaWxlIChzaG91bGQgZ28gYXdheSBpbiBmYXZvciBvZiB2bWFfYWRqdXN0ZWQpLgotCShXUklURV9IRUFERVJTKTogQ29kZSBmb3IgZGVhbGluZyB3aXRoIHNlY3Rpb24gc2l6ZXMgYW5kIHJlbGF0ZWQKLQloZWFkZXIgZmllbGRzIHJlcGxhY2VkIHdpdGggY2FsbCB0byBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMuCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiBGaWxsIGluIG1hZ2ljIG51bWJlciBmaWVsZC4KLQlTZXQgV1BfVEVYVCBmbGFnIGZvciBaTUFHSUMgYXMgd2VsbCBhcyBOTUFHSUMgZmlsZXMuCi0JKHNldF9hcmNoX21hY2gpOiBTZXQgcGFnZSBzaXplIGFuZCBzZWdtZW50IHNpemUgb25jZSBDUFUKLQl0eXBlIGlzIGtub3duLgotCShhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpOiBOZXcgZnVuY3Rpb247IGhhcyBtdWNoIGNvZGUgbW92ZWQKLQlmcm9tIHNldF9zZWN0aW9uX2NvbnRlbnRzIGFuZCBXUklURV9IRUFERVJTLiAgU2V0cyBvciBhZGp1c3RzIHZtYQotCWFuZCBzaXplIHBhcmFtZXRlcnMsIGFzIHdlbGwgYXMgbWFueSBoZWFkZXIgZmllbGRzLCBhZnRlciBkZWNpZGluZwotCW9uIG1hZ2ljIG51bWJlciBmb3Igb3V0cHV0IGZpbGUuICBDaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhpcwotCWFkanVzdG1lbnQgaGFzIG9ubHkgYmVlbiBkb25lIG9uY2UuCi0JKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2FsbCBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMgaW5zdGVhZCBvZgotCWRvaW5nIG11Y2ggb2YgdGhlIHdvcmsgaGVyZS4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfbWFrZV9kZWJ1Z19zeW1ib2wsIE1ZX2JhY2tlbmRfZGF0YSk6IFByb3ZpZGUKLQlkZWZhdWx0IChudWxsKSB2YWx1ZXMgb2YgdGhlc2UgZmllbGRzLgotCSogYW91dGYxLmggKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBvdmVycmlkZSBhX3RleHQKLQl2YWx1ZSBpbiBleGVjIGhlYWRlci4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCwgTVlfYmFja2VuZF9kYXRhKTogRGVmaW5lIGJhY2tlbmQgZGF0YQotCWluZGljYXRpbmcgZmlsZSBoZWFkZXIgaXMgaW5jbHVkZWQgaW4gdGV4dCBzZWN0aW9uLgotCi0JKiBhb3V0ZjEuaCAoTVlfcmVsb2NfaG93dG9fdHlwZV9sb29rdXApOiBGaXggdHlwby4KLQotCSogaG9zdHMvc3BhcmMuaCAoYWJvcnQsIGV4aXQpOiBIaWRlIHRoZXNlIG5hbWVzIGlmIGNvbXBpbGluZyB3aXRoCi0JZ2NjIHZlcnNpb24gMiwgdG8gYXZvaWQgd2FybmluZ3MuCi0KLU1vbiBKdW4gMTUgMTI6MjY6NTYgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9uY3IzMDAwLm1oIChJTlNUQUxMLCBSQU5MSUIpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQncyBicm9rZW4gb24gbmNyIDMwMDAncy4gIFVzZSBzaW1wbGUgInRydWUiIGZvciBSQU5MSUIuCi0KLVNhdCBKdW4gMTMgMDk6MTY6NDMgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtNjgwWzAxMjM0XTAtd3JzLSopOiBGaXggdHlwbyBpbiBtYXRjaCBwYXR0ZXJuLgotCi1GcmkgSnVuIDEyIDE5OjQ4OjM0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzZWN0aW9uLmMgKFNURF9TRUNUSU9OKTogIFJlbW92ZSBleHRyYSBzZW1pY29sb24gaW4gZGVjbGFyYXRpb25zLgotCSogY29uZmlndXJlLmluOiAgUmV3cml0ZSB0YXJnZXQgcGFyc2luZyB0byB1c2Ugc2ltcGxlIGZvcm1hdC4KLQlIYW5kbGUgc3BhcmMtc3VuLXNvbGFyaXMyIGNvbmZpZ3VyYXRpb24uCi0JKiBhb3V0NjQuaDogIEF2b2lkIEFOU0kgQyBicmFpbiBkZWF0aCB3YXJuaW5nLgotCSogZWxmLmM6ICBBdm9pZCB0cmlncmFwaCAoPz8/KSBvciAvKiBpbiBjb21tZW50cy4KLQotRnJpIEp1biAxMiAxNDo1MToxNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9zeXN2NC5taDogbmV3IGZpbGUsIFJBTkxJQj1lY2hvCi0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIFNvbGFyaXMyIGFzIC1zeXN2NCBvciAtc29sYXJpczIKLQotVGh1IEp1biAxMSAwMDo1MjowMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmMgKGVsZl9vYmpfdGRhdGEpOiAgTWVyZ2UgZWxmX29ial90ZGF0YV9zdHJ1Y3QgYW5kCi0JZWxmX2NvcmVfdGRhdGFfc3RydWN0IGludG8gYSBzaW5nbGUgY29tbW9uIHN0cnVjdC4gIENvcmUgZmlsZXMKLQl3b3VsZG4ndCBoYXZlIHdvcmtlZCBhdCBhbGwgd2l0aG91dCB0aGlzLgotCShiZmRfZWxmX2ZpbmRfc2VjdGlvbik6ICBOZXcgZnVuY3Rpb24gZm9yIEdEQidzIHVuZGVyY292ZXIgdXNlCi0JdG8gZmluZCBzdHJpbmcgc2VjdGlvbnMgdGhhdCBCRkQgaGlkZXMgZnJvbSBpdC4KLQkoZWxmX2dldF9zdHJfc2VjdGlvbik6ICBBdm9pZCBtdWx0aXBsZSBhbGxvYyZyZWFkcyBmb3Igc2FtZSBkYXRhOwotCWxpbnQuCi0JKGVsZl9vYmplY3RfcCwgZWxmX2NvcmVfZmlsZV9wKTogIEFsbG9jYXRlIGludGVybmFsIGZpbGUgaGVhZGVyCi0Jc3RvcmFnZSBkeW5hbWljYWxseS4KLQkqIGJmZC5jICh1bmlvbiB7Li4ufSB0ZGF0YSk6ICBSZW1vdmUgZWxmX2NvcmVfdGRhdGFfc3RydWN0LgotCSogZGVtbzY0LmM6ICBQcmV2ZW50ICJlbXB0eSB0cmFuc2xhdGlvbiB1bml0IiB3YXJuaW5ncyBmcm9tIGlkaW90cy4KLQotVHVlIEp1biAgOSAxNzoxNToyNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3tpMzg2djQubWgsIG5jcjMwMDAubWh9OiAgVXBkYXRlIFJBTkxJQiwgYWRkIElOU1RBTEwuCi0KLVNhdCBKdW4gIDYgMTc6MDI6NTEgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBTb2xhcmlzMiBhcyAqLXN1bi1zeXN2NCBvciBhcyAqLXN1bi1zdW5vczUuCi0KLVN1biBNYXkgMzEgMDU6NDU6MDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBoYW5kbGUgbTY4MFswMTIzNF0wIGFzIGFsaWFzZXMgZm9yIG02OGsKLQotVHVlIE1heSAyNiAxNjo1MDo1OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1hMjlrLmM6IGRvIGJ5dGUgcmVsb2NzIGNvcnJlY3RseQotCSogY29mZmNvZGUuaCAoc3R5cF90b19zZWNfZmxhZ3MpOiBuZXZlciBsb2FkIElORk8gc2VjdGlvbnMKLQkqIHNlY2xldC5jIChyZWwpOiBkb24ndCByZWxvY2F0ZSBJTkZPIHNlY3Rpb25zCi0KLVdlZCBNYXkgMjAgMDg6MTg6MTggMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIHNlY3Rpb24uYyAoYmZkXypfc3ltYm9sLCBiZmRfKl9zZWN0aW9uKTogSW5pdGlhbGl6ZSBzdGF0aWNhbGx5LgotCU1ha2UgdGhlIHN5bWJvbHMgdW5tb2RpZmlhYmxlLgotCShiZmRfc2VjdGlvbl9pbml0KTogRGVsZXRlZC4KLQkqIGluaXQuYyAoYmZkX2luaXQpOiBEb24ndCBjYWxsIGJmZF9zZWN0aW9uX2luaXQuCi0KLQkqIHNlY3Rpb24uYyAoYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRW5zdXJlIHRoYXQgcmFuZ2UgdG8gYmUKLQl3cml0dGVuIGlzIHdpdGhpbiBzZWN0aW9uIGJvdW5kYXJpZXMuCi0JKGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLiAgRG9uJ3QgYm90aGVyIGRpc3BhdGNoaW5nIGlmCi0Jc2l6ZSBpcyB6ZXJvLgotCi0JKiBsaWJiZmQuYyAoYmZkX3htYWxsb2MpOiBUZXh0IG9mIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIGNvbnN0LgotCi0JKiBjb2ZmLWk5NjAuYyAoaG93dG9fdGFibGUpOiBEZWxldGVkLgotCShob3d0b19yZWxsb25nLCBob3d0b19pcHJtZWQsIGhvd3RvX29wdGNhbGwpOiBOZXcgdmFyczsKLQlpbnRlcmVzdGluZyBlbnRyaWVzIGZyb20gb2xkIGhvd3RvX3RhYmxlLgotCShSVFlQRTJIT1dUTyk6IEFkanVzdGVkIHRvIHVzZSBzd2l0Y2guCi0JKGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogQWxsb2NhdGUgc3RvcmFnZSBmb3IgYXV4Ci0JcmVjb3JkcyBmb3Igc2VjdGlvbiBzeW1ib2wuCi0JKG1ha2VfYWJzX3NlY3Rpb24pOiBVbnVzZWQ7IGRlbGV0ZWQuCi0JKHJlbnVtYmVyX3N5bWJvbHMpOiBSZS1vcmRlciBzeW1ib2xzIHNvIHVuZGVmaW5lZCBzeW1ib2xzIGNvbWUKLQlsYXN0LCBhcyBDT0ZGIGZvcm1hdCBkZXNpcmVzLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IFB1dCBDX0ZJTEUgc3ltYm9scyBpbiBkZWJ1ZyBzZWN0aW9uIGFsd2F5cy4KLQkoY29mZl9zZWN0aW9uX3N5bWJvbCk6IE5ldyBmdW5jdGlvbjsgY3JlYXRlcyBhIHN5bWJvbCB3aXRoIHRoZQotCXNhbWUgbmFtZSBhcyBhIHNlY3Rpb24sIGFuZCBzZXRzIHVwIGF1eCByZWNvcmRzIGZvciBpdC4KLQkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogTmV3IGZ1bmN0aW9uOyBhZGRzIHNlY3Rpb24gc3ltYm9scyB0bwotCXN5bWJvbCB0YWJsZSBpZiB0aGV5IGFyZW4ndCB0aGVyZSBhbHJlYWR5LiAgU2hvdWxkIHNvbWVkYXkgYWxzbwotCWFkZCBhIGR1bW15IENfRklMRSBzeW1ib2wgaWYgbm9uZSBpcyBwcmVzZW50LgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEFkZCBtaXNzaW5nIHN5bWJvbHMgYmVmb3JlIHByZXBhcmluZwotCXN5bWJvbCB0YWJsZSB0byBiZSB3cml0dGVuLgotCShjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKTogVmVyaWZ5IHRoYXQgc3ltYm9sIGluZGljZXMgcmVhZCBpbiBhcmUKLQlpbiBhIHJlYXNvbmFibGUgcmFuZ2UuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3RkYXRhKTogTmV3IGZpZWxkIGNvbnZfdGFibGVfc2l6ZS4KLQkob2JqX2NvbnZfdGFibGVfc2l6ZSk6IEFjY2Vzc29yIG1hY3JvLgotCi0JKiBib3V0LmMgKGJfb3V0X3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlcyB0aHJlZQotCXJlbG9jIHR5cGVzIG9uIGk5NjAuCi0KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSk6IE5ldyBtYWNyby4gIExpa2UKLQliZmRfc2VjdGlvbl9uYW1lLCBidXQgcmV0dXJucyBydmFsdWUsIG5vdCBsdmFsdWUuCi0JKGJmZF9nZXRfc2VjdGlvbl92bWEsIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQpOiBTaW1pbGFyLgotCShiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MpOiBOb3cgcmV0dXJucyBydmFsdWUuCi0KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZCBzZXZlcmFsIG5ldyB2YWx1ZXMsIHNvbWUKLQlnZW5lcmFsLCBzb21lIHNwZWNpZmljIHRvIHNwYXJjIG9yIGk5NjAuCi0KLQkqIGFvdXR4LmggKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogU2V0IFZNQSBmb3IgZWFjaCBzZWN0aW9uIGJhc2VkCi0Jb24gcHJldmlvdXMgc2VjdGlvbi4gIElmIHRleHQgc2VjdGlvbiBWTUEgZG9lc24ndCBhcHBlYXIgdG8gaGF2ZQotCWJlZW4gc2V0LCBtYWtlIGEgYmVzdCBndWVzcyBmcm9tIHRoZSB0eXBlIG9mIGZpbGUuCi0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlbG9jX2hvd3RvX3R5cGVfbG9va3VwKTogRGVmaW5lIGFzIHplcm8gaWYKLQlub3QgZGVmaW5lZC4KLQkoTVkodmVjKSk6IEluaXRpYWxpemUgcmVsb2NfdHlwZV9sb29rdXAgZmllbGQuCi0KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlXyopOiBFeHBvcnQgYXMgYW91dF8jXypfaG93dG9fdGFibGUuCi0JKGJmZF9lcnJvcl90cmFwLCBiZmRfZXJyb3JfdmVjdG9yKTogRXh0ZXJuLCBub3QgY29tbW9uLgotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uLiAgSGFuZGxlcyBhCi0JZmV3IHR5cGVzIG9mIHJlbG9jcyBmb3Igc3BhcmM7IHdpbGwgbmVlZCBlbmhhbmNlbWVudC4KLQotCSogYm91dC5jIChjYWxsal9jYWxsYmFjayk6IFVzZSBERUZVTiBtYWNybyBpbiBkZWZpbml0aW9uLgotCSogY29mZi1pOTYwLmMgKG9wdGNhbGxfY2FsbGJhY2spOiBMaWtld2lzZS4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQWRkZWQgZmllbGRzIHJlbG9jX3R5cGVfbG9va3VwIGFuZAotCV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wuICBBbHNvIG1pbm9yIGNvbW1lbnQgY2hhbmdlcy4KLQkqIHN5bXMuYyAoYmZkX21ha2VfZGVidWdfc3ltYm9sKTogTmV3IGRpc3BhdGNoaW5nIG1hY3JvLgotCSogcmVsb2MuYyAoYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVGFrZSBhIEJGRCBwdHIgYXMgYXJnIHJhdGhlcgotCXRoYW4gYXJjaCBpbmZvLCBhbmQgZGlzcGF0Y2ggd2l0aCBCRkRfU0VORC4gIENhbGxlcnMgY2hhbmdlZC4KLQkqIGFyY2h1cmVzLmMgKHN0cnVjdCBiZmRfYXJjaF9pbmZvKTogRGVsZXRlZCBmaWVsZAotCXJlbG9jX3R5cGVfbG9va3VwLgotCSogY3B1LSouYzogRG9uJ3QgaW5pdGlhbGl6ZSB0aGF0IGZpZWxkLgotCi0JKiBiZmQtaW4uaCAoZW51bSBiZmRfZXJyb3IpOiBBZGQgbmV3IHZhbHVlICJiYWRfdmFsdWUiLgotCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogTm93IGNvbnN0OyBhZGRlZCBlbnRyeSBmb3IgYmFkX3ZhbHVlLgotCShiZmRfZXJybXNnKTogTm93IHJldHVybnMgcHRyIHRvIGNvbnN0LgotCSogYmZkLWluLmggKGJmZF9lcnJtc2cpOiBGaXggcHJvdG90eXBlLgotCi0JKiBjYWNoZS5jIChCRkRfQ0FDSEVfTUFYX09QRU4pOiBGaXggdHlwbyBpbiBkb2MuCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uKTogRGl0dG8uCi0KLQkqIHNlY3Rpb24uYyAoU2VjdGlvbiBPdXRwdXQgZG9jKTogSW1wcm92ZSBkZXNjcmlwdGlvbiBvZiB1c2Ugb2YKLQlvdXRwdXRfc2VjdGlvbiBhbmQgb3V0cHV0X29mZnNldC4KLQotVHVlIE1heSAxOSAyMzo0MjoxMCAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIHNjby1jb3JlLmM6IG5ldyBmaWxlIGZyb20gbmV0LgotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBidWdmaXggZnJvbSBuZXQ6Ci0JICBOb3cgd2UgaGF2ZSB0aGUgaGFpcnkgbGlua2VyLCBpdCdzIHBvc3NpYmxlIHRvIG1vdmUgc3ltYm9scyBmcm9tCi0JICBvbmUgc2VjdGlvbiBpbnRvIGFub3RoZXIuICBBY3R1YWxseSBtYWtlIHRoYXQgd29yayEKLQotU2F0IE1heSAxNiAxNzo1Nzo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N1bjMuaDogZml4IGRlY2xhcmF0aW9uIG9mIGZyZWUuCi0KLVR1ZSBNYXkgMTIgMTQ6MDg6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYTI5ay5jIChwZXJmb3JtX3JlbG9jKTogZml4IGJ1ZyBpbiBqbXAvY2FsbCBldmFsdWF0aW9uCi0JKiBjb2ZmLWg4MzAwLmMgKHJlbG9jX3Byb2Nlc3NpbmcpOiBhbGwgcmVsb2NzIGFyZSByZWxhdGl2ZSB0bwotCXNlY3Rpb24gc3RhcnQuCi0JKiBvcG5jbHMuYzogZG9uJ3QgdXNlIGZkb3BlbiBvbiBET1Mgc3lzdGVtcwotCi0Jc2hvcnQgcGF0Y2hlcyBmcm9tIEdsZW5uIEthc3RlbiAoZ2xlbm5AcmVhZHkuY29tKQotCSogdGFyZ2V0LmM6IGVuYWJsZWQgb2FzeXMgc3VwcG9ydAotCSogb2FzeXMuYzogIEluc2VydCAuIHdoZW4gVU5ERVJTQ09SRV9IQUNLIGlzIGVuYWJsZWQsCi0JZml4IHByb2JsZW0gd2hlcmUgYSByZWxvY2F0aW9uIHdoaWNoIGNyb3NzZWQgYSBtb2RpZmljYXRpb24gYnl0ZQotCWJvdW5kYXJ5IGRpZCBub3Qgd29yay4gRml4IHByb2JsZW0gd2hlcmUgYSByZWxvY2F0aW9uIG5lYXIgdGhlIGVuZAotCW9mIGEgZGF0YSByZWNvcmQgZGlkIG5vdCB3b3JrLgotCi0KLVR1ZSBNYXkgIDUgMTg6MTE6MjUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2NvZmZfYXJtYXApOiBvbGQgdmVyc2lvbnMgb2YgQkZEIHdyb3RlCi0JYXJjaHZpZSBoZWFkZXIgc3RyaW5nIGNvdW50cyB0aGUgZW5kaWFuIHdheSwgdGhpcyBoZXVyaXN0aWMgc2VlcwotCWhvdyBiaWcgYW4gYXJjaGl2ZSBzdHJpbmcgdG8gcmVhZCBieSB0cnlpbmcgaXQgb25lIHdheSBhbmQgaWYgdGhlCi0Jc3RyaW5nIHRhYmxlIGlzIHVucmVhc29uYWJseSBiaWcsIHRyeWluZyBpdCB0aGUgb3RoZXIuICpGSVhNRSouCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBjYW4ndCBkbyBmZG9wZW5zIG9uIFZNUwotCi1UdWUgTWF5ICA1IDE0OjE4OjI0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6ICBJbmNyZWFzZSB2ZXJzaW9uIG51bWJlciB0byAxLjk3LCBmb3IgY29uc2lzdGVuY3kKLQl3aXRoIC4uL2JpbnV0aWxzLgotCSogTWFrZWZpbGUuaW46ICBkb2NkaXIgaXMgLi9kb2MsIG5vdCAke3NyY2Rpcn0vZG9jLgotCi1Nb24gTWF5ICA0IDExOjQ5OjE1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgICAgICogYmZkLWluLmg6IGJ1bXAgdmVyc2lvbiB0byAxLjk2Ci0gICAgICAgICBNYWpvciBjaGFuZ2U7IGNoYW5nZWQgY2FsbGluZyBjb252ZW50aW9uIGZvcgotCSBiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIHNvIHRoYXQgY2FsbGVyIGFsbG9jYXRlcwotCSBtZW1vcnkgZm9yIHNlY3Rpb24gZGF0YS4KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksIHJlbG9jLmMsCi0Jc2VjbGV0LmMsIHRhcmdldHMuYywgYmZkLmM6IHJlZmxlY3QgbmV3IGNvbnZlbnRpb24uCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IGlmIHN0eXBfZmxhZ3MgaXMgbm90IGEgc3BlY2lhbAotCWNhc2UsIHRoZW4gdXNlIHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgZm9yIFNFQ18qIGZsYWdzLgotCi1GcmkgTWF5ICAxIDEyOjU4OjM0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHVzZSBSRUxTWiB0byB3b3JrIG91dAotCXNpemUgb2Ygb3V0cHV0IHJlbG9jIHN0cnVjdC4KLQkqIHRhcmdldHMuYywgTWFrZWZpbGUuaW46IGNvbW1lbnQgb3V0IHRla2hleCBmb3IgdGhlIG1vbWVudC4KLQkqIGllZWUuYzogaWYgc29tZSBwbGFjZXMgd2hlcmUgbnVsbCBwb2ludGVycyB3ZXJlIHVzZWQgaW5zdGVhZCBvZiAmYmZkX2Fic19zZWN0aW9uLgotCSogY29uZmlndXJlLmluOiB0YW5kZW0gdGFyZ2V0IGlzIHN0MjAwMAotCSogY29mZi1tNjhrLmM6IHJlbmFtZSBzdGF0aWMgaG93dG9fdGFibGUgdG8gZ2xvYmFsCi0JbTY4a2NvZmZfaG93dG9fdGFibGUuCi0JKiBib3V0LmM6IHJlbW92ZSB1bm5lY2Vzc2FyeSBhYm9ydAotCSogY29mZi1hMjlrLmM6IHZhcmlvdXMgY2hhbmdlcyB0byB0aGUgd2F5IHJlbG9jYXRpb25zIHdvcmsgdG8gY29wZQotCXdpdGggdGhlICJuZXcgb3JkZXIiIGFuZCBsYXRlbnQgYnVncy4KLQkqIGNvZmZjb2RlLmg6IGxpbnQKLQotV2VkIEFwciAyOSAxMjozNzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9zd2FwX2V4dF9yZWxvY19vdXQsIGFvdXRfc3dhcF9zdGRfcmVsb2Nfb3V0KQotCWJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiB0cmVhdCBhYnMgc3VtYm9scyB0aGUgcmlnaHQgd2F5LgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm0tcmVsb2NhdGlvbik6IGRvbid0IHJlbG9jYXRlIHJlZnMgdG8KLQlhYnNvbHV0ZSBzeW1ib2xzIGlmIGRvaW5nIGEgcGFydGlhbCBsaW5rLgotCi1GcmkgQXByIDI0IDA3OjM1OjI2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBhMjlrLWFtZC11ZGkuCi0KLVRodSBBcHIgMjMgMTg6Mzc6NTUgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfPGJpdHM+X3N3YXBfZXhlY19oZWFkZXJfaW4pOiAgWmVybyBvdXQgdGhlCi0JaW50ZXJuYWxfZXhlYyBzdHJ1Y3R1cmUgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgZmllbGRzIHRoYXQKLQlhcmUgdXNlZCwgc28gdGhhdCB0aGUgdW51c2VkIGZpZWxkcyBhcmUgaW4gYSBrbm93biBzdGF0ZS4KLQotV2VkIEFwciAyMiAwOTozNjowOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogdGVraGV4LmMgKHN0cnVjdCBkYXRhX3N0cnVjdCk6ICBDb252ZXJ0IGZyb20gdHlwZWRlZiB0aGF0Ci0JdHlwZWRlZnMgbm90aGluZyB0byBhIG5vcm1hbCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb24uCi0JKiB0ZWtoZXguYyAocGFzc19vdmVyKTogIFByb3RvdHlwZSBhcmdzIGZvciBmdW5jdGlvbiB0aGF0Ci0Jc2Vjb25kIGFyZyBwb2ludHMgdG8uCi0KLU1vbiBBcHIgMjAgMjI6MjI6NTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIG9sZCBzdHlsZSBzdGFnaW5nLiAgRG8gbm90IHByaW50IHJlY3Vyc2lvbgotCSAgbGluZXMuCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgQ0ZMQUdTIGNhbiBiZSBwYXNzZWQgZnJvbSB0aGUKLQkgIE1ha2VmaWxlIGNvbW1hbmQgbGluZS4gIFJlbW92ZSBNSU5VU19HLiAgRGVmYXVsdCBDRkxBR1MgdG8gLWcuCi0JICBQYXNzIENGTEFHUy4KLQotRnJpIEFwciAxNyAwOToxNTozMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMsIE1ha2VmaWxlLmluOiBhZGRlZCB0ZWtoZXgKLQkqIGFvdXR4LmggKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogcGFnZXMgc2hvdWxkIGJlIHBhZGRlZCB0byB0aGUKLQlzaXplIG9mIGEgcGFnZSwgbm90IHRoZSBzaXplIG9mIGEgc2VnbWVudC4KLQkqIGNvbmZpZ3VyZS5pbjogYWRkZWQgZ28zMiBob3N0IGFuZCBpMzg2LWFvdXQgdGFyZ2V0LgotCSogaTM4NmFvdXQuYywgbGliYW91dC5oOiBub3cgd29ya3MgZm9yIGdvMzIgdGFyZ2V0Ci0JKiBpZWVlLmM6IGZpeCBiaXQgcm90LgotCSogc2VjbGV0LmM6IHN1cHBvcnQgZm9yIHBhZGRpbmcgc2VjbGV0IHR5cGUuCi0KLVdlZCBBcHIgMTUgMTg6MTE6NTggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgLk5PRVhQT1JUOgotCi1UdWUgQXByIDE0IDE0OjM0OjQyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoYmZkX2FkZF9zdHJ0YWIsIGJmZF9hZGRfMl90b19zdHJ0YWIpOiAgQ09OU1Qgc3ByZWFkcwotCWxpa2Ugb296ZS4KLQkqIGVsZi5jIChlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAotCWVsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiAgUmV0dXJuIGJvb2xlYW4sIG5vdCBOVUxMICh3aGljaAotCWNhbiBiZSB2b2lkICopLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBJZmRlZi1vdXQgZGVidWdnaW5nIGNvZGUuCi0JQWxzbyBpZmRlZi1vdXQgY29kZSB0aGF0IGFib3J0cyBvbiB1bmhhbmRsZWQgc2VjdGlvbiB0eXBlcy4KLQotRnJpIEFwciAxMCAyMjoyOToxOCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIG5jcjMwMDAgY29uZmlnCi0JKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBQYXNzIG9uIHRvIHJlY3Vyc2l2ZSBtYWtlcy4KLQkqIGhvc3RzL25jcjMwMDAuaCwgY29uZmlnL25jcjMwMDAubWg6ICBBZGQgaG9zdCBjb25maWcgZmlsZXMuCi0KLVRodSBBcHIgIDIgMTc6NDI6NDUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTm93IHRoYXQgd2UgaGF2ZSBzeW0uaCBhbmQgc3ltY29uc3QuaCwgY29tcGlsZQotCWNvZmYtbXN5bS5jIG9uIGFsbCBzeXN0ZW1zLgotCSogY29uZmlnL3tkZWNzdGF0aW9uLm1oLCBpcml4My5taCwgaXJpeDQubWh9OiAgUmVtb3ZlIGNvZmYtbXN5bS5vIGRlcC4KLQkqIGNvZmYtbXN5bS5jOiAgVXBkYXRlIGluY2x1ZGUgZmlsZXMgYW5kIGNvbW1lbnRzOyBhZGQgd2Vha2V4dCBiaXQuCi0KLVdlZCBBcHIgIDEgMjM6MTY6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYywgYmZkLmMsIGJvdXQuYywgY29mZmNvZGUuaCwgaW5pdC5jLCByZWxvYy5jLAotCXNlY3Rpb24uYywgc3JlYy5jLCBzeW1zLmMsIGNvZmYtaDgzMDAuYzogIExpbnQuCi0KLVN1biBNYXIgMjkgMDk6Mzc6NTkgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJvdXQuYywgY29mZi1hMjlrLmMsIGNvZmYtaTk2MC5jOiAgTGludC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCBuZXcgaG9zdCBhbmQgdGFyZ2V0IGNvbmZpZ3MuCi0JKiBlbGYuYyAoYmZkX3Byc3RhdHVzLCBiZmRfZnByZWdzZXQpOiAgQXZvaWQgdHlwZW5hbWUgb2YgcmVnaXN0ZXIKLQlzdHJ1Y3RzLCB3aGljaCB2YXJ5OyBqdXN0IHVzZSBtZW1iZXIgbmFtZS4KLQkoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgTGludCwgZml4IGNvbW1lbnRzLgotCSogY29uZmlnL3NwYXJjLWVsZi5tdCwgaG9zdHMvc3lzdjQuaDogIE5ldyBjb25maWcgZmlsZXMuCi0KLVNhdCBNYXIgMjggMTM6MDc6MDIgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6ICBGaXggdG8gdXNlIG9ubHkgYSBzaW5nbGUKLQlsb2NhbCwgZGlzcG9zYWJsZSwgY29weSBvZiB0aGUgZXh0ZXJuYWwgZm9ybSBvZiBzZWN0aW9uIGhlYWRlcgotCXRhYmxlIGFuZCBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyaWVzLgotCi1UaHUgTWFyIDI2IDE2OjU5OjU4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFNldCBNSU5JTUlaRSBiYWNrIHRvIDAgZm9yIGEgcmVhbCByZWxlYXNlLgotCi1UdWUgTWFyIDI0IDE1OjU3OjAzIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZy9pcml4NC5tW2h0XSwgaG9zdHMvaXJpeDQuaDogYWRkIHN1cHBvcnQgZm9yCi0JICBpcml4NC4KLQotTW9uIE1hciAyMyAyMjozNzozNCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW1zeW0uYyAoZWNvZmZfc3dhcF9yZmRfaW4pOiAgcmVtb3ZlICYgZm9yIGFycmF5IHJlZi4KLQotVHVlIE1hciAxNyAxNDoxMjoyNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUpOiAgVXNlIEJGRF9BU1NFUlQgbWFjcm8sCi0Jbm90IGludGVybmFsIGJmZF9hc3NlcnQgZnVuY3Rpb24gKHR3aWNlKS4KLQotVHVlIE1hciAxNyAxMDo0NToxMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaDogY2hhbmdlIGFyX21heF9uYW1lbGVuIHRvIDE1ICh0aGUgcmlnaHQgdmFsdWUpCi0JKiBjb2ZmLWEyOWssIGNvZmZjb2RlLmg6IG1vcmUgaGFuZ292ZXJzIGZyb20gdGhlIGJmZF9hYnNfc2VjdGlvbgotCWNoYW5nZQotCi1Nb24gTWFyIDE2IDE0OjU3OjIyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IGNoZWNrIGZvciBib3V0IGFyY2hpdmVzIHRvby4KLQkqIGJvdXQuYzogbWFrZSBpdCB3b3JrIGFnYWluLgotCi1TYXQgTWFyIDE0IDE3OjMwOjQwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX2NvcmVmaWxlX25vdGUpOiAgQ2FsbCBiZmRfeG1hbGxvYygpIGluc3RlYWQgb2YgYmFyZQotCW1hbGxvYygpLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogIENhbGwKLQliZmRfeG1hbGxvYygpIGluc3RlYWQgb2YgYmFyZSBtYWxsb2MoKS4KLQotRnJpIE1hciAxMyAxNTo0NDozNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biBNQUtFSU5GTyBvbiBpbmZvLgotCi1GcmkgTWFyIDEzIDA3OjQxOjEzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbXQtPGZvbz4gbm93IDxmb28+Lm10LCBjb25maWcvbWgtPGZvbz4gbm93IDxmb28+Lm1oLgotCWhvc3QvaC08Zm9vPiBub3cganVzdCA8Zm9vPi4KLQkqIGNvbmZpZ3VyZS5pbjogcmVmbGVjdCBjaGFuZ2VzCi0KLVRodSBNYXIgMTIgMTE6MTU6MDIgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChzZXRfdGRhdGEpOiAgTWFrZSBjaGFuZ2Ugb2YgRmViIDI3IGluIHRoZQotCWFjdHVhbCBzb3VyY2UgZmlsZSwgbm90IGp1c3QgdGhlIGdlbmVyYXRlZCBsaWJiZmQuaC4KLQotU2F0IE1hciAgNyAxMDozMzo0MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmMgKGljb2ZmX2xpdHRsZV92ZWMpOiBhZGQgQ09GRl9TV0FQX1RBQkxFIHNvIHdlIGNhbiBydW4KLQlnZGIgb24gbGl0dGxlLWVuZGlhbiA5NjAgY29kZS4KLQkqIGFyY2hpdmUuYyAoY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBpbmRpcmVjdCBzeW1ib2xzIHNob3VsZCBnbwotCWludG8gdGhlIGFyY2hpdmUgaGVhZGVyIHRvby4KLQotRnJpIE1hciAgNiAyMTo1NToxNiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KLQotVGh1IE1hciAgNSAyMzo1MTo0MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1tc3ltLmM6ICBNb3ZlIHRoaXMgZmlsZSBmcm9tIGdkYi9lY29mZi5jLiAgSXQKLQloYW5kbGVzIGJ5dGUtc3dhcHBpbmcgZm9yIEVDT0ZGIChNSVBTIHN5bWJvbCkgZmlsZXMuCi0JKiBjb25maWcvbWgtZGVjc3RhdGlvbiwgY29uZmlnL21oLWlyaXgzOiAgQWRkIGNvZmYtbXN5bS5vCi0JdG8gdGhlIGZpbGVzIGJ1aWx0IG9uIE1JUFMtYmFzZWQgaG9zdHMuCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBydWxlIGZvciBjb2ZmLW1zeW0uCi0KLVRodSBNYXIgIDUgMjE6MzY6MDUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4gIE1JTklNSVpFPTEuCi0KLVN1biBNYXIgIDEgMjI6MzI6NTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmM6ICBNb3ZlIGNvcmUgZmlsZSBmdW5jdGlvbnMgaW50byBzZXBhcmF0ZQotCW5ldyBmaWxlIHJzNjAwMC1jb3JlLmMuICBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHJlYWRpbmcKLQljb3JlIGZpbGVzIGRlcGVuZHMgb24gbmF0aXZlIGluY2x1ZGUgZmlsZXMgdGhhdCBjb25mbGljdAotCXdpdGggLi4vaW5jbHVkZS9jb2ZmL3JzNjAwMC5oLgotCSogY29uZmlnL21oLXJzNjAwMDogIEFkZCByczYwMDAtY29yZS5vIHRvIEhERVBGSUxFUy4KLQotVGh1IEZlYiAyNyAyMjoxOTo1NSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LHByaW50X3N5bWJvbCkpOiBEb24ndCBwcmludAotCXN5bWJvbCBhZGRyZXNzcyBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuCi0JKiBjb2ZmLXJzNjAwMC5jOiAgVmFyaW91cyB1cGRhdGVzIChkdWUgdG8gdGFyZ2V0LQotCWluZGVwZW5kZW50IGNoYW5nZXMpLgotCSogbGliYmZkLmg6ICBEaXR0byAodGRhdGEgZmllbGQgaXMgbm93IGEgdW5pb24pLgotCSogaG9zdHMvaC1zcGFyYy5oOiAgUmVtb3ZlZCBwcm90b3R5cGUgZm9yIGJvZ3VzIGZ1bmN0aW9uCi0JJ2Vtc2V0JyAocHJlc3VtYWJseSBzaG91bGQgaGF2ZSBiZWVuICdtZW1zZXQnIC0gd2hpY2ggaXMgdGhlcmUpLgotCi1UaHUgRmViIDI3IDExOjQ2OjMzIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtYmlnLSogdGFyZ2V0KTogIFNhbWUgaXMgSXJpcy4KLQotVGh1IEZlYiAyNyAwOToyNDo1NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IHdoZW4gY3JlYXRpbmcgYW4KLQlhbGlhcyBzeW1ib2wsIGZpbGwgaW4gdGhlIHNlY3Rpb24gYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbgotCWxlYXZpbmcgaXQgYmxhbmsuIElmIGFuIG91dHB1dCBzZWN0aW9uIGNhbid0IGJlIGZvdW5kIGZvciBhCi0Jc3ltYm9sLCB0aGVuIGRvbid0IGNvcmUgZHVtcC4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLVdlZCBGZWIgMjYgMTk6NDA6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiBsaW50Ci0JKiBjb2ZmLWg4MzAwLmM6IGZpeCBzdHVwaWQgcmVsb2Mgc3VidHJhY3Rpb24gYnVnCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X291dCk6IG9ubHkgc3dhcCBhIHR2bmR4IGJ5IDIgYnl0ZXMsCi0Jc2luY2UgdGhhdCdzIGhvdyB3aWRlIGl0IGlzLiAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBhbHdheXMgemVybyBvdXQKLQl0aGUgc3ltYm9sLmZsYWdzIGFuZCBkb25lX2xpbmVubyBmaWVsZHMuCi0KLVR1ZSBGZWIgMjUgMTQ6Mjk6MjQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfc3ltYm9sKTogd3JpdGUgb3V0IHRoZSBjb3JyZWN0IG51bWJlciBvZgotCWF1eGVudHMuCi0JKiBjcHUtaDgzMDAuYzogZml4IGRpc2Fzc2VtYmx5IGJ1ZwotCi1GcmkgRmViIDIxIDIxOjM5OjU2IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaCAoYmZkX2Vycm1zZyksIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4sCi0Jc2VjdGlvbl9mcm9tX2JmZF9pbmRleCksIGNwdS1oODMwMC5jIChob3d0bypfY2FsbGJhY2spLAotCXJlbG9jLmMsIHNlY3Rpb24uYyAoYmZkX21hcF9vdmVyX3NlY3Rpb25zKSwgdGFyZ2V0cy5jCi0JKGJmZF90YXJnZXRfbGlzdCk6ICBQcm90b2xpbnQuCi0JKiBsaWJiZmQuaDogIFVwZGF0ZSB0byBtYXRjaCBhIGxpYmJmZC1pbi5oIGZyb20gYSBtb250aCBhZ28uCi0KLUZyaSBGZWIgMjEgMTA6NTc6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBsaW50LCAoY29mZl9wcmludF9zeW1ib2wpOiBwcmludHMKLQlvdXQgdGFnbmR4IHRvby4KLQkqIGFvdXR4LmggKHN3YXBfc3RkX3JlbG9jX291dCwgc3dhcF9leHRfcmVsb2Nfb3V0KTogdXNlIHRoZSBvdXRwdXQKLQlzZWN0aW9uIG9mIGEgc3ltYm9sIHJhdGhlciB0aGFuIHRoZSBzZWN0aW9uIG9mIGEgcmVmZmVkIHN5bWJvbCB0bwotCWRldGVybWluZSB0aGUgcl9pbmRleCBvZiBhbiBlbW1pdHRlZCByZWxvYy4KLQotVGh1IEZlYiAyMCAxODoxMDozNCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUE9SVElORzogTmV3IChwcmVsaW1pbmFyeSkgcG9ydGluZyBndWlkZS4KLQotV2VkIEZlYiAxOSAyMTozOTozNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYm91dC5jIChjYWxsal9jYWxsYmFjayksIGNvZmYtYTI5ay5jIChhMjlrX3JlbG9jKSwgY29mZi1tODhrLmMKLQkoaG93dG9faHZydDE2KTogIGxpbnQuCi0KLU1vbiBGZWIgMTcgMTI6MDI6MTcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGhwMzAwYnNkLmMgKG5ldyksIGNvbmZpZy9tdC1ocDMwMGJzZDogIE1ha2UgaHAzMDBic2QKLQlhIGZ1bGwgY29uZmlndXJhdGlvbiAod2l0aCBwb3NzaWJsZSBjcm9zcy1kZXZlbG9wbWVudCksCi0JaW5zdGVhZCBvZiB1c2luZyBob3N0LWFvdXQuYy4KLQotU3VuIEZlYiAxNiAxMzowMTo0OSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC10YXJnZXQuaCAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKToKLQlTZXQgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpLgotCSogZ2VuLWFvdXQuYzogIENoYW5nZSB0byBlbWl0IGEgLmMgZmlsZXMsIG5vdCBhIC5oIGZpbGUuCi0KLVRodSBGZWIgMTMgMjA6MTE6NDcgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIFJlbW92ZSBvYnNvbGV0ZSB1c2Ugb2YKLQlCU0ZfQUJTT0xVVEUgYW5kIHJlcGxhY2Ugd2l0aCBiZmRfYWJzX3NlY3Rpb24gcmVmZXJlbmNlLgotCi1UaHUgRmViIDEzIDE3OjIyOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChnZXRfbm9ybWFsaXplZF9zeW10YWIpOiBmaXhlZCBidWcgd2hlcmUgc3ltYm9scwotCXdpdGggbW9yZSB0aGFuIG9uZSBhdXhlbnQgY2FuIGNhdXNlIG5hc3R5IGNvcmUgZHVtcHMuCi0KLQkqIGNvZmZjb2RlLmgsIGxpYmNvZmYuYzogYWRkZWQgbmV3IGZpZWxkZWQgdG8gY29mZl9zeW1ib2xfc3RydWN0Ci0JImRvbmVfbGluZW5vIiBzbyB0aGF0IGEgc3ltYm9sIHdoaWNoIGFwcGVhcnMgdHdpY2UgaW4gdGhlIHN5bWJvbAotCXRhYmxlIG9ubHkgZ2V0cyBpdCdzIGxpbmVudW1iZXJzIHJlbG9jYXRlZCBvbmNlLiBNb2RpZmVkCi0JKGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCkgYW5kIChjb2ZmX21ha2VfZW1wdHlfc3ltYm9sKSB0byBtYWtlCi0JdXNlIG9mIGl0LgotCi1UdWUgRmViICA0IDE1OjM5OjU1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oOiAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IGZpeCBjb25zdHJ1Y3RvcgotCXN0dWZmIHRvIHVzZSB0aGUgTmV3IE9yZGVyLgotCi1GcmkgSmFuIDMxIDAxOjM0OjQ1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGllZWUuYzogIENoYW5nZSB0eXBlIG9mIGVudmlbXSB0byB1bnNpZ25lZCBjaGFyLgotCi0JKiBjb25maWd1cmUuaW46ICBmaXggdmF4IHVsdHJpeCBjb25maWd1cmF0aW9uLgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogIERlYWwgd2l0aCBudWxsIHJldHVybiBmcm9tCi0JYmZkX21ha2Vfc2VjdGlvbigpLiAgKGVsZl9vYmplY3RfcCk6ICBTZWxlY3QgZW5kaWFuZXNzIHByb3Blcmx5LgotCi1GcmkgSmFuIDMxIDAxOjE5OjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLXRhaG9lLmgsIGgtdmF4YnNkLmg6ICBGaXggc3RhY2sgaW4gY29yZSBmaWxlcy4KLQotVGh1IEphbiAzMCAyMzo1MTowNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBob3N0LWFvdXQuYyBkb2Vzbid0IGRlcGVuZCBvbiBhb3V0LXBhcmFtcy5oLgotCSogYW91dC10YXJnZXQuaDogIFVzZSBUQVJHRVRfQklHX0VORElBTl9QIHRvIHNldCB1cCB2ZWN0b3IuCi0JKiBob3N0LWFvdXQuYzogIERvbid0IHVzZSBhb3V0LXBhcmFtcy5oOyBjb25maWd1cmUgdGhlc2Ugc3lzdGVtcwotCWluIHRoZWlyIHhtIGZpbGVzLCBub3QgaW4gYSByYW5kb21seSBnZW5lcmF0ZWQgZmlsZS4KLQkqIGhvc3RzL2gtaHAzMDBic2QuaCwgaC10YWhvZS5oLCBoLXZheGJzZC5oLCBoLXZheHVsdC5oOgotCVNwZWNpZnkgYnl0ZSBvcmRlci4KLQkqIGhvc3RzL2gtdmF4YnNkLmg6ICBEZWZpbmUgdGhlIGZvcm0gb2YgZXhlYyBhbmQgY29yZSBmaWxlcy4KLQotVGh1IEphbiAzMCAxMzowMjo0MSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LXRhaG9lLCBjb25maWcvbXQtdmF4OiAgQ2hhbmdlIERFRkFVTFRfVkVDVE9SIHRvCi0JaG9zdF9hb3V0X3ZlYyBoZXJlIGFzIHdlbGwuCi0KLVRodSBKYW4gMzAgMTE6NDE6NDUgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdC1hb3V0LmM6ICBDaGFuZ2UgVEFSR0VUTkFNRSB0byAiYS5vdXQiIHRvIGJlIGNvbXBhdGlibGUgd2l0aAotCWdkYi4gIGNvbmZpZy9tdC1ocDMwMGJzZDogIENoYW5nZSBERUZBVUxUX1ZFQ1RPUiB0byBob3N0X2FvdXRfdmVjCi0JdG8gcHJldmVudCB1bmRlZmluZWQgc3ltYm9sLgotCi1UaHUgSmFuIDMwIDA3OjI2OjUzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JVmFyaW91cyBsaW50cyBmb3VuZCBvbiBQZXJzU29ueQotCSogYW91dHguaDogY2FzdCBhbiBlbnVtCi0JKiBjb2ZmLWEyOWsuYzogbWFueSBpbnRzIGluIHJlbG9jIHN0cnVjdHVyZSB0dXJuZWQgdG8gZW51bQotCSogY29mZmNvZGUuaDogbW9yZSBlbnVtcwotCSogY3B1LWg4MzAwLmM6IG1vcmUgZW51bXMKLQkqIG9wbmNscy5jOiBtb3JlIGVudW1zCi0KLVRodSBKYW4gMzAgMDE6MTk6NTYgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgVGFob2UgY29uZmlndXJhdGlvbiB3b3JrIGFnYWluLgotCSogYmZkLWluLmg6ICBSZW1vdmUgdHJhaWxpbmcgY29tbWEgZnJvbSBlbnVtIGRlY2xhcmF0aW9uLgotCSogaWVlZS5jOiAgQ2FuJ3QgcHV0IGJ5dGUgdmFsdWVzID4weDdGIGludG8gYSBzaWduZWQgY2hhci4KLQotVHVlIEphbiAyOCAyMToxMDo1MSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBZGQgZGVwZW5kZW5jaWVzIGZvciB2YXJpb3VzIGNvZmYtKi5vIGZpbGVzLgotCi0JKiBlbGYuYzogIFJlbW92ZSBleHRyYW5lb3VzIHBhcmVuIGZyb20gY29yZV9wcnBzaW5mbyBhbmQKLQljb3JlX3BycHN0YXR1cyBtYWNyb3MsIHJlbmFtZSBjb3JlX3BycHN0YXR1cyB0byBjb3JlX3Byc3RhdHVzLgotCVJlcGxhY2UgcmVmZXJlbmNlcyB0byBvbGQgc2VjdGlvbiAic2l6ZSIgbWVtYmVyIHdpdGggbmV3Ci0JIl9yYXdfc2l6ZSIgbWVtYmVyLiAgSW1wbGVtZW50IGVsZl9tYWtlX2VtcHR5X3N5bWJvbCwgd2hpY2gKLQlpcyBub3cgdXNlZC4KLQotVHVlIEphbiAyOCAxNDo1MTo0MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYywgYmZkLmMsIC4uL2luY2x1ZGUvYmZkLmg6ICBWYXJpb3VzIGZpeGVzIGZvciBQTUFYCi0JY29yZSByZWFkaW5nLgotCi1UdWUgSmFuIDI4IDEwOjQ2OjMyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9yZWxheF9zZWN0aW9uKTogbm93IHN0YXRpYy4KLQkoYmZkX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogdmFyaW91cyB0eXBlIGxpbnRzLgotCi1Nb24gSmFuIDI3IDE5OjQ0OjA4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JTmV3IGVudHJ5IHBvaW50IGluIHRoZSB0cmFuc2ZlciB2ZWN0b3IgLSBiZmRfcmVsYXhfc2VjdGlvbi4KLQotCSogYW91dC10YXJnZXQuaDogYWRkIHRvIHZlY3RvciwgY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiBiZmQtaW4uaDogYWRkIHRvIHZlY3RvcgotCSogYmZkLmM6IGFkZCAjZGVmaW5lIGZvciB2ZWN0b3IKLQkqIGJvdXQuYzogYWRkIHRvIHZlY3RvciwgY2FsbCBnZW5lcmljX3JlbGF4Ci0JKiBjb2ZmY29kZS5oOiBhZGQgdG8gdmVjdG9yLCBhbHNvIG5vdyBoYXMgY29mZiBzcGVjaWZpYyByZWxheCBjb2RlCi0JZm9yIHRoZSByZWxheGFibGUgSDgvMzAwIHJlbG9jcy4gQWxzbyBjbGVhbiB1cCBhYnMgc2VjdGlvbiBjcnVmdC4KLQkqIGVsZi5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIGllZWUuYzogY2FsbCBuZXcgdmVjdG9yLCBjbGVhbiB1cCBzb21lIGJ1Z3MgZHVlIHRvIHRoZSBjcmVhdGlvbgotCW9mIGJmZF9hYnNfc2VjdGlvbgotCSogbGliYmZkLmg6IGFkZCBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uIEVYRlVOCi0JKiBvYXN5cy5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIHJlbG9jLmM6IGltcGxlbWVudCBnZW5lcmljX3JlbGF4Ci0JKiBzZWNsZXQuYzogbW92ZWQgbXVjaCBvZiB0aGlzIGludG8gY29mZmNvZGUuaAotCSogc3JlYy5jOiBjYWxsIGdlbmVyaWNfcmVsYXgKLQkqIHRhcmdldHMuYzogZGVmaW5lIG5ldyB0cmFuc2ZlciB2ZWN0b3IKLQotRnJpIEphbiAyNCAxNDo0MDoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogZXZlcnl0aGluZzogbm93IG1vZGlmaWVkIHRvIHVzZSBzbWFsbGVyIHJlbG9jIHR5cGUuIFNlbGYgaG9zdHMKLQlvbiBzdW4zICYgc3VuNC4KLQotU2F0IEphbiAxOCAxNzowMDoxNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN0cmF0dXMsIGNvbmZpZy9tdC1pODYwLWVsZiwgaG9zdHMvaC1zdHJhdHVzOgotCU5ldyBmaWxlcyBmb3Igc3RyYXR1cy4KLQotCSogY29uZmlndXJlLmluOiAgQWRkIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnRzIGZvciBzdHJhdHVzLgotCi1XZWQgSmFuIDE1IDEwOjAyOjQzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogRGVjbGFyZSB2YXJpb3VzIGZpbGVuYW1lCi0JdmFyaWFibGVzIGFzIENPTlNUIHNpbmNlIHRoZXkgYXJlIHNldCB0byBwb2ludCB0byBhIGNvbnN0IGNoYXIKLQlzdHJpbmcuICBGaXhlcyBjb21waWxlciBjb21wbGFpbnRzLgotCi1GcmkgSmFuIDEwIDE3OjQ0OjUzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLWFtaXguaCBob3N0cy9oLWkzODZ2NC5oOiAgQ2hhbmdlIGFib3J0KCkgdG8gYSBmdW5jdGlvbgotCXJldHVybmluZyB2b2lkLgotCi1GcmkgSmFuIDEwIDE0OjMzOjMyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogIFJlY29nbml6ZSBOX1NPTAotCXN5bWJvbHMsIHNvIHRoYXQgd2UgY2FuIGVtaXQgdGhlIGNvcnJlY3QgZmlsZSBuYW1lIGV2ZW4KLQlpZiBpdCdzIGFuIGluY2x1ZGUgZmlsZS4KLQotVGh1IEphbiAgMiAxNjo0MzozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmM6ICBBZGQgQ09GRl9TV0FQX1RBQkxFIHRvIGxpdHRsZV92ZWMgYXMgd2VsbCBhcyBiaWdfdmVjLgotCShSZXBvcnRlZCBieSBqb2huQGxhYnRhbS5sYWJ0YW0ub3ouYXUgKEpvaG4gQ2FyZXkpKS4KLQotV2VkIEphbiAgMSAwNDoyMzowNiAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6ICBDaGFuZ2UgYWxsICcjaWYgSEFWRV9QUk9DRlMnIHRvICcjaWZkZWYgSEFWRV9QUk9DRlMnLgotCi0JKiBjb25maWcvbWgtYW1peCwgY29uZmlnL21oLWkzODZ2NDogIFJlbW92ZSBIREVGSU5FUyB0aGF0IHdhcwotCWJlaW5nIHVzZWQgdG8gLURIQVZFX1BST0NGUy4KLQotCSogaG9zdHMvaC1hbWl4LCBob3N0cy9oLWkzODZ2NDogIEFkZCAnI2RlZmluZSBIQVZFX1BST0NGUycuICBNb3ZlCi0JJyNpbmNsdWRlICJmb3Blbi1zYW1lLmgiJyB0byBlbmQgb2YgZmlsZSB0byBtYXRjaCBvdGhlciBoLSogZmlsZXMuCi0KLUZyaSBEZWMgMjAgMTI6MDY6MTcgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIENoYW5nZSBzdnI0IHJlZmVyZW5jZXMgdG8gc3lzdjQuICBBZGQgY2FzZQotCSJ1bmtub3duIiBmb3IgdGFyZ2V0IHZlbmRvciBhbmQgaW5mZXIgc29tZSB0YXJnZXRzIGJhc2VkCi0Jb24gdGhlIHNwZWNpZmllZCBvcGVyYXRpbmcgc3lzdGVtLgotCi1XZWQgRGVjIDE4IDE3OjE3OjU5IDE5OTEgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oLCBsaWJhb3V0Lmg6ICBBTlNJZnkgZW51bXMuCi0KLVdlZCBEZWMgMTggMTY6MTI6MjUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyY2hpdmUuYyAobm9ybWFsaXplKTogY3JlYXRlZCB2ZXJzaW9uIGZvciBWTVMgd2hpY2ggcmVtb3ZlcyB0aGUKLQlWTVMgZGlyZWN0b3J5IGNyYXAgZnJvbSB0aGUgZnJvbnQgYW5kIGVuZCBvZiBhIGZpbGVuYW1lLCBlZyB0dXJuCi0JWy0uZm9vXWJhci5vYmo7MTIzIGludG8gYmFyLm9iagotCShiZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBub3cgd3JpdGVzIGluZGV4IGludG8gYW4KLQlleHRlbmRlZCBuYW1lIHRhYmxlIGluIGRlY2ltYWwgLSB0aGUgc2FtZSBiYXNlIHVzZWQgdG8gcmVhZCBhbgotCWV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLVdlZCBEZWMgMTggMTQ6NDA6MzkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQtZW5jYXAuYzogIEZpeCB0byB1c2UgYW91dC10YXJnZXQuaC4KLQkqIGFvdXRmMS5oOiAgVXNlIHN0YW5kYXJkIE1ZX29iamVjdF9wIGFuZCBNWV9jYWxsYmFjawotCWluIGFvdXQtdGFyZ2V0LmguICBSZW1vdmUgdGFyZ2V0LXNwZWNpZmljIHZlcnNpb25zLgotCSogaG9zdC1hb3V0LmM6ICBSZS13cml0ZSB0byB1c2UgYW91dC10YXJnZXQuaC4KLQkqIGdlbi1hb3V0LmM6ICBOZXcgZmlsZXMgdXNlIHdpdGggaG9zdC1hb3V0LmMgdG8gZ2VuZXJhdGUKLQlob3N0LXNwZWNpZmljIGEub3V0LXJlbGF0ZWQgcGFyYW1ldGVycy4KLQkqIE1ha2VmaWxlLmluOiAgaG9zdC1hb3V0Lm8gZGVwZW5kcyBvbiBhb3V0LXBhcmFtcy5oLCB3aGljaCBpcwotCWdlbmVyYXRlZCBieSBnZW4tYW91dC4KLQkqIGFvdXQtdGFyZ2V0Lmg6ICBNYWtlIGEgbGl0dGxlIG1vcmUgZmxleGlibGUuCi0JKiBsaWJhb3V0LmgsIGFvdXQtdGFyZ2V0Lmg6ICBSZW1vdmVkIFdPUktfT1VUX0ZJTEVfUE9TVElPTlMKLQltYWNyby4gIEluc3RlYWQsIGlubGluZSBpdCBpbiBhb3V0LXRhcmdldC5oLgotCSogbmV3c29zMy5jOiAgRGVmaW5lIE5fU0hBUkVEX0xJQih4KSBhcyAwIHRvIGF2b2lkCi0JYSBnY2MgLVdhbGwgd2FybmluZy4KLQkqIGFyY2hpdmUuYzogIEFkZCBtaXNzaW5nIGNvbW1hcyBpbiBERUZVTiBtYWNybyAoMiBwbGFjZXMpLgotCSogZWxmLmMsIGNvZmZjb2RlLmgsIGFvdXRmMS5oOiAgVXNlIEFOU0kgZnVuY3Rpb25zIGluc3RlYWQgb2YKLQlCZXJrZWxleSBvbmVzLCBub3cgdGhhdCBsaWJpYmVydHkgaGFzIHRoZW06Ci0JYmNvcHktPm1lbWNweSwgYnplcm8tPm1lbXNldCwgYmNtcC0+bWVtY21wLgotCSogYW91dHguaDogIFZhcmlvdXMgdG91Y2gtdXBzOiAgUmUtZm9ybWF0dGluZywgZml4IGEgY2FzdCwKLQlyZW1vdmUgdW51c2VkIHZhcmlhYmxlLgotCi1UdWUgRGVjIDE3IDE5OjQ4OjU5IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYyAoZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCk6ICBFbmNsb3NlIGNvcmVuYW1lCi0JYW5kIGV4ZWNuYW1lIGluc2lkZSBIQVZFX1BST0NGUyBpZmRlZiBzaW5jZSB0aGV5IGFyZSB1bnVzZWQKLQl3aGVuIGl0IGlzIG5vdCBkZWZpbmVkLgotCi1Nb24gRGVjIDE2IDEyOjAwOjEwIDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBlbGYuYzogIEZsYWcgYWxsIHNlY3Rpb25zIGFzIGVpdGhlciBjb2RlIG9yIGRhdGEuICBXZSBjYW4ndAotCWJlIHN1cmUgd2hhdCB0aGV5IGFyZSBhbnl3YXksIHNpbmNlIEVMRiBkb2Vzbid0IGZpdCB0aGUKLQl0cmFkaXRpb25hbCBtb2RlbCBvZiB0ZXh0K2RhdGErYnNzIHZlcnkgd2VsbC4gIEFkZCBuZXcgbG9jYWwKLQlmdW5jdGlvbiBlbGZfcmVhZCgpIHRvIHNpbXBsaWZ5IGNvZGUuICBSZWNvcmQgZW50cnkgcG9pbnQgaW4KLQl0aGUgYmZkIHN0cnVjdHVyZS4KLQotVGh1IERlYyAxMiAyMTowMToyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC0qLmg6ICBDb25maWd1cmUgZm9wZW4gdXNpbmcgLi4vaW5jbHVkZS9mb3Blbi0qLmgKLQlyYXRoZXIgdGhhbiBOIGNvcGllcyBvZiB0aGUgc2FtZSBsaW5lcy4KLQotV2VkIERlYyAxMSAxNjozOTo0NSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY3B1LWg4MzAwLmM6IGRpc2Fzc2VtYmxlIGJyYW5jaCBkaXNwbGFjZW1lbnRzIGNvcnJlY3RseQotCSogY29mZi1oODMwMC5jOiBwdXQgcmVsb2Mgb2Zmc2V0cyBvdXQgaW4gMzJiaXRzCi0KLQkqIG1ha2VmaWxlLmRvcywgY29uZmlnZGouYmF0OiBOZXcgZmlsZXMgZnJvbSBESgotCSogY2FjaGUuYzogZm9wZW4gd2l0aCBuZXcgbWFjcm9zIGlzIG5lZWRlZCBmb3IgRE9TLgotCSogaWVlZS5jOiBlbnZpcm9uIHJlbmFtZWQgdG8gZW52aSB0byBzdG9wIGFuIGluY2x1ZGUgZmlsZQotCWNvbmZsaWN0LgotCSogb3BuY2xzLmMsIGNvZmYtcnM2MDAwLmM6IG1vcmUgZm9wZW5zIHdpdGggbWFjcm9zLgotCi1UdWUgRGVjIDEwIDA0OjA3OjI0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1TYXQgRGVjICA3IDE2OjM5OjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JICogTWFrZWZpbGUuaW46IGZpeCB3aGVyZSBkb2NkaXIgbGl2ZXMKLQotCSAqIGFvdXR4LmgsIGFyY2hpdmUuYywgYXJjaHVyZXMuYywgYmZkLmMsIGNhY2hlLmMsIGNvZmYtbTg4ay5jLAotCSBjb2ZmY29kZS5oLCBjb3JlLmMsIGN0b3IuYywgZWxmLmMsIGZvcm1hdC5jLCBpZWVlLmMsIGluaXQuYywKLQkgbGliYmZkLmMsIGxpYmJmZC5oLCBsaWJjb2ZmLmgsIG9wbmNscy5jLCByZWxvYy5jLCBzZWN0aW9uLmMsCi0JIHNyZWMuYywgc3ltcy5jLCB0YXJnZXRzLmMgOiBhbGwgbmV3IGRvY3VtZW50YXRpb24gYW5kIGxpbnQKLQkgcmVtb3ZhbC4KLQotCi1TYXQgRGVjICA3IDA3OjIyOjA5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oLCBzcmVjLmM6ICBMaW50LgotCi1GcmkgRGVjICA2IDIyOjU4OjQ4IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluc3RhbGwgdXNpbmcgSU5TVEFMTF9EQVRBLCBhZGRlZCBzdGFuZGFyZHMudGV4dAotCSAgc3VwcG9ydC4KLQotCSogY29uZmlndXJlLmluOiBtYXJrIGRpcmVjdG9yeSBhcyB0YXJnZXQgZGVwZW5kZW50LiAgY29uZmlndXJlCi0JICBub3dzIHdvcmtzIGluIG9iamRpciBhbHdheXMgc28gbWFrZSBmaWxlIGV4aXN0ZW5jZSBjaGVja3MKLQkgIGFnYWluc3QgJHtzcmNkaXJ9LgotCi1UaHUgRGVjICA1IDIyOjQ2OjE5IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGlkZXN0ZGlyIGFuZCBkZGVzdGRpciBnbyBhd2F5LiAgQWRkZWQgY29weXJpZ2h0cwotCSAgYW5kIHNoaWZ0IGdwbCB0byB2Mi4gIEFkZGVkIENoYW5nZUxvZyBpZiBpdCBkaWRuJ3QgZXhpc3QuIGRvY2RpcgotCSAgYW5kIG1hbmRpciBub3cga2V5ZWQgb2ZmIGRhdGFkaXIgYnkgZGVmYXVsdC4KLQotV2VkIERlYyAgNCAxMDoxNDoxNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKHN1bm9zXzxzaXplPl9vYmplY3RfcCwgc3Vub3M0X2NhbGxiYWNrKTogbW92ZWQgdGhlCi0JY29tcHV0YXRpb24gb2YgYXJjaCBhbmQgbWFjaGluZSB0eXBlIHNvIGl0J3Mgd29ya2VkIG91dCBiZWZvcmUKLQlzb21lX2FvdXRfb2JqZWN0X3AgaXMgY2FsbGVkLgotCSogYW91dHguaDogKHNvbWVfYW91dF9vYmplY3RfcCk6IGRvbid0IHNldCBhcmNoIGFuZCBtYWNoIHRvCi0JdW5rbm93bi4KLQkqIGFyY2h1cmVzLmM6IGFkZCBleHRyYSBmaWVsZCAnc2VjdGlvbl9hbGlnbl9wb3dlcicgdG8gaG9sZAotCWRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgaW4gb2JqZWN0IGZpbGVzLgotCSogY3B1LWEyOWsuYywgY3B1LWg4MzAwLmMsIGNwdS1pMzg2LmMsIGNwdS1pOTYwLmMsIGNwdS1tNjhrLmMsCi0JY3B1LW04OGsuYywgY3B1LW1pcHMuYywgY3B1LXJzNjAwMC5jLCBjcHUtc3BhcmMuYywgY3B1LXZheC5jOgotCWluaXRpYWxpemUgdGhlIG5ldyBmaWVsZC4KLQkqIGJvdXQuYyAoYl9vdXRfY2FsbGJhY2spOiByZXBsYWNlIHRoZSB0ZXh0IHNpemUsIHNpbmNlIGFvdXQKLQlmcmllcyB0aGVtLgotCSogYW91dHguaDogRG9jdW1lbnRhdGlvbiBpbiB0aGUgbmV3IHN0eWxlCi0KLVdlZCBEZWMgIDQgMDI6MDA6MzAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X210aW1lKTogIERvbid0IGNhY2hlIG10aW1lIGFueSBtb3JlOyBvbmx5Ci0JdXNlIHRoZSBzYXZlZCB2YWx1ZSBpZiBtdGltZV9zZXQgaXMgYWxyZWFkeSBzZXQgKGludGVuZGVkCi0JZm9yIGFyY2hpdmUgZmlsZXMsIHRob3VnaCBhcHBhcmVudGx5IG5vdCB1c2VkIHlldCkuCi0KLVR1ZSBEZWMgIDMgMjI6NTQ6NTAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogIFJldmlzZSBjb21tZW50cyBhYm91dCBob3cgdG8gY29uZmlndXJlIHRoZSB0YXJnZXQKLQl2ZWN0b3IsIHRvIG1hdGNoIHJlYWxpdHkuICBSZW1vdmUgbWVudGlvbiBvZiBvYnNvbGV0ZSBtZXRob2RzLgotCVJlbW92ZSBsb25nIGxpc3RzIG9mIGNhcGl0YWxpemVkIG1hY3JvcyB0aGF0IHR1cm4gaW50byB0aGUgc2FtZQotCXRoaW5nIGluIGxvd2VyY2FzZS4gIE5vcm1hbCB2ZWN0b3Igc2ltcGx5IGxpc3RzIGFsbCBrbm93bgotCWxvd2VyY2FzZSB4dmVjIG5hbWVzOyBhbGwgb3RoZXIgY2FzZXMgYXJlIGhhbmRsZWQgYnkgU0VMRUNUX1ZFQ1MuCi0KLQkqIGNvbmZpZy9tdC1pMzg2LWNvZmY6ICBTZXQgREVGQVVMVF9WRUNUT1IgdG8gcmVhbCBpZGVudGlmaWVyLAotCW5vdCBtYWNybyBuYW1lLgotCi0JKiBjb25maWcvbXQtaTk2MC17Y29mZixib3V0fTogIFVzZSBTRUxFQ1RfVkVDUyB0byBtYWtlIGEgc2hvcnQKLQlsaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXRzLgotCi1UdWUgRGVjICAzIDE0OjA2OjE1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6ICBUaGUgcGFkIGJ5dGUgc29tZXRpbWVzIGFkZGVkIHRvCi0JdGhlIHN0cmluZyB0YWJsZSBpbiBhIF9fLlNZTURFRiBtZW1iZXIgaXMgbm93Ci0JY291bnRlZCBhcyBwYXJ0IG9mIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcgdGFibGUuCi0JVGhpcyBpcyBjb21wYXRpYmxlIHdpdGggdGhlIG9sZCByYW5saWIsIGFzIHdlbGwgYXMgU3VuJ3MuCi0KLVR1ZSBEZWMgIDMgMTA6NTM6MzAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYzogUmV3cm90ZSB0byBmaXggbWFueSBidWdzOyBub3cgZ2V0cyB0aGUgcmVjb3JkIHR5cGUKLQlyaWdodCwgZG9lc24ndCBjaG9rZSBvbiBpbnB1dCwgc2V0cyB0aGUgc3RhcnQgYWRkcmVzcyBpbiBhbiBTOSBhbmQKLQlmaWxscyBpbiB0aGUgZmlsZW5hbWUgb24gYW4gUzAuCi0KLVNhdCBOb3YgMzAgMjE6MTk6MTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwdS1oODMwMC5jOiBBZGQgc3VwcG9ydCBmb3IgTUVNSU5EIGFkZHJlc3NpbmcgbW9kZQotCi0JKiBjb2ZmLWEyOWsuYzogZGVmaW5lZCBSRUxPQ19QUk9DRVNTSU5HIHRvIHRha2UgdGhlICNpZmRlZiBvdXQgb2YKLQljb2ZmY29kZS5oCi0JKiBjb2ZmY29kZS5oOiB1c2UgdGhlIG5ldyBtYWNybyBpZiBhdmFpbGFibGUKLQotCSogZWxmLmMgKGVsZl9jb3JlZmlsZV9ub3RlKTogY2FzdCBtYWxsb2MgdG8gYXZvaWQgd2FybmluZy4KLQkqIE1ha2VmaWxlLmluOiBGaXhlZCBkZXBlbmRlbmNpZXMgZHVlIHRvIGZpbGUgcmVuYW1lCi0KLQkqIGFvdXQtZW5jYXAuYywgYW91dGYxLmgsIGFvdXR4LmgsIGFyY2hpdmUuYywgYm91dC5jLCBjb2ZmLWEyOWsuYywKLQljb2ZmLWg4MzAwLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jLAotCWNvZmYtbWlwcy5jLCBjb2ZmLXJzNjAwMC5jLCBjcHUtaDMwMC5jLCBlbGYuYywgaTM4NmFvdXQuYywKLQluZXdvczMuYywgc3RhYi1zeW1zLmMsIHN5bXMuYzogQWxsIHRoZXNlIGZpbGVzIGhhdmUgaGFkIHRoZWlyCi0JI2luY2x1ZGVzIGFsdGVyZWQgdG8gcG9pbnQgdG8gdGhlIG5ldyBwbGFjZXMuCi0KLUZyaSBOb3YgMjkgMjA6MDQ6NDkgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1pMzg2djQsIGNvbmZpZy9taC1pMzg2LWVsZiwgaG9zdHMvaC1pMzg2djQuaDogIE5ldyBmaWxlcy4KLQotCSogY29uZmlndXJlLmluOiAgQWRkIHZlbmRvciAibmNyIiBhcyBzdXBwb3J0ZWQgcGVyLXRhcmdldCB2ZW5kb3IuCi0JQWRkIHN2cjQgY2FzZSBmb3IgaTM4NiBwZXItaG9zdCBjYXNlLgotCi0JKiBlbGYuYyAoZWxmX29iamVjdF9wLCBlbGZfY29yZV9maWxlX3ApOiAgQWRkIG1pc3NpbmcgImJyZWFrIiB0bwotCUVMRkRBVEEyTFNCIGNhc2VzLgotCi1GcmkgTm92IDI5IDEyOjE2OjUxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzeW1zLmMgKGJmZF9kZWNvZGVfc3ltY2xhc3MpOiAgUmV0dXJuICdBJwotCWZvciBzeW1ib2xzIHRoYXQgYXJlIGJvdGggYWJzb2x1dGUgYW5kIGdsb2JhbC4KLQkqIGFyY2hpdmUuYyAoYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUpOiAgUmV0dXJuIE5VTEwKLQlpZiBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSByZXR1cm5zIE5VTEwuCi0KLVR1ZSBOb3YgMjYgMDk6MTA6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNvZmYtaDgzMDAKLQkqIGNvbmZpZ3VyZS5pbjogbm93IGg4IGlzIGEgY29mZiB0YXJnZXQKLQkqIGNwdS1oODMwMC5jOiBmaXggdmFyaW91cyBkaXNhc3NlbWJseSBwcm9ibGVtcwotCSogbGliY29mZi5oOiB0b29rIG91dCBzb21lIGNvZGUgd2hpY2ggaGFzIGJlZW4gIzBlZCBmb3IgYSBsb25nCi0JdGltZS4KLQkqIHRhcmdldHMuYzogYWRkZWQgaDggY29mZgotCSogY29mZi1hMjlrLmMsIGNvZmYtaTM4Ni5jLCBjb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmYtbTg4ay5jCi0JYWRkZWQgbmV3IG1hY3JvIFJUWVBFMkhPV1RPIHRvIHRha2UgYSBsb2FkIG9mICNpZmRlZnMgb3V0IG9mCi0JY29mZmNvZGUuaAotCSogY29mZmNvZGUuaDogU3RhcnRlZCB0byBjaGFuZ2UgdGhlIHdheSBtYWNoaW5lIGRlcGVuZGVuY2llcyBhcmUKLQloYW5kbGVkLCBmcm9tIHRoZSBuZXN0IG9mICNpZmRlZnMgdG8gbWFjcm9zIGRlZmluZWQgaW4gdGhlCi0JaW5jbHVkaW5nIGNvZmYtPGZvbz4uYwotCi1GcmkgTm92IDIyIDA4OjExOjQyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChzb21lX2FvdXRfb2JqZWN0X3ApOiAgU2V0IHRoZSBgZXhlY3V0YWJsZScgYml0Ci0JaWYgdGhlIGVudHJ5IHBvaW50IGlzIGNvbnRhaW5lZCBpbiB0aGUgdGV4dCBzZWdtZW50LCBldmVuIGlmIHRoZQotCXRleHQgc2VnbWVudCBpcyBhdCBsb2NhdGlvbiAwLgotCi0JKiBjb2ZmLW1pcHMuYywgY29mZmNvZGUuaDogIFBldGVyIFNjaGF1ZXIncyBwYXRjaCB0byBrbHVkZ2UgaW4KLQlub25zdGFuZGFyZCBNSVBTIHNlY3Rpb25zICgucmRhdGEsIC5zZGF0YSwgZXRjKS4KLQotCSogYW91dHguaCwgYmZkLmMsIGNvZmZjb2RlLmgsIGllZWUuYywgb2FzeXMuYywgdGFyZ2V0cy5jOiBDT05TVCBsaW50LgotCSogbGliYmZkLWluLmgsIGxpYmJmZC5oLCBhb3V0eC5oLCBjb2ZmY29kZS5oLCBlbGYuYywgbGliYW91dC5oOgotCVJlbmFtZSBBTElHTiB0byBCRkRfQUxJR04gdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBCU0QgPHN5cy9wYXJhbS5oPi4KLQkqIGxpYmJmZC5jOiAgTGludC4KLQkqIGhvc3QtYW91dC5jLCB0cmFkLWNvcmUuYzogIEZpeCB3cml0ZV9hcm1hcCBwcm90b3R5cGVzLiAgTGludC4KLQotVGh1IE5vdiAyMSAxOTo1Njo0MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3RhYi1zeW1zLmMsIHN5bXMuYzogIE1vdmVkIGJmZF9zdGFiX25hbWUoKSBhbmQgYmZkX3N0YWJfbmFtZXNbXQotCWZyb20gc3ltcy5jIHRvIG5ldyBmaWxlIHN0YWItc3ltcy5jLiAgQWxzbywgc2luY2UgR05VIGV4dGVuZGVkCi0JdHlwZSBjb2RlcyBzdWNoIGFzIE5fU0VUVCBhcmUgbm8gbG9uZ2VyIGluIC4uL2luY2x1ZGUvc3RhYi5kZWYsCi0JaW5jbHVkZSB0aGVtIG1hbnVhbGx5LgotCSogc3RhYi1zeW1zLmMsIGFvdXR4Lmg6IFJlbmFtZWQgYmZkX3N0YWJfbmFtZSgpIGFuZAotCWJmZF9zdGFiX25hbWVzW10gdG8gYW91dF9zdGFiX25hbWUoKSBhbmQgYW91dF9zdGFiX25hbWVzW10uCi0JKiBsaWJhb3V0Lmg6IEFkZGVkIHByb3RvdHlwZSBmb3IgYW91dF9zdGFiX25hbWUoKS4KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIE1ha2VmaWxlIGZvciBuZXcgc3RhYi1zeW1zLltjb10uCi0KLVRodSBOb3YgMjEgMTE6NTA6NDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoV09SS19PVVRfRklMRV9QT1NJVElPTlMpOiAgT25lIG1vcmUgdHJ5IGF0IHRoaXMKLQlyYXRoZXIgY29tcGxpY2F0ZWQgc2VlbWluZyBwcm9ibGVtLiAgRWxpbWluYXRlIExPR0lDQUxfIHZlcnNpb25zLAotCWp1c3QgbWFrZSBOX1hYWCB3b3JrIGJ5IGV4Y2x1ZGluZyB0aGUgaGVhZGVyIGZyb20gdGhlIHRleHQgc2VnbWVudC4KLQkqIGFvdXR4Lmg6ICBGaXggY29tbWVudHMgdG8gbWF0Y2guCi0KLVR1ZSBOb3YgMTkgMTg6NDk6MDEgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoV09SS19PVVRfRklMRV9QT1NJVElPTlMpOiAgVXNlIG5ldyBMT0dJQ0FMX1RYVEFERFIsCi0JTE9HSUNBTF9UWFRPRkYsIExPR0lDQUxfVFhUU0laRSBtYWNyb3MgdG8gZmlndXJlIG91dCBudW1iZXJzCi0JZm9yIHRoZSAibG9naWNhbCIgdGV4dCBzZWdtZW50IChpLmUuIG5ldmVyIGNvbnNpZGVyIHRoZSBleGVjCi0JaGVhZGVyIHRvIGJlIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCkuICBUaGlzIGNoYW5nZSBpcwotCW5lZWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB2YXJpb3VzIG90aGVyIHBhcnRzIG9mIGJmZCBhbmQgbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29lX2FvdXRfb2JqZWN0X3ApKTogIEZpeCBjb21tZW50LAotCWFuZCBtb3ZlIGNhbGN1bGF0aW9uIG9mIG9ial90ZXh0c2VjKGFiZmQpLT5zaXplIHRvIGxpYmFvdXQuaC4KLQkqIGJmZC1pbi5oOiAgUmVtb3ZlZCBib2d1cyAnOycuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIE1JTklNSVpFIGZsYWcgdG8gc2VsZWN0IGxlYW4KLQlvciBibG9hdGVkIHRhcmdldF92ZWN0b3IuCi0JKiB0YXJnZXRzLmM6ICBVc2UgbmV3IE1JTklNSVpFIG1hY3JvLCBhbmQgYWRkIHRyYWRfY29yZSBpZiBuZWVkZWQuCi0JKiBuZXdzb3MzLmM6ICBGaXhlcyB0byAuLi9pbmNsdWRlL2FvdXQ2NC5oIHJlbW92ZSBuZWVkCi0JZm9yIHNwZWNpYWwgTl9UWFRPRkYgbWFjcm8sIGJ1dCByZXF1aXJlIE5fSEVBREVSX0lOX1RFWFQuCi0KLU1vbiBOb3YgMTggMTI6MDA6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmgsIGFvdXRmMS5oLCBuZXdzb3MzLmM6ICBNYWtlIGFvdXQtdGFyZ2V0LmgKLQloYW5kbGUgYm90aCBsaXR0bGUgYW5kIGJpZy1lbmRpYW4gdGFyZ2V0cywgd2l0aCBsaXR0bGUKLQl0aGUgZGVmYXVsdCB1bmxlc3MgVEFSR0VUX0lTX0JJR19FTkRJQU5fUCBpcyBkZWZpbmVkLgotCSogaG9zdC1hb3V0LmM6ICBBZGQgRklYTUUgbm90ZS4KLQotU3VuIE5vdiAxNyAxMzoyOTozOSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jOiAgTWFrZSB0aGUgZGVmYXVsdCB0YXJnZXRfdmVjdG9yIGNvbnRhaW4KLQlqdXN0ICZERUZBVUxUX1ZFQ1RPUi4gIFRoaXMgbWFrZXMgZXhlY3V0YWJsZXMgYSBsb3Qgc21hbGxlci4KLQlPbGQgYmVoYXZpb3IgY2FuIGJlIGdvdHRlbiBieSBkZWZpbmluZyBBTExfVEFSR0VUUy4KLQkqIGFvdXRmMS5oLCBkZW1vNjQuYywgaTM4NmFvdXQuYywgbmV3c29zMy5jLCBzdW5vcy5jOgotCUZhY3RvcmVkIG91dCBjb21tb24gY29kZSBpbnRvIG5ldyBmaWxlIGFvdXQtdGFyZ2V0LmguCi0JU2F2ZXMgYSBsb3Qgb2YgZHVwbGljYXRlIGNvZGUgZm9yIGEub3V0IHZhcmlhbnRzLgotCi1GcmkgTm92IDE1IDEzOjAwOjQzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JR2V0ICdtYWtlIGhlYWRlcnMnIHRvIHdvcmsgd2hlbiBjb25maWd1cmVkIHdpdGggK3N1YmRpcnMuCi0JKiBNYWtlZmlsZS5pbjogQWRkICQoc3ViZGlyKSB0byBkb2NkaXIgcGF0aC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAocHJvdG9zKTogQWRkICQoc3JjZGlyKSBwcmVmaXgKLQl0byBuYW1lIG9mIHNlZCBzY3JpcHRzLgotCi1UaHUgTm92IDE0IDE5OjQ5OjEwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6ICBGaXggdGhpbmtvLgotCSogc3ltcy5jIChiZmRfc3RhYl9uYW1lcyk6ICBUdXJuIG9uIG5ldyBHTlVfRVhUUkFfU1RBQlMgbWFjcm8KLQl0byBpbmNsdWRlIG5hbWVzIG9mIE5fU0VUVCBldGMuCi0KLVRodSBOb3YgMTQgMTk6MTE6MTMgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLSAgICAJKiBlbGYuYzogIEFkZCBtaW5pbWFsIHN1cHBvcnQgZm9yIEVMRiBzeW1ib2wgdGFibGVzLiAgR2VuZXJhdGVzCi0JY2Fub25pY2FsIGJmZCBzeW1ib2wgdGFibGVzIGZyb20gRUxGIHN5bWJvbCB0YWJsZXMuICBDaGFuZ2UgdGhlCi0JbmFtZSBvZiBzb21lIGZ1bmN0aW9ucyBmcm9tIGJmZF88bmFtZT4gdG8gZWxmXzxuYW1lPi4KLQotCSogc3ltcy5jOiAgVHJpdmlhbCBmaXggdG8gY29tbWVudCB0byByZW1vdmUgYSByZWR1bmRhbnQgInRvIi4KLQotV2VkIE5vdiAxMyAxNzowMjowMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi17aTM4NixtNjhrLG04OGt9LmM6ICBDaGFuZ2UgbmFtZSBvZiBmaWxlIGZvcm1hdCB0byBzdGFuZGFyZAotCWZvcm0gdGhhdCBHREIgcmVjb2duaXplcyBhcyBDT0ZGLgotCi1XZWQgTm92IDEzIDA5OjA5OjQxIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoaWVlZV9vYmplY3RfcCk6ICBjYXN0IE5VTEwgY29ycmVjdGx5LgotCSogY29uZmlndXJlLmluOiBhZGRlZCBoYXJyaXMgaG9zdAotCi0JKiBjb2ZmLWEyOWsuYzogTG90cyBvZiBjaGFuZ2VzLCBtb3N0IGZyb20gRGF2aWQgV29vZC4KLQotVHVlIE5vdiAxMiAwNzoyMTo0MSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29mZi1tODhrLmMgKGNvZmZfd3JpdGVfYXJtYXApOiAgSnVzdCAjdW5kZWYgaXQuCi0KLU1vbiBOb3YgMTEgMjA6MzA6MTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHN0YW5kYXJkaXplIG9uIE1JTlVTX0cgdG8gZGlzYWJsZSBkZWJ1Z2dpbmcKLQkqIGNvZmYtbTg4ay5jOiBjcmVhdGUgY29mZiBhcm1hcHMgaW5zdGVhZCBvZiBic2Qgb25lcy4KLQkqIG9wbmNscy5jIChiZmRfY2xvc2VfYWxsX2RvbmUpLCAoYmZkX2Nsb3NlKTogTWFzayBvdXQgcmFuZG9tIGJpdHMKLQl3aGVuIGNhbGxpbmcgY2htb2QuCi0KLU1vbiBOb3YgMTEgMTk6MDc6MzIgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiAgQWRkaXRpb25zIHRvIHN1cHBvcnQgRUxGIGZvcm1hdCBjb3JlIGZpbGVzLgotCSogY29uZmlnL21oLWFtaXg6ICBBZGQgLURIQVZFX1BST0NGUyB0byBIREVGSU5FUywgc2luY2UgaG9zdAotCWhhcyBzdXBwb3J0IGZvciAvcHJvYyAoYWxsIHRoZSBpbmNsdWRlIGZpbGVzIGluIHBhcnRpY3VsYXIpLgotCi1Nb24gTm92IDExIDE4OjM2OjQ3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogIEhhbmRsZSB0aGUgY2FzZQotCW9mIHR3byBOX1NPIHN0YWJzLCBvbmUgZm9yIGRpcmVjdG9yeSwgYW5kIG9uZSBmb3IgZmlsZW5hbWUuCi0KLQkqIGJmZC1pbi5oIChwcmludF92bWEpOiAgRmFjdG9yIG91dCBkdXBsaWNhdGUgZGVmaW5pdGlvbi4KLQotCUV4aXQgYSBsaXR0bGUgbW9yZSBncmFjZWZ1bGx5IHdoZW4gbWFsbG9jIHJldHVybnMgTlVMTC4KLQkqIGxpYmJmZC5jOiBOZXcgZnVuY3Rpb24gYmZkX3htYWxsb2MgKG1hbGxvYyB3cmFwcGVyKS4KLQkqIG9wbmNscy5jLCBzeW1zLmMsIGJvdXQuYywgYW91dHguaDogIFJlcGxhY2UgbWFsbG9jIGJ5IGJmZF94bWFsbG9jLgotCSogbGliYmZkLmg6IFJyZS1nZW5lcmF0ZWQgZHVlIHRvIGxpYmJmZC5jIHVwZGF0ZS4KLQotU2F0IE5vdiAgOSAxMzo0NTowMSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL210LW02OGstZWxmOiAgRGVmaW5lIERFRkFVTFRfVkVDVE9SIGFzIGVsZl9iaWdfdmVjLgotCi0JKiBlbGYuYyAoZWxmX29iamVjdF9wKTogIERvbid0IHRyeSB0byBjcmVhdGUgYSBiZmQgc2VjdGlvbiBmb3IKLQl0aGUgZmlyc3QgRUxGIHNlY3Rpb24gaGVhZGVyLiAgSXQgaXMganVzdCBhIHBsYWNlaG9sZGVyLgotCi1TYXQgTm92ICA5IDAzOjA0OjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5jLCBjb25maWcvbWgtcnM2MDAwOiAgTWFrZSBpdCB3b3JrIG9uIGFyY2hpdmUgYW5kCi0JY29yZSBmaWxlcywgd2hlbiBjb21waWxpbmcgbmF0aXZlLgotCSogaG9zdHMvaC1yczYwMDAuaDogIERlZmluZSBGQVNDSVNUX0ZET1BFTiBmb3IgYmZkX2Zkb3BlbnIuCi0KLQlGSVhNRTogIFRoZSBhb3V0ZjEuaCBjaGFuZ2UgYmVsb3cgbmVlZHMgdG8gYmUgcmV2ZXJzZWQgYmFjawotCXRvIHRoZSB3YXkgaXQgd2FzLgotCi1UaHUgTm92ICA3IDExOjAzOjU1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBEZWZpbmVkIG5ldyBtYWNyb3MgW1BVVHxHRVRdTElORU5PX0xOTk8gZm9yCi0JbWFuaXB1bGF0aW9uIG9mIGxubm8gZmllbGRzIGluIGxpbmVubyBzdHJ1Y3RzIGluIGEgY29mZi08Zj4uaAotCWluZGVwZW5kZW50IHdheS4gT3ZlcnJpZGUgaXQgaW4gY29mZi08Zj4uaCB0byB5b3VyIGZhdm91cml0ZQotCW51bWJlciBpZiB5b3UgZG9uJ3QgaGF2ZSBhIDE2Yml0IGxubm8gZmllbGQuIChjb2ZmX3N3YXBfbGluZW5vX2luKQotCShjb2ZmX3N3YXBfbGluZW5vX291dCk6IG1vZGlmaWVkIHRvIHVzZSB0aGUgbmV3IG1hY3Jvcy4KLQotTW9uIE5vdiAgNCAxMTozODozMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2NhbGxiYWNrKTogTm93IGRlZmF1bHRzIHRvIDY4MDIwIHJhdGhlciB0aGFuCi0JdW5rbm93biBhcmNoIHdoZW4gdGhlIG1hZ2ljIG51bWJlciBkb2Vzbid0IHNwZWNpZnkgdGhlCi0JYXJjaGl0ZWN0dXJlLCBzaW5jZSBzb21lIE9TcyAoZWcgb2xkIHN1bjNzKSBkb24ndCBzZXQgdGhlIG51bWJlciwgYW5kCi0JMDIwIGlzIHByb2JhYmx5IHRoZSByaWdodCBhbnN3ZXIgYW55d2F5LgotCi1TdW4gTm92ICAzIDEyOjA3OjA4IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBob3N0cy9oLW5ld3MuaCwgaG9zdHMvaC1ydGJzZC5oOgotCUdldCByaWQgb2YgTUlTU0lOR19WRlBSSU5URiwgc2luY2UgbGliaWJlcnR5IHByb3ZpZGVzIG9uZS4KLQkqIGJmZC1pbi5oIChiZmRfcHJpbnRfc3ltYm9sX3R5cGVfaG9wdyBlbnVtKTogICBBZGQgbmV3IG9wdGlvbgotCWJmZF9wcmludF9zeW1ib2xfbm0sIGZvciB1c2UgYnkgbm0uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQscHJpbnRfc3ltYm9sKSk6ICBBZGQgY29kZSBmb3IgbmV3Ci0JYmZkX3ByaW50X3N5bWJvbF9ubSBvcHRpb24sIHRvIHByaW50IGluIG5tIGZvcm1hdC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfcHJpbnRfc3ltYm9sKSwgaWVlZS5jIChpZWVlX3ByaW50X3N5bWJvbCkKLQlvYXN5cy5jIChvYXN5c19wcmludF9zeW1ib2wpOiAgUHJvdmlkZSBzdHViIGltcGxlbWVudGF0aW9ucwotCWZvciBiZmRfcHJpbnRfc3ltYm9sX25tLgotCSogc3ltcy5jOiAgTmV3IGZ1bmN0aW9uIGJmZF9kZWNvZGVfc3ltY2xhc3MsIHVzZWQgYnkgbm0gcHJpbnRlci4KLQlOZXcgZnVuY3Rpb24gYmZkX3N0YWJfbmFtZSB0byBsb29rIHVwIHN0cmluZyBuYW1lIG9mIHN0YWIgY29kZS4KLQotU2F0IE5vdiAgMiAxNDoyNjowMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBjdG9yLmMKLQkqIGFyY2h1cmVzLmMgKGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0KSBhZGRlZAotCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwLgotCSogY29mZmNvZGUuaDogcmVtb3ZlZCBhIGxvYWQgb2YgI2lmIDBlZCBjb2RlLgotCShjb2ZmX2NvbXB1dGVfZmlsZV9zZWN0aW9uX3Bvc2l0aW9ucyk6IG5vdyB3b3JrcyBvdXQgdGhlIHNlY3Rpb24KLQlhbGlnbm1lbnQgYW5kIHNpemUgY29ycmVjdGx5IGluIGFsbCBjYXNlcy4KLQkoY29mZl9nZXRfc3ltdGFiKTogbG9va3MgZm9yIGNvbnN0cnVjdG9yIHN5bWJvbHMgYW5kIGNhbGxzIHRoZQotCXJpZ2h0IGZ1bmN0aW9uIHdoZW4gdGhleSdyZSBmb3VuZC4gKGNvZmZfY2Fub25pY2FsaXplX3JlbG9jKToKLQlrbm93cyB3aGVuIGEgc2VjdGlvbiBpcyBmdWxsIG9mIGNvbnN0cnVjdG9ycyBhbmQgZG9lcyB0aGUgcmlnaHQKLQl0aGluZy4KLQkqIGNwdS1tODhrLmM6IEFkZGVkIGRlZmF1bHRfcmVsb2NfdHlwZSBsb29rdXAgdG8gdGhlIGFyY2hpdGVjdHVyZQotCWRlc2NyaXB0aW9uLgotCSogbGliYmZkLWluLmg6IChiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cCkgZGVmdW4gIGFkZGVkLgotCSogbGliY29mZi5oOiByZW1vdmVkICNpZiAwZWQgY29kZQotCSogcmVsb2MuYzogKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgYWRkZWQgQkZEX1JFTE9DX0NUT1IgZm9yCi0JYXJjaCBpbmRlcGVuZGVudCBjb25zdHJ1Y3RvciByZWxvY2F0aW9uIHR5cGUuCi0JKGJmZF9yZWxvY190eXBlX2xvb2t1cCk6IHJlbW92ZWQgdGhlIGNvbW1lbnQgInRoaXMgd2lsbCBnbyBhd2F5IgotCXNpbmNlIGl0IHdvbid0LiAoYmZkX2hvd3RvXzMyKTogc3RvbGVuIGZyb20gODhrLCB0aGlzIGlzIGEgMzJiaXQKLQlyZWxvYyB3aGljaCBpcyB1c2VkIHdoZW4gQkZEX1JFTE9DX0NUT1IgZmFsbHMgdGhyb3VnaCB0byBnaXZlIGEKLQlkZWZhdWx0IDMyYml0IHJlbG9jIGZvciBjb25zdHJ1Y3RvcnMuCi0JKGJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwKTogYWRkZWQuCi0JKiBhb3V0ZjEuaDogZml4ZWQgU0VHTUVOVF9TSVpFIHR5cG8uCi0KLVRodSBPY3QgMzEgMTg6MjM6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmM6ICBDaGFuZ2UgbmFtZSB0byAiYWl4Y29mZi1yczYwMDAiLCB0byBhdm9pZAotCW1hdGNoaW5nIHByZWZpeCAiY29mZiIuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfYXV4X291dCk6ICBIYW5kbGUKLQlycy82MDAwIGNzZWN0IHJlY29yZHMuCi0KLVN1biBPY3QgMjcgMTY6NTY6NTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLW04OGsuYywgdGFyZ2V0cy5jOiBjaGFuZ2UgbmFtZSBvZiBtODhrX2JjcyB0byBtODhrYmNzCi0JKiBjb25maWd1cmUuaW46IGFkZCBtb3Rvcm9sYSBkZWx0YTg4IGNhc2VzCi0JKiBsaWJiZmQuaCwgbGliYmZkLWluLmgsIGFyY2hpdmUuYywgaWVlZS5jLCBlbGYuYywgc3JlYy5jOiBmaXgKLQl3cml0ZV9hcm1hcCBwcm90b3R5cGUKLQkqIGxpYmJmZC5jOiBhZGQgZG9jIG9uIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50Ci0KLUZyaSBPY3QgMjUgMDI6NDg6MTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBDT0ZGLXJlbGF0ZWQgZmlsZXMgaW4gYGNvZmYtQVJDSC5jJyBmb3JtLgotCWNvZmYtYTI5ay5jLCBjb2ZmLWkzODYuYywgY29mZi1pOTYwLmMsIGNvZmYtbTY4ay5jLCBjb2ZmLW04OGsuYywKLQljb2ZmLW1pcHMuYywgY29mZi1yczYwMDAuYyB0byBiZSBleGFjdC4KLQotCSogTWFrZWZpbGUuaW46ICBPbmx5IHN1cHBseSBUQVJHRVRfREVGQVVMVFMgdG8gdGFyZ2V0cy5jLCByZWR1Y2luZwotCW1ha2Ugb3V0cHV0IGNsdXR0ZXIuCi0JKiBjb25maWcvbXQtKjogIERpdHRvLgotCi1UaHUgT2N0IDI0IDIyOjQwOjA3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JUlMvNjAwMCBzdXBwb3J0LCBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGj79G5nLVRo5W8gVvUsIGFuZAotCUpvaG4gR2lsbW9yZS4gIEFyY2hpdmUgc3VwcG9ydCBmcm9tIERhbW9uIEEuIFBlcm1lemVsLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBjcHUtcnM2MDAwLmMgYW5kIHJzNjAwMGNvZmYuYy4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCByczYwMDAgY2FzZS4KLQkqIHRhcmdldHMuYzogIEFkZCByczYwMDAgdmVjdG9yLgotCSogYXJjaHVyZXMuYzogIEFkZCByczYwMDAsIGZpeCBjb21tZW50IG9uIHJvbXAuCi0JKiBiZmQtaW4uaCAoZW51bSBiZmRfZXJyb3IpOiAgQWRkIG5vX2RlYnVnX3NlY3Rpb24gZXJyb3IuCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3RkYXRhKTogIFJlbW92ZSB1bnVzZWQgc3RyaW5nX3RhYmxlLgotCSogYmZkLmMgKGJmZF9lcnJtc2dzKTogIEFkZCBub19kZWJ1Z19zZWN0aW9uIGVycm9yIG1lc3NhZ2UuCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb24pOiAgUmV0dXJuIE5VTEwgb24gYXR0ZW1wdCB0byBjcmVhdGUKLQlhIHNlY3Rpb24gdHdpY2UuCi0JKiBjb2ZmY29kZS5oIChiZmRfc3dhcF9yZWxvY19pbik6ICBIYW5kbGUgcl90eXBlIGFuZCByX3NpemUuCi0JKGJmZF9zd2FwX2FvdXRoZHJfaW4pOiAgSGFuZGxlIGxvdHMgbW9yZSBtZW1iZXJzLgotCShtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiAgSWYgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHNlZW4sCi0JanVzdCByZXR1cm4gZmFsc2UgcmF0aGVyIHRoYW4gb3ZlcndyaXRpbmcgaXQuCi0JKGNvZmZfcmVhbF9vYmplY3RfcCk6ICBVbmRlcnN0YW5kIGluY29taW5nIG1hZ2ljIG51bWJlcnMuCi0JKGNvZmZfc2V0X2ZsYWdzKTogIFVuZGVyc3RhbmQgb3V0Z29pbmcgbWFnaWMgbnVtYmVycy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiAgb3V0Z29pbmcgYW91dGhkciBtYWdpYyAjLgotCShidWlsZF9kZWJ1Z19zZWN0aW9uKTogIEFkZCBmbiBmb3IgcmVhZGluZyBkZWJ1ZyBzdHJpbmcgc2VjdGlvbi4KLQkoZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogIEhhbmRsZSBzeW1ib2wgbmFtZXMgaW4gZGVidWcgc3RyaW5nIHNlY3Rpb24uCi0JUmVtb3ZlIHVudXNlZCBvYmpfc3RyaW5nX3RhYmxlLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBIYW5kbGUgcnM2MDAwLXNwZWNpZmljIHN0b3JhZ2UgY2xhc3Nlcy4KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MsIE5fU0VUKik6ICBDaGVjayBmb3IKLQlleGlzdGluZyBzZWN0aW9uIGJlZm9yZSBtYWtpbmcgb25lLgotCSogY3B1LXJzNjAwMC5jOiAgTmV3IGZpbGUuCi0JKiByczYwMDBjb2ZmLmM6ICBOZXcgZmlsZS4KLQotVGh1IE9jdCAyNCAwMjowMzoyNCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLmM6IEFkZCBwYXJ0aWFsIHN1cHBvcnQgZm9yIEVMRiBmb3JtYXQgY29yZWZpbGVzLiBTdGlsbCBuZWVkcwotCXN1cHBvcnQgZm9yIGV4dHJhY3RpbmcgcmVnaXN0ZXJzIGZyb20gY29yZWZpbGVzLgotCi0JKiBjb25maWcvdC1tNjhrLWVsZjogIFNldCBERUZBVUxUX1ZFQ1RPUiB0byBlbGZfYmlnX3ZlYy4KLQotCSogY29uZmlnL3toLWFtaXgsaC1kZ3V4LGgtaXJpeDMsaC11bHRyYTN9OiBGb3Igc3lzdGVtcyB3aGVyZQotCVJBTkxJQiBpcyBkZWZpbmVkIGFzIGVjaG8sIHNlbmQgdGhlIG91dHB1dCB0byAvZGV2L251bGwgdG8gaGVscAotCXJlZHVjZSBjbHV0dGVyIGluIHRoZSBvdXRwdXQgZnJvbSBkb2luZyBhIG1ha2UuCi0KLU1vbiBPY3QgMjEgMTc6NDg6NDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhvc3RzL2gtdmF4dWx0Lmg6ICBSZW1vdmUgbWFsbG9jL2ZyZWUgZGVjbHMgY292ZXJlZCBpbiBzdGRsaWIuaC4KLQlGaXggSE9TVF9QQUdFX1NJWkUgYW5kIEhPU1RfU0VHTUVOVF9TSVpFLiAgRnJvbSBEYXZpZCBUYXlsb3IuCi0KLU1vbiBPY3QgMjEgMDk6MzQ6MTEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBtYWtlIGl0IHBhZAotCXNlY3Rpb24gc2l6ZSBvdXQgaWYgdGhlcmUgYXJlIGFsaWdubWVudCByZXN0cmljdGlvbnMgc28gdGhhdCB0aGUKLQlpbWFnZSB3aWxsIGJlIG9rIG9uIGEgc3lzdGVtIHdoZXJlIHNlY3Rpb24gcG9zaXRpb25zIGFyZSB3b3JrZWQKLQlvdXQgYnkgYWNjdW11bGF0aW5nIHNpemVzIHJhdGhlciB0aGFuIGZyb20gdGhlIHNlY3Rpb24gaGVhZGVycy4KLQkqIHRhcmdldHMuYyAocHJvdG8gd3JpdGVfYXJtYXApLiBDaGFuZ2VkIG9ybF9jb3VudCB0byB1bnNpZ25lZC4KLQkqIG9wbmNscy5jIChiZmRfY2xvc2VfYWxsX2RvbmUpLiBBZGRlZCBzbyB0aGF0IGdlbmVyYXRpdmUKLQlwcm9ncmFtcyBsaWtlIGdhcyBjYW4gY2xvc2UgYSBiZmQgd2l0aG91dCBjYXVzaW5nIGJmZCBjb25mdXNpb24uCi0JKiBsaWJiZmQuaCAoY2hhbmdlZCBiZWN1YXNlIG9mIHByb3RvcykKLQkqIGFtZGNvZmYuYzogbWVzc2VkIHdpdGggdGhlIHdheSB0aGF0IGptcCBkaXNwbGFjZW1lbnRzIGFyZQotCWNhbGN1YWxhdGVkLiBUaGlzIG1heSBub3QgeWV0IGJlIHRvdGFsbHkgY29ycmVjdC4KLQkqIGFyY2hpdmUuYyAoY29mZl93cml0ZV9hcm1hcCk6IHJld3JvdGUgdGhlIHdheSB0aGF0IHJhbmxpYnMgYXJlCi0Jd3JpdHRlbiBvdXQuCi0JKiBjb2ZmY29kZS5oIChmaXh1cF9zeW1ib2xfdmFsdWUpOiBub3cgZG9lc24ndCBjb3JlIGR1bXAgaWYgYSBub24KLQlhYnMgc3ltYm9sIGhhcyBubyBzZWN0aW9uIChsaWtlIGEgcmVnaXN0ZXIgc3ltYm9sKS4KLQkoY29mZl93cml0ZV9zeW1ib2wpIG5vdyB6ZXJvcyBhdXhlbnQgYmVmb3JlIGZpbGxpbmcgaXQgdXAgdG8gaGVscAotCXdpdGggc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucy4KLQkqIGxpYmJmZC5jIChiZmRfd3JpdGVfYmlnZW5kaWFuXzRieXRlX2ludCk6IGFkZGVkLgotCi1XZWQgT2N0IDE2IDIyOjU4OjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuYzogIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYSBtYWNybyBzdHJlcnJvcigpLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIElmIEZBU0NJU1RfRkRPUEVOLCB1c2UgInIiLCBub3QgInIrIi4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6ICBTdXBwcmVzcwotCWF0dGVtcHQgdG8gcmVjb3ZlciBjb21tYW5kLCBpZmRlZiBOT19DT1JFX0NPTU1BTkQuCi0JKiBob3N0cy9oLXRhaG9lLmg6ICBBZGQgRkFTQ0lTVF9GRE9QRU4gYW5kIE5PX0NPUkVfQ09NTUFORDsKLQlyZXZhbXAgSE9TVF8qLCBldGMuCi0JKiBob3N0cy9oLWkzODZ2Lmg6ICBVc2UgPHV0aW1lLmg+LCBub3QgPHN5cy91dGltZS5oPiwgdW5saWtlIFBPU0lYLgotCi1XZWQgT2N0IDE2IDEyOjQzOjQ5IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcmdtYXApOiBUaGUgc2l6ZSBvZiB0aGUgcmFubGliIHN0cnVjdHVyZXMKLQlzaG91bGQgbm90IGluY2x1ZGUgdGhlIHNpemUgZmllbGQgaXRzZWxmLgotCSogYW91dHguaCwgbGliYW91dC5oIChOQU1FKGFvdXQsIHNpemVvZl9oZWFkZXJzKSk6ICBVc2UKLQlhZGF0YShhYmZkKS0+ZXhlY19ieXRlc19zaXplIGZpZWxkIGluc3RlYWQgb2YgY29uc3RhbnQgbWFjcm8sCi0JYmVjYXVzZSBhb3V0eC5oIGNvbXBpbGVzIHRvIGEgc2ltcGxlIC5vIGZpbGUgc2hhcmVkIGJ5Ci0JYWxsIDMyLWJpdHMgYS5vdXQgdGFyZ2V0cy4KLQotV2VkIE9jdCAxNiAxMToxMTowNSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWxsb3cgaTM4Ni1zY28tc3lzdi4KLQkqIGJvdXQuYzogIFJlbW92ZSB1bnVzZWQgaTk2MF9hbGlnbjsgbGludCBkdW1teSBjb3JlIGZpbGUgaGFuZGxlcnMuCi0JKiBjcHUtaDgzMDAuYzogIGxpbnQuCi0KLQkqIGhvc3QtYW91dC5jOiAgTmV3IHN0cmF0ZWd5LiAgV2UgdXNlIGNvbW1vbiBjb2RlLCBpbmNsdWRlIGZpbGVzLAotCWFuZCBkYXRhIHN0cnVjdHVyZXMgdG8gaGFuZGxlIHRoZSBmaWxlLCBidXQgc2V0IGEgZmV3IHBhcmFtZXRlcnMKLQlmcm9tIHRoZSBob3N0J3MgY29uZmlnIGZpbGUgKHBhZ2Ugc2l6ZSwgdGV4dCBzdGFydCBhZGRyLCBldGMpLgotCSogbGliYW91dC5oOiAgRGVmaW5lIEhQIEJTRCBtYWNoaW5lIHR5cGVzLgotCSogYW91dGYxLmg6ICBIYW5kbGUgcmVhZGluZyBhLm91dHMgd2l0aCB0aGVzZSB0eXBlcy4KLQotCSogdHJhZC1jb3JlLmM6ICBQYXNzIHRoZSB1LnVfYXIwIHZhbHVlIGFzIHRoZSBuZWdhdGl2ZSBvZiB0aGUKLQl2aXJ0dWFsLW1lbW9yeS1hZGRyZXNzIG9mIHRoZSAucmVnIHNlY3Rpb24uICBXZSBjYW4ndCBqdXN0IG1ha2UgYQotCXNlY3Rpb24gZm9yICJhbGwgdGhlIHJlZ3MgYW5kIG5vdGhpbmcgZWxzZSIgYmVjYXVzZSBvbmx5IEdEQiBrbm93cwotCWV4YWN0bHkgd2hlcmUgdGhlIHJlZ3MgYXJlIChzY2F0dGVyZWQgYXJvdW5kIHRoZSB1cGFnZSBhbmQgc3RhY2spLgotCUNsZWFuIHVwIG1lbW9yeSBhbGxvY2F0aW9uLiAgUmVtb3ZlIGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4KLQl2ZWN0b3JzLCByZXBsYWNlIHdpdGggc2luZ2xlIHZlY3RvcjsgdGhpcyBvbmx5IHJ1bnMgb24gdGhlIGhvc3QsCi0JaW4gaG9zdCBieXRlIG9yZGVyLiAgUmVwbGFjZSBieXRlc3dhcCByb3V0aW5lcyB3aXRoIGFib3J0cyBpbiBjYXNlCi0JYW55b25lIGNhbGxzIHRoZW0uCi0JKiB0YXJnZXRzLmM6ICBUaGVyZSdzIG9ubHkgb25lIHRyYWRfY29yZV92ZWMgbm93LgotCSogYW91dGYxLmggKHN1bm9zX2NvcmVfZmlsZV9wKTogIFZNQSBvZiAucmVnKiBub3cgbmVlZHMgdG8gYmUgMC4KLQotVHVlIE9jdCAxNSAwODoyOTowMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaC1hbWl4LmggKGZyZWUpOiAgRml4IHByb3RvdHlwZS4KLQotCSogYW91dHguaDogIERvbid0IHVzZSBOVUxMIGFzIGFuIGludGVnZXIsIGZvciBicmFpbmRlYWQgc3lzdGVtcwotCXRoYXQgZGVjbGFyZSBpdCBhcyAodm9pZCAqKTAuICAoRnJvbSBQZXRlciBTY2hhdWVyLikKLQotTW9uIE9jdCAxNCAxNzoyMDo0NyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogIEFkZCBwYXJlbnRoZXNlcyB0byBhdm9pZCByZXBvcnRlZAotCXByb2JsZW0gd2l0aCBiYWQgVWx0cml4IHN5c3RlbSBoZWFkZXJzLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6ICBUcnkgdG8gaGFuZGxlIHRoZQotCXZhcmlvdXMga2luZHMgb2YgYWxpZ25tZW50cyBmb3IgdGhlIHZhcmlvdXMga2luZHMgb2YKLQltYWdpYyBudW1iZXJzLgotCi1Nb24gT2N0IDE0IDE0OjIzOjEwIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGU6ICBEb24ndCBhc3N1bWUgLiBpcyBvbiB0aGUgcGF0aCAoZnJvbSBKYW1lcyBDbGFyaykuCi0KLUZyaSBPY3QgMTEgMjI6NDU6MTQgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVncy4KLQkqIHRhcmdldHMuYzogIERlY2xhcmUgdHJhZF9jb3JlIHZlY3RvcnMgZXh0ZXJuLgotCi1GcmkgT2N0IDExIDEzOjAzOjAyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiBNb3ZlZCBBTElHTiBtYWNybyB0byBsaWJiZmQuaC4gUmVtb3ZlZCBpOTYwX2FsaWduLgotCSogbGliYmZkLmg6IE1vdmVkIEFMSUdOIG1hY3JvIGhlcmUuCi0JKiBib3V0LmMgKGJfb3V0X2NhbGxiYWNrKTogUmVwbGFjZSBpOTYwX2FsaWduIGJ5IGFsaWduX3Bvd2VyLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6ICBBZGRlZCBmaWVsZHMgcGFnZV9zaXplLAotCXNlZ21lbnRfc2l6ZSBhbmQgZXhlY19ieXRlc19zaXplLiAgVGhlc2UgaGVscCBnZW5lcmljIGNvZGUKLQkoaW4gYW91dHguaCBhbmQgbGliYW91dC5oKSB0byBmaWd1cmUgb3V0IHdoZXJlIHRvIGFsaWduCi0JdGhlIHZhcmlvdXMgc2VnbWVudHMgaW4gYSBkZW1hbmQgcGFnZWQgZmlsZS4KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSKTogIFVzZSBuZXcgKHN0cnVjdCBhb3V0ZGF0YSkgZmllbGRzCi0JdG8gZGVjaWRlIGlmIHRoZSBleGVjIGhlYWRlciBjb3VudHMgaW4gYV90ZXh0ICh0ZXh0IHNlZ21lbnQgc2l6ZSkuCi0JQWxzbywgYXNzdW1lIERfUEFHRUQgZmxhZyBpcyBzZXQ7IGRvbid0IHNldCBpdCBoZXJlLgotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IEFkZCBpbml0aWFsaXphdGlvbiBvZgotCWFkYXRhIGZpZWxkcyBwYWdlX3NpemUsIHNlZ21lbnRfc2l6ZSwgYW5kIGV4ZWNfYnl0ZXNfc2l6ZS4KLQkqIGhvc3QtYW91dC5jIChOQU1FKGhvc3RfYW91dCwgY2FsbGJhY2spIGFuZAotCU5BTUUoaG9zdF9hb3V0LG1rb2JqZWN0KTogRGl0dG8uCi0JKiBpMzg2YW91dC5jIChhb3V0Mzg2X2NhbGxiYWNrKSBhbmQgbmV3IGFvdXQzODZfbWtvYmplY3QpOiBEaXR0by4KLQkqIG5ld29zMy5jIChuZXdzb3MzX2NhbGxiYWNrKSBhbmQgbmV3IG5ld3Nvc19ta29iamVjdCk6IERpdHRvLgotCSogYW91dGYxLmMgKHN1bm9zNF9jYWxsYmFjaykgYW5kIG5ldyBzdW5vc19ta29iamVjdCk6IERpdHRvLgotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBEb24ndCBzdWJ0cmFjdAotCUVYRUNfQllURVNfU0laRSBmcm9tIHRoZSBhX3Rlc3Qgc2l6ZTsgdGhpcyBpcyBvbmx5IGFwcHJvcHJpYXRlCi0JZm9yIHNvbWUgc3lzdGVtcyAobWFpbmx5IHN1bm9zKSwgc28gZG8gaXQgaW4gdGhlIGNhbGxiYWNrIGluc3RlYWQuCi0JU2FtZSByb3V0aW5lOiBBZGQgc3R1ZmYgdG8gdGhlIFRISVNfSVNfT05MWV9ET0NVTUVOVEFUSU9OIGNvbW1lbnQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgdGhlIHdheQotCWZpbGVwb3MgYW5kIHNpemUgb2Ygc2VjdGlvbnMgYXJlIGNhcnJpZWQgb3V0IHRvIHN1cHBvcnQKLQlvbGRlciBzdHlsZXMgb2YgZGVtYW5kIHBhZ2VkIGV4ZWN1dGFibGVzLgotCi0KLUZyaSBPY3QgMTEgMTI6MzM6MzYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQtaW4uaDogQWRkZWQgbW9yZSBtYWNyb3MgdG8gQ09GRl9TV0FQX1RBQkxFLgotCSogYmZkLmM6IEFkZGVkIG1hY3JvcyB0byBlbmFibGUgZ2FzIHRvIHN3YXAgY29mZiByZWNvcmRzLgotCSogY29mZmNvZGUuaDogTWFrZSB0aGUgY29mZl9zd2FwXypfb3V0IHJvdXRpbmVzIHJldHVybiB0aGUgbnVtYmVyCi0Jb2YgYnl0ZXMgc3dhcHBlZCwgYW5kIGNsZWFuZWQgdXAgdGhlaXIgcHJvdG90eXBlcy4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgZWJtb24vY29mZiBzdXBwb3J0Ci0JKiBlY29mZi5jOiBDaGFuZ2VkIG51bGwgZGVmaW5pdGlvbnMgb2YgY29mZl9zd2FwXypfb3V0IHRvIGNvbmZvcm0KLQl0byBuZXcgcHJvdG90eXBlcwotCSogdGFyZ2V0cy5jOiBBZGRlZCBuZXcgZW50cnkgcG9pbnRzIGZvciBjb2ZmIHN3YXBwaW5nCi0KLUZyaSBPY3QgMTEgMDM6MDE6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSZXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIHNjaGVtZSBmb3IgYmZkLCBiaW51dGlscywgbGQuCi0KLQkqIGluY2x1ZGUvc3lzL2gtKi5oOiAgTW92ZSB0byBiZmQvaG9zdHMvaC0qLmguCi0JKiBjb25maWd1cmUuaW46ICBSZXZpc2UgdG8gc3ltbGluayBzeXNkZXAuaCB0byBob3N0cy9oLXh4eC5oLgotCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgotCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCi0JZ2V0IGRlZmluZWQgZmlyc3QuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSAtSS4gdG8gZ2V0IHN5c2RlcC5oLiAgUmVtb3ZlIHJlZnMgdG8KLQkuLi9pbmNsdWRlL3N5c2RlcC5oLgotCSogY3B1LWk5NjAuYzogIFN0cm5jbXAgbmVlZGVkIGEgbGVuZ3RoIGFyZy4KLQkqIGVjb2ZmLmM6ICBEb24ndCBldmVyIGNhbGwgdHJhZF91bml4X2NvcmVfZmlsZV9wIGZyb20gaGVyZS4KLQkqIGkzODZhb3V0LmM6ICBSZW1vdmUgZGVhZCBOX1RYVE9GRiBvdmVycmlkZS4KLQkqIHRyYWQtY29yZS5jOiAgRG9uJ3QgZGlzYWJsZSB0aGUgd2hvbGUgZmlsZSBpZiBTVU40X1NZUy4KLQkqIGNvbmZpZy86ICBSZW5hbWUgc29tZSBjb25maWcgZmlsZXMgdG8gbWF0Y2ggdXAgaC0qLmggbmFtZXMuCi0JUmVtb3ZlIGFsbCB0aGUgSE9TVF9TWVMgZGVmaW5pdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGVzLgotCSogaG9zdHMvaC1hbWl4LmgsIGgtaTM4NnYuaDogIERlZmluZSBQT1NJWF9VVElNRSwgbm90IFVTRy4KLQkqIGhvc3RzL2gtaHA5MDAwLmg6ICBSZW1vdmUgVVNHIGNvbW1lbnQuCi0JKiBob3N0cy9oLXJzNjAwMC5oOiAgSW5jbHVkZSA8c3RkbGliLmg+IGZvciBtYWxsb2MuCi0JKiBob3N0cy9oLW5ld3MuaCwgaC1zcGFyYy02NC5oOiAgTmV3IGNvbmZpZyBmaWxlcyB0aGF0IGhhZAotCXByZXZpb3VzbHkgYmVlbiBrbHVkZ2VkIGluIHRoZSA8c3lzZGVwLmg+IGZpbGUuCi0KLVRodSBPY3QgMTAgMTc6NTQ6MDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy8qOiAgdHJhZC1jb3JlIHN1cHBvcnQgaXMgSE9TVCBkZXBlbmRlbnQsIG5vdCB0YXJnZXQKLQlkZXBlbmRlbnQuICBUYXJnZXQgY29uZmlnIGZpbGVzIG9ubHkgc2V0IERFRkFVTFRfVkVDVE9SIGFuZC9vcgotCW90aGVyIHZlY3RvciBlbGVtZW50cy4gIEV4Y2VwdGlvbjogIHdoZW4gaG9zdC1hb3V0LmMgaXMgaW4gdXNlLAotCWluIHdoaWNoIGNhc2Ugd2UncmUgZm9yY2VkIHRvIGFzc3VtZSB3ZSdyZSBuYXRpdmUgKGhwLCB2YXgsCi0JdGFob2UpLiAgUmVuYW1lIFhERVBGSUxFUyB0byBIREVQRklMRVMuCi0JKiBNYWtlZmlsZS5pbjogIFJlbmFtZSBYREVQRklMRVMuCi0JKiBjb25maWcvaC1zdW4qOiAgRG9uJ3QgZm9yY2Ugc3RhdGljIGxpbmtpbmcuCi0JKiB0cmFkLWNvcmUuYzogIERvY3VtZW50IGhvdyB0byB1c2UgaXQgbm93YWRheXMuCi0JKiBpMzg2YW91dC5jLCBuZXdzb3MzLmM6ICBDbGVhbiB1cC4KLQkqIGkzODZjb2ZmLmM6ICBBbGxvdyAzODYgY29mZiBmaWxlcyB0byBiZSB1c2VkIGFzIGNvcmUgZmlsZXMgdG9vCi0JKGZvciByZWFkaW5nIGNvcmUgZmlsZXMgZnJvbSBlbWJlZGRlZCBzeXN0ZW1zKS4KLQotVHVlIE9jdCAgOCAxNTozMDozOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogQWRkIGkzODZhb3V0LmMgZm9yIGEub3V0IHN1cHBvcnQgb24gdGhlIGkzODYuCi0KLVR1ZSBPY3QgIDggMTI6MTg6NTQgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYywgc2VjdGlvbi5jLCBzeW1zLmMsIHRhcmdldHMuYzogY29ycmVjdCBpbmZvLW5vZGUKLQlzdHJ1Y3R1cmUgaW4gKmRvYyogY29tbWVudHMuCi0JZG9jL01ha2VmaWxlOiBzdG9wIGhpZGluZyBjb21wbGFpbnRzIGZyb20gbWFrZWluZm8uCi0KLVN1biBPY3QgIDYgMTk6MTA6MDYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKC4uLnNvbWVfYW91dF9vYmplY3RfcCk6ICBUYWtlIGEgdGhpcmQgcGFyYW1ldGVyLAotCXRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdCwgYW5kIGF2b2lkIGV2ZXIgbG9va2luZyBhdCBhbgotCWV4dGVybmFsX2V4ZWMuICBBbGwgY2FsbGVycyBjaGFuZ2VkIHRvIHJlYWQgdGhlIGVudGlyZQotCWV4dGVybmFsX2V4ZWMgc3RydWN0LCBzd2FwIGFuZCBjaGVjayBpdHMgbWFnaWMgbnVtYmVyLAotCXN3YXAgaW4gdGhlIHdob2xlIHN0cnVjdHVyZSwgYW5kIHBhc3MgdGhlIHN3YXBwZWQtaW4gdmVyc2lvbiB0bwotCXNvbWVfYW91dF9vYmplY3RfcC4KLQkqIGJvdXQuYzogIEJyaW5nIGludG8gbW9kZXJuIGVyYS4gIFVzZSBzaW5nbGUgX29iamVjdF9wIHJvdXRpbmUKLQlmb3IgYmlnLSBhYW5kIGxpdHRsZS1lbmRpYW4uICBQcm92aWRlIGludGVybmFsIGFuZCBleHRlcm5hbAotCWV4ZWMgaGVhZGVyIHN0cnVjdHMuICBVc2Ugc2VwYXJhdGUgc3dhcC1pbiBhbmQgc3dhcC1vdXQgcm91dGluZXMuCi0KLQkqIGxpYmFvdXQuaDogIE1vdmUgc3RydWN0IGludGVybmFsX2V4ZWMgZnJvbSAuLi9pbmNsdWRlL2FvdXQ2NC5oCi0JdG8gaGVyZS4gIEFkZCBvYmpfc3ltYm9sX2VudHJ5X3NpemUgdG8gc3RydWN0IGFvdXRkYXRhLgotCSogYW91dHguaCAoLi4uc29tZV9hb3V0X29iamVjdF9wKTogIFNldCBvYmpfc3ltYm9sX2VudHJ5X3NpemUuCi0KLQkqIC4uL2luY2x1ZGUvYW91dDY0Lmg6ICBDaGFuZ2UgRVhURVJOQUxfTElTVF9TSVpFIHRvCi0JRVhURVJOQUxfTkxJU1RfU0laRS4gIENhbGxlcnMgY2hhbmdlZC4KLQotRnJpIE9jdCAgNCAxODoxODo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmM6ICBSZW1vdmUgc3RyZXJyb3IoKSB0byBsaWJpYmVydHkuCi0KLQkqIGVsZi5jOiAgUmVtb3ZlIGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cywgdXNlIGdlbmVyaWMgb25lLiAgTGludC4KLQkqIGxpYmJmZC1pbi5oLCBsaWJiZmQuYzogIEFkZCBiZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cy4KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY197Z2V0LHNldH1fc2VjdGlvbl9jb250ZW50cyk6ICBDaGVjayB0aGF0Ci0JbGFzdCBieXRlIG9mIHRyYW5zZmVyLCBub3QgZmlyc3QgYnl0ZSwgaXMgd2l0aGluIHRoZSBzZWN0aW9uLgotCi0JKiBob3N0LWFvdXQuYzogIFJlbW92ZSBgQlNEJyBhcmNoaXZlIHN1cHBvcnQuICBMaW50LgotCi0JKiBhcmNodXJlcy5jOiBSZW5hbWUgYHN0cnVjdCBiZmRfYXJjaF9pbmZvX3N0cnVjdCcgdG8gYHN0cnVjdAotCWJmZF9hcmNoX2luZm8nLiAgUmVuYW1lIGB0eXBlZGVmIGJmZF9hcmNoX2luZm9fc3RydWN0X3R5cGUnIHRvCi0JYGJmZF9hcmNoX2luZm9fdHlwZScuICBBbGwgdXNlcyBjaGFuZ2VkLgotCSogcmVsb2MuYzogIFJlbmFtZSBgYmZkX3JlbG9jX3N0YXR1c19lbnVtX3R5cGUnIHRvCi0JYGJmZF9yZWxvY19zdGF0dXNfdHlwZScuICBSZW5hbWUgYGJmZF9yZWxvY19jb2RlX2VudW1fcmVhbF90eXBlJwotCXRvIGBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUnLiAgKFRoaXMgc2VlbXMgdG8gYmUgYSBtaXNub21lciwKLQlpdCBuZWVkcyBhIGJldHRlciBuYW1lLikgIEFsbCB1c2VzIGNoYW5nZWQuCi0JKiB0YXJnZXRzLmM6ICBSZW5hbWUgYGVudW0gdGFyZ2V0X2ZsYXZvdXJfZW51bScgdG8gYGVudW0KLQl0YXJnZXRfZmxhdm91cicsIGFuZCByZW1vdmUgdGhlIGBfZW51bScgZnJvbSBhbGwgb2YgdGhlIGVudW0KLQl2YWx1ZXMgdGhlbXNlbHZlcy4gIEFsbCB1c2VzIGNoYW5nZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL2gtaTM4Nm1hY2g6ICBpMzg2IG1hY2ggaG9zdC4KLQkqIGNvbmZpZy90LWkzODYtYW91dDogIFVzZSBob3N0LWFvdXQuYy4KLQotCSogdHJhZC1jb3JlLmM6ICBHaXZlIGl0IGl0cyBvd24geHZlYydzIHRvIG1ha2UgaXQgaW5kZXBlbmRlbnQKLQlvZiBvdGhlciBmaWxlIGZvcm1hdHMuCi0JKiBlY29mZi5jLCBob3N0LWFvdXQuYzogIFJlbW92ZSByZWZzIHRvIHRyYWQtY29yZS4KLQkqIGNvbmZpZy90LWRlYzMxMDAsIHQtaHAzMDBic2QsIHQtdGFob2UsIHQtdmF4OiAgRGVmaW5lIFRSQURfQ09SRS4KLQkqIHRhcmdldHMuYzogICNpZmRlZiBUUkFEX0NPUkUsIGluY2x1ZGUgaXQgaW4gdGhlIHZlY3Rvci4KLQotRnJpIE9jdCAgNCAxNzozODowMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmM6IEV4dGVuZGVkIE5FV0hPV1RPIG1hY3JvCi0JKiBpZWVlLmM6IENoYW5nZWQgdGhlIHdheSA4Yml0IHBjcmVsIGlzIGRvbmUKLQkqIGNwdS1oODMwMC5jOiBnb3QgdGhlIHJlZ2lzdGVycyBpbiB0aGUgcmlnaHQgb3JkZXIKLQotVGh1IE9jdCAgMyAxOTozOTo1NSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmg6ICBlbnVtIGJvb2xlYW4gPT4gZW51bSBiZmRfYm9vbGVhbiBmb3IgU1ZSNC4gIEd1bWJ5J3MKLQlwcmVkaWN0aW9uIGlzIHZpbmRpY2F0ZWQhCi0KLQkqIGJmZC1pbi5oLCBsaWJiZmQtaW4uaCwgZG9jL01ha2VmaWxlLCBkb2MvdG9saWJiZmQsIGRvYy9pbnRvYmZkOgotCVJlbW92ZSByZWZzIHRvIGhvd3RvLmMsIHNpbmNlIFN0ZXZlIGZvcmdvdC4KLQotVGh1IE9jdCAgMyAwNzo0OToyMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi5jOiB0b29rIHRoZSBhYm9ydCBvdXQgb2Ygc2V0X2FyY2hfbWFjaCBzbyB0aGF0IG9iamR1bXAgLWkgd2lsbAotCXN0aWxsIHdvcmsuIE5vdyBhbGxvd3MgYW55IGFyY2hpdGVjdHVyZS9tYWNoaW5lIHRvIGJlIHNldC4KLQotV2VkIE9jdCAgMiAxMzo1MDozNSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGhvd3RvLmMgZGVsZXRlZCBhbmQgbW92ZWQgY29kZSB0byByZWxvYy5jCi0KLQkqIGxpYmJmZC5oLCBsaWJiZmQtaW4uaCByZW1vdmVkICRpZCBzdHVmZiBmb3IgcmVhbAotCi0JKiBjcHUtaDgzMDAuYyBNYWRlIGl0IG1hdGNoIHZhcmlvdXMgZGlmZmVyZW50IHNwZWxsaW5ncyBvZiBoODMwMC4KLQotCSogYXJjaHVyZXMuYzogVG9vayBvdXQgdGhlIGZpcnN0IGNoYXIgZmlsdGVyIHdoaWNoIG1hZGUgaXQgb25seQotCWxvb2sgZm9yIGEgY3B1L2FyY2ggbWF0Y2ggd2hlbiB0aGUgZmlyc3QgY2hhcnMgb2Ygc3VwcGxpZWQgYW5kCi0JdGVzdGVkIG5hbWVzIHdlcmUgdGhlIHNhbWUuCi0KLQkqIHRhcmdldHMuYyByZW1vdmVkIG9hc3lzIHN0dWZmLCBwZW5kaW5nIHNvbWVvbmUgdG8gZml4IHRoZSBidWdzCi0JaW4gaXQuCi0KLQotVHVlIE9jdCAgMSAxMjoyOTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgdGFyZ2V0cy5jLCBlbGYuYzogIEFkZCBwcmVsaW1pbmFyeQotCUVMRiBzdXBwb3J0IGdvb2QgZW5vdWdoIGZvciBHREIuCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9oLWFtaXgsIGNvbmZpZy90LW02OGstZWxmOiAgSGFuZGxlCi0JbTY4ay1jYm0tc3ZyNCBob3N0IGFuZCB0YXJnZXQuCi0JKiBjb25maWcvdC1tNjhrLWNvZmYsIHQtbTg4ay1jb2ZmLCB0LW04OGstYW91dDogIE1ha2UgZmlsZXMgbm9uZW1wdHkKLQlzbyBgZGlmZicgYW5kIGBwYXRjaCcgY2FuIGNvcGUuCi0KLVR1ZSBPY3QgIDEgMTE6MjQ6MzEgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jOiByZW1vdmVkIHRleGluZm8gZXJyb3IKLQotCSogaW5pdC5jOiBhZGRlZCB0ZXhpbmZvIGhvb2tzLCBhbmQgcmVtb3ZlZCBpbml0aWFsaXphdGlvbiBlcnJvcgotCW1lc3NhZ2UuCi0KLQkqIGxpYmNvZmYtaW4uaCwgbGliYmZkLWluLmggcmVtb3ZlZCAkaWQgZmllbGQgc28gY3ZzIGNhbiBtZXJnZQotCXdpdGhvdXQgY29tcGxhaW50cy4KLQotVHVlIE9jdCAgMSAwNTowMjo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY3B1LWk5NjAuYzogIEF2b2lkIG51bWVyaWNhbCBjb3VudCBvZiBpbml0aWFsaXplcnMuCi0KLQlWYXggVWx0cml4IGNoYW5nZXMgZnJvbSBEYXZpZCBUYXlsb3IgPHRheWxvckB0aGluay5jb20+OgotCSogaG9zdC1hb3V0LmM6ICBNYWtlIGxpdHRsZS1lbmRpYW4gdmVjdG9yIHJlYWxseSBsaXR0bGUtZW5kaWFuLgotCSogY29uZmlndXJlLmluOiAgU2VwYXJhdGUgdmF4IGFuZCB0YWhvZSBjYXNlcywgaGFuZGxlIHVsdHJpeC4KLQkqIGNvbmZpZy90LXZheDogIEFkZCB0cmFkLWNvcmUuby4KLQkqIGNvbmZpZy9oLXZheHVsdDogIE5ldyBob3N0IHN5c3RlbS4KLQotTW9uIFNlcCAzMCAxNToxMzo0NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC1pbi5oIFZFUlNJT04sIGNoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAwLjE4LCB0aGlzIG1ha2VzIGEKLQlnYXAsIGJ1dCBub3cgaXMgdGhlIHNhbWUgYXMgdGhlIGxpbmtlciB2ZXJzaW9uIG51bWJlci4KLQotCSogY3B1LWEyOWsuYywgY3B1LWkzODYuYywgY3B1LW02OGsuYywgY3B1LW1pcHMuYywgY3B1LXZheC5jLAotCWNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLCBjcHUtbTg4ay5jLCBjcHUtc3BhcmMuYzogYWRkZWQuIFRoZXNlCi0JZmlsZXMgd2lsbCBldmVudHVhbGx5IGNvbnRhaW4gcHJvY2Vzc29yIHNwZWNpZmljIGJpdHMgZm9yIGJmZCwKLQlsaWtlIHN0cmFuZ2UgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGlzL2Fzc2VtYmx5LiAgU28gZmFyIG9ubHkKLQl0aGUgSDggaGFzIGJlZW4gZXZlbiBwYXJ0aWFsbHkgZG9uZS4gIFRoaXMgd29yayBhbHNvIHRpZXMgaW4gd2l0aAotCXRoZSBjaGFuZ2UgaW4gaGFuZGxpbmcgYXJjaGl0ZWN0dXJlcy4KLQotCSogYW1kY29mZi5jOiAoYTI5a19yZWxvYykgZml4IGVycm9yIG1lc3NhZ2UuCi0KLQkqIGFvdXQtZjEuaDogKGNob29zZV9yZWxvY19zaXplKSBub3cgY2FsbHMgYmZkX2dldF9hcmNoIHRvCi0JZGlzY292ZXIgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgYmZkLiAoc3Vub3M0X2NhbGxiYWNrKSBjYWxscyB0aGUKLQlmdW5jdGlvbiBiZmRfc2V0X2FyY2hfbWFjaCByYXRoZXIgdGhhbiBzdHVmZmluZyBzdHVmZiBkaXJlY3RseQotCWludG8gdGhlIGJmZC4gKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpLCBjaGFuZ2VkIG5hbWVzIG9mCi0JYWNjZXNzb3IgZnVuY3Rpb25zLgotCi0JKiBhb3V0eC5oOiAoc2V0X2FyY2hfbWFjaCkgbm93IGNhbGxzIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggdG8KLQlzZXR1cCB0aGUgZW52aXJvbm1lbnQuCi0KLQkqIGFyY2hpdmUuYzogKGJmZF9zbHVycF9jb2ZmX2FybWFwKSBjb2ZmIGFyY2hpdmVzIGFsd2F5cyBoYXZlIHRoZQotCWhlYWRlcnMgaW4gYmlnIGVuZGlhbiBmb3JtYXQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGVuZGlhbmVzcyBvZiB0aGUKLQlob3N0IG9yIHRhcmdldC4KLQotCSogYXJjaHVyZXMuYzogdG90YWxseSBjaGFuZ2VkLiBOb3cgYW4gYXJjaGl0ZWN0dXJlIGlzIHJlcHJlc2VudGVkCi0Jd2l0aCBhIHBvaW50ZXIgdG8gYW4gaW5mbyBzdHJ1Y3R1cmUgcmF0aGVyIHRoYW4gYW4gZW51bWVyYXRlZCB0eXBlCi0JYW5kIGEgbG9uZy4gVGhlIG9sZCBpbmZvIGlzIGF2YWlsYWJsZSBhcyB0d28gZWxlbWVudHMgaW4gdGhlCi0Jc3RydWN0dXJlLiAgRnV0dXJlIGVuaGFuY2VtZW50cyB0byBhcmNoaXRlY3VyZSBzdXBwb3J0IHdpbGwKLQlpbnZvbHZlIHBvaW50ZXJzIHRvIG1ldGhvZHMgYmVpbmcgcGxhY2VkIGludG8gdGhlIGluZm8gc3RydWN0dXJlLgotCi0JKiBiZmQuYzogY2hhbmdlZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYmZkIHN0cnVjdHVyZSBmb3IgdGhlIG5ldwotCWFyY2hpdGVjdHVyZSBzdHVmZi4KLQotCSogYm91dC5jOiAoYl9vdXRfc2V0X2FyY2hfbWFjaCkgY2hhbmdlZCB0byB1c2UgdGhlIG5ldwotCWFyY2hpdGVjdHVyZSBtZWNoYW5pc20uCi0KLQkqIGNvZmZjb2RlLmg6IChjb2ZmX3NldF9hcmNoX21hY2gsIGNvZmZfc2V0X2ZsYWdzKSBjaGFuZ2VkIHRvIHVzZQotCXRoZSBuZXcgYXJjaGl0ZWN0dXJlIG1lY2hhbmlzbS4KLQotCSogY29uZmlndXJlLmluOiBhZGRlZCBoOCBzdHVmZi4KLQotCSogaWVlZS5jOiB0b28gbWFueSBjaGFuZ2VzIHRvIG5vdGUuICBOb3cgaWVlZSBmaWxlcyB3cml0dGVuIHdpdGgKLQliZmQgZ2FzIGFuZCBsZCBjYW4gYmUgcmVhZCBieSBnbGQgYW5kIGllZWUgb25seSBsaW5rZXJzIGFuZAotCXNpbXVsYXRvcnMuCi0KLQkqIGxpYmJmZC5jLCBsaWJiZmQuaDogY2hhbmdlZCBwcm90b3R5cGUgb2YgYmZkX3dyaXRlLgotCi0JKiBuZXdzb3MzLmM6IChuZXdvczNfY2FsbGJhY2spIG5vdyBjYWxscyBiZmRfc2V0X2FyY2hfbWFjaCByYXRoZXIKLQl0aGFuIGZpeGluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5LgotCi0JKiBvYXN5cy5jOiAob2FzeXNfb2JqZWN0X3ApIG5vdyBjYWxscyBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIHJhdGhlcgotCXRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0KLQkqIG9wbmNscy5jOiAobmV3X2JmZCkgbWFrZXMgc3VyZSB0aGF0IGJmZF9pbml0IGhhcyBiZWVuIGNhbGxlZAotCWJlZm9yZSBvcGVuaW5nIGEgYmZkLgotCi0JKiBzcmVjLmM6IChzcmVjX3NldF9hcmNoX21hY2gpIG5vdyBjYWxscyBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0JcmF0aGVyIHRoYW4gZml4aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuCi0KLQkqIHRhcmdldHMuYzogKHRhcmdldF92ZWN0b3IpIG5vdyBieSBkZWZpbmluZyBTRUxFQ1RfVkVDUyAocGVyaGFwcwotCWluIHRoZSB0L2htYWtlIGZpbGUpIGEgdXNlciBjYW4gc2VsZWN0IHdoaWNoIGJhY2tlbmRzIHRoZXkgd2FudAotCWxpbmtlZCB3aXRoIGJmZCB3aXRob3V0IGNoYW5naW5nIHRoZSBzb3VyY2UuCi0KLQkqIGluaXQuYzogbmV3LCBsb29rcyBhZnRlciBpbml0aWFsaXppbmcgbW9kdWxlcy4KLQotCSogaG93dG8uYzogZm9yIGZ1dHVyZSB1c2UsIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gd29yayBvdXQKLQl3aGF0IGNvb2tpZSB0byB1c2UgYXMgYSBoYW5kbGUgb24gYSByZWxjb2F0aW8gaG93dG8uCi0KLU1vbiBTZXAgMzAgMTM6MzE6MTUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNyZWMuYzogIEJldHRlciBlcnJvciBjaGVja2luZywgcGFydGx5IGZyb20gUGV0ZXIgU2NoYXVlci4KLQkoc3JlY19vYmplY3RfcCk6ICBBdm9pZCBhc3N1bWluZyBhbnkgZmlsZSB0aGF0IHN0YXJ0cyB3aXRoICdTJyBpcwotCWFuIFMtcmVjb3JkIGZpbGUhICAoQ2hlY2sgZm9yIDMgdXBwZXJjYXNlLWhleCBkaWdpdHMgYWZ0ZXIgaXQuKQotCShJU0hFWCk6ICBEZWZpbmUgbmV3IG1hY3JvIGZvciBjaGVja2luZyBzdXBwb3NlZGx5IGhleCBjaGFyYWN0ZXJzLgotCShwYXNzX292ZXIpOiAgVHJlYXQgYXMgRU9GIGFueSBTLXJlY29yZCBsaW5lIHRoYXQ6Ci0JICAgICogIGRvZXNuJ3QgaGF2ZSBoZXggaW4gZWl0aGVyIHNpemUgY2hhcmFjdGVyCi0JICAgICogIHByb2R1Y2VzIGEgc2l6ZSBsYXJnZXIgdGhhbiAweDdGCi0JICAgICogIGhhcyBhbiB1bnJlY29nbml6ZWQgdHlwZSBudW1iZXIKLQotVGh1IFNlcCAyNiAxNToyNzoyOSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmgsIGFvdXR4LmgsIGJvdXQuYywgY29mZmNvZGUuaCwgaG9zdC1hb3V0LmMsIG9hc3lzLmMsCi0Jb3BuY2xzLmM6ICBMaW50IChzYWJlciBhY3R1YWxseSkuCi0KLVRodSBTZXAgMjYgMTE6MjQ6MjQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxpYmFvdXQuaCAoV1JJVEVfSEVBREVSUyk6IFNldCBoZWFkZXIncyBhX3RleHQgZmllbGQgYWx3YXlzLgotCSogbmV3c29zMy5jOiBGaXhlZCB0d28gdHlwZXM6IG5ld29zMyAtPiBuZXdzb3MzLgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEZpeCBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uCi0JdG8gdXNlIGNvcnJlY3Qgc2VnbWVudC4KLQotTW9uIFNlcCAyMyAxODoyNDozNCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAocHJpbnRfc3ltYm9sKTogIEhhbmRsZSBtaXNzaW5nIHN5bWJvbC0+bmFtZS4KLQotRnJpIFNlcCAyMCAxMjoyNjowMSAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3dhcGNvcmVfc3BhcmMpOiAgQ2hhbmdlIG5hbWUgb2YgVVNSU1RBQ0ssIGZpeCBjb21tZW50Ci0JYXQgdG9wIG9mIHJvdXRpbmUuCi0KLVR1ZSBTZXAgMTcgMTc6MjM6NDkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogb2FzeXMuYywgY29uZmlndXJlLmluLCBjb25maWcvaC1pcml4MywgY29uZmlnL3QtaXJpeDM6Ci0JYWRkIHNnaS9pcml4IHN1cHBvcnQuCi0KLVRodSBTZXAgMTIgMTQ6Mjk6MDkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyBmb3IgdGhlIEFNRCAyOTAwMCBVbHRyYWNvbXB1dGVyIHBvcnQgZnJvbSBEYXZpZCBXb29kLgotCSh3b29kQG55dS5lZHUpLgotCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgSGFuZGxlIE5PX0ZDTlRMLgotCi0JKiBNYWtlZmlsZS5pbjogIE1ha2Ugc3ViZGlycyB3b3JrIGJ5IHVzaW5nICQoSU5DRElSKSBpbiB0aGUKLQljcnVkZSBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfcmVhbF9vYmplY3RfcCk6ICBQYXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZQotCWN1cnJlbnQgZmlsZSdzIGNvZmYgc3ltYm9sIGZvcm1hdCB0byBCRkQgdmlhIHRoZSBjb2ZmX2RhdGEgc3RydWN0LgotCShjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogIG9ial9pY29mID0+IGNvZmZfZGF0YS4KLQkoY29mZl9zd2FwX3N5bV97aW4sb3V0fSk6ICBDaGVjayB0aGF0IFNZTU5NTEVOID09IEVfU1lNTk1MRU4uCi0JKGNvZmZfc3dhcF9hdXhfe2luLG91dH0pOiAgQ2hlY2sgdGhhdCBGSUxOTUxFTiA9PSBFX0ZJTE5NTEVOCi0JYW5kIERJTU5VTSA9PSBFX0RJTU5VTS4KLQkqIGNvbmZpZ3VyZS5pbjogIEhhbmRsZSBhMjlrLSotKiBob3N0cywgYW5kIHRhcmdldHMKLQlhMjlrLSotY29mZiwgYTI5ay0qLWFvdXQsIGFuZCBhMjlrLSotc3ltMS4KLQkqIGxpYmNvZmYtaW4uaDogIEFkZCBsb2NhbF9uX2J0bWFzaywgbG9jYWxfbl9idHNoZnQsCi0JbG9jYWxfbl90bWFzaywgbG9jYWxfbl90c2hpZnQsIGxvY2FsX3N5bWVzeiwgbG9jYWxfYXV4ZXN6LAotCWxvY2FsX2xpbmVzeiB0byBgY29mZl9kYXRhJyAodGRhdGEpIHN0cnVjdC4KLQkoY29mZl9kYXRhLCBjb2ZmX2RhdGFfdHlwZSwgY29mZl90ZGF0YSk6ICBSZW5hbWUgc3RydWN0IGljb2ZkYXRhLgotCSogY29uZmlnL2gtdWx0cmEzOiAgSGFuZGxlIGEyOWstKi0qIGhvc3RzIGFzIFVsdHJhY29tcHV0ZXJzLgotCi1UaHUgU2VwIDEyIDE0OjA3OjIyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogJChNQUtFKSBmb3IgbWFrZSwgJChkb2NkaXIpIGZvciBkb2MKLQkqIGRvYy9NYWtlZmlsZTogcmVkdW5kYW50IGRlcGVuZGVuY2llcyBmb3IgU3VuLW1ha2UgVlBBVEggYnVnCi0KLVR1ZSBTZXAgMTAgMjA6MzQ6MTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2NvcmVfZmlsZV9wKTogIFJlbGVhc2UgdGhlIHJpZ2h0IHN0b3JhZ2UgaW4KLQllcnJvciBjYXNlLgotCShzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogIEZpeCBoZWFkZXIgY29tcGFyaXNvbi4KLQkqIGFvdXR4Lmg6ICBBdm9pZCBzaGlmdHMgb2YgMzIgYml0cywgdW5kZWZpbmVkIGluIEMuICBMaW50LgotCSogYm91dC5jLCBpY29mZi5jLCBpZWVlLmMsIGxpYmJmZC5jLCBvYXN5cy5jOiAgZ2NjIC1PIC1XIGxpbnQuCi0KLVdlZCBTZXAgIDQgMDA6NDQ6NTIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JQWxsb3cgR0RCIHRvIHBhdGNoIG9iamVjdCBmaWxlcy4KLQotCSogYW91dGYxLmggKHN1bm9zX2NvcmVfZmlsZV9wKTogIFNldCBTRUNfSEFTX0NPTlRFTlRTIG9uIGFsbCBzZWN0aW9ucy4KLQkqIHRyYWQtY29yZS5oICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgRGl0dG8uCi0JKiBhb3V0eC5oIChhb3V0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogIE9uIGZpcnN0IG91dHB1dCwgY2hlY2sKLQlhYmZkLT5kaXJlY3Rpb24gYW5kIGNvbXBsYWluIGlmIGVycm9uZW91cy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGQgY3J1ZGUgZGVwZW5kZW5jaWVzLgotCi1UdWUgU2VwICAzIDEzOjQ2OjE5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy8qIGFvdXR4LmggY29uZmlndXJlKiBzaG9ydGVuZWQgYWxsIHRoZSBoL3RtYWtlLXh4eHgKLQl0byBoL3QteHh4eCBmaWxlcyBzbyB0aGF0IGV2ZXJ5dGhpbmcgd2lsbCB3b3JrIG9uIFN5c3RlbSBWLgotCi1GcmkgQXVnIDIzIDEzOjUxOjA2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaDogIEFkZCBpbmZvcm1hdGlvbiBvbiBob3N0LWFvdXQuYyBhbmQgaG93IHRvIGNvbmZpZ3VyZQotCXRvIHVzZSBpdCwgdG8gdGhlIG1hbnVhbC4KLQkqIGNvbmZpZ3VyZS5pbjogIFRpeCB0eXBvLgotCSogZWNvZmYuYzogIElmIGNvbXBpbGluZyBmb3IgREVDMzEwMCwgdXNlIHRyYWRfdW5peCBjb3JlIGZpbGVzLAotCWVsc2UgZHVtbXkgb3V0IHRoZSBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiAgSWYgSE9TVF9EQVRBX1NUQVJUX0FERFIgaXMKLQlzcGVjaWZpZWQsIHVzZSBpdCB0byBsb2NhdGUgdGhlIGRhdGEgc2VjdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfc3ltYm9scyk6ICBEZWNsYXJlIGJ1ZmZlciBhcyBiZmRfYnl0ZXMKLQlyYXRoZXIgdGhhbiBhcyBjaGFycyAobGludCkuCi0KLVRodSBBdWcgMjIgMjI6MjA6MTkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmgsIGNvZmZjb2RlLmg6ICBzYWJlcml6ZWQuCi0KLVRodSBBdWcgMjIgMTE6Mjc6MDYgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvOiBzb21lIGNsZWFudXAsIHJlaW5jb3Jwb3JhdGVkIG1vcmUgaW50cm8gbWF0dGVyIGZyb20KLQliZmQuZG9jCi0JYmZkLmMsIHRhcmdldHMuYzogbWlub3IgcmV3b3JkaW5nIG9mIGRvYyBzZWdtZW50cwotCi0KLVdlZCBBdWcgMjEgMTk6MTM6MjIgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogIFVzZSBIT1NUX1RFWFRfU1RBUlRfQUREUiwKLQlldGMsIHJhdGhlciB0aGFuIFRFWFRfU1RBUlRfQUREUi4KLQkqIGhvc3QtYW91dC5jOiAgUmVtb3ZlICNpZiAwIGFyb3VuZCB3aG9sZSB0aGluZy4KLQlVcGRhdGUgdG8gbW9kZXJuICgzMi82NC1iaXQpIGEub3V0IG5hbWluZyBjb252ZW50aW9ucy4KLQlJbmNsdWRlIGEgbGFyZ2UgY2h1bmsgb2YgLi4vaW5jbHVkZS9hLm91dC5nbnUuaCB0byBnZXQgbWFjcm9zIHRoYXQKLQlhcmUgbm90IGRlZmluZWQgYnkgdGhlIHN5c3RlbSBpbmNsdWRlIGZpbGVzLgotCShob3N0X2FvdXRfezMyLDY0fV93cml0ZV9vYmplY3RfY29udGVudHMpOiAgVXNlIHRoZSBXUklURV9IRUFERVJTCi0JbWFjcm8gdXNlZCBieSB0aGUgb3RoZXIgYS5vdXQgaW1wbGVtZW50YXRpb25zLgotCSogTWFrZWZpbGUuaW46ICBHaXZlIGRlcGVuZGVuY2llcyB0byBPUFRJT05BTF9CQUNLRU5EUy4KLQotV2VkIEF1ZyAyMSAxNDozMzowNiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHVzZSB0YXJnZXRzICJiZmQuZHZpIiBhbmQgImJmZC5wcyIgaW5zdGVhZCBvZgotCXRleGRvYyBhbmQgcHNkb2M7IG1ha2UgdGhlc2UgZGVwZW5kIG9uIGdlbmVyYXRlZCAudGV4aSdzCi0KLQkqIHNjYW5pdCwgKG5ldykgdW5QUk9UTzogdHVybiBQUk9UTyBtYWNyb3MgaW50byBBTlNJIGRlY2xhcmF0aW9ucyBpbgotCWRvYwotCi0JKiBiZmQuYywgcmVsb2MuYywgc3ltcy5jOiBtaW5vciBzcGVsbGluZy93b3JkaW5nIGZpeGVzIGluIGRvYwotCXBvcnRpb25zCi0KLQkqIE1ha2VmaWxlLmluLCBhd2tzY2FuLWlwLCBhd2tzY2FuLXAsIGludG9iZmQsCi0JbGliYmZkLmgsIGxpYmNvZmYuaCwgdG9saWJjb2ZmOyBuZXcgYmZkLWluLmgsIGxpYmJmZC1pbi5oLAotCWxpYmNvZmYtaW4uaDogKGEpIHVzZSBzZXBhcmF0ZSBmaWxlcyBmb3IgaW52YXJpYW50IHBhcnRzIG9mIGJmZC5oLAotCWxpYmJmZC5oLCBhbmQgbGliY29mZi5oOyAoYikgaW4gZ2VuZXJhdGVkIHBhcnRzIG9mIHNhbWUsIHVzZSBsZXNzCi0Jb2J0cnVzaXZlIG1hcmtzIGluZGljYXRpbmcgLmMgb3JpZ2lucy4KLQotCSogYmZkLnRleGluZm86IGdlbmVyYWxpemUgbW9zdCByZWZlcmVuY2VzIHRvIGxpbmtlcgotCi1UdWUgQXVnIDIwIDE1OjE4OjAyIDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5jbHVkZSBjb3JlLnAgaW4gUFJPVE9TIChidWlsZGluZyBiZXR0ZXIgYmZkLmgpCi0JKiBhcmNodXJlcy5jOiByZW1vdmUgZW1wdHkgZm9vKCkgZGVmaW5pdGlvbiAoY3JlcHQgaW4gYXQgdm4xLjkpCi0KLU1vbiBBdWcgMTkgMTM6NDg6MjIgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC50ZXhpbmZvOiB1c2UgQHNldGNoYXB0ZXJuZXdwYWdlIG9uIGluc3RlYWQgb2YgbG90cyBvZgotCUBwYWdlJ3M7IG1pbm9yIHJlcGhyYXNpbmcgaW4gSW50cm9kdWN0aW9uLgotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIGJmZC5jLCBiZmQudGV4aW5mbywgY2FjaGUuYywKLQljb2ZmY29kZS5oLCBjb3JlLmMsIGZvcm1hdC5jLCBpZWVlLmMsIGxpYmJmZC5jLCBsaWJiZmQuaCwgbGliY29mZi5oLAotCW9hc3lzLmMsIG9wbmNscy5jLCByZWxvYy5jLCBzZWN0aW9uLmMsIHN5bXMuYywgdGFyZ2V0cy5jIChkb2N1bWVudGF0aW9uCi0Jc2VnbWVudHMpOiB1c2VkIEJGRCAoY2FwcykgbW9yZSBjb25zaXN0ZW50bHkgYXMgYSBuYW1lIGluCi0JZGlzY291cnNlLCBmaXhlZCBhIGZldyBvdGhlciBtaW5vciB0eXBvcyBhbmQgdXNlcyBvZiBmb250cwotCi0KLVRodSBBdWcgIDggMTY6NDc6NDMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogY29mZmNvZGUuaDogZml4ZWQgYnVnIHdoZXJlIHN0cmluZyB0YWJsZSBzaXplIHdhc24ndCBiZWluZyBzd2FwcGVkLgotCi1UaHUgQXVnICAxIDE2OjM1OjI4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYzogYWRkZWQgU0VDX0NPTlNUUlVDVE9SX1RFWFR8REFUQXxCU1MgZmxhZ3MKLQotCSogc3ltcy5jOiBhZGRlZCBCU0ZfQ09OU1RSVUNUT1IsIEJTRl9XQVJOSU5HIGFuZCBCU0ZfSU5ESVJFQ1QKLQlmbGFncy4gKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpIG5vdyBrbm93cyB3aGF0IHRvIGRvIHdpdGggdGhlCi0JYWJvdmUgZmxhZ3MuCi0KLQkqIGFvdXR4Lmg6IG1hZGUgdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyBhbmQKLQl0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyBwcm9kdWNlIHRoZSBhYm92ZSBmbGFncy4KLQotCi1XZWQgSnVsIDMxIDA5OjUzOjUyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYWxsIGZpbGVzOiAgdXBkYXRlIGNvcHlyaWdodCBub3RpY2VzIGZvciBHUEwgdmVyc2lvbiAyLgotCUluc3RhbGwgaGVhZGVyIGNvbW1lbnRzIGFuZCBhdHRyaWJ1dGUgbW9zdCBtb2R1bGVzIHRvIHRoZWlyCi0JYXV0aG9ycy4gIEJGRCdzIG5hbWUgaXMgbm93IG9mZmljaWFsbHkgIkJpbmFyeSBGaWxlIERlc2NyaXB0b3IiLAotCXNvIHJlbW92ZSBhbnkgY29uZmxpY3RpbmcgcGVqb3JhdGl2ZXMuCi0JYXJjaHVyZXMuaDogIENvbnNpc3RzIHNvbGVseSBvZiBjb21tZW50czsgcmVtb3ZlIGl0LgotCi1GcmkgSnVsIDI2IDE4OjExOjM0IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBiZmQuYzogTWFkZSBpdCBjb21waWxlIGFnYWluLgotCi1GcmkgSnVsIDE5IDA4OjE3OjA5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIG5ld3NvczMuYywgdGFyZ2V0cy5jLCBjb2ZmY29kZS5oOiBuZXcgcGF0Y2hlcyBmcm9tIERhdmlkIFdvb2QKLQotCi1Nb24gSnVsIDE1IDE2OjI3OjQyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIGFyY2hpdmUuYyBiZmQuYyBjb2ZmY29kZS5oIGNvcmUuYyBlY29mZi5jIGllZWUuYwotCWJmZC50ZXhpbmZvIG9hc3lzLmMgb3BuY2xzLmMgcmVsb2MuYyBzcmVjLmM6IE1vcmUgZG9jdW1lbnRhdGlvbiBvbgotCWxpbnQgZml4ZXMuCi0KLQkqIGFtZGNvZmYuYyBiZmQudGV4aW5mbyBNYWtlZmlsZS5pbiA6IEZvbGRlZCBpbiBjaGFuZ2VzIGZvciBhbWQKLQkyOWsgY29mZiBieSBEYXZpZCBXb29kICh3b29kQGxhYi51bHRyYS5ueXUuZWR1KS4KLQotVGh1IEp1bCAgNCAwOTo1MzoxNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBFdmVyeXRoaW5nOiBjcmVhdGVkIHNvbWUgbmV3IGZpbGVzLCBjb3JlLmMgZm9ybWF0LmMsIHJlbG9jLmMsCi0Jc2VjdGlvbi5jIGFuZCBzeW1zLmMgdG8gc3BsaXQgdGhlIGZ1bmN0aW9uYWxpdHkgYSBiaXQgYmV0dGVyLgotCUNsZWFuZWQgdXAgdGhlIHJlc3Qgb2YgdGhlIGZpbGVzIGEgYml0LCBhbmQgYWRkZWQgc29tZQotCWRvY3VtZW50YXRpb24uCi0KLQotTW9uIEp1bCAgMSAxMzoyOTo0NyAxOTkxICBEYXZpZCBXb29kICh3b29kIGF0IGRhdmlkLnVsdHJhLm55YS5lZHUpCi0KLQkqIG9wbmNscy5jLCAuLi9pbmNsdWRlL3N5cy9oLXN1bjMuaCAuLi9pbmNsdWRlL3N5cy9oLXN1bjQuaDogZmNudGwKLQlyZWFsbHkgdGFrZXMgMyBhcmd1bWVudHMsIHBhdGNoZWQgY29kZSBhbmQgYW1tZW5kZWQgcHJvdG90eXBlcy4KLQotRnJpIEp1biAxNCAxMzoxOTo0MCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiAuLi9pbmNsdWRlL2JmZC5oIChzdHJ1Y3QgYmZkX3RhcmdldCk6IEFkZGVkIG5ldyBmaWVsZAotCSJhbGlnbl9wb3dlcl9taW4iIHdoaWNoIGNvbnRhaW5zIHRoZSBtaW5pbXVtIGFsaWdubWVudCBmb3IgYQotCXNlY3Rpb24uIFRoaXMgaXMgdXNlZCBpbiBjb2ZmX25ld19zZWN0aW9uX2hvb2suIFRoZSBmaWVsZAotCWluc2VydGlvbiBuZWNlc3NpdGF0ZXMgYW4gdXBkYXRlIG9mIGFsbCBiYWNrZW5kcy4uCi0KLQkqIGFvdXRmMS5oIGp1bXAgdGFibGUgZmllbGQgaW5zZXJ0ZWQKLQotCSogYXJjaGl2ZS5jKHNuYXJmX2FyX2hkcikoYmZkX3NsdXJwX2NvZmZfYXJtYXApIGNhbiBub3cgcGFyc2UgZGd1eCBzdHlsZSBleHRlbmRlZAotCWZpbGVuYW1lcyB0b28uCi0KLQkqIGJvdXQuYyhiX291dF9zcXVpcnRfb3V0X3JlbG9jcykgZml4IHRvIGFzc2VydGlvbiB0ZXN0cy4gSnVtcAotCXRhYmxlIGZpZWxkIGluc2VydGVkLgotCi0JKiBjb2ZmY29kZS5oKGp1c3QgYWJvdXQgZXZlcnl0aGluZykgTm93IHBhdGNoZXMgdXAgc3ltYm9sIHRhYmxlcwotCXVzaW5nIGEgZGlmZmVyZW50IG1lY2hhbmlzbS4gVGhlIEludGVsIG1ham9yIGJ1ZyBoYXMgYmVlbiBmaXhlZCwKLQlhbmQgdGhlIGxpbmtlciBjYW4gc2VsZiBob3N0IG9uIHRoZSBBdmlpb24gYW5kIGJlIGRlYnVnZ2VkIHdpdGgKLQlnZGIuCi0KLQkqIGVjb2ZmLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLCBpMzg2Y29mZi5jOiBuZXcKLQlpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLCAgaWNvZmYuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUKLQlwYXRjaCwgaWVlZS5jOiBjYW4gbm93IHJlYWQgYXJjaGl2ZXMgY29udGFpbmluZyBpZWVlIG1vZHVsZXMuLAotCWxpYmNvZmYuaDogYWRkZWQgKGNvbWJpbmVkX2VudHJ5X3R5cGUpLCBsaWJpZWVlLmg6IHVwZWQgbWF4Ci0Jc2VjdGlvbnMgdG8gMjAsIG02OGtjb2ZmLmM6IG5ldyBpbmNsdWRlIGFuZCBqdW1wIHRhYmxlIHBhdGNoLAotCW04OGtiY3MuYzogbmV3IGluY2x1ZGUgYW5kIGp1bXAgdGFibGUgcGF0Y2gsIG9hc3lzLmM6IHZhcmlvdXMgYnVncwotCWZpeGVkLiBvcG5jbHMuYzogYWRkZWQgYmZkX2FsbG9jX2dyb3cgYW5kIGJmZF9hbGxvY19maW5pc2guCi0Jc3JlYy5jOiBqdW1wIHRhYmxlIHBhdGNoLiB0cmFkLWNvZGUuYyBmaXhlZCAjSUYgdHlwZW8KLQotRnJpIEp1biAgNyAxMjozNTo0NiAxOTkxICBTZWFuIEZhZ2FuICAoc2VmIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0gCSogY29mZmNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IGFkZGVkIGVsc2UgY2FzZSB0byBkZWFsIHdpdGgKLSAJZmlsZW5hbWVzIGxlc3MgdGhhbiA5IGNoYXJhY3RlcnMuCi0KLQotVGh1IEp1biAgNiAxODoyNzozOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiAuLi9pbmNsdWRlL29hc3lzLmggb2FzeXMuYyAob2FzeXNfYXJjaGl2ZV9wKTogZml4ZWQgc28gaXQgd29ya3MKLQotCSogc3JlYy5jOiBub3cgYWxsb3dzIGFueSBudW1iZXIgb2Ygc2VjdGlvbnMgdG8gYmUgY3JlYXRlZCBpbiBhCi0JZmlsZS4gT3V0cHV0cyBhZGRyZXNzZXMgb2YgdGhlIHJpZ2h0IGxlbmd0aC4KLQotVGh1IE1heSAzMCAxNTozMDoxMCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2NoZWNrX2Zvcm1hdCk6IEZpeGVkIHByb2JsZW0gd2hlcmUgd2hlbiBhIGRlZmF1bHRlZAotCXRhcmdldCBkaWRuJ3QgbWF0Y2gsIHRoZSBmb3JtYXQgZ290IHNldCB0byB0aGUgYXR0ZW1wdGVkIG1hdGNoLAotCWJyZWFraW5nIGEgZnV0dXJlIHRlc3QuCi0KLSAgICAgICAgKi4uL2luY2x1ZGUvaTM4NmNvZmYuaCA6IGZpeGVkIHR5cG8gaW4gdHlwZSBmaWVsZCB3aXRoIHNpemUKLQotCSogaTM4NmNvZmYuYyBpY29mZi5jIG04OGstYmNzLmMgZWNvZmYuYyAuLi9pbmNsdWRlL2JmZC5oIDogQWRkZWQKLQlzdXBwb3J0IGluIHRoZSBqdW1wIHRhYmxlIGZvciB0aGUgc3dhcHBpbmcgcm91dGluZXMgZXhwb3J0ZWQgdG8KLQlnZGIuIE5vdyBnZGIgd29ya3Mgd2l0aCB0aGUgMzg2LgotCi1UdWUgTWF5IDI4IDE3OjIxOjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGdkYi0zLjk1IHJlbGVhc2UuCi0JTWFrZWZpbGUuaW46ICBBbGxvdyBobWFrZSBhbmQgdG1ha2UgZmlsZXMgdG8gYWRkIE9GSUxFUy4KLQlhb3V0ZjEuaDoKLQliZmQuYzogIHN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4gIFdoZW4KLQlzZWFyY2hpbmcsIHRha2UgZGVmYXVsdCB0YXJnZXQgaW4gcHJlZmVyZW5jZSB0byBvdGhlcnMuCi0JYmZkLmRvYzogIHR5cG9zCi0JaWVlZS5jLCBvYXN5cy5jOiAgQXZvaWQgdXNpbmcgdGhlICJ0ZGF0YSIgbWFjcm9zIGxlZnQgb2YgYXNzaWdubWVudC4KLQlsaWJhLm91dC5oOiAgRG9uJ3QgaGFyZC1jb2RlIGZpbGUgb2Zmc2V0czsgdXNlIE5fIG1hY3JvcyBmb3IgdGhlbS4KLQlsaWJiZmQuaDogIFN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4KLQlvcG5jbHMuYzogIFN1cHBvcnQgc3BlY2lmaWMgdGFyZ2V0cyBhcyB3ZWxsIGFzIHNlYXJjaGluZy4KLQl0YXJnZXRzLmM6ICBTZWFyY2ggaXMgc2hvcnQtY2lyY3VpdGVkIGlmIGRlZmF1bHQgdGFyZ2V0IG1hdGNoZXMuCi0JbGlib2FzeXMuYywgbGliaWVlZS5jOiAgVW5kbyBib3RobmVyIGNoYW5nZXMgdGhhdCBtYWtlIG1hY3JvcwotCXdvcmsgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCwgYnV0IHdoaWNoIGRlcGVuZCBvbiB0aGUKLQlyZXByZXNlbnRhdGlvbnMgb2YgZGlmZmVyZW50IHBvaW50ZXIgdHlwZXMgYmVpbmcgdGhlIHNhbWUuCi0KLUZyaSBNYXkgMjQgMTg6NTY6NTIgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogaTM4NmNvZmYuYzogY3JlYXRlZC4KLQkqIGNvZmZjb2RlLmg6IGFkZGVkIHN1cHBvcnQgZm9yIDM4Ni4KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBzdXBwb3J0IGZvciAzODYuCi0JKiAuLi9pbmNsdWRlL2kzODZjb2ZmLmg6IGNyZWF0ZWQKLQotV2VkIE1heSAyMiAwNzoyNjozOCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBjb2ZmY29kZS5oOiByZW1vdmVkIGFsbCBwdXRfeF88c2l6ZXM+Ci0JKiBsaWJiZmQuYzogQ2hhbmdlZCAjaWZkZWYgX19HTlVDX18gdG8gI2lmZGVmIEhPU1RfNjRfQklULCBBZGRlZAotCURFRlVOUwotCi0KLVR1ZSBNYXkgMjEgMDg6NTg6NTggMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQkoYm90aG5lcikKLQkqIG9wbmNscy5jOiBDaGFuZ2VkIG9ic3RhY2tfY2h1bmtfYWxsb2MgdXNlIHhtYWxsb2MKLQotTW9uIE1heSAyMCAxNzoxMjoxNyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBldmVyeXRoaW5nOiBSZW1vdmVkIHN5c2RlcC5oIGZyb20gYmZkLmggYW5kIHB1dCBiYWNrIGludG8gZmlsZXMKLQlmcm9tIHdoaWNoIGl0IHdhcyBzcGxpdCBvdXQuIE5vdyA2NCBiaXQgdmVyc2lvbiBpcyBidWlsdCB3aXRoIGEKLQktREhPU1RfNjRfQklUPSJsb25nIGxvbmciIG9uIHRoZSBjb21waWxlIGxpbmUuCi0KLUZyaSBNYXkgMTcgMTk6MzU6MjYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCUNoYW5nZWQgYWxsIHRoZSBbZ2V0fHB1dF1bbmFtZV0gcm91dGluZXMgdG8gdXNlICBbZ2V0fHB1dF1fW3NpemUKLQlpbiBieXRlc10uCi0KLQlQdXQgaW4gc3VwcG9ydCBmb3IgNjQgYml0IHdvcmsuIE5vdyB0d28gdmVyc2lvbnMgb2YgYmZkIG1heSBiZQotCWdlbmVyYXRlZCwgYWNjb3JkaW5nIHRvIHRoZSBzdGF0ZSBvZiBUQVJHRVRfNjRfQklULCBvbmUgd2hpY2ggaXMKLQkzMiBiaXQgb25seSwgYW5kIG9uZSB3aGljaCBpcyA2NC8zMiBiaXRzLgotCUNyZWF0ZWQgbmV3IGJhY2sgZW5kICdkZW1vNjQnIHRvIHRlc3QgNjQgYml0IGZ1bmN0aW9uYWxpdHkuCi0KLQlSZW5hbWVkIHNvbWUgZmlsZXMgdG8gd29yayBvbiBET1MuCi0KLQkqIGFyY2hpdmUuYzogbGludCAqIGJmZC5jOiBwcm90b3R5cGVzIGFuZCBsaW50LiAqIGVjb2ZmLmM6IGFkZGVkCi0JNjRiaXQgdHJhbnNmZXIgCSogaWNvZmYuYzogYWRkZWQgNjRiaXQgdHJhbnNmZXIgKiBpZWVlLmM6IG5hbWUKLQljaGFnZSwgNjQgYml0IHRyYW5zZmVyLiAqIGxpYmEub3V0Lmg6IFNwbGl0IG91dCBjb21tb24gY29kZSBmcm9tCi0Jc3Vub3MgYW5kIG5ld3NvcyBpbnRvIGxpYmEub3V0LiBOYW1lIGNoYW5nZXMgYW5kIHByb3RvdHlwZSBtb2RzLiAqCi0JbGliYmZkLmM6IGxpbnQgYW5kIHByb3RvdHlwZXMsIGV4dHJhIDY0Yml0IHN3YXBzLiAqIGxpYmJmZC5oOgotCXByb3RvdHlwZXMgZm9yIG5ldyBmdW5jdGlvbnMuICogbGliY29mZi5oOiBsaW50ICogbGliaWVlZS5oOiBtYWtlCi0Jd29yayBvbiBET1MgKiBsaWJvYXN5cy5oOiBtYWtlIHdvcmsgb24gRE9TICogbTg4ay1iY3MuYzogTmFtZQotCWNoYW5nZSBhbmQgNjRiaXQgc3R1ZmYuKiBuZXdzb3MzLmM6IGNvbW1vbiBjb2RlIHJlbW92ZWQsIG5ldyBqdW1wCi0JdGFibGUuICogb2FzeXMuYzogTmFtZSBjaGFuZ2UgKiBvcG5jbHMuYzogUG9ydGFiaWxpdHkgZml4ZXMgKgotCXNyZWMuYzogTmFtZSBjaGFuZ2VzICogc3Vub3MuYzogUmVtb3ZlZCBjb21vbiBjb2RlLiAqIHRhcmdldHMuYzoKLQlBZGRlZCBkZW1vICogYW91dDMyLCBhb3V0NjQuYyBpbmNsdWRlICBhb3V0eC5oICogYm91dC5jOiB1c2VkIHRvCi0JYmUgY2FsbGVkIGIub3V0LmMgKiBjb2ZmY29kZS5oOiB1c2VkIHRvIGJlIGNhbGxlZCBjb2ZmLWNvZGUuaCwgbm93Ci0JNjRiaXQgaXplZC4gKiBkZW1vNjQuYzogNjQgYml0IGEub3V0IGJhY2sgZW5kCi0KLVRodSBNYXkgMTYgMTY6MDI6MDcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQlmcm9tIGJvdGhuZXIKLSAJKiBsaWJpZWVlLmg6IE1ha2UgaWVlZV9kYXRhIGFuZCBpZWVlX2FyX2RhdGEgbWFjcm9zIHVzYWJsZQotCW9uIExIUyBvZiBhc3NpZ25tZW50LCBldmVuIHdoZW4gdXNpbmcgb2xkIGNvbXBpbGVycy4KLQkqIGxpYm9hc3lzLmg6IERpdHRvIGZvciBvYXN5c19kYXRhIGFuZCBvYXN5c19hcl9kYXRhLgotCSogbTY4a2NvZmYuYzogQWRkIGVudW0tdG8taW50IGNhc3RzIHRvIGFjY29tb2RhdGUgb2xkIGNvbXBpbGVycy4KLQkqIG5ld3NvczMuYzogRml4IGRlZmluaXRpb25zIG9mIFNFR01FTlRfU0laRSBhbmQgVEVYVF9TVEFSVF9BRERSLgotCSogb3BuY2xzLmM6IERlZmluZSBTX0lYVVNSLCBTX0lYR1JQLCBTX0lYT1RIIGlmIHVuZGVmaW5lZC4KLQkqIHRhcmdldHMuYzogQWRkIGRlY2xhcmF0aW9uIG9mIG5ld3NvczNfdmVjLgotCi1Nb24gTWF5IDEzIDEwOjAzOjI5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGFvdXQuYzogZml4eGVkIHNvbWUgb2YgdGhlIHByb2JsZW1zIHdpdGggZmlsZXBvcyBjYWxjdWxhdGlvbi4KLQkoc3dhcF9leHRfcmVsb2MpOiBmaXhlZCBwcm9ibGVtIHdpdGggY3JlYXRpb24gb2YgcmVsb2NzLgotCShhb3V0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogZml4ZWQgZmlsZXBvcyBwcm9ibGVtCi0KLQkqIGNvZmYtY29kZS5oOiAoc3dhcF9maWxlaGRyX2luLCBzd2FwX2ZpbGVoZHJfb3V0KSBhZGQuCi0JKHN3YXBfZmlsZWhkcikgZGVsZXRlLiBDaGFuZ2VkIGFsbCB0aGUgdXNhZ2Ugb2YgYmZkX2hfcHV0X3guCi0JKHN3YXBfYW91dGhkcl9pbiwgc3dhcF9hb3V0aGRyX291dCkgYWRkLiAoc3dhcF9hb3V0aGRyKSBkZWxldGUuCi0JKGNvZmZfcmVhbF9vYmplY3RfcCkgY2xlYW5lZCB1cCwgYWRkZWQgTUlQUy4gKGNvZmZfb2JqZWN0X3ApCi0JY2xlYW5lZCB1cC4gKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSBjbGVhbmVkIHVwLgotCi0JKiBlY29mZi5jOiBUb3RhbGx5IGRpZmZlcmVudC4gTm93IHN1cHBvcnRzIGVjb2ZmIGZ1bGx5LgotCi0JKiBpY29mZi5jOiBmaXhlZCBwcm9ibGVtcyBpbiByZWxvY2F0aW9uIGNhbGxvdXQuCi0KLQkqIGxpYmNvZmYuaDogKHN0cnVjdCBpY29mZGF0YSkgcmVtb3ZlZCBoZHIgc3RydWN0dXJlIGZyb20gdGRhdGEuCi0KLQkqIG02OGtjb2ZmLmM6IHVwZGF0ZWQgdGFyZ2V0IHZlY3Rvci4KLQotCSogc3Vub3MuYzogKGNob29zZV9yZWxvY19zaXplKSBhZGRlZDogKHN1bm9zNF9jYWxsYmFjaykgY2FsbHMKLQljaG9vc2VfcmVsb2Nfc2l6ZS4gKHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpIG5vdyBjYWxscwotCWNob29zZV9yZWxvY19zaXplIHNvIG91dHB1dHMgcmVsb2NzIGNvcnJlY3RseSwgYWxzbyBjYWxjdWxhdGVzIHRoZQotCXNpemUgb2YgdGhlIHNlY3Rpb25zIGNvcnJlY3RseS4KLQotCi0KLUZyaSBNYXkgMTAgMTY6NTg6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JTWVyZ2UgUGVyIEJvdGhuZXIncyBjaGFuZ2VzIHRvIG1vZHVsYXJpemUgQkZEIGEub3V0IGEgYml0LgotCi0JKiBsaWJiZmQuaCwgbGliYmZkLmMgKGJmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogIEFkZC4KLQkqIGllZWUuYzogIENhc3QgZW51bXMgdG8gaW50IGJlZm9yZSBjb21wYXJpbmcgdGhlbSwgZm9yIGJyYWluLQotCWRlYWQgY29tcGlsZXJzLgotCSogY29mZi1jb2RlLmg6ICBSZW1vdmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cywgYW5kIHVzZSB0aGUKLQlnZW5lcmljIG9uZSBpbnN0ZWFkLgotCi0JKiBhb3V0LmM6ICBEZXJpdmUgbmV3IG1vZHVsZSBmcm9tIHN1bm9zLmMsIGNvbnRhaW5pbmcgZ2VuZXJpYwotCXN1cHBvcnQgY29kZSBmb3IgYWxsIGtpbmRzIG9mIGEub3V0IGZpbGVzLgotCi0JKiBzdW5vcy5jOiBSZW1vdmUgYWxsIGNvZGUgdGhhdCBnb2VzIGluIGFvdXQuYy4gIFNwbGl0IG91dAotCW1hY2hpbmUgZGVwZW5kZW50IGZvbGxvd3VwIGluIHN1bm9zNF9vYmplY3RfcCBpbnRvCi0Jc3Vub3M0X2NhbGxiYWNrLiAgVXNlIEpVTVBfVEFCTEUoYW91dCkgZm9yIHRoZSB0cmFuc3ZlciB2ZWN0b3IsCi0JYW5kIHJlZGVmaW5lIG9ubHkgdGhlIG5hbWVzIHdlIENIQU5HRSwgbm90IGFsbCB0aGUgbmFtZXMuICBEcm9wCi0JdGhlIGxpdHRsZS1lbmRpYW4gdmVjdG9yLCBhbmQgcmVuYW1lIHRoZSB2ZWN0b3IgYXMgc3Vub3M0IHJhdGhlcgotCXRoYW4gZ2VuZXJpYy4KLQotCSogYi5vdXQuYzogIFVzZSBhb3V0LmMgcm91dGluZXMgZm9yIG1vc3Qgb2YgdGhlIHdvcmsuICBTbGlnaHQKLQljaGFuZ2VzIGZvciB0aGUgbmV3IHJlZ2ltZS4gIFJlbW92ZSBjbG9zZV9hbmRfY2xlYW51cCBhbmQKLQlnZXRfc2VjdGlvbl9jb250ZW50cyBpbiBmYXZvciBvZiBnZW5lcmljcy4gIE5ldyB0cmFuc2ZlciB2ZWN0b3IKLQlyZWdpbWUuCi0KLQkqIG5ld3Nvcy5jOiAgTmV3IHN1cHBvcnQgZm9yIFNvbnkgTkVXUywgYW5vdGhlciBhLm91dCBmb3JtYXQuCi0KLQkqIGVjb2ZmLmM6ICBSZW1vdmUgY2xvc2VfYW5kX2NsZWFudXAuICBOZXcgdHZlYyByZWdpbWUuCi0JKiBpY29mZi5jLCBtODhrLWJjcy5jOiAgQWRkIHdyaXRlX2NvbnRlbnRzIHRvIHR2ZWMuCi0JKiBpZWVlLmMsIG9hc3lzLmM6ICBSZW1vdmUgY2xvc2VfYW5kX2NsZWFudXAsIGFkZCB3cml0ZV9jb250ZW50cwotCXRvIHR2ZWMuCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlKTogIENhbGwgZm9ybWF0LWRlcGVuZGVudCB3cml0ZV9jb250ZW50cwotCXJvdXRpbmUsIGlmIHdyaXRpbmcsIGJlZm9yZSBjYWxsaW5nIHRhcmdldC1kZXBlbmRlbnQKLQljbG9zZV9hbmRfY2xlYW51cCByb3V0aW5lICh3aGljaCBpcyBub3cgYWx3YXlzIGdlbmVyaWMsIEkgdGhpbmspLgotCSogc3JlYy5jOiAgVXNlIGJmZF9hbGxvYyBpbnN0ZWFkIG9mIG1hbGxvYy4gIFJlbW92ZQotCWNsb3NlX2FuZF9jbGVhbnVwIGFuZCBtb3ZlIGNvZGUgZnJvbSBpdCB0bwotCXNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLiAgQWRkIHdyaXRlX2NvbnRlbnRzIHRvIHR2ZWMuCi0JKiB0YXJnZXRzLmM6ICBSZW1vdmUgYS5vdXQgbGl0dGxlIHZlY3RvciwgcmVwbGFjZSBhLm91dCBiaWcKLQl2ZWN0b3Igd2l0aCBTdW5PUyB2ZWN0b3IuICBGSVhNRTogIE5lZWQgVmF4IHN1cHBvcnQgYWdhaW4gbm93LgotCi0JKiBsaWJiZmQuaDogIEFkZCB3cml0ZV9jb250ZW50cyBmb3JtYXQtZGVwZW5kZW50LXZlY3RvciB0byB0aGUKLQliZmRfdGFyZ2V0IHZlY3Rvci4gIFN1cHBseSBhIGdlbmVyaWMgY2xvc2VfYW5kX2NsZWFudXAgcm91dGluZS4KLQkqIGxpYmEub3V0Lmg6ICBIYW5kbGUgdGhlIG5ldyBhb3V0LmMgc3BsaXQuICBBZGQgcHJvdG90eXBlcyBmb3IKLQlhbGwgcm91dGluZXMgZGVmaW5lZCBpbiBhb3V0LmMuICBSZW5hbWUgInN1bm9zIiB0aGluZ3MgdG8gImFvdXQiCi0JdGhpbmdzLiAgQWRkIGEgZmV3IGZpZWxkcyB3aGVyZSBuZWVkZWQgZm9yIHZhcmlvdXMgZm9ybWF0cy4KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGFvdXQuYyBhbmQgbmV3c29zLmMuCi0KLQkqIGFyY2hpdmUuYywgaWVlZS5jLCBvYXN5cy5jOiAgTGludC4KLQotRnJpIE1heSAxMCAxMjozNDo0OCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiAuLi9pbmNsdWRlL2JmZC5oCi0JY2hhbmdlZCBmb3J3YXJkIGRlY2xhcmF0aW9uIHN0cnVjdCBzdGF0OyB0byByZWR1Y2Ugd2FybmluZ3MuIENoYW5nZWQKLQljb21tZW50IG9uIGJmZF9oXzx4Pl94LgotCi0JKiAuLi9pbmNsdWRlL202OGtjb2ZmLmgsIC4uL2luY2x1ZGUvaW50ZWwtY29mZi5oLAotCS4uL2luY2x1ZGUvbTg4ay1iY3MuaAotCU5vdyB0aGVyZSBhcmUgdHdvIGluY2FybmF0aW9ucyBvZiByZWxvY3MsIGxpbmVub3MgYW5kIHN5bWVudHMuIE9uZSBmb3IKLQlpbnRlcm5hbCBkaWdlc3Rpb24sIGFuZCBvbmUgZnVsbCBvZiBjaGFyIGFycmF5cyBmb3IgSS9PLiBUaGUgb3JpZ2luYWwKLQluYW1lcyBoYXZlIGdvbmUgdG8gZGV0ZWN0IGVycm9ycy4KLQotCSogTWFrZWZpbGUuaW4sIG02OGtjb2ZmLmMsIHRhcmdldHMuYwotCVRlc3QgbmV3IHN0cnVjdHVyZSBjb2RlIHdpdGggYSA2OGsgY29mZiBpbXBsZW1lbnRhaW9uCi0KLQkqIGNvZmYtY29kZS5oLCBpY29mZi5jLCBjb2Zmc3dhcC5jLCBsaWJjb2ZmLmgKLQlGaXhlZCBhbGwgdGhlIHBsYWNlcyB3aGVyZSB0aGVyZSB3ZXJlIHByb2JsZW1zIHdpdGggdGhlIHNpemUgYW5kCi0JYWxpZ25tZW50cyBvZiBzdHJ1Y3R1cmVzIG9uIGRpc2sgYW5kIHN0cnVjdHVyZXMgaW4gbWVtb3J5LiAjaWZlZCBvdXQKLQlhbGwgdGhlIGNvZGUgaW4gY29mZnN3YXAuYywgc2luY2UgaXQgc2hvdWxkIGJlIGRvbmUgdXNpbmcgdGhlIHRhcmdldAotCXN3YXAgcm91dGluZXMgbm93LgotCi1UaHUgTWF5ICA5IDExOjAwOjQ1IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGllZWUuYyAoZG9fb25lLCBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IG5vdyBzdXBwb3J0cyB0aGUgbG9hZAotCW11bHRpcGxlIHJlbG9jIGNvbW1hbmQuCi0KLQkqIHN1bm9zLmMgKHN1bm9zNF9zZXRfc2VjdGlvbl9jb250ZW50cyk6IE1hZGUgaXQgc28gdGhhdCBzZWN0aW9ucwotCWFyZSBhbHdheXMgcGFkZGVkIHRvIHRoZWlyIGFsaWdubWVudCBzaXplLgotCi1TYXQgTWF5ICA0IDE1OjQ5OjQzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jLCBiZmQuYywgY29mZi1jb2RlLmgsIG9wbmNscy5jLCBzdW5vcy5jLCB0cmFkLWNvcmUuYzoKLQlDbGVhbiB1cCB0eXBlcyBhbmQgc3VjaCAoc2FiZXIgQyBwcm9ibGVtcykuCi0JKiBlY29mZi5jOiAgQ2xlYW4gdXAgdHlwZXMgYW5kIHN1Y2guICBSZW1vdmUgcm91dGluZXMgdGhhdCBhcmUKLQlub3QgdXNlZC4gIEZpeCB1cCByZWFkaW5nIGFuZCBzd2FwcGluZyBvZiBzaG9ydHMgZnJvbSBmaWxlcy4KLQotICAgTm90ZXMgb24gYmZkLTAuNS4yLXBhdGNoMWEsIGZyb20gUGVyIEJvdGhuZXI6Ci0KLQkqIGEub3V0LnZheC5jOiBSZW1vdmUgdHdvIGJvZ3VzICJzdGF0aWMiIGZyb20gcHJvdG90eXBlcy4KLQotCSogZWNvZmYuYzogR290IHJpZCBvZiBsb3RzIG9mIG5vbi13b3JraW5nIGp1bmsgKHRoYXQgaGFkCi0JYmVlbiBjb3BpZWQgZGlyZWN0bHkgZnJvbSBjb2ZmLWNvZGUuaCkuCi0JVXBkYXRlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdXBkYXRlcyB0byBpY29mZi5jIGFuZCBjb2ZmLWNvZGUuaC4KLQotCSogbGliYmZkLmg6IEFkZGVkIGRlZmluaXRpb25zIGZvciBTX0lYVVNSLCBTX0lYR1JQLCBhbmQgU19JWE9USAotCWlmIHRoZXkncmUgbWlzc2luZyAoYXMgdGhleSBhcmUgaW4gKEJEUy00LjMtYmFzZWQpIE5ld3NPUy0zKS4KLQotCSogc3Vub3MuYyAobl90eHRvZmYpOiAoUmUtKUFkZCBzdXBwb3J0IGZvciBzb255LiBUaGlzIGlzIGEga2x1ZGdlLAotCWJ1dCB1bnRpbCB0aGUgdGFyZ2V0X3ZlY3RvciBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCwKLQlpdCdzIGFzIGdvb2QgYXMgYW55LiBOb3RlIHRoYXQgdGhlIHRleHQgb2Zmc2V0IGlzIHRoZSBvbmx5Ci0JZGlmZmVyZW5jZSBiZXR3ZWVuIE5ld3NPUyBhbmQgU3VuT3MgKGluY2x1ZGluZyBtYWdpYyBudW1iZXJzKS4KLQkoTW9zdCBvZiB0aGUgc3Vub3NfKiByb3V0aW5lcyBzaG91bGQgdG8gcmVuYW1lZCBic2RfKgotCWFuZCBtb3ZlIHRvIGEgYnNkLmMgZmlsZS4gVGhlbiAoYW5kIHdoZW4gdGhlIHRhcmdldF92ZWN0b3IKLQlpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCkgaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBjcmVhdGUKLQlhIHNlcGFyYXRlIFNvbnkgdGFyZ2V0LikKLQotCSogc3lzZGVwLmg6IERvbid0IGRlY2xhcmUgZnJlYWQgYW5kIGZ3cml0ZS4gQ2F1c2VzIHRyb3VibGUKLQlvbiBzb21lIHN5c3RlbXMsIGFuZCBkb2Vzbid0IGhlbHAgb24gb3RoZXJzLgotCVNpbWlsYXJseSwgb25seSBkZWZpbmUgWF9PSyBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSBzeXMvc3RhdC5oIC0gYXQgbGVhc3QKLQlvbiBOZXdzT1MgMywgaXQgaGFzIGFscmVhZHkgYmVlbiBpbmNsdWRlZC4KLQotVHVlIE1hciAgNSAwMTo0Nzo1NyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtY29kZS5oIChiZmRfY29mZl9zd2FwX3N5bSwgYmZkX2NvZmZfc3dhcF9hdXgsCi0JYmZkX2NvZmZfc3dhcF9saW5lbm8pOiAgRXhwb3J0IHRoZSByb3V0aW5lcyB0aGF0IGJ5dGUtc3dhcCBDT0ZGCi0Jc3ltYm9sIHRhYmxlcyBpZiBuZWNlc3Nhcnkgd2hlbiByZWFkaW5nIHRoZW0gaW4sIHNvIGdkYiBjYW4gdXNlCi0JdGhlbS4gIEFkZCAiYmZkX2NvZmZfIiB0byB0aGUgbmFtZXMgc28gdGhleSB3b24ndCBjb25mbGljdCB3aXRoCi0JbmFtZXMgaW4gY2FsbGluZyBwcm9ncmFtcy4gIEZJWE1FLXNvb246ICBpZiBjb2ZmLWNvZGUuaCBpcwotCWluY2x1ZGVkIGluIHR3byBCRkQgbW9kdWxlcywgdGhpcyB3aWxsIGNhdXNlIGR1cGxpY2F0ZQotCWRlZmluaXRpb25zOyB0aGUgcm91dGluZXMgc2hvdWxkIGJlIGV4cG9ydGVkIHRvIGEgc2VwYXJhdGUsCi0JY29tbW9uLCBtb2R1bGUgKHByb2JhYmx5IGFsb25nIHdpdGggYSBtZXNzIG9mIG90aGVyIG9uZXMpLgotCi1TYXQgTWFyICAyIDEyOjExOjI2IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCUltcHJvdmUgbW9kdGltZSBzdXBwb3J0LgotCi0JKiBiZmQuaDogIEFkZCBib29sZWFuIG10aW1lX3NldCwgYW5kIGRlY2xhcmUgYmZkX2dldF9tdGltZS4KLQlSZW1vdmUgI2RlZmluZSBmb3IgYmZkX2dldF9tdGltZS4gIFJlbW92ZSBncmF0dWl0b3VzIGNvbW1lbnQuCi0JKiBiZmQuYyAoYmZkX2dldF9tdGltZSk6ICBOZXcgZm4sIGNhY2hlcyBtdGltZSwgZ2V0cyBpZiBub3QgY2FjaGVkLgotCUJVRzogIGFyY2hpdmUgbWVtYmVycyBzdGlsbCBkbyBub3QgZ2V0IGNvcnJlY3QgbW9kIHRpbWVzLgotCi0JSW1wcm92ZSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGZvciBjb3JlIGZpbGVzLgotCi0JKiBzdW5vcy5jIChzdHJ1Y3QgY29yZSk6ICBDaGFuZ2Ugdm9pZCAqZnBhX2R1bW15IHRvIGRvdWJsZSBmcF9zdHVmZi4KLQkoc3Vub3M0X2NvcmVfZmlsZV9wKTogIENyZWF0ZSBhIHNlY29uZCByZWdpc3RlcnMgc2VjdGlvbiBpbiB0aGUKLQljb3JlIGZpbGUsIGNhbGxlZCAiLnJlZzIiLCBmb3IgdGhlIGZsb2F0IHJlZ2lzdGVycy4KLQotVGh1IEZlYiAxNCAxNTo0OTowNiAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogbWFueSBjaGFuZ2VzIHRvIGltcHJvdmUgYXJjaGl2ZSBoYW5kbGluZzsgZm91bmQgYSBsb2dpYyBmbGF3IGluCi0JICBiZmRfY2hlY2tfZm9ybWF0IHdoaWNoIG9ubHkganVzdCBoYXBwZW5lZCB0byB3b3JrIGJ5IGNvb25jaWRlbmNlLgotCi1UaHUgRmViIDE0IDA3OjUzOjE2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGJmZC5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogZml4ZWQgdG8gdXNlIG91dHB1dF9vZmZzZXRzCi0JY29ycmVjdGx5LgotCi0JKiBiZmQuaDogY2hhbmdlZCB0eXBlIG9mIHVkYXRhIGluIGFzeW1ib2wgdG8gdm9pZCAqLCBsaWtlIGl0Ci0Jc2hvdWxkIGJlLiBBZGRlZCBiZmRfcmVsb2NfZGFuZ2Vyb3VzIGVudW0gbWVtYmVyLgotCi0JKiBjb2ZmLWNvZGUuaDogRml4ZWQgaXQgc28gdGhhdCBpbnRlcm5hbGx5IGdlbmVyYXRlZCBzeW1ib2xzIGdldAotCXRoZWlyIHZhbHVlcyByZWxvY2F0ZWQgY29ycmVjdGx5IGluIGFsbCBjYXNlcy4gUmVtb3ZlZCBjYWxscyB0bwotCXhtYWxsb2MuCi0KLQkqIGljb2ZmLmM6IE5vdCB1bmRlcnN0YW5kaW5nIHRoZSBkZXN0aW5hdGlvbiBzeW1ib2wgb2YgYSByZWxvYyBpcwotCW5vdCBhIGZhaWx1cmUgYW55IG1vcmUsIGp1c3QgJ2Rhbmdlcm91cycuIFRoaXMgYWxsb3dzIGxpbmtpbmcgb2YKLQliLm91dCBhbmQgY29mZiBpbWFnZXMuCi0KLQkqIHN1bm9zLmM6IENsZWFuZWQgdXAgdGhlIHdheSB0aGF0IFpNQUdJQyBzZWN0aW9uIHNpemVzIGFyZQotCWNhbGN1bGF0ZWQuCi0KLQotVHVlIEZlYiAxMiAxMzoyNTo0NiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBzdW5vcy5jICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IGZpeGVkCi0Jc3ltX3BvaW50ZXItPm5fdmFsdWUgc28gdGhhdCBzeW1ib2xzIG9uIHRoZSB3YXkgb3V0IGdldCB0aGVpcgotCXNlY3Rpb24gcmVsYXRpdmUgdmFsdWVzIGNhbGN1bGF0ZWQgY29ycmVjdGx5LgotCi0JKiBjb2ZmLWNvZGUuaCAobWFuZ2xlX3N5bWJvbHMpOiBmaXhlZCBwcm9ibGVtIHdoZXJlIHRhZ3Mgd2VyZSBub3QKLQliZWluZyByZWxvY2F0ZWQgZm9yIHN0cnVjdHMsIGVudW1zLCB1bmlvbnMuIEFsc28gdmFyaW91cyBsaW50cy4KLQotTW9uIEZlYiAxMSAxOTo1MjoyNiAxOTkxICBHdW1ieSBWaW5heWFrIFdhbGxhY2UgIChndW1ieSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChnZXRfZWx0X2F0X2ZpbGVwb3MpOiBzeXN0ZW1fY2FsbF9lcnJvciByZXR1cm5lZAotCSAgaW5jb3JyZWN0bHkuCi0KLVN1biBGZWIgMTAgMjM6MTg6NDAgMTk5MSAgR3VtYnkgVmluYXlhayBXYWxsYWNlICAoZ3VtYnkgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIFJlc29sdmUgdGhlIHVzZSBvZiBub19lcnJvciBhbmQgc3lzdGVtX2NhbGxfZXJyb3IuCi0JICBUaGUgYmZkIGxpYnJhcnkgaXRzZWxmIG5vdyB3aWxsIG5ldmVyIHNldCBiZmRfZXJyb3IgdG8KLQkgIG5vX2Vycm9yLgotCi0JICBUaGUgY29kZSBzdGlsbCBuZWVkcyB0byBiZSBjb21iZWQgdG8gbWFrZSBzdXJlIGFsbCB0aGUgZXJyb3IKLQkgIGNvZGVzIGFyZSBjb3JyZWN0LiAgSSBzdXNwZWN0IHRoZXkgYXJlIG5vdCBhbHdheXMgc2V0IGNvcnJlY3RseS4KLQotCSogVGhlIG5hbWVzIG9mIGFsbCB0aGUgbWVzc2FnZXMgaGF2ZSBfIHByZXBlbmRlZCBiZWNhdXNlIHRoZSBzdW4KLQkgIGJ1bmRsZWQgY29tcGlsZXIgY2FuJ3QgZGlzdGluZ3Vpc2ggZnJvbSBhIG1hY3JvIHdoaWNoIHRha2VzIGFuCi0JICBhcmd1bWVudCBhbmQgdGhlIHNhbWUgaWRlbnRpZmllciBpbiBhIG5vbi1tYWNybyBjb250ZXh0LgotCi0JKiBUaGUgcmVhc29uIGZvciB0aGUgYWJvdmUgYmVpbmcgdGhhdCBlbnRyeSBwb2ludHMgd2hpY2ggdXNlZCB0bwotCSAgYmUgdHJhbXBvbGluZSBmdW5jdGlvbnMgYXJlIG5vdyBqdXN0IG1hY3JvcyB3aGljaCBleHBhbmQgdG8gYQotCSAgZGlyZWN0IGNhbGwgdGhyb3VnaCB0aGUgYmZkJ3MgeGZlciB2ZWN0b3IuCi0KLQkqICguLi9pbmNsdWRlL2ludGVsLWNvZmYuaCkgRl9BUjMyV1I6IGZpeCB0aGlzIGNvbnN0YW50LiAgV2h5Ci0JICBtdXN0IGdhcyBoYXZlIGl0cyBvd24gdmVyc2lvbiBvZiBldmVyeXRoaW5nICh0aGUgZ2FzIHZlcnNpb24KLQkgIGhhZCB0aGUgY29ycmVjdCB2YWx1ZSkKLQotVHVlIEZlYiAgNSAxMTo0Njo1MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBiLm91dC5jOiBBZGRlZCBwYXRjaGVzIHN1cHBsaWVkIGJ5IGNocmlzYkBtaXBvbjIuaW50ZWwuY29tIHRvCi0JcHJvcGVybHkgc3VwcG9ydCBpOTYwIGFyY2hpdGVjdHVyZSBhbmQgb3V0cHV0IGNvcnJlY3QgcmVsb2Mgc3R1ZmYuCi0KLQkqIGJmZC5oOiBhZGRlZCBwcm90b3R5cGUgZm9yIGJmZF9wcmludGFibGVfYXJjaF9tYWNoLCBhZGRlZAotCUJGRF9GQUlMCi0KLQkqIGNvZmYtY29kZS5oOiBBcHBsaWVkIHBhdGNoZXMgZnJvbSBjaHJpc2IgdG8gc3VwcG9ydCBpOTYwCi0JYXJjaGl0ZWN0dXJlLCB6ZXJvIHJlbG9jcyBhbmQgc3dhcCB0aGVtIGNvcnJlY2x5IGFuZCBjb25kaXRpb25hbGx5Ci0JY29tcGlsZWQgdGhlIHRpbWVzdGFtcC4KLQotCSogc3Vub3MuYzogTWFkZSB0aGUgZGVmYXVsdCBzZWN0aW9uIGFsaWdubWVudCAyXjMgc28gdGhhdCBkb3VibGVzCi0JYXJlIGRvbmUgcHJvcGVybHkuIEZpeGVkIHRoZSBzYW1lIHJlbG9jIGJ1ZyB0aGF0IHdhcyBpbiBiLm91dC5jCi0KLQkqIHN5c2RlcC5oOiBOb3cgY29tcGlsZXMgb24gYSBQb3NpeCBib3gKLQotV2VkIEphbiAzMCAyMTozNjoyNiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGljb2ZmLmM6ICBGaXggY29tbWVudCBvbiBiaWctZW5kaWFuIHZlcnNpb24uCi0JKiBjb2ZmLWNvZGUuaDogIE1ha2UgSEFTX1JFTE9DIHJlYWxseSB3b3JrIChpdCdzIGJhY2t3YXJkcyBmcm9tCi0JRl9SRUxGTEcpLiAgU2V0IEZfQVIzMldSIGluIG91dHB1dCBmaWxlcyBpZiBsaXR0bGUgZW5kaWFuCi0JYXJjaGl0ZWN0dXJlLgotCi1UdWUgSmFuIDI5IDIwOjU2OjEwIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYXJjaHVyZXMuYyBmaXhlZCA9Lz09IHR5cG8KLQotCSogc3Vub3MuYyBhZGRlZCBhcmNoaXRlY3R1cmUgc3R1ZmYgZm9yIG91dHB1dC4gRml4ZWQKLQlidWcgd2hlcmUgZmlsZXMgd2hlcmUgdm1hKGRhdGEpICE9IHNpemUodGV4dCkKLQl3ZXJlIHByb2Nlc3NlZCB3cm9uZy4KLQotCSogY29mZi1jb2RlLmggYWRkZWQgYSBsaW50IGNhc3QKLQotCSogKC4uL2luY2x1ZGUvYS5vdXQuc3VuNC5oKSBmaXhlZCBpdCBzbyB6bWFnaWMKLQl3b3JrZWQKLQotTW9uIEphbiAyOCAxOToxNToyOSBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGFyY2hpdmUuYyByZW1vdmVkIGxvYWRzIG9mIGluY2x1ZGVzLCBhbmQgZml4ZWQgYnVnIHdoZXJlIHN0cmluZwotCXRhYmxlIGRpZG4ndCBoYXZlIGEgbnVsbCBhdCB0aGUgZW5kLgotCi0JKiBiZmQuYyBmaXhlZCBpbmNsdWRlcywgYWRkZWQgc3ltYm9scyBhcmd1bWVudCB0bwotCWNhbm9uaWNhbGl6ZV9yZWxvYyBlbnRyeSBwb2ludC4KLQotCSogbGliYmZkLmMgZml4ZWQgaW5jbHVkZXMgYW5kIGFkZGVkIHNvbWUgbGludCBwYXRjaGVzLgotCi0JKiB0YXJnZXRzLmMgYWRkZWQgYm90aCBzb3J0cyBvZiBpbnRlbCBjb2ZmLgotCi0JKiBiLm91dC5jIGZpeGVkIGluY2x1ZGVkLCBjaGFuZ2VkIHdhcyB0aGUgY2Fub25pY2FsCi0JcmVsb2NzIHdlcmUgZG9uZS4KLQotCSogaWNvZmYuYyBhZGRlZCBzdXBwb3J0IGZvciBjYWxsaiBhbmQgYmlnIGFuZCBsaXR0bGUKLQllbmlkaWFuIHRhYmxlcy4KLQotCSogb3BuY2xzLmMgYWRkZWQgY2htb2QreGluZyBmb3IgZmlsZXMgd2l0aCBFWEVDX1Agc2V0LgotCi0JKiBzdW5vcy5jIGZpeGVkIGluY2x1ZGVzLiBDaGFuZ2VkIGRlZmF1bHQgc2VjdGlvbgotCWFsaWduZW1lbnQgdG8gd29yZHMuIEZpeGVkIHJlbG9jYXRpb24gc3R1ZmYgdG8gd29yayB3aXRoCi0JbmV3IHNjaGVtZQotCi0JKiBiZmQuaCB2YXJpb3VzIG5ldyB0eXBlcyBhZGRlZCwgcHJvdG90eXBlIGZvciBuZXcKLQlyZWxvYyBjYWxscywgY2hhbmdlZCBiZmQtPmlvc3RyZWFtIHRvIGEgdm9pZCAqCi0JdG8gaW5jbHVkaW5nIGZpbGVzIGRvbid0IG5lZWQgc3RkaW8uaC4KLQotCSogbGliY29mZi5oIGFkZGVkIGNvbnZlcnNpb24gdGFibGUgdG8gdGllIHJlbG9jcyB0bwotCWNhbm9uaWNhbCBzeW1ib2xzCi0KLQkqIHN5c2RlcC5oIGNyZWF0ZWQKLQotCSogY29mZi1jb2RlLmggZml4ZWQgaW5jbHVkZXMuIEFkZGVkIGNvZGUgdG8gc3VwcG9ydAotCWJpZyBhbmQgbGl0dGxlIGVuZGlhbiBmb3JtYXRzLiBWYXJpb3VzIGxpbnRzLiBCZXR0ZXIKLQlwcm9jZXNzaW5nIG9mIHN5bWJvbHMuIENoYW5nZWQgcmVsb2Mgc3R1ZmYgdG8gbmV3Ci0Jb3JkZXIKLQotCSogbGliYmZkLmggZml4ZWQgaW5jbHVkZXMKLQotCi1Nb24gSmFuIDIxIDExOjUzOjUxIFBTVCAxOTkxIHN0ZXZlQGN5Z251cy5jb20KLQotCSogYmZkLmgJY2hhbmdlZCBuYW1lIG9mIGFsaWdubWVudCBlbnRyeSBpbiBzZWNfc3RydWN0IHRvCi0JYWxpZ25tZW50X3Bvd2VyLCBiZWNhdXNlIG9mIGNvbmZsaWN0aW5nIHVzZXMgd2l0aGluIGJmZC4KLQlOb3cgaXQgc2hvdWxkIGJlIG9idmlvdXMgdGhhdCBpdCdzIGEgMioqbiBhbGlnbm1lbnQKLQlzcGVjaWZpZXIuIFJlbW92ZWQgc3RhcnRfcGFkLCBlbmRfYWxpZ25tZW50LCBibG9jaywgbWluc2l6ZSwKLQlvdXRwdXRfZmlsZV9hbGlnbm1lbnQsIHN1YnNlY3Rpb25fYWxpZ25tZW50IGFuZCBvcmlnaW5hbF92bWEgZmllbGRzLgotCUFkZGVkIGFsaWduX3Bvd2VyKCkgbWFjcm8uIEZpeGVkIGJmZF9zZWN0aW9uX2FsaWdubWVudAotCWFjZXNzb3IgbWFjcm9zLiBBZGRlZCBiZmRfc3ltYm9sX3NhbWVfdGFyZ2V0IG1hY3JvLgotCi0JKiBiLm91dC5jIChiX291dF93cml0ZV9vYmplY3RfY29udGVudHMpIGZpeGVkIHRvIHVzZQotCW5ldyBhbGlnbm1lbnQgbWVtYmVyLiBGaXhlZCAoY2FsbGpfY2FsbGJhY2spIHRvIHVzZSBzZWN0aW9uCi0JcmVsYXRpdmUgc3ltYm9scyBwcm9wZXJseS4KLQotCSogc3Vub3MuYyAoc3Vub3M0X29iamVjdF9wKSBmaXhlZCB0byB1c2UgbmV3IGFsaWdubWVudF9wb3dlci4KLQlGaXhlZCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncykgdG8gY29ycmVjdGx5IG1ha2UKLQlzeW1ib2xzIHNlY3Rpb24gcmVsYXRpdmUuCi0KLQkqIGJmZC5jIChiZmRfZXJybXNnKSBmaXhlZCB2YXJpb3VzIGVudW0gY2FzdCBwcm9ibGVtcy4KLQkoYmZkX21ha2Vfc2VjdGlvbikgdG9vayBvdXQgaW5pdGlhbGl6YXRpb24gb2Ygb2Jzb2xldGUgbWVtYmVycy4KLQkoYmZkX3ByaW50X3N5bWJvbF92YW5kZikgYWRkZWQKLQotCSogb3BuY2xzLmMgKGJmZF9jcmVhdGUpIGNyZWF0ZWQuCi0KLQkqIGNvZmYtY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spIHRvb2sgYXdheSByZWZzCi0JdG8gb2Jzb2xldGUgbWVtYmVycy4gKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSkgYWRkZWQKLQljb252ZXJzaW9uIGJldHdlZW4gYWxpZ25tZW50IHR5cGVzLiAoY29mZl9zeW1ib2xfZnJvbSkKLQlhZGRlZC4gKGNvZmZfY291bnRfbGluZW51bWJlcnMpIG9ubHkgY291bnRzIGxpbmVudW1iZXJzCi0JaWYgc3ltYm9sIGlzIG9mIGNvZmYtdHlwZS4gKGNvZmZfbWFuZ2xlX3N5bWJvbHMpIG9ubHkKLQloZWF2aWx5IG1hbmdsZXMgc3ltYm9scyBpZiBzeW1ib2wgaXMgY29mZi10eXBlLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpIHZhcmlvdXMgbGludHMuIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cykKLQl2YXJpb3VzIGxpbnRzIGFuZCBtb2RpZmljYXRpb24gZm9yIGFsaWdubWVudCBjb252ZXJzaW9uLgotCShjb2ZmX3NsdXJwX3JlbG9jcykgZml4ZWQgZm9yIHVzZSB3aXRoIG5ldyBhc2VjdGlvbiBzaGFwZS4KLQotU2F0IEphbiAxOSAxNjoxMDo0MiBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGFyY2hpdmUuYyBsb3RzIG9mIGxpbnQKLQotCSogYi5vdXQuYyBhZGRlZCBjYWxsaiByZWxvY2F0aW9uIHN1cHBvcnQsIHVwZ3JhdGVkIHJlbG9jIGhvd3RvLgotCUZpeGVkIHNvIHRoYXQgYXN5bWJvbCBhbmQgcmVsb2MgcmVjb3JkcyBhcmUgb3V0cHV0Ci0JY29ycmVjdGx5LgotCi0JKiBiZmQuYyBsb3RzIG9mIGxpbnQsIHN1cHBvcnQgZm9yIG5ldyBiZmQgZW50cnkgcG9pbnQKLQliZmRfcHJpbnRfc3ltYm9sLgotCi0JKiBiZmQuaCBjaGFuZ2VkIGRlZmluaXRpb24gb2YgYXN5bWJvbCB0byBjb250YWluIHBvaW50ZXIgdG8KLQlvd25pbmcgYmZkLCByZW1vdmVkIHRhcmdldCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNhY2hlLmMgdG9vayBvdXQgcHJpbnQgc3RhdGVtZW50cywgcHV0IGluIEJGRF9BU1NFUlQgY2FsbHMuCi0KLQkqIGNvZmYtY29kZS5oIHZhcmlvdXMgbGludHMsIGNvcnJlY3RlZCBsaW5lbnVtYmVyIG91dHB1dAotCWZ1bmN0aW9uYWxpdHkuIEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBzdHlsZSBhc3ltYm9scyBhbmQKLQliZmRfcHJpbnRfc3ltYm9sLiBGaXhlZCBzbyB0aGF0IGFzeW1ib2wgYW5kCi0JcmVsb2MgcmVjb3JkcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuIEFkZGVkIHRpbWVzdGFtcC4KLQotCSogaWNvZmYuYyBBZGRlZCBzdXBwb3J0IGZvciBuZXcgaG93dG8gc2hhcGUuCi0KLQkqIGxpYmEub3V0LmggQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGFzeW1ib2wgc2hhcGUKLQotCSogbGliYmZkLmMgdmFyaW91cyBsaW50cwotCi0JKiBsaWJiZmQuaCB2YXJpb3VzIGxpbnRzCi0KLQkqIGxpYmNvZmYuaCBhZGRlZCBzdXBwb3J0IGZvciBuZXcgYXN5bWJvbCBzaGFwZS4KLQotCSogc3Vub3MuYyAgdmFyaW91cyBsaW50cy4gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IGFzeW1ib2wgc2hhcGUKLQlhbmQgYmZkX3ByaW50X3N5bWJvbC4KLQotV2VkIEphbiAxNiAyMTozODowOSBQU1QgMTk5MSBzdGV2ZUBjeWdudXMuY29tCi0KLQkqIGIub3V0LmMgcmVtb3ZlZCBwcm90b3R5cGUgb2Ygc3Vub3M0X2VubmF0aXZhdGVfc3ltdGFiLCBsb3RzIG9mCi0JcG9pbnRlciBsaW50LiBBZGRlZCBzdXBwb3J0IGZvciBjYWxsaiByZWxvY2F0aW9uLiBGaXhlZCBidWcgd2hlcmUKLQl0aGUgbGFzdCAzMiBieXRlcyBvZiB0aGUgdGV4dCBzZWN0aW9uIHdlcmUgb3ZlcndyaXR0ZW4gYnkgZGF0YS4gRml4ZWQgYnVnCi0Jd2hlcmUgYXJjaGl2ZXMgb2YgYi5vdXQgZGlkbid0IHdvcmsgZHVlIGJmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0JcmV0dXJuaW5nIGZhbHNlLgotCi0JKiBzdW5vcy5jIGFkZGVkIHN1cHBvcnQgZm9yIG5fb3RoZXIgZmllbGQuIEJyYWNlZCB0aGUgaG93dG8gdGFibGUgc28KLQl0aGF0IGl0IHdvbid0IGJlIGFmZmVjdGVkIGJ5IGFueSBsZW5ndGhpbmcgb2YgdGhlIGhvd3RvIHN0cnVjdCB0eXBlZGVmLgotCVZhcmlvdXMgbGludHMKLQotCSogYmZkLmggYWRkZWQgc3VwcG9ydCBmb3Igbl9vdGhlciBmaWVsZCwgYWRkZWQgc3BlY2lhbF9mdW5jdGlvbgotCXJlbG9jIHR5cGUsIG1vZGlmaWVkIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gcHJvdG90eXBlLiBBZGRlZCBiZmRfaF9nZXRfeAotCW1hY3Jvcy4KLQotCSogYmZkLmMgdXBncmFkZWQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgdmFyaW91cyBsaW50cy4KLQotV2VkIEphbiAxNiAwMTo1NTo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgcnRsKQotCi0JKiBDaGFuZ2VMb2c6ICBTdGFydGVkIENoYW5nZUxvZyBmb3IgQkZELgotCSogVG9EbzogIENyZWF0ZSBmaWxlIGZvciBzdWdnZXN0aW9ucy4KLQotCSogTWFrZWZpbGU6ICBTdXBwb3J0IGVhc3kgbG9hZGluZyBpbnRvIFNhYmVyIEMuCi0JQWRkIGRlcGVuZGVuY2llcyBmb3IgaWNvZmYubyBhbmQgYmNzODhrY29mZi5vLgotCVJlbmFtZSBjb2ZmLmMgdG8gY29mZi1jb2RlLmguICBDaGFuZ2UgY2FsbGVycy4KLQotCSogYmZkLmMgKGJmZF9jaGVja19mb3JtYXQpOiAgQWxsb3cgdGhlIGNoZWNrX2Zvcm1hdCByb3V0aW5lcwotCXRvIHJldHVybiB0aGUgZGVzaXJlZCB0YXJnZXQgdmVjdG9yLCByYXRoZXIgdGhhbiBqdXN0IGEgQm9vbGVhbi4KLQliZmQuaCAoYmZkX2NoZWNrX2Zvcm1hdCk6ICBDaGFuZ2UgZnVuY3Rpb24gcG9pbnRlciByZXR1cm4gdHlwZS4KLQlhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6ICBjaGFuZ2UgY2FsbGVlLgotCWIub3V0LmMgKGJfb3V0X2xpdHRsZV9vYmplY3RfcCwgYl9vdXRfYmlnX29iamVjdF9wLAotCWJfb3V0X3JlYWxfb2JqZWN0X3ApOiAgY2hhbmdlIGNhbGxlZS4KLQlsaWJiZmQuYyAoX2JmZF9kdW1teV90YXJnZXQpOiAgRHVtbXkgcm91dGluZSByZXBsYWNpbmcgYmZkX2ZhbHNlCi0JaW4gY2hlY2tfZm9ybWF0IHRyYW5zZmVyIHZlY3RvcnMgdGhhdCBuZWVkIGEgZmlsbGVyLgotCWxpYmJmZC5oIChiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0KTogIEZpeCBkZWNscy4KLQliY3M4OGtjb2ZmLmM6ICBjaGFuZ2UgY2FsbGVlLgotCWNvZmYtY29kZS5oIChjb2ZmX3JlYWxfb2JqZWN0X3AsIGNvZmZfYmlnX29iamVjdF9wKTogIGNoYW5nZSBjYWxsZWUuCi0JaWNvZmYuYzogIGNoYW5nZSBjYWxsZWUuCi0Jc3Vub3MuYyAoc3Vub3M0X29iamVjdF9wLCBzdW5vczRfY29yZV9maWxlX3ApOiAgY2hhbmdlIGNhbGxlZS4KLQotCSogbGliYmZkLmMgKHphbGxvYyk6ICBJdCBzaG91bGQgYWN0dWFsbHkgemVybyB0aGUgc3RvcmFnZSEKLQlUaGlzIHdhcyBjb21tZW50ZWQgb3V0IGZvciBzb21lIHJlYXNvbi4KLQotCSogbGliYmZkLmg6ICBBZGQgbWFsbG9jLCB4bWFsbG9jLCBtZW1jcHksIGFuZCBmYXRhbCBkZWNscy4KLQlUaGlzIGlzIHNvIGNhbGxlcnMgY2FuIGF2b2lkIDxzdGRsaWIuaD4gd2hpY2ggZG9lc24ndCBleGlzdAotCW9uIG9sZGVyIHN5c3RlbXMuCi0KLQkqIGJmZC5jIChtYXBfb3Zlcl9zZWN0aW9ucyk6ICBBZGQgZGVidWdnaW5nIGNvZGUsIHNpbmNlIEkKLQlub3RpY2VkIHRoZSBzZWN0aW9uIGNvdW50IGZvciBzdW5vcyBjb3JlIGZpbGVzIHdhcyBiYWQsIGJ1dCBvbmx5Ci0JR0RCIGhhZCBkZXRlY3RlZCB0aGUgcHJvYmxlbS4KLQkoYmZkX3NldF9zZWN0aW9uX2xpbmVub19zaXplLCBiZmRfc2V0X3NlY3Rpb25fbGluZW5vcywKLQliZmRfZ2V0X3NlY3Rpb25fbGluZW5vcyk6ICBSZW1vdmUgb2Jzb2xldGUgZnVuY3Rpb25zLgotCShiZmRfYXBwbHlfcmVsb2NhdGlvbnMpOiAgVXNlIGxvbmdzLCBub3QgaW50cywgZm9yIHRoZSBtYXRoLgotCi0JKiBiZmQuaDogIERlY2xhcmUgZW51bSBib29sZWFuIGFuZCBzdHJ1Y3QgYmZkX3RhcmdldCBhcyB3ZWxsCi0JYXMgdHlwZWRlZnMgZm9yIHRoZW0uICBSZW1vdmUgb2Jzb2xldGUKLQliZmRfZ2V0X3NlY3Rpb25fbGluZW5vX3NpemUuCi0KLQkqIGNhY2hlLmM6ICBNYWtlIHRoZSAiZmRvcGVuIiBzdXBwb3J0IHdvcmsuICBLZWVwIGJldHRlciB0cmFjawotCW9mIGhvdyBtYW55IGZpbGVzIGFyZSBvcGVuLiAgQ2VudHJhbGl6ZSB0aGUgb3BlbmluZyBvZiBmaWxlcwotCWFuZCBiZSBzdXJlIGJmZF9vcGVuW3J3XSBhY3R1YWxseSB0cnkgdG8gb3BlbiB0aGUgZmlsZS4gIEV2YWRlCi0JbGlua2VkIGxpc3QgaW5pdGlhbGl6YXRpb24gcHJvYmxlbXMuCi0KLQkqIGIub3V0LmMsIGNvZmYtY29kZS5oLCBvcG5jbHMuYywgc3Vub3MuYzogIGxpbnQuCi0KLQkqIGNvZmYtY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6ICBOdWxsLXRlcm1pbmF0ZSBzeW10YWIgbmFtZXMuCi0KLQkqIGNwbHVzLWRlbS5jOiAgRGVsZXRlIGZpbGUsIHNpbmNlIGl0IGlzIG5vdCBwYXJ0IG9mIEJGRC4KLQotCSogb3BuY2xzLmMgKGJmZF9vcGVucik6ICBFbGltaW5hdGUgbWlzcGxhY2VkICNpZiAwIGNvZGUuCi0JKGJmZF9vcGVuciwgYmZkX29wZW53KTogIEFjdHVhbGx5IG9wZW4gdGhlIGZpbGUsIGdpdmUgZXJyb3Igbm93LgotCi0JKiBzdW5vcy5jIChzdW5vczRfY29yZV9maWxlX3ApOiAgU2V0IHNlY3Rpb24gY291bnQuCi0JKHN1bm9zNF9zZXRfc2VjdGlvbl9saW5lbm9zLCBzdGFiX25hbWVzLCBmcHJpbnRfbmFtZSk6ICBFbGltaW5pYXRlCi0Jb2Jzb2xldGUgZGVmaW5pdGlvbnMuCi0JKF93cml0ZV9zeW1ib2xfdGFibGUpOiAgSW5pdGlhbGl6ZSA8aWR4PiBjb3VudGVyLgotCShmb29wKTogIEVsaW1pbmF0ZSBkZWJ1Z2dpbmcgY29kZS4KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2ctOTQ5NSBiL2JmZC9DaGFuZ2VMb2ctOTQ5NQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2ODU4My4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nLTk0OTUKKysrIC9kZXYvbnVsbApAQCAtMSwxMDA0MyArMCwwIEBACi1UaHUgRGVjIDIxIDEyOjQzOjQ5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogQWRkIGEgcGhvbnkgcmVsb2MgdG8gaGFuZGxlIHRoZQotCW9sZCBzdHlsZSBUT0MxNiByZWZlcmVuY2VzIHdpdGhvdXQgdXNpbmcgUl9QUENfR09ULgotCShwcGNfcmVsb2NfdHlwZSk6IERpdHRvLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogQWRkIHN1cHBvcnQgZm9yIFRPQzE2LgotCShwcGNfZWxmX3RvYzE2X2lubmVyKTogUmVuYW1lZCBmcm9tIHBwY19lbGZfZ290MTZfaW5uZXIuCi0JKHBwY19lbGZfdG9jMTZfcmVsb2MpOiBSZW5hbWVkIGZyb20gcHBjX2VsZl90b2MxNl9yZWxvYy4KLQkocHBjX2VsZl9nb3QxNl97aW5uZXIscmVsb2N9KTogU3R1YnMgZm9yIHJlYWwgR09UIHN1cHBvcnQuCi0JKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogTmV3IGZ1bmN0aW9uIGZvciBHT1QvUExUIHN1cHBvcnQgdGhhdCBpcwotCXdvcmsgaW4gcHJvZ3Jlc3MuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRGl0dG8uCi0JKHBwY19lbGZfYWRqdXN0X2R5bmluZHgpOiBEaXR0by4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEaXR0by4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEaXR0by4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERpdHRvLgotCShFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUik6IERlZmluZS4KLQotV2VkIERlYyAyMCAxOToxNDoxOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFdoZW4gYXR0YWNoaW5nIHNlY3Rpb25zIHRvCi0Jc2VnbWVudHMgaWdub3JlIHNlY3Rpb25zIHRoYXQgd29uJ3QgYmUgYWxsb2NhdGVkLiAgUGF0Y2ggZnJvbQotCUFuZHJlYXMgU2Nod2FiLgotCi1UdWUgRGVjIDE5IDIwOjAxOjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBNYXRjaCBvbiBtNjhrLWNibS0qIG9ubHkgaWYgT1MgZG9lc24ndCBtYXRjaAotCWFueXRoaW5nIGVsc2UuCi0KLVR1ZSBEZWMgMTkgMTY6Mzg6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoQ0FMQ19BRERFTkQpOiBEZWZpbmUuCi0JKGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIHRoZSBpbnB1dCBzZWN0aW9uIFZNQSB0byB0aGUKLQlhZGRlbmQgZm9yIFBDIHJlbGF0aXZlIHJlbG9jcy4KLQotU3VuIERlYyAxNyAyMDoxMTo1NSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9wZGF0YSk6IE11c3QgdGVzdCB0aGUgZW50aXJlIGVudHJ5IGZvciB6ZXJvCi0JdG8gY29ycmVjdGx5IHRlcm1pbmF0ZS4KLQotRnJpIERlYyAxNSAxMjowNTo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoZW51bSBiZmRfZW5kaWFuKTogRGVmaW5lLgotCShiZmRfdGFyZ2V0KTogUmVuYW1lIGJ5dGVvcmRlcl9iaWdfcCB0byBieXRlb3JkZXIsIGFuZCBjaGFuZ2UgaXQKLQlmcm9tIGJvb2xlYW4gdG8gZW51bSBiZmRfZW5kaWFuLiAgQ2hhbmdlIGhlYWRlcl9ieXRlb3JkZXJfYmlnX3AKLQljb3JyZXNwb25kaW5nbHkuCi0JKiBiZmQtaW4uaCAoYmZkX2JpZ19lbmRpYW4sIGJmZF9saXR0bGVfZW5kaWFuKTogTmV3IG1hY3Jvcy4KLQkoYmZkX2hlYWRlcl9iaWdfZW5kaWFuLCBiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4pOiBOZXcgbWFjcm9zLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogQWxsIHRhcmdldHM6IENoYW5nZSBpbml0aWFsaXphdGlvbiBvZiBieXRlb3JkZXIgYW5kCi0JaGVhZGVyX2J5dGVvcmRlciB0byB1c2UgZW51bSBiZmRfZW5kaWFuIHZhbHVlcyByYXRoZXIgdGhhbgotCWJvb2xlYW5zLgotCSogQWxsIGZpbGVzOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gYnl0ZW9yZGVyX2JpZ19wIGFuZAotCWhlYWRlcl9ieXRlb3JkZXJfYmlnX3AgdG8gdXNlIG5ldyBiZmRfKl9lbmRpYW4gbWFjcm9zLgotCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IFNldCBsbWEgdG8gc19wYWRkciwgbm90Ci0Jc192YWRkci4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IHNfcGFkZHIgdG8gbG1hLCBub3QKLQl2bWEuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCi1GcmkgRGVjIDE1IDA3OjMyOjA5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlW2ldLWkzODYuYyAoVEFSR0VUX1VOREVSU0NPUkUpOiBEZWZpbmUgdG8gJ18nLgotCi1UaHUgRGVjIDE0IDEzOjQ1OjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBMb3RzIG9mIG1pbm9yIGNsZWFudXBzLiAgTWFrZSBtYW55IGZ1bmN0aW9ucyByZXR1cm4KLQllcnJvcnMgcmF0aGVyIHRoYW4gY2FsbGluZyBhYm9ydC4gIEFsc286Ci0JKGllZWVfd3JpdGVfdHdvYnl0ZSk6IFJlbW92ZTsgY2hhbmdlIGNhbGxlcnMgdG8gY2FsbCBleGlzdGluZwotCWllZWVfd3JpdGVfMmJ5dGVzIGZ1bmN0aW9uLgotCShpZWVlX3dyaXRlX2V4cHJlc3Npb24pOiBEb24ndCBvdXRwdXQgdGhlIHNlY3Rpb24gdHdpY2Ugd2hlbgotCW91dHB1dHRpbmcgYSBsb2NhbCBzeW1ib2wuICBEb24ndCBlbWl0IGFuIGV4dHJhbmVvdXMgemVybyBpZiB0aGVyZQotCWlzIG9ubHkgb25lIHRlcm0uCi0JKGllZWVfc2x1cnBfc2VjdGlvbnMpOiBTZXQgdGhlIGxtYSBhcyB3ZWxsIGFzIHRoZSB2bWEuCi0JKGllZWVfYXJjaGl2ZV9wKTogVXNlIGJmZF9hbGxvY19ncm93IHJhdGhlciB0aGFuIGFuIG9ic3RhY2suCi0KLQkqIGloZXguYyAoaWhleF9zZXRfYXJjaF9tYWNoKTogRG9uJ3QgYWNjZXB0IGFueSBhcmNoaXRlY3R1cmUsIGp1c3QKLQlhIHJlY29nbml6ZWQgb25lIG9yIGJmZF9hcmNoX3Vua25vd24uCi0JKGloZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IERlZmluZSBhcyBiZmRfMGwsIHRvIHBlcm1pdCBvYmpjb3B5Ci0JdG8gc3VjY2VlZC4KLQkoaWhleF9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0KLVdlZCBEZWMgMTMgMTU6NDQ6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oOiBJbmNsdWRlIDxjdHlwZS5oPi4KLQkoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190YWJsZSk6IERlZmluZS4KLQkoc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMpOiBEZWZpbmUuCi0JKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkpOiBEZWZpbmUuCi0JKGFvdXRfbGlua19pbmNsdWRlc19sb29rdXApOiBEZWZpbmUgbWFjcm8uCi0JKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBpbmNsdWRlcyBmaWVsZC4KLQkoYW91dF9saW5rX2luY2x1ZGVzX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJbml0aWFsaXplIGluY2x1ZGVzIGhhc2ggdGFibGUuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogRWxpbWluYXRlIGR1cGxpY2F0ZSBOX0JJTkNMIGVudHJpZXMuCi0KLVdlZCBEZWMgMTMgMTA6NTI6MTQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBNYXRjaCBvbiBtaXBzLSotKiBpbnN0ZWFkIG9mIG1pcHMtaWR0LWVjb2ZmLgotCi1XZWQgRGVjIDEzIDExOjA3OjQ1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogcmVtb3ZlZCBkZWJ1Z2dpbmcgY29kZS4KLQotVHVlIERlYyAxMiAxNzo0MjowNiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9yZWxvYyk6IE5ldyBmdW5jdGlvbiB0byBkdW1wIHRoZSAucmVsb2Mgc2VjdGlvbi4KLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IGNhbGwgcGVfcHJpbnRfcmVsb2MuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayk6IC5yZWxvYyBzZWN0aW9uIGFsaWdubWVudC4KLQkqIGNvZmYtcHBjLmMgKGluX3JlbG9jX3ApOiBBZGRlZCBtaXNzaW5nIG5vbi1lbGlnaWJsZSByZWxvY3MuIFNwaWZmZWQKLQl1cCBzb21lIGRlYnVnZ2luZyBhcyB3ZWxsLgotCi1UdWUgRGVjIDEyIDExOjM0OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogSGFuZGxlIHNwYXJjLSotZWxmKi4gIEZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZQotCTxyZmdAbW9ua2V5cy5jb20+LgotCi1GcmkgRGVjICA4IDE3OjQ3OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTZXQgc2VjdGlvbl9jb3VudCB0byAwCi0Jd2hlbiBzZXR0aW5nIHNlY3Rpb25zIHRvIE5VTEwuCi0KLVdlZCBEZWMgIDYgMTc6MDU6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvKTogQWRkIGV4cG9ydF9kZWZpbmVkcwotCWZpZWxkLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIGV4cG9ydF9kZWZpbmVkcyBwYXJhbWV0ZXIuCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IElmIGV4cG9ydF9kZWZpbmVkcyBpcyBzZXQsIHNldCBYQ09GRl9FWFBPUlQKLQlmb3IgYWxsIHN5bWJvbHMuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIERlYyAgNCAxNjo0MDo0NyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBSZW1vdmVkIHNvbWUgZGVidWdnaW5nIHByaW50ZidzCi0KLU1vbiBEZWMgIDQgMTE6MjU6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IEhhbmRsZSByZWNvcmQgdHlwZXMgNCBhbmQgNS4KLQkoaWhleF9vYmplY3RfcCk6IFBlcm1pdCB0eXBlcyA0IGFuZCA1LgotCShpaGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogUmVtb3ZlIGNoZWNrIGZvciBvdXQgb2YgcmFuZ2UKLQlhZGRyZXNzZXMuCi0JKGloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogR2VuZXJhdGUgdHlwZXMgNCBhbmQgNS4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogSnVzdCBpZ25vcmUgd2FybmluZyBhbmQKLQlpbmRpcmVjdCByZWZlcmVuY2VzIHRvIHN5bWJvbHMgd2hpY2ggZG9uJ3QgcmVhbGx5IGV4aXN0LgotCi1TdW4gRGVjICAzIDE5OjAwOjI3IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogTWlub3IgZm9ybWF0IGZpeGVzCi0JKHBlX3ByaW50X2VkYXRhKTogTmV3IGZ1bmN0aW9uLiBVbmRlciBwcml2YXRlIHByaW50aW5nLCB0aGlzIGZvcm1hdHMKLQl0aGUgZWRhdGEgc2VjdGlvbiBvZiBhIFBFIGZpbGUuCi0JKHBlX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGRlZCBjYWxsIHRvIHBlX3ByaW50X2VkYXRhLgotCi1TdW4gRGVjICAzIDE2OjQ2OjU0IDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogYW91dC1hcm0uYyAoTVlfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVXNlIEtFRVBJVCB0byBnZXQgdGhlIHN5bWJvbAotCWluZGV4LCBkb24ndCBjYWxsIHN0b2kuCi0KLUZyaSBEZWMgIDEgMTQ6NDY6NTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IFNldCBsbWEgYXMgd2VsbCBhcyB2bWEuCi0KLQkqIGloZXguYzogTmV3IGZpbGU7IHN1cHBvcnQgZm9yIEludGVsIEhleCBmb3JtYXQuCi0JKiB0YXJnZXRzLmMgKGVudW0gYmZkX2ZsYXZvdXIpOiBBZGQgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIuCi0JKGloZXhfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBbHdheXMgaW5jbHVkZSBpaGV4X3ZlYy4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBpaGV4X2RhdGEgZmllbGQgdG8gdGRhdGEgdW5pb24uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogQWRkIGloZXgubwotCShCRkRfTElCU19DRklMRVMpOiBBZGQgaWhleC5jLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IFNvcnQgdGhlIHNlY3Rpb25zIGluCi0JZWFjaCBzZWdtZW50LgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IFJldHVybiB0aGUgcmlnaHQgc2l6ZSBpZiBzZWdtZW50X21hcCBpcwotCW5vdCBOVUxMLgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCBib3RoZXIgdG8gc29ydCB0aGUgc2VjdGlvbnMuCi0KLQkqIGJmZC5jIChiZmRfcmVjb3JkX3BoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX3JlY29yZF9waGRyKTogRGVjbGFyZS4KLQkqIGJmZF9pbjIuaDogUmVidWlsZC4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBib2d1cwotCUJGRF9BU1NFUlQuCi0KLQkqIGxpYmJmZC5jIChiZmRfbWFsbG9jLCBiZmRfcmVhbGxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF96bWFsbG9jKTogUmV0dXJuIFBUUiwgbm90IGNoYXIgKi4gIFRha2Ugc2l6ZV90LCBub3QKLQliZmRfc2l6ZV90eXBlLgotCSogbGliYmZkLWluLmggKGJmZF9tYWxsb2MsIGJmZF9yZWFsbG9jKTogRGVjbGFyZS4KLQkoYmZkX3ptYWxsb2MpOiBDaGFuZ2UgZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1hbnkgZmlsZXM6IFVzZSBiZmRfbWFsbG9jIGFuZCBiZmRfcmVhbGxvYyByYXRoZXIgdGhhbiBtYWxsb2MKLQlhbmQgcmVhbGxvYy4gIERvbid0IHNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmIHRoZXkgZmFpbC4KLQotVGh1IE5vdiAzMCAxOTozMjoyNiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYzogQWRkZWQgbWFjcm9zIHRvIHRpZHkgdXAgdG9jIGNlbGwgdHJlYXRtZW50LiBOdW1lcm91cwotCXVzZXMgYXMgd2VsbC4gQWRkZWQgYSBuZXcgaG93dG8gdG8gZGVhbCB3aXRoIFRPQ1JFTDE2IHJlbG9jcyB0aGF0Ci0JYXJlIFRPQ0RFRk4gYXMgd2VsbC4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEV4cGFuZGVkIHRyZWF0bWVudCBvZiBBRERSMzJOQiByZWxvY3MKLQl0byBoYW5kbGUgUlZBIHJlbG9jcyBmcm9tIGRsbHRvb2wuCi0JKHBwY19jb2ZmX3J0eXBlMmhvd3RvKTogVE9DREVGTiByZWxvYyBhZGRpdGlvbi4KLQkoY29mZl9wcGNfcnR5cGVfdG9faG93dG8pOiBUT0NERUZOIHJlbG9jIGFkZGl0aW9uLgotCShwcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IFRPQ0RFRk4gcmVsb2MgYWRkaXRpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogY2hlY2sgaWRhdGEkWCBzZWN0aW9ucwotCXRvIGdldCB0aGUgcmlnaHQgc2VjdGlvbiBhbGlnbm1lbnQuCi0KLVRodSBOb3YgMzAgMTY6NDg6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IERvbid0IHNldCBsbWEgYmFzZWQgb24KLQlwX3BhZGRyIGlmIHBfcGFkZHIgaXMgemVyby4KLQkobWFrZV9tYXBwaW5nKTogU2V0IGluY2x1ZGVzX2ZpbGVoZHIgYW5kIGluY2x1ZGVzX3BoZHJzIGZvciBmaXJzdAotCVBUX0xPQUQgc2VnbWVudC4KLQkobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogU2V0IGluY2x1ZGVzX3BoZHJzIGZvciBQVF9QSERSCi0Jc2VnbWVudC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEhhbmRsZSBpbmNsdWRlc19maWxlaGRyIGFuZAotCWluY2x1ZGVzX3BoZHJzLiAgUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YgUFRfUEhEUiBhbmQgZmlyc3QKLQlQVF9MT0FEIHNlZ21lbnRzLgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBTZXQgaW5jbHVkZXNfZmlsZWhkciBhbmQgaW5jbHVkZXNfcGhkcgotCXdoZW4gYXBwcm9wcmlhdGUuICBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiBQVF9QSERSIHNlZ21lbnQuCi0JVXNlIGEgbW9yZSBjb21wbGV4IGNvbmRpdGlvbiBmb3Igd2hlbiBhIHNlY3Rpb24gaXMgaW5jbHVkZWQgaW4gYQotCXNlZ21lbnQgdG8gaGFuZGxlIFNvbGFyaXMgbGlua2VyIG9kZGl0aWVzLgotCi1UaHUgTm92IDMwIDExOjE3OjMzIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb2ZmLW04OGsuYyAoaG93dG9fdGFibGUpOiBSZWZvcm1hdHRlZCBmb3IgZWFzaWVyIHJlYWRpbmc7Ci0Jc3BlY2lhbF9mdW5jdGlvbiBub3cgcG9pbnRzIHRvIG5ldyBmdW5jdGlvbiBtODhrX3NwZWNpYWxfcmVsb2MuCi0JKGhvd3RvX2h2cnQxNik6IEZ1bmN0aW9uIHByZXZpb3VzbHkgdXNlZCBmb3IgaGFuZGxpbmcgSFZSVDE2IHJlbG9jcwotCXJlbW92ZWQuCi0JKHJ0eXBlMmhvd3RvKTogRG8gbm90IGFkZCByZWxvYydzIHJfb2Zmc2V0IHRvIHRoZSBhZGRlbmQsIHRoaXMgd2lsbAotCWJlIGRvbmUgY29ycmVjdGx5IGJ5IG04OGtfc3BlY2lhbF9yZWxvYy4KLQkocmVsb2NfcHJvY2Vzc2luZyk6IE5ldyBmdW5jdGlvbiB0byBiZSB1c2VkIGJ5IFJFTE9DX1BST0NFU1NJTkcuCi0JKFJFTE9DX1BST0NFU1NJTkcpOiBEZWZpbmUgdG8gY2FsbCByZWxvY19wcm9jZXNzaW5nLgotCi1XZWQgTm92IDI5IDEyOjQyOjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9pZGF0YSk6IENhbGwgbWFsbG9jIHJhdGhlciB0aGFuIHhtYWxsb2MuCi0JKHBlX3ByaW50X3BkYXRhKTogTGlrZXdpc2UuCi0KLQkqIG9wbmNscy5jIChiZmRfYWxsb2NfYnlfc2l6ZV90KTogU2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYKLQlvYnN0YWNrX2FsbG9jIGZhaWxzLgotCShiZmRfYWxsb2NfZmluaXNoKTogU2V0IGJmZF9lcnJvcl9ub19tZW1vcnkgaWYgb2JzdGFja19maW5pc2gKLQlmYWlscy4KLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IFNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmIG1hbGxvYyBmYWlscy4KLQkqIE1hbnkgZmlsZXM6IGRvbid0IHNldCBiZmRfZXJyb3Jfbm9fbWVtb3J5IGlmIG9uZSBvZiB0aGUgYWJvdmUKLQlyb3V0aW5lcyBmYWlscy4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBEb24ndCBhZGp1c3QgcF9wYWRkcgotCWlmIHBfcGFkZHJfdmFsaWQgaXMgc2V0LgotCShjb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogQ2FsbCBjb3B5X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogRml4IGNhc2Ugd2hlcmUgZXh0cmEKLQlwcm9ncmFtIGhlYWRlcnMgd2VyZSBhbGxvY2F0ZWQuCi0KLQkqIGVsZi5jIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUgdG8KLQlfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhLgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2NfaW4pOiBEb24ndCBhYm9ydCBpZgotCXJfc3ltbmR4IGlzIFJFTE9DX1NFQ1RJT05fTk9ORSBmb3IgYW4gQUxQSEFfUl9JR05PUkUgcmVsb2MuCi0JQ2hhbmdlIGEgUkVMT0NfU0VDVElPTl9MSVRBIHN5bW5keCB0byBSRUxPQ19TRUNUSU9OX0FCUy4KLQkoYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQpOiBDaGFuZ2UgUkVMT0NfU0VDVElPTl9BQlMgdG8KLQlSRUxPQ19TRUNUSU9OX0xJVEEgZm9yIEFMUEhBX1JfSUdOT1JFLgotCShhbHBoYV9hZGp1c3RfcmVsb2Nfb3V0KTogRm9yIEFMUEhBX1JfSUdOT1JFLCBkb24ndCBjaGFuZ2UKLQlSRUxPQ19TRUNUSU9OX0FCUyB0byBSRUxPQ19TRUNUSU9OX05PTkUuCi0KLVR1ZSBOb3YgMjggMTY6NTk6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIHNlZ21lbnRfbWFwIGZpZWxkLgotCSogZWxmLmMgKG1ha2VfbWFwcGluZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9zb3J0X3NlY3Rpb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogUmVtb3ZlLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IFJlbW92ZSBzb3J0ZWRfaGRycywgY291bnQsIGFuZAotCW1heHBhZ2VzaXplIHBhcmFtZXRlcnMuICBTaW1wbGlmeS4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBXaGVuIGdlbmVyYXRpbmcgYW4KLQlleGVjdXRhYmxlLCB1c2UgYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cy4KLQkoZWxmX3NvcnRfaGRycyk6IFJlbW92ZS4KLQkoX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMpOiBSZW1vdmUgZWxpbWluYXRlZCBwYXJhbWV0ZXJzIGZyb20gY2FsbAotCXRvIGdldF9wcm9ncmFtX2hlYWRlcl9zaXplLgotCi1Nb24gTm92IDI3IDEyOjI3OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaHAzMDBocHV4LmMgKE1ZKGNhbGxiYWNrKSk6IFNldCBsbWEgYXMgd2VsbCBhcyB2bWEuCi0KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYgMi43LgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSk6IFNldCBjb3JyZWN0bHksIHRvIDEuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkpOiBTZXQgY29ycmVjdGx5LCB0byAwLgotCi1XZWQgTm92IDIyIDEyOjAyOjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogSGFuZGxlIC5yY29uc3Qgc2VjdGlvbi4KLQkoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IEhhbmRsZSBTVFlQX1JDT05TVC4KLQkoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogSGFuZGxlIHNjUkNvbnN0LgotCShlY29mZl9zbHVycF9yZWxvY190YWJsZSk6IEhhbmRsZSBSRUxPQ19TRUNUSU9OX1JDT05TVC4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSGFuZGxlIC5yY29uc3Qgc2VjdGlvbi4KLQkoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBIYW5kbGUgc2NSQ29uc3QuCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogSGFuZGxlIC5yY29uc3Qgc2VjdGlvbi4KLQkoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogSGFuZGxlIHNjUkNvbnN0LgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jKTogSGFuZGxlIC5yY29uc3QKLQlzZWN0aW9uLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJFTE9DX1NFQ1RJT05fUkNPTlNULgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogT25seSBzZXQgd3JpdHRlbiBpZiB0aGUKLQlERUZfRFlOQU1JQyBmbGFnIGlzIHNldC4KLQotVHVlIE5vdiAyMSAxMzoyNToyOSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaG9zdC1hb3V0LmM6IElmIFRSQURfSEVBREVSIGlzIGRlZmluZWQsIGluY2x1ZGUgaXQuCi0KLVR1ZSBOb3YgMjEgMTM6MDM6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChBQ19QUk9HX0NDKTogUmVtb3ZlIGxvY2FsIGRlZmluaXRpb24uCi0JKEJGRF9CSU5BUllfRk9QRU4pOiBSZXF1aXJlIEFDX0NBTk9OSUNBTF9TWVNURU0uCi0JKEJGRF9ORUVEX0RFQ0xBUkFUSU9OKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX05FRURfREVDTEFSQVRJT04uCi0JKiBhY2NvbmZpZy5oOiBQdXQgTkVFRF9ERUNMQVJBVElPTl8qIGluIEBUT1BAIHNlY3Rpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotCSogeGNvZmZsaW5rLmMgKGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDbGVhcgotCXNwZWNpYWxfc2VjdGlvbnMgYmVmb3JlIHJldHVybmluZyB3aGVuIGNhbGxlZCB3aXRoIGEgbm9uIFhDT0ZGCi0JQkZELgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IFNvcnQgY29tbW9uIHN5bWJvbHMgd2l0aAotCWdsb2JhbCBzeW1ib2xzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IE9ubHkgcGFkIHRoZQotCXByZXZpb3VzIHNlY3Rpb24gdG8gZm9yY2UgZmlsZSBhbGlnbm1lbnQgd2hlbiBjcmVhdGluZyBhbgotCWV4ZWN1dGFibGUuCi0KLU1vbiBOb3YgMjAgMTQ6NTQ6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmCi0JUlM2MDAwQ09GRl9DLCBzZXQgdXAgdGhlIC5kZWJ1ZyBzZWN0aW9uLgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBBZGp1c3QgdGhlIFRPQyBhbmNob3IgdmFsdWUKLQlpZiBpdCBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGFjY29tb2RhdGUgdGhlIGVudGlyZSBUT0MgYXJlYSB3aXRoCi0Jc2lnbmVkIDE2IGJpdCBvZmZzZXRzLgotCSh4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sKTogSGFuZGxlIG5lZ2F0aXZlIFRPQyBvZmZzZXRzIGluIGdsb2JhbAotCWxpbmthZ2UgY29kZS4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IEFkanVzdCByZWxvY2F0aW9ucyBhZ2FpbnN0IGEKLQlUT0MgYW5jaG9yIHRvIHVzZSB0aGUgVE9DIHZhbHVlIHVzZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1TYXQgTm92IDE4IDE4OjAxOjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBDYXN0IG1hbGxvYyByZXR1cm4uCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IExpa2V3aXNlLgotCi1TYXQgTm92IDE4IDE5OjQzOjA0IDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogcGUtYXJtLmM6IEZpeCB0eXBvcy4KLQkqIGNvZmYtYXJtLmM6IExpa2V3aXNlLgotCi1GcmkgTm92IDE3IDE2OjIyOjA0IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jIChsaXN0X2VsZSk6IEFkZGVkICJjYXQiZWdvcnkgbWVtYmVyLgotCShyZWNvcmRfdG9jKTogTmV3IGNhdGVnb3J5IHBhcmFtZXRlciAocHJpdiBvciBwdWIpLgotCShwcGNfcmVjb3JkX3RvY19lbnRyeSk6IENoZWNrIHRvIHNlZSBpZiB0b2MgYm91bmRzIGV4Y2VlZGVkLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IFJlbW92ZWQgZW1icmlvbmljIGRhdGEtaW4tdG9jIGZyb20KLQl0aGUgbWFpbmxpbmUuIEl0IGFkZGVzIGV4dHJhIHRvYyBjZWxscyBpbiBlcnJvci4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IEFkZGVkIHNvbWUgZG9jdW1lbnRhdGlvbi4KLQkoZHVtcF90b2MpOiBDYW4gbm93IGRpYWdub3NlICJ2aXJ0dWFsIHRvYyIgY2hpY2FuZXJ5LgotCi1GcmkgTm92IDE3IDEwOjQxOjI1IDE5OTUgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBDaGFuZ2UgdHlwZSBvZgotCWR5bnN5bWNvdW50IGFuZCBidWNrZXRjb3VudCBmaWVsZHMgZnJvbSBzaXplX3QgdG8gYmZkX3NpemVfdHlwZS4KLQotRnJpIE5vdiAxNyAxMDowMjo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayk6IEk5NjAgdmVyc2lvbjogZG9uJ3QKLQlwb2ludGVyaXplIENfTEVBRlNUQVQgb3IgQ19MRUFGRVhUIGVudHJpZXMuCi0KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBPbmx5IGNyZWF0ZQotCURUX0lOSVQgYW5kIERUX0ZJTkkgZW50cmllcyBpZiB0aGUgX2luaXQgb3IgX2Zpbmkgc3ltYm9sIGlzCi0JZGVmaW5lZCBvciBtZW50aW9uZWQgaW4gYSByZWd1bGFyIGZpbGUuCi0KLVRodSBOb3YgMTYgMTU6MTY6NDIgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfZGF0YV9pbl90b2NfZW50cnkpOiBuZXcgZnVuY3Rpb24KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBUT0NERUZOIGF0dHJpYnV0ZQotCShjb2ZmX3BwY19yZWxvY2F0ZV9zZWN0aW9uKTogQ29ycmVjdCBSRUwyNCBoYW5kbGluZwotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IENvcnJlY3QgVE9DREVGTiBoYW5kbGluZwotCi0JKiBwZWljb2RlLmggKGRpcl9uYW1lcyk6IEFkZGVkIG5hbWUgZGVzY3JpcHRpb25zCi0KLVRodSBOb3YgMTYgMDM6Mzg6MDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIFZFUlNJT046IFVwZGF0ZWQgdG8gY3lnbnVzLTIuNi4KLQotV2VkIE5vdiAxNSAxOTozMDowNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChtNjhrNGtuZXRic2RfdmVjKTogRGVjbGFyZS4KLQotV2VkIE5vdiAxNSAxODowNTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IENoYW5nZSB0eXBlIG9mIHNlY29uZCBhcmd1bWVudCB0bwotCV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBmcm9tIHZvaWQgKiB0byBQVFIuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQ2FzdAotCXVzaW5nIFBUUiByYXRoZXIgdGhhbiB2b2lkICouCi0JKiBiZmQtaW4yLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IENoYW5nZSB2ZmlsZSBmcm9tIHZvaWQgKgotCXRvIFBUUi4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUgYXMKLQlfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgcmF0aGVyIHRoYW4gY2FzdGluZwotCWJmZF90cnVlLgotCi1XZWQgTm92IDE1IDA0OjA5OjE0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmRlcDEpOiBGaXggc3R1cGlkIHR5cG8gaW4gbGFzdCBjaGFuZ2UuICBSZW1vdmUgYW55Ci0JIkRPIE5PVCBERUxFVEUiIGxpbmVzIG9yIGJsYW5rIGxpbmVzIHRoYXQgbWtkZXAgd3JpdGVzIG9uIHNvbWUKLQlzeXN0ZW1zLgotCShCRkRfTElCU19DRklMRVMsIEFMTF9NQUNISU5FU19DRklMRVMsIEJGRDMyX0JBQ0tFTkRTX0NGSUxFUywKLQlCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBOZXcgdmFyaWFibGVzLgotCShDRklMRVMpOiBVc2UgdGhlbS4KLQotVHVlIE5vdiAxNCAxMTo1MjoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogRm9yIFBQQyBQRSwgc3RhcnQgaXNpemUgYXQgMCwKLQlub3QgYXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHNlY3Rpb24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEF2b2lkIHVzaW5nCi0JdW5wb3J0YWJsZSAjZWxpZi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBXaGVuIGdlbmVyYXRpbmcgYSBQUEMgUEUgZXhlY3V0YWJsZQotCXdpdGggbm8gc3ltYm9scywgcm91bmQgdXAgdGhlIGZpbGUgc2l6ZSB0byBhIENPRkZfUEFHRV9TSVpFCi0JYm91bmRhcnkuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IElmIHRoZXJlIGFyZSBubyBzeW1ib2xzLAotCWRvbid0IHdyaXRlIG91dCBhIHN0cmluZyB0YWJsZS4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFdoZW4gdXNpbmcgYSBkaWZmZXJlbnQgc2VjdGlvbgotCWhlYWRlciwgcGFzcyB0aGUgbmV3IG9uZSB0byBfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IERvbid0IHNldCBzaF9pbmZvIGFuZCBzaF9lbnRzaXplIGZpZWxkcy4KLQkoZWxmX21hcF9zeW1ib2xzKTogQWRkIHNlY3Rpb24gVk1BIHRvIHN5bWJvbCB2YWx1ZSB3aGVuIGNvbXBhcmluZwotCWFnYWluc3QgMC4KLQkoX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogT25seSBidWlsZCBzeW1ib2wgdGFibGUKLQlpZiB0aGVyZSBhcmUgc29tZSBzeW1ib2xzLiAgU2V0IGZpbGUgb2Zmc2V0IG9mIHN5bXRhYiBhbmQgc3RydGFiCi0Jc2VjdGlvbnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogUmVtb3ZlIGRvc3ltcyBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLiAgTmV2ZXIgc2V0IGZpbGUgb2Zmc2V0IG9mIHN5bXRhYiBhbmQgc3RydGFiCi0Jc2VjdGlvbnMuCi0JKF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKE1BUF9PTkVTWU1UQUIsIE1BUF9EWU5TWU1UQUIsIE1BUF9TVFJUQUIsIE1BUF9TSFNUUlRBQik6IERlZmluZS4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShzd2FwX291dF9zeW1zKTogQ2hlY2sgZm9yIHNwZWNpYWwgbWFwcGluZyBvZiBzdF9zaG5keCBjcmVhdGVkIGJ5Ci0JY29weV9wcml2YXRlX3N5bWJvbF9kYXRhLgotCSogZWxmeHgtdGFyZ2V0Lmg6IFVzZSBuZXcgY29weSByb3V0aW5lcy4KLQkqIGVsZi1iZmQuaCAoX2JmZF9lbGZfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogRGVjbGFyZS4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IERlY2xhcmUuCi0KLQkqIGNvbmZpZy5iZmQgKHNoLSotKik6IFNldCB0YXJnX2RlZnZlYyB0byBzaGNvZmZfdmVjLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIENPRkZfV0lUSF9QRSwgaGFuZGxlCi0JQ19OVF9XRUFLLgotCi0JKiBjb2ZmLXNoLmMgKHNobGNvZmZfdmVjKTogVXNlIF9iZmRfZ2VuZXJpY19hcmNoaXZlX3AsIG5vdAotCV9iZmRfZHVtbXlfdGFyZ2V0LCBtYXRjaGluZyB0aGUgcmVjZW50IGNoYW5nZSB0byBhcmNoaXZlCi0JcmVjb2duaXRpb24uCi0KLU1vbiBOb3YgMTMgMTM6MjQ6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldF9maWxlX3dpbmRvdyk6IFVzZSBjYXN0cyB0byBhdm9pZCBkb2luZwotCWFyaXRobWV0aWMgb24gUFRSIHR5cGVzLgotCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBTZXQgdGhlIGxtYSBvZiB0aGUgc2VjdGlvbnMuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIpOiBUdXJuIGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQKLQlzeW1ib2wgaW50byBhIHJlbG9jIGFnYWluc3QgdGhlIHNlY3Rpb24uCi0KLU1vbiBOb3YgMTMgMDc6MzE6MzUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IGFkZGVkIHN1cHBvcnQgZm9yIGlubGluZQotCWdsdWUgZm9yIHRoZSByZWxvY3M6IElNR0xVRSBhbmQgSUZHTFVFLgotCShyZWNvcmRfdG9jKTogbmV3IGZ1bmN0aW9uIC0gdHJhY2tzIHRvYyBjb250ZW50cwotCShwcGNfbWFya19zeW1ib2xfYXNfZ2x1ZSk6IG5ldyBmdW5jdGlvbiAtIHN1cHBvcnRzIHRoZSBJTUdMVUUgcmVsb2MKLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEFkZGVkIHN1cHBvcnQgYW5kIGZpeGVzIGZvciBJTUdMVUUvSUZHTFVFCi0JKHBwY19jb2ZmX3J0eXBlMmhvd3RvKTogcmVtb3ZlZCBpbnZhbGlkIElNR0xVRSBoYWNrCi0JKGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvKTogcmVtb3ZlZCBpbnZhbGlkIElNR0xVRSBoYWNrCi0JKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogUmVtb3ZlZCBhIGRlYnVnIGRlZmluZSAoZHVoKQotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogRml4ZWQgaW52YWxpZCBzdHJjbXAgZm9yICIucmVsZGF0YSIKLQkocGVfcHJpbnRfaWRhdGEpOiBOZXcgZnVuY3Rpb24gLSBmb3JtYXRzIHRoZSBpZGF0YSBzZWN0aW9uIGRhdGEKLQkocGVfcHJpbnRfcGRhdGEpOiBOZXcgZnVuY3Rpb24gLSBmb3JtYXRzIHRoZSBwZGF0YSBzZWN0aW9uIGRhdGEKLQkocGVfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IGNhbGxzIHRvIGFib3ZlCi0KLVN1biBOb3YgMTIgMTI6MjM6MjQgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoYmZkX2xpYnNfaGVyZSwgZXRjKTogUHJvdmlkZSBlbXB0eSBkZWZpbml0aW9ucy4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfdmVjKTogQWRkIGNvbmRpdGlvbmFsIGRlZmluZXMKLQlUQVJHRVRfU1lNIGFuZCBUQVJHRVRfTkFNRSBmb3IgdmVjdG9yIGFuZCBCRkQgbmFtZS4KLQkqIGNvZmYtcG1hYy5jIChwbWFjX3hjb2ZmX3ZlYyk6IFJlbW92ZS4KLQkoVEFSR0VUX1NZTSwgVEFSR0VUX05BTUUpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgW1BPV0VSTUFDXTogU2V0IHRoZQotCW1hY2hpbmUgdG8gMCwgbm90IGFsbCBQb3dlck1hY3MgYXJlIDYwMXMuCi0KLUZyaSBOb3YgMTAgMTI6MTA6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJlYWQgaW4gYW55IHByb2dyYW0gaGVhZGVycy4KLQkqIGVsZi5jIChfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogQWRqdXN0IHNlY3Rpb24gbG1hCi0JYmFzZWQgb24gdGhlIHByb2dyYW0gaGVhZGVycywgaWYgYW55LgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzaF9hZGRyIGZyb20gdGhlIHZtYSwgbm90IHRoZSBsbWEuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogU2V0IHBfcGFkZHIgb2YgcHJvZ3JhbSBoZWFkZXJzIGJhc2VkIG9uCi0JdGhlIGxtYS4KLQotVGh1IE5vdiAgOSAxMzowMTozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogUHJlc2VydmUgdGRhdGEgaW4gY2FzZSBvZgotCWZhaWx1cmUuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IFJlcG9ydCBhIHJlYXNvbmFibGUgZXJyb3Igd2hlbgotCXRyeWluZyB0byBkbyBhIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggYSBub24tYS5vdXQgb2JqZWN0IGZpbGUuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogQ2hlY2sgdGhlIGZpcnN0IG9iamVjdCBmaWxlCi0JaW4gYW4gYXJjaGl2ZSBldmVuIGlmIHRhcmdldF9kZWZhdWx0ZWQgaXMgc2V0LiAgSWYgdGhlIG9iamVjdCBmaWxlCi0JaGFzIHRoZSB3cm9uZyB4dmVjLCByZWplY3QgaXQuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykpOiBJZiBhIHNlY3Rpb24gY2FuIG5vdAotCWJlIHJlcHJlc2VudGVkLCByZXBvcnQgdGhlIG5hbWUgdmlhIF9iZmRfZXJyb3JfaGFuZGxlci4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfd3JpdGVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBXcml0ZSBSUzYwMDBDT0ZGX0MgdmVyc2lvbgotCXdoaWNoIGNoZWNrcyBmb3IgU1RZUF9PVlJGTE8gc2VjdGlvbnMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUKLQlyZWxvYyBhbmQgbGluZW5vIGNvdW50IG92ZXJmbG93cy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDYWxsIGNvZmZfY291bnRfbGluZW51bWJlcnMgYmVmb3JlCi0JY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICBJZiBSUzYwMDBDT0ZGX0MsIGhhbmRsZQotCXJlbG9jIGFuZCBsaW5lbm8gY291bnQgb3ZlcmZsb3dzLgotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBDb3VudCBsaW5lIG51bWJlcnMgYW5kCi0JcmVsb2NzIGJlZm9yZSBkZWFsaW5nIHdpdGggLnBhZCBzZWN0aW9ucy4gIENvdW50IG92ZXJmbG93IHNlY3Rpb24KLQloZWFkZXJzIHdoZW4gaGFuZGxpbmcgLnBhZCBzZWN0aW9ucy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgYS5vdXQgdnN0YW1wIHRvIDEKLQlpZiBSUzYwMDBDT0ZGX0MuCi0KLQkqIHhjb2ZmbGluay5jIChYQ09GRl9ERVNDUklQVE9SKTogRGVmaW5lLgotCShzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX3RhYmxlKTogQWRkIGRlc2NyaXB0b3Jfc2VjdGlvbiBhbmQKLQlzcGVjaWFsX3NlY3Rpb25zIGZpZWxkcy4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFNldCBsaW5rYWdlIHNlY3Rpb24gYWxpZ25tZW50LiAgQ3JlYXRlCi0JZGVzY3JpcHRvciBzZWN0aW9uLiAgQ2hlY2sgZm9yIG1hZ2ljIHN5bWJvbCBuYW1lcyAoX3RleHQsIGV0Yy4pLAotCWFuZCByZWNvcmQgdGhlbSBpbiBzcGVjaWFsX3NlY3Rpb25zIGlmIGZvdW5kLiAgU2V0Ci0JWENPRkZfREVTQ1JJUFRPUiBmbGFnIGZvciBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIGFuZCBzZXQgaXRzCi0JZGVzY3JpcHRvciBmaWVsZCB0byBwb2ludCBiYWNrIHRvIHRoZSBmdW5jdGlvbiBjb2RlIHN5bWJvbC4KLQkoeGNvZmZfc3dlZXApOiBBbHdheXMgbWFyayB0aGUgc3BlY2lhbCBkZXNjcmlwdG9yX3NlY3Rpb24uCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogQ2hlY2sgd2hldGhlciB0aGUgc3ltYm9sIG1pZ2h0IGJlIGEKLQlmdW5jdGlvbiBkZXNjcmlwdG9yLCBhbmQgbWFyayBpdCBpZiBpdCBpcy4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBuZXcgc3BlY2lhbF9zZWN0aW9ucwotCXBhcmFtZXRlciwgYW5kIGZpbGwgaXQgaW4uICBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGRlc2NyaXB0b3IKLQlzZWN0aW9uLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBTZXQgWENPRkZfREVGX1JFR1VMQVIgZmxhZyB3aGVuIGRlZmluaW5nCi0JZ2xvYmFsIGxpbmthZ2UgY29kZS4gIElmIGFuIHVuZGVmaW5lZCBmdW5jdGlvbiBkZXNjcmlwdG9yIGlzCi0JZXhwb3J0ZWQsIGFycmFuZ2UgdG8gZGVmaW5lIGl0LiAgV2FybiBhYm91dCBhbnkgb3RoZXIgdW5kZWZpbmVkCi0JZXhwb3J0ZWQgc3ltYm9sLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogV3JpdGUgb3V0IHRoZSBkZXNjcmlwdG9yIHNlY3Rpb24uCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBDcmVhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yIHdoZW4KLQluZWNlc3NhcnkuCi0JKiBiZmQtaW4uaCAoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotVGh1IE5vdiAgOSAwODo0MDoyMyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAocHBjX2NvZmZfbGlua19oYXNoX2VudHJ5KTogbmV3IHR5cGVzIGZvciBoYXNoaW5nCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZSk6IG5ldyB0eXBlcyBmb3IgaGFzaGluZwotCShwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyk6IGhhc2ggZW50cnkgY29uc3RydWN0b3IKLQkocHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBoYXNoIHRhYmxlIGluaXRpYWxpemVyCi0JKHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBoYXNoIHRhYmxlIGNvbnN0cnVjdG9yCi0JKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogY2hhbmdlZCByZWZlcmVuY2VzIHRvIGhhc2ggdGFibGUKLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IGNoYW5nZWQgcmVmZXJlbmNlcyB0byBoYXNoIHRhYmxlCi0KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9saW5rX2hhc2hfZW50cnkpOiByZW1vdmVkIHRvY19vZmZzZXQKLQkqIGxpYmNvZmYuaDogUmVidWlsZAotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiByZW1vdmVkIHRvY19vZmZzZXQgaW5pdAotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiByZW1vdmVkIHRvY19vZmZzZXQgaW5pdAotCi1UaHUgTm92ICA5IDA0OjAwOjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmRlcDEpOiBNYWtlIHN1cmUgdGhlIGZpbGUgbWtkZXAgaXMgdG8gd3JpdGUgZXhpc3RzCi0JZmlyc3QuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkZWQgbmV3IG9wdGlvbiAtLXdpdGhbb3V0XS1tbWFwLiAgU2V0IFVTRV9NTUFQCi0JaWYgaXQgaXMgZ2l2ZW4gYW5kIG1tZXAgaXMgYXZhaWxhYmxlLgotCSogYWNjb25maWcuaDogVW5kZWYgVVNFX01NQVAuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVnZW5lcmF0ZWQuCi0JKiBhb3V0eC5oOiBJZiBVU0VfTU1BUCBpcyBub3QgZGVmaW5lZCwgZG8gYWxsIHN5bWJvbCBhbmQgc3RyaW5nCi0JdGFibGUgaGFuZGxpbmcgdGhlIG9sZCB3YXkuCi0JKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBEb24ndCBjb21wbGFpbiBpZiBsYXN0IGJ5dGUgb2Ygc3RyaW5nCi0JdGFibGUgaXMgbm9uemVyby4KLQkqIGxpYmJmZC5jIFtIQVZFX01BRFZJU0VdOiBJbmNsdWRlIHN5cy90eXBlcy5oIGFuZCBzeXMvbW1hbi5oLgotCShiZmRfZnJlZV93aW5kb3cpIFshIFVTRV9NTUFQXTogRG9uJ3QgZGVmaW5lLgotCShiZmRfZ2V0X2ZpbGVfd2luZG93LAotCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpIFshIFVTRV9NTUFQXTogQWJvcnQuCi0KLVdlZCBOb3YgIDggMjA6MDM6NDQgMTk5NSAgRXJpYyBGcmV1ZGVudGhhbCA8ZnJldWRlbnRoYWxAbnl1LmVkdT4KLQotCSogY29mZi1hMjlrLmMgKFNJR05fRVhURU5EX0hXT1JEKTogVXNlIH4weGZmZmYgcmF0aGVyIHRoYW4KLQkweGZmZmYwMDAwLgotCi1XZWQgTm92ICA4IDExOjMxOjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hMjlrLmMgKGEyOWtfcmVsb2MpOiBDaGFuZ2UgaGFuZGxpbmcgb2YgUl9JUkVMIHJlbG9jIHRvIGJlCi0JY29tcGF0aWJsZSB3aXRoIEFNRCBnZW5lcmF0ZWQgQ09GRiBmaWxlcy4gIFRyeSB0byBzdXBwb3J0IGJvdGggQU1ECi0JYW5kIEdOVSBmb3JtYXRzIHNpbXVsdGFuZW91c2x5LgotCShjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldF9maWxlX3dpbmRvdyk6IENoYW5nZSB3cml0YWJsZSBwYXJhbWV0ZXIgZnJvbQotCWludCB0byBib29sZWFuOyB1cGRhdGUgYWxsIGNhbGxlcnMuICBQYXNzIE1BUF9TSEFSRUQgaWYgbm90Ci0Jd3JpdGFibGUtLWl0J3MgcmVxdWlyZWQgb24gU29sYXJpcy4gIENhc3QgZnByaW50ZiBhcmd1bWVudCB0bwotCWF2b2lkIHdhcm5pbmcuCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9maWxlX3dpbmRvdyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGFvdXR4Lmg6IFVwZGF0ZSBjYWxscyB0byBiZmRfZ2V0X2ZpbGVfd2luZG93LgotCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfREVGX0RZTkFNSUMpOiBSZW5hbWUgZnJvbSBYQ09GRl9SRUZfRFlOQU1JQy4KLQlDaGFuZ2UgYWxsIHVzZXMuCi0JKHhjb2ZmX3N3YXBfbGRoZHJfaW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh4Y29mZl9zd2FwX2xkc3ltX2luKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfZmluZF9yZWxvYyk6IEhhbmRsZSB0aGUgY2FzZSBvZiBhIHNpbmdsZSByZWxvYyBjb3JyZWN0bHkuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiB3ZSBqdXN0IGNyZWF0ZWQgYSBkZXNjcmlwdG9yLCBwYXNzIGl0Ci0JdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wsIHRvIHNhdmUgYSBoYXNoIGxvb2t1cC4KLQlIYW5kbGUgWFRZX0VSL1hNQ19YTyBzeW1ib2xzIGNvcnJlY3RseS4KLQkoeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzKTogUmV3cml0ZSB0byByZWFkIC5sb2FkZXIgc3ltYm9scwotCXJhdGhlciB0aGFuIG5vcm1hbCBzeW1ib2wgdGFibGUuCi0JKGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sKTogSXQncyBub3QgYW4gZXJyb3IgaWYgdGhlIHN5bWJvbCBpcwotCWFscmVhZHkgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIGFic29sdXRlIHZhbHVlLgotCSh4Y29mZl9tYXJrKTogV2hlbiBjb25zaWRlcmluZyBjYWxsZWQgc3ltYm9scywgY2hlY2sgd2hldGhlciB0aGUKLQlkZXNjcmlwdG9yIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdCwgcmF0aGVyIHRoYW4gdGhlIHN5bWJvbAotCWl0c2VsZi4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2V0X2ZpbGVfd2luZG93KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4uCi0JQ2FzdCByZWFsbG9jIGFuZCBtYWxsb2MgcmV0dXJuIHZhbHVlcy4gIElmIG1hbGxvYyBvciByZWFsbG9jIGZhaWwsCi0Jc2V0IGJmZF9lcnJvcl9ub19tZW1vcnkuCi0JKiBiZmQtaW4uaCAoYmZkX2dldF9maWxlX3dpbmRvdyk6IENoYW5nZSB0eXBlIHRvIGJvb2xlYW4uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVR1ZSBOb3YgIDcgMTE6NTM6NDggMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHBwY19yZWNvcmRfdG9jX2VudHJ5KTogbmV3IGZ1bmN0aW9uLgotCShpbl9yZWxvY19wKTogY2hhbmdlZCByZXR1cm4gdmFsdWUuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBtdWNoIHJld29yay4KLQkocHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uKTogbmV3IGZ1bmN0aW9uLgotCShwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbik6IG5ldyBmdW5jdGlvbi4KLQkocHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayk6IG5ldyBmdW5jdGlvbi4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogaW5pdGlhbGl6ZSB0b2Nfb2Zmc2V0LgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBpbml0aWFsaXplIHRvY19vZmZzZXQuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3N5bV9pbik6IEFkZGVkIGNvZmZfc3dhcF9zeW1faW5faG9vawotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBBZGRlZCBtb3JlIHNlY3Rpb25zIHRvIHRoZSBkYXRhCi0JZGljdGlvbmFyeSBmb3IgdGhlIHBlIGZpbGUgaGVhZGVyLiBBbHNvIGNoYW5nZWQgbGlua2VyIHZlcnNpb24KLQludW1iZXIgb24gdGhlIHBwYyBzaWRlLgotCShkaXJfbmFtZXMpOiBzbWFsbCBpbXByb3ZlbWVudHMgdG8gdGhlIGRpY3Rpb25hcnkgcHJpbnRpbmcuCi0JKHBlX21rb2JqZWN0X2hvb2spOiBzYXZlIHRoZSBmaWxlIGxldmVsIGZsYWdzLgotCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfbGlua19oYXNoX2VudHJ5KTogYWRkZWQgdG9jX29mZnNldCBmaWVsZAotCShwZV90ZGF0YSk6IGFkZGVkIHJlYWxfZmxhZ3MgZmllbGQKLQkoY29mZl90ZGF0YSk6IGFkZGVkIGxvY2FsX3RvY19zeW1fbWFwIGFuZCBhY2Nlc3MgbWFjcm8KLQotCSogbGliY29mZi5oIChjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IGFkZGVkIHRvY19vZmZzZXQgZmllbGQKLQkocGVfdGRhdGEpOiBhZGRlZCByZWFsX2ZsYWdzIGZpZWxkCi0JKGNvZmZfdGRhdGEpOiBhZGRlZCBsb2NhbF90b2Nfc3ltX21hcCBhbmQgYWNjZXNzIG1hY3JvCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogYWRkZWQgaG9vayBmb3IgUEUuCi0JKGNvZmZfbWtvYmplY3QpOiBpbml0IGZvciBsb2NhbF90b2Nfc3ltX21hcAotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IHNldCB0aGUgaW50ZXJuYWxfYS5tYWdpYyB0bwotICAgICAgICBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMgd2hpY2ggYXBwZWFycyB0byBiZSB3aGF0IG90aGVyCi0JcHBjIGNvbXBpbGVycyB1c2UuCi0KLVR1ZSBOb3YgIDcgMTM6NDg6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZmxpbmsuYyAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IEtlZXAgbG9va2luZyB0aHJvdWdoIHN0YWJzCi0JZW50cmllcyB1bnRpbCBib3RoIHRoZSBsaW5lIG51bWJlciBhZGRyZXNzIGFuZCB0aGUgZnVuY3Rpb24gbmFtZQotCWFkZHJlc3MgYXJlIHRvbyBsYXJnZS4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NIRUNLX1BST0cgdG8gZmluZCBhbmQgY2FjaGUgQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLQkqIGFjbG9jYWwubTQgKEJGRF9DQ19GT1JfQlVJTEQpOiBEb24ndCBkZWZpbmUgQ0NfRk9SX0JVSUxEIGlmIGl0Ci0JaXMgZGVmaW5lZCBpbiB0aGUgZW52aXJvbm1lbnQuCi0KLVR1ZSBOb3YgIDcgMTA6NTc6MjQgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6IERlZmluZSB0byB1c2UKLQlnZW5lcmljIHZlcnNpb24uCi0KLU1vbiBOb3YgIDYgMTc6MTM6MTUgMTk5NSAgSGFycnkgRG9sYW4gIDxkb2xhbkBzc2QuaW50ZWwuY29tPgotCi0JKiBjb2ZmLWk4NjAuYzogTmV3IGZpbGUsIGJhc2VkIG9uIGNvZmYtaTM4Ni5jLgotCSogY3B1LWk4NjAuYzogTmV3IGZpbGUsIGJhc2VkIG9uIGNwdS1pMzg2LmMuCi0JKiBob3N0cy9pODYwbWFjaDMuaDogTmV3IGZpbGUsIGJhc2VkIG9uIGhvc3RzL2kzODZtYWNoMy5oLgotCSogY29uZmlnLmJmZCAoaTg2MC0qLW1hY2gzKiwgaTg2MC0qLW9zZjEqLCBpODYwLSotY29mZiopOiBOZXcKLQl0YXJnZXRzLCB1c2luZyBpODYwY29mZl92ZWMuCi0JKiBjb25maWd1cmUuaW4gKGk4NjAtKi1tYWNoMyosIGk4NjAtKi1vc2YxKik6IE5ldyBob3N0cywgdXNpbmcKLQl0cmFkLWNvcmUubyBhbmQgaG9zdHMvaTg2MG1hY2gzLmguCi0JKGk4NjBjb2ZmX3ZlYyk6IFVzZSBjb2ZmLWk4NjAubyBhbmQgY29mZmxpbmsuby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1pODYwLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtaTg2MC5vLgotCShDRklMRVMpOiBBZGQgY3B1LWk4NjAuYyBhbmQgY29mZi1pODYwLmMuCi0JKiB0YXJnZXRzLmMgKGk4NjBjb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkICZpODYwY29mZl92ZWMuCi0JKiBhcmNodXJlcy5jIChiZmRfaTg2MF9hcmNoKTogRGVjbGFyZS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgJmJmZF9pODYwX2FyY2guCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2hfaG9vayk6IEhhbmRsZSBJODYwIG1hZ2ljIG51bWJlci4KLQkoY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUgYmZkX2FyY2hfaTg2MC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgSTg2MCBhLm91dCBtYWdpYyBudW1iZXIuCi0KLU1vbiBOb3YgIDYgMTQ6MzQ6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFNldCB0aGUgYWxpZ25tZW50IHBvd2VyIG9mCi0JdGhlIGNyZWF0ZWQgLnRjIHNlY3Rpb24gdG8gMi4KLQkoeGNvZmZfbWFyayk6IERvbid0IGtlZXAgYSAubG9hZGVyIHJlbG9jIGZvciBhIGNhbGwgdG8gYW4KLQl1bmRlZmluZWQgc3ltYm9sIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBnZW5lcmF0ZQotCWdsb2JhbCBsaW5rYWdlIGNvZGUgZm9yIGEgY2FsbCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLgotCi1TdW4gTm92ICA1IDIxOjQ0OjEzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogUmVidWlsZCBsaXN0IGZyb20gQkZEX0xJQlMsIEFMTF9NQUNISU5FUywKLQlCRkQzMl9CQUNLRU5EUywgQkZENjRfQkFDS0VORFMuCi0JKC5kZXAxKTogUHV0IG1rZGVwIG91dHB1dCBpbiBhIHNlcGFyYXRlIGZpbGUuCi0JUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfc2x1cnBfYXJtYXApOiBDYXN0IF9iZmRfcmVhZF9hcl9oZHIgcmV0dXJuCi0JdmFsdWUuCi0KLQlQZXJtaXQgdXNlIG9mIG1tYXAgd2hlbiBhdmFpbGFibGU6Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIG1tYXAsIG1hZHZpc2UsIG1wcm90ZWN0LgotCSogY29uZmlnLmluLCBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi0JKiBsaWJiZmQuYyAoc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsKTogRGVmaW5lIHR5cGUuCi0JKGJmZF9pbml0X3dpbmRvdywgYmZkX2ZyZWVfd2luZG93LCBiZmRfZ2V0X2ZpbGVfd2luZG93KTogTmV3Ci0JZnVuY3Rpb25zLgotCShva190b19tYXApOiBOZXcgc3RhdGljIHZhcmlhYmxlIGZvciBkZWJ1Z2dpbmcuCi0JKF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX3dpbmRvd19pbnRlcm5hbCk6IERlY2xhcmUgdHlwZS4KLQkoYmZkX3dpbmRvdyk6IERlZmluZSB0eXBlLgotCShiZmRfaW5pdF93aW5kb3csIGJmZF9mcmVlX3dpbmRvdywgYmZkX2dldF9maWxlX3dpbmRvdyk6IERlY2xhcmUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6Ci0JRGVjbGFyZS4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgdHdvIHdpbmRvdyBmaWVsZHMuCi0JKG9ial9hb3V0X3N5bV93aW5kb3csIG9ial9hb3V0X3N0cmluZ193aW5kb3cpOiBOZXcgbWFjcm9zLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogSW5pdGlhbGl6ZSB3aW5kb3dzLgotCShhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogR2V0IHN5bWJvbCBkYXRhIGFuZCBzdHJpbmdzIGluCi0Jd2luZG93cyBpbnN0ZWFkIG9mIGV4cGxpY2l0bHkgYWxsb2NhdGVkIGJ1ZmZlcnMuCi0JKHNsdXJwX3N5bWJvbF90YWJsZSk6IEZyZWUgd2luZG93IGluc3RlYWQgb2YgbWVtb3J5LgotCShiZmRfZnJlZV9jYWNoZWRfaW5mbyk6IFJlbGVhc2Ugd2luZG93cyBpbnN0ZWFkIG9mIGZyZWVpbmcgc3RvcmFnZQotCWRpcmVjdGx5LgotCShhb3V0X2xpbmtfZnJlZV9zeW1ib2xzKTogRGl0dG8uCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBuZXcgZmllbGQgZm9yCi0JZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93LgotCShCRkRfSlVNUF9UQUJMRV9HRU5FUklDKTogVXBkYXRlZC4KLQkqIGFvdXQtYWRvYmUuYywgYW91dC10YXJnZXQuaCwgYmluYXJ5LmMsIGJvdXQuYywgY29mZi1hbHBoYS5jLAotCWNvZmYtbWlwcy5jLCBlbGZ4eC10YXJnZXQuaCwgaTM4Nm1zZG9zLmMsIGkzODZvczlrLmMsIGllZWUuYywKLQlsaWJjb2ZmLWluLmgsIG9hc3lzLmMsIHNyZWMuYywgdGVraGV4LmMsIHZlcnNhZG9zLmM6IEFkZGVkIG5ldwotCW1hY3JvcyBmb3IgZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IGZpZWxkLgotCi1TYXQgTm92ICA0IDEyOjIzOjI2IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmM6IFJlbmFtZWQgdG8gY29yZWZpbGUuYwotCSogbWFrZWZpbGUuZG9zIChPQkpTKTogQ2hhbmdlIGNvcmUubyB0byBjb3JlZmlsZS5vCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTLCBCRkRfTElCUyk6IFVzZSBjb3JlZmlsZS5jIGluc3RlYWQgb2YgY29yZS5jCi0KLUZyaSBOb3YgIDMgMTU6NTQ6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZSBzdWIKLQl0byBvLiAgQ2xvYmJlciBhbmQgcmVzdG9yZSB0aGUgbGlzdCBvZiBuZXcgY3NlY3RzIGFyb3VuZCB0aGUgY2FsbAotCXRvIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sLCBpbiBjYXNlIGl0IHdhbnRzIHRvIHJlcG9ydCBhCi0JbGlua2VyIGVycm9yIGFuZCB0aGUgbGlua2VyIHdhbnRzIHRvIHJlYWQgdGhlIHN5bWJvbCB0YWJsZS4gIFJlc2V0Ci0JdGhlIGxpbmUgbnVtYmVyIGNvdW50IG9mIGEgcmVhbCBzZWN0aW9uIGV2ZW4gaWYgaXQgaGFzIG5vIHJlbG9jcy4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IElmIHNoYXJlZCwgc2V0IHRoZSBEWU5BTUlDIGZsYWcuCi0KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogV2FybiBpZiB0aGUgc3RyaW5nIHNpemUKLQlpcyB0b28gc21hbGwuCi0KLVRodSBOb3YgIDIgMjM6MTY6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHdhcm4gYWJvdXQKLQlhbiB1bmRlZmluZWQgc3ltYm9sIGluIGEgc2hhcmVkIGxpbmsuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IENvcnJlY3QgdHlwZSBvZgotCW9sZHR5cGUgZnJvbSBiZmRfbGlua19vcmRlcl90eXBlIHRvIGJmZF9saW5rX2hhc2hfdHlwZS4gIEZyb20KLQlwaGRtQGluZm8udWNsLmFjLmJlIChQaGlsaXBwZSBEZSBNdXl0ZXIpLgotCi1XZWQgTm92ICAxIDE0OjI2OjAyIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb2ZmLW04OGsuYyAocnR5cGUyaG93dG8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShSVFlQRTJIT1dUTyk6IFVzZSBpdCByYXRoZXIgdGhhbiBhIG1hY3JvIGRlZmluaXRpb24uCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGludGVybmFsX2EubWFnaWMKLQl0byBQQUdFTUFHSUNQRVhFQ1BBR0VEICNpZiBkZWZpbmVkIChNNjgpICYmICFkZWZpbmVkIChMWU5YT1MpLgotCi0JKiBjb25maWd1cmUuaW46IG02OCotbW90b3JvbGEtc3lzdiogZG9lcyBub3QgdXNlIHB0cmFjZS1jb3JlLm87Ci0JZGVmaW5lIFRSQURfSEVBREVSIHRvIG5ldyBmaWxlIGhvc3RzL2RlbHRhNjguaC4KLQltODgqLW1vdG9yb2xhLXN5c3YqLCBob3dldmVyLCBkb2VzIHVzZSBwdHJhY2UtY29yZS5vLgotCSogaG9zdHMvZGVsdGE2OC5oOiBOZXcgZmlsZS4KLQotCSogcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfY29yZV9maWxlX3ApOiBjaGFuZ2UgYmZkX3ptYWxsb2MgdG8KLQliZmRfemFsbG9jOyBwcm92aWRlIHByb3BlciBwYXJtIGFiZmQgdG8gY2FsbHMgdG8gYmZkX3phbGxvYy4KLQotV2VkIE5vdiAgMSAxMzo1MTo1NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4NmxpbnV4LmMgKE1ZKHZlYykpOiBEZWNsYXJlIGJlZm9yZSB1c2UuCi0KLVdlZCBOb3YgIDEgMTE6NDU6MDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKToKLQlQYXNzIGlucHV0X2JmZCwgbm90IGluX2JmZCwgdG8gYmZkX2NvZmZfcmVsb2MxNl9leHRyYV9jYXNlcy4KLQotCSogZWxmLmMgKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlCi0JQkZEIGlzIG5vdCBvZiB0aGUgcmlnaHQgdHlwZS4KLQkoYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QpOiBMaWtld2lzZS4KLQkqIGkzODZsaW51eC5jIChiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0KTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoWENPRkZfWFZFQ1ApOiBEZWZpbmUuCi0JKGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQpOiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgQkZEIGlzIG5vdAotCW9mIHRoZSByaWdodCB0eXBlLgotCShiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IE9ubHkgY2hlY2sgdGhlIHJlbG9jIHN5bWJvbAotCXRhYmxlIGluZGV4IGFnYWluc3QgdGhlIG51bWJlciBvZiBzeW1ib2xzIGZvciBhIGJhc2UgcmVsYXRpdmUKLQlyZWxvYy4KLQotCSogY29mZi1yczYwMDAuYyAoX2JmZF94Y29mZl9zaXplb2ZfaGVhZGVycyk6IENoYW5nZSBmcm9tIG1hY3JvIHRvCi0Jc3RhdGljIGZ1bmN0aW9uLgotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBTZXQKLQlmdWxsX2FvdXRoZHIgZmxhZyBoZXJlLi4uCi0JKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiAuLi5ub3QgaGVyZS4KLQotVHVlIE9jdCAzMSAxMjo1MjowMiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmg6ICBSZW5hbWUgdG8gZWxmLWJmZC5oIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGgKLQlzeXN0ZW1zIHRoYXQgaGF2ZSBhIHN5c3RlbSA8bGliZWxmLmg+LgotCSogTWFrZWZpbGUuaW46IEdsb2JhbGx5IHJlcGxhY2UgbGliZWxmLmggd2l0aCBlbGYtYmZkLmguCi0JKiBiZmQuYywgZWxmLmMsIGVsZjMyLWFyYy5jLCBlbGYzMi1nZW4uYywgZWxmMzItaHBwYS5jLAotCWVsZjMyLWhwcGEuaCwgZWxmMzItaTM4Ni5jLCBlbGYzMi1pODYwLmMsIGVsZjMyLW02OGsuYywKLQllbGYzMi1tODhrLmMsIGVsZjMyLW1pcHMuYywgZWxmMzItcHBjLmMsIGVsZjMyLXNwYXJjLmMsCi0JZWxmNjQtZ2VuLmMsIGVsZjY0LXNwYXJjLmMsIGVsZmNvZGUuaCwgZWxmbGluay5jLAotCWVsZnh4LXRhcmdldC5oOiBJbmNsdWRlIGVsZi1iZmQuaCByYXRoZXIgdGhhbiBsaWJlbGYuaC4KLQkqIGVsZnh4LXRhcmdldC5oOiBDaGFuZ2UgbGliZWxmLmggcmVmZXJlbmNlIHRvIGVsZi1iZmQuaC4KLQotVHVlIE9jdCAzMSAxNTozMDowNyAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBBZGQgbmV3IHBhcmFtZXRlciB3ZWFrLiAgSWYKLQlzZXQsIHNldCBCU0ZfV0VBSyBpbiBzeW1ib2wuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGVjb2ZmX2dldF9leHRyKTogU2V0IHdlYWtleHQgYmFzZWQgb24gQlNGX1dFQUsuCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IElmIHdlYWtleHQgaXMgc2V0LCBwYXNzIEJTRl9XRUFLIHRvCi0JX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIpOiBDaGVjayB0aGF0IHRoZSBzZWN0aW9uIHRkYXRhIHJlbG9jcwotCWFyZSBub3QgTlVMTCBiZWZvcmUgdXNpbmcgdGhlbS4KLQotCSogY29uZmlndXJlLmluIChhbHBoYSotKi1saW51eCopOiBTZXQgQ09SRUZJTEUgdG8gdHJhZC1jb3JlLm8gYW5kCi0JZGVmaW5lIFRSQURfSEVBREVSIGFzIGhvc3RzL2FscGhhbGludXguaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGhvc3RzL2FscGhhbGludXguaDogTmV3IGZpbGUuCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogQ2FzdCB1LnVfYXIwIHRvIGJmZF92bWEsCi0Jbm90IGludC4KLQotVHVlIE9jdCAzMSAxMjozNDoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWNjZXB0IENfQkNPTU0gYW5kCi0JQ19FQ09NTSBzdG9yYWdlIGNsYXNzZXMuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9tYXJrX3N5bWJvbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQKLQlvZiB4Y29mZl9tYXJrLgotCSh4Y29mZl9tYXJrKTogQ2FsbCB4Y29mZl9tYXJrX3N5bWJvbC4KLQkoYmZkX3hjb2ZmX2V4cG9ydF9zeW1ib2wpOiBDYWxsIHhjb2ZmX21hcmtfc3ltYm9sLgotCShiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyk6IENhbGwgeGNvZmZfbWFya19zeW1ib2wgcmF0aGVyIHRoYW4KLQlkb2luZyBpdCBieSBoYW5kLgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBCdWlsZCBhIC5sb2FkZXIgc3ltYm9sIGZvciBhbiBleHBvcnQgc3ltYm9sLgotCi1Nb24gT2N0IDMwIDE0OjUzOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgbmV3IGxpbmVfZmlsZXBvcwotCWZpZWxkLgotCSh4Y29mZl9maW5kX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IFVzZSBpdC4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IFNldCBmaW5mby5saW5lX2ZpbGVwb3MuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogSGFuZGxlIENfQklOQ0wgYW5kIENfRUlOQ0wuICBEb24ndAotCXJlbG9jYXRlIHRoZSB2YWx1ZSBvZiBDX0RFQ0wuCi0KLQkqIGVsZi5jIChlbGZfZmFrZV9zZWN0aW9ucyk6IFJlbW92ZSBib2d1cyBCRkRfQVNTRVJULgotCi1TYXQgT2N0IDI4IDAxOjI1OjM0IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlCi0JY2FsbGJhY2sgZGVjaWRlIHdoYXQgZ29lcyBpbiAucmVsb2NzLgotCSogcGVbaV0taTM4Ni5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IERlZmluZS4KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3RfaG9vayk6IE9ubHkgY29weSBhb3V0aGRyIGlmCi0JdGhlcmUgaXMgb25lLgotCi1TYXQgT2N0IDI4IDAxOjUxOjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBIYW5kbGUgY3NlY3RzIGluIHRoZQotCWFic29sdXRlIHNlY3Rpb24uCi0KLUZyaSBPY3QgMjcgMTg6MTQ6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYzogTW9yZSBpbXByb3ZlbWVudHMsIG1vc3RseSB0byBmaXggaGFuZGxpbmcgb2YKLQljb25zdHJ1Y3RvcnMgYW5kIGEgZmV3IG90aGVyIHNwZWNpYWwgY2FzZXMuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX3ZlYyk6IFNldCBzeW1ib2xfbGVhZGluZ19jaGFyIGJhY2sgdG8KLQl6ZXJvLCByZXZlcnRpbmcgeWVzdGVyZGF5J3MgY2hhbmdlLgotCSogYmZkLWluLmggKGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQpOiBEZWNsYXJlLgotCShiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotRnJpIE9jdCAyNyAxNDo0MjoxNSAxOTk1ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBQT1JUSU5HLCBhb3V0LWFybS5jLCBhb3V0LWVuY2FwLmMsIGFvdXQtdGFyZ2V0LmgsCi0JYW91dHguaCwgZ2VuLWFvdXQuYywgaG9zdC1hb3V0LmMsIGhwMzAwYnNkLmMsIGkzODZhb3V0LmMKLQlpMzg2YnNkLmMsIGkzODZkeW5peC5jLCBpMzg2bGludXguYywgaTM4Nmx5bnguYywgaTM4Nm1hY2gzLmMsCi0JaTM4Nm5ldGJzZC5jLCBtNjhrbHlueC5jLCBtODhrbWFjaDMuYywgbWlwc2JzZC5jLCBuZXdzb3MzLmMsCi0JbnMzMmtuZXRic2QuYywgcGM1MzItbWFjaC5jLCByaXNjaXguYywgc3BhcmNseW54LmMsIHNwYXJjbmV0YnNkLmM6Ci0JQ2hhbmdlIFBBR0VfU0laRSB0byBUQVJHRVRfUEFHRV9TSVpFLgotCi0JKiBtNjhrbmV0YnNkLmM6IERpdHRvIGFzIHdlbGwgYXMgYWRkIHN1cHBvcnQgZm9yIHRoZSBtNjhrNGsgb2JqZWN0Ci0JZm9ybWF0LgotCi0JKiBuZXRic2QuaDogRG91YmxlIGRpdHRvIChpbmNsLiBtNjhrNGsgc3VwcG9ydCkuICBOZXRCU0QncyB0ZXh0Ci0Jc2VnbWVudHMgaW5jbHVkZXMgdGhlIGEub3V0IGhlYWRlci4gIFNlZSB0byB0aGF0IHRoZSBtYWdpYyBudW1iZXIKLQkqYWx3YXlzKiBpcyBiaWctZW5kaWFuLgotCi0JKiBjb25maWcuYmZkOiBBZGQgbTY4Ki1ocCotbmV0YnNkKiBjYXNlLiAgQ3Jvc3MtcG9sbGluYXRlIG02OGsgYW5kCi0JbTY4azRrIE5ldEJTRCBjb25maWd1cmF0aW9ucy4KLQotCSogY29uZmlndXJlLmluLCBjb25maWd1cmU6IFNlcGFyYXRlIGkzODYgJiBtaXBzIE5ldEJTRAotCWNvbmZpZ3VyYXRpb25zIGZyb20gb3RoZXIgQlNEIG9uZXMuICBEb24ndCBhc3N1bWUgREVDIGlzIHRoZSBvbmx5Ci0JdGhpbmcgTmV0QlNEL21pcHMgcnVuIG9uLiAgQWRkIHttNjhrLG5zMzJrLHNwYXJjfS0qLW5ldGJzZCoKLQljb25maWd1cmF0aW9ucy4gIEFkZCBzdXBwb3J0IGZvciBtNjhrNGsgTmV0QlNEIG9iamVjdCBmb3JtYXQuCi0KLQkqIGxpYmFvdXQuaDogQWRkZWQgTV82OEs0S19ORVRCU0QgbWFnaWMuCi0KLQkqIG02OGs0a25ldGJzZC5jOiBOZXcgZmlsZS4KLQotCSogaG9zdHMve202OGssc3BhcmN9bmJzZC5oOiBEb24ndCBkZWZpbmUgSE9TVF9CSUdfRU5ESUFOX1AuCi0KLQkqIGhvc3RzL25ic2QuaDogRGVmaW5lIEhPU1RfQklHX0VORElBTl9QIGFjY29yZGluZyB0bwotCTxtYWNoaW5lL2VuZGlhbi5oPi4KLQotCSogaG9zdHMvbWlwc25ic2QuaDogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjYgMTQ6MTY6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYzogTnVtZXJvdXMgY2hhbmdlcyB0byBnZXQgY2xvc2VyIHRvIGEgd29ya2luZyBYQ09GRgotCWxpbmtlci4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogQWRkIGZ1bGxfYW91dGhkciwKLQl0b2Nfc2VjdGlvbiwgYW5kIGVudHJ5X3NlY3Rpb24gZmllbGRzLgotCShzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSk6IFJlbW92ZSBsZHJlbF9jb3VudCBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgbmV3IHhjb2ZmX2RhdGEKLQlmaWVsZHMuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgUlM2MDAwQ09GRl9DLCBnZW5lcmF0ZQotCWZ1bGwgYS5vdXQgaGVhZGVyIGlmIGZ1bGxfYW91dGhkciBpcyBzZXQgaW4geGNvZmZfZGF0YS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIFNldCBvX3NuZW50cnkgYW5kIG9fc250b2MKLQliYXNlZCBvbiBzZWN0aW9ucyBzdG9yZWQgaW4geGNvZmZfZGF0YS4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgbmV3IHhjb2ZmX2RhdGEKLQlmaWVsZHMuCi0JKHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SLgotCShyczYwMDBjb2ZmX3ZlYyk6IFNldCBzeW1ib2xfbGVhZGluZ19jaGFyIHRvICcuJy4KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfc3ltYm9sX2luZm8pOiBJZiBmaXhfdmFsdWUgaXMgc2V0LCBmaXggdGhlCi0JdmFsdWUgc3RvcmVkIGluIHJldCByYXRoZXIgdGhhbiByZXR1cm5pbmcgYSBwb2ludGVyIHZhbHVlLgotCi1XZWQgT2N0IDI1IDIzOjEwOjM5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwY3ssbGV9LXtlbGYsc3lzdjQsZWFiaSxzb2xhcmlzMn0pOiBSZW1vdmUgTUFDCi0JZm9ybWF0IGZvciBub3cuCi0KLVdlZCBPY3QgMjUgMTY6MTk6MjcgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N0cmluZ190YWJsZSk6IEFsbG9jYXRlIHRoZSBzdHJpbmdzIHdpdGggbWFsbG9jCi0Jc2luY2UgdGhleSdyZSBmcmVlJ2QgYnkgZnJlZV9jYWNoZWRfaW5mby4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNpbWlsYXJseSBmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQotV2VkIE9jdCAyNSAxNDo1OToyMiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6ICBEb24ndCBtYWtlIGhlYWRlcnMuCi0KLVdlZCBPY3QgMjUgMTE6MzI6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIHN1bm9zLmMgKGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRG9uJ3QgZG8gYW55dGhpbmcgaWYKLQlvdXRwdXRfYmZkIGlzIG5vdCBTdW5PUy4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLiAgRG9uJ3Qgc2NhbiByZWxvY3Mgb2YKLQlub24tU3VuT1MgaW5wdXQgZmlsZXMuCi0KLQkqIHhjb2ZmbGluay5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byBzdXBwb3J0IGxpbmtpbmcgc2hhcmVkIG9iamVjdHMKLQlhbmQgZ2VuZXJhdGluZyBhIC5sb2FkZXIgc2VjdGlvbi4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogQWRkIGltcG9ydF9maWxlX2lkIGZpZWxkLgotCShzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCBsaW5lbm9fY291bnQsIGZpcnN0X3N5bW5keCwKLQlsYXN0X3N5bW5keCwgYW5kIGxkcmVsX2NvdW50IGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2hvd3RvX3RhYmxlKTogQ29ycmVjdCByZWxvYyBuYW1lcy4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogRG9uJ3Qgc2V0IGFueSBmbGFncyBpZiBTVFlQX1BBRAotCWlzIHNldC4KLQkqIGJmZC1pbi5oIChiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCk6IERlY2xhcmUuCi0JKGJmZF94Y29mZl9leHBvcnRfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVR1ZSBPY3QgMjQgMTc6NDQ6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCB4Y29mZmxpbmsubyB0byBwbWFjX3hjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIG1wdy1jb25maWcuaW46IEFkZCB4Y29mZmxpbmsuYy5vIHRvIHBvd2VycGMtYXBwbGUtbWFjb3MuCi0JKiBjb2ZmLXBtYWMuYzogSW5jbHVkZSBjb2ZmLXJzNjAwMC5jIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXRzCi0JY29udGVudHMuCi0JKHBtYWNfeGNvZmZfdmVjKTogVXBkYXRlIHRvIHVzZSBuZXcgeGNvZmYgc3VwcG9ydC4KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCk6IE1ha2Ugc3RhdGljLgotCSh4Y29mZl93cml0ZV9hcm1hcCk6IERlY2xhcmUgYnVmIGFzIHVuc2lnbmVkIGNoYXIuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERlY2xhcmUgYSBsb2NhbCBhcyBQVFIuCi0KLQkqIG1wdy1tYWtlLnNlZDogR2VuZXJhbGl6ZSBzdWJkaXJfZG8gZWRpdC4KLQotVHVlIE9jdCAyNCAxMDoyNTowMSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGFic2QtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbik6IEluaXRpYWxpemUgYXNlY3QtPmZpbGVwb3MKLQljb3JyZWN0bHkuICBEb24ndCBpbml0aWFsaXplIGFzZWN0LT52bWEuCi0KLUZyaSBPY3QgMjAgMTM6MjM6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG9wbmNscy5jIChfYmZkX25ld19iZmQpOiBJZiBfYmZkX2NodW5rc2l6ZSB3YXNuJ3QgcHJlc2V0LCB1c2UKLQlzb21ldGhpbmcgYSBsaXR0bGUgbGVzcyB0aGFuIHRoZSBwYWdlIHNpemUuCi0KLVRodSBPY3QgMTkgMTM6MDY6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX2FkanVzdF9zeW1uZHgpOiBDbGVhciAqYWRqdXN0ZWRwLgotCi1XZWQgT2N0IDE4IDE2OjIwOjA4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIC5ic3MgaXMgYmVmb3JlCi0JLmRhdGEgdXMgdGhhdCBhcyBkYXRhX3N0YXJ0LgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IEdldCByZWxvYwotCWNhbGMgY29ycmVjdC4KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBVc2UgX2Nvb2tlZF9zaXplIG9mIGRhdGEgZGlyZWN0b3J5LgotCShjb2ZmX3N3YXBfb3V0aGRyX291dCk6IEhhcmR3aXJlIGluIHZlcnNpb24gbnVtYmVyLgotCi1XZWQgT2N0IDE4IDE2OjUwOjU0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogUmVuYW1lIGxvY2FsIHZhcmlhYmxlcwotCW1ham9yIGFuZCBtaW5vciB0byAqX3Zubywgc2luY2UgdGhlIGZvcm1lciBhcmUgYWxzbyBtYWNyb3MgaW4KLQlTdW5PUyBoZWFkZXIgZmlsZXMuICBDYXN0IHJlc3VsdCBvZiBiZmRfYWxsb2MgdG8gYXBwcm9wcmlhdGUKLQl0eXBlLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBDYXN0IHVzZWRfYnlfYmZkIHZhbHVlCi0JYmVmb3JlIGFzc2lnbmluZyB0byBzZWNfZGF0YS4KLQotV2VkIE9jdCAxOCAxMzoyNToxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBUaGUgb2Zmc2V0IGFyZ3VtZW50IGlzCi0Jbm93IHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uLCBub3QgYWJzb2x1dGUuCi0JKiBlY29mZmxpbmsuYyAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IFVzZSB0aGUgcmlnaHQgc3ltYm9sIHRvCi0JZ2V0IHRoZSBmaWxlIG5hbWUgd2hlbiB0aGVyZSBpcyBhIE5fU08gZGlyZWN0b3J5IG5hbWUuICBXaGVuCi0JaGFuZGxpbmcgc3RhYnMsIHJlbWVtYmVyIHRoYXQgc2VjdGlvbi0+dm1hIHdhcyBhZGRlZCB0byB0aGUKLQlvZmZzZXQuCi0KLVR1ZSBPY3QgMTcgMTg6MjQ6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX3RhYmxlKTogQWRkIG5lZWRlZCBmaWVsZC4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IENhbGwgYmZkX3JlbGVhc2UsIG5vdCBmcmVlLgotCShzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogSW5pdGlhbGl6ZSBuZWVkZWQgZmllbGQuCi0JKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBSZWNvcmQgbmVlZGVkIG9iamVjdHMuCi0JKGJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBPY3QgMTYgMTQ6NDM6NTkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGliY29mZi1pbi5oIChwZV9kYXRhX3R5cGUuaW5fcmVsb2NfcCk6IE5ldy4KLQotTW9uIE9jdCAxNiAxMDo1Mjo1MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QpOiBSZW5hbWUgZnJvbQotCWJmZF9lbGZfbGlua19uZWVkZWRfbGlzdC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVsZi5jLCBlbGZsaW5rLmgsIGxpYmVsZi5oOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLQlBZGQgc3RhcnQgYXQgQUlYIGxpbmtlciBzdXBwb3J0OyBubyBzaGFyZWQgbGlicmFyaWVzIHlldC4KLQkqIHhjb2ZmbGluay5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAocnM2MDBjb2ZmX3ZlYyk6IFVzZSB4Y29mZmxpbmsuby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogQWRkIGNzZWN0cyBhbmQgZGVidWdfaW5kaWNlcwotCWZpZWxkcy4KLQkoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUuCi0JKHhjb2ZmX3NlY3Rpb25fZGF0YSk6IERlZmluZSBtYWNyby4KLQkoX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlY2xhcmUuCi0JKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogRGVjbGFyZS4KLQkoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLXJzNjAwMC5jOiBDbGVhbiB1cCBhIGJpdC4KLQkoeGNvZmZfbWtvYmplY3QpOiBEZWZhdWx0IG1vZHR5cGUgdG8gMUwsIG5vdCBSRS4gIEluaXRpYWxpemUKLQljcHV0eXBlLCBjc2VjdHMsIGFuZCBkZWJ1Z19pbmRpY2VzLgotCSh4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IGNwdXR5cGUuCi0JKHhjb2ZmX2hvd3RvX3RhYmxlKTogUmVuYW1lIGZyb20gcnM2MDAwY29mZl9ob3d0b190YWJsZS4KLQkoeGNvZmZfcnR5cGUyaG93dG8pOiBSZW5hbWUgZnJvbSByczYwMDBjb2ZmX3J0eXBlMmhvd3RvLgotCSh4Y29mZl9yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZSBmcm9tCi0JcnM2MDAwY29mZl9yZWxvY190eXBlX2xvb2t1cC4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzKTogRGVmaW5lLgotCShfYmZkX3hjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKF9iZmRfeGNvZmZfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbik6IERlZmluZS4KLQkocnM2MDAwY29mZl92ZWMpOiBGb3IgQkZEX0pVTVBfVEFCTEVfTElOSywgdXNlIF9iZmRfeGNvZmYsIG5vdAotCWNvZmYuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IElmIEFJWCwKLQlpbmNyZW1lbnQgc29mYXIgYnkgU01BTExfQU9VVFNaIGlmIG5vdCBleGVjdXRhYmxlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IElmIEFJWCwgYWx3YXlzIG91dHB1dCBhbiBhLm91dAotCWhlYWRlcjsgaWYgbm90IGV4ZWN1dGFibGUsIGhlYWRlciBzaXplIG9mIFNNQUxMX0FPVVRTWi4KLQkqIGhhc2guYyAoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCk6IEFkZCB4Y29mZiBmaWVsZC4KLQkoX2JmZF9zdHJpbmd0YWJfaW5pdCk6IEluaXRpYWxpemUgeGNvZmYgZmllbGQuCi0JKF9iZmRfeGNvZmZfc3RyaW5ndGFiX2luaXQpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfc3RyaW5ndGFiX2FkZCk6IEluIFhDT0ZGIG1vZGUsIGxlYXZlIHR3byBieXRlcyBmb3IgbGVuZ3RoLgotCShfYmZkX3N0cmluZ3RhYl9lbWl0KTogSW4gWENPRkYgbW9kZSwgd3JpdGUgb3V0IGxlbmd0aC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCB4Y29mZmxpbmsuby4KLQkoQ0ZJTEVTKTogQWRkIHhjb2ZmbGluay5jLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nKTogU2V0IFNFQ19BTExPQywgbm90Ci0JU0VDX05PX0ZMQUdTLCBmb3IgLmFjb21tb24gc2VjdGlvbi4gIEZyb20gUGV0ZXIgU2NoYXVlcgotCTxQZXRlci5TY2hhdWVyQFJlZ2VudC5FLVRlY2huaWsuVFUtTXVlbmNoZW4uREU+LgotCi1TYXQgT2N0IDE0IDIxOjM2OjAyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoaW5fcmVsb2NfcCk6IEFkZCwgY2xvbmUgZnJvbSBjb2ZmLWkzODYuYy4KLQotRnJpIE9jdCAxMyAxNzo0ODo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogYWNjb25maWcuaCAoSEFWRV9TWVNfUFJPQ0ZTX0gpOiBVbmRlZiwgd2l0aCBjb21tZW50LgotCSogY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KLQotCSogb3BuY2xzLmMgKGdldHBhZ2VzaXplKSBbIUhBVkVfR0VUUEFHRVNJWkVdOiBEZWZpbmUgYXMgMjA0OC4KLQkoX2JmZF9jaHVua3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKF9iZmRfbmV3X2JmZCk6IFNldCBpdCB0byBnZXRwYWdlc2l6ZSgpIGlmIG5lZ2F0aXZlLCBhbmQgdXNlIGl0Ci0JZm9yIG9ic3RhY2sgY2h1bmsgc2l6ZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgZm9yIGdldHBhZ2VzaXplLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHRyYWQtY29yZS5jIChyYXdwdHIpOiBNYWtlIGl0IGEgbG9jYWwgdmFyaWFibGUgb2YKLSAJcHRyYWNlX3VuaXhfY29yZV9maWxlX3AuCi0KLUZyaSBPY3QgMTMgMTE6MjI6MDEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoaW5fcmVsb2NfcCk6IE5ldy4KLQkqIGNvZmYtaTM4Ni5jIChpbl9yZWxvY19wKTogTmV3LgotCSogY29mZmNvZGUuaDogQWxsd2F5cyBpbmNsdWRlIHBlaWNvZGUuaCBpZiBDT0ZGX1dJVEhfUEUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT25seSBzZXQgaGFzX3JlbG9jX3NlY3Rpb24KLQlpZiBQRV9JTUFHRS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBDYWxsCi0JaW5fcmVsb2NfcCB0byBkZWNpZGUgaWYgcmVsb2Mgc2hvdWxkIGJlIGVtaXR0ZWQuCi0JKiBsaWJjb2ZmLmggKHBlX2RhdGFfdHlwZS5pbl9yZWxvY19wKTogTmV3LgotCSogcGVpY29kZS5oIChwZV9ta29iamVjdCk6IEluaXRpYWxpemUgaW5fcmVsb2NfcC4KLQotV2VkIE9jdCAxMSAwMDo0OToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IE1vdmUgdG8gY29mZmdlbi5jLgotCShfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogQ29weSBmcm9tIGNvZmZnZW4uYy4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ29ycmVjdCBjb25kaXRpb25zCi0JdW5kZXIgd2hpY2ggdHlwZSBhbmQgc2l6ZSBjaGFuZ2Ugd2FybmluZ3MgYXJlIGlzc3VlZC4KLQotVHVlIE9jdCAxMCAxODozMjo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9jb3VudF9saW5lbnVtYmVycyk6IERvbid0IGNvdW50IGxpbmUgbnVtYmVycyBmb3IKLQlhIHN5bWJvbCB3aGljaCBpcyBub3QgaW4gYSByZWFsIHNlY3Rpb24uCi0JKGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBSZW5hbWUgZnJvbQotCWNvZmZfbGlua19oYXNoX25ld2Z1bmMgYW5kIG1ha2Ugbm9uLXN0YXRpYy4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogTmV3IGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUuCi0JKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogVXNlIGl0LgotCShwcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzKTogTWFrZSBzdGF0aWMuCi0JKiBsaWJjb2ZmLWluLmggKChfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBSUzYwMDBDT0ZGX0MsIHNldCBjcHV0eXBlCi0JZmllbGQgaW4gWENPRkYgdGRhdGEuCi0JKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogQ2hlY2sgaWZkZWYgUlM2MDAwQ09GRl9DLCBub3QgaWZkZWYKLQlVODAyUk9NQUdJQywgZm9yIGNsYXJpdHkuICBUcnkgdG8gc2V0IGFyY2ggYW5kIG1hY2hpbmUgY29ycmVjdGx5Ci0JYmFzZWQgb24gY3B1dHlwZSBzdG9yZWQgaW4gYS5vdXQgaGVhZGVyLCBvciBpbiBuX3R5cGUgb2YgaW5pdGlhbAotCS5maWxlIHN5bWJvbC4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgY3B1dHlwZSBjb3JyZWN0bHkgaW4gYS5vdXQKLQloZWFkZXIuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWRkIGNhc3RzIHRvIGZpbGVfcHRyIHRvIGF2b2lkCi0Jd2FybmluZ3MuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IFN3YXAgaW4gY3B1dHlwZSBmaWVsZC4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogU3dhcCBvdXQgY3B1dHlwZSBmaWVsZC4gIERvbid0IGNsZWFyCi0Jb2xkIHJlc3YxIGZpZWxkLgotCSogbGliY29mZi1pbi5oIChzdHJ1Y3QgeGNvZmZfdGRhdGEpOiBBZGQgY3B1dHlwZSBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogY3B1LXJzNjAwMC5jIChyczYwMDBfY29tcGF0aWJsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9yczYwMDBfYXJjaCk6IFVzZSBpdC4KLQkqIGNwdS1wb3dlcnBjLmMgKHBvd2VycGNfY29tcGF0aWJsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBEZWZpbmUgdmFyaW91cyBmbGF2b3VycyBvZiBQb3dlclBDLgotCShiZmRfcG93ZXJwY19hcmNoKTogVXNlIHBvd2VycGNfY29tcGF0aWJsZS4gIFBvaW50IGF0Ci0JYXJjaF9pbmZvX3N0cnVjdC4KLQotVHVlIE9jdCAxMCAxMDo1MDo0NiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiAgUmVtb3ZlIEJJU09OLgotCi1UdWUgT2N0IDEwIDAxOjI4OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCB3YXJuIGFib3V0Ci0JY2hhbmdpbmcgdGhlIHNpemUgb3IgdHlwZSBpZiB0aGUgb2xkIGRlZmluaXRpb24gd2FzIHdlYWsuCi0KLU1vbiBPY3QgIDkgMTE6MjQ6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb21iaW5lZF9lbnRyeV90eXBlKTogQWRkIGZpeF9saW5lIGZpZWxkLgotCShjb2ZmX3NsdXJwX2xpbmVfdGFibGUpOiBXYXJuIGlmIHdlIHRyeSB0byBzZXQgdGhlIGxpbmVubyBmaWVsZCBvZgotCWEgc3ltYm9sIHR3aWNlLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IElmIFJTNjAwMENPRkZfQywgaGFuZGxlIENfQklOQ0wgYW5kCi0JQ19FSU5DTCBieSBzZXR0aW5nIGZpeF9saW5lLiAgRml4IENfQlNUQVQgc3ltYm9sIHZhbHVlLgotCSogY29mZmdlbi5jIChjb2ZmX21hbmdsZV9zeW1ib2xzKTogSGFuZGxlIGZpeF9saW5lLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IE9ubHkgdXNlIE5fREVCVUcgaWYgdGhlIHN5bWJvbCBpcyBpbiB0aGUKLQlhYnNvbHV0ZSBzZWN0aW9uLgotCShjb2ZmX3ByaW50X3N5bWJvbCk6IFByaW50IGZpeF92YWx1ZSBzeW1ib2xzIGluIGEgdXNlZnVsIGZhc2hpb24uCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogRGVmaW5lLgotCSh4Y29mZl9kYXRhKTogRGVmaW5lLgotCSogYmZkLmMgKHN0cnVjdCBfYmZkKTogQWRkIHhjb2ZmX29ial9kYXRhIGZpZWxkIHRvIHRkYXRhIHVuaW9uLgotCSogYmZkLWluMi5oLCBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9ta29iamVjdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfbWtvYmplY3QpOiBEZWZpbmUuCi0JKHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlZmluZS4KLQkocnM2MDAwY29mZl9ob3d0b190YWJsZSk6IENoYW5nZSBSX1RPQyBjb21wbGFpbl9vbl9vdmVyZmxvdyBmcm9tCi0Jc2lnbmVkIHRvIGJpdGZpZWxkLgotCShyczYwMDBjb2ZmX3ZlYyk6IEFkZCBEWU5BTUlDIHRvIG9iamVjdF9mbGFncy4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUgLnBhZCBhbmQKLQkubG9hZGVyIHNlY3Rpb25zIHNwZWNpYWxseS4KLQkoY29mZl9uZXdfc2VjdGlvbl9ob29rKTogSWYgUlM2MDAwQ09GRl9DLCBnZXQgdGhlIC50ZXh0IGFuZCAuZGF0YQotCXNlY3Rpb24gYWxpZ25tZW50IGZyb20gdGhlIFhDT0ZGIHRkYXRhIGluZm9ybWF0aW9uLgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBJZiBSUzYwMDBDT0ZGX0MsIHNldCBEWU5BTUlDIGJhc2VkIG9uCi0JRl9TSFJPQkosIGFuZCBjb3B5IHRoZSBleHRyYSBhLm91dCBoZWFkZXIgaW5mb3JtYXRpb24gaW50byB0aGUKLQlYQ09GRiB0ZGF0YSBzdHJ1Y3R1cmUuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgUlM2MDAwQ09GRl9DLCBzZXQgRl9TSFJPQkosCi0JRl9EWU5MT0FEIGFuZCB0aGUgZXh0cmEgYS5vdXQgaGVhZGVyIGluZm9ybWF0aW9uLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfTk9UX0FUX0VORCBmb3IgYSBDX0VYVCBvcgotCUNfSElERVhUIHN5bWJvbCB3aXRoIGF0dGFjaGVkIGNzZWN0IGluZm9ybWF0aW9uLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBJZiBSUzYwMDBDT0ZGX0MsIHN3YXAKLQlpbiB0aGUgb19tYXhkYXRhIGZpZWxkLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBJZiBSUzYwMDBDT0ZGX0MsIHN3YXAgZXh0cmEgWENPRkYgZmllbGRzLgotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBEb24ndCBtb3ZlIGFueSBzeW1ib2wgdG8gdGhlCi0JZW5kIGlmIEJTRl9OT1RfQVRfRU5EIGlzIHNldC4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVuYW1lIF9iZmRfcmVhZF9hcl9oZHIgZmllbGQgdG8KLQlfYmZkX3JlYWRfYXJfaGRyX2ZuLgotCSogbGliYmZkLWluLmggKF9iZmRfcmVhZF9hcl9oZHIpOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogYXJjaGl2ZS5jIChfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyk6IENhc3QgX2JmZF9yZWFkX2FyX2hkcgotCXJldHVybiB2YWx1ZS4KLQkoZG9fc2x1cnBfYnNkX2FybWFwLCBkb19zbHVycF9jb2ZmX2FybWFwKTogTGlrZXdpc2UuCi0JKGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBMaWtld2lzZS4KLQkoX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTGlrZXdpc2UuCi0KLUZyaSBPY3QgIDYgMTY6MTg6MzUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZXRfbmV4dF9tYXBlbnQpOiBSZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUwotCXdoZW4gdGhlIHN5bWJvbCB0YWJsZSBpcyBlbXB0eS4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCByZXNlcnZlCi0Jc3BhY2UgZm9yIHNlY3Rpb24gc3ltYm9scywgc2luY2Ugd2UgZG9uJ3Qgb3V0cHV0IHRoZW0gZWl0aGVyLgotCShlbGZfbTY4a19hZGp1c3RfZHluaW5keCk6IFJlbW92ZWQuCi0KLQkqIHB0cmFjZS1jb3JlLmMgKHJhd3B0cik6IE1ha2UgaXQgYSBsb2NhbCB2YXJpYWJsZSBvZgotIAlwdHJhY2VfdW5peF9jb3JlX2ZpbGVfcC4KLQotRnJpIE9jdCAgNiAxMjoyNDo0NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcnM2MDAwLmMgKHhjb2ZmX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBSZXR1cm4gZmFsc2UsIG5vdAotCU5VTEwuCi0KLQkqIGNvbmZpZy5iZmQgKHBvd2VycGN7LGxlfS17ZWxmLHN5c3Y0LGVhYmksc29sYXJpczJ9KTogQWRkIE5ULCBhbmQKLQlNYWMgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotRnJpIE9jdCAgNiAxMjowNDowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9maXhfc3ltYm9sX25hbWUpOiBEb24ndCB0cnkgdG8gc2V0IHVwIGZpbGUKLQlhdXhlbnQgaWYgdGhlcmUgaXNuJ3Qgb25lLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBJZiB0aGVyZSBpcyBubyBmaWxlIGF1eGVudCwgdXNlIFNZTU5NTEVOCi0JcmF0aGVyIHRoYW4gRklMTk1MRU4gYXMgdGhlIG1heGltdW0gbmFtZSBsZW5ndGguCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfcHJpbnRfYXV4LgotCShiZmRfY29mZl9wcmludF9hdXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgKFJTNjAwMENPRkZfQyB2ZXJzaW9uKSk6IFBvaW50ZXJpemUgdGhlCi0Jc2NubGVuIGZpZWxkIG9mIGFuIFhUWV9MRCBjc2VjdCBhdXggZW50cnkuCi0JKGNvZmZfcHJpbnRfYXV4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBwb2ludGVyaXplIHNjbmxlbiBmaWVsZDsgbm93IGRvbmUKLQlpbiBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2suCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogQ2FsbCBiZmRfY29mZl9wcmludF9hdXguCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogT24gQUlYLCBjbGVhciBGX1JFTEZMRwotCWlmIHRoZXJlIGFyZSBzeW1ib2xzLCBmb3IgbmF0aXZlIEFJWCBsZCBjb21wYXRpYmlsaXR5LgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2suCi0JKGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayk6IERlZmluZSBhcyBhIGZ1bmN0aW9uIGlmIFJTNjAwMENPRkZfQwotCW9yIEk5NjAsIGFuZCBhcyAwIG90aGVyd2lzZS4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9wb2ludGVyaXplX2F1eCk6IENoYW5nZSBwYXJhbWV0ZXJzICB0byB0YWtlCi0Jc3ltYm9sIHBvaW50ZXIgaW5zdGVhZCBvZiB0eXBlIGFuZCBjbGFzcywgYW5kIHRvIHRha2UgYXV4IGluZGV4LgotCUNhbGwgX2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgaWYgaXQgaXMgZGVmaW5lZC4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBBbHdheXMgY2FsbCBjb2ZmX3BvaW50ZXJpemVfYXV4LgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIGFsbCBmaWVsZHMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogY29mZi1yczYwMDAuYzogQWRkIGZ1bGwgc3VwcG9ydCBmb3IgQUlYIGFyY2hpdmVzLiAgUmV3cml0ZSBvbGQKLQlyZWFkLW9ubHkvaG9zdC1vbmx5IHN1cHBvcnQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogU2V0IENfSElERVhUIHN5bWJvbHMgdG8gYmUKLQlCU0ZfTE9DQUwuCi0JKE9USEVSX0dMT0JBTF9DTEFTUyk6IERvIG5vdCBkZWZpbmUgdG8gYmUgQ19ISURFWFQgaWYKLQlSUzYwMDBDT0ZGX0MuCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBfYmZkX3JlYWRfYXJfaGRyIGZpZWxkLiAgTW9kaWZ5Ci0JQkZEX0pVTVBfVEFCTEVfQVJDSElWRSBhY2NvcmRpbmdseS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3NuYXJmX2FyX2hkcik6IERvbid0IGRlY2xhcmUuCi0JKF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBEZWNsYXJlLgotCShfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIpOiBEZWNsYXJlLgotCShfYmZkX3JlYWRfYXJfaGRyKTogRGVmaW5lLgotCShfYmZkX25vYXJjaGl2ZV9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2JzZF9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2NvZmZfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBhcmNoaXZlLmM6IENoYW5nZSBhbGwgY2FsbGVycyBvZiBfYmZkX3NuYXJmX2FyX2hkciB0byBjYWxsCi0JX2JmZF9yZWFkX2FyX2hkciBpbnN0ZWFkLgotCShfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIpOiBSZW5hbWUgZnJvbSBfYmZkX3NuYXJmX2FyX2hkci4KLQkoX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCk6IFJlbmFtZSBmcm9tCi0JY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAuICBNYWtlIG5vbi1zdGF0aWMuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX3NsdXJwX2FybWFwKTogQ2FsbCBfYmZkX3JlYWRfYXJfaGRyIHJhdGhlcgotCXRoYW4gX2JmZF9zbmFyZl9hcl9oZHIuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9yZWFkX2FyX2hkcik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkqIGllZWUuYyAoaWVlZV9yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBvYXN5cy5jIChvYXN5c19yZWFkX2FyX2hkcik6IERlZmluZS4KLQkqIHNvbS5jIChzb21fcmVhZF9hcl9oZHIpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1UaHUgT2N0ICA1IDE0OjA0OjA3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuYyAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBJZiBzeW1wdHIgaXMKLQl6ZXJvLCB0aGVyZSBhcmVuJ3QgYW55IHN5bWJvbHMsIGV2ZW4gaWYgbnN5bXMgaXMgc2V0LgotCi1UaHUgT2N0ICA1IDExOjQ1OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBhZGp1c3RfaGVhZGVycwotCWZpZWxkLgotCSogZWNvZmYuYyAoZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MpOiBDaGVjayBmb3IgdmFyaW91cyBBbHBoYQotCXNlY3Rpb25zLCBhbmQgc2V0IHN0eXAgY29ycmVjdGx5IGZvciB0aGVtOiAuZ290LCAuaGFzaCwgLmR5bmFtaWMsCi0JLmxpYmxpc3QsIC5yZWwuZHluLCAuY29uZmxpYywgLmR5bnN0ciwgLmR5bnN5bSwgLmNvbW1lbnQuCi0JKF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MpOiBDaGVjayBmb3IgdmFyaW91cyBBbHBoYSBzZWN0aW9uCi0JdHlwZXMuCi0JKGVjb2ZmX3NvcnRfaGRycyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJldHVybiBib29sZWFuLCBub3Qgdm9pZC4KLQlTb3J0IHRoZSBzZWN0aW9ucyBieSBWTUEgYmVmb3JlIGxvb2tpbmcgdGhyb3VnaCB0aGVtLiAgUHV0IHRoZQotCWZpcnN0IG5vbiBTRUNfQUxMT0Mgc2VjdGlvbiBvbiBhIG5ldyBwYWdlLiAgUHV0IGV2ZXJ5IFNFQ19BTExPQwotCXNlY3Rpb24gb24gYW4gYXBwcm9wcmlhdGUgYm91bmRhcnkgd2l0aGluIHRoZSBwYWdlLgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLgotCShfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgZm9yIHZhcmlvdXMgQWxwaGEKLQlzZWN0aW9uIHR5cGVzIHdoZW4gaW5jcmVtZW50aW5nIHRleHRfc2l6ZSBhbmQgZGF0YV9zaXplLiAgQ2FsbAotCWFkanVzdF9oZWFkZXJzIGJhY2tlbmQgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9hZGp1c3RfaGVhZGVycyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgYWRqdXN0X2hlYWRlcnMgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogaG9zdHMvaTM4NmJzZC5oOiBSZXN0b3JlIGZpbGUgaW5jb3JyZWN0bHkgZGVsZXRlZCBvbiBTZXAgNi4KLQotV2VkIE9jdCAgNCAxODoxNTowMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BodXJsLmN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC1jb3JlLmMgKENPUkVfVkVSU0lPTl8xKTogVXNlIENPUkVfVkVSU0lPTl8xIGluc3RlYWQKLQlvZiBBTFRFUk5BVEVfQUlYX0NPUkVfRk9STUFULgotCSogY29uZmlndXJlLmluIChhaXg0KTogTm8gbG9uZ2VyIG5lZWQgQ09SRV9GTEFHUy4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlZC4KLQotV2VkIE9jdCAgNCAxNTozNjozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU5TMzJrIGNoYW5nZXMgZnJvbSBJYW4gRGFsbDoKLQkqIGFvdXR4LmggKE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUsIE1ZX3JlbG9jYXRlX2NvbnRlbnRzKTogTmV3Ci0JbWFjcm9zLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQsIGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCwKLQlhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IENhbGwgdGhlbSBpbnN0ZWFkIG9mIF9iZmRfKgotCXZlcnNpb25zLgotCSogYW91dC10YXJnZXQuaCAoTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQpOiBOZXcgbWFjcm8sIGRlZmF1bHRzCi0JdG8gemVyby4KLQkoYmFja2VuZF9kYXRhKTogVXNlIGl0IGluc3RlYWQgb2YgaGFyZGNvZGVkIHplcm8uCi0KLQkqIGFvdXQtbnMzMmsuYyAoQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyk6IE5ldyBtYWNyby4KLQkoTVlfc3dhcF9zdGRfcmVsb2Nfb3V0KTogVXNlIHVkYXRhLmkgZm9yIEtFRVBJVCwgZG9uJ3QgY2FsbCBzdG9pLgotCi0JKiBuczMya25ldGJzZC5jOiBJbmNsdWRlIGJmZC5oLgotCShNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciwgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IG1hY3Jvcy4KLQkoTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVjbGFyZSBmdW5jdGlvbiB0b28uCi0JKiBwYzUzMi1tYWNoLmMgKHNldF9zaXplcyk6IERvbid0IGRlY2xhcmUuCi0JKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLCBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCk6IERlZmluZS4KLQkoYmFja2VuZF9kYXRhLCBNWV9iYWNrZW5kX2RhdGEpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGNvbmZpZy5iZmQ6IFRyZWF0IG5zMzJrLXBjNTMyLXV4KiBsaWtlIG5zMzJrLXBjNTMyLW1hY2gqLCBhbmQKLQluczMyay0qLWxpdGVzKiBsaWtlIG5zMzJrLSotbmV0YnNkKi4KLQotCSogaG9zdHMvbmJzZC5oOiBTd2FwIG9yZGVyIG9mIHN5cy92bXBhcmFtLmggYW5kIHN5cy9wYXJhbS5oLCB0bwotCWNvbXBpbGUgb24gbGl0ZXMuCi0KLVdlZCBPY3QgIDQgMTQ6MTU6NTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlc3RvcmUgc2V0dGluZwotCWZfdGltZGF0IHRvIDAsIGRlbGV0ZWQgb24gQXVndXN0IDIyLgotCi1UdWUgT2N0ICAzIDE2OjI4OjMyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSwKLQljb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLAotCWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IGlmZGVmIHRvIGFsbG93IG92ZXJyaWRlcy4KLQkqIHBlaWNvZGUuaCAoY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3Ci0JKHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKGNvZmZfc3dhcF9zY25oZHJfaW4pOiBTd2FwIGJzcyBzaXplIGludG8gdGhlIHJpZ2h0IHBsYWNlLgotCShwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogQWRkIHNvbWUgbmV3bGluZXMuCi0KLVR1ZSBPY3QgIDMgMTE6NTM6MDQgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQotCi0JKiBzb20uYyAoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBkaWUgaWYgYSBzcGFjZSBoYXMgbm8gc3Vic3BhY2VzLgotCi1Nb24gT2N0ICAyIDE0OjA4OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBsZXQgYSB3ZWFrCi0JZHluYW1pYyBzeW1ib2wgb3ZlcnJpZGUgYSBjb21tb24gc3ltYm9sLiAgRG9uJ3QgY2hhbmdlIHRoZSBzaXplIG9yCi0JdHlwZSBpZiB0aGV5IGhhdmUgYmVlbiBzZXQgYW5kIHRoZSBuZXcgc3ltYm9sIGlzIG5vdCBhIGRlZmluaXRpb24uCi0JV2FybiBpZiB0aGUgc2l6ZSBvciB0eXBlIGNoYW5nZXMuCi0KLVN1biBPY3QgIDEgMDE6MzQ6NDEgMTk5NSAgSmVmZiBMYXcgIChsYXdAaHVybC5jeWdudXMuY29tKQotCi0gICAgICAgICogc29tLmMgKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3Qgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZSBvcgotCXN5bWJvbAlzdHJpbmdzLgotCShzb21fZmluaXNoX3dyaXRpbmcpOiBXcml0ZSB0aGVtIGhlcmUuICBQbGFjZSB0aGVtIGFmdGVyIHRoZQotCXN1YnNwYWNlIGRhdGEsIGJ1dCBiZWZvcmUgdGhlIHJlbG9jcy4KLQotRnJpIFNlcCAyOSAxMTowMTo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogSnVzdCBwYXNzIGZhbHNlLCBub3QKLQlpbmZvLT5zaGFyZWRfbGlicmFyeSwgdG8gc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IERvbid0IHdhcm4gYWJvdXQgYSByZWxvYyBpbiB0aGUgLnRleHQKLQlzZWN0aW9uLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogUmVtb3ZlIC50ZXh0IHNlY3Rpb24gYXNzZXJ0aW9uLgotCi1UaHUgU2VwIDI4IDE4OjQ4OjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogQWRkIHBvd2VycGMtKi1tYWNvcyosIHBvd2VycGMtKi1tcHcqLgotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IEFkZCBwbWFjX3hjb2ZmX3ZlYyBjYXNlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtcG1hYy5vLgotCSogY29mZi1wbWFjLmM6IE5ldyBmaWxlLCBQb3dlck1hYyBYQ09GRiBzdXBwb3J0LgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBZGQgUG93ZXJNYWMgY2FzZS4KLQkqIHRhcmdldHMuYyAocG1hY194Y29mZl92ZWMpOiBEZWNsYXJlLgotCi0JKiBtcHctY29uZmlnLmluOiBWYXJpb3VzIGNoYW5nZXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZQotCWF1dG9jb25mLWJhc2VkIGNvbmZpZ3VyeS4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUgVW5peAotCW1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBob3N0cy9tcHcuaDogUmVtb3ZlLgotCSogYmZkLWluLmgsIGJmZC1pbjIuaDogSWYgTVBXLCBpbmNsdWRlIHRoZSBmaWxlIHRoYXQgZGVmaW5lcwotCXRydWUgYW5kIGZhbHNlIGFzIGVudW1zLCB0aGVuIGRlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRC4KLQotVGh1IFNlcCAyOCAxNzowNjoyMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X2dldF9zeW10YWIpOiBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIG9uIGVycm9yLgotCSogb3BuY2xzLmMgKGJmZF9mZHBlbnIpOiBDaGFuZ2UgV0lOMzIgcmVzdHJpY3Rpb24gdG8gV0lOR0RCLgotCi1UaHUgU2VwIDI4IDE1OjMwOjQ0IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BuZWxsaWU+Ci0KLQkqIGNvZmYtcHBjLmM6IFJlZm9ybWF0dGVkIGFjY29yZGluZyB0byBnbnUgY29udmVudGlvbnMKLQkgICAgICAgICAgICAgIFJlbW92ZWQgaXJyZWxldmFudCAiaWYgMCIgY29kZQotCi1UaHUgU2VwIDI4IDExOjE5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaHAzMDBocHV4LmMgKGNvbnZlcnRfc3ltX3R5cGUpOiBUcmVhdCBzZWNvbmRhcnkgc3ltYm9scyBhcyB3ZWFrCi0Jc3ltYm9scyByYXRoZXIgdGhhbiBhcyBpbmRpcmVjdCBzeW1ib2xzLgotCShNWShzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBhYm91dAotCXNlY29uZGFyeSBzeW1ib2xzLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBNYWtlIHN1cmUgdGhhdCB0aGUgYWxpZ25tZW50Ci0Jb2YgLmN0b3JzIGFuZCAuZHRvcnMgc2VjdGlvbnMgaXMgbm8gbGFyZ2VyIHRoYW4gMi4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBjaGFuZ2UKLQliZmRfbGlua19oYXNoX2NvbW1vbiB0byBiZmRfbGlua19oYXNoX25ldywgc2luY2UgaXQgbWF5IGJlIG9uIHRoZQotCXVuZGVmIGxpc3QuCi0JKGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50KTogRG9uJ3QgcHV0IF9fRFlOQU1JQyBpbiB0aGUKLQlkeW5hbWljIHN5bWJvbHMgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBIYW5kbGUgcmVsb2NzIGNvcnJlY3RseSB3aGVuIGNyZWF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeS4KLQkoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IERvbid0IG1hcmsgdGhlIF9fRFlOQU1JQyBzeW1ib2wgYXMKLQl3cml0dGVuIGV2ZW4gaWYgaXQgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBVc2UgcGx0X29mZnNldCBmb3IgdGhlIGFkZHJlc3Mgb2YKLQl0aGUganVtcCB0YWJsZSByZWxvYy4gIEFkZCBhbiBhc3NlcnRpb24uICBVc2UgUkVMT0NfSk1QX1NMT1QKLQlyYXRoZXIgdGhhbiB0aGUgY29uc3RhbnQgMjIuCi0JKHN1bm9zX2NoZWNrX2R5bmFtaWNfcmVsb2MpOiBIYW5kbGUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluayk6IFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIEdPVCB0bwotCXplcm8gd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSWYgdGhlcmUgaXMgYSBzeW1ib2wgX19EWU5BTUlDLAotCXdyaXRlIGl0IG91dCBhdCB0aGUgc3RhcnQgb2YgdGhlIHN5bWJvbCB0YWJsZS4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtYXJtLm8uCi0KLVRodSBTZXAgMjggMDA6NTg6MDUgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgYXJtLSotY29mZi4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBBZGQgYXJtY29mZl97bGl0dGxlLGJpZ31fdmVjLgotCSogdGFyZ2V0cy5jIChhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMuCi0JKiBjb2ZmLWFybS5jIChhcm1jb2ZmX3tsaXR0bGUsYmlnfV92ZWMpOiBBbHdheXMgZGVmaW5lLgotCi1XZWQgU2VwIDI3IDEwOjM3OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfZmluZF90YXJnZXQpOiBSZW1vdmUgZGVidWdnaW5nIGNvZGUuCi0KLVdlZCBTZXAgMjcgMDc6MjM6MzkgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogY29mZi1wcGMuYywgcGUtcHBjLmMsIHBlaS1wcGMuYzogSW5pdGlhbCBiZmQgZm9yIGNvZmYvUEUKLSAgICAgICAgc3VwcG9ydCBvbiBwb3dlcnBjLgotCSogTWFrZWZpbGUuaW46IGFkZGVkICotcHBjIGZpbGVzCi0JKiBjb2ZmY29kZS5oOiBwcGMgTUFHSUMsIGFuZCB1c2UgcGVpY29kZS5oIHJhdGhlciB0aGFuIGNvZmZzd2FwLmggdG8KLSAgICAgICAgYWxsb3cgcGUgYmFzZWQgLm8ncyB0byBiZSBzaGFyZWQgd2l0aCBvdGhlciB0b29scyBvbiBwcGMvTlQKLQkqIGNvbmZpZy5iZmQ6IGFkZGVkIHBvd2VycGNbbGVdLVtwZXx3aW5udF0gY29uZmlnIHN1cHBvcnQKLQkqIGNvbmZpZ3VyZSwgY29uZmlndXJlLmluOiBhZGRlZCBiZmRfcG93ZXJwY1tsZV1fcGVbaV1fdmVjCi0JKiBwZWljb2RlLmg6IEFkZGVkIG1vcmUgc2VjdGlvbiBmbGFncyBmb3IgUEUgb24gcHBjCi0JICAgICAgICAgICAgIEFkZGVkIGNvZmZfc3dhcF9maWxlaGRyX291dCB0byBhbGxvdyBwZWljb2RlLmggdG8gYmUKLQkJICAgICB1c2VkIGZvciBub24taW1hZ2UgUEUgZmlsZXMgb24gcHBjLgotCQkgICAgIENoZWNrIGZvciBpbWFnZSwgb3Igbm90LCBiZWZvcmUgY29weWluZyBwZV9vcHRoZHIKLQkqIHRhcmdldHMuYzogQWRkZWQgbmV3IGJmZCdzCi0JKiB0YXJnZXRzLmM6IFJlbW92ZWQgdHdvIGluYWN0aXZlIGJmZHMgdGhhdCBzaG91bGRuJ3QgaGF2ZSBtYWRlIGl0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgIGZhci4KLQotVHVlIFNlcCAyNiAxNDowNjo0MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfcmVsb2NfdHlwZSk6IFJlbmFtZSBmcm9tIHJlbG9jX3R5cGUsIGFuZCB1c2UKLQlleHBsaWNpdCB2YWx1ZXMgdG8gaW5pdGlhbGl6ZSBhbGwgcmVsb2NzLiAgQ2hhbmdlIGFsbCB1c2Vycy4KLQkocHBjX2VsZl9icnRha2VuX2lubmVyKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBicmFuY2ggcHJlZGljaXRpb24KLQlyZWxvY3MuCi0JKHBwY19lbGZfYnJ0YWtlbl9yZWxvYyk6IERpdHRvLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IFVzZSBuZXcgZnVuY3Rpb25zLiAgTWFrZSBzdXJlIGFsbCB1bnN1cHBvcnRlZAotCXJlbG9jcyB1c2UgcHBjX2VsZl91bnN1cHBvcnRlZF9yZWxvYy4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogS2VlcCB0cmFjayBvZiB3aGV0aGVyIGFuIGVycm9yCi0JbmVlZHMgdG8gYmUgcmVwb3J0ZWQuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFN1cHBvcnQgYnJhbmNoIHByZWRpY3Rpb24gcmVsb2NzLgotCi1UdWUgU2VwIDI2IDEyOjQ4OjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9hc3NlcnQpOiBSZW1vdmUgXG4gZnJvbSBzdHJpbmcgcGFzc2VkIHRvCi0gICAgICAgIF9iZmRfZXJyb3JfaGFuZGxlci4KLQotCSogY29mZi1pMzg2LmM6IChUV09fREFUQV9TRUNTKTogRG9uJ3QgZGVmaW5lLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogUmVtb3ZlIF9iZmRfbWFrZV9zZWN0aW9uX2hvb2suCi0JKGJmZF9jb2ZmX21ha2Vfc2VjdGlvbl9ob29rKTogRG9uJ3QgZGVmaW5lLgotCShjb2ZmX21ha2Vfc2VjdGlvbl9ob29rKTogUmVtb3ZlLgotCShzZWNfdG9fc3R5cF9mbGFncyk6IFJlbW92ZSBUV09fREFUQV9TRUNTIGNhc2UuCi0JKHN0eXBfdG9fc2VjX2ZsYWdzKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogRG9uJ3QgaW5pdGlhbGl6ZSBtYWtlX3NlY3Rpb25faG9vawotCWZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBKdXN0IGNhbGwKLQliZmRfbWFrZV9zZWN0aW9uX2FueXdheSwgbm90IGJmZF9tYWtlX3NlY3Rpb24gb3IKLQliZmRfY29mZl9tYWtlX3NlY3Rpb25faG9vay4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbWFrZV9zZWN0aW9uX2hvb2spOiBSZW1vdmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX21ha2Vfc2VjdGlvbl9ob29rKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogRG9uJ3QgaW5pdGlhbGl6ZQotCW1ha2Vfc2VjdGlvbl9ob29rIGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBEb24ndCB0cnkgdG8gc3R1ZmYKLQlwb2ludGVycyBpbnRvIHZhbHVlIGZpZWxkIGZvciB3YXJuaW5nIGFuZCBpbmRpcmVjdCBzeW1ib2xzOyBqdXN0Ci0JbGVhdmUgdGhlIHZhbHVlIGZpZWxkIGFsb25lLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBVc2UgbmV4dCBzeW1ib2wgZm9yCi0Jd2FybmluZyBhbmQgaW5kaXJlY3Qgc3ltYm9scywgcmF0aGVyIHRoYW4gbG9va2luZyBpbiBzeW1ib2wgdmFsdWUuCi0JKiBlY29mZi5jIChlY29mZl9zZXRfc3ltYm9sX2luZm8pOiBSZW1vdmUgaW5kaXJlY3RfcHRyX3B0cgotCXBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4gIFJlbW92ZSBzdXBwb3J0IGZvciBpbmRpcmVjdAotCXN5bWJvbHM7IGl0IGRpZG4ndCB3b3JrIGFueWhvdy4KLQkoX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBSZW1vdmUgaW5kaXJlY3RfcHRyIHZhcmlhYmxlLgotCSogc3ltcy5jOiBDaGFuZ2UgY29tbWVudHMgYWJvdXQgQlNGX1dBUk5JTkcgYW5kIEJTRl9JTkRJUkVDVC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIFNlcCAyNSAxNjowNDowOSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEZvciBhbGwgMTQtYml0IGJyYW5jaCByZWxvY3MsCi0JZ28gYmFjayB0byB0ZWxsaW5nIHRoZSB0b29scyB0aGlzIHJlbG9jIG9wZXJhdGVzIG9uIDMyIGJpdHMuCi0KLU1vbiBTZXAgMjUgMTE6NDg6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfY2FsbGJhY2spOiBVc2UgX2JmZF9lcnJvcl9oYW5kbGVyCi0JcmF0aGVyIHRoYW4gYSBkaXJlY3QgZnByaW50Zi4KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShwcGNfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKTogTGlrZXdpc2UuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogaTM4NmxpbnV4LmMgKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkobGludXhfZmluaXNoX2R5bmFtaWNfbGluayk6IExpa2V3aXNlLgotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfY29yZV9maWxlX3ApOiBMaWtld2lzZS4KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fc2l6ZW9mX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19iYWRfYnl0ZSk6IExpa2V3aXNlLgotCSogYmZkLmMgKGJmZF9hc3NlcnQpOiBMaWtld2lzZS4gIEFsc28gY2hhbmdlIGZpbGUgdG8gYmUgY29uc3QuCi0JKiBsaWJiZmQtaW4uaCAoYmZkX2Fzc2VydCk6IERlY2xhcmUgZmlyc3QgcGFyYW1ldGVyIGNvbnN0LgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IERvbid0IGJvdGhlciB0byBmcHJpbnRmOyByZXR1cm5pbmcKLQliZmRfcmVsb2Nfb3ZlcmZsb3cgaXMgZW5vdWdoLgotCSogY29mZi1oODMwMC5jIChydHlwZTJob3d0byk6IERvbid0IGJvdGhlciB0byBmcHJpbnRmOyBqdXN0IGFib3J0LgotCSogY29mZi1oODUwMC5jIChydHlwZTJob3d0byk6IExpa2V3aXNlLgotCSogY29mZi16OGsuYyAocnR5cGUyaG93dG8pOiBMaWtld2lzZS4KLQkqIGNvZmZjb2RlLmggKGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9nZXRfbGluZW5vKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX25vX2luZm9fdG9faG93dG8pOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfbm9faW5mb190b19ob3d0b19yZWwpOiBMaWtld2lzZS4KLQkqIGhwMzAwaHB1eC5jIChjb252ZXJ0X3N5bV90eXBlKTogTGlrZXdpc2UuCi0JKE1ZKHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbW92ZSAjaWYgMCBzZWN0aW9ucy4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgbGluZV9idWYgZmllbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogUmVtb3ZlIHN0YXRpY3MgYnVmZmVyCi0JYW5kIGZpbGVuYW1lX2J1ZmZlci4gIEluc3RlYWQsIHVzZSBhIG1hbGxvYyBidWZmZXIgc3RvcmVkIGluIHRoZQotCW5ldyBsaW5lX2J1ZiBmaWVsZC4gIFJlbW92ZSBsZW5ndGggcmVzdHJpY3Rpb25zLgotCi0JKiBjb2ZmZ2VuLmMgKHN0cmluZ19zaXplKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZGVidWdfc3RyaW5nX3NpemUsIGRlYnVnX3N0cmluZ19zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogQWRkIHN0cmluZ19zaXplX3AsIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsCi0JYW5kIGRlYnVnX3N0cmluZ19zaXplX3AgcGFyYW1ldGVycy4gIFVzZSB0aGVtIGluc3RlYWQgb2YgdGhlCi0JZ2xvYmFsIHZhcmlhYmxlcy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wsIGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCk6IExpa2V3aXNlLgotCShjb2ZmX3dyaXRlX3N5bWJvbHMpOiBBZGQgbG9jYWwgdmFyaWFibGVzIHRvIHJlcGxhY2UgcmVtb3ZlZAotCWdsb2JhbCB2YXJpYWJsZXMuCi0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCBvZmZzZXQsIGksCi0JZnVuY3Rpb24sIGFuZCBsaW5lX2Jhc2UgZmllbGRzLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVXNlIHNlY3Rpb24gdGRhdGEgdG8gY2FjaGUKLQlpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gdXNpbmcgc3RhdGljIHZhcmlhYmxlcy4KLQotCSogc3Vub3MuYyAoc3Vub3NfcmVhZF9keW5hbWljX2luZm8pOiBBZGp1c3Qgb2Zmc2V0cyBpbiBhbiBOTUFHSUMKLQlmaWxlLiAgRnJvbSBQZXRlciBEZVdvbGYgPHBsZEBhbXQudGF5MS5kZWMuY29tPi4KLQotCSogaW5pdC5jIChpbml0aWFsaXplZCk6IFJlbW92ZSBzdGF0aWMgdmFyaWFibGUuCi0JKGJmZF9pbml0KTogRG9uJ3QgYm90aGVyIHNldHRpbmcgaW5pdGlhbGl6ZWQuCi0JKGJmZF9jaGVja19pbml0KTogUmVtb3ZlLgotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCk6IERvbid0IGNhbGwgYmZkX2NoZWNrX2luaXQuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotU2F0IFNlcCAyMyAwMToyMjoyMyAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIERvbid0IGNoZWNrIHRoZSBjb3JlIGZpbGUKLQlzaXplIGZvciBmdWxsIGNvcmUgZHVtcHMuIENvcHkgY29yZSBmaWxlIGhlYWRlciB0byBwcml2YXRlIGRhdGEuCi0JKHJzNjAwMGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCwKLQlyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6ICBOZXcgZnVuY3Rpb25zIHRvIGV4dHJhY3QKLQl0aGUgZmlsZSBuYW1lIGFuZCB0ZXJtaW5hdGluZyBzaWduYWwgZnJvbSB0aGUgY29yZSBmaWxlLgotCSogY29mZi1yczYwMDAuYzogIFVzZSB0aGVtLgotCi1GcmkgU2VwIDIyIDE3OjQ0OjQ3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUNoYW5nZSBhcmNoIGluZm8gdG8gYmUgY29uc3QsIGluaXRpYWxpemVkIGF0IGNvbXBpbGUgdGltZS4KLQkqIGFyY2h1cmVzLmM6IFJlaW5kZW50IG1hbnkgZnVuY3Rpb25zLiAgQ2hhbmdlIENPTlNUIHRvIGNvbnN0LgotCShiZmRfYXJjaF9pbmZvX3R5cGUpOiBNYWtlIGFyY2hfbmFtZSBjb25zdC4gIFJlbW92ZSBkaXNhc3NlbWJsZTsKLQlub3RoaW5nIHNldCBpdCBhbnlob3cuICBNYWtlIG5leHQgY29uc3QuCi0JKGJmZF9hcmNoX2luZm9fbGlzdCk6IFJlbW92ZS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBSZW5hbWUgZnJvbSBhcmNodXJlc19pbml0X3RhYmxlLiAgQ2hhbmdlIGZyb20KLQlhIHRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGEgdGFibGUgb2YgYmZkX2FyY2hfaW5mb190eXBlCi0Jc3RydWN0dXJlIGFkZHJlc3Nlcy4KLQkoYmZkX3NjYW5fYXJjaCk6IFJld3JpdGUgYWNjb3JkaW5nbHkuICBSZXR1cm4gYSBjb25zdCBwb2ludGVyLgotCShiZmRfbG9va3VwX2FyY2gpOiBMaWtld2lzZS4KLQkoYmZkX3NldF9hcmNoX2luZm8pOiBSZXdyaXRlIGFjY29yZGluZ2x5LiAgQ2hhbmdlIGFyZ3VtZW50IHRvIGJlIGEKLQljb25zdCBwb2ludGVyLgotCShiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdCk6IE1ha2UgY29uc3QuCi0JKGJmZF9hcmNoX2luaXQsIGJmZF9hcmNoX2xpbmtpbik6IFJlbW92ZS4KLQkoYmZkX2dldF9hcmNoX2luZm8pOiBSZXR1cm4gYSBjb25zdCBwb2ludGVyLgotCSogaW5pdC5jIChiZmRfaW5pdCk6IERvbid0IGNhbGwgYmZkX2FyY2hfaW5pdC4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IE1ha2UgYXJjaF9pbmZvIGNvbnN0LgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaW46IFB1dCAmIGJlZm9yZSBldmVyeXRoaW5nIGluICRzZWxhcmNocy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNwdS0qLmM6IENoYW5nZSBiZmRfKl9hcmNoIGZyb20gYSBmdW5jdGlvbiB3aGljaCBjYWxscwotCWJmZF9hcmNoX2xpbmtpbiB0byBhIGNvbnN0IHN0cnVjdHVyZS4KLQkqIGllZWUuYyAoaWVlZV9vYmplY3RfcCk6IE1ha2UgYXJjaCBjb25zdC4KLQotRnJpIFNlcCAyMiAxNjoyMzoxOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3R5cGUpOiBBZGQgcmVsb2NhdGlvbnMgdG8gc3VwcG9ydCBhbGwgb2YKLQlQb3dlclBDIFYuNC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi0JKiBlbGYzMi1wcGMuYyAocmVsb2NfdHlwZSk6IFVwZGF0ZSBuYW1lcyB0byBtYXRjaCBjdXJyZW50IGRyYWZ0LgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IE1hcmsgMTQgYml0IHJlbG9jcyBhcyBzaG9ydCBzaXplZCBhbmQgUEMKLQlyZWxhdGl2ZS4gIFVwZGF0ZSBuYW1lcyB0byBjdXJyZW50IFYuNCBkcmFmdC4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBzdXBwb3J0IGZvciBtb3JlIHJlbG9jYXRpb25zLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW5hbWUgcmVsb2NhdGlvbnMgdG8gbWF0Y2ggZHJhZnQuCi0KLVRodSBTZXAgMjEgMjE6NTM6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBBbGxvdyBtb2R1bGVzCi0JY29tcGlsZWQgd2l0aCAtbXJlbG9jYXRhYmxlLWxpYiB0byBiZSBsaW5rZWQgd2l0aCBlaXRoZXIgbm9ybWFsCi0JbW9kdWxlcyBvciAtbXJlbG9jYXRhYmxlIG1vZHVsZXMuCi0KLVdlZCBTZXAgMjAgMTI6MDM6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENsZWFyIHRoZSB2c3RhbXAgZmllbGQKLQlpbiB0aGUgYS5vdXQgaGVhZGVyLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KSk6IERvbid0IHNldCByX2V4dGVybiBmb3IKLQlhIHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wsIGV2ZW4gaWYgaXQncyBub3QgYSBzZWN0aW9uLgotCi1UdWUgU2VwIDE5IDE3OjAyOjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogUmVtb3ZlIHVudXNlZCBhbGlnbl9wb3dlcl9taW4gZmllbGQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBBbGwgYmFja2VuZHM6IFJlbW92ZSBpbml0aWFsaXphdGlvbiBvZiBhbGlnbl9wb3dlcl9taW4uCi0KLVR1ZSBTZXAgMTkgMTQ6MDI6MjEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEdldCBzaXplcyBmb3IgQlNTIHJpZ2h0LgotCi1Nb24gU2VwIDE4IDE0OjM1OjAxIDE5OTUgIEFybmUgSC4gSnV1bCAgPGFybmVqQHB2di51bml0Lm5vPgotCi0JKiBjb25maWcuYmZkIChtaXBzLWRlYy1uZXRic2QqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzLWRlYy1uZXRic2QqKTogTmV3IGhvc3QuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtZGVjLW5ldGJzZCopOiBOZXcgbmF0aXZlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgU2VwIDE1IDEwOjI0OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU1ha2UgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIgbWVyZ2UgY29tbW9uIHR5cGVzOgotCSogY29mZmxpbmsuYyAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQpOiBEZWZpbmUuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKTogRGVmaW5lLgotCShjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8pOiBBZGQgZGVidWdfbWVyZ2UgZmllbGQuCi0JKGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBBbGxvY2F0ZSBhbmQgZnJlZSBkZWJ1Z19tZXJnZSB0YWJsZS4KLQkoY29mZl9saW5rX2lucHV0X2JmZCk6IE1lcmdlIGlkZW50aWNhbCBlbnVtLCBzdHJ1Y3QgYW5kIHVuaW9uCi0JdHlwZXMuCi0KLVRodSBTZXAgMTQgMTQ6NTM6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQ29udmVydCBpOTYwIENPRkYgdG8gdXNlIENPRkYgYmFja2VuZCBsaW5rZXIuCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogVXNlIGEgY29mZl9zZWN0aW9uX2RhdGEKLQlzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIHN5bWJvbCBiZWluZyB1c2VkLgotCShjb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9pOTYwX2FkanVzdF9zeW1uZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspOiBEZWZpbmUuCi0JKGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkoY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBjYWxsYmFjayBmdW5jdGlvbgotCV9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rLgotCShiZmRfY29mZl9zdGFydF9maW5hbF9saW5rKTogRGVmaW5lLgotCShjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlKTogQWRkIGNvZmZfc3RhcnRfZmluYWxfbGluay4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSk6IE1ha2UgZ2xvYmFsbHkKLQl2aXNpYmxlLgotCShfYmZkX2NvZmZfZmluYWxfbGluayk6IENhbGwgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayBpZiB0aGUKLQlmdW5jdGlvbiBjYWxsYmFjayBpcyBub3QgTlVMTC4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCB0ZGF0YSBmaWVsZC4KLQkoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbiAoaWNvZmZfYmlnX3ZlYyk6IEFkZCBjb2ZmbGluay5vLgotCShpY29mZl9saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMTMgMTc6Mzg6MjMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4taW5mbyk6IFJlbW92ZSBleHRyYW5lb3VzIHRhYiBmcm9tIGxpbmUKLQlmb2xsb3dpbmcgYWN0aW9uLgotCi1XZWQgU2VwIDEzIDEzOjI3OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IEZhaWwgaWYgYSBzZWN0aW9uIHdpdGggbm8KLQljb250ZW50cyBoYXMgcmVsb2NzLgotCi1UaHUgU2VwIDEyIDEyOjQ1OjM0IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogS2VlcCB0aGUKLQlyYXcgc2l6ZSBzYWZlLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbWVtYmVyIGlmIGl0J3MgYSByZWxvY2F0YWJsZQotCWZpbGUuCi0JKiBsaWJjb2ZmLWluLmggKHBlX2RhdGFfdHlwZSk6IE5ldyBtZW1iZXIgJ2hhc19yZWxvY19zZWN0aW9uJwotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBDbGVhciBub3QtcmVsb2MgZmxhZwotCWlmIHJlbG9jYXRhYmxlIGZpbGUuIFN3YXAgb3V0IHNhdmVkIHJhdyBzaXplLgotCi1UdWUgU2VwIDEyIDEyOjE0OjMzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21haW50YWluZXJfY2xlYW4pOiBSZW5hbWUgZnJvbSBkb19yZWFsY2xlYW4uCi0JKG1haW50YWluZXItY2xlYW4pOiBSZW5hbWUgZnJvbSByZWFsY2xlYW4sIHBhc3NpbmcKLQltYWludGFpbmVyLWNsZWFuIGRvd24gdG8gc3ViZGlyZWN0b3JpZXMsIGJ1dCBsZWF2ZSByZWFsY2xlYW4gYXMgYQotCXN5bm9ueW0uCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFBhc3Mgc3ltYm9sIG5hbWUgdG8KLQl3YXJuaW5nIGNhbGxiYWNrLgotCi0JKiBkZXAtaW4uc2VkOiBSZW1vdmUgY29uZmlnLmggZnJvbSBnZW5lcmF0ZWQgZGVwZW5kZW5jaWVzLgotCi0JKiBzdW5vcy5jIChzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYik6IE5ldyBzdGF0aWMgZnVuY3Rpb24sCi0JYnJva2VuIG91dCBvZiBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIuCi0JKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IENhbGwgbmV3IGZ1bmN0aW9uCi0Jc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIuCi0JKHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMpOiBBZGQgdGhyZWUgbmV3IHBhcmFtZXRlcnMuICBSZXR1cm4gdGhlCi0JZHluYW1pYyBzeW1ib2wgdGFibGUgdG8gdGhlIGNhbGxlci4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IFBlcm1pdCBhZGRfZHluYW1pY19zeW1ib2xzCi0JY2FsbGJhY2sgdG8gb3ZlcnJpZGUgdGhlIHN5bWJvbHMgYmVpbmcgcmVhZC4KLQkqIGxpYmFvdXQuaCAoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogQWRkIHRocmVlIG5ldyBwYXJhbWV0ZXJzCi0JdG8gYWRkX2R5bmFtaWNfc3ltYm9scyBjYWxsYmFjay4KLQotCUV4dGVuc2l2ZSBtaW5vciBjaGFuZ2VzIHRvIGF2b2lkIHZhcmlvdXMgZ2NjIHdhcm5pbmdzLiAgQWxzbzoKLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IFJlbW92ZSBjb2ZmLWFybS5vLgotCSogYXJjaHVyZXMuYyAoYmZkX2FyY2hfaW5mb190eXBlKTogQ2hhbmdlIG1hY2ggZmllbGQgZnJvbSBsb25nIHRvCi0JdW5zaWduZWQgbG9uZy4KLQkoYmZkX2xvb2t1cF9hcmNoKTogQ2hhbmdlIG1hY2hpbmUgcGFyYW1ldGVyIGZyb20gbG9uZyB0byB1bnNpZ25lZAotCWxvbmcuCi0KLU1vbiBTZXAgMTEgMTA6NTU6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBGaXggQkZEX0FTU0VSVDogaXQncyBPSyB0byBmaW5kCi0JYSBzeW1ib2wgd2l0aCBhIG5vbi16ZXJvIHBsdF9vZmZzZXQuCi0KLUZyaSBTZXAgIDggMTE6NDc6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGFsaWduX2ZpbGVfcG9zaXRpb24pOiBSZW1vdmU7IG5vdCB1c2VkLgotCi0JKiBjb25maWd1cmUuaW46IE9ubHkgY2hlY2sgZm9yIDxzeXMvcHJvY2ZzLmg+IG9uIGEgbmF0aXZlIHN5c3RlbSwKLQlhbmQgbWFrZSBzdXJlIGl0IGRlZmluZXMgcHJzdGF0dXNfdC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IFNlcCAgNyAxMjo0ODowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogQ29ycmVjdCBtNjhrIGFib3J0IHRlc3QuCi0KLQkqIGNvbmZpZy5pbjogUmVuYW1lIGZyb20gY29uZmlnLmguaW4uCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUiB3aXRoIGNvbmZpZy5oOmNvbmZpZy5pbi4KLQlDaGVjayBmb3IgY29uZmlnLmg6Y29uZmlnLmluIHdoZW4gY3JlYXRpbmcgc3RhbXAtaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gY29uZmlnLmluIHJhdGhlciB0aGFuCi0JY29uZmlnLmguaW4uICBTZXQgQ09ORklHX0hFQURFUlMgdG8gY29uZmlnLmg6Y29uZmlnLmluIHdoZW4KLQljYWxsaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIE1ha2VmaWxlLmluIChkb19kaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmggYW5kIHN0YW1wLWguCi0JKE1ha2VmaWxlKTogSnVzdCByZWJ1aWxkIE1ha2VmaWxlLgotCShjb25maWcuaCwgc3RhbXAtaCk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBDcmVhdGUgc3RhbXAtaCB3aGVuIHJlYnVpbGRpbmcgY29uZmlnLmguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgIDYgMTU6MDA6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ09ORklHX0hFQURFUi4gIFN1YnN0aXR1dGUKLQlIT1NUXzY0QklUX0xPTkcuICBDaGVjayB0aGF0IHZhcmlvdXMgaGVhZGVyIGZpbGVzIGV4aXN0LiAgQ2hlY2sKLQl0aGF0IGZjbnRsIGV4aXN0cy4gIENhbGwgQkZEX0JJTkFSWV9GT1BFTi4gIENoZWNrIHdoZXRoZXIgbWFsbG9jCi0JYW5kL29yIGZyZWUgbmVlZCB0byBiZSBkZWNsYXJlZC4gIERvbid0IG1ha2UgYSBsaW5rIHRvIHN5c2RlcC5oLgotCURlZmluZSBUUkFEX0hFQURFUiBmb3IgdmFyaW91cyBob3N0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBEb24ndCBzZXQgbXlfaG9zdC4gIEFkZCBkZWZpbml0aW9ucyB0YWtlbiBmcm9tCi0JaG9zdCBoZWFkZXIgZmlsZXMgZm9yIHZhcmlvdXMgZW50cmllcy4gIFJlbW92ZSBlbnRyaWVzIHdoaWNoIG5vdwotCWRvIG5vdGhpbmcuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLmluOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2hlYWRlci4KLQkqIHN5c2RlcC5oOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChkb19kaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgc3lzZGVwLmguCi0JKFJFQ09ORklHKTogUmVtb3ZlLgotCShMT0NBTF9IX0RFUFMpOiBOZXcgdmFyaWFibGUuCi0JKCQoQkZEX0xJQlMpKTogVXNlICQoTE9DQUxfSF9ERVBTKSByYXRoZXIgdGhhbiBsaWJiZmQuaCBhbmQKLQkkKFJFQ09ORklHKS4KLQkoJChCRkRfTUFDSElORVMpLCAkKEJGRF9CQUNLRU5EUykpOiBMaWtld2lzZS4KLQkoJChPUFRJT05BTF9CQUNLRU5EUykpOiBMaWtld2lzZS4KLQkoc3RtcC1iZmQuaCk6IEp1c3Qgc3Vic3RpdHV0ZSBmb3IgQkZEX0hPU1RfNjRCSVRfTE9ORywgcmF0aGVyIHRoYW4KLQlsb29raW5nIHRocm91Z2ggc3lzZGVwLmguCi0JKiBiZmQtaW4uaCAoQkZEX0hPU1RfNjRCSVRfTE9ORyk6IERlZmluZTsgc2V0IGJ5IE1ha2VmaWxlLgotCShCRkRfSE9TVF82NF9CSVQpOiBEZWZpbmUgYmFzZWQgb24gQkZEX0hPU1RfNjRCSVRfTE9ORy4KLQkoZnByaW50Zl92bWEsIHNwcmludGZfdm1hKTogTGlrZXdpc2UuCi0JKGludDY0X3R5cGUsIHVpbnQ2NF90eXBlKTogRG9uJ3QgZGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYXJjaHVyZXMuYywgYmZkLmMsIHNyZWMuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKiBlbGZjb3JlLmg6IENoZWNrIEhBVkVfU1lTX1BST0NGU19IIHJhdGhlciB0aGFuIEhBVkVfUFJPQ0ZTLgotCSogbHlueC1jb3JlLmM6IEluY2x1ZGUgc3R1ZmYgZnJvbSBvbGQgaG9zdHMvbHlueC5oLgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ2hlY2sgSEFWRV9GTkNUTCBhbmQgZGVmaW5lZCAoRl9HRVRGTCksCi0JcmF0aGVyIHRoYW4gTk9fRkNOVEwuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfbGlzdCk6IENoZWNrIEhPU1RfSFBQQUhQVVggYW5kICEgX19TVERDX18KLQlyYXRoZXIgdGhhbiBOQVRJVkVfSFBQQUhQVVhfQ09NUElMRVIuCi0JKiB0cmFkLWNvcmUuYzogRG9uJ3QgaW5jbHVkZSA8ZXJybm8uaD4uICBJbmNsdWRlIFRSQURfSEVBREVSIGlmIGl0Ci0JaXMgZGVmaW5lZC4KLQkqIGhvc3RzLyouaDogUmVtb3ZlIGFsbCBoZWFkZXIgZmlsZXMgd2hpY2ggbWVyZWx5IGluY2x1ZGUsCi0JZGVjbGFyZSwgYW5kIGRlZmluZSB0aGluZ3MuICBMZWF2ZSBoZWFkZXIgZmlsZXMgd2hpY2ggZGVmaW5lCi0JaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRyYWQtY29yZS5jLgotCi0JKiBhY2xvY2FsLm00IChCRkRfQklOQVJZX0ZPUEVOKTogRGVmaW5lLgotCShCRkRfQ0NfRk9SX0JVSUxEKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX0NDX0ZPUl9CVUlMRC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAgNSAxOTozNToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IERvbid0IHRyeSB0byBncmVwIC4uL01ha2VmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvZmYtc3BhcmMuYyAoQ0FMQ19BRERFTkQpOiBEb24ndCBzZXQgdGhlIGFkZGVuZCB0byB0aGUgdmFsdWUgb2YKLQlhIGdsb2JhbCBzeW1ib2wuCi0KLVR1ZSBTZXAgIDUgMTI6NDg6MjYgMTk5NSAgSmFzb24gTW9sZW5kYSAgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBpMzg2cGVfdmUgLT4gaTM4NnBlX3ZlYy4KLQotTW9uIFNlcCAgNCAxNDowMjo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBJbmNvcnBvcmF0ZSBob3N0IE1ha2VmaWxlIGZyYWdtZW50cyBieSBzZXR0aW5nCi0Jc2hlbGwgdmFyaWFibGVzLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX1BST0dfQ0MuICBTdWJzdGl0dXRlIENGTEFHUywgSERFRklORVMgYW5kCi0JQVIuICBDYWxsIEFDX1BST0dfSU5TVEFMTC4gIFN1YnN0aXR1dGUgQ0NfRk9SX0JVSUxELCBjaG9vc2luZyBhCi0JdmFsdWUgYmFzZWQgb24gd2hldGhlciB0aGUgY29kZSBpcyBiZWluZyBjb21waWxlZCBieSBhIGNyb3NzCi0JY29tcGlsZXIuICBEb24ndCBzdWJzdGl0dXRlIGhvc3RfbWFrZWZpbGVfZnJhZyBvciBmcmFncy4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlIHRvIGRlZmluZSBsb2NhbCBBQ19QUk9HX0NDLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1BST0dSQU0pOiBTZXQgdG8gQElOU1RBTExfUFJPR1JBTUAuCi0JKElOU1RBTExfREFUQSk6IFNldCB0byBASU5TVEFMTF9EQVRBQC4KLQkoQVIpOiBTZXQgdG8gQEFSQC4KLQkoQ0MpOiBEZWZpbmUgYXMgQENDQC4KLQkoQ0ZMQUdTKTogU2V0IHRvIEBDRkxBR1NALgotCShDQ19GT1JfQlVJTEQpOiBTZXQgdG8gQENDX0ZPUl9CVUlMREAuCi0JKEBob3N0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgotCShBTExfQ0ZMQUdTKTogQ2hhbmdlICQoSERFRklORVMpIHRvIEBIREVGSU5FU0AuICBNb3ZlICQoQ0ZMQUdTKQotCWFmdGVyIG90aGVyIG9wdGlvbnMuCi0JKGNvbmZpZy5zdGF0dXMpOiBSZW1vdmUgZGVwZW5kZW5jeSB1cG9uIEBmcmFnc0AuCi0JKiBjb25maWcvKi5taCwgY29uZmlnL1JFQURNRTogUmVtb3ZlLgotCi0JKiBjb25maWcuYmZkOiBSZXdyaXRlIHRvIGluY29ycG9yYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgTWFrZWZpbGUKLQlmcmFnbWVudHMgYnkgc2V0dGluZyBzaGVsbCB2YXJpYWJsZXMsIHJhdGhlciB0aGFuIG1lcmVseSByZXR1cm5pbmcKLQl0aGUgbmFtZSBvZiBhIE1ha2VmaWxlIGZyYWdtZW50LgotCSogY29uZmlndXJlLmluOiBVc2Ugc2hlbGwgdmFyaWFibGVzIHNldCBieSBjb25maWcuYmZkIHJhdGhlciB0aGFuCi0JbG9va2luZyBhdCB0aGUgdGFyZ2V0IE1ha2VmaWxlIGZyYWdtZW50IGZpbGVzLiAgRG9uJ3Qgc3Vic3RpdHV0ZQotCXRhcmdldF9tYWtlZmlsZV9mcmFnLiAgRG8gc3Vic3RpdHV0ZSBUREVGSU5FUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChAdGFyZ2V0X21ha2VmaWxlX2ZyYWdAKTogUmVtb3ZlLgotCShBTExfQ0ZMQUdTKTogQ2hhbmdlICQoVERFRklORVMpIHRvIEBUREVGSU5FU0AuCi0JKiBjb25maWcvKi5tdDogUmVtb3ZlLgotCi1Nb24gU2VwICA0IDAzOjEzOjI4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFB1dCBjaGFuZ2VxdW90ZSBsaW5lcyBhcm91bmQgImlbMzQ1XTg2IiBwYXR0ZXJucwotCXNlY3Rpb24gb2YgY29yZSBmaWxlIHN1cHBvcnQuCi0KLVN1biBTZXAgIDMgMTE6MzE6NTggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUgdG8gdXNlIHRoZQotCWdlbmVyaWMgdmVyc2lvbi4KLQotRnJpIFNlcCAgMSAxNzowODo0MCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogQWRkIEltYWdlQmFzZSB0bwotCWVudHJ5LCB0ZXh0X3N0YXJ0IGFuZCBkYXRhX3N0YXJ0LgotCi1GcmkgU2VwICAxIDE4OjA2OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IFJlbW92ZSAkKFRERVBGSUxFUykuCi0JKiBjb25maWcvYXBvbGxvLm10IChUREVQRklMRVMpOiBSZW1vdmUuCi0JKiBjb25maWcvUkVBRE1FOiBVcGRhdGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHNldCBDT1JFRklMRSBhbmQKLQlDT1JFRkxBRyBiYXNlZCBvbiB0aGUgY2Fub25pY2FsIGhvc3QgbmFtZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX0NGTEFHUyk6IEFkZCBAQ09SRUZMQUdALgotCShPRklMRVMpOiBSZXBsYWNlICQoSERFUEZJTEVTKSB3aXRoIEBDT1JFRklMRUAuCi0JKiBjb2ZmLXJzNjAwMC5jOiBDaGVjayBBSVhfQ09SRSByYXRoZXIgdGhhbiBIT1NUX0FJWCBmb3IgY29yZSBmaWxlCi0Jc3VwcG9ydCByb3V0aW5lcy4gIENoZWNrIExZTlhfQ09SRSByYXRoZXIgdGhhbiBIT1NUX0xZTlguCi0JKiBseW54LWNvcmUuYzogQ2hlY2sgTFlOWF9DT1JFIHJhdGhlciB0aGFuIEhPU1RfTFlOWC4KLQkqIGkzODZseW54LmM6IExpa2V3aXNlLgotCSogbTY4a2x5bnguYzogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYzogTGlrZXdpc2UuCi0JKiByczYwMDAtY29yZS5jOiBDaGVjayBBSVhfQ09SRSByYXRoZXIgdGhhbiBIT1NUX0FJWC4KLQkqICotY29yZS5jOiBDb21tZW50IGNoYW5nZXMuCi0JKiBjb25maWcvZGVjc3RhdGlvbi5taCAoSERFUEZJTEVTKTogUmVtb3ZlLgotCShIREVGSU5FUyk6IFJlbW92ZSAtRFRSQURfQ09SRS4KLQkqIGNvbmZpZy9pcml4My5taCAoUkFOTElCKTogUmVtb3ZlLgotCSogY29uZmlnL2lyaXg0Lm1oIChIREVQRklMRVMsIFJBTkxJQik6IFJlbW92ZS4KLQkoSERFRklORVMpOiBSZW1vdmUgLURJUklYX0NPUkUuCi0JKiBjb25maWcvcmlzY29zLm1oIChSQU5MSUIsIEhERVBGSUxFUyk6IFJlbW92ZS4KLQkoSERFRklORVMpOiBSZW1vdmUgLURUUkFEX0NPUkUuCi0JKiBjb25maWcvbmNyMzAwMC5taCAoQVJfRkxBR1MsIFJBTkxJQik6IFJlbW92ZS4KLQkqIGNvbmZpZy91bHRyYTMubWggKFJBTkxJQik6IFJlbW92ZS4KLQkqIGNvbmZpZy9haXg0Lm1oLCBjb25maWcvYWxwaGFvc2YubWgsIGNvbmZpZy9hbWl4Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvYXBvbGxvLm1oLCBjb25maWcvZGVsdGE2OC5taCwgY29uZmlnL2RlbHRhODgubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9kcHgyLm1oLCBjb25maWcvZXNpeC5taCwgY29uZmlnL2hhcnJpcy5taDogUmVtb3ZlLgotCSogY29uZmlnL2hwMzAwLm1oLCBjb25maWcvaHAzMDBic2QubWgsIGNvbmZpZy9ocHBhYnNkLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaHBwYWhwdXgubWgsIGNvbmZpZy9ocHBhb3NmLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NmFpeC5taCwgY29uZmlnL2kzODZic2QubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2bGludXgubWgsIGNvbmZpZy9pMzg2bWFjaDMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oLCBjb25maWcvaTM4NnYubWgsIGNvbmZpZy9pMzg2djQubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9pcml4NS5taCwgY29uZmlnL204OGttYWNoMy5taCwgY29uZmlnL21pcHNic2QubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9taXBzbWFjaDMubWgsIGNvbmZpZy9uZXdzLW1pcHMubWg6IFJlbW92ZS4KLQkqIGNvbmZpZy9uZXdzLm1oLCBjb25maWcvcGM1MzJtYWNoLm1oLCBjb25maWcvcmlzY2l4Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvcnM2MDAubWgsIGNvbmZpZy9yczYwMDBseW54Lm1oOiBSZW1vdmUuCi0JKiBjb25maWcvc29sYXJpczIubWgsIGNvbmZpZy9zdHJhdHVzLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvc3ltbWV0cnkubWgsIGNvbmZpZy9zeXN2NC5taCwgY29uZmlnL3RhaG9lLm1oOiBSZW1vdmUuCi0JKiBjb25maWcvdmF4YnNkLm1oLCBjb25maWcvdmF4dWx0Lm1oLCBjb25maWcvdmF4dWx0Mi5taDogUmVtb3ZlLgotCi1GcmkgU2VwICAxIDE1OjE4OjUwIDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBlbGZsaW5rLmggKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IGNoYW5nZSBhIERUX0lOSVQgb3IKLQlEVF9GSU5JIGVudHJ5IGlmIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2wgaXMgbm90IGluIHRoZSBoYXNoIHRhYmxlLgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgY3JlYXRlX3Byb2dyYW1faGVhZGVycwotCWFuZCB3YW50X2hkcl9pbl9zZWcgZmllbGRzLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3dhbnRfaGRyX2luX3NlZyk6IERlZmluZSBpZiBub3QKLQlkZWZpbmVkLgotCShlbGZfYmFja2VuZF9jcmVhdGVfcHJvZ3JhbV9oZWFkZXJzKTogTGlrZXdpc2UuCi0JKGVsZk5OX2JlZCk6IEluaXRpYWxpemUgY3JlYXRlX3Byb2dyYW1faGVhZGVycyBhbmQKLQl3YW50X2hkcl9pbl9zZWcuCi0JKiBlbGYuYyAoZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUpOiBDYWxsIGNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMKLQliYWNrZW5kIHJvdXRpbmUuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQ2hlY2sgd2FudF9oZHJfaW5fc2VnIGJhY2tlbmQgZmllbGQuICBDYWxsCi0JY3JlYXRlX3Byb2dyYW1faGVhZGVycyBiYWNrZW5kIHJvdXRpbmUuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEFsaWduIG5vbiBhbGxvY2F0ZWQKLQlzZWN0aW9ucyB3aGVuIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfcGhkcl9pbik6IE1ha2Ugbm9uIHN0YXRpYy4KLQkoZWxmX3N3YXBfcGhkcl9vdXQpOiBNYWtlIG5vbiBzdGF0aWMuCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX3N3YXBfcGhkcl9pbik6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9pbik6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3BoZHJfb3V0KTogRGVjbGFyZS4KLQotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX2NvbGxlY3Rfc2h1ZmZsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3Bkcik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIpOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0pOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotRnJpIFNlcCAgMSAxMzoyMDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBGaXggdHlwby4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBIYW5kbGUgaW5kaXJlY3QgYW5kCi0Jd2FybmluZyBzeW1ib2xzLiAgSWYgYW55IHNlY3Rpb24gaXMgbmFtZWQgLmdudS53YXJuaW5nLlhYWCwgdHJlYXQKLQl0aGUgY29udGVudHMgYXMgYSB3YXJuaW5nIHRvIGJlIGlzc3VlZCBpZiB0aGUgc3ltYm9sIFhYWCBpcwotCXJlZmVyZW5jZWQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBGb3IgYW4gaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wsIGp1c3QKLQlvdXRwdXQgdGhlIHN5bWJvbCBpdCBwb2ludHMgdG8uCi0KLQkqIGxpbmtlci5jIChfYmZkX2xpbmtfaGFzaF9uZXdmdW5jKTogRG9uJ3QgYm90aGVyIHRvIHNldCBiZmRfZXJyb3IKLQlpZiBiZmRfaGFzaF9hbGxvY2F0ZSBmYWlscywgc2luY2UgaXQgd2lsbCBhbHJlYWR5IGJlIHNldC4KLQkoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IExpa2V3aXNlLgotCShhcmNoaXZlX2hhc2hfbmV3ZnVuYyk6IExpa2V3aXNlLgotCShoYXNoX2VudHJ5X2JmZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUGFzcyBuZXcgYXJndW1lbnRzIHRvIHdhcm5pbmcKLQljYWxsYmFjay4gIEFsbG9jYXRlIGEgbmV3IHdhcm5pbmcgdXNpbmcgdGhlIGhhc2ggdGFibGUgbmV3ZnVuYy4KLQlVc2UgYmZkX2hhc2hfcmVwbGFjZSB0byB1cGRhdGUgdGhlIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLCByYXRoZXIKLQl0aGFuIGFzc3VtaW5nIHdlIGNhbiBjb3B5IHRoZSBmaWVsZHMgd2l0aCBzdHJ1Y3R1cmUgYXNzaWdubWVudC4KLQotCSogaGFzaC5jIChiZmRfaGFzaF9yZXBsYWNlKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9oYXNoX3JlcGxhY2UpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgU2VwICAxIDA4OjEyOjUwIDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgbWlwcyp2cjQzMDAtKi1lbGYqIHRhcmdldC4KLQkqIGNvbmZpZy9taXBzYnZyNDMwMC5tdDogQWRkZWQuCi0KLVRodSBBdWcgMzEgMTY6MDA6NTMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFVwZGF0ZSBkZXBlbmRlbmNpZXMuCi0JKiBhb3V0LXRhcmdldC5oIChNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGJmZC1pbi5oIChQRSBTVFVGRik6IERlbGV0ZWQuCi0JKiBiZmQuYyAodGRhdGEtPnBlX29ial9kYXRhKTogTmV3LgotCShiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGNvZmYtaTM4Ni5jLCBjb2ZmLWFybS5jIChjb2ZmXyotcnR5cGVfdG9faG93dG8pOiBHZXQgaW1hZ2UgYmFzZSBmcm9tCi0JbmV3IHBsYWNlLgotCSogbGliY29mZi5oLCBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAocGVfdmFsdWUpOiBEZWxldGUKLQkoY29mZl9ta29iamVjdCwgY29mZl9ta29iamVjdF9ob29rKTogQ29uZGl0aW9uYWxseSBidWlsZC4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMb29rIGluIG5ldyBwbGFjZS4KLQkoYWRkX2RhdGFfZW50cnksIGZpbGxfcGVfaGVhZGVyX2luZm8pOiBEZWxldGVkLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBQRSBzdHVmZi4KLQkoY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldy4KLQkqIGNvZmZzd2FwLmg6IFJlbW92ZSBQRSBzdHVmZi4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogbGliY29mZi1pbi5oIChwZV9kYXRhX3R5cGUpOiBOZXcuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3LgotCSogdGFyZ2V0cy5jIChfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBOZXcuCi0JKiBwZWljb2RlLmg6IE5ldyBmaWxlLgotCi1UaHUgQXVnIDMxIDExOjQ5OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6IEFkZCBleHRlcm4gIkMiIGlmIF9fY3BsdXNwbHVzLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgY29udmVydCBhIHJlbG9jCi0JYWdhaW5zdCBhbiBhYnNvbHV0ZSBzeW1ib2wgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLgotCi1UaHUgQXVnIDMxIDA4OjAwOjE0IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0JCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9yZWxvYyk6IEZpeCBjb21tb24gc2l6ZSBwcm9ibGVtLgotCShpM2NvZmZfb2JqZWN0X3ApOiBEZWxldGUuCi0KLVdlZCBBdWcgMzAgMjA6NDE6MjcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoZGVsZXRlbWVhY29mZl9hcm1fcmVsb2MpOiBEZWxldGVkLgotCShhcm0yNik6IE5vdCBwYXJ0aWFsIGlucGxhY2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IERvbid0Ci0JZG8gcGFnZSBhbGlnbmluZyBpZiBDT0ZGX1BBR0VfU0laRSBpc24ndCBkZWZpbmVkLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9pbik6IFVwZGF0ZSBpbWFnZSBiYXNlIGNvcnJlY3RseS4KLQotVHVlIEF1ZyAyOSAxMzo1MDoyMSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6Ci0JQ29tcGlsZSBldmVuIGlmIENPRkZfUEFHRV9TSVpFIGlzbid0IGRlZmluZWQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJhdGVfcmVsb2Nfc2VjdGlvbik6IFdyaXRlCi0JYmFzZSBmaWxlIGluZm8gYXMgcnZhcy4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfcnR5cGVfdG9faG93dG8pOiBEZWFsIHdpdGggcmVsb2MgMTEuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSAjaWYwZWQgY29kZQotCU9ubHkgcmVtb3ZlIGVtcHR5IHNlY3Rpb25zIGluIFBFIGlubWFnZSBmaWxlcy4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IHJlZ2VuZXJhdGVkLgotCSogY29mZi1hcm0uYyAoYW91dGFybV9zdGRfcmVsbyk6IE5ldyBlbnRyeSBhdCAxMS4KLQkoYXJtX3JlbG9jX3R5cGVfbG9va3VwKSA6IFVuZGVyc3RhbmQgdHlwZSAxMS4KLQkqIGNvZmYtaTM4Ni5jIChob3d0b190YWJsZSk6IGZpeCBuYW1lIG9mIHJ2YSB0eXBlLgotCShjb2ZmLWkzODZfcnR5cGVfdG9faG93dG8pOiBVbmRlcnN0YW5kIFJfSU1BR0VCQVNFIHR5cGUuCi0JKiBjb2ZmY29kZS5oIChzZWNfdG9fc3R5cF9mbGFncyk6IC5lZGF0YSBpcyBkYXRhLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEdldCBwYWdlIHNpemUgcmlnaHQgZm9yIFBFLgotCVBhZ2VzaXplIGluZm8gaXMgb25seSB2YWxpZCBpbiBQRSBpbWFnZSBmaWxlcy4KLQkoZmlsbF9wZV9oZWFkZXJfaW5mbyk6IEZpeCBmaWVsZHMuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUmVtb3ZlIGVuZF9vZl9pbWFnZSBjYWxjLgotCShfYmZkX2NvZmZfZ2VuZXJhdGVfcmVsb2Nfc2VjdGlvbik6IFJlbW92ZSBvcnBoYW5lZCBjb21tZW50LgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9pbik6IERvbid0IGFsd2F5cyBhZGQgSU1BR0VfQkFTRS4KLQlTd2FwIGluIFBFIGhlYWRlci4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXR1cCBQRSBmbGFncyBjb3JyZWN0bHkuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfUlZBKTogTmV3IGZpZWxkLgotCi1UaHUgQXVnIDI0IDE3OjQ5OjU5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGluY2x1ZGUgbGluZSBudW1iZXJzIGZvcgotCWEgc2VjdGlvbiBpZiBpdHMgb3V0cHV0IHNlY3Rpb24gaGFzIG5vIGNvbnRlbnRzLgotCi1XZWQgQXVnIDIzIDE2OjQ4OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQWRkIHBhcmVudGhlc2VzIHRvIEZJWAotCWV4cHJlc3Npb24gdG8gYXZvaWQgY29tcGlsZXIgYnVnIG9uIEhQLVVYIDkuMDEuCi0KLVdlZCBBdWcgMjMgMDk6NDk6MzkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKHBlX3ZhbHVlKTogVW5hbnNpZnkuCi0KLU1vbiBBdWcgMjEgMTc6NDk6MjggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKGJmZF9saW5rX3N1YnN5c3RlbSk6IFR1cm4gZW51bSBpbnRvICNkZWZpbmVzLgotCShiZmRfbGlua19wZV9pbmZvX2R2YWwpOiBOZXcKLQkoYmZkX2xpbmtfc3RhY2tfaGVhcCk6IFJlbmFtZWQgYW5kIG1hc3NhZ2VkIGludG8gYmZkX2xpbmtfcGVfaW5mby4KLQkqIGJmZC1pbjIuaDogcmVidWlsdC4KLQkqIGJmZC5jIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBEZWxldGVkLgotCSogY29mZmNvZGUuaCAocGVfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbGxfcGVfaGVhZGVyX2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIG5ldyBmdW5jdGlvbi4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsemUgbGlua19kYXRhIGlmIG5vdCBzZXQuCi0JKiBjb2ZmbGluay5jIChjb2ZmX2ZpbmFsX2xpbmtfaW5mbyk6IFJlbW92ZSBwZSByYW5kb21uZXNzLgotCShkb3Jlc19jb20pOiBVcGRhdGUgaW5mbyBpbiBiZmRfbGlua19wZV9pbmZvX2R2YWwuCi0JKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBVc2UgdGhlIGJmZF9saW5rX3BlX2luZm9fZHZhbC4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBSZW1vdmUgUEUgc3R1ZmYsIGluaXRpYWxpemUKLQljb2ZmX2RhdGEtPmxpbmtfaW5mby4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9bYW91dHxmaWxlaGRyXV9vdXQpOiBVc2UgaW5kaXJlY3QgUEUgcG9pbnRlci4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgcmVhbCBpbWFnZWJhc2UuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfZGF0YV90eXBlLmxpbmtfaW5mbyk6IE5ldyBmaWVsZC4KLQotTW9uIEF1ZyAyMSAxMToxMDozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IElmIGFuIHVuZGVmaW5lZCByZWZlcmVuY2UgZm9sbG93cyBhbgotCXVuZGVmaW5lZCB3ZWFrIHJlZmVyZW5jZSwgY2hhbmdlIHRoZSB0eXBlIHRvIHVuZGVmaW5lZC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IERvbid0IHJlY29yZCBhbgotCXVuZGVmaW5lZCB3ZWFrIHJlZmVyZW5jZSBhcyBkZWZpbmVkLCBpbiBjYXNlIGl0IHR1cm5zIGludG8gYSByZWFsCi0JdW5kZWZpbmVkIHJlZmVyZW5jZSBsYXRlciBpbiB0aGUgc2FtZSBhcmNoaXZlLgotCi1UaHUgQXVnIDE3IDE2OjI5OjA5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxheF9zZWN0aW9uKTogQ2FzdCB2YWx1ZSBmb3IgdXNlZF9ieV9iZmQgZmllbGQKLQl0byBQVFIsIG5vdCBjb2ZmX3NlY3Rpb25fdGRhdGEgcG9pbnRlciwgc2luY2UgUFRSIGlzIHRoZSByZWFsIHR5cGUKLQlvZiB0aGUgZmllbGQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MpOiBEaXR0by4KLQotVGh1IEF1ZyAxNyAxNDo0NDoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgbGlua2luZyBTUEFSQyBTdW5PUyBQSUMgY29tcGlsZWQgY29kZS4KLQkqIHN1bm9zLmMgKFNQQVJDX1BMVF9QSUNfV09SRDApOiBEZWZpbmUuCi0JKFNQQVJDX1BMVF9QSUNfV09SRDEsIFNQQVJDX1BMVF9QSUNfV09SRDIpOiBEZWZpbmUuCi0JKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkpOiBBZGQgZ290X29mZnNldCBhbmQgcGx0X29mZnNldAotCWZpZWxkcy4KLQkoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQgYW5kCi0JZHluYW1pY19zZWN0aW9uc19uZWVkZWQgZmllbGRzLgotCShzdW5vc19saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0Ci0Jb2Ygc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scy4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IENhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuCi0JKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogQ2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQkoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgc3Vub3Nfc2Nhbl9yZWxvY3MgYmVmb3JlCi0JY2hlY2tpbmcgd2hldGhlciB3ZSBuZWVkIHRvIHNldCB1cCB0aGUgZHluYW1pYyBsaW5rIGluZm9ybWF0aW9uLgotCURlZmluZSBfX0dMT0JBTF9PRkZTRVRfVEFCTEUgaWYgYW55dGhpbmcgcmVmZXJyZWQgdG8gaXQuCi0JKHN1bm9zX3NjYW5fc3RkX3JlbG9jcyk6IENhbGwgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICBVc2UKLQlwbHRfb2Zmc2V0IGZpZWxkOyBvbmx5IHB1dCBzeW1ib2wgaW4gLnBsdCBpZiBpdCBpcyBub3QgZGVmaW5lZCBieQotCWEgcmVndWxhciBvYmplY3QuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IExpa2V3aXNlLiAgSGFuZGxlIGJhc2UgcmVsYXRpdmUgcmVsb2NzLgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogU3RvcmUgZHlub2JqIGluIGxvY2FsIHZhcmlhYmxlLgotCShzdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCk6IENoZWNrIHBsdF9vZmZzZXQgcmF0aGVyIHRoYW4KLQljaGVja2luZyB3aGV0aGVyIHN5bWJvbCBpcyBpbiAucGx0IHNlY3Rpb24uICBJZiBzeW1ib2wgaXMgZGVmaW5lZAotCWluIGEgcmVndWxhciBvYmplY3QgZmlsZSwgdXNlIFNQQVJDX1BMVF9QSUNfV09SRFswMTJdLCBhbmQgZG9uJ3QKLQlhZGQgYSBKTVBfVEJMIHJlbG9jLgotCShzdW5vc19jaGVja19keW5hbWljX3JlbG9jKTogQWRkIGNvbnRlbnRzIGFuZCByZWxvY2F0aW9ucCBmaWVsZHMuCi0JSWYgcGx0X29mZnNldCBpcyBzZXQsIHJlZGlyZWN0IHJlbG9jYXRpb24gdG8gUExULiAgSWYgdGhpcyBpcyBhCi0JYmFzZSByZWxhdGl2ZSByZWxvYywgcmVkaXJlY3QgcmVsb2NhdGlvbiB0byBHT1QuICBDaGVjawotCWR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkIGZpZWxkIHJhdGhlciB0aGFuIHdoZXRoZXIgZHlub2JqIGlzIHNldC4KLQkoc3Vub3NfZmluaXNoX2R5bmFtaWNfbGluayk6IENoZWNrIGR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkIGZpZWxkCi0JcmF0aGVyIHRoYW4gd2hldGhlciBkeW5vYmogaXMgc2V0LiAgRG9uJ3QgZGllIGlmIC5uZWVkIGFuZCAucnVsZXMKLQlzZWN0aW9ucyB3ZXJlIG5vdCBjcmVhdGVkLgotCSogYW91dHguaCAoaG93dG9fdGFibGVfZXh0KTogTWFyayBQQzEwLCBQQzIyLCBhbmQgSk1QX1RCTCBlbnRyaWVzCi0JUEMgcmVsYXRpdmUuICBNYXJrIFBDMTAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udC4gIE1hcmsgUEMyMiBhbmQKLQlKTVBfVEJMIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogSWYgaW5mby0+c2hhcmVkIGlzIHNldCwgc2V0IERZTkFNSUMuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IENhbGwgY2hlY2tfZHluYW1pY19yZWxvYyBmb3IgYWxsCi0JcmVsb2NzLiAgUGFzcyBjb250ZW50cyBhbmQgJnJlbG9jYXRpb24uICBEb24ndCB3YXJuIGFib3V0IGFuCi0JdW5kZWZpbmVkIHN5bWJvbCB1bnRpbCBjaGVja19keW5hbWljX3JlbG9jIGhhcyBiZWVuIGNhbGxlZC4gIERvbid0Ci0Jd2FybiBhYm91dCBhbiB1bmRlZmluZWQgc3ltYm9sIGZvciBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLiAgRm9yIGEgYmFzZSByZWxhdGl2ZQotCXJlbG9jLCBhbHdheXMgdHJlYXQgcl9pbmRleCBhcyBhbiBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCBjb250ZW50cyBhbmQKLQlyZWxvY2F0aW9uIGFyZ3VtZW50IHRvIGNoZWNrX2R5bmFtaWNfcmVsb2MgZW50cnkgcG9pbnQuCi0JKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBsb2NhbF9nb3Rfb2Zmc2V0cyBmaWVsZC4KLQotV2VkIEF1ZyAxNiAwMTowMzowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRml4IGJ1ZyBpbiBsYXN0IGNoYW5nZS4KLQotTW9uIEF1ZyAxNCAxMTozOToyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogSGFuZGxlIGEgbWFjaGluZSBvZgotCWJmZF9tYWNoX3NwYXJjIG9yIGJmZF9tYWNoX3NwYXJjNjQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgYSBzeW1ib2wgaXMgYSB3ZWFrCi0JZGVmaW5pdGlvbiwgYWRkIGl0IHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpZiBhbnkgZHluYW1pYwotCW9iamVjdCBtZW50aW9ucyBpdC4gIElmIHdlIGRvIGFkZCBpdCwgbWFrZSBzdXJlIHdlIGFkZCB0aGUKLQljb3JyZXNwb25kaW5nIHJlYWwgc3ltYm9sLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQWRqdXN0IGEgd2VhayBkZWZpbmVkIHN5bWJvbCB3aGljaCB3ZQotCXB1dCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIGV2ZW4gaWYgbm8gcmVndWxhciBvYmplY3QgcmVmZXJzCi0JdG8gaXQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LCBkb24ndCBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEKLQlsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IENoYW5nZSBhc3NlcnRpb24KLQl0byBhY2NlcHQgc3ltYm9sIHdpdGggd2Vha2RlZiBzZXQuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGliYXJ5LCBkb24ndCBjb3B5IG92ZXIgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgbG9jYWwKLQlzeW1ib2wuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVN1biBBdWcgMTMgMDA6NDA6NTggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChSX0hQUEFfQkVHSU5fQlJUQUIpOiBEZWZpbmUuCi0JKFJfSFBQQV9FTkRfQlJUQUIpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfQkVHSU5fQlJUQUIgYW5kIFJfRU5EX0JSVEFCLgotCi1UaHUgQXVnIDEwIDE1OjUzOjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbik6IFN3YXAgdGhlIGFycmF5IGRpbWVuc2lvbnMKLQl3aGVuZXZlciB4X2ZjbmFyeSBpcyBub3QgYmVpbmcgdXNlZCBmb3Igc29tZXRoaW5nIGVsc2UsIHJhdGhlcgotCXRoYW4gb25seSBmb3IgYW4gYXJyYXkuCi0JKGNvZmZfc3dhcF9hdXhfb3V0KTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgIDggMTY6MzQ6NTcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBtb3N0Ci0Jb2Ygc3BlY2lhbCBjYXNlIHN0dWZmIGZvciBQRS4gIE5vdyBoYW5kbGVkIGJ5IHJlbG9jcy4KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBTcGVjaWFsIGNhc2Ugb2YgUEUgdHlwZSA3cy4KLQkoaG93dG9fdGFibGUpOiBUeXBlIDcgaXMgZGlyMzItcnZhLgotCi1UdWUgQXVnICA4IDEwOjE1OjQzIDE5OTUgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIGFpeDQgZXhwbGljaXRseS4KLQkqIHJzNjAwMC1jb3JlLmMgKENPUkVfREFUQV9TSVpFX0ZJRUxEKTogTmV3IG1hY3JvIHRvIGdldCBhIHRoZSBzaXplCi0Jb2YgYSBjb3JlIGR1bXAncyBkYXRhIHNlY3Rpb24uICBQcm92aWRlIGFsdGVybmF0ZSBkZWZpbml0aW9uIGZvciBhaXg0LgotCShTQVZFX0ZJRUxEKTogU2ltaWxhcmx5IGZvciBzYXZlIHN0YXRlIGZpZWxkIChyZWdpc3RlciBpbmZvKS4KLQkoU1RBQ0tfRU5EX0FERFIpOiBQcm92aWRlIGRlZmluaXRpb24gc3VpdGFibGUgZm9yIGFpeDQuCi0JKiBjb25maWcve2FpeDQubWgsYWl4NC5tdH06IE5ldyBjb25maWd1cmF0aW9uIGZpbGVzLgotCSogaG9zdHMvYWl4NC5oOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAgNyAyMzowMzoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IENhc3QgaW5pdGlhbGl6YXRpb25zCi0JdG8gYXZvaWQgd2FybmluZ3MuCi0KLU1vbiBBdWcgIDcgMTQ6NTE6MDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fZGVjb2RlX3N5bWNsYXNzKTogSGFuZGxlIGFic29sdXRlIHN5bWJvbHMgYnkgY2hlY2tpbmcKLQl0aGUgU09NIHR5cGUgKHNpbmNlIHRoZXkgd2lsbCByYXJlbHkgaWYgZXZlciBiZSBpbiB0aGUgYWJzb2x1dGUKLQlzZWN0aW9uKS4KLQotV2VkIEF1ZyAgNiAwOToxMjo1MCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9zcGFyYywgYmZkX21hY2hfc3BhcmM2NCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBjcHUtc3BhcmMuYyAoc3BhcmNfYXJjaF9pbmZvKTogUmVuYW1lZCBmcm9tIGFyY2hfaW5mb19zdHJ1Y3QuCi0JKHNwYXJjNjRfYXJjaF9pbmZvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYmZkX3NwYXJjX2FyY2gpOiBMaW5rIGluIHNwYXJjNjRfYXJjaF9pbmZvLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfeHh4KTogUmVuYW1lZCBmcm9tIGVsZjY0X3h4eC4KLQkoc3BhcmM2NF9lbGZfb2JqZWN0X3ApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYmFja2VuZF9vYmplY3RfcCk6IERlZmluZS4KLQkqIGNvbmZpZy9zcGFyYzY0LWVsZi5tdCAoU0VMRUNUX1ZFQ1MpOiBBZGQgYmZkX2VsZjMyX3NwYXJjX3ZlYy4KLQotU2F0IEF1ZyAgNSAwMDowNDowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tIChzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogUmV0dXJuIC0xIG9uIGVycm9yLiAgQ29tcHV0ZQotCXJldHVybiB2YWx1ZSB3aXRoIHNpemVvZiAoYXJlbGVudCAqKSwgbm90IHNpemVvZiAoYXJlbGVudCkuCi0KLVdlZCBBdWcgIDIgMTI6MzI6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSWYgdGhlIHNlY3Rpb24gcG9pbnRlZCB0byBieSB0aGUKLQlzaF9saW5rIGZpZWxkIG9mIGEgcmVsb2Mgc2VjdGlvbiBpcyBub3QgYSBzeW1ib2wgdGFibGUsIGFuZCB0aGUKLQlmaWxlIGNvbnRhaW5zIGEgc2luZ2xlIHN5bWJvbCB0YWJsZSwgY2xvYmJlciB0aGUgc2hfbGluayBmaWVsZCBvZgotCXRoZSByZWxvYyBzZWN0aW9uIHRvIHBvaW50IHRvIHRoZSBzeW1ib2wgdGFibGUuCi0KLVR1ZSBBdWcgIDEgMTA6MDk6MDEgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoaG93dG8gcmVsb2MgQVJNMjYpOiBDaGFuZ2Ugc2l6ZSBmcm9tIDMgdG8gMi4KLQkoaG93dG8gcmVsb2MgQVJNMjZEKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMjQgMTQ6MTc6NTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpKTogVXNlIHRoZSBsaW5lIGp1c3QgYmVmb3JlCi0JdGhlIG9mZnNldCwgbm90IHRoZSBvbmUganVzdCBhZnRlci4gIEJyZWFrIG91dCBvZiB0aGUgbG9vcCBhZnRlcgotCWZpbmRpbmcgYSBmdW5jdGlvbiBwYXN0IHRoZSBvZmZzZXQsIG5vdCBtZXJlbHkgd2hlbiBmaW5kaW5nIGEKLQlmdW5jdGlvbiB3aXRoIGEgbGluZSBkZWZpbmVkLgotCi0JKiBlY29mZmxpbmsuYyAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSk6IFdoZW4gaGFuZGxpbmcgc3RhYnM6Ci0JY29ycmVjdCBzZXR0aW5nIG9mIHN5bV9wdHJfZW5kIHRvIGNvbnNpZGVyIHN5bWJvbHMgc2tpcHBlZCB3aGVuCi0Jc2V0dGluZyBzeW1fcHRyOyBkb24ndCBsZWF2ZSBsb29wIGVhcmx5IHVubGVzcyBhbiBOX0ZVTiBpcyBmb3VuZAotCXdpdGggYSBsYXJnZXIgdmFsdWUuCi0KLQkqIGNvZmYtc2guYyAoc2hfY29mZl9ob3d0b3MpOiBNYXJrIFJfU0hfUENESVNQOEJZMiBhbmQgUl9TSF9QQ0RJU1AKLQlhcyBQQyByZWxhdGl2ZS4gIERlc2NyaWJlIFJfU0hfSU1NMTYuICBBZGQgZW50cmllcyBmb3IKLQlSX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDMyLCBSX1NIX1VTRVMsIFJfU0hfQ09VTlQsIGFuZAotCVJfU0hfQUxJR04uCi0JKFNXQVBfSU5fUkVMT0NfT0ZGU0VUKTogRGVmaW5lLgotCShTV0FQX09VVF9SRUxPQ19PRkZTRVQpOiBEZWZpbmUuCi0JKENBTENfQURERU5EKTogRGVmaW5lLgotCShzaF9yZWxvYyk6IENoYW5nZSBzeW1fdmFsdWUgYW5kIGFkZHIgdG8gdHlwZSBiZmRfdm1hLiAgU2tpcCByZWxvYwotCXR5cGVzIG90aGVyIHRoYW4gUl9TSF9JTU0zMiBhbmQgUl9TSF9QQ0RJU1Agb24gYW4gZXh0ZXJuYWwgc3ltYm9sLgotCShjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEZWZpbmUuCi0JKHNoX3JlbGF4X3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfU0hfUENESVNQIG9uIGFuIGV4dGVybmFsIHN5bWJvbC4KLQkoc2hfY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FsbAotCV9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scywgbm90IGNvZmZfbGlua19nZXRfc3ltYm9scy4gIENhbGwKLQlfYmZkX2NvZmZfZnJlZV9zeW1ib2xzLCBub3QgY29mZl9saW5rX2ZyZWVfc3ltYm9scy4gIENhbGwKLQlfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUsIG5vdCBjb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLgotCShjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogTGlrZXdpc2UuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2dldF9zeW1ib2xzKTogTW92ZSB0byBjb2ZmZ2VuLmMuCi0JKGNvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBMaWtld2lzZS4KLQkoY29mZl9saW5rX2ZyZWVfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IFVzZSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUuCi0JKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogVXNlIGNhY2hlZCBzZWN0aW9uIGNvbnRlbnRzIGlmIGF2YWlsYWJsZS4KLQlVc2UgX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEb24ndCBjYWxsIGJmZF9zZWVrLgotCShjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBPbmx5IGRlZmluZSBpZiBub3QKLQlhbHJlYWR5IGRlZmluZWQuCi0JKGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmZnZW4uYyAoYnVpbGRfc3RyaW5nX3RhYmxlKTogUmVtb3ZlLgotCShfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20gb2xkCi0JY29mZl9saW5rX2dldF9zeW1ib2xzIGluIGNvZmZsaW5rLmMuCi0JKF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvbGQKLQljb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIGluIGNvZmZsaW5rLmMuCi0JKF9iZmRfY29mZl9mcmVlX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZybW8gb2xkCi0JY29mZl9saW5rX2ZyZWVfc3ltYm9scyBpbiBjb2ZmbGluay5jLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IFVzZSBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMKLQlyYXRoZXIgdGhhbiByZWFkaW5nIHRoZSBzeW1ib2xzIGRpcmVjdGx5LiAgVG8gZnJlZSB0aGVtLCBjYWxsCi0JX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scy4gIFVzZSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgcmF0aGVyCi0JdGhhbiBidWlsZF9zdHJpbmdfdGFibGUuCi0JKiBsaWJjb2ZmLWluLmggKG9ial9jb2ZmX2tlZXBfc3ltcyk6IERlZmluZS4KLQkob2JqX2NvZmZfa2VlcF9zdHJpbmdzKTogRGVmaW5lLgotCShjb2ZmX2RhdGFfdHlwZSk6IEFkZCBmaWVsZHMga2VlcF9zeW1zIGFuZCBrZWVwX3N0cmluZ3MuCi0JKGNvZmZfc2VjdGlvbl90ZGF0YSk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShjb2ZmX3NlY3Rpb25fZGF0YSk6IERlZmluZS4KLQkoX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogRGVjbGFyZS4KLQkoX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyk6IERlY2xhcmUuCi0JKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLUZyaSBKdWwgMjEgMjI6MzI6NTQgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19TREFSRUwKLQlyZWxvY2F0aW9uLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKHBwY19lbGZfZ290MTZfaW5uZXIpOiBEaXR0by4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLVRodSBKdWwgMjAgMTk6MTk6MDYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBBZGQgbmV3IChpZ25vcmVkKQotCWFyZ3VtZW50LgotCSogZWxmMzItaHBwYS5oOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotVGh1IEp1bCAyMCAxOTowMTowNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbGliYW91dC5oIChzZXRfYW91dF9zZWN0aW9uX2RhdGEpOiBOZXcgbWFjcm8uCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX3JlbG9jcyk6IFVzZSBpdC4KLQotCSogYW91dC1uczMyay5jIChNWV9zd2FwX3N0ZF9yZWxvY19vdXQpOiBVbmRlZiBLRUVQSVQgYmVmb3JlCi0JZGVmaW5pbmcgaXQuCi0KLVRodSBKdWwgMjAgMTM6NDg6MDAgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL2kzODZ2NC5oIChnZXRnaWQsIGdldHVpZCk6ICBDaGFuZ2UgcHJvdG90eXBlcyB0byBiZQotCWNvbXBhdGlibGUgd2l0aCBVbml4d2FyZSAxLnggYW5kIFVuaXh3YXJlIDIueCwgYW5kIHByb2JhYmx5IG90aGVyCi0JaTM4NiBzdnI0IHZlcnNpb25zIGFzIHdlbGwuCi0KLVRodSBKdWwgMjAgMTM6NDE6MjEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBTaW5jZSBhcm1wZSBhbmQgYXJtcGVpIGhhdmUgYmVlbgotCXNwbGl0IGludG8gYmlnLSBhbmQgbGl0dGxlLWVuZGlhbiB2YXJpYW50cywgbGlzdCBhbGwgb2YgdGhlbSwKLQlpbnN0ZWFkIG9mIHRoZSBub3ctbm9uZXhpc3RhbnQgYXJtcGVbaV1fdmVjLgotCi1UaHUgSnVsIDIwIDAwOjA2OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IFNldCBsbWEgYmFzZWQgb24gcF9wYWRkci4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgc2hfYWRkciBiYXNlZCBvbiBsbWEsIG5vdCB2bWEuCi0KLVdlZCBKdWwgMTkgMTU6NTI6MDEgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9CSUdfU1lNKTogUmVwbGFjZXMgVEFSR0VUX1NZTS4KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtcGVfdmVjLCBhcm1wZWlfdmVjKTogQWRkIGJpLWVuZGlhbiBzdXBwb3J0LgotCSogY29uZmlndXJlOiAicmVnZW5lcmF0ZWQiLgotCSogcGUtYXJtLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IFJlcGxhY2VzIFRBUkdFVF9TWU0uCi0JKFRBUkdFVF9MSVRUTEVfTkFNRSwgVEFSR0VUX0JJR19OQU1FKTogUmVwbGFjZXMgVEFSR0VUX05BTUUuCi0JKiBwZWktYXJtLmMgKFRBUkdFVF9MSVRUTEVfU1lNLCBUQVJHRVRfQklHX1NZTSk6IFJlcGxhY2VzIFRBUkdFVF9TWU0uCi0JKFRBUkdFVF9MSVRUTEVfTkFNRSwgVEFSR0VUX0JJR19OQU1FKTogUmVwbGFjZXMgVEFSR0VUX05BTUUuCi0JKiB0YXJnZXRzLmMgKGFybXBlX3ZlYywgYXJtcGVpX3ZlYyk6IERlbGV0ZWQuCi0JKGFybXBlX2xpdHRsZV92ZWMsIGFybXBlX2JpZ192ZWMsIGFybXBlaV9saXR0bGVfdmVjLCBhcm1wZWlfYmlnX3ZlYyk6Ci0JQWRkZWQuCi0JKiBjb25maWcvYXJtLXBlLm10IChERUZBVUxUX1ZFQ1RPUik6IERlZmF1bHQgaXMgYXJtcGVfbGl0dGxlX3ZlYy4KLQkoU0VMRUNUX1ZFQ1MpOiBBZGQgYmktZW5kaWFuIHN1cHBvcnQuCi0KLVdlZCBKdWwgMTkgMTA6NDc6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmM6IENsZWFuIHVwIGFuZCBjb21tZW50LgotCShyX2ltbTMyKTogUmVtb3ZlLgotCShzaF9jb2ZmX2hvd3Rvcyk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKFNIX0NPRkZfSE9XVE9fQ09VTlQpOiBEZWZpbmUuCi0JKGdldF9zeW1ib2xfdmFsdWUpOiBNYWtlIHJlbG9jYXRpb24gYmZkX3ZtYSByYXRoZXIgdGhhbiBsb25nLgotCShSVFlQRTJIT1dUTyk6IFJld3JpdGUgdG8gdXNlIHNoX2NvZmZfaG93dG9zLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUgdG8gc2hfcmVsb2NhdGVfc2VjdGlvbi4KLQkoc2hfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVNhdCBKdWwgMTUgMDE6MDI6NTMgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaG9zdDogIEFkZCBzdXBwb3J0IGZvciBnZW5lcmljIG02OGsgU1ZSNCBob3N0LgotCi1GcmkgSnVsIDE0IDEzOjEzOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoS0VFUElUKTogQ2hhbmdlIGRlZmluaXRpb24gdG8gdWRhdGEuaS4KLQkoS0VFUElUVFlQRSk6IFJlbW92ZS4KLQkoTkFNRShhb3V0LHJlbG9jX3R5cGVfbG9va3VwKSk6IEFkZCBjYXNlcyB0byB0aGUKLQlleHRlbmRlZCByZWxvYyB0eXBlIHN3aXRjaDogU1BBUkNfR09UMTAsIFNQQVJDX0dPVDEzLCBTUEFSQ19HT1QyMiwKLQlTUEFSQ19QQzEwLCBTUEFSQ19QQzIyLCBTUEFSQ19XUExUMzAuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogRG9uJ3QgYm90aGVyIHRvIHVzZSBzdG9pIHdoZW4KLQlyZXRyaWV2aW5nIEtFRVBJVCB2YWx1ZS4KLQkoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkpOiBMaWtld2lzZS4gIEFsc28sIG9ubHkgYWRkIGluCi0Jb3V0cHV0IHNlY3Rpb24gVk1BIGZvciBzZWN0aW9uIHN5bWJvbHMsIGFuZCBjaGVjayBCU0ZfU0VDVElPTl9TWU0KLQl0byBjb250cm9sIHdoZXRoZXIgdG8gc2V0IHJfZXh0ZXJuIHRvIDEuCi0KLQkqIHN5bXMuYzogRml4IGNvbW1lbnRzIHNvIHRoYXQgYG1ha2UgaW5mbycgd29ya3MuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBTZXQgU0VDX0hBU19DT05URU5UUwotCWluIC5tZGVidWcgc2VjdGlvbiwgaW4gY2FzZSBiYWNrZW5kIGxpbmtlciBoYXMgY2xlYXJlZCBpdC4KLQotRnJpIEp1bCAxNCAxMTo1ODozNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZHIxNl9oYV9pbm5lcik6IFJld3JpdGUgdG8gdGFrZSBqdXN0IG9uZQotCWFyZ3VtZW50LCB0aGUgZmluYWwgcmVsb2NhdGVkIGFkZHJlc3MuCi0JKHBwY19lbGZfYWRkcjE2X2hhX2lubmVyKTogQWRqdXN0IHBwY19lbGZfYWRkcjE2X2hhX2lubmVyIGNhbGxlci4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLVRodSBKdWwgMTMgMTc6MjI6MDMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IENob29zZSBhIHJlYXNvbmFibGUgZmllbGQKLQlzZWxlY3RvciByZWxvY2F0aW9uIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4KLQotVGh1IEp1bCAxMyAxMDozMzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBDYXN0IGFyZ3VtZW50IHRvIHNpemVfdAotCWZvciBtYWxsb2MuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UsIGZvciBtZW1tb3ZlLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZSwgZm9yIG1hbGxvYy4KLQkqIGNvZmZsaW5rLmMgKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBMaWtld2lzZS4KLQkoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSk6IExpa2V3aXNlLgotCShlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UsIGZvciBtZW1jcHkgYW5kIG1hbGxvYy4KLQkoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX2FsaWduX2RlYnVnKTogTGlrZXdpc2UsIGZvciBtZW1zZXQuCi0JKGVjb2ZmX3dyaXRlX3N5bWhkcik6IExpa2V3aXNlLCBmb3IgbWFsbG9jLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBMaWtld2lzZS4KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IExpa2V3aXNlLCBmb3IKLQlxc29ydC4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IExpa2V3aXNlLgotCSogZWxmY29yZS5oIChlbGZfY29yZWZpbGVfbm90ZSk6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfcmVhZF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBMaWtld2lzZSwgZm9yIG1lbXNldC4KLQkqIGkzODZsaW51eC5jIChiZmRfbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBpZWVlLmMgKGRvX3dpdGhfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IExpa2V3aXNlLgotCShubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBvYXN5cy5jIChvYXN5c19zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLCBmb3IgbWVtY3B5LgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsCi0JZm9yIG1hbGxvYy4KLQkqIHNlY3Rpb24uYyAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UsIGZvciBtZW1jcHkuCi0JKiBzcmVjLmMgKHNyZWNfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLCBmb3IKLQlyZWFsbG9jIGFuZCBtZW1zZXQuCi0JKHN1bm9zX3NjYW5fcmVsb2NzKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZSwgZm9yIHJlYWxsb2MuCi0JKiBzeW1zLmMgKF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzKTogTGlrZXdpc2UsIGZvciBtYWxsb2MuCi0JKiB2ZXJzYWRvcy5jICh2ZXJzYWRvc19nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLCBmb3IKLQltZW1jcHkuCi0KLQkqIGxpYmJmZC5jIChyZWFsX3JlYWQpOiBBZGQgcHJvdG90eXBlLiAgQ2hhbmdlIGFyZ3VtZW50IHR5cGVzIGZyb20KLQlpbnQgdG8gc2l6ZV90LgotCShiZmRfcmVhZCk6IENhc3QgcmVhbF9yZWFkIGFyZ3VtZW50IHRvIHNpemVfdCwgbm90IGludC4KLQkoYmZkX3dyaXRlKTogQ2FzdCBmd3JpdGUgYXJndW1lbnQgdG8gc2l6ZV90LCBub3QgaW50LgotCi0JKiBlbGY2NC1nZW4uYyAoZWxmX2luZm9fdG9faG93dG8pOiBGaXggZGVmaW5pdGlvbiBmb3IgcmVjZW50IGVsZi5jCi0JY2hhbmdlcy4KLQotCSogY29uZmlndXJlLmluOiBGaXggdHlwbzogY2hhbmdlIHskZW5hYmxldmFsfSB0byAke2VuYWJsZXZhbH0uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGZsaW5rLm8uCi0KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldCk6IEFkZCBmaWVsZHMgX3JlYWRfbWluaXN5bWJvbHMgYW5kCi0JX21pbmlzeW1ib2xfdG9fc3ltYm9sLgotCShCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKTogQWRkIF9yZWFkX21pbmlzeW1ib2xzIGFuZAotCV9taW5pc3ltYm9sX3RvX3N5bWJvbC4KLQkoYmZkX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlZmluZS4KLQkqIHN5bXMuYyAoX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlZmluZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzKTogRGVmaW5lLgotCShfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbCk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMpOiBEZWNsYXJlLgotCShfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChNSU5JU1lNX1RIUkVTSE9MRCk6IERlZmluZS4KLQkoTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsbWluaXN5bWJvbF90b19zeW1ib2wpKTogRGVjbGFyZS4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX3JlYWRfbWluaXN5bWJvbHMpOiBEZWZpbmUuCi0JKE1ZX21pbmlzeW1ib2xfdG9fc3ltYm9sKTogRGVmaW5lLgotCSogQWxsIHRhcmdldHM6IERlZmluZSByZWFkX21pbmlzeW1ib2xzIGFuZCBtaW5pc3ltYm9sX3RvX3N5bWJvbC4KLQotV2VkIEp1bCAxMiAxNzo1NTo1NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tCi0JYmZkX2FsbG9jLgotCi0JKiBlbGZjb2RlLmggKHNpemVfaW5mbyk6IERvbid0IHVzZSAiJiIgYmVmb3JlIGZ1bmN0aW9uIG5hbWVzLgotCi1XZWQgSnVsIDEyIDAwOjE2OjQ4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IFVzZSB1bnNpZ25lZCwgbm90IHVuc2lnbmVkIGNoYXIsCi0JZm9yIGJpdGZpZWxkcy4KLQotVHVlIEp1bCAxMSAxNToxOTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJbiBjYXNlIFNIVF9SRUxbQV0sIG9ubHkgZ2V0IHRoZQotICAgICAgICBCRkQgc2VjdGlvbiBmb3IgdGhlIHNoX2xpbmsgc2VjdGlvbiBpZiBpdCBpcyBhIFNZTVRBQiBzZWN0aW9uLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykpOiBEb24ndCBib3RoZXIgdG8gY2hlY2sKLQl0aGF0IGFyY2hpdmVzIGhvbGQgYS5vdXQgb2JqZWN0cy4KLQkqIGNmLWkzODZseW54LmMgKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKGx5bnhfbGlua19hZGRfc3ltYm9scyk6IFJlbW92ZS4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKGx5bnhfbGlua19hZGRfc3ltYm9scyk6IFJlbW92ZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogRG9uJ3QgYm90aGVyIHRvIGNoZWNrIHRoYXQKLQlhcmNoaXZlcyBob2xkIEVMRiBvYmplY3RzLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IElmIHRoZSBhcmNoaXZlIGhhcyBhIG1hcCwgYW5kCi0JdGhlIHRhcmdldCB3YXMgZGVmYXVsdGVkLCBidXQgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgYXJjaGl2ZSBjYW4KLQlub3QgYmUgbWF0Y2hlZCB3aXRoIHRoYXQgdGFyZ2V0LCB0aGVuIHJldHVybiBhIGJhZCBmb3JtYXQgZXJyb3IuCi0KLQkqIGVsZjY0LXNwYXJjLmMgKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IFNldCBob3d0byBmb3IgV0RJU1AxNiB0bwotCWVsZjY0X3dkaXNwMTZfcmVsb2MuCi0JKGVsZjY0X3dkaXNwMTZfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGY2NF9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfc2l6ZV9pbmZvKTogQ2hhbmdlIHR5cGUgb2YgbGFzdCBhcmd1bWVudCB0bwotCXN3YXBfc3ltYm9sX291dCBmcm9tIGNoYXIgKiB0byBQVFIuCi0JKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfc3ltYm9sX291dCk6IENoYW5nZSB0eXBlIG9mIGNkc3QgZnJvbSBjaGFyICoKLQl0byBQVFIuCi0JKiBlbGYuYyAoc3dhcF9vdXRfc3ltcyk6IENhc3QgdG8gUFRSLCBub3QgY2hhciAqLCB3aGVuIGNhbGxpbmcKLQlzd2FwX3N5bWJvbF9vdXQgcm91dGluZS4KLQkqIGVsZmxpbmsuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBMaWtld2lzZS4KLQkoZWxmX2xpbmtfb3V0cHV0X3N5bSk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi1UdWUgSnVsIDExIDEyOjI5OjQ5IDE5OTUgIFJpY2sgU2xhZGtleSAgPGpyc0B3b3JsZC5zdGQuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBIYW5kbGUgdGhlIHNpbXBsZSBjYXNlIHdoZXJlCi0JdGhlcmUgaXMgbm8gZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi1Nb24gSnVsIDEwIDExOjQ1OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtYWtlZmlsZS5kb3MgKE9CSlMpOiBBZGQgYmluYXJ5Lm8gYW5kIHRla2hleC5vLiAgRnJvbSBESgotCURlbG9yaWUuCi0KLU1vbiBKdWwgMTAgMTE6MDk6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaW5rZXIuYyAoc2V0X3N5bWJvbF9mcm9tX2hhc2gpOiBiZmRfbGlua19oYXNoX25ldyBjYXNlOiBEb24ndAotCWFib3J0OyBpdCBjYW4gaGFwcGVuIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzIHdoZW4gbm90IGJ1aWxkaW5nCi0JY29uc3RydWN0b3JzLgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogQ29ycmVjdCB0eXBvOiB1c2UgISBvbiBzdHJjbXAsCi0Jbm90IG9uIHN0cmluZy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkCi0JbG9jYWwgaS4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvKTogRG9uJ3QgZGVjbGFyZS4KLQkoUENSRUxPRkZTRVQpOiBEZWZpbmUgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZi1hcm0ubwotCShDRklMRVMpOiBBZGQgY29mZi1hcm0uYywgcGUtYXJtLmMsIHBlaS1hcm0uYy4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpKTogQWxsb2NhdGUgaGFzaCB0YWJsZQotCXVzaW5nIGJmZF9hbGxvYywgbm90IG1hbGxvYy4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAobGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYWliLmNvbT46Ci0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogSWYgLUJzeW1ib2xpYywKLQlvdXRwdXQgYSBEVF9TWU1CT0xJQyBkeW5hbWljIGVudHJ5LgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgZG9uJ3QgcmVxdWlyZSBhIFBMVAotCWVudHJ5IGZvciBhIGxvY2FsbHkgZGVmaW5lZCBzeW1ib2wuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCBkbyB3YXJuCi0JYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHMsIGFuZCBmaWxsIGluIHRoZSBHT1QgZW50cnkgZm9yIGEgc3ltYm9sCi0JZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IElmIC1Cc3ltYm9saWMsIG91dHB1dCBhIFJFTEFUSVZFCi0JcmVsb2MgcmF0aGVyIHRoYW4gYSBHTE9CX0RBVCByZWxvYyBmb3IgYSBzeW1ib2wgZGVmaW5lZCBpbiBhCi0JcmVndWxhciBvYmplY3QgZmlsZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvIHdhcm4KLQlhYm91dCB1bmRlZmluZWQgc3ltYm9scywgYW5kIGZpbGwgaW4gdGhlIEdPVCBlbnRyeSBmb3IgYSBzeW1ib2wKLQlkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgb3V0cHV0IGEgUkVMQVRJVkUKLQlyZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUIHJlbG9jIGZvciBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQlyZWd1bGFyIG9iamVjdCBmaWxlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IElmIC1Cc3ltYm9saWMsIGRvCi0Jd2FybiBhYm91dCB1bmRlZmluZWQgc3ltYm9scywgYW5kIGZpbGwgaW4gdGhlIEdPVCBlbnRyeSBmb3IgYQotCXN5bWJvbCBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QgZmlsZS4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogSWYgLUJzeW1ib2xpYywgb3V0cHV0IGEKLQlSRUxBVElWRSByZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUIHJlbG9jIGZvciBhIHN5bWJvbCBkZWZpbmVkCi0JaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLgotCi0JKiBjb25maWcvbTY4ay1jb2ZmLm10IChTRUxFQ1RfVkVDUyk6IFJlbmFtZSBmcm9tIFNFTEVDVF9WRUNUT1JTLgotCUNvcnJlY3QgZWxlbWVudHMgdG8gYmUgYWN0dWFsIEJGRCB2ZWN0b3IgbmFtZXMuCi0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IERvbid0IGRlcGVuZCB1cG9uIEBmcmFnc0AuCi0JKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBAZnJhZ3NALgotCi1GcmkgSnVsICA3IDE3OjM2OjQ0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBTb3J0IGRlZmluZWQgc3ltYm9scyB0aGF0IGFyZQotCW5laXRoZXIgQlNGX0ZVTkNUSU9OIG5vdCBCU0ZfTk9UX0FUX0VORCBqdXN0IGJlZm9yZSB1bmRlZmluZWQKLQlzeW1ib2xzLgotCSogY29mZmNvZGUuaCAoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgQlNGX0ZVTkNUSU9OIGFzIHdlbGwKLQlhcyBCU0ZfTk9UX0FUX0VORC4KLQotRnJpIEp1bCAgNyAxNzoxNjoxNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21vc3RseWNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0JKGRvX2Rpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCi0KLVRodSBKdWwgIDYgMTQ6Mzc6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBSZXZlcnQgTWF5IDI0IHBhdGNoLgotICAgICAgICBEb24ndCBjb3B5IFBDMzIgcmVsb2MgYWdhaW5zdCBzZWN0aW9uIGludG8gc2hhcmVkIG9iamVjdC4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGRlZCBlbGZsaW5rLmMuCi0JKE1ha2VmaWxlKTogRGVwZW5kIHVwb24gY29uZmlnLnN0YXR1cywgbm90IGNvbmZpZ3VyZS5pbi4KLQkoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCB1cG9uIGNvbmZpZ3VyZSBjb25maWd1cmUuaG9zdAotCWFuZCBjb25maWcuYmZkLgotCi1XZWQgSnVsICA1IDIwOjE3OjE0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGZjb3JlLmgsIGVsZmxpbmsuaCwgZWxmY29kZS5oLCBlbGYuYywgZWxmbGluay5jOiBNb3ZlZCBzb21lCi0gCXByaW1hcmlseSBzaXplLWluZGVwZW5kZW50IGNvZGUgZnJvbSBlbGZjb2RlLmggdG8gZWxmLmMgYW5kIG5ldwotIAlmaWxlIGVsZmxpbmsuYzsgbW92ZWQgb3V0IG90aGVyIGNvcmUtIG9yIGxpbmtlci1yZWxhdGVkIHJvdXRpbmVzCi0gCWludG8gb3RoZXIgbmV3IC5oIGZpbGVzIGZvciBjbGFyaXR5LiAgUmVuYW1lZCBtYW55IHJvdXRpbmVzIHRvCi0gCXN0YXJ0IHdpdGggYmZkX2VsZiBvciBfYmZkX2VsZi4gIEFkZGVkIGEgc3RydWN0dXJlIG9mCi0gCXNpemUtZGVwZW5kZW50IGJ1dCB0YXJnZXQtaW5kZXBlbmRlbnQgaW5mbyB0byBlbGZjb2RlLmguCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgZWxmbGluay5vLiAgVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGxpYmVsZi5oOiBVcGRhdGVkIHNvbWUgZGVjbGFyYXRpb25zLiAgQWRkZWQgYSBkZWZpbml0aW9uIGZvciB0aGUKLQluZXcgc3RydWN0dXJlIGluIGVsZmNvZGUuaC4gIEFkZGVkIG1vcmUgZmllbGRzIHRvIGVsZiBiYWNrZW5kIGRhdGEKLQlzdHJ1Y3R1cmUuCi0JKiBlbGZ4eC10YXJnZXQuaDogUmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlIHNpemUtZGVwZW5kZW50IGluZm8uCi0JKiBlbGYzMi0qLmM6IENoYW5nZWQgc29tZSBmdW5jdGlvbiBuYW1lcy4gIE1vdmVkIGNvbW1vbgotCWNyZWF0ZV9keW5hbWljX3NlY3Rpb25zIGNvZGUgZnJvbSBtNjhrLCBzcGFyYywgYW5kIGkzODYgc3VwcG9ydAotCWludG8gZWxmbGluay5jLiAgRGVmaW5lIHNvbWUgbmV3IG1hY3JvcyB0byBmaWxsIGluIG5ldyBmaWVsZHMgb2YKLQliYWNrIGVuZCBkYXRhLiAgQWxzbyBjbGVhbiB1cCBzb21lICJnY2MgLVdhbGwiIHdhcm5pbmdzIHJlZ2FyZGluZwotCXVudXNlZCBvciB1bmluaXRpYWxpemVkIHZhcmlhYmxlcy4KLQotCSogTWFrZWZpbGUuaW4gKEJGRF9MSUJTKTogTm8sIGRvbid0IHB1dCBlbGZsaW5rLm8gaGVyZS4KLQkqIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBpdCBoZXJlIHdoZW5ldmVyIGVsZi5vIGlzIHNwZWNpZmllZC4KLQotV2VkIEp1bCAgNSAxMDozMTo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb2JqZWN0X3ApOiBVbmNvbmRpdGlvbmFsbHkgc2V0Ci0JZWxmX2JhZF9zeW10YWIsIHNpbmNlIHNvbWV0aW1lcyB0aGUgc3ltYm9sIHRhYmxlIGlzIG1lc3NlZCB1cCBhbmQKLQl0aGUgbGFzdCBzeW1ib2wgaXMgZ2xvYmFsLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVjbGFyZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaXNfbG9jYWxfbGFiZWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSAkYWNfY29uZmlnX3N1Yiwgbm90ICRjb25maWdzdWIuCi0JKiBjb25maWd1cmU6IExpa2V3aXNlLgotCi0JUGVybWl0IC0tZW5hYmxlLXRhcmdldHM9aWVlZToKLQkqIGNvbmZpZy5iZmQgKCotKi1pZWVlKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvaWVlZS5tdDogTmV3IGZpbGUuCi0KLVdlZCBKdWwgIDUgMDQ6MTY6MzUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9pMzg2YWl4Lm1oIChIREVGSU5FUyk6IFJlbW92ZSAtREZBU0NJU1RfRkRPUEVOLgotCi0JQXV0b2NvbmZpc2NhdGlvbjoKLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW4sIGRvYy9NYWtlZmlsZS5pbjogU3dpdGNoIGZyb20gQ3lnbnVzCi0JY29uZmlndXJlIHRvIGF1dG9jb25mIHdheXMgb2YgcHJvY2Vzc2luZyAtLWVuYWJsZSBhcmd1bWVudHMsCi0Jc2V0dGluZyB1cCBzeW1saW5rcywgaW5jb3Jwb3JhdGluZyBtYWtlZmlsZSBmcmFnbWVudHMsIHByaW50aW5nCi0JbWVzc2FnZXMgYXQgY29uZmlndXJhdGlvbiB0aW1lLCBzZXR0aW5nIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS4KLQlEZWxldGVkIHNvbWUgdW51c2VkIHZhcmlhYmxlcy4gIENoZWNrIGZvciByYW5saWIgdmlhIGF1dG9jb25mLgotCUZvciBub3csIGNvbmZpZ3VyZSBzY3JpcHQgcmVtb3ZlcyBkb2MvY29uZmlnLnN0YXR1cy4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUuCi0JKiBkZXAtaW4uc2VkOiBVc2UgQFNSQ0RJUkAgaW5zdGVhZCBvZiBAc3JjZGlyQCwgc28gTWFrZWZpbGUuaW4KLQlsaW5lIGRvZXNuJ3QgZ2V0IGJyb2tlbiBieSBjb25maWd1cmUuCi0JKiBkb2MvY29uZmlndXJlLmluOiBSZW1vdmVkLgotCi1UdWUgSnVsICA0IDEyOjIyOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogSWYKLQlCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgbGltaXQgdGhlIGxlbmd0aCBvZiBhbGwgZmlsZSBuYW1lcwotCXRvIGFyX21heF9uYW1lbGVuLgotCShiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUpOiBJZiBCRkRfVFJBRElUSU9OQUxfRk9STUFUIGlzIHNldCwgY2FsbAotCWJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBSZXZlcnQgSnVuZSAxIGNoYW5nZS4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBBZGQgcHJvdmlkZQotCWFyZ3VtZW50LgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9yZWNvcmRfbGlua19hc3NpZ25tZW50KTogVXBkYXRlIHByb3RvdHlwZS4KLQkoYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIG5lZWRlZCBmaWVsZC4gIFJlbW92ZQotCXNhd19uZWVkZWQgZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGVsZl9kdF9uZWVkZWRfbmFtZQotCWlzIGFuIGVtcHR5IHN0cmluZywgZG9uJ3QgbWFrZSBhIERUX05FRURFRCBlbnRyeSBpbiB0aGUgb3V0cHV0Ci0JZmlsZS4gIFJlY29yZCBhbGwgRFRfTkVFREVEIGVudHJpZXMgZm91bmQgaW4gaW5wdXQgZHluYW1pYwotCW9iamVjdHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBEb24ndCBjaGVjayBzYXdfbmVlZGVkIHdoZW4gaXNzdWluZwotCXdhcm5pbmdzLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBuZWVkZWQsIG5vdAotCXNhd19uZWVkZWQuCi0JKGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0KTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKHN0cnVjdCBiZmRfZWxmX2xpbmtfbmVlZGVkX2xpc3QpOiBEZWZpbmUuCi0JKGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0KTogRGVmaW5lLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogQWxzbyBpbml0aWFsaXplCi0JZmluZF9idWZmZXIgYW5kIGZkcnRhYl9sZW4gZmllbGRzIG9mIG5ld2x5IGFsbG9jYXRlZAotCWZpbmRfbGluZV9pbmZvIHN0cnVjdHVyZS4KLQotTW9uIEp1bCAgMyAxNzowMzo1MiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogTmV3IGFyZ3VtZW50ICJzeW1fZGlmZiIsCi0Jbm9uemVybyB3aGVuIHdlJ3JlIGdlbmVyYXRpbmcgcmVsb2NhdGlvbnMgZm9yIGFuIGV4cHJlc3Npb24KLQl1c2luZyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuCi0JSGFuZGxlIGRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBmb3IgYm90aCBSX0hQUEEgYW5kIFJfQ09NUExFWAotCWNhc2VzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfQ09NUDEsIFJfQ09NUDIgYW5kIFJfQ09ERV9FWFBSCi0JZml4dXBzLgotCi1Nb24gSnVsICAzIDEzOjU1OjE4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKHdpbjMyKTogTmV3IGNvbmZpZ3VyYXRpb24uCi0JKiBjb25maWd1cmUuaG9zdCAocGUpOiBDaGFuZ2VkIHRvIGkzODZ3aW4zMi4KLQkqIGNvbmZpZy9pMzg2cGUubWg6IERlbGV0ZWQuCi0JKiBjb25maWcvaTM4NndpbjMyLm1oOiBOZXcgZmlsZS4KLQotTW9uIEp1bCAgMyAxMTozMDo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfZmluZF9uZWFyZXN0X2xpbmUpOiBJZiB3ZSBhbGxvY2F0ZQotCWZpbmRfbGluZV9pbmZvLCBjbGVhciB0aGUgZmRydGFiIGZpZWxkLgotCi0JKiB0YXJnZXRzLmMgKGVudW0gYmZkX2ZsYXZvdXIpOiBBZGQgYmZkX3RhcmdldF9tc2Rvc19mbGF2b3VyIGhlcmUsCi0JcmF0aGVyIHRoYW4gaW4gYmZkLWluMi5oLgotCi0JKiBiZmQuYyAoZW51bSBiZmRfZXJyb3IpOiBEZWZpbmUgYmZkX2Vycm9yX25vX2FybWFwLgotCShiZmRfZXJybXNncyk6IEFkZCBzdHJpbmcgZm9yIGJmZF9lcnJvcl9ub19hcm1hcC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IElmIGFuIGFyY2hpdmUgaGFzIG5vCi0JYXJtYXAsIHNldCBiZmRfZXJyb3Jfbm9fYXJtYXAgcmF0aGVyIHRoYW4gYmZkX2Vycm9yX25vX3N5bWJvbHMuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogUGVybWl0IGNvbW1vbiBhbmQKLQlpbmRpcmVjdCBzeW1ib2xzIGluIHdlYWtkZWZzIEJGRF9BU1NFUlQuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFNpbXBsaWZ5Ci0JQkZEX0FTU0VSVCB0byBwZXJtaXQgc29tZSBsZWdhbCwgYnV0IG9kZCwgY2FzZXMuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgdmVyc2Fkb3Muby4KLQkoQ0ZJTEVTKTogQWRkIHBlLWkzODYuYywgcGVpLWkzODYuYywgYW5kIHZlcnNhZG9zLmMuCi0KLVN1biBKdWwgIDIgMTc6NDk6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ2FzdCBiYXNlX2ZpbGUKLQl0byBGSUxFICogYmVmb3JlIHVzaW5nIGl0LgotCSogc3RhYi1zeW1zLmM6IFJldmVydCB5ZXN0ZXJkYXkncyBwYXRjaC4KLQotU2F0IEp1bCAgMSAxMjoxMDo0MiAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogc3RhYi1zeW1zLmMgKHN0ZGlvLmgpOiAgSW5jbHVkZSBwcmlvciB0byBsaWJhb3V0LmgsIHdoaWNoCi0JaW5jbHVkZXMgYmZkbGluay5oLCB3aGljaCBub3cgdXNlcyBGSUxFLgotCi1TYXQgSnVsICAxIDAwOjExOjA4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBlbGZ4eC10YXJnZXQuaDogTmV3IGZpbGUuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IFJlbW92ZSBlbGZfNjRfcCBmaWVsZC4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZOTl9iZWQpOiBEb24ndCBzZXQgaXQuCi0KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluIChlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0LmgpOiBCdWlsZCB0aGVtIGZyb20KLQllbGZ4eC10YXJnZXQuaC4KLQotRnJpIEp1biAzMCAxNjowNzoxOCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ29tcGFyZQotCXRoZSBmdWxsIHRleHQgb2YgLnJlbG9jIG9yIC5lZGF0YSBzZWN0aW9uIG5hbWVzLgotCi1GcmkgSnVuIDMwIDE1OjQ3OjM3IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKToKLQlSZW1vdmUgZXh0cmEgJysnLgotCi1UaHUgSnVuIDI5IDE3OjI0OjUyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaDgzMDAuYyAoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQotV2VkIEp1biAyOCAxODowNDo0MiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogdmVyc2Fkb3MubyBpcyBub3cgY29uZGl0aW9uYWxseSBidWlsdC4KLQkqIGNvZmZjb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENsZWFuIHVwLiBDYWxjdWxhdGUKLQlkYXRhIGVudHJpZXMuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKToKLQkucmVsb2MgYW5kIC5lZGF0YSBzZWN0aW9ucyBhcmUgSU1BR0VfQkFTRUQgdG9vLgotCUlmIHRoZXJlJ3MgYSBiYXNlX2ZpbGUgdGhlbiB3cml0ZSBvdXQgYmFzZSBpbmZvcm1hdGlvbi4KLQkqIGNvbmZpZ3VyZS5ob3N0IChpMzg2LSotcGUpOiBOZXcuCi0JKiBzeW1zLmMgKGNvZmZfc2VjdGlvbl90eXBlKTogT25seSBzY2FuIHByZWZpeGVzLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IFZlcnNhZG9zIGlzIG5vdyBjb25kaXRpb25hbGx5Ci0JYnVpbHQuCi0JKiBjb25maWcvbTY4ay1jb2ZmLm10OiBCdWlsZCB2ZXJzYWRvcy5vCi0JKiBob3N0cy9pMzg2cGUuaDogTmV3IGZpbGUuCi0KLU1vbiBKdW4gMjYgMTM6NTM6NDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBDbG9zZSBjb21tZW50IGJlZm9yZQotCVJfUEFSSVNDX0RQUkVMMjFMIGhhbmRsaW5nLgotCi1UaHUgSnVuIDIyIDE5OjI4OjM2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdW4gTWF5ICA3IDExOjUzOjQxIE1EVCAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCi0JKiBjb25maWcvaTM4Ni1tb3NzLm10OiBjcmVhdGVkLgotCi1UaHUgSnVuIDIyIDA4OjU2OjEwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBBZGQgY2FzZSBmb3IgLXZlIHdvcmRzLgotCi1XZWQgSnVuIDIxIDEzOjEzOjQ5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHRyeSB0byBhcHBseSBhCi0JcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBzeW1ib2xzLgotCi1XZWQgSnVuIDIxIDEwOjE2OjEwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHZlcnNhZG9zLmM6IFNlY29uZCBwYXNzL3Jld3JpdGUuCi0KLU1vbiBKdW4gMTkgMDg6NDA6NDUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IENvbXBhcmUgb25seSB0aGUgZnJvbnQgcGFydAotCW9mIGEgc2VjdGlvbiBuYW1lLgotCi1TYXQgSnVuIDE3IDA5OjQwOjQ0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IFNldCB0aGUgc2l6ZSBvZiB0aGUgc3R1YgotCXNlY3Rpb24gaWYgd2UgZ2V0IGFuIGVycm9yLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBEb24ndCBtZXNzCi0Jd2l0aCB0aGUgb3BlcmFuZHMgb2YgYW4gUl9QQVJJU0NfRFBSRUwyMUwgcmVsb2NhdGlvbiBpZiB0aGUgaW5zbgotCWlzIG5vdCAiYWRkaWwgPHN5bWJvbD4sJXIyNyIuCi0KLUZyaSBKdW4gMTYgMTU6MDQ6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBiZmQtaW4uaCAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogRGVjbGFyZSBidXQgZG9uJ3QKLQlkZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBiZmQuYyAoTlRfc3Vic3lzdGVtLCBOVF9zdGFja19oZWFwKTogRGVmaW5lLgotCi1GcmkgSnVuIDE2IDAwOjA3OjI1IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYmZkX2xpbmtfbGlua19yZWxvY2F0ZSk6IFVzZSB0aGUgcmlnaHQKLQl0eXBlIGZpZWxkICh0aGVyZSBhcmUgdHdvISkgd2hlbiBjaGVja2luZyB0byBzZWUgaWYgJGdsb2JhbCQgaXMKLQlkZWZpbmVkLgotCi1UaHUgSnVuIDE1IDE0OjAzOjQ3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmgsIGJmZC1pbjIuaCAoYmZkX2Jvb2xlYW4pOiBSZW5hbWUgYmZkX3RydWUsIGJmZF9mYWxzZQotCXRvIGJmZF90dHRydWUsIGJmZF9mZmZhbHNlIHNvIGFzIG5vdCB0byBjb25mbGljdCB3aXRoIGZ1bmN0aW9ucy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogUmVtb3ZlIHZlcnNpb24gdGhhdCB3YXMKLQloYWNrZWQgZm9yIE1QVyBDLgotCSogbXB3LWNvbmZpZy5pbjogU2V0IHNoZWxsIHZhcnMgaW5zdGVhZCBvZiBwYXN0aW5nIHRvIG1ha2VmaWxlCi0JZm9yIGVhY2ggY29uZmlndXJhdGlvbiwgZWRpdCBjb2Zmc3dhcC5oIHRvIG1ha2UgTVBXIEMgbm90IGNob2tlLgotCShpMzg2LXVua25vd24tY29mZiwgc2gtaGl0YWNoaS1obXMpOiBSZWNvZ25pemUuCi0JKiBtcHctbWFrZS5pbiAoQkZEX0xJQlMpOiBBZGQgdmVyc2Fkb3MuYy5vLgotCi0JKiB2ZXJzYWRvcy5jICh2ZXJzYWRvc19zY2FuKTogUHJvcGVybHkgY2FzdCByZXN1bHRzIGZyb20gYmZkX2FsbG9jLgotCi1XZWQgSnVuIDE0IDE1OjI3OjMyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKHByb2Nlc3NfZW1iZWRkZWRfY29tbWFuZHMpOiBOZXcgZnVuY3Rpb24KLQlyZWFkcyBhbmQgaGFuZGxlcyAuZHJlY3R2ZSBzZWN0aW9ucyBmb3IgUEUuCi0JKGNvZmZfbGlua19pbnB1dF9iZmQpOiBDYWxsIG5ldyBmdW5jdGlvbiBpZiBQRS4KLQotTW9uIEp1biAxMiAxMjowOTozOSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLWluLmggKGJmZF9zZXRfc2VjdGlvbl92bWEpOiBDYXNlIHRydWUgdG8gYSBib29sZWFuLgotCShiZmRfc2V0X2NhY2hlYWJsZSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgSnVuICA5IDEyOjIwOjI4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBSZXdyaXRlIHRvIGJlIHN5bW1ldHJpY2FsLgotCi1GcmkgSnVuICA5IDEyOjQ5OjAwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB0YXJnZXRzLmM6IEFkZCBjb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgYW5kIGxpbmtfc3BsaXRfc2VjdGlvbgotCXRvIHRoZSB0YXJnZXQgdmVjdG9yLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKTogRGVmaW5lLgotCShfYmZkX25vbGlua19iZmRfbGlua19zcGxpdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbik6IERlY2xhcmUuCi0JKiBzeW1zLmMgKGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBEZWZpbmUuCi0JKiBsaW5rZXIuYyAoYmZfbGlua19zcGxpdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBzb20uYyAoc29tX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBOZXcgZnVuY3Rpb24KLQkoc29tX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIEFsbCBvdGhlciB0YXJnZXRzIHVwZGF0ZWQgd2l0aCBkZWZhdWx0IHZlcnNpb25zIG9mIG5ldyByb3V0aW5lcy4KLQotCSogVGFrZSBvdXQgbXkgYnJhaW5kYW1hZ2VkIGJmZF90cnVlL2JmZF9mYWxzZSBjaGFuZ2VzIGZyb20gZWFybGllcgotCXRvZGF5LiAgUmVwbGFjZSB3aXRoIGp1c3Q6Ci0JKiBiZmQtaW4uaDogKFRSVUVfRkFMU0VfQUxSRUFEWV9ERUZJTkVEKTogRGVmaW5lIHRoaXMgaWYKLQljb21waWxpbmcgd2l0aCBnKystMi42IG9yIGxhdGVyLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgSnVuICA5IDA3OjU0OjI5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHZlcnNhZG9zLmMgKHN0cnVjdCBlc2QsIGdldF80KTogTGludDsgdXNlIHVuc2lnbmVkIGNoYXJzLgotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogIENvbXBhcmUgb3V0cHV0IHNlY3Rpb24gbmFtZXMKLQl3aGVuIGNvbnZlcnRpbmcgZm9yIHZ4d29ya3MuCi0KLVdlZCBKdW4gIDcgMTk6MDE6MzAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IFBlcm1pdCAuc2NvbW1vbiBvciBDT01NT04KLQlzZWN0aW9ucyBhcyByYW5kb20gU0hUX05PQklUUyBzZWN0aW9ucywgaW4gY2FzZSBhIGxpbmtlciBzY3JpcHQgaXMKLQlzdHJhbmdlLgotCi1UdWUgSnVuICA2IDE3OjI5OjMyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZC1pbi5oIChOVF9zdWJzeXN0ZW0sIE5UX3N0YWNrX2hlYXApOiBNb3ZlZCBmcm9tIHBlLmgKLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBHZXQgUEUgcmVsb2NzIHJpZ2h0LgotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdCk6IFNldCBwZSB0ZGF0YSBiaXQgd2hlbiB1c2luZyBQRS4KLQkqIGNvZmZsaW5rLmMgKENPRkZfV0lUSF9QRSBjb2RlKTogVGVzdCBvbiBvYmpfcGUgYml0IHJhdGhlcgotCXRoYW4gY29uZGl0aW9uYWwgY29tcGlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogRml4IFBFIGRlcGVuZGVuY2llcy4KLQkqIGxpYmNvZmYtaW4uaCAob2JqX3BlKTogTmV3LgotCShjb2ZmX3RkYXRhKTogQWRkZWQgcGUgZW50cnkuCi0JKiBsaWJjb2ZmLmg6IFJlZ2VuZXJhdGVkLgotCi1Nb24gSnVuICA1IDA5OjA3OjEzIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfYWRqdXN0X3N5bW5keCk6IENvbXBsZXRlbHkgcGFyZW50aGVzaXplCi0JbWFjcm8uCi0KLU1vbiBKdW4gIDUgMDI6MTU6MjAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JTGlua2VyIHN1cHBvcnQgZm9yIG02OGstZWxmIGZyb20gQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjoKLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2hlY2sgZm9yIE5VTEwgd2hlbgotCWxvb3BpbmcgdGhyb3VnaCB0aGUgc3ltYm9sIGhhc2hlcy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogV2hlbiBsb29raW5nIGZvciBfaW5pdCBhbmQgX2ZpbmkgZG9uJ3QgdXNlCi0JdGhlIHN5bWJvbCBpZiBpdCBpcyBpbXBvcnRlZCBmcm9tIGFub3RoZXIgb2JqZWN0LgotCSogZWxmMzItbTY4ay5jOiBSZWxvY2F0aW9uIHR5cGUgY2hhbmdlZCBmcm9tIFJFTCB0byBSRUxBLiAgUmVndWxhcgotCWFuZCBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydCBmdW5jdGlvbnMgYWRkZWQsIHNpbWlsYXIgdG8gb3RoZXIgZWxmCi0JdGFyZ2V0cy4KLQotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1nbnUqKTogVXNlIEVMRiBjb25maWd1cmF0aW9uLgotCi1GcmkgSnVuICAyIDE4OjU0OjU5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHZlcnNhZG9zLmM6IE5ldyBmaWxlLgotCSogYmZkLWluMi5oIChzdHJ1Y3QgX2JmZCk6IE5ldyBmaWVsZC4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IE5ldyBmaWVsZC4KLQkqIGNvbmZpZ3VyZS5pbiAodmVyc2Fkb3NfdmVjKTogTmV3IGZpZWxkLgotCSogdGFyZ2V0cy5jIChiZmRfZmxhdm9yKTogQWRkZWQgdmVyc2Fkb3MuCi0KLVRodSBKdW4gIDEgMTM6NTE6NDkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MsIHN0eXBfdG9fc2VjX2ZsYWdzLCAKLQljb2ZmX25ld19zZWN0aW9uX2hvb2spOiAgQW55IHNlY3Rpb24gdGhhdCBzdGFydHMgIi5zdGFiIgotCWlzIG5vdyBtYXJrZWQgYXMgZGVidWdnaW5nLgotCi1UaHUgSnVuICAxIDE2OjE1OjE2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogRGlzYWJsZSBleHRlbmRlZCBuYW1lCi0JdGFibGUgdW50aWwgaXQgY2FuIGJlIG1hZGUgb3B0aW9uYWwsIHNvIHRoYXQgbmF0aXZlIEFSIGhhcyBoYWxmIGEKLQljaGFuY2Ugb24gU3VuT1MgYW5kIEhQL1VYLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMsIGNhc2UKLQliZmRfbGlua19oYXNoX2luZGlyZWN0KTogQWRkIGNhc3QgdG8gY29ycmVjdCBwb2ludGVyIHR5cGVzLgotCi1TYXQgTWF5IDI3IDIxOjM3OjMxIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAobTY4ay1idWxsLXN5c3YqKTogQWRkZWQgc3RyaXBfdW5kZXJzY29yZT15ZXMuCi0JICAobTY4ay1lc3QtY29mZik6IFJlbW92ZWQuICB0YXJnZXQgZG9lcyBub3QgZWZmZWN0IG9iamVjdCBmb3JtYXQuCi0KLVdlZCBNYXkgMjQgMTA6NTI6MDEgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogQ29wZSB3aXRoCi0JaW5kaXJlY3Qgc3ltYm9scy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogR2l2ZSBlcnJvcgotCW1lc3NhZ2Ugd2hlbiBsaW5raW5nIHRvIGEgc2hhcmVkIHJlbG9jIHdoaWNoIGlzbid0IHRoZXJlLgotCi1XZWQgTWF5IDI0IDEwOjQwOjAwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBBUk0tUEUuCi0KLQkqIE1ha2VmaWxlLmluLCBjb2ZmY29kZS5oLCBjb25maWcuYmZkLCBjb25maWd1cmUuaW4sIHBlLWFybS5jLAotCSBwZWktYXJtLmMsIGNvZmYtYXJtLmMsIHJlbG9jLmMsIHRhcmdldHMuYywgY29uZmlnL2FybS1wZS5tdDoKLQkgU3VwcG9ydCBmb3IgQVJNIENPRkYvUEUuCi0KLVR1ZSBNYXkgMjMgMTk6MjQ6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBOb3cgYSBmdW5jdGlvbiwKLQl0cmllcyBjYWxsaW5nIHJvdXRpbmUgZnJvbSBpbnB1dCBiZmQgdGFyZ2V0IHZlY3RvciBmb3IKLQliZmRfaW5kaXJlY3RfbGlua19vcmRlci4gIFB1dCBhIGRlY2xhcmF0aW9uIGludG8gdGhlIGhlYWRlciBmaWxlLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLW1pcHMuYyAoZ3ByZWwxNl93aXRoX2dwKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgZnJvbQotCW1pcHNfZWxmX2dwcmVsMTZfcmVsb2MuCi0JKG1pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBDYWxsIGl0LiAgSWYgb3V0cHV0IGJmZCB0YXJnZXQgdmVjdG9yCi0JaXNuJ3QgZWxmIGZsYXZvdXJlZCwgYWJvcnQsIHNpbmNlIGl0J3MgYXNzdW1lZCB0byBiZSBlbGYgaW4gc29tZQotCW9mIHRoaXMgY29kZSwgaW5jbHVkaW5nIHRoZSBjb2RlIHRoYXQgbG9va3MgdXAgdGhlIGdwIHZhbHVlLgotCShlbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbiwKLQltb2RpZmllZCBmcm9tIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyB0byBkZWFsCi0Jd2l0aCBwYXNzaW5nIGdwIHRvIGdwcmVsMTZfd2l0aF9ncC4KLQkoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBOZXcgbWFjcm8uCi0JKiBlbGYzMi10YXJnZXQuaCAoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCURvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBNYXkgMjMgMTU6NTg6MTUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiBJbnN0YWxsIGJmZGxpbmsuaCB0b28uCi0KLVN1biBNYXkgMjEgMjI6MjU6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIHVuZGVmaW5lZCBhbmQKLQlub3RzdXBwb3J0ZWQgcmV0dXJuIGNvZGVzIGZyb20gZmluYWxfbGlua19yZWxvY2F0ZSAodXNlZCB3aGVuCi0JJGdsb2JhbCQgaXMgdW5kZWZpbmVkIG9yIG5vbmV4aXN0YW50KS4KLQkoZWxmMzJfaHBwYV9iZmRfbGlua19saW5rX3JlbG9jYXRlKTogSWYgJGdsb2JhbCQgZXhpc3RzLCBidXQgaXMKLQlub3QgZGVmaW5lZCx0aGVuIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkLgotCi1GcmkgTWF5IDE5IDEwOjAwOjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb2Zmc3dhcC5oOiAoSU1BR0VfQkFTRSk6IERlZmluZSB0byAwIGlmIG5vdC4KLQotVGh1IE1heSAxOCAwNDoyNDowMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGFuZGFyZCk6IElmIGRlZmluZWQsIGNhbGwKLQlNWV9yZWxvY2F0YWJsZV9yZWxvYyBiZWZvcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uCi0KLQkqIGFvdXQtYXJtLmM6IChXUklURV9IRUFERVJTKTogRGVsZXRlLgotCShOQU1FKTogRGVmaW5lIHZlcnNpb24gdG8gb3ZlcnJpZGUgZGVmYXVsdCBpbiBhb3V0eC5oCi0JKE1ZKGhvd3RvX3RhYmxlKSk6IFJlZm9ybWF0LiAgQWx0ZXIgc29tZSBlbnRyaWVzIHNsaWdodGx5LgotCShSRUxPQ19BUk1fQklUU19ORUdfe0JJRyxMSVRUTEV9KTogRGVmaW5lLgotCShNWShyZWxvY19ob3d0byksIE1ZKHB1dF9yZWxvYyksIE1ZKHJlbG9jYXRhYmxlX3JlbG9jKSk6IE5ldyBmdW5jdGlvbnMuCi0JKE1ZX3JlbG9jX2hvd3RvLCBNWV9wdXRfcmVsb2MsIE1ZX3JlbG9jYXRhYmxlX3JlbG9jKTogRGVmaW5lLgotCShNWShmaXhfcGNyZWxfMjYpKTogUmVuYW1lZCBmcm9tIGFvdXRhcm1fZml4X3BjcmVsXzI2LCByZXR1cm4KLQliZmRfcmVsb2Nfb2sgbm90IGJmZF9yZWxvY19jb250aW51ZS4KLQkoTVkoZml4X3BjcmVsXzI2X2RvbmUpKTogTGlrZXdpc2UuCi0JKE1ZKGJmZF9yZWxvY190eXBlX2xvb2t1cCkpOiBSZW5hbWVkIGZyb20gYW91dGFybV9yZWxvY190eXBlX2xvb2t1cC4KLQkoTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzLAotCU1ZX2JmZF9maW5hbF9saW5rKTogRGVsZXRlLgotCShNWV9zd2FwX3N0ZF9yZWxvY19pbiwgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0LCBNWV9nZXRfc2VjdGlvbl9jb250ZW50cyk6Ci0JRGVmaW5lLgotCShhb3V0eC5oKTogSW5jbHVkZSBpdC4KLQkoTVkoc3dhcF9zdGRfcmVsb2Nfe2luLG91dH0pKTogTmV3IGZ1bmN0aW9ucy4KLQlVc2UgUkVMT0NfQVJNX0JJVFNfTkVHX3tCSUcsTElUVExFfSB0byBleHRyYWN0IG5lZ2F0aXZlIHJlbG9jIGJpdC4KLQkoYW91dGFybV9zcXVpcnRfb3V0X3JlbG9jcyk6IERlbGV0ZS4KLSAKLQlGcm9tOiBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCSogY29uZmlnL2FybVtsYl0tYW91dC5tdDogTmV3IGZpbGVzLgotCSogYW91dC1hcm0uYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkOiBIYW5kbGUgYXJteyxlW2xiXX0tKi1hb3V0Ci0JKiBjb25maWd1cmUuaW46IEFkZCB2ZXRvciBmb3IgYW91dF9hcm1fe2JpZyxsaXR0bGV9X3ZlYy4KLQkqIHJlbG9jLmM6IE5ldyByZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgQVJNLgotCSogdGFyZ2V0cy5jIChhb3V0X2FybV97YmlnLGxpdHRsZX1fdmVjKTogZGVjbGFyZS4KLQotVHVlIE1heSAxNiAxMDoyOTo1MSAxOTk1ICBKaW0gS2luZ2RvbiAgPGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmMgKGJmZF9zdGF0KTogSWYgYmZkX2NhY2hlX2xvb2t1cCByZXR1cm5zIGFuIGVycm9yLAotCXJldHVybiBhbiBlcnJvciB0byB0aGUgY2FsbGVyLiAgQ2FsbCBiZmRfc2V0X2Vycm9yIG9uIGVycm9ycy4KLQotVHVlIE1heSAxNiAxNDo0NDo0NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IE1vZGlmaWVkIHByb3RvdHlwZXMgaW4KLQlhY2NvcmRhbmNlIHdpdGggMTEgTWF5IGxpYmNvZmYuaCBjaGFuZ2UuCi0KLVRodSBNYXkgMTEgMTY6NDM6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCXRla2hleC5jIChmaXJzdF9waGFzZSk6IFVuZGVyc3RhbmQgdHlwZSAwIHN5bWJvbHMuCi0JKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBGaXggdHlwbyBpbiBmaW5hbCByZWNvcmQuCi0KLVRodSBNYXkgMTEgMTY6NDM6MTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKG9wdGNhbGxfY2FsbGJhY2spOiBkb24ndCB0cnkgYW5kIG9wdGltaXplCi0JdW5kZWZpbmVkIHJlZnMuIAotCShjb2ZmX3dyaXRlX3JlbG9jcyk6IFNlYXJjaCBmb3IgYnJva2VuIHJlbG9jcyBvbiB0aGUgd2F5Ci0Jb3V0IGFuZCBmaXggdGhlbSB1cC4KLQkoY29mZl9yZW51bWJlcl9zeW1ib2xzKTogQ2FsY3VsYXRlIGFuZCByZXR1cm4gaW5kZXggb2YKLQlmaXJzdCB1bmRlZmluZWQgc3ltYm9sLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENhbGwgY29mZl9yZW51bWJlcl9zeW1ib2xzIAotCWFuZCBjb2ZmX3dyaXRlX3JlbG9jcyB3aXRoIHRoZSBuZXcgYXJncy4KLQkqIGxpYmNvZmYuaDogKGNvZmZfcmVudW1iZXJfc3ltYm9scywgY29mZl9yZW51bWJlcl9zeW1ib2xzKToKLQlNb2RpZmllZCBwcm90b3R5cGVzLgotCi1UaHUgTWF5IDExIDE2OjQzOjE0IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0JCQkgIFRvbSBHcmllc3QgPGdyaWVzdEBjcy55YWxlLmVkdT4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUEUgZm9ybWF0LiAKLQkKLQkqIE1ha2VmaWxlLmluLCB0YXJnZXRzLmMsIGNvbmZpZ3VyZS5pbiwgY29uZmlnLmJmZDoKLQlBZGQgc3VwcG9ydCBmb3IgaTM4Ni0qLXdpbm50IGFuZCBpMzg2LSotcGUuCi0JKiBhcmNoaXZlLmMgKGRvX3NsdXJwX2NvZmZfYXJtYXApOiAgVW5kZXJzdGFuZCBOVFBFIGZvcm1hdAotCWFyY2hpdmVzLgotCShfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpOiBUdXJuIFwgaW4gYSBmaWxlbmFtZQotCWludG8gLy4KLQkqIGJmZC1pbi5oIChiZmRfbGlua19zdWJzeXN0ZW0sIF9iZmRfbGlua19zdGFja19oZWFwKTogTmV3LgotCSogY29mZi1pMzg2LmMgIChob3d0b190YWJsZSk6IENvbmRpdGlvbmFsaXplIFBDUkVMT0ZGU0VULgotCSogY29mZmNvZGUuaCAoSU1BR0VfQkFTRSk6IE5ldy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBUaHJvdyBhd2F5IC5qdW5rCi0Jc2VjdGlvbnMgZm9yIFBFLCBhbGlnbiBzeW1ib2xzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFRocm93IGF3YXkgLmp1bmsgc2VjdGlvbnMKLQlmb3IgUEUuIFJlbWVtYmVyIGluZm8gb24gLmlkYXRhIGFuZCAucnNyYyBzZWN0aW9ucy4KLQlGaWxsIGluIHRoZSBQRSBoZWFkZXIuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogUEUgdXNlcyBDX1NFQ1RJT04gY2xhc3MuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEtlZXAgUEUgaW5mbyB1cCB0byBkYXRlLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ29wZSB3aXRoIFBFIHJlbG9jcy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF97YW91dC9maWxlL3Njbi9zeW19aGRyX3tpbi9vdXR9KTogCi0JTmV3IGNvZGUgZm9yIFBFIGhlYWRlcnMuCi0KLVR1ZSBNYXkgIDkgMTc6MDE6MzggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgbGl0dGxlIGVuZGlhbiBQb3dlclBDIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IERpdHRvLgotCSogdGFyZ2V0cy5jOiBEaXR0by4KLQkqIGNvbmZpZy9wcGNsZS1lbGYubXQ6IE5ldyBmaWxlLCBmb3IgbGl0dGxlIGVuZGlhbiBQb3dlclBDCi0Jc3VwcG9ydC4KLQkqIGNvbmZpZy9wcGMtZWxmLm10OiBBZGQgbGl0dGxlIGVuZGlhbiBwb3dlcnBjIHRvIHRoZSBCRkQKLQlzZWxlY3Rpb24gdmVjdG9ycy4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBDb21wbGFpbiBpZgotCWxpbmtpbmcgYSBkaWZmZXJlbnQgZW5kaWFuIG9iamVjdCB0aGFuIHdlIGV4cGVjdC4KLQkoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSk6IERlZmluZSwgdG8gcHJvdmlkZSBsaXR0bGUKLQllbmRpYW4gc3VwcG9ydC4KLQotVHVlIE1heSAgMiAxNjozMjoyNCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmJmZCAoaHBwYSotKi1saXRlcyopOiBUcmVhdCBqdXN0IGxpa2UgaHBwYSotKi0qZWxmKi4KLQotVHVlIEFwciAyNSAxOTozODo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IEluaXRpYWxpemUgbG1hIHNhbWUgYXMKLQl2bWEuCi0KLVR1ZSBBcHIgMjUgMTE6MDM6MjEgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGhvc3RzL3N0ZC1ob3N0Lmg6ICNpbmNsdWRlIGFuc2lkZWNsLmggJ2NhdXNlIFBUUiBpcyB1c2VkIGluCi0Jc3RkLWhvc3QuaC4KLQotTW9uIEFwciAyNCAyMzo1Njo0NCAxOTk1ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvaTM4NmxpbnV4LmggKEhBVkVfUFJPQ0ZTKTogRG9uJ3QgZGVmaW5lIGl0LiAgQWRkZWQgbGVuZ3RoeQotCWNvbW1lbnQgZXhwbGFpbmluZyB3aHkuCi0KLU1vbiBBcHIgMjQgMTA6MzQ6MDIgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGhvc3RzL2kzODZsaW51eC5oIChIQVZFX1BST0NGUyk6IElmIE5PX1BST0NGUyBpcyBkZWZpbmVkLCBkb24ndAotCWRlZmluZSBIQVZFX1BST0NGUy4KLQotTW9uIEFwciAyNCAwODozMzoxMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IERvIG5vdCBjb250aW51ZQotCXByb2Nlc3NpbmcgdW5rbm93biBzeW1ib2xzIHRvIHByZXZlbnQgYSBjYXNjYWRlIG9mIGVycm9ycy4KLQotRnJpIEFwciAyMSAxMjo0ODo0OCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JUGF0Y2hlcyBmcm9tIEguSi4gTHUgZm9yIExpbnV4IEVMRiBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGVsZmNvZGUuaCAoZWxmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgW0hBVkVfUFJPQ0ZTXToKLQlVc2UgcHJwc2luZm9fdCBpbnN0ZWFkIG9mIHN0cnVjdCBwcnBzaW5mbywgZm9yIGNvbnNpc3RlbmN5LgotCSogaG9zdHMvaTM4NmxpbnV4LmggKEhBVkVfUFJPQ0ZTKTogRGVmaW5lLgotCi1UaHUgQXByIDIwIDA5OjA3OjM5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IERvIHRoZSByaWdodCB0aGluZyB3aGVuIGEgdW5kZWZpbmVkCi0Jc3Ryb25nIHN5bWJvbCBhcHBlYXJzIGFmdGVyIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQotRnJpIEFwciAxNCAxNjo1MToxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8gcmVsb2NhdGUKLQlhIHdob2xlIHNlY3Rpb24gZm9yIHRoZSBsaW5rZXIsIGJ5cGFzc2luZyBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLgotCShwcGNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogTmV3IGZ1bmN0aW9uIHRvIG1hcCB0aGUgQkZECi0JZW51bWVyYXRpb24gY29kZSBpbnRvIGEgaG93dG8gc3RydWN0dXJlLgotCShwcGNfZWxmX2hvd3RvX3Jhdyk6IFJlbmFtZSBmcm9tIHBwY19lbGZfaG93dG9fdGFibGUuCi0JKHBwY19lbGZfaG93dG9fdGFibGUpOiBOZXcgYXJyYXkgdGhhdCBtYXBzIFBvd2VyUEMgcmVsb2NhdGlvbgotCW51bWJlcnMgdG8gaG93dG8gc3RydWN0dXJlcyB3aXRob3V0IGEgbGluZWFyIHNlYXJjaC4gIENoYW5nZSBmcm9tCi0JdXNpbmcgYmZkX2VsZl9nZW5lcmljX3JlbG9jIHRvIHVzZSBwcGNfZWxmX3N0ZF9yZWxvYy4KLQkocHBjX2VsZl9ob3d0b19pbml0KTogSW5pdGlhbGl6ZSBwcGNfZWxmX2hvd3RvX3RhYmxlIGZyb20KLQlwcGNfZWxmX2hvd3RvX3Jhdy4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IFVzZSBhIGNhc2Ugc3RhdGVtZW50IGluc3RlYWQgb2YgYQotCWxvb3AuCi0JKHBwY19lbGZfc3RkX3JlbG9jKTogUmVwbGFjZW1lbnQgZm9yIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4KLQkocHBjX2VsZl91bnN1cHBvcnRlZF9yZWxvYyk6IFByaW50IGEgcmVhbCBlcnJvciBtZXNzYWdlLCBpbnN0ZWFkCi0Jb2YgY2FsbGluZyBhYm9ydC4KLQkocHBjX2VsZl9hZGRyMTZfaGFfaW5uZXIpOiBBYnN0cmFjdCBnZXR0aW5nIGFkanVzdG1lbnQgZnJvbQotCXBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCBzbyBwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gY2FuIHVzZSBpdAotCXRvby4KLQkocHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MpOiBDYWxsIGl0LgotCShwcGNfZWxmX2dvdDE2X2lubmVyKTogQWJzdHJhY3QgZ2V0dGluZyBhZGp1c3RtZW50IGZyb20KLQlwcGNfZWxmX2dvdDE2X3JlbG9jLCBzbyBwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gY2FuIHVzZSBpdCB0b28uCi0JKHBwY19lbGZfZ290MTZfcmVsb2MpOiBDYWxsIGl0LgotCShwcGNfZWxmX2luZm9fdG9faG93dG8pOiBSZW5hbWUgZnJvbSBwb3dlcnBjX2luZm9fdG9faG93dG8uCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBPbWl0IHNwYWNlIGluIGRlYnVnZ2luZwotCW91dHB1dC4KLQkoZWxmX3N5bWJvbF9mbGFncyk6IEFkZCBkZWJ1ZyBmdW5jdGlvbiB0byBkZWNvZGUgZmxhZ3Mgc28gdGhhdAotCWRlZmluaW5nIERFQlVHIHRvIGJlIDQgd2lsbCBjb21waWxlIGFnYWluLgotCShlbGZfZGVidWdfc2VjdGlvbik6IEZpeCB0eXBvIGluIGRlYnVnIG91dHB1dC4KLQotRnJpIEFwciAxNCAxNjowMzowNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkOiBBZGQgbTY4Ki0qLWVsZiouCi0JKiBlbGYzMi1tNjhrLmM6IEZpbGxlZCBvdXQgaW1wbGVtZW50YXRpb24sIGV4Y2VwdCBmb3IgZHluYW1pYwotCWxpbmtpbmcgc3VwcG9ydC4KLQkqIHJlbG9jLmMgKGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCk6IEFkZGVkICpfR09UX1BDUkVMLCAqX0dPVE9GRiwKLQkqX1BMVF9QQ1JFTCwgKl9QTFRPRkYsICpfNjhLXyogcmVsb2NhdGlvbnMgZm9yIEVMRi4KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgQXByIDEzIDE0OjI4OjA0IDE5OTUgIFRvcmJqb3JuIEdyYW5sdW5kICA8dGVnZUBhZGRlci5jeWdudXMuY29tPgotCi0JKiBjb2ZmLW02OGsuYyAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSKTogQ2hhbmdlIGZyb20KLQkxIHRvIDIuCi0JKGJmZF90YXJnZXQpOiBDaGFuZ2UgbWluaW11bSBzZWN0aW9uIGFsaWdubWVudCBmcm9tIDEgdG8gMi4KLQotV2VkIEFwciAxMiAxMjo0MDowNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChtYWNoaW5lX3R5cGUsIGNhc2UgYmZkX2FyY2hfbWlwcyk6IFRyZWF0IFI4MDAwIGxpa2UKLQlSNjAwMCBhbmQgUjQwMDAgZm9yIG5vdy4KLQotVHVlIEFwciAgNCAxMjoyODoyNSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBjb25maWd1cmUuaW4uCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIE1ha2VmaWxlLmluLgotCSogaG9zdHMvbXB3Lmg6IE5ldyBmaWxlLCBNUFcgaG9zdCBkZWZpbml0aW9ucy4KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl9pbiwgZWNvZmZfc3dhcF9wZHJfaW4pIFtNUFdfQ106Ci0JQWx0ZXJuYXRlIHZlcnNpb25zIHdpdGhvdXQgRUNPRkZfNjQgdGhhdCBjaG9rZXMgTVBXIEMuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IEFkZCBhbHRlcm5hdGl2ZSB2ZXJzaW9uIHdpdGgKLQlwYXJ0bHktZXhwYW5kZWQgbWFjcm9zLgotCi1UaHUgTWFyIDMwIDE0OjU2OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IERvbid0IGJvdGhlciB0byBjaGVjayBmb3IKLQlvdmVyZmxvdyBpZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotVGh1IE1hciAzMCAxNDozMjoyNiAxOTk1ICBILkouIEx1IChoamxAbnluZXhzdC5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IENoYW5nZSBsaW51eCB0byBkZWZhdWx0IHRvIGVsZi4gIFVzaW5nCi0JaVszNDVdODYtKi1saW51eGFvdXQgd2lsbCBidWlsZCBhIGxpYnJhcnkgd2hpY2ggZGVmYXVsdHMgdG8gYS5vdXQuCi0JKiBjb25maWcvaTM4Ni1sYW91dC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxpbnV4Lm10LgotCSogY29uZmlnL2kzODYtbGludXgubXQ6IFJlbmFtZSBmcm9tIG9sZCBjb25maWcvaTM4Ni1sZWxmLm10LgotCUNvbW1lbnQgb3V0IEVYVFJBTElCUy4KLQkqIGNvbmZpZy9pMzg2LWxlbGYubXQ6IFJlbW92ZS4KLQotV2VkIE1hciAyOSAxMjowMTozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTk2MC5jIChjb2ZmX2k5NjBfcmVsb2NhdGUpOiBDYWNoZSB0aGUgc2VjdGlvbiBzeW1ib2wgaW4KLQl0aGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgdGhlIHNlY3Rpb24sIHRvIGF2b2lkIGxvb3BpbmcgZm9yIGVhY2gKLQlyZWxvYy4KLQotCSogY3B1LWg4NTAwLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDaGFuZ2UgbmFtZSBmcm9tICJIOC8zMDAiIHRvCi0JImg4MzAwIiBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBjcHUtKiBmaWxlcy4KLQotVHVlIE1hciAyOCAxNToxNDoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJvdXQuYyAoYl9vdXRfY2Fub25pY2FsaXplX3JlbG9jKTogSGFuZGxlIFNFQ19DT05TVFJVQ1RPUgotCXNlY3Rpb25zLgotCShiX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBTa2lwIGNvbnN0cnVjdG9yCi0Jc3ltYm9scyB3aGljaCB0aGUgbWFpbiBsaW5rZXIgY29kZSBkaWQgbm90IGRvIGFueXRoaW5nIHdpdGguCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogVXNlIHVkYXRhLnAgaWYgaXQgaXMgc2V0LAotCXJhdGhlciB0aGFuIGxvb2tpbmcgdGhlIHN5bWJvbCB1cCBpbiB0aGUgaGFzaCB0YWJsZS4gIEp1c3QgcGFzcwotCXRocm91Z2ggY29uc3RydWN0b3Igc3ltYm9scyBmb3Igd2hpY2ggdWRhdGEucCBpcyBub3Qgc2V0LiAgSWYgdGhlCi0JbGlua2VyIGRlZmluZWQgdGhlIHN5bWJvbCwgY2xlYXIgdGhlIGNvbnN0cnVjdG9yIGZsYWcuCi0KLVR1ZSBNYXIgMjEgMTA6NTA6MzIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2V0X3JlbG9jX2luZm8pOiBTaWduIGV4dGVuZCBjb25zdGFudHMgZnJvbQotCVJfREFUQV9PVkVSUklERSBmaXh1cHMuCi0JKiBsaWJocHBhLmggKHNpZ25fZXh0ZW5kKTogUmVuYW1lZCBmcm9tIHNpZ25fZXh0LiAgRml4LgotCShsb3dfc2lnbl9leHRlbmQpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyMCAyMjozOToxMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUpOiBUaWdodGVuIHRlc3QgdG8gZGV0ZXJtaW5lCi0Jd2hhdCBzeW1ib2xzIGFyZSBzZWN0aW9uIHN5bWJvbHMuCi0KLVNhdCBNYXIgMTggMDE6NTQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IEFuIGVtcHR5IGFyY2hpdmUgaXMgT0suCi0KLUZyaSBNYXIgMTcgMTY6Mjk6MDIgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBKdXN0IHJldHVybiB0cnVlIHdoZW4KLQllaXRoZXIgdGhlIGlucHV0IG9yIG91dHB1dCBzZWN0aW9uIGlzbid0IGF0dGFjaGVkIHRvIGEgU09NIEJGRC4KLQkoc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBTaW1pbGFybHkgZm9yIEJGRCBwcml2YXRlIGRhdGEuCi0KLUZyaSBNYXIgMTcgMTE6NTA6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENoZWNrIHdoZXRoZXIgYSBkeW5hbWljCi0Jb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gaW5jbHVkZWQsIGFuZCBpZ25vcmUgaXQgdGhlIHNlY29uZCB0aW1lLgotCi1XZWQgTWFyIDE1IDExOjU2OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfU1BBUkNfR09UMTMgZnJvbQotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkIHRvIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZC4KLQotCSogbGliZWxmLmggKGJmZF9lbGYzMl9fd3JpdGVfcmVsb2NzKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2VsZjY0X193cml0ZV9yZWxvY3MpOiBEb24ndCBkZWNsYXJlLgotCi1UdWUgTWFyIDE0IDA1OjU0OjMzIDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBzdGFiLXN5bXMuYyAoYW91dF9zdGFiX25hbWUpOiBNb3ZlZCBhb3V0X3N0YWJfbmFtZXMgdG8gYmUgbG9jYWwKLQl0byB0aGlzIGZ1bmN0aW9uLiAgUmVjb2RlZCBmdW5jdGlvbiB0byBzdG9wIHVzaW5nIHRhYmxlLCB0bwotCWltcHJvdmUgcGVyZm9ybWFuY2UgKG9uIGk0ODYtbmV0YnNkIGhvc3QpLiAgTGVmdCBvbGQgdmVyc2lvbgotCWludGFjdCB1bmRlciAiI2lmIDAiIGZvciBmdXJ0aGVyIHBlcmZvcm1hbmNlIHRlc3RpbmcuCi0KLU1vbiBNYXIgMTMgMTM6NDg6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IE1ha2Ugc3RhdGljLiAgVXNlIFBUUiBhcmd1bWVudCBhcyBhCi0JcG9pbnRlciB0byBhIGJvb2xlYW4gdmFyaWFibGUgc2V0IHRvIHRydWUgaWYgc29tZXRoaW5nIGZhaWxzLgotCUNhc3QgdG8gUFRSIHJhdGhlciB0aGFuIHZvaWQgKi4KLQkoc3ltX2lzX2dsb2JhbCk6IFJld3JpdGUgZm9yIGNsYXJpdHkuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogSWYgdGhlIHByb2dyYW0gaGVhZGVyIHNpemUgaXMgdG9vIHNtYWxsLAotCWNhbGwgX2JmZF9lcnJvcl9oYW5kbGVyIGFuZCByZXR1cm4gZmFpbHVyZSByYXRoZXIgdGhhbiBhYm9ydGluZy4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBQYXNzIGJvb2xlYW4gdmFyaWFibGUgd2hlbgotCWNhbGxpbmcgd3JpdGVfcmVsb2NzLgotCShlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IFVzZSBCRkRfQVNTRVJUIHJhdGhlciB0aGFuIGFib3J0LgotCShzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkKTogRGVmaW5lLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IERlY2xhcmUgdmFyaWFibGVzIGluIGlubmVyCi0JYmxvY2tzLiAgUGFzcyBlbGZfaW5mb19mYWlsZWQgc3RydWN0dXJlIHdoZW4gY2FsbGluZwotCWVsZl9leHBvcnRfc3ltYm9sIGFuZCBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sLgotCShlbGZfZXhwb3J0X3N5bWJvbCk6IFRyZWF0IGRhdGEgYXJndW1lbnQgYXMgZWxmX2luZm9fZmFpbGVkIHJhdGhlcgotCXRoYW4gYmZkX2xpbmtfaW5mby4gIFNldCBmYWlsZWQgZmllbGQgb24gZXJyb3IuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoc3RydWN0IGVsZl9maW5mb19mYWlsZWQpOiBEZWZpbmUuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFBhc3MgZWxmX2ZpbmZvX2ZhaWxlZCBzdHJ1Y3R1cmUgd2hlbiBjYWxsaW5nCi0JZWxmX2xpbmtfb3V0cHV0X2V4dHN5bS4gIFVzZSBCRkRfQVNTRVJUIHJhdGhlciB0aGFuIGFib3J0LgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogVHJlYXQgZGF0YSBhcmd1bWVudCBhcyBlbGZfZmluZm9fZmFpbGVkCi0JcmF0aGVyIHRoYW4gZWxmX2ZpbmFsX2xpbmtfaW5mby4gIFNldCBmYWlsZWQgZmllbGQgb24gZXJyb3IuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IFVzZSBCRkRfQVNTRVJUIHJhdGhlciB0aGFuIGFib3J0LgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHdyaXRlCi0Jb3V0IFBMVFJFTFNaLCBQTFRSRUwgYW5kIEpNUFJFTCByZWxvY3MgaWYgdGhlcmUgaXMgYSAucmVsYS5wbHQKLQlzZWN0aW9uLiAgU29sYXJpcyAyLjQgYXBwYXJlbnRseSBkb2VzIG5vdCBoYW5kbGUgZW1wdHkgcmVsb2MKLQlpbmZvcm1hdGlvbiBjb3JyZWN0bHkuCi0KLQkqIGFyY2hpdmUuYyAoYnNkX3dyaXRlX2FybWFwKTogQ2FzdCBnZXR1aWQgYW5kIGdldGdpZCByZXN1bHRzIHRvCi0JbG9uZywgYW5kIHByaW50IHdpdGggJWxkLgotCi1GcmkgTWFyIDEwIDE2OjQxOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBBbHdheXMgdXNlIHRoZSBvdXRwdXQKLQlzZWN0aW9uIGlmIGl0IGlzIG5vdCBOVUxMLgotCi1UaHUgTWFyICA5IDE1OjA2OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBJZiB0aGUgbGluZSBudW1iZXIgY291bnQgb3IKLQl0aGUgcmVsb2MgY291bnQgZG9lcyBub3QgZml0LCBwcmludCBhbiBlcnJvciBhbmQgcmV0dXJuIDAuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWNvZmZfc3dhcF9zY25oZHJfb3V0LgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWUKLQlvZiBiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQuCi0KLQkqIGJmZC5jOiBJbmNsdWRlIDxzdGRhcmcuaD4gb3IgPHZhcmFyZ3MuaD4sIGRlcGVuZGluZyB1cG9uCi0JQU5TSV9QUk9UT1RZUEVTLgotCShiZmRfZXJyb3JfaGFuZGxlcl90eXBlKTogTmV3IGdsb2JhbCB0eXBlLgotCShfYmZkX2Vycm9yX3Byb2dyYW1fbmFtZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF9lcnJvcl9oYW5kbGVyKTogTmV3IEJGRCBwcml2YXRlIGdsb2JhbCB2YXJpYWJsZS4KLQkoYmZkX3NldF9lcnJvcl9oYW5kbGVyKTogTmV3IGdsb2JhbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lKTogTmV3IGdsb2JhbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9lcnJvcl9oYW5kbGVyKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikpOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyLAotCWFuZCB1c2UgaXQgaW5zdGVhZCBvZiBiZmRfZ2V0X3N5bWNvdW50LiAgQ2hlY2sgcl9pbmRleCBhZnRlcgotCXNldHRpbmcgcl9leHRlcm4gYmFzZWQgb24gd2hldGhlciB0aGlzIGlzIGEgYmFzZSByZWxhdGl2ZSByZWxvYy4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX0lOKSk6IEFkZCBzeW1jb3VudCBwYXJhbWV0ZXIsIGFuZCB1c2UgaXQKLQlpbnN0ZWFkIG9mIGJmZF9nZXRfc3ltY291bnQuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBQYXNzIGJmZF9nZXRfc3ltY291bnQgdG8gcmVsb2MKLQlzd2FwIHJvdXRpbmVzLgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogQWRkIHN5bWNvdW50IHBhcmFtZXRlcgotCXRvIGRlY2xhcmF0aW9uLgotCShOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IFBhc3MKLQlpbmZvLT5keW5zeW1fY291bnQgdG8gcmVsb2Mgc3dhcCByb3V0aW5lcy4KLQkqIGFvdXQtbnMzMmsuYyAoTVlfc3dhcF9zdGRfcmVsb2NfaW4pOiBBZGQgc3ltY291bnQgcGFyYW1ldGVyLgotCSogaHAzMDBocHV4LmMgKE1ZKHN3YXBfc3RkX3JlbG9jX2luKSk6IExpa2V3aXNlLgotCShNWShzbHVycF9yZWxvY190YWJsZSkpOiBQYXNzIGJmZF9nZXRfc3ltY291bnQgdG8gcmVsb2Mgc3dhcAotCXJvdXRpbmUuCi0JKiBpMzg2bHlueC5jIChOQU1FKGx5bngsc3dhcF9leHRfcmVsb2NfaW4pKTogQWRkIHN5bWNvdW50Ci0JcGFyYW1ldGVyLgotCShOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pKTogTGlrZXdpc2UuCi0JKE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkpOiBQYXNzIGJmZF9nZXRfc3ltY291bnQgdG8gcmVsb2MKLQlzd2FwIHJvdXRpbmVzLgotCi1UaHUgTWFyICA5IDEyOjA0OjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uIHZlY3RvciB0byBiZQotCWNhbGxlZCBieSB0aGUgbGlua2VyIHRvIG1lcmdlIGFueSBwcml2YXRlIGJmZCBkYXRhIG9mIHRoZSBpbnB1dAotCWZpbGVzIGFuZCB0aGUgb3V0cHV0IGZpbGUuICBVc2VkIGJ5IHRoZSBQb3dlclBDIEVMRiBzdXBwb3J0IHRvCi0JY2hlY2sgd2hldGhlciAtbXJlbG9jYXRhYmxlIGlzIHVzZWQgZm9yIGFsbCBtb2R1bGVzLgotCShiZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBOZXcgZnVuY3Rpb24gdmVjdG9yIHRvIGJlIGNhbGxlZCBieSB0aGUKLQlhc3NlbWJsZXIgdG8gc2V0IHByaXZhdGUgZmxhZ3MuICBVc2VkIGJ5IHRoZSBQb3dlclBDIEVMRiBzdXBwb3J0Ci0JdG8gc2V0IHRoYXQgYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIHdhcyBhc3NlbWJsZWQgd2l0aCB0aGUKLQktbXJlbG9jYXRhYmxlIG9wdGlvbi4KLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9DT1BZKTogQWRkIGludGlpYWxpemF0aW9uIG9mIHRoZQotCWJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIGFuZCBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgZnVuY3Rpb24KLQl2ZWN0b3JzLgotCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC1pbi5oOiBSZWJ1aWxkIHdpdGggYmZkLmMgYW5kIHRhcmdldHMuYwotCWNoYW5nZXMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NldF9wcml2YXRlX2ZsYWdzKTogTmV3IGZ1bmN0aW9uIHRvIHNldCB0aGUKLQlFTEYgZV9mbGFncyBmaWVsZC4KLQkocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IHRoZSBlX2ZsYWdzIGZpZWxkIGZyb20gdGhlCi0JaW5wdXQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IENoZWNrIGZvciBhIG1pc21hdGNoIGJldHdlZW4gdGhlCi0JZV9mbGFncyBmaWVsZCBvZiBhbGwgb2YgdGhlIGxpbmtlciBpbnB1dCBmaWxlcy4KLQotCSogbGliZWxmLmggKGVsZl9vYmpfdGRhdGEpOiBBZGQgcHBjX2ZsYWdzX2luaXQgZmllbGQgc28gdGhhdCB0aGUKLQlQb3dlclBDIHN1cHBvcnQgY2FuIGNoZWNrIGlmIGNvbXBhdGFpYmxlIGVfZmxhZ3MgYXJlIHByZXNlbnQuCi0KLQkqIGFvdXQtdGFyZ2V0Lmg6IEFkZCBOT1AgZm9yIHRoZSBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCWFuZCBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgZnVuY3Rpb24gdmVjdG9ycy4KLQkqIGNvZmZjb2RlLmg6IERpdHRvLgotCSogZWxmMzItdGFyZ2V0Lmg6IERpdHRvLgotCSogZWxmNjQtdGFyZ2V0Lmg6IERpdHRvLgotCSogbGliYmZkLmg6IERpdHRvLgotCSogbGliZWNvZmYuaDogRGl0dG8uCi0JKiBzb20uYzogRGl0dG8uCi0KLVdlZCBNYXIgIDggMDA6NTM6NTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtbWlwcy5jIChhcmNoX2luZm9fc3RydWN0KTogQWRkIG1pcHM6ODAwMCBlbnRyeS4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogTWFyayBhbiB1bmRlZmluZWQgQlNGX1dFQUsgc3ltYm9sIGFzCi0JU1RCX1dFQUsgcmF0aGVyIHRoYW4gU1RCX0dMT0JBTC4KLQotVHVlIE1hciAgNyAxMjoyMzo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZCBuZXcgZmllbGQKLQlfYmZkX2NvZmZfYWRqdXN0X3N5bW5keC4KLQkoYmZkX2NvZmZfYWRqdXN0X3N5bW5keCk6IERlZmluZS4KLQkoY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lIGFzIE5VTEwgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZCB0bwotCWNvZmZfYWRqdXN0X3N5bW5keC4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBDYWxsIGNvZmZfYWRqdXN0X3N5bW5keCBpZiBpdAotCWlzIGRlZmluZWQuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX2FkanVzdF9zeW1uZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2FkanVzdF9zeW1uZHgpOiBEZWZpbmUgYmVmb3JlIGluY2x1ZGluZyBjb2ZmY29kZS5oLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogU2tpcCBiaW5hcnlfdmVjIHdoZW4KLQlzZWFyY2hpbmcgdGhyb3VnaCBiZmRfdGFyZ2V0X3ZlY3Rvci4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogQ2hlY2sgU0hUX05PQklUUyBiZWZvcmUgY2hlY2tpbmcKLQlzaF9zaXplLgotCi1Nb24gTWFyICA2IDIzOjMxOjM2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc29ydF9oZHJzKTogS2VlcCBTSFRfTk9CSVRTIHNlY3Rpb25zIGFmdGVyCi0JIVNIVF9OT0JJVFMgb25lcy4KLQotTW9uIE1hciAgNiAwOTo1MzowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY3B1LWhwcGEuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IFN1cHBvcnQgYm90aCBQQTEuMCBhbmQgUEExLjEKLQltYWNoaW5lIHR5cGVzLgotCShiZmRfaHBwYV9hcmNoKTogTGluayBpbiBib3RoIFBBMS4wIGFuZCBQQTEuMSBhcmNoaXRlY3R1cmUgaW5mbwotCXN0cnVjdHVyZXMuCi0JKiBsaWJocHBhLmggKGVudW0gcGFfYXJjaCk6IE5ldyBlbnVtZXJhdGlvbiB0byBkZXNjcmliZSB0aGUKLQlkaWZmZXJlbnQgdmFyaWFudHMgb2YgdGhlIFBBIGFyY2hpdGVjdHVyZS4KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogVXNlIG5ldyBlbnVtZXJhdGlvbiB0byBzZXQgbWFjaGluZQotCXR5cGUuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IElmIHRoZSBtYWNoaW5lIHR5cGUgaXMgUEExLjEsIHRoZW4gdXNlIHRoZQotCVBBMS4xIG1hY2hpbmUgaWRlbnRpZmllciBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLVRodSBNYXIgIDIgMTU6NTg6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogVHJlYXQgdGhlIGluZGV4IG9mIGEKLSAgICAgICAgYmFzZSByZWxhdGl2ZSByZWxvYyBhcyBhbiBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHJlZ2FyZGxlc3MKLSAgICAgICAgb2YgdGhlIHNldHRpbmcgb2Ygcl9leHRlcm4uCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKSk6IERvdWJsZSBjaGVjayB0aGF0IHRoZQotCWNhbGxlciBpcyB3cml0aW5nIHRvIGEgdmFsaWQgc2VjdGlvbi4KLQotVGh1IE1hciAgMiAxNDozNzo1NyAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCi0JKiBiaW5hcnkuYzogQWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgYmluYXJ5IGZpbGVzLiAgTG9hZHMgdGhlIHJhdwotCWNvbnRlbnRzIG9mIHRoZSBmaWxlIGludG8gYSBkYXRhIHNlY3Rpb24gYW5kIHdyYXBzIHNvbWUgc3ltYm9scwotCWFyb3VuZCBpdC4gIFRoZSBzeW1ib2xzIGBfYmluYXJ5XzxmaWxlbmFtZT5fc3RhcnQnIGFuZAotCWBfYmluYXJ5XzxmaWxlbmFtZT5fZW5kJyBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgZGF0YSwKLQl3aGlsZSBgX2JpbmFyeV88ZmlsZW5hbWU+X3NpemUnIGlzIGFuIGFic29sdXRlIHN5bWJvbCB3aG9zZSB2YWx1ZQotCWlzIHRoZSBzaXplIG9mIHRoZSBkYXRhLiAgPGZpbGVuYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgYmluYXJ5Ci0JaW5wdXQgZmlsZSwgd2l0aCBhbGwgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0bwotCXVuZGVyc2NvcmVzLgotCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaF9nZXRfY29tcGF0aWJsZSk6IEFzc3VtZSB1c2VycyBrbm93cyB3aGF0Ci0JdGhleSdyZSBkb2luZyBpZiBvbmUgb2YgdGhlIGFyY2hpdGVjdHVyZXMgaXMgYmZkX2FyY2hfdW5rbm93bi4KLQotV2VkIE1hciAgMSAxNzozMDo0NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKGVsZl9wb3dlcnBjX2hvd3RvX3RhYmxlKTogRm9yIHJlbG9jYXRpb24KLQlSX1BQQ19HT1QxNiwgY2hhbmdlIGNvbXBsYWluX29uX292ZXJmbG93IHRvIGJlCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi1XZWQgTWFyICAxIDExOjUyOjU1IDE5OTUgIEphc29uIE1vbGVuZGEgIDxjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIHBvd2VycGMtKi1haXgqLgotCi1XZWQgTWFyICAxIDExOjU3OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pOTYwLmMgKENPRkZfUEFHRV9TSVpFKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaW46IFJld3JpdGUgb3V0cHV0IG9mIFRERUZBVUxUUyB0byBhdm9pZCByZWx5aW5nIG9uCi0Jc2VtYW50aWNzIG9mIHNpbmdsZSBxdW90ZXMgaW4gcGFyYW1ldGVyIHN1YnN0aXR1dGlvbi4KLQotVHVlIEZlYiAyOCAxMjo1MzowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IFNvcnQgZW1wdHkgc2VjdGlvbnMgYmVmb3JlIG5vbi1lbXB0eQotCXNlY3Rpb25zLCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgVk1BLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWxpbnV4ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1sZWxmLgotCShpWzM0NV04Ni0qLWdudWVsZiopOiBOZXcgdGFyZ2V0LiAgVXNlIGkzODYtZ2VsZi4KLQkqIGNvbmZpZy9pMzg2LWxlbGYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYtZ2VsZi5tdDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgMjcgMTI6NTg6MjUgMTk5NSAgS3VuZyBIc3UgIDxrdW5nQG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogYWRkIGEyOWstKi12eHdvcmtzIGNvbmZpZ3VyYXRpb24uCi0KLVdlZCBGZWIgMjIgMTQ6NDA6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8KLQl1c2UgcmVsb2NfaG93dG9fdHlwZSByYXRoZXIgdGhhbiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0LgotCi1UdWUgRmViIDIxIDE4OjE5OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChiX291dF9zbHVycF9yZWxvY190YWJsZSk6IERvbid0IHJldHVybiBhbiBlcnJvciBpZiBhc2tlZAotCWZvciByZWxvY2F0aW9ucyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4KLQotVHVlIEZlYiAyMSAxNToxMzowNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogSGFuZGxlIG9iamVjdHMgd2l0aCBvZGQKLQlsZW5ndGhzLgotCi1GcmkgRmViIDE3IDEyOjM0OjM2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9nb3QxNl9yZWxvYyk6IE1ha2UgR09UIHN0eWxlIHJlbG9jcyBhZGQKLQkzMjc2OCwgc28gdGhlIEdPVCBwb2ludGVyIGNhbiBwb2ludCB0byAxNjM4NCBwb2ludGVycywgaW5zdGVhZCBvZgotCTgxOTIuCi0KLUZyaSBGZWIgMTcgMTE6NDU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBob3N0cy9zeXN2NC5oOiBJbmNsdWRlIDx1bmlzdGQuaD4sIDxzdGRsaWIuaD4sIGFuZCA8dGltZS5oPi4KLQlPbmx5IGRlZmluZSBTRUVLX1NFVCBhbmQgU0VFS19DVVIgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgZGVmaW5lZC4KLQlSZW1vdmUgYWxsIGV4dGVybmFsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQotCSogc3ltcy5jIChiZmRfZGVjb2RlX3N5bWNsYXNzKTogUmV0dXJuICdXJyBmb3IgYSB3ZWFrIHN5bWJvbC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBTZXQgc3RhcnQgYWRkcmVzcyBhbmQgZmxhZ3MKLQliZWZvcmUgY2FsbGluZyBjb2ZmX21rb2JqZWN0X2hvb2suICBSZXN0b3JlIHRoZW0gb24gZmFpbHVyZS4KLQkqIGVjb2ZmLmMgKF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayk6IElmIG5vdCBFQ09GRl9BT1VUX1pNQUdJQywKLQljbGVhciBEX1BBR0VELgotCi0JKiBjb2ZmZ2VuLmM6IFJlaW5kZW50ZWQuCi0KLVRodSBGZWIgMTYgMTQ6Mzc6MjMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcGVyZm9ybV9yZWxvY2F0aW9uKTogRG9uJ3QgdXNlIGJpdHBvcyBpbiBvdmVyZmxvdwotCWNhbGN1bGF0aW9ucy4KLQkoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IExpa2V3aXNlLgotCi1UaHUgRmViIDE2IDEzOjIyOjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaG9zdHMvc3RkLWhvc3QuaDogUmVtb3ZlIGFsbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgd2hpY2ggcmV0dXJuCi0JaW50IG9yIHZvaWQsIGV4Y2VwdCB0aGUgb25lIGZvciBmcmVlLgotCi1XZWQgRmViIDE1IDE0OjU0OjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKGVsZl9wb3dlcnBjX2hvd3RvX3RhYmxlKTogVXNlIGEgZGVzdGluYXRpb24gbWFzayBvZgotCTB4ZmZmZmZmZmYgZm9yIFJfUFBDX1JFTDMyLCBub3QgMC4KLQkocG93ZXJwY19yZWxvY19tYXApOiBBZGQgbG93IDE2IGJpdCwgaGlnaCAxNiBiaXQsIGFuZCBoaWdoIDE2IGJpdAotCWFkanVzdGVkIHJlbG9jYXRpb25zLgotCi1UdWUgRmViIDE0IDE3OjQ3OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lKTogRGVmaW5lLgotCShtaXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9maW5kX25lYXJlc3RfbGluZSk6IERlZmluZS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBmaW5kX2xpbmVfaW5mbyBmaWVsZC4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zd2FwX3Rpcl9pbik6IE1vdmUgdG8gZWNvZmZsaW5rLmMuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShjbXBfZmRydGFiX2VudHJ5KTogTGlrZXdpc2UuCi0JKG1rX2ZkcnRhYik6IExpa2V3aXNlLgotCShsb29rdXApOiBMaWtld2lzZS4KLQkoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEp1c3QgY2FsbCBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCi0JdG8gZG8gbW9zdCBvZiB0aGUgd29yay4gIEFsbG9jYXRlIGZpbmRfbGluZV9pbmZvIGlmIG5lY2Vzc2FyeS4KLQkqIGVjb2ZmbGluay5jOiBJbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luKTogTW92ZSBpbiBmcm9tIGVjb2ZmLmMuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luKTogTGlrZXdpc2UuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShjbXBfZmRydGFiX2VudHJ5KTogTGlrZXdpc2UuICBVc2UgUFRSIGluc3RlYWQgb2Ygdm9pZCAqLgotCShta19mZHJ0YWIpOiBNb3ZlIGluIGZyb20gZWNvZmYuYy4gIEFkZCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLAotCWFuZCBsaW5lX2luZm8gYXJndW1lbnRzLCBhbmQgdXNlIHRoZW0gaW5zdGVhZCBvZiBlY29mZl9kYXRhLgotCShmZHJ0YWJfbG9va3VwKTogTW92ZSBpbiBmcm9tIGxvb2t1cCBpbiBlY29mZi5jLiAgUmVtb3ZlIGFiZmQKLQlhcmd1bWVudCwgYWRkIGxpbmVfaW5mbyBhcmd1bWVudC4gIFVzZSBpdCBpbnN0ZWFkIG9mIGVjb2ZmX2RhdGEuCi0JKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBOZXcgZnVuY3Rpb24sIG1vc3RseSBmcm9tIHRoZSBvbGQKLQlfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIGluIGVjb2ZmLmMuCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBSZW1vdmUgZmluZF9idWZmZXIsIGZkcnRhYl9sZW4gYW5kCi0JZmRydGFiIGZpZWxkcywgcmVwbGFjaW5nIHRoZW0gZmluZF9saW5lX2luZm8gZmllbGQuCi0JKF9iZmRfZWNvZmZfc3dhcF90aXJfaW4pOiBEZWNsYXJlLgotCShfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luKTogRGVjbGFyZS4KLQkoX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0KTogRGVjbGFyZS4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lKTogRGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBEb24ndCB1c2UgZWNvZmYubyBmb3IgYmZkX2VsZjMyX2JpZ21pcHNfdmVjIG9yCi0JYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1UdWUgRmViIDE0IDE0OjA0OjIyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGRzIGVsZl9tYWNoaW5lX2FsdDEgYW5kCi0JZWxmX21hY2hpbmVfYWx0MiB3aGljaCBwcm92aWRlIGFsdGVybmF0ZSB2ZXJzaW9ucyBvZiB0aGUgbWFjaGluZQotCWNvZGUuCi0KLQkqIGVsZjMyLXBwYy5jIChFTEZfTUFDSElORV9BTFQxLCBFTEZfTUFDSElORV9BTFQyKTogRGVmaW5lIHRvCi0JcmVjb2duaXplIG9sZCB2ZXJzaW9ucyBvZiB0aGUgUG93ZXJQQyBtYWNoaW5lIGNvZGUuCi0KLQkqIGVsZjMyLXRhcmdldC5oIChlbGYzMl9iZWQpOiBJbml0aWFsaXplIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUKLQlmaWVsZHMgZGVmaW5lZCBieSBFTEZfTUFDSElORV9BTFQxIGFuZCBFTEZfTUFDSElORV9BTFQyLgotCi0JKiBlbGY2NC10YXJnZXQuaCAoZWxmNjRfYmVkKTogSW5pdGlhbGl6ZSBhbHRlcm5hdGUgbWFjaGluZSBjb2RlCi0JZmllbGRzIGRlZmluZWQgYnkgRUxGX01BQ0hJTkVfQUxUMSBhbmQgRUxGX01BQ0hJTkVfQUxUMi4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3AsIGVsZl9jb3JlX2ZpbGVfcCk6IEluIGFkZGl0aW9uIHRvIHRoZQotCW1haW4gbWFjaGluZSBjb2RlIGZpZWxkLCBjaGVjayB0aGUgdHdvIGFsdGVybmF0ZSBtYWNoaW5lIGNvZGUKLQlmaWVsZHMuCi0KLVR1ZSBGZWIgMTQgMTI6NDY6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0ZjEuaCAoTUFDSFRZUEVfT0spOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLiAgRG9uJ3QKLQlhY2NlcHQgTV9TUEFSQyBpZiBiZmRfYXJjaF9zcGFyYyBpcyBub3QgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkCi0JYXJjaGl0ZWN0dXJlcywgYW5kIGRvbid0IGFjY2VwdCBhIDY4MHgwIG1hY2hpbmUgdHlwZSBpZgotCWJmZF9hcmNoX202OGsgaXMgbm90IGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzLgotCSogYW91dDAuYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0KLU1vbiBGZWIgMTMgMjM6MjU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogRG9uJ3QgcmV0dXJuIGEgcG9pbnRlcgotCXRvIGdhcmJhZ2UgaWYgdGhlIHN5bWJvbCBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0JKE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAgOSAxODozNjo1MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgaTM4Nm1zZG9zLm8uCi0KLVRodSBGZWIgIDkgMTI6MDI6MzUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2bGludXguYyAoTkVFRFNfU0hSTElCKTogRGVmaW5lLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogQ3Jhc2ggaWYgYSBORUVEU19TSFJMSUIgc3ltYm9sIGlzCi0JdW5kZWZpbmVkLiAgRnJvbSBoamxAbnluZXhzdC5jb20gKEguSi4gTHUpLgotCi1XZWQgRmViICA4IDE3OjI2OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBBbGxvY2F0ZSBjb21tb24KLQlzeW1ib2wgaW5mb3JtYXRpb24gc3RydWN0dXJlLiAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvciBjb21tb24KLQlzeW1ib2wgc2l6ZSBvdmVyZmxvdy4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IEFkanVzdCByZWZlcmVuY2VzCi0JdG8gY29tbW9uIHN5bWJvbCBpbmZvcm1hdGlvbiBmb3IgbmV3IHN0cnVjdHVyZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IExpa2V3aXNlLgotCi1XZWQgRmViICA4IDA5OjUzOjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NvcnRfaGRycyk6IFB1dCBTSFRfTk9CSVRTIHNlY3Rpb25zIGFmdGVyICFTSFRfTk9CSVRTLgotCi1UdWUgRmViICA3IDE2OjI3OjMzIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9maW5kX25lYXJlc3RfbGluZSk6IEp1c3QgcmV0dXJuIGZhbHNlLCBkb24ndAotCWFib3J0LgotCi1UdWUgRmViICA3IDE0OjQzOjMzIDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jOiBSZWZvcm1hdHRlZCBzb21lIGNvbW1lbnRzIGFuZCBicmFjZSBjb25zdHJ1Y3RzIGluCi0JcmVjZW50IGNoYW5nZXMgdG8gR05VIHN0eWxlLgotCShjbXBfZmRydGFiX2VudHJ5LCBta19mZHJ0YWIsIGxvb2t1cCk6IFVzZSBvbGQtc3R5bGUgZnVuY3Rpb24KLQlkZWZpbml0aW9ucy4KLQotVHVlIEZlYiAgNyAxNDoyMToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX3Bkcl9pbik6IFplcm8gb3V0IGludGVybiBiZWZvcmUgc2V0dGluZwotCWFueSBvZiB0aGUgZmllbGRzLgotCi1Nb24gRmViICA2IDIwOjAxOjI0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTYXQgRmViICA0IDE0OjIwOjI0IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfcGRyX2luLCBlY29mZl9zd2FwX3Bkcl9vdXQpOiBhZGRlZAotCWludGVybmFsaXppbmcvZXh0ZXJuYWxpemluZyBuZXcgInByb2YiIGZpZWxkLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl90ZGF0YSk6IGFkZGVkIGZkcnRhYi4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEZpeGVkLgotCi1Nb24gRmViICA2IDE0OjI1OjI0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogQWRkIHNhd19uZWVkZWQgZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCBzYXdfbmVlZGVkIGlmCi0JRFRfTkVFREVEIHNlZW4gaW4gLmR5bmFtaWMgc2VjdGlvbi4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IFdhcm4gaWYgYW4gdW5kZWZpbmVkIHN5bWJvbCBpcwotCW9ubHkgcmVmZXJlbmNlZCBmcm9tIGEgZHluYW1pYyBvYmplY3QsIGFuZCBub3QgbWFraW5nIGEgc2hhcmVkCi0Jb2JqZWN0LCBhbmQgc2F3X25lZWRlZCBpcyBmYWxzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgc2F3X25lZWRlZC4KLQotCSogbGliZWxmLmggKEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLKTogRG9uJ3QgZGVmaW5lLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBjbGVhciBvciBzZXQKLQlFTEZfTElOS19IQVNIX0RFRklORURfV0VBSy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IERvbid0IGNoZWNrIEVMRl9MSU5LX0hBU0hfREVGSU5FRF9XRUFLLgotCi0JRGlzdGluZ3Vpc2ggYSB3ZWFrIGRlZmluZWQgc3ltYm9sIGZyb20gYSByZWd1bGFyIGRlZmluZWQgc3ltYm9sLgotCSogbGlua2VyLmMgKGVudW0gbGlua19hY3Rpb24pOiBBZGQgREVGVy4KLQkobGlua19hY3Rpb24pOiBBZGQgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrIGNvbHVtbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBBZGQgREVGVyBjYXNlLiAgSGFuZGxlCi0JYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrIGluIGEgZmV3IG90aGVyIGNhc2VzLgotCSogTWFueSBmaWxlcyAoYmZkX2xpbmtfaGFzaF91bmRlZndlYWspOiBSZW5hbWVkIGZyb20KLQliZmRfbGlua19oYXNoX3dlYWsuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IEhhbmRsZSBiZmRfbGlua19oYXNoX2RlZndlYWsuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCSogYm91dC5jIChnZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jKTogTGlrZXdpc2UuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGNvZmZsaW5rLmMgKGNvZmZfd3JpdGVfZ2xvYmFsX3N5bSk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IExJa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExpa2V3aXNlLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogTGlrZXdpc2UuCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkobGludXhfdGFsbHlfc3ltYm9scyk6IExpa2V3aXNlLgotCShsaW51eF9maW5pc2hfZHluYW1pY19saW5rKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoc2V0X3N5bWJvbF9mcm9tX2hhc2gpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkoYmZkX3BlcmZvcm1fc2xpcCk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkoc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKHN1bm9zX3NjYW5fZXh0X3JlbG9jcyk6IExpa2V3aXNlLgotCShzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLU1vbiBGZWIgIDYgMDM6MjA6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBCcnlhbiBGb3JkLCBiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1OgotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi1tc2RvcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChpMzg2bXNkb3NfdmVjKTogSGFuZGxlIGl0LgotCSogaTM4Nm1zZG9zLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL2kzODYtbXNkb3MubXQ6IE5ldyBmaWxlLgotCSogYmZkLmMgKGVudW0gYmZkX2Vycm9yKTogQWRkZWQgbmV3IHZhbHVlIGJmZF9lcnJvcl9maWxlX3Rvb19iaWcuCi0JKGJmZF9lcnJtc2dzKTogQWRkZWQgc3RyaW5nIHRvIHRhYmxlLgotCSogbGliYW91dC5oIChyZWxvY190eXBlLWxvb2t1cCk6IERlY2xhcmUgaXQuCi0JKiB0YXJnZXRzLmMgKGVudW0gYmZkX2ZsYXZvdXIpOiBBZGRlZCBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIuCi0JKGkzODZtc2Rvc192ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBpdCB0byB0aGUgbGlzdC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLVdlZCBGZWIgIDEgMDE6MzI6MTQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2V0X3JlbG9jX2luZm8sIGNhc2UgUl9EQVRBX09ORV9TWU1CT0wpOiBJZiB0aGVyZSdzCi0Jbm90aGluZyBpbiBSX0RBVEFfT1ZFUlJJREUsIHRoZW4gdHJ5IHRvIGZpbmQgdGhlIGFkZGVuZCBpbiB0aGUKLQlzZWN0aW9uJ3MgY29udGVudHMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBJZ25vcmUgdGhlIGFkZGVuZCBpbiBhIFJfREFUQV9PTkVfU1lNQk9MIGZpeHVwLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IE1vcmUgaGVydWlzdGljcyB0byBkZXRlY3QgdGhlCi0JYnJhaW5kYW1hZ2VkIEhQIE9TRjEgbGlua2VyLiAKLQkoc2V0dXBfc2VjdGlvbnMpOiBEb24ndCBmb3JnZXQgdG8gZnJlZSBzdWJzcGFjZV9zZWN0aW9ucyBpZiB3ZSBnZXQKLQlhbiBlcnJvci4KLQkoc29tX3NsdXJwX3N0cmluZ190YWJsZSk6IEFsbG9jYXRlIHN0cmluZ3Mgb24gdGhpcyBiZmQncyBvYnN0YWNrCi0JcmF0aGVyIHRoYW4gZGlyZWN0bHkgb3V0IG9mIHRoZSBoZWFwLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UgZm9yIHRoZSBzYXZlZCBjb3B5IG9mIHRoZQotCWNhbm9uaWNhbCBzeW1ib2xzLgotCShzb21fc2x1cnBfcmVsb2NfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIHNhdmVkIGNvcHkgb2YgdGhlCi0JY2Fub25pY2FsIHJlbG9jYXRpb25zLiAgRnJlZSB0aGUgbmF0aXZlIHJlbG9jYXRpb25zIHdoZW4gd2UncmUKLQlkb25lIHdpdGggdGhlbS4KLQotVHVlIEphbiAzMSAyMTo1MzoyOCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgbWVtYmVyIHByb2dyYW1faGVhZGVyX3NpemUuCi0JKiBlbGZjb2RlLmggKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogTmV3IHBhcmFtZXRlcnMgc29ydGVkX2hkcnMsCi0JY291bnQsIGFuZCBtYXhwYWdlc2l6ZS4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0JSWYgc29ydGVkX2hkcnMgaXMgbm9uLU5VTEwsIHVzZSBpdCB0byBjb21wdXRlIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuCi0JU2F2ZSByZXN1bHQgaW4gY2FzZSBjYWxsZWQgYWdhaW4uCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogU29ydCBoZWFkZXJzIGJlZm9yZSBjYWxsaW5nCi0JZ2V0X3Byb2dyYW1faGVhZGVyX3NpemUuCi0KLVR1ZSBKYW4gMzEgMTU6Mjc6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogQWRkIHNvcnRlZF9oZHJzIHBhcmFtZXRlci4KLQlTZWFyY2ggdGhyb3VnaCBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHVuc29ydGVkIHNlY3Rpb24gaGVhZGVycy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBQYXNzIHNvcnRlZF9oZHJzIHRvCi0JbWFwX3Byb2dyYW1fc2VnbWVudHMuCi0KLU1vbiBKYW4gMzAgMjI6MDQ6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEZpeCBwcm9ibGVtcyBpbiByYW5nZQotCWNoZWNraW5nLiAgRXhwZWN0IGFyZ3VtZW50IE9GRlNFVCB0byBiZSBzZWN0aW9uLXJlbGF0aXZlLiAgRnJvbQotCURhdmlkIE1vc2Jlcmdlci1UYW5nLCBkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1LgotCi1Nb24gSmFuIDMwIDExOjIyOjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBEb24ndCBkbwotCWFueXRoaW5nIGlmIHdlIGFyZSBub3QgbGlua2luZyBhbiBFTEYgZmlsZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBMaWtld2lzZS4KLQotU2F0IEphbiAyOCAxMjo0ODo1NyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGNvbXBhcmVfc3Vic3BhY2VzKTogTmV3IGZ1bmN0aW9uIHRvIHNvcnQgc3Vic3BhY2VzIGJ5Ci0JdGhlaXIgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLgotCShzZXR1cF9zZWN0aW9ucyk6IFdoZW4gY29tcHV0aW5nIHRoZSBpbmRleCBmb3IgZWFjaCBzdWJzcGFjZSwKLQloYW5kbGUgY2FzZSB3aGVyZSBzZXR1cF9zZWN0aW9ucyByZWFkcyB0aGUgc3Vic3BhY2VzIGluIGEKLQlkaWZmZXJlbnQgb3JkZXIgdGhhdCB0aGV5IGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuCi0JKHNvbV9pc19zcGFjZSk6IEFsc28gZXhhbWluZSB0aGUgb3V0cHV0IHNlY3Rpb24gZm9yIHRoZSBjb250YWluaW5nCi0Jc2VjdGlvbi4KLQkoc29tX2lzX3N1YnNwYWNlLCBzb21faXNfY29udGFpbmVyKTogTGlrZXdpc2UuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogRG9uJ3QgcHJlcGFyZSBvciB3cml0ZSBmaXh1cHMgaGVyZS4gIFdoZW4KLQl3cml0aW5nIHRoZSBzeW1ib2wgc3RyaW5ncywgdXNlIHRoZSB1bnNvcnRlZCBzeW1ib2wgdGFibGUuCi0JKHNvbV93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlIGhlcmUuCi0JKHNvbV9maW5pc2hfd3JpdGluZyk6IFByZXBhcmUgYW5kIHdyaXRlIHRoZSBmaXh1cHMgaGVyZS4gIExpa2V3aXNlCi0JZm9yIHRoZSBzeW1ib2wgdGFibGUuCi0JKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBVbmRlZmluZWQgc3ltYm9scyBhbHdheXMgaGF2ZQotCXR5cGUgU1NfVU5TQVQgcmVnYXJkbGVzcyBvZiBCU0ZfRVhQT1JULgotCShzb21fc2V0X3JlbG9jX2luZm8pOiBVbnBhY2sgYW5kIGF0dGFjaCBhcmd1bWVudCBsb2NhdGlvbgotCWluZm9ybWF0aW9uIGZvciBSX1BDUkVMX0NBTEwgYW5kIFJfQUJTX0NBTEwgcmVsb2NhdGlvbnMuCi0KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogTmV3IGhldXJpc3RpYyB0byBkZXRlcm1pbmUgaWYgdGhlCi0JZW50cnkgYW5kIGZsYWdzIGZpZWxkcyBhcmUgc3dpdGNoZWQgaW4gdGhlIGV4ZWMgaGVhZGVyLgotCi1TYXQgSmFuIDI4IDAwOjE2OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgKnN5bV9oYXNoIGluc3RlYWQKLQlvZiBoIGlmIHdlIG1pZ2h0IG5vdCBiZSBkb2luZyBhbiBFTEYgbGluay4KLQotRnJpIEphbiAyNyAxNjoxMzo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IElmIHRoZSBzaXplIG9mIGFuIGlucHV0Ci0JLnJlZ2luZm8gc2VjdGlvbiBpcyB6ZXJvLCBmb3JjZSBpdCB0byB0aGUgY29ycmVjdCBzaXplLCBzaW5jZSB0aGUKLQlsaW5rZXIgZW11bGF0aW9uIGNvZGUgbWF5IGhhdmUgY2xvYmJlcmVkIGl0LgotCi0JKiBlbGZjb2RlLmggKGVsZl9zb3J0X2hkcnMpOiBDb3JyZWN0IFNIRl9BTExPQyB0ZXN0LgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IEZyZWUgc29ydGVkX2hkcnMuCi0KLVRodSBKYW4gMjYgMDk6MDA6MTIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIHNyZWMuYyAoc3JlY19zZXRfc2VjdGlvbl9jb250ZW50cyk6IEZpeCBvZmYgYnkKLQlvbmUgZW5kIGFkZHJlc3MgY2FsY3VsYXRpb24uCi0KLQkqIGNvbmZpZy5iZmQ6IChtNjgqLWVzdC1jb2ZmKTogTmV3IGNvbmZpZ3VyYXRpb24uCi0KLVRodSBKYW4gMjYgMTE6Mzk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgZXhhbWluZSB3ZWFrZGVmIGlmCi0Jd2UgYXJlIHVzaW5nIGFuIEVMRiBoYXNoIHRhYmxlLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEFsd2F5cyBzZXQgRVhFQ19QIGlmCi0JdGhlIHN0YXJ0IGFkZHJlc3MgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGV2ZW4gaWYgU1RBVF9GT1JfRVhFQwotCWlzIHNldC4gIEp1c3QgdXNlIFNUQVRfRk9SX0VYRUMgYXMgYW4gYWRkaXRpb25hbCB0ZXN0LgotCi1UaHUgSmFuIDI2IDExOjEyOjU0IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IFVzZSBFTV9QUEMgaW5zdGVhZCBvZgotCUVNX0NZR05VU19QT1dFUlBDLgotCi0JKiBlbGYzMi1wcGMuYyAocmVsb2NfdHlwZSk6IEFkZCBhbGwgU3lzdGVtIFYuNCBhbmQgZUFCSQotCXJlbG9jYXRpb25zIGN1cnJlbnRseSBkZWZpbmVkLgotCShwb3dlcnBjX3JlbG9jX21hcCk6IEFkanVzdCB0byBuZXcgcmVsb2NhdGlvbiBuYW1lcy4KLQkoZWxmX3Bvd2VycGNfaG93dG9fdGFibGUpOiBBZGQgbW9zdCBvZiB0aGUgbmV3IHJlbG9jYXRpb25zLgotCShFTEZfTUFDSElORV9DT0RFKTogVXNlIEVNX1BQQyBpbnN0ZWFkIG9mIEVNX0NZR05VU19QT1dFUlBDLgotCi0JKiBjb25maWcuYmZkOiBBZGQgc3VwcG9ydCBmb3IgcG93ZXJwYy0qLWVhYmkuCi0KLQkqIGNvbmZpZy9wcGMtZWxmLm10OiBBZGQgcnM2MDAwIGFyY2hpdGVjdHVyZSBzdXBwb3J0IHRvIHRoZQotCVBvd2VyUEMuICBBbHNvIGFkZCBYQ09GRiBzdXBwb3J0LgotCi1XZWQgSmFuIDI1IDIzOjI2OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChDQUxDX0FEREVORCk6IERvbid0IGRlZmluZS4KLQkoY29mZl9zaF9yZWxvY2F0ZV9zZWN0aW9uKTogUmVtb3ZlLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBVc2UgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbi4KLQotVHVlIEphbiAyNCAxNDoyMjo0NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfb3V0cHV0X2V4dHN5bSk6IFNldCB0aGUgdmFsdWUgb2YgdGhlCi0JRUNPRkYgc3ltYm9sIGZyb20gdGhlIGhhc2ggdGFibGUgZW50cnkuCi0KLU1vbiBKYW4gMjMgMTQ6NTM6MzUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIGNvZmYtc2guYyAoY29mZl9zaF9yZWxvY2F0ZV9zZWN0aW9uKTogIERvbid0IHN1YnRyYWN0Ci0Jdm1hIHR3aWNlLgotCi1Nb24gSmFuIDIzIDEzOjMzOjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9yZWxvYyk6IERvbid0IGlnbm9yZSB0aGUgcHJldmlvdXMgY29udGVudHMgb2YgYW4KLQlSX1NIX0lNTTMyIHJlbG9jLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWdudSopOiBTZXQgYmZkX25hbWUgdG8gaTM4Ni1nbnUuCi0JKiBjb25maWcvaTM4Ni1nbnUubXQ6IE5ldyBmaWxlLiAgSW5jbHVkZSBFTEYgc3VwcG9ydC4KLQotCSogb3BuY2xzLmMgKGJmZF9vcGVuc3RyZWFtcik6IENhbGwgYmZkX2NhY2hlX2luaXQuCi0KLUZyaSBKYW4gMjAgMTE6NDQ6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IE9ubHkgc2V0IHRoZSBzdW5vcyBzcGVjaWZpYwotCWZpZWxkcyBpZiB3ZSBhcmUgZG9pbmcgYSBzdW5vcyBsaW5rLgotCi1XZWQgSmFuIDE4IDEyOjI4OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY3B1LWg4MzAwLmMgKGg4MzAwX2luZm9fc3RydWN0KTogQ2hhbmdlIG5hbWUgZnJvbSAiSDgvMzAwIiB0bwotCSJoODMwMCIgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgY3B1LSogZmlsZXMuCi0JKGg4MzAwaF9pbmZvX3N0cnVjdCk6IENoYW5nZSBuYW1lIGZyb20gIkg4LzMwMEgiIHRvICJoODMwMGgiLgotCSogY29mZi1oODMwMC5jIChzcGVjaWFsKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBkaWZmLgotCi1UdWUgSmFuIDE3IDEwOjUyOjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKGJmZF9ieXRlLCByZWxvY19ob3d0b190eXBlKTogRGVmaW5lIGhlcmUsIG5vdC4uLgotCSogcmVsb2MuYyAoYmZkX2J5dGUsIHJlbG9jX2hvd3RvX3R5cGUpOiBoZXJlLgotCSogQ2hhbmdlZCBhbGwgb2NjdXJyZW5jZXMgb2YgYGBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0JycKLQl0byBiZSBgYHJlbG9jX2hvd3RvX3R5cGUnJyBpbnN0ZWFkLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaCwgbGliY29mZi5oOiBSZWJ1aWx0LgotCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5zdHJlYW1yKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi1taXBzLmMgKGVudW0gcmVsb2NfdHlwZSk6IERlZmluZSBuZXcgcmVsb2NzIHVzZWQgb24gSXJpeC4KLQkoZWxmX21pcHNfaG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgbmV3IHJlbG9jcy4KLQkobWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBIYW5kbGUgU0hUX01JUFNfTVNZTSwKLQlTSFRfTUlQU19EV0FSRiwgYW5kIFNIVF9NSVBTX0VWRU5UUy4KLQkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IEhhbmRsZSBzZWN0aW9ucyBuYW1lZCAubXN5bSwgLmRlYnVnXyoKLQlhbmQgLk1JUFMuZXZlbnRzLiouCi0KLQkqIHNyZWMuYyAoc3JlY19pbml0KTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBpLgotCi1TYXQgSmFuIDE0IDE5OjA5OjQ4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQGpvbm55PgotCi0JKiBhcmNodXJlcy5jLCBNYWtlZmlsZS5pbiwgdGFyZ2V0cy5jLCBiZmQtaW4yLmgsIGNvZmZjb2RlLmgsCi0JY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBjb25maWcvdzY1Lm10OiBJbml0aWFsIHN1cHBvcnQgZm9yIHRoZSBXNjUuCi0KLVN1biBKYW4gMTUgMTM6NTc6NDUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IENvbmZpZ3VyZSBmb3IgV0lOMzIuCi0KLVRodSBKYW4gMTIgMTY6MzA6NDcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RzdHVmZik6IEluY2x1ZGUgYGhlYWRlcnMnLgotCi0JKiBzdW5vcy5jIChtNjhrX3BsdF9maXJzdF9lbnRyeSwgc3BhcmNfcGx0X2ZpcnN0X2VudHJ5KTogTm93Ci0JY29uc3QuCi0JKiB0ZWtoZXguYyAoZGlncyk6IERpdHRvLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9wbHQwX2VudHJ5LCBlbGZfaTM4Nl9wbHRfZW50cnkpOiBEaXR0by4KLQotCSogc3JlYy5jLCB0ZWtoZXguYzogSW5jbHVkZSBsaWJpYmVydHkuaC4gIERlbGV0ZSBzdGF0aWMgYXJyYXkKLQloZXhfdmFsdWUgYW5kIHJlcGxhY2UgcmVmZXJlbmNlcyB0byBpdCB3aXRoIHJlZmVyZW5jZXMgdG8KLQloZXhfaW5pdCwgaGV4X3AsIGFuZCBoZXhfdmFsdWUuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGFyY2h1cmVzLmMgKGFyY2h1cmVzX2luaXRfdGFibGUpOiBOb3cgY29uc3QuCi0JKGJmZF9hcmNoX2luaXQpOiBBZGp1c3RlZCB0eXBlIG9mIGxvY2FsIHZhciBgcHRhYmxlJy4KLQotVGh1IEphbiAxMiAwOTozMzoyNCAxOTk1ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGhvc3RzL3N5bW1ldHJ5Lmg6ICBSZWRlZmluZSBgc2hhcmVkJyB0byBlbmFibGUgY29tcGlsYXRpb24KLQl3aXRoIHRoZSBuYXRpdmUgRHluaXggY2MgY29tcGlsZXIuCi0JKiBpMzg2ZHluaXguYzogIEluY2x1ZGUgYW91dHguaCBpbnN0ZWFkIG9mIHVzaW5nIHJvdXRpbmVzCi0JZnJvbSBhb3V0MzIuYy4KLQotV2VkIEphbiAxMSAyMTozMTo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChyZWxvY19ob3d0b190eXBlKTogTWFrZSB0eXBlZGVmIGluY2x1ZGUgYGNvbnN0Jy4KLQkqIGFvdXQtbnMzMmsuYywgYW91dHguaCwgYm91dC5jLCBjZi1tNjhrbHlueC5jLCBjb2ZmLWkzODYuYywKLQljb2ZmLWk5NjAuYywgY29mZi1tNjhrLmMsIGNvZmZsaW5rLmMsIGNwdS1uczMyay5jLCBlY29mZi5jLAotCWVsZjMyLWhwcGEuYywgZWxmMzItaTM4Ni5jLCBlbGYzMi1taXBzLmMsIGVsZjMyLXNwYXJjLmMsCi0JZWxmY29kZS5oLCBsaWJiZmQtaW4uaCwgbGlua2VyLmMsIG1pcHNic2QuYywgbmxtMzItcHBjLmMsIG9hc3lzLmMsCi0JcmVsb2MuYywgc29tLmM6IERvbid0IHVzZSBgY29uc3QnIGluIGNvbWJpbmF0aW9uIHdpdGgKLQlgcmVsb2NfaG93dG9fdHlwZScuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotCSogZWNvZmYuYyAoZWNvZmZfdHlwZV90b19zdHJpbmcpOiBMb2NhbCB2YXJpYWJsZSBgYnVmZmVyMScgZG9lc24ndAotCW5lZWQgdG8gYmUgc3RhdGljLgotCi1XZWQgSmFuIDExIDE0OjM2OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBjb3JlIGR1bXAgaWYgYSBtdWx0aXBsZQotCWRlZmluaXRpb24gb2YgYW4gYWJzb2x1dGUgc3ltYm9sIGlzIGVuY291bnRlcmVkLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBJZ25vcmUKLQlyZWRlZmluaXRpb25zIG9mIGFuIGFic29sdXRlIHN5bWJvbCB0byB0aGUgc2FtZSB2YWx1ZS4KLQotTW9uIEphbiAgOSAxNTo1MTozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSXQncyByZWFzb25hYmxlIGZvciBubwotCWZsYWdzIHRvIGJlIHNldCwgc28gZG9uJ3QgaW5zaXN0IG90aGVyd2lzZS4KLQotRnJpIEphbiAgNiAxNjozOTo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvbid0IHNldCBCU0ZfR0xPQkFMIGZvciBhbgotCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQotV2VkIEphbiAgNCAxNDoxNDowNSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IE9ubHkgcmV0dXJuIHNlY3Rpb25zIHdoaWNoCi0JY29ycmVzcG9uZCB0byBzdWJzcGFjZXMuCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IERvbid0IGZvcmdldCB0byBidW1wIHRoZQotCXRvdGFsX3N1YnNwYWNlcyB3aGVuIHdyaXRpbmcgdGhlIHVubG9hZGFibGUgc3Vic3BhY2VzLgotCi1XZWQgRGVjIDI4IDIwOjU0OjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IFVzZSBTRUNfSEFTX0NPTlRFTlRTIHRvIGlkZW50aWZ5Ci0JYnNzLWxpa2Ugc2VjdGlvbnMuCi0JKHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShzb21fc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotVHVlIERlYyAyNyAxNDowMzo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNldHVwX3NlY3Rpb25zKTogVHVybiBvZmYgU0VDX0hBU19DT05URU5UUyBmb3IgYnNzLWxpa2UKLQlzZWN0aW9ucy4KLQotVHVlIERlYyAyMCAxNTozMDoxMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGJmZF9kZWJ1Z19zZWN0aW9uKTogRGVsZXRlZC4KLQkoY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4KTogUmV0dXJuIGFic29sdXRlIHNlY3Rpb24gZm9yIGRlYnVnCi0Jc3ltYm9sLgotCShjb2ZmX3dyaXRlX3N5bWJvbCk6IFNldCBCU0ZfREVCVUdHSU5HIGZvciBDX0ZJTEUgc3ltYm9scy4gIElmCi0JQlNGX0RFQlVHR0lORyBpcyBzZXQsIHNldCBzZWN0aW9uIHRvIE5fREVCVUcuCi0JKGNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sKTogVXNlIGFic29sdXRlIHNlY3Rpb24uCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBJbiBhc3NlcnRpb24sCi0JZm9yY2UgYWxsIHZhbHVlcyB0byB0aGUgc2FtZSB0eXBlLgotCi1UdWUgRGVjIDIwIDExOjExOjU4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaG93dG9fdGFibGUpOiBBbGwgcmVsb2NzIGdldCBhIHNwZWNpYWwgZnVuY3Rpb24uCi0JKHNwZWNpYWwpOiBOZXZlciBkbyBhbnl0aGluZyB3aGVuIGxpbmtpbmcgLXIuCi0KLVR1ZSBEZWMgMjAgMTM6NTg6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBpMzg2bGludXguYyAobGludXhfYWRkX29uZV9zeW1ib2wpOiBEb24ndCBkbyBhbnl0aGluZyBMaW51eAotCXNwZWNpZmljIGlmIHRoaXMgaXMgbm90IGEgTGludXggaGFzaCB0YWJsZS4gIEZyb20gRXJpYyBZb3VuZ2RhbGUKLQk8ZXJpY0BhaWIuY29tPi4KLQotCVBhdGNoZXMgZnJvbSBra29qaW1hQG1peC5vci5qcCAoS2F6dW1vdG8gS29qaW1hKToKLQkqIG1pcHNic2QuYyAobWlwc19ob3d0b190YWJsZV9leHQpOiBDaGFuZ2Ugc2l6ZXMgb2YgbWVtb3J5IHJlbG9jcwotCWFwcGx5IHRvIGZyb20gdHdvIGJ5dGVzIHRvIGZvdXIgYnl0ZXMuCi0JKiBNWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUi4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29ycmVjdCBhbmQgZXhwYW5kIHRoZQotCWxpc3Qgb2YgY2FzZXMgZm9yIHdoaWNoIHJlbG9jYXRpb24gbmVlZCBub3QgYmUgY29tcHV0ZWQuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLU1vbiBEZWMgMTkgMjM6MDk6MTYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9yZWFkX3N5bWV4dF9pbmZvKTogRGVsZXRlIGRvX2xvY2FscyBhbmQKLQlkb19nbG9iYWxzIGFyZ3VtZW50cywgYWx3YXlzIHJlYWQgc3ltYm9sIGV4dGVuc2lvbiBpbmZvcm1hdGlvbiBmb3IKLQlnbG9iYWxzIGFuZCBsb2NhbHMuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShlbGYzMl9ocHBhX3NpemVfc3R1YnMpOiBSZXdvcmsgdG8gb25seSByZWFkIHN5bWJvbCBleHRlbnNpb24KLQlpbmZvcm1hdGlvbiBvbmNlIGZvciBlYWNoIGlucHV0IGJmZC4gIDEwJSBpbXByb3ZlbWVudCBpbiBsaW5rZXIKLQlwZXJmb3JtYW5jZS4KLQotRnJpIERlYyAxNiAxMjoyODo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IENoZWNrCi0JYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuLCBvbmx5IGFmdGVyIGNoZWNraW5nIGZvciB0aGUgc2VjdGlvbiBpbgotCXRoZSBCRkQgYW5kIGFmdGVyIGNhbGxpbmcgdGhlIGJhY2tlbmQgcm91dGluZS4KLQotV2VkIERlYyAxNCAyMDoyMTo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogT25seSB1c2Ugc2VjdGlvbiBzeW1ib2xzIHdob3NlCi0JdmFsdWUgaXMgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBjaGVja2luZyBvdXRwdXRfb2Zmc2V0IHdoZW4KLQl1c2luZyBvdXRwdXRfc2VjdGlvbi4gIFdoZW4gY3JlYXRpbmcgYSBuZXcgc3ltYm9sLCBzZXQgdGhlIHZhbHVlCi0JdG8gMCwgc2luY2UgQkZEIHN5bWJvbCB2YWx1ZXMgYXJlIHNlY3Rpb24gcmVsYXRpdmUuCi0KLVR1ZSBEZWMgMTMgMTM6MzE6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjcHUtejhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBNYWtlIHo4MDAyIHRoZSBkZWZhdWx0Ci0JYXJjaGl0ZWN0dXJlLgotCi1GcmkgRGVjICA5IDEyOjQzOjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZQotCWFyY2hpdmUgaXMgbm90IGFuIEVMRiBvYmplY3QsIHBhc3MgdGhlIGFyY2hpdmUgdG8gdGhlIGFkZF9zeW1ib2xzCi0JZW50cnkgcG9pbnQgYXBwcm9wcmlhdGUgZm9yIHRoZSBmaXJzdCBvYmplY3QuICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWNAYWliLmNvbT4uCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykpOiBTaW1pbGFyIGNoYW5nZSBpZiB0aGUKLQlmaXJzdCBvYmplY3QgaXMgbm90IGFuIGEub3V0IG9iamVjdC4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgY29tcHV0ZQotCXJlbG9jYXRpb24gaW4gY2FzZXMgd2hlcmUgd2Ugd29uJ3QgdXNlIGl0LgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi1UaHUgRGVjICA4IDE0OjE5OjQxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHBjNTMyLW1hY2guYyAoTkFNRSk6IERlZmluZSB0byB1c2UgbnMzMmthb3V0IHByZWZpeC4KLQkqIG5zMzJrbmV0YnNkLmMgKE5BTUUpOiBEaXR0by4KLQkobnMzMmthb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lIHRvIHN0YW5kYXJkIGFvdXQtMzIKLQl2ZXJzaW9uLgotCi1GcmkgRGVjICAyIDEzOjU2OjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlYWRfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIG1pcHNfcmVsYXhfc2VjdGlvbi4KLQkobWlwc19yZWxheF9zZWN0aW9uKTogQ2FsbCBtaXBzX3JlYWRfcmVsb2NzLgotCShiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9tbmlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotV2VkIE5vdiAzMCAxNDoxMjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc2guYzogVXNlIF9iZmRfZHVtbXlfdGFyZ2V0IGluc3RlYWQgb2Ygbm9fYXJjaGl2ZS4KLQotVHVlIE5vdiAyOSAxNDowMDoxOSAxOTk0ICBKLlQuIENvbmtsaW4gIDxqdGNALnJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWZyZWVic2QqKTogVXNlIGkzODYtYnNkIGFzIGJmZF9uYW1lLgotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotZnJlZWJzZCopOiBVc2UgaTM4NmJzZCBhcyBteV9ob3N0LgotCi1Nb24gTm92IDI4IDE1OjM2OjA0IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL202OGstbmJzZC5tdCAoREVGQVVMVF9WRUNUT1IpOiBzZXQgdG8gbTY4a25ldGJzZF92ZWMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRhbmNpZXMuCi0JICAoQ0ZJTEVTKTogQWRkZWQgbTY4a25ldGJzZC5jLgotCSAgKEhGSUxFUyk6IEFkZGVkIG5ldGJzZC5oLgotCi1XZWQgTm92IDIzIDE5OjIxOjQxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc2guYyAoc2hsY29mZl92ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkobm9fYXJjaGl2ZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rLCBjb2ZmX3NldF9mbGFncyk6IEhhbmRsZQotCWxpdHRsZSBlbmRpYW4gU0guCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBzaGwuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNobGNvZmZfdmVjLgotCSogY29uZmlnL3NoLWNvZmYubXQgKFNFTEVDVF9WRUNTKTogSGFuZGxlIHNobF9jb2ZmX3ZlYy4KLQotV2VkIE5vdiAyMyAxMDo1MDoxMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBEbyBub3Qgc3VidHJhY3QgdGhlIHNlY3Rpb24ncyB2bWEgZnJvbQotCXRoZSByZWxvYydzIG9mZnNldCB3aGVuIHdyaXRpbmcgLm8ncy4gIEluc3RlYWQgYWRkIHRoZSBzZWN0aW9uJ3MKLQl2bWEgdG8gdGhlIHJlbG9jJ3Mgb2Zmc2V0IHdoZW4gd3JpdGluZyBhbiBleGVjdXRhYmxlIG9yIHNoYXJlZAotCWxpYnJhcnkuCi0KLVR1ZSBOb3YgMjIgMjM6MzQ6MzcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IERvIG5vdCBhZGQKLQlpbnB1dF9zZWN0aW9uLT52bWEgdG8gdGhlIHJlbG9jYXRpb24ncyBvZmZzZXQuCi0KLU1vbiBOb3YgMjEgMTI6Mzc6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzcmVjLmMgKHNyZWNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShzcmVjX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IERlZmluZS4KLQkoc3JlY19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKHNyZWNfdmVjLCBzeW1ib2xzcmVjX3ZlYyk6IFVzZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNyZWMpLgotCi1TYXQgTm92IDE5IDAzOjEwOjUxIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1XTg2LSotc29sYXJpcyopOiAgVXNlIHNvbGFyaXMyIHRvCi0JZW5hYmxlIGV4dHJhY3Rpb24gb2YgcHJvY2ZzIGluZm8gZnJvbSBjb3JlIGZpbGUgZm9yIEdEQi4KLQotVGh1IE5vdiAxNyAxNzozNzozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV90eXBlKTogQWRkIG5ldyB2YWx1ZSBCRkRfUkVMT0NfMTJfUENSRUwuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UaHUgTm92IDE3IDEzOjEyOjA4IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiZmQvZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlZCk6IFVzZSB0aGUKLQl2bWEgZnJvbSB0aGUgb3V0cHV0X3NlY3Rpb24gY29udGFpbmluZyAkZ2xvYmFsJCB3aGVuIGNvbXB1dGluZwotCWdsb2JhbF92bGF1ZS4KLQotVGh1IE5vdiAxNyAxNDoyOToxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogUm91bmQgdXAgdGhlIGFyY2hpdmUKLQloZWFkZXIgc2l6ZSBvZiB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZSB0byBhbiBldmVuIG51bWJlci4KLQotV2VkIE5vdiAxNiAxNjowODowNiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmM6IERlbGV0ZWQgc29tZSBjb2RlIHRoYXQgd2FzIGNvbW1lbnRlZCBvdXQgb3IgaW5zaWRlCi0JIiNpZiAwIi4KLQkoQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQotCSogY3B1LXNoLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBDb252ZXJ0IG5hbWUgdG8gbG93ZXJjYXNlLCBmb3IKLQljb25zaXN0ZW5jeSB3aXRoIG90aGVyIGFyY2hpdGVjdHVyZXMuCi0KLVNhdCBOb3YgMTIgMjM6NTA6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9leHBvcnRfc3ltYm9sKTogQWxzbyBleHBvcnQgc3ltYm9scyB3aGljaCBhcmUKLQlyZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBmaWxlLgotCi1GcmkgTm92IDExIDE0OjI5OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZAotCWV4cG9ydF9keW5hbWljIGFyZ3VtZW50LCBhbmQgaGFuZGxlIGl0LgotCShlbGZfZXhwb3J0X3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1GcmkgTm92IDExIDEwOjM1OjMzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHV4LWNvcmUuYyAoaHB1eF9jb3JlX3N0cnVjdCk6IERlbGV0ZSBoYW5kbGVzIGZvciB0aGUKLQlkYXRhLCByZWcgYW5kIHN0YWNrIHNlY3Rpb25zLiAgVGhleSdyZSBuZXZlciB1c2VkLiAgRGVsZXRlCi0JYWNjZXNzb3IgbWFjcm9zLgotCShtYWtlX2JmZF9hc2VjdGlvbik6IFVzZSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSBzaW5jZSBkZWJ1Z2dpbmcKLQljb3JlcyBmcm9tIGR5bmFtaWMgZXhlY3V0YWJsZXMgbWF5IGhhdmUgc2V2ZXJhbCBzZWN0aW9ucyB3aXRoIHRoZQotCXNhbWUgbG9naWNhbCBuYW1lLgotCShocHV4X2NvcmVfY29yZV9maWxlX3ApOiBEb24ndCBzYXZlIGhhbmRsZXMgdG8gZGF0YSwgcmVnIGFuZAotCXN0YWNrIHNlY3Rpb25zLiAgSGFuZGxlIENPUkVfVEVYVCwgQ09SRV9NTUYgYW5kIENPUkVfU0hNLgotCi1UdWUgTm92ICA4IDEzOjAzOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYm91dC5jIChjYWxsal9jYWxsYmFjayk6IEFkZCBuZXcgYXJndW1lbnQgc2hyaW5raW5nLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBIYW5kbGUgcmVsb2NzIGFnYWluc3Qgc2VjdGlvbiBzeW1ib2xzIGNvcnJlY3RseS4gIElmIG5vdAotCXNocmlua2luZywgZG9uJ3Qgc3VidHJhY3Qgb3V0IGRzdGlkeDsgdGhlIHN1YnRyYWN0aW9uIGlzIGFscmVhZHkKLQlpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLVN1biBOb3YgIDYgMTI6NTI6MDAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oOiBDb25kaXRpb25hbGx5IGluY2x1ZGUgPHNobC5oPiBhbmQgPGRsLmg+LgotCi1UaHUgTm92ICAzIDE4OjE5OjEzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBJbmNsdWRlIG02OGtuZXRic2Quby4KLQotCSogY29uZmlnL2kzODZsaW51eC5taCAoRVhUUkFMSUJTKTogSW5jbHVkZSAtbG0uCi0KLQlQYXRjaGVzIGZyb20gREogRGVsb3JpZToKLQkqIGNvZmYtZ28zMi5jOiBSZXBsYWNlbWVudCBmaWxlLCB1c2VzIGNvZmYtaTM4Ni5jIHdpdGggbWlub3IKLQljaGFuZ2VzLgotCSogY29mZi1pMzg2LmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogYWxsb3cgb3RoZXIgZmlsZXMgdG8gb3ZlcnJpZGUKLQl1bmRlcnNjb3JlIGFsc28KLQkqIG1ha2VmaWxlLmRvczogZGVsIGN0b3IubywgYWRkIGNvZmZsaW5rLm8gYW5kIGVsZjMyLm8KLQotCSogYW91dHguaCAoYWRqdXN0X29fbWFnaWMpOiBJZiB1c2VyIHNldCBkYXRhIHNlY3Rpb24gdm1hLCB1c2UgaXQKLQl0byBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgYnNzIHZtYS4gIFBhdGNoIGZyb20gVGFrYWRhIEhpcm9ha2ksCi0JaGlyb0Bpcy5zLnUtdG9reW8uYWMuanAuCi0JKG1hY2hpbmVfdHlwZSwgY2FzZSBiZmRfYXJjaF92YXgpOiBTZXQgKnVua25vd24gdG8gZmFsc2UuICBQYXRjaAotCWZyb20gSm9obiBEYXZpZCBBbmdsaW4gPGRhdmVAaGlhdWx5MS5oaWEubnJjLmNhPi4KLQotCSogY29uZmlndXJlLmluICh0Yik6IFJlbmFtZSBuczMya25ldGJzZF92ZWMgdG8gcGM1MzJuZXRic2RfdmVjLAotCXNpbmNlIHRoYXQncyB3aGF0IGl0J3MgY2FsbGVkLgotCi1XZWQgTm92ICAyIDE1OjI0OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChub3JtYWxpemUpOiBDaGFuZ2UgdG8gdGFrZSBhIEJGRCBhcyBhbiBhcmd1bWVudC4KLQlDaGFuZ2UgVk1TIHZlcnNpb24gdG8gdXNlIGJmZF9hbGxvYyByYXRoZXIgdGhhbiBtYWxsb2MsIHNvIHRoYXQgd2UKLQlkb24ndCBsb3NlIHRoZSBtZW1vcnkgZm9yZXZlci4KLQkoX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IENoZWNrIHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUKLQllbnRyeSB3aGljaCBpcyBub3QgYmVpbmcgZXh0ZW5kZWQsIGFuZCBjb3JyZWN0IGl0IGlmIGl0IGlzIHdyb25nLgotCVRoaXMgaXMgbmVjZXNzYXJ5IGluIGNhc2UgdGhlIGFyY2hpdmUgd2FzIGNvbnN0cnVjdGVkIGJ5IGFub3RoZXIKLQlwcm9ncmFtIHdoaWNoIHB1dCBhbiBlbnRyeSBpbiB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZSB3aGljaCB3ZQotCWRvbid0IHBsYW4gdG8gcHV0IGluIG91cnNlbHZlcy4gIEZyb20gampjQGpjbGFyay5jb20gKEphbWVzCi0JQ2xhcmspLgotCShiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUpOiBDaGVjayByZXR1cm4gdmFsdWUgb2Ygbm9ybWFsaXplLgotCi1Nb24gT2N0IDMxIDE0OjE5OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaHBwYS5jIChFTEYzMl9QQVJJU0NfU1hfU0laRSk6IERlZmluZS4KLQkoRUxGMzJfUEFSSVNDX1NYX0dFVCwgRUxGMzJfUEFSSVNDX1NYX1BVVCk6IERlZmluZS4KLQkoc3ltZXh0bl9lbnRyeSk6IERvbid0IGRlZmluZS4KLQkoc3ltZXh0X2NoYWluX3NpemUpOiBDaGFuZ2UgdHlwZSB0byBiZmRfc2l6ZV90eXBlLgotCShzeW1leHRuX2NvbnRlbnRzKTogQ2hhbmdlIHR5cGUgdG8gYmZkX2J5dGUgKi4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBVc2UKLQlFTEYzMl9QQVJJU0NfU1hfU0laRSBpbnN0ZWFkIG9mIHNpemVvZiAoc3ltZXh0X2VudHJ5UykuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zeW1leHQpOiBMaWtld2lzZS4gIEFsc28sIGNoYW5nZSB0eXBlIG9mIHNpemVwIHRvCi0JYmZkX3NpemVfdHlwZSAqLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogQ2FzdCBzeW1leHRuX2NvbnRlbnRzIGFzc2lnbm1lbnQgdG8KLQliZmRfYnl0ZSAqLiAgVXNlIEVMRjMyX1BBUklTQ19TWF9QVVQgaW5zdGVhZCBvZiBkaXJlY3QgYXNzaWdubWVudC4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKTogVXNlCi0JRUxGMzJfUEFSSVNDX1NYX1NJWkUgaW5zdGVhZCBvZiBzaXplb2YgKHN5bWV4dF9lbnRyeVMpLiAgVXNlCi0JRUxGMzJfUEFSSVNDX1NYX0dFVCBpbnNldGFkIG9mIGRpcmVjdCBhc3NpZ25tZW50LgotCShlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBDaGFuZ2UgdHlwZSBvZiBjb250ZW50cywgYW5kIGl0cwotCWFzc2lnbm1lbnQgY2FzdCwgdG8gYmZkX2J5dGUgKi4gIFVzZSBFTEYzMl9QQVJJU0NfU1hfU0laRSBpbnN0ZWFkCi0Jb2Ygc2l6ZW9mIChzeW1leHRuX2VudHJ5KS4gIFVzZSBzeW1leHRfZW50cnlTIGluc3RlYWQgb2YKLQlzeW1leHRuX2VudHJ5LiAgVXNlIEVMRjMyX1BBUklTQ19TWF9HRVQgaW5zdGVhZCBvZiBkaXJlY3QKLQlhc3NpZ25tZW50LgotCi0JKiBhcmNoaXZlLmMgKGJmZF9kb250X3RydW5jYXRlX2FybmFtZSk6IEFkZCB0aGUgYXIgcGFkZGluZwotCWNoYXJhY3RlciwgaWYgdGhlcmUgaXMgcm9vbSBmb3IgaXQsIGV2ZW4gaWYgdGhlIG5hbWUgaXMgdGhlCi0JbWF4aW11bSBsZW5ndGguCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBTb3J0IHRoZSBFTEYKLQloZWFkZXJzIGJ5IHNlY3Rpb24gYWRkcmVzcyB3aGVuIGFzc2lnbmluZyBmaWxlIHBvc2l0aW9ucy4KLQkoZWxmX3NvcnRfaGRycyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVN1biBPY3QgMzAgMTg6NTY6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ3JlYXRlIERUX0lOSVQKLQlhbmQgRFRfRklOSSBkeW5hbWljIGVudHJpZXMgYmFzZWQgb24gdGhlIGV4aXN0ZW5jZSBvZiBfaW5pdCBhbmQKLQlfZmluaSBzeW1ib2xzLCBub3Qgb24gdGhlIC5pbml0IGFuZCAuZmluaSBzZWN0aW9ucy4gIFRoaXMgaXMKLQljb21wYXRpYmxlIHdpdGggc29tZSBTVlI0IGxpbmtlcnMuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi1TYXQgT2N0IDI5IDEyOjE4OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBEb24ndCBtb3ZlIGEKLQlzeW1ib2wgd2l0aCBhIFBMVCBlbnRyeSBpbnRvIHRoZSAucGx0IHNlY3Rpb24gaWYgaXQgaXMgZGVmaW5lZCBpbgotCWEgcmVndWxhciBmaWxlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSXQncyBub3QgYW4KLQllcnJvciBpZiBhbiBlbXB0eSBhcmNoaXZlIGhhcyBubyBzeW1ib2wgdGFibGUuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IExpa2V3aXNlLgotCi1GcmkgT2N0IDI4IDEwOjA4OjQxIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotICAgICAgICBOZXRCU0QvbTY4ayBzdXBwb3J0LCBiYXNlZCBvbiB3b3JrIGJ5IG1pa2ViQHNub3cuZGF0YW1ldHJpY3MuY29tOiAKLQkqIGNvbmZpZy5iZmQgKG02OCotKi1uZXRic2QqKTogVXNlIG02OGstbmJzZCBhcyBiZmRfbmFtZS4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4a25ldGJzZF92ZWMpOiBBZGRlZC4KLQkqIHRhcmdldHMuYyAoYmZkX202OGtuZXRic2RfdmVjKTogQWRkZWQuCi0JKiBob3N0cy9tNjhrbmJzZC5oLCBjb25maWcvbTY4ay1uYnNkLm10LCBtNjhrbmV0YnNkLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUywgQ0ZJTEVTKTogQWRkIG02OGtuZXRic2QuYy4KLQotCW1pc2NlbGxhbmVvdXMgY2xlYW51cCByZXF1aXJlZCBieSBhbGwgbmV0YnNkIHRhcmdldHMsIGJhc2VkIG9uIHdvcmsgCi0JYnkgQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT46Ci0JKiBuZXRic2QuaCAoTl9NQUdJQywgTl9TRVRfTUFHSUMsIE5fR0VUTUFHSUMsIE5fR0VUTUFHSUMyLCBOX1RYVEFERFIsCi0JICBOX1RYVE9GRiwgTl9BTElHTiwgTl9EQVRBRERSLCBOX0RBVE9GRik6IFJlbW92ZWQuICBHZW5lcmljIGEub3V0Ci0JICBkZWZpbml0aW9ucyB3b3JrLgotCSogaTM4Nm5ic2QuYywgbnMzMmtuYnNkLmMsIHNwYXJjbmJzZC5jIChfX0xEUEdTWik6IFJlbW92ZWQuCi0JICAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFVzZSBOZXRCU0QncyBtYWdpYyBudW1iZXJzCi0KLVRodSBPY3QgMjcgMTY6NTk6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKTogQWRkIGZpZWxkIGR5bmluZHguCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogRG9uJ3QgZmluYWxpemUKLQl0aGUgLmR5bnN5bSwgLmR5bnN0ciBvciAuaGFzaCBzZWN0aW9ucyB1bnRpbCBhZnRlciB0aGUgYmFja2VuZAotCXNpemVfZHluYW1pY19zZWN0aW9ucyByb3V0aW5lLCBzbyB0aGF0IGl0IGNhbiBhZGQgZHluYW1pYyBzeW1ib2xzCi0JaWYgaXQgd2FudHMgdG8uCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IGRlZmluZSB0aGUKLQlzeW1ib2wgdG8gYmUgaW4gdGhlIC5wbHQgc2VjdGlvbiB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeQotCWlmIGl0IGlzIGEgZGVmaW5lZCBzeW1ib2wuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgYWxsb2NhdGUgc3BhY2UgZm9yIGEgZHluYW1pYyBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0Ci0Jc2VjdGlvbiwgc3RvcmluZyB0aGUgaW5kZXggaW4gdGhlIGR5bmluZHggZmllbGQgb2YgdGhlIEVMRiBzZWN0aW9uCi0JZGF0YS4gIEFkanVzdCB0aGUgb3RoZXIgZHluaW5keCBmaWVsZHMgdG8gYWNjb3VudCBmb3IgdGhpcy4KLQkoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmluZHgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogV2hlbiBjb3B5aW5nIGEgcmVsb2MgaW50byBhIHNoYXJlZAotCWxpYnJhcnksIHVzZSB0aGUgb3JpZ2luYWwgYWRkZW5kIGFzIGFwcHJvcHJpYXRlLiAgQ29udmVydCBhbgotCVJfU1BBUkNfMzIgcmVsb2MgaW50byBhbiBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jLiAgVXNlIHRoZSBkeW5hbWljCi0Jc3ltYm9sIGluZGV4IG9mIHRoZSBvdXRwdXQgc2VjdGlvbiwgbm90IHRoZSBub3JtYWwgc3ltYm9sIGluZGV4LgotCShlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IGRpZSBpZiBhIHNlY3Rpb24gZG9lcwotCW5vdCBleGlzdCB3aGVuIHNldHRpbmcgdGhlIHZhbHVlIG9mIHRoZSBkeW5hbWljIHRhZ3MuICBXcml0ZSBvdXQKLQlhIGR5bmFtaWMgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLgotCi1XZWQgT2N0IDI2IDAxOjE1OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBEb24ndCBib3RoZXIgdG8gcmVhZCBvciB3cml0ZQotCXRoZSByZWxvY3MgaWYgdGhlcmUgYXJlbid0IGFueS4KLQotVHVlIE9jdCAyNSAxMTo0NDozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgdGVraGV4Lm8uCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogSWYgU0VMRUNUX1ZFQ1MgaXMgbm90IGRlZmluZWQsCi0JaW5jbHVkZSB0ZWtoZXhfdmVjLgotCSogdGVraGV4LmMgKE5JQkJMRSwgSVNIRVgpOiBDYXN0IGFycmF5IGFyZ3VtZW50cyB0byB1bnNpZ25lZCBjaGFyLgotCShnZXR2YWx1ZSwgZ2V0c3ltLCBvdXQpOiBMaWtld2lzZS4KLQkoZmluZF9jaHVuayk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcy4KLQkoZmlyc3RfcGhhc2UpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHMuCi0JKHBhc3Nfb3Zlcik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYWRkcmVzcy4KLQkodGVraGV4X29iamVjdF9wKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzZWN0aW9uLgotCShtb3ZlX3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgZnJvbSBib29sZWFuIHRvIHZvaWQuCi0JKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB0ZGF0YSBhbmQKLQlsaXN0LgotCi0JKiBsaW5rZXIuYyAoZW51bSBsaW5rX2FjdGlvbik6IEFkZCBDSU5ELgotCShsaW5rX2FjdGlvbik6IENoYW5nZSBDT01NT05fUk9XXGluZHIgZnJvbSBNREVGIHRvIENSRUYuICBDaGFuZ2UKLQlJTkRSX1JPV1xjb21tb24gZnJvbSBNREVGIHRvIENJTkQuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSW4gQ1JFRiBjYXNlLCBoYW5kbGUgYW4KLQlleGlzdGluZyBzeW1ib2wgd2hpY2ggaXMgaW5kaXJlY3QgcmF0aGVyIHRoYW4gZGVmaW5lZC4gIEFkZCBuZXcKLQlDSU5EIGNhc2UuCi0KLU1vbiBPY3QgMjQgMTU6MzM6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JQ2hhbmdlIFMtcmVjb3JkIGJhY2tlbmQgdG8gdXNlIG11bHRpcGxlIHNlY3Rpb25zIHRvIGhhbmRsZSBnYXBzIGluCi0JZmlsZS4KLQkqIHNyZWMuYyAoc3JlY19kYXRhX2xpc3Rfc3RydWN0KTogTW92ZSBmaWVsZCBuZXh0IGZyb20gbGFzdCBwbGFjZQotCXRvIGZpcnN0LiAgQ2hhbmdlIHR5cGUgb2YgZGF0YSB0byBiZmRfYnl0ZSAqLgotCShzdHJ1Y3Qgc3JlY19zeW1ib2wpOiBEZWZpbmUuCi0JKHRkYXRhX3R5cGUpOiBSZW1vdmUgZG9uZV9zeW1ib2xfcmVhZCwgY291bnQsIHN0cmluZ3MsIHN5bWJvbF9pZHgsCi0Jc3RyaW5nX3NpemUsIHN0cmluZ19pZHguICBDaGFuZ2UgdHlwZSBvZiBzeW1ib2xzIHRvIHN0cnVjdAotCXNyZWNfc3ltYm9sICouICBBZGQgc3ltdGFpbCBhbmQgY3N5bWJvbHMuCi0JKGxvdywgaGlnaCk6IFJlbW92ZS4KLQkoc2l6ZV9zeW1ib2xzLCBmaWxsdXBfc3ltYm9scywgc2l6ZV9zcmVjLCBmaWxsdXApOiBSZW1vdmUuCi0JKHdoaXRlLCBza2lwd2hpdGUsIHBhc3Nfb3Zlciwgb2JqZWN0X3ApOiBSZW1vdmUuCi0JKHNyZWNfbWtvYmplY3QpOiBDYWxsIHNyZWNfaW5pdC4gIEFkanVzdCB0ZGF0YSBpbml0aWFsaXphdGlvbiBmb3IKLQlmaWVsZCBjaGFuZ2VzLgotCShzcmVjX2dldF9ieXRlLCBzcmVjX2JhZF9ieXRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNyZWNfbmV3X3N5bWJvbCwgc3JlY19zY2FuKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHNyZWNfb2JqZWN0X3ApOiBDaGFuZ2UgdHlwZSBvZiBiIHRvIGJmZF9ieXRlLiAgRXhwbGljaXRseSBzZXQKLQl3cm9uZ19mb3JtYXQgZXJyb3IuICBDYWxsIHNyZWNfbWtvYmplY3QgYW5kIHNyZWNfc2NhbiBpbnN0ZWFkIG9mCi0Jb2JqZWN0X3AuCi0JKHN5bWJvbHNyZWNfb2JqZWN0X3ApOiBMaWtld2lzZS4gIEFsc28sIGNoYW5nZSBiIHRvIGJlIG9ubHkgdHdvCi0JYnl0ZXMuCi0JKHNyZWNfcmVhZF9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cyk6IENhbGwgc3JlY19yZWFkX3NlY3Rpb24gcmF0aGVyIHRoYW4KLQlwYXNzX292ZXIuICBIYW5kbGUgemVybyBsZW5ndGggc2VjdGlvbiBjb3JyZWN0bHkuCi0JKHNldF9zZXRfYXJjaF9tYWNoKTogQ2hhbmdlIGZyb20gZnVuY3Rpb24gdG8gbWFjcm8uCi0JKHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGFuZ2UgZGF0YSB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX3JlY29yZCk6IENoYW5nZSBkYXRhLCBlbmQgYW5kIHNyYyB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX2hlYWRlcik6IENoYW5nZSBidWZmZXIgYW5kIGRzdCB0byBiZmRfYnl0ZSAqLgotCShzcmVjX3dyaXRlX3NlY3Rpb24pOiBDaGFuZ2UgbG9jYXRpb24gdG8gYmZkX2J5dGUgKi4KLQkoc3JlY193cml0ZV90ZXJtaW5hdG9yKTogQ2hhbmdlIGJ1ZmZlciB0byBiZmRfYnl0ZSAqLgotCShzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEb24ndCBjYWxsCi0Jc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cy4KLQkoc3JlY19nZXRfc3ltdGFiKTogUmV3cml0ZS4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogU2V0IHVkYXRhLmkgdG8gMCwgbm90IE5VTEwuCi0KLUZyaSBPY3QgMjEgMTY6NDM6MTMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0LmggKG1hY2hpbmVfdHlwZSk6IGFkZGVkIE1fNjhLX05FVEJTRCBhbmQgTV9TUEFSQ19ORVRCU0QuCi0JKiBpMzg2bmV0YnNkLmMsIG5zMzJrbmV0YnNkLmMsIHNwYXJjbmV0YnNkLmM6IHJlbW92ZWQgUkNTIElkJ3MuCi0JICBjaGFuZ2VkIGhvdyBQQUdFX1NJWkUgYW5kIFNFR01FTlRfU0laRSBhcmUgZGVmaW5lZCBzbyB0aGV5IGFyZQotCSAgY29uc2lzdGFudCB3aXRoIGVhY2ggb3RoZXIuCi0JKiBuZXRic2QuaCAoTl9IRUFERVJfSU5fVEVYVCwgVEVYVF9TVEFSVF9BRERSKTogTmV0QlNEIGZpdHMgaXRzCi0JICBoZWFkZXIgaW50byB0aGUgc3RhcnQgb2YgaXRzIHRleHQgc2VnbWVudC4KLQotRnJpIE9jdCAyMSAxNzoxMzowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfQVJDSElWRSk6IEFkZCBjYXNlIGZvcgotCV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZS4KLQkoYmZkX3RhcmdldCk6IEFkZCBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLgotCSogYXJjaGl2ZS5jIChfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTmV3Ci0JZnVuY3Rpb24uCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogUmVuYW1lZCBieSBhZGRpbmcgYSBsZWFkaW5nCi0JdW5kZXJzY29yZSwgYW5kIG1hZGUgZXh0ZXJuYWxseSB2aXNpYmxlLiAgQWRkZWQgdHJhaWxpbmdfc2xhc2gKLQlhcmd1bWVudCwgYW5kIHVzZWQgaXQgaW5zdGVhZCBvZiBlbGZfc3R5bGUuICBDaGFuZ2VkIHR5cGUgb2YKLQl0YWJsZW4gdG8gYmZkX3NpemVfdHlwZSAqLgotCShfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMpOiBVc2UgQkZEX1NFTkQgdG8gY2FsbAotCWNvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLiAgVXNlIHRoZSByZXR1cm5lZCBuYW1lLgotCSogbGliYmZkLWluLmggKF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWNsYXJlLgotCShfYmZkX25vYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlY2xhcmUuCi0JKF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogc29tLmMgKHNvbV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBhb3V0LXRhcmdldC5oIChNWV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOgotCURlZmluZS4KLQkqIGllZWUuYyAoaWVlZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpOiBEZWZpbmUuCi0JKiBvYXN5cy5jIChvYXN5c19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQotCUZpeCB0aGUgRUxGIGxpbmtlciB0byBub3QgcmVxdWlyZSBhbiBpbnRlcnByZXRlciBpZiBubyBkeW5hbWljCi0Jb2JqZWN0cyB3ZXJlIHNlZW4sIGV2ZW4gd2hlbiBsaW5raW5nIFBJQyBjb2RlLgotCSogbGliZWxmLmggKEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBmaWVsZCBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSBkeW5zdHIgaWYgaXQKLQlkb2Vzbid0IGFscmVhZHkgZXhpc3QuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IENyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIGJhc2VkIG9uCi0JZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIGZpZWxkLCBub3QgZHlub2JqIGZpZWxkLiAgRG9uJ3QgYm90aGVyIHRvCi0Jc2V0IGR5bm9iai4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBkeW5hbWljIHNlY3Rpb25zIHdlcmUKLQlhbHJlYWR5IGNyZWF0ZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgSWYgZHlub2JqIGlzIGFscmVhZHkgc2V0LCB1c2UKLQlpdDsgb3RoZXJ3aXNlLCBzZXQgaXQgdG8gdGhlIGJmZCBhcmd1bWVudC4gIERvbid0IGluaXRpYWxpemUKLQlkeW5zeW1jb3VudC4gIE9ubHkgY3JlYXRlIGR5bnN0ciBpZiBpdCBkb2VzIG5vdCBleGlzdC4gIFNldAotCWR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCB0byB0cnVlLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFNraXAgbW9zdCBvZiB0aGlzIGZ1bmN0aW9uCi0JaWYgbm8gZHluYW1pYyBvYmplY3RzIHdlcmUgc2Vlbi4KLQkoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIGhhcyB0aGUKLQlFTEZfTElOS19IQVNIX05FRURTX1BMVCBmbGFnIHNldCwgbGV0IHRoZSBiYWNrZW5kIGFkanVzdCBpdC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2hhbmdlIG1vc3QgZGVjaXNpb25zIGJhc2VkIG9uIGR5bm9iaiB0bwotCWNoZWNrIGR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCBpbnN0ZWFkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogT25seSBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGlmIGEgZHluYW1pYwotCW9iamVjdCB3YXMgc2Vlbi4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IEluaXRpYWxpemUgbmV3IGZpZWxkCi0JZHluYW1pY19zZWN0aW9uc19jcmVhdGVkLiAgU2V0IGR5bnN5bWNvdW50IHRvIDEsIG5vdCAwLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwKLQllbGZfaTM4Nl9jcmVhdGVfZ290X3NlY3Rpb24gcmF0aGVyIHRoYW4gY3JlYXRpbmcgdGhlIC5nb3QgYW5kCi0JLmdvdC5wbHQgc2VjdGlvbnMuCi0JKGVsZl9pMzg2X2NyZWF0ZV9nb3Rfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEp1c3QgY2FsbCBlbGZfaTM4Nl9jcmVhdGVfZ290X3NlY3Rpb24gaWYKLQlhIEdPVCB0YWJsZSBpcyBuZWVkZWQsIG5vdCBiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQlPbmx5IGNyZWF0ZSB0aGUgLnJlbC5nb3Qgc2VjdGlvbiwgYW5kIG9ubHkgbWFrZSBzcGFjZSBmb3IgYSByZWxvYywKLQlmb3IgYSBnbG9iYWwgc3ltYm9sIG9yIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QuICBGb3IgYQotCVJfMzg2X1BMVDMyIHJlbG9jLCBqdXN0IHNldCB0aGUJRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgZmxhZy4KLQkoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogUmV3b3JrIGluaXRpYWwgYXNzZXJ0aW9uIHRvCi0JcGVybWl0IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIG5vbiBkeW5hbWljIHN5bWJvbHMuICBDcmVhdGUgYQotCXByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5IGZvciBzdWNoIHN5bWJvbHMuICBCdXQsIGlmIG5vCi0JZHluYW1pYyBvYmplY3RzIHdlcmUgc2VlbiwgbmV2ZXIgY3JlYXRlIGEgUExUIGVudHJ5LgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBubyBkeW5hbWljIG9iamVjdHMgd2VyZSBzZWVuLAotCXNraXAgbW9zdCBvZiB0aGlzIGZ1bmN0aW9uLCBhbmQgZm9yY2UgdGhlIHNpemUgb2YgdGhlIC5yZWwuZ290Ci0Jc2VjdGlvbiB0byB6ZXJvLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIGEgUl8zODZfR09UMzIgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbAotCXN5bWJvbCB3aGVuIG5vIGR5bmFtaWMgb2JqZWN0IHdhcyBzZWVuLCBpbml0aWFsaXplIHRoZSBjb250ZW50cyBvZgotCXRoZSAuZ290IHNlY3Rpb24uICBGb3IgYSBSXzM4Nl9HT1QzMiBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCBvbmx5Ci0JY3JlYXRlIGEgUl8zODZfUkVMQVRJVkUgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdC4KLQlUcmVhdCBhIFJfMzg2X1BMVDMyIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgZm9yIHdoaWNoIHdlIGRpZCBub3QKLQljcmVhdGUgYSBQTFQgZW50cnkgYXMgYSBSXzM4Nl9QQzMyIHJlbG9jLgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IE9ubHkgZmlkZGxlIHdpdGggdGhlIGR5bmFtaWMKLQllbnRyaWVzIGFuZCB0aGUgUExUIGlmIHdlIHNhdyBhIGR5bmFtaWMgb2JqZWN0LgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogRml4IFJfU1BBUkNfUEMyMiBieQotCXNldHRpbmcgcmlnaHRzaGlmdCB0byAxMC4gIEZpeCBSX1NQQVJDX1dQTFQyMCBieSBzZXR0aW5nCi0JcmlnaHRzaGlmdCB0byAyLCBzaXplIHRvIDIsIGJpdHNpemUgdG8gMzAsIGFuZCBkc3RfbWFzayB0bwotCTB4M2ZmZmZmZmYuCi0JKGVsZjMyX3NwYXJjX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHRoZSBzaXplIG9mIHRoZQotCS5wbHQgc2VjdGlvbi4gIENhbGwgZWxmMzJfc3BhcmNfY3JlYXRlX2dvdF9zZWN0aW9uIHJhdGhlciB0aGFuCi0JY3JlYXRpbmcgdGhlIC5nb3Qgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogQ2FsbCBlbGYzMl9zcGFyY19jcmVhdGVfZ290X3NlY3Rpb24gaWYKLQlhIEdPVCB0YWJsZSBpcyBuZWVkZWQsIG5vdCBiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQlPbmx5IGNyZWF0ZSB0aGUgLnJlbGEuZ290IHNlY3Rpb24sIGFuZCBvbmx5IG1ha2Ugc3BhY2UgZm9yIGEKLQlyZWxvYywgZm9yIGEgZ2xvYmFsIHN5bWJvbCBvciB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LgotCVNldCB0aGUgYWxpZ25tZW50IG9mIHRoZSAucmVsYS5nb3Qgc2VjdGlvbiB0byAyLiAgRm9yIGEKLQlSX1NQQVJDX1dQTFQzMCByZWxvYywganVzdCBzZXQgdGhlIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUIGZsYWcuCi0JKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFJld29yayBpbml0aWFsIGFzc2VydGlvbiB0bwotCXBlcm1pdCBFTEZfTElOS19IQVNIX05FRFNfUExUIG5vbiBkeW5hbWljIHN5bWJvbHMuICBDcmVhdGUgYQotCXByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGZvciBzdWNoIHN5bWJvbHMuICBCdXQsIGlmIG5vIGR5bmFtaWMKLQlvYmplY3RzIHdlcmUgc2VlbiwgbmV2ZXIgY3JlYXRlIGEgUExUIGVudHJ5LiAgSW5pdGlhbGl6ZSB0aGUgc2l6ZQotCW9mIHRoZSAucGx0IHNlY3Rpb24uCi0JKGVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IElmIG5vIGR5bmFtaWMgb2JqZWN0cyB3ZXJlCi0Jc2Vlbiwgc2tpcCBtb3N0IG9mIHRoaXMgZnVuY3Rpb24sIGFuZCBmb3JjZSB0aGUgc2l6ZSBvZiB0aGUKLQkucmVsYS5nb3Qgc2VjdGlvbiB0byB6ZXJvLiAgU3RyaXAgZW1wdHkgcmVsb2Mgc2VjdGlvbnMsIGFuZCBzdHJpcAotCWFuIGVtcHR5IC5wbHQgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IEZvciBhIEdPVCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsCi0Jc3ltYm9sIHdoZW4gbm8gZHluYW1pYyBvYmplY3Qgd2FzIHNlZW4sIGluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mCi0JdGhlIC5nb3Qgc2VjdGlvbi4gIEZvciBhIEdPVCByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCBvbmx5Ci0JY3JlYXRlIGEgUl9TUEFSQ19SRUxBVElWRSByZWxvYyB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LgotCVRyZWF0IGEgUl9TUEFSQ19XUExUMzAgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCBmb3Igd2hpY2ggd2UgZGlkIG5vdAotCWNyZWF0ZSBhIFBMVCBlbnRyeSBhcyBhIFJfU1BBUkNfV0RJU1AzMCByZWxvYy4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGZpZGRsZSB3aXRoIHRoZQotCWR5bmFtaWMgZW50cmllcyBhbmQgdGhlIFBMVCBpZiB3ZSBzYXcgYSBkeW5hbWljIG9iamVjdC4KLQotVGh1IE9jdCAyMCAxMzoyODo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3Qgd29ycnkgYWJvdXQgc2VjdGlvbiBzeW1ib2xzCi0JaW4gYSBzZWN0aW9uIG5vdCBvd25lZCBieSBhbnkgQkZELgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogU2VwYXJhdGUgb3V0IGxvb3Agd2hpY2ggY2FsbHMKLQliYWNrZW5kIHJvdXRpbmUuICBDaGVjayBiZmRfc2VjdGlvbiBhbmQgY2FsbCB0aGUgYmFja2VuZCByb3V0aW5lCi0JZXZlbiBmb3IgYSBzZWN0aW9uIG5vdCBvd25lZCBieSBhbnkgQkZELgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBIYW5kbGUKLQkuYWNvbW1vbiBzZWN0aW9uLgotCi1XZWQgT2N0IDE5IDEzOjI4OjI5IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogTWFrZSBuYW1lcyBmb3Igc2VjdGlvbiBudW1iZXIgYW5kCi0Jc3RvcmFnZSBjbGFzcyBzbGlnaHRseSBtb3JlIHZlcmJvc2UuICBJdCdzIG5vdCBjbGVhciBob3cgbWFueQotCWNoYXJhY3RlcnMgSSBjYW4ganVzdGlmeSB1c2luZyB1cCwgYnV0IGJlZm9yZSB0aGlzIGNoYW5nZSB0aGV5Ci0JYm90aCB3ZXJlIGFiYnJldmlhdGVkICJzYyIgd2hpY2ggaXMgKElNSE8pIGNsZWFybHkgdW5hY2NlcHRhYmxlLgotCi1XZWQgT2N0IDE5IDAxOjI2OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldCB0aGUgYmFzZSBmaWxlCi0JcG9zaXRpb24gZnJvbSB0aGUgbG93ZXN0IHNlY3Rpb24gVk1BLCBub3QgdGhlIHN0YXJ0IGFkZHJlc3MuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogRG9uJ3QgcmV0dXJuIGFuIGVycm9yCi0JaWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IExpa2V3aXNlLgotCi1UdWUgT2N0IDE4IDEyOjU2OjQzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBPbmx5IGNvcHkKLQlzdWJmb3JtYXQgdG8gYW5vdGhlciBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciBmaWxlLgotCi0JKiBiaW5hcnkuYzogTmV3IGZpbGUgZm9yIHJhdyBiaW5hcnkgb3V0cHV0IGZvcm1hdC4KLQkqIE1ha2VmaWxlLmluIChCRkRfTElCUyk6IEFkZCBiaW5hcnkuby4KLQkoQ0ZJTEVTKTogQWRkIGJpbmFyeS5jLgotCSogdGFyZ2V0cy5jIChiaW5hcnlfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBJbmNsdWRlIGJpbmFyeV92ZWMuCi0KLQkqIHNyZWMuYyAodGRhdGFfdHlwZSk6IEFkZCBmaWVsZCB0YWlsLgotCShzcmVjX21rb2JqZWN0KTogSW5pdGlhbGl6ZSB0YWlsLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogU29ydCBTIHJlY29yZCBsaXN0IGJ5IGFkZHJlc3MuCi0KLU1vbiBPY3QgMTcgMTE6Mzg6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IFNvcnQgdGhlIHN5bWJvbHMgaW50byBhIG5ldyBhcnJheSwKLQlyYXRoZXIgdGhhbiBtZXNzaW5nIHdpdGggRWxmX1N5bV9FeHRyYS4gIFN0b3JlIHRoZSBzeW1ib2wgaW5kZXggaW4KLQl0aGUgdWRhdGEuaSBmaWVsZC4KLQkoc3dhcF9vdXRfc3ltcyk6IFVzZSBvdXRib3VuZF9zeW1zIGFzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhcyBhbgotCWFycmF5LiAgRG9uJ3Qgd29ycnkgYWJvdXQgZWxmX3N5bV9udW0uCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9zeW1fZXh0cmEpOiBEb24ndCBkZWZpbmUuCi0JKEVsZl9TeW1fRXh0cmEpOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogUmVtb3ZlIHN5bV9leHRyYSBmaWVsZC4KLQkoZWxmX3N5bV9leHRyYSk6IERvbid0IGRlZmluZS4KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBVc2UKLQl1ZGF0YS5pIHJhdGhlciB0aGFuIGVsZl9zeW1fZXh0cmEgYXJyYXkuCi0KLQkqIHN5bXMuYyAoYXN5bWJvbCk6IENoYW5nZSB1ZGF0YSBmaWVsZCBpbnRvIGEgdW5pb24uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkpOiBVc2UgdWRhdGEucCByYXRoZXIKLQl0aGFuIGp1c3QgdWRhdGEuCi0JKiBib3V0LmMgKHBlcmZvcm1fc2xpcCk6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IExpa2V3aXNlLgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCSogcmVsb2MxNi5jIChiZmRfcGVyZm9ybV9zbGlwKTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKGZpbGx1cF9zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChnZXRfaW5kZXgpOiBVc2UgdWRhdGEuaSByYXRoZXIgdGhhbiBqdXN0IHVkYXRhLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChzZXRfaW5kZXgpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9zeW1ib2xfaW5mbyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IExpa2V3aXNlLgotCSogbGliZWNvZmYuaCAoZWNvZmZfZ2V0X3N5bV9pbmRleCwgZWNvZmZfc2V0X3N5bV9pbmRleCk6IExpa2V3aXNlLgotCSogc29tLmMgKGNvbXBhcmVfc3ltcyk6IExpa2V3aXNlLgotCShzb21fcHJlcF9mb3JfZml4dXBzKTogTGlrZXdpc2UuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBMaWtld2lzZS4KLQotCVVzZSBhIGhhc2ggdGFibGUgd2hlbiB3cml0aW5nIG91dCBFTEYgc3ltYm9sIG5hbWVzLgotCSogZWxmY29kZS5oIChlbGZfc3RyaW5ndGFiX2luaXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfbmV3X3N0cnRhYiwgYmZkX2FkZF90b19zdHJ0YWIsIGJmZF9hZGRfMl90b19zdHJ0YWIpOiBSZW1vdmUuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzIHRvIHVzZSBlbGZfc3RyaW5ndGFiX2luaXQgb3IKLQlfYmZkX3N0cmluZ3RhYl9hZGQsIGFuZCBnZXQgc3RyaW5ndGFiIGxlbmd0aHMgdXNpbmcKLQlfYmZkX3N0cmluZ3RhYl9zaXplLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IENoYW5nZSBpZ25vcmVkIGFyZ3VtZW50IHRvIHBvaW50ZXIgdG8KLQlib29sZWFuLCBhbmQgc2V0IHRoZSBib29sZWFuIHRvIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJzLiAgSWYgYW4KLQllcnJvciBoYXMgYWxyZWFkeSBvY2N1cnJlZCwgZG9uJ3QgZG8gYW55dGhpbmcuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBKdXN0IHNldCBzaF9zaXplLCBub3QgY29udGVudHMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBQYXNzIHRoZSBhZGRyZXNzIG9mIGEKLQlib29sZWFuIHRvIGVsZl9mYWtlX3NlY3Rpb25zLiAgUGFzcyB0aGUgYWRkcmVzcyBvZiBhCi0JYmZkX3N0cnRhYl9oYXNoIHRvIHN3YXBfb3V0X3N5bXMuICBXcml0ZSBvdXQgdGhlIC5zdHJ0YWIgc2VjdGlvbi4KLQkocHJlcF9oZWFkZXJzKTogQ2hhbmdlIHNoc3RydGFiIHRvIGJmZF9zdHJ0YWJfaGFzaC4KLQkoc3dhcF9vdXRfc3ltcyk6IFRha2UgYSBwb2ludGVyIHRvIGEgYmZkX3N0cnRhYl9oYXNoIGFzIGFuCi0JYXJndW1lbnQuICBTZXQgaXQgdG8gdGhlIHN5bWJvbCBuYW1lcy4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24KLQloZWFkZXIgbmFtZXMgdXNpbmcgX2JmZF9zdHJpbmd0YWJfZW1pdC4KLQkoZWxmX2RlYnVnX3NlY3Rpb24pOiBSZW1vdmUgZmlyc3QgYXJndW1lbnQ7IGdldCB0aGUgc2VjdGlvbiBuYW1lCi0JdmlhIHRoZSBiZmRfc2VjdGlvbiBwb2ludGVyLiAgQ2hhbmdlIGNhbGxlci4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogV3JpdGUgb3V0IHRoZSBzeW1ib2wgbmFtZXMgdXNpbmcKLQlfYmZkX3N0cmluZ3RhYl9lbWl0LiAgTGlrZXdpc2UgZm9yIHRoZSAuZHluc3RyIHNlY3Rpb24gY29udGVudHMuCi0JRnJlZSB0aGUgc3ltYm9sIG5hbWVzIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBSZW1vdmUgdGhlIGxhc3QgYXJndW1lbnQsIG91dHB1dF9uYW1lcywKLQlmcm9tIHJlbG9jYXRlX3NlY3Rpb24uICBTYXZlIHRoZSBvbGQgc3ltYm9sIGNvbnRlbnRzIGJlZm9yZQotCWNhbGxpbmcgZWxmX2xpbmtfb3V0cHV0X3N5bSwgYW5kIHJlc3RvcmUgdGhlbSBhZnRlcndhcmQuCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBDaGFuZ2UgZHluc3RyIGZpZWxkIHRvCi0Jc3RydWN0IGJmZF9zdHJ0YWJfaGFzaC4KLQkoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgbGFzdCBhcmd1bWVudCwgb3V0cHV0X25hbWVzLAotCWZyb20gZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBmaWVsZC4KLQkoc3RydWN0IHN0cnRhYik6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBDaGFuZ2Ugc3RydGFiX3B0ciBmaWVsZCB0byBzdHJ1Y3QKLQliZmRfc3RydGFiX2hhc2guCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBsYXN0Ci0JYXJndW1lbnQsIG91dHB1dF9uYW1lcy4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIGxpYmJmZC1pbi5oIChERUZBVUxUX1NUUklOR19TUEFDRV9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCShiZmRfYWRkX3RvX3N0cmluZ190YWJsZSk6IERvbid0IGRlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5jIChiZmRfYWRkX3RvX3N0cmluZ190YWJsZSk6IFJlbW92ZS4KLQotCSogZWxmY29kZS5oIChlbGZfc3dhcF9zaGRyX2luKTogVXNlIGJmZF9zZWN0aW9uLCBub3QgcmF3ZGF0YS4KLQlDbGVhciBjb250ZW50cyBmaWVsZC4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSW4gU0hUX1NUUlRBQiBjYXNlLCBjaGVjayBiZmRfc2VjdGlvbiwKLQlub3QgcmF3ZGF0YS4gIERvbid0IHNldCByYXdkYXRhIGlmIGVfc2hzdHJuZHguICBVc2UgYmZkX3NlY3Rpb24KLQlyYXRoZXIgdGhhbiByYXdkYXRhIGluIGNvbW1lbnRlZCBvdXQgY29kZS4gIEluIFNIVF9SRUxbQV0gY2FzZSwKLQlkb24ndCBib3RoZXIgdG8gY2hlY2sgZWxmX3NlY3Rpb25fZGF0YSBvZiBzZWN0aW9uIHJldHVybmVkIGJ5Ci0Jc2VjdGlvbl9mcm9tX2VsZl9pbmRleC4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBTZXQgYmZkX3NlY3Rpb24sIG5vdCByYXdkYXRhLiAgRG9uJ3Qgc2V0Ci0Jc2l6ZS4KLQkoZWxmX21hcF9zeW1ib2xzKTogRG9uJ3Qgc2V0IGVsZl9udW1fc2VjdGlvbl9zeW1zLiAgRG9uJ3QgY3JlYXRlCi0Jc2VjdGlvbiBzeW1ib2xzIHRoYXQgYWxyZWFkeSBleGlzdC4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24pOiBVc2UgYmZkX3NlY3Rpb24sIG5vdCByYXdkYXRhLgotCShzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogSnVzdCBjaGVjayBiZmRfc2VjdGlvbiBmaWVsZC4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfZGVidWdfc2VjdGlvbik6IERvbid0IHByaW50IHJhd2RhdGEsIGNvbnRlbnRzLCBvciBzaXplLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCBlcnJvciBvdXQgaWYKLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4IHJldHVybnMgTlVMTC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogQ2hlY2sgcmV0dXJuIHZhbHVlIGZyb20KLQlzZWN0aW9uX2Zyb21fZWxmX2luZGV4IGFnYWluc3QgTlVMTCwgbm90IGJmZF9pc19hYnNfc2VjdGlvbi4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgY2hlY2sgc2VjdGlvbl9mcm9tX2VsZl9pbmRleCByZXR1cm4KLQl2YWx1ZS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbW92ZSBudW1fc2VjdGlvbl9zeW1zIGZpZWxkLgotCShlbGZfbnVtX3NlY3Rpb25fc3ltcyk6IERvbid0IGRlZmluZS4KLQkqIGVsZi5jIChlbGZfZ2V0X3N0cl9zZWN0aW9uKTogU3RvcmUgc2VjdGlvbiBjb250ZW50cyBpbiBjb250ZW50cwotCWZpZWxkIHJhdGhlciB0aGFuIHJhd2RhdGEgZmllbGQuCi0JKGVsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbik6IExpa2V3aXNlLgotCShfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyKTogU3RvcmUgQkZEIHNlY3Rpb24gcG9pbnRlciBpbgotCWJmZF9zZWN0aW9uIGZpZWxkIHJhdGhlciB0aGFuIHJhd2RhdGEgZmllbGQuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IFVzZSBiZmRfc2VjdGlvbgotCXJhdGhlciB0aGFuIHJhd2RhdGEuCi0JKGVsZjMyX2hwcGFfc2l6ZV9zdHVicyk6IExpa2V3aXNlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBEb24ndCBzZXQKLQlzeW1leHRuX2hkci0+c2l6ZTsganVzdCB1c2Ugc2hfc2l6ZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFVzZSBiZmRfc2VjdGlvbgotCXJhdGhlcm4gdGhhbiByYXdkYXRhLgotCShtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogUmVtb3ZlIHJhd2RhdGEgY2hlY2suCi0KLQkqIHNyZWMuYyAocGFzc19vdmVyKTogU2V0IHRoZSBzdGFydCBhZGRyZXNzIGZvciBTNywgUzggb3IgUzkuCi0KLUZyaSBPY3QgMTQgMTk6MTU6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogVXBkYXRlZCB0byAyLjUuCi0KLUZyaSBPY3QgMTQgMTE6MDc6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX3NjYW5fdm1hKTogQ2FzdCBlbmQgdG8gYmUgbm9uIGNvbnN0IGJlZm9yZSBwYXNzaW5nIGl0Ci0JdG8gc3RydG91bC4KLQotVGh1IE9jdCAxMyAxNDo0MDo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jIChiZmRfc2Nhbl92bWEpOiBQYXNzIGVuZCBhcmd1bWVudCBvbiB0byBzdHJ0b3VsLgotCi1XZWQgT2N0IDEyIDE2OjQ2OjQzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9wbmNscy5jIChiZmRfcmVhbGxvYyk6IERlbGV0ZWQsIHNpbmNlIGl0J3MgYnJva2VuIGFuZCBmaXhpbmcgaXQKLQl3b3VsZCBtYWtlIGl0IHNsb3cuICBCZXNpZGVzLCBpdCBpc24ndCB1c2VkIG11Y2guCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IEFsd2F5cyBhbGxvY2F0ZSBuZXcgc3RvcmFnZSBmb3IgdGhlCi0Jc3ltYm9sIHRhYmxlLgotCi1XZWQgT2N0IDEyIDExOjU0OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogTWFyayBsb2NhbCBzdFByb2MsIHN0TGFiZWwgb3IKLQlzdGFicyBzeW1ib2xzIGFzIEJTRl9ERUJVR0dJTkcuCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogTWFrZQotCXN0cjEgYW5kIHN0cjIgY29uc3QgcG9pbnRlcnMuCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogVXNlIHRvcCBsZXZlbCBpbnN0YWxsLnNoIHNjcmlwdC4KLQkqIGNvbmZpZy9SRUFETUUgKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvZGVsdGE4OC5taCAoSU5TVEFMTCk6IFJlbW92ZS4KLQkqIGNvbmZpZy9pMzg2djQubWggKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDQubWggKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvaXJpeDUubWggKElOU1RBTEwpOiBSZW1vdmUuCi0JKiBjb25maWcvbmNydDMwMDAubWggKElOU1RBTEwpOiBSZW1vdmUuCi0KLVR1ZSBPY3QgMTEgMTM6NTc6NTYgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljQGFuZGFudGUuYWliLmNvbSkKLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBNYWtlIHN1cmUgdGhhdCBhIHN5bWJvbAotCXdpdGggYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IG9yIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUKLQllbnRyeSBpcyBhZGRlZCB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWYgYSBzeW1ib2wgaGFzCi0JYWxyZWFkeSBnb3R0ZW4gYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSwgY2hhbmdlIHRoZQotCWRlZmluaXRpb24gdG8gdGhlIFBMVCBlbnRyeS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCi1UdWUgT2N0IDExIDE3OjEyOjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbHlueC1jb3JlLmMgKGx5bnhfY29yZV9maWxlX3ApOiBTUEFSQyBMeW54IGFwcGVhcnMgdG8gc3RhcnQKLQlkdW1waW5nIHRoZSAuZGF0YSBzZWN0aW9uIGluIGEgY29yZSBmaWxlIGF0IGEgcGFnZSBib3VuZGFyeS4KLQotTW9uIE9jdCAxMCAxNjoyNDo0NCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IENhc3QgYXJndW1lbnQgdG8gYmZkX2hfcHV0XzMyCi0JdG8gY29ycmVjdCB0eXBlLgotCShjb2ZmX3JlYWRfc3RyaW5nX3RhYmxlKTogQ2FzdCBhcmd1bWVudCB0byBiZmRfaF9nZXRfMzIgdG8gY29ycmVjdAotCXR5cGUuCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBDYXN0IGFyZ3VtZW50IHRvCi0JYmZkX2VsZl9oYXNoIHRvIGNvcnJlY3QgdHlwZS4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogVGhlIFBDMTAsIFBDMjIsIGFuZAotCVdQTFQzMCByZWxvY2F0aW9ucyBhcmUgUEMtcmVsYXRpdmUuCi0KLVRodSBPY3QgIDYgMTI6NTc6MjYgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogYW91dHguaCAoYWRqdXN0X29fbWFnaWMpOiBDb3JyZWN0bHkgaW5pdGlhbGl6ZSB2bWEgaWYgdGhlIHZtYSBvZgotCXRoZSB0ZXh0IHNlY3Rpb24gd2FzIHVzZXItZGVmaW5lZC4KLQotV2VkIE9jdCAgNSAxNDo0MjoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGFyY2hpdmUuYyAoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogU1ZSNCB1c2VzIHNsYXNoCi0JbmV3bGluZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUsIG5vdCBqdXN0IG5ld2xpbmUuCi0KLVR1ZSBPY3QgIDQgMTE6MjM6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50Ci0JcG93ZXIgdG8gNCwgcmF0aGVyIHRoYW4gdXNpbmcgYWxpZ25fcG93ZXJfbWluLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEb24ndCB1c2UgYWxpZ25fcG93ZXJfbWluOwotCXVzZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgaW5zdGVhZC4gIEZvcmNlIHRoZSAuc3RhYgotCWFuZCAuc3RhYnN0ciBzZWN0aW9ucyB0byBiZSBhbGlnbmVkIHRvIG5vIG1vcmUgdGhhbiAyLiAgUmVtb3ZlCi0JQ09GRl9TUEFSQyBzcGVjaWFsIGNhc2VzLgotCSogY29mZi1hMjlrLmM6IERlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIuCi0JKiBjb2ZmLWFwb2xsby5jLCBjb2ZmLWdvMzIuYywgY29mZi1oODMwMC5jOiBMaWtld2lzZS4KLQkqIGNvZmYtaDg1MDAuYywgY29mZi1pMzg2LmMsIGNvZmYtaTk2MC5jLCBjb2ZmLW02OGsuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLW04OGsuYywgY29mZi1yczYwMDAuYywgY29mZi1zaC5jLCBjb2ZmLXNwYXJjLmM6IExpa2V3aXNlLgotCSogY29mZi13ZTMyay5jLCBjb2ZmLXo4ay5jOiBMaWtld2lzZS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgJHtjb25maWdfc2hlbGx9IHdoZW4gcnVubmluZyBjb25maWcuYmZkLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgYSBsb25nCi0JZmlsZW5hbWUgaWYgdGhlIG9mZnNldCBmaWVsZCBpcyB6ZXJvLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBJZiB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbAotCXdhcyBub3Qgc2V0LCB1c2UgYSBzZW5zaWJsZSBkZWZhdWx0IHJhdGhlciB0aGFuIHplcm8uCi0KLU1vbiBPY3QgIDMgMTY6MDQ6MjkgMTk5NCAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBvcG5jbHMuYyAoYmZkX2Nsb3NlKTogSG9ub3IgdW1hc2sgd2hlbiBzZXR0aW5nIGV4ZWN1dGlvbiBiaXRzLgotCShiZmRfY2xvc2VfYWxsX2RvbmUpOiBMaWtld2lzZS4KLQotTW9uIE9jdCAgMyAwNDo0MTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogIFNldCBTRUNfSEFTX0NPTlRFTlRTIGZsYWcKLQlmb3IgLnN0YWNrIGFuZCAubGRpbmZvIHNlY3Rpb25zLiBDYXN0IGNvcmVkYXRhLmNfdGFiIHRvIGEKLQlmaWxlX3B0ciB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIGdjYy4KLQotRnJpIFNlcCAzMCAxMzoxMTozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogUmVtb3ZlIGFzc2VydGlvbiB3aGVuIGEgbm9uCi0gICAgICAgIFNFQ19JTl9NRU1PUlkgc2VjdGlvbiBpcyBmb3VuZCBpbiBkeW5vYmouICBUaGlzIGNhbiBoYXBwZW4gd2hlbgotCWxpbmtpbmcgUElDIGNvbXBpbGVkIGNvZGUuCi0KLVRodSBTZXAgMjkgMTU6MjE6NDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IENoYW5nZSB0eXBlIG9mICJkYXRhIiB0bwotCWJmZF9ieXRlICosIHRvIGdvIGFsb25nIHdpdGggeWVzdGVyZGF5J3MgY2hhbmdlLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBNb3ZlZCBoZXJlIGZyb20gZWxmX3ByaW50X3N5bWJvbAotCWluIGVsZmNvZGUuaC4gIChjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsKTogUHJpbnQgc3ltYm9sJ3Mgc2l6ZQotCWZpZWxkLCBleGNlcHQgZm9yIGNvbW1vbiBzeW1ib2xzOyBwcmludCB0aGVpciBhbGlnbm1lbnQuCi0JKiBlbGZjb2RlLmggKGVsZl9wcmludF9zeW1ib2wpOiBEZWxldGVkLgotCSogbGliZWxmLmggKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogRGVjbGFyZS4KLQkoYmZkX2VsZnszMiw2NH1fcHJpbnRfc3ltYm9sKTogUmVwbGFjZSBkZWNsYXJhdGlvbnMgd2l0aCBtYWNyb3MuCi0KLQkqIHN5bXMuYyAoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IFNob3cgQlNGX0xPQ0FMIGFuZCBCU0ZfR0xPQkFMCi0JaW4gb25lIGNvbHVtbi4gIFVzZSB0aGUgY29sdW1uIGZyZWVkIHVwIHRvIHNob3cgQlNGX0ZVTkNUSU9OIGFuZAotCUJTRl9GSUxFLgotCi1UaHUgU2VwIDI5IDEyOjI5OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc3ltcy5jIChzdHQpOiBBZGQgLnJkYXRhIGFuZCAucm9kYXRhLgotCi1XZWQgU2VwIDI4IDEzOjM1OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoYmZkX2luc3RhbGxfcmVsb2NhdGlvbik6IENhc3QgZGF0YV9zdGFydCB0byBiZmRfYnl0ZSAqCi0JYmVmb3JlIHRyeWluZyB0byBhZGQgdmFsdWVzIHRvIGl0LgotCi1UdWUgU2VwIDI3IDE2OjQ3OjU4IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmMzJfaHBwYV9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBDYXN0Ci0JcmV0dXJuIHZhbHVlIGZyb20gZWxmX3N5bV9leHRyYS4KLQkoZWxmMzJfaHBwYV9idWlsZF9zdHVicyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20gYmZkX3phbGxvYy4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogQ2FzdCByZXR1cm4gdmFsdWUgZnJvbSBtYWxsb2MuCi0KLQkqIGdlbi1hb3V0LmMgKG1haW4pOiBEZWNsYXJlIGFuZCBpbml0aWFsaXplICJhcmNoIi4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ2FzdCByZXR1cm4gdmFsdWUgb2YKLQliZmRfaGFzaF9hbGxvY2F0ZS4KLQotCSogcmlzY2l4LmMgKHJpc2NpeF9jYWxsYmFjayk6IFVzZSBQQVJBTVMgbWFjcm8gaW4gcHJvdG90eXBlLgotCi0JKiByZWxvYy5jIChiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLCBtb3N0bHkgY29waWVkCi0JZnJvbSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhZGp1c3RlZCBmb3IgdGhlIGFzc2VtYmxlcidzIG5lZWRzLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIFNlcCAyNiAxMTowMDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBBbGlnbiB0aGUKLQlzZWN0aW9uIFZNQSBhbmQgdGhlIGZpbGUgcG9zaXRpb24gZXZlbiBpZiBEX1BBR0VEIGlzIG5vdCBzZXQuCi0KLQkqIGJmZC1pbi5oIChiZmRfc2Vlayk6IENoYW5nZSBkZWNsYXJhdGlvbiB0byBub3QgbWFyayBmcCBjb25zdC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGxpYmJmZC5jIChiZmRfc2Vlayk6IERvbid0IG1hcmsgcGFyYW1ldGVycyBjb25zdCwgdG8gYXZvaWQKLQljb25mbGljdHMgd2l0aCBkZWNsYXJhdGlvbi4KLQotRnJpIFNlcCAyMyAxNToxNTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBEb24ndCBhYm9ydCBpZiB3ZSBhbGxvY2F0ZWQKLQl0b28gbXVjaCBzcGFjZSBmb3IgdGhlIHByb2dyYW0gaGVhZGVyLCBvbmx5IGlmIHdlIGFsbG9jYXRlZCB0b28KLQlsaXR0bGUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogU2ltaWxhciBjaGFuZ2UuCi0KLVR1ZSBTZXAgMjAgMTM6MTc6MDcgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBsaWJhb3V0Lmg6IEZpeCBjb21tZW50LgotCSogbnMzMmtuYnNkLmg6IENoYW5nZWQgTV9OUzMyS19ORVRCU0QgdG8gTV81MzJfTkVUQlNEIHRvIG1hdGNoCi0JICBsaWJhb3V0LmguCi0KLVR1ZSBTZXAgMjAgMTU6MjM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIHNwYXJjbmV0YnNkLm8uCi0JKENGSUxFUyk6IEFkZCBuczMya25ldGJzZC5jIGFuZCBzcGFyY25ldGJzZC5jLgotCSogdGFyZ2V0cy5jOiBuczMya25ldGJzZF92ZWMgd2FzIHJlbmFtZWQgdG8gcGM1MzJuZXRic2RfdmVjLgotCi0JKiBjb2ZmLXNoLmMgKHJ0eXBlMmhvd3RvKTogUmVtb3ZlOyB1bnVzZWQuCi0JKGNvZmZfc2hfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgcnN0YXQuCi0JKHJlbG9jX3Byb2Nlc3NpbmcpOiBDb21tZW50IG91dDsgdW51c2VkLgotCi1GcmkgU2VwIDE2IDEyOjEyOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCk6IElmIGgtPmluZHggaXMgLTIsIHRoZW4KLQlhbHdheXMgd3JpdGUgaXQgb3V0IGV2ZW4gaWYgaXQgd291bGQgbm9ybWFsbHkgYmUgc3RyaXBwZWQuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX3N0ZCk6IElmIHdlIGZpbmQgYSByZWxvYyBhZ2FpbnN0IGEKLQlzdHJpcHBlZCBnbG9iYWwgc3ltYm9sLCBmb3JjZSBpdCB0byBiZSB3cml0dGVuIG91dCByYXRoZXIgdGhhbgotCW1lcmVseSBjYWxsaW5nIHVuYXR0YWNoZWRfcmVsb2MuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCi1XZWQgU2VwIDE0IDE1OjM3OjE5IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoc3RydWN0IHNvbWRhdGEpOiBOZXcgZmllbGQgc29ydGVkX3N5bXMuCi0JKG9ial9zb21fc29ydGVkX3N5bXMpOiBBY2Nlc3NvciBtYWNyby4KLQkqIHNvbS5jIChzb21fb2JqZWN0X3NldHVwKTogSW5pdGlhbGl6ZSBzb3J0ZWRfc3ltcyB0byBOVUxMLgotCShzb21fcHJlcF9mb3JfZml4dXBzKTogU29ydCBhIGNvcHkgb2YgdGhlIEJGRCdzIHN5bWJvbCB0YWJsZTsKLQlzdG9yZSB0aGUgc29ydGVkIHN5bWJvbCB0YWJsZSBpbiBzb3J0ZWRfc3ltcy4KLQkoc29tX3dyaXRlX2ZpeHVwcyk6IEluaXRhbGl6ZSB0bXBfcmVsb2MgdG8gTlVMTCB0byBtYWtlIEdDQyBoYXBweS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBTaW1pbGFybHkgZm9yIGV4ZWNfaGVhZGVyLiAgUGFzcyB0aGUgc29ydGVkCi0Jc3ltYm9sIHRhYmxlIHRvIHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncy4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBVc2UgdGhlIHNvcnRlZCBzeW1ib2xzIHJhdGhlcgotCXRoYW4gdGhlIGNhbm9uaWNhbCBzeW1ib2wgdGFibGUuCi0KLQkqIHNvbS5oIChzb21fc3ltYm9sX3R5cGUpOiBBZGQgInN0cmluZ3RhYl9vZmZzZXQiIGZpZWxkLgotCSogc29tLmMgKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyk6IFVzZSAic3RyaW5ndGFiX29mZnNldCIKLQlyYXRoZXIgdGhhbiBkZXN0cm95aW5nIHRoZSAibmFtZSIgZmllbGQgaW4gdGhlIEJGRCBzeW1ib2wuCi0JKHNvbV9idWlsZF9hbmRfd3JpdGVfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgMTQgMTU6MDY6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFJlbmFtZSBza2lwX2luZGlyZWN0IHRvCi0Jc2tpcF9uZXh0LiAgSWYgd2UgZmluZCBhbiBOX1dBUk5JTkcgc3ltYm9sIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4KLQl3cml0dGVuIG91dCwgc2V0IHNraXBfbmV4dC4KLQotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX3RkYXRhKTogQWRkIGZpZWxkIGZpbmRfYnVmZmVyLgotCSogZWNvZmYuYzogSW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCi0JKGVjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogSGFuZGxlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQotCSogZWxmY29kZS5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogS2VlcCBhIHN5bWJvbCBtYXJrZWQgYXMgd2VhawotCWV2ZW4gaWYgaXQgaXMgcmVmZXJlbmNlZCBieSBhbm90aGVyIG9iamVjdC4KLQotVHVlIFNlcCAxMyAxNzo1NzowMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9maXh1cF9mb3JtYXRzKTogQ2FzZSBSX0VOVFJZICgweGIzKSwgc2V0IGJvdGgKLQknVCcgYW5kICdVJyB0byBncmFiIGFsbCB0aGUgdW53aW5kIGluZm9ybWF0aW9uLgotCShzb21fc2V0X3JlbG9jX2luZm8pOiBNYWtlICdVJyB1bndpbmQgYml0cyBwZXJzaXN0IGFjcm9zcwotCW11bHRpcGxlIFNPTSByZWxvY2F0aW9ucy4gIFNldCB0aGUgYWRkZW5kIGZpZWxkIG9mIGFuIFJfRU5UUlkKLQlyZWxvY2F0aW9uIHRvIHRoZSB2YWx1ZSBpbiAnVCc7IHNldCB0aGUgYWRkZW5kIGZpZWxkIG9uIGFuCi0JUl9FWElUIHJlbG9jYXRpb24gdG8gdGhlIHZhbHVlIGluICdVJy4KLQotCSogc29tLmggKHNvbV9zeW1ib2xfdHlwZSk6IERlbGV0ZSB1bndpbmQgZmllbGQuCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogRm9yIFJfRU5UUlkgZml4dXBzLCBnZXQgMzJiaXRzIG9mCi0JdW53aW5kIGluZm9ybWF0aW9uIGZyb20gdGhlIGFkZGVuZCBmaWVsZCBvZiB0aGUgUl9FTlRSWSwgZ2V0IHRoZQotCW90aGVyIDMyYml0cyBmcm9tIHRoZSBhZGRlbmQgZmllbGQgb2YgdGhlIFJfRVhJVC4KLQkoYmZkX3NvbV9hdHRhY2hfdW53aW5kX2luZm8pOiBEZWxldGUgZnVuY3Rpb24gYW5kIGFsbCByZWZlcmVuY2VzLgotCi0JKiBzb20uaCAoc29tX3N5bWJvbF90eXBlKTogRGVsZXRlIHVudXNlZCBhLm91dC1yZWxhdGVkIGZpZWxkcy4KLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IFVzZSBiZmRfYWJzX3NlY3Rpb25fcHRyCi0JaW5zdGVhZCBvZiAmYmZkX2Fic19zZWN0aW9uLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IEhhbmRsZSBleGVjX2VudHJ5IGFuZCBleGVjX2ZsYWdzIGJlaW5nCi0Jc3dpdGNoZWQgaW4gZXhlY3V0YWJsZXMgY3JlYXRlZCBieSB0aGUgT1NGMSBsaW5rZXIuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9FWElUIGp1c3QgbGlrZSB0aGUgUl97RixMLFJ9U0VMCi0JZml4dXBzLiAgU3VwcG9ydCBSX0FMVF9FTlRSWSAoaGFuZGxlIGp1c3QgbGlrZSBSX0VYSVQpLgotCi1UdWUgU2VwIDEzIDE2OjA0OjA3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBzeW1lbnRfYmFzZSBpcyB1bnNpZ25lZAotCXNvIGNhbid0IGNvbXBhcmUgLXZlIG51bWJlcnMgd2l0aCBpdC4KLQotTW9uIFNlcCAxMiAyMDozMToxNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHNoY29mZl92ZWMpOiBVc2UgY29mZmxpbmsubyBub3cuCi0JKiBjb2ZmLXNoLmM6IFJld3JpdHRlbiB0byB1c2UgbmV3IGZhc3QgY29mZiBiYWNrZW5kLgotCi1UdWUgU2VwIDEzIDE2OjIzOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgYXNzdW1lIHRoYXQgYWxsIHRoZSBpbnB1dAotICAgICAgICBmaWxlcyBhcmUgYS5vdXQuCi0KLVR1ZSBTZXAgMTMgMTE6MDk6MzkgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1uZXRic2QpOiB1c2Ugc3BhcmNuYnNkLgotCSAgKG5zMzJrLSotbmV0YnNkKTogdXNlIG5zMzJrbmJzZC4KLQotCSogaG9zdHMve25ic2QsaTM4Nm5ic2QsbnMzMmtuYnNkLHNwYXJjbmJzZH0uaDogTmV3IGZpbGVzLCBOZXRCU0QKLQkgIGhvc3Qgc3VwcG9ydC4KLQotCSogc3BhcmNuZXRic2QuYzogTmV3IGZpbGUsIGFkZHMgc3VwcG9ydCBmb3IgTmV0QlNEL3NwYXJjLgotCSogY29uZmlnL3NwYXJjLW5ic2QubXQ6IExpa2V3aXNlLgotCi0JKiBuZXRic2QuaDogTmV3IGZpbGUsIGRlZmluaXRpb25zIGNvbW1vbiB0byBhbGwgbmV0YnNkIHBvcnRzLgotCSogaTM4Nm5ldGJzZC5jOiBVc2UgaXQuCi0gICAgICAgICogbnMzMmtuZXRic2QuYzogVXNlIGl0LgotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCB0YXJnZXRzLmMsIGNvbmZpZy9pMzg2LW5ic2QubXQsCi0JICBjb25maWcvbnMzMmstbmJzZC5tdDogY2Fub25pY2FsaXplIG5ldGJzZCB0YXJnZXRzIHRvIGNvbmZvcm0gdG8KLQkgIGZpbGUvdmFyaWFibGUgbmFtaW5nIGNvbnZlbnRpb25zLgotCSogaTM4Nm5ldGJzZC5jOiBOZXcgZmlsZSwgcmVuYW1lZCBmcm9tIG5ldGJzZDM4Ni5jLgotCSogbnMzMmtuZXRic2QuYzogTmV3IGZpbGUsIHJlbmFtZWQgZnJvbSBuZXRic2Q1MzIuYy4KLQkKLU1vbiBTZXAgMTIgMjE6NTY6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcmVsb2Nfc2tpcCk6IENvcnJlY3Qgb2ZmLWJ5LW9uZSBlcnJvciBmb3IgNC1ieXRlCi0JUl9OT19SRUxPQ0FUSU9OIGZpeHVwcy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sKTogUmV0dXJuIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIGlmIHRoZQotCXN5bWJvbCBpc24ndCBjb250YWluZWQgaW4gYW55IHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogU1RfUFJJX1BST0cgYW5kIFNUX1NFQ19QUk9HIHN5bWJvbHMgYXJlCi0Jbm90IGZ1bmN0aW9uIHN5bWJvbHMgKHRoZXkgYXJlIG1hZ2ljIGNvZGUgbGFiZWxzIHdoaWNoICpjYW4qIGJlIHRoZQotCXRhcmdldHMgb2YgY3Jvc3Mgc3BhY2UgYnJhbmNoZXMpLiAgJFNUQVJUJCBpcyBub3QgYSBzZWN0aW9uIHN5bWJvbC4KLQotTW9uIFNlcCAxMiAxMTo0MzowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogQWRkIFNFQ19DT0RFIGFuZCBTRUNfREFUQQotCXRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBjb2ZmLW1pcHMuYyAoZWNvZmZfbGl0dGxlX3ZlYywgZWNvZmZfYmlnX3ZlYyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKHN3YXBfb3V0X3N5bXMpOiBTZXQgdGhlIHR5cGUgb2YgYW4gdW5kZWZpbmVkIHN5bWJvbAotCXRvIFNUVF9GVU5DIGlmIHRoZSBCU0ZfRlVOQ1RJT04gZmxhZyBpcyBzZXQuCi0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19pbnB1dF9iZmQpOiBJZiByX3N5bW5keCBpcyAtMSwgZG9uJ3QKLQljaGFuZ2UgaXQuCi0JKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiByX3N5bW5keCBpcyAtMSwgaXQgaXMgYW4KLQlhYnNvbHV0ZSByZWxvYy4gIERvbid0IGR1bXAgY29yZSB1c2luZyByX3N5bW5keCBhcyBhbiBhcnJheSBpbmRleC4KLQkqIGNmLW02OGtseW54LmMgKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWZpbmUuCi0JKGx5bnhfbGlua19hZGRfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24gKGNvcHkgb2YgZnVuY3Rpb24gaW4KLQljb2ZmLWkzODYuYykuCi0JKGNvZmZfbTY4a19seW54cnR5cGVfdG9faG93dG8pOiBzeW0gYXJndW1lbnQgbWF5IGJlIE5VTEwuCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3J0eXBlX3RvX2hvd3RvKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWEyOWsuYyAoY29mZl9hMjlrX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgYW4gcl9zeW1uZHgKLQl2YWx1ZSBvZiAtMSwgbWVhbmluZyBhbiBhYnNvbHV0ZSByZWxvYy4KLQotCSogY3Rvci5jOiBSZW1vdmU7IG9ic29sZXRlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfTElCUyk6IFJlbW92ZSBjdG9yLm8uCi0JKENGSUxFUyk6IFJlbW92ZSBjdG9yLmMuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotTW9uIFNlcCAxMiAwMTo1ODo0NyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiB0aGVyZSB3YXMgYSBsaW5rCi0JZXJyb3Igb2Ygc29tZSBzb3J0IChmb3IgZXhhbXBsZSwgdW5kZWZpbmVkIHN5bWJvbHMpLCB0aGVuIGRvIG5vdAotCWFwcGx5IGFueSByZWxvY3MsIGp1c3Qgbm90aWZ5IHRoZSB1c2VyIG9mIHRoZSBlcnJvcnMuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nKTogRG8gbm90IGJ1aWxkIGEgc3ltYm9sCi0JZXh0ZW5zaW9uIHNlY3Rpb24gZm9yIGFuIGV4ZWN1dGFibGUgKGl0J3MgdXNlbGVzcykuCi0JKGVsZjMyX2hwcGFfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spOiBEbyBub3RoaW5nIGlmIHRoZXJlIHdhcyBhCi0JbGluayBlcnJvciBvZiBzb21lIHNvcnQgKGZvciBleGFtcGxlLCB1bmRlZmluZWQgc3ltYm9scykuCi0JKGVsZjMyX2hwcGFfcmVhZF9zeW1leHRfaW5mbyk6IEtsdWRnZS4gIFR1cm4gb2ZmIFNFQ19IQVNfQ09OVEVOVFMKLQlmb3IgYWxsIHRoZSBpbnB1dCBzeW1ib2wgZXh0ZW5zaW9uIHNlY3Rpb25zIHRvIGtlZXAgdGhlIGdlbmVyaWMKLQlCRkQgY29kZSBoYXBweS4gIFRlbXBvcmFyaWx5IHR1cm4gaXQgb24gdG8gcmVhZCB0aGUgY29udGVudHMgb2YKLQl0aGUgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9uLgotCi1TdW4gU2VwIDExIDIxOjU4OjU5IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvaHBwYW9zZi5taCAoUkFOTElCKTogRG8gbm90IHNldC4KLQkqIGNvbmZpZy9ocHBhYnNkLm1oIChSQU5MSUIpOiBMaWtld2lzZS4KLQotU3VuIFNlcCAxMSAyMjo1MDo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNmLWkzODZseW54LmM6IFJlbW92ZSAjaWYgMCBjb2RlLgotCShpMzg2X2x5bnhvc19jb2ZmX29iamVjdF9wKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlZmluZS4KLQkobHlueF9saW5rX2FkZF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJZgotCWNvZmZfcmVsb2NhdGVfc2VjdGlvbiBpcyBkZWZpbmVkLCBvbmx5IGRlZmluZSB0aGlzIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scywgY29mZl9iZmRfZmluYWxfbGluayk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBIYW5kbGUKLQliZmRfaW5kaXJlY3RfbGlua19vcmRlciBleHBsaWNpdGx5LCByYXRoZXIgdGhhbiB2aWEKLQlfYmZkX2RlZmF1bHRfbGlua19vcmRlci4KLQkoc2V0X3N5bWJvbF9mcm9tX2hhc2gpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IFN5bWJvbCBzZXR0aW5nIGNvZGUgbW92ZWQKLQl0byBzZXRfc3ltYm9sX2Zyb21faGFzaDsgY2FsbCBpdC4KLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogQWRkIGdlbmVyaWNfbGlua2VyIGFyZ3VtZW50LgotCUNoYW5nZSBhbGwgY2FsbGVycy4gIElmIGZhbHNlLCBzZXQgdGhlIGdlbmVyaWMgc3ltYm9scyBiYXNlZCBvbgotCXRoZSBoYXNoIHRhYmxlIGVudHJpZXMuCi0KLUZyaSBTZXAgIDkgMTE6NTE6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfZ2V0X3N5bXRhYik6IFJlaW5kZW50ZWQuICBSZW1vdmVkIGNvbW1lbnRlZCBvdXQKLQljYWxsIHRvIGJmZF9jb25zdHJ1Y3Rvcl9lbnRyeS4KLQotCUNvbnZlcnQgbTY4ayBDT0ZGIHRvIHVzZSBuZXcgQ09GRiBiYWNrZW5kIGxpbmtlci4KLQkqIGNvZmYtbTY4ay5jIChjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBjZi1tNjhrbHlueC5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lLgotCShjb2ZmX202OGtfbHlueF9ydHlwZV90b19ob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWd1cmUuaW4gKG02OGtjb2ZmX3ZlYyk6IEJ1aWxkIGNvZmZsaW5rLm8uCi0JKG02OGtjb2ZmdW5fdmVjLCBtNjhrbHlueF9jb2ZmX3ZlYyk6IExpa2V3aXNlLgotCi1UaHUgU2VwICA4IDE2OjIwOjM4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcywgY2FzZSBSRUxCWVRFKTogRmxhZwotCW92ZXJmbG93cyBjb3JyZWN0bHkuCi0KLVdlZCBTZXAgIDcgMTk6MDE6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBDaGFuZ2Ugc2Vjb25kIGFyZ3VtZW50IG9mCi0JZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rIHRvIGJvb2xlYW4uCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGxpbmtlciBmaWVsZC4KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBQYXNzIHZhbHVlIG9mCi0JdGRhdGEgbGlua2VyIGZpZWxkIHRvIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcsIHJhdGhlciB0aGFuIE5VTEwuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IERvbid0IGNhbGwgZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBob29rLiAgU2V0Ci0JdGRhdGEgbGlua2VyIGZpZWxkIHRvIHRydWUuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBDaGFuZ2UgdHlwZSBvZgotCXNlY29uZCBhcmd1bWVudCB0byBib29sZWFuLgotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6Ci0JTGlrZXdpc2UuCi0KLQkqIGNvZmYtZ28zMi5jIChSVFlQRTJIT1dUTyk6IEZ1bGx5IHBhcmVudGhlc2l6ZSBhcmd1bWVudHMuCi0JKiBjb2ZmLWk5NjAuYyAoUlRZUEUySE9XVE8pOiBMaWtld2lzZS4KLQkqIGNvZmYtbTg4ay5jIChSVFlQRTJIT1dUTyk6IExpa2V3aXNlLgotCSogY29mZi13ZTMyay5jIChSVFlQRTJIT1dUTyk6IExpa2V3aXNlLgotCi0JTWFrZSBpMzg2IENPRkYgdXNlIG5ldyBDT0ZGIGJhY2tlbmQgbGlua2VyLgotCSogY29mZi1pMzg2LmMgKFJUWVBFMkhPV1RPKTogRnVsbHkgcGFyZW50aGVzaXplIGFyZ3VtZW50cy4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX2kzODZfcnR5cGVfdG9faG93dG8pOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWd1cmUuaW4gKGkzODZjb2ZmX3ZlYyk6IFVzZSBjb2ZmbGluay5vLgotCShpMzg2bHlueF9jb2ZmX3ZlYyk6IExpa2V3aXNlLgotCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgbmV3IGZpZWxkCi0JX2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvLgotCShiZmRfY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZS4KLQkoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZSB0byB1c2UgUlRZUEUySE9XVE8sIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZC4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogQWxsb2NhdGUgc2VjdGlvbl9jb3VudCArIDEKLQlzZWN0aW9uX2luZm8gc3RydWN0dXJlcywgc2luY2UgdGhlIHRhcmdldF9pbmRleCBpcyAxIGJhc2VkLgotCShjb2ZmX2xpbmtfaW5wdXRfYmZkKTogU2V0ICpzZWNwcCB0byBiZmRfY29tX3NlY3Rpb25fcHRyIGZvciBhCi0JY29tbW9uIHN5bWJvbC4gIEFkanVzdCByZWxfaGFzaCBieSB0aGUgb3V0cHV0IHJlbG9jIGNvdW50LgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogbGliY29mZi1pbi5oIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSBuZXcgZmllbGQuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotVHVlIFNlcCAgNiAyMzoyODo1MiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBUcmVhdCB1bmRlZmluZWQgY29kZQotCXN5bWJvbHMgYW5kIHVuZGVmaW5lZCBzeW1ib2xzIHdoaWNoIG5vIHR5cGUgaW4gdGhlIHNhbWUgbWFubmVyCi0JaWYgdGhlIGFzc29jaWF0ZWQgQkZEIHN5bWJvbCBoYXMgQlNGX0ZVTkNUSU9OIHNldC4gIEZvciBhIGRlZmluZWQKLQlzeW1ib2wgd2hpY2ggbm8gdHlwZSwgc2VsZWN0IGEgU09NIHR5cGUgYmFzZWQgb24gdGhlIGZsYWdzIG9mIHRoZQotCXNlY3Rpb24gY29udGFpbmluZyB0aGUgc3ltYm9sLgotCShzb21fc2x1cnBfc3ltYm9sX3R5cGUpOiBTZXQgQlNGX0ZVTkNUSU9OIGZvciB1bmRlZmluZWQgU1RfU1RVQgotCW9yIFNUX0NPREUgc3ltYm9scyAoaW1wb3J0aW5nIGEgbm9uLWZ1bmN0aW9uIGNvZGUgc3ltYm9sIGlzCi0JbWVhbmluZ2xlc3MgaW4gU09NKS4KLQkoc29tX3NldF9yZWxvY19pbmZvKTogRG9uJ3Qgc2V0ICJvZmZzZXQiIHRvIHRoZSBzZWN0aW9uJ3Mgdm1hOyBpdAotCXNob3VsZCBhbHdheXMgc3RhcnQgYXQgemVyby4KLQotVHVlIFNlcCAgNiAxNDo1MToxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlBZGQgbmV3IHN0eWxlIGxpbmtlciBzdXBwb3J0IHRvIENPRkYgYmFja2VuZC4gIGEyOWsgb25seSBmb3Igbm93LgotCSogY29mZmxpbmsuYzogTmV3IGZpbGUuCi0JKiBsaWJjb2ZmLWluLmg6IEluY2x1ZGUgYmZkbGluay5oLgotCShvYmpfY29mZl9leHRlcm5hbF9zeW1zLCBvYmpfY29mZl9zdHJpbmdzKTogRGVmaW5lIGFjY2Vzc29yIG1hY3JvLgotCShvYmpfY29mZl9zeW1faGFzaGVzKTogRGVmaW5lIGFjY2Vzc29yIG1hY3JvLgotCShzdHJ1Y3QgY29mZl90ZGF0YSk6IEFkZCBmaWVsZHMgZXh0ZXJuYWxfc3ltcywgc3RyaW5ncywgYW5kCi0Jc3ltX2hhc2hlcy4KLQkoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKGNvZmZfbGlua19oYXNoX2xvb2t1cCwgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUuCi0JKGNvZmZfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWNsYXJlLgotCShfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scywgX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBfYmZkX3JlbHN6LAotCV9iZmRfY29mZl9zd2FwX3JlbG9jX2luLCBfYmZkX2NvZmZfc3ltX2lzX2dsb2JhbCwKLQlfYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zLAotCV9iZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uLgotCShiZmRfY29mZl9yZWxzeiwgYmZkX2NvZmZfc3dhcF9yZWxvY19pbik6IERlZmluZS4KLQkoYmZkX2NvZmZfc3ltX2lzX2dsb2JhbCk6IERlZmluZS4KLQkoYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRGVmaW5lLgotCShiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCShjb2ZmX21rb2JqZWN0X2hvb2spOiBJbml0aWFsaXplIG9ial9yYXdfc3ltZW50X2NvdW50IGFuZAotCW9ial9jb252X3RhYmxlX3NpemUuCi0JKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogU2V0IHRhcmdldF9pbmRleCBvZiBhbGwKLQlzZWN0aW9ucy4gIFNldCBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IHNldCB0YXJnZXRfaW5kZXg7IG5vdyBkb25lIGJ5Ci0JY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICBSZW1vdmUgb2Jzb2xldGUgaGFuZGxpbmcgb2YKLQlzY25fYmFzZSBhbmQgZGF0YV9iYXNlLiAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIHRoYXQgdGFyZ2V0X2luZGV4Ci0JaXMgcG9zaXRpdmUsIHNpbmNlIGl0IGFsd2F5cyBpcy4gIFJlbW92ZSB1c2Ugb2YgcGFkLCB3aGljaCBpcwotCWFsd2F5cyB6ZXJvLiAgQ2hlY2sgb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdCBiZmRfZ2V0X3N5bWNvdW50LAotCWZvciB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIGJ1dCBvbmx5IHdyaXRlIHRoZW0gb3V0IGlmCi0JYmZkX2dldF9zeW1jb3VudCBpcyBub24temVyby4gIERvbid0IGNoZWNrIG9ial9yYXdfc3ltZW50X2NvdW50Ci0JdW50aWwgYWZ0ZXIgY29mZl93cml0ZV9zeW1ib2xzIGlzIGNhbGxlZC4KLQkoY29mZl9zbHVycF9zeW1ib2xfdGFibGUpOiBVc2Ugb2JqX3Jhd19zeW1lbnRfY291bnQsIG5vdAotCWJmZF9nZXRfc3ltY291bnQgZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scy4gIERvbid0IHNldAotCW9ial9jb252X3RhYmxlX3NpemUuCi0JKGNvZmZfc3ltX2lzX2dsb2JhbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24gb3IgbWFjcm8uCi0JKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBDYWxsIGNvZmZfc3dhcF9yZWxvY19pbiwgbm90Ci0JYmZkX3N3YXBfcmVsb2NfaW4uCi0JKGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMKLQlkZWZpbmVkLCBkZWZpbmUgYXMgX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUuCi0JKGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBTaW1pbGFyIGNoYW5nZS4KLQkoY29mZl9iZmRfZmluYWxfbGluayk6IFNpbWlsYXIgY2hhbmdlLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUgYXMgTlVMTCBpZiBub3QgZGVmaW5lZC4KLQkoYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVhbF9vYmplY3RfcCk6IERvbid0IHNldCBvYmpfcmF3X3N5bWVudF9jb3VudAotCWFuZCBvYmpfY29udl90YWJsZV9zaXplIGhlcmUuCi0JKGNvZmZfY291bnRfbGluZW51bWJlcnMpOiBSZWluZGVudC4gIElmIGJmZF9nZXRfc3ltY291bnQgaXMgemVybywKLQlhZGQgdXAgdGhlIGxpbmUgbnVtYmVycyBmcm9tIHRoZSBzZWN0aW9ucy4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogU2V0IG9ial9yYXdfc3ltZW50X2NvdW50LCBub3QKLQliZmRfZ2V0X3N5bWNvdW50LgotCShjb2ZmX3BvaW50ZXJpemVfYXV4KTogRG9uJ3QgcG9pbnRlcml6ZSBhIG5vbnBvc2l0aXZlIHhfZW5kbmR4Ci0JZmllbGQuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogVXNlIG9ial9yYXdfc3ltZW50X2NvdW50LCBub3QKLQliZmRfZ2V0X3N5bWNvdW50LgotCShjb2ZmX3ByaW50X3N5bWJvbCk6IElmIGF1eHAtPmZpeF9lbmQsIHByaW50IHhfZW5kbmR4IHZhbHVlLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3JlbG9jX2luKTogUmVuYW1lIGZyb20gYmZkX3N3YXBfcmVsb2NfaW4uCi0JUmVpbmRlbnQuICBDaGFuZ2UgYXJndW1lbnQgdHlwZSB0byAgUFRSLgotCSogY29mZi1hMjlrLmMgKGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluIChhMjlrY29mZl9iaWdfdmVjKTogQ29tcGlsZSBjb2ZmbGluay5vLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldyBmaWVsZHMuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgY29mZmxpbmsuby4KLQkoQ0ZJTEVTKTogQWRkIGNvZmZsaW5rLmMuCi0KLVR1ZSBTZXAgIDYgMTQ6MDA6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCwgY2FzZSBiZmRfc3ltYm9sX3ByaW50X2FsbCk6IENoZWNrCi0JZm9yIHNlY3Rpb24gc3ltYm9sLCBhbmQgcHJpbnQgaXRzIGF1eCBmaWVsZHMgd2l0aCBhcHByb3ByaWF0ZQotCWxhYmVscy4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZGVkIGNwdS1hcm0uby4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IFJlY29nbml6ZSB0aGUgQVJNIHByb2Nlc3Nvci4KLQkqIGFyY2h1cmVzLmMsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5ob3N0LCBsaWJhb3V0LmgsIHJlbG9jLmMsCi0JdGFyZ2V0cy5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KLQkqIGNwdS1hcm0uYywgcmlzY2l4LmMsIGNvbmZpZy9yaXNjaXgubWgsIGNvbmZpZy9yaXNjaXgubXQ6IE5ldyBmaWxlcy4KLQotCSogYW91dHguaCAoYWRkX3RvX3N0cmluZ3RhYmxlKTogQ2hlY2sgdGhhdCBzdHIgaXNuJ3QgYSBOVUxMIHBvaW50ZXIuCi0KLUZyaSBTZXAgIDIgMTQ6MTA6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogUmV3cm90ZSBkZWZpbml0aW9uIHRvIHVzZQotCW5ldyAiY2hldyIgY29tbWFuZHMgZm9yIHNpbXVsdGFuZW91cyBkZWZpbml0aW9uIG9mIGVudW1lcmF0b3IgYW5kCi0JZW51bWVyYXRvciBuYW1lIHRhYmxlLgotCShiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSk6IE5ldyBmdW5jdGlvbiwgZm9yIHJldHJpZXZpbmcgYSBzeW1ib2xpYwotCW5hbWUgYXNzb2NpYXRlZCB3aXRoIGFuIGVudW1lcmF0b3IuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotVHVlIEF1ZyAzMCAyMToyNDo1NCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMsIGNhc2UgUl9FTlRSWSk6IEhhbmRsZSBjYXNlIHdoZXJlIG5vCi0JdW53aW5kIGRlc2NyaXB0b3IgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgotCi1UdWUgQXVnIDMwIDExOjQzOjMwIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogZWxmY29kZS5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZCBzb25hbWUKLQlhcmd1bWVudCwgYW5kIHVzZSBpdCB0byBzZXQgRFRfU09OQU1FIGR5bmFtaWMgZW50cnkuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0JKGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgcHJvdG90eXBlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgQXVnIDI2IDE1OjQ3OjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3JlYWxfb2JqZWN0X3ApOiBTZXQgb2JqX3Jhd19zeW1lbnRfY291bnQuCi0JKGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogVmVyaWZ5IG9ial9yYXdfc3ltZW50X2NvdW50LCByYXRoZXIKLQl0aGFuIHNldHRpbmcgaXQuCi0KLVRodSBBdWcgMjUgMTA6NDQ6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGJzZF93cml0ZV9hcm1hcCk6IFJlbW92ZSBob3N0IGRlcGVuZGVuY2llcy4KLQotCSogYW91dHguaCAoYWRkX3RvX3N0cmluZ3RhYik6IENoZWNrIGZvciBfYmZkX3N0cmluZ3RhYl9hZGQgZXJyb3IKLQliZWZvcmUgYWRkaW5nIEJZVEVTX0lOX1dPUkQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IExvb2sgZm9yIHRoZSBiZXN0IENfRklMRSwKLQlub3QgbWVyZWx5IHRoZSBmaXJzdC4KLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IElmIHdlIGFyZSBub3QgdXNpbmcgdGhlCi0Jc3ltYm9sLCBjbGVhciB0aGUgbmFtZSBzbyB0aGF0IGl0IGlzIG5vdCBwdXQgaW4gdGhlIHN0cmluZyB0YWJsZS4KLQlGcm9tIEFudHRpLk1pZXR0aW5lbkBudGMubm9raWEuY29tLgotCi1XZWQgQXVnIDI0IDExOjQ5OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3ByaW50X3N5bWJvbCk6IENhc3QgcG9pbnRlciBkaWZmZXJlbnQgdG8gbG9uZwotCWFuZCB1c2UgJWxkIHRvIHByaW50IGl0LgotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfY29yZV9maWxlX3ApOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlCi0JZHNlY2NudC4KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX2V4dF9vdXQpOiBJZiBFQ09GRl82NCwgY2xlYXIgcmVtYWluaW5nCi0JYnl0ZXMgaW4gYml0czIuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0LCBjb25maWcuYmZkOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogU2V0IG9ial9jb252X3RhYmxlX3NpemUgaGVyZSwKLQlyYXRoZXIgdGhhbiB3YWl0aW5nIHVudGlsIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IEp1c3QgaWdub3JlIEJTRl9ERUJVR0dJTkcgc3ltYm9scy4KLQlGcm9tIEFudHRpLk1pZXR0aW5lbkBudGMubm9raWEuY29tLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5KTogRml4IGZhaWx1cmUgY2hlY2sgb2YKLQliZmRfbWFrZV9lbXB0eV9zeW1ib2wuICBGcm9tIEFudHRpLk1pZXR0aW5lbkBudGMubm9raWEuY29tLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IFVzZSB0aGUgb3V0cHV0X3NlY3Rpb24KLQkoYW5kIG91dHB1dF9vZmZzZXQpIGlmIHRoZXJlIGlzIG9uZS4KLQotCSogYW91dHguaCAoYW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IERpc2NhcmQgdGhlIHN5bWJvbHMKLQlpZiB0aGUgYXJjaGl2ZSBlbGVtZW50IHdhcyBub3QgbmVlZGVkLgotCi0JKiBhb3V0eC5oIChhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogRW5zdXJlIHRoYXQgYSB6ZXJvIHN0cmluZwotCWluZGV4IHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogSWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHVzZSBuYW1lCi0JZnJvbSBvcmlnaW5hbCBoYXNoIHRhYmxlIGVudHJ5LCBub3QgZnJvbSBlbnRyeSBpbiAqc3ltX2hhc2guCi0KLQkqIGFvdXR4LmggKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyk6IEFkZCBmaWVsZHMgY29udGVudHMsCi0JcmVsb2NzLCBzeW1ib2xfbWFwIGFuZCBvdXRwdXRfc3ltcy4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogV29yayBvdXQgdGhlIGxhcmdlc3Qgc2VjdGlvbiBzaXplLCByZWxvYwotCXNpemUsIGFuZCBudW1iZXIgb2Ygc3ltYm9scy4gIFVzZSB0aGVtIHRvIHByZWFsbG9jYXRlIGJ1ZmZlcnMgdGhhdAotCWFyZSBsYXJnZSBlbm91Z2ggZm9yIGFsbCBjYXNlcy4KLQkoYW91dF9saW5rX2lucHV0X2JmZCk6IFVzZSBwcmVhbGxvY2F0ZWQgc3ltYm9sX21hcC4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBSZW1vdmUgc3ltYm9sX21hcCBhcmd1bWVudDsgdXNlCi0JcHJlYWxsb2NhdGVkIHN5bWJvbF9tYXAgaW5zdGVhZC4gIENoYW5nZSBhbGwgY2FsbGVycy4gIFVzZQotCXByZWFsbG9jYXRlZCBvdXRwdXRfc3ltcy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb24pOiBSZW1vdmUgc3ltYm9sX21hcCBhcmd1bWVudC4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgVXNlIHByZWFsbG9jYXRlZCBjb250ZW50cyBhbmQgcmVsb2NzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBSZW1vdmUgc3ltYm9sX21hcCBhcmd1bWVudDsgdXNlCi0JcHJlYWxsb2NhdGVkIHN5bWJvbF9tYXAgaW5zdGVhZC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgMjMgMTA6NTE6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IERvbid0IHVwZGF0ZSB0aGUKLQlzeW1ib2wgbWFwIHRpbWVzdGFtcCBpZiB0aGVyZSBpcyBubyBzeW1ib2wgbWFwLiAgRnJvbQotCXNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZSAoQW5kcmVhcyBTY2h3YWIpLgotCi1Nb24gQXVnIDIyIDEyOjI2OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogdGFyZ2V0cy5jIChCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogQWRkIF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLgotCShiZmRfdGFyZ2V0KTogQWRkIGZpZWxkIF9iZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcC4KLQkqIGJmZC5jIChiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWNsYXJlLgotCShfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBhcmNoaXZlLmMgKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IENhbGwKLQliZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBpbnN0ZWFkIG9mIGNoZWNraW5nIGZvciBhIEJTRCBhcmNoaXZlCi0JYW5kIGNhbGxpbmcgYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAuCi0JKF9iZmRfYXJjaGl2ZV9ic2RfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IFJlbmFtZSBmcm9tCi0JX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wLiAgRG9uJ3QgYXNzdW1lIHRoYXQgYXJtYXBfZGF0ZXBvcyBpcwotCWFscmVhZHkgc2V0LgotCSogYW91dC10YXJnZXQuaCAoTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZSBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBpZWVlLmMgKGllZWVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIGxpYmVjb2ZmLmggKF9iZmRfZWNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCk6IERlZmluZS4KLQkqIG9hc3lzLmMgKG9hc3lzX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApOiBEZWZpbmUuCi0KLQkqIGhhc2guYzogQ29weSBzdHJpbmcgaGFzaCBmdW5jdGlvbnMgZnJvbSBhb3V0eC5oLgotCSogYW91dHguaDogU3RyaW5nIGhhc2ggZnVuY3Rpb25zIG1vdmVkIHRvIGhhc2guYy4gIFJldGFpbgotCXNpbXBsaWZpZWQgdmVyc2lvbnMgb2YgYWRkX3RvX3N0cmluZ3RhYiBhbmQgZW1pdF9zdHJpbmd0YWIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzIHRvIHVzZSBuZXcgZnVuY3Rpb24gYW5kIHN0cnVjdHVyZSBuYW1lcy4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3N0cmluZ3RhYl9pbml0LCBfYmZkX3N0cmluZ3RhYl9mcmVlKTogRGVjbGFyZS4KLQkoX2JmZF9zdHJpbmd0YWJfc2l6ZSwgX2JmZF9zdHJpbmd0YWJfYWRkKTogRGVjbGFyZS4KLQkoX2JmZF9zdHJpbmd0YWJfZW1pdCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotTW9uIEF1ZyAyMiAxMDo0OTozNyAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGkzODZsaW51eC5jIChsaW51eF9hZGRfb25lX3N5bWJvbCk6IENyZWF0ZSBhIGZpeHVwIGZvciBhbnkKLQlkZWZpbmVkIGFic29sdXRlIHN5bWJvbCwgbm90IGp1c3QgR09UIG9yIFBMVCBzeW1ib2xzLgotCShsaW51eF90YWxseV9zeW1ib2xzKTogQ29ycmVjdCBoYW5kbGluZyBvZiByZWZlcmVuY2VzIHRvIGRlZmluZWQKLQlzeW1ib2xzLgotCi1UaHUgQXVnIDE4IDE2OjI5OjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCUdldCBsZCAteCAtciB0byBoYW5kbGUgYS5vdXQgc2V0IHN5bWJvbHMgY29ycmVjdGx5LgotCSogYW91dHguaCAoYWRqdXN0X29fbWFnaWMpOiBJZiB0aGUgLmJzcyBWTUEgd2FzIHNldCBvdXRzaWRlIG9mCi0JQkZELCBwYWQgdGhlIC5kYXRhIHNlY3Rpb24gdXAgdG8gdGhlIFZNQSBvZiB0aGUgLmJzcyBzZWN0aW9uLgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBJZiBhIHNldCBzeW1ib2wgZG9lcyBub3QgZ2V0IG1vZGlmaWVkLAotCXRyZWF0IGl0IGFzIGEgbG9jYWwgc3ltYm9sLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFNldCB0aGUgdmFsdWUgb2Ygc2V0IHN5bWJvbHMKLQljb3JyZWN0bHkuICBEb24ndCBkaXNjYXJkIHNldCBzeW1ib2xzIGV2ZW4gaWYgZGlzY2FyZGluZyBsb2NhbAotCXN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBEb24ndCBhYm9ydCBvbiBiZmRfbGlua19oYXNoX25ldywKLQlzaW5jZSBpdCBjYW4gbm93IGhhcHBlbiBmb3Igc2V0IHN5bWJvbHMuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBKdXN0IGNoZWNrIGZvciAiLnJlbGEiIGFuZAotCSIucmVsIiwgbm90ICIucmVsYS4iIGFuZCAiLnJlbC4iOyBtYWtlIHRoaXMgd29yayBieSBjaGVja2luZwotCXVzZV9yZWxhX3AuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2NoZWNrX3JlbG9jcyk6IEp1c3QgY2hlY2sgZm9yICIucmVsIiwgbm90Ci0JIi5yZWwuIgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSnVzdCBjaGVjayBmb3IKLQkiLnJlbGEiLCBub3QgIi5yZWxhLiIKLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxNyAxNjo1NDoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogSW5pdGlhbGl6ZQotCVBBU1MgdG8gdGhlIG9sZCB2YWx1ZSArIDEuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBJZiBhIENfRklMRSBzeW1ib2wgaGFzCi0Jbm8gYXV4IGVudHJpZXMsIHVzZSB0aGUgc3ltYm9sIG5hbWUgYXMgdGhlIGZpbGUgbmFtZS4KLQkoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IExvb2sgZm9yIHRoZSByaWdodCBDX0ZJTEUgc3ltYm9sLCByYXRoZXIKLQl0aGFuIGFsd2F5cyB1c2luZyB0aGUgZmlyc3Qgb25lLiAgSWYgdGhlcmUgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sCi0JYWZ0ZXIgYSBmdW5jdGlvbiBzeW1ib2wsIHNraXAgaXQuICBBZGQgdGhlIHNlY3Rpb24gVk1BIHRvIHRoZSBsaW5lCi0Jb2Zmc2V0LCBzaW5jZSBpdCB3YXMgc3VidHJhY3RlZCBvdXQgaW4gY29mZl9zbHVycF9saW5lX3RhYmxlLgotCi1UdWUgQXVnIDE2IDE2OjUzOjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfaGVhZGVycyk6IElmIHdyaXRpbmcgc29tZSBmb3JtIG9mIGFuIGV4ZWN1dGFibGUsCi0JYWxsb2NhdGUgYW5kIGF0dGFjaCBhbiBleGVjIGhlYWRlciB0byB0aGUgQkZEIHByaXZhdGUgZGF0YS4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBEb24ndCBmaWxsIGZpZWxkcyBvZiB0aGUgZXhlYyBoZWFkZXIgYmFzZWQKLQlvbiBCRkQgcHJpdmF0ZSBkYXRhIGhlcmUgKGxpa2UgdGhlIGV4ZWMgZmxhZ3MpLiAgRG8gbm90IHdyaXRlCi0JdGhlIGV4ZWMgaGVhZGVyIGhlcmUuCi0JKHNvbV93cml0ZV9oZWFkZXJzKTogSW5zdGVhZCBkbyBpdCBoZXJlLgotCSogc29tLmggKHN0cnVjdCBzb21kYXRhKTogTmV3IGZpZWxkICJleGVjX2hkciIgZm9yIHRoZSBleGVjdXRhYmxlCi0JZmlsZSBoZWFkZXIuCi0JKG9ial9zb21fZXhlY19oZHIpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0KLVR1ZSBBdWcgMTYgMDA6MTI6MzEgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBpMzg2bGludXguYyAobGludXhfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENyZWF0ZSBzZWN0aW9uCi0JbmFtZWQgLmxpbnV4LWR5bmFtaWMsIG5vdCAuZHluYW1pYy4KLQkobGludXhfYWRkX29uZV9zeW1ib2wpOiBVc2UgLmxpbnV4LWR5bmFtaWMsIG5vdCAuZHluYW1pYy4KLQkoYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShsaW51eF9maW5pc2hfZHluYW1pY19saW5rKTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMTUgMTI6MTY6NTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ2VuLmMgKFNUUklOR19TSVpFX1NJWkUpOiBEZWZpbmUuCi0JKGNvZmZfZml4X3N5bWJvbF9uYW1lKTogVXNlIFNUUklOR19TSVpFX1NJWkUsIG5vdCA0LgotCShjb2ZmX3dyaXRlX3N5bWJvbHMsIGJ1aWxkX3N0cmluZ190YWJsZSk6IExpa2V3aXNlLgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IExpa2V3aXNlLgotCi0JKiBsaWJjb2ZmLWluLmggKG9ial9zeW1ib2xfc2xldyk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGNvZmZfdGRhdGEpOiBSZW1vdmUgdW51c2VkIGZpZWxkcyBpbmRleF9zbGV3LCByYXdfbGluZW5vcywKLQlhbmQgZmxhZ3MuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0KTogRG9uJ3QgaW5pdGlhbGl6ZSByYXdfbGluZW5vcy4KLQkoY29mZl9ta29iamVjdF9ob29rKTogRG9uJ3QgaW5pdGlhbGl6ZSBmbGFncy4KLQotCSogYW91dC10YXJnZXQuaCAoTVlfem1hZ2ljX2NvbnRpZ3VvdXMpOiBEZWZpbmUgYXMgMCBpZiBub3QgYWxyZWFkeQotCWRlZmluZWQuCi0JKE1ZKGJhY2tlbmRfZGF0YSkpOiBVc2UgTVlfem1hZ2ljX2NvbnRpZ3VvdXMsIG5vdCBoYXJkY29kZWQgMC4KLQkqIGkzODZsaW51eC5jIChNWV96bWFnaWNfY29udGlndW91cyk6IERlZmluZS4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBJZiBhIFNIVF9TWU1UQUIgc2VjdGlvbiBpbiBhCi0Jc2hhcmVkIG9iamVjdCBoYXMgU0hGX0FMTE9DIHNldCwgY3JlYXRlIGEgQkZEIHNlY3Rpb24gZm9yIGl0LgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogVGhlcmUgbWF5IGJlIGEgQkZEIHNlY3Rpb24gZm9yIGEKLQlTSFRfU1lNVEFCIHNlY3Rpb24uCi0KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogQWRkIG5hbWUgYXJndW1lbnQuICBJZiBubyBmbGFncwotCWFyZSByZWNvZ25pemVkLCBjaG9zZSBzZWN0aW9uIGZsYWdzIGJhc2VkIG9uIHRoZSBuYW1lLgotCShiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2sgZmllbGQ6IEFkZAotCW5hbWUgYXJndW1lbnQuCi0JKGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spOiBBZGQgbmFtZSBhcmd1bWVudC4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBEb24ndCBhZGp1c3QgdGhlIHNlY3Rpb24KLQlwb3NpdGlvbiBieSBDT0ZGX1BBR0VfU0laRSB1bmxlc3MgU0VDX0FMTE9DIGlzIHNldC4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZnZW4uYyAobWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlKTogUGFzcyBzZWN0aW9uIG5hbWUgdG8KLQliZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rLgotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IEFkZCB1bnVzZWQgbmFtZQotCWFyZ3VtZW50LgotCSogbGliZWNvZmYuaCAoX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncyk6IEFkZCBuYW1lIGFyZ3VtZW50IHRvCi0JcHJvdG90eXBlLgotCi1GcmkgQXVnIDEyIDExOjIyOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChzZWN0aW9uX2Zyb21fZWxmX2luZGV4KTogQ29ycmVjdCBjaGVjayBmb3IgaW52YWxpZAotCXNlY3Rpb24gaW5kZXguCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgdGhlcmUgaXMgbm8gc3ltYm9sCi0JdGFibGUsIHRyeSB1c2luZyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1zb2xhcmlzMiopOiBVc2Ugc29sYXJpczIsIG5vdCBzeXN2NC4KLQlUaGUgbGlua2VyIGRlcGVuZHMgdXBvbiBjb25maWd1cmluZyBmb3Igc29sYXJpczIuCi0JKiBob3N0cy9zb2xhcmlzMi5oOiBOZXcgZmlsZTsgaW5jbHVkZSBob3N0cy9zeXN2NC5oLgotCSogY29uZmlnL3NvbGFyaXMyLm1oOiBOZXcgZmlsZTsgY29weSBvZiBjb25maWcvc3lzdjQubWguCi0KLVdlZCBBdWcgMTAgMTM6MDk6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhZGp1c3Rfel9tYWdpYyk6IE1ha2Ugc3VyZSBkYXRhIHNlY3Rpb24gaXMgcGFkZGVkIHRvCi0JcGFnZSBib3VuZGFyeSB3aGVuIHRoZSBWTUEgaXMgc2V0IGJ5IHRoZSBjYWxsaW5nIHByb2dyYW0uICBGcm9tCi0JRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCi1Nb24gQXVnICA4IDE3OjE4OjQ5IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCVVwZGF0ZSB0byBuczMyayBzdXBwb3J0LCBmcm9tIElhbiBEYWxsIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpLgotCSogYW91dC1uczMyay5jOiBBZGQgZGVjbGFyYXRpb25zIHRoYXQgd2VyZSBpbiBhb3V0LW5zMzJrLmgsIGNoYW5nZQotCWRlY2xhcmF0aW9ucyB0byB0cmFkaXRpb25hbCBmb3JtLgotCShNWV9yZWxvY19ob3d0bywgTVlfcHV0X3JlbG9jKTogQ2hhbmdlIGZyb20gbWFjcm8gdG8gZnVuY3Rpb24uCi0JKG5zMzJrX3JlbG9jYXRlX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLgotCSogYW91dC1uczMyay5oOiBSZW1vdmUuCi0JKiBjcHUtbnMzMmsuYzogQWRkIGRlY2xhcmF0aW9ucyB0aGF0IHdlcmUgaW4gYW91dC1uczMyay5oLCBjaGFuZ2UKLQlkZWNsYXJhdGlvbnMgdG8gdHJhZGl0aW9uYWwgZm9ybS4KLQkobnMzMmtfZmluYWxfbGlua19yZWxvY2F0ZSk6IENhbGwgbnMzMmtfcmVsb2NhdGVfY29udGVudHMuCi0JKiBuZXRic2Q1MzIuYzogUmVmb3JtYXQgdG8gc3RhbmRhcmRzLCBhZGQgY29weXJpZ2h0IG5vdGljZS4KLQkoQVJDSCk6IERvbid0IGRlZmluZS4KLQkoYW91dC1uczMyay5oKTogRG9uJ3QgaW5jbHVkZS4KLQkqIHBjNTMyLW1hY2guYzogRGl0dG8uCi0KLU1vbiBBdWcgIDggMTc6NTU6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX3JlbG9jYXRlKTogRG9uJ3QgdHJ5IHRvIGNvbnZlcnQgcmVsb2NzCi0JYWdhaW5zdCBjb21tb24gc3ltYm9scy4KLQotU2F0IEF1ZyAgNiAyMjoyNzozMCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfY29yZV9maWxlX3ApOiAgSWdub3JlIHNlY3Rpb25zIHRoYXQKLQlhcmUgbm90IGNvbnRhaW5lZCBpbiB0aGUgY29yZSBmaWxlLgotCi1UaHUgQXVnICA0IDExOjMyOjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1tNjhrLmMgKG02OGtfcmVsb2NfdHlwZV9sb29rdXApOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lLgotCSogY2YtbTY4a2x5bnguYyAoX2JmZF9tNjhrY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IERlZmluZS4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBGb3JjZSB0aGUgdm1hIG9mIHNlY3Rpb25zIHdoaWNoCi0JZG8gbm90IGhhdmUgU0VDX0FMTE9DIHNldCB0byBiZSAwLiAgVGhpcyBpcyBuZWVkZWQgdG8gaGFuZGxlCi0JcmVsb2NzIGFnYWluc3QgZGVidWdnaW5nIHNlY3Rpb25zLgotCi1XZWQgQXVnICAzIDE2OjQ1OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IFJld3JvdGUgdG8gY2hhbmdlIHJlbG9jcwotCWFnYWluc3QgbG9jYWxseSBkZWZpbmVkIHN5bWJvbHMgaW50byByZWxvY3MgYWdhaW5zdCBzZWN0aW9uCi0Jc3ltYm9scywgZm9yIFZ4V29ya3MgNS4xLgotCi1XZWQgQXVnICAzIDEwOjM0OjM3IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmMgKGxpbnV4X2FkZF9vbmVfc3ltYm9sKTogT25seSBoYW5kbGUKLQlTSEFSQUJMRV9DT05GTElDVFMgc3BlY2lhbGx5IGlmIEJTRl9DT05TVFJVQ1RPUiBpcyBzZXQuICBTZXQgaGFzaHAKLQlmb3IgYSBHT1Qgb3IgUExUIHN5bWJvbC4gIFNldCBqdW1wIGZpZWxkIG9mIGZpeHVwIGZvciBhIFBMVCBzeW1ib2wuCi0JKGxpbnV4X3RhbGx5X3N5bWJvbHMpOiBDaGVjayBzZWN0aW9uIG9mIHJlYWwgc3ltYm9sLiAgV2hlbiBsb29raW5nCi0JZm9yIGEgYnVpbHRpbiBmaXh1cCwgY2hlY2sgYnVpbHRpbiBhbmQganVtcCBmbGFncy4gIENyZWF0ZSBubyBtb3JlCi0JdGhhbiBvbmUgZml4dXAsIGFuZCBhbHdheXMgY3JlYXRlIG9uZSBpZiB0aGUgcmVhbCBzeW1ib2wgaXMgaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4gIE9ubHkgc3RyaXAgYWJzb2x1dGUgc3ltYm9scy4KLQotV2VkIEF1ZyAgMyAwNTowODoyNCAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogc2V0IGludGVybmFsX2EubWFnaWMgdG8KLQlMWU5YQ09GRk1BR0lDIHdoZW5ldmVyIDY4aywgU1BBUkMgb3IgaTM4NiBMeW54T1MKLQkoeWVzLCB0aGV5IGhhdmUgdGhlIHNhbWUgbWFnaWMgbnVtYmVyISkKLQotVHVlIEF1ZyAgMiAxMDo0MzoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGhwMzAwaHB1eC5jIChCTUFHSUMpOiBEZWZpbmUgYXMgSFBVWF9ET1RfT19NQUdJQywgdG8gbWFrZSB0ZXN0Ci0JaW4gYW91dHguaCB3b3JrIGNvcnJlY3RseS4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoaG93dG9fcmVsbG9uZywgaG93dG9faXBybWVkKTogVXNlIGl0IGFzIHNwZWNpYWxfZnVuY3Rpb24uCi0KLQkqIGxpYmJmZC1pbi5oOiBNb3ZlIGRlY2xhcmF0aW9ucyBvZiBiZmRfcmVhZCwgYmZkX3dyaXRlLCBiZmRfc2VlaywKLQliZmRfdGVsbCwgYmZkX2ZsdXNoLCBhbmQgYmZkX3N0YXQgZnJvbSBoZXJlLi4uCi0JKiBiZmQtaW4uaDogLi4udG8gaGVyZSwgdG8gbWFrZSB0aGVtIHZpc2libGUgdG8gcHJvZ3JhbXMgd2hpY2gKLQlrbm93IG1vcmUgYWJvdXQgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCB0aGFuIEJGRCBkb2VzLgotCSogbGliYmZkLmgsIGJmZC1pbjIuaDogUmVidWlsdC4KLQotTW9uIEF1ZyAgMSAxNzo1NTo1MyAxOTk0ICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfY29yZV9maWxlX3ApOiAgQ29udmVydCB6YWxsb2MgdXNhZ2UKLQl0byBiZmRfemFsbG9jLgotCi1Nb24gQXVnICAxIDEyOjA0OjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZWxmNjQtc3BhcmMuYyAoRUxGX01BWFBBR0VTSVpFKTogRGVmaW5lLgotCi0JRUxGIGxpbmtlciBwYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZWxmY29kZS5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB0eXBlIG9mCi0JX0RZTkFNSUMgdG8gU1RUX09CSkVDVC4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogQWx3YXlzIGNyZWF0ZSBoYXNoIHRhYmxlCi0JZW50cnkuICBTZXQgdHlwZSB0byBTVFRfT0JKRUNULgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3Qgc2V0IHR5cGUgb2Ygd2VhayBkZWZpbmVkIHN5bWJvbCB0bwotCVNUQl9XRUFLIGlmIHN5bWJvbCB3YXMgcmVmZXJlbmNlZC4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDaGVjayBEWU5BTUlDIGFzIHdlbGwgYXMgRVhFQ19QLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcyk6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFNldCB0eXBlIG9mCi0JX0dMT0JBTF9PRkZTRVRfVEFCTEUgdG8gU1RUX09CSkVDVC4KLQkoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogSWdub3JlIGxvY2FsIFBMVDMyIHJlbG9jcy4KLQkoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFRyZWF0IGxvY2FsIFBMVDMyIHJlbG9jcyBhcyBQQzMyLgotCi0JKiBlbGZjb2RlLmggKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDb3JyZWN0IHdlYWsgc3ltYm9sCi0JaGFuZGxpbmcgYWdhaW4uCi0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogRG9uJ3QgdHJ5IHRvIHJlYWQgdGhlIHJlbG9jcwotCWlmIHRoZXJlIGFyZW4ndCBhbnkuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYy0qLXNvbGFyaXMyKik6IFVzZSBzeXN2NCwgbm90IHNvbGFyaXMyLgotCSogaG9zdHMvc29sYXJpczIuaDogUmVtb3ZlLgotCSogY29uZmlnL3NvbGFyaXMyLm1oOiBSZW1vdmUuCi0KLVN1biBKdWwgMzEgMTQ6Mjc6MDQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYywgZWxmMzItaHBwYS5oOiBVcGRhdGUgY29tbWVudCByZWZsZWN0aW5nIHdoaWNoCi0JSFBQQSBFTEYgc3BlYyB0aGUgY29kZSBpbXBsZW1lbnRzLgotCi1UdWUgSnVsIDI2IDE3OjM4OjAxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNwdS1pOTYwLmMgKE1BWF9BUkNIKTogTmV3IG1hY3JvLgotCShjb21wYXRpYmxlKTogVXNlIGl0IGluIGNvbXB1dGluZyBhcnJheSBib3VuZHMuICBQdXQgY29tbWEgYWZ0ZXIKLQlsYXN0IGVudHJ5IGluIGFycmF5LCBmb3IgcmVndWxhcml0eS4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkanVzdCBzcGFjaW5nIGZvciBlYXNpZXIgcmVhZGluZy4KLQotCSogY29mZi1pOTYwLmMgKGhvd3RvX3JlbGxvbmcsIGhvd3RvX2lwcm1lZCwgaG93dG9fb3B0Y2FsbCk6IFVzZQotCUhPV1RPIG1hY3JvLgotCi0JKiBjcHUtaTk2MC5jIChKWCk6IERlZmluZSBhcyBiZmRfbWFjaF9pOTYwX2p4LgotCShzY2FuXzk2MF9tYWNoKTogUmVjb2duaXplIGp4IG1hY2hpbmUuCi0JKE1BWF9BUkNIKTogRGVmaW5lIHRvIGJlIEpYLgotCShjb21wYXRpYmxlKTogQWRkIEpYIHJvdyB0byBhcnJheS4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBKWCBlbnRyeS4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTk2MF9qeCk6IE5ldyBtYWNyby4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogRm9yIEZfSTk2MEpYLCBzZXQgbWFjaGluZQotCXRvIGJmZF9tYWNoX2k5NjBfanguCi0JKGNvZmZfc2V0X2ZsYWdzKTogRm9yIGJmZF9tYWNoX2k5NjBfangsIHNldCBGX0k5NjBKWC4KLQotVHVlIEp1bCAyNiAxMTowNDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IFdoZW4gaGFuZGxpbmcgYSB3ZWFrCi0Jc3ltYm9sLCBjb3JyZWN0IGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBlcXVpdmFsZW50IG5vcm1hbCBzeW1ib2wKLQl3YXMgcmVmZXJlbmNlZC4KLQotCUFkZCBzdXBwb3J0IGZvciBjcmVhdGluZyBzaGFyZWQgbGlicmFyaWVzIHVuZGVyIGkzODYgRUxGIGFuZCBTUEFSQwotCUVMRi4gIEJhc2VkIG9uIHBhdGNoZXMgYnkgRXJpYyBZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogUmVtb3ZlIGNvcHlfb2Zmc2V0IGZpZWxkLgotCUFkZCBnb3Rfb2Zmc2V0IGFuZCBwbHRfb2Zmc2V0IGZpZWxkcy4KLQkoRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQ19NVUxUSVBMRSk6IERvbid0IGRlZmluZS4KLQkoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQ19NVUxUSVBMRSk6IERvbid0IGRlZmluZS4KLQkoRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKTogRGVmaW5lLgotCShzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBjaGVja19yZWxvY3MgZmllbGQuCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IENoYW5nZSByZWxvY3MgZnJvbSBQVFIgdG8KLQlFbGZfSW50ZXJuYWxfUmVsYSAqLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsb2NhbF9nb3Rfb2Zmc2V0cyBmaWVsZC4KLQkoZWxmX2xvY2FsX2dvdF9vZmZzZXRzKTogRGVmaW5lIGFjY2Vzc29yIG1hY3JvLgotCShiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogRG9uJ3QgdXNlIHRoZSBzZWN0aW9uIGRhdGEKLQlyZWxvY3MgZmllbGQuCi0JKGVsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIFVzZQotCW1hY3JvIHRvIHJlbmFtZSB0byBOQU1FKGJmZF9lbGYsbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wpLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBwdXQKLQltYWtlIGFsbCBsb2NhbCBzeW1ib2xzIGR5bmFtaWMuICBEb24ndCBib3RoZXIgd2l0aCB0aGUKLQlEWU5BTUlDX01VTFRJUExFIGZsYWdzLiAgQ2FsbCB0aGUgY2hlY2tfcmVsb2NzIGJhY2tlbmQgZnVuY3Rpb24gaWYKLQlpdCBpcyBkZWZpbmVkLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIFVzZQotCW1hY3JvIHRvIHJlbmFtZSB0byBOQU1FKGJmZF9lbGYsbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucykuICBJZgotCWNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIG1ha2Ugc3VyZSB0aGF0IF9EWU5BTUlDIGlzIGFkZGVkIGFzIGEKLQlkeW5hbWljIHN5bWJvbC4KLQkoZWxmX2xpbmtfcmVhZF9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IElmIGNyZWF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeSwgYWx3YXlzIGNyZWF0ZSBzeW1ib2xzLCBhbmQgYWx3YXlzIG1ha2UgdGhlbSBkeW5hbWljLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBQZXJtaXQgY3JlYXRpb24gb2Ygc2hhcmVkIGxpYnJhcmllcy4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogVXNlIGVsZl9saW5rX3JlYWRfcmVsb2NzIHRvIGdldCB0aGUgcmVsb2NzLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogRG9uJ3QgaW5pdGlhbGl6ZQotCWNvcHlfb2Zmc2V0LiAgSW5pdGlhbGl6ZSBnb3Rfb2Zmc2V0IGFuZCBwbHRfb2Zmc2V0LgotCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZSBhcyAwIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZjMyX2JlZCk6IEluaXRpYWxpemUgY2hlY2tfcmVsb2NzIGZpZWxkLgotCSogZWxmNjQtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyk6IERlZmluZSBhcyAwIGlmIG5vdAotCWRlZmluZWQuCi0JKGVsZjY0X2JlZCk6IEluaXRpYWxpemUgY2hlY2tfcmVsb2NzIGZpZWxkLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaG93dG9fdGFibGUpOiBDaGFuZ2UgUl8zODZfUExUMzIgYW5kCi0JUl8zODZfR09UUEMgdG8gYmUgcGNfcmVsYXRpdmUgYW5kIHBjcmVsX29mZnNldC4KLQkoZWxmX2kzODZfcGljX3BsdDBfZW50cnkpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X3BpY19wbHRfZW50cnkpOiBEZWZpbmUuCi0JKGVsZl9pMzg2X2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogQ3JlYXRlIGEgLmdvdC5wbHQgc2VjdGlvbiwgYW5kCi0JZGVmaW5lIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgaXQuICBJZiBjcmVhdGluZyBhCi0Jc2hhcmVkIGxpYnJhcnksIG1ha2Ugc3VyZSB0aGF0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhZGRlZCBhcyBhCi0JZHluYW1pYyBzeW1ib2wuICBEb24ndCBjcmVhdGUgLnJlbC5ic3MgaWYgY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IG1ha2UgYSBQTFQgZW50cnkgaWYgdGhlCi0Jc3ltYm9sIGFscmVhZHkgaGFzIG9uZS4gIFdoZW4gbWFraW5nIGEgUExUIGVudHJ5LCBzZXQgcGx0X29mZnNldC4KLQlEb24ndCBjcmVhdGUgYSBjb3B5IHJlbG9jIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIERvbid0Ci0Jc2V0IGNvcHlfb2Zmc2V0LCBqdXN0IHNldCBFTEZfTElOS19IQVNIX05FRURTX0NPUFkuCi0JKGVsZl9pMzg2X2FsbG9jYXRlX2R5bmFtaWNfc2VjdGlvbik6IFJlbW92ZS4KLQkoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTG9vayB0aHJvdWdoIGFsbCB0aGUgc2VjdGlvbnMKLQlyYXRoZXIgdGhhbiBhc3N1bWluZyB3ZSBrbm93IHRoZWlyIG5hbWVzLiAgUmVtb3ZlIGFueSBlbXB0eSByZWxvYwotCW9yIHBsdCBzZWN0aW9ucy4gIE9ubHkgYWRkIGEgRFRfREVCVUcgZW50cnkgaWYgbm90IGNyZWF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeS4gIE9ubHkgYWRkIGEgRFRfUExUR09UIGVudHJ5IGlmIHRoZXJlIGlzIGEgUExULgotCUFkZCBhIERUX1RFWFRSRUwgZW50cnkgaWYgcmVxdWlyZWQuCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgdW5kZWZpbmVkIHN5bWJvbHMgd2hlbgotCWNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnkuICBIYW5kbGUgdGhlIHNwZWNpYWwgcmVsb2NhdGlvbiB0eXBlcwotCXNwZWNpYWxseS4KLQkoZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogQ3JlYXRlIGEgUExUIGVudHJ5IGlmIHBsdF9vZmZzZXQKLQlpcyBzZXQuICBJZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBwcm9kdWNlIGEgUElDIFBMVCBlbnRyeS4KLQlPbmx5IG1hcmsgYSBQTFQgc3ltYm9sIGFzIHVuZGVmaW5lZCBpZiBpdCB3YXMgbm90IGRlZmluZWQgYnkgYQotCXJlZ3VsYXIgb2JqZWN0IGZpbGUuICBDcmVhdGUgYSBHT1QgZW50cnkgaWYgZ290X29mZnNldCBpcyBzZXQuCi0JQ3JlYXRlIGEgY29weSByZWxvYyBpZiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkgaXMgc2V0LgotCShlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IENoYW5nZSB0aGUgaGFuZGxpbmcgb2YKLQlEVF9SRUxTWiB0byBzaW1wbHkgc3VidHJhY3Qgb3V0IHRoZSBzaXplIG9mIC5yZWwucGx0LiAgSWYgY3JlYXRpbmcKLQlhIHNoYXJlZCBsaWJyYXJ5LCBwcm9kdWNlIFBJQyBQTFQgY29kZS4KLQkoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lLgotCSogZWxmMzItc3BhcmMuYyAoZWxmX3NwYXJjX2hvd3RvX3RhYmxlKTogQ2hhbmdlIFJfU1BBUkNfR09UMTAsCi0JUl9TUEFSQ19HT1QyMiwgYW5kIFJfU1BBUkNfUEMxMCB0byBub3Qgd2FybiBhYm91dCByZWxvYyBvdmVyZmxvdy4KLQkoZWxmMzJfc3BhcmNfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBjcmVhdGluZyBhIHNoYXJlZAotCWxpYnJhcnksIG1ha2Ugc3VyZSB0aGF0IF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBpcyBhZGRlZCBhcyBhCi0gICAgICAgIGR5bmFtaWMgc3ltYm9sLCBhbmQgc2V0IHRoZSB0eXBlIHRvIFNUVF9PQkpFQ1QuICBMaWtld2lzZSBmb3IKLSAgICAgICAgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXy4gIERvbid0IGNyZWF0ZSAucmVsLmJzcyBpZiBjcmVhdGluZyBhCi0gICAgICAgIHNoYXJlZCBsaWJyYXJ5LgotCShlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IG1ha2UgYSBQTFQgZW50cnkgaWYgdGhlCi0Jc3ltYm9sIGFscmVhZHkgaGFzIG9uZS4gIFdoZW4gbWFraW5nIGEgUExUIGVudHJ5LCBzZXQgcGx0X29mZnNldC4KLQlEb24ndCBjcmVhdGUgYSBjb3B5IHJlbG9jIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIERvbid0Ci0Jc2V0IGNvcHlfb2Zmc2V0LCBqdXN0IHNldCBFTEZfTElOS19IQVNIX05FRURTX0NPUFkuCi0JKGVsZjMyX3NwYXJjX2FsbG9jYXRlX2R5bmFtaWNfc2VjdGlvbik6IFJlbW92ZS4KLQkoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTG9vayB0aHJvdWdoIGFsbCB0aGUgc2VjdGlvbnMKLQlyYXRoZXIgdGhhbiBhc3N1bWluZyB3ZSBrbm93IHRoZWlyIG5hbWVzLiAgT25seSBhZGQgYSBEVF9ERUJVRwotCWVudHJ5IGlmIG5vdCBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgQWRkIGEgRFRfVEVYVFJFTCBlbnRyeSBpZgotCXJlcXVpcmVkLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IHVuZGVmaW5lZCBzeW1ib2xzIHdoZW4KLQljcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LiAgSGFuZGxlIHRoZSBzcGVjaWFsIHJlbG9jYXRpb24gdHlwZXMKLQlzcGVjaWFsbHkuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IENyZWF0ZSBhIFBMVCBlbnRyeSBpZiBwbHRfb2Zmc2V0Ci0JaXMgc2V0LiAgT25seSBtYXJrIGEgUExUIHN5bWJvbCBhcyB1bmRlZmluZWQgaWYgaXQgd2FzIG5vdCBkZWZpbmVkCi0JYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlLiAgQ3JlYXRlIGEgR09UIGVudHJ5IGlmIGdvdF9vZmZzZXQgaXMKLQlzZXQuICBDcmVhdGUgYSBjb3B5IHJlbG9jIGlmIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSBpcyBzZXQuCi0JKGVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogU3RvcmUgZHlub2JqIGluIGEgbG9jYWwKLQl2YXJpYWJsZS4KLQkoZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzKTogRGVmaW5lLgotCi1Nb24gSnVsIDI1IDEyOjIxOjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwYzUzMm1hY2hfdmVjKTogQ2hhbmdlIHRvIHBjNTMybWFjaGFvdXRfdmVjLgotCSogY29uZmlnLmJmZCAobnMzMmstKi1uZXRic2QqKTogVXNlIG5zMzJrLW5ic2QgYXMgYmZkX25hbWUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGNwdS1uczMyay5vLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBhb3V0LW5zMzJrLm8sIG5ldGJzZDUzMi5vLCBtODhrbWFjaDMubywKLQlwYzUzMi1tYWNoLm8uCi0JKiB0YXJnZXRzLmMgKHBjNTMybWFjaGFvdXRfdmVjKTogVXNlIGluc3RlYWQgb2YgcGM1MzJtYWNoX3ZlYy4KLQkqIGNvbmZpZy9wYzUzMi1tYWNoLm10IChERUZBVUxUX1ZFQ1RPUik6IERpdHRvLgotCShTRUxFQ1RfVkVDUyk6IFJlbW92ZS4KLQkqIGNvbmZpZy9uczMyay1uYnNkLm10OiBOZXcgZmlsZSwgd2FzIG5zMzJrLW5ldGJzZC5tdC4KLQkqIGNvbmZpZy9uczMyay1uZXRic2QubXQ6IFJlbW92ZSwgbmFtZSB0b28gbG9uZy4KLQotRnJpIEp1bCAyMiAxMTowNzoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogV2hlbiBjaGFuZ2luZyBhCi0Jc3ltYm9sIHRvIGNvbW1vbiwgc2V0IHRoZSBhbGlnbm1lbnQuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogV2hlbiBjcmVhdGluZyBhIGNvbW1vbiBzeW1ib2wsCi0Jc2V0IHRoZSBhbGlnbm1lbnQuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IFdoZW4gY2hhbmdpbmcgYSBzeW1ib2wgdG8KLQljb21tb24sIHNldCB0aGUgYWxpZ25tZW50LgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBSZXN0cmljdCB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbAotCXRvIHRoZSBhbGlnbm1lbnQgcG93ZXIgZ2l2ZW4gYnkgdGhlIGFyY2hpdGVjdHVyZS4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IFJlbW92ZSBhbGlnbiBmaWVsZC4gIEFkZAotCWNvcHlfb2Zmc2V0IGZpZWxkLgotCSogZWxmY29kZS5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTdG9yZSBhbGlnbm1lbnQgaW4KLQluZXcgYmZkX2xpbmtfaGFzaF9lbnRyeSBmaWVsZCwgbm90IGluIGVsZl9saW5rX2hhc2hfZW50cnkgZmllbGQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBTaW1pbGFyIGNoYW5nZSB3aGVuIGdldHRpbmcgYWxpZ25tZW50LgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogRG9uJ3QgaW5pdGlhbGl6ZSBhbGlnbi4gIERvCi0JaW5pdGlhbGl6ZSBjb3B5X29mZnNldC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogVXNlIGNvcHlfb2Zmc2V0Ci0JZmllbGQgcmF0aGVyIHRoYW4gYWxpZ24gZmllbGQuICBHZXQgYWxpZ25tZW50IHVzaW5nIGJmZF9sb2cyCi0JcmF0aGVyIHRoYW4gc3dpdGNoLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFVzZSBjb3B5X29mZnNldCwKLQlub3QgYWxpZ24uCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBKdXN0IGNoZWNrCi0JU1RBVF9GT1JfRVhFQywgZG9uJ3QgY2hlY2sgTUFDSC4KLQkqIG04OGttYWNoMy5jIChNQUNIKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL2kzODYtbWFjaDMubXQgKFRERUZJTkVTKTogRGVmaW5lIFNUQVRfRk9SX0VYRUMuCi0JKiBjb25maWcvbTg4ay1tYWNoMy5tdCAoVERFRklORVMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9taXBzLW1hY2gzLm10IChUREVGSU5FUyk6IExpa2V3aXNlLgotCi1UaHUgSnVsIDIxIDE3OjI0OjMxIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogaTM4Nm1hY2gzLmM6IFJldmVydGVkIHRvIHZlcnNpb24gZnJvbSBiZWZvcmUgSnVsIDUgMTk5NCBjaGFuZ2VzLgotCi1UaHUgSnVsIDIxIDEyOjI2OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogcmVsb2MuYyAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6IFJlbW92ZSBzcGVjaWFsX2Z1bmN0aW9uMS4KLQlJdCdzIHRoZSB3cm9uZyB3YXkgdG8gZG8gdGhpbmdzLgotCShIT1dUTyk6IENoYW5nZSBhY2NvcmRpbmdseS4KLQkoSE9XVE8yKTogUmVtb3ZlLgotCShfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBSZW1vdmUgcmVmZXJlbmNlcyB0bwotCXNwZWNpYWxfZnVuY3Rpb24xLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogYW91dHguaCAoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8KLQlzcGVjaWFsX2Z1bmN0aW9uMS4KLQkoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotV2VkIEp1bCAyMCAxNTo0Njo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgcnBhdGgKLQlhcmd1bWVudC4gIElmIGl0IGlzIG5vdCBOVUxMLCB1c2UgaXQgdG8gc2V0IERUX1JQQVRILgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVNhdCBKdWwgMTYgMjE6MTA6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBJZiB0aGVyZSBpcyBubwotCWR5bmFtaWMgc3ltdGFiLCByZXR1cm4gZXJyb3IuCi0KLQkqIGxpYmVsZi5oIChFTEZfTElOS19IQVNIX0RFRklORURfV0VBSyk6IERlZmluZS4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgc3ltYm9sIGlzIGRlZmluZWQgYXMKLQl3ZWFrLCBzZXQgRUxGX0xJTktfSEFTSF9ERUZJTkVEX1dFQUsuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBJZiBzeW1ib2wgaXMgZGVmaW5lZCBhcyB3ZWFrLCBtYXJrIGl0Ci0JU1RCX1dFQUsuCi0KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgcmVsb2NzIGZpZWxkLgotCShzaGRyX25hbWUpOiBSZW1vdmU7IHVudXNlZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3JlbG9jX3RhYmxlKTogUmV3cm90ZSB0byBoYW5kbGUgYm90aCBSRUwKLQlhbmQgUkVMQSByZWxvY3MuICBGcmVlIHVwIHRoZSB1bnN3YXBwZWQgcmVsb2NzLiAgUGVybWl0IHRoZSByZWxvY3MKLQl0byBiZSBjYWNoZWQgaW4gdGhlIHNlY3Rpb25fZGF0YS4gIENvcnJlY3QgdGhlIHJlbG9jIGFkZHJlc3MuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBSZW1vdmUuCi0JKGVsZl9jYW5vbmljYWxpemVfcmVsb2MpOiBSZXdyb3RlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBQZXJtaXQgdGhlIHJlbG9jcyB0byBiZSBjYWNoZWQgaW4gdGhlCi0Jc2VjdGlvbiBkYXRhLgotCi1TYXQgSnVsIDE2IDEzOjU1OjM4IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAobTg4Ki1oYXJyaXMtY3h1eCopOiBSZWNvZ25pemUuCi0JKiBob3N0cy9oYXJyaXMuaCAoUE9TSVhfVVRJTUUsIEhBVkVfUFJPQ0ZTKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki1hdGFyaS1zeXN2NCopOiBOZXcgaG9zdC4KLQkobTY4Ki1jYm0tc3lzdjQqKTogVXNlIG02OGt2NCBpbnN0ZWFkIG9mIGFtaXguCi0JKiBob3N0cy9hbWl4Lmg6IFJlbW92ZS4KLQkqIGhvc3RzL202OGt2NC5oOiBOZXcgZmlsZSwgd2FzIGFtaXguaC4KLQotVGh1IEp1bCAxNCAxNToxMjoyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChlbnVtIGJmZF9yZWxvY19jb2RlX3JlYWwsIGJmZF90eXBlLCBzdHJ1Y3QKLQlyZWxvY19ob3d0b19zdHJ1Y3QsIHJlbG9jX2hvd3RvX3R5cGUsIEhPV1RPLCBIT1dUTzIpOiBDb3BpZWQKLQljaGFuZ2VzIG92ZXIgZnJvbSBiZmQtaW4yLmggc28gdGhleSBnZXQgZ2VuZXJhdGVkIHByb3Blcmx5IG5leHQKLQl0aW1lIHNvbWVvbmUgcnVucyAibWFrZSBoZWFkZXJzIi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogdGFyZ2V0cy5jIChuZXRic2Q1MzJfdmVjLCBwYzUzMm1hY2hfdmVjKTogRGVjbGFyZSBjb25zdC4KLQkobTg4a21hY2gzX3ZlYyk6IFJlc3RvcmUgZGVsZXRlZCBkZWNsYXJhdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBBbHBoYWJldGl6ZSB0YXJnZXQgdmVjdG9yIG5hbWVzLgotCi0JKiBjb25maWcvcGM1MzJtYWNoLm1oOiBOZXcgZmlsZS4KLQkoSERFUEZJTEVTLCBIREVGSU5FUyk6IERlZmluZSBoZXJlLgotCSogY29uZmlnL3BjNTMyLW1hY2gubXQgKEhERVBGSUxFUywgSERFRklORVMpOiBEZWxldGVkLgotCSogY29uZmlnL25zMzJrLW5ldGJzZC5tdCAoSERFUEZJTEVTLCBIREVGSU5FUyk6IERlbGV0ZWQuCi0KLQlTdW4gSnVsIDEwIDAwOjA0OjIwIDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBwYzUzMi1tYWNoLmM6IE5ldyBGaWxlLiBwYzUzMi1tYWNoIGEub3V0IGZvcm1hdC4KLQotCSogbmV0YnNkNTMyLmM6IE5ldyBmaWxlLiBwYzUzMi1uZXRic2Q1MzIgYS5vdXQgZm9ybWF0LgotCi0JKiBob3N0cy9wYzUzMm1hY2guaDogTmV3IGZpbGUuIHBjNTMyLW1hY2ggaG9zdCBzdXBwb3J0LgotCi0JKiBjcHUtbnMzMmsuYzogTmV3IGZpbGUuIG5zMzJrIHN1cHBvcnQgY3B1IHNwZWNpZmljIGNvZGUgcmF0aGVyCi0JdGhhbiBmb3JtYXQgc3BlY2lmaWMgY29kZS4KLQotCSogY29uZmlnL3BjNTMyLW1hY2gubXQ6IE5ldyBmaWxlLiBTdXBwb3J0IGZvciBwYzUzMi1tYWNoIHRhcmdldC4KLQotCSogY29uZmlnL25zMzJrLW5ldGJzZC5tdDogTmV3IGZpbGUuIFN1cHBvcnQgZm9yIG5ldGJzZDUzMiB0YXJnZXQuCi0KLQkqIGFvdXQtbnMzMmsuYywgYW91dC1uczMyay5oOiBOZXcgZmlsZXMgc3VwcG9ydGluZyBhb3V0IGZvcm1hdCBmb3IKLQluczMyayBzZXJpZXMuIAotCi0JKiB0YXJnZXRzLmM6IEFkZCBuZXRic2Q1MzJfdmVjIGFuZCBwYzUzMm1hY2hhb3V0X3ZlYyBpbnRvCi0JYmZkX3RhcmdldF92ZWN0b3IgYXJyYXkuIE1vdmUgbmV0YnNkMzg2X3ZlYyB0byBhbHBoYWJldGljIG9yZGVyCi0JbG9jYXRpb24uCi0KLQkqIHJlbG9jLmMgKF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSkgQWRkIHN1cHBvcnQgZm9yCi0Jc3BlY2lhbF9mdW5jdGlvbjEgaW4gaG93dG8uCi0KLQkqIGxpYmFvdXQuaDogYWRkIE1fTlMzMjAzMiwgTV9OUzMyNTMyLCBNXzUzMl9ORVRCU0QgZW50cmllcyBpbgotCW1hY2hpbmVfdHlwZSBlbnVtLgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBwYzUzMm1hY2hfdmVjIGFuZCBuZXRic2Q1MzJfdmVjIGVudHJpZXMuCi0KLQkqIGNvbmZpZy5iZmQ6IGFkZCBwYzUzMm1hY2ggaG9zdCBlbnRyaWVzLiBVc2UgZm9yIGJvdGgKLQluczMyay1wYzUzMi1tYWNoIGFuZCBuczMyay1wYzUzMi1uZXRic2QuCi0KLQkqIGNvbmZpZy5iZmQ6IGl0IGRvZXNuJ3Qgd29yayB0byB1c2UgaTM4Ni1tYWNoMyBmb3IgbnMzMmsqLSotbWFjaC4KLQlhZGQgbnMzMmstcGM1MzItbWFjaCogYW5kIG5zMzJrLSotbmV0YnNkKiBlbnRyaWVzLgotCi0JKiBiZmQtaW4yLmg6IEFkZCBuczMyayBzcGVjaWZpYyByZWxvY2F0aW9ucyB0byBiZmRfcmVsb2NfY29kZV9yZWFsCi0JZW51bS4KLQotCSogYmZkLWluMi5oOiBBZGQgc3BlY2lhbF9mdW5jdGlvbjEgdG8gc3RydWN0IGhvd3RvLiBDaGFuZ2UgSE9XVE8KLQlhbmQgTkVXSE9XVE8gbWFjcm9zIHRvIG1ha2Ugc3BlY2lhbF9mdW5jdGlvbjEgTlVMTC4gTmV3dyBIT1dUTzIKLQltYWNyby4KLQotCSogYmZkLWluMi5oOiBTcGxpdCBkZWZpbml0aW9uIG9mIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QKLQlhbmQgY29ycmVzcG9uZGluZyB0eXBlZGVmIGludG8gdHdvIHN0YXRlbWVudHMuCi0KLQkqIGJmZC1pbjIuaDogQWRkIGVudHJ5IGJmZF9hcmNoX25zMzJrIHRvIGJmZF9hcmNoaXRlY3R1cmUgZW51bS4KLQotCSogYXJjaHVyZXMuYzogQWRkIGJmZF9uczMya19hcmNoIHByb3RvdHlwZSwgYW5kIGVudHJ5IGluCi0JYXJjaHVyZXNfaW5pdF90YWJsZS4gCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogQWxsb3cgZm9yIHRhcmdldCBkZXBlbmRlbnQKLQlNWV9wdXRfcmVsb2MgbWFjcm8uIEFsbG93IGZvciB0YXJnZXQgZGVwZW5kZW50IHNwZWNpYWxfZnVuY3Rpb24xCi0JdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24uIAotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBBbGxvdyBmb3IgdGFyZ2V0Ci0JZGVwZW5kZW50IGRldGVybWluYXRpb24gb2YgcmVsb2MgaG93dG8uIEFsbG93IGZvciB0YXJnZXQgZGVwZW5kZW50Ci0Jc3BlY2lhbF9mdW5jdGlvbjEgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24uCi0KLQkqIGFvdXR4LmggKGdldF9yZWxvY191cHBlcl9ib3VuZCk6IERldGVjdCBic3MgYW5kIHJldHVybiAwLgotCi0JKiBhb3V0eC5oIChzbHVycF9yZWxvY190YWJsZSk6IERldGVjdCBic3MgYW5kIHN1Y2Nlc2Z1bGx5IHJlYWQKLQl6ZXJvIHJlbG9jIGVudHJpZXMuCi0KLQkqIGFvdXR4LmggKG1hY2hpbmVfdHlwZSk6IEFkZCBiZmRfYXJjaF9uczMyayBjYXNlLgotCi0JKiBhb3V0eC5oOiBTdGF0IHRvIGRldGVybWluZSBleGVjdXRhYmxlIHN0YXR1cyBpZiBTVEFUX0ZPUl9FWEVDCi0JaXMgZGVmaW5lZCAobm90IGp1c3QgTUFDSCkuIFVzZSBmc3RhdCBpbnN0ZWFkIG9mIHN0YXQgYW5kIGNoZWNrCi0JZm9yIGZzdGF0IGVycm9yLgotCi0JKiBhb3V0eC5oOiBBbGxvdyB0YXJnZXQgZGVwZW5kZW50IHN3YXBfc3RkX3JlbG9jX3tpbixvdXR9LgotCi0JKiBhb3V0eC5oOiBBbGxvdyBDVE9SUyByZWxvYyBpbmZvIHRvIGJlIGluIHRhcmdldCBkZXBlbmRlbnQgcmVsb2MKLQl0YWJsZS4KLQotCSogYW91dC10YXJnZXQuaDogQXBwbHkgU1dBUF9NQUdJQyAoaWYgZGVmaW5lZCkgYWZ0ZXIKLQlzd2FwX2V4ZWNfaGVhZGVyX2luLCBvdGhlcndpc2Ugd2UgaGF2ZSBtYWdpYyBpbiB0aGUgd3Jvbmcgb3JkZXIuCi0KLVRodSBKdWwgMTQgMTE6NDc6MjcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNwYXJjLmMgKHNwYXJjY29mZl92ZWMpOiBIYXZlIGxlYWRpbmcgdW5kZXJzY29yZXMuCi0KLVR1ZSBKdWwgMTIgMTI6MDg6MTAgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhaXgzODYtY29yZS5jLCBhb3V0ZjEuaCwgY2lzY28tY29yZS5jLCBlbGZjb2RlLmgsIGhwcGFic2QtY29yZS5jLAotCWhwdXgtY29yZS5jLCBpcml4LWNvcmUuYywgbHlueC1jb3JlLmMsIG9zZi1jb3JlLmMsIHB0cmFjZS1jb3JlLmMsCi0JcnM2MDAwLWNvcmUuYywgdHJhZC1jb3JlLmM6ICBSZW1vdmUgU0VDX0FMTE9DIGZsYWcgZnJvbSAucmVnCi0Jc2VjdGlvbnMsIC5yZWcgc2VjdGlvbnMgYXJlIG5vdCBhbGxvY2F0ZWQgYW5kIGNvbnRhaW4gZGVidWcKLQlpbmZvcm1hdGlvbiBvbmx5LgotCSogb3NmLWNvcmUuYyAobWFrZV9iZmRfYXNlY3Rpb24sIG9zZl9jb3JlX2NvcmVfZmlsZV9wKTogIFVzZQotCWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IGluc3RlYWQgb2YgYnVpbGRpbmcgdW5pcXVlIHNlY3Rpb24gbmFtZXMuCi0KLVR1ZSBKdWwgMTIgMTE6NDE6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luKTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9pbiwgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCk6IERlY2xhcmUuCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfYXJnc19oYXNoX3RhYmxlX2luaXQpOiBDb3JyZWN0IGNhc3QuCi0KLQkqIGFvdXQtZW5jYXAuYyAoQVJDSCk6IERvbid0IGRlZmluZS4gIE9ic29sZXRlLgotCSogYW91dDAuYywgYW91dHguaCwgZ2VuLWFvdXQuYywgaHAzMDBic2QuYywgaHAzMDBocHV4LmM6IExpa2V3aXNlLgotCSogaTM4NmFvdXQuYywgaTM4NmJzZC5jLCBpMzg2ZHluaXguYywgaTM4NmxpbnV4LmM6IExpa2V3aXNlLgotCSogaTM4Nmx5bnguYywgbTY4a2x5bnguYywgbWlwc2JzZC5jLCBuZXRic2QzODYuYzogTGlrZXdpc2UuCi0JKiBuZXdzb3MzLmMsIHNwYXJjbHlueC5jLCBzdW5vcy5jOiBMaWtld2lzZS4KLQotTW9uIEp1bCAxMSAyMDowODoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU1REX1NFQ1RJT04pOiBNYWtlIHRoZSBzaXh0aCBhcmd1bWVudCBib29sZWFuLCBub3QKLQl0aGUgc2V2ZW50aC4gIEZyb20gZ2FyeUB0dXZhLnBhY3NlbWkub3ouYXUgKGdhcnkga29wZmYpLgotCi1TdW4gSnVsIDEwIDA5OjEyOjAyIDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBDaGFuZ2UgbmFtZSBvZiBGUkVFIHRvIEJGQ0lfRlJFRQotCWluIG9yZGVyIG5vdCB0byBjb2xsaWRlIHdpdGggTHlueE9TJ3MgZGVmaW5pdGlvbiBvZiBGUkVFIGluCi0JL3Vzci9pbmNsdWRlL3N5cy9wcm9jLmgKLQotVGh1IEp1bCAgNyAxNDoxODowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBEb24ndCBjbG9iYmVyIHRoZSByZWxvY2F0aW9uCi0JdmFsdWUgZm9yIGNvZmYtSW50ZWwtbGl0dGxlIG9yIGNvZmYtSW50ZWwtYmlnLiAgSGFjayB1cG9uIGhhY2suCi0KLVRodSBKdWwgIDcgMTA6MTA6MzQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9zdGQpOiAgQWRkIGVudHJ5IGZvciBHT1QgcmVsb2NhdGlvbnMKLQl3aGljaCBhcmUgcHJlc2VudCBpbiBzdW4zIHNoYXJlZCBsaWJyYXJpZXMsIHRvIGF2b2lkIGFzc2VydGlvbnMKLQl3aGVuIHJlYWRpbmcgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMuCi0KLVRodSBKdWwgIDcgMTA6MTk6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChSX0hQUEFfQ09NUExFWCk6IEZpeCBkdW1iIHR5cG8uIAotCi1XZWQgSnVsICA2IDE5OjIxOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3lzdjQuaCAocXNvcnQsIHN0cnRvbCk6IERvbid0IGRlY2xhcmUuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfb3V0cHV0X3N5bSk6IERvbid0IGNhbGwgb3V0cHV0X3N5bWJvbF9ob29rCi0JaWYgaXQgaXMgTlVMTC4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogQWRkIGlnbm9yZWQgaW5mbwotCWFyZ3VtZW50IHRvIGNvcnJlc3BvbmQgdG8gcmVjZW50IGxpYmVsZi5oIGNoYW5nZS4KLQotV2VkIEp1bCAgNiAwMDo0ODo1NyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayk6ICBOZXcgaG9vayB0bwotCWFkZGl0aW9uYWxseSBjb3B5IG9iamVjdCB0eXBlIGluZm9ybWF0aW9uIGZyb20gdGhlIGFscGhhIGZpbGUKLQloZWFkZXIgdG8gdGhlIEJGRCBmbGFncy4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogIFVzZSBpdC4KLQkoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogIEFkZCBEWU5BTUlDIHRvIG9iamVjdF9mbGFncy4KLQkqIGFvdXQ2NC5jOiAgRml4IHR5cG8gaW4gY29uZGl0aW9uYWwgUU1BR0lDIGRlZmluaXRpb24uCi0KLVdlZCBKdWwgIDYgMDA6MTM6MTcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGFic2QtY29yZS5jIChocHBhYnNkX2NvcmVfY29yZV9maWxlX3ApOiBTYW5pdHkgY2hlY2sgdGhlCi0JdmFsdWUgb2YgY2xpY2tzeiB0byBoZWxwIHdlZWQgb3V0IG5vbiBIUFBBIEJTRCBjb3JlIGZpbGVzLgotCi1UdWUgSnVsICA1IDEzOjI2OjAyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCU1hY2ggMyBzdXBwb3J0LgotCSogY29uZmlnLmJmZCAobTg4Ki0qLW1hY2gzKiwgbWlwcyotZGVjLW1hY2gzKiwgbWlwcyotKi1tYWNoMyopOgotCU5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmhvc3QgKGlbMzRdODYtKi1tYWNoMyosIG5zMzJrLSotbWFjaDMqKTogUmVjb2duaXplCi0JIm1hY2gzIiBpbnN0ZWFkIG9mICJtYWNoIi4KLQkobTg4Ki0qLW1hY2gzKiwgbWlwcyotZGVjLW1hY2gzKiwgbWlwcyotKi1tYWNoMyopOiBOZXcgaG9zdHMuCi0JKiB0YXJnZXRzLmMgKG04OGttYWNoM192ZWMpOiBOZXcgdGFyZ2V0IHZlY3Rvci4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgaTM4Nm1hY2gzX3ZlYyBhbmQgbTg4a21hY2gzX3ZlYywgYnV0Ci0JaW5zaWRlICNpZiAwLgotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKSBbTUFDSF06IFJlY29nbml6ZSBleGVjdXRhYmxlcyBieQotCWNoZWNraW5nIGZvciBleGVjdXRlIHBlcm1pc3Npb24sIGluc3RlYWQgb2YgbG9va2luZyBhdCBlbnRyeQotCXBvaW50LgotCSogaTM4Nm1hY2gzLmM6IFVwZGF0ZSwgZGVmaW5lIE1BQ0gsIE5fVFhUT0ZGLCBOX1RYVEFERFIsCi0JTl9TSEFSRURfTElCLCBkb24ndCBpbmNsdWRlIGFvdXQvKi5oIGZpbGVzLCBldGMuCi0JKiBtODhrbWFjaDMuYzogTmV3IGZpbGUsIG04OGsgTWFjaCAzIHRhcmdldC4KLQkqIGNvbmZpZy9tODhrLW1hY2gzLm10LAljb25maWcvbWlwcy1tYWNoMy5tdDogTmV3IGZpbGVzLCB0YXJnZXQKLQltYWtlZmlsZSBmcmFnbWVudHMuCi0JKiBjb25maWcvaTM4Nm1hY2gzLm1oLCBjb25maWcvbTg4a21hY2gzLm1oLCBjb25maWcvbWlwc21hY2gzLm1oOgotCU5ldyBmaWxlcywgaG9zdAltYWtlZmlsZSBmcmFnbWVudHMuCi0JKiBob3N0cy9tODhrbWFjaDMuaCwgaG9zdHMvbWlwc21hY2gzLmg6IE5ldyBmaWxlcywgaG9zdCBkZWZpbml0aW9ucy4KLQotVHVlIEp1bCAgNSAxMzo1Njo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IEdldCBhbGlnbm1lbnQgb2YgY29tbW9uIHN5bWJvbCBmcm9tCi0Jc3RfdmFsdWUgZmllbGQgb2Ygc2F2ZWQgRUxGIHN5bWJvbCBpbmZvcm1hdGlvbiwgaWYgdGhlcmUgaXMgYW55LgotCi1Nb24gSnVsICA0IDE5OjEzOjMyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoUl9IUFBBX0NPTVBMRVgpOiBEZWZpbmUuCi0JKiBlbGYzMi1ocHBhLmggKFJfSFBQQV9DT01QTEVYKTogRGVmaW5lLgotCShlbGYzMl9ocHBhX3JlbG9jX3R5cGUpOiBEZWxldGUgUl9QQVJJU0NfU1RVQl9DQUxMXzE3LgotCi1GcmkgSnVsICAxIDEyOjA3OjQxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBTdXBwb3J0IGNvZGUgZm9yIGVuYWJsaW5nIHRoZSBuZXcgc3R5bGUgbGlua2VyIGZvciBQQSBFTEYuCi0JKiBlbGZjb2RlLmggKHN3YXBfc3ltYm9sX2luLCBzd2FwX3N5bWJvbF9vdXQpOiBFeHRlcm5hbGl6ZS4KLQkoZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFBhc3MgbGlua19pbmZvIHRvCi0JdGhlIGJlZ2luX3dyaXRlX3Byb2Nlc3NpbmcgaG9vay4KLQkoYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBQYXNzIE5VTEwgZm9yIG5ldyBsaW5rX2luZm8KLQlhcmd1bWVudCB0byBmaW5hbF93cml0ZV9wcm9jZXNzaW5nIGhvb2suCi0JKGVsZl9saW5rX291dHB1dF9zeW0pOiBBY2NlcHQgbmV3ICJpbnB1dF9zZWN0aW9uIiBhcmd1bWVudCBmb3IKLQl0aGUgc3ltYm9scydzIGlucHV0IHNlY3Rpb24uICBBbGwgY2FsbGVycyBjaGFuZ2VkLiAgQ2FsbCB0aGUKLQlsaW5rX291dHB1dF9zeW1ib2xfaG9vayBpZiBpdCdzIGRlZmluZWQuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IENhbGwgdGhlIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgaG9vayBpZgotCWl0J3MgZGVmaW5lZC4KLQkqIGxpYmVsZi5oIChlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IERlY2xhcmUuCi0JKGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBBZGQgbmV3ICJpbmZvIiBhcmd1bWVudC4KLQkoZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCSogZWxmMzItdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogUHJvdmlkZQotCWEgZGVmYXVsdCBkZWZpbml0aW9uLgotCShlbGYzMl9iZWQpOiBBZGQgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2suCi0JKiBlbGY2NC10YXJnZXQuaDogTGlrZXdpc2UuCi0JCi0JKiBNYWpvciByZXdvcmsgb2YgdGhlIFBBIEVMRiBjb2RlLiAgVXNlcyB0aGUgbmV3IHN0eWxlIEJGRAotCWxpbmtlciwgbWFqb3IgY2xlYW51cHMuCi0JKiBocHBhX3N0dWJzLmg6IFJld3JpdGUgZnJvbSBzY3JhdGNoLiAgTXVjaCBzbWFsbGVyIGFuZCBzaW1wbGVyLgotCSogZWxmMzItaHBwYS5oOiBEZWxldGUgYWxsIHN5bWJvbCBleHRlbnNpb24gcmVsYXRlZCBjb2RlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEZWxldGUgZGVjbC4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzLCBlbGYzMl9ocHBhX2J1aWxkX3N0dWJzKTogTmV3IGRlY2xzLgotCSogZWxmMzItaHBwYS5jOiBTeW1ib2wgZXh0ZW5zaW9uIHN0dWZmIG1vdmVkIGZvcm0gZWxmMzItaHBwYS5oCi0JaW50byBlbGYzMi1ocHBhLmMuICBEbyBub3QgaW5jbHVkZSBhb3V0NjQuaC4KLQkodHlwZGVmIGhwcGFfc3R1Yl90eXBlKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX3N0dWJfbmFtZV9saXN0X3N0cnVjdCk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9zdHViX2Rlc2NyaXB0aW9uX3N0cnVjdCk6IERlbGV0ZS4KLQkoYXJnX3JlbG9jX3R5cGUpOiBVc2Ugc2ltcGxlciBlbnVtZXJhdGlvbnMuICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCShhcmdfbG9jYXRpb24sIGFyZ19yZWxvY19yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKGVsZjMyX2hwcGFfc3ltZXh0bl9tYXBfc3RydWN0KTogRGVsZXRlLgotCShnZXRfc3ltYm9sX3ZhbHVlKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2dldF9zeW1fZXh0bik6IERlbGV0ZS4KLQkoZmluZF9zdHVicywgbmV3X3N0dWJzLCB0eXBlX29mX21pc21hdGNoKTogRGVsZXRlLgotCShmaW5kX3N0dWJfYnlfbmFtZSwgYWRkX3N0dWJfYnlfbmFtZSk6IERlbGV0ZS4KLQkoaHBwYV9lbGZfc3R1Yl9maW5pc2gsIGhwcGFfZWxmX3N0dWJfcmVsb2MpOiBEZWxldGUuCi0JKGhwcGFfZWxmX2FyZ19yZWxvY19uZWVkZWQpOiBSZW5hbWVkLiAgU2ltcGxpZnkuCi0JKGhwcGFfZWxmX2J1aWxkX2xpbmtlcl9zdHViLCBocHBhX2VsZl9jcmVhdGVfc3R1Yl9zZWMpOiBEZWxldGUuCi0JKGhwcGFfZWxmX2xvbmdfYnJhbmNoX25lZWRlZF9wKTogRGVsZXRlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEZWxldGUuCi0JKGhwcGFfZWxmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVsZXRlLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcik6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9iYWNrZW5kX2Zha2Vfc2VjdGlvbnMpOiBEZWxldGUuCi0JKGVsZjMyX2hwcGFfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEZWxldGUuCi0JKE5FV19JTlNUUlVDVElPTik6IERlbGV0ZS4KLQkoQ1VSUkVOVF9TVFVCX09GRlNFVCk6IERlbGV0ZS4KLQkoZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3NpemVfc3ltZXh0KTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX3JlYWRfc3ltZXh0X2luZm8pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rKTogTmV3IGZ1bmN0aW9uLgotCShlbGYzMl9ocHBhX25hbWVfb2Zfc3R1Yik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9zaXplX29mX3N0dWIpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZjMyX2hwcGFfYnVpbGRfb25lX3N1Yik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9idWlsZF9zdHVicyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfaHBwYV9zaXplX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShsaW5rZXIsIHN0dWIgYW5kIGFyZ3VtZW50IGhhc2ggdGFibGVzKTogQWRkIGFwcHJvcHJpYXRlCi0Jc3RydWN0dXJlcywgZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgYWxsIHRocmVlCi0JaGFzaCB0YWJsZXMuCi0JKGhwcGFfZWxmX3JlbG9jYXRlX2luc24pOiBEb24ndCBuZWVkIGFyZ3VtZW50IGxvY2F0aW9uIGluZm9ybWF0aW9uCi0JaW4gdGhpcyBmdW5jdGlvbi4KLQkoYWRkX2VudHJ5X3RvX3N5bWV4dF9jaGFpbik6IEFjY2VwdCBhIHN5bWJvbCdzIGFyZ3VtZW50IGxvY2F0aW9uCi0JaW5mb3JtYXRpb24gcmF0aGVyIHRoYW4gdGhlIHN5bWJvbCBpdHNlbGYuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IFNpbXBsaWZ5LgotCShocHBhX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFN0dWIgc2VjdGlvbiBpcyBubyBsb25nZXIgc3BlY2lhbC4KLQkoaHBwYV9lbGZfcmVsb2MpOiBHcmVhdGx5IHNpbXBsaWZ5LgotCShlbGYzMl9ocHBhX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBBY2NlcHQgbGlua19pbmZvIGFyZ3VtZW50LgotCUhhbmRsZSBiZWluZyBjYWxsZWQgZnJvbSB0aGUgQkZEIGJhY2tlbmQgbGlua2VyLgotCShlbGYzMl9ocHBhX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkoZWxmX2hwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IE5vIGxvbmdlciBjYWxsIHN0dWJfZmluaXNoLgotCQotTW9uIEp1biAyNyAxODowNzowNiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBQdXQgaW4gcGFyZW5zIHRvIGdldAotCXByZWNlZGVuY2UgcmlnaHQuCi0KLVN1biBKdW4gMjYgMTg6MDg6MjkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmVsZi5oIChyZWxvY2F0ZV9zZWN0aW9uKTogTmV3IGFyZ3VtZW50ICJvdXRwdXRfbmFtZXMiIGFkZGVkCi0JdG8gcHJvdG90eXBlLgotCSogZWxmY29kZS5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBOZXcgYXJndW1lbnQgIm91dHB1dF9uYW1lcyIKLQlhZGRlZCB0byBwcm90b3R5cGUgb2YgcmVsb2NhdGVfc2VjdGlvbi4gIFBhc3MgdGhlIG91dHB1dCBzeW1ib2wKLQluYW1lcyB0byByZWxvY2F0ZV9zZWN0aW9uLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogVXNlICJvdXRwdXRfbmFtZXMiIHRvCi0JZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIGEgbG9jYWwgc3ltYm9sLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMjQgMDg6MTU6NDIgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JQWRkIFNvbGFyaXMgQkNQICh0aGUgcGFydCBvZiBTb2xhcmlzIHdoaWNoIGFsbG93cyBpdCB0byBydW4KLQlTdW5PUzQgYS5vdXQgZmlsZXMpIGNvcmUgZmlsZSBoYW5kbGluZy4KLQkqIGFvdXRmMS5oIChleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlLCBzd2FwY29yZV9zb2xhcmlzX2JjcCk6Ci0JTmV3IHN0cnVjdHVyZSBhbmQgaXRzIHN3YXAgaW4gZnVuY3Rpb24uCi0JKGludGVybmFsX3N1bm9zX2NvcmUpOiAgTmV3IG1lbWJlciBjX2RhdGFfYWRkciwgdG8gcmVjZWl2ZSB0aGUKLQlzdGFydCBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlY3Rpb24gaW4gdGhlIGNvcmUgZmlsZS4KLQkoc3dhcGNvcmVfc3VuMywgc3dhcGNvcmVfc3BhcmMsIHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBVc2UgaXQuCi0JKHN1bm9zNF9jb3JlX2ZpbGVfcCk6ICBSZWNvZ25pemUgU29sYXJpcyBCQ1AgY29yZSBmaWxlLgotCShzdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogIEFsd2F5cyBpbmRpY2F0ZSBtYXRjaAotCWZvciBTb2xhcmlzIEJDUCBjb3JlIGZpbGVzLgotCi1UaHUgSnVuIDIzIDE1OjMxOjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgc2hhcmVkIGxpYnJhcmllcywgZnJvbSBFcmljCi0JWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPi4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogSWYgRFlOQU1JQywgc2V0IGVfdHlwZSB0byBFVF9EWU4uCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IElmIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwKLQljcmVhdGUgZHluYW1pYyBzZWN0aW9ucyBmb3IgZmlyc3QgaW5wdXQgQkZEIHdpdGggdGhlIHJpZ2h0IGZvcm1hdC4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBjcmVhdGUgLmludGVycCBzZWN0aW9uCi0JaWYgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogU2tpcCBkeW5hbWljIHNlY3Rpb25zIGluIGlucHV0IGZpbGUuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IElmIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGl0J3MgT0sgZm9yCi0JZHlub2JqIHRvIGhhdmUgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdCBTRUNfSU5fTUVNT1JZLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHNldCAuaW50ZXJwCi0Jc2VjdGlvbiBpZiBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBEb24ndCBzZXQgRFlOQU1JQyBqdXN0IGJlY2F1c2UgdGhlcmUKLQlpcyBhbiBTSFRfRFlOQU1JQyBzZWN0aW9uLgotCi0JKiBjZi1pMzg2bHlueC5jIChpMzg2Y29mZl92ZWMpOiBEb24ndCBpbmNsdWRlIERZTkFNSUMgaW4KLQlvYmplY3RfZmxhZ3MuCi0JKiBjb2ZmLXNwYXJjLmMgKHNwYXJjY29mZl92ZWMpOiBMaWtld2lzZS4KLQkqIGhwcGFic2QtY29yZS5jIChocHBhYnNkX2NvcmVfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogRG9uJ3Qgc2V0IFNFQ19SRUxPQwotCWp1c3QgYmVjYXVzZSBEWU5BTUlDIGlzIHNldC4KLQotVGh1IEp1biAyMyAxMjo1Mzo0MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMgYW5kCi0JLS13aXRoLTY0LWJpdC1iZmQgdG8gLS1lbmFibGUtNjQtYml0LWJmZC4KLQkqIE1ha2VmaWxlLmluLCBtcHctbWFrZS5pbiwgdGFyZ2V0cy5jOiBDaGFuZ2UgY29tbWVudHMuCi0KLVdlZCBKdW4gMjIgMTc6NTk6NTkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLWVsZiopOiBOZXcgdGFyZ2V0LCBqdXN0IGxpa2UKLQlwb3dlcnBjLSotc3lzdjQqLgotCi0JKiBsaW5rZXIuYyAoRkFJTCk6IFVuZGVmaW5lIG1hY3JvIGJlZm9yZSBkZWZpbmluZyBhcyBlbnVtLgotCi1XZWQgSnVuIDIyIDEwOjUyOjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJbml0aWFsaXplCi0JcGFzcyBmcm9tIGFiZmQtPmFyY2hpdmVfcGFzcywgYW5kIHNhdmUgaXQgdGhlcmUgYXMgd2VsbC4KLQotCSogaGFzaC5jIChiZmRfaGFzaF9hbGxvY2F0ZSk6IERvbid0IGNhbGwgYmZkX3NldF9lcnJvciBpZgotCW9ic3RhY2tfYWxsb2MgcmV0dXJucyBOVUxMIHVubGVzcyB0aGUgc2l6ZSBpcyBub24temVyby4KLQotCSogbGlua2VyLmMgKGFyY2hpdmVfaGFzaF9hbGxvY2F0ZSk6IERlZmluZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyk6IFVzZSBhcmNoaXZlX2hhc2hfYWxsb2NhdGUKLQlyYXRoZXIgdGhhbiBvYnN0YWNrX2FsbG9jLCBmb3IgY2xhcml0eS4KLQotCSogZWxmY29kZS5oIChlbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogQ29ycmVjdC4KLQotCSogYW91dDY0LmMgKEJNQUdJQywgUU1BR0lDKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBGcm9tCi0JUGV0ZXIgU2NoYXVlciA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+LgotCi0JTGludXggWk1BR0lDIHN1cHBvcnQgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jYWlzLmNvbT4uCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBmaWVsZCB6bWFnaWNfZGlza19ibG9ja19zaXplLgotCSogYW91dC10YXJnZXQuaCAoTVkoY2FsbGJhY2spKTogT25seSBzZXQgYWxpZ25tZW50IGFjY29yZGluZyB0bwotCWFyY2hpdGVjdHVyZSBpZiB0aGUgc2VjdGlvbiBzaXplcyBhcmUgYWxpZ25lZCB0byB0aGF0IGFsaWdubWVudCwKLQlmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQkoTVkoc2V0X3NpemVzKSk6IEluaXRpYWxpemUgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSBmaWVsZC4KLQkqIGFvdXR4LmggKGFkanVzdF96X21hZ2ljKTogU2V0IHp0aWggaWYgdXNpbmcgcV9tYWdpY19mb3JtYXQuICBTZXQKLQl0ZXh0IHNlY3Rpb24gZmlsZXBvcyB0byB6bWFnaWNfZGlza19ibG9ja19zaXplIGlmIG5vdCB6dGloLiAgVXNlIGEKLQlkaWZmZXJlbnQgcGFkZGluZyBhbGdvcml0aG0gaWYgbm90IHp0aWguCi0JKiBpMzg2bGludXguYyAoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogSnVzdCBza2lwIE5fU1RBQiBhbmQgTl9GTgotICAgICAgICBzeW1ib2xzOyBkb24ndCBsb29rIHRoZW0gdXAgaW4gdGhlIGhhc2ggdGFibGUuICBGcm9tCi0gICAgICAgIHJhbHBoY0BweXJhbWlkLmNvbSAoUmFscGggQ2FtcGJlbGwpLgotCi1UdWUgSnVuIDIxIDExOjQ3OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29mZi1nbzMyLmMgKGdvMzJjb2ZmX2FyY2hpdmVfcCk6IFJlbW92ZSB1bnVzZWQgZnVuY3Rpb24uCi0KLQkqIHNlY3Rpb24uYyAoYmZkX2Fic19zZWN0aW9uKTogTWFrZSBjb25zdC4KLQkoYmZkX2Fic19zZWN0aW9uX3B0ciwgYmZkX2lzX2Fic19zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfdW5kX3NlY3Rpb24pOiBNYWtlIGNvbnN0LgotCShiZmRfdW5kX3NlY3Rpb25fcHRyLCBiZmRfaXNfdW5kX3NlY3Rpb24pOiBEZWZpbmUuCi0JKGJmZF9jb21fc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF9jb21fc2VjdGlvbl9wdHIpOiBEZWZpbmUuCi0JKGJmZF9pbmRfc2VjdGlvbik6IE1ha2UgY29uc3QuCi0JKGJmZF9pbmRfc2VjdGlvbl9wdHIsIGJmZF9pc19pbmRfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2Fic19zeW1ib2wsIGJmZF9jb21fc3ltYm9sKTogTWFrZSBjb25zdC4KLQkoYmZkX3VuZF9zeW1ib2wsIGJmZF9pbmRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGdsb2JhbF9zeW1zKTogQ2FzdCBpbml0aWFsaXphdGlvbiBvZiBzZWN0aW9uIGZpZWxkLgotCShTVERfU0VDVElPTik6IERlZmluZSBhcyBjb25zdCwgYW5kIGNhc3QgaW5pdGlhbGl6YXRpb25zLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogTWFueSBmaWxlczogQ2hhbmdlIHVzZXMgb2YgYmZkX2Fic19zZWN0aW9uLCBldGMuLCB0byB1c2UKLQliZmRfYWJzX3NlY3Rpb25fcHRyIG9yIGJmZF9pc19hYnNfc2VjdGlvbiwgZXRjLgotCi1Nb24gSnVuIDIwIDExOjA2OjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogTWFueSBmaWxlczogY2hhbmdlIGFsbCBiZmRfdGFyZ2V0IHZlY3RvcnMgdG8gYmUgY29uc3QuICBDaGFuZ2UKLQlhbGwgdXNlcyBvZiBiZmRfdGFyZ2V0ICogdG8gYmUgY29uc3QgYmZkX3RhcmdldCAqLiAgQ2hhbmdlCi0JYmZkX3RhcmdldF92ZWN0b3IgYW5kIGJmZF9kZWZhdWx0X3ZlY3RvciBhcnJheXMgdG8gYmUgY29uc3QKLQliZmRfdGFyZ2V0ICogY29uc3QgKi4KLQotCSogZWNvZmYuYywgbGliZWNvZmYuaCwgZWNvZmZzd2FwLmgsIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmMsCi0JZWxmMzItbWlwcy5jOiBSZW5hbWVkIGFsbCBleHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMgd2hpY2gKLQlhcmUgbG9jYWwgdG8gQkZEIHRvIHN0YXJ0IHdpdGggX2JmZF9lY29mZiBpbnN0ZWFkIG9mIGp1c3QgZWNvZmYuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N3YXBfdGlyX2luKTogQ2hhbmdlIGlucHV0IGFyZ3VtZW50IHRvIGNvbnN0LgotCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBMaWtld2lzZS4KLQkoZWNvZmZfc3dhcF9ybmR4X2luLCBlY29mZl9zd2FwX3JuZHhfb3V0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8pOiBBZGQgbmV3IGFyZ3VtZW50cyB0byBjb3JyZXNwb25kIHRvCi0JcmVhZF9kZWJ1Z19pbmZvIGVudHJ5IHBvaW50IGluIGVjb2ZmX2RlYnVnX3N3YXAgc3RydWN0dXJlLgotCUNoYW5nZSBhbGwgY2FsbHMuCi0JKiBsaWJlY29mZi5oIChlY29mZl9zbHVycF9zeW1ib2xpY19pbmZvKTogQ2hhbmdlIGRlY2xhcmF0aW9uLgotCSogZWNvZmZzd2FwLmggKGVjb2ZmX3N3YXBfdGlyX2luLCBlY29mZl9zd2FwX3Rpcl9vdXQpOiBEZWNsYXJlLgotCShlY29mZl9zd2FwX3JuZHhfaW4sIGVjb2ZmX3N3YXBfcm5keF9vdXQpOiBEZWNsYXJlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIG5ldwotCWVjb2ZmX2RlYnVnX3N3YXAgZmllbGRzLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFVuZGVmaW5lIFJFQUQuCi0JKG1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXApOiBJbml0aWFsaXplIG5ldyBlY29mZl9kZWJ1Z19zd2FwCi0JZmllbGRzLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfYmlnbWlwc192ZWMpOiBVc2UgZWNvZmYubyBhbmQKLQllY29mZmxpbmsuby4KLQkoYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2JpZ192ZWMsIGVjb2ZmX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0xJQlMpOiBSZW1vdmUgZWNvZmYubyBhbmQgZWNvZmZsaW5rLm8uCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGVjb2ZmLm8gYW5kIGVjb2ZmbGluay5vLgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBDaGVjayBmbGF2b3VyIG9mIHN1Yiwgbm90IGFiZmQsCi0Jd2hlbiBjb21wdXRpbmcgcmVsb2Mgc2l6ZXMuICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCB0cnkgdG8gY29tcHV0ZSBtYXhpbXVtCi0JcmVsb2MgY291bnQgb3Igc2l6ZSBmb3IgYSBub24tRUxGIGZpbGUuCi0KLQkqIG1pcHNic2QuYyAoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IERlZmluZSB0byBhdm9pZCB3YXJuaW5nLgotCi0JKiBocDMwMGhwdXguYyAoTVlfZmluYWxfbGlua19jYWxsYmFjayk6IERlZmluZSB0byBhdm9pZCB3YXJuaW5nLgotCShCTUFHSUMsIFFNQUdJQyk6IERlZmluZTsgdXNlZCBieSBhb3V0eC5oLgotCShNWShzbHVycF9zeW1ib2xfdGFibGUpKTogQ2hhbmdlIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MKLQljYWxscyB0byB1c2UgbmV3IHBhcmFtZXRlcnMuCi0KLUZyaSBKdW4gMTcgMTQ6NDU6MzIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBTZXQgdGhlIGFsaWdubWVudHMgb2YgdGhlIHRleHQsCi0JZGF0YSBhbmQgYnNzIHNlY3Rpb25zIGFmdGVyIGRldGVybWluaW5nIHRoZSBhcmNoaXRlY3R1cmUuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogVHJlYXQgYSBjb21tb24gc3ltYm9sIGZyb20gYQotCWR5bmFtaWMgb2JqZWN0IGFzIGJlaW5nIGluIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIG9iamVjdCwgcmF0aGVyCi0JdGhhbiBhcyBiZWluZyB1bmRlZmluZWQuCi0KLUZyaSBKdW4gMTcgMTE6MTY6NTAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmhwcGEuaCAoYmZkX2hwcGFfaW5zbjJmbXQsIGhwcGFfcmVidWlsZF9pbnNuKTogTWFrZSBJTkxJTkUuCi0KLQkqIGVsZjMyLWhwcGEuaCAoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IERlbGV0ZSBkZWNsLgotCi1UaHUgSnVuIDE2IDIzOjM2OjIzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKGVsZl9saW5rX2lucHV0X2JmZCk6IERvbid0IHRyeSB0byByZWFkIGxvY2FsIHN5bWJvbHMKLQlpZiB0aGVyZSBhcmVuJ3QgYW55IGluIHRoZSBpbnB1dCBmaWxlLgotCi1UaHUgSnVuIDE2IDE0OjI1OjIyIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogaTM4NmxpbnV4LmM6IE1hbnkgbmV3IGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgZm9yIGxpbmtlcgotCXN1cHBvcnQgZm9yIExpbnV4IHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBiZmQtaW4uaCAoYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLVRodSBKdW4gMTYgMTQ6MjM6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBJZiBzZWNvbmQgYXJndW1lbnQgaXMgYGBfJycsIHRoZW4sIGluc3RlYWQgb2YKLQllY2hvaW5nIGNvbmZpZyBmaWxlIG5hbWUsIGVjaG8gd2hldGhlciB0YXJnZXQgdXNlcyBsZWFkaW5nCi0JdW5kZXJzY29yZXMgb24gc3ltYm9sIG5hbWVzLiAgQWRkIGFwcHJvcHJpYXRlIHNldHRpbmdzIHRvCi0JZGlmZmVyZW50IGNhc2VzLiAgVXNlZCBieSBiaW51dGlscy9jb25maWd1cmUuaW4gdG8gc2V0IGRlZmF1bHQgZm9yCi0JYysrZmlsdC4KLQotCSogZWxmY29kZS5oIChlbGZfYmZkX2ZpbmFsX2xpbmspOiBJZiB0cnlpbmcgdG8gZ2VuZXJhdGUgYSBzaGFyZWQKLQlvYmplY3QsIHdhcm4gYW5kIHJldHVybiBmYWxzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkpOiBBY2NlcHQgQk1BR0lDIG9iamVjdHMKLQlhbmQgdHJlYXQgdGhlbSBhcyBPTUFHSUMuCi0KLVdlZCBKdW4gMTUgMTg6MDI6MjEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCUVuYWJsZSBzcGFyYyB2OSBzdXBwb3J0IGZvciByZWxlYXNlLiAgTm90ZSB0aGF0IHRoaXMgaXMgc3RpbGwgYQotCXdvcmsgaW4gcHJvZ3Jlc3MsIHBlbmRpbmcgcmVsZWFzZSBvZiBhbiBBQkkgc3BlY2lmaWNhdGlvbi4KLQkqIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbjogSW5jbHVkZSBzcGFyYyB2OSBlbGYgY29uZmlnLgotCSogZWxmY29kZS5oIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgc3BhcmMgdjkgKDY0IGJpdCkuCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsKTogTmV3IHJlbG9jIHR5cGVzLgotCSogZWxmNjQtc3BhcmMuYzogSW1wbGVtZW50IGVsZjY0LXNwYXJjIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluLCB0YXJnZXRzLmM6IFVwZGF0ZWQuCi0KLVdlZCBKdW4gMTUgMDE6MzQ6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsaWJlbGYuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBOZXcgZmllbGQgZHRfbmVlZGVkX25hbWUuCi0JKGVsZl9kdF9uZWVkZWRfbmFtZSk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIGVsZmNvZGUuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZWxmX2R0X25lZWRlZF9uYW1lCi0JaXMgc2V0LCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBmaWxlbmFtZSBmb3IgdGhlIERUX05FRURFRCBkeW5hbWljCi0JZW50cnkuCi0JKiBlbGYuYyAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQWRkIHNpbnRlcnBwdHIKLQlhcmd1bWVudCwgYW5kIHNldCBpdCB0byB0aGUgLmludGVycCBzZWN0aW9uLgotCSogYmZkLWluLmggKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVcGRhdGUgcHJvdG90eXBlLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGNvZmYtc3BhcmMuYyAoU1dBUF9PVVRfUkVMT0NfRVhUUkEpOiBEZWZpbmUgdG8gY2xlYXIgdGhlIHJfc3BhcmUKLQlmaWVsZCBvZiB0aGUgcmVsb2MgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBiZSBnYXJiYWdlLgotCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9hcm1hcCk6IFJlY29nbml6ZSBfXy5TWU1ERUYvIGFzIHdlbGwgYXMKLQlfXy5TWU1ERUY7IHRoZSBmb3JtZXIgd2FzIHVzZWQgaW4gb2xkIExpbnV4IGFyY2hpdmVzLiAgRnJvbQotCWpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgotCi0JKiBpMzg2bGludXguYyAoaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IERlZmluZTsgbGlrZQotCU1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgaW4gYW91dC10YXJnZXQuaCwgYnV0IHNldCBNQUNIVFlQRSB0bwotCU1fMzg2LiAgRnJvbSBqcnNAd29ybGQuc3RkLmNvbSAoUmljayBTbGFka2V5KS4KLQkoTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVmaW5lLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogVHJlYXQgTl9TRVRWIHN5bWJvbHMKLQlhcyBOX0RBVEEgc3ltYm9scy4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0KLQkqIGFvdXR4Lmg6IFJld3JpdGUgc3ltYm9sIGR1cGxpY2F0ZSBlbGltaW5hdGlvbiB0byB1c2UgQkZEIGhhc2gKLQl0YWJsZXMuCi0JKHN0cnVjdCBzdHJpbmd0YWJfZW50cnksIHN0cnVjdCBzdHJpbmd0YWJfZGF0YSk6IFJlbW92ZS4KLQkoSEFTSE1BWExFTiwgSEFTSF9DSEFSLCBoYXNoLCBjb21wYXJlLCBsb2cyLCBlbWl0X3N0cnRhYik6IFJlbW92ZS4KLQkoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5LCBzdHJ1Y3Qgc3RydGFiX2hhc2gpOiBEZWZpbmUuCi0JKHN0cnRhYl9oYXNoX25ld2Z1bmMsIHN0cnRhYl9oYXNoX2xvb2t1cCk6IERlZmluZS4KLQkoc3RyaW5ndGFiX2ZyZWUsIGVtaXRfc3RyaW5ndGFiKTogRGVmaW5lLgotCShzdHJpbmd0YWJfaW5pdCwgYWRkX3RvX3N0cmluZ3RhYik6IFJld3JpdGUuCi0JKE5BTUUoYW91dCx3cml0ZV9zeW1zKSk6IFVzZSBuZXcgc3RyaW5ndGFiIGNvZGUuCi0JKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbywgTkFNRShhb3V0LGZpbmFsX2xpbmspKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzLCBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIGJmZC1pbi5oIChCRkRfVFJBRElUSU9OQUxfRk9STUFUKTogRGVmaW5lIG5ldyBCRkQgZmxhZyB0bwotCXJlcXVlc3QgQkZEIHRvIHdyaXRlIG9iamVjdCBpbiB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0LCB3aGF0ZXZlcgotCXRoYXQgbWVhbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIGJhY2tlbmQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGhhc2guYyAoYmZkX2hhc2hfYWxsb2NhdGUpOiBJZiBvYnN0YWNrX2FsbG9jIGZhaWxzLCBzZXQKLQliZmRfZXJyb3Jfbm9fbWVtb3J5LgotCi1UdWUgSnVuIDE0IDEzOjAwOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dGRhdGEpOiBBZGQgcV9tYWdpY19mb3JtYXQgdG8gc3ViZm9ybWF0Ci0JZW51bS4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWZpbmUgYXMgZnVuY3Rpb24KLQlpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgQ29weSBzdWJmb3JtYXQgaW5mb3JtYXRpb24uCi0JKE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyKTogRGVmaW5lIGFzIDAgaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IFVzZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciByYXRoZXIgdGhhbiAwLgotCShNWV9maW5hbF9saW5rX2NhbGxiYWNrKTogUmVuYW1lIGZyb20gZmluYWxfbGlua19jYWxsYmFjaywgYW5kCi0JZGVmaW5lIG9ubHkgaWYgTVlfZmluYWxfbGlua19jYWxsYmFjayBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLgotCShNWV9iZmRfZmluYWxfbGluayk6IFJlbmFtZSB1c2Ugb2YgZmluYWxfbGlua19jYWxsYmFjayB0bwotCU1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2suCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IEhhbmRsZSBRTUFHSUMgbGlrZQotCVpNQUdJQywgYnV0IHNldCB0aGUgc3ViZm9ybWF0IHRvIHFfbWFnaWNfZm9ybWF0LiAgQWJvcnQgaWYgdGhlCi0JbWFnaWMgbnVtYmVyIGlmIG5vdCByZWNvZ25pemVkLgotCShhZGp1c3Rfel9tYWdpYyk6IFVzZSBRTUFHSUMgaWYgcV9tYWdpY19mb3JtYXQuCi0JKiBpMzg2bGludXguYyAoTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIpOiBEZWZpbmUgYXMgMS4KLQkoaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoTVlfYmZkX2ZpbmFsX2xpbmspOiBEZWZpbmUgYXMgaTM4NmxpbnV4X2JmZF9maW5hbF9saW5rLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IENoZWNrIGJvdGggc2VjdGlvbiBhbmQKLQlvdXRwdXRfc2VjdGlvbiBhZ2FpbnN0IHNlY3Rpb25zIG9mIGFiZmQuCi0KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgdHlwZSBvZgotCXdyaXR0ZW4gZnJvbSBib29sZWFuIHRvIGNoYXIuICBBZGQgbmV3IGZpZWxkIHNtYWxsLgotCSogZWNvZmYuYyAoZWNvZmZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHdyaXR0ZW4gdG8gMAotCXJhdGhlciB0aGFuIGZhbHNlLiAgSW5pdGlhbGl6ZSBzbWFsbCB0byAwLgotCShlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBJZiBFQ09GRiB0eXBlIGlzIHNjU1VuZGVmaW5lZCwgc2V0Ci0Jc21hbGwuICBJZiBzbWFsbCBpcyBzZXQsIGFuZCBoYXNoIHRhYmxlIHR5cGUgaXMgY29tbW9uLCBmb3JjZSB0aGUKLQlzeW1ib2wgaW50byBhIHNlY3Rpb24gbmFtZWQgU0NPTU1PTiBhbmQgY2hhbmdlIHRoZSBFQ09GRiB0eXBlIGZyb20KLQlzY0NvbW1vbiB0byBzY1NDb21tb24uCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBTZXQgd3JpdHRlbiB0byAxIHJhdGhlciB0aGFuIHRydWUuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogQ29ycmVjdCBKTVBBRERSIHJlbG9jCi0Jb3ZlcmZsb3cgY2hlY2sgdG8gY29uc2lkZXIgc2VjdGlvbiBWTUEgb2YgaW5wdXQgZmlsZS4KLQotTW9uIEp1biAxMyAxNDoyMDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXRmMS5oIChhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgYQotCW1hY2hpbmUgdHlwZSBvZiA2ODAwMC4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxtYWNoaW5lX3R5cGUpKTogQWRkIG5ldyBhcmd1bWVudCB1bmtub3duLgotCVNldCAqdW5rbm93biB0byB0cnVlIGlmIG1hY2hpbmUgdHlwZSBpcyByZWFsbHkgdW5rbm93biwgYXMgb3Bwb3NlZAotCXRvIE1fVU5LTk9XTiBmb3IgdGhlIDY4MDAwLgotCShOQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkpOiBDaGFuZ2UgTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkgY2FsbAotCWFjY29yZGluZ2x5LgotCSogbGliYW91dC5oIChOQU1FKGFvdXQsbWFjaGluZV90eXBlKSk6IEFkZCBuZXcgYXJndW1lbnQgdG8KLQlwcm90b3R5cGUuCi0KLVN1biBKdW4gMTIgMjA6MjE6MDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChFWEVDX0FVWF9JRCk6IERlZmluZSBiYXNlZCBvbiBhdmFpbGFibGl0eSBvZiBIUFVYX0FVWF9JRAotCW9yIEhJVVhfQVVYX0lELgotCShzb21fYmVnaW5fd3JpdGluZyk6IFVzZSBFWEVDX0FVWF9JRCBpbnN0ZWFkIG9mIEhQVVhfQVVYX0lELgotCShzb21fd3JpdGVfYXJtYXApOiBVc2UgQ1BVX1BBX1JJU0MxXzAgYXMgdGhlIG1hZ2ljIG51bWJlci4gIE5vdGUKLQlzb20uYyBpcyBjYXJlZnVsIHRvIGFsd2F5cyBkZWZpbmUgQ1BVX1BBX1JJU0MxXzAuCi0KLVNhdCBKdW4gMTEgMTY6MzI6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIHdlYWsgc3ltYm9scyBhcyBhbiBleHRlbnNpb24gdG8gYS5vdXQuCi0JKiBhb3V0eC5oIChzeW1faW5fdGV4dF9zZWN0aW9uKTogRG9uJ3QgZGVmaW5lLgotCShzeW1faW5fZGF0YV9zZWN0aW9uLCBzeW1faW5fYnNzX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc3ltX2lzX3VuZGVmaW5lZCwgc3ltX2lzX2dsb2JhbF9kZWZuKTogTGlrZXdpc2UuCi0JKHN5bV9pc19kZWJ1Z2dlcl9pbmZvLCBzeW1faXNfZm9ydHJhbmNvbW1vbik6IExpa2V3aXNlLgotCShzeW1faXNfYWJzb2x1dGUsIHN5bV9pc19pbmRpcmVjdCk6IExpa2V3aXNlLgotCSh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogUmV3cml0ZSBmb3IgY2xhcml0eS4gIFJlYXJyYW5nZQotCWFyZ3VtZW50cyBhbmQgY2hhbmdlIGNhbGxlci4gIEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzKTogRG9uJ3QgaWdub3JlIHdlYWsgc3ltYm9scy4gIFB1bGwKLQlvYmplY3QgaW4gZnJvbSBhcmNoaXZlIGlmIGEgd2VhayBkZWZpbnRpb24gaXMgZm91bmQgZm9yIGFuCi0JZXhpc3RpbmcgdW5kZWZpbmVkIHN5bWJvbC4KLQkoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogUHV0IGFsbCBjYXNlcyBpbiBzd2l0Y2guICBTZXQgZmxhZ3Mgb2YgYW4KLQl1bmRlZmluZWQgc3ltYm9sIHRvIDAuICBIYW5kbGUgd2VhayBzeW1ib2xzLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCSogc3Vub3MuYyAoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotRnJpIEp1biAxMCAxMzoyNToxMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogSGFuZGxlIC5ic3Mgc2VjdGlvbi4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQotCSogY29mZi1pOTYwLmMgKGNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCk6IEFkZCBCRkRfUkVMT0NfQ1RPUi4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sKTogRG9uJ3QgYXNzdW1lCi0JdGhlIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sIGlzIG5vdCBOVUxMLgotCi1XZWQgSnVuICA4IDIzOjE1OjUzIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX29iamVjdF9wKTogIFNldCBFWEVDX1AgYW5kIHN0YXJ0IGFkZHJlc3MgZm9yIEdEQi4KLQotV2VkIEp1biAgOCAyMzo1NzozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMpOiBEb24ndCB0cnkgdG8gcmVhZCB0aGUKLQlzdHJpbmdzIGlmIHRoZXJlIGFyZSBubyBzeW1ib2xzLgotCShhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogVXNlIHRoZSBvdXRwdXQgc2VjdGlvbiB3aGVuCi0Jd29ya2luZyBvdXQgdGhlIHR5cGUuCi0KLVR1ZSBKdW4gIDcgMTM6MjU6MDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBQdXQgc2hzdHJ0YWIsIHN5bXRhYiBhbmQKLQlzdHJ0YWIgc2VjdGlvbnMgYXQgZW5kIG9mIGZpbGUuICBBdm9pZHMgYnVnIGluIHNvbWUgdmVyc2lvbnMgb2YKLQlTVlI0IHN0cmlwLiAgRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0B0YW50YWx1cy5ucmwubmF2eS5taWw+LgotCi0JKiBjb2ZmY29kZS5oIChzdHlwX3RvX3NlY19mbGFncyk6IElmIENPRkZfUEFHRV9TSVpFIGlzIGRlZmluZWQsCi0Jc2V0IFNFQ19ERUJVR0dJTkcgZm9yIFNUWVBfSU5GTyBzZWN0aW9ucy4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBJZiBDT0ZGX1BBR0VfU0laRSBpcwotCWRlZmluZWQsIGFuZCBEX1BBR0VEIGlzIHNldCwgc2V0IHRoZSBmaWxlIHBvc2l0aW9uIGVxdWFsIHRvIHRoZQotCXNlY3Rpb24gVk1BIG1vZHVsbyBDT0ZGX1BBR0VfU0laRS4KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogSWYgRl9FWEVDIGlzIHNldCwgc2V0IERfUEFHRUQuCi0JKiBjb2ZmLWkzODYuYzogU2V0IERfUEFHRUQgaW4gQkZEIHRhcmdldC4KLQkoQ09GRl9QQUdFX1NJWkUpOiBEZWZpbmUuCi0JKiBjb2ZmLW02OGsuYywgY29mZi1zcGFyYy5jOiBMaWtld2lzZS4KLQotTW9uIEp1biAgNiAxMDo1NzoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogRG9uJ3QgdHVybiBhIHJlbG9jIHNlY3Rpb24KLQlpbnRvIGEgQkZEIHNlY3Rpb24ganVzdCBiZWNhdXNlIFNIRl9BTExPQyBpcyBzZXQ7IHJlcXVpcmUgdGhhdCBpdAotCW5vdCB1c2UgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUuCi0JKGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCUJldHRlciBpbmRpcmVjdCBhbmQgd2FybmluZyBzeW1ib2wgaGFuZGxpbmcgaW5zcGlyZWQgYnkgU3R1YXJ0Ci0JUXVpY2sgPHN0dWNrQGNzLm1hbi5hYy51az4uCi0JKiBsaW5rZXIuYyAoZW51bSBsaW5rX2FjdGlvbik6IEFkZCBSRUYsIE1JTkQsIENXQVJOLCBSRUZDLgotCShsaW5rX2FjdGlvbik6IENoYW5nZSBVTkRFRl9ST1cvZGVmIGFuZCBVTkRFRldfUk9XL2RlZiBmcm9tIE5PQUNUCi0JdG8gUkVGLiAgQ2hhbmdlIFVOREVGX1JPVy9pbmRyIGFuZCBVTkRFRldfUk9XL2luZHIgZnJvbSBDWUNMRSB0bwotCVJFRkMuICBDaGFuZ2UgREVGX1JPVy9pbmRyIGFuZCBDT01NT05fUk9XL2luZHIgZnJvbSBDWUNMRSB0byBNREVGLgotCUNoYW5nZSBERUZXX1JPVy9pbmRyIGZyb20gQ1lDTEUgdG8gTk9BQ1QuICBDaGFuZ2UgSU5EUl9ST1cvaW5kcgotCWZyb20gTURFRiB0byBNSU5ELiAgQ2hhbmdlIElORFJfUk9XL3dhcm4gZnJvbSBXQVJOQyB0byBDWUNMRS4KLQlDaGFuZ2UgV0FSTl9ST1cvZGVmIGFuZCBXQVJOX1JPVy9pbmRyIGZyb20gTVdBUk4gdG8gQ1dBUk4uICBDaGFuZ2UKLQlXQVJOX1JPVy9jb20gZnJvbSBNV0FSTiB0byBXQVJOLiAgQ2hhbmdlIFdBUk5fUk9XL3dhcm4gZnJvbSBOT0FDVAotCXRvIENZQ0xFLiAgQ2hhbmdlIFNFVF9ST1cvd2FybiBmcm9tIFdBUk5DIHRvIENZQ0xFPgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IEhhbmRsZSBSRUYsIE1JTkQsIENXQVJOIGFuZAotCVJFRkMuICBJZiBhIG5ldyBpbmRpcmVjdCBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZCwgcHVzaCB0aGUKLQlyZWZlcmVuY2UgZG93biB0byB0aGUgc3ltYm9sIGl0IHBvaW50cyB0by4gIEZJeCBoYW5kbGluZyBvZiBXQVJOLgotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IElmIE5fV0FSTklORywgZG9uJ3QKLQljbG9iYmVyIGVfdHlwZSBvZiBuZXh0IHN5bWJvbC4KLQkodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBMb29wIG9uIGJmZF9saW5rX2hhc2hfd2FybmluZyBhcyB3ZWxsCi0JYXMgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4KLQotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpOiBOZXcgZmllbGQgd3JpdHRlbi4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykpOiBJbml0aWFsaXplIHdyaXR0ZW4uCi0JKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogVXNlIHdyaXR0ZW4sIG5vdCByb290LndyaXR0ZW4uCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkpOiBOZXcgZmllbGQgd3JpdHRlbi4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSB3cml0dGVuLgotCShlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsKTogdXNlIHdyaXR0ZW4sIG5vdCByb290LndyaXR0ZW4uCi0JKiBnZW5saW5rLmggKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSk6IE5ldyBmaWVsZCB3cml0dGVuLgotCSogbGlua2VyLmMgKF9iZmRfbGlua19oYXNoX25ld2Z1bmMpOiBEb24ndCBpbml0aWFsaXplIHdyaXR0ZW4uCi0JKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIHdyaXR0ZW4uCi0JKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzKTogVXNlIHdyaXR0ZW4sIG5vdCByb290LndyaXR0ZW4uCi0JKF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogbGliZWNvZmYuaCAoZWNvZmZfZGF0YV90eXBlKTogQWRkIGxpbmtlciBmaWVsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIG5ldyB0ZGF0YSBsaW5rZXIKLQlmaWVsZCwgcmF0aGVyIHRoYW4gb3V0c3ltYm9scyBiZWluZyBub24tTlVMTCwgdG8gZGVjaWRlIHdoZXRoZXIgdG8KLQlvdXRwdXQgdGhlIHN5bWJvbHMgYW5kIHJlbG9jcy4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgbmV3IHRkYXRhIGxpbmtlciBmaWVsZCB0byB0cnVlLgotCi0JKiBlY29mZi5jIChlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRG9uJ3QgdHJ5IHRvIGNvcHkKLQlkYXRhIHRvIGEgbm9uLUVDT0ZGIGZpbGUuCi0KLQkqIGxpYmJmZC1pbi5oOiBBZGQgd2FybmluZyB0aGF0IGxpYmJmZC5oIGlzIGEgZ2VuZXJhdGVkIGZpbGUuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotU3VuIEp1biAgNSAxNTowMjozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIHRvIHN1cHBvcnQgRUxGIHN0cmlwIGFuZCBvYmpjb3B5IG9uIGR5bmFtaWNhbGx5IGxpbmtlZAotCWZpbGVzLgotCSogZWxmY29kZS5oIChlbGZfZmFrZV9zZWN0aW9ucyk6IEFkZCBwcm90b3R5cGUuCi0JKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IE1ha2UgYSBCRkQgc2VjdGlvbiBmcm9tIGFuIFNIVF9IQVNICi0Jc2VjdGlvbiwgYW5kIGZyb20gYW4gU0hUX0RZTlNZTSBzZWN0aW9uLCBhbmQgZnJvbSB0aGUgZHluYW1pYwotCXN0cmluZyB0YWJsZSBzZWN0aW9uLgotCShlbGZfb2JqZWN0X3ApOiBTZXQgRF9QQUdFRCBpZiB0aGVyZSBpcyBhIHByb2dyYW0gaGVhZGVyLgotCShlbGZfbWFrZV9zZWN0aW9ucyk6IFJlbW92ZS4KLQkoZml4X3VwX3N0cnRhYnMpOiBSZW1vdmUuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogUmV3cml0ZS4gIE5vdyBzZXRzIHNoX2VudHNpemUuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBSZXdyaXRlLiAgTm93IHNldHMgc2hfbGluayBhbmQgc2hfaW5mbwotCWZvciBhbGwgc2VjdGlvbnMuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiAgRG9uJ3QgY2FsbCBvYnNvbGV0ZQotCWZ1bmN0aW9ucyBlbGZfbWFrZV9zZWN0aW9ucyBvciBmaXhfdXBfc3RydGFicy4KLQkoc3dhcF9vdXRfc3ltcyk6IFNldCBzaF9hZGRyYWxpZ24gdG8gRklMRV9BTElHTiByYXRoZXIgdGhhbiA0LgotCShOQU1FKGJmZF9lbGYsd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IFBlcm1pdCB3cml0aW5nIERZTkFNSUMKLQlvYmplY3RzLgotCShlbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogVHJlYXQgU0hUX0RZTlNZTSBsaWtlIG90aGVyIG5vcm1hbAotCXNlY3Rpb25zLiAgSWYgYW4gU0hUX1JFTCBvciBTSFRfUkVMQSBzZWN0aW9uIGlzIGFsbG9jYXRlZCBvciB1c2VzCi0JYW4gdW51c3VhbCBzeW1ib2wgdGFibGUsIHBlcm1pdCBhIEJGRCBzZWN0aW9uIHRvIG1hcCB0byBpdC4KLQlQZXJtaXQgbW9zdCBTSFRfU1RSVEFCIHNlY3Rpb25zIHRvIGhhdmUgYSBCRkQgc2VjdGlvbiBtYXBwZWQgdG8KLQl0aGVtLgotCShlbGZfYmZkX2ZpbmFsX2xpbmspOiBEb24ndCBzZXQgc2hfbGluaywgc2hfaW5mbyBvciBzaF9lbnRzaXplCi0JZmllbGRzIG9mIGR5bmFtaWMgc2VjdGlvbnMgaGVyZTsgZG8gaXQgaW4gYXNzaWduX3NlY3Rpb25fbnVtYmVycy4KLQkqIGVsZjMyLXRhcmdldC5oLCBlbGY2NC10YXJnZXQuaDogQWRkIERfUEFHRUQgdG8gcGVybWl0dGVkIG9iamVjdAotCWZsYWdzLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IE9ubHkgc2V0IFNFQ19EQVRBIGlmCi0JU0VDX0xPQUQgaXMgc2V0LCByYXRoZXIgdGhhbiBjaGVja2luZyBTRUNfQUxMT0MuCi0KLQkqIGxpYmJmZC1pbi5oIChiZmRfcmVhbGxvYyk6IENoYW5nZSBsYXN0IGFyZyB0byAic2l6ZV90IHNpemUiLgotCi1GcmkgSnVuICAzIDEwOjU4OjAyIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3dyaXRlX29iamVjdF9jb250ZW50cyk6IERvbid0IGNvbXB1dGUgdGhlIGZpbGUgaGVhZGVyJ3MKLQljaGVja3N1bSBoZXJlLgotCShzb21fd3JpdGVfaGVhZGVycyk6IEluc3RlYWQgZG8gaXQgaGVyZS4KLQotCSogbGliYmZkLmggKGJmZF9yZWFsbG9jKTogQ2hhbmdlIGxhc3QgYXJnIHRvICJzaXplX3Qgc2l6ZSIuCi0KLVRodSBKdW4gIDIgMTc6Mzk6MjIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zdW4zLmg6IEluY2x1ZGUgPHN0ZGxpYi5oPi4gIERvbid0IGRlY2xhcmUgZnJlZSwgZXhpdCBvcgotCWdldGVudi4KLQotCUFkZCBsaW5rZXIgc3VwcG9ydCBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4KLQkqIHN1bm9zLmM6IEluY2x1ZGUgYmZkbGluay5oLiAgQWRkIG1hbnkgbmV3IGZ1bmN0aW9ucyBhbmQKLQlkZWZpbml0aW9ucyBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQkqIGJmZC1pbi5oIChiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogYW91dHguaCAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5KTogTW92ZSB0byBsaWJhb3V0LmguCi0JKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSk6IExpa2V3aXNlLgotCShhb3V0X2xpbmtfaGFzaF9sb29rdXAsIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKTogTGlrZXdpc2UuCi0JKGFvdXRfaGFzaF90YWJsZSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpKTogUmVuYW1lIGZyb20gYW91dF9saW5rX2hhc2hfbmV3ZnVuYwotCWFuZCBtYWtlIGV4dGVybmFsbHkgdmlzaWJsZS4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSk6IE5ldyBmdW5jdGlvbi4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9jcmVhdGUpKTogQ2FsbAotCU5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfaW5pdCksIG5vdCBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0LgotCShhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBEb24ndCBmYWlsIGlmIG5vIHN5bWJvbHMuICBJZiBpdCBleGlzdHMsCi0JY2FsbCBhZGRfZHluYW1pY19zeW1ib2xzIGJhY2tlbmQgZW50cnkgcG9pbnQgZm9yIGR5bmFtaWMgb2JqZWN0cy4KLQlVc2UgYWRkX29uZV9zeW1ib2wgYmFja2VuZCBlbnRyeSBwb2ludCBpZiBpdCBleGlzdHMuCi0JKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IENhbGwgZmluaXNoX2R5bmFtaWNfbGluayBiYWNrZW5kIGVudHJ5Ci0JcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX2lucHV0X2JmZCk6IEZvciBhIGR5bmFtaWMgb2JqZWN0LCBjYWxsCi0JbGlua19keW5hbWljX29iamVjdCBiYWNrZW5kIGVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMuCi0JKGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wpOiBDYWxsIHdyaXRlX2R5bmFtaWNfc3ltYm9sIGJhY2tlbmQKLQllbnRyeSBwb2ludCwgaWYgaXQgZXhpc3RzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbik6IERvbid0IHJlYWQgdGhlIHJlbG9jcyBpZiB0aGV5IGhhdmUKLQlhbHJlYWR5IGJlZW4gcmVhZC4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogV2hlbiBkb2luZyBhIGZpbmFsIGxpbmssIGZvciBhCi0JcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGNhbGwgY2hlY2tfZHluYW1pY19yZWxvYyBiYWNrZW5kCi0JZW50cnkgcG9pbnQsIGlmIGl0IGV4aXN0cy4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0JKiBsaWJhb3V0Lmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb24uICBJbmNsdWRlCi0JYmZkbGluay5oLgotCShzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpOiBNb3ZlIGluIGZyb20gYW91dHguaC4KLQkoc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKGFvdXRfbGlua19oYXNoX2xvb2t1cCwgYW91dF9saW5rX2hhc2hfdHJhdmVyc2UpOiBMaWtld2lzZS4KLQkoYW91dF9oYXNoX3RhYmxlKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZHMgYWRkX2R5bmFtaWNfc3ltYm9scywKLQlhZGRfb25lX3N5bWJvbCwgbGlua19keW5hbWljX29iamVjdCwgd3JpdGVfZHluYW1pY19zeW1ib2wsCi0JY2hlY2tfZHluYW1pY19yZWxvYywgYW5kIGZpbmlzaF9keW5hbWljX2xpbmsuCi0JKHN0cnVjdCBhb3V0X3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBEZWZpbmUgbmV3IHN0cnVjdHVyZS4KLQkoYW91dF9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgbmV3IGFjY2Vzc29yIG1hY3JvLgotCShOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpKTogRGVjbGFyZS4KLQkoTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSk6IERlY2xhcmUuCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgbmV3IGFvdXRfYmFja2VuZF9kYXRhCi0JZmllbGRzLgotCSogYW91dC10YXJnZXQuaCAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogaTM4NmFvdXQuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogaTM4Nm1hY2gzLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIG1pcHNic2QuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogc3BhcmNseW54LmMgKHNwYXJjbHlueF9hb3V0X2JhY2tlbmQpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkpOiBEb24ndCB6ZXJvIG91dCBjYWNoZWQKLQl1bnRpbCB3ZSBrbm93IGl0IGlzIG5vbi1OVUxMLgotCShhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IERvbid0IHNraXAgYSB3YXJuaW5nIHN5bWJvbCBldmVuIGlmIGl0Ci0JaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuIG91dC4gIElmIHNraXBwaW5nIGFuIGluZGlyZWN0IHN5bWJvbCwKLQlza2lwIHRoZSBuZXh0IHN5bWJvbCBhcyB3ZWxsLgotCi1XZWQgSnVuICAxIDE0OjM3OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaG9zdHMvc3VuMy5oOiBEb24ndCBkZWNsYXJlIHFzb3J0LCBtYWxsb2Mgb3IgcmVhbGxvYy4KLQotVGh1IE1heSAyNiAxMzo1NjowMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogQ2FzdCBiZmRfYnl0ZSBwb2ludGVyCi0JdG8gY2hhciBwb2ludGVyIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBkZXAtaW4uc2VkOiBSZW1vdmUgc3BhY2VzIGJlZm9yZSBjb2xvbnMuCi0KLQlNZXJnZWQgY2hhbmdlcyBiYWNrIGluIGZyb20gRlNGIGdhcyByZWxlYXNlIDIuMzoKLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBXcmFwIGBpZicgYmxvY2sgYXJvdW5kIGdyZXAKLQlpbnZvY2F0aW9uLCB0byBhdm9pZCBhIGJ1ZyBpbiBCU0QgNC40IG1ha2UuCi0KLQlGcm9tIFJhbHBoIENhbXBiZWxsOgotCSogbWlwc2JzZC5jIChtaXBzX2ZpeF9qbXBfYWRkcik6IElmIHN5bWJvbCBpcyB1bmRlZmluZWQsIHJldHVybiBhbgotCWVycm9yLgotCShtaXBzX2ZpeF9oaTE2X3MpOiBEaXR0by4KLQotCUZyaSBNYXkgMTMgMjE6MjE6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBtYWtlZmlsZS5kb3M6IGRlZmluZSBhIGRlZmF1bHQgdGFyZ2V0LCBvciBhcmNoaXZlcyB3b24ndCB3b3JrCi0JICBkdWUgdG8gbXVsdGlwbGUgbWF0Y2hlcy4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgZm9yIGxhdGVzdCBmaWxlcwotCSogbWFrZWZpbGUuZG9zOiB1cGRhdGUgZm9yIGNvcnJlY3QgdGFyZ2V0cyBhbmQgc291cmNlcwotCSogY29mZi1nbzMyLmM6IFtuZXddIGdvMzIncyBDT0ZGIGZvcm1hdCAoaTM4NmNvZmYgd2l0aCB1bmRlcnNjb3JlcykKLQkqIHRhcmdldHMuYzogYWRkIGdvMzJjb2ZmIHRhcmdldAotCSogbWFrZWZpbGUuaW46IGFkZCBjb2ZmLWdvMzIuYyBzdXBwb3J0Ci0KLVRodSBNYXkgMjYgMTA6MTA6MjEgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogRG8gbm90IHNldCB0aGUgc3lzdGVtX2lkIGhlcmUsIHByaXZhdGUKLQliZmQgZGF0YSBoYXMgbm90IGJlZW4gY29waWVkIHlldC4KLQkoc29tX3dyaXRlX2hlYWRlcnMpOiBJbnN0ZWFkIGRvIGl0IGhlcmUuCi0KLVR1ZSBNYXkgMjQgMTY6MTc6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JTWFrZSBNSVBTIEVMRiB1c2UgbmV3IEVMRiBiYWNrZW5kIGxpbmtlci4gIE5vIHNoYXJlZCBsaWJyYXJ5Ci0Jc3VwcG9ydCB5ZXQuCi0JKiBlbGYzMi1taXBzLmMgKGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9vYmplY3RfcCk6IElmIGxhc3Qgc3ltYm9sIGlzIExPQ0FMLCBzZXQgZWxmX2JhZF9zeW10YWIuCi0JKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBTZXQgc2hfaW5mbyBmaWVsZCBmb3IgLmdwdGFiLioKLQlzZWN0aW9ucy4KLQkobWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IFNldCBzaF9lbnRzaXplIGZvciAuZ3B0YWIuKiBzZWN0aW9ucy4KLQkobWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogUmVhZCBhbmQgZnJlZSBleHRlcm5hbCBzeW1ib2xzIGxhc3QsCi0Jbm90IGZpcnN0LCBmb3IgY2xhcml0eS4KLQkoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZSBuZXcgc3RydWN0dXJlLgotCShzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9sb29rdXApOiBEZWZpbmUgbmV3IG1hY3JvLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UpOiBEZWZpbmUgbmV3IG1hY3JvLgotCShtaXBzX2VsZl9oYXNoX3RhYmxlKTogRGVmaW5lIG5ldyBtYWNyby4KLQkobWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IGV4dHN5bV9pbmZvKTogRGVmaW5lIG5ldyBzdHJ1Y3R1cmUuCi0JKG1pcHNfZWxmX2dldF9leHRyLCBtaXBzX2VsZl9zZXRfaW5kZXgpOiBSZW1vdmUuCi0JKG1pcHNfZWxmX291dHB1dF9leHRzeW0pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShncHRhYl9jb21wYXJlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IFJld3JpdGUgdG8gdXNlIEVMRiBiYWNrZW5kIGxpbmtlciwgYW5kIHRvCi0JbWVyZ2UgZ3B0YWIgaW5mb3JtYXRpb24gaW4gaW5wdXQgZmlsZXMuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogRGVmaW5lIGFzIG1hY3JvIGJlZm9yZQotCWluY2x1ZGluZyBlbGYzMi10YXJnZXQuaC4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2spOiBMaWtld2lzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IFJlbmFtZSBmcm9tCi0JZWxmX2xpbmtfaGFzaF9uZXdmdW5jIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuICBDaGFuZ2UgY2FsbGVyLgotCShfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCV9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBVc2UKLQlfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdC4KLQkqIGxpYmVsZi5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBuZXcgZmllbGQgYmFkX3N5bXRhYi4KLQkoZWxmX2JhZF9zeW10YWIpOiBEZWZpbmUgbmV3IGFjY2Vzc29yIG1hY3JvLgotCShfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IERlY2xhcmUuCi0JKF9iZXdfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogRGVjbGFyZS4KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogQ2FsbCBiYWNrZW5kIG9iamVjdF9wIGhvb2sgYWZ0ZXIKLQlzd2FwcGluZyBpbiBhbGwgdGhlIHNlY3Rpb24gaGVhZGVycy4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDb3JyZWN0IHR5cG86IEludGVybmFsIGZvciBFeHRlcm5hbC4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgZWxmX2JhZF9zeW10YWIgaXMgc2V0LCByZWFkIGFsbAotCXRoZSBzeW1ib2xzLiAgU2tpcCBTVEJfTE9DQUwgc3ltYm9scyByYXRoZXIgdGhhbiBnaXZpbmcgYW4gZXJyb3IuCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IElmIGVsZl9iYWRfc3ltdGFiIGlzIHNldCwgYWxsb2NhdGUgc3BhY2UgZm9yCi0JYWxsIHN5bWJvbHMsIG5vdCBqdXN0IGxvY2Fscy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IE9ubHkgc2tpcCBhIHN5bWJvbCBub3QgbWVudGlvbmVkIGJ5IGEKLQlyZWd1bGFyIGZpbGUgaWYgaXQgaXMgbWVudGlvbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IElmIGVsZl9iYWRfc3ltdGFiIGlzIHNldCwgcmVhZCBhbGwgdGhlCi0Jc3ltYm9scy4KLQotRnJpIE1heSAyMCAxMzozODoyMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9zZXRfcmVsb2NfaW5mbyk6IERvIG5vdCBzZXQgYW55IHJlbG9jYXRpb24gaW5mbwotCWZvciBTT00gZml4dXBzIHdoaWNoIGFyZSBuZXZlciBwYXNzZWQgdG8gQkZELgotCi1GcmkgTWF5IDIwIDExOjU3OjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBNSVBTX1JfSk1QQUREUiBvdmVyZmxvdwotCWNoZWNraW5nLgotCi0JKiBlbGYzMi1pMzg2LmMgKGVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBEVF9ERUJVRyB0bwotCXRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBkZWJ1Z2dlci4KLQlGcm9tIFBldGVyIFNjaGF1ZXIuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmLmMgKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBOZXcgZnVuY3Rpb24sIGJhc2VkIG9uCi0JY29kZSByZXBlYXRlZCB0aHJlZSB0aW1lcyBpbiBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgaW4gZWxmY29kZS5oLgotCSogbGliZWxmLmggKF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVc2UgbmV3IGZ1bmN0aW9uCi0JX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciB0byBjcmVhdGUgQkZEIHNlY3Rpb25zLiAgSWYgYQotCXJlbG9jIHNlY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBtYWluIHN5bWJvbCB0YWJsZSwgb3IgaXQgaXMgcGFydCBvZgotCXRoZSBwcm9jZXNzIGltYWdlLCB0cmVhdCBpdCBhcyBhIG5vcm1hbCBzZWN0aW9uLCBub3QgcmVsb2NzLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IFVzZSBuZXcgZnVuY3Rpb24KLQlfYmZkX2VsZl9tYWtlX3NlY3Rpb25fZnJvbV9zaGRyLgotCi1UaHUgTWF5IDE5IDExOjM3OjExIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdGFyZ2V0LmgsIGVsZjY0LXRhcmdldC5oOiBDaGFuZ2UgYXJfbWF4X25hbWVsZW4gdmFsdWUgZnJvbQotCTE1IHRvIDE0IHRvIG1hdGNoIFNWUjQgYXIuCi0KLQlBZGQgc3VwcG9ydCBmb3IgRUxGIHNoYXJlZCBsaWJyYXJpZXMuICBMb29zZWx5IGJhc2VkIG9uIHdvcmsgYnkKLQlFcmljIFlvdW5nZGFsZSA8ZXJpY3lAY2Fpcy5jb20+LgotCSogbGliZWxmLmggKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZHMgZm9yIGR5bmFtaWMKLQlsaW5raW5nOiBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucywKLQllbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wsCi0JZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zLAotCWVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCwKLQllbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucy4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBDaGFuZ2UgdHlwZSBvZiBhbGlnbiBmaWVsZCB0bwotCWJmZF9zaXplX3R5cGUuICBBZGQgZmllbGRzIGR5bmluZHgsIGR5bnN0cl9pbmRleCwgd2Vha2RlZiwKLQllbGZfbGlua19oYXNoX2ZsYWdzLgotCShzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBmaWVsZHMgZHlub2JqLCBkeW5zeW1jb3VudCwKLQlkeW5zdHIsIGJ1Y2tldGNvdW50LgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY19pbiwgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NhX2luLCBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX2luLCBiZmRfZWxmMzJfc3dhcF9keW5fb3V0KTogRGVjbGFyZS4KLQkoYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5KTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NfaW4sIGJmZF9lbGY2NF9zd2FwX3JlbG9jX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9pbiwgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9zd2FwX2R5bl9pbiwgYmZkX2VsZjY0X3N3YXBfZHluX291dCk6IERlY2xhcmUuCi0JKGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSk6IERlY2xhcmUuCi0JKiBlbGZjb2RlLmggKEVsZl9FeHRlcm5hbF9EeW4pOiBEZWZpbmUuCi0JKGVsZl9zd2FwX3JlbG9jX2luKTogRGVmaW5lIGFzIG1hY3JvIHVzaW5nIE5BTUUuICBNYWtlIGV4dGVybmFsbHkKLQl2aXNpYmxlLgotCShlbGZfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfcmVsb2NhX2luLCBlbGZfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCi0JKGVsZl9zd2FwX2R5bl9pbiwgZWxmX3N3YXBfZHluX291dCk6IERlZmluZSBhcyBtYWNybyB1c2luZyBOQU1FCi0JYW5kIGFzIG5ldyBleHRlcm5hbGx5IHZpc2libGUgZnVuY3Rpb24uCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogU2V0IHNlY3Rpb24gdHlwZSBvZiBkeW5hbWljIHNlY3Rpb25zIGJhc2VkIG9uCi0Jc2VjdGlvbiBuYW1lcy4KLQkoZWxmX3dyaXRlX3BoZHJzKTogUmVtb3ZlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbik6IEFkZCBuZXcgYWxpZ24gYXJndW1lbnQuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cnVjdCBzZWdfaW5mbyk6IFJlbW92ZS4KLQkobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBDb21wbGV0ZWx5IHJld3JpdGUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQ29tcGxldGVseSByZXdyaXRlLgotCShhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyk6IERvbid0IHNldCBhIGZpbGUgcG9zaXRpb24gZm9yCi0Jc2VjdGlvbnMgd2hpY2ggYWxyZWFkeSBoYXZlIG9uZS4gIERvbid0IGJvdGhlciB0byBhbGlnbiB0aGUgZmlsZQotCXBvc2l0aW9uIGhlcmUuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBIYW5kbGUgU0hUX0hBU0ggYW5kIFNIVF9EWU5BTUlDCi0Jc2VjdGlvbiB0eXBlcy4KLQkoZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBmYWlscywganVzdAotCXVzZSBiZmRfYWJzX3NlY3Rpb24gcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIGVycm9yLgotCShlbGZfc2l6ZW9mX2hlYWRlcnMpOiBNYWtlIHVzZWZ1bC4KLQkoZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSGFuZGxlIGR5bmFtaWMgb2JqZWN0cy4KLQkoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfYWRkX2R5bmFtaWNfZW50cnkpOiBEZWZpbmUgYXMgbWFjcm8gdXNpbmcgTkFNRSBhbmQgYXMgbmV3Ci0JZXh0ZXJuYWxseSB2aXNpYmxlIGZ1bmN0aW9uLgotCShOQU1FKGJmZF9lbGYscmVjb3JkX2xpbmtfYXNzaWdubWVudCkpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9idWNrZXRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBOZXcgZnVuY3Rpb24uCi0JKHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvKTogQWRkIGR5bnN5bV9zZWMgYW5kIGhhc2hfc2VjIGZpZWxkcy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSGFuZGxlIGR5bmFtaWMgbGlua2luZy4gIENyZWF0ZSBhIHNlY3Rpb24KLQlzeW1ib2wgZm9yIGFsbCBFTEYgc2VjdGlvbnMsIG5vdCBhbGwgQkZEIHNlY3Rpb25zLiAgU3RvcmUgc2VjdGlvbgotCXN5bWJvbCBpbmRleCBpbiB0YXJnZXRfaW5kZXggZmllbGQsIG5vdCBpbmRleCBmaWVsZC4gIFRyYXZlcnNlCi0Jb3ZlciBnbG9iYWwgc3ltYm9scyBldmVuIGlmIHN0cmlwcGluZy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IE91dHB1dCBkeW5hbWljIHN5bWJvbHMuICBNYXJrIHN5bWJvbHMKLQlkZWZpbmVkIGJ5IGR5bmFtaWMgb2JqZWN0cyBhcyB1bmRlZmluZWQuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IElnbm9yZSBkeW5hbWljIG9iamVjdHMuICBVc2UgdGFyZ2V0X2luZGV4Ci0JZmllbGQgZm9yIHNlY3Rpb24gcmVsb2NzLCBhbmQgbWFrZSBzdXJlIGl0IGlzIHNldC4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBVc2UgdGFyZ2V0X2luZGV4IGZpZWxkIGZvciBzZWN0aW9uIHJlbG9jcywKLQlhbmQgbWFrZSBzdXJlIGl0IGlzIHNldC4KLQkqIGVsZi5jIChlbGZfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIGR5bmluZHgsIGR5bnN0cl9pbmRleCwKLQl3ZWFrZGVmIGFuZCBlbGZfbGlua19oYXNoX2ZsYWdzIGZpZWxkcy4KLQkoX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgZHlub2JqLCBkeW5zeW1jb3VudCwKLQlkeW5zdHIgYW5kIGJ1Y2tldGNvdW50IGZpZWxkcy4KLQkqIGVsZjMyLXRhcmdldC5oOiBJbml0aWFsaXplIG5ldyBkeW5hbWljIGxpbmtpbmcgZmllbGRzLgotCSogZWxmNjQtdGFyZ2V0Lmg6IExpa2V3aXNlLiAgCi0JKiBlbGYzMi1pMzg2LmM6IE5ldyBmdW5jdGlvbnMgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LgotCSogZWxmMzItc3BhcmMuYzogTGlrZXdpc2UuCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudCk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotV2VkIE1heSAxOCAwODoyOTowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNvbS5jOiBEb24ndCBpbmNsdWRlIDxzeXMvZGlyLmg+IG9yIDxzeXMvdXNlci5oPi4KLQkoc29tX3JlbG9jX3F1ZXVlX2ZpbmQpOiBDYWxsIG1lbWNtcCBpbnN0ZWFkIG9mIGJjbXAuCi0JKHNvbV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBDaGFuZ2UgZmlyc3QgYXJndW1lbnQgdG8gYmZkICouCi0JKGNvbXBhcmVfc3ltcyk6IENoYW5nZSB0eXBlcyBvZiBhcmd1bWVudHMgdG8gY29uc3Qgdm9pZCAqLgotCShiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBSZW1vdmVkIHVudXNlZCBsb2NhbCBmb3VuZC4KLQkoc29tX3dyaXRlX2FybWFwKTogQWRkIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50IGFuZCBpbnQgYXJndW1lbnRzLgotCShzb21fd3JpdGVfYXJtYXApOiBVc2UgJWxkIGFuZCBjYXN0IHRvIGxvbmcgZm9yIGdldHVpZCByZXN1bHQuCi0KLVdlZCBNYXkgMTggMDk6MDk6MzIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuaCAoUl9IUFBBX0FCU19DQUxMKTogRGVmaW5lLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9nZW5fcmVsb2NfdHlwZSk6IEhhbmRsZSBhYnNvbHV0ZSBjYWxscy4KLQotCSogc29tLmggKFJfSFBQQV9BQlNfQ0FMTCk6IERlZmluZS4KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IERlbGV0ZSBjb21wbGV4IHJlbG9jYXRpb24gdHlwZXMuCi0KLVR1ZSBNYXkgMTcgMTk6MzM6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29mZi1pOTYwLmMgKGljb2ZmX2xpdHRsZV92ZWMsIGljb2ZmX2JpZ192ZWMpOiBJbmRpY2F0ZSBsZWFkaW5nCi0JdW5kZXJzY29yZSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJbnRlbCB0b29sIGNoYWluIChnbnU5NjB2MikuCi0KLU1vbiBNYXkgMTYgMTA6MDk6MjIgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogZWxmMzItaHBwYS5jOiBDaGFuZ2UgLmhwcGFfbGlua2VyX3N0dWJzIHRvIC5QQVJJU0Muc3R1YnMsCi0JbGlrZXdpc2UgZm9yIG90aGVyIFBBIHNwZWNpZmljIHNlY3Rpb25zLgotCShocHBhX2VsZl9yZWxvY2F0ZV91bndpbmRfdGFibGUpOiBEZWxldGUgdW51c2VkCi0JZnVuY3Rpb24uCi0JKGVsZl9ocHBhX2hvd3RvX3RhYmxlKTogQ29tcGxldGVseSBuZXcgdGFibGUgYmFzZWQgb24gOTQtMDItMDIKLQlkcmFmdCBQQSBFTEYgc3BlYy4gIENoYW5nZSByZWxvY2F0aW9uIHRhZ3MgYXBwcm9wcmlhdGVseQotCXRocm91Z2hvdXQgZWxmMzItaHBwYS5jCi0JKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogUmV3cml0ZSBhbmQgc2ltcGxpZnkgYmFzZWQgb24gOTQtMDItMDIKLQlzcGVjLgotCShocHBhX2VsZl9yZWxvYyk6IExpa2V3aXNlLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBMaWtld2lzZQotCShFTEZfTUFDSElORV9DT0RFKTogQ2hhbmdlIHRvIEVNX1BBUklTQy4KLQkqIGVsZjMyLWhwcGEuaDogSW5jbHVkZSAiZWxmL2hwcGEuaCIuICBDaGFuZ2UgcmVsb2NhdGlvbiB0YWdzIAotCWFwcHJvcHJpYXRlbHkgdGhyb3VnaG91dCBlbGYzMi1ocHBhLmguCi0JKGVsZjMyX2hwcGFfcmVsb2NfdHlwZSk6IE5ldyB0YWJsZSBiYXNlZCBvbiA5NC0wMi0wMiBkcmFmdCBQQSBFTEYKLQlzcGVjLgotCShSX0hQUEFfQUJTX0NBTEwsIFJfSFBQQV9DT01QTEVYKiwgUl9IUFBBX1VOV0lORCk6IERlbGV0ZSBkZWZpbml0aW9ucy4KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzKTogVXNlIEVNX1BBUklTQyBpbnN0ZWFkIG9mIEVNX0hQUEEuCi0JKiByZWxvYy5jIChiZmRfcmVsb2NfY29kZV9yZWFsKTogRGVsZXRlIHVudXNlZCBIUFBBIHJlbG9jYXRpb25zLgotCSogc29tLmggKFJfSFBQQV9BQlNfQ0FMTCwgUl9IUFBBX0NPTVBMRVgpOiBEZWxldGUgZGVmaW5pdGlvbnMuCi0KLQkqIGxpYmhwcGEuaCAoaHBwYV9maWVsZF9hZGp1c3QpOiBBdm9pZCBhZGRpbmcgY29uc3RhbnRfdmFsdWUgaW50bwotCXRoZSBmaW5hbCB2YWx1ZSB0d2ljZSBmb3IgTFIgYW5kIFJSIGZpZWxkIHNlbGVjdG9ycy4KLQotU2F0IE1heSAxNCAwOTowOToxOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYWRkX3RvX3N0cmluZ3RhYik6IFVzZSBCRkRfQVNTRVJUIG5vdCBhc3NlcnQuICBUaGlzCi0JYXZvaWRzIF9fZXByaW50ZiB0cm91Ymxlcy4KLQotRnJpIE1heSAxMyAxMDo1MToyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJvdXQuYyAoYl9vdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SLgotCi0JKiBjb25maWcvbWlwc2JlbGYubXQgKFNFTEVDVF9WRUNTKTogQWRkIGVjb2ZmX2JpZ192ZWMgYW5kCi0JZWNvZmZfbGl0dGxlX3ZlYyBzaW5jZSBJcml4IDUgc3VwcG9ydHMgRUNPRkYgZXhlY3V0YWJsZXMuCi0KLVdlZCBNYXkgMTEgMDA6MzE6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9maW5kX25lYXJlc3RfbGluZSk6IEhhbmRsZSBmZHIuYWRyICE9IHBkci5hZHIKLQljb3JyZWN0bHkuCi0KLQkqIE1ha2VmaWxlLmluIChzdG1wLWJmZC5oKTogVXNlIHx8IGluc3RlYWQgb2YgOyB0byBmb3JjZSBTdW5PUwotCW1ha2UgdG8gaW52b2tlIHRoZSBzaGVsbC4KLQotVHVlIE1heSAxMCAxNDoyMzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpOiBSZW5hbWVkIGZyb20KLQlTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIGNsYXJpdHkuICBDaGFuZ2VkIGFsbCB1c2VzLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZmNvZGUuaCAoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSBpcwotCXNldCwgc2V0IFNUWVBfTk9MT0FELgotCSogY29mZmdlbi5jIChjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXgpOiBEb24ndCBnZXQgYW4gYXNzZXJ0aW9uCi0JZmFpbHVyZSBiZWNhdXNlIG9mIGEgYmFkIHNoYXJlZCBsaWJyYXJ5LgotCi1Nb24gTWF5ICA5IDE4OjUzOjQwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmM6IEFkZCBtaXNzaW5nIGNvbW1lbnQgdGVybWluYXRvci4KLQotTW9uIE1heSAgOSAxMTo1Mzo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IElmIGhhc2hwIGFuZCAqaGFzaHAKLQlhcmUgbm90IE5VTEwsIGFzc3VtZSB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGxvb2tlZCB1cCB0aGUgc3ltYm9sCi0JaW4gdGhlIGhhc2ggdGFibGUgYW5kIGhhcyBzdG9yZWQgdGhlIGVudHJ5IGluICpoYXNocC4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFNldCBoIHRvIE5VTEwgYmVmb3JlIGNhbGxpbmcKLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IExpa2V3aXNlLgotCi0JKiBlbGZjb2RlLmggKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogRG9uJ3QgcmVxdWlyZQotCXBhZ2Ugc2hhcmVkIGJldHdlZW4gLmRhdGEgYW5kIC5ic3Mgc2VnbWVudHMgdG8gY29udGFpbiB6ZXJvZXMuCi0KLQkqIGVsZmNvZGUuaDogSW5jbHVkZSBiZmRsaW5rLmguICBBZGRlZCBzZXZlcmFsIG5ldyBmdW5jdGlvbnMgdG8gZG8KLQlsaW5raW5nLgotCShFTEZfUl9UWVBFKTogRGVmaW5lLgotCShiZmRfYWRkX3RvX3N0cnRhYik6IFJldHVybiB1bnNpZ25lZCBsb25nLiAgQ2hhbmdlIGNoZWNrIGZvcgotCXJlYWxsb2MgZmFpbHVyZS4KLQkoZWxmX2Zha2Vfc2VjdGlvbnMpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX2FkZF90b19zdHJ0YWIuCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGQgbGlua19pbmZvIGFyZ3VtZW50LgotCUNhbGwgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyBob29rIGFuZCBwcmVwX2hlYWRlcnMKLQloZXJlLiAgT25seSBjYWxsIHN3YXBfb3V0X3N5bXMgaWYgbGlua19pbmZvIGlzIE5VTEwuICBTZXQgdXAKLQkuc2hzdHJ0YWIgc2VjdGlvbiBoZXJlLiAgUGFzcyBkb3N5bXMgYXJndW1lbnQgdG8KLQlhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcy4gIFNldCBvdXRwdXRfaGFzX2JlZ3VuIGZsYWcuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc3ltdGFiX2FuZF9zdHJ0YWJzKTogQWRkIGRvc3ltcwotCWFyZ3VtZW50LCBhbmQgdXNlIGl0IHRvIGNvbnRyb2wgc2V0dGluZyAuc3ltdGFiIGFuZCAuc3RydGFiIGZpbGUKLQlwb3NpdGlvbnMuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogQWRkIGRvc3ltcyBhcmd1bWVudCwgYW5kCi0JcGFzcyBpdCBvbi4KLQkocHJlcF9oZWFkZXJzKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9hZGRfdG9fc3RydGFiLgotCShzd2FwX291dF9zeW1zKTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBzZXQgdXAgLnNoc3RydGFiIGhlcmUuCi0JKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogU29tZSBjYWxscyBtb3ZlZCBpbnRvCi0JZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4KLQkoZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTSE5fTE9SRVNFUlYgY29ycmVjdGVkIHRvIFNITl9MT1JFU0VSVkUuCi0JKiBsaWJlbGYuaDogSW5jbHVkZSBiZmRsaW5rLmguCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogQWRkIGZpZWxkcyBjb2xsZWN0LAotCWVsZl9hZGRfc3ltYm9sX2hvb2ssIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24uCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCBmaWVsZCByZWxfaGFzaGVzLgotCShzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbW92ZSBmaWVsZHMgaW50ZXJuYWxfc3ltcyBhbmQgc3ltYm9scy4KLQlBZGQgZmllbGQgc3ltX2hhc2hlcy4KLQkob2JqX3N5bWJvbHMsIG9ial9pbnRlcm5hbF9zeW1zKTogUmVtb3ZlIGRlZmluaXRpb25zLgotCShlbGZfc3ltX2hhc2hlcyk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGZfbGlua19oYXNoX2xvb2t1cCk6IERlZmluZS4KLQkoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSk6IERlZmluZS4KLQkoZWxmX2hhc2hfdGFibGUpOiBEZWZpbmUuCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfYmZkX2ZpbmFsX2xpbmspOiBEZWNsYXJlLgotCSogZWxmLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShlbGZfbGlua19oYXNoX25ld2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IElmIG5vdCBkZWZpbmVkLAotCWRlZmluZSBhcyAwIGFuZCB1c2UgZ2VuZXJpYyBsaW5rZXIuICBPdGhlcndpc2UsIHVzZSBFTEYgYmFja2VuZAotCWxpbmtlci4KLQkoZWxmX2JhY2tlbmRfY29sbGVjdCk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgZmFsc2UuCi0JKGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMC4KLQkoZWxmMzJfYmVkKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCSogZWxmNjQtdGFyZ2V0Lmg6IFNhbWUgY2hhbmdlcyBhcyBlbGYzMi10YXJnZXQuaC4KLQkqIGVsZjMyLWkzODYuYzogSW5jbHVkZSBiZmRsaW5rLmguCi0JKGVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBlbGYzMi1zcGFyYy5jOiBJbmNsdWRlIGJmZGxpbmsuaC4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBDaGFuZ2UgdHlwZSBvZiBkc3QgZnJvbSBFbGYzMl9JbnRlcm5hbF9SZWxhCi0JdG8gRWxmX0ludGVybmFsX1JlbGEgKHRoZXkncmUgdGhlIHNhbWUgdHlwZSBhbnlob3cpLgotCShlbGZfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX2JhY2tlbmRfY29sbGVjdCk6IERlZmluZS4KLQotCSogTWFrZWZpbGUuaW4gKHN0bXAtYmZkLmgpOiBBdm9pZCB1c2VsZXNzIG1ha2UgZXJyb3IgbWVzc2FnZSBpbiBhCi0JZGlmZmVyZW50IHdheTsgdG91Y2ggdGFrZXMgYSBudW1lcmljIGFyZ3VtZW50IG9uIHNvbWUgc3lzdGVtcy4KLQotRnJpIE1heSAgNiAxMzozNDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBSZXdvcmsgY3VzdG9tIGhlYWRlcgotCWhhbmRsaW5nIGZvciBsYXRlc3Qgc3VnZ2VzdGVkIGZvcm1hdC4KLQkobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0KTogTGlrZXdpc2UuCi0JKG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQotRnJpIE1heSAgNiAxMToxMTo1MCAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBoYW5kbGUgZXJyaWNzc29uIGNvbmZpZyAoZm9yIE9TRSkuCi0KLVRodSBNYXkgIDUgMTU6NDA6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCVBhdGNoZXMgZnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkqIG1pcHNic2QuYyAobWlwc19maXhfam1wX2FkZHIpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZml4X2hpMTZfcyk6IFVzZSBiZmRfaXNfY29tX3NlY3Rpb24uCi0JKG1pcHNfaG93dG9fdGFibGVfZXh0KTogQ2FsbCBtaXBzX2ZpeF9qbXBfYWRkciBmb3IgTUlQU19SRUxPQ19KTVAuCi0KLUZyaSBNYXkgIDYgMTE6NDg6NTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWg6IFhYIHN1cHBvcnQuCi0KLQlGcm9tIGJpbGwKLQkqIE1ha2VmaWxlLmluOiBCdWlsZCBzeXNkZXAuaCB3aXRob3V0IGNhdXNpbmcgd29ycnlpbmcgYnV0Ci0JaGFybWxlc3MgZXJyb3IgbWVzc2FnZS4KLQotV2VkIE1heSAgNCAxMTowOTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQlDaGFuZ2VkIG02OGstYW91dCB0byBzZXQgZmxhZ3MgdG8gMDsgbTY4ay1zdW5vcyBzdGlsbCB1c2VzIDEuCi0JKiBhb3V0MC5jOiBOZXcgZmlsZS4KLQkqIHRhcmdldHMuYyAoYW91dDBfYmlnX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGFvdXQwX2JpZ192ZWMuCi0JKiBjb25maWcuYmZkIChtNjgqLSotYW91dCopOiBVc2UgbTY4ay0wYW91dCwgbm90IG02OGstYW91dC4KLQkqIGNvbmZpZy9tNjhrLWFvdXQubXQgKFNFTEVDVF9WRUNTKTogUmVtb3ZlZC4KLQkqIGNvbmZpZy9tNjhrLTBhb3V0Lm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoYW91dDBfYmlnX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yOiB1c2UgYW91dDAubywKLQlhb3V0MzIubyBhbmQgc3RhYi1zeW1zLm8uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGFvdXQwLm8uCi0JKENGSUxFUyk6IEFkZCBhb3V0MC5jLgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCBmaWVsZCBleGVjX2hkcl9mbGFncy4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2V4ZWNfaGRyX2ZsYWdzKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAwLgotCU1ZKGJhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0JKiBhb3V0ZjEuaCAoc3Vub3NfMzJfc2V0X2FyY2hfbWFjaCk6IE1ha2Ugc3RhdGljLgotCShhb3V0MzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBmbGFncyBmcm9tIGJhY2tlbmQKLQlpbmZvLgotCShNWV9leGVjX2hkcl9mbGFncyk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMS4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0JKiBhb3V0LWVuY2FwLmMgKGVuY2FwX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBmbGFncyBmcm9tCi0JYmFja2VuZCBpbmZvLgotCShNWV9leGVjX2hkcl9mbGFncyk6IERlZmluZSBhcyBOX0ZMQUdTX0NPRkZfRU5DQVBTVUxBVEUuCi0JKiBocDMwMGhwdXguYyAoTVlfZXhlY19oZHJfZmxhZ3MpOiBEZWZpbmUgYXMgMHgyLgotCShNWSh3cml0ZV9vYmplY3RfY29udGVudHMpKTogU2V0IGZsYWdzIGZyb20gYmFja2VuZCBpbmZvLgotCSogaTM4NmFvdXQuYyAoTVkoYmFja2VuZF9kYXRhKSk6IEluaXRpYWxpemUgZXhlY19oZHJfZmxhZ3MgZmllbGQuCi0JKiBpMzg2bWFjaDMuYyAoTVkoYmFja2VuZF9kYXRhKSk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBzcGFyY2x5bnguYyAoTkFNRShhb3V0LHNwYXJjbHlueF93cml0ZV9vYmplY3RfY29udGVudHMpKTogU2V0Ci0JZmxhZ3MgZnJvbSBiYWNrZW5kIGluZm8uCi0JKHNwYXJjbHlueF9hb3V0X2JhY2tlbmQpOiBJbml0aWFsaXplIGV4ZWNfaGRyX2ZsYWdzIGZpZWxkLgotCi1XZWQgTWF5ICA0IDAyOjU2OjAwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkIChpMzg2LSotZ251Kik6IFRyZWF0IGxpa2UgaTM4Ni0qLW1hY2gqLgotCShtNjgqLWFwb2xsby0qKTogVHJlYXQgYWxsIEFwb2xsbyBjb25maWdzIHRoZSBzYW1lLCBkb24ndCBoYW5kbGUKLQlCU0Qgc3BlY2lhbGx5LgotCi1UdWUgTWF5ICAzIDE5OjQzOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2FjaGUuYzogUmV3cm90ZSB0byB3b3JrIGNvcnJlY3RseS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogb3BuY2xzLmMgKGJmZF9jYWNoZV9pbml0LCBiZmRfb3Blbl9maWxlKTogRG9uJ3QgZGVjbGFyZS4KLQkoYmZkX2Zkb3BlbnIpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YgYmZkX2NhY2hlX2luaXQuCi0KLUZyaSBBcHIgMjkgMTU6MDg6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjZi1tNjhrbHlueC5jIChDQUxDX0FEREVORCk6IENoZWNrIGZvciBQQyByZWxhdGl2ZSByZWxvY3MgYnkKLQllbnVtZXJhdGluZyB0aGVtLCBzaW5jZSB0aGUgcmVsb2MgdHlwZSBjYW4gbm90IHNlcnZlIGFzIGFuIGluZGV4Ci0JaW50byB0aGUgbTY4ayBDT0ZGIGhvd3RvX3RhYmxlLgotCi1GcmkgQXByIDI5IDA5OjQyOjM5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcuYmZkICgqLWdvMzIpOiBDaGFuZ2VkIHRvIGNvZmYuCi0JKiBjb2ZmLWg4MzAwLmMgKEpNUEwxKTogR2V0IEhPV1RPIHJpZ2h0IGZvciAyNGJpdCBicmFuY2hlcy4KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9zeW1ib2xzKTogV3JpdGUgb3V0IHRoZSBjb3JyZWN0IG51bWJlciBvZgotCXN5bWJvbHMgYW5kIGRvbid0IHN0aWNrIGluIGV4dHJhIG51bGxzLgotCi1UdWUgQXByIDI2IDE1OjA3OjI0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY2Ytc3BhcmNseW54LmMgKExZTlhPUywgQ09GRl9MT05HX0ZJTEVOQU1FUyk6IERlZmluZS4KLQkqIGNvZmYtc3BhcmMuYyAoQkFETUFHKTogUmVjb2duaXplIExZTlhDT0ZGTUFHSUMuCi0JKENPRkZfU1BBUkMpOiBEZWZpbmUuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBJZiBDT0ZGX1NQQVJDLCBzZXQgYWxpZ25tZW50Ci0JcG93ZXIgb2YgZGF0YSBhbmQgYnNzIHNlY3Rpb25zIHRvIDMuCi0JKiBob3N0cy9seW54LmggKF9fTFlOWE9TKTogRGVmaW5lLgotCi1UdWUgQXByIDI2IDE1OjA0OjI2IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3JlbG9jKTogQWRqdXN0IHRoZSBhZGRlbmQgb2YgcmVsb2NhdGlvbnMKLQlhZ2FpbnN0IHNlY3Rpb24gc3ltYm9scyB0byBhdm9pZCBsb3NpbmcgZHVyaW5nIGxkIC1yLgotCi1UdWUgQXByIDI2IDEyOjE2OjQxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oIChzaHN0cnRhYl9sZW5ndGhfZml4ZWQpOiBSZW1vdmUgdXNlbGVzcyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkoc3RydWN0IGVsZl9zZWN0X2RhdGEpOiBSZW1vdmUgdW51c2VkIHN0cnVjdHVyZS4KLQkoZWxmX29iamVjdF9wKTogRnJlZSBtZW1vcnkgaWYgZXJyb3Igb2NjdXJzLiAgQ2hlY2sgcmV0dXJuIHZhbHVlCi0Jb2YgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaC4gIElmIGVsZl9nZXRfc3RyX3NlY3Rpb24gZmFpbHMsCi0JcHJlc2VydmUgZXJyb3IgY29kZSByYXRoZXIgdGhhbiBzZXR0aW5nIHdyb25nX2Zvcm1hdC4KLQkobnVsbF9zaGRyKTogUmVtb3ZlIHN0YXRpYyB2YXJpYWJsZS4KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IFJlbW92ZSBzaHN0cnRhYl9sZW5ndGhfZml4ZWQgYXNzaWdubWVudC4KLQlBbGxvY2F0ZSBmaXJzdCBzZWN0aW9uIGhlYWRlciBvbiBCRkQgb2JzdGFjayByYXRoZXIgdGhhbiB1c2luZwotCW51bGxfc2hkci4KLQkoYmZkX3BycHNpbmZvKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBuZXdzZWN0LgotCi1Nb24gQXByIDI1IDE1OjMxOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBVbmRvIHBhdGNoIG9mIEFwciAxMDsgYnJlYWtzIFNvbGFyaXMuCi0KLQkqIGVsZmNvZGUuaCAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogVXNlIGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5Ci0JdG8gY3JlYXRlIHNlY3Rpb25zLiAgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIHJlY3Vyc2l2ZSBjYWxscy4KLQkoYmZkX3NlY3Rpb25fZnJvbV9waGRyKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9tYWtlX3NlY3Rpb24uCi0JKGVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGVsZl9vYmplY3RfcCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfc2VjdGlvbl9mcm9tX3NoZHIuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBMaWtld2lzZS4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCXNlY3Rpb25fZnJvbV9lbGZfaW5kZXguCi0JKGJmZF9wcnN0YXR1cyk6IFJldHVybiBib29sZWFuIHZhbHVlLiAgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JYmZkX21ha2Vfc2VjdGlvbi4KLQkoYmZkX2ZwcmVnc2V0KTogTGlrZXdpc2UuCi0JKGJmZF9wcnBzaW5mbyk6IFJldHVybiBib29sZWFuIHZhbHVlLgotCShlbGZfY29yZWZpbGVfbm90ZSk6IENoZWNrIHJldHVybiB2YWx1ZXMgb2YgYmZkX3Byc3RhdHVzLAotCWJmZF9mcHJlZ3NldCwgYW5kIGJmZF9wcnBzaW5mby4KLQkoZWxmX2NvcmVfZmlsZV9wKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGVsZl9jb3JlZmlsZV9ub3RlLgotCi1GcmkgQXByIDIyIDExOjA4OjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUdldCByaWQgb2YgdGhlIEVDT0ZGIC5yZWdpbmZvIHNlY3Rpb24gaGFjay4KLQkqIGVjb2ZmLmMgKGVjb2ZmX21rb2JqZWN0X2hvb2spOiBEb24ndCBjcmVhdGUgYSAucmVnaW5mbyBzZWN0aW9uLgotCShlY29mZl9uZXdfc2VjdGlvbl9ob29rKTogRG9uJ3QgaGFuZGxlIHRoZSAucmVnaW5mbyBzZWN0aW9uLgotCShlY29mZl9zaXplb2ZfaGVhZGVycyk6IExpa2V3aXNlLgotCShlY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IExpa2V3aXNlLgotCShlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkoZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgdGhlIEdQIHZhbHVlIGFuZCB0aGUKLQlyZWdpc3RlciBtYXNrcy4KLQkoYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyk6IE5ldyBmdW5jdGlvbi4KLQkqIGJmZC1pbi5oIChiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkoYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSk6IERlY2xhcmUuCi0JKGJmZF9lY29mZl9zZXRfcmVnbWFza3MpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi0JRml4IEVDT0ZGIG9iamNvcHkgdG8gYWN0dWFsbHkgY29weSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0JKiBlY29mZi5jIChlY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9nZXRfZXh0cik6IEFzc3VtZSB0aGF0IGFueSBFQ09GRiBzeW1ib2wgd2l0aCBsb2NhbCBjbGVhciBpcwotCWFuIGV4dGVybmFsIHN5bWJvbCwgcmF0aGVyIHRoYW4gY2hlY2tpbmcgdGhlIHN5bWJvbCBmbGFncy4gIE9ubHkKLQljaGVjayB0aGUgZmxhZ3MgZm9yIG5vbi1FQ09GRiBzeW1ib2xzLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMpOiBEb24ndCBjcmFzaCBpZiB0aGUKLQlvdXRwdXRfc2VjdGlvbiBmaWVsZCBvZiB0aGUgc3ltYm9sIHNlY3Rpb24gaXMgTlVMTC4KLQkqIGxpYmVjb2ZmLmggKGVjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEZWNsYXJlIGFzCi0JZnVuY3Rpb24gcmF0aGVyIHRoYW4gZGVmaW5pbmcgYXMgbWFjcm8uCi0KLQkqIGllZWUuYyAoaWVlZV9vYmplY3RfcCk6IFNldCBiZmRfZXJyb3JfZ290X3dyb25nX2Zvcm1hdCBpZgotCWFwcHJvcHJpYXRlLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYy4KLQotCSogYW91dC1hZG9iZS5jIChhb3V0X2Fkb2JlX3NldF9hcmNoX21hY2gpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLiAgQWNjZXB0IGJmZF9hcmNoX202OGsgYXMgd2VsbCBhcwotCWJmZF9hcmNoX3Vua25vd24uCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9hcmNoX21hY2gpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoLgotCSogZWxmY29kZS5oIChlbGZfc2V0X2FyY2hfbWFjaCk6IERvbid0IGNoZWNrIGEgbGlzdCBvZiBFTEYKLQlhcmNoaXRlY3R1cmVzLCBqdXN0IHNlZSBpZiB0aGUgZGVzaXJlZCBhcmNoaXRlY3R1cmUgbWF0Y2hlcyB3aGF0Ci0JdGhlIEVMRiBiYWNrZW5kIHBlcm1pdHMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogUmVuYW1lIFNITUFHSUMgdG8KLQlTSF9BUkNIX01BR0lDIHRvIG1hdGNoIGNoYW5nZSBpbiBjb2ZmL3NoLmguCi0JKGNvZmZfc2V0X2ZsYWdzKTogTGlrZXdpc2UuCi0KLQlGb2xsb3cgY29udmVudGlvbiBpbiB3aGljaCBlYWNoIE5MTSBoZWFkZXIgaGFzIGFuIDggYnl0ZSBzdGFtcAotCWZvbGxvd2VkIGJ5IGEgZm91ciBieXRlIGxlbmd0aC4KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IFJlbmFtZSBubG1fY3lnbnVzX3NlY3Rpb25faGRyCi0JdG8gbmxtX2N5Z251c19leHRfaGVhZGVyLCBhbmQgY2hhbmdlIHR5cGUgdG8KLQlObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIuCi0JKG5sbV9jeWdudXNfZXh0X2hlYWRlcik6IFJlbmFtZSBmcm9tIG5sbV9jeWdudXNfc2VjdGlvbl9oZWFkZXIuCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogVXNlIEN5R25Vc0V4IGluc3RlYWQKLQlvZiBDeUduVXNTZUNzLiAgUmVuYW1lIGZyb20gY3lnbnVzX3NlY3Rpb24gdG8gY3lnbnVzX2V4dC4gIFJlcXVpcmUKLQlsZW5ndGggd29yZCB0byBiZSA4LgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbiB0bwotCWN5Z251c19leHQuICBTZXQgbGVuZ3RoIHdvcmQgdG8gOC4KLQkobmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJlbmFtZSBmcm9tIGN5Z251c19zZWN0aW9uCi0JdG8gY3lnbnVzX2V4dC4KLQotVGh1IEFwciAyMSAyMjo1NDoyMiAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBubG1jb2RlLmggKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogIEtlZXAgc2VjdGlvbiB0YWJsZQotCShmcm9tIEN5R25Vc1NlQ3MpIGluIG1vcmUgcGVybWFuZW50IG1lbW9yeSB0byBrZWVwIHNlY3Rpb24gbmFtZXMKLQlmcm9tIGdldHRpbmcgdHJhc2hlZC4KLQotVGh1IEFwciAyMSAwOToyOTozNyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGxpYmVsZi5oIChlbGZfb2JqX3RkYXRhKTogIEFkZCBtZW1iZXJzIGZvciBkeW5hbWljIHN5bWJvbCB0YWJsZQotCWhhbmRsaW5nLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiAgSGFuZGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIFRha2UgYWRkaXRpb25hbCBwYXJhbWV0ZXIKLQl0byBzZWxlY3Qgc3RhdGljIG9yIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGFuZCByZXR1cm4gbnVtYmVyIG9mCi0Jc3ltYm9scyBzbHVycGVkIG9yIC0xIG9uIGVycm9yLgotCSogZWxmY29kZS5oIChlbGZfZ2V0X3N5bXRhYik6ICBTZXQgYmZkIHN5bWNvdW50IGZyb20KLQllbGZfc2x1cnBfc3ltYm9sX3RhYmxlIHJlc3VsdC4KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCwKLQllbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogIE5ldyBmdW5jdGlvbnMgdG8gaGFuZGxlIGR5bmFtaWMKLQlzeW1ib2wgdGFibGUuCi0JKiBlbGYzMi10YXJnZXQuaCwgZWxmNjQtdGFyZ2V0LmggKEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMpOgotCUNoYW5nZSB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2wgdGFibGUsIHByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9ucwotCWZvciBkeW5hbWljIHJlbG9jcy4KLQkqIGFvdXR4LmggKGhvd3RvX3RhYmxlX3N0ZCwgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCksCi0JTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSwgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkLAotCWFvdXRfbGlua19yZWxvY19saW5rX29yZGVyKTogIEhhbmRsZSByX2ptcHRhYmxlIGFuZCByX3JlbGF0aXZlCi0JcmVsb2NhdGlvbnMuCi0KLVRodSBBcHIgMjEgMTE6NTg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2xlYW4gdXAgdXNlcyBvZiBfYmZkX2R1bW15X3RhcmdldCAoZnJvbSBQZXRlciBTY2hhdWVyKS4KLQkqIGxpYmJmZC5jIChfYmZkX2R1bW15X3RhcmdldCk6IFNldCBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0LgotCSogbmxtLXRhcmdldC5oIChubG1fY29yZV9maWxlX3ApOiBEZWZpbmUgYXMgX2JmZF9kdW1teV90YXJnZXQsIG5vdAotCU5VTEwuCi0JKiBzcmVjLmMgKHNyZWNfdmVjKTogVXNlIF9iZmRfZHVtbXlfdGFyZ2V0LCBub3QgTlVMTCwgaW4KLQlfYmZkX2NoZWNrX2Zvcm1hdC4KLQkoc3ltYm9sc3JlY192ZWMpOiBMaWtld2lzZS4KLQkqIHRla2hleC5jICh0ZWtoZXhfdmVjKTogTGlrZXdpc2UuCi0KLQkqIGxpYm5sbS5oIChzdHJ1Y3QgbmxtX29ial90ZGF0YSk6IEFkZCBubG1fY3lnbnVzX3NlY3Rpb25faGRyCi0JZmllbGQuCi0JKG5sbV9jeWdudXNfc2VjdGlvbl9oZWFkZXIpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKiBubG1jb2RlLmggKG5sbV9vYmplY3RfcCk6IEZyZWUgbmV3IHRkYXRhIHN0cnVjdHVyZSBpZiBmYWlsdXJlLgotCUFkZCBmaXhlZCBzZWN0aW9ucyBiZWZvcmUgc3dhcHBpbmcgaW4gYXV4aWxpYXJ5IGhlYWRlcnMuICBBZnRlcgotCWFkZGluZyBzZWN0aW9ucywgdHJlYXQgZXJyb3JzIGFzIHJlYWwsIG5vdCBhcyB3cm9uZyBmb3JtYXQuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX2luKTogU3dhcCBpbiB0aGUgc2VjdGlvbnMgaGVhZGVyOyBhZGQKLQlzZWN0aW9ucyB0byB0aGUgQkZEIGZvciBlYWNoIHNlY3Rpb24gaXQgZGVzY3JpYmVzLgotCShubG1fc3dhcF9hdXhpbGlhcnlfaGVhZGVyc19vdXQpOiBTd2FwIG91dCB0aGUgc2VjdGlvbnMgaGVhZGVyLgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWNjb3VudCBmb3IgdGhlIHNpemUgb2YgdGhlCi0Jc2VjdGlvbnMgaGVhZGVyLgotCi1XZWQgQXByIDIwIDE2OjQ1OjUxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtc3BhcmMuYyAoc3BhcmNjb2ZmX3ZlYyk6IENoYW5nZSBtaW5pbXVtIGFsaWdubWVudCBwb3dlciB0bwotCTIsIHNvIHRoYXQgc3RhYiBzZWN0aW9ucyBjYW4gYmUgbXVsdGlwbGVzIG9mIDQgYnl0ZXMgb25seS4KLQotCSogaG9zdHMvaTM4NmFpeC5oOiBDaGFuZ2VzIHRvIGF2b2lkIHByb3RvdHlwZXMgY29uZmxpY3RzIHdpdGggdGhlCi0Jb25lcyBkZWZpbmVkIGluIHN0ZGxpYi5oLiAgKEZyb20gTWluaCBUcmFuLUxlLikKLQotV2VkIEFwciAyMCAxNDoxNToyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbTMyLXBwYy5jOiBDb21wbGV0ZSByZXdyaXRlIGZvciBuZXcgdmVyc2lvbiBvZiBQb3dlclBDCi0JTmV0V2FyZS4gIE9sZCBjb2RlIHN0aWxsIHByZXNlbnQsIGJ1dCBpZmRlZmZlZCBvdXQuCi0KLQkqIG5sbWNvZGUuaCAobmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4pOiBEb24ndCBhc3N1bWUgYQotCXBhcnRpY3VsYXIgZm9ybWF0IGZvciB0aGUgY3VzdG9tZXIgaGVhZGVyLiAgQWxsb2NhdGUgYSBibG9jayBvZgotCW1lbW9yeSBhbmQgcmVhZCBpdCBpbnRvIHRoYXQuCi0JKG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dCk6IFdyaXRlIG91dCB0aGUgYmxvY2sgb2YgbWVtb3J5LgotCShubG1fY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSW5jbHVkZSBsZW5ndGggb2YgY3VzdG9tZXIKLQloZWFkZXIgd2hlbiBjb21wdXRpbmcgaXRzIHNpemUuCi0KLU1vbiBBcHIgMTggMTQ6Mjc6MTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fcHJlcF9oZWFkZXJzKTogR2V0IHRoZSBzcGFjZSdzIG51bWJlciBmcm9tIHRoZQotCWJhY2tlbmQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgcmF0aGVyIHRoYW4gdGFyZ2V0X2luZGV4LgotCShiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBTdG9yZSB0aGUgc3BhY2UncyBudW1iZXIKLQlpbiB0aGUgYmFja2VuZCBwcml2YXRlIHNlY3Rpb24gZGF0YSByYXRoZXIgdGhhbiB0YXJnZXRfaW5kZXguCi0KLQkqIHNvbS5oIChzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCk6IEFkZCBzcGFjZV9udW1iZXIuCi0KLUZyaSBBcHIgMTUgMTI6MjI6MDcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWEyOWsuYyAocmVsb2NfcHJvY2Vzc2luZyk6IEFsd2F5cyBzZXQgdGhlIGFkZHJlc3Mgb2YgYQotCVJfSUhDT05TVCByZWxvYyB0byB0aGF0IG9mIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgUl9JSElIQUxGLgotCWdhcyBkb2VzIHRoaXMgYW55aG93LCBidXQgc29tZSBvdGhlciBhc3NlbWJsZXJzIHNlZW0gdG8gbGVhdmUKLQlnYXJiYWdlIGluIHRoZSBSX0lIQ09OU1QgYWRkcmVzcyBmaWVsZC4KLQotCSogYmZkL2FyY2hpdmUuYzogQ29uc2lzdGVudGx5IHVzZSBBUkZNQUc7IGZyb20KLQlzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUgKEFuZHJlYXMgU2Nod2FiKS4KLQkoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogVXNlIEFSRk1BRyByYXRoZXIgdGhhbiAnYCcgYW5kCi0JJ1wwMTInLgotCShic2Rfd3JpdGVfYXJtYXApOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9hcm1hcCk6IExpa2V3aXNlLgotCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogV2hlbiByZWxheGluZywgYWRqdXN0IGxvY2FsCi0JcmVsb2NzIGFnYWluc3QgdGhlIC50ZXh0IHNlY3Rpb24gYXMgcmVxdWlyZWQuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBXaGVuIHJlbGF4aW5nLCBhZGp1c3QKLQlQRFIgYWRkcmVzc2VzIGFzIHJlcXVpcmVkLgotCi0JKiBlY29mZi5jIChlY29mZl9lbWl0X2FnZ3JlZ2F0ZSk6IFRha2UgZmRyIGFyZ3VtZW50LiAgTWFwIGZkcgotCWluZGV4IHRocm91Z2ggcmZkIG1hcCBpZiBpdCBleGlzdHMuICBDaGVjayBmb3IgYSBjb3VwbGUgb2YgY2FzZXMKLQl3aGljaCBnZGIgaGFuZGxlcyBzcGVjaWFsbHkuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGVjb2ZmX3R5cGVfdG9fc3RyaW5nKTogVGFrZSBmZHIgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXV4X3B0ciBhbmQKLQliaWdlbmRpYW4gYXJndW1lbnQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGVjb2ZmX3ByaW50X3N5bWJvbCk6IEhhbmRsZSBzdFN0cnVjdCwgc3RVbmlvbiBhbmQgc3RFbnVtLgotCi1UaHUgQXByIDE0IDEzOjA1OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfaG93dG9fdGFibGUpOiBBZGQgZHVtbXkgZW50cmllcyB0byBhY2NvdW50IGZvcgotCW51bWJlcmluZyBjaGFuZ2VzIGluIGluY2x1ZGUvY29mZi9taXBzLmguICBBZGQgZW50cmllcyBmb3IKLQlNSVBTX1JfUkVMSEkgYW5kIE1JUFNfUl9SRUxMTy4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX2luKTogSGFuZGxlIGFuIGV4dHJhIGJpdCBmb3IgdGhlIHJlbG9jIHR5cGUKLQl3aGVuIGxpdHRsZSBlbmRpYW4uICBUcmVhdCBpbnRlcm5hbCBNSVBTX1JfUkVMTE8gb3IgTUlQU19SX1JFTEhJCi0JcmVsb2NzIGxpa2UgTUlQU19SX1NXSVRDSCwgYW5kIGNvbnZlcnQgcl9vZmZzZXQgZnJvbSAyNCB0byAzMgotCWJpdHMuCi0JKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkobWlwc19hZGp1c3RfcmVsb2NfaW4pOiBIYW5kbGUgaW50ZXJuYWwgTUlQU19SX1JFTExPIG9yCi0JTUlQU19SX1JFTEhJIHJlbG9jcyBsaWtlIE1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfYWRqdXN0X3JlbG9jX291dCk6IExpa2V3aXNlLgotCShtaXBzX3JlbGhpX2FkZHIsIG1pcHNfcmVsaGlfYWRkZW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1pcHNfcmVsaGlfcmVsb2MsIG1pcHNfcmVsbG9fcmVsb2MpOiBOZXcgZnVuY3Rpb25zLgotCShtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IFR1cm4gQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBpbnRvCi0JTUlQU19SX1JFTEhJIGFuZCB0dXJuIEJGRF9SRUxPQ19QQ1JFTF9MTzE2IGludG8gTUlQU19SX1JFTExPLgotCShtaXBzX3JlbG9jYXRlX2hpKTogUmVuYW1lIGZyb20gbWlwc19yZWxvY2F0ZV9yZWZoaSwgYW5kIGFkZCBwY3JlbAotCWFyZ3VtZW50LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogUmVuYW1lIGdvdF9yZWZsbyB0byBnb3RfbG8gYW5kCi0JcmVmbG9faW50X3JlbCB0byBsb19pbnRfcmVsLiAgSGFuZGxlIE1JUFNfUl9SRUxMTyBhbmQgTUlQU19SX1JFTEhJCi0JcmVsb2NzLgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBBZGp1c3QgTUlQU19SX1JFTEhJL01JUFNfUl9SRUxMTyBwYWlycyB3aGVuCi0JZXhwYW5kaW5nIGEgUEMgcmVsYXRpdmUgY2FsbC4KLQotCSogcmVsb2MuYyAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MKLQlhbmQgQkZEX1JFTE9DX1BDUkVMX0xPMTYuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVdlZCBBcHIgMTMgMTE6NTA6MDcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb2ZmLXNwYXJjLmMgKHNwYXJjY29mZl92ZWMpOiBTZXQgbWluaW11bSBhbGlnbm1lbnQgcG93ZXIgdG8gMy4KLQotVHVlIEFwciAxMiAxMzozNjoyMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV93cml0ZV9maXh1cHMpOiBBbHdheXMgZW1pdCBhdCBsZWFzdAotICAgICAgICBvbmUgcmVsb2NhdGlvbiBmb3IgYW55IG5vbi1ic3Mgc2VjdGlvbi4KLQotTW9uIEFwciAxMSAxNDo0MTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBEb24ndCByZXF1aXJlCi0JdGhlIGZpbGUgYWxpZ25tZW50IHRvIGNvcnJlc3BvbmQgdG8gdGhlIHBhZ2Ugc2l6ZSB3aGVuIGxpbmtpbmcKLQl3aXRoIC1OLgotCi1TdW4gQXByIDEwIDAxOjAyOjI0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEZvciByZWxhIHJlbG9jYXRpb25zLCBhZGp1c3QgdGhlCi0JYWRkZW5kIGZvciByZWxvY2F0aW9ucyBpbnZvbHZpbmcgc2VjdGlvbiBzeW1ib2xzIHRvIGFjY291bnQKLQlmb3IgdGhlIGxvc3NhZ2Ugb2YgMToxIG1hcHBpbmcgZnJvbSBpbnB1dCBzZWN0aW9uIHN5bWJvbHMgdG8KLQlvdXRwdXQgc2VjdGlvbiBzeW1ib2xzLgotCi1GcmkgQXByICA4IDEyOjIyOjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpKTogTmV3IGZ1bmN0aW9uLgotCShOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IENhbGwgTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpCi0JcmF0aGVyIHRoYW4gbWFraW5nIHNlY3Rpb25zIGlubGluZS4KLQkoTkFNRShhb3V0LG1rb2JqZWN0KSk6IERvbid0IG1ha2UgYW55IHNlY3Rpb25zLgotCShOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSk6IENhbGwgTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpLgotCShOQU1FKGFvdXQsZmluYWxfbGluaykpOiBEb24ndCBkZXJlZmVyZW5jZSBvYmpfdGV4dHNlYyAoYWJmZCkgb3IKLQlvYmpfZGF0YXNlYyAoYWJmZCkgaWYgdGhleSBhcmUgTlVMTC4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LG1ha2Vfc2VjdGlvbnMpKTogRGVjbGFyZS4KLQkqIGJvdXQuYyAoYl9vdXRfbWtvYmplY3QpOiBEb24ndCBtYWtlIGFueSBzZWN0aW9ucy4KLQkoYl9vdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBhb3V0XzMyX21ha2Vfc2VjdGlvbnMuCi0JKGJfb3V0X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiBpMzg2b3M5ay5jIChvczlrX21rb2JqZWN0KTogRG9uJ3QgbWFrZSBhbnkgc2VjdGlvbnMuCi0JKG9zOWtfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2FsbCBhb3V0XzMyX21ha2Vfc2VjdGlvbnMuCi0JKG9zOWtfc2V0X3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spKTogRG9uJ3Qgc2V0IE5fRVhUIGluIHRhcmdldAotCWluZGV4LgotCi1XZWQgQXByICA2IDIwOjQ0OjU2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uZmlnLmJmZCwgY29uZmlndXJlLmhvc3Q6ICBBZGQgbWlwcy0qLXN5c3Y0KiBzdXBwb3J0LgotCi1UaHUgQXByICA3IDE0OjIzOjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfaG93dG9fdGFibGUpOiBBZGQgZW50cnkgZm9yIE1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbik6IEZvciBNSVBTX1JfU1dUSUNILCBjb3B5IHJfc3ltbmR4IGludG8KLQlyX29mZnNldCBhbmQgc2V0IHJfc3ltbmR4IHRvIFJFTE9DX1NFQ1RJT05fVEVYVC4KLQkobWlwc19lY29mZl9zd2FwX3JlbG9jX291dCk6IEZvciBNSVBTX1JfU1dJVENILCBnZXQgdGhlIHJfc3ltbmR4Ci0JdmFsdWUgZnJvbSB0aGUgcl9vZmZzZXQgZmllbGQuCi0JKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogTWF4aW11bSByX3R5cGUgdmFsdWUgaXMgbm93IE1JUFNfUl9TV0lUQ0guCi0JRm9yIE1JUFNfUl9TV0lUQ0gsIGNvcHkgdGhlIHJfb2Zmc2V0IGZpZWxkIGludG8gdGhlIGFkZGVuZCBmaWVsZC4KLQkobWlwc19hZGp1c3RfcmVsb2Nfb3V0KTogRm9yIE1JUFNfUl9TV0lUQ0gsIGNvcHkgdGhlIGFkZGVuZCBmaWVsZAotCWludG8gdGhlIHJfb2Zmc2V0IGZpZWxkLgotCShtaXBzX3N3aXRjaF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUcmFuc2xhdGUgQkZEX1JFTE9DX0dQUkVMMzIgaW50bwotCU1JUFNfUl9TV0lUQ0guCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBNSVBTX1JfU1dJVENILgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBBZGp1c3QgTUlQU19SX1NXSVRDSCBvZmZzZXQgaWYgbmVjZXNzYXJ5LgotCi1UaHUgQXByICA3IDExOjEwOjUxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKGVsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFN1cHBvcnQgY2FsbGluZyB0aGUgYmFja2VuZAotCWZ1bmN0aW9uIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3Npbmcgd2hlbiBqdXN0IGJlZ2lubmluZyB0bwotCXdyaXRlIGFuIG9iamVjdCBmaWxlLgotCi0JKiBsaWJlbGYuaCAoZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0KLQkqIGVsZnszMiw2NH0tdGFyZ2V0LmggKGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpOiBQcm92aWRlCi0JYSBkZWZhdWx0IGRlZmluaXRpb24uCi0JKGVsZnszMiw2NH1fYmVkKTogQWRkIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcuCi0JCi0JKiBlbGYzMi1ocHBhLmggKGVsZl9ocHBhX3RjX3N5bWJvbCk6IERlbGV0ZSBleHRlcm4gZGVjbGFyYXRpb24uCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotCSogZWxmMzItaHBwYS5jIChzeW1leHRfY2hhaW5fYnVpbHQpOiBEZWxldGUuCi0JKHN5bWV4dF9jaGFpbl9zaXplKTogUmVuYW1lZCBmcm9tIHN5bWV4dG5fY29udGVudHNfcmVhbF9zaXplLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfe2JlZ2luLGZpbmFsfV93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9ucy4KLQkoYWRkX2VudHJ5X3RvX3N5bWV4dF9jaGFpbik6IE5ldyBmdW5jdGlvbi4KLQkoaHBwYV9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMpOiBJZ25vcmUgd3JpdGVzIHRvIHRoZSBzeW1ib2wgZXh0ZW5zaW9uCi0Jc2VjdGlvbiB1bnRpbCBpdCdzIGJlZW4gcmVidWlsdCBpbnRlcm5hbGx5LgotCShocHBhX2VsZl9nZXRfc2VjdGlvbl9jb250ZW50cyk6IFN5bWJvbCBleHRlbnNpb24gc2VjdGlvbiBpcyBubwotCWxvbmdlciBzcGVjaWFsLgotCShlbGZfYmFja2VuZF97YmVnaW4sZmluYWx9X3dyaXRlX3Byb2Nlc3NpbmcpOiBEZWZpbmUuCi0JKGVsZl9ocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBTaW1wbGlmeSBub3cgdGhhdCBtdWNoIGNvZGUgaGFzCi0JbWlncmF0ZWQgaW50byBlbGYzMl9ocHBhX2JhY2tlbmRfe2JlaW5nLGZpbmFsfV93cml0ZV9wcm9jZXNzaW5nLgotCi1XZWQgQXByICA2IDE3OjI0OjE0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCBuZXcgdGFyZ2V0IHZlY3RvcnMgdG8gcmVhZCB0aGUgZHluYW1pYyBzeW1ib2xzIGFuZCBkeW5hbWljCi0JcmVsb2NzLiAgQ2hhbmdlIGEub3V0IHRvIHVzZSB0aGVzZSByYXRoZXIgdGhhbiByZWFkaW5nIHRoZSBkeW5hbWljCi0Jc3ltYm9scyBhbmQgcmVsb2NzIGFsb25nIHdpdGggdGhlIG5vcm1hbCBzeW1ib2xzIGFuZCByZWxvY3MuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgZmllbGRzCi0JX2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQsCi0JX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIsCi0JX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCwKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jLgotCShCRkRfSlVNUF9UQUJMRV9EWU5BTUlDKTogRGVmaW5lLgotCSogbGliYmZkLWluLmggKF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6Ci0JRGVmaW5lLgotCShfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWZpbmUuCi0JKF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlZmluZS4KLQkqIGJmZC5jIChiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGVmaW5lLgotCShiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogRGVmaW5lLgotCShiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlZmluZS4KLQkqIHN1bm9zLmMgKE1ZX3JlYWRfZHluYW1pY19zeW1ib2xzKTogRG9uJ3QgZGVmaW5lLgotCShNWV9yZWFkX2R5bmFtaWNfcmVsb2NzKTogRG9uJ3QgZGVmaW5lLgotCShNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IERlZmluZS4KLQkoTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBEZWZpbmUuCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVmaW5lLgotCShzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvKTogQ2hhbmdlIHR5cGUgb2YgZHluc3ltX2NvdW50IGFuZAotCWR5bnJlbF9jb3VudCB0byBsb25nLiAgQWRkIGZpZWxkcyBjYW5vbmljYWxfZHluc3ltIGFuZAotCWNhbm9uaWNhbF9keW5yZWwuCi0JKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogQ2hlY2sgdGhhdCBCRkQgaGFkIERZTkFNSUMgZmxhZyBzZXQuCi0JQ2xlYXIgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSBhbmQgaW5mby0+Y2Fub25pY2FsX2R5bnJlbC4KLQkoTVkocmVhZF9keW5hbWljX3N5bWJvbHMpKTogUmVtb3ZlZC4KLQkoTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBSZW1vdmVkLgotCShzdW5vc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkoc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYW91dC5oOiBEZWNsYXJlIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgYW5kCi0JcmVsb2Nfc3RkX2V4dGVybmFsIHRvIGF2b2lkIHByb3RvdHlwZSBwcm9ibGVtcy4KLQkoc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhKTogUmVtb3ZlIGZpZWxkcyByZWFkX2R5bmFtaWNfc3ltYm9scyBhbmQKLQlyZWFkX2R5bmFtaWNfcmVsb2NzLgotCShOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkpOiBEZWNsYXJlLgotCShOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pKTogRGVjbGFyZS4KLQkoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKSk6IERlY2xhcmUuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkpOiBSZW5hbWVkIGZyb20KLQl0cmFuc2xhdGVfc3ltYm9sX3RhYmxlIGFuZCBtYWRlIG5vbi1zdGF0aWMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERvbid0IHJlYWQgZHluYW1pYyBzeW1ib2xzLgotCShOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogRG9uJ3QgcmVhZCBkeW5hbWljIHJlbG9jcy4KLQkoTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBEb24ndCBjb3VudCBkeW5hbWljIHJlbG9jcy4KLQkqIGFvdXRmMS5oIChhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBib3RoZXIgdG8KLQlyZW1vdmUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICBUaGV5IHdpbGwgbm8gbG9uZ2VyIGJlCi0JcHJlc2VudC4KLQkoTVlfcmVhZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX3JlYWRfZHluYW1pY19yZWxvY3MpOiBEb24ndCBkZWZpbmUuCi0JKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBEb24ndCBpbml0aWFsaXplIGR5bmFtaWMgZW50cnkgcG9pbnRzLgotCSogYW91dC10YXJnZXQuaCAoTVlfcmVhZF9keW5hbWljX3N5bWJvbHMpOiBEb24ndCBkZWZpbmUuCi0JKE1ZX3JlYWRfZHluYW1pY19yZWxvY3MpOiBEb24ndCBkZWZpbmUuCi0JKE1ZKGJhY2tlbmRfZGF0YSkpOiBEb24ndCBpbml0aWFsaXplIGR5bmFtaWMgZW50cnkgcG9pbnRzLgotCShNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIHRvCi0JX2JmZF9ub2R5bmFtaWMgdmVyc2lvbi4KLQkoTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTGlrZXdpc2UuCi0JKE1ZX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBBbGwgYmFja2VuZHM6IEFkZGVkIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgdG8gdGFyZ2V0IHZlY3Rvci4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBjZi1tNjhrbHlueC5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCi0JKiBocDMwMGhwdXguYzogUmVtb3ZlZCBzb21lIHNwYWNlcyBpbiB1c2VzIG9mIE5BTUUgdG8gYXZvaWQKLQlwcm9ibGVtcyB3aXRoIHRyYWRpdGlvbmFsIEMgY29tcGlsZXJzLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZWFycmFuZ2VkIGZpZWxkcyBpbiB0YXJnZXQgdmVjdG9yLgotCVJlbW92ZWQgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCBfYmZkX2RlYnVnX2luZm9fZW5kIGFuZAotCV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCB3aGljaCB3ZXJlIG5ldmVyIHVzZWQuCi0JKEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMsIEJGRF9KVU1QX1RBQkxFX0NPUFkpOiBEZWZpbmVkLgotCShCRkRfSlVNUF9UQUJMRV9DT1JFLCBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogRGVmaW5lZC4KLQkoQkZEX0pVTVBfVEFCTEVfU1lNQk9MUywgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKTogRGVmaW5lZC4KLQkoQkZEX0pVTVBfVEFCTEVfV1JJVEUsIEJGRF9KVU1QX1RBQkxFX0xJTkspOiBEZWZpbmVkLgotCSogQWxsIGJhY2tlbmRzOiBDaGFuZ2VkIHRvIHVzZSB0aGUgbmV3IEJGRF9KVU1QX1RBQkxFXyogbWFjcm9zCi0JcmF0aGVyIHRoYW4gdGhlIHNpbmdsZSBKVU1QX1RBQkxFIG1hY3JvLiAgUmVtb3ZlZCBtYW55IG9mIHRoZQotCXdlaXJkIG1hY3JvIGRlZmluaXRpb25zIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBtb25vbGl0aGljCi0JSlVNUF9UQUJMRS4KLQkqIGJmZC1pbi5oIChKVU1QX1RBQkxFKTogUmVtb3ZlZC4KLQkqIGxpYmJmZC1pbi5oOiBEZWZpbmUgYSBidW5jaCBvZiBtYWNyb3MsIGFuZCBkZWNsYXJlIGEgZmV3Ci0JZnVuY3Rpb25zLCBmb3IgdXNlIHdpdGggdGhlIG5ldyBCRkRfSlVNUF9UQUJMRV8qIG1hY3Jvcy4KLQkqIGxpYmJmZC5jIChfYmZkX2R1bW15X25ld19zZWN0aW9uX2hvb2spOiBSZW1vdmVkLgotCShiZmRfZmFsc2UpOiBTZXQgYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uLgotCShiZmRfbnVsbHZvaWRwdHIpOiBMaWtld2lzZS4KLQkoYmZkX24xKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApOiBSZW5hbWVkIGZyb20KLQlfYmZkX2R1bW15X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcC4KLQkoX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCk6IFNpbWlsYXIgcmVuYW1lLiAgU2V0Ci0JYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uLgotCShfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogUmVuYW1lZCBmcm9tCi0JYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBTaW1pbGFyIHJlbmFtZS4KLQkqIGllZWUuYzogI2lmIDAgb3V0IGllZWVfYmZkX2RlYnVnX2luZm9fc3RhcnQsCi0JaWVlZV9iZmRfZGVidWdfaW5mb19lbmQsIGllZWVfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZS4gIFRoZXkKLQl3ZXJlIG5ldmVyIGNhbGxlZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgQXByICA1IDIyOjEwOjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBDcnVkZSBzdXBwb3J0IGZvciBleGFtaW5pbmcgZHluYW1pYyBsaWJyYXJpZXMuCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IFNldCBEWU5BTUlDIGZsYWcgZm9yIFNITF9NQUdJQyBhbmQKLQlETF9NQUdJQyBvYmplY3RzLgotCShzb21fcHJlcF9oZWFkZXJzKTogUHJlc2VydmUgdGhlIHN5c3RlbV9pZCBmb3IgRFlOQU1JQyBvYmplY3RzLgotCVVzZSBTSExfTUFHSUMgYXMgdGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgRFlOQU1JQyBmbGFnIGlzIHNldC4KLQlXcml0ZSBleGVjIGhlYWRlcnMgZm9yIERZTkFNSUMgb2JqZWN0cy4KLQkoc29tX2JlZ2luX3dyaXRpbmcpOiBEWU5BTUlDIG9iamVjdHMgaGF2ZSB0aGUgc2FtZSBhbGlnbm1lbnQKLQlyZXN0cmljdGlvbnMgYXMgRF9QQUdFRCBvYmplY3RzLgotCShiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBUcmVhdCBEWU5BTUlDIG9iamVjdHMgbGlrZSBFWEVDX1AKLQlvYmplY3RzLgotCShvYmplY3RfZmxhZ3MpOiBBZGQgRFlOQU1JQy4KLQotVHVlIEFwciAgNSAxNzo0ODo1MiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGkzODZseW54LmMsIHNwYXJjbHlueC5jIChOQU1FKTogUmVtb3ZlIGVtYmVkZGVkIHdoaXRlc3BhY2UgaW4KLQltYWNybyB1c2VzLCBjb25mdXNlcyBzb21lIG5vbi1BTlNJIGNvbXBpbGVycy4KLQotVHVlIEFwciAgNSAxNTo1MDowMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IEFkZCBtaXNzaW5nIFBBUkFNUyBkZWNsLgotCURvbid0IGZyZWUgYW55dGhpbmcgaWYgd2UgZG9uJ3QgaGF2ZSBhIGJmZF9vYmplY3QuCi0JKHNvbV9jbG9zZV9hbmRfY2xlYW51cCk6IENhbGwgc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvLgotCi1UdWUgQXByICA1IDExOjIyOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rKTogRG9uJ3QgcmVtb3ZlIGVtcHR5IHNlY3Rpb25zLgotCUl0IHR1cm5zIG91dCBub3QgdG8gYmUgcmVxdWlyZWQgb24gSXJpeCA1LCBhbmQgaXQgY2F1c2VzIHByb2JsZW1zCi0JaWYgdGhlIHNlY3Rpb25zIGhhcHBlbiB0byBjb250YWluIHN5bWJvbHMuCi0KLQkqIGVsZmNvZGUuaCAod3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBDb3JyZWN0IGJmZF93cml0ZSBjaGVjay4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBEb24ndCBlcnJvciBvdXQgaWYKLQlzZWN0aW9uLT5yZWxvY2F0aW9uIGlzIE5VTEw7IG1hbGxvYyBtaWdodCBoYXZlIHJldHVybmVkIE5VTEwgd2hlbgotCWdpdmVuIGEgemVybyBzaXplIGlmIHRoZXJlIHdlcmUgbm8gcmVsb2NhdGlvbnMuCi0JKiBib3V0LmMgKGJfb3V0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChlbGZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBubG1jb2RlLmggKG5sbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfcmVsb2NfdGFibGUpKTogTGlrZXdpc2UuICBBbHNvLCBpZiBtYWxsb2MKLQlyZXR1cm5zIE5VTEwsIGRvbid0IHJlcG9ydCBhbiBlcnJvciBpZiB3ZSBhc2tlZCBmb3IgemVybyBieXRlcy4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkpOiBJZiBtYWxsb2MgcmV0dXJucwotCU5VTEwsIGRvbid0IHJlcG9ydCBhbiBlcnJvciBpZiB3ZSBhc2tlZCBmb3IgemVybyBieXRlcy4KLQkqIG5sbWNvZGUuaCAobmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyk6IExpa2V3aXNlLgotCi1Nb24gQXByICA0IDE1OjMwOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSk6IERvbid0IGZyZWUgYW55dGhpbmcKLQlpZiB3ZSBkb24ndCBoYXZlIGEgYmZkX29iamVjdC4KLQotCU1hZGUgc3VyZSB0aGF0IGV2ZXJ5IGNhbGwgdG8gYmZkX3JlYWQsIGJmZF93cml0ZSwgYW5kIGJmZF9zZWVrCi0JY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgYW5kIGhhbmRsZWQgYmZkX2Vycm9yIGNvcnJlY3RseS4gIFRoZXNlCi0JY2hhbmdlcyBhcmUgbm90IGl0ZW1pc2VkLiAgQWxzbzoKLQkqIGFvdXR4LmggKGVtaXRfc3RydGFiKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJvb2xlYW4sIGFuZCByZXR1cm4KLQllcnJvcnMuCi0JKE5BTUUoYW91dCx3cml0ZV9zeW1zKSk6IENoZWNrIGVtaXRfc3RydGFiIHJldHVybiB2YWx1ZS4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX3JlbG9jcyk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLAotCWFuZCByZXR1cm4gZXJyb3JzLgotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGNvZmZfd3JpdGVfcmVsb2NzIHJldHVybgotCXZhbHVlLgotCSogaTM4Nm9zOWsuYyAob3M5a19zd2FwX2V4ZWNfaGVhZGVyX2luKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvCi0JYm9vbGVhbi4KLQkob3M5a19vYmplY3RfcCk6IENoZWNrIG9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiByZXR1cm4gdmFsdWUuCi0JKiBvYXN5cy5jIChvYXN5c19yZWFkX3JlY29yZCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShvYXN5c19zbHVycF9zeW1ib2xfdGFibGU6IENoZWNrIG9hc3lzX3JlYWRfcmVjb3JkIHJldHVybiB2YWx1ZS4KLQkob2FzeXNfb2JqZWN0X3AsIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSk6IExpa2V3aXNlLgotCShvYXN5c193cml0ZV9yZWNvcmQpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQkob2FzeXNfd3JpdGVfc3ltcyk6IExpa2V3aXNlLiAgQWxzbywgY2hlY2sgb2FzeXNfd3JpdGVfcmVjb3JkCi0JcmV0dXJuIHZhbHVlLgotCShvYXN5c193cml0ZV9zZWN0aW9ucyk6IENoZWNrIG9hc3lzX3dyaXRlX3JlY29yZCByZXR1cm4gdmFsdWUuCi0JKG9hc3lzX3dyaXRlX2hlYWRlcik6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLiAgQ2hlY2sKLQlvYXN5c193cml0ZV9yZWNvcmQgcmV0dXJuIHZhbHVlLgotCShvYXN5c193cml0ZV9lbmQsIG9hc3lzX3dyaXRlX2RhdGEpOiBMaWtld2lzZS4KLQkob2FzeXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogQ2hlY2sgcmV0dXJuIHZhbHVlcyBvZgotCW9hc3lzX3dyaXRlX2hlYWRlciwgb2FzeXNfd3JpdGVfc3ltcywgb2FzeXNfd3JpdGVfZGF0YSwgYW5kCi0Jb2FzeXNfd3JpdGVfZW5kLgotCSogc3JlYy5jIChzcmVjX3dyaXRlX3JlY29yZCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShzcmVjX3dyaXRlX2hlYWRlcik6IExpa2V3aXNlLiAgQWxzbywgY2hlY2sgc3JlY193cml0ZV9yZWNvcmQKLQlyZXR1cm4gdmFsdWUuCi0JKHNyZWNfd3JpdGVfc2VjdGlvbiwgc3JlY193cml0ZV90ZXJtaW5hdG9yKTogTGlrZXdpc2UuCi0JKHNyZWNfd3JpdGVfc3ltYm9scyk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCShpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCXNyZWNfd3JpdGVfc3ltYm9scywgc3JlY193cml0ZV9oZWFkZXIsIHNyZWNfd3JpdGVfc2VjdGlvbiwgYW5kCi0Jc3JlY193cml0ZV90ZXJtaW5hdG9yLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBBcHIgIDQgMTA6NTY6NDUgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhaXgzODYtY29yZS5jIChhaXgzODZfYmZkX2lzX2xvY2FsX2xhYmVsKTogIENvcnJlY3QgY2FzdCBmcm9tCi0JYXNlY3Rpb24gdG8gYXN5bWJvbC4KLQkqIHB0cmFjZS1jb3JlLmMgKHB0cmFjZV91bml4X2JmZF9pc19sb2NhbF9sYWJlbCk6ICBDb3JyZWN0IGNhc3QgZnJvbQotCWJmZCB0byBhc3ltYm9sLgotCSogdHJhZC1jb3JlLmMgKHRyYWRfdW5peF9iZmRfaXNfbG9jYWxfbGFiZWwpOiAgQ29ycmVjdCBjYXN0IGZyb20KLQlhc2VjdGlvbiB0byBhc3ltYm9sLgotCi1TdW4gQXByICAzIDE4OjI3OjI5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N0cmluZ190YWJsZSk6IFVzZSBtYWxsb2MgdG8gYWxsb2NhdGUgc3BhY2UKLQlmb3IgdGhlIGNhY2hlZCBjb3B5IG9mIHRoZSBuYXRpdmUgc3RyaW5nIHRhYmxlLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogTGlrZXdpc2UgZm9yIHRoZSBuYXRpdmUgc3ltYm9sIHRhYmxlLgotCShzb21fc2x1cnBfcmVsb2NfdGFibGUpOiBMaWtld2lzZSBmb3IgdGhlIG5hdGl2ZSBhbmQgZ2VuZXJpYwotCXJlbG9jYXRpb24gdGFibGVzLgotCShzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8pOiBGcmVlIHRoZSBjYWNoZWQgbmF0aXZlIHN0cmluZ3MsCi0Jc3ltYm9scywgYW5kIHJlbG9jYXRpb25zLiAgQWxzbyBmcmVlIHRoZSBjYW5vbmljYWwgY2FjaGVkCi0JcmVsb2NhdGlvbnMuCi0KLUZyaSBBcHIgIDEgMTI6NDA6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IElmIGtlZXBfbWVtb3J5IGlzIGZhbHNlLCBtYWtlCi0Jc3VyZSB0aGUgc3ltYm9sIG5hbWUgaXMgc3RvcmVkIGluIHBlcm1hbmVudCBtZW1vcnkgYmVmb3JlIGFkZGluZwotCWl0IHRvIHRoZSBzdHJpbmcgdGFibGUuCi0KLQkqIGFyY2hpdmUuYyAoX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogT25jZSB3ZSd2ZSBmb3VuZCBhbgotCW9iamVjdCwgZG9uJ3QgYm90aGVyIHRvIGxvb2sgZm9yIG1vcmUgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvCi0JYnVpbGQgYSBtYXAuCi0JKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogQWZ0ZXIgYWRkaW5nIHRoZSBzeW1ib2xzIGZvciBhIEJGRCwKLQljYWxsIGJmZF9mcmVlX2NhY2hlZF9pbmZvIG9uIGl0LgotCi0JQWRkIGJmZF9mcmVlX2NhY2hlZF9pbmZvIHN1cHBvcnQgdG8gYS5vdXQgYmFja2VuZHMuCi0JKiBhb3V0eC5oIChhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzKTogUmVuYW1lZCBmcm9tCi0JYW91dF9saW5rX2dldF9zeW1ib2xzLiAgUmVhZCBzdHJpbmdzIGV2ZW4gaWYgc3ltYm9scyBoYXZlIGJlZW4KLQlyZWFkLiAgU3RvcmUgc3RyaW5nIHNpemUgaW4gb2JqX2FvdXRfc3RyaW5nX3NpemUuCi0JKE5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpKTogQ2FsbCBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzIHRvCi0JcmVhZCB0aGUgc3ltYm9scy4gIEFsbG9jYXRlIHRoZSBjYWNoZWQgc3ltYm9scyB3aXRoIG1hbGxvYywgbm90Ci0JYmZkX2FsbG9jLgotCShOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKTogQWxsb2NhdGUgdGhlIGNhY2hlZCByZWxvY3Mgd2l0aAotCW1hbGxvYywgbm90IGJmZF9hbGxvYy4KLQkoTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSk6IE5ldyBmdW5jdGlvbjsgZnJlZSBjYWNoZWQKLQlzeW1ib2xzIGFuZCByZWxvY3MuCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0ZGF0YSk6IEFkZCBleHRlcm5hbF9zdHJpbmdfc2l6ZSBmaWVsZC4KLQkob2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5nX3NpemUpOiBOZXcgYWNjZXNzb3IgbWFjcm8uCi0JKE5BTUUoYW91dCxjbG9zZV9hbmRfY2xlYW51cCkpOiBEb24ndCBkZWNsYXJlLgotCShOQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pKTogRGVjbGFyZS4KLQkoYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCk6IERvbid0IGRlZmluZS4KLQkoYW91dF82NF9jbG9zZV9hbmRfY2xlYW51cCk6IERvbid0IGRlZmluZS4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogSWYgbm90IGFscmVhZHkgZGVmaW5lZCwKLQlkZWZpbmUgYXMgTkFNRShhb3V0LGZyZWVfY2FjaGVkX2luZm8pLgotCShNWV9jbG9zZV9hbmRfY2xlYW51cCk6IElmIG5vdCBhbHJlYWR5IGRlZmluZWQsIGRlZmluZSBhcwotCU1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvLgotCSogYW91dC1hZG9iZS5jIChhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRG9uJ3QgZGVmaW5lLgotCSogYm91dC5jIChhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRG9uJ3QgZGVmaW5lLgotCSogaHAzMDBocHV4LmMgKE1ZX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRGVmaW5lIGFzIGJmZF90cnVlLgotCShNWV9jbG9zZV9hbmRfY2xlYW51cCk6IERvbid0IGRlZmluZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkpOiBBbGxvY2F0ZSB0aGUgY2FjaGVkCi0JcmVsb2NzIHdpdGggbWFsbG9jLCBub3QgYmZkX2FsbG9jLgotCSogaTM4Nm9zOWsuYyAoYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCk6IERlZmluZS4KLQkoYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbyk6IERvbid0IGRlZmluZS4KLQotCUFkZCBhIG5ldyBlbnRyeSBwb2ludCB0byBmcmVlIG1lbW9yeSBjYWNoZWQgYnkgYSBCRkQuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgX2JmZF9mcmVlX2NhY2hlZF9pbmZvIGZpZWxkLgotCSogYmZkLmMgKGJmZF9mcmVlX2NhY2hlZF9pbmZvKTogRGVmaW5lLgotCSogYmZkLWluLmggKEpVTVBfVEFCTEUpOiBBZGQgX2JmZF9mcmVlX2NhY2hlZF9pbmZvLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogQWxsIGJhY2tlbmRzOiBJbml0aWFsaXplIGJmZF9mcmVlX2NhY2hlZF9pbmZvIGVudHJ5IHBvaW50IHRvCi0JYmZkX3RydWUuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXApOiBDb3JyZWN0IHR5cGUgb2YKLQlmaXJzdCwgdW51c2VkLCBhcmd1bWVudC4KLQkoaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlIGluc3RlYWQgb2YKLQlzb21fYmZkX2lzX2xvY2FsX2xhYmVsLgotCi0JKiBjb2ZmLWEyOWsuYyAoYTI5a19yZWxvYyk6IEFkZCByZWxvY19lbnRyeS0+YWRkcmVzcyB0byB2YWx1ZSBvZgotCWFic29sdXRlIFJfSVJFTCByZWxvYy4KLQotVGh1IE1hciAzMSAxMTo1MjoxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGRlZCBzb21lIHN1cHBvcnQgZm9yIElyaXggNCBzaGFyZWQgbGlicmFyaWVzLgotCSogZWNvZmYuYyAoZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBTRUNfU0hBUkVEX0xJQlJBUlkgZm9yIGEKLQkubGliIHNlY3Rpb24uCi0JKGVjb2ZmX3NlY190b19zdHlwX2ZsYWdzKTogU2V0IFNFQ19TSEFSRURfTElCUkFSWSBpZgotCVNUWVBfRUNPRkZfTElCIGJpdCBpcyBzZXQuCi0JKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFJvdW5kIHRoZSBjb250ZW50cyBvZiBhCi0JLmxpYiBzZWN0aW9uIHVwIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkuCi0JKGVjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSWYgd2Ugc2VlIGEgLmxpYiBzZWN0aW9uLCBpbmNyZW1lbnQKLQl0aGUgdm1hIGJ5IG9uZSB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHNoYXJlZCBsaWJyYXJpZXMgd2UgaGF2ZS4KLQkoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY3Jhc2ggaWYgd2Ugc2VlIGEKLQlTVFlQX0VDT0ZGX0xJQiBzZWN0aW9uLCBhbmQgZG9uJ3QgYWRqdXN0IHRleHRfc3RhcnQgb3IgZGF0YV9zdGFydAotCW9yIGJzc19zaXplIGVpdGhlci4KLQotCSogY29mZmNvZGUuaCAoQ0FMQ19BRERFTkQpOiBDaGFuZ2UgdG8gZmV0Y2ggb3JpZ2luYWwgc3ltYm9sIHZhbHVlCi0JZnJvbSBvcmlnaW5hbCBCRkQsIHJhdGhlciB0aGFuIHVzaW5nIHZhbHVlIG9mIGN1cnJlbnQgQkZEIHN5bWJvbC4KLQlOZWVkZWQgZm9yIG5ldyBsaW5rZXIuCi0JKiBjb2ZmLXNwYXJjLmMgKENBTENfQURERU5EKTogTGlrZXdpc2UuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCB0aGUgdGV4dF9zdGFydCBhbmQKLQlkYXRhX3N0YXJ0IGVudHJpZXMgaW4gdGhlIG9wdGlvbmFsIGhlYWRlciBjb3JyZWN0bHkgZXZlbiBpZiBhIHRleHQKLQlvciBkYXRhIHNlY3Rpb24gc3RhcnRzIGF0IGxvY2F0aW9uIHplcm8uCi0KLQkqIHJlbG9jLmMgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSk6IEFkZGVkIEJGRF9SRUxPQ18yNiAoZnJvbSBzZWYKLQlhbmQgcmFlYnVybikuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIG5sbTMyLWkzODYuYyAobmxtX2kzODZfcmVhZF9pbXBvcnQpOiBOdWxsIHRlcm1pbmF0ZSB0aGUgc3ltYm9sCi0JbmFtZS4KLQkqIG5sbTMyLWFscGhhLmMgKG5sbV9hbHBoYV9yZWFkX2ltcG9ydCk6IExpa2V3aXNlLgotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX3JlYWRfaW1wb3J0KTogTGlrZXdpc2UuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9zeW1ib2wpOiBSZWluZGVudGVkLiAgQ2hhbmdlZCB0byByZXR1cm4KLQlib29sZWFuLCBhbmQgY2hhbmdlZCB3cml0dGVuIHRvIHVuc2lnbmVkIGludCAqLiAgQ2hlY2sgZXJyb3IKLQlyZXR1cm5zIGZyb20gY2FsbGVkIGZ1bmN0aW9ucy4KLQkoY29mZl93cml0ZV9hbGllbl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IExpa2V3aXNlLiAgUmV3b3JrZWQgY2hlY2tzIG9uIHdoZXRoZXIgdG8KLQl3cml0ZSBzeW1ib2wgbmFtZSB0byBzdHJpbmcgdGFibGUgZm9yIGNsYXJpdHkgYW5kIHRvIGF2b2lkIGNvcmUKLQlkdW1waW5nIHdoZW4gZ2l2ZW4gYSBub24gQ09GRiBzeW1ib2wuCi0JKiBsaWJjb2ZmLWluLmggKGNvZmZfd3JpdGVfc3ltYm9scyk6IERlY2xhcmUgYXMgcmV0dXJuaW5nIGJvb2xlYW4uCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWNvZmZfd3JpdGVfc3ltYm9scy4KLQotV2VkIE1hciAzMCAxNjoyNTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIHRvIGxldCBCRkQgcmV0dXJuIGFuIGVycm9yIGluZGljYXRpb24gZnJvbQotCWdldF9zeW10YWJfdXBwZXJfYm91bmQsIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLAotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLiAgVGhleSBub3cKLQlyZXR1cm4gbG9uZyBpbnN0ZWFkIG9mIHVuc2lnbmVkIGludCwgYW5kIHVzZSAtMSB0byBpbmRpY2F0ZSBhbgotCWVycm9yLiAgQWxvbmcgdGhlIHdheSwgcmVuYW1lIGdldF9zeW10YWJfdXBwZXJfYm91bmQgdG8KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4KLQkqIGJmZC5jIChiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogUmV0dXJuIGxvbmcsIGFuZCAtMSBvbgotCWVycm9ycy4KLQkoYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogc3ltcy5jIChiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IFJlbmFtZWQgZnJvbQotCWdldF9zeW10YWJfdXBwZXJfYm91bmQuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBSZW5hbWVkIF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIHRvCi0JX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCBhbmQgY2hhbmdlZCBpdCBhbmQKLQlfYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgYW5kIF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JX2JmZF9jYW5vbmljYWxpemVfcmVsb2MgdG8gYWxsIHJldHVybiBsb25nLgotCSogYW91dHguaCAoTkFNRShhb3V0LGdldF9zeW10YWIpKTogUmV0dXJuIGxvbmcsIGFuZCAtMSBvbiBlcnJvcnMuCi0JKE5BTUUoYW91dCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCSogYm91dC5jIChiX291dF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkoYl9vdXRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKiBlY29mZi5jIChlY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGVsZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCShlbGZfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCSogaHAzMDBocHV4LmMgKE1ZKGdldF9zeW10YWIpKTogTGlrZXdpc2UuCi0JKE1ZKGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogTGlrZXdpc2UuCi0JKE1ZKGNhbm9uaWNhbGl6ZV9yZWxvYykpOiBMaWtld2lzZS4KLQkqIGkzODZseW54LmMgKE5BTUUobHlueCxjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBpZWVlLmMgKGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scyk6IENoYW5nZSByZXR1cm4gdHlwZSB0bwotCWJvb2xlYW4uICBDaGVjayBmb3IgZXJyb3JzIGZyb20gZ2V0X3N5bWJvbC4KLQkoaWVlZV9zbHVycF9zeW1ib2xfdGFibGUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4gIENoZWNrCi0JZm9yIGVycm9ycyBmcm9tIGllZWVfc2x1cnBfZXh0ZXJuYWxfc3ltYm9scy4KLQkoaWVlZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogUmV0dXJuIGxvbmcsIGFuZCAtMSBvbiBlcnJvcnMuCi0JKGllZWVfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShpZWVlX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShpZWVlX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbWlwc2JzZC5jIChNWShjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBubG1jb2RlLmggKG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKG5sbV9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkobmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogb2FzeXMuYyAob2FzeXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShvYXN5c19nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKG9hc3lzX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShvYXN5c19jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHNvbS5jIChzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShzb21fZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShzb21fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHNvbV9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIHNyZWMuYyAoc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKHNyZWNfZ2V0X3N5bXRhYik6IExpa2V3aXNlLgotCShzcmVjX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZSBhcyBiZmRfMGwuCi0JKHNyZWNfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiB0ZWtoZXguYyAodGVraGV4X2dldF9zeW10YWIpOiBSZXR1cm4gbG9uZywgYW5kIC0xIG9uIGVycm9ycy4KLQkodGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkodGVraGV4X2dldF9yZWxvY191cHBlcl9ib3VuZCk6IERlZmluZSBhcyBiZmRfMGwuCi0JKHRla2hleF9jYW5vbmljYWxpemVfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxpYmFvdXQuaCAoTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpKTogQ2hhbmdlCi0JZGVjbGFyYXRpb24gdG8gcmV0dXJuIGxvbmcuCi0JKE5BTUUoYW91dCxnZXRfc3ltdGFiKSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSk6IExpa2V3aXNlLgotCShOQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSk6IExpa2V3aXNlLgotCSogbGliY29mZi1pbi5oIChjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoY29mZl9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGNvZmZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKiBsaWJlY29mZi5oIChlY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBsaWJlbGYuaCAoYmZkX2VsZjMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2dldF9zeW10YWIpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9nZXRfc3ltdGFiKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X2Nhbm9uaWNhbGl6ZV9yZWxvYyk6IExpa2V3aXNlLgotCSogbGlibmxtLmggKG5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkobmxtTkFNRShnZXRfc3ltdGFiKSk6IExpa2V3aXNlLgotCShubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkpOiBMaWtld2lzZS4KLQkobmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpKTogTGlrZXdpc2UuCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogVXNlIGVycm9yX3JldHVybiBhbmQKLQlub19tZW1vcnlfcmV0dXJuIGxhYmVscyByYXRoZXIgdGhhbiBmcmVlaW5nIGluZm9ybWF0aW9uIGluIHZhcmlvdXMKLQlwbGFjZXMuICBDaGFuZ2Ugc3RvcmFnZSwgc3ltY291bnQgYW5kIHNyY19jb3VudCB0byBsb25nLiAgQ2hlY2sKLQllcnJvcnMgZnJvbSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkqIGJvdXQuYyAoYl9vdXRfcmVsYXhfc2VjdGlvbik6IENoYW5nZSByZWxvY19zaXplIHRvIGxvbmcuICBDaGVjawotCWZvciBlcnJvcnMgZnJvbSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOgotCUxpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jOiBMaWtld2lzZS4KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfc3R1Yl9maW5pc2gpOiBMaWtld2lzZS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogQ2hlY2sgZm9yIGVycm9ycyBmcm9tCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQsIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyKTogQ2hlY2sgZm9yIGVycm9ycwotCWZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBDaGVjayBmb3IgZXJyb3JzIGZyb20KLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKiByZWxvYzE2LmMgKGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbik6IExpa2V3aXNlLgotCShiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCSogbGliYmZkLmMgKGJmZF8wbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChiZmRfMGwpOiBEZWNsYXJlLgotCSogYWl4Mzg2LWNvcmUuYzogQ2hhbmdlIGdldF9zeW10YWJfdXBwZXJfYm91bmQsIGdldF9zeW10YWIsCi0JZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBhbmQgY2Fub25pY2FsaXplX3JlbG9jIHRvIHVzZSBiZmRfMGwgcmF0aGVyCi0JdGhhbiBiZmRfMHUuCi0JKiBjaXNjby1jb3JlLmMsIGhwcGFic2QtY29yZS5jLCBocHV4LWNvcmUuYzogTGlrZXdpc2UuCi0JKiBpcml4LWNvcmUuYywgb3NmLWNvcmUuYywgcHRyYWNlLWNvcmUuYywgdHJhZC1jb3JlLmM6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0KLQkqIG5sbTMyLXNwYXJjLmMgKG5sbV9zcGFyY19yZWFkX3JlbG9jKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMKLQl0ZW1wIGFuZCBuYW1lLgotCi1XZWQgTWFyIDMwIDA4OjMzOjA0IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9kcHgyLmg6IERlZmluZSBQT1NJWF9VVElNRS4KLQotV2VkIE1hciAzMCAwMDozMTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGkzODZkeW5peC5jLCBjb25maWcvaTM4Ni1keW5peC5tdDogIE5ldyBmaWxlcywgaGFuZGxpbmcgRHluaXgKLQl2YXJpYW50IG9mIGEub3V0LgotCSogY29uZmlndXJlLmluLCBjb25maWcuYmZkOiAgVXNlIHRoZW0gZm9yIER5bml4LgotCSogTWFrZWZpbGUuaW46ICBBZGQgZGVwZW5kZW5jaWVzIGZvciBpMzg2ZHluaXguby4gCi0JKiB0YXJnZXRzLmM6ICBBZGQgZGVmaW5pdGlvbiBmb3IgaTM4NmR5bml4X3ZlYy4KLQkqIGhvc3RzL3N5bW1ldHJ5Lmg6ICBEbyBub3QgZGVmaW5lIFRSQURfQ09SRV9VU0VSX09GRlNFVCBmb3IgRHluaXguCi0JRGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIGFuZCBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMCi0JZm9yIER5bml4LiBSZW1vdmUgaW5jbHVzaW9uIG9mIGR5bml4My5oLCBEeW5peCBiZmQgaXMgbm93IGhhbmRsZWQgYnkKLQlpMzg2ZHluaXguYwotCi1Nb24gTWFyIDI4IDEyOjUzOjI3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtc3BhcmMuby4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiBIYW5kbGUgYmZkX2FyY2hfcG93ZXJwYyBsaWtlCi0JYmZkX2FyY2hfcnM2MDAwLgotCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotYWl4Kik6IE5ldyB0YXJnZXQ7IHVzZSByczYwMDAubXQuCi0JKiBjb25maWcvcnM2MDAwLm10IChTRUxFQ1RfQVJDSElURUNUVVJFUyk6IEFkZCBiZmRfcG93ZXJwY19hcmNoLgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogU2V0IFNFQ19SRUxPQyBmbGFnCi0JZm9yIGdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzZWN0aW9uLgotCi1TdW4gTWFyIDI3IDE2OjI1OjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBOZXcgYXBwcm9hY2ggYXQgZGVhbGluZyB3aXRoIGhvbGVzCi0JaW4gZXhlY3V0YWJsZXMgbGVmdCBieSB0aGUgSFAgbGlua2VyLiAgRG9lcyBub3QgcmVseSBvbiBzdWJzcGFjZQotCWFsaWdubWVudHMgYXMgc3Vic3BhY2VzIGFyZSAqTk9UKiBndWFyYW50ZWVkIHRvIGJlIHByb3Blcmx5Ci0JYWxpZ25lZCBpbiBhbiBleGVjdXRhYmxlIChjYW4geW91IGJlbGlldmUgdGhhdCEpLgotCi1TYXQgTWFyIDI2IDEwOjI1OjQzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IGZ1bmN0aW9uLiAgRG8gbm90IHRyeQotCXRvIGFjdHVhbGx5IHJlYWQgZGF0YSBmcm9tIGEgc2VjdGlvbiB0aGF0IGRvZXNuJ3QgaGF2ZSBlaXRoZXIKLQlTRUNfTE9BRCBvciBTRUNfREVCVUdHSU5HIHNldCAoZWcgJEJTUyQpIGp1c3QgcmV0dXJuIHRydWUuCi0KLSAgICAgICAgKiBsaWJiZmQuYyAoYmZkX3JlYWQpOiBTZXQgYmZkX2Vycm9yIGFzIGFwcHJvcHJpYXRlIGZvciBhIHNob3J0Ci0JcmVhZC4gKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCBvciBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpLgotCi0JKiBzb20uYzogRG8gbm90IGJsaW5kbHkgc2V0IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCBhZnRlciBhCi0JZmFpbGluZyBiZmRfcmVhZCwgYmZkX3dyaXRlLCBvciBiZmRfc2Vlay4gIEluIGEgZmV3IHBsYWNlcwotCShsaWtlIHNvbV9vYmplY3RfcCkgb3ZlcnJpZGUgdGhlIGVycm9yIHN0YXR1cyBzZXQgYnkgYmZkX3JlYWQuCi0KLQkqIGFpeDM4Ni1jb3JlLmMsIGFvdXQtZW5jYXAsYyBhcmNoaXZlLmMsIGJvdXQuYzogTGlrZXdpc2UuCi0JKiBjb2ZmLXJzNjAwMC5jLCBjb2ZmZ2VuLmMgZWNvZmYuYywgZWxmLmM6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jLCBlbGZjb2RlLmgsIGhwMzAwaHB1eC5jLCBpMzg2bHlueC5jOiBMaWtld2lzZS4KLQkqIG5sbTMyLWFscGhhLmMsIG5sbTMyLWkzODYuYywgbmxtMzItc3BhcmMuYzogTGlrZXdpc2UuCi0KLQkqIHNvbS5jOiBDaGVjayByZXR1cm4gdmFsdWVzIGZyb20gc2V2ZXJhbCBiZmRfe3NlZWsscmVhZCx3cml0ZX0KLQljYWxscyB0aGF0IHdlIGp1c3QgYXNzdW1lZCB3ZXJlIG5vdCBmYWlsaW5nLgotCi1GcmkgTWFyIDI1IDExOjQ0OjA2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBob3N0cy9zeXN2NC5oIChIQVZFX1BST0NGUyk6IEFkZCBjb21tZW50cyBhYm91dCBwdHg0LgotCSogY29uZmlnL3N5c3Y0Lm1oOiBBZGQgY29tbWVudC4KLQkqIGNvbmZpZy9zeW1tZXRyeS5taDogQ2hhbmdlIGNvbW1lbnQuCi0JKiBjb25maWd1cmUuaG9zdDogVXNlIHN5c3Y0LCBub3Qgc3ltbWV0cnksIGZvciBpWzM0XTg2LXNlcXVlbnQtc3lzdjQqLgotCi1GcmkgTWFyIDI1IDE3OjEwOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gc3VwcG9ydCBsaW5rZXIgcmVsYXhpbmcgb2YgZW1iZWRkZWQgTUlQUyBQSUMgY29kZSB0bwotCXVzZSBhIGZpdmUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgZm9yIGZ1bmN0aW9uIGNhbGxzIHdoaWNoIGFyZSBvdXQgb2YKLQlyYW5nZSBvZiB0aGUgYmFsIGluc3RydWN0aW9uLgotCSogbGliZWNvZmYuaCAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpOiBEZWZpbmUuCi0JKGVjb2ZmX3NlY3Rpb25fZGF0YSk6IERlZmluZS4KLQkoZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEb24ndCBkZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9maW5hbF9saW5rX2RlYnVnX2FjY3VtdWxhdGUpOiBEb24ndCByZWFkIG9yIGZyZWUKLQl0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVhZC4KLQkoZWNvZmZfaW5kaXJlY3RfbGlua19vcmRlcik6IEhhbmRsZSBfY29va2VkX3NpemUgYmVpbmcgZGlmZmVyZW50Ci0JZnJvbSBfcmF3X3NpemUuICBEb24ndCByZXJlYWQgdGhlIGNvbnRlbnRzIG9yIHRoZSByZWxvY3MgaWYgdGhleQotCWhhdmUgYWxyZWFkeSBiZWVuIHJlYWQgaW4uCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19ob3d0b190YWJsZSk6IENoYW5nZSBiaXRzaXplIG9mIFBDUkVMMTYgZnJvbQotCTE4IHRvIDE2LgotCShQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UKTogRGVmaW5lLgotCShtaXBzX3JlbG9jYXRlX3JlZmhpKTogVGFrZSBhZGp1c3QgYXJndW1lbnQuCi0JKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSByZWxvYyBvZmZzZXRzIHN0b3JlZCBpbiBzZWN0aW9uCi0JdXNlZF9ieV9iZmQgZmllbGQuICBDYWxsIG1pcHNfcmVsYXhfcGNyZWwxNiB0byBoYW5kbGUgZGV0YWlscyBvZgotCWV4cGFuZGluZyBhbiBvdXQgb2YgcmFuZ2UgUENSRUwxNi4gIEtlZXAgdHJhY2Ugb2YgYWRqdXN0bWVudHMKLQlyZXF1aXJlZCBieSBleHBhbnNpb25zLiAgU2V0IHMgYW5kIHVuc2V0IGggd2hlbiBjb252ZXJ0aW5nIGEgcmVsb2MKLQlmcm9tIHVuZGVmaW5lZCB0byBzZWN0aW9uLiAgQ2hhbmdlIGhhbmRsaW5nIG9mIFBDIHJlbGF0aXZlIHJlbG9jczoKLQlpZiBhZ2FpbnN0IGEgc2VjdGlvbiwgdGhleSBhcmUgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsIGlmCi0JYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wgdGhleSBhcmUgcGNyZWxfb2Zmc2V0LgotCShtaXBzX3JlbGF4X3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfcmVsYXhfcGNyZWwxNik6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfYmZkX3JlbGF4X3NlY3Rpb24pOiBEZWZpbmUuCi0JKiBjb2ZmLWFscGhhLmMgKGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlKTogSGFuZGxlIGFkanVzdG1lbnRzCi0JYnVpbHQgYnkgbWlwc19yZWxheF9zZWN0aW9uIHdoZW4gd3JpdGluZyBvdXQgYWRkcmVzc2VzLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBDbGVhciBhZGp1c3QgZmllbGQuCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5kX25lYXJlc3RfbGluZSkpOiBUaGUgY2FsbGVyIGV4cGVjdHMKLQlmdW5jdGlvbm5hbWVfcHRyIHRvIGJlIHNldCB0byBhIHN5bWJvbCBuYW1lLCBzbyBwcmVwZW5kCi0Jc3ltYm9sX2xlYWRpbmdfY2hhci4KLQotVGh1IE1hciAyNCAxMTozMzo0NiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBBZGQgcmVsYXhpbmcgaW5mbwotCWZvciAxNmJpdCByZWxhdGl2ZSBicmFuY2hlcy4KLQkqIGNvZmYtaDg1MDAuYyAocl9oaWdoOCwgcl9sb3cxNiwgcl9oaWdoMTYpOiBEb24ndCBjb21wbGFpbiBvbgotCW92ZXJmbG93LgotCi1UaHUgTWFyIDI0IDA5OjIxOjEzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSk6IElnbm9yZSBub24tU09NIG9iamVjdHMuCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmLCBzb21fd3JpdGVfYXJtYXApOiBMaWtld2lzZS4KLQotV2VkIE1hciAyMyAxNDoyOTozMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIG5ldGJzZDM4Ni5jIChOX1NFVF9GTEFHUyk6IERlbGV0ZSB0aGUgb2xkIGRlZmluaXRpb24uCi0KLVdlZCBNYXIgMjMgMTQ6NTg6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQ2xlYW4gdXAgdGhlIHJlbGF4aW5nIGNvZGUgZm9yIHRoZSBuZXcgbGlua2VyLgotCSogdGFyZ2V0cy5jIChfYmZkX3JlbGF4X3NlY3Rpb24pOiBUYWtlIGJvb2xlYW4gKmFnYWluIGFyZ3VtZW50Ci0JcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LgotCSogYmZkLmMgKGJmZF9yZWxheF9zZWN0aW9uKTogQ2hhbmdlIG5hbWUgb2YgZm91cnRoIGFyZ3VtZW50IGZyb20KLQlzeW1ib2xzIHRvIGFnYWluLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4KLQlhcmd1bWVudCByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuICBBbHdheXMgcmV0dXJuIHRydWUuCi0JKiBib3V0LmM6IEluY2x1ZGUgZ2VubGluay5oLgotCShhbGlnbmNvZGUsIHBlcmZvcm1fc2xpcCk6IERlY2xhcmUuCi0JKHBlcmZvcm1fc2xpcCk6IFRha2UgQkZEIGFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQlDaGFuZ2VkIGFsbCBjYWxsZXJzLiAgR2V0IHRoZSBzeW1ib2xzIGZyb20gdGhlIEJGRC4gIENoYW5nZSB0aGUKLQloYXNoIHRhYmxlIGVudHJ5IHZhbHVlIGFzIHdlbGwgYXMgdGhlIHN5bWJvbCB2YWx1ZS4KLQkoYWJzMzJjb2RlKTogVGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LiAgQ2hhbmdlZAotCWFsbCBjYWxsZXJzLgotCShhbGlnbmNvZGUpOiBMaWtld2lzZS4KLQkoYl9vdXRfcmVsYXhfc2VjdGlvbik6IFRha2UgYm9vbGVhbiAqYWdhaW4gYXJndW1lbnQgcmF0aGVyIHRoYW4KLQlhc3ltYm9sIGxpc3QuICBPbmx5IHJldHVybiBmYWxzZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4gIFNldCAqYWdhaW4KLQl0byBmYWxzZS4gIEdldCBzeW1ib2xzIGZyb20gQkZELgotCSogcmVsb2MxNi5jOiBJbmNsdWRlIGdlbmxpbmsuaC4KLQkoYmZkX3BlcmZvcm1fc2xpcCk6IFRha2UgQkZEIGFyZ3VtZW50IHJhdGhlciB0aGFuIGFzeW1ib2wgbGlzdC4KLQlHZXQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZELiAgQ2hhbmdlIHRoZSBoYXNoIHRhYmxlIGVudHJ5IHZhbHVlCi0JYXMgd2VsbCBhcyB0aGUgc3ltYm9sIHZhbHVlLgotCShiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBUYWtlIGJvb2xlYW4gKmFnYWluIGFyZ3VtZW50Ci0JcmF0aGVyIHRoYW4gYXN5bWJvbCBsaXN0LiAgT25seSByZXR1cm4gZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCi0JU2V0ICphZ2FpbiB0byBmYWxzZS4gIEdldCBzeW1ib2xzIGZyb20gQkZELgotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQ2hhbmdlCi0JX2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUgdG8gdGFrZSBCRkQgYXJndW1lbnQgcmF0aGVyIHRoYW4KLQlhc3ltYm9sIGxpc3QuCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQkoZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCSogbGliY29mZi1pbi5oIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBDaGFuZ2UKLQlkZWNsYXJhdGlvbiB0byB0YWtlIGJvb2xlYW4gKiByYXRoZXIgdGhhbiBhc3ltYm9sIGxpc3QuCi0JKGJmZF9wZXJmb3JtX3NsaXApOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gdGFrZSBCRkQgcmF0aGVyIHRoYW4KLQlhc3ltYm9sIGxpc3QuCi0JKiBjb2ZmLWg4MzAwLmMgKGgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IFRha2UgQkZEIGFyZ3VtZW50IHJhdGhlcgotCXRoYW4gYXN5bWJvbCBsaXN0LiAgQ2hhbmdlZCBjYWxscyB0byBiZmRfcGVyZm9ybV9zbGlwLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLQkqIGdlbmxpbmsuaCAoX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMpOiBEZWZpbmUuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCk6IERlZmluZS4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzKTogTmV3IGZ1bmN0aW9uLgotCShnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGl0LiAgVXNlCi0JX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgYW5kIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudAotCXRvIGdldCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQuCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiBMaWtld2lzZS4KLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogTGlrZXdpc2UuCi0JKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBTdG9yZSBwb2ludGVyIHRvIGhhc2ggdGFibGUgZW50cnkKLQlpbiBhc3ltYm9sIHVkYXRhIGZpZWxkLgotCi1UdWUgTWFyIDIyIDEzOjA5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfaG93dG9fdGFibGUpOiBBZGQgZW50cnkgZm9yIG5ldyBNSVBTX1JfUENSRUwxNgotCXJlbG9jLCB1c2VkIGluIGVtYmVkZGVkIFBJQyBjb2RlLgotCShtaXBzX2FkanVzdF9yZWxvY19pbik6IENoYW5nZSBzYW5pdHkgY2hlY2sgdG8gcGVybWl0IG5ldyByZWxvYy4KLQkobWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBUdXJuIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMiBpbnRvCi0JTUlQU19SX1BDUkVMMTYuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IEFjY291bnQgZm9yIGxpbmtfb3JkZXIKLQlyZWxvY3Mgd2hlbiBhbGxvY2F0aW5nIHNwYWNlIGZvciByZWxvY2F0aW9ucy4gIFNldCBTRUNfUkVMT0MgZmxhZwotCWZvciBhbnkgc2VjdGlvbiB3aGljaCBoYXMgcmVsb2NzLiAgSGFuZGxlIGxpbmtfb3JkZXIgcmVsb2NzIGluCi0JbGlua19vcmRlciBsb29wLiAgVXNlIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QgZm9yCi0JYWRkX3N5bWJscyBlbnRyeSBwb2ludC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogU2V0IHJlbG9jX2NvdW50IHRvIDAgYmVmb3JlCi0JY291bnRpbmcgcmVsb2NzLiAgU2V0IFNFQ19SRUxPQyBmbGFnIGZvciBhbnkgc2VjdGlvbiB3aGljaCBoYXMKLQlyZWxvY3MuCi0KLQkqIGxpbmtlci5jIChfYmZkX2RlZmF1bHRfbGlua19vcmRlcik6IEhhbmRsZSBiZmRfZGF0YV9saW5rX29yZGVyLgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMpOiBKdXN0IGNhbGwKLQlnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QpOiBOZXcgZnVuY3Rpb24sIGxpa2UKLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyBidXQgYWxzbyBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQKLQlkZXN0cnVjdG9ycyBieSBuYW1lIGFzIGNvbGxlY3QyIGRvZXMuCi0JKGdlbmVyaWNfbGlua19hZGRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiwgbGlrZSBvbGQKLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyBidXQgd2l0aCBjb2xsZWN0IGFyZ3VtZW50LgotCShnZW5lcmljX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVGFrZSBjb2xsZWN0IGFyZ3VtZW50LgotCShnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QpOiBOZXcgZnVuY3Rpb24uCi0JKGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCk6IFRha2UgY29sbGVjdCBhcmd1bWVudC4KLQkoZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCk6IFRha2UgY29sbGVjdCBhcmd1bWVudC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBSZW5hbWUgY29uc3RydWN0b3IgYXJndW1lbnQgdG8KLQljb2xsZWN0LgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzX2NvbGxlY3QpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0KLVR1ZSBNYXIgMjIgMTA6MDQ6MDAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKTogVXNlIGFyX3BhZGNoYXIKLQlmb3IgZmlyc3QgY2hhcmFjdGVyIGluIGFuIGV4dGVuZGVkIG5hbWUuCi0JKF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IElmIGFyX3BhZGNoYXIgPT0gJy8nLCB0aGVuIHVzZQotCSIvLyIgYXMgdGhlIG5hbWUgb2YgdGhlIHNwZWNpYWwgYXJjaGl2ZSBtZW1iZXIgaG9sZGluZyB0aGUKLQlleHRlbmRlZCBuYW1lIHRhYmxlLgotCi1Nb24gTWFyIDIxIDEyOjI4OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIGxpbmtfb3JkZXIgdHlwZXMgd2hpY2ggZ2VuZXJhdGUgcmVsb2NzIGluIG9yZGVyIHRvCi0Jc3VwcG9ydCAtVXIgaW4gdGhlIGxpbmtlci4KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQKLQlmcm9tIGNhbGwgdG8gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wuCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQuCi0JRG9uJ3QgcGFzcyBiaXRzaXplIHRvIGNvbnN0cnVjdG9yIGNhbGwgYmFjay4gIFBhc3MgQkZEX1JFTE9DX0NUT1IKLQlpbnN0ZWFkIG9mIGJpdHNpemUgdG8gYWRkX3RvX3NldCBjYWxsIGJhY2suCi0JKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogQWNjb3VudCBmb3IgbGlua19vcmRlciByZWxvY3Mgd2hlbgotCWFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgSGFuZGxlIHRoZW0gaW4gbGlua19vcmRlciBsb29wLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIpOiBJZiBhIHJlbG9jX2xpbmtfb3JkZXIgaXMgc2VlbiBoZXJlLAotCWFib3J0LgotCShfYmZkX2NvdW50X2xpbmtfb3JkZXJfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogUmVtb3ZlIGJpdHNpemUKLQlhcmd1bWVudCBmcm9tIGRlY2xhcmF0aW9uLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IERlY2xhcmUuCi0JKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudCBmcm9tCi0JY2FsbCB0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogQWNjb3VudCBmb3IgbGlua19vcmRlciByZWxvY3Mgd2hlbgotCWFsbG9jYXRpbmcgc3BhY2UgZm9yIHJlbG9jYXRpb25zLiAgSGFuZGxlIHRoZW0gYWZ0ZXIgaGFuZGxpbmcgYWxsCi0JaW5wdXQgQkZEcy4KLQkoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9leHRlcm5hbHMpOiBSZW1vdmUgYml0c2l6ZSBhcmd1bWVudCBmcm9tCi0JY2FsbCB0byBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBBY2NvdW50IGZvciBsaW5rX29yZGVyIHJlbG9jcyB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgcmVsb2NhdGlvbnMuICBIYW5kbGUgdGhlbSBpbiBsaW5rX29yZGVyIGxvb3AuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBTZXQgdGhlIHN0b3JhZ2UgY2xhc3Mgb2YgYSBkZWZpbmVkCi0JbGlua2VyIGNyZWF0ZWQgc3ltYm9sIGJhc2VkIG9uIHRoZSBzZWN0aW9uIGl0IGlzIGluLiAgQ29ycmVjdAotCWJmZF9saW5rX2hhc2hfd2VhayBjYXNlIHRvIHVzZSAuc2MgcmF0aGVyIHRoYW4gLnN0LgotCShlY29mZl9yZWxvY19saW5rX29yZGVyKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUKLQlCRkRfUkVMT0NfQ1RPUi4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IExpa2V3aXNlLgotCi0JKiBzdW5vcy5jIChzdW5vc19yZWFkX2R5bmFtaWNfaW5mbyk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGR5bnN5bQotCWFuZCBidWYuCi0KLQkqIGNpc2NvLWNvcmUuYyAoY2lzY29fY29yZV9maWxlX3ApOiBPbmx5IHBhc3Mgb25lIGFyZ3VtZW50IHRvCi0JYmZkX3ptYWxsb2MuICBGcmVlIGEgcG9pbnRlciwgbm90IGEgdW5pb24uCi0JKGNpc2NvX2JmZF9pc19sb2NhbF9sYWJlbCk6IENvcnJlY3QgY2FzdCBmcm9tIGFzZWN0aW9uIHRvIGFzeW1ib2wuCi0KLVN1biBNYXIgMjAgMDk6MjQ6MzYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJmZC9zb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBGaXggdGhpbmtvIChvZmYgYnkgb25lIGVycm9yKS4KLQotCSogc29tLmMgKGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCk6IE9ubHkgdG8gZG8gdGhlIHZhbHVlCi0JY29tcGFyaXNvbiBmb3IgZnVuY3Rpb24gc3ltYm9scyB3aXRoaW4gZXhlY3V0YWJsZXMuCi0KLQkqIHNvbS5jIChiZmRfc2VjdGlvbl9mcm9tX3NvbV9zeW1ib2wpOiBSZW5hbWVkIGZyb20KLQlzb21fc2VjdGlvbl9mcm9tX3N1YnNwYWNlX2luZGV4LiAgUGFzcyBpbiBhIG5hdGl2ZSBTT00gc3ltYm9sLgotCUZvciBleGVjdXRhYmxlcywgaXRlcmF0ZSB0aHJvdWdoIHRoZSBzZWN0aW9ucyB0byBmaW5kIG91dAotCXdoaWNoIGNvbnRhaW5zIHRoZSBzeW1ib2wncyBhZGRyZXNzIHJhdGhlciB0aGFuIHVzaW5nIHRoZQotCXN5bWJvbF9pbmZvIGZpZWxkLiAgKHN5bWJvbF9pbmZvIGhhcyBhIGRpZmZlcmVudCBtZWFuaW5nIGZvcgotCWR5bmFtaWNseSBsaW5rZWQgZXhlY3V0YWJsZXMuKQotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogRG9uJ3QgcGFzcyBhYmZkIHRvCi0JYmZkX3ptYWxsb2MuCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEZpeCBicmFpbm8gKG9uZSBjYWxsIHRvIGFsaWduCi0Jc3BhY2Uvc3Vic3BhY2UgZGF0YSB3YXMgZG9uZSB1bmNvbmRpdGlvbmFsbHkgcmF0aGVyIHRoYW4KLQlqdXN0IGZvciBleGVjdXRhYmxlcy4pCi0KLQkqIHNvbS5jIChzb21fYmVnaW5fd3JpdGluZyk6IEFsaWduIHRleHQgaW4gYWxsIGV4ZWN1dGFibGVzIHRvCi0JbWFrZSBIUFVYIGtlcm5lbCBoYXBweS4gIEZpeGVzIHN0cmlwL29iamNvcHkgZm9yIHNoYXJlZAotCWV4ZWN1dGFibGVzLgotCi1TYXQgTWFyIDE5IDA3OjA2OjU5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JlZ2luX3dyaXRpbmcpOiBBY2NvdW50IGZvciBhbGlnbm1lbnQgbmVlZHMgb2YKLQlzdWJzcGFjZXMgdG9vIHdoZW4gd3JpdGluZyBleGVjdXRhYmxlcy4gIE5ldmVyIHJlcXVlc3QgYSBuZWdhdGl2ZQotCWJzcyBzaXplLiAgRml4ZXMgc29tZSBwcm9ibGVtcyB3aXRoIGRlbWFuZCBwYWdlZCBleGVjdXRhYmxlcywKLQlzdGlsbCBoYXZpbmcgcHJvYmxlbXMgd2l0aCBwdXJlIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQgZXhlY3V0YWJsZXMuCi0KLUZyaSBNYXIgMTggMTk6MTI6NDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHRyYWQtY29yZS5jICh0cmFkX3VuaXhfY29yZV9maWxlX3ApOiBDYWxsIGJmZF96bWFsbG9jIG5vdAotCWJmZF96YWxsb2MgZm9yIHJhd3B0ciwgYmVjYXVzZSBsYXRlciBvbiB3ZSBtYXkgY2FsbCBmcmVlLCBub3QKLQliZmRfcmVsZWFzZSwgb24gaXQuCi0KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IEFkZCBjaXNjb19jb3JlX3N0cnVjdCB0byB0ZGF0YSB1bmlvbi4KLQkqIGxpYmJmZC5jIChiZmRfcmVhZCwgYmZkX3NlZWspOiBBZGQgY29tbWVudHMgcmVnYXJkaW5nIGVycm9ycy4KLQkqIGNpc2NvLWNvcmUuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFjY29yZGluZ2x5LgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgY2lzY29fY29yZV92ZWMuCi0JKiBjb25maWcvbTY4ay1hb3V0Lm10IChTRUxFQ1RfVkVDUyk6IEFkZCBjaXNjb19jb3JlX3ZlYy4KLQkqIHRhcmdldHMuYzogQWRkIGNpc2NvX2NvcmVfdmVjLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCi1GcmkgTWFyIDE4IDE4OjEzOjQ5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uaCAoc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBOZXcgc3RydWN0dXJlCi0JY29udGFpbmluZyBhbGwgdGhlIHByaXZhdGUgc2VjdGlvbiBpbmZvcm1hdGlvbiB3aGljaCBuZWVkcwotCXRvIGJlIGNvcGllZCBmcm9tIGlucHV0IHNlY3Rpb24gdG8gb3V0cHV0IHNlY3Rpb24gZHVyaW5nCi0Jb2JqY29weSBvciBzdHJpcC4KLQkoc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBSZW1vdmUgc2V2ZXJhbCBmaWVsZHMgbm93IGluCi0Jc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QuICBNYWtlIHRoZSBzcGFjZSBhbmQgCi0Jc3Vic3BhY2UgZGljdGlvbmFyaWVzIGJlIHBvaW50ZXJzICh0byBzYXZlIHNwYWNlIHdoZW4KLQlvbmx5IHJlYWRpbmcgb2JqZWN0cykuCi0KLQkqIHNvbS5jIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMpOiBOb3cgcmV0dXJucyBhIGJvb2xlYW47Ci0Jc29tZSByZWZlcmVuY2VzIGNoYW5nZWQuICBBbGxvY2F0ZSBhIGNvcHlhYmxlIGRhdGEgc3R1Y3R1cmUgaWYKLQlub25lIGV4aXN0cy4gIFN0b3JlIGluZm8gaW50byB0aGUgY29weWFibGUgZGF0YSBzdHJ1Y3R1cmUuCi0JKGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyk6IExpa2V3aXNlLgotCShzb21faXNfc3BhY2UsIHNvbV9pc19zdWJzcGFjZSwgc29tX2lzX2NvbnRhaW5lcik6IE5ldyBmdW5jdGlvbnMuCi0JVXNlIHRoZXNlIGluc3RlYWQgb2YgZGlyZWN0bHkgYWNjZXNzaW5nIHByaXZhdGUgZGF0YS4KLQkoc29tX3ByZXBfaGVhZGVycyk6IEFsbG9jYXRlIHNwYWNlIGFuZCBzdWJzcGFjZSBoZWFkZXJzIGhlcmUuCi0JRmlsbCBpbiBzb21lIGZpZWxkcyBpbiB0aGUgc3BhY2Uvc3Vic3BhY2UgaGVhZGVycyBmcm9tIHRoZQotCWNvcHlhYmxlIGRhdGEuCi0JKHNvbV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE9ubHkgY29weSB0aGUgc3R1ZmYKLQl0aGF0IHdlIHJlYWxseSBuZWVkIHRvIG1ha2Ugb2JqY29weSBhbmQgc3RyaXAgd29yay4gIEFsbG9jYXRlCi0JdGhlIGNvcHlfZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSBvdXRwdXQgYmZkIGJlZm9yZSBjb3B5aW5nLgotCi0JKiBzb20uaCAoc3RydWN0IHNvbV9leGVjX2RhdGEpOiBOZXcgc3RydWN0dXJlIHRvIGhvbGQgZXhlYwotCWluZm8gdGhhdCBtdXN0IGJlIHByZXNlcnZlZCB3aGVuIHJ1bm5pbmcgb2JqY29weS9zdHJpcC4KLQkoc3RydWN0IHNvbWRhdGEpOiBBZGQgbmV3ICJleGVjX2RhdGEiIGZpZWxkIGFuZCBhY2Nlc3NvcgotCW1hY3JvLiAgQWRkIHNvbWUgY29tbWVudHMgb24gaG93IHRoZSB2YXJpb3VzIGZpZWxkcyBhcmUgdXNlZC4KLQkoc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpOiBNYWtlIGlzX3NwYWNlIGFuZCBpc19zdWJzcGFjZSBiaXRmaWVsZHMuCi0JRGVsZXRlIHVudXNlZCBzdWJzcGFjZV9pbmRleC4gIEFsbCByZWZlcmVuY2VzIG5vdyB1c2UgdGhlCi0JdGFyZ2V0X2luZGV4IGZpZWxkIHdpdGhpbiB0aGUgc2VjdGlvbiBzdHJ1Y3R1cmUgaXRzZWxmLgotCi0JKiBzb20uYyAobWFrZV91bmlxdWVfc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgZGVjbGFyYXRpb24uCi0JKHNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCShzb21fb2JqZWN0X3NldHVwKTogQWxsb2NhdGUgc3BhY2UgZm9yIGFuZCBzYXZlIGV4ZWMgaW5mb3JtYXRpb24KLQl0aGF0IG5lZWRzIHRvIGJlIGNvcGllZCBkdXJpbmcgb2JqY29weS9zdHJpcC4KLQkoc29tX21rb2JqZWN0KTogRG8gbm90IGFsbG9jYXRlIHNwYWNlIGZvciBhIGZpbGUgaGVhZGVyIGhlcmUuCi0JSXQgaXMgbm90IHVzZWQgd2hlbiBvbmx5IHJlYWRpbmcgU09NIG9iamVjdHMuCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgYW5kIGF0dGFjaCBhIGZpbGUgaGVhZGVyCi0JdG8gdGhlIG91dHB1dCBiZmQuICBGb3IgZXhlY3V0YWJsZXMsIHVzZSB0aGUgc2F2ZWQgc3lzdGVtX2lkCi0JdmFsdWUgcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGd1ZXNzIHRoZSByaWdodCB2YWx1ZS4gIERvIG5vdCBhYm9ydAotCXd3aGVuIHNldHRpbmcgZmlsZV9oZHItPmVudHJ5KiBmb3IgZXhlY3V0YWJsZXMuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogRm9yIGV4ZWN1dGFibGVzLCBzZXQgdGhlIGV4ZWNfZW50cnkgYW5kCi0JZXhlY19mbGFncyBmaWVsZHMuCi0JKHNvbV9jb3B5X3ByaXZhdGVfYmFja2VuZF9zZWN0aW9uX2RhdGEpOiBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGxpYmhwcGEuaCAoUEFfUEFHRVNJWkUpOiBEZWZpbmUuCi0KLQkqIHNvbS5jIChTT01fQUxJR04pOiBEZWZpbmUuCi0JKHNvbV9iZWdpbl93cml0aW5nKTogSWYgd3JpdGluZyBhbiBleGVjdXRhYmxlLCBpbml0aWFsaXplIGFsbAotCWZpZWxkcyBpbiB0aGUgZXhlYyBoZWFkZXIgdG8gemVyby4gIFVwZGF0ZSBmaWVsZHMgaW4gdGhlIGV4ZWMKLQloZWFkZXIgYXMgc2l6ZXMgb2YgbG9hZGFibGUgc3Vic3BhY2VzIGFyZSBjb21wdXRlZC4gIENhcmVmdWxseQotCXByZXNlcnZlIGFsaWdubWVudHMgd2hlbiBidWlsZGluZyBleGVjdXRhYmxlcy4gIEFjdHVhbGx5IHdyaXRlIHRoZQotCWV4ZWMgYWZ0ZXIgYWxsIHRoZSBmaWVsZHMgYXJlIGZpbGxlZCBpbi4KLQotICAgICAgICAqIEJldHRlciBsb25nLWZpbGVuYW1lIGhhbmRsaW5nLiAgUmVhZHMgU09NIEFCSSBjb21wbGlhbnQgZXh0ZW5kZWQKLQluYW1lcywgYnV0IGRvZXNuJ3QgcXVpdGUgd3JpdGUgY29tcGxpYW50IGV4dGVuZGVkIG5hbWVzIHlldC4KLQkqIHNvbS5jIChzb21fc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlbGV0ZSBmdW5jdGlvbi4gIFRoZQotCWdlbmVyaWMgY29kZSB3aWxsIGhhbmRsZSB0aGluZ3MgY29ycmVjdGx5LgotCShzb21fc2x1cnBfYXJtYXApOiBTZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWVtYmVyLgotCShub3JtYWxpemUpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogVGFrZSB0aGUgc2l6ZSBvZiB0aGUgZXh0ZW5kZWQKLQluYW1lIHRhYmxlIGludG8gYWNjb3VudCB3aGVuIGNvbXB1dGluZyB0aGUgZmlsZSBvZmZzZXRzIGluIHRoZQotCVNPTSBkaWN0aW9uYXJ5LiAgTWFrZSBzdXJlIHRvIGFsaWduIHRvIGFuIGV2ZW4gYm91bmRhcnkuCi0JKHNvbV93cml0ZV9hcm1hcCk6IEluaXRpYWxpemUgdGhlIGNoZWNrc3VtIHRvIHplcm8uCi0JKGFyX21heGNoYXJzKTogRml4LiAgT3Bwcy4KLQotRnJpIE1hciAxOCAyMDozNToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChyZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfQ1RPUiBvbiBhIDY0LWJpdAotCW1hY2hpbmUuICBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDMTMgYW5kIEJGRF9SRUxPQ19TUEFSQ19CQVNFMTMuCi0KLVRodSBNYXIgMTcgMTg6MjY6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYmZkLWluLmggKEJGRF9WRVJTSU9OKTogVXNlIEBWRVJTSU9OQC4KLQkqIE1ha2VmaWxlLmluIChiZmQuaCk6IFJlcGxhY2UgaXQgd2l0aCBjb250ZW50cyBvZiBWRVJTSU9OIGZpbGUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2JmZF9pc19sb2NhbF9sYWJlbCk6IEZpeGVkIHR5cG8gd2hlcmUKLQl0aGlzIHdhcyBhbHNvIG5hbWVkIHRyYWRfdW5peF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLgotCi1UaHUgTWFyIDE3IDEwOjM3OjA3IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oLCBlbGZjb2RlLmgsIGNvZmYtYWxwaGEuYywgYm91dC5jLCBlY29mZi5jLCBlY29mZmxpbmsuYywKLQllbGYzMi1ocHBhLmMsIGVsZjMyLW1pcHMuYywgbGlua2VyLmMsIHNvbS5jLCBzdW5vcy5jOiBJZiBtYWxsb2MoMCkKLQlyZXR1cm5zIE5VTEwsIGl0IGlzIG5vdCBhbiBlcnJvci4gIEl0J3MgcG9zc2libGUgdGhhdCBzb21lIG9mCi0JdGhlc2UgY2hlY2tzIGFyZSBub3QgbmVjZXNzYXJ5IChiZWNhdXNlIHRoZSBzaXplIGNhbiBuZXZlciBiZQotCXplcm8pLCBidXQgcHV0dGluZyBpbiB0aGUgY2hlY2tzIGlzIHRoZSBjb25zZXJ2YXRpdmUgdGhpbmcgdG8gZG8KLQlpbiBsaWdodCBvZiB0aGUgZmFjdCB0aGF0IHNvbWUgb2YgdGhlc2UgbWFsbG9jIGNhbGxzIHJlcGxhY2VkCi0JdW5jaGVja2VkIGFsbG9jYSBjYWxscywgaW4gd2hpY2ggYSB6ZXJvIGFyZ3VtZW50IHdvdWxkIHdvcmsgZmluZS4KLQotVGh1IE1hciAxNyAxMTo0NDo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9zZi1jb3JlLmMgKG9zZl9jb3JlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBSZW1vdmUKLQlkdXBsaWNhdGUgZGVmaW5pdGlvbi4KLQkob3NmX2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsKTogRGVmaW5lLgotCi0JKiByZWxvYy5jIChiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndCBmYWlsCi0JaWYgbWFsbG9jICgwKSBmYWlscy4gIGJmZF9jYW5vbmljYWxpemVfcmVsb2MgcmV0dXJuaW5nIDAgaXMgbm90IGEKLQlmYWlsdXJlIGluZGljYXRpb24sIGl0IG1lcmVseSBtZWFucyB0aGVyZSBhcmUgbm8gcmVsb2NzLgotCi0JKiBlbGZjb2RlLmggKE5BTUUoYmZkX2VsZix3cml0ZV9vYmplY3RfY29udGVudHMpKTogRG9uJ3QgdXNlIHNwYWNlCi0JYWZ0ZXIgTkFNRSwgc2luY2UgU3VuT1MgL2Jpbi9jYyBjYW4ndCBoYW5kbGUgaXQuCi0KLVdlZCBNYXIgMTYgMTY6NDM6MzMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBuZXRic2QzODYuYyAoTl9TRVRfRkxBR1MpOiBEb24ndCBudWtlIHRoZSBtYWNoaW5lIGlkIGZpZWxkLgotCUZyb20gc3VrZXNAZ2x1ZS51bWQuZWR1IChUYXN1a2kgSGlyYXRhKS4KLQotV2VkIE1hciAxNiAwNzo1NTo1NCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dGYxLmggKDQgcGxhY2VzKTogVXNlIGEgc2ltcGxlICNpZiBvbiBBUkNIX1NJWkUsIHJhdGhlciB0aGFuCi0JYWxsIHRoYXQgY29udm9sdXRlZCBzdHVmZiB3aXRoIE5BTUUsIENBVDMsIGV0Yy4gIFRoZSBjb252b2x1dGVkCi0Jc3R1ZmYgYnJva2UgZm9yIFN1bk9TNCAvYmluL2NjIChkdWUgdG8gREVGVU4gZWxpbWluYXRpb24sIEkgZ3Vlc3MpLgotCi1XZWQgTWFyIDE2IDAwOjAyOjA1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3ByZXBfZm9yX2ZpeHVwcyk6IERldGVjdCBzZWN0aW9uIHN5bWJvbHMgYmFzZWQKLQlvbiBlaXRoZXIgdGhlIGxhY2sgb2YgcHJpdmF0ZSBkYXRhIG9yIHRoZSBzeW1ib2wgZmxhZ3MuICBEbyBub3QKLQltdW5nZSBzZWN0aW9uIHN5bWJvbCBuYW1lcyBhbnltb3JlIC0tIHRoZXkgbm8gbG9uZ2VyIGNvbmZ1c2UgR0RCLgotCShzb21fYmVnaW5fd3JpdGluZyk6IExlYXZlIHNwYWNlIGZvciBhbiBleGVjIGhlYWRlciBpZiB3cml0aW5nCi0JYW4gZXhlY3V0YWJsZS4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFJlY29nbml6ZSBib3RoIGZvcm1zIG9mIHNlY3Rpb24gc3ltYm9sCi0JbmFtZXMgIkwkMFwwMDIiIGFuZCAiJDxGT08+JCIuICBDaGFuZ2UgdGhlIG5hbWUgb2YgIkwkMFwwMDIiCi0Jc2VjdGlvbiBzeW1ib2xzIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRoZXkgcmVwcmVzZW50LgotCURlYnVnZ2luZyAgc3ltYm9scyBiZWdpbiB3aXRoICJMJDBcMDAxIiwgbm90IGp1c3QgIkwkIi4KLQotVHVlIE1hciAxNSAyMjo1ODoyOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmZkLWluMi5oLCBsaWJiZmQuaCwgbGliY29mZi5oOiBSZWJ1aWx0LgotCi0JKiBiZmQtaW4uaCAoSlVNUF9UQUJMRSk6IEFkZCBuZXcgZW50cmllcyB0byB0aGUganVtcCB0YWJsZQotCWZvciBiZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwgYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwKLQlhbmQgYmZkX2lzX2xvY2FsX2xhYmVsLgotCi0JKiB0YXJnZXRzLmM6IEFkZCBuZXcgZW50cmllcyB0byB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUuCi0JCi0JKiBiZmQuYyAoYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IE5ldyBkZWZpbml0aW9uLgotCi0JKiBzZWN0aW9uLmMgKGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTmV3IGRlZmluaXRpb24uCi0KLQkqIHN5bXMuYyAoYmZkX2lzX2xvY2FsX2xhYmVsKTogTmV3IGRlZmluaXRpb24uCi0KLQkqIGxpYmJmZC1pbi5oIChiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCk6IERlY2xhcmUuCi0KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQotCSogKi1jb3JlLmM6IFByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgbmV3IGZ1bmN0aW9ucyBpbgotCXRoZSB0YXJnZXQgdmVjdG9yIHdoaWNoIGFsbCBwb2ludCB0byBiZmRfZmFsc2UuCi0KLQkqIGFvdXQtdGFyZ2V0LmgsIGNvZmZjb2RlLmgsIGVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oLCBpZWVlLmMKLQlsaWJhb3V0LmgsIGxpYmVjb2ZmLmgsIG5sbS10YXJnZXQuaCwgb2FzeXMuYywgc3JlYy5jLCB0ZWtoZXguYwotCURlZmF1bHQgbmV3IHZlY3RvcnMgZm9yIGNvcHlpbmcgcHJpdmF0ZSBiYWNrZW5kIGRhdGEgdG8gYmZkX3RydWUuCi0JRGVmYXVsdCBuZXcgdmVjdG9yIGZvciBkZXRlcm1pbmluZyBpZiBhIHN5bWJvbCBpcyBhIGxvY2FsIGxhYmVsCi0JdG8gYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwuCi0KLQkqIHNvbS5jIChzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfaXNfbG9jYWxfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRm9yIG5vdyBkZWZhdWx0IHRvIGJmZF90cnVlLgotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2lzX2xvY2FsX2xhYmVsKTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgTWFyIDE1IDIzOjU1OjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2YtbTY4a2x5bnguYyAoQ0FMQ19BRERFTkQpOiBVc2UgX2JmZF9tNjhrbHlueF9ob3d0b190YWJsZS4KLQotVHVlIE1hciAxNSAwNDo0MToxMyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1vc3QgZmlsZXM6Ci0JUmVwbGFjZSBERUZVTiBhbmQgREVGVU5fVk9JRCB3aXRoIEsmUi1zdHlsZSBmdW5jdGlvbiBkZWZpbml0aW9uLgotCUluZGVudCBzb21lIG9mIHRoZW0gdG8gR05VIHN0YW5kYXJkcy4KLQotCSogYW91dDMyLmMsIGFyY2h1cmVzLmMsIGNvcmUuYywgY3B1LWg4MzAwLmMsIGNwdS1pOTYwLmMsCi0JY3B1LW02OGsuYywgY3B1LW04OGsuYywgY3B1LW1pcHMuYywgY3B1LXZheC5jLCBjdG9yLmMsIGRlbW82NC5jLAotCWVsZjMyLWhwcGEuaCwgZ2VuLWFvdXQuYywgaG9zdC1hb3V0LmMsIGluaXQuYywgbGliaHBwYS5oLAotCWxpYmllZWUuaCwgbGlib2FzeXMuaCwgbmV3c29zMy5jLCBzb20uaCwgc3RhYi1zeW1zLmMsIHN1bm9zLmM6Ci0JVXBkYXRlIGNvcHlyaWdodCB5ZWFycy4KLQotTW9uIE1hciAxNCAxMTo0MToyMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmMgKHNvbV9wcmVwX2Zvcl9maXh1cHMpOiBBIHJlbG9jYXRpb24gaW52b2x2aW5nIHRoZSBzZWN0aW9uCi0Jc3ltYm9sIGZvciB0aGUgKkFCUyogc2VjdGlvbiBpcyByZWFsbHkgYSByZWxvY2F0aW9uIGludm9sdmluZwotCW5vIHN5bWJvbC4KLQkoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvIG5vdCBzZXQgQlNGX0dMT0JBTCBvciBCU0ZfRVhQT1JUIGZvcgotCXVuZGVmaW5lZCBzeW1ib2xzLiAgQ29ycmVjdGx5IGRpc3Rpbmd1aXNoIGJldHdlZW4gZGVidWdnZXIgc3ltYm9scwotCWFuZCBzZWN0aW9uIHN5bWJvbHMuCi0KLQkqIHNvbSAoc2V0dXBfc2VjdGlvbnMpOiBTZXQgU0VDX0RFQlVHR0lORyBhbmQgdGhlIHNlY3Rpb24gYXR0cmlidXRlcwotCWZvciBzcGFjZXMgYW5kIHN1YnNwYWNlcy4KLQotCSogc29tLmMgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyk6IEZpeCB0eXBvLgotCi0JKiBzb20uYyAoc29tX29iamVjdF9zZXR1cCk6IFNldCBFWEVDX1AsIERfUEFHRUQsIFdQX1RFWFQsIGFuZAotCUhBU19SRUxPQyBiYXNlZCBvbiB0aGUgb2JqZWN0J3MgbWFnaWMgbnVtYmVyLgotCShtYWtlX3VuaXF1ZV9zZWN0aW9uKTogRGVsZXRlIGZ1bmN0aW9uLiAgQkZEIGFuZCBpdHMgdXNlcnMgYXJlCi0JcHJlcGFyZWQgdG8gaGFuZGxlIG11bHRpcGxlIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZS4KLQkoc2V0dXBfc2VjdGlvbnMpOiBBbGxvY2F0ZSBzcGFjZSBvbiB0aGUgQkZEJ3Mgb2JzdGFjayB0byBob2xkCi0Jc2VjdGlvbiBuYW1lcy4gIFVzZSBiZmRfbWFrZV9zZXRpb25fYW55d2F5IHJhdGhlciB0aGFuIHRoZQotCW9ic29sZXRlIG1ha2VfdW5pcXVlX3NlY3Rpb24uCi0JKHNvbV9wcmVwX2hlYWRlcnMpOiBDaG9vc2UgdGhlIGNvcnJlY3QgU09NIG1hZ2ljIG51bWJlciBiYXNlZAotCW9uIHRoZSBCRkQncyBmbGFncy4KLQkoc29tX2JmZF9maWxsX2luX2FyX3N5bWJvbHMpOiBSZXR1cm4gZmFsc2UsIG5vdCBOVUxMIG9uIGVycm9yLgotCi1TYXQgTWFyIDEyIDA5OjQ2OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWxmMzItcHBjLmM6IFJlbmFtZWQgZnJvbSBlbGYzMi1wb3dlcnBjLmMuCi0JKiBubG0zMi1wcGMuYzogUmVuYW1lZCBmcm9tIG5sbTMyLXBvd2VycGMuYy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotRnJpIE1hciAxMSAyMjoyNzoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXBvd2VycGMuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gdXBkYXRlIHRvIHByZWxpbWluYXJ5IEFCSS4KLQotRnJpIE1hciAxMSAwMDozNDo1OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogIEFzc3VtZSB0aGF0IGR5bmFtaWMgaW5mbwotCWlzIGFsd2F5cyBsb2NhdGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWN0aW9uIHRvIGFsbG93Ci0JcmVjb3Zlcnkgb2YgdGhlIGR5bmFtaWMgaW5mbyBmcm9tIGEgc3RyaXBwZWQgZXhlY3V0YWJsZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzKTogIEhhbmRsZSBTVFlQX1BEQVRBLCBTVFlQX1hEQVRBCi0JYW5kIFNUWVBfQ09NTUVOVC4KLQotV2VkIE1hciAgOSAxNzoxNzo1MyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLWluLmg6IFJlbW92ZSBhbGxvY2EgY3J1ZnQuICBJdCB3YXMgbWlzc2luZyBzb21lIG5lY2Vzc2FyeQotCWNydWZ0IChsaWtlIHRoZSAjcHJhZ21hIGFsbG9jYSBmb3IgQUlYKS4KLQlJbiBhZGRpdGlvbiB0byB0aGF0IHByb2JsZW0sIHRoZSBDIGFsbG9jYSBjYWxscyB4bWFsbG9jLCB3aGljaAotCW1lYW5zIGNoZWNraW5nIGZvciBiZWluZyBvdXQgb2YgbWVtb3J5IGNhbid0IHdvcmsgcmlnaHQuICBUaGUKLQlmb2xsb3dpbmcgY2hhbmdlcyByZW1vdmUgYWxsIHVzZXMgb2YgYWxsb2NhIGZyb20gQkZELgotCSogaG9zdHMvc29sYXJpczIuaDogUmVtb3ZlIGFsbG9jYSBjcnVmdC4KLQkqIHNvbS5jOiBSZXBsYWNlIGFsbG9jYSB3aXRoIGEgZml4ZWQgc2l6ZSBhdXRvIGFycmF5LgotCSogYW91dHguaCwgZWxmY29kZS5oLCBubG1jb2RlLmgsIGJvdXQuYywgY29mZi1hbHBoYS5jLCBlY29mZi5jLAotCWVjb2ZmbGluay5jLCBlbGYzMi1ocHBhLmMsIGVsZjMyLW1pcHMuYywgbGlua2VyLmMsIHJlbG9jLmMsIHNvbS5jLAotCXN1bm9zLmM6IFJlcGxhY2UgYWxsb2NhIHdpdGggbWFsbG9jIGFuZCBhcHByb3ByaWF0ZSBlcnJvciBjaGVja2luZyBhbmQKLQlmcmVlaW5nLgotCSogbGlua2VyLmM6IFJlcGxhY2UgYWxsb2NhIHdpdGggb2JzdGFja19hbGxvYy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1UdWUgTWFyICA4IDEyOjEwOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBNSVBTX1JfTElURVJBTCBsaWtlCi0JTUlQU19SX0dQUkVMLgotCi1TYXQgTWFyICA1IDE0OjA4OjU0IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmMzItaHBwYS5oLCBlbGZjb2RlLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmKl9IYWxmLCBFbGYqX1dvcmQsCi0JRWxmKl9PZmYgdHlwZWRlZnMgYnkgdGhlaXIgZXhwYW5zaW9uLCB0aGUgdHlwZWRlZnMgaGF2ZSBiZWVuCi0JcmVtb3ZlZCBmcm9tIGluY2x1ZGUvZWxmL2ludGVybmFsLmguCi0JKiBlbGZjb2RlLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6ICBIYW5kbGUgU0hUX0RZTkFNSUMgc2VjdGlvbiBsaWtlCi0JU0hUX1BST0dCSVRTIHNlY3Rpb24uCi0KLVRodSBNYXIgIDMgMjA6MDM6MzkgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5oIChfUEFfUklTQ19JRCk6IFRyZWF0IEhPU1RfSFBQQU9TRiBqdXN0IGxpa2UgSE9TVF9IUFBBQlNELgotCi1XZWQgTWFyICAyIDEzOjI4OjA2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaG9zdDogUmVjb2duaXplIGlbMzRdODYtc2VxdWVudC0qLgotCi0JKiB0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKTogQSBub24temVybywgbm90IHplcm8sCi0JcmV0dXJuIGZyb20gYmZkX3NlZWsgaW5kaWNhdGVzIGFuIGVycm9yLgotCU5ldyBtYWNybyBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUgdG8gcmVwbGFjZQotCVRSQURfQ09SRV9TVEFDS19PRkZTRVQuCi0JKiBob3N0cy9zeW1tZXRyeS5oOiBEZWZpbmUgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFIGFuZAotCVRSQURfQ09SRV9VU0VSX09GRlNFVCBidXQgbm90IEhPU1RfU1RBQ0tfT0ZGU0VULgotCi1XZWQgTWFyICAyIDExOjU3OjAzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uW2NoXTogRG8gbm90IGluY2x1ZGUgbGliaHBwYS5oIGluIHNvbS5jLCBpbnN0ZWFkIGluY2x1ZGUKLQlpdCBpbiBzb20uaC4KLQotCSogZWxmMzItaHBwYS5bY2hdOiBEbyBub3QgaW5jbHVkZSBsaWJocHBhLmggaW4gZWxmMzItaHBwYS5jLCBpbnN0ZWFkCi0JaW5jbHVkZSBpdCBpbiBlbGYzMi1ocHBhLmguCi0KLQkqIHNvbS5jIChsb2cyKTogUmV0dXJuIC0xIG9uIGVycm9yIHJhdGhlciB0aGFuIGFib3J0aW5nLgotCShzZXR1cF9zZWN0aW9ucyk6IEJ1YmJsZSB1cCBhbiBlcnJvciBmcm9tIGxvZzIuCi0KLQkqIENoYW5nZXMgdG8gbWFrZSBIUCBDIGNvbXBpbGVyIGhhcHB5IGluIGJvdGggdHJhZGl0aW9uYWwKLQlhbmQgQU5TSSBtb2RlLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogVXNlIGNvcnJlY3QgZW51bSB0eXBlIGZvcgotCWZpZWxkIHBhcmFtZXRlci4KLQkoYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzKTogVXNlIHVuc2lnbmVkIGludCByYXRoZXIgdGhhbgotCXVuc2lnbmVkIGNoYXIgdG8gYXZvaWQgR05VLUMgZXh0ZW5zaW9ucy4KLQkoYmZkX3NvbV9hdHRhY2hfYXV4X2hkcik6IFJldHVybiBhIGJvb2xlYW4gdG8gaW5kaWNhdGUgc3VjY2VzcwotCW9yIGZhaWx1cmUgcmF0aGVyIHRoYW4gYWJvcnRpbmcgb24gZmFpbHVyZS4KLQotCSogc29tLmggKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyk6IEZpeCBwcm90b3R5cGUgdG8gbWF0Y2gKLQlzb20uYyBjaGFuZ2VzLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogQWRkIHByb3RvdHlwZS4KLQkoaHBwYV9zb20tZ2VuX3JlbG9jX3R5cGUpOiBMaWtld2lzZS4KLQotCSogZWxmMzItaHBwYS5jOiBBZGQgYSBjb3VwbGUgY2FzdHMgdG8gbWFrZSBIUCBjb21waWxlciBoYXBweS4KLQkoaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uKTogRG8gbm90IHJldHVybiBmYWxzZSBvbiBmYWlsdXJlCi0JdW50aWwgcmVzdCBvZiBjb2RlIGlzIHJlYWR5IHRvIGhhbmRsZSBpdC4gIEFib3J0IGZvciBub3cuCi0KLVR1ZSBNYXIgIDEgMTg6MzM6NTkgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotVHVlIE1hciAgMSAxMzowNjo1MyAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBpMzg2b3M5ay5jOiB1c2UgbmV3IGZ1bmN0aW9ucyBiZmRfc2V0X2Vycm9yIGFuZCBiZmRfZ2V0X2Vycm9yLgotCSogTWFrZWZpbGUuaW46IGRlbGV0ZSBhbiBleHRyYSBibGFuay4KLQkqIGNvbmZpZ3VyZS5pbiA6IEFkZCBpMzk2b3M5a192ZWMuCi0KLU1vbiBGZWIgMjggMTU6NDE6MDEgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLmJmZCA6IEFkZCBpMzg2LW9zOWsuCi0JKiBjb25maWcvaTM4Ni1vczlrLm10IDogTmV3bHkgYWRkIG9zOWsgdGFyZ2V0IG1ha2VmaWxlLgotCi0JKiBpMzg2b3M5ay5jIDogbmV3IGZpbGUgdG8gaGFuZGxlIG9zOWsgZm9ybWF0IGJmZC4KLQkqIE1ha2VmaWxlLmluIDogSGFuZGxlIG5ldyBmaWxlIGkzODZvczlrLmMKLQkqIHRhcmdldHMuYyA6IEFkZCBiZmRfdGFyZ2V0X29zOWtfZmxhdm91ciBhbmQgaTM4Nm9zOWtfdmVjLgotCSogY2FjaGUuYyA6IEluaXRpYWxpemUgY2FjaGVfc2VudGluZWwgdG8gMC4KLQotU3VuIEZlYiAyNyAxNjozMDo1NSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZWxmMzItaHBwYS5jIChtaXNtYXRjaGVzLCByZXR2YWxfbWlzbWF0Y2hlcyk6IEZpeCBtaXNtYXRjaAotCWFjdGlvbiBpbiBjYXNlIHdoZXJlIGNhbGxlciBzcGVjaWZpZWQgbm8gYXJndW1lbnQgcmVsb2NhdGlvbi4KLQkoaHBwYV9lbGZfYnVpbGRfbGlua2VyX3N0dWIpOiBUcnkgYWdhaW4gdG8gZ2V0IHRoZSBzeW1fcHRyX3B0cgotCXJpZ2h0IGluIHRoZSBvcmlnaW5hbCByZWxvY2F0aW9uIGFuZCB0aGUgc3R1YidzIHJlbG9jYXRpb24uCi0KLSAgICAgICAgKiBlbGYzMi1ocHBhLmggKGhwcGFfbG9va19mb3Jfc3R1Yl9pbl9zZWN0aW9uKTogRml4IHR5cG8uICBEZWxldGUKLQl1bnVzZWQgc3ltYm9scyBhcmd1bWVudC4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX3JlbG9jKTogQWNjZXB0IGFzeW1ib2wgKiogcmF0aGVyCi0JdGhhbiBhc3ltYm9sICogZm9yIG9yaWdpbmFsIHRhcmdldCBzeW1ib2wuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCVNldCByZWxvYy0+c3ltX3B0cl9wdHIgYXBwcm9wcmlhdGVseS4KLQkoaHBwYV9lbGZfYnVpbGRfbGlua2VyX3N0dWIpOiBTZXQgcmVsb2MtPnN5bV9wdHJfcHRyIGNvcnJlY3RseS4KLQkoaHBwYV9lbGZfbG9va19mb3Jfc3R1YnNfaW5fc2VjdGlvbik6IE5vIGxvbmdlciBuZWVkIHN5bWJvbHMKLQlhcmd1bWVudC4gIFVzZSB0aGUgb3V0cHV0IHN5bWJvbHMgd2hlbiBjYW5vbmljYWxpemluZyB0aGUgcmVsb2NzLAotCWNyZWF0aW5nIHRoZW0gaWYgbmVjZXNzYXJ5LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBEbyBub3QKLQlyZWJ1aWxkL2Nsb2JiZXIgdGhlIG91dHB1dCBzeW1ib2xzIGlmIHRoZXkgYWxyZWFkeSBleGlzdC4KLQotU3VuIEZlYiAyNyAxNToyMjozNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYyAoQkZEX1NFTkQsIEJGRF9TRU5EX0ZNVCk6IEFkZCBkZWJ1Z2dpbmcgdmVyc2lvbnMgdGhhdAotCWNoZWNrIGFsbCB0aGUgcG9pbnRlciBkZXJlZmVyZW5jZXMuICBFbmFibGVkIHZpYSBERUJVR19CRkRfU0VORC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotCSogc3JlYy5jIChoZXhfdmFsdWUpOiBBbHdheXMgc2V0IHRvIGEgc2l6ZSBvZiAyNTYgYnl0ZXMuCi0JKHNyZWNfaW5pdCk6IENvc21ldGljIGNoYW5nZXMuCi0KLVN1biBGZWIgMjcgMTE6MTg6NDcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVsZjMyLWhwcGEuYzogU2Vjb25kIGhhbGYgb2YgbWFqb3IgY2xlYW51cC4gIE1vcmUgY29tbWVudHMsCi0JUEFSQU1pemUgYW5kIHN0YXRpY2l6ZSByZXN0IG9mIGZ1bmN0aW9ucy4gIERlbGV0ZSB1bnVzZWQKLQlmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkL3VubmVjZXNzYXJ5IGFyZ3VtZW50cyB0byBzb21lIGZ1bmN0aW9ucy4KLQlHcm91cCBzdGF0aWMgdmFycyB0b2dldGhlci4gIEFib3J0IGZvciBiYWQgZXJyb3JzIHVudGlsIHdlIGhhdmUKLQllcnJvciBjb2RlIHByb3BvZ2F0aW9uIHdvcmtpbmcuICBXb3JrIG9uIHNwYWNpbmcgYW5kIGluZGVudGlvbi4KLQlBZGQgRklYTUVzIGZvciB1bnJlc29sdmVkIHByb2JsZW1zLiAgVXNlIGVudW1zIHJhdGhlciB0aGFuCi0JI2RlZmluZXMgZm9yIGxvdHMgb2YgdGhpbmdzLiAgTWVyZ2UgdHdvIGZ1bmN0aW9ucyB3aGljaCBidWlsZAotCWxpbmtlciBzdHVicyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIChzbyB0aGV5IGNhbiBlYXNpbHkgc2hhcmUgYQotCXRvbiBvZiBjb21tb24gY29kZSkuCi0KLVNhdCBGZWIgMjYgMTA6MDA6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWxvYy5jIChfYmZkX3JlbG9jYXRlX2NvbnRlbnRzKTogQWRqdXN0IGhhbmRsaW5nIG9mIG92ZXJmbG93IHRvCi0JYXZvaWQgZGVwZW5kaW5nIHVwb24gcmlnaHQgc2hpZnRzIG9mIHNpZ25lZCBudW1iZXJzLCBhbmQgdG8KLQljb3JyZWN0IGhhbmRsaW5nIG9mIHNyY19tYXNrIHdpdGggbG93ZXIgYml0cyB6ZXJvLgotCi0JKiBhb3V0eC5oLCBhcmNoaXZlLmM6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuCi0JKiBlY29mZi5jLCBlY29mZmxpbmsuYywgZWNvZmZzd2FwLmgsIHNyZWMuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1pMzg2LmM6IExpa2V3aXNlLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBNYWtlIGkgdW5zaWduZWQ7IHJlbW92ZSBvbGQKLQkjaWYgMCBjb2RlLgotCShlbGZfd3JpdGVfcGhkcnMpOiBNYWtlIGkgdW5zaWduZWQuCi0JKG1hcF9wcm9ncmFtX3NlZ21lbnRzKTogTWFrZSBpIGFuZCBuX2xlZnQgdW5zaWduZWQuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTWFrZSBpIHVuc2lnbmVkLgotCSh3cml0ZV9zaGRyc19hbmRfZWhkcik6IE1ha2UgY291bnQgdW5zaWduZWQuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzKTogTWFrZSBpIHVuc2lnbmVkLgotCShOQU1FKGJmZCxlbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IE1ha2UgY291bnQgdW5zaWduZWQuCi0JKHNlY3Rpb25fZnJvbV9lbGZfaW5kZXgpOiBNYWtlIGluZGV4IGFyZ3VtZW50IHVuc2lnbmVkLgotCi1GcmkgRmViIDI1IDIxOjM0OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWxmY29kZS5oOiBEb24ndCBpbmNsdWRlIGFzc2VydC5oLgotCShzd2FwX291dF9zeW1zKTogVXNlIEJGRF9BU1NFUlQgcmF0aGVyIHRoYW4gYXNzZXJ0LgotCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IEFkZCBtaXNzaW5nCi0JYnJlYWsgaW4gc3dpdGNoLgotCi0JKiBob3N0cy9pMzg2djQuaCAocXNvcnQsIHN0cnRvbCk6IFJlbW92ZSBpbmNvcnJlY3QgYW5kIHVzZWxlc3MKLQlkZWNsYXJhdGlvbnMuCi0KLUZyaSBGZWIgMjUgMTY6MzU6NTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmhwcGEuaCAoaHBwYV9yZWJ1aWxkX2luc24pOiBNb3ZlZCBoZXJlIGZyb20gZWxmMzItaHBwYS5jLgotCi0JKiBlbGYzMi1ocHBhLmggKGVsZl9ocHBhX3RjX3N5bWJvbCk6IEFkZCBuZXcgYXJndW1lbnRzLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBBZGQgZXh0ZXJuIGRlY2wuCi0KLQkqIGVsZjMyLWhwcGEuYzogRmlyc3QgaGFsZiBvZiBtYWpvciBjbGVhbnVwLiAgQWRkL2NsZWFudXAgbG90cyBvZgotCWNvbW1lbnRzLiAgUEFSQU1pemUgc29tZSBzdGF0aWMgZnVuY3Rpb25zLiAgRGVsZXRlIHVudXNlZCBmdW5jdGlvbnMuCi0JRGVsZXRlIHVudXNlZC91bm5lY2Vzc2FyeSBhcmd1bWVudHMgdG8gbWFueSBmdW5jdGlvbnMuICBHcm91cAotCXN0YXRpYyB2YXJzIHRvZ2V0aGVyLiAgQ29sbGFwc2UgY29tbW9uIGNhc2Ugc3RhdGVtZW50cyB0b2dldGhlcgotCWluIG1hbnkgcGxhY2VzLiAgVXNlIGRlZmF1bHQgY2FzZSB3aGVuIHBvc3NpYmxlIGluc3RlYWQgb2YgbGlzdGluZwotCWVhY2ggY2FzZSBzZXBhcmF0ZWx5LiAgQWJvcnQgZm9yIGJhZCBlcnJvcnMgdW50aWwgd2UgZ2V0IGVycm9yCi0JY29kZSBwcm9wb2dhdGlvbiB3b3JraW5nLiAgV29yayBvbiBzcGFjaW5nIGFuZCBpbmRlbnRpb24gcHJvYmxlbXMuCi0JQWRkIEZJWE1FcyBmb3Igc29tZSB1bnJlc29sdmVkIHByb2JsZW1zLiAgRGVsZXRlIGhvcGVsZXNzbHkgYnJva2VuIAotCUNPTVBMRVggcmVsb2NhdGlvbiBzdXBwb3J0IChpdCdzIG5ldmVyIHVzZWQgYW55d2F5KS4KLQkoaHBwYV9lbGZfcmVidWlsZF9pbnNuKTogRGVsZXRlLiAgTW92ZWQgaW50byBsaWJocHBhLmguCi0JKGVsZl9ocHBhX3RjX3N5bWJvbCk6IEFjY2VwdCBhbmQgdXNlIG5ldyBhcmd1bWVudHMgKHN5bWV4dCBjaGFpbnMpLgotCShlbGZfaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLQkqIGZvcm1hdC5jIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMpOiBJbml0aWFsaXplIG1hdGNoaW5nX3ZlY3RvcgotCXRvIGtlZXAgZ2NjIC1XYWxsIHF1aWV0LgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBGaXggdHlwby4KLQotCSogc29tLmMgKHNvbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogVXNlICJzaXplb2YgKGFzeW1ib2wgKikiCi0Jbm90ICJzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSAqKSIuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBVc2UgInNpemVvZiAoYXN5bWJvbCAqKSIKLQlub3QgInNpemVvZiAoYXN5bWJvbCIpLiAgT3Bwcy4KLQotRnJpIEZlYiAyNSAxMzoxOTowNCAxOTk0ICBUZWQgTGVtb24gIChtZWxsb25AcGVwcGVyLm5jZC5jb20pCi0KLQkqIGJmZC5jIChiZmRfZ2V0X2dwX3NpemUpOiBDYW4ndCByZXR1cm4gZ3AgdmFsdWUgb24gYW4gYXJjaGl2ZS4KLQkoYmZkX3NldF9ncF9zaXplKTogIENhbid0IHNldCBncCB2YWx1ZSBvbiBhbiBhcmNoaXZlLgotCi1GcmkgRmViIDI1IDEyOjU3OjAwIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHNyZWMuYyAocGFzc19vdmVyKTogRG9uJ3Qgc2tpcCB0b28gbWFueSBjaGFyYWN0ZXJzIHdoZW4KLQllbmQgb2YgbGluZSBzZWVuLgotCi1GcmkgRmViIDI1IDExOjQxOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2l6ZW9mX2hlYWRlcnMpOiBBbGlnbiByZXN1bHQgdG8gMTYgYnl0ZQotCWJvdW5kYXJ5LgotCi1UaHUgRmViIDI0IDA3OjEzOjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IERlcml2ZSBzeW1ib2xfaW5mbwotCWZpZWxkIGZvciBhYnNvbHV0ZSBzeW1ib2xzIGluIHRoZSBzYW1lIG1hbm5lciBhcyB1bmRlZmluZWQKLQlhbmQgY29tbW9uIHN5bWJvbHMuCi0KLVRodSBGZWIgMjQgMDQ6Mjk6MTkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlbGZjb2RlLmggKGVsZl9jb3JlX2ZpbGVfcCk6ICBDaGVjayBmb3IgY29yZSBmaWxlIGVfbWFjaGluZSBtYXRjaAotCWxpa2UgaW4gZWxmX29iamVjdF9wLgotCi1XZWQgRmViIDIzIDE4OjI4OjM3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKGFsbG9jYSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQotCSogc29tLmMgKHNvbV9wcmVwX2hlYWRlcnMpOiBVc2UgQ1BVX1BBX1JJU0MxXzAgZm9yIG1hZ2ljCi0JbnVtYmVyIHJhdGhlciB0aGFuIEhQOTAwMFM4MDBfSUQuICBOb3RlIHNvbS5jIGlzIGNhcmVmdWwKLQl0byBtYWtlIHN1cmUgQ1BVX1BBX1JJU0MxXzAgaXMgYWx3YXlzIGRlZmluZWQuCi0KLU1vbiBGZWIgMjEgMTA6MTI6MDIgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodGFyZ2V0cy5vLCBhcmNodXJlcy5vKTogVXNlIEFMTF9DRkxBR1MgdG8gc3VwcGx5Ci0JZmxhZ3MgdG8gZXhwbGljaXQgY29tcGlsZSBhY3Rpb25zLgotCi1Nb24gRmViIDIxIDA5OjUwOjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfd3JpdGVfc3ltaGRyKTogU2V0IHN5bWhkci0+bWFnaWMgaGVyZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IE1ha2Ugc3VyZSAuYnNzIHNlY3Rpb24KLQllbmRzIG9uIGEgcGFnZSBib3VuZGFyeSBpZiB0aGVyZSBpcyBubyBzeW1ib2wgdGFibGUuCi0JKGVjb2ZmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IHN5bWhkci0+bWFnaWMgaGVyZS4KLQotCSogaG9zdHMvaHAzMDAuaDogSW5jbHVkZSA8c3RkbGliLmg+OyBkb24ndCBkZWNsYXJlIGZyZWUuCi0KLQkqIHNvbS5jIChzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMpOiBVc2UgYSBwb2ludGVyIGFuZCBhbGxvY2EKLQlyYXRoZXIgdGhhbiBhbiBhcnJheSBvZiB2YXJpYWJsZSBzaXplLgotCShzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IExpa2V3aXNlLgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXdyaXRlIG1hc2sgYW5kIHNoaWZ0Ci0Jb3BlcmF0aW9uIHRvIGF2b2lkIE9TRiAxLjMgY2MgYnVnLgotCSogZWNvZmYuYyAoZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTWFrZSB0ZXh0X3NpemUsIGRhdGFfc2l6ZQotCWFuZCBic3Nfc2l6ZSBiZmRfc2l6ZV90eXBlIGluc3RlYWQgb2YgdW5zaWduZWQgbG9uZy4gIE1ha2UKLQl0ZXh0X3N0YXJ0IGFuZCBkYXRhX3N0YXJ0IGJmZF92bWEgaW5zdGVhZCBvZiB1bnNpZ25lZCBsb25nLgotCSogZWNvZmZsaW5rLmMgKGVjb2ZmX2FkZF9zdHJpbmcpOiBSZW1vdmUgaW5jb3JyZWN0IGNhc3Qgb2YgcmV0dXJuCi0JdmFsdWUuCi0KLVN1biBGZWIgMjAgMTY6MDY6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzKTogQ29uc2lkZXIKLQlzeW1ib2xzIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhciBpbiB0aGUgYXJjaGl2ZSBtYXAuCi0KLVNhdCBGZWIgMTkgMDM6MTc6MzIgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb2ZmLWFscGhhLmMgKHJlbG9jX25pbCk6ICBBZGQgZm9yd2FyZCBkZWNsYXJhdGlvbiwgYWRkIG1pc3NpbmcKLQllcnJvcl9tZXNzYWdlIGFyZ3VtZW50LgotCSogY29mZi1zcGFyYy5jIChiZmRfY29mZl9nZW5lcmljX3JlbG9jKTogIEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uLAotCWFkZCBtaXNzaW5nIGVycm9yX21lc3NhZ2UgYXJndW1lbnQuCi0JKiBtaXBzYnNkLmMgKG1pcHNfZml4X2hpMTZfcyk6ICBBZGQgZm9yd2FyZCBkZWNsYXJhdGlvbiwgYWRkIG1pc3NpbmcKLQllcnJvcl9tZXNzYWdlIGFyZ3VtZW50LgotCi1GcmkgRmViIDE4IDExOjQxOjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIFBvd2VyUEMgTmV0V2FyZS4KLQkqIG5sbTMyLXBvd2VycGMuYzogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChwb3dlcnBjLSotbmV0d2FyZSopOiBOZXcgdGFyZ2V0OyB1c2UgcHBjLW5sbS4KLQkqIGNvbmZpZy9wcGMtbmxtLm10OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfcG93ZXJwY192ZWMpOiBOZXcgdGFyZ2V0IHZlY3RvcjsgdXNlCi0JbmxtMzItcG93ZXJwYy5vLCBubG0zMi5vLCBubG0uby4KLQkqIHRhcmdldHMuYyAobmxtMzJfcG93ZXJwY192ZWMpOiBEZWNsYXJlLgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIG5sbTMyLXBvd2VycGMuby4KLQkoQ0ZJTEVTKTogQWRkIG5sbTMyLXBvd2VycGMuYy4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUG93ZXJQQyBFTEYuICBEb25lIHdpdGhvdXQgYW4gQUJJLCBhbmQKLQlwcm9iYWJseSB0byBiZSBjaGFuZ2VkIHdoZW4gSSBnZXQgYW4gQUJJLgotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLXN5c3Y0Kik6IE5ldyB0YXJnZXQ7IHVzZSBwcGMtZWxmLgotCSogY29uZmlnL3BwYy1lbGYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfcG93ZXJwY192ZWMpOiBOZXcgdGFyZ2V0IHZlY3RvcjsgdXNlCi0JZWxmMzItcG93ZXJwYy5vLCBlbGYzMi5vLCBlbGYuby4KLQkqIGVsZjMyLXBvd2VycGMuYzogTmV3IGZpbGUuCi0JKiBlbGZjb2RlLmggKHByZXBfaGVhZGVycyk6IEFkZCBiZmRfYXJjaF9wb3dlcnBjIGNhc2UuCi0JKGVsZl9zZXRfYXJjaF9tYWNoKTogTGlrZXdpc2UuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9wb3dlcnBjX3ZlYyk6IERlY2xhcmUuCi0JKiBNYWtlZmlsZS5pbiAoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItcG93ZXJwYy5vLgotCShDRklMRVMpOiBBZGQgZWxmMzItcG93ZXJwYy5jLgotCVJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1UaHUgRmViIDE3IDE1OjI5OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29mZmdlbi5jIChjb2ZmX3dyaXRlX2xpbmVudW1iZXJzKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBIYW5kbGUgemVybyBzeW1ib2xzCi0JcmVhc29uYWJseS4gIEFsbG9jYXRlIHhfc3ltcCB1c2luZyBhbGxvY2EuCi0KLQkqIGVsZmNvZGUuaCAobWFwX3Byb2dyYW1fc2VnbWVudHMpOiBFTEYgcHJvZ3JhbSBoZWFkZXIgZW50cmllcwotCW11c3QgYmUgc29ydGVkIGJ5IGxvYWQgYWRkcmVzcy4gIFRoaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZW50cmllcwotCWluIHJldmVyc2Ugb3JkZXIuCi0KLQkqIHNlY3Rpb24uYyAoU0VDX0lOX01FTU9SWSk6IERlZmluZS4KLQkoYXNlY3Rpb24pOiBSZW5hbWUgdW51c2VkIGZpZWxkIG90aGVydXNlcmRhdGEgdG8gY29udGVudHMsIGFuZAotCW1ha2UgaXQgY2hhciAqLgotCShiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IEluaXRpYWxpemUgY29udGVudHMgZmllbGQgdG8gTlVMTC4KLQkoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogSWYgU0VDX0lOX01FTU9SWSBpcyBzZXQsIGdldCBzZWN0aW9uCi0JY29udGVudHMgZnJvbSBjb250ZW50cyBmaWVsZCByYXRoZXIgdGhhbiBmcm9tIGZpbGUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVRodSBGZWIgMTcgMDg6MzA6NTMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuYyAoYmZkX2dldF9lcnJvciwgYmZkX3NldF9lcnJvcik6IE5ldyBmdW5jdGlvbnMuCi0JKGJmZF9lcnJvcik6IE1ha2Ugc3RhdGljLgotCShiZmRfZXJyb3JfdHlwZSk6IFJlbmFtZWQgZnJvbSBiZmRfZWMuICBQcmVwZW5kICJiZmRfZXJyb3JfIiB0bwotCWFsbCB2YWx1ZXMuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogYWl4Mzg2LWNvcmUuYywgYW91dC1hZG9iZS5jLCBhb3V0LWVuY2FwLmMsIGFvdXQtdGFyZ2V0LmgsIAotCWFvdXRmMS5oLCBhb3V0eC5oLCBhcmNoaXZlLmMsIGFyY2h1cmVzLmMsIAotCWJmZC5jLCBib3V0LmMsIGNhY2hlLmMsIGNvZmYtYWxwaGEuYywgY29mZi1taXBzLmMsIAotCWNvZmYtcnM2MDAwLmMsIGNvZmZjb2RlLmgsIGNvZmZnZW4uYywgY29yZS5jLCBjdG9yLmMsIAotCWVjb2ZmLmMsIGVjb2ZmbGluay5jLCBlbGYuYywgZWxmMzItaHBwYS5jLCBlbGYzMi1taXBzLmMsIAotCWVsZmNvZGUuaCwgZm9ybWF0LmMsIGhhc2guYywgaHAzMDBocHV4LmMsIGhwcGFic2QtY29yZS5jLCAKLQlpMzg2bHlueC5jLCBpZWVlLmMsIGxpYmJmZC5jLCBsaWJlbGYuaCwgbGlua2VyLmMsIAotCWx5bngtY29yZS5jLCBubG0uYywgbmxtMzItYWxwaGEuYywgbmxtMzItaTM4Ni5jLCAKLQlubG0zMi1zcGFyYy5jLCBubG1jb2RlLmgsIG9hc3lzLmMsIG9wbmNscy5jLCBvc2YtY29yZS5jLCAKLQlwdHJhY2UtY29yZS5jLCByZWxvYzE2LmMsIHJzNjAwMC1jb3JlLmMsIHNlY3Rpb24uYywgc29tLmMsIAotCXNyZWMuYywgc3Vub3MuYywgc3ltcy5jLCB0YXJnZXRzLmMsIHRla2hleC5jLCAKLQl0cmFkLWNvcmUuYzogQ2hhbmdlIGNhbGxlcnMuCi0KLVR1ZSBGZWIgMTUgMjI6Mjc6MjcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jOiBSZW1vdmUgRklYTUVzIGZvciB0aGluZ3Mgd2hpY2ggaGF2ZSBiZWVuIGRlYWx0IHdpdGguCi0KLVR1ZSBGZWIgMTUgMTk6Mzk6MjQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc2VjdGlvbi5jIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpOiBTaW5jZSB0aGlzIGZ1bmN0aW9uIHJlYWRzCi0JdW5yZWxvY2F0ZWQgY29udGVudHMsIHRoZSBzZWN0aW9uJ3MgcmF3IHNpemUgaXMgYWx3YXlzIHRoZSBvbmUgdG8KLQl1c2UgZm9yIGJvdW5kcyBjaGVja2luZy4KLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IEluIGFzc2VydGlvbiwgY29tcGFyZQotCWxpbmtfb3JkZXIgc2l6ZSBmaWVsZCBhZ2FpbnN0IGNvb2tlZCBzaXplLCBub3QgcmF3IHNpemUsIG9mIGlucHV0Ci0Jc2VjdGlvbi4KLQotCSogYm91dC5jIChiX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpOiBGb3IgQlNTIHNlY3Rpb24sIGp1c3QKLQlyZXR1cm4gMC4KLQkoYWxpZ25jb2RlKTogV2hlbiBzaHJpbmtpbmcsIHRoZSBhZGRlbmQgc2hvdWxkIGJlIHNldCB0byB0aGUKLQljdXJyZW50IG9mZnNldCBpbiB0aGUgc2VjdGlvbiBwbHVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcGFkZGluZwotCXRoYXQgd2lsbCBhY3R1YWxseSBiZSByZXRhaW5lZC4KLQkoYl9vdXRfcmVsYXhfc2VjdGlvbik6IElmIGEgc2VjdGlvbiBjb250YWlucyBubyByZWxvY2F0aW9ucywgZG9uJ3QKLQlib3RoZXIgcHJvY2Vzc2luZyB0aGVtLgotCShiX291dF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBTZXQgcmVsb2NfZG9uZS4gIEFzc2VydAotCXRoYXQgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIHJldHVybnMgdHJ1ZS4gIENoZWNrIHRoYXQgcmVsb2NzIGFyZQotCXByb3Blcmx5IG9yZGVyZWQuCi0JKGJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cywgY2FzZSBBTElHTkRPTkUpOiBBc3NlcnQKLQl0aGF0IHJlbG9jLT5hZGRlbmQgZmFsbHMgYmV0d2VlbiB0aGUgY3VycmVudCBzb3VyY2Ugb2Zmc2V0IGFuZCB0aGUKLQlyYXcgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbi4KLQotCSogY29uZmlnLmJmZDogU3VwcG9ydCBpOTYwIHZ4d29ya3MgdmVyc2lvbnMgPiA1LjAgd2l0aCBjb2ZmLCBub3QKLQlib3V0LiAgRGVmYXVsdCB3aXRoIG5vIHZlcnNpb24gbnVtYmVyIGlzIHN0aWxsIGJvdXQuICBTdXBwb3J0Ci0JZXhwbGljaXQgaTk2MC1jb2ZmIHRhcmdldCB0b28uCi0KLQkqIGJvdXQuYzogQ2hhbmdlZCBzb21lIGluZGVudGF0aW9uLCBkZWxldGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsCi0JZml4ZWQgc29tZSBjb21tZW50cywgcmVtb3ZlZCBzb21lICIjaWYgMSIgbGluZXMuCi0JKG91dHB1dF9hZGRyKTogTmV3IG1hY3JvLgotCShjYWxsanhfY2FsbGJhY2ssIGNhbGxqX2NhbGxiYWNrLCBnZXRfdmFsdWUsIGFiczMyY29kZSwgYWxpZ25jb2RlLAotCWJfb3V0X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFVzZSBpdCBmb3IgcmVhZGFiaWxpdHkuCi0KLVR1ZSBGZWIgMTUgMDk6MDA6MTYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fYmZkX3ByZXBfZm9yX2FyX3dyaXRlKTogSXRlcmF0ZSB0aHJvdWdoIHRoZSBTT00KLQlzeW1ib2xzLCBub3QgdGhlIEJGRCBzeW1ib2xzLgotCShzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZik6IExpa2V3aXNlLgotCi1Nb24gRmViIDE0IDIyOjU1OjIwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IERvIG5vdCBkaWUgaWYgYSBCRkQgZG9lc24ndAotCWhhdmUgYW55IHN5bWJvbHMuCi0KLQkqIEZpbmlzaCBiYXNpYyByZWFkLXdyaXRlIHN1cHBvcnQgZm9yIFNPTSBhcmNoaXZlIGxpYnJhcmllcy4gIEJ1Z3MKLQlzdXJlbHkgcmVtYWluIGFzIHRoaXMgaGFzbid0IGJlZW4gdGVzdGVkIGFsbCB0aGF0IG11Y2guCi0JKiBzb20uYyAoU09NX0xTVF9IQVNIX1NJWkUsIFNPTV9MU1RfTU9EVUxFX0xJTUlUKTogRGVmaW5lLgotCShzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pOiBOZXcgc3RydWN0dXJlIHRvIGhvbGQgaW5mbyBuZWNlc3NhcnkKLQl0byBidWlsZCBib3RoIG5vcm1hbCBhbmQgbGlicmFyeSBzeW1ib2wgdGFibGVzLgotCShzb21fZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8pOiBOZXcgZnVuY3Rpb24gdG8gZGVyaXZlIGluZm8gbmVjZXNzYXJ5Ci0JdG8gYnVpbGQgYm90aCBub3JtYWwgYW5kIGxpYnJhcnkgc3ltYm9sIHRhYmxlcy4KLQkoc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUpOiBVc2UgbmV3IGZ1bmN0aW9uIHRvIGRlcml2ZSBtaXNjCi0Jc3ltYm9sIGluZm9ybWF0aW9uLgotCShzb21fc2x1cnBfc3ltYm9sX3RhYmxlKTogVXBkYXRlIGJhY2tlbmQgcHJpdmF0ZSBkYXRhIGZvciBzeW1ib2xzCi0JYXBwcm9wcmlhdGVseS4KLQkoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl9zeW1ib2xfaGFzaCk6IE5ldyBmdW5jdGlvbi4KLQkoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBOZXcgZnVuY3Rpb24uCi0JKHNvbV93cml0ZV9hcm1hcCk6IEZsZXNoIG91dC4KLQkoc29tX3ZlYyk6IEZpeCBhciBwYWRkaW5nIGNoYXJhY3Rlci4KLQotCSogc29tLmM6IENvbnNpc3RlbnRseSB1c2UgbWVtc2V0IHJhdGhlciB0aGFuIGJ6ZXJvLgotCi1Nb24gRmViIDE0IDE3OjAyOjI4IDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvZmYtcnM2MDAwLmM6ICBBZGQgTHlueCBjb3JlIGZpbGUgc3VwcG9ydCwgdXNlIEhPU1RfQUlYLCB3aGVyZQotCWFwcHJvcHJpYXRlLgotCSogcnM2MDAwLWNvcmUuYzogIFVzZSBIT1NUX0FJWCBpbnN0ZWFkIG9mIENPUkVGSUxFU19QTEVBU0UuCi0JKiBjb25maWcvcnM2MDAwLm1oOiAgUmVtb3ZlIGRlZnMgb2YgQVJDSElWRVNfUExFQVNFIGFuZAotCUNPUkVGSUxFU19QTEVBU0UuCi0JKiBjb25maWcvcnM2MDAwbHlueC5taDogIFR1cm4gb24gTHlueCBjb3JlIGZpbGUgc3VwcG9ydC4KLQkqIGhvc3RzL3JzNjAwMC5oOiAgI2RlZmluZSBIT1NUX0FJWC4KLQkqIGhvc3RzL3JzNjAwMGx5bnguaDogIENyZWF0ZSB0aGlzIHRvIGVuYWJsZSBMeW54IGhvc3Qgc3VwcG9ydC4KLQotU3VuIEZlYiAxMyAxNDozMDowMCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc29tLmggKHNvbV9zeW1ib2xfZGF0YSk6IFNhZmVseSBhY2Nlc3MgYmFja2VuZCBwcml2YXRlIGRhdGEKLQlmb3IgQkZEIHN5bWJvbHMuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi0JKiBSZWFkLW9ubHkgU09NIGFyY2hpdmUgc3VwcG9ydC4KLQkqIHNvbS5jIChzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMpOiBOZXcgaGVscGVyIGZ1bmN0aW9uLgotCShzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyk6IE5ldyBoZWxwZXIgZnVuY3Rpb24uCi0JKHNvbV9zbHVycF9hcm1hcCk6IE5ldyBmdW5jdGlvbiB0byByZWFkIGEgU09NIExTVC4KLQotCSogc29tLmg6IEluY2x1ZGUgPGxzdC5oPiBhbmQgPGFyLmg+LgotCi1TYXQgRmViIDEyIDIyOjM0OjE0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbGZjb2RlLmggKGVsZl9tYXBfc3ltYm9scyk6IEZpeCB0eXBvLgotCSh3cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayByZXR1cm4gdmFsdWVzIGZyb20gcHJlcF9oZWFkZXJzIGFuZAotCWVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKHNldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgMTEgMTY6NTY6NTAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKG5vcm1hbGl6ZSkgW1ZNU106IENhbGwgbWFsbG9jLCBub3QgYmZkX3htYWxsb2MuCi0JKGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IENoZWNrIHJlc3VsdCBvZiBub3JtYWxpemUuCi0KLVR1ZSBGZWIgIDggMDg6NTc6MzEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JTWFrZSBhbGwgY2FsbGVycyBvZiBtYWxsb2Mgb3IgcmVhbGxvYyAoaW5jbHVkaW5nIHZpYSBvYnN0YWNrcykKLQljaGVjayB0aGUgcmVzdWx0IGZvciBOVUxMLiAgTW9zdCBzZXQgYmZkX2Vycm9yIHRvIG5vX21lbW9yeSBhbmQKLQlyZXR1cm4gaW4gdGhhdCBjYXNlOyBhIGZldyBhcmUgaGFyZGVyIHRvIGZpeCwgYW5kIGFyZSBtYXJrZWQKLQl3aXRoICJGSVhNRSA8cmV0dXJuIHR5cGU+Ii4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9idWlsZF9hcmdfcmVsb2Nfc3R1YgotCWhwcGFfZWxmX2J1aWxkX2xvbmdfYnJhbmNoX3N0dWIpOiAgQ2hlY2sgYmZkX21ha2VfZW1wdHlfc3ltYm9sIHJldHVybi4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scwotCV9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEaXR0bwotCSogc2VjdGlvbi5jIChiZmRfbWFrZV9zZWN0aW9uX2FueXdheSk6IERpdHRvLgotCi0JKiB0ZWtoZXguYyAoZmluZF9jaHVuayB0ZWtoZXhfbWtvYmplY3QpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGZpcnN0X3BoYXNlKTogRGl0dG8uICBGSVhNRSB2b2lkCi0JKHRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIHN1bm9zLmMgKHN1bm9zX3JlYWRfZHluYW1pY19pbmZvKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoTVkocmVhZF9keW5hbWljX3N5bWJvbHMpIE1ZKHJlYWRfZHluYW1pY19yZWxvY3MpKTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBzdHJpbmdoYXNoLmMgKF9iZmRfc3RyaW5ndGFiX2hhc2hfbmV3ZnVuYyk6IENoZWNrIGJmZF9oYXNoX2FsbG9jYXRlLgotCi0JKiBzcmVjLmM6IEluZGVudC4KLQkoZmlsbHVwX3N5bWJvbHMpOiBDaGVjayBiZmRfYWxsb2MuICBGSVhNRSB2b2lkCi0JKHNyZWNfbWtvYmplY3Qgc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cwotCXNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDaGVjayBiZmRfYWxsb2MuIAotCShzcmVjX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogQ2hlY2sgYmZkX2FsbG9jX2J5X3NpemVfdC4KLQkobWFrZV91bmlxdWVfc2VjdGlvbik6IENoZWNrIGJmZF9hbGxvYy4KLQkoc29tX25ld19zZWN0aW9uX2hvb2spOiBDaGVjayBiZmRfemFsbG9jLgotCShiZmRfc29tX2F0dGFjaF9hdXhfaGRyKTogRGl0dG8uICBGSVhNRSB2b2lkCi0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9wKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogb3NmLWNvcmUuYyAob3NmX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCShvc2ZfY29yZV9jb3JlX2ZpbGVfcCk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogb2FzeXMuYyAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIG9hc3lzX2FyY2hpdmVfcAotCW9hc3lzX21rb2JqZWN0IG9hc3lzX29iamVjdF9wIG9hc3lzX25ld19zZWN0aW9uX2hvb2sKLQlvYXN5c19zZXRfc2VjdGlvbl9jb250ZW50cyk6IENoZWNrIGJmZF9hbGxvYy4KLQkob2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhKTogQ2hlY2sgYmZkX3phbGxvYyBhbmQgYmZkX2FsbG9jLgotCShvYXN5c19tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrIGJmZF96YWxsb2MuCi0KLQkqIG5sbWNvZGUuaCAobmxtX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkobmxtX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoZWNrIGJmZF96YWxsb2MgYW5kIGJmZF9hbGxvYy4KLQotCSogbmxtMzItc3BhcmMuYyAobmxtX3NwYXJjX3JlYWRfaW1wb3J0KTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBubG0zMi1pMzg2LmMgKG5sbV9pMzg2X3JlYWRfaW1wb3J0KTogQ2hlY2sgYmZkX2FsbG9jLgotCi0JKiBubG0zMi1hbHBoYS5jIChubG1fYWxwaGFfcmVhZF9pbXBvcnQpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGxpbmtlci5jIChfYmZkX2xpbmtfaGFzaF9uZXdmdW5jCi0JKGdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMKLQkoYXJjaGl2ZV9oYXNoX25ld2Z1bmMKLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZS4KLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLQkoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMKLQkoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogQ2hlY2sgYmZkX2FsbG9jLgotCShiZmRfbmV3X2xpbmtfb3JkZXIpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCi0JKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogaWVlZS5jOiBJbmRlbnQuCi0JKHJlYWRfaWQgZ2V0X3N5bWJvbCBnZXRfc2VjdGlvbl9lbnRyeSBpZWVlX2FyY2hpdmVfcCBpZWVlX29iamVjdF9wCi0JaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgaWVlZV9uZXdfc2VjdGlvbl9ob29rKTogQ2hlY2sgYmZkX2FsbG9jLgotCShkb19vbmUpOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IENoZWNrIGl0LgotCShpbml0X2Zvcl9vdXRwdXQpOiBDaGVjayBiZmRfYWxsb2MuICBSZXR1cm4gYSBib29sZWFuLgotCShpZWVlX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQ2hlY2sgaXQuCi0JKGRvX3dpdGhfcmVsb2NzKTogIENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGllZWVfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSk6IERpdHRvLiAgRklYTUUgdm9pZC4KLQkoaWVlZV9ta29iamVjdCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGllZWVfbWFrZV9lbXB0eV9zeW1ib2wpOiBDaGVjayBiZmRfem1hbGxvYy4KLQotCSogaHB1eC1jb3JlLmMgKGhwdXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrCi0JYmZkX3phbGxvYy4KLQotCSogaHBwYWJzZC1jb3JlLmMgKGhwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IENoZWNrCi0JYmZkX3phbGxvYy4KLQkoaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9wKTogQ2hlY2sgYmZkX3phbGxvYy4KLQotCSogaHAzMDBocHV4LmMgKE1ZKHNsdXJwX3N5bWJvbF90YWJsZSkpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGVsZmNvZGUuaCAoZWxmX25ld19zZWN0aW9uX2hvb2spOiBDaGVjayBiZmRfYWxsb2MuCi0JKGJmZF9zZWN0aW9uX2Zyb21fcGhkcik6IERpdHRvLgotCSh3cml0ZV9yZWxvY3MpOiBEaXR0by4gIEZJWE1FIHZvaWQKLQkoZWxmX21hcF9zeW1ib2xzIGFzc2lnbl9zZWN0aW9uX251bWJlcnMgbWFwX3Byb2dyYW1fc2VnbWVudHMpOgotCURpdHRvLiAgUmV0dXJuIGEgYm9vbGVhbi4gCi0JKHN3YXBfb3V0X3N5bXMpOiBEaXR0by4gIENoZWNrIGVsZl9tYXBfc3ltYm9scy4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGVsZl9zbHVycF9yZWxvY2FfdGFibGUpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGVsZl9zbHVycF9yZWxvY190YWJsZSk6IERpdHRvLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hlY2sgYXNzaWduX3NlY3Rpb25fbnVtYmVycy4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2V4Y2VwdF9yZWxvY3MpOiBSZXR1cm4gYSBib29sZWFuLgotCUNoZWNrIG1hcF9wcm9ncmFtX3NlZ21lbnRzLgotCShlbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQ2hlY2sgaXQuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfZmluYWxfbGluayk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2JyYW5jaF9yZWxvYyk6IENoZWNrIGJmZF96bWFsbG9jIGFuZAotCXJlYWxsb2MuIAotCShocHBhX2VsZl9zdHViX3JlbG9jKTogRGl0dG8uCi0JKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogQ2hlY2sgYmZkX3phbGxvYy4KLQkoaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6IERpdHRvLgotCShlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBEaXR0by4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogQ2hlY2sgYmZkX2FsbG9jLiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQ2hlY2sgaXQuCi0JKGVjb2ZmX3NsdXJwX2FybWFwKTogQ2hlY2sgYmZkX2FsbG9jLgotCShlY29mZl93cml0ZV9hcm1hcCk6IENoZWNrIGJmZF96YWxsb2MuCi0JKGVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKTogQ2hlY2sgYmZkX2hhc2hfYWxsb2NhdGUgYW5kCi0JX2JmZF9saW5rX2hhc2hfbmV3ZnVuYy4gCi0JKGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyk6IENoZWNrIGJmZF9hbGxvYy4KLQotCSogY3Rvci5jIChiZmRfY29uc3RydWN0b3JfZW50cnkpOiBDaGVjayBiZmRfYWxsb2MuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9yZWFsX29iamVjdF9wKTogQ2hlY2sgYmZkX2FsbG9jLgotCShjb2ZmX3JlbnVtYmVyX3N5bWJvbHMpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LiAgUmV0dXJuIGEgYm9vbGVhbi4KLQkoY29mZl93cml0ZV9zeW1ib2wpOiBDaGVjayBiZmRfYWxsb2MuICBGSVhNRSBpbnQKLQkoY29mZl93cml0ZV9saW5lbnVtYmVycyk6IENoZWNrIGJmZF9hbGxvYy4gIFJldHVybiBhIGJvb2xlYW4uCi0JKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBDaGVjayBiZmRfYWxsb2NfYnlfc2l6ZV90LgotCShjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IENoZWNrIGJmZF9hbGxvYy4KLQkoY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpOiBDaGVjayBiZmRfemFsbG9jLgotCSogbGliY29mZi1pbi5oOiBDaGFuZ2UgZGVjbHMgb2YgY29mZl9yZW51bWJlcl9zeW1ib2xzLAotCWNvZmZfd3JpdGVfbGluZW51bWJlcnMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbHQuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrCi0JY29mZl9yZW51bWJlcl9zeW1ib2xzLCBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzLgotCi0JKiBjb2ZmY29kZS5oOiBJbmRlbnQuCi0JKGNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvY19ieV9zaXplX3QuICBSZXR1cm4gYQotCWJvb2xlYW4uIAotCShjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IENoZWNrIGl0LgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBiZmRfYWxsb2MuCi0JKiBjb2ZmLW1pcHMuYyAobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NsdXJwX2JzZF9hcm1hcF9mMik6IENoZWNrIGJmZF9hbGxvYyB2YWx1ZS4KLQkoZG9fc2x1cnBfYnNkX2FybWFwKTogRGl0dG8uCi0JKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogQ2hlY2sgYmZkX3JlYWxsb2MgdmFsdWUuCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBDaGVjayBiZmRfYWxsb2MKLQlyZXR1cm4gdmFsdWUuICBSZXR1cm4gYm9vbGVhbiB2YWx1ZS4KLQkoTkFNRShhb3V0LG1ha2VfZW1wdHlfc3ltYm9sKSk6IENoZWNrIGJmZF96YWxsb2MgcmV0dXJuIHZhbHVlLgotCShOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IENoZWNrIGJmX2FsbG9jIGFuZCBiZmRfemFsbG9jCi0JcmV0dXJuIHZhbHVlLgotCShhZGRfdG9fc3RyaW5ndGFiKTogRGl0dG8uICBGSVhNRSB2b2lkCi0JKGFvdXRfbGlua19oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZSByZXR1cm4gdmFsdWUuCi0JKGFvdXRfbGlua19hZGRfc3ltYm9scyk6IENoZWNrIGJmZF9hbGxvYyB2YWx1ZS4KLQkodHJhbnNsYXRlX3N5bWJvbF90YWJsZSk6IENoZWNrIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MuCi0JKiBocDMwMGhwdXguYyAoTVkoc2x1cnBfc3ltYm9sX3RhYmxlKSk6IERpdHRvLgotCSogYW91dHguaCAoYW91dF9saW5rX2hhc2hfbmV3ZnVuYyk6IENoZWNrIF9iZmRfbGlua19oYXNoX25ld2Z1bmMuCi0KLQkqIG9wbmNscy5jIChiZmRfemFsbG9jIGJmZF9yZWFsbG9jKTogQ2hlY2sgcmVzdWx0IG9mIGJmZF9hbGxvYy4KLQotCSogb3BuY2xzLmMgKG9ic3RhY2tfY2h1bmtfYWxsb2MpOiBEZWZpbmUgYXMgbWFsbG9jLCBub3QKLQliZmRfeG1hbGxvY19ieV9zaXplX3QuIAotCShfYmZkX25ld19iZmQpOiBDaGVjayBvYnN0YWNrX2JlZ2luIGZvciAwIHJldHVybi4KLQotCSogaWVlZS5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQkoaWVlZV9hcmNoaXZlX3ApOiBDaGVjayBvYnN0YWNrX2JlZ2luIGZvciAwIHJldHVybiBhbmQKLQlvYnN0YWNrX2ZpbmlzaCBmb3IgTlVMTCByZXR1cm4uCi0KLQkqIGhhc2guYyAob2JzdGFja19jaHVua19hbGxvYyk6IERlZmluZSBhcyBtYWxsb2MsIG5vdAotCWJmZF94bWFsbG9jX2J5X3NpemVfdC4gCi0JKGJmZF9oYXNoX3RhYmxlX2luaXRfbik6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuIGFuZAotCW9ic3RhY2tfZmluaXNoIGZvciBOVUxMIHJldHVybi4KLQkoYmZkX2hhc2hfbG9va3VwKTogQ2hlY2sgb2JzdGFja19hbGxvYyBmb3IgTlVMTCByZXR1cm4uCi0KLQkqIGVjb2ZmbGluay5jIChvYnN0YWNrX2NodW5rX2FsbG9jKTogRGVmaW5lIGFzIG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LiAKLQliZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyKTogQ2hlY2sgb2JzdGFja19hbGxvYy4KLQkoYWRkX2ZpbGVfc2h1ZmZsZSBhZGRfbWVtb3J5X3NodWZmbGUpOiBDaGVjayBvYnN0YWNrX2FsbG9jIGZvcgotCU5VTEwgcmV0dXJuLiAgUmV0dXJuIGJvb2xlYW4sIG5vdCB2b2lkLgotCShiZmRfZWNvZmZfZGVidWdfaW5pdCk6IENoZWNrIG9ic3RhY2tfYmVnaW4gZm9yIDAgcmV0dXJuLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IENoZWNrIGFkZF9maWxlX3NodWZmbGUKLQlhbmQgYWRkX21lbW9yeV9zaHVmZmxlIHJldHVybi4gCi0JKHN0cmluZ19oYXNoX25ld2Z1bmMpOiBDaGVjayBiZmRfaGFzaF9hbGxvY2F0ZSBhbmQgYmZkX2hhc2hfbmV3ZnVuYy4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUpOiBDaGVjayBiZmRfYWxsb2MuCi0JKGVjb2ZmX2FkZF9zdHJpbmcpOiBDaGVjayBhZGRfbWVtb3J5X3NodWZmbGUgcmV0dXJuLgotCi0JKiBsaWJiZmQtaW4uaCAoeG1hbGxvYywgYmZkX3htYWxsb2MsIGJmZF94bWFsbG9jX2J5X3NpemVfdCk6Ci0JUmVtb3ZlIGRlY2xzLiAKLQkqIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi1GcmkgRmViIDExIDE1OjM1OjMyIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiAgQWRkIEx5bngvcnM2MDAwIHN1cHBvcnQuCi0JKiBjb25maWcvaTM4Ni1ubG0ubXQ6ICBFbmFibGUgYS5vdXQgZmlsZSBzdXBwb3J0LgotCSogY29uZmlnL3JzNjAwMGx5bngubWg6ICBMeW54L3JzNjAwMCBob3N0IHN1cHBvcnQuCi0KLUZyaSBGZWIgMTEgMTc6MjU6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmNoaXZlLmMgKGNvbXB1dGVfYW5kX3dyaXRlX2FybWFwKTogUmV3cml0ZSBzb21ld2hhdCB0byBpbXByb3ZlCi0JbWVtb3J5IHVzYWdlLgotCi1GcmkgRmViIDExIDEzOjEwOjQyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gJ1xuJyBpbiBhcmNoaXZlIG1hZ2ljCi0JdG8gJ1wwMTInLCBmb3IgZ3JlYXRlciBwb3J0YWJpbGl0eS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3dyaXRlX2FybWFwKTogRGl0dG8uCi0KLVRodSBGZWIgMTAgMTI6NTg6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sKTogQ2hlY2sgc3RyaXAgc2V0dGluZ3MgdG8KLQlzZWUgd2hldGhlciBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4KLQkqIGdlbmxpbmsuaCAoc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvKTogQWRkZWQgaW5mbwotCWZpZWxkLgotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19maW5hbF9saW5rKTogSW5pdGlhbGl6ZSB3Z2luZm8uaW5mby4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IENoZWNrIHN0cmlwIHNldHRpbmdzIHRvCi0Jc2VlIHdoZXRoZXIgc3ltYm9sIHNob3VsZCBiZSBvdXRwdXQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBJbml0aWFsaXplIHdnaW5mby5pbmZvLgotCi1XZWQgRmViICA5IDIxOjM0OjU4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoc29tX3JlbG9jX3F1ZXVlX2ZpbmQpOiBEbyBub3QgZXhhbWluZSBhIE5VTEwgcXVldWUgZW50cnkuCi0KLQkqIHNvbS5jOiBDYXN0IHJldHVybiB2YWx1ZXMgZnJvbSBCRkQgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdG8KLQlhdm9pZCB3YXJuaW5ncyBmcm9tIHRoZSBIUCBjb21waWxlci4KLQotV2VkIEZlYiAgOSAxMjo1NTowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEFjY2VwdCBhIExJVEVSQUwKLQlyZWxvYyBvbiBhbiAibGRsIiBpbnN0cnVjdGlvbiB0b28uCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0pOiBDYXN0IHN0YXR1cyBlbGVtZW50cwotCXdoZW4gcGFzc2luZyB0aGVtIHRvIHNwcmludGYuICBVc2UgJWxkIGluc3RlYWQgb2YgJWQuCi0KLQkqIGNvZmYtcnM2MDAwLmMgKHJzNjAwMGNvZmZfbWthcmNoaXZlKTogUmV0dXJuIGZhbHNlLgotCShyczYwMDBfY29mZl9zbmFyZl9hcl9oZHIpOiBEb24ndCBkZWNsYXJlIGVycm5vOyBpdCdzIG5vdCB1c2VkLgotCUFsc28gcmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgbmFtZWxlbi4KLQkocnM2MDAwY29mZl93cml0ZV9hcm1hcCk6IERlY2xhcmUgb3JsX2NvdW50IGFuZCBzdHJpZHggcGFyYW1ldGVycy4KLQotVHVlIEZlYiAgOCAxODowMDozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oICh4bWFsbG9jKTogRG9uJ3QgZGVjbGFyZSBwYXJhbWV0ZXIgdHlwZSwgdG8gYXZvaWQKLQljb25mbGljdHMuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVHVlIEZlYiAgOCAxNTo1NTo1MCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb2ZmLWFscGhhLmMgKHJlbG9jX25pbCk6IE5ldyBmdW5jdGlvbi4KLQkoYWxwaGFfaG93dG9fdGFibGUpOiBVc2UgaXQgYXMgc3BlY2lhbF9mdW5jdGlvbiB0byBwcmV2ZW50IGNlcnRhaW4KLQlyZWxvY3MgZnJvbSBiZWluZyBhZGp1c3RlZCBieSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSUdOT1JFCi0JcmVsb2Mgc2hvdWxkIGJlIHBhcnRpYWxfaW5wbGFjZS4KLQkoYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogQWNjZXB0IGEgTElURVJBTAotCXJlbG9jIG9uIGFuICJsZGwiIGluc3RydWN0aW9uIHRvby4KLQotVHVlIEZlYiAgOCAwMDozMjoyOCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZjMyLWhwcGEuYyAoQ1VSUkVOVF9TVFVCX09GRlNFVCwgaHBwYV9lbGZfYnVpbGRfYXJnX3JlbG9jX3N0dWIsCi0JaHBwYV9lbGZfYnVpbGRfbG9uZ19icmFuY2hfc3R1Yik6ICBDYXN0IHRvIGNoYXIgKiBpbnN0ZWFkIG9mIGludAotCWJlZm9yZSBwZXJmb3JtaW5nIHBvaW50ZXIgYXJpdGhtZXRpYy4KLQotTW9uIEZlYiAgNyAyMDo1NjoyNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnLmJmZCAoaHBwYSotKi1vc2YqKTogVXNlIGJmZF9uYW1lIGhwcGFvc2YgZm9yIHRoaXMKLQljb25maWd1cmF0aW9uLgotCShocHBhKi0qLSplbGYqKTogVGhpcyBjb25maWd1cmF0aW9uIHVzZWQgaHBwYS1lbGYgbm93LgotCi0JKiBzb20uYzogVGhpcyBmaWxlIGlzIGFsc28gdXNlZCBmb3IgSE9TVF9IUFBBT1NGLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfdmVjdG9yKTogRW5hYmxlIHNvbV92ZWMgZm9yIEhPU1RfSFBQQU9TRi4KLQotCSogaG9zdHMvaHBwYW9zZi5oOiBOZXcgaG9zdCBjb25maWd1cmF0aW9uIGZpbGUuCi0KLQkqIGNvbmZpZy9ocHBhYnNkLm10IChTRUxFQ1RfVkVDUyk6IEFkZCBiZmRfZWxmMzJfaHBwYV92ZWMgYXMKLQlCU0QgaGFuZGxlcyBib3RoIFNPTSBhbmQgRUxGIG9iamVjdCBmaWxlcy4KLQotCSogY29uZmlnL2hwcGFvc2YubWggKEhERUZJTkVTKTogRGVsZXRlLiAgTm8gbG9uZ2VyIG5lZWRlZC4KLQkoUkFOTElCKTogRG9lc24ndCBkbyBhbnl0aGluZywgZGVmaW5lIGl0IHRvIGJlICJlY2hvIi4KLQotCSogY29uZmlnL2hwcGFvc2YubXQ6IE5ldyB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIGEgUEEgcnVubmluZwotCU9TRjEuCi0KLU1vbiBGZWIgIDcgMTU6MDI6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmNodXJlcy5jIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGRlZCBiZmRfYXJjaF9wb3dlcnBjLgotCShhcmNodXJlc19pbml0X3RhYmxlKTogSWYgU0VMRUNUX0FSQ0hJVEVDVFVSRVMgaXMgbm90IGRlZmluZWQsCi0JYWRkZWQgYmZkX3Bvd2VycGNfYXJjaC4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNwdS1wb3dlcnBjLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUywgQ0ZJTEVTKTogQWRkZWQgY3B1LXBvd2VycGMuYy4KLQlSZWJ1aWx0IGRlcGVuZGVuY2llcy4KLQotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBHZXQgdm1hIGFuZCBhbGlnbm1lbnRfcG93ZXIKLQlvZiBhbiBTSFRfU1RSVEFCIHNlY3Rpb24gZnJvbSBzaF9hZGRyIGFuZCBzaF9hZGRyYWxpZ24sIHJhdGhlcgotCXRoYW4ganVzdCBzZXR0aW5nIHRoZW0gdG8gemVyby4KLQotU3VuIEZlYiAgNiAyMDowNDoxMCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGVsZmNvZGUuaCAocHJlcF9oZWFkZXJzLCBzd2FwX291dF9zeW1zKTogQ2hlY2sgZm9yIE5VTEwgcmV0dXJuCi0JZnJvbSBiZmRfbmV3X3N0cnRhYi4gCi0JKGVsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBDaGVjayBmb3IgZmFsc2UgcmV0dXJuIGZyb20KLQlzd2FwX291dF9zeW1zLiAKLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IENoZWNrIGZvciBOVUxMIHJldHVybgotCWZyb20gYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cy4KLQotCSogc3ltcy5jOiBNYWtlIGV4YW1wbGUgYXBwbGljYXRpb24gaW4gZG9jIGNhbGwgeG1hbGxvYywgbm90Ci0JYmZkX3htYWxsb2MuIAotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSwKLQlhb3V0X2xpbmtfZ2V0X3N5bWJvbHMsIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKSk6Ci0JKiBib3V0LmMgKGJfb3V0X3NsdXJwX3JlbG9jX3RhYmxlLCBiX291dF9zcXVpcnRfb3V0X3JlbG9jcyk6Ci0JKiBlY29mZi5jIChlY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IAotCSogZWNvZmZsaW5rLmMgKGJmZF9lY29mZl9kZWJ1Z19pbml0KTogCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiAKLQkoX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmspOiAKLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogCi0JKGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2J1aWxkX2FyZ19yZWxvY19zdHViKTogCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiAKLQkqIGVsZmNvZGUuaCAoYmZkX25ld19zdHJ0YWIpOiAKLQkoYmZkX2FkZF8yX3RvX3N0cnRhYik6IAotCShlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogCi0JKGVsZl9jb3JlZmlsZV9ub3RlKTogCi0JKiBsaWJiZmQuYyAoYmZkX3ptYWxsb2MpOiAKLQlVc2UgbWFsbG9jIGFuZCBjaGVjayB0aGUgcmVzdWx0LCBpbnN0ZWFkIG9mIGJmZF94bWFsbG9jLgotCi1TYXQgRmViICA1IDEyOjM5OjI4IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBQdXQgbTY4Ki0qLXN5c3YqIGxpbmUgYWZ0ZXIgbTY4Ki0qLXN5c3Y0Ki4KLQotU2F0IEZlYiAgNSAwNTozMjo0NCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNyZWMuYyAoc3JlY193cml0ZV9yZWNvcmQpOiAgUHV0IENPTlNUIGtleXdvcmQgZm9yICJzcmMiIGJlZm9yZQotCSJ1bnNpZ25lZCIsIHNvbWUgY29tcGlsZXJzIGRvbid0IGxpa2UgaXQgYWZ0ZXIgInVuc2lnbmVkIi4KLQkqIGxpYmNvZmYuaCwgbGliY29mZi1pbi5oIChiZmRfcGVyZm9ybV9zbGlwKTogIFJlbmFtZSAidmFsdWUiIHRvCi0JInZhbCIgaW4gcHJvdG90eXBlIGRlY2xhcmF0aW9uIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgZG9uJ3QgbGlrZQotCWFyZ3VtZW50cyB3aG9zZSBuYW1lcyBhcmUgdGhlIHNhbWUgYXMgdHlwZXMuCi0KLVNhdCBGZWIgIDUgMDE6MTQ6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IENvcnJlY3QgdGVzdCBmb3Igd2hldGhlcgotCW9iamVjdCBmaWxlIGRlZmluZXMgc3ltYm9sLiAgQWxzbywgaWYgc2tpcHBpbmcgYSBzeW1ib2wsIHNraXAgdGhlCi0Jc2Vjb25kIHN5bWJvbCBvZiBhIE5fV0FSTklORyBvciBOX0lORFIgc3ltYm9sIGFzIHdlbGwuCi0KLUZyaSBGZWIgIDQgMjM6NTU6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkIGJhc2ljIHN1cHBvcnQgZm9yIHdyaXRpbmcgUlMvNjAwMCBYQ09GRiBmaWxlcy4KLQkqIGNvZmYtcnM2MDAwLmMgKGR1bW15X3JlbG9jKTogUmVtb3ZlZC4KLQkocnM2MDAwY29mZl9ob3d0b190YWJsZSk6IERlZmluZWQgWENPRkYgcmVsb2NzLgotCShSVFlQRTJIT1dUTyk6IERlZmluZWQgdG8gdXNlIHJzNjAwMGNvZmZfcnR5cGUyaG93dG8uCi0JKHJzNjAwMGNvZmZfcnR5cGUyaG93dG8pOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGVmaW5lZCB0byB1c2UKLQlyczYwMDBjb2ZmX3JlbG9jX3R5cGVfbG9va3VwLiAKLQkocnM2MDAwY29mZl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoU0VMRUNUX1JFTE9DKTogRGVmaW5lZCB0byBzZXQgcl90eXBlIGFuZCByX3NpemUgZmllbGRzLgotCShDT0ZGX0xPTkdfRklMRU5BTUVTKTogRGVmaW5lZC4KLQkqIGNvZmZjb2RlLmggKGNvbWJpbmVkX2VudHJ5X3R5cGUpOiBDaGFuZ2VkIGZpeF90YWcgYW5kIGZpeF9lbmQKLQlmaWVsZHMgdG8gYml0ZmllbGRzLiAgQWRkZWQgZmllbGRzIGZpeF92YWx1ZSBhbmQgZml4X3Njbmxlbi4KLQkoc2VjX3RvX3N0eXBfZmxhZ3MpOiBJZiBTVFlQX0RFQlVHIGlzIGRlZmluZWQsIHVzZSBpdCByYXRoZXIgdGhhbgotCVNUWVBfSU5GTyBmb3IgdGhlIHR5cGUgb2YgYSBzZWN0aW9uIG5hbWVkIC5kZWJ1Zy4KLQkoY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzKTogRG9uJ3QgZGVmaW5lIGlmIFJTNjAwMENPRkZfQy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBSUzYwMDBDT0ZGX0MsIGRvbid0IGNhbGwKLQljb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMuCi0JKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgUlM2MDAwQ09GRl9DLCB0aGVuIGlmIHRoZSBsYXN0IGF1eAotCWVudHJ5IGhhcyB0eXBlIFNUWV9MRCBjaGFuZ2UgdGhlIHhfc2NubGVuIGludG8gYSBwb2ludGVyIHRvIGEKLQlzeW1ib2wgYW5kIHNldCBmaXhfc2NubGVuLiAgQWxzbywgZm9yIGEgQ19CU1RBVCBzeW1ib2wsIGNoYW5nZSB0aGUKLQl2YWx1ZSBpbnRvIGEgcG9pbnRlciB0byBhIHN5bWJvbCBhbmQgc2V0IGZpeF92YWx1ZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsdC4KLQkqIGNvZmZnZW4uYyAoY29mZl9tYW5nbGVfc3ltYm9scyk6IFJlaW5kZW50LiAgSWYgZml4X3ZhbHVlIGlzIHNldCwKLQlnZXQgdGhlIHN5bWJvbCBvZmZzZXQuIExpa2V3aXNlIGZvciBmaXhfc2NubGVuLgotCShzdHJpbmdfc2l6ZSk6IENoYW5nZSB0eXBlIHRvIGJmZF9zaXplX3R5cGUuCi0JKGRlYnVnX3N0cmluZ19zaXplLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb2ZmX2ZpeF9zeW1ib2xfbmFtZSk6IElmIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgcmV0dXJucyB0cnVlLAotCXdyaXRlIHRoZSBzeW1ib2wgbmFtZSBpbnRvIHRoZSAuZGVidWcgc2VjdGlvbjsgYXNzdW1lIHRoYXQgdGhlCi0Jc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgcmlnaHQgc2l6ZS4KLQkoY29mZl93cml0ZV9zeW1ib2xzKTogSW5pdGlhbGl6ZSBkZWJ1Z19zdHJpbmdfc2l6ZSB0byAwLiAgSWYKLQliZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIHJldHVybnMgdHJ1ZSwgZG9uJ3QgcHV0IHN5bWJvbCBuYW1lIGluCi0JdXN1YWwgc3RyaW5nIHRhYmxlLiAgQWZ0ZXIgd3JpdGluZyBvdXQgYWxsIHN5bWJvbHMsIGlmCi0JZGVidWdfc3RyaW5nX3NpemUgaXMgbm90IDAsIGNoZWNrIHRoYXQgaXQgbWF0Y2hlcyB0aGUgc2l6ZSBvZiB0aGUKLQkuZGVidWcgc2VjdGlvbi4KLQkoY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIpOiBDbGVhciBuZXcgZml4X3ZhbHVlIGFuZCBmaXhfc2NubGVuCi0JZmllbGRzLiAgSWYgdGhlIHN0cmluZyBvZmZzZXQgaXMgMCwgYWx3YXlzIHVzZSBhbiBlbXB0eSBzdHJpbmcgYXMKLQl0aGUgbmFtZS4KLQkoY29mZl9tYWtlX2VtcHR5X3N5bWJvbCk6IFplcm8gb3V0IHRoZSBzeW1ib2wgc3RydWN0dXJlLgotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IFdvcmsgYXJvdW5kIG9uZSBncm9zcyBoYWNrCi0Jd2l0aCBhbm90aGVyOiBhY3R1YWxseSBsb29rIGF0IHRoZSB0YXJnZXQgbmFtZSB0byBhdm9pZCB0aGUgYnJva2VuCi0JQ09GRiBjaGVjay4KLQkoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKTogQWRkIEJGRF9SRUxPQ19QUENfQjI2LAotCUJGRF9SRUxPQ19QUENfQkEyNiBhbmQgQkZEX1JFTE9DX1BQQ19UT0MxNi4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQotRnJpIEZlYiAgNCAxNzoyODozMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC5jIChiZmRfem1hbGxvYyk6IENhbGwgYmZkX3htYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuCi0JKGJmZF94bWFsbG9jLCBiZmRfeG1hbGxvY19ieV9zaXplX3QpOiBGdW5jdGlvbnMgZGVsZXRlZC4KLQkqIGxpYmJmZC1pbi5oOiBEZWZpbmUgdGhlbSBhcyBtYWNyb3MgY2FsbGluZyB4bWFsbG9jIGFuZCBkZWNsYXJlCi0JeG1hbGxvYy4gCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotVGh1IEZlYiAgMyAxNjo0OTozNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzKTogSWYgYSBzbWFsbCB1bmRlZmluZWQKLQlzeW1ib2wgaGFzIGEgdmFsdWUgaW4gdGhlIEVDT0ZGIHN5bWJvbCBidXQgbm90IGluIHRoZSBCRkQgc3ltYm9sLAotCWtlZXAgdGhlIHZhbHVlIGluIHRoZSBFQ09GRiBzeW1ib2wuICBUaGlzIGhlbHBzIGdhcy4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzLAotCV9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEb24ndCByZXF1aXJlIHRoYXQgYWxsCi0JcmVmZXJlbmNlcyB0byBhIGNvbW1vbiBzeW1ib2wgYmUgdGhlbXNlbHZlcyBjb21tb24gc3ltYm9scy4KLQotCSogYW91dHguaCAoYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uKTogSGFuZGxlIE5fVU5ERi4KLQotV2VkIEZlYiAgMiAyMDozNzoxOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbGliYmZkLmMsIGJmZC1pbi5oLCBob3N0cy9hbHBoYW9zZi5oLCBob3N0cy9zcGFyYy1sbC5oLCBhb3V0ZjEuaCwKLQlzcGFyY2x5bnguYywgTWFrZWZpbGUuaW46IENoYW5nZSBIT1NUXzY0X0JJVCB0byBCRkRfSE9TVF82NF9CSVQuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLVdlZCBGZWIgIDIgMTI6MzA6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfcmVsb2Nfb3V0KTogSWYgUlM2MDAwQ09GRl9DLCBoYW5kbGUgdHlwZQotCWFuZCBzaXplIGNvcnJlY3RseS4KLQkoY29mZl9zd2FwX2F1eF9pbik6IElmIFJTNjAwMENPRkZfQywgY2hhbmdlIHhfY3NlY3QueF9zY25sZW4gdG8KLQl4X2NzZWN0Lnhfc2NubGVuLmwgdG8gbWF0Y2ggY2hhbmdlIGluIGNvZmYvaW50ZXJuYWwuaC4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKSwgY29mZi1hbHBoYS5jCi0JKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IENoYW5nZSBjYXN0cyBvZiBhdXhfaW4gYW5kIGF1eF9vdXQKLQlmaWVsZHMgdG8gbWF0Y2ggeWVzdGVyZGF5J3MgY2hhbmdlcy4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9yZWxvY3MpOiBJZiBTRUxFQ1RfUkVMT0MgaXMgZGVmaW5lZCwgcGFzcwotCWluIHRoZSBpbnRlcm5hbF9yZWxvYyBpdHNlbGYsIG5vdCB0aGUgdHlwZS4KLQkqIGNvZmYtYXBvbGxvLmMsIGNvZmYtaDgzMDAuYywgY29mZi1oODUwMC5jLCBjb2ZmLWkzODYuYywKLQljb2ZmLW02OGsuYywgY29mZi1zaC5jLCBjb2ZmLXdlMzJrLmMsIGNvZmYtejhrLmM6IENoYW5nZWQKLQlkZWZpbml0aW9uIG9mIFNFTEVDVF9SRUxPQyBhY2NvcmRpbmdseS4KLQotVHVlIEZlYiAgMSAxMjowNTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IEFkZGVkIG5ldyBhcmd1bWVudHMgdG8KLQlfYmZkX2NvZmZfc3dhcF9hdXhfaW4gYW5kIF9iZmRfY29mZl9zd2FwX2F1eF9vdXQ6IGF1eCBpbmRleCBudW1iZXIKLQlhbmQgbnVtYmVyIG9mIGF1eCBlbnRyaWVzLgotCShiZmRfY29mZl9zd2FwX2F1eF9pbiwgYmZkX2NvZmZfc3dhcF9hdXhfb3V0KTogQ2hhbmdlZAotCWFjY29yZGluZ2x5LgotCSogbGliY29mZi5oOiBSZWJ1aWx0LgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2F1eF9pbiwgY29mZl9zd2FwX2F1eF9vdXQpOiBBY2NlcHQgbmV3Ci0JYXJndW1lbnRzLiAgSWYgUlM2MDAwQ09GRl9DLCBvbmx5IHRyZWF0IENfRVhUIGFuZCBDX0hJREVYVAotCXNwZWNpYWxseSBpZiB0aGlzIGlzIHRoZSBsYXN0IGF1eCBlbnRyeS4KLQkqIGNvZmZnZW4uYyAoY29mZl93cml0ZV9zeW1ib2wsIGNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiKTogUGFzcwotCW5ldyBhcmd1bWVudHMgdG8gc3dhcF9hdXggZnVuY3Rpb25zLgotCi1TdW4gSmFuIDMwIDE1OjE0OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdlbi1hb3V0LmMgKG1haW4pOiBTZXQgREVGQVVMVF9BUkNIIGJhc2VkIG9uIHByZXByb2Nlc3NvciBtYWNyb3MKLQkob25seSB0ZXN0aW5nIGZvciBtNjhrIGFuZCB2YXggYXQgdGhlIG1vbWVudCk7IGRvIHZlcmlmeSB0aGF0IHRoZQotCXByZXByb2Nlc3NvciBkaWRuJ3QgdHJhc2ggdGhlIGFyY2ggbmFtZSBpbnNpZGUgdGhlIHN0cmluZyB2ZXJzaW9uLgotCURvbid0IHByaW50IG91dCAicGFnZXNpemUgPSIgbGluZSB0aGF0IHByZXZlbnRzIG91dHB1dCBmcm9tCi0JY29tcGlsaW5nLiAgRGVyaXZlIEJZVEVTX0lOX1dPUkQgYW5kIEFSQ0ggdmFsdWVzIGZyb20gc2l6ZW9mCi0JcmVzdWx0cy4KLQkqIE1ha2VmaWxlLmluIChhb3V0LXBhcmFtcy5oKTogUGFzcyBnZW4tYW91dCBhIGR1bW15IHRhcmdldCBuYW1lLgotCShjaGVjaywgaW5zdGFsbGNoZWNrKTogSWRlbnRpZnkgZGlyZWN0b3J5IGluICJubyB0ZXN0c3VpdGVzIgotCW1lc3NhZ2UuCi0KLVN1biBKYW4gMzAgMTM6MjU6MjggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFdyaXRlIG91dCBjb3JyZWN0IHZhbHVlIGZvcgotCW9iamVjdCBmaWxlIHN5bWJvbC4KLQotRnJpIEphbiAyOCAxODozNDowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBob3N0cy92YXhic2QuaCAoSE9TVF9TVEFDS19FTkRfQUREUik6IFZheCBCU0QgZG9lc24ndCBkZWZpbmUKLQlLRVJOQkFTRSwgc28gaGFyZC1jb2RlIDB4ODAwMDAwMDAgaW5zdGVhZC4KLQotVGh1IEphbiAyNyAxMzo1NDowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0KTogSWYgc3ltYm9sIGlzIGNvbW1vbiwKLQlzZXQgdGhlIEJTRl9PTERfQ09NTU9OIGZsYWcuCi0KLVdlZCBKYW4gMjYgMTM6NDc6MTUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogUHV0IHRoZSBuZXcgZW50cnkgaW4gdGhlCi0JY29ycmVjdCBlbGVtZW50IG9mIG1hdGNoaW5nX3ZlY3Rvci4KLQotVHVlIEphbiAyNSAxMTo0MzoyOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc29tLmMsIHNvbS5oIChiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMsCi0JYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzKTogQ2hhbmdlIHBhcmFtZXRlcnMgZnJvbSBjaGFyCi0JdG8gaW50LiAgRm9sbG93aW5nIGEgcHJvdG90eXBlIHdpdGggYW4gb2xkLXN0eWxlIGZ1bmN0aW9uIGRlZmluaXRpb24KLQlpbiB0aGUgcHJlc2VuY2Ugb2Ygd2lkZW5lZCBwYXJhbWV0ZXJzIGlzIGEgR0NDLWlzbSBub3Qgc3VwcG9ydGVkCi0JYnkgdGhlIEhQIGNvbXBpbGVyIGluIEFOU0kgbW9kZS4KLQotVHVlIEphbiAyNSAxMTo0Njo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlbG9jLmMgKGJmZF9nZXRfcmVsb2Nfc2l6ZSk6IFNpemUgb2YgdHlwZSAtMiBpcyA0IGJ5dGVzLCBub3QgMi4KLQotCSogaHAzMDBocHV4LmMgKE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykpOiBXcml0ZSBvdXQgdGhlIHN5bWJvbHMKLQliZWZvcmUgd3JpdGluZyBvdXQgdGhlIHJlbG9jcywgc28gdGhhdCB0aGUgcmlnaHQgc3ltYm9sIGluZGljZXMKLQlhcmUgdXNlZC4KLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9ic2RfYXJtYXAsIGJmZF9zbHVycF9ic2RfYXJtYXBfZjIpOiBEbyBub3QKLQl0cnkgdG8gb3ZlcmxheSB0aGUgaW50ZXJuYWwgY2Fyc3ltcyBvbiB0aGUgZXh0ZXJuYWwgc3ltZGVmcy4gIFRoYXQKLQljYW4gbm90IHdvcmsgaWYgdGhlIHNpemUgb2YgYSBob3N0IHBvaW50ZXIgaXMgbGFyZ2VyIHRoYW4gNCBieXRlcy4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IENhc3QgcmVzdWx0IG9mCi0JYmZkX3htYWxsb2NfYnlfc2l6ZV90LgotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCk6IEF2b2lkIEFOU0kgQyBwcm90b3R5cGUuCi0KLQkqIGFyY2hpdmUuYzogUmVpbmRlbnRlZCB0byBHTlUgc3RhbmRhcmRzLgotCi1Nb24gSmFuIDI0IDE0OjQxOjIzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb3BuY2xzLmMgKF9iZmRfbmV3X2JmZCwgX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbik6IEFkZAotCSJfYmZkXyIgdG8gZnVuY3Rpb24gbmFtZXMuCi0JKiBhcmNoaXZlLmMgKF9iZmRfY3JlYXRlX2VtcHR5X2FyY2hpdmVfZWxlbWVudF9zaGVsbCksCi0JbGliYmZkLWluLmg6IENoYW5nZSBjYWxsZXJzLgotCi0JKiBsaWJiZmQuYyAoYmZkX3ptYWxsb2MpOiBSZW5hbWVkIGZyb20gemFsbG9jLgotCSogbGliYmZkLmMgKGJmZF9hZGRfdG9fc3RyaW5nX3RhYmxlKSwKLQl0cmFkLWNvcmUuYyAodHJhZF91bml4X2NvcmVfZmlsZV9wKSwKLQl0YXJnZXRzLmMgKGJmZF90YXJnZXRfbGlzdCksCi0JcHRyYWNlLWNvcmUuYyAocHRyYWNlX3VuaXhfY29yZV9maWxlX3ApLAotCW9wbmNscy5jIChuZXdfYmZkKSwgbGliYmZkLWluLmgsCi0JaWVlZS5jIChpZWVlX21ha2VfZW1wdHlfc3ltYm9sKSwKLQllbGYzMi1ocHBhLmMgKGhwcGFfZWxmX3N0dWJfYnJhbmNoX3JlbG9jKSwKLQkoaHBwYV9lbGZfc3R1Yl9yZWxvYyk6IENoYW5nZSBjYWxsZXJzLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBhcmNoaXZlLmMgKF9iZmRfbG9va19mb3JfYmZkX2luX2NhY2hlKTogQWRkICJfYmZkXyIgdG8gbmFtZS4KLQkoX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MpLCAKLQljb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyksIGxpYmJmZC1pbi5oOgotCUNoYW5nZSBjYWxsZXJzLgotCi0JKiBmb3JtYXQuYyAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKSwgbGliYmZkLWluLmgsIHRhcmdldHMuYywKLQllbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IFJlbmFtZSB0YXJnZXRfdmVjdG9yIHRvIGJmZF90YXJnZXRfdmVjdG9yCi0JYW5kIGRlZmF1bHRfdmVjdG9yIHRvIGJmZF9kZWZhdWx0X3ZlY3Rvci4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlZC4KLQotCSogZm9ybWF0LmMgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2NoZWNrX2Zvcm1hdCk6IENhbGwgaXQuCi0JKGJmZF9tYXRjaGluZ19mb3JtYXRzKTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkqIHRhcmdldHMuYzogUmVwbGFjZSB0aGUgdmVjdG9yIGFkZGVkIG9uIEphbiAyMSB3aXRoIGEgY291bnQgb2YKLQllbnRyaWVzIGluIGRlZmF1bHRfdmVjdG9yLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotTW9uIEphbiAyNCAxMjozODo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfZWNvZmZfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb24uICBTZXQgc2l6ZSBvZgotCS5wZGF0YSBzZWN0aW9uIGJhc2VkIG9uIGxubm9wdHIgZmllbGQsIG5vdCBzZWN0aW9uIGhlYWRlci4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IGJvdGhlciB0byBjaGVjayBpZiByX3N5bW5keCA+PSAwLAotCXNpbmNlIGl0IGlzIHVuc2lnbmVkLgotCShlY29mZmFscGhhX2xpdHRsZV92ZWMpOiBVc2UgYWxwaGFfZWNvZmZfb2JqZWN0X3AgcmF0aGVyIHRoYW4KLQljb2ZmX29iamVjdF9wLgotCSogZWNvZmYuYyAoZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBhbGlnbm1lbnRfcG93ZXIgZmllbGQgb2YKLQkucGRhdGEgc2VjdGlvbiB0byAzLgotCShlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBTYXZlIHRoZSBzaXplIG9mIHRoZQotCS5wZGF0YSBzZWN0aW9uIGluIHRoZSBsaW5lX2ZpbGVwb3MgZmllbGQsIGFuZCBhY3R1YWxseSBhbGlnbiB0aGUKLQkucGRhdGEgc2VjdGlvbiB0byBhbiBhbGlnbm1lbnQgcG93ZXIgb2YgNC4KLQkoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IFNldCBvdXRwdXRfaGFzX2JlZ3VuIGFmdGVyCi0JY2FsbGluZyBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBzX2xubm9wdHIgZm9yIHRoZSAucGRhdGEKLQlzZWN0aW9uIGZyb20gdGhlIGxpbmVfZmlsZXBvcyBmaWVsZC4gIFNldCB2c3RhbXAgZm9yIHRoZSBvcHRpb25hbAotCWhlYWRlciBmcm9tIHRoZSB2c3RhbXAgb2YgdGhlIHN5bWJvbGljIGhlYWRlci4KLQkoZWNvZmZfYmZkX2ZpbmFsX2xpbmspOiBTZXQgdnN0YW1wIG9mIHRoZSBzeW1ib2xpYyBoZWFkZXIgdG8gdGhlCi0JdnN0YW1wIHVzZWQgYnkgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGluIHRoZSBsaW5rLgotCi0JKiBlY29mZmxpbmsuYyAoZWNvZmZfYWxpZ25fZGVidWcpOiBBbGlnbiBSRkRzIHRvIGRlYnVnX2FsaWduLgotCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2NoZWNrX2FjaGl2ZV9lbGVtZW50KTogU2V0IFNFQ19BTExPQyBmbGFnCi0JZm9yIGEgY3JlYXRlZCBjb21tb24gc2VjdGlvbi4KLQkoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogZWxmY29kZS5oIChzd2FwX291dF9zeW1zKTogVXNlIGVsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gdG8KLQlnZXQgdGhlIGluZGV4IG9mIGEgY29tbW9uIHNlY3Rpb24sIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZwotCVNITl9DT01NT04gKE1JUFMgaGFzIG11bHRpcGxlIGNvbW1vbiBzZWN0aW9ucykuCi0KLQkqIGVsZjMyLWhwcGEuYyAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBUeXBvICg9PSBmb3IgPSkuCi0KLQkqIGJmZC9hb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQsCi0JYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogUGFzcyBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0bwotCXJlbG9jX292ZXJmbG93IGNhbGxiYWNrLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMsCi0JYWxwaGFfcmVsb2NhdF9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBMaWtld2lzZS4KLQkqIGNvZmYtaDg1MDAuYyAoZXh0cmFfY2FzZSk6IExpa2V3aXNlLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi16OGsuYyAoZXh0cmFfY2FzZSk6IExpa2V3aXNlLgotCSogZWxmMzItaHBwYS5jIChocHBhX2VsZl9zdHViX2ZpbmlzaCk6IExpa2V3aXNlLgotCSogcmVsb2MuYyAoYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLQkqIGJvdXQuYyAoY2FsbGp4X2NhbGxiYWNrLCBjYWxsal9jYWxsYmFjayk6IFVzZSBnZXRfdmFsdWUgdG8gZ2V0Ci0JdGhlIHN5bWJvbCB2YWx1ZSBhbmQgY2hlY2sgZm9yIHVuZGVmaW5lZCBzeW1ib2xzLgotCShnZXRfdmFsdWUpOiBJZiB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgbG9vayBpdCB1cCBpbiB0aGUgbGlua2VyCi0JaGFzaCB0YWJsZS4KLQkoYl9vdXRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRm9yIFBDUkVMMjQgYW5kIFBDUkVMMTMKLQl1c2UgZ2V0X3ZhbHVlIHRvIGdldCB0aGUgc3ltYm9sIHZhbHVlIGFuZCBjaGVjayBmb3IgdW5kZWZpbmVkCi0Jc3ltYm9scy4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBJZiB0aGUgc3ltYm9sIGlzCi0JdW5kZWZpbmVkLCBsb29rIGl0IHVwIGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX3N5bWJvbF90YWJsZSk6IFRoZSBzdHJpbmcgaW5kZXggMCBoYXMgYQotCXNwZWNpYWwgbWVhbmluZyBmb3Igbm9ybWFsIHN5bWJvbHMsIGJ1dCBub3QgZm9yIGR5bmFtaWMgc3ltYm9scy4KLQotU2F0IEphbiAyMiAxMjoyNjowMSAxOTk0ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyY2x5bnguYzogIFNldHVwIGFwcHJvcHJpYXRlIG1hY3JvcyB0byBlbmFibGUgY29yZSBmaWxlCi0Jc3VwcG9ydC4KLQotRnJpIEphbiAyMSAxNjoyNTozNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHRhcmdldHMuYzogQWRkIGEgdmVjdG9yIG9mIG1hdGNoaW5nIGZvcm1hdCBuYW1lcy4KLQkqIGZvcm1hdC5jIChiZmRfbWF0Y2hpbmdfZm9ybWF0cyk6IE5ldyBmdW5jdGlvbiB0byByZXR1cm4gaXQuCi0JKGJmZF9jaGVja19mb3JtYXQpOiBTZXQgaXQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi0JKiBiZmQtaW4uaDogUmVtb3ZlIGRlY2xzIG9mIGJmZF9lYyB0eXBlIGFuZCBlcnJvciBwcmludGluZyBmdW5jdGlvbnMuCi0JUmVtb3ZlIGRlY2wgb2YgdHlwZSBzeW1jbGFzczsgd2Fzbid0IHVzZWQuCi0JKiBiZmQuYzogRG9jdW1lbnQgZXJyb3IgaGFuZGxpbmcsIGluY2x1ZGluZyBjb2RlIGZyYWdtZW50cwotCWNvbnRhaW5pbmcgdGhlIGVycm9yIGRlY2xzIHRoYXQgd2VyZSBpbiBiZmQtaW4uaC4KLQlSZW1vdmUgREVGVU5zLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotRnJpIEphbiAyMSAxNDoxMToxNiAxOTk0ICBTZWFuIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvZGUuaCwgbGlibG5tLmgsIG5sbTMyLWFscGhhLmMgbmxtMzItaTM4Ni5jIG5sbTMyLXNwYXJjLmM6Ci0JVGhlIHNwYXJjIChhbmQgcG9zc2libHkgb3RoZXI/KSBOTE0gZm9ybWF0IHJlcXVpcmVzIGEgZGlmZmVyZW50Ci0Jd2F5IHRvIHdyaXRlIGV4cG9ydHMsIHNvIGFkZCBhIHdyaXRlX2V4cG9ydCBmaWVsZCB0byB0aGUgYmFja2VuZAotCWRhdGEgKGFuZCBzZXQgaXQgdG8gTlVMTCBmb3IgZXZlcnl0aGluZyBidXQgdGhlIHNwYXJjKS4KLQotRnJpIEphbiAyMSAxNDoxMToxNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3Vub3MuYyAoTVkocmVhZF9keW5hbWljX3JlbG9jcykpOiBDb21wYXJlIGluZm8tPmR5bnJlbCB3aXRoIE5VTEwsCi0Jbm90IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTC4gIGluZm8tPmR5bnJlbCBpcyBhIFBUUiwgbm90Ci0JYSBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKi4KLQotRnJpIEphbiAyMSAwOToyOTowMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5jOiBSZW1vdmUgZXJyb3Igc3RyaW5ncyBmb3IgZXJyb3JzIHJlbW92ZWQgYmVsb3cuCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyksIGJmZC1pbi5oIChiZmRfZWMpLAotCW9hc3lzLmMgKG9hc3lzX3dyaXRlX3NlY3Rpb25zKTogUmVuYW1lCi0JYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbiB0byBub25yZXByZXNlbnRhYmxlX3NlY3Rpb24uCi0JTm9uZSBvZiB0aGUgb3RoZXIgYmZkIGVycm9yIG5hbWVzIHN0YXJ0IHdpdGggImJmZF9lcnJvciIuCi0JUmVtb3ZlIGVycm9ycyBzeW1ib2xfbm90X2ZvdW5kIGFuZCBub19yZWxvY2F0aW9uX2luZm8sIHdoaWNoIHNlZW0KLQl0byBiZSB1bnVzZWQuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1GcmkgSmFuIDIxIDAxOjExOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmMgKGJmZF9nZXRfZ3Bfc2l6ZSk6IEFkZGVkIHN1cHBvcnQgZm9yIEVMRi4KLQotCSogc3ltcy5jIChCU0ZfRFlOQU1JQyk6IE5ldyBzeW1ib2wgZmxhZy4KLQkoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IFByaW50IGl0LgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogbGliYW91dC5oIChzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEpOiBOZXcgcmVhZF9keW5hbWljX3N5bWJvbHMKLQlhbmQgcmVhZF9keW5hbWljX3JlbG9jcyBmaWVsZHMuCi0JKHN0cnVjdCBhb3V0ZGF0YSk6IE5ldyBkeW5hbWljX2luZm8gZmllbGQuCi0JKG9ial9hb3V0X2R5bmFtaWNfaW5mbyk6IE5ldyBhY2Nlc3NvciBtYWNyby4KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8pOiBOZXcgc3RydWN0dXJlLgotCShzdW5vc19yZWFkX2R5bmFtaWNfaW5mbywgTVkocmVhZF9keW5hbWljX3N5bWJvbHMpLAotCU1ZKHJlYWRfZHluYW1pY19yZWxvY3MpKTogTmV3IGZ1bmN0aW9ucyB0byByZWFkIGR5bmFtaWMgc3ltYm9scwotCWFuZCByZWxvY3MuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSk6IElmIHRoZSBvYmplY3QgaXMKLQlkeW5hbWljYWxseSBsaW5rZWQsIHNldCBTRUNfUkVMT0MgZm9yIGJvdGggdGhlIC50ZXh0IGFuZCAuZGF0YQotCXNlY3Rpb25zLgotCSh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3Qgc2V0IEJTRl9MT0NBTCBmb3IgYW4KLQl1bmRlZmluZWQgc3ltYm9sLgotCSh0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKTogTmV3IGZ1bmN0aW9uLCBzcGxpdCBvdXQgb2YKLQlzbHVycF9zeW1ib2xfdGFibGU7IHNldCB0aGUgQlNGX0RZTkFNSUMgZmxhZyBhcHByb3ByaWF0ZWx5LgotCShOQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSk6IFJlYWQgZHluYW1pYyBzeW1ib2xzLCBpZiBhbnkuCi0JKE5BTUUoYW91dCxzbHVycF9yZWxvY190YWJsZSkpOiBSZWFkIGR5bmFtaWMgcmVsb2NzLCBpZiBhbnkuCi0JKE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpKTogSW5jbHVkZSBkeW5hbWljIHJlbG9jIGNvdW50IGluCi0JcmV0dXJuIHZhbHVlLgotCSogYW91dGYxLmggKE5BTUUoYW91dCxzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IERvbid0IHdyaXRlCi0Jb3V0IGR5bmFtaWMgc3ltYm9scyBvciByZWxvY3MgYWdhaW5zdCByZWxvYyBzeW1ib2xzLCBzaW5jZSB0aGV5Ci0JYXJlIGFscmVhZHkgaW4gdGhlIC50ZXh0IHNlY3Rpb24gYW5kIHdlIHdvdWxkbid0IGtub3cgd2hlcmUgdG8KLQl3cml0ZSB0aGVtIGFueWhvdy4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IEluaXRpYWxpemUgcmVhZF9keW5hbWljX3N5bWJvbHMgYW5kCi0JcmVhZF9keW5hbWljX3JlbG9jcyBmaWVsZHMuCi0JKiBhb3V0LXRhcmdldC5oIChNWShiYWNrZW5kX2RhdGEpKTogSW5pdGlhbGl6ZQotCXJlYWRfZHluYW1pY19zeW1ib2xzIGFuZCByZWFkX2R5bmFtaWNfcmVsb2NzIGZpZWxkcy4KLQotVGh1IEphbiAyMCAyMDo1NzoyNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBob3N0cy9hbHBoYW9zZi5oICh1aW50NjRlX3R5cGUsIHVpbnQ2NF90eXBlLCBpbnQ2NF90eXBlKTogRGVsZXRlCi0JdHlwZWRlZnMsIHNpbmNlIEhPU1RfNjRfQklUIHdpbGwgdGFrZSBjYXJlIG9mIGRlZmluaW5nIHRoZW0gaW4KLQliZmQuaC4KLQotV2VkIEphbiAxOSAxNzoyODo1OSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYWxwaGFvc2YubWggKEhERUZJTkVTKTogRG9uJ3QgZGVmaW5lIEhPU1RfNjRfQklUIGhlcmU7Ci0JdGhhdCdzIGRlYWx0IHdpdGggZWxzZXdoZXJlLgotCSogaG9zdHMvYWxwaGFvc2YuaCAoc3ByaW50Zl92bWEsIGZwcmludGZfdm1hKTogTmV3IG1hY3Jvcy4KLQkodWludDY0X3R5cGVISUdILCB1aW50NjRfdHlwZUxPVyk6IENvbW1lbnQgd2l0aCBIT1NUXzY0X0JJVCBzbwotCXRoZXkgZ2V0IGNvcGllZCB0byBiZmQuaC4KLQotCSogcmVsb2MuYyAoZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsKTogQWRkIHNvbWUgQWxwaGEgcmVsb2NhdGlvbgotCXR5cGVzLiAgUmVvcmdhbml6ZWQgc29tZSBvZiB0aGUgZXhpc3Rpbmcgb25lcy4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfaG93dG9fdGFibGUpOiBDb25zdHJ1Y3QgNjQtYml0IG5lZ2F0aXZlIG9uZQotCXZhbHVlcyBpbiBjYXNlIG9mIGNvbXBpbGF0aW9uIG9uIGEgMzItYml0IG1hY2hpbmUuICBGaXggcGNyZWwKLQlmaWVsZHMgb2Ygc29tZSByZWxvYyB0eXBlcy4KLQkoYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIG1vcmUgcmVsb2NhdGlvbiB0eXBlcy4KLQotCSogYmZkLWluLmggKHVpbnQ2NF90eXBlSElHSCwgdWludDY0X3R5cGVMT1cpOiBTdXBwbHkgZGVmYXVsdAotCWRlZmluaXRpb25zIHdoZW4gbm90IGRlZmluZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB1aW50NjRfdHlwZSBpcwotCWEgZGVmaW5lZCBtYWNybyBvciBub3QuCi0JKGZwcmludGZfdm1hLCBzcHJpbnRmX3ZtYSk6IERlZmluZSBvbmx5IGlmIGZwcmludGZfdm1hIGlzIG5vdAotCWFscmVhZHkgZGVmaW5lZC4KLQotV2VkIEphbiAxOSAwMDowMjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV90b19uYXRpdmVfc3ltX2ZsYWdzKTogU2V0IHRoZSB0eXBlIG9mIGEKLQlCU0ZfV0FSTklORyBzeW1ib2wgdG8gTl9XQVJOSU5HLgotCi1UdWUgSmFuIDE4IDE2OjQzOjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoYW91dF9saW5rX2FkZF9zeW1ib2xzKTogSW5jcmVtZW50IHN5bV9oYXNoIGFzIHdlbGwgYXMgcAotCWZvciBhbiBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4KLQkoYW91dF9saW5rX3dyaXRlX3N5bWJvbHMpOiBVcGRhdGUgc3ltX2hhc2ggd2l0aCB0aGUgdGFyZ2V0IG9mIGFuCi0JaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuICBJZiBhbiBpbmRpcmVjdCBzeW1ib2wgaXMgZGVmaW5lZCwKLQlvdXRwdXQgdGhlIGNhbGN1bGF0ZWQgdmFsdWUgYW5kIGRvbid0IG91dHB1dCB0aGUgdGFyZ2V0IHN5bWJvbC4KLQotVHVlIEphbiAxOCAwMzo1NDo1OSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MpOiBHaXZlIHdhcm5pbmcgc3ltYm9scwotCWFuICh1bnVzZWQpIG5vbnplcm8gc2VjdGlvbiB2YWx1ZSwgbmVlZGVkIGZvciBjaGVjayBiZWxvdy4KLQotTW9uIEphbiAxNyAxNToxMjowNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MsCi0JYW91dF9saW5rX2FkZF9zeW1ib2xzKTogVHJlYXQgTl9TRVRbQUJEVF0gfCBOX0VYVCBsaWtlCi0JTl9TRVRbQUJEVF0uCi0KLUZyaSBKYW4gMTQgMTY6NDU6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IElmIHRoZXJlIGlzIGEgU0hUX0RZTkFNSUMgc2VjdGlvbiwgc2V0Ci0JdGhlIERZTkFNSUMgZmxhZyBmb3IgdGhlIEJGRC4KLQkoTkFNRShiZmRfZWxmLHdyaXRlX29iamVjdF9jb250ZW50cykpOiBEb24ndCB0cnkgdG8gd3JpdGUgb3V0IGEKLQlCRkQgd2l0aCB0aGUgRFlOQU1JQyBmbGFnIHNldCwgc2luY2Ugd2UgZG9uJ3QgZ2VuZXJhdGUgdGhlIHByb2dyYW0KLQloZWFkZXIgdGFibGUgY29ycmVjdGx5LgotCi1GcmkgSmFuIDE0IDAxOjA0OjM2IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogIEZyZWUgeF9zeW1wIGF0IHRoZSBlbmQKLQlvZiB0aGUgZnVuY3Rpb24gdG8gYXZvaWQgc3RvcmFnZSBsZWFrLgotCi1UaHUgSmFuIDEzIDIzOjA3OjMyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCk6IEFuIGlmZCBjYW4gYmUgLTEuCi0KLVRodSBKYW4gMTMgMTI6MzM6MjcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNvbS5jIChzb21fc2V0X3JlbG9jX2luZm8pOiBQcm92aWRlIGEgZGVmYXVsdCBzeW1ib2wgZm9yCi0JcmVsb2NhdGlvbnMgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbiBhc3NvY2lhdGVkIHN5bWJvbC4KLQotCSogc29tLmMgKGhwcGFfc29tX3JlbG9jKTogQWRkIG5ldyAiZXJyb3IgbWVzc2FnZSIgYXJndW1lbnQuCi0KLVdlZCBKYW4gMTIgMTM6MzY6NDMgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JRW5hYmxlIGdkYiB0byB3cml0ZSB0byBjb3JlIGZpbGVzIG9uIG1vcmUgY29yZSBmaWxlIHJlYWRlcnMuCi0JKiBsaWJiZmQuYyAoYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMpOiAgUmVtb3ZlIHJhbmdlIGNoZWNrCi0JZm9yIHNlY3Rpb24gc2l6ZSwgaXQgaXMgYWxyZWFkeSBkb25lIGluIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cwotCXdpdGggYmZkX2dldF9zZWN0aW9uX3NpemVfbm93LgotCSogYWl4Mzg2LWNvcmUuYywgaHBwYWJzZC1jb3JlLmMsIGhwdXgtY29yZS5jLCBpcml4LWNvcmUuYywKLQlvc2YtY29yZS5jLCBwdHJhY2UtY29yZS5jLCB0cmFkLWNvcmUuYyAoKl9zZXRfc2VjdGlvbl9jb250ZW50cyk6Ci0JVXNlIGJmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIGluc3RlYWQgb2YgYmZkX2ZhbHNlLgotCi1XZWQgSmFuIDEyIDE1OjMxOjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmM6IEFkZGVkIGluaXRpYWwgZG9jdW1lbnRhdGlvbi4KLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IERvbid0IGV4cGVjdCBzcGFjZSBmb3IKLQlvdXRwdXQgcmVsb2NhdGlvbnMgaWYgdGhlcmUgYXJlbid0IGFueSBpbnB1dCByZWxvY2F0aW9ucy4KLQotVHVlIEphbiAxMSAxNDozNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IFNldCBhX2VudHJ5IGJlZm9yZSBjb21wdXRpbmcKLQlmaWxlIG9mZnNldHMuCi0KLQkqIGVsZmNvZGUuaCAoc3dhcF9vdXRfc3ltcyk6IEEgY29tbW9uIHN5bWJvbCBpcyBTVFRfT0JKRUNULCBub3QKLQlTVFRfTk9UWVBFLgotCi1UdWUgSmFuIDExIDA5OjEwOjU2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcuYmZkOiBVc2UgRUxGLCBub3QgQ09GRiBmb3IgbTg4Ki0qLWRndXgqLgotCUNvbWJpbmUgbTg4ay0qLSogYW5kIG04ODExMC0qLSogY2FzZXMgaW50byBtODgqLSotKi4KLQotVHVlIEphbiAxMSAwMDowNzoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmbGluay5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byBjb21wcmVzcyBhbmQgbWVyZ2UgZGVidWdnaW5nCi0JaW5mb3JtYXRpb24sIGFuZCB0byB3cml0ZSBzb21lIG9mIG91dCBkaXJlY3RseSByYXRoZXIgdGhhbiBzYXZpbmcKLQlpdCBpbiBtZW1vcnkuICBTZXZlcmFsIG5ldyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMsIGFuZCBuZXcKLQlhcmd1bWVudHMgdG8gZXhpc3RpbmcgZnVuY3Rpb25zLgotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyk6IENvbXB1dGUKLQlzeW1fZmlsZXBvcyBhcyB3ZWxsLgotCShlY29mZl9nZXRfZXh0cik6IFVzZSBpZmRtYXAgaW5zdGVhZCBvZiBpZmRiYXNlLgotCShlY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCBjb21wdXRlIHN5bV9maWxlcG9zIGhlcmUuCi0JT25seSBvdXRwdXQgc3ltYm9scyBpZiBvdXRzeW1ib2xzIGlzIG5vdCBOVUxMLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IEFkanVzdCBmb3IgY2hhbmdlcyBpbiBlY29mZl9kZWJ1Z19pbmZvIGFuZAotCWJmZF9lY29mZl9kZWJ1ZyBmdW5jdGlvbnMuICBXcml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGhlcmUuCi0JKGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSk6IEFkanVzdCBmb3IgY2hhbmdlcyBpbgotCWJmZF9lY29mZl9kZWJ1ZyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBVc2UgaWZkbWFwIHJhdGhlciB0aGFuIGlmZGJhc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyk6IFJlYWQgZXh0ZXJuYWwgc3ltYm9scwotCWZpcnN0LCB0byBwdXQgdGhlbSBpbiB0aGUgZmlyc3QgbWVtb3J5IGJ1ZmZlci4gIENsZWFyIGZkciBmaWVsZC4KLQkobWlwc19lbGZfZ2V0X2V4dHIpOiBVc2UgcG9pbnRlciB0byB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9sLgotCShtaXBzX2VsZl9maW5hbF9saW5rKTogQWRqdXN0IGZvciBjaGFuZ2VzIGluIGJmZF9lY29mZiBmdW5jdGlvbnMuCi0JUHJlc2VydmUgLnRleHQsIC5kYXRhIGFuZCAuYnNzIGV2ZW4gaWYgdGhleSBhcmUgZW1wdHkuICBTYXZlCi0JcG9pbnRlciB0byB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9sIHJhdGhlciB0aGFuIGNvcHlpbmcgaXQuCi0JRG9uJ3QgZnJlZSB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4KLQkqIGxpYmVsZi5oIChlbGZfc3ltYm9sX3R5cGUpOiBDaGFuZ2UgbWlwc19leHRyIHRvIFBUUi4KLQkqIGJmZC1pbi5oIChiZmRfZWNvZmZfZGVidWdfaW5pdCwgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUpOiBEZWNsYXJlLgotCShiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGVfb3RoZXIpOiBSZW5hbWUgZGVjbGFyYXRpb24gZnJvbQotCWJmZF9lY29mZl9kZWJ1Z19saW5rX290aGVyIGFuZCB1cGRhdGUuCi0JKGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1Zyk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0KLU1vbiBKYW4gMTAgMjA6NDY6NTMgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVtb3ZlICJAIiB3aGljaCBmb2xsb3dzIGEgYmFja3NsYXNoLiAgSW4KLQl0aGlzIHBvc2l0aW9uIGl0IGp1c3QgY2F1c2VzIGVycm9ycywgbm90IHN1cHByZXNzZXMgZWNob2VzLgotCi1Nb24gSmFuIDEwIDA5OjA2OjIxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBGaXggaGFuZGxpbmcgb2YgTFQgYW5kIFJUCi0JZmllbGQgc2VsZWN0b3JzLgotCi1TdW4gSmFuICA5IDA0OjMyOjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaTM4Ni1uZXRic2QubXQgKFNFTEVDVF9WRUNTKTogSW5jbHVkZSBpMzg2YnNkX3ZlYy4KLQotRnJpIEphbiAgNyAxMDoyNzoyNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFvdXR4LmggKGFkanVzdF96X21hZ2ljKTogRG9uJ3QgbWVyZ2UgdGhlIHN0YXJ0IG9mIGJzcyB3aXRoIHRoZQotCWVuZCBvZiBkYXRhIGlmIHRoZXkgYXJlIG5vdCBjb250aWd1b3VzLgotCi0JKiBhb3V0ZjEuaCAoc3Vub3M0X2FvdXRfYmFja2VuZCk6IENvbW1lbnQgdGhlIGZpZWxkcycgbWVhbmluZ3MuCi0KLUZyaSBKYW4gIDcgMTU6NDA6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9ta29iamVjdF9ob29rKTogRG9uJ3Qgc2V0IFNFQ19TSEFSRURfTElCUkFSWSBmbGFnCi0JZm9yIC5yZWdpbmZvIHNlY3Rpb24gaGVyZS4KLQkoZWNvZmZfbmV3X3NlY3Rpb25faG9vayk6IFNldCBpdCBoZXJlIGluc3RlYWQuCi0KLUZyaSBKYW4gIDcgMTA6Mjk6MjcgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0gICAgCSogYmZkLWluLmg6IChiZmRfYm9vbGVhbik6IEFkZCB3b3JrYXJvdW5kIGZvciBzeXN0ZW1zIHRoYXQgYWxzbwotCWRlZmluZSB0cnVlIGFuZCBmYWxzZSBhcyBlbnVtcy4KLQkoQUxNT1NUX1NUREMpOiBBZGQgYXMgYWx0ZXJuYXRpdmUgdG8gX19TVERDX18uCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBzeW1zLmMgKGJmZF9wcmludF9zeW1ib2xfdmFuZGYpOiBDb252ZXJ0IGEgUFRSIHRvIEZJTEUqLgotCi1UaHUgSmFuICA2IDE0OjI0OjQ0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAodHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MpOiBDYXRjaCB0aGUgY2FzZSB3aGVyZQotCXRoZXJlIGlzIG5vIG91dHB1dCBzZWN0aW9uLgotCi1UaHUgSmFuICA2IDE0OjM3OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29kZS5oIChubG1fb2JqZWN0X3ApOiBJZiB3ZSBjYW4ndCByZWFkIHRoZSBmaXhlZCBoZWFkZXIsCi0JY291bnQgaXQgYXMgYSB3cm9uZyBmb3JtYXQgZXJyb3IsIG5vdCBhIHN5c3RlbSBjYWxsIGVycm9yLCBzaW5jZQotCXRoZSBvYmplY3QgZmlsZSBtaWdodCBzaW1wbHkgYmUgdG9vIHNtYWxsLgotCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBBZGRlZCBubG0zMl9hbHBoYV92ZWMgaW5zaWRlICNpZmRlZgotCUJGRDY0LgotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIG5sbTMyLWFscGhhLm8uCi0JKEJGRDY0X0JBQ0tFTkRTKTogQWRkIG5sbTMyLWFscGhhLm8uICBJdCBkZXBlbmRzIG9uIDY0IGJpdAotCXN1cHBvcnQsIGV2ZW4gdGhvdWdoIGl0IGlzIGZvciBhbiBBbHBoYSBpbiAzMiBiaXQgbW9kZS4KLQkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfYWxwaGFfdmVjKTogU2V0IHRhcmdldDY0IHRvIHRydWUuCi0KLQkqIG5sbTMyLWdlbi5jLCBubG02NC1nZW4uYzogUmVtb3ZlZC4gIEFsbCBubG0gdGFyZ2V0cyBhcmUKLQlkaWZmZXJlbnQsIHNvIHRoZXJlIGlzIG5vIHBvaW50IHRvIHByb3ZpZGluZyBhIGdlbmVyaWMgb25lLgotCSogbGlibmxtLmg6IERvbid0IGJvdGhlciB0byBjaGVjayBmb3IgbmxtX2JhY2tlbmQoYmZkKSBiZWluZyBOVUxMCi0JaW4gdGhlIGJhY2tlbmQgYWNjZXNzb3IgbWFjcm9zOyB0aGF0IHNob3VsZCBubyBsb25nZXIgYmUgcG9zc2libGUuCi0JKiB0YXJnZXRzLmMgKHRhcmdldF92ZWN0b3IpOiBSZW1vdmVkIG5sbTMyX2JpZ19nZW5lcmljX3ZlYywKLQlubG02NF9iaWdfZ2VuZXJpY192ZWMsIG5sbTY0X2xpdHRsZV9nZW5lcmljX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAobmxtMzJfYmlnX2dlbmVyaWNfdmVjLCBubG0zMl9saXR0bGVfZ2VuZXJpY192ZWMsCi0JbmxtNjRfYmlnX2dlbmVyaWNfdmVjLCBubG02NF9saXR0bGVfZ2VuZXJpY192ZWMpOiBSZW1vdmVkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLCBhbmQKLQkoQkZEMzJfQkFDS0VORFMpOiBSZW1vdmVkIG5sbTMyLWdlbi5vLgotCShCRkQ2NF9CQUNLRU5EUyk6IFJlbW92ZWQgbmxtNjQtZ2VuLm8uCi0JKENGSUxFUyk6IFJlbW92ZWQgbmxtMzItZ2VuLmMgYW5kIG5sbTY0LWdlbi5jLgotCi0JKiBocDMwMGhwdXguYyAoQVJDSF9TSVpFKTogRGVmaW5lIGJlZm9yZSBpbmNsdWRpbmcgYW91dHguaC4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogQWRkIGNvbnN0cnVjdG9yIGFuZAotCWJpdHNpemUgYXJndW1lbnRzLiAgQ2hhbmdlZCBhbGwgY2FsbGVycyAoYW91dHguaCkuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wpOiBBZGQgY29uc3RydWN0b3IKLQlhbmQgYml0c2l6ZSBhcmd1bWVudHMgdG8gZGVjbGFyYXRpb24uCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogZWNvZmYuYzogRmlyc3QgY3V0IGF0IG5ldyBzdHlsZSBvZiBsaW5rZXIgYmFja2VuZCBmb3IKLQlFQ09GRi0tYWRkZWQgYSBidW5jaCBvZiBmdW5jdGlvbnMuICBBbHNvOgotCShlY29mZl9zZWNfdG9fc3R5cF9mbGFncyk6IFNldCBmbGFncyBmb3IgLnBkYXRhIGFuZCAueGRhdGEuCi0JKGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlcik6IE5ldyBmdW5jdGlvbi4KLQkoZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbyk6IENhbGwgZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyLgotCShlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zKTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEdldCBvdXQgcXVpY2tseSBpZiBjb3VudCBpcyB6ZXJvLgotCUNoZWNrIGVycm9ycyBiZXR0ZXIuCi0JKGVjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFB1dCAueGRhdGEgc2VjdGlvbiBpbiBkYXRhIHNlZ21lbnQuCi0JQ2FsbCBlY29mZl9jb21wdXRlX3JlbG9jX2ZpbGVfcG9zaXRpb25zLiAgRG9uJ3Qgb3V0cHV0IHJlbG9jcyBvcgotCWV4dGVybmFsIHN5bWJvbHMgaWYgb3V0c3ltYm9scyBpcyBOVUxMLgotCShlY29mZl9iZmRfZmluYWxfbGluayk6IENvbXBsZXRlbHkgcmV3cml0dGVuLgotCSogbGliZWNvZmYuaDogSW5jbHVkZSBiZmRsaW5rLmguCi0JKHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgcmVsb2NhdGVfc2VjdGlvbiBmaWVsZC4KLQkoZWNvZmZfZGF0YV90eXBlKTogQWRkIHN5bV9oYXNoZXMgYW5kIHN5bW5keF90b19zZWN0aW9uIGZpZWxkcy4KLQkoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEZWNsYXJlIGFzIGZ1bmN0aW9uLCBub3QgbWFjcm8uCi0JKGVjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKiBlY29mZmxpbmsuYyAoYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyk6IENhbGwgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbC4KLQkqIGJmZC1pbi5oIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsdC4KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfaG93dG9fdGFibGUpOiBNYXJrIEJSQUREUiBhcwotCXBhcnRpYWxfaW5wbGFjZSwgYW5kIHNldCB0aGUgc3JjX21hc2sgdG8gMHgxZmZmZmYuCi0JKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFJlbW92ZSB1bnVzZWQKLQl2YXJpYWJsZSBncF93YXJuZWQuCi0JKGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhKTogSW5pdGlhbGl6ZSByZWxvY2F0ZV9zZWN0aW9uIGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfcmVsb2NhdGVfcmVmaGkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgcmVsb2NhdGVfc2VjdGlvbiBmaWVsZC4KLQotCSogcmVsb2MuYyAoX2JmZF9yZWxvY2F0ZV9jb250ZW50cyk6IENvcnJlY3RlZCBzaWduZWQgb3ZlcmZsb3cKLQljaGVja2luZyB3aGVuIHRoZXJlIGlzIGFuIGFkZGVuZC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmFsX2xpbmspKTogRG9uJ3QgYWJvcnQgd2hlbiB0cnlpbmcgdG8gbGluawotCWEgbm9uIGEub3V0IGZpbGUsIGp1c3QgcGFzcyBpdCB0byBfYmZkX2RlZmF1bHRfbGlua19vcmRlci4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkKTogV2hlbiBkb2luZyBhIGZpbmFsIFBDIHJlbGF0aXZlIGxpbmsKLQlhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIHN1YnRyYWN0IHRoZSBWTUEgb2YgdGhlIGlucHV0IHNlY3Rpb24uCi0JKGFvdXRfbGlua19pbnB1dF9zZWN0aW9uX2V4dCk6IExpa2V3aXNlLgotCi0JKiBsaW5rZXIuYyAoZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyKTogUmVuYW1lZCBmcm9tCi0JX2JmZF9nZW5lcmljX2luZGlyZWN0X2xpbmtfb3JkZXIgYW5kIG1hZGUgc3RhdGljLgotCShfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IERvbid0IHN3aXRjaCBvbiBsaW5rX29yZGVyIHR5cGUsIGp1c3QKLQljYWxsIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyLgotCShfYmZkX2RlZmF1bHRfbGlua19vcmRlcik6IEhhbmRsZSBiZmRfaW5kaXJlY3RfbGlua19vcmRlciB0eXBlLgotCSogZ2VubGluay5oOiBSZW1vdmVkIGRlY2xhcmF0aW9uIG9mCi0JX2JmZF9nZW5lcmljX2luZGlyZWN0X2xpbmtfb3JkZXIuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX2xpbmspOiBEb24ndCBzd2l0Y2ggb24gbGlua19vcmRlcgotCXR5cGUsIGp1c3QgY2FsbCBfYmZkX2RlZmF1bHRfbGlua19vcmRlci4KLQotVHVlIEphbiAgNCAyMToyMzozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50KTogQmFzZSB0aGUgbmFtZSBvZgotCXRoZSBjcmVhdGVkIGNvbW1vbiBzZWN0aW9uIG9uIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIHRoZSBzeW1ib2wKLQljYW1lIGZyb20uCi0JKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogKGNhc2UgQklHKTogQSBjb21tb24gc3ltYm9sCi0JbXVzdCBoYXZlIGEgc2VjdGlvbiwgc28gZG9uJ3QgYm90aGVyIHRvIGNyZWF0ZSBvbmUuCi0KLU1vbiBKYW4gIDMgMTU6MzI6MTYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0LXRhcmdldC5oIChNWSh2ZWMpKTogQWRkIERZTkFNSUMgdG8gbWFzayBvZiBvYmplY3QgZmxhZ3MuCi0JKiBhb3V0ZjEuaCAoTkFNRShhb3V0LHN1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMpKToKLQlJZiB0aGUgRFlOQU1JQyBmbGFnIGlzIHNldCwgc2V0IGl0IGluIHRoZSBleGVjIGhlYWRlci4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogSWYgdGhlIG9iamVjdCBpcwotCWR5bmFtaWNhbGx5IGxpbmtlZCwgc2V0IHRoZSBEWU5BTUlDIGZsYWcgaW4gdGhlIEJGRC4KLQkqIGxpYmFvdXQuaCAoTl9TRVRfRFlOQU1JQyk6IE5ldyBtYWNyby4KLQkoTl9EWU5BTUlDKTogQWRkIG1pc3NpbmcgMCBpbiBtYXNrLgotCi1Nb24gSmFuICAzIDExOjQxOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZ2V0X2V4dHIpOiBEb24ndCBvdXRwdXQgc2VjdGlvbiBzeW1ib2xzIGFzCi0JZXh0ZXJuYWwgc3ltYm9scy4KLQotCSogYmZkLWluLmgsIGhhc2guYzogQ2hhbmdlIGJmZF9oYXNoX2FsbG9jYXRlIGFyZ3VtZW50IGZyb20gc2l6ZV90Ci0JdG8gdW5zaWduZWQgaW50LCBiZWNhdXNlIHNpemVfdCBtYXkgbm90IGJlIGRlZmluZWQgaW4gYmZkLmguCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0KLQkqIGJmZC1pbi5oIChiZmRfZ2V0e2IsbH1bX3NpZ25lZF9dezE2LDMyLDY0fSk6IERlY2xhcmUgYXJndW1lbnQgdG8KLQliZSBhIGNvbnN0IHBvaW50ZXIuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbHQuCi0JKiBsaWJiZmQuYyAoYmZkX2dldHtiLGx9W19zaWduZWRfXXsxNiwzMiw2NH0pOiBEZWNsYXJlIGFyZ3VtZW50IHRvCi0JYmUgYSBjb25zdCBwb2ludGVyLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0KTogQ2hhbmdlIHN3YXAgZnVuY3Rpb24gcG9pbnRlcnMKLQlhY2NvcmRpbmdseS4KLQkqIGFyY2hpdmUuYyAoZG9fc2x1cnBfY29mZl9hcm1hcCk6IENoYW5nZSBzd2FwIGFjY29yZGluZ2x5LgotCSogYWl4Mzg2LWNvcmUuYzogQ2hhbmdlIE5PX0dFVCBhbmQgTk9fR0VUUyBhY2NvcmRpbmdseS4KLQkqIGhwcGFic2QtY29yZS5jLCBocHV4LWNvcmUuYywgaXJpeC1jb3JlLmMsIG9zZi1jb3JlLmMsCi0JcHRyYWNlLWNvcmUuYywgdHJhZC1jb3JlLmM6IENoYW5nZSBOT19HRVQgYW5kIE5PX1NJR05FRF9HRVQKLQlhY2NvcmRpbmdseS4KLQotCSogbGliYmZkLWluLmggKHN0cnVjdCBhcnRkYXRhKTogQWRkZWQgdGRhdGEgZmllbGQuCi0JKF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlKTogRGVjbGFyZS4KLQkoX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBEZWNsYXJlLgotCShfYmZkX3NuYXJmX2FyX2hkcik6IFJlbmFtZWQgZnJvbSBzbmFyZl9hcl9oZHIuCi0JKiBsaWJiZmQuaDogUmVidWlsdC4KLQkqIGFyY2hpdmUuYzogQ2xlYW5lZCB1cCBzb21lIG1vcmUuCi0JKF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9nZW5lcmljX2FyY2hpdmVfcCk6IEluaXRpYWxpemUKLQlwb2ludGVyIGVsZW1lbnRzIG9mIGFydGRhdGEuCi0JKF9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlKTogUmVuYW1lZCBmcm9tIGFkZF9iZmRfdG9fY2FjaGUuCi0JKF9iZmRfc25hcmZfYXJfaGRyKTogUmVuYW1lZCBmcm9tIHNuYXJmX2FyX2hkci4KLQkoX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBSZW5hbWVkIGZyb20gZ2V0X2VsdF9hdF9maWxlcG9zLgotCShnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUsIGJmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSwKLQliZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSwgY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXApOiBNYWRlIHN0YXRpYy4KLQkqIGVjb2ZmLmM6IFNvbWUgY29tbWVudCBjaGFuZ2VzLgotCShlY29mZl9zbHVycF9hcm1hcCk6IEhhbmRsZSByZW5hbWUgb2Ygc25hcmZfYXJfaGRyLiAgU2V0Ci0JYXJkYXRhLT50ZGF0YSB0byByYXdfYXJtYXAuCi0JKGVjb2ZmX2FyY2hpdmVfcCk6IEluaXRpYWxpemUgcG9pbnRlciBlbGVtZW50cyBvZiBhcnRkYXRhLgotCSogY29mZi1yczYwMDAuYyAocnM2MDAwY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MpOiBIYW5kbGUgcmVuYW1lIG9mCi0JYWRkX2JmZF90b19jYWNoZS4KLQotCSogaGFzaC5jOiBBZGRlZCBzb21lIGRvY3VtZW50YXRpb24uCi0KLU1vbiBKYW4gIDMgMTE6MDk6MjggMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtdGFyZ2V0LmgsIG5ldGJzZDM4Ni5jOiBSZXBsYWNlIE5PX1NXQVBfTUFHSUMgd2l0aCBTV0FQX01BR0lDLAotCWFuZCBkbyB0aGUgc3dhcHBpbmcgaGVyZSByYXRoZXIgdGhhbiBjYWxsaW5nIG50b2hsIGZyb20gdGhlIE5fKgotCW1hY3Jvcy4gIFRoaXMgY2xlYW5zIHVwIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzaXplIG9mIGEgaG9zdCBsb25nLAotCXRoZSBleGlzdGVuY2UgdG8gbnRvaGwsIGV0Yy4KLQotU2F0IEphbiAgMSAxMzo1MDowNSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciBWU1RhIG1pY3JvLWtlcm5lbC4gSXQgY3VycmVudGx5IHVzZXMKLQlpMzg2LWFvdXQuCi0KLVNhdCBKYW4gIDEgMTA6MTg6NTQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBob3N0cy9pMzg2bWFjaDMuaCAoSE9TVF9TRUdNRU5UX1NJWkUpOiBGaXggdmFsdWUuCi0JKiBpMzg2bWFjaDMuYyAoU0VHTUVOVF9TSVpFKTogRml4IHZhbHVlLgotCi1Gb3Igb2xkZXIgY2hhbmdlcyBzZWUgQ2hhbmdlTG9nLTkxOTMKLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9DaGFuZ2VMb2ctOTY5NyBiL2JmZC9DaGFuZ2VMb2ctOTY5NwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyMmM4Yy4uMDAwMDAwMAotLS0gYS9iZmQvQ2hhbmdlTG9nLTk2OTcKKysrIC9kZXYvbnVsbApAQCAtMSw2NzExICswLDAgQEAKLVR1ZSBEZWMgMzAgMTI6NDU6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBJZiAtQnN5bWJvbGljLCBkb24ndAotCWFsbG9jYXRlIHNwYWNlIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgd2hpY2ggaXMKLQlkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgZG9uJ3QgY29weSBhIFBDCi0JcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGluIGEgcmVndWxhcgotCWZpbGUuCi0KLU1vbiBEZWMgMjkgMTg6MDI6MjggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBKb25hdGhhbiBTdG9uZSA8am9uYXRoYW5ARFNHLlN0YW5mb3JkLkVEVT46Ci0JKiBjb25maWcuYmZkIChtaXBzLWRlYy1uZXRic2QqKTogQWRkIEVDT0ZGIHZlY3RvcnMgdG8KLQl0YXJnX3NlbHZlY3MuCi0JKG1pcHMqZWwtKi1uZXRic2QqKTogTGlrZSBtaXBzLWRlYy1uZXRic2QqLgotCShtaXBzKi0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCi1Nb24gRGVjIDI5IDE3OjEzOjI4IDE5OTcgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogZWxmbGluay5oIChlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZQotCWZyb20gInVuZGVmaW5lZCB2ZXJzaW9uIG5hbWUiIHRvICJ1bmRlZmluZWQgdmVyc2lvbmVkIHN5bWJvbAotCW5hbWUiLgotCi1Nb24gRGVjIDI5IDExOjQxOjE2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggdHlwbyBmcm9tIHByZXZpb3VzCi0JZGVsdGEuCi0KLVR1ZSBEZWMgMjMgMTc6MDE6MTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXQgLnJlbG9jIHNlY3Rpb24gdG8gYmUKLQlzaGFyZWQuICBTZXQgc3RhYiogc2VjdGlvbnMgdG8gYmUgc2hhcmVkIGFuZCByZWFkLiAgU2V0IC5yc3JjCi0Jc2VjdGlvbiB0byBiZSByZWFkIGFuZCBzaGFyZWQuCi0KLU1vbiBEZWMgMjIgMTM6MjA6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShBTExfTUFDSElORVNfQ0ZJTEVTKTogQWRkIGR3YXJmMi5sby4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBkd2FyZjIuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb2ZmLWFybS5jOiBEb24ndCBpbmNsdWRlIG9ic3RhY2suaC4KLQotTW9uIERlYyAyMiAxMzowNDozMyAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04NiotZ28zMi1ydGVtcyopOiBGaXggdG8gYmUgdGhlIHNhbWUgYXMKLQlpWzM0NTZdODYtZ28zMi4KLQotVGh1IERlYyAxOCAxNjowMToyNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgdG8gZ2V0IEBTSEVMTEAgc3Vic3RpdHV0ZWQuCi0KLVdlZCBEZWMgMTcgMDk6NDU6MDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbik6IE9ubHkgbG9vayBhdCBzZWN0aW9uCi0Jb3duZXIgaWYgdGhlcmUgaXMgb25lLgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEZhaWwgaWYgdGhlcmUgaXMgbm90Ci0JZW5vdWdoIHJvb20gZm9yIHRoZSBwcm9ncmFtIGhlYWRlcnMuCi0KLVR1ZSBEZWMgMTYgMDg6MDk6NTYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IENhbGwKLQlfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSBmaXJzdC4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSk6IFNhbWUuCi0JKiBkd2FyZjIuYzogTmV3IGZpbGU7IGltcGxlbWVudCBfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZS4KLQotTW9uIERlYyAxNSAxNjowODo1MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jOiBBZGQgYmZkX21hY2hfbTMyci4KLQotTW9uIERlYyAxNSAxNjoxMToyMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoQUxJR05fU0VDVElPTlNfSU5fRklMRSk6IERlZmluZSBpZiBJOTYwIG5vdCBkZWZpbmVkLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IFVzZSBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0JdG8gZGVjaWRlIHdoZW4gdG8gYWxpZ24gdGhlIGZpbGUgc2VjdGlvbnMgZm9yIHBhZ2luZy4KLQkqIGNvZmZjb2RlLmggKEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUpOiBVbmRlZmluZSBmb3IgVElDODBDT0ZGLgotCi1Nb24gRGVjIDE1IDE1OjAxOjE1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfb2JqZWN0X3ApOiBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiAgTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6ICBOZXcgRnVuY3Rpb24uCi0JKG0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiAgTmV3IEZ1bmN0aW9uLgotCShtMzJyX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogIE5ldyBGdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfb2JqZWN0X3ApOiBQb2ludCB0byBtMzJyX29iamVjdF9wLgotCShlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogUG9pbnQgdG8KLQltMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nLgotCShiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFBvaW50IHRvCi0JbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhLgotCShiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBQb2ludCB0bwotCW0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEuCi0JKGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBQb2ludCB0bwotCW0zMnJfZWxmX3NldF9wcml2YXRlX2JmZF9kYXRhLgotCShiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQb2ludCB0bwotCW0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEuCi0KLQotCSogYmZkLWluMi5oIChiZmRfbWFjaF9tMzJyKTogQWRkIGlkZW50aWZpZXIgZm9yIE0zMlIgYXJjaGl0ZWN0dXJlCi0JbWFjaGluZXMuCi0KLUZyaSBEZWMgMTIgMTE6MzA6MjggMTk5NyAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogT25seSBidWlsZCBsaWJiZmQgc2hhcmVkIGlmIC0tZW5hYmxlLXNoYXJlZCdzIHZhbHVlCi0Jd2FzIGB5ZXMnLCBvciB3YXMgc2V0IHRvIGAqYmZkKicuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIE5PVEU6IHRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGZpeGVkIGluIGxpYnRvb2wvbGlidG9vbC5tNCwgdGhlCi0Jb3JpZ2luYWwgc291cmNlIG9mIHRoaXMgYml0IG9mIGNvZGUuICBJdCdzIG5vdCBjbGVhciB3aGF0IHRoZSBiZXN0IGZpeAotCXdvdWxkIGJlLCB0aG91Z2guCi0KLVRodSBEZWMgMTEgMTc6NDg6MTEgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKGdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QpOiBBbHdheXMgaW5pdCB1ZGF0YS5wIHNvCi0JdGhhdCB0aGUgZ2VuZXJpYyByZWxheGF0aW9uIGNvZGUgY2FuIGZ1bmN0aW9uIHdoZW4gaW5wdXQgYW5kIG91dHB1dAotCWZpbGUgZm9ybWF0cyBhcmUgbWlzbWF0Y2hlZC4KLQotVGh1IERlYyAxMSAwMTowMjoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBGb3IgYSBsb2FkYWJsZQotCXNlY3Rpb24sIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb2FkIGFkZHJlc3MgaXMgY29ycmVjdCByZWxhdGl2ZSB0bwotCXRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQgcGx1cyB0aGUgc2l6ZSBvZiB0aGUgc2VnbWVudCBzbwotCWZhci4KLQotCSogY29mZmNvZGUuaCAoX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKTogTWFrZSBzdGF0aWMuCi0JKF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCk6IExpa2V3aXNlLgotCi1XZWQgRGVjIDEwIDIzOjM3OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgYSByZWxvY2F0ZWFibGUgbGluayBpbgotCXdoaWNoIGEgcmVsb2NhdGlvbiByZWZlcnMgdG8gYW4gaW5kaXJlY3Qgb3Igd2FybmluZyBzeW1ib2wuCi0KLVdlZCBEZWMgMTAgMTE6MTU6NTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYmZkX2FybV9jb2ZmX2ZpbmFsX2xpbmspOiBGdW5jdGlvbiBkZWxldGVkLgotCShjb2ZmX2FybV9maW5hbF9saW5rX3Bvc3RzY3JpcHQpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1bik6IE5ldyBmdW5jdGlvbi4KLQotCSogbGliY29mZi5oIChzdHJ1Y3QgYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZHM6Ci0JX2JmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biBhbmQKLQlfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0LiAgQWRkIG5ldyBtYWNyb3M6Ci0JYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKCkgYW5kCi0JYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KCkuCi0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSW5zZXJ0IGNhbGxzIHRvCi0JYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKCkgYW5kCi0JYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KCkuCi0KLQkqIGNvZmZjb2RlLmg6IEFkZCB0d28gbmV3IGZpZWxkcyB0byBiZmRfY29mZl9iYWNrZW5kX2RhdGEKLQlzdHJ1Y3R1cmU6IF9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gYW5kCi0JX2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdC4gIEFkZCBkZWZhdWx0IGluaXRpYWxpc2VycyBmb3IKLQl0aGVzZSBmaWVsZHMuICBBZGQgb3ZlcnJpZGFibGUgYWxpYXNlcyBmb3IgdGhlIGNvZmYgc3dhcCBmdW5jdGlvbnMKLQlpbiB0aGUgYmFja2VuZCBkYXRhIHN0cnVjdHVyZS4KLQotCSogZWxmMzItdjg1MC5jOiBVcGRhdGUgd2l0aCBwYXRjaGVzIGZyb20gdGhlIGJyYW5jaCB0byBmaXgKLQlISTE2X1MvTE8xNiByZWxvYyBwYWlycy4KLQotV2VkIERlYyAxMCAxNDowNjo0OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChkMzB2X2luZm9fdG9faG93dG9fcmVsYSk6IE5ldyBmdW5jdGlvbiB0byBzdXBwb3J0Ci0JUkVMQSByZWxvY2F0aW9ucy4KLQkoVVNFX1JFTCk6IERvbid0IGRlZmluZSBhbnkgbW9yZSwgc3dpdGNoIHRvIHVzaW5nIFJFTEEKLQlyZWxvY2F0aW9ucy4KLQkoZWxmX2luZm9fdG9faG93dG8pOiBEZWZpbmUgYXMgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEuCi0KLVR1ZSBEZWMgIDkgMTE6Mzc6NTMgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF9taXBzKik6IERlZmluZS4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IEZvciAzMDAwIGFuZCA0MDAwIHJlcGxhY2UgbWFnaWMgY29uc3RhbnQgd2l0aAotIAltYWNyby4KLQotCSogY3B1LW1pcHMuYyAoTik6IERlZmluZS4KLQkoYmZkX21pcHNfYXJjaCwgYXJjaF9pbmZvX3N0cnVjdCk6IFJlLXdyaXRlIHVzaW5nIG1hY3JvIE4sIHJlcGxhY2UKLSAJbnVtYmVycyB3aXRoIGJmZF9tYWNoX21pcHMqIG1hY3Jvcy4KLQotRnJpIERlYyAgNSAxMToxMzo0NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jLCB2ODUwX2VsZl9zdG9yZV9hZGRlbmRfaW5faW5zbiwKLQl2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHJlbG9jIGFkZGVuZCBoYW5kbGluZy4KLQkodjg1MF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uLCB2ODUwX2VsZl9zeW1ib2xfcHJvY2Vzc2luZywKLQl2ODUwX2VsZl9hZGRfc3ltYm9sX2hvb2ssIHY4NTBfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rLAotCXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyLCB2ODUwX2VsZl9mYWtlX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9ucwotCXRvIGNyZWF0ZSBhbmQgaGFuZGxlIHNwZWNpYWwgY29tbW9uIHNlY3Rpb25zLgotCSh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogRml4IEhJMTYgYW5kIEhJMTZfUyByZWxvY2F0aW9ucwotCXdoaWNoIGhhdmUgZGF0YSBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9ucy4KLQotVHVlIERlYyAgMiAxMDoyNjoxNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChUQVJHRVRfVU5ERVJTQ09SRSk6IFJldmVydCBiYWNrIHRvICdfJwotCShVU0VSX0xBQkVMX1BSRUZJWCk6IFJldmVydCBiYWNrIHRvICdfJwotCi0JKiBjb25maWcuYmZkICh0YXJnX2NwdSk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLU1vbiBEZWMgIDEgMjA6MjQ6MTggMTk5NyAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb2ZmLXNoLmMgKHNoX2NvZmZfaG93dG9zKTogQWRkIFJfU0hfU1dJVENIOCBlbnRyeS4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBSX1NIX1NXSVRDSDguCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IExpa2V3aXNlLgotCi1XZWQgTm92IDI2IDE0OjEzOjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmMgKFRBUkdFVF9VTkRFUlNDT1JFKTogQ2hhbmdlZCB0byBtYXRjaCBkZWZpbml0aW9uIGluCi0JZ2NjL2NvbmZpZy9hcm0vc2VtaS5oCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogQWRkIEFSTSBhbmQgVGh1bWIgc3ltYm9sCi0JY2xhc3Nlcy4KLQotU3VuIE5vdiAyMyAxNjowMjo1OCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGZyZWVic2QuaCAoU1dBUF9NQUdJQyk6IFJlYWQgbWFnaWMgbnVtYmVyIGxpdHRsZSBhbmQgbm90IGJpZwotIAllbmRpYW4uCi0KLVdlZCBOb3YgMjYgMDk6MzA6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9ta29iamVjdF9ob29rKTogT25seSBzZXQgcHJpdmF0ZSBmbGFncyBmb3Igbm9uCi0JUEUgQVJNIHBvcnRzLgotCi1UdWUgTm92IDI1IDE1OjMzOjIzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJpbmFyeS5jIChiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMpOiBBbHNvIGlnbm9yZSBORVZFUl9MT0FECi0Jc2VjdGlvbnMuCi0KLVR1ZSBOb3YgMjUgMTA6NTU6MzYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEbyBub3QKLQljb21wbGFpbiBpZiBpbm91dCBhbmQgb3V0cHV0IGZvcm1hdHMgZGlmZmVyLgotCi1UdWUgTm92IDI1IDExOjI2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIHRla2hleC5sby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogUmVtb3ZlIHRla2hleC5jLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIHNyYy9NYWtlZmlsZS5pbjogUmVidWlsZCB3aXRoIGN1cnJlbnQKLQlhdXRvbWFrZSBhbmQgYXV0b2NvbmYuCi0KLQkqIGNvZmYtYXJtLmMgKGFybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMpOiBGaXggdHlwbwotCShDT0ZGX1dJVEhfUFIgdG8gQ09GRl9XSVRIX1BFKS4KLQotTW9uIE5vdiAyNCAxNTo0Nzo0OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBNYWtlIHZhcmlhYmxlcyBhbmQgc29tZSBmdW5jdGlvbnMgc3RhdGljLCBzbyB0aGF0Ci0JdGhpcyBmaWxlIGNhbiBiZSBpbmNsdWRlZCBpbiBtdWx0aXBsZSBvYmplY3QgZmlsZXMuCi0JKGNvZmZfYXJtX2JmZF9maW5hbF9saW5rKTogRml4IG1pbm9yIGJ1Zy4KLQotU2F0IE5vdiAyMiAxNToxNjowMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jOiBBZGQgc3VwcG9ydCBmb3IgUElDIGFuZCBBUENTLUZMT0FUIHR5cGUgYmluYXJpZXMuCi0KLQkqIGNvZmZjb2RlLmg6IEFkZCBzdXBwb3J0IGZvciBQSUMgYW5kIEFQQ1MtRkxPQVQgdHlwZSBiaW5hcmllcy4KLQotU2F0IE5vdiAyMiAxNjowNjo1NiAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZXZheC1lbWguYyAoX2JmZF9ldmF4X3dyaXRlX2VtaCk6IFVzZSBhbGxvY2EgaW5zdGVhZCBvZiBzdHJkdXAuCi0KLVNhdCBOb3YgMjIgMTI6Mjk6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfb25lX3N5bWJvbCk6IFdoZW4gb3ZlcnJpZGluZyBhIGRlZmluZWQKLQlzeW1ib2wsIHNldCBpdCB0byB1bmRlZmluZWQsIG5vdCBuZXcuCi0KLQkqIGVsZjMyLXNoLmMgKHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBraWxsIExBQkVMCi0JcmVsb2NzLgotCi1GcmkgTm92IDIxIDE0OjE0OjIyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfc2VjdGlvbik6IEZvcmNlIHNpZ24gZXh0ZW50aW9uIG9mIFVTRVMgcl9vZmZzZXQuCi0JKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IGtpbGwgTEFCRUwgcmVsb2NzLgotCi1Nb24gTm92IDE3IDE1OjA4OjM4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmLW0xMDMwMC5jIChlbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5KTogRml4IHR5cG8uCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBMaWtld2lzZS4KLQotU2F0IE5vdiAxNSAxNTozNjowNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfYW91dGhkcl9pbik6IENhc3Qgc2Vjb25kIGFyZyBvZgotCWJmZF9oX2dldF8qIGNhbGxzIHRvICJiZmRfYnl0ZSAqIi4KLQotVHVlIE5vdiAxMSAxMDozNzoyMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkCi0JIm1vdm1fc3RhY2tfc2l6ZSIuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBJbmNsdWRlIHN0YWNrIHNwYWNlIGZvciByZWdpc3RlciBzYXZlcwotCWluIHRoZSBpbW04IGZpZWxkIG9mIGEgImNhbGwiIGluc3RydWN0aW9uLgotCShjb21wdXRlX2Z1bmN0aW9uX2luZm8pOiBEZXRlcm1pbmUgaG93IG11Y2ggc3RhY2sgaXMgYWxsb2NhdGVkIGJ5Ci0JdGhlIG1vdm0gaW5zdHJ1Y3Rpb24uICBGaXggdHlwby4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgbW92bV9zdGFja19zaXplLgotCi1Nb24gTm92IDEwIDE0OjMyOjQwIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogRG9uJ3QgY3Jhc2ggaWYKLQlhIHZlcnNpb24gZGVwZW5kZW5jeSBjb3VsZCBub3QgYmUgZm91bmQuCi0KLVR1ZSBOb3YgIDQgMTI6MDU6NTYgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IEdldCB2ZXJzaW9uIGluZm8gZnJvbSBjb25maWd1cmUuaW4KLQotRnJpIE9jdCAyNCAxMToxNTo1OCAxOTk3ICBKYWt1YiBKZWxpbmVrICA8ampAc3Vuc2l0ZS5tZmYuY3VuaS5jej4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6Ci0JTmV3IGZ1bmN0aW9uLiBBdm9pZCBtaXhpbmcgVVMxIGFuZCBIQUwgUjEgY29kZS4KLQlTZXQgcmVzdWx0aW5nIG1lbW9yeSBvcmRlcmluZyB0byB0aGUgc3Ryb25nZXN0IG9uZSB1c2VkLgotCShzcGFyYzY0X2VsZl9vYmplY3RfcCk6IFNldCBiZmRfbWFjaCBjb3JyZWN0bHkuCi0KLVRodSBPY3QgMjMgMTQ6MDk6MzMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBBZGQgVUE2NCAmIFVBMTYuCi0JKHNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcyk6IEhhbmRsZSB0aGVtLgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuICBCZWZvcmUgZW1pdHRpbmcgYSBkeW4gcmVsb2MsCi0JY2hlY2sgYWxpZ25tZW50IGFuZCB0cmFuc211dGUgUl9TUEFSQ194PC0+Ul9TUEFSQ19VQXguCi0KLVRodSBPY3QgMjMgMDA6NTM6MTQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAZG90LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbGludXgqKTogVXNlIHRyYWQtY29yZSBhbmQgLi4uCi0JKiBob3N0cy9zcGFyY2xpbnV4Lmg6IE5ldyBmaWxlLgotCi1UaHUgT2N0IDIzIDAwOjI1OjI5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChzcGFyYzY0LSotbGludXgqKTogTmV3IHRhcmdldC4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBwbHRfYWxpZ25tZW50IG1lbWJlci4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogU2V0IC5nb3QgYWxpZ25tZW50IGJhc2VkCi0Jb24gYXJjaF9zaXplLgotCShfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlIGZvciAucmVsKiBzZWN0aW9ucy4KLQlTZXQgLnBsdCBhbGlnbm1lbnQgZnJvbSBuZXcgcGx0X2FsaWdubWVudC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgdmVyc2lvbiBzZWN0aW9uCi0JYWxpZ25tZW50IHRvIExPR19GSUxFX0FMSUdOLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQpOiBQcm92aWRlIGRlZmF1bHQuCi0JKGVsZlhYX2JlZCk6IEluaXQgcGx0X2FsaWdubWVudC4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfY2hlY2tfcmVsb2NzLAotCXNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCwgc3BhcmM2NF9lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zLAotCXNwYXJjNjRfZWxmX2FkanVzdF9keW5pbmR4LCBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wsCi0Jc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBOZXcgZnVuY3Rpb25zLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IEZpeCBhIGZldyBuYW1lIHN0cmluZ3MuCi0JKEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSKTogTmV3IGRlZmluaXRpb24uCi0JKHNwYXJjNjRfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgc2hhcmVkIGxpYnJhcmllcy4KLQotCSogZWxmNjQtc3BhcmMuYyAoc3RydWN0IHBsdF90ZW1wbGF0ZSwgcGx0XypfaGVhZGVyLCBwbHRfKl9lbnRyeSwKLQlzcGFyYzY0X2VsZl9idWlsZF9wbHRfZW50cnksIHNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6Ci0JUExUIGRlZmluaXRpb25zIHNwYXJjNjQtbGludXggb3JpZ2luYWxseSBjaG9vc2UuICBUaGVzZSB3aWxsIGdvCi0JYXdheSBzb29uIGluIGZhdm91ciBvZiB0aGUgb2ZmaWNpYWwgYWJpIGRlZmluaXRpb25zLgotCi1XZWQgT2N0IDIyIDE2OjA4OjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChjb2ZmX3NtYWxsX29iamVjdF9wKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9zbWFsbF9uZXdfc2VjdGlvbl9ob29rKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZSk6IE5ldyBzdGF0aWMgY29uc3Qgc3RydWN0dXJlLgotCShjb2ZmX3NtYWxsX2Nsb3NlX2FuZF9jbGVhbnVwKTogRGVmaW5lLgotCShjb2ZmX3NtYWxsX2JmZF9mcmVlX2NhY2hlZF9pbmZvKTogRGVmaW5lLgotCShjb2ZmX3NtYWxsX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVmaW5lLgotCShjb2ZmX3NtYWxsX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyk6IERlZmluZS4KLQkoc2hjb2ZmX3NtYWxsX3ZlYyk6IE5ldyBzdGF0aWMgc3RydWN0dXJlLgotCShzaGxjb2ZmX3NtYWxsX3ZlYyk6IE5ldyBzdGF0aWMgc3RydWN0dXJlLgotCSogdGFyZ2V0cy5jIChiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBzaGNvZmZfc21hbGxfdmVjIGFuZAotCXNobGNvZmZfc21hbGxfdmVjLgotCSogY29uZmlnLmJmZCAoc2gtKi1lbGYqKTogQWRkIHNoY29mZl9zbWFsbF92ZWMgYW5kCi0Jc2hsY29mZl9zbWFsbF92ZWMgdG8gdGFyZ19zZWx2ZWNzLgotCShzaC0qLSopOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHNoY29mZl9zbWFsbF92ZWMgYW5kIHNobGNvZmZfc21hbGxfdmVjIGNhc2VzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gT2N0IDIwIDE1OjAxOjI3IDE5OTcgIEtsYXVzIEsiYW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBldmF4LWVnc2QuYzogV2VhayBzeW1ib2xzIGFyZSBnbG9iYWwuCi0KLQkqIGV2YXgtZW1oLmM6IFVzZSBwcm9wZXIgY2FzdHMuCi0KLQkqIGV2YXgtZWdzZC5jIChfYmZkX2V2YXhfd3JpdGVfZWdzZCk6IFJlbW92ZSB1bm5lZWRlZCB1bmFtZS4KLQotCSogZXZheC1lZ3NkLmM6IFNlY3Rpb24gbmFtZXMgYW5kIHN5bWJvbHMgaGF2ZSBkaWZmZXJlbnQKLQlsZW5ndGggcmVzdHJpY3Rpb25zLiBBZGQgbGVuZ3RoIHBhcmFtZXRlciB0bwotCV9iZmRfZXZheF9sZW5ndGhfaGFzaF9zeW1ib2wuCi0JKiBldmF4LWV0aXIuYzogTGlrZXdpc2UuCi0JKiBldmF4LW1pc2MuYyAoX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbCk6IEFkZCBsZW5ndGgKLQlwYXJhbWV0ZXIuCi0JKiBldmF4LmggKEVPQkpfU19DX1NFQ1NJWik6IERlZmluZS4KLQotCSogZXZheC1hbHBoYS5jOiBSZW1vdmUgZHVwbGljYXRlIHRlc3QuCi0KLQkqIGV2YXgtZW1oLmM6IFNZUyQgZnVuY3Rpb25zIGFyZSB1cHBlci1jYXNlLgotCi0JKiBldmF4LWVnc2QuYzogQ3JlYXRlIHNlcGFyYXRlIHNlY3Rpb25zIGZvciBjb21tb24gc3ltYm9scy4KLQkqIGV2YXgtZXRpci5jOiBEb24ndCBvdXRwdXQgY29tbW9uIHNlY3Rpb24uCi0JKiBldmF4Lmg6IEJ1bXAgdXAgc2VjdGlvbiBjb3VudC4KLQotCSogY29uZmlndXJlLmNvbTogVXNlIDY0Yml0IGludGVnZXJzIHdpdGggREVDIEMuCi0KLQkqIGV2YXgtZWdzZC5jOiBNYWtlIHNlY3Rpb24gZmxhZ3MgZGVjIGMgY29tcGF0aWJsZS4KLQotTW9uIE9jdCAyMCAwOTozODozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChub3JtYWxpemUpOiBEZWxldGUgZnVuY3Rpb24uCi0JKHNvbV9iZmRfYXJfd3JpdGVfc3ltYm9sX3N0dWZmKTogTmV3IHBhcmFtZXRlciBlbGVuZ3RoLiAgQWxsIGNhbGxlcnMKLQljaGFuZ2VkLiAgVXNlIHBhc3NlZCBpbiBlbGVuZ3RoIHRvIGRldGVybWluZSBzaXplIG9mIHRoZSBleHRlbmRlZAotCW5hbWUgdGFibGUgaW5zdGVhZCBvZiBjb21wdXRpbmcgaXQgYWdhaW4uCi0KLVN1biBPY3QgMTkgMjM6MzY6MjEgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogVXNlIHw9IG5vdCA9IHRvIHNldAotCUlNQUdFX1NDTl9NRU1fUkVBRCBmb3IgYW4gdW5yZWNvZ25pemVkIHNlY3Rpb24uCi0KLVN1biBPY3QgMTkgMjE6MDQ6NTYgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzb20uYyAoc29tX2JmZF9hcl93cml0ZV9zeW1ib2xfc3R1ZmYpOiBBY2NvdW50IGZvciB0cmFpbGluZwotCScvJyBpbiB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLQotRnJpIE9jdCAxNyAwMDowNDoxMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IEZvciBleHBsaWNpdGx5IHZlcnNpb25lZAotCXN5bWJvbHMsIGNoZWNrIGdsb2JhbHMgbGlzdCBiZWZvcmUgbWF0Y2hpbmcgb24gbG9jYWxzLgotCi1UaHUgT2N0IDE2IDA4OjE3OjA2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0LHBlX3ByaW50X2lkYXRhKTogRml4IG1hbmdsZWQKLQlwYXRjaC4KLQotV2VkIE9jdCAxNSAxMzo0NToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAocGVfbWtvYmplY3RfaG9vayk6IFNldCBETEwgZmxhZy4KLQkocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENvcHkgRExMIGZsYWcuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBTZXQgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRQotCWZvciAuc3RhYiogc2VjdGlvbnMuICBSZXBsYWNlIHN0cmxlbiBvZiBjb25zdGFudCBzdHJpbmdzIHdpdGgKLQludW1iZXIuCi0KLVR1ZSBPY3QgMTQgMTU6NDI6NDUgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfbWVyZ2VfaW5kX3N5bWJvbHMpOiBOZXcgZnVuY3Rpb24gdG8KLQltZXJnZSBnb3QgYW5kIHJlbG9jIGVudHJpZXMgZnJvbSBpbmQgc3ltcyB0byB0aGVpciB0YXJnZXQuCi0JKGVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogQ2FsbCBpdC4KLQkoZWxmNjRfYWxwaGFfY2hlY2tfcmVsb2NzKTogT3BlcmF0ZSBvbiB0aGUgdGFyZ2V0IG9mIGluZGlyZWN0IHN5bWJvbHMuCi0JKGVsZjY0X2FscGhhX2Nhbl9tZXJnZV9nb3RzKTogTGlrZXdpc2UuCi0JKGVsZjY0X2FscGhhX21lcmdlX2dvdHMpOiBMaWtld2lzZS4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IEJhY2sgb3V0IEhKJ3MgY2hhbmdlLAotCWFzIGl0IGlzIGluc3VmZmljaWVudCB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb24gY2hhbmdlcyBhcyB3ZWxsLgotCi1Nb24gT2N0IDEzIDIzOjEwOjA4IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzKTogQWxsb3cgZm9yIFJFTEFUSVZFCi0JcmVsb2NzIGZvciBzeW1ib2xzIGluIHNobGlicyB0aGF0IGhhdmUgYmVlbiBmb3JjZWQgbG9jYWwuCi0JKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBPdXRwdXQgUkVMQVRJVkVzIGluIC5nb3QgZm9yIHNhbWUuCi0KLU1vbiBPY3QgMTMgMjE6MjQ6MDQgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFVzZSB0aGUKLQlnb3RfZW50aWVzIG9mIHRoZSBkZWZhdWx0IHN5bWJvbCBmb3IgdGhlIGRlZmF1bHQgdmVyc2lvbmVkCi0Jc3ltYm9sLiAgUGF0Y2ggZnJvbSBoamxAZ251LmFpLm1pdC5lZHUsIG1vZGlmaWVkIG5vdCB0byB1c2UKLQlhbGxvY2EgaW4gdGhlIGxvb3AuCi0KLU1vbiBPY3QgMTMgMTc6Mzc6MzcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogT25seSB1c2UgdGhlIGJvdHRvbQotCTI0IGJpdHMgb2YgdGhlIFBDIHdoZW4gY29tcHV0aW5nIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbi4KLQotRnJpIE9jdCAxMCAxNjowMTozMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jLCB2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKToKLQlDb3JyZWN0IHZhbHVlIGZvciBtYXhpbXVtIHBvc2l0aXZlIDIyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLgotCSh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIFByZXZlbnQgb3ZlcmZsb3cgZnJvbSBISTE2X1MgYW5kCi0JSElfMTYgcmVsb2NhdGlvbnMuICBDb3JyZWN0IGJpdCBhZGp1c3RtZW50IGluIFREQSBvZmZzZXRzLgotCi1UaHUgT2N0ICA5IDE2OjQzOjM5IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjX2VsZl97aGl4MjIsbG94MTB9X3JlbG9jKTogTmV3IGZ1bmN0aW9ucy4KLQkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBVc2UgdGhlbSBmb3IgSElYMjIsTE9YMTAgcmVsb2NzLgotCi1XZWQgT2N0ICA4IDExOjM4OjQ1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvcmUuaCAoYmZkX3Byc3RhdHVzKTogUGVkYW50aWNseSwgYWxpZ25tZW50X3Bvd2VyIHNob3VsZAotCWJlIExPR19GSUxFX0FMSUdOLgotCi1XZWQgT2N0ICA4IDExOjM2OjAwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IE1pc3NlZCBvbmUgYWxwaGEqIGNoYW5nZS4KLQotVHVlIE9jdCAgNyAxMzowMDoxNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSk6IFJlbW92ZSBCRkQ2NCBzdXBwb3J0LgotCSogZWxmNjQtc3BhcmMuYyAoU1BBUkM2NF9PTERfUkVMT0NTKTogVW5kZWYuCi0JKE1JTlVTX09ORSk6IE5ldyBtYWNyby4KLQkoc3BhcmNfZWxmX25vdHN1cF9yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmM2NF9lbGZfaG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgRElTUDY0LFBMVDY0LEhJWDIyLExPWDEwLAotCUg0NCxNNDQsTDQ0LFJFR0lTVEVSLgotCShzcGFyY19yZWxvY19tYXApOiBMaWtld2lzZS4gIE1hcCBCRkRfUkVMT0NfQ1RPUiB0byBSX1NQQVJDXzY0LgotCShpbml0X2luc25fcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogVXNlIGl0LgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIGVudHJpZXMgZm9yIE9MTzEwLEhJWDIyLExPWDEwLgotCi1UdWUgT2N0ICA3IDExOjQwOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc29tLmMgKHNvbV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IFJlbW92ZSBzdGF0aWMKLQlmdW5jdGlvbiwgYW5kIGRlZmluZSBhcyBtYWNybyBpbnN0ZWFkLgotCi1GcmkgT2N0ICAzIDE0OjAyOjE3IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IENoYW5nZSBhbHBoYS0qLSogdG8gYWxwaGEqLSotKjsgY29uZmlnLmd1ZXNzIG5vdwotCXJlY29nbml6ZXMgYWxwaGFldjUgZXRjLgotCSogY29uZmlndXJlLmhvc3Q6IExpa2V3aXNlLgotCi1GcmkgT2N0ICAzIDExOjIzOjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU1ha2UgbGQgLXMgd29yayBvbiBBSVg6Ci0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGNyZWF0ZSB0aGUgLmRlYnVnCi0Jc2VjdGlvbiBpZiB3ZSBhcmUgc3RyaXBwaW5nLgotCShiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0IHRoZSAuZGVidWcgc2VjdGlvbgotCXNpemUgaWYgd2UgYXJlIHN0cmlwcGluZy4KLQkoX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayk6IERvbid0IHNldCBTRUNfUkVMT0Mgb3IgcmVsX2ZpbGVwb3MsCi0JYW5kIGRvbid0IHdyaXRlIG91dCByZWxvY3MsIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3Qgc2V0IHVwIHJlbG9jIGlmIHdlIGFyZSBzdHJpcHBpbmcuCi0JKHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wpOiBEb24ndCB3cml0ZSBvdXQgc3ltYm9sIG9yIHJlbG9jIGlmIHdlCi0JYXJlIHN0cmlwcGluZy4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBpbmNsdWRlIGVsZi5sbyBhZ2FpbiBmb3IgRUxGIHRhcmdldHM7IGl0J3MKLQlhbHdheXMgaW4gdGhlIGxpYnJhcnkgYW55aG93LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLQkqIGVsZjMyLXNwYXJjLmMgKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogQ2FzdCB0byBiZmRfYnl0ZSAqLCBub3QKLQljaGFyICosIHdoZW4gY2FsbGluZyBiZmRfZ2V0XzMyIGFuZCBiZmRfcHV0XzMyLgotCSogc3Vub3MuYyAoc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCk6IENhc3QgY29udGVudHMgdG8gY2hhciAqCi0Jd2hlbiBjYWxsaW5nIHN0cmNweS4KLQotVGh1IE9jdCAgMiAxNjoxNTo1MCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChiZmRfY2hlY2tfb3ZlcmZsb3cpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBVc2UgaXQuCi0JKEJGRF9SRUxPQ19TUEFSQ197RElTUDY0LFBMVDY0fSk6IE5ldyByZWxvY3MuCi0JKEJGRF9SRUxPQ19TUEFSQ197SElYMjIsTE9YMTAsSDQ0LE00NCxMNDQsUkVHSVNURVJ9KTogTmV3IHJlbG9jcy4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZS4KLQkqIGxpYmJmZC5oOiBSZWdlbmVyYXRlLgotCi1UaHUgT2N0ICAyIDEzOjE3OjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfc2NuaGRyX291dCk6IFNldCBJTUFHRV9TQ05fTUVNX1JFQUQgZm9yIGFuCi0JdW5yZWNvZ25pemVkIHNlY3Rpb24uICBGcm9tIEpvbiBUaGFja3JheSA8am9udEBoYXJsZXF1aW4uY28udWs+LgotCi1XZWQgT2N0ICAxIDE0OjAzOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKCQoQkZEX0gpKTogQ2hhbmdlIHN0bXAtYmZkLmggdG8gc3RtcC1iZmQtaC4KLSAJKHN0bXAtYmZkLWgpOiBSZW5hbWUgZnJvbSBzdG1wLWJmZC5oLgotIAkoQkZEX0hfRklMRVMsIExJQkJGRF9IX0ZJTEVTLCBMSUJDT0ZGX0hfRklMRVMpOiBOZXcgdmFyaWFibGVzLgotCSgkKHNyY2RpcikvYmZkLWluMi5oKTogSnVzdCBkZXBlbmQgdXBvbiBzdG1wLWJpbjItaC4KLQkoc3RtcC1iaW4yLWgpOiBOZXcgdGFyZ2V0LgotCSgkKHNyY2RpcikvbGliYmZkLmgpOiBKdXN0IGRlcGVuZCB1cG9uIHN0bXAtbGJmZC1oLgotCShzdG1wLWxiZmQtaCk6IE5ldyB0YXJnZXQuCi0JKCQoc3JjZGlyKS9saWJjb2ZmLmgpOiBKdXN0IGRlcGVuZCB1cG9uIHN0bXAtbGNvZmYtaC4KLQkoc3RtcC1sY29mZi1oKTogTmV3IHRhcmdldC4KLQkoQ0xFQU5GSUxFUyk6IENoYW5nZSBzdG1wLWJmZC5oIHRvIHN0bXAtYmZkLWguICBBZGQgc3RtcC1iaW4yLmgsCi0Jc3RtcC1sYmZkLWgsIGFuZCBzdG1wLWxjb2ZmLWguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmluOiBVc2UgYSBkaXZlcnNpb24gdG8gc2V0IGVuYWJsZV9zaGFyZWQgYmVmb3JlIHRoZQotCWFyZ3VtZW50cyBhcmUgcGFyc2VkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwIDMwIDE0OjE4OjMyIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUl9TUEFSQ19HTE9CX0pNUAotCXJlbmFtZWQgdG8gUl9TUEFSQ19VTlVTRURfNDIuCi0JKHNwYXJjX3JlbG9jX21hcCk6IERlbGV0ZSBSX1NQQVJDX0dMT0JfSk1QIGVudHJ5LgotCSogZWxmNjQtc3BhcmMuYyAoX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGUpOiBSX1NQQVJDX0dMT0JfSk1QCi0JcmVuYW1lZCB0byBSX1NQQVJDX1VOVVNFRF80Mi4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVsZXRlIFJfU1BBUkNfR0xPQl9KTVAgZW50cnkuCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfU1BBUkNfR0xPQl9KTVApOiBEZWxldGUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCSogbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgU2VwIDI1IDEyOjE1OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogRG9uJ3QgY2hlY2sgdGhlIGhhc2ggY3JlYXRvciB1bnRpbAotCWFmdGVyIHdlIGhhdmUgc2V0ICpzeW1faGFzaC4KLQotV2VkIFNlcCAyNCAxNjo1MjoyOCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy5iZmQgKHNoKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2Ugc2gtKi0qZWxmKi4KLQotV2VkIFNlcCAyNCAxMToyNzoyMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsaWJiZmRfYV9TT1VSQ0VTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DSEVDS19UT09MIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBTZXAgMjMgMTk6MDM6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogRXZlbiBpZiB3ZSBhcmUgbm90IGRlbWFuZAotCXBhZ2VkLCBkb24ndCBwdXQgYSBsb2FkYWJsZSBzZWN0aW9uIGFmdGVyIGEgbm9ubG9hZGFibGUgc2VjdGlvbi4KLQkoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEluY3JlbWVudCB0aGUgZmlsZSBvZmZzZXQKLQlmb3IgYSBzZWN0aW9uIHdpdGggY29udGVudHMsIGV2ZW4gaWYgaXQgaXMgbm90IGxvYWRhYmxlLgotCi1TdW4gU2VwIDIxIDExOjAzOjI0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IEFkZCByZXR1cm4gY29kZQotCWluZGljYXRpbmcgdGhhdCBfX2N0YnAgY291bGQgbm90IGJlIGZvdW5kLgotCi1UaHUgU2VwIDE4IDE1OjA0OjU3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfY2hlY2tfcmVsb2NzKTogSW1wcm92ZSBlcnJvciBtZXNzYWdlLgotCi1XZWQgU2VwIDE3IDA5OjU0OjUxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSwgdjg1MF9lbGZfcmVsb2MsCi0Jdjg1MF9lbGZfY2hlY2tfcmVsb2NzLCB2ODUwX2VsZl9yZWxvY19tYXAsIHY4NTBfZWxmX2hvd3RvX3RhYmxlKToKLQlBZGQgc3VwcG9ydCBmb3IgdGhlIENBTExUIHJlbG9jcy4KLQotCSogcmVsb2MuYyAoQ09NTUVOVCk6IEFkZCBCRkRfUkVMT0NfVjg1MF9DQUxMVF82XzdfT0ZGU0VUIGFuZAotCUJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVC4KLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogQWRkIGNoZWNrcyB0byBjYXRjaAotCXJlbG9jYXRpb25zIGFnYWluc3Qgbm9uLWV4aXN0YW50IHN5bWJvbHMuCi0KLVR1ZSBTZXAgMTYgMTQ6MjA6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYzogQWRkIEJGUl9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQuCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfcmVsb2MsIHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUsCi0Jdjg1MF9lbGZfaG93dG9fdGFibGUsIHY4NTBfZWxmX3JlbG9jX21hcCk6IEFkZCBzdXBwb3J0IGZvciBhIDE2Ci0JYml0IHJlbG9jIGluIHRoZSB0aW55IGRhdGEgYXJlYS4KLQotTW9uIFNlcCAxNSAxMToyNzozNiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gTWFydGluIEh1bnQ6Ci0KLQkqIGVsZjMyLWQzMHYuYyAoYmZkX2VsZl9kMzB2X3JlbG9jKTogQ2hhbmdlIHBjLXJlbGF0aXZlIHJlbG9jcwotCW92ZXIgMl4zMiBieXRlcyB0byBiZSBhYnNvbHV0ZS4gIE5lZWRlZCBiZWNhdXNlIEQzMFYgUEMgZG9lc24ndAotCW5lY2Vzc2FyaWx5IHdyYXAuCi0KLQkqIHJlbG9jLmMsIGVsZjMyLWQzMHYuYyAoQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCwKLQlCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IpOiBOZXcgcmVsb2NzLgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvY18yMSk6IE5ldyBmdW5jdGlvbi4KLQlEbyAxNSBhbmQgMjEgYml0IHBjLXJlbGF0aXZlIHJlbG9jYXRpb25zLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUiwgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUik6Ci0JTmV3IHJlbG9jYXRpb25zLgotCi0JKiBlbGYzMi1kMzB2LmMgKGJmZF9lbGZfZDMwdl9yZWxvYyk6IEFkZGVuZCBuZWVkcyB0byBiZQotCWFkZGVkIHRvIHRoZSByZWxvY2F0aW9uLCBub3Qgb3InZC4KLQotV2VkIFNlcCAxMCAxNToxNzoyNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3JlbG9jKTogUmVtb3ZlIHNwdXJpb3VzIGVycm9yIG1lc3NhZ2UuCi0KLVdlZCBTZXAgMTAgMTE6MTc6NTAgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfZGVmYXVsdF9zY2FuKTogVXNlIHN0cmNhc2VjbXAuCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBUZXN0IGZvciBtYXRjaCB3aXRoIGFyY2hfbmFtZSArICI6IiArCi0gCXByaW50YWJsZV9uYW1lLgotCShiZmRfZGVmYXVsdF9zY2FuKTogVGVzdCBmb3IgbWF0Y2ggd2l0aCBwcmludGFibGVfbmFtZSAtICI6Ii4KLQkoYmZkX2RlZmF1bHRfc2Nhbik6IERlbGV0ZSB3NjUsIGg4MzAwLCBoODUwMCwgejhrLCBpOTYwIHNwZWNpYWwKLSAJY2FzZXMuICBFYWNoIGltcGxlbWVudHMgdGhlaXIgb3duIHNjYW4gZnVuY3Rpb24uCi0JKGJmZF9kZWZhdWx0X3NjYW4pOiBEZWxldGUgMzg2LCAyOTAwLCA4NjAsIG1pcHMgMjAwMCwgbWlwcyA0NDAwCi0gCXNwZWNpYWwgY2FzZXMuICBTaW5jZSBpbmZvLT5tYWNoID09IDAuICBUaGUgdGVzdCBtYWNoID09IG51bWJlcgotIAlmYWlscy4KLQkoYmZkX2FyY2hfbGlzdCk6IE5ldyBmdW5jdGlvbiwgcmV0dXJuIG5hbWUgb2YgYWxsIHRoZSBzdXBwb3J0ZWQKLSAJYXJjaGl0ZWN0dXJlcy4KLQotVHVlIFNlcCAgOSAxMDoyMTo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBCcmVhayBhZnRlcgotCWRlY29kaW5nIGFyY2hpdGVjdHVyZS4KLQkodjg1MF9lbGZfcmVsb2MpOiBEbyBub3QgY29tcGxhaW4gaWYgYSBSX1Y4NTBfTE8xNiByZWxvYyBoYXMgYml0Ci0JMTUgc2V0LgotCi1TdW4gU2VwICA3IDEyOjI1OjIyIDE5OTcgIEguSi4gTHUgIChoamxAZ251LmFpLm1pdC5lZHUpCi0KLQkqIGJmZC9lbGY2NC1hbHBoYS5jIChyZWxvY19ob3d0b190eXBlKTogRml4IHRoZSBob3d0byB0YWJsZS4KLQotVGh1IFNlcCAgNCAwOTo0NDoxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgY3B1LXY4NTAuYy4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBlbGYzMi12ODUwLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogcmVsb2MuYzogUmVtb3ZlIGV4dHJhbmVvdXMgY29tbWFzIGZyb20gcmVsb2NhdGlvbiBlbnRyaWVzLgotCVJlbW92ZSBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBQdXQgWFRZX0NNL1hNQ19URCBzeW1ib2xzCi0JaW4gc2VjdGlvbnMgbmFtZWQgLnRvY2JzcyByYXRoZXIgdGhhbiAuYnNzLgotCi1XZWQgU2VwICAzIDExOjIzOjIzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpYmJmZC5oLCBiZmQtaW4yLmgsIGVsZjMyLXY4NTAuYzogUmVtb3ZlZAotCUJGRF9SRUxPQ19WODUwXzE2X1BDUkVMLgotCi1UdWUgU2VwICAyIDIwOjQ0OjEwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyk6IEhhbmRsZSBDX1NZU1RFTSBzeW1zCi0JdGhlIHNhbWUgYXMgQ19FWFQgc3ltcy4KLQkoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogRGl0dG8uCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERpdHRvLgotCShfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzKTogQWRkIHNhdmVfZ2xvYmFsX3RvX3N0YXRpYy4gIFVzZQotCWl0IHRvIHByZXNlcnZlIGFuZCByZXN0b3JlIHN0YXRlIG9mIGdsb2JhbF90b19zdGF0aWMgZmxhZy4KLQotVHVlIFNlcCAgMiAxNzo0NToyMiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX29iamVjdF9wKTogU2V0IG1hY2hpbmUgbnVtYmVyIGJhc2VkIG9uCi0JYml0cyBpbiBlX2ZsYWdzIGZpZWxkIHJhdGhlciB0aGFuIG1hZ2ljIG51bWJlcnMuCi0JKHY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcsIHY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzLAotCXY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSwgdjg1MF9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSwKLQl2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9ucy4KLQotVHVlIFNlcCAgMiAxNzo0Mzo0OSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogUmVtb3ZlIFY4NTBFIG1hZ2ljIG51bWJlci4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBSZW1vdmUgVjg1MEVBIG1hZ2ljIG51bWJlci4KLQotVHVlIFNlcCAgMiAxNzozNTowNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjcHUtYXJjLmMgKGFyY19nZXRfbWFjaCk6IFByb3Blcmx5IHNjYW4gZGVmaW5lZCBtYWNoIGVudHJpZXMuCi0KLVR1ZSBTZXAgIDIgMTg6Mjk6MzcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYtbTEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBQQyByZWxhdGl2ZQotCWluc3RydWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUKLQljdXJyZW50IGluc3RydWN0aW9uLgotCShtbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uKTogU2ltaWxhcmx5LgotCi1UdWUgU2VwICAyIDE1OjQ1OjQ1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNwdS12ODUwLmM6IFVzZSBhIG1hY3JvIHRvIGNvbnN0cnVjdCBiZmRfYXJjaF9pbmZvX3R5cGUKLQllbnRyaWVzLgotCi0JKiByZWxvYy5jLCBsaWJiZmQuaCwgYmZkLWluMi5oLCBlbGYzMi12ODUwLmM6IFJlcGxhY2UKLQlCRkRfUkVMT0NfVjg1MF97U0RBL1REQS9aREF9X09GRlNFVCByZWxvY3Mgd2l0aCBuZXcgYml0IHBhdHRlcm4KLQlzcGVjaWZpYyB2ZXJzaW9uczogQkZEX1JFTE9DX1Y4NTBfe2FyZWF9X3tiaXRzfV9PRkZTRVQuCi0KLVRodSBBdWcgMjggMTc6MDE6MDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MC5jOiBSZW1vdmUgInBsYWluIiBmcm9tIHY4NTAgcHJpbnRhYmxlIG5hbWUuCi0JKHNjYW4pOiBVc2Ugc3RyY2FzZWNtcC4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfdjg1MCk6IERlZmluZS4KLQotCSogY3B1LXNoLmMgKHNjYW5fbWFjaCk6IENvbXBhcmUgd2l0aCB0YWJsZSBpbnN0ZWFkIG9mIGhhcmR3aXJlZCB0bwotIAlqdXN0IHNoL1NILCB1c2Ugc3RyY2FzZWNtcC4KLQkoYXJjaF9pbmZvX3N0cnVjdCk6IEFkZCBlbnRyaWVzIGZvciBzaDMgZXQuYWwuCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NoLCAuLi4pOiBEZWZpbmUuCi0KLVdlZCBBdWcgMjcgMTc6MzM6MDcgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChiZmRfYXJjaHVyZXNfbGlzdCk6IEFsd2F5cyBOVUxMIHRlcm1pbmF0ZSB0aGUgbGlzdC4KLQotVHVlIEF1ZyAyNiAxNzoyNjo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtYXJjLmMuCi0JKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZWxmMzItYXJjLmMuCi0JKGVsZjMyLWFyYy5sbyk6IFJlbW92ZSBleHBsaWNpdCBkZXBlbmRlbmN5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGFjaW5jbHVkZS5tNCAoQkZEX0NDX0ZPUl9CVUlMRCk6IFNldCBFWEVFWFRfRk9SX0JVSUxELgotCSogZG9jL01ha2VmaWxlLmFtIChNS0RPQyk6IFVzZSBFWEVFWFRfRk9SX0JVSUxELCBub3QgRVhFRVhULgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXVnIDI1IDE2OjE0OjM0IDE5OTcgIENocmlzdG9waGVyIFByb3Zlbnphbm8gIDxwcm92ZW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGF0ZXN0IGRldm8gYXV0b2NvbmYgZm9yIE5UIHN1cHBvcnQKLQotTW9uIEF1ZyAyNSAxNjoxMTowNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtYXJtLmMgKGNvbXBhdGlibGUpOiBJZiBCIGlzIGEgZGVmYXVsdCB0eXBlLCByZXR1cm4gQS4KLQotTW9uIEF1ZyAyNSAxNTozNTo0NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcHUtdjg1MC5jIChzY2FuKTogTmV3IGZ1bmN0aW9uLgotCShhcmNoX2luZm9fc3RydWN0KTogTmV3IHN0cnVjdHVyZS4KLQkoYmZkX3Y4NTBfYXJjaCk6IEFkZCBsaW5rIGludG8gYXJjaF9pbmZvX3N0cnVjdHVyZS4KLQotCSogY29uZmlnLmJmZCAodGFyZ19jcHUpOiBBbGwgdjg1MCB2YXJpYW50cyB1c2UgdGhlIGJmZF9hcmNoX3Y4NTAKLQlhcmNoaXRlY3R1cmUuCi0KLQkqIGVsZjMyLXY4NTAuYyAodjg1MF9lbGZfb2JqZWN0X3ApOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3Y4NTBlKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGUuCi0KLQkqIGJmZC1pbjIuaCAoYmZkX21hY2hfdjg1MGUpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZS4KLQotCSogZWxmMzItdjg1MC5jIChFTEZfTUFDSElORV9DT0RFKTogRGVmYXVsdCB0byB2ODUwZSBtYWNoaW5lCi0JbnVtYmVyLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIG1hY2hpbmUgbnVtYmVyLgotCi0JKiBhcmNodXJlcy5jIChiZmRfbWFjaF92ODUwZWEpOiBNYWNoaW5lIHZhbHVlIGZvciB2ODUwZWEuCi0KLQkqIGJmZC1pbjIuaCAoYmZkX21hY2hfdjg1MGVhKTogTWFjaGluZSB2YWx1ZSBmb3Igdjg1MGVhLgotCi0JKiBlbGYzMi12ODUwLmMgKEVMRl9NQUNISU5FX0NPREUpOiBEZWZhdWx0IHRvIHY4NTBlYSBtYWNoaW5lCi0JbnVtYmVyLgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSBtYWNoaW5lIG51bWJlci4KLQotTW9uIEF1ZyAyNSAxNDowNzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUpOiBDbGVhciB0aGUKLSAJY2FjaGVkX3N0YWIgZmllbGQgaWYgdGhlIG9mZnNldCBwcmV2ZW50cyB1cyBmcm9tIHVzaW5nIHRoZSBjYWNoZS4KLQotTW9uIEF1ZyAyNSAxMjowODoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZKHZlYykpOiBBZGQgU0VDX0NPREUgYW5kIFNFQ19EQVRBIHRvIHNlY3Rpb24KLQlmbGFncy4KLQkqIGFvdXQtYXJtLmMgKGFvdXRfYXJtX2xpdHRsZV92ZWMpOiBMaWtld2lzZS4KLQkoYW91dF9hcm1fYmlnX3ZlYyk6IExpa2V3aXNlLgotCSogYm91dC5jIChiX291dF92ZWNfYmlnX2hvc3QpOiBMaWtld2lzZS4KLQkoYl9vdXRfdmVjX2xpdHRsZV9ob3N0KTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKGFvdXRfbWlwc19saXR0bGVfdmVjKTogTGlrZXdpc2UuCi0JKGFvdXRfbWlwc19iaWdfdmVjKTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgMTkgMTA6MDk6MTAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoQ09GRl9BTElHTl9JTl9TRkxBR1MpOiBEZWZpbmUgdG8gMS4KLQkqIGNvZmZjb2RlLmggKHN0eXBfdG9fc2VjX2ZsYWdzKTogSWdub3JlIGluY29taW5nIFNUWVBfSU5GTwotCWJpdCBpbiBzX2ZsYWdzIGlmIENPRkZfQUxJR05fSU5fU19GTEFHUyBpcyBkZWZpbmVkLgotCi1UdWUgQXVnIDE5IDA4OjQ3OjE3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWk5NjAuYyAoQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUik6IERlZmluZSB0byAxLgotCShHRVRfU0NOSERSX0FMSUdOLCBQVVRfU0NOSERSX0FMSUdOKTogRGVmaW5lLgotCSogY29mZi1tODhrLmMgKEdFVF9TQ05IRFJfTlJFTE9DLCBHRVRfU0NOSERSX05MTk5PKTogRGVmaW5lLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYWxpZ25tZW50X2hvb2spOiBDb25kaXRpb25hbGx5IGNvbXBpbGUgaW4gaWYKLQlDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSIGlzIGRlZmluZWQuICBDb252ZXJ0IGFsaWdubWVudCB0byBwb3dlcgotCW9mIHR3byBmb3IgSTk2MCBvbmx5LgotCSogY29mZnN3YXAuaCAoR0VUX1NDTkhEUl9OUkVMT0MsIFBVVF9TQ05IRFJfTlJFTE9DLCBHRVRfU0NOREhSX05MTk5PLAotCVBVVF9TQ05IRFJfTkxOTk8sIEdFVF9TQ05IRFJfRkxBR1MsIFBVVF9TQ05IRFJfRkxBR1MpOiBQcm92aWRlCi0JZGVmYXVsdCBkZWZpbml0aW9ucy4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IFVzZSBHRVRfU0NOSERSX0ZMQUdTLCBHRVRfU0NOSERSX05SRUxPQywKLQlHRVRfU0NOSERSX05MTk5PLCBhbmQgR0VUX1NDTkhEUl9BTElHTi4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgUFVUX1NDTkhEUl9GTEFHUywgUFVUX1NDTkhEUl9BTElHTi4KLQkqIE1ha2VmaWxlLmluIChjb2ZmLXRpYzgwLm8pOiBEZXBlbmRzIHVwb24gY29mZnN3YXAuaC4KLQkqIGNvZmYtdGljODAuYyAoQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUik6IERlZmluZSB0byAxLgotCShHRVRfU0NOSERSX0ZMQUdTLCBQVVRfU0NOSERSX0ZMQUdTKTogRGVmaW5lCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IFNldCBhbGlnbm1lbnQgZmllbGQgaW4KLSAJc2VjdGlvbiBoZWFkZXIgZm9yIFRJQzgwQ09GRiBmaWxlcy4KLQotTW9uIEF1ZyAxOCAxMTozNjoxOSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2hvd3RvX3RhYmxlLCB2ODUwX2VsZl9yZWxvY19tYXAsCi0Jdjg1MF9lbGZfY2hlY2tfcmVsb2NzLCB2ODUwX2VsZl9yZWxvYywKLQl2ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlKTogIEFkZCBzdXBwb3J0IGZvcgotCUJGRF9SRUxPQ19WODUwXzE2X1BDUkVMIHJlbG9jYXRpb24uCi0KLQkqIHJlbG9jLmMgKENPTU1FTlQpOiBBZGQgc3V1cG9ydCBmb3IgQkZEX1JFTE9DX1Y4NTBfMTZfUENSRUwKLQlyZWxvY2F0aW9uLgotCi0JKiBsaWJiZmQuaDogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMIHJlbG9jYXRpb24uCi0KLQkqIGJmZC1pbjIuaDogQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19WODUwXzE2X1BDUkVMIHJlbG9jYXRpb24uCi0KLU1vbiBBdWcgMTggMTE6MzM6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTBlOiBOZXcgZmlsZS4KLQotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLQkqIGJmZC1pbjIuaCAoYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLQkqIGFyY2h1cmVzLmM6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMTE6MzM6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LXY4NTBlYTogTmV3IGZpbGUuCi0KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotCSogYmZkLWluMi5oIChiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi0JKiBhcmNodXJlcy5jOiBBZGQgc3VwcG9ydCBmb3Igdjg1MGVhIHRhcmdldC4KLQotRnJpIEF1ZyAxNSAxMjowMToyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IENvcnJlY3RseSBoYW5kbGUgdGhlIG9mZnNldAotCWFyZ3VtZW50IGFzIHNlY3Rpb24gcmVsYXRpdmUsIHJhdGhlciB0aGFuIGFuIGFic29sdXRlIGFkZHJlc3MuCi0JRnJvbSBKYW4gSG9vZ2VucmFhZCA8aG9vZ2VucmRAbmF0bGFiLnJlc2VhcmNoLnBoaWxpcHMuY29tPi4KLQotRnJpIEF1ZyAxNSAwNDo1ODowMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChhcmMtKi1lbGYqKTogQWRkLgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfe2xpdHRsZSxiaWd9YXJjX3ZlYyk6IEFkZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmFtIChBTExfTUFDSElORVMpOiBBZGQgY3B1LWFyYy5sby4KLQkoQkZEMzJfQkFDS0VORFMpOiBBZGQgZWxmMzItYXJjLmxvLgotCShjcHUtYXJjLmxvLGVsZjMyLWFyYy5sbyk6IEFkZCBydWxlcyBmb3IuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGFyY2h1cmVzLmMgKGFyY2hpdGVjdHVyZSBsaXN0KTogQWRkIGJmZF9hcmNoX2FyYy4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX2FyY19hcmNoLgotCShiZmRfbWFjaF9hcmNfYmFzZSk6IERlZmluZS4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMLEJGRF9SRUxPQ19BUkNfQjI2KTogQWRkLgotCSogdGFyZ2V0cy5jIChiZmRfZWxmMzJfe2xpdHRsZSxiaWd9YXJjX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdCk6IEFkZCB0aGVtLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNwdS1hcmMuYywgZWxmMzItYXJjLmM6IE5ldyBmaWxlcy4KLQkqIGVsZi5jIChwcmVfaGVhZGVycyk6IFJlY29nbml6ZSBiZmRfYXJjaF9hcmMuCi0KLVR1ZSBBdWcgMTIgMTE6NDU6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBJZiBubyBzeW1ib2xzLCBtYWtlIHN1cmUgdGhlCi0JZGF0YSBzZWN0aW9uIGlzIGNvcnJlY3RseSByb3VuZGVkIHRvIGEgcGFnZSBpbiB0aGUgZmlsZS4KLQotTW9uIEF1ZyAxMSAxMjo0NTo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxmaW5hbF9saW5rKSk6IERvbid0IGVtaXQgdGhlIHN0cmluZyB0YWJsZSBpZgotCXRoZXJlIGFyZSBubyBzeW1ib2xzLgotCi1TdW4gQXVnIDEwIDE0OjQ1OjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zdGdvMzIuYzogUmVuYW1lIGZyb20gY29mZi1zdHViZ28zMi5jIHRvIGF2b2lkIG9sZCBTeXN0ZW0gVgotCWZpbGUgc3lzdGVtIDE0IGNoYXJhY3RlciBsaW1pdC4KLQkqIE1ha2VmaWxlLmFtLCBjb25maWd1cmUuaW46IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBdWcgIDggMTg6MzQ6MzYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogKEFMTF9NQUNISU5FU19DRklMRVMpOiBBZGQgZWxmMzItZDEwdi5jLgotCVJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDYgMTg6NTY6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoZG9jZGlyKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBBdWcgIDUgMjM6MDU6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLjEuCi0KLU1vbiBBdWcgIDQgMTI6MDA6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UgcGF0Y2hlcy4KLQotU3VuIEF1ZyAgMyAwODoxNToxMiAxOTk3ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHJzNjAwMC1jb3JlLmMgKG1ha2VfYmZkX2FzZWN0aW9uKTogIE5ldyBmdW5jdGlvbiB0byBhZGQgYSBzZWN0aW9uCi0JdG8gdGhlIGNvcmUgZmlsZSBiZmQuCi0JKHJzNjAwMGNvZmZfY29yZV9wKTogIFVzZSBtYWtlX2JmZF9hc2VjdGlvbiB0byBhZGQgdGhlIGNvcmUgZmlsZQotCXNlY3Rpb25zLgotCVVzZSBCRkQgcm91dGluZXMgdG8gc2VlaywgcmVhZCBhbmQgc3RhdCB0aGUgY29yZSBmaWxlLgotCUhhbmRsZSAuZGF0YSBzZWN0aW9ucyBmcm9tIGxvYWRlZCBvYmplY3RzIGFuZCBhbm9ueW1vdXNseSBtbWFwcGVkCi0JcmVnaW9ucywgdGhlc2UgYXJlIGF2YWlsYWJsZSBpbiBBSVggNCBjb3JlIGZpbGVzLgotCi1GcmkgQXVnICAxIDEyOjU4OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgotCSogYWNpbmNsdWRlLm00OiBNb3ZlIGFjbWFjcm9zLm00IGluIGhlcmUuICBSZW1vdmUgQU1fUFJPR19MSUJUT09MCi0JY29weTsgdXNlIGEgcGF0Y2hlcyBsaWJ0b29sIGluc3RlYWQuCi0JKiBhY21hY3Jvcy5tNDogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEp1bCAzMSAxOTo1NTozNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBOZXcgZmlsZSwgYmFzZWQgb24gb2xkIE1ha2VmaWxlLmluLgotCSogYWNtYWNyb3MubTQ6IE5ldyBmaWxlLCBjb3BpZWQgZnJvbSBvbGQgYWNsb2NhbC5tNC4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlIHNoYXJlZCBsaWJyYXJ5Ci0JaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlIEFDX0NPTkZJR19IRUFERVIgd2l0aAotCUFNX0NPTkZJR19IRUFERVIuICBSZXBsYWNlIEFDX1BST0dfSU5TVEFMTCB3aXRoIEFNX1BST0dfSU5TVEFMTC4KLQlDYWxsIEFNX01BSU5UQUlORVJfTU9ERSwgQU1fQ1lHV0lOMzIsIGFuZCBBTV9FWEVFWFQuICBDaGFuZ2UgYWxsCi0JLm8gZmlsZXMgdG8gLmxvLiAgUmVtb3ZlIHN0YW1wLWggaGFuZGxpbmcgaW4gQUNfT1VUUFVULgotCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFIGFuZCBWRVJTSU9OLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBkZXAtaW4uc2VkOiBDaGFuZ2UgLm8gdG8gLmxvLgotCSogTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCSogVkVSU0lPTjogUmVtb3ZlLgotCi1UaHUgSnVsIDMxIDEyOjA5OjIwIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IERvbid0IHNldCBURVhUUkVMCi0gCWlmIHRoZXJlIGlzIG9ubHkgYSByZWxvY2F0aW9uIHRvIGEgcmVhZC1vbmx5IGJ1dCBub3QgYWxsb2NhdGFibGUKLSAJc2VjdGlvbiAobGlrZSAuc3RhYikuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBDb3JyZWN0IHZhcmlvdXMgY29tbWVudHMuCi0JKHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogVGhlc2Ugc2VjdGlvbnMgYXJlIG5vdAotCWNyZWF0ZWQgYnkgdGhlIGxpbmtlciAodGhhdCBpcywgdGhleSBhcmUgY3JlYXRlZCBieSB0aGUgdXNlcgotCXB1dHRpbmcgZGF0YSBpbiB0aGVtKS4gSW4gcGFydGljdWxhciwgdGhleSBjYW4gYmUgdGhlIHNvdXJjZQotCWFuZCB0YXJnZXQgb2YgcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogQ2hlY2sgcG9zdGNvbmRpdGlvbiBvZgotIAliZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wuICBBbGlnbiAxNi1ieXRlIGNvbW1vbgotIAlvYmplY3RzIChmb3IgaW5zdGFuY2UsICdsb25nIGRvdWJsZScpIHRvIDE2LWJ5dGUgYm91bmRhcmllcy4KLQkocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBNYWtlIHRoZSBjb2RlIHRoYXQgZ2VuZXJhdGVzCi0Jc2VjdGlvbiBzeW1ib2xzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yIHNwYXJjLCByZWR1Y2luZyB0aGUKLQludW1iZXIgb2Ygc2VjdGlvbiBzeW1ib2xzIG91dHB1dC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBDaGVjayBwb3N0Y29uZGl0aW9uIG9mCi0JYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sLiAgTWFrZSBkZWZhdWx0IGNhc2UgdGhlCi0Jc2FtZSBhcyBjb3JyZXNwb25kaW5nIGNvZGUgZm9yIHNwYXJjLCBmaXhpbmcgYnVnIGludm9sdmluZwotCS5yZWxhLnN0YWJzLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEZpeCBjYXNlIGludm9sdmluZyBHT1Qgc3ltYm9scwotIAlmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiB2ZXJzaW9uaW5nIChieSByZXBsaWNhdGluZwotIAljb3JyZXNwb25kaW5nIGNoYW5nZSBpbiBzcGFyYykuICBUcmVhdCBSX1BQQ19SRUxBVElWRSBSRUxBIHJlbG9jcwotIAlhcyB1c3VhbCBpbiBFTEYsIG5vdCBhcyBwc2V1ZG8tUkVMIHJlbG9jcyAoYXMgdGhlIHNwYXJjIGxpbmtlcgotIAlkb2VzKS4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQWRkIGhhbmR5IGRlYnVnZ2luZyBjb2RlIGZvciB3aGVuCi0gCWFzc2VydGlvbiBmYWlscy4gIEFkZCBzb21lIG1vcmUgJ3N5bWJvbCBtYWRlIGxvY2FsIGJlY2F1c2Ugb2YKLSAJdmVyc2lvbmluZycgY2FzZXMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDb3BlIHdpdGggYWRkZW5kIHdoZW4KLQlwcm9jZXNzaW5nIGEgR09UIHJlbG9jYXRpb24gYXMgcmVxdWlyZWQgYnkgQUJJLgotCi1XZWQgSnVsIDMwIDIxOjMwOjM1IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixyZWNvcmRfbGlua19hc3NpZ25tZW50KSk6IFJlbW92ZSBhbnkKLQl2ZXJzaW9uIGluZm8gaWYgdGhpcyBzeW1ib2wgY2FtZSBmcm9tIGEgZHluYW1pYyBvYmplY3QuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFNldCB0aGUgdmVyc2lvbiBpbmZvIG9mIGEgc3ltYm9sCi0Jb25seSBpZiB0aGUgb2JqZWN0IGFjdHVhbGx5IGNvbnRhaW5zIHZlcnNpb24gZGVmaW5pdGlvbnMgYW5kCi0JZGVmaW5lcyB0aGlzIHN5bWJvbC4KLQotTW9uIEp1bCAyOCAxODowNzo0MyAxOTk3ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBBZGQgQ1lHV0lOIGFuZCBFWEVFWFQgYXV0b2NvbmYgbWFjcm9zLgotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogVXNlIENZR1dJTiBhbmQgRVhFRVhUIGF1dG9jb25mIG1hY3JvIHRvIGxvb2sgZm9yCi0gICAgICAgIHdpbjMyIGRlcGVuZGVuY2llcy4KLSAgICAgICAgKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xMi4KLSAgICAgICAgKiBkb2MvTWFrZWZpbGUuaW46IEFkZCAkKEVYRUVYVCkgdG8gY2hldyBleGVjdXRhYmxlLgotCi1Nb24gSnVsIDI4IDAyOjUwOjI5IDE5OTcgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogcnM2MDAwLWNvcmUuYyAocnM2MDAwY29mZl9jb3JlX3ApOiAgSWYgQ09SRV9UUlVOQyBpcyBzZXQsIHByaW50Ci0JYSB3YXJuaW5nIHJhdGhlciB0aGFuIHJldHVybmluZyBhbiBlcnJvci4KLQotU3VuIEp1bCAyNyAxOTo1NDoxNCAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBhZGQgc2VtaWNvbG9uIHRvIG1ha2UgTVNWQyBoYXBweS4KLQotRnJpIEp1bCAyNSAxNDo1MDowOCAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGNpc2NvLWNvcmUuYzogZGVmaW5lIHNpZ25hbHMgZm9yIHdpbmdkYi4KLQotRnJpIEp1bCAyNSAxNjoyNzowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmbGluay5jIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSk6IE9ubHkgbWVyZ2UgZmlsZXMgd2l0aAotCXRoZSBzYW1lIG51bWJlciBvZiBhdXggZW50cmllcy4KLQotRnJpIEp1bCAyNSAwODoyMjoxNSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSk6IFVzZSBSX0RBVEFfRVhQUiBmb3IgdGhlCi0JZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpZiB0aGUgcmVsb2NhdGlvbiBzaXplIGlzIDMyIGJpdHMuCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9EQVRBX0VYUFIuCi0KLVdlZCBKdWwgMjMgMTY6MDg6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLWkzODYuYyAoY29mZl9pMzg2X3JlbG9jKTogRG9uJ3Qgb2Zmc2V0IGEgY29tbW9uIHN5bWJvbCBieQotCWl0cyB2YWx1ZSBpZiBDT0ZGX1dJVEhfUEUgaXMgZGVmaW5lZC4KLQotVHVlIEp1bCAyMiAxNzoxOTo0NSAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGNvZmYtc3R1YmdvMzIuYzogTmV3IGZpbGUuCi0JKiBnbzMyc3R1Yi5oOiBOZXcgZmlsZS4KLQkqIGNvZmYtaTM4Ni5jOiBJZiBDT0ZGX0dPMzJfRVhFLCBpbmNsdWRlIGNvZmYvZ28zMmV4ZS5oLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBJbnZva2UKLQlDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BSRSBhbmQgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUIGlmIHRoZXkKLQlhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogSW52b2tlIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9hdXhfaW4pOiBJbnZva2UgQ09GRl9BREpVU1RfQVVYX0lOX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IEludm9rZSBDT0ZGX0FESlVTVF9BVVhfT1VUX1BSRSBhbmQKLQlDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QgaWYgdGhleSBhcmUgZGVmaW5lZC4KLQkoY29mZl9zd2FwX3Njbmhkcl9pbik6IEludm9rZSBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUFJFIGFuZAotCUNPRkZfQURKVVNUX1NDTkhEUl9JTl9QT1NUIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogSW52b2tlIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUFJFIGFuZAotCUNPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVCBpZiB0aGV5IGFyZSBkZWZpbmVkLgotCSogdGFyZ2V0cy5jIChnbzMyc3R1YmJlZGNvZmZfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgZ28zMnN0dWJiZWRjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoZ28zMmNvZmZfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGdvMzJzdHViYmVkY29mZl92ZWMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQgKGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKTogTmV3IHRhcmdldC4KLQkoaVszNDU2XTg2LSotZ28zMiopOiBDaGFuZ2UgdG8gYmUgbGlrZSBuZXcgbXNkb3NkamdwcCouCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXN0dWJnbzMyLm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBjb2ZmLXN0dWJnbzMyLmMuCi0JKEhGSUxFUyk6IEFkZCBnbzMyc3R1Yi5oLgotCi1UdWUgSnVsIDIyIDE1OjA5OjEyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgZmRvcGVuLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiBDaGVjayBIQVZFX0ZET1BFTiByYXRoZXIgdGhhbiBWTVMgb3IKLQlfX0dPMzJfXy4gIFJlaW5kZW50IGEgYml0LgotCi1TdW4gSnVsIDIwIDIwOjA1OjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgU0VDX0xJTktFUl9DUkVBVEVECi0JZmxhZyBmb3IgbmV3bHkgY3JlYXRlZCBzZWN0aW9ucy4KLQkoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGRpc2NhcmQgbmV3bHkgY3JlYXRlZCBzZWN0aW9ucwotCWlmIHNoYXJlZCBsaWJyYXJ5IGlzIGR5bm9iai4KLQotTW9uIEp1bCAxNCAxNTozMzo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBXaGVuIGNoZWNraW5nIHdoZXRoZXIKLQlpbmNsdWRpbmcgYSBzZWN0aW9uIGluIGEgc2VnbWVudCB3b3VsZCBmb3JjZSB1cyB0byBza2lwIGEgcGFnZSwKLQlhbGlnbiB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBzZWdtZW50IHRvIGF2b2lkIHdyYXBhcm91bmQKLQlwcm9ibGVtcy4KLQotVHVlIEp1bCAgOCAxMjoxMToyOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJbml0aWFsaXplCi0gCXRhcmdldCBpZCBmaWVsZCB0byBUSUM4MF9UQVJHRVRfSUQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfZmlsZWhkcl9vdXQpOiBTd2FwIG91dCB0YXJnZXQgaWQgZmllbGQKLSAJaWYgdXNlZC4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBTd2FwIGluIHRhcmdldCBpZCBmaWVsZCBpZiB1c2VkLgotCi1Nb24gSnVsICA3IDE2OjQxOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbgotCWlmIFRBUkdFVF9VTkRFUlNDT1JFLgotCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lIGlmIFRBUkdFVF9VTkRFUlNDT1JFLgotCShpMzg2Y29mZl92ZWMpOiBBZGQgU0VDX0NPREUgYW5kIFNFQ19EQVRBIHRvIHNlY3Rpb25fZmxhZ3MuCi0KLU1vbiBKdW4gMzAgMTQ6Mjk6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tNjhrLmMgKGhvd3RvX3RhYmxlKTogVXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBub3QKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGZvciAzMiBiaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLVRodSBKdW4gMjYgMDE6MjY6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IFdoZW4gYSB2ZXJzaW9uCi0JaW5kaXJlY3Rpb24gc3ltYm9sIGlzIG92ZXJyaWRkZW4sIG1ha2UgdGhlIG9yaWdpbmFsIHN5bWJvbCBwb2ludAotCWF0IHRoZSByZWFsIG92ZXJyaWRpbmcgc3ltYm9sLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbik6IENoZWNrIGZvciBhbiBpbnZhbGlkCi0Jc3RyaW5nIGluZGV4LgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBVc2UgdGhlIHJpZ2h0IHNlY3Rpb24gZm9yIGEKLQljb21tb24gc3ltYm9sLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IElmIGEgY29tbW9uCi0Jc3ltYm9sIHdhcyBpbiAuc2NvbW1vbiwgbWFyayBpdCBhcyBTSE5fTUlQU19TQ09NTU9OLgotCi1XZWQgSnVuIDI1IDEyOjQzOjEwIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX21lcmdlX3N5bWJvbHMpOiBSZXNvbHZlIGluZGlyZWN0IGFuZCB3YXJuaW5nCi0Jc3ltYm9scyBiZWZvcmUgY2hlY2tpbmcgZm9yIG5ldyBzeW1ib2xzLgotCi0JKiBlbGZjb3JlLmggKGVsZl9jb3JlZmlsZV9ub3RlKTogTW92ZSBvdXQgb2YgSEFWRV9TWVNfUFJPQ0ZTX0guCi0KLVR1ZSBKdW4gMjQgMTE6MjA6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfb2JqZWN0X3ApOiBSZWFkIHRoZSBmX29wdGhkciBieXRlcyBmcm9tIHRoZQotCWZpbGUsIG5vdCBhb3V0c3ogYnl0ZXMgKHRoZXkgYXJlIGRpZmZlcmVudCBpbiBYQ09GRiAubyBmaWxlcykuCi0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogUGVybWl0IHN5bWJvbHMgdG8gYmUKLQlyZWRlZmluZWQgYnkgb2JqZWN0cyBpbmNsdWRlZCBmcm9tIGFyY2hpdmVzLgotCi1Nb24gSnVuIDIzIDE4OjAzOjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbWVyZ2Vfc3ltYm9sKTogSW4gdGhlIGNhc2Ugb2YgYSBuZXcgZGVmaW5lZAotCXN5bWJvbCBvdmVycmlkaW5nIGFuIG9sZCBkZWZpbmVkIHN5bWJvbCwgcmV0dXJuIHRoZSBoYXNoIHRhYmxlCi0JZW50cnkgd2hpY2ggd2UgbW9kaWZ5LCBldmVuIGlmIGl0IGlzIHRoZSB0YXJnZXQgb2YgYW4KLQlpbmRpcmVjdGlvbi4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgdGhlIHJlYWwgbmFtZSBvZiB0aGUgc3ltYm9sIGdldHMKLQlvdmVycmlkZGVuLCBjb252ZXJ0IHRoZSB2ZXJzaW9uZWQgc3ltYm9sIGludG8gYW4gaW5kaXJlY3Qgc3ltYm9sCi0JdG8gdGhlIHJlYWwgc3ltYm9sLgotCi0JKiBlbGZsaW5rLmggKGVsZl9tZXJnZV9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0JZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLgotCShlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBDYWxsIGl0LgotCi1TdW4gSnVuIDIyIDE5OjQwOjU3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1pMzg2LmMgKGkzY29mZl9vYmplY3RfcCk6IElmIENPRkZfSU1BR0VfV0lUSF9QRSwgaGFjayB0bwotCWhhbmRsZSBjYXNlIHdoZXJlIENPRkYgZmlsZWhkciBkb2VzIG5vdCBpbW1lZGlhdGVseSBmb2xsb3cgUEUKLQloZWFkZXIuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfb2JqZWN0X3ApOiBSZW1vdmUgdXNlbGVzcyBzZWVrIHRvIGN1cnJlbnQKLQlsb2NhdGlvbi4KLQotV2VkIEp1biAxOCAxOTowMzozOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChsaW5rX2FjdGlvbik6IENoYW5nZSBDT01NT05fUk9XL2luZHIgdG8gZnJvbSBDUkVGIHRvCi0JUkVGQy4KLQotVHVlIEp1biAxNyAxMTo1NTowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IElmIHN0cmlwcGluZyBkZWJ1Z2dpbmcKLQlzeW1ib2xzLCBza2lwIE5fQUJTIHN5bWJvbHMgd2l0aCBkZWJ1Z2dpbmcgc3RvcmFnZSBjbGFzc2VzLgotCi1Nb24gSnVuIDE2IDE4OjU2OjI3IDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBlbWl0IFJfUFBDX1JFTCoKLQlyZWxvY3MgaW4gc2hhcmVkIGxpYnJhcmllcyB3aGljaCByZWZlciB0byBsb2NhbCBzeW1ib2xzLiAgQ29wZQotCXdpdGggYWRkZW5kIHdoZW4gcHJvY2Vzc2luZyBhIEdPVCByZWxvY2F0aW9uLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGNyZWF0ZSBzeW1ib2xzCi0JZm9yIHNlY3Rpb25zIHRoYXQgdGhlIGxpbmtlciBkaWRuJ3QgY3JlYXRlLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogT25seSB0cnkgdG8gd3JpdGUgb3V0IGEgc2VjdGlvbgotCXN5bWJvbCBpZiBpdCB3YXMgY3JlYXRlZCBpbiBwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29tcGxhaW4gaWYgd2UgaGF2ZSB0byBnZW5lcmF0ZSBhIHJlbG9jCi0JcmVsYXRpdmUgdG8gYSBzZWN0aW9uIGZvciB3aGljaCB3ZSBkaWRuJ3Qgb3V0cHV0IGEgc3ltYm9sLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBDbGVhbiB1cC4gIFBMVAotCXJlbG9jcyBhcmUgJ3JlbGEnIHJlbG9jcywgbGlrZSBldmVyeXRoaW5nIGVsc2UuICAucmVsYS5wbHQgaXMgbm90Ci0JYSByZWFkLW9ubHkgc2VjdGlvbiwgc28gd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWFsLWNhc2UgaXQuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IEVudHJpZXMgaW4gdGhlCi0JLnJlbGEuYnNzIHNlY3Rpb24gYXJlIChvZiBjb3Vyc2UpICdyZWxhJyByZWxvY3Mgbm90ICdyZWwnIHJlbG9jcy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogSW5pdGlhbGlzZSBzcmVsZ290LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBAZ290IG9mZnNldHMgYXJlIDQgZnJvbSBzdGFydCBvZiB0aGUKLQlhY3R1YWwgLmdvdCBzZWN0aW9uLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBUaGUgdGhyZWUgcmVzZXJ2ZWQKLQl3b3JkcyBzdGFydCBmcm9tIHRoZSBzeW1ib2wgJ19HTE9CQUxfT0ZGU0VUX1RBQkxFXycuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6ICcucmVsYScgaXMgNQotCWNoYXJhY3RlcnMsIG5vdCA0LgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBVc2UKLQlfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gdG8gY3JlYXRlIHRoZSBHT1QgcmF0aGVyIHRoYW4KLQlwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbi4gQ3JlYXRlIHRoZSAnLnJlbGEuZ290JyBzZWN0aW9uCi0Jb3Vyc2VsdmVzLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFNldCB1cCBHT1QgcmVsb2NhdGlvbnMgd2hlbiBhCi0Jc3ltYm9sIGhhcyBhIEdPVCBlbnRyeS4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUmVjb3JkIHdoZW4gYSBzeW1ib2wgaXMgdXNlZCB0aHJvdWdoCi0JdGhlIEdPVCwgYW5kIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBHT1QgZm9yIGVhY2ggc3VjaCBzeW1ib2wuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRGVsZXRlIHVudXNlZCAuZ290LnBsdCBzdHVmZi4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBEZWxldGUgdW51c2VkIExJTktFUl9TRUNUSU9OX0dPVAotCXN0dWZmLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9ob3d0b19yYXcpOiBHT1QxNl9IQSByZWxvY3Mgc2hvdWxkIGJlCi0JdHJlYXRlZCBpbiBhIHNpbWlsYXIgd2F5IHRvIEFERFIxNl9IQSByZWxvY3MuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IFBMVFJFTDI0IHJlbG9jcyBkbyBub3QgZ2V0IGNvcGllZCBpbnRvCi0Jc2hhcmVkIG9iamVjdHM7IHRoZSBsaW5rZXIgbXVzdCBkZWFsIHdpdGggdGhlbS4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBTdG9wIHNldHRpbmcKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gdG8gdGhlIHdyb25nIHZhbHVlOyBkZWxldGUgdW51c2VkCi0JTElOS0VSX1NFQ1RJT05fUExUIHN0dWZmLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IERlbGV0ZSB1bnVzZWQgTElOS0VSX1NFQ1RJT05fUExUIHN0dWZmLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogVXNlIEJGRCBjYWxscyB0byBnZXQgR09UCi0Jc2VjdGlvbiwgbm90IEVMRi1zcGVjaWZpYyBjYWxscy4KLQkoZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQpOiBTZXQgdG8gMS4KLQkoZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQpOiBTZXQgdG8gNC4KLQkqIGVsZi1iZmQuaCAoZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCAncGx0X25vdF9sb2FkZWQnIG1lbWJlcgotCWZvciB3aGVuIGxkLnNvIGZpbGxzIGluIHRoZSBQTFQ7IGFuZCAnZ290X3N5bWJvbF9vZmZzZXQnIG1lbWJlci4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBBcHBseQotCXBsdF9ub3RfbG9hZGVkIG1lbWJlci4KLQkoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogQXBwbHkgZ290X3N5bWJvbF9vZmZzZXQuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfcGx0X25vdF9sb2FkZWQpOiBTZXQgZGVmYXVsdCB0bwotCSdsb2FkZWQnLgotCShlbGZfYmFja2VuZF9HX09fVF9vZmZzZXQpOiBTZXQgZGVmYXVsdCB0byAwLgotCShlbGZOTl9iZWQpOiBTZXQgYWRkZWQgZmllbGRzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBXYXMgc2V0dGluZwotCURUX1JFTEVOVCBpbiBzaGFyZWQgb2JqZWN0czsgc2hvdWxkIGJlIERUX1JFTEFFTlQuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBQcm9wYWdhdGUKLQlSX1BQQ19BRERSMTZfSEEgcmVsb2NzIHRvIHNoYXJlZCBvYmplY3RzLiBDb3BlIHdpdGggY2FzZSB3aGVyZQotCXN1Y2ggYSByZWxvYyAoaW4gYSBub24tc2hhcmVkIG9iamVjdCkgcmVmZXJzIHRvIGEgc3ltYm9sIHRoYXQncwotCW5vdCBkZWZpbmVkLgotCi1Nb24gSnVuIDE2IDE0OjQyOjE0IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGVsZmNvZGUuaCAocHV0X3NpZ25lZF93b3JkKTogRGVmaW5lLgotCShnZXRfc2lnbmVkX3dvcmQpOiBEZWZpbmUuCi0JKGVsZl9zd2FwX3JlbG9jYV9pbik6IFVzZSBnZXRfc2lnbmVkX3dvcmQgZm9yIHRoZSByX2FkZGVuZCBmaWVsZC4KLQkoZWxmX3N3YXBfcmVsb2NhX291dCk6IFVzZSBwdXRfc2lnbmVkX3dvcmQgZm9yIHRoZSByX2FkZGVuZAotCWZpZWxkLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wpOiBVc2UKLQliZmRfZ2V0X3NpZ25lZF8zMiB0byBzZXQgdGhlIHJfYWRkZW5kIGZpZWxkLgotCSogZWxmNjQtbWlwcy5jIChtaXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luKTogVXNlCi0JYmZkX2hfZ2V0X3NpZ25lZF82NCB0byBzZXQgdGhlIHJfYWRkZW5kIGZpZWxkLgotCi1Nb24gSnVuIDE2IDEyOjMxOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogV2hlbiBnZW5lcmF0aW5nIGEKLQlzaGFyZWQgbGlicmFyeSwgZG8gdGhlIHJlbG9jYXRpb24gaWYgdGhlIGlucHV0IHNlY3Rpb24gaXMgbm90Ci0JYWxsb2NhdGVkIGluIG1lbW9yeS4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IENhbGwKLQllbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24gYmVmb3JlIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wuCi0JKGVsZl9maXhfc3ltYm9sX2ZsYWdzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDYWxsIGVsZl9maXhfc3ltYm9sX2ZsYWdzLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBMaWtld2lzZS4gIFBlcm1pdCBhIHN5bWJvbCB0byBiZQotCWZvcmNlZCBsb2NhbCBldmVuIGlmIE5FRURTX1BMVCBpcyBzZXQuICBXaGVuIGZvcmNpbmcgYSBzeW1ib2wgdG8KLQliZSBsb2NhbCwgY2xlYXIgTkVFRFNfUExULgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBiZWQuCi0KLVdlZCBKdW4gMTEgMjI6NDQ6MjAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KTogTmV3IHN0cnVjdHVyZQotCWZvciBkZXJpdmVkIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgUmVmZXJlbmNlcyB0bwotCWVsZl9saW5rX2hhc2hfZW50cnkgY2hhbmdlZCBhcHByb3ByaWF0ZWx5LgotCShlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSk6IE5ldyBzdHJ1Y3R1cmUgZm9yIGRlcml2ZWQgZWxmCi0JbGlua2VyIGhhc2ggdGFibGUuCi0JKGVsZjMyX21uMTAzMDBfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdHJhdmVyc2UpOiBMaWtld2lzZS4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkpOiBMaWtld2lzZS4KLQkobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IEhhbmRsZSAiY2FsbCIgLT4gImNhbGxzIiwgcmVtb3ZhbAotCW9mIHByb2xvZ3VlIGNvZGUsIGFuZCBjYWxsOjMyLT5jYWxsOjE2IHJlbGF4aW5nLgotCShjb21wdXRlX2Z1bmN0aW9uX2luZm86IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9pbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlZmluZS4KLQotV2VkIEp1biAxMSAwMDowMDowNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IENhbGwgZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0JZm9yIGEgc3ltYm9sIHdoaWNoIGlzIGJlaW5nIGZvcmNlZCB0byBiZSBsb2NhbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFdyaXRlIG91dCB0aGUKLQlyZWxvY2F0aW9uIHZhbHVlIGZvciBhIEdPVCByZWxvYyBmb3IgYSBzeW1ib2wgd2hpY2ggaXMgdHVybmluZwotCWludG8gYSBsb2NhbCBzeW1ib2wuCi0JKGVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIGlzIHR1cm5pbmcgaW50byBhCi0JbG9jYWwgc3ltYm9sLCB3cml0ZSBvdXQgYSBSRUxBVElWRSByZWxvYyByYXRoZXIgdGhhbiBhIEdMT0JfREFUCi0JcmVsb2MuCi0JKiBlbGYzMi1tNjhrLmMsIGVsZjMyLXNwYXJjLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogR2V0IHRoZSByZWxvY2F0aW9uCi0JdmFsdWUgaWYgdGhlIHN5bWJvbCBpcyB0dXJuaW5nIGludG8gYSBsb2NhbCBzeW1ib2wuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotMTk5Ny0wNi0xMCAyMjo1OCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQWxzbyByZWFkIHZlcm5lZWQKLQlpbmZvcm1hdGlvbiBieSBjYWxsaW5nIGBfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcycuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEZvciB1bmRlZmluZWQgc3ltYm9scyBsb29rIGZvcgotCXZlcnNpb24gaW5mb3JtYXRpb24gaW4gdGhlIHZlcm5lZWQgcmVjb3Jkcy4KLQkoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIHNvbmFtZSBvZiBzaGFyZWQgb2JqZWN0Ci0JZm9yIHZlcm5lZWQgcmVjb3JkIGlmIGl0IGlzIGF2YWlsYWJsZS4KLQotVHVlIEp1biAxMCAxMToxMzowMyAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjcHUtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvciBjb21wYXRpYmxlIGFuZCBzY2FuLgotCSogY29mZmxpbmsuYzogQWRkIHByb3RvdHlwZSBmb3IgbWFya19yZWxvY3MuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUpOiBDaGFuZ2UgZmlsZW5hbWUgdG8KLQljb25zdCBwb2ludGVyLiAgQWRkIHByb3RvdHlwZS4KLQotTW9uIEp1biAgOSAxMjozNDoyMSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBJZ25vcmUgcmVsb2NhdGlvbnMgb2YKLQlzZWN0aW9ucyB0aGF0IHdpbGwgYmUgZGlzY2FyZGVkLgotCi0xOTk3LTA2LTA2IDIyOjU4ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzKTogV2hlbiBzZWFyY2hpbmcKLQlmb3Iga25vd24gdmVyc2lvbiBzeW1ib2wgc2tpcCBub24tbWF0Y2hpbmcgdmVyZGVmIHJlY29yZHMsIG5vdAotCW1hdGNoaW5nIHJlY29yZHMuCi0KLVRodSBKdW4gIDUgMTU6NTI6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogV3JpdGUgYSBsb25nLAotCW5vdCBhIGJmZF92bWEsIHRvIHRoZSBiYXNlIGZpbGUsIHRvIG1hdGNoIGhvdyBkbGx0b29sIHJlYWRzIGl0LgotCi1UdWUgSnVuICAzIDE2OjU3OjQ1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCB0aHVtYiByZWxvY2F0aW9ucy4KLQotCSogYmZkLWluMi5oOiBBZGQgVGh1bWIgcmVsb2NhdGlvbnMuCi0KLQkqIGxpYmJmZC5oOiBBZGQgVGh1bWIgcmVsb2NhdGlvbnMuCi0KLU1vbiBKdW4gIDIgMTA6NDE6NTIgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNwdS1tNjhrLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBGaXggNjgwNjAgY3B1IG5hbWUuCi0KLUZyaSBNYXkgMzAgMTI6NDY6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBTZXQgZHluaW5keAotCWZvciBhIHNlY3Rpb24gZXZlbiBpZiBpdCBpcyBub3QgbG9hZGVkLgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBJZiBQRSBmaWxlLCBkb24ndCBzdWJ0cmFjdAotCXNlY3Rpb24gVk1BLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBTZXBhcmF0ZSBzZWN0aW9uIFZNQSBoYW5kbGluZyBmb3IKLQlpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogQ2hlY2sgd2hldGhlciBpbnB1dCBmaWxlLAotCW5vdCBvdXRwdXQgZmlsZSwgaXMgYSBQRSBmaWxlLgotCi1XZWQgTWF5IDI4IDE1OjQ4OjQzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYXJtLmM6IChjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBNYWtlIHN0YXRpYy4KLQotV2VkIE1heSAyOCAxNjoxNjowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2MpOiBEb24ndCBqdXN0IGV4aXQgaWYgd2Ugc2VlIGFuCi0JUl9JTUFHRUJBU0UgcmVsb2MuCi0KLVdlZCBNYXkgMjggMDk6NDg6NDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogQWRkIHRlc3QgZm9yIHN1cGVyc2V0cyBvZiBBUk0KLQlhcmNoaXRlY3R1cmVzLgotCi1UdWUgTWF5IDI3IDE5OjQyOjAzIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEluaXRpYWxpemUgZ2xvYmFsX3RvX3N0YXRpYwotCW1lbWJlci4KLQotVHVlIE1heSAyNyAxNDozNDowOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpOiBNYWtlIGdsb2JhbC4gIEl0IGlzCi0JY2FsbGVkIGRpcmVjdGx5IGJ5IGdhcy9jb25maWcvdGMtYXJtLmMuCi0KLVR1ZSBNYXkgMjcgMTU6NTg6NTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKFBMVF9FTlRSWV8qKTogVXNlIGEgbmV3IHRocmVhZC1zYWZlIGZvcm1hdC4KLQkoZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogRmlsbCBpdCBpbiBwcm9wZXJseS4KLQotTW9uIE1heSAyNiAxNDowNToxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBQRSBmaWxlLCBkb24ndCBhZGQKLQlzZWN0aW9uIFZNQS4KLQotTW9uIE1heSAyNiAxMDo1Nzo0OCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogI3VuZGVmIGJlZm9yZSAjZGVmaW5lLgotCShjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBEaXR0by4KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTWFrZSBzdGF0aWMuCi0JKGNvZmZfYXJtX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogRGl0dG8uCi0JKGNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyk6IERpdHRvLgotCShjb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogRGl0dG8uCi0KLUZyaSBNYXkgMjMgMTU6MTQ6NTggMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvKTogQWRkIGJvb2xlYW4KLQlnbG9iYWxfdG9fc3RhdGljIG1lbWJlciBmb3Igc3VwcG9ydCBvZiB0YXNrIGxpbmtpbmcuCi0JKF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMpOiBBZGQgcHJvdG90eXBlLgotCSogbGliY29mZi5oOiBSZWdlbmVyYXRlLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgI2lmZGVmIHRvCi0JY2hlY2sgUlM2MDAwQ09GRl9DLCB0byBiZSBjb25zaXN0ZW50IHdpdGggYWxsIG90aGVyIHVzZXMKLQlpbiB0aGlzIGZpbGUuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IElmIGRvaW5nIHRhc2sgbGlua2luZywKLQljYWxsIF9iZmRfY29mZl93cml0ZV90YXNrX2dsb2JhbHMuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IElmIGRvaW5nIHRhc2sgbGlua2luZywgY29udmVydAotCWdsb2JhbCBmdW5jdGlvbnMgdG8gc3RhdGljLgotCShfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSk6IElmIGRvaW5nIHRhc2sgbGlua2luZywgY29udmVydAotCWdsb2JhbCB2YXJpYWJsZXMgdG8gc3RhdGljLgotCShfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzKTogTmV3IGZ1bmN0aW9uLgotCSogY29mZi10aWM4MC5jIChUSUM4MENPRkYpOiBEZWZpbmUgdGhpcyBpbnN0ZWFkIG9mIGp1c3QgVElDODAuCi0JKENfQVVUT0FSRyk6ICN1bmRlZiBzaW5jZSBpdCBjbGFzaGVzIHdpdGggQ19VRVhULgotCShDX0xBU1RFTlQpOiAjdW5kZWYgc2luY2UgaXQgY2xhc2hlcyB3aXRoIENfU1RBVExBQi4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIFRJQzgwQ09GRgotCXJhdGhlciB0aGFuIFRJQzgwLgotCShjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFVzZSBDX1NZU1RFTS4gIEhpZGUgQ19BVVRPQVJHIHVzZQotCXdoZW4gVElDODBDT0ZGIGRlZmluZWQgKGNsYXNoZXMgd2l0aCBDX1VFWFQpLiAgRXhwbGljaXRseQotCXJlY29nbml6ZSBDX1VFWFQsIENfU1RBVExBQiwgYW5kIENfRVhUTEFCIGFzIHVuc3VwcG9ydGVkLgotCi1GcmkgTWF5IDIzIDEyOjM4OjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MF9ob3d0b190YWJsZSk6IENoYW5nZSBvdmVyZmxvdyBjaGVjayBmb3IgbW9zdAotCVBQIHJlbG9jYXRpb25zIHRvIGNvbXBsYWluX292ZXJmbG93X2RvbnQuCi0KLVRodSBNYXkgMjIgMjA6MjI6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwX2hvd3RvX3RhYmxlKTogQWRkIFBQIHJlbG9jYXRpb25zLiAgQ2hhbmdlCi0JbmFtZSBvZiBSX1JFTExPTkcgdG8gIlJFTExPTkciLiAgU2V0IHJpZ2h0c2hpZnQgYW5kIGNvbXBsYWluIGZvcgotCU1fUFBDUi4KLQkocHBiYXNlX3JlbG9jLCBnbG9iMTVfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoZ2xvYjE2X3JlbG9jLCBsb2NhbDE2X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIGFsbCByZWxvY2F0aW9uIHR5cGVzLgotCShjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUgdG8gY29mZl90aWM4MF9yZWxvY2F0ZV9zZWN0aW9uLgotCSogTWFrZWZpbGUuaW4gKGNvZmYtdGljODAubyk6IERlcGVuZHMgdXBvbiBpbmNsdWRlL2NvZmYvdGljODAuaC4KLQotV2VkIE1heSAyMSAxNzoxNTo1MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKTogSWYgQ09GRl9XSVRIX1BFIG9yCi0JQ09GRl9JTUFHRV9XSVRIX1BFLCBkb24ndCBzdWJ0cmFjdCB0aGUgc2VjdGlvbiBWTUEgZnJvbSB0aGUgc3ltYm9sCi0JdmFsdWUuCi0JKiBjb2ZmZ2VuLmMgKGZpeHVwX3N5bWJvbF92YWx1ZSk6IEFkZCBhYmZkIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgSWYgUEUgZmlsZSwgZG9uJ3QgYWRkIHNlY3Rpb24gVk1BLgotCShjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbCk6IElmIFBFIGZpbGUsIGRvbid0IGFkZCBzZWN0aW9uIFZNQS4KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bSk6IExpa2V3aXNlLgotCShfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLQkqIHBlaWNvZGUuaDogQWRkICYgMHhmZmZmZmZmZiB3aGVuIHVzaW5nIEltYWdlQmFzZSBpbiBjYXNlIGJmZF92bWEKLQlpcyA2NCBiaXRzLgotCi1XZWQgTWF5IDIxIDA5OjU4OjEwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKG1hcmtfcmVsb2NzKTogQWRkIG5ldyBmdW5jdGlvbiB0byBtYXJrIHN5bWJvbHMgd2hpY2gKLQlhcmUgdXNlZCBieSByZWxvY2F0aW9ucy4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogQWRkIGNhbGwgdG8gbWFya19yZWxvY3MoKSBhbmQgY29kZSB0bwotCXN1cHByZXNzIHRoZSBza2lwcGluZyBvZiBzeW1ib2xzIHRoYXQgaGF2ZSB0aHVzIGJlZW4gbWFya2VkLgotCi1UdWUgTWF5IDIwIDE4OjQ1OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChzaF9tZXJnZV9wcml2YXRlX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCi1Nb24gTWF5IDE5IDE0OjQ2OjAwIDE5OTcgIE1hcmsgQWxleGFuZGVyICA8bWFya2FAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jOiBSZW1vdmUgdW5uZWNlc3NhcnkgI2lmZGVmcy4KLQkqIGNvbmZpZy5iZmQ6IFNldCB0YXJnX3VuZGVyc2NvcmUgdG8geWVzIGZvciB0aWM4MC4KLQotTW9uIE1heSAxOSAxNDoyNjozNiAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoTkFNRVNfSEFWRV9VTkRFUlNDT1JFKTogRGVmaW5lIChmaXhlcyBwcm9ibGVtCi0Jd2l0aCB1bnJlc29sdmVkIGV4dGVybmFsIHN5bWJvbHMgaW4gR0RCKS4KLQotRnJpIE1heSAxNiAxMDoyMzowMyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZi1tMTAzMDAuYyAoZWxmMzJfbW4xMDMwMF9yZWxheF9zZWN0aW9uKTogUmVhZCBpbiBhbGwKLQl0aGUgc3ltYm9scyBhc3NvY2lhdGVkIHdpdGggZWFjaCBCRkQuCi0JKG1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IERvbid0IGFkanVzdCB0aGUgc2FtZSBzeW1ib2wKLQltb3JlIHRoYW4gb25jZS4KLQkqIGVsZi1tMTAyMDAuYzogTGlrZXdpc2UuCi0JKiBlbGYzMi1tMzJyLmM6IExpa2V3aXNlLgotCSogZWxmMzItc2guYzogTGlrZXdpc2UuCi0KLUZyaSBNYXkgMTYgMTI6MTA6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IERvbid0IGRlY3JlYXNlIHRoZQotCWFsaWdubWVudCBvZiBhIGNvbW1vbiBzeW1ib2wuICBJZiB0d28gc3ltYm9scyB0aGF0IGxvb2sgbGlrZQotCWNvbW1vbiBzeW1ib2xzIGFyZSBmb3VuZCBpbiB0d28gc2hhcmVkIGxpYnJhcmllcywgYW5kIHRoZSBzaXplIGlzCi0JZGlmZmVyZW50LCB1c2UgdGhlIGxhcmdlciBzaXplLCBhbmQgd2FybiBpZiAtLXdhcm4tY29tbW9uLiAgSWYgYQotCWNvbW1vbiBzeW1ib2wgb3ZlcnJpZGVzIGEgZGVmaW5pdGlvbiBpbiBhIHNoYXJlZCBsaWJyYXJ5LCBzZXQgdGhlCi0Jc2l6ZSB0byB0aGUgbGFyZ2VyIHNpemUsIGFuZCB3YXJuIGlmIC0td2Fybi1jb21tb24uCi0KLVRodSBNYXkgMTUgMTQ6MzE6MjggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY3B1LWFybS5jIChjb21wYXRpYmxlKTogIEFsbG93IGRlZmF1bHQgbWFjaGluZSB0byBiZSBwb2x5bW9ycGhlZAotCWludG8gYW55IG90aGVyIG1hY2hpbmUgdHlwZS4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiAgSW5pdGlhbGlzZSBmbGFncyB2YXJpYWJsZSB0byAwLgotCi0JKiBjb2ZmLWFybS5jIChjb2ZmX2FybV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6ICBXaGVuIG1lcmdpbmcKLQlkYXRhIGludG8gYW4gdW5pdGlhbGlzZWQgZGVzdGluYXRpb24gc2V0IGl0cyBtYWNoaW5lIHR5cGUgYXMgd2VsbC4KLQotVGh1IE1heSAxNSAxNjo0MDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRm9yY2UgRUxGIHN5bWJvbCBzaXplCi0JdG8gY29tbW9uIHN5bWJvbCBzaXplLiAgQ29uc2lzdGVudGx5IHRyZWF0IHVuaW5pdGlhbGl6ZWQgc3ltYm9scwotCWluIHNoYXJlZCBvYmplY3RzIGFzIGNvbW1vbiBzeW1ib2xzLgotCi1GcmkgTWF5ICA5IDEwOjE1OjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFyY2h1cmVzLmMgKGNvbnN0YW50cyk6ICBBZGRlZCBuZXcgY29uc3RhbnRzIHRvIGlkZW50aWZ5IHRoZQotCXR5cGUgb2YgdGhlIEFSTSBhcmNoaXRlY3R1cmU6IGJmZF9tYWNoX2FybV8yLCBiZmRfbWFjaF9hcm1fMmEsCi0JYmZkX21hY2hfYXJtXzMsCWJmZF9tYWNoX2FybV8zTSwgYmZkX21hY2hfYXJtXzQgYW5kIGJmZF9tYWNoX2FybV80VC4KLQotCSogYmZkLWluMi5oIChjb25zdGFudHMpOiAgIEFkZGVkIG5ldyBjb25zdGFudHMgdG8gaWRlbnRpZnkKLQl0aGUgdHlwZSBvZiB0aGUgQVJNIGFyY2hpdGVjdHVyZTogYmZkX21hY2hfYXJtXzIsIGJmZF9tYWNoX2FybV8yYSwKLQliZmRfbWFjaF9hcm1fMywgYmZkX21hY2hfYXJtXzNNLCBiZmRfbWFjaF9hcm1fNCBhbmQKLQliZmRfbWFjaF9hcm1fNFQuICBUaGlzIGZpbGUgaXMgYXV0by1tYWdpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlCi0JYXJjaHVyZXMuYyBmaWxlLiAgVGhpcyB1cGRhdGUgaXMganVzdCB0byBzYXZlIHdvcmsuCi0KLQkqIGNvZmYtYXJtLmMgKGNvZmZfYXJtX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLAotCWNvZmZfYXJtX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLAotCWNvZmZfYXJtX2JmZF9zZXRfcHJpdmF0ZV9mbGFncywKLQljb2ZmX2FybV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQWRkZWQgdGhlc2UgbmV3IGZ1bmN0aW9ucy4KLQkoZ2xvYmFsKTogTWFjcm8gcmVkZWZpbml0aW9ucyBzZXQgdXAgdG8gdXNlIHRoZXNlIG5ldyBmdW5jdGlvbnMuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IEFkZGVkIGNhbGwgdG8KLQljb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MoKS4KLQkoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBBZGRlZCBjb2RlIHRvIHNldCBtYWNoaW5lIHR5cGUgYmFzZWQgb24KLQliaXRzIHN0b3JlZCBpbiBpbnRlcm5hbCBmbGFncy4KLSAgCShjb2ZmX3NldF9mbGFncyk6IEFkZGVkIGNvZGUgdG8gc2V0IHRoZSBuZXcgYml0cyBpbiB0aGUgZmxhZ3MKLQlmaWVsZCBiYXNlZCBvbiB0aGUgbWFjaGluZSBudW1iZXIuCi0JKGZ1bmN0aW9uIGRlZmluaXRpb24gbWFjcm9zKTogTWFkZSBhbGwgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYWNyb3MKLQljb25kaXRpb25hbCBzbyB0aGF0IHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGFyZ2V0IHNwZWNpZmljCi0JZmlsZXMuCi0KLQkqIGNwdS1hcm0uYyAoY29tcGF0aWJsZSk6IEFkZGVkIHRoaXMgZnVuY3Rpb24uICAoYXJjaF9pbmZvX3N0cnVjdCk6Ci0JU3RydWN0dXJlIGV4dGVuZGVkIHRvIGluY2x1ZGUgbmV3IHR5cGVzLCBvbmUgZWFjaCBmb3IgQVJNdjIsCi0JQVJNdjJhLCBBUk12MywgQVJNdjNNLCBBUk12NCBhbmQgQVJNdjRULgotCi0JKiBsaWJjb2ZmLWluLmggKHN0cnVjdCBjb2ZmX3RkYXRhKTogIEFkZGVkIGZsYWdzIGZpZWxkLgotCi1GcmkgTWF5ICA5IDE3OjQwOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotZ251Kik6IERvbid0IGluY2x1ZGUgTWFjaCBzdXBwb3J0LgotCi0JKiBjb25maWcuYmZkOiBDaGFuZ2UgI2lmIDAgYXJvdW5kIHVzZXMgb2YgaG9zdF9hb3V0X3ZlYyB0byAjaWYKLQlIQVZFX2hvc3RfYW91dF92ZWMuCi0KLU1vbiBNYXkgIDUgMTM6NTc6MzIgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IElmIHRoZXJlIGFyZSBubyBzeW1lbnRzLAotCWp1c3QgcmV0dXJuIGZhbHNlLgotCi1Nb24gTWF5ICA1IDE4OjE4OjQ1IDE5OTcgIFBoaWxpcCBCbHVuZGVsbCAgPHBqYjI3QGNhbS5hYy51az4KLQotCSogY29uZmlnLmJmZDogY29wZSB3aXRoICcqLSotbGludXgtZ251YW91dCcgdGFyZ2V0cy4KLQotVGh1IE1heSAgMSAxMTozMToxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdtYXRjaC5zZWQ6IEFkZCBleHBsaWNpdCBcbiBjaGFyYWN0ZXJzIHRvIHdvcmsgYXJvdW5kIGJ1ZyBpbgotCUhQL1VYIDEwLjIwIHNlZCBwcm9ncmFtLgotCi1XZWQgQXByIDMwIDEyOjI3OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IENhc3QgY3NlY3MgdG8gYXZvaWQgc2lnbgotCWV4dGVuc2lvbiBwcm9ibGVtcy4KLQotVHVlIEFwciAyMiAxMjowNjowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkb19tYWludGFpbmVyX2NsZWFuKTogRG9uJ3QgcmVtb3ZlIGJmZC1pbjIuaC4KLQotTW9uIEFwciAyMSAxMToyMTozMSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jOiBGb2xsb3cgdGhlIGxhc3QgY2hhbmdlcyBpbiBlbGYzMi1pMzg2LmM6Ci0JKHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkLCBzdHJ1Y3QKLQllbGZfbTY4a19saW5rX2hhc2hfZW50cnksIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUsCi0JZWxmX202OGtfbGlua19oYXNoX3RyYXZlcnNlLCBlbGZfbTY4a19oYXNoX3RhYmxlLAotCWVsZl9tNjhrX2xpbmtfaGFzaF9uZXdmdW5jLCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlLAotCWVsZl9tNjhrX2Rpc2NhcmRfY29waWVzLCBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOgotCU5ldyBkZWZpbml0aW9ucy4KLQkoZWxmX202OGtfY2hlY2tfcmVsb2NzKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIGRvbid0IGNvcHkKLQlQQyByZWxhdGl2ZSByZWxvY3MgZm9yIGEgZ2xvYmFsIHN5bWJvbCBkZWZpbmVkIGluIGEgcmVndWxhcgotCW9iamVjdCwgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgYW55Ci0JZ2xvYmFsIHN5bWJvbC4KLQkoZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsCi0JdHJhdmVyc2Ugd2l0aCBlbGZfbTY4a19kaXNjYXJkX2NvcGllcy4KLQotU2F0IEFwciAxOSAyMjo1MDoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogT25seSBjb3VudCBQQyByZWxhdGl2ZQotCXJlbG9jcy4gIEZyb20gSmFtaWUgTG9raWVyIDxqYW1pZUByZWJlbGxpb24uY28udWs+LgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IEZvcmNlIHRoZQotCXBvdGVudGlhbCBsYXN0IGJ5dGUgaW4gdGhlIGZpbGUgdG8gYmUgd3JpdHRlbiBvdXQgd2hlbgotCUNPRkZfSU1BR0VfV0lUSF9QRS4KLQotVGh1IEFwciAxNyAxMzo0Njo1NiAxOTk3ICBQZXIgRm9nZWxzdHJvbSAgPHBlZm9Ab3BlbmJzZC5vcmc+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChtaXBzKi0qLW9wZW5ic2QqKTogTmV3IGhvc3QuCi0KLVRodSBBcHIgMTcgMTE6MTA6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IE9ubHkgc3VidHJhY3QgdGhlCi0Jc2VjdGlvbiBWTUEgZnJvbSB0aGUgc3ltYm9sIHZhbHVlIGlmIHRoaXMgaXMgYSBmdWxseSBsaW5rZWQgZmlsZS4KLQotCSogZWxmMzItaTM4Ni5jIChzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSk6IERlZmluZS4KLQkoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSk6IERlZmluZS4KLQkoZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlKTogRGVmaW5lLgotCShlbGZfaTM4Nl9oYXNoX3RhYmxlKTogRGVmaW5lLgotCShlbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgZG9uJ3QgY29weQotCVBDIHJlbGF0aXZlIHJlbG9jcyBmb3IgYSBnbG9iYWwgc3ltYm9sIGRlZmluZWQgaW4gYSByZWd1bGFyCi0Jb2JqZWN0LCBhbmQgY291bnQgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciBhbnkKLQlnbG9iYWwgc3ltYm9sLgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBJZiBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywKLQl0cmF2ZXJzZSB3aXRoIGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzLgotCShlbGZfaTM4Nl9kaXNjYXJkX2NvcGllcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IERlZmluZS4KLQotCUZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogYW91dGYxLmggKE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoc3Vub3M0X2FvdXRfYmFja2VuZCk6IFVzZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MuCi0KLVdlZCBBcHIgMTYgMTI6NDM6MzIgMTk5NyAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoZWxmX2QzMHZfaG93dG9fdGFibGUpOiBDaGFuZ2VkIHNpemUgb2YKLQlSX0QzMFZfMzJfTk9STUFMIHRvIDIgKDQgYnl0ZXMpLgotCi1XZWQgQXByIDE2IDE0OjAyOjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+OgotCSogbmV0YnNkLmggKE5fU0hBUkVEX0xJQik6IERlZmluZS4KLQkoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCSogbTY4a25ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiBEb24ndCBkZWZpbmUgKHJldmVydCBjaGFuZ2Ugb2YKLQlBcHJpbCAxMSkuCi0JKiBzcGFyY25ldGJzZC5jIChUQVJHRVRfUEFHRV9TSVpFKTogRGVmaW5lIGFzIDB4MjAwMC4KLQkoU0VHTUVOVF9TSVpFKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBTZXQgLnJlbGEuYnNzIHNpemUKLQl0byBzaXplb2YgUmVsYSBzdHJ1Y3R1cmUsIG5vdCBzaXplb2YgUmVsIHN0cnVjdHVyZS4gIEZyb20gR2FyeQotCVRob21hcyA8Zy50aG9tYXNAb3Blbmdyb3VwLm9yZz4uCi0KLVR1ZSBBcHIgMTUgMTE6NTA6MzcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBJZiBlbnRyeV9pc190ZXh0X2FkZHJlc3MsIGFkanVzdAotCXdoZW5ldmVyIGVudHJ5IGlzIGxhcmdlciB0aGFuIHRleHQgYWRkcmVzcywgYnV0IG9ubHkgYnkgd2hvbGUKLQlwYWdlcy4gIEZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+LgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlCi0JbWtpbnN0YWxsZGlycyB0byBidWlsZCAkKG9sZGluY2x1ZGVkaXIpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgY2FsbCBjaGVja19yZWxvY3MKLQlpZiB0aGlzIGlzIGEgZGVidWdnaW5nIHNlY3Rpb24gd2hpY2ggd2UgYXJlIHN0cmlwcGluZy4KLQotTW9uIEFwciAxNCAxMjozOTozMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfb2JqZWN0X3ApOiBBbGxvY2F0ZSB0aGUKLQlhbHBoYS1zcGVjaWZpYyB0YXJnZXQgZGF0YSBzdHJ1Y3QuCi0KLU1vbiBBcHIgMTQgMTE6NDU6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogTWFrZWZpbGUuaW46IEFsd2F5cyB1c2UgJChTSEVMTCkgd2hlbiBydW5uaW5nIG1vdmUtaWYtY2hhbmdlLgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAxMSAxNTo0MzoyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IE9ubHkgc3VidHJhY3QgdGhlIHNlY3Rpb24KLQlWTUEgaWYgdGhpcyBpcyBhbiBleGVjdXRhYmxlIGZpbGUgb3IgYSBzaGFyZWQgb2JqZWN0LgotCi0JKiB0YXJnZXRzLmMgKG5ldGJzZF9jb3JlX3ZlYyk6IERlY2xhcmUuICBGcm9tIEdvcmRvbiBXLiBSb3NzCi0JPGd3ckBtYy5jb20+LgotCi0JKiBsaWJhb3V0LmggKHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSk6IEFkZCBlbnRyeV9pc190ZXh0X2FkZHJlc3MKLQlmaWVsZC4KLQkqIGFvdXQtdGFyZ2V0LmggKFNFR01FTlRfU0laRSk6IERlZmluZSB0byBUQVJHRVRfUEFHRV9TSVpFIGF0IHRoZQotCXN0YXJ0IG9mIHRoZSBmaWxlLiAgUmVtb3ZlIHVzZXMgbGF0ZXIgb24gd2hpY2ggc3dpdGNoIHVzaW5nCi0JaWZkZWYuCi0JKE1ZKGNhbGxiYWNrKSk6IEhhbmRsZSBlbnRyeV9pc190ZXh0X2FkZHJlc3MuCi0JKE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoTVkoYmFja2VuZF9kYXRhKSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogYW91dGYxLmggKHN1bm9zNF9hb3V0X2JhY2tlbmQpOiBMaWtld2lzZS4KLQkqIGkzODZhb3V0LmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIGkzODZtYWNoMy5jIChNWShiYWNrZW5kX2RhdGEpKTogTGlrZXdpc2UuCi0JKiBtaXBzYnNkLmMgKE1ZKGJhY2tlbmRfZGF0YSkpOiBMaWtld2lzZS4KLQkqIHNwYXJjbHlueC5jIChzcGFyY2x5bnhfYW91dF9iYWNrZW5kKTogTGlrZXdpc2UuCi0JKiBuZXRic2QuaCAoU0VHTUVOVF9TSVpFKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MpOiBEZWZpbmUuCi0JKiBtNjhrbmV0YnNkLmMgKFNFR01FTlRfU0laRSk6IERlZmluZSBhcyAweDIwMDAwLgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBIYW5kbGUgaW1wb3J0aW5nIGEgc3ltYm9sCi0Jd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBgLicuCi0KLUZyaSBBcHIgMTEgMTE6NTc6MTUgMTk5NyAgTmlrbGFzIEhhbGxxdmlzdCAgPG5pa2xhc0BhcHBsaS5zZT4KLQotCSogY29uZmlnLmJmZDogKGlbMzQ1Nl04Ni0qLW9wZW5ic2QqLCBtNjgqLSotb3BlbmJzZCosCi0JbWlwcyplbCotKi1vcGVuYnNkKiwgbWlwcyotKi1vcGVuYnNkKiwgbnMzMmstKi1vcGVuYnNkKiwKLQlwb3dlcnBjLSotKmJzZCosIHNwYXJjLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDU2XTg2LSotb3BlbmJzZCosIG1pcHMqLSotb3BlbmJzZCosCi0JbTY4Ki0qLW9wZW5ic2QqLCBuczMyay0qLW9wZW5ic2QqLCBwb3dlcnBjLSotKmJzZCosCi0Jc3BhcmMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgQXByICA4IDE4OjA5OjI5IDE5OTcgIEphbWllIExva2llciAgPGphbWllQHJlYmVsbGlvbi5jby51az4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvKTogTmV3IGZpZWxkCi0JYGN1bXVsYXRpdmVfc2tpcHMnLgotCShfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IEZpbGwgdGhlIGFib3ZlIGFycmF5LgotCShfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQpOiBVc2UgYGN1bXVsYXRpdmVfc2tpcHMnIHRvCi0Jc3BlZWQgdXAgb2Zmc2V0IGNhbGN1bGF0aW9uLgotCi1UdWUgQXByICA4IDAwOjAxOjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGVsZi1tbjEwMzAwLmMgKG1uMTAzMDBfZWxmX3JlbGF4X3NlY3Rpb24pOiBEb24ndCBmb3JnZXQgdGhlCi0gICAgICAgIGFkZGVuZCBmb3Igbm9uIHBjLXJlbGF0aXZlIHJlbG9jYXRpb25zLgotCi0JKiBlbGYtbTEwMzAwLmMgKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogUmVtb3ZlIHByb3RvdHlwZQotCWZvciBub24tZXhpc3RlbnQgZnVuY3Rpb24uCi0KLQkqIGVsZi1tMTAzMDAuYyAobW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzKTogTGlrZXdpc2UuCi0JKG1uMTAzMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3ApOiBMaWtld2lzZS4KLQkobW4xMDMwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9iZmRfcmVsYXhfc2VjdGlvbik6IERlZmluZS4KLQkoYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQotTW9uIEFwciAgNyAxNjo0NzowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgU0hMSUJfTElCUy4KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBTSExJQl9MSUJTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFNITElCX0xJQlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoU0hMSUIpKTogVXNlICQoU0hMSUJfTElCUykuCi0KLU1vbiBBcHIgIDcgMTA6NTM6NTIgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggYmZkLWluMi5oOiBhZGQgYmZkX3NlY3Rpb25fbG1hIG1hY3JvIHRvIGNvcnJlc3BvbmQKLQl3aXRoIGJmZF9zZWN0aW9uX3ZtYS4KLQotRnJpIEFwciAgNCAxMTozNzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXBkYXRlIGZpbGUgbmFtZXMgZm9yIGJmZF9lbGYzMl9tbjEwWzIzXTAwX3ZlYy4KLQlDb3JyZWN0IENQVSBmaWxlIG5hbWVzIGZvciBtbjEwWzIzXTAwLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBiZmQuYyAoYmZkX3JlY29yZF9waGRyKTogQ2FzdCBjb3VudCB0byBzaXplX3QgYmVmb3JlCi0Jc3VidHJhY3Rpb24uCi0KLQkqIGNvZmYtcHBjLmMgKGR1bXBfdG9jKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZyBmcm9tIFN1bk9TIGNjLgotCSogY29mZi1yczYwMDAuYyAoeGNvZmZfcmVhZF9hcl9oZHIpOiBMaWtld2lzZS4KLQkoeGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyk6IExJa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUpOiBMaWtld2lzZS4KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBMaWtld2lzZS4KLQkocGVfcHJpbnRfZWRhdGEsIHBlX3ByaW50X3BkYXRhLCBwZV9wcmludF9yZWxvYyk6IExpa2V3aXNlLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTGlrZXdpc2UuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCi0JKiBwcGNib290LmMgKHBwY2Jvb3Rfc2V0X2FyY2hfbWFjaCk6IE1ha2Ugc3RhdGljLgotCShwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfY3RvcjY0X2hvd3RvKTogU2V0IGNvbXBsYWluX29uX292ZXJmbG93Ci0JdG8gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLgotCi1UaHUgQXByICAzIDExOjUxOjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogVkVSU0lPTjogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6ICBEb24ndCBjaGVjayBTRUNfQUxMT0Mgd2hlbgotCWRlY2lkaW5nIHdoZXRoZXIgdG8gY29weSBhIHJlbG9jIGludG8gYSBzaGFyZWQgb2JqZWN0LgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4gIFJlbG9jYXRlIFJfUFBDX1JFTEFUSVZFCi0JcmVsb2NzIGluIHVuYWxsb2NhdGVkIHNlY3Rpb25zLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbG9jYXRlCi0JUl9TUEFSQ19SRUxBVElWRSByZWxvY3MgaW4gdW5hbGxvY2F0ZWQgc2VjdGlvbnMuCi0KLVdlZCBBcHIgIDIgMTY6MTk6NDEgMTk5NyAgTWlrZSBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFVuZG8gTWFyY2ggMjYgY2hhbmdlIGFuZAotCWFsd2F5cyBjcmVhdGUgZ290IHNlY3Rpb24gc28gdGhhdCB0aGUgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGxhYmVsCi0JaXMgYWx3YXlzIGNyZWF0ZWQuCi0KLVdlZCBBcHIgIDIgMTA6NDk6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IExldCBhIGNvbW1vbiBzeW1ib2wKLQlvdmVycmlkZSBhbiB1bmluaXRpYWxpemVkIHN5bWJvbCBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBhCi0Jc21hbGxlciBzaXplLgotCi0JKiBlbGYtbTEwMjAwLmM6IFJlbmFtZSBmcm9tIGVsZjMyLW1uMTAyMDAuYy4KLQkqIGVsZi1tMTAzMDAuYzogUmVuYW1lIGZyb20gZWxmMzItbW4xMDMwMC5jLgotCSogY3B1LW0xMDIwMC5jOiBSZW5hbWUgZnJvbSBjcHUtbW4xMDIwMC5jCi0JKiBjcHUtbTEwMzAwLmM6IFJlbmFtZSBmcm9tIGNwdS1tbjEwMzAwLmMKLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIGVsZjMyLW1pcHMuYyAoZWxmX21pcHNfY3RvcjY0X2hvd3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZWxmX21pcHNfaXNhKTogTW92ZSB0byBlYXJsaWVyIGluIGZpbGUuCi0JKG1pcHNfcmVsb2NfbWFwKTogUmVtb3ZlIEJGRF9SRUxPQ19DVE9SIGVudHJ5LgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19DVE9SCi0Jc3BlY2lhbGx5LgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHMxNl9qdW1wX3JlbG9jKTogUHJpbnQgYSB3YXJuaW5nIHJhdGhlciB0aGFuCi0JY2FsbGluZyBhYm9ydC4KLQotVHVlIEFwciAgMSAxNjoxODowNSAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlndXJlLmNvbTogTmV3IGZpbGUuCi0JKiBjb25maWcuaC12bXM6IFJlbW92ZSBmaWxlLgotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgZm9yIG5ldyBjb25maWd1cmUgc2NoZW1lLgotCi1Nb24gTWFyIDMxIDIzOjI4OjM5IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGxpYmNvZmYtaW4uaCAocHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uKTogRGVjbGFyZS4KLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBEZWNsYXJlLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX21rb2JqZWN0X2hvb2spOiBEZWNsYXJlIGlmIG5vdCBhIG1hY3JvLgotCi1Nb24gTWFyIDMxIDE2OjI5OjUwIDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlnLmJmZCAoaHBwYSotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIGhwcGEtKi0qZWxmKi4KLQotTW9uIE1hciAzMSAxNjoxMTozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtYTI5ay5jIChjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbik6IERvbid0IHVzZSBzeW1uZHggYXMgYQotCXN5bWJvbCBpbmRleCBmb3IgYSBSX0lIQ09OU1QgcmVsb2MuCi0KLU1vbiBNYXIgMzEgMTU6NDA6NTkgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogdGFyZ21hdGNoLnNlZDogRG8gbm90IHVzZSBcKFwpIHJlY3Vyc2l2ZWx5LgotCi1GcmkgTWFyIDI4IDE0OjQ0OjA4IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIG02OGtsaW51eC5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQkqIGkzODZsaW51eC5jIChNQUNIVFlQRV9PSyk6IERlZmluZS4KLQotRnJpIE1hciAyOCAxMTo1NjoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIERhdmlkIFMuIE1pbGxlciA8ZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdT4gYW5kIEguSi4gTHUKLQk8aGpsQGdudS5haS5taXQuZWR1PjoKLQkqIHNwYXJjbGludXguYzogTmV3IGZpbGUuCi0JKiBiZmQtaW4uaCAoYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjLSotbGludXhhb3V0Kiwgc3BhcmMtKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmNsaW51eF92ZWMpOiBBZGQgdG8gbGlzdCBvZiB2ZWN0b3JzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogdGFyZ2V0cy5jIChzcGFyY2xpbnV4X3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIHNwYXJjbGludXhfdmVjLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBzcGFyY2xpbnV4Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBzcGFyY2xpbnV4LmMuCi0KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3Ci0JYmZkX2NvZmZfYmFja2VuZF9kYXRhIGZpZWxkLgotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBMaWtld2lzZS4KLQotCSogY29uZmlnLmJmZDogQWRkIGJmZF9lbGY2NF97YmlnLGxpdHRsZX1taXBzX3ZlYyB0byB0YXJnX3NlbHZlY3MKLQlmb3IgbWlwcyplbCotKi1saW51eCogYW5kIG1pcHMqLSotbGludXgqLiAgRnJvbSBILkouIEx1Ci0JPGhqbEBsdWNvbi5vcmc+IGFuZCBSYWxmIEJhZWNobGUgPHJhbGZAZ251LmFpLm1pdC5lZHU+LgotCi0JKiBiZmQuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShzdHJlcnJvcik6IERvbid0IGRlY2xhcmUuCi0JKGJmZF9lcnJtc2cpOiBDYWxsIHhzdHJlcnJvciByYXRoZXIgdGhhbiBzdHJlcnJvci4KLQotVGh1IE1hciAyNyAxMjo1NTo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogR2VuZXJhdGUgYSBDT1BZCi0JcmVsb2MgZXZlbiBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSAuYnNzIHNlY3Rpb24uCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogY29mZmNvZGUuaCAoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIG5ldyBmaWVsZAotCV9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyLgotCShiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKTogRGVmaW5lLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogTGltaXQgYWxpZ25tZW50IG9mIGEgY29tbW9uCi0Jc3ltYm9sIHRvIHRoZSBkZWZhdWx0IHNlY3Rpb24gYWxpZ25tZW50LgotCi0JKiBDT1BZSU5HOiBVcGRhdGUgRlNGIGFkZHJlc3MuCi0KLVRodSBNYXIgMjcgMDA6NDU6NTcgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQzMHYuYyAoZWxmX2QzMHZfaG93dG9fdGFibGUpOiBGaXggYSB0eXBvIGluIHRoZQotCTIxLWJpdCBhYnNvbHV0ZSB0aGF0IG1hZGUgaXQgYWN0IGFzIGEgcmVsYXRpdmUuCi0KLVdlZCBNYXIgMjYgMTQ6NTA6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IERvbid0IHNldAotCWJzc19zZWN0aW9uIGFuZCByZWxfc2VjdGlvbiBmcm9tIGV4aXN0aW5nIHNlY3Rpb25zLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBPbmx5IGNyZWF0ZSB0aGUgZ290IHNlY3Rpb24KLQlpZiBpdCBpcyBuZWVkZWQuCi0KLVR1ZSBNYXIgMjUgMjI6MjY6NTYgMTk5NyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYW91dHguaCAoc29tZV9hb3V0X29iamVjdF9wKTogIENoYW5nZSBleGVjdXRhYmxlIHRlc3QgdG8gZml4Ci0JcHJvYmxlbXMgd2l0aCBlbWJlZGRlZCBhLm91dCBzeXN0ZW1zLgotCi1UdWUgTWFyIDI1IDE0OjM1OjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0KTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldCk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEFkanVzdCB0aGUgb2Zmc2V0IG9mIGEKLQlzdGFiIHJlbG9jLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogc3RhYnMuYyAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBDb3B5IG92ZXIgdGhlIGZpcnN0IGhlYWRlcgotCXN5bWJvbC4gIENoZWNrIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIG9mICpwc2luZm8uCi0JKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IEFkZCBwc2luZm8gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIgc3ltYm9sLgotCSogbGliYmZkLWluLmggKF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDI0IDIwOjA3OjI5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwX2hvd3RvX3RhYmxlKTogQWRkIFJfQUJTIGVudHJ5LgotCShydHlwZTJob3d0byk6IEhhbmRsZSBSX0FCUyByZWxvYyB0eXBlLiAgQWxzbyBhYm9ydCBvbiB1bmhhbmRsZWQKLQlyZWxvYyB0eXBlcywgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmFpbGluZyB0byBnZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZS4KLQotTW9uIE1hciAyNCAxMzo0MTowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdtYXRjaC5zZWQ6IFVzZSB0aGUgaG9sZCBzcGFjZSB0byBwdXQgdGhlICNpZmRlZiBhcm91bmQgdGhlCi0JdGhlIHN0cmluZyBjb25zdGFudC4KLQkqIHRhcmdldHMuYyAoVU5TVVBQT1JURURfVEFSR0VUKTogRG9uJ3QgZGVmaW5lLgotCShmaW5kX3RhcmdldCk6IERvbid0IGNoZWNrIGZvciBVTlNVUFBPUlRFRF9UQVJHRVQuCi0JKGJmZF9zZXRfZGVmYXVsdF90YXJnZXQpOiBEb24ndCB0cnkgdG8gb3B0aW1pemUgYnkgY2hlY2tpbmcgZm9yCi0JZGVmYXVsdC4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUxMX01BQ0hJTkVTX0NGSUxFUyk6IEFkZCBjcHUtbTMyci5jLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItbTMyci5jLgotCShlbGYzMi1tMzJyLm8pOiBSZW1vdmUgZXhwbGljaXQgdGFyZ2V0LgotCi0JKiBjb25maWcuYmZkOiBEb24ndCBzZXQgdGFyZ191bmRlcnNjb3JlIGZvciBpWzM0NTZdODYtKi1nbnUqIG9yCi0JaVszNDU2XTg2LSotbGludXgqLgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndAotCWNvdW50IHNlY3Rpb24gc3ltYm9scyBmb3Igc2VjdGlvbnMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgdGhlCi0JbGlua2VyLCBvciBhcmUgbm90IGFsbG9jYXRhYmxlIG9yIG5vdCBsb2FkYWJsZS4KLQkoZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPdXRwdXQgb3V0cHV0IHNlY3Rpb24KLQlzeW1ib2xzIGZvciBzZWN0aW9uIGZvciB3aGljaCB3ZSBtYWRlIHNwYWNlIGZvciB0aGVtLgotCi1GcmkgTWFyIDIxIDEzOjA4OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgdGhlcmUgaXMKLQlubyAucmVsYS5wbHQgc2VjdGlvbiwgZG9uJ3Qgb3V0cHV0IGEgRFRfUExUR09UIGR5bmFtaWMgZW50cnkuCi0KLUZyaSBNYXIgMjEgMTI6MzY6NDYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9ob3d0b190YWJsZSk6IFVzZSBzcGVjaWFsIGZ1bmN0aW9uIGZvciBMTzE2LgotCShtMzJyX2hpMTZfbGlzdCk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKG0zMnJfZWxmX2hpMTZfcmVsb2MpOiBEb24ndCBwZXJmb3JtIHJlbG9jLCBqdXN0IHF1ZXVlIGl0IHVwLgotCShtMzJyX2VsZl9kb19oaTE2X3JlbG9jKTogRGVsZXRlLgotCShtMzJyX2VsZl9yZWxvY2F0ZV9oaTE2KTogTmV3IGZ1bmN0aW9uLgotCShtMzJyX2VsZl9sbzE2X3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIEhJMTYgcmVsb2NzLCBzY2FuIGZvciBjb3JyZXNwb25kaW5nCi0JTE8xNiByZWxvYy4KLQotCU1vbiBNYXIgMTAgMTY6MDM6MzEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAobTMycl9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogRGVsZXRlLgotCShtMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBSZXdyaXRlIF9TREFfQkFTRV8gc3VwcG9ydC4KLQkobTMycl9lbGZfZmluYWxfc2RhX2Jhc2UpOiBOZXcgZnVuY3Rpb24uCi0JKG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZXdyaXRlIHNkYXRhIHN1cHBvcnQuCi0JKG0zMnJfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogRGVsZXRlLgotCi1UaHUgTWFyIDIwIDEyOjM5OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZG1AaW5mby51Y2wuYWMuYmU+LgotCSogY29mZi1zdm02OGsuYzogTmV3IGZpbGUuICBKdXN0IGRlZmluZXMgc29tZSBtYWNyb3MgYW5kIGluY2x1ZGVzCi0JY29mZi1tNjhrLmMuCi0JKiBjb2ZmLW02OGsuYzogQWRkIGZ1bmN0aW9ucyB0byBoYW5kbGUgY29tbW9uIGFkZGVuZHMsIG1vdmVkIGluCi0JZnJvbSBjZi1tNjhrbHlueC5jLiAgQ29udHJvbCB0aGVtIHVzaW5nIENPRkZfQ09NTU9OX0FEREVORCBtYWNyby4KLQlDb250cm9sIHdoZXRoZXIgcmVsb2NzIGFyZSB2aXNpYmxlIHVzaW5nIFNUQVRJQ19SRUxPQ1MuCi0JKiBjZi1tNjhrbHlueC5jOiBTaW1wbGlmeSBncmVhdGx5OiBqdXN0IGRlZmluZSBtYWNyb3MgdG8gY29udHJvbAotCWNvZmYtbTY4ay5jLgotCSogY29mZi1hdXguYzogTGlrZXdpc2UuICBKdXN0IGxlYXZlIGFkZF9vbmVfc3ltYm9sIHJvdXRpbmUuCi0JKiB0YXJnZXRzLiAobTY4a3N5c3Zjb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIG02OGtzeXN2Y29mZl92ZWMuCi0JKiBjb25maWcuYmZkIChtNjgqLW1vdG9yb2xhLXN5c3YqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4a3N5c3Zjb2ZmX3ZlYyk6IE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBjb2ZmLXN2bTY4ay5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgY29mZi1zdm02OGsuYy4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERvbid0IGdldCBtaXNsZWQgaWYgdGhlCi0gCWZpcnN0IHNlY3Rpb24gaXMgbm90IGxvYWRhYmxlLiAgRnJvbSBNYXR0aGV3IEwuIE1hcnRpbgotIAk8bWxtQHhlZGlhLmNvbT4uCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogU2V0IHRoZSB2YWx1ZSBvZiBhIHNlY3Rpb24KLQlzeW1ib2wgdG8gdGhlIHNlY3Rpb24gYWRkcmVzcyB1bmxlc3MgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluay4KLQotVHVlIE1hciAxOCAyMzowMzoxNyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRG9uJ3QgY3JlYXRlCi0JLnBsdCBlbnRyeSBpZiB3ZSd2ZSB0YWtlbiB0aGUgZnVuY3Rpb24ncyBhZGRyZXNzLgotCShlbGY2NF9hbHBoYV9tZXJnZV9nb3RzKTogTWVyZ2UgY29sbGVjdGVkIGZsYWdzIGluZm8gYXMgd2VsbC4KLQotVHVlIE1hciAxOCAyMjo0MDowOSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogTWFueSBmaWxlczogQWRkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiBjcHUtbTY4ay5jIChiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGVjb2ZmbGluay5jOiBJbmNsdWRlICJsaWJjb2ZmLmgiIGFuZCAibGliZWNvZmYuaCIuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9mYWtlX3NlY3Rpb25zKTogTWFrZSBzdGF0aWMuCi0JKiBvcG5jbHMuYyAoYmZkX29wZW5zdHJlYW1yKTogQ2hhbmdlIHN0cmVhbSBwYXJhbWV0ZXIgdG8gUFRSLgotCSogcGVpY29kZS5oOiBDaGFuZ2Ugc2V2ZXJhbCB2b2lkICogcGFyYW1ldGVycyB0byBQVFIuCi0JKiBzcmVjLmMgKHNyZWNfZ2V0X3N5bWJvbF9pbmZvKTogTWFrZSBzdGF0aWMuCi0JKiBzeW1zLmMgKGJmZF9zeW1ib2xfaXNfYWJzb2x1dGUpOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBNYXIgMTggMTI6NTg6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmMgKG0zMnJfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBSZW1vdmUuCi0JKGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWwpOiBEb24ndCBkZWZpbmUuCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogQ2FsbCBiZmRfbWFsbG9jIHJhdGhlcgotCXRoYW4gbWFsbG9jLgotCi1Nb24gTWFyIDE3IDExOjMyOjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmg6IERvbid0IGluY2x1ZGUgb2JzdGFjay5oLgotCShzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpOiBDaGFuZ2UgbWVtb3J5IGZpZWxkIHRvIFBUUi4KLQkqIGJmZC5jIChzdHJ1Y3QgX2JmZCk6IENoYW5nZSBtZW1vcnkgZmllbGQgdG8gUFRSLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogbGliYmZkLWluLmggKGJmZF9yZWxlYXNlKTogRGVjbGFyZSBhcyBmdW5jdGlvbiwgZG9uJ3QgZGVmaW5lIGFzCi0JbWFjcm8uCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIG9wbmNscy5jOiBJbmNsdWRlICJvYmphbGxvYy5oIiByYXRoZXIgdGhhbiAib2JzdGFjay5oIi4gIFVzZQotCW9iamFsbG9jIHJvdXRpbmVzIHJhdGhlciB0aGFuIG9ic3RhY2sgcm91dGluZXMuCi0JKG9ic3RhY2tfY2h1bmtfYWxsb2MsIG9ic3RhY2tfY2h1bmtfZnJlZSk6IERvbid0IGRlZmluZS4KLQkoZ2V0cGFnZXNpemUpOiBEb24ndCBkZWZpbmUuCi0JKF9iZmRfbmV3X2JmZCk6IERvbid0IHNldCBfYmZkX2NodW5rc2l6ZS4KLQkoYmZkX29wZW5yKTogRnJlZSBuZXcgYmZkIGFuZCBvYmphbGxvYyBvbiBmYWlsdXJlLgotCShiZmRfZmRvcGVuciwgYmZkX29wZW5zdHJlYW1yLCBiZmRfb3BlbncpOiBMaWtld2lzZS4KLQkoYmZkX2FsbG9jX3NpemUpOiBSZW1vdmUuCi0JKGJmZF9yZWxlYXNlKTogTmV3IGZ1bmN0aW9uLgotCSogaGFzaC5jOiBJbmNsdWRlICJvYmphbGxvYy5oIiByYXRoZXIgdGhhbiAib2JzdGFjay5oIi4gIFVzZQotCW9iamFsbG9jIHJvdXRpbmVzIHJhdGhlciB0aGFuIG9ic3RhY2sgcm91dGluZXMuCi0JKG9ic3RhY2tfY2h1bmtfYWxsb2MsIG9ic3RhY2tfY2h1bmtfZnJlZSk6IERvbid0IGRlZmluZS4KLQkqIGVjb2ZmbGluay5jOiBJbmNsdWRlICJvYmphbGxvYy5oIiByYXRoZXIgdGhhbiAib2JzdGFjay5oIi4gIFVzZQotCW9iamFsbG9jIHJvdXRpbmVzIHJhdGhlciB0aGFuIG9ic3RhY2sgcm91dGluZXMuCi0JKG9ic3RhY2tfY2h1bmtfYWxsb2MsIG9ic3RhY2tfY2h1bmtfZnJlZSk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGFjY3VtdWxhdGUpOiBDaGFuZ2UgbWVtb3J5IHRvIHN0cnVjdCBvYmphbGxvYyAqLgotCSogbGlib2FzeXMuaCAob2FzeXNfZGF0YV90eXBlKTogUmVtb3ZlIG9hc3lzX29ic3RhY2sgZmllbGQuCi0JKiBkZXAtaW4uc2VkOiBEb24ndCByZW1vdmUgb2JzdGFjay5oIGZyb20gZGVwZW5kZW5jeSBsaXN0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkRfSF9ERVBTKTogUmVtb3ZlIG9ic3RhY2suaC4KLQkoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgb2JzdGFjay5oLgotCSogTWFueSBmaWxlczogRG9uJ3QgaW5jbHVkZSAib2JzdGFjay5oIi4KLQkqIFZFUlNJT046IEJ1bXAuCi0KLQkqIG9wbmNscy5jIChiZmRfYWxsb2NfZ3JvdywgYmZkX2FsbG9jX2ZpbmlzaCk6IFJlbW92ZS4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYWxsb2NfZ3JvdywgYmZkX2FsbG9jX2ZpbmlzaCk6IERvbid0IGRlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGllZWUuYyAoaWVlZV9hcmNoaXZlX3ApOiBSZXdyaXRlIHRvIG5vdCB1c2UgYmZkX2FsbG9jX2dyb3cuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogTGlrZXdpc2UuCi0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IFJld3JpdGUgdG8gbm90IHVzZSBvYnN0YWNrXzFncm93LgotCi0JKiBvcG5jbHMuYyAoYmZkX2FsbG9jKTogUmVuYW1lIGZyb20gYmZkX2FsbG9jX2J5X3NpemVfdC4gIFJlbW92ZQotCW9sZCB2ZXJzaW9uIG9mIGJmZF9hbGxvYy4KLQkqIGxpYmJmZC1pbi5oIChiZmRfYWxsb2NfYnlfc2l6ZV90KTogRG9uJ3QgZGVjbGFyZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogU2V2ZXJhbCBmaWxlczogQ2FsbCBiZmRfYWxsb2MgcmF0aGVyIHRoYW4gYmZkX2FsbG9jX2J5X3NpemVfdC4KLQotU2F0IE1hciAxNSAxNToyNDoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IEFjY2VwdCB0aGUgZ2VuZXJpYwotCUVMRiBsb2NhbCBsYWJlbCBzeW50YXggYXMgd2VsbC4KLQotU2F0IE1hciAxNSAxMDoxNjo0MiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAocG93ZXJwYy0qLWJlb3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYy0qLWJlb3MqKTogQWRkIGNhc2UgdGhhdCBleHBsaWNpdGx5Ci0JZG9lcyBub3Qgc2V0IENPUkVGSUxFIGZvciBub3cuICBBIGZ1dHVyZSBCZU9TIHZlcnNpb24gaXMKLQlleHBlY3RlZCB0byBzdXBwb3J0IGNvcmUgZmlsZXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQotRnJpIE1hciAxNCAxNjo0MzoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogR2l2ZSBhbiBlcnJvciBpZiBDQUxMMTYgaXMKLSAJc2VlbiB3aXRoIGEgbG9jYWwgc3ltYm9sLCByYXRoZXIgdGhhbiBjcmFzaGluZy4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfc3ltYm9sX3RhYmxlKTogRG9uJ3QgdHJ5IHRvIHJlYWQgdGhlCi0JdmVyc2lvbiBzeW1ib2xzIGlmIHRoZXJlIGFyZW4ndCBhbnkuCi0KLVRodSBNYXIgMTMgMTY6Mzg6MzAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtdGljODAuYyAoY29mZl9ydHlwZV90b19ob3d0byk6IERlZmluZQotCShjb2ZmX3RpYzgwX3J0eXBlX3RvX2hvd3RvKTogQ2xvbmUgZ2VuZXJpYyBjb2ZmIHZlcnNpb24gYW5kCi0JYWRkIGNvZGUgdG8gaGFuZGxlIHRoZSBmdW5reSBUSSAiaW50ZXJuYWwgcmVsb2NhdGlvbnMiLgotCi1UaHUgTWFyIDEzIDE0OjA4OjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEb24ndCB3YXJuIGFib3V0IHR5cGUKLQlvciBzaXplIGNoYW5nZXMgYmVjYXVzZSBvZiBhIHdlYWsgc3ltYm9sLgotCi0JKiBjaXNjby1jb3JlLmMgKFNJR0VNVCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQotV2VkIE1hciAxMiAyMTozNjowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGV4dHN5bW9mZiB3aGVuCi0Jc2V0dGluZyBldmVyLiAgU2FuaXR5IGNoZWNrIHRoZSB2ZXJzaW9uIG51bWJlci4gIFNvcnQgb3V0IGNvcHlpbmcKLQlmbGFncyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gd2hlbiBhZGRpbmcgYW4gaW5kaXJlY3Qgc3ltYm9sLgotCShOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IFByZXNlcnZlIGFueSBkeW5hbWljCi0Jc3ltYm9scyBhZGRlZCBieSB0aGUgYmFja2VuZC4gIENsZWFyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlCi0JdmVyc3ltIHNlY3Rpb24uCi0JKGVsZl9leHBvcnRfc3ltYm9sKTogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBBY2NlcHQgYSBzZWN0aW9uIHdpdGhvdXQgYW4gb3duZXIgaW4gYW4KLQlhc3NlcnQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBBZGQgYSBzYW5pdHkgY2hlY2sgb24gdGhlCi0JdmVyc2lvbiBjb3VudC4gIENvcnJlY3QgdGhlIGFsbG9jYXRpb24gb2YgeF92ZXJzeW1wLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvbid0IHNldCB0aGUgb3duZXIgb2YKLQl0aGUgbWFnaWMgc2VjdGlvbnMgdXNlZCBmb3IgU0hOX01JUFNfVEVYVCBhbmQgU0hOX01JUFNfREFUQS4KLQlEb24ndCByZXR1cm4gYmZkX3VuZF9zZWN0aW9uX3B0ciB3aGVuIGluZm8tPnNoYXJlZC4KLQkobWlwc19lbGZfZmluYWxfbGluayk6IFNldCB0aGUgYWxpZ25tZW50IG9mIC5ydHByb2MgdG8gNCwgbm90IDEyLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENvcnJlY3QgdHlwZTogXj0gZm9yICY9LgotCShtaXBzX2VsZl9jaGVja19yZWxvY3MpOiBSZXNvbHZlIGFuIGluZGlyZWN0IHN5bWJvbCBpbgotCXN5bV9oYXNoZXMuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IERvbid0IGNoYW5nZSBTSE5fQUJTIGludG8KLQlTSE5fTUlQU19URVhUIG9yIFNITl9NSVBTX0RBVEEuCi0KLQkqIGVsZi5jIChiZmRfZWxmX3ByaW50X3N5bWJvbCk6IFR3ZWFrIHZlcnNpb24gb3V0cHV0IHNsaWdodGx5LgotCi1UdWUgTWFyIDExIDAxOjM4OjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGVsZi1iZmQuaCAoRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKTogRGVmaW5lLgotCSogZWxmLmMgKGJmZF9lbGZfcHJpbnRfc3ltYm9sKTogQ29ycmVjdCBlcnJvcnMgaW4gbGFzdCBjaGFuZ2UuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEhhbmRsZSBjYXNlcyBpbiB3aGljaCBhCi0JdmVyc2lvbmVkIHN5bWJvbCBhcHBlYXJzIGluIGJvdGggYSByZWd1bGFyIGFuZCBhIHNoYXJlZCBvYmplY3QuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IFNldCBFTEZfTElOS19GT1JDRURfTE9DQUwgd2hlbgotCWFwcHJvcHJpYXRlLiAgSW1wcm92ZSBlcnJvciBtZXNzYWdlLgotCShzdHJ1Y3QgZWxmX291dGV4dF9pbmZvKTogUmVuYW1lIGZyb20gZWxmX2ZpbmZvX2ZhaWxlZC4gIENoYW5nZQotCWFsbCB1c2VzLiAgQWRkIGxvY2Fsc3ltcyBmaWVsZC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGNhbGwKLQllbGZfbGlua19vdXRwdXRfZXh0c3ltIHRvIG91dHB1dCBhbGwgbG9jYWwgc3ltYm9scy4KLQkoZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSk6IEhhbmRsZSBzeW1ib2xzIHdoaWNoIHdlcmUgZm9yY2VkIHRvCi0JYmVjb21lIGxvY2FsLgotCi1TdW4gTWFyICA5IDIzOjA4OjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGVsZi1iZmQuaCAoZWxmX3N5bWJvbF90eXBlKTogQWRkIHZlcnNpb24gZmllbGQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBTZXQgdmVyc2lvbiBmaWVsZC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogV2hlbiBjcmVhdGluZyBhbgotIAlpbmRpcmVjdCBzeW1ib2wgZm9yIGEgZGVmYXVsdCB2ZXJzaW9uIHN5bWJvbCwgc2V0IERFRl9EWU5BTUlDIGlmCi0gCWFwcHJvcHJpYXRlLiAgU2V0IHVwIGFuIGluZGlyZWN0aW9uIGZyb20gdGhlIG5vbmRlZmF1bHQgdmVyc2lvbiBvZgotCXRoZSBzeW1ib2wgYXMgd2VsbC4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBDYWxsCi0JZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIGJlZm9yZSBjaGVja2luZyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkKLQl2ZXJzaW9ucy4gIEFsd2F5cyByZWNvcmQgdGhlIHZlcnNpb24gbmFtZSBhcyBhIGR5bmFtaWMgc3ltYm9sLgotCUluaXRpYWxpemUgY291bnRlcnMuCi0JKGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbik6IEFmdGVyIGZpbmRpbmcgYSB2ZXJzaW9uLCBzZWUgaWYgYQotCXN5bWJvbCBzaG91bGQgYmUgZm9yY2VkIHRvIGxvY2FsIHNjb3BlLiAgQ3JlYXRlIGEgbmV3IHZlcnNpb24KLQlkZWZpbml0aW9uIGlmIGFwcHJvcHJpYXRlLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogQ29ycmVjdCBpbmRpcmVjdCBzeW1ib2wgaGFuZGxpbmcuCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBQcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uLgotCShiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBUdXJuIHZlcnNpb24gc2VjdGlvbnMgaW50byBCRkQgc2VjdGlvbnMuCi0JKGVsZl9mYWtlX3NlY3Rpb25zKTogT25seSBjb3B5IGN2ZXJkZWZzIGFuZCBjdmVycmVmcyBpbnRvIHNoX2luZm8KLQlpZiBzaF9pbmZvIGlzIG5vdCBhbHJlYWR5IHNldC4KLQkoX2JmZF9lbGZfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IENvcHkgc2hfaW5mbyBmb3IgdmVyc2lvbgotCXNlY3Rpb25zLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IFRlbGwKLQlfYmZkX3N0cmluZ3RhYl9hZGQgdG8gY29weSB0aGUgbmFtZSBpbnRvIHBlcm1hbmVudCBtZW1vcnkgaWYKLQlhcHByb3ByaWF0ZS4KLQotRnJpIE1hciAgNyAxMTo1NTozMSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBlbGY2NC1hbHBoYS5jIChhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCk6IEZ1bGx5IHBhcmVudGhlc2l6ZS4KLQotRnJpIE1hciAgNyAxMDozNzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSk6IENoYW5nZQotCV9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgdG8gcmV0dXJuIGEgYm9vbGVhbgotCXZhbHVlLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENoYW5nZSByZXR1cm4gdHlwZSB0bwotCWJvb2xlYW4uICBJZiB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBzZWN0aW9uIGNoYW5nZWQsIHRoZW4gb3V0cHV0IGEKLQl6ZXJvIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBBbHdheXMgYWxsb2NhdGUgc3BhY2UKLQlmb3IgYXQgbGVhc3QgNiBvdXRwdXQgc3ltYm9scy4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IFdoZW4gZW1pdHRpbmcgVE9DIGVudHJ5IHJlbG9jcywgYWxzbwotCWVtaXQgYSBUQyBjc2VjdCB0byByZXByZXNlbnQgdGhlIHNwYWNlIHRoZXkgdGFrZSB1cC4gIEZvciBhbiBYTwotCXN5bWJvbCwganVzdCBlbWl0IGEgcmVmZXJlbmNlLCBub3QgYSBjc2VjdC4KLQotCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IEp1c3QgdXNlIGxuIC1zLCBub3QgbG4gLXNmLCBzaW5jZQotCVNvbGFyaXMgZG9lc24ndCBsaWtlIHRoZSBjb21iaW5lZCBvcHRpb25zLCBhbmQgdGhlIC1mIGlzCi0JdW5uZWNlc3NhcnkuCi0JKHN0YW1wLXRzaGxpbmssIGluc3RhbGwpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQ29ycmVjdCBSX01JUFMxNl8yNgotCWhhbmRsaW5nIHdoZW4gbGl0dGxlIGVuZGlhbi4KLQotVGh1IE1hciAgNiAxMzo1MTo1MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAobW4xMDMwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkobW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uKTogRGVmaW5lLgotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKHJlbG9jX3R5cGUpOiBSZW1vdmUgUENSRUx7OCwxNiwzMn1fezEsMn1CWVRFCi0JcmVsb2NzLiAgUmVwbGFjZSB0aGVtIHdpdGggZ2VuZXJpYyBQQ1JFTF97OCwxNiwzMn0gcmVsb2NzLgotCShlbGYzMl9tbjEwMzAwX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JKGVsZjMyX21uMTAzMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQotVGh1IE1hciAgNiAxMjoxOTo1OSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jIChydHlwZTJob3d0byk6IElmIHBhc3NlZCBhIHJlbG9jYXRpb24gdHlwZSB3ZSBkb24ndAotCXVuZGVyc3RhbmQsIGp1c3Qgc2V0IHRoZSBob3d0byBmaWVsZCB0byBOVUxMLCBhbmQgdGhlIGNhbGxlciB3aWxsCi0JcHJpbnQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBQdWxsIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgYW5kCi0JY29kZSBmcmFnbWVudCBvdXQgb2YgYm90aCBsZWdzIG9mICNpZmRlZiBSRUxPQ19QUk9DRVNTSU5HIC4uLiAjZW5kaWYKLQlibG9jay4gIFVzZSBOVUxMIGZvciBpbml0aWFsaXphdGlvbnMgb2YgInB0ciIgcmF0aGVyIHRoYW4gYmFyZSAwLgotCSogY29mZi1oODMwMC5jOiBGaXggdHlwbyBpbiBjb21tZW50LgotCSogY29mZi1oODUwMC5jOiBEaXR0by4KLQkqIGNvZmYtdzY1LmM6IERpdHRvCi0JKiBjb2ZmLXo4ay5jOiBEaXR0by4KLQotV2VkIE1hciAgNSAxMzo1OTowOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyk6IEZpeCBvdmVyZmxvdyBjYWxjLgotCShtMzJyX2VsZl9yZWxheF9zZWN0aW9uLCBtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMsCi0JbTMycl9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKTogRmlyc3QgcGFzcyBhdCByZWxheCBzdXBwb3J0LgotCi1Nb24gTWFyICAzIDEzOjI3OjA5IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBydGwuY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBVc2UgY29ycmVjdCBzaF9zaXplCi0JZW50cnkgZm9yIHJlYWRpbmcgdmVyZGVmIHJlY29yZHMuCi0JVXNlIGNvcnJlY3QgYnJhY2VzIGZvciBjb21wdXRpbmcgaW5jcmVtZW50cyBvZiBleHR2ZXJkYXV4IGFuZAotCWV4dGV2ZXJkZWYgcmVjb3JkIHBvaW50ZXJzLgotCi1TdW4gTWFyICAyIDIyOjQ3OjU0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik6IFNldCB0aGlzIHRvIDIKLQlpbnN0ZWFkIG9mIDQuCi0KLVN1biBNYXIgIDIgMTY6MjU6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMpOiBDaGVjayB0aGF0Ci0JREVGX1JFR1VMQVIgaXMgbm90IHNldCBhcyB3ZWxsIGFzIGNoZWNraW5nIHRoYXQgREVGX0RZTkFNSUMgaXMKLQlzZXQuCi0KLUZyaSBGZWIgMjggMTY6NTI6NDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2ZsYWdzKTogQWRkIGNhc2UgZm9yIFRJQzgwX0FSQ0hfTUFHSUMuCi0KLUZyaSBGZWIgMjggMTU6MDY6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0YXJnZXRzLmMgKGJmZF9kZWZhdWx0X3ZlY3Rvcik6IE1ha2Ugbm9uLWNvbnN0LgotCShmaW5kX3RhcmdldCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQliZmRfZmluZF90YXJnZXQuCi0JKGJmZF9zZXRfZGVmYXVsdF90YXJnZXQpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9maW5kX3RhcmdldCk6IENhbGwgZmluZF90YXJnZXQuICBXaGVuIGRlZmF1bHRpbmcsIHVzZQotCWJmZF9kZWZhdWx0X3ZlY3RvclswXSBpZiBpdCBpcyBub3QgTlVMTC4KLQkqIGxpYmJmZC1pbi5oIChiZmRfZGVmYXVsdF92ZWN0b3IpOiBBZGp1c3QgZGVjbGFyYXRpb24uCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IFJldHVybiBmYWxzZSBpZiB0aGUgc3ltYm9sIGhhcyBubwotCW5hbWUuCi0JKiBjb2ZmLWk5NjAuYyAoY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBjb2ZmLW02OGsuYyAobTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWZpbmUuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCSogZWxmLmMgKF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBUcmVhdCBzeW1ib2xzIGJlZ2lubmluZwotCXdpdGggLi4gb3IgXy5MXyBhcyBsb2NhbC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotCSogZXZheC1hbHBoYS5jIChldmF4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogVHJlYXQgc3ltYm9scwotCWJlZ2lubmluZyB3aXRoICQgYXMgbG9jYWwuCi0KLVRodSBGZWIgMjcgMTg6MzY6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVzZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotCXJhdGhlciB0aGFuIGNvbXBhcmluZyBhZ2FpbnN0IGluZm8tPmxwcmVmaXguCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogTGlrZXdpc2UuCi0JKiBsaW5rZXIuYyAoX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lIGFzCi0JX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLgotCSogZWxmLmMgKF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUpOiBEZWNsYXJlLgotCi0JKiBjb2ZmLW04OGsuYyAoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZS4KLQkobTg4a19pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlZmluZSBhcwotCV9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKiBjb2ZmZ2VuLmMgKF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSogbGliY29mZi1pbi5oIChfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIHRhcmdldHMuYyAoQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyk6IENoYW5nZSBfYmZkX2lzX2xvY2FsX2xhYmVsCi0JdG8gX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLgotCShiZmRfdGFyZ2V0KTogTGlrZXdpc2UuCi0JKiBzeW1zLmMgKGJmZF9pc19sb2NhbF9sYWJlbCk6IERlZmluZSBhcyBmdW5jdGlvbiwgbm90IG1hY3JvLgotCShiZmRfaXNfbG9jYWxfbmFtZSk6IERlZmluZS4KLQkqIGxpYmJmZC5jIChiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lKTogUmVuYW1lIGZyb20KLQliZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbCwgYW5kIHRha2UgYSBzdHJpbmcgcmF0aGVyIHRoYW4gYQotCXN5bWJvbC4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWwpOiBEb24ndCBkZWZpbmUuCi0JKF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVmaW5lLgotIAkoYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWwpOiBEb24ndCBkZWNsYXJlLgotCShiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBBbGwgYmFja2VuZHM6IENoYW5nZSBsb2NhbF9sYWJlbCB0byBsb2NhbF9sYWJlbF9uYW1lLgotCi0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2dvdF9pbmZvKTogQWRkIGFzc2lnbmVkX2dvdG5vIGZpZWxkLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gYm9vbGVhbi4KLQlEb24ndCBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgemVybyBlbnRyeSBpcyB1bmFzc2lnbmVkOyBpbnN0ZWFkLCB1c2UKLQlhc3NpZ25lZF9nb3Ruby4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCW1pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbC4KLQkobWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogSW5pdGlhbGl6ZSBhc3NpZ25lZF9nb3RubyBmaWVsZC4KLQotV2VkIEZlYiAyNiAxNToxOTo1MSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItZDMwdi5jIChiZmRfZWxmX2QzMHZfcmVsb2MpOiBBZGQgY29kZSB0byBkbyAzMi1iaXQKLQlyZWxvY2F0aW9ucy4KLQotV2VkIEZlYiAyNiAxMzozMzowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3Qgc2tpcCBzeW1ib2xzIGZyb20gc2VjdGlvbnMKLQl0aGF0IGhhdmUgbm8gY29udGVudHMgbWVyZWx5IGJlY2F1c2UgbGlua2VyX21hcmsgaXMgbm90IHNldC4KLQotVHVlIEZlYiAyNSAxODo1MTozNSAxOTk3ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqLSotbG5ld3MqKTogTmV3IHRhcmdldC4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBNYWtlIGFzc2VydCBjb21wYXJlCi0JY29udGVudCBieXRlb3JkZXIgaW5zdGVhZCBvZiBoZWFkZXIgYnl0ZW9yZGVyLgotCShlY29mZl9iaWdsaXR0bGVfdmVjKTogTmV3IEJGRCwgYmlnLWVuZGlhbiBoZWFkZXJzLCBsaXR0bGUtZW5kaWFuCi0JZGF0YS4KLQkqIHRhcmdldHMuYyAoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgZWNvZmZfYmlnbGl0dGxlX3ZlYy4KLQkqIGNvbmZpZ3VyZS5pbiAoZWNvZmZfYmlnbGl0dGxlX3ZlYyk6IEFkZCBjYXNlLgotCSogY29uZmlndXJlOiBVcGRhdGUuCi0KLVR1ZSBGZWIgMjUgMDA6MzI6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBVc2UgU0hUX05PVEUgZm9yIGFueSBzZWN0aW9uIHdob3NlCi0JbmFtZSBiZWdpbnMgd2l0aCAiLm5vdGUiLgotCShtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBBZGQgYSBQVF9OT1RFIHNlZ21lbnQgZm9yIGFueSBsb2FkYWJsZQotCXNlY3Rpb24gd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCAiLm5vdGUiLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IENvcnJlc3BvbmRpbmcgY2hhbmdlLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBDaGVjayBmb3IgbWlzYWxpZ25lZAotCWphbCBhbmQgZm9yIGphbCBvdmVyZmxvdy4KLQotTW9uIEZlYiAyNCAxNzo1MzoxNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBJZiBhIGRlZmF1bHQgc3ltYm9sIGlzCi0Jbm90IGZvdW5kLCB0cnkgbG9va2luZyBpdCB1cCBhZ2FpbiB3aXRob3V0IHRoZSB2ZXJzaW9uIG5hbWUuCi0JKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEFsd2F5cyBsaW5rIGFnYWluc3QgdGhlIGR5bmFtaWMKLQlzeW1ib2wgdGFibGUgb2YgYSBkeW5hbWljIG9iamVjdC4gIFdoZW4gbGlua2luZyBhZ2FpbnN0IGEgZHluYW1pYwotCW9iamVjdCwgaW5jbHVkZSB2ZXJzaW9uIHN0cmluZ3MgaW4gc3ltYm9sIG5hbWVzLCBhbmQgc2V0IHVwCi0JdmVyc2lvbiBpbmZvcm1hdGlvbi4gIEFkZCBpbmRpcmVjdCBzeW1ib2xzIGZvciBkZWZhdWx0IHZlcnNpb25zLgotCShlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IEFkZCBzcGVjaWFsIHZlcnNpb24gc2VjdGlvbnMuCi0JKHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8pOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfZmluZF92ZXJkZXBfaW5mbyk6IERlZmluZS4KLQkoTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykpOiBBZGQgdmVyZGVmcyBwYXJhbWV0ZXIuICBTZXQKLQl1cCB2ZXJzaW9uIHNlY3Rpb25zLgotCShlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuCi0JKGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShlbGZfbGlua19yZW51bWJlcl9keW5zeW1zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8pOiBBZGQgc3ltdmVyX3NlYyBmaWVsZC4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogSW5pdGlhbGl6ZSBmaW5mby5zeW12ZXJfc2VjLiAgRG9uJ3QgY291bnQKLQlsb2NhbCBzeW1ib2xzIG9mIGEgZHluYW1pYyBvYmplY3QuICBIYW5kbGUgRFRfVkVSKiBjb25zdGFudHMuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBTaW1wbGlmeSBCRkRfQVNTRVJUIGNoZWNraW5nIGZvciBhCi0JZHluYW1pYyBvYmplY3QuICBTa2lwIGluZGlyZWN0IHN5bWJvbHMgZnJvbSBFTEYgb2JqZWN0cy4gIFJlbW92ZQotCXRoZSB2ZXJzaW9uIG5hbWUgYmVmb3JlIGNob29zaW5nIGEgaGFzaCBidWNrZXQuICBXcml0ZSBvdXQgdGhlCi0JdmVyc2lvbiBpbmZvcm1hdGlvbiBpZiBhcHByb3ByaWF0ZS4KLQkoZWxmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZm9yIERZTkFNSUMsIG5vdCBFVF9EWU4uCi0JKiBiZmQtaW4uaCAoYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkoYmZkX2VsZjY0X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCB2ZXJpbmZvIGZpZWxkLgotCUNoYW5nZSBlbGZfbGlua19oYXNoX2ZsYWdzIHRvIHVuc2lnbmVkIHNob3J0LgotCShFTEZfTElOS19ISURERU4pOiBEZWZpbmUuCi0JKHN0cnVjdCBlbGZfb2JqX3RkYXRhKTogQWRkIGZpZWxkcyBkeW52ZXJzeW1faGRyLCBkeW52ZXJyZWZfaGRyLAotCWR5bnZlcmRlZl9oZHIsIGR5bnZlcnN5bV9zZWN0aW9uLCBkeW52ZXJkZWZfc2VjdGlvbiwKLQlkeW52ZXJyZWZfc2VjdGlvbiwgY3ZlcmRlZnMsIGN2ZXJyZWZzLCB2ZXJkZWYsIHZlcnJlZi4KLQkoZWxmX2R5bnZlcnN5bSwgZWxmX2R5bnZlcmRlZiwgZWxmX2R5bnZlcnJlZik6IERlZmluZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4sIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luLCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9vdXQpOiBEZWNsYXJlLgotCShfYmZkX2VsZl9zbHVycF92ZXJzaW9uX3RhYmxlcyk6IERlY2xhcmUuCi0JKiBlbGYuYyAoX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4pOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4sIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQpOiBMaWtld2lzZS4KLQkoX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luLCBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3N3YXBfdmVybmF1eF9pbiwgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCk6IExpa2V3aXNlLgotCShfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiwgX2JmZF9lbGZfc3dhcF92ZXJzeW1fb3V0KTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBBZGQgRFRfVkVSKiBjb25zdGFudHMuICBQcmludAotCXZlcnNpb24gaW5mb3JtYXRpb24gaWYgdGhlcmUgaXMgYW55LgotCShfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyk6IEluaXRpYWxpemUgdmVyaW5mbyBmaWVsZC4KLQkoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogSGFuZGxlIFNIVF9HTlVfdmVyKiBzZWN0aW9uIHR5cGVzLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IEhhbmRsZSAuZ251LnZlcnNpb24qIHNlY3Rpb24gbmFtZXMuCi0JKGFzc2lnbl9zZWN0aW9uX251bWJlcnMpOiBIYW5kbGUgU0hUX0dOVV92ZXIqIHNlY3Rpb24gdHlwZXMuCi0JKF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCk6IERvbid0IGluY2x1ZGUKLQl2ZXJzaW9uIG5hbWUgaW4gc3RyaW5nIGVudGVyZWQgaW4gZHluYW1pYyBoYXNoIHRhYmxlLgotCSogZWxmY29kZS5oOiBJbmNsdWRlIGZubWF0Y2guaC4KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBhIGR5bmFtaWMKLQlzeW1ib2wgd2hpY2ggd2FzIGZvcmNlZCB0byBiZWNvbWUgbG9jYWwuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjY0LWFscGhhLmMgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgMjEgMTY6MTU6MTggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBTaW1wbGlmeQotCXNvbWV3aGF0LgotCShtbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uKTogQ29ycmVjdGx5IGNvbXB1dGUgYSBzeW1ib2wncyB2YWx1ZQotCXdoZW4gdGhlIHN5bWJvbCBpcyBsb2NhbCwgYnV0IG5vdCBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzIHdlIGFyZQotCXJlbGF4aW5nLiAgSW1wbGVtZW50IGFiczI0IC0+IGFiczE2LCBpbW0yNCAtPiBpbW0xNiBhbmQgZDI0IC0+IGQxNgotCXJlbGF4aW5nLgotCi1GcmkgRmViIDIxIDEzOjU1OjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1tMzJyLmM6IFJld3JpdGUgdG8gdXNlIEVMRiBiYWNrZW5kIGxpbmtlci4KLQlTdG9yZSBsb3dlciAxNiBiaXRzIG9mIGFkZGVuZCBpbiBSX00zMlJfSEkxNl9bU1VdTE8gaW5zbnMuCi0JQWRkIHNtYWxsIGRhdGEgYXJlYSBzdXBwb3J0IChSX00zMlJfU0RBMTYpLgotCSogcmVsb2MuYzogRG9jdW1lbnQgQkZEX1JFTE9DX00zMlJfU0RBMTYuCi0JKiBiZmQtaW4yLmgsbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRmViIDIwIDIzOjUwOjMxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChtbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkobW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcCk6IExpa2V3aXNlLgotCShtbjEwMjAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uKTogRGVmaW5lLgotCShiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IExpa2V3aXNlLgotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbik6IERlZmluZS4KLQotVHVlIEZlYiAxOCAxNzoyMjo1OSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGFyY2h1cmVzLmMsIGNvbmZpZy5iZmQsIGNvbmZpZ3VyZS5pbiwgZWxmLmMsCi0JcmVsb2MuYywgdGFyZ2V0cy5jOiBOZXcgdGFyZ2V0LCBlbGYtKi1EMzBWLgotCi0JKiBiZmQtaW4yLmgsIGNvbmZpZ3VyZSwgbGliYmZkLmg6IFJlYnVpbHQuCi0KLQkqIGNwdS1kMzB2LmMsIGVsZjMyLWQzMHYuYzogTmV3IGZpbGVzLgotCi1UdWUgRmViIDE4IDE1OjMxOjQ4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0KTogRml4IHR5cG8gaW4gY29tbWVudC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBjb2ZmLXRpYzgwLmMgKFJUWVBFMkhPV1RPKTogUmVwbGFjZSBhYm9ydCB3aXRoIHJlYWwgZnVuY3Rpb24uCi0JKHJ0eXBlMmhvd3RvKTogQWRkIGZ1bmN0aW9uLgotCSh0aWM4MF9ob3d0b190YWJsZSk6IEFkZC4KLQotVHVlIEZlYiAxOCAxMTo0MTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIHN5c2RlcC5oOiBEb24ndCBkZWZpbmUgZXJybm8gaW4gTVNWQyBpZiBlcnJvci5oIGlzIGluY2x1ZGVkLgotCi1UdWUgRmViIDE4IDEwOjA0OjEzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jICh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZSBzdXJlIHJfc3ltbmR4Ci0JaXMgaW5pdGlhbGl6ZWQgYmVmb3JlIGl0IGlzIHVzZWQuCi0KLU1vbiBGZWIgMTcgMTE6Mjg6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBocDMwMGhwdXguYyAoY29udmVydF9zeW1fdHlwZSk6IERvbid0IGNvbnZlcnQgYSBzZWNvbmRhcnkgY29tbW9uCi0Jc3ltYm9sIGludG8gYSB3ZWFrIHVuZGVmaW5lZCBzeW1ib2w7IGxlYXZlIGl0IGFzIGEgY29tbW9uIHN5bWJvbC4KLQotRnJpIEZlYiAxNCAxOTowODowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogRG9uJ3QgaXNzdWUgYSB3YXJuaW5nCi0JYWJvdXQgYSBzeW1ib2wgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4KLQlkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0KLVRodSBGZWIgMTMgMjA6NTM6MjIgMTk5NyAgS2xhdXMgS2FlbXBmICAoa2thZW1wZkBwcm9naXMuZGUpCi0KLQkqIG1ha2VmaWxlLnZtczogQWRkIGdjYyBmbGFncyB0byBhbGxvdyBjb21waWxpbmcgd2l0aCBjdXJyZW50IGdjYwotCXNuYXBzaG90Ci0JKHRhcmdtYXRjaC5oKTogTmV3IGRlcGVuZGVuY3kuCi0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUik6IE5ldyByZWxvY2F0aW9uIGZvcgotCW9wZW5WTVMvQWxwaGEuCi0JKiBldmF4LmggKEFMUEhBX1JfQ09ERUFERFIpOiBOZXcgcmVsb2NhdGlvbi4KLQkqIGV2YXgtYWxwaGEuYyAoQUxQSEFfUl9DT0RFQUREUik6IDY0IGJpdCBwcm9jZWR1cmUgcmVsb2NhdGlvbiBmb3IKLQlvcGVuVk1TL0FscGhhLgotCSogZXZheC1ldGlyLmMgKEFMUEhBX1JfQ09ERUFERFIpOiBPdXRwdXQgb2JqZWN0IGNvZGUgZm9yIHRoaXMKLQlyZWxvY2F0aW9uLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCVJlc3RyaWN0IHN5bWJvbCBsZW5ndGggdG8gNjQgYnl0ZXMsIGNhc2UgcHJlc2VydmluZzoKLQkqIGV2YXgtZW1oLmMgKF9iZmRfZXZheF93cml0ZV9lbWgpOiBSZW1vdmUgY2FzZSBoYWNraW5nLgotCSogZXZheC1taXNjLmMgKF9iZmRfZXZheF9jYXNlX2hhY2tfc3ltYm9sKTogUmVtb3ZlLgotCShfYmZkX2V2YXhfbGVuZ3RoX2hhc2hfc3ltYm9sKTogQWRkZWQuCi0JKiBldmF4LWV0aXIuYyAoX2JmZF9ldmF4X3dyaXRlX2V0aXIpOiBDYWxsCi0JX2JmZF9ldmF4X2xlbmd0aF9oYXNoX3N5bWJvbCBiZWZvcmUgb3V0cHV0IG9mIHN5bWJvbC4KLQkqIGV2YXgtZWdzZC5jIChfYmZkX2V2YXhfd3JpdGVfZWdzZCk6IExpa2V3aXNlLgotCSogZXZheC5oIChmbGFnX2hhc2hfbG9uZ19uYW1lcywgZmxhZ19zaG93X2FmdGVyX3RydW5jKTogUmVtb3ZlLgotCi0JKiBldmF4LWVtaC5jOiBPdXRwdXQgZmlsZW5hbWUgdG8gb2JqZWN0IGZpbGUgd2l0aG91dCBwYXRoLgotCi0JKiBldmF4LWVnc2QuYzogTmV3IHNlY3Rpb25zIGZvciBsb2NhbCBhbmQgZ2xvYmFsIGNvbW1vbnMuCi0KLQkqIGV2YXgtYWxwaGEuYywgZXZheC1lbWguYywgZXZheC1lZ3NkLmMsIGV2YXgtZXRpci5jLAotCWV2YXgtbWlzYy5jLCBldmF4Lmg6IFJlbW92ZSA4IGJpdCBjaGFyYWN0ZXJzIGZyb20gY29weXJpZ2h0Ci0Jbm90aWNlcy4gIFJlcGxhY2UgQVhQIHdpdGggQWxwaGEuCi0KLVdlZCBGZWIgMTIgMTg6MTA6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW5vcy5jIChzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IFdlIG5lZWQgdGhlIGR5bmFtaWMKLQlzZWN0aW9ucyBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQotVHVlIEZlYiAxMSAxNTo0NTo0MyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAoaTM4Ni13aW5kb3dzKTogRG9uJ3Qgc2V0IGhvc3Q2ND10cnVlLgotCi1UdWUgRmViIDExIDE1OjI3OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChyZWxvY190eXBlKTogQWRkIFJfTUlQUzE2X0dQUkVMLgotCShlbGZfbWlwczE2X2dwcmVsX2hvd3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwczE2X2dwcmVsX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMLgotCShtaXBzX2luZm9fdG9faG93dG9fcmVsKTogSGFuZGxlIFJfTUlQUzE2X0dQUkVMLgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQUzE2X0dQUkVMLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX01JUFMxNl9HUFJFTCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTAgMjM6MjU6MDAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW0zMnIuYyAoZWxmX20zMnJfaG93dG9fdGFibGUpOiBDaGFuZ2UgcGFydGlhbF9pbnBsYWNlIHRvIHRydWUKLQlmb3IgUl9NMzJSX3sxNiwzMiwyNCxISTE2X1VMTyxISTE2X1NMTyxMTzE2fS4KLQotRnJpIEZlYiAgNyAxMjozOToxMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfaW5wdXRfYmZkKTogSWYgd2UndmUgZGlzY2FyZGVkIGEgc2VjdGlvbiwKLQl0aGUgb3V0cHV0IHNlY3Rpb24gd2lsbCBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbjsgZG9uJ3QgcHJpbnQgYW4KLQlhc3NlcnRpb24gbWVzc2FnZSBmb3IgdGhhdCBjYXNlIHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluay4KLQotVGh1IEZlYiAgNiAxNjo1NTo0MyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoRk5fU1RVQiwgQ0FMTF9TVFVCLCBDQUxMX0ZQX1NUVUIpOiBEZWZpbmUuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpOiBBZGQgbmV3IGZpZWxkcyBmbl9zdHViLAotCW5lZWRfZm5fc3ViLCBjYWxsX3N0dWIsIGFuZCBjYWxsX2ZwX3N0dWIuCi0JKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgZmllbGQgbWlwczE2X3N0dWJzX3NlZW4uCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCShtaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBSZWRpcmVjdCByZWxvY2F0aW9ucyB0byB1c2UgbWlwczE2Ci0Jc3R1YnMgd2hlbiBhcHByb3ByaWF0ZS4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogQXR0YWNoIHN0dWIgc2VjdGlvbnMgdG8gdGhlIGFwcHJvcHJpYXRlCi0Jc3ltYm9sLiAgU2V0IG5lZWRfZm5fc3R1YiB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2VsZl9hbHdheXNfc2l6ZV9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKTogRGVmaW5lLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IEFkZCBsb2NhbF9zdHVicyBmaWVsZC4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19pbnB1dF9iZmQpOiBEaXNjYXJkIGxvY2FsIHN5bWJvbHMgdGhhdCBhcmUKLQlhdHRhY2hlZCB0byBzZWN0aW9ucyB3aGljaCBhcmUgbm90IGJlaW5nIGluY2x1ZGVkIGluIHRoZSBsaW5rLgotCi1XZWQgRmViICA1IDEzOjIwOjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbik6IElnbm9yZSB0aGUKLQlzeW1ib2wgdmFsdWUgd2hlbiBjb21wdXRpbmcgdGhlIGFkZGVuZCBmb3IgYSBwY19yZWxhdGl2ZQotCXBjcmVsX29mZnNldCByZWxvYy4KLQotTW9uIEZlYiAgMyAxMTo1NDowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiBkb2luZyBhCi0JcmVsb2NhdGVhYmxlIGxpbmssIGp1c3Qgc2tpcCBwY19yZWxhdGl2ZSBwY3JlbF9vZmZzZXQgcmVsb2NzLgotCSogY29mZi1hcm0uYyAoY29mZl9hcm1fcnR5cGVfdG9faG93dG8pOiBSZXR1cm4gYSBkaWZmZXJlbnQgaG93dG8KLQlzdHJ1Y3R1cmUgZm9yIGFuIEFSTTI2IHJlbG9jIHdoaWNoIGNhbiBiZSByZXNvbHZlZC4KLQkoY29mZl9hcm1fYWRqdXN0X3N5bW5keCk6IE9ubHkgY29udmVydCBBUk0yNiB0byBBUk0yNkQgaWYgdGhlCi0JcmVsb2MgY2FuIGJlIHJlc29sdmVkLgotCi0JKiBjb2ZmLWg4MzAwLmMgKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBDb3JyZWN0IG9mZiBieSBvbmUKLQllcnJvciBpbiBvdmVyZmxvdyBjaGVjayBmb3IgUl9SRUxCWVRFLgotCi1GcmkgSmFuIDMxIDE0OjA3OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IFBpY2sgdXAgdGhlIHN0YXJ0IGFkZHJlc3MuCi0JRnJvbSBNYXJrIFJhc2luIDxtYXJrLnJhc2luQHRlbHJhZC5jby5pbD4uCi0KLQkqIGFvdXR4LmggKGFvdXRfbGlua193cml0ZV9zeW1ib2xzKTogRG9uJ3QgYXBwbHkgZGlzY2FyZF9sIHRvCi0JZGVidWdnaW5nIHN5bWJvbHMuCi0KLVdlZCBKYW4gMjkgMDA6MDA6NDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKHJlbG9jX3R5cGUpOiBBZGQgMTZiaXQgcGMtcmVsYXRpdmUgcmVsb2MuCi0JKGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JKG1uMTAyMDBfcmVsb2NfbWFwKTogTGlrZXdpc2UuCi0KLU1vbiBKYW4gMjcgMTI6MDc6MzUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCByZWxvY3MgQkZEX1JFTE9DX00zMlJfe0hJMTZfW1VTXUxPLExPMTZ9LgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0JKiBlbGYzMi1tMzJyLmM6IEFkZCBzdXBwb3J0IGZvciB0aGVtLgotCi1Nb24gSmFuIDI3IDEyOjI1OjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dC1hcm0uYyAoTVlfc3dhcF9zdGRfcmVsb2NfaW4pOiBSZW1vdmUgdW51c2VkIHJfbGVuZ3RoLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogUmVtb3ZlIHVudXNlZCBwbHQuCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBSZW1vdmUgdXNlZAotCXJfZm9ybWF0IGFuZCByX3BjcmVsLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCSogcmlzY2l4LmMgKE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOiBEZWZpbmUgdG8gZHVtbXkgdmFsdWUuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogV2hlbiBjaGVja2luZyBmb3IKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZSB0ZXh0IHNlZ21lbnQsIGxvb2sgdXAgdGhlIG91dHB1dCBuYW1lIG9mCi0JdGhlIHJlbG9jIHNlY3Rpb24uCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGY2NC1hbHBoYS5jIChlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQotV2VkIEphbiAyMiAxNTo0MDoyOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29mZi10aWM4MC5jICh0aWM4MGNvZmZfdmVjKTogVXNlIGNvcnJlY3QgZGF0YSBwdXQvZ2V0Ci0Jcm91dGluZXMgZm9yIGxpdHRsZSBlbmRpYW4gZGF0YS4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IG1hZ2ljIHRvCi0gCVRJQzgwX0FSQ0hfTUFHSUMgZm9yIFRJYzgwLgotCi1UdWUgSmFuIDIxIDEyOjMyOjQzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXRpYzgwLmMgKHRpYzgwY29mZl92ZWMpOiBDaGFuZ2UgdG8gbGl0dGxlIGVuZGlhbiBkYXRhCi0JYXMgdGhlIGRlZmF1bHQuCi0KLVRodSBKYW4gMTYgMTc6NDU6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKE5BTUUoYmZkX2VsZixzaXplX2R5bmFtaWNfc2VjdGlvbnMpKTogQ2hhbmdlIHR5cGUgb2YKLQlhdXhpbGlhcnlfZmlsdGVycyBwYXJhbWV0ZXIgdG8gYmUgY29uc3QgY2hhciAqIGNvbnN0ICouICBBY2NlcHQgYQotCU5VTEwgdGVybWluYXRlZCBhcnJheS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDE1IDExOjIxOjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogVHJlYXQgYQotCU5PVFlQRSBzeW1ib2wgaW4gYSB0ZXh0IHNlY3Rpb24gYXMgYSBGVU5DIHN5bWJvbC4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBGb3JjZQotCXJlbG9jYmFzZSB0byBiZSBhbGlnbmVkIHRvIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUi4KLQotVHVlIEphbiAxNCAwODo0NjozMyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJhb3V0LmggKG1hY2hpbmVfdHlwZSk6IFJlc2VydmUgc2V2ZXJhbCB2YWx1ZXMgZm9yIHNwYXJjbGV0LgotCi1Nb24gSmFuIDEzIDIyOjM5OjA4IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAodGljODAtKi0qKTogRG9uJ3QgcmVxdWlyZSAnY29mZicuCi0KLU1vbiBKYW4gMTMgMTk6MzY6MjUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKHY4NTBfZWxmX2hvd3RvX3RhYmxlKTogU2V0IHRoZSBzcGVjaWFsX2Z1bmN0aW9uCi0JdGFibGUgdG8gdjg1MF9lbGZfcmVsb2MgZm9yIGFsbCBub24tc3RhbmRhcmQgcmVsb2NhdGlvbnMuCi0JKHY4NTBfZWxmX2NoZWNrX3JlbG9jcyk6IEFkZCBjaGVjayBmb3IgaCBiZWluZyBub24tbnVsbC4KLQkodjg1MF9lbGZfcmVsb2MpOiBBZGQgIFJfVjg1MF9aREFfT0ZGU0VUIHN1cHBvcnQuICBVc2Ugc3dpdGNoCi0Jc3RhdGVtZW50IGluc3RlYWQgb2YgbXVsdGlwbGUgaWZzLgotCSh2ODUwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRml4IHVwIGVycm9yIG1lc3NhZ2UsIGRvbid0IGp1c3QgY2FsbAotCWFib3J0LgotCi1Nb24gSmFuICA2IDEzOjI4OjM1IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItbW4xMDIwMC5jIChlbGZfbW4xMDIwMF9ob3d0byk6IERvbid0IGV2ZXIgc2V0IHBhcnRpYWwtaW5wbGFjZS4KLQlVc2UgYmZkX2VsZl9nZW5lcmljX3JlbG9jIGFzIHNwZWNpYWwgZnVuY3Rpb24gZm9yIGFsbCByZWxvY3MuCi0JKGJmZF9lbGYzMl9tbjEwMjAwX3JlbG9jKTogUmVtb3ZlIHVubmVjZXNzYXJ5IGZ1bmN0aW9uLgotCi0JKiBlbGYzMi1tbjEwMjAwLmMgKGVsZl9tbjEwMjAwX2hvd3RvKTogU2V0IHBjcmVsX29mZnNldCBmb3IKLQkyNGJpdCBwYy1yZWxhdGl2ZSByZWxvYy4KLQotRnJpIEphbiAgMyAxNjozMzowMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvZmYtdGljODAubyk6IEFkZCBjb2ZmY29kZS5oIHRvIGRlcGVuZGVuY3kgbGlzdC4KLQkqIGNvZmYtdGljODAuYyAodGljODBjb2ZmX3ZlYyk6IERhdGEgYnl0ZSBvcmRlciBpcyBiaWcgZW5kaWFuIGFuZAotCWhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4uICBVc2UgY29ycmVjdCBiZmRfZ2V0IGFuZAotCWJmZF9wdXQgcm91dGluZXMgZm9yIGxpdHRsZSBlbmRpYW4gaGVhZGVycy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rKTogU2V0IGFyY2ggdG8KLQliZmRfYXJjaF90aWM4MCBmb3IgVElDODBfQVJDSF9NQUdJQyBudW1iZXIuCi0KLUZyaSBKYW4gIDMgMTY6NTQ6MDggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiByZWxvYy5jOiBBZGQgQkZEX1JFTE9DXzI0LgotCSogZWxmMzItbW4xMDIwMC5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgMjRiaXQgYW5kIHBjcmVsIHJlbG9jcy4KLQkoZWxmX21uMTAyMDBfaG93dG8sIG1uMTAyMDBfcmVsb2NfbWFwKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotRnJpIEphbiAgMyAxNjo1ODozMSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCWVsZjY0LWFscGhhIG11bHRpcGxlIC5nb3QgcmV3cml0ZToKLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSk6IEFkZCBhbHdheXNfc2l6ZV9zZWN0aW9ucyBlbnRyeS4KLQkoYmZkX2VsZipfbWtvYmplY3QpOiBEb24ndCBkZWZpbmUgaGVyZSAuLi4KLQkqIGVsZnh4LXRhcmdldC5oOiAuLi4gYnV0IHJhdGhlciBoZXJlLiAgRGVmYXVsdCBhbHdheXNfc2l6ZV9zZWN0aW9ucwotCWhvb2sgdG8gTlVMTC4KLQkqIGVsZi5jIChlbGZfbWtvYmplY3QpOiBSZW5hbWUgdG8gYmZkX2VsZl9ta29iamVjdCwgc2luY2UgdGhhdCB3YXMKLQl3aGF0IHRoZSAjZGVmaW5lcyBpbiBlbGYtYmZkLmggdHJhbnNtdXRlZCBpdCB0byBhbnl3YXkuCi0KLQkqIHNlY3Rpb24uYzogQWRkIFNFQ19MSU5LRVJfQ1JFQVRFRCBmbGFnLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBBZGQgU0VDX0xJTktFUl9DUkVBVEVEIHRvCi0JcmVsb2NhdGlvbiBzZWN0aW9uIGZsYWdzLgotCShlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBVc2UgU0VDX0xJTktFUl9DUkVBVEVEIGluc3RlYWQgb2YKLQlTRUNfSU5fTUVNT1JZIHRvIHJlY29nbml6ZSBnZW5lcmF0ZWQgYml0cy4KLQkqIGVsZjMyLW02OGsuYyAoZWxmX202OGtfY2hlY2tfcmVsb2NzLCBlbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOgotCUxpa2V3aXNlLgotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9maW5hbF9saW5rLCBtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucywKLQltaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbiwgbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uLAotCW1pcHNfZWxmX2NoZWNrX3JlbG9jcywgbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24sCi0JcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcywKLQllbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uKTogQWRkIFNFQ19MSU5LRVJfQ1JFQVRFRCB0bwotCXNlY3Rpb24gZmxhZ3MuCi0JKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKF9iZmRfZWxmX21ha2VfbGlua2VyX3NlY3Rpb25fcmVsYSk6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IExpa2V3aXNlLgotCShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucyk6IENhbGwgdGhlIGFsd2F5c19zaXplX3NlY3Rpb25zIGhvb2suCi0JKGVsZl9iZmRfZmluYWxfbGluayk6IFVzZSBTRUNfTElOS0VSX0NSRUFURUQgaW5zdGVhZCBvZiBTRUNfSU5fTUVNT1JZCi0JdG8gaWRlbnRpZnkgZ2VuZXJhdGVkIGJpdHMuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IExpa2V3aXNlLgotCi0JKiBlbGY2NC1hbHBoYS5jOiBSZXdyaXRlIGV2ZXJ5dGhpbmcgdG91Y2hpbmcgcmVsb2NhdGlvbnMuCi0KLUZyaSBKYW4gIDMgMTE6NDI6NTMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKGFsbCBmdW5jdGlvbnMgYW5kIHN0YXRpYyB2YXJpYWJsZXMpOiBHbyB0aHJvdWdoCi0JYW5kIHJlZ3VsYXJpemUgbmFtZXMgdG8gYmUgb2YgdGhlIGZvcm0gdjg1MF9lbGZfPHh4eD4uCi0JKHRvcGxldmVsKTogSW5jbHVkZSA8ZWxmL3Y4NTAuaD4uCi0JKGVudW0gcmVsb2NfdHlwZSk6IE1vdmUgdG8gaW5jbHVkZS9lbGYvdjg1MC5oLgotCSh2ODUwX2VsZl9jaGVja19yZWxvY3MpOiBGb3IgY29tbW9uIHZhcmlhYmxlcywgaWYgdGhlIHZhcmlhYmxlIGlzCi0JcmVmZXJlbmNlZCBieSBhIFJfVjg1MF97U0RBLFpEQSxUREF9IHJlbG9jYXRpb24sIHB1dCB0aGUgdmFyaWFibGUKLQlpbnRvIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLgotCShlbGZfYmFja2VuZF9jaGVja19yZWxvY3MpOiBEZWZpbmUuCi0KLVR1ZSBEZWMgMzEgMTU6MTU6MjggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi12ODUwLmMgKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogRml4IHNvbWUgc3BhY2luZy4KLQotVHVlIERlYyAzMSAxNDo0NDo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqZWwtKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCShtaXBzKi0qLWxpbnV4Kik6IE5ldyB0YXJnZXQuCi0KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogQ2xlYW4gdXAuCi0JUmV0dXJuIGEgdXNlZnVsIHZhbHVlLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCAtRF9HTlVfU09VUkNFLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQsIG5vdAotCWFjX2N2X2Z1bmNfbW1hcC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCBpbnN0ZWFkIG9mCi0JYWNfY3ZfZnVuY19tbWFwIGluIGJmZC9jb25maWd1cmUuaG9zdC4KLQotCSogZWxmbGluay5oIChOQU1FKGJmZF9lbGYsc2l6ZV9keW5hbWljX3NlY3Rpb25zKSk6IEFkZAotCWZpbHRlcl9zaGxpYiBhbmQgYXV4aWxpYXJ5X2ZpbHRlcl9zaGxpYiBwYXJhbWV0ZXJzLgotCSogZWxmLmMgKF9iZmRfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBIYW5kbGUgRFRfQVVYSUxJQVJZIGFuZAotCURUX0ZJTFRFUi4KLQkqIGJmZC1pbi5oIChiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0KLU1vbiBEZWMgMzAgMTg6NDg6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfYnVpbGRfbGRzeW1zKTogV2hlbiBleHBvcnRpbmcgYWxsIGRlZmluZWQKLQlzeW1ib2xzLCBkb24ndCBleHBvcnQgYSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBieSBhbiBvYmplY3QgaW4gYW4KLQlhcmNoaXZlIHdoaWNoIGNvbnRhaW5zIHNoYXJlZCBvYmplY3RzLgotCi1Nb24gRGVjIDMwIDE2OjEyOjU4IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBhcmNodXJlcy5jIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpOiBBZGQgYmZkX2FyY2hfdGljODAKLQlmb3IgVEkgVE1TMzIwYzgwIChNVlApLgotCShiZmRfYXJjaHVyZXNfbGlzdCk6IEFkZCBiZmRfdGljODBfYXJjaC4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZSBieSBydW5uaW5nICJtYWtlIGhlYWRlcnMiLgotCi1TdW4gRGVjIDI5IDE2OjE4OjUyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjcHUtdGljODAuYyAoYmZkX3RpYzgwX2FyY2gpOiBBZGQgc3RydWN0LgotCSogY29uZmlndXJlLmluIChjYXNlICR2ZWMpOiBDb3JyZWN0IHR5cG8sICJ0YiIgbm90ICJ0cCIuCi0JQWxzbyBhZGQgY29mZmxpbmsubyBmb3IgdGljODBjb2ZmX3ZlYy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCi1Nb24gRGVjIDMwIDExOjU0OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliYmZkLmM6IFBhdGNoIHVwIHRoZSBtbWFwIGNvZGUgc28gdGhhdCBpdCBpcyBvbmx5IGJ1aWx0IGlmIEJGRAotCWlzIGNvbmZpZ3VyZWQgd2l0aCAtLXdpdGgtbW1hcC4KLQotU3VuIERlYyAyOSAxMDo0ODo1NyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtdGljODAubwotCShBTExfTUFDSElORVMpOiBBZGQgY3B1LXRpYzgwLm8KLQkoY3B1LXRpYzgwLm8sIGNvZmYtdGljODAubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0JKiBjb2ZmLXRpYzgwLmM6IEFkZCBza2VsZXRvbiwgY2xvbmVkIGZyb20gYW5vdGhlciBjb2ZmIGNvbmZpZy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IG1hZ2ljIHRvIFRJQzgwTUFHSUMKLSAJZm9yIFRJYzgwLgotCi1GcmkgRGVjIDI3IDIwOjU2OjQxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBUT0RPOiBDb3JyZWN0IGEgbWlzc3BlbGxpbmcuCi0JKiBjb2ZmLXRpYzgwLmM6IE5ldyBmaWxlIGZvciBUSSBUTVMzMjBDODAgKE1WUCkuCi0JKiBjcHUtdGljODAuYzogTmV3IGZpbGUgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKS4KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAkdmVjKTogQWRkIHRpYzgwY29mZl92ZWMgZW50cnkuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZi4KLQkqIGFyY2h1cmVzLmMgKGJmZF90aWM4MF9hcmNoKTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaCAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlKTogQWRkIGJmZF9hcmNoX3RpYzgwLgotCSogY29uZmlnLmJmZCAoY2FzZSAke3Rhcmd9KTogQWRkIHRpYzgwKi0qLWNvZmYqIHRhcmdldC4KLQkqIHRhcmdldHMuYyAodGljODBjb2ZmX3ZlYyk6IEFkZCBkZWNsIGFzIGV4dGVybiBiZmRfdGFyZ2V0LgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCB0aWM4MGNvZmZfdmVjIGVudHJ5LgotCi1GcmkgRGVjIDI3IDExOjQ4OjEyIDE5OTYgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBlbGZsaW5rLmggKGVsZl9idWNrZXRzKTogQWRkIHNvbWUgbW9yZSB2YWx1ZXMgZm9yIGxhcmdlcgotCWJpbmFyaWVzLgotCi1UaHUgRGVjIDI2IDE4OjM2OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBNb3ZlIHN1YmRpcl9kbyBvdXQgb2YgY29uZGl0aW9uYWwuIEZyb20KLQlGcmVkIEZpc2ggPGZuZkBjeWdudXMuY29tPi4KLQotV2VkIERlYyAxOCAxMDowNDozMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAyMDAuYyAoZW51bSByZWxvY190eXBlKTogRW5hYmxlIGJhc2ljIDgsIDE2LCBhbmQKLQkzMiBiaXQgcmVsb2NzLgotCShlbGZfbW4xMDIwMF9ob3d0b190YWJsZSk6IExpa2V3aXNlLgotCShtbjEwMjAwX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDE3IDExOjA5OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBBZGQgMSB0byB0aGUgdmFsdWUgb2YgYQotCW1pcHMxNiBzeW1ib2wgZHVyaW5nIHRoZSBsaW5rLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBTdWJ0cmFjdCAxIGZyb20gdGhlIHZhbHVlIG9mIGEKLQltaXBzMTYgc3ltYm9sLgotCShtaXBzX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rKTogRGVmaW5lLgotCi0JKiBlbGYuYyAoYmZkX2VsZl9wcmludF9zeW1ib2wpOiBQcmludCB0aGUgc3Rfb3RoZXIgZmllbGQgaWYgaXQgaXMKLQlub3QgemVyby4KLQotTW9uIERlYyAxNiAxNDozODozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChiZmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBEb24ndCBjaGVjayBmb3IgcmVsb2Mgc2VjdGlvbnMKLQlhZ2FpbnN0IFNFQ19ERUJVR0dJTkcgc2VjdGlvbnMgaGVyZSAocmV2ZXJ0IHBhdGNoIG9mIERlY2VtYmVyIDUpLgotCSogZWxmY29kZS5oIChlbGZfb2JqZWN0X3ApOiBDaGVjayBmb3IgdGhlbSBoZXJlLCBpbnN0ZWFkLgotCi1TdW4gRGVjIDE1IDE0OjQ2OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmY29kZS5oIChlbGZfc2x1cnBfcmVsb2NfdGFibGUpOiBBZGQgZHluYW1pYyBwYXJhbWV0ZXIuCi0JKiBlbGYuYyAoX2JmZF9lbGZfY2Fub25pY2FsaXplX3JlbG9jKTogUGFzcyBuZXcgYXJndW1lbnQgdG8KLQlzbHVycF9yZWxvY190YWJsZS4KLQkoX2JmZF9lbGZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IFVwZGF0ZSBkZWNsYXJhdGlvbiBvZgotCXNsdXJwX3JlbG9jX3RhYmxlLgotCShfYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCk6IERlY2xhcmUuCi0JKF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKTogRGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oOiBVc2UgbmV3IGR5bmFtaWMgcmVsb2Mgcm91dGluZXMgYnkgZGVmYXVsdC4KLQkqIGVsZjY0LW1pcHMuYyAobWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZSk6IEFkZCBkeW5hbWljCi0JcGFyYW1ldGVyLgotCi1GcmkgRGVjIDEzIDEzOjE4OjQ5IDE5OTYgIERhbiBXaWxkZXIgIDxkYW5AZ2FzYm95LmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfZmxhZ3MpOiBVc2UgTUM2OEtCQ1NNQUdJQyBmb3IgYmZkX2FyY2hfbTY4awotCWlmIE5BTUVTX0hBVkVfVU5ERVJTQ09SRSBpcyBkZWZpbmVkLgotCi1GcmkgRGVjIDEzIDExOjEzOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxpYmFvdXQuaCAoZW51bSBtYWNoaW5lX3R5cGUpOiBDaGFuZ2UgTV9TUEFSQ0xFVCBmcm9tIDE0MiB0byAxMzEuCi0KLVRodSBEZWMgMTIgMTU6MDc6MjAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jaGVja19yZWxvY3MpOiBNb3ZlIFJfUFBDX1BMVFJFTDI0IGludG8gdGhlCi0Jc3VwcG9ydGVkIHJlbG9jcy4KLQotVGh1IERlYyAxMiAxNDo1NTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBhZGQgYSB3ZWFrCi0Jc3ltYm9sIGlmIHRoZSByZWFsIGRlZmluaXRpb24gaXMgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotCUFmdGVyIGZpbmRpbmcgdGhlIHJlYWwgZGVmaW5pdGlvbiwgdGhlbiwgaWYgaXQgaXMgZHluYW1pYywgYWRkIHRoZQotCXdlYWsgc3ltYm9sIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQotCSogY29mZi1hdXguYyAoY29mZl9tNjhrX2F1eF9saW5rX2FkZF9vbmVfc3ltYm9sKTogTWFrZSBzdGF0aWMuCi0KLQkqIHBwY2Jvb3QuYyAocHBjYm9vdF9zZXRfYXJjaF9tYWNoKTogRG9uJ3QgZGVmaW5lOyBpdCdzIGEKLQlmdW5jdGlvbi4KLQkocHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IHRha2UgdGhlIGFkZHJlc3Mgb2YgYW4KLQlhcnJheS4KLQotVHVlIERlYyAxMCAyMzoyMzo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAocmVsb2NfdHlwZSk6IFJlbW92ZSBiaWcgZW5kaWFuIG1uMTAzMDAgcmVsb2MKLQl2YXJpYW50cy4KLQkoZWxmMzJfbW4xMDMwMF9ob3d0b190YWJsZSwgbW4xMDMwMF9yZWxvY19tYXApOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX21uMTAzMDBfcmVsb2MpOiBXcml0ZSBkYXRhIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LgotCSogcmVsb2MuYzogUmVtb3ZlIG1uMTAzMDAgYmlnIGVuZGlhbiByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCi0JKiBlbGYzMi1tbjEwMjAwLmM6IFVwZGF0ZSBmcm9tIGVsZjMyLW1uMTAzMDAuYy4KLQotRnJpIERlYyAgNiAxNToxODowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIpOiBEZWZpbmUuCi0KLQkqIGVsZjMyLW1uMTAzMDAuYzogQWRkIHNvbWUgY29tbWVudHMuCi0KLUZyaSBEZWMgIDYgMTc6MTY6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpaGV4LmMgKGloZXhfc2Nhbik6IEFsd2F5cyBpbml0aWFsaXplIGJ1ZiBiZWZvcmUganVtcGluZyB0bwotCWVycm9yX3JldHVybi4KLQkoaWhleF9yZWFkX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotVGh1IERlYyAgNSAyMjoyOToxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYyAoZWxmX21uMTAzMDBfaG93dG9fdGFibGUpOiBEb24ndCBzZXQgcGFydGlhbC0KLQlpbnBsYWNlIGZvciBtb3N0IHJlbG9jcy4KLQotVGh1IERlYyAgNSAxMzoyNDo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogQ2FsbGluZyBjaGVja19yZWxvY3MKLQlldmVuIGlmIFNFQ19BTExPQyBpcyBub3Qgc2V0LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBEb24ndCBjaGVjayBTRUNfQUxMT0MKLQl3aGVuIGRlY2lkaW5nIHdoZXRoZXIgdG8gY29weSBhIHJlbG9jIGludG8gYSBzaGFyZWQgb2JqZWN0LgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19jaGVja19yZWxvY3MpOiBMaWtld2lzZS4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9jaGVja19yZWxvY3MpOiBEb24ndCBzZXQgU0VDX0FMTE9DIGluIGEKLQlyZWxvYyBzZWN0aW9uIGlmIGl0IGlzIG5vdCBzZXQgaW4gdGhlIHNvdXJjZSBzZWN0aW9uLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGYuYyAoYmZkX3NlY3Rpb25fZnJvbV9zaGRyKTogTWFyayBhIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZAotCXdpdGggYSBTRUNfREVCVUdHSU5HIHNlY3Rpb24gYXMgU0VDX0RFQlVHR0lORy4KLQotV2VkIERlYyAgNCAxNDoxODoxMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6ICNpZiAwIGNvZGUgdGhhdAotCWV4cGVjdHMgYSAuZ290LnBsdCB1bnRpbCB3ZSBhY3R1YWxseSBjcmVhdGUgaXQuCi0KLU1vbiBEZWMgIDIgMTI6MTM6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uKTogUHJpbnQgYW4gZXJyb3IKLQltZXNzYWdlIGZvciBiZmRfcmVsb2Nfb3V0b2ZyYW5nZSwgcmF0aGVyIHRoYW4gYWJvcnRpbmcuICBGcm9tCi0JUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcyBpbgotCWEgcmVsb2NhdGVhYmxlIGxpbmssIGRvbid0IHRyeSB0byBwcm9jZXNzIHRoZW0uICBGcm9tIEhlaW56IFdyb2JlbAotCTx3cm9iZWxAbHByLmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uCi0KLU1vbiBEZWMgIDIgMDA6Mzk6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKG1uMTAzMDBfaW5mb19ob3d0byk6IFJlbmFtZWQgZnJvbQotCW1uMTAzMDBfaW5mb19ob3d0b19yZWwuICBUd2VhayByZWxvYyBhcmd1bWVudCB0byBiZSBhbgotCUVsZjMyX0ludGVybmFsX1JlbGEuCi0JKFVTRV9SRUxBKTogRGVmaW5lIGluc3RlYWQgb2YgVVNFX1JFTC4KLQkoZWxmX2luZm9fdG9faG93dG8sIGVsZl9pbmZvX2hvd3RvX3JlbCk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotU3VuIERlYyAgMSAwMDoxODo1OSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiAgSGFuZGxlIG1pcHMqLXNnaS1pcml4NiouCi0JKiBpcml4LWNvcmUuYyAoaXJpeF9jb3JlX2NvcmVfZmlsZV9wKTogIEFjY2VwdCBDT1JFX01BR0lDTjMyCi0JY29yZSBmaWxlcy4KLQotV2VkIE5vdiAyNyAxMjoxMDoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfcmVsb2NhdGVfc2VjdGlvbik6IFdhcm4gYWJvdXQgYQotCXJlbG9jYXRpb24gYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIGEgc2VjdGlvbiB3aXRoIG5vIG91dHB1dAotCXNlY3Rpb24uCi0KLVR1ZSBOb3YgMjYgMTE6MDc6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00IChCRkRfQ0NfRk9SX0JVSUxEKTogRG9uJ3QgcmVxdWlyZSBBQ19DX0NST1NTLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIG90aGVyIGZpZWxkLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBvdGhlciBmaWVsZC4KLQkoc3dhcF9vdXRfc3ltcyk6IFNldCBzdF9vdGhlciBmcm9tIGV4aXN0aW5nIHN0X290aGVyIGZpZWxkLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBTdG9yZSBzdF9vdGhlciBpbiBoYXNoCi0JdGFibGUgb3RoZXIgZmllbGQuCi0JKGVsZl9saW5rX291dHB1dF9leHRzeW0pOiBTZXQgdGhlIG90aGVyIGZpZWxkIGZyb20gdGhlIGdsb2JhbCBoYXNoCi0JdGFibGUgZW50cnkuCi0JKiBlbGYzMi1taXBzLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX01JUFMxNl8yNi4KLQkoZWxmX21pcHMxNl9qdW1wX2hvd3RvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwczE2X2p1bXBfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTMTZfSk1QLgotCShtaXBzX2luZm9fdG9faG93dG9fcmVsKTogSGFuZGxlIFJfTUlQUzE2XzI2LgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQUzE2XzI2LiAgSGFuZGxlIFJfTUlQU18yNgotCXRvIGEgbWlwczE2IHN5bWJvbC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NSVBTMTZfSk1QKTogQWRkIHRvIGxpc3Qgb2YgcmVsb2NzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGNwdS1taXBzLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgbWlwczoxNiBlbnRyeS4KLQotTW9uIE5vdiAyNSAxMToyMzozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgbG9uZyBsb25nIGZvciBtaXBzLXNnaS1pcml4NiouCi0KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogTWFrZSBsaW5lIG51bWJlciBvdmVyZmxvdwotCW9ubHkgYSB3YXJuaW5nLiAgRnJvbSBQaGlsaXBwZSBEZSBNdXl0ZXIgPHBoZGVtdXl0QHVsYi5hYy5iZT4uCi0KLU1vbiBOb3YgMjUgMDg6NTI6MjkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1tbjEwMzAwLmMgKGJmZF9lbGYzMl9tbjEwMzAwX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShlbnVtIHJlbG9jX3R5cGUpOiBBZGQgbW9yZSByZWxvYyB0eXBlcy4KLQkoZWxmMzJfbW4xMDMwMF9ob3d0b190YWJsZSk6IFVwZGF0ZSBmb3IgbmV3IHJlbG9jIHR5cGVzLgotCShlbGYzMl9tbjEwMzAwX3JlbG9jX21hcCk6IFVwZGF0ZSBmb3IgbmV3IHJlbG9jIHR5cGVzLgotCSogcmVsb2MuYzogQWRkIHNvbWUgbmV3IHJlbG9jcyBmb3IgdGhlIG1uMTAzMDAgc2VyaWVzLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotU2F0IE5vdiAyMyAxMzoyNjoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzZXR1cF9zZWN0aW9ucyk6IERvbid0IGxvc2UgZm9yIGEgc3BhY2Ugd2hpY2ggaGFzCi0Jbm8gZGF0YSwgYnV0IHNvbWUgc3ltYm9scy4KLQotRnJpIE5vdiAyMiAxMTozMjoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgZ290X25lZWRlZCBmaWVsZC4KLQkoc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgZ290X25lZWRlZC4KLQkoc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IHNldCAuZ290IHNlY3Rpb24gc2l6ZSBpZiBpdAotCWlzIG5vdCBhbHJlYWR5IHNldC4gIFNldCBnb3RfbmVlZGVkLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2hlY2sgZ290X25lZWRlZC4gIE9ubHkgc2V0Ci0Jc2R5bnB0ciwgYW5kIG9ubHkgaGFuZGxlIGR5bmFtaWMgc2VjdGlvbnMsIGlmIGR5bmFtaWMgc2VjdGlvbnMgYXJlCi0JbmVlZGVkLgotCShzdW5vc19zY2FuX3N0ZF9yZWxvY3MpOiBQYXNzIGZhbHNlIHRvIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLgotCUluaXRpYWxpemUgLmdvdCBzZWN0aW9uLgotCShzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBMaWtld2lzZS4KLQkoc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wpOiBTZXQgdXAgUExUIGVudHJ5IGV2ZW4gaWYgdGhpcyBpcyBub3QKLQlhIGR5bmFtaWMgc3ltYm9sLgotCShzdW5vc19maW5pc2hfZHluYW1pY19saW5rKTogQ2hlY2sgZ290X25lZWRlZC4gIE9ubHkgc2V0IHVwCi0JZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGlmIG5lZWRlZC4KLQotVGh1IE5vdiAyMSAxMDozMTozMSAxOTk2ICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5iZmQ6IEFkZGVkIFZlcnNhRE9TIGZvcm1hdCB0byB0aGUgRXJpY3Nzb24gY29uZmlndXJhdGlvbi4KLQotV2VkIE5vdiAyMCAxNjozMTozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLW1uMTAzMDAuYzogUm91Z2ggY3V0IGF0IHJlbG9jcyBmb3IgdGhlIG1uMTAzMDAuCi0KLVdlZCBOb3YgMTMgMDg6MTI6MzggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZWxmMzItZDEwdi5vKTogRG9uJ3QgZGVwZW5kIG9uIGVsZi9kMTB2LmgKLQlhbnltb3JlLgotCi1UdWUgTm92IDEyIDEzOjMwOjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZmlsZW1vZGUuYzogSW5jbHVkZSBzeXNkZXAuaC4KLQkqIGloZXguYzogQWRkIGNhc3RzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQkqIHN1bm9zLmM6IEFkZCBjYXN0cyB0byBlbGltaW5hdGUgY29tcGlsZXIgd2FybmluZ3MuCi0KLU1vbiBOb3YgMTEgMTA6Mzc6MDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBDcmVhdGUgLmdvdC5wbHQKLQlzZWN0aW9uLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19MT0NBTDI0UEMuICBNYWtlCi0JYXBwcm9wcmlhdGUgcmVsb2NhdGlvbnMgaW4gdGhlIC5zbyBmaWxlIGlmIHNoYXJlZC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0KLVR1ZSBPY3QgMjkgMTU6MDM6MDIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbTMyci5jIChlbGZfbTMycl9ob3d0b190YWJsZSwgUl9NMzJSXzI0KTogVXNlCi0JY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQuCi0KLVR1ZSBPY3QgMjkgMTI6NTM6NDYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQxMHYuYyAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiBEb24ndCBjb21wbGFpbiBvbgotCW92ZXJmbG93cyBmb3IgUl9EMTBWXzE2IGFuZCBSX0QxMFZfMTguCi0KLVR1ZSBPY3QgMjkgMTM6MjM6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0KTogVXNlIExNQSByYXRoZXIgdGhhbiBWTUEuCi0JKGRvX3dpdGhfcmVsb2NzKTogTGlrZXdpc2UuCi0JKGRvX2FzX3JlcGVhdCk6IExpa2V3aXNlLgotCShjb3B5X2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQotRnJpIE9jdCAyNSAxNjo1Njo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0KTogQ29ycmVjdGx5IHJlY29yZCB3aGV0aGVyCi0JdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcGFydC4KLQotVGh1IE9jdCAyNCAxNDozMjo1MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IENvcnJlY3RseQotCWhhbmRsZSB0ZGEgb2Zmc2V0cyBmb3Igc2xkLncgYW5kIHNzdC53IGluc3RydWN0aW9ucy4KLQlGaXggYWxpZ25tZW50IGNoZWNrIGluIHNsZC53IGFuZCBzc3QudyB0ZGEgcmVsb2MgaGFuZGxpbmcuCi0KLVRodSBPY3QgMjQgMDk6MDg6NDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiAgU2V0IFVTRV9CSU5BUllfRk9QRU4gZm9yICotKi13aW5kb3dzLgotCi1XZWQgT2N0IDIzIDAwOjUzOjE2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jOiBBZGQgY29tbWVudHMgYWJvdXQgYXNzdW1wdGlvbnMgYWJvdXQKLQljaGFyLCBzaG9ydCAmIGxvbmcgc2l6ZXMuCi0JKGVsZjMyX3Y4NTBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUpOiBGaXggc2lnbiBleHRlbnNpb24KLQlwcm9ibGVtcyBmb3Igc2V2ZXJhbCByZWxvY3MuCi0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmMzJfdjg1MF9ob3d0b190YWJsZSk6IEZpeCB0eXBvIGluCi0JUl9WODUwX1NEQV9PRkZTRVQgZW50cnkuCi0KLVdlZCBPY3QgMjMgMDA6MjA6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wpOiBEb24ndCBhbGxvY2F0ZSBsZHN5bS4KLQlTdG9yZSBpbXBvcnQgZmlsZSBpbmRleCBpbiBsZGluZHguCi0JKHhjb2ZmX2J1aWxkX2xkc3ltcyk6IEFzc3VtZSB0aGF0IGxkc3ltIHdhcyBub3QgcHJldmlvdXNseQotCWFsbG9jYXRlZC4gIEZvciBhbiBpbXBvcnRlZCBzeW1ib2wsIGNvcHkgbGRpbmR4IGludG8gbF9pZmlsZS4KLQotVHVlIE9jdCAyMiAxOToyMDozOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBGaXggb3JkZXJpbmcgb2YKLQlSX1Y4NTBfWkRBX09GRlNFVCBhbmQgUl9WODUwX1REQV9PRkZTRVQuICBGaXggdmFyaW91cwotCWZpZWxkcyBpbiBSX1Y4NTBfVERBX09GRlNFVC4KLQkoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IFR3ZWFrIHBjLXJlbGF0aXZlCi0JcmVsb2NzIHRvIHdvcmsgbW9yZSBsaWtlIG90aGVyIHJlbG9jcy4gIEhhbmRsZSBSX1Y4NTBfVERBX09GRlNFVAotCXJlbG9jYXRpb25zLgotCi0JKiBlbGYzMi12ODUwLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IFJldHVybiBhbiBlcnJvciBpZiB3ZSBnZXQgYSByZWxvYwotCXdlIGNhbid0IGhhbmRsZS4KLQkoZWxmMzJfdjg1MF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSk6IE5ldyBmdW5jdGlvbi4KLQkodjg1MF9lbGZfcmVsb2NhdGlvbl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMjIgMTc6MjI6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW5hcnkuYyAoYmluYXJ5X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogSWdub3JlIHNlY3Rpb25zIHdoaWNoCi0JZG9uJ3QgaGF2ZSBTRUNfTE9BRCBhbmQgU0VDX0FMTE9DIHNldC4KLQotTW9uIE9jdCAyMSAxMjoxMzowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IEF2b2lkIGxvc2luZyBzdGF0aWMKLQlzeW1ib2xzIGluIHRoZSAuYnNzIHNlY3Rpb24uCi0KLU1vbiBPY3QgMjEgMTA6NTQ6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9taXBzX2hvd3RvX3RhYmxlKTogRGVzY3JpYmUgUl9NSVBTXzY0LgotCShtaXBzMzJfNjRiaXRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtaXBzX3JlbG9jX21hcCk6IEFkZCBlbnRyeSBmb3IgQkZEX1JFTE9DXzY0LgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSGFuZGxlIFJfTUlQU182NC4KLQotCSogbGlua2VyLmMgKGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlcik6IFByaW50IGFuIGVycm9yIG1lc3NhZ2UKLQl3aGVuIGF0dGVtcHRpbmcgdG8gZG8gYSByZWxvY2F0ZWFibGUgbGluayB3aXRoIGRpZmZlcmVudCBvYmplY3QKLQlmaWxlIGZvcm1hdHMsIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLVRodSBPY3QgMTcgMTA6NDM6MjkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogcmVsb2MuYyAobTMyciByZWxvY3MpOiBSZW5hbWUgdGhlbS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlZ2VuZXJhdGVkLgotCSogZWxmMzItbTMyci5jOiBVcGRhdGUuCi0JKG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShlbGZfbTMycl9ob3d0b190YWJsZSwgUl9NMzJSXzEwX1BDUkVMIGVudHJ5KTogVXNlIGl0LgotCShlbGZfbTMycl9ob3d0b190YWJsZSwgUl9NMzJSXzI0IGVudHJ5KTogRml4IHtzcmMsZHN0fV9tYXNrcy4KLQotV2VkIE9jdCAxNiAxMToyNDozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfZmluYWxfbGluayk6IFNldCAibGlua2VyX21hcmsiIGZvcgotCWFsbCBzZWN0aW9ucyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCShfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IERpc2NhcmQgc3ltYm9scyBpbiBzZWN0aW9ucwotCXdoaWNoIGFyZSBiZWluZyBkaXNjYXJkZWQuCi0JKiBlbGYzMi12ODUwLmMgKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX1Y4NTBfU0RBX09GRlNFVCwKLQlSX1Y4NTBfVERBX09GRlNFVCBhbmQgUl9WODUwX1pEQV9PRkZTRVQuCi0JKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShlbGZfdjg1MF9yZWxvY19tYXApOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiByZWxvYy5jOiBBZGQgYWRkaXRpb25hbCBWODUwIHJlbG9jYXRpb25zLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsdC4KLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9yZWxvYyk6IE1hc2sgb3V0IGJpdHMgd2UKLQlubyBsb25nZXIgd2FudCBpbiBwYy1yZWxhdGl2ZSByZWxvY3MuCi0KLVR1ZSBPY3QgMTUgMjI6MTc6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi12ODUwLmMgKGJmZF9lbGYzMl92ODUwX3JlbG9jKTogRG9uJ3Qgc2lsZW50bHkKLQlhY2NlcHQgYSByZWxvYyBhZ2FpbnN0IGFuIHVuZGVmaW5lZCBzeWJtb2whCi0KLVR1ZSBPY3QgMTUgMTY6MTc6MjggMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jOiAgRGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyIHRvIGJlICdfJy4KLQotVHVlIE9jdCAxNSAxMjo0MDo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFZFUlNJT046IEJ1bXAgZm9yIG5ldyByZWxvY2F0aW9uLgotCi0JKiBob3N0cy9pMzg2YnNkLmg6IElmIE5CUEcgaXMgbm90IGRlZmluZWQsIGRlZmluZSBpdCBhcwotCVBBR0VfU0laRSwgZm9yIHJlY2VudCB2ZXJzaW9ucyBvZiBGcmVlQlNELgotCi1Nb24gT2N0IDE0IDEyOjM3OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFVzZSBgbG9uZyBsb25nJyBhcyB0aGUgNjQgYml0IHR5cGUgb24gYSBTb2xhcmlzCi0JaG9zdCwgc2luY2UgYm90aCBnY2MgYW5kIHRoZSBTdW5QUk8gY29tcGlsZXJzIHN1cHBvcnQgaXQuCi0KLU1vbiBPY3QgMTQgMTE6MTc6MjQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHJlbG9jLmM6IENyZWF0ZSBhIG5ldyBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUwuICBJdCB3YXMgYQotCW1pc3Rha2UgdG8gaGF2ZSByZXVzZWQgdGhlIEVDT0ZGIExJVEVSQUwgZm9yIEVMRiBzaW5jZSB0aGV5IGhhdmUKLQlkaWZmZXJlbnQgc2VtYW50aWNzLgotCSogZWxmNjQtYWxwaGEuYyAoZWxmX3JlbG9jX21hcCk6IE1hcCBmcm9tIEVMRl9MSVRFUkFMLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogVHJhcCAuZ290Ci0Jc2VjdGlvbiBvdmVyZmxvdy4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IERvIG5vdCBlbWl0IGEKLQlkeW5hbWljIHJlbG9jYXRpb24gZm9yIGFuIHVuZGVmd2VhayBzeW1ib2wgd2hlbiB3ZSBhcmUgYnVpbGRpbmcKLQlhIHN0YXRpYyBleGVjdXRhYmxlLgotCi1UaHUgT2N0IDEwIDExOjE1OjA2IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkIChjb25maWcuYmZkLCB0YXJnbWF0Y2guc2VkKTogRWRpdCByZWZlcmVuY2VzIHRvCi0JcG9pbnQgZXhwbGljaXRseSB0byBzcmNkaXIuCi0JKHRhcmdtYXRjaC5oKTogRWRpdCByZWZlcmVuY2VzIHRvIHBvaW50IGV4cGxpY2l0bHkgdG8gb2JqZGlyLgotCi1UaHUgT2N0IDEwIDE0OjE0OjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZDogV2hlbiBzZXR0aW5nIHRhcmdfY3B1LCBkb24ndCBnZXQgY29uZnVzZWQgYnkKLQlsaW51eC1nbnUuCi0KLVR1ZSBPY3QgIDggMDg6NTE6MTkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmhvc3Q6ICBBZGQgc3VwcG9ydCBmb3Igd2luZG93cyBob3N0IChhIGJ1aWxkIGRvbmUKLQl1bmRlciB0aGUgTWljcm9zb2Z0IGJ1aWxkIGVudmlyb25tZW50KS4KLQotVHVlIE9jdCAgOCAxMTo0MDoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgYSBzeW1ib2wgaXMgYSB3ZWFrCi0JZGVmaW5pdGlvbiBpbiBhIGR5bmFtaWMgb2JqZWN0LCBhZGQgaXQgdG8gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlCi0JaWYgYW55IGR5bmFtaWMgb2JqZWN0IG1lbnRpb25zIGl0LiAgUmV2ZXJ0cyBwYXJ0IG9mIGxhc3QgcGF0Y2guCi0KLQkqIHN1bm9zLmMgKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUpOiBBZGQgZ290X2Jhc2UgZmllbGQuCi0JKHN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpOiBJbml0aWFsaXplIGdvdF9iYXNlLgotCShiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgdGhlIC5nb3Qgc2VjdGlvbiBpcyBtb3JlCi0JdGhhbiAweDEwMDAgYnl0ZXMsIHNldCBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGFuZCBnb3RfYmFzZSB0bwotCTB4MTAwMC4KLQkoc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYyk6IFN1YnRyYWN0IGdvdF9iYXNlIGZyb20gYSBiYXNlCi0JcmVsYXRpdmUgcmVsb2NhdGlvbi4KLQotCSogZWxmMzItbWlwcy5jIChlbGZfbWlwc19pc2EpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBEb24ndCB3YXJuIGFib3V0IGxpbmtpbmcKLQktbWlwczEgYW5kIC1taXBzMiBjb2RlIHRvZ2V0aGVyLCBvciAtbWlwczMgYW5kIC1taXBzNCBjb2RlLgotCi1Nb24gT2N0ICA3IDExOjQ0OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaGl2ZS5jIChkb19zbHVycF9jb2ZmX2FybWFwKTogT25seSB0cmVhdCBhcmNoaXZlIGFzIGxpdHRsZQotCWVuZGlhbiBmb3IgaTk2MCBDT0ZGLgotCi1GcmkgT2N0ICA0IDEzOjQ5OjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBBZGp1c3Qgc29mYXIKLSAJYnkgdGhlIGNoYW5nZSBpbiBzaXplIG9mIHRoZSBzZWN0aW9uIHdoZW4gRVhFQ19QIGlzIG5vdCBzZXQuCi0KLQkqIGNvZmYtbTY4ay5jIChjb2ZmX3J0eXBlX3RvX2hvd3RvKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShtNjhrY29mZl9ydHlwZV90b19ob3d0byk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjZi1tNjhrbHlueC5jIChjb2ZmX202OGtfbHlueF9ydHlwZV90b19ob3d0byk6IEFkZCB0aGUgc2VjdGlvbgotCVZNQSB0byB0aGUgYWRkZW5kIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jLgotCi0JKiBkZXAtaW4uc2VkOiBSZXdvcmsgYmFja3NsYXNoIGxvb3AgYSBiaXQgdG8gYXZvaWQgYnVnIGluIHNlZCBvbgotCUhQL1VYIDEwLjIwLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBkZXAtaW4uc2VkOiBSZW1vdmUgLi4vYmZkL3N5c2RlcC5oLCBzaW5jZSBpdCB3aWxsIGFwcGVhciB3aGVuCi0Jc29tLmggaXMgaW5jbHVkZWQuCi0KLUZyaSBPY3QgIDQgMTE6NDE6MzkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIGV4cGxpY2l0IGRlcGVuZGVuY2llcyBmb3IgbW4xMDIwMCBhbmQKLQltbjEwMzAwIGZpbGVzLgotCShBTExfTUFDSElORV9DRklMRVMpOiBBZGQgY3B1LW1uMTAyMDAuYyBhbmQgY3B1LW1uMTAzMDAuYy4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIGVsZjMyLW1uMTAyMDAuYyBhbmQgZWxmMzItbW4xMDMwMC5jCi0JKGRlcGVuZGVuY2llcyk6IFJlYnVpbHQuCi0KLVRodSBPY3QgIDMgMTY6NTc6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBTZXQgb2JqX2NvZmZfa2VlcF9zeW1zCi0JZHVyaW5nIHRoaXMgZnVuY3Rpb24uCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogT25seSB1c2UgYW4gZXhpc3RpbmcKLQlzZWN0aW9uIGlmIHRoZSBmbGFncyBhcmUgY29tcGF0aWJsZS4KLQotCSogY29uZmlndXJlLmluOiBBZGQgaGF2ZXZlY3MsIGFuZCBwdXQgaXQgaW4gdGRlZmF1bHRzLgotCSogbXB3LWNvbmZpZy5pbjogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnbWF0Y2guc2VkOiBOZXcgZmlsZTsgYSBzZWQgc2NyaXB0IHRvIGJ1aWxkIHRhcmdtYXRjaC5oIGZyb20KLQljb25maWcuYmZkLgotCSogY29uZmlnLmJmZDogQWRkICNpZiwgI2VuZGlmLCBhbmQgY29tbWVudHMgZm9yIHRhcmdtYXRjaC5oLgotCSogdGFyZ2V0cy5jOiBJbmNsdWRlICJmbm1hdGNoLmgiLgotCShzdHJ1Y3QgdGFyZ21hdGNoKTogRGVmaW5lLgotCShiZmRfdGFyZ2V0X21hdGNoKTogRGVmaW5lIGJ5IGluY2x1ZGluZyB0YXJnbWF0Y2guaC4KLQkoYmZkX2ZpbmRfdGFyZ2V0KTogSWYgdGhlIHRhcmdldCBpcyBub3QgZm91bmQgYnkgbmFtZSwgc2VhcmNoIGZvcgotCWl0IGFzIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgYW91dC1hcm0ubywgYW91dC1zcGFyY2xlLm8sIGhwMzAwYnNkLm8sCi0JaTM4NmR5bml4Lm8sIG02OGs0a25ldGJzZC5vLCBhbmQgcmlzY2l4Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBhb3V0LWFybS5jLCBhb3V0LXNwYXJjbGUuYywKLQlocDMwMGJzZC5jLCBpMzg2ZHluaXguYywgbTY4azRrbmV0YnNkLmMsIGFuZCByaXNjaXguYy4KLQkoSEZJTEVTKTogQWRkIHRhcmdtYXRjaC5oLiAgQWxzbywgYWxwaGFiZXRpemUgYW5kIHJlaW5kZW50LgotCShDRklMRVMpOiBSZW1vdmUgaTM4NmR5bml4LmMgYW5kIGhwMzAwYnNkLmMuCi0JKHRhcmdtYXRjaC5oKTogTmV3IHRhcmdldC4KLQkoZG9fY2xlYW4pOiBSZW1vdmUgdGFyZ21hdGNoLmguCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikuCi0JKiBhY2NvbmZpZy5oOiBBZGQgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIHN5c2RlcC5oOiBJZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViwgZGVjbGFyZSBnZXRlbnYuCi0JKiBhb3V0LWFkb2JlLmMgKGFvdXRfYWRvYmVfb2JqZWN0X3ApOiBEb24ndCBkZWNsYXJlIGdldGVudi4KLQotVGh1IE9jdCAgMyAwOToyOTowOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNwdS1tbjEweDAwLmMsIGVsZjMyLW1uMTB4MDA6IFJlbW92ZWQuCi0JKiBjcHUtbW4xMDIwMC5jLCBjcHUtbW4xMDMwMC5jOiBOZXcgZmlsZXMuCi0JKiBlbGYzMi1tbjEwMjAwLmMsIGVsZjMyLW1uMTAzMDAuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IEJyZWFrIG1uMTB4MDAgc3VwcG9ydCBpbnRvIHR3byBzZXBhcmF0ZQotCWNvbmZpZ3VyYXRpb25zLCBtbjEwMjAwIGFuZCBtbjEwMzAwLgotCSogYXJjaHVyZXMuYywgY29uZmlnLmJmZCwgY29uZmlndXJlLmluLCBlbGYuYywgdGFyZ2V0cy5jOiBMaWtld2lzZS4KLQkqIGJmZC1pbjIuaCwgY29uZmlndXJlOiBSZWJ1aWx0LgotCi1UaHUgT2N0ICAzIDE1OjM4OjE5IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChkb19jbGVhbik6IE1vdmUgY29uZmlnLmxvZyB0byBkb19kaXN0Y2xlYW4uCi0KLVdlZCBPY3QgIDIgMjE6NDA6NTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjcHUtbW4xMHgwMC5jLCBlbGYzMi1tbjEweDAwLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgY3B1LW1uMTB4MDAuby4KLQkoQkZEMzJfQkFDS0VORFMpOiBTaW1pbGFybHkgZm9yIGVsZjMyLW1uMTB4MDAuby4KLQkoZWxmMzItbW4xMHgwMC5vKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGFyY2h1cmVzLmMgKGVudW0gYmZkX2FyY2hpdGVjdHVyZSk6IEFkZCBiZmRfYXJjaF9tbjEweDAwLgotCShiZmRfbW4xMHgwMF9hcmNoKTogRGVjbGFyZS4KLQkoYmZkX2FyY2h1cmVzX2xpc3QpOiBBZGQgYmZkX21uMTB4MDBfYXJjaC4KLQkqIGNvbmZpZy5iZmQ6IEFkZCBtbjEweDAwLSotKi4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGJmZF9lbGYzMl9tbjEweDAwX3ZlYy4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgYmZkX2FyY2hfbW4xMHgwMC4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX21uMTB4MDBfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjMyX21uMTB4MDBfdmVjLgotCSogYmZkLWluMi5oLCBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVdlZCBPY3QgIDIgMTU6NDY6NDUgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQlvcGVuVk1TL0FscGhhOiBQcm92aWRlIGZpbGVuYW1lIGFuZCBjYXNlX2hhY2sgZmxhZ3MgdmlhCi0Jc3ltYm9sIHRhYmxlIGZyb20gZ2FzLgotCUFkZCBjYXNlX2hhY2sgY29kZSBmb3Igc3ltYm9sIG91dHB1dCBmcm9tIHZheC92bXMuCi0JKiBldmF4LWFscGhhLmMgKGV2YXhfaW5pdGlhbGl6ZSk6IFJlbW92ZSBmaWxlbmFtZSBoYW5kbGluZywKLQlmaWxlbmFtZSBpcyBwcm92aWRlZCB2aWEgc3ltYm9sIHRhYmxlLgotCShldmF4X2dldF9zeW10YWIpOiBVc2UgbG9jYWwgc3ltYm9sIGNvdW50IHdoZW4gc2V0dGluZyB1cCB0YWJsZS4KLQkqIGV2YXgtZWdzZC5jIChfYmZkX2V2YXhfc2x1cnBfZWdzZCk6IFByaW50IGNvcnJlY3QgbmFtZSB3aGVuCi0JZGVidWdnaW5nLgotCShfYmZkX2V2YXhfd3JpdGVfZWdzZCk6IFNraXAgZmlsZSBuYW1lIHN5bWJvbC4KLQkqIGV2YXgtZW1oLmMgKGdldF92bXNfdGltZV9zdHJpbmcpOiBMb2NhbCBmdW5jdGlvbiBub3cuCi0JKF9iZmRfZXZheF93cml0ZV9lbWgpOiBFeHRyYWN0IHNvdXJjZSBmaWxlbmFtZSBhbmQgY2FzZV9oYWNrIGZsYWdzCi0JZnJvbSBzeW1ib2wgdGFibGUuCi0JKiBldmF4X3dyaXRlX2V0aXIgKF9iZmRfZXZheF93cml0ZV9ldGlyKTogUGFzcyBhbGwgc3ltYm9sIG5hbWVzCi0JdGhyb3VnaCBfYmZkX2V2YXhfY2FzZV9oYWNrX3N5bWJvbC4KLQkqIGV2YXgtbWlzYy5jIChoYXNoX3N0cmluZywgX2JmZF9ldmF4X2Nhc2VfaGFja19zeW1ib2wpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKF9iZmRfZXZheF9iYXNlbmFtZSk6IFJlbW92ZWQuCi0JKF9iZmRfZ2V0X3Ztc190aW1lX3N0cmluZyk6IE1vdmVkIHRvIGV2YXgtZW1oLmMuCi0JKiBldmF4LmggKGV2YXhfcHJpdmF0ZV9kYXRhX3N0cnVjdCk6IFJlbW92ZSBmaWxlbmFtZS4KLQkoZmxhZ19oYXNoX2xvbmdfbmFtZXMsIGZsYWdfc2hvd19hZnRlcl90cnVuYywKLQlmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZSwgdm1zX25hbWVfbWFwcGluZyk6IE5ldyBmbGFncyBmb3IKLQl2bXNfY2FzZV9oYWNrLgotCi1XZWQgT2N0ICAyIDEyOjAyOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZnJlZWJzZC5oIChOX0dFVF9NQUdJQ19ORVQpOiBEb24ndCB1c2UgbnRvaGwuCi0JKE5fR0VUTUlEX05FVCwgTl9HRVRGTEFHX05FVCk6IExpa2V3aXNlLgotCShOT19TV0FQX01BR0lDKTogRG9uJ3QgZGVmaW5lLgotCShTV0FQX01BR0lDKTogRGVmaW5lLgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBjcmFzaCBpZiB0aGVyZSBpcwotCW5vIGhhc2ggdGFibGUgZW50cnkgZm9yIGEgZ2xvYmFsIHN5bWJvbC4KLQotVHVlIE9jdCAgMSAxNjoxNDoyMiAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotCSogY29uZmlnLmJmZCAobWlwcyotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIG1pcHMqLSotZWxmKi4KLQotVHVlIE9jdCAgMSAxMjozMTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERvbid0IG92ZXJyaWRlIGEgbWVhbmluZ2Z1bAotCXN5bWJvbCB0eXBlIHdpdGggVF9OVUxMLiAgV2FybiBpZiBzeW1ib2wgdHlwZSBjaGFuZ2VzLiAgQmFzZWQgb24KLQlwYXRjaCBmcm9tIFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogT25seSBwdXQgYSBzeW1ib2wgZnJvbQotCWEgZHluYW1pYyBvYmplY3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGlmIGl0IGlzIHJlZmVyZW5jZWQKLQlvciBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuCi0KLUZyaSBTZXAgMjcgMTg6NDE6MDcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChiZmRfZWxmMzJfdjg1MF9pc19sb2NhbF9sYWJlbCk6ICBOZXcgZnVuY3Rpb24gdG8KLQlyZW1vdmUgZHdhcmYgbG9jYWwgbGFiZWxzLiAgU2hyaW5rcyBiaW5hcmllcyBieSBhIGZhY3RvciBvZiAzIQotCi1Nb24gU2VwIDIzIDEzOjMzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogQ3JlYXRlIHRoZSAuc2JzcyBzZWN0aW9uCi0JYnkgaGFuZCwgcmF0aGVyIHRoYW4gYnkgY2FsbGluZyBiZmRfbWFrZV9zZWN0aW9uLgotCi1Nb24gU2VwIDIzIDA5OjIzOjQxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBSZW5hbWUgbTMyciByZWxvY3MuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWx0LgotCSogZWxmMzItbTMyci5jOiBVcGRhdGUuCi0KLUZyaSBTZXAgMjAgMTE6NDM6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlCi0JbGluaywgYWRqdXN0IHRoZSBzeW1ib2wgaW5kZXggb2YgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLiAgRG9uJ3QKLQljaGFuZ2UgdGhlIGFkZGVuZCBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIHBjcmVsX29mZnNldCBpcyBzZXQuCi0JKiBzdW5vcy5jIChiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3QgZG8gYW55dGhpbmcgZm9yCi0JYSByZWxvY2F0ZWFibGUgbGluay4KLQotCSogcmVsb2MuYyAoYmZkX3BlcmZvcm1fcmVsb2NhdGlvbik6IEFwcGx5IHRoZSByZWxvY2F0aW9uIGV2ZW4gaWYKLQlpdCBpcyB6ZXJvLCBpbiBjYXNlIHNyY19tYXNrIG1hdHRlcnMuCi0JKGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQotVGh1IFNlcCAxOSAxMTowMzowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogQWx3YXlzIGluaXRpYWxpemUKLQlrZWVwX3N5bXMuCi0gCShfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgc2V0IHRhcmdldF9pbmRleAotCXRvIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuCi0KLVR1ZSBTZXAgMTcgMTQ6MTg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NsdXJwX2xpbmVfdGFibGUpOiBXYXJuIGFib3V0IGlsbGVnYWwgc3ltYm9sCi0JaW5kaWNlcywgcmF0aGVyIHRoYW4gY3Jhc2hpbmcuCi0JKGNvZmZfc2x1cnBfcmVsb2NfdGFibGUpOiBMaWtld2lzZS4gIENoZWNrIHdoZXRoZXIgdGhlIGhvd3RvIGZpZWxkCi0JaXMgTlVMTC4KLQkqIGNvZmYtc2guYyAoc2hfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGZvciBhbiBpbGxlZ2FsIHN5bWJvbAotCWluZGV4LgotCi1Nb24gU2VwIDE2IDEyOjM5OjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hcm0uYyAoYW91dGFybV9zdGRfcmVsb2NfaG93dG8pOiBDaGFuZ2UgZHN0X21hc2sgZm9yIEFSTTI2RAotIAlyZWxvYyB0byAwLgotCShjb2ZmX2FybV9hZGp1c3Rfc3ltbmR4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9hZGp1c3Rfc3ltbmR4KTogRGVmaW5lLgotCi0JKiBzcmVjLmMgKHNyZWNfc2Nhbik6IEFjY2VwdCBtdWx0aXBsZSBzeW1ib2xzIG9uIGEgc2luZ2xlIGxpbmUuCi0JRnJvbSBQYXNjYWwgTWFydGluIDxwbWFydGluQGFsc3lzLmNvbT4uCi0KLQkqIFJFQURNRTogTmV3IGZpbGUuCi0KLUZyaSBTZXAgMTMgMTQ6MzI6NDIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYW91dGYxLmggKE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogRGVmaW5lLgotCShzdW5vc19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgU2VwIDEzIDE1OjUwOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBTd2l0Y2ggb24gb3V0cHV0IEJGRCByYXRoZXIKLQl0aGFuIGlucHV0IEJGRC4KLQkoYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIHNlY3Rpb24uYyAoYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBMaWtld2lzZS4KLQkqIHN5bXMuYyAoYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSk6IExpa2V3aXNlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dC10YXJnZXQuaCAoTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBDaGVjayB0aGF0Ci0JYm90aCBCRkQncyBhcmUgdGhlIHJpZ2h0IGZsYXZvdXIuCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZi5jIChfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkoX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQkocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBwZWljb2RlLmggKHBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLWhwcGEuYyAoZWxmX2hwcGFfaG93dG9fdGFibGUpOiBGaWxsIGluIHNvbWUgZmllbGRzIGZvcgotCVJfUEFSSVNDX0RJUjMyLCBzbyB0aGF0IF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIHBhc3NlcwotCWl0cyBzYW5pdHkgY2hlY2suCi0KLVRodSBTZXAgMTIgMTE6NDU6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmM6IEFkZCBtMzJyIHJlbG9jcy4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBjcHUtbTMyci5jLGVsZjMyLW0zMnIuYzogTmV3IGZpbGVzLgotCi1UaHUgU2VwIDEyIDExOjEwOjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3ZlYyk6IFNldCBzeW1ib2xfbGVhZGluZ19jaGFyIGZpZWxkIHRvICdfJy4KLQotV2VkIFNlcCAxMSAxMTo1Nzo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHRla2hleC5jIChmaXJzdF9waGFzZSk6IENoYW5nZSB0eXBlIHBhcmFtZXRlciBmcm9tIGNoYXIgdG8gaW50LgotCShvdXQpOiBMaWtld2lzZS4KLQkocGFzc19vdmVyKTogQ2hhbmdlIGZ1bmMgdG8gZXhwZWN0IGludCwgbm90IGNoYXIuCi0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogVGVzdCBTRUNfQUxMT0MKLQlyYXRoZXIgdGhhbiBTRUNfTE9BRCB3aGVuIGFsaWduaW5nIHRoZSBmaWxlIG9mZnNldCBmb3IgdGhlIGZpcnN0Ci0Jc2VjdGlvbiBpbiBhIHNlZ21lbnQuCi0KLVR1ZSBTZXAgMTAgMTY6MTg6MzAgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYyAoY29mZl9zZWN0aW9uX3R5cGUpOiBNYWtlIGFyZyBjb25zdC4KLQkqIGlyaXgtY29yZS5jIChpcml4X2NvcmVfY29yZV9maWxlX3ApOiBSZW1vdmUgZXh0cmFuZW91cyBleHRyYSBhcmcKLQl0byBtYWtlX2JmZF9hc2VjdGlvbigpLgotCSogZWxmLWJmZC5oIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBBZGQgcHJvdG90eXBlLgotCSogZWxmY29kZS5oIChiZmRfc2VjdGlvbl9mcm9tX3BoZHIpOiBSZW1vdmUgcHJvdG90eXBlLgotCShfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCk6IFJlbW92ZSBwcm90b3R5cGUuCi0KLQkqIG5ldGJzZC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBBZGQgcHJvdG90eXBlLgotCSogYWl4Mzg2LWNvcmUuYyAoc3dhcF9hYm9ydCk6IERpdHRvICYgbWFrZSBzdGF0aWMKLQkqIGhwdXgtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkqIGlyaXgtY29yZS5jIChzd2FwX2Fib3J0KTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkqIHB0cmFjZS1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogdHJhZC1jb3JlLmMgKHN3YXBfYWJvcnQpOiBEaXR0byAmIG1ha2Ugc3RhdGljLgotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3JlbG9jX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9yZWxvY19vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfaW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zeW1faW4pOiBEaXR0by4KLQkoY29mZl9zd2FwX3N5bV9vdXQpOiBEaXR0by4KLQkoY29mZl9zd2FwX2F1eF9pbik6IERpdHRvLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfbGluZW5vX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9saW5lbm9fb3V0KTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hb3V0aGRyX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IERpdHRvLgotCShjb2ZmX3N3YXBfc2NuaGRyX2luKTogRGl0dG8uCi0JKGNvZmZfc3dhcF9zY25oZHJfb3V0KTogRGl0dG8uCi0JKiBpaGV4LmMgKGloZXhfc2l6ZW9mX2hlYWRlcnMpOiBEaXR0by4KLQkqIHRla2hleC5jIChnZXRzeW0pOiBEaXR0by4KLQkoZmluZF9jaHVuayk6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKGluc2VydF9ieXRlKTogRGl0dG8uCi0JKGZpcnN0X3BoYXNlKTogRGl0dG8uCi0JKHBhc3Nfb3Zlcik6IERpdHRvLgotCSh0ZWtoZXhfZ2V0X3N5bXRhYik6IERpdHRvICYgbWFrZSBzdGF0aWMuCi0JKHRla2hleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkodGVraGV4X21rb2JqZWN0KTogRGl0dG8uCi0JKHRla2hleF9vYmplY3RfcCk6IERpdHRvLgotCShtb3ZlX3NlY3Rpb25fY29udGVudHMpOiBEaXR0by4KLQkodGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKHRla2hleF9zZXRfYXJjaF9tYWNoKTogRGl0dG8gJiBtYWtlIHN0YXRpYy4KLQkodGVraGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKHdyaXRldmFsdWUpOiBEaXR0by4KLQkod3JpdGVzeW0pOiBEaXR0by4KLQkob3V0KTogRGl0dG8uCi0JKHRla2hleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBEaXR0by4KLQkodGVraGV4X3NpemVvZl9oZWFkZXJzKTogRGl0dG8uCi0JKHRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCk6IERpdHRvLgotCSh0ZWtoZXhfZ2V0X3N5bWJvbF9pbmZvKTogRGl0dG8uCi0JKHRla2hleF9wcmludF9zeW1ib2wpOiBEaXR0by4KLQkqIGlyaXgtY29yZS5jIChtYWtlX2JmZF9hc2VjdGlvbik6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX3ApOiBEaXR0by4KLQkoaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQpOiBEaXR0by4KLQkoaXJpeF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCk6IERpdHRvLgotCShpcml4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKTogRGl0dG8uCi0JKGlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCk6IERpdHRvLgotCSogY29mZi1taXBzLmMgKG1pcHNfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogRGl0dG8uCi0JKiBzcmVjLmMgKHNyZWNfbmV3X3N5bWJvbCk6IERpdHRvLgotCShzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKHNyZWNfc2V0X2FyY2hfbWFjaCk6IERpdHRvLgotCShzcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGl0dG8uCi0JKGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCi0JKHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCi0JKHN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGl0dG8uCi0JKHNyZWNfc2l6ZW9mX2hlYWRlcnMpOiBEaXR0by4KLQkoc3JlY19tYWtlX2VtcHR5X3N5bWJvbCk6IERpdHRvLgotCShzcmVjX2dldF9zeW10YWJfdXBwZXJfYm91bmQpOiBEaXR0by4KLQkoc3JlY19nZXRfc3ltdGFiKTogRGl0dG8uCi0JKHNyZWNfcHJpbnRfc3ltYm9sKTogRGl0dG8gYW5kIG1ha2Ugc3RhdGljLgotCSogZWxmLmMgKGVsZl9yZWFkKTogRGl0dG8KLQkoYXNzaWduX3NlY3Rpb25fbnVtYmVycyk6IERpdHRvLgotCShlbGZfZmFrZV9zZWN0aW9ucyk6IERpdHRvLgotCShzeW1faXNfZ2xvYmFsKTogRGl0dG8uCi0JKGVsZl9tYXBfc3ltYm9scyk6IERpdHRvLgotCShnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSk6IERpdHRvLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBEaXR0by4KLQkoY29mZl9yZWFsX29iamVjdF9wKTogRGl0dG8uCi0JKGZpeHVwX3N5bWJvbF92YWx1ZSk6IERpdHRvLgotCShidWlsZF9kZWJ1Z19zZWN0aW9uKTogRGl0dG8uCi0JKGNvcHlfbmFtZSk6IERpdHRvLgotCSogc3ltcy5jIChjb2ZmX3NlY3Rpb25fdHlwZSk6IERpdHRvLgotCi1Nb24gU2VwICA5IDIyOjM2OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmZkLWluMi5oOiBSZWJ1aWx0IGFmdGVyIG0zMnIgY2hhbmdlcy4KLQotTW9uIFNlcCAgOSAxMjozMToyMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkLGNvbmZpZ3VyZS5pbixjb25maWd1cmU6IEFkZCBtMzJyIHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbixhcmNodXJlcy5jLGVsZi5jLHRhcmdldHMuYzogTGlrZXdpc2UuCi0JKiBjb25maWcuYmZkOiBLZWVwIHRhcmdldCBsaXN0IGFscGhhYmV0aWNhbGx5IHNvcnRlZC4KLQotTW9uIFNlcCAgOSAxMTo0ODo0MSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MsIGNhc2UgUl9WODUwX0hJMTYpOiBEb24ndCBmb3JnZXQKLQl0byBhZGQgaW4gdGhlIGNvbnN0YW50IHBhcnQgZm91bmQgaW4gdGhlIGluc3RydWN0aW9uIGl0c2VsZi4KLQkoY2FzZSBSX1Y4NTBfSEkxNl9TKTogTGlrZXdpc2UuCi0KLUZyaSBTZXAgIDYgMTc6MDQ6MzkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQxMHYuYyAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiBNb2RpZnkgdGhlIHNpemUgb2YgUl9EMTBWXzE2Ci0JYW5kIFJfRDEwVl8xOCB0byBiZSAxICh3b3JkKS4KLQotVGh1IFNlcCAgNSAxNToyMzowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKF9iZmRfbGlua19zZWN0aW9uX3N0YWJzKTogSWYgdGhlIG91dHB1dF9zZWN0aW9uIGZpZWxkCi0Jb2YgZWl0aGVyIHNlY3Rpb24gaXMgYmZkX2Fic19zZWN0aW9uLCB0aGVuIHRoZSBsaW5rZXIgaXMKLQlkaXNjYXJkaW5nIHRoZSBzZWN0aW9uIGFuZCB3ZSBzaG91bGQgbm90IG9wdGltaXplIGl0LgotCi1UdWUgU2VwICAzIDEyOjE2OjIwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChhb3V0LXNwYXJjbGUubyk6IE5ldyB0YXJnZXQuCi0JKiBhb3V0ZjEuaCAoVEFSR0VUX0lTX0JJR19FTkRJQU5fUCk6IERvbid0IGRlZmluZSBpZiBsaXR0bGUgZW5kaWFuLgotCSogY29uZmlnLmJmZCAoc3BhcmNsZXQtKi1hb3V0Kik6IEFkZCBjYXNlLgotCSogY29uZmlndXJlLmluIChzcGFyY2xlX2FvdXRfdmVjKTogQWRkIGNhc2UuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogdGFyZ2V0cy5jIChzcGFyY2xlX2FvdXRfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgc3BhcmNsZV9hb3V0X3ZlYy4KLQkqIGFvdXQtc3BhcmNsZS5jOiBOZXcgZmlsZS4KLQotVHVlIFNlcCAgMyAwMDo1NzowMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBGaXggaGFuZGxpbmcgb2YKLQlsb3cgb3JkZXIgc2lnbiBiaXQgcHJvcG9nYXRpb24gZm9yIFJfVjg1MF9ISTE2X1MuCi0KLQkqIGVsZjMyLXY4NTAuYyAoYmZkX2VsZjMyX3Y4NTBfcmVsb2MpOiBOZXcgZnVuY3Rpb24gZm9yCi0JaGFuZGxpbmcgVjg1MCBzcGVjaWZpYyByZWxvY3MuCi0JKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogVXNlIHRoZSBuZXcgZnVuY3Rpb24gZm9yIHNvbWUKLQlyZWxvY2F0aW9ucy4gIFR3aWRkbGUgbWFza3MgJiBzaGlmdHMgZm9yIHNvbWUgcmVsb2NzLgotCVNldCBwYXJ0aWFsX2lucGxhY2Ugd2hlcmUgbmVlZGVkLgotCi1Nb24gU2VwICAyIDEyOjEyOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3B1LW1pcHMuYzogQWRkIGFuIGV4cGxpY2l0IG1pcHM6MzAwMCBlbnRyeSwgYW5kIGNoYW5nZSB0aGUKLQlkZWZhdWx0IGFyY2hpdGVjdHVyZSB0byBhIG1hY2hpbmUgbnVtYmVyIG9mIDAuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfb2JqZWN0X3ApOiBTZXQgdGhlIG1hY2hpbmUgbnVtYmVyCi0JZm9yIEVfTUlQU19BUkNIXzEuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IElmIHRoZSBtYWNoaW5lIG51bWJlciBvZgotCXRoZSBvdXRwdXQgQkZEIGlzIHRoZSBkZWZhdWx0LCBzZXQgaXQgZnJvbSB0aGUgZmlyc3QgaW5wdXQgQkZELgotCi1TdW4gU2VwICAxIDE4OjM4OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbGZfdjg1MF9ob3d0b190YWJsZSk6IEFsbCB0aGUgMTZiaXQgcmVsb2NzCi0JaW5zZXJ0IGF0IGJpdHBvcyB6ZXJvLiAgVGhlIEhJMTYgcmVsb2NzIGFyZSBzaGlmdGVkIHJpZ2h0Ci0JYnkgMTYgYml0cy4gIEZpeCBzcmNfbWFzayBmb3IgYWxsIHJlbG9jcy4KLQkoVEFSR0VUX0xJVFRMRV9TWU0sIFRBUkdFVF9MSVRUTEVfTkFNRSk6IERlZmluZS4gIFRoZSBWODUwIGlzCi0JbGl0dGxlIGVuZGlhbiEKLQkoVEFSR0VUX0JJR19TWU0sIFRBUkdFVF9CSUdfTkFNRSk6IFJlbW92ZS4gIFRoZSBWODUwIGlzIGxpdHRsZQotCWVuZGlhbiEKLQotU3VuIFNlcCAgMSAxNTo0MTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC1jb3JlLmMgKHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKToKLQlSZXdyaXRlIHRvIHVzZSBCRkQgZmlsZSByZWFkIHJvdXRpbmVzIGFuZCB0byBhdm9pZCB1c2luZyBhIGZpeGVkCi0JbGVuZ3RoIGZvciB0aGUgZmlsZSBuYW1lLgotCi1TYXQgQXVnIDMxIDEwOjIyOjI1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItdjg1MC5jIChlbnVtIHJlbG9jX3R5cGUpOiBBZGQgUl9WODUwX3szMiwxNiw4fS4KLQkoZWxmX3Y4NTBfaG93dG9fdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgUl9WODUwX3szMiwxNiw4fS4KLQkodjg1MF9yZWxvY19tYXApOiBBZGQgdHJhbnNsYXRpb24gZnJvbSBCRkRfUkVMT0NfezMyLDE2LDh9Ci0JdG8gUl9WODUwX3szMiwxNiw4fS4KLQotRnJpIEF1ZyAzMCAxODowNjowNCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogZWxmMzItdjg1MC5jIChyZWxvY190eXBlKTogQWRkIFJfVjg1MF9ISTE2X1MuCi0JKGVsZl92ODUwX2hvd3RvX3RhYmxlKTogQWRkIGluZm8gZm9yIEhJMTZfUyByZWxvYy4KLQkodjg1MF9yZWxvY19tYXApOiBBZGQgSElfMTZfUyByZWxvYy4KLQkqIHJlbG9jLmM6IERlZmluZSBCRkRfUkVMT0NfVjg1MF8qIHJlbG9jcy4KLQotRnJpIEF1ZyAzMCAxMTo0OToxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgU0ggRUxGIHN1cHBvcnQuCi0JKiBlbGYzMi1zaC5jOiBOZXcgZmlsZS4KLQkqIGVsZi5jIChwcmVwX2hlYWRlcnMpOiBIYW5kbGUgYmZkX2FyY2hfc2guCi0JKiBlbGZjb2RlLmggKHdyaXRlX3JlbG9jcyk6IEhhbmRsZSBhYnNvbHV0ZSBzeW1ib2wuCi0JKiBlbGYtYmZkLmggKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcyk6IERlY2xhcmUuCi0JKF9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcyk6IERlY2xhcmUuCi0JKiBlbGZsaW5rLmggKE5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykpOiBSZW5hbWUgZnJvbQotCWVsZl9saW5rX3JlYWRfcmVsb2NzLiAgTWFrZSBnbG9iYWxseSB2aXNpYmxlLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGVsZl9saW5rX2lucHV0X2JmZCk6IEdldCBleHRlcm5hbCBzeW1ib2xzIGZyb20gY2FjaGUgaW4KLQlzeW10YWJfaGRyLT5jb250ZW50cy4gIEdldCBjb250ZW50cyBmcm9tIGNhY2hlIGluCi0JZWxmX3NlY3Rpb25fZGF0YS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZkRfZWxmTk5fYmZkX3JlbGF4X3NlY3Rpb24pOiBPbmx5IGRlZmluZSBpZiBub3QKLQlhbHJlYWR5IGRlZmluZWQuCi0JKiByZWxvYy5jOiBEZWZpbmUgQkZEX1JFTE9DX1NIXyogcmVsb2NzLgotCSogbGliYmZkLWluLmggKF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuKTogRGVjbGFyZS4KLQkqIGNvZmYtc2guYyAoc2hfaW5zbnNfY29uZmxpY3QpOiBGaXggYSByZXR1cm4gdmFsdWUuCi0JKF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuKTogTmV3IGdsb2JhbGx5IHZpc2libGUgZnVuY3Rpb24sIGJyb2tlbgotCW91dCBvZiBzaF9hbGlnbl9sb2FkLgotCShzaF9hbGlnbl9sb2FkKTogQ2FsbCBfYmZkX3NoX2FsaWduX2xvYWRfc3Bhbi4KLQkoc2hfc3dhcF9pbnNucyk6IENoYW5nZSByZWxvY3MgcGFyYW1ldGVyIHRvIFBUUi4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl9zaF92ZWMpOiBEZWNsYXJlLgotCShiZmRfZWxmMzJfc2hsX3ZlYyk6IERlY2xhcmUuCi0JKiBjb25maWcuYmZkIChzaC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChiZmRfZWxmMzJfc2hfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKGJmZF9lbGYzMl9zaGxfdmVjKTogTmV3IHRhcmdldCB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBlbGYzMi1zaC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmMzItc2guYy4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IENoZWNrIHRoYXQgTE1BIGRvZXMgbm90IHNraXAgYQotCXBhZ2UgYmVmb3JlIGNoZWNraW5nIERfUEFHRUQuCi0KLQkqIGloZXguYyAoaWhleF9zY2FuKTogUmVtb3ZlZCB1bm5lY2Vzc2FyeSBleHRiYXNlIHZhcmlhYmxlLgotCShpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyk6IFJlbW92ZSBleHRiYXNlOyBhbHdheXMgdXNlIHNlZ2Jhc2UKLQlpbnN0ZWFkLgotCi1UaHUgQXVnIDI5IDE2OjUyOjE3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLSopOiBSZWNvZ25pemUgaTY4NiBmb3IgcGVudGl1bSBwcm8uCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi0qKTogRGl0dG8uCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLSopOiBEaXR0by4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogY29uZmlnLmJmZCAoaVszNDU2XTg2LSotZGd1eCopOiBSZWNvZ25pemUgYXMgYSBzeW5vbnltIGZvciB4ODYKLQllbGYuCi0KLVR1ZSBBdWcgMjcgMDk6MTg6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbGYzMi1ocHBhLmMgKGhwcGFfZWxmX2dlbl9yZWxvY190eXBlKTogQWRkIG5ldyBhcmd1bWVudC4KLQkqIGVsZjMyLWhwcGEuaCAoaHBwYV9lbGZfZ2VuX3JlbG9jX3R5cGUpOiBVcGRhdGUgcHJvdG90eXBlLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogQWRkIG5ldyBhcmd1bWVudC4gIElmCi0Jd2UgZW5jb3VudGVyIGFuIFJfREFUQV9PTkVfU1lNQk9MIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wgdGhhdAotCXdpbGwgaGF2ZSBhbiBTVF9DT0RFIHR5cGUsIGNoYW5nZSB0aGUgc3ltYm9sJ3MgdHlwZSB0byBTVF9EQVRBLgotCSogc29tLmMgKGhwcGFfc29tX2dlbl9yZWxvY190eXBlKTogVXBkYXRlIHByb3RvdHlwZS4KLQotVHVlIEF1ZyAyNyAwMDoxMjoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogU2V0IGR5bm9iaiBpZiBuZWVkZWQgZm9yCi0JUl9NSVBTXzMyIGFuZCBSX01JUFNfUkVMMzIuICBTZXQgc2dvdCBhbmQgZyBhcyBzb29uIGFzIHBvc3NpYmxlLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCByZXF1aXJlIC5nb3QgdG8gZXhpc3QuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0KLVRodSBBdWcgMjIgMTA6NTQ6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAoSExERU5WKTogTmV3IHZhcmlhYmxlIHRvIHNldC4gIFNldCBpdCBmb3IKLQkqLSotc3lzdjQqLCBzaW5jZSB0aG9zZSBsaW5rZXJzIG1heSBub3Qgc3VwcG9ydCAtUiBidXQgdGhleSBhbHdheXMKLQlzdXBwb3J0IExEX1JVTl9QQVRILgotCi0JKiBsaWJpZWVlLmggKE5TRUNUSU9OUyk6IERvbid0IGRlZmluZS4KLQkoaWVlZV9kYXRhX3N0cnVjdCk6IENoYW5nZSBzZWN0aW9uX3RhYmxlIHRvIGFzZWN0aW9uICoqLiAgQWRkCi0Jc2VjdGlvbl90YWJsZV9zaXplLgotCSogaWVlZS5jIChnZXRfc2VjdGlvbl9lbnRyeSk6IElmIHRoZSB0YWJsZSBpc24ndCBiaWcgZW5vdWdoLCBtYWtlCi0JaXQgYmlnZ2VyLgotCShpZWVlX3NsdXJwX3NlY3Rpb25zKTogUmVtb3ZlIGFzc2VydGlvbiBhYm91dCBudW1iZXIgb2Ygc2VjdGlvbnMuCi0JKGllZWVfb2JqZWN0X3ApOiBBZGp1c3QgaW5pdGlhbGl6YXRpb24gb2YgaWVlZSB0byBtYXRjaCBjaGFuZ2VzIHRvCi0JdGhlIHN0cnVjdHVyZS4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX21hcmspOiBEb24ndCBjb3B5IHJlbG9jcyBmb3IgdW5kZWZpbmVkCi0Jc3ltYm9scyBtZXJlbHkgYmVjYXVzZSB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCSh4Y29mZl9idWlsZF9sZHN5bXMpOiBEb24ndCBzZXQgdXAgZ2xvYmFsIGxpbmthZ2UgY29kZSBmb3IgYW4KLQl1bmRlZmluZWQgc3ltYm9sIG1lcmVseSBiZWNhdXNlIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkCi0JbGlicmFyeS4KLQotVHVlIEF1ZyAyMCAxNTowNjowNSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtdjg1MC5vLgotCShCRkQzMl9CQUNLRU5EUykgQWRkIGVsZjMyLXY4NTAuby4KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfdjg1MF9hcmNoLgotCSogYmZkLWluMi5oOiBBZGQgYmZkX3Y4NTBfYXJjaC4KLQkqIGNvbmZpZy5iZmQgKHY4NTAtKi0qKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogKGJmZF9lbGYzMl92ODUwX3ZlYykgTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF9lbGYzMl92ODUwX3ZlYykgTmV3IHZlY3Rvci4KLQkqIGNwdS12ODUwLmM6IE5ldyBmaWxlLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZGVkIGNhc2UgYmZkX2FyY2hfdjg1MC4KLQkqIGVsZjMyLXY4NTAuYzogTmV3IGZpbGUuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGYzMl92ODUwX3ZlYyk6IE5ldyB2ZWN0b3IuCi0KLUZyaSBBdWcgMTYgMTY6MjU6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzKTogQ3JlYXRlIGFuZCBkZWZpbmUKLSAJYSBmdW5jdGlvbiBjb2RlIHN5bWJvbCBmb3IgYW4gWE1DX1hPIHN5bWJvbC4KLQotVGh1IEF1ZyAxNSAxMjozMzoyOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFVwZGF0ZSBlZGl0aW5nIG9mIGF1dG9jb25mIHZhcnMgdG8gcmVmbGVjdAotCUp1bCAxOCBjb25maWd1cmUuaW4gY2hhbmdlLgotCSogbXB3LW1ha2Uuc2VkOiBVcGRhdGUgZWRpdGluZyBvZiBpbmNsdWRlIHBhdGhuYW1lcyB0byBiZQotCW1vcmUgZ2VuZXJhbCwgYWRkIEBEQVNIX0NfRkxBR0AgdG8gZXhwbGljaXQgY29tcGlsZSBydWxlIGVkaXQuCi0KLVRodSBBdWcgMTUgMTA6MzU6MTMgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX291dHB1dF9leHRzeW0pOiBUaGUgc2VjdGlvbiBmcm9tCi0Jd2hpY2ggdG8gb2Zmc2V0IHRvIGdldCB0aGUgLnBsdCBlbnRyeSBhZGRyZXNzIGlzICIucGx0Ii4KLQotVGh1IEF1ZyAxNSAxNjo0MDozMCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIHJlbG9jLmM6IChCRkRfUkVMT0NfQVJNX1RIVU1CX0FERCwgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0sCi0JQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVCwgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQpOgotIAlBZGRlZCwgZm9yIGludGVybmFsIHVzZSBieSB0aGUgQVJNIGdhcy4KLQkqIGxpYmJmZC5oOiBSZWJ1aWx0Ci0JKiBiZmQtaW4yLmg6IFJlYnVpbHQKLQotV2VkIEF1ZyAxNCAxNzowMjowOSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWxmNjQtYWxwaGEuYyAoZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ29ycmVjdCB0eXBvCi0JaW4gc2VjdGlvbiBkeW5pZHggc3RhcnQuCi0KLVR1ZSBBdWcgMTMgMTQ6MzU6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IFRyZWF0IHNlY3Rpb25zIHdob3NlCi0JbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlIGFzIFNFQ19MSU5LX09OQ0UuICBUaGlzIGlzIGFuCi0Jb3B0aW1pemF0aW9uIGZvciBnKysuCi0KLVR1ZSBBdWcgMTMgMTc6MDQ6NDAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKTogSWYgb25lIG1vZHVsZSBoYXMKLQl0aGUgLW1yZWxvY2F0YWJsZS1saWIgYml0IHNldCBhbmQgdGhlIG90aGVyIGRvZXNuJ3QsIGNsZWFyIHRoZQotCS1tcmVsb2NhdGFibGUtbGliIGJpdCBpbiB0aGUgaGVhZGVyLgotCi1TYXQgQXVnIDEwIDIyOjU5OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBEbyBub3QgcmVzb2x2ZSBhIGNvbW1vbgotCXN5bWJvbCBhZ2FpbnN0IGEgU1RUX0ZVTkMgc3ltYm9sIGluIGEgc2hhcmVkIGxpYnJhcnkuCi0KLUZyaSBBdWcgIDkgMTI6NDQ6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzKTogSWYgYSBkZXNjcmlwdG9yCi0gCXN5bWJvbCBpcyBmb3VuZCwgYXV0b21hdGljYWxseSBkZWZpbmUgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24KLSAJY29kZS4KLQotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogT25seSBzZXQgKCpzeW1faGFzaCktPm51bWF1eAotCWlmIHN5bS5uX251bWF1eCBpcyBub3QgemVyby4KLQkoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogUGVybWl0IHRoZSBzeW1ib2wgYW5kIHRoZSBoYXNoIHRhYmxlCi0JZW50cnkgdG8gZGlzYWdyZWUgYWJvdXQgdGhlIG51bWJlciBvZiBhdXggZW50cmllcyBpZiB0aGUgc3ltYm9sCi0JaGFzIHplcm8uCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogQ3JlYXRlIHRoZSAucmVsLmR5bgotCXNlY3Rpb24gaWYgaXQgbWlnaHQgYmUgbmVlZGVkLCBub3QganVzdCBpZiBpbmZvLT5zaGFyZWQuCi0JKG1pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IE1ha2Ugcm9vbSBmb3IgYSBudWxsIGVsZW1lbnQgYXQKLQl0aGUgc3RhcnQgb2YgLnJlbC5keW4gaWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBpdC4KLQkobWlwc19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpOiBPbmx5IGNsZWFyIHRoZSBmaXJzdCBlbGVtZW50Ci0Jb2YgLnJlbC5keW4gaWYgdGhlIHNpemUgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLVRodSBBdWcgIDggMTY6MjQ6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBJZiB3ZSBhbHJlYWR5IGNhbGxlZCB0aGUKLQl1bmRlZmluZWRfc3ltYm9sIGNhbGxiYWNrIGZvciBhIHN5bWJvbCwgdGhlbiBkb24ndCBpc3N1ZSBhbnkgbW9yZQotCXdhcm5pbmdzIGFib3V0IGxvYWRlciByZWxvY3MuCi0JKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBkbyBhbnkgZnVydGhlciBwcm9jZXNzaW5nCi0JYWZ0ZXIgY2FsbGluZyB0aGUgdW5kZWZpbmVkX3N5bWJvbCBjYWxsYmFjay4KLQotCSogeGNvZmZsaW5rLmMgKFhDT0ZGX01VTFRJUExZX0RFRklORUQpOiBEZWZpbmUuCi0JKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBQZXJtaXQgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgYSBzeW1ib2wKLQlhcyB0aGUgQUlYIGxpbmtlciBzZWVtcyB0byBkby4KLQotVGh1IEF1ZyAgOCAxMjoyMTo1NiAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZXZheC1hbHBoYS5jIChldmF4X2FscGhhX3ZlYyk6IENvcnJlY3RlZCBmbGFncywgY2xlYW51cC4KLQkoZXZheF9pbml0aWFsaXplKTogUmVtb3ZlIGV2YXhfcmVsb2NfdGFibGUuCi0JKGV2YXhfY2xvc2VfYW5kX2NsZWFudXApOiBEaXR0by4KLQkocmVsb2NfbmlsKTogRGl0dG8uCi0JKGFscGhhX2hvd3RvX3RhYmxlKTogUmVtb3ZlIEFMUEhBX1JfU1dSRUwzMiBhbmQgQUxQSEFfUl9TV1JFTDY0Ci0JZW50cmllcy4KLQkoZXZheF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEaXR0by4KLQkqIGV2YXgtZWdzZC5jIChfYmZkX2V2YXhfc2x1cnBfZWdzZCk6IEFkZCBhIGZldyBjYXN0czsgc2V0Ci0JY29va2VkX3NpemUgPT0gcmF3X3NpemUuCi0JKiBldmF4LWVtaC5jIChfYmZkX2V2YXhfcmVnaXN0ZXJfZmlsZW5hbWUpOiBSZW1vdmUuCi0JKiBldmF4LWV0aXIuYyAoZXRpcl9zdGMpOiBBbGxvdyBFVElSX1NfQ19TVENfeHggY29tbWFuZHMuCi0JKiBldmF4LW1pc2MuYyAoYWRkX25ld19jb250ZW50cyk6IE1hbGxvYyBzZWN0aW9uIGF0IGZ1bGwgc2l6ZS4KLQkoX2JmZF9zYXZlX2V2YXhfc2VjdGlvbik6IE1lbWNweSBzZWN0aW9uIGNvbnRlbnRzIGRpcmVjdGx5LgotCSogZXZheC5oIChBTFBIQV9SX1NXUkVMMzIsIEFMUEhBX1JfU1dSRUw2NCk6IFJlbW92ZS4KLQkoZXZheF9yZWxvY190YWJsZSk6IFJlbW92ZS4KLQotCSogaG9zdHMvYWxwaGF2bXMuaCAoT19BQ0NNT0RFKTogRGVmaW5lIGlmIG5lZWRlZC4KLQotCSogbWFrZWZpbGUudm1zOiBBZGQgYmV0dGVyIHN1cHBvcnQgZm9yIERFQyBDIGNvbXBpbGF0aW9uCi0JQWRkIGV2YXguaCBkZXBlbmRlbmNpZXMKLQotCSogcmVsb2MuYyAoYmZkX2dldF9yZWxvY19zaXplKTogQWRkIGNhc2UgZm9yIDE2IGJ5dGUgcmVsb2MuCi0JKEJGRF9SRUxPQ19TV1JFTDMyLEJGRF9SRUxPQ19TV1JFTDY0KTogUmVtb3ZlLgotCShCRkRfUkVMT0NfQUxQSEFfQkFTRVJFRyk6IFJlbW92ZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0KLVRodSBBdWcgIDggMDg6MTc6MzIgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYXJjaGl2ZS5jIChic2Rfd3JpdGVfYXJtYXApOiAgSWZkZWYgYXJvdW5kIGNhbGxzIHRvIGdldHVpZCBhbmQKLQlnZXRnaWQgaWYgX1dJTjMyIGlzIGRlZmluZWQuCi0JKiBvcG5jbHMuYyAoYmZkX2Zkb3BlbnIpOiAgUmVtb3ZlIHVubmVjZXNzYXJ5IFdJTkdEQiBpZmRlZi4KLQotV2VkIEF1ZyAgNyAyMzoxOTowMCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBhb3V0eC5oIGJmZC1pbi5oIGJmZC1pbjIuaCBvcG5jbHMuYyByaXNjaXguYyBzb20uYyB0YXJnZXRzLmM6Ci0JQ2hhbmdlIE5PX0ZMQUdTIHRvIEJGRF9OT19GTEFHUyB0byBhdm9pZCBjb25mbGljdCB3aXRoIGFuIEhQVVgKLQlpbmNsdWRlIGZpbGUuCi0JKiBsaWJiZmQuYzogIENyZWF0ZSBkdW1teSBnZXRwYWdlc2l6ZSgpIG1hY3JvIGlmIEhBVkVfR0VUUEFHRVNJWkUKLQlpc24ndCBkZWZpbmVkLgotCi1XZWQgQXVnICA3IDE0OjExOjQ0IDE5OTYgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfTkVFREVEX0RFQ0xBUkFUSU9OIG9uIHN0cnN0ciBhbmQKLQlyZWFsbG9jLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCi0JKE5FRURfREVDTEFSQVRJT05fUkVBTExPQyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmggKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKHJlYWxsb2MpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fUkVBTExPQy4KLQotCSogYWNsb2NhbC5tNCAoQkZEX05FRURfREVDTEFSQVRJT04pOiBJbmNsdWRlIDxzdHJpbmcuaD4gb3IKLQk8c3RyaW5ncy5oPiBpZiB0aGV5IGV4aXN0LgotCi0JKiBpZWVlLmMgKGllZWVfc2V0X3NlY3Rpb25fY29udGVudHMpOiBDYXN0IGJmZF9hbGxvYyByZXR1cm4uCi0KLVdlZCBBdWcgIDcgMTI6MTI6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtaTM4Ni5jIChpODA4Nl9hcmNoKTogQXJjaGl0ZWN0dXJlIGluZm8gZm9yIHRoZSBpODA4Ni4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFZhbGV0dGUgPHZhbGV0dGVAY3JmLmNhbm9uLmZyPjoKLQkqIGVsZjMyLWkzODYuYyAoZW51bSByZWxvY190eXBlKTogQWRkIEZJUlNUX0lOVkFMSURfUkVMT0MsCi0JTEFTVF9JTlZBTElEX1JFTE9DLCBSXzM4Nl8xNiwgUl8zODZfUEMxNiwgUl8zODZfOCwgUl8zODZfUEM4LgotCShlbGZfaG93dG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IgbmV3IHJlbG9jcy4KLQkoZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBIYW5kbGUgbmV3IHJlbG9jcy4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0byk6IEp1c3QgY2FsbCBhYm9ydC4KLQkoZWxmX2kzODZfaW5mb190b19ob3d0b19yZWwpOiBDaGVjayB0aGF0IHRoZSByZWxvYyB0eXBlIGlzIHZhbGlkLgotCShlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgIDYgMTI6NTQ6NTYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQxMHYuYyAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiBBZGRlZCBSX0QxMFZfMzIuCi0KLU1vbiBBdWcgIDUgMTM6NDI6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcik6IEZvciBhIGxvYWRhYmxlIHNlY3Rpb24sCi0Jb25seSBnZXQgdGhlIExNQSBmcm9tIHRoZSBwaGRyIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIHBhcnQgb2YgdGhlCi0JZmlsZS4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IFJld3JpdGUgdGVzdHMgZm9yIHN0YXJ0aW5nIGEKLQluZXcgc2VnbWVudCB0byBtYWtlIHRoZW0gbW9yZSBjb21wcmVoZW5zaWJsZS4gIElmIHRoZSByZWxhdGlvbnNoaXAKLQliZXR3ZWVuIHRoZSBMTUEgYW5kIHRoZSBWTUEgY2hhbmdlZCwgc3RhcnQgYSBuZXcgc2VnbWVudC4gIERvbid0Ci0JY2hlY2sgZHluc2VjIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBzdGFydCBhIG5ldyBzZWdtZW50IGZvciBhCi0Jd3JpdGVhYmxlIHNlY3Rpb247IC1OIHdpbGwgbm93IGhhbmRsZSB0aGlzLgotCi1UaHUgQXVnICAxIDIyOjQzOjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oOiBSZW1vdmUgImVzZWwiIGNoYW5nZXMuICBOb3QgdGhlIHJpZ2h0IGFwcHJvYWNoLgotCSogc29tLmM6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkoc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyk6IFVzZSBTVF9EQVRBIGZvciBzeW1ib2xzCi0Jd2hpY2ggZG9uJ3QgaGF2ZSBhIFNPTSBzeW1ib2wgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlbS4KLQlSZXZlcnNlcyBhIDE5OTQgY2hhbmdlLgotCi1XZWQgSnVsIDMxIDE1OjUwOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCU1ha2UgbGQgLU4gbW9yZSByZWFzb25hYmxlIGZvciBFTEY6Ci0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogSWYgRF9QQUdFRCBpcyBub3Qgc2V0LCBzZXQKLQlwaGRyX2luX3NlY3Rpb24gdG8gZmFsc2UsIGFuZCBhbHdheXMgdXNlIGEgc2luZ2xlIGxvYWQgc2VnbWVudC4KLQkoZWxmX3NvcnRfc2VjdGlvbnMpOiBTb3J0IHNlY3Rpb25zIGJ5IExNQSBhZnRlciBWTUEuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiBEX1BBR0VEIGlzIG5vdCBzZXQsIGRvbid0Ci0JYWxpZ24gdG8gbWF4cGFnZXNpemUuCi0JKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBlbGZjb2RlLmggKGVsZl9vYmplY3RfcCk6IElmIGEgc2VjdGlvbiBpcyBsb2FkZWQgYnV0IG5vdCBwYWdlCi0JYWxpZ25lZCwgY2xlYXIgRF9QQUdFRC4KLQotV2VkIEp1bCAzMSAxNTowMDoxMiAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIHJlbG9jLmM6IChCRkRfUkVMT0NfQVJNX09GRlNFVElNTTgsIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMKToKLSAJQWRkZWQsIGZvciBpbnRlcm5hbCB1c2UgYnkgdGhlIEFSTSBnYXMuCi0JKiBsaWJiZmQuaDogUmVidWlsdAotCSogYmZkLWluMi5oOiBSZWJ1aWx0Ci0KLVR1ZSBKdWwgMzAgMTQ6MTQ6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsaWJocHBhLmggKFJfSFBQQV9FU0VMKTogTmV3IGZpZWxkIHNlbGVjdG9yLgotCShlX2VzZWwpOiBTaW1pbGFybHkuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBJZiB3ZSBlbmNvdW50ZXIgYW4gZV9lc2VsLAotCXRoZW4gZ2VuZXJhdGUgUl9DT01QMiAoUFVTSF9TWU0pLCBSX0RBVEFfRVhQUiBmaXh1cCBzdHJlYW0uCi0JKHNvbV93cml0ZV9maXh1cHMpOiBIYW5kbGUgUl9EQVRBX0VYUFIganVzdCBsaWtlIFJfQ09ERV9FWFBSLgotCi1UdWUgSnVsIDMwIDEzOjMxOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMpOiBEbyB0aGUgcmVndWxhcgotCWFyY2hpdmUgc2VhcmNoIGJlZm9yZSBsb29raW5nIGZvciBzdHJpcHBlZCBkeW5hbWljIG9iamVjdHMuCi0KLUZyaSBKdWwgMjYgMTc6NTE6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfYnVpbGRfbGRzeW1zKTogTWFrZSBleHBvcnRpbmcgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sIGEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvci4KLQotV2VkIEp1bCAyNCAxMjowMjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZi5jIChhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzKTogVHJhY2sgdGhlIHZpcnR1YWwKLQltZW1vcnkgcG9zaXRpb24gc2VwYXJhdGVseSBmcm9tIHRoZSBmaWxlIHBvc2l0aW9uLCBhbmQgdXNlIGl0IHRvCi0JY29tcHV0ZSB0aGUgYWxpZ25tZW50IGFkanVzdG1lbnQuCi0KLVR1ZSBKdWwgMjMgMTA6NDM6MzEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLWQxMHYuYyAoZWxmX2QxMHZfaG93dG9fdGFibGUpOiBDaGFuZ2VkIGFsbCByZWxvY3MgdG8gImxvbmciCi0gCWFuZCBmaXhlZCBtYXNrIG9uIFJfRDEwVl8xMF9QQ1JFTF9MLgotCi1Nb24gSnVsIDIyIDE1OjMwOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jOiBJbmNsdWRlICJhb3V0L2FyLmgiLgotCShtaXBzX2VsZjY0X3NsdXJwX2FybWFwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWlwc19lbGY2NF93cml0ZV9hcm1hcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGJmZF9lbGY2NF9hcmNoaXZlXyopOiBEZWZpbmUuCi0JKiBlbGZ4eC10YXJnZXQuaCAoYmZkX2VsZk5OX2FyY2hpdmVfcCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQlVc2UgaW5zdGVhZCBvZiBiZmRfZ2VuZXJpY19hcmNoaXZlX3AuCi0JKGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLiAgVXNlCi0JaW5zdGVhZCBvZiBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMuCi0JKGJmZF9lbGZOTl9ta2RhcmNoaXZlKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLiAgVXNlIGluc3RlYWQgb2YKLQlfYmZkX2dlbmVyaWNfbWthcmNoaXZlLgotCShUQVJHRVRfQklHX1NZTSk6IElmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucyBpcyBkZWZpbmVkLCB1c2UKLQliZmRfZWxmTk5fYXJjaGl2ZSBpbiBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHJhdGhlciB0aGFuCi0JX2JmZF9hcmNoaXZlX2NvZmYuCi0JKFRBUkdFVF9MSVRUTEVfU1lNKTogTGlrZXdpc2UuCi0JKiBhcmNoaXZlLmMgKGJmZF9zbHVycF9hcm1hcCk6IENoZWNrIGZvciBhbmQgcmVqZWN0IGFuIGFyY2hpdmUgbWFwCi0JbmFtZSBvZiAvU1lNNjQvLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IEhhbmRsZQotCVNIVF9NSVBTX0xJQkxJU1QsIFNIVF9NSVBTX0NPTlRFTlQsIFNIVF9NSVBTX1NZTUJPTF9MSUIsIGFuZAotCVNIVF9NSVBTX0VWRU5UUyBzZWN0aW9ucy4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19JRkFDRSwKLQlTSFRfTUlQU19DT05URU5ULCBTSFRfTUlQU19TWU1CT0xfTElCLCBhbmQgU0hUX01JUFNfRVZFTlRTCi0Jc2VjdGlvbnMuCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IExpa2V3aXNlLgotCi0JKiBsaWJlY29mZi5oIChlY29mZl9kYXRhX3R5cGUpOiBBZGQgcmRhdGFfaW5fdGV4dCBmaWVsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyk6IENvcHkKLQlyZGF0YV9pbl90ZXh0IGZyb20gYmFja2VuZCBpbmZvIHRvIHRkYXRhLiAgQ2xlYXIgaXQgaWYgYW55IGRhdGEKLQlzZWN0aW9uIGNvbWVzIGJlZm9yZSAucmRhdGEuCi0JKF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogVXNlIHJkYXRhX2luX3RleHQgZmllbGQgaW4KLQl0ZGF0YSByYXRoZXIgdGhhbiBiYWNrZW5kIGluZm8uCi0KLUZyaSBKdWwgMTkgMTg6MTU6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEZpeCB0ZXN0IGZvciB3aGV0aGVyIGEgY29tcGlsZXIgaGFzIGEgNjQgYml0Ci0JdHlwZS4gIEZyb20gSmltIFdpbHNvbiA8d2lsc29uQGN5Z251cy5jb20+LgotCi1UaHUgSnVsIDE4IDE1OjM5OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKG1pcHMtc2dpLWlyaXg2Kik6IE5ldyBob3N0LgotCi0JKiBjb25maWd1cmUuaW46IFNldCBhbmQgc3Vic3RpdHV0ZSBWRVJTSU9OLCBCRkRfSE9TVF82NEJJVF9MT05HCi0JKHJlcGxhY2luZyBIT1NUXzY0QklUTE9ORyksIEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVELAotCUJGRF9IT1NUXzY0X0JJVCwgYW5kIEJGRF9IT1NUX1VfNjRfQklULiAgQWRkIGJmZC1pbjIuaDpiZmQtaW4yLmgKLQl0byBBQ19PVVRQVVQgY2FsbC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGJmZC1pbi5oIChCRkRfQVJDSF9TSVpFKTogRGVmaW5lIGFzIEB3b3Jkc2l6ZUAsIG5vdCBAV09SRFNJWkVALgotCShCRkRfSE9TVF82NF9CSVQpOiBEZWZpbmUgY29uZGl0aW9uYWxseS4KLQkoQkZEX0hPU1RfVV82NF9CSVQpOiBEZWZpbmUgd2hlbiBCRkRfSE9TVF82NF9CSVQgaXMgZGVmaW5lZC4KLQkoYmZkX3ZtYSk6IFR5cGVkZWYgYXMgQkZEX0hPU1RfVV82NF9CSVQuCi0JKHN5bXZhbHVlLCBiZmRfc2l6ZV90eXBlKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoZG9fY2xlYW4pOiBSZW1vdmUgYmZkLXRtcC5oLgotCShkb19kaXN0Y2xlYW4pOiBSZW1vdmUgYmZkLWluMy5oLgotCShzdG1wLWJmZC5oKTogSnVzdCBkbyBjb3B5LWlmLWNoYW5nZSBiZmQtaW4zLmggYmZkLmguCi0JKGJmZC1pbjMuaCk6IE5ldyB0YXJnZXQuCi0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjLSotc3lzdjQqKTogRG9uJ3QgYnVpbGQgc3Vub3NfYmlnX3ZlYy4gIEZyb20KLQlBbmRyZXcgR2llcnRoIDxBTkRSRVdHQG1pY3JvbGlzZS5jby51az4uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgSU5TVEFMTF9TSExJQi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19TVUJTVCAoSU5TVEFMTF9TSExJQikuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFVzZSBASU5TVEFMTF9TSExJQkAuCi0KLQkqIGNvbmZpZy5iZmQgKG1pcHMqLSotaXJpeDYqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBIYW5kbGUgSXJpeCA2IHNoYXJlZCBsaWJyYXJ5IGxpa2UgSXJpeCA1LgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IERvbid0IGNoZWNrIGFuIFhNQ19URAotCXN5bWJvbCBmb3IgYSBtYWdpYyBuYW1lLgotCSh4Y29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGNoYW5nZSB0aGUgcmVsb2Mgc3ltYm9sIGZvciBhbgotCVhNQ19URCBzeW1ib2wuCi0JKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBnZXQgdGhlIFRPQyBvZmZzZXQgZm9yIGFuCi0JWE1DX1REIHN5bWJvbC4KLQotVGh1IEp1bCAxOCAxMTozNjozMSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBFTEYgc3VwcG9ydCB0byBtaXBzIGNvbmZpZywgY3JlYXRlIHRoZQotCWVsZjMyLXRhcmdldC5oIGZpbGUgaW4gdGhlIG9iamVjdCBkaXIuCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgZWxmWFgtdGFyZ2V0LmggcmVmcyBhdCBiZWdpbm5pbmdzIG9mIGxpbmVzLgotCi1XZWQgSnVsIDE3IDE4OjAyOjMyIDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmLXBwYy5jOiBSZWRpZCBkZWJ1ZyBzY2hlbWUgLSBudW1lcm91cyBmcHJpbnRmJ3MgZ29uZS4KLQlBbHNvIHJlbW92ZWQgbW9zdCBhYm9ydCBjYWxscywgaW4gZmF2b3Igb2YgdXNpbmcgYmZkIHJlcG9ydGluZy4KLQotV2VkIEp1bCAxNyAxNDo1MTo1MiAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6IEFkZCBjcHUtZDEwdi5vLgotCShCRkQzMl9CQUNLRU5EUykgQWRkIGVsZjMyLWQxMHYuby4KLQkqIGFyY2h1cmVzLmM6IEFkZCBiZmRfZDEwdl9hcmNoLgotCSogYmZkLWluMi5oOiBBZGQgYmZkX2QxMHZfYXJjaC4KLQkqIGNvbmZpZy5iZmQgKGQxMHYtKi0qKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogKGJmZF9lbGYzMl9kMTB2X3ZlYykgTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZS5pbjogKGJmZF9lbGYzMl9kMTB2X3ZlYykgTmV3IHZlY3Rvci4KLQkqIGNwdS1kMTB2LmM6IE5ldyBmaWxlLgotCSogZWxmLmMgKHByZXBfaGVhZGVycyk6IEFkZGVkIGNhc2UgYmZkX2FyY2hfZDEwdi4KLQkqIGVsZjMyLWQxMHYuYzogTmV3IGZpbGUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IsIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wsCi0gCUJGRF9SRUxPQ19EMTBWXzE4LCBCRkRfUkVMT0NfRDEwVl8xOF9QQ1JFTCk6IERlZmluZS4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjMyX2QxMHZfdmVjKTogTmV3IHZlY3Rvci4KLQotV2VkIEp1bCAxNyAxMDo1ODo1NSAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZWQgYm9ndXMgZnByaW50ZgotCi1UdWUgSnVsIDE2IDIzOjQ5OjAyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFyY2h1cmVzLmMgYmZkLWluMi5oOiAgQWRkIGJmZF9tYWNoX2kzODZfaTM4NiBhbmQKLQliZmRfbWFjaF9pMzg2X2k4MDg2IG1hY2hpbmUgdHlwZXMuCi0KLVdlZCBKdWwgMTAgMTI6NDI6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBTZXQgU0VDX0NPREUgZm9yIF9JTklUCi0JYW5kIF9GSU5JIHNlY3Rpb25zLgotCi1XZWQgSnVsIDEwIDExOjE4OjIxIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogQS9VWCBkb2VzIG5vdCByZXF1aXJlCi0Jc3BlY2lhbCBoYW5kbGluZyBvZiB0aGUgX0xJQiBzZWN0aW9uLgotCi1UdWUgSnVsICA5IDE1OjUyOjIwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogVXNlIHRoZSBjb3JyZWN0Ci0JdmFsdWUgZm9yIFJfUkVMQllURS4KLQotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24pOiBPbmx5ICJzaHJpbmtzIgotCWFycmF5IGlmIG9uZSB3YXMgYWxsb2NhdGVkLgotCi1UdWUgSnVsICA5IDEyOjIxOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gS2F6dW1vdG8gS29qaW1hIDxra29qaW1hQGtrLmluZm8ua2FuYWdhd2EtdS5hYy5qcD46Ci0JKiBlbGYzMi1taXBzLmMgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgbmV3IGZpZWxkcwotCXVzZV9ybGRfb2JqX2hlYWQgYW5kIHJsZF92YWx1ZS4KLQkobWlwc19lbGZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkcy4KLQkobWlwc19lbGZfYWRkX3N5bWJvbF9ob29rKTogTWFyayBfX3JsZF9vYmpfaGVhZCBzeW1ib2wgYXMKLQlkeW5hbWljLgotCShtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENyZWF0ZSAucmxkX21hcCBzZWN0aW9uLiAgSWYKLQlfX3JsZF9vYmpfaGVhZCBzeW1ib2wgbm90IHNlZW4sIGNyZWF0ZSBhbiBfX3JsZF9tYXAgc3ltYm9sLgotCShtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBNYWtlIHNwYWNlIGluIC5ybGRfbWFwIHNlY3Rpb24uCi0JQ3JlYXRlIGEgRFRfTUlQU19STERfTUFQIGVudHJ5IHJhdGhlciB0aGFuIGEgRFRfREVCVUcgZW50cnkuCi0JKG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IFNhdmUgdmFsdWUgb2YgX19ybGRfbWFwIG9yCi0JX19ybGRfb2JqX2hlYWQgc3ltYm9sLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyk6IEhhbmRsZSBEVF9NSVBTX1JMRF9NQVAuCi0KLU1vbiBKdWwgIDggMTY6MTg6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfcmVsb2NfbWFwKTogUmVtb3ZlIEJGRF9SRUxPQ18zMl9QQ1JFTCBlbnRyeS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfaG93dG9fcmF3KTogRm9yIFJfUFBDX0FERFIxNl9IQSwgdXNlCi0JcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MuCi0JKHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogY29mZi1taXBzLmMgKHN0cnVjdCBtaXBzX2hpKTogRGVmaW5lLgotCShtaXBzX3JlZmhpX2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotIAkobWlwc19yZWZoaV9hZGRyLCBtaXBzX3JlZmhpX2FkZGVuZCk6IFJlbW92ZS4KLQkobWlwc19yZWZoaV9yZWxvYyk6IE1haW50YWluIGEgbGlzdCBvZiB1bm1hdGNoZWQgUkVGSEkgcmVsb2NzLgotCShtaXBzX3JlZmxvX3JlbG9jKTogUHJvY2VzcyBtaXBzX3JlZmhpX2xpc3QuCi0JKG1pcHNfcmVsaGlfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHNfcmVsaGlfYWRkciwgbWlwc19yZWxoaV9hZGRlbmQpOiBSZW1vdmUuCi0JKG1pcHNfcmVsaGlfcmVsb2MpOiBNYWludGFpbiBhIGxpc3Qgb2YgdW5tYXRjaGVkIFJFTEhJIHJlbG9jcy4KLQkobWlwc19yZWxsb19yZWxvYyk6IFByb2Nlc3MgbWlwc19yZWxoaV9saXN0LgotCShtaXBzX3JlbG9jYXRlX3NlY3Rpb24pOiBQZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBSRUZISSBvcgotCVJFTEhJIHJlbG9jcyBiZWZvcmUgdGhlIGFzc29jaWF0ZWQgUkVGTE8gb3IgUkVMTE8gcmVsb2MuCi0KLUZyaSBKdWwgIDUgMTk6Mjc6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0LXRhcmdldC5oIChNWShjYWxsYmFjaykpOiBTZXQgcmVsb2NfY291bnQgZmllbGRzLgotCi1UaHUgSnVsICA0IDEyOjAwOjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vub3MuYyAoc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scyk6IERvbid0IGNyZWF0ZSBkeW5hbWljCi0Jc2VjdGlvbnMgdW5sZXNzIHRoaXMgaXMgYSBTdW5PUyBsaW5rLgotCi0JKiBWRVJTSU9OOiBTZXQgdG8gMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotV2VkIEp1bCAgMyAxNDo1OTo0NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODZhb3V0LmM6IEluY2x1ZGUgImFvdXQvYW91dDY0LmgiLgotIAkoaTM4NmFvdXRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRGVmaW5lLgotCi0JKiBuZXRic2QuaCAoTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSk6IE1ha2Ugc3VyZSB0aGF0Ci0JYWRqdXN0X3NpemVzX2FuZF92bWFzIGlzIGNhbGxlZCBiZWZvcmUgZmlkZGxpbmcgd2l0aCB0aGUgbWFnaWMKLQludW1iZXIuCi0KLVR1ZSBKdWwgIDIgMjM6MzA6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyk6IEZpeCBjYXN0cyBvZiBwc2luZm8uCi0KLVN1biBKdW4gMzAgMTM6MzQ6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJiZmQtaW4uaCAoaXRvcywgc3RvaSk6IERvbid0IGRlZmluZS4KLQkqIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogaTM4Nmx5bnguYyAoS0VFUElUKTogRGVmaW5lIGFzIHVkYXRhLmkuCi0JKE5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19vdXQpKTogRG9uJ3QgdXNlIHN0b2kuCi0JKE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpKTogTGlrZXdpc2UuCi0JKiByaXNjaXguYyAocmlzY2l4X3N3YXBfc3RkX3JlbG9jX291dCk6IFVzZSB1ZGF0YS5pIHJhdGhlciB0aGFuCi0JZmxhZ3MuICBEb24ndCB1c2Ugc3RvaS4KLQotCSogZWxmMzItbWlwcy5jIChFTEZfTUFHUEFHRVNJWkUpOiBDaGFuZ2UgZGVmaW5pdGlvbiB0byAweDEwMDAuCi0KLQkqIGVsZi5jIChtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMpOiBEb24ndCBzdGFydCBhIG5ldyBzZWdtZW50IGZvcgotIAlhIHdyaXRhYmxlIHNlY3Rpb24gaWYgaXQncyBvbiB0aGUgc2FtZSBwYWdlIGFzIHRoZSBwcmV2aW91cwotIAlzZWdtZW50LiAgUmVzZXQgdGhlIHdyaXRhYmxlIHZhcmlhYmxlIGZvciBhIHJlYWRvbmx5IHNlY3Rpb24uCi0KLVNhdCBKdW4gMjkgMTY6MTg6NTEgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2FvdXRoZHJfaW4pOiBNaXNzaW5nIGluaXRpYWxpemF0aW9ucyBvZgotCWZpcnN0X3RodW5rX2FkZHJlc3MsIHRodW5rX3NpemUsIGFuZCBpbXBvcnRfdGFibGVfc2l6ZS4KLQkqIHBlaWNvZGUuaDogSW1wcm92ZWQgc29tZSBkaWFnbm9zdGljcyByZWdhcmRpbmcgZWRhdGEgc2VjdGlvbnMuCi0KLQkqIGNvZmYtcHBjLmMgKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBFYXJsaWVyIGVycm9yIGNoZWNrCi0Jb24gSU1HTFVFIHJlbG9jcy4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IEltcHJvdmVkIGRpYWdub3N0aWMgZm9yIGxhcmdlIFRPQ0RFRk4ncy4KLQkoVEFSR0VUX0xJVFRMRV9TWU0pOiBBZGRlZCBtaXNzaW5nIERfUEFHRUQuCi0KLUZyaSBKdW4gMjggMTM6NDg6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogQW4gdW5kZWZpbmVkIHN5bWJvbAotCXdpdGggWENPRkZfREVGX0RZTkFNSUMgc2V0IGlzIHJlYWxseSBkZWZpbmVkLgotCSh4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scyk6IExpa2V3aXNlLgotCSh4Y29mZl9saW5rX2FkZF9zeW1ib2xzKTogT25seSBjcmVhdGUgc3BlY2lhbCBzZWN0aW9ucyBpZiB1c2luZyBhbgotCVhDT0ZGIGhhc2ggdGFibGUuCi0KLQkqIHJlbG9jLmMgKGJmZF9wZXJmb3JtX3JlbG9jYXRpb24pOiBIYW5kbGUgeGNvZmYtcG93ZXJtYWMgbGlrZQotCWFpeGNvZmYtcnM2MDAwLgotCShiZmRfaW5zdGFsbF9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMjggMTE6MTc6MDAgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkIGZsYWdzCi0JZmllbGQuCi0JKEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfQUREUik6IERlZmluZS4KLQkoQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9NRU0pOiBEZWZpbmUuCi0JKEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQyk6IERlZmluZS4KLQkoZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIGZsYWdzIGZpZWxkLgotCShlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MpOiBSZWNvcmQgdHlwZXMgb2YgTElUVVNFIGVudHJpZXMgdGhhdAotCWFyZSBmb3VuZCBmb3IgTElURVJBTCByZWxvY3MuCi0JKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIGhhcyBpdHMgYWRkcmVzcwotCXRha2VuLCB3ZSBjYW5ub3QgZ2VuZXJhdGUgYSAucGx0IGVudHJ5IGZvciB0aGUgc3ltYm9sLgotCi1UaHUgSnVuIDI3IDExOjI0OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfSVNDX1BPU0lYLCBhbmQgY2hlY2sgZm9yIHNldGl0aW1lciBhbmQKLQlzeXNjb25mIGZ1bmN0aW9ucyAoZm9yIGdwcm9mKS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1XZWQgSnVuIDI2IDE2OjI5OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9hcmNoaXZlX3ApOiBDaGVjayB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgaW4KLQlhbiBhcmNoaXZlIGlmIGl0IGhhcyBhIG1hcC4gIElmIHRoZSBvYmplY3QgZmlsZSBoYXMgdGhlIHdyb25nCi0JeHZlYywgcmVqZWN0IGl0LgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2FkanVzdF9yZWxvY19pbik6IFNldCB0aGUgYWRkZW5kIGZvciBhCi0JQlJBRERSLCBTUkVMMTYsIFNSRUwzMiwgb3IgU1JFTDY0IHJlbG9jIGFnYWluc3QgYW4gZXh0ZXJuYWwKLQlzeW1ib2wuCi0JKGFscGhhX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3JlbG9jX291dCk6IFVzZSBSRUxTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2ZpbGVoZHJfb3V0KTogVXNlIEZJTEhTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX3N5bV9vdXQpOiBVc2UgU1lNRVNaLCBub3Qgc2l6ZW9mLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IFVzZSBBVVhFU1osIG5vdCBzaXplb2YuCi0JKGNvZmZfc3dhcF9saW5lbm9fb3V0KTogVXNlIExJTkVTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX2FvdXRoZHJfb3V0KTogVXNlIEFPVVRTWiwgbm90IHNpemVvZi4KLQkoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBVc2UgU0NOSFNaLCBub3Qgc2l6ZW9mLgotCSogcGVpY29kZS5oOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBKdW4gMjUgMTU6Mjg6MzQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IENvbW1lbnQgb3V0IGNvZGUKLQlkZWFsaW5nIHdpdGggbWFraW5nIEdPVCBwb2ludGVycyBuZWdhdGl2ZSBvZiB0aGUgR09UIHN5bWJvbCBmb3IKLQlub3cuCi0KLVR1ZSBKdW4gMjUgMTE6NDE6MjQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmMgKGVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0Ci0JaW5jcmVtZW50IHRoZSAucmVsYS5wbHQgc2l6ZSB1bnRpbCBhZnRlciB3ZSdyZSBkb25lIGNyZWF0aW5nIHRoZQotCS5wbHQgZW50cnkuCi0JKGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IENoYW5nZSAucGx0IGVudHJ5IHRvIGxvYWQgdGhlCi0JLnJlbGEucGx0IG9mZnNldCBkaXJlY3RseSByYXRoZXIgdGhhbiBjYWxjdWxhdGluZyBpdC4KLQotTW9uIEp1biAyNCAxNzoxNToxMCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0gICAgICAgICogTWFrZWZpbGUuaW4sIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyKToKLQlVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLSAgICAgICAgKiBkb2MvTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsCi0JaW5jbHVkZWRpciwgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0Ci0JdmFsdWVzLgotICAgICAgICAoZG9jZGlyKTogRGVsZXRlZC4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIHYyLjUgb3IgaGlnaGVyLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIEp1biAyNCAyMjo1MDozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNvbS5jIChzb21fd3JpdGVfZml4dXBzKTogRml4IHR5cG8gaW4gUl9FTkRfVFJZIGZvciBleGNlcHRpb24KLQloYW5kbGluZyBjb2RlID4gMWsgYXdheS4KLQotTW9uIEp1biAyNCAxODo0MTowNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogSWYgREVCVUcgaXMKLQlkZWZpbmVkLCBvdXRwdXQgd2hlbmV2ZXIgdGhlIHN5bWJvbCBpcyB1cGRhdGVkLgotCi1Nb24gSnVuIDI0IDE3OjU4OjEyIDE5OTYgIEpvdWtlIE51bWFuICA8am51bWFuQGJhemlzLm5sPgotCi0JKiBlbGYuYyAoZWxmX2Zha2Vfc2VjdGlvbnMpOiBEb24ndCBzZXQgc2hfYWRkciBvZiBhIG5vbiBTRUNfQUxMT0MKLQlzZWN0aW9uIHRvIDAgaWYgdXNlcl9zZXRfdm1hIGlzIHNldC4KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogTGlrZXdpc2UuCi0KLVN1biBKdW4gMjMgMjA6NDI6NTEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCVBhcnRpYWxseSB1bmRvIHBhdGNoIG9mIEp1biAyMC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogVXNlIENPRkZfSU1BR0VfV0lUSF9QRS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIFJlLWFkZCBkZWxldGVkIGNvZGUsIGJ1dAotCXVzZSAjaWZkZWYgQ09GRl9XSVRIX1BFLCBub3QgQ09GRl9PQkpfV0lUSF9QRS4KLQkqIHBlaWNvZGUuaCAocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IFJlLWFkZCAjaWZkZWYuCi0KLUZyaSBKdW4gMjEgMTc6Mzg6MTUgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAbWVybGluLmdjcy5yZWRzdG9uZS5hcm15Lm1pbD4KLQotCSogY29uZmlnLmJmZDogQWRkIHN1cHBvcnQgZm9yICotKi1ydGVtcyogY29uZmlndXJhdGlvbnMuCi0KLUZyaSBKdW4gMjEgMTU6MTk6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAocHJlcF9oZWFkZXJzKTogQWRkIGJmZF9hcmNoX2FscGhhIGNhc2UuCi0KLUZyaSBKdW4gMjEgMTI6MzU6MjcgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGVsZjY0LWFscGhhLmM6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAoYWxwaGEtKi1saW51eGVjb2ZmKik6IE5ldyB0YXJnZXQuCi0JKGFscGhhLSotbGludXgqLCBhbHBoYS0qLWVsZiopOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2VsZjY0X2FscGhhX3ZlYyk6IE5ldyB2ZWN0b3IuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiB0YXJnZXRzLmMgKGJmZF9lbGY2NF9hbHBoYV92ZWMpOiBEZWNsYXJlLgotCShiZmRfdGFyZ2V0X3ZlY3Rvcik6IEFkZCBiZmRfZWxmNjRfYWxwaGFfdmVjIGlmIEJGRDY0LgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX0FMUEhBX0dQRElTUCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaCwgbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBlbGY2NC1hbHBoYS5vLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBBZGQgZWxmNjQtYWxwaGEuYy4KLQotVGh1IEp1biAyMCAxODoxNDoyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2FybWFwX2hhc2gpOiBJZiBobG9nIGlzIDAsIGp1c3QgcmV0dXJuIDAsIHJhdGhlcgotCXRoYW4gcmVseWluZyBvbiBhIHJpZ2h0IHNoaWZ0IG9mIDMyLgotCi1UaHUgSnVuIDIwIDExOjAwOjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogQ2hhbmdlIENPRkZfSU1BR0VfV0lUSF9QRQotCWlmZGVmIHRvIENPRkZfV0lUSF9QRS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBMaWtld2lzZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBMaWtld2lzZS4gIERlbGV0ZSBDT0ZGX09CSl9XSVRIX1BFLgotCSogcGUte2FybSxpMzg2LHBwY30uYyAoQ09GRl9PQkpfV0lUSF9QRSk6IERlbGV0ZS4KLQkqIHBlaWNvZGUuaCAocGVfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlbGV0ZSBpZmRlZgotCUNPRkZfSU1BR0VfV0lUSF9QRSwgYWx3YXlzIGluY2x1ZGUuCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiAiLmRyZWN0dmUiIGRvZXNuJ3QgaGF2ZSB0cmFpbGluZyAwLgotCi1XZWQgSnVuIDE5IDExOjM3OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IEZpeCB1cCB0aGUgdGVzdCBmb3IgLVR0ZXh0IHRvCi0JYXBwcm94aW1hdGUgdGhlIGNvcnJlY3QgYW5zd2VyIGlmIFNJWkVPRl9IRUFERVJTIHdhcyBub3QgdXNlZC4KLQotCSogYmluYXJ5LmMgKGJpbmFyeV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFNldCBzZWN0aW9uIGZpbGUKLQlwb3NpdGlvbiBiYXNlZCBvbiBMTUEgcmF0aGVyIHRoYW4gVk1BLgotCi1XZWQgSnVuIDE5IDExOjE5OjI1IDE5OTYgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VJQzUgNjAvMy8xNDIgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IERvbid0IG91dHB1dCBhbnkKLQlzeW1ib2xzIGlmIGluZm8tPnN0cmlwID09IHN0cmlwX2FsbC4KLQotVHVlIEp1biAxOCAxNToxNzozNiAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jOiBSZW1vdmUgI2lmIDAgY29kZS4KLQkoY29tcGF0YWJsZSk6IERvbid0IGFsbG93IG1peGluZy9tYXRjaGluZyBvZiBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcy4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfaDgzMDBzKTogQWRkLgotCSogYmZkLWluMi5oOiBSZWJ1aWx0LgotCSogY29mZi1oODMwMC5jIChmdW5jdmVjX2hhc2hfbmV3ZnVuYyk6IEhhbmRsZSBIOC9TIHRvby4KLQkoQkFETUFHKTogTGlrZXdpc2UuCi0JKGg4MzAwX3JlbG9jMTZfZXN0aW1hdGUpOiBMaWtld2lzZS4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCShoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBMaWtld2lzZS4KLQkoY29mZl9zZXRfZmxhZ3MpOiBMaWtld2lzZS4KLQkqIGNwdS1oODMwMC5jIChoODMwMF9zY2FuKTogTGlrZXdpc2UuCi0JQWRkIEg4L1MgdG8gYmZkX2g4MzAwX2FyY2ggbGlzdC4KLQotVHVlIEp1biAxOCAxNDo0Mjo1OCAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCUFkZGVkIHN1cHBvcnQgZm9yIEFscGhhIE9wZW5WTVM6Ci0JKiBldmF4LmgsIGV2YXgtYWxwaGEuYywgZXZheC1lZ3NkLmMsIGV2YXgtZW1oLmM6IE5ldyBmaWxlcy4KLQkqIGV2YXgtZXRpci5jLCBldmF4LW1pc2MuYywgaG9zdHMvYWxwaGF2bXMuaDogTmV3IGZpbGVzLgotCSogY29uZmlnLmgtdm1zLCBtYWtlZmlsZS52bXM6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZy5iZmQgKGFscGhhLSotKnZtcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChldmF4X2FscGhhX3ZlYyk6IE5ldyB0YXJnZXQgdmVjdG9yLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogcmVsb2MuYyAoQkZEX1JFTE9DX1NXUkVMMzIsIEJGRF9SRUxPQ19TV1JFTDY0KTogRGVmaW5lLgotCShCRkRfUkVMT0NfQUxQSEFfTElOS0FHRSwgQkZEX1JFTE9DX0FMUEhBX0JBU0VSRUcpOiBEZWZpbmUuCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXRfZXZheF9mbGF2b3VyKTogRGVmaW5lLgotCShldmF4X2FscGhhX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYyBhbmQgZXZheF9hbHBoYV92ZWMKLQlpZiBCRkQ2NCBpcyBkZWZpbmVkLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZENjRfQkFDS0VORFMpOiBBZGQgZXZheC1hbHBoYS5vLCBldmF4LWVnc2QubywgZXZheC1ldGlyLm8sCi0JZXZheC1lbWgubywgYW5kIGV2YXgtbWlzYy5vLgotCShCRkQ2NF9CQUNLRU5EU19DRklMRVMpOiBBZGQgZXZheC1hbHBoYS5jLCBldmF4LWVnc2QuYywKLQlldmF4LWV0aXIuYywgZXZheC1lbWguYywgYW5kIGV2YXgtbWlzYy5jLgotCShIRklMRVMpOiBBZGQgZXZheC5oLgotCi1UdWUgSnVuIDE4IDEzOjU0OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1oODMwMC5jIChoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogTWFrZSBuYW1lIGEgY29uc3QKLQlwb2ludGVyLgotCShoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDE3IDEwOjA2OjUwIDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBzb20uaCAoUl9IUFBBX0JFR0lOX1RSWSwgUl9IUFBBX0VORF9UUlkpOiBEZWZpbmUuCi0JKiBzb20uYyAoc29tX3dyaXRlX2ZpeHVwcyk6IEhhbmRsZSBSX0JFR0lOX1RSWSBhbmQgUl9FTkRfVFJZLgotCi1Nb24gSnVuIDE3IDEyOjQ5OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3QgY3JlYXRlIGEgcmVsb2MKLQlmb3IgUl9NSVBTX1JFTDMyIGFuZCBSX01JUFNfMzIgcmVsb2NzIGlmIG5vIGR5bmFtaWMgc2VjdGlvbnMgd2VyZQotCWNyZWF0ZWQuCi0JKG1pcHNfZWxmX2NoZWNrX3JlbG9jcyk6IE9ubHkgY3JlYXRlIC5yZWwuZHluIGZvciBSX01JUFNfUkVMMzIgYW5kCi0JUl9NSVBTXzMyIHJlbG9jcyBpZiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCi1UaHUgSnVuIDEzIDIwOjE0OjUxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoYWRkX2RhdGFfZW50cnkpOiBVc2UgcGVpX3NlY3Rpb25fZGF0YSByYXRoZXIgdGhhbgotCV9jb29rZWRfc2l6ZS4gIENvcnJlc3BvbmRzIHRvIE1heSAxMyBjaGFuZ2UgaW4gY29mZmNvZGUuaC4KLQotVGh1IEp1biAxMyAxMDoyMzo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZsaW5rLmMgKF9iZmRfY29mZl9maW5hbF9saW5rKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgdGhlcmUgYXJlIGxvbmcKLQlzZWN0aW9uIG5hbWVzLCBhbHdheXMgc2V0IHRoZSBmX3N5bXB0ciBmaWVsZCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8KLQlzeW1ib2xzLgotCSogcGVpY29kZS5oIChjb2ZmX3N3YXBfZmlsZWhkcl9pbik6IERvbid0IGNsZWFyIHRoZSBmX3N5bXB0ciBmaWVsZAotCWlmIHRoZXJlIGFyZSBubyBzeW1ib2xzLgotCi0JKiBjb2ZmZ2VuLmMgKG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCV9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZS4KLQkoY29mZl9yZWFsX29iamVjdF9wKTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mCi0JbWFrZV9hX3NlY3Rpb25fZnJvbV9maWxlLgotCShfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUpOiBDaGVjayB0aGF0IHRoZXJlIGFyZSBzb21lIHN5bWJvbHMKLQliZWZvcmUgdHJ5aW5nIHRvIHJlYWQgdGhlIHN0cmluZyB0YWJsZSBzaXplLgotCi1XZWQgSnVuIDEyIDExOjE2OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBXaGVuIGNvbnNpZGVyaW5nIHdoZXRoZXIKLQl0byByZXBsYWNlIGEgc3ltYm9sIGluIGEgZHluYW1pYyBvYmplY3Qgd2l0aCBhIHN5bWJvbCBmcm9tIGFub3RoZXIKLQlkeW5hbWljIG9iamVjdCwgZG8gdGhlIHJlcGxhY2VtZW50IGlmIHRoZSBleGlzdGluZyBzeW1ib2wgaXMKLQlnbG9iYWwgbGlua2FnZSBjb2RlLgotCi0JKiB4Y29mZmxpbmsuYyAoX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbik6IENoZWNrIGV4cGxpY2l0bHkKLQlmb3IgX3B0cmdsLCBhbmQgdHJlYXQgaXQgYXMgZ2xvYmFsIGxpbmthZ2UgY29kZS4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IE5vdGljZSBpZiB3ZSBmaW5kIGEKLQlmaWxlbmFtZSBvciBOX1NPIHN5bWJvbCBwYXN0IHRoZSBvZmZzZXQsIGFuZCB1c2UgaXQgdG8gaW5kaWNhdGUKLQl0aGF0IHRoZXJlIGlzIG5vIGxpbmUgbnVtYmVyIG9yIGZ1bmN0aW9uIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVR1ZSBKdW4gMTEgMTU6MjQ6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfYnVpbGRfbGRzeW1zKTogU2V0IFhDT0ZGX0RFRl9SRUdVTEFSIGZvciBhCi0JY29tbW9uIHN5bWJvbCBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIuICBEb24ndCBleHBvcnQgZnVuY3Rpb24gY29kZQotCWV2ZW4gaWYgZXhwb3J0X2RlZmluZWRzIGlzIHNldC4KLQotTW9uIEp1biAxMCAxMTo1NzoyNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaG93dG9fdGFibGUpOiBBZGQgbmV3IGVudHJpZXMgZm9yIFJfQkNDX0lOVgotCWFuZCBSX0pNUF9ERUwuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIFJfQkNDX0lOViBhbmQgUl9KTVBfREVMLgotCShoODMwMF9zeW1ib2xfYWRkcmVzc19wKTogTmV3IGZ1bmN0aW9uLgotCShoODMwMF9yZWxvYzE2X2VzdGltYXRlKTogRWxpbWluYXRlIGp1bXBzIG1hZGUgdW5uZWNlc3NhcnkgYnkKLQlyZWxheGluZy4KLQotU3VuIEp1biAgOSAxNjozMDoyMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmYtaDgzMDAuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IEZpeCBtYW55IG1pbm9yIHNwYWNpbmcKLQlwcm9ibGVtcy4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSwgY2FzZXMgUl9KTVAxLCBSX0pNUDIpOiBBZGp1c3QgImRvdCIKLQljb3JyZWN0bHkgZm9yIHRoZSB0d28gdmFyaWFudHMuICBBbGxvdyByZWxheGluZyBpZiB0aGUgdGFyZ2V0Ci0JaXMgMTI4IGJ5dGVzIGF3YXkgc2luY2UgYWZ0ZXIgcmVsYXhhdGlvbiBpdCdsbCBiZSAxMjYgYnl0ZXMgYXdheS4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSwgY2FzZSBSX1BDUldPUkQpOiBDb3JyZWN0bHkgYWRqdXN0Ci0JImRvdCIgYW5kICJ2YWx1ZSIuICBBbGxvdyByZWxheGluZyBpZiB0aGUgdGFyZ2V0IGlzIDEyOCBieXRlcwotCWF3YXkgc2luY2UgYWZ0ZXIgcmVsYXhhdGlvbiBpdCdsbCBiZSAxMjYgYnl0ZXMgYXdheS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uKTogS2VlcCByZWxheGluZwotCXRoZSBnaXZlbiBzZWN0aW9uIHVudGlsIG5vdGhpbmcgY2hhbmdlcy4KLQotVGh1IEp1biAgNiAxNToyNDo0NSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogZWNvZmYuYyAoX2JmZF9lY29mZl9uZXdfc2VjdGlvbl9ob29rKTogUmVtb3ZlIHRoZSBfUERBVEEKLSAJYWxpZ25tZW50IGhhY2stLXdlIGNhbiBnZXQgdGhlIGxubm9wdHIgaW5mbyBhbm90aGVyIHdheSB3aXRob3V0Ci0gCXN1ZGRlbmx5IGluY3JlYXNpbmcgdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMuICBTZXQgdGhlIGZsYWdzIGZvcgotCXRoZSBfUERBVEEgc2VjdGlvbi4KLQkoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogRG8gc28uCi0KLVRodSBKdW4gIDYgMTE6MjQ6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogUHV0IGEgdGltZXN0YW1wIGluIHRoZSBmaWxlCi0JdG8ga2VlcCB0aGUgSFAgZW11bGF0b3IgZGF0YWJhc2UgaGFwcHkuCi0KLQkqIGNvbmZpZy5iZmQ6IFJlY29nbml6ZSBwb3dlcnBjLSotbGludXgqIGFuZCBwb3dlcnBjbGUtKi1saW51eCouCi0JRnJvbSBLZXZpbiBCdWV0dG5lciA8a2V2QHByaW1lbmV0LmNvbT4uCi0KLVdlZCBKdW4gIDUgMTU6MTY6MDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyk6IERvbid0IHRyeSB0byBwcmludCB0aGUKLQluYW1lIG9mIGEgTlVMTCBzZWN0aW9uLgotCi1UdWUgSnVuICA0IDE4OjUzOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogSWYgbm90aWNlX2FsbCBpcwotCXNldCwgYWx3YXlzIGNhbGwgdGhlIG5vdGljZSBjYWxsYmFjay4KLQotCSogVkVSU0lPTjogSW5jcmVtZW50IGZvciBiZmRsaW5rLmggY2hhbmdlLgotCi1Nb24gSnVuICAzIDExOjAxOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jIChDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIpOiBTZXQgdG8gNC4KLQkoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogQ29ycmVjdCBoYW5kbGluZyBvZiBkaWZmZXJlbnRseSBzaXplZAotCXRyYWlsaW5nIGFsaWdubWVudCByZWxvYy4KLQotCSogYmZkLWluLmg6IFVzZSAjZXJyb3IgaWYgQkZEX0hPU1RfNjRfQklUIGNhbiBub3QgYmUgZGVmaW5lZC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5pbjogV2FybiBpZiB0aGVyZSBpcyBubyBrbm93biA2NCBiaXQgdHlwZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQkZEMzJfQkFDS0VORFMpOiBBZGQgcHBjYm9vdC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgcHBjYm9vdC5jLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IEluaXRpYWxpemUgYy4KLQlGcm9tIFBlciBGb2dlbHN0cm9tIDxwZXIuZm9nZWxzdHJvbUBtYWlsYm94MjAwLnN3aXBuZXQuc2U+LgotCi1TYXQgSnVuICAxIDIxOjQ5OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jIChiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4pCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiBNb3ZlIGZyb20gaGVyZS4uLgotCSogZWxmMzItbWlwcy5jIChiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4pCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiAuLi50byBoZXJlLgotCi1GcmkgTWF5IDMxIDEzOjUxOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jOiBJbXByb3ZlIHJlbG9jIHNwZWNpYWxfZnVuY3Rpb25zIGFuZCBoYW5kbGluZyBvZgotCVNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9oaTE2X3JlbG9jIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2xvMTZfcmVsb2MgYW5kCi0JbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jKTogUmVuYW1lIGZyb20gbWlwc19lbGZfZ290MTZfcmVsb2MgYW5kCi0JbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpOiBSZW5hbWUgZnJvbSBtaXBzX2VsZl9ncHJlbDE2X3JlbG9jCi0JYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoZ3ByZWwxNl93aXRoX2dwKTogQ2hlY2sgaG93dG8tPnNyY19tYXNrIGJlZm9yZSB1c2luZyB2YWx1ZSBpbgotCWluc24uCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IFJlbmFtZSBmcm9tIG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MKLQlhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShncHJlbDMyX3dpdGhfZ3ApOiBDaGVjayBob3d0by0+c3JjX21hc2sgYmVmb3JlIGZldGNoaW5nIHZhbHVlLgotCShiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luKTogTmV3IGZ1bmN0aW9uLgotCShiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCk6IE5ldyBmdW5jdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShfYmZkX21pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkcik6IEFjY2VwdCAuTUlQUy5vcHRpb25zIGFzIGEgbmFtZQotCWZvciBhIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkobWlwc19lbGYzMl9zZWN0aW9uX2Zyb21fc2hkcik6IEhhbmRsZSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfZmFrZV9zZWN0aW9ucyk6IENvbnNpZGVyIC5NSVBTLm9wdGlvbnMgdG8gYmUgdGhlCi0JbmFtZSBvZiBhIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbi4KLQkoX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IE5ldyBmdW5jdGlvbi4KLQkobWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBTZXQgdGhlIEdQIHZhbHVlIGluIGEKLQlTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24uCi0JKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKGJmZF9lbGYzMl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IERlZmluZS4KLQkqIGVsZi1iZmQuaCAoX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZ3ByZWwzMl9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfZmluZF9uZWFyZXN0X2xpbmUpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzKTogRGVjbGFyZS4KLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2luZm9fdG9faG93dG8pOiBSZW5hbWUgZnJvbQotCWVsZl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8pOiBSZW5hbWUgZnJvbQotCWVsZl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZS4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8pOiBSZW5hbWUgZnJvbQotCWVsZl9pbmZvX3RvX2hvd3RvLgotCShlbGZfaW5mb190b19ob3d0byk6IERlZmluZS4KLQotCSogY29mZi13NjUuYyAoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IFJlbmFtZSBSX01PVkJbMTJdIHRvCi0JUl9NT1YxNkJbMTJdLCB0byBtYXRjaCBjaGFuZ2UgaW4gY29mZi9pbnRlcm5hbC5oLgotCi1UaHUgTWF5IDMwIDEyOjM4OjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmNjQtbWlwcy5jOiBFeHRlbnNpdmUgYWRkaXRpb25zIHRvIHByb3ZpZGUgYmV0dGVyIHN1cHBvcnQgZm9yCi0Jd3JpdGluZyBmaWxlcyBhbmQgZm9yIGdhcy4KLQkqIGVsZjMyLW1pcHMuYyAoX2JmZF9taXBzX2VsZl9vYmplY3RfcCk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dAotCW9mIG1pcHNfZWxmX29iamVjdF9wLgotCShtaXBzX2VsZjMyX29iamVjdF9wKTogUmVuYW1lIGZyb20gbWlwc19lbGZfb2JqZWN0X3A7IGNhbGwKLQlfYmZkX21pcHNfZWxmX29iamVjdF9wLgotCShfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9mYWtlX3NlY3Rpb25zIGFuZCBtYWtlIGdsb2JhbGx5IHZpc2libGUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQltaXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcuCi0JKG1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nKTogUmVuYW1lIGZyb20KLQltaXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3Npbmc7IGNhbGwKLQlfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZy4KLQkoX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgYW5kIG1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8pOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyBhbmQgbWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCShtaXBzX2VsZjMyX2Vjb2ZmX2RlYnVnX3N3YXApOiBSZW5hbWUgZnJvbQotCW1pcHNfZWxmX2Vjb2ZmX2RlYnVnX3N3YXAuCi0JKiBlbGYuYyAoX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCk6IFVzZSBhc3ltYm9sIHJhdGhlciB0aGFuCi0Jc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeS4KLQkoX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGluIGZyb20KLQllbGZjb2RlLmg6dmFsaWRhdGVfcmVsb2MuCi0JKiBlbGZjb2RlLmggKHZhbGlkYXRlX3JlbG9jKTogUmVtb3ZlOyBtb3ZlZCBpbnRvIGVsZi5jIGFuZCByZW5hbWVkCi0JdG8gX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKiBlbGYtYmZkLmggKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IERlY2xhcmUuCi0JKF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBEZWNsYXJlLgotCShfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfb2JqZWN0X3ApOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMpOiBEZWNsYXJlLgotCShfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbik6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvKTogRGVjbGFyZS4KLQkoX2JmZF9taXBzX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVjbGFyZS4KLQkqIGVsZnh4LXRhcmdldC5oIChiZmRfZWxmTk5fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKTogRG9uJ3QgZGVmaW5lCi0JaWYgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX29iamVjdF9wKTogSGFuZGxlIEVfTUlQU19BUkNIXzQuCi0JKG1pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQotV2VkIE1heSAyOSAxNjoxNToyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQk2NC1iaXQgTUlQUyBFTEYgQUJJIG9iamR1bXAgc3VwcG9ydDoKLQkqIGVsZjY0LW1pcHMuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShCRkQ2NF9CQUNLRU5EUyk6IEFkZCBlbGY2NC1taXBzLm8uCi0JKEJGRDY0X0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBlbGY2NC1taXBzLmMuCi0JKiBjb25maWcuYmZkIChtaXBzKmVsLSotZWxmKikgQWRkIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBhbmQKLQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgdG8gdGFyZ19zZWx2ZWNzLgotCShtaXBzKi0qLWVsZiopOiBMaWtld2lzZS4KLQkqIGNvbmZpbmd1cmUuaW46IEFkZCBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYW5kCi0JYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIHRvIHZlY3RvciBzd2l0Y2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBlbGYzMi1taXBzLmMgKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBOZXcgZnVuY3Rpb24sCi0JYnJva2VuIG91dCBvZiBtaXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkci4KLQkobWlwc19lbGYzMl9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbmFtZSBmcm9tCi0JbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIuICBDYWxsIG5ldyBmdW5jdGlvbi4KLQkoZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIpOiBVcGRhdGUgbmFtZSBvZiByZW5hbWVkIGZ1bmN0aW9uLgotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX3NpemVfaW5mbyk6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIG9mCi0Jd3JpdGVfb3V0X3BoZHJzIHRvIGJlIGNvbnN0LiAgTGlrZXdpc2UgZm9yIHNlY29uZCBwYXJhbWV0ZXIgb2YKLQlzd2FwX3N5bWJvbF9vdXQuCi0JKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCByZWxfaGRyMiBmaWVsZC4KLQkoYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCi0JKGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2NfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0KTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX3BoZHJfaW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfcGhkcl9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3N3YXBfZHluX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjMyX3NsdXJwX3N5bWJvbF90YWJsZSk6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl93cml0ZV9zaGRyc19hbmRfZWhkcik6IERlY2xhcmUuCi0JKGJmZF9lbGYzMl93cml0ZV9vdXRfcGhkcnMpOiBEZWNsYXJlLgotCShiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4pOiBDaGFuZ2Ugc2Vjb25kIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY19pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9yZWxvY19vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcmVsb2NhX2luKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfcGhkcl9pbik6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9waGRyX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc3dhcF9keW5faW4pOiBMaWtld2lzZS4KLQkoYmZkX2VsZjY0X3N3YXBfZHluX291dCk6IExpa2V3aXNlLgotCShiZmRfZWxmNjRfc2x1cnBfc3ltYm9sX3RhYmxlKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X3dyaXRlX291dF9waGRycyk6IERlY2xhcmUuCi0JKF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBEZWNsYXJlLgotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IFJlbW92ZSBhc3NlcnRpb24gcmVxdWlyaW5nCi0JU0hUX1JFTC9TSFRfUkVMQSB0byBtYXRjaCB1c2VfcmVsYV9wLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlbG9jCi0Jc2VjdGlvbiBmb3IgdGhlIHNlY3Rpb24sIGFkZCB0aGUgbmV3IG9uZSB0byByZWxfaGRyMi4gIEluY3JlbWVudAotCXJlbG9jX2NvdW50IHJhdGhlciB0aGFuIHNldHRpbmcgaXQuCi0JKiBlbGZjb2RlLmggKGVsZl9zbHVycF9zeW1ib2xfdGFibGUpOiBEZWZpbmUgbmFtZSBhcyBtYWNyby4KLQlSZW1vdmUgc3RhdGljIGRlY2xhcmF0aW9uLgotCShlbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIpOiBEZWZpbmUgbmFtZSBhcyBtYWNyby4KLQkoZWxmX3dyaXRlX291dF9waGRycyk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9laGRyX2luLCBlbGZfc3dhcF9laGRyX291dCk6IERlY2xhcmUuCi0JKGVsZl9zd2FwX3NoZHJfaW4sIGVsZl9zd2FwX3NoZHJfb3V0KTogRGVjbGFyZS4KLQkoZWxmX3N3YXBfc3ltYm9sX2luKTogQ2hhbmdlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QuCi0JKGVsZl9zd2FwX3N5bWJvbF9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfZWhkcl9pbiwgZWxmX3N3YXBfZWhkcl9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfc2hkcl9pbiwgZWxmX3N3YXBfc2hkcl9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfcGhkcl9pbiwgZWxmX3N3YXBfcGhkcl9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3N3YXBfcmVsb2NfaW4sIGVsZl9zd2FwX3JlbG9jX291dCk6IExpa2V3aXNlLgotCShlbGZfc3dhcF9yZWxvY2FfaW4sIGVsZl9zd2FwX3JlbG9jYV9vdXQpOiBMaWtld2lzZS4KLQkoZWxmX3dyaXRlX291dF9waGRycyk6IFJlbmFtZSBmcm9tIHdyaXRlX291dF9waGRycy4gIENoYW5nZSBzZWNvbmQKLQlwYXJhbWV0ZXIgdG8gYmUgY29uc3QuICBNYWtlIG5vbi1zdGF0aWMuCi0JKGVsZl93cml0ZV9zaGRyc19hbmRfZWhkcik6IFJlbmFtZSBmcm9tIHdyaXRlX3NoZHJzX2FuZF9laGRyLgotCU1ha2Ugbm9uLXN0YXRpYy4KLQkoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkoTkFNRShfYmZkX2VsZixzaXplX2luZm8pKTogVXBkYXRlIG5hbWVzIG9mIHJlbmFtZWQgZnVuY3Rpb25zLgotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9pbmZvX3RvX2hvd3RvKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShlbGZfYmFja2VuZF9zaXplX2luZm8pOiBMaWtld2lzZS4KLQkoZWxmTk5fYmVkKTogVXNlIGVsZl9iYWNrZW5kX3NpemVfaW5mby4KLQkqIHRhcmdldHMuYyAoYmZkX2VsZjY0X2JpZ21pcHNfdmVjKTogRGVjbGFyZS4KLQkoYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKTogRGVjbGFyZS4KLQkoYmZkX3RhcmdldF92ZWN0b3IpOiBBZGQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGFuZAotCWJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyBpZiBCRkQ2NCBpcyBkZWZpbmVkLgotCi0JKiBsaWJiZmQuYyAoYmZkX2dldF9maWxlX3dpbmRvdyk6IEFkZCBjYXN0IHRvIGZwcmludGYgYXJndW1lbnQuCi0KLVR1ZSBNYXkgMjggMTE6NDI6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmLXNoLmMgKHNoX3JlbGF4X2RlbGV0ZV9ieXRlcyk6IEluc2VydCBub3AgaW5zdHJ1Y3Rpb25zLCBub3QKLQl6ZXJvZXMsIGluIGFsaWdubWVudCBob2xlcy4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKSk6IE1ha2Ugcm9vbSBmb3IgdGhlCi0JcG90ZW50aWFsIGxlYWRpbmcgdW5kZXJzY29yZSBpbiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KLQotRnJpIE1heSAyNCAxNDoyODozOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvIG5vdCBwdXQgc21hbGwgY29tbW9uCi0Jc3ltYm9scyBpbnRvIC5zYnNzIGlmIHRoaXMgaXMgYSByZWxvY2F0YWJsZSBsaW5rLgotCi1UaHUgTWF5IDIzIDEyOjI2OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKF9iZmRfcHBjX3hjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pOiBXYXJuIGFib3V0Ci0JdW5kZWZpbmVkIHN5bWJvbHMgd2hlbiBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LgotCi1GcmkgTWF5IDE3IDEzOjU0OjE1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zaC5jOiBBZGQgYSBidW5jaCBvZiBuZXcgY29kZSBhbmQgc3RhdGljIGNvbnN0IGFycmF5cyB0bwotCXN1cHBvcnQgYWxpZ25pbmcgbG9hZHMgYW5kIHN0b3JlcyBvbiBmb3VyIGJ5dGUgbWVtb3J5IGJvdW5kYXJpZXMuCi0JQWxzbzoKLQkoc2hfY29mZl9ob3d0b3MpOiBBZGQgZW50cmllcyBmb3IgUl9TSF9DT0RFLCBSX1NIX0RBVEEgYW5kCi0JUl9TSF9MQUJFTC4KLQkoc2hfcmVsYXhfc2VjdGlvbik6IExvb2sgZm9yIFJfU0hfQ09ERSByZWxvY3MuICBJZiB3ZSBmaW5kIG9uZSwKLQljYWxsIHNoX2FsaWduX2xvYWRzLgotCShzaF9yZWxheF9kZWxldGVfYnl0ZXMpOiBEb24ndCBtYXJrIFJfU0hfQ09ERSBvciBSX1NIX0RBVEEgcmVsb2NzCi0JYXMgdW51c2VkLgotCi1UaHUgTWF5IDE2IDE2OjM0OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2FjaGUuYyAoYmZkX29wZW5fZmlsZSk6IFVubGluayB0aGUgZmlsZSBiZWZvcmUgb3BlbmluZyBpdCBmb3IKLQl3cml0ZS4gIEZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCi0KLQkqIG9wbmNscy5jIChiZmRfZmRvcGVucik6IFNldCBvcGVuZWRfb25jZS4KLQotVHVlIE1heSAxNCAxMjozNTozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNvbS5jIChzb21fc2x1cnBfcmVsb2NfdGFibGUpOiBDbGVhciBleHRlcm5hbF9yZWxvY3MgY2FjaGUgYWZ0ZXIKLQlmcmVlaW5nIGl0LgotCi0JKiBsaWJiZmQuYzogUmVtb3ZlICNpZmRlZiBGSUxFX09GRlNFVF9JU19DSEFSX0lOREVYLCBhbmQgY29tcGlsZQotCXRoZSBjb2RlIHVuY29uZGl0aW9uYWxseS4KLQotTW9uIE1heSAxMyAxOTo1MTozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhKTogRGVmaW5lIHN0cnVjdHVyZS4KLQkocGVpX3NlY3Rpb25fZGF0YSk6IERlZmluZSBtYWNyby4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogSWYgQ09GRl9JTUFHRV9XSVRIX1BFLAotCXN0b3JlIHNfcGFkZHIgZmllbGQgaW4gcGVpX3NlY3Rpb25fZGF0YS4KLQkoY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBVc2UgcGVpX3NlY3Rpb25fZGF0YSByYXRoZXIKLQl0aGFuIF9jb29rZWRfc2l6ZSwgYW5kIGRvbid0IG92ZXJ3cml0ZSBhbiBleGlzdGluZyB2YWx1ZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBDT0ZGX09CSl9XSVRIX1BFLCBzZXQgc19wYWRkciB0bwotCTAuICBJZiBDT0ZGX0lNQUdFX1dJVEhfUEUsIHNldCBzX3BhZGRyIHRvIHBlaV9zZWN0aW9uX2RhdGEuCi0JKiBwZWljb2RlLmggKGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpOiBEZWZpbmUgaWYKLQlDT0ZGX0lNQUdFX1dJVEhfUEUuCi0gCShwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24gaWYKLQlDT0ZGX0lNQUdFX1dJVEhfUEUuCi0KLVdlZCBNYXkgIDggMTY6MTA6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcmVjLmMgKHNyZWNfc2V0X2FyY2hfbWFjaCk6IFdyaXRlIGFzIGEgZnVuY3Rpb24gcmF0aGVyIHRoYW4gYQotCW1hY3JvIGRlZmluaXRpb24uCi0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogSWYgYW4gYXJjaGl2ZSBoYXMKLQlubyBtYXAsIGp1c3QgY2hlY2sgZWFjaCBtZW1iZXIgaW4gdHVybiB0byBzZWUgd2hldGhlciBpdCBpcwotCXJlcXVpcmVkLgotCi1XZWQgTWF5ICA4IDA5OjE3OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjYm9vdC5jIChwcGNib290X29iamVjdF9wKTogQ2hlY2sgZm9yIHR5cGUgMHg0MSBpbiBwYXJ0aXRpb24KLQl0YWJsZS4gIENhbGwgQkZEX0FTU0VSVCB0byB2YWxpZGF0ZSBoZWFkZXIgc2l6ZSwgaW5zdGVhZCBvZgotCWNhbGxpbmcgZmF0YWwuCi0JKHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpOiBQdXQgcXVvdGVzIGFyb3VuZCBwYXJ0aXRpb24KLQluYW1lLgotCi1UdWUgTWF5ICA3IDE2OjEwOjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjYm9vdC5jOiBOZXcgdGFyZ2V0IGZvciBsb29raW5nIGF0IFBQQ2J1ZyBib290IHJlY29yZHMuCi0KLQkqIGNvbmZpZ3t1cmUuaW4sLmJmZH06IEFkZCBzdXBwb3J0IGZvciBwcGNib290IHRhcmdldC4KLQkqIHRhcmdldHMuYzogRGl0dG8uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBNYXkgIDcgMTE6MTU6MTkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKGhvd3RvX3RhYmxlKTogVXBkYXRlIG5hbWVzIHRvIG1hdGNoIHJlY2VudAotCWNoYW5nZXMgdG8gaW5jbHVkZS9jb2ZmL2ludGVybmFsLmguICBGaXggbWlub3IgZXJyb3JzIGluIHRoZQotCWV4aXN0aW5nIHJlbG9jcy4gIEFkZCBSX01PVkwxIGFuZCBSX01PVkwyLgotCShydHlwZTJob3d0byk6IFNpbWlsYXJseS4KLQkoaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZSk6IFJld3JpdGUgdG8gc2ltcGxpZnksIGZpeCBidWdzIGluIHRoZQotCWV4aXN0aW5nIHJlbGF4aW5nIGNvZGUgIGFuZCBwZWZvcm0gbW9yZSByZWxheGluZy4KLQkoaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyk6IExpa2V3aXNlLgotCi1Nb24gTWF5ICA2IDE4OjI0OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcmVsb2MxNi5jIChiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSk6IEhhbmRsZSBjb21tb24KLQlzeW1ib2xzIGNvcnJlY3RseS4KLQotU2F0IE1heSAgNCAwNTowODo0NSAxOTk2ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGVsZmNvZGUuaCAoZWxmX29iamVjdF9wKTogIFJlamVjdCBnZW5lcmljIEVMRiB0YXJnZXQgaWYKLQllX21hY2hpbmUgbWF0Y2hlcyBhbiBhbHRlcm5hdGUgbWFjaGluZSBjb2RlIGluIGEgc3BlY2lmaWMgYmFja2VuZC4KLQotCSogbmV0YnNkLWNvcmUuYyAobmV0YnNkX2NvcmVfdmVjKTogIFJlbW92ZSBpbml0aWFsaXplciBmb3IKLQlvYnNvbGV0ZSBhbGlnbl9wb3dlcl9taW4gZmllbGQuCi0KLUZyaSBNYXkgIDMgMTM6MDc6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb2ZmLWg4MzAwLmMgKHJlbG9jX2hvd3RvX3R5cGUpOiBBZGQgaG93dG8gZW50cnkgZm9yCi0JUl9QQ1JXT1JEX0IuCi0JKHJ0eXBlMmhvd3RvKTogSGFuZGxlIFJfUENSV09SRF9CLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzKTogSGFuZGxlIFJfUENSV09SRF9CLgotCShoODMwMF9yZWxvY18xNl9lc3RpbWF0ZSk6IExpa2V3aXNlLiAgVHJ5IHRvIHR1cm4gYSAxNmJpdAotCXBjLXJlbGF0aXZlIGJyYW5jaCAoUl9QQ1JXT1JEKSBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUKLQlicmFuY2ggKFJfUENXT1JEX0IpLgotCi1GcmkgTWF5ICAzIDEwOjQ3OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAodHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyk6IFNldCB0aGUgc2VjdGlvbiBmb3IKLQlCU0ZfQ09OU1RSVUNUT1Igc3ltYm9scy4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ29ycmVjdCBzZXR0aW5nIG9mCi0JbGFzdF9iZl9pbmRleC4KLQotV2VkIE1heSAgMSAxODozOTozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6IEluIGNvbWRhdCBzZWN0aW9uIGxvb2t1cCwKLQlzdG9wIGxvb2tpbmcgd2hlbiBzZWN0aW9uIGlzIGZvdW5kLgotCi1XZWQgTWF5ICAxIDE0OjE3OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZmNvZGUuaCAoU1RSSU5HX1NJWkVfU0laRSk6IERlZmluZS4KLQkoc3R5cF90b19zZWNfZmxhZ3MpOiBIYW5kbGUgbG9uZyBzeW1ib2wgbmFtZXMgd2hlbiBsb29raW5nIGZvciB0aGUKLQlzZWN0aW9uIHN5bWJvbC4KLQkoYmZkX2NvZmZfYmFja2VuZF9kYXRhKTogQWRkIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgZmllbGQuCi0JKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyk6IERlZmluZS4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBIYW5kbGUgbG9uZyBzZWN0aW9uIG5hbWVzLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmdlbi5jIChtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUpOiBIYW5kbGUgbG9uZyBzZWN0aW9uCi0JbmFtZXMuCi0JKGNvZmZfd3JpdGVfc3ltYm9scyk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBwZS1hcm0uYyAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0JKiBwZWktYXJtLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGUtaTM4Ni5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQkqIHBlaS1pMzg2LmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGUtcHBjLmMgKENPRkZfTE9OR19TRUNUSU9OX05BTUVTKTogRGVmaW5lLgotCSogcGVpLXBwYy5jIChDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyk6IERlZmluZS4KLQotCSogYm91dC5jIChiX291dF9jYWxsYmFjayk6IFNldCBsbWEgb2Ygc2VjdGlvbnMuCi0JKGJfb3V0X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBSZW5hbWUgaW5fYWJmZAotCXBhcmFtZXRlciB0byBvdXRwdXRfYmZkLiAgVXNlZCBpbnB1dF9iZmQgaW5zdGVhZCBvZiBvdXRwdXRfYmZkIGluCi0Jc2V2ZXJhbCBwbGFjZXMuCi0KLVR1ZSBBcHIgMzAgMTc6NTY6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oICh0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKTogRG9uJ3QgY3JlYXRlCi0JU0VDX0NPTlNUUlVDVE9SIHNlY3Rpb25zLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X3N5bWJvbF9pbmZvKTogTGlrZXdpc2UuCi0KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhKTogQ29weSBlbGZfZ3AuCi0JRnJvbSBEb24gQm93bWFuIDxib3dtYW5Ad2F0ZXJsb28uaHAuY29tPi4KLQotVHVlIEFwciAzMCAxNzowNjozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFybS5jIChhcm1jb2ZmX2xpdHRsZV92ZWMpOiBJZiBDT0ZGX1dJVEhfUEUgaXMgZGVmaW5lZCwgYWRkCi0JU0VDX0xJTktfT05DRSBhbmQgU0VDX0xJTktfRFVQTElDQVRFUyB0byBzZWN0aW9uX2ZsYWdzLgotCi1Nb24gQXByIDI5IDEzOjE1OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmMzItbWlwcy5jIChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5KTogQWRkCi0JbWlwc18zMl9yZWxvY3MgZmllbGQuCi0JKG1pcHNfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBtaXBzXzMyX3JlbG9jcyBmaWVsZC4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENvcHkgUl9NSVBTX1JFTDMyIGFuZCBSX01JUFNfMzIKLQlyZWxvY3MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyCi0JZmlsZS4KLQkobWlwc19lbGZfY2hlY2tfcmVsb2NzKTogRm9yIGEgUl9NSVBTX1JFTDMyIG9yIFJfTUlQU18zMiByZWxvYwotCWFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBpbmNyZW1lbnQgbWlwc18zMl9yZWxvY3MuCi0JKG1pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIG1pcHNfMzJfcmVsb2NzIGlzIHNldCwgYW5kCi0JdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgbWFrZSByb29tIGluIHRoZQotCS5yZWwuZHluIHNlY3Rpb24uCi0KLUZyaSBBcHIgMjYgMTg6MDA6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpOiBUcmFjayB0aGUgcmVhbAotCWZpbGUgcG9zaXRpb24gYW5kIHRoZSB2aXJ0dWFsIGZpbGUgcG9zaXRpb24gc2VwYXJhdGVseS4gIFNldAotCWZpbGVwb3MgaW5mb3JtYXRpb24gYnNhZWQgb24gdGhlIHJlYWwgZmlsZSBwb3NpdGlvbi4KLQkoX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEhhbmRsZSAubGliIHNlY3Rpb25zIGxpa2UgdGhlCi0JSmFuIDIzIGNoYW5nZSB0byBjb2ZmY29kZS5oLgotCi0JKiBzb20uYyAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCB0aGUgc3ltYm9sIGNvdW50IHRvIHRoZQotCW51bWJlciBvZiBCRkQgc3ltYm9scyBjcmVhdGVkLgotCi1GcmkgQXByIDI2IDEyOjM0OjI5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfY2hlY2tfcmVsb2NzKTogRm9yd2FyZCByZWxvY2F0aW9ucyB0byB0aGUKLQlvdXRwdXQgZmlsZSBpZiBsaW5raW5nIHNoYXJlZCBvYmplY3RzLiAgTG9vcCB0byBjaGVjayBhbGwgcmVsb2NzLAotCXJhdGhlciB0aGFuIHJldHVybmluZyBmYWxzZSBvbiBmaXJzdCBlcnJvci4KLQotVGh1IEFwciAyNSAxMzoyNToxMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IEFkZCBQTFQgY2FzZS4KLQkocHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyk6IElmIC5pbnRlcnAgc2VjdGlvbiwgYnVtcCAjCi0Jb2YgcHJvZ3JhbSBoZWFkZXJzIGJ5IDEuCi0JKHBwY19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKTogRmxlc2ggb3V0IHN1cHBvcnQuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIHN1cHBvcnQgZm9yIC5wbHQgc2VjdGlvbi4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBQcmludCBvdXQgZmlsZW5hbWUgaW4gZGVidWcgY29kZS4gIEVuYWJsZQotCVBMVCBzdXBwb3J0LgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IEFkZCBzdXBwb3J0IGZvciBQTFQncywgYmVlZiB1cAotCWRlYnVnIG91dHB1dC4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgdGhlIG91dHB1dCBzZWN0aW9uIGlzbid0IGRlZmluZWQsCi0JZG9uJ3QgYWJvcnQsIGp1c3QgZ2l2ZSBhbiBlcnJvciBtZXNzYWdlLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKTogSWYgdGhlIHNlY3Rpb24KLQliZWluZyBjcmVhdGVkIGlzIC5zZGF0YSBvciAuc2RhdGEyLCBkb24ndCBtYWtlIHRoZSBzeW1ib2wgZHluYW1pYy4KLQotV2VkIEFwciAyNCAxNDowNDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jIChfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzKTogTG9vayB0aHJvdWdoIHRoZQotCW1lbWJlcnMgb2YgYW4gYXJjaGl2ZSBmb3IgZHluYW1pYyBvYmplY3RzIHdpdGggbm8gc3ltYm9scywgYW5kCi0JcGFzcyB0aGVtIGRpcmVjdGx5IHRvIGNoZWNrX2FyY2hpdmVfZWxlbWVudC4KLQkoeGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzKTogUGFzcyBkeW5hbWljIG9iamVjdHMgdG8KLQl4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scy4KLQkoeGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb2ZmLXJzNjAwMC5jIChyczYwMDBjb2ZmX3ZlYyk6IENoYW5nZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDCi0JZnJvbSBfYmZkX25vZHluYW1pYyB0byBfYmZkX3hjb2ZmLgotCSogbGliY29mZi1pbi5oIChfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCk6Ci0JRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpOiBEZWNsYXJlLgotCShfYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogRGVjbGFyZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IERlY2xhcmUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfc3dhcF9sZHJlbF9pbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoX2JmZF94Y29mZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKTogTmV3IGZ1bmN0aW9uLgotCSh4Y29mZl9keW5hbWljX3JlbG9jKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyk6IE5ldyBmdW5jdGlvbi4KLQkoeGNvZmZfbGlua19hZGRfZHluYW1pY19zeW1ib2xzKTogVXNlIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzLgotCi1UdWUgQXByIDIzIDEyOjQ4OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1zcGFyYy5jIChiZmRfY29mZl9nZW5lcmljX3JlbG9jKTogUmV0dXJuIGJmZF9yZWxvY19vayBldmVuCi0JaWYgcmVsb2NfZW50cnktPmFkZGVuZCBpcyBub3QgMC4KLQkoQ0FMQ19BRERFTkQpOiBKdXN0IHNldCB0aGUgYWRkZW5kIHRvIHJlbG9jLnJfb2Zmc2V0LgotCi1Nb24gQXByIDIyIDE4OjI5OjAxIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogRml4IHNwZWxsaW5nIG9mCi0JUl9TUEFSQ19HTE9CX0pNUC4KLQkqIGVsZjY0LXNwYXJjLmMgKHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlKTogTGlrZXdpc2UuCi0JQWRkIGVudHJpZXMgZm9yIFJfU1BBUkNfWzU2XS4KLQkoc3BhcmNfcmVsb2NfbWFwKTogQWRkIGVudHJpZXMgZm9yIFJfU1BBUkNfWzU2XS4KLQotTW9uIEFwciAyMiAxNTowNzoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlPcHRpbWl6ZSBsaW5raW5nIG9mIHN0YWJzIGluIHNlY3Rpb25zIGFzIHVzZWQgaW4gRUxGIGFuZCBDT0ZGLgotCSogc3RhYnMuYzogTmV3IGZpbGUuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMpOiBEZWNsYXJlLgotCShfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMpOiBEZWNsYXJlLgotCShfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBzdGFiX2luZm8gZmllbGQuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQpOiBJbml0aWFsaXplCi0Jc3RhYl9pbmZvIGZpZWxkLgotCShjb2ZmX2xpbmtfYWRkX3N5bWJvbHMpOiBDYWxsIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzIGlmCi0JYXBwcm9wcmlhdGUuCi0JKF9iZmRfY29mZl9maW5hbF9saW5rKTogV3JpdGUgb3V0IHN0YWIgc3RyaW5ncyBoYXNoIHRhYmxlLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgb3B0aW1pemVkIHN0YWJzIHNlY3Rpb25zLgotCSogY29mZi1wcGMuYyAocHBjX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBXcml0ZSBvdXQgc3RhYiBzdHJpbmdzCi0JaGFzaCB0YWJsZS4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgotCShzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpOiBBZGQgc3RhYl9pbmZvIGZpZWxkLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBzdGFiX2luZm8KLQlmaWVsZC4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogSWYgYXBwcm9wcmlhdGUsIGNhbGwKLQlfYmZkX2xpbmtfc2VjdGlvbl9zdGFicy4KLQkoZWxmX2JmZF9maW5hbF9saW5rKTogV3JpdGUgb3V0IHN0YWIgc3RyaW5ncyBoYXNoIHRhYmxlLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBIYW5kbGUgb3B0aW1pemVkIHN0YWJzIHNlY3Rpb25zLgotCSogcmVsb2MuYyAoX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlKTogQ2hlY2sgYWRkcmVzcyBhZ2FpbnN0Ci0JX3Jhd19zaXplIHJhdGhlciB0aGFuIF9jb29rZWRfc2l6ZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQkZEX0xJQlMpOiBBZGQgc3RhYnMubwotCShCRkRfTElCU19DRklMRVMpOiBBZGQgc3RhYnMuYy4KLQotCSogVkVSU0lPTjogSW5jcmVtZW50IGZvciBiZmRsaW5rLmggY2hhbmdlLgotCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcmVudW1iZXJfc3ltYm9scyk6IENvcnJlY3QgaGFuZGxpbmcgb2YKLQlCU0ZfTk9UX0FUX0VORCBjb21tb24gc3ltYm9scy4KLQotRnJpIEFwciAxOSAxOToyMTo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtcHBjLmMgKHJlY29yZF90b2MpOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCShwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IFJlbW92ZSBBTlNJIEMgc3RyaW5nIGNvbmNhdGVuYXRpb24uCi0JKHBwY19jb2ZmX3JlbG9jX3R5cGVfbG9va3VwKTogUmVtb3ZlIHVucmVhY2hlZCBjb2RlLgotCSogY29mZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBEb24ndCB0YWtlIHRoZSBhZGRyZXNzCi0Jb2YgYW4gYXJyYXkuCi0JKiBwZWljb2RlLmggKHBlX3ByaW50X2lkYXRhKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmcuCi0JKHBlX3ByaW50X2VkYXRhKTogTGlrZXdpc2UuCi0JKHBlX3ByaW50X3JlbG9jKTogUmVtb3ZlIEFOU0kgQyBzdHJpbmcgY29uY2F0ZW5hdGlvbi4KLQotVGh1IEFwciAxOCAxODo1MToxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvKTogQWRkIGxhc3RfYmZfaW5kZXgKLQlhbmQgbGFzdF9iZiBmaWVsZHMuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0JKiBjb2Zmc3dhcC5oIChjb2ZmX3N3YXBfYXV4X2luKTogU3dhcCBlbmRuZHggZmllbGQgZm9yIENfRkNOCi0Jc3ltYm9scy4KLQkoY29mZl9zd2FwX2F1eF9vdXQpOiBMaWtld2lzZS4KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IExpa2V3aXNlLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IExpa2V3aXNlLgotCSogY29mZmdlbi5jIChjb2ZmX3BvaW50ZXJpemVfYXV4KTogQ2hlY2sgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTgotCXN5bWJvbHMuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfZmluYWxfbGluayk6IEluaXRpYWxpemUgbGFzdF9iZl9pbmRleAotCWZpZWxkLgotCShfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBDaGVjayBlbmRuZHggZmllbGQgZm9yIENfRkNOIHN5bWJvbHMuCi0JRml4IHVwIC5iZiBlbmRuZHggbGluayBmaWVsZHMuCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IEluaXRpYWxpemUgbGFzdF9iZl9pbmRleAotCWZpZWxkLgotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZW5kbmR4IGZpZWxkIGZvciBDX0ZDTgotCXN5bWJvbHMuCi0KLVdlZCBBcHIgMTcgMTI6MDg6MjQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwZXssaX0tcHBjLmMgKFBQQ19QRSk6IERlZmluZSBpbnN0ZWFkIG9mIFBQQywgc28gdGhhdCBjb21waWxpbmcKLQlvbiBTb2xhcmlzIFBvd2VyUEMgc3lzdGVtcyBkb2Vzbid0IGdldCBjb25mdXNlZC4KLQotCSogY2NmZmNvZGUuaCAoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgI2lmZGVmIFBQQ19QRSwgbm90Ci0JI2lmZGVmIFBQQy4KLQotCSogZWxmY29yZS5oIChiZmRfcHJzdGF0dXMsIGJmZF9mcHJlZ3NldCk6IEFkZCB0aHJlYWQgYXJndW1lbnQuCi0JKGVsZl9jb3JlZmlsZV9ub3RlKTogSWYgSEFWRV9TWVNfUFJPQ0ZTX0ggaXMgbm90IGRlZmluZWQsIGRvbid0Ci0JdXBkYXRlIGRpZF9yZWcgYW5kIGRpZF9yZWcyLgotCi1XZWQgQXByIDE3IDEzOjA3OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogeGNvZmZsaW5rLmMgKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogQ2hlY2sgZm9yIFRPQyBvdmVyZmxvdy4KLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sKTogV2hlbiBjYWxsaW5nIHRoZQotCWNhbGxiYWNrIHJvdXRpbmVzLCBwYXNzIGgtPnJvb3Quc3RyaW5nIHJhdGhlciB0aGFuIG5hbWUsIGluIGNhc2UKLQljb3B5IGlzIHRydWUgYW5kIG5hbWUgaXMgdHJhbnNpZW50LgotCi1UdWUgQXByIDE2IDE2OjM2OjM4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogZWxmY29yZS5oOiAgQWRkIHN1cHBvcnQgZm9yIGNvcmUgZmlsZXMgd2l0aCBtdWx0aXBsZSB0aHJlYWRzLgotCShQcmltYXJpbHkgZm9yIFNvbGFyaXMuKQotCi1UdWUgQXByIDE2IDEzOjQ0OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYW91dHguaCAoTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSk6IERvbid0IGRvIGFueXRoaW5nIGlmCi0Jc2VjdGlvbi0+b3JlbG9jYXRpb24gaXMgTlVMTC4KLQotCSogY29mZmdlbi5jIChiZmRfY29mZl9nZXRfc3ltZW50KTogTmV3IGZ1bmN0aW9uLgotCShiZmRfY29mZl9nZXRfYXV4ZW50KTogTmV3IGZ1bmN0aW9uLgotCSogYmZkLWluLmggKGJmZF9jb2ZmX2dldF9zeW1lbnQpOiBEZWNsYXJlLgotCShiZmRfY29mZl9nZXRfYXV4ZW50KTogRGVjbGFyZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQotTW9uIEFwciAxNSAxOTowNjo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLW1pcHMuYyAoc3RydWN0IG1pcHNfaGkxNik6IERlZmluZS4KLQkobWlwc19oaTE2X2FkZHIsIG1pcHNfaGkxNl9hZGRlbmQpOiBSZW1vdmUuCi0JKG1pcHNfaGkxNl9saXN0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc19lbGZfaGkxNl9yZWxvYyk6IE1haW50YWluIGEgbGlzdCBvZiB1bm1hdGNoZWQgSEkxNiByZWxvY3MuCi0JKG1pcHNfZWxmX2xvMTZfcmVsb2MpOiBQcm9jZXNzIG1pcHNfaGkxNl9saXN0LgotCShtaXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogUGVybWl0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNgotCXJlbG9jcyBiZWZvcmUgdGhlIGFzc29jaWF0ZWQgTE8xNiByZWxvYy4KLQotV2VkIEFwciAxMCAwMDoyMzo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHZlcnNhZG9zLmMgKHZlcnNhZG9zX3NjYW4pOiBDaGVjayBiZmRfYWxsb2MgcmV0dXJuIHZhbHVlLgotCSh2ZXJzYWRvc19vYmplY3RfcCk6IENoZWNrIGFsbCBiZmRfcmVhZCByZXR1cm4gdmFsdWVzLiAgUmVxdWlyZQotCXRoYXQgbGFuZyBmaWVsZCBiZSBsZXNzIHRoYW4gMTAsIHRvIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIEludGVsIEhleAotCWZpbGVzLgotCi0JKiBsaWJhb3V0LmggKFdSSVRFX0hFQURFUlMpOiBXcml0ZSBvdXQgdGhlIHJlbG9jcyBldmVuIGlmIHRoZXJlCi0JYXJlbid0IGFueSBzeW1ib2xzLgotCSogYW91dHguaCAoTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkpOiBTZXQgcl9pbmRleCB0byBOX0FCUywKLQlub3QgMCwgZm9yIGFuIGFic29sdXRlIHN5bWJvbC4KLQkoTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkpOiBMaWtld2lzZS4KLQotCSogaWhleC5jIChpaGV4X3NjYW4pOiBBY2NlcHQgYSBsZW5ndGggb2YgNCBmb3IgcmVjb3JkIHR5cGUgNS4KLQkoaWhleF93cml0ZV9vYmplY3RfY29udGVudHMpOiBGb3IgYSBsYXJnZSBzdGFydCBhZGRyZXNzLCBvdXRwdXQKLQl0aGUgZnVsbCAzMiBiaXQgYWRkcmVzcyBpbiByZWNvcmQgdHlwZSA1LgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfYnl0ZSk6IENoYW5nZSBzZWNvbmQgcGFyYW1ldGVyIGZyb20gYmZkX2J5dGUKLQl0byBpbnQgdG8gYXZvaWQgcHJvbW90aW9uIHByb2JsZW1zIGluIHByb3RvdHlwZS4KLQotVHVlIEFwciAgOSAxMTo0NDoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgJHtzcmNkaXJ9IHdoZW4gbG9va2luZyBmb3IgcGljZnJhZy4KLQotCSogY29uZmlndXJlLmhvc3Q6IFN3aXRjaCBvbiAke2xpYmRpcn0sIG5vdCAkKGxpYmRpcikuICBGcm9tCi0JYWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXUgKEFsYW4gTW9kcmEpLgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfYWRkX3N5bWJvbHMpOiBBbHdheXMgY2FsbCBhZGRfZHluYW1pY19zeW1ib2xzCi0JZW50cnkgcG9pbnQsIG5vdCBqdXN0IGZvciBEWU5BTUlDIG9iamVjdHMuCi0JKiBzdW5vcy5jIChzdW5vc19hZGRfZHluYW1pY19zeW1ib2xzKTogQWx3YXlzIGNhbGwKLQlzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gIElmIGNhbGxlZCB3aXRoIGEgbm9uIERZTkFNSUMKLQlvYmplY3QsIGRvbid0IGRvIGFueXRoaW5nIGVsc2UuCi0JKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogRG9uJ3QgY2FsbCBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4KLQotTW9uIEFwciAgOCAxMjowOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUGVybWl0IC0tZW5hYmxlLXNoYXJlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZgotCWRpcmVjdG9yaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhMREZMQUdTIGFuZCBTSExJQl9DRkxBR1MgZm9yICotZGVjLW9zZioKLQlob3N0IHdoZW4gY29uZmlndXJpbmcgd2l0aCAtLWVuYWJsZS1zaGFyZC4KLQotRnJpIEFwciAgNSAxMjoyNDoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy5iZmQ6IEFkZCBpWzM0NV04Ni0qLWZyZWVic2RlbGYqIHRhcmdldDsgZnJvbSBKb2huIFBvbHN0cmEKLQk8amRwQHBvbHN0cmEuY29tPi4KLQotCSogbGlua2VyLmMgKGxpbmtfYWN0aW9uKTogRm9yIFdBUk5fUk9XL3dhcm4sIHVzZSBNV0FSTiwgbm90IENZQ0xFLAotCXRvIGF2b2lkIGNyYXNoaW5nIGluIGJmZF9oYXNoX3JlcGxhY2UuCi0KLQkqIHN5c2RlcC5oOiBVc2UgI2lmZGVmLCBub3QgI2lmLgotCi1UaHUgQXByICA0IDIzOjMyOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCi1UaHUgQXByICA0IDE4OjQ5OjA5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc29ueS1ic2QqKTogRml4IHR5cG8gaW4gQUNfREVGSU5FLgotCShBQ19DSEVDS19IRUFERVJTKTogQ2hlY2sgZm9yIHN5cy90aW1lLmgKLQkoQUNfSEVBREVSX1RJTUUpOiBBZGQgbWFjcm8uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBzeXNkZXAuaDogVXNlIFRJTUVfV0lUSF9TWVNfVElNRSBhbmQgSEFWRV9TWVNfVElNRV9ICi0JdG8gY29udHJvbCB3aGF0IGNvbWJpbmF0aW9uIG9mIDx0aW1lPiBhbmQgPHN5cy90aW1lLmg+Ci0JZ2V0IGluY2x1ZGVkLgotCi1UdWUgQXByICAyIDEzOjExOjUzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGFvdXRmMS5oIChzdW5vc18zMl9zZXRfYXJjaF9tYWNoKTogSGFuZGxlIE1fU1BBUkNMRVQuCi0JKGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cyk6IExpa2V3aXNlLgotCSogYW91dHguaCAoTkFNRShhb3V0LG1hY2hpbmVfdHlwZSkpOiBIYW5kbGUKLQliZmRfbWFjaF9zcGFyY197c3BhcmNsZXQsc3BhcmNsaXRlfS4KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NwYXJjX3tzcGFyY2xldCxzcGFyY2xpdGV9KTogRGVmaW5lLgotCShiZmRfbWFjaF9zcGFyY192OV9wKTogVXBkYXRlLgotCSogY3B1LXNwYXJjLmMgKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgZW50cmllcyBmb3Igc3BhcmNsZXQsc3BhcmNsaXRlLgotCSogbGliYW91dC5oIChlbnVtIG1hY2hpbmVfdHlwZSk6IEFkZCBNX1NQQVJDTEVULgotCSogc3Vub3MuYyAoTUFDSFRZUEVfT0spOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgQXByICAyIDAwOjMzOjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSk6IEFkZCBoZ290IGZpZWxkLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0KTogSW5pdGlhbGl6ZSBoZ290IGZpZWxkLgotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBTdG9yZSB0aGUKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUgaGdvdCBmaWVsZC4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyk6IElmIHRoZSBzaXplIG9mIHRoZQotCWdsb2JhbCBvZmZzZXQgdGFibGUgZ29lcyBvdmVyIDB4MTAwMCwgc2V0IHRoZSB2YWx1ZSBvZgotCV9HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byAweDEwMDAgaW50byB0aGUgc2VjdGlvbi4KLQkoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IFN1YnRyYWN0IHRoZSBvZmZzZXQgb2YKLQlfR0xPQkFMX09GRlNFVF9UQUJMRV8gd2hlbiBoYW5kbGluZyBHT1QgcmVsb2NhdGlvbnMuCi0KLQkqIGVsZmNvZGUuaDogRG9uJ3QgaW5jbHVkZSA8c3RyaW5nLmg+LgotCi1Nb24gQXByICAxIDEwOjM5OjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGlua2VyLmMgKF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IFJlbmFtZWQgZnJvbQotCWdlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMuICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCSogZ2VubGluay5oIChfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpOiBEZWNsYXJhdGlvbgotCW1vdmVkIGhlcmUgZnJvbSBsaWJiZmQtaW4uaC4KLQkqIGxpYmJmZC1pbi5oOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBsaWJiZmQuaDogUmVnZW5lcmF0ZWQuCi0KLU1vbiBBcHIgIDEgMTI6MzU6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBXaGVuIHJlcG9ydGluZyBhbgotCW92ZXJmbG93IGVycm9yLCB1c2UgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBpbiB0aGUgaGFzaCB0YWJsZSBpZgotCWF2YWlsYWJsZS4KLQkoYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0KTogTGlrZXdpc2UuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgY29tbW9uIHN5bWJvbCBnb3QKLQlkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBzZXQgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUi4KLQotU3VuIE1hciAzMSAwMTo1ODo0MSAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBwZWljb2RlLmggKGNvZmZfc3dhcF9hb3V0aGRyX291dCk6IERlbGV0ZSB0ZXN0IGZvciAuanVuay4KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogTGlrZXdpc2UuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMjkgMTI6NDQ6MzYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKFNFQ19MSU5LX09OQ0UpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVMpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRCk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWSk6IERlZmluZS4KLQkoU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUpOiBEZWZpbmUuCi0JKFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUyk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNvZmZjb2RlLmggKHNlY190b19zdHlwX2ZsYWdzKTogSWYgQ09GRl9XSVRIX1BFLCB0dXJuCi0JU0VDX0xJTktfT05DRSBpbnRvIElNQUdFX1NDTl9MTktfQ09NREFULgotCShzdHlwX3RvX3NlY19mbGFncyk6IElmIENPRkZfV0lUSF9QRSwgdHVybiBJTUFHRV9TQ05fTE5LX1JFTU9WRQotCWludG8gU0VDX0VYQ0xVREUuICBJZiBJTUFHRV9TQ05fTE5LX0NPTURBVCBpcyBzZXQsIHNldAotCVNFQ19MSU5LX09OQ0UsIGFuZCBsb29rIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlIHNldHRpbmcKLQlmb3IgU0VDX0xJTktfRFVQTElDQVRFUy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBJZiBDT0ZGX1dJVEhfUEUsIGlmIFNFQ19MSU5LX09OQ0UgaXMKLQlzZXQgZm9yIGEgc2VjdGlvbiwgZmluZCB0aGUgc2VjdGlvbiBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSwKLQlhbmQgc2V0IHRoZSBhdXggZW50cnkgYmFzZWQgb24gU0VDX0xJTktfRFVQTElDQVRFUy4KLQkqIGNvZmZnZW4uYyAoY29mZl9wcmludF9zeW1ib2wpOiBBZGQgYSBzcGFjZSBiZWZvcmUgImNoZWNrc3VtIi4KLQkqIGNvZmYtYXJtLmMgKGFybWNvZmZfYmlnX3ZlYyk6IElmIENPRkZfV0lUSF9QRSBpcyBkZWZpbmVkLCBhZGQKLQlTRUNfTElOS19PTkNFIGFuZCBTRUNfTElOS19EVVBMSUNBVEVTIHRvIHNlY3Rpb25fZmxhZ3MuCi0JKiBjb2ZmLWkzODYuYyAoaTM4NmNvZmZfdmVjKTogTGlrZXdpc2UuCi0JKiBjb2ZmLXBwYy5jIChUQVJHRVRfTElUVExFX1NZTSwgVEFSR0VUX0JJR19TWU0pOiBMaWtld2lzZS4KLQotCSogVkVSU0lPTjogQnVtcCB0byAyLjYuMS4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1oKTogRGVwZW5kIHVwb24gVkVSU0lPTi4KLQotVGh1IE1hciAyOCAyMzo0ODo0OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmJmZC1pbi5oIChnZW5lcmljX2xpbmtfaGFzaF9uZXdmdW5jKTogQWRkIGRlY2xhcmF0aW9uLgotCSogbGliYmZkLmg6IFJlYnVpbHQuCi0JKiBsaW5rZXIuYyAoZ2VuZXJpY19saW5rX2hhc2hfbmV3ZnVuYyk6IE5vIGxvbmdlciBzdGF0aWMuCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2JmZF9saW5rX2hhc2hfY3JlYXRlKTogQWxsb3cgc3BlY2lmaWMgdGFyZ2V0cwotCXRvIG92ZXJyaWRlLgotCSogY29mZi1oODMwMC5jOiBBZGQgdHdvIGRlcml2ZWQgaGFzaCB0YWJsZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQKLQlmdW50aW9ucyBhbmQgI2RlZmluZXMgZm9yIHVzZSBieSB0aGUgaDgzMDAgbGlua2VyLgotCShoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzLCBjYXNlIFJfTUVNX0lORElSRUNUKTogQ3JlYXRlIGVudHJpZXMgaW4KLQl0aGUgZnVuY3Rpb24gdmVjdG9yIGFzIG5lZWRlZC4gIFBsYWNlIHRoZSBhZGRyZXNzIG9mIHRoZSBmdW5jdGlvbgotCXZlY3RvciBlbnRyeSBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IHRoZSBSX01FTV9JTkRJUkVDVCByZWxvYy4KLQlSZXdyaXRlIHRoZSB2ZWN0b3JzIHNlY3Rpb24gY29udGVudHMgYXMgbmVjZXNzYXJ5LgotCShoODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiBmb3IgdGhlIGg4MzAwIGxpbmtlci4KLQkoY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyk6IERlZmluZSB0byB1c2UgaDgzMDAgc3BlY2lmaWMgdmVyc2lvbi4KLQkoY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk6IExpa2V3aXNlLgotCi1UaHUgTWFyIDI4IDE3OjQ0OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliaHBwYS5oOiBJZiBnY2MgMi43IG9yIGhpZ2hlciwgZGVjbGFyZSBhbGwgdGhlIGZ1bmN0aW9ucyB3aXRoCi0JX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKSBzbyB0aGF0IC1XYWxsIGRvZXNuJ3Qgd2FybiBhYm91dAotCXRoZW0uCi0JKGhwcGFfcmVidWlsZF9pbnNuKTogUGFzcyBwb2ludGVyIHRvIGNvcnJlY3QgdHlwZSB0bwotCWxvd19zaWduX3VuZXh0IGFuZCBkaXNfYXNzZW1ibGVfMjEuCi0KLVRodSBNYXIgMjggMTE6MDA6MzYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmJmZCAoc3BhcmM2NC17c3lzdjQqLHNvbGFyaXMyKn0pOiBEZWxldGUuCi0JU3RpY2sgd2l0aCBzcGFyYy0qLXtzeXN2NCosc29sYXJpczIqfS4KLQotV2VkIE1hciAyNyAxMDo0MzozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX2F1eF9pbik6IFN3YXAgaW4gZXh0cmEgUEUgeF9zY24gZmllbGRzLgotCShjb2ZmX3N3YXBfYXV4X291dCk6IFN3YXAgb3V0IGV4dHJhIFBFIHhfc2NuIGZpZWxkcy4KLQkqIGNvZmZzd2FwLmggKGNvZmZfc3dhcF9hdXhfaW4pOiBaZXJvIG91dCBleHRyYSBQRSB4X3NjbiBmaWVsZHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfcHJpbnRfc3ltYm9sKTogSWYgYW55IG9mIHRoZSBleHRyYSBQRSB4X3NjbgotCWZpZWxkcyBpcyBub24temVybywgcHJpbnQgdGhlbS4KLQotCSogY29mZi1wcGMuYyAocHBjX3JlY29yZF90b2NfZW50cnkpOiBQdXQgaW5zaWRlIENPRkZfSU1BR0VfV0lUSF9QRQotCWlmZGVmLiAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKHBwY19yZWNvcmRfZGF0YV9pbl90b2NfZW50cnkpOiBJZmRlZiBvdXQuICBSZW1vdmVkIHVudXNlZAotCXZhcmlhYmxlcy4KLQkocHBjX21hcmtfc3ltYm9sX2FzX2dsdWUpOiBQdXQgaW5zaWRlIENPRkZfSU1BR0VfV0lUSF9QRSBpZmRlZi4KLQkoZ2V0X3N5bWJvbF92YWx1ZSk6IElmZGVmIG91dC4KLQkocGVfcHBjX3JlbG9jKTogSWZkZWYgb3V0LiAgUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4gIE1ha2UKLQlmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzIGNvcnJlc3BvbmQuICBQdXQgYmVmb3JlX2FkZHIgaW4KLQlERUJVR19SRUxPQyBpZmRlZi4KLQkoZHVtcF90b2MpOiBNYWtlIGZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMgY29ycmVzcG9uZC4KLQkocHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4gIEFsd2F5cwotCXJldHVybiBhIHZhbHVlLgotCShwcGNfcmVmbG9fcmVsb2MpOiBJZmRlZiBvdXQuCi0JKHBwY19hZGRyMzJuYl9yZWxvYyk6IElmZGVmIG91dC4KLQkocHBjX2NvZmZfcnR5cGUyaG93dG8pOiBNYWtlIGZwcmludGYgc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMKLQljb3JyZXNwb25kLgotCShjb2ZmX3BwY19ydHlwZV90b19ob3d0byk6IExpa2V3aXNlLgotCShwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0KLQkqIHBlaWNvZGUuaCAocGVfcHJpbnRfaWRhdGEpOiBNb3ZlIG90aGVyd2lzZSB1bnVzZWQgdmFyaWFibGVzIGludG8KLQl0aGUgI2lmZGVmIHdoZXJlIHRoZXkgYXJlIHVzZWQuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0JKHBlX3ByaW50X2VkYXRhKTogTWFrZSBmcHJpbnRmIHN0cmluZ3MgYW5kIGFyZ3VtZW50IHR5cGVzCi0JY29ycmVzcG9uZC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkocGVfcHJpbnRfcGRhdGEpOiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBhZGRyX3ZhbHVlLiAgQWx3YXlzCi0JcmV0dXJuIGEgdmFsdWUuCi0JKHBlX3ByaW50X3JlbG9jKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBvbmFsaW5lLiAgTWFrZSBmcHJpbnRmCi0Jc3RyaW5ncyBhbmQgYXJndW1lbnQgdHlwZXMgY29ycmVzcG9uZC4gIEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZmFrZV9zZWN0aW9ucyk6IFJldHVybiB0cnVlLgotCShwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbCk6IE1vdmUgZGVmaW5pdGlvbiBvZiB1bnVzZWQKLQl2YXJpYWJsZSByZWxhIGluc2lkZSAjaWYgMCBzZWN0aW9uIHdoZXJlIGl0IGlzIHVzZWQuCi0KLQkqIG5zMzJrLmg6IE5ldyBmaWxlLgotCSogY3B1LW5zMzJrLmg6IEluY2x1ZGUgbnMzMmsuaC4gIFJlbmFtZSBleHRlcm5hbGx5IHZpc2libGUKLQlmdW5jdGlvbnMgdG8gc3RhcnQgd2l0aCBfYmZkXy4KLQkqIGFvdXQtbnMzMmsuYzogSW5jbHVkZSBuczMyay5oLiAgQ2hhbmdlIHJlZmVyZW5jZXMgdG8gcmVuYW1lZAotCWZ1bmN0aW9ucyBpbiBjcHUtbnMzMmsuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoSEZJTEVTKTogQWRkIG5zMzJrLmguCi0KLQkqIHNlY3Rpb24uYyAoc3RydWN0IHNlYyk6IEFkZCBsaW5rZXJfbWFyayBmaWVsZC4gIENoYW5nZQotCXVzZXJfc2V0X3ZtYSBhbmQgcmVsb2NfZG9uZSB0byBiZSBzaW5nbGUgYml0IGZpZWxkcy4KLQkoU1REX1NFQ1RJT04pOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZmluYWxfbGluaykpOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuCi0JKGFvdXRfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuCi0JKF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCk6IERvbid0IGxpbmsgdW5tYXJrZWQgc2VjdGlvbnMuCi0JKiBjb2ZmLXBwYy5jIChwcGNfYmZkX2NvZmZfZmluYWxfbGluayk6IE1hcmsgc2VjdGlvbnMgaW5jbHVkZWQgaW4KLQl0aGUgbGluay4KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogTWFyayBzZWN0aW9ucyBpbmNsdWRlZCBpbiB0aGUKLQlsaW5rLgotCShlbGZfbGlua19pbnB1dF9iZmQpOiBEb24ndCBsaW5rIHVubWFya2VkIHNlY3Rpb25zLgotCSogeGNvZmZsaW5rLmMgKF9iZmRfeGNvZmZfYmZkX2ZpbmFsX2xpbmspOiBNYXJrIHNlY3Rpb25zIGluY2x1ZGVkCi0JaW4gdGhlIGxpbmsuCi0JKHhjb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgbGluayB1bm1hcmtlZCBzZWN0aW9ucy4KLQotCSogY29mZnN3YXAuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBJbmNsdWRlIHNlY3Rpb24gbmFtZSBpbgotCW92ZXJmbG93IGVycm9yIG1lc3NhZ2VzLgotCi1UdWUgTWFyIDI2IDE1OjQ2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLmMgKF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyKTogSWYgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUKLQlpcyBub3Qgc2V0LCBwcmludCAiQkZEOiAiIGJlZm9yZSB0aGUgZXJyb3IgbWVzc2FnZS4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQUNfQ0hFQ0tfVE9PTCB0byBmaW5kIGFyIGFuZCByYW5saWIuICBGcm9tCi0JTWlsZXMgQmFkZXIgPG1pbGVzQGdudS5haS5taXQuZWR1Pi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyMiAxMjoxNzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhjb2ZmbGluay5jICh4Y29mZl9saW5rX2lucHV0X2JmZCk6IEZpeCBzY2FuIGZvciBDX0JJTkNML0NfRUlOQ0wKLQlzeW1ib2xzLgotCi0JKiBjb25maWcuYmZkOiBBZGQgaWVlZV92ZWMgdG8gdGFyZ19zZWx2ZWNzIGZvciBpOTYwIHRhcmdldHMgYW5kCi0JbTY4ay1hb3V0LCBtNjhrLWNvZmYsIGFuZCBtNjhrLWVsZiB0YXJnZXRzLgotCi1GcmkgTWFyIDIyIDExOjMzOjQ0IDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AZ29vZnkuaW1lY2gudW5pLWR1aXNidXJnLmRlPgotCi0JKiBpZWVlLmM6IENoYW5nZWQgI2lmZGVmIEtFRVBNSU5VU1BDSU5JTlNUIHRvICNpZiBLRUVQTUlOVVNQQ0lOSU5TVC4KLQkoaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBSZXN0cnVjdHVyZWQgdG8gcHJldmVudAotCWllZWVfb2JqZWN0X3AgZnJvbSBiZWluZyBjYWxsZWQgcmVwZWF0ZWRseS4KLQotVGh1IE1hciAyMSAxMTowMDo0NyAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyk6ICBBbGxvY2F0ZQotCWJ1ZmZlcnMgbGFyZ2UgZW5vdWdoIGZvciBhbnkgRklMRUhEUiBvciBBT1VUSERSLgotCi1UaHUgTWFyIDIxIDE2OjI4OjE3IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGVjb2ZmbGluay5jIChsb29rdXBfbGluZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHJlbmFtZWQgYW5kCi0Jc2xpZ2hseSBjaGFuZ2VkIGZyb20gb2xkIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUuCi0JKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUpOiBDYWNoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi4gIFVzZQotCWxvb2t1cF9saW5lIGZvciBhY3R1YWwgbG9va3VwLgotCi1UaHUgTWFyIDIxIDE0OjU5OjExIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcGVpY29kZS5oIChwZV9wcmludF9wZGF0YSk6IFdhcm4gaWYgdGhlIC5wZGF0YSBzZWN0aW9uIGlzIG5vdCBhCi0JbXVsdGlwbGUgb2YgMjAgYnl0ZXMuCi0KLVRodSBNYXIgMjEgMTM6NTQ6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogVXNlIGJmZF96YWxsb2MgdG8KLQlhbGxvY2F0ZSBlY29mZl9maW5kX2xpbmUsIGFuZCBkb24ndCBpbml0aWFsaXplIGJ5IGhhbmQuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogVXNlIGJmZF96YWxsb2MgZm9yCi0JbWlwc19lbGZfZmluZF9saW5lLCBhbmQgZG9uJ3QgY2FsbCBtZW1zZXQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogSWYgbm90Ci0JcHJvZHVjaW5nIGEgZmluYWwgZXhlY3V0YWJsZSwgZG9uJ3QgY29uc2lkZXIgc29mYXIgd2hlbiBhbGlnbmluZwotCXRoZSBzZWN0aW9uIHRvIHRoZSBjb3JyZWN0IHNpemUuCi0KLVdlZCBNYXIgMjAgMTY6NTM6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMpOiBJZmRlZiBvdXQuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgY2FsbCBjb2ZmX2FkZF9taXNzaW5nX3N5bWJvbHMuCi0JKiBjb2ZmZ2VuLmMgKGNvZmZfc2VjdGlvbl9zeW1ib2wpOiBJZmRlZiBvdXQuCi0KLU1vbiBNYXIgMTggMTI6NTQ6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBJbml0aWFsaXplIGdwIGlmCi0Jb3V0cHV0X2JmZCBpcyBub3QgTlVMTC4KLQotVGh1IE1hciAxNCAxNzoxMjowNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY29mZmdlbi5jIChjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYik6IENhbGwgYmZkX3phbGxvYyBpbnN0ZWFkCi0Jb2YgYmZkX2FsbG9jIChmaXhlcyBmaXhfbGluZSBub3QgYmVpbmcgaW5pdGlhbGl6ZWQpLgotCURlbGV0ZSB6ZXJvaW5nIG9mIGZpeF97dmFsdWUsdGFnLGVuZCxzY25sZW59IGZpZWxkcy4KLQotVGh1IE1hciAxNCAxNjowNjowNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvZmZjb2RlLmg6IEFsbG93IHNwZWNpZmljIGJhY2tlbmRzIHRvIG92ZXJyaWRlIHRoZQotCWJmZF9saW5rX2FkZF9zeW1ib2xzIHJvdXRpbmUuCi0KLQkqIGNvZmYtaDgzMDAuYzogSW5jbHVkZSBnZW5saW5rLmguCi0JKGhvd3RvX3RhYmxlKTogQWRkIFJfTUVNX0lORElSRUNULgotCShydHlwZTJob3d0byk6IFN1cHBvcnQgUl9NRU1fSU5ESVJFQ1QuCi0JKGg4MzAwX3JlbG9jMTZfZXh0cmFfY2FzZXMpOiBIYW5kbGUgUl9NRU1fSU5ESVJFQ1QgbGlrZSBSX1JFTEJZVEUKLQlmb3Igbm93LgotCi1UdWUgTWFyIDEyIDEyOjQxOjE3IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGtvYWxhLmF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvZmYtYWxwaGEuYyAoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IFVzZQotCWluZm8tPmNhbGxiYWNrc193YXJuaW5nLCByYXRoZXIgdGhhbiBfYmZkX2Vycm9yX2hhbmRsZXIsIGZvcgotCSJtdWx0aXBsZSBncCIgd2FybmluZy4KLQotVHVlIE1hciAxMiAxMjoxMDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpbmtlci5jIChiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwKTogTmV3IGZ1bmN0aW9uLgotCShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCk6IFJlbW92ZSBCRkRfQVNTRVJUIG9uIGhhc2gKLQl0YWJsZSBzdHJpbmcuICBVc2UgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cC4KLQkoX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IFJlbW92ZSBCRkRfQVNTRVJUIG9uIGhhc2gKLQl0YWJsZSBzdHJpbmcuCi0JKiBhb3V0eC5oIChhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyk6IFVzZSB0aGUgbmFtZSBmcm9tIHRoZSBoYXNoCi0JdGFibGUsIGlmIGFueSwgd2hlbiB3cml0aW5nIG91dCBzeW1ib2xzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQpOiBVc2UgdGhlIG5hbWUgZnJvbSB0aGUgaGFzaCB0YWJsZSwKLQlpZiBhbnksIHdoZW4gcmVwb3J0aW5nIHVuZGVmaW5lZCBzeW1ib2xzLgotCShhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQpOiBMaWtld2lzZS4KLQkoYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIpOiBVc2UgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cC4KLQkqIGJvdXQuYyAoZ2V0X3ZhbHVlKTogTGlrZXdpc2UuCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogZWNvZmYuYyAoZWNvZmZfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBMaWtld2lzZS4KLQkoZWxmX3JlbG9jX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIGxpbmtlci5jIChfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyk6IExpa2V3aXNlLgotCShfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcik6IExpa2V3aXNlLgotCShkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQkqIHJlbG9jMTYuYyAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUpOiBMaWtld2lzZS4KLQkqIHN1bm9zLmMgKHN1bm9zX2FkZF9vbmVfc3ltYm9sKTogTGlrZXdpc2UuCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IExpa2V3aXNlLgotCShiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyk6IExpa2V3aXNlLgotCSh4Y29mZl9yZWxvY19saW5rX29yZGVyKTogTGlrZXdpc2UuCi0KLQkqIGVjb2Zmc3dhcC5oIChlY29mZl9zd2FwX2Zkcl9pbik6IElmIEVDT0ZGXzY0LCB0dXJuIDB4ZmZmZmZmZmYKLQlpbnRvIC0xIGZvciBpbnRlcm4tPnJzcy4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi1Nb24gTWFyIDExIDEyOjI4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYi1zeW1zLmMgKF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKTogRGVmaW5lLgotCShiZmRfZ2V0X3N0YWJfbmFtZSk6IFJlbmFtZSBmcm9tIGFvdXRfc3RhYl9uYW1lLiAgUmV3cml0ZSB0byB1c2UgYQotCXN3aXRjaC4KLQkqIGJmZC1pbi5oIChiZmRfZ2V0X3N0YWJfbmFtZSk6IERlY2xhcmUuCi0JKiBiZmQtaW4yLmg6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRF9MSUJTKTogQWRkIHN0YWItc3ltcy5vLgotCShCRkRfTElCU19DRklMRVMpOiBBZGQgc3RhYi1zeW1zLmMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogUmVtb3ZlIHN0YWItc3ltcy5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBSZW1vdmUgc3RhYi1zeW1zLmMuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGxpc3Qgc3RhYi1zeW1zLm8gaW4gYmZkX2JhY2tlbmRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbGliYW91dC5oIChhb3V0X3N0YWJfbmFtZSk6IERvbid0IGRlY2xhcmUuCi0JKiBhb3V0eC5oIChOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKSk6IENhbGwgYmZkX2dldF9zdGFiX25hbWUsCi0Jbm90IGFvdXRfc3RhYl9uYW1lLgotCi1GcmkgTWFyICA4IDExOjI2OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBBZGp1c3QgZmlsZSBvZmZzZXQKLQlmb3Igc2VjdGlvbiBhbGlnbm1lbnQgZXZlbiBpZiBTRUNfTE9BRCBpcyBub3Qgc2V0LgotCi1UdWUgTWFyICA1IDEyOjAyOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgU0hMSUIgb3IgU0hMSU5LIHRvIGFuIGVtcHR5IHN0cmluZywKLQlzaW5jZSB0aGV5IGFwcGVhciBhcyB0YXJnZXRzIGluIE1ha2VmaWxlLmluLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBJZiBub3QgbWFraW5nIGEgc2hhcmVkIGxpYnJhcnksCi0JZG9uJ3QgZmlkZGxlIHdpdGggYSBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQgYW55d2hlcmUuCi0KLU1vbiBNYXIgIDQgMTI6NDk6MTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbWFyayk6IFRyZWF0IHVuZGVmaW5lZCBpbXBvcnRlZCBzeW1ib2xzIGFzCi0JdGhvdWdoIHRoZXkgYXJlIGRlZmluZWQgaW4gYSBzaGFyZWQgbGlicmFyeS4KLQkoeGNvZmZfYnVpbGRfbGRzeW1zKTogTGlrZXdpc2UuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IGxvb2sgYXQgdGhlIGxpbmUKLQludW1iZXJzIGZvciB0aGUgc2VjdGlvbiBpZiBzZWN0aW9uLT5saW5lbm8gaXMgTlVMTC4KLQotCSogZWxmLmMgKF9iZmRfZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wpOiBQcmludCBhIHVzZWZ1bCBlcnJvcgotCW1lc3NhZ2UgcmF0aGVyIHRoYW4gY2FsbGluZyBCRkRfQVNTRVJULgotCSogZWxmY29kZS5oICh3cml0ZV9yZWxvY3MpOiBDaGVjayByZXR1cm4gdmFsdWUgb2YKLQlfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sLgotCi1GcmkgTWFyICAxIDA5OjQyOjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfYWRkX3N5bWJvbF9ob29rKTogRG9uJ3Qgc2V0IFNFQ19MT0FEIGZsYWcKLQlmb3IgLnNic3Mgc2VjdGlvbi4KLQotV2VkIEZlYiAyOCAxMToyNTo0NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGxpYmhwcGEuaCAoaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlKTogQWRkIFJfSFBQQV9OTFNFTAotCWFuZCBSX0hQUEFfTkxSU0VMLgotCShlX25zZWwsIGVfbmxzZWwsIGVfbmxyc2VsKTogVW5kZWZpbmUuICBBZGQgdG8KLQlocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0LgotCShocHBhX2ZpZWxkX2FkanVzdCk6IEhhbmRsZSBlX25sc2VsLCBlX25scnNlbC4gIEZpeCBlX25zZWwgaGFuZGxpbmcuCi0JKiBzb20uYyAoaHBwYV9zb21fZ2VuX3JlbG9jX3R5cGUpOiBIYW5kbGUgTicsIE5MJyBOTFInIGZpZWxkCi0Jc2VsZWN0b3JzLgotCShzb21fd3JpdGVfZml4dXBzKTogRmluaXNoIGhhbmRsaW5nIG9mIFJfTjBTRUwgYW5kIFJfTjFTRUwuCi0KLVdlZCBGZWIgMjggMTE6MDA6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IEFkanVzdCB0aGUgc2VnbWVudAotCW1lbW9yeSBzaXplIGZvciB0aGUgYWxpZ25tZW50IG9mIGEgU0VDX0FMTE9DIHNlY3Rpb24sIG5vdCBqdXN0IGEKLQlTRUNfTE9BRCBzZWN0aW9uLgotCi1UdWUgRmViIDI3IDE0OjE3OjMxIDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrbGludXguYzogTmV3IGZpbGUuCi0JKiBob3N0cy9tNjhrbGludXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcuYmZkIChtNjgqLSotbGludXhhb3V0KiwgbTY4Ki0qLWxpbnV4Kik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChtNjgqLSotbGludXgqKTogTmV3IG5hdGl2ZSBob3N0LgotCShtNjhrbGludXhfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAobTY4a2xpbnV4X3ZlYyk6IERlY2xhcmUuCi0JKiBpMzg2bGludXguYyAoYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBSZW5hbWVkIGZyb20KLQliZmRfbGludXhfc2l6ZV9keW5taWNfc2VjdGlvbnMgdG8gYXZvaWQgY2xhc2ggd2l0aCBtNjhrbGludXguYy4KLQkqIGJmZC1pbi5oIChiZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFJlbmFtZQotCWRlY2xhcmF0aW9uIGZyb20gYmZkX2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQkoYmZkX202OGtsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShCRkQzMl9CQUNLRU5EUyk6IEFkZCBtNjhrbGludXguby4KLQkoQkZEMzJfQkFDS0VORFNfQ0ZJTEVTKTogQWRkIG02OGtsaW51eC5jLgotCi1UdWUgRmViIDI3IDExOjMxOjM0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbGliaHBwYS5oIChwYV9hcmNoKTogQWRkIHBhMjAuCi0JKGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZSk6IEFkZCBSX0hQUEFfTlNFTC4KLQkoZV9uc2VsKTogVW5kZWZpbmUuICBBZGQgdG8gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdC4KLQkoaHBwYV9maWVsZF9hZGp1c3QpOiBIYW5kbGUgZV9uc2VsLgotCSogc29tLmM6IFByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgbWFueSBuZXcgcmVsb2NzIGZvdW5kIG9ubHkKLQlpbiBocHV4MTAgaW5jbHVkZSBmaWxlcy4KLQkoc29tX2ZpeHVwX2Zvcm1hdHMpOiBBZGQgc2V2ZXJhbCBuZXcgcmVsb2NzIGZyb20gaHB1eDEwLgotCShzb21faHBwYV9ob3d0b190YWJsZSk6IEFkZCBocHV4MTAgcmVsb2NzLgotCShzb21fd3JpdGVfZml4dXBzKTogSGFuZGxlIFJfTjBTRUwgYW5kIFJfTjFTRUwgaHB1eDEwIHJlbG9jcy4KLQotTW9uIEZlYiAyNiAxMjo1Mjo0OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgcmVjZW50IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQsIGFuZAotCXJ1bGVzIHRvIHJlYnVpbGQgLmggZmlsZXMgdXNpbmcgZG9jL2NoZXcuCi0KLU1vbiBGZWIgMjYgMTQ6NDg6MzkgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AQVpTdGFyTmV0LmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKTogQWRqdXN0IHRoZSBmaWxlCi0Jc2l6ZSBldmVuIG9mIHNlY3Rpb25zIHdpdGggbm8gY29udGVudHMuCi0KLU1vbiBGZWIgMjYgMTQ6MDE6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jIChfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQpOiBXaGVuIG1lcmdpbmcsIHNraXAgbmFtZXMKLQlzdGFydGluZyB3aXRoICckJyB0aGUgd2F5IHdlIHNraXAgbmFtZXMgc3RhcnRpbmcgd2l0aCAnLicuICBXaGVuCi0JdXBkYXRpbmcgeF9lbmRuZHgsIGRvbid0IGJlIGZvb2xlZCBieSBhbiBpbmRleCB3aGljaCBoYXMgYmVlbgotCW1lcmdlZC4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkKTogRG9uJ3QgdHJ5IHRvIG9wdGltaXplIGEKLQlzdHJ1Y3QvdW5pb24vZW51bSB0eXBlIHdpdGggbm8gZWxlbWVudHMuCi0KLVNhdCBGZWIgMjQgMTE6Mzg6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoYmZkX2Vycm1zZyk6IEhhbmRsZSBhIE5VTEwgcmV0dXJuIGZyb20gc3RyZXJyb3IuCi0KLQkqIGFyY2hpdmUuYyAoYmZkX2dlbmVyaWNfYXJjaGl2ZV9wKTogSWYgdGhlIGZpcnN0IGZpbGUgaW4gdGhlCi0JYXJjaGl2ZSBjYW4gbm90IGJlIHJlY29nbml6ZWQgYXMgYW4gb2JqZWN0LCBkb24ndCBhc3N1bWUgdGhhdCB0aGlzCi0JaXMgdGhlIHdyb25nIGZvcm1hdC4KLQotCSogZWxmLmMgKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlCi0JZm9ybWF0IGlzIG5vdCBiZmRfb2JqZWN0LgotCShiZmRfZWxmX2dldF9kdF9zb25hbWUpOiBMaWtld2lzZS4KLQotV2VkIEZlYiAyMSAxMzo1ODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYtc2guYyAoc2hfcmVsYXhfZGVsZXRlX2J5dGVzKTogQ29ycmVjdCByYW5nZSBvZiBSX1NIX1VTRVMKLQlyZWxvYy4KLQotVHVlIEZlYiAyMCAxNjoyMjo0NCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGJmZC5jICh0ZGF0YSk6IEFkZCBuZXRic2RfY29yZV9kYXRhLgotCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQotVHVlIEZlYiAyMCAxNjo1MDowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1bm9zLmMgKFNVTk9TX0NPTlNUUlVDVE9SKTogRGVmaW5lLgotCShzdW5vc19hZGRfb25lX3N5bWJvbCk6IERvbid0IGxldCBhIHN5bWJvbCBmcm9tIGEgZHluYW1pYyBvYmplY3QKLQlvdmVycmlkZSBhIGNvbnN0cnVjdG9yIHN5bWJvbC4gIFNldCBTVU5PU19DT05TVFJVQ1RPUiB3aGVuCi0JYXBwcm9wcmlhdGUuCi0KLQkqIGJvdXQuYyAoYl9vdXRfc3F1aXJ0X291dF9yZWxvY3MpOiBVc2UgdWRhdGEuaSByYXRoZXIgdGhhbiBmbGFncwotCXRvIGdldCB0aGUgc3ltYm9sIGluZGV4LCBtYXRjaGluZyAxNCBKdWwgOTUgY2hhbmdlLgotCi1UdWUgRmViIDIwIDA4OjI2OjI3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6Ci0JUmVtb3ZlIGR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIGdwLgotCi1Nb24gRmViIDE5IDEyOjM3OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndAotCWFzc3VtZSB0aGF0IHdlIGNhbiBzZXQgdGhlIEdQIHZhbHVlIGFuZCB0aGVuIGdldCB0aGUgc2FtZSB2YWx1ZSwKLQlzaW5jZSBpdCB3b24ndCBiZSB0cnVlIGlmIHRoZSBvdXRwdXQgZmlsZSBpcyBuZWl0aGVyIEVMRiBub3IKLQlFQ09GRi4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2FkanVzdF9yZWxvY19pbik6IERvbid0IGJvdGhlciB0byB1c2UKLQlfYmZkX2dldF9ncF92YWx1ZSBoZXJlLgotCShtaXBzX2dwcmVsX3JlbG9jKTogRG9uJ3QgYXNzdW1lIHdlIGNhbiBzZXQgYW5kIGdldCB0aGUgR1AgdmFsdWUuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2hpMTZfcmVsb2MpOiBHZXQgZ3AgdmFsdWUgZnJvbQotCW1pcHNfZWxmX2ZpbmFsX2dwLgotCShtaXBzX2VsZl9sbzE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2ZpbmFsX2dwKTogQWRkIHBncCBwYXJhbWV0ZXIuICBTZXQgaXQgdG8gdGhlIEdQIHZhbHVlLgotCURvbid0IHJlcXVpcmUgdGhhdCB0aGUgQkZEIGJlIEVMRi4KLQkobWlwc19lbGZfZ3ByZWwxNl9yZWxvYyk6IEdldCBncCB2YWx1ZSBmcm9tIG1pcHNfZWxmX2ZpbmFsX2dwLgotCShtaXBzX2VsZl9ncHJlbDMyX3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEb24ndCBhc3N1bWUgd2UgY2FuIHNldCBhbmQgZ2V0IHRoZQotCUdQIHZhbHVlLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBEb24ndCBib3RoZXIgdG8gdXNlCi0JX2JmZF9nZXRfZ3BfdmFsdWUgaGVyZS4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlKTogSW5pdGlhbGl6ZSBzdi4KLQlEb24ndCBjaGFuZ2UgZXBkciBiZXR3ZWVuIG1hbGxvYyBhbmQgZnJlZS4gIEJlIGNhcmVmdWwgbm90IHRvIGZyZWUKLQlOVUxMIHBvaW50ZXJzLiAgWmVybyBvdXQgdGhlIGZpcnN0IFJQRFIuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBPbiBMaW51eCwgb25seSBwYXNzIC1ycGF0aCBvcHRpb24gaWYgJChsaWJkaXIpCi0JaXMgbmVpdGhlciAvbGliIG5vciAvdXNyL2xpYi4gIEZyb20gQWxhbiBNb2RyYQotCTxhbGFuQG11bGxldC5MZXZlbHMuVW5pU0EuRWR1LkF1Pi4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX29ial90ZGF0YSk6IFJlbmFtZSBkdF9uZWVkZWRfbmFtZSB0bwotCWR0X25hbWUuCi0JKGVsZl9kdF9uYW1lKTogUmVuYW1lIGZyb20gZWxmX2R0X25lZWRlZF9uYW1lLgotCSogZWxmLmMgKGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lKTogVXNlIGVsZl9kdF9uYW1lLCBub3QKLQllbGZfZHRfbmVlZGVkX25hbWUuCi0JKGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGVsZmxpbmsuaCAoZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzKTogVXNlIGVsZl9kdF9uYW1lLCBub3QKLQllbGZfZHRfbmVlZGVkX25hbWUuICBTYXZlIHRoZSBTT05BTUUgYmFjayBpbiBlbGZfZHRfbmFtZS4KLQkqIGJmZC1pbi5oIChiZmRfZWxmX2dldF9kdF9zb25hbWUpOiBEZWNsYXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi1Nb24gRmViIDE5IDAyOjUwOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1zcGFyYy5jIChlbGYzMl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCk6IFJlbmFtZWQgZnJvbQotCV9iZmRfc3BhcmNfZWxmX3JlbG9jX3R5cGVfbG9va3VwLgotCShiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwKTogVXBkYXRlLgotCSogZWxmNjQtc3BhcmMuYyAoU1BBUkM2NF9PTERfUkVMT0NTKTogRGVmaW5lLgotCShzcGFyYzY0X2VsZl9ob3d0b190YWJsZSk6IERlZmluZS4KLQkoc3BhcmNfcmVsb2NfbWFwKTogRGVmaW5lLgotCShzcGFyYzY0X2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKGVsZl9pbmZvX3RvX2hvd3RvKTogVXNlIHNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlLgotCShzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBVcGRhdGUuCi0KLVN1biBGZWIgMTggMTU6MDI6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogQ2hlY2sgZm9yICdkbyBub3QgbWl4JyBmcm9tIG5hdGl2ZSBsaW5rZXIgYmVmb3JlCi0JdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0KLUZyaSBGZWIgMTYgMTI6NDY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmQuYyAoX2JmZF9nZXRfZ3BfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0JKF9iZmRfc2V0X2dwX3ZhbHVlKTogTmV3IGZ1bmN0aW9uLgotCSogbGliYmZkLWluLmggKF9iZmRfZ2V0X2dwX3ZhbHVlKTogRGVjbGFyZS4KLQkoX2JmZF9zZXRfZ3BfdmFsdWUpOiBEZWNsYXJlLgotCSogbGliYmZkLmg6IFJlYnVpbGQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyk6IFVzZQotCV9iZmRfZ2V0X2dwX3ZhbHVlIGFuZCBfYmZkX3NldF9ncF92YWx1ZSByYXRoZXIgdGhhbiByZWZlcnJpbmcKLQlkaXJlY3RseSB0byB0aGUgZmllbGRzIGluIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbi4KLQkoYWxwaGFfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29mZi1taXBzLmMgKG1pcHNfYWRqdXN0X3JlbG9jX2luKTogTGlrZXdpc2UuCi0JKG1pcHNfZ3ByZWxfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX2hpMTZfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfbG8xNl9yZWxvYyk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9maW5hbF9ncCk6IExpa2V3aXNlLgotCShtaXBzX2VsZl9ncHJlbDE2X3JlbG9jKTogTGlrZXdpc2UuCi0JKG1pcHNfZWxmX2dwcmVsMzJfcmVsb2MpOiBMaWtld2lzZS4KLQkobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCShtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogYm91dC5jIChiX291dF9zZXRfYXJjaF9tYWNoKTogUmVjb2duaXplIGJmZF9tYWNoX2k5NjBfanguCi0KLVRodSBGZWIgMTUgMTE6Mjk6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQyBiZWZvcmUgY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogRG9uJ3Qgc2V0IGluZm9ybWF0aW9uIHdoaWNoIGF1dG9jb25mIHNob3VsZAotCWZpZ3VyZSBvdXQsIG5hbWVseSBDQywgQ0ZMQUdTLCBMREZMQUdTLCBBUiwgYW5kIFJBTkxJQi4KLQotCSogY29uZmlndXJlLmhvc3Q6IFJlbW92ZSBnbzMyIGFuZCB3aW4zMiBob3N0IGluZm9ybWF0aW9uLCBzaW5jZSBpdAotCXNob3VsZCBubyBsb25nZXIgYmUgbmVlZGVkLgotCi0JKiBlbGYuYyAobWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzKTogSWYgd2UgaGF2ZSBhIC5keW5hbWljIHNlY3Rpb24sCi0JdGhlbiBzdGFydCBhIG5ldyBzZWdtZW50IHJhdGhlciB0aGFuIHB1dCBhIHdyaXRhYmxlIHNlY3Rpb24gaW4gYQotCXJlYWRvbmx5IHNlZ21lbnQuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBTZXQgUlBBVEhfRU5WVkFSLgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGVsZmxpbmsuYyAoX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uKTogUmVtb3ZlIHVudXNlZAotCXplcm9fc2VjdGlvbiB2YXJpYWJsZS4KLQotVGh1IEZlYiAxNSAxMDozOToxNyAxOTk2ICBILkouIEx1ICA8aGpsQHpvb20uY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChzcmNkaXIpL2JmZC1pbjIuaCk6IFJlbmFtZSB0YXJnZXQgZnJvbSBiZmQtaW4yLmguCi0JKCQoc3JjZGlyKS9saWJiZmQuaCk6IFJlbmFtZSBmcm9tIGxpYmJmZC5oLgotCSgkKHNyY2RpcikvbGliY29mZi5oKTogUmVuYW1lIGZyb20gbGliY29mZi5oLgotCi1XZWQgRmViIDE0IDE2OjI5OjA3IDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV9leHByZXNzaW9uKTogT25seSB1c2UgYW4gUiB2YXJpYWJsZSBmb3IgYQotCWxvY2FsIHN5bWJvbC4gIERvbid0IG91dHB1dCBhIHplcm8gb2Zmc2V0LiAgSGFuZGxlIGEgemVybyBhZGRyZXNzLgotCShTUkNfTUFTSywgUENSRUxfT0ZGU0VUKTogRGVmaW5lIGJhc2VkIG9uIEtFRVBNSU5VU1BDSU5JTlNULgotCShyZWwzMl9ob3d0bywgcmVsMTZfaG93dG8sIHJlbDhfaG93dG8pOiBVc2UgU1JDX01BU0sgYW5kCi0JUENSRUxfT0ZGU0VULgotCShwYXJzZV9leHByZXNzaW9uKTogRG9uJ3QgdHJ5IHRvIGhhbmRsZSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiBhCi0JUCB2YXJpYWJsZS4gIEhhbmRsZSBJIHZhcmlhYmxlcyBkaWZmZXJlbnRseSBmcm9tIFggdmFyaWFibGVzLiAgRml4Ci0JdGhlIG9yZGVyIG9mIG1pbnVzIGV4cHJlc3Npb25zLgotCShpZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMpOiBHZW5lcmF0ZSBhbiBJIHZhcmlhYmxlIGZvciBhbiBOTgotCXJlY29yZC4gIEZpeCBoYW5kbGluZyBvZiBBVEkgYW5kIEFUWCByZWNvcmRzLgotCShpZWVlX3NsdXJwX3NlY3Rpb25zKTogT25seSBzZXQgbWluaW1hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuCi0JQWRqdXN0IHRoZW0gbGF0ZXIsIGJhc2VkIG9uIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCShpZWVlX29iamVjdF9wKTogUmVhZCBpbiB0aGUgZmlsZSB1bnRpbCBqdXN0IGFmdGVyIHRoZSBNRSByZWNvcmQuCi0JQ2FsbCBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSB0byBzZXQgdGhlIHNlY3Rpb24gZmxhZ3MuCi0JKGRvX29uZSk6IEFkZCBpdGVyYXRpb25zIHBhcmFtZXRlci4gIE9ubHkgcmVwZWF0IHRoZSBmaXJzdCBsb2FkCi0JaXRlbS4gIFNldCB0aGUgc2VjdGlvbiBhbmQgZmlsZSByZWxvYyBmbGFncy4KLQkoaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEpOiBTZXQgc2VjdGlvbiBmbGFncy4gIFBhc3MgaXRlcmF0aW9ucyB0bwotCWRvX29uZS4KLQkoaWVlZV9jYW5vbmljYWxpemVfcmVsb2MpOiBIYW5kbGUgSSB2YXJpYWJsZXMuCi0JKGRvX3dpdGhfcmVsb2NzKTogT25seSBlbWl0IHJlbG9jYXRpb24gc2l6ZSB3aGVuIG5lY2Vzc2FyeS4KLQlJbmNyZWFzZSBNQVhSVU4gdG8gMTI3LiAgQ2hhbmdlIG92IHRvIGJlIGFzc2lnbmVkLCBhbmQgdGFrZQotCXNyY19tYXNrIGFuZCBwY3JlbF9vZmZzZXQgaW50byBhY2NvdW50LgotCShpZWVlX3dyaXRlX2RhdGFfcGFydCk6IFNraXAgc2VjdGlvbnMgdGhhdCBhcmUgbm90IGxvYWRlZC4KLQkoaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0KTogRG9uJ3Qgb3V0cHV0IG9wdGlvbmFsIGxhc3QgZW50cnkgb2YgV1gKLQlyZWNvcmRzLgotCShpZWVlX3dyaXRlX21lX3BhcnQpOiBNYWtlIHNldHRpbmcgb2YgbWVfcmVjb3JkIG5lYXRlci4KLQkoaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQpOiBHZXQgdGhlIHNpemUgb2YgYW4gYXJjaGl2ZSBlbGVtZW50LgotCi0JKiBzeW1zLmMgKHN0dCk6IEFkZCBlbnRyaWVzIGZvciB6ZXJvdmFycywgdmFycywgYW5kIGNvZGUuCi0KLQkqIGVsZmNvZGUuaCAodmFsaWRhdGVfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSh3cml0ZV9yZWxvY3MpOiBDYWxsIHZhbGlkYXRlX3JlbG9jIGZvciBub24gRUxGIHJlbG9jcy4KLQotCSogZWxmeHgtdGFyZ2V0LmggKGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShUQVJHRVRfQklHX1NZTSk6IFVzZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhci4KLQkoVEFSR0VUX0xJVFRMRV9TWU0pOiBMaWtld2lzZS4KLQotCSogY29uZmlnLmJmZCAobTY4Ki0qLXBzb3MqKTogTmV3IHRhcmdldC4KLQotVHVlIEZlYiAxMyAxNTo1NjoyMiAxOTk2ICBCcnlhbiBGb3JkICA8YmFmb3JkQHNuYWtlLmNzLnV0YWguZWR1PgotCi0JKiBpMzg2bXNkb3MuYzogUmVtb3ZlIHNvbWUgI2lmIDAgY29kZS4KLQkobXNkb3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogRG9uJ3QgaW5jbHVkZSBlbXB0eSBzZWN0aW9ucyBpbiB0aGUKLQlzaXplIGNvbXB1dGF0aW9uLCByZWdhcmRsZXNzIG9mIHRoZWlyIGFkZHJlc3MuCi0KLVR1ZSBGZWIgMTMgMTU6MzY6MzcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRG9uJ3Qgc2VnZmF1bHQgaWYgZHluYm9qCi0JaXMgTlVMTCwgaWUsIHRoZSAtciBzd2l0Y2ggaXMgdXNlZC4KLQotVHVlIEZlYiAxMyAxNDozNToxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLmMgKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTogRGVmaW5lLgotCShCRkRfUkVMT0NfTUlQU19HT1RfTE8xNik6IERlZmluZS4KLQkoQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2LCBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYpOiBEZWZpbmUuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCSogZWxmMzItbWlwcy5jIChtaXBzX3JlbG9jX21hcCk6IE1hcCBuZXcgcmVsb2NzLgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhETEZMQUdTIGZvciAqLSotaHB1eCB3aXRoIC0tZW5hYmxlLXNoYXJlZC4KLQotCSogTWFrZWZpbGUuaW4gKCQoU0hMSU5LKSk6IENoZWNrIHRzIGFnYWluc3QgJChTSExJQiksIG5vdAotCSQoU0hMSU5LKS4KLQotCSogaWVlZS5jIChnZXRfc3ltYm9sKTogU2V0IHRoZSBzZWN0aW9uIHRvIGJmZF9hYnNfc2VjdGlvbi4KLQkoZG9fd2l0aF9yZWxvY3MpOiBJZiBFWEVDX1AgaXMgc2V0IGFuZCB0aGVyZSBhcmUgbm8gcmVsb2NzLCB1c2UgYQotCXNpbXBsZSBudW1iZXIgZm9yIHRoZSBzZWN0aW9uIGFkZHJlc3MsIHJhdGhlciB0aGFuIGFuIGV4cHJlc3Npb24uCi0JTGltaXQgdGhlIG51bWJlciBvZiBieXRlcyBiZXR3ZWVuIHJlbG9jcyB0byBNQVhSVU4uCi0JKGllZWVfd3JpdGVfbWVfcGFydCk6IFNldCBtZV9yZWNvcmQgdG8gdGhlIGZpbGUgb2Zmc2V0IGFmdGVyIHRoZQotCXN0YXJ0IGFkZHJlc3MuCi0JKGllZWVfd3JpdGVfcHJvY2Vzc29yKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBVc2UgaWVlZV93cml0ZV9wcm9jZXNzb3IuCi0KLUZyaSBGZWIgIDkgMTA6NTM6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogVXNlICR7Q0MtZ2NjfSB3aGVuIHRlc3RpbmcgZm9yIC1ycGF0aCBvbiBTdW5PUy4KLQotCSogY29mZi1hdXguYzogQ2hhbmdlIGluY2x1ZGUgb2YgYXV4LmggdG8gYXV4LWNvZmYuaC4KLQotVGh1IEZlYiAgOCAxNDowMTowMyAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogRm9yIGEgUl82OEtfUkVMQVRJVkUKLQlyZWxvY2F0aW9uIHB1dCB0aGUgYWRkZW5kIGJvdGggaW4gdGhlIHJlbG9jIGVudHJ5IGFuZCB0aGUgZGF0YS4KLQkoZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc3ltYm9sKTogTGlrZXdpc2UuICBNYXNrIG91dCBtYXJrZXIgaW4KLQlHT1Qgb2Zmc2V0IHZhbHVlLgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBJZiAtQnN5bWJvbGljLCByZXNvbHZlCi0JYSBSXzY4S19QQ3h4IHJlbG9jIGFnYWluc3QgYSBkZWZpbmVkIGdsb2JhbCBzeW1ib2wgZGlyZWN0bHkuCi0JKGVsZl9tNjhrX2NoZWNrX3JlbG9jcyk6IERvbid0IGNvdW50IHN1Y2ggYSByZWxvYy4KLQotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19jaGVja19yZWxvY3MpOiBEb24ndCByZWNvcmQgYSBzeW1ib2wgd2l0aAotCWEgUExUeHggcmVsb2MgYXMgZHluYW1pYy4gIERpc2FsbG93IFBMVHh4TyByZWxvYyBhZ2FpbnN0IGEgbG9jYWwKLQlzeW1ib2wgZm9yIG5vdywgb3RoZXJ3aXNlIGFsd2F5cyByZWNvcmQgdGhlIHN5bWJvbCBhcyBkeW5hbWljLgotCShlbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBhIHN5bWJvbCB3aXRoIGEgUExUeHggcmVsb2MKLQlpcyBub3QgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgYXJlIG5vdCBtYWtpbmcgYQotCXNoYXJlZCBvYmplY3QsIHRoZW4gZG9uJ3QgbWFrZSBhIFBMVCBlbnRyeS4gIElmIHdlIGRvIG1ha2UgYSBQTFQKLQllbnRyeSwgbWFrZSBzdXJlIHRoZSBzeW1ib2wgaGFzIGJlZW4gcmVjb3JkZWQgYXMgZHluYW1pYy4KLQotV2VkIEZlYiAgNyAxMzo1NjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBXaGVuIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5LCBzZXQgSExERkxBR1MgdG8KLQlwYXNzIGFuIGFwcHJvcHJpYXRlIC1ycGF0aCBvcHRpb24uICBVc2UgdGhlIG1ha2UgdmFyaWFibGUgU09OQU1FCi0JYXMgdGhlIHNoYXJlZCBsaWJyYXJ5IHNvbmFtZSwgcmF0aGVyIHRoYW4gY29tcHV0aW5nIGl0IGhlcmUuICBPbgotCVN1bk9TLCBidWlsZCBzdGFtcC10c2hsaW5rIGluIHBsYWNlIG9mICQoU0hMSU5LKS4KLQkqIE1ha2VmaWxlLmluIChTT05BTUUpOiBOZXcgdmFyaWFibGUuCi0JKCQoU0hMSU5LKSk6IE1ha2UgYSBsaW5rIHRvIHRoZSB0cmFuc2Zvcm1lZCBuYW1lLCBhcyB3ZWxsLgotCShzdGFtcC10c2hsaW5rKTogTmV3IHRhcmdldC4KLQkoaW5zdGFsbCk6IFNraXAgc3RhbXAtdHNobGluayBkdXJpbmcgaW5zdGFsbC4KLQotV2VkIEZlYiAgNyAxMzozNzozOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZF9zeW1ib2xfaG9vayk6IERvIG5vdCBhc3N1bWUgdGhhdCB0aGUKLQlsaW5rZXIgc2VjdGlvbnMgaGF2ZSBiZWVuIHNldCB1cCB5ZXQuCi0KLQkqIGVsZi5jIChtYWtlX21hcHBpbmcpOiBBZGQgYW4gYWRkaXRpb25hbCBhcmd1bWVudCB0byBzdXBwcmVzcwotCW1ha2luZyB0aGUgZmlyc3Qgc2VjdGlvbiBpbmNsdWRlIHRoZSBwcm9ncmFtIGhlYWRlcnMuCi0JKG1hcF9zZWN0aW9uc190b19zZWdtZW50cyk6IElmIHRoZSB1c2VyIHVzZWQgLVR0ZXh0IHN1Y2ggdGhhdCB0aGUKLQlwcm9ncmFtIGhlYWRlcnMgYXJlIG9uIGEgZGlmZmVyZW50IHBhZ2UsIGRvIG5vdCBzZXQgdGhlIGZsYWdzCi0Jc2F5aW5nIHRoYXQgdGhpcyBzZWN0aW9uIGluY2x1ZGVzIHRoZSBwcm9ncmFtIGhlYWRlcnMuCi0KLVR1ZSBGZWIgIDYgMTQ6MDQ6NDkgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKCotKi1uZXRic2QqKTogU2V0IENPUkVGSUxFIHRvIG5ldGJzZC1jb3JlLmMuCi0JZG9uJ3QgZGVmaW5lIFRSQURfSEVBREVSLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBuZXRic2QtY29yZS5jOiBOZXcgZmlsZSwgc3VwcG9ydCBmb3IgTmV0QlNEIGNvcmUgZmlsZXMuCi0JKiBob3N0cy8qbmJzZC5oOiBSZW1vdmVkLgotCi1UdWUgRmViICA2IDExOjQ3OjQ5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jIChCRkRfUkVMT0NfU1BBUkNfWzU2N10pOiBOZXcgcmVsb2MgdHlwZXMuCi0JKEJGRF9SRUxPQ19TUEFSQ19MTzcgcmVsb2MgdHlwZSk6IERlbGV0ZWQuCi0JKiBsaWJiZmQuaCwgYmZkLWluMi5oOiBSZWdlbmVyYXRlZC4KLQkqIGVsZjMyLXNwYXJjLmMgKF9iZmRfc3BhcmNfZWxmX3JlbG9jX3R5cGVfbG9va3VwKTogUmVuYW1lZCBmcm9tCi0JYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cC4KLQkocmVsb2NfdHlwZXssX25hbWVzfSk6IERlbGV0ZWQuCi0JKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUmVuYW1lZCBmcm9tIGVsZl9zcGFyY19ob3d0b190YWJsZS4KLQlBZGQgc3BhcmM2NCByZWxvY3MuCi0JKHNwYXJjX3JlbG9jX21hcCk6IEFkZCBzcGFyYzY0IHJlbG9jcy4KLQkoc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzKTogSGFuZGxlIFJfU1BBUkNfV0RJU1B7MTYsMTl9LgotCShlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXApOiBEZWZpbmUuCi0JKiBlbGY2NC1zcGFyYy5jIChzcGFyYzY0X2VsZl93ZGlzcDE2X3JlbG9jKTogRGVsZXRlZC4KLQkocmVsb2NfdHlwZXssX25hbWVzfSk6IERlbGV0ZWQuCi0JKGVsZl9zcGFyY19ob3d0b190YWJsZSk6IERlbGV0ZWQuCi0JKHNwYXJjX3JlbG9jX21hcCk6IERlbGV0ZWQuCi0JKF9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlKTogUmVuYW1lZCBmcm9tIGVsZl9zcGFyY19ob3d0b190YWJsZS4KLQkoYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCk6IENoYW5nZSBmcm9tIGZ1bmN0aW9uIHRvICNkZWZpbmUuCi0KLVR1ZSBGZWIgIDYgMTI6MTI6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogTWFrZSBTSExJQl9DRkxBR1MgaW5jbHVkZSAkKFBJQ0ZMQUcpIG9uIGEKLQkqLSotaHB1eCogaG9zdC4KLQotCSogTWFrZWZpbGUuaW4gKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpOiBOZXcgdmFyaWFibGUuCi0JKGluc3RhbGwpOiBUcmFuc2Zvcm0gbGlicmFyeSBuYW1lIGJlZm9yZSBpbnN0YWxsaW5nIGl0LgotCi1Nb24gRmViICA1IDEwOjM4OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJjaHVyZXMuYyAoYmZkX21hY2hfaTk2MF9oeCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGNwdS1pOTYwLmMgKHNjYW5fOTYwX21hY2gpOiBBY2NlcHQgbWFjaGluZSAiaHgiLgotCShNQVRSSVgpOiBFeHBhbmQgZW50cmllcyBmb3IgSFguCi0JKGFyY2hfaW5mb19zdHJ1Y3QpOiBBZGQgaTk2MDpoeCBlbnRyeS4KLQkqIGJvdXQuYyAoYl9vdXRfc2V0X2FyY2hfbWFjaCk6IEhhbmRsZSBiZmRfbWFjaF9pOTYwX2h4LgotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spOiBIYW5kbGUgRl9JOTYwSFguCi0JKGNvZmZfc2V0X2ZsYWdzKTogSGFuZGxlIGJmZF9tYWNoX2k5NjBfaHguCi0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBhcyBhIHNoYXJlZCBsaWJyYXJ5LCBiYXNlZCBvbiBwYXRjaGVzIGZyb20KLQlBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19BUkdfRU5BQkxFIGZvciBzaGFyZWQgYW5kIGNvbW1vbmJmZGxpYi4KLQlOZXcgc3Vic3RpdHV0aW9uczogQUxMTElCUywgUElDRkxBRywgU0hMSUIsIFNITElCX0NDLAotCVNITElCX0NGTEFHUywgQ09NTU9OX1NITElCLCBQSUNMSVNULCBTSExJTksuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogSWYgLS1lbmFibGUtc2hhcmVkLCBhZGp1c3Qgc2hhcmVkIGxpYnJhcnkgc3R1ZmYKLQliYXNlZCBvbiB0aGUgaG9zdC4gIElmIHRoZSBob3N0IGlzIFN1bk9TLCBhbmQgdGhlIGxpbmtlciBzdXBwb3J0cwotCS1ycGF0aCwgc2V0IEhMREZMQUdTIHRvIHVzZSBpdC4KLQkqIE1ha2VmaWxlLmluIChBTExMSUJTKTogTmV3IHZhcmlhYmxlLgotCShQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsIFNITElCX0NGTEFHUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENPTU1PTl9TSExJQiwgU0hMSU5LKTogTmV3IHZhcmlhYmxlcy4KLQkoLmMubyk6IElmIFBJQ0ZMQUcgaXMgc2V0LCBjb21waWxlIHR3aWNlLCBvbmNlIFBJQywgb25jZSBub3JtYWwuCi0JKFNUQUdFU1RVRkYpOiBSZW1vdmUgdmFyaWFibGUuCi0JKGFsbCk6IERlcGVuZCB1cG9uICQoQUxMTElCUykgYW5kIEBQSUNMSVNUQCByYXRoZXIgdGhhbgotCSQoVEFSR0VUTElCKS4KLQkoc3RhbXAtb2ZpbGVzKTogTmV3IHRhcmdldCwgbGlrZSBvbGQgb2ZpbGVzIHRhcmdldCwgYnV0IGJ1aWxkCi0JdXNpbmcgYSB0ZW1wb3JhcnkgZmlsZSBhbmQgbW92ZS1pZi1jaGFuZ2UsIGFuZCB0b3VjaCBzdGFtcC1vZmlsZXMKLQl3aGVuIGRvbmUuCi0JKG9maWxlcyk6IEp1c3QgZGVwZW5kIHVwb24gc3RhbXAtb2ZpbGVzLgotCShzdGFtcC1waWNsaXN0LCBwaWNsaXN0KTogTmV3IHRhcmdldHMuCi0JKCQoU0hMSUIpLCAkKFNITElOSykpOiBOZXcgdGFyZ2V0cy4KLQkodGFyZ2V0cy5vLCBhcmNodXJlcy5vKTogQnVpbGQgdHdpY2UgaWYgUElDRkxBRyBpcyBzZXQuCi0JKGRvX21vc3RseWNsZWFuKTogUmVtb3ZlIHBpYy8qLm8uCi0JKGRvX2NsZWFuKTogUmVtb3ZlIHN0YW1wLW9maWxlcywgJChTSExJQiksICQoU0hMSU5LKSwgcGljbGlzdCwgYW5kCi0Jc3RhbXAtcGljbGlzdC4KLQkoZG9fZGlzdGNsZWFuKTogUmVtb3ZlIHBpYyBhbmQgc3RhbXAtcGljZGlyLgotCShpbnN0YWxsKTogSW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzLgotCSgkKE9GSUxFUykpOiBEZXBlbmQgdXBvbiBzdGFtcC1waWNkaXIuCi0JKHN0YW1wLXBpY2Rpcik6IE5ldyB0YXJnZXQuCi0KLQkqIGxpYmNvZmYtaW4uaDogQWRkIGNvbW1lbnQgcmVtaW5kaW5nIHBlb3BsZSB0aGF0IGxpYmNvZmYuaCBpcyBhCi0JZ2VuZXJhdGVkIGZpbGUuCi0JKiBsaWJjb2ZmLmg6IFJlYnVpbGQuCi0KLQkqIGVsZmxpbmsuaCAoZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCk6IERvbid0IHRyeSB0byBnZXQgdGhlCi0JZmxhdm91ciBvZiBhIHNlY3Rpb24gd2l0aCBubyBvd25lci4KLQotCSogZWxmMzItbWlwcy5jIChtaXBzX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IENsZWFyCi0JRUxGX0xJTktfTk9OX0VMRiBmbGFnLgotCShtaXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogZWxmLmM6IFJldmVydCBsYXN0IGNoYW5nZSwgc2luY2UgaXQgYnJlYWtzIGR5bmFtaWMgbGlua2luZy4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBSZW1vdmUgd2FudF9oZHJfaW5fc2VnCi0JZmllbGQuCi0JKiBlbGYzMi1taXBzLmMgKGVsZl9iYWNrZW5kX3dhbnRfaGRyX2luX3NlZyk6IERvbid0IGRlZmluZS4KLQkqIGVsZnh4LXRhcmdldC5oIChlbGZfYmFja2VuZF93YW50X2hkcl9pbl9zZWcpOiBEb24ndCBkZWZpbmUuCi0JKGVsZk5OX2JlZCk6IERvbid0IGluaXRpYWxpemUgd2FudF9oZHJfaW5fc2VnIGZpZWxkLgotCi1TdW4gRmViICA0IDIwOjQ1OjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiB0aGUgYmFja2VuZCBkb2VzCi0Jbm90IHdhbnQgdGhlIGVsZiBoZWFkZXIgb3IgdGhlIHByb2dyYW0gaGVhZGVycyBpbiB0aGUgYWRkcmVzcwotCXNwYWNlLCBkbyBub3QgaW5jbHVkZSB0aGVtIGluIHRoZSBjYWxjdWxhdGlvbnMuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKTogTmV3IGhvb2sKLQlmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgd2UgbmVlZCBhZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycy4KLQkocHBjX2VsZl9tb2RpZnlfc2VnbWVudF9tYXApOiBEZWZpbmUgYXMgYSBOT1AgZnVuY3Rpb24gZm9yIG5vdy4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiAuc2RhdGEyIGlzIGEgcmVhZC1vbmx5IHNlY3Rpb24uCi0KLVNhdCBGZWIgIDMgMjM6MDA6MDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oOiBNb3ZlIHRvZGF5J3MgbGliY29mZi5oIGNoYW5nZSBpbnRvIGNvZmZjb2RlLmguCi0KLVNhdCBGZWIgIDMgMTU6NDM6NDQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYuaCAoYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCk6IENvbWJpbmUgbWFjcm8gYXJncwotCWJhY2sgaW50byBvbmUgbGluZS4gIFNvbWUgY29tcGlsZXJzIChzdW5vcyA0LjEuMyBmb3IgZXhhbXBsZSkKLQl3b24ndCBhY2NlcHQgYXJncyBzcGxpdCBhY3Jvc3MgbW9yZSB0aGFuIG9uZSBsaW5lLgotCi1GcmkgRmViICAyIDExOjQyOjE1IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEJGRF9CSU5BUllfRk9QRU4pOiBVbmRlcnN0YW5kIGN5Z3dpbjMyLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1GcmkgRmViICAyIDEyOjEyOjE2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWxmMzItaHBwYS5jIChlbGYzMl9ocHBhX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpOiBEb24ndAotCXRyeSB0byBkbyBhcml0aG1ldGljIG9uIGEgdm9pZCAqLCBjYXN0IGl0IHRvIGEgdW5zaWduZWQgY2hhciAqIGZpcnN0LgotCi1UaHUgRmViICAxIDE2OjA0OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChFTEZfTElOS19OT05fRUxGKTogRGVmaW5lLgotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogU2V0IGVsZl9saW5rX2hhc2hfZmxhZ3MgdG8KLQlFTEZfTElOS19OT05fRUxGLgotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBSZXNldCBFTEZfTElOS19OT05fRUxGCi0JZmxhZyBmb3IgYSBuZXdseSBkZWZpbmVkIHN5bWJvbC4KLQkoTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpKTogTGlrZXdpc2UuCi0JKGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wpOiBJZiBFTEZfTElOS19OT05fRUxGIGlzIHNldCwgdHJ5IHRvCi0Jc2V0IHRoZSBERUYgb3IgUkVGX1JFR1VMQVIgZmxhZ3MgY29ycmVjdGx5LgotCi0JKiBNYWtlZmlsZS5pbiAoYmZkLWluMi5oKTogTWFrZSBiZmQuaCwgbm90IHByb3RvcywgaW4gZG9jZGlyLgotCShsaWJiZmQuaCwgbGliY29mZi5oKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLQkqIGVsZjMyLWkzODYuYyAoZWxmX2kzODZfY2hlY2tfcmVsb2NzKTogRG9uJ3QgcmVjb3JkIGEgc3ltYm9sIHdpdGgKLQlhIFBMVDMyIHJlbG9jIGFzIGR5bmFtaWMuCi0JKGVsZl9pMzg2X2FkanVzdF9keW5hbWljX3N5bWJvbCk6IElmIGEgc3ltYm9sIHdpdGggYSBQTFQzMiByZWxvYwotCWlzIG5vdCByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGFuZCB3ZSBhcmUgbm90IG1ha2luZyBhCi0Jc2hhcmVkIG9iamVjdCwgdGhlbiBkb24ndCBtYWtlIGEgUExUIGVudHJ5LiAgSWYgd2UgZG8gbWFrZSBhIFBMVAotCWVudHJ5LCBtYWtlIHN1cmUgdGhlIHN5bWJvbCBoYXMgYmVlbiByZWNvcmRlZCBhcyBkeW5hbWljLgotCi1XZWQgSmFuIDMxIDE3OjIzOjMyIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvZmYtaTM4Ni5jIChjb2ZmX2kzODZfcmVsb2NfdHlwZV9sb29rdXApOiBBZGQgQkZEX1JFTE9DXzMyX1BDUkVMLgotCSogY29uZmlnLmJmZCAoaVszNDVdODYtKi13aW4zMik6IEJlY29tZXMgaVszNDVdODYtKi1jeWd3aW4zMi4KLQkocG93ZXJwY2xlLSotY3lnd2luMzIpOiBOZXcuCi0JKiBwZWljb2RlLmggKGFkZF9kYXRhX2VudHJ5KTogR2V0IGFkZHJlc3MgZnJvbSB2bWEuCi0KLVdlZCBKYW4gMzEgMTY6MjM6NTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IElmIHRoZSBzeW1ib2wKLQlhdHRhY2hlZCB0byB0aGUgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYXMgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sLCB0cmVhdCBpdCBhcyBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC4KLQotV2VkIEphbiAzMSAxNjoxNjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2JmZF9maW5hbF9saW5rKTogRG9uJ3Qgb3V0cHV0IGluaXRpYWwgZHVtbXkKLQlzeW1ib2wgb3Igc2VjdGlvbiBzeW1ib2xzIGlmIHN0cmlwcGluZyBhbGwgc3ltYm9scyBhbmQgdGhpcyBpcyBub3QKLQlhIHJlbG9jYXRlYWJsZSBsaW5rLiAgRG9uJ3Qgb3V0cHV0IHRoZSBzeW1ib2wgc3RyaW5nIHRhYmxlIGlmCi0JdGhlcmUgYXJlIG5vIHN5bWJvbHMuCi0JKGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlcmUgYXJlIG5vCi0Jc3ltYm9scyB0byBmbHVzaC4KLQotV2VkIEphbiAzMSAxMjo1NTo0OSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29mZi1hdXguYzogTmV3IGZpbGUuCi0JKiBob3N0cy9tNjhrYXV4Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmJmZCAobTY4Ki1hcHBsZS1hdXgqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4Ki1hcHBsZS1hdXgqKTogTmV3IG5hdGl2ZSBob3N0LgotCShtNjhrYXV4X2NvZmZfdmVjKTogTmV3IHZlY3Rvci4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIHRhcmdldHMuYyAobTY4a2F1eF9jb2ZmX3ZlYyk6IERlY2xhcmUuCi0JKiBjb2ZmY29kZS5oIChiZmRfY29mZl9iYWNrZW5kX2RhdGEpOiBBZGQgZmllbGQKLQlfYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbC4KLQkoYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCk6IERlZmluZS4KLQkoY29tcGFyZV9hcmVsZW50X3B0cik6IE5ldyBzdGF0aWMgZnVuY3Rpb24gaWYgVEFSR19BVVguCi0JKGNvZmZfd3JpdGVfcmVsb2NzKTogSWYgVEFSR19BVVgsIHNvcnQgdGhlIHJlbG9jcy4KLQkoY29mZl93cml0ZV9vYmplY3RfY29udGVudHMpOiBTZXQgQS9VWCBhb3V0aGRyIG1hZ2ljIG51bWJlci4KLQkoY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShiZmRfY29mZl9zdGRfc3dhcF90YWJsZSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmxpbmsuYyAoY29mZl9saW5rX2FkZF9zeW1ib2xzKTogQ2FsbAotCWJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgcmF0aGVyIHRoYW4KLQlfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbC4KLQkqIGNvZmYtbTY4ay5jIChDT0ZGX1BBR0VfU0laRSk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0JKiBjb2ZmLWFscGhhLmMgKGFscGhhX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCSogY29mZi1taXBzLmMgKG1pcHNfZWNvZmZfYmFja2VuZF9kYXRhKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEJGRDMyX0JBQ0tFTkRTKTogQWRkIGNvZmYtYXV4Lm8uCi0JKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUyk6IEFkZCBjb2ZmLWF1eC5jLgotCi1XZWQgSmFuIDMxIDExOjM3OjQ2IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBGaXggUl82OEtfR09UKgotCXJlbG9jYXRpb247IGlnbm9yZSBhZGRlbmQgd2l0aCBSXzY4S197R09ULFBMVH0qTyByZWxvY2F0aW9uLgotCi1UdWUgSmFuIDMwIDEyOjA5OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRvX21haW50YWluZXJfY2xlYW4pOiBSZW1vdmUgJChzcmNkaXIpL2JmZC1pbjIuaCwKLQkkKHNyY2RpcikvbGliYmZkLmggYW5kICQoc3JjZGlyKS9saWJjb2ZmLmguCi0JKG1haW50YWluZXItY2xlYW4pOiBXYXJuIGFib3V0IGRlbGV0aW5nIHNwZWNpYWwgZmlsZXMuCi0JKGJmZC1pbjIuaCwgbGliYmZkLmgsIGxpYmNvZmYuaCk6IE5ldyB0YXJnZXRzLgotCi0JKiBlbGYzMi1ocHBhLmMgKGVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbik6IEhhbmRsZSBpbmRpcmVjdCBhbmQKLQl3YXJuaW5nIHN5bWJvbHMgY29ycmVjdGx5LgotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1tNjhrLmMgKGVsZl9tNjhrX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLW1pcHMuYyAobWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBzeW1zLmMgKF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lKTogQWRkIGNhc3RzIHRvIGF2b2lkCi0Jd2FybmluZ3MuCi0KLU1vbiBKYW4gMjkgMTQ6Mjc6MjQgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaDogYWxpZ25lZCBuZXdseSBleHBvcnRlZCBuYW1lcyB3aXRoIGJmZCBuYW1pbmcKLQljb252ZW50aW9ucy4gUmVtb3ZlZCBhbiBlcnJvbmVvdXMgZGVmaW5lIG9mIFBPV0VSUENfTEVfUEUuCi0gCSogbGliY29mZi5oOiBSZWJ1aWxkLgotCSogY29mZmxpbmsuYywgY29mZi1wcGMuYzogdGhlIGFib3ZlIGZ1bmN0aW9uIG5hbWUgY2hhbmdlcwotCi1Nb24gSmFuIDI5IDEzOjA2OjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQmFzaW0gS2FkaGltIDxrYWRoaW1Ac3BvY2suY3MuY29sb3JhZG8uZWR1PjoKLQkqIGVjb2ZmLmMgKHN0cnVjdCBleHRzeW1faW5mbyk6IERlZmluZS4KLQkoX2JmZF9lY29mZl9iZmRfZmluYWxfbGluayk6IFBhc3MgYSBwb2ludGVyIHRvIHN0cnVjdCBleHRzeW1faW5mbwotCXRvIGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwuCi0JKGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwpOiBBY2NlcHQgYSBzdHJ1Y3QgZXh0c3ltX2luZm8gcG9pbnRlci4KLQlTdHJpcCBzeW1ib2xzIHdoZW4gYXBwcm9wcmlhdGUuCi0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gUm9uYWxkIEYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPjoKLQkqIHN5bXMuYyAoQlNGX09CSkVDVCk6IERlZmluZS4KLQkoYmZkX3ByaW50X3N5bWJvbF92YW5kZik6IFByaW50ICdPJyBmb3IgQlNGX09CSkVDVC4KLQkqIGJmZC1pbjIuaDogUmVidWlsZC4KLQkqIGVsZmNvZGUuaCAoZWxmX3NsdXJwX3N5bWJvbF90YWJsZSk6IFNldCBCU0ZfT0JKRUNUIGZvciBhbgotCVNUVF9PQkpFQ1Qgc3ltYm9sLgotCSogZWxmLmMgKHN3YXBfb3V0X3N5bXMpOiBPbmx5IHNldCB0eXBlIHRvIFNUVF9PQkpFQ1QgaWYgQlNGX09CSkVDVAotCWlzIHNldC4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uKTogSWYgLUJzeW1ib2xpYywgd2hlbgotCWNvcHlpbmcgcmVsb2NzIGludG8gYSBzaGFyZWQgb2JqZWN0LCB0cmVhdCBhIGRlZmluZWQgZ2xvYmFsIHN5bWJvbAotCWFzIGEgbG9jYWwgc3ltYm9sLgotCSogZWxmMzItbTY4ay5jIChlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBlbGYzMi1taXBzLmMgKG1pcHNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkqIGVsZjMyLXNwYXJjLmMgKGVsZjMyX3NwYXJjX3JlbG9jYXRlX3NlY3Rpb24pOiBMaWtld2lzZS4KLQotCSogZWxmbGluay5oIChlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMpOiBPbmx5IHNldCB3ZWFrZGVmIHRvIGEKLQlyZWFsIGRlZmluZWQgc3ltYm9sLCBub3QgdG8gYSB3ZWFrIGRlZmluZWQgc3ltYm9sLgotCi1Nb24gSmFuIDI5IDExOjM0OjM2IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb2ZmbGluay5jOiByZW1vdmVkIHRoZSBQT1dFUlBDX0xFX1BFIGhhY2ssIHByb21vdGVkIHNvbWUgdHlwZXMKLQlhbmQgbWFkZSBhIGZldyBzdGF0aWMgZnVuY3Rpb25zIGV4dGVybnMuCi0KLQkqIGNvZmYtcHBjLmMgKHBwY19iZmRfY29mZl9maW5hbF9saW5rKTogbmV3IGZ1bmN0aW9uLCByZXBsYWNlcyB0aGUKLQlQT1dFUlBDX0xFX1BFIGhhY2sgaW4gY29mZmxpbmsuCi0KLQkqIGxpYmNvZmYtaW4uaDogcHJvbW90ZWQgdGhlIGZvbGxvd2luZyBmcm9tIGNvZmZsaW5rLmMgdG8gYWxsb3cKLQlfYmZkX2NvZmZfZmluYWxfbGluayB0byBiZSBvdmVycmlkZGVuIC0gIFNUUklOR19TSVpFX1NJWkUsCi0JY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50LCBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlLAotCWNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSwgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlLAotCWNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0LCAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUsCi0JY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2xvb2t1cCwgY29mZl9saW5rX3NlY3Rpb25faW5mbywKLQljb2ZmX2ZpbmFsX2xpbmtfaW5mbywgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMsCi0JY29mZl93cml0ZV9nbG9iYWxfc3ltLCBjb2ZmX2xpbmtfaW5wdXRfYmZkLCBjb2ZmX3JlbG9jX2xpbmtfb3JkZXIuCi0KLQkqIGxpYmNvZmYuaDogcmUtZ2VuJ2QKLQotRnJpIEphbiAyNiAxODozMzozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bXMuYzogSW5jbHVkZSAiYmZkbGluay5oIi4KLQkoc3RydWN0IHN0YWJfZmluZF9pbmZvKTogRGVmaW5lLgotCShfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpYmJmZC1pbi5oIChfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBBZGQgbGluZV9pbmZvIGZpZWxkLgotCSogZWxmLmMgKF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKTogVHJ5IGNhbGxpbmcKLQlfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSBiZWZvcmUgc2VhcmNoaW5nIHRoZSBFTEYKLQlzeW1ib2wgdGFibGUuICBGaW5kIHRoZSBjbG9zZXN0IFNUVF9GVU5DIHN5bWJvbCwgbm90IHRoZSBsYXN0IG9uZS4KLQkqIGxpYmNvZmYtaW4uaCAoY29mZl9kYXRhX3R5cGUpOiBBZGQgbGluZV9pbmZvIGZpZWxkLgotIAkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IFRyeSBjYWxsaW5nCi0JX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUgYmVmb3JlIHNlYXJjaGluZyB0aGUgQ09GRgotCXN5bWJvbCB0YWJsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotRnJpIEphbiAyNiAxNjoxMToxOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChSX1BQQ19FTUJfU0RBMjEgcmVsb2NhdGlvbnMpOiBNYWtlIHJlbG9jYXRpb24gc2l6ZQotCTQgYnl0ZXMsIHNvIHdlIGdldCB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIHVwZGF0aW5nIHRoZSByZWdpc3RlcgotCWZpZWxkIGluIGxpdHRsZSBlbmRpYW4gbW9kZS4KLQotVGh1IEphbiAyNSAxMjoxNDoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmNvZmYtaW4uaCAoc3RydWN0IHhjb2ZmX3RkYXRhKTogUmVtb3ZlIHRvY19zZWN0aW9uIGFuZAotCWVudHJ5X3NlY3Rpb24gZmllbGRzLiAgQWRkIHNudG9jIGFuZCBzbmVudHJ5IGZpZWxkcy4KLQkqIGxpYmNvZmYuaDogUmVidWlsZC4KLQkqIGNvZmZjb2RlLmggKGNvZmZfbWtvYmplY3RfaG9vayk6IEluaXRpYWxpemUgc250b2MgYW5kIHNuZW50cnksCi0Jbm90IHRvY19zZWN0aW9uIGFuZCBlbnRyeV9zZWN0aW9uICh0aGUgQ09GRiBmaWxlIGRvZXMgbm90IGhhdmUgYW55Ci0Jc2VjdGlvbnMgYXQgdGhpcyBwb2ludCkuCi0JKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogU2V0IG9fc25lbnRyeSBhbmQgb19zbnRvYyBmcm9tCi0Jc25lbnRyeSBhbmQgc250b2MgcmF0aGVyIHRoYW4gZW50cnlfc2VjdGlvbiBhbmQgdG9jX3NlY3Rpb24uCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpOiBDb3B5IHNudG9jIGFuZAotCXNuZW50cnksIG5vdCB0b2Nfc2VjdGlvbiBhbmQgZW50cnlfc2VjdGlvbi4KLQkqIHhjb2ZmbGluay5jIChiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogRG9uJ3Qgc2V0Ci0JZW50cnlfc2VjdGlvbiBmcm9tIGhlbnRyeS4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBJZiBhIGRlZmluZWQgc3ltYm9sIGhhcyBYQ09GRl9FTlRSWSBzZXQsCi0Jc2V0IHNuZW50eS4KLQkoeGNvZmZfbGlua19pbnB1dF9iZmQpOiBTZXQgc250b2MsIG5vdCB0b2Nfc2VjdGlvbi4KLQkoeGNvZmZfd3JpdGVfZ2xvYmFsX3N5bWJvbCk6IEdldCB0b2Nfc2VjdGlvbiBmcm9tIHNudG9jLCByYXRoZXIKLQl0aGFuIHVzaW5nIHRvY19zZWN0aW9uIGRpcmVjdGx5LgotCi0JKiBhcmNodXJlcy5jOiBBZGQgbWlzc2luZyBgLicgaW4gZW51bSBiZmRfYXJjaGl0ZWN0dXJlLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLXNjbyplbGYqKTogVXNlIGJmZF9lbGYzMl9pMzg2X3ZlYy4gIEZyb20KLQlSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgotCi1UaHUgSmFuIDI1IDEyOjA4OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQWRkIC5yZWxhLnNkYXRheywyfQotCXRvIHNlY3Rpb25zIHdlIGFsbG9jYXRlLiAgVXNlIGJmZF96YWxsb2MgdG8gYWxsb2NhdGUgaW5pdGlhbGlhbAotCXNlY3Rpb25zLCBub3QgYmZkX2FsbG9jLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFJlbW92ZSBCRkRfQVNTRVJUcyBmb3IgIXNoYXJlZCBmcm9tCi0JU0RBeywyfUkxNiByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9hZGRfc3ltYm9sX2hvb2spOiBVc2UgdGhlIHZhbHVlIG9mIC1HIG5uIHRvIGRldGVybWluZQotCXdoZXRoZXIgdG8gcHV0IHNvbWV0aGluZyBpbiAuc2JzcyBvciBub3QuCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEFkZCBzdXBwb3J0IGZvciBtb3JlIHJlbG9jYXRpb25zLiAgQWRkCi0JaW4gc2VjLT5vdXRwdXRfb2Zmc2V0IHdoZXJlIGFwcHJvcHJpYXRlLiAgTWFrZSBlcnJvciBtZXNzYWdlcwotCWluY2x1ZGUgdGhlIHN5bWJvbCBuYW1lLgotCi0JKiBlbGZsaW5rLmMgKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IExvb2t1cCBzeW1ib2wgYmVmb3JlCi0JdHJ5aW5nIHRvIGFkZCBpdCB0byB0aGUgc3ltYm9sIHRhYmxlLCBzbyBfR0xPQkFMX09GRlNFVF9UQUJMRV8KLQlkb2Vzbid0IGdldCByZWRlZmluZWQgbWVzc2FnZXMgaWYgLXNoYXJlZC4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pIE9ubHkgYnVtcCBSRUxBCi0Jc2VjdGlvbiBpZiB0aGUgcmVsX3NlY3Rpb24gZmllbGQgaGFzIGJlZW4gc2V0IHVwLgotCi1XZWQgSmFuIDI0IDIwOjQwOjI2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IEZpeCB0eXBvIGluIGVhYmkKLQlyZWxvY2F0aW9ucy4KLQotV2VkIEphbiAyNCAxMDozODozNCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IERlbGV0ZSBjaGVja2luZwotCW9mIGZsYWdzLCBvbmx5IGZsYWdzIHVzZWQgYXJlIGNvbnRyb2xsZWQgYnkgbWFjaCBudW1iZXIuICBCdW1wIHVwCi0Jb3V0cHV0IGZpbGUgbWFjaCBudW1iZXIgdG8gaGlnaGVzdCBvZiBpbnB1dCBmaWxlIG1hY2ggbnVtYmVycy4KLQkoZWxmMzJfc3BhcmNfb2JqZWN0X3ApOiBXYXRjaCBmb3IgRUZfU1BBUkNfU1VOX1VTMS4KLQkoZWxmMzJfc3BhcmNfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyk6IFNldCBFRl9TUEFSQ19TVU5fVVMxIGlmIHY4cGx1c2EuCi0KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQtKi17c3lzdjQqLHNvbGFyaXMyKn0pOiBDb21tZW50IG91dAotCWJmZF9lbGY2NF9zcGFyY192ZWMgc3VwcG9ydC4KLQotVHVlIEphbiAyMyAxNDozMzowNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IERvbid0IGNvbXBsYWluIGlmCi0JdGhlIGVtYmVkZGVkIGJpdCBpcyBzZXQgb24gc29tZSBvYmplY3RzIGFuZCBub3Qgb24gb3RoZXJzLiAgSnVzdAotCW9yIGl0IHRvZ2V0aGVyLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBJbXBsZW1lbnQgUl9QUENfRU1CX3tTREEyMSxSRUxTREF9Ci0JcmVsb2NhdGlvbnMuCi0KLVR1ZSBKYW4gMjMgMTQ6MjI6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb2ZmY29kZS5oIChjb2ZmX25ld19zZWN0aW9uX2hvb2spOiBEb24ndCB0cnkgdG8gYWxpZ24gdGhlCi0JLnN0YWJzdHIgc2VjdGlvbi4KLQotCSogY29mZmNvZGUuaCAoY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyk6IEZpeCB0aGUgaGFuZGxpbmcgb2YgdGhlCi0JLmxpYiBzZWN0aW9uIHRvIHdvcmsgZXZlbiBpZiB0aGUgZW50aXJlIHNlY3Rpb24gY29udGVudHMgYXJlCi0Jd3JpdHRlbiBhdCBvbmNlLiAgRnJvbSBHdnJhbiBVZGRlYm9yZyA8Z3ZyYW5AdWRkZWJvcmcucHAuc2U+IGFuZAotCVJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT4uCi0KLU1vbiBKYW4gMjIgMTg6NDU6NTEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGZsaW5rLmggKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IERvbid0IGFsbG9jYXRlCi0JbWVtb3J5IGhlcmUgZm9yIGNvbnRlbnRzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogQnVtcCB1cCBfU0RBX0JBU0VfIGFuZAotCV9TREEyX0JBU0VfIGJ5IDMyNzY4LgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6ICNpZiBvdXQgUExUIGNvZGUgd2hpY2ggd2UgaGF2ZW4ndAotCXN0YXJ0ZWQgdXNpbmcuICBBbGxvY2F0ZSBjb250ZW50cyBmb3IgLnNkYXRhIGFuZCAuc2RhdGEyIHNlY3Rpb25zCi0JYWxzby4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBVc2UgYmZkX2dldF9zZWN0aW9uX25hbWUgaW4gZGVidWcgbWVzc2FnZSwKLQlyYXRoZXIgdGhhbiBfbmFtZS4KLQkocHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wpOiBSZW1vdmUgY29kZSB0aGF0IGF0dGVtcHRlZCB0bwotCXNpemUgX1NEQXssMn1fQkFTRV8uCi0JKHBwY19lbGZfcmVsb2NhdGVfc2VjdGlvbik6IENoYW5nZSBob3cgc2RhdGF7LDJ9IHJlbG9jYXRpb25zIGFyZQotCWRvbmUuCi0KLU1vbiBKYW4gMjIgMDg6NTI6MDQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGVsZmxpbmsuaCAoZWxmX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRml4IHR5cG8uCi0KLQkqIGFyY2h1cmVzLmMgKGJmZF9tYWNoX3NwYXJjX3Y5KTogUmVuYW1lZCBmcm9tIGJmZF9tYWNoX3NwYXJjNjQuCi0JKGJmZF9tYWNoX3NwYXJjX3t2OHBsdXMsdjhwbHVzYX0pOiBEZWZpbmUuCi0JKGJmZF9tYWNoX3NwYXJjX3Y5YSk6IERlZmluZS4KLQkoYmZkX21hY2hfc3BhcmNfdjlfcCk6IERlZmluZS4KLQkqIGJmZC1pbjIuaDogUmVnZW5lcmF0ZWQuCi0JKiBhb3V0eC5oIChhb3V0LG1hY2hpbmVfdHlwZSk6IGJmZF9tYWNoX3NwYXJjNjQgcmVuYW1lZCB0bwotCWJmZF9tYWNoX3NwYXJjX3Y5LgotCSogZWxmNjQtc3BhcmMuYyAoc3BhcmM2NF9lbGZfb2JqZWN0X3ApOiBMaWtld2lzZS4KLQkqIGNvbmZpZy5iZmQgKHNwYXJjNjQtKi1zeXN2NCosc3BhcmM2NC0qLXNvbGFyaXMyKik6IFNldCB0YXJnX2RlZnZlYwotCXRvIGJmZF9lbGYzMl9zcGFyY192ZWMuCi0JKiBjcHUtc3BhcmMuYyAoYXJjaF9pbmZvX3N0cnVjdCk6IFJlbmFtZWQgZnJvbSBzcGFyY19hcmNoX2luZm8uCi0JQWRkIHY4cGx1c3ssYX0gc3VwcG9ydC4KLQlBZGQgdjlhIHN1cHBvcnQuCi0JKHNwYXJjX2NvbXBhdGlibGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbGYzMi1zcGFyYy5oOiAjaW5jbHVkZSAiZWxmL3NwYXJjLmgiLgotCShlbGYzMl9zcGFyY19tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBlbGYzMl9zcGFyY19vYmplY3RfcCwKLQllbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9ucy4KLQkoYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhLCBlbGZfYmFja2VuZF9vYmplY3RfcCwKLQllbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nKTogRGVmaW5lLgotCi1Nb24gSmFuIDIyIDExOjIxOjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmLWJmZC5oIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSk6IEFkZAotCWxpbmtlcl9zZWN0aW9uX3BvaW50ZXIgZmllbGQuCi0JKGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0pOiBFbnVtZXJhdGlvbiBmb3IgbmV3IHdheSBvZgotCWNyZWF0aW5nIGxpbmtlciBkeW5hbWljIHNlY3Rpb25zIGFuZCBzeW1ib2xzLgotCShlbGZfbGlua2VyX3NlY3Rpb257LF9wb2ludGVyc30pOiBOZXcgc3RydWN0dXJlcyBmb3IgY3JlYXRpbmcKLQlkeW5hbWljIHNlY3Rpb25zIGFuZCBzeW1ib2xzLgotCShlbGZfb2JqX3RkYXRhKTogQWRkIGxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzIGFuZCBsaW5rZXJfc2VjdGlvbgotCWZpZWxkcy4KLQkoZWxmX2xvY2FsX3B0cl9vZmZzZXRzLGVsZl9saW5rZXJfc2VjdGlvbik6IE5ldyBhY2Nlc3NvciBtYWNyb3MuCi0JKF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbik6IE5ldyBkZWNsYXJhdGlvbnMuCi0JKF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IERpdHRvLgotCShiZmRfZWxmezMyLDY0fV97Y3JlYXRlLGZpbmlzaH1fcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IERpdHRvLgotCShfYmZkX2VsZl9tYWtlX2xpbmtlcl9zZWN0aW9uX3JlbGEpOiBEaXR0by4KLQotCSogZWxmLmMgKF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jKTogSW5pdGlhbGl6ZSBuZXcgZmllbGRzLgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IERlbGV0ZS4KLQkocHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8gY3JlYXRlIHRoZQotCXNlY3Rpb25zIC5nb3QsIC5zZGF0YSwgYW5kIC5zZGF0YTIuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogWmFwIC5yZWxhLntzZGF0YSxzZGF0YTJ9IGlmCi0JbmVlZGVkLgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IFN1cHBvcnQgbW9yZSBvZiB0aGUgZWFiaSByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogRGl0dG8uCi0JKHBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9scyk6IEFkanVzdCBfU0RBeywyfV9CQVNFXyBieSAzMjc2OAotCWlmIHRoZSAuc2RhdGF7LDJ9ICsgLnNic3N7LDJ9IHNlY3Rpb24gc2l6ZSBpcyA+IDMyay4KLQotCSogZWxmbGluay5oIChlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8KLQljcmVhdGUgaW5pdGlhbGl6ZWQgcG9pbnRlcnMgaW4gZHluYW1pYyBsaW5rZXIgc2VjdGlvbnMuCi0JKGVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IEFjdHVhbGx5IGludGlhbGl6ZSB0aGUKLQlwb2ludGVycyBjcmVhdGVkIGFib3ZlLgotCi0JKiBlbGZjb2RlLmggKGJmZF9lbGZ7MzIsNjR9X2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogTmV3Ci0JbWFjcm9zIHRvIHByb3ZpZGUgYm90aCAzMiBhbmQgNjQgYml0IHZlcnNpb25zIG9mCi0JZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uLgotCShiZmRfZWxmezMyLDY0fV9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbik6IE5ldyBtYWNyb3MgdG8KLQlwcm92aWRlIGJvdGggMzIgYW5kIDY0IGJpdCB2ZXJzaW9ucyBvZgotCWVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbi4KLQotCSogZWxmbGluay5jIChfYmZkX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24gdG8KLQljcmVhdGUgYSBsaW5rZXIgc2VjdGlvbi4KLQkoX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKTogRmluZCBhIHVuaXF1ZSBwb2ludGVyIHRvIGEKLQlnaXZlbiBhZGRyZXNzIGluIHRoZSBsaW5rZXIgcG9pbnRlciBvZmZzZXRzIGNyZWF0ZWQgZm9yIGEgZ2l2ZW4KLQlzeW1ib2wuCi0JKF9iZmRfZWxmX21ha2VfbGlua2VyX3NlY3Rpb25fcmVsYSk6IE1ha2UgYSBSRUxBIHNlY3Rpb24KLQljb3JyZXNwb25kaW5nIHRvIHRoZSBnZW5lcmF0ZWQgbGlua2VyIHNlY3Rpb24uCi0KLVNhdCBKYW4gMjAgMDg6MzY6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItc3BhcmMuYyAoRUxGX01BQ0hJTkVfQUxUMSk6IERlZmluZS4KLQotVGh1IEphbiAxOCAxODoyNTozNCAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi1wcGMuYyAoY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbik6IGNoYW5nZWQgVE9DREVGTiByZWxvY3MuCi0JKGNvZmZfcHBjX3JlbG9jYXRlX3NlY3Rpb24pOiBIYW5kbGUgc3BlY2lhbCB2YWx1ZXMgZm9yIGdjYyBidWlsdCBkbGxzLgotCShkdW1wX3RvYyk6IGZpeCBkaWFnbm9zaW5nIGNvZGUgdG8gaWRlbnRpZnkgb3V0LW9mLXRvYy1ib3VuZHMgZW50cmllcy4KLQlBbHNvIGJlZ2luIHRoZSB0b2MgYXQgNCBhcyBhbiBleWUgY2F0Y2hlciAoJzMxMzEzMTMxJyBtYXJrcyB0aGUgZmlyc3QKLQl0b2MgZW50cnkgaW4gYW4gb2JqZHVtcCkgZm9yIG5vdy4KLQkocHBjX2RvX2xhc3QsIHBwY19nZXRfbGFzdCk6IE5ldyBmdW5jdGlvbiAtIG5lZWRlZCB0byBzYXZlIHByb2Nlc3NpbmcKLQl0aGUgdG9jIG93bmVyIHRvIHRoZSBlbmQuCi0JKHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2spOiBSZW1vdmVkIGFuIGluY29ycmVjdCBoYWNrIGZvciBkb2luZyB0aGUKLQl0b2Mgb3duZXIgbGFzdC4KLQotCSogY29mZmxpbmsuYyAoX2JmZF9jb2ZmX2ZpbmFsX2xpbmspOiBBZGRlZCBhIG5ldyBoYWNrIHRvIGtlZXAgdGhlCi0JdG9jIG93bmVyIGZyb20gYmVpbmcgZG9uZSB0aWxsIGxhc3QuIE11c3QgZGVmaW5lIFBPV0VSUENfTEVfUEMKLQl0byBlbmFibGUgaXQuCi0KLQkqIGNvZmZjb2RlLmggKGNvZmZfc2V0X2FsaWdubWVudF9ob29rKTogYWxpZ25tZW50IHNldHRpbmcgZm9yIC5zdGFiCi0KLQkqIHBlaWNvZGUuaCAoY29mZl9zd2FwX3Njbmhkcl9vdXQpOiBzZXQgc2VjdGlvbiBmbGFncyBmb3Igc3RhYi9zdHIKLQl0byBJTkZPLgotCShjb2ZmX3N3YXBfYW91dGhkcl9vdXQpOiBSZW1vdmVkIGEgbm9uLXdvcmtpbmcgaGFjayBmb3IgY29tcHV0aW5nIHRoZQotCVNpemVPZkltYWdlIGZvciBQb3dlclBDLiBJZ25vcmUgdGhlIHNpemUgb2YgdGhlIC5qdW5rIHNlY3Rpb24uCi0KLVRodSBKYW4gMTggMTc6NDI6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGZjb3JlLmg6IEluY2x1ZGUgPHNpZ25hbC5oPiBiZWZvcmUgPHN5cy9wcm9jZnMuaD4uCi0KLVdlZCBKYW4gMTcgMTI6NDA6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcHUtcG93ZXJwYy5jIChhcmNoX2luZm9fc3RydWN0KTogQ2hhbmdlIGxhc3QgZW50cnkgdG8gbm90IHBvaW50Ci0JYmFjayB0byBmaXJzdC4KLQkoYmZkX3Bvd2VycGNfYXJjaCk6IFBvaW50IGF0IGZpcnN0IGVudHJ5IGluIGFyY2hfaW5mb19zdHJ1Y3QuCi0KLVR1ZSBKYW4gMTYgMTU6MTA6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbGYuYyAoYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50cyk6IERvbid0IGluY3JlbWVudCBmaWxlCi0Jb2Zmc2V0IGZvciBhIHNlZ21lbnQgd2hpY2ggY29udGFpbnMgbm8gbG9hZGFibGUgc2VjdGlvbnMuCi0KLU1vbiBKYW4gMTUgMTc6NDY6MjcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiByZWxvYy5jOiBBZGQgbmV3IFBvd2VyUEMgcmVsb2NhdGlvbnMuCi0JKiB7YmZkLWluMixsaWJiZmR9Lmg6IFJlZ2VuZXJhdGUuCi0KLQkqIGVsZjMyLXBwYy5jIChwcGNfZWxmX2hvd3RvX3Jhdyk6IEFkZCBtb3JlIFBQQyByZWxvY2F0aW9ucy4KLQkocHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCk6IExvb2t1cCBuZXcgcmVsb2NhdGlvbnMuCi0KLU1vbiBKYW4gMTUgMTQ6Mjk6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhb3V0eC5oIChob3d0b190YWJsZV9leHQpOiBGaXggUkVMT0NfQkFTRTEwIGFuZCBSRUxPQ19CQVNFMjIKLQllbnRyaWVzLgotCi0JKiBzdW5vcy5jIChzdW5vc19zY2FuX2V4dF9yZWxvY3MpOiBEb24ndCBmYWlsIGFzc2VydCBpZgotICAgICAgICBpbmZvLT5zaGFyZWQuCi0KLQkqIGNvZmZnZW4uYyAoY29mZl9maW5kX25lYXJlc3RfbGluZSk6IERvbid0IHRyeSB0byBjYWNoZQotCWluZm9ybWF0aW9uIGluIHNlY3Rpb25zIHRoYXQgYXJlIG5vdCBvd25lZCBieSBhIEJGRC4gIEZyb20gUmljaGFyZAotCUhlbmRlcnNvbiA8cmljaGFyZEBhdGhlaXN0LnRhbXUuZWR1Pi4KLQotCSogZWxmMzItbWlwcy5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGR5bmFtaWMgbGlua2luZyBjb2RlLCBtb3N0bHkKLQlmcm9tIEthenVtb3RvIEtvamltYSA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+LgotCSogZWxmbGluay5oIChlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogUmVtb3ZlIHNwZWNpYWwgY2hlY2sgZm9yCi0JX3JsZF9uZXdfaW50ZXJmYWNlLgotCi0JKiBlY29mZnN3YXAuaDogQWRkIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuCi0KLVN1biBKYW4gMTQgMjE6MzY6MDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl97dW5zdXBwb3J0ZWQsc3RkfV9yZWxvYyk6IFJlbW92ZSBmdW5jdGlvbnMuCi0JKHBwY19lbGZfaG93dG9fcmF3KTogUmVtb3ZlIHBwY19lbGZfe3Vuc3VwcG9ydGVkLHN0ZH1fcmVsb2MKLQlyZWZlcmVuY2VzLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiAgTm8gbG9uZ2VyIGFsbG93IC5zZGF0YS8uc2JzcyBzZWN0aW9ucwotCXRvIHNhdGlzZnkgYSBUT0MxNiByZWxvY2F0aW9uLiAJUmV3cml0ZSB1bnN1cHBvcnRlZCByZWxvY2F0aW9uCi0Jc3VwcG9ydC4gIEJlZ2luIHN1cHBvcnQgZm9yIFJfUFBDX1NEQXsyLH1SRUwuCi0KLVNhdCBKYW4gMTMgMDk6MzY6NTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSB0aGUgLmdvdCBhbmQgLmdvdC5uZWcgc2VjdGlvbnMuCi0JKHBwY19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zKTogQ2FsbCBpdC4KLQkocHBjX2VsZl9jaGVja19yZWxvY3MpOiBDYWxsIGl0LgotCShwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyk6IFN1cHBvcnQgLmdvdC5uZWcsIGp1c3QgbGlrZSAuZ290LgotCShwcGNfZWxmX2NoZWNrX3JlbG9jcyk6IEFkZCBlcnJvciBtZXNzYWdlcyBmb3IgcmVsb2NhdGlvbnMgd2UKLQlkb24ndCB5ZXQgc3VwcG9ydC4gIERvIG5vdCBpbmNsdWRlIFJfUFBDX1NEQVJFTDE2IGxpa2UgYSBHT1QKLQlyZWxvY2F0aW9uLgotCi1GcmkgSmFuIDEyIDE1OjI3OjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfZmFrZV9zZWN0aW9ucyk6IERlZmluZSwgYW5kIGhhbmRsZSB0aGUgbmV3Ci0Jc2VjdGlvbiBmbGFncyBmb3IgVi40IGFuZCBlYWJpLgotCi1GcmkgSmFuIDEyIDEzOjU5OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBJZiBhIHNlZ21lbnQKLQljb250YWlucyBubyBzZWN0aW9ucywgZG9uJ3QgbWFyayBpdCBhcyByZWFkYWJsZS4KLQotCSogZWxmLWJmZC5oIChfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEZWNsYXJlLgotCSogZWxmY29kZS5oIChfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pOiBEb24ndCBkZWNsYXJlLgotCi0JKiBlbGYuYyAoX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSk6IER1bXAgY29udGVudHMgb2YKLQlkeW5hbWljIHNlY3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9zaXplX2luZm8pOiBBZGQgc3dhcF9keW5faW4gZmllbGQuCi0JKGJmZF9lbGYzMl9zd2FwX2R5bl9pbik6IENoYW5nZSB0eXBlIG9mIHNlY29uZCBwYXJhbWV0ZXIgdG8gUFRSLgotCShiZmRfZWxmNjRfc3dhcF9keW5faW4pOiBMaWtld2lzZS4KLQkqIGVsZmNvZGUuaCAoZWxmX3N3YXBfZHluX2luKTogQ2hhbmdlIHR5cGUgb2Ygc2Vjb25kIHBhcmFtZXRlciB0bwotCVBUUi4KLQkoTkFNRShfYmZkX2VsZixzaXplX2luZm8pKTogSW5pdGlhbGl6ZSBzd2FwX2R5bl9pbiBmaWVsZC4KLQotCSogZWxmMzItaTM4Ni5jIChlbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMpOiBEb24ndCBjcmVhdGUgYQotCURUX1RFWFRSRUwgZW50cnkgYmVjYXVzZSBvZiAucmVsLnBsdC4gIEZyb20gTWFydGluIFBpcmtlcgotCTxwaXJrZXJAZWl1bml4LnR1d2llbi5hYy5hdD4uCi0KLVRodSBKYW4gMTEgMTc6MDY6MTQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzZWN0aW9uLmMgKFNFQ197RVhDTFVERSxTT1JUX0VOVFJJRVN9KTogTmV3IHNlY3Rpb24gZmxhZ3MgZm9yCi0JUG93ZXJQQyBWLjQgYW5kIGVhYmkuCi0gCSogYmZkLWluMi5oOiBSZWdlbmVyYXRlLgotCSogbGliZmQuaDogUmVnZW5lcmF0ZS4KLQotCSogZWxmeHgtdGFyZ2V0LmggKFRBUkdFVF97QklHLExJVFRMRX1fU1lNKTogQWRkIG5ldyBmbGFncy4KLQotCSogZWxmMzItcHBjLmMgKHBwY19lbGZfc2VjdGlvbl9mcm9tX3NoZHIpOiBTdXBwb3J0IFNIVF9PUkRFUkVECi0Jc2VjdGlvbiB0eXBlIGFuZCBTSEZfRVhDTFVERSBzZWN0aW9uIGZsYWcsIHR1cm5pbmcgdGhlbSBpbnRvIHRoZQotCWFwcHJvcHJpYXRlIGJmZCBzZWN0aW9uIGZsYWcuCi0KLVRodSBKYW4gMTEgMTE6MjM6MzAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4Y29mZmxpbmsuYyAoeGNvZmZfbGlua19hZGRfc3ltYm9scyk6IENyZWF0ZSB0aGUgc3BlY2lhbAotCXNlY3Rpb25zIGlmIHdlIHNlZSBhIERZTkFNSUMgb2JqZWN0LCBpbiBjYXNlIHRoYXQgaXMgdGhlIG9ubHkKLQlYQ09GRiBpbnB1dCBvYmplY3Qgd2Ugc2VlLgotCi0JKiBlbGYzMi1taXBzLmM6IEV4dGVuc2l2ZSBjaGFuZ2VzIGZvciBhIHN0YXJ0IGF0IGR5bmFtaWMgbGlua2luZwotCXN1cHBvcnQsIGZyb20gS2F6dW1vdG8gS29qaW1hIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD4uCi0KLQkqIGVsZi1iZmQuaCAoc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEpOiBBZGQgdHlwZV9jaGFuZ2Vfb2sgZmllbGQuCi0JKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhKTogUmVtb3ZlCi0JZWxmX2JhY2tlbmRfY3JlYXRlX3Byb2dyYW1faGVhZGVycyBmaWVsZC4gIEFkZAotCWVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIGFuZAotCWVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCBmaWVsZHMuCi0JKiBlbGZ4eC10YXJnZXQuaCAoZWxmX2JhY2tlbmRfdHlwZV9jaGFuZ2Vfb2spOiBEZWZpbmUgaWYgbm90Ci0JZGVmaW5lZC4KLQkoZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpOiBMaWtld2lzZS4KLQkoZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKTogTGlrZXdpc2UuCi0JKGVsZl9iYWNrZW5kX2NyZWF0ZV9wcm9ncmFtX2hlYWRlcnMpOiBEb24ndCBkZWZpbmUuCi0JKGVsZk5OX2JlZCk6IENoYW5nZSB0byBhY2NvdW50IGZvciBmaWVsZCBjaGFuZ2VzLgotCSogZWxmLmMgKGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMpOiBDYWxsIG5ldwotCW1vZGlmeV9zZWdtZW50X21hcCBiYWNrZW5kIGZ1bmN0aW9uLiAgRG9uJ3QgY2FsbCBvbGQKLQljcmVhdGVfcHJvZ3JhbV9oZWFkZXJzIGJhY2tlbmQgZnVuY3Rpb24uCi0JKGdldF9wcm9ncmFtX2hlYWRlcl9zaXplKTogQ2FsbCBhZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycyByYXRoZXIKLQl0aGFuIGNyZWF0ZV9wcm9ncmFtX2hlYWRlcnMuCi0JKiBlbGZsaW5rLmggKGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyk6IEluaXRpYWxpemUKLQl0eXBlX2NoYW5nZV9vayBmcm9tIG5ldyBiYWNrZW5kIGZpZWxkLgotCShlbGZfbGlua19vdXRwdXRfZXh0c3ltKTogRG9uJ3Qgd2FybiBpZiBfcmxkX25ld19pbnRlcmZhY2UgaXMKLQlkZWZpbmVkLgotCShlbGZfcmVsb2NfbGlua19vcmRlcik6IFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sIGFzCi0JYSByZWxvYyBhZ2FpbnN0IHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9uLgotCi0JKiBlbGYtYmZkLmggKHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSk6IEFkZCB0ZGF0YSBmaWVsZC4KLQkoc3RydWN0IGVsZl9vYmpfdGRhdGEpOiBSZW5hbWUgcHBjX2ZsYWdzX2luaXQgZmllbGQgdG8gZmxhZ3NfaW5pdC4KLQkoZWxmX2ZsYWdzX2luaXQpOiBSZW5hbWUgZnJvbSBlbGZfcHBjX2ZsYWdzX2luaXQuCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyk6IFVzZSBlbGZfZmxhZ3NfaW5pdCwgbm90Ci0JZWxmX3BwY19mbGFnc19pbml0LgotCShwcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSk6IExpa2V3aXNlLgotCShwcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpOiBMaWtld2lzZS4KLQotCSogZWxmMzItbTY4ay5jIChob3d0b190YWJsZSk6IENoYW5nZSBzcmNfbWFzayB0byAwIGZvciBhbGwKLQlyZWxvY2F0aW9uIGVudHJpZXMuCi0KLVR1ZSBKYW4gIDkgMTU6MjI6NTMgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29mZi1hbHBoYS5jIChhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogRHVyaW5nIGZpbmFsIGxpbmssIGFsbG93Ci0gCW91dHB1dCAubGl0YSBzZWN0aW9uIHRvIGJlIGJpZ2dlciB0aGFuIDY0ayBieSBhZGp1c3RpbmcgZ3AgdmFsdWUKLSAJb24gYSBwZXItaW5wdXQgc2VjdGlvbiBiYXNpcy4KLQkqIGxpYmVjb2ZmLmggKHN0cnVjdCBlY29mZl90ZGF0YSk6IEFkZCBpc3N1ZWRfbXVsdGlwbGVfZ3Bfd2FybmluZwotCWZpZWxkLgotCShzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSk6IEFkZCBncCBmaWVsZC4KLQotVHVlIEphbiAgOSAxMjowMDozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlIYW5kbGUgQWxwaGEgRUNPRkYgY2hhbmdlcyBpbiBPU0YvMSAzLjIuCi0JKiBsaWJlY29mZi5oIChzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhKTogQWRkIGdldF9lbHRfYXRfZmlsZXBvcwotCWZpZWxkLgotCSogY29mZi1hbHBoYS5jOiBJbmNsdWRlICJhb3V0L2FyLmgiLgotCShhbHBoYV9lY29mZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpOiBEb24ndCByZXF1aXJlIGFuCi0JQUxQSEFfUl9JR05PUkUgcmVsb2MgYWZ0ZXIgYW4gQUxQSEFfUl9HUERJU1AgcmVsb2MsIHNpbmNlIE9TRi8xCi0JMy4yIGRvZXNuJ3QgZ2VuZXJhdGUgb25lLgotCShhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGFscGhhX2Vjb2ZmX3NsdXJwX2FybWFwKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfdHJ1bmNhdGVfYXJuYW1lKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl93cml0ZV9hcm1hcCk6IERlZmluZS4KLQkoYWxwaGFfZWNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KTogRGVmaW5lLgotCShhbHBoYV9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wKTogRGVmaW5lLgotCShBUkZaTUFHKTogRGVmaW5lLgotCShhbHBoYV9lY29mZl9yZWFkX2FyX2hkcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEpOiBJbml0aWFsaXplIGdldF9lbHRfYXRfZmlsZXBvcyBmaWVsZC4KLQkoZWNvZmZhbHBoYV9saXR0bGVfdmVjKTogQ2hhbmdlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgZnJvbQotCV9iZmRfZWNvZmYgdG8gYWxwaGFfZWNvZmYuCi0JKiBlY29mZi5jIChlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMpOiBVc2UgZ2V0X2VsdF9hdF9maWxlcG9zCi0JZmllbGQgZnJvbSBiYWNrZW5kIHN0cnVjdHVyZSwgcmF0aGVyIHRoYW4gYWx3YXlzIGNhbGxpbmcKLQlfYmZkX2dldF9lbHRfYXRfZmlsZXBvcy4KLQkqIGNvZmYtbWlwcy5jIChtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YSk6IEluaXRpYWxpemUKLQlnZXRfZWx0X2F0X2ZpbGVwb3MgZmllbGQuCi0JKiBhcmNoaXZlLmMgKF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcpOiBOZXcgZnVuY3Rpb24sIGNvcGllZAotCWZyb20gX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIHdpdGggbWlub3IgY2hhbmdlcy4KLQkoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyKTogVXNlIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcuCi0JKiBsaWJiZmQtaW4uaCAoX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyk6IERlY2xhcmUuCi0JKiBsaWJiZmQuaDogUmVidWlsZC4KLQotCSogYmZkLWluLmggKEJGRF9JTl9NRU1PUlkpOiBEZWZpbmUuCi0JKiBsaWJiZmQtaW4uaCAoc3RydWN0IGJmZF9pbl9tZW1vcnkpOiBEZWZpbmUuCi0JKiBsaWJiZmQuYyAoYmZkX3JlYWQpOiBIYW5kbGUgQkZEX0lOX01FTU9SWSBmbGFnLgotCShiZmRfZ2V0X2ZpbGVfd2luZG93KTogRG9uJ3QgdHJ5IHRvIG1hcCBhIEJGRF9JTl9NRU1PUlkgZmlsZS4KLQkoYmZkX3dyaXRlLCBiZmRfc3RhdCk6IEFib3J0IGlmIEJGRF9JTl9NRU1PUlkgaXMgc2V0LgotCShiZmRfdGVsbCwgYmZkX2ZsdXNoLCBiZmRfc2Vlayk6IEhhbmRsZSBCRkRfSU5fTUVNT1JZIGZsYWcuCi0JKiBiZmQuYyAoc3RydWN0IF9iZmQpOiBDaGFuZ2UgaW9zdHJlYW0gZmllbGQgZnJvbSBjaGFyICogdG8gUFRSLgotCShiZmRfZ2V0X3NpemUpOiBIYW5kbGUgQkZEX0lOX01FTU9SWSBmbGFnLgotCSogY2FjaGUuYyAoYmZkX2NhY2hlX2Nsb3NlKTogSWdub3JlIEJGRF9JTl9NRU1PUlkgZmlsZXMuCi0JKGJmZF9vcGVuX2ZpbGUpOiBDYXN0IHRvIFBUUiwgbm90IGNoYXIgKiwgd2hlbiBzZXR0aW5nIGlvc3RyZWFtLgotCShiZmRfY2FjaGVfbG9va3VwX3dvcmtlcik6IEFib3J0IGlmIEJGRF9JTl9NRU1PUlkgaXMgc2V0LgotCSogb3BuY2xzLmMgKGJmZF9mZG9wZW5yKTogQ2FzdCB0byBQVFIsIG5vdCBjaGFyICosIHdoZW4gc2V0dGluZwotCWlvc3RyZWFtLgotCShiZmRfb3BlbnN0cmVhbXIpOiBMaWtld2lzZS4KLQkqIGFvdXR4LmggKE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApKTogT25seSBmc3RhdCBpb3N0cmVhbSBpZgotCUJGRF9JTl9NRU1PUlkgaXMgbm90IHNldC4KLQkqIHJpc2NpeC5jIChyaXNjaXhfc29tZV9hb3V0X29iamVjdF9wKTogTGlrZXdpc2UuCi0JKiBiZmQtaW4yLmgsIGxpYmJmZC5oOiBSZWJ1aWxkLgotCi0JKiB0YXJnZXRzLmMgKGJmZF90YXJnZXQpOiBBZGQgX2JmZF9nZXRfZWx0X2F0X2luZGV4IGZpZWxkLgotCShCRkRfSlVNUF9UQUJMRV9BUkNISVZFKTogQWRkIF9nZXRfZWx0X2F0X2luZGV4LgotCShiZmRfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkqIGFyY2hpdmUuYyAoX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgpOiBSZW5hbWUgZnJvbQotCWJmZF9nZXRfZWx0X2F0X2luZGV4LiAgQ2hhbmdlIGluZGV4IHBhcmFtZXRlciBmcm9tIGludCB0bwotCXN5bWluZGV4LgotCSogbGliYmZkLWluLmggKF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4KTogRGVjbGFyZS4KLQkoX2JmZF9ub2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCk6IERlZmluZS4KLQkoX2JmZF9hcmNoaXZlX2JzZF9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCShfYmZkX2FyY2hpdmVfY29mZl9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogYmZkLWluMi5oLCBsaWJiZmQuaDogUmVidWlsZC4KLQkqIGFvdXQtdGFyZ2V0LmggKE1ZX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKiBjb2ZmLXJzNjAwMC5jICh4Y29mZl9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogaWVlZS5jIChpZWVlX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBsaWJlY29mZi5oIChfYmZkX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXgpOiBEZWZpbmUuCi0JKiBvYXN5cy5jIChvYXN5c19nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCSogc29tLmMgKHNvbV9nZXRfZWx0X2F0X2luZGV4KTogRGVmaW5lLgotCi0JKiBlY29mZi5jIChfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lKTogRG9uJ3QgcmVzdHJpY3QgbGluZQotCW51bWJlcnMgdG8gdGhlIC50ZXh0IHNlY3Rpb24uCi0KLU1vbiBKYW4gIDggMTc6MDA6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfd3JpdGVfZGVidWdfcGFydCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBib29sZWFuLgotCUlmIHRoZXJlIGlzIGEgU0VDX0RFQlVHR0lORyBzZWN0aW9uLCBnZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBkZWJ1ZwotCWluZm9ybWF0aW9uIHBhcnQgZnJvbSBpdC4KLQkoaWVlZV9zZXRfc2VjdGlvbl9jb250ZW50cyk6IFN0b3JlIHRoZSBjb250ZW50cyBvZiBhIFNFQ19ERUJVR0dJTkcKLQlzZWN0aW9uIGluIG1lbW9yeS4KLQkoaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMpOiBDaGVjayBpZWVlX3dyaXRlX2RlYnVnX3BhcnQgcmV0dXJuLgotCi1UaHUgSmFuICA0IDE3OjEyOjM3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuYmZkIChpWzM0NV04Ni0qLWZyZWVic2QqKTogQWRkIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4NmZyZWVic2RfdmVjKTogQWRkIHZlYy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIE1ha2VmaWxlLmluIChCRkQzMl9CQUNLRU5EUyk6IEFkZCBpMzg2ZnJlZWJzZC5vLgotCShCRkQzMl9CQUNLRU5EU19DRklMRVMpOiBBZGQgaTM4NmZyZWVic2QuYy4KLQlSZWJ1aWxkIGRlcGVuZGVuY2llcy4uCi0JKiBmcmVlYnNkLmg6IE5ldyBmaWxlLgotCSogaTM4NmZyZWVic2QuYzogTmV3IGZpbGUuCi0JKiB0YXJnZXRzLmMgKGkzODZmcmVlYnNkX3ZlYyk6IERlY2xhcmUuCi0JKGJmZF90YXJnZXRfdmVjdG9yKTogQWRkIGkzODZmcmVlYnNkX3ZlYy4KLQkqIGkzODZsaW51eC5jIChTRUdNRU5UX1NJWkUpOiBEZWZpbmUgYXMgVEFSR0VUX1BBR0VfU0laRQotCSogaTM4Nm5ldGJzZC5jIChTRUdNRU5UX1NJWkUpOiAgRGVmaW5lIGFzIFRBUkdFVF9QQUdFX1NJWkUKLQotVGh1IEphbiAgNCAxNjoyNzo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV9zbHVycF9kZWJ1Zyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGllZWVfb2JqZWN0X3ApOiBDYWxsIGl0LgotCShpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSk6IFNraXAgZGVidWdnaW5nIHNlY3Rpb25zLgotCShpZWVlX2dldF9yZWxvY191cHBlcl9ib3VuZCk6IExpa2V3aXNlLgotCShpZWVlX2dldF9zZWN0aW9uX2NvbnRlbnRzKTogTGlrZXdpc2UuCi0JKGllZWVfY2Fub25pY2FsaXplX3JlbG9jKTogTGlrZXdpc2UuCi0JKGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0KTogTGlrZXdpc2UuCi0JKGllZWVfd3JpdGVfZGVidWdfcGFydCk6IExpa2V3aXNlLgotCShpZWVlX3dyaXRlX2RhdGFfcGFydCk6IExpa2V3aXNlLgotCShpbml0X2Zvcl9vdXRwdXQpOiBMaWtld2lzZS4KLQotV2VkIEphbiAgMyAxOTo0Mjo0NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBlbGYzMi1wcGMuYyAocHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uKTogTWFrZSBAR09UIHJlbG9jYXRpb25zCi0Jd29yay4KLQkocHBjX2VsZl9ob3d0b19yYXcpOiBKdXN0IHVzZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgZm9yIGFsbCBob3d0bwotCXJlbG9jcywgc2luY2UgcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGhhbmRsZXMgdGhlIGxpbmtlciBjYXNlLgotCShwcGNfZWxmX3thZGRyMTZfaGEsZ290MTYsdG9jMTYsYnJ0YWtlbn1fcmVsb2MpOiBEZWxldGUsIG5vIGxvbmdlcgotCXVzZWQuCi0JKHBwY19lbGZfe2FkZHIxNl9oYSxnb3QxNix0b2MxNixicnRha2VufV9pbm5lcik6IE1lcmdlIHRoZXNlIGludG8KLQlwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gc2luY2UgdGhhdCBpcyBub3cgdGhlIG9ubHkgY2FsbGVyLgotCShwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24pOiBEaXR0by4KLQotV2VkIEphbiAgMyAxNToxMTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZjb2RlLmggKGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKTogSWYgd2UgZG9uJ3Qga25vdyB0aGUKLQlzZWN0aW9uIG9mIHRoZSBlbnRyeSBwb2ludCBmb3IgYW4gWENPRkYgZXhlY3V0YWJsZSwgYWx3YXlzIHNldCB0aGUKLQllbnRyeSBhZGRyZXNzIHRvIC0xLgotCi1UdWUgSmFuICAyIDE0OjE3OjE1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZWxmLmMgKGJmZF9zZWN0aW9uX2Zyb21fc2hkcik6IEFkZCBzdXBwb3J0IGZvciBub3RlIHNlY3Rpb25zLgotCi1UdWUgSmFuICAyIDEzOjEwOjI1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkLWluLmggKHN0cnVjdCBfc3ltYm9sX2luZm8pOiBBZGQgc3RhYl90eXBlIGZpZWxkLgotCSogYmZkLWluMi5oOiBSZWJ1aWxkLgotCSogYW91dHguaCAoTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykpOiBTZXQgc3RhYl90eXBlLgotCi0JKiBlbGYzMi1wcGMuYzogUmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmUgZnJvbSBjYWxscyB0bwotICAgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIuCi0JKHBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSk6IE9ubHkgd2FybiBhYm91dCBlbmRpYW5uZXNzCi0JZGlmZmVyZW5jZSBpZiB0YXJnZXQgZW5kaWFubmVzcyBpcyBrbm93bi4KLQotRm9yIG9sZGVyIGNoYW5nZXMgc2VlIENoYW5nZUxvZy05NDk1Ci0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBjaGFuZ2UtbG9nCi1sZWZ0LW1hcmdpbjogOAotZmlsbC1jb2x1bW46IDc0Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9iZmQvTWFrZWZpbGUuYW0gYi9iZmQvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWYzMWEuLjAwMDAwMDAKLS0tIGEvYmZkL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMTA4NSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUNTRUFSQ0ggPSAtSS4gLUkkKHNyY2RpcikgLUkkKElOQ0RJUikKLURFUCA9IG1rZGVwCi0KLVNVQkRJUlMgPSBkb2MgcG8KLQotZG9jZGlyID0gZG9jCi0KLWxpYl9MVExJQlJBUklFUyA9IGxpYmJmZC5sYQotCi0jIGJmZC5oIGdvZXMgaGVyZSwgZm9yIG5vdwotQkZEX0ggPSBiZmQuaAotCi0jIEppbSBLaW5nZG9uIG5vdGVzOgotIyBXcml0aW5nIFMtcmVjb3JkcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYWxsIChvciBhdCBsZWFzdCBtb3N0KQotIyAqLSotY29mZiwgKi0qLWFvdXQsIGV0Yy4sIGNvbmZpZ3VyYXRpb25zLCBiZWNhdXNlIHBlb3BsZSB3aWxsIHdhbnQgdG8KLSMgYmUgYWJsZSB0byB1c2Ugb2JqY29weSB0byBjcmVhdGUgUy1yZWNvcmRzLiAgKFMtcmVjb3JkcyBhcmUgbm90IHVzZWZ1bAotIyBmb3IgdGhlIGRlYnVnZ2VyLCBzbyBpZiB5b3UgYXJlIGRvd25sb2FkaW5nIHRoaW5ncyBhcyBTLXJlY29yZHMgeW91Ci0jIG5lZWQgdHdvIGNvcGllcyBvZiB0aGUgZXhlY3V0YWJsZSwgb25lIHRvIGRvd25sb2FkIGFuZCBvbmUgZm9yIHRoZQotIyBkZWJ1Z2dlcikuCi1CRkRfTElCUyA9IFwKLQlhcmNoaXZlLmxvIGFyY2h1cmVzLmxvIGJmZC5sbyBjYWNoZS5sbyBjb2ZmZ2VuLmxvIGNvcmVmaWxlLmxvIFwKLQlmb3JtYXQubG8gaW5pdC5sbyBsaWJiZmQubG8gb3BuY2xzLmxvIHJlbG9jLmxvIFwKLQlzZWN0aW9uLmxvIHN5bXMubG8gdGFyZ2V0cy5sbyBoYXNoLmxvIGxpbmtlci5sbyBcCi0Jc3JlYy5sbyBiaW5hcnkubG8gdGVraGV4LmxvIGloZXgubG8gc3RhYnMubG8gc3RhYi1zeW1zLmxvCi0KLUJGRF9MSUJTX0NGSUxFUyA9IFwKLQlhcmNoaXZlLmMgYXJjaHVyZXMuYyBiZmQuYyBjYWNoZS5jIGNvZmZnZW4uYyBjb3JlZmlsZS5jIFwKLQlmb3JtYXQuYyBpbml0LmMgbGliYmZkLmMgb3BuY2xzLmMgcmVsb2MuYyBcCi0Jc2VjdGlvbi5jIHN5bXMuYyB0YXJnZXRzLmMgaGFzaC5jIGxpbmtlci5jIFwKLQlzcmVjLmMgYmluYXJ5LmMgdGVraGV4LmMgaWhleC5jIHN0YWJzLmMgc3RhYi1zeW1zLmMKLQotIyBUaGlzIGxpc3QgaXMgYWxwaGFiZXRpemVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGtlZXAgaW4gc3luYwotIyB3aXRoIHRoZSBkZWNscyBhbmQgaW5pdGlhbGl6ZXIgaW4gYXJjaHVyZXMuYy4KLUFMTF9NQUNISU5FUyA9IFwKLQljcHUtYTI5ay5sbyBcCi0JY3B1LWFscGhhLmxvIFwKLQljcHUtYXJjLmxvIFwKLQljcHUtYXJtLmxvIFwKLQljcHUtZDEwdi5sbyBcCi0JY3B1LWQzMHYubG8gXAotCWNwdS1mcjMwLmxvIFwKLQljcHUtaDgzMDAubG8gXAotCWNwdS1oODUwMC5sbyBcCi0JY3B1LWhwcGEubG8gXAotCWNwdS1pMzg2LmxvIFwKLQljcHUtaTg2MC5sbyBcCi0JY3B1LWk5NjAubG8gXAotCWNwdS1tMzJyLmxvIFwKLQljcHUtbTY4ay5sbyBcCi0JY3B1LW04OGsubG8gXAotCWNwdS1tMTAyMDAubG8gXAotCWNwdS1tMTAzMDAubG8gXAotCWNwdS1tY29yZS5sbyBcCi0JY3B1LW1pcHMubG8gXAotCWNwdS1uczMyay5sbyBcCi0JY3B1LXBvd2VycGMubG8gXAotCWNwdS1yczYwMDAubG8gXAotCWNwdS1zaC5sbyBcCi0JY3B1LXNwYXJjLmxvIFwKLQljcHUtdGljMzAubG8gXAotCWNwdS10aWM4MC5sbyBcCi0JY3B1LXY4NTAubG8gXAotCWNwdS12YXgubG8gXAotCWNwdS13ZTMyay5sbyBcCi0JY3B1LXc2NS5sbyBcCi0JY3B1LXo4ay5sbwotCi1BTExfTUFDSElORVNfQ0ZJTEVTID0gXAotCWNwdS1hMjlrLmMgXAotCWNwdS1hbHBoYS5jIFwKLQljcHUtYXJjLmMgXAotCWNwdS1hcm0uYyBcCi0JY3B1LWQxMHYuYyBcCi0JY3B1LWQzMHYuYyBcCi0JY3B1LWZyMzAuYyBcCi0JY3B1LWg4MzAwLmMgXAotCWNwdS1oODUwMC5jIFwKLQljcHUtaHBwYS5jIFwKLQljcHUtaTM4Ni5jIFwKLQljcHUtaTg2MC5jIFwKLQljcHUtaTk2MC5jIFwKLQljcHUtbTMyci5jIFwKLQljcHUtbTY4ay5jIFwKLQljcHUtbTg4ay5jIFwKLQljcHUtbTEwMjAwLmMgXAotCWNwdS1tMTAzMDAuYyBcCi0JY3B1LW1jb3JlLmMgXAotCWNwdS1taXBzLmMgXAotCWNwdS1uczMyay5jIFwKLQljcHUtcG93ZXJwYy5jIFwKLQljcHUtcnM2MDAwLmMgXAotCWNwdS1zaC5jIFwKLQljcHUtc3BhcmMuYyBcCi0JY3B1LXRpYzMwLmMgXAotCWNwdS10aWM4MC5jIFwKLQljcHUtdjg1MC5jIFwKLQljcHUtdmF4LmMgXAotCWNwdS13ZTMyay5jIFwKLQljcHUtdzY1LmMgXAotCWNwdS16OGsuYwotCi0jIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSAzMiBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KLSMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLgotQkZEMzJfQkFDS0VORFMgPSBcCi0JYW91dC1hZG9iZS5sbyBcCi0JYW91dC1hcm0ubG8gXAotCWFvdXQtbnMzMmsubG8gXAotCWFvdXQtc3BhcmNsZS5sbyBcCi0JYW91dC10aWMzMC5sbyBcCi0JYW91dDAubG8gXAotCWFvdXQzMi5sbyBcCi0JYm91dC5sbyBcCi0JY2YtaTM4Nmx5bngubG8gXAotCWNmLW02OGtseW54LmxvIFwKLQljZi1zcGFyY2x5bngubG8gXAotCWNvZmYtYTI5ay5sbyBcCi0JY29mZi1hcG9sbG8ubG8gXAotCWNvZmYtYXJtLmxvIFwKLQljb2ZmLWF1eC5sbyBcCi0JY29mZi1oODMwMC5sbyBcCi0JY29mZi1oODUwMC5sbyBcCi0JY29mZi1pMzg2LmxvIFwKLQljb2ZmLWdvMzIubG8gXAotCWNvZmYtaTg2MC5sbyBcCi0JY29mZi1pOTYwLmxvIFwKLQljb2ZmLW02OGsubG8gXAotCWNvZmYtbTg4ay5sbyBcCi0JY29mZi1taXBzLmxvIFwKLQljb2ZmLXBtYWMubG8gXAotCWNvZmYtcnM2MDAwLmxvIFwKLQljb2ZmLXNoLmxvIFwKLQljb2ZmLXNwYXJjLmxvIFwKLQljb2ZmLXN0Z28zMi5sbyBcCi0JY29mZi1zdm02OGsubG8gXAotCWNvZmYtdGljMzAubG8gXAotCWNvZmYtdGljODAubG8gXAotCWNvZmYtdTY4ay5sbyBcCi0JY29mZi13ZTMyay5sbyBcCi0JY29mZi13NjUubG8gXAotCWNvZmYtejhrLmxvIFwKLQljb2ZmbGluay5sbyBcCi0JZHdhcmYxLmxvIFwKLQlkd2FyZjIubG8gXAotCWVjb2ZmLmxvIFwKLQllY29mZmxpbmsubG8gXAotCWVsZi5sbyBcCi0JZWxmMzItYXJjLmxvIFwKLQllbGZhcm0tb2FiaS5sbyBcCi0JZWxmYXJtLW5hYmkubG8gXAotCWVsZjMyLWQxMHYubG8gXAotCWVsZjMyLWQzMHYubG8gXAotCWVsZjMyLWZyMzAubG8gXAotCWVsZjMyLWdlbi5sbyBcCi0JZWxmMzItaHBwYS5sbyBcCi0JZWxmMzItaTM4Ni5sbyBcCi0JZWxmMzItaTg2MC5sbyBcCi0JZWxmMzItaTk2MC5sbyBcCi0JZWxmMzItbTMyci5sbyBcCi0JZWxmMzItbTY4ay5sbyBcCi0JZWxmMzItbTg4ay5sbyBcCi0JZWxmLW0xMDIwMC5sbyBcCi0JZWxmLW0xMDMwMC5sbyBcCi0JZWxmMzItbWNvcmUubG8gXAotCWVsZjMyLW1pcHMubG8gXAotCWVsZjMyLXBwYy5sbyBcCi0JZWxmMzItc2gubG8gXAotCWVsZjMyLXNwYXJjLmxvIFwKLQllbGYzMi12ODUwLmxvIFwKLQllbGYzMi5sbyBcCi0JZWxmbGluay5sbyBcCi0JZXBvYy1wZS1hcm0ubG8gXAotCWVwb2MtcGVpLWFybS5sbyBcCi0JaHAzMDBic2QubG8gXAotCWhwMzAwaHB1eC5sbyBcCi0Jc29tLmxvIFwKLQlpMzg2YW91dC5sbyBcCi0JaTM4NmJzZC5sbyBcCi0JaTM4NmR5bml4LmxvIFwKLQlpMzg2ZnJlZWJzZC5sbyBcCi0JaTM4NmxpbnV4LmxvIFwKLQlpMzg2bHlueC5sbyBcCi0JaTM4Nm1zZG9zLmxvIFwKLQlpMzg2bmV0YnNkLmxvIFwKLQlpMzg2bWFjaDMubG8gXAotCWkzODZvczlrLmxvIFwKLQlpZWVlLmxvIFwKLQltNjhrNGtuZXRic2QubG8gXAotCW02OGtsaW51eC5sbyBcCi0JbTY4a2x5bngubG8gXAotCW02OGtuZXRic2QubG8gXAotCW04OGttYWNoMy5sbyBcCi0JbWlwc2JzZC5sbyBcCi0JbmV3c29zMy5sbyBcCi0JbmxtLmxvIFwKLQlubG0zMi1pMzg2LmxvIFwKLQlubG0zMi1zcGFyYy5sbyBcCi0JbmxtMzItcHBjLmxvIFwKLQlubG0zMi5sbyBcCi0JbnMzMmtuZXRic2QubG8gXAotCW9hc3lzLmxvIFwKLQlwYzUzMi1tYWNoLmxvIFwKLQlwZS1hcm0ubG8gXAotCXBlaS1hcm0ubG8gXAotCXBlLWkzODYubG8gXAotCXBlaS1pMzg2LmxvIFwKLQlwZS1tY29yZS5sbyBcCi0JcGVpLW1jb3JlLmxvIFwKLQlwZS1wcGMubG8gXAotCXBlaS1wcGMubG8gXAotCXBwY2Jvb3QubG8gXAotCXJlbG9jMTYubG8gXAotCXJpc2NpeC5sbyBcCi0Jc3BhcmNsaW51eC5sbyBcCi0Jc3BhcmNseW54LmxvIFwKLQlzcGFyY25ldGJzZC5sbyBcCi0Jc3Vub3MubG8gXAotCXZheG5ldGJzZC5sbyBcCi0JdmVyc2Fkb3MubG8gXAotCXZtcy5sbyBcCi0Jdm1zLWdzZC5sbyBcCi0Jdm1zLWhkci5sbyBcCi0Jdm1zLW1pc2MubG8gXAotCXZtcy10aXIubG8gXAotCXhjb2ZmbGluay5sbwotCi1CRkQzMl9CQUNLRU5EU19DRklMRVMgPSBcCi0JYW91dC1hZG9iZS5jIFwKLQlhb3V0LWFybS5jIFwKLQlhb3V0LW5zMzJrLmMgXAotCWFvdXQtc3BhcmNsZS5jIFwKLQlhb3V0LXRpYzMwLmMgXAotCWFvdXQwLmMgXAotCWFvdXQzMi5jIFwKLQlib3V0LmMgXAotCWNmLWkzODZseW54LmMgXAotCWNmLW02OGtseW54LmMgXAotCWNmLXNwYXJjbHlueC5jIFwKLQljb2ZmLWEyOWsuYyBcCi0JY29mZi1hcG9sbG8uYyBcCi0JY29mZi1hcm0uYyBcCi0JY29mZi1hdXguYyBcCi0JY29mZi1oODMwMC5jIFwKLQljb2ZmLWg4NTAwLmMgXAotCWNvZmYtaTM4Ni5jIFwKLQljb2ZmLWk4NjAuYyBcCi0JY29mZi1nbzMyLmMgXAotCWNvZmYtaTk2MC5jIFwKLQljb2ZmLW02OGsuYyBcCi0JY29mZi1tODhrLmMgXAotCWNvZmYtbWlwcy5jIFwKLQljb2ZmLXBtYWMuYyBcCi0JY29mZi1yczYwMDAuYyBcCi0JY29mZi1zaC5jIFwKLQljb2ZmLXNwYXJjLmMgXAotCWNvZmYtc3RnbzMyLmMgXAotCWNvZmYtc3ZtNjhrLmMgXAotCWNvZmYtdGljMzAuYyBcCi0JY29mZi10aWM4MC5jIFwKLQljb2ZmLXU2OGsuYyBcCi0JY29mZi13ZTMyay5jIFwKLQljb2ZmLXc2NS5jIFwKLQljb2ZmLXo4ay5jIFwKLQljb2ZmbGluay5jIFwKLQlkd2FyZjEuYyBcCi0JZHdhcmYyLmMgXAotCWVjb2ZmLmMgXAotCWVjb2ZmbGluay5jIFwKLQllbGYuYyBcCi0JZWxmMzItYXJjLmMgXAotCWVsZmFybS1vYWJpLmMgXAotCWVsZmFybS1uYWJpLmMgXAotCWVsZjMyLWQxMHYuYyBcCi0JZWxmMzItZDMwdi5jIFwKLQllbGYzMi1mcjMwLmMgXAotCWVsZjMyLWdlbi5jIFwKLQllbGYzMi1ocHBhLmMgXAotCWVsZjMyLWkzODYuYyBcCi0JZWxmMzItaTg2MC5jIFwKLQllbGYzMi1pOTYwLmMgXAotCWVsZjMyLW0zMnIuYyBcCi0JZWxmMzItbTY4ay5jIFwKLQllbGYzMi1tODhrLmMgXAotCWVsZi1tMTAyMDAuYyBcCi0JZWxmLW0xMDMwMC5jIFwKLQllbGYzMi1tY29yZS5jIFwKLQllbGYzMi1taXBzLmMgXAotCWVsZjMyLXBwYy5jIFwKLQllbGYzMi1zaC5jIFwKLQllbGYzMi1zcGFyYy5jIFwKLQllbGYzMi12ODUwLmMgXAotCWVsZjMyLmMgXAotCWVsZmxpbmsuYyBcCi0JZXBvYy1wZS1hcm0uYyBcCi0JZXBvYy1wZWktYXJtLmMgXAotCWhwMzAwYnNkLmMgXAotCWhwMzAwaHB1eC5jIFwKLQlzb20uYyBcCi0JaTM4NmFvdXQuYyBcCi0JaTM4NmJzZC5jIFwKLQlpMzg2ZHluaXguYyBcCi0JaTM4NmZyZWVic2QuYyBcCi0JaTM4NmxpbnV4LmMgXAotCWkzODZseW54LmMgXAotCWkzODZtc2Rvcy5jIFwKLQlpMzg2bmV0YnNkLmMgXAotCWkzODZtYWNoMy5jIFwKLQlpMzg2b3M5ay5jIFwKLQlpZWVlLmMgXAotCW02OGs0a25ldGJzZC5jIFwKLQltNjhrbGludXguYyBcCi0JbTY4a2x5bnguYyBcCi0JbTY4a25ldGJzZC5jIFwKLQltODhrbWFjaDMuYyBcCi0JbWlwc2JzZC5jIFwKLQluZXdzb3MzLmMgXAotCW5sbS5jIFwKLQlubG0zMi1pMzg2LmMgXAotCW5sbTMyLXNwYXJjLmMgXAotCW5sbTMyLXBwYy5jIFwKLQlubG0zMi5jIFwKLQluczMya25ldGJzZC5jIFwKLQlvYXN5cy5jIFwKLQlwYzUzMi1tYWNoLmMgXAotCXBlLWFybS5jIFwKLQlwZWktYXJtLmMgXAotCXBlLWkzODYuYyBcCi0JcGVpLWkzODYuYyBcCi0JcGUtbWNvcmUuYyBcCi0JcGVpLW1jb3JlLmMgXAotCXBlLXBwYy5jIFwKLQlwZWktcHBjLmMgXAotCXBwY2Jvb3QuYyBcCi0JcmVsb2MxNi5jIFwKLQlyaXNjaXguYyBcCi0Jc3BhcmNsaW51eC5jIFwKLQlzcGFyY2x5bnguYyBcCi0Jc3BhcmNuZXRic2QuYyBcCi0Jc3Vub3MuYyBcCi0JdmF4bmV0YnNkLmMgXAotCXZlcnNhZG9zLmMgXAotCXZtcy5jIFwKLQl2bXMtZ3NkLmMgXAotCXZtcy1oZHIuYyBcCi0Jdm1zLW1pc2MuYyBcCi0Jdm1zLXRpci5jIFwKLQl4Y29mZmxpbmsuYwotCi0jIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSA2NCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KLSMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsCi0jIGFuZCAtLWVuYWJsZS02NC1iaXQtYmZkLgotQkZENjRfQkFDS0VORFMgPSBcCi0JYW91dDY0LmxvIFwKLQljb2ZmLWFscGhhLmxvIFwKLQlkZW1vNjQubG8gXAotCWVsZjY0LWFscGhhLmxvIFwKLQllbGY2NC1nZW4ubG8gXAotCWVsZjY0LW1pcHMubG8gXAotCWVsZjY0LXNwYXJjLmxvIFwKLQllbGY2NC5sbyBcCi0JbmxtMzItYWxwaGEubG8gXAotCW5sbTY0LmxvCi0KLUJGRDY0X0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhb3V0NjQuYyBcCi0JY29mZi1hbHBoYS5jIFwKLQlkZW1vNjQuYyBcCi0JZWxmNjQtYWxwaGEuYyBcCi0JZWxmNjQtZ2VuLmMgXAotCWVsZjY0LW1pcHMuYyBcCi0JZWxmNjQtc3BhcmMuYyBcCi0JZWxmNjQuYyBcCi0JbmxtMzItYWxwaGEuYyBcCi0JbmxtNjQuYwotCi1PUFRJT05BTF9CQUNLRU5EUyA9IFwKLQlhaXgzODYtY29yZS5sbyBcCi0JaHB1eC1jb3JlLmxvIFwKLQlpcml4LWNvcmUubG8gXAotCWx5bngtY29yZS5sbyBcCi0Jb3NmLWNvcmUubG8gXAotCXNjbzUtY29yZS5sbyBcCi0JdHJhZC1jb3JlLmxvIFwKLQljaXNjby1jb3JlLmxvCi0KLU9QVElPTkFMX0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhaXgzODYtY29yZS5jIFwKLQlocHV4LWNvcmUuYyBcCi0JaXJpeC1jb3JlLmMgXAotCWx5bngtY29yZS5jIFwKLQlvc2YtY29yZS5jIFwKLQlzY281LWNvcmUuYyBcCi0JdHJhZC1jb3JlLmMgXAotCWNpc2NvLWNvcmUuYwotCi0jIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IGNvbmZpZ3VyZS5pbjoKLVdPUkRTSVpFID0gQHdvcmRzaXplQAotQUxMX0JBQ0tFTkRTID0gQGFsbF9iYWNrZW5kc0AKLUJGRF9CQUNLRU5EUyA9IEBiZmRfYmFja2VuZHNACi1CRkRfTUFDSElORVMgPSBAYmZkX21hY2hpbmVzQAotVERFRkFVTFRTID0gQHRkZWZhdWx0c0AKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIEBIREVGSU5FU0AgQENPUkVGTEFHQCBAVERFRklORVNAICQoQ1NFQVJDSCkgJChDU1dJVENIRVMpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCi0KLSMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCi1DRklMRVMgPSBcCi0JJChCRkRfTElCU19DRklMRVMpIFwKLQkkKEFMTF9NQUNISU5FU19DRklMRVMpIFwKLQkkKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKSBcCi0JJChPUFRJT05BTF9CQUNLRU5EU19DRklMRVMpCi0KLSMjIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCAuaCBmaWxlcyB3aGljaCBhcmUgaW4gdGhlIHNvdXJjZSB0cmVlLgotU09VUkNFX0hGSUxFUyA9IFwKLQlhb3V0LXRhcmdldC5oIGFvdXRmMS5oIGFvdXR4LmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKLQllY29mZnN3YXAuaCBlbGYzMi1hcm0uaCBlbGYzMi1ocHBhLmggZWxmY29kZS5oIGVsZmNvcmUuaCBcCi0JZWxmbGluay5oIGZyZWVic2QuaCBnZW5saW5rLmggZ28zMnN0dWIuaCBocHBhX3N0dWJzLmggbGliYW91dC5oIFwKLQlsaWJiZmQuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBlbGYtYmZkLmggbGliaHBwYS5oIGxpYmllZWUuaCBcCi0JbGlibmxtLmggbGlib2FzeXMuaCBuZXRic2QuaCBubG0tdGFyZ2V0LmggbmxtY29kZS5oIG5sbXN3YXAuaCBcCi0JbnMzMmsuaCBwZWljb2RlLmggc29tLmggdm1zLmgKLQotSEZJTEVTID0gXAotCWVsZjMyLXRhcmdldC5oIGVsZjY0LXRhcmdldC5oIHRhcmdtYXRjaC5oIFwKLQkkKFNPVVJDRV9IRklMRVMpCi0KLVBPVEZJTEVTID0gJChDRklMRVMpICQoU09VUkNFX0hGSUxFUykKLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotZGlzdHN0dWZmOiBpbmZvCi0KLSMgVmFyaW91cyBraW5kcyBvZiAubyBmaWxlcyB0byBwdXQgaW4gbGliYmZkLmE6Ci0jIEJGRF9CQUNLRU5EUwlSb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCi0jIEJGRF9NQUNISU5FUwlBcmNoaXRlY3R1cmUtc3BlY2lmaWMgcm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBDT1JFRklMRQlDb3JlIGZpbGUgcm91dGluZXMgZm9yIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24KLU9GSUxFUyA9ICQoQkZEX0JBQ0tFTkRTKSAkKEJGRF9NQUNISU5FUykgQENPUkVGSUxFQAotCi1zdGFtcC1vZmlsZXM6IE1ha2VmaWxlCi0Jcm0gLWYgdG9maWxlcwotCWY9IiI7IFwKLQlmb3IgaSBpbiAkKE9GSUxFUykgOyBkbyBcCi0JICBjYXNlICIgJCRmICIgaW4gXAotCSAgICAqIiAkJGkgIiopIDs7IFwKLQkgICAgKikgZj0iJCRmICQkaSIgOzsgXAotCSAgZXNhYyA7IFwKLQlkb25lIDsgXAotCWVjaG8gJCRmID4gdG9maWxlcwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0b2ZpbGVzIG9maWxlcwotCXRvdWNoIHN0YW1wLW9maWxlcwotCi1vZmlsZXM6IHN0YW1wLW9maWxlcyA7IEB0cnVlCi0KLWxpYmJmZF9sYV9TT1VSQ0VTID0gJChCRkRfTElCU19DRklMRVMpCi1saWJiZmRfbGFfREVQRU5ERU5DSUVTID0gJChPRklMRVMpIG9maWxlcwotbGliYmZkX2xhX0xJQkFERCA9IGBjYXQgb2ZpbGVzYCBAV0lOMzJMSUJBRERACi1saWJiZmRfbGFfTERGTEFHUyA9IC1yZWxlYXNlICQoVkVSU0lPTikgQFdJTjMyTERGTEFHU0AKLQotIyBsaWJ0b29sIHdpbGwgYnVpbGQgLmxpYnMvbGliYmZkLmEuICBXZSBjcmVhdGUgbGliYmZkLmEgaW4gdGhlIGJ1aWxkCi0jIGRpcmVjdG9yeSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29udmVydCBhbGwgdGhlIHByb2dyYW1zIHRoYXQgdXNlCi0jIGxpYmJmZC5hIHNpbXVsdGFuZW91c2x5LiAgVGhpcyBpcyBhIGhhY2sgd2hpY2ggc2hvdWxkIGJlIHJlbW92ZWQgaWYKLSMgZXZlcnl0aGluZyBlbHNlIHN0YXJ0cyB1c2luZyBsaWJ0b29sLiAgRklYTUUuCi0KLW5vaW5zdF9MSUJSQVJJRVMgPSBsaWJiZmQuYQotbGliYmZkX2FfU09VUkNFUyA9Ci0KLXN0YW1wLWxpYjogbGliYmZkLmxhCi0JaWYgWyAtZiAubGlicy9saWJiZmQuYSBdOyB0aGVuIFwKLQkgIGNwIC5saWJzL2xpYmJmZC5hIGxpYmJmZC50bXA7IFwKLQkgICQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQudG1wIGxpYmJmZC5hOyBcCi0JZWxzZSB0cnVlOyBmaQotCXRvdWNoIHN0YW1wLWxpYgotCi1saWJiZmQuYTogc3RhbXAtbGliIDsgQHRydWUKLQotIyBUaGlzIGZpbGUgaG9sZHMgYW4gYXJyYXkgYXNzb2NpYXRpbmcgY29uZmlndXJhdGlvbiB0cmlwbGV0cyBhbmQKLSMgdmVjdG9yIG5hbWVzLiAgSXQgaXMgYnVpbHQgZnJvbSBjb25maWcuYmZkLiAgSXQgaXMgbm90IGNvbXBpbGVkIGJ5Ci0jIGl0c2VsZiwgYnV0IGlzIGluY2x1ZGVkIGJ5IHRhcmdldHMuYy4KLXRhcmdtYXRjaC5oOiBjb25maWcuYmZkIHRhcmdtYXRjaC5zZWQKLQlybSAtZiB0YXJnbWF0Y2guaAotCXNlZCAtZiAkKHNyY2RpcikvdGFyZ21hdGNoLnNlZCA8ICQoc3JjZGlyKS9jb25maWcuYmZkID4gdGFyZ21hdGNoLm5ldwotCW12IC1mIHRhcmdtYXRjaC5uZXcgdGFyZ21hdGNoLmgKLQotIyBXaGVuIGNvbXBpbGluZyBhcmNodXJlcy5jIGFuZCB0YXJnZXRzLmMsIHN1cHBseSB0aGUgZGVmYXVsdCB0YXJnZXQKLSMgaW5mbyBmcm9tIGNvbmZpZ3VyZS4KLQotdGFyZ2V0cy5sbzogdGFyZ2V0cy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS90YXJnZXRzLmMKLQotYXJjaHVyZXMubG86IGFyY2h1cmVzLmMgY29uZmlnLnN0YXR1cwotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkKFRERUZBVUxUUykgJChzcmNkaXIpL2FyY2h1cmVzLmMKLQotZWxmMzItdGFyZ2V0LmggOiBlbGZ4eC10YXJnZXQuaAotCXJtIC1mIGVsZjMyLXRhcmdldC5oCi0Jc2VkIC1lIHMvTk4vMzIvZyA8ICQoc3JjZGlyKS9lbGZ4eC10YXJnZXQuaCA+IGVsZjMyLXRhcmdldC5uZXcKLQltdiAtZiBlbGYzMi10YXJnZXQubmV3IGVsZjMyLXRhcmdldC5oCi0KLWVsZjY0LXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGY2NC10YXJnZXQuaAotCXNlZCAtZSBzL05OLzY0L2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGY2NC10YXJnZXQubmV3Ci0JbXYgLWYgZWxmNjQtdGFyZ2V0Lm5ldyBlbGY2NC10YXJnZXQuaAotCi1CRkRfSF9ERVBTPSAkKElOQ0RJUikvYW5zaWRlY2wuaAotTE9DQUxfSF9ERVBTPSBsaWJiZmQuaCBzeXNkZXAuaCBjb25maWcuaAotJChCRkRfTElCUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKEJGRF9NQUNISU5FUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKEJGRF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0kKE9QVElPTkFMX0JBQ0tFTkRTKTogJChCRkRfSCkgJChCRkRfSF9ERVBTKSAkKExPQ0FMX0hfREVQUykKLQotIyBJbnN0YWxsIEJGRCBpbmNsdWRlIGZpbGUsIGFuZCBvdGhlcnMgdGhhdCBpdCBuZWVkcy4KLWluc3RhbGwtZGF0YS1sb2NhbDogJChCRkRfSCkKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoaW5jbHVkZWRpcikKLQkkKElOU1RBTExfREFUQSkgJChCRkRfSCkgJChpbmNsdWRlZGlyKS9iZmQuaAotCSQoSU5TVEFMTF9EQVRBKSAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKGluY2x1ZGVkaXIpL2Fuc2lkZWNsLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2JmZGxpbmsuaCAkKGluY2x1ZGVkaXIpL2JmZGxpbmsuaAotCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiAuZGVwMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGJmZC5oCi0Jcm0gLWYgLmRlcDEKLQkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKLQlzZWQgLWYgZGVwLnNlZCA8LmRlcDEgPi5kZXAKLQotIyBUaGlzIHJ1bGUgcmVhbGx5IHdhbnRzIGEgbWtkZXAgdGhhdCBydW5zICJnY2MgLU1NIi4KLSMgVGhlIE5ldEJTRCBta2RlcCBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBmaWxlIGNvbnRlbnRzLCBhbmQgZG9lc24ndCBpbnNlcnQKLSMgdGhlICJETyBOT1QgREVMRVRFIiBsaW5lLgotIyBPdGhlciBta2RlcCB2ZXJzaW9ucyByZXF1aXJlIGEgZmlsZSB0aGF0IGFscmVhZHkgZXhpc3RzLCBhbmQgZG8gaW5zZXJ0IGl0LgotIyBIZW5jZSB0aGUgd2VpcmRuZXNzLi4uLgotLmRlcDE6ICQoQ0ZJTEVTKQotCXJtIC1mIC5kZXAyIC5kZXAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKLQllY2hvID4gLmRlcDJhCi0JJChERVApIC1mIC5kZXAyYSAkKElOQ0xVREVTKSAkKENGTEFHUykgJD8KLQlzZWQgLWUgJy9ETyBOT1QgREVMRVRFL2QnIC1lICcvXiQkL2QnIDwgLmRlcDJhID4+IC5kZXAyCi0Jcm0gLWYgLmRlcDJhCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi1ob3N0LWFvdXQubG86IE1ha2VmaWxlCi0KLSMgVGhlIGZvbGxvd2luZyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgc2ltcGxlIGNvbmZpZyBmaWxlCi0jIHdoaWNoIGNhbiBiZSBmb2xkZWQgaW50byBhbiBoLVhYWCBmaWxlIGZvciBhIG5ldyBob3N0LCB3aXRoIHNvbWUgZWRpdGluZy4KLWFvdXQtcGFyYW1zLmg6IGdlbi1hb3V0Ci0JLi9nZW4tYW91dCBob3N0ID4gYW91dC1wYXJhbXMuaAotZ2VuLWFvdXQ6ICQoc3JjZGlyKS9nZW4tYW91dC5jIE1ha2VmaWxlCi0JJChDQykgLW8gZ2VuLWFvdXQgJChDRkxBR1MpICQoTEZMQUdTKSAkKHNyY2RpcikvZ2VuLWFvdXQuYwotCi0kKEJGRF9IKTogc3RtcC1iZmQtaCA7IEB0cnVlCi0KLXN0bXAtYmZkLWg6IGJmZC1pbjMuaAotCXJtIC1mIGJmZC10bXAuaAotCWNwIGJmZC1pbjMuaCBiZmQtdG1wLmgKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLXRtcC5oICQoQkZEX0gpCi0Jcm0gLWYgYmZkLXRtcC5oCi0JdG91Y2ggc3RtcC1iZmQtaAotCi1CRkRfSF9GSUxFUyA9IGJmZC1pbi5oIGluaXQuYyBvcG5jbHMuYyBsaWJiZmQuYyBzZWN0aW9uLmMgYXJjaHVyZXMuYyBcCi0JcmVsb2MuYyBzeW1zLmMgYmZkLmMgYXJjaGl2ZS5jIGNvcmVmaWxlLmMgdGFyZ2V0cy5jIGZvcm1hdC5jCi1MSUJCRkRfSF9GSUxFUyA9IGxpYmJmZC1pbi5oIGluaXQuYyBsaWJiZmQuYyBjYWNoZS5jIHJlbG9jLmMgYXJjaHVyZXMuYyBlbGYuYwotTElCQ09GRl9IX0ZJTEVTID0gbGliY29mZi1pbi5oIGNvZmZjb2RlLmgKLQotIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgotaGVhZGVyczoKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQotIyBXZSBvbmx5IHJlYnVpbGQgdGhlIGhlYWRlciBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIHdlIGhhdmUgYmVlbgotIyBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLgotCi0kKHNyY2RpcikvYmZkLWluMi5oOiBATUFJTlRAIHN0bXAtYmluMi1oIDsgQHRydWUKLXN0bXAtYmluMi1oOiAkKEJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBiZmQuaCkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQl0b3VjaCBzdG1wLWJpbjItaAotCi0kKHNyY2RpcikvbGliYmZkLmg6IEBNQUlOVEAgc3RtcC1sYmZkLWggOyBAdHJ1ZQotc3RtcC1sYmZkLWg6ICQoTElCQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmJmZC5oKQotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCXRvdWNoIHN0bXAtbGJmZC1oCi0KLSQoc3JjZGlyKS9saWJjb2ZmLmg6IEBNQUlOVEAgc3RtcC1sY29mZi1oIDsgQHRydWUKLXN0bXAtbGNvZmYtaDogJChMSUJDT0ZGX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0JdG91Y2ggc3RtcC1sY29mZi1oCi0KLU1PU1RMWUNMRUFORklMRVMgPSBlbGYzMi10YXJnZXQuaCBlbGY2NC10YXJnZXQuaCBvZmlsZXMgc3RhbXAtb2ZpbGVzIFwKLQl0YXJnbWF0Y2guaAotCi1DTEVBTkZJTEVTID0gYmZkLmggZGVwLnNlZCBzdG1wLWJmZC1oIC5kZXAgLmRlcDEgbGliYmZkLmEgc3RhbXAtbGliIFwKLQlzdG1wLWJpbjItaCBzdG1wLWxiZmQtaCBzdG1wLWxjb2ZmLWgKLQotIyBXZSB3YW50IHRvIHJlcnVuIGNvbmZpZ3VyZSBpZiBjb25maWcuYmZkIG9yIGNvbmZpZ3VyZS5ob3N0IGNoYW5nZS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpL2NvbmZpZy5iZmQgJChzcmNkaXIpL2NvbmZpZ3VyZS5ob3N0Ci0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0KLWVsZmFybS1vYWJpLmxvOiBlbGZhcm0tb2FiaS5jIGVsZjMyLWFybS5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotZWxmYXJtLW5hYmkubG86IGVsZmFybS1uYWJpLmMgZWxmMzItYXJtLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWFyY2hpdmUubG86IGFyY2hpdmUuYyAkKElOQ0RJUikvYW91dC9hci5oICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oCi1hcmNodXJlcy5sbzogYXJjaHVyZXMuYwotYmZkLmxvOiBiZmQuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotY2FjaGUubG86IGNhY2hlLmMKLWNvZmZnZW4ubG86IGNvZmZnZW4uYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWNvcmVmaWxlLmxvOiBjb3JlZmlsZS5jCi1mb3JtYXQubG86IGZvcm1hdC5jCi1pbml0LmxvOiBpbml0LmMKLWxpYmJmZC5sbzogbGliYmZkLmMKLW9wbmNscy5sbzogb3BuY2xzLmMgJChJTkNESVIpL29iamFsbG9jLmgKLXJlbG9jLmxvOiByZWxvYy5jICQoSU5DRElSKS9iZmRsaW5rLmgKLXNlY3Rpb24ubG86IHNlY3Rpb24uYyAkKElOQ0RJUikvYmZkbGluay5oCi1zeW1zLmxvOiBzeW1zLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXRhcmdldHMubG86IHRhcmdldHMuYyAkKElOQ0RJUikvZm5tYXRjaC5oIHRhcmdtYXRjaC5oCi1oYXNoLmxvOiBoYXNoLmMgJChJTkNESVIpL29iamFsbG9jLmgKLWxpbmtlci5sbzogbGlua2VyLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmgKLXNyZWMubG86IHNyZWMuYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJpbmFyeS5sbzogYmluYXJ5LmMKLXRla2hleC5sbzogdGVraGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1paGV4LmxvOiBpaGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zdGFicy5sbzogc3RhYnMuYyAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdGFiLXN5bXMubG86IHN0YWItc3ltcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLWNwdS1hMjlrLmxvOiBjcHUtYTI5ay5jCi1jcHUtYWxwaGEubG86IGNwdS1hbHBoYS5jCi1jcHUtYXJjLmxvOiBjcHUtYXJjLmMKLWNwdS1hcm0ubG86IGNwdS1hcm0uYwotY3B1LWQxMHYubG86IGNwdS1kMTB2LmMKLWNwdS1kMzB2LmxvOiBjcHUtZDMwdi5jCi1jcHUtZnIzMC5sbzogY3B1LWZyMzAuYwotY3B1LWg4MzAwLmxvOiBjcHUtaDgzMDAuYwotY3B1LWg4NTAwLmxvOiBjcHUtaDg1MDAuYwotY3B1LWhwcGEubG86IGNwdS1ocHBhLmMKLWNwdS1pMzg2LmxvOiBjcHUtaTM4Ni5jCi1jcHUtaTg2MC5sbzogY3B1LWk4NjAuYwotY3B1LWk5NjAubG86IGNwdS1pOTYwLmMKLWNwdS1tMzJyLmxvOiBjcHUtbTMyci5jCi1jcHUtbTY4ay5sbzogY3B1LW02OGsuYwotY3B1LW04OGsubG86IGNwdS1tODhrLmMKLWNwdS1tMTAyMDAubG86IGNwdS1tMTAyMDAuYwotY3B1LW0xMDMwMC5sbzogY3B1LW0xMDMwMC5jCi1jcHUtbWNvcmUubG86IGNwdS1tY29yZS5jCi1jcHUtbWlwcy5sbzogY3B1LW1pcHMuYwotY3B1LW5zMzJrLmxvOiBjcHUtbnMzMmsuYyBuczMyay5oCi1jcHUtcG93ZXJwYy5sbzogY3B1LXBvd2VycGMuYwotY3B1LXJzNjAwMC5sbzogY3B1LXJzNjAwMC5jCi1jcHUtc2gubG86IGNwdS1zaC5jCi1jcHUtc3BhcmMubG86IGNwdS1zcGFyYy5jCi1jcHUtdGljMzAubG86IGNwdS10aWMzMC5jCi1jcHUtdGljODAubG86IGNwdS10aWM4MC5jCi1jcHUtdjg1MC5sbzogY3B1LXY4NTAuYwotY3B1LXZheC5sbzogY3B1LXZheC5jCi1jcHUtd2UzMmsubG86IGNwdS13ZTMyay5jCi1jcHUtdzY1LmxvOiBjcHUtdzY1LmMKLWNwdS16OGsubG86IGNwdS16OGsuYwotYW91dC1hZG9iZS5sbzogYW91dC1hZG9iZS5jICQoSU5DRElSKS9hb3V0L2Fkb2JlLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtYXJtLmxvOiBhb3V0LWFybS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dHguaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0LW5zMzJrLmxvOiBhb3V0LW5zMzJrLmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBuczMyay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1hb3V0LXNwYXJjbGUubG86IGFvdXQtc3BhcmNsZS5jICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsaWJhb3V0LmggYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotYW91dC10aWMzMC5sbzogYW91dC10aWMzMC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggYW91dHguaAotYW91dDAubG86IGFvdXQwLmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotYW91dDMyLmxvOiBhb3V0MzIuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWJvdXQubG86IGJvdXQuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaCAkKElOQ0RJUikvYm91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBsaWJhb3V0LmgKLWNmLWkzODZseW54LmxvOiBjZi1pMzg2bHlueC5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLW02OGtseW54LmxvOiBjZi1tNjhrbHlueC5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNmLXNwYXJjbHlueC5sbzogY2Ytc3BhcmNseW54LmMgY29mZi1zcGFyYy5jICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWEyOWsubG86IGNvZmYtYTI5ay5jICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWFwb2xsby5sbzogY29mZi1hcG9sbG8uYyAkKElOQ0RJUikvY29mZi9hcG9sbG8uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXJtLmxvOiBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXV4LmxvOiBjb2ZmLWF1eC5jICQoSU5DRElSKS9jb2ZmL2F1eC1jb2ZmLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL202OGsuaCBjb2ZmLW02OGsuYyBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODMwMC5sbzogY29mZi1oODMwMC5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1oODUwMC5sbzogY29mZi1oODUwMC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pMzg2LmxvOiBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1pODYwLmxvOiBjb2ZmLWk4NjAuYyAkKElOQ0RJUikvY29mZi9pODYwLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1nbzMyLmxvOiBjb2ZmLWdvMzIuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk5NjAubG86IGNvZmYtaTk2MC5jICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW02OGsubG86IGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW04OGsubG86IGNvZmYtbTg4ay5jICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLW1pcHMubG86IGNvZmYtbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL21pcHMuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBjb2Zmc3dhcC5oIFwKLSAgZWNvZmZzd2FwLmgKLWNvZmYtcG1hYy5sbzogY29mZi1wbWFjLmMgY29mZi1yczYwMDAuYyAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvcnM2MDAwLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtcnM2MDAwLmxvOiBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zaC5sbzogY29mZi1zaC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1zcGFyYy5sbzogY29mZi1zcGFyYy5jICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXN0Z28zMi5sbzogY29mZi1zdGdvMzIuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2dvMzJleGUuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaCBcCi0gIGdvMzJzdHViLmgKLWNvZmYtc3ZtNjhrLmxvOiBjb2ZmLXN2bTY4ay5jIGNvZmYtbTY4ay5jICQoSU5DRElSKS9jb2ZmL202OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljMzAubG86IGNvZmYtdGljMzAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzMwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdGljODAubG86IGNvZmYtdGljODAuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdTY4ay5sbzogY29mZi11NjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi13ZTMyay5sbzogY29mZi13ZTMyay5jICQoSU5DRElSKS9jb2ZmL3dlMzJrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXc2NS5sbzogY29mZi13NjUuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3c2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXo4ay5sbzogY29mZi16OGsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL3o4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmbGluay5sbzogY29mZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmgKLWR3YXJmMS5sbzogZHdhcmYxLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZi5oCi1kd2FyZjIubG86IGR3YXJmMi5jICQoSU5DRElSKS9saWJpYmVydHkuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKLWVjb2ZmLmxvOiBlY29mZi5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gICQoSU5DRElSKS9hb3V0L3JhbmxpYi5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oCi1lY29mZmxpbmsubG86IGVjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29iamFsbG9jLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaAotZWxmLmxvOiBlbGYuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZWxmMzItYXJjLmxvOiBlbGYzMi1hcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmYXJtLW9hYmkubG86IGVsZmFybS1vYWJpLmMgJChJTkNESVIpL2VsZi9hcm0tb2FiaS5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLWFybS5oIGVsZjMyLXRhcmdldC5oCi1lbGZhcm0tbmFiaS5sbzogZWxmYXJtLW5hYmkuYyAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBlbGYzMi1hcm0uaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMTB2LmxvOiBlbGYzMi1kMTB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZDMwdi5sbzogZWxmMzItZDMwdi5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWZyMzAubG86IGVsZjMyLWZyMzAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWdlbi5sbzogZWxmMzItZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItaHBwYS5sbzogZWxmMzItaHBwYS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgZWxmMzItaHBwYS5oIGxpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgaHBwYV9zdHVicy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pMzg2LmxvOiBlbGYzMi1pMzg2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pODYwLmxvOiBlbGYzMi1pODYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItaTk2MC5sbzogZWxmMzItaTk2MC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9pOTYwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTMyci5sbzogZWxmMzItbTMyci5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9tMzJyLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTY4ay5sbzogZWxmMzItbTY4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tNjhrLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItbTg4ay5sbzogZWxmMzItbTg4ay5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAyMDAubG86IGVsZi1tMTAyMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYtbTEwMzAwLmxvOiBlbGYtbTEwMzAwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL21uMTAzMDAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLW1jb3JlLmxvOiBlbGYzMi1tY29yZS5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbWlwcy5sbzogZWxmMzItbWlwcy5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9lY29mZi5oICQoSU5DRElSKS9jb2ZmL21pcHMuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1wcGMubG86IGVsZjMyLXBwYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zaC5sbzogZWxmMzItc2guYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1zcGFyYy5sbzogZWxmMzItc3BhcmMuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXY4NTAubG86IGVsZjMyLXY4NTAuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLmxvOiBlbGYzMi5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLWVsZmxpbmsubG86IGVsZmxpbmsuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaAotZXBvYy1wZS1hcm0ubG86IGVwb2MtZXAtYXJtLmMgcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1lcG9jLXBlaS1hcm0ubG86IGVwb2MtcGVpLWFybS5jIHBlaS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLWhwMzAwYnNkLmxvOiBocDMwMGJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaHAzMDBocHV4LmxvOiBocDMwMGhwdXguYyAkKElOQ0RJUikvYW91dC9ocDMwMGhwdXguaCBcCi0gIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1zb20ubG86IHNvbS5jCi1pMzg2YW91dC5sbzogaTM4NmFvdXQuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZic2QubG86IGkzODZic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLWkzODZkeW5peC5sbzogaTM4NmR5bml4LmMgJChJTkNESVIpL2FvdXQvZHluaXgzLmggYW91dHguaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotaTM4NmZyZWVic2QubG86IGkzODZmcmVlYnNkLmMgZnJlZWJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmxpbnV4LmxvOiBpMzg2bGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZseW54LmxvOiBpMzg2bHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1zZG9zLmxvOiBpMzg2bXNkb3MuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotaTM4Nm5ldGJzZC5sbzogaTM4Nm5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4Nm1hY2gzLmxvOiBpMzg2bWFjaDMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLWkzODZvczlrLmxvOiBpMzg2b3M5ay5jICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL29zOWsuaAotaWVlZS5sbzogaWVlZS5jICQoSU5DRElSKS9pZWVlLmggbGliaWVlZS5oCi1tNjhrNGtuZXRic2QubG86IG02OGs0a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a2xpbnV4LmxvOiBtNjhrbGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW02OGtseW54LmxvOiBtNjhrbHlueC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTY4a25ldGJzZC5sbzogbTY4a25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbTg4a21hY2gzLmxvOiBtODhrbWFjaDMuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW1pcHNic2QubG86IG1pcHNic2QuYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW5ld3NvczMubG86IG5ld3NvczMuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLW5sbS5sbzogbmxtLmMgbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5sbTMyLWkzODYubG86IG5sbTMyLWkzODYuYyAkKElOQ0RJUikvbmxtL2kzODYtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1zcGFyYy5sbzogbmxtMzItc3BhcmMuYyAkKElOQ0RJUikvbmxtL3NwYXJjMzItZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi1wcGMubG86IG5sbTMyLXBwYy5jICQoSU5DRElSKS9ubG0vcHBjLWV4dC5oIGxpYm5sbS5oIFwKLSAgJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oIFwKLSAgbmxtc3dhcC5oIG5sbS10YXJnZXQuaAotbmxtMzIubG86IG5sbTMyLmMgbmxtY29kZS5oIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggXAotICAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggJChJTkNESVIpL25sbS9leHRlcm5hbC5oCi1uczMya25ldGJzZC5sbzogbnMzMmtuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLW9hc3lzLmxvOiBvYXN5cy5jICQoSU5DRElSKS9vYXN5cy5oIGxpYm9hc3lzLmgKLXBjNTMyLW1hY2gubG86IHBjNTMyLW1hY2guYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXBlLWFybS5sbzogcGUtYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktYXJtLmxvOiBwZWktYXJtLmMgY29mZi1hcm0uYyAkKElOQ0RJUikvY29mZi9hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1pMzg2LmxvOiBwZS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaS1pMzg2LmxvOiBwZWktaTM4Ni5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZS1tY29yZS5sbzogcGUtbWNvcmUuYyBjb2ZmLW1jb3JlLmMgJChJTkNESVIpL2NvZmYvbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktbWNvcmUubG86IHBlaS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlLXBwYy5sbzogcGUtcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpLXBwYy5sbzogcGVpLXBwYy5jIGNvZmYtcHBjLmMgJChJTkNESVIpL2NvZmYvcG93ZXJwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBwY2Jvb3QubG86IHBwY2Jvb3QuYwotcmVsb2MxNi5sbzogcmVsb2MxNi5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmgKLXJpc2NpeC5sbzogcmlzY2l4LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgXAotICAkKElOQ0RJUikvYW91dC9hci5oCi1zcGFyY2xpbnV4LmxvOiBzcGFyY2xpbnV4LmMgJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oCi1zcGFyY2x5bngubG86IHNwYXJjbHlueC5jICQoSU5DRElSKS9hb3V0L3N1bjQuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLXNwYXJjbmV0YnNkLmxvOiBzcGFyY25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotc3Vub3MubG86IHN1bm9zLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggYW91dGYxLmggXAotICAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotdmF4bmV0YnNkLmxvOiB2YXhuZXRic2QuYyBuZXRic2QuaCBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmgKLXZlcnNhZG9zLmxvOiB2ZXJzYWRvcy5jICQoSU5DRElSKS9saWJpYmVydHkuaAotdm1zLmxvOiB2bXMuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtZ3NkLmxvOiB2bXMtZ3NkLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLWhkci5sbzogdm1zLWhkci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1taXNjLmxvOiB2bXMtbWlzYy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy10aXIubG86IHZtcy10aXIuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi14Y29mZmxpbmsubG86IHhjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotYW91dDY0LmxvOiBhb3V0NjQuYyBhb3V0eC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLWNvZmYtYWxwaGEubG86IGNvZmYtYWxwaGEuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggbGliY29mZi5oIFwKLSAgbGliZWNvZmYuaCBjb2Zmc3dhcC5oIGVjb2Zmc3dhcC5oCi1kZW1vNjQubG86IGRlbW82NC5jIGFvdXRmMS5oICQoSU5DRElSKS9hb3V0L3N1bjQuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgYW91dC10YXJnZXQuaAotZWxmNjQtYWxwaGEubG86IGVsZjY0LWFscGhhLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmggZWNvZmZzd2FwLmggZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LWdlbi5sbzogZWxmNjQtZ2VuLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQtbWlwcy5sbzogZWxmNjQtbWlwcy5jICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGdlbmxpbmsuaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvYWxwaGEuaCBlY29mZnN3YXAuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1zcGFyYy5sbzogZWxmNjQtc3BhcmMuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LmxvOiBlbGY2NC5jIGVsZmNvZGUuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gIGVsZmNvcmUuaCBlbGZsaW5rLmgKLW5sbTMyLWFscGhhLmxvOiBubG0zMi1hbHBoYS5jICQoSU5DRElSKS9ubG0vYWxwaGEtZXh0LmggXAotICBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaCBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG02NC5sbzogbmxtNjQuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLWFpeDM4Ni1jb3JlLmxvOiBhaXgzODYtY29yZS5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWhwdXgtY29yZS5sbzogaHB1eC1jb3JlLmMKLWlyaXgtY29yZS5sbzogaXJpeC1jb3JlLmMKLWx5bngtY29yZS5sbzogbHlueC1jb3JlLmMKLW9zZi1jb3JlLmxvOiBvc2YtY29yZS5jCi1zY281LWNvcmUubG86IHNjbzUtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi10cmFkLWNvcmUubG86IHRyYWQtY29yZS5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgaG9zdHMvaTM4NmxpbnV4LmgKLWNpc2NvLWNvcmUubG86IGNpc2NvLWNvcmUuYwotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9iZmQvTWFrZWZpbGUuaW4gYi9iZmQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzg0YWEuLjAwMDAwMDAKLS0tIGEvYmZkL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTYxOSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX0hPU1RfNjRCSVRfTE9ORyA9IEBCRkRfSE9TVF82NEJJVF9MT05HQAotQkZEX0hPU1RfNjRfQklUID0gQEJGRF9IT1NUXzY0X0JJVEAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEID0gQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotQkZEX0hPU1RfVV82NF9CSVQgPSBAQkZEX0hPU1RfVV82NF9CSVRACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DT1JFRklMRSA9IEBDT1JFRklMRUAKLUNPUkVGTEFHID0gQENPUkVGTEFHQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVRERUZJTkVTID0gQFRERUZJTkVTQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKLVdJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAotYWxsX2JhY2tlbmRzID0gQGFsbF9iYWNrZW5kc0AKLWJmZF9iYWNrZW5kcyA9IEBiZmRfYmFja2VuZHNACi1iZmRfbWFjaGluZXMgPSBAYmZkX21hY2hpbmVzQAotbCA9IEBsQAotdGRlZmF1bHRzID0gQHRkZWZhdWx0c0AKLXdvcmRzaXplID0gQHdvcmRzaXplQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLUlOQ0RJUiA9ICQoc3JjZGlyKS8uLi9pbmNsdWRlCi1DU0VBUkNIID0gLUkuIC1JJChzcmNkaXIpIC1JJChJTkNESVIpCi1ERVAgPSBta2RlcAotCi1TVUJESVJTID0gZG9jIHBvCi0KLWRvY2RpciA9IGRvYwotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJiZmQubGEKLQotIyBiZmQuaCBnb2VzIGhlcmUsIGZvciBub3cKLUJGRF9IID0gYmZkLmgKLQotIyBKaW0gS2luZ2RvbiBub3RlczoKLSMgV3JpdGluZyBTLXJlY29yZHMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFsbCAob3IgYXQgbGVhc3QgbW9zdCkKLSMgKi0qLWNvZmYsICotKi1hb3V0LCBldGMuLCBjb25maWd1cmF0aW9ucywgYmVjYXVzZSBwZW9wbGUgd2lsbCB3YW50IHRvCi0jIGJlIGFibGUgdG8gdXNlIG9iamNvcHkgdG8gY3JlYXRlIFMtcmVjb3Jkcy4gIChTLXJlY29yZHMgYXJlIG5vdCB1c2VmdWwKLSMgZm9yIHRoZSBkZWJ1Z2dlciwgc28gaWYgeW91IGFyZSBkb3dubG9hZGluZyB0aGluZ3MgYXMgUy1yZWNvcmRzIHlvdQotIyBuZWVkIHR3byBjb3BpZXMgb2YgdGhlIGV4ZWN1dGFibGUsIG9uZSB0byBkb3dubG9hZCBhbmQgb25lIGZvciB0aGUKLSMgZGVidWdnZXIpLgotQkZEX0xJQlMgPSBcCi0JYXJjaGl2ZS5sbyBhcmNodXJlcy5sbyBiZmQubG8gY2FjaGUubG8gY29mZmdlbi5sbyBjb3JlZmlsZS5sbyBcCi0JZm9ybWF0LmxvIGluaXQubG8gbGliYmZkLmxvIG9wbmNscy5sbyByZWxvYy5sbyBcCi0Jc2VjdGlvbi5sbyBzeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gXAotCXNyZWMubG8gYmluYXJ5LmxvIHRla2hleC5sbyBpaGV4LmxvIHN0YWJzLmxvIHN0YWItc3ltcy5sbwotCi0KLUJGRF9MSUJTX0NGSUxFUyA9IFwKLQlhcmNoaXZlLmMgYXJjaHVyZXMuYyBiZmQuYyBjYWNoZS5jIGNvZmZnZW4uYyBjb3JlZmlsZS5jIFwKLQlmb3JtYXQuYyBpbml0LmMgbGliYmZkLmMgb3BuY2xzLmMgcmVsb2MuYyBcCi0Jc2VjdGlvbi5jIHN5bXMuYyB0YXJnZXRzLmMgaGFzaC5jIGxpbmtlci5jIFwKLQlzcmVjLmMgYmluYXJ5LmMgdGVraGV4LmMgaWhleC5jIHN0YWJzLmMgc3RhYi1zeW1zLmMKLQotCi0jIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8ga2VlcCBpbiBzeW5jCi0jIHdpdGggdGhlIGRlY2xzIGFuZCBpbml0aWFsaXplciBpbiBhcmNodXJlcy5jLgotQUxMX01BQ0hJTkVTID0gXAotCWNwdS1hMjlrLmxvIFwKLQljcHUtYWxwaGEubG8gXAotCWNwdS1hcmMubG8gXAotCWNwdS1hcm0ubG8gXAotCWNwdS1kMTB2LmxvIFwKLQljcHUtZDMwdi5sbyBcCi0JY3B1LWZyMzAubG8gXAotCWNwdS1oODMwMC5sbyBcCi0JY3B1LWg4NTAwLmxvIFwKLQljcHUtaHBwYS5sbyBcCi0JY3B1LWkzODYubG8gXAotCWNwdS1pODYwLmxvIFwKLQljcHUtaTk2MC5sbyBcCi0JY3B1LW0zMnIubG8gXAotCWNwdS1tNjhrLmxvIFwKLQljcHUtbTg4ay5sbyBcCi0JY3B1LW0xMDIwMC5sbyBcCi0JY3B1LW0xMDMwMC5sbyBcCi0JY3B1LW1jb3JlLmxvIFwKLQljcHUtbWlwcy5sbyBcCi0JY3B1LW5zMzJrLmxvIFwKLQljcHUtcG93ZXJwYy5sbyBcCi0JY3B1LXJzNjAwMC5sbyBcCi0JY3B1LXNoLmxvIFwKLQljcHUtc3BhcmMubG8gXAotCWNwdS10aWMzMC5sbyBcCi0JY3B1LXRpYzgwLmxvIFwKLQljcHUtdjg1MC5sbyBcCi0JY3B1LXZheC5sbyBcCi0JY3B1LXdlMzJrLmxvIFwKLQljcHUtdzY1LmxvIFwKLQljcHUtejhrLmxvCi0KLQotQUxMX01BQ0hJTkVTX0NGSUxFUyA9IFwKLQljcHUtYTI5ay5jIFwKLQljcHUtYWxwaGEuYyBcCi0JY3B1LWFyYy5jIFwKLQljcHUtYXJtLmMgXAotCWNwdS1kMTB2LmMgXAotCWNwdS1kMzB2LmMgXAotCWNwdS1mcjMwLmMgXAotCWNwdS1oODMwMC5jIFwKLQljcHUtaDg1MDAuYyBcCi0JY3B1LWhwcGEuYyBcCi0JY3B1LWkzODYuYyBcCi0JY3B1LWk4NjAuYyBcCi0JY3B1LWk5NjAuYyBcCi0JY3B1LW0zMnIuYyBcCi0JY3B1LW02OGsuYyBcCi0JY3B1LW04OGsuYyBcCi0JY3B1LW0xMDIwMC5jIFwKLQljcHUtbTEwMzAwLmMgXAotCWNwdS1tY29yZS5jIFwKLQljcHUtbWlwcy5jIFwKLQljcHUtbnMzMmsuYyBcCi0JY3B1LXBvd2VycGMuYyBcCi0JY3B1LXJzNjAwMC5jIFwKLQljcHUtc2guYyBcCi0JY3B1LXNwYXJjLmMgXAotCWNwdS10aWMzMC5jIFwKLQljcHUtdGljODAuYyBcCi0JY3B1LXY4NTAuYyBcCi0JY3B1LXZheC5jIFwKLQljcHUtd2UzMmsuYyBcCi0JY3B1LXc2NS5jIFwKLQljcHUtejhrLmMKLQotCi0jIFRoZSAubyBmaWxlcyBuZWVkZWQgYnkgYWxsIG9mIHRoZSAzMiBiaXQgdmVjdG9ycyB0aGF0IGFyZSBjb25maWd1cmVkIGludG8KLSMgdGFyZ2V0X3ZlY3RvciBpbiB0YXJnZXRzLmMgaWYgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLgotQkZEMzJfQkFDS0VORFMgPSBcCi0JYW91dC1hZG9iZS5sbyBcCi0JYW91dC1hcm0ubG8gXAotCWFvdXQtbnMzMmsubG8gXAotCWFvdXQtc3BhcmNsZS5sbyBcCi0JYW91dC10aWMzMC5sbyBcCi0JYW91dDAubG8gXAotCWFvdXQzMi5sbyBcCi0JYm91dC5sbyBcCi0JY2YtaTM4Nmx5bngubG8gXAotCWNmLW02OGtseW54LmxvIFwKLQljZi1zcGFyY2x5bngubG8gXAotCWNvZmYtYTI5ay5sbyBcCi0JY29mZi1hcG9sbG8ubG8gXAotCWNvZmYtYXJtLmxvIFwKLQljb2ZmLWF1eC5sbyBcCi0JY29mZi1oODMwMC5sbyBcCi0JY29mZi1oODUwMC5sbyBcCi0JY29mZi1pMzg2LmxvIFwKLQljb2ZmLWdvMzIubG8gXAotCWNvZmYtaTg2MC5sbyBcCi0JY29mZi1pOTYwLmxvIFwKLQljb2ZmLW02OGsubG8gXAotCWNvZmYtbTg4ay5sbyBcCi0JY29mZi1taXBzLmxvIFwKLQljb2ZmLXBtYWMubG8gXAotCWNvZmYtcnM2MDAwLmxvIFwKLQljb2ZmLXNoLmxvIFwKLQljb2ZmLXNwYXJjLmxvIFwKLQljb2ZmLXN0Z28zMi5sbyBcCi0JY29mZi1zdm02OGsubG8gXAotCWNvZmYtdGljMzAubG8gXAotCWNvZmYtdGljODAubG8gXAotCWNvZmYtdTY4ay5sbyBcCi0JY29mZi13ZTMyay5sbyBcCi0JY29mZi13NjUubG8gXAotCWNvZmYtejhrLmxvIFwKLQljb2ZmbGluay5sbyBcCi0JZHdhcmYxLmxvIFwKLQlkd2FyZjIubG8gXAotCWVjb2ZmLmxvIFwKLQllY29mZmxpbmsubG8gXAotCWVsZi5sbyBcCi0JZWxmMzItYXJjLmxvIFwKLQllbGZhcm0tb2FiaS5sbyBcCi0JZWxmYXJtLW5hYmkubG8gXAotCWVsZjMyLWQxMHYubG8gXAotCWVsZjMyLWQzMHYubG8gXAotCWVsZjMyLWZyMzAubG8gXAotCWVsZjMyLWdlbi5sbyBcCi0JZWxmMzItaHBwYS5sbyBcCi0JZWxmMzItaTM4Ni5sbyBcCi0JZWxmMzItaTg2MC5sbyBcCi0JZWxmMzItaTk2MC5sbyBcCi0JZWxmMzItbTMyci5sbyBcCi0JZWxmMzItbTY4ay5sbyBcCi0JZWxmMzItbTg4ay5sbyBcCi0JZWxmLW0xMDIwMC5sbyBcCi0JZWxmLW0xMDMwMC5sbyBcCi0JZWxmMzItbWNvcmUubG8gXAotCWVsZjMyLW1pcHMubG8gXAotCWVsZjMyLXBwYy5sbyBcCi0JZWxmMzItc2gubG8gXAotCWVsZjMyLXNwYXJjLmxvIFwKLQllbGYzMi12ODUwLmxvIFwKLQllbGYzMi5sbyBcCi0JZWxmbGluay5sbyBcCi0JZXBvYy1wZS1hcm0ubG8gXAotCWVwb2MtcGVpLWFybS5sbyBcCi0JaHAzMDBic2QubG8gXAotCWhwMzAwaHB1eC5sbyBcCi0Jc29tLmxvIFwKLQlpMzg2YW91dC5sbyBcCi0JaTM4NmJzZC5sbyBcCi0JaTM4NmR5bml4LmxvIFwKLQlpMzg2ZnJlZWJzZC5sbyBcCi0JaTM4NmxpbnV4LmxvIFwKLQlpMzg2bHlueC5sbyBcCi0JaTM4Nm1zZG9zLmxvIFwKLQlpMzg2bmV0YnNkLmxvIFwKLQlpMzg2bWFjaDMubG8gXAotCWkzODZvczlrLmxvIFwKLQlpZWVlLmxvIFwKLQltNjhrNGtuZXRic2QubG8gXAotCW02OGtsaW51eC5sbyBcCi0JbTY4a2x5bngubG8gXAotCW02OGtuZXRic2QubG8gXAotCW04OGttYWNoMy5sbyBcCi0JbWlwc2JzZC5sbyBcCi0JbmV3c29zMy5sbyBcCi0JbmxtLmxvIFwKLQlubG0zMi1pMzg2LmxvIFwKLQlubG0zMi1zcGFyYy5sbyBcCi0JbmxtMzItcHBjLmxvIFwKLQlubG0zMi5sbyBcCi0JbnMzMmtuZXRic2QubG8gXAotCW9hc3lzLmxvIFwKLQlwYzUzMi1tYWNoLmxvIFwKLQlwZS1hcm0ubG8gXAotCXBlaS1hcm0ubG8gXAotCXBlLWkzODYubG8gXAotCXBlaS1pMzg2LmxvIFwKLQlwZS1tY29yZS5sbyBcCi0JcGVpLW1jb3JlLmxvIFwKLQlwZS1wcGMubG8gXAotCXBlaS1wcGMubG8gXAotCXBwY2Jvb3QubG8gXAotCXJlbG9jMTYubG8gXAotCXJpc2NpeC5sbyBcCi0Jc3BhcmNsaW51eC5sbyBcCi0Jc3BhcmNseW54LmxvIFwKLQlzcGFyY25ldGJzZC5sbyBcCi0Jc3Vub3MubG8gXAotCXZheG5ldGJzZC5sbyBcCi0JdmVyc2Fkb3MubG8gXAotCXZtcy5sbyBcCi0Jdm1zLWdzZC5sbyBcCi0Jdm1zLWhkci5sbyBcCi0Jdm1zLW1pc2MubG8gXAotCXZtcy10aXIubG8gXAotCXhjb2ZmbGluay5sbwotCi0KLUJGRDMyX0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhb3V0LWFkb2JlLmMgXAotCWFvdXQtYXJtLmMgXAotCWFvdXQtbnMzMmsuYyBcCi0JYW91dC1zcGFyY2xlLmMgXAotCWFvdXQtdGljMzAuYyBcCi0JYW91dDAuYyBcCi0JYW91dDMyLmMgXAotCWJvdXQuYyBcCi0JY2YtaTM4Nmx5bnguYyBcCi0JY2YtbTY4a2x5bnguYyBcCi0JY2Ytc3BhcmNseW54LmMgXAotCWNvZmYtYTI5ay5jIFwKLQljb2ZmLWFwb2xsby5jIFwKLQljb2ZmLWFybS5jIFwKLQljb2ZmLWF1eC5jIFwKLQljb2ZmLWg4MzAwLmMgXAotCWNvZmYtaDg1MDAuYyBcCi0JY29mZi1pMzg2LmMgXAotCWNvZmYtaTg2MC5jIFwKLQljb2ZmLWdvMzIuYyBcCi0JY29mZi1pOTYwLmMgXAotCWNvZmYtbTY4ay5jIFwKLQljb2ZmLW04OGsuYyBcCi0JY29mZi1taXBzLmMgXAotCWNvZmYtcG1hYy5jIFwKLQljb2ZmLXJzNjAwMC5jIFwKLQljb2ZmLXNoLmMgXAotCWNvZmYtc3BhcmMuYyBcCi0JY29mZi1zdGdvMzIuYyBcCi0JY29mZi1zdm02OGsuYyBcCi0JY29mZi10aWMzMC5jIFwKLQljb2ZmLXRpYzgwLmMgXAotCWNvZmYtdTY4ay5jIFwKLQljb2ZmLXdlMzJrLmMgXAotCWNvZmYtdzY1LmMgXAotCWNvZmYtejhrLmMgXAotCWNvZmZsaW5rLmMgXAotCWR3YXJmMS5jIFwKLQlkd2FyZjIuYyBcCi0JZWNvZmYuYyBcCi0JZWNvZmZsaW5rLmMgXAotCWVsZi5jIFwKLQllbGYzMi1hcmMuYyBcCi0JZWxmYXJtLW9hYmkuYyBcCi0JZWxmYXJtLW5hYmkuYyBcCi0JZWxmMzItZDEwdi5jIFwKLQllbGYzMi1kMzB2LmMgXAotCWVsZjMyLWZyMzAuYyBcCi0JZWxmMzItZ2VuLmMgXAotCWVsZjMyLWhwcGEuYyBcCi0JZWxmMzItaTM4Ni5jIFwKLQllbGYzMi1pODYwLmMgXAotCWVsZjMyLWk5NjAuYyBcCi0JZWxmMzItbTMyci5jIFwKLQllbGYzMi1tNjhrLmMgXAotCWVsZjMyLW04OGsuYyBcCi0JZWxmLW0xMDIwMC5jIFwKLQllbGYtbTEwMzAwLmMgXAotCWVsZjMyLW1jb3JlLmMgXAotCWVsZjMyLW1pcHMuYyBcCi0JZWxmMzItcHBjLmMgXAotCWVsZjMyLXNoLmMgXAotCWVsZjMyLXNwYXJjLmMgXAotCWVsZjMyLXY4NTAuYyBcCi0JZWxmMzIuYyBcCi0JZWxmbGluay5jIFwKLQllcG9jLXBlLWFybS5jIFwKLQllcG9jLXBlaS1hcm0uYyBcCi0JaHAzMDBic2QuYyBcCi0JaHAzMDBocHV4LmMgXAotCXNvbS5jIFwKLQlpMzg2YW91dC5jIFwKLQlpMzg2YnNkLmMgXAotCWkzODZkeW5peC5jIFwKLQlpMzg2ZnJlZWJzZC5jIFwKLQlpMzg2bGludXguYyBcCi0JaTM4Nmx5bnguYyBcCi0JaTM4Nm1zZG9zLmMgXAotCWkzODZuZXRic2QuYyBcCi0JaTM4Nm1hY2gzLmMgXAotCWkzODZvczlrLmMgXAotCWllZWUuYyBcCi0JbTY4azRrbmV0YnNkLmMgXAotCW02OGtsaW51eC5jIFwKLQltNjhrbHlueC5jIFwKLQltNjhrbmV0YnNkLmMgXAotCW04OGttYWNoMy5jIFwKLQltaXBzYnNkLmMgXAotCW5ld3NvczMuYyBcCi0JbmxtLmMgXAotCW5sbTMyLWkzODYuYyBcCi0JbmxtMzItc3BhcmMuYyBcCi0JbmxtMzItcHBjLmMgXAotCW5sbTMyLmMgXAotCW5zMzJrbmV0YnNkLmMgXAotCW9hc3lzLmMgXAotCXBjNTMyLW1hY2guYyBcCi0JcGUtYXJtLmMgXAotCXBlaS1hcm0uYyBcCi0JcGUtaTM4Ni5jIFwKLQlwZWktaTM4Ni5jIFwKLQlwZS1tY29yZS5jIFwKLQlwZWktbWNvcmUuYyBcCi0JcGUtcHBjLmMgXAotCXBlaS1wcGMuYyBcCi0JcHBjYm9vdC5jIFwKLQlyZWxvYzE2LmMgXAotCXJpc2NpeC5jIFwKLQlzcGFyY2xpbnV4LmMgXAotCXNwYXJjbHlueC5jIFwKLQlzcGFyY25ldGJzZC5jIFwKLQlzdW5vcy5jIFwKLQl2YXhuZXRic2QuYyBcCi0JdmVyc2Fkb3MuYyBcCi0Jdm1zLmMgXAotCXZtcy1nc2QuYyBcCi0Jdm1zLWhkci5jIFwKLQl2bXMtbWlzYy5jIFwKLQl2bXMtdGlyLmMgXAotCXhjb2ZmbGluay5jCi0KLQotIyBUaGUgLm8gZmlsZXMgbmVlZGVkIGJ5IGFsbCBvZiB0aGUgNjQgYml0IHZlY3RvcnMgdGhhdCBhcmUgY29uZmlndXJlZCBpbnRvCi0jIHRhcmdldF92ZWN0b3IgaW4gdGFyZ2V0cy5jIGlmIGNvbmZpZ3VyZWQgd2l0aCAtLWVuYWJsZS10YXJnZXRzPWFsbAotIyBhbmQgLS1lbmFibGUtNjQtYml0LWJmZC4KLUJGRDY0X0JBQ0tFTkRTID0gXAotCWFvdXQ2NC5sbyBcCi0JY29mZi1hbHBoYS5sbyBcCi0JZGVtbzY0LmxvIFwKLQllbGY2NC1hbHBoYS5sbyBcCi0JZWxmNjQtZ2VuLmxvIFwKLQllbGY2NC1taXBzLmxvIFwKLQllbGY2NC1zcGFyYy5sbyBcCi0JZWxmNjQubG8gXAotCW5sbTMyLWFscGhhLmxvIFwKLQlubG02NC5sbwotCi0KLUJGRDY0X0JBQ0tFTkRTX0NGSUxFUyA9IFwKLQlhb3V0NjQuYyBcCi0JY29mZi1hbHBoYS5jIFwKLQlkZW1vNjQuYyBcCi0JZWxmNjQtYWxwaGEuYyBcCi0JZWxmNjQtZ2VuLmMgXAotCWVsZjY0LW1pcHMuYyBcCi0JZWxmNjQtc3BhcmMuYyBcCi0JZWxmNjQuYyBcCi0JbmxtMzItYWxwaGEuYyBcCi0JbmxtNjQuYwotCi0KLU9QVElPTkFMX0JBQ0tFTkRTID0gXAotCWFpeDM4Ni1jb3JlLmxvIFwKLQlocHV4LWNvcmUubG8gXAotCWlyaXgtY29yZS5sbyBcCi0JbHlueC1jb3JlLmxvIFwKLQlvc2YtY29yZS5sbyBcCi0Jc2NvNS1jb3JlLmxvIFwKLQl0cmFkLWNvcmUubG8gXAotCWNpc2NvLWNvcmUubG8KLQotCi1PUFRJT05BTF9CQUNLRU5EU19DRklMRVMgPSBcCi0JYWl4Mzg2LWNvcmUuYyBcCi0JaHB1eC1jb3JlLmMgXAotCWlyaXgtY29yZS5jIFwKLQlseW54LWNvcmUuYyBcCi0Jb3NmLWNvcmUuYyBcCi0Jc2NvNS1jb3JlLmMgXAotCXRyYWQtY29yZS5jIFwKLQljaXNjby1jb3JlLmMKLQotCi0jIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IGNvbmZpZ3VyZS5pbjoKLVdPUkRTSVpFID0gQHdvcmRzaXplQAotQUxMX0JBQ0tFTkRTID0gQGFsbF9iYWNrZW5kc0AKLUJGRF9CQUNLRU5EUyA9IEBiZmRfYmFja2VuZHNACi1CRkRfTUFDSElORVMgPSBAYmZkX21hY2hpbmVzQAotVERFRkFVTFRTID0gQHRkZWZhdWx0c0AKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIEBIREVGSU5FU0AgQENPUkVGTEFHQCBAVERFRklORVNAICQoQ1NFQVJDSCkgJChDU1dJVENIRVMpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCi0KLSMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCi1DRklMRVMgPSBcCi0JJChCRkRfTElCU19DRklMRVMpIFwKLQkkKEFMTF9NQUNISU5FU19DRklMRVMpIFwKLQkkKEJGRDMyX0JBQ0tFTkRTX0NGSUxFUykgXAotCSQoQkZENjRfQkFDS0VORFNfQ0ZJTEVTKSBcCi0JJChPUFRJT05BTF9CQUNLRU5EU19DRklMRVMpCi0KLQotU09VUkNFX0hGSUxFUyA9IFwKLQlhb3V0LXRhcmdldC5oIGFvdXRmMS5oIGFvdXR4LmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKLQllY29mZnN3YXAuaCBlbGYzMi1hcm0uaCBlbGYzMi1ocHBhLmggZWxmY29kZS5oIGVsZmNvcmUuaCBcCi0JZWxmbGluay5oIGZyZWVic2QuaCBnZW5saW5rLmggZ28zMnN0dWIuaCBocHBhX3N0dWJzLmggbGliYW91dC5oIFwKLQlsaWJiZmQuaCBsaWJjb2ZmLmggbGliZWNvZmYuaCBlbGYtYmZkLmggbGliaHBwYS5oIGxpYmllZWUuaCBcCi0JbGlibmxtLmggbGlib2FzeXMuaCBuZXRic2QuaCBubG0tdGFyZ2V0LmggbmxtY29kZS5oIG5sbXN3YXAuaCBcCi0JbnMzMmsuaCBwZWljb2RlLmggc29tLmggdm1zLmgKLQotCi1IRklMRVMgPSBcCi0JZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0LmggdGFyZ21hdGNoLmggXAotCSQoU09VUkNFX0hGSUxFUykKLQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKFNPVVJDRV9IRklMRVMpCi0KLSMgVmFyaW91cyBraW5kcyBvZiAubyBmaWxlcyB0byBwdXQgaW4gbGliYmZkLmE6Ci0jIEJGRF9CQUNLRU5EUwlSb3V0aW5lcyB0aGUgY29uZmlndXJlZCB0YXJnZXRzIG5lZWQuCi0jIEJGRF9NQUNISU5FUwlBcmNoaXRlY3R1cmUtc3BlY2lmaWMgcm91dGluZXMgdGhlIGNvbmZpZ3VyZWQgdGFyZ2V0cyBuZWVkLgotIyBDT1JFRklMRQlDb3JlIGZpbGUgcm91dGluZXMgZm9yIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24KLU9GSUxFUyA9ICQoQkZEX0JBQ0tFTkRTKSAkKEJGRF9NQUNISU5FUykgQENPUkVGSUxFQAotCi1saWJiZmRfbGFfU09VUkNFUyA9ICQoQkZEX0xJQlNfQ0ZJTEVTKQotbGliYmZkX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKSBvZmlsZXMKLWxpYmJmZF9sYV9MSUJBREQgPSBgY2F0IG9maWxlc2AgQFdJTjMyTElCQUREQAotbGliYmZkX2xhX0xERkxBR1MgPSAtcmVsZWFzZSAkKFZFUlNJT04pIEBXSU4zMkxERkxBR1NACi0KLSMgbGlidG9vbCB3aWxsIGJ1aWxkIC5saWJzL2xpYmJmZC5hLiAgV2UgY3JlYXRlIGxpYmJmZC5hIGluIHRoZSBidWlsZAotIyBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZSBwcm9ncmFtcyB0aGF0IHVzZQotIyBsaWJiZmQuYSBzaW11bHRhbmVvdXNseS4gIFRoaXMgaXMgYSBoYWNrIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkIGlmCi0jIGV2ZXJ5dGhpbmcgZWxzZSBzdGFydHMgdXNpbmcgbGlidG9vbC4gIEZJWE1FLgotCi1ub2luc3RfTElCUkFSSUVTID0gbGliYmZkLmEKLWxpYmJmZF9hX1NPVVJDRVMgPSAKLQotQkZEX0hfREVQUyA9ICQoSU5DRElSKS9hbnNpZGVjbC5oCi1MT0NBTF9IX0RFUFMgPSBsaWJiZmQuaCBzeXNkZXAuaCBjb25maWcuaAotCi1CRkRfSF9GSUxFUyA9IGJmZC1pbi5oIGluaXQuYyBvcG5jbHMuYyBsaWJiZmQuYyBzZWN0aW9uLmMgYXJjaHVyZXMuYyBcCi0JcmVsb2MuYyBzeW1zLmMgYmZkLmMgYXJjaGl2ZS5jIGNvcmVmaWxlLmMgdGFyZ2V0cy5jIGZvcm1hdC5jCi0KLUxJQkJGRF9IX0ZJTEVTID0gbGliYmZkLWluLmggaW5pdC5jIGxpYmJmZC5jIGNhY2hlLmMgcmVsb2MuYyBhcmNodXJlcy5jIGVsZi5jCi1MSUJDT0ZGX0hfRklMRVMgPSBsaWJjb2ZmLWluLmggY29mZmNvZGUuaAotCi1NT1NUTFlDTEVBTkZJTEVTID0gZWxmMzItdGFyZ2V0LmggZWxmNjQtdGFyZ2V0Lmggb2ZpbGVzIHN0YW1wLW9maWxlcyBcCi0JdGFyZ21hdGNoLmgKLQotCi1DTEVBTkZJTEVTID0gYmZkLmggZGVwLnNlZCBzdG1wLWJmZC1oIC5kZXAgLmRlcDEgbGliYmZkLmEgc3RhbXAtbGliIFwKLQlzdG1wLWJpbjItaCBzdG1wLWxiZmQtaCBzdG1wLWxjb2ZmLWgKLQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGNvbmZpZy5oCi1DT05GSUdfQ0xFQU5fRklMRVMgPSAgYmZkLWluMy5oCi1MSUJSQVJJRVMgPSAgJChub2luc3RfTElCUkFSSUVTKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1saWJiZmRfYV9MSUJBREQgPSAKLWxpYmJmZF9hX09CSkVDVFMgPSAKLUxUTElCUkFSSUVTID0gICQobGliX0xUTElCUkFSSUVTKQotCi1saWJiZmRfbGFfT0JKRUNUUyA9ICBhcmNoaXZlLmxvIGFyY2h1cmVzLmxvIGJmZC5sbyBjYWNoZS5sbyBjb2ZmZ2VuLmxvIFwKLWNvcmVmaWxlLmxvIGZvcm1hdC5sbyBpbml0LmxvIGxpYmJmZC5sbyBvcG5jbHMubG8gcmVsb2MubG8gc2VjdGlvbi5sbyBcCi1zeW1zLmxvIHRhcmdldHMubG8gaGFzaC5sbyBsaW5rZXIubG8gc3JlYy5sbyBiaW5hcnkubG8gdGVraGV4LmxvIFwKLWloZXgubG8gc3RhYnMubG8gc3RhYi1zeW1zLmxvCi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLURJU1RfQ09NTU9OID0gIFJFQURNRSAuL3N0YW1wLWguaW4gQ09QWUlORyBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gXAotTWFrZWZpbGUuaW4gVE9ETyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBiZmQtaW4yLmggY29uZmlnLmluIGNvbmZpZ3VyZSBcCi1jb25maWd1cmUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoSEVBREVSUykgJChURVhJTkZPUykgJChFWFRSQV9ESVNUKQotCi1UQVIgPSBndGFyCi1HWklQX0VOViA9IC0tYmVzdAotU09VUkNFUyA9ICQobGliYmZkX2FfU09VUkNFUykgJChsaWJiZmRfbGFfU09VUkNFUykKLU9CSkVDVFMgPSAkKGxpYmJmZF9hX09CSkVDVFMpICQobGliYmZkX2xhX09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5sbyAubyAucwotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0kKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAgYWNpbmNsdWRlLm00Ci0JY2QgJChzcmNkaXIpICYmICQoQUNMT0NBTCkKLSQoc3JjZGlyKS9jb25maWd1cmU6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgJChDT05GSUdVUkVfREVQRU5ERU5DSUVTKQotCWNkICQoc3JjZGlyKSAmJiAkKEFVVE9DT05GKQotCi1jb25maWcuaDogc3RhbXAtaAotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiBzdGFtcC1oOyBcCi0JCSQoTUFLRSkgc3RhbXAtaDsgXAotCWVsc2UgOjsgZmkKLXN0YW1wLWg6ICQoc3JjZGlyKS9jb25maWcuaW4gJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSBDT05GSUdfSEVBREVSUz1jb25maWcuaDpjb25maWcuaW4gXAotCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0JQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKLSQoc3JjZGlyKS9jb25maWcuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAkKHNyY2Rpcikvc3RhbXAtaC5pbgotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCQkkKE1BS0UpICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JZWxzZSA6OyBmaQotJChzcmNkaXIpL3N0YW1wLWguaW46ICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9IRUFERVIpCi0JQGVjaG8gdGltZXN0YW1wID4gJChzcmNkaXIpL3N0YW1wLWguaW4gMj4gL2Rldi9udWxsCi0KLW1vc3RseWNsZWFuLWhkcjoKLQotY2xlYW4taGRyOgotCi1kaXN0Y2xlYW4taGRyOgotCS1ybSAtZiBjb25maWcuaAotCi1tYWludGFpbmVyLWNsZWFuLWhkcjoKLWJmZC1pbjMuaDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgYmZkLWluMi5oCi0JY2QgJCh0b3BfYnVpbGRkaXIpICYmIENPTkZJR19GSUxFUz0kQDpiZmQtaW4yLmggQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi1tb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQktdGVzdCAteiAiJChub2luc3RfTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTElCUkFSSUVTKQotCi1kaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi1tYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQotCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLWluc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgICQoTElCVE9PTCkgIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQlkb25lCi0KLWxpYmJmZC5sYTogJChsaWJiZmRfbGFfT0JKRUNUUykgJChsaWJiZmRfbGFfREVQRU5ERU5DSUVTKQotCSQoTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYmJmZF9sYV9MREZMQUdTKSAkKGxpYmJmZF9sYV9PQkpFQ1RTKSAkKGxpYmJmZF9sYV9MSUJBREQpICQoTElCUykKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1pbmZvLWFtOgotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbToKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtZGF0YS1sb2NhbAotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMKLXVuaW5zdGFsbDogdW5pbnN0YWxsLXJlY3Vyc2l2ZQotYWxsLWFtOiBNYWtlZmlsZSAkKExJQlJBUklFUykgJChMVExJQlJBUklFUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQobGliZGlyKQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTU9TVExZQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTU9TVExZQ0xFQU5GSUxFUykKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBcCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAotaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1sb2NhbCBpbnN0YWxsLWRhdGEtYW0gaW5zdGFsbC1kYXRhIGluc3RhbGwtYW0gaW5zdGFsbCBcCi11bmluc3RhbGwtYW0gdW5pbnN0YWxsIGFsbC1yZWRpcmVjdCBhbGwtYW0gYWxsIGluc3RhbGxkaXJzLWFtIFwKLWluc3RhbGxkaXJzIG1vc3RseWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tZ2VuZXJpYyBcCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgY2xlYW4gbW9zdGx5Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW4KLQotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1kaXN0c3R1ZmY6IGluZm8KLQotc3RhbXAtb2ZpbGVzOiBNYWtlZmlsZQotCXJtIC1mIHRvZmlsZXMKLQlmPSIiOyBcCi0JZm9yIGkgaW4gJChPRklMRVMpIDsgZG8gXAotCSAgY2FzZSAiICQkZiAiIGluIFwKLQkgICAgKiIgJCRpICIqKSA7OyBcCi0JICAgICopIGY9IiQkZiAkJGkiIDs7IFwKLQkgIGVzYWMgOyBcCi0JZG9uZSA7IFwKLQllY2hvICQkZiA+IHRvZmlsZXMKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG9maWxlcyBvZmlsZXMKLQl0b3VjaCBzdGFtcC1vZmlsZXMKLQotb2ZpbGVzOiBzdGFtcC1vZmlsZXMgOyBAdHJ1ZQotCi1zdGFtcC1saWI6IGxpYmJmZC5sYQotCWlmIFsgLWYgLmxpYnMvbGliYmZkLmEgXTsgdGhlbiBcCi0JICBjcCAubGlicy9saWJiZmQuYSBsaWJiZmQudG1wOyBcCi0JICAkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGliYmZkLmE6IHN0YW1wLWxpYiA7IEB0cnVlCi0KLSMgVGhpcyBmaWxlIGhvbGRzIGFuIGFycmF5IGFzc29jaWF0aW5nIGNvbmZpZ3VyYXRpb24gdHJpcGxldHMgYW5kCi0jIHZlY3RvciBuYW1lcy4gIEl0IGlzIGJ1aWx0IGZyb20gY29uZmlnLmJmZC4gIEl0IGlzIG5vdCBjb21waWxlZCBieQotIyBpdHNlbGYsIGJ1dCBpcyBpbmNsdWRlZCBieSB0YXJnZXRzLmMuCi10YXJnbWF0Y2guaDogY29uZmlnLmJmZCB0YXJnbWF0Y2guc2VkCi0Jcm0gLWYgdGFyZ21hdGNoLmgKLQlzZWQgLWYgJChzcmNkaXIpL3RhcmdtYXRjaC5zZWQgPCAkKHNyY2RpcikvY29uZmlnLmJmZCA+IHRhcmdtYXRjaC5uZXcKLQltdiAtZiB0YXJnbWF0Y2gubmV3IHRhcmdtYXRjaC5oCi0KLSMgV2hlbiBjb21waWxpbmcgYXJjaHVyZXMuYyBhbmQgdGFyZ2V0cy5jLCBzdXBwbHkgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0jIGluZm8gZnJvbSBjb25maWd1cmUuCi0KLXRhcmdldHMubG86IHRhcmdldHMuYyBjb25maWcuc3RhdHVzCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQoVERFRkFVTFRTKSAkKHNyY2RpcikvdGFyZ2V0cy5jCi0KLWFyY2h1cmVzLmxvOiBhcmNodXJlcy5jIGNvbmZpZy5zdGF0dXMKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJChUREVGQVVMVFMpICQoc3JjZGlyKS9hcmNodXJlcy5jCi0KLWVsZjMyLXRhcmdldC5oIDogZWxmeHgtdGFyZ2V0LmgKLQlybSAtZiBlbGYzMi10YXJnZXQuaAotCXNlZCAtZSBzL05OLzMyL2cgPCAkKHNyY2RpcikvZWxmeHgtdGFyZ2V0LmggPiBlbGYzMi10YXJnZXQubmV3Ci0JbXYgLWYgZWxmMzItdGFyZ2V0Lm5ldyBlbGYzMi10YXJnZXQuaAotCi1lbGY2NC10YXJnZXQuaCA6IGVsZnh4LXRhcmdldC5oCi0Jcm0gLWYgZWxmNjQtdGFyZ2V0LmgKLQlzZWQgLWUgcy9OTi82NC9nIDwgJChzcmNkaXIpL2VsZnh4LXRhcmdldC5oID4gZWxmNjQtdGFyZ2V0Lm5ldwotCW12IC1mIGVsZjY0LXRhcmdldC5uZXcgZWxmNjQtdGFyZ2V0LmgKLSQoQkZEX0xJQlMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfTUFDSElORVMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChCRkRfQkFDS0VORFMpOiAkKEJGRF9IKSAkKEJGRF9IX0RFUFMpICQoTE9DQUxfSF9ERVBTKQotJChPUFRJT05BTF9CQUNLRU5EUyk6ICQoQkZEX0gpICQoQkZEX0hfREVQUykgJChMT0NBTF9IX0RFUFMpCi0KLSMgSW5zdGFsbCBCRkQgaW5jbHVkZSBmaWxlLCBhbmQgb3RoZXJzIHRoYXQgaXQgbmVlZHMuCi1pbnN0YWxsLWRhdGEtbG9jYWw6ICQoQkZEX0gpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKGluY2x1ZGVkaXIpCi0JJChJTlNUQUxMX0RBVEEpICQoQkZEX0gpICQoaW5jbHVkZWRpcikvYmZkLmgKLQkkKElOU1RBTExfREFUQSkgJChJTkNESVIpL2Fuc2lkZWNsLmggJChpbmNsdWRlZGlyKS9hbnNpZGVjbC5oCi0JJChJTlNUQUxMX0RBVEEpICQoSU5DRElSKS9iZmRsaW5rLmggJChpbmNsdWRlZGlyKS9iZmRsaW5rLmgKLQotIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBiZmQuaAotCXJtIC1mIC5kZXAxCi0JJChNQUtFKSBERVA9JChERVApIC5kZXAxCi0Jc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi0jIFRoZSBOZXRCU0QgbWtkZXAgb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgZmlsZSBjb250ZW50cywgYW5kIGRvZXNuJ3QgaW5zZXJ0Ci0jIHRoZSAiRE8gTk9UIERFTEVURSIgbGluZS4KLSMgT3RoZXIgbWtkZXAgdmVyc2lvbnMgcmVxdWlyZSBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cywgYW5kIGRvIGluc2VydCBpdC4KLSMgSGVuY2UgdGhlIHdlaXJkbmVzcy4uLi4KLS5kZXAxOiAkKENGSUxFUykKLQlybSAtZiAuZGVwMiAuZGVwMmEKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JZWNobyA+IC5kZXAyYQotCSQoREVQKSAtZiAuZGVwMmEgJChJTkNMVURFUykgJChDRkxBR1MpICQ/Ci0Jc2VkIC1lICcvRE8gTk9UIERFTEVURS9kJyAtZSAnL14kJC9kJyA8IC5kZXAyYSA+PiAuZGVwMgotCXJtIC1mIC5kZXAyYQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSAuZGVwMiAuZGVwMQotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzZWQgPCQoc3JjZGlyKS9kZXAtaW4uc2VkID5kZXAuc2VkCVwKLQkJLWUgJ3MhQEJGRF9IQCEkKEJGRF9IKSEnCVwKLQkJLWUgJ3MhQElOQ0RJUkAhJChJTkNESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotaG9zdC1hb3V0LmxvOiBNYWtlZmlsZQotCi0jIFRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHNpbXBsZSBjb25maWcgZmlsZQotIyB3aGljaCBjYW4gYmUgZm9sZGVkIGludG8gYW4gaC1YWFggZmlsZSBmb3IgYSBuZXcgaG9zdCwgd2l0aCBzb21lIGVkaXRpbmcuCi1hb3V0LXBhcmFtcy5oOiBnZW4tYW91dAotCS4vZ2VuLWFvdXQgaG9zdCA+IGFvdXQtcGFyYW1zLmgKLWdlbi1hb3V0OiAkKHNyY2RpcikvZ2VuLWFvdXQuYyBNYWtlZmlsZQotCSQoQ0MpIC1vIGdlbi1hb3V0ICQoQ0ZMQUdTKSAkKExGTEFHUykgJChzcmNkaXIpL2dlbi1hb3V0LmMKLQotJChCRkRfSCk6IHN0bXAtYmZkLWggOyBAdHJ1ZQotCi1zdG1wLWJmZC1oOiBiZmQtaW4zLmgKLQlybSAtZiBiZmQtdG1wLmgKLQljcCBiZmQtaW4zLmggYmZkLXRtcC5oCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC10bXAuaCAkKEJGRF9IKQotCXJtIC1mIGJmZC10bXAuaAotCXRvdWNoIHN0bXAtYmZkLWgKLQotIyBDb3VsZCByZWFsbHkgdXNlIGEgImNvcHktaWYtY2hhbmdlIi4uLgotaGVhZGVyczoKLQkoY2QgJChkb2NkaXIpOyAkKE1BS0UpIHByb3RvcyAkKEZMQUdTX1RPX1BBU1MpKQotCWNwICQoZG9jZGlyKS9iZmQuaCBiZmQtaW4yLmgtbmV3Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGJmZC1pbjIuaC1uZXcgJChzcmNkaXIpL2JmZC1pbjIuaAotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCWNwICQoZG9jZGlyKS9saWJjb2ZmLmggbGliY29mZi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJjb2ZmLmgtbmV3ICQoc3JjZGlyKS9saWJjb2ZmLmgKLQotIyBXZSBvbmx5IHJlYnVpbGQgdGhlIGhlYWRlciBmaWxlcyBhdXRvbWF0aWNhbGx5IGlmIHdlIGhhdmUgYmVlbgotIyBjb25maWd1cmVkIHdpdGggLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlLgotCi0kKHNyY2RpcikvYmZkLWluMi5oOiBATUFJTlRAIHN0bXAtYmluMi1oIDsgQHRydWUKLXN0bXAtYmluMi1oOiAkKEJGRF9IX0ZJTEVTKQotCShjZCAkKGRvY2Rpcik7ICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBiZmQuaCkKLQljcCAkKGRvY2RpcikvYmZkLmggYmZkLWluMi5oLW5ldwotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBiZmQtaW4yLmgtbmV3ICQoc3JjZGlyKS9iZmQtaW4yLmgKLQl0b3VjaCBzdG1wLWJpbjItaAotCi0kKHNyY2RpcikvbGliYmZkLmg6IEBNQUlOVEAgc3RtcC1sYmZkLWggOyBAdHJ1ZQotc3RtcC1sYmZkLWg6ICQoTElCQkZEX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmJmZC5oKQotCWNwICQoZG9jZGlyKS9saWJiZmQuaCBsaWJiZmQuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLmgtbmV3ICQoc3JjZGlyKS9saWJiZmQuaAotCXRvdWNoIHN0bXAtbGJmZC1oCi0KLSQoc3JjZGlyKS9saWJjb2ZmLmg6IEBNQUlOVEAgc3RtcC1sY29mZi1oIDsgQHRydWUKLXN0bXAtbGNvZmYtaDogJChMSUJDT0ZGX0hfRklMRVMpCi0JKGNkICQoZG9jZGlyKTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIGxpYmNvZmYuaCkKLQljcCAkKGRvY2RpcikvbGliY29mZi5oIGxpYmNvZmYuaC1uZXcKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbGliY29mZi5oLW5ldyAkKHNyY2RpcikvbGliY29mZi5oCi0JdG91Y2ggc3RtcC1sY29mZi1oCi0KLSMgV2Ugd2FudCB0byByZXJ1biBjb25maWd1cmUgaWYgY29uZmlnLmJmZCBvciBjb25maWd1cmUuaG9zdCBjaGFuZ2UuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWcuYmZkICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotZWxmYXJtLW9hYmkubG86IGVsZmFybS1vYWJpLmMgZWxmMzItYXJtLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi1lbGZhcm0tbmFiaS5sbzogZWxmYXJtLW5hYmkuYyBlbGYzMi1hcm0uaCBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotYXJjaGl2ZS5sbzogYXJjaGl2ZS5jICQoSU5DRElSKS9hb3V0L2FyLmggJChJTkNESVIpL2FvdXQvcmFubGliLmgKLWFyY2h1cmVzLmxvOiBhcmNodXJlcy5jCi1iZmQubG86IGJmZC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBsaWJjb2ZmLmggXAotICBsaWJlY29mZi5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1jYWNoZS5sbzogY2FjaGUuYwotY29mZmdlbi5sbzogY29mZmdlbi5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotY29yZWZpbGUubG86IGNvcmVmaWxlLmMKLWZvcm1hdC5sbzogZm9ybWF0LmMKLWluaXQubG86IGluaXQuYwotbGliYmZkLmxvOiBsaWJiZmQuYwotb3BuY2xzLmxvOiBvcG5jbHMuYyAkKElOQ0RJUikvb2JqYWxsb2MuaAotcmVsb2MubG86IHJlbG9jLmMgJChJTkNESVIpL2JmZGxpbmsuaAotc2VjdGlvbi5sbzogc2VjdGlvbi5jICQoSU5DRElSKS9iZmRsaW5rLmgKLXN5bXMubG86IHN5bXMuYyAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotdGFyZ2V0cy5sbzogdGFyZ2V0cy5jICQoSU5DRElSKS9mbm1hdGNoLmggdGFyZ21hdGNoLmgKLWhhc2gubG86IGhhc2guYyAkKElOQ0RJUikvb2JqYWxsb2MuaAotbGlua2VyLmxvOiBsaW5rZXIuYyAkKElOQ0RJUikvYmZkbGluay5oIGdlbmxpbmsuaAotc3JlYy5sbzogc3JlYy5jICQoSU5DRElSKS9saWJpYmVydHkuaAotYmluYXJ5LmxvOiBiaW5hcnkuYwotdGVraGV4LmxvOiB0ZWtoZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWloZXgubG86IGloZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXN0YWJzLmxvOiBzdGFicy5jICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN0YWItc3ltcy5sbzogc3RhYi1zeW1zLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotY3B1LWEyOWsubG86IGNwdS1hMjlrLmMKLWNwdS1hbHBoYS5sbzogY3B1LWFscGhhLmMKLWNwdS1hcmMubG86IGNwdS1hcmMuYwotY3B1LWFybS5sbzogY3B1LWFybS5jCi1jcHUtZDEwdi5sbzogY3B1LWQxMHYuYwotY3B1LWQzMHYubG86IGNwdS1kMzB2LmMKLWNwdS1mcjMwLmxvOiBjcHUtZnIzMC5jCi1jcHUtaDgzMDAubG86IGNwdS1oODMwMC5jCi1jcHUtaDg1MDAubG86IGNwdS1oODUwMC5jCi1jcHUtaHBwYS5sbzogY3B1LWhwcGEuYwotY3B1LWkzODYubG86IGNwdS1pMzg2LmMKLWNwdS1pODYwLmxvOiBjcHUtaTg2MC5jCi1jcHUtaTk2MC5sbzogY3B1LWk5NjAuYwotY3B1LW0zMnIubG86IGNwdS1tMzJyLmMKLWNwdS1tNjhrLmxvOiBjcHUtbTY4ay5jCi1jcHUtbTg4ay5sbzogY3B1LW04OGsuYwotY3B1LW0xMDIwMC5sbzogY3B1LW0xMDIwMC5jCi1jcHUtbTEwMzAwLmxvOiBjcHUtbTEwMzAwLmMKLWNwdS1tY29yZS5sbzogY3B1LW1jb3JlLmMKLWNwdS1taXBzLmxvOiBjcHUtbWlwcy5jCi1jcHUtbnMzMmsubG86IGNwdS1uczMyay5jIG5zMzJrLmgKLWNwdS1wb3dlcnBjLmxvOiBjcHUtcG93ZXJwYy5jCi1jcHUtcnM2MDAwLmxvOiBjcHUtcnM2MDAwLmMKLWNwdS1zaC5sbzogY3B1LXNoLmMKLWNwdS1zcGFyYy5sbzogY3B1LXNwYXJjLmMKLWNwdS10aWMzMC5sbzogY3B1LXRpYzMwLmMKLWNwdS10aWM4MC5sbzogY3B1LXRpYzgwLmMKLWNwdS12ODUwLmxvOiBjcHUtdjg1MC5jCi1jcHUtdmF4LmxvOiBjcHUtdmF4LmMKLWNwdS13ZTMyay5sbzogY3B1LXdlMzJrLmMKLWNwdS13NjUubG86IGNwdS13NjUuYwotY3B1LXo4ay5sbzogY3B1LXo4ay5jCi1hb3V0LWFkb2JlLmxvOiBhb3V0LWFkb2JlLmMgJChJTkNESVIpL2FvdXQvYWRvYmUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotYW91dC1hcm0ubG86IGFvdXQtYXJtLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0eC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGFvdXQtdGFyZ2V0LmgKLWFvdXQtbnMzMmsubG86IGFvdXQtbnMzMmsuYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gIG5zMzJrLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLWFvdXQtc3BhcmNsZS5sbzogYW91dC1zcGFyY2xlLmMgJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxpYmFvdXQuaCBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1hb3V0LXRpYzMwLmxvOiBhb3V0LXRpYzMwLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0eC5oCi1hb3V0MC5sbzogYW91dDAuYyBhb3V0ZjEuaCAkKElOQ0RJUikvYW91dC9zdW40LmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi1hb3V0MzIubG86IGFvdXQzMi5jIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotYm91dC5sbzogYm91dC5jICQoSU5DRElSKS9iZmRsaW5rLmggZ2VubGluay5oICQoSU5DRElSKS9ib3V0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIGxpYmFvdXQuaAotY2YtaTM4Nmx5bngubG86IGNmLWkzODZseW54LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2YtbTY4a2x5bngubG86IGNmLW02OGtseW54LmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY2Ytc3BhcmNseW54LmxvOiBjZi1zcGFyY2x5bnguYyBjb2ZmLXNwYXJjLmMgJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYTI5ay5sbzogY29mZi1hMjlrLmMgJChJTkNESVIpL2NvZmYvYTI5ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtYXBvbGxvLmxvOiBjb2ZmLWFwb2xsby5jICQoSU5DRElSKS9jb2ZmL2Fwb2xsby5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hcm0ubG86IGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1hdXgubG86IGNvZmYtYXV4LmMgJChJTkNESVIpL2NvZmYvYXV4LWNvZmYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvbTY4ay5oIGNvZmYtbTY4ay5jIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4MzAwLmxvOiBjb2ZmLWg4MzAwLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAotICAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWg4NTAwLmxvOiBjb2ZmLWg4NTAwLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWkzODYubG86IGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWk4NjAubG86IGNvZmYtaTg2MC5jICQoSU5DRElSKS9jb2ZmL2k4NjAuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLWdvMzIubG86IGNvZmYtZ28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtaTk2MC5sbzogY29mZi1pOTYwLmMgJChJTkNESVIpL2NvZmYvaTk2MC5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTY4ay5sbzogY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbTg4ay5sbzogY29mZi1tODhrLmMgJChJTkNESVIpL2NvZmYvbTg4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtbWlwcy5sbzogY29mZi1taXBzLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvbWlwcy5oIGxpYmNvZmYuaCBsaWJlY29mZi5oIGNvZmZzd2FwLmggXAotICBlY29mZnN3YXAuaAotY29mZi1wbWFjLmxvOiBjb2ZmLXBtYWMuYyBjb2ZmLXJzNjAwMC5jICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi9yczYwMDAuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi1yczYwMDAubG86IGNvZmYtcnM2MDAwLmMgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXNoLmxvOiBjb2ZmLXNoLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9zaC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXNwYXJjLmxvOiBjb2ZmLXNwYXJjLmMgJChJTkNESVIpL2NvZmYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtc3RnbzMyLmxvOiBjb2ZmLXN0Z28zMi5jIGNvZmYtaTM4Ni5jICQoSU5DRElSKS9jb2ZmL2kzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvZ28zMmV4ZS5oIFwKLSAgbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBjb2Zmc3dhcC5oIFwKLSAgZ28zMnN0dWIuaAotY29mZi1zdm02OGsubG86IGNvZmYtc3ZtNjhrLmMgY29mZi1tNjhrLmMgJChJTkNESVIpL2NvZmYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWMzMC5sbzogY29mZi10aWMzMC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi10aWM4MC5sbzogY29mZi10aWM4MC5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oIGNvZmZjb2RlLmggY29mZnN3YXAuaAotY29mZi11NjhrLmxvOiBjb2ZmLXU2OGsuYyBjb2ZmLW02OGsuYyAkKElOQ0RJUikvY29mZi9tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmNvZGUuaCBjb2Zmc3dhcC5oCi1jb2ZmLXdlMzJrLmxvOiBjb2ZmLXdlMzJrLmMgJChJTkNESVIpL2NvZmYvd2UzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtdzY1LmxvOiBjb2ZmLXc2NS5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmYtejhrLmxvOiBjb2ZmLXo4ay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaCBjb2ZmY29kZS5oIGNvZmZzd2FwLmgKLWNvZmZsaW5rLmxvOiBjb2ZmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIGxpYmNvZmYuaAotZHdhcmYxLmxvOiBkd2FyZjEuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2R3YXJmLmgKLWR3YXJmMi5sbzogZHdhcmYyLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZWNvZmYubG86IGVjb2ZmLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hci5oIFwKLSAgJChJTkNESVIpL2FvdXQvcmFubGliLmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgbGliY29mZi5oIGxpYmVjb2ZmLmgKLWVjb2ZmbGluay5sbzogZWNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JqYWxsb2MuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIGxpYmNvZmYuaCBsaWJlY29mZi5oCi1lbGYubG86IGVsZi5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1lbGYzMi1hcmMubG86IGVsZjMyLWFyYy5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGZhcm0tb2FiaS5sbzogZWxmYXJtLW9hYmkuYyAkKElOQ0RJUikvZWxmL2FybS1vYWJpLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItYXJtLmggZWxmMzItdGFyZ2V0LmgKLWVsZmFybS1uYWJpLmxvOiBlbGZhcm0tbmFiaS5jICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIGVsZjMyLWFybS5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWQxMHYubG86IGVsZjMyLWQxMHYuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1kMzB2LmxvOiBlbGYzMi1kMzB2LmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItZnIzMC5sbzogZWxmMzItZnIzMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9mcjMwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzItZ2VuLmxvOiBlbGYzMi1nZW4uYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1ocHBhLmxvOiBlbGYzMi1ocHBhLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICBlbGYzMi1ocHBhLmggbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBocHBhX3N0dWJzLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWkzODYubG86IGVsZjMyLWkzODYuYyAkKElOQ0RJUikvYmZkbGluay5oIGVsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvaTM4Ni5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLWk4NjAubG86IGVsZjMyLWk4NjAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1pOTYwLmxvOiBlbGYzMi1pOTYwLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL2k5NjAuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tMzJyLmxvOiBlbGYzMi1tMzJyLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvZWxmL20zMnIuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tNjhrLmxvOiBlbGYzMi1tNjhrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL202OGsuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1tODhrLmxvOiBlbGYzMi1tODhrLmMgZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmLW0xMDIwMC5sbzogZWxmLW0xMDIwMC5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZi1tMTAzMDAubG86IGVsZi1tMTAzMDAuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvbW4xMDMwMC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItbWNvcmUubG86IGVsZjMyLW1jb3JlLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL21jb3JlLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIGVsZjMyLXRhcmdldC5oCi1lbGYzMi1taXBzLmxvOiBlbGYzMi1taXBzLmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAotICBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvbWlwcy5oIGVjb2Zmc3dhcC5oIFwKLSAgZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXBwYy5sbzogZWxmMzItcHBjLmMgJChJTkNESVIpL2JmZGxpbmsuaCBlbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXNoLmxvOiBlbGYzMi1zaC5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9zaC5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggZWxmMzItdGFyZ2V0LmgKLWVsZjMyLXNwYXJjLmxvOiBlbGYzMi1zcGFyYy5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGYzMi10YXJnZXQuaAotZWxmMzItdjg1MC5sbzogZWxmMzItdjg1MC5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi92ODUwLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlbGYzMi10YXJnZXQuaAotZWxmMzIubG86IGVsZjMyLmMgZWxmY29kZS5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgZWxmY29yZS5oIGVsZmxpbmsuaAotZWxmbGluay5sbzogZWxmbGluay5jICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oCi1lcG9jLXBlLWFybS5sbzogZXBvYy1wZS1hcm0uYyBwZS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLWVwb2MtcGVpLWFybS5sbzogZXBvYy1wZWktYXJtLmMgcGVpLWFybS5jIGNvZmYtYXJtLmMgJChJTkNESVIpL2NvZmYvYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotaHAzMDBic2QubG86IGhwMzAwYnNkLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1ocDMwMGhwdXgubG86IGhwMzAwaHB1eC5jICQoSU5DRElSKS9hb3V0L2hwMzAwaHB1eC5oIFwKLSAgYW91dHguaCAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGFvdXQtdGFyZ2V0LmgKLXNvbS5sbzogc29tLmMKLWkzODZhb3V0LmxvOiBpMzg2YW91dC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmJzZC5sbzogaTM4NmJzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotaTM4NmR5bml4LmxvOiBpMzg2ZHluaXguYyAkKElOQ0RJUikvYW91dC9keW5peDMuaCBhb3V0eC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1pMzg2ZnJlZWJzZC5sbzogaTM4NmZyZWVic2QuYyBmcmVlYnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bGludXgubG86IGkzODZsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotaTM4Nmx5bngubG86IGkzODZseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bXNkb3MubG86IGkzODZtc2Rvcy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1pMzg2bmV0YnNkLmxvOiBpMzg2bmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1pMzg2bWFjaDMubG86IGkzODZtYWNoMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotaTM4Nm9zOWsubG86IGkzODZvczlrLmMgJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvb3M5ay5oCi1pZWVlLmxvOiBpZWVlLmMgJChJTkNESVIpL2llZWUuaCBsaWJpZWVlLmgKLW02OGs0a25ldGJzZC5sbzogbTY4azRrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbGludXgubG86IG02OGtsaW51eC5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbTY4a2x5bngubG86IG02OGtseW54LmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tNjhrbmV0YnNkLmxvOiBtNjhrbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1tODhrbWFjaDMubG86IG04OGttYWNoMy5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbWlwc2JzZC5sbzogbWlwc2JzZC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotbmV3c29zMy5sbzogbmV3c29zMy5jICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggYW91dC10YXJnZXQuaAotbmxtLmxvOiBubG0uYyBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotbmxtMzItaTM4Ni5sbzogbmxtMzItaTM4Ni5jICQoSU5DRElSKS9ubG0vaTM4Ni1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXNwYXJjLmxvOiBubG0zMi1zcGFyYy5jICQoSU5DRElSKS9ubG0vc3BhcmMzMi1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTMyLXBwYy5sbzogbmxtMzItcHBjLmMgJChJTkNESVIpL25sbS9wcGMtZXh0LmggbGlibmxtLmggXAotICAkKElOQ0RJUikvbmxtL2NvbW1vbi5oICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggXAotICBubG1zd2FwLmggbmxtLXRhcmdldC5oCi1ubG0zMi5sbzogbmxtMzIuYyBubG1jb2RlLmggbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCBcCi0gICQoSU5DRElSKS9ubG0vaW50ZXJuYWwuaCAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmgKLW5zMzJrbmV0YnNkLmxvOiBuczMya25ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotb2FzeXMubG86IG9hc3lzLmMgJChJTkNESVIpL29hc3lzLmggbGlib2FzeXMuaAotcGM1MzItbWFjaC5sbzogcGM1MzItbWFjaC5jIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmggYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotcGUtYXJtLmxvOiBwZS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaS1hcm0ubG86IHBlaS1hcm0uYyBjb2ZmLWFybS5jICQoSU5DRElSKS9jb2ZmL2FybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlLWkzODYubG86IHBlLWkzODYuYyBjb2ZmLWkzODYuYyAkKElOQ0RJUikvY29mZi9pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGVpLWkzODYubG86IHBlaS1pMzg2LmMgY29mZi1pMzg2LmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlLW1jb3JlLmxvOiBwZS1tY29yZS5jIGNvZmYtbWNvcmUuYyAkKElOQ0RJUikvY29mZi9tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9wZS5oIGxpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggY29mZmNvZGUuaCBwZWljb2RlLmgKLXBlaS1tY29yZS5sbzogcGVpLW1jb3JlLmMgY29mZi1tY29yZS5jICQoSU5DRElSKS9jb2ZmL21jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcGUtcHBjLmxvOiBwZS1wcGMuYyBjb2ZmLXBwYy5jICQoSU5DRElSKS9jb2ZmL3Bvd2VycGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcGUuaCBsaWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIGNvZmZjb2RlLmggcGVpY29kZS5oCi1wZWktcHBjLmxvOiBwZWktcHBjLmMgY29mZi1wcGMuYyAkKElOQ0RJUikvY29mZi9wb3dlcnBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3BlLmggbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBjb2ZmY29kZS5oIHBlaWNvZGUuaAotcHBjYm9vdC5sbzogcHBjYm9vdC5jCi1yZWxvYzE2LmxvOiByZWxvYzE2LmMgJChJTkNESVIpL2JmZGxpbmsuaCBnZW5saW5rLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGxpYmNvZmYuaAotcmlzY2l4LmxvOiByaXNjaXguYyBsaWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gIGFvdXQtdGFyZ2V0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmgKLXNwYXJjbGludXgubG86IHNwYXJjbGludXguYyAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBcCi0gIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIGFvdXQtdGFyZ2V0LmgKLXNwYXJjbHlueC5sbzogc3BhcmNseW54LmMgJChJTkNESVIpL2FvdXQvc3VuNC5oIGxpYmFvdXQuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggYW91dC10YXJnZXQuaAotc3BhcmNuZXRic2QubG86IHNwYXJjbmV0YnNkLmMgbmV0YnNkLmggbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBhb3V0LXRhcmdldC5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9hci5oCi1zdW5vcy5sbzogc3Vub3MuYyAkKElOQ0RJUikvYmZkbGluay5oIGxpYmFvdXQuaCBhb3V0ZjEuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N1bjQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaCBhb3V0LXRhcmdldC5oCi12YXhuZXRic2QubG86IHZheG5ldGJzZC5jIG5ldGJzZC5oIGxpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgYW91dC10YXJnZXQuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvYXIuaAotdmVyc2Fkb3MubG86IHZlcnNhZG9zLmMgJChJTkNESVIpL2xpYmliZXJ0eS5oCi12bXMubG86IHZtcy5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXZtcy1nc2QubG86IHZtcy1nc2QuYyAkKElOQ0RJUikvYmZkbGluay5oIHZtcy5oCi12bXMtaGRyLmxvOiB2bXMtaGRyLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLW1pc2MubG86IHZtcy1taXNjLmMgJChJTkNESVIpL2JmZGxpbmsuaCB2bXMuaAotdm1zLXRpci5sbzogdm1zLXRpci5jICQoSU5DRElSKS9iZmRsaW5rLmggdm1zLmgKLXhjb2ZmbGluay5sbzogeGNvZmZsaW5rLmMgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgbGliY29mZi5oCi1hb3V0NjQubG86IGFvdXQ2NC5jIGFvdXR4LmggJChJTkNESVIpL2JmZGxpbmsuaCBsaWJhb3V0LmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaAotY29mZi1hbHBoYS5sbzogY29mZi1hbHBoYS5jICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL3N5bWNvbnN0LmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2FscGhhLmggJChJTkNESVIpL2FvdXQvYXIuaCBsaWJjb2ZmLmggXAotICBsaWJlY29mZi5oIGNvZmZzd2FwLmggZWNvZmZzd2FwLmgKLWRlbW82NC5sbzogZGVtbzY0LmMgYW91dGYxLmggJChJTkNESVIpL2FvdXQvc3VuNC5oIFwKLSAgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBhb3V0LXRhcmdldC5oCi1lbGY2NC1hbHBoYS5sbzogZWxmNjQtYWxwaGEuYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9hbHBoYS5oICQoSU5DRElSKS9hb3V0L2FyLmggXAotICBsaWJjb2ZmLmggbGliZWNvZmYuaCBlY29mZnN3YXAuaCBlbGY2NC10YXJnZXQuaAotZWxmNjQtZ2VuLmxvOiBlbGY2NC1nZW4uYyBlbGYtYmZkLmggJChJTkNESVIpL2VsZi9jb21tb24uaCBcCi0gICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGVsZjY0LXRhcmdldC5oCi1lbGY2NC1taXBzLmxvOiBlbGY2NC1taXBzLmMgJChJTkNESVIpL2FvdXQvYXIuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgZ2VubGluay5oIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9hbHBoYS5oIGVjb2Zmc3dhcC5oIFwKLSAgZWxmNjQtdGFyZ2V0LmgKLWVsZjY0LXNwYXJjLmxvOiBlbGY2NC1zcGFyYy5jIGVsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBlbGY2NC10YXJnZXQuaAotZWxmNjQubG86IGVsZjY0LmMgZWxmY29kZS5oICQoSU5DRElSKS9iZmRsaW5rLmggZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgZWxmY29yZS5oIGVsZmxpbmsuaAotbmxtMzItYWxwaGEubG86IG5sbTMyLWFscGhhLmMgJChJTkNESVIpL25sbS9hbHBoYS1leHQuaCBcCi0gIGxpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbXN3YXAuaCBubG0tdGFyZ2V0LmgKLW5sbTY0LmxvOiBubG02NC5jIG5sbWNvZGUuaCBsaWJubG0uaCAkKElOQ0RJUikvbmxtL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL25sbS9pbnRlcm5hbC5oICQoSU5DRElSKS9ubG0vZXh0ZXJuYWwuaAotYWl4Mzg2LWNvcmUubG86IGFpeDM4Ni1jb3JlLmMgJChJTkNESVIpL2NvZmYvaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBsaWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotaHB1eC1jb3JlLmxvOiBocHV4LWNvcmUuYwotaXJpeC1jb3JlLmxvOiBpcml4LWNvcmUuYwotbHlueC1jb3JlLmxvOiBseW54LWNvcmUuYwotb3NmLWNvcmUubG86IG9zZi1jb3JlLmMKLXNjbzUtY29yZS5sbzogc2NvNS1jb3JlLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLXRyYWQtY29yZS5sbzogdHJhZC1jb3JlLmMgbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBob3N0cy9pMzg2bGludXguaAotY2lzY28tY29yZS5sbzogY2lzY28tY29yZS5jCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL1BPUlRJTkcgYi9iZmQvUE9SVElORwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZmQ3Ny4uMDAwMDAwMAotLS0gYS9iZmQvUE9SVElORworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLQlQcmVsaW1pbmFyeSBOb3RlcyBvbiBQb3J0aW5nIEJGRAotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSAnaG9zdCcgaXMgdGhlIHN5c3RlbSBhIHRvb2wgcnVucyAqb24qLgotVGhlICd0YXJnZXQnIGlzIHRoZSBzeXN0ZW0gYSB0b29sIHJ1bnMgKmZvciosIGkuZS4KLWEgdG9vbCBjYW4gcmVhZC93cml0ZSB0aGUgYmluYXJpZXMgb2YgdGhlIHRhcmdldC4KLQotUG9ydGluZyB0byBhIG5ldyBob3N0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVBpY2sgYSBuYW1lIGZvciB5b3VyIGhvc3QuIENhbGwgdGhhdCA8aG9zdD4uCi0oPGhvc3Q+IG1pZ2h0IGJlIHN1bjQsIC4uLikKLUNyZWF0ZSBhIGZpbGUgaG9zdHMvPGhvc3Q+Lm1oLgotCi1Qb3J0aW5nIHRvIGEgbmV3IHRhcmdldAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVBpY2sgYSBuYW1lIGZvciB5b3VyIHRhcmdldC4gQ2FsbCB0aGF0IDx0YXJnZXQ+LgotQ2FsbCB0aGUgbmFtZSBmb3IgeW91ciBDUFUgYXJjaGl0ZWN0dXJlIDxjcHU+LgotWW91IG5lZWQgdG8gY3JlYXRlIDx0YXJnZXQ+LmMgYW5kIGNvbmZpZy88dGFyZ2V0Pi5tdCwKLWFuZCBhZGQgYSBjYXNlIGZvciBpdCB0byBhIGNhc2Ugc3RhdGVtZW50cyBpbiBiZmQvY29uZmlndXJlLmhvc3QgYW5kCi1iZmQvY29uZmlnLmJmZCwgd2hpY2ggYXNzb2NpYXRlcyBlYWNoIGNhbm9uaWNhbCBob3N0IHR5cGUgd2l0aCBhIEJGRAotaG9zdCB0eXBlICh1c2VkIGFzIHRoZSBiYXNlIG9mIHRoZSBtYWtlZmlsZSBmcmFnbWVudCBuYW1lcyksIGFuZCB0byB0aGUKLXRhYmxlIGluIGJmZC9jb25maWd1cmUuaW4gd2hpY2ggYXNzb2NpYXRlcyBlYWNoIHRhcmdldCB2ZWN0b3Igd2l0aAotdGhlIC5vIGZpbGVzIGl0IHVzZXMuCi0KLWNvbmZpZy88dGFyZ2V0Pi5tdCBpcyBhIE1ha2VmaWxlIGZyYWdtZW50LgotVGhlIGZvbGxvd2luZyBpcyB1c3VhbGx5IGVub3VnaDoKLURFRkFVTFRfVkVDVE9SPTx0YXJnZXQ+X3ZlYwotU0VMRUNUX0FSQ0hJVEVDVFVSRVM9YmZkXzxjcHU+X2FyY2gKLQotU2VlIHRoZSBsaXN0IG9mIGNwdSB0eXBlcyBpbiBhcmNodXJlcy5jLCBvciAibHMgY3B1LSouYyIuCi1JZiB5b3VyIGFyY2hpdGVjdHVyZSBpcyBuZXcsIHlvdSBuZWVkIHRvIGFkZCBpdCB0byB0aGUgdGFibGVzCi1pbiBiZmQvYXJjaHVyZXMuYywgb3Bjb2Rlcy9jb25maWd1cmUuaW4sIGFuZCBiaW51dGlscy9vYmpkdW1wLmMuCi0KLUZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IC5tdCBhbmQgLm1oIGZpbGVzLCBzZWUgY29uZmlnL1JFQURNRS4KLQotVGhlIGZpbGUgPHRhcmdldD4uYyBpcyB0aGUgaGFyZCBwYXJ0LiAgSXQgaW1wbGVtZW50cyB0aGUKLWJmZF90YXJnZXQgPHRhcmdldD5fdmVjLCB3aGljaCBpbmNsdWRlcyBwb2ludGVycyB0bwotZnVuY3Rpb25zIHRoYXQgZG8gdGhlIGFjdHVhbCA8dGFyZ2V0Pi1zcGVjaWZpYyBtZXRob2RzLgotCi1Qb3J0aW5nIHRvIGEgPHRhcmdldD4gdGhhdCB1c2VzIHRoZSBhLm91dCBiaW5hcnkgZm9ybWF0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUluIHRoaXMgY2FzZSwgdGhlIGluY2x1ZGUgZmlsZSBhb3V0LXRhcmdldC5oIHByb2JhYnkgZG9lcyBtb3N0Ci1vZiB3aGF0IHlvdSBuZWVkLiBUaGUgcHJvZ3JhbSBnZW4tYW91dCBnZW5lcmF0ZXMgPHRhcmdldD4uYyBmb3IKLXlvdSBhdXRvbWF0aWNhbGx5IGZvciBtYW55IGEub3V0IHN5c3RlbXMuICBEbzoKLQltYWtlIGdlbi1hb3V0Ci0JLi9nZW4tYW91dCA8dGFyZ2V0PiA+IDx0YXJnZXQ+LmMKLShUaGlzIG9ubHkgd29ya3MgaWYgeW91IGFyZSBidWlsZGluZyBvbiB0aGUgdGFyZ2V0ICgibmF0aXZlIikuCi1JZiB5b3UgbXVzdCBtYWtlIGEgY3Jvc3MtcG9ydCBmcm9tIHNjcmF0Y2gsIGNvcHkgdGhlIG1vc3QKLXNpbWlsYXIgZXhpc3RpbmcgZmlsZSB0aGF0IGluY2x1ZGVzIGFvdXQtdGFyZ2V0LmgsIGFuZCBmaXggd2hhdCBpcyB3cm9uZy4pCi0KLUNoZWNrIHRoZSBwYXJhbWV0ZXJzIGluIDx0YXJnZXQ+LmMsIGFuZCBmaXggYW55dGhpbmcgdGhhdCBpcyB3cm9uZy4KLShBbHNvIGxldCB1cyBrbm93IGFib3V0IGl0OyBwZXJoYXBzIHdlIGNhbiBpbXByb3ZlIGdlbi1hb3V0LmMuKQotCi1UQVJHRVRfSVNfQklHX0VORElBTl9QCi0JU2hvdWxkIGJlIGRlZmluZWQgaWYgPHRhcmdldD4gaXMgYmlnLWVuZGlhbi4KLQotTl9IRUFERVJfSU5fVEVYVCh4KQotCVNlZSBkaXNjdXNzaW9uIGluIC4uL2luY2x1ZGUvYW91dC9hb3V0NjQuaC4KLQotQllURVNfSU5fV09SRAotCU51bWJlciBvZiBieXRlcyBwZXIgd29yZC4gKFVzdWFsbHkgNCBidXQgY2FuIGJlIDguKQotCi1BUkNICi0JTnVtYmVyIG9mIGJpdHMgcGVyIHdvcmQuICAoVXN1YWxseSAzMiwgYnV0IGNhbiBiZSA2NC4pCi0KLUVOVFJZX0NBTl9CRV9aRVJPCi0JRGVmaW5lIGlmIHRoZSBleHRyeSBwb2ludCAoc3RhcnQgYWRkcmVzcyBvZiBhbgotCWV4ZWN1dGFibGUgcHJvZ3JhbSkgY2FuIGJlIDB4MC4KLQotVEVYVF9TVEFSVF9BRERSCi0JVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHNlZ2VtbnQgaW4KLQl2aXJ0dWFsIG1lbW9yeS4gIE5vcm1hbGx5LCB0aGUgc2FtZSBhcyB0aGUgZW50cnkgcG9pbnQuCi0KLVRBUkdFVF9QQUdFX1NJWkUKLQotU0VHTUVOVF9TSVpFCi0gICAgICAgIFVzdWFsbHksIHRoZSBzYW1lIGFzIHRoZSBUQVJHRVRfUEFHRV9TSVpFLgotICAgICAgICBBbGlnbm1lbnQgbmVlZGVkIGZvciB0aGUgZGF0YSBzZWdtZW50LgotCi1UQVJHRVROQU1FCi0JVGhlIG5hbWUgb2YgdGhlIHRhcmdldCwgZm9yIHJ1bi10aW1lIGxvb2t1cHMuCi0JVXN1YWxseSAiYS5vdXQtPHRhcmdldD4iCmRpZmYgLS1naXQgYS9iZmQvUkVBRE1FIGIvYmZkL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjZTEzMy4uMDAwMDAwMAotLS0gYS9iZmQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotQkZEIGlzIGEgYW4gb2JqZWN0IGZpbGUgbGlicmFyeS4gIEl0IHBlcm1pdHMgYXBwbGljYXRpb25zIHRvIHVzZSB0aGUKLXNhbWUgcm91dGluZXMgdG8gcHJvY2VzcyBvYmplY3QgZmlsZXMgcmVnYXJkbGVzcyBvZiB0aGVpciBmb3JtYXQuCi0KLUJGRCBpcyB1c2VkIGJ5IHRoZSBHTlUgZGVidWdnZXIsIGFzc2VtYmxlciwgbGlua2VyLCBhbmQgdGhlIGJpbmFyeQotdXRpbGl0aWVzLgotCi1UaGUgZG9jdW1lbnRhdGlvbiBvbiB1c2luZyBCRkQgaXMgc2NhbnR5IGFuZCBtYXkgYmUgb2NjYXNpb25hbGx5Ci1pbmNvcnJlY3QuICBQb2ludGVycyB0byBkb2N1bWVudGF0aW9uIHByb2JsZW1zLCBvciBhbiBlbnRpcmVseQotcmV3cml0dGVuIG1hbnVhbCwgd291bGQgYmUgYXBwcmVjaWF0ZWQuCi0KLVRoZXJlIGlzIHNvbWUgQkZEIGludGVybmFscyBkb2N1bWVudGF0aW9uIGluIGRvYy9iZmRpbnQudGV4aSB3aGljaCBtYXkKLWhlbHAgcHJvZ3JhbW1lcnMgd2hvIHdhbnQgdG8gbW9kaWZ5IEJGRC4KLQotQkZEIGlzIG5vcm1hbGx5IGJ1aWx0IGFzIHBhcnQgb2YgYW5vdGhlciBwYWNrYWdlLiAgU2VlIHRoZSBidWlsZAotaW5zdHJ1Y3Rpb25zIGZvciB0aGF0IHBhY2thZ2UsIHByb2JhYmx5IGluIGEgUkVBRE1FIGZpbGUgaW4gdGhlCi1hcHByb3ByaWF0ZSBkaXJlY3RvcnkuCi0KLUJGRCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyZSBvcHRpb25zOgotCi0gIC0tdGFyZ2V0PVRBUkdFVAotCVRoZSBkZWZhdWx0IHRhcmdldCBmb3Igd2hpY2ggdG8gYnVpbGQgdGhlIGxpYnJhcnkuICBUQVJHRVQgaXMKLQlhIGNvbmZpZ3VyYXRpb24gdGFyZ2V0IHRyaXBsZXQsIHN1Y2ggYXMgc3BhcmMtc3VuLXNvbGFyaXMuCi0gIC0tZW5hYmxlLXRhcmdldHM9VEFSR0VULFRBUkdFVCxUQVJHRVQuLi4KLQlBZGRpdGlvbmFsIHRhcmdldHMgdGhlIGxpYnJhcnkgc2hvdWxkIHN1cHBvcnQuICBUbyBpbmNsdWRlCi0Jc3VwcG9ydCBmb3IgYWxsIGtub3duIHRhcmdldHMsIHVzZSAtLWVuYWJsZS10YXJnZXRzPWFsbC4KLSAgLS1lbmFibGUtNjQtYml0LWJmZAotCUluY2x1ZGUgc3VwcG9ydCBmb3IgNjQgYml0IHRhcmdldHMuICBUaGlzIGlzIGF1dG9tYXRpY2FsbHkKLQl0dXJuZWQgb24gaWYgeW91IGV4cGxpY2l0bHkgcmVxdWVzdCBhIDY0IGJpdCB0YXJnZXQsIGJ1dCBub3QKLQlmb3IgLS1lbmFibGUtdGFyZ2V0cz1hbGwuICBUaGlzIHJlcXVpcmVzIGEgY29tcGlsZXIgd2l0aCBhIDY0Ci0JYml0IGludGVnZXIgdHlwZSwgc3VjaCBhcyBnY2MuCi0gIC0tZW5hYmxlLXNoYXJlZAotCUJ1aWxkIEJGRCBhcyBhIHNoYXJlZCBsaWJyYXJ5LgotICAtLXdpdGgtbW1hcAotCVVzZSBtbWFwIHdoZW4gYWNjZXNzaW5nIGZpbGVzLiAgVGhpcyBpcyBmYXN0ZXIgb24gc29tZSBob3N0cywKLQlidXQgc2xvd2VyIG9uIG90aGVycy4gIEl0IG1heSBub3Qgd29yayBvbiBhbGwgaG9zdHMuCi0KLVJlcG9ydCBidWdzIHdpdGggQkZEIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZy4KLQotUGF0Y2hlcyBhcmUgZW5jb3VyYWdlZC4gIFdoZW4gc2VuZGluZyBwYXRjaGVzLCBhbHdheXMgc2VuZCB0aGUgb3V0cHV0Ci1vZiBkaWZmIC11IG9yIGRpZmYgLWMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSB0byB0aGUgbmV3IGZpbGUuICBEbyBub3QKLXNlbmQgZGVmYXVsdCBkaWZmIG91dHB1dC4gIERvIG5vdCBtYWtlIHRoZSBkaWZmIGZyb20gdGhlIG5ldyBmaWxlIHRvCi10aGUgb3JpZ2luYWwgZmlsZS4gIFJlbWVtYmVyIHRoYXQgYW55IHBhdGNoIG11c3Qgbm90IGJyZWFrIG90aGVyCi1zeXN0ZW1zLiAgUmVtZW1iZXIgdGhhdCBCRkQgbXVzdCBzdXBwb3J0IGNyb3NzIGNvbXBpbGF0aW9uIGZyb20gYW55Ci1ob3N0IHRvIGFueSB0YXJnZXQsIHNvIHBhdGNoZXMgd2hpY2ggdXNlIGBgI2lmZGVmIEhPU1QnJyBhcmUgbm90Ci1hY2NlcHRhYmxlLiAgUGxlYXNlIGFsc28gcmVhZCB0aGUgYGBSZXBvcnRpbmcgQnVncycnIHNlY3Rpb24gb2YgdGhlCi1nY2MgbWFudWFsLgotCi1CdWcgcmVwb3J0cyB3aXRob3V0IHBhdGNoZXMgd2lsbCBiZSByZW1lbWJlcmVkLCBidXQgdGhleSBtYXkgbmV2ZXIgZ2V0Ci1maXhlZCB1bnRpbCBzb21lYm9keSB2b2x1bnRlZXJzIHRvIGZpeCB0aGVtLgpkaWZmIC0tZ2l0IGEvYmZkL1RPRE8gYi9iZmQvVE9ETwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExMjczNS4uMDAwMDAwMAotLS0gYS9iZmQvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLVRoaW5ncyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUgZG9uZTogLSotIFRleHQgLSotCi0KLSBvIC0gQSBzb3VyY2Ugb2Ygc3BhY2UgbG9zc2FnZSBpcyB0aGF0IGFsbCB0aGUgdGFyZ2V0LWRlcGVuZGVudCBjb2RlCi0gICAgIGlzIGluIGEgc2luZ2xlIGJmZF90YXJnZXQgc3RydWN0dXJlLiAgSGVuY2UgYWxsIHRoZSBjb2RlIGZvcgotICAgICAqd3JpdGluZyogb2JqZWN0IGZpbGVzIGlzIHN0aWxsIHB1bGxlZCBpbnRvIGFsbCB0aGUgYXBwbGljYXRpb25zCi0gICAgIHRoYXQgb25seSBjYXJlIGFib3V0ICpyZWFkaW5nKiAoZ2RiLCBubSwgb2JqZHVtcCksIHdoaWxlIGdhcyBoYXMKLSAgICAgdG8gY2FycnkgYWxvbmcgYWxsIHRoZSB1bm5lZWRlZCBiYWdnYWdlIGZvciByZWFkaW5nIG9iamVjdHMuICBBbmQKLSAgICAgc28gb24uICBUaGlzIHdvdWxkIGJlIGEgc3Vic3RhbnRpYWwgY2hhbmdlLCBhbmQgdGhlIHBheW9mZiB3b3VsZAotICAgICBub3QgYWxsIHRoYXQgZ3JlYXQgKGVzc2VudGlhbGx5IG5vbmUgaWYgYmZkIGlzIHVzZWQgYXMgYSBzaGFyZWQKLSAgICAgbGlicmFyeSkuCi0KLSBvIC0gVGhlIHN0b3JhZ2UgbmVlZGVkIGJ5IEJGRCBkYXRhIHN0cnVjdHVyZXMgaXMgYWxzbyBsYXJnZXIgdGhhbiBzdHJpY3RseQotICAgICBuZWVkZWQuICBUaGlzIG1heSBiZSBkaWZmaWN1bHQgdG8gZG8gbXVjaCBhYm91dC4KLQotIG8gLSBpbXBsZW1lbnQgYmZkX2Fib3J0LCB3aGljaCBzaG91bGQgY2xvc2UgdGhlIGJmZCBidXQgbm90IGFsdGVyIHRoZQotICAgICBmaWxlc3lzdGVtLgotCi0gbyAtIHVwZGF0ZSB0aGUgYmZkIGRvYzsgd3JpdGUgYSBob3ctdG8td3JpdGUtYS1iYWNrZW5kIGRvYywgdGFrZSBvdXQKLSAgICAgdGhlIHN0dXBpZCBxdWlwcyBhbmQgZmlsbCBpbiBhbGwgdGhlIGJsYW5rcy4KLQotIG8gLSB1cGdyYWRlIHRoZSByZWxvYyBoYW5kbGluZyBhcyBwZXIgU3RldmUncyBzdWdnZXN0aW9uLgotCi0KLQotCmRpZmYgLS1naXQgYS9iZmQvYWNpbmNsdWRlLm00IGIvYmZkL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlMWMzMC4uMDAwMDAwMAotLS0gYS9iZmQvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLWRubCBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIHVzZSBmb3Blbi1iaW4uaCByYXRoZXIgdGhhbiBmb3Blbi1zYW1lLmguCi1BQ19ERUZVTihCRkRfQklOQVJZX0ZPUEVOLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9TWVNURU1dKQotY2FzZSAiJHtob3N0fSIgaW4KLWNoYW5nZXF1b3RlKCwpZG5sCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cykKLWNoYW5nZXF1b3RlKFssXSlkbmwKLSAgQUNfREVGSU5FKFVTRV9CSU5BUllfRk9QRU4sIDEsIFtVc2UgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzP10pIDs7Ci1lc2FjXSlkbmwKLQotZG5sIEdldCBhIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCB0byBwdXQgaW50byBNYWtlZmlsZS4KLUFDX0RFRlVOKEJGRF9DQ19GT1JfQlVJTEQsCi1bIyBQdXQgYSBwbGF1c2libGUgZGVmYXVsdCBmb3IgQ0NfRk9SX0JVSUxEIGluIE1ha2VmaWxlLgotaWYgdGVzdCAteiAiJENDX0ZPUl9CVUlMRCI7IHRoZW4KLSAgaWYgdGVzdCAieCRjcm9zc19jb21waWxpbmciID0gInhubyI7IHRoZW4KLSAgICBDQ19GT1JfQlVJTEQ9JyQoQ0MpJwotICBlbHNlCi0gICAgQ0NfRk9SX0JVSUxEPWdjYwotICBmaQotZmkKLUFDX1NVQlNUKENDX0ZPUl9CVUlMRCkKLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgQUNfQ0FDSEVfQ0hFQ0soW2ZvciBidWlsZCBzeXN0ZW0gZXhlY3V0YWJsZSBzdWZmaXhdLCBiZmRfY3ZfYnVpbGRfZXhlZXh0LAotICAgIFtjYXQgPiBhY19jX3Rlc3QuYyA8PCAnRU9GJwotaW50IG1haW4oKSB7Ci0vKiBOb3RoaW5nIG5lZWRlZCBoZXJlICovCi19Ci1FT0YKLSAgICAke0NDX0ZPUl9CVUlMRH0gLW8gYWNfY190ZXN0IGFtX2NfdGVzdC5jIDE+JjUgMj4mNQotICAgIGJmZF9jdl9idWlsZF9leGVleHQ9YGVjaG8gYWNfY190ZXN0LiogfCBncmVwIC12IGFjX2NfdGVzdC5jIHwgc2VkIC1lIHMvYWNfY190ZXN0Ly9gCi0gICAgcm0gLWYgYWNfY190ZXN0KgotICAgIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiA9IHggJiYgYmZkX2N2X2J1aWxkX2V4ZWV4dD1ub10pCi0gIEVYRUVYVF9GT1JfQlVJTEQ9IiIKLSAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFRfRk9SX0JVSUxEPSR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0KLWZpCi1BQ19TVUJTVChFWEVFWFRfRk9SX0JVSUxEKV0pZG5sCi0KLWRubCBTZWUgd2hldGhlciB3ZSBuZWVkIGEgZGVjbGFyYXRpb24gZm9yIGEgZnVuY3Rpb24uCi1BQ19ERUZVTihCRkRfTkVFRF9ERUNMQVJBVElPTiwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJDEgbXVzdCBiZSBkZWNsYXJlZF0pCi1BQ19DQUNIRV9WQUwoYmZkX2N2X2RlY2xfbmVlZGVkXyQxLAotW0FDX1RSWV9DT01QSUxFKFsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZl0sCi1bY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgJDFdLAotYmZkX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBiZmRfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKV0pCi1BQ19NU0dfUkVTVUxUKCRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEpCi1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfJDEgPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtORUVEX0RFQ0xBUkFUSU9OX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGEgdHlwZSAkMSBpbiBzeXMvcHJvY2ZzLmgKLQotQUNfREVGVU4oQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXJdLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlXyQxID0geWVzOyB0aGVuCi0gICBBQ19ERUZJTkUoW0hBVkVfXXRyYW5zbGl0KCQxLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSkKLV0pCi0KLQotZG5sIENoZWNrIGZvciBleGlzdGVuY2Ugb2YgbWVtYmVyICQyIGluIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRV9NRU1CRVIsCi1bQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDEuJDIgaW4gc3lzL3Byb2Nmcy5oXSkKLSBBQ19DQUNIRV9WQUwoYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiwKLSAgIFtBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD5dLAotICAgICAgWyQxIGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLiQyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9eWVzLAotICAgICAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMj1ubwotICAgKV0pCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl8kMV8kMiA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKVtfXXRyYW5zbGl0KCQyLCBbYS16XSwgW0EtWl0pLCAxLAotCSAgICAgW0RlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgJDEuJDIuXSkKLSBmaQotIEFDX01TR19SRVNVTFQoJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIpCi1dKQotCi0KZGlmZiAtLWdpdCBhL2JmZC9hY2xvY2FsLm00IGIvYmZkL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZGYxMGUuLjAwMDAwMDAKLS0tIGEvYmZkL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE0ICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgZm9wZW4tYmluLmggcmF0aGVyIHRoYW4gZm9wZW4tc2FtZS5oLgotQUNfREVGVU4oQkZEX0JJTkFSWV9GT1BFTiwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfU1lTVEVNXSkKLWNhc2UgIiR7aG9zdH0iIGluCi1jaGFuZ2VxdW90ZSgsKWRubAotKi0qLW1zZG9zKiB8ICotKi1nbzMyKiB8ICotKi1taW5ndzMyKiB8ICotKi1jeWd3aW4qIHwgKi0qLXdpbmRvd3MpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIEFDX0RFRklORShVU0VfQklOQVJZX0ZPUEVOLCAxLCBbVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz9dKSA7OwotZXNhY10pZG5sCi0KLWRubCBHZXQgYSBkZWZhdWx0IGZvciBDQ19GT1JfQlVJTEQgdG8gcHV0IGludG8gTWFrZWZpbGUuCi1BQ19ERUZVTihCRkRfQ0NfRk9SX0JVSUxELAotWyMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi1BQ19TVUJTVChDQ19GT1JfQlVJTEQpCi0jIEFsc28gc2V0IEVYRUVYVF9GT1JfQlVJTEQuCi1pZiB0ZXN0ICJ4JGNyb3NzX2NvbXBpbGluZyIgPSAieG5vIjsgdGhlbgotICBFWEVFWFRfRk9SX0JVSUxEPSckKEVYRUVYVCknCi1lbHNlCi0gIEFDX0NBQ0hFX0NIRUNLKFtmb3IgYnVpbGQgc3lzdGVtIGV4ZWN1dGFibGUgc3VmZml4XSwgYmZkX2N2X2J1aWxkX2V4ZWV4dCwKLSAgICBbY2F0ID4gYWNfY190ZXN0LmMgPDwgJ0VPRicKLWludCBtYWluKCkgewotLyogTm90aGluZyBuZWVkZWQgaGVyZSAqLwotfQotRU9GCi0gICAgJHtDQ19GT1JfQlVJTER9IC1vIGFjX2NfdGVzdCBhbV9jX3Rlc3QuYyAxPiY1IDI+JjUKLSAgICBiZmRfY3ZfYnVpbGRfZXhlZXh0PWBlY2hvIGFjX2NfdGVzdC4qIHwgZ3JlcCAtdiBhY19jX3Rlc3QuYyB8IHNlZCAtZSBzL2FjX2NfdGVzdC8vYAotICAgIHJtIC1mIGFjX2NfdGVzdCoKLSAgICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgPSB4ICYmIGJmZF9jdl9idWlsZF9leGVleHQ9bm9dKQotICBFWEVFWFRfRk9SX0JVSUxEPSIiCi0gIHRlc3QgeCIke2JmZF9jdl9idWlsZF9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUX0ZPUl9CVUlMRD0ke2JmZF9jdl9idWlsZF9leGVleHR9Ci1maQotQUNfU1VCU1QoRVhFRVhUX0ZPUl9CVUlMRCldKWRubAotCi1kbmwgU2VlIHdoZXRoZXIgd2UgbmVlZCBhIGRlY2xhcmF0aW9uIGZvciBhIGZ1bmN0aW9uLgotQUNfREVGVU4oQkZEX05FRURfREVDTEFSQVRJT04sCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyICQxIG11c3QgYmUgZGVjbGFyZWRdKQotQUNfQ0FDSEVfVkFMKGJmZF9jdl9kZWNsX25lZWRlZF8kMSwKLVtBQ19UUllfQ09NUElMRShbCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWZdLAotW2NoYXIgKigqcGZuKSA9IChjaGFyICooKikpICQxXSwKLWJmZF9jdl9kZWNsX25lZWRlZF8kMT1ubywgYmZkX2N2X2RlY2xfbmVlZGVkXyQxPXllcyldKQotQUNfTVNHX1JFU1VMVCgkYmZkX2N2X2RlY2xfbmVlZGVkXyQxKQotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkXyQxID0geWVzOyB0aGVuCi0gIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgIFtEZWZpbmUgaWYgJDEgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuXSkKLWZpCi1dKWRubAotCi1kbmwgQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhIHR5cGUgJDEgaW4gc3lzL3Byb2Nmcy5oCi0KLUFDX0RFRlVOKEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciAkMSBpbiBzeXMvcHJvY2ZzLmhdKQotIEFDX0NBQ0hFX1ZBTChiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEsCi0gICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKLSAgICAgIFskMSBhdmFyXSwKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMT15ZXMsCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDE9bm8KLSAgICldKQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV8kMSA9IHllczsgdGhlbgotICAgQUNfREVGSU5FKFtIQVZFX110cmFuc2xpdCgkMSwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLl0pCi0gZmkKLSBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfJDEpCi1dKQotCi0KLWRubCBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIG1lbWJlciAkMiBpbiB0eXBlICQxIGluIHN5cy9wcm9jZnMuaAotCi1BQ19ERUZVTihCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSLAotW0FDX01TR19DSEVDS0lORyhbZm9yICQxLiQyIGluIHN5cy9wcm9jZnMuaF0pCi0gQUNfQ0FDSEVfVkFMKGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIsCi0gICBbQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+XSwKLSAgICAgIFskMSBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci4kMl0sCi0gICAgICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyPXllcywKLSAgICAgIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDI9bm8KLSAgICldKQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfJDFfJDIgPSB5ZXM7IHRoZW4KLSAgIEFDX0RFRklORShbSEFWRV9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSlbX110cmFuc2xpdCgkMiwgW2Etel0sIFtBLVpdKSwgMSwKLQkgICAgIFtEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzICQxLiQyLl0pCi0gZmkKLSBBQ19NU0dfUkVTVUxUKCRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyXyQxXyQyKQotXSkKLQotCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgMzUgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotQUNfQ0FDSEVfTE9BRAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotXSkKLQotQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKLVtBQ19QUkVSRVEoMi4xMylkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nXSwKLW5lZWRfbG9ja3M9JGVuYWJsZXZhbCwKLW5lZWRfbG9ja3M9eWVzKQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLV0pCi0KLSMgQUNfTElCVE9PTF9ETE9QRU4gLSBjaGVjayBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbbHRfZGxvcGVuPXllc10pCi0KLSMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwKLVtBQ19FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywKLVtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywKLVtBQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLAotW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwKLVtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1NVQlNUKExEKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBQ19TWVNfTk1fUEFSU0UgLSBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQKLSMgYnkgQyBzeW1ib2wgbmFtZSBmcm9tIG5tLgotQUNfREVGVU4oQUNfU1lTX05NX1BBUlNFLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlLAotWyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotY2hhbmdlcXVvdGUoLClkbmwKLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRhY19zeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotY2hhbmdlcXVvdGUoLClkbmwKLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotY2hhbmdlcXVvdGUoWyxdKWRubAotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotQUNfTVNHX1JFU1VMVCgkYWNfcmVzdWx0KQotXSkKLQotIyBBQ19TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFDX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUgLSBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiB1bmRlcnNjb3JlPwotQUNfREVGVU4oQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSwKLVthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotZmkKLXJtIC1yZiBjb25mdGVzdCoKLV0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCi1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci1BQ19TVUJTVChVU0VfU1lNQk9MX1VOREVSU0NPUkUpZG5sCi1dKQotCi0jIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihBQ19DSEVDS19MSUJNLCBbCi1BQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsKQotQUNfQ0hFQ0tfTElCKG0sIGNvcykKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgWwotICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgWwotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwgTElCTFRETD0iLWxsdGRsIiwgWwotICAgIGNhc2UgIiRlbmFibGVfbHRkbF9pbnN0YWxsIiBpbgotICAgIG5vKSBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkgOzsKLSAgICAiIikgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiIDs7Ci0gICAgZXNhYwotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHgibm8iOyB0aGVuCi0gICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKLSAgZmkKLV0pCi0KLWRubCBvbGQgbmFtZXMKLUFDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19OTV9QQVJTRSwgW2luZGlyKFtBQ19TWVNfTk1fUEFSU0VdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfU1lNQk9MX1VOREVSU0NPUkUsIFtpbmRpcihbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLCBbaW5kaXIoW0FDX1NZU19MSUJUT09MX0NZR1dJTl0pXSlkbmwKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQpkaWZmIC0tZ2l0IGEvYmZkL2FpeDM4Ni1jb3JlLmMgYi9iZmQvYWl4Mzg2LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1ZmE5NC4uMDAwMDAwMAotLS0gYS9iZmQvYWl4Mzg2LWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFJWCBvbiBQUy8yIGNvcmUgZmlsZXMuCi0gICBUaGlzIHdhcyBiYXNlZCBvbiB0cmFkLWNvcmUuYywgd2hpY2ggd2FzIHdyaXR0ZW4gYnkgSm9obiBHaWxtb3JlIG9mCi0gICAgICAgIEN5Z251cyBTdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5ODgsIDg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1pbmggVHJhbi1MZSA8VFJBTkxFQElOVEVMTElDT1JQLkNPTT4uCi0gICBDb252ZXJ0ZWQgdG8gYmFjayBlbmQgZm9ybSBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaTM4Ni5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotI2lmIGRlZmluZWQgKF9BSVgpICYmIGRlZmluZWQgKF9JMzg2KQotI2RlZmluZSBOT0NIRUNLUwkJLyogdGhpcyBpcyBmb3IgY29yZWR1bXAuaCAqLwotI2RlZmluZSBfaF9VU0VSCQkJLyogYXZvaWQgaW5jbHVkaW5nIHVzZXIuaCBmcm9tIGNvcmVkdW1wLmggKi8KLSNpbmNsdWRlIDx1aW5mby5oPgotI2luY2x1ZGUgPHN5cy9pMzg2L2NvcmVkdW1wLmg+Ci0jZW5kaWYgLyogX0FJWCAmJiBfSTM4NiAqLwotCi0vKiBtYXliZSB0aGlzIGNvdWxkIHdvcmsgb24gc29tZSBvdGhlciBpMzg2IGJ1dCBJIGhhdmUgbm90IHRyaWVkIGl0Ci0gKiBtdHJhbmxlQHBhcmlzIC0gVHVlIFNlcCAyNCAxMjo0OTozNSAxOTkxCi0gKi8KLQotI2lmbmRlZiBDT1JfTUFHSUMKLSMgZGVmaW5lIENPUl9NQUdJQyAiY29yZSIKLSNlbmRpZgotCi0vKiBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlIHB0ciBpcyByZWFsbHkgdm9pZCAqICovCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgXAotICAgICgoKGJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEpKS0+aGRyKQotI2RlZmluZSBjb3JlX3NlY3Rpb24oYmZkLG4pIFwKLSAgICAoKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YSktPnNlY3Rpb25zW25dKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpIFwKLSAgICAoKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YSktPnJlZ19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZzJzZWMoYmZkKSBcCi0gICAgKCgoYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEpLT5yZWcyX3NlY3Rpb24pCi0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi1zdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCB7Ci0gIHN0cnVjdCBjb3JlaGRyICpoZHI7CQkvKiBjb3JlIGZpbGUgaGVhZGVyICovCi0gIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnJlZzJfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnNlY3Rpb25zW01BWF9DT1JFX1NFR1NdOwotfTsKLQotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWFpeDM4Nl9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgaSxuOwotICB1bnNpZ25lZCBjaGFyIGxvbmdidWZbNF07CS8qIFJhdyBieXRlcyBvZiB2YXJpb3VzIGhlYWRlciBmaWVsZHMgKi8KLSAgaW50IGNvcmVfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGNvcmVoZHIpOwotICBzdHJ1Y3QgY29yZWhkciAqY29yZTsKLSAgc3RydWN0IG1lcmdlbSB7Ci0gICAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgY29yZWRhdGE7Ci0gICAgc3RydWN0IGNvcmVoZHIgaW50ZXJuYWxfY29yZTsKLSAgfSAqbWVyZ2VtOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUilsb25nYnVmLCAxLCBzaXplb2YgKGxvbmdidWYpLCBhYmZkKSAhPSBzaXplb2YgKGxvbmdidWYpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoc3RybmNtcChsb25nYnVmLENPUl9NQUdJQyw0KSkgcmV0dXJuIDA7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgZmFsc2UpIDwgMCkgcmV0dXJuIDA7Ci0KLSAgbWVyZ2VtID0gKHN0cnVjdCBtZXJnZW0gKiliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtZXJnZW0pKTsKLSAgaWYgKG1lcmdlbSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGNvcmUgPSAmbWVyZ2VtLT5pbnRlcm5hbF9jb3JlOwotCi0gIGlmICgoYmZkX3JlYWQgKChQVFIpIGNvcmUsIDEsIGNvcmVfc2l6ZSwgYWJmZCkpICE9IGNvcmVfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKiltZXJnZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHNldF90ZGF0YSAoYWJmZCwgJm1lcmdlbS0+Y29yZWRhdGEpOwotICBjb3JlX2hkciAoYWJmZCkgPSBjb3JlOwotCi0gIC8qIGNyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gcmVjbGFpbQotICAgICB0aGVtICovCi0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXI6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKiltZXJnZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBjb3JlX3JlZzJzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnMnNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXIxOgotICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9yZWdzZWMgKGFiZmQpKTsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIGZvciAoaT0wLCBuPTAgOyAoaSA8IE1BWF9DT1JFX1NFR1MpICYmIChjb3JlLT5jZF9zZWdzW2ldLmNzX3R5cGUpIDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChjb3JlLT5jZF9zZWdzW2ldLmNzX29mZnNldCA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLG4pID0KLQkoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICAgICAgaWYgKGNvcmVfc2VjdGlvbiAoYWJmZCxuKSA9PSBOVUxMKQotCXsKLQkgIGludCBqOwotCSAgaWYgKG4gPiAwKQotCSAgICB7Ci0JICAgICAgZm9yIChqPTA7IGogPCBuOyBqKyspCi0JCWJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3NlY3Rpb24oYWJmZCwgaikpOwotCSAgICB9Ci0JICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKiltZXJnZW0pOwotCSAgZ290byBsb3NlcjE7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGNvcmUtPmNkX3NlZ3NbaV0uY3NfdHlwZSkKLQl7Ci0JY2FzZSBDT1JfVFlQRV9EQVRBOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIuZGF0YSI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfTE9BRCArCi0JCQkJCSAgIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9TVEFDSzoKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLnN0YWNrIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19MT0FEICsKLQkJCQkJICAgU0VDX0hBU19DT05URU5UUyk7Ci0JICBicmVhazsKLQljYXNlIENPUl9UWVBFX0xJQkRBVEE6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi5saWJkYXRhIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JfVFlQRV9XUklURToKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPm5hbWUgPSAiLndyaXRlYWJsZSI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWNhc2UgQ09SX1RZUEVfTVNDOgotCSAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+bmFtZSA9ICIubWlzYyI7Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5mbGFncyA9IChTRUNfQUxMT0MgKyBTRUNfSEFTX0NPTlRFTlRTKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uYW1lID0gIi51bmtub3duIjsKLQkgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmZsYWdzID0gKFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgY29yZV9zZWN0aW9uIChhYmZkLCBuKS0+X3Jhd19zaXplID0gY29yZS0+Y2Rfc2Vnc1tpXS5jc19sZW47Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT52bWEgICAgICAgPSBjb3JlLT5jZF9zZWdzW2ldLmNzX2FkZHJlc3M7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5maWxlcG9zICAgPSBjb3JlLT5jZF9zZWdzW2ldLmNzX29mZnNldDsKLSAgICAgIGNvcmVfc2VjdGlvbiAoYWJmZCwgbiktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gICAgICBjb3JlX3NlY3Rpb24gKGFiZmQsIG4pLT5uZXh0ICAgICAgPSBOVUxMOwotICAgICAgaWYgKG4gPiAwKQotCWNvcmVfc2VjdGlvbiAoYWJmZCwgKG4tMSkpLT5uZXh0ID0gY29yZV9zZWN0aW9uIChhYmZkLCBuKTsKLQotICAgICAgYWJmZC0+c2VjdGlvbl9jb3VudCA9ICsrbjsKLSAgICB9Ci0KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWcyIjsKLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gc2l6ZW9mKGNvcmUtPmNkX3JlZ3MpOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBzaXplb2YoY29yZS0+Y2RfZnByZWdzKTsKLQotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IC0xOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT52bWEgPSAtMTsKLQotICAvKiBXZSdsbCBhY2Nlc3MgdGhlIHJlZ3MgYWZyZXNoIGluIHRoZSBjb3JlIGZpbGUsIGxpa2UgYW55IHNlY3Rpb246ICovCi0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChmaWxlX3B0cilvZmZzZXRvZihzdHJ1Y3QgY29yZWhkcixjZF9yZWdzWzBdKTsKLSAgY29yZV9yZWcyc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChmaWxlX3B0cilvZmZzZXRvZihzdHJ1Y3QgY29yZWhkciwKLQkJCQkJCSAgICBjZF9mcHJlZ3MpOwotCi0gIC8qIGFkZCB0aGUgMiByZWcgZmFrZSBzZWN0aW9ucyB0byBhYmZkICovCi0gIGFiZmQtPnNlY3Rpb25fY291bnQgKz0gMjsKLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnMnNlYyAoYWJmZCk7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3NlY3Rpb24gKGFiZmQsIDApOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1haXgzODZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5jZF9jb21tOwotfQotCi1zdGF0aWMgaW50Ci1haXgzODZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2hkciAoYWJmZCktPmNkX2N1cnNpZzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWFpeDM4Nl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZDsKLSAgICAgYmZkICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcwotCQkJCSAgIHBvaW50ICovCi19Ci0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKFBST1RPKGJmZF92bWEsICgqKSwgKCAgICAgICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZSBOT19HRVRTICgoUFJPVE8oYmZkX3NpZ25lZF92bWEsICgqKSwgKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKFBST1RPKHZvaWQsICAgICAgICAoKiksIChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGFpeDM4Nl9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiYWl4Mzg2LWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOR19CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgICAnICcsCQkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsCi0gICAgTk9fR0VULCBOT19HRVRTLCBOT19QVVQsIC8qIGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwKLSAgICBOT19HRVQsIE5PX0dFVFMsIE5PX1BVVCwgLyogaGRycyAqLwotCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBfYmZkX2R1bW15X3RhcmdldCwKLSAgICAgX2JmZF9kdW1teV90YXJnZXQsIGFpeDM4Nl9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgYmZkX2ZhbHNlLAkvKiBiZmRfY3JlYXRlX29iamVjdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgYmZkX2ZhbHNlLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGFpeDM4NiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtYWRvYmUuYyBiL2JmZC9hb3V0LWFkb2JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTFmZmUuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtYWRvYmUuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGEub3V0LmFkb2JlIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LiAgQmFzZWQgb24gYm91dC5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvYWRvYmUuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYzsJCS8qIEZvcndhcmQgZGVjbCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYW91dF9hZG9iZV9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBhb3V0XzMyX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBzZWN0KSk7Ci0KLS8qIFN3YXBzIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciB0YWtlbiBmcm9tIGEgcmF3IGJ5dGUKLSAgIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyIHN0cnVjdHVyZS4gICovCi0KLXZvaWQgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3ApKTsKLQkgCi12b2lkCi1hb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyIHN0cnVjdHVyZSBpbnRvIHRoZQotICAgc3VwcGxpZWQgYnVmZmVyIHJlYWR5IGZvciB3cml0aW5nIHRvIGRpc2suICAqLwotCi1QUk9UTyh2b2lkLCBhb3V0X2Fkb2JlX3N3YXBfZXhlY19oZWFkZXJfb3V0LAotCSAgKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AsCi0JICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotdm9pZAotYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8gICwgYnl0ZXMtPmVfaW5mbyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90ZXh0ICAsIGJ5dGVzLT5lX3RleHQpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZGF0YSAgLCBieXRlcy0+ZV9kYXRhKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2JzcyAgICwgYnl0ZXMtPmVfYnNzKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3N5bXMgICwgYnl0ZXMtPmVfc3ltcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9lbnRyeSAsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Ryc2l6ZSwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1hb3V0X2Fkb2JlX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgY2hhciAqdGFyZzsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLQotICAvKiBOb3JtYWxseSB3ZSBqdXN0IGNvbXBhcmUgZm9yIHRoZSBtYWdpYyBudW1iZXIuCi0gICAgIEhvd2V2ZXIsIGEgYnVuY2ggb2YgQWRvYmUgdG9vbHMgYXJlbid0IGZpeGVkIHVwIHlldDsgdGhleSBnZW5lcmF0ZQotICAgICBmaWxlcyB1c2luZyBaTUFHSUMoISkuCi0gICAgIElmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBHTlVUQVJHRVQgaXMgc2V0IHRvICJhLm91dC5hZG9iZSIsIHdlIHdpbGwKLSAgICAgdGFrZSBqdXN0IGFib3V0IGFueSBhLm91dCBmaWxlIGFzIGFuIEFkb2JlIGEub3V0IGZpbGUuICBGSVhNRSEgICovCi0KLSAgaWYgKE5fQkFETUFHIChhbmV4ZWMpKSB7Ci0gICAgdGFyZyA9IGdldGVudiAoIkdOVVRBUkdFVCIpOwotICAgIGlmICh0YXJnICYmICFzdHJjbXAgKHRhcmcsIGFfb3V0X2Fkb2JlX3ZlYy5uYW1lKSkKLSAgICAgIDsJCS8qIEp1c3QgY29udGludWUgYW55d2F5LCBpZiBzcGVjaWZpY2FsbHkgc2V0IHRvIHRoaXMgZm9ybWF0ICovCi0gICAgZWxzZQotICAgICAgewotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotICB9Ci0KLSAgYW91dF9hZG9iZV9zd2FwX2V4ZWNfaGVhZGVyX2luIChhYmZkLCAmZXhlY19ieXRlcywgJmFuZXhlYyk7Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgYW91dF9hZG9iZV9jYWxsYmFjayk7Ci19Ci0KLQotLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQotICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYW91dF9hZG9iZV9jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGFzZWN0aW9uICpzZWN0OwotICBzdHJ1Y3QgZXh0ZXJuYWxfc2VnZGVzYyBleHRbMV07Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciB0cnlfYWdhaW5bMzBdOwkvKiBuYW1lIGFuZCBudW1iZXIgKi8KLSAgY2hhciAqbmV3bmFtZTsKLSAgaW50IHRyeW51bTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgLyogQXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgLS0gdW5rbm93biBpbiB0aGlzIGZvcm1hdC4gICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGJmZF9hcmNoX3Vua25vd24sIDApOwotCi0gIC8qIFRoZSBwb3NpdGlvbnMgb2YgdGhlIHN0cmluZyB0YWJsZSBhbmQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gTl9TWU1PRkYgKCpleGVjcCk7Ci0KLSAgLyogU3VjayB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlLCBvbmUgc2VjdGlvbiBhdCBhIHRpbWUuICAqLwotCi0gIGZvciAoOzspIHsKLSAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGV4dCwgMSwgc2l6ZW9mICgqZXh0KSwgYWJmZCkgIT0gc2l6ZW9mICgqZXh0KSkgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHN3aXRjaCAoZXh0LT5lX3R5cGVbMF0pIHsKLSAgICBjYXNlIE5fVEVYVDoKLSAgICAgIHNlY3Rpb25fbmFtZSA9ICIudGV4dCI7Ci0gICAgICBmbGFncyA9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHNlY3Rpb25fbmFtZSA9ICIuZGF0YSI7Ci0gICAgICBmbGFncyA9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfSEFTX0NPTlRFTlRTOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fQlNTOgotICAgICAgc2VjdGlvbl9uYW1lID0gIi5ic3MiOwotICAgICAgZmxhZ3MgPSBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMDoKLSAgICAgIGdvdG8gbm9fbW9yZV9zZWN0aW9uczsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IFVua25vd24gc2VjdGlvbiB0eXBlIGluIGEub3V0LmFkb2JlIGZpbGU6ICV4XG4iKSwgCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBleHQtPmVfdHlwZVswXSk7Ci0gICAgICBnb3RvIG5vX21vcmVfc2VjdGlvbnM7Ci0gICAgfQotCi0gICAgLyogRmlyc3Qgb25lIGlzIGNhbGxlZCAiLnRleHQiIG9yIHdoYXRldmVyOyBzdWJzZXF1ZW50IG9uZXMgYXJlCi0gICAgICAgIi50ZXh0MSIsICIudGV4dDIiLCAuLi4gKi8KLQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0gICAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb25fbmFtZSk7Ci0gICAgdHJ5bnVtID0gMDsKLSAgICB3aGlsZSAoIXNlY3QpIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19lcnJvcikKLQlyZXR1cm4gMDsJLyogU29tZSBvdGhlciBlcnJvciAtLSBzbGlkZSBpbnRvIHRoZSBzdW5zZXQgKi8KLSAgICAgIHNwcmludGYgKHRyeV9hZ2FpbiwgIiVzJWQiLCBzZWN0aW9uX25hbWUsICsrdHJ5bnVtKTsKLSAgICAgIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCB0cnlfYWdhaW4pOwotICAgIH0KLQotICAgIC8qIEZpeCB0aGUgbmFtZSwgaWYgaXQgaXMgYSBzcHJpbnRmJ2QgbmFtZS4gICovCi0gICAgaWYgKHNlY3QtPm5hbWUgPT0gdHJ5X2FnYWluKSB7Ci0gICAgICBuZXduYW1lID0gKGNoYXIgKikgYmZkX3phbGxvYyhhYmZkLCBzdHJsZW4gKHNlY3QtPm5hbWUpKTsKLSAgICAgIGlmIChuZXduYW1lID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgICBzdHJjcHkgKG5ld25hbWUsIHNlY3QtPm5hbWUpOwotICAgICAgc2VjdC0+bmFtZSA9IG5ld25hbWU7Ci0gICAgfQotCi0gICAgLyogTm93IHNldCB0aGUgc2VjdGlvbidzIGF0dHJpYnV0ZXMuICAqLwotICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdCwgZmxhZ3MpOwotICAgIHNlY3QtPl9yYXdfc2l6ZSA9ICgoZXh0LT5lX3NpemVbMF0gPDwgOCkJLyogQXNzdW1lZCBiaWctZW5kaWFuICovCi0JCSAgICAgIHwgZXh0LT5lX3NpemVbMV0gPDwgOCkKLQkJICAgICAgfCBleHQtPmVfc2l6ZVsyXTsKLSAgICBzZWN0LT5fY29va2VkX3NpemUgPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgc2VjdC0+dm1hID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPmVfdmlydGJhc2UpOwotICAgIHNlY3QtPmZpbGVwb3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+ZV9maWxlYmFzZSk7Ci0gICAgLyogRklYTUUgWFhYIGFsaWdubWVudD8gKi8KLQotICAgIC8qIFNldCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBmaXJzdCBzZWN0aW9uIG9mIGVhY2ggdHlwZS4gICovCi0gICAgaWYgKHRyeW51bSA9PSAwKSBzd2l0Y2ggKGV4dC0+ZV90eXBlWzBdKSB7Ci0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICBzZWN0LT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgICAgIHNlY3QtPnJlbG9jX2NvdW50ID0gZXhlY3AtPmFfdHJzaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fREFUQToKLSAgICAgIHNlY3QtPnJlbF9maWxlcG9zID0gTl9EUkVMT0ZGICgqZXhlY3ApOwotICAgICAgc2VjdC0+cmVsb2NfY291bnQgPSBleGVjcC0+YV9kcnNpemU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLW5vX21vcmVfc2VjdGlvbnM6ICAKLQotICBhZGF0YShhYmZkKS5yZWxvY19lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgYWRhdGEoYWJmZCkuc3ltYm9sX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCB7Ci0gICAgc3RydWN0IGFvdXRkYXRhIGE7Ci0gICAgc3RydWN0IGludGVybmFsX2V4ZWMgZTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBhZGF0YShhYmZkKS5yZWxvY19lbnRyeV9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgYWRhdGEoYWJmZCkuc3ltYm9sX2VudHJ5X3NpemUgPSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0gIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSA9IDE7IC8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSAxOyAvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLSAgc3RhdGljIHN0cnVjdCBleHRlcm5hbF9zZWdkZXNjIHNlbnRpbmVsWzFdOwkvKiBJbml0aWFsaXplZCB0byB6ZXJvICovCi0gIGFzZWN0aW9uICpzZWN0OwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV9pbmZvID0gWk1BR0lDOwotCi0gIC8qIENhbGN1bGF0ZSB0ZXh0IHNpemUgYXMgdG90YWwgb2YgdGV4dCBzZWN0aW9ucywgZXRjLiAqLwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90ZXh0ID0gMDsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2RhdGEgPSAwOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzICA9IDA7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemUgPSAwOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gMDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJewotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX3RleHQgKz0gc2VjdC0+X3Jhd19zaXplOwotICAgICAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSArPSBzZWN0LT5yZWxvY19jb3VudCAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCk7Ci0gICAgfSBlbHNlIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplICs9IHNlY3QtPnJlbG9jX2NvdW50ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsKTsKLSAgICB9IGVsc2UgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0FMTE9DICYmICEoc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkpIHsKLSAgICAgIGV4ZWNfaGRyIChhYmZkKS0+YV9ic3MgICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICB9Ci0gIH0KLQotICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpCi0gICAgCQkJCSogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIGFvdXRfYWRvYmVfc3dhcF9leGVjX2hlYWRlcl9vdXQgKGFiZmQsIGV4ZWNfaGRyIChhYmZkKSwgJnN3YXBwZWRfaGRyKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICZzd2FwcGVkX2hkciwgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gIFRleHQgZmlyc3QsIGRhdGEgbmV4dCwgcmVzdAotICAgICBhZnRlcndhcmQuICAqLwotCi0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19DT0RFKQl7Ci0gICAgICBhb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpOwotICAgIH0KLSAgfQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfREFUQSkJewotICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKLSAgICB9Ci0gIH0KLSAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgaWYgKCEoc2VjdC0+ZmxhZ3MgJiAoU0VDX0NPREV8U0VDX0RBVEEpKSkgewotICAgICAgYW91dF9hZG9iZV93cml0ZV9zZWN0aW9uIChhYmZkLCBzZWN0KTsKLSAgICB9Ci0gIH0KLQotICAvKiBXcml0ZSBmaW5hbCBgc2VudGluZWxgIHNlY3Rpb24gaGVhZGVyICh3aXRoIHR5cGUgb2YgMCkuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzZW50aW5lbCwgMSwgc2l6ZW9mICgqc2VudGluZWwpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mICgqc2VudGluZWwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYW91dF8zMl93cml0ZV9zeW1zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkJewotICAgICAgICAgIGlmICghYW91dF8zMl9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgc2VjdCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICAgICAgaWYgKCFhb3V0XzMyX3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hb3V0X2Fkb2JlX3dyaXRlX3NlY3Rpb24gKGFiZmQsIHNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0OwotewotICAvKiBGSVhNRSBYWFggKi8KLX0KLQwKLXN0YXRpYyBib29sZWFuCi1hb3V0X2Fkb2JlX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGZpbGVfcHRyIHNlY3Rpb25fc3RhcnQ7Ci0gIHNlY19wdHIgc2VjdDsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkgeyAvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLwotCi0gICAgLyogQXNzaWduIGZpbGUgb2Zmc2V0cyB0byBzZWN0aW9ucy4gIFRleHQgc2VjdGlvbnMgYXJlIGZpcnN0LCBhbmQKLSAgICAgICBhcmUgY29udGlndW91cy4gIFRoZW4gZGF0YSBzZWN0aW9ucy4gIEV2ZXJ5dGhpbmcgZWxzZSBhdCB0aGUgZW5kLiAgKi8KLQotICAgIHNlY3Rpb25fc3RhcnQgPSBOX1RYVE9GRiAoaWdub3JlPC0tPm1lKTsKLQotICAgIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0OyBzZWN0ID0gc2VjdC0+bmV4dCkgewotICAgICAgaWYgKHNlY3QtPmZsYWdzICYgU0VDX0NPREUpCXsKLSAgICAgICAgc2VjdC0+ZmlsZXBvcyA9IHNlY3Rpb25fc3RhcnQ7Ci0JLyogRklYTUU6ICBSb3VuZCB0byBhbGlnbm1lbnQgKi8KLQlzZWN0aW9uX3N0YXJ0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdDsgc2VjdCA9IHNlY3QtPm5leHQpIHsKLSAgICAgIGlmIChzZWN0LT5mbGFncyAmIFNFQ19EQVRBKQl7Ci0gICAgICAgIHNlY3QtPmZpbGVwb3MgPSBzZWN0aW9uX3N0YXJ0OwotCS8qIEZJWE1FOiAgUm91bmQgdG8gYWxpZ25tZW50ICovCi0Jc2VjdGlvbl9zdGFydCArPSBzZWN0LT5fcmF3X3NpemU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Q7IHNlY3QgPSBzZWN0LT5uZXh0KSB7Ci0gICAgICBpZiAoc2VjdC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTICYmCi0JICAhKHNlY3QtPmZsYWdzICYgKFNFQ19DT0RFfFNFQ19EQVRBKSkpCXsKLSAgICAgICAgc2VjdC0+ZmlsZXBvcyA9IHNlY3Rpb25fc3RhcnQ7Ci0JLyogRklYTUU6ICBSb3VuZCB0byBhbGlnbm1lbnQgKi8KLQlzZWN0aW9uX3N0YXJ0ICs9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApIHsKLSAgICByZXR1cm4gKGJmZF93cml0ZSAoKFBUUilsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/dHJ1ZTpmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfYWRvYmVfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICBpZiAoISBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bgotICAgICAgfHwgYXJjaCA9PSBiZmRfYXJjaF9tNjhrKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludCAKLWFvdXRfYWRvYmVfc2l6ZW9mX2hlYWRlcnMgKGlnbm9yZV9hYmZkLCBpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGJvb2xlYW4gaWdub3JlOwotewotICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLX0KLQotCi0KLQotLyogQnVpbGQgdGhlIHRyYW5zZmVyIHZlY3RvciBmb3IgQWRvYmUgQS5PdXQgZmlsZXMuICAqLwotCi0jZGVmaW5lIGFvdXRfMzJfY2xvc2VfYW5kX2NsZWFudXAgYW91dF8zMl9iZmRfZnJlZV9jYWNoZWRfaW5mbwotCi0jZGVmaW5lIGFvdXRfMzJfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIHZvaWQgKiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0KLSNkZWZpbmUgYW91dF8zMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpKSBiZmRfbnVsbHZvaWRwdHIpCi0KLSNkZWZpbmUJYW91dF8zMl9zZXRfYXJjaF9tYWNoCQlhb3V0X2Fkb2JlX3NldF9hcmNoX21hY2gKLSNkZWZpbmUJYW91dF8zMl9zZXRfc2VjdGlvbl9jb250ZW50cwlhb3V0X2Fkb2JlX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUJYW91dF8zMl9zaXplb2ZfaGVhZGVycwkJYW91dF9hZG9iZV9zaXplb2ZfaGVhZGVycwotI2RlZmluZSBhb3V0XzMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxheF9zZWN0aW9uICAgICAgIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYW91dF8zMl9iZmRfZ2Nfc2VjdGlvbnMgICAgICAgICBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYW91dF8zMl9iZmRfbGlua19hZGRfc3ltYm9scwlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBhb3V0XzMyX2JmZF9maW5hbF9saW5rCQlfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBhb3V0XzMyX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24JX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IGFfb3V0X2Fkb2JlX3ZlYyA9Ci17Ci0gICJhLm91dC5hZG9iZSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyB1bmtub3duIChiaWcgYXNzdW1lZCkgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCApLAotICAvKiBzZWN0aW9uIGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiAgc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotIHtfYmZkX2R1bW15X3RhcmdldCwgYW91dF9hZG9iZV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0ge2JmZF9mYWxzZSwgYW91dF9hZG9iZV9ta29iamVjdCwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgYW91dF9hZG9iZV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvYW91dC1hcm0uYyBiL2JmZC9hb3V0LWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWI5MDBiLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgcmF3IEFSTSBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICgoTl9NQUdJQyh4KSA9PSBOTUFHSUMpID8gMHg4MDAwIDogXAotICAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDKSA/IDAgOiBcCi0gICAoTl9TSEFSRURfTElCKHgpKSA/ICgoeCkuYV9lbnRyeSAmIH4oVEFSR0VUX1BBR0VfU0laRSAtIDEpKSA6IFwKLSAgIFRFWFRfU1RBUlRfQUREUikKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMHg4MDAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHg4MDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9hcm0KLQotI2RlZmluZSBNWShPUCkgQ0FUKGFvdXRhcm1fLE9QKQotI2RlZmluZSBOX0JBRE1BRyh4KSAoKCgoeCkuYV9pbmZvICYgfjAwNzIwMCkgIT0gWk1BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKCh4KS5hX2luZm8gJiB+MDA2MDAwKSAhPSBPTUFHSUMpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICgoeCkuYV9pbmZvICE9IE5NQUdJQykpCi0jZGVmaW5lIE5fTUFHSUMoeCkgKCh4KS5hX2luZm8gJiB+MDcyMDApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBNWUFSTShPUCkgQ0FUKGFvdXRhcm1fLE9QKQotcmVsb2NfaG93dG9fdHlwZSAJKk1ZQVJNKGJmZF9yZWxvY190eXBlX2xvb2t1cCkKLQkJCQlQQVJBTVMoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIAkJTVlBUk0od3JpdGVfb2JqZWN0X2NvbnRlbnRzKQlQQVJBTVMoKGJmZCAqKSk7Ci0KLS8qIEF2b2lkIG11bHRpcGxlIGRlZmluaW5pdGlvbnMgZnJvbSBhb3V0eCBpZiBzdXBwb3J0aW5nIHN0YW5kYXJhZCBhLm91dCAKLSAgIGFzIHdlbGwgYXMgb3VyIG93bi4gICovCi0jZGVmaW5lIE5BTUUoeCx5KSBDQVQzKGFvdXRhcm0sXzMyXyx5KQotCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBhb3V0YXJtX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLU1ZKGZpeF9wY3JlbF8yNl9kb25lKQlQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCQkgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2KQkgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJICBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgTVkoc3dhcF9zdGRfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosCi0JCQkJCSAgIGFyZWxlbnQgKiwgYXN5bWJvbCAqKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSkpOwotdm9pZCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIAotCQkJCSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSk7Ci0KLXJlbG9jX2hvd3RvX3R5cGUgTVkoaG93dG9fdGFibGUpW10gPQotewotICAvKiB0eXBlIHJzIHNpemUgYnN6IHBjcmVsIGJpdHBvcyBvdnJmIHNmIG5hbWUgcGFydF9pbnBsIHJlYWRtYXNrIHNldG1hc2sKLSAgICAgcGNkb25lICovCi0gIEhPV1RPICgwLCAwLCAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI4IiwgdHJ1ZSwKLQkgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoMSwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjE2IiwgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMiwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjMyIiwgdHJ1ZSwKLQkgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMywgMiwgMiwgMjYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgTVkoZml4X3BjcmVsXzI2KSwKLQkgIkFSTTI2IiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPICg0LCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQOCIsIHRydWUsCi0JIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyAoNSwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AxNiIsIHRydWUsCi0JIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoNiwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1AzMiIsIHRydWUsCi0JIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoNywgMiwgMiwgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIE1ZKGZpeF9wY3JlbF8yNl9kb25lKSwgIkFSTTI2RCIsIHRydWUsIDB4MCwgMHgwLAotCSBmYWxzZSksCi0gIHstMX0sCi0gIEhPV1RPICg5LCAwLCAtMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIk5FRzE2IiwgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMTAsIDAsIC0yLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiTkVHMzIiLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSkKLX07Ci0KLSNkZWZpbmUgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRyAgICAgICgodW5zaWduZWQgaW50KSAweDA4KQotI2RlZmluZSBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFICAgKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkocmVsb2NfaG93dG8pKGFiZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbF9kb25lOwotICB1bnNpZ25lZCBpbnQgcl9uZWc7Ci0gIGludCBpbmRleDsKLQotICAqcl9wY3JlbCA9IDA7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgICpyX2luZGV4ICAgICA9ICAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJICAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICAgfCByZWwtPnJfaW5kZXhbMl0pOwotICAgICAgKnJfZXh0ZXJuICAgID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICAgICAgcl9wY3JlbF9kb25lID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gICAgICByX25lZyAJICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19BUk1fQklUU19ORUdfQklHKSk7Ci0gICAgICByX2xlbmd0aCAgICAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykKLQkJICAgICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnJfaW5kZXggICAgID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgICB8IHJlbC0+cl9pbmRleFswXSk7Ci0gICAgICAqcl9leHRlcm4gICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICAgIHJfbmVnIAkgICA9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0FSTV9CSVRTX05FR19MSVRUTEUpKTsKLSAgICAgIHJfbGVuZ3RoICAgICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQkgICAgICA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgICB9Ci0gIGluZGV4ID0gcl9sZW5ndGggKyA0ICogcl9wY3JlbF9kb25lICsgOCAqIHJfbmVnOwotICBpZiAoaW5kZXggPT0gMykKLSAgICAqcl9wY3JlbCA9IDE7Ci0KLSAgcmV0dXJuIE1ZKGhvd3RvX3RhYmxlKSArIGluZGV4OwotfQotIAotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsIFJFTCwgSU4sIEVYLCBQQykgXAotCU1ZKHJlbG9jX2hvd3RvKSAoQkZELCBSRUwsICZJTiwgJkVYLCAmUEMpCi0KLXZvaWQKLU1ZKHB1dF9yZWxvYykoYWJmZCwgcl9leHRlcm4sIHJfaW5kZXgsIHZhbHVlLCBob3d0bywgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHJfZXh0ZXJuOwotICAgICBpbnQgcl9pbmRleDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jOwotewotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9uZWc7Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIHZhbHVlLCByZWxvYy0+cl9hZGRyZXNzKTsKLSAgcl9sZW5ndGggPSBob3d0by0+c2l6ZSA7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLQotICAvKiBTcGVjaWFsIGNhc2UgZm9yIGJyYW5jaCByZWxvY2F0aW9ucy4gKi8KLSAgaWYgKGhvd3RvLT50eXBlID09IDMgfHwgaG93dG8tPnR5cGUgPT0gNykKLSAgICByX2xlbmd0aCA9IDM7Ci0KLSAgcl9wY3JlbCAgPSBob3d0by0+dHlwZSAmIDQ7IAkvKiBQQyBSZWxhdGl2ZSBkb25lPyAqLwotICByX25lZyA9IGhvd3RvLT50eXBlICYgODsJLyogTmVnYXRpdmUgcmVsb2NhdGlvbiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvYy0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIHJlbG9jLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLSAgICAgIHJlbG9jLT5yX3R5cGVbMF0gPQotCSgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IDApCi0JIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCSB8IChyX25lZyA/CSBSRUxPQ19BUk1fQklUU19ORUdfQklHIDogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvYy0+cl9pbmRleFsyXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIHJlbG9jLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIHJlbG9jLT5yX3R5cGVbMF0gPQotCSgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUgOiAwKQotCSB8IChyX25lZyA/CSBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFIDogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpKTsKLSAgICB9Ci19Ci0gCi0jZGVmaW5lIE1ZX3B1dF9yZWxvYyhCRkQsIEVYVCwgSURYLCBWQUwsIEhPV1RPLCBSRUxPQykgXAotICBNWShwdXRfcmVsb2MpKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKQotCi12b2lkCi1NWShyZWxvY2F0YWJsZV9yZWxvYykoaG93dG8sIGFiZmQsIHJlbG9jLCBhbW91bnQsIHJfYWRkcikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Ci0gICAgIGJmZF92bWEgKmFtb3VudDsKLSAgICAgYmZkX3ZtYSByX2FkZHI7Ci17Ci0gIGlmIChob3d0by0+dHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGlmIChyZWxvYy0+cl90eXBlWzBdIAotCSAgJiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKQotCSAgICAgPyBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHIDogUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpCi0JewotCSAgLyogVGhlIHJlbG9jIGlzIHN0aWxsIGV4dGVybmFsLCBzbyBkb24ndCBtb2RpZnkgYW55dGhpbmcuICovCi0JICAqYW1vdW50ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKmFtb3VudCAtPSByX2FkZHI7Ci0JICAvKiBDaGFuZ2UgdGhlIHJfcGNyZWwgdmFsdWUgLS0gb24gdGhlIEFSTSwgdGhpcyBiaXQgaXMgc2V0IG9uY2UgdGhlCi0JICAgICByZWxvY2F0aW9uIGlzIGRvbmUuICAqLwotCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JICAgIHJlbG9jLT5yX3R5cGVbMF0gfD0gUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOwotCSAgZWxzZQotCSAgICByZWxvYy0+cl90eXBlWzBdIHw9IFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChob3d0by0+dHlwZSA9PSA3KQotICAgICphbW91bnQgPSAwOwotfQotCi0jZGVmaW5lIE1ZX3JlbG9jYXRhYmxlX3JlbG9jKEhPVywgQkZELCBSRUwsIEFNT1VOVCwgQUREUikgXAotICBNWShyZWxvY2F0YWJsZV9yZWxvYykoSE9XLCBCRkQsIFJFTCwgJihBTU9VTlQpLCBBRERSKQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1NWShmaXhfcGNyZWxfMjZfZG9uZSkgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotTVkoZml4X3BjcmVsXzI2KSAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19vayA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb25zIGFyZSBkaWZmZXJlbnQsIGFuZCB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24sCi0gICAgIGp1c3QgaWdub3JlIGl0IGZvciBub3cuICAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lICE9IGlucHV0X3NlY3Rpb24tPm5hbWUKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICByZWxvY2F0aW9uID0gKHRhcmdldCAmIDB4MDBmZmZmZmYpIDw8IDI7Ci0gIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIDB4MDIwMDAwMDApIC0gMHgwMjAwMDAwMDsgLyogU2lnbiBleHRlbmQgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcjsKLSAgaWYgKHJlbG9jYXRpb24gJiAzKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gIGlmIChyZWxvY2F0aW9uICYgMHgwMjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHJlbG9jYXRpb24gJiB+IChiZmRfdm1hKSAweDAzZmZmZmZmKSAhPSB+IChiZmRfdm1hKSAweDAzZmZmZmZmKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvY2F0aW9uICYgfjB4MDNmZmZmZmYpCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfjB4MDBmZmZmZmY7Ci0gIHRhcmdldCB8PSAocmVsb2NhdGlvbiA+PiAyKSAmIDB4MDBmZmZmZmY7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHRhcmdldCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQotICAvKiBOb3cgdGhlIEFSTSBtYWdpYy4uLiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgc28gdGhhdCBpdCBpcyBtYXJrZWQgYXMgZG9uZS4KLSAgICAgU3RyaWN0bHkgdGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24uICAqLwotICByZWxvY19lbnRyeS0+aG93dG8gPSAmTVkoaG93dG9fdGFibGUpWzddOwotICAKLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKShhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0jZGVmaW5lIEFTVEQoaSxqKSAgICAgICBjYXNlIGk6IHJldHVybiAmTVkoaG93dG9fdGFibGUpW2pdCi0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLSAgICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICAgIH0KLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2LCAxKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMiwgMik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgMyk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgNCk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMTZfUENSRUwsIDUpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCA2KTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKikgMDsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTVkoc3dhcF9zdGRfcmVsb2NfaW4pCi0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBNWShzd2FwX3N0ZF9yZWxvY19vdXQpCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotLyogI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAqLwotLyogI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAqLwotLyogI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluayAqLwotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX2luIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfcGNyZWw7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gTVlfcmVsb2NfaG93dG8gKGFiZmQsIGJ5dGVzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCk7Ci0KLSAgTU9WRV9BRERSRVNTICgwKTsKLX0KLQotdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnID0gMDsJLyogTmVnYXRpdmUgcmVsb2NzIHVzZSB0aGUgQkFTRVJFTCBiaXQuICAqLwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX2xlbmd0aCA9IGctPmhvd3RvLT5zaXplIDsgICAvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIGlmIChyX2xlbmd0aCA8IDApCi0gICAgewotICAgICAgcl9sZW5ndGggPSAtcl9sZW5ndGg7Ci0gICAgICByX25lZyA9IDE7Ci0gICAgfQotCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLQotICAvKiBGb3IgUklTQyBpWCwgaW4gcGMtcmVsYXRpdmUgcmVsb2NzIHRoZSByX3BjcmVsIGJpdCBtZWFucyB0aGF0IHRoZQotICAgICByZWxvY2F0aW9uIGhhcyBiZWVuIGRvbmUgYWxyZWFkeSAoT25seSBmb3IgdGhlIDI2LWJpdCBvbmUgSSB0aGluayk/Pz8hISEKLSAgICAgKi8KLQotICBpZiAoZy0+aG93dG8tPnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICByX2xlbmd0aCA9IDM7Ci0gICAgICByX3BjcmVsID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGctPmhvd3RvLT50eXBlID09IDcpCi0gICAgeyAKLSAgICAgIHJfbGVuZ3RoID0gMzsKLSAgICAgIHJfcGNyZWwgPSAxOwotICAgIH0KLSAgCi0KLSNpZiAwCi0gIC8qIEZvciBhIHN0YW5kYXJkIHJlbG9jLCB0aGUgYWRkZW5kIGlzIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSNlbmRpZgotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmIChiZmRfYWJzX3NlY3Rpb24uc3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEZpbGwgaW4gc3ltYm9sICovCi0JICByX2V4dGVybiA9IDE7Ci0JICByX2luZGV4ID0gKCooZy0+c3ltX3B0cl9wdHIpKS0+S0VFUElUOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfQVJNX0JJVFNfTkVHX0JJRzogMCkKLQkgfCAocl9sZW5ndGggPDwgIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkoICAocl9leHRlcm4gPyAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0JIHwgKHJfcGNyZWwgID8gICBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEU6IDApCi0JIHwgKHJfbmVnICAgID8gICBSRUxPQ19BUk1fQklUU19ORUdfTElUVExFOiAwKQotCSB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotICAgIH0KLX0KLQotI2RlZmluZSBNWV9CRkRfVEFSR0VUCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi1jb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWMgPQotewotICAiYS5vdXQtYXJtLWxpdHRsZSIsICAgICAgICAgICAvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAgICAvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwgICAgICAgICAgICAvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyIChsaXR0bGUpICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCAgICAgICAgIC8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gIEFSX1BBRF9DSEFSLCAgICAgICAgICAgICAgICAgIC8qIGFyX3BhZF9jaGFyICovCi0gIDE1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwgICAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChNWSksCi0KLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAotfTsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X2FybV9iaWdfdmVjID0KLXsKLSAgImEub3V0LWFybS1iaWciLCAgICAgICAgICAgLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsICAgICAgICAgICAgICAgLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKGJpZykgKi8KLSAgQkZEX0VORElBTl9CSUcsICAgICAgICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgICAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgRFlOQU1JQyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICBNWV9zeW1ib2xfbGVhZGluZ19jaGFyLAotICBBUl9QQURfQ0hBUiwgICAgICAgICAgICAgICAgICAvKiBhcl9wYWRfY2hhciAqLwotICAxNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLSAgICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBNWV9jb3JlX2ZpbGVfcH0sCi0gICAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsICAgIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07CmRpZmYgLS1naXQgYS9iZmQvYW91dC1lbmNhcC5jIGIvYmZkL2FvdXQtZW5jYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1ZjkwMzcuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtZW5jYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGEub3V0IGZpbGVzIGVuY2Fwc3VsYXRlZCB3aXRoIENPRkYgaGVhZGVycy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUSElTIE1PRFVMRSBJUyBOT1QgRklOSVNIRUQuICBJVCBQUk9CQUJMWSBET0VTTidUIEVWRU4gQ09NUElMRS4gICovCi0KLSNpZiAwCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSA8c3lzZGVwLmg+Ci0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSA8YW91dC9hb3V0NjQuaD4KLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqZW5jYXBfcmVhbF9jYWxsYmFjayAoKTsKLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbmNhcF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBjaGFyIG1hZ2ljYnVmWzRdOyAvKiBSYXcgYnl0ZXMgb2YgbWFnaWMgbnVtYmVyIGZyb20gZmlsZSAqLwotICB1bnNpZ25lZCBsb25nIG1hZ2ljOwkJLyogU3dhcHBlZCBtYWdpYyBudW1iZXIgKi8KLSAgc2hvcnQgY29mZl9tYWdpYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpbWFnaWNidWYsIDEsIHNpemVvZiAobWFnaWNidWYpLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChtYWdpY2J1ZikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgY29mZl9tYWdpYyA9IGJmZF9oX2dldF8xNiAoYWJmZCwgbWFnaWNidWYpOwotICBpZiAoY29mZl9tYWdpYyAhPSBDT0ZGX01BR0lDKQotICAgIHJldHVybiAwOwkJCS8qIE5vdCBhbiBlbmNhcCBjb2ZmIGZpbGUgKi8KLQotICBfX2hlYWRlcl9vZmZzZXRfdGVtcD09Q09GRl9NQUdJQyA/IHNpemVvZihzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotICAoZnNlZWsgKChmKSwgSEVBREVSX09GRlNFVCgoZikpLCAxKSkKLQotICBtYWdpYyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgbWFnaWNidWYpOwotCi0gIGlmIChOX0JBRE1BRyAoKigoc3RydWN0IGludGVybmFsX2V4ZWMgKikgJm1hZ2ljKSkpIHJldHVybiAwOwotCi0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkgewotICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiAwOwotICB9Ci0gIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKShhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmV4ZWMsIGVuY2FwX3JlYWxjYWxsYmFjayk7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhIGVuY2Fwc3VsYXRlZC1jb2ZmIGEub3V0IGZpbGUgaGVhZGVyICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWVuY2FwX3JlYWxfY2FsbGJhY2sgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICAKLSAgTVkoY2FsbGJhY2spKGFiZmQsIGV4ZWNwKTsKLSAgCi0gIC8qIElmIHdlIGhhdmUgYSBjb2ZmIGhlYWRlciwgaXQgY2FuIGdpdmUgdXMgYmV0dGVyIHZhbHVlcyBmb3IKLSAgICAgdGV4dF9zdGFydCBhbmQgZXhlY19kYXRhX3N0YXJ0LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsCi0gICAgIGZvciByZW1vdGUgZGVidWdnaW5nIG9mIGVtYmVkZGVkIHN5c3RlbXMuICAqLwotICBpZiAoTl9GTEFHUyhleGVjX2FvdXRoZHIpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKQotICB7Ci0JICBzdHJ1Y3QgY29mZmhlYWRlciBjaDsKLQkgIGludCB2YWw7Ci0JICB2YWwgPSBsc2VlayAoZXhlY2NoYW4sIC0oc2l6ZW9mIChBT1VUSERSKSArIHNpemVvZiAoY2gpKSwgMSk7Ci0JICBpZiAodmFsID09IC0xKQotCQkgIHBlcnJvcl93aXRoX25hbWUgKGZpbGVuYW1lKTsKLQkgIHZhbCA9IG15cmVhZCAoZXhlY2NoYW4sICZjaCwgc2l6ZW9mIChjaCkpOwotCSAgaWYgKHZhbCA8IDApCi0JCSAgcGVycm9yX3dpdGhfbmFtZSAoZmlsZW5hbWUpOwotCSAgdGV4dF9zdGFydCA9IGNoLnRleHRfc3RhcnQ7Ci0JICBleGVjX2RhdGFfc3RhcnQgPSBjaC5kYXRhX3N0YXJ0OwotICB9IGVsc2UKLQkgewotCSAgdGV4dF9zdGFydCA9Ci0JICAgIElTX09CSkVDVF9GSUxFIChleGVjX2FvdXRoZHIpID8gMCA6IE5fVFhUQUREUiAoZXhlY19hb3V0aGRyKTsKLQkgIGV4ZWNfZGF0YV9zdGFydCA9IElTX09CSkVDVF9GSUxFIChleGVjX2FvdXRoZHIpCi0JICAgID8gZXhlY19hb3V0aGRyLmFfdGV4dCA6IE5fREFUQUREUiAoZXhlY19hb3V0aGRyKTsKLSAgfQotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBiZmRfYXJjaF9tNjhrLCAwKTsgLyogRklYTUUgKi8KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUgaW4gRW5jYXBzdWxhdGVkIENPRkYgZm9ybWF0LgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1ib29sZWFuCi1lbmNhcF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBkYXRhX3BhZCA9IDA7Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotLyoqKioqKiBGSVhNRTogIEZyYWdtZW50cyBmcm9tIHRoZSBvbGQgR05VIExEIHByb2dyYW0gZm9yIGRlYWxpbmcgd2l0aAotICAgICAgICBlbmNhcCBjb2ZmLiAgKi8KLXN0cnVjdCBjb2ZmaGVhZGVyIGNvZmZoZWFkZXI7Ci1pbnQgbmVlZF9jb2ZmX2hlYWRlcjsKLQotICAvKiBEZXRlcm1pbmUgd2hldGhlciB0byBjb3VudCB0aGUgaGVhZGVyIGFzIHBhcnQgb2YKLSAgICAgdGhlIHRleHQgc2l6ZSwgYW5kIGluaXRpYWxpemUgdGhlIHRleHQgc2l6ZSBhY2NvcmRpbmdseS4KLSAgICAgVGhpcyBkZXBlbmRzIG9uIHRoZSBraW5kIG9mIHN5c3RlbSBhbmQgb24gdGhlIG91dHB1dCBmb3JtYXQgc2VsZWN0ZWQuICAqLwotCi0gIE5fU0VUX01BR0lDIChvdXRoZWFkZXIsIG1hZ2ljKTsKLSNpZmRlZiBJTklUSUFMSVpFX0hFQURFUgotICBJTklUSUFMSVpFX0hFQURFUjsKLSNlbmRpZgotCi0gIHRleHRfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGV4ZWMpOwotI2lmZGVmIENPRkZfRU5DQVBTVUxBVEUKLSAgaWYgKHJlbG9jYXRhYmxlX291dHB1dCA9PSAwICYmIGZpbGVfdGFibGVbMF0uanVzdF9zeW1zX2ZsYWcgPT0gMCkKLSAgICB7Ci0gICAgICBuZWVkX2NvZmZfaGVhZGVyID0gMTsKLSAgICAgIC8qIHNldCB0aGlzIGZsYWcgbm93LCBzaW5jZSBpdCB3aWxsIGNoYW5nZSB0aGUgdmFsdWVzIG9mIE5fVFhUT0ZGLCBldGMgKi8KLSAgICAgIE5fU0VUX0ZMQUdTIChvdXRoZWFkZXIsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotICAgICAgdGV4dF9zaXplICs9IHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9FTkNBUFNVTEFURQotICBpZiAobmVlZF9jb2ZmX2hlYWRlcikKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgZW5jYXBzdWxhdGluZyBCU0QgZm9ybWF0IHdpdGhpbiBDT0ZGIGZvcm1hdC4gICovCi0gICAgICBzdHJ1Y3QgY29mZnNjbiAqdHAsICpkcCwgKmJwOwotCi0gICAgICB0cCA9ICZjb2ZmaGVhZGVyLnNjbnNbMF07Ci0gICAgICBkcCA9ICZjb2ZmaGVhZGVyLnNjbnNbMV07Ci0gICAgICBicCA9ICZjb2ZmaGVhZGVyLnNjbnNbMl07Ci0KLSAgICAgIHN0cmNweSAodHAtPnNfbmFtZSwgIi50ZXh0Iik7Ci0gICAgICB0cC0+c19wYWRkciA9IHRleHRfc3RhcnQ7Ci0gICAgICB0cC0+c192YWRkciA9IHRleHRfc3RhcnQ7Ci0gICAgICB0cC0+c19zaXplID0gdGV4dF9zaXplOwotICAgICAgdHAtPnNfc2NucHRyID0gc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgKyBzaXplb2YgKHN0cnVjdCBleGVjKTsKLSAgICAgIHRwLT5zX3JlbHB0ciA9IDA7Ci0gICAgICB0cC0+c19sbm5vcHRyID0gMDsKLSAgICAgIHRwLT5zX25yZWxvYyA9IDA7Ci0gICAgICB0cC0+c19ubG5ubyA9IDA7Ci0gICAgICB0cC0+c19mbGFncyA9IDB4MjA7Ci0gICAgICBzdHJjcHkgKGRwLT5zX25hbWUsICIuZGF0YSIpOwotICAgICAgZHAtPnNfcGFkZHIgPSBkYXRhX3N0YXJ0OwotICAgICAgZHAtPnNfdmFkZHIgPSBkYXRhX3N0YXJ0OwotICAgICAgZHAtPnNfc2l6ZSA9IGRhdGFfc2l6ZTsKLSAgICAgIGRwLT5zX3NjbnB0ciA9IHRwLT5zX3NjbnB0ciArIHRwLT5zX3NpemU7Ci0gICAgICBkcC0+c19yZWxwdHIgPSAwOwotICAgICAgZHAtPnNfbG5ub3B0ciA9IDA7Ci0gICAgICBkcC0+c19ucmVsb2MgPSAwOwotICAgICAgZHAtPnNfbmxubm8gPSAwOwotICAgICAgZHAtPnNfZmxhZ3MgPSAweDQwOwotICAgICAgc3RyY3B5IChicC0+c19uYW1lLCAiLmJzcyIpOwotICAgICAgYnAtPnNfcGFkZHIgPSBkcC0+c192YWRkciArIGRwLT5zX3NpemU7Ci0gICAgICBicC0+c192YWRkciA9IGJwLT5zX3BhZGRyOwotICAgICAgYnAtPnNfc2l6ZSA9IGJzc19zaXplOwotICAgICAgYnAtPnNfc2NucHRyID0gMDsKLSAgICAgIGJwLT5zX3JlbHB0ciA9IDA7Ci0gICAgICBicC0+c19sbm5vcHRyID0gMDsKLSAgICAgIGJwLT5zX25yZWxvYyA9IDA7Ci0gICAgICBicC0+c19ubG5ubyA9IDA7Ci0gICAgICBicC0+c19mbGFncyA9IDB4ODA7Ci0KLSAgICAgIGNvZmZoZWFkZXIuZl9tYWdpYyA9IENPRkZfTUFHSUM7Ci0gICAgICBjb2ZmaGVhZGVyLmZfbnNjbnMgPSAzOwotICAgICAgLyogc3RvcmUgYW4gdW5saWtlbHkgdGltZSBzbyBwcm9ncmFtcyBjYW4KLSAgICAgICAqIHRlbGwgdGhhdCB0aGVyZSBpcyBhIGJzZCBoZWFkZXIKLSAgICAgICAqLwotICAgICAgY29mZmhlYWRlci5mX3RpbWRhdCA9IDE7Ci0gICAgICBjb2ZmaGVhZGVyLmZfc3ltcHRyID0gMDsKLSAgICAgIGNvZmZoZWFkZXIuZl9uc3ltcyA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLmZfb3B0aGRyID0gMjg7Ci0gICAgICBjb2ZmaGVhZGVyLmZfZmxhZ3MgPSAweDEwMzsKLSAgICAgIC8qIGFvdXRoZHIgKi8KLSAgICAgIGNvZmZoZWFkZXIubWFnaWMgPSBaTUFHSUM7Ci0gICAgICBjb2ZmaGVhZGVyLnZzdGFtcCA9IDA7Ci0gICAgICBjb2ZmaGVhZGVyLnRzaXplID0gdHAtPnNfc2l6ZTsKLSAgICAgIGNvZmZoZWFkZXIuZHNpemUgPSBkcC0+c19zaXplOwotICAgICAgY29mZmhlYWRlci5ic2l6ZSA9IGJwLT5zX3NpemU7Ci0gICAgICBjb2ZmaGVhZGVyLmVudHJ5ID0gb3V0aGVhZGVyLmFfZW50cnk7Ci0gICAgICBjb2ZmaGVhZGVyLnRleHRfc3RhcnQgPSB0cC0+c192YWRkcjsKLSAgICAgIGNvZmZoZWFkZXIuZGF0YV9zdGFydCA9IGRwLT5zX3ZhZGRyOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9FTkNBUFNVTEFURQotICBpZiAobmVlZF9jb2ZmX2hlYWRlcikKLSAgICBteXdyaXRlICgmY29mZmhlYWRlciwgc2l6ZW9mIGNvZmZoZWFkZXIsIDEsIG91dGRlc2MpOwotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9FTkNBUFNVTEFURQotICBwYWRmaWxlIChOX1RYVE9GRiAob3V0aGVhZGVyKSAtIHNpemVvZiBvdXRoZWFkZXIsIG91dGRlc2MpOwotI2VuZGlmCi0KLSAgdGV4dF9zaXplIC09IE5fVFhUT0ZGIChvdXRoZWFkZXIpOwotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnQgZW5jYXBfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0jZGVmaW5lIE1ZX29iamVjdF9wIGVuY2FwX29iamVjdF9wCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0LW5zMzJrLmMgYi9iZmQvYW91dC1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTMzNWFhLi4wMDAwMDAwCi0tLSBhL2JmZC9hb3V0LW5zMzJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBuczMyayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IElhbiBEYWxsIChpZGFsbEBlbGVjZW5nLmFkZWxhaWRlLmVkdS5hdSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAibnMzMmsuaCIKLQotI2RlZmluZSBNWU5TKE9QKSBDQVQobnMzMmthb3V0XyxPUCkKLXJlbG9jX2hvd3RvX3R5cGUgKgotTVlOUyhiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotYm9vbGVhbgotTVlOUyh3cml0ZV9vYmplY3RfY29udGVudHMpCi0gIFBBUkFNUygoYmZkICphYmZkKSk7Ci0KLS8qIEF2b2lkIG11bHRpcGxlIGRlZmluaXRpb25zIGZyb20gYW91dHggaWYgc3VwcG9ydGluZyBzdGFuZGFyZCBhLm91dCBmb3JtYXQocykKLSAqIGFzIHdlbGwgYXMgdGhpcyBvbmUKLSAqLwotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhuczMya2FvdXQsXzMyXyx5KQotCi12b2lkIGJmZF9uczMya19hcmNoIFBBUkFNUyAoKHZvaWQpKTsKLQotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBNWShPUCkgTVlOUyhPUCkKLQotI2RlZmluZSBNWV9zd2FwX3N0ZF9yZWxvY19pbiBNWShzd2FwX3N0ZF9yZWxvY19pbikKLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IE1ZKHN3YXBfc3RkX3JlbG9jX291dCkKLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXMsCi0JCQkgICAgICBhcmVsZW50ICpjYWNoZV9wdHIsIGFzeW1ib2wgKipzeW1ib2xzLAotCQkJICAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudCkpOwotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqZywKLQkJCSAgICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpuYXRwdHIpKTsKLQotLyogVGhlIG5zMzJrIHNlcmllcyBpcyBhaCwgdW51c3VhbCwgd2hlbiBpdCBjb21lcyB0byByZWxvY2F0aW9uLgotICogVGhlcmUgYXJlIHRocmVlIHN0b3JhZ2UgbWV0aG9kcyBmb3IgcmVsb2NhdGVhYmxlIG9iamVjdHMuICBUaGVyZQotICogYXJlIGRpc3BsYWNlbWVudHMsIGltbWVkaWF0ZSBvcGVyYW5kcyBhbmQgb3JkaW5hcnkgdHdvcyBjb21wbGVtZW50Ci0gKiBkYXRhLiBPZiB0aGVzZSwgb25seSB0aGUgbGFzdCBmaXRzIGludG8gdGhlIHN0YW5kYXJkIHJlbG9jYXRpb24KLSAqIHNjaGVtZS4gIEltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgc3RvcmVkIGh1ZmZtYW4gZW5jb2RlZCBhbmQKLSAqIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgc3RvcmVkIGJpZyBlbmRpYW4gKHdoZXJlIGFzIHRoZSBuYXR1cmFsIGJ5dGUKLSAqIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4gZm9yIHRoaXMgYWNoaXRlY3R1cmUpLgotCi0gKiBOb3RlIHRoYXQgdGhlIG5zMzJrIGRpc3BsYWNlbWVudCBzdG9yYWdlIG1ldGhvZCBpcyBvcnRob2dvbmFsIHRvCi0gKiB3aGV0aGVyIHRoZSByZWxvY2F0aW9uIGlzIHBjIHJlbGF0aXZlIG9yIG5vdC4gVGhlICJkaXNwbGFjZW1lbnQiCi0gKiBzdG9yYWdlIHNjaGVtZSBpcyB1c2VkIGZvciBlc3NlbnRpYWxseSBhbGwgYWRkcmVzcyBjb25zdGFudHMuIFRoZQotICogZGlzcGxhY2VtZW50IGNhbiBiZSByZWxhdGl2ZSB0byB6ZXJvIChhYnNvbHV0ZSBkaXNwbGFjZW1lbnQpLAotICogcmVsYXRpdmUgdG8gdGhlIHBjIChwYyByZWxhdGl2ZSksIHRoZSBzdGFjayBwb2ludGVyLCB0aGUgZnJhbWUKLSAqIHBvaW50ZXIsIHRoZSBzdGF0aWMgYmFzZSByZWdpc3RlciBhbmQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGV0Yy4KLQotICogRm9yIGV4YW1wbGU6Ci0gKgotICogIHN5bTE6IC5sb25nIC4JIyBwYyByZWxhdGl2ZSAyJ3MgY29tcGxlbWVudAotICogIHN5bTE6IC5sb25nIGZvbwkjIDIncyBjb21wbGVtZW50IG5vdCBwYyByZWxhdGl2ZQotICoKLSAqICBzZWxmOiAgbW92ZCBAc2VsZiwgcjAgIyBwYyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQKLSAqCSAgIG1vdmQgZm9vLCByMCAjIG5vbiBwYyByZWxhdGl2ZSBkaXNwbGFjZW1lbnQKLSAqCi0gKiAgc2VsZjogIG1vdmQgc2VsZiwgcjAgIyBwYyByZWxhdGl2ZSBpbW1lZGlhdGUKLSAqICAgICAgICAgbW92ZCBmb28sIHIwICMgbm9uIHBjIHJlbGF0aXZlIGltbWVkaWF0ZQotICoKLSAqIEluIGFkZGl0aW9uLCBmb3IgaGlzdG9yaWNhbCByZWFzb25zIHRoZSBlbmNvZGluZyBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlcwotICogaW4gdGhlIGEub3V0IGZvcm1hdCByZWxvY2F0aW9uIGVudHJpZXMgaXMgc3VjaCB0aGF0IGV2ZW4gdGhlIHJlbG9jYXRpb24KLSAqIG1ldGhvZHMgd2hpY2ggYXJlIHN0YW5kYXJkIGFyZSBub3QgZW5jb2RlZCB0aGUgc3RhbmRhcmQgd2F5LgotICoKLSAqLwotCi1yZWxvY19ob3d0b190eXBlIE1ZKGhvd3RvX3RhYmxlKVtdID0gCi17Ci0gIC8qIG5zMzJrIGltbWVkaWF0ZSBvcGVyYW5kcyAqLwotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV84LCAwLCAwLCA4LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICJOUzMyS19JTU1fOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMCwgMSwgMTYsIGZhbHNlLCAwLCB0cnVlLAotCSBfYmZkX25zMzJrX3JlbG9jX2ltbSwgICJOUzMyS19JTU1fMTYiLAotCSB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19pbW0sICJOUzMyS19JTU1fMzIiLAotCSB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzgiLAotCSB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgZmFsc2UsCi0JIF9iZmRfbnMzMmtfcmVsb2NfaW1tLCAiUENSRUxfTlMzMktfSU1NXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgLyogbnMzMmsgZGlzcGxhY2VtZW50cyAqLwotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgMCwgMCwgOCwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfOCIsCi0JIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgdHJ1ZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiTlMzMktfRElTUF8xNiIsCi0JIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIHRydWUsCi0JIF9iZmRfbnMzMmtfcmVsb2NfZGlzcCwgIk5TMzJLX0RJU1BfMzIiLAotCSB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCAwLCAwLCA4LCB0cnVlLCAwLCBmYWxzZSwKLQkgX2JmZF9uczMya19yZWxvY19kaXNwLCAiUENSRUxfTlMzMktfRElTUF84IiwKLQkgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCwgMCwgMSwgMTYsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJQQ1JFTF9OUzMyS19ESVNQXzE2IiwKLQkgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGZhbHNlLAotCSBfYmZkX25zMzJrX3JlbG9jX2Rpc3AsICJQQ1JFTF9OUzMyS19ESVNQXzMyIiwKLQkgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0KLSAgLyogTm9ybWFsIDIncyBjb21wbGVtZW50ICovCi0gIEhPV1RPIChCRkRfUkVMT0NfOCwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsCi0JICI4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwKLQkgIjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwKLQkgIjMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChCRkRfUkVMT0NfOF9QQ1JFTCwgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotCSAiUENSRUxfOCIsIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyAoQkZEX1JFTE9DXzE2X1BDUkVMLCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotCSAiUENSRUxfMTYiLCB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKEJGRF9SRUxPQ18zMl9QQ1JFTCwgMCwgMiwgMzIsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkgIlBDUkVMXzMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0KLSNkZWZpbmUgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhCRkQpIChNWShob3d0b190YWJsZSkgKyAxNCkKLQotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX0JJRyAweDA2Ci0jZGVmaW5lIFJFTE9DX1NURF9CSVRTX05TMzJLX1RZUEVfTElUVExFIDB4NjAKLSNkZWZpbmUgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9TSF9CSUcgMQotI2RlZmluZSBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSA1Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkocmVsb2NfaG93dG8pKGFiZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsOwotICAgICBpbnQgKnJfaW5kZXg7Ci0gICAgIGludCAqcl9leHRlcm47Ci0gICAgIGludCAqcl9wY3JlbDsKLXsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9uczMya190eXBlOwotLyogIEJGRF9BU1NFUlQoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7ICovCi0gICpyX2luZGV4ID0gICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCSAgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkgICAgICAgfCAgcmVsLT5yX2luZGV4WzBdICk7Ci0gICpyX2V4dGVybiAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICpyX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgcl9sZW5ndGggID0gICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotCQk+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgcl9uczMya190eXBlICA9ICAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTlMzMktfVFlQRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci0gIHJldHVybiAoTVkoaG93dG9fdGFibGUpICsgcl9sZW5ndGggKyAzICogKCpyX3BjcmVsKSArIDYgKiByX25zMzJrX3R5cGUpOwotfQotCi0jZGVmaW5lIE1ZX3JlbG9jX2hvd3RvKEJGRCxSRUwsSU4sRVgsUEMpIE1ZKHJlbG9jX2hvd3RvKShCRkQsIFJFTCwgJklOLCAmRVgsICZQQykKLQotdm9pZAotTVkocHV0X3JlbG9jKShhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgdmFsdWUsIGhvd3RvLCByZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcl9leHRlcm47Ci0gICAgIGludCByX2luZGV4OwotICAgICBsb25nIHZhbHVlOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX25zMzJrX3R5cGU7Ci0gIFBVVF9XT1JEIChhYmZkLCB2YWx1ZSwgcmVsb2MtPnJfYWRkcmVzcyk7Ci0gIHJfbGVuZ3RoID0gaG93dG8tPnNpemUgOwkvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIHJfcGNyZWwgID0gKGludCkgaG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLSAgcl9uczMya190eXBlID0gKGhvd3RvIC0gTVkoaG93dG9fdGFibGUpICkvNjsKLS8qICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsgKi8KLSAgcmVsb2MtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICByZWxvYy0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgcmVsb2MtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICByZWxvYy0+cl90eXBlWzBdID0KLSAgICAocl9leHRlcm4/ICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU6IDApCi0gICAgICB8IChyX3BjcmVsPyAgICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCXwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKQotCSAgfCAocl9uczMya190eXBlIDw8ICBSRUxPQ19TVERfQklUU19OUzMyS19UWVBFX1NIX0xJVFRMRSk7Ci19Ci0KLSNkZWZpbmUgTVlfcHV0X3JlbG9jKEJGRCwgRVhULCBJRFgsIFZBTCwgSE9XVE8sIFJFTE9DKSBcCi0gIE1ZKHB1dF9yZWxvYykoQkZELCBFWFQsIElEWCwgVkFMLCBIT1dUTywgUkVMT0MpCi0KLSNkZWZpbmUgU1RBVF9GT1JfRVhFQwotCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX3JlbG9jYXRlX2NvbnRlbnRzIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKLQotI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotTVkoYmZkX3JlbG9jX3R5cGVfbG9va3VwKShhYmZkLGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSNkZWZpbmUgRU5UUlkoaSxqKQljYXNlIGk6IHJldHVybiAmTVkoaG93dG9fdGFibGUpW2pdCi0KLSAgaW50IGV4dCA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19FWFRfU0laRTsKLQotICBCRkRfQVNTRVJUKGV4dCA9PSAwKTsKLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotCWNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzgsIDApOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwgMSk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzMyLCAyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTCwgMyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLCA0KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19JTU1fMzJfUENSRUwsIDUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DX05TMzJLX0RJU1BfOCwgNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwgNyk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMiwgOCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMLCA5KTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLCAxMCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwgMTEpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzgsIDEyKTsKLSAgICAgIEVOVFJZKEJGRF9SRUxPQ18xNiwgMTMpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzMyLCAxNCk7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfOF9QQ1JFTCwgMTUpOwotICAgICAgRU5UUlkoQkZEX1JFTE9DXzE2X1BDUkVMLCAxNik7Ci0gICAgICBFTlRSWShCRkRfUkVMT0NfMzJfUENSRUwsIDE3KTsKLSAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICB9Ci0jdW5kZWYgRU5UUlkKLX0KLQotCi1zdGF0aWMgdm9pZAotTVlfc3dhcF9zdGRfcmVsb2NfaW4gKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICBpbnQgcl9wY3JlbDsKLSAgc3RydWN0IGFvdXRkYXRhICAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSBNWV9yZWxvY19ob3d0byhhYmZkLCBieXRlcywgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotCi0gIE1PVkVfQUREUkVTUygwKTsKLX0KLQotc3RhdGljIHZvaWQKLU1ZX3N3YXBfc3RkX3JlbG9jX291dCAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZSAKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgQ2hlY2sgZm9yIHRoYXQgaGVyZS4gICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX2Fic19zZWN0aW9uCi0gICAgICB8fCBvdXRwdXRfc2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uKSAKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgLyogRmlsbCBpbiBzeW1ib2wgKi8KLQkgIHJfZXh0ZXJuID0gMTsKLSN1bmRlZiBLRUVQSVQKLSNkZWZpbmUgS0VFUElUIHVkYXRhLmkKLQkgIHJfaW5kZXggPSAgKCooZy0+c3ltX3B0cl9wdHIpKS0+S0VFUElUOwotI3VuZGVmIEtFRVBJVCAgICAgCi0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsgICAgICAKLSAgICB9Ci0KLSAgTVlfcHV0X3JlbG9jIChhYmZkLCByX2V4dGVybiwgcl9pbmRleCwgZy0+YWRkcmVzcywgZy0+aG93dG8sIG5hdHB0cik7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9uczMya19yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci17Ci0gIGludCByX25zMzJrX3R5cGUgPSAoaG93dG8gLSBNWShob3d0b190YWJsZSkpIC8gNjsKLSAgbG9uZyAoKmdldF9kYXRhKSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci0gIGludCAoKnB1dF9kYXRhKSBQQVJBTVMgKChsb25nLCBiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci0KLSAgc3dpdGNoIChyX25zMzJrX3R5cGUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGdldF9kYXRhID0gX2JmZF9uczMya19nZXRfaW1tZWRpYXRlOwotICAgICAgcHV0X2RhdGEgPSBfYmZkX25zMzJrX3B1dF9pbW1lZGlhdGU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBnZXRfZGF0YSA9IF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudDsKLSAgICAgIHB1dF9kYXRhID0gX2JmZF9uczMya19wdXRfZGlzcGxhY2VtZW50OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgIGxvY2F0aW9uKTsKLSAgICAgIC8qIE5PVCBSRUFDSEVEICovCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotICByZXR1cm4gX2JmZF9kb19uczMya19yZWxvY19jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgICAgICAgbG9jYXRpb24sIGdldF9kYXRhLCBwdXRfZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9iZmQvYW91dC1zcGFyY2xlLmMgYi9iZmQvYW91dC1zcGFyY2xlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwM2IxMzYuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQtc3BhcmNsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIHNwYXJjIGxpdHRsZS1lbmRpYW4gYW91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1saXR0bGUiCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNsZV9hb3V0XyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fU1BBUkMgfHwgKG10eXBlKSA9PSBNX1NQQVJDTEVUKQotCi0vKiBJbmNsdWRlIHRoZSB1c3VhbCBhLm91dCBzdXBwb3J0LiAgKi8KLSNkZWZpbmUgVEFSR0VUX0lTX0xJVFRMRV9FTkRJQU5fUAotI2luY2x1ZGUgImFvdXRmMS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQtdGFyZ2V0LmggYi9iZmQvYW91dC10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlZTA3YS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC10YXJnZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1MCArMCwwIEBACi0vKiBEZWZpbmUgYSB0YXJnZXQgdmVjdG9yIGFuZCBzb21lIHNtYWxsIHJvdXRpbmVzIGZvciBhIHZhcmlhbnQgb2YgYS5vdXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0vKiNpbmNsdWRlICJsaWJhb3V0LmgiKi8KLQotI2lmbmRlZiBTRUdNRU5UX1NJWkUKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqIE5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotCi0vKiBTZXQgcGFyYW1ldGVycyBhYm91dCB0aGlzIGEub3V0IGZpbGUgdGhhdCBhcmUgbWFjaGluZS1kZXBlbmRlbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc29tZV9hb3V0X29iamVjdF9wIGp1c3QgYmVmb3JlIGl0IHJldHVybnMuICAqLwotI2lmbmRlZiBNWV9jYWxsYmFjawotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqTVkoY2FsbGJhY2spIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLU1ZKGNhbGxiYWNrKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBhcmNoX2FsaWduX3Bvd2VyOwotICB1bnNpZ25lZCBsb25nIGFyY2hfYWxpZ247Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcGFydHMgb2YgYSBuZXdseSByZWFkIGFvdXQgaGVhZGVyICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplID0gTl9UWFRTSVpFKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBOX0RBVEFERFIoKmV4ZWNwKTsKLSAgb2JqX2Jzc3NlYyAgKGFiZmQpLT52bWEgPSBOX0JTU0FERFIoKmV4ZWNwKTsKLQotICAvKiBGb3Igc29tZSB0YXJnZXRzLCBpZiB0aGUgZW50cnkgcG9pbnQgaXMgbm90IGluIHRoZSBzYW1lIHBhZ2UKLSAgICAgYXMgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0LCB0aGVuIGFkanVzdCB0aGUgVk1BIHNvIHRoYXQgaXQgaXMuCi0gICAgIEZJWE1FOiBEbyB0aGlzIHdpdGggYSBtYWNybyBsaWtlIFNFVF9BUkNIX01BQ0ggaW5zdGVhZD8gICovCi0gIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmVudHJ5X2lzX3RleHRfYWRkcmVzcwotICAgICAgJiYgZXhlY3AtPmFfZW50cnkgPiBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFkanVzdDsKLQotICAgICAgYWRqdXN0ID0gZXhlY3AtPmFfZW50cnkgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgICAgIC8qIEFkanVzdCBvbmx5IGJ5IHdob2xlIHBhZ2VzLiAqLwotICAgICAgYWRqdXN0ICY9IH4oVEFSR0VUX1BBR0VfU0laRSAtIDEpOwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgKz0gYWRqdXN0OwotICAgICAgb2JqX2Jzc3NlYyAoYWJmZCktPnZtYSArPSBhZGp1c3Q7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgbG9hZCBhZGRyZXNzZXMgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHZpcnR1YWwgYWRkcmVzc2VzLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5sbWEgPSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5sbWEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX2Jzc3NlYyAoYWJmZCktPmxtYSA9IG9ial9ic3NzZWMgKGFiZmQpLT52bWE7Ci0KLSAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9UWFRPRkYgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fREFUT0ZGICgqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUkVMT0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotICAKLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotI2lmZGVmIFNFVF9BUkNIX01BQ0gKLSAgU0VUX0FSQ0hfTUFDSChhYmZkLCAqZXhlY3ApOwotI2Vsc2UKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLSAgLyogVGhlIG51bWJlciBvZiByZWxvY2F0aW9uIHJlY29yZHMuICBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyCi0gICAgIFNFVF9BUkNIX01BQ0guICBJdCBhc3N1bWVzIHRoYXQgU0VUX0FSQ0hfTUFDSCB3aWxsIHNldAotICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSBjb3JyZWN0bHksIGlmIHRoZSByZWxvYyBzaXplIGlzIG5vdAotICAgICBSRUxPQ19TVERfU0laRS4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQgPQotICAgIGV4ZWNwLT5hX3Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9Ci0gICAgZXhlY3AtPmFfZHJzaXplIC8gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIGFyY2hpdGVjdHVyZSwgc2V0IHRoZSBhbGlnbm1lbnRzIG9mIHRoZQotICAgICBzZWN0aW9ucy4gIFRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSBOQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vayksCi0gICAgIGJ1dCB3aGVuIHRoZSBpbml0aWFsIHNlY3Rpb25zIHdlcmUgY3JlYXRlZCB0aGUgYXJjaGl0ZWN0dXJlIGhhZAotICAgICBub3QgeWV0IGJlZW4gc2V0LiAgSG93ZXZlciwgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHdlIGRvbid0Ci0gICAgIHNldCB0aGUgYWxpZ25tZW50IHBvd2VyIGFueSBoaWdoZXIgdGhhbiBhcyByZXF1aXJlZCBieSB0aGUgc2l6ZQotICAgICBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGFyY2hfYWxpZ25fcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0gIGFyY2hfYWxpZ24gPSAxIDw8IGFyY2hfYWxpZ25fcG93ZXI7Ci0gIGlmICgoQkZEX0FMSUdOIChvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSwgYXJjaF9hbGlnbikKLSAgICAgICA9PSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICAgICYmIChCRkRfQUxJR04gKG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotCSAgPT0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgICAmJiAoQkZEX0FMSUdOIChvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotCSAgPT0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZSkpCi0gICAgewotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgICAgb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBhcmNoX2FsaWduX3Bvd2VyOwotICAgICAgb2JqX2Jzc3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgfQotCi0gIC8qIERvbid0IHNldCBzaXplcyBub3cgLS0gY2FuJ3QgYmUgc3VyZSB1bnRpbCB3ZSBrbm93IGFyY2ggJiBtYWNoLgotICAgICBTaXplcyBnZXQgc2V0IGluIHNldF9zaXplcyBjYWxsYmFjaywgbGF0ZXIuICAqLwotI2lmIDAKLSAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0jZW5kaWYKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX29iamVjdF9wCi0vKiBGaW5pc2ggdXAgdGhlIHJlYWRpbmcgb2YgYW4gYS5vdXQgZmlsZSBoZWFkZXIgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKk1ZKG9iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWShvYmplY3RfcCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsJLyogUmF3IGV4ZWMgaGVhZGVyIGZyb20gZmlsZSAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBleGVjOwkJLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotICAgICAgIT0gRVhFQ19CWVRFU19TSVpFKSB7Ci0gICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotI2lmZGVmIFNXQVBfTUFHSUMKLSAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZWxzZQotICBleGVjLmFfaW5mbyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXhlY19ieXRlcy5lX2luZm8pOwotI2VuZGlmIC8qIFNXQVBfTUFHSUMgKi8KLQotICBpZiAoTl9CQURNQUcgKGV4ZWMpKSByZXR1cm4gMDsKLSNpZmRlZiBNQUNIVFlQRV9PSwotICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICBOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikoYWJmZCwgJmV4ZWNfYnl0ZXMsICZleGVjKTsKLQotI2lmZGVmIFNXQVBfTUFHSUMKLSAgLyogc3dhcF9leGVjX2hlYWRlcl9pbiByZWFkIGluIGFfaW5mbyB3aXRoIHRoZSB3cm9uZyBieXRlIG9yZGVyICovCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2VuZGlmIC8qIFNXQVBfTUFHSUMgKi8KLQotICB0YXJnZXQgPSBOQU1FKGFvdXQsc29tZV9hb3V0X29iamVjdF9wKSAoYWJmZCwgJmV4ZWMsIE1ZKGNhbGxiYWNrKSk7Ci0KLSNpZmRlZiBFTlRSWV9DQU5fQkVfWkVSTwotICAvKiBUaGUgTkVXU09TMyBlbnRyeS1wb2ludCBpcy93YXMgMCwgd2hpY2ggKGFtb25nc3Qgb3RoZXIgbG9zc2FnZSkKLSAgICogbWVhbnMgdGhhdCBpdCBpc24ndCBvYnZpb3VzIGlmIEVYRUNfUCBzaG91bGQgYmUgc2V0LgotICAgKiBBbGwgb2YgdGhlIGZvbGxvd2luZyBtdXN0IGJlIHRydWUgZm9yIGFuIGV4ZWN1dGFibGU6Ci0gICAqIFRoZXJlIG11c3QgYmUgbm8gcmVsb2NhdGlvbnMsIHRoZSBiZmQgY2FuIGJlIG5laXRoZXIgYW4KLSAgICogYXJjaGl2ZSBub3IgYW4gYXJjaGl2ZSBlbGVtZW50LCBhbmQgdGhlIGZpbGUgbXVzdCBiZSBleGVjdXRhYmxlLiAqLwotCi0gIGlmIChleGVjLmFfdHJzaXplICsgZXhlYy5hX2Ryc2l6ZSA9PSAwCi0gICAgICAmJiBiZmRfZ2V0X2Zvcm1hdChhYmZkKSA9PSBiZmRfb2JqZWN0ICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCS8qIEV4ZWN1dGUgYnkgb3duZXIuICAqLwotI2VuZGlmCi0gICAgICBpZiAoc3RhdChhYmZkLT5maWxlbmFtZSwgJmJ1ZikgPT0gMCAmJiAoYnVmLnN0X21vZGUgJiBTX0lYVVNSKSkKLQlhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gICAgfQotI2VuZGlmIC8qIEVOVFJZX0NBTl9CRV9aRVJPICovCi0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLSNkZWZpbmUgTVlfb2JqZWN0X3AgTVkob2JqZWN0X3ApCi0jZW5kaWYKLQotCi0jaWZuZGVmIE1ZX21rb2JqZWN0Ci0KLXN0YXRpYyBib29sZWFuIE1ZKG1rb2JqZWN0KSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkobWtvYmplY3QpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChOQU1FKGFvdXQsbWtvYmplY3QpKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSNpZiAwIC8qIFNpemVzIGdldCBzZXQgaW4gc2V0X3NpemVzIGNhbGxiYWNrLCBsYXRlciwgYWZ0ZXIgd2Uga25vdwotCSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLiAgKi8KLSAgYWRhdGEoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIE1ZX21rb2JqZWN0IE1ZKG1rb2JqZWN0KQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gIFRoaXMgYWN0dWFsbHkgZG9lcyBub3RoaW5nIHdpdGggdGhlCi0gICBzZWN0aW9ucy4gIEl0IGNvcGllcyB0aGUgc3ViZm9ybWF0IGZpZWxkLiAgV2UgY29weSBpdCBoZXJlLCBiZWNhdXNlCi0gICB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGlzIGlzIGEgUU1BR0lDIGZpbGUgYmVmb3JlIHdlIHNldCB0aGUKLSAgIHNlY3Rpb24gY29udGVudHMsIGFuZCBjb3B5X3ByaXZhdGVfYmZkX2RhdGEgaXMgbm90IGNhbGxlZCB1bnRpbAotICAgYWZ0ZXIgdGhlIHNlY3Rpb24gY29udGVudHMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyBib29sZWFuIE1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1NWV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSAoaWJmZCwgaXNlYywgb2JmZCwgb3NlYykKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlYzsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLSAgICAgICYmIGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgb2JqX2FvdXRfc3ViZm9ybWF0IChvYmZkKSA9IG9ial9hb3V0X3N1YmZvcm1hdCAoaWJmZCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0gICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLSNpZm5kZWYgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSNpZiBDSE9PU0VfUkVMT0NfU0laRQotICBDSE9PU0VfUkVMT0NfU0laRShhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9zZXRfc2l6ZXMKLQotc3RhdGljIGJvb2xlYW4gTVkoc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkoc2V0X3NpemVzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotICBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUgPSBTRUdNRU5UX1NJWkU7Ci0KLSNpZmRlZiBaTUFHSUNfRElTS19CTE9DS19TSVpFCi0gIGFkYXRhKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBaTUFHSUNfRElTS19CTE9DS19TSVpFOwotI2Vsc2UKLSAgYWRhdGEoYWJmZCkuem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0jZW5kaWYKLQotICBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gIHJldHVybiB0cnVlOwotfQotI2RlZmluZSBNWV9zZXRfc2l6ZXMgTVkoc2V0X3NpemVzKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCi0KLSNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAotI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgTVlfem1hZ2ljX2NvbnRpZ3VvdXMsCi0gIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyLAotICBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MsCi0gIE1ZX2V4ZWNfaGRyX2ZsYWdzLAotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVlfc2V0X3NpemVzLAotICBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCwKLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEgJk1ZKGJhY2tlbmRfZGF0YSkKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sKLQotLyogQ2FsbGJhY2sgZm9yIHRoZSBmaW5hbF9saW5rIHJvdXRpbmUgdG8gc2V0IHRoZSBzZWN0aW9uIG9mZnNldHMuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1NWV9maW5hbF9saW5rX2NhbGxiYWNrIChhYmZkLCBwdHJlbG9mZiwgcGRyZWxvZmYsIHBzeW1vZmYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmlsZV9wdHIgKnB0cmVsb2ZmOwotICAgICBmaWxlX3B0ciAqcGRyZWxvZmY7Ci0gICAgIGZpbGVfcHRyICpwc3ltb2ZmOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgKnB0cmVsb2ZmID0gTl9UUkVMT0ZGICgqZXhlY3ApOwotICAqcGRyZWxvZmYgPSBOX0RSRUxPRkYgKCpleGVjcCk7Ci0gICpwc3ltb2ZmID0gTl9TWU1PRkYgKCpleGVjcCk7Ci19Ci0KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9maW5hbF9saW5rCi0KLS8qIEZpbmFsIGxpbmsgcm91dGluZS4gIFdlIG5lZWQgdG8gdXNlIGEgY2FsbCBiYWNrIHRvIGdldCB0aGUgY29ycmVjdAotICAgb2Zmc2V0cyBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBNWV9iZmRfZmluYWxfbGluayBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbgotTVlfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBOQU1FKGFvdXQsZmluYWxfbGluaykgKGFiZmQsIGluZm8sIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2spOwotfQotCi0jZW5kaWYKLQotLyogV2UgYXNzdW1lIEJGRCBnZW5lcmljIGFyY2hpdmUgZmlsZXMuICAqLwotI2lmbmRlZglNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgTVlfZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNlbmRpZgotI2lmbmRlZglNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9hcm1hcAotI2RlZmluZQlNWV9zbHVycF9hcm1hcAkJCWJmZF9zbHVycF9ic2RfYXJtYXAKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYJTVlfd3JpdGVfYXJtYXAKLSNkZWZpbmUJTVlfd3JpdGVfYXJtYXAJCWJzZF93cml0ZV9hcm1hcAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfYXJfaGRyCi0jZGVmaW5lIE1ZX3JlYWRfYXJfaGRyCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNlbmRpZgotI2lmbmRlZglNWV90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUJTVlfdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2VuZGlmCi0jaWZuZGVmIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNkZWZpbmUgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNlbmRpZgotCi0vKiBObyBjb3JlIGZpbGUgZGVmaW5lZCBoZXJlIC0tIGNvbmZpZ3VyZSBpbiB0cmFkLWNvcmUuYyBzZXBhcmF0ZWx5LiAgKi8KLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AJXAotCQkJCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wCQlfYmZkX2R1bW15X3RhcmdldAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fZW5kCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIE5BTUUoYW91dCxjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIE5BTUUoYW91dCxnZXRfc2VjdGlvbl9jb250ZW50cykKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNlbmRpZgotI2lmbmRlZiBNWV9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIE1ZX25ld19zZWN0aW9uX2hvb2sgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBOQU1FKGFvdXQsZ2V0X3N5bXRhYikKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIE1ZX21ha2VfZW1wdHlfc3ltYm9sIE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9wcmludF9zeW1ib2wKLSNkZWZpbmUgTVlfcHJpbnRfc3ltYm9sIE5BTUUoYW91dCxwcmludF9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIE1ZX2dldF9zeW1ib2xfaW5mbyBOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9saW5lbm8KLSNkZWZpbmUgTVlfZ2V0X2xpbmVubyBOQU1FKGFvdXQsZ2V0X2xpbmVubykKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIE1ZX3NldF9hcmNoX21hY2ggTkFNRShhb3V0LHNldF9hcmNoX21hY2gpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgTVlfZmluZF9uZWFyZXN0X2xpbmUgTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIE1ZX3NpemVvZl9oZWFkZXJzIE5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBNWV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIE5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgTVlfY2xvc2VfYW5kX2NsZWFudXAgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNlbmRpZgotCi0vKiBBb3V0IHN5bWJvbHMgbm9ybWFsbHkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzICovCi0jaWZuZGVmIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgCi0jZGVmaW5lIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0jZW5kaWYKLQotLyogQW91dCBhcmNoaXZlcyBub3JtYWxseSB1c2Ugc3BhY2VzIGZvciBwYWRkaW5nICovCi0jaWZuZGVmIEFSX1BBRF9DSEFSCi0jZGVmaW5lIEFSX1BBRF9DSEFSICcgJwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfQkZEX1RBUkdFVAotY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpID0KLXsKLSAgVEFSR0VUTkFNRSwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0jaWZkZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotI2Vsc2UKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSNlbmRpZgotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gIEFSX1BBRF9DSEFSLAkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotI2lmZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0jZWxzZQotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSNlbmRpZgotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChNWSksCi0KLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAotfTsKLSNlbmRpZiAvKiBNWV9CRkRfVEFSR0VUICovCmRpZmYgLS1naXQgYS9iZmQvYW91dC10aWMzMC5jIGIvYmZkL2FvdXQtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlNmNiNy4uMDAwMDAwMAotLS0gYS9iZmQvYW91dC10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2NSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFRNUzMyMEMzMCBhLm91dCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAxMDI0Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMTI4Ci0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF90aWMzMAotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotI2RlZmluZSBNWShPUCkgQ0FUKHRpYzMwX2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC10aWMzMCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDModGljMzBfYW91dCxfMzJfLHkpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9maXhfMTYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZml4XzMyCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSB0aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICp0aWMzMF9hb3V0X3JlbG9jX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosIGludCAqLCBpbnQgKiwgaW50ICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHRpYzMwX2FvdXRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hLAotCSAgIGJmZF92bWEsIGJmZF92bWEpKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp0aWMzMF9hb3V0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0aWMzMF9hb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGljMzBfYW91dF9zZXRfc2l6ZXMgUEFSQU1TICgoYmZkICopKTsKLQotI2RlZmluZSBNWV9yZWxvY19ob3d0byhCRkQsUkVMLElOLEVYLFBDKSB0aWMzMF9hb3V0X3JlbG9jX2hvd3RvKEJGRCxSRUwsJklOLCZFWCwmUEMpCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfcmVsb2NhdGUgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlCi0jZGVmaW5lIE1ZX29iamVjdF9wIHRpYzMwX2FvdXRfb2JqZWN0X3AKLSNkZWZpbmUgTVlfbWtvYmplY3QgTkFNRShhb3V0LG1rb2JqZWN0KQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NpemVzIHRpYzMwX2FvdXRfc2V0X3NpemVzCi0KLSNpZm5kZWYgTVlfZXhlY19oZHJfZmxhZ3MKLSNkZWZpbmUgTVlfZXhlY19oZHJfZmxhZ3MgMQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmFja2VuZF9kYXRhCi0KLSNpZm5kZWYgTVlfem1hZ2ljX2NvbnRpZ3VvdXMKLSNkZWZpbmUgTVlfem1hZ2ljX2NvbnRpZ3VvdXMgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyCi0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MKLSNkZWZpbmUgTVlfZW50cnlfaXNfdGV4dF9hZGRyZXNzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZAotI2RlZmluZSBNWV9leGVjX2hlYWRlcl9ub3RfY291bnRlZCAxCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX2R5bmFtaWNfc3ltYm9scwotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfbGlua19keW5hbWljX29iamVjdAotI2RlZmluZSBNWV9saW5rX2R5bmFtaWNfb2JqZWN0IDAKLSNlbmRpZgotI2lmbmRlZiBNWV93cml0ZV9keW5hbWljX3N5bWJvbAotI2RlZmluZSBNWV93cml0ZV9keW5hbWljX3N5bWJvbCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9jaGVja19keW5hbWljX3JlbG9jIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9maW5pc2hfZHluYW1pY19saW5rCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgMAotI2VuZGlmCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgdGljMzBfYW91dF9iYWNrZW5kX2RhdGEgPQotewotICBNWV96bWFnaWNfY29udGlndW91cywKLSAgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIsCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIHRleHQgdm1hPyAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIE1ZX2V4ZWNfaGVhZGVyX25vdF9jb3VudGVkLAotICBNWV9hZGRfZHluYW1pY19zeW1ib2xzLAotICBNWV9hZGRfb25lX3N5bWJvbCwKLSAgTVlfbGlua19keW5hbWljX29iamVjdCwKLSAgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wsCi0gIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MsCi0gIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsKLX07Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmdGljMzBfYW91dF9iYWNrZW5kX2RhdGEKLSNlbmRpZgotCi0vKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIGFvdXR4Lmggc2hvdWxkIHJlYWxseSBvbmx5IGJlIGluY2x1ZGVkIGJ5Ci0gICBhb3V0MzIuYy4gICovCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiBUaGlzIHRhYmxlIGxpc3RzIHRoZSByZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgVE1TMzIwQzMwLiAgVGhlcmUgYXJlCi0gICBvbmx5IGEgZmV3IHJlbG9jYXRpb25zIHJlcXVpcmVkLCBhbmQgYWxsIG11c3QgYmUgZGl2aWRlZCBieSA0ICg+PgotICAgMikgdG8gZ2V0IHRoZSAzMi1iaXQgYWRkcmVzc2VzIGluIHRoZSBmb3JtYXQgdGhlIFRNUzMyMEMzMCBsaWtlcwotICAgaXQuICovCi1yZWxvY19ob3d0b190eXBlIHRpYzMwX2FvdXRfaG93dG9fdGFibGVbXSA9Ci17Ci0gIHstMX0sCi0gIEhPV1RPICgxLCAyLCAxLCAxNiwgZmFsc2UsIDAsIDAsIHRpYzMwX2FvdXRfZml4XzE2LAotCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoMiwgMiwgMiwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjI0IiwgZmFsc2UsIDB4MDBGRkZGRkYsIDB4MDBGRkZGRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDMsIDE4LCAzLCAyNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiTERQIiwgZmFsc2UsIDB4MDBGRjAwMDAsIDB4MDAwMDAwRkYsIGZhbHNlKSwKLSAgSE9XVE8gKDQsIDIsIDQsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHRpYzMwX2FvdXRfZml4XzMyLAotCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoNSwgMiwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgdGljMzBfYW91dF9maXhfcGNyZWxfMTYsICJQQ1JFTCIsIHRydWUsIDB4MDAwMEZGRkYsIDB4MDAwMEZGRkYsIHRydWUpLAotICB7LTF9LAotICB7LTF9LAotICB7LTF9LAotICB7LTF9LAotICB7LTF9Ci19OwotCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSAqTkFNRSAoYW91dCwgcmVsb2NfdHlwZV9sb29rdXApICgpOwotCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICBjYXNlIEJGRF9SRUxPQ19USUMzMF9MRFA6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbM107Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbMV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjQ6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbMl07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbNV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gJnRpYzMwX2FvdXRfaG93dG9fdGFibGVbNF07Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotdGljMzBfYW91dF9yZWxvY19ob3d0byAoYWJmZCwgcmVsb2NzLCByX2luZGV4LCByX2V4dGVybiwgcl9wY3JlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWxvY3M7Ci0gICAgIGludCAqcl9pbmRleDsKLSAgICAgaW50ICpyX2V4dGVybjsKLSAgICAgaW50ICpyX3BjcmVsOwotewotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIHVuc2lnbmVkIGludCByX3BjcmVsX2RvbmU7Ci0gIGludCBpbmRleDsKLQotICAqcl9wY3JlbCA9IDA7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgICpyX2luZGV4ID0gKChyZWxvY3MtPnJfaW5kZXhbMF0gPDwgMTYpIHwgKHJlbG9jcy0+cl9pbmRleFsxXSA8PCA4KSB8IHJlbG9jcy0+cl9pbmRleFsyXSk7Ci0gICAgICAqcl9leHRlcm4gPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKLSAgICAgIHJfbGVuZ3RoID0gKChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpyX2luZGV4ID0gKChyZWxvY3MtPnJfaW5kZXhbMl0gPDwgMTYpIHwgKHJlbG9jcy0+cl9pbmRleFsxXSA8PCA4KSB8IHJlbG9jcy0+cl9pbmRleFswXSk7Ci0gICAgICAqcl9leHRlcm4gPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFKSk7Ci0gICAgICByX3BjcmVsX2RvbmUgPSAoMCAhPSAocmVsb2NzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLSAgICAgIHJfbGVuZ3RoID0gKChyZWxvY3MtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUpID4+IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUpOwotICAgIH0KLSAgaW5kZXggPSByX2xlbmd0aCArIDQgKiByX3BjcmVsX2RvbmU7Ci0gIHJldHVybiB0aWMzMF9hb3V0X2hvd3RvX3RhYmxlICsgaW5kZXg7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGNhbGxiYWNrIGZvciAxNi1iaXQgcmVsb2NzLiAgVGhpcyBpcwotICAgcmVxdWlyZWQgZm9yIHJlbG9jYXRpb25zIGJldHdlZW4gc2VnbWVudHMuICBBIGxpbmUgaW4gYW91dHguaAotICAgcmVxdWlyZXMgdGhhdCBhbnkgcmVsb2NhdGlvbnMgZm9yIHRoZSBkYXRhIHNlY3Rpb24gc2hvdWxkIHBvaW50IHRvCi0gICB0aGUgZW5kIG9mIHRoZSBhbGlnbmVkIHRleHQgc2VjdGlvbiwgcGx1cyBhbiBvZmZzZXQuICBCeSBkZWZhdWx0LAotICAgdGhpcyBkb2VzIG5vdCBoYXBwZW4sIHRoZXJlZm9yZSB0aGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YKLSAgIHRoYXQuICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXRpYzMwX2FvdXRfZml4XzE2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wncyBzZWN0aW9uIGlzIGRlZmluZWQuICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX29rIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLSAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzZWN0aW9uIGFuZCB0dXJuIGl0IGludG8gdGhlIFRNUzMyMEMzMAotICAgICAzMi1iaXQgYWRkcmVzcyBmb3JtYXQuICovCi0gIHJlbG9jYXRpb24gPSAoc3ltYm9sLT5zZWN0aW9uLT52bWEgPj4gMik7Ci0gIHJlbG9jYXRpb24gKz0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHJlbG9jYXRpb24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgdGljMzBfYW91dF9maXhfMTYgZXhjZXB0IGZvciAzMgotICAgYml0IHJlbG9jYXRpb25zLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpeF8zMiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB0aGUgc3ltYm9sJ3Mgc2VjdGlvbiBpcyBkZWZpbmVkLiAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24gJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19vayA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0gIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc2VjdGlvbiBhbmQgdHVybiBpdCBpbnRvIHRoZSBUTVMzMjBDMzAKLSAgICAgMzItYml0IGFkZHJlc3MgZm9ybWF0LiAqLwotICByZWxvY2F0aW9uID0gKHN5bWJvbC0+c2VjdGlvbi0+dm1hID4+IDIpOwotICByZWxvY2F0aW9uICs9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY2F0aW9uLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHdvcmsgb3V0IHBjLXJlbGF0aXZlIG9mZnNldHMgZm9yIHRoZQotICAgVE1TMzIwQzMwLiAgVGhlIGRhdGEgYWxyZWFkeSBwbGFjZWQgYnkgbWRfcGNyZWxfZnJvbSB3aXRoaW4gZ2FzIGlzCi0gICB1c2VsZXNzIGZvciBhIHJlbG9jYXRpb24sIHNvIHdlIGp1c3QgZ2V0IHRoZSBvZmZzZXQgdmFsdWUgYW5kIHBsYWNlCi0gICBhIHZlcnNpb24gb2YgdGhpcyB3aXRoaW4gdGhlIG9iamVjdCBjb2RlLgotICAgdGljMzBfYW91dF9maW5hbF9saW5rX3JlbG9jYXRlIHdpbGwgdGhlbiBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkCi0gICByZWxvY2F0aW9uIHRvIGFkZCBvbiB0byB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBjb2RlLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpeF9wY3JlbF8xNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uID0gMTsKLSAgYmZkX2J5dGUgb2Zmc2V0X2RhdGEgPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgLSAxKTsKLQotICAvKiBUaGUgYnl0ZSBiZWZvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXggY29udGFpbnMgYml0cyAyMy0xNiBvZgotICAgICB0aGUgcGNyZWwgaW5zdHJ1Y3Rpb24uICBCaXQgMjEgaXMgc2V0IGZvciBhIGRlbGF5ZWQgaW5zdHJ1Y3Rpb24KLSAgICAgd2hpY2ggcmVxdWlyZXMgb24gb2Zmc2V0IG9mIDMgaW5zdGVhZCBvZiAxLiAqLwotICBpZiAob2Zmc2V0X2RhdGEgJiAweDIwKQotICAgIHJlbG9jYXRpb24gLT0gMzsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gLT0gMTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NhdGlvbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoZXNlIG1hY3JvcyB3aWxsIGdldCAyNC1iaXQgdmFsdWVzIGZyb20gdGhlIGJmZCBkZWZpbml0aW9uLgotICAgQmlnLWVuZGlhbiBvbmx5LiAqLwotI2RlZmluZSBiZmRfZ2V0Yl8yNChCRkQsQUREUikgKGJmZF9nZXRfOChCRkQsQUREUikgPDwgMTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9nZXRfOChCRkQsQUREUisxKSA8PCA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZmRfZ2V0XzgoQkZELEFERFIrMikpCi0KLSNkZWZpbmUgYmZkX3B1dGJfMjQoQkZELERBVEEsQUREUikgYmZkX3B1dF84KEJGRCwoYmZkX2J5dGUpKChEQVRBID4+IDE2KSAmIDB4RkYpLEFERFIpOyBcCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKSgoREFUQSA+PiA4KSAmIDB4RkYpLEFERFIrMSk7IFwKLQkJICAgICAgICAgCQkJCSAgIGJmZF9wdXRfOChCRkQsKGJmZF9ieXRlKShEQVRBICYgMHhGRiksQUREUisyKQotCi0vKiBTZXQgcGFyYW1ldGVycyBhYm91dCB0aGlzIGEub3V0IGZpbGUgdGhhdCBhcmUgbWFjaGluZS1kZXBlbmRlbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gc29tZV9hb3V0X29iamVjdF9wIGp1c3QgYmVmb3JlIGl0IHJldHVybnMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10aWMzMF9hb3V0X2NhbGxiYWNrIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGFyY2hfYWxpZ25fcG93ZXI7Ci0gIHVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbjsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLSAgLyogTm93IHRoYXQgd2Uga25vdyB0aGUgYXJjaGl0ZWN0dXJlLCBzZXQgdGhlIGFsaWdubWVudHMgb2YgdGhlCi0gICAgIHNlY3Rpb25zLiAgVGhpcyBpcyBub3JtYWxseSBkb25lIGJ5IE5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSwKLSAgICAgYnV0IHdoZW4gdGhlIGluaXRpYWwgc2VjdGlvbnMgd2VyZSBjcmVhdGVkIHRoZSBhcmNoaXRlY3R1cmUgaGFkCi0gICAgIG5vdCB5ZXQgYmVlbiBzZXQuICBIb3dldmVyLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2UgZG9uJ3QKLSAgICAgc2V0IHRoZSBhbGlnbm1lbnQgcG93ZXIgYW55IGhpZ2hlciB0aGFuIGFzIHJlcXVpcmVkIGJ5IHRoZSBzaXplCi0gICAgIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYXJjaF9hbGlnbl9wb3dlciA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLSAgYXJjaF9hbGlnbiA9IDEgPDwgYXJjaF9hbGlnbl9wb3dlcjsKLSAgaWYgKChCRkRfQUxJR04gKG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplLCBhcmNoX2FsaWduKQotICAgICAgID09IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplKQotICAgICAgJiYgKEJGRF9BTElHTiAob2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0JICA9PSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSkKLSAgICAgICYmIChCRkRfQUxJR04gKG9ial9ic3NzZWMgKGFiZmQpLT5fcmF3X3NpemUsIGFyY2hfYWxpZ24pCi0JICA9PSBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplKSkKLSAgICB7Ci0gICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGFyY2hfYWxpZ25fcG93ZXI7Ci0gICAgICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gYXJjaF9hbGlnbl9wb3dlcjsKLSAgICB9Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi10aWMzMF9hb3V0X2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCWFkZHJlc3MsIHZhbHVlLCBhZGRlbmQpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIGlmIChhZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7Ci0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JcmVsb2NhdGlvbiAtPSBhZGRyZXNzOwotICAgIH0KLSAgcmV0dXJuIHRpYzMwX2FvdXRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotdGljMzBfYW91dF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci17Ci0gIGJmZF92bWEgeDsKLSAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgeCA9IGJmZF9nZXRiXzI0IChpbnB1dF9iZmQsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIHggPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLSAgICAgIGJmZF92bWEgYWRkOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKLQotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uOwotCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0JICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID49IDApCi0JICAgIHNpZ25lZF9jaGVjayA9IGNoZWNrOwotCSAgZWxzZQotCSAgICBzaWduZWRfY2hlY2sgPSAoY2hlY2sgfCAoKGJmZF92bWEpIC0gMSAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQl9Ci0gICAgICBhZGQgPSB4ICYgaG93dG8tPnNyY19tYXNrOwotICAgICAgc2lnbmVkX2FkZCA9IGFkZDsKLSAgICAgIGlmICgoYWRkICYgKCgofmhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2spKSAhPSAwKQotCXNpZ25lZF9hZGQgLT0gKCgofmhvd3RvLT5zcmNfbWFzaykgPj4gMSkgJiBob3d0by0+c3JjX21hc2spIDw8IDE7Ci0gICAgICBpZiAoaG93dG8tPmJpdHBvcyA9PSAwKQotCXsKLQkgIGNoZWNrICs9IGFkZDsKLQkgIHNpZ25lZF9jaGVjayArPSBzaWduZWRfYWRkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjaGVjayArPSBhZGQgPj4gaG93dG8tPmJpdHBvczsKLQkgIGlmIChzaWduZWRfYWRkID49IDApCi0JICAgIHNpZ25lZF9jaGVjayArPSBhZGQgPj4gaG93dG8tPmJpdHBvczsKLQkgIGVsc2UKLQkgICAgc2lnbmVkX2NoZWNrICs9ICgoYWRkID4+IGhvd3RvLT5iaXRwb3MpIHwgKChiZmRfdm1hKSAtIDEgJiB+KChiZmRfdm1hKSAtIDEgPj4gaG93dG8tPmJpdHBvcykpKTsKLQl9Ci0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICB7Ci0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0JICAgIGlmIChzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4IHx8IHNpZ25lZF9jaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLQkgIHsKLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQkgICAgaWYgKGNoZWNrID4gcmVsb2NfdW5zaWduZWRfbWF4KQotCSAgICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCSAgICBpZiAoKGNoZWNrICYgfnJlbG9jX2JpdHMpICE9IDAgJiYgKCgoYmZkX3ZtYSkgc2lnbmVkX2NoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgYmZkX3B1dGJfMjQgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gb3ZlcmZsb3cgPyBiZmRfcmVsb2Nfb3ZlcmZsb3cgOiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgcmVhZGluZyBvZiBhbiBhLm91dCBmaWxlIGhlYWRlciAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi10aWMzMF9hb3V0X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7CS8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsJLyogQ2xlYW5lZC11cCBleGVjIGhlYWRlciAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLSAgICAgICE9IEVYRUNfQllURVNfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBTV0FQX01BR0lDCi0gIGV4ZWMuYV9pbmZvID0gU1dBUF9NQUdJQyAoZXhlY19ieXRlcy5lX2luZm8pOwotI2Vsc2UKLSAgZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLSNlbmRpZiAvKiBTV0FQX01BR0lDICovCi0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkKLSAgICByZXR1cm4gMDsKLSNpZmRlZiBNQUNIVFlQRV9PSwotICBpZiAoIShNQUNIVFlQRV9PSyAoTl9NQUNIVFlQRSAoZXhlYykpKSkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIE5BTUUgKGFvdXQsIHN3YXBfZXhlY19oZWFkZXJfaW4pIChhYmZkLCAmZXhlY19ieXRlcywgJmV4ZWMpOwotCi0jaWZkZWYgU1dBUF9NQUdJQwotICAvKiBzd2FwX2V4ZWNfaGVhZGVyX2luIHJlYWQgaW4gYV9pbmZvIHdpdGggdGhlIHdyb25nIGJ5dGUgb3JkZXIgKi8KLSAgZXhlYy5hX2luZm8gPSBTV0FQX01BR0lDIChleGVjX2J5dGVzLmVfaW5mbyk7Ci0jZW5kaWYgLyogU1dBUF9NQUdJQyAqLwotCi0gIHRhcmdldCA9IE5BTUUgKGFvdXQsIHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsICZleGVjLCB0aWMzMF9hb3V0X2NhbGxiYWNrKTsKLQotI2lmZGVmIEVOVFJZX0NBTl9CRV9aRVJPCi0gIC8qIFRoZSBORVdTT1MzIGVudHJ5LXBvaW50IGlzL3dhcyAwLCB3aGljaCAoYW1vbmdzdCBvdGhlciBsb3NzYWdlKQotICAgKiBtZWFucyB0aGF0IGl0IGlzbid0IG9idmlvdXMgaWYgRVhFQ19QIHNob3VsZCBiZSBzZXQuCi0gICAqIEFsbCBvZiB0aGUgZm9sbG93aW5nIG11c3QgYmUgdHJ1ZSBmb3IgYW4gZXhlY3V0YWJsZToKLSAgICogVGhlcmUgbXVzdCBiZSBubyByZWxvY2F0aW9ucywgdGhlIGJmZCBjYW4gYmUgbmVpdGhlciBhbgotICAgKiBhcmNoaXZlIG5vciBhbiBhcmNoaXZlIGVsZW1lbnQsIGFuZCB0aGUgZmlsZSBtdXN0IGJlIGV4ZWN1dGFibGUuICovCi0KLSAgaWYgKGV4ZWMuYV90cnNpemUgKyBleGVjLmFfZHJzaXplID09IDAKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0ICYmIGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhdCBidWY7Ci0jaWZuZGVmIFNfSVhVU1IKLSNkZWZpbmUgU19JWFVTUiAwMTAwCQkvKiBFeGVjdXRlIGJ5IG93bmVyLiAgKi8KLSNlbmRpZgotICAgICAgaWYgKHN0YXQgKGFiZmQtPmZpbGVuYW1lLCAmYnVmKSA9PSAwICYmIChidWYuc3RfbW9kZSAmIFNfSVhVU1IpKQotCWFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgICB9Ci0jZW5kaWYgLyogRU5UUllfQ0FOX0JFX1pFUk8gKi8KLQotICByZXR1cm4gdGFyZ2V0OwotfQotCi0vKiBDb3B5IHByaXZhdGUgc2VjdGlvbiBkYXRhLiAgVGhpcyBhY3R1YWxseSBkb2VzIG5vdGhpbmcgd2l0aCB0aGUKLSAgIHNlY3Rpb25zLiAgSXQgY29waWVzIHRoZSBzdWJmb3JtYXQgZmllbGQuICBXZSBjb3B5IGl0IGhlcmUsIGJlY2F1c2UKLSAgIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoaXMgaXMgYSBRTUFHSUMgZmlsZSBiZWZvcmUgd2Ugc2V0IHRoZQotICAgc2VjdGlvbiBjb250ZW50cywgYW5kIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBpcyBub3QgY2FsbGVkIHVudGlsCi0gICBhZnRlciB0aGUgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLSAgICBvYmpfYW91dF9zdWJmb3JtYXQgKG9iZmQpID0gb2JqX2FvdXRfc3ViZm9ybWF0IChpYmZkKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdGljMzBfYW91dF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUgKGFiZmQpOwotI2Vsc2UKLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0jZW5kaWYKLSAgewotICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCi0gICAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gICAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgICBOQU1FIChhb3V0LCBhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotCi0gICAgZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICBleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICBOQU1FIChhb3V0LCBzd2FwX2V4ZWNfaGVhZGVyX291dCkgKGFiZmQsIGV4ZWNwLCAmZXhlY19ieXRlcyk7Ci0KLSAgICBpZiAoYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA+IDApCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSwgYWJmZCkgIT0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLQotICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCi0JJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICAgIHsKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fU1lNT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlpZiAoIU5BTUUgKGFvdXQsIHdyaXRlX3N5bXMpIChhYmZkKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKCFOQU1FIChhb3V0LCBzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fRFJFTE9GRiAoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghTkFNRSAoYW91dCwgc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi10aWMzMF9hb3V0X3NldF9zaXplcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gVEFSR0VUX1BBR0VfU0laRTsKLQotI2lmZGVmIFNFR01FTlRfU0laRQotICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotI2Vsc2UKLSAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IFRBUkdFVF9QQUdFX1NJWkU7Ci0jZW5kaWYKLQotI2lmZGVmIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUKLSAgYWRhdGEgKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBaTUFHSUNfRElTS19CTE9DS19TSVpFOwotI2Vsc2UKLSAgYWRhdGEgKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotI2VuZGlmCi0KLSAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmbmRlZiBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0KLS8qIENhbGxiYWNrIGZvciB0aGUgZmluYWxfbGluayByb3V0aW5lIHRvIHNldCB0aGUgc2VjdGlvbiBvZmZzZXRzLiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotCi1zdGF0aWMgdm9pZAotTVlfZmluYWxfbGlua19jYWxsYmFjayAoYWJmZCwgcHRyZWxvZmYsIHBkcmVsb2ZmLCBwc3ltb2ZmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZpbGVfcHRyICpwdHJlbG9mZjsKLSAgICAgZmlsZV9wdHIgKnBkcmVsb2ZmOwotICAgICBmaWxlX3B0ciAqcHN5bW9mZjsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gICpwdHJlbG9mZiA9IG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyArIGV4ZWNwLT5hX2RhdGE7Ci0gICpwZHJlbG9mZiA9ICpwdHJlbG9mZiArIGV4ZWNwLT5hX3Ryc2l6ZTsKLSAgKnBzeW1vZmYgPSAqcGRyZWxvZmYgKyBleGVjcC0+YV9kcnNpemU7OwotfQotCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfZmluYWxfbGluawotCi0vKiBGaW5hbCBsaW5rIHJvdXRpbmUuICBXZSBuZWVkIHRvIHVzZSBhIGNhbGwgYmFjayB0byBnZXQgdGhlIGNvcnJlY3QKLSAgIG9mZnNldHMgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU1ZX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGZpbGVfcHRyIHBvczsKLSAgYmZkX3ZtYSB2bWEgPSAwOwotICBpbnQgcGFkOwotCi0gIC8qIFNldCB0aGUgZXhlY3V0YWJsZSBoZWFkZXIgc2l6ZSB0byAwLCBhcyB3ZSBkb24ndCB3YW50IG9uZSBmb3IgYW4KLSAgICAgb3V0cHV0LiAqLwotICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gMDsKLSAgcG9zID0gYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgLyogVGV4dC4gICovCi0gIHZtYSA9IGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT52bWE7Ci0gIHBvcyArPSB2bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSB2bWE7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLSAgcG9zICs9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogRGF0YS4gICovCi0gIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCi0gICAgewotICAgICAgaWYgKGluZm8tPmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uLT5uZXh0LT52bWEgPiAwKQotCW9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gaW5mby0+Y3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24tPm5leHQtPnZtYTsKLSAgICAgIGVsc2UKLQlvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCA0KTsKLSAgICB9Ci0gIGlmIChvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA8IHZtYSkKLSAgICB7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCA0KTsKLSAgICB9Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dXNlcl9zZXRfdm1hID0gMTsKLSAgdm1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IHZtYSArIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGV4ZWNwLT5hX3RleHQgPSB2bWEgLSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV90ZXh0OwotCi0gIC8qIFNpbmNlIEJTUyBmb2xsb3dzIGRhdGEgaW1tZWRpYXRlbHksIHNlZSBpZiBpdCBuZWVkcyBhbGlnbm1lbnQuICAqLwotICB2bWEgKz0gb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHBhZCA9IGFsaWduX3Bvd2VyICh2bWEsIG9ial9ic3NzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gIHBvcyArPSBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIEJTUy4gICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSB2bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT51c2VyX3NldF92bWEgPSAxOwotCi0gIC8qIFdlIGFyZSBmdWxseSByZXNpemVkLCBzbyBkb24ndCByZWFkanVzdCBpbiBmaW5hbF9saW5rLiAqLwotICBhZGF0YSAoYWJmZCkubWFnaWMgPSB6X21hZ2ljOwotCi0gIHJldHVybiBOQU1FIChhb3V0LCBmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNlbmRpZgotCi1lbnVtIG1hY2hpbmVfdHlwZQotdGljMzBfYW91dF9tYWNoaW5lX3R5cGUgKGFyY2gsIG1hY2hpbmUsIHVua25vd24pCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci0gICAgIGJvb2xlYW4gKnVua25vd247Ci17Ci0gIGVudW0gbWFjaGluZV90eXBlIGFyY2hfZmxhZ3M7Ci0KLSAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgKnVua25vd24gPSB0cnVlOwotCi0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgICp1bmtub3duID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgICB9Ci0gIGlmIChhcmNoX2ZsYWdzICE9IE1fVU5LTk9XTikKLSAgICAqdW5rbm93biA9IGZhbHNlOwotICByZXR1cm4gYXJjaF9mbGFnczsKLX0KLQotYm9vbGVhbgotdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGlmICghYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdW5rbm93bjsKLSAgICAgIHRpYzMwX2FvdXRfbWFjaGluZV90eXBlIChhcmNoLCBtYWNoaW5lLCAmdW5rbm93bik7Ci0gICAgICBpZiAodW5rbm93bikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgcmV0dXJuICgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5zZXRfc2l6ZXMpIChhYmZkKTsKLX0KLQotLyogV2UgYXNzdW1lIEJGRCBnZW5lcmljIGFyY2hpdmUgZmlsZXMuICAqLwotI2lmbmRlZglNWV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUJTVlfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgTVlfZ2V0X2VsdF9hdF9pbmRleAkJX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNlbmRpZgotI2lmbmRlZglNWV9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUJTVlfZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9hcm1hcAotI2RlZmluZQlNWV9zbHVycF9hcm1hcAkJCWJmZF9zbHVycF9ic2RfYXJtYXAKLSNlbmRpZgotI2lmbmRlZglNWV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lCU1ZX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgTVlfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZW5kaWYKLSNpZm5kZWYJTVlfd3JpdGVfYXJtYXAKLSNkZWZpbmUJTVlfd3JpdGVfYXJtYXAJCWJzZF93cml0ZV9hcm1hcAotI2VuZGlmCi0jaWZuZGVmIE1ZX3JlYWRfYXJfaGRyCi0jZGVmaW5lIE1ZX3JlYWRfYXJfaGRyCQlfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNlbmRpZgotI2lmbmRlZglNWV90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUJTVlfdHJ1bmNhdGVfYXJuYW1lCQliZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2VuZGlmCi0jaWZuZGVmIE1ZX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNkZWZpbmUgTVlfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAKLSNlbmRpZgotCi0vKiBObyBjb3JlIGZpbGUgZGVmaW5lZCBoZXJlIC0tIGNvbmZpZ3VyZSBpbiB0cmFkLWNvcmUuYyBzZXBhcmF0ZWx5LiAgKi8KLSNpZm5kZWYJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNlbmRpZgotI2lmbmRlZglNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AJXAotCQkJCV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2VuZGlmCi0jaWZuZGVmCU1ZX2NvcmVfZmlsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wCQlfYmZkX2R1bW15X3RhcmdldAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fc3RhcnQJCWJmZF92b2lkCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX2RlYnVnX2luZm9fZW5kCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2VuZAkJYmZkX3ZvaWQKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCosIHN0cnVjdCBzZWMgKikpKSBiZmRfdm9pZAotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIE5BTUUoYW91dCxjb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgTkFNRShhb3V0LGNvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIE5BTUUoYW91dCxjb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApCi0jZW5kaWYKLSNpZm5kZWYgTVlfc2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2V0X3NlY3Rpb25fY29udGVudHMgTkFNRShhb3V0LHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSNlbmRpZgotI2lmbmRlZiBNWV9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIE1ZX25ld19zZWN0aW9uX2hvb2sgTkFNRShhb3V0LG5ld19zZWN0aW9uX2hvb2spCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBOQU1FKGFvdXQsZ2V0X3N5bXRhYikKLSNlbmRpZgotI2lmbmRlZiBNWV9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIE5BTUUoYW91dCxnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZW5kaWYKLSNpZm5kZWYgTVlfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBOQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKQotI2VuZGlmCi0jaWZuZGVmIE1ZX21ha2VfZW1wdHlfc3ltYm9sCi0jZGVmaW5lIE1ZX21ha2VfZW1wdHlfc3ltYm9sIE5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkKLSNlbmRpZgotI2lmbmRlZiBNWV9wcmludF9zeW1ib2wKLSNkZWZpbmUgTVlfcHJpbnRfc3ltYm9sIE5BTUUoYW91dCxwcmludF9zeW1ib2wpCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIE1ZX2dldF9zeW1ib2xfaW5mbyBOQU1FKGFvdXQsZ2V0X3N5bWJvbF9pbmZvKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2dldF9saW5lbm8KLSNkZWZpbmUgTVlfZ2V0X2xpbmVubyBOQU1FKGFvdXQsZ2V0X2xpbmVubykKLSNlbmRpZgotI2lmbmRlZiBNWV9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIE1ZX3NldF9hcmNoX21hY2ggdGljMzBfYW91dF9zZXRfYXJjaF9tYWNoCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgTVlfZmluZF9uZWFyZXN0X2xpbmUgTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotI2VuZGlmCi0jaWZuZGVmIE1ZX3NpemVvZl9oZWFkZXJzCi0jZGVmaW5lIE1ZX3NpemVvZl9oZWFkZXJzIE5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIE1ZX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLSNpZm5kZWYgTVlfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBNWV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHRpYzMwX2FvdXRfcmVsb2NfdHlwZV9sb29rdXAKLSNlbmRpZgotI2lmbmRlZiBNWV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgTVlfYmZkX21ha2VfZGVidWdfc3ltYm9sIDAKLSNlbmRpZgotI2lmbmRlZiBNWV9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIE1ZX3JlYWRfbWluaXN5bWJvbHMgTkFNRShhb3V0LHJlYWRfbWluaXN5bWJvbHMpCi0jZW5kaWYKLSNpZm5kZWYgTVlfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgTVlfbWluaXN5bWJvbF90b19zeW1ib2wgTkFNRShhb3V0LG1pbmlzeW1ib2xfdG9fc3ltYm9sKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIE5BTUUoYW91dCxsaW5rX2hhc2hfdGFibGVfY3JlYXRlKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIE5BTUUoYW91dCxsaW5rX2FkZF9zeW1ib2xzKQotI2VuZGlmCi0jaWZuZGVmIE1ZX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgTVlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLQotI2lmbmRlZiBNWV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIE1ZX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBNWV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBNWV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBNWV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgTVlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8gTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgTVlfY2xvc2VfYW5kX2NsZWFudXAgTVlfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNlbmRpZgotI2lmbmRlZiBNWV9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiCi0jZW5kaWYKLSNpZm5kZWYgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgXAotICBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jaWZuZGVmIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNlbmRpZgotCi0vKiBBb3V0IHN5bWJvbHMgbm9ybWFsbHkgaGF2ZSBsZWFkaW5nIHVuZGVyc2NvcmVzICovCi0jaWZuZGVmIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLSNlbmRpZgotCi0vKiBBb3V0IGFyY2hpdmVzIG5vcm1hbGx5IHVzZSBzcGFjZXMgZm9yIHBhZGRpbmcgKi8KLSNpZm5kZWYgQVJfUEFEX0NIQVIKLSNkZWZpbmUgQVJfUEFEX0NIQVIgJyAnCi0jZW5kaWYKLQotI2lmbmRlZiBNWV9CRkRfVEFSR0VUCi1jb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2FvdXRfdmVjID0KLXsKLSAgVEFSR0VUTkFNRSwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwJCQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgQVJfUEFEX0NIQVIsCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsIE1ZX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAge2JmZF9mYWxzZSwgTVlfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBNWV93cml0ZV9vYmplY3RfY29udGVudHMsCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoTVkpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChNWSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKE1ZKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoTVkpLAotCi0gIChQVFIpIE1ZX2JhY2tlbmRfZGF0YSwKLX07Ci0jZW5kaWYgLyogTVlfQkZEX1RBUkdFVCAqLwpkaWZmIC0tZ2l0IGEvYmZkL2FvdXQwLmMgYi9iZmQvYW91dDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjN2FlMC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDAuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBTdW5PUyBzdHlsZSBhLm91dCB3aXRoIGZsYWdzIHNldCB0byAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtemVyby1iaWciCi0jZGVmaW5lIE1ZKE9QKSBDQVQoYW91dDBfYmlnXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDAKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgXAotICAoKG10eXBlKSA9PSBNX1VOS05PV04gfHwgKG10eXBlKSA9PSBNXzY4MDEwIHx8IChtdHlwZSkgPT0gTV82ODAyMCkKLQotLyogSW5jbHVkZSB0aGUgdXN1YWwgYS5vdXQgc3VwcG9ydC4gICovCi0jaW5jbHVkZSAiYW91dGYxLmgiCmRpZmYgLS1naXQgYS9iZmQvYW91dDMyLmMgYi9iZmQvYW91dDMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzQwYjQuLjAwMDAwMDAKLS0tIGEvYmZkL2FvdXQzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciAzMi1iaXQgYS5vdXQgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0NjQuYyBiL2JmZC9hb3V0NjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQwMzZjOC4uMDAwMDAwMAotLS0gYS9iZmQvYW91dDY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIDY0LWJpdCBhLm91dCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2lmbmRlZiBCTUFHSUMKLSNkZWZpbmUgQk1BR0lDIDAKLSNlbmRpZgotI2lmbmRlZiBRTUFHSUMKLSNkZWZpbmUgUU1BR0lDIDAKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW91dHguaCIKZGlmZiAtLWdpdCBhL2JmZC9hb3V0ZjEuaCBiL2JmZC9hb3V0ZjEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmOTViNS4uMDAwMDAwMAotLS0gYS9iZmQvYW91dGYxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NTkgKzAsMCBAQAotLyogQS5vdXQgImZvcm1hdCAxIiBmaWxlIGhhbmRsaW5nIGNvZGUgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3VuNC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIJCS8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotLyogVGhpcyBpcyBuZWVkZWQgdG8gcmVqZWN0IGEgTmV3c09TIGZpbGUsIGUuZy4gaW4KLSAgIGdkYi90ZXN0c3VpdGUvZ2RiLnQxMC9jcm9zc2xvYWQuZXhwLiA8a2luZ2RvbkBjeWdudXMuY29tPgotICAgSSBuZWVkZWQgdG8gYWRkIE1fVU5LTk9XTiB0byByZWNvZ25pemUgYSA2ODAwMCBvYmplY3QsIHNvIHRoaXMgd2lsbAotICAgcHJvYmFibHkgbm8gbG9uZ2VyIHJlamVjdCBhIE5ld3NPUyBvYmplY3QuICA8aWFuQGN5Z251cy5jb20+LiAqLwotI2lmbmRlZiBNQUNIVFlQRV9PSwotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgXAotICAoKChtdHlwZSkgPT0gTV9TUEFSQyAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX3NwYXJjLCAwKSAhPSBOVUxMKSBcCi0gICB8fCAoKChtdHlwZSkgPT0gTV9VTktOT1dOIHx8IChtdHlwZSkgPT0gTV82ODAxMCB8fCAobXR5cGUpID09IE1fNjgwMjApIFwKLSAgICAgICAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX202OGssIDApICE9IE5VTEwpKQotI2VuZGlmCi0KLS8qCi1UaGUgZmlsZSBAY29kZXthb3V0ZjEuaH0gY29udGFpbnMgdGhlIGNvZGUgZm9yIEJGRCdzCi1hLm91dCBiYWNrIGVuZC4gQ29udHJvbCBvdmVyIHRoZSBnZW5lcmF0ZWQgYmFjayBlbmQgaXMgZ2l2ZW4gYnkgdGhlc2UKLXR3byBwcmVwcm9jZXNzb3IgbmFtZXM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIEFSQ0hfU0laRQotVGhpcyB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIDMyIG9yIDY0LCBkZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSBvZiBhbgotaW50IGluIHRoZSB0YXJnZXQgZm9ybWF0LiBJdCBjaGFuZ2VzIHRoZSBzaXplcyBvZiB0aGUgc3RydWN0cyB3aGljaAotcGVyZm9ybSB0aGUgbWVtb3J5L2Rpc2sgbWFwcGluZyBvZiBzdHJ1Y3R1cmVzLgotCi1UaGUgNjQgYml0IGJhY2tlbmQgbWF5IG9ubHkgYmUgdXNlZCBpZiB0aGUgaG9zdCBjb21waWxlciBzdXBwb3J0cyA2NAotaW50cyAoZWcgbG9uZyBsb25nIHdpdGggZ2NjKSwgYnkgZGVmaW5pbmcgdGhlIG5hbWUgQGNvZGV7QkZEX0hPU1RfNjRfQklUfSBpbiBAY29kZXtiZmQuaH0uCi1XaXRoIHRoaXMgbmFtZSBkZWZpbmVkLCBAZW1waHthbGx9IGJmZCBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgd2l0aCA2NGJpdAotYXJpdGhtZXRpYywgbm90IGp1c3QgdGhvc2UgdG8gYSA2NGJpdCB0YXJnZXQuCi0KLUBpdGVtIFRBUkdFVE5BTUUKLVRoZSBuYW1lIHB1dCBpbnRvIHRoZSB0YXJnZXQgdmVjdG9yLgotQGl0ZW0KLUBlbmQgdGFibGUKLQotKi8KLQotLypTVVBQUkVTUzU1OCovCi0vKlNVUFBSRVNTNTI5Ki8KLQotI2lmIEFSQ0hfU0laRSA9PSA2NAotI2RlZmluZSBzdW5vc19zZXRfYXJjaF9tYWNoIHN1bm9zXzY0X3NldF9hcmNoX21hY2gKLSNkZWZpbmUgc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGFvdXRfNjRfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cwotI2Vsc2UKLSNkZWZpbmUgc3Vub3Nfc2V0X2FyY2hfbWFjaCBzdW5vc18zMl9zZXRfYXJjaF9tYWNoCi0jZGVmaW5lIHN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyBhb3V0XzMyX3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBzdW5vc19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgc3Vub3Nfc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBjaG9vc2VfcmVsb2Nfc2l6ZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3Vub3M0X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zNF9zZXRfc2l6ZXMgUEFSQU1TICgoYmZkICopKTsKLQotLyogTWVyZ2UgYmFja2VuZCBkYXRhIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyBuZWNlc3Nhcnkgb24gc3BhcmNsZXQtYW91dCB3aGVyZSB3ZSB3YW50IHRoZSByZXN1bHRhbnQgbWFjaGluZQotICAgbnVtYmVyIHRvIGJlIE1fU1BBUkNMRVQgaWYgYW55IGlucHV0IGZpbGUgaXMgTV9TUEFSQ0xFVC4gICovCi0KLSNkZWZpbmUgTVlfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkLCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2FyY2hfc3BhcmMpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPCBiZmRfZ2V0X21hY2ggKGliZmQpKQotCWJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfYXJjaF9zcGFyYywgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGVpdGhlciBzdW5vc18zMl9zZXRfYXJjaF9tYWNoIG9yIHN1bm9zXzY0X3NldF9hcmNoX21hY2gsCi0gICBkZXBlbmRpbmcgdXBvbiBBUkNIX1NJWkUuICAqLwotCi1zdGF0aWMgdm9pZAotc3Vub3Nfc2V0X2FyY2hfbWFjaCAoYWJmZCwgbWFjaHR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG1hY2h0eXBlOwotewotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICBsb25nIG1hY2hpbmU7Ci0gIHN3aXRjaCAobWFjaHR5cGUpCi0gICAgewotCi0gICAgY2FzZSBNX1VOS05PV046Ci0gICAgICAvKiBTb21lIFN1bjNzIG1ha2UgbWFnaWMgbnVtYmVycyB3aXRob3V0IGNwdSB0eXBlcyBpbiB0aGVtLCBzbwotCSB3ZSdsbCBkZWZhdWx0IHRvIHRoZSA2ODAwMC4gKi8KLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzY4MDEwOgotICAgIGNhc2UgTV9IUDIwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNXzY4MDIwOgotICAgIGNhc2UgTV9IUDMwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAyMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NQQVJDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3NwYXJjOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQ0xFVDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NQQVJDTElURV9MRToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV8zODY6Ci0gICAgY2FzZSBNXzM4Nl9EWU5JWDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pMzg2OwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV8yOUs6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfYTI5azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fSFBVWDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChBQkZELCBFWEVDKSBcCi0gIE5BTUUoc3Vub3Msc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIGNob29zZV9yZWxvY19zaXplKEFCRkQpOwotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZSBpbiBTdW5PUyBmb3JtYXQuICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUKLSAgIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQKLSAgIHJlbG9jYXRpb24uICBUaGUgcmVhbCBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgZWl0aGVyCi0gICBhb3V0XzY0X3N1bm9zNF93cml0ZV9vYmplY3RfY29udGVudHMgb3IKLSAgIGFvdXRfMzJfc3Vub3M0X3dyaXRlX29iamVjdF9jb250ZW50cywgZGVwZW5kaW5nIHVwb24gQVJDSF9TSVpFLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMDA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1VOS05PV04pOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDEwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQ6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDTEVUKTsKLQkgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlOgotCSAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9TUEFSQ0xJVEVfTEUpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkMpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8zODYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9hMjlrOgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV8yOUspOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gICAgfQotCi0gIGNob29zZV9yZWxvY19zaXplIChhYmZkKTsKLQotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLQotICBOX1NFVF9EWU5BTUlDICgqZXhlY3AsIGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKTsKLQotICBXUklURV9IRUFERVJTIChhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBjb3JlIGZpbGVzICovCi0KLSNkZWZpbmUgQ09SRV9NQUdJQyAweDA4MDQ1NgotI2RlZmluZSBDT1JFX05BTUVMRU4gMTYKLQotLyogVGhlIGNvcmUgc3RydWN0dXJlIGlzIHRha2VuIGZyb20gdGhlIFN1biBkb2N1bWVudGF0aW9uLgotICBVbmZvcnR1bmF0ZWx5LCB0aGV5IGRvbid0IGRvY3VtZW50IHRoZSBGUEEgc3RydWN0dXJlLCBvciBhdCBsZWFzdCBJCi0gIGNhbid0IGZpbmQgaXQgZWFzaWx5LiAgRm9ydHVuYXRlbHkgdGhlIGNvcmUgaGVhZGVyIGNvbnRhaW5zIGl0cyBvd24KLSAgbGVuZ3RoLiAgU28gdGhpcyBzaG91bGRuJ3QgY2F1c2UgcHJvYmxlbXMsIGV4Y2VwdCBmb3IgY191Y29kZSwgd2hpY2gKLSAgc28gZmFyIHdlIGRvbid0IHVzZSBidXQgaXMgZWFzeSB0byBmaW5kIHdpdGggYSBsaXR0bGUgYXJpdGhtZXRpYy4gKi8KLQotLyogQnV0IHRoZSByZWcgc3RydWN0dXJlIGNhbiBiZSBnb3R0ZW4gZnJvbSB0aGUgU1BBUkMgcHJvY2Vzc29yIGhhbmRib29rLgotICBUaGlzIHJlYWxseSBzaG91bGQgYmUgaW4gYSBHTlUgaW5jbHVkZSBmaWxlIHRob3VnaCBzbyB0aGF0IGdkYiBjYW4gdXNlCi0gIHRoZSBzYW1lIGluZm8uICovCi1zdHJ1Y3QgcmVncwotewotICBpbnQgcl9wc3I7Ci0gIGludCByX3BjOwotICBpbnQgcl9ucGM7Ci0gIGludCByX3k7Ci0gIGludCByX2cxOwotICBpbnQgcl9nMjsKLSAgaW50IHJfZzM7Ci0gIGludCByX2c0OwotICBpbnQgcl9nNTsKLSAgaW50IHJfZzY7Ci0gIGludCByX2c3OwotICBpbnQgcl9vMDsKLSAgaW50IHJfbzE7Ci0gIGludCByX28yOwotICBpbnQgcl9vMzsKLSAgaW50IHJfbzQ7Ci0gIGludCByX281OwotICBpbnQgcl9vNjsKLSAgaW50IHJfbzc7Ci19OwotCi0vKiBUYWtlbiBmcm9tIFN1biBkb2N1bWVudGF0aW9uOiAqLwotCi0vKiBGSVhNRTogIEl0J3Mgd29yc2UgdGhhbiB3ZSBleHBlY3QuICBUaGlzIHN0cnVjdCBjb250YWlucyBUV08gc3Vic3RydWN0cwotICBuZWl0aGVyIG9mIHdob3NlIHNpemUgd2Uga25vdywgV0lUSCBTVFVGRiBJTiBCRVRXRUVOIFRIRU0hICBXZSBjYW4ndAotICBldmVuIHBvcnRhYmx5IGFjY2VzcyB0aGUgc3R1ZmYgaW4gYmV0d2VlbiEgICovCi0KLXN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlCi0gIHsKLSAgICBpbnQgY19tYWdpYzsJCS8qIENvcmVmaWxlIG1hZ2ljIG51bWJlciAqLwotICAgIGludCBjX2xlbjsJCQkvKiBTaXplb2YgKHN0cnVjdCBjb3JlKSAqLwotI2RlZmluZQlTUEFSQ19DT1JFX0xFTgk0MzIKLSAgICBpbnQgY19yZWdzWzE5XTsJCS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgLS0gTUFDSERFUCBTSVpFICovCi0gICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgY19hb3V0aGRyOwkvKiBBLm91dCBoZWFkZXIgKi8KLSAgICBpbnQgY19zaWdubzsJCS8qIEtpbGxpbmcgc2lnbmFsLCBpZiBhbnkgKi8KLSAgICBpbnQgY190c2l6ZTsJCS8qIFRleHQgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfZHNpemU7CQkvKiBEYXRhIHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX3NzaXplOwkJLyogU3RhY2sgc2l6ZSAoYnl0ZXMpICovCi0gICAgY2hhciBjX2NtZG5hbWVbQ09SRV9OQU1FTEVOICsgMV07CS8qIENvbW1hbmQgbmFtZSAqLwotICAgIGRvdWJsZSBmcF9zdHVmZlsxXTsJCS8qIGV4dGVybmFsIEZQVSBzdGF0ZSAoc2l6ZSB1bmtub3duIGJ5IHVzKSAqLwotICAgIC8qIFRoZSB0eXBlICJkb3VibGUiIGlzIGNyaXRpY2FsIGhlcmUsIGZvciBhbGlnbm1lbnQuCi0gICAgU3VuT1MgZGVjbGFyZXMgYSBzdHJ1Y3QgaGVyZSwgYnV0IHRoZSBzdHJ1Y3QncyBhbGlnbm1lbnQKLSAgICAgIGlzIGRvdWJsZSBzaW5jZSBpdCBjb250YWlucyBkb3VibGVzLiAgKi8KLSAgICBpbnQgY191Y29kZTsJCS8qIEV4Y2VwdGlvbiBuby4gZnJvbSB1X2NvZGUgKi8KLSAgICAvKiAodGhpcyBtZW1iZXIgaXMgbm90IGFjY2Vzc2libGUgYnkgbmFtZSBzaW5jZSB3ZSBkb24ndAotICAgIHBvcnRhYmx5IGtub3cgdGhlIHNpemUgb2YgZnBfc3R1ZmYuKSAqLwotICB9OwotCi0vKiBDb3JlIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUgQkNQICh0aGUgcGFydCBvZiBTb2xhcmlzIHdoaWNoIGFsbG93cwotICAgaXQgdG8gcnVuIFN1bk9TNCBhLm91dCBmaWxlcykuICAqLwotc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUKLSAgewotICAgIGludCBjX21hZ2ljOwkJLyogQ29yZWZpbGUgbWFnaWMgbnVtYmVyICovCi0gICAgaW50IGNfbGVuOwkJCS8qIFNpemVvZiAoc3RydWN0IGNvcmUpICovCi0jZGVmaW5lCVNPTEFSSVNfQkNQX0NPUkVfTEVOCTQ1NgotICAgIGludCBjX3JlZ3NbMTldOwkJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAtLSBNQUNIREVQIFNJWkUgKi8KLSAgICBpbnQgY19leGRhdGFfdnA7CQkvKiBleGRhdGEgc3RydWN0dXJlICovCi0gICAgaW50IGNfZXhkYXRhX3RzaXplOwotICAgIGludCBjX2V4ZGF0YV9kc2l6ZTsKLSAgICBpbnQgY19leGRhdGFfYnNpemU7Ci0gICAgaW50IGNfZXhkYXRhX2xzaXplOwotICAgIGludCBjX2V4ZGF0YV9uc2hsaWJzOwotICAgIHNob3J0IGNfZXhkYXRhX21hY2g7Ci0gICAgc2hvcnQgY19leGRhdGFfbWFnOwotICAgIGludCBjX2V4ZGF0YV90b2Zmc2V0OwotICAgIGludCBjX2V4ZGF0YV9kb2Zmc2V0OwotICAgIGludCBjX2V4ZGF0YV9sb2Zmc2V0OwotICAgIGludCBjX2V4ZGF0YV90eHRvcmc7Ci0gICAgaW50IGNfZXhkYXRhX2RhdG9yZzsKLSAgICBpbnQgY19leGRhdGFfZW50bG9jOwotICAgIGludCBjX3NpZ25vOwkJLyogS2lsbGluZyBzaWduYWwsIGlmIGFueSAqLwotICAgIGludCBjX3RzaXplOwkJLyogVGV4dCBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19kc2l6ZTsJCS8qIERhdGEgc2l6ZSAoYnl0ZXMpICovCi0gICAgaW50IGNfc3NpemU7CQkvKiBTdGFjayBzaXplIChieXRlcykgKi8KLSAgICBjaGFyIGNfY21kbmFtZVtDT1JFX05BTUVMRU4gKyAxXTsJLyogQ29tbWFuZCBuYW1lICovCi0gICAgZG91YmxlIGZwX3N0dWZmWzFdOwkJLyogZXh0ZXJuYWwgRlBVIHN0YXRlIChzaXplIHVua25vd24gYnkgdXMpICovCi0gICAgLyogVGhlIHR5cGUgImRvdWJsZSIgaXMgY3JpdGljYWwgaGVyZSwgZm9yIGFsaWdubWVudC4KLSAgICBTdW5PUyBkZWNsYXJlcyBhIHN0cnVjdCBoZXJlLCBidXQgdGhlIHN0cnVjdCdzIGFsaWdubWVudAotICAgICAgaXMgZG91YmxlIHNpbmNlIGl0IGNvbnRhaW5zIGRvdWJsZXMuICAqLwotICAgIGludCBjX3Vjb2RlOwkJLyogRXhjZXB0aW9uIG5vLiBmcm9tIHVfY29kZSAqLwotICAgIC8qICh0aGlzIG1lbWJlciBpcyBub3QgYWNjZXNzaWJsZSBieSBuYW1lIHNpbmNlIHdlIGRvbid0Ci0gICAgcG9ydGFibHkga25vdyB0aGUgc2l6ZSBvZiBmcF9zdHVmZi4pICovCi0gIH07Ci0KLXN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUKLSAgewotICAgIGludCBjX21hZ2ljOwkJLyogQ29yZWZpbGUgbWFnaWMgbnVtYmVyICovCi0gICAgaW50IGNfbGVuOwkJCS8qIFNpemVvZiAoc3RydWN0IGNvcmUpICovCi0jZGVmaW5lCVNVTjNfQ09SRV9MRU4JODI2CS8qIEFzIG9mIFN1bk9TIDQuMS4xICovCi0gICAgaW50IGNfcmVnc1sxOF07CQkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIC0tIE1BQ0hERVAgU0laRSAqLwotICAgIHN0cnVjdCBleHRlcm5hbF9leGVjIGNfYW91dGhkcjsJLyogQS5vdXQgaGVhZGVyICovCi0gICAgaW50IGNfc2lnbm87CQkvKiBLaWxsaW5nIHNpZ25hbCwgaWYgYW55ICovCi0gICAgaW50IGNfdHNpemU7CQkvKiBUZXh0IHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX2RzaXplOwkJLyogRGF0YSBzaXplIChieXRlcykgKi8KLSAgICBpbnQgY19zc2l6ZTsJCS8qIFN0YWNrIHNpemUgKGJ5dGVzKSAqLwotICAgIGNoYXIgY19jbWRuYW1lW0NPUkVfTkFNRUxFTiArIDFdOwkvKiBDb21tYW5kIG5hbWUgKi8KLSAgICBkb3VibGUgZnBfc3R1ZmZbMV07CQkvKiBleHRlcm5hbCBGUFUgc3RhdGUgKHNpemUgdW5rbm93biBieSB1cykgKi8KLSAgICAvKiBUaGUgdHlwZSAiZG91YmxlIiBpcyBjcml0aWNhbCBoZXJlLCBmb3IgYWxpZ25tZW50LgotICAgIFN1bk9TIGRlY2xhcmVzIGEgc3RydWN0IGhlcmUsIGJ1dCB0aGUgc3RydWN0J3MgYWxpZ25tZW50Ci0gICAgICBpcyBkb3VibGUgc2luY2UgaXQgY29udGFpbnMgZG91Ymxlcy4gICovCi0gICAgaW50IGNfdWNvZGU7CQkvKiBFeGNlcHRpb24gbm8uIGZyb20gdV9jb2RlICovCi0gICAgLyogKHRoaXMgbWVtYmVyIGlzIG5vdCBhY2Nlc3NpYmxlIGJ5IG5hbWUgc2luY2Ugd2UgZG9uJ3QKLSAgICBwb3J0YWJseSBrbm93IHRoZSBzaXplIG9mIGZwX3N0dWZmLikgKi8KLSAgfTsKLQotc3RydWN0IGludGVybmFsX3N1bm9zX2NvcmUKLSAgewotICAgIGludCBjX21hZ2ljOwkJLyogQ29yZWZpbGUgbWFnaWMgbnVtYmVyICovCi0gICAgaW50IGNfbGVuOwkJCS8qIFNpemVvZiAoc3RydWN0IGNvcmUpICovCi0gICAgbG9uZyBjX3JlZ3NfcG9zOwkJLyogZmlsZSBvZmZzZXQgb2YgR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwotICAgIGludCBjX3JlZ3Nfc2l6ZTsJCS8qIHNpemUgb2YgR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGNfYW91dGhkcjsJLyogQS5vdXQgaGVhZGVyICovCi0gICAgaW50IGNfc2lnbm87CQkvKiBLaWxsaW5nIHNpZ25hbCwgaWYgYW55ICovCi0gICAgaW50IGNfdHNpemU7CQkvKiBUZXh0IHNpemUgKGJ5dGVzKSAqLwotICAgIGludCBjX2RzaXplOwkJLyogRGF0YSBzaXplIChieXRlcykgKi8KLSAgICBiZmRfdm1hIGNfZGF0YV9hZGRyOwkvKiBEYXRhIHN0YXJ0IChhZGRyZXNzKSAqLwotICAgIGludCBjX3NzaXplOwkJLyogU3RhY2sgc2l6ZSAoYnl0ZXMpICovCi0gICAgYmZkX3ZtYSBjX3N0YWNrdG9wOwkJLyogU3RhY2sgdG9wIChhZGRyZXNzKSAqLwotICAgIGNoYXIgY19jbWRuYW1lW0NPUkVfTkFNRUxFTiArIDFdOwkvKiBDb21tYW5kIG5hbWUgKi8KLSAgICBsb25nIGZwX3N0dWZmX3BvczsJCS8qIGZpbGUgb2Zmc2V0IG9mIGV4dGVybmFsIEZQVSBzdGF0ZSAocmVncykgKi8KLSAgICBpbnQgZnBfc3R1ZmZfc2l6ZTsJCS8qIFNpemUgb2YgaXQgKi8KLSAgICBpbnQgY191Y29kZTsJCS8qIEV4Y2VwdGlvbiBuby4gZnJvbSB1X2NvZGUgKi8KLSAgfTsKLQotc3RhdGljIHZvaWQgc3dhcGNvcmVfc3VuMwotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwY29yZV9zcGFyYwotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwY29yZV9zb2xhcmlzX2JjcAotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqKSk7Ci0KLS8qIGJ5dGUtc3dhcCBpbiB0aGUgU3VuLTMgY29yZSBzdHJ1Y3R1cmUgKi8KLXN0YXRpYyB2b2lkCi1zd2FwY29yZV9zdW4zIChhYmZkLCBleHQsIGludGNvcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqZXh0OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqaW50Y29yZTsKLXsKLSAgc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqZXh0Y29yZSA9IChzdHJ1Y3QgZXh0ZXJuYWxfc3VuM19jb3JlICopIGV4dDsKLQotICBpbnRjb3JlLT5jX21hZ2ljID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19tYWdpYyk7Ci0gIGludGNvcmUtPmNfbGVuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19sZW4pOwotICBpbnRjb3JlLT5jX3JlZ3NfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zdW4zX2NvcmUgKikgMCktPmNfcmVncyk7Ci0gIGludGNvcmUtPmNfcmVnc19zaXplID0gc2l6ZW9mIChleHRjb3JlLT5jX3JlZ3MpOwotI2lmIEFSQ0hfU0laRSA9PSA2NAotICBhb3V0XzY0X3N3YXBfZXhlY19oZWFkZXJfaW4KLSNlbHNlCi0gIGFvdXRfMzJfc3dhcF9leGVjX2hlYWRlcl9pbgotI2VuZGlmCi0gICAgKGFiZmQsICZleHRjb3JlLT5jX2FvdXRoZHIsICZpbnRjb3JlLT5jX2FvdXRoZHIpOwotICBpbnRjb3JlLT5jX3NpZ25vID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zaWdubyk7Ci0gIGludGNvcmUtPmNfdHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3RzaXplKTsKLSAgaW50Y29yZS0+Y19kc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfZHNpemUpOwotICBpbnRjb3JlLT5jX2RhdGFfYWRkciA9IE5fREFUQUREUiAoaW50Y29yZS0+Y19hb3V0aGRyKTsKLSAgaW50Y29yZS0+Y19zc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc3NpemUpOwotICBtZW1jcHkgKGludGNvcmUtPmNfY21kbmFtZSwgZXh0Y29yZS0+Y19jbWRuYW1lLCBzaXplb2YgKGludGNvcmUtPmNfY21kbmFtZSkpOwotICBpbnRjb3JlLT5mcF9zdHVmZl9wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBGUCBzdHVmZiB0YWtlcyB1cCB3aG9sZSByZXN0IG9mIHN0cnVjdCwgZXhjZXB0IGNfdWNvZGUuICovCi0gIGludGNvcmUtPmZwX3N0dWZmX3NpemUgPSBpbnRjb3JlLT5jX2xlbiAtIChzaXplb2YgZXh0Y29yZS0+Y191Y29kZSkgLQotICAgIChmaWxlX3B0cikgKCgoc3RydWN0IGV4dGVybmFsX3N1bjNfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBVY29kZSBpcyB0aGUgbGFzdCB0aGluZyBpbiB0aGUgc3RydWN0IC0tIGp1c3QgYmVmb3JlIHRoZSBlbmQgKi8KLSAgaW50Y29yZS0+Y191Y29kZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLAotICAgIGludGNvcmUtPmNfbGVuIC0gc2l6ZW9mIChleHRjb3JlLT5jX3Vjb2RlKSArICh1bnNpZ25lZCBjaGFyICopIGV4dGNvcmUpOwotICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gMHgwRTAwMDAwMDsJLyogQnkgZXhwZXJpbWVudGF0aW9uICovCi19Ci0KLQotLyogYnl0ZS1zd2FwIGluIHRoZSBTcGFyYyBjb3JlIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQKLXN3YXBjb3JlX3NwYXJjIChhYmZkLCBleHQsIGludGNvcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqZXh0OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3Vub3NfY29yZSAqaW50Y29yZTsKLXsKLSAgc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKmV4dGNvcmUgPSAoc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKikgZXh0OwotCi0gIGludGNvcmUtPmNfbWFnaWMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX21hZ2ljKTsKLSAgaW50Y29yZS0+Y19sZW4gPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2xlbik7Ci0gIGludGNvcmUtPmNfcmVnc19wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKikgMCktPmNfcmVncyk7Ci0gIGludGNvcmUtPmNfcmVnc19zaXplID0gc2l6ZW9mIChleHRjb3JlLT5jX3JlZ3MpOwotI2lmIEFSQ0hfU0laRSA9PSA2NAotICBhb3V0XzY0X3N3YXBfZXhlY19oZWFkZXJfaW4KLSNlbHNlCi0gIGFvdXRfMzJfc3dhcF9leGVjX2hlYWRlcl9pbgotI2VuZGlmCi0gICAgKGFiZmQsICZleHRjb3JlLT5jX2FvdXRoZHIsICZpbnRjb3JlLT5jX2FvdXRoZHIpOwotICBpbnRjb3JlLT5jX3NpZ25vID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19zaWdubyk7Ci0gIGludGNvcmUtPmNfdHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX3RzaXplKTsKLSAgaW50Y29yZS0+Y19kc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfZHNpemUpOwotICBpbnRjb3JlLT5jX2RhdGFfYWRkciA9IE5fREFUQUREUiAoaW50Y29yZS0+Y19hb3V0aGRyKTsKLSAgaW50Y29yZS0+Y19zc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc3NpemUpOwotICBtZW1jcHkgKGludGNvcmUtPmNfY21kbmFtZSwgZXh0Y29yZS0+Y19jbWRuYW1lLCBzaXplb2YgKGludGNvcmUtPmNfY21kbmFtZSkpOwotICBpbnRjb3JlLT5mcF9zdHVmZl9wb3MgPSAobG9uZykgKCgoc3RydWN0IGV4dGVybmFsX3NwYXJjX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogRlAgc3R1ZmYgdGFrZXMgdXAgd2hvbGUgcmVzdCBvZiBzdHJ1Y3QsIGV4Y2VwdCBjX3Vjb2RlLiAqLwotICBpbnRjb3JlLT5mcF9zdHVmZl9zaXplID0gaW50Y29yZS0+Y19sZW4gLSAoc2l6ZW9mIGV4dGNvcmUtPmNfdWNvZGUpIC0KLSAgICAoZmlsZV9wdHIpICgoKHN0cnVjdCBleHRlcm5hbF9zcGFyY19jb3JlICopIDApLT5mcF9zdHVmZik7Ci0gIC8qIFVjb2RlIGlzIHRoZSBsYXN0IHRoaW5nIGluIHRoZSBzdHJ1Y3QgLS0ganVzdCBiZWZvcmUgdGhlIGVuZCAqLwotICBpbnRjb3JlLT5jX3Vjb2RlID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsCi0gICAgaW50Y29yZS0+Y19sZW4gLSBzaXplb2YgKGV4dGNvcmUtPmNfdWNvZGUpICsgKHVuc2lnbmVkIGNoYXIgKikgZXh0Y29yZSk7Ci0KLSAgLyogU3VwcG9zZWRseSB0aGUgdXNlciBzdGFjayBncm93cyBkb3dud2FyZCBmcm9tIHRoZSBib3R0b20gb2Yga2VybmVsIG1lbW9yeS4KLSAgICAgUHJlc3VtaW5nIHRoYXQgdGhpcyByZW1haW5zIHRydWUsIHRoaXMgZGVmaW5pdGlvbiB3aWxsIHdvcmsuICAqLwotICAvKiBOb3cgc3VuIGhhcyBwcm92aWRlZCB1cyB3aXRoIGFub3RoZXIgY2hhbGxlbmdlLiAgVGhlIHZhbHVlIGlzIGRpZmZlcmVudAotICAgICBmb3Igc3BhcmMyIGFuZCBzcGFyYzEwIChib3RoIHJ1bm5pbmcgU3VuT1MgNC4xLjMpLiAgV2UgcGljayBvbmUgb3IKLSAgICAgdGhlIG90aGVyIGJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBzdGFjayBwb2ludGVyLiAgVGhpcwotICAgICBsb3NlcyAoYSkgaWYgdGhlIHN0YWNrIHBvaW50ZXIgaGFzIGJlZW4gY2xvYmJlcmVkLCBvciAoYikgaWYgdGhlIHN0YWNrCi0gICAgIGlzIGxhcmdlciB0aGFuIDEyOCBtZWdhYnl0ZXMuCi0KLSAgICAgSXQncyB0aW1lcyBsaWtlIHRoZXNlIHlvdSdyZSBnbGFkIHRoZXkncmUgc3dpdGNoaW5nIHRvIEVMRi4KLQotICAgICBOb3RlIHRoYXQgdXNpbmcgaW5jbHVkZSBmaWxlcyBvciBubGlzdCBvbiAvdm11bml4IHdvdWxkIGJlIHdyb25nLAotICAgICBiZWNhdXNlIHdlIHdhbnQgdGhlIHZhbHVlIGZvciB0aGlzIGNvcmUgZmlsZSwgbm8gbWF0dGVyIHdoYXQga2luZCBvZgotICAgICBtYWNoaW5lIHdlIHdlcmUgY29tcGlsZWQgb24gb3IgYXJlIHJ1bm5pbmcgb24uICAqLwotI2RlZmluZSBTUEFSQ19VU1JTVEFDS19TUEFSQzIgKChiZmRfdm1hKTB4ZjgwMDAwMDApCi0jZGVmaW5lIFNQQVJDX1VTUlNUQUNLX1NQQVJDMTAgKChiZmRfdm1hKTB4ZjAwMDAwMDApCi0gIHsKLSAgICBiZmRfdm1hIHNwID0gYmZkX2hfZ2V0XzMyCi0gICAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICYoKHN0cnVjdCByZWdzICopICZleHRjb3JlLT5jX3JlZ3NbMF0pLT5yX282KTsKLSAgICBpZiAoc3AgPCBTUEFSQ19VU1JTVEFDS19TUEFSQzEwKQotICAgICAgaW50Y29yZS0+Y19zdGFja3RvcCA9IFNQQVJDX1VTUlNUQUNLX1NQQVJDMTA7Ci0gICAgZWxzZQotICAgICAgaW50Y29yZS0+Y19zdGFja3RvcCA9IFNQQVJDX1VTUlNUQUNLX1NQQVJDMjsKLSAgfQotfQotCi0vKiBieXRlLXN3YXAgaW4gdGhlIFNvbGFyaXMgQkNQIGNvcmUgc3RydWN0dXJlICovCi1zdGF0aWMgdm9pZAotc3dhcGNvcmVfc29sYXJpc19iY3AgKGFiZmQsIGV4dCwgaW50Y29yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpleHQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICppbnRjb3JlOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqZXh0Y29yZSA9Ci0gICAgKHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICopIGV4dDsKLQotICBpbnRjb3JlLT5jX21hZ2ljID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19tYWdpYyk7Ci0gIGludGNvcmUtPmNfbGVuID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19sZW4pOwotICBpbnRjb3JlLT5jX3JlZ3NfcG9zID0gKGxvbmcpICgoKHN0cnVjdCBleHRlcm5hbF9zb2xhcmlzX2JjcF9jb3JlICopIDApLT5jX3JlZ3MpOwotICBpbnRjb3JlLT5jX3JlZ3Nfc2l6ZSA9IHNpemVvZiAoZXh0Y29yZS0+Y19yZWdzKTsKLQotICAvKiBUaGUgU29sYXJpcyBCQ1AgZXhkYXRhIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFuIGFfc3ltcyBmaWVsZCwKLSAgICAgc28gd2UgYXJlIHVuYWJsZSB0byBzeW50aGVzaXplIGFuIGludGVybmFsIGV4ZWMgaGVhZGVyLgotICAgICBMdWNraWx5IHdlIGFyZSBhYmxlIHRvIGZpZ3VyZSBvdXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VjdGlvbiwKLSAgICAgd2hpY2ggaXMgdGhlIG9ubHkgdGhpbmcgbmVlZGVkIGZyb20gdGhlIGludGVybmFsIGV4ZWMgaGVhZGVyLAotICAgICBmcm9tIHRoZSBleGRhdGEgc3RydWN0dXJlLgotCi0gICAgIEFzIG9mIFNvbGFyaXMgMi4zLCBCQ1AgY29yZSBmaWxlcyBmb3Igc3RhdGljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMKLSAgICAgYXJlIGJ1Z2d5LiBUaGUgZXhkYXRhIHN0cnVjdHVyZSBpcyBub3QgcHJvcGVybHkgZmlsbGVkIGluLCBhbmQKLSAgICAgdGhlIGRhdGEgc2VjdGlvbiBpcyB3cml0dGVuIGZyb20gYWRkcmVzcyB6ZXJvIGluc3RlYWQgb2YgdGhlIGRhdGEKLSAgICAgc3RhcnQgYWRkcmVzcy4gICovCi0gIG1lbXNldCAoKFBUUikgJmludGNvcmUtPmNfYW91dGhkciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYykpOwotICBpbnRjb3JlLT5jX2RhdGFfYWRkciA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y19leGRhdGFfZGF0b3JnKTsKLSAgaW50Y29yZS0+Y19zaWdubyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc2lnbm8pOwotICBpbnRjb3JlLT5jX3RzaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZXh0Y29yZS0+Y190c2l6ZSk7Ci0gIGludGNvcmUtPmNfZHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZleHRjb3JlLT5jX2RzaXplKTsKLSAgaW50Y29yZS0+Y19zc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJmV4dGNvcmUtPmNfc3NpemUpOwotICBtZW1jcHkgKGludGNvcmUtPmNfY21kbmFtZSwgZXh0Y29yZS0+Y19jbWRuYW1lLCBzaXplb2YgKGludGNvcmUtPmNfY21kbmFtZSkpOwotICBpbnRjb3JlLT5mcF9zdHVmZl9wb3MgPQotICAgIChsb25nKSAoKChzdHJ1Y3QgZXh0ZXJuYWxfc29sYXJpc19iY3BfY29yZSAqKSAwKS0+ZnBfc3R1ZmYpOwotICAvKiBGUCBzdHVmZiB0YWtlcyB1cCB3aG9sZSByZXN0IG9mIHN0cnVjdCwgZXhjZXB0IGNfdWNvZGUuICovCi0gIGludGNvcmUtPmZwX3N0dWZmX3NpemUgPSBpbnRjb3JlLT5jX2xlbiAtIChzaXplb2YgZXh0Y29yZS0+Y191Y29kZSkgLQotICAgIChmaWxlX3B0cikgKCgoc3RydWN0IGV4dGVybmFsX3NvbGFyaXNfYmNwX2NvcmUgKikgMCktPmZwX3N0dWZmKTsKLSAgLyogVWNvZGUgaXMgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIHN0cnVjdCAtLSBqdXN0IGJlZm9yZSB0aGUgZW5kICovCi0gIGludGNvcmUtPmNfdWNvZGUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwKLSAgICBpbnRjb3JlLT5jX2xlbiAtIHNpemVvZiAoZXh0Y29yZS0+Y191Y29kZSkgKyAodW5zaWduZWQgY2hhciAqKSBleHRjb3JlKTsKLQotICAvKiBTdXBwb3NlZGx5IHRoZSB1c2VyIHN0YWNrIGdyb3dzIGRvd253YXJkIGZyb20gdGhlIGJvdHRvbSBvZiBrZXJuZWwgbWVtb3J5LgotICAgICBQcmVzdW1pbmcgdGhhdCB0aGlzIHJlbWFpbnMgdHJ1ZSwgdGhpcyBkZWZpbml0aW9uIHdpbGwgd29yay4gICovCi0gIC8qIE5vdyBzdW4gaGFzIHByb3ZpZGVkIHVzIHdpdGggYW5vdGhlciBjaGFsbGVuZ2UuICBUaGUgdmFsdWUgaXMgZGlmZmVyZW50Ci0gICAgIGZvciBzcGFyYzIgYW5kIHNwYXJjMTAgKGJvdGggcnVubmluZyBTdW5PUyA0LjEuMykuICBXZSBwaWNrIG9uZSBvcgotICAgICB0aGUgb3RoZXIgYmFzZWQgb24gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIuICBUaGlzCi0gICAgIGxvc2VzIChhKSBpZiB0aGUgc3RhY2sgcG9pbnRlciBoYXMgYmVlbiBjbG9iYmVyZWQsIG9yIChiKSBpZiB0aGUgc3RhY2sKLSAgICAgaXMgbGFyZ2VyIHRoYW4gMTI4IG1lZ2FieXRlcy4KLQotICAgICBJdCdzIHRpbWVzIGxpa2UgdGhlc2UgeW91J3JlIGdsYWQgdGhleSdyZSBzd2l0Y2hpbmcgdG8gRUxGLgotCi0gICAgIE5vdGUgdGhhdCB1c2luZyBpbmNsdWRlIGZpbGVzIG9yIG5saXN0IG9uIC92bXVuaXggd291bGQgYmUgd3JvbmcsCi0gICAgIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdmFsdWUgZm9yIHRoaXMgY29yZSBmaWxlLCBubyBtYXR0ZXIgd2hhdCBraW5kIG9mCi0gICAgIG1hY2hpbmUgd2Ugd2VyZSBjb21waWxlZCBvbiBvciBhcmUgcnVubmluZyBvbi4gICovCi0jZGVmaW5lIFNQQVJDX1VTUlNUQUNLX1NQQVJDMiAoKGJmZF92bWEpMHhmODAwMDAwMCkKLSNkZWZpbmUgU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMCAoKGJmZF92bWEpMHhmMDAwMDAwMCkKLSAgewotICAgIGJmZF92bWEgc3AgPSBiZmRfaF9nZXRfMzIKLSAgICAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgJigoc3RydWN0IHJlZ3MgKikgJmV4dGNvcmUtPmNfcmVnc1swXSktPnJfbzYpOwotICAgIGlmIChzcCA8IFNQQVJDX1VTUlNUQUNLX1NQQVJDMTApCi0gICAgICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gU1BBUkNfVVNSU1RBQ0tfU1BBUkMxMDsKLSAgICBlbHNlCi0gICAgICBpbnRjb3JlLT5jX3N0YWNrdG9wID0gU1BBUkNfVVNSU1RBQ0tfU1BBUkMyOwotICB9Ci19Ci0KLS8qIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UgcHRyIGlzIHJlYWxseSB2b2lkICogKi8KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLnN1bl9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfZGF0YXNlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5kYXRhX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfc3RhY2tzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoY29yZV9oZHIoYmZkKS0+cmVnX3NlY3Rpb24pCi0jZGVmaW5lIGNvcmVfcmVnMnNlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5yZWcyX3NlY3Rpb24pCi0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi1zdHJ1Y3Qgc3VuX2NvcmVfc3RydWN0Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICpoZHI7CS8qIGNvcmUgZmlsZSBoZWFkZXIgKi8KLSAgYXNlY3Rpb24gKmRhdGFfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnN0YWNrX3NlY3Rpb247Ci0gIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgYXNlY3Rpb24gKnJlZzJfc2VjdGlvbjsKLX07Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXN1bm9zNF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBjaGFyIGxvbmdidWZbNF07CS8qIFJhdyBieXRlcyBvZiB2YXJpb3VzIGhlYWRlciBmaWVsZHMgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3JlX3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcgY29yZV9tYWc7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlICpjb3JlOwotICBjaGFyICpleHRjb3JlOwotICBzdHJ1Y3QgbWVyZ2VtCi0gICAgewotICAgICAgc3RydWN0IHN1bl9jb3JlX3N0cnVjdCBzdW5jb3JlZGF0YTsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zdW5vc19jb3JlIGludGVybmFsX3N1bm9zX2NvcmU7Ci0gICAgICBjaGFyIGV4dGVybmFsX2NvcmVbMV07Ci0gICAgfQotICAgKm1lcmdlbTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGxvbmdidWYsIDEsIHNpemVvZiAobG9uZ2J1ZiksIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKGxvbmdidWYpKQotICAgIHJldHVybiAwOwotICBjb3JlX21hZyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgbG9uZ2J1Zik7Ci0KLSAgaWYgKGNvcmVfbWFnICE9IENPUkVfTUFHSUMpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogU3VuT1MgY29yZSBoZWFkZXJzIGNhbiB2YXJ5IGluIGxlbmd0aDsgc2Vjb25kIHdvcmQgaXMgc2l6ZTsgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBsb25nYnVmLCAxLCBzaXplb2YgKGxvbmdidWYpLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChsb25nYnVmKSkKLSAgICByZXR1cm4gMDsKLSAgY29yZV9zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBsb25nYnVmKTsKLSAgLyogU2FuaXR5IGNoZWNrICovCi0gIGlmIChjb3JlX3NpemUgPiAyMDAwMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gMDsKLQotICBtZXJnZW0gPSAoc3RydWN0IG1lcmdlbSAqKSBiZmRfemFsbG9jIChhYmZkLCBjb3JlX3NpemUgKyBzaXplb2YgKHN0cnVjdCBtZXJnZW0pKTsKLSAgaWYgKG1lcmdlbSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGV4dGNvcmUgPSBtZXJnZW0tPmV4dGVybmFsX2NvcmU7Ci0KLSAgaWYgKChiZmRfcmVhZCAoKFBUUikgZXh0Y29yZSwgMSwgY29yZV9zaXplLCBhYmZkKSkgIT0gY29yZV9zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoY2hhciAqKSBtZXJnZW0pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFZhbGlkYXRlIHRoYXQgaXQncyBhIGNvcmUgZmlsZSB3ZSBrbm93IGhvdyB0byBoYW5kbGUsIGR1ZSB0byBzdW4KLSAgICAgYm90Y2hpbmcgdGhlIHBvc2l0aW9uaW5nIG9mIHJlZ2lzdGVycyBhbmQgb3RoZXIgZmllbGRzIGluIGEgbWFjaGluZQotICAgICBkZXBlbmRlbnQgd2F5LiAgKi8KLSAgY29yZSA9ICZtZXJnZW0tPmludGVybmFsX3N1bm9zX2NvcmU7Ci0gIHN3aXRjaCAoY29yZV9zaXplKQotICAgIHsKLSAgICBjYXNlIFNQQVJDX0NPUkVfTEVOOgotICAgICAgc3dhcGNvcmVfc3BhcmMgKGFiZmQsIGV4dGNvcmUsIGNvcmUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVU4zX0NPUkVfTEVOOgotICAgICAgc3dhcGNvcmVfc3VuMyAoYWJmZCwgZXh0Y29yZSwgY29yZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNPTEFSSVNfQkNQX0NPUkVfTEVOOgotICAgICAgc3dhcGNvcmVfc29sYXJpc19iY3AgKGFiZmQsIGV4dGNvcmUsIGNvcmUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7CS8qIEZJWE1FICovCi0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKikgbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhYmZkLT50ZGF0YS5zdW5fY29yZV9kYXRhID0gJm1lcmdlbS0+c3VuY29yZWRhdGE7Ci0gIGFiZmQtPnRkYXRhLnN1bl9jb3JlX2RhdGEtPmhkciA9IGNvcmU7Ci0KLSAgLyogY3JlYXRlIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgcmF1bmNoeSwgYnV0IGJmZF9jbG9zZSB3YW50cyB0byByZWNsYWltCi0gICAgIHRoZW0gKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9zdGFja3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgbG9zZXI6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKGNoYXIgKikgbWVyZ2VtKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX2RhdGFzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgIGxvc2VyMToKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3N0YWNrc2VjIChhYmZkKSk7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICBsb3NlcjI6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgY29yZV9kYXRhc2VjIChhYmZkKSk7Ci0gICAgICBnb3RvIGxvc2VyMTsKLSAgICB9Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9yZWcyc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBjb3JlX3JlZ3NlYyAoYWJmZCkpOwotICAgICAgZ290byBsb3NlcjI7Ci0gICAgfQotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uYW1lID0gIi5zdGFjayI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5hbWUgPSAiLmRhdGEiOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPm5hbWUgPSAiLnJlZzIiOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX3JlZzJzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGNvcmUtPmNfc3NpemU7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGNvcmUtPmNfZHNpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gY29yZS0+Y19yZWdzX3NpemU7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGNvcmUtPmZwX3N0dWZmX3NpemU7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IChjb3JlLT5jX3N0YWNrdG9wIC0gY29yZS0+Y19zc2l6ZSk7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IGNvcmUtPmNfZGF0YV9hZGRyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPnZtYSA9IDA7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPnZtYSA9IDA7Ci0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZpbGVwb3MgPSBjb3JlLT5jX2xlbiArIGNvcmUtPmNfZHNpemU7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBjb3JlLT5jX2xlbjsKLSAgLyogV2UnbGwgYWNjZXNzIHRoZSByZWdzIGFmcmVzaCBpbiB0aGUgY29yZSBmaWxlLCBsaWtlIGFueSBzZWN0aW9uOiAqLwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpIGNvcmUtPmNfcmVnc19wb3M7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmZpbGVwb3MgPSAoZmlsZV9wdHIpIGNvcmUtPmZwX3N0dWZmX3BvczsKLQotICAvKiBBbGlnbiB0byB3b3JkIGF0IGxlYXN0ICovCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfcmVnMnNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgYWJmZC0+c2VjdGlvbnMgPSBjb3JlX3N0YWNrc2VjIChhYmZkKTsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX2RhdGFzZWMgKGFiZmQpOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9yZWdzZWMgKGFiZmQpOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZzJzZWMgKGFiZmQpOwotCi0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSA0OwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1zdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5oZHItPmNfY21kbmFtZTsKLX0KLQotc3RhdGljIGludAotc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLT5oZHItPmNfc2lnbm87Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zdW5vczRfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIGlmIChjb3JlX2JmZC0+eHZlYyAhPSBleGVjX2JmZC0+eHZlYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTb2xhcmlzIGNvcmUgZmlsZXMgZG8gbm90IGluY2x1ZGUgYW4gYW91dGhkci4gKi8KLSAgaWYgKChjb3JlX2hkciAoY29yZV9iZmQpLT5oZHIpLT5jX2xlbiA9PSBTT0xBUklTX0JDUF9DT1JFX0xFTikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gKG1lbWNtcCAoKGNoYXIgKikgJigoY29yZV9oZHIgKGNvcmVfYmZkKS0+aGRyKS0+Y19hb3V0aGRyKSwKLQkJICAoY2hhciAqKSBleGVjX2hkciAoZXhlY19iZmQpLAotCQkgIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKSA9PSAwKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2RlZmluZSBNWV9zZXRfc2l6ZXMgc3Vub3M0X3NldF9zaXplcwotc3RhdGljIGJvb2xlYW4KLXN1bm9zNF9zZXRfc2l6ZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLnNlZ21lbnRfc2l6ZSA9IDB4MjAwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi0vKiBXZSBkZWZhdWx0IHRvIHNldHRpbmcgdGhlIHRvb2x2ZXJzaW9uIGZpZWxkIHRvIDEsIGFzIGlzIHJlcXVpcmVkIGJ5Ci0gICBTdW5PUy4gICovCi0jaWZuZGVmIE1ZX2V4ZWNfaGRyX2ZsYWdzCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDEKLSNlbmRpZgotCi0jaWZuZGVmIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcwotI2RlZmluZSBNWV9lbnRyeV9pc190ZXh0X2FkZHJlc3MgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX2R5bmFtaWNfc3ltYm9scyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2xpbmtfZHluYW1pY19vYmplY3QKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgTVlfd3JpdGVfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfY2hlY2tfZHluYW1pY19yZWxvYyAwCi0jZW5kaWYKLSNpZm5kZWYgTVlfZmluaXNoX2R5bmFtaWNfbGluawotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIDAKLSNlbmRpZgotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhIHN1bm9zNF9hb3V0X2JhY2tlbmQgPQotewotICAwLAkJCQkvKiB6bWFnaWMgZmlsZXMgYXJlIG5vdCBjb250aWd1b3VzICovCi0gIDEsCQkJCS8qIHRleHQgaW5jbHVkZXMgaGVhZGVyICovCi0gIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcywKLSAgTVlfZXhlY19oZHJfZmxhZ3MsCi0gIDAsCQkJCS8qIGRlZmF1bHQgdGV4dCB2bWEgKi8KLSAgc3Vub3M0X3NldF9zaXplcywKLSAgMCwJCQkJLyogaGVhZGVyIGlzIGNvdW50ZWQgaW4gem1hZ2ljIHRleHQgKi8KLSAgTVlfYWRkX2R5bmFtaWNfc3ltYm9scywKLSAgTVlfYWRkX29uZV9zeW1ib2wsCi0gIE1ZX2xpbmtfZHluYW1pY19vYmplY3QsCi0gIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sLAotICBNWV9jaGVja19keW5hbWljX3JlbG9jLAotICBNWV9maW5pc2hfZHluYW1pY19saW5rCi19OwotDAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIAlzdW5vczRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwJc3Vub3M0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3Agc3Vub3M0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19lbmQJCWJmZF92b2lkCi0jZGVmaW5lIE1ZX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJXAotCQkJKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLSNkZWZpbmUgTVlfY29yZV9maWxlX3AJCQlzdW5vczRfY29yZV9maWxlX3AKLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCU5BTUUoYW91dCxzdW5vczRfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEJCQkmc3Vub3M0X2FvdXRfYmFja2VuZAotCi0jaWZuZGVmIFRBUkdFVF9JU19MSVRUTEVfRU5ESUFOX1AKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2VuZGlmCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2FvdXR4LmggYi9iZmQvYW91dHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwNGVlYy4uMDAwMDAwMAotLS0gYS9iZmQvYW91dHguaAorKysgL2Rldi9udWxsCkBAIC0xLDU3MDYgKzAsMCBAQAotLyogQkZEIHNlbWktZ2VuZXJpYyBiYWNrLWVuZCBmb3IgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCWEub3V0IGJhY2tlbmRzCi0KLQotREVTQ1JJUFRJT04KLQotCUJGRCBzdXBwb3J0cyBhIG51bWJlciBvZiBkaWZmZXJlbnQgZmxhdm91cnMgb2YgYS5vdXQgZm9ybWF0LAotCXRob3VnaCB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYXJlIG9ubHkgdGhlIHNpemVzIG9mIHRoZQotCXN0cnVjdHVyZXMgb24gZGlzaywgYW5kIHRoZSBzaGFwZSBvZiB0aGUgcmVsb2NhdGlvbgotCWluZm9ybWF0aW9uLgotCi0JVGhlIHN1cHBvcnQgaXMgc3BsaXQgaW50byBhIGJhc2ljIHN1cHBvcnQgZmlsZSBAZmlsZXthb3V0eC5ofQotCWFuZCBvdGhlciBmaWxlcyB3aGljaCBkZXJpdmUgZnVuY3Rpb25zIGZyb20gdGhlIGJhc2UuIE9uZQotCWRlcml2YXRpb24gZmlsZSBpcyBAZmlsZXthb3V0ZjEuaH0gKGZvciBhLm91dCBmbGF2b3VyIDEpLCBhbmQKLQlhZGRzIHRvIHRoZSBiYXNpYyBhLm91dCBmdW5jdGlvbnMgc3VwcG9ydCBmb3Igc3VuMywgc3VuNCwgMzg2Ci0JYW5kIDI5ayBhLm91dCBmaWxlcywgdG8gY3JlYXRlIGEgdGFyZ2V0IGp1bXAgdmVjdG9yIGZvciBhCi0Jc3BlY2lmaWMgdGFyZ2V0LgotCi0JVGhpcyBpbmZvcm1hdGlvbiBpcyBmdXJ0aGVyIHNwbGl0IG91dCBpbnRvIG1vcmUgc3BlY2lmaWMgZmlsZXMKLQlmb3IgZWFjaCBtYWNoaW5lLCBpbmNsdWRpbmcgQGZpbGV7c3Vub3MuY30gZm9yIHN1bjMgYW5kIHN1bjQsCi0JQGZpbGV7bmV3c29zMy5jfSBmb3IgdGhlIFNvbnkgTkVXUywgYW5kIEBmaWxle2RlbW82NC5jfSBmb3IgYQotCWRlbW9uc3RyYXRpb24gb2YgYSA2NCBiaXQgYS5vdXQgZm9ybWF0LgotCi0JVGhlIGJhc2UgZmlsZSBAZmlsZXthb3V0eC5ofSBkZWZpbmVzIGdlbmVyYWwgbWVjaGFuaXNtcyBmb3IKLQlyZWFkaW5nIGFuZCB3cml0aW5nIHJlY29yZHMgdG8gYW5kIGZyb20gZGlzayBhbmQgdmFyaW91cwotCW90aGVyIG1ldGhvZHMgd2hpY2ggQkZEIHJlcXVpcmVzLiBJdCBpcyBpbmNsdWRlZCBieQotCUBmaWxle2FvdXQzMi5jfSBhbmQgQGZpbGV7YW91dDY0LmN9IHRvIGZvcm0gdGhlIG5hbWVzCi0JPDxhb3V0XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4+PiwgPDxhb3V0XzY0X3N3YXBfZXhlY19oZWFkZXJfaW4+PiwgZXRjLgotCi0JQXMgYW4gZXhhbXBsZSwgdGhpcyBpcyB3aGF0IGdvZXMgb24gdG8gbWFrZSB0aGUgYmFjayBlbmQgZm9yIGEKLQlzdW40LCBmcm9tIEBmaWxle2FvdXQzMi5jfToKLQotfAkjZGVmaW5lIEFSQ0hfU0laRSAzMgotfAkjaW5jbHVkZSAiYW91dHguaCIKLQotCVdoaWNoIGV4cG9ydHMgbmFtZXM6Ci0KLXwJLi4uCi18CWFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jCi18CWFvdXRfMzJfZmluZF9uZWFyZXN0X2xpbmUKLXwJYW91dF8zMl9nZXRfbGluZW5vCi18CWFvdXRfMzJfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi18CS4uLgotCi0JZnJvbSBAZmlsZXtzdW5vcy5jfToKLQotfAkjZGVmaW5lIFRBUkdFVF9OQU1FICJhLm91dC1zdW5vcy1iaWciCi18CSNkZWZpbmUgVkVDTkFNRSAgICBzdW5vc19iaWdfdmVjCi18CSNpbmNsdWRlICJhb3V0ZjEuaCIKLQotCXJlcXVpcmVzIGFsbCB0aGUgbmFtZXMgZnJvbSBAZmlsZXthb3V0MzIuY30sIGFuZCBwcm9kdWNlcyB0aGUganVtcCB2ZWN0b3IKLQotfAlzdW5vc19iaWdfdmVjCi0KLQlUaGUgZmlsZSBAZmlsZXtob3N0LWFvdXQuY30gaXMgYSBzcGVjaWFsIGNhc2UuICBJdCBpcyBmb3IgYSBsYXJnZSBzZXQKLQlvZiBob3N0cyB0aGF0IHVzZSBgYG1vcmUgb3IgbGVzcyBzdGFuZGFyZCcnIGEub3V0IGZpbGVzLCBhbmQKLQlmb3Igd2hpY2ggY3Jvc3MtZGVidWdnaW5nIGlzIG5vdCBpbnRlcmVzdGluZy4gIEl0IHVzZXMgdGhlCi0Jc3RhbmRhcmQgMzItYml0IGEub3V0IHN1cHBvcnQgcm91dGluZXMsIGJ1dCBkZXRlcm1pbmVzIHRoZQotCWZpbGUgb2Zmc2V0cyBhbmQgYWRkcmVzc2VzIG9mIHRoZSB0ZXh0LCBkYXRhLCBhbmQgQlNTCi0Jc2VjdGlvbnMsIHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlLCBhbmQgdGhlCi0JZW50cnkgcG9pbnQgYWRkcmVzcywgaW4gYSBob3N0LWRlcGVuZGVudCBtYW5uZXIuICBPbmNlIHRoZXNlCi0JdmFsdWVzIGhhdmUgYmVlbiBkZXRlcm1pbmVkLCBnZW5lcmljIGNvZGUgaXMgdXNlZCB0byBoYW5kbGUKLQl0aGUgIG9iamVjdCBmaWxlLgotCi0JV2hlbiBwb3J0aW5nIGl0IHRvIHJ1biBvbiBhIG5ldyBzeXN0ZW0sIHlvdSBtdXN0IHN1cHBseToKLQotfCAgICAgICAgSE9TVF9QQUdFX1NJWkUKLXwgICAgICAgIEhPU1RfU0VHTUVOVF9TSVpFCi18ICAgICAgICBIT1NUX01BQ0hJTkVfQVJDSCAgICAgICAob3B0aW9uYWwpCi18ICAgICAgICBIT1NUX01BQ0hJTkVfTUFDSElORSAgICAob3B0aW9uYWwpCi18ICAgICAgICBIT1NUX1RFWFRfU1RBUlRfQUREUgotfCAgICAgICAgSE9TVF9TVEFDS19FTkRfQUREUgotCi0JaW4gdGhlIGZpbGUgQGZpbGV7Li4vaW5jbHVkZS9zeXMvaC1AdmFye1hYWH0uaH0gKGZvciB5b3VyIGhvc3QpLiAgVGhlc2UKLQl2YWx1ZXMsIHBsdXMgdGhlIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyBkZWZpbmVkIGluIEBmaWxle2Eub3V0Lmh9IG9uCi0JeW91ciBob3N0IHN5c3RlbSwgd2lsbCBwcm9kdWNlIGEgQkZEIHRhcmdldCB0aGF0IHdpbGwgYWNjZXNzCi0Jb3JkaW5hcnkgYS5vdXQgZmlsZXMgb24geW91ciBob3N0LiBUbyBjb25maWd1cmUgYSBuZXcgbWFjaGluZQotCXRvIHVzZSBAZmlsZXtob3N0LWFvdXQuY30sIHNwZWNpZnk6Ci0KLXwJVERFRkFVTFRTID0gLURERUZBVUxUX1ZFQ1RPUj1ob3N0X2FvdXRfYmlnX3ZlYwotfAlUREVQRklMRVM9IGhvc3QtYW91dC5vIHRyYWQtY29yZS5vCi0KLQlpbiB0aGUgQGZpbGV7Y29uZmlnL0B2YXJ7WFhYfS5tdH0gZmlsZSwgYW5kIG1vZGlmeSBAZmlsZXtjb25maWd1cmUuaW59Ci0JdG8gdXNlIHRoZQotCUBmaWxle0B2YXJ7WFhYfS5tdH0gZmlsZSAoYnkgc2V0dGluZyAiPDxiZmRfdGFyZ2V0PVhYWD4+Iikgd2hlbiB5b3VyCi0JY29uZmlndXJhdGlvbiBpcyBzZWxlY3RlZC4KLQotKi8KLQotLyogU29tZSBhc3N1bXB0aW9uczoKLSAgICogQW55IEJGRCB3aXRoIERfUEFHRUQgc2V0IGlzIFpNQUdJQywgYW5kIHZpY2UgdmVyc2EuCi0gICAgIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIHNldHRpbmcgb2YgV1BfVEVYVCBpcyBvbiBvdXRwdXQsIGJ1dCBpdCdsbAotICAgICBnZXQgc2V0IG9uIGlucHV0LgotICAgKiBBbnkgQkZEIHdpdGggRF9QQUdFRCBjbGVhciBhbmQgV1BfVEVYVCBzZXQgaXMgTk1BR0lDLgotICAgKiBBbnkgQkZEIHdpdGggYm90aCBmbGFncyBjbGVhciBpcyBPTUFHSUMuCi0gICAoSnVzdCB3YW50IHRvIG1ha2UgdGhlc2UgZXhwbGljaXQsIHNvIHRoZSBjb25kaXRpb25zIHRlc3RlZCBpbiB0aGlzCi0gICBmaWxlIG1ha2Ugc2Vuc2UgaWYgeW91J3JlIG1vcmUgZmFtaWxpYXIgd2l0aCBhLm91dCB0aGFuIHdpdGggQkZELikgICovCi0KLSNkZWZpbmUgS0VFUElUIHVkYXRhLmkKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLQotc3RhdGljIGJvb2xlYW4gYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgYW91dF9zeW1ib2xfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X29fbWFnaWMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9leGVjICopKTsKLXN0YXRpYyB2b2lkIGFkanVzdF96X21hZ2ljIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqKSk7Ci1zdGF0aWMgdm9pZCBhZGp1c3Rfbl9tYWdpYyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4ZWMgKikpOwotCi0vKgotU1VCU0VDVElPTgotCVJlbG9jYXRpb25zCi0KLURFU0NSSVBUSU9OCi0JVGhlIGZpbGUgQGZpbGV7YW91dHguaH0gcHJvdmlkZXMgZm9yIGJvdGggdGhlIEBlbXBoe3N0YW5kYXJkfQotCWFuZCBAZW1waHtleHRlbmRlZH0gZm9ybXMgb2YgYS5vdXQgcmVsb2NhdGlvbiByZWNvcmRzLgotCi0JVGhlIHN0YW5kYXJkIHJlY29yZHMgY29udGFpbiBvbmx5IGFuCi0JYWRkcmVzcywgYSBzeW1ib2wgaW5kZXgsIGFuZCBhIHR5cGUgZmllbGQuIFRoZSBleHRlbmRlZCByZWNvcmRzCi0JKHVzZWQgb24gMjlrcyBhbmQgc3BhcmNzKSBhbHNvIGhhdmUgYSBmdWxsIGludGVnZXIgZm9yIGFuCi0JYWRkZW5kLgotCi0qLwotI2lmbmRlZiBDVE9SX1RBQkxFX1JFTE9DX0hPV1RPCi0jZGVmaW5lIENUT1JfVEFCTEVfUkVMT0NfSURYIDIKLSNkZWZpbmUgQ1RPUl9UQUJMRV9SRUxPQ19IT1dUTyhCRkQpICgob2JqX3JlbG9jX2VudHJ5X3NpemUoQkZEKSA9PSBSRUxPQ19FWFRfU0laRSBcCi0JICAgICA/IGhvd3RvX3RhYmxlX2V4dCA6IGhvd3RvX3RhYmxlX3N0ZCkgXAotCSAgICArIENUT1JfVEFCTEVfUkVMT0NfSURYKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9zdGRfcmVsb2NfaW4KLSNkZWZpbmUgTVlfc3dhcF9zdGRfcmVsb2NfaW4gTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX2luKQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfc3dhcF9zdGRfcmVsb2Nfb3V0Ci0jZGVmaW5lIE1ZX3N3YXBfc3RkX3JlbG9jX291dCBOQU1FKGFvdXQsc3dhcF9zdGRfcmVsb2Nfb3V0KQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfZmluYWxfbGlua19yZWxvY2F0ZQotI2RlZmluZSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotI2VuZGlmCi0KLSNpZm5kZWYgTVlfcmVsb2NhdGVfY29udGVudHMKLSNkZWZpbmUgTVlfcmVsb2NhdGVfY29udGVudHMgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotI2VuZGlmCi0KLSNkZWZpbmUgaG93dG9fdGFibGVfZXh0IE5BTUUoYW91dCxleHRfaG93dG9fdGFibGUpCi0jZGVmaW5lIGhvd3RvX3RhYmxlX3N0ZCBOQU1FKGFvdXQsc3RkX2hvd3RvX3RhYmxlKQotCi1yZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlX2V4dFtdID0KLXsKLSAgLyogdHlwZSAgICAgICAgICAgcnMgICBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICAgICAgIHBhcnRfaW5wbCByZWFkbWFzayBzZXRtYXNrIHBjZG9uZSAqLwotICBIT1dUTyhSRUxPQ184LCAgICAgIDAsICAwLCAgCTgsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiOCIsICAgICAgICBmYWxzZSwgMCwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzE2LCAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjE2IiwgICAgICAgZmFsc2UsIDAsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ18zMiwgICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgIGZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfRElTUDgsICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkRJU1A4IiwgCWZhbHNlLCAwLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfRElTUDE2LCAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkRJU1AxNiIsIAlmYWxzZSwgMCwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0RJU1AzMiwgMCwgIDIsIAkzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJESVNQMzIiLCAJZmFsc2UsIDAsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19XRElTUDMwLDIsICAyLCAJMzAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiV0RJU1AzMCIsIAlmYWxzZSwgMCwweDNmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1dESVNQMjIsMiwgIDIsIAkyMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJXRElTUDIyIiwgCWZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfSEkyMiwgICAxMCwgMiwgCTIyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSEkyMiIsCWZhbHNlLCAwLDB4MDAzZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfMjIsICAgICAwLCAgMiwgCTIyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMjIiLCAgICAgICBmYWxzZSwgMCwweDAwM2ZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DXzEzLCAgICAgMCwgIDIsIAkxMywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjEzIiwgICAgICAgZmFsc2UsIDAsMHgwMDAwMWZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19MTzEwLCAgIDAsICAyLCAJMTAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIkxPMTAiLCAgICAgZmFsc2UsIDAsMHgwMDAwMDNmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19TRkFfQkFTRSwwLCAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJTRkFfQkFTRSIsIGZhbHNlLCAwLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUkVMT0NfU0ZBX09GRjEzLDAsMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0ZBX09GRjEzIixmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0JBU0UxMCwgMCwgIDIsIAkxMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsMCwiQkFTRTEwIiwgICBmYWxzZSwgMCwweDAwMDAwM2ZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0JBU0UxMywgMCwgIDIsCTEzLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsIkJBU0UxMyIsICAgZmFsc2UsIDAsMHgwMDAwMWZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19CQVNFMjIsIDEwLCAyLAkyMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkJBU0UyMiIsICAgZmFsc2UsIDAsMHgwMDNmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSRUxPQ19QQzEwLCAgIDAsICAyLAkxMCwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsMCwiUEMxMCIsCWZhbHNlLCAwLDB4MDAwMDAzZmYsIHRydWUpLAotICBIT1dUTyhSRUxPQ19QQzIyLCAgIDEwLCAgMiwJMjIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiUEMyMiIsIGZhbHNlLCAwLDB4MDAzZmZmZmYsIHRydWUpLAotICBIT1dUTyhSRUxPQ19KTVBfVEJMLDIsICAyLCAJMzAsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsMCwiSk1QX1RCTCIsIAlmYWxzZSwgMCwweDNmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1NFR09GRjE2LDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiU0VHT0ZGMTYiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0dMT0JfREFULDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiR0xPQl9EQVQiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX0pNUF9TTE9ULDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiSk1QX1NMT1QiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKFJFTE9DX1JFTEFUSVZFLDAsIDIsCTAsICBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUkVMQVRJVkUiLAlmYWxzZSwgMCwweDAwMDAwMDAwLCBmYWxzZSksCi0gIEhPV1RPKDAsICAwLCAwLCAgICAwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKDAsICAwLCAwLCAgICAwLCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0jZGVmaW5lIFJFTE9DX1NQQVJDX1JFVjMyIFJFTE9DX1dESVNQMTkKLSAgSE9XVE8oUkVMT0NfU1BBUkNfUkVWMzIsICAgIDAsICAyLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LDAsIlJfU1BBUkNfUkVWMzIiLCAgICAgICBmYWxzZSwgMCwweGZmZmZmZmZmLCBmYWxzZSksCi19OwotCi0vKiBDb252ZXJ0IHN0YW5kYXJkIHJlbG9jIHJlY29yZHMgdG8gImFyZWxlbnQiIGZvcm1hdCAoaW5jbCBieXRlIHN3YXApLiAgKi8KLQotcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZV9zdGRbXSA9IHsKLSAgLyogdHlwZSAgICAgICAgICAgICAgcnMgc2l6ZSBic3ogIHBjcmVsIGJpdHBvcyBvdnJmICAgICAgICAgICAgICAgICAgICAgc2YgbmFtZSAgICAgcGFydF9pbnBsIHJlYWRtYXNrICBzZXRtYXNrICAgIHBjZG9uZSAqLwotSE9XVE8oIDAsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjgiLAkJdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi1IT1dUTyggMSwJICAgICAgIDAsICAxLCAJMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotSE9XVE8oIDIsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKCAzLAkgICAgICAgMCwgIDQsIAk2NCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIjY0IiwJdHJ1ZSwgMHhkZWFkZGVhZCwweGRlYWRkZWFkLCBmYWxzZSksCi1IT1dUTyggNCwJICAgICAgIDAsICAwLCAJOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotSE9XVE8oIDUsCSAgICAgICAwLCAgMSwgCTE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwJdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi1IT1dUTyggNiwJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKCA3LAkgICAgICAgMCwgIDQsIAk2NCwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1A2NCIsCXRydWUsIDB4ZmVlZGZhY2UsMHhmZWVkZmFjZSwgZmFsc2UpLAotSE9XVE8oIDgsCSAgICAgICAwLCAgMiwgICAgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkdPVF9SRUwiLAlmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLUhPV1RPKCA5LAkgICAgICAgMCwgIDEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMTYiLAlmYWxzZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLUhPV1RPKDEwLAkgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJCQVNFMzIiLAlmYWxzZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLSAgSE9XVE8oMTYsCSAgICAgICAwLCAgMiwJIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJKTVBfVEFCTEUiLCBmYWxzZSwgICAgICAgICAwLDB4MDAwMDAwMDAsIGZhbHNlKSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwKLXsgLTEgfSwgeyAtMSB9LCB7IC0xIH0sIHsgLTEgfSwgeyAtMSB9LCB7IC0xIH0sIHsgLTEgfSwgeyAtMSB9LAotICBIT1dUTygzMiwJICAgICAgIDAsICAyLAkgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJFTEFUSVZFIiwgIGZhbHNlLCAgICAgICAgIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAoteyAtMSB9LAotICBIT1dUTyg0MCwJICAgICAgIDAsICAyLAkgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIkJBU0VSRUwiLCAgIGZhbHNlLCAgICAgICAgIDAsMHgwMDAwMDAwMCwgZmFsc2UpLAotfTsKLQotI2RlZmluZSBUQUJMRV9TSVpFKFRBQkxFKQkoc2l6ZW9mKFRBQkxFKS9zaXplb2YoVEFCTEVbMF0pKQotCi1yZWxvY19ob3d0b190eXBlICoKLU5BTUUoYW91dCxyZWxvY190eXBlX2xvb2t1cCkgKGFiZmQsY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSNkZWZpbmUgRVhUKGksaikJY2FzZSBpOiByZXR1cm4gJmhvd3RvX3RhYmxlX2V4dFtqXQotI2RlZmluZSBTVEQoaSxqKQljYXNlIGk6IHJldHVybiAmaG93dG9fdGFibGVfc3RkW2pdCi0gIGludCBleHQgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPT0gUkVMT0NfRVhUX1NJWkU7Ci0gIGlmIChjb2RlID09IEJGRF9SRUxPQ19DVE9SKQotICAgIHN3aXRjaCAoYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpLT5iaXRzX3Blcl9hZGRyZXNzKQotICAgICAgewotICAgICAgY2FzZSAzMjoKLQljb2RlID0gQkZEX1JFTE9DXzMyOwotCWJyZWFrOwotICAgICAgY2FzZSA2NDoKLQljb2RlID0gQkZEX1JFTE9DXzY0OwotCWJyZWFrOwotICAgICAgfQotICBpZiAoZXh0KQotICAgIHN3aXRjaCAoY29kZSkKLSAgICAgIHsKLQlFWFQgKEJGRF9SRUxPQ18zMiwgMik7Ci0JRVhUIChCRkRfUkVMT0NfSEkyMiwgOCk7Ci0JRVhUIChCRkRfUkVMT0NfTE8xMCwgMTEpOwotCUVYVCAoQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCA2KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyLCA3KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQzEzLCAxMCk7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfR09UMTAsIDE0KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19CQVNFMTMsIDE1KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19HT1QxMywgMTUpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCAxNik7Ci0JRVhUIChCRkRfUkVMT0NfU1BBUkNfUEMxMCwgMTcpOwotCUVYVCAoQkZEX1JFTE9DX1NQQVJDX1BDMjIsIDE4KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19XUExUMzAsIDE5KTsKLQlFWFQgKEJGRF9SRUxPQ19TUEFSQ19SRVYzMiwgMjYpOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgICB9Ci0gIGVsc2UKLSAgICAvKiBzdGQgcmVsb2NzICovCi0gICAgc3dpdGNoIChjb2RlKQotICAgICAgewotCVNURCAoQkZEX1JFTE9DXzE2LCAxKTsKLQlTVEQgKEJGRF9SRUxPQ18zMiwgMik7Ci0JU1REIChCRkRfUkVMT0NfOF9QQ1JFTCwgNCk7Ci0JU1REIChCRkRfUkVMT0NfMTZfUENSRUwsIDUpOwotCVNURCAoQkZEX1JFTE9DXzMyX1BDUkVMLCA2KTsKLQlTVEQgKEJGRF9SRUxPQ18xNl9CQVNFUkVMLCA5KTsKLQlTVEQgKEJGRF9SRUxPQ18zMl9CQVNFUkVMLCAxMCk7Ci0gICAgICBkZWZhdWx0OiByZXR1cm4gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTDsKLSAgICAgIH0KLX0KLQotLyoKLVNVQlNFQ1RJT04KLQlJbnRlcm5hbCBlbnRyeSBwb2ludHMKLQotREVTQ1JJUFRJT04KLQlAZmlsZXthb3V0eC5ofSBleHBvcnRzIHNldmVyYWwgcm91dGluZXMgZm9yIGFjY2Vzc2luZyB0aGUKLQljb250ZW50cyBvZiBhbiBhLm91dCBmaWxlLCB3aGljaCBhcmUgZ2F0aGVyZWQgYW5kIGV4cG9ydGVkIGluCi0JdHVybiBieSB2YXJpb3VzIGZvcm1hdCBzcGVjaWZpYyBmaWxlcyAoZWcgc3Vub3MuYykuCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCSBhb3V0X0B2YXJ7c2l6ZX1fc3dhcF9leGVjX2hlYWRlcl9pbgotCi1TWU5PUFNJUwotCXZvaWQgYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfaW4sCi0gICAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICAgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzLAotICAgICAgICAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKTsKLQotREVTQ1JJUFRJT04KLQlTd2FwIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBleGVjdXRhYmxlIGhlYWRlciBAdmFye3Jhd19ieXRlc30gdGFrZW4KLQlmcm9tIGEgcmF3IGJ5dGUgc3RyZWFtIG1lbW9yeSBpbWFnZSBpbnRvIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlcgotCXN0cnVjdHVyZSBAdmFye2V4ZWNwfS4KLSovCi0KLSNpZm5kZWYgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcwotICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKLSAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cwotICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCi0gIG1lbXNldCAoKFBUUikgZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLSNkZWZpbmUgTkFNRV9zd2FwX2V4ZWNfaGVhZGVyX2luIE5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKQotI2VuZGlmCi0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9zd2FwX2V4ZWNfaGVhZGVyX291dAotCi1TWU5PUFNJUwotCXZvaWQgYW91dF9AdmFye3NpemV9X3N3YXBfZXhlY19oZWFkZXJfb3V0Ci0JICAoYmZkICphYmZkLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwKLQkgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzKTsKLQotREVTQ1JJUFRJT04KLQlTd2FwIHRoZSBpbmZvcm1hdGlvbiBpbiBhbiBpbnRlcm5hbCBleGVjIGhlYWRlciBzdHJ1Y3R1cmUKLQlAdmFye2V4ZWNwfSBpbnRvIHRoZSBidWZmZXIgQHZhcntyYXdfYnl0ZXN9IHJlYWR5IGZvciB3cml0aW5nIHRvIGRpc2suCi0qLwotdm9pZAotTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9leGVjICpyYXdfYnl0ZXM7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjICpieXRlcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqKXJhd19ieXRlczsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIHJhdyBkYXRhLCBmcm9tIHRoZSBmaWVsZHMgaW4gdGhlIGV4ZWMgc3RydWN0LiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX2luZm8gICwgYnl0ZXMtPmVfaW5mbyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV90ZXh0ICAsIGJ5dGVzLT5lX3RleHQpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZGF0YSAgLCBieXRlcy0+ZV9kYXRhKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2JzcyAgICwgYnl0ZXMtPmVfYnNzKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3N5bXMgICwgYnl0ZXMtPmVfc3ltcyk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9lbnRyeSAsIGJ5dGVzLT5lX2VudHJ5KTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3Ryc2l6ZSwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2Ryc2l6ZSwgYnl0ZXMtPmVfZHJzaXplKTsKLX0KLQotLyogTWFrZSBhbGwgdGhlIHNlY3Rpb24gZm9yIGFuIGEub3V0IGZpbGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbWFrZV9zZWN0aW9ucykgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial90ZXh0c2VjIChhYmZkKSA9PSAoYXNlY3Rpb24gKikgTlVMTAotICAgICAgJiYgYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi50ZXh0IikgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAob2JqX2RhdGFzZWMgKGFiZmQpID09IChhc2VjdGlvbiAqKSBOVUxMCi0gICAgICAmJiBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRhdGEiKSA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChvYmpfYnNzc2VjIChhYmZkKSA9PSAoYXNlY3Rpb24gKikgTlVMTAotICAgICAgJiYgYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5ic3MiKSA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fc29tZV9hb3V0X29iamVjdF9wCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX3RhcmdldCAqYW91dF9AdmFye3NpemV9X3NvbWVfYW91dF9vYmplY3RfcAotCSAoYmZkICphYmZkLAotCSAgY29uc3QgYmZkX3RhcmdldCAqKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKSgpKTsKLQotREVTQ1JJUFRJT04KLQlTb21lIGEub3V0IHZhcmlhbnQgdGhpbmtzIHRoYXQgdGhlIGZpbGUgb3BlbiBpbiBAdmFye2FiZmR9Ci0JY2hlY2tpbmcgaXMgYW4gYS5vdXQgZmlsZS4gIERvIHNvbWUgbW9yZSBjaGVja2luZywgYW5kIHNldCB1cAotCWZvciBhY2Nlc3MgaWYgaXQgcmVhbGx5IGlzLiAgQ2FsbCBiYWNrIHRvIHRoZSBjYWxsaW5nCi0JZW52aXJvbm1lbnQncyAiZmluaXNoIHVwIiBmdW5jdGlvbiBqdXN0IGJlZm9yZSByZXR1cm5pbmcsIHRvCi0JaGFuZGxlIGFueSBsYXN0LW1pbnV0ZSBzZXR1cC4KLSovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotTkFNRShhb3V0LHNvbWVfYW91dF9vYmplY3RfcCkgKGFiZmQsIGV4ZWNwLCBjYWxsYmFja190b19yZWFsX29iamVjdF9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgY29uc3QgYmZkX3RhcmdldCAqKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotewotICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqcmF3cHRyLCAqb2xkcmF3cHRyOwotICBjb25zdCBiZmRfdGFyZ2V0ICpyZXN1bHQ7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgb2xkcmF3cHRyID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhOwotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0KLSAgLyogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIG9sZCB0ZGF0YSBzdHJ1Y3QuCi0gICAgIEluIHBhcnRpY3VsYXIsIHdlIHdhbnQgdGhlIHN1YmZvcm1hdCwgc2luY2UgZm9yIGhwdXggaXQgd2FzIHNldCBpbgotICAgICBocDMwMGhwdXguYzpzd2FwX2V4ZWNfaGVhZGVyX2luIGFuZCB3aWxsIGJlIHVzZWQgaW4KLSAgICAgaHAzMDBocHV4LmM6Y2FsbGJhY2suICAqLwotICBpZiAob2xkcmF3cHRyICE9IE5VTEwpCi0gICAgKmFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9ICpvbGRyYXdwdHI7Ci0KLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkciA9ICZyYXdwdHItPmU7Ci0gICooYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcikgPSAqZXhlY3A7CS8qIENvcHkgaW4gdGhlIGludGVybmFsX2V4ZWMgc3RydWN0ICovCi0gIGV4ZWNwID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcjsKLQotICAvKiBTZXQgdGhlIGZpbGUgZmxhZ3MgKi8KLSAgYWJmZC0+ZmxhZ3MgPSBCRkRfTk9fRkxBR1M7Ci0gIGlmIChleGVjcC0+YV9kcnNpemUgfHwgZXhlY3AtPmFfdHJzaXplKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgLyogU2V0dGluZyBvZiBFWEVDX1AgaGFzIGJlZW4gZGVmZXJyZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGlzIGZ1bmN0aW9uICovCi0gIGlmIChleGVjcC0+YV9zeW1zKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0gIGlmIChOX0RZTkFNSUMoKmV4ZWNwKSkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGlmIChOX01BR0lDICgqZXhlY3ApID09IFpNQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEIHwgV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IFFNQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEIHwgV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0gICAgICBhZGF0YSAoYWJmZCkuc3ViZm9ybWF0ID0gcV9tYWdpY19mb3JtYXQ7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE5NQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gbl9tYWdpYzsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gT01BR0lDCi0JICAgfHwgTl9NQUdJQyAoKmV4ZWNwKSA9PSBCTUFHSUMpCi0gICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gb19tYWdpYzsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNob3VsZCBoYXZlIGJlZW4gY2hlY2tlZCB3aXRoIE5fQkFETUFHIGJlZm9yZSB0aGlzIHJvdXRpbmUKLQkgd2FzIGNhbGxlZC4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSA9IGV4ZWNwLT5hX2VudHJ5OwotCi0gIG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpID0gKGFvdXRfc3ltYm9sX3R5cGUgKilOVUxMOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGV4ZWNwLT5hX3N5bXMgLyBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCk7Ci0KLSAgLyogVGhlIGRlZmF1bHQgcmVsb2NhdGlvbiBlbnRyeSBzaXplIGlzIHRoYXQgb2YgdHJhZGl0aW9uYWwgVjcgVW5peC4gICovCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIC8qIFRoZSBkZWZhdWx0IHN5bWJvbCBlbnRyeSBzaXplIGlzIHRoYXQgb2YgdHJhZGl0aW9uYWwgVW5peC4gKi8KLSAgb2JqX3N5bWJvbF9lbnRyeV9zaXplIChhYmZkKSA9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0KLSNpZmRlZiBVU0VfTU1BUAotICBiZmRfaW5pdF93aW5kb3cgKCZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSk7Ci0gIGJmZF9pbml0X3dpbmRvdyAoJm9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpKTsKLSNlbmRpZgotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gTlVMTDsKLSAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBOVUxMOwotCi0gIGlmICghIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9kYXRhOwotICBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfYnNzOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmxhZ3MgPQotICAgIChleGVjcC0+YV90cnNpemUgIT0gMAotICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKLSAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9Ci0gICAgKGV4ZWNwLT5hX2Ryc2l6ZSAhPSAwCi0gICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQotICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUykpOwotICBvYmpfYnNzc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0KLSNpZmRlZiBUSElTX0lTX09OTFlfRE9DVU1FTlRBVElPTgotICAvKiBUaGUgY29tbW9uIGNvZGUgY2FuJ3QgZmlsbCBpbiB0aGVzZSB0aGluZ3MgYmVjYXVzZSB0aGV5IGRlcGVuZAotICAgICBvbiBlaXRoZXIgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHRleHQgc2VnbWVudCwgdGhlIHJvdW5kaW5nCi0gICAgIHVwIG9mIHZpcnR1YWwgYWRkcmVzc2VzIGJldHdlZW4gc2VnbWVudHMsIG9yIHRoZSBzdGFydGluZyBmaWxlCi0gICAgIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHNlZ21lbnQgLS0gYWxsIG9mIHdoaWNoIHZhcmllcyBhbW9uZyBkaWZmZXJlbnQKLSAgICAgdmVyc2lvbnMgb2YgYS5vdXQuICAqLwotCi0gIC8qIENhbGwgYmFjayB0byB0aGUgZm9ybWF0LWRlcGVuZGVudCBjb2RlIHRvIGZpbGwgaW4gdGhlIHJlc3Qgb2YgdGhlCi0gICAgIGZpZWxkcyBhbmQgZG8gYW55IGZ1cnRoZXIgY2xlYW51cC4gIFRoaW5ncyB0aGF0IHNob3VsZCBiZSBmaWxsZWQKLSAgICAgaW4gYnkgdGhlIGNhbGxiYWNrOiAgKi8KLQotICBzdHJ1Y3QgZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5zaXplID0gTl9UWFRTSVpFKCpleGVjcCk7Ci0gIG9ial90ZXh0c2VjIChhYmZkKS0+cmF3X3NpemUgPSBOX1RYVFNJWkUoKmV4ZWNwKTsKLSAgLyogZGF0YSBhbmQgYnNzIGFyZSBhbHJlYWR5IGZpbGxlZCBpbiBzaW5jZSB0aGV5J3JlIHNvIHN0YW5kYXJkICovCi0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBOX0RBVEFERFIoKmV4ZWNwKTsKLSAgb2JqX2Jzc3NlYyAgKGFiZmQpLT52bWEgPSBOX0JTU0FERFIoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzZWN0aW9ucyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX1RYVE9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRigqZXhlY3ApOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUkVMT0ZGKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsX2ZpbGVwb3MgPSBOX0RSRUxPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSBOX1NUUk9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fU1lNT0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChOX01BQ0hUWVBFICgqZXhlY19oZHIgKGFiZmQpKSkgewotICBkZWZhdWx0OgotICAgIGFiZmQtPm9ial9hcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICBicmVhazsKLSAgfQotCi0gIGFkYXRhKGFiZmQpLT5wYWdlX3NpemUgPSBUQVJHRVRfUEFHRV9TSVpFOwotICBhZGF0YShhYmZkKS0+c2VnbWVudF9zaXplID0gU0VHTUVOVF9TSVpFOwotICBhZGF0YShhYmZkKS0+ZXhlY19ieXRlc19zaXplID0gRVhFQ19CWVRFU19TSVpFOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gIC8qIFRoZSBhcmNoaXRlY3R1cmUgaXMgZW5jb2RlZCBpbiB2YXJpb3VzIHdheXMgaW4gdmFyaW91cyBhLm91dCB2YXJpYW50cywKLSAgICAgb3IgaXMgbm90IGVuY29kZWQgYXQgYWxsIGluIHNvbWUgb2YgdGhlbS4gIFRoZSByZWxvY2F0aW9uIHNpemUgZGVwZW5kcwotICAgICBvbiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCB0aGUgYS5vdXQgdmFyaWFudC4gIEZpbmFsbHksIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgaXMgdGhlIGJmZF90YXJnZXQgdmVjdG9yIGluIHVzZS4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIHplcm8gYW5kCi0gICAgIHNldCBiZmRfZXJyb3IgdG8gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCi0KLSAgICAgRm9ybWF0cyBzdWNoIGFzIGIub3V0LCB3aGljaCBoYXZlIGFkZGl0aW9uYWwgZmllbGRzIGluIHRoZSBhLm91dAotICAgICBoZWFkZXIsIHNob3VsZCBjb3BlIHdpdGggdGhlbSBpbiB0aGlzIGNhbGxiYWNrIGFzIHdlbGwuICAqLwotI2VuZGlmCQkJCS8qIERPQ1VNRU5UQVRJT04gKi8KLQotICByZXN1bHQgPSAoKmNhbGxiYWNrX3RvX3JlYWxfb2JqZWN0X3ApKGFiZmQpOwotCi0gIC8qIE5vdyB0aGF0IHRoZSBzZWdtZW50IGFkZHJlc3NlcyBoYXZlIGJlZW4gd29ya2VkIG91dCwgdGFrZSBhIGJldHRlcgotICAgICBndWVzcyBhdCB3aGV0aGVyIHRoZSBmaWxlIGlzIGV4ZWN1dGFibGUuICBJZiB0aGUgZW50cnkgcG9pbnQKLSAgICAgaXMgd2l0aGluIHRoZSB0ZXh0IHNlZ21lbnQsIGFzc3VtZSBpdCBpcy4gIChUaGlzIG1ha2VzIGZpbGVzCi0gICAgIGV4ZWN1dGFibGUgZXZlbiBpZiB0aGVpciBlbnRyeSBwb2ludCBhZGRyZXNzIGlzIDAsIGFzIGxvbmcgYXMKLSAgICAgdGhlaXIgdGV4dCBzdGFydHMgYXQgemVyby4pLgotCi0gICAgIFRoaXMgdGVzdCBoYWQgdG8gYmUgY2hhbmdlZCB0byBkZWFsIHdpdGggc3lzdGVtcyB3aGVyZSB0aGUgdGV4dCBzZWdtZW50Ci0gICAgIHJ1bnMgYXQgYSBkaWZmZXJlbnQgbG9jYXRpb24gdGhhbiB0aGUgZGVmYXVsdC4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgdGhlCi0gICAgIGVudHJ5IGFkZHJlc3MgY2FuIGFwcGVhciB0byBiZSBvdXRzaWRlIHRoZSB0ZXh0IHNlZ21lbnQsIHRodXMgY2F1c2luZyBhbgotICAgICBlcnJvbmVvdXMgY29uY2x1c2lvbiB0aGF0IHRoZSBmaWxlIGlzbid0IGV4ZWN1dGFibGUuCi0KLSAgICAgVG8gZml4IHRoaXMsIHdlIG5vdyBhY2NlcHQgYW55IG5vbi16ZXJvIGVudHJ5IHBvaW50IGFzIGFuIGluZGljYXRpb24gb2YKLSAgICAgZXhlY3V0YWJpbGl0eS4gIFRoaXMgd2lsbCB3b3JrIG1vc3Qgb2YgdGhlIHRpbWUsIHNpbmNlIG9ubHkgdGhlIGxpbmtlcgotICAgICBzZXRzIHRoZSBlbnRyeSBwb2ludCwgYW5kIHRoYXQgaXMgbGlrZWx5IHRvIGJlIG5vbi16ZXJvIGZvciBtb3N0IHN5c3RlbXMuICovCi0KLSAgaWYgKGV4ZWNwLT5hX2VudHJ5ICE9IDAKLSAgICAgIHx8IChleGVjcC0+YV9lbnRyeSA+PSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hCi0JICAmJiBleGVjcC0+YV9lbnRyeSA8IG9ial90ZXh0c2VjKGFiZmQpLT52bWEgKyBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplKSkKLSAgICBhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0jaWZkZWYgU1RBVF9GT1JfRVhFQwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgc3RhdF9idWY7Ci0KLSAgICAgIC8qIFRoZSBvcmlnaW5hbCBoZXVyaXN0aWMgZG9lc24ndCB3b3JrIGluIHNvbWUgaW1wb3J0YW50IGNhc2VzLgotICAgICAgICBUaGUgYS5vdXQgZmlsZSBoYXMgbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRleHQgc3RhcnQKLSAgICAgICAgYWRkcmVzcy4gIEZvciBmaWxlcyAobGlrZSBrZXJuZWxzKSBsaW5rZWQgdG8gbm9uLXN0YW5kYXJkCi0gICAgICAgIGFkZHJlc3NlcyAobGQgLVR0ZXh0IG5ubikgdGhlIGVudHJ5IHBvaW50IG1heSBub3QgYmUgYmV0d2VlbgotICAgICAgICB0aGUgZGVmYXVsdCB0ZXh0IHN0YXJ0IChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSBhbmQKLSAgICAgICAgKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpICsgdGV4dCBzaXplLiAgVGhpcyBpcyBub3QganVzdCBhIG1hY2gKLSAgICAgICAgaXNzdWUuICBNYW55IGtlcm5lbHMgYXJlIGxvYWRlZCBhdCBub24gc3RhbmRhcmQgYWRkcmVzc2VzLiAgKi8KLSAgICAgIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSA9PSAwCi0JICAmJiAoZnN0YXQoZmlsZW5vKChGSUxFICopIChhYmZkLT5pb3N0cmVhbSkpLCAmc3RhdF9idWYpID09IDApCi0JICAmJiAoKHN0YXRfYnVmLnN0X21vZGUgJiAwMTExKSAhPSAwKSkKLQlhYmZkLT5mbGFncyB8PSBFWEVDX1A7Ci0gICAgfQotI2VuZGlmIC8qIFNUQVRfRk9SX0VYRUMgKi8KLQotICBpZiAocmVzdWx0KQotICAgIHsKLSNpZiAwIC8qIFRoZXNlIHNob3VsZCBiZSBzZXQgY29ycmVjdGx5IGFueXdheXMuICAqLwotICAgICAgYWJmZC0+c2VjdGlvbnMgPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0gICAgICBvYmpfdGV4dHNlYyAoYWJmZCktPm5leHQgPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBvYmpfYnNzc2VjIChhYmZkKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZyZWUgKHJhd3B0cik7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSBvbGRyYXdwdHI7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKgotRlVOQ1RJT04KLQlhb3V0X0B2YXJ7c2l6ZX1fbWtvYmplY3QKLQotU1lOT1BTSVMKLQlib29sZWFuIGFvdXRfQHZhcntzaXplfV9ta29iamVjdCwgKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JSW5pdGlhbGl6ZSBCRkQgQHZhcnthYmZkfSBmb3IgdXNlIHdpdGggYS5vdXQgZmlsZXMuCi0qLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbWtvYmplY3QpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICAqcmF3cHRyOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogVXNlIGFuIGludGVybWVkaWF0ZSB2YXJpYWJsZSBmb3IgY2xhcml0eSAqLwotICByYXdwdHIgPSAoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKiliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICkpOwotCi0gIGlmIChyYXdwdHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotICBleGVjX2hkciAoYWJmZCkgPSAmKHJhd3B0ci0+ZSk7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2Jzc3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9tYWNoaW5lX3R5cGUKLQotU1lOT1BTSVMKLQllbnVtIG1hY2hpbmVfdHlwZSAgYW91dF9AdmFye3NpemV9X21hY2hpbmVfdHlwZQotCSAoZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotREVTQ1JJUFRJT04KLQlLZWVwIHRyYWNrIG9mIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgZm9yCi0JYS5vdXQncy4gUmV0dXJuIHRoZSA8PG1hY2hpbmVfdHlwZT4+IGZvciBhIHBhcnRpY3VsYXIKLQlhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUsIG9yIDw8TV9VTktOT1dOPj4gaWYgdGhhdCBleGFjdCBhcmNoaXRlY3R1cmUKLQlhbmQgbWFjaGluZSBjYW4ndCBiZSByZXByZXNlbnRlZCBpbiBhLm91dCBmb3JtYXQuCi0KLQlJZiB0aGUgYXJjaGl0ZWN0dXJlIGlzIHVuZGVyc3Rvb2QsIG1hY2hpbmUgdHlwZSAwIChkZWZhdWx0KQotCWlzIGFsd2F5cyB1bmRlcnN0b29kLgotKi8KLQotZW51bSBtYWNoaW5lX3R5cGUKLU5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIChhcmNoLCBtYWNoaW5lLCB1bmtub3duKQotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotICAgICBib29sZWFuICp1bmtub3duOwotewotICBlbnVtIG1hY2hpbmVfdHlwZSBhcmNoX2ZsYWdzOwotCi0gIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047Ci0gICp1bmtub3duID0gdHJ1ZTsKLQotICBzd2l0Y2ggKGFyY2gpIHsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBpZiAobWFjaGluZSA9PSAwCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyYwotCXx8IG1hY2hpbmUgPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlCi0JfHwgbWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUKLQl8fCBtYWNoaW5lID09IGJmZF9tYWNoX3NwYXJjX3Y5KQotICAgICAgYXJjaF9mbGFncyA9IE1fU1BBUkM7Ci0gICAgZWxzZSBpZiAobWFjaGluZSA9PSBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCkKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX1NQQVJDTEVUOwotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICBzd2l0Y2ggKG1hY2hpbmUpIHsKLSAgICBjYXNlIDA6CQkgIGFyY2hfZmxhZ3MgPSBNXzY4MDEwOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAwMDogYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsgKnVua25vd24gPSBmYWxzZTsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6IGFyY2hfZmxhZ3MgPSBNXzY4MDEwOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAyMDogYXJjaF9mbGFncyA9IE1fNjgwMjA7IGJyZWFrOwotICAgIGRlZmF1bHQ6CQkgIGFyY2hfZmxhZ3MgPSBNX1VOS05PV047IGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgaWYgKG1hY2hpbmUgPT0gMCkJYXJjaF9mbGFncyA9IE1fMzg2OwotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICBpZiAobWFjaGluZSA9PSAwKQlhcmNoX2ZsYWdzID0gTV8yOUs7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBiZmRfYXJjaF9hcm06Ci0gICAgaWYgKG1hY2hpbmUgPT0gMCkJYXJjaF9mbGFncyA9IE1fQVJNOwotICAgIGJyZWFrOwotICAgIAotICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgc3dpdGNoIChtYWNoaW5lKSB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczMwMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzMzkwMDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX01JUFMxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNjAwMDoKLSAgICAgIGFyY2hfZmxhZ3MgPSBNX01JUFMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDAwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDEwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDMwMDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2MDA6Ci0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDY1MDoKLSAgICBjYXNlIGJmZF9tYWNoX21pcHM4MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczEwMDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczE2OgotICAgICAgLyogRklYTUU6IFRoZXNlIHNob3VsZCBiZSBNSVBTMyBvciBNSVBTNC4gICovCi0gICAgICBhcmNoX2ZsYWdzID0gTV9NSVBTMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhcmNoX2ZsYWdzID0gTV9VTktOT1dOOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gIGNhc2UgYmZkX2FyY2hfbnMzMms6Ci0gICAgc3dpdGNoIChtYWNoaW5lKSB7Ci0gICAgY2FzZSAwOiAgICAJCWFyY2hfZmxhZ3MgPSBNX05TMzI1MzI7IGJyZWFrOwotICAgIGNhc2UgMzIwMzI6CQlhcmNoX2ZsYWdzID0gTV9OUzMyMDMyOyBicmVhazsKLSAgICBjYXNlIDMyNTMyOgkJYXJjaF9mbGFncyA9IE1fTlMzMjUzMjsgYnJlYWs7Ci0gICAgZGVmYXVsdDoJCWFyY2hfZmxhZ3MgPSBNX1VOS05PV047IGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLQotICBjYXNlIGJmZF9hcmNoX3ZheDoKLSAgICAqdW5rbm93biA9IGZhbHNlOwotICAgIGJyZWFrOwotCi0gIGRlZmF1bHQ6Ci0gICAgYXJjaF9mbGFncyA9IE1fVU5LTk9XTjsKLSAgfQotCi0gIGlmIChhcmNoX2ZsYWdzICE9IE1fVU5LTk9XTikKLSAgICAqdW5rbm93biA9IGZhbHNlOwotCi0gIHJldHVybiBhcmNoX2ZsYWdzOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9zZXRfYXJjaF9tYWNoCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBhb3V0X0B2YXJ7c2l6ZX1fc2V0X2FyY2hfbWFjaCwKLQkgKGJmZCAqLAotCSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JICB1bnNpZ25lZCBsb25nIG1hY2hpbmUpKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgdGhlIG1hY2hpbmUgb2YgdGhlIEJGRCBAdmFye2FiZmR9IHRvIHRoZQotCXZhbHVlcyBAdmFye2FyY2h9IGFuZCBAdmFye21hY2hpbmV9LiAgVmVyaWZ5IHRoYXQgQHZhcnthYmZkfSdzIGZvcm1hdAotCWNhbiBzdXBwb3J0IHRoZSBhcmNoaXRlY3R1cmUgcmVxdWlyZWQuCi0qLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2V0X2FyY2hfbWFjaCkgKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgewotICAgICAgYm9vbGVhbiB1bmtub3duOwotCi0gICAgICBOQU1FKGFvdXQsbWFjaGluZV90eXBlKSAoYXJjaCwgbWFjaGluZSwgJnVua25vd24pOwotICAgICAgaWYgKHVua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5ICovCi0gIHN3aXRjaCAoYXJjaCkgewotICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gIGNhc2UgYmZkX2FyY2hfbWlwczoKLSAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19FWFRfU0laRTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiAoKmFvdXRfYmFja2VuZF9pbmZvKGFiZmQpLT5zZXRfc2l6ZXMpIChhYmZkKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9vX21hZ2ljIChhYmZkLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci17Ci0gIGZpbGVfcHRyIHBvcyA9IGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGJmZF92bWEgdm1hID0gMDsKLSAgaW50IHBhZCA9IDA7Ci0KLSAgLyogVGV4dC4gICovCi0gIG9ial90ZXh0c2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBpZiAoIW9ial90ZXh0c2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgZWxzZQotICAgIHZtYSA9IG9ial90ZXh0c2VjKGFiZmQpLT52bWE7Ci0KLSAgcG9zICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIHZtYSArPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotCi0gIC8qIERhdGEuICAqLwotICBpZiAoIW9ial9kYXRhc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgewotI2lmIDAJICAgIC8qID8/IERvZXMgYWxpZ25tZW50IGluIHRoZSBmaWxlIGltYWdlIHJlYWxseSBtYXR0ZXI/ICovCi0gICAgICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfZGF0YXNlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSNlbmRpZgotICAgICAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gICAgICBwb3MgKz0gcGFkOwotICAgICAgdm1hICs9IHBhZDsKLSAgICAgIG9ial9kYXRhc2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gICAgfQotICBlbHNlCi0gICAgdm1hID0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYTsKLSAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0gIHBvcyArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICB2bWEgKz0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLQotICAvKiBCU1MuICAqLwotICBpZiAoIW9ial9ic3NzZWMoYWJmZCktPnVzZXJfc2V0X3ZtYSkKLSAgICB7Ci0jaWYgMAotICAgICAgcGFkID0gYWxpZ25fcG93ZXIgKHZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKSAtIHZtYTsKLSNlbmRpZgotICAgICAgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0gICAgICBwb3MgKz0gcGFkOwotICAgICAgdm1hICs9IHBhZDsKLSAgICAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSA9IHZtYTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGUgVk1BIG9mIHRoZSAuYnNzIHNlY3Rpb24gaXMgc2V0IGJ5IHRoZSB0aGUgVk1BIG9mIHRoZQotICAgICAgICAgLmRhdGEgc2VjdGlvbiBwbHVzIHRoZSBzaXplIG9mIHRoZSAuZGF0YSBzZWN0aW9uLiAgV2UgbWF5Ci0gICAgICAgICBuZWVkIHRvIGFkZCBwYWRkaW5nIGJ5dGVzIHRvIG1ha2UgdGhpcyB0cnVlLiAgKi8KLSAgICAgIHBhZCA9IG9ial9ic3NzZWMgKGFiZmQpLT52bWEgLSB2bWE7Ci0gICAgICBpZiAocGFkID4gMCkKLQl7Ci0JICBvYmpfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSArPSBwYWQ7Ci0JICBwb3MgKz0gcGFkOwotCX0KLSAgICB9Ci0gIG9ial9ic3NzZWMoYWJmZCktPmZpbGVwb3MgPSBwb3M7Ci0KLSAgLyogRml4IHVwIHRoZSBleGVjIGhlYWRlci4gICovCi0gIGV4ZWNwLT5hX3RleHQgPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9kYXRhID0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfYnNzID0gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplOwotICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBPTUFHSUMpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3pfbWFnaWMgKGFiZmQsIGV4ZWNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLXsKLSAgYmZkX3NpemVfdHlwZSBkYXRhX3BhZCwgdGV4dF9wYWQ7Ci0gIGZpbGVfcHRyIHRleHRfZW5kOwotICBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgKmFiZHA7Ci0gIGludCB6dGloOwkJCS8qIE5vbnplcm8gaWYgdGV4dCBpbmNsdWRlcyBleGVjIGhlYWRlci4gICovCi0gIAotICBhYmRwID0gYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpOwotCi0gIC8qIFRleHQuICAqLwotICB6dGloID0gKGFiZHAgIT0gTlVMTAotCSAgJiYgKGFiZHAtPnRleHRfaW5jbHVkZXNfaGVhZGVyCi0JICAgICAgfHwgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBxX21hZ2ljX2Zvcm1hdCkpOwotICBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcyA9ICh6dGloCi0JCQkJPyBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemUKLQkJCQk6IGFkYXRhKGFiZmQpLnptYWdpY19kaXNrX2Jsb2NrX3NpemUpOwotICBpZiAoISBvYmpfdGV4dHNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSAgICAgIC8qID8/IERvIHdlIHJlYWxseSBuZWVkIHRvIGNoZWNrIGZvciByZWxvY3MgaGVyZT8gICovCi0gICAgICBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hID0gKChhYmZkLT5mbGFncyAmIEhBU19SRUxPQykKLQkJCQk/IDAKLQkJCQk6ICh6dGloCi0JCQkJICAgPyAoYWJkcC0+ZGVmYXVsdF90ZXh0X3ZtYQotCQkJCSAgICAgICsgYWRhdGEoYWJmZCkuZXhlY19ieXRlc19zaXplKQotCQkJCSAgIDogYWJkcC0+ZGVmYXVsdF90ZXh0X3ZtYSkpOwotICAgICAgdGV4dF9wYWQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSAudGV4dCBzZWN0aW9uIGlzIGJlaW5nIGxvYWRlZCBhdCBhbiB1bnVzdWFsIGFkZHJlc3MuICBXZQotICAgICAgICAgbWF5IG5lZWQgdG8gcGFkIGl0IHN1Y2ggdGhhdCB0aGUgLmRhdGEgc2VjdGlvbiBzdGFydHMgYXQgYSBwYWdlCi0gICAgICAgICBib3VuZGFyeS4gICovCi0gICAgICBpZiAoenRpaCkKLQl0ZXh0X3BhZCA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zIC0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWEpCi0JCSAgICAmIChhZGF0YSAoYWJmZCkucGFnZV9zaXplIC0gMSkpOwotICAgICAgZWxzZQotCXRleHRfcGFkID0gKCgtIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hKQotCQkgICAgJiAoYWRhdGEgKGFiZmQpLnBhZ2Vfc2l6ZSAtIDEpKTsKLSAgICB9Ci0KLSAgLyogRmluZCBzdGFydCBvZiBkYXRhLiAgKi8KLSAgaWYgKHp0aWgpCi0gICAgewotICAgICAgdGV4dF9lbmQgPSBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgKyBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgICAgIHRleHRfcGFkICs9IEJGRF9BTElHTiAodGV4dF9lbmQsIGFkYXRhIChhYmZkKS5wYWdlX3NpemUpIC0gdGV4dF9lbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTm90ZSB0aGF0IGlmIHBhZ2Vfc2l6ZSA9PSB6bWFnaWNfZGlza19ibG9ja19zaXplLCB0aGVuCi0JIGZpbGVwb3MgPT0gcGFnZV9zaXplLCBhbmQgdGhpcyBjYXNlIGlzIHRoZSBzYW1lIGFzIHRoZSB6dGloCi0JIGNhc2UuICAqLwotICAgICAgdGV4dF9lbmQgPSBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgICAgIHRleHRfcGFkICs9IEJGRF9BTElHTiAodGV4dF9lbmQsIGFkYXRhIChhYmZkKS5wYWdlX3NpemUpIC0gdGV4dF9lbmQ7Ci0gICAgICB0ZXh0X2VuZCArPSBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3M7Ci0gICAgfQotICBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHRleHRfcGFkOwotICB0ZXh0X2VuZCArPSB0ZXh0X3BhZDsKLQotICAvKiBEYXRhLiAgKi8KLSAgaWYgKCFvYmpfZGF0YXNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIHsKLSAgICAgIGJmZF92bWEgdm1hOwotICAgICAgdm1hID0gb2JqX3RleHRzZWMoYWJmZCktPnZtYSArIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gICAgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hID0gQkZEX0FMSUdOICh2bWEsIGFkYXRhKGFiZmQpLnNlZ21lbnRfc2l6ZSk7Ci0gICAgfQotICBpZiAoYWJkcCAmJiBhYmRwLT56bWFnaWNfbWFwcGVkX2NvbnRpZ3VvdXMpCi0gICAgewotICAgICAgdGV4dF9wYWQgPSAob2JqX2RhdGFzZWMoYWJmZCktPnZtYQotCQkgIC0gb2JqX3RleHRzZWMoYWJmZCktPnZtYQotCQkgIC0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSk7Ci0gICAgICBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHRleHRfcGFkOwotICAgIH0KLSAgb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MgPSAob2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MKLQkJCQkrIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpOwotICAKLSAgLyogRml4IHVwIGV4ZWMgaGVhZGVyIHdoaWxlIHdlJ3JlIGF0IGl0LiAgKi8KLSAgZXhlY3AtPmFfdGV4dCA9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0gIGlmICh6dGloICYmICghYWJkcCB8fCAoYWJkcCAmJiAhYWJkcC0+ZXhlY19oZWFkZXJfbm90X2NvdW50ZWQpKSkKLSAgICBleGVjcC0+YV90ZXh0ICs9IGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gcV9tYWdpY19mb3JtYXQpCi0gICAgTl9TRVRfTUFHSUMgKCpleGVjcCwgUU1BR0lDKTsKLSAgZWxzZQotICAgIE5fU0VUX01BR0lDICgqZXhlY3AsIFpNQUdJQyk7Ci0KLSAgLyogU3BlYyBzYXlzIGRhdGEgc2VjdGlvbiBzaG91bGQgYmUgcm91bmRlZCB1cCB0byBwYWdlIGJvdW5kYXJ5LiAgKi8KLSAgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZQotICAgID0gYWxpZ25fcG93ZXIgKG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JCSAgIG9ial9ic3NzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcik7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBCRkRfQUxJR04gKG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUsCi0JCQkgICAgIGFkYXRhKGFiZmQpLnBhZ2Vfc2l6ZSk7Ci0gIGRhdGFfcGFkID0gZXhlY3AtPmFfZGF0YSAtIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogQlNTLiAgKi8KLSAgaWYgKCFvYmpfYnNzc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hID0gKG9ial9kYXRhc2VjKGFiZmQpLT52bWEKLQkJCSAgICAgKyBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplKTsKLSAgLyogSWYgdGhlIEJTUyBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBkYXRhIHNlY3Rpb24gYW5kIGV4dHJhIHNwYWNlCi0gICAgIGluIHRoZSBwYWdlIGlzIGxlZnQgYWZ0ZXIgdGhlIGRhdGEgc2VjdGlvbiwgZnVkZ2UgZGF0YQotICAgICBpbiB0aGUgaGVhZGVyIHNvIHRoYXQgdGhlIGJzcyBzZWN0aW9uIGxvb2tzIHNtYWxsZXIgYnkgdGhhdAotICAgICBhbW91bnQuICBXZSdsbCBzdGFydCB0aGUgYnNzIHNlY3Rpb24gdGhlcmUsIGFuZCBsaWUgdG8gdGhlIE9TLgotICAgICAoTm90ZSB0aGF0IGEgbGlua2VyIHNjcmlwdCwgYXMgd2VsbCBhcyB0aGUgYWJvdmUgYXNzaWdubWVudCwKLSAgICAgY291bGQgaGF2ZSBleHBsaWNpdGx5IHNldCB0aGUgQlNTIHZtYSB0byBpbW1lZGlhdGVseSBmb2xsb3cKLSAgICAgdGhlIGRhdGEgc2VjdGlvbi4pICAqLwotICBpZiAoYWxpZ25fcG93ZXIgKG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyKQotICAgICAgPT0gb2JqX2RhdGFzZWMoYWJmZCktPnZtYSArIG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemUpCi0gICAgZXhlY3AtPmFfYnNzID0gKGRhdGFfcGFkID4gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplKSA/IDAgOgotICAgICAgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplIC0gZGF0YV9wYWQ7Ci0gIGVsc2UKLSAgICBleGVjcC0+YV9ic3MgPSBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfbl9tYWdpYyAoYWJmZCwgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBmaWxlX3B0ciBwb3MgPSBhZGF0YShhYmZkKS5leGVjX2J5dGVzX3NpemU7Ci0gIGJmZF92bWEgdm1hID0gMDsKLSAgaW50IHBhZDsKLSAgCi0gIC8qIFRleHQuICAqLwotICBvYmpfdGV4dHNlYyhhYmZkKS0+ZmlsZXBvcyA9IHBvczsKLSAgaWYgKCFvYmpfdGV4dHNlYyhhYmZkKS0+dXNlcl9zZXRfdm1hKQotICAgIG9ial90ZXh0c2VjKGFiZmQpLT52bWEgPSB2bWE7Ci0gIGVsc2UKLSAgICB2bWEgPSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hOwotICBwb3MgKz0gb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgdm1hICs9IG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogRGF0YS4gICovCi0gIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gcG9zOwotICBpZiAoIW9ial9kYXRhc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSA9IEJGRF9BTElHTiAodm1hLCBhZGF0YShhYmZkKS5zZWdtZW50X3NpemUpOwotICB2bWEgPSBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hOwotICAKLSAgLyogU2luY2UgQlNTIGZvbGxvd3MgZGF0YSBpbW1lZGlhdGVseSwgc2VlIGlmIGl0IG5lZWRzIGFsaWdubWVudC4gICovCi0gIHZtYSArPSBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBwYWQgPSBhbGlnbl9wb3dlciAodm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpIC0gdm1hOwotICBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplICs9IHBhZDsKLSAgcG9zICs9IG9ial9kYXRhc2VjKGFiZmQpLT5fcmF3X3NpemU7Ci0KLSAgLyogQlNTLiAgKi8KLSAgaWYgKCFvYmpfYnNzc2VjKGFiZmQpLT51c2VyX3NldF92bWEpCi0gICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hID0gdm1hOwotICBlbHNlCi0gICAgdm1hID0gb2JqX2Jzc3NlYyhhYmZkKS0+dm1hOwotCi0gIC8qIEZpeCB1cCBleGVjIGhlYWRlci4gICovCi0gIGV4ZWNwLT5hX3RleHQgPSBvYmpfdGV4dHNlYyhhYmZkKS0+X3Jhd19zaXplOwotICBleGVjcC0+YV9kYXRhID0gb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY3AtPmFfYnNzID0gb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplOwotICBOX1NFVF9NQUdJQyAoKmV4ZWNwLCBOTUFHSUMpOwotfQotCi1ib29sZWFuCi1OQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgdGV4dF9zaXplLCB0ZXh0X2VuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlICp0ZXh0X3NpemU7Ci0gICAgIGZpbGVfcHRyICp0ZXh0X2VuZDsKLXsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIGlmICghIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhZGF0YShhYmZkKS5tYWdpYyAhPSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSA9Ci0gICAgYWxpZ25fcG93ZXIob2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkJb2JqX3RleHRzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlcik7Ci0KLSAgKnRleHRfc2l6ZSA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICAvKiBSdWxlIChoZXVyaXN0aWMpIGZvciB3aGVuIHRvIHBhZCB0byBhIG5ldyBwYWdlLiAgTm90ZSB0aGF0IHRoZXJlCi0gICAgIGFyZSAoYXQgbGVhc3QpIHR3byB3YXlzIGRlbWFuZC1wYWdlZCAoWk1BR0lDKSBmaWxlcyBoYXZlIGJlZW4KLSAgICAgaGFuZGxlZC4gIE1vc3QgQmVya2VsZXktYmFzZWQgc3lzdGVtcyBzdGFydCB0aGUgdGV4dCBzZWdtZW50IGF0Ci0gICAgIChUQVJHRVRfUEFHRV9TSVpFKS4gIEhvd2V2ZXIsIG5ld2VyIHZlcnNpb25zIG9mIFNVTk9TIHN0YXJ0IHRoZSB0ZXh0Ci0gICAgIHNlZ21lbnQgcmlnaHQgYWZ0ZXIgdGhlIGV4ZWMgaGVhZGVyOyB0aGUgbGF0dGVyIGlzIGNvdW50ZWQgaW4gdGhlCi0gICAgIHRleHQgc2VnbWVudCBzaXplLCBhbmQgaXMgcGFnZWQgaW4gYnkgdGhlIGtlcm5lbCB3aXRoIHRoZSByZXN0IG9mCi0gICAgIHRoZSB0ZXh0LiAqLwotCi0gIC8qIFRoaXMgcGVyaGFwcyBpc24ndCB0aGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMsIGJ1dCBtYWRlIGl0IHNpbXBsZXIgZm9yIG1lCi0gICAgIHRvIHVuZGVyc3RhbmQgZW5vdWdoIHRvIGltcGxlbWVudCBpdC4gIEJldHRlciB3b3VsZCBwcm9iYWJseSBiZSB0byBnbwotICAgICByaWdodCBmcm9tIEJGRCBmbGFncyB0byBhbGlnbm1lbnQvcG9zaXRpb25pbmcgY2hhcmFjdGVyaXN0aWNzLiAgQnV0IHRoZQotICAgICBvbGQgY29kZSB3YXMgc2xvcHB5IGVub3VnaCBhYm91dCBoYW5kbGluZyB0aGUgZmxhZ3MsIGFuZCBoYWQgZW5vdWdoCi0gICAgIG90aGVyIG1hZ2ljLCB0aGF0IGl0IHdhcyBhIGxpdHRsZSBoYXJkIGZvciBtZSB0byB1bmRlcnN0YW5kLiAgSSB0aGluawotICAgICBJIHVuZGVyc3RhbmQgaXQgYmV0dGVyIG5vdywgYnV0IEkgaGF2ZW4ndCB0aW1lIHRvIGRvIHRoZSBjbGVhbnVwIHRoaXMKLSAgICAgbWludXRlLiAgKi8KLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKQotICAgIC8qIFdoZXRoZXIgb3Igbm90IFdQX1RFWFQgaXMgc2V0IC0tIGxldCBEX1BBR0VEIG92ZXJyaWRlLiAgKi8KLSAgICBhZGF0YShhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0gIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgV1BfVEVYVCkKLSAgICBhZGF0YShhYmZkKS5tYWdpYyA9IG5fbWFnaWM7Ci0gIGVsc2UKLSAgICBhZGF0YShhYmZkKS5tYWdpYyA9IG9fbWFnaWM7Ci0KLSNpZmRlZiBCRkRfQU9VVF9ERUJVRyAvKiByZXF1aXJlcyBnY2MyICovCi0jaWYgX19HTlVDX18gPj0gMgotICBmcHJpbnRmIChzdGRlcnIsICIlcyB0ZXh0PTwleCwleCwleD4gZGF0YT08JXgsJXgsJXg+IGJzcz08JXgsJXgsJXg+XG4iLAotCSAgICh7IGNoYXIgKnN0cjsKLQkgICAgICBzd2l0Y2ggKGFkYXRhKGFiZmQpLm1hZ2ljKSB7Ci0JICAgICAgY2FzZSBuX21hZ2ljOiBzdHIgPSAiTk1BR0lDIjsgYnJlYWs7Ci0JICAgICAgY2FzZSBvX21hZ2ljOiBzdHIgPSAiT01BR0lDIjsgYnJlYWs7Ci0JICAgICAgY2FzZSB6X21hZ2ljOiBzdHIgPSAiWk1BR0lDIjsgYnJlYWs7Ci0JICAgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0JICAgICAgfQotCSAgICAgIHN0cjsKLQkgICAgfSksCi0JICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSwgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX3RleHRzZWMoYWJmZCktPmFsaWdubWVudF9wb3dlciwKLQkgICBvYmpfZGF0YXNlYyhhYmZkKS0+dm1hLCBvYmpfZGF0YXNlYyhhYmZkKS0+X3Jhd19zaXplLAotCSAgIAlvYmpfZGF0YXNlYyhhYmZkKS0+YWxpZ25tZW50X3Bvd2VyLAotCSAgIG9ial9ic3NzZWMoYWJmZCktPnZtYSwgb2JqX2Jzc3NlYyhhYmZkKS0+X3Jhd19zaXplLAotCSAgIAlvYmpfYnNzc2VjKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIpOwotI2VuZGlmCi0jZW5kaWYKLQotICBzd2l0Y2ggKGFkYXRhKGFiZmQpLm1hZ2ljKQotICAgIHsKLSAgICBjYXNlIG9fbWFnaWM6Ci0gICAgICBhZGp1c3Rfb19tYWdpYyAoYWJmZCwgZXhlY3ApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB6X21hZ2ljOgotICAgICAgYWRqdXN0X3pfbWFnaWMgKGFiZmQsIGV4ZWNwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugbl9tYWdpYzoKLSAgICAgIGFkanVzdF9uX21hZ2ljIChhYmZkLCBleGVjcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0jaWZkZWYgQkZEX0FPVVRfREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiICAgICAgIHRleHQ9PCV4LCV4LCV4PiBkYXRhPTwleCwleCwleD4gYnNzPTwleCwleD5cbiIsCi0JICAgb2JqX3RleHRzZWMoYWJmZCktPnZtYSwgb2JqX3RleHRzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MsCi0JICAgb2JqX2RhdGFzZWMoYWJmZCktPnZtYSwgb2JqX2RhdGFzZWMoYWJmZCktPl9yYXdfc2l6ZSwKLQkgICAJb2JqX2RhdGFzZWMoYWJmZCktPmZpbGVwb3MsCi0JICAgb2JqX2Jzc3NlYyhhYmZkKS0+dm1hLCBvYmpfYnNzc2VjKGFiZmQpLT5fcmF3X3NpemUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWFvdXRfQHZhcntzaXplfV9uZXdfc2VjdGlvbl9ob29rCi0KLVNZTk9QU0lTCi0gICAgICAgIGJvb2xlYW4gYW91dF9AdmFye3NpemV9X25ld19zZWN0aW9uX2hvb2ssCi0JICAgKGJmZCAqYWJmZCwKLQkgICAgYXNlY3Rpb24gKm5ld3NlY3QpKTsKLQotREVTQ1JJUFRJT04KLQlDYWxsZWQgYnkgdGhlIEJGRCBpbiByZXNwb25zZSB0byBhIEBjb2Rle2JmZF9tYWtlX3NlY3Rpb259Ci0JcmVxdWVzdC4KLSovCi1ib29sZWFuCi1OQU1FKGFvdXQsbmV3X3NlY3Rpb25faG9vaykgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIC8qIGFsaWduIHRvIGRvdWJsZSBhdCBsZWFzdCAqLwotICBuZXdzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSBiZmRfZ2V0X2FyY2hfaW5mbyhhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLQotCi0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX29iamVjdCkKLSAgewotICAgIGlmIChvYmpfdGV4dHNlYyhhYmZkKSA9PSBOVUxMICYmICFzdHJjbXAobmV3c2VjdC0+bmFtZSwgIi50ZXh0IikpIHsKLQlvYmpfdGV4dHNlYyhhYmZkKT0gbmV3c2VjdDsKLQluZXdzZWN0LT50YXJnZXRfaW5kZXggPSBOX1RFWFQ7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICBpZiAob2JqX2RhdGFzZWMoYWJmZCkgPT0gTlVMTCAmJiAhc3RyY21wKG5ld3NlY3QtPm5hbWUsICIuZGF0YSIpKSB7Ci0Jb2JqX2RhdGFzZWMoYWJmZCkgPSBuZXdzZWN0OwotCW5ld3NlY3QtPnRhcmdldF9pbmRleCA9IE5fREFUQTsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgIGlmIChvYmpfYnNzc2VjKGFiZmQpID09IE5VTEwgJiYgIXN0cmNtcChuZXdzZWN0LT5uYW1lLCAiLmJzcyIpKSB7Ci0Jb2JqX2Jzc3NlYyhhYmZkKSA9IG5ld3NlY3Q7Ci0JbmV3c2VjdC0+dGFyZ2V0X2luZGV4ID0gTl9CU1M7Ci0JcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgfQotCi0gIC8qIFdlIGFsbG93IG1vcmUgdGhhbiB0aHJlZSBzZWN0aW9ucyBpbnRlcm5hbGx5ICovCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2V0X3NlY3Rpb25fY29udGVudHMpIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBmaWxlX3B0ciB0ZXh0X2VuZDsKLSAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChzZWN0aW9uICE9IG9ial90ZXh0c2VjIChhYmZkKQotICAgICAgJiYgc2VjdGlvbiAhPSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChjb3VudCAhPSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBmcm9tIGFuIGEub3V0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0KLSAgICAgIGNvdW50ID0gZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgLyBFWFRFUk5BTF9OTElTVF9TSVpFOwotCi0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGlmIChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLAotCQkJICAgICAgIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zLAotCQkJICAgICAgICZvYmpfYW91dF9zeW1fd2luZG93IChhYmZkKSwgdHJ1ZSkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3ltcyA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkuZGF0YTsKLSNlbHNlCi0gICAgICAvKiBXZSBhbGxvY2F0ZSB1c2luZyBtYWxsb2MgdG8gbWFrZSB0aGUgdmFsdWVzIGVhc3kgdG8gZnJlZQotCSBsYXRlciBvbi4gIElmIHdlIHB1dCB0aGVtIG9uIHRoZSBvYmphbGxvYyBpdCBtaWdodCBub3QgYmUKLQkgcG9zc2libGUgdG8gZnJlZSB0aGVtLiAgKi8KLSAgICAgIHN5bXMgPSAoKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKQotCSAgICAgIGJmZF9tYWxsb2MgKChzaXplX3QpIGNvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRSkpOwotICAgICAgaWYgKHN5bXMgPT0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMICYmIGNvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKHN5bXMsIDEsIGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zLCBhYmZkKQotCSAgICAgICE9IGV4ZWNfaGRyIChhYmZkKS0+YV9zeW1zKSkKLQl7Ci0JICBmcmVlIChzeW1zKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYKLQotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBzeW1zOwotICAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKSA9IGNvdW50OwotICAgIH0KLSAgICAgIAotICBpZiAob2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkgPT0gTlVMTAotICAgICAgJiYgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHN0cmluZ19jaGFyc1tCWVRFU19JTl9XT1JEXTsKLSAgICAgIGJmZF9zaXplX3R5cGUgc3RyaW5nc2l6ZTsKLSAgICAgIGNoYXIgKnN0cmluZ3M7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5ncy4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zdHJfZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKChQVFIpIHN0cmluZ19jaGFycywgQllURVNfSU5fV09SRCwgMSwgYWJmZCkKLQkgICAgICAhPSBCWVRFU19JTl9XT1JEKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJpbmdzaXplID0gR0VUX1dPUkQgKGFiZmQsIHN0cmluZ19jaGFycyk7Ci0KLSNpZmRlZiBVU0VfTU1BUAotICAgICAgaWYgKGJmZF9nZXRfZmlsZV93aW5kb3cgKGFiZmQsIG9ial9zdHJfZmlsZXBvcyAoYWJmZCksIHN0cmluZ3NpemUsCi0JCQkgICAgICAgJm9ial9hb3V0X3N0cmluZ193aW5kb3cgKGFiZmQpLCB0cnVlKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzdHJpbmdzID0gKGNoYXIgKikgb2JqX2FvdXRfc3RyaW5nX3dpbmRvdyAoYWJmZCkuZGF0YTsKLSNlbHNlCi0gICAgICBzdHJpbmdzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgc3RyaW5nc2l6ZSArIDEpOwotICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFNraXAgc3BhY2UgZm9yIHRoZSBzdHJpbmcgY291bnQgaW4gdGhlIGJ1ZmZlciBmb3IgY29udmVuaWVuY2UKLQkgd2hlbiB1c2luZyBpbmRleGVzLiAgKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoc3RyaW5ncyArIEJZVEVTX0lOX1dPUkQsIDEsIHN0cmluZ3NpemUgLSBCWVRFU19JTl9XT1JELAotCQkgICAgYWJmZCkKLQkgICE9IHN0cmluZ3NpemUgLSBCWVRFU19JTl9XT1JEKQotCXsKLQkgIGZyZWUgKHN0cmluZ3MpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSNlbmRpZgotCi0gICAgICAvKiBFbnN1cmUgdGhhdCBhIHplcm8gaW5kZXggeWllbGRzIGFuIGVtcHR5IHN0cmluZy4gICovCi0gICAgICBzdHJpbmdzWzBdID0gJ1wwJzsKLQotICAgICAgc3RyaW5nc1tzdHJpbmdzaXplIC0gMV0gPSAwOwotCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IHN0cmluZ3M7Ci0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdfc2l6ZSAoYWJmZCkgPSBzdHJpbmdzaXplOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIGEub3V0IHN5bWJvbCBpbnRvIGEgQkZEIHN5bWJvbC4gIFRoZSBkZXNjLCBvdGhlciwgdHlwZQotICAgYW5kIHN5bWJvbC0+dmFsdWUgZmllbGRzIG9mIENBQ0hFX1BUUiB3aWxsIGJlIHNldCBmcm9tIHRoZSBhLm91dAotICAgbmxpc3Qgc3RydWN0dXJlLiAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3Igc2V0dGluZwotICAgc3ltYm9sLT5mbGFncyBhbmQgc3ltYm9sLT5zZWN0aW9uLCBhbmQgYWRqdXN0aW5nIHN5bWJvbC0+dmFsdWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdHJhbnNsYXRlX2Zyb21fbmF0aXZlX3N5bV9mbGFncyAoYWJmZCwgY2FjaGVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0cjsKLXsKLSAgZmxhZ3dvcmQgdmlzaWJsZTsKLQotICBpZiAoKGNhY2hlX3B0ci0+dHlwZSAmIE5fU1RBQikgIT0gMAotICAgICAgfHwgY2FjaGVfcHRyLT50eXBlID09IE5fRk4pCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgLyogVGhpcyBpcyBhIGRlYnVnZ2luZyBzeW1ib2wuICAqLwotCi0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgICAgIC8qIFdvcmsgb3V0IHRoZSBzeW1ib2wgc2VjdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGNhY2hlX3B0ci0+dHlwZSAmIE5fVFlQRSkKLQl7Ci0JY2FzZSBOX1RFWFQ6Ci0JY2FzZSBOX0ZOOgotCSAgc2VjID0gb2JqX3RleHRzZWMgKGFiZmQpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0RBVEE6Ci0JICBzZWMgPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0JICBicmVhazsKLQljYXNlIE5fQlNTOgotCSAgc2VjID0gb2JqX2Jzc3NlYyAoYWJmZCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgTl9BQlM6Ci0JICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gc2VjOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gc2VjLT52bWE7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBHZXQgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eS4gIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gYWxsIHR5cGVzLCBzbwotICAgICB3ZSBqdXN0IGhvbGQgaXQgaW4gYSBsb2NhbCB2YXJpYWJsZSB0byB1c2UgaWYgd2FudGVkLiAgKi8KLSAgaWYgKChjYWNoZV9wdHItPnR5cGUgJiBOX0VYVCkgPT0gMCkKLSAgICB2aXNpYmxlID0gQlNGX0xPQ0FMOwotICBlbHNlCi0gICAgdmlzaWJsZSA9IEJTRl9HTE9CQUw7Ci0KLSAgc3dpdGNoIChjYWNoZV9wdHItPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBOX0FCUzogY2FzZSBOX0FCUyB8IE5fRVhUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0gICAgICBpZiAoY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgIT0gMCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gICovCi0JICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSAwOwotCSAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fVEVYVDogY2FzZSBOX1RFWFQgfCBOX0VYVDoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC52YWx1ZSAtPSBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IHZpc2libGU7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTl9TRVRWIHN5bWJvbHMgdXNlZCB0byByZXByZXNlbnQgc2V0IHZlY3RvcnMgcGxhY2VkIGluIHRoZQotCSBkYXRhIHNlY3Rpb24uICBUaGV5IGFyZSBubyBsb25nZXIgZ2VuZXJhdGVkLiAgVGhlb3JldGljYWxseSwKLQkgaXQgd2FzIHBvc3NpYmxlIHRvIGV4dHJhY3QgdGhlIGVudHJpZXMgYW5kIGNvbWJpbmUgdGhlbSB3aXRoCi0JIG5ldyBvbmVzLCBhbHRob3VnaCBJIGRvbid0IGtub3cgaWYgdGhhdCB3YXMgZXZlciBhY3R1YWxseQotCSBkb25lLiAgVW5sZXNzIHRoYXQgZmVhdHVyZSBpcyByZXN0b3JlZCwgdHJlYXQgdGhlbSBhcyBkYXRhCi0JIHN5bWJvbHMuICAqLwotICAgIGNhc2UgTl9TRVRWOiBjYXNlIE5fU0VUViB8IE5fRVhUOgotICAgIGNhc2UgTl9EQVRBOiBjYXNlIE5fREFUQSB8IE5fRVhUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gdmlzaWJsZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0JTUzogY2FzZSBOX0JTUyB8IE5fRVhUOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSB2aXNpYmxlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fU0VUQTogY2FzZSBOX1NFVEEgfCBOX0VYVDoKLSAgICBjYXNlIE5fU0VUVDogY2FzZSBOX1NFVFQgfCBOX0VYVDoKLSAgICBjYXNlIE5fU0VURDogY2FzZSBOX1NFVEQgfCBOX0VYVDoKLSAgICBjYXNlIE5fU0VUQjogY2FzZSBOX1NFVEIgfCBOX0VYVDoKLSAgICAgIHsKLQkvKiBUaGlzIGNvZGUgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIEl0IHVzZWQgdG8gYmUgdXNlZCB0byBtYWtlCi0gICAgICAgICAgIHRoZSBsaW5rZXIgaGFuZGxlIHNldCBzeW1ib2xzLCBidXQgdGhleSBhcmUgbm93IGhhbmRsZWQgaW4KLSAgICAgICAgICAgdGhlIGFkZF9zeW1ib2xzIHJvdXRpbmUgaW5zdGVhZC4gICovCi0jaWYgMAotCWFzZWN0aW9uICpzZWN0aW9uOwotCWFyZWxlbnRfY2hhaW4gKnJlbG9jOwotCWFzZWN0aW9uICppbnRvX3NlY3Rpb247Ci0KLQkvKiBUaGlzIGlzIGEgc2V0IHN5bWJvbC4gIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaXMgdGhlIG5hbWUKLQkgICBvZiB0aGUgc2V0IChlLmcuLCBfX0NUT1JfTElTVF9fKS4gIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sCi0JICAgaXMgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgc2V0LiAgV2UgY3JlYXRlIGEgc2VjdGlvbiB3aXRoCi0JICAgdGhlIHNhbWUgbmFtZSBhcyB0aGUgc3ltYm9sLCBhbmQgYWRkIGEgcmVsb2MgdG8gaW5zZXJ0IHRoZQotCSAgIGFwcHJvcHJpYXRlIHZhbHVlIGludG8gdGhlIHNlY3Rpb24uCi0KLQkgICBUaGlzIGFjdGlvbiBpcyBhY3R1YWxseSBvYnNvbGV0ZTsgaXQgdXNlZCB0byBtYWtlIHRoZQotCSAgIGxpbmtlciBkbyB0aGUgcmlnaHQgdGhpbmcsIGJ1dCB0aGUgbGlua2VyIG5vIGxvbmdlciB1c2VzCi0JICAgdGhpcyBmdW5jdGlvbi4gICovCi0KLQlzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUpOwotCWlmIChzZWN0aW9uID09IE5VTEwpCi0JICB7Ci0JICAgIGNoYXIgKmNvcHk7Ci0KLQkgICAgY29weSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChjYWNoZV9wdHItPnN5bWJvbC5uYW1lKSArIDEpOwotCSAgICBpZiAoY29weSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBzdHJjcHkgKGNvcHksIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUpOwotCSAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgY29weSk7Ci0JICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JcmVsb2MgPSAoYXJlbGVudF9jaGFpbiAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXJlbGVudF9jaGFpbikpOwotCWlmIChyZWxvYyA9PSBOVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogQnVpbGQgYSByZWxvY2F0aW9uIGVudHJ5IGZvciB0aGUgY29uc3RydWN0b3IuICAqLwotCXN3aXRjaCAoY2FjaGVfcHRyLT50eXBlICYgTl9UWVBFKQotCSAgewotCSAgY2FzZSBOX1NFVEE6Ci0JICAgIGludG9fc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgIGNhY2hlX3B0ci0+dHlwZSA9IE5fQUJTOwotCSAgICBicmVhazsKLQkgIGNhc2UgTl9TRVRUOgotCSAgICBpbnRvX3NlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICAgIGNhY2hlX3B0ci0+dHlwZSA9IE5fVEVYVDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0VURDoKLQkgICAgaW50b19zZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0RBVEE7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEI6Ci0JICAgIGludG9fc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgICBjYWNoZV9wdHItPnR5cGUgPSBOX0JTUzsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBCdWlsZCBhIHJlbG9jYXRpb24gcG9pbnRpbmcgaW50byB0aGUgY29uc3RydWN0b3Igc2VjdGlvbgotCSAgIHBvaW50aW5nIGF0IHRoZSBzeW1ib2wgaW4gdGhlIHNldCB2ZWN0b3Igc3BlY2lmaWVkLiAgKi8KLQlyZWxvYy0+cmVsZW50LmFkZGVuZCA9IGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlOwotCWNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBpbnRvX3NlY3Rpb247Ci0JcmVsb2MtPnJlbGVudC5zeW1fcHRyX3B0ciA9IGludG9fc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0KLQkvKiBXZSBtb2RpZnkgdGhlIHN5bWJvbCB0byBiZWxvbmcgdG8gYSBzZWN0aW9uIGRlcGVuZGluZyB1cG9uCi0JICAgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCwgYW5kIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbgotCSAgIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wuIEJ1aWxkIGEgcmVsb2MgZW50cnkgdG8KLQkgICByZWxvY2F0ZSB0byB0aGlzIHN5bWJvbCBhdHRhY2hlZCB0byB0aGlzIHNlY3Rpb24uICAqLwotCXNlY3Rpb24tPmZsYWdzID0gU0VDX0NPTlNUUlVDVE9SIHwgU0VDX1JFTE9DOwotCi0Jc2VjdGlvbi0+cmVsb2NfY291bnQrKzsKLQlzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0JcmVsb2MtPm5leHQgPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQlzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbiA9IHJlbG9jOwotCXJlbG9jLT5yZWxlbnQuYWRkcmVzcyA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQlzZWN0aW9uLT5fcmF3X3NpemUgKz0gQllURVNfSU5fV09SRDsKLQotCXJlbG9jLT5yZWxlbnQuaG93dG8gPSBDVE9SX1RBQkxFX1JFTE9DX0hPV1RPKGFiZmQpOwotCi0jZW5kaWYgLyogMCAqLwotCi0Jc3dpdGNoIChjYWNoZV9wdHItPnR5cGUgJiBOX1RZUEUpCi0JICB7Ci0JICBjYXNlIE5fU0VUQToKLQkgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVFQ6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEQ6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBOX1NFVEI6Ci0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYWNoZV9wdHItPnN5bWJvbC5mbGFncyB8PSBCU0ZfQ09OU1RSVUNUT1I7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XQVJOSU5HOgotICAgICAgLyogVGhpcyBzeW1ib2wgaXMgdGhlIHRleHQgb2YgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGUgbmV4dAotCSBzeW1ib2wgaXMgdGhlIHN5bWJvbCB0byBhc3NvY2lhdGUgdGhlIHdhcm5pbmcgd2l0aC4gIElmIGEKLQkgcmVmZXJlbmNlIGlzIG1hZGUgdG8gdGhhdCBzeW1ib2wsIGEgd2FybmluZyBpcyBpc3N1ZWQuICAqLwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HIHwgQlNGX1dBUk5JTkc7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0lORFI6IGNhc2UgTl9JTkRSIHwgTl9FWFQ6Ci0gICAgICAvKiBBbiBpbmRpcmVjdCBzeW1ib2wuICBUaGlzIGNvbnNpc3RzIG9mIHR3byBzeW1ib2xzIGluIGEgcm93LgotCSBUaGUgZmlyc3Qgc3ltYm9sIGlzIHRoZSBuYW1lIG9mIHRoZSBpbmRpcmVjdGlvbi4gIFRoZSBzZWNvbmQKLQkgc3ltYm9sIGlzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQuICBBIHJlZmVyZW5jZSB0byB0aGUgZmlyc3QKLQkgc3ltYm9sIGJlY29tZXMgYSByZWZlcmVuY2UgdG8gdGhlIHNlY29uZC4gICovCi0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkcgfCBCU0ZfSU5ESVJFQ1QgfCB2aXNpYmxlOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9pbmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLVToKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1dFQUtBOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fV0VBS1Q6Ci0gICAgICBjYWNoZV9wdHItPnN5bWJvbC5zZWN0aW9uID0gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgLT0gY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbi0+dm1hOwotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1dFQUtEOgotICAgICAgY2FjaGVfcHRyLT5zeW1ib2wuc2VjdGlvbiA9IG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9XRUFLQjoKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlIC09IGNhY2hlX3B0ci0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLSAgICAgIGNhY2hlX3B0ci0+c3ltYm9sLmZsYWdzID0gQlNGX1dFQUs7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgZmllbGRzIG9mIFNZTV9QT0lOVEVSIGFjY29yZGluZyB0byBDQUNIRV9QVFIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdHJhbnNsYXRlX3RvX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0ciwgc3ltX3BvaW50ZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqY2FjaGVfcHRyOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bV9wb2ludGVyOwotewotICBiZmRfdm1hIHZhbHVlID0gY2FjaGVfcHRyLT52YWx1ZTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSBvZmY7Ci0KLSAgLyogTWFzayBvdXQgYW55IGV4aXN0aW5nIHR5cGUgYml0cyBpbiBjYXNlIGNvcHlpbmcgZnJvbSBvbmUgc2VjdGlvbgotICAgICB0byBhbm90aGVyLiAgKi8KLSAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSAmPSB+Tl9UWVBFOwotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoY2FjaGVfcHRyKTsKLSAgb2ZmID0gMDsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBjYXNlIG9jY3VycywgZS5nLiwgZm9yIHRoZSAqREVCVUcqIHNlY3Rpb24gb2YgYSBDT0ZGCi0JIGZpbGUuICAqLwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGZvciBzeW1ib2wgYCVzJyBpbiBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIAotCSBjYWNoZV9wdHItPm5hbWUgIT0gTlVMTCA/IGNhY2hlX3B0ci0+bmFtZSA6IF8oIip1bmtub3duKiIpKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIG9mZiA9IHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIHNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0FCUzsKLSAgZWxzZSBpZiAoc2VjID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fVEVYVDsKLSAgZWxzZSBpZiAoc2VjID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdIHw9IE5fREFUQTsKLSAgZWxzZSBpZiAoc2VjID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gfD0gTl9CU1M7Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gTl9VTkRGIHwgTl9FWFQ7Ci0gIGVsc2UgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc2VjKSkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gTl9JTkRSOwotICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9IE5fVU5ERiB8IE5fRVhUOwotICBlbHNlCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVHVybiB0aGUgc3ltYm9sIGZyb20gc2VjdGlvbiByZWxhdGl2ZSB0byBhYnNvbHV0ZSBhZ2FpbiAqLwotICB2YWx1ZSArPSBzZWMtPnZtYSArIG9mZjsKLQotICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfV0FSTklORykgIT0gMCkKLSAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gTl9XQVJOSU5HOwotCi0gIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSA9ICgoYW91dF9zeW1ib2xfdHlwZSAqKSBjYWNoZV9wdHIpLT50eXBlOwotICBlbHNlIGlmICgoY2FjaGVfcHRyLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCi0gICAgc3ltX3BvaW50ZXItPmVfdHlwZVswXSB8PSBOX0VYVDsKLQotICBpZiAoKGNhY2hlX3B0ci0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgewotICAgICAgaW50IHR5cGUgPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikgY2FjaGVfcHRyKS0+dHlwZTsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBOX0FCUzoJdHlwZSA9IE5fU0VUQTsgYnJlYWs7Ci0JY2FzZSBOX1RFWFQ6CXR5cGUgPSBOX1NFVFQ7IGJyZWFrOwotCWNhc2UgTl9EQVRBOgl0eXBlID0gTl9TRVREOyBicmVhazsKLQljYXNlIE5fQlNTOgl0eXBlID0gTl9TRVRCOyBicmVhazsKLQl9Ci0gICAgICBzeW1fcG9pbnRlci0+ZV90eXBlWzBdID0gdHlwZTsKLSAgICB9Ci0KLSAgaWYgKChjYWNoZV9wdHItPmZsYWdzICYgQlNGX1dFQUspICE9IDApCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0KLSAgICAgIHN3aXRjaCAoc3ltX3BvaW50ZXItPmVfdHlwZVswXSAmIE5fVFlQRSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIE5fQUJTOgl0eXBlID0gTl9XRUFLQTsgYnJlYWs7Ci0JY2FzZSBOX1RFWFQ6CXR5cGUgPSBOX1dFQUtUOyBicmVhazsKLQljYXNlIE5fREFUQToJdHlwZSA9IE5fV0VBS0Q7IGJyZWFrOwotCWNhc2UgTl9CU1M6CXR5cGUgPSBOX1dFQUtCOyBicmVhazsKLQljYXNlIE5fVU5ERjoJdHlwZSA9IE5fV0VBS1U7IGJyZWFrOwotCX0KLSAgICAgIHN5bV9wb2ludGVyLT5lX3R5cGVbMF0gPSB0eXBlOwotICAgIH0KLQotICBQVVRfV09SRChhYmZkLCB2YWx1ZSwgc3ltX3BvaW50ZXItPmVfdmFsdWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogTmF0aXZlLWxldmVsIGludGVyZmFjZSB0byBzeW1ib2xzLiAqLwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtYWtlX2VtcHR5X3N5bWJvbCkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYW91dF9zeW1ib2xfdHlwZSAgKm5ldyA9Ci0gICAgKGFvdXRfc3ltYm9sX3R5cGUgKiliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFvdXRfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhIHNldCBvZiBpbnRlcm5hbCBzeW1ib2xzIGludG8gZXh0ZXJuYWwgc3ltYm9scy4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCx0cmFuc2xhdGVfc3ltYm9sX3RhYmxlKSAoYWJmZCwgaW4sIGV4dCwgY291bnQsIHN0ciwgc3Ryc2l6ZSwgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhb3V0X3N5bWJvbF90eXBlICppbjsKLSAgICAgc3RydWN0IGV4dGVybmFsX25saXN0ICpleHQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGNoYXIgKnN0cjsKLSAgICAgYmZkX3NpemVfdHlwZSBzdHJzaXplOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0X2VuZDsKLQotICBleHRfZW5kID0gZXh0ICsgY291bnQ7Ci0gIGZvciAoOyBleHQgPCBleHRfZW5kOyBleHQrKywgaW4rKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHg7Ci0KLSAgICAgIHggPSBHRVRfV09SRCAoYWJmZCwgZXh0LT5lX3N0cngpOwotICAgICAgaW4tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotICAgICAgLyogRm9yIHRoZSBub3JtYWwgc3ltYm9scywgdGhlIHplcm8gaW5kZXggcG9pbnRzIGF0IHRoZSBudW1iZXIKLQkgb2YgYnl0ZXMgaW4gdGhlIHN0cmluZyB0YWJsZSBidXQgaXMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgdGhlCi0JIG51bGwgc3RyaW5nLiAgRm9yIHRoZSBkeW5hbWljIHN5bWJvbHMsIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4KLQkgdGhlIHN0cmluZyB0YWJsZSBpcyBzdG9yZWQgaW4gdGhlIF9fRFlOQU1JQyBzdHJ1Y3R1cmUgYW5kIHRoZQotCSB6ZXJvIGluZGV4IHBvaW50cyBhdCBhbiBhY3R1YWwgc3RyaW5nLiAgKi8KLSAgICAgIGlmICh4ID09IDAgJiYgISBkeW5hbWljKQotCWluLT5zeW1ib2wubmFtZSA9ICIiOwotICAgICAgZWxzZSBpZiAoeCA8IHN0cnNpemUpCi0JaW4tPnN5bWJvbC5uYW1lID0gc3RyICsgeDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGluLT5zeW1ib2wudmFsdWUgPSBHRVRfU1dPUkQgKGFiZmQsICBleHQtPmVfdmFsdWUpOwotICAgICAgaW4tPmRlc2MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4dC0+ZV9kZXNjKTsKLSAgICAgIGluLT5vdGhlciA9IGJmZF9oX2dldF84IChhYmZkLCBleHQtPmVfb3RoZXIpOwotICAgICAgaW4tPnR5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgIGV4dC0+ZV90eXBlKTsKLSAgICAgIGluLT5zeW1ib2wudWRhdGEucCA9IE5VTEw7Ci0KLSAgICAgIGlmICghIHRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGluKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChkeW5hbWljKQotCWluLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0RZTkFNSUM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSByZWFkIHRoZSBzeW1ib2xzIGludG8gYSBidWZmZXIsIHdoaWNoIGlzIGRpc2NhcmRlZCB3aGVuIHRoaXMKLSAgIGZ1bmN0aW9uIGV4aXRzLiAgV2UgcmVhZCB0aGUgc3RyaW5ncyBpbnRvIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0bwotICAgaG9sZCB0aGVtIGFsbCBwbHVzIGFsbCB0aGUgY2FjaGVkIHN5bWJvbCBlbnRyaWVzLiAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKm9sZF9leHRlcm5hbF9zeW1zOwotICBhb3V0X3N5bWJvbF90eXBlICpjYWNoZWQ7Ci0gIHNpemVfdCBjYWNoZWRfc2l6ZTsKLQotICAvKiBJZiB0aGVyZSdzIG5vIHdvcmsgdG8gYmUgZG9uZSwgZG9uJ3QgZG8gYW55ICovCi0gIGlmIChvYmpfYW91dF9zeW1ib2xzIChhYmZkKSAhPSAoYW91dF9zeW1ib2xfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9sZF9leHRlcm5hbF9zeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0KLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNhY2hlZF9zaXplID0gKG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkKLQkJICogc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0gIGNhY2hlZCA9IChhb3V0X3N5bWJvbF90eXBlICopIGJmZF9tYWxsb2MgKGNhY2hlZF9zaXplKTsKLSAgaWYgKGNhY2hlZCA9PSBOVUxMICYmIGNhY2hlZF9zaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoY2FjaGVkX3NpemUgIT0gMCkKLSAgICBtZW1zZXQgKGNhY2hlZCwgMCwgY2FjaGVkX3NpemUpOwotCi0gIC8qIENvbnZlcnQgZnJvbSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24gdG8gaW50ZXJuYWwuICAqLwotICBpZiAoISAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpCi0JIChhYmZkLCBjYWNoZWQsCi0JICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCksCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplIChhYmZkKSwKLQkgIGZhbHNlKSkpCi0gICAgewotICAgICAgZnJlZSAoY2FjaGVkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotCi0gIG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpID0gY2FjaGVkOwotCi0gIC8qIEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW55Ym9keSB3aG8gY2FsbHMgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAotICAgICB3YW50IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24sIHNvIGlmIGl0IHdhcyBhbGxvY2F0ZWQKLSAgICAgYmVjYXVzZSBvZiBvdXIgY2FsbCB0byBhb3V0X2dldF9leHRlcm5hbF9zeW1ib2xzLCB3ZSBmcmVlIGl0IHVwCi0gICAgIHJpZ2h0IGF3YXkgdG8gc2F2ZSBzcGFjZS4gICovCi0gIGlmIChvbGRfZXh0ZXJuYWxfc3ltcyA9PSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopIE5VTEwKLSAgICAgICYmIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSNlbHNlCi0gICAgICBmcmVlIChvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSk7Ci0jZW5kaWYKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBXZSB1c2UgYSBoYXNoIHRhYmxlIHdoZW4gd3JpdGluZyBvdXQgc3ltYm9scyBzbyB0aGF0IHdlIG9ubHkgd3JpdGUKLSAgIG91dCBhIHBhcnRpY3VsYXIgc3RyaW5nIG9uY2UuICBUaGlzIGhlbHBzIHBhcnRpY3VsYXJseSB3aGVuIHRoZQotICAgbGlua2VyIHdyaXRlcyBvdXQgc3RhYnMgZGVidWdnaW5nIGVudHJpZXMsIGJlY2F1c2UgZWFjaCBkaWZmZXJlbnQKLSAgIGNvbnRyaWJ1dGluZyBvYmplY3QgZmlsZSB0ZW5kcyB0byBoYXZlIG1hbnkgZHVwbGljYXRlIHN0YWJzCi0gICBzdHJpbmdzLgotCi0gICBUaGlzIGhhc2ggdGFibGUgY29kZSBicmVha3MgZGJ4IG9uIFN1bk9TIDQuMS4zLCBzbyB3ZSBkb24ndCBkbyBpdAotICAgaWYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBpcyBzZXQuICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZSBhZGRfdG9fc3RyaW5ndGFiCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gZW1pdF9zdHJpbmd0YWIgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBHZXQgdGhlIGluZGV4IG9mIGEgc3RyaW5nIGluIGEgc3RydGFiLCBhZGRpbmcgaXQgaWYgaXQgaXMgbm90Ci0gICBhbHJlYWR5IHByZXNlbnQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGJmZF9zaXplX3R5cGUKLWFkZF90b19zdHJpbmd0YWIgKGFiZmQsIHRhYiwgc3RyLCBjb3B5KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBib29sZWFuIGNvcHk7Ci17Ci0gIGJvb2xlYW4gaGFzaDsKLSAgYmZkX3NpemVfdHlwZSBpbmRleDsKLQotICAvKiBBbiBpbmRleCBvZiAwIGFsd2F5cyBtZWFucyB0aGUgZW1wdHkgc3RyaW5nLiAgKi8KLSAgaWYgKHN0ciA9PSAwIHx8ICpzdHIgPT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLQotICAvKiBEb24ndCBoYXNoIGlmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaXMgc2V0LCBiZWNhdXNlIFN1bk9TIGRieAotICAgICBkb2Vzbid0IHVuZGVyc3RhbmQgYSBoYXNoZWQgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaGFzaCA9IHRydWU7Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotICAgIGhhc2ggPSBmYWxzZTsKLQotICBpbmRleCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAodGFiLCBzdHIsIGhhc2gsIGNvcHkpOwotCi0gIGlmIChpbmRleCAhPSAoYmZkX3NpemVfdHlwZSkgLTEpCi0gICAgewotICAgICAgLyogQWRkIEJZVEVTX0lOX1dPUkQgdG8gdGhlIHJldHVybiB2YWx1ZSB0byBhY2NvdW50IGZvciB0aGUKLQkgc3BhY2UgdGFrZW4gdXAgYnkgdGhlIHN0cmluZyB0YWJsZSBzaXplLiAgKi8KLSAgICAgIGluZGV4ICs9IEJZVEVTX0lOX1dPUkQ7Ci0gICAgfQotCi0gIHJldHVybiBpbmRleDsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RydGFiLiAgQUJGRCBpcyBhbHJlYWR5IGF0IHRoZSByaWdodCBsb2NhdGlvbiBpbiB0aGUKLSAgIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZW1pdF9zdHJpbmd0YWIgKGFiZmQsIHRhYikKLSAgICAgcmVnaXN0ZXIgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcltCWVRFU19JTl9XT1JEXTsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIHN0YXJ0cyB3aXRoIHRoZSBzaXplLiAgKi8KLSAgUFVUX1dPUkQgKGFiZmQsIF9iZmRfc3RyaW5ndGFiX3NpemUgKHRhYikgKyBCWVRFU19JTl9XT1JELCBidWZmZXIpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIEJZVEVTX0lOX1dPUkQsIGFiZmQpICE9IEJZVEVTX0lOX1dPUkQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCB0YWIpOwotfQotDAotYm9vbGVhbgotTkFNRShhb3V0LHdyaXRlX3N5bXMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudCA7Ci0gIGFzeW1ib2wgKipnZW5lcmljID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotCi0gIHN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChzdHJ0YWIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7IGNvdW50KyspCi0gICAgewotICAgICAgYXN5bWJvbCAqZyA9IGdlbmVyaWNbY291bnRdOwotICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotICAgICAgc3RydWN0IGV4dGVybmFsX25saXN0IG5zcDsKLQotICAgICAgaW5keCA9IGFkZF90b19zdHJpbmd0YWIgKGFiZmQsIHN0cnRhYiwgZy0+bmFtZSwgZmFsc2UpOwotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgUFVUX1dPUkQgKGFiZmQsIGluZHgsIChiZmRfYnl0ZSAqKSBuc3AuZV9zdHJ4KTsKLQotICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIoZykgPT0gYWJmZC0+eHZlYy0+Zmxhdm91cikKLQl7Ci0JICBiZmRfaF9wdXRfMTYoYWJmZCwgYW91dF9zeW1ib2woZyktPmRlc2MsICBuc3AuZV9kZXNjKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT5vdGhlciwgIG5zcC5lX290aGVyKTsKLQkgIGJmZF9oX3B1dF84KGFiZmQsIGFvdXRfc3ltYm9sKGcpLT50eXBlLCAgbnNwLmVfdHlwZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9oX3B1dF8xNihhYmZkLDAsIG5zcC5lX2Rlc2MpOwotCSAgYmZkX2hfcHV0XzgoYWJmZCwgMCwgbnNwLmVfb3RoZXIpOwotCSAgYmZkX2hfcHV0XzgoYWJmZCwgMCwgbnNwLmVfdHlwZSk7Ci0JfQotCi0gICAgICBpZiAoISB0cmFuc2xhdGVfdG9fbmF0aXZlX3N5bV9mbGFncyAoYWJmZCwgZywgJm5zcCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUoKFBUUikmbnNwLDEsRVhURVJOQUxfTkxJU1RfU0laRSwgYWJmZCkKLQkgICE9IEVYVEVSTkFMX05MSVNUX1NJWkUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIE5COiBgS0VFUElUJyBjdXJyZW50bHkgb3ZlcmxheXMgYHVkYXRhLnAnLCBzbyBzZXQgdGhpcyBvbmx5Ci0JIGhlcmUsIGF0IHRoZSBlbmQuICAqLwotICAgICAgZy0+S0VFUElUID0gY291bnQ7Ci0gICAgfQotCi0gIGlmICghIGVtaXRfc3RyaW5ndGFiIChhYmZkLCBzdHJ0YWIpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKHN0cnRhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLWVycm9yX3JldHVybjoKLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc3RydGFiKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0MCi1sb25nCi1OQU1FKGFvdXQsZ2V0X3N5bXRhYikgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLQotICAgIGlmICghTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkoYWJmZCkpCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBmb3IgKHN5bWJhc2UgPSBvYmpfYW91dF9zeW1ib2xzKGFiZmQpOyBjb3VudGVyKysgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTspCi0gICAgICAqKGxvY2F0aW9uKyspID0gKGFzeW1ib2wgKikoIHN5bWJhc2UrKyk7Ci0gICAgKmxvY2F0aW9uKysgPTA7Ci0gICAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi0MCi0vKiBTdGFuZGFyZCByZWxvYyBzdHVmZiAqLwotLyogT3V0cHV0IHN0YW5kYXJkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi1leHRlcm4gdm9pZCAgTkFNRShhb3V0LHN3YXBfc3RkX3JlbG9jX291dCkKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZTsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl9sZW5ndGggPSBnLT5ob3d0by0+c2l6ZSA7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLSAgcl9wY3JlbCAgPSAoaW50KSBnLT5ob3d0by0+cGNfcmVsYXRpdmU7IC8qIFJlbGF0aXZlIHRvIFBDPyAqLwotICAvKiBYWFggVGhpcyByZWxpZXMgb24gcmVsb2NzIGNvbWluZyBmcm9tIGEub3V0IGZpbGVzLiAgKi8KLSAgcl9iYXNlcmVsID0gKGctPmhvd3RvLT50eXBlICYgOCkgIT0gMDsKLSAgcl9qbXB0YWJsZSA9IChnLT5ob3d0by0+dHlwZSAmIDE2KSAhPSAwOwotICByX3JlbGF0aXZlID0gKGctPmhvd3RvLT50eXBlICYgMzIpICE9IDA7Ci0KLSNpZiAwCi0gIC8qIEZvciBhIHN0YW5kYXJkIHJlbG9jLCB0aGUgYWRkZW5kIGlzIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHJfYWRkZW5kID0gZy0+YWRkZW5kICsgKCooZy0+c3ltX3B0cl9wdHIpKS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSNlbmRpZgotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLSAgICAgIHsKLQkvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQlyX2luZGV4ID0gTl9BQlM7Ci0Jcl9leHRlcm4gPSAwOwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkvKiBGaWxsIGluIHN5bWJvbCAqLwotCXJfZXh0ZXJuID0gMTsKLQlyX2luZGV4ID0gKCooZy0+c3ltX3B0cl9wdHIpKS0+S0VFUElUOwotCi0gICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ICA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLSAgICAgICAocl9leHRlcm4/ICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUc6IDApCi0JfCAocl9wY3JlbD8gICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRzogMCkKLQkgfCAocl9iYXNlcmVsPyAgIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHOiAwKQotCSAgfCAocl9qbXB0YWJsZT8gIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRzogMCkKLQkgICB8IChyX3JlbGF0aXZlPyAgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHOiAwKQotCSAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRyk7Ci0gICAgfSBlbHNlIHsKLQluYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCW5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQluYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OwotCW5hdHB0ci0+cl90eXBlWzBdID0KLQkgKHJfZXh0ZXJuPyAgICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotCSAgfCAocl9wY3JlbD8gICAgIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRTogMCkKLQkgICB8IChyX2Jhc2VyZWw/ICAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEU6IDApCi0JICAgIHwgKHJfam1wdGFibGU/ICBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEU6IDApCi0JICAgICB8IChyX3JlbGF0aXZlPyAgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFOiAwKQotCSAgICAgIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLSAgICAgIH0KLX0KLQotCi0vKiBFeHRlbmRlZCBzdHVmZiAqLwotLyogT3V0cHV0IGV4dGVuZGVkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi1leHRlcm4gdm9pZCBOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2Nfb3V0KQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopKTsKLQotdm9pZAotTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsIGcsIG5hdHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpnOwotICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpuYXRwdHI7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IHN5bS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX3R5cGUgPSAodW5zaWduZWQgaW50KSBnLT5ob3d0by0+dHlwZTsKLQotICByX2FkZGVuZCA9IGctPmFkZGVuZDsKLSAgaWYgKChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHJfYWRkZW5kICs9ICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlLiAgKi8KLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotICAgIHsKLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBOX0FCUzsKLSAgICB9Ci0gIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgIHx8IChzeW0tPmZsYWdzICYgQlNGX0dMT0JBTCkgIT0gMCkKLQlyX2V4dGVybiA9IDE7Ci0gICAgICBlbHNlCi0Jcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9ICgqKGctPnN5bV9wdHJfcHRyKSktPktFRVBJVDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotICAgICAgKChyX2V4dGVybj8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRzogMCkKLSAgICAgICB8IChyX3R5cGUgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLSAgfSBlbHNlIHsKLSAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICBuYXRwdHItPnJfaW5kZXhbMF0gPSByX2luZGV4OwotICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLSAgICAgKHJfZXh0ZXJuPyBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFOiAwKQotICAgICAgfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLSAgfQotCi0gIFBVVF9XT1JEIChhYmZkLCByX2FkZGVuZCwgbmF0cHRyLT5yX2FkZGVuZCk7Ci19Ci0KLS8qIEJGRCBkZWFscyBpbnRlcm5hbGx5IHdpdGggYWxsIHRoaW5ncyBiYXNlZCBmcm9tIHRoZSBzZWN0aW9uIHRoZXkncmUKLSAgIGluLiBzbywgc29tZXRoaW5nIGluIDEwIGJ5dGVzIGludG8gYSB0ZXh0IHNlY3Rpb24gIHdpdGggYSBiYXNlIG9mCi0gICA1MCB3b3VsZCBoYXZlIGEgc3ltYm9sICgudGV4dCsxMCkgYW5kIGtub3cgLnRleHQgdm1hIHdhcyA1MC4KLQotICAgQW91dCBrZWVwcyBhbGwgaXQncyBzeW1ib2xzIGJhc2VkIGZyb20gemVybywgc28gdGhlIHN5bWJvbCB3b3VsZAotICAgY29udGFpbiA2MC4gVGhpcyBtYWNybyBzdWJzIHRoZSBiYXNlIG9mIGVhY2ggc2VjdGlvbiBmcm9tIHRoZSB2YWx1ZQotICAgdG8gZ2l2ZSB0aGUgdHJ1ZSBvZmZzZXQgZnJvbSB0aGUgc2VjdGlvbiAqLwotCi0KLSNkZWZpbmUgTU9WRV9BRERSRVNTKGFkKSAgICAgICAJCQkJCQlcCi0gIGlmIChyX2V4dGVybikgewkJCQkJCQlcCi0gICAvKiB1bmRlZmluZWQgc3ltYm9sICovCQkJCQkJXAotICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIHJfaW5kZXg7CQkJXAotICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkOwkJCQkJCVwKLSAgICAgfSBlbHNlIHsJCQkJCQkJCVwKLSAgICAvKiBkZWZpbmVkLCBzZWN0aW9uIHJlbGF0aXZlLiByZXBsYWNlIHN5bWJvbCB3aXRoIHBvaW50ZXIgdG8gICAgCVwKLSAgICAgICBzeW1ib2wgd2hpY2ggcG9pbnRzIHRvIHNlY3Rpb24gICovCQkJCVwKLSAgICBzd2l0Y2ggKHJfaW5kZXgpIHsJCQkJCQkJXAotICAgIGNhc2UgTl9URVhUOgkJCQkJCQlcCi0gICAgY2FzZSBOX1RFWFQgfCBOX0VYVDoJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial90ZXh0c2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAgLSBzdS0+dGV4dHNlYy0+dm1hOwkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGNhc2UgTl9EQVRBOgkJCQkJCQlcCi0gICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoJCQkJCQlcCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyICA9IG9ial9kYXRhc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAtIHN1LT5kYXRhc2VjLT52bWE7CQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgY2FzZSBOX0JTUzoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQlNTIHwgTl9FWFQ6CQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX2Jzc3NlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQgLSBzdS0+YnNzc2VjLT52bWE7CQkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIGRlZmF1bHQ6CQkJCQkJCQlcCi0gICAgY2FzZSBOX0FCUzoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6CQkJCQkJCVwKLSAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkOwkJCQkJCVwKLSAgICAgIGJyZWFrOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIH0gICAgIAkJCQkJCQkJXAotCi12b2lkCi1OQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybjsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgc3RydWN0IGFvdXRkYXRhICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSAoR0VUX1NXT1JEIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKSk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFswXSA8PCAxNikKLQkgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCi0JICAgICB8ICBieXRlcy0+cl9pbmRleFsyXTsKLSAgICByX2V4dGVybiA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotICAgIHJfdHlwZSAgID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLQkJCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICByX2luZGV4ID0gIChieXRlcy0+cl9pbmRleFsyXSA8PCAxNikKLQkgICAgIHwgKGJ5dGVzLT5yX2luZGV4WzFdIDw8IDgpCi0JICAgICB8ICBieXRlcy0+cl9pbmRleFswXTsKLSAgICByX2V4dGVybiA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotICAgIHJfdHlwZSAgID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRSkKLQkJCQkgICAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRTsKLSAgfQotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSAgaG93dG9fdGFibGVfZXh0ICsgcl90eXBlOwotCi0gIC8qIEJhc2UgcmVsYXRpdmUgcmVsb2NzIGFyZSBhbHdheXMgYWdhaW5zdCB0aGUgc3ltYm9sIHRhYmxlLAotICAgICByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHJfZXh0ZXJuLiAgcl9leHRlcm4ganVzdCByZWZsZWN0cwotICAgICB3aGV0aGVyIHRoZSBzeW1ib2wgdGhlIHJlbG9jIGlzIGFnYWluc3QgaXMgbG9jYWwgb3IgZ2xvYmFsLiAgKi8KLSAgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0gICAgcl9leHRlcm4gPSAxOwotCi0gIGlmIChyX2V4dGVybiAmJiByX2luZGV4ID4gc3ltY291bnQpCi0gICAgewotICAgICAgLyogV2UgY291bGQgYXJyYW5nZSB0byByZXR1cm4gYW4gZXJyb3IsIGJ1dCBpdCBtaWdodCBiZSB1c2VmdWwKLSAgICAgICAgIHRvIHNlZSB0aGUgZmlsZSBldmVuIGlmIGl0IGlzIGJhZC4gICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gTl9BQlM7Ci0gICAgfQotCi0gIE1PVkVfQUREUkVTUyhHRVRfU1dPUkQoYWJmZCwgYnl0ZXMtPnJfYWRkZW5kKSk7Ci19Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotewotICB1bnNpZ25lZCBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg7Ci0gIGludCByX3BjcmVsOwotICBpbnQgcl9iYXNlcmVsLCByX2ptcHRhYmxlLCByX3JlbGF0aXZlOwotICBzdHJ1Y3QgYW91dGRhdGEgICpzdSA9ICYoYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hKTsKLSAgdW5zaWduZWQgaW50IGhvd3RvX2lkeDsKLQotICBjYWNoZV9wdHItPmFkZHJlc3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgcl9pbmRleCA9ICAoYnl0ZXMtPnJfaW5kZXhbMF0gPDwgMTYpCi0gICAgICB8IChieXRlcy0+cl9pbmRleFsxXSA8PCA4KQotCXwgIGJ5dGVzLT5yX2luZGV4WzJdOwotICAgIHJfZXh0ZXJuICA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICAgIHJfcGNyZWwgICA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gICAgcl9iYXNlcmVsID0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRykpOwotICAgIHJfam1wdGFibGU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKSk7Ci0gICAgcl9yZWxhdGl2ZT0gKDAgIT0gKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19SRUxBVElWRV9CSUcpKTsKLSAgICByX2xlbmd0aCAgPSAgICAgICAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0gICAgICAJCQk+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHOwotICB9IGVsc2UgewotICAgIHJfaW5kZXggPSAgKGJ5dGVzLT5yX2luZGV4WzJdIDw8IDE2KQotICAgICAgfCAoYnl0ZXMtPnJfaW5kZXhbMV0gPDwgOCkKLQl8ICBieXRlcy0+cl9pbmRleFswXTsKLSAgICByX2V4dGVybiAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUpKTsKLSAgICByX3BjcmVsICAgPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotICAgIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpKTsKLSAgICByX2ptcHRhYmxlPSAoMCAhPSAoYnl0ZXMtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSkpOwotICAgIHJfcmVsYXRpdmU9ICgwICE9IChieXRlcy0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFKSk7Ci0gICAgcl9sZW5ndGggID0gICAgICAgKGJ5dGVzLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFKQotICAgICAgCQkJPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRTsKLSAgfQotCi0gIGhvd3RvX2lkeCA9IHJfbGVuZ3RoICsgNCAqIHJfcGNyZWwgKyA4ICogcl9iYXNlcmVsCi0JICAgICAgKyAxNiAqIHJfam1wdGFibGUgKyAzMiAqIHJfcmVsYXRpdmU7Ci0gIEJGRF9BU1NFUlQgKGhvd3RvX2lkeCA8IFRBQkxFX1NJWkUgKGhvd3RvX3RhYmxlX3N0ZCkpOwotICBjYWNoZV9wdHItPmhvd3RvID0gIGhvd3RvX3RhYmxlX3N0ZCArIGhvd3RvX2lkeDsKLSAgQkZEX0FTU0VSVCAoY2FjaGVfcHRyLT5ob3d0by0+dHlwZSAhPSAodW5zaWduZWQgaW50KSAtMSk7Ci0KLSAgLyogQmFzZSByZWxhdGl2ZSByZWxvY3MgYXJlIGFsd2F5cyBhZ2FpbnN0IHRoZSBzeW1ib2wgdGFibGUsCi0gICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2Ygcl9leHRlcm4uICByX2V4dGVybiBqdXN0IHJlZmxlY3RzCi0gICAgIHdoZXRoZXIgdGhlIHN5bWJvbCB0aGUgcmVsb2MgaXMgYWdhaW5zdCBpcyBsb2NhbCBvciBnbG9iYWwuICAqLwotICBpZiAocl9iYXNlcmVsKQotICAgIHJfZXh0ZXJuID0gMTsKLQotICBpZiAocl9leHRlcm4gJiYgcl9pbmRleCA+IHN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGFycmFuZ2UgdG8gcmV0dXJuIGFuIGVycm9yLCBidXQgaXQgbWlnaHQgYmUgdXNlZnVsCi0gICAgICAgICB0byBzZWUgdGhlIGZpbGUgZXZlbiBpZiBpdCBpcyBiYWQuICAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IE5fQUJTOwotICAgIH0KLQotICBNT1ZFX0FERFJFU1MoMCk7Ci19Ci0KLS8qIFJlYWQgYW5kIHN3YXAgdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBQVFIgcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICByZWxvY19zaXplID0gZXhlY19oZHIoYWJmZCktPmFfZHJzaXplOwotICBlbHNlIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgZWxzZSBpZiAoYXNlY3QgPT0gb2JqX2Jzc3NlYyAoYWJmZCkpCi0gICAgcmVsb2Nfc2l6ZSA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFzZWN0LT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICBjb3VudCA9IHJlbG9jX3NpemUgLyBlYWNoX3NpemU7Ci0KLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSAoY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0gIGlmIChyZWxvY19jYWNoZSA9PSBOVUxMICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHJlbG9jX2NhY2hlLCAwLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NzID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGZyZWUgKHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9yZWFkIChyZWxvY3MsIDEsIHJlbG9jX3NpemUsIGFiZmQpICE9IHJlbG9jX3NpemUpCi0gICAgewotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICAgIGZyZWUgKHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcnB0ciA9Ci0JKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2NzOwotCi0gICAgICBmb3IgKDsgY291bnRlciA8IGNvdW50OyBjb3VudGVyKyssIHJwdHIrKywgY2FjaGVfcHRyKyspCi0JTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX2luKSAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJCSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpycHRyID0KLQkoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3M7Ci0KLSAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLQlNWV9zd2FwX3N0ZF9yZWxvY19pbiAoYWJmZCwgcnB0ciwgY2FjaGVfcHRyLCBzeW1ib2xzLAotCQkJICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotICAgIH0KLQotICBmcmVlIChyZWxvY3MpOwotCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNhY2hlX3B0ciAtIHJlbG9jX2NhY2hlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSByZWxvY2F0aW9uIHNlY3Rpb24gaW50byBhbiBvYmplY3QgZmlsZS4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICB1bnNpZ25lZCBjaGFyICpuYXRpdmUsICpuYXRwdHI7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0KLSAgdW5zaWduZWQgaW50IGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHNpemVfdCBuYXRzaXplOwotCi0gIGlmIChjb3VudCA9PSAwIHx8IHNlY3Rpb24tPm9yZWxvY2F0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBuYXRzaXplID0gZWFjaF9zaXplICogY291bnQ7Ci0gIG5hdGl2ZSA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKGFiZmQsIG5hdHNpemUpOwotICBpZiAoIW5hdGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2VuZXJpYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCi0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTkFNRShhb3V0LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKW5hdHB0cik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTVlfc3dhcF9zdGRfcmVsb2Nfb3V0KGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKW5hdHB0cik7Ci0gICAgfQotCi0gIGlmICggYmZkX3dyaXRlICgoUFRSKSBuYXRpdmUsIDEsIG5hdHNpemUsIGFiZmQpICE9IG5hdHNpemUpIHsKLSAgICBiZmRfcmVsZWFzZShhYmZkLCBuYXRpdmUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBiZmRfcmVsZWFzZSAoYWJmZCwgbmF0aXZlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBzdHVwaWQuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBhIGJvb2xlYW4gcHJlZGljYXRlICovCi1sb25nCi1OQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoc2VjdGlvbiA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICAqcmVscHRyID0gTlVMTDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoISh0YmxwdHIgfHwgTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKShhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50ICsrKSB7Ci0gICAgICAqcmVscHRyICsrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OwotICAgIH0KLSAgfQotICBlbHNlIHsKLSAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspCi0gICAgICB7Ci0JKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgICB9Ci0gIH0KLSAgKnJlbHB0ciA9IDA7Ci0KLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi1sb25nCi1OQU1FKGFvdXQsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKSAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIHJldHVybiAoc2l6ZW9mIChhcmVsZW50ICopICogKGFzZWN0LT5yZWxvY19jb3VudCsxKSk7Ci0gIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX2RhdGFzZWMgKGFiZmQpKQotICAgIHJldHVybiAoc2l6ZW9mIChhcmVsZW50ICopCi0JICAgICogKChleGVjX2hkcihhYmZkKS0+YV9kcnNpemUgLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpCi0JICAgICAgICsgMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikKLQkgICAgKiAoKGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSkKLQkgICAgICAgKyAxKSk7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiBzaXplb2YgKGFyZWxlbnQgKik7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9ic3NzZWMgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAtMTsKLX0KLQotDAotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWJfdXBwZXJfYm91bmQpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghTkFNRShhb3V0LHNsdXJwX3N5bWJvbF90YWJsZSkoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkrMSkgKiAoc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlICopKTsKLX0KLQotLypBUkdTVVNFRCovCi0gYWxlbnQgKgotTkFNRShhb3V0LGdldF9saW5lbm8pIChpZ25vcmVfYWJmZCwgaWdub3JlX3N5bWJvbCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqaWdub3JlX3N5bWJvbDsKLXsKLXJldHVybiAoYWxlbnQgKilOVUxMOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLU5BTUUoYW91dCxnZXRfc3ltYm9sX2luZm8pIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0KLSAgaWYgKHJldC0+dHlwZSA9PSAnPycpCi0gICAgewotICAgICAgaW50IHR5cGVfY29kZSA9IGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUgJiAweGZmOwotICAgICAgY29uc3QgY2hhciAqc3RhYl9uYW1lID0gYmZkX2dldF9zdGFiX25hbWUgKHR5cGVfY29kZSk7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTBdOwotCi0gICAgICBpZiAoc3RhYl9uYW1lID09IE5VTEwpCi0JewotCSAgc3ByaW50ZihidWYsICIoJWQpIiwgdHlwZV9jb2RlKTsKLQkgIHN0YWJfbmFtZSA9IGJ1ZjsKLQl9Ci0gICAgICByZXQtPnR5cGUgPSAnLSc7Ci0gICAgICByZXQtPnN0YWJfdHlwZSA9IHR5cGVfY29kZTsKLSAgICAgIHJldC0+c3RhYl9vdGhlciA9ICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+b3RoZXIgJiAweGZmKTsKLSAgICAgIHJldC0+c3RhYl9kZXNjID0gKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKTsKLSAgICAgIHJldC0+c3RhYl9uYW1lID0gc3RhYl9uYW1lOwotICAgIH0KLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSAoaWdub3JlX2FiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgUFRSIGFmaWxlOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKWFmaWxlOwotCi0gIHN3aXRjaCAoaG93KSB7Ci0gIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgIGlmIChzeW1ib2wtPm5hbWUpCi0gICAgICBmcHJpbnRmKGZpbGUsIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgZnByaW50ZihmaWxlLCIlNHggJTJ4ICUyeCIsKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5kZXNjICYgMHhmZmZmKSwKLQkgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpLAotCSAgICAodW5zaWduZWQpKGFvdXRfc3ltYm9sKHN5bWJvbCktPnR5cGUpKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICB7Ci0gICBDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZigoUFRSKWZpbGUsc3ltYm9sKTsKLQotICAgICAgZnByaW50ZihmaWxlLCIgJS01cyAlMDR4ICUwMnggJTAyeCIsCi0JICAgICAgc2VjdGlvbl9uYW1lLAotCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+ZGVzYyAmIDB4ZmZmZiksCi0JICAgICAgKHVuc2lnbmVkKShhb3V0X3N5bWJvbChzeW1ib2wpLT5vdGhlciAmIDB4ZmYpLAotCSAgICAgICh1bnNpZ25lZCkoYW91dF9zeW1ib2woc3ltYm9sKS0+dHlwZSAgJiAweGZmKSk7Ci0gICAgICBpZiAoc3ltYm9sLT5uYW1lKQotICAgICAgICBmcHJpbnRmKGZpbGUsIiAlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIElmIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIDFNQiB0byBob2xkIHRoZSBnZW5lcmljCi0gICBzeW1ib2xzLCB3ZSB1c2UgdGhlIGdlbmVyaWMgbWluaXN5bWJvbCBtZXRob3JkOiBpdCdzIGZhc3Rlciwgc2luY2UKLSAgIGl0IG9ubHkgdHJhbnNsYXRlcyB0aGUgc3ltYm9scyBvbmNlLCBub3QgbXVsdGlwbGUgdGltZXMuICAqLwotI2RlZmluZSBNSU5JU1lNX1RIUkVTSE9MRCAoMTAwMDAwMCAvIHNpemVvZiAoYXN5bWJvbCkpCi0KLS8qIFJlYWQgbWluaXN5bWJvbHMuICBGb3IgbWluaXN5bWJvbHMsIHdlIHVzZSB0aGUgdW5tb2RpZmllZCBhLm91dAotICAgc3ltYm9scy4gIFRoZSBtaW5pc3ltYm9sX3RvX3N5bWJvbCBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZXNlIGludG8KLSAgIEJGRCBhc3ltYm9sIHN0cnVjdHVyZXMuICAqLwotCi1sb25nCi1OQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgKm1pbmlzeW1zcDsKLSAgICAgdW5zaWduZWQgaW50ICpzaXplcDsKLXsKLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgLyogV2UgY291bGQgaGFuZGxlIHRoZSBkeW5hbWljIHN5bWJvbHMgaGVyZSBhcyB3ZWxsLCBidXQgaXQncwotICAgICAgICAgZWFzaWVyIHRvIGhhbmQgdGhlbSBvZmYuICAqLwotICAgICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKTsKLSAgICB9Ci0KLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpIDwgTUlOSVNZTV9USFJFU0hPTEQpCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKTsKLQotICAqbWluaXN5bXNwID0gKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0KLSAgLyogQnkgcGFzc2luZyB0aGUgZXh0ZXJuYWwgc3ltYm9scyBiYWNrIGZyb20gdGhpcyByb3V0aW5lLCB3ZSBhcmUKLSAgICAgZ2l2aW5nIHVwIGNvbnRyb2wgb3ZlciB0aGUgbWVtb3J5IGJsb2NrLiAgQ2xlYXIKLSAgICAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcywgc28gdGhhdCB3ZSBkbyBub3QgdHJ5IHRvIGZyZWUgaXQKLSAgICAgb3Vyc2VsdmVzLiAgKi8KLSAgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotCi0gICpzaXplcCA9IEVYVEVSTkFMX05MSVNUX1NJWkU7Ci0gIHJldHVybiBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotfQotCi0vKiBDb252ZXJ0IGEgbWluaXN5bWJvbCB0byBhIEJGRCBhc3ltYm9sLiAgQSBtaW5pc3ltYm9sIGlzIGp1c3QgYW4KLSAgIHVubW9kaWZpZWQgYS5vdXQgc3ltYm9sLiAgVGhlIFNZTSBhcmd1bWVudCBpcyBhIHN0cnVjdHVyZSByZXR1cm5lZAotICAgYnkgYmZkX21ha2VfZW1wdHlfc3ltYm9sLCB3aGljaCB3ZSBmaWxsIGluIGhlcmUuICAqLwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGlmIChkeW5hbWljCi0gICAgICB8fCBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpIDwgTUlOSVNZTV9USFJFU0hPTEQpCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgbWluaXN5bSwgc3ltKTsKLQotICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSk7Ci0KLSAgLyogV2UgY2FsbCB0cmFuc2xhdGVfc3ltYm9sX3RhYmxlIHRvIHRyYW5zbGF0ZSBhIHNpbmdsZSBzeW1ib2wuICAqLwotICBpZiAoISAoTkFNRShhb3V0LHRyYW5zbGF0ZV9zeW1ib2xfdGFibGUpCi0JIChhYmZkLAotCSAgKGFvdXRfc3ltYm9sX3R5cGUgKikgc3ltLAotCSAgKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBtaW5pc3ltLAotCSAgKGJmZF9zaXplX3R5cGUpIDEsCi0JICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSwKLQkgIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplIChhYmZkKSwKLQkgIGZhbHNlKSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIHN5bTsKLX0KLQotLyoKLSBwcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gYW5kIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlCi0gd2FudGVkIGxvY2F0aW9uLgotKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGZpbmRfbmVhcmVzdF9saW5lKQotICAgICAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICAvKiBSdW4gZG93biB0aGUgZmlsZSBsb29raW5nIGZvciB0aGUgZmlsZW5hbWUsIGZ1bmN0aW9uIGFuZCBsaW5lbnVtYmVyICovCi0gIGFzeW1ib2wgKipwOwotICBDT05TVCBjaGFyICpkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0gIENPTlNUIGNoYXIgKm1haW5fZmlsZV9uYW1lID0gTlVMTDsKLSAgQ09OU1QgY2hhciAqY3VycmVudF9maWxlX25hbWUgPSBOVUxMOwotICBDT05TVCBjaGFyICpsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7IC8qIFZhbHVlIG9mIGN1cnJlbnRfZmlsZV9uYW1lIGF0IGxpbmUgbnVtYmVyLiAqLwotICBDT05TVCBjaGFyICpsaW5lX2RpcmVjdG9yeV9uYW1lID0gTlVMTDsgLyogVmFsdWUgb2YgZGlyZWN0b3J5X25hbWUgYXQgbGluZSBudW1iZXIuICovCi0gIGJmZF92bWEgbG93X2xpbmVfdm1hID0gMDsKLSAgYmZkX3ZtYSBsb3dfZnVuY192bWEgPSAwOwotICBhc3ltYm9sICpmdW5jID0gMDsKLSAgc2l6ZV90IGZpbGVsZW4sIGZ1bmNsZW47Ci0gIGNoYXIgKmJ1ZjsKLQotICAqZmlsZW5hbWVfcHRyID0gYWJmZC0+ZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gMDsKLSAgKmxpbmVfcHRyID0gMDsKLSAgaWYgKHN5bWJvbHMgIT0gKGFzeW1ib2wgKiopTlVMTCkgewotICAgIGZvciAocCA9IHN5bWJvbHM7ICpwOyBwKyspIHsKLSAgICAgIGFvdXRfc3ltYm9sX3R5cGUgICpxID0gKGFvdXRfc3ltYm9sX3R5cGUgKikoKnApOwotICAgIG5leHQ6Ci0gICAgICBzd2l0Y2ggKHEtPnR5cGUpewotICAgICAgY2FzZSBOX1RFWFQ6Ci0JLyogSWYgdGhpcyBsb29rcyBsaWtlIGEgZmlsZSBuYW1lIHN5bWJvbCwgYW5kIGl0IGNvbWVzIGFmdGVyCi0gICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3ZSBoYXZlIGZvdW5kIHNvIGZhciwgYnV0IGJlZm9yZSB0aGUKLSAgICAgICAgICAgb2Zmc2V0LCB0aGVuIHdlIGhhdmUgcHJvYmFibHkgbm90IGZvdW5kIHRoZSByaWdodCBsaW5lCi0gICAgICAgICAgIG51bWJlci4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQKLQkgICAgJiYgKChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEKLQkJICYmIChsaW5lX2ZpbGVfbmFtZSAhPSBOVUxMCi0JCSAgICAgfHwgKmxpbmVfcHRyICE9IDApKQotCQl8fCAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hCi0JCSAgICAmJiBmdW5jICE9IE5VTEwpKSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgICBzeW1uYW1lID0gcS0+c3ltYm9sLm5hbWU7Ci0JICAgIGlmIChzdHJjbXAgKHN5bW5hbWUgKyBzdHJsZW4gKHN5bW5hbWUpIC0gMiwgIi5vIikgPT0gMCkKLQkgICAgICB7Ci0JCWlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEpCi0JCSAgewotCQkgICAgKmxpbmVfcHRyID0gMDsKLQkJICAgIGxpbmVfZmlsZV9uYW1lID0gTlVMTDsKLQkJICB9Ci0JCWlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfZnVuY192bWEpCi0JCSAgZnVuYyA9IE5VTEw7Ci0JICAgICAgfQotCSAgfQotCWJyZWFrOwotCi0gICAgICBjYXNlIE5fU086Ci0JLyogSWYgdGhpcyBzeW1ib2wgaXMgbGVzcyB0aGFuIHRoZSBvZmZzZXQsIGJ1dCBncmVhdGVyIHRoYW4KLSAgICAgICAgICAgdGhlIGxpbmUgbnVtYmVyIHdlIGhhdmUgZm91bmQgc28gZmFyLCB0aGVuIHdlIGhhdmUgbm90Ci0gICAgICAgICAgIGZvdW5kIHRoZSByaWdodCBsaW5lIG51bWJlci4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCi0JICB7Ci0JICAgIGlmIChxLT5zeW1ib2wudmFsdWUgPiBsb3dfbGluZV92bWEpCi0JICAgICAgewotCQkqbGluZV9wdHIgPSAwOwotCQlsaW5lX2ZpbGVfbmFtZSA9IE5VTEw7Ci0JICAgICAgfQotCSAgICBpZiAocS0+c3ltYm9sLnZhbHVlID4gbG93X2Z1bmNfdm1hKQotCSAgICAgIGZ1bmMgPSBOVUxMOwotCSAgfQotCi0JbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCS8qIExvb2sgYWhlYWQgdG8gbmV4dCBzeW1ib2wgdG8gY2hlY2sgaWYgdGhhdCB0b28gaXMgYW4gTl9TTy4gKi8KLQlwKys7Ci0JaWYgKCpwID09IE5VTEwpCi0JICBicmVhazsKLQlxID0gKGFvdXRfc3ltYm9sX3R5cGUgKikoKnApOwotCWlmIChxLT50eXBlICE9IChpbnQpTl9TTykKLQkgIGdvdG8gbmV4dDsKLQotCS8qIEZvdW5kIGEgc2Vjb25kIE5fU08gIEZpcnN0IGlzIGRpcmVjdG9yeTsgc2Vjb25kIGlzIGZpbGVuYW1lLiAqLwotCWRpcmVjdG9yeV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JbWFpbl9maWxlX25hbWUgPSBjdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCWlmIChvYmpfdGV4dHNlYyhhYmZkKSAhPSBzZWN0aW9uKQotCSAgZ290byBkb25lOwotCWJyZWFrOwotICAgICAgY2FzZSBOX1NPTDoKLQljdXJyZW50X2ZpbGVfbmFtZSA9IHEtPnN5bWJvbC5uYW1lOwotCWJyZWFrOwotCi0gICAgICBjYXNlIE5fU0xJTkU6Ci0KLSAgICAgIGNhc2UgTl9EU0xJTkU6Ci0gICAgICBjYXNlIE5fQlNMSU5FOgotCS8qIFdlJ2xsIGtlZXAgdGhpcyBpZiBpdCByZXNvbHZlcyBuZWFyZXIgdGhhbiB0aGUgb25lIHdlIGhhdmUKLSAgICAgICAgICAgYWxyZWFkeS4gICovCi0JaWYgKHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfbGluZV92bWEKLQkgICAgJiYgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgIHsKLQkgICAgKmxpbmVfcHRyID0gcS0+ZGVzYzsKLQkgICAgbG93X2xpbmVfdm1hID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICBsaW5lX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCSAgICBsaW5lX2RpcmVjdG9yeV9uYW1lID0gZGlyZWN0b3J5X25hbWU7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE5fRlVOOgotCXsKLQkgIC8qIFdlJ2xsIGtlZXAgdGhpcyBpZiBpdCBpcyBuZWFyZXIgdGhhbiB0aGUgb25lIHdlIGhhdmUgYWxyZWFkeSAqLwotCSAgaWYgKHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfZnVuY192bWEgJiYKLQkgICAgICBxLT5zeW1ib2wudmFsdWUgPD0gb2Zmc2V0KSB7Ci0JICAgIGxvd19mdW5jX3ZtYSA9IHEtPnN5bWJvbC52YWx1ZTsKLQkgICAgZnVuYyA9IChhc3ltYm9sICopcTsKLQkgIH0KLQkgIGVsc2UgaWYgKHEtPnN5bWJvbC52YWx1ZSA+IG9mZnNldCkKLQkgICAgZ290byBkb25lOwotCX0KLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotIGRvbmU6Ci0gIGlmICgqbGluZV9wdHIgIT0gMCkKLSAgICB7Ci0gICAgICBtYWluX2ZpbGVfbmFtZSA9IGxpbmVfZmlsZV9uYW1lOwotICAgICAgZGlyZWN0b3J5X25hbWUgPSBsaW5lX2RpcmVjdG9yeV9uYW1lOwotICAgIH0KLQotICBpZiAobWFpbl9maWxlX25hbWUgPT0gTlVMTAotICAgICAgfHwgbWFpbl9maWxlX25hbWVbMF0gPT0gJy8nCi0gICAgICB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotICAgIGZpbGVsZW4gPSAwOwotICBlbHNlCi0gICAgZmlsZWxlbiA9IHN0cmxlbiAoZGlyZWN0b3J5X25hbWUpICsgc3RybGVuIChtYWluX2ZpbGVfbmFtZSk7Ci0gIGlmIChmdW5jID09IE5VTEwpCi0gICAgZnVuY2xlbiA9IDA7Ci0gIGVsc2UKLSAgICBmdW5jbGVuID0gc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChmdW5jKSk7Ci0KLSAgaWYgKGFkYXRhIChhYmZkKS5saW5lX2J1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGFkYXRhIChhYmZkKS5saW5lX2J1Zik7Ci0gIGlmIChmaWxlbGVuICsgZnVuY2xlbiA9PSAwKQotICAgIGFkYXRhIChhYmZkKS5saW5lX2J1ZiA9IGJ1ZiA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChmaWxlbGVuICsgZnVuY2xlbiArIDMpOwotICAgICAgYWRhdGEgKGFiZmQpLmxpbmVfYnVmID0gYnVmOwotICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG1haW5fZmlsZV9uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG1haW5fZmlsZV9uYW1lWzBdID09ICcvJyB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotCSpmaWxlbmFtZV9wdHIgPSBtYWluX2ZpbGVfbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzcHJpbnRmIChidWYsICIlcyVzIiwgZGlyZWN0b3J5X25hbWUsIG1haW5fZmlsZV9uYW1lKTsKLQkgICpmaWxlbmFtZV9wdHIgPSBidWY7Ci0JICBidWYgKz0gZmlsZWxlbiArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoZnVuYykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmdW5jdGlvbiA9IGZ1bmMtPm5hbWU7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICAvKiBUaGUgY2FsbGVyIGV4cGVjdHMgYSBzeW1ib2wgbmFtZS4gIFdlIGFjdHVhbGx5IGhhdmUgYQotCSBmdW5jdGlvbiBuYW1lLCB3aXRob3V0IHRoZSBsZWFkaW5nIHVuZGVyc2NvcmUuICBQdXQgdGhlCi0JIHVuZGVyc2NvcmUgYmFjayBpbiwgc28gdGhhdCB0aGUgY2FsbGVyIGdldHMgYSBzeW1ib2wgbmFtZS4gICovCi0gICAgICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXDAnKQotCXN0cmNweSAoYnVmLCBmdW5jdGlvbik7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIHN0cmNweSAoYnVmICsgMSwgZnVuY3Rpb24pOwotCX0KLSAgICAgIC8qIEhhdmUgdG8gcmVtb3ZlIDogc3R1ZmYgKi8KLSAgICAgIHAgPSBzdHJjaHIgKGJ1ZiwgJzonKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JKnAgPSAnXDAnOwotICAgICAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBidWY7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKkFSR1NVU0VEKi8KLWludAotTkFNRShhb3V0LHNpemVvZl9oZWFkZXJzKSAoYWJmZCwgZXhlY2FibGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjYWJsZTsKLXsKLSAgcmV0dXJuIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZTsKLX0KLQotLyogRnJlZSBhbGwgaW5mb3JtYXRpb24gd2UgaGF2ZSBjYWNoZWQgZm9yIHRoaXMgQkZELiAgV2UgY2FuIGFsd2F5cwotICAgcmVhZCBpdCBhZ2FpbiBsYXRlciBpZiB3ZSBuZWVkIGl0LiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGJmZF9mcmVlX2NhY2hlZF9pbmZvKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbzsKLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNkZWZpbmUgQkZDSV9GUkVFKHgpIGlmICh4ICE9IE5VTEwpIHsgZnJlZSAoeCk7IHggPSBOVUxMOyB9Ci0gIEJGQ0lfRlJFRSAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkpOwotI2lmZGVmIFVTRV9NTUFQCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gMDsKLSAgYmZkX2ZyZWVfd2luZG93ICgmb2JqX2FvdXRfc3ltX3dpbmRvdyAoYWJmZCkpOwotICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSk7Ci0gIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gMDsKLSNlbHNlCi0gIEJGQ0lfRlJFRSAob2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotICBCRkNJX0ZSRUUgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpKTsKLSNlbmRpZgotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgQkZDSV9GUkVFIChvLT5yZWxvY2F0aW9uKTsKLSN1bmRlZiBCRkNJX0ZSRUUKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIGEub3V0IGxpbmsgY29kZS4gICovCi0KLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2NoZWNrX2FyX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPndyaXR0ZW4gPSBmYWxzZTsKLSAgICAgIHJldC0+aW5keCA9IC0xOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAocmV0LCBhYmZkLAotCQkJCQkgTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKSkpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBHaXZlbiBhbiBhLm91dCBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scykgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9vYmplY3Q6Ci0gICAgICByZXR1cm4gYW91dF9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JKGFiZmQsIGluZm8sIGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gYS5vdXQgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBhb3V0X2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCBmcm9tCi0gICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGlmICghIGFvdXRfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkgfHwgISAqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfZnJlZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGcmVlIHVwIHRoZSBpbnRlcm5hbCBzeW1ib2xzIHJlYWQgZnJvbSBhbiBhLm91dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpICE9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0jaWZkZWYgVVNFX01NQVAKLSAgICAgIGJmZF9mcmVlX3dpbmRvdyAoJm9ial9hb3V0X3N5bV93aW5kb3cgKGFiZmQpKTsKLSNlbHNlCi0gICAgICBmcmVlICgoUFRSKSBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSk7Ci0jZW5kaWYKLSAgICAgIG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGFiZmQpID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSBOVUxMOwotICAgIH0KLSAgaWYgKG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpICE9IChjaGFyICopIE5VTEwpCi0gICAgewotI2lmZGVmIFVTRV9NTUFQCi0gICAgICBiZmRfZnJlZV93aW5kb3cgKCZvYmpfYW91dF9zdHJpbmdfd2luZG93IChhYmZkKSk7Ci0jZWxzZQotICAgICAgZnJlZSAoKFBUUikgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoYWJmZCkpOwotI2VuZGlmCi0gICAgICBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKSA9IChjaGFyICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBpbnRlcm5hbCBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZAotICAgYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBXZSBzaG91bGQgaW5jbHVkZSB0aGlzIG9iamVjdCBmaWxlIGlmIGl0Ci0gICBkZWZpbmVzIGFueSBzeW1ib2xzIHdoaWNoIGFyZSBjdXJyZW50bHkgdW5kZWZpbmVkLiAgSWYgdGhpcyBvYmplY3QKLSAgIGZpbGUgZGVmaW5lcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4gd2UgbWF5IGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUKLSAgIGtub3duIHN5bWJvbCBidXQgd2UgZG8gbm90IGluY2x1ZGUgdGhlIG9iamVjdCBmaWxlIGluIHRoZSBsaW5rCi0gICAodW5sZXNzIHRoZXJlIGlzIHNvbWUgb3RoZXIgcmVhc29uIHRvIGluY2x1ZGUgaXQpLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICByZWdpc3RlciBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnA7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqcGVuZDsKLSAgY2hhciAqc3RyaW5nczsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBwID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIHBlbmQgPSBwICsgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChhYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpOwotICBmb3IgKDsgcCA8IHBlbmQ7IHArKykKLSAgICB7Ci0gICAgICBpbnQgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBwLT5lX3R5cGUpOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBJZ25vcmUgc3ltYm9scyB0aGF0IGFyZSBub3QgZXh0ZXJuYWxseSB2aXNpYmxlLiAgVGhpcyBpcyBhbgotCSBvcHRpbWl6YXRpb24gb25seSwgYXMgd2UgY2hlY2sgdGhlIHR5cGUgbW9yZSB0aG9yb3VnaGx5Ci0JIGJlbG93LiAgKi8KLSAgICAgIGlmICgoKHR5cGUgJiBOX0VYVCkgPT0gMAotCSAgIHx8ICh0eXBlICYgTl9TVEFCKSAhPSAwCi0JICAgfHwgdHlwZSA9PSBOX0ZOKQotCSAgJiYgdHlwZSAhPSBOX1dFQUtBCi0JICAmJiB0eXBlICE9IE5fV0VBS1QKLQkgICYmIHR5cGUgIT0gTl9XRUFLRAotCSAgJiYgdHlwZSAhPSBOX1dFQUtCKQotCXsKLQkgIGlmICh0eXBlID09IE5fV0FSTklORwotCSAgICAgIHx8IHR5cGUgPT0gTl9JTkRSKQotCSAgICArK3A7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkKLQkgdW5kZWZpbmVkIG9yIGNvbW1vbi4gICovCi0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKSkKLQl7Ci0JICBpZiAodHlwZSA9PSAoTl9JTkRSIHwgTl9FWFQpKQotCSAgICArK3A7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICh0eXBlID09IChOX1RFWFQgfCBOX0VYVCkKLQkgIHx8IHR5cGUgPT0gKE5fREFUQSB8IE5fRVhUKQotCSAgfHwgdHlwZSA9PSAoTl9CU1MgfCBOX0VYVCkKLQkgIHx8IHR5cGUgPT0gKE5fQUJTIHwgTl9FWFQpCi0JICB8fCB0eXBlID09IChOX0lORFIgfCBOX0VYVCkpCi0JewotCSAgLyogVGhpcyBvYmplY3QgZmlsZSBkZWZpbmVzIHRoaXMgc3ltYm9sLiAgV2UgbXVzdCBsaW5rIGl0Ci0JICAgICBpbi4gIFRoaXMgaXMgdHJ1ZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGN1cnJlbnQKLQkgICAgIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgb3IgY29tbW9uLiAgSWYgdGhlCi0JICAgICBjdXJyZW50IGRlZmluaXRpb24gaXMgY29tbW9uLCB3ZSBoYXZlIGEgY2FzZSBpbiB3aGljaCB3ZQotCSAgICAgaGF2ZSBhbHJlYWR5IHNlZW4gYW4gb2JqZWN0IGZpbGUgaW5jbHVkaW5nCi0JICAgICAgICAgaW50IGE7Ci0JICAgICBhbmQgdGhpcyBvYmplY3QgZmlsZSBmcm9tIHRoZSBhcmNoaXZlIGluY2x1ZGVzCi0JICAgICAgICAgaW50IGEgPSA1OwotCSAgICAgSW4gc3VjaCBhIGNhc2Ugd2UgbXVzdCBpbmNsdWRlIHRoaXMgb2JqZWN0IGZpbGUuCi0KLQkgICAgIEZJWE1FOiBUaGUgU3VuT1MgNC4xLjMgbGlua2VyIHdpbGwgcHVsbCBpbiB0aGUgYXJjaGl2ZQotCSAgICAgZWxlbWVudCBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gdGhlIC5kYXRhIHNlY3Rpb24sCi0JICAgICBidXQgbm90IGlmIGl0IGlzIGRlZmluZWQgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBUaGF0Ci0JICAgICBzZWVtcyBhIGJpdCBjcmF6eSB0byBtZSwgYW5kIEkgaGF2ZW4ndCBpbXBsZW1lbnRlZCBpdC4KLQkgICAgIEhvd2V2ZXIsIGl0IG1pZ2h0IGJlIGNvcnJlY3QuICAqLwotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKnBuZWVkZWQgPSB0cnVlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBpZiAodHlwZSA9PSAoTl9VTkRGIHwgTl9FWFQpKQotCXsKLQkgIGJmZF92bWEgdmFsdWU7Ci0KLQkgIHZhbHVlID0gR0VUX1dPUkQgKGFiZmQsIHAtPmVfdmFsdWUpOwotCSAgaWYgKHZhbHVlICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBjb21tb24gaW4gdGhlIG9iamVjdCBmcm9tIHRoZSBhcmNoaXZlCi0JCSBmaWxlLiAgKi8KLQkgICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkJewotCQkgIGJmZCAqc3ltYmZkOwotCQkgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCQkgIHN5bWJmZCA9IGgtPnUudW5kZWYuYWJmZDsKLQkJICBpZiAoc3ltYmZkID09IChiZmQgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBzeW1ib2wgd2FzIGNyZWF0ZWQgYXMgdW5kZWZpbmVkIGZyb20KLQkJCSBvdXRzaWRlIEJGRC4gIFdlIGFzc3VtZSB0aGF0IHdlIHNob3VsZCBsaW5rCi0JCQkgaW4gdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpcyBkb25lIGZvciB0aGUgLXUKLQkJCSBvcHRpb24gaW4gdGhlIGxpbmtlci4gICovCi0JCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywKLQkJCQkJCQkJICAgICBhYmZkLAotCQkJCQkJCQkgICAgIG5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JCSAgICAgIHJldHVybiB0cnVlOwotCQkgICAgfQotCQkgIC8qIFR1cm4gdGhlIGN1cnJlbnQgbGluayBzeW1ib2wgaW50byBhIGNvbW1vbgotCQkgICAgIHN5bWJvbC4gIEl0IGlzIGFscmVhZHkgb24gdGhlIHVuZGVmcyBsaXN0LiAgKi8KLQkJICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9jb21tb247Ci0JCSAgaC0+dS5jLnAgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSAqKQotCQkJICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkgIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfY29tbW9uX2VudHJ5KSkpOwotCQkgIGlmIChoLT51LmMucCA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKLQotCQkgIC8qIEZJWE1FOiBUaGlzIGlzbid0IHF1aXRlIHJpZ2h0LiAgVGhlIG1heGltdW0KLQkJICAgICBhbGlnbm1lbnQgb2YgYSBjb21tb24gc3ltYm9sIHNob3VsZCBiZSBzZXQgYnkgdGhlCi0JCSAgICAgYXJjaGl0ZWN0dXJlIG9mIHRoZSBvdXRwdXQgZmlsZSwgbm90IG9mIHRoZSBpbnB1dAotCQkgICAgIGZpbGUuICAqLwotCQkgIHBvd2VyID0gYmZkX2xvZzIgKHZhbHVlKTsKLQkJICBpZiAocG93ZXIgPiBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXIpCi0JCSAgICBwb3dlciA9IGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcjsKLQkJICBoLT51LmMucC0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXI7Ci0KLQkJICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3ltYmZkLAotCQkJCQkJCQkiQ09NTU9OIik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wgaWYKLQkJICAgICBuZWNlc3NhcnkuICAqLwotCQkgIGlmICh2YWx1ZSA+IGgtPnUuYy5zaXplKQotCQkgICAgaC0+dS5jLnNpemUgPSB2YWx1ZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodHlwZSA9PSBOX1dFQUtBCi0JICB8fCB0eXBlID09IE5fV0VBS1QKLQkgIHx8IHR5cGUgPT0gTl9XRUFLRAotCSAgfHwgdHlwZSA9PSBOX1dFQUtCKQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIHdlYWsgYnV0IGRlZmluZWQuICBXZSBtdXN0IHB1bGwgaXQgaW4gaWYKLQkgICAgIHRoZSBjdXJyZW50IGxpbmsgc3ltYm9sIGlzIHVuZGVmaW5lZCwgYnV0IHdlIGRvbid0IHdhbnQKLQkgICAgIGl0IGlmIHRoZSBjdXJyZW50IGxpbmsgc3ltYm9sIGlzIGNvbW1vbi4gICovCi0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGFsbCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBib29sZWFuICgqYWRkX29uZV9zeW1ib2wpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCSAgICAgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkJCQkgICAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwKLQkJCQkgICAgIGJvb2xlYW4sCi0JCQkJICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIGJmZF9zaXplX3R5cGUgc3ltX2NvdW50OwotICBjaGFyICpzdHJpbmdzOwotICBib29sZWFuIGNvcHk7Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICByZWdpc3RlciBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnA7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqcGVuZDsKLQotICBzeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoYWJmZCk7Ci0gIHN5bV9jb3VudCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCk7Ci0gIHN0cmluZ3MgPSBvYmpfYW91dF9leHRlcm5hbF9zdHJpbmdzIChhYmZkKTsKLSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGNvcHkgPSB0cnVlOwotCi0gIGlmIChhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmFkZF9keW5hbWljX3N5bWJvbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCphb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmFkZF9keW5hbWljX3N5bWJvbHMpCi0JICAgICAoYWJmZCwgaW5mbywgJnN5bXMsICZzeW1fY291bnQsICZzdHJpbmdzKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXZSBrZWVwIGEgbGlzdCBvZiB0aGUgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcyB0aGF0IGNvcnJlc3BvbmQKLSAgICAgdG8gcGFydGljdWxhciBzeW1ib2xzLiAgV2UgY291bGQganVzdCBsb29rIHRoZW0gdXAgaW4gdGhlIGhhc2gKLSAgICAgdGFibGUsIGJ1dCBrZWVwaW5nIHRoZSBsaXN0IGlzIG1vcmUgZWZmaWNpZW50LiAgUGVyaGFwcyB0aGlzCi0gICAgIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBpbmZvLT5rZWVwX21lbW9yeS4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJICgoc2l6ZV90KSBzeW1fY291bnQKLQkJCSAgKiBzaXplb2YgKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSkpKTsKLSAgaWYgKHN5bV9oYXNoID09IE5VTEwgJiYgc3ltX2NvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKSA9IHN5bV9oYXNoOwotCi0gIGFkZF9vbmVfc3ltYm9sID0gYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5hZGRfb25lX3N5bWJvbDsKLSAgaWYgKGFkZF9vbmVfc3ltYm9sID09IE5VTEwpCi0gICAgYWRkX29uZV9zeW1ib2wgPSBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbDsKLQotICBwID0gc3ltczsKLSAgcGVuZCA9IHAgKyBzeW1fY291bnQ7Ci0gIGZvciAoOyBwIDwgcGVuZDsgcCsrLCBzeW1faGFzaCsrKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotCi0gICAgICAqc3ltX2hhc2ggPSBOVUxMOwotCi0gICAgICB0eXBlID0gYmZkX2hfZ2V0XzggKGFiZmQsIHAtPmVfdHlwZSk7Ci0KLSAgICAgIC8qIElnbm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4gICovCi0gICAgICBpZiAoKHR5cGUgJiBOX1NUQUIpICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIG5hbWUgPSBzdHJpbmdzICsgR0VUX1dPUkQgKGFiZmQsIHAtPmVfc3RyeCk7Ci0gICAgICB2YWx1ZSA9IEdFVF9XT1JEIChhYmZkLCBwLT5lX3ZhbHVlKTsKLSAgICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIHN0cmluZyA9IE5VTEw7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgTl9VTkRGOgotCWNhc2UgTl9BQlM6Ci0JY2FzZSBOX1RFWFQ6Ci0JY2FzZSBOX0RBVEE6Ci0JY2FzZSBOX0JTUzoKLQljYXNlIE5fRk5fU0VROgotCWNhc2UgTl9DT01NOgotCWNhc2UgTl9TRVRWOgotCWNhc2UgTl9GTjoKLQkgIC8qIElnbm9yZSBzeW1ib2xzIHRoYXQgYXJlIG5vdCBleHRlcm5hbGx5IHZpc2libGUuICAqLwotCSAgY29udGludWU7Ci0JY2FzZSBOX0lORFI6Ci0JICAvKiBJZ25vcmUgbG9jYWwgaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQkgICsrcDsKLQkgICsrc3ltX2hhc2g7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0JICBpZiAodmFsdWUgPT0gMCkKLQkgICAgewotCSAgICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICAgIGZsYWdzID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBzZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0JY2FzZSBOX1NFVFYgfCBOX0VYVDoKLQkgIC8qIFRyZWF0IE5fU0VUViBzeW1ib2xzIGFzIE5fREFUQSBzeW1ib2w7IHNlZSBjb21tZW50IGluCi0JICAgICB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzLiAgKi8KLQkgIHNlY3Rpb24gPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgTl9CU1MgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0lORFIgfCBOX0VYVDoKLQkgIC8qIEFuIGluZGlyZWN0IHN5bWJvbC4gIFRoZSBuZXh0IHN5bWJvbCBpcyB0aGUgc3ltYm9sCi0JICAgICB3aGljaCB0aGlzIG9uZSByZWFsbHkgaXMuICAqLwotCSAgQkZEX0FTU0VSVCAocCArIDEgPCBwZW5kKTsKLQkgICsrcDsKLQkgIHN0cmluZyA9IHN0cmluZ3MgKyBHRVRfV09SRCAoYWJmZCwgcC0+ZV9zdHJ4KTsKLQkgIHNlY3Rpb24gPSBiZmRfaW5kX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgfD0gQlNGX0lORElSRUNUOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0NPTU0gfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NFVEE6IGNhc2UgTl9TRVRBIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIGJyZWFrOwotCWNhc2UgTl9TRVRUOiBjYXNlIE5fU0VUVCB8IE5fRVhUOgotCSAgc2VjdGlvbiA9IG9ial90ZXh0c2VjIChhYmZkKTsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1NFVEQ6IGNhc2UgTl9TRVREIHwgTl9FWFQ6Ci0JICBzZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBicmVhazsKLQljYXNlIE5fU0VUQjogY2FzZSBOX1NFVEIgfCBOX0VYVDoKLQkgIHNlY3Rpb24gPSBvYmpfYnNzc2VjIChhYmZkKTsKLQkgIGZsYWdzIHw9IEJTRl9DT05TVFJVQ1RPUjsKLQkgIHZhbHVlIC09IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dBUk5JTkc6Ci0JICAvKiBBIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybgotCSAgICAgYWJvdXQuICAqLwotCSAgQkZEX0FTU0VSVCAocCArIDEgPCBwZW5kKTsKLQkgICsrcDsKLQkgIHN0cmluZyA9IG5hbWU7Ci0JICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChhYmZkLCBwLT5lX3N0cngpOwotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBmbGFncyB8PSBCU0ZfV0FSTklORzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLVToKLQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLQToKLQkgIHNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgIGJyZWFrOwotCWNhc2UgTl9XRUFLVDoKLQkgIHNlY3Rpb24gPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0JICB2YWx1ZSAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQkgIGZsYWdzID0gQlNGX1dFQUs7Ci0JICBicmVhazsKLQljYXNlIE5fV0VBS0Q6Ci0JICBzZWN0aW9uID0gb2JqX2RhdGFzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1dFQUtCOgotCSAgc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotCSAgdmFsdWUgLT0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0JICBmbGFncyA9IEJTRl9XRUFLOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISAoKCphZGRfb25lX3N5bWJvbCkKLQkgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY29weSwgZmFsc2UsCi0JICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogUmVzdHJpY3QgdGhlIG1heGltdW0gYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbCBiYXNlZCBvbgotCSB0aGUgYXJjaGl0ZWN0dXJlLCBzaW5jZSBhLm91dCBoYXMgbm8gd2F5IHRvIHJlcHJlc2VudAotCSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIGEgc2VjdGlvbiBpbiBhIC5vIGZpbGUuICBGSVhNRToKLQkgVGhpcyBpc24ndCBxdWl0ZSByaWdodDogaXQgc2hvdWxkIHVzZSB0aGUgYXJjaGl0ZWN0dXJlIG9mIHRoZQotCSBvdXRwdXQgZmlsZSwgbm90IHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBpZiAoKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPgotCSAgICAgIGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+c2VjdGlvbl9hbGlnbl9wb3dlcikpCi0JKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlciA9Ci0JICBiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPnNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBzZXQgc3ltYm9sLCBhbmQgd2UgYXJlIG5vdCBidWlsZGluZyBzZXRzLCB0aGVuCi0JIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaGFzaCBlbnRyeSB0byBub3QgaGF2ZSBiZWVuIHNldC4gIEluCi0JIHN1Y2ggYSBjYXNlLCB0cmVhdCB0aGUgc3ltYm9sIGFzIG5vdCBnbG9iYWxseSBkZWZpbmVkLiAgKi8KLSAgICAgIGlmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCXsKLQkgIEJGRF9BU1NFUlQgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCk7Ci0JICAqc3ltX2hhc2ggPSBOVUxMOwotCX0KLQotICAgICAgaWYgKHR5cGUgPT0gKE5fSU5EUiB8IE5fRVhUKSB8fCB0eXBlID09IE5fV0FSTklORykKLQkrK3N5bV9oYXNoOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEEgaGFzaCB0YWJsZSB1c2VkIGZvciBoZWFkZXIgZmlsZXMgd2l0aCBOX0JJTkNMIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiB0b3RhbHMgdGhhdCB3ZSBoYXZlIGZvdW5kIGZvciBhIHBhcnRpY3VsYXIgaGVhZGVyCi0gICBmaWxlLiAgKi8KLQotc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMKLXsKLSAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc190b3RhbHMgKm5leHQ7Ci0gIGJmZF92bWEgdG90YWw7Ci19OwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIExpc3Qgb2YgdG90YWxzIHdlIGhhdmUgZm91bmQgZm9yIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdG90YWxzICp0b3RhbHM7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIHRoZSBoZWFkZXIgZmlsZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaW5jbHVkZXNfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBEdXJpbmcgdGhlIGZpbmFsIGxpbmsgc3RlcCB3ZSBuZWVkIHRvIHBhc3MgYXJvdW5kIGEgYnVuY2ggb2YKLSAgIGluZm9ybWF0aW9uLCBzbyB3ZSBkbyBpdCBpbiBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbwotewotICAvKiBHZW5lcmFsIGxpbmsgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogT3V0cHV0IGJmZC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogUmVsb2MgZmlsZSBwb3NpdGlvbnMuICAqLwotICBmaWxlX3B0ciB0cmVsb2ZmLCBkcmVsb2ZmOwotICAvKiBGaWxlIHBvc2l0aW9uIG9mIHN5bWJvbHMuICAqLwotICBmaWxlX3B0ciBzeW1vZmY7Ci0gIC8qIFN0cmluZyB0YWJsZS4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogSGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfdGFibGUgaW5jbHVkZXM7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBjb250ZW50cyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlbG9jcyBvZiBhbnkgc2VjdGlvbi4gICovCi0gIFBUUiByZWxvY3M7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBzeW1ib2wgbWFwIG9mIGFueSBpbnB1dCBCRkQuICAqLwotICBpbnQgKnN5bWJvbF9tYXA7Ci0gIC8qIEEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBzeW1ib2xzIG9mIGFueSBpbnB1dCBCRkQuICAqLwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKm91dHB1dF9zeW1zOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYW91dF9saW5rX2luY2x1ZGVzX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfd3JpdGVfc3ltYm9scwotICBQQVJBTVMgKChzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKiwgYmZkICppbnB1dF9iZmQpKTsKLXN0YXRpYyBib29sZWFuIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX2lucHV0X3NlY3Rpb24KLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkLAotCSAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCBmaWxlX3B0ciAqcmVsb2ZmX3B0ciwKLQkgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkLAotCSAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICosCi0JICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZSwgYmZkX2J5dGUgKmNvbnRlbnRzKSk7Ci1zdGF0aWMgYm9vbGVhbiBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGJmZCAqaW5wdXRfYmZkLAotCSAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLCBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICosCi0JICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZSwgYmZkX2J5dGUgKmNvbnRlbnRzKSk7Ci1zdGF0aWMgSU5MSU5FIGFzZWN0aW9uICphb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBlbnRyeSBpbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotYW91dF9saW5rX2luY2x1ZGVzX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaW5jbHVkZXNfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dG90YWxzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBEbyB0aGUgZmluYWwgbGluayBzdGVwLiAgVGhpcyBpcyBjYWxsZWQgb24gdGhlIG91dHB1dCBCRkQuICBUaGUKLSAgIElORk8gc3RydWN0dXJlIHNob3VsZCBwb2ludCB0byBhIGxpc3Qgb2YgQkZEcyBsaW5rZWQgdGhyb3VnaCB0aGUKLSAgIGxpbmtfbmV4dCBmaWVsZCB3aGljaCBjYW4gYmUgdXNlZCB0byBmaW5kIGVhY2ggQkZEIHdoaWNoIHRha2VzIHBhcnQKLSAgIGluIHRoZSBvdXRwdXQuICBBbHNvLCBlYWNoIHNlY3Rpb24gaW4gQUJGRCBzaG91bGQgcG9pbnQgdG8gYSBsaXN0Ci0gICBvZiBiZmRfbGlua19vcmRlciBzdHJ1Y3R1cmVzIHdoaWNoIGxpc3QgYWxsIHRoZSBpbnB1dCBzZWN0aW9ucyBmb3IKLSAgIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgY2FsbGJhY2spCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHZvaWQgKCpjYWxsYmFjaykgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosIGZpbGVfcHRyICopKTsKLXsKLSAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvIGFvdXRfaW5mbzsKLSAgYm9vbGVhbiBpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkID0gZmFsc2U7Ci0gIHJlZ2lzdGVyIGJmZCAqc3ViOwotICBiZmRfc2l6ZV90eXBlIHRyc2l6ZSwgZHJzaXplOwotICBzaXplX3QgbWF4X2NvbnRlbnRzX3NpemU7Ci0gIHNpemVfdCBtYXhfcmVsb2NzX3NpemU7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBiZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsKLSAgZmlsZV9wdHIgdGV4dF9lbmQ7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKm87Ci0gIGJvb2xlYW4gaGF2ZV9saW5rX29yZGVyX3JlbG9jczsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgYW91dF9pbmZvLmluZm8gPSBpbmZvOwotICBhb3V0X2luZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGFvdXRfaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGFvdXRfaW5mby5yZWxvY3MgPSBOVUxMOwotICBhb3V0X2luZm8uc3ltYm9sX21hcCA9IE5VTEw7Ci0gIGFvdXRfaW5mby5vdXRwdXRfc3ltcyA9IE5VTEw7Ci0KLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYW91dF9pbmZvLmluY2x1ZGVzLnJvb3QsCi0JCQkgICAgICAgYW91dF9saW5rX2luY2x1ZGVzX25ld2Z1bmMsCi0JCQkgICAgICAgMjUxKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaW5jbHVkZXNfaGFzaF9pbml0aWFsaXplZCA9IHRydWU7Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBzZWN0aW9uIHNpemUuICBBbHNvLCBpZiBnZW5lcmF0aW5nCi0gICAgIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGNvdW50IHRoZSByZWxvY3MuICAqLwotICB0cnNpemUgPSAwOwotICBkcnNpemUgPSAwOwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9yZWxvY3Nfc2l6ZSA9IDA7Ci0gIG1heF9zeW1fY291bnQgPSAwOwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc3o7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc3ViKSA9PSBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cikKLQkgICAgewotCSAgICAgIHRyc2l6ZSArPSBleGVjX2hkciAoc3ViKS0+YV90cnNpemU7Ci0JICAgICAgZHJzaXplICs9IGV4ZWNfaGRyIChzdWIpLT5hX2Ryc2l6ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdlIG5lZWQgdG8gaWRlbnRpZnkgdGhlIC50ZXh0IGFuZCAuZGF0YSBzZWN0aW9ucwotCQkgYW5kIGNhbGwgZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIGFuZCBjYW5vbmljYWxpemVfcmVsb2MgdG8KLQkJIHdvcmsgb3V0IHRoZSBudW1iZXIgb2YgcmVsb2NzIG5lZWRlZCwgYW5kIHRoZW4gbXVsdGlwbHkKLQkJIGJ5IHRoZSByZWxvYyBzaXplLiAgKi8KLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiByZWxvY2F0ZWFibGUgbGluayBmcm9tICVzIHRvICVzIG5vdCBzdXBwb3J0ZWQiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkgc3ViLT54dmVjLT5uYW1lLCBhYmZkLT54dmVjLT5uYW1lKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoYmZkX2dldF9mbGF2b3VyIChzdWIpID09IGJmZF90YXJnZXRfYW91dF9mbGF2b3VyKQotCXsKLQkgIHN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoc3ViLCBvYmpfdGV4dHNlYyAoc3ViKSk7Ci0JICBpZiAoc3ogPiBtYXhfY29udGVudHNfc2l6ZSkKLQkgICAgbWF4X2NvbnRlbnRzX3NpemUgPSBzejsKLQkgIHN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoc3ViLCBvYmpfZGF0YXNlYyAoc3ViKSk7Ci0JICBpZiAoc3ogPiBtYXhfY29udGVudHNfc2l6ZSkKLQkgICAgbWF4X2NvbnRlbnRzX3NpemUgPSBzejsKLQotCSAgc3ogPSBleGVjX2hkciAoc3ViKS0+YV90cnNpemU7Ci0JICBpZiAoc3ogPiBtYXhfcmVsb2NzX3NpemUpCi0JICAgIG1heF9yZWxvY3Nfc2l6ZSA9IHN6OwotCSAgc3ogPSBleGVjX2hkciAoc3ViKS0+YV9kcnNpemU7Ci0JICBpZiAoc3ogPiBtYXhfcmVsb2NzX3NpemUpCi0JICAgIG1heF9yZWxvY3Nfc2l6ZSA9IHN6OwotCi0JICBzeiA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoc3ViKTsKLQkgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCi0JICAgIG1heF9zeW1fY291bnQgPSBzejsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKG9ial90ZXh0c2VjIChhYmZkKSAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQl0cnNpemUgKz0gKF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKG9ial90ZXh0c2VjIChhYmZkKQotCQkJCQkJIC0+bGlua19vcmRlcl9oZWFkKQotCQkgICAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7Ci0gICAgICBpZiAob2JqX2RhdGFzZWMgKGFiZmQpICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCWRyc2l6ZSArPSAoX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcyAob2JqX2RhdGFzZWMgKGFiZmQpCi0JCQkJCQkgLT5saW5rX29yZGVyX2hlYWQpCi0JCSAgICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9IHRyc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZSA9IGRyc2l6ZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIC8qIEFkanVzdCB0aGUgc2VjdGlvbiBzaXplcyBhbmQgdm1hcyBhY2NvcmRpbmcgdG8gdGhlIG1hZ2ljIG51bWJlci4KLSAgICAgVGhpcyBzZXRzIGFfdGV4dCwgYV9kYXRhIGFuZCBhX2JzcyBpbiB0aGUgZXhlY19oZHIgYW5kIHNldHMgdGhlCi0gICAgIGZpbGVwb3MgZm9yIGVhY2ggc2VjdGlvbi4gICovCi0gIGlmICghIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSByZWxvY2F0aW9uIGFuZCBzeW1ib2wgZmlsZSBwb3NpdGlvbnMgZGlmZmVyIGFtb25nIGEub3V0Ci0gICAgIHRhcmdldHMuICBXZSBhcmUgcGFzc2VkIGEgY2FsbGJhY2sgcm91dGluZSBmcm9tIHRoZSBiYWNrZW5kCi0gICAgIHNwZWNpZmljIGNvZGUgdG8gaGFuZGxlIHRoaXMuCi0gICAgIEZJWE1FOiBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCBrbm93IGhvdyBtdWNoIHNwYWNlIHRoZSBzeW1ib2wKLSAgICAgdGFibGUgd2lsbCByZXF1aXJlLiAgVGhpcyB3aWxsIG5vdCB3b3JrIGZvciBhbnkgKG5vbnN0YW5kYXJkKQotICAgICBhLm91dCB0YXJnZXQgdGhhdCBuZWVkcyB0byBrbm93IHRoZSBzeW1ib2wgdGFibGUgc2l6ZSBiZWZvcmUgaXQKLSAgICAgY2FuIGNvbXB1dGUgdGhlIHJlbG9jYXRpb24gZmlsZSBwb3NpdGlvbnMuICBUaGlzIG1heSBvciBtYXkgbm90Ci0gICAgIGJlIHRoZSBjYXNlIGZvciB0aGUgaHAzMDBocHV4IHRhcmdldCwgZm9yIGV4YW1wbGUuICAqLwotICAoKmNhbGxiYWNrKSAoYWJmZCwgJmFvdXRfaW5mby50cmVsb2ZmLCAmYW91dF9pbmZvLmRyZWxvZmYsCi0JICAgICAgICZhb3V0X2luZm8uc3ltb2ZmKTsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IGFvdXRfaW5mby50cmVsb2ZmOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gYW91dF9pbmZvLmRyZWxvZmY7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBhb3V0X2luZm8uc3ltb2ZmOwotCi0gIC8qIFdlIGtlZXAgYSBjb3VudCBvZiB0aGUgc3ltYm9scyBhcyB3ZSBvdXRwdXQgdGhlbS4gICovCi0gIG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAoYWJmZCkgPSAwOwotCi0gIC8qIFdlIGFjY3VtdWxhdGUgdGhlIHN0cmluZyB0YWJsZSBhcyB3ZSB3cml0ZSBvdXQgdGhlIHN5bWJvbHMuICAqLwotICBhb3V0X2luZm8uc3RydGFiID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGFvdXRfaW5mby5zdHJ0YWIgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBBbGxvY2F0ZSBidWZmZXJzIHRvIGhvbGQgc2VjdGlvbiBjb250ZW50cyBhbmQgcmVsb2NzLiAgKi8KLSAgYW91dF9pbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKLSAgYW91dF9pbmZvLnJlbG9jcyA9IChQVFIpIGJmZF9tYWxsb2MgKG1heF9yZWxvY3Nfc2l6ZSk7Ci0gIGFvdXRfaW5mby5zeW1ib2xfbWFwID0gKGludCAqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChpbnQgKikpOwotICBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPSAoKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKQotCQkJICAgYmZkX21hbGxvYyAoKG1heF9zeW1fY291bnQgKyAxKQotCQkJCSAgICAgICAqIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KSkpOwotICBpZiAoKGFvdXRfaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplICE9IDApCi0gICAgICB8fCAoYW91dF9pbmZvLnJlbG9jcyA9PSBOVUxMICYmIG1heF9yZWxvY3Nfc2l6ZSAhPSAwKQotICAgICAgfHwgKGFvdXRfaW5mby5zeW1ib2xfbWFwID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgYW91dF9pbmZvLm91dHB1dF9zeW1zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSWYgd2UgaGF2ZSBhIHN5bWJvbCBuYW1lZCBfX0RZTkFNSUMsIGZvcmNlIGl0IG91dCBub3cuICBUaGlzIGlzCi0gICAgIHJlcXVpcmVkIGJ5IFN1bk9TLiAgRG9pbmcgdGhpcyBoZXJlIHJhdGhlciB0aGFuIGluIHN1bm9zLmMgaXMgYQotICAgICBoYWNrLCBidXQgaXQncyBlYXNpZXIgdGhhbiBleHBvcnRpbmcgZXZlcnl0aGluZyB3aGljaCB3b3VsZCBiZQotICAgICBuZWVkZWQuICAqLwotICB7Ci0gICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgaCA9IGFvdXRfbGlua19oYXNoX2xvb2t1cCAoYW91dF9oYXNoX3RhYmxlIChpbmZvKSwgIl9fRFlOQU1JQyIsCi0JCQkgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgaWYgKGggIT0gTlVMTCkKLSAgICAgIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsICZhb3V0X2luZm8pOwotICB9Ci0KLSAgLyogVGhlIG1vc3QgdGltZSBlZmZpY2llbnQgd2F5IHRvIGRvIHRoZSBsaW5rIHdvdWxkIGJlIHRvIHJlYWQgYWxsCi0gICAgIHRoZSBpbnB1dCBvYmplY3QgZmlsZXMgaW50byBtZW1vcnkgYW5kIHRoZW4gc29ydCBvdXQgdGhlCi0gICAgIGluZm9ybWF0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLiAgVW5mb3J0dW5hdGVseSwgdGhhdCB3aWxsCi0gICAgIHByb2JhYmx5IHVzZSB0b28gbXVjaCBtZW1vcnkuICBBbm90aGVyIG1ldGhvZCB3b3VsZCBiZSB0byBzdGVwCi0gICAgIHRocm91Z2ggZXZlcnl0aGluZyB0aGF0IGNvbXBvc2VzIHRoZSB0ZXh0IHNlY3Rpb24gYW5kIHdyaXRlIGl0Ci0gICAgIG91dCwgYW5kIHRoZW4gZXZlcnl0aGluZyB0aGF0IGNvbXBvc2VzIHRoZSBkYXRhIHNlY3Rpb24gYW5kIHdyaXRlCi0gICAgIGl0IG91dCwgYW5kIHRoZW4gd3JpdGUgb3V0IHRoZSByZWxvY3MsIGFuZCB0aGVuIHdyaXRlIG91dCB0aGUKLSAgICAgc3ltYm9scy4gIFVuZm9ydHVuYXRlbHksIHRoYXQgcmVxdWlyZXMgcmVhZGluZyBzdHVmZiBmcm9tIGVhY2gKLSAgICAgaW5wdXQgZmlsZSBzZXZlcmFsIHRpbWVzLCBhbmQgd2Ugd2lsbCBub3QgYmUgYWJsZSB0byBrZWVwIGFsbCB0aGUKLSAgICAgaW5wdXQgZmlsZXMgb3BlbiBzaW11bHRhbmVvdXNseSwgYW5kIHJlb3BlbmluZyB0aGVtIHdpbGwgYmUgc2xvdy4KLQotICAgICBXaGF0IHdlIGRvIGlzIGJhc2ljYWxseSBwcm9jZXNzIG9uZSBpbnB1dCBmaWxlIGF0IGEgdGltZS4gIFdlIGRvCi0gICAgIGV2ZXJ5dGhpbmcgd2UgbmVlZCB0byBkbyB3aXRoIGFuIGlucHV0IGZpbGUgb25jZS0tY29weSBvdmVyIHRoZQotICAgICBzZWN0aW9uIGNvbnRlbnRzLCBoYW5kbGUgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24sIGFuZCB3cml0ZQotICAgICBvdXQgdGhlIHN5bWJvbHMtLWFuZCB0aGVuIHdlIHRocm93IGF3YXkgdGhlIGluZm9ybWF0aW9uIHdlIHJlYWQKLSAgICAgZnJvbSBpdC4gIFRoaXMgYXBwcm9hY2ggcmVxdWlyZXMgYSBsb3Qgb2YgbHNlZWtzIG9mIHRoZSBvdXRwdXQKLSAgICAgZmlsZSwgd2hpY2ggaXMgdW5mb3J0dW5hdGUgYnV0IHN0aWxsIGZhc3RlciB0aGFuIHJlb3BlbmluZyBhIGxvdAotICAgICBvZiBmaWxlcy4KLQotICAgICBXZSB1c2UgdGhlIG91dHB1dF9oYXNfYmVndW4gZmllbGQgb2YgdGhlIGlucHV0IEJGRHMgdG8gc2VlCi0gICAgIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgaXQuICAqLwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSAoYmZkICopIE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotCi0gIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFRoaXMKLSAgICAgd2lsbCBub3JtYWxseSBiZSBldmVyeSBzZWN0aW9uLiAgV2UgbmVlZCB0byBkbyB0aGlzIHNvIHRoYXQgd2UKLSAgICAgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaCB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdAotICAgICBpbmNsdWRlLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICBwLT51LmluZGlyZWN0LnNlY3Rpb24tPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGhhdmVfbGlua19vcmRlcl9yZWxvY3MgPSBmYWxzZTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0KLQkgICAgICBpbnB1dF9iZmQgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGlmICghIGlucHV0X2JmZC0+b3V0cHV0X2hhc19iZWd1bikKLQkJewotCQkgIGlmICghIGFvdXRfbGlua19pbnB1dF9iZmQgKCZhb3V0X2luZm8sIGlucHV0X2JmZCkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBpbnB1dF9iZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIC8qIFRoZXNlIGFyZSBoYW5kbGVkIGJlbG93LiAgKi8KLQkgICAgICBoYXZlX2xpbmtfb3JkZXJfcmVsb2NzID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IGFueSBzeW1ib2xzIHRoYXQgd2UgaGF2ZSBub3QgYWxyZWFkeSB3cml0dGVuIG91dC4gICovCi0gIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlIChhb3V0X2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCwKLQkJCSAgIChQVFIpICZhb3V0X2luZm8pOwotCi0gIC8qIE5vdyBoYW5kbGUgYW55IHJlbG9jcyB3ZSB3ZXJlIGFza2VkIHRvIGNyZWF0ZSBieSB0aGUgbGlua2VyLgotICAgICBUaGVzZSBkaWQgbm90IGNvbWUgZnJvbSBhbnkgaW5wdXQgZmlsZS4gIFdlIG11c3QgZG8gdGhlc2UgYWZ0ZXIKLSAgICAgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlIHN5bWJvbHMsIHNvIHRoYXQgd2Uga25vdyB0aGUgc3ltYm9sCi0gICAgIGluZGljZXMgdG8gdXNlLiAgKi8KLSAgaWYgKGhhdmVfbGlua19vcmRlcl9yZWxvY3MpCi0gICAgewotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKCEgYW91dF9saW5rX3JlbG9jX2xpbmtfb3JkZXIgKCZhb3V0X2luZm8sIG8sIHApKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGFvdXRfaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGFvdXRfaW5mby5jb250ZW50cyk7Ci0gICAgICBhb3V0X2luZm8uY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGFvdXRfaW5mby5yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChhb3V0X2luZm8ucmVsb2NzKTsKLSAgICAgIGFvdXRfaW5mby5yZWxvY3MgPSBOVUxMOwotICAgIH0KLSAgaWYgKGFvdXRfaW5mby5zeW1ib2xfbWFwICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYW91dF9pbmZvLnN5bWJvbF9tYXApOwotICAgICAgYW91dF9pbmZvLnN5bWJvbF9tYXAgPSBOVUxMOwotICAgIH0KLSAgaWYgKGFvdXRfaW5mby5vdXRwdXRfc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGFvdXRfaW5mby5vdXRwdXRfc3ltcyk7Ci0gICAgICBhb3V0X2luZm8ub3V0cHV0X3N5bXMgPSBOVUxMOwotICAgIH0KLSAgaWYgKGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQpCi0gICAgewotICAgICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFvdXRfaW5mby5pbmNsdWRlcy5yb290KTsKLSAgICAgIGluY2x1ZGVzX2hhc2hfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgLyogRmluaXNoIHVwIGFueSBkeW5hbWljIGxpbmtpbmcgd2UgbWF5IGJlIGRvaW5nLiAgKi8KLSAgaWYgKGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZmluaXNoX2R5bmFtaWNfbGluayAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgqYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5maW5pc2hfZHluYW1pY19saW5rKSAoYWJmZCwgaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFVwZGF0ZSB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgYWJmZC0+c3ltY291bnQgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKGFiZmQpOwotICBleGVjX2hkciAoYWJmZCktPmFfc3ltcyA9IGFiZmQtPnN5bWNvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgKyBleGVjX2hkciAoYWJmZCktPmFfc3ltczsKLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9Ci0gICAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCA9Ci0gICAgZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZSAvIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHN0cmluZyB0YWJsZSwgdW5sZXNzIHRoZXJlIGFyZSBubyBzeW1ib2xzLiAgKi8KLSAgaWYgKGFiZmQtPnN5bWNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9ial9zdHJfZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAhIGVtaXRfc3RyaW5ndGFiIChhYmZkLCBhb3V0X2luZm8uc3RydGFiKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQgPT0gMAotCSAgICYmIG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBiOwotCi0gICAgICBiID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MKLQkJICAgICArIGV4ZWNfaGRyIChhYmZkKS0+YV9kYXRhCi0JCSAgICAgLSAxKSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGFvdXRfaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5jb250ZW50cyk7Ci0gIGlmIChhb3V0X2luZm8ucmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoYW91dF9pbmZvLnJlbG9jcyk7Ci0gIGlmIChhb3V0X2luZm8uc3ltYm9sX21hcCAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5zeW1ib2xfbWFwKTsKLSAgaWYgKGFvdXRfaW5mby5vdXRwdXRfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGFvdXRfaW5mby5vdXRwdXRfc3ltcyk7Ci0gIGlmIChpbmNsdWRlc19oYXNoX2luaXRpYWxpemVkKQotICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKCZhb3V0X2luZm8uaW5jbHVkZXMucm9vdCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTGluayBhbiBhLm91dCBpbnB1dCBCRkQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX2lucHV0X2JmZCAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGFvdXRfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltX2NvdW50OwotCi0gIEJGRF9BU1NFUlQgKGJmZF9nZXRfZm9ybWF0IChpbnB1dF9iZmQpID09IGJmZF9vYmplY3QpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIG9iamVjdCwgaXQgbWF5IG5lZWQgc3BlY2lhbCBoYW5kbGluZy4gICovCi0gIGlmICgoaW5wdXRfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmIGFvdXRfYmFja2VuZF9pbmZvIChpbnB1dF9iZmQpLT5saW5rX2R5bmFtaWNfb2JqZWN0ICE9IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuICgoKmFvdXRfYmFja2VuZF9pbmZvIChpbnB1dF9iZmQpLT5saW5rX2R5bmFtaWNfb2JqZWN0KQotCSAgICAgIChmaW5mby0+aW5mbywgaW5wdXRfYmZkKSk7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgc3ltYm9scy4gIFdlIHByb2JhYmx5IGhhdmUgdGhlbSBhbHJlYWR5LCB1bmxlc3MKLSAgICAgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5IGlzIGZhbHNlLiAgKi8KLSAgaWYgKCEgYW91dF9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ltX2NvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChpbnB1dF9iZmQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3ltYm9scyBhbmQgZ2V0IGEgbWFwIG9mIHRoZSBuZXcgaW5kaWNlcy4gIFRoZSBtYXAKLSAgICAgaXMgcGxhY2VkIGludG8gZmluZm8tPnN5bWJvbF9tYXAuICAqLwotICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfc3ltYm9scyAoZmluZm8sIGlucHV0X2JmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlbG9jYXRlIGFuZCB3cml0ZSBvdXQgdGhlIHNlY3Rpb25zLiAgVGhlc2UgZnVuY3Rpb25zIHVzZSB0aGUKLSAgICAgc3ltYm9sIG1hcCBjcmVhdGVkIGJ5IGFvdXRfbGlua193cml0ZV9zeW1ib2xzLiAgVGhlIGxpbmtlcl9tYXJrCi0gICAgIGZpZWxkIHdpbGwgYmUgc2V0IGlmIHRoZXNlIHNlY3Rpb25zIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLSAgICAgbGluaywgd2hpY2ggd2lsbCBub3JtYWxseSBiZSB0aGUgY2FzZS4gICovCi0gIGlmIChvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKS0+bGlua2VyX21hcmspCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb24gKGZpbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBvYmpfdGV4dHNlYyAoaW5wdXRfYmZkKSwKLQkJCQkgICAgICZmaW5mby0+dHJlbG9mZiwKLQkJCQkgICAgIGV4ZWNfaGRyIChpbnB1dF9iZmQpLT5hX3Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKG9ial9kYXRhc2VjIChpbnB1dF9iZmQpLT5saW5rZXJfbWFyaykKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbiAoZmluZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIG9ial9kYXRhc2VjIChpbnB1dF9iZmQpLAotCQkJCSAgICAgJmZpbmZvLT5kcmVsb2ZmLAotCQkJCSAgICAgZXhlY19oZHIgKGlucHV0X2JmZCktPmFfZHJzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3Qga2VlcGluZyBtZW1vcnksIHdlIGRvbid0IG5lZWQgdGhlIHN5bWJvbHMgYW55Ci0gICAgIGxvbmdlci4gIFdlIHN0aWxsIG5lZWQgdGhlbSBpZiB3ZSBhcmUga2VlcGluZyBtZW1vcnksIGJlY2F1c2UgdGhlCi0gICAgIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgcG9pbnQgaW50byB0aGVtLiAgKi8KLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIHsKLSAgICAgIGlmICghIGFvdXRfbGlua19mcmVlX3N5bWJvbHMgKGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGFuZCB3cml0ZSBvdXQgdGhlIHN5bWJvbHMgZm9yIGFuIGEub3V0IGZpbGUuICBTZXQgdGhlIG5ldwotICAgc3ltYm9sIGluZGljZXMgaW50byBhIHN5bWJvbF9tYXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYW91dF9saW5rX3dyaXRlX3N5bWJvbHMgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGJmZF9zaXplX3R5cGUgc3ltX2NvdW50OwotICBjaGFyICpzdHJpbmdzOwotICBlbnVtIGJmZF9saW5rX3N0cmlwIHN0cmlwOwotICBlbnVtIGJmZF9saW5rX2Rpc2NhcmQgZGlzY2FyZDsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRzeW07Ci0gIGJmZF9zaXplX3R5cGUgc3RydGFiX2luZGV4OwotICByZWdpc3RlciBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1fZW5kOwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgaW50ICpzeW1ib2xfbWFwOwotICBib29sZWFuIHBhc3M7Ci0gIGJvb2xlYW4gc2tpcF9uZXh0OwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgc3ltX2NvdW50ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChpbnB1dF9iZmQpOwotICBzdHJpbmdzID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyAoaW5wdXRfYmZkKTsKLSAgc3RyaXAgPSBmaW5mby0+aW5mby0+c3RyaXA7Ci0gIGRpc2NhcmQgPSBmaW5mby0+aW5mby0+ZGlzY2FyZDsKLSAgb3V0c3ltID0gZmluZm8tPm91dHB1dF9zeW1zOwotCi0gIC8qIEZpcnN0IHdyaXRlIG91dCBhIHN5bWJvbCBmb3IgdGhpcyBvYmplY3QgZmlsZSwgdW5sZXNzIHdlIGFyZQotICAgICBkaXNjYXJkaW5nIHN1Y2ggc3ltYm9scy4gICovCi0gIGlmIChzdHJpcCAhPSBzdHJpcF9hbGwKLSAgICAgICYmIChzdHJpcCAhPSBzdHJpcF9zb21lCi0JICB8fCBiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIGlucHV0X2JmZC0+ZmlsZW5hbWUsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UpICE9IE5VTEwpCi0gICAgICAmJiBkaXNjYXJkICE9IGRpc2NhcmRfYWxsKQotICAgIHsKLSAgICAgIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCBOX1RFWFQsIG91dHN5bS0+ZV90eXBlKTsKLSAgICAgIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCAwLCBvdXRzeW0tPmVfb3RoZXIpOwotICAgICAgYmZkX2hfcHV0XzE2IChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgb3V0c3ltLT5lX2Rlc2MpOwotICAgICAgc3RydGFiX2luZGV4ID0gYWRkX3RvX3N0cmluZ3RhYiAob3V0cHV0X2JmZCwgZmluZm8tPnN0cnRhYiwKLQkJCQkgICAgICAgaW5wdXRfYmZkLT5maWxlbmFtZSwgZmFsc2UpOwotICAgICAgaWYgKHN0cnRhYl9pbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHN0cnRhYl9pbmRleCwgb3V0c3ltLT5lX3N0cngpOwotICAgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsCi0JCShiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLAotCQkJCSAgICAgIG9ial90ZXh0c2VjIChpbnB1dF9iZmQpLT5vdXRwdXRfc2VjdGlvbikKLQkJICsgb2JqX3RleHRzZWMgKGlucHV0X2JmZCktPm91dHB1dF9vZmZzZXQpLAotCQlvdXRzeW0tPmVfdmFsdWUpOwotICAgICAgKytvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICAgICAgKytvdXRzeW07Ci0gICAgfQotCi0gIHBhc3MgPSBmYWxzZTsKLSAgc2tpcF9uZXh0ID0gZmFsc2U7Ci0gIHN5bSA9IG9ial9hb3V0X2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIHN5bV9lbmQgPSBzeW0gKyBzeW1fY291bnQ7Ci0gIHN5bV9oYXNoID0gb2JqX2FvdXRfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgc3ltYm9sX21hcCA9IGZpbmZvLT5zeW1ib2xfbWFwOwotICBtZW1zZXQgKHN5bWJvbF9tYXAsIDAsIHN5bV9jb3VudCAqIHNpemVvZiAqc3ltYm9sX21hcCk7Ci0gIGZvciAoOyBzeW0gPCBzeW1fZW5kOyBzeW0rKywgc3ltX2hhc2grKywgc3ltYm9sX21hcCsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGFzZWN0aW9uICpzeW1zZWM7Ci0gICAgICBiZmRfdm1hIHZhbCA9IDA7Ci0gICAgICBib29sZWFuIGNvcHk7Ci0KLSAgICAgIC8qIFdlIHNldCAqc3ltYm9sX21hcCB0byAwIGFib3ZlIGZvciBhbGwgc3ltYm9scy4gIElmIGl0IGhhcwotICAgICAgICAgYWxyZWFkeSBiZWVuIHNldCB0byAtMSBmb3IgdGhpcyBzeW1ib2wsIGl0IG1lYW5zIHRoYXQgd2UgYXJlCi0gICAgICAgICBkaXNjYXJkaW5nIGl0IGJlY2F1c2UgaXQgYXBwZWFycyBpbiBhIGR1cGxpY2F0ZSBoZWFkZXIgZmlsZS4KLSAgICAgICAgIFNlZSB0aGUgTl9CSU5DTCBjb2RlIGJlbG93LiAgKi8KLSAgICAgIGlmICgqc3ltYm9sX21hcCA9PSAtMSkKLQljb250aW51ZTsKLQotICAgICAgLyogSW5pdGlhbGl6ZSAqc3ltYm9sX21hcCB0byAtMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc3ltYm9sIHdhcwotICAgICAgICAgbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFdlIHdpbGwgY2hhbmdlIGl0IGxhdGVyIGlmCi0gICAgICAgICB3ZSBkbyBjb3B5IHRoZSBzeW1ib2wgb3Zlci4gICovCi0gICAgICAqc3ltYm9sX21hcCA9IC0xOwotCi0gICAgICB0eXBlID0gYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgc3ltLT5lX3R5cGUpOwotICAgICAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfc3RyeCk7Ci0KLSAgICAgIGggPSBOVUxMOwotCi0gICAgICBpZiAocGFzcykKLQl7Ci0JICAvKiBQYXNzIHRoaXMgc3ltYm9sIHRocm91Z2guICBJdCBpcyB0aGUgdGFyZ2V0IG9mIGFuCi0JICAgICBpbmRpcmVjdCBvciB3YXJuaW5nIHN5bWJvbC4gICovCi0JICB2YWwgPSBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfdmFsdWUpOwotCSAgcGFzcyA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKHNraXBfbmV4dCkKLQl7Ci0JICAvKiBTa2lwIHRoaXMgc3ltYm9sLCB3aGljaCBpcyB0aGUgdGFyZ2V0IG9mIGFuIGluZGlyZWN0Ci0JICAgICBzeW1ib2wgdGhhdCB3ZSBoYXZlIGNoYW5nZWQgdG8gbm8gbG9uZ2VyIGJlIGFuIGluZGlyZWN0Ci0JICAgICBzeW1ib2wuICAqLwotCSAgc2tpcF9uZXh0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpocmVzb2x2ZTsKLQotCSAgLyogV2UgaGF2ZSBzYXZlZCB0aGUgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIGlmCi0JICAgICB0aGVyZSBpcyBvbmUuICBOb3RlIHRoYXQgd2UgY291bGQganVzdCBsb29rIGl0IHVwIGFnYWluCi0JICAgICBpbiB0aGUgaGFzaCB0YWJsZSwgcHJvdmlkZWQgd2UgZmlyc3QgY2hlY2sgdGhhdCBpdCBpcyBhbgotCSAgICAgZXh0ZXJuYWwgc3ltYm9sLiAqLwotCSAgaCA9ICpzeW1faGFzaDsKLQotCSAgLyogVXNlIHRoZSBuYW1lIGZyb20gdGhlIGhhc2ggdGFibGUsIGluIGNhc2UgdGhlIHN5bWJvbCB3YXMKLSAgICAgICAgICAgICB3cmFwcGVkLiAgKi8KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCi0JICAvKiBJZiB0aGlzIGlzIGFuIGluZGlyZWN0IG9yIHdhcm5pbmcgc3ltYm9sLCB0aGVuIGNoYW5nZQotCSAgICAgaHJlc29sdmUgdG8gdGhlIGJhc2Ugc3ltYm9sLiAgV2UgYWxzbyBjaGFuZ2UgKnN5bV9oYXNoIHNvCi0JICAgICB0aGF0IHRoZSByZWxvY2F0aW9uIHJvdXRpbmVzIHJlbG9jYXRlIGFnYWluc3QgdGhlIHJlYWwKLQkgICAgIHN5bWJvbC4gICovCi0JICBocmVzb2x2ZSA9IGg7Ci0JICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKSkKLQkgICAgewotCSAgICAgIGhyZXNvbHZlID0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgICAgIHdoaWxlIChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJICAgICB8fCBocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJaHJlc29sdmUgPSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgIGhyZXNvbHZlLT5yb290LnUuaS5saW5rKTsKLQkgICAgICAqc3ltX2hhc2ggPSBocmVzb2x2ZTsKLQkgICAgfQotCi0JICAvKiBJZiB0aGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbiBvdXQsIHNraXAgaXQuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfd2FybmluZwotCSAgICAgICYmIGgtPndyaXR0ZW4pCi0JICAgIHsKLQkgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fSU5EUgotCQkgIHx8IHR5cGUgPT0gTl9XQVJOSU5HKQotCQlza2lwX25leHQgPSB0cnVlOwotCSAgICAgICpzeW1ib2xfbWFwID0gaC0+aW5keDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTZWUgaWYgd2UgYXJlIHN0cmlwcGluZyB0aGlzIHN5bWJvbC4gICovCi0JICBza2lwID0gZmFsc2U7Ci0JICBzd2l0Y2ggKHN0cmlwKQotCSAgICB7Ci0JICAgIGNhc2Ugc3RyaXBfbm9uZToKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBzdHJpcF9kZWJ1Z2dlcjoKLQkgICAgICBpZiAoKHR5cGUgJiBOX1NUQUIpICE9IDApCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIHN0cmlwX3NvbWU6Ci0JICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKQotCQkgID09IE5VTEwpCi0JCXNraXAgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIHN0cmlwX2FsbDoKLQkgICAgICBza2lwID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKHNraXApCi0JICAgIHsKLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCWgtPndyaXR0ZW4gPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEdldCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gICovCi0JICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fVEVYVAotCSAgICAgIHx8IHR5cGUgPT0gTl9XRUFLVCkKLQkgICAgc3ltc2VjID0gb2JqX3RleHRzZWMgKGlucHV0X2JmZCk7Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9EQVRBCi0JCSAgIHx8IHR5cGUgPT0gTl9XRUFLRCkKLQkgICAgc3ltc2VjID0gb2JqX2RhdGFzZWMgKGlucHV0X2JmZCk7Ci0JICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9CU1MKLQkJICAgfHwgdHlwZSA9PSBOX1dFQUtCKQotCSAgICBzeW1zZWMgPSBvYmpfYnNzc2VjIChpbnB1dF9iZmQpOwotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fQUJTCi0JCSAgIHx8IHR5cGUgPT0gTl9XRUFLQSkKLQkgICAgc3ltc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKCgodHlwZSAmIE5fVFlQRSkgPT0gTl9JTkRSCi0JCSAgICAmJiAoaHJlc29sdmUgPT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JCQl8fCAoaHJlc29sdmUtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAmJiBocmVzb2x2ZS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkJICAgICYmIGhyZXNvbHZlLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKSkKLQkJICAgfHwgdHlwZSA9PSBOX1dBUk5JTkcpCi0JICAgIHsKLQkgICAgICAvKiBQYXNzIHRoZSBuZXh0IHN5bWJvbCB0aHJvdWdoIHVuY2hhbmdlZC4gIFRoZQotCQkgY29uZGl0aW9uIGFib3ZlIGZvciBpbmRpcmVjdCBzeW1ib2xzIGlzIHNvIHRoYXQgaWYKLQkJIHRoZSBpbmRpcmVjdCBzeW1ib2wgd2FzIGRlZmluZWQsIHdlIG91dHB1dCBpdCB3aXRoCi0JCSB0aGUgY29ycmVjdCBkZWZpbml0aW9uIHNvIHRoZSBkZWJ1Z2dlciB3aWxsCi0JCSB1bmRlcnN0YW5kIGl0LiAgKi8KLQkgICAgICBwYXNzID0gdHJ1ZTsKLQkgICAgICB2YWwgPSBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfdmFsdWUpOwotCSAgICAgIHN5bXNlYyA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCh0eXBlICYgTl9TVEFCKSAhPSAwKQotCSAgICB7Ci0JICAgICAgdmFsID0gR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKTsKLQkgICAgICBzeW1zZWMgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB3aXRoIGFuIGluZGlyZWN0IHN5bWJvbCwgaXQgbWVhbnMgdGhhdAotCQkgd2UgYXJlIG91dHB1dHRpbmcgaXQgd2l0aCBhIHJlYWwgZGVmaW5pdGlvbi4gIEluIHN1Y2gKLQkJIGEgY2FzZSB3ZSBkbyBub3Qgd2FudCB0byBvdXRwdXQgdGhlIG5leHQgc3ltYm9sLAotCQkgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiB0aGUgaW5kaXJlY3Rpb24uICAqLwotCSAgICAgIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9JTkRSKQotCQlza2lwX25leHQgPSB0cnVlOwotCi0JICAgICAgc3ltc2VjID0gTlVMTDsKLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBoYXNoIHRhYmxlLiAgV2UgdXNlCi0JCSBocmVzb2x2ZSBzbyB0aGF0IGlmIHdlIGhhdmUgZGVmaW5lZCBhbiBpbmRpcmVjdAotCQkgc3ltYm9sIHdlIG91dHB1dCB0aGUgZmluYWwgZGVmaW5pdGlvbi4gICovCi0JICAgICAgaWYgKGggPT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQl7Ci0JCSAgc3dpdGNoICh0eXBlICYgTl9UWVBFKQotCQkgICAgewotCQkgICAgY2FzZSBOX1NFVFQ6Ci0JCSAgICAgIHN5bXNlYyA9IG9ial90ZXh0c2VjIChpbnB1dF9iZmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgTl9TRVREOgotCQkgICAgICBzeW1zZWMgPSBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIE5fU0VUQjoKLQkJICAgICAgc3ltc2VjID0gb2JqX2Jzc3NlYyAoaW5wdXRfYmZkKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIE5fU0VUQToKLQkJICAgICAgc3ltc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICB2YWwgPSAwOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICB8fCBocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCQkgIC8qIFRoaXMgY2FzZSB1c3VhbGx5IG1lYW5zIGEgY29tbW9uIHN5bWJvbCB3aGljaCB3YXMKLQkJICAgICB0dXJuZWQgaW50byBhIGRlZmluZWQgc3ltYm9sLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uID0gaHJlc29sdmUtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBvdXRwdXRfc2VjdGlvbiA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCQkgIEJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JCQkgICAgICB8fCBvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0JCSAgdmFsID0gKGhyZXNvbHZlLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbikKLQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgLyogR2V0IHRoZSBjb3JyZWN0IHR5cGUgYmFzZWQgb24gdGhlIHNlY3Rpb24uICBJZgotCQkgICAgIHRoaXMgaXMgYSBjb25zdHJ1Y3RlZCBzZXQsIGZvcmNlIGl0IHRvIGJlCi0JCSAgICAgZ2xvYmFsbHkgdmlzaWJsZS4gICovCi0JCSAgaWYgKHR5cGUgPT0gTl9TRVRUCi0JCSAgICAgIHx8IHR5cGUgPT0gTl9TRVRECi0JCSAgICAgIHx8IHR5cGUgPT0gTl9TRVRCCi0JCSAgICAgIHx8IHR5cGUgPT0gTl9TRVRBKQotCQkgICAgdHlwZSB8PSBOX0VYVDsKLQotCQkgIHR5cGUgJj1+IE5fVFlQRTsKLQotCQkgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICA/IE5fVEVYVAotCQkJICAgICA6IE5fV0VBS1QpOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHR5cGUgfD0gKGhyZXNvbHZlLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgID8gTl9EQVRBCi0JCQkgICAgIDogTl9XRUFLRCk7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JCSAgICB0eXBlIHw9IChocmVzb2x2ZS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICA/IE5fQlNTCi0JCQkgICAgIDogTl9XRUFLQik7Ci0JCSAgZWxzZQotCQkgICAgdHlwZSB8PSAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCSAgICAgPyBOX0FCUwotCQkJICAgICA6IE5fV0VBS0EpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkJdmFsID0gaHJlc29sdmUtPnJvb3QudS5jLnNpemU7Ci0JICAgICAgZWxzZSBpZiAoaHJlc29sdmUtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJewotCQkgIHZhbCA9IDA7Ci0JCSAgdHlwZSA9IE5fV0VBS1U7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXZhbCA9IDA7Ci0JICAgIH0KLQkgIGlmIChzeW1zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHZhbCA9IChzeW1zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzeW1zZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyAoR0VUX1dPUkQgKGlucHV0X2JmZCwgc3ltLT5lX3ZhbHVlKQotCQkgICAgICAtIHN5bXNlYy0+dm1hKSk7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sIHNldCB0aGUgd3JpdHRlbiBmbGFnLCBhbmQgaWYKLQkgICAgIGl0IGlzIGEgbG9jYWwgc3ltYm9sIHNlZSBpZiB3ZSBzaG91bGQgZGlzY2FyZCBpdC4gICovCi0JICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBoLT53cml0dGVuID0gdHJ1ZTsKLQkgICAgICBoLT5pbmR4ID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUVAotCQkgICAmJiAodHlwZSAmIE5fVFlQRSkgIT0gTl9TRVRECi0JCSAgICYmICh0eXBlICYgTl9UWVBFKSAhPSBOX1NFVEIKLQkJICAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoZGlzY2FyZCkKLQkJewotCQljYXNlIGRpc2NhcmRfbm9uZToKLQkJICBicmVhazsKLQkJY2FzZSBkaXNjYXJkX2w6Ci0JCSAgaWYgKCh0eXBlICYgTl9TVEFCKSA9PSAwCi0JCSAgICAgICYmIGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChpbnB1dF9iZmQsIG5hbWUpKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgZGlzY2FyZF9hbGw6Ci0JCSAgc2tpcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBpZiAoc2tpcCkKLQkJewotCQkgIHBhc3MgPSBmYWxzZTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIEFuIE5fQklOQ0wgc3ltYm9sIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgdGhlIHN0YWJzCi0JICAgICBlbnRyaWVzIGZvciBhIGhlYWRlciBmaWxlLiAgV2UgbmVlZCB0byBzY2FuIGFoZWFkIHRvIHRoZQotCSAgICAgbmV4dCBOX0VJTkNMIHN5bWJvbCwgaWdub3JpbmcgbmVzdGluZywgYWRkaW5nIHVwIGFsbCB0aGUKLQkgICAgIGNoYXJhY3RlcnMgaW4gdGhlIHN5bWJvbCBuYW1lcywgbm90IGluY2x1ZGluZyB0aGUgZmlsZQotCSAgICAgbnVtYmVycyBpbiB0eXBlcyAodGhlIGZpcnN0IG51bWJlciBhZnRlciBhbiBvcGVuCi0JICAgICBwYXJlbnRoZXNpcykuICAqLwotCSAgaWYgKHR5cGUgPT0gTl9CSU5DTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqaW5jbF9zeW07Ci0JICAgICAgaW50IG5lc3Q7Ci0JICAgICAgc3RydWN0IGFvdXRfbGlua19pbmNsdWRlc19lbnRyeSAqaW5jbF9lbnRyeTsKLQkgICAgICBzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqdDsKLQotCSAgICAgIHZhbCA9IDA7Ci0JICAgICAgbmVzdCA9IDA7Ci0JICAgICAgZm9yIChpbmNsX3N5bSA9IHN5bSArIDE7IGluY2xfc3ltIDwgc3ltX2VuZDsgaW5jbF9zeW0rKykKLQkJewotCQkgIGludCBpbmNsX3R5cGU7Ci0KLQkJICBpbmNsX3R5cGUgPSBiZmRfaF9nZXRfOCAoaW5wdXRfYmZkLCBpbmNsX3N5bS0+ZV90eXBlKTsKLQkJICBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChuZXN0ID09IDApCi0JCQlicmVhazsKLQkJICAgICAgLS1uZXN0OwotCQkgICAgfQotCQkgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkgICAgKytuZXN0OwotCQkgIGVsc2UgaWYgKG5lc3QgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqczsKLQotCQkgICAgICBzID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIGluY2xfc3ltLT5lX3N0cngpOwotCQkgICAgICBmb3IgKDsgKnMgIT0gJ1wwJzsgcysrKQotCQkJewotCQkJICB2YWwgKz0gKnM7Ci0JCQkgIGlmICgqcyA9PSAnKCcpCi0JCQkgICAgewotCQkJICAgICAgLyogU2tpcCB0aGUgZmlsZSBudW1iZXIuICAqLwotCQkJICAgICAgKytzOwotCQkJICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCQkJKytzOwotCQkJICAgICAgLS1zOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGEgaGVhZGVyIGZpbGUgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgc2FtZSB2YWx1ZSwgdGhlbiByZXBsYWNlIHRoaXMgb25lIHdpdGggYW4gTl9FWENMCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICAgICAgY29weSA9ICEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5OwotCSAgICAgIGluY2xfZW50cnkgPSBhb3V0X2xpbmtfaW5jbHVkZXNfbG9va3VwICgmZmluZm8tPmluY2x1ZGVzLAotCQkJCQkJICAgICAgbmFtZSwgdHJ1ZSwgY29weSk7Ci0JICAgICAgaWYgKGluY2xfZW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGZvciAodCA9IGluY2xfZW50cnktPnRvdGFsczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkJaWYgKHQtPnRvdGFsID09IHZhbCkKLQkJICBicmVhazsKLQkgICAgICBpZiAodCA9PSBOVUxMKQotCQl7Ci0JCSAgLyogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHNlZW4gdGhpcyBoZWFkZXIKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUgd2l0aCB0aGlzIHNldCBvZiBzdGFicyBzdHJpbmdzLiAgKi8KLQkJICB0ID0gKChzdHJ1Y3QgYW91dF9saW5rX2luY2x1ZGVzX3RvdGFscyAqKQotCQkgICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZmaW5mby0+aW5jbHVkZXMucm9vdCwKLQkJCQkJICBzaXplb2YgKnQpKTsKLQkJICBpZiAodCA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIHQtPnRvdGFsID0gdmFsOwotCQkgIHQtPm5leHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7Ci0JCSAgaW5jbF9lbnRyeS0+dG90YWxzID0gdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGludCAqaW5jbF9tYXA7Ci0KLQkJICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlIGhlYWRlciBmaWxlLiAgV2UgbXVzdCBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgIGl0IHRvIGJlIGFuIE5fRVhDTCBlbnRyeSwgYW5kIG1hcmsgYWxsIHRoZQotICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgc3ltYm9scyB0byBwcmV2ZW50IG91dHB1dHRpbmcgdGhlbS4gICovCi0JCSAgdHlwZSA9IE5fRVhDTDsKLQotCQkgIG5lc3QgPSAwOwotCQkgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyAxLCBpbmNsX21hcCA9IHN5bWJvbF9tYXAgKyAxOwotCQkgICAgICAgaW5jbF9zeW0gPCBzeW1fZW5kOwotCQkgICAgICAgaW5jbF9zeW0rKywgaW5jbF9tYXArKykKLQkJICAgIHsKLQkJICAgICAgaW50IGluY2xfdHlwZTsKLQotCQkgICAgICBpbmNsX3R5cGUgPSBiZmRfaF9nZXRfOCAoaW5wdXRfYmZkLCBpbmNsX3N5bS0+ZV90eXBlKTsKLQkJICAgICAgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQkJewotCQkJICBpZiAobmVzdCA9PSAwKQotCQkJICAgIHsKLQkJCSAgICAgICppbmNsX21hcCA9IC0xOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICAtLW5lc3Q7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkJKytuZXN0OwotCQkgICAgICBlbHNlIGlmIChuZXN0ID09IDApCi0JCQkqaW5jbF9tYXAgPSAtMTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDb3B5IHRoaXMgc3ltYm9sIGludG8gdGhlIGxpc3Qgb2Ygc3ltYm9scyB3ZSBhcmUgZ29pbmcgdG8KLQkgd3JpdGUgb3V0LiAgKi8KLSAgICAgIGJmZF9oX3B1dF84IChvdXRwdXRfYmZkLCB0eXBlLCBvdXRzeW0tPmVfdHlwZSk7Ci0gICAgICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgYmZkX2hfZ2V0XzggKGlucHV0X2JmZCwgc3ltLT5lX290aGVyKSwKLQkJICAgb3V0c3ltLT5lX290aGVyKTsKLSAgICAgIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgYmZkX2hfZ2V0XzE2IChpbnB1dF9iZmQsIHN5bS0+ZV9kZXNjKSwKLQkJICAgIG91dHN5bS0+ZV9kZXNjKTsKLSAgICAgIGNvcHkgPSBmYWxzZTsKLSAgICAgIGlmICghIGZpbmZvLT5pbmZvLT5rZWVwX21lbW9yeSkKLQl7Ci0JICAvKiBuYW1lIHBvaW50cyBpbnRvIGEgc3RyaW5nIHRhYmxlIHdoaWNoIHdlIGFyZSBnb2luZyB0bwotCSAgICAgZnJlZS4gIElmIHRoZXJlIGlzIGEgaGFzaCB0YWJsZSBlbnRyeSwgdXNlIHRoYXQgc3RyaW5nLgotCSAgICAgT3RoZXJ3aXNlLCBjb3B5IG5hbWUgaW50byBtZW1vcnkuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgY29weSA9IHRydWU7Ci0JfQotICAgICAgc3RydGFiX2luZGV4ID0gYWRkX3RvX3N0cmluZ3RhYiAob3V0cHV0X2JmZCwgZmluZm8tPnN0cnRhYiwKLQkJCQkgICAgICAgbmFtZSwgY29weSk7Ci0gICAgICBpZiAoc3RydGFiX2luZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgc3RydGFiX2luZGV4LCBvdXRzeW0tPmVfc3RyeCk7Ci0gICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgdmFsLCBvdXRzeW0tPmVfdmFsdWUpOwotICAgICAgKnN5bWJvbF9tYXAgPSBvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICAgICAgKytvYmpfYW91dF9leHRlcm5hbF9zeW1fY291bnQgKG91dHB1dF9iZmQpOwotICAgICAgKytvdXRzeW07Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgb3V0cHV0IHN5bWJvbHMgd2UgaGF2ZSBqdXN0IGNvbnN0cnVjdGVkLiAgKi8KLSAgaWYgKG91dHN5bSA+IGZpbmZvLT5vdXRwdXRfc3ltcykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIG91dHN5bV9jb3VudDsKLQotICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBmaW5mby0+c3ltb2ZmLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBvdXRzeW1fY291bnQgPSBvdXRzeW0gLSBmaW5mby0+b3V0cHV0X3N5bXM7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBmaW5mby0+b3V0cHV0X3N5bXMsCi0JCSAgICAgKGJmZF9zaXplX3R5cGUpIEVYVEVSTkFMX05MSVNUX1NJWkUsCi0JCSAgICAgKGJmZF9zaXplX3R5cGUpIG91dHN5bV9jb3VudCwgb3V0cHV0X2JmZCkKLQkgICE9IG91dHN5bV9jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZmluZm8tPnN5bW9mZiArPSBvdXRzeW1fY291bnQgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3ltYm9sIHRoYXQgd2FzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gYS5vdXQgaW5wdXQKLSAgIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gKHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIGludCB0eXBlOwotICBiZmRfdm1hIHZhbDsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0IG91dHN5bTsKLSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLQotICBpZiAoYW91dF9iYWNrZW5kX2luZm8gKG91dHB1dF9iZmQpLT53cml0ZV9keW5hbWljX3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgoKmFvdXRfYmFja2VuZF9pbmZvIChvdXRwdXRfYmZkKS0+d3JpdGVfZHluYW1pY19zeW1ib2wpCi0JICAgICAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGgpKSkKLQl7Ci0JICAvKiBGSVhNRTogTm8gd2F5IHRvIGhhbmRsZSBlcnJvcnMuICAqLwotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+d3JpdHRlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoLT53cml0dGVuID0gdHJ1ZTsKLQotICAvKiBBbiBpbmR4IG9mIC0yIG1lYW5zIHRoZSBzeW1ib2wgbXVzdCBiZSB3cml0dGVuLiAgKi8KLSAgaWYgKGgtPmluZHggIT0gLTIKLSAgICAgICYmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICB8fCAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICBmYWxzZSwgZmFsc2UpID09IE5VTEwpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgLyogQXZvaWQgdmFyaWFibGUgbm90IGluaXRpYWxpemVkIHdhcm5pbmdzLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIHNldCBzeW1ib2xzIHdoZW4gc2V0cyBhcmUgbm90IGJlaW5nCi0gICAgICAgICBidWlsdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWFzZWN0aW9uICpzZWM7Ci0KLQlzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCUJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotCQkgICAgfHwgc2VjLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQlpZiAoc2VjID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9URVhUIDogTl9XRUFLVDsKLQllbHNlIGlmIChzZWMgPT0gb2JqX2RhdGFzZWMgKG91dHB1dF9iZmQpKQotCSAgdHlwZSA9IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQgPyBOX0RBVEEgOiBOX1dFQUtEOwotCWVsc2UgaWYgKHNlYyA9PSBvYmpfYnNzc2VjIChvdXRwdXRfYmZkKSkKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9CU1MgOiBOX1dFQUtCOwotCWVsc2UKLQkgIHR5cGUgPSBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkID8gTl9BQlMgOiBOX1dFQUtBOwotCXR5cGUgfD0gTl9FWFQ7Ci0JdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkgICAgICAgKyBzZWMtPnZtYQotCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICB0eXBlID0gTl9XRUFLVTsKLSAgICAgIHZhbCA9IDA7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IElnbm9yZSB0aGVzZSBmb3Igbm93LiAgVGhlIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2gKLQkgdGhleSBzaG91bGQgYmUgd3JpdHRlbiBvdXQgYXJlIG5vdCBjbGVhciB0byBtZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzggKG91dHB1dF9iZmQsIHR5cGUsIG91dHN5bS5lX3R5cGUpOwotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLmVfb3RoZXIpOwotICBiZmRfaF9wdXRfMTYgKG91dHB1dF9iZmQsIDAsIG91dHN5bS5lX2Rlc2MpOwotICBpbmR4ID0gYWRkX3RvX3N0cmluZ3RhYiAob3V0cHV0X2JmZCwgZmluZm8tPnN0cnRhYiwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgIGZhbHNlKTsKLSAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gaGFuZGxlIGVycm9ycy4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBpbmR4LCBvdXRzeW0uZV9zdHJ4KTsKLSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLmVfdmFsdWUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgZmluZm8tPnN5bW9mZiwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgJm91dHN5bSwgKGJmZF9zaXplX3R5cGUpIEVYVEVSTkFMX05MSVNUX1NJWkUsCi0JCSAgICAoYmZkX3NpemVfdHlwZSkgMSwgb3V0cHV0X2JmZCkgIT0gRVhURVJOQUxfTkxJU1RfU0laRSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIGhhbmRsZSBlcnJvcnMuICAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGZpbmZvLT5zeW1vZmYgKz0gRVhURVJOQUxfTkxJU1RfU0laRTsKLSAgaC0+aW5keCA9IG9ial9hb3V0X2V4dGVybmFsX3N5bV9jb3VudCAob3V0cHV0X2JmZCk7Ci0gICsrb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50IChvdXRwdXRfYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTGluayBhbiBhLm91dCBzZWN0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFvdXRfbGlua19pbnB1dF9zZWN0aW9uIChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvZmZfcHRyLAotCQkJIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGZpbGVfcHRyICpyZWxvZmZfcHRyOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBiZmRfc2l6ZV90eXBlIGlucHV0X3NpemU7Ci0gIFBUUiByZWxvY3M7Ci0KLSAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaW5wdXRfc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbik7Ci0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgZmluZm8tPmNvbnRlbnRzLAotCQkJCSAgKGZpbGVfcHRyKSAwLCBpbnB1dF9zaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIGl0LiAgKi8KLSAgaWYgKGFvdXRfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKSAhPSBOVUxMCi0gICAgICAmJiBhb3V0X3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcyAhPSBOVUxMKQotICAgIHJlbG9jcyA9IGFvdXRfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzOwotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NzID0gZmluZm8tPnJlbG9jczsKLSAgICAgIGlmIChyZWxfc2l6ZSA+IDApCi0JewotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChyZWxvY3MsIDEsIHJlbF9zaXplLCBpbnB1dF9iZmQpICE9IHJlbF9zaXplKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoaW5wdXRfYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoISBhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQgKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJCSByZWxfc2l6ZSwgZmluZm8tPmNvbnRlbnRzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgYW91dF9saW5rX2lucHV0X3NlY3Rpb25fZXh0IChmaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcmVsb2NzLAotCQkJCQkgcmVsX3NpemUsIGZpbmZvLT5jb250ZW50cykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCSAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICAoUFRSKSBmaW5mby0+Y29udGVudHMsCi0JCQkJICBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgaW5wdXRfc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIHJlbG9jcyB3ZXJlCi0gICAgIG1vZGlmaWVkLCBhbmQgd2Ugbm93IHdyaXRlIHRoZW0gb3V0LiAgKi8KLSAgaWYgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUgJiYgcmVsX3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoZmluZm8tPm91dHB1dF9iZmQsICpyZWxvZmZfcHRyLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChyZWxvY3MsIChiZmRfc2l6ZV90eXBlKSAxLCByZWxfc2l6ZSwgZmluZm8tPm91dHB1dF9iZmQpCi0JICAhPSByZWxfc2l6ZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAqcmVsb2ZmX3B0ciArPSByZWxfc2l6ZTsKLQotICAgICAgLyogQXNzZXJ0IHRoYXQgdGhlIHJlbG9jcyBoYXZlIG5vdCBydW4gaW50byB0aGUgc3ltYm9scywgYW5kCi0JIHRoYXQgaWYgdGhlc2UgYXJlIHRoZSB0ZXh0IHJlbG9jcyB0aGV5IGhhdmUgbm90IHJ1biBpbnRvIHRoZQotCSBkYXRhIHJlbG9jcy4gICovCi0gICAgICBCRkRfQVNTRVJUICgqcmVsb2ZmX3B0ciA8PSBvYmpfc3ltX2ZpbGVwb3MgKGZpbmZvLT5vdXRwdXRfYmZkKQotCQkgICYmIChyZWxvZmZfcHRyICE9ICZmaW5mby0+dHJlbG9mZgotCQkgICAgICB8fCAoKnJlbG9mZl9wdHIKLQkJCSAgPD0gb2JqX2RhdGFzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKS0+cmVsX2ZpbGVwb3MpKSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHZXQgdGhlIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byBhIHJlbG9jIGluZGV4LiAgKi8KLQotc3RhdGljIElOTElORSBhc2VjdGlvbiAqCi1hb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGFiZmQsIGluZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGluZHg7Ci17Ci0gIHN3aXRjaCAoaW5keCAmIE5fVFlQRSkKLSAgICB7Ci0gICAgY2FzZSBOX1RFWFQ6Ci0gICAgICByZXR1cm4gb2JqX3RleHRzZWMgKGFiZmQpOwotICAgIGNhc2UgTl9EQVRBOgotICAgICAgcmV0dXJuIG9ial9kYXRhc2VjIChhYmZkKTsKLSAgICBjYXNlIE5fQlNTOgotICAgICAgcmV0dXJuIG9ial9ic3NzZWMgKGFiZmQpOwotICAgIGNhc2UgTl9BQlM6Ci0gICAgY2FzZSBOX1VOREY6Ci0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBSZWxvY2F0ZSBhbiBhLm91dCBzZWN0aW9uIHVzaW5nIHN0YW5kYXJkIGEub3V0IHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9zdGQgKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jcywKLQkJCSAgICAgcmVsX3NpemUsIGNvbnRlbnRzKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICBQVFIsIGJmZF9ieXRlICosIGJvb2xlYW4gKiwKLQkJCQkJICBiZmRfdm1hICopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBpbnQgKnN5bWJvbF9tYXA7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnJlbDsKLSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsX2VuZDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIGNoZWNrX2R5bmFtaWNfcmVsb2MgPSBhb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPmNoZWNrX2R5bmFtaWNfcmVsb2M7Ci0KLSAgQkZEX0FTU0VSVCAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfU1REX1NJWkUpOwotICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIKLQkgICAgICA9PSBvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKTsKLQotICByZWxvY2F0ZWFibGUgPSBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlOwotICBzeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7Ci0gIHN5bV9oYXNoZXMgPSBvYmpfYW91dF9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBzeW1ib2xfbWFwID0gZmluZm8tPnN5bWJvbF9tYXA7Ci0KLSAgcmVsb2NfY291bnQgPSByZWxfc2l6ZSAvIFJFTE9DX1NURF9TSVpFOwotICByZWwgPSByZWxvY3M7Ci0gIHJlbF9lbmQgPSByZWwgKyByZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl9hZGRyOwotICAgICAgaW50IHJfaW5kZXg7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICBpbnQgcl9wY3JlbDsKLSAgICAgIGludCByX2Jhc2VyZWwgPSAwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmggPSBOVUxMOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfYWRkciA9IEdFVF9TV09SRCAoaW5wdXRfYmZkLCByZWwtPnJfYWRkcmVzcyk7Ci0KLSNpZmRlZiBNWV9yZWxvY19ob3d0bwotICAgICAgaG93dG8gPSBNWV9yZWxvY19ob3d0byhpbnB1dF9iZmQsIHJlbCwgcl9pbmRleCwgcl9leHRlcm4sIHJfcGNyZWwpOwotI2Vsc2UgICAgICAKLSAgICAgIHsKLQlpbnQgcl9qbXB0YWJsZTsKLQlpbnQgcl9yZWxhdGl2ZTsKLQlpbnQgcl9sZW5ndGg7Ci0JdW5zaWduZWQgaW50IGhvd3RvX2lkeDsKLQotCWlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JICB7Ci0JICAgIHJfaW5kZXggICA9ICAoKHJlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJCSAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgIHwgcmVsLT5yX2luZGV4WzJdKTsKLQkgICAgcl9leHRlcm4gID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotCSAgICByX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcpKTsKLQkgICAgcl9iYXNlcmVsID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcpKTsKLQkgICAgcl9qbXB0YWJsZT0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHKSk7Ci0JICAgIHJfcmVsYXRpdmU9ICgwICE9IChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRykpOwotCSAgICByX2xlbmd0aCAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRykKLQkJCSA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHJfaW5kZXggICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkJIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJIHwgcmVsLT5yX2luZGV4WzBdKTsKLQkgICAgcl9leHRlcm4gID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkpOwotCSAgICByX3BjcmVsICAgPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUpKTsKLQkgICAgcl9iYXNlcmVsID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdCi0JCQkgICAgICAgJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSkpOwotCSAgICByX2ptcHRhYmxlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0KLQkJCSAgICAgICAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSkpOwotCSAgICByX3JlbGF0aXZlPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0KLQkJCSAgICAgICAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSkpOwotCSAgICByX2xlbmd0aCAgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRSkKLQkJCSA+PiBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKTsKLQkgIH0KLQotCWhvd3RvX2lkeCA9IChyX2xlbmd0aCArIDQgKiByX3BjcmVsICsgOCAqIHJfYmFzZXJlbAotCQkgICAgICsgMTYgKiByX2ptcHRhYmxlICsgMzIgKiByX3JlbGF0aXZlKTsKLQlCRkRfQVNTRVJUIChob3d0b19pZHggPCBUQUJMRV9TSVpFIChob3d0b190YWJsZV9zdGQpKTsKLQlob3d0byA9IGhvd3RvX3RhYmxlX3N0ZCArIGhvd3RvX2lkeDsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLCBhbmQgbXVzdAotCSAgICAgbW9kaWZ5IHRoZSByZWxvYyBhY2NvcmRpbmdseS4gICovCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgdGhpcyByZWxvY2F0aW9uIGlzIGFnYWluc3QsCi0JCSBjb252ZXJ0IGl0IGludG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhpcwotCQkgaXMgd2hhdCB0aGUgbmF0aXZlIGxpbmtlciBkb2VzLiAgKi8KLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX2luZGV4XTsKLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotCQkgIC8qIENoYW5nZSB0aGUgcl9leHRlcm4gdmFsdWUuICAqLwotCQkgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUc7Ci0JCSAgZWxzZQotCQkgICAgcmVsLT5yX3R5cGVbMF0gJj1+IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEU7Ci0KLQkJICAvKiBDb21wdXRlIGEgbmV3IHJfaW5kZXguICAqLwotCQkgIG91dHB1dF9zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkJICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX3RleHRzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fVEVYVDsKLQkJICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9EQVRBOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9ic3NzZWMgKG91dHB1dF9iZmQpKQotCQkgICAgcl9pbmRleCA9IE5fQlNTOwotCQkgIGVsc2UKLQkJICAgIHJfaW5kZXggPSBOX0FCUzsKLQotCQkgIC8qIEFkZCB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlCi0JCSAgICAgYWRkZW5kIHN0b3JlZCBpbiB0aGUgY29udGVudHMuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgb3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlIG11c3QgY2hhbmdlIHJfaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBzeW1ib2wKLQkJICAgICBtYXAuICAqLwotCQkgIHJfaW5kZXggPSBzeW1ib2xfbWFwW3JfaW5kZXhdOwotCi0JCSAgaWYgKHJfaW5kZXggPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCQl7Ci0JCQkgIC8qIFdlIGRlY2lkZWQgdG8gc3RyaXAgdGhpcyBzeW1ib2wsIGJ1dCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvdXQgdGhhdCB3ZSBjYW4ndC4gIE5vdGUgdGhhdCB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NlIHRoZSBvdGhlciBhbmQgZGVzYyBpbmZvcm1hdGlvbiBoZXJlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGRvbid0IHRoaW5rIHRoYXQgd2lsbCBldmVyIG1hdHRlciBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLiAgKi8KLQkJCSAgaWYgKGgtPmluZHggPCAwKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPmluZHggPSAtMjsKLQkJCSAgICAgIGgtPndyaXR0ZW4gPSBmYWxzZTsKLQkJCSAgICAgIGlmICghIGFvdXRfbGlua193cml0ZV9vdGhlcl9zeW1ib2wgKGgsCi0JCQkJCQkJCSAgKFBUUikgZmluZm8pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0JCQkgIHJfaW5kZXggPSBoLT5pbmR4OwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJCSAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAotCQkJCQkJICAgICBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCSAgcl9hZGRyKSkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICByX2luZGV4ID0gMDsKLQkJCX0KLQkJICAgIH0KLQotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0KLQkgICAgICAvKiBXcml0ZSBvdXQgdGhlIG5ldyByX2luZGV4IHZhbHVlLiAgKi8KLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChvdXRwdXRfYmZkKSkKLQkJewotCQkgIHJlbC0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JCSAgcmVsLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCQkgIHJlbC0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBXZSBtdXN0Ci0JCSBhZGp1c3QgYnkgdGhlIGFtb3VudCB0aGF0IHRoZSBzZWN0aW9uIG1vdmVkLiAgKi8KLQkgICAgICBzZWN0aW9uID0gYW91dF9yZWxvY19pbmRleF90b19zZWN0aW9uIChpbnB1dF9iZmQsIHJfaW5kZXgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgIC0gc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCi0JICAvKiBDaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotCSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsCi0JCSAgICByX2FkZHIgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgcmVsLT5yX2FkZHJlc3MpOwotCi0JICAvKiBBZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGJ5IHJlbW92aW5nIHRoZSByZWZlcmVuY2UKLQkgICAgIHRvIHRoZSBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBzZWN0aW9uIGFuZCBpbmNsdWRpbmcgdGhlCi0JICAgICByZWZlcmVuY2UgdG8gdGhlIG5ldyBhZGRyZXNzLiAgKi8KLQkgIGlmIChyX3BjcmVsKQotCSAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotI2lmZGVmIE1ZX3JlbG9jYXRhYmxlX3JlbG9jCi0JICBNWV9yZWxvY2F0YWJsZV9yZWxvYyAoaG93dG8sIG91dHB1dF9iZmQsIHJlbCwgcmVsb2NhdGlvbiwgcl9hZGRyKTsKLSNlbmRpZgotCi0JICBpZiAocmVsb2NhdGlvbiA9PSAwKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCSAgZWxzZQotCSAgICByID0gTVlfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkJCQlpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJCWNvbnRlbnRzICsgcl9hZGRyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYm9vbGVhbiBodW5kZWY7Ci0KLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGFuIGV4ZWN1dGFibGUsIGFuZCBtdXN0IGRvIGEgZnVsbAotCSAgICAgcmVsb2NhdGlvbi4gICovCi0JICBodW5kZWYgPSBmYWxzZTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0KLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaHVuZGVmID0gdHJ1ZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotCSAgICAgIHNlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSBzZWN0aW9uLT52bWEpOwotCSAgICAgIGlmIChyX3BjcmVsKQotCQlyZWxvY2F0aW9uICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgfQotCi0JICBpZiAoY2hlY2tfZHluYW1pY19yZWxvYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0JICAgICAgaWYgKCEgKCgqY2hlY2tfZHluYW1pY19yZWxvYykKLQkJICAgICAoZmluZm8tPmluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaCwKLQkJICAgICAgKFBUUikgcmVsLCBjb250ZW50cywgJnNraXAsICZyZWxvY2F0aW9uKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoc2tpcCkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogTm93IHdhcm4gaWYgYSBnbG9iYWwgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIFdlIGNvdWxkIG5vdAotICAgICAgICAgICAgIGRvIHRoaXMgZWFybGllciwgYmVjYXVzZSBjaGVja19keW5hbWljX3JlbG9jIG1pZ2h0IHdhbnQKLSAgICAgICAgICAgICB0byBza2lwIHRoaXMgcmVsb2MuICAqLwotCSAgaWYgKGh1bmRlZiAmJiAhIGZpbmZvLT5pbmZvLT5zaGFyZWQgJiYgISByX2Jhc2VyZWwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgZWxzZQotCQluYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkgICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByX2FkZHIpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHIgPSBNWV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgY29udGVudHMsIHJfYWRkciwgcmVsb2NhdGlvbiwKLQkJCQkgICAgICAoYmZkX3ZtYSkgMCk7Ci0JfQotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlIGlmIChyX2V4dGVybikKLQkJICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgc3ltc1tyX2luZGV4XS5lX3N0cngpOwotCQllbHNlCi0JCSAgewotCQkgICAgYXNlY3Rpb24gKnM7Ci0KLQkJICAgIHMgPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzKTsKLQkJICB9Ci0JCWlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGZpbmZvLT5pbmZvLCBuYW1lLCBob3d0by0+bmFtZSwKLQkJCShiZmRfdm1hKSAwLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJfYWRkcikpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBhLm91dCBzZWN0aW9uIHVzaW5nIGV4dGVuZGVkIGEub3V0IHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQgKGZpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jcywKLQkJCSAgICAgcmVsX3NpemUsIGNvbnRlbnRzKQotICAgICBzdHJ1Y3QgYW91dF9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbG9jczsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxfc2l6ZTsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJICBQVFIsIGJmZF9ieXRlICosIGJvb2xlYW4gKiwKLQkJCQkJICBiZmRfdm1hICopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpzeW1zOwotICBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBpbnQgKnN5bWJvbF9tYXA7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2NfY291bnQ7Ci0gIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbDsKLSAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsX2VuZDsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIGNoZWNrX2R5bmFtaWNfcmVsb2MgPSBhb3V0X2JhY2tlbmRfaW5mbyAob3V0cHV0X2JmZCktPmNoZWNrX2R5bmFtaWNfcmVsb2M7Ci0KLSAgQkZEX0FTU0VSVCAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGlucHV0X2JmZCkgPT0gUkVMT0NfRVhUX1NJWkUpOwotICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIKLQkgICAgICA9PSBvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKTsKLQotICByZWxvY2F0ZWFibGUgPSBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlOwotICBzeW1zID0gb2JqX2FvdXRfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLSAgc3RyaW5ncyA9IG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGlucHV0X2JmZCk7Ci0gIHN5bV9oYXNoZXMgPSBvYmpfYW91dF9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBzeW1ib2xfbWFwID0gZmluZm8tPnN5bWJvbF9tYXA7Ci0KLSAgcmVsb2NfY291bnQgPSByZWxfc2l6ZSAvIFJFTE9DX0VYVF9TSVpFOwotICByZWwgPSByZWxvY3M7Ci0gIHJlbF9lbmQgPSByZWwgKyByZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgcl9hZGRyOwotICAgICAgaW50IHJfaW5kZXg7Ci0gICAgICBpbnQgcl9leHRlcm47Ci0gICAgICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICAgICAgYmZkX3ZtYSByX2FkZGVuZDsKLSAgICAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0gICAgICBhc2VjdGlvbiAqcl9zZWN0aW9uID0gTlVMTDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAgICAgcl9hZGRyID0gR0VUX1NXT1JEIChpbnB1dF9iZmQsIHJlbC0+cl9hZGRyZXNzKTsKLQotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQl7Ci0JICByX2luZGV4ICA9ICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgfCByZWwtPnJfaW5kZXhbMl0pOwotCSAgcl9leHRlcm4gPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHKSk7Ci0JICByX3R5cGUgICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByX2luZGV4ICA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICAgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgICAgfCByZWwtPnJfaW5kZXhbMF0pOwotCSAgcl9leHRlcm4gPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFKSk7Ci0JICByX3R5cGUgICA9ICgocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRSkKLQkJICAgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUpOwotCX0KLQotICAgICAgcl9hZGRlbmQgPSBHRVRfU1dPUkQgKGlucHV0X2JmZCwgcmVsLT5yX2FkZGVuZCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA8IFRBQkxFX1NJWkUgKGhvd3RvX3RhYmxlX2V4dCkpOwotCi0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLCBhbmQgbXVzdAotCSAgICAgbW9kaWZ5IHRoZSByZWxvYyBhY2NvcmRpbmdseS4gICovCi0JICBpZiAocl9leHRlcm4KLQkgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JICAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCSAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgdGhpcyByZWxvY2F0aW9uIGlzIGFnYWluc3QsCi0JCSBjb252ZXJ0IGl0IGludG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgVGhpcwotCQkgaXMgd2hhdCB0aGUgbmF0aXZlIGxpbmtlciBkb2VzLiAgKi8KLQkgICAgICBpZiAocl90eXBlID09IFJFTE9DX0JBU0UxMAotCQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkJICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTIyKQotCQloID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCWggPSBzeW1faGFzaGVzW3JfaW5kZXhdOwotCSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0JCSAgLyogQ2hhbmdlIHRoZSByX2V4dGVybiB2YWx1ZS4gICovCi0JCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCSAgICByZWwtPnJfdHlwZVswXSAmPX4gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRzsKLQkJICBlbHNlCi0JCSAgICByZWwtPnJfdHlwZVswXSAmPX4gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRTsKLQotCQkgIC8qIENvbXB1dGUgYSBuZXcgcl9pbmRleC4gICovCi0JCSAgb3V0cHV0X3NlY3Rpb24gPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCQkgIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfdGV4dHNlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9URVhUOwotCQkgIGVsc2UgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial9kYXRhc2VjIChvdXRwdXRfYmZkKSkKLQkJICAgIHJfaW5kZXggPSBOX0RBVEE7Ci0JCSAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JCSAgICByX2luZGV4ID0gTl9CU1M7Ci0JCSAgZWxzZQotCQkgICAgcl9pbmRleCA9IE5fQUJTOwotCi0JCSAgLyogQWRkIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHRoZSBzZWN0aW9uIFZNQSB0byB0aGUKLQkJICAgICBhZGRlbmQuICAqLwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgb3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkgIC8qIE5vdyBSRUxPQ0FUSU9OIGlzIHRoZSBWTUEgb2YgdGhlIGZpbmFsCi0JCSAgICAgZGVzdGluYXRpb24uICBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsCi0JCSAgICAgdGhlbiBBRERFTkQgaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSBzb3VyY2UgVk1BLgotCQkgICAgIFdlIHdhbnQgdG8gc2V0IEFEREVORCB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0JCSAgICAgdGhlIGRlc3RpbmF0aW9uIFZNQSBhbmQgdGhlIHNvdXJjZSBWTUEsIHdoaWNoCi0JCSAgICAgbWVhbnMgd2UgbXVzdCBhZGp1c3QgUkVMT0NBVElPTiBieSB0aGUgY2hhbmdlIGluCi0JCSAgICAgdGhlIHNvdXJjZSBWTUEuICBUaGlzIGlzIGRvbmUgYmVsb3cuICAqLwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UgbXVzdCBjaGFuZ2Ugcl9pbmRleCBhY2NvcmRpbmcgdG8gdGhlIHN5bWJvbAotCQkgICAgIG1hcC4gICovCi0JCSAgcl9pbmRleCA9IHN5bWJvbF9tYXBbcl9pbmRleF07Ci0KLQkJICBpZiAocl9pbmRleCA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGggIT0gTlVMTCkKLQkJCXsKLQkJCSAgLyogV2UgZGVjaWRlZCB0byBzdHJpcCB0aGlzIHN5bWJvbCwgYnV0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIG91dCB0aGF0IHdlIGNhbid0LiAgTm90ZSB0aGF0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvc2UgdGhlIG90aGVyIGFuZCBkZXNjIGluZm9ybWF0aW9uIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgZG9uJ3QgdGhpbmsgdGhhdCB3aWxsIGV2ZXIgbWF0dGVyIGZvciBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wuICAqLwotCQkJICBpZiAoaC0+aW5keCA8IDApCi0JCQkgICAgewotCQkJICAgICAgaC0+aW5keCA9IC0yOwotCQkJICAgICAgaC0+d3JpdHRlbiA9IGZhbHNlOwotCQkJICAgICAgaWYgKCEgYW91dF9saW5rX3dyaXRlX290aGVyX3N5bWJvbCAoaCwKLQkJCQkJCQkJICAoUFRSKSBmaW5mbykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQkJCSAgcl9pbmRleCA9IGgtPmluZHg7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkJICBuYW1lID0gc3RyaW5ncyArIEdFVF9XT1JEIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkJCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJCQkgKGZpbmZvLT5pbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICByX2FkZHIpKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIHJfaW5kZXggPSAwOwotCQkJfQotCQkgICAgfQotCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0KLQkJICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHRoZW4gdGhlIGFkZGVuZAotCQkgICAgIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgc291cmNlIFZNQS4gIFdlIG11c3QKLQkJICAgICBhZGp1c3QgaXQgYnkgdGhlIGNoYW5nZSBpbiB0aGUgc291cmNlIFZNQS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGJlbG93LiAgKi8KLQkJfQotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSBuZXcgcl9pbmRleCB2YWx1ZS4gICovCi0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICByZWwtPnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotCQkgIHJlbC0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkJICByZWwtPnJfaW5kZXhbMl0gPSByX2luZGV4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQkJICByZWwtPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JCSAgcmVsLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFdlIG11c3QKLQkJIGFkanVzdCBieSB0aGUgYW1vdW50IHRoYXQgdGhlIHNlY3Rpb24gbW92ZWQuICAqLwotCSAgICAgIHJfc2VjdGlvbiA9IGFvdXRfcmVsb2NfaW5kZXhfdG9fc2VjdGlvbiAoaW5wdXRfYmZkLCByX2luZGV4KTsKLQkgICAgICByZWxvY2F0aW9uID0gKHJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgcl9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSByX3NlY3Rpb24tPnZtYSk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHRoZW4gdGhlIGFkZGVuZCBpcwotCQkgdGhlIGRpZmZlcmVuY2UgaW4gVk1BIGJldHdlZW4gdGhlIGRlc3RpbmF0aW9uIGFuZCB0aGUKLQkJIHNvdXJjZS4gIFdlIGhhdmUganVzdCBhZGp1c3RlZCBmb3IgdGhlIGNoYW5nZSBpbiBWTUEKLQkJIG9mIHRoZSBkZXN0aW5hdGlvbiwgc28gd2UgbXVzdCBhbHNvIGFkanVzdCBieSB0aGUKLQkJIGNoYW5nZSBpbiBWTUEgb2YgdGhlIHNvdXJjZS4gIFRoaXMgaXMgZG9uZSBiZWxvdy4gICovCi0JICAgIH0KLQotCSAgLyogQXMgZGVzY3JpYmVkIGFib3ZlLCB3ZSBtdXN0IGFsd2F5cyBhZGp1c3QgYSBQQyByZWxhdGl2ZQotCSAgICAgcmVsb2MgYnkgdGhlIGNoYW5nZSBpbiBWTUEgb2YgdGhlIHNvdXJjZS4gIEhvd2V2ZXIsIGlmCi0JICAgICBwY3JlbF9vZmZzZXQgaXMgc2V0LCB0aGVuIHRoZSBhZGRlbmQgZG9lcyBub3QgaW5jbHVkZSB0aGUKLQkgICAgIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndCBuZWVkCi0JICAgICB0byBhZGp1c3QgYW55dGhpbmcuICAqLwotCSAgaWYgKGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLnBjX3JlbGF0aXZlCi0JICAgICAgJiYgISBob3d0b190YWJsZV9leHRbcl90eXBlXS5wY3JlbF9vZmZzZXQpCi0JICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0JICAvKiBDaGFuZ2UgdGhlIGFkZGVuZCBpZiBuZWNlc3NhcnkuICAqLwotCSAgaWYgKHJlbG9jYXRpb24gIT0gMCkKLQkgICAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHJfYWRkZW5kICsgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCk7Ci0KLQkgIC8qIENoYW5nZSB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbi4gICovCi0JICBQVVRfV09SRCAob3V0cHV0X2JmZCwKLQkJICAgIHJfYWRkciArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCSAgICByZWwtPnJfYWRkcmVzcyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJvb2xlYW4gaHVuZGVmOwotCSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLQkgIC8qIFdlIGFyZSBnZW5lcmF0aW5nIGFuIGV4ZWN1dGFibGUsIGFuZCBtdXN0IGRvIGEgZnVsbAotCSAgICAgcmVsb2NhdGlvbi4gICovCi0JICBodW5kZWYgPSBmYWxzZTsKLQotCSAgaWYgKHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0KLQkgICAgICBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkJICAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaHVuZGVmID0gdHJ1ZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JCSAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkJICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQkgICAgewotCSAgICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltOwotCSAgICAgIGludCB0eXBlOwotCi0JICAgICAgLyogRm9yIGJhc2UgcmVsYXRpdmUgcmVsb2NzLCByX2luZGV4IGlzIGFsd2F5cyBhbiBpbmRleAotICAgICAgICAgICAgICAgICBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIGV2ZW4gaWYgcl9leHRlcm4gaXMgMC4gICovCi0JICAgICAgc3ltID0gc3ltcyArIHJfaW5kZXg7Ci0JICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChpbnB1dF9iZmQsIHN5bS0+ZV90eXBlKTsKLQkgICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fVEVYVAotCQkgIHx8IHR5cGUgPT0gTl9XRUFLVCkKLQkJcl9zZWN0aW9uID0gb2JqX3RleHRzZWMgKGlucHV0X2JmZCk7Ci0JICAgICAgZWxzZSBpZiAoKHR5cGUgJiBOX1RZUEUpID09IE5fREFUQQotCQkgICAgICAgfHwgdHlwZSA9PSBOX1dFQUtEKQotCQlyX3NlY3Rpb24gPSBvYmpfZGF0YXNlYyAoaW5wdXRfYmZkKTsKLQkgICAgICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9CU1MKLQkJICAgICAgIHx8IHR5cGUgPT0gTl9XRUFLQikKLQkJcl9zZWN0aW9uID0gb2JqX2Jzc3NlYyAoaW5wdXRfYmZkKTsKLQkgICAgICBlbHNlIGlmICgodHlwZSAmIE5fVFlQRSkgPT0gTl9BQlMKLQkJICAgICAgIHx8IHR5cGUgPT0gTl9XRUFLQSkKLQkJcl9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICBlbHNlCi0JCWFib3J0ICgpOwotCSAgICAgIHJlbG9jYXRpb24gPSAocl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyByX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICArIChHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW0tPmVfdmFsdWUpCi0JCQkgICAgICAgLSByX3NlY3Rpb24tPnZtYSkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByX3NlY3Rpb24gPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgUEMgcmVsYXRpdmUgcmVsb2MsIHRoZW4gUl9BRERFTkQgaXMgdGhlCi0JCSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byB2bWFzLCBvcgotCQkgICBvbGRfZGVzdF9zZWMgKyBvbGRfZGVzdF9vZmYgLSAob2xkX3NyY19zZWMgKyBvbGRfc3JjX29mZikKLQkJIHdoZXJlCi0JCSAgIG9sZF9kZXN0X3NlYyA9PSBzZWN0aW9uLT52bWEKLQkJIGFuZAotCQkgICBvbGRfc3JjX3NlYyA9PSBpbnB1dF9zZWN0aW9uLT52bWEKLQkJIGFuZAotCQkgICBvbGRfc3JjX29mZiA9PSByX2FkZHIKLQotCQkgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIGV4cGVjdHMgUkVMT0NBVElPTiArCi0JCSBSX0FEREVORCB0byBiZSB0aGUgVk1BIG9mIHRoZSBkZXN0aW5hdGlvbiBtaW51cwotCQkgcl9hZGRyICh0aGUgbWludXMgcl9hZGRyIGlzIGJlY2F1c2UgdGhpcyByZWxvY2F0aW9uCi0JCSBpcyBub3QgcGNyZWxfb2Zmc2V0LCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcgYW5kCi0JCSBzaG91bGQsIHBlcmhhcHMsIGJlIGNoYW5nZWQpLCBvcgotCQkgICBuZXdfZGVzdF9zZWMKLQkJIHdoZXJlCi0JCSAgIG5ld19kZXN0X3NlYyA9PSBvdXRwdXRfc2VjdGlvbi0+dm1hICsgb3V0cHV0X29mZnNldAotCQkgV2UgYXJyYW5nZSBmb3IgdGhpcyB0byBoYXBwZW4gYnkgc2V0dGluZyBSRUxPQ0FUSU9OIHRvCi0JCSAgIG5ld19kZXN0X3NlYyArIG9sZF9zcmNfc2VjIC0gb2xkX2Rlc3Rfc2VjCi0KLQkJIElmIHRoaXMgaXMgbm90IGEgUEMgcmVsYXRpdmUgcmVsb2MsIHRoZW4gUl9BRERFTkQgaXMKLQkJIHNpbXBseSB0aGUgVk1BIG9mIHRoZSBkZXN0aW5hdGlvbiwgc28gd2Ugc2V0Ci0JCSBSRUxPQ0FUSU9OIHRvIHRoZSBjaGFuZ2UgaW4gdGhlIGRlc3RpbmF0aW9uIFZNQSwgb3IKLQkJICAgbmV3X2Rlc3Rfc2VjIC0gb2xkX2Rlc3Rfc2VjCi0JCSAqLwotCSAgICAgIHJlbG9jYXRpb24gPSAocl9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyByX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHJfc2VjdGlvbi0+dm1hKTsKLQkgICAgICBpZiAoaG93dG9fdGFibGVfZXh0W3JfdHlwZV0ucGNfcmVsYXRpdmUpCi0JCXJlbG9jYXRpb24gKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCSAgICB9Ci0KLQkgIGlmIChjaGVja19keW5hbWljX3JlbG9jICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBib29sZWFuIHNraXA7Ci0KLQkgICAgICBpZiAoISAoKCpjaGVja19keW5hbWljX3JlbG9jKQotCQkgICAgIChmaW5mby0+aW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBoLAotCQkgICAgICAoUFRSKSByZWwsIGNvbnRlbnRzLCAmc2tpcCwgJnJlbG9jYXRpb24pKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChza2lwKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBOb3cgd2FybiBpZiBhIGdsb2JhbCBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgV2UgY291bGQgbm90Ci0gICAgICAgICAgICAgZG8gdGhpcyBlYXJsaWVyLCBiZWNhdXNlIGNoZWNrX2R5bmFtaWNfcmVsb2MgbWlnaHQgd2FudAotICAgICAgICAgICAgIHRvIHNraXAgdGhpcyByZWxvYy4gICovCi0JICBpZiAoaHVuZGVmCi0JICAgICAgJiYgISBmaW5mby0+aW5mby0+c2hhcmVkCi0JICAgICAgJiYgcl90eXBlICE9IFJFTE9DX0JBU0UxMAotCSAgICAgICYmIHJfdHlwZSAhPSBSRUxPQ19CQVNFMTMKLQkgICAgICAmJiByX3R5cGUgIT0gUkVMT0NfQkFTRTIyKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIGVsc2UKLQkJbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLCBzeW1zW3JfaW5kZXhdLmVfc3RyeCk7Ci0JICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAocl90eXBlICE9IFJFTE9DX1NQQVJDX1JFVjMyKQotCSAgICByID0gTVlfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG9fdGFibGVfZXh0ICsgcl90eXBlLAotCQkJCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLCByX2FkZHIsIHJlbG9jYXRpb24sCi0JCQkJCXJfYWRkZW5kKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgeDsKLQotCSAgICAgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcl9hZGRyKTsKLQkgICAgICB4ID0geCArIHJlbG9jYXRpb24gKyByX2FkZGVuZDsKLQkgICAgICBiZmRfcHV0bDMyICgvKmlucHV0X2JmZCwqLyB4LCBjb250ZW50cyArIHJfYWRkcik7Ci0JICAgICAgciA9IGJmZF9yZWxvY19vazsKLQkgICAgfQotCi0JICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHIpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkJICBhYm9ydCAoKTsKLQkJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgICAgaWYgKGggIT0gTlVMTCkKLQkJICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCSAgICBlbHNlIGlmIChyX2V4dGVybgotCQkJICAgICB8fCByX3R5cGUgPT0gUkVMT0NfQkFTRTEwCi0JCQkgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkJCSAgICAgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMikKLQkJICAgICAgbmFtZSA9IHN0cmluZ3MgKyBHRVRfV09SRCAoaW5wdXRfYmZkLAotCQkJCQkJIHN5bXNbcl9pbmRleF0uZV9zdHJ4KTsKLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJYXNlY3Rpb24gKnM7Ci0KLQkJCXMgPSBhb3V0X3JlbG9jX2luZGV4X3RvX3NlY3Rpb24gKGlucHV0X2JmZCwgcl9pbmRleCk7Ci0JCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzKTsKLQkJICAgICAgfQotCQkgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCQkgICAoZmluZm8tPmluZm8sIG5hbWUsIGhvd3RvX3RhYmxlX2V4dFtyX3R5cGVdLm5hbWUsCi0JCQkgICAgcl9hZGRlbmQsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl9hZGRyKSkpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIGxpbmsgb3JkZXIgd2hpY2ggaXMgc3VwcG9zZWQgdG8gZ2VuZXJhdGUgYSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hb3V0X2xpbmtfcmVsb2NfbGlua19vcmRlciAoZmluZm8sIG8sIHApCi0gICAgIHN0cnVjdCBhb3V0X2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGFzZWN0aW9uICpvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYyAqcHI7Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBmaWxlX3B0ciAqcmVsb2ZmX3B0cjsKLSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCBzcmVsOwotICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIGVyZWw7Ci0gIFBUUiByZWxfcHRyOwotCi0gIHByID0gcC0+dS5yZWxvYy5wOwotCi0gIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAocHItPnUuc2VjdGlvbikpCi0Jcl9pbmRleCA9IE5fQUJTIHwgTl9FWFQ7Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAocHItPnUuc2VjdGlvbi0+b3duZXIgPT0gZmluZm8tPm91dHB1dF9iZmQpOwotCSAgcl9pbmRleCA9IHByLT51LnNlY3Rpb24tPnRhcmdldF9pbmRleDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBCRkRfQVNTRVJUIChwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcik7Ci0gICAgICByX2V4dGVybiA9IDE7Ci0gICAgICBoID0gKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSBwci0+dS5uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+aW5keCA+PSAwKQotCXJfaW5kZXggPSBoLT5pbmR4OwotICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCXsKLQkgIC8qIFdlIGRlY2lkZWQgdG8gc3RyaXAgdGhpcyBzeW1ib2wsIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCB3ZQotCSAgICAgY2FuJ3QuICBOb3RlIHRoYXQgd2UgbG9zZSB0aGUgb3RoZXIgYW5kIGRlc2MgaW5mb3JtYXRpb24KLQkgICAgIGhlcmUuICBJIGRvbid0IHRoaW5rIHRoYXQgd2lsbCBldmVyIG1hdHRlciBmb3IgYSBnbG9iYWwKLQkgICAgIHN5bWJvbC4gICovCi0JICBoLT5pbmR4ID0gLTI7Ci0JICBoLT53cml0dGVuID0gZmFsc2U7Ci0JICBpZiAoISBhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sIChoLCAoUFRSKSBmaW5mbykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJfaW5kZXggPSBoLT5pbmR4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGZpbmZvLT5pbmZvLCBwci0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJfaW5kZXggPSAwOwotCX0KLSAgICB9Ci0KLSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGZpbmZvLT5vdXRwdXRfYmZkLCBwci0+cmVsb2MpOwotICBpZiAoaG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG8gPT0gb2JqX3RleHRzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKSkKLSAgICByZWxvZmZfcHRyID0gJmZpbmZvLT50cmVsb2ZmOwotICBlbHNlIGlmIChvID09IG9ial9kYXRhc2VjIChmaW5mby0+b3V0cHV0X2JmZCkpCi0gICAgcmVsb2ZmX3B0ciA9ICZmaW5mby0+ZHJlbG9mZjsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSNpZmRlZiBNWV9wdXRfcmVsb2MKLSAgICAgIE1ZX3B1dF9yZWxvYyhmaW5mby0+b3V0cHV0X2JmZCwgcl9leHRlcm4sIHJfaW5kZXgsIHAtPm9mZnNldCwgaG93dG8sCi0JCSAgICZzcmVsKTsKLSNlbHNlCi0gICAgICB7Ci0JaW50IHJfcGNyZWw7Ci0JaW50IHJfYmFzZXJlbDsKLQlpbnQgcl9qbXB0YWJsZTsKLQlpbnQgcl9yZWxhdGl2ZTsKLQlpbnQgcl9sZW5ndGg7Ci0KLQlyX3BjcmVsID0gaG93dG8tPnBjX3JlbGF0aXZlOwotCXJfYmFzZXJlbCA9IChob3d0by0+dHlwZSAmIDgpICE9IDA7Ci0Jcl9qbXB0YWJsZSA9IChob3d0by0+dHlwZSAmIDE2KSAhPSAwOwotCXJfcmVsYXRpdmUgPSAoaG93dG8tPnR5cGUgJiAzMikgIT0gMDsKLQlyX2xlbmd0aCA9IGhvd3RvLT5zaXplOwotCi0JUFVUX1dPUkQgKGZpbmZvLT5vdXRwdXRfYmZkLCBwLT5vZmZzZXQsIHNyZWwucl9hZGRyZXNzKTsKLQlpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JICB7Ci0JICAgIHNyZWwucl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0JICAgIHNyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgICAgc3JlbC5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkgICAgc3JlbC5yX3R5cGVbMF0gPQotCSAgICAgICgocl9leHRlcm4gPyAgICAgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRyA6IDApCi0JICAgICAgIHwgKHJfcGNyZWwgPyAgICBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCSAgICAgICB8IChyX2Jhc2VyZWwgPyAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcgOiAwKQotCSAgICAgICB8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHIDogMCkKLQkgICAgICAgfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRyA6IDApCi0JICAgICAgIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBzcmVsLnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotCSAgICBzcmVsLnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0JICAgIHNyZWwucl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JICAgIHNyZWwucl90eXBlWzBdID0KLQkgICAgICAoKHJfZXh0ZXJuID8gICAgIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX3BjcmVsID8gICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQkgICAgICAgfCAocl9iYXNlcmVsID8gIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFIDogMCkKLQkgICAgICAgfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSA6IDApCi0JICAgICAgIHwgKHJfcmVsYXRpdmUgPyBSRUxPQ19TVERfQklUU19SRUxBVElWRV9MSVRUTEUgOiAwKQotCSAgICAgICB8IChyX2xlbmd0aCA8PCAgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSkpOwotCSAgfQotICAgICAgfQotI2VuZGlmCi0gICAgICByZWxfcHRyID0gKFBUUikgJnNyZWw7Ci0KLSAgICAgIC8qIFdlIGhhdmUgdG8gd3JpdGUgdGhlIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwgc2luY2UKLQkgc3RhbmRhcmQgYS5vdXQgcmVsb2NzIGFyZSBpbiBwbGFjZS4gIEl0IHdvdWxkIGJlIG1vcmUKLQkgcmVsaWFibGUgaWYgd2UgaGFkIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBmaWxlIGhlcmUsCi0JIHJhdGhlciB0aGFuIGFzc3VtaW5nIHplcm9lcywgYnV0IHdlIGNhbid0IHJlYWQgdGhlIGZpbGUgc2luY2UKLQkgaXQgd2FzIG9wZW5lZCB1c2luZyBiZmRfb3BlbncuICAqLwotICAgICAgaWYgKHByLT5hZGRlbmQgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQkgIGJmZF9ieXRlICpidWY7Ci0JICBib29sZWFuIG9rOwotCi0JICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0JICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotCSAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgciA9IE1ZX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgZmluZm8tPm91dHB1dF9iZmQsCi0JCQkJICAgICAgcHItPmFkZGVuZCwgYnVmKTsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vazoKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGZpbmZvLT5pbmZvLAotCQkgICAgICAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgICA/IGJmZF9zZWN0aW9uX25hbWUgKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkgICBwci0+dS5zZWN0aW9uKQotCQkgICAgICAgOiBwci0+dS5uYW1lKSwKLQkJICAgICAgaG93dG8tPm5hbWUsIHByLT5hZGRlbmQsIChiZmQgKikgTlVMTCwKLQkJICAgICAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JCXsKLQkJICBmcmVlIChidWYpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoZmluZm8tPm91dHB1dF9iZmQsIG8sCi0JCQkJCSAoUFRSKSBidWYsCi0JCQkJCSAoZmlsZV9wdHIpIHAtPm9mZnNldCwKLQkJCQkJIHNpemUpOwotCSAgZnJlZSAoYnVmKTsKLQkgIGlmICghIG9rKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9XT1JEIChmaW5mby0+b3V0cHV0X2JmZCwgcC0+b2Zmc2V0LCBlcmVsLnJfYWRkcmVzcyk7Ci0KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGZpbmZvLT5vdXRwdXRfYmZkKSkKLQl7Ci0JICBlcmVsLnJfaW5kZXhbMF0gPSByX2luZGV4ID4+IDE2OwotCSAgZXJlbC5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotCSAgZXJlbC5yX2luZGV4WzJdID0gcl9pbmRleDsKLQkgIGVyZWwucl90eXBlWzBdID0KLQkgICAgKChyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCSAgICAgfCAoaG93dG8tPnR5cGUgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXJlbC5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLQkgIGVyZWwucl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLQkgIGVyZWwucl9pbmRleFswXSA9IHJfaW5kZXg7Ci0JICBlcmVsLnJfdHlwZVswXSA9Ci0JICAgIChyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUgOiAwKQotCSAgICAgIHwgKGhvd3RvLT50eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLQl9Ci0KLSAgICAgIFBVVF9XT1JEIChmaW5mby0+b3V0cHV0X2JmZCwgcHItPmFkZGVuZCwgZXJlbC5yX2FkZGVuZCk7Ci0KLSAgICAgIHJlbF9wdHIgPSAoUFRSKSAmZXJlbDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChmaW5mby0+b3V0cHV0X2JmZCwgKnJlbG9mZl9wdHIsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlIChyZWxfcHRyLCAoYmZkX3NpemVfdHlwZSkgMSwKLQkJICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoZmluZm8tPm91dHB1dF9iZmQpLAotCQkgICAgIGZpbmZvLT5vdXRwdXRfYmZkKQotCSAgIT0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGZpbmZvLT5vdXRwdXRfYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpyZWxvZmZfcHRyICs9IG9ial9yZWxvY19lbnRyeV9zaXplIChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgLyogQXNzZXJ0IHRoYXQgdGhlIHJlbG9jcyBoYXZlIG5vdCBydW4gaW50byB0aGUgc3ltYm9scywgYW5kIHRoYXQgbgotICAgICB0aGUgdGV4dCByZWxvY3MgaGF2ZSBub3QgcnVuIGludG8gdGhlIGRhdGEgcmVsb2NzLiAgKi8KLSAgQkZEX0FTU0VSVCAoKnJlbG9mZl9wdHIgPD0gb2JqX3N5bV9maWxlcG9zIChmaW5mby0+b3V0cHV0X2JmZCkKLQkgICAgICAmJiAocmVsb2ZmX3B0ciAhPSAmZmluZm8tPnRyZWxvZmYKLQkJICB8fCAoKnJlbG9mZl9wdHIKLQkJICAgICAgPD0gb2JqX2RhdGFzZWMgKGZpbmZvLT5vdXRwdXRfYmZkKS0+cmVsX2ZpbGVwb3MpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYXJjaGl2ZS5jIGIvYmZkL2FyY2hpdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1YWVhZi4uMDAwMDAwMAotLS0gYS9iZmQvYXJjaGl2ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzMCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGFyY2hpdmUgZmlsZXMgKGxpYnJhcmllcykuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBNb3N0bHkgR3VtYnkgSGVua2VsLVdhbGxhY2UncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotQHNldGZpbGVuYW1lIGFyY2hpdmUtaW5mbwotU0VDVElPTgotCUFyY2hpdmVzCi0KLURFU0NSSVBUSU9OCi0JQW4gYXJjaGl2ZSAob3IgbGlicmFyeSkgaXMganVzdCBhbm90aGVyIEJGRC4gIEl0IGhhcyBhIHN5bWJvbAotCXRhYmxlLCBhbHRob3VnaCB0aGVyZSdzIG5vdCBtdWNoIGEgdXNlciBwcm9ncmFtIHdpbGwgZG8gd2l0aCBpdC4KLQotCVRoZSBiaWcgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIGFyY2hpdmUgQkZEIGFuZCBhbiBvcmRpbmFyeSBCRkQKLQlpcyB0aGF0IHRoZSBhcmNoaXZlIGRvZXNuJ3QgaGF2ZSBzZWN0aW9ucy4gIEluc3RlYWQgaXQgaGFzIGEKLQljaGFpbiBvZiBCRkRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgaXRzIGNvbnRlbnRzLiAgVGhlc2UgQkZEcyBjYW4KLQliZSBtYW5pcHVsYXRlZCBsaWtlIGFueSBvdGhlci4gIFRoZSBCRkRzIGNvbnRhaW5lZCBpbiBhbgotCWFyY2hpdmUgb3BlbmVkIGZvciByZWFkaW5nIHdpbGwgYWxsIGJlIG9wZW5lZCBmb3IgcmVhZGluZy4gIFlvdQotCW1heSBwdXQgZWl0aGVyIGlucHV0IG9yIG91dHB1dCBCRkRzIGludG8gYW4gYXJjaGl2ZSBvcGVuZWQgZm9yCi0Jb3V0cHV0OyB0aGV5IHdpbGwgYmUgaGFuZGxlZCBjb3JyZWN0bHkgd2hlbiB0aGUgYXJjaGl2ZSBpcyBjbG9zZWQuCi0KLQlVc2UgPDxiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlPj4gdG8gc3RlcCB0aHJvdWdoCi0JdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgb3BlbmVkIGZvciBpbnB1dC4gIFlvdSBkb24ndAotCWhhdmUgdG8gcmVhZCB0aGUgZW50aXJlIGFyY2hpdmUgaWYgeW91IGRvbid0IHdhbnQKLQl0byEgIFJlYWQgaXQgdW50aWwgeW91IGZpbmQgd2hhdCB5b3Ugd2FudC4KLQotCUFyY2hpdmUgY29udGVudHMgb2Ygb3V0cHV0IEJGRHMgYXJlIGNoYWluZWQgdGhyb3VnaCB0aGUKLQk8PG5leHQ+PiBwb2ludGVyIGluIGEgQkZELiAgVGhlIGZpcnN0IG9uZSBpcyBmaW5kYWJsZSB0aHJvdWdoCi0JdGhlIDw8YXJjaGl2ZV9oZWFkPj4gc2xvdCBvZiB0aGUgYXJjaGl2ZS4gIFNldCBpdCB3aXRoCi0JPDxiZmRfc2V0X2FyY2hpdmVfaGVhZD4+IChxLnYuKS4gIEEgZ2l2ZW4gQkZEIG1heSBiZSBpbiBvbmx5IG9uZQotCW9wZW4gb3V0cHV0IGFyY2hpdmUgYXQgYSB0aW1lLgotCi0JQXMgZXhwZWN0ZWQsIHRoZSBCRkQgYXJjaGl2ZSBjb2RlIGlzIG1vcmUgZ2VuZXJhbCB0aGFuIHRoZQotCWFyY2hpdmUgY29kZSBvZiBhbnkgZ2l2ZW4gZW52aXJvbm1lbnQuICBCRkQgYXJjaGl2ZXMgbWF5Ci0JY29udGFpbiBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyAoZS5nLiwgYS5vdXQgYW5kIGNvZmYpIGFuZAotCWV2ZW4gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuICBZb3UgbWF5IGV2ZW4gcGxhY2UgYXJjaGl2ZXMKLQlyZWN1cnNpdmVseSBpbnRvIGFyY2hpdmVzIQotCi0JVGhpcyBjYW4gY2F1c2UgdW5leHBlY3RlZCBjb25mdXNpb24sIHNpbmNlIHNvbWUgYXJjaGl2ZQotCWZvcm1hdHMgYXJlIG1vcmUgZXhwcmVzc2l2ZSB0aGFuIG90aGVycy4gIEZvciBpbnN0YW5jZSwgSW50ZWwKLQlDT0ZGIGFyY2hpdmVzIGNhbiBwcmVzZXJ2ZSBsb25nIGZpbGVuYW1lczsgU3VuT1MgYS5vdXQgYXJjaGl2ZXMKLQljYW5ub3QuICBJZiB5b3UgbW92ZSBhIGZpbGUgZnJvbSB0aGUgZmlyc3QgdG8gdGhlIHNlY29uZAotCWZvcm1hdCBhbmQgYmFjayBhZ2FpbiwgdGhlIGZpbGVuYW1lIG1heSBiZSB0cnVuY2F0ZWQuCi0JTGlrZXdpc2UsIGRpZmZlcmVudCBhLm91dCBlbnZpcm9ubWVudHMgaGF2ZSBkaWZmZXJlbnQKLQljb252ZW50aW9ucyBhcyB0byBob3cgdGhleSB0cnVuY2F0ZSBmaWxlbmFtZXMsIHdoZXRoZXIgdGhleQotCXByZXNlcnZlIGRpcmVjdG9yeSBuYW1lcyBpbiBmaWxlbmFtZXMsIGV0Yy4gIFdoZW4KLQlpbnRlcm9wZXJhdGluZyB3aXRoIG5hdGl2ZSB0b29scywgYmUgc3VyZSB5b3VyIGZpbGVzIGFyZQotCWhvbW9nZW5lb3VzLgotCi0JQmV3YXJlOiBtb3N0IG9mIHRoZXNlIGZvcm1hdHMgZG8gbm90IHJlYWN0IHdlbGwgdG8gdGhlCi0JcHJlc2VuY2Ugb2Ygc3BhY2VzIGluIGZpbGVuYW1lcy4gIFdlIGRvIHRoZSBiZXN0IHdlIGNhbiwgYnV0Ci0JY2FuJ3QgYWx3YXlzIGhhbmRsZSB0aGlzIGNhc2UgZHVlIHRvIHJlc3RyaWN0aW9ucyBpbiB0aGUgZm9ybWF0IG9mCi0JYXJjaGl2ZXMuICBNYW55IFVuaXggdXRpbGl0aWVzIGFyZSBicmFpbmRlYWQgaW4gcmVnYXJkcyB0bwotCXNwYWNlcyBhbmQgc3VjaCBpbiBmaWxlbmFtZXMgYW55d2F5LCBzbyB0aGlzIHNob3VsZG4ndCBiZSBtdWNoCi0Jb2YgYSByZXN0cmljdGlvbi4KLQotCUFyY2hpdmVzIGFyZSBzdXBwb3J0ZWQgaW4gQkZEIGluIDw8YXJjaGl2ZS5jPj4uCi0KLSovCi0KLS8qIEFzc3VtZXM6Ci0gICBvIC0gYWxsIGFyY2hpdmUgZWxlbWVudHMgc3RhcnQgb24gYW4gZXZlbiBib3VuZGFyeSwgbmV3bGluZSBwYWRkZWQ7Ci0gICBvIC0gYWxsIGFyY2ggaGVhZGVycyBhcmUgY2hhciAqOwotICAgbyAtIGFsbCBhcmNoIGhlYWRlcnMgYXJlIHRoZSBzYW1lIHNpemUgKGFjcm9zcyBhcmNoaXRlY3R1cmVzKS4KLSovCi0KLS8qIFNvbWUgZm9ybWF0cyBwcm92aWRlIGEgd2F5IHRvIGNyYW0gYSBsb25nIGZpbGVuYW1lIGludG8gdGhlIHNob3J0Ci0gICAoMTYgY2hhcnMpIHNwYWNlIHByb3ZpZGVkIGJ5IGEgQlNEIGFyY2hpdmUuICBUaGUgdHJpY2sgaXM6IG1ha2UgYQotICAgc3BlY2lhbCAiZmlsZSIgaW4gdGhlIGZyb250IG9mIHRoZSBhcmNoaXZlLCBzb3J0IG9mIGxpa2UgdGhlIFNZTURFRgotICAgZW50cnkuICBJZiB0aGUgZmlsZW5hbWUgaXMgdG9vIGxvbmcgdG8gZml0LCBwdXQgaXQgaW4gdGhlIGV4dGVuZGVkCi0gICBuYW1lIHRhYmxlLCBhbmQgdXNlIGl0cyBpbmRleCBhcyB0aGUgZmlsZW5hbWUuICBUbyBwcmV2ZW50Ci0gICBjb25mdXNpb24gcHJlcGVuZCB0aGUgaW5kZXggd2l0aCBhIHNwYWNlLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QKLSAgIGhhdmUgZmlsZW5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIHNwYWNlLCBidXQgdGhlbiBhZ2FpbiwgbWFueSBVbml4Ci0gICB1dGlsaXRpZXMgY2FuJ3QgaGFuZGxlIHRoYXQgYW55d2F5LgotCi0gICBUaGlzIHNjaGVtZSB1bmZvcnR1bmF0ZWx5IHJlcXVpcmVzIHRoYXQgeW91IHN0YW5kIG9uIHlvdXIgaGVhZCBpbgotICAgb3JkZXIgdG8gd3JpdGUgYW4gYXJjaGl2ZSBzaW5jZSB5b3UgbmVlZCB0byBwdXQgYSBtYWdpYyBmaWxlIGF0IHRoZQotICAgZnJvbnQsIGFuZCBuZWVkIHRvIHRvdWNoIGV2ZXJ5IGVudHJ5IHRvIGRvIHNvLiAgQydlc3QgbGEgdmllLgotCi0gICBXZSBzdXBwb3J0IHR3byB2YXJpYW50cyBvZiB0aGlzIGlkZWE6Ci0gICBUaGUgU1ZSNCBmb3JtYXQgKGV4dGVuZGVkIG5hbWUgdGFibGUgaXMgbmFtZWQgIi8vIiksCi0gICBhbmQgYW4gZXh0ZW5kZWQgcHNldWRvLUJTRCB2YXJpYW50IChleHRlbmRlZCBuYW1lIHRhYmxlIGlzIG5hbWVkCi0gICAiQVJGSUxFTkFNRVMvIikuICBUaGUgb3JpZ2luIG9mIHRoZSBsYXR0ZXIgZm9ybWF0IGlzIHVuY2VydGFpbi4KLQotICAgQlNEIDQuNCB1c2VzIGEgdGhpcmQgc2NoZW1lOiAgSXQgd3JpdGVzIGEgbG9uZyBmaWxlbmFtZQotICAgZGlyZWN0bHkgYWZ0ZXIgdGhlIGhlYWRlci4gIFRoaXMgYWxsb3dzICdhciBxJyB0byB3b3JrLgotICAgV2UgY3VycmVudGx5IGNhbiByZWFkIEJTRCA0LjQgYXJjaGl2ZXMsIGJ1dCBub3Qgd3JpdGUgdGhlbS4KLSovCi0KLS8qIFN1bW1hcnkgb2YgYXJjaGl2ZSBtZW1iZXIgbmFtZXM6Ci0KLSBTeW1ib2wgdGFibGUgKG11c3QgYmUgZmlyc3QpOgotICJfXy5TWU1ERUYgICAgICAgIiAtIFN5bWJvbCB0YWJsZSwgQmVya2VsZXkgc3R5bGUsIHByb2R1Y2VkIGJ5IHJhbmxpYi4KLSAiLyAgICAgICAgICAgICAgICIgLSBTeW1ib2wgdGFibGUsIHN5c3RlbSA1IHN0eWxlLgotCi0gTG9uZyBuYW1lIHRhYmxlIChtdXN0IGJlIGJlZm9yZSByZWd1bGFyIGZpbGUgbWVtYmVycyk6Ci0gIi8vICAgICAgICAgICAgICAiIC0gTG9uZyBuYW1lIHRhYmxlLCBTeXN0ZW0gNSBSNCBzdHlsZS4KLSAiQVJGSUxFTkFNRVMvICAgICIgLSBMb25nIG5hbWUgdGFibGUsIG5vbi1zdGFuZGFyZCBleHRlbmRlZCBCU0QgKG5vdCBCU0QgNC40KS4KLQotIFJlZ3VsYXIgZmlsZSBtZW1iZXJzIHdpdGggc2hvcnQgbmFtZXM6Ci0gImZpbGVuYW1lLm8vICAgICAiIC0gUmVndWxhciBmaWxlLCBTeXN0ZW0gNSBzdHlsZSAoZW1iZWRkZWQgc3BhY2VzIG9rKS4KLSAiZmlsZW5hbWUubyAgICAgICIgLSBSZWd1bGFyIGZpbGUsIEJlcmtlbGV5IHN0eWxlIChubyBlbWJlZGRlZCBzcGFjZXMpLgotCi0gUmVndWxhciBmaWxlcyB3aXRoIGxvbmcgbmFtZXMgKG9yIGVtYmVkZGVkIHNwYWNlcywgZm9yIEJTRCB2YXJpYW50cyk6Ci0gIi8xOCAgICAgICAgICAgICAiIC0gU1ZSNCBzdHlsZSwgbmFtZSBhdCBvZmZzZXQgMTggaW4gbmFtZSB0YWJsZS4KLSAiIzEvMjMgICAgICAgICAgICIgLSBMb25nIG5hbWUgKG9yIGVtYmVkZGVkIHBhY2VzKSAyMyBjaGFyYWN0ZXJzIGxvbmcsCi0JCSAgICAgIEJTRCA0LjQgc3R5bGUsIGZ1bGwgbmFtZSBmb2xsb3dzIGhlYWRlci4KLQkJICAgICAgSW1wbGVtZW50ZWQgZm9yIHJlYWRpbmcsIG5vdCB3cml0aW5nLgotICIgMTggICAgICAgICAgICAgIiAtIExvbmcgbmFtZSAxOCBjaGFyYWN0ZXJzIGxvbmcsIGV4dGVuZGVkIHBzZXVkby1CU0QuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJhb3V0L3JhbmxpYi5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEdOVTk2MAotI2RlZmluZSBCRkRfR05VOTYwX0FSTUFHKGFiZmQpCShCRkRfQ09GRl9GSUxFX1AoKGFiZmQpKSA/IEFSTUFHIDogQVJNQUdCKQotI2VuZGlmCi0KLS8qIERlZmluZSBvZmZzZXRvZiBmb3IgdGhvc2Ugc3lzdGVtcyB3aGljaCBsYWNrIGl0ICovCi0KLSNpZm5kZWYgb2Zmc2V0b2YKLSNkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQotI2VuZGlmCi0KLS8qIFdlIGtlZXAgYSBjYWNoZSBvZiBhcmNoaXZlIGZpbGVwb2ludGVycyB0byBhcmNoaXZlIGVsZW1lbnRzIHRvCi0gICBzcGVlZCB1cCBzZWFyY2hpbmcgdGhlIGFyY2hpdmUgYnkgZmlsZXBvcy4gIFdlIG9ubHkgYWRkIGFuIGVudHJ5IHRvCi0gICB0aGUgY2FjaGUgd2hlbiB3ZSBhY3R1YWxseSByZWFkIG9uZS4gIFdlIGFsc28gZG9uJ3Qgc29ydCB0aGUgY2FjaGU7Ci0gICBpdCdzIGdlbmVyYWxseSBzaG9ydCBlbm91Z2ggdG8gc2VhcmNoIGxpbmVhcmx5LgotICAgTm90ZSB0aGF0IHRoZSBwb2ludGVycyBoZXJlIHBvaW50IHRvIHRoZSBmcm9udCBvZiB0aGUgYXJfaGRyLCBub3QKLSAgIHRvIHRoZSBmcm9udCBvZiB0aGUgY29udGVudHMhCi0qLwotc3RydWN0IGFyX2NhY2hlCi17Ci0gIGZpbGVfcHRyIHB0cjsKLSAgYmZkICphcmVsdDsKLSAgc3RydWN0IGFyX2NhY2hlICpuZXh0OwotfTsKLQotI2RlZmluZSBhcl9wYWRjaGFyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmFyX3BhZF9jaGFyKQotI2RlZmluZSBhcl9tYXhuYW1lbGVuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmFyX21heF9uYW1lbGVuKQotCi0jZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSgoYmZkKS0+YXJlbHRfZGF0YSkpCi0jZGVmaW5lIGFyY2hfaGRyKGJmZCkgKChzdHJ1Y3QgYXJfaGRyICopYXJjaF9lbHRkYXRhKGJmZCktPmFyY2hfaGVhZGVyKQotCi1zdGF0aWMgY2hhciAqZ2V0X2V4dGVuZGVkX2FyZWx0X2ZpbGVuYW1lIFBBUkFNUyAoKGJmZCAqYXJjaCwKLQkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIGJvb2xlYW4gZG9fc2x1cnBfYnNkX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gZG9fc2x1cnBfY29mZl9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpub3JtYWxpemUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKmZpbGUpKTsKLXN0YXRpYyBzdHJ1Y3QgYXJlbHRkYXRhICpiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJICAgICBjb25zdCBjaGFyICosCi0JCQkJCQkJICAgICBiZmQgKm1lbWJlcikpOwotDAotYm9vbGVhbgotX2JmZF9nZW5lcmljX21rYXJjaGl2ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSAoKHN0cnVjdCBhcnRkYXRhICopCi0JCQkgICAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhcnRkYXRhKSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X25leHRfbWFwZW50Ci0KLVNZTk9QU0lTCi0Jc3ltaW5kZXggYmZkX2dldF9uZXh0X21hcGVudChiZmQgKmFiZmQsIHN5bWluZGV4IHByZXZpb3VzLCBjYXJzeW0gKipzeW0pOwotCi1ERVNDUklQVElPTgotCVN0ZXAgdGhyb3VnaCBhcmNoaXZlIEB2YXJ7YWJmZH0ncyBzeW1ib2wgdGFibGUgKGlmIGl0Ci0JaGFzIG9uZSkuICBTdWNjZXNzaXZlbHkgdXBkYXRlIEB2YXJ7c3ltfSB3aXRoIHRoZSBuZXh0IHN5bWJvbCdzCi0JaW5mb3JtYXRpb24sIHJldHVybmluZyB0aGF0IHN5bWJvbCdzIChpbnRlcm5hbCkgaW5kZXggaW50byB0aGUKLQlzeW1ib2wgdGFibGUuCi0KLQlTdXBwbHkgPDxCRkRfTk9fTU9SRV9TWU1CT0xTPj4gYXMgdGhlIEB2YXJ7cHJldmlvdXN9IGVudHJ5IHRvIGdldAotCXRoZSBmaXJzdCBvbmU7IHJldHVybnMgPDxCRkRfTk9fTU9SRV9TWU1CT0xTPj4gd2hlbiB5b3UndmUgYWxyZWFkeQotCWdvdCB0aGUgbGFzdCBvbmUuCi0KLQlBIDw8Y2Fyc3ltPj4gaXMgYSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2wuICBUaGUgb25seQotCXVzZXItdmlzaWJsZSBlbGVtZW50IGlzIGl0cyBuYW1lLCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCi0qLwotCi1zeW1pbmRleAotYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgcHJldiwgZW50cnkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3ltaW5kZXggcHJldjsKLSAgICAgY2Fyc3ltICoqZW50cnk7Ci17Ci0gIGlmICghYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgICB9Ci0KLSAgaWYgKHByZXYgPT0gQkZEX05PX01PUkVfU1lNQk9MUykKLSAgICBwcmV2ID0gMDsKLSAgZWxzZQotICAgICsrcHJldjsKLSAgaWYgKHByZXYgPj0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudCkKLSAgICByZXR1cm4gQkZEX05PX01PUkVfU1lNQk9MUzsKLQotICAqZW50cnkgPSAoYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgKyBwcmV2KTsKLSAgcmV0dXJuIHByZXY7Ci19Ci0KLS8qIFRvIGJlIGNhbGxlZCBieSBiYWNrZW5kcyBvbmx5ICovCi0KLWJmZCAqCi1fYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKG9iZmQpCi0gICAgIGJmZCAqb2JmZDsKLXsKLSAgcmV0dXJuIF9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gKG9iZmQpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2FyY2hpdmVfaGVhZAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9hcmNoaXZlX2hlYWQoYmZkICpvdXRwdXQsIGJmZCAqbmV3X2hlYWQpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgaGVhZCBvZiB0aGUgY2hhaW4gb2YKLQlCRkRzIGNvbnRhaW5lZCBpbiB0aGUgYXJjaGl2ZSBAdmFye291dHB1dH0gdG8gQHZhcntuZXdfaGVhZH0uCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2FyY2hpdmVfaGVhZCAob3V0cHV0X2FyY2hpdmUsIG5ld19oZWFkKQotICAgICBiZmQgKm91dHB1dF9hcmNoaXZlOwotICAgICBiZmQgKm5ld19oZWFkOwotewotCi0gIG91dHB1dF9hcmNoaXZlLT5hcmNoaXZlX2hlYWQgPSBuZXdfaGVhZDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJmZCAqCi1fYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSAoYXJjaF9iZmQsIGZpbGVwb3MpCi0gICAgIGJmZCAqYXJjaF9iZmQ7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcl9jYWNoZSAqY3VycmVudDsKLQotICBmb3IgKGN1cnJlbnQgPSBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlOyBjdXJyZW50ICE9IE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgaWYgKGN1cnJlbnQtPnB0ciA9PSBmaWxlcG9zKQotICAgICAgcmV0dXJuIGN1cnJlbnQtPmFyZWx0OwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBLaW5kIG9mIHN0dXBpZCB0byBjYWxsIGNvbnMgZm9yIGVhY2ggb25lLCBidXQgd2UgZG9uJ3QgZG8gdG9vIG1hbnkgKi8KLWJvb2xlYW4KLV9iZmRfYWRkX2JmZF90b19hcmNoaXZlX2NhY2hlIChhcmNoX2JmZCwgZmlsZXBvcywgbmV3X2VsdCkKLSAgICAgYmZkICphcmNoX2JmZCwgKm5ld19lbHQ7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIHN0cnVjdCBhcl9jYWNoZSAqbmV3X2NhY2hlID0gKChzdHJ1Y3QgYXJfY2FjaGUgKikKLQkJCQliZmRfemFsbG9jIChhcmNoX2JmZCwKLQkJCQkJICAgIHNpemVvZiAoc3RydWN0IGFyX2NhY2hlKSkpOwotCi0gIGlmIChuZXdfY2FjaGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmV3X2NhY2hlLT5wdHIgPSBmaWxlcG9zOwotICBuZXdfY2FjaGUtPmFyZWx0ID0gbmV3X2VsdDsKLSAgbmV3X2NhY2hlLT5uZXh0ID0gKHN0cnVjdCBhcl9jYWNoZSAqKSBOVUxMOwotICBpZiAoYmZkX2FyZGF0YSAoYXJjaF9iZmQpLT5jYWNoZSA9PSBOVUxMKQotICAgIGJmZF9hcmRhdGEgKGFyY2hfYmZkKS0+Y2FjaGUgPSBuZXdfY2FjaGU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYXJfY2FjaGUgKmN1cnJlbnQgPSBiZmRfYXJkYXRhIChhcmNoX2JmZCktPmNhY2hlOwotCi0gICAgICB3aGlsZSAoY3VycmVudC0+bmV4dCAhPSBOVUxMKQotCWN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotICAgICAgY3VycmVudC0+bmV4dCA9IG5ld19jYWNoZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGUgbmFtZSBiZWdpbnMgd2l0aCBzcGFjZS4gIEhlbmNlIHRoZSByZXN0IG9mIHRoZSBuYW1lIGlzIGFuIGluZGV4IGludG8KLSAgIHRoZSBzdHJpbmcgdGFibGUuICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9leHRlbmRlZF9hcmVsdF9maWxlbmFtZSAoYXJjaCwgbmFtZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICB1bnNpZ25lZCBsb25nIGluZGV4ID0gMDsKLQotICAvKiBTaG91bGQgZXh0cmFjdCBzdHJpbmcgc28gdGhhdCBJIGNhbiBndWFyYW50ZWUgbm90IHRvIG92ZXJmbG93IGludG8KLSAgICAgdGhlIG5leHQgcmVnaW9uLCBidXQgSSdtIHRvbyBsYXp5LiAqLwotICBlcnJubyA9IDA7Ci0gIC8qIFNraXAgZmlyc3QgY2hhciwgd2hpY2ggaXMgJy8nIGluIFNWUjQgb3IgJyAnIGluIHNvbWUgb3RoZXIgdmFyaWFudHMuICovCi0gIGluZGV4ID0gc3RydG9sIChuYW1lICsgMSwgTlVMTCwgMTApOwotICBpZiAoZXJybm8gIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfYXJkYXRhIChhcmNoKS0+ZXh0ZW5kZWRfbmFtZXMgKyBpbmRleDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbnMgcmVhZHMgYW4gYXJjaCBoZWFkZXIgYW5kIHJldHVybnMgYW4gYXJlbHRkYXRhIHBvaW50ZXIsIG9yCi0gICBOVUxMIG9uIGVycm9yLgotCi0gICBQcmVzdW1lcyB0aGUgZmlsZSBwb2ludGVyIGlzIGFscmVhZHkgaW4gdGhlIHJpZ2h0IHBsYWNlIChpZSBwb2ludGluZwotICAgdG8gdGhlIGFyX2hkciBpbiB0aGUgZmlsZSkuICAgTW92ZXMgdGhlIGZpbGUgcG9pbnRlcjsgb24gc3VjY2VzcyBpdAotICAgc2hvdWxkIGJlIHBvaW50aW5nIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBjb250ZW50czsgb24gZmFpbHVyZSBpdAotICAgY291bGQgaGF2ZSBiZWVuIG1vdmVkIGFyYml0cmFyaWx5LgotKi8KLQotUFRSCi1fYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgKGFiZmQsIChjb25zdCBjaGFyICopIE5VTEwpOwotfQotCi0vKiBBbHBoYSBFQ09GRiB1c2VzIGFuIG9wdGlvbmFsIGRpZmZlcmVudCBBUkZNQUcgdmFsdWUsIHNvIHdlIGhhdmUgYQotICAgdmFyaWFudCBvZiBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIgd2hpY2ggYWNjZXB0cyBhIG1hZ2ljIHN0cmluZy4gICovCi0KLVBUUgotX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyAoYWJmZCwgbWFnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm1hZzsKLXsKLSAgc3RydWN0IGFyX2hkciBoZHI7Ci0gIGNoYXIgKmhkcnAgPSAoY2hhciAqKSAmaGRyOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKmFyZWQ7Ci0gIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IG5hbWVsZW4gPSAwOwotICB1bnNpZ25lZCBpbnQgYWxsb2NzaXplID0gc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0gIGNoYXIgKmFsbG9jcHRyID0gMDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhkcnAsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChzdHJuY21wIChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKSAhPSAwCi0gICAgICAmJiAobWFnID09IE5VTEwKLQkgIHx8IHN0cm5jbXAgKGhkci5hcl9mbWFnLCBtYWcsIDIpICE9IDApKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZXJybm8gPSAwOwotICBwYXJzZWRfc2l6ZSA9IHN0cnRvbCAoaGRyLmFyX3NpemUsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBFeHRyYWN0IHRoZSBmaWxlbmFtZSBmcm9tIHRoZSBhcmNoaXZlIC0gdGhlcmUgYXJlIHR3byB3YXlzIHRvCi0gICAgIHNwZWNpZnkgYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZSwgZWl0aGVyIHRoZSBmaXJzdCBjaGFyIG9mIHRoZQotICAgICBuYW1lIGlzIGEgc3BhY2UsIG9yIGl0J3MgYSBzbGFzaC4gICovCi0gIGlmICgoaGRyLmFyX25hbWVbMF0gPT0gJy8nCi0gICAgICAgfHwgKGhkci5hcl9uYW1lWzBdID09ICcgJwotCSAgICYmIG1lbWNociAoaGRyLmFyX25hbWUsICcvJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpID09IE5VTEwpKQotICAgICAgJiYgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZmlsZW5hbWUgPSBnZXRfZXh0ZW5kZWRfYXJlbHRfZmlsZW5hbWUgKGFiZmQsIGhkci5hcl9uYW1lKTsKLSAgICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotICAvKiBCU0Q0LjQtc3R5bGUgbG9uZyBmaWxlbmFtZS4KLSAgICAgT25seSBpbXBsZW1lbnRlZCBmb3IgcmVhZGluZywgc28gZmFyISAqLwotICBlbHNlIGlmIChoZHIuYXJfbmFtZVswXSA9PSAnIycKLQkgICAmJiBoZHIuYXJfbmFtZVsxXSA9PSAnMScKLQkgICAmJiBoZHIuYXJfbmFtZVsyXSA9PSAnLycKLQkgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaGRyLmFyX25hbWVbM10pKQotICAgIHsKLSAgICAgIC8qIEJTRC00LjQgZXh0ZW5kZWQgbmFtZSAqLwotICAgICAgbmFtZWxlbiA9IGF0b2kgKCZoZHIuYXJfbmFtZVszXSk7Ci0gICAgICBhbGxvY3NpemUgKz0gbmFtZWxlbiArIDE7Ci0gICAgICBwYXJzZWRfc2l6ZSAtPSBuYW1lbGVuOwotCi0gICAgICBhbGxvY3B0ciA9IGJmZF96YWxsb2MgKGFiZmQsIGFsbG9jc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2NwdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZpbGVuYW1lID0gKGFsbG9jcHRyCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIGlmIChiZmRfcmVhZCAoZmlsZW5hbWUsIDEsIG5hbWVsZW4sIGFiZmQpICE9IG5hbWVsZW4pCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBmaWxlbmFtZVtuYW1lbGVuXSA9ICdcMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UganVkZ2UgdGhlIGVuZCBvZiB0aGUgbmFtZSBieSBsb29raW5nIGZvciAnLycgb3IgJyAnLgotCSBOb3RlOiAgVGhlIFNZU1YgZm9ybWF0ICh0ZXJtaW5hdGVkIGJ5ICcvJykgYWxsb3dzIGVtYmVkZGVkCi0JIHNwYWNlcywgc28gb25seSBsb29rIGZvciAnICcgaWYgd2UgZG9uJ3QgZmluZCAnLycuICovCi0KLSAgICAgIGNoYXIgKmU7Ci0gICAgICBlID0gbWVtY2hyIChoZHIuYXJfbmFtZSwgJ1wwJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotICAgICAgaWYgKGUgPT0gTlVMTCkKLQl7Ci0gICAgICAgICAgZSA9IG1lbWNociAoaGRyLmFyX25hbWUsICcvJywgYXJfbWF4bmFtZWxlbiAoYWJmZCkpOwotCSAgaWYgKGUgPT0gTlVMTCkKLSAgICAgICAgICAgIGUgPSBtZW1jaHIgKGhkci5hcl9uYW1lLCAnICcsIGFyX21heG5hbWVsZW4gKGFiZmQpKTsKLQl9Ci0KLSAgICAgIGlmIChlICE9IE5VTEwpCi0JbmFtZWxlbiA9IGUgLSBoZHIuYXJfbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIHRlcm1pbmF0aW9uIGNoYXJhY3RlciwgdGhlbiB0aGUgbmFtZQotCSAgICAgbXVzdCBiZSB0aGUgZW50aXJlIGZpZWxkLiAgKi8KLQkgIG5hbWVsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQl9Ci0KLSAgICAgIGFsbG9jc2l6ZSArPSBuYW1lbGVuICsgMTsKLSAgICB9Ci0KLSAgaWYgKCFhbGxvY3B0cikKLSAgICB7Ci0gICAgICBhbGxvY3B0ciA9IGJmZF96YWxsb2MgKGFiZmQsIGFsbG9jc2l6ZSk7Ci0gICAgICBpZiAoYWxsb2NwdHIgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXJlZCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGFsbG9jcHRyOwotCi0gIGFyZWQtPmFyY2hfaGVhZGVyID0gYWxsb2NwdHIgKyBzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpOwotICBtZW1jcHkgKChjaGFyICopIGFyZWQtPmFyY2hfaGVhZGVyLCAoY2hhciAqKSAmaGRyLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgYXJlZC0+cGFyc2VkX3NpemUgPSBwYXJzZWRfc2l6ZTsKLQotICBpZiAoZmlsZW5hbWUgIT0gTlVMTCkKLSAgICBhcmVkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgYXJlZC0+ZmlsZW5hbWUgPSBhbGxvY3B0ciArIChzaXplb2YgKHN0cnVjdCBhcmVsdGRhdGEpICsKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgICAgIGlmIChuYW1lbGVuKQotCW1lbWNweSAoYXJlZC0+ZmlsZW5hbWUsIGhkci5hcl9uYW1lLCBuYW1lbGVuKTsKLSAgICAgIGFyZWQtPmZpbGVuYW1lW25hbWVsZW5dID0gJ1wwJzsKLSAgICB9Ci0KLSAgcmV0dXJuIChQVFIpIGFyZWQ7Ci19Ci0MCi0vKiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uOyBpdCdzIG1haW5seSB1c2VkIHdoZW4gaW5kZXhpbmcKLSAgIHRocm91Z2ggdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlLCBidXQgYWxzbyB1c2VkIHRvIGdldCB0aGUgbmV4dAotICAgZWxlbWVudCwgc2luY2UgaXQgaGFuZGxlcyB0aGUgYm9va2tlZXBpbmcgc28gbmljZWx5IGZvciB1cy4gICovCi0KLWJmZCAqCi1fYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcykKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICpuZXdfYXJlbGRhdGE7Ci0gIGJmZCAqbl9uZmQ7Ci0KLSAgbl9uZmQgPSBfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSAoYXJjaGl2ZSwgZmlsZXBvcyk7Ci0gIGlmIChuX25mZCkKLSAgICByZXR1cm4gbl9uZmQ7Ci0KLSAgaWYgKDAgPiBiZmRfc2VlayAoYXJjaGl2ZSwgZmlsZXBvcywgU0VFS19TRVQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICgobmV3X2FyZWxkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYXJjaGl2ZSkpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbl9uZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2hpdmUpOwotICBpZiAobl9uZmQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbmV3X2FyZWxkYXRhKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuX25mZC0+b3JpZ2luID0gYmZkX3RlbGwgKGFyY2hpdmUpOwotICBuX25mZC0+YXJlbHRfZGF0YSA9IChQVFIpIG5ld19hcmVsZGF0YTsKLSAgbl9uZmQtPmZpbGVuYW1lID0gbmV3X2FyZWxkYXRhLT5maWxlbmFtZTsKLQotICBpZiAoX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgKGFyY2hpdmUsIGZpbGVwb3MsIG5fbmZkKSkKLSAgICByZXR1cm4gbl9uZmQ7Ci0KLSAgLyogaHVoPyAqLwotICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbl9uZmQpOwotICBiZmRfcmVsZWFzZSAoYXJjaGl2ZSwgKFBUUikgbmV3X2FyZWxkYXRhKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgQkZEIHdoaWNoIGlzIHJlZmVyZW5jZWQgYnkgdGhlIHN5bWJvbCBpbiBBQkZEIGluZGV4ZWQgYnkKLSAgIElOREVYLiAgSU5ERVggc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSBiZmRfZ2V0X25leHRfbWFwZW50LiAgKi8KLQotYmZkICoKLV9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSAgY2Fyc3ltICplbnRyeTsKLQotICBlbnRyeSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzICsgaW5kZXg7Ci0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYWJmZCwgZW50cnktPmZpbGVfb2Zmc2V0KTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotCi1TWU5PUFNJUwotCWJmZCAqYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShiZmQgKmFyY2hpdmUsIGJmZCAqcHJldmlvdXMpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVkIGEgQkZELCBAdmFye2FyY2hpdmV9LCBjb250YWluaW5nIGFuIGFyY2hpdmUgYW5kIE5VTEwsIG9wZW4KLQlhbiBpbnB1dCBCRkQgb24gdGhlIGZpcnN0IGNvbnRhaW5lZCBlbGVtZW50IGFuZCByZXR1cm5zIHRoYXQuCi0JU3Vic2VxdWVudCBjYWxscyBzaG91bGQgcGFzcwotCXRoZSBhcmNoaXZlIGFuZCB0aGUgcHJldmlvdXMgcmV0dXJuIHZhbHVlIHRvIHJldHVybiBhIGNyZWF0ZWQKLQlCRkQgdG8gdGhlIG5leHQgY29udGFpbmVkIGVsZW1lbnQuIE5VTEwgaXMgcmV0dXJuZWQgd2hlbiB0aGVyZQotCWFyZSBubyBtb3JlLgotCi0qLwotCi1iZmQgKgotYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBpZiAoKGJmZF9nZXRfZm9ybWF0IChhcmNoaXZlKSAhPSBiZmRfYXJjaGl2ZSkgfHwKLSAgICAgIChhcmNoaXZlLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBCRkRfU0VORCAoYXJjaGl2ZSwKLQkJICAgb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlLAotCQkgICAoYXJjaGl2ZSwKLQkJICAgIGxhc3RfZmlsZSkpOwotfQotCi1iZmQgKgotYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGZpbGVfcHRyIGZpbGVzdGFydDsKLQotICBpZiAoIWxhc3RfZmlsZSkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBhcmVsdF9zaXplIChsYXN0X2ZpbGUpOwotICAgICAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuLi4KLQkgTm90ZSB0aGF0IGxhc3RfZmlsZS0+b3JpZ2luIGNhbiBiZSBvZGQgaW4gdGhlIGNhc2Ugb2YKLQkgQlNELTQuNC1zdHlsZSBlbGVtZW50IHdpdGggYSBsb25nIG9kZCBzaXplLiAqLwotICAgICAgZmlsZXN0YXJ0ID0gbGFzdF9maWxlLT5vcmlnaW4gKyBzaXplOwotICAgICAgZmlsZXN0YXJ0ICs9IGZpbGVzdGFydCAlIDI7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXN0YXJ0KTsKLX0KLQotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9nZW5lcmljX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqdGRhdGFfaG9sZDsKLSAgY2hhciBhcm1hZ1tTQVJNQUcgKyAxXTsKLQotICB0ZGF0YV9ob2xkID0gYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgYXJtYWcsIDEsIFNBUk1BRywgYWJmZCkgIT0gU0FSTUFHKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotI2lmZGVmIEdOVTk2MAotICBpZiAoc3RybmNtcCAoYXJtYWcsIEJGRF9HTlU5NjBfQVJNQUcgKGFiZmQpLCBTQVJNQUcpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0jZWxzZQotICBpZiAoc3RybmNtcCAoYXJtYWcsIEFSTUFHLCBTQVJNQUcpICE9IDAgJiYKLSAgICAgIHN0cm5jbXAgKGFybWFnLCBBUk1BR0IsIFNBUk1BRykgIT0gMCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIFdlIGFyZSBzZXR0aW5nIGJmZF9hcmRhdGEoYWJmZCkgaGVyZSwgYnV0IHNpbmNlIGJmZF9hcmRhdGEKLSAgICAgaW52b2x2ZXMgYSBjYXN0LCB3ZSBjYW4ndCBkbyBpdCBhcyB0aGUgbGVmdCBvcGVyYW5kIG9mIGFzc2lnbm1lbnQuICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9ICgoc3RydWN0IGFydGRhdGEgKikKLQkJCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKSk7Ci0KLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IFNBUk1BRzsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmNhY2hlID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmFyY2hpdmVfaGVhZCA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnRkYXRhID0gTlVMTDsKLQotICBpZiAoIUJGRF9TRU5EIChhYmZkLCBfYmZkX3NsdXJwX2FybWFwLCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmICghQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSwgKGFiZmQpKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYmZkX2FyZGF0YSAoYWJmZCkpOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZCAqZmlyc3Q7Ci0KLSAgICAgIC8qIFRoaXMgYXJjaGl2ZSBoYXMgYSBtYXAsIHNvIHdlIG1heSBwcmVzdW1lIHRoYXQgdGhlIGNvbnRlbnRzCi0JIGFyZSBvYmplY3QgZmlsZXMuICBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQkgYXJjaGl2ZSBjYW4gYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QgZmlsZSwgaXQgaXMgZm9yIHRoaXMKLQkgdGFyZ2V0LiAgSWYgbm90LCBhc3N1bWUgdGhhdCB0aGlzIGlzIHRoZSB3cm9uZyBmb3JtYXQuICBJZgotCSB0aGUgZmlyc3QgZmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGUsIHNvbWVib2R5IGlzIGRvaW5nCi0JIHNvbWV0aGluZyB3ZWlyZCwgYW5kIHdlIHBlcm1pdCBpdCBzbyB0aGF0IGFyIC10IHdpbGwgd29yay4KLQotCSBUaGlzIGlzIGRvbmUgYmVjYXVzZSBhbnkgbm9ybWFsIGZvcm1hdCB3aWxsIHJlY29nbml6ZSBhbnkKLQkgbm9ybWFsIGFyY2hpdmUsIHJlZ2FyZGxlc3Mgb2YgdGhlIGZvcm1hdCBvZiB0aGUgb2JqZWN0IGZpbGVzLgotCSBXZSBkbyBhY2NlcHQgYW4gZW1wdHkgYXJjaGl2ZS4gICovCi0KLSAgICAgIGZpcnN0ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gZmFpbDsKLQotCSAgZmlyc3QtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQkgIGZhaWwgPSBmYWxzZTsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaXJzdCwgYmZkX29iamVjdCkKLQkgICAgICAmJiBmaXJzdC0+eHZlYyAhPSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoZmlyc3QpOwotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0JICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JICAvKiBXZSBvdWdodCB0byBjbG9zZSBmaXJzdCBoZXJlLCBidXQgd2UgY2FuJ3QsIGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICBoYXZlIG5vIHdheSB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJjaGl2ZSBjYWNoZS4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBTb21lIGNvbnN0YW50cyBmb3IgYSAzMiBiaXQgQlNEIGFyY2hpdmUgc3RydWN0dXJlLiAgV2UgZG8gbm90Ci0gICBzdXBwb3J0IDY0IGJpdCBhcmNoaXZlcyBwcmVzZW50bHk7IHNvIGZhciBhcyBJIGtub3csIG5vbmUgYWN0dWFsbHkKLSAgIGV4aXN0LiAgU3VwcG9ydGluZyB0aGVtIHdvdWxkIHJlcXVpcmUgY2hhbmdpbmcgdGhlc2UgY29uc3RhbnRzLCBhbmQKLSAgIGNoYW5naW5nIHNvbWUgYmZkX2hfZ2V0XzMyIHRvIGJmZF9oX2dldF82NC4gICovCi0KLS8qIFRoZSBzaXplIG9mIGFuIGV4dGVybmFsIHN5bWRlZiBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX1NJWkUgOAotCi0vKiBUaGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIGEgc3ltZGVmIHN0cnVjdHVyZSB0byB0aGUgZmlsZSBvZmZzZXQuICAqLwotI2RlZmluZSBCU0RfU1lNREVGX09GRlNFVF9TSVpFIDQKLQotLyogVGhlIHNpemUgb2YgdGhlIHN5bWRlZiBjb3VudC4gICovCi0jZGVmaW5lIEJTRF9TWU1ERUZfQ09VTlRfU0laRSA0Ci0KLS8qIFRoZSBzaXplIG9mIHRoZSBzdHJpbmcgY291bnQuICAqLwotI2RlZmluZSBCU0RfU1RSSU5HX0NPVU5UX1NJWkUgNAotCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotCi1zdGF0aWMgYm9vbGVhbgotZG9fc2x1cnBfYnNkX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBiZmRfYnl0ZSAqcmF3X2FybWFwLCAqcmJhc2U7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciAqc3RyaW5nYmFzZTsKLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOwotICBjYXJzeW0gKnNldDsKLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBwYXJzZWRfc2l6ZSA9IG1hcGRhdGEtPnBhcnNlZF9zaXplOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgbWFwZGF0YSk7CS8qIERvbid0IG5lZWQgaXQgYW55IG1vcmUuICovCi0KLSAgcmF3X2FybWFwID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MgKGFiZmQsIHBhcnNlZF9zaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHBhcnNlZF9zaXplLCBhYmZkKSAhPSBwYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICBieWVieWU6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYXJkYXRhLT5zeW1kZWZfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJhd19hcm1hcCkgLyBCU0RfU1lNREVGX1NJWkU7Ci0KLSAgaWYgKGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFID4KLSAgICAgIHBhcnNlZF9zaXplIC0gQlNEX1NZTURFRl9DT1VOVF9TSVpFKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHdlJ3JlIHVzaW5nIHRoZSB3cm9uZyBieXRlIG9yZGVyaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgZ290byBieWVieWU7Ci0gICAgfQotCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotICByYmFzZSA9IHJhd19hcm1hcCArIEJTRF9TWU1ERUZfQ09VTlRfU0laRTsKLSAgc3RyaW5nYmFzZSA9ICgoY2hhciAqKSByYmFzZQotCQkrIGFyZGF0YS0+c3ltZGVmX2NvdW50ICogQlNEX1NZTURFRl9TSVpFCi0JCSsgQlNEX1NUUklOR19DT1VOVF9TSVpFKTsKLSAgYXJkYXRhLT5zeW1kZWZzID0gKGNhcnN5bSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgKGFyZGF0YS0+c3ltZGVmX2NvdW50Ci0JCQkJCSAgICogc2l6ZW9mIChjYXJzeW0pKSk7Ci0gIGlmICghYXJkYXRhLT5zeW1kZWZzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvdW50ZXIgPSAwLCBzZXQgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gICAgICAgY291bnRlciA8IGFyZGF0YS0+c3ltZGVmX2NvdW50OwotICAgICAgIGNvdW50ZXIrKywgc2V0KyssIHJiYXNlICs9IEJTRF9TWU1ERUZfU0laRSkKLSAgICB7Ci0gICAgICBzZXQtPm5hbWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlKSArIHN0cmluZ2Jhc2U7Ci0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYmFzZSArIEJTRF9TWU1ERUZfT0ZGU0VUX1NJWkUpOwotICAgIH0KLQotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0gIC8qIEZJWE1FLCB3ZSBzaG91bGQgcHJvdmlkZSBzb21lIHdheSB0byBmcmVlIHJhd19hcmRhdGEgd2hlbgotICAgICB3ZSBhcmUgZG9uZSB1c2luZyB0aGUgc3RyaW5ncyBmcm9tIGl0LiAgRm9yIG5vdywgaXQgc2VlbXMKLSAgICAgdG8gYmUgYWxsb2NhdGVkIG9uIGFuIG9iamFsbG9jIGFueXdheS4uLiAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UgKi8KLXN0YXRpYyBib29sZWFuCi1kb19zbHVycF9jb2ZmX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKm1hcGRhdGE7Ci0gIGludCAqcmF3X2FybWFwLCAqcmF3cHRyOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIGNhcnN5bSAqY2Fyc3ltczsKLSAgdW5zaWduZWQgaW50IG5zeW16OwkJLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYXJtYXAuICovCi0gIGJmZF92bWEgKCpzd2FwKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGNoYXIgaW50X2J1ZltzaXplb2YgKGxvbmcpXTsKLSAgdW5zaWduZWQgaW50IGNhcnN5bV9zaXplLCBwdHJzaXplLCBpOwotCi0gIG1hcGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBfYmZkX3JlYWRfYXJfaGRyIChhYmZkKTsKLSAgaWYgKG1hcGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHBhcnNlZF9zaXplID0gbWFwZGF0YS0+cGFyc2VkX3NpemU7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSBtYXBkYXRhKTsJLyogRG9uJ3QgbmVlZCBpdCBhbnkgbW9yZS4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIGludF9idWYsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBJdCBzZWVtcyB0aGF0IGFsbCBudW1lcmljIGluZm9ybWF0aW9uIGluIGEgY29mZiBhcmNoaXZlIGlzIGFsd2F5cwotICAgICBpbiBiaWcgZW5kaWFuIGZvcm1hdCwgbm9tYXR0ZXIgdGhlIGhvc3Qgb3IgdGFyZ2V0LiAqLwotICBzd2FwID0gYmZkX2dldGIzMjsKLSAgbnN5bXogPSBiZmRfZ2V0YjMyICgoUFRSKSBpbnRfYnVmKTsKLSAgc3RyaW5nc2l6ZSA9IHBhcnNlZF9zaXplIC0gKDQgKiBuc3lteikgLSA0OwotCi0jaWYgMQotICAvKiAuLi4gZXhjZXB0IHRoYXQgc29tZSBhcmNoaXZlIGZvcm1hdHMgYXJlIGJyb2tlbiwgYW5kIGl0IG1heSBiZSBvdXIKLSAgICAgZmF1bHQgLSB0aGUgaTk2MCBsaXR0bGUgZW5kaWFuIGNvZmYgc29tZXRpbWVzIGhhcyBiaWcgYW5kIHNvbWV0aW1lcwotICAgICBsaXR0bGUsIGJlY2F1c2Ugb3VyIHRvb2xzIGNoYW5nZWQuICBIZXJlJ3MgYSBob3JyaWJsZSBoYWNrIHRvIGNsZWFuCi0gICAgIHVwIHRoZSBjcmFwLiAgKi8KLQotICBpZiAoc3RyaW5nc2l6ZSA+IDB4ZmZmZmYKLSAgICAgICYmIGJmZF9nZXRfYXJjaCAoYWJmZCkgPT0gYmZkX2FyY2hfaTk2MAotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICB7Ci0gICAgICAvKiBUaGlzIGxvb2tzIGRhbmdlcm91cywgbGV0J3MgZG8gaXQgdGhlIG90aGVyIHdheSBhcm91bmQgKi8KLSAgICAgIG5zeW16ID0gYmZkX2dldGwzMiAoKFBUUikgaW50X2J1Zik7Ci0gICAgICBzdHJpbmdzaXplID0gcGFyc2VkX3NpemUgLSAoNCAqIG5zeW16KSAtIDQ7Ci0gICAgICBzd2FwID0gYmZkX2dldGwzMjsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBUaGUgY29mZiBhcm1hcCBtdXN0IGJlIHJlYWQgc2VxdWVudGlhbGx5LiAgU28gd2UgY29uc3RydWN0IGEKLSAgICAgYnNkLXN0eWxlIG9uZSBpbiBjb3JlIGFsbCBhdCBvbmNlLCBmb3Igc2ltcGxpY2l0eS4gKi8KLQotICBjYXJzeW1fc2l6ZSA9IChuc3lteiAqIHNpemVvZiAoY2Fyc3ltKSk7Ci0gIHB0cnNpemUgPSAoNCAqIG5zeW16KTsKLQotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF96YWxsb2MgKGFiZmQsIGNhcnN5bV9zaXplICsgc3RyaW5nc2l6ZSArIDEpOwotICBpZiAoYXJkYXRhLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjYXJzeW1zID0gYXJkYXRhLT5zeW1kZWZzOwotICBzdHJpbmdiYXNlID0gKChjaGFyICopIGFyZGF0YS0+c3ltZGVmcykgKyBjYXJzeW1fc2l6ZTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgcmVhZCBpbiB0aGUgcmF3IG9mZnNldHMuICovCi0gIHJhd19hcm1hcCA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBwdHJzaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSBOVUxMKQotICAgIGdvdG8gcmVsZWFzZV9zeW1kZWZzOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgcHRyc2l6ZSwgYWJmZCkgIT0gcHRyc2l6ZQotICAgICAgfHwgYmZkX3JlYWQgKChQVFIpIHN0cmluZ2Jhc2UsIDEsIHN0cmluZ3NpemUsIGFiZmQpICE9IHN0cmluZ3NpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICBnb3RvIHJlbGVhc2VfcmF3X2FybWFwOwotICAgIH0KLQotICAvKiBPSywgYnVpbGQgdGhlIGNhcnN5bXMgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5zeW16OyBpKyspCi0gICAgewotICAgICAgcmF3cHRyID0gcmF3X2FybWFwICsgaTsKLSAgICAgIGNhcnN5bXMtPmZpbGVfb2Zmc2V0ID0gc3dhcCAoKFBUUikgcmF3cHRyKTsKLSAgICAgIGNhcnN5bXMtPm5hbWUgPSBzdHJpbmdiYXNlOwotICAgICAgc3RyaW5nYmFzZSArPSBzdHJsZW4gKHN0cmluZ2Jhc2UpICsgMTsKLSAgICAgIGNhcnN5bXMrKzsKLSAgICB9Ci0gICpzdHJpbmdiYXNlID0gMDsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IG5zeW16OwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MgKz0gKGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zKSAlIDI7Ci0KLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotCi0gIC8qIENoZWNrIGZvciBhIHNlY29uZCBhcmNoaXZlIGhlYWRlciAoYXMgdXNlZCBieSBQRSkgKi8KLSAgewotICAgIHN0cnVjdCBhcmVsdGRhdGEgKnRtcDsKLQotICAgIGJmZF9zZWVrIChhYmZkLCAgIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCk7Ci0gICAgdG1wID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gICAgaWYgKHRtcCAhPSBOVUxMKSAKLSAgICAgIHsKLQlpZiAodG1wLT5hcmNoX2hlYWRlclswXSA9PSAnLycKLQkgICAgJiYgdG1wLT5hcmNoX2hlYWRlclsxXSA9PSAnICcpIAotCSAgewotCSAgICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPQotCSAgICAgICh0bXAtPnBhcnNlZF9zaXplICsgc2l6ZW9mKHN0cnVjdCBhcl9oZHIpICsgMSkgJiB+MTsKLQkgIH0KLQliZmRfcmVsZWFzZSAoYWJmZCwgdG1wKTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotCi1yZWxlYXNlX3Jhd19hcm1hcDoKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIHJhd19hcm1hcCk7Ci1yZWxlYXNlX3N5bWRlZnM6Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSAoYXJkYXRhKS0+c3ltZGVmcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyByb3V0aW5lIGNhbiBoYW5kbGUgZWl0aGVyIGNvZmYtc3R5bGUgb3IgYnNkLXN0eWxlIGFybWFwcy4KLSAgIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi0KLWJvb2xlYW4KLWJmZF9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgaW50IGkgPSBiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKTsKLQotICBpZiAoaSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoaSAhPSAxNikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0gMTYsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGICAgICAgICIsIDE2KQotICAgICAgfHwgIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGLyAgICAgICIsIDE2KSkgLyogb2xkIExpbnV4IGFyY2hpdmVzICovCi0gICAgcmV0dXJuIGRvX3NsdXJwX2JzZF9hcm1hcCAoYWJmZCk7Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikpCi0gICAgcmV0dXJuIGRvX3NsdXJwX2NvZmZfYXJtYXAgKGFiZmQpOwotICBlbHNlIGlmICghc3RybmNtcCAobmV4dG5hbWUsICIvU1lNNjQvICAgICAgICAgIiwgMTYpKQotICAgIHsKLSAgICAgIC8qIElyaXggNiBhcmNoaXZlLS1tdXN0IGJlIHJlY29nbml6ZWQgYnkgY29kZSBpbiBlbGY2NC1taXBzLmMuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJldHVybnMgZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlICovCi0vKiBmbGF2b3IgMiBvZiBhIGJzZCBhcm1hcCwgc2ltaWxhciB0byBiZmRfc2x1cnBfYnNkX2FybWFwIGV4Y2VwdCB0aGUKLSAgIGhlYWRlciBpcyBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCBvcmRlciBhbmQgdGhlIG1hcCBuYW1lIGlzICcvJy4KLSAgIFRoaXMgZmxhdm91ciBpcyB1c2VkIGJ5IGhwMzAwaHB1eC4gKi8KLQotI2RlZmluZSBIUFVYX1NZTURFRl9DT1VOVF9TSVpFIDIKLQotYm9vbGVhbgotYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICptYXBkYXRhOwotICBjaGFyIG5leHRuYW1lWzE3XTsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGJmZF9ieXRlICpyYXdfYXJtYXAsICpyYmFzZTsKLSAgc3RydWN0IGFydGRhdGEgKmFyZGF0YSA9IGJmZF9hcmRhdGEgKGFiZmQpOwotICBjaGFyICpzdHJpbmdiYXNlOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZTsKLSAgY2Fyc3ltICpzZXQ7Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBhcmNoaXZlIGhhcyBhdCBsZWFzdCAxNiBieXRlcyBpbiBpdCAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIC0xNkwsIFNFRUtfQ1VSKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGICAgICAgICIsIDE2KQotICAgICAgfHwgIXN0cm5jbXAgKG5leHRuYW1lLCAiX18uU1lNREVGLyAgICAgICIsIDE2KSkgLyogb2xkIExpbnV4IGFyY2hpdmVzICovCi0gICAgcmV0dXJuIGRvX3NsdXJwX2JzZF9hcm1hcCAoYWJmZCk7Ci0KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBtYXBkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gIGlmIChtYXBkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJhd19hcm1hcCA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBtYXBkYXRhLT5wYXJzZWRfc2l6ZSk7Ci0gIGlmIChyYXdfYXJtYXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgYnllYnllOgotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHJhd19hcm1hcCwgMSwgbWFwZGF0YS0+cGFyc2VkX3NpemUsIGFiZmQpICE9Ci0gICAgICBtYXBkYXRhLT5wYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICBieWVieWVieWU6Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLSAgICAgIGdvdG8gYnllYnllOwotICAgIH0KLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotICBpZiAoYXJkYXRhLT5zeW1kZWZfY291bnQgKiBCU0RfU1lNREVGX1NJWkUKLSAgICAgID4gbWFwZGF0YS0+cGFyc2VkX3NpemUgLSBIUFVYX1NZTURFRl9DT1VOVF9TSVpFKQotICAgIHsKLSAgICAgIC8qIFByb2JhYmx5IHdlJ3JlIHVzaW5nIHRoZSB3cm9uZyBieXRlIG9yZGVyaW5nLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgZ290byBieWVieWVieWU7Ci0gICAgfQotCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotCi0gIHN0cmluZ3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJhd19hcm1hcCArIEhQVVhfU1lNREVGX0NPVU5UX1NJWkUpOwotICAvKiBza2lwIHN5bSBjb3VudCBhbmQgc3RyaW5nIHN6ICovCi0gIHN0cmluZ2Jhc2UgPSAoKGNoYXIgKikgcmF3X2FybWFwCi0JCSsgSFBVWF9TWU1ERUZfQ09VTlRfU0laRQotCQkrIEJTRF9TVFJJTkdfQ09VTlRfU0laRSk7Ci0gIHJiYXNlID0gKGJmZF9ieXRlICopIHN0cmluZ2Jhc2UgKyBzdHJpbmdzaXplOwotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKLQkJCQkJICAgKiBCU0RfU1lNREVGX1NJWkUpKTsKLSAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnRlciA9IDAsIHNldCA9IGFyZGF0YS0+c3ltZGVmczsKLSAgICAgICBjb3VudGVyIDwgYXJkYXRhLT5zeW1kZWZfY291bnQ7Ci0gICAgICAgY291bnRlcisrLCBzZXQrKywgcmJhc2UgKz0gQlNEX1NZTURFRl9TSVpFKQotICAgIHsKLSAgICAgIHNldC0+bmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmJhc2UpICsgc3RyaW5nYmFzZTsKLSAgICAgIHNldC0+ZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJiYXNlICsgQlNEX1NZTURFRl9PRkZTRVRfU0laRSk7Ci0gICAgfQotCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeSBpZiB5b3UgaGF2ZSB0byAqLwotICBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyArPSAoYXJkYXRhLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLSAgLyogRklYTUUsIHdlIHNob3VsZCBwcm92aWRlIHNvbWUgd2F5IHRvIGZyZWUgcmF3X2FyZGF0YSB3aGVuCi0gICAgIHdlIGFyZSBkb25lIHVzaW5nIHRoZSBzdHJpbmdzIGZyb20gaXQuICBGb3Igbm93LCBpdCBzZWVtcwotICAgICB0byBiZSBhbGxvY2F0ZWQgb24gYW4gb2JqYWxsb2MgYW55d2F5Li4uICovCi0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIEV4dGVuZGVkIG5hbWUgdGFibGUuCi0KLSAgTm9ybWFsbHkgYXJjaGl2ZXMgc3VwcG9ydCBvbmx5IDE0LWNoYXJhY3RlciBmaWxlbmFtZXMuCi0KLSAgSW50ZWwgaGFzIGV4dGVuZGVkIHRoZSBmb3JtYXQ6IGxvbmdlciBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc3BlY2lhbAotICBlbGVtZW50ICh0aGUgZmlyc3QgaW4gdGhlIGFyY2hpdmUsIG9yIHNlY29uZCBpZiB0aGVyZSBpcyBhbiBhcm1hcCk7Ci0gIHRoZSBuYW1lIGluIHRoZSBhcl9oZHIgaXMgcmVwbGFjZWQgYnkgPHNwYWNlPjxpbmRleCBpbnRvIGZpbGVuYW1lCi0gIGVsZW1lbnQ+LiAgSW5kZXggaXMgdGhlIFAuUi4gb2YgYW4gaW50IChkZWNpbWFsKS4gIERhdGEgR2VuZXJhbCBoYXZlCi0gIGV4dGVuZGVkIHRoZSBmb3JtYXQgYnkgdXNpbmcgdGhlIHByZWZpeCAvLyBmb3IgdGhlIHNwZWNpYWwgZWxlbWVudCAqLwotCi0vKiBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLCB0cnVlIG90aGVyd2lzZSAqLwotYm9vbGVhbgotX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICBzdHJ1Y3QgYXJlbHRkYXRhICpuYW1lZGF0YTsKLQotICAvKiBGSVhNRTogIEZvcm1hdHRpbmcgc3Vja3MgaGVyZSwgYW5kIGluIGNhc2Ugb2YgZmFpbHVyZSBvZiBCRkRfUkVBRCwKLSAgICAgd2UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byByZXR1cm4gdHJ1ZS4gICovCi0gIGJmZF9zZWVrIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKSA9PSAxNikKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICJBUkZJTEVOQU1FUy8gICAgIiwgMTYpICE9IDAgJiYKLQkgIHN0cm5jbXAgKG5leHRuYW1lLCAiLy8gICAgICAgICAgICAgICIsIDE2KSAhPSAwKQotCXsKLQkgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG5hbWVkYXRhID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9yZWFkX2FyX2hkciAoYWJmZCk7Ci0gICAgICBpZiAobmFtZWRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9Ci0JYmZkX3phbGxvYyAoYWJmZCwgbmFtZWRhdGEtPnBhcnNlZF9zaXplKTsKLSAgICAgIGlmIChiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPT0gTlVMTCkKLQl7Ci0JYnllYnllOgotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG5hbWVkYXRhKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgYmZkX2FyZGF0YSAoYWJmZCktPmV4dGVuZGVkX25hbWVzLCAxLAotCQkgICAgbmFtZWRhdGEtPnBhcnNlZF9zaXplLCBhYmZkKSAhPSBuYW1lZGF0YS0+cGFyc2VkX3NpemUpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotCSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIChiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMpKTsKLQkgIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0JICBnb3RvIGJ5ZWJ5ZTsKLQl9Ci0KLSAgICAgIC8qIFNpbmNlIHRoZSBhcmNoaXZlIGlzIHN1cHBvc2VkIHRvIGJlIHByaW50YWJsZSBpZiBpdCBjb250YWlucwotCSB0ZXh0LCB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBhcmUgbmV3bGluZS1wYWRkZWQsIG5vdCBudWxsCi0JIHBhZGRlZC4gSW4gU1ZSNC1zdHlsZSBhcmNoaXZlcywgdGhlIG5hbWVzIGFsc28gaGF2ZSBhCi0JIHRyYWlsaW5nICcvJy4gIERPUy9OVCBjcmVhdGVkIGFyY2hpdmUgb2Z0ZW4gaGF2ZSBcIGluIHRoZW0KLQkgV2UnbGwgZml4IGFsbCBwcm9ibGVtcyBoZXJlLi4gICovCi0gICAgICB7Ci0JY2hhciAqdGVtcCA9IGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lczsKLQljaGFyICpsaW1pdCA9IHRlbXAgKyBuYW1lZGF0YS0+cGFyc2VkX3NpemU7Ci0JZm9yICg7IHRlbXAgPCBsaW1pdDsgKyt0ZW1wKSB7Ci0JICBpZiAoKnRlbXAgPT0gJ1wwMTInKQotCSAgICB0ZW1wW3RlbXBbLTFdID09ICcvJyA/IC0xIDogMF0gPSAnXDAnOwotCSAgaWYgKCp0ZW1wID09ICdcXCcpCi0JICAgICp0ZW1wID0gJy8nOwotCX0KLSAgICAgIH0KLQotICAgICAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkgaWYgeW91IGhhdmUgdG8gKi8KLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gICAgICBiZmRfYXJkYXRhIChhYmZkKS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9Ci0JKGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MpICUgMjsKLQotICAgICAgLyogRklYTUUsIHdlIGNhbid0IHJlbGVhc2UgbmFtZWRhdGEgaGVyZSBiZWNhdXNlIGl0IHdhcyBhbGxvY2F0ZWQKLQkgYmVsb3cgZXh0ZW5kZWRfbmFtZXMgb24gdGhlIG9iamFsbG9jLi4uICovCi0gICAgICAvKiBiZmRfcmVsZWFzZSAoYWJmZCwgbmFtZWRhdGEpOyAqLwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBWTVMKLQotLyogUmV0dXJuIGEgY29weSBvZiB0aGUgc3R1ZmYgaW4gdGhlIGZpbGVuYW1lIGJldHdlZW4gYW55IDpdPiBhbmQgYQotICAgc2VtaWNvbG9uICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgKGFiZmQsIGZpbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgQ09OU1QgY2hhciAqZmlyc3Q7Ci0gIENPTlNUIGNoYXIgKmxhc3Q7Ci0gIGNoYXIgKmNvcHk7Ci0KLSAgZmlyc3QgPSBmaWxlICsgc3RybGVuIChmaWxlKSAtIDE7Ci0gIGxhc3QgPSBmaXJzdCArIDE7Ci0KLSAgd2hpbGUgKGZpcnN0ICE9IGZpbGUpCi0gICAgewotICAgICAgaWYgKCpmaXJzdCA9PSAnOycpCi0JbGFzdCA9IGZpcnN0OwotICAgICAgaWYgKCpmaXJzdCA9PSAnOicgfHwgKmZpcnN0ID09ICddJyB8fCAqZmlyc3QgPT0gJz4nKQotCXsKLQkgIGZpcnN0Kys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBmaXJzdC0tOwotICAgIH0KLQotICBjb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBsYXN0IC0gZmlyc3QgKyAxKTsKLSAgaWYgKGNvcHkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtZW1jcHkgKGNvcHksIGZpcnN0LCBsYXN0IC0gZmlyc3QpOwotICBjb3B5W2xhc3QgLSBmaXJzdF0gPSAwOwotCi0gIHJldHVybiBjb3B5OwotfQotCi0jZWxzZQotc3RhdGljIGNvbnN0IGNoYXIgKgotbm9ybWFsaXplIChhYmZkLCBmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gc3RycmNociAoZmlsZSwgJy8nKTsKLQotICBpZiAoZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBmaWxlbmFtZSsrOwotICBlbHNlCi0gICAgZmlsZW5hbWUgPSBmaWxlOwotICByZXR1cm4gZmlsZW5hbWU7Ci19Ci0jZW5kaWYKLQotLyogQnVpbGQgYSBCRkQgc3R5bGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQsIHRhYmxvYywgdGFibGVuLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKip0YWJsb2M7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRhYmxlbjsKLSAgICAgY29uc3QgY2hhciAqKm5hbWU7Ci17Ci0gICpuYW1lID0gIkFSRklMRU5BTUVTLyI7Ci0gIHJldHVybiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIChhYmZkLCBmYWxzZSwgdGFibG9jLCB0YWJsZW4pOwotfQotCi0vKiBCdWlsZCBhbiBTVlI0IHN0eWxlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotICAgICBjb25zdCBjaGFyICoqbmFtZTsKLXsKLSAgKm5hbWUgPSAiLy8iOwotICByZXR1cm4gX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdHJ1ZSwgdGFibG9jLCB0YWJsZW4pOwotfQotCi0vKiBGb2xsb3dzIGFyY2hpdmVfaGVhZCBhbmQgcHJvZHVjZXMgYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZSBpZgotICAgbmVjZXNzYXJ5LiAgUmV0dXJucyAoaW4gdGFibG9jKSBhIHBvaW50ZXIgdG8gYW4gZXh0ZW5kZWQgbmFtZQotICAgdGFibGUsIGFuZCBpbiB0YWJsZW4gdGhlIGxlbmd0aCBvZiB0aGUgdGFibGUuICBJZiBpdCBtYWtlcyBhbiBlbnRyeQotICAgaXQgY2xvYmJlcnMgdGhlIGZpbGVuYW1lIHNvIHRoYXQgdGhlIGVsZW1lbnQgbWF5IGJlIHdyaXR0ZW4gd2l0aG91dAotICAgZnVydGhlciBtYXNzYWdlLiAgUmV0dXJucyB0cnVlIGlmIGl0IHJhbiBzdWNjZXNzZnVsbHksIGZhbHNlIGlmCi0gICBzb21ldGhpbmcgd2VudCB3cm9uZy4gIEEgc3VjY2Vzc2Z1bCByZXR1cm4gbWF5IHN0aWxsIGludm9sdmUgYQotICAgemVyby1sZW5ndGggdGFibGVuISAgKi8KLQotYm9vbGVhbgotX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdHJhaWxpbmdfc2xhc2gsIHRhYmxvYywgdGFibGVuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gdHJhaWxpbmdfc2xhc2g7Ci0gICAgIGNoYXIgKip0YWJsb2M7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnRhYmxlbjsKLXsKLSAgdW5zaWduZWQgaW50IG1heG5hbWUgPSBhYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbjsKLSAgdW5zaWduZWQgaW50IHRvdGFsX25hbWVsZW4gPSAwOwotICBiZmQgKmN1cnJlbnQ7Ci0gIGNoYXIgKnN0cnB0cjsKLQotICAqdGFibGVuID0gMDsKLQotICAvKiBGaWd1cmUgb3V0IGhvdyBsb25nIHRoZSB0YWJsZSBzaG91bGQgYmUgKi8KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5vcm1hbDsKLSAgICAgIHVuc2lnbmVkIGludCB0aGlzbGVuOwotCi0gICAgICBub3JtYWwgPSBub3JtYWxpemUgKGN1cnJlbnQsIGN1cnJlbnQtPmZpbGVuYW1lKTsKLSAgICAgIGlmIChub3JtYWwgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHRoaXNsZW4gPSBzdHJsZW4gKG5vcm1hbCk7Ci0KLSAgICAgIGlmICh0aGlzbGVuID4gbWF4bmFtZQotCSAgJiYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotCXRoaXNsZW4gPSBtYXhuYW1lOwotCi0gICAgICBpZiAodGhpc2xlbiA+IG1heG5hbWUpCi0JewotCSAgLyogQWRkIG9uZSB0byBsZWF2ZSByb29tIGZvciBcbi4gICovCi0JICB0b3RhbF9uYW1lbGVuICs9IHRoaXNsZW4gKyAxOwotCSAgaWYgKHRyYWlsaW5nX3NsYXNoKQotCSAgICB7Ci0JICAgICAgLyogTGVhdmUgcm9vbSBmb3IgdHJhaWxpbmcgc2xhc2guICAqLwotCSAgICAgICsrdG90YWxfbmFtZWxlbjsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBhcmNoX2hkciAoY3VycmVudCk7Ci0JICBpZiAoc3RybmNtcCAobm9ybWFsLCBoZHItPmFyX25hbWUsIHRoaXNsZW4pICE9IDAKLQkgICAgICB8fCAodGhpc2xlbiA8IHNpemVvZiBoZHItPmFyX25hbWUKLQkJICAmJiBoZHItPmFyX25hbWVbdGhpc2xlbl0gIT0gYXJfcGFkY2hhciAoY3VycmVudCkpKQotCSAgICB7Ci0JICAgICAgLyogTXVzdCBoYXZlIGJlZW4gdXNpbmcgZXh0ZW5kZWQgZm9ybWF0IGV2ZW4gdGhvdWdoIGl0Ci0JICAgICAgICAgZGlkbid0IG5lZWQgdG8uICBGaXggaXQgdG8gdXNlIG5vcm1hbCBmb3JtYXQuICAqLwotCSAgICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBub3JtYWwsIHRoaXNsZW4pOwotCSAgICAgIGlmICh0aGlzbGVuIDwgbWF4bmFtZQotCQkgIHx8ICh0aGlzbGVuID09IG1heG5hbWUgJiYgdGhpc2xlbiA8IHNpemVvZiBoZHItPmFyX25hbWUpKQotCQloZHItPmFyX25hbWVbdGhpc2xlbl0gPSBhcl9wYWRjaGFyIChjdXJyZW50KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKHRvdGFsX25hbWVsZW4gPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAqdGFibG9jID0gYmZkX3phbGxvYyAoYWJmZCwgdG90YWxfbmFtZWxlbik7Ci0gIGlmICgqdGFibG9jID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICp0YWJsZW4gPSB0b3RhbF9uYW1lbGVuOwotICBzdHJwdHIgPSAqdGFibG9jOwotCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0KLSAgICAgICBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5vcm1hbDsKLSAgICAgIHVuc2lnbmVkIGludCB0aGlzbGVuOwotCi0gICAgICBub3JtYWwgPSBub3JtYWxpemUgKGN1cnJlbnQsIGN1cnJlbnQtPmZpbGVuYW1lKTsKLSAgICAgIGlmIChub3JtYWwgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHRoaXNsZW4gPSBzdHJsZW4gKG5vcm1hbCk7Ci0gICAgICBpZiAodGhpc2xlbiA+IG1heG5hbWUpCi0JewotCSAgLyogV29ya3MgZm9yIG5vdzsgbWF5IG5lZWQgdG8gYmUgcmUtZW5naW5lZXJlZCBpZiB3ZQotCSAgICAgZW5jb3VudGVyIGFuIG9kZGJhbGwgYXJjaGl2ZSBmb3JtYXQgYW5kIHdhbnQgdG8KLQkgICAgIGdlbmVyYWxpc2UgdGhpcyBoYWNrLiAqLwotCSAgc3RydWN0IGFyX2hkciAqaGRyID0gYXJjaF9oZHIgKGN1cnJlbnQpOwotCSAgc3RyY3B5IChzdHJwdHIsIG5vcm1hbCk7Ci0JICBpZiAoISB0cmFpbGluZ19zbGFzaCkKLQkgICAgc3RycHRyW3RoaXNsZW5dID0gJ1wwMTInOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RycHRyW3RoaXNsZW5dID0gJy8nOwotCSAgICAgIHN0cnB0clt0aGlzbGVuICsgMV0gPSAnXDAxMic7Ci0JICAgIH0KLQkgIGhkci0+YXJfbmFtZVswXSA9IGFyX3BhZGNoYXIgKGN1cnJlbnQpOwotCSAgLyogV2Uga25vdyB0aGVyZSB3aWxsIGFsd2F5cyBiZSBlbm91Z2ggcm9vbSAob25lIG9mIHRoZSBmZXcKLQkgICAgIGNhc2VzIHdoZXJlIHlvdSBtYXkgc2FmZWx5IHVzZSBzcHJpbnRmKS4gKi8KLQkgIHNwcmludGYgKChoZHItPmFyX25hbWUpICsgMSwgIiUtZCIsICh1bnNpZ25lZCkgKHN0cnB0ciAtICp0YWJsb2MpKTsKLQkgIC8qIEtpbmRhIEtsdWRneS4gIFdlIHNob3VsZCBqdXN0IHVzZSB0aGUgcmV0dXJuZWQgdmFsdWUgb2YKLQkgICAgIHNwcmludGYgYnV0IG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIGdldCB0aGlzIHJpZ2h0ICovCi0JICB7Ci0JICAgIGNoYXIgKnRlbXAgPSBoZHItPmFyX25hbWUgKyAyOwotCSAgICBmb3IgKDsgdGVtcCA8IGhkci0+YXJfbmFtZSArIG1heG5hbWU7IHRlbXArKykKLQkgICAgICBpZiAoKnRlbXAgPT0gJ1wwJykKLQkJKnRlbXAgPSAnICc7Ci0JICB9Ci0JICBzdHJwdHIgKz0gdGhpc2xlbiArIDE7Ci0JICBpZiAodHJhaWxpbmdfc2xhc2gpCi0JICAgICsrc3RycHRyOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiogQSBjb3VwbGUgb2YgZnVuY3Rpb25zIGZvciBjcmVhdGluZyBhcl9oZHJzICovCi0KLSNpZm5kZWYgSEFWRV9HRVRVSUQKLSNkZWZpbmUgZ2V0dWlkKCkgMAotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9HRVRHSUQKLSNkZWZpbmUgZ2V0Z2lkKCkgMAotI2VuZGlmCi0KLS8qIFRha2VzIGEgZmlsZW5hbWUsIHJldHVybnMgYW4gYXJlbHRfZGF0YSBmb3IgaXQsIG9yIE5VTEwgaWYgaXQgY2FuJ3QKLSAgIG1ha2Ugb25lLiAgVGhlIGZpbGVuYW1lIG11c3QgcmVmZXIgdG8gYSBmaWxlbmFtZSBpbiB0aGUgZmlsZXN5c3RlbS4KLSAgIFRoZSBmaWxlbmFtZSBmaWVsZCBvZiB0aGUgYXJfaGRyIHdpbGwgTk9UIGJlIGluaXRpYWxpemVkLiAgSWYgbWVtYmVyCi0gICBpcyBzZXQsIGFuZCBpdCdzIGFuIGluLW1lbW9yeSBiZmQsIHdlIGZha2UgaXQuICovCi0KLXN0YXRpYyBzdHJ1Y3QgYXJlbHRkYXRhICoKLWJmZF9hcl9oZHJfZnJvbV9maWxlc3lzdGVtIChhYmZkLCBmaWxlbmFtZSwgbWVtYmVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBiZmQgKm1lbWJlcjsKLXsKLSAgc3RydWN0IHN0YXQgc3RhdHVzOwotICBzdHJ1Y3QgYXJlbHRkYXRhICphcmVkOwotICBzdHJ1Y3QgYXJfaGRyICpoZHI7Ci0gIGNoYXIgKnRlbXAsICp0ZW1wMTsKLQotICBpZiAobWVtYmVyICYmIChtZW1iZXItPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBBc3N1bWUgd2UganVzdCAibWFkZSIgdGhlIG1lbWJlciwgYW5kIGZha2UgaXQgKi8KLSAgICAgIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICpiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgbWVtYmVyLT5pb3N0cmVhbTsKLSAgICAgIHRpbWUoJnN0YXR1cy5zdF9tdGltZSk7Ci0gICAgICBzdGF0dXMuc3RfdWlkID0gZ2V0dWlkKCk7Ci0gICAgICBzdGF0dXMuc3RfZ2lkID0gZ2V0Z2lkKCk7Ci0gICAgICBzdGF0dXMuc3RfbW9kZSA9IDA2NDQ7Ci0gICAgICBzdGF0dXMuc3Rfc2l6ZSA9IGJpbS0+c2l6ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0YXQgKGZpbGVuYW1lLCAmc3RhdHVzKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYXJlZCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKwotCQkJCQkgIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOwotICBpZiAoYXJlZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBoZHIgPSAoc3RydWN0IGFyX2hkciAqKSAoKChjaGFyICopIGFyZWQpICsgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7Ci0KLSAgLyogYXIgaGVhZGVycyBhcmUgc3BhY2UgcGFkZGVkLCBub3QgbnVsbCBwYWRkZWQhICovCi0gIG1lbXNldCAoKFBUUikgaGRyLCAnICcsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotCi0gIHN0cm5jcHkgKGhkci0+YXJfZm1hZywgQVJGTUFHLCAyKTsKLQotICAvKiBHb2RkYW1uZWQgc3ByaW50ZiBkb2Vzbid0IHBlcm1pdCBNQVhJTVVNIGZpZWxkIGxlbmd0aHMgKi8KLSAgc3ByaW50ZiAoKGhkci0+YXJfZGF0ZSksICIlLTEybGQiLCAobG9uZykgc3RhdHVzLnN0X210aW1lKTsKLSAgc3ByaW50ZiAoKGhkci0+YXJfdWlkKSwgIiVsZCIsIChsb25nKSBzdGF0dXMuc3RfdWlkKTsKLSAgc3ByaW50ZiAoKGhkci0+YXJfZ2lkKSwgIiVsZCIsIChsb25nKSBzdGF0dXMuc3RfZ2lkKTsKLSAgc3ByaW50ZiAoKGhkci0+YXJfbW9kZSksICIlLThvIiwgKHVuc2lnbmVkIGludCkgc3RhdHVzLnN0X21vZGUpOwotICBzcHJpbnRmICgoaGRyLT5hcl9zaXplKSwgIiUtMTBsZCIsIChsb25nKSBzdGF0dXMuc3Rfc2l6ZSk7Ci0gIC8qIENvcnJlY3QgZm9yIGEgbG9zc2FnZSBpbiBzcHJpbnRmIHdoZXJlYnkgaXQgbnVsbC10ZXJtaW5hdGVzLiAgSSBjYW5ub3QKLSAgICAgdW5kZXJzdGFuZCBob3cgdGhlc2UgQyBsb3NlcnMgY291bGQgZGVzaWduIHN1Y2ggYSByYW1zaGFja2xlIGJ1bmNoIG9mCi0gICAgIElPIG9wZXJhdGlvbnMgKi8KLSAgdGVtcCA9IChjaGFyICopIGhkcjsKLSAgdGVtcDEgPSB0ZW1wICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSAtIDI7Ci0gIGZvciAoOyB0ZW1wIDwgdGVtcDE7IHRlbXArKykKLSAgICB7Ci0gICAgICBpZiAoKnRlbXAgPT0gJ1wwJykKLQkqdGVtcCA9ICcgJzsKLSAgICB9Ci0gIHN0cm5jcHkgKGhkci0+YXJfZm1hZywgQVJGTUFHLCAyKTsKLSAgYXJlZC0+cGFyc2VkX3NpemUgPSBzdGF0dXMuc3Rfc2l6ZTsKLSAgYXJlZC0+YXJjaF9oZWFkZXIgPSAoY2hhciAqKSBoZHI7Ci0KLSAgcmV0dXJuIGFyZWQ7Ci19Ci0KLS8qIFRoaXMgaXMgbWFnaWMgcmVxdWlyZWQgYnkgdGhlICJhciIgcHJvZ3JhbS4gIFNpbmNlIGl0J3MKLSAgICB1bmRvY3VtZW50ZWQsIGl0J3MgdW5kb2N1bWVudGVkLiAgWW91IG1heSB0aGluayB0aGF0IGl0IHdvdWxkIHRha2UKLSAgICBhIHN0cm9uZyBzdG9tYWNoIHRvIHdyaXRlIHRoaXMsIGFuZCBpdCBkb2VzLCBidXQgaXQgdGFrZXMgZXZlbiBhCi0gICAgc3Ryb25nZXIgc3RvbWFjaCB0byB0cnkgdG8gY29kZSBhcm91bmQgc3VjaCBhIHRoaW5nISAgKi8KLQotc3RydWN0IGFyX2hkciAqYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi1zdHJ1Y3QgYXJfaGRyICoKLWJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlIChhYmZkLCBmaWxlbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqYXJfZWx0ID0gYmZkX2FyX2hkcl9mcm9tX2ZpbGVzeXN0ZW0gKGFiZmQsIGZpbGVuYW1lLCAwKTsKLSAgaWYgKGFyX2VsdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gKHN0cnVjdCBhcl9oZHIgKikgYXJfZWx0LT5hcmNoX2hlYWRlcjsKLX0KLQotCi0vKiBBbmFsb2dvdXMgdG8gc3RhdCBjYWxsICovCi1pbnQKLWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBzdHJ1Y3QgYXJfaGRyICpoZHI7Ci0gIGNoYXIgKmFsb3NlcjsKLQotICBpZiAoYWJmZC0+YXJlbHRfZGF0YSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGhkciA9IGFyY2hfaGRyIChhYmZkKTsKLQotI2RlZmluZSBmb28oYXJlbHQsIHN0ZWx0LCBzaXplKSAgXAotICBidWYtPnN0ZWx0ID0gc3RydG9sIChoZHItPmFyZWx0LCAmYWxvc2VyLCBzaXplKTsgXAotICBpZiAoYWxvc2VyID09IGhkci0+YXJlbHQpIHJldHVybiAtMTsKLQotICBmb28gKGFyX2RhdGUsIHN0X210aW1lLCAxMCk7Ci0gIGZvbyAoYXJfdWlkLCBzdF91aWQsIDEwKTsKLSAgZm9vIChhcl9naWQsIHN0X2dpZCwgMTApOwotICBmb28gKGFyX21vZGUsIHN0X21vZGUsIDgpOwotCi0gIGJ1Zi0+c3Rfc2l6ZSA9IGFyY2hfZWx0ZGF0YSAoYWJmZCktPnBhcnNlZF9zaXplOwotCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1iZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpwYXRobmFtZTsKLSAgICAgY2hhciAqYXJoZHI7Ci17Ci0gIC8qIEZJWE1FOiBUaGlzIGludGVyYWN0cyB1bnBsZWFzYW50bHkgd2l0aCBhcidzIHF1aWNrLWFwcGVuZCBvcHRpb24uCi0gICAgIEZvcnR1bmF0ZWx5IGljOTYwIHVzZXJzIHdpbGwgbmV2ZXIgdXNlIHRoYXQgb3B0aW9uLiAgRml4aW5nIHRoaXMKLSAgICAgaXMgdmVyeSBoYXJkOyBmb3J0dW5hdGVseSBJIGtub3cgaG93IHRvIGRvIGl0IGFuZCB3aWxsIGRvIHNvIG9uY2UKLSAgICAgaW50ZWwncyByZWxlYXNlIGlzIG91dCB0aGUgZG9vci4gKi8KLQotICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSAoc3RydWN0IGFyX2hkciAqKSBhcmhkcjsKLSAgc2l6ZV90IGxlbmd0aDsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIHNpemVfdCBtYXhsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBCRkRfVFJBRElUSU9OQUxfRk9STUFUKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9ic2RfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBmaWxlbmFtZSA9IG5vcm1hbGl6ZSAoYWJmZCwgcGF0aG5hbWUpOwotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGxlbmd0aCA9IHN0cmxlbiAoZmlsZW5hbWUpOwotCi0gIGlmIChsZW5ndGggPD0gbWF4bGVuKQotICAgIG1lbWNweSAoaGRyLT5hcl9uYW1lLCBmaWxlbmFtZSwgbGVuZ3RoKTsKLQotICAvKiBBZGQgdGhlIHBhZGRpbmcgY2hhcmFjdGVyIGlmIHRoZXJlIGlzIHJvb20gZm9yIGl0LiAgKi8KLSAgaWYgKGxlbmd0aCA8IG1heGxlbgotICAgICAgfHwgKGxlbmd0aCA9PSBtYXhsZW4gJiYgbGVuZ3RoIDwgc2l6ZW9mIGhkci0+YXJfbmFtZSkpCi0gICAgKGhkci0+YXJfbmFtZSlbbGVuZ3RoXSA9IGFyX3BhZGNoYXIgKGFiZmQpOwotfQotCi12b2lkCi1iZmRfYnNkX3RydW5jYXRlX2FybmFtZSAoYWJmZCwgcGF0aG5hbWUsIGFyaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKnBhdGhuYW1lOwotICAgICBjaGFyICphcmhkcjsKLXsKLSAgc3RydWN0IGFyX2hkciAqaGRyID0gKHN0cnVjdCBhcl9oZHIgKikgYXJoZHI7Ci0gIGludCBsZW5ndGg7Ci0gIENPTlNUIGNoYXIgKmZpbGVuYW1lID0gc3RycmNociAocGF0aG5hbWUsICcvJyk7Ci0gIGludCBtYXhsZW4gPSBhcl9tYXhuYW1lbGVuIChhYmZkKTsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmaWxlbmFtZSA9IHBhdGhuYW1lOwotICBlbHNlCi0gICAgKytmaWxlbmFtZTsKLQotICBsZW5ndGggPSBzdHJsZW4gKGZpbGVuYW1lKTsKLQotICBpZiAobGVuZ3RoIDw9IG1heGxlbikKLSAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIGxlbmd0aCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBwYXRobmFtZTogbWVldCBwcm9jcnVzdGVzICovCi0gICAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIG1heGxlbik7Ci0gICAgICBsZW5ndGggPSBtYXhsZW47Ci0gICAgfQotCi0gIGlmIChsZW5ndGggPCBtYXhsZW4pCi0gICAgKGhkci0+YXJfbmFtZSlbbGVuZ3RoXSA9IGFyX3BhZGNoYXIgKGFiZmQpOwotfQotCi0vKiBTdG9yZSBuYW1lIGludG8gYXIgaGVhZGVyLiAgVHJ1bmNhdGVzIHRoZSBuYW1lIHRvIGZpdC4KLSAgIDE+IHN0cmlwIHBhdGhuYW1lIHRvIGJlIGp1c3QgdGhlIGJhc2VuYW1lLgotICAgMj4gaWYgaXQncyBzaG9ydCBlbnVmIHRvIGZpdCwgc3R1ZmYgaXQgaW4uCi0gICAzPiBJZiBpdCBkb2Vzbid0IGVuZCB3aXRoIC5vLCB0cnVuY2F0ZSBpdCB0byBmaXQKLSAgIDQ+IHRydW5jYXRlIGl0IGJlZm9yZSB0aGUgLm8sIGFwcGVuZCAubywgc3R1ZmYgVEhBVCBpbi4gICovCi0KLS8qIFRoaXMgaXMgd2hhdCBnbnUgYXIgZG9lcy4gIEl0J3MgYmV0dGVyIGJ1dCBpbmNvbXBhdGlibGUgd2l0aCB0aGUKLSAgIGJzZCBhci4gKi8KLQotdm9pZAotYmZkX2dudV90cnVuY2F0ZV9hcm5hbWUgKGFiZmQsIHBhdGhuYW1lLCBhcmhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpwYXRobmFtZTsKLSAgICAgY2hhciAqYXJoZHI7Ci17Ci0gIHN0cnVjdCBhcl9oZHIgKmhkciA9IChzdHJ1Y3QgYXJfaGRyICopIGFyaGRyOwotICBpbnQgbGVuZ3RoOwotICBDT05TVCBjaGFyICpmaWxlbmFtZSA9IHN0cnJjaHIgKHBhdGhuYW1lLCAnLycpOwotICBpbnQgbWF4bGVuID0gYXJfbWF4bmFtZWxlbiAoYWJmZCk7Ci0KLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZmlsZW5hbWUgPSBwYXRobmFtZTsKLSAgZWxzZQotICAgICsrZmlsZW5hbWU7Ci0KLSAgbGVuZ3RoID0gc3RybGVuIChmaWxlbmFtZSk7Ci0KLSAgaWYgKGxlbmd0aCA8PSBtYXhsZW4pCi0gICAgbWVtY3B5IChoZHItPmFyX25hbWUsIGZpbGVuYW1lLCBsZW5ndGgpOwotICBlbHNlCi0gICAgewkJCQkvKiBwYXRobmFtZTogbWVldCBwcm9jcnVzdGVzICovCi0gICAgICBtZW1jcHkgKGhkci0+YXJfbmFtZSwgZmlsZW5hbWUsIG1heGxlbik7Ci0gICAgICBpZiAoKGZpbGVuYW1lW2xlbmd0aCAtIDJdID09ICcuJykgJiYgKGZpbGVuYW1lW2xlbmd0aCAtIDFdID09ICdvJykpCi0JewotCSAgaGRyLT5hcl9uYW1lW21heGxlbiAtIDJdID0gJy4nOwotCSAgaGRyLT5hcl9uYW1lW21heGxlbiAtIDFdID0gJ28nOwotCX0KLSAgICAgIGxlbmd0aCA9IG1heGxlbjsKLSAgICB9Ci0KLSAgaWYgKGxlbmd0aCA8IDE2KQotICAgIChoZHItPmFyX25hbWUpW2xlbmd0aF0gPSBhcl9wYWRjaGFyIChhYmZkKTsKLX0KLQwKLS8qIFRoZSBCRkQgaXMgb3BlbiBmb3Igd3JpdGUgYW5kIGhhcyBpdHMgZm9ybWF0IHNldCB0byBiZmRfYXJjaGl2ZSAqLwotCi1ib29sZWFuCi1fYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgKGFyY2gpCi0gICAgIGJmZCAqYXJjaDsKLXsKLSAgYmZkICpjdXJyZW50OwotICBjaGFyICpldGFibGUgPSBOVUxMOwotICBiZmRfc2l6ZV90eXBlIGVsZW5ndGggPSAwOwotICBjb25zdCBjaGFyICplbmFtZSA9IE5VTEw7Ci0gIGJvb2xlYW4gbWFrZW1hcCA9IGJmZF9oYXNfbWFwIChhcmNoKTsKLSAgYm9vbGVhbiBoYXNvYmplY3RzID0gZmFsc2U7CS8qIGlmIG5vIC5vJ3MsIGRvbid0IGJvdGhlciB0byBtYWtlIGEgbWFwICovCi0gIGJmZF9zaXplX3R5cGUgd3JvdGU7Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgdHJpZXM7Ci0KLSAgLyogVmVyaWZ5IHRoZSB2aWFiaWxpdHkgb2YgYWxsIGVudHJpZXM7IGlmIGFueSBvZiB0aGVtIGxpdmUgaW4gdGhlCi0gICAgIGZpbGVzeXN0ZW0gKGFzIG9wcG9zZWQgdG8gbGl2aW5nIGluIGFuIGFyY2hpdmUgb3BlbiBmb3IgaW5wdXQpCi0gICAgIHRoZW4gY29uc3RydWN0IGEgZnJlc2ggYXJfaGRyIGZvciB0aGVtLiAgKi8KLSAgZm9yIChjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOyBjdXJyZW50OyBjdXJyZW50ID0gY3VycmVudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlX3AgKGN1cnJlbnQpKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCFjdXJyZW50LT5hcmVsdF9kYXRhKQotCXsKLQkgIGN1cnJlbnQtPmFyZWx0X2RhdGEgPQotCSAgICAoUFRSKSBiZmRfYXJfaGRyX2Zyb21fZmlsZXN5c3RlbSAoYXJjaCwgY3VycmVudC0+ZmlsZW5hbWUsIGN1cnJlbnQpOwotCSAgaWYgKCFjdXJyZW50LT5hcmVsdF9kYXRhKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFB1dCBpbiB0aGUgZmlsZSBuYW1lICovCi0JICBCRkRfU0VORCAoYXJjaCwgX2JmZF90cnVuY2F0ZV9hcm5hbWUsIChhcmNoLAotCQkJCQkJIGN1cnJlbnQtPmZpbGVuYW1lLAotCQkJCQkgICAgICAoY2hhciAqKSBhcmNoX2hkciAoY3VycmVudCkpKTsKLQl9Ci0KLSAgICAgIGlmIChtYWtlbWFwICYmICEgaGFzb2JqZWN0cykKLQl7CQkJLyogZG9uJ3QgYm90aGVyIGlmIHdlIHdvbid0IG1ha2UgYSBtYXAhICovCi0JICBpZiAoKGJmZF9jaGVja19mb3JtYXQgKGN1cnJlbnQsIGJmZF9vYmplY3QpKQotI2lmIDAJCQkJLyogRklYTUUgLS0gdGhlc2UgYXJlIG5vdCBzZXQgY29ycmVjdGx5ICovCi0JICAgICAgJiYgKChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGN1cnJlbnQpICYgSEFTX1NZTVMpKQotI2VuZGlmCi0JICAgICkKLQkgICAgaGFzb2JqZWN0cyA9IHRydWU7Ci0JfQotICAgIH0KLQotICBpZiAoIUJGRF9TRU5EIChhcmNoLCBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlLAotCQkgKGFyY2gsICZldGFibGUsICZlbGVuZ3RoLCAmZW5hbWUpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhcmNoLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSNpZmRlZiBHTlU5NjAKLSAgd3JvdGUgPSBiZmRfd3JpdGUgKEJGRF9HTlU5NjBfQVJNQUcgKGFyY2gpLCAxLCBTQVJNQUcsIGFyY2gpOwotI2Vsc2UKLSAgd3JvdGUgPSBiZmRfd3JpdGUgKEFSTUFHLCAxLCBTQVJNQUcsIGFyY2gpOwotI2VuZGlmCi0gIGlmICh3cm90ZSAhPSBTQVJNQUcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChtYWtlbWFwICYmIGhhc29iamVjdHMpCi0gICAgewotICAgICAgaWYgKF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgpICE9IHRydWUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWxlbmd0aCAhPSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcl9oZHIgaGRyOwotCi0gICAgICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gICAgICBzdHJjcHkgKGhkci5hcl9uYW1lLCBlbmFtZSk7Ci0gICAgICAvKiBSb3VuZCBzaXplIHVwIHRvIGV2ZW4gbnVtYmVyIGluIGFyY2hpdmUgaGVhZGVyLiAgKi8KLSAgICAgIHNwcmludGYgKCYoaGRyLmFyX3NpemVbMF0pLCAiJS0xMGQiLAotCSAgICAgICAoaW50KSAoKGVsZW5ndGggKyAxKSAmIH4xKSk7Ci0gICAgICBzdHJuY3B5IChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0JaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0JICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotICAgICAgaWYgKChiZmRfd3JpdGUgKChjaGFyICopICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFyY2gpCi0JICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLQkgIHx8IGJmZF93cml0ZSAoZXRhYmxlLCAxLCBlbGVuZ3RoLCBhcmNoKSAhPSBlbGVuZ3RoKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICgoZWxlbmd0aCAlIDIpID09IDEpCi0JewotCSAgaWYgKGJmZF93cml0ZSAoIlwwMTIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBmb3IgKGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7IGN1cnJlbnQ7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGNoYXIgYnVmZmVyW0RFRkFVTFRfQlVGRkVSU0laRV07Ci0gICAgICB1bnNpZ25lZCBpbnQgcmVtYWluaW5nID0gYXJlbHRfc2l6ZSAoY3VycmVudCk7Ci0gICAgICBzdHJ1Y3QgYXJfaGRyICpoZHIgPSBhcmNoX2hkciAoY3VycmVudCk7Ci0KLSAgICAgIC8qIHdyaXRlIGFyIGhlYWRlciAqLwotICAgICAgaWYgKGJmZF93cml0ZSAoKGNoYXIgKikgaGRyLCAxLCBzaXplb2YgKCpoZHIpLCBhcmNoKSAhPSBzaXplb2YgKCpoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfc2VlayAoY3VycmVudCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB3aGlsZSAocmVtYWluaW5nKQotCXsKLQkgIHVuc2lnbmVkIGludCBhbXQgPSBERUZBVUxUX0JVRkZFUlNJWkU7Ci0JICBpZiAoYW10ID4gcmVtYWluaW5nKQotCSAgICBhbXQgPSByZW1haW5pbmc7Ci0JICBlcnJubyA9IDA7Ci0JICBpZiAoYmZkX3JlYWQgKGJ1ZmZlciwgYW10LCAxLCBjdXJyZW50KSAhPSBhbXQpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoYmZkX3dyaXRlIChidWZmZXIsIGFtdCwgMSwgYXJjaCkgIT0gYW10KQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICByZW1haW5pbmcgLT0gYW10OwotCX0KLSAgICAgIGlmICgoYXJlbHRfc2l6ZSAoY3VycmVudCkgJSAyKSA9PSAxKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKCJcMDEyIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKG1ha2VtYXAgJiYgaGFzb2JqZWN0cykKLSAgICB7Ci0gICAgICAvKiBWZXJpZnkgdGhlIHRpbWVzdGFtcCBpbiB0aGUgYXJjaGl2ZSBmaWxlLiAgSWYgaXQgd291bGQgbm90IGJlCi0JIGFjY2VwdGVkIGJ5IHRoZSBsaW5rZXIsIHJld3JpdGUgaXQgdW50aWwgaXQgd291bGQgYmUuICBJZgotCSBhbnl0aGluZyBvZGQgaGFwcGVucywgYnJlYWsgb3V0IGFuZCBqdXN0IHJldHVybi4gIChUaGUKLQkgQmVya2VsZXkgbGlua2VyIGNoZWNrcyB0aGUgdGltZXN0YW1wIGFuZCByZWZ1c2VzIHRvIHJlYWQgdGhlCi0JIHRhYmxlLW9mLWNvbnRlbnRzIGlmIGl0IGlzID42MCBzZWNvbmRzIGxlc3MgdGhhbiB0aGUgZmlsZSdzCi0JIG1vZGlmaWVkLXRpbWUuICBUaGF0IHBhaW5mdWwgaGFjayByZXF1aXJlcyB0aGlzIHBhaW5mdWwgaGFjay4gICovCi0gICAgICB0cmllcyA9IDE7Ci0gICAgICBkbwotCXsKLQkgIGlmIChiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCAoYXJjaCkpCi0JICAgIGJyZWFrOwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJXYXJuaW5nOiB3cml0aW5nIGFyY2hpdmUgd2FzIHNsb3c6IHJld3JpdGluZyB0aW1lc3RhbXBcbiIpKTsKLQl9Ci0gICAgICB3aGlsZSAoKyt0cmllcyA8IDYpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIE5vdGUgdGhhdCB0aGUgbmFtaWR4IGZvciB0aGUgZmlyc3Qgc3ltYm9sIGlzIDAgKi8KLQotYm9vbGVhbgotX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLXsKLSAgY2hhciAqZmlyc3RfbmFtZSA9IE5VTEw7Ci0gIGJmZCAqY3VycmVudDsKLSAgZmlsZV9wdHIgZWx0X25vID0gMDsKLSAgc3RydWN0IG9ybCAqbWFwID0gTlVMTDsKLSAgaW50IG9ybF9tYXggPSAxMDI0OwkJLyogZmluZSBpbml0aWFsIGRlZmF1bHQgKi8KLSAgaW50IG9ybF9jb3VudCA9IDA7Ci0gIGludCBzdHJpZHggPSAwOwkJLyogc3RyaW5nIGluZGV4ICovCi0gIGFzeW1ib2wgKipzeW1zID0gTlVMTDsKLSAgbG9uZyBzeW1zX21heCA9IDA7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIC8qIER1bm5vIGlmIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UgZm9yIHRoaXMgaW5mby4uLiAqLwotICBpZiAoZWxlbmd0aCAhPSAwKQotICAgIGVsZW5ndGggKz0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLSAgZWxlbmd0aCArPSBlbGVuZ3RoICUgMjsKLQotICBtYXAgPSAoc3RydWN0IG9ybCAqKSBiZmRfbWFsbG9jIChvcmxfbWF4ICogc2l6ZW9mIChzdHJ1Y3Qgb3JsKSk7Ci0gIGlmIChtYXAgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSBwdXQgdGhlIHN5bWJvbCBuYW1lcyBvbiB0aGUgYXJjaCBvYmphbGxvYywgYW5kIHRoZW4gZGlzY2FyZAotICAgICB0aGVtIHdoZW4gZG9uZS4gICovCi0gIGZpcnN0X25hbWUgPSBiZmRfYWxsb2MgKGFyY2gsIDEpOwotICBpZiAoZmlyc3RfbmFtZSA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIERyb3AgYWxsIHRoZSBmaWxlcyBjYWxsZWQgX18uU1lNREVGLCB3ZSdyZSBnb2luZyB0byBtYWtlIG91cgotICAgICBvd24gKi8KLSAgd2hpbGUgKGFyY2gtPmFyY2hpdmVfaGVhZCAmJgotCSBzdHJjbXAgKGFyY2gtPmFyY2hpdmVfaGVhZC0+ZmlsZW5hbWUsICJfXy5TWU1ERUYiKSA9PSAwKQotICAgIGFyY2gtPmFyY2hpdmVfaGVhZCA9IGFyY2gtPmFyY2hpdmVfaGVhZC0+bmV4dDsKLQotICAvKiBNYXAgb3ZlciBlYWNoIGVsZW1lbnQgKi8KLSAgZm9yIChjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICAgICAgIGN1cnJlbnQgIT0gKGJmZCAqKSBOVUxMOwotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0LCBlbHRfbm8rKykKLSAgICB7Ci0gICAgICBpZiAoKGJmZF9jaGVja19mb3JtYXQgKGN1cnJlbnQsIGJmZF9vYmplY3QpID09IHRydWUpCi0JICAmJiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoY3VycmVudCkgJiBIQVNfU1lNUykpKQotCXsKLQkgIGxvbmcgc3RvcmFnZTsKLQkgIGxvbmcgc3ltY291bnQ7Ci0JICBsb25nIHNyY19jb3VudDsKLQotCSAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChjdXJyZW50KTsKLQkgIGlmIChzdG9yYWdlIDwgMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChzdG9yYWdlICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3RvcmFnZSA+IHN5bXNfbWF4KQotCQl7Ci0JCSAgaWYgKHN5bXNfbWF4ID4gMCkKLQkJICAgIGZyZWUgKHN5bXMpOwotCQkgIHN5bXNfbWF4ID0gc3RvcmFnZTsKLQkJICBzeW1zID0gKGFzeW1ib2wgKiopIGJmZF9tYWxsb2MgKChzaXplX3QpIHN5bXNfbWF4KTsKLQkJICBpZiAoc3ltcyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChjdXJyZW50LCBzeW1zKTsKLQkgICAgICBpZiAoc3ltY291bnQgPCAwKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIC8qIE5vdyBtYXAgb3ZlciBhbGwgdGhlIHN5bWJvbHMsIHBpY2tpbmcgb3V0IHRoZSBvbmVzIHdlIHdhbnQgKi8KLQkgICAgICBmb3IgKHNyY19jb3VudCA9IDA7IHNyY19jb3VudCA8IHN5bWNvdW50OyBzcmNfY291bnQrKykKLQkJewotCQkgIGZsYWd3b3JkIGZsYWdzID0gKHN5bXNbc3JjX2NvdW50XSktPmZsYWdzOwotCQkgIGFzZWN0aW9uICpzZWMgPSBzeW1zW3NyY19jb3VudF0tPnNlY3Rpb247Ci0KLQkJICBpZiAoKGZsYWdzICYgQlNGX0dMT0JBTCB8fAotCQkgICAgICAgZmxhZ3MgJiBCU0ZfV0VBSyB8fAotCQkgICAgICAgZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QgfHwKLQkJICAgICAgIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQkJICAgICAgJiYgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBuYW1lbGVuOwotCQkgICAgICBzdHJ1Y3Qgb3JsICpuZXdfbWFwOwotCi0JCSAgICAgIC8qIFRoaXMgc3ltYm9sIHdpbGwgZ28gaW50byB0aGUgYXJjaGl2ZSBoZWFkZXIgKi8KLQkJICAgICAgaWYgKG9ybF9jb3VudCA9PSBvcmxfbWF4KQotCQkJewotCQkJICBvcmxfbWF4ICo9IDI7Ci0JCQkgIG5ld19tYXAgPQotCQkJICAgICgoc3RydWN0IG9ybCAqKQotCQkJICAgICBiZmRfcmVhbGxvYyAobWFwLCBvcmxfbWF4ICogc2l6ZW9mIChzdHJ1Y3Qgb3JsKSkpOwotCQkJICBpZiAobmV3X21hcCA9PSAoc3RydWN0IG9ybCAqKSBOVUxMKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCQkgIG1hcCA9IG5ld19tYXA7Ci0JCQl9Ci0KLQkJICAgICAgbmFtZWxlbiA9IHN0cmxlbiAoc3ltc1tzcmNfY291bnRdLT5uYW1lKTsKLQkJICAgICAgbWFwW29ybF9jb3VudF0ubmFtZSA9ICgoY2hhciAqKikKLQkJCQkJICAgICBiZmRfYWxsb2MgKGFyY2gsCi0JCQkJCQkJc2l6ZW9mIChjaGFyICopKSk7Ci0JCSAgICAgIGlmIChtYXBbb3JsX2NvdW50XS5uYW1lID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgKihtYXBbb3JsX2NvdW50XS5uYW1lKSA9IGJmZF9hbGxvYyAoYXJjaCwgbmFtZWxlbiArIDEpOwotCQkgICAgICBpZiAoKihtYXBbb3JsX2NvdW50XS5uYW1lKSA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICAgIHN0cmNweSAoKihtYXBbb3JsX2NvdW50XS5uYW1lKSwgc3ltc1tzcmNfY291bnRdLT5uYW1lKTsKLQkJICAgICAgKG1hcFtvcmxfY291bnRdKS5wb3MgPSAoZmlsZV9wdHIpIGN1cnJlbnQ7Ci0JCSAgICAgIChtYXBbb3JsX2NvdW50XSkubmFtaWR4ID0gc3RyaWR4OwotCi0JCSAgICAgIHN0cmlkeCArPSBuYW1lbGVuICsgMTsKLQkJICAgICAgKytvcmxfY291bnQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICAvKiBOb3cgYXNrIHRoZSBCRkQgdG8gZnJlZSB1cCBhbnkgY2FjaGVkIGluZm9ybWF0aW9uLCBzbyB3ZQotCSAgICAgZG9uJ3QgZmlsbCBhbGwgb2YgbWVtb3J5IHdpdGggc3ltYm9sIHRhYmxlcy4gICovCi0JICBpZiAoISBiZmRfZnJlZV9jYWNoZWRfaW5mbyAoY3VycmVudCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogT0ssIG5vdyB3ZSBoYXZlIGNvbGxlY3RlZCBhbGwgdGhlIGRhdGEsIGxldCdzIHdyaXRlIHRoZW0gb3V0ICovCi0gIHJldCA9IEJGRF9TRU5EIChhcmNoLCB3cml0ZV9hcm1hcCwKLQkJICAoYXJjaCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkpOwotCi0gIGlmIChzeW1zX21heCA+IDApCi0gICAgZnJlZSAoc3ltcyk7Ci0gIGlmIChtYXAgIT0gTlVMTCkKLSAgICBmcmVlIChtYXApOwotICBpZiAoZmlyc3RfbmFtZSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhcmNoLCBmaXJzdF9uYW1lKTsKLQotICByZXR1cm4gcmV0OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3ltc19tYXggPiAwKQotICAgIGZyZWUgKHN5bXMpOwotICBpZiAobWFwICE9IE5VTEwpCi0gICAgZnJlZSAobWFwKTsKLSAgaWYgKGZpcnN0X25hbWUgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYXJjaCwgZmlyc3RfbmFtZSk7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sZWFuCi1ic2Rfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgaW50IHBhZGl0ID0gc3RyaWR4ICYgMTsKLSAgdW5zaWduZWQgaW50IHJhbmxpYnNpemUgPSBvcmxfY291bnQgKiBCU0RfU1lNREVGX1NJWkU7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplID0gc3RyaWR4ICsgcGFkaXQ7Ci0gIC8qIEluY2x1ZGUgOCBieXRlcyB0byBzdG9yZSByYW5saWJzaXplIGFuZCBzdHJpbmdzaXplIGluIG91dHB1dC4gKi8KLSAgdW5zaWduZWQgaW50IG1hcHNpemUgPSByYW5saWJzaXplICsgc3RyaW5nc2l6ZSArIDg7Ci0gIGZpbGVfcHRyIGZpcnN0cmVhbDsKLSAgYmZkICpjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICBiZmQgKmxhc3RfZWx0ID0gY3VycmVudDsJLyogbGFzdCBlbGVtZW50IGFyY2ggc2VlbiAqLwotICBiZmRfYnl0ZSB0ZW1wWzRdOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmaXJzdHJlYWwgPSBtYXBzaXplICsgZWxlbmd0aCArIHNpemVvZiAoc3RydWN0IGFyX2hkcikgKyBTQVJNQUc7Ci0KLSAgc3RhdCAoYXJjaC0+ZmlsZW5hbWUsICZzdGF0YnVmKTsKLSAgbWVtc2V0ICgoY2hhciAqKSAoJmhkciksIDAsIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICBzcHJpbnRmIChoZHIuYXJfbmFtZSwgUkFOTElCTUFHKTsKLSAgLyogUmVtZW1iZXIgdGhlIHRpbWVzdGFtcCwgdG8ga2VlcCBpdCBob2x5LiAgQnV0IGZ1ZGdlIGl0IGEgbGl0dGxlLiAgKi8KLSAgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCA9IHN0YXRidWYuc3RfbXRpbWUgKyBBUk1BUF9USU1FX09GRlNFVDsKLSAgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX2RhdGVwb3MgPSAoU0FSTUFHCi0JCQkJICAgICAgKyBvZmZzZXRvZiAoc3RydWN0IGFyX2hkciwgYXJfZGF0ZVswXSkpOwotICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF90aW1lc3RhbXApOwotICBzcHJpbnRmIChoZHIuYXJfdWlkLCAiJWxkIiwgKGxvbmcpIGdldHVpZCAoKSk7Ci0gIHNwcmludGYgKGhkci5hcl9naWQsICIlbGQiLCAobG9uZykgZ2V0Z2lkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotICBzdHJuY3B5IChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc3RydWN0IGFyX2hkcik7IGkrKykKLSAgICBpZiAoKChjaGFyICopICgmaGRyKSlbaV0gPT0gJ1wwJykKLSAgICAgICgoKGNoYXIgKikgKCZoZHIpKVtpXSkgPSAnICc7Ci0gIGlmIChiZmRfd3JpdGUgKChjaGFyICopICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFyY2gpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX2hfcHV0XzMyIChhcmNoLCAoYmZkX3ZtYSkgcmFubGlic2l6ZSwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIDEsIHNpemVvZiAodGVtcCksIGFyY2gpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9ybF9jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBidWZbQlNEX1NZTURFRl9TSVpFXTsKLQotICAgICAgaWYgKCgoYmZkICopIChtYXBbY291bnRdKS5wb3MpICE9IGxhc3RfZWx0KQotCXsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBmaXJzdHJlYWwgKz0gYXJlbHRfc2l6ZSAoY3VycmVudCkgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCSAgICAgIGZpcnN0cmVhbCArPSBmaXJzdHJlYWwgJSAyOwotCSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotCSAgICB9Ci0JICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIChtYXBbY291bnRdKS5wb3MpOwotCX0JCQkvKiBpZiBuZXcgYXJjaGl2ZSBlbGVtZW50ICovCi0KLSAgICAgIGxhc3RfZWx0ID0gY3VycmVudDsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYXJjaCwgbWFwW2NvdW50XS5uYW1pZHgsIGJ1Zik7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFyY2gsIGZpcnN0cmVhbCwgYnVmICsgQlNEX1NZTURFRl9PRkZTRVRfU0laRSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChidWYsIEJTRF9TWU1ERUZfU0laRSwgMSwgYXJjaCkgIT0gQlNEX1NZTURFRl9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogbm93IHdyaXRlIHRoZSBzdHJpbmdzIHRoZW1zZWx2ZXMgKi8KLSAgYmZkX2hfcHV0XzMyIChhcmNoLCBzdHJpbmdzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgMSwgc2l6ZW9mICh0ZW1wKSwgYXJjaCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG9ybF9jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHNwZWMgc2V6IHRoaXMgc2hvdWxkIGJlIGEgbmV3bGluZS4gIEJ1dCBpbiBvcmRlciB0byBiZQotICAgICBidWctY29tcGF0aWJsZSBmb3Igc3VuJ3MgYXIgd2UgdXNlIGEgbnVsbC4gKi8KLSAgaWYgKHBhZGl0KQotICAgIHsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCIiLCAxLCAxLCBhcmNoKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEF0IHRoZSBlbmQgb2YgYXJjaGl2ZSBmaWxlIGhhbmRsaW5nLCB1cGRhdGUgdGhlIHRpbWVzdGFtcCBpbiB0aGUKLSAgIGZpbGUsIHNvIHRoZSBsaW5rZXIgd2lsbCBhY2NlcHQgaXQuCi0KLSAgIFJldHVybiB0cnVlIGlmIHRoZSB0aW1lc3RhbXAgd2FzIE9LLCBvciBhbiB1bnVzdWFsIHByb2JsZW0gaGFwcGVuZWQuCi0gICBSZXR1cm4gZmFsc2UgaWYgd2UgdXBkYXRlZCB0aGUgdGltZXN0YW1wLiAgKi8KLQotYm9vbGVhbgotX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhcmNoKQotICAgICBiZmQgKmFyY2g7Ci17Ci0gIHN0cnVjdCBzdGF0IGFyY2hzdGF0OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogRmx1c2ggd3JpdGVzLCBnZXQgbGFzdC13cml0ZSB0aW1lc3RhbXAgZnJvbSBmaWxlLCBhbmQgY29tcGFyZSBpdAotICAgICB0byB0aGUgdGltZXN0YW1wIElOIHRoZSBmaWxlLiAgKi8KLSAgYmZkX2ZsdXNoIChhcmNoKTsKLSAgaWYgKGJmZF9zdGF0IChhcmNoLCAmYXJjaHN0YXQpID09IC0xKQotICAgIHsKLSAgICAgIHBlcnJvciAoXygiUmVhZGluZyBhcmNoaXZlIGZpbGUgbW9kIHRpbWVzdGFtcCIpKTsKLSAgICAgIHJldHVybiB0cnVlOwkJLyogQ2FuJ3QgcmVhZCBtb2QgdGltZSBmb3Igc29tZSByZWFzb24gKi8KLSAgICB9Ci0gIGlmIChhcmNoc3RhdC5zdF9tdGltZSA8PSBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wKQotICAgIHJldHVybiB0cnVlOwkJLyogT0sgYnkgdGhlIGxpbmtlcidzIHJ1bGVzICovCi0KLSAgLyogVXBkYXRlIHRoZSB0aW1lc3RhbXAuICAqLwotICBiZmRfYXJkYXRhIChhcmNoKS0+YXJtYXBfdGltZXN0YW1wID0gYXJjaHN0YXQuc3RfbXRpbWUgKyBBUk1BUF9USU1FX09GRlNFVDsKLQotICAvKiBQcmVwYXJlIGFuIEFTQ0lJIHZlcnNpb24gc3VpdGFibGUgZm9yIHdyaXRpbmcuICAqLwotICBtZW1zZXQgKGhkci5hcl9kYXRlLCAwLCBzaXplb2YgKGhkci5hcl9kYXRlKSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGhkci5hcl9kYXRlKTsgaSsrKQotICAgIGlmIChoZHIuYXJfZGF0ZVtpXSA9PSAnXDAnKQotICAgICAgKGhkci5hcl9kYXRlKVtpXSA9ICcgJzsKLQotICAvKiBXcml0ZSBpdCBpbnRvIHRoZSBmaWxlLiAgKi8KLSAgYmZkX2FyZGF0YSAoYXJjaCktPmFybWFwX2RhdGVwb3MgPSAoU0FSTUFHCi0JCQkJICAgICAgKyBvZmZzZXRvZiAoc3RydWN0IGFyX2hkciwgYXJfZGF0ZVswXSkpOwotICBpZiAoYmZkX3NlZWsgKGFyY2gsIGJmZF9hcmRhdGEgKGFyY2gpLT5hcm1hcF9kYXRlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoaGRyLmFyX2RhdGUsIHNpemVvZiAoaGRyLmFyX2RhdGUpLCAxLCBhcmNoKQotCSAgIT0gc2l6ZW9mIChoZHIuYXJfZGF0ZSkpKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBiZmQgY2FuJ3QgY2FsbCBwZXJyb3IuICAqLwotICAgICAgcGVycm9yIChfKCJXcml0aW5nIHVwZGF0ZWQgYXJtYXAgdGltZXN0YW1wIikpOwotICAgICAgcmV0dXJuIHRydWU7CQkvKiBTb21lIGVycm9yIHdoaWxlIHdyaXRpbmcgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwkJCS8qIFdlIHVwZGF0ZWQgdGhlIHRpbWVzdGFtcCBzdWNjZXNzZnVsbHkuICAqLwotfQotDAotLyogQSBjb2ZmIGFybWFwIGxvb2tzIGxpa2UgOgotICAgbEFSTUFHCi0gICBzdHJ1Y3QgYXJfaGRyIHdpdGggbmFtZSA9ICcvJwotICAgbnVtYmVyIG9mIHN5bWJvbHMKLSAgIG9mZnNldCBvZiBmaWxlIGZvciBzeW1ib2wgMAotICAgb2Zmc2V0IG9mIGZpbGUgZm9yIHN5bWJvbCAxCi0KLSAgIG9mZnNldCBvZiBmaWxlIGZvciBzeW1ib2wgbi0xCi0gICBzeW1ib2wgbmFtZSAwCi0gICBzeW1ib2wgbmFtZSAxCi0KLSAgIHN5bWJvbCBuYW1lIG4tMQotKi8KLQotYm9vbGVhbgotY29mZl93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBzeW1ib2xfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICAvKiBUaGUgc2l6ZSBvZiB0aGUgcmFubGliIGlzIHRoZSBudW1iZXIgb2YgZXhwb3J0ZWQgc3ltYm9scyBpbiB0aGUKLSAgICAgYXJjaGl2ZSAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBpbnQsICsgYW4gaW50IGZvciB0aGUgY291bnQgKi8KLSAgdW5zaWduZWQgaW50IHJhbmxpYnNpemUgPSAoc3ltYm9sX2NvdW50ICogNCkgKyA0OwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc2l6ZSA9IHN0cmlkeDsKLSAgdW5zaWduZWQgaW50IG1hcHNpemUgPSBzdHJpbmdzaXplICsgcmFubGlic2l6ZTsKLSAgZmlsZV9wdHIgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHI7Ci0gIGJmZCAqY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBwYWRpdCA9IG1hcHNpemUgJiAxOwotCi0gIGlmIChwYWRpdCkKLSAgICBtYXBzaXplKys7Ci0KLSAgLyogd29yayBvdXQgd2hlcmUgdGhlIGZpcnN0IG9iamVjdCBmaWxlIHdpbGwgZ28gaW4gdGhlIGFyY2hpdmUgKi8KLSAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgPSAobWFwc2l6ZQotCQkJICAgICArIGVsZW5ndGgKLQkJCSAgICAgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpCi0JCQkgICAgICsgU0FSTUFHKTsKLQotICBtZW1zZXQgKChjaGFyICopICgmaGRyKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gIGhkci5hcl9uYW1lWzBdID0gJy8nOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgKGxvbmcpIHRpbWUgKE5VTEwpKTsKLSAgLyogVGhpcywgYXQgbGVhc3QsIGlzIHdoYXQgSW50ZWwgY29mZiBzZXRzIHRoZSB2YWx1ZXMgdG8uOiAqLwotICBzcHJpbnRmICgoaGRyLmFyX3VpZCksICIlZCIsIDApOwotICBzcHJpbnRmICgoaGRyLmFyX2dpZCksICIlZCIsIDApOwotICBzcHJpbnRmICgoaGRyLmFyX21vZGUpLCAiJS03byIsICh1bnNpZ25lZCkgMCk7Ci0gIHN0cm5jcHkgKGhkci5hcl9mbWFnLCBBUkZNQUcsIDIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICAgaWYgKCgoY2hhciAqKSAoJmhkcikpW2ldID09ICdcMCcpCi0gICAgICAoKChjaGFyICopICgmaGRyKSlbaV0pID0gJyAnOwotCi0gIC8qIFdyaXRlIHRoZSBhciBoZWFkZXIgZm9yIHRoaXMgaXRlbSBhbmQgdGhlIG51bWJlciBvZiBzeW1ib2xzICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYXJjaCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IChhcmNoLCBzeW1ib2xfY291bnQpOwotCi0gIC8qIFR3byBwYXNzZXMsIGZpcnN0IHdyaXRlIHRoZSBmaWxlIG9mZnNldHMgZm9yIGVhY2ggc3ltYm9sIC0KLSAgICAgcmVtZW1iZXJpbmcgdGhhdCBlYWNoIG9mZnNldCBpcyBvbiBhIHR3byBieXRlIGJvdW5kYXJ5LiAgKi8KLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgb2Zmc2V0IGZvciB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggZWFjaAotICAgICBzeW1ib2wsIGFuZCByZW1lbWJlciB0byBrZWVwIHRoZSBvZmZzZXRzIHBhZGRlZCBvdXQuICAqLwotCi0gIGN1cnJlbnQgPSBhcmNoLT5hcmNoaXZlX2hlYWQ7Ci0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKGN1cnJlbnQgIT0gKGJmZCAqKSBOVUxMICYmIGNvdW50IDwgc3ltYm9sX2NvdW50KQotICAgIHsKLSAgICAgIC8qIEZvciBlYWNoIHN5bWJvbCB3aGljaCBpcyB1c2VkIGRlZmluZWQgaW4gdGhpcyBvYmplY3QsIHdyaXRlIG91dAotCSB0aGUgb2JqZWN0IGZpbGUncyBhZGRyZXNzIGluIHRoZSBhcmNoaXZlICovCi0KLSAgICAgIHdoaWxlICgoKGJmZCAqKSAobWFwW2NvdW50XSkucG9zKSA9PSBjdXJyZW50KQotCXsKLQkgIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IChhcmNoLCBhcmNoaXZlX21lbWJlcl9maWxlX3B0cik7Ci0JICBjb3VudCsrOwotCX0KLSAgICAgIC8qIEFkZCBzaXplIG9mIHRoaXMgYXJjaGl2ZSBlbnRyeSAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gKGFyZWx0X3NpemUgKGN1cnJlbnQpCi0JCQkJICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikpOwotICAgICAgLyogcmVtZW1iZXIgYWJvb3V0IHRoZSBldmVuIGFsaWdubWVudCAqLwotICAgICAgYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgKz0gYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIgJSAyOwotICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0gICAgfQotCi0gIC8qIG5vdyB3cml0ZSB0aGUgc3RyaW5ncyB0aGVtc2VsdmVzICovCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHN5bWJvbF9jb3VudDsgY291bnQrKykKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuID0gc3RybGVuICgqbWFwW2NvdW50XS5uYW1lKSArIDE7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKCptYXBbY291bnRdLm5hbWUsIDEsIGxlbiwgYXJjaCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHNwZWMgc2V6IHRoaXMgc2hvdWxkIGJlIGEgbmV3bGluZS4gIEJ1dCBpbiBvcmRlciB0byBiZQotICAgICBidWctY29tcGF0aWJsZSBmb3IgYXJjOTYwIHdlIHVzZSBhIG51bGwuICovCi0gIGlmIChwYWRpdCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2FyY2h1cmVzLmMgYi9iZmQvYXJjaHVyZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0Mzg2Mi4uMDAwMDAwMAotLS0gYS9iZmQvYXJjaHVyZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDg5NiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciBhcmNoaXRlY3R1cmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MS05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBKb2huIEdpbG1vcmUgYW5kIFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKgotCi1TRUNUSU9OCi0JQXJjaGl0ZWN0dXJlcwotCi0JQkZEIGtlZXBzIG9uZSBhdG9tIGluIGEgQkZEIGRlc2NyaWJpbmcgdGhlCi0JYXJjaGl0ZWN0dXJlIG9mIHRoZSBkYXRhIGF0dGFjaGVkIHRvIHRoZSBCRkQ6IGEgcG9pbnRlciB0byBhCi0JPDxiZmRfYXJjaF9pbmZvX3R5cGU+Pi4gIAotCi0JUG9pbnRlcnMgdG8gc3RydWN0dXJlcyBjYW4gYmUgcmVxdWVzdGVkIGluZGVwZW5kZW50bHkgb2YgYSBCRkQKLQlzbyB0aGF0IGFuIGFyY2hpdGVjdHVyZSdzIGluZm9ybWF0aW9uIGNhbiBiZSBpbnRlcnJvZ2F0ZWQKLQl3aXRob3V0IGFjY2VzcyB0byBhbiBvcGVuIEJGRC4KLQotCVRoZSBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgYnkgZWFjaCBhcmNoaXRlY3R1cmUgcGFja2FnZS4KLQlUaGUgc2V0IG9mIGRlZmF1bHQgYXJjaGl0ZWN0dXJlcyBpcyBzZWxlY3RlZCBieSB0aGUgbWFjcm8KLQk8PFNFTEVDVF9BUkNISVRFQ1RVUkVTPj4uICBUaGlzIGlzIG5vcm1hbGx5IHNldCB1cCBpbiB0aGUKLQlAZmlsZXtjb25maWcvQHZhcnt0YXJnZXR9Lm10fSBmaWxlIG9mIHlvdXIgY2hvaWNlLiAgSWYgdGhlIG5hbWUgaXMgbm90Ci0JZGVmaW5lZCwgdGhlbiBhbGwgdGhlIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGFyZSBpbmNsdWRlZC4gCi0KLQlXaGVuIEJGRCBzdGFydHMgdXAsIGFsbCB0aGUgYXJjaGl0ZWN0dXJlcyBhcmUgY2FsbGVkIHdpdGggYW4KLQlpbml0aWFsaXplIG1ldGhvZC4gIEl0IGlzIHVwIHRvIHRoZSBhcmNoaXRlY3R1cmUgYmFjayBlbmQgdG8KLQlpbnNlcnQgYXMgbWFueSBpdGVtcyBpbnRvIHRoZSBsaXN0IG9mIGFyY2hpdGVjdHVyZXMgYXMgaXQgd2FudHMgdG87Ci0JZ2VuZXJhbGx5IHRoaXMgd291bGQgYmUgb25lIGZvciBlYWNoIG1hY2hpbmUgYW5kIG9uZSBmb3IgdGhlCi0JZGVmYXVsdCBjYXNlIChhbiBpdGVtIHdpdGggYSBtYWNoaW5lIGZpZWxkIG9mIDApLiAKLQotCUJGRCdzIGlkZWEgb2YgYW4gYXJjaGl0ZWN0dXJlIGlzIGltcGxlbWVudGVkIGluCUBmaWxle2FyY2h1cmVzLmN9LgotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoaXRlY3R1cmUKLQotREVTQ1JJUFRJT04KLQlUaGlzIGVudW0gZ2l2ZXMgdGhlIG9iamVjdCBmaWxlJ3MgQ1BVIGFyY2hpdGVjdHVyZSwgaW4gYQotCWdsb2JhbCBzZW5zZS0tLWkuZS4sIHdoYXQgcHJvY2Vzc29yIGZhbWlseSBkb2VzIGl0IGJlbG9uZyB0bz8KLQlBbm90aGVyIGZpZWxkIGluZGljYXRlcyB3aGljaCBwcm9jZXNzb3Igd2l0aGluCi0JdGhlIGZhbWlseSBpcyBpbiB1c2UuICBUaGUgbWFjaGluZSBnaXZlcyBhIG51bWJlciB3aGljaAotCWRpc3Rpbmd1aXNoZXMgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBhcmNoaXRlY3R1cmUsCi0JY29udGFpbmluZywgZm9yIGV4YW1wbGUsIDIgYW5kIDMgZm9yIEludGVsIGk5NjAgS0EgYW5kIGk5NjAgS0IsCi0JYW5kIDY4MDIwIGFuZCA2ODAzMCBmb3IgTW90b3JvbGEgNjgwMjAgYW5kIDY4MDMwLiAKLQotLmVudW0gYmZkX2FyY2hpdGVjdHVyZSAKLS57Ci0uICBiZmRfYXJjaF91bmtub3duLCAgIHsqIEZpbGUgYXJjaCBub3Qga25vd24gKn0KLS4gIGJmZF9hcmNoX29ic2N1cmUsICAgeyogQXJjaCBrbm93biwgbm90IG9uZSBvZiB0aGVzZSAqfQotLiAgYmZkX2FyY2hfbTY4aywgICAgICB7KiBNb3Rvcm9sYSA2OHh4eCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDAwIDEKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAwOCAyCi0uI2RlZmluZSBiZmRfbWFjaF9tNjgwMTAgMwotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDIwIDQKLS4jZGVmaW5lIGJmZF9tYWNoX202ODAzMCA1Ci0uI2RlZmluZSBiZmRfbWFjaF9tNjgwNDAgNgotLiNkZWZpbmUgYmZkX21hY2hfbTY4MDYwIDcKLS4jZGVmaW5lIGJmZF9tYWNoX2NwdTMyICA4Ci0uICBiZmRfYXJjaF92YXgsICAgICAgIHsqIERFQyBWYXggKn0gICAKLS4gIGJmZF9hcmNoX2k5NjAsICAgICAgeyogSW50ZWwgOTYwICp9Ci0uICAgIHsqIFRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nIGlzIGltcG9ydGFudC4KLS4gICAgICAgbG93ZXIgbnVtYmVyIGluZGljYXRlcyBhIG1hY2hpbmUgdHlwZSB0aGF0IAotLiAgICAgICBvbmx5IGFjY2VwdHMgYSBzdWJzZXQgb2YgdGhlIGluc3RydWN0aW9ucwotLiAgICAgICBhdmFpbGFibGUgdG8gbWFjaGluZXMgd2l0aCBoaWdoZXIgbnVtYmVycy4KLS4gICAgICAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgImNhIiwgd2hpY2ggaXMKLS4gICAgICAgaW5jb21wYXRpYmxlIHdpdGggYWxsIG90aGVyIG1hY2hpbmVzIGV4Y2VwdCAKLS4gICAgICAgImNvcmUiLiAqfQotLgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9jb3JlICAgICAgMQotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYV9zYSAgICAgMgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYl9zYiAgICAgMwotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9tYyAgICAgICAgNAotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF94YSAgICAgICAgNQotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9jYSAgICAgICAgNgotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9qeAkgNwotLiNkZWZpbmUgYmZkX21hY2hfaTk2MF9oeCAgICAgICAgOAotLgotLiAgYmZkX2FyY2hfYTI5aywgICAgICB7KiBBTUQgMjkwMDAgKn0KLS4gIGJmZF9hcmNoX3NwYXJjLCAgICAgeyogU1BBUkMgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjCQkJMQotLnsqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdjhwbHVzIGFuZCB2OSBpcyB0aGF0IHY5IGlzIGEgdHJ1ZSA2NCBiaXQgZW52LiAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0CTIKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZQkzCi0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OHBsdXMJCTQKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EJCTUgeyogd2l0aCB1bHRyYXNwYXJjIGFkZCducyAqfQotLiNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlCTYKLS4jZGVmaW5lIGJmZF9tYWNoX3NwYXJjX3Y5CQk3Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OWEJCTggeyogd2l0aCB1bHRyYXNwYXJjIGFkZCducyAqfQotLnsqIE5vbnplcm8gaWYgTUFDSCBoYXMgdGhlIHY5IGluc3RydWN0aW9uIHNldC4gICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OV9wKG1hY2gpIFwKLS4gICgobWFjaCkgPj0gYmZkX21hY2hfc3BhcmNfdjhwbHVzICYmIChtYWNoKSA8PSBiZmRfbWFjaF9zcGFyY192OWEpCi0uICBiZmRfYXJjaF9taXBzLCAgICAgIHsqIE1JUFMgUnh4eHggKn0KLS4jZGVmaW5lIGJmZF9tYWNoX21pcHMzMDAwCQkzMDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMzkwMAkJMzkwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQwMDAJCTQwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MDEwCQk0MDEwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDEwMAkJNDEwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQxMTEJCTQxMTEKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0MzAwCQk0MzAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNDQwMAkJNDQwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczQ2MDAJCTQ2MDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM0NjUwCQk0NjUwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzNTAwMAkJNTAwMAotLiNkZWZpbmUgYmZkX21hY2hfbWlwczYwMDAJCTYwMDAKLS4jZGVmaW5lIGJmZF9tYWNoX21pcHM4MDAwCQk4MDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMTAwMDAJCTEwMDAwCi0uI2RlZmluZSBiZmRfbWFjaF9taXBzMTYJCTE2Ci0uICBiZmRfYXJjaF9pMzg2LCAgICAgIHsqIEludGVsIDM4NiAqfQotLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2IDAKLS4jZGVmaW5lIGJmZF9tYWNoX2kzODZfaTgwODYgMQotLiNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCAyCi0uICBiZmRfYXJjaF93ZTMyaywgICAgIHsqIEFUJlQgV0UzMnh4eCAqfQotLiAgYmZkX2FyY2hfdGFob2UsICAgICB7KiBDQ0kvSGFycmlzIFRhaG9lICp9Ci0uICBiZmRfYXJjaF9pODYwLCAgICAgIHsqIEludGVsIDg2MCAqfQotLiAgYmZkX2FyY2hfcm9tcCwgICAgICB7KiBJQk0gUk9NUCBQQy9SVCAqfQotLiAgYmZkX2FyY2hfYWxsaWFudCwgICB7KiBBbGxpYW50ICp9Ci0uICBiZmRfYXJjaF9jb252ZXgsICAgIHsqIENvbnZleCAqfQotLiAgYmZkX2FyY2hfbTg4aywgICAgICB7KiBNb3Rvcm9sYSA4OHh4eCAqfQotLiAgYmZkX2FyY2hfcHlyYW1pZCwgICB7KiBQeXJhbWlkIFRlY2hub2xvZ3kgKn0KLS4gIGJmZF9hcmNoX2g4MzAwLCAgICAgeyogSGl0YWNoaSBIOC8zMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX2g4MzAwICAgMQotLiNkZWZpbmUgYmZkX21hY2hfaDgzMDBoICAyCi0uI2RlZmluZSBiZmRfbWFjaF9oODMwMHMgIDMKLS4gIGJmZF9hcmNoX3Bvd2VycGMsICAgeyogUG93ZXJQQyAqfQotLiAgYmZkX2FyY2hfcnM2MDAwLCAgICB7KiBJQk0gUlMvNjAwMCAqfQotLiAgYmZkX2FyY2hfaHBwYSwgICAgICB7KiBIUCBQQSBSSVNDICp9Ci0uICBiZmRfYXJjaF9kMTB2LCAgICAgIHsqIE1pdHN1YmlzaGkgRDEwViAqfQotLiAgYmZkX2FyY2hfZDMwdiwgICAgICB7KiBNaXRzdWJpc2hpIEQzMFYgKn0KLS4gIGJmZF9hcmNoX3o4aywgICAgICAgeyogWmlsb2cgWjgwMDAgKn0KLS4jZGVmaW5lIGJmZF9tYWNoX3o4MDAxCQkxCi0uI2RlZmluZSBiZmRfbWFjaF96ODAwMgkJMgotLiAgYmZkX2FyY2hfaDg1MDAsICAgICB7KiBIaXRhY2hpIEg4LzUwMCAqfQotLiAgYmZkX2FyY2hfc2gsICAgICAgICB7KiBIaXRhY2hpIFNIICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9zaCAgICAgICAgICAgIDAKLS4jZGVmaW5lIGJmZF9tYWNoX3NoMyAgICAgICAgMHgzMAotLiNkZWZpbmUgYmZkX21hY2hfc2gzZSAgICAgICAweDNlCi0uICBiZmRfYXJjaF9hbHBoYSwgICAgIHsqIERlYyBBbHBoYSAqfQotLiNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY0ICAweDEwCi0uI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjUgIDB4MjAKLS4jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NiAgMHgzMAotLiAgYmZkX2FyY2hfYXJtLCAgICAgICB7KiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqfQotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzIJCTEKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8yYQkJMgotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzMJCTMKLS4jZGVmaW5lIGJmZF9tYWNoX2FybV8zTSAJNAotLiNkZWZpbmUgYmZkX21hY2hfYXJtXzQgCQk1Ci0uI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgCTYKLS4gIGJmZF9hcmNoX25zMzJrLCAgICAgeyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMgbnMzMjAwMCAqfQotLiAgYmZkX2FyY2hfdzY1LCAgICAgICB7KiBXREMgNjU4MTYgKn0KLS4gIGJmZF9hcmNoX3RpYzMwLCAgICAgeyogVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwICp9Ci0uICBiZmRfYXJjaF90aWM4MCwgICAgIHsqIFRJIFRNUzMyMGM4MCAoTVZQKSAqfQotLiAgYmZkX2FyY2hfdjg1MCwgICAgICB7KiBORUMgVjg1MCAqfQotLiNkZWZpbmUgYmZkX21hY2hfdjg1MCAgICAgICAgICAwCi0uI2RlZmluZSBiZmRfbWFjaF92ODUwZSAJJ0UnCi0uI2RlZmluZSBiZmRfbWFjaF92ODUwZWEJJ0EnCi0uICBiZmRfYXJjaF9hcmMsICAgICAgIHsqIEFyZ29uYXV0IFJJU0MgQ29yZSAqfQotLiNkZWZpbmUgYmZkX21hY2hfYXJjX2Jhc2UgMAotLiAgYmZkX2FyY2hfbTMyciwgICAgICB7KiBNaXRzdWJpc2hpIE0zMlIvRCAqfQotLiNkZWZpbmUgYmZkX21hY2hfbTMycgkJMCB7KiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqfQotLiAgYmZkX2FyY2hfbW4xMDIwMCwgICB7KiBNYXRzdXNoaXRhIE1OMTAyMDAgKn0KLS4gIGJmZF9hcmNoX21uMTAzMDAsICAgeyogTWF0c3VzaGl0YSBNTjEwMzAwICp9Ci0uI2RlZmluZSBiZmRfbWFjaF9tbjEwMzAwCQkzMDAKLS4gIGJmZF9hcmNoX2ZyMzAsCi0uI2RlZmluZSBiZmRfbWFjaF9mcjMwCQkweDQ2NTIzMzMwCi0uICBiZmRfYXJjaF9tY29yZSwKLS4gIGJmZF9hcmNoX2xhc3QKLS4gIH07Ci0KLQotKi8KLQotLyoKLQotU1VCU0VDVElPTgotCWJmZF9hcmNoX2luZm8KLQotREVTQ1JJUFRJT04KLQlUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBhcmNoaXRlY3R1cmVzIGZvciB1c2UKLQl3aXRoaW4gQkZELgotCi0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAKLS57Ci0uICBpbnQgYml0c19wZXJfd29yZDsKLS4gIGludCBiaXRzX3Blcl9hZGRyZXNzOwotLiAgaW50IGJpdHNfcGVyX2J5dGU7Ci0uICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLS4gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLS4gIGNvbnN0IGNoYXIgKmFyY2hfbmFtZTsKLS4gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lOwotLiAgdW5zaWduZWQgaW50IHNlY3Rpb25fYWxpZ25fcG93ZXI7Ci0uIHsqIHRydWUgaWYgdGhpcyBpcyB0aGUgZGVmYXVsdCBtYWNoaW5lIGZvciB0aGUgYXJjaGl0ZWN0dXJlICp9Ci0uICBib29sZWFuIHRoZV9kZWZhdWx0OwkKLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogKCpjb21wYXRpYmxlKQotLglQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYSwKLS4JICAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmIpKTsKLS4KLS4gIGJvb2xlYW4gKCpzY2FuKSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLS4KLS4gIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICpuZXh0OwotLn0gYmZkX2FyY2hfaW5mb190eXBlOwotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYTI5a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2FyY19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJtX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMzB2X2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9oODMwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDg1MDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2hwcGFfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k4NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX20zMnJfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX202OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21pcHNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAyMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfc2hfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3NwYXJjX2FyY2g7Ci1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF90aWMzMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdGljODBfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3ZheF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3o4a19hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbnMzMmtfYXJjaDsKLWV4dGVybiBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3c2NV9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdjg1MF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZnIzMF9hcmNoOwotZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWNvcmVfYXJjaDsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0IGJmZF9hcmNodXJlc19saXN0W10gPQotewotI2lmZGVmIFNFTEVDVF9BUkNISVRFQ1RVUkVTCi0gIFNFTEVDVF9BUkNISVRFQ1RVUkVTLAotI2Vsc2UKLSAgJmJmZF9hMjlrX2FyY2gsCi0gICZiZmRfYWxwaGFfYXJjaCwKLSAgJmJmZF9hcmNfYXJjaCwKLSAgJmJmZF9hcm1fYXJjaCwKLSAgJmJmZF9kMTB2X2FyY2gsCi0gICZiZmRfZDMwdl9hcmNoLAotICAmYmZkX2g4MzAwX2FyY2gsCi0gICZiZmRfaDg1MDBfYXJjaCwKLSAgJmJmZF9ocHBhX2FyY2gsCi0gICZiZmRfaTM4Nl9hcmNoLAotICAmYmZkX2k4NjBfYXJjaCwKLSAgJmJmZF9pOTYwX2FyY2gsCi0gICZiZmRfbTMycl9hcmNoLAotICAmYmZkX202OGtfYXJjaCwKLSAgJmJmZF9tODhrX2FyY2gsCi0gICZiZmRfbWlwc19hcmNoLAotICAmYmZkX21uMTAyMDBfYXJjaCwKLSAgJmJmZF9tbjEwMzAwX2FyY2gsCi0gICZiZmRfcG93ZXJwY19hcmNoLAotICAmYmZkX3JzNjAwMF9hcmNoLAotICAmYmZkX3NoX2FyY2gsCi0gICZiZmRfc3BhcmNfYXJjaCwKLSAgJmJmZF90aWMzMF9hcmNoLAotICAmYmZkX3RpYzgwX2FyY2gsCi0gICZiZmRfdmF4X2FyY2gsCi0gICZiZmRfd2UzMmtfYXJjaCwKLSAgJmJmZF96OGtfYXJjaCwKLSAgJmJmZF9uczMya19hcmNoLAotICAmYmZkX3c2NV9hcmNoLAotICAmYmZkX3Y4NTBfYXJjaCwKLSAgJmJmZF9mcjMwX2FyY2gsCi0gICYgYmZkX21jb3JlX2FyY2gsCi0jZW5kaWYKLSAgMAotfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX3ByaW50YWJsZV9uYW1lCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX3ByaW50YWJsZV9uYW1lKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcHJpbnRhYmxlIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotCWZyb20gdGhlIHBvaW50ZXIgdG8gdGhlIGFyY2hpdGVjdHVyZSBpbmZvIHN0cnVjdHVyZS4KLQotKi8KLQotY29uc3QgY2hhciAqCi1iZmRfcHJpbnRhYmxlX25hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+cHJpbnRhYmxlX25hbWU7Ci19Ci0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2Nhbl9hcmNoCi0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiZmRfc2Nhbl9hcmNoKGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0KLURFU0NSSVBUSU9OCi0JRmlndXJlIG91dCBpZiBCRkQgc3VwcG9ydHMgYW55IGNwdSB3aGljaCBjb3VsZCBiZSBkZXNjcmliZWQgd2l0aAotCXRoZSBuYW1lIEB2YXJ7c3RyaW5nfS4gIFJldHVybiBhIHBvaW50ZXIgdG8gYW4gPDxhcmNoX2luZm8+PgotCXN0cnVjdHVyZSBpZiBhIG1hY2hpbmUgaXMgZm91bmQsIG90aGVyd2lzZSBOVUxMLgotCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX3NjYW5fYXJjaCAoc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBpbnN0YWxsZWQgYXJjaGl0ZWN0dXJlcyAqLwotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+c2NhbiAoYXAsIHN0cmluZykpCi0JICAgIHJldHVybiBhcDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfbGlzdAotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKipiZmRfYXJjaF9saXN0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIGZyZXNobHkgbWFsbG9jZWQgTlVMTC10ZXJtaW5hdGVkIHZlY3RvciBvZiB0aGUgbmFtZXMKLQlvZiBhbGwgdGhlIHZhbGlkIEJGRCBhcmNoaXRlY3R1cmVzLiAgRG8gbm90IG1vZGlmeSB0aGUgbmFtZXMuCi0KLSovCi0KLWNvbnN0IGNoYXIgKioKLWJmZF9hcmNoX2xpc3QgKCkKLXsKLSAgaW50IHZlY19sZW5ndGggPSAwOwotICBjb25zdCBjaGFyICoqbmFtZV9wdHI7Ci0gIGNvbnN0IGNoYXIgKipuYW1lX2xpc3Q7Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHA7Ci0KLSAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYXJjaGl0ZWN0dXJlcyAqLwotICB2ZWNfbGVuZ3RoID0gMDsKLSAgZm9yIChhcHAgPSBiZmRfYXJjaHVyZXNfbGlzdDsgKmFwcCAhPSBOVUxMOyBhcHArKykKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFwOwotICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCi0JewotCSAgdmVjX2xlbmd0aCsrOwotCX0KLSAgICB9Ci0KLSAgbmFtZV9saXN0ID0gKENPTlNUIGNoYXIgKiopCi0gICAgYmZkX21hbGxvYyAoKHZlY19sZW5ndGggKyAxKSAqIHNpemVvZiAoY2hhciAqKikpOwotICBpZiAobmFtZV9saXN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogUG9pbnQgdGhlIGxpc3QgYXQgZWFjaCBvZiB0aGUgbmFtZXMgKi8KLSAgbmFtZV9wdHIgPSBuYW1lX2xpc3Q7Ci0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcDsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgICpuYW1lX3B0ciA9IGFwLT5wcmludGFibGVfbmFtZTsKLQkgIG5hbWVfcHRyKys7Ci0JfQotICAgIH0KLSAgKm5hbWVfcHRyID0gTlVMTDsKLQotICByZXR1cm4gbmFtZV9saXN0OwotfQotCi0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfZ2V0X2NvbXBhdGlibGUKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9hcmNoX2dldF9jb21wYXRpYmxlKAotCQljb25zdCBiZmQgKmFiZmQsCi0JICAgICAgICBjb25zdCBiZmQgKmJiZmQpOwotCi1ERVNDUklQVElPTgotCURldGVybWluZSB3aGV0aGVyIHR3byBCRkRzJwotCWFyY2hpdGVjdHVyZXMgYW5kIG1hY2hpbmUgdHlwZXMgYXJlIGNvbXBhdGlibGUuICBDYWxjdWxhdGVzCi0JdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IgYmV0d2VlbiB0aGUgdHdvIGFyY2hpdGVjdHVyZXMKLQlhbmQgbWFjaGluZSB0eXBlcyBpbXBsaWVkIGJ5IHRoZSBCRkRzIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0bwotCWFuIDw8YXJjaF9pbmZvPj4gc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNvbXBhdGlibGUgbWFjaGluZS4KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfYXJjaF9nZXRfY29tcGF0aWJsZSAoYWJmZCwgYmJmZCkKLSAgICAgY29uc3QgYmZkICphYmZkOwotICAgICBjb25zdCBiZmQgKmJiZmQ7Ci17Ci0gIC8qIElmIGVpdGhlciBhcmNoaXRlY3R1cmUgaXMgdW5rbm93biwgdGhlbiBhbGwgd2UgY2FuIGRvIGlzIGFzc3VtZQotICAgICB0aGUgdXNlciBrbm93cyB3aGF0IGhlJ3MgZG9pbmcuICAqLwotICBpZiAoYWJmZC0+YXJjaF9pbmZvLT5hcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gIAlyZXR1cm4gYmJmZC0+YXJjaF9pbmZvOwotICBpZiAoYmJmZC0+YXJjaF9pbmZvLT5hcmNoID09IGJmZF9hcmNoX3Vua25vd24pCi0gIAlyZXR1cm4gYWJmZC0+YXJjaF9pbmZvOwotCi0gIC8qIE90aGVyd2lzZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY29kZSBoYXMgdG8gZGVjaWRlLiAgKi8KLSAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+Y29tcGF0aWJsZSAoYWJmZC0+YXJjaF9pbmZvLCBiYmZkLT5hcmNoX2luZm8pOwotfQotCi0KLS8qCi1JTlRFUk5BTF9ERUZJTklUSU9OCi0JYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3QKLQotREVTQ1JJUFRJT04KLQlUaGUgPDxiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdD4+IGlzIGFuIGl0ZW0gb2YKLQk8PGJmZF9hcmNoX2luZm9fdHlwZT4+IHdoaWNoIGhhcyBiZWVuIGluaXRpYWxpemVkIHRvIGEgZmFpcmx5Ci0JZ2VuZXJpYyBzdGF0ZS4gIEEgQkZEIHN0YXJ0cyBsaWZlIGJ5IHBvaW50aW5nIHRvIHRoaXMKLQlzdHJ1Y3R1cmUsIHVudGlsIHRoZSBjb3JyZWN0IGJhY2sgZW5kIGhhcyBkZXRlcm1pbmVkIHRoZSByZWFsCi0JYXJjaGl0ZWN0dXJlIG9mIHRoZSBmaWxlLgotCi0uZXh0ZXJuIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLQotKi8KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0ID0KLXsKLSAgICAzMiwzMiw4LGJmZF9hcmNoX3Vua25vd24sMCwidW5rbm93biIsInVua25vd24iLDIsdHJ1ZSwKLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4sIAotICAgIDAsCi19OwotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2FyY2hfaW5mbwotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9hcmNoX2luZm8oYmZkICphYmZkLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyZyk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBvZiBAdmFye2FiZmR9IHRvIEB2YXJ7YXJnfS4KLSovCi0KLXZvaWQKLWJmZF9zZXRfYXJjaF9pbmZvIChhYmZkLCBhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmc7Ci17Ci0gIGFiZmQtPmFyY2hfaW5mbyA9IGFyZzsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChiZmQgKmFiZmQsCi0JCWVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQl1bnNpZ25lZCBsb25nIG1hY2gpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgaW4gQkZEIEB2YXJ7YWJmZH0KLQl0byBAdmFye2FyY2h9IGFuZCBAdmFye21hY2h9LiAgRmluZCB0aGUgY29ycmVjdAotCXBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBpdCBpbnRvIHRoZSA8PGFyY2hfaW5mbz4+Ci0JcG9pbnRlci4gCi0qLwotCi1ib29sZWFuCi1iZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGNvbnN0ICphcHAsICphcDsKLQotICBmb3IgKGFwcCA9IGJmZF9hcmNodXJlc19saXN0OyAqYXBwICE9IE5VTEw7IGFwcCsrKQotICAgIHsKLSAgICAgIGZvciAoYXAgPSAqYXBwOyBhcCAhPSBOVUxMOyBhcCA9IGFwLT5uZXh0KQotCXsKLQkgIGlmIChhcC0+YXJjaCA9PSBhcmNoCi0JICAgICAgJiYgKGFwLT5tYWNoID09IG1hY2gKLQkJICB8fCAobWFjaCA9PSAwICYmIGFwLT50aGVfZGVmYXVsdCkpKQotCSAgICB7Ci0JICAgICAgYWJmZC0+YXJjaF9pbmZvID0gYXA7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGFiZmQtPmFyY2hfaW5mbyA9ICZiZmRfZGVmYXVsdF9hcmNoX3N0cnVjdDsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2FyY2gKLQotU1lOT1BTSVMKLQllbnVtIGJmZF9hcmNoaXRlY3R1cmUgYmZkX2dldF9hcmNoKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBlbnVtZXJhdGVkIHR5cGUgd2hpY2ggZGVzY3JpYmVzIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlLgotCi0qLwotCi1lbnVtIGJmZF9hcmNoaXRlY3R1cmUKLWJmZF9nZXRfYXJjaCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICAgIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmFyY2g7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfbWFjaAotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGxvbmcgYmZkX2dldF9tYWNoKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBsb25nIHR5cGUgd2hpY2ggZGVzY3JpYmVzIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JbWFjaGluZS4KLSovCi0KLXVuc2lnbmVkIGxvbmcgIAotYmZkX2dldF9tYWNoIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gICAgcmV0dXJuIGFiZmQtPmFyY2hfaW5mby0+bWFjaDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2FyY2hfYml0c19wZXJfYnl0ZQotCi1TWU5PUFNJUwotCXVuc2lnbmVkIGludCBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBvbmUgb2YgdGhlIEJGRCBAdmFye2FiZmR9J3MKLQlhcmNoaXRlY3R1cmUncyBieXRlcy4KLQotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmJpdHNfcGVyX2J5dGU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyhiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gb25lIG9mIHRoZSBCRkQgQHZhcnthYmZkfSdzCi0JYXJjaGl0ZWN0dXJlJ3MgYWRkcmVzc2VzLgotKi8KLQotdW5zaWduZWQgaW50Ci1iZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBhYmZkLT5hcmNoX2luZm8tPmJpdHNfcGVyX2FkZHJlc3M7Ci19Ci0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OIAotCWJmZF9kZWZhdWx0X2NvbXBhdGlibGUKLQotU1lOT1BTSVMKLQljb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmJmZF9kZWZhdWx0X2NvbXBhdGlibGUKLQkoY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphLAotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYik7Ci0KLURFU0NSSVBUSU9OCi0JVGhlIGRlZmF1bHQgZnVuY3Rpb24gZm9yIHRlc3RpbmcgZm9yIGNvbXBhdGliaWxpdHkuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYS0+bWFjaCA+IGItPm1hY2gpCi0gICAgcmV0dXJuIGE7Ci0KLSAgaWYgKGItPm1hY2ggPiBhLT5tYWNoKQotICAgIHJldHVybiBiOwotCi0gIHJldHVybiBhOwotfQotCi0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9kZWZhdWx0X3NjYW4KLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9kZWZhdWx0X3NjYW4oY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnN0cmluZyk7Ci0KLURFU0NSSVBUSU9OCi0JVGhlIGRlZmF1bHQgZnVuY3Rpb24gZm9yIHdvcmtpbmcgb3V0IHdoZXRoZXIgdGhpcyBpcyBhbgotCWFyY2hpdGVjdHVyZSBoaXQgYW5kIGEgbWFjaGluZSBoaXQuCi0qLwotCi1ib29sZWFuIAotYmZkX2RlZmF1bHRfc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBjb25zdCBjaGFyICpwdHJfc3JjOwotICBjb25zdCBjaGFyICpwdHJfdHN0OwotICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGNvbnN0IGNoYXIgKnByaW50YWJsZV9uYW1lX2NvbG9uOwotCi0gIC8qIEV4YWN0IG1hdGNoIG9mIHRoZSBhcmNoaXRlY3R1cmUgbmFtZSAoQVJDSF9OQU1FKSBhbmQgYWxzbyB0aGUKLSAgICAgZGVmYXVsdCBhcmNoaXRlY3R1cmU/ICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPmFyY2hfbmFtZSkgPT0gMAotICAgICAgJiYgaW5mby0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRXhhY3QgbWF0Y2ggb2YgdGhlIG1hY2hpbmUgbmFtZSAoUFJJTlRBQkxFX05BTUUpPyAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgICAgCi0gIC8qIEdpdmVuIHRoYXQgcHJpbnRhYmxlX25hbWUgY29udGFpbnMgbm8gY29sb24sIGF0dGVtcHQgdG8gbWF0Y2g6Ci0gICAgIEFSQ0hfTkFNRSBbICI6IiBdIFBSSU5UQUJMRV9OQU1FPyAqLwotICBwcmludGFibGVfbmFtZV9jb2xvbiA9IHN0cmNociAoaW5mby0+cHJpbnRhYmxlX25hbWUsICc6Jyk7Ci0gIGlmIChwcmludGFibGVfbmFtZV9jb2xvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGludCBzdHJsZW5fYXJjaF9uYW1lID0gc3RybGVuIChpbmZvLT5hcmNoX25hbWUpOwotICAgICAgaWYgKHN0cm5jYXNlY21wIChzdHJpbmcsIGluZm8tPmFyY2hfbmFtZSwgc3RybGVuX2FyY2hfbmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoc3RyaW5nW3N0cmxlbl9hcmNoX25hbWVdID09ICc6JykKLQkgICAgewotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcgKyBzdHJsZW5fYXJjaF9uYW1lICsgMSwKLQkJCSAgICAgIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZyArIHN0cmxlbl9hcmNoX25hbWUsCi0JCQkgICAgICBpbmZvLT5wcmludGFibGVfbmFtZSkgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEdpdmVuIHRoYXQgUFJJTlRBQkxFX05BTUUgaGFzIHRoZSBmb3JtOiA8YXJjaD4gIjoiIDxtYWNoPjsKLSAgICAgQXR0ZW1wdCB0byBtYXRjaDogPGFyY2g+IDxtYWNoPj8gKi8KLSAgaWYgKHByaW50YWJsZV9uYW1lX2NvbG9uICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGNvbG9uX2luZGV4ID0gcHJpbnRhYmxlX25hbWVfY29sb24gLSBpbmZvLT5wcmludGFibGVfbmFtZTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoc3RyaW5nLCBpbmZvLT5wcmludGFibGVfbmFtZSwgY29sb25faW5kZXgpID09IDAKLQkgICYmIHN0cmNhc2VjbXAgKHN0cmluZyArIGNvbG9uX2luZGV4LAotCQkJIGluZm8tPnByaW50YWJsZV9uYW1lICsgY29sb25faW5kZXggKyAxKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBHaXZlbiB0aGF0IFBSSU5UQUJMRV9OQU1FIGhhcyB0aGUgZm9ybTogPGFyY2g+ICI6IiA8bWFjaD47IERvIG5vdAotICAgICBhdHRlbXB0IHRvIG1hdGNoIGp1c3QgPG1hY2g+LCBpdCBjb3VsZCBiZSBhbWJpZ2lvdXMuICBUaGlzIHRlc3QKLSAgICAgaXMgbGVmdCB1bnRpbCBsYXRlci4gKi8KLQotICAvKiBOT1RFOiBUaGUgYmVsb3cgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgb25seS4gUGxlYXNlIGRvIG5vdAotICAgICBhZGQgdG8gdGhpcyBjb2RlICovCi0KLSAgLyogU2VlIGhvdyBtdWNoIG9mIHRoZSBzdXBwbGllZCBzdHJpbmcgbWF0Y2hlcyB3aXRoIHRoZQotICAgICBhcmNoaXRlY3R1cmUsIGVnIHRoZSBzdHJpbmcgbTY4azo2ODAyMCB3b3VsZCBtYXRjaCB0aGUgNjhrIGVudHJ5Ci0gICAgIHVwIHRvIHRoZSA6LCB0aGVuIHdlIGdldCBsZWZ0IHdpdGggdGhlIG1hY2hpbmUgbnVtYmVyICovCi0KLSAgZm9yIChwdHJfc3JjID0gc3RyaW5nLCBwdHJfdHN0ID0gaW5mby0+YXJjaF9uYW1lOyAKLSAgICAgICAqcHRyX3NyYyAmJiAqcHRyX3RzdDsKLSAgICAgICBwdHJfc3JjKyssIHB0cl90c3QrKykgCi0gICAgewotICAgICAgaWYgKCpwdHJfc3JjICE9ICpwdHJfdHN0KSBicmVhazsKLSAgICB9Ci0KLSAgLyogQ2hld2VkIHVwIGFzIG11Y2ggb2YgdGhlIGFyY2hpdGVjdHVyZSBhcyB3aWxsIG1hdGNoLCBza2lwIGFueQotICAgICBjb2xvbnMgKi8KLSAgaWYgKCpwdHJfc3JjID09ICc6JykKLSAgICBwdHJfc3JjKys7Ci0gIAotICBpZiAoKnB0cl9zcmMgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBub3RoaW5nIG1vcmUsIHRoZW4gb25seSBrZWVwIHRoaXMgb25lIGlmIGl0IGlzIHRoZSBkZWZhdWx0Ci0JIG1hY2hpbmUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gICAgfQotCi0gIG51bWJlciA9IDA7Ci0gIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnB0cl9zcmMpKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgKnB0cl9zcmMgIC0gJzAnOwotICAgICAgcHRyX3NyYysrOwotICAgIH0KLQotICAvKiBOT1RFOiBUaGUgYmVsb3cgaXMgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkgb25seS4KLSAgICAgUExFQVNFIERPIE5PVCBBREQgVE8gVEhJUyBDT0RFLiAqLwotCi0gIHN3aXRjaCAobnVtYmVyKSAKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhlc2UgYXJlIG5lZWRlZCB0byBwYXJzZSBJRUVFIG9iamVjdHMuICAqLwotICAgIGNhc2UgNjgwMDA6IAotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDEwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDIwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDMwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwMzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDQwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwNDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MDYwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9tNjgwNjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY4MzMyOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX202OGs7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9jcHUzMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMjAwMDoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF93ZTMyazsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzMDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9taXBzMzAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0MDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBudW1iZXIgPSBiZmRfbWFjaF9taXBzNDAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA2MDAwOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXJjaCAhPSBpbmZvLT5hcmNoKSAKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG51bWJlciAhPSBpbmZvLT5tYWNoKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2FyY2hfaW5mbwotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGJmZF9nZXRfYXJjaF9pbmZvKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBhcmNoaXRlY3R1cmUgaW5mbyBzdHJ1Y3QgaW4gQHZhcnthYmZkfS4KLSovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+YXJjaF9pbmZvOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9sb29rdXBfYXJjaAotCi1TWU5PUFNJUwotCWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYmZkX2xvb2t1cF9hcmNoCi0JCShlbnVtIGJmZF9hcmNoaXRlY3R1cmUKLQkJYXJjaCwKLQkJdW5zaWduZWQgbG9uZyBtYWNoaW5lKTsKLQotREVTQ1JJUFRJT04KLQlMb29rIGZvciB0aGUgYXJjaGl0ZWN1cmUgaW5mbyBzdHJ1Y3R1cmUgd2hpY2ggbWF0Y2hlcyB0aGUKLQlhcmd1bWVudHMgQHZhcnthcmNofSBhbmQgQHZhcnttYWNoaW5lfS4gQSBtYWNoaW5lIG9mIDAgbWF0Y2hlcyB0aGUKLQltYWNoaW5lL2FyY2hpdGVjdHVyZSBzdHJ1Y3R1cmUgd2hpY2ggbWFya3MgaXRzZWxmIGFzIHRoZQotCWRlZmF1bHQuCi0qLwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiAKLWJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaGluZSkKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogY29uc3QgKmFwcCwgKmFwOwotCi0gIGZvciAoYXBwID0gYmZkX2FyY2h1cmVzX2xpc3Q7ICphcHAgIT0gTlVMTDsgYXBwKyspCi0gICAgewotICAgICAgZm9yIChhcCA9ICphcHA7IGFwICE9IE5VTEw7IGFwID0gYXAtPm5leHQpCi0JewotCSAgaWYgKGFwLT5hcmNoID09IGFyY2gKLQkgICAgICAmJiAoYXAtPm1hY2ggPT0gbWFjaGluZQotCQkgIHx8IChtYWNoaW5lID09IDAgJiYgYXAtPnRoZV9kZWZhdWx0KSkpCi0JICAgIHJldHVybiBhcDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludGFibGVfYXJjaF9tYWNoCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX3ByaW50YWJsZV9hcmNoX21hY2gKLQkJKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2hpbmUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHByaW50YWJsZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBhcmNoaXRlY3R1cmUgYW5kCi0JbWFjaGluZSB0eXBlLiAKLQotCVRoaXMgcm91dGluZSBpcyBkZXByZWNpYXRlZC4KLSovCi0KLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGFyY2gsIG1hY2hpbmUpCi0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcCA9IGJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaGluZSk7Ci0KLSAgICBpZiAoYXApCi0gICAgICByZXR1cm4gYXAtPnByaW50YWJsZV9uYW1lOwotICAgIHJldHVybiAiVU5LTk9XTiEiOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2JmZC1pbi5oIGIvYmZkL2JmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yzk4M2JhLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDczNiArMCwwIEBACi0vKiBNYWluIGhlYWRlciBmaWxlIGZvciB0aGUgYmZkIGxpYnJhcnkgLS0gcG9ydGFibGUgYWNjZXNzIHRvIG9iamVjdCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGJmZC5oIGFuZCBiZmQtaW4yLmggYXJlIEdFTkVSQVRFRCBmaWxlcy4gIERvbid0IGNoYW5nZSB0aGVtOwotKiogaW5zdGVhZCwgY2hhbmdlIGJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bwotKiogZ2VuZXJhdGUgdGhlc2UgZmlsZXMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogYmZkLmggLS0gVGhlIG9ubHkgaGVhZGVyIGZpbGUgcmVxdWlyZWQgYnkgdXNlcnMgb2YgdGhlIGJmZCBsaWJyYXJ5IAotCi1UaGUgYmZkLmggZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBiZmQtaW4uaCBhbmQgdmFyaW91cyAuYyBmaWxlczsgaWYgeW91Ci1jaGFuZ2UgaXQsIHlvdXIgY2hhbmdlcyB3aWxsIHByb2JhYmx5IGJlIGxvc3QuCi0KLUFsbCB0aGUgcHJvdG90eXBlcyBhbmQgZGVmaW5pdGlvbnMgZm9sbG93aW5nIHRoZSBjb21tZW50ICJUSEUgRk9MTE9XSU5HCi1JUyBFWFRSQUNURUQgRlJPTSBUSEUgU09VUkNFIiBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIHNvdXJjZSBmaWxlcyBmb3IKLUJGRC4gIElmIHlvdSBjaGFuZ2UgaXQsIHNvbWVvbmUgb25lZGF5IHdpbGwgZXh0cmFjdCBpdCBmcm9tIHRoZSBzb3VyY2UKLWFnYWluLCBhbmQgeW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4gIFRvIHNhdmUgeW91cnNlbGYgZnJvbSB0aGlzIGJpbmQsCi1jaGFuZ2UgdGhlIGRlZmluaXRpb25zIGluIHRoZSBzb3VyY2UgaW4gdGhlIGJmZCBkaXJlY3RvcnkuICBUeXBlICJtYWtlCi1kb2NzIiBhbmQgdGhlbiAibWFrZSBoZWFkZXJzIiBpbiB0aGF0IGRpcmVjdG9yeSwgYW5kIG1hZ2ljYWxseSB0aGlzIGZpbGUKLXdpbGwgY2hhbmdlIHRvIHJlZmxlY3QgeW91ciBjaGFuZ2VzLgotCi1JZiB5b3UgZG9uJ3QgaGF2ZSB0aGUgdG9vbHMgdG8gcGVyZm9ybSB0aGUgZXh0cmFjdGlvbiwgdGhlbiB5b3UgYXJlCi1zYWZlIGZyb20gc29tZW9uZSBvbiB5b3VyIHN5c3RlbSB0cmFtcGxpbmcgb3ZlciB5b3VyIGhlYWRlciBmaWxlcy4KLVlvdSBzaG91bGQgc3RpbGwgbWFpbnRhaW4gdGhlIGVxdWl2YWxlbmNlIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGhpcwotZmlsZSB0aG91Z2g7IGV2ZXJ5IGNoYW5nZSB5b3UgbWFrZSB0byB0aGUgLmMgZmlsZSBzaG91bGQgYmUgcmVmbGVjdGVkCi1oZXJlLiAgKi8KLQotI2lmbmRlZiBfX0JGRF9IX1NFRU5fXwotI2RlZmluZSBfX0JGRF9IX1NFRU5fXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0vKiBUaGVzZSB0d28gbGluZXMgZ2V0IHN1YnN0aXR1dGlvbnMgZG9uZSBieSBjb21tYW5kcyBpbiBNYWtlZmlsZS5pbi4gICovCi0jZGVmaW5lIEJGRF9WRVJTSU9OICAiQFZFUlNJT05AIgotI2RlZmluZSBCRkRfQVJDSF9TSVpFIEB3b3Jkc2l6ZUAKLSNkZWZpbmUgQkZEX0hPU1RfNjRCSVRfTE9ORyBAQkZEX0hPU1RfNjRCSVRfTE9OR0AKLSNpZiBAQkZEX0hPU1RfNjRfQklUX0RFRklORURACi0jZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBAQkZEX0hPU1RfNjRfQklUQAotI2RlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCBAQkZEX0hPU1RfVV82NF9CSVRACi0jZW5kaWYKLQotI2lmIEJGRF9BUkNIX1NJWkUgPj0gNjQKLSNkZWZpbmUgQkZENjQKLSNlbmRpZgotCi0jaWZuZGVmIElOTElORQotI2lmIF9fR05VQ19fID49IDIKLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmCi0jZW5kaWYKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2JmZCBiZmQ7Ci0KLS8qIFRvIHNxdWVsY2ggZXJyb25lb3VzIGNvbXBpbGVyIHdhcm5pbmdzICgiaWxsZWdhbCBwb2ludGVyCi0gICBjb21iaW5hdGlvbiIpIGZyb20gdGhlIFNWUjMgY29tcGlsZXIsIHdlIHdvdWxkIGxpa2UgdG8gdHlwZWRlZgotICAgYm9vbGVhbiB0byBpbnQgKGl0IGRvZXNuJ3QgbGlrZSBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGJvb2xlYW4uCi0gICBNYWtpbmcgc3VyZSB0aGV5IGFyZSBuZXZlciBpbXBsaWNpdGx5IGRlY2xhcmVkIHRvIHJldHVybiBpbnQKLSAgIGRvZXNuJ3Qgc2VlbSB0byBoZWxwKS4gIEJ1dCB0aGlzIGZpbGUgaXMgbm90IGNvbmZpZ3VyZWQgYmFzZWQgb24KLSAgIHRoZSBob3N0LiAgKi8KLS8qIEdlbmVyYWwgcnVsZXM6IGZ1bmN0aW9ucyB3aGljaCBhcmUgYm9vbGVhbiByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzCi0gICBhbmQgZmFsc2Ugb24gZmFpbHVyZSAodW5sZXNzIHRoZXkncmUgYSBwcmVkaWNhdGUpLiAgIC0tIGJmZC5kb2MgKi8KLS8qIEknbSBzdXJlIHRoaXMgaXMgZ29pbmcgdG8gYnJlYWsgc29tZXRoaW5nIGFuZCBzb21lb25lIGlzIGdvaW5nIHRvCi0gICBmb3JjZSBtZSB0byBjaGFuZ2UgaXQuICovCi0vKiB0eXBlZGVmIGVudW0gYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47ICovCi0vKiBZdXAsIFNWUjQgaGFzIGEgInR5cGVkZWYgZW51bSBib29sZWFuIiBpbiA8c3lzL3R5cGVzLmg+ICAtZm5mICovCi0vKiBJdCBnZXRzIHdvcnNlIGlmIHRoZSBob3N0IGFsc28gZGVmaW5lcyBhIHRydWUvZmFsc2UgZW51bS4uLiAtc3RzICovCi0vKiBBbmQgZXZlbiB3b3JzZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBidWlsdC1pbiBib29sZWFuIHR5cGVzLi4uIC1sYXcgKi8KLSNpZiBkZWZpbmVkIChfX0dOVUdfXykgJiYgKF9fR05VQ19NSU5PUl9fID4gNSkKLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZgotI2lmZGVmIE1QVwotLyogUHJlLWVtcHRpdmUgc3RyaWtlIC0gZ2V0IHRoZSBmaWxlIHdpdGggdGhlIGVudW0uICovCi0jaW5jbHVkZSA8VHlwZXMuaD4KLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZiAvKiBNUFcgKi8KLSNpZm5kZWYgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLXR5cGVkZWYgZW51bSBiZmRfYm9vbGVhbiB7ZmFsc2UsIHRydWV9IGJvb2xlYW47Ci0jZGVmaW5lIEJGRF9UUlVFX0ZBTFNFCi0jZWxzZQotLyogVXNlIGVudW0gbmFtZXMgdGhhdCB3aWxsIGFwcGVhciBub3doZXJlIGVsc2UuICAqLwotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtiZmRfZmZmYWxzZSwgYmZkX3R0dHJ1ZX0gYm9vbGVhbjsKLSNlbmRpZgotCi0vKiBBIHBvaW50ZXIgdG8gYSBwb3NpdGlvbiBpbiBhIGZpbGUuICAqLwotLyogRklYTUU6ICBUaGlzIHNob3VsZCBiZSB1c2luZyBvZmZfdCBmcm9tIDxzeXMvdHlwZXMuaD4uCi0gICBGb3Igbm93LCB0cnkgdG8gYXZvaWQgYnJlYWtpbmcgc3R1ZmYgYnkgbm90IGluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IGhlcmUuCi0gICBUaGlzIHdpbGwgYnJlYWsgb24gc3lzdGVtcyB3aXRoIDY0LWJpdCBmaWxlIG9mZnNldHMgKGUuZy4gNC40QlNEKS4KLSAgIFByb2JhYmx5IHRoZSBiZXN0IGxvbmctdGVybSBhbnN3ZXIgaXMgdG8gYXZvaWQgdXNpbmcgZmlsZV9wdHIgQU5EIG9mZl90IAotICAgaW4gdGhpcyBoZWFkZXIgZmlsZSwgYW5kIHRvIGhhbmRsZSB0aGlzIGluIHRoZSBCRkQgaW1wbGVtZW50YXRpb24KLSAgIHJhdGhlciB0aGFuIGluIGl0cyBpbnRlcmZhY2UuICAqLwotLyogdHlwZWRlZiBvZmZfdAlmaWxlX3B0cjsgKi8KLXR5cGVkZWYgbG9uZyBpbnQgZmlsZV9wdHI7Ci0KLS8qIFN1cHBvcnQgZm9yIGRpZmZlcmVudCBzaXplcyBvZiB0YXJnZXQgZm9ybWF0IGludHMgYW5kIGFkZHJlc3Nlcy4KLSAgIElmIHRoZSB0eXBlIGBsb25nJyBpcyBhdCBsZWFzdCA2NCBiaXRzLCBCRkRfSE9TVF82NEJJVF9MT05HIHdpbGwgYmUKLSAgIHNldCB0byAxIGFib3ZlLiAgT3RoZXJ3aXNlLCBpZiBnY2MgaXMgYmVpbmcgdXNlZCwgdGhpcyBjb2RlIHdpbGwKLSAgIHVzZSBnY2MncyAibG9uZyBsb25nIiB0eXBlLiAgT3RoZXJ3aXNlLCBCRkRfSE9TVF82NF9CSVQgbXVzdCBiZQotICAgZGVmaW5lZCBhYm92ZS4gICovCi0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0jIGlmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSMgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZwotIyAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcKLSMgZWxzZQotIyAgaWZkZWYgX19HTlVDX18KLSMgICBpZiBfX0dOVUNfXyA+PSAyCi0jICAgIGRlZmluZSBCRkRfSE9TVF82NF9CSVQgbG9uZyBsb25nCi0jICAgIGRlZmluZSBCRkRfSE9TVF9VXzY0X0JJVCB1bnNpZ25lZCBsb25nIGxvbmcKLSMgICBlbmRpZiAvKiBfX0dOVUNfXyA+PSAyICovCi0jICBlbmRpZiAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwotIyBlbmRpZiAvKiAhIEJGRF9IT1NUXzY0QklUX0xPTkcgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotI2lmZGVmIEJGRDY0Ci0KLSNpZm5kZWYgQkZEX0hPU1RfNjRfQklUCi0gI2Vycm9yIE5vIDY0IGJpdCBpbnRlZ2VyIHR5cGUgYXZhaWxhYmxlCi0jZW5kaWYgLyogISBkZWZpbmVkIChCRkRfSE9TVF82NF9CSVQpICovCi0KLXR5cGVkZWYgQkZEX0hPU1RfVV82NF9CSVQgYmZkX3ZtYTsKLXR5cGVkZWYgQkZEX0hPU1RfNjRfQklUIGJmZF9zaWduZWRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfc2l6ZV90eXBlOwotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBzeW12YWx1ZTsKLQotI2lmbmRlZiBmcHJpbnRmX3ZtYQotI2lmIEJGRF9IT1NUXzY0QklUX0xPTkcKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkKLSNkZWZpbmUgZnByaW50Zl92bWEoZix4KSBmcHJpbnRmIChmLCAiJTAxNmx4IiwgeCkKLSNlbHNlCi0jZGVmaW5lIF9iZmRfaW50NjRfbG93KHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgJiAweGZmZmZmZmZmKSkpCi0jZGVmaW5lIF9iZmRfaW50NjRfaGlnaCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKQotI2RlZmluZSBmcHJpbnRmX3ZtYShzLHgpIFwKLSAgZnByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBcCi0gIHNwcmludGYgKChzKSwgIiUwOGx4JTA4bHgiLCBfYmZkX2ludDY0X2hpZ2ggKHgpLCBfYmZkX2ludDY0X2xvdyAoeCkpCi0jZW5kaWYKLSNlbmRpZgotCi0jZWxzZSAvKiBub3QgQkZENjQgICovCi0KLS8qIFJlcHJlc2VudCBhIHRhcmdldCBhZGRyZXNzLiAgQWxzbyB1c2VkIGFzIGEgZ2VuZXJpYyB1bnNpZ25lZCB0eXBlCi0gICB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkgYXJpdGhtZXRpYyB0eXBlcwotICAgd2UgbmVlZCB0byBkZWFsIHdpdGguICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF92bWE7Ci0KLS8qIEEgZ2VuZXJpYyBzaWduZWQgdHlwZSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGJpZyBlbm91Z2ggdG8gaG9sZCBhbnkKLSAgIGFyaXRobWV0aWMgdHlwZXMgd2UgbmVlZCB0byBkZWFsIHdpdGguICBDYW4gYmUgYXNzdW1lZCB0byBiZSBjb21wYXRpYmxlCi0gICB3aXRoIGJmZF92bWEgaW4gdGhlIHNhbWUgd2F5IHRoYXQgc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRzIGFyZSBjb21wYXRpYmxlCi0gICAoYXMgcGFyYW1ldGVycywgaW4gYXNzaWdubWVudCwgZXRjKS4gICovCi10eXBlZGVmIGxvbmcgYmZkX3NpZ25lZF92bWE7Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW12YWx1ZTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBiZmRfc2l6ZV90eXBlOwotCi0vKiBQcmludCBhIGJmZF92bWEgeCBvbiBzdHJlYW0gcy4gICovCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgZnByaW50ZihzLCAiJTA4bHgiLCB4KQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYocywgIiUwOGx4IiwgeCkKLQotI2VuZGlmIC8qIG5vdCBCRkQ2NCAgKi8KLQotI2RlZmluZSBwcmludGZfdm1hKHgpIGZwcmludGZfdm1hKHN0ZG91dCx4KQotCi10eXBlZGVmIHVuc2lnbmVkIGludCBmbGFnd29yZDsJLyogMzIgYml0cyBvZiBmbGFncyAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJmZF9ieXRlOwotDAotLyoqIEZpbGUgZm9ybWF0cyAqLwotCi10eXBlZGVmIGVudW0gYmZkX2Zvcm1hdCB7Ci0JICAgICAgYmZkX3Vua25vd24gPSAwLAkvKiBmaWxlIGZvcm1hdCBpcyB1bmtub3duICovCi0JICAgICAgYmZkX29iamVjdCwJLyogbGlua2VyL2Fzc2VtYmVyL2NvbXBpbGVyIG91dHB1dCAqLwotCSAgICAgIGJmZF9hcmNoaXZlLAkvKiBvYmplY3QgYXJjaGl2ZSBmaWxlICovCi0JICAgICAgYmZkX2NvcmUsCQkvKiBjb3JlIGR1bXAgKi8KLQkgICAgICBiZmRfdHlwZV9lbmR9CS8qIG1hcmtzIHRoZSBlbmQ7IGRvbid0IHVzZSBpdCEgKi8KLSAgICAgICAgIGJmZF9mb3JtYXQ7Ci0KLS8qIFZhbHVlcyB0aGF0IG1heSBhcHBlYXIgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIGEgQkZELiAgVGhlc2UgYWxzbwotICAgYXBwZWFyIGluIHRoZSBvYmplY3RfZmxhZ3MgZmllbGQgb2YgdGhlIGJmZF90YXJnZXQgc3RydWN0dXJlLCB3aGVyZQotICAgdGhleSBpbmRpY2F0ZSB0aGUgc2V0IG9mIGZsYWdzIHVzZWQgYnkgdGhhdCBiYWNrZW5kIChub3QgYWxsIGZsYWdzCi0gICBhcmUgbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlIGZvcm1hdHMpIChGSVhNRTogYXQgdGhlIG1vbWVudCwKLSAgIHRoZSBvYmplY3RfZmxhZ3MgdmFsdWVzIGhhdmUgbW9zdGx5IGp1c3QgYmVlbiBjb3BpZWQgZnJvbSBiYWNrZW5kCi0gICB0byBhbm90aGVyLCBhbmQgYXJlIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0KS4gICovCi0KLS8qIE5vIGZsYWdzLiAgKi8KLSNkZWZpbmUgQkZEX05PX0ZMQUdTICAgCTB4MDAKLQotLyogQkZEIGNvbnRhaW5zIHJlbG9jYXRpb24gZW50cmllcy4gICovCi0jZGVmaW5lIEhBU19SRUxPQyAgIAkweDAxCi0KLS8qIEJGRCBpcyBkaXJlY3RseSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgRVhFQ19QICAgICAgCTB4MDIKLQotLyogQkZEIGhhcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTE5OTyBpbiBhCi0gICBDT0ZGIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTElORU5PICAJMHgwNAotCi0vKiBCRkQgaGFzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIEhBU19ERUJVRyAgIAkweDA4Ci0KLS8qIEJGRCBoYXMgc3ltYm9scy4gICovCi0jZGVmaW5lIEhBU19TWU1TICAgIAkweDEwCi0KLS8qIEJGRCBoYXMgbG9jYWwgc3ltYm9scyAoYmFzaWNhbGx5IHVzZWQgZm9yIEZfTFNZTVMgaW4gYSBDT0ZGCi0gICBoZWFkZXIpLiAgKi8KLSNkZWZpbmUgSEFTX0xPQ0FMUyAgCTB4MjAKLQotLyogQkZEIGlzIGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBEWU5BTUlDICAgICAJMHg0MAotCi0vKiBUZXh0IHNlY3Rpb24gaXMgd3JpdGUgcHJvdGVjdGVkIChpZiBEX1BBR0VEIGlzIG5vdCBzZXQsIHRoaXMgaXMKLSAgIGxpa2UgYW4gYS5vdXQgTk1BR0lDIGZpbGUpICh0aGUgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQKLSAgIGNsZWFycyBpdCBmb3IgLXIgb3IgLU4pLiAgKi8KLSNkZWZpbmUgV1BfVEVYVCAgICAgCTB4ODAKLQotLyogQkZEIGlzIGR5bmFtaWNhbGx5IHBhZ2VkICh0aGlzIGlzIGxpa2UgYW4gYS5vdXQgWk1BR0lDIGZpbGUpICh0aGUKLSAgIGxpbmtlciBzZXRzIHRoaXMgYnkgZGVmYXVsdCwgYnV0IGNsZWFycyBpdCBmb3IgLXIgb3IgLW4gb3IgLU4pLiAgKi8KLSNkZWZpbmUgRF9QQUdFRCAgICAgCTB4MTAwCi0KLS8qIEJGRCBpcyByZWxheGFibGUgKHRoaXMgbWVhbnMgdGhhdCBiZmRfcmVsYXhfc2VjdGlvbiBtYXkgYmUgYWJsZSB0bwotICAgZG8gc29tZXRoaW5nKSAoc29tZXRpbWVzIGJmZF9yZWxheF9zZWN0aW9uIGNhbiBkbyBzb21ldGhpbmcgZXZlbiBpZgotICAgdGhpcyBpcyBub3Qgc2V0KS4gICovCi0jZGVmaW5lIEJGRF9JU19SRUxBWEFCTEUgMHgyMDAKLQotLyogVGhpcyBtYXkgYmUgc2V0IGJlZm9yZSB3cml0aW5nIG91dCBhIEJGRCB0byByZXF1ZXN0IHVzaW5nIGEKLSAgIHRyYWRpdGlvbmFsIGZvcm1hdC4gIEZvciBleGFtcGxlLCB0aGlzIGlzIHVzZWQgdG8gcmVxdWVzdCB0aGF0IHdoZW4KLSAgIHdyaXRpbmcgb3V0IGFuIGEub3V0IG9iamVjdCB0aGUgc3ltYm9scyBub3QgYmUgaGFzaGVkIHRvIGVsaW1pbmF0ZQotICAgZHVwbGljYXRlcy4gICovCi0jZGVmaW5lIEJGRF9UUkFESVRJT05BTF9GT1JNQVQgMHg0MDAKLQotLyogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBCRkQgY29udGVudHMgYXJlIGFjdHVhbGx5IGNhY2hlZCBpbgotICAgbWVtb3J5LiAgSWYgdGhpcyBpcyBzZXQsIGlvc3RyZWFtIHBvaW50cyB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKi8KLSNkZWZpbmUgQkZEX0lOX01FTU9SWSAweDgwMAotDAotLyogc3ltYm9scyBhbmQgcmVsb2NhdGlvbiAqLwotCi0vKiBBIGNvdW50IG9mIGNhcnN5bXMgKGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbHMpLiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBzeW1pbmRleDsKLQotLyogSG93IHRvIHBlcmZvcm0gYSByZWxvY2F0aW9uLiAgKi8KLXR5cGVkZWYgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCByZWxvY19ob3d0b190eXBlOwotCi0jZGVmaW5lIEJGRF9OT19NT1JFX1NZTUJPTFMgKChzeW1pbmRleCkgfjApCi0KLS8qIEdlbmVyYWwgcHVycG9zZSBwYXJ0IG9mIGEgc3ltYm9sIFg7Ci0gICB0YXJnZXQgc3BlY2lmaWMgcGFydHMgYXJlIGluIGxpYmNvZmYuaCwgbGliYW91dC5oLCBldGMuICAqLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbih4KSAoKHgpLT5zZWN0aW9uKQotI2RlZmluZSBiZmRfZ2V0X291dHB1dF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb24oeCx5KSAoKHgpLT5zZWN0aW9uKSA9ICh5KQotI2RlZmluZSBiZmRfYXN5bWJvbF9iYXNlKHgpICgoeCktPnNlY3Rpb24tPnZtYSkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfdmFsdWUoeCkgKGJmZF9hc3ltYm9sX2Jhc2UoeCkgKyAoeCktPnZhbHVlKQotI2RlZmluZSBiZmRfYXN5bWJvbF9uYW1lKHgpICgoeCktPm5hbWUpCi0vKlBlcmhhcHMgZnV0dXJlOiAjZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT5zZWN0aW9uLT5vd25lcikqLwotI2RlZmluZSBiZmRfYXN5bWJvbF9iZmQoeCkgKCh4KS0+dGhlX2JmZCkKLSNkZWZpbmUgYmZkX2FzeW1ib2xfZmxhdm91cih4KSAoYmZkX2FzeW1ib2xfYmZkKHgpLT54dmVjLT5mbGF2b3VyKQotCi0vKiBBIGNhbm9uaWNhbCBhcmNoaXZlIHN5bWJvbC4gICovCi0vKiBUaGlzIGlzIGEgdHlwZSBwdW4gd2l0aCBzdHJ1Y3QgcmFubGliIG9uIHB1cnBvc2UhICovCi10eXBlZGVmIHN0cnVjdCBjYXJzeW0gewotICBjaGFyICpuYW1lOwotICBmaWxlX3B0ciBmaWxlX29mZnNldDsJCS8qIGxvb2sgaGVyZSB0byBmaW5kIHRoZSBmaWxlICovCi19IGNhcnN5bTsJCQkvKiB0byBtYWtlIHRoZXNlIHlvdSBjYWxsIGEgY2Fyc3ltb2dlbiAqLwotCi0gIAotLyogVXNlZCBpbiBnZW5lcmF0aW5nIGFybWFwcyAoYXJjaGl2ZSB0YWJsZXMgb2YgY29udGVudHMpLgotICAgUGVyaGFwcyBqdXN0IGEgZm9yd2FyZCBkZWZpbml0aW9uIHdvdWxkIGRvPyAqLwotc3RydWN0IG9ybCB7CQkJLyogb3V0cHV0IHJhbmxpYiAqLwotICBjaGFyICoqbmFtZTsJCQkvKiBzeW1ib2wgbmFtZSAqLyAKLSAgZmlsZV9wdHIgcG9zOwkJCS8qIGJmZCogb3IgZmlsZSBwb3NpdGlvbiAqLwotICBpbnQgbmFtaWR4OwkJCS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlICovCi19OwotDAotCi0vKiBMaW5lbnVtYmVyIHN0dWZmICovCi10eXBlZGVmIHN0cnVjdCBsaW5lbm9fY2FjaGVfZW50cnkgewotICB1bnNpZ25lZCBpbnQgbGluZV9udW1iZXI7CS8qIExpbmVudW1iZXIgZnJvbSBzdGFydCBvZiBmdW5jdGlvbiovICAKLSAgdW5pb24gewotICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bTsgLyogRnVuY3Rpb24gbmFtZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBPZmZzZXQgaW50byBzZWN0aW9uICovCi0gIH0gdTsKLX0gYWxlbnQ7Ci0MCi0vKiBvYmplY3QgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0jZGVmaW5lCWFsaWduX3Bvd2VyKGFkZHIsIGFsaWduKQlcCi0JKCAoKGFkZHIpICsgKCgxPDwoYWxpZ24pKS0xKSkgJiAoLTEgPDwgKGFsaWduKSkpCi0KLXR5cGVkZWYgc3RydWN0IHNlYyAqc2VjX3B0cjsKLQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lICsgMCkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyKSAoKHB0ciktPmFsaWdubWVudF9wb3dlciArIDApCi0jZGVmaW5lIGJmZF9zZWN0aW9uX25hbWUoYmZkLCBwdHIpICgocHRyKS0+bmFtZSkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fc2l6ZShiZmQsIHB0cikgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhwdHIpKQotI2RlZmluZSBiZmRfc2VjdGlvbl92bWEoYmZkLCBwdHIpICgocHRyKS0+dm1hKQotI2RlZmluZSBiZmRfc2VjdGlvbl9sbWEoYmZkLCBwdHIpICgocHRyKS0+bG1hKQotI2RlZmluZSBiZmRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MoYmZkLCBwdHIpICgocHRyKS0+ZmxhZ3MgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIpICgocHRyKS0+dXNlcmRhdGEpCi0KLSNkZWZpbmUgYmZkX2lzX2NvbV9zZWN0aW9uKHB0cikgKCgocHRyKS0+ZmxhZ3MgJiBTRUNfSVNfQ09NTU9OKSAhPSAwKQotCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl92bWEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dm1hID0gKHB0ciktPmxtYT0gKHZhbCkpLCAoKHB0ciktPnVzZXJfc2V0X3ZtYSA9IChib29sZWFuKXRydWUpLCB0cnVlKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGJmZCwgcHRyLCB2YWwpICgoKHB0ciktPmFsaWdubWVudF9wb3dlciA9ICh2YWwpKSx0cnVlKQotI2RlZmluZSBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+dXNlcmRhdGEgPSAodmFsKSksdHJ1ZSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc3RhdCBzdGF0X3R5cGU7IAotDAotdHlwZWRlZiBlbnVtIGJmZF9wcmludF9zeW1ib2wKLXsgCi0gIGJmZF9wcmludF9zeW1ib2xfbmFtZSwKLSAgYmZkX3ByaW50X3N5bWJvbF9tb3JlLAotICBiZmRfcHJpbnRfc3ltYm9sX2FsbAotfSBiZmRfcHJpbnRfc3ltYm9sX3R5cGU7Ci0gICAgCi0vKiBJbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbCB0aGF0IG5tIG5lZWRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3N5bWJvbF9pbmZvCi17Ci0gIHN5bXZhbHVlIHZhbHVlOwotICBjaGFyIHR5cGU7Ci0gIENPTlNUIGNoYXIgKm5hbWU7ICAgICAgICAgICAgLyogU3ltYm9sIG5hbWUuICAqLwotICB1bnNpZ25lZCBjaGFyIHN0YWJfdHlwZTsgICAgIC8qIFN0YWIgdHlwZS4gICovCi0gIGNoYXIgc3RhYl9vdGhlcjsgICAgICAgICAgICAgLyogU3RhYiBvdGhlci4gKi8KLSAgc2hvcnQgc3RhYl9kZXNjOyAgICAgICAgICAgICAvKiBTdGFiIGRlc2MuICAqLwotICBDT05TVCBjaGFyICpzdGFiX25hbWU7ICAgICAgIC8qIFN0cmluZyBmb3Igc3RhYiB0eXBlLiAgKi8KLX0gc3ltYm9sX2luZm87Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIHN0YWJzIHR5cGUgY29kZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZ2V0X3N0YWJfbmFtZSBQQVJBTVMgKChpbnQpKTsKLQwKLS8qIEhhc2ggdGFibGUgcm91dGluZXMuICBUaGVyZSBpcyBubyB3YXkgdG8gZnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotCi0vKiBBbiBlbGVtZW50IGluIHRoZSBoYXNoIHRhYmxlLiAgTW9zdCB1c2VzIHdpbGwgYWN0dWFsbHkgdXNlIGEgbGFyZ2VyCi0gICBzdHJ1Y3R1cmUsIGFuZCBhbiBpbnN0YW5jZSBvZiB0aGlzIHdpbGwgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5Ci17Ci0gIC8qIE5leHQgZW50cnkgZm9yIHRoaXMgaGFzaCBjb2RlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpuZXh0OwotICAvKiBTdHJpbmcgYmVpbmcgaGFzaGVkLiAgKi8KLSAgY29uc3QgY2hhciAqc3RyaW5nOwotICAvKiBIYXNoIGNvZGUuICBUaGlzIGlzIHRoZSBmdWxsIGhhc2ggY29kZSwgbm90IHRoZSBpbmRleCBpbnRvIHRoZQotICAgICB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLX07Ci0KLS8qIEEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF90YWJsZQotewotICAvKiBUaGUgaGFzaCBhcnJheS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKnRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgbmV3IGVsZW1lbnRzIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlCi0gICAgIGZpcnN0IGVudHJ5IGlzIGl0c2VsZiBhIHBvaW50ZXIgdG8gYW4gZWxlbWVudC4gIFdoZW4gdGhpcwotICAgICBmdW5jdGlvbiBpcyBmaXJzdCBpbnZva2VkLCB0aGlzIHBvaW50ZXIgd2lsbCBiZSBOVUxMLiAgSG93ZXZlciwKLSAgICAgaGF2aW5nIHRoZSBwb2ludGVyIHBlcm1pdHMgYSBoaWVyYXJjaHkgb2YgbWV0aG9kIGZ1bmN0aW9ucyB0byBiZQotICAgICBidWlsdCBlYWNoIG9mIHdoaWNoIGNhbGxzIHRoZSBmdW5jdGlvbiBpbiB0aGUgc3VwZXJjbGFzcy4gIFRodXMKLSAgICAgZWFjaCBmdW5jdGlvbiBzaG91bGQgYmUgd3JpdHRlbiB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBvZiBtZW1vcnkKLSAgICAgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgTlVMTC4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJICAgICBjb25zdCBjaGFyICopKTsKLSAgIC8qIEFuIG9iamFsbG9jIGZvciB0aGlzIGhhc2ggdGFibGUuICBUaGlzIGlzIGEgc3RydWN0IG9iamFsbG9jICosCi0gICAgIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mIG9iamFsbG9jLmguICAqLwotICBQVFIgbWVtb3J5OwotfTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopKSk7Ci0KLS8qIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIHNwZWNpZnlpbmcgYSBzaXplLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9oYXNoX3RhYmxlX2luaXRfbgotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJICAgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICopLAotCSAgIHVuc2lnbmVkIGludCBzaXplKSk7Ci0KLS8qIEZyZWUgdXAgYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3RhYmxlX2ZyZWUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopKTsKLQotLyogTG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUuICBJZiBDUkVBVEUgaXMgdHJ1ZSwgYSBuZXcgZW50cnkKLSAgIHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhpcyBzdHJpbmcgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuICBUaGUKLSAgIENPUFkgYXJndW1lbnQgbXVzdCBiZSB0cnVlIGlmIHRoaXMgcm91dGluZSBzaG91bGQgY29weSB0aGUgc3RyaW5nCi0gICBpbnRvIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgd2hlbiBhZGRpbmcgYW4gZW50cnkuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY3JlYXRlLAotCSAgIGJvb2xlYW4gY29weSkpOwotCi0vKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBiZmRfaGFzaF9yZXBsYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm9sZCwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm53KSk7Ci0KLS8qIEJhc2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqYmZkX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdyYWIgc29tZSBzcGFjZSBmb3IgYSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLWV4dGVybiBQVFIgYmZkX2hhc2hfYWxsb2NhdGUgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgdW5zaWduZWQgaW50KSk7Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZSBpbiBhIHJhbmRvbSBvcmRlciwgY2FsbGluZyBhIGZ1bmN0aW9uIG9uIGVhY2gKLSAgIGVsZW1lbnQuICBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlIHRyYXZlcnNhbCBzdG9wcy4gIFRoZQotICAgSU5GTyBhcmd1bWVudCBpcyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3RyYXZlcnNlIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCSAgICAgICBib29sZWFuICgqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQkgICAgUFRSKSwKLQkJCQkgICAgICAgUFRSIGluZm8pKTsKLQwKLS8qIFNlbWktcG9ydGFibGUgc3RyaW5nIGNvbmNhdGVuYXRpb24gaW4gY3BwLgotICAgVGhlIENBVDQgaGFjayBpcyB0byBhdm9pZCBhIHByb2JsZW0gd2l0aCBzb21lIHN0cmljdCBBTlNJIEMgcHJlcHJvY2Vzc29ycy4KLSAgIFRoZSBwcm9ibGVtIGlzLCAiMzJfIiBpcyBub3QgYSB2YWxpZCBwcmVwcm9jZXNzaW5nIHRva2VuLCBhbmQgd2UgZG9uJ3QKLSAgIHdhbnQgZXh0cmEgdW5kZXJzY29yZXMgKGUuZy4sICJubG1fMzJfIikuICBUaGUgWENBVDIgbWFjcm8gd2lsbCBjYXVzZSB0aGUKLSAgIGlubmVyIENBVCBtYWNyb3MgdG8gYmUgZXZhbHVhdGVkIGZpcnN0LCBwcm9kdWNpbmcgc3RpbGwtdmFsaWQgcHAtdG9rZW5zLgotICAgVGhlbiB0aGUgZmluYWwgY29uY2F0ZW5hdGlvbiBjYW4gYmUgZG9uZS4gIChTaWdoLikgICovCi0jaWZuZGVmIENBVAotI2lmZGVmIFNBQkVSCi0jZGVmaW5lIENBVChhLGIpCWEjI2IKLSNkZWZpbmUgQ0FUMyhhLGIsYykJYSMjYiMjYwotI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEjI2IjI2MjI2QKLSNlbHNlCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLSNkZWZpbmUgQ0FUKGEsYikgYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKSBhIyNiIyNjCi0jZGVmaW5lIFhDQVQyKGEsYikJQ0FUKGEsYikKLSNkZWZpbmUgQ0FUNChhLGIsYyxkKQlYQ0FUMihDQVQoYSxiKSxDQVQoYyxkKSkKLSNlbHNlCi0jZGVmaW5lIENBVChhLGIpIGEvKiovYgotI2RlZmluZSBDQVQzKGEsYixjKSBhLyoqL2IvKiovYwotI2RlZmluZSBDQVQ0KGEsYixjLGQpCWEvKiovYi8qKi9jLyoqL2QKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBDT0ZGX1NXQVBfVEFCTEUgKFBUUikgJmJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlCi0MCi0vKiBVc2VyIHByb2dyYW0gYWNjZXNzIHRvIEJGRCBmYWNpbGl0aWVzICovCi0KLS8qIERpcmVjdCBJL08gcm91dGluZXMsIGZvciBwcm9ncmFtcyB3aGljaCBrbm93IG1vcmUgYWJvdXQgdGhlIG9iamVjdAotICAgZmlsZSB0aGFuIEJGRCBkb2VzLiAgVXNlIGhpZ2hlciBsZXZlbCByb3V0aW5lcyBpZiBwb3NzaWJsZS4gICovCi0KLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9yZWFkCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpemVfdHlwZSBzaXplLCBiZmRfc2l6ZV90eXBlIG5pdGVtcywgYmZkICphYmZkKSk7Ci1leHRlcm4gYmZkX3NpemVfdHlwZSBiZmRfd3JpdGUKLSAgUEFSQU1TICgoY29uc3QgUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX3NlZWsgUEFSQU1TICgoYmZkICphYmZkLCBmaWxlX3B0ciBmcCwgaW50IGRpcmVjdGlvbikpOwotZXh0ZXJuIGxvbmcgYmZkX3RlbGwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gaW50IGJmZF9mbHVzaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX3N0YXQgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLQotLyogQ2FzdCBmcm9tIGNvbnN0IGNoYXIgKiB0byBjaGFyICogc28gdGhhdCBjYWxsZXIgY2FuIGFzc2lnbiB0bwotICAgYSBjaGFyICogd2l0aG91dCBhIHdhcm5pbmcuICAqLwotI2RlZmluZSBiZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpICgoY2hhciAqKSAoYWJmZCktPmZpbGVuYW1lKQotI2RlZmluZSBiZmRfZ2V0X2NhY2hlYWJsZShhYmZkKSAoKGFiZmQpLT5jYWNoZWFibGUpCi0jZGVmaW5lIGJmZF9nZXRfZm9ybWF0KGFiZmQpICgoYWJmZCktPmZvcm1hdCkKLSNkZWZpbmUgYmZkX2dldF90YXJnZXQoYWJmZCkgKChhYmZkKS0+eHZlYy0+bmFtZSkKLSNkZWZpbmUgYmZkX2dldF9mbGF2b3VyKGFiZmQpICgoYWJmZCktPnh2ZWMtPmZsYXZvdXIpCi0jZGVmaW5lIGJmZF9iaWdfZW5kaWFuKGFiZmQpICgoYWJmZCktPnh2ZWMtPmJ5dGVvcmRlciA9PSBCRkRfRU5ESUFOX0JJRykKLSNkZWZpbmUgYmZkX2xpdHRsZV9lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQotI2RlZmluZSBiZmRfaGVhZGVyX2JpZ19lbmRpYW4oYWJmZCkgXAotICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4oYWJmZCkgXAotICAoKGFiZmQpLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyID09IEJGRF9FTkRJQU5fTElUVExFKQotI2RlZmluZSBiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+ZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+b2JqZWN0X2ZsYWdzKQotI2RlZmluZSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzKGFiZmQpICgoYWJmZCktPnh2ZWMtPnNlY3Rpb25fZmxhZ3MpCi0jZGVmaW5lIGJmZF9teV9hcmNoaXZlKGFiZmQpICgoYWJmZCktPm15X2FyY2hpdmUpCi0jZGVmaW5lIGJmZF9oYXNfbWFwKGFiZmQpICgoYWJmZCktPmhhc19hcm1hcCkKLQotI2RlZmluZSBiZmRfdmFsaWRfcmVsb2NfdHlwZXMoYWJmZCkgKChhYmZkKS0+eHZlYy0+dmFsaWRfcmVsb2NfdHlwZXMpCi0jZGVmaW5lIGJmZF91c3JkYXRhKGFiZmQpICgoYWJmZCktPnVzcmRhdGEpCi0KLSNkZWZpbmUgYmZkX2dldF9zdGFydF9hZGRyZXNzKGFiZmQpICgoYWJmZCktPnN0YXJ0X2FkZHJlc3MpCi0jZGVmaW5lIGJmZF9nZXRfc3ltY291bnQoYWJmZCkgKChhYmZkKS0+c3ltY291bnQpCi0jZGVmaW5lIGJmZF9nZXRfb3V0c3ltYm9scyhhYmZkKSAoKGFiZmQpLT5vdXRzeW1ib2xzKQotI2RlZmluZSBiZmRfY291bnRfc2VjdGlvbnMoYWJmZCkgKChhYmZkKS0+c2VjdGlvbl9jb3VudCkKLQotI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+c3ltYm9sX2xlYWRpbmdfY2hhcikKLQotI2RlZmluZSBiZmRfc2V0X2NhY2hlYWJsZShhYmZkLGJvb2wpICgoKGFiZmQpLT5jYWNoZWFibGUgPSAoYm9vbGVhbikoYm9vbCkpLCB0cnVlKQotCi1leHRlcm4gYm9vbGVhbiBiZmRfcmVjb3JkX3BoZHIKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sIGZsYWd3b3JkLCBib29sZWFuLCBiZmRfdm1hLAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBCeXRlIHN3YXBwaW5nIHJvdXRpbmVzLiAgKi8KLQotYmZkX3ZtYQkJYmZkX2dldGI2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEgCWJmZF9nZXRsNjQJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfNjQgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0YjMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGwzMgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF8zMiBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDE2CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzE2IFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGI2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsNjQJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGwzMgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDE2CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotDAotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbzsKLXN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwOwotc3RydWN0IGVjb2ZmX2V4dHI7Ci1zdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Owotc3RydWN0IGJmZF9saW5rX2luZm87Ci1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeTsKLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZTsKLSNlbmRpZgotZXh0ZXJuIGJmZF92bWEgYmZkX2Vjb2ZmX2dldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3ZtYSBncF92YWx1ZSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgZ3BybWFzaywgdW5zaWduZWQgbG9uZyBmcHJtYXNrLAotCSAgIHVuc2lnbmVkIGxvbmcgKmNwcm1hc2spKTsKLWV4dGVybiBQVFIgYmZkX2Vjb2ZmX2RlYnVnX2luaXQKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWNvZmZfZGVidWdfZnJlZQotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgYmZkICppbnB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlcgotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLCBiZmQgKmlucHV0X2JmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwLAotCSAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotCSAgIGJvb2xlYW4gKCpnZXRfZXh0cikgKHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwKLQkJCQlzdHJ1Y3QgZWNvZmZfZXh0ciAqKSwKLQkgICB2b2lkICgqc2V0X2luZGV4KSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJICAgICAgYmZkX3NpemVfdHlwZSkpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGVjb2ZmX2V4dHIgKmVzeW0pKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF9lY29mZl9kZWJ1Z19zaXplCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfZGVidWcKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsIGZpbGVfcHRyIHdoZXJlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGZpbGVfcHRyIHdoZXJlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICosIHN0cnVjdCBzZWMgKiwKLQkgICBjaGFyICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBFTEYgcm91dGluZXMuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZXh0OwotICBiZmQgKmJ5OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqYmZkX2VsZl9nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqYmZkX2VsZl9nZXRfZHRfc29uYW1lIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3Vub3Nfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3Qgc2VjICoqLCBzdHJ1Y3Qgc2VjICoqLAotCSAgIHN0cnVjdCBzZWMgKiopKTsKLQotLyogTGludXggc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBib29sZWFuIGJmZF9pMzg2bGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIG1tYXAgaGFja3MgKi8KLQotc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsOwotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgYmZkX3dpbmRvd19pbnRlcm5hbDsKLQotdHlwZWRlZiBzdHJ1Y3QgX2JmZF93aW5kb3cgewotICAvKiBXaGF0IHRoZSB1c2VyIGFza2VkIGZvci4gICovCi0gIFBUUiBkYXRhOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIFRoZSBhY3R1YWwgd2luZG93IHVzZWQgYnkgQkZELiAgU21hbGwgdXNlci1yZXF1ZXN0ZWQgcmVhZC1vbmx5Ci0gICAgIHJlZ2lvbnMgc2hhcmluZyBhIHBhZ2UgbWF5IHNoYXJlIGEgc2luZ2xlIHdpbmRvdyBpbnRvIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gIFJlYWQtd3JpdGUgdmVyc2lvbnMgc2hvdWxkbid0IHVudGlsIEkndmUgZml4ZWQgdGhpbmdzIHRvCi0gICAgIGtlZXAgdHJhY2sgb2Ygd2hpY2ggcG9ydGlvbnMgaGF2ZSBiZWVuIGNsYWltZWQgYnkgdGhlCi0gICAgIGFwcGxpY2F0aW9uOyBkb24ndCB3YW50IHRvIGdpdmUgdGhlIHNhbWUgcmVnaW9uIGJhY2sgd2hlbiB0aGUKLSAgICAgYXBwbGljYXRpb24gd2FudHMgdHdvIHdyaXRhYmxlIGNvcGllcyEgICovCi0gIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCAqaTsKLX0gYmZkX3dpbmRvdzsKLQotZXh0ZXJuIHZvaWQgYmZkX2luaXRfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2ZyZWVfd2luZG93IFBBUkFNUyAoKGJmZF93aW5kb3cgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dldF9maWxlX3dpbmRvdwotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGJmZF93aW5kb3cgKiwgYm9vbGVhbikpOwotCi0vKiBYQ09GRiBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBib29sZWFuLAotCSAgIGludCwgYm9vbGVhbiwgYm9vbGVhbiwgc3RydWN0IHNlYyAqKikpOwotCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgQ09GRiByb3V0aW5lcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGludGVybmFsX3N5bWVudDsKLXVuaW9uIGludGVybmFsX2F1eGVudDsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfc3ltZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9nZXRfYXV4ZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIGludCwgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGludCkpOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotZXh0ZXJuIGJvb2xlYW4gYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogRUxGIEFSTSBJbnRlcndvcmtpbmcgc3VwcG9ydC4gIENhbGxlZCBmcm9tIGxpbmtlci4gICovCi0gIGV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gICAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotIAotICBleHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7Ci0gCi0gIGV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgZnJvbSB0aGUgc291cmNlLiAgKi8KZGlmZiAtLWdpdCBhL2JmZC9iZmQtaW4yLmggYi9iZmQvYmZkLWluMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTVjZWUyLi4wMDAwMDAwCi0tLSBhL2JmZC9iZmQtaW4yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIxICswLDAgQEAKLS8qIE1haW4gaGVhZGVyIGZpbGUgZm9yIHRoZSBiZmQgbGlicmFyeSAtLSBwb3J0YWJsZSBhY2Nlc3MgdG8gb2JqZWN0IGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLQotKiogTk9URTogYmZkLmggYW5kIGJmZC1pbjIuaCBhcmUgR0VORVJBVEVEIGZpbGVzLiAgRG9uJ3QgY2hhbmdlIHRoZW07Ci0qKiBpbnN0ZWFkLCBjaGFuZ2UgYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGVzZSBmaWxlcy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBiZmQuaCAtLSBUaGUgb25seSBoZWFkZXIgZmlsZSByZXF1aXJlZCBieSB1c2VycyBvZiB0aGUgYmZkIGxpYnJhcnkgCi0KLVRoZSBiZmQuaCBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIGJmZC1pbi5oIGFuZCB2YXJpb3VzIC5jIGZpbGVzOyBpZiB5b3UKLWNoYW5nZSBpdCwgeW91ciBjaGFuZ2VzIHdpbGwgcHJvYmFibHkgYmUgbG9zdC4KLQotQWxsIHRoZSBwcm90b3R5cGVzIGFuZCBkZWZpbml0aW9ucyBmb2xsb3dpbmcgdGhlIGNvbW1lbnQgIlRIRSBGT0xMT1dJTkcKLUlTIEVYVFJBQ1RFRCBGUk9NIFRIRSBTT1VSQ0UiIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgc291cmNlIGZpbGVzIGZvcgotQkZELiAgSWYgeW91IGNoYW5nZSBpdCwgc29tZW9uZSBvbmVkYXkgd2lsbCBleHRyYWN0IGl0IGZyb20gdGhlIHNvdXJjZQotYWdhaW4sIGFuZCB5b3VyIGNoYW5nZXMgd2lsbCBiZSBsb3N0LiAgVG8gc2F2ZSB5b3Vyc2VsZiBmcm9tIHRoaXMgYmluZCwKLWNoYW5nZSB0aGUgZGVmaW5pdGlvbnMgaW4gdGhlIHNvdXJjZSBpbiB0aGUgYmZkIGRpcmVjdG9yeS4gIFR5cGUgIm1ha2UKLWRvY3MiIGFuZCB0aGVuICJtYWtlIGhlYWRlcnMiIGluIHRoYXQgZGlyZWN0b3J5LCBhbmQgbWFnaWNhbGx5IHRoaXMgZmlsZQotd2lsbCBjaGFuZ2UgdG8gcmVmbGVjdCB5b3VyIGNoYW5nZXMuCi0KLUlmIHlvdSBkb24ndCBoYXZlIHRoZSB0b29scyB0byBwZXJmb3JtIHRoZSBleHRyYWN0aW9uLCB0aGVuIHlvdSBhcmUKLXNhZmUgZnJvbSBzb21lb25lIG9uIHlvdXIgc3lzdGVtIHRyYW1wbGluZyBvdmVyIHlvdXIgaGVhZGVyIGZpbGVzLgotWW91IHNob3VsZCBzdGlsbCBtYWludGFpbiB0aGUgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0aGlzCi1maWxlIHRob3VnaDsgZXZlcnkgY2hhbmdlIHlvdSBtYWtlIHRvIHRoZSAuYyBmaWxlIHNob3VsZCBiZSByZWZsZWN0ZWQKLWhlcmUuICAqLwotCi0jaWZuZGVmIF9fQkZEX0hfU0VFTl9fCi0jZGVmaW5lIF9fQkZEX0hfU0VFTl9fCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFRoZXNlIHR3byBsaW5lcyBnZXQgc3Vic3RpdHV0aW9ucyBkb25lIGJ5IGNvbW1hbmRzIGluIE1ha2VmaWxlLmluLiAgKi8KLSNkZWZpbmUgQkZEX1ZFUlNJT04gICJAVkVSU0lPTkAiCi0jZGVmaW5lIEJGRF9BUkNIX1NJWkUgQHdvcmRzaXplQAotI2RlZmluZSBCRkRfSE9TVF82NEJJVF9MT05HIEBCRkRfSE9TVF82NEJJVF9MT05HQAotI2lmIEBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAKLSNkZWZpbmUgQkZEX0hPU1RfNjRfQklUIEBCRkRfSE9TVF82NF9CSVRACi0jZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIEBCRkRfSE9TVF9VXzY0X0JJVEAKLSNlbmRpZgotCi0jaWYgQkZEX0FSQ0hfU0laRSA+PSA2NAotI2RlZmluZSBCRkQ2NAotI2VuZGlmCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWYgX19HTlVDX18gPj0gMgotI2RlZmluZSBJTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi10eXBlZGVmIHN0cnVjdCBfYmZkIGJmZDsKLQotLyogVG8gc3F1ZWxjaCBlcnJvbmVvdXMgY29tcGlsZXIgd2FybmluZ3MgKCJpbGxlZ2FsIHBvaW50ZXIKLSAgIGNvbWJpbmF0aW9uIikgZnJvbSB0aGUgU1ZSMyBjb21waWxlciwgd2Ugd291bGQgbGlrZSB0byB0eXBlZGVmCi0gICBib29sZWFuIHRvIGludCAoaXQgZG9lc24ndCBsaWtlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gYm9vbGVhbi4KLSAgIE1ha2luZyBzdXJlIHRoZXkgYXJlIG5ldmVyIGltcGxpY2l0bHkgZGVjbGFyZWQgdG8gcmV0dXJuIGludAotICAgZG9lc24ndCBzZWVtIHRvIGhlbHApLiAgQnV0IHRoaXMgZmlsZSBpcyBub3QgY29uZmlndXJlZCBiYXNlZCBvbgotICAgdGhlIGhvc3QuICAqLwotLyogR2VuZXJhbCBydWxlczogZnVuY3Rpb25zIHdoaWNoIGFyZSBib29sZWFuIHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MKLSAgIGFuZCBmYWxzZSBvbiBmYWlsdXJlICh1bmxlc3MgdGhleSdyZSBhIHByZWRpY2F0ZSkuICAgLS0gYmZkLmRvYyAqLwotLyogSSdtIHN1cmUgdGhpcyBpcyBnb2luZyB0byBicmVhayBzb21ldGhpbmcgYW5kIHNvbWVvbmUgaXMgZ29pbmcgdG8KLSAgIGZvcmNlIG1lIHRvIGNoYW5nZSBpdC4gKi8KLS8qIHR5cGVkZWYgZW51bSBib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsgKi8KLS8qIFl1cCwgU1ZSNCBoYXMgYSAidHlwZWRlZiBlbnVtIGJvb2xlYW4iIGluIDxzeXMvdHlwZXMuaD4gIC1mbmYgKi8KLS8qIEl0IGdldHMgd29yc2UgaWYgdGhlIGhvc3QgYWxzbyBkZWZpbmVzIGEgdHJ1ZS9mYWxzZSBlbnVtLi4uIC1zdHMgKi8KLS8qIEFuZCBldmVuIHdvcnNlIGlmIHlvdXIgY29tcGlsZXIgaGFzIGJ1aWx0LWluIGJvb2xlYW4gdHlwZXMuLi4gLWxhdyAqLwotI2lmIGRlZmluZWQgKF9fR05VR19fKSAmJiAoX19HTlVDX01JTk9SX18gPiA1KQotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmCi0jaWZkZWYgTVBXCi0vKiBQcmUtZW1wdGl2ZSBzdHJpa2UgLSBnZXQgdGhlIGZpbGUgd2l0aCB0aGUgZW51bS4gKi8KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2RlZmluZSBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotI2VuZGlmIC8qIE1QVyAqLwotI2lmbmRlZiBUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRAotdHlwZWRlZiBlbnVtIGJmZF9ib29sZWFuIHtmYWxzZSwgdHJ1ZX0gYm9vbGVhbjsKLSNkZWZpbmUgQkZEX1RSVUVfRkFMU0UKLSNlbHNlCi0vKiBVc2UgZW51bSBuYW1lcyB0aGF0IHdpbGwgYXBwZWFyIG5vd2hlcmUgZWxzZS4gICovCi10eXBlZGVmIGVudW0gYmZkX2Jvb2xlYW4ge2JmZF9mZmZhbHNlLCBiZmRfdHR0cnVlfSBib29sZWFuOwotI2VuZGlmCi0KLS8qIEEgcG9pbnRlciB0byBhIHBvc2l0aW9uIGluIGEgZmlsZS4gICovCi0vKiBGSVhNRTogIFRoaXMgc2hvdWxkIGJlIHVzaW5nIG9mZl90IGZyb20gPHN5cy90eXBlcy5oPi4KLSAgIEZvciBub3csIHRyeSB0byBhdm9pZCBicmVha2luZyBzdHVmZiBieSBub3QgaW5jbHVkaW5nIDxzeXMvdHlwZXMuaD4gaGVyZS4KLSAgIFRoaXMgd2lsbCBicmVhayBvbiBzeXN0ZW1zIHdpdGggNjQtYml0IGZpbGUgb2Zmc2V0cyAoZS5nLiA0LjRCU0QpLgotICAgUHJvYmFibHkgdGhlIGJlc3QgbG9uZy10ZXJtIGFuc3dlciBpcyB0byBhdm9pZCB1c2luZyBmaWxlX3B0ciBBTkQgb2ZmX3QgCi0gICBpbiB0aGlzIGhlYWRlciBmaWxlLCBhbmQgdG8gaGFuZGxlIHRoaXMgaW4gdGhlIEJGRCBpbXBsZW1lbnRhdGlvbgotICAgcmF0aGVyIHRoYW4gaW4gaXRzIGludGVyZmFjZS4gICovCi0vKiB0eXBlZGVmIG9mZl90CWZpbGVfcHRyOyAqLwotdHlwZWRlZiBsb25nIGludCBmaWxlX3B0cjsKLQotLyogU3VwcG9ydCBmb3IgZGlmZmVyZW50IHNpemVzIG9mIHRhcmdldCBmb3JtYXQgaW50cyBhbmQgYWRkcmVzc2VzLgotICAgSWYgdGhlIHR5cGUgYGxvbmcnIGlzIGF0IGxlYXN0IDY0IGJpdHMsIEJGRF9IT1NUXzY0QklUX0xPTkcgd2lsbCBiZQotICAgc2V0IHRvIDEgYWJvdmUuICBPdGhlcndpc2UsIGlmIGdjYyBpcyBiZWluZyB1c2VkLCB0aGlzIGNvZGUgd2lsbAotICAgdXNlIGdjYydzICJsb25nIGxvbmciIHR5cGUuICBPdGhlcndpc2UsIEJGRF9IT1NUXzY0X0JJVCBtdXN0IGJlCi0gICBkZWZpbmVkIGFib3ZlLiAgKi8KLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSMgaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotIyAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nCi0jICBkZWZpbmUgQkZEX0hPU1RfVV82NF9CSVQgdW5zaWduZWQgbG9uZwotIyBlbHNlCi0jICBpZmRlZiBfX0dOVUNfXwotIyAgIGlmIF9fR05VQ19fID49IDIKLSMgICAgZGVmaW5lIEJGRF9IT1NUXzY0X0JJVCBsb25nIGxvbmcKLSMgICAgZGVmaW5lIEJGRF9IT1NUX1VfNjRfQklUIHVuc2lnbmVkIGxvbmcgbG9uZwotIyAgIGVuZGlmIC8qIF9fR05VQ19fID49IDIgKi8KLSMgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19HTlVDX18pICovCi0jIGVuZGlmIC8qICEgQkZEX0hPU1RfNjRCSVRfTE9ORyAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0hPU1RfNjRfQklUKSAqLwotCi0jaWZkZWYgQkZENjQKLQotI2lmbmRlZiBCRkRfSE9TVF82NF9CSVQKLSAjZXJyb3IgTm8gNjQgYml0IGludGVnZXIgdHlwZSBhdmFpbGFibGUKLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9IT1NUXzY0X0JJVCkgKi8KLQotdHlwZWRlZiBCRkRfSE9TVF9VXzY0X0JJVCBiZmRfdm1hOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgYmZkX3NpZ25lZF92bWE7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIGJmZF9zaXplX3R5cGU7Ci10eXBlZGVmIEJGRF9IT1NUX1VfNjRfQklUIHN5bXZhbHVlOwotCi0jaWZuZGVmIGZwcmludGZfdm1hCi0jaWYgQkZEX0hPU1RfNjRCSVRfTE9ORwotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIHNwcmludGYgKHMsICIlMDE2bHgiLCB4KQotI2RlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KQotI2Vsc2UKLSNkZWZpbmUgX2JmZF9pbnQ2NF9sb3coeCkgKCh1bnNpZ25lZCBsb25nKSAoKCh4KSAmIDB4ZmZmZmZmZmYpKSkKLSNkZWZpbmUgX2JmZF9pbnQ2NF9oaWdoKHgpICgodW5zaWduZWQgbG9uZykgKCgoeCkgPj4gMzIpICYgMHhmZmZmZmZmZikpCi0jZGVmaW5lIGZwcmludGZfdm1hKHMseCkgXAotICBmcHJpbnRmICgocyksICIlMDhseCUwOGx4IiwgX2JmZF9pbnQ2NF9oaWdoICh4KSwgX2JmZF9pbnQ2NF9sb3cgKHgpKQotI2RlZmluZSBzcHJpbnRmX3ZtYShzLHgpIFwKLSAgc3ByaW50ZiAoKHMpLCAiJTA4bHglMDhseCIsIF9iZmRfaW50NjRfaGlnaCAoeCksIF9iZmRfaW50NjRfbG93ICh4KSkKLSNlbmRpZgotI2VuZGlmCi0KLSNlbHNlIC8qIG5vdCBCRkQ2NCAgKi8KLQotLyogUmVwcmVzZW50IGEgdGFyZ2V0IGFkZHJlc3MuICBBbHNvIHVzZWQgYXMgYSBnZW5lcmljIHVuc2lnbmVkIHR5cGUKLSAgIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueSBhcml0aG1ldGljIHR5cGVzCi0gICB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgYmZkX3ZtYTsKLQotLyogQSBnZW5lcmljIHNpZ25lZCB0eXBlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIGFueQotICAgYXJpdGhtZXRpYyB0eXBlcyB3ZSBuZWVkIHRvIGRlYWwgd2l0aC4gIENhbiBiZSBhc3N1bWVkIHRvIGJlIGNvbXBhdGlibGUKLSAgIHdpdGggYmZkX3ZtYSBpbiB0aGUgc2FtZSB3YXkgdGhhdCBzaWduZWQgYW5kIHVuc2lnbmVkIGludHMgYXJlIGNvbXBhdGlibGUKLSAgIChhcyBwYXJhbWV0ZXJzLCBpbiBhc3NpZ25tZW50LCBldGMpLiAgKi8KLXR5cGVkZWYgbG9uZyBiZmRfc2lnbmVkX3ZtYTsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bXZhbHVlOwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGJmZF9zaXplX3R5cGU7Ci0KLS8qIFByaW50IGEgYmZkX3ZtYSB4IG9uIHN0cmVhbSBzLiAgKi8KLSNkZWZpbmUgZnByaW50Zl92bWEocyx4KSBmcHJpbnRmKHMsICIlMDhseCIsIHgpCi0jZGVmaW5lIHNwcmludGZfdm1hKHMseCkgc3ByaW50ZihzLCAiJTA4bHgiLCB4KQotCi0jZW5kaWYgLyogbm90IEJGRDY0ICAqLwotCi0jZGVmaW5lIHByaW50Zl92bWEoeCkgZnByaW50Zl92bWEoc3Rkb3V0LHgpCi0KLXR5cGVkZWYgdW5zaWduZWQgaW50IGZsYWd3b3JkOwkvKiAzMiBiaXRzIG9mIGZsYWdzICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYmZkX2J5dGU7Ci0MCi0vKiogRmlsZSBmb3JtYXRzICovCi0KLXR5cGVkZWYgZW51bSBiZmRfZm9ybWF0IHsKLQkgICAgICBiZmRfdW5rbm93biA9IDAsCS8qIGZpbGUgZm9ybWF0IGlzIHVua25vd24gKi8KLQkgICAgICBiZmRfb2JqZWN0LAkvKiBsaW5rZXIvYXNzZW1iZXIvY29tcGlsZXIgb3V0cHV0ICovCi0JICAgICAgYmZkX2FyY2hpdmUsCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLQkgICAgICBiZmRfY29yZSwJCS8qIGNvcmUgZHVtcCAqLwotCSAgICAgIGJmZF90eXBlX2VuZH0JLyogbWFya3MgdGhlIGVuZDsgZG9uJ3QgdXNlIGl0ISAqLwotICAgICAgICAgYmZkX2Zvcm1hdDsKLQotLyogVmFsdWVzIHRoYXQgbWF5IGFwcGVhciBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBCRkQuICBUaGVzZSBhbHNvCi0gICBhcHBlYXIgaW4gdGhlIG9iamVjdF9mbGFncyBmaWVsZCBvZiB0aGUgYmZkX3RhcmdldCBzdHJ1Y3R1cmUsIHdoZXJlCi0gICB0aGV5IGluZGljYXRlIHRoZSBzZXQgb2YgZmxhZ3MgdXNlZCBieSB0aGF0IGJhY2tlbmQgKG5vdCBhbGwgZmxhZ3MKLSAgIGFyZSBtZWFuaW5nZnVsIGZvciBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cykgKEZJWE1FOiBhdCB0aGUgbW9tZW50LAotICAgdGhlIG9iamVjdF9mbGFncyB2YWx1ZXMgaGF2ZSBtb3N0bHkganVzdCBiZWVuIGNvcGllZCBmcm9tIGJhY2tlbmQKLSAgIHRvIGFub3RoZXIsIGFuZCBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QpLiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBCRkRfTk9fRkxBR1MgICAJMHgwMAotCi0vKiBCRkQgY29udGFpbnMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgSEFTX1JFTE9DICAgCTB4MDEKLQotLyogQkZEIGlzIGRpcmVjdGx5IGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBFWEVDX1AgICAgICAJMHgwMgotCi0vKiBCRkQgaGFzIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MTk5PIGluIGEKLSAgIENPRkYgaGVhZGVyKS4gICovCi0jZGVmaW5lIEhBU19MSU5FTk8gIAkweDA0Ci0KLS8qIEJGRCBoYXMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgSEFTX0RFQlVHICAgCTB4MDgKLQotLyogQkZEIGhhcyBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgSEFTX1NZTVMgICAgCTB4MTAKLQotLyogQkZEIGhhcyBsb2NhbCBzeW1ib2xzIChiYXNpY2FsbHkgdXNlZCBmb3IgRl9MU1lNUyBpbiBhIENPRkYKLSAgIGhlYWRlcikuICAqLwotI2RlZmluZSBIQVNfTE9DQUxTICAJMHgyMAotCi0vKiBCRkQgaXMgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIERZTkFNSUMgICAgIAkweDQwCi0KLS8qIFRleHQgc2VjdGlvbiBpcyB3cml0ZSBwcm90ZWN0ZWQgKGlmIERfUEFHRUQgaXMgbm90IHNldCwgdGhpcyBpcwotICAgbGlrZSBhbiBhLm91dCBOTUFHSUMgZmlsZSkgKHRoZSBsaW5rZXIgc2V0cyB0aGlzIGJ5IGRlZmF1bHQsIGJ1dAotICAgY2xlYXJzIGl0IGZvciAtciBvciAtTikuICAqLwotI2RlZmluZSBXUF9URVhUICAgICAJMHg4MAotCi0vKiBCRkQgaXMgZHluYW1pY2FsbHkgcGFnZWQgKHRoaXMgaXMgbGlrZSBhbiBhLm91dCBaTUFHSUMgZmlsZSkgKHRoZQotICAgbGlua2VyIHNldHMgdGhpcyBieSBkZWZhdWx0LCBidXQgY2xlYXJzIGl0IGZvciAtciBvciAtbiBvciAtTikuICAqLwotI2RlZmluZSBEX1BBR0VEICAgICAJMHgxMDAKLQotLyogQkZEIGlzIHJlbGF4YWJsZSAodGhpcyBtZWFucyB0aGF0IGJmZF9yZWxheF9zZWN0aW9uIG1heSBiZSBhYmxlIHRvCi0gICBkbyBzb21ldGhpbmcpIChzb21ldGltZXMgYmZkX3JlbGF4X3NlY3Rpb24gY2FuIGRvIHNvbWV0aGluZyBldmVuIGlmCi0gICB0aGlzIGlzIG5vdCBzZXQpLiAgKi8KLSNkZWZpbmUgQkZEX0lTX1JFTEFYQUJMRSAweDIwMAotCi0vKiBUaGlzIG1heSBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgb3V0IGEgQkZEIHRvIHJlcXVlc3QgdXNpbmcgYQotICAgdHJhZGl0aW9uYWwgZm9ybWF0LiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgdXNlZCB0byByZXF1ZXN0IHRoYXQgd2hlbgotICAgd3JpdGluZyBvdXQgYW4gYS5vdXQgb2JqZWN0IHRoZSBzeW1ib2xzIG5vdCBiZSBoYXNoZWQgdG8gZWxpbWluYXRlCi0gICBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCAweDQwMAotCi0vKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIEJGRCBjb250ZW50cyBhcmUgYWN0dWFsbHkgY2FjaGVkIGluCi0gICBtZW1vcnkuICBJZiB0aGlzIGlzIHNldCwgaW9zdHJlYW0gcG9pbnRzIHRvIGEgYmZkX2luX21lbW9yeSBzdHJ1Y3QuICAqLwotI2RlZmluZSBCRkRfSU5fTUVNT1JZIDB4ODAwCi0MCi0vKiBzeW1ib2xzIGFuZCByZWxvY2F0aW9uICovCi0KLS8qIEEgY291bnQgb2YgY2Fyc3ltcyAoY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9scykuICAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWluZGV4OwotCi0vKiBIb3cgdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24uICAqLwotdHlwZWRlZiBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0IHJlbG9jX2hvd3RvX3R5cGU7Ci0KLSNkZWZpbmUgQkZEX05PX01PUkVfU1lNQk9MUyAoKHN5bWluZGV4KSB+MCkKLQotLyogR2VuZXJhbCBwdXJwb3NlIHBhcnQgb2YgYSBzeW1ib2wgWDsKLSAgIHRhcmdldCBzcGVjaWZpYyBwYXJ0cyBhcmUgaW4gbGliY29mZi5oLCBsaWJhb3V0LmgsIGV0Yy4gICovCi0KLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uKHgpICgoeCktPnNlY3Rpb24pCi0jZGVmaW5lIGJmZF9nZXRfb3V0cHV0X3NlY3Rpb24oeCkgKCh4KS0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbih4LHkpICgoeCktPnNlY3Rpb24pID0gKHkpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2Jhc2UoeCkgKCh4KS0+c2VjdGlvbi0+dm1hKQotI2RlZmluZSBiZmRfYXN5bWJvbF92YWx1ZSh4KSAoYmZkX2FzeW1ib2xfYmFzZSh4KSArICh4KS0+dmFsdWUpCi0jZGVmaW5lIGJmZF9hc3ltYm9sX25hbWUoeCkgKCh4KS0+bmFtZSkKLS8qUGVyaGFwcyBmdXR1cmU6ICNkZWZpbmUgYmZkX2FzeW1ib2xfYmZkKHgpICgoeCktPnNlY3Rpb24tPm93bmVyKSovCi0jZGVmaW5lIGJmZF9hc3ltYm9sX2JmZCh4KSAoKHgpLT50aGVfYmZkKQotI2RlZmluZSBiZmRfYXN5bWJvbF9mbGF2b3VyKHgpIChiZmRfYXN5bWJvbF9iZmQoeCktPnh2ZWMtPmZsYXZvdXIpCi0KLS8qIEEgY2Fub25pY2FsIGFyY2hpdmUgc3ltYm9sLiAgKi8KLS8qIFRoaXMgaXMgYSB0eXBlIHB1biB3aXRoIHN0cnVjdCByYW5saWIgb24gcHVycG9zZSEgKi8KLXR5cGVkZWYgc3RydWN0IGNhcnN5bSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIGZpbGVfcHRyIGZpbGVfb2Zmc2V0OwkJLyogbG9vayBoZXJlIHRvIGZpbmQgdGhlIGZpbGUgKi8KLX0gY2Fyc3ltOwkJCS8qIHRvIG1ha2UgdGhlc2UgeW91IGNhbGwgYSBjYXJzeW1vZ2VuICovCi0KLSAgCi0vKiBVc2VkIGluIGdlbmVyYXRpbmcgYXJtYXBzIChhcmNoaXZlIHRhYmxlcyBvZiBjb250ZW50cykuCi0gICBQZXJoYXBzIGp1c3QgYSBmb3J3YXJkIGRlZmluaXRpb24gd291bGQgZG8/ICovCi1zdHJ1Y3Qgb3JsIHsJCQkvKiBvdXRwdXQgcmFubGliICovCi0gIGNoYXIgKipuYW1lOwkJCS8qIHN5bWJvbCBuYW1lICovIAotICBmaWxlX3B0ciBwb3M7CQkJLyogYmZkKiBvciBmaWxlIHBvc2l0aW9uICovCi0gIGludCBuYW1pZHg7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgKi8KLX07Ci0MCi0KLS8qIExpbmVudW1iZXIgc3R1ZmYgKi8KLXR5cGVkZWYgc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSB7Ci0gIHVuc2lnbmVkIGludCBsaW5lX251bWJlcjsJLyogTGluZW51bWJlciBmcm9tIHN0YXJ0IG9mIGZ1bmN0aW9uKi8gIAotICB1bmlvbiB7Ci0gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltOyAvKiBGdW5jdGlvbiBuYW1lICovCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIE9mZnNldCBpbnRvIHNlY3Rpb24gKi8KLSAgfSB1OwotfSBhbGVudDsKLQwKLS8qIG9iamVjdCBhbmQgY29yZSBmaWxlIHNlY3Rpb25zICovCi0KLSNkZWZpbmUJYWxpZ25fcG93ZXIoYWRkciwgYWxpZ24pCVwKLQkoICgoYWRkcikgKyAoKDE8PChhbGlnbikpLTEpKSAmICgtMSA8PCAoYWxpZ24pKSkKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VjICpzZWNfcHRyOwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9uYW1lKGJmZCwgcHRyKSAoKHB0ciktPm5hbWUgKyAwKQotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fdm1hKGJmZCwgcHRyKSAoKHB0ciktPnZtYSArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIpICgocHRyKS0+YWxpZ25tZW50X3Bvd2VyICsgMCkKLSNkZWZpbmUgYmZkX3NlY3Rpb25fbmFtZShiZmQsIHB0cikgKChwdHIpLT5uYW1lKQotI2RlZmluZSBiZmRfc2VjdGlvbl9zaXplKGJmZCwgcHRyKSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jKHB0cikpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX3ZtYShiZmQsIHB0cikgKChwdHIpLT52bWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2xtYShiZmQsIHB0cikgKChwdHIpLT5sbWEpCi0jZGVmaW5lIGJmZF9zZWN0aW9uX2FsaWdubWVudChiZmQsIHB0cikgKChwdHIpLT5hbGlnbm1lbnRfcG93ZXIpCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9mbGFncyhiZmQsIHB0cikgKChwdHIpLT5mbGFncyArIDApCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0cikgKChwdHIpLT51c2VyZGF0YSkKLQotI2RlZmluZSBiZmRfaXNfY29tX3NlY3Rpb24ocHRyKSAoKChwdHIpLT5mbGFncyAmIFNFQ19JU19DT01NT04pICE9IDApCi0KLSNkZWZpbmUgYmZkX3NldF9zZWN0aW9uX3ZtYShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT52bWEgPSAocHRyKS0+bG1hPSAodmFsKSksICgocHRyKS0+dXNlcl9zZXRfdm1hID0gKGJvb2xlYW4pdHJ1ZSksIHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYmZkLCBwdHIsIHZhbCkgKCgocHRyKS0+YWxpZ25tZW50X3Bvd2VyID0gKHZhbCkpLHRydWUpCi0jZGVmaW5lIGJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YShiZmQsIHB0ciwgdmFsKSAoKChwdHIpLT51c2VyZGF0YSA9ICh2YWwpKSx0cnVlKQotCi10eXBlZGVmIHN0cnVjdCBzdGF0IHN0YXRfdHlwZTsgCi0MCi10eXBlZGVmIGVudW0gYmZkX3ByaW50X3N5bWJvbAoteyAKLSAgYmZkX3ByaW50X3N5bWJvbF9uYW1lLAotICBiZmRfcHJpbnRfc3ltYm9sX21vcmUsCi0gIGJmZF9wcmludF9zeW1ib2xfYWxsCi19IGJmZF9wcmludF9zeW1ib2xfdHlwZTsKLSAgICAKLS8qIEluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sIHRoYXQgbm0gbmVlZHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfc3ltYm9sX2luZm8KLXsKLSAgc3ltdmFsdWUgdmFsdWU7Ci0gIGNoYXIgdHlwZTsKLSAgQ09OU1QgY2hhciAqbmFtZTsgICAgICAgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhYl90eXBlOyAgICAgLyogU3RhYiB0eXBlLiAgKi8KLSAgY2hhciBzdGFiX290aGVyOyAgICAgICAgICAgICAvKiBTdGFiIG90aGVyLiAqLwotICBzaG9ydCBzdGFiX2Rlc2M7ICAgICAgICAgICAgIC8qIFN0YWIgZGVzYy4gICovCi0gIENPTlNUIGNoYXIgKnN0YWJfbmFtZTsgICAgICAgLyogU3RyaW5nIGZvciBzdGFiIHR5cGUuICAqLwotfSBzeW1ib2xfaW5mbzsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgc3RhYnMgdHlwZSBjb2RlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmJmZF9nZXRfc3RhYl9uYW1lIFBBUkFNUyAoKGludCkpOwotDAotLyogSGFzaCB0YWJsZSByb3V0aW5lcy4gIFRoZXJlIGlzIG5vIHdheSB0byBmcmVlIHVwIGEgaGFzaCB0YWJsZS4gICovCi0KLS8qIEFuIGVsZW1lbnQgaW4gdGhlIGhhc2ggdGFibGUuICBNb3N0IHVzZXMgd2lsbCBhY3R1YWxseSB1c2UgYSBsYXJnZXIKLSAgIHN0cnVjdHVyZSwgYW5kIGFuIGluc3RhbmNlIG9mIHRoaXMgd2lsbCBiZSB0aGUgZmlyc3QgZmllbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeSBmb3IgdGhpcyBoYXNoIGNvZGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIFN0cmluZyBiZWluZyBoYXNoZWQuICAqLwotICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gIC8qIEhhc2ggY29kZS4gIFRoaXMgaXMgdGhlIGZ1bGwgaGFzaCBjb2RlLCBub3QgdGhlIGluZGV4IGludG8gdGhlCi0gICAgIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoYXNoOwotfTsKLQotLyogQSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIGFycmF5LiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqdGFibGU7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogQSBmdW5jdGlvbiB1c2VkIHRvIGNyZWF0ZSBuZXcgZWxlbWVudHMgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZmlyc3QgZW50cnkgaXMgaXRzZWxmIGEgcG9pbnRlciB0byBhbiBlbGVtZW50LiAgV2hlbiB0aGlzCi0gICAgIGZ1bmN0aW9uIGlzIGZpcnN0IGludm9rZWQsIHRoaXMgcG9pbnRlciB3aWxsIGJlIE5VTEwuICBIb3dldmVyLAotICAgICBoYXZpbmcgdGhlIHBvaW50ZXIgcGVybWl0cyBhIGhpZXJhcmNoeSBvZiBtZXRob2QgZnVuY3Rpb25zIHRvIGJlCi0gICAgIGJ1aWx0IGVhY2ggb2Ygd2hpY2ggY2FsbHMgdGhlIGZ1bmN0aW9uIGluIHRoZSBzdXBlcmNsYXNzLiAgVGh1cwotICAgICBlYWNoIGZ1bmN0aW9uIHNob3VsZCBiZSB3cml0dGVuIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIG9mIG1lbW9yeQotICAgICBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBOVUxMLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKikpOwotICAgLyogQW4gb2JqYWxsb2MgZm9yIHRoaXMgaGFzaCB0YWJsZS4gIFRoaXMgaXMgYSBzdHJ1Y3Qgb2JqYWxsb2MgKiwKLSAgICAgYnV0IHdlIHVzZSBQVFIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoZSBpbmNsdXNpb24gb2Ygb2JqYWxsb2MuaC4gICovCi0gIFBUUiBtZW1vcnk7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgaGFzaCB0YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBiZmRfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogSW5pdGlhbGl6ZSBhIGhhc2ggdGFibGUgc3BlY2lmeWluZyBhIHNpemUuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKiksCi0JICAgdW5zaWduZWQgaW50IHNpemUpKTsKLQotLyogRnJlZSB1cCBhIGhhc2ggdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdGFibGVfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikpOwotCi0vKiBMb29rIHVwIGEgc3RyaW5nIGluIGEgaGFzaCB0YWJsZS4gIElmIENSRUFURSBpcyB0cnVlLCBhIG5ldyBlbnRyeQotICAgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGlzIHN0cmluZyBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gIFRoZQotICAgQ09QWSBhcmd1bWVudCBtdXN0IGJlIHRydWUgaWYgdGhpcyByb3V0aW5lIHNob3VsZCBjb3B5IHRoZSBzdHJpbmcKLSAgIGludG8gbmV3bHkgYWxsb2NhdGVkIG1lbW9yeSB3aGVuIGFkZGluZyBhbiBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5KSk7Ci0KLS8qIFJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9oYXNoX3JlcGxhY2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqb2xkLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqbncpKTsKLQotLyogQmFzZSBtZXRob2QgZm9yIGNyZWF0aW5nIGEgaGFzaCB0YWJsZSBlbnRyeS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpiZmRfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkgICBjb25zdCBjaGFyICopKTsKLQotLyogR3JhYiBzb21lIHNwYWNlIGZvciBhIGhhc2ggdGFibGUgZW50cnkuICAqLwotZXh0ZXJuIFBUUiBiZmRfaGFzaF9hbGxvY2F0ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLQotLyogVHJhdmVyc2UgYSBoYXNoIHRhYmxlIGluIGEgcmFuZG9tIG9yZGVyLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaAotICAgZWxlbWVudC4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGUgdHJhdmVyc2FsIHN0b3BzLiAgVGhlCi0gICBJTkZPIGFyZ3VtZW50IGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24uICAqLwotZXh0ZXJuIHZvaWQgYmZkX2hhc2hfdHJhdmVyc2UgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGJvb2xlYW4gKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICBQVFIpLAotCQkJCSAgICAgICBQVFIgaW5mbykpOwotDAotLyogU2VtaS1wb3J0YWJsZSBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpbiBjcHAuCi0gICBUaGUgQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQyBwcmVwcm9jZXNzb3JzLgotICAgVGhlIHByb2JsZW0gaXMsICIzMl8iIGlzIG5vdCBhIHZhbGlkIHByZXByb2Nlc3NpbmcgdG9rZW4sIGFuZCB3ZSBkb24ndAotICAgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwgIm5sbV8zMl8iKS4gIFRoZSBYQ0FUMiBtYWNybyB3aWxsIGNhdXNlIHRoZQotICAgaW5uZXIgQ0FUIG1hY3JvcyB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuCi0gICBUaGVuIHRoZSBmaW5hbCBjb25jYXRlbmF0aW9uIGNhbiBiZSBkb25lLiAgKFNpZ2guKSAgKi8KLSNpZm5kZWYgQ0FUCi0jaWZkZWYgU0FCRVIKLSNkZWZpbmUgQ0FUKGEsYikJYSMjYgotI2RlZmluZSBDQVQzKGEsYixjKQlhIyNiIyNjCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotI2RlZmluZSBDQVQoYSxiKSBhIyNiCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEjI2IjI2MKLSNkZWZpbmUgWENBVDIoYSxiKQlDQVQoYSxiKQotI2RlZmluZSBDQVQ0KGEsYixjLGQpCVhDQVQyKENBVChhLGIpLENBVChjLGQpKQotI2Vsc2UKLSNkZWZpbmUgQ0FUKGEsYikgYS8qKi9iCi0jZGVmaW5lIENBVDMoYSxiLGMpIGEvKiovYi8qKi9jCi0jZGVmaW5lIENBVDQoYSxiLGMsZCkJYS8qKi9iLyoqL2MvKiovZAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfU1dBUF9UQUJMRSAoUFRSKSAmYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUKLQwKLS8qIFVzZXIgcHJvZ3JhbSBhY2Nlc3MgdG8gQkZEIGZhY2lsaXRpZXMgKi8KLQotLyogRGlyZWN0IEkvTyByb3V0aW5lcywgZm9yIHByb2dyYW1zIHdoaWNoIGtub3cgbW9yZSBhYm91dCB0aGUgb2JqZWN0Ci0gICBmaWxlIHRoYW4gQkZEIGRvZXMuICBVc2UgaGlnaGVyIGxldmVsIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAgKi8KLQotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX3JlYWQKLSAgUEFSQU1TICgoUFRSLCBiZmRfc2l6ZV90eXBlIHNpemUsIGJmZF9zaXplX3R5cGUgbml0ZW1zLCBiZmQgKmFiZmQpKTsKLWV4dGVybiBiZmRfc2l6ZV90eXBlIGJmZF93cml0ZQotICBQQVJBTVMgKChjb25zdCBQVFIsIGJmZF9zaXplX3R5cGUgc2l6ZSwgYmZkX3NpemVfdHlwZSBuaXRlbXMsIGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc2VlayBQQVJBTVMgKChiZmQgKmFiZmQsIGZpbGVfcHRyIGZwLCBpbnQgZGlyZWN0aW9uKSk7Ci1leHRlcm4gbG9uZyBiZmRfdGVsbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgYmZkX2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBiZmRfc3RhdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICopKTsKLQotCi0vKiBDYXN0IGZyb20gY29uc3QgY2hhciAqIHRvIGNoYXIgKiBzbyB0aGF0IGNhbGxlciBjYW4gYXNzaWduIHRvCi0gICBhIGNoYXIgKiB3aXRob3V0IGEgd2FybmluZy4gICovCi0jZGVmaW5lIGJmZF9nZXRfZmlsZW5hbWUoYWJmZCkgKChjaGFyICopIChhYmZkKS0+ZmlsZW5hbWUpCi0jZGVmaW5lIGJmZF9nZXRfY2FjaGVhYmxlKGFiZmQpICgoYWJmZCktPmNhY2hlYWJsZSkKLSNkZWZpbmUgYmZkX2dldF9mb3JtYXQoYWJmZCkgKChhYmZkKS0+Zm9ybWF0KQotI2RlZmluZSBiZmRfZ2V0X3RhcmdldChhYmZkKSAoKGFiZmQpLT54dmVjLT5uYW1lKQotI2RlZmluZSBiZmRfZ2V0X2ZsYXZvdXIoYWJmZCkgKChhYmZkKS0+eHZlYy0+Zmxhdm91cikKLSNkZWZpbmUgYmZkX2JpZ19lbmRpYW4oYWJmZCkgKChhYmZkKS0+eHZlYy0+Ynl0ZW9yZGVyID09IEJGRF9FTkRJQU5fQklHKQotI2RlZmluZSBiZmRfbGl0dGxlX2VuZGlhbihhYmZkKSAoKGFiZmQpLT54dmVjLT5ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9oZWFkZXJfYmlnX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9CSUcpCi0jZGVmaW5lIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbihhYmZkKSBcCi0gICgoYWJmZCktPnh2ZWMtPmhlYWRlcl9ieXRlb3JkZXIgPT0gQkZEX0VORElBTl9MSVRUTEUpCi0jZGVmaW5lIGJmZF9nZXRfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT5mbGFncykKLSNkZWZpbmUgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyhhYmZkKSAoKGFiZmQpLT54dmVjLT5vYmplY3RfZmxhZ3MpCi0jZGVmaW5lIGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MoYWJmZCkgKChhYmZkKS0+eHZlYy0+c2VjdGlvbl9mbGFncykKLSNkZWZpbmUgYmZkX215X2FyY2hpdmUoYWJmZCkgKChhYmZkKS0+bXlfYXJjaGl2ZSkKLSNkZWZpbmUgYmZkX2hhc19tYXAoYWJmZCkgKChhYmZkKS0+aGFzX2FybWFwKQotCi0jZGVmaW5lIGJmZF92YWxpZF9yZWxvY190eXBlcyhhYmZkKSAoKGFiZmQpLT54dmVjLT52YWxpZF9yZWxvY190eXBlcykKLSNkZWZpbmUgYmZkX3VzcmRhdGEoYWJmZCkgKChhYmZkKS0+dXNyZGF0YSkKLQotI2RlZmluZSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MoYWJmZCkgKChhYmZkKS0+c3RhcnRfYWRkcmVzcykKLSNkZWZpbmUgYmZkX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLSNkZWZpbmUgYmZkX2dldF9vdXRzeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIGJmZF9jb3VudF9zZWN0aW9ucyhhYmZkKSAoKGFiZmQpLT5zZWN0aW9uX2NvdW50KQotCi0jZGVmaW5lIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhcihhYmZkKSAoKGFiZmQpLT54dmVjLT5zeW1ib2xfbGVhZGluZ19jaGFyKQotCi0jZGVmaW5lIGJmZF9zZXRfY2FjaGVhYmxlKGFiZmQsYm9vbCkgKCgoYWJmZCktPmNhY2hlYWJsZSA9IChib29sZWFuKShib29sKSksIHRydWUpCi0KLWV4dGVybiBib29sZWFuIGJmZF9yZWNvcmRfcGhkcgotICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywgYm9vbGVhbiwgZmxhZ3dvcmQsIGJvb2xlYW4sIGJmZF92bWEsCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEJ5dGUgc3dhcHBpbmcgcm91dGluZXMuICAqLwotCi1iZmRfdm1hCQliZmRfZ2V0YjY0CSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYSAJYmZkX2dldGw2NAkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRiX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF9zaWduZWRfdm1hCWJmZF9nZXRsX3NpZ25lZF82NCBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRiMzIJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfdm1hCQliZmRfZ2V0bDMyCSAgIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGJfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3NpZ25lZF92bWEJYmZkX2dldGxfc2lnbmVkXzMyIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotYmZkX3ZtYQkJYmZkX2dldGIxNgkgICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICopKTsKLWJmZF92bWEJCWJmZF9nZXRsMTYJICAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0Yl9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci1iZmRfc2lnbmVkX3ZtYQliZmRfZ2V0bF9zaWduZWRfMTYgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0YjY0CSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGw2NAkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRiMzIJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci12b2lkCQliZmRfcHV0bDMyCSAgIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGNoYXIgKikpOwotdm9pZAkJYmZkX3B1dGIxNgkgICBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLXZvaWQJCWJmZF9wdXRsMTYJICAgUEFSQU1TICgoYmZkX3ZtYSwgdW5zaWduZWQgY2hhciAqKSk7Ci0MCi0vKiBFeHRlcm5hbGx5IHZpc2libGUgRUNPRkYgcm91dGluZXMuICAqLwotCi0jaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChBTE1PU1RfU1REQykKLXN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvOwotc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXA7Ci1zdHJ1Y3QgZWNvZmZfZXh0cjsKLXN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7Ci1zdHJ1Y3QgYmZkX2xpbmtfaW5mbzsKLXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5Owotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlOwotI2VuZGlmCi1leHRlcm4gYmZkX3ZtYSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqIGFiZmQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfdm1hIGdwX3ZhbHVlKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyBncHJtYXNrLCB1bnNpZ25lZCBsb25nIGZwcm1hc2ssCi0JICAgdW5zaWduZWQgbG9uZyAqY3BybWFzaykpOwotZXh0ZXJuIFBUUiBiZmRfZWNvZmZfZGVidWdfaW5pdAotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiB2b2lkIGJmZF9lY29mZl9kZWJ1Z19mcmVlCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLSAgUEFSQU1TICgoUFRSIGhhbmRsZSwgYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb3V0cHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcCwKLQkgICBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlucHV0X2RlYnVnLAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICppbnB1dF9zd2FwLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyCi0gIFBBUkFNUyAoKFBUUiBoYW5kbGUsIGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqb3V0cHV0X3N3YXAsIGJmZCAqaW5wdXRfYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl9kZWJ1Z19leHRlcm5hbHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXAsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0JICAgYm9vbGVhbiAoKmdldF9leHRyKSAoc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotCQkJCXN0cnVjdCBlY29mZl9leHRyICopLAotCSAgIHZvaWQgKCpzZXRfaW5kZXgpIChzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0JCQkgICAgICBiZmRfc2l6ZV90eXBlKSkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqZXN5bSkpOwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgYmZkX2Vjb2ZmX2RlYnVnX3NpemUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXApKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9kZWJ1ZwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZwotICBQQVJBTVMgKChQVFIgaGFuZGxlLCBiZmQgKmFiZmQsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZywKLQkgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgZmlsZV9wdHIgd2hlcmUpKTsKLWV4dGVybiBib29sZWFuIGJmZF9taXBzX2Vjb2ZmX2NyZWF0ZV9lbWJlZGRlZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiwgc3RydWN0IHNlYyAqLAotCSAgIGNoYXIgKiopKTsKLQotLyogRXh0ZXJuYWxseSB2aXNpYmxlIEVMRiByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdAotewotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5leHQ7Ci0gIGJmZCAqYnk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfcmVjb3JkX2xpbmtfYXNzaWdubWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpiZmRfZWxmX2dldF9uZWVkZWRfbGlzdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKiopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosCi0JICAgY29uc3QgY2hhciAqIGNvbnN0ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpiZmRfZWxmX2dldF9kdF9zb25hbWUgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3VuT1Mgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGxpbmtlci4gICovCi0KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmJmZF9zdW5vc19nZXRfbmVlZGVkX2xpc3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBzZWMgKiosIHN0cnVjdCBzZWMgKiosCi0JICAgc3RydWN0IHNlYyAqKikpOwotCi0vKiBMaW51eCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgbGlua2VyLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gYmZkX2kzODZsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9tNjhrbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfc3BhcmNsaW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogbW1hcCBoYWNrcyAqLwotCi1zdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWw7Ci10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvd19pbnRlcm5hbCBiZmRfd2luZG93X2ludGVybmFsOwotCi10eXBlZGVmIHN0cnVjdCBfYmZkX3dpbmRvdyB7Ci0gIC8qIFdoYXQgdGhlIHVzZXIgYXNrZWQgZm9yLiAgKi8KLSAgUFRSIGRhdGE7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogVGhlIGFjdHVhbCB3aW5kb3cgdXNlZCBieSBCRkQuICBTbWFsbCB1c2VyLXJlcXVlc3RlZCByZWFkLW9ubHkKLSAgICAgcmVnaW9ucyBzaGFyaW5nIGEgcGFnZSBtYXkgc2hhcmUgYSBzaW5nbGUgd2luZG93IGludG8gdGhlIG9iamVjdAotICAgICBmaWxlLiAgUmVhZC13cml0ZSB2ZXJzaW9ucyBzaG91bGRuJ3QgdW50aWwgSSd2ZSBmaXhlZCB0aGluZ3MgdG8KLSAgICAga2VlcCB0cmFjayBvZiB3aGljaCBwb3J0aW9ucyBoYXZlIGJlZW4gY2xhaW1lZCBieSB0aGUKLSAgICAgYXBwbGljYXRpb247IGRvbid0IHdhbnQgdG8gZ2l2ZSB0aGUgc2FtZSByZWdpb24gYmFjayB3aGVuIHRoZQotICAgICBhcHBsaWNhdGlvbiB3YW50cyB0d28gd3JpdGFibGUgY29waWVzISAgKi8KLSAgc3RydWN0IF9iZmRfd2luZG93X2ludGVybmFsICppOwotfSBiZmRfd2luZG93OwotCi1leHRlcm4gdm9pZCBiZmRfaW5pdF93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZnJlZV93aW5kb3cgUEFSQU1TICgoYmZkX3dpbmRvdyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZ2V0X2ZpbGVfd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgYmZkX3dpbmRvdyAqLCBib29sZWFuKSk7Ci0KLS8qIFhDT0ZGIHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1leHRlcm4gYm9vbGVhbiBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9pbXBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9leHBvcnRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIGJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4sCi0JICAgaW50LCBib29sZWFuLCBib29sZWFuLCBzdHJ1Y3Qgc2VjICoqKSk7Ci0KLS8qIEV4dGVybmFsbHkgdmlzaWJsZSBDT0ZGIHJvdXRpbmVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgaW50ZXJuYWxfc3ltZW50OwotdW5pb24gaW50ZXJuYWxfYXV4ZW50OwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9zeW1lbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX2dldF9hdXhlbnQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiwgaW50LCB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfY29mZl9zZXRfc3ltYm9sX2NsYXNzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIHVuc2lnbmVkIGludCkpOwotCi0vKiBBUk0gSW50ZXJ3b3JraW5nIHN1cHBvcnQuICBDYWxsZWQgZnJvbSBsaW5rZXIuICAqLwotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljCi0jZW5kaWYKLWV4dGVybiBib29sZWFuIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljCi0jZW5kaWYKLWV4dGVybiBib29sZWFuIGJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgaW50KSk7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLXN0YXRpYwotI2VuZGlmCi1leHRlcm4gYm9vbGVhbiBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBFTEYgQVJNIEludGVyd29ya2luZyBzdXBwb3J0LiAgQ2FsbGVkIGZyb20gbGlua2VyLiAgKi8KLSAgZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMKLSAgICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0gCi0gIGV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBpbnQpKTsKLSAKLSAgZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBBbmQgbW9yZSBmcm9tIHRoZSBzb3VyY2UuICAqLwotdm9pZCAKLWJmZF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotYmZkICoKLWJmZF9vcGVuciBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0KSk7Ci0KLWJmZCAqCi1iZmRfZmRvcGVuciBQQVJBTVMgKChDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0LCBpbnQgZmQpKTsKLQotYmZkICoKLWJmZF9vcGVuc3RyZWFtciBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUFRSKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbncgUEFSQU1TICgoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCkpOwotCi1ib29sZWFuIAotYmZkX2Nsb3NlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuIAotYmZkX2Nsb3NlX2FsbF9kb25lIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWJmZCAqCi1iZmRfY3JlYXRlIFBBUkFNUyAoKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBiZmQgKnRlbXBsKSk7Ci0KLWJvb2xlYW4gCi1iZmRfbWFrZV93cml0YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotYm9vbGVhbiAKLWJmZF9tYWtlX3JlYWRhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0KLSAvKiBCeXRlIHN3YXBwaW5nIG1hY3JvcyBmb3IgdXNlciBzZWN0aW9uIGRhdGEuICAqLwotCi0jZGVmaW5lIGJmZF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgICgqKCh1bnNpZ25lZCBjaGFyICopKHB0cikpID0gKHVuc2lnbmVkIGNoYXIpKHZhbCkpCi0jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzggXAotICAgICAgICAgICAgICAgYmZkX3B1dF84Ci0jZGVmaW5lIGJmZF9nZXRfOChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICAoKih1bnNpZ25lZCBjaGFyICopKHB0cikpCi0jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzgoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAoKCoodW5zaWduZWQgY2hhciAqKShwdHIpIF4gMHg4MCkgLSAweDgwKQotCi0jZGVmaW5lIGJmZF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDE2LCAoKHZhbCksKHB0cikpKQotI2RlZmluZSBiZmRfcHV0X3NpZ25lZF8xNiBcCi0gICAgICAgICAgICAgICAgYmZkX3B1dF8xNgotI2RlZmluZSBiZmRfZ2V0XzE2KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MTYsIChwdHIpKQotI2RlZmluZSBiZmRfZ2V0X3NpZ25lZF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORCAoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzE2LCAocHRyKSkKLQotI2RlZmluZSBiZmRfcHV0XzMyKGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgzMiwgKCh2YWwpLChwdHIpKSkKLSNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMzIgXAotICAgICAgICAgICAgICAgIGJmZF9wdXRfMzIKLSNkZWZpbmUgYmZkX2dldF8zMihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDMyLCAocHRyKSkKLSNkZWZpbmUgYmZkX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzMyLCAocHRyKSkKLQotI2RlZmluZSBiZmRfcHV0XzY0KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHg2NCwgKCh2YWwpLCAocHRyKSkpCi0jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzY0IFwKLSAgICAgICAgICAgICAgICBiZmRfcHV0XzY0Ci0jZGVmaW5lIGJmZF9nZXRfNjQoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHg2NCwgKHB0cikpCi0jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzY0KGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF82NCwgKHB0cikpCi0KLQotIC8qIEJ5dGUgc3dhcHBpbmcgbWFjcm9zIGZvciBmaWxlIGhlYWRlciBkYXRhLiAgKi8KLQotI2RlZmluZSBiZmRfaF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLSNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF84KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbCwgcHRyKQotI2RlZmluZSBiZmRfaF9nZXRfOChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgIGJmZF9nZXRfOCAoYWJmZCwgcHRyKQotI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzgoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICBiZmRfZ2V0X3NpZ25lZF84IChhYmZkLCBwdHIpCi0KLSNkZWZpbmUgYmZkX2hfcHV0XzE2KGFiZmQsIHZhbCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDE2LCh2YWwscHRyKSkKLSNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8xNiBcCi0gICAgICAgICAgICAgICAgYmZkX2hfcHV0XzE2Ci0jZGVmaW5lIGJmZF9oX2dldF8xNihhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MTYsKHB0cikpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMTYsIChwdHIpKQotCi0jZGVmaW5lIGJmZF9oX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHgzMiwodmFsLHB0cikpCi0jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfMzIgXAotICAgICAgICAgICAgICAgIGJmZF9oX3B1dF8zMgotI2RlZmluZSBiZmRfaF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eDMyLChwdHIpKQotI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIHB0cikgXAotICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzMyLCAocHRyKSkKLQotI2RlZmluZSBiZmRfaF9wdXRfNjQoYWJmZCwgdmFsLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4NjQsKHZhbCwgcHRyKSkKLSNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF82NCBcCi0gICAgICAgICAgICAgICAgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIGJmZF9oX2dldF82NChhYmZkLCBwdHIpIFwKLSAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4NjQsKHB0cikpCi0jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfNjQoYWJmZCwgcHRyKSBcCi0gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotCi10eXBlZGVmIHN0cnVjdCBzZWMKLXsKLSAgICAgICAgIC8qIFRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uOyB0aGUgbmFtZSBpc24ndCBhIGNvcHksIHRoZSBwb2ludGVyIGlzCi0gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICovCi0KLSAgICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICAgICAvKiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKi8KLQotICAgaW50IGluZGV4OwotCi0gICAgICAgICAvKiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqLwotCi0gICAgc3RydWN0IHNlYyAqbmV4dDsKLQotICAgICAgICAgLyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKLSAgICAgICAgICAgZmxhZ3MgYXJlIHJlYWQgaW4gZnJvbSB0aGUgb2JqZWN0IGZpbGUsIGFuZCBzb21lIGFyZQotICAgICAgICAgICBzeW50aGVzaXplZCBmcm9tIG90aGVyIGluZm9ybWF0aW9uLiAgKi8KLQotICAgIGZsYWd3b3JkIGZsYWdzOwotCi0jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCi0KLSAgICAgICAgIC8qIFRlbGxzIHRoZSBPUyB0byBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyBzZWN0aW9uIHdoZW4gbG9hZGluZy4KLSAgICAgICAgICAgVGhpcyBpcyBjbGVhciBmb3IgYSBzZWN0aW9uIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24KLSAgICAgICAgICAgb25seS4gKi8KLSNkZWZpbmUgU0VDX0FMTE9DICAgICAgMHgwMDEKLQotICAgICAgICAgLyogVGVsbHMgdGhlIE9TIHRvIGxvYWQgdGhlIHNlY3Rpb24gZnJvbSB0aGUgZmlsZSB3aGVuIGxvYWRpbmcuCi0gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqLwotI2RlZmluZSBTRUNfTE9BRCAgICAgICAweDAwMgotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBkYXRhIHN0aWxsIHRvIGJlIHJlbG9jYXRlZCwgc28gdGhlcmUgaXMKLSAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKi8KLSNkZWZpbmUgU0VDX1JFTE9DICAgICAgMHgwMDQKLQotI2lmIDAgICAgLyogT2Jzb2xldGUgPyAqLwotI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAotI2VuZGlmCi0KLSAgICAgICAgIC8qIEEgc2lnbmFsIHRvIHRoZSBPUyB0aGF0IHRoZSBzZWN0aW9uIGNvbnRhaW5zIHJlYWQgb25seQotICAgICAgICAgIGRhdGEuICovCi0jZGVmaW5lIFNFQ19SRUFET05MWSAgIDB4MDEwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvZGUgb25seS4gKi8KLSNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKLQotICAgICAgICAgLyogVGhlIHNlY3Rpb24gY29udGFpbnMgZGF0YSBvbmx5LiAqLwotI2RlZmluZSBTRUNfREFUQSAgICAgICAweDA0MAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICovCi0jZGVmaW5lIFNFQ19ST00gICAgICAgIDB4MDgwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uLiBUaGlzIHNlY3Rpb24KLSAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKLSAgICAgICAgICAgZGVzdHJ1Y3RvcnMgdXNlZCBieSA8PGcrKz4+LiBXaGVuIGEgYmFjayBlbmQgc2VlcyBhIHN5bWJvbAotICAgICAgICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGxpc3QsIGl0IGNyZWF0ZXMgYSBuZXcKLSAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcwotICAgICAgICAgICB0aGUgc3ltYm9sIHRvIGl0LCBhbmQgYnVpbGRzIGEgcmVsb2NhdGlvbi4gVG8gYnVpbGQgdGhlIGxpc3RzCi0gICAgICAgICAgIG9mIGNvbnN0cnVjdG9ycywgYWxsIHRoZSBsaW5rZXIgaGFzIHRvIGRvIGlzIGNhdGVuYXRlIGFsbCB0aGUKLSAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQotICAgICAgICAgICBjb250YWluZWQgd2l0aGluIC0gZXhhY3RseSB0aGUgb3BlcmF0aW9ucyBpdCB3b3VsZCBwZWZvcm0gb24KLSAgICAgICAgICAgc3RhbmRhcmQgZGF0YS4gKi8KLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgY29uc3RydWN0b3IsIGFuZCBzaG91bGQgYmUgcGxhY2VkIGF0IHRoZQotICAgICAgICAgIGVuZCBvZiB0aGUgdGV4dCwgZGF0YSwgb3IgYnNzIHNlY3Rpb24oPykuICovCi0jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAotI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfREFUQSAweDIxMDAKLSNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0JTUyAgMHgzMTAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0FMTE9DPj4gfCA8PFNFQ19IQVNfQ09OVEVOVFM+PjsgYSBkZWJ1ZyBzZWN0aW9uIGNvdWxkIGJlCi0gICAgICAgICAgIDw8U0VDX0hBU19DT05URU5UUz4+ICovCi0jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKLQotICAgICAgICAgLyogQW4gaW5zdHJ1Y3Rpb24gdG8gdGhlIGxpbmtlciB0byBub3Qgb3V0cHV0IHRoZSBzZWN0aW9uCi0gICAgICAgICAgIGV2ZW4gaWYgaXQgaGFzIGluZm9ybWF0aW9uIHdoaWNoIHdvdWxkIG5vcm1hbGx5IGJlIHdyaXR0ZW4uICovCi0jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCi0KLSAgICAgICAgIC8qIFRoZSBzZWN0aW9uIGlzIGEgQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uLiAgVGhpcyBmbGFnIGlzCi0gICAgICAgICAgIG9ubHkgZm9yIHRoZSBsaW5rZXIuICBJZiB0aGlzIHR5cGUgb2Ygc2VjdGlvbiBhcHBlYXJzIGluCi0gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgdm1hIG9yIHNpemUuICBGSVhNRTogQWx0aG91Z2ggdGhpcwotICAgICAgICAgICB3YXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBiZSBnZW5lcmFsLCBpdCByZWFsbHkgaXMgQ09GRgotICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKLSAgICAgICAgICAgbWlnaHQgYmUgY2xlYW5lciB0byBoYXZlIHNvbWUgbW9yZSBnZW5lcmFsIG1lY2hhbmlzbSB0bwotICAgICAgICAgICBhbGxvdyB0aGUgYmFjayBlbmQgdG8gY29udHJvbCB3aGF0IHRoZSBsaW5rZXIgZG9lcyB3aXRoCi0gICAgICAgICAgIHNlY3Rpb25zLiAqLwotI2RlZmluZSBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSAweDgwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBjb21tb24gc3ltYm9scyAoc3ltYm9scyBtYXkgYmUgZGVmaW5lZAotICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKLSAgICAgICAgICAgc3BhY2UgaXQgcmVxdWlyZXMsIGFuZCB0aGUgbGFyZ2VzdCBzeW1ib2wgdmFsdWUgaXMgdGhlIG9uZQotICAgICAgICAgICB1c2VkKS4gIE1vc3QgdGFyZ2V0cyBoYXZlIGV4YWN0bHkgb25lIG9mIHRoZXNlICh3aGljaCB3ZQotICAgICAgICAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqLwotI2RlZmluZSBTRUNfSVNfQ09NTU9OIDB4ODAwMAotCi0gICAgICAgICAvKiBUaGUgc2VjdGlvbiBjb250YWlucyBvbmx5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEZvcgotICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCi0gICAgICAgICAgIHN0cmlwIHRlc3RzIHRoaXMgZmxhZyB0byBzZWUgaWYgYSBzZWN0aW9uIGNhbiBiZQotICAgICAgICAgICBkaXNjYXJkZWQuICovCi0jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAotCi0gICAgICAgICAvKiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSBoZWxkIGluIG1lbW9yeSBwb2ludGVkIHRvCi0gICAgICAgICAgIGJ5IHRoZSBjb250ZW50cyBmaWVsZC4gIFRoaXMgaXMgY2hlY2tlZCBieQotICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQotICAgICAgICAgICBtZW1vcnkgaWYgYXBwcm9wcmlhdGUuICAqLwotI2RlZmluZSBTRUNfSU5fTUVNT1JZIDB4MjAwMDAKLQotICAgICAgICAgLyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCi0gICAgICAgICAgIGxpbmtlciBmb3IgZXhlY3V0YWJsZSBhbmQgc2hhcmVkIG9iamVjdHMgdW5sZXNzIHRob3NlCi0gICAgICAgICAgIG9iamVjdHMgYXJlIHRvIGJlIGZ1cnRoZXIgcmVsb2NhdGVkLiAgKi8KLSNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAotCi0gICAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24gYXJlIHRvIGJlIHNvcnRlZCBieSB0aGUKLSAgICAgICAgICBiYXNlZCBvbiB0aGUgYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIGFzc29jaWF0ZWQgc3ltYm9sCi0gICAgICAgICAgdGFibGUuICAqLwotI2RlZmluZSBTRUNfU09SVF9FTlRSSUVTIDB4ODAwMDAKLQotICAgICAgICAvKiBXaGVuIGxpbmtpbmcsIGR1cGxpY2F0ZSBzZWN0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIHNob3VsZCBiZQotICAgICAgICAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCi0gICAgICAgICAgaXMgdXN1YWxseSBkb25lLiAgVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBjb21tb24gc3ltYm9scyBhcmUKLSAgICAgICAgICBoYW5kbGVkLiAgU2VlIFNFQ19MSU5LX0RVUExJQ0FURVMgYmVsb3cuICAqLwotI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCi0KLSAgICAgICAgLyogSWYgU0VDX0xJTktfT05DRSBpcyBzZXQsIHRoaXMgYml0ZmllbGQgZGVzY3JpYmVzIGhvdyB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIGhhbmRsZSBkdXBsaWNhdGUgc2VjdGlvbnMuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IGR1cGxpY2F0ZQotICAgICAgICAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBzaG91bGQgc2ltcGx5IGJlIGRpc2NhcmRlZC4gKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMsIGFsdGhvdWdoCi0gICAgICAgICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICovCi0jZGVmaW5lIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFkgMHgyMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotICAgICAgICAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqLwotI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRSAweDQwMDAwMAotCi0gICAgICAgIC8qIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0gICAgICAgICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAotICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTIDB4NjAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCi0gICAgICAgICAgcmVsb2NhdGlvbiBvciBvdGhlciBhcmNhbmUgcHJvY2Vzc2luZy4gIEl0IGlzIHNraXBwZWQgd2hlbgotICAgICAgICAgIGdvaW5nIHRocm91Z2ggdGhlIGZpcnN0LXBhc3Mgb3V0cHV0LCB0cnVzdGluZyB0aGF0IHNvbWVvbmUKLSAgICAgICAgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKi8KLSNkZWZpbmUgU0VDX0xJTktFUl9DUkVBVEVEIDB4ODAwMDAwCi0KLSAgICAgICAgLyogVGhpcyBzZWN0aW9uIHNob3VsZCBub3QgYmUgc3ViamVjdCB0byBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKLQotICAgICAgICAvKiBUaGlzIHNlY3Rpb24gY29udGFpbnMgInNob3J0IiBkYXRhLCBhbmQgc2hvdWxkIGJlIHBsYWNlZAotICAgICAgICAgICJuZWFyIiB0aGUgR1AuICAqLwotI2RlZmluZSBTRUNfU0hPUlQgMHgyMDAwMDAwCi0KLSAgICAgICAgLyogIEVuZCBvZiBzZWN0aW9uIGZsYWdzLiAgKi8KLQotICAgICAgICAvKiBTb21lIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICovCi0KLSAgICAgICAgLyogU2VlIHRoZSB2bWEgZmllbGQuICAqLwotICAgICAgIHVuc2lnbmVkIGludCB1c2VyX3NldF92bWEgOiAxOwotCi0gICAgICAgIC8qIFdoZXRoZXIgcmVsb2NhdGlvbnMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gICovCi0gICAgICAgdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBvZiB0aGUgbGlua2VyIGJhY2tlbmRzLiAgKi8KLSAgICAgICB1bnNpZ25lZCBpbnQgbGlua2VyX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgICAgdW5zaWduZWQgaW50IGdjX21hcmsgOiAxOwotCi0gICAgICAgIC8qIEVuZCBvZiBpbnRlcm5hbCBwYWNrZWQgYm9vbGVhbiBmaWVsZHMuICAqLwotCi0gICAgICAgIC8qICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLSAgICAgICAgICAgYXQgcnVuIHRpbWUuICBUaGUgc3ltYm9scyBhcmUgcmVsb2NhdGVkIGFnYWluc3QgdGhpcy4gIFRoZQotICAgICAgICAgICB1c2VyX3NldF92bWEgZmxhZyBpcyBtYWludGFpbmVkIGJ5IGJmZDsgaWYgaXQncyBub3Qgc2V0LCB0aGUKLSAgICAgICAgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLSAgICAgICAgICAgdGhlIGRlZmF1bHQgYWRkcmVzcyBmb3IgPDwuZGF0YT4+IGlzIGRlcGVuZGVudCBvbiB0aGUgc3BlY2lmaWMKLSAgICAgICAgICAgdGFyZ2V0IGFuZCB2YXJpb3VzIGZsYWdzKS4gICovCi0KLSAgIGJmZF92bWEgdm1hOwotCi0gICAgICAgIC8qICBUaGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIC0gd2hlcmUgaXQgd291bGQgYmUgaW4gYQotICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLSAgICAgICAgICAgaW5mb3JtYXRpb24uICovCi0KLSAgIGJmZF92bWEgbG1hOwotCi0gICAgICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBpbiBieXRlcywgYXMgaXQgd2lsbCBiZSBvdXRwdXQuCi0gICAgICAgICAgIGNvbnRhaW5zIGEgdmFsdWUgZXZlbiBpZiB0aGUgc2VjdGlvbiBoYXMgbm8gY29udGVudHMgKGUuZy4sIHRoZQotICAgICAgICAgICBzaXplIG9mIDw8LmJzcz4+KS4gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiBhZnRlciByZWxvY2F0aW9uICovCi0KLSAgIGJmZF9zaXplX3R5cGUgX2Nvb2tlZF9zaXplOwotCi0gICAgICAgICAvKiBUaGUgb3JpZ2luYWwgc2l6ZSBvbiBkaXNrIG9mIHRoZSBzZWN0aW9uLCBpbiBieXRlcy4gIE5vcm1hbGx5IHRoaXMKLSAgICAgICAgICAgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUsIGJ1dCBpZiBzb21lIHJlbGF4aW5nIGhhcwotICAgICAgICAgICBiZWVuIGRvbmUsIHRoZW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGJpZ2dlci4gICovCi0KLSAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotCi0gICAgICAgICAvKiBJZiB0aGlzIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgb3V0cHV0LCB0aGVuIHRoaXMgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaW5wdXQKLSAgICAgICAgICAgc2VjdGlvbi4gRS5nLiwgaWYgdGhpcyB3YXMgZ29pbmcgdG8gc3RhcnQgYXQgdGhlIDEwMHRoIGJ5dGUgaW4KLSAgICAgICAgICAgdGhlIG91dHB1dCBzZWN0aW9uLCB0aGlzIHZhbHVlIHdvdWxkIGJlIDEwMC4gKi8KLQotICAgYmZkX3ZtYSBvdXRwdXRfb2Zmc2V0OwotCi0gICAgICAgICAvKiBUaGUgb3V0cHV0IHNlY3Rpb24gdGhyb3VnaCB3aGljaCB0byBtYXAgb24gb3V0cHV0LiAqLwotCi0gICBzdHJ1Y3Qgc2VjICpvdXRwdXRfc2VjdGlvbjsKLQotICAgICAgICAgLyogVGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUgc2VjdGlvbiwgYXMgYW4gZXhwb25lbnQgb2YgMiAtCi0gICAgICAgICAgIGUuZy4sIDMgYWxpZ25zIHRvIDJeMyAob3IgOCkuICovCi0KLSAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci0KLSAgICAgICAgIC8qIElmIGFuIGlucHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiByZWxvY2F0aW9uCi0gICAgICAgICAgIHJlY29yZHMgZm9yIHRoZSBkYXRhIGluIHRoaXMgc2VjdGlvbi4gKi8KLQotICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICpyZWxvY2F0aW9uOwotCi0gICAgICAgICAvKiBJZiBhbiBvdXRwdXQgc2VjdGlvbiwgYSBwb2ludGVyIHRvIGEgdmVjdG9yIG9mIHBvaW50ZXJzIHRvCi0gICAgICAgICAgIHJlbG9jYXRpb24gcmVjb3JkcyBmb3IgdGhlIGRhdGEgaW4gdGhpcyBzZWN0aW9uLiAqLwotCi0gICBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkgKipvcmVsb2NhdGlvbjsKLQotICAgICAgICAgLyogVGhlIG51bWJlciBvZiByZWxvY2F0aW9uIHJlY29yZHMgaW4gb25lIG9mIHRoZSBhYm92ZSAgKi8KLQotICAgdW5zaWduZWQgcmVsb2NfY291bnQ7Ci0KLSAgICAgICAgIC8qIEluZm9ybWF0aW9uIGJlbG93IGlzIGJhY2sgZW5kIHNwZWNpZmljIC0gYW5kIG5vdCBhbHdheXMgdXNlZAotICAgICAgICAgICBvciB1cGRhdGVkLiAgKi8KLQotICAgICAgICAgLyogRmlsZSBwb3NpdGlvbiBvZiBzZWN0aW9uIGRhdGEgICAgKi8KLQotICAgZmlsZV9wdHIgZmlsZXBvczsKLQotICAgICAgICAgLyogRmlsZSBwb3NpdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gKi8KLQotICAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0KLSAgICAgICAgIC8qIEZpbGUgcG9zaXRpb24gb2YgbGluZSBkYXRhICAgICAgICovCi0KLSAgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLQotICAgICAgICAgLyogUG9pbnRlciB0byBkYXRhIGZvciBhcHBsaWNhdGlvbnMgKi8KLQotICAgUFRSIHVzZXJkYXRhOwotCi0gICAgICAgICAvKiBJZiB0aGUgU0VDX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhpcyBwb2ludHMgdG8gdGhlIGFjdHVhbAotICAgICAgICAgICBjb250ZW50cy4gICovCi0gICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLQotICAgICAgICAgLyogQXR0YWNoZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gKi8KLQotICAgYWxlbnQgKmxpbmVubzsKLQotICAgICAgICAgLyogTnVtYmVyIG9mIGxpbmUgbnVtYmVyIHJlY29yZHMgICAqLwotCi0gICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotCi0gICAgICAgICAvKiBXaGVuIGEgc2VjdGlvbiBpcyBiZWluZyBvdXRwdXQsIHRoaXMgdmFsdWUgY2hhbmdlcyBhcyBtb3JlCi0gICAgICAgICAgIGxpbmVudW1iZXJzIGFyZSB3cml0dGVuIG91dCAqLwotCi0gICBmaWxlX3B0ciBtb3ZpbmdfbGluZV9maWxlcG9zOwotCi0gICAgICAgICAvKiBXaGF0IHRoZSBzZWN0aW9uIG51bWJlciBpcyBpbiB0aGUgdGFyZ2V0IHdvcmxkICAqLwotCi0gICBpbnQgdGFyZ2V0X2luZGV4OwotCi0gICBQVFIgdXNlZF9ieV9iZmQ7Ci0KLSAgICAgICAgIC8qIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBzZWN0aW9uIHRoZW4gaGVyZSBpcyBhIGxpc3Qgb2YgdGhlCi0gICAgICAgICAgIHJlbG9jYXRpb25zIGNyZWF0ZWQgdG8gcmVsb2NhdGUgaXRlbXMgd2l0aGluIGl0LiAqLwotCi0gICBzdHJ1Y3QgcmVsZW50X2NoYWluICpjb25zdHJ1Y3Rvcl9jaGFpbjsKLQotICAgICAgICAgLyogVGhlIEJGRCB3aGljaCBvd25zIHRoZSBzZWN0aW9uLiAqLwotCi0gICBiZmQgKm93bmVyOwotCi0gICAgICAgICAvKiBBIHN5bWJvbCB3aGljaCBwb2ludHMgYXQgdGhpcyBzZWN0aW9uIG9ubHkgKi8KLSAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1ib2xfcHRyX3B0cjsKLQotICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0gICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXJfdGFpbDsKLX0gYXNlY3Rpb24gOwotCi0gICAgIC8qIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLSAgICAgICBhbmQgdGFyZ2V0IGJhY2sgZW5kIGFyZSBub3QgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgdmFsdWVzIGluCi0gICAgICAgdGhlc2Ugc2VjdGlvbnMuICBOZXcgY29kZSBzaG91bGQgdXNlIHRoZSBzZWN0aW9uX3B0ciBtYWNyb3MgcmF0aGVyCi0gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0gICAgICAgbWF5IGV2ZW50dWFsbHkgdmFuaXNoLiAgKi8KLSNkZWZpbmUgQkZEX0FCU19TRUNUSU9OX05BTUUgIipBQlMqIgotI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0jZGVmaW5lIEJGRF9DT01fU0VDVElPTl9OQU1FICIqQ09NKiIKLSNkZWZpbmUgQkZEX0lORF9TRUNUSU9OX05BTUUgIipJTkQqIgotCi0gICAgIC8qIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2Fic19zZWN0aW9uOwotI2RlZmluZSBiZmRfYWJzX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9hYnNfc2VjdGlvbikKLSNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX3VuZF9zZWN0aW9uOwotI2RlZmluZSBiZmRfdW5kX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbikKLSNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0gICAgIC8qIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICovCi1leHRlcm4gY29uc3QgYXNlY3Rpb24gYmZkX2NvbV9zZWN0aW9uOwotI2RlZmluZSBiZmRfY29tX3NlY3Rpb25fcHRyICgoYXNlY3Rpb24gKikgJmJmZF9jb21fc2VjdGlvbikKLSAgICAgLyogUG9pbnRlciB0byB0aGUgaW5kaXJlY3Qgc2VjdGlvbiAqLwotZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLSNkZWZpbmUgYmZkX2luZF9zZWN0aW9uX3B0ciAoKGFzZWN0aW9uICopICZiZmRfaW5kX3NlY3Rpb24pCi0jZGVmaW5lIGJmZF9pc19pbmRfc2VjdGlvbihzZWMpICgoc2VjKSA9PSBiZmRfaW5kX3NlY3Rpb25fcHRyKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9hYnNfc3ltYm9sOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfY29tX3N5bWJvbDsKLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9pbmRfc3ltYm9sOwotI2RlZmluZSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2Moc2VjdGlvbikgXAotICAgICAoc2VjdGlvbi0+cmVsb2NfZG9uZSA/IChhYm9ydCgpLDEpOiAoc2VjdGlvbiktPl9yYXdfc2l6ZSkKLSNkZWZpbmUgYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2Moc2VjdGlvbikgXAotICAgICAoKHNlY3Rpb24tPnJlbG9jX2RvbmUpID8gKHNlY3Rpb24pLT5fY29va2VkX3NpemU6IChhYm9ydCgpLDEpKQotYXNlY3Rpb24gKgotYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpKTsKLQotYXNlY3Rpb24gKgotYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKSk7Ci0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKm5hbWUpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc2VjdGlvbl9mbGFncyBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGZsYWd3b3JkIGZsYWdzKSk7Ci0KLXZvaWQgCi1iZmRfbWFwX292ZXJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICphYmZkLAotICAgIHZvaWQgKCpmdW5jKShiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlY3QsCi0gICAgUFRSIG9iaiksCi0gICAgUFRSIG9iaikpOwotCi1ib29sZWFuIAotYmZkX3NldF9zZWN0aW9uX3NpemUgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjLCBiZmRfc2l6ZV90eXBlIHZhbCkpOwotCi1ib29sZWFuIAotYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFzZWN0aW9uICpzZWN0aW9uLAotICAgIFBUUiBkYXRhLAotICAgIGZpbGVfcHRyIG9mZnNldCwKLSAgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0KLWJvb2xlYW4gCi1iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sCi0gICAgZmlsZV9wdHIgb2Zmc2V0LCBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGFzZWN0aW9uICppc2VjLCBiZmQgKm9iZmQsIGFzZWN0aW9uICpvc2VjKSk7Ci0KLSNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoaWJmZCwgaXNlY3Rpb24sIG9iZmQsIG9zZWN0aW9uKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pKQotdm9pZCAKLV9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAotIFBBUkFNUyAoKGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0KLWVudW0gYmZkX2FyY2hpdGVjdHVyZSAKLXsKLSAgYmZkX2FyY2hfdW5rbm93biwgICAgLyogRmlsZSBhcmNoIG5vdCBrbm93biAqLwotICBiZmRfYXJjaF9vYnNjdXJlLCAgICAvKiBBcmNoIGtub3duLCBub3Qgb25lIG9mIHRoZXNlICovCi0gIGJmZF9hcmNoX202OGssICAgICAgIC8qIE1vdG9yb2xhIDY4eHh4ICovCi0jZGVmaW5lIGJmZF9tYWNoX202ODAwMCAxCi0jZGVmaW5lIGJmZF9tYWNoX202ODAwOCAyCi0jZGVmaW5lIGJmZF9tYWNoX202ODAxMCAzCi0jZGVmaW5lIGJmZF9tYWNoX202ODAyMCA0Ci0jZGVmaW5lIGJmZF9tYWNoX202ODAzMCA1Ci0jZGVmaW5lIGJmZF9tYWNoX202ODA0MCA2Ci0jZGVmaW5lIGJmZF9tYWNoX202ODA2MCA3Ci0jZGVmaW5lIGJmZF9tYWNoX2NwdTMyICA4Ci0gIGJmZF9hcmNoX3ZheCwgICAgICAgIC8qIERFQyBWYXggKi8gICAKLSAgYmZkX2FyY2hfaTk2MCwgICAgICAgLyogSW50ZWwgOTYwICovCi0gICAgIC8qIFRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nIGlzIGltcG9ydGFudC4KLSAgICAgICBsb3dlciBudW1iZXIgaW5kaWNhdGVzIGEgbWFjaGluZSB0eXBlIHRoYXQgCi0gICAgICAgb25seSBhY2NlcHRzIGEgc3Vic2V0IG9mIHRoZSBpbnN0cnVjdGlvbnMKLSAgICAgICBhdmFpbGFibGUgdG8gbWFjaGluZXMgd2l0aCBoaWdoZXIgbnVtYmVycy4KLSAgICAgICBUaGUgZXhjZXB0aW9uIGlzIHRoZSAiY2EiLCB3aGljaCBpcwotICAgICAgIGluY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlciBtYWNoaW5lcyBleGNlcHQgCi0gICAgICAgImNvcmUiLiAqLwotCi0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfY29yZSAgICAgIDEKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9rYV9zYSAgICAgMgotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2tiX3NiICAgICAzCi0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfbWMgICAgICAgIDQKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF94YSAgICAgICAgNQotI2RlZmluZSBiZmRfbWFjaF9pOTYwX2NhICAgICAgICA2Ci0jZGVmaW5lIGJmZF9tYWNoX2k5NjBfanggICAgICAgIDcKLSNkZWZpbmUgYmZkX21hY2hfaTk2MF9oeCAgICAgICAgOAotCi0gIGJmZF9hcmNoX2EyOWssICAgICAgIC8qIEFNRCAyOTAwMCAqLwotICBiZmRfYXJjaF9zcGFyYywgICAgICAvKiBTUEFSQyAqLwotI2RlZmluZSBiZmRfbWFjaF9zcGFyYyAgICAgICAgICAgICAgICAgMQotIC8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdjhwbHVzIGFuZCB2OSBpcyB0aGF0IHY5IGlzIGEgdHJ1ZSA2NCBiaXQgZW52LiAgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQgICAgICAgIDIKLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlICAgICAgIDMKLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjhwbHVzICAgICAgICAgIDQKLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSAgICAgICAgIDUgIC8qIHdpdGggdWx0cmFzcGFyYyBhZGQnbnMgKi8KLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlICAgIDYKLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjkgICAgICAgICAgICAgIDcKLSNkZWZpbmUgYmZkX21hY2hfc3BhcmNfdjlhICAgICAgICAgICAgIDggIC8qIHdpdGggdWx0cmFzcGFyYyBhZGQnbnMgKi8KLSAvKiBOb256ZXJvIGlmIE1BQ0ggaGFzIHRoZSB2OSBpbnN0cnVjdGlvbiBzZXQuICAqLwotI2RlZmluZSBiZmRfbWFjaF9zcGFyY192OV9wKG1hY2gpIFwKLSAgKChtYWNoKSA+PSBiZmRfbWFjaF9zcGFyY192OHBsdXMgJiYgKG1hY2gpIDw9IGJmZF9tYWNoX3NwYXJjX3Y5YSkKLSAgYmZkX2FyY2hfbWlwcywgICAgICAgLyogTUlQUyBSeHh4eCAqLwotI2RlZmluZSBiZmRfbWFjaF9taXBzMzAwMCAgICAgICAgICAgICAgMzAwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzMzkwMCAgICAgICAgICAgICAgMzkwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzNDAwMCAgICAgICAgICAgICAgNDAwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzNDAxMCAgICAgICAgICAgICAgNDAxMAotI2RlZmluZSBiZmRfbWFjaF9taXBzNDEwMCAgICAgICAgICAgICAgNDEwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzNDExMSAgICAgICAgICAgICAgNDExMQotI2RlZmluZSBiZmRfbWFjaF9taXBzNDMwMCAgICAgICAgICAgICAgNDMwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzNDQwMCAgICAgICAgICAgICAgNDQwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzNDYwMCAgICAgICAgICAgICAgNDYwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzNDY1MCAgICAgICAgICAgICAgNDY1MAotI2RlZmluZSBiZmRfbWFjaF9taXBzNTAwMCAgICAgICAgICAgICAgNTAwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzNjAwMCAgICAgICAgICAgICAgNjAwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzODAwMCAgICAgICAgICAgICAgODAwMAotI2RlZmluZSBiZmRfbWFjaF9taXBzMTAwMDAgICAgICAgICAgICAgMTAwMDAKLSNkZWZpbmUgYmZkX21hY2hfbWlwczE2ICAgICAgICAgICAgICAgIDE2Ci0gIGJmZF9hcmNoX2kzODYsICAgICAgIC8qIEludGVsIDM4NiAqLwotI2RlZmluZSBiZmRfbWFjaF9pMzg2X2kzODYgMAotI2RlZmluZSBiZmRfbWFjaF9pMzg2X2k4MDg2IDEKLSNkZWZpbmUgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCAyCi0gIGJmZF9hcmNoX3dlMzJrLCAgICAgIC8qIEFUJlQgV0UzMnh4eCAqLwotICBiZmRfYXJjaF90YWhvZSwgICAgICAvKiBDQ0kvSGFycmlzIFRhaG9lICovCi0gIGJmZF9hcmNoX2k4NjAsICAgICAgIC8qIEludGVsIDg2MCAqLwotICBiZmRfYXJjaF9yb21wLCAgICAgICAvKiBJQk0gUk9NUCBQQy9SVCAqLwotICBiZmRfYXJjaF9hbGxpYW50LCAgICAvKiBBbGxpYW50ICovCi0gIGJmZF9hcmNoX2NvbnZleCwgICAgIC8qIENvbnZleCAqLwotICBiZmRfYXJjaF9tODhrLCAgICAgICAvKiBNb3Rvcm9sYSA4OHh4eCAqLwotICBiZmRfYXJjaF9weXJhbWlkLCAgICAvKiBQeXJhbWlkIFRlY2hub2xvZ3kgKi8KLSAgYmZkX2FyY2hfaDgzMDAsICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfaDgzMDAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX2g4MzAwaCAgMgotI2RlZmluZSBiZmRfbWFjaF9oODMwMHMgIDMKLSAgYmZkX2FyY2hfcG93ZXJwYywgICAgLyogUG93ZXJQQyAqLwotICBiZmRfYXJjaF9yczYwMDAsICAgICAvKiBJQk0gUlMvNjAwMCAqLwotICBiZmRfYXJjaF9ocHBhLCAgICAgICAvKiBIUCBQQSBSSVNDICovCi0gIGJmZF9hcmNoX2QxMHYsICAgICAgIC8qIE1pdHN1YmlzaGkgRDEwViAqLwotICBiZmRfYXJjaF9kMzB2LCAgICAgICAvKiBNaXRzdWJpc2hpIEQzMFYgKi8KLSAgYmZkX2FyY2hfejhrLCAgICAgICAgLyogWmlsb2cgWjgwMDAgKi8KLSNkZWZpbmUgYmZkX21hY2hfejgwMDEgICAgICAgICAxCi0jZGVmaW5lIGJmZF9tYWNoX3o4MDAyICAgICAgICAgMgotICBiZmRfYXJjaF9oODUwMCwgICAgICAvKiBIaXRhY2hpIEg4LzUwMCAqLwotICBiZmRfYXJjaF9zaCwgICAgICAgICAvKiBIaXRhY2hpIFNIICovCi0jZGVmaW5lIGJmZF9tYWNoX3NoICAgICAgICAgICAgMAotI2RlZmluZSBiZmRfbWFjaF9zaDMgICAgICAgIDB4MzAKLSNkZWZpbmUgYmZkX21hY2hfc2gzZSAgICAgICAweDNlCi0gIGJmZF9hcmNoX2FscGhhLCAgICAgIC8qIERlYyBBbHBoYSAqLwotI2RlZmluZSBiZmRfbWFjaF9hbHBoYV9ldjQgIDB4MTAKLSNkZWZpbmUgYmZkX21hY2hfYWxwaGFfZXY1ICAweDIwCi0jZGVmaW5lIGJmZF9tYWNoX2FscGhhX2V2NiAgMHgzMAotICBiZmRfYXJjaF9hcm0sICAgICAgICAvKiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqLwotI2RlZmluZSBiZmRfbWFjaF9hcm1fMiAgICAgICAgIDEKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzJhICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgYmZkX21hY2hfYXJtXzMgICAgICAgICAzCi0jZGVmaW5lIGJmZF9tYWNoX2FybV8zTSAgICAgICAgNAotI2RlZmluZSBiZmRfbWFjaF9hcm1fNCAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBiZmRfbWFjaF9hcm1fNFQgICAgICAgIDYKLSAgYmZkX2FyY2hfbnMzMmssICAgICAgLyogTmF0aW9uYWwgU2VtaWNvbmR1Y3RvcnMgbnMzMjAwMCAqLwotICBiZmRfYXJjaF93NjUsICAgICAgICAvKiBXREMgNjU4MTYgKi8KLSAgYmZkX2FyY2hfdGljMzAsICAgICAgLyogVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwICovCi0gIGJmZF9hcmNoX3RpYzgwLCAgICAgIC8qIFRJIFRNUzMyMGM4MCAoTVZQKSAqLwotICBiZmRfYXJjaF92ODUwLCAgICAgICAvKiBORUMgVjg1MCAqLwotI2RlZmluZSBiZmRfbWFjaF92ODUwICAgICAgICAgIDAKLSNkZWZpbmUgYmZkX21hY2hfdjg1MGUgICAgICAgICAnRScKLSNkZWZpbmUgYmZkX21hY2hfdjg1MGVhICAgICAgICAnQScKLSAgYmZkX2FyY2hfYXJjLCAgICAgICAgLyogQXJnb25hdXQgUklTQyBDb3JlICovCi0jZGVmaW5lIGJmZF9tYWNoX2FyY19iYXNlIDAKLSAgYmZkX2FyY2hfbTMyciwgICAgICAgLyogTWl0c3ViaXNoaSBNMzJSL0QgKi8KLSNkZWZpbmUgYmZkX21hY2hfbTMyciAgICAgICAgICAwICAvKiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwotICBiZmRfYXJjaF9tbjEwMjAwLCAgICAvKiBNYXRzdXNoaXRhIE1OMTAyMDAgKi8KLSAgYmZkX2FyY2hfbW4xMDMwMCwgICAgLyogTWF0c3VzaGl0YSBNTjEwMzAwICovCi0jZGVmaW5lIGJmZF9tYWNoX21uMTAzMDAgICAgICAgICAgICAgICAzMDAKLSAgYmZkX2FyY2hfZnIzMCwKLSNkZWZpbmUgYmZkX21hY2hfZnIzMCAgICAgICAgICAweDQ2NTIzMzMwCi0gIGJmZF9hcmNoX21jb3JlLAotICBiZmRfYXJjaF9sYXN0Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IGJmZF9hcmNoX2luZm8gCi17Ci0gIGludCBiaXRzX3Blcl93b3JkOwotICBpbnQgYml0c19wZXJfYWRkcmVzczsKLSAgaW50IGJpdHNfcGVyX2J5dGU7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICB1bnNpZ25lZCBsb25nIG1hY2g7Ci0gIGNvbnN0IGNoYXIgKmFyY2hfbmFtZTsKLSAgY29uc3QgY2hhciAqcHJpbnRhYmxlX25hbWU7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX2FsaWduX3Bvd2VyOwotICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGRlZmF1bHQgbWFjaGluZSBmb3IgdGhlIGFyY2hpdGVjdHVyZSAqLwotICBib29sZWFuIHRoZV9kZWZhdWx0OyAKLSAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiAoKmNvbXBhdGlibGUpCi0gICAgICAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmEsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmIpKTsKLQotICBib29sZWFuICgqc2NhbikgUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKm5leHQ7Ci19IGJmZF9hcmNoX2luZm9fdHlwZTsKLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9uYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX3NjYW5fYXJjaCBQQVJBTVMgKChjb25zdCBjaGFyICpzdHJpbmcpKTsKLQotY29uc3QgY2hhciAqKgotYmZkX2FyY2hfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1iZmRfYXJjaF9nZXRfY29tcGF0aWJsZSBQQVJBTVMgKCgKLSAgICBjb25zdCBiZmQgKmFiZmQsCi0gICAgY29uc3QgYmZkICpiYmZkKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X2FyY2hfaW5mbyBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJnKSk7Ci0KLWVudW0gYmZkX2FyY2hpdGVjdHVyZSAKLWJmZF9nZXRfYXJjaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdW5zaWduZWQgbG9uZyAKLWJmZF9nZXRfbWFjaCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdW5zaWduZWQgaW50IAotYmZkX2FyY2hfYml0c19wZXJfYnl0ZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotdW5zaWduZWQgaW50IAotYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogCi1iZmRfZ2V0X2FyY2hfaW5mbyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWJmZF9sb29rdXBfYXJjaAotIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZQotICAgIGFyY2gsCi0gICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLWNvbnN0IGNoYXIgKgotYmZkX3ByaW50YWJsZV9hcmNoX21hY2gKLSBQQVJBTVMgKChlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaCwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLXR5cGVkZWYgZW51bSBiZmRfcmVsb2Nfc3RhdHVzCi17Ci0gICAgICAgIC8qIE5vIGVycm9ycyBkZXRlY3RlZCAqLwotICBiZmRfcmVsb2Nfb2ssCi0KLSAgICAgICAgLyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IHRoZXJlIHdhcyBhbiBvdmVyZmxvdy4gKi8KLSAgYmZkX3JlbG9jX292ZXJmbG93LAotCi0gICAgICAgIC8qIFRoZSBhZGRyZXNzIHRvIHJlbG9jYXRlIHdhcyBub3Qgd2l0aGluIHRoZSBzZWN0aW9uIHN1cHBsaWVkLiAqLwotICBiZmRfcmVsb2Nfb3V0b2ZyYW5nZSwKLQotICAgICAgICAvKiBVc2VkIGJ5IHNwZWNpYWwgZnVuY3Rpb25zICovCi0gIGJmZF9yZWxvY19jb250aW51ZSwKLQotICAgICAgICAvKiBVbnN1cHBvcnRlZCByZWxvY2F0aW9uIHNpemUgcmVxdWVzdGVkLiAqLwotICBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkLAotCi0gICAgICAgIC8qIFVudXNlZCAqLwotICBiZmRfcmVsb2Nfb3RoZXIsCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCB0byByZWxvY2F0ZSBhZ2FpbnN0IHdhcyB1bmRlZmluZWQuICovCi0gIGJmZF9yZWxvY191bmRlZmluZWQsCi0KLSAgICAgICAgLyogVGhlIHJlbG9jYXRpb24gd2FzIHBlcmZvcm1lZCwgYnV0IG1heSBub3QgYmUgb2sgLSBwcmVzZW50bHkKLSAgICAgICAgICBnZW5lcmF0ZWQgb25seSB3aGVuIGxpbmtpbmcgaTk2MCBjb2ZmIGZpbGVzIHdpdGggaTk2MCBiLm91dAotICAgICAgICAgIHN5bWJvbHMuICBJZiB0aGlzIHR5cGUgaXMgcmV0dXJuZWQsIHRoZSBlcnJvcl9tZXNzYWdlIGFyZ3VtZW50Ci0gICAgICAgICAgdG8gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB3aWxsIGJlIHNldC4gICovCi0gIGJmZF9yZWxvY19kYW5nZXJvdXMKLSB9Ci0gYmZkX3JlbG9jX3N0YXR1c190eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5Ci17Ci0gICAgICAgIC8qIEEgcG9pbnRlciBpbnRvIHRoZSBjYW5vbmljYWwgdGFibGUgb2YgcG9pbnRlcnMgICovCi0gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKipzeW1fcHRyX3B0cjsKLQotICAgICAgICAvKiBvZmZzZXQgaW4gc2VjdGlvbiAqLwotICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0KLSAgICAgICAgLyogYWRkZW5kIGZvciByZWxvY2F0aW9uIHZhbHVlICovCi0gIGJmZF92bWEgYWRkZW5kOwotCi0gICAgICAgIC8qIFBvaW50ZXIgdG8gaG93IHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIHJlbG9jYXRpb24gKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLX0gYXJlbGVudDsKLWVudW0gY29tcGxhaW5fb3ZlcmZsb3cKLXsKLSAgICAgICAgLyogRG8gbm90IGNvbXBsYWluIG9uIG92ZXJmbG93LiAqLwotICBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCi0gICAgICAgIC8qIENvbXBsYWluIGlmIHRoZSBiaXRmaWVsZCBvdmVyZmxvd3MsIHdoZXRoZXIgaXQgaXMgY29uc2lkZXJlZAotICAgICAgICAgIGFzIHNpZ25lZCBvciB1bnNpZ25lZC4gKi8KLSAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0KLSAgICAgICAgLyogQ29tcGxhaW4gaWYgdGhlIHZhbHVlIG92ZXJmbG93cyB3aGVuIGNvbnNpZGVyZWQgYXMgc2lnbmVkCi0gICAgICAgICAgbnVtYmVyLiAqLwotICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0KLSAgICAgICAgLyogQ29tcGxhaW4gaWYgdGhlIHZhbHVlIG92ZXJmbG93cyB3aGVuIGNvbnNpZGVyZWQgYXMgYW4KLSAgICAgICAgICB1bnNpZ25lZCBudW1iZXIuICovCi0gIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkCi19OwotCi1zdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0Ci17Ci0gICAgICAgIC8qICBUaGUgdHlwZSBmaWVsZCBoYXMgbWFpbmx5IGEgZG9jdW1lbnRhcnkgdXNlIC0gdGhlIGJhY2sgZW5kIGNhbgotICAgICAgICAgICBkbyB3aGF0IGl0IHdhbnRzIHdpdGggaXQsIHRob3VnaCBub3JtYWxseSB0aGUgYmFjayBlbmQncwotICAgICAgICAgICBleHRlcm5hbCBpZGVhIG9mIHdoYXQgYSByZWxvYyBudW1iZXIgaXMgc3RvcmVkCi0gICAgICAgICAgIGluIHRoaXMgZmllbGQuIEZvciBleGFtcGxlLCBhIFBDIHJlbGF0aXZlIHdvcmQgcmVsb2NhdGlvbgotICAgICAgICAgICBpbiBhIGNvZmYgZW52aXJvbm1lbnQgaGFzIHRoZSB0eXBlIDAyMyAtIGJlY2F1c2UgdGhhdCdzCi0gICAgICAgICAgIHdoYXQgdGhlIG91dHNpZGUgd29ybGQgY2FsbHMgYSBSX1BDUldPUkQgcmVsb2MuICovCi0gIHVuc2lnbmVkIGludCB0eXBlOwotCi0gICAgICAgIC8qICBUaGUgdmFsdWUgdGhlIGZpbmFsIHJlbG9jYXRpb24gaXMgc2hpZnRlZCByaWdodCBieS4gVGhpcyBkcm9wcwotICAgICAgICAgICB1bndhbnRlZCBkYXRhIGZyb20gdGhlIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBpbnQgcmlnaHRzaGlmdDsKLQotICAgICAgICAvKiAgVGhlIHNpemUgb2YgdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyAqbm90KiBhCi0gICAgICAgICAgIHBvd2VyLW9mLXR3byBtZWFzdXJlLiAgVG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgb3BlcmF0ZWQKLSAgICAgICAgICAgb24gYnkgYSB0eXBlIG9mIHJlbG9jYXRpb24sIHVzZSBiZmRfZ2V0X3JlbG9jX3NpemUuICAqLwotICBpbnQgc2l6ZTsKLQotICAgICAgICAvKiAgVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBpdGVtIHRvIGJlIHJlbG9jYXRlZC4gIFRoaXMgaXMgdXNlZAotICAgICAgICAgICB3aGVuIGRvaW5nIG92ZXJmbG93IGNoZWNraW5nLiAgKi8KLSAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0KLSAgICAgICAgLyogIE5vdGVzIHRoYXQgdGhlIHJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZQotICAgICAgICAgICBkYXRhIHNlY3Rpb24gb2YgdGhlIGFkZGVuZC4gVGhlIHJlbG9jYXRpb24gZnVuY3Rpb24gd2lsbAotICAgICAgICAgICBzdWJ0cmFjdCBmcm9tIHRoZSByZWxvY2F0aW9uIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgotICAgICAgICAgICBiZWluZyByZWxvY2F0ZWQuICovCi0gIGJvb2xlYW4gcGNfcmVsYXRpdmU7Ci0KLSAgICAgICAgLyogIFRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIHJlbG9jIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbi4KLSAgICAgICAgICAgVGhlIHJlbG9jYXRlZCB2YWx1ZSBpcyBsZWZ0IHNoaWZ0ZWQgYnkgdGhpcyBhbW91bnQuICovCi0gIHVuc2lnbmVkIGludCBiaXRwb3M7Ci0KLSAgICAgICAgLyogV2hhdCB0eXBlIG9mIG92ZXJmbG93IGVycm9yIHNob3VsZCBiZSBjaGVja2VkIGZvciB3aGVuCi0gICAgICAgICAgcmVsb2NhdGluZy4gKi8KLSAgZW51bSBjb21wbGFpbl9vdmVyZmxvdyBjb21wbGFpbl9vbl9vdmVyZmxvdzsKLQotICAgICAgICAvKiBJZiB0aGlzIGZpZWxkIGlzIG5vbiBudWxsLCB0aGVuIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBpcwotICAgICAgICAgIGNhbGxlZCByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGZ1bmN0aW9uLiBUaGlzIGFsbG93cyByZWFsbHkKLSAgICAgICAgICBzdHJhbmdlIHJlbG9jYXRpb24gbWV0aG9kcyB0byBiZSBhY2NvbW9kYXRlZCAoZS5nLiwgaTk2MCBjYWxsagotICAgICAgICAgIGluc3RydWN0aW9ucykuICovCi0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAoKnNwZWNpYWxfZnVuY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7Ci0KLSAgICAgICAgLyogVGhlIHRleHR1YWwgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlLiAqLwotICBjaGFyICpuYW1lOwotCi0gICAgICAgIC8qIFdoZW4gcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluaywgc29tZSBmb3JtYXRzIG11c3QgbW9kaWZ5IHRoZQotICAgICAgICAgIHJlbG9jYXRpb25zIHJhdGhlciB0aGFuIHRoZSBkYXRhIC0gdGhpcyBmbGFnIHNpZ25hbHMgdGhpcy4qLwotICBib29sZWFuIHBhcnRpYWxfaW5wbGFjZTsKLQotICAgICAgICAvKiBUaGUgc3JjX21hc2sgc2VsZWN0cyB3aGljaCBwYXJ0cyBvZiB0aGUgcmVhZCBpbiBkYXRhCi0gICAgICAgICAgYXJlIHRvIGJlIHVzZWQgaW4gdGhlIHJlbG9jYXRpb24gc3VtLiAgRS5nLiwgaWYgdGhpcyB3YXMgYW4gOCBiaXQKLSAgICAgICAgICBiaXQgb2YgZGF0YSB3aGljaCB3ZSByZWFkIGFuZCByZWxvY2F0ZWQsIHRoaXMgd291bGQgYmUKLSAgICAgICAgICAweDAwMDAwMGZmLiBXaGVuIHdlIGhhdmUgcmVsb2NzIHdoaWNoIGhhdmUgYW4gYWRkZW5kLCBzdWNoIGFzCi0gICAgICAgICAgc3VuNCBleHRlbmRlZCByZWxvY3MsIHRoZSB2YWx1ZSBpbiB0aGUgb2Zmc2V0IHBhcnQgb2YgYQotICAgICAgICAgIHJlbG9jYXRpbmcgZmllbGQgaXMgZ2FyYmFnZSBzbyB3ZSBuZXZlciB1c2UgaXQuIEluIHRoaXMgY2FzZQotICAgICAgICAgIHRoZSBtYXNrIHdvdWxkIGJlIDB4MDAwMDAwMDAuICovCi0gIGJmZF92bWEgc3JjX21hc2s7Ci0KLSAgICAgICAgLyogVGhlIGRzdF9tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSByZXBsYWNlZAotICAgICAgICAgIGludG8gdGhlIGluc3RydWN0aW9uLiBJbiBtb3N0IGNhc2VzIHNyY19tYXNrID09IGRzdF9tYXNrLAotICAgICAgICAgIGV4Y2VwdCBpbiB0aGUgYWJvdmUgc3BlY2lhbCBjYXNlLCB3aGVyZSBkc3RfbWFzayB3b3VsZCBiZQotICAgICAgICAgIDB4MDAwMDAwZmYsIGFuZCBzcmNfbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAgICovCi0gIGJmZF92bWEgZHN0X21hc2s7Ci0KLSAgICAgICAgLyogV2hlbiBzb21lIGZvcm1hdHMgY3JlYXRlIFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucywgdGhleSBsZWF2ZQotICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcGMgb2YgdGhlIHBsYWNlIGJlaW5nIHJlbG9jYXRlZCBpbiB0aGUgb2Zmc2V0Ci0gICAgICAgICAgc2xvdCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHNvIHRoYXQgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIGNhbgotICAgICAgICAgIGJlIG1hZGUganVzdCBieSBhZGRpbmcgaW4gYW4gb3JkaW5hcnkgb2Zmc2V0IChlLmcuLCBzdW4zIGEub3V0KS4KLSAgICAgICAgICBTb21lIGZvcm1hdHMgbGVhdmUgdGhlIGRpc3BsYWNlbWVudCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uCi0gICAgICAgICAgZW1wdHkgKGUuZy4sIG04OGsgYmNzKTsgdGhpcyBmbGFnIHNpZ25hbHMgdGhlIGZhY3QuKi8KLSAgYm9vbGVhbiBwY3JlbF9vZmZzZXQ7Ci0KLX07Ci0jZGVmaW5lIEhPV1RPKEMsIFIsUyxCLCBQLCBCSSwgTywgU0YsIE5BTUUsIElOUExBQ0UsIE1BU0tTUkMsIE1BU0tEU1QsIFBDKSBcCi0gIHsodW5zaWduZWQpQyxSLFMsQiwgUCwgQkksIE8sU0YsTkFNRSxJTlBMQUNFLE1BU0tTUkMsTUFTS0RTVCxQQ30KLSNkZWZpbmUgTkVXSE9XVE8oIEZVTkNUSU9OLCBOQU1FLFNJWkUsUkVMLElOKSBIT1dUTygwLDAsU0laRSwwLFJFTCwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsRlVOQ1RJT04sIE5BTUUsZmFsc2UsMCwwLElOKQotCi0jZGVmaW5lIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sKSAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoc3ltYm9sICE9IChhc3ltYm9sICopTlVMTCkgeyAgICAgICAgICAgICBcCi0gICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkgeyBcCi0gICAgICByZWxvY2F0aW9uID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci11bnNpZ25lZCBpbnQgCi1iZmRfZ2V0X3JlbG9jX3NpemUgIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKikpOwotCi10eXBlZGVmIHN0cnVjdCByZWxlbnRfY2hhaW4gewotICBhcmVsZW50IHJlbGVudDsKLSAgc3RydWN0ICAgcmVsZW50X2NoYWluICpuZXh0OwotfSBhcmVsZW50X2NoYWluOwotYmZkX3JlbG9jX3N0YXR1c190eXBlCi0KLWJmZF9jaGVja19vdmVyZmxvdwotIFBBUkFNUyAoKGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgaG93LAotICAgIHVuc2lnbmVkIGludCBiaXRzaXplLAotICAgIHVuc2lnbmVkIGludCByaWdodHNoaWZ0LAotICAgIHVuc2lnbmVkIGludCBhZGRyc2l6ZSwKLSAgICBiZmRfdm1hIHJlbG9jYXRpb24pKTsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi0KLWJmZF9wZXJmb3JtX3JlbG9jYXRpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgUFRSIGRhdGEsCi0gICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgYmZkICpvdXRwdXRfYmZkLAotICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlKSk7Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotCi1iZmRfaW5zdGFsbF9yZWxvY2F0aW9uCi0gUEFSQU1TICgoYmZkICphYmZkLAotICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgIFBUUiBkYXRhLCBiZmRfdm1hIGRhdGFfc3RhcnQsCi0gICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLQotZW51bSBiZmRfcmVsb2NfY29kZV9yZWFsIHsKLSAgX2R1bW15X2ZpcnN0X2JmZF9yZWxvY19jb2RlX3JlYWwsCi0KLQotLyogQmFzaWMgYWJzb2x1dGUgcmVsb2NhdGlvbnMgb2YgTiBiaXRzLiAqLwotICBCRkRfUkVMT0NfNjQsCi0gIEJGRF9SRUxPQ18zMiwKLSAgQkZEX1JFTE9DXzI2LAotICBCRkRfUkVMT0NfMjQsCi0gIEJGRF9SRUxPQ18xNiwKLSAgQkZEX1JFTE9DXzE0LAotICBCRkRfUkVMT0NfOCwKLQotLyogUEMtcmVsYXRpdmUgcmVsb2NhdGlvbnMuICBTb21ldGltZXMgdGhlc2UgYXJlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzCi1vZiB0aGUgcmVsb2NhdGlvbiBpdHNlbGY7IHNvbWV0aW1lcyB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YKLXRoZSBzZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHJlbG9jYXRpb24uICBJdCBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyB0YXJnZXQuCi0KLVRoZSAyNC1iaXQgcmVsb2NhdGlvbiBpcyB1c2VkIGluIHNvbWUgSW50ZWwgOTYwIGNvbmZpZ3VyYXRpb25zLiAqLwotICBCRkRfUkVMT0NfNjRfUENSRUwsCi0gIEJGRF9SRUxPQ18zMl9QQ1JFTCwKLSAgQkZEX1JFTE9DXzI0X1BDUkVMLAotICBCRkRfUkVMT0NfMTZfUENSRUwsCi0gIEJGRF9SRUxPQ18xMl9QQ1JFTCwKLSAgQkZEX1JFTE9DXzhfUENSRUwsCi0KLS8qIEZvciBFTEYuICovCi0gIEJGRF9SRUxPQ18zMl9HT1RfUENSRUwsCi0gIEJGRF9SRUxPQ18xNl9HT1RfUENSRUwsCi0gIEJGRF9SRUxPQ184X0dPVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzMyX0dPVE9GRiwKLSAgQkZEX1JFTE9DXzE2X0dPVE9GRiwKLSAgQkZEX1JFTE9DX0xPMTZfR09UT0ZGLAotICBCRkRfUkVMT0NfSEkxNl9HT1RPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGLAotICBCRkRfUkVMT0NfOF9HT1RPRkYsCi0gIEJGRF9SRUxPQ18zMl9QTFRfUENSRUwsCi0gIEJGRF9SRUxPQ18yNF9QTFRfUENSRUwsCi0gIEJGRF9SRUxPQ18xNl9QTFRfUENSRUwsCi0gIEJGRF9SRUxPQ184X1BMVF9QQ1JFTCwKLSAgQkZEX1JFTE9DXzMyX1BMVE9GRiwKLSAgQkZEX1JFTE9DXzE2X1BMVE9GRiwKLSAgQkZEX1JFTE9DX0xPMTZfUExUT0ZGLAotICBCRkRfUkVMT0NfSEkxNl9QTFRPRkYsCi0gIEJGRF9SRUxPQ19ISTE2X1NfUExUT0ZGLAotICBCRkRfUkVMT0NfOF9QTFRPRkYsCi0KLS8qIFJlbG9jYXRpb25zIHVzZWQgYnkgNjhLIEVMRi4gKi8KLSAgQkZEX1JFTE9DXzY4S19HTE9CX0RBVCwKLSAgQkZEX1JFTE9DXzY4S19KTVBfU0xPVCwKLSAgQkZEX1JFTE9DXzY4S19SRUxBVElWRSwKLQotLyogTGlua2FnZS10YWJsZSByZWxhdGl2ZS4gKi8KLSAgQkZEX1JFTE9DXzMyX0JBU0VSRUwsCi0gIEJGRF9SRUxPQ18xNl9CQVNFUkVMLAotICBCRkRfUkVMT0NfTE8xNl9CQVNFUkVMLAotICBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMLAotICBCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwsCi0gIEJGRF9SRUxPQ184X0JBU0VSRUwsCi0gIEJGRF9SRUxPQ19SVkEsCi0KLS8qIEFic29sdXRlIDgtYml0IHJlbG9jYXRpb24sIGJ1dCB1c2VkIHRvIGZvcm0gYW4gYWRkcmVzcyBsaWtlIDB4RkZubi4gKi8KLSAgQkZEX1JFTE9DXzhfRkZubiwKLQotLyogVGhlc2UgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbnMgYXJlIHN0b3JlZCBhcyB3b3JkIGRpc3BsYWNlbWVudHMgLS0KLWkuZS4sIGJ5dGUgZGlzcGxhY2VtZW50cyBzaGlmdGVkIHJpZ2h0IHR3byBiaXRzLiAgVGhlIDMwLWJpdCB3b3JkCi1kaXNwbGFjZW1lbnQgKDw8MzJfUENSRUxfUzI+PiAtLSAzMiBiaXRzLCBzaGlmdGVkIDIpIGlzIHVzZWQgb24gdGhlCi1TUEFSQy4gIChTUEFSQyB0b29scyBnZW5lcmFsbHkgcmVmZXIgdG8gdGhpcyBhcyA8PFdESVNQMzA+Pi4pICBUaGUKLXNpZ25lZCAxNi1iaXQgZGlzcGxhY2VtZW50IGlzIHVzZWQgb24gdGhlIE1JUFMsIGFuZCB0aGUgMjMtYml0Ci1kaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgQWxwaGEuICovCi0gIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwKLSAgQkZEX1JFTE9DXzE2X1BDUkVMX1MyLAotICBCRkRfUkVMT0NfMjNfUENSRUxfUzIsCi0KLS8qIEhpZ2ggMjIgYml0cyBhbmQgbG93IDEwIGJpdHMgb2YgMzItYml0IHZhbHVlLCBwbGFjZWQgaW50byBsb3dlciBiaXRzIG9mCi10aGUgdGFyZ2V0IHdvcmQuICBUaGVzZSBhcmUgdXNlZCBvbiB0aGUgU1BBUkMuICovCi0gIEJGRF9SRUxPQ19ISTIyLAotICBCRkRfUkVMT0NfTE8xMCwKLQotLyogRm9yIHN5c3RlbXMgdGhhdCBhbGxvY2F0ZSBhIEdsb2JhbCBQb2ludGVyIHJlZ2lzdGVyLCB0aGVzZSBhcmUKLWRpc3BsYWNlbWVudHMgb2ZmIHRoYXQgcmVnaXN0ZXIuICBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZQotaGFuZGxlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhlIHZhbHVlIHRoZSByZWdpc3RlciB3aWxsIGhhdmUgaXMKLWRlY2lkZWQgcmVsYXRpdmVseSBsYXRlLiAqLwotICBCRkRfUkVMT0NfR1BSRUwxNiwKLSAgQkZEX1JFTE9DX0dQUkVMMzIsCi0KLS8qIFJlbG9jIHR5cGVzIHVzZWQgZm9yIGk5NjAvYi5vdXQuICovCi0gIEJGRF9SRUxPQ19JOTYwX0NBTExKLAotCi0vKiBTUEFSQyBFTEYgcmVsb2NhdGlvbnMuICBUaGVyZSBpcyBwcm9iYWJseSBzb21lIG92ZXJsYXAgd2l0aCBvdGhlcgotcmVsb2NhdGlvbiB0eXBlcyBhbHJlYWR5IGRlZmluZWQuICovCi0gIEJGRF9SRUxPQ19OT05FLAotICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwKLSAgQkZEX1JFTE9DX1NQQVJDMjIsCi0gIEJGRF9SRUxPQ19TUEFSQzEzLAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QxMywKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLAotICBCRkRfUkVMT0NfU1BBUkNfUEMxMCwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19XUExUMzAsCi0gIEJGRF9SRUxPQ19TUEFSQ19DT1BZLAotICBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ19TUEFSQ19KTVBfU0xPVCwKLSAgQkZEX1JFTE9DX1NQQVJDX1JFTEFUSVZFLAotICBCRkRfUkVMT0NfU1BBUkNfVUEzMiwKLQotLyogSSB0aGluayB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gU1BBUkMgYS5vdXQgKGUuZy4sIFN1biA0KS4gKi8KLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMywKLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMiwKLQotLyogU1BBUkM2NCByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBCRkRfUkVMT0NfU1BBUkNfNjQgQkZEX1JFTE9DXzY0Ci0gIEJGRF9SRUxPQ19TUEFSQ18xMCwKLSAgQkZEX1JFTE9DX1NQQVJDXzExLAotICBCRkRfUkVMT0NfU1BBUkNfT0xPMTAsCi0gIEJGRF9SRUxPQ19TUEFSQ19ISDIyLAotICBCRkRfUkVMT0NfU1BBUkNfSE0xMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0xNMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ISDIyLAotICBCRkRfUkVMT0NfU1BBUkNfUENfSE0xMCwKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE2LAotICBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOSwKLSAgQkZEX1JFTE9DX1NQQVJDXzcsCi0gIEJGRF9SRUxPQ19TUEFSQ182LAotICBCRkRfUkVMT0NfU1BBUkNfNSwKLSNkZWZpbmUgQkZEX1JFTE9DX1NQQVJDX0RJU1A2NCBCRkRfUkVMT0NfNjRfUENSRUwKLSAgQkZEX1JFTE9DX1NQQVJDX1BMVDY0LAotICBCRkRfUkVMT0NfU1BBUkNfSElYMjIsCi0gIEJGRF9SRUxPQ19TUEFSQ19MT1gxMCwKLSAgQkZEX1JFTE9DX1NQQVJDX0g0NCwKLSAgQkZEX1JFTE9DX1NQQVJDX000NCwKLSAgQkZEX1JFTE9DX1NQQVJDX0w0NCwKLSAgQkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSLAotCi0vKiBTUEFSQyBsaXR0bGUgZW5kaWFuIHJlbG9jYXRpb24gKi8KLSAgQkZEX1JFTE9DX1NQQVJDX1JFVjMyLAotCi0vKiBBbHBoYSBFQ09GRiBhbmQgRUxGIHJlbG9jYXRpb25zLiAgU29tZSBvZiB0aGVzZSB0cmVhdCB0aGUgc3ltYm9sIG9yCi0iYWRkZW5kIiBpbiBzb21lIHNwZWNpYWwgd2F5LgotRm9yIEdQRElTUF9ISTE2ICgiZ3BkaXNwIikgcmVsb2NhdGlvbnMsIHRoZSBzeW1ib2wgaXMgaWdub3JlZCB3aGVuCi13cml0aW5nOyB3aGVuIHJlYWRpbmcsIGl0IHdpbGwgYmUgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sLiAgVGhlCi1hZGRlbmQgaXMgdGhlIGRpc3BsYWNlbWVudCBpbiBieXRlcyBvZiB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZnJvbQotdGhlICJsZGFoIiBpbnN0cnVjdGlvbiAod2hpY2ggaXMgYXQgdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYykuICovCi0gIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNiwKLQotLyogRm9yIEdQRElTUF9MTzE2ICgiaWdub3JlIikgcmVsb2NhdGlvbnMsIHRoZSBzeW1ib2wgaXMgaGFuZGxlZCBhcwotd2l0aCBHUERJU1BfSEkxNiByZWxvY3MuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nIHRoZQotcmVsb2NhdGlvbnMgb3V0LCBhbmQgaXMgZmlsbGVkIGluIHdpdGggdGhlIGZpbGUncyBHUCB2YWx1ZSBvbgotcmVhZGluZywgZm9yIGNvbnZlbmllbmNlLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTYsCi0KLS8qIFRoZSBFTEYgR1BESVNQIHJlbG9jYXRpb24gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgR1BESVNQX0hJMTYKLXJlbG9jYXRpb24gZXhjZXB0IHRoYXQgdGhlcmUgaXMgbm8gYWNjb21wYW55aW5nIEdQRElTUF9MTzE2Ci1yZWxvY2F0aW9uLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQLAotCi0vKiBUaGUgQWxwaGEgTElURVJBTC9MSVRVU0UgcmVsb2NzIGFyZSBwcm9kdWNlZCBieSBhIHN5bWJvbCByZWZlcmVuY2U7Ci10aGUgYXNzZW1ibGVyIHR1cm5zIGl0IGludG8gYSBMRFEgaW5zdHJ1Y3Rpb24gdG8gbG9hZCB0aGUgYWRkcmVzcyBvZgotdGhlIHN5bWJvbCwgYW5kIHRoZW4gZmlsbHMgaW4gYSByZWdpc3RlciBpbiB0aGUgcmVhbCBpbnN0cnVjdGlvbi4KLQotVGhlIExJVEVSQUwgcmVsb2MsIGF0IHRoZSBMRFEgaW5zdHJ1Y3Rpb24sIHJlZmVycyB0byB0aGUgLmxpdGEKLXNlY3Rpb24gc3ltYm9sLiAgVGhlIGFkZGVuZCBpcyBpZ25vcmVkIHdoZW4gd3JpdGluZywgYnV0IGlzIGZpbGxlZAotaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZSwgYXMgd2l0aCB0aGUKLUdQRElTUF9MTzE2IHJlbG9jLgotCi1UaGUgRUxGX0xJVEVSQUwgcmVsb2MgaXMgc29tZXdoZXJlIGJldHdlZW4gMTZfR09UT0ZGIGFuZCBHUERJU1BfTE8xNi4KLUl0IHNob3VsZCByZWZlciB0byB0aGUgc3ltYm9sIHRvIGJlIHJlZmVyZW5jZWQsIGFzIHdpdGggMTZfR09UT0ZGLAotYnV0IGl0IGdlbmVyYXRlcyBvdXRwdXQgbm90IGJhc2VkIG9uIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIC5nb3QKLXNlY3Rpb24sIGJ1dCByZWxhdGl2ZSB0byB0aGUgR1AgdmFsdWUgY2hvc2VuIGZvciB0aGUgZmlsZSBkdXJpbmcgdGhlCi1maW5hbCBsaW5rIHN0YWdlLgotCi1UaGUgTElUVVNFIHJlbG9jLCBvbiB0aGUgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIGxvYWRlZCBhZGRyZXNzLCBnaXZlcwotaW5mb3JtYXRpb24gdG8gdGhlIGxpbmtlciB0aGF0IGl0IG1pZ2h0IGJlIGFibGUgdG8gdXNlIHRvIG9wdGltaXplCi1hd2F5IHNvbWUgbGl0ZXJhbCBzZWN0aW9uIHJlZmVyZW5jZXMuICBUaGUgc3ltYm9sIGlzIGlnbm9yZWQgKHJlYWQKLWFzIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbCksIGFuZCB0aGUgImFkZGVuZCIgaW5kaWNhdGVzIHRoZSB0eXBlCi1vZiBpbnN0cnVjdGlvbiB1c2luZyB0aGUgcmVnaXN0ZXI6Ci0xIC0gIm1lbW9yeSIgZm10IGluc24KLTIgLSBieXRlLW1hbmlwdWxhdGlvbiAoYnl0ZSBvZmZzZXQgcmVnKQotMyAtIGpzciAodGFyZ2V0IG9mIGJyYW5jaCkKLQotVGhlIEdOVSBsaW5rZXIgY3VycmVudGx5IGRvZXNuJ3QgZG8gYW55IG9mIHRoaXMgb3B0aW1pemluZy4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTCwKLSAgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRSwKLQotLyogVGhlIEhJTlQgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgYSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBmaWxsZWQgaW50byB0aGUKLSJoaW50IiBmaWVsZCBvZiBhIGptcC9qc3IvcmV0IGluc3RydWN0aW9uLCBmb3IgcG9zc2libGUgYnJhbmNoLQotcHJlZGljdGlvbiBsb2dpYyB3aGljaCBtYXkgYmUgcHJvdmlkZWQgb24gc29tZSBwcm9jZXNzb3JzLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfSElOVCwKLQotLyogVGhlIExJTktBR0UgcmVsb2NhdGlvbiBvdXRwdXRzIGEgbGlua2FnZSBwYWlyIGluIHRoZSBvYmplY3QgZmlsZSwKLXdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLiAqLwotICBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRSwKLQotLyogVGhlIENPREVBRERSIHJlbG9jYXRpb24gb3V0cHV0cyBhIFNUT19DQSBpbiB0aGUgb2JqZWN0IGZpbGUsCi13aGljaCBpcyBmaWxsZWQgYnkgdGhlIGxpbmtlci4gKi8KLSAgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSLAotCi0vKiBCaXRzIDI3Li4yIG9mIHRoZSByZWxvY2F0aW9uIGFkZHJlc3Mgc2hpZnRlZCByaWdodCAyIGJpdHM7Ci1zaW1wbGUgcmVsb2Mgb3RoZXJ3aXNlLiAqLwotICBCRkRfUkVMT0NfTUlQU19KTVAsCi0KLS8qIFRoZSBNSVBTMTYganVtcCBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX01JUFMxNl9KTVAsCi0KLS8qIE1JUFMxNiBHUCByZWxhdGl2ZSByZWxvYy4gKi8KLSAgQkZEX1JFTE9DX01JUFMxNl9HUFJFTCwKLQotLyogSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZTsgc2ltcGxlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfSEkxNiwKLQotLyogSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZSBidXQgdGhlIGxvdyAxNiBiaXRzIHdpbGwgYmUgc2lnbgotZXh0ZW5kZWQgYW5kIGFkZGVkIHRvIGZvcm0gdGhlIGZpbmFsIHJlc3VsdC4gIElmIHRoZSBsb3cgMTYKLWJpdHMgZm9ybSBhIG5lZ2F0aXZlIG51bWJlciwgd2UgbmVlZCB0byBhZGQgb25lIHRvIHRoZSBoaWdoIHZhbHVlCi10byBjb21wZW5zYXRlIGZvciB0aGUgYm9ycm93IHdoZW4gdGhlIGxvdyBiaXRzIGFyZSBhZGRlZC4gKi8KLSAgQkZEX1JFTE9DX0hJMTZfUywKLQotLyogTG93IDE2IGJpdHMuICovCi0gIEJGRF9SRUxPQ19MTzE2LAotCi0vKiBMaWtlIEJGRF9SRUxPQ19ISTE2X1MsIGJ1dCBQQyByZWxhdGl2ZS4gKi8KLSAgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUywKLQotLyogTGlrZSBCRkRfUkVMT0NfTE8xNiwgYnV0IFBDIHJlbGF0aXZlLiAqLwotICBCRkRfUkVMT0NfUENSRUxfTE8xNiwKLQotLyogUmVsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgZ2xvYmFsIHBvaW50ZXIuICovCi0jZGVmaW5lIEJGRF9SRUxPQ19NSVBTX0dQUkVMIEJGRF9SRUxPQ19HUFJFTDE2Ci0KLS8qIFJlbG9jYXRpb24gYWdhaW5zdCBhIE1JUFMgbGl0ZXJhbCBzZWN0aW9uLiAqLwotICBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLAotCi0vKiBNSVBTIEVMRiByZWxvY2F0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX01JUFNfR09UMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0NBTEwxNiwKLSNkZWZpbmUgQkZEX1JFTE9DX01JUFNfR1BSRUwzMiBCRkRfUkVMT0NfR1BSRUwzMgotICBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiwKLSAgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwKLSAgQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2LAotICBCRkRfUkVMT0NfTUlQU19TVUIsCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFLAotICBCRkRfUkVMT0NfTUlQU19HT1RfT0ZTVCwKLSAgQkZEX1JFTE9DX01JUFNfR09UX0RJU1AsCi0KLQotLyogaTM4Ni9lbGYgcmVsb2NhdGlvbnMgKi8KLSAgQkZEX1JFTE9DXzM4Nl9HT1QzMiwKLSAgQkZEX1JFTE9DXzM4Nl9QTFQzMiwKLSAgQkZEX1JFTE9DXzM4Nl9DT1BZLAotICBCRkRfUkVMT0NfMzg2X0dMT0JfREFULAotICBCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVCwKLSAgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSwKLSAgQkZEX1JFTE9DXzM4Nl9HT1RPRkYsCi0gIEJGRF9SRUxPQ18zODZfR09UUEMsCi0KLS8qIG5zMzJrIHJlbG9jYXRpb25zICovCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOCwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNiwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMiwKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84LAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNiwKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzIsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwsCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2X1BDUkVMLAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCwKLQotLyogUG93ZXIocnM2MDAwKSBhbmQgUG93ZXJQQyByZWxvY2F0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX1BQQ19CMjYsCi0gIEJGRF9SRUxPQ19QUENfQkEyNiwKLSAgQkZEX1JFTE9DX1BQQ19UT0MxNiwKLSAgQkZEX1JFTE9DX1BQQ19CMTYsCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4sCi0gIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0JBMTYsCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOLAotICBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU4sCi0gIEJGRF9SRUxPQ19QUENfQ09QWSwKLSAgQkZEX1JFTE9DX1BQQ19HTE9CX0RBVCwKLSAgQkZEX1JFTE9DX1BQQ19KTVBfU0xPVCwKLSAgQkZEX1JFTE9DX1BQQ19SRUxBVElWRSwKLSAgQkZEX1JFTE9DX1BQQ19MT0NBTDI0UEMsCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzIsCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8sCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEksCi0gIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMlJFTCwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjEsCi0gIEJGRF9SRUxPQ19QUENfRU1CX01SS1JFRiwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTYsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPLAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISSwKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEsCi0gIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQsCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQSwKLQotLyogVGhlIHR5cGUgb2YgcmVsb2MgdXNlZCB0byBidWlsZCBhIGNvbnRydWN0b3IgdGFibGUgLSBhdCB0aGUgbW9tZW50Ci1wcm9iYWJseSBhIDMyIGJpdCB3aWRlIGFic29sdXRlIHJlbG9jYXRpb24sIGJ1dCB0aGUgdGFyZ2V0IGNhbiBjaG9vc2UuCi1JdCBnZW5lcmFsbHkgZG9lcyBtYXAgdG8gb25lIG9mIHRoZSBvdGhlciByZWxvY2F0aW9uIHR5cGVzLiAqLwotICBCRkRfUkVMT0NfQ1RPUiwKLQotLyogQVJNIDI2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2guICBUaGUgbG93ZXN0IHR3byBiaXRzIG11c3QgYmUgemVybyBhbmQgYXJlCi1ub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsCi0KLS8qIFRoZXNlIHJlbG9jcyBhcmUgb25seSB1c2VkIHdpdGhpbiB0aGUgQVJNIGFzc2VtYmxlci4gIFRoZXkgYXJlIG5vdAotKGF0IHByZXNlbnQpIHdyaXR0ZW4gdG8gYW55IG9iamVjdCBmaWxlcy4gKi8KLSAgQkZEX1JFTE9DX0FSTV9JTU1FRElBVEUsCi0gIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fU1dJLAotICBCRkRfUkVMT0NfQVJNX01VTFRJLAotICBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU0sCi0gIEJGRF9SRUxPQ19BUk1fQURSX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9MRFJfSU1NLAotICBCRkRfUkVMT0NfQVJNX0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BUk1fSU5fUE9PTCwKLSAgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOCwKLSAgQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwsCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfQURELAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX0lNTSwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVCwKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQsCi0gIEJGRF9SRUxPQ19BUk1fR09UMTIsCi0gIEJGRF9SRUxPQ19BUk1fR09UMzIsCi0gIEJGRF9SRUxPQ19BUk1fSlVNUF9TTE9ULAotICBCRkRfUkVMT0NfQVJNX0NPUFksCi0gIEJGRF9SRUxPQ19BUk1fR0xPQl9EQVQsCi0gIEJGRF9SRUxPQ19BUk1fUExUMzIsCi0gIEJGRF9SRUxPQ19BUk1fUkVMQVRJVkUsCi0gIEJGRF9SRUxPQ19BUk1fR09UT0ZGLAotICBCRkRfUkVMT0NfQVJNX0dPVFBDLAotCi0vKiBIaXRhY2hpIFNIIHJlbG9jcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4gKi8KLSAgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIsCi0gIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiwKLSAgQkZEX1JFTE9DX1NIX0lNTTQsCi0gIEJGRF9SRUxPQ19TSF9JTU00QlkyLAotICBCRkRfUkVMT0NfU0hfSU1NNEJZNCwKLSAgQkZEX1JFTE9DX1NIX0lNTTgsCi0gIEJGRF9SRUxPQ19TSF9JTU04QlkyLAotICBCRkRfUkVMT0NfU0hfSU1NOEJZNCwKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMiwKLSAgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCwKLSAgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LAotICBCRkRfUkVMT0NfU0hfU1dJVENIMzIsCi0gIEJGRF9SRUxPQ19TSF9VU0VTLAotICBCRkRfUkVMT0NfU0hfQ09VTlQsCi0gIEJGRF9SRUxPQ19TSF9BTElHTiwKLSAgQkZEX1JFTE9DX1NIX0NPREUsCi0gIEJGRF9SRUxPQ19TSF9EQVRBLAotICBCRkRfUkVMT0NfU0hfTEFCRUwsCi0KLS8qIFRodW1iIDIzLSwgMTItIGFuZCA5LWJpdCBwYy1yZWxhdGl2ZSBicmFuY2hlcy4gIFRoZSBsb3dlc3QgYml0IG11c3QKLWJlIHplcm8gYW5kIGlzIG5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOSwKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyLAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMsCi0KLS8qIEFyZ29uYXV0IFJJU0MgQ29yZSAoQVJDKSByZWxvY3MuCi1BUkMgMjIgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLW5vdCBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjAgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjYKLXRocm91Z2ggNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMLAotCi0vKiBBUkMgMjYgYml0IGFic29sdXRlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUgbm90Ci1zdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhlIGhpZ2ggMjQgYml0cyBhcmUgaW5zdGFsbGVkIGluIGJpdHMgMjMKLXRocm91Z2ggMC4gKi8KLSAgQkZEX1JFTE9DX0FSQ19CMjYsCi0KLS8qIE1pdHN1YmlzaGkgRDEwViByZWxvY3MuCi1UaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9SLAotCi0vKiBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgotVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLWFzc3VtZWQgdG8gYmUgMC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIHJlbG9jCi1leGNlcHQgaXQgaXMgaW4gdGhlIGxlZnQgY29udGFpbmVyLCBpLmUuLAotc2hpZnRlZCBsZWZ0IDE1IGJpdHMuICovCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDEwVl8xOCwKLQotLyogVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzCi1hc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMLAotCi0vKiBNaXRzdWJpc2hpIEQzMFYgcmVsb2NzLgotVGhpcyBpcyBhIDYtYml0IGFic29sdXRlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfRDMwVl82LAotCi0vKiBUaGlzIGlzIGEgNi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAqLwotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgNi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi1hcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi1vZiB0aGUgY29udGFpbmVyLiAqLwotICBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IsCi0KLS8qIFRoaXMgaXMgYSAxMi1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCB0aGUgCi1yaWdodCAzIGJpdHNhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzE1LAotCi0vKiBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi10aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxMi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLXRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi1hcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi1vZiB0aGUgY29udGFpbmVyLiAqLwotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCBhYnNvbHV0ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzIxLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMLAotCi0vKiBUaGlzIGlzIGFuIDE4LWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLWFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLW9mIHRoZSBjb250YWluZXIuICovCi0gIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMX1IsCi0KLS8qIFRoaXMgaXMgYSAzMi1iaXQgYWJzb2x1dGUgcmVsb2MuICovCi0gIEJGRF9SRUxPQ19EMzBWXzMyLAotCi0vKiBUaGlzIGlzIGEgMzItYml0IHBjLXJlbGF0aXZlIHJlbG9jLiAqLwotICBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTCwKLQotLyogTWl0c3ViaXNoaSBNMzJSIHJlbG9jcy4KLVRoaXMgaXMgYSAyNCBiaXQgYWJzb2x1dGUgYWRkcmVzcy4gKi8KLSAgQkZEX1JFTE9DX00zMlJfMjQsCi0KLS8qIFRoaXMgaXMgYSAxMC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gKi8KLSAgQkZEX1JFTE9DX00zMlJfMTBfUENSRUwsCi0KLS8qIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMjYtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cyBhc3N1bWVkIHRvIGJlIDAuICovCi0gIEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCi11c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgdW5zaWduZWQuICovCi0gIEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLAotCi0vKiBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCi11c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgc2lnbmVkLiAqLwotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywKLQotLyogVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBsb3dlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MuICovCi0gIEJGRF9SRUxPQ19NMzJSX0xPMTYsCi0KLS8qIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgc21hbGwgZGF0YSBhcmVhIG9mZnNldCBmb3IgdXNlIGluCi1hZGQzLCBsb2FkLCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLiAqLwotICBCRkRfUkVMT0NfTTMyUl9TREExNiwKLQotLyogVGhpcyBpcyBhIDktYml0IHJlbG9jICovCi0gIEJGRF9SRUxPQ19WODUwXzlfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAyMi1iaXQgcmVsb2MgKi8KLSAgQkZEX1JFTE9DX1Y4NTBfMjJfUENSRUwsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSAxNSBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi16ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGFuIDggYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA2IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi10aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfNl84X09GRlNFVCwKLQotLyogVGhpcyBpcyBhbiA4Yml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA3IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKLWRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDcgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDUgYml0IG9mZnNldCAob2Ygd2hpY2ggb25seSA0IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlIHRpbnkKLWRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDQgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAqLwotICBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi1iaXRzIHBsYWNlZCBub24tY29udGlnb3VzbHkgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLCB3aXRoIHRoZQotYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDYgYml0IG9mZnNldCBmcm9tIHRoZSBjYWxsIHRhYmxlIGJhc2UgcG9pbnRlci4gKi8KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICovCi0gIEJGRF9SRUxPQ19WODUwX0NBTExUXzE2XzE2X09GRlNFVCwKLQotCi0vKiBUaGlzIGlzIGEgMzJiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQotaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzMyX1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgMTZiaXQgcGNyZWwgcmVsb2MgZm9yIHRoZSBtbjEwMzAwLCBvZmZzZXQgYnkgdHdvIGJ5dGVzIGluIHRoZQotaW5zdHJ1Y3Rpb24uICovCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzE2X1BDUkVMLAotCi0vKiBUaGlzIGlzIGEgOGJpdCBEUCByZWxvYyBmb3IgdGhlIHRtczMyMGMzMCwgd2hlcmUgdGhlIG1vc3QKLXNpZ25pZmljYW50IDggYml0cyBvZiBhIDI0IGJpdCB3b3JkIGFyZSBwbGFjZWQgaW50byB0aGUgbGVhc3QKLXNpZ25pZmljYW50IDggYml0cyBvZiB0aGUgb3Bjb2RlLiAqLwotICBCRkRfUkVMT0NfVElDMzBfTERQLAotCi0vKiBUaGlzIGlzIGEgNDggYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyAzMiBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF80OCwKLQotLyogVGhpcyBpcyBhIDMyIGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMjAgYml0cyBzcGxpdCB1cCBpbnRvCi10d28gc2VjdGlvbnMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzIwLAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDYgYml0IHdvcmQgb2Zmc2V0IGluCi00IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzZfSU5fNCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYW4gOCBiaXQgYnl0ZSBvZmZzZXQKLWludG8gOCBiaXRzLiAqLwotICBCRkRfUkVMT0NfRlIzMF84X0lOXzgsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgOSBiaXQgc2hvcnQgb2Zmc2V0Ci1pbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfOV9JTl84LAotCi0vKiBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEwIGJpdCB3b3JkIG9mZnNldAotaW50byA4IGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzEwX0lOXzgsCi0KLS8qIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgOSBiaXQgcGMgcmVsYXRpdmUKLXNob3J0IG9mZnNldCBpbnRvIDggYml0cy4gKi8KLSAgQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTCwKLQotLyogVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMiBiaXQgcGMgcmVsYXRpdmUKLXNob3J0IG9mZnNldCBpbnRvIDExIGJpdHMuICovCi0gIEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMLAotCi0vKiBNb3Rvcm9sYSBNY29yZSByZWxvY2F0aW9ucy4gKi8KLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMiwKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTIsCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMiwKLSAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0pTUl9JTU0xMUJZMiwKLSAgQkZEX1JFTE9DX01DT1JFX1JWQSwKLQotLyogVGhlc2UgdHdvIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mIAotdGhlIGVudHJpZXMgaW4gYSBDKysgdmlydHVhbCBmdW5jdGlvbiB0YWJsZSBhcmUgYWN0dWFsbHkgdXNlZC4gIFdoZW4KLXRoZSAtLWdjLXNlY3Rpb25zIG9wdGlvbiBpcyBnaXZlbiwgdGhlIGxpbmtlciB3aWxsIHplcm8gb3V0IHRoZSBlbnRyaWVzCi10aGF0IGFyZSBub3QgdXNlZCwgc28gdGhhdCB0aGUgY29kZSBmb3IgdGhvc2UgZnVuY3Rpb25zIG5lZWQgbm90IGJlCi1pbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgotCi1WVEFCTEVfSU5IRVJJVCBpcyBhIHplcm8tc3BhY2UgcmVsb2NhdGlvbiB1c2VkIHRvIGRlc2NyaWJlIHRvIHRoZQotbGlua2VyIHRoZSBpbmhlcml0ZW5jZSB0cmVlIG9mIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICBUaGUKLXJlbG9jYXRpb24ncyBzeW1ib2wgc2hvdWxkIGJlIHRoZSBwYXJlbnQgY2xhc3MnIHZ0YWJsZSwgYW5kIHRoZQotcmVsb2NhdGlvbiBzaG91bGQgYmUgbG9jYXRlZCBhdCB0aGUgY2hpbGQgdnRhYmxlLgotCi1WVEFCTEVfRU5UUlkgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdGhhdCBkZXNjcmliZXMgdGhlIHVzZSBvZiBhCi12aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGVudHJ5LiAgVGhlIHJlbG9jJ3Mgc3ltYm9sIHNob3VsZCByZWZlciB0byB0aGUKLXRhYmxlIG9mIHRoZSBjbGFzcyBtZW50aW9uZWQgaW4gdGhlIGNvZGUuICBPZmYgb2YgdGhhdCBiYXNlLCBhbiBvZmZzZXQKLWRlc2NyaWJlcyB0aGUgZW50cnkgdGhhdCBpcyBiZWluZyB1c2VkLiAgRm9yIFJlbGEgaG9zdHMsIHRoaXMgb2Zmc2V0IAotaXMgc3RvcmVkIGluIHRoZSByZWxvYydzIGFkZGVuZC4gIEZvciBSZWwgaG9zdHMsIHdlIGFyZSBmb3JjZWQgdG8gcHV0Ci10aGlzIG9mZnNldCBpbiB0aGUgcmVsb2MncyBzZWN0aW9uIG9mZnNldC4gKi8KLSAgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULAotICBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLAotICBCRkRfUkVMT0NfVU5VU0VEIH07Ci10eXBlZGVmIGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGU7Ci1yZWxvY19ob3d0b190eXBlICoKLQotYmZkX3JlbG9jX3R5cGVfbG9va3VwICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLWNvbnN0IGNoYXIgKgotYmZkX2dldF9yZWxvY19jb2RlX25hbWUgIFBBUkFNUyAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLQotdHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Ci17Ci0gICAgICAgIC8qIEEgcG9pbnRlciB0byB0aGUgQkZEIHdoaWNoIG93bnMgdGhlIHN5bWJvbC4gVGhpcyBpbmZvcm1hdGlvbgotICAgICAgICAgIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IGEgYmFjayBlbmQgY2FuIHdvcmsgb3V0IHdoYXQgYWRkaXRpb25hbAotICAgICAgICAgIGluZm9ybWF0aW9uIChpbnZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uIHdyaXRlcikgaXMgY2FycmllZAotICAgICAgICAgIHdpdGggdGhlIHN5bWJvbC4KLQotICAgICAgICAgIFRoaXMgZmllbGQgaXMgKmFsbW9zdCogcmVkdW5kYW50LCBzaW5jZSB5b3UgY2FuIHVzZSBzZWN0aW9uLT5vd25lcgotICAgICAgICAgIGluc3RlYWQsIGV4Y2VwdCB0aGF0IHNvbWUgc3ltYm9scyBwb2ludCB0byB0aGUgZ2xvYmFsIHNlY3Rpb25zCi0gICAgICAgICAgYmZkX3thYnMsY29tLHVuZH1fc2VjdGlvbi4gIFRoaXMgY291bGQgYmUgZml4ZWQgYnkgbWFraW5nCi0gICAgICAgICAgdGhlc2UgZ2xvYmFscyBiZSBwZXItYmZkIChvciBwZXItdGFyZ2V0LWZsYXZvcikuICBGSVhNRS4gKi8KLQotICBzdHJ1Y3QgX2JmZCAqdGhlX2JmZDsgIC8qIFVzZSBiZmRfYXN5bWJvbF9iZmQoc3ltKSB0byBhY2Nlc3MgdGhpcyBmaWVsZC4gKi8KLQotICAgICAgICAvKiBUaGUgdGV4dCBvZiB0aGUgc3ltYm9sLiBUaGUgbmFtZSBpcyBsZWZ0IGFsb25lLCBhbmQgbm90IGNvcGllZDsgdGhlCi0gICAgICAgICAgYXBwbGljYXRpb24gbWF5IG5vdCBhbHRlciBpdC4gKi8KLSAgQ09OU1QgY2hhciAqbmFtZTsKLQotICAgICAgICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoaXMgcmVhbGx5IHNob3VsZCBiZSBhIHVuaW9uIG9mIGEKLSAgICAgICAgICBudW1lcmljIHZhbHVlIHdpdGggYSBwb2ludGVyLCBzaW5jZSBzb21lIGZsYWdzIGluZGljYXRlIHRoYXQKLSAgICAgICAgICBhIHBvaW50ZXIgdG8gYW5vdGhlciBzeW1ib2wgaXMgc3RvcmVkIGhlcmUuICAqLwotICBzeW12YWx1ZSB2YWx1ZTsKLQotICAgICAgICAvKiBBdHRyaWJ1dGVzIG9mIGEgc3ltYm9sOiAqLwotCi0jZGVmaW5lIEJTRl9OT19GTEFHUyAgICAweDAwCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBoYXMgbG9jYWwgc2NvcGU7IDw8c3RhdGljPj4gaW4gPDxDPj4uIFRoZSB2YWx1ZQotICAgICAgICAgIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiBvZiB0aGUgZGF0YS4gKi8KLSNkZWZpbmUgQlNGX0xPQ0FMICAgICAgMHgwMQotCi0gICAgICAgIC8qIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZTsgaW5pdGlhbGl6ZWQgZGF0YSBpbiA8PEM+Pi4gVGhlCi0gICAgICAgICAgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLwotI2RlZmluZSBCU0ZfR0xPQkFMICAgICAweDAyCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlIGFuZCBpcyBleHBvcnRlZC4gVGhlIHZhbHVlIGlzCi0gICAgICAgICAgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqLwotI2RlZmluZSBCU0ZfRVhQT1JUICAgICBCU0ZfR0xPQkFMICAvKiBubyByZWFsIGRpZmZlcmVuY2UgKi8KLQotICAgICAgICAvKiBBIG5vcm1hbCBDIHN5bWJvbCB3b3VsZCBiZSBvbmUgb2Y6Ci0gICAgICAgICAgPDxCU0ZfTE9DQUw+PiwgPDxCU0ZfRk9SVF9DT01NPj4sICA8PEJTRl9VTkRFRklORUQ+PiBvcgotICAgICAgICAgIDw8QlNGX0dMT0JBTD4+ICovCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyByZWNvcmQuIFRoZSB2YWx1ZSBoYXMgYW4gYXJiaXRhcnkKLSAgICAgICAgICBtZWFuaW5nLiAqLwotI2RlZmluZSBCU0ZfREVCVUdHSU5HICAweDA4Ci0KLSAgICAgICAgLyogVGhlIHN5bWJvbCBkZW5vdGVzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQuICBVc2VkIGluIEVMRiwKLSAgICAgICAgICBwZXJoYXBzIG90aGVycyBzb21lZGF5LiAgKi8KLSNkZWZpbmUgQlNGX0ZVTkNUSU9OICAgIDB4MTAKLQotICAgICAgICAvKiBVc2VkIGJ5IHRoZSBsaW5rZXIuICovCi0jZGVmaW5lIEJTRl9LRUVQICAgICAgICAweDIwCi0jZGVmaW5lIEJTRl9LRUVQX0cgICAgICAweDQwCi0KLSAgICAgICAgLyogQSB3ZWFrIGdsb2JhbCBzeW1ib2wsIG92ZXJyaWRhYmxlIHdpdGhvdXQgd2FybmluZ3MgYnkKLSAgICAgICAgICBhIHJlZ3VsYXIgZ2xvYmFsIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgKi8KLSNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4ODAKLQotICAgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCB0byBwb2ludCB0byBhIHNlY3Rpb24sIGUuZy4gRUxGJ3MKLSAgICAgICAgICBTVFRfU0VDVElPTiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4MTAwCi0KLSAgICAgICAgLyogVGhlIHN5bWJvbCB1c2VkIHRvIGJlIGEgY29tbW9uIHN5bWJvbCwgYnV0IG5vdyBpdCBpcwotICAgICAgICAgIGFsbG9jYXRlZC4gKi8KLSNkZWZpbmUgQlNGX09MRF9DT01NT04gIDB4MjAwCi0KLSAgICAgICAgLyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGNvbW1vbiBkYXRhLiAqLwotI2RlZmluZSBCRkRfRk9SVF9DT01NX0RFRkFVTFRfVkFMVUUgMAotCi0gICAgICAgIC8qIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKLSAgICAgICAgICBsb2NhdGlvbiBpbiBhbiBvdXRwdXQgZmlsZSAtIGllIGluIGNvZmYgYSA8PElTRkNOPj4gc3ltYm9sCi0gICAgICAgICAgd2hpY2ggaXMgYWxzbyA8PENfRVhUPj4gc3ltYm9sIGFwcGVhcnMgd2hlcmUgaXQgd2FzCi0gICAgICAgICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAotICAgICAgICAgIGJ5IHRoZSB0YXJnZXQgQkZEIHBhcnQgdG8gY29udmV5IHRoaXMgaW5mb3JtYXRpb24uICovCi0KLSNkZWZpbmUgQlNGX05PVF9BVF9FTkQgICAgMHg0MDAKLQotICAgICAgICAvKiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIHRoZSBsYWJlbCBvZiBjb25zdHJ1Y3RvciBzZWN0aW9uLiAqLwotI2RlZmluZSBCU0ZfQ09OU1RSVUNUT1IgICAweDgwMAotCi0gICAgICAgIC8qIFNpZ25hbCB0aGF0IHRoZSBzeW1ib2wgaXMgYSB3YXJuaW5nIHN5bWJvbC4gIFRoZSBuYW1lIGlzIGEKLSAgICAgICAgICB3YXJuaW5nLiAgVGhlIG5hbWUgb2YgdGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dDsKLSAgICAgICAgICBpZiBhIHJlZmVyZW5jZSBpcyBtYWRlIHRvIGEgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgbmV4dAotICAgICAgICAgIHN5bWJvbCwgYSB3YXJuaW5nIGlzIGlzc3VlZCBieSB0aGUgbGlua2VyLiAqLwotI2RlZmluZSBCU0ZfV0FSTklORyAgICAgICAweDEwMDAKLQotICAgICAgICAvKiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIGluZGlyZWN0LiAgVGhpcyBzeW1ib2wgaXMgYW4gaW5kaXJlY3QKLSAgICAgICAgICBwb2ludGVyIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBuZXh0IHN5bWJvbC4gKi8KLSNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHgyMDAwCi0KLSAgICAgICAgLyogQlNGX0ZJTEUgbWFya3Mgc3ltYm9scyB0aGF0IGNvbnRhaW4gYSBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQKLSAgICAgICAgICBmb3IgRUxGIFNUVF9GSUxFIHN5bWJvbHMuICAqLwotI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDQwMDAKLQotICAgICAgICAvKiBTeW1ib2wgaXMgZnJvbSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBCU0ZfRFlOQU1JQyAgICAgICAweDgwMDAKLQotICAgICAgICAvKiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBkYXRhIG9iamVjdC4gIFVzZWQgaW4gRUxGLCBhbmQgcGVyaGFwcwotICAgICAgICAgIG90aGVycyBzb21lZGF5LiAgKi8KLSNkZWZpbmUgQlNGX09CSkVDVCAgICAgICAgMHgxMDAwMAotCi0gIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICAgIC8qIEEgcG9pbnRlciB0byB0aGUgc2VjdGlvbiB0byB3aGljaCB0aGlzIHN5bWJvbCBpcwotICAgICAgICAgIHJlbGF0aXZlLiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBub24gTlVMTCwgdGhlcmUgYXJlIHNwZWNpYWwKLSAgICAgICAgICBzZWN0aW9ucyBmb3IgdW5kZWZpbmVkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IHNlYyAqc2VjdGlvbjsKLQotICAgICAgICAvKiBCYWNrIGVuZCBzcGVjaWFsIGRhdGEuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIFBUUiBwOwotICAgICAgYmZkX3ZtYSBpOwotICAgIH0gdWRhdGE7Ci0KLX0gYXN5bWJvbDsKLSNkZWZpbmUgYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi1ib29sZWFuIAotYmZkX2lzX2xvY2FsX2xhYmVsIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltKSk7Ci0KLWJvb2xlYW4gCi1iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKm5hbWUpKTsKLQotI2RlZmluZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShhYmZkLCBuYW1lKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUsIChhYmZkLCBuYW1lKSkKLSNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIoYWJmZCwgbG9jYXRpb24pIFwKLSAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfY2Fub25pY2FsaXplX3N5bXRhYixcCi0gICAgICAgICAgICAgICAgICAoYWJmZCwgbG9jYXRpb24pKQotYm9vbGVhbiAKLWJmZF9zZXRfc3ltdGFiICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzeW1ib2wgKipsb2NhdGlvbiwgdW5zaWduZWQgaW50IGNvdW50KSk7Ci0KLXZvaWQgCi1iZmRfcHJpbnRfc3ltYm9sX3ZhbmRmIFBBUkFNUyAoKFBUUiBmaWxlLCBhc3ltYm9sICpzeW1ib2wpKTsKLQotI2RlZmluZSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9tYWtlX2VtcHR5X3N5bWJvbCwgKGFiZmQpKQotI2RlZmluZSBiZmRfbWFrZV9kZWJ1Z19zeW1ib2woYWJmZCxwdHIsc2l6ZSkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCwgKGFiZmQsIHB0ciwgc2l6ZSkpCi1pbnQgCi1iZmRfZGVjb2RlX3N5bWNsYXNzIFBBUkFNUyAoKGFzeW1ib2wgKnN5bWJvbCkpOwotCi12b2lkIAotYmZkX3N5bWJvbF9pbmZvIFBBUkFNUyAoKGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotCi1ib29sZWFuIAotYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBQQVJBTVMgKChiZmQgKmliZmQsIGFzeW1ib2wgKmlzeW0sIGJmZCAqb2JmZCwgYXN5bWJvbCAqb3N5bSkpOwotCi0jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkgXAotICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSkKLXN0cnVjdCBfYmZkIAotewotICAgICAvKiBUaGUgZmlsZW5hbWUgdGhlIGFwcGxpY2F0aW9uIG9wZW5lZCB0aGUgQkZEIHdpdGguICAqLwotICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgICAgICAgICAKLQotICAgICAvKiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBqdW1wIHRhYmxlLiAgICAgICAgICAgICAqLwotICAgIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICp4dmVjOwotCi0gICAgIC8qIFRvIGF2b2lkIGRyYWdnaW5nIHRvbyBtYW55IGhlYWRlciBmaWxlcyBpbnRvIGV2ZXJ5IGZpbGUgdGhhdAotICAgICAgIGluY2x1ZGVzIGA8PGJmZC5oPj4nLCBJT1NUUkVBTSBoYXMgYmVlbiBkZWNsYXJlZCBhcyBhICJjaGFyCi0gICAgICAgKiIsIGFuZCBNVElNRSBhcyBhICJsb25nIi4gIFRoZWlyIGNvcnJlY3QgdHlwZXMsIHRvIHdoaWNoIHRoZXkKLSAgICAgICBhcmUgY2FzdCB3aGVuIHVzZWQsIGFyZSAiRklMRSAqIiBhbmQgInRpbWVfdCIuICAgIFRoZSBpb3N0cmVhbQotICAgICAgIGlzIHRoZSByZXN1bHQgb2YgYW4gZm9wZW4gb24gdGhlIGZpbGVuYW1lLiAgSG93ZXZlciwgaWYgdGhlCi0gICAgICAgQkZEX0lOX01FTU9SWSBmbGFnIGlzIHNldCwgdGhlbiBpb3N0cmVhbSBpcyBhY3R1YWxseSBhIHBvaW50ZXIKLSAgICAgICB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKi8KLSAgICBQVFIgaW9zdHJlYW07Ci0KLSAgICAgLyogSXMgdGhlIGZpbGUgZGVzY3JpcHRvciBiZWluZyBjYWNoZWQ/ICBUaGF0IGlzLCBjYW4gaXQgYmUgY2xvc2VkIGFzCi0gICAgICAgbmVlZGVkLCBhbmQgcmUtb3BlbmVkIHdoZW4gYWNjZXNzZWQgbGF0ZXI/ICAqLwotCi0gICAgYm9vbGVhbiBjYWNoZWFibGU7Ci0KLSAgICAgLyogTWFya3Mgd2hldGhlciB0aGVyZSB3YXMgYSBkZWZhdWx0IHRhcmdldCBzcGVjaWZpZWQgd2hlbiB0aGUKLSAgICAgICBCRkQgd2FzIG9wZW5lZC4gVGhpcyBpcyB1c2VkIHRvIHNlbGVjdCB3aGljaCBtYXRjaGluZyBhbGdvcml0aG0KLSAgICAgICB0byB1c2UgdG8gY2hvb3NlIHRoZSBiYWNrIGVuZC4gKi8KLQotICAgIGJvb2xlYW4gdGFyZ2V0X2RlZmF1bHRlZDsKLQotICAgICAvKiBUaGUgY2FjaGluZyByb3V0aW5lcyB1c2UgdGhlc2UgdG8gbWFpbnRhaW4gYQotICAgICAgIGxlYXN0LXJlY2VudGx5LXVzZWQgbGlzdCBvZiBCRkRzICovCi0KLSAgICBzdHJ1Y3QgX2JmZCAqbHJ1X3ByZXYsICpscnVfbmV4dDsKLQotICAgICAvKiBXaGVuIGEgZmlsZSBpcyBjbG9zZWQgYnkgdGhlIGNhY2hpbmcgcm91dGluZXMsIEJGRCByZXRhaW5zCi0gICAgICAgc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGZpbGUgaGVyZTogKi8KLQotICAgIGZpbGVfcHRyIHdoZXJlOyAgICAgICAgICAgICAgCi0KLSAgICAgLyogYW5kIGhlcmU6IChgYG9uY2UnJyBtZWFucyBhdCBsZWFzdCBvbmNlKSAqLwotCi0gICAgYm9vbGVhbiBvcGVuZWRfb25jZTsKLQotICAgICAvKiBTZXQgaWYgd2UgaGF2ZSBhIGxvY2FsbHkgbWFpbnRhaW5lZCBtdGltZSB2YWx1ZSwgcmF0aGVyIHRoYW4KLSAgICAgICBnZXR0aW5nIGl0IGZyb20gdGhlIGZpbGUgZWFjaCB0aW1lOiAqLwotCi0gICAgYm9vbGVhbiBtdGltZV9zZXQ7Ci0KLSAgICAgLyogRmlsZSBtb2RpZmllZCB0aW1lLCBpZiBtdGltZV9zZXQgaXMgdHJ1ZTogKi8KLQotICAgIGxvbmcgbXRpbWU7ICAgICAgICAgIAotCi0gICAgIC8qIFJlc2VydmVkIGZvciBhbiB1bmltcGxlbWVudGVkIGZpbGUgbG9ja2luZyBleHRlbnNpb24uKi8KLQotICAgIGludCBpZmQ7Ci0KLSAgICAgLyogVGhlIGZvcm1hdCB3aGljaCBiZWxvbmdzIHRvIHRoZSBCRkQuIChvYmplY3QsIGNvcmUsIGV0Yy4pICovCi0KLSAgICBiZmRfZm9ybWF0IGZvcm1hdDsKLQotICAgICAvKiBUaGUgZGlyZWN0aW9uIHRoZSBCRkQgd2FzIG9wZW5lZCB3aXRoKi8KLQotICAgIGVudW0gYmZkX2RpcmVjdGlvbiB7bm9fZGlyZWN0aW9uID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfZGlyZWN0aW9uID0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2RpcmVjdGlvbiA9IDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBib3RoX2RpcmVjdGlvbiA9IDN9IGRpcmVjdGlvbjsKLQotICAgICAvKiBGb3JtYXRfc3BlY2lmaWMgZmxhZ3MqLwotCi0gICAgZmxhZ3dvcmQgZmxhZ3M7ICAgICAgICAgICAgICAKLQotICAgICAvKiBDdXJyZW50bHkgbXlfYXJjaGl2ZSBpcyB0ZXN0ZWQgYmVmb3JlIGFkZGluZyBvcmlnaW4gdG8KLSAgICAgICBhbnl0aGluZy4gSSBiZWxpZXZlIHRoYXQgdGhpcyBjYW4gYmVjb21lIGFsd2F5cyBhbiBhZGQgb2YKLSAgICAgICBvcmlnaW4sIHdpdGggb3JpZ2luIHNldCB0byAwIGZvciBub24gYXJjaGl2ZSBmaWxlcy4gICAqLwotCi0gICAgZmlsZV9wdHIgb3JpZ2luOyAgICAgICAgICAgICAKLQotICAgICAvKiBSZW1lbWJlciB3aGVuIG91dHB1dCBoYXMgYmVndW4sIHRvIHN0b3Agc3RyYW5nZSB0aGluZ3MKLSAgICAgICBmcm9tIGhhcHBlbmluZy4gKi8KLSAgICBib29sZWFuIG91dHB1dF9oYXNfYmVndW47Ci0KLSAgICAgLyogUG9pbnRlciB0byBsaW5rZWQgbGlzdCBvZiBzZWN0aW9ucyovCi0gICAgc3RydWN0IHNlYyAgKnNlY3Rpb25zOwotCi0gICAgIC8qIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgKi8KLSAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9jb3VudDsKLQotICAgICAvKiBTdHVmZiBvbmx5IHVzZWZ1bCBmb3Igb2JqZWN0IGZpbGVzOiAKLSAgICAgICBUaGUgc3RhcnQgYWRkcmVzcy4gKi8KLSAgICBiZmRfdm1hIHN0YXJ0X2FkZHJlc3M7Ci0KLSAgICAgLyogVXNlZCBmb3IgaW5wdXQgYW5kIG91dHB1dCovCi0gICAgdW5zaWduZWQgaW50IHN5bWNvdW50OwotCi0gICAgIC8qIFN5bWJvbCB0YWJsZSBmb3Igb3V0cHV0IEJGRCAod2l0aCBzeW1jb3VudCBlbnRyaWVzKSAqLwotICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICoqb3V0c3ltYm9sczsgICAgICAgICAgICAgCi0KLSAgICAgLyogUG9pbnRlciB0byBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uKi8KLSAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaF9pbmZvOwotCi0gICAgIC8qIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBhcmNoaXZlczoqLwotICAgIFBUUiBhcmVsdF9kYXRhOyAgICAgICAgICAgICAgCi0gICAgc3RydWN0IF9iZmQgKm15X2FyY2hpdmU7ICAgICAgLyogVGhlIGNvbnRhaW5pbmcgYXJjaGl2ZSBCRkQuICAqLwotICAgIHN0cnVjdCBfYmZkICpuZXh0OyAgICAgICAgICAgIC8qIFRoZSBuZXh0IEJGRCBpbiB0aGUgYXJjaGl2ZS4gICovCi0gICAgc3RydWN0IF9iZmQgKmFyY2hpdmVfaGVhZDsgICAgLyogVGhlIGZpcnN0IEJGRCBpbiB0aGUgYXJjaGl2ZS4gICovCi0gICAgYm9vbGVhbiBoYXNfYXJtYXA7ICAgICAgICAgICAKLQotICAgICAvKiBBIGNoYWluIG9mIEJGRCBzdHJ1Y3R1cmVzIGludm9sdmVkIGluIGEgbGluay4gICovCi0gICAgc3RydWN0IF9iZmQgKmxpbmtfbmV4dDsKLQotICAgICAvKiBBIGZpZWxkIHVzZWQgYnkgX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scy4gIFRoaXMgd2lsbAotICAgICAgIGJlIHVzZWQgb25seSBmb3IgYXJjaGl2ZSBlbGVtZW50cy4gICovCi0gICAgaW50IGFyY2hpdmVfcGFzczsKLQotICAgICAvKiBVc2VkIGJ5IHRoZSBiYWNrIGVuZCB0byBob2xkIHByaXZhdGUgZGF0YS4gKi8KLQotICAgIHVuaW9uIAotICAgICAgewotICAgICAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKmFvdXRfZGF0YTsKLSAgICAgIHN0cnVjdCBhcnRkYXRhICphb3V0X2FyX2RhdGE7Ci0gICAgICBzdHJ1Y3QgX29hc3lzX2RhdGEgKm9hc3lzX29ial9kYXRhOwotICAgICAgc3RydWN0IF9vYXN5c19hcl9kYXRhICpvYXN5c19hcl9kYXRhOwotICAgICAgc3RydWN0IGNvZmZfdGRhdGEgKmNvZmZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgcGVfdGRhdGEgKnBlX29ial9kYXRhOwotICAgICAgc3RydWN0IHhjb2ZmX3RkYXRhICp4Y29mZl9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBlY29mZl90ZGF0YSAqZWNvZmZfb2JqX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaWVlZV9kYXRhX3N0cnVjdCAqaWVlZV9kYXRhOwotICAgICAgc3RydWN0IGllZWVfYXJfZGF0YV9zdHJ1Y3QgKmllZWVfYXJfZGF0YTsKLSAgICAgIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0ICpzcmVjX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaWhleF9kYXRhX3N0cnVjdCAqaWhleF9kYXRhOwotICAgICAgc3RydWN0IHRla2hleF9kYXRhX3N0cnVjdCAqdGVraGV4X2RhdGE7Ci0gICAgICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqZWxmX29ial9kYXRhOwotICAgICAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKm5sbV9vYmpfZGF0YTsKLSAgICAgIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpib3V0X2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc3VuX2NvcmVfc3RydWN0ICpzdW5fY29yZV9kYXRhOwotICAgICAgc3RydWN0IHNjbzVfY29yZV9zdHJ1Y3QgKnNjbzVfY29yZV9kYXRhOwotICAgICAgc3RydWN0IHRyYWRfY29yZV9zdHJ1Y3QgKnRyYWRfY29yZV9kYXRhOwotICAgICAgc3RydWN0IHNvbV9kYXRhX3N0cnVjdCAqc29tX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAqaHB1eF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqaHBwYWJzZF9jb3JlX2RhdGE7Ci0gICAgICBzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0ICpzZ2lfY29yZV9kYXRhOwotICAgICAgc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QgKmx5bnhfY29yZV9kYXRhOwotICAgICAgc3RydWN0IG9zZl9jb3JlX3N0cnVjdCAqb3NmX2NvcmVfZGF0YTsKLSAgICAgIHN0cnVjdCBjaXNjb19jb3JlX3N0cnVjdCAqY2lzY29fY29yZV9kYXRhOwotICAgICAgc3RydWN0IHZlcnNhZG9zX2RhdGFfc3RydWN0ICp2ZXJzYWRvc19kYXRhOwotICAgICAgc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCAqbmV0YnNkX2NvcmVfZGF0YTsKLSAgICAgIFBUUiBhbnk7Ci0gICAgICB9IHRkYXRhOwotICAKLSAgICAgLyogVXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gaG9sZCBwcml2YXRlIGRhdGEqLwotICAgIFBUUiB1c3JkYXRhOwotCi0gICAvKiBXaGVyZSBhbGwgdGhlIGFsbG9jYXRlZCBzdHVmZiB1bmRlciB0aGlzIEJGRCBnb2VzLiAgVGhpcyBpcyBhCi0gICAgIHN0cnVjdCBvYmphbGxvYyAqLCBidXQgd2UgdXNlIFBUUiB0byBhdm9pZCByZXF1aXJpbmcgdGhlIGluY2x1c2lvbiBvZgotICAgICBvYmphbGxvYy5oLiAgKi8KLSAgICBQVFIgbWVtb3J5OwotfTsKLQotdHlwZWRlZiBlbnVtIGJmZF9lcnJvcgotewotICBiZmRfZXJyb3Jfbm9fZXJyb3IgPSAwLAotICBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsCi0gIGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCwKLSAgYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCwKLSAgYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uLAotICBiZmRfZXJyb3Jfbm9fbWVtb3J5LAotICBiZmRfZXJyb3Jfbm9fc3ltYm9scywKLSAgYmZkX2Vycm9yX25vX2FybWFwLAotICBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcywKLSAgYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlLAotICBiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCwKLSAgYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCwKLSAgYmZkX2Vycm9yX25vX2NvbnRlbnRzLAotICBiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uLAotICBiZmRfZXJyb3Jfbm9fZGVidWdfc2VjdGlvbiwKLSAgYmZkX2Vycm9yX2JhZF92YWx1ZSwKLSAgYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkLAotICBiZmRfZXJyb3JfZmlsZV90b29fYmlnLAotICBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlCi19IGJmZF9lcnJvcl90eXBlOwotCi1iZmRfZXJyb3JfdHlwZSAKLWJmZF9nZXRfZXJyb3IgIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCAKLWJmZF9zZXRfZXJyb3IgIFBBUkFNUyAoKGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZykpOwotCi1DT05TVCBjaGFyICoKLWJmZF9lcnJtc2cgIFBBUkFNUyAoKGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZykpOwotCi12b2lkIAotYmZkX3BlcnJvciAgUEFSQU1TICgoQ09OU1QgY2hhciAqbWVzc2FnZSkpOwotCi10eXBlZGVmIHZvaWQgKCpiZmRfZXJyb3JfaGFuZGxlcl90eXBlKSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotCi1iZmRfZXJyb3JfaGFuZGxlcl90eXBlIAotYmZkX3NldF9lcnJvcl9oYW5kbGVyICBQQVJBTVMgKChiZmRfZXJyb3JfaGFuZGxlcl90eXBlKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgCi1iZmRfZ2V0X2Vycm9yX2hhbmRsZXIgIFBBUkFNUyAoKHZvaWQpKTsKLQotbG9uZyAKLWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdCkpOwotCi1sb25nIAotYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYwotIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBhc2VjdGlvbiAqc2VjLAotICAgIGFyZWxlbnQgKipsb2MsCi0gICAgYXN5bWJvbCAqKnN5bXMpKTsKLQotdm9pZCAKLWJmZF9zZXRfcmVsb2MKLSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGFyZWxlbnQgKipyZWwsIHVuc2lnbmVkIGludCBjb3VudCkKLSAgICAKLSAgICApOwotCi1ib29sZWFuIAotYmZkX3NldF9maWxlX2ZsYWdzIFBBUkFNUyAoKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfc3RhcnRfYWRkcmVzcyBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF92bWEgdm1hKSk7Ci0KLWxvbmcgCi1iZmRfZ2V0X210aW1lIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1sb25nIAotYmZkX2dldF9zaXplIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1pbnQgCi1iZmRfZ2V0X2dwX3NpemUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQgCi1iZmRfc2V0X2dwX3NpemUgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgaSkpOwotCi1iZmRfdm1hIAotYmZkX3NjYW5fdm1hIFBBUkFNUyAoKENPTlNUIGNoYXIgKnN0cmluZywgQ09OU1QgY2hhciAqKmVuZCwgaW50IGJhc2UpKTsKLQotYm9vbGVhbiAKLWJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLQotI2RlZmluZSBiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLSAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhLCBcCi0gICAgICAgICAgICAgICAoaWJmZCwgb2JmZCkpCi1ib29sZWFuIAotYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLQotI2RlZmluZSBiZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCi0gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIFwKLSAgICAgICAgICAgICAgIChpYmZkLCBvYmZkKSkKLWJvb2xlYW4gCi1iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi0jZGVmaW5lIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyhhYmZkLCBmbGFncykgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zZXRfcHJpdmF0ZV9mbGFncywgXAotICAgICAgICAgICAgICAgKGFiZmQsIGZsYWdzKSkKLSNkZWZpbmUgYmZkX3NpemVvZl9oZWFkZXJzKGFiZmQsIHJlbG9jKSBcCi0gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3NpemVvZl9oZWFkZXJzLCAoYWJmZCwgcmVsb2MpKQotCi0jZGVmaW5lIGJmZF9maW5kX25lYXJlc3RfbGluZShhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkgXAotICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5kX25lYXJlc3RfbGluZSwgIChhYmZkLCBzZWMsIHN5bXMsIG9mZiwgZmlsZSwgZnVuYywgbGluZSkpCi0KLSAgICAgICAgLyogRG8gdGhlc2UgdGhyZWUgZG8gYW55dGhpbmcgdXNlZnVsIGF0IGFsbCwgZm9yIGFueSBiYWNrIGVuZD8gICovCi0jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX3N0YXJ0KGFiZmQpIFwKLSAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19zdGFydCwgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX2VuZChhYmZkKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fZW5kLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZShhYmZkLCBzZWN0aW9uKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2RlYnVnX2luZm9fYWNjdW11bGF0ZSwgKGFiZmQsIHNlY3Rpb24pKQotCi0KLSNkZWZpbmUgYmZkX3N0YXRfYXJjaF9lbHQoYWJmZCwgc3RhdCkgXAotICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zdGF0X2FyY2hfZWx0LChhYmZkLCBzdGF0KSkKLQotI2RlZmluZSBiZmRfdXBkYXRlX2FybWFwX3RpbWVzdGFtcChhYmZkKSBcCi0gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoKVwKLSAgICAgICAgQkZEX1NFTkQgKCBhYmZkLCBfYmZkX3NldF9hcmNoX21hY2gsIChhYmZkLCBhcmNoLCBtYWNoKSkKLQotI2RlZmluZSBiZmRfcmVsYXhfc2VjdGlvbihhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVsYXhfc2VjdGlvbiwgKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pKQotCi0jZGVmaW5lIGJmZF9nY19zZWN0aW9ucyhhYmZkLCBsaW5rX2luZm8pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nY19zZWN0aW9ucywgKGFiZmQsIGxpbmtfaW5mbykpCi0KLSNkZWZpbmUgYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKSBcCi0gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19hZGRfc3ltYm9scywgKGFiZmQsIGluZm8pKQotCi0jZGVmaW5lIGJmZF9maW5hbF9saW5rKGFiZmQsIGluZm8pIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5hbF9saW5rLCAoYWJmZCwgaW5mbykpCi0KLSNkZWZpbmUgYmZkX2ZyZWVfY2FjaGVkX2luZm8oYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8sIChhYmZkKSkKLQotI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKGFiZmQpIFwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQsIChhYmZkKSkKLQotI2RlZmluZSBiZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YShhYmZkLCBmaWxlKVwKLSAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLCAoYWJmZCwgZmlsZSkpCi0KLSNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYihhYmZkLCBhc3ltYm9scykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiwgKGFiZmQsIGFzeW1ib2xzKSkKLQotI2RlZmluZSBiZmRfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoYWJmZCkgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0KLSNkZWZpbmUgYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKGFiZmQsIGFyZWxzLCBhc3ltcykgXAotICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jLCAoYWJmZCwgYXJlbHMsIGFzeW1zKSkKLQotZXh0ZXJuIGJmZF9ieXRlICpiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0gICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBiZmRfYnl0ZSAqLAotICAgICAgICAgICAgICAgICBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLXN5bWluZGV4IAotYmZkX2dldF9uZXh0X21hcGVudCBQQVJBTVMgKChiZmQgKmFiZmQsIHN5bWluZGV4IHByZXZpb3VzLCBjYXJzeW0gKipzeW0pKTsKLQotYm9vbGVhbiAKLWJmZF9zZXRfYXJjaGl2ZV9oZWFkIFBBUkFNUyAoKGJmZCAqb3V0cHV0LCBiZmQgKm5ld19oZWFkKSk7Ci0KLWJmZCAqCi1iZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwgYmZkICpwcmV2aW91cykpOwotCi1DT05TVCBjaGFyICoKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1pbnQgCi1iZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuIAotY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0gUEFSQU1TICgoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCkpOwotCi0jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAgICAgICAgICAgICAgKCgqKChiZmQpLT54dmVjLT5tZXNzYWdlKSkgYXJnbGlzdCkKLQotI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0jdW5kZWYgQkZEX1NFTkQKLSNkZWZpbmUgQkZEX1NFTkQoYmZkLCBtZXNzYWdlLCBhcmdsaXN0KSBcCi0gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpIDogXAotICAgIChiZmRfYXNzZXJ0IChfX0ZJTEVfXyxfX0xJTkVfXyksIE5VTEwpKQotI2VuZGlmCi0jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLSAgICAgICAgICAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KQotCi0jaWZkZWYgREVCVUdfQkZEX1NFTkQKLSN1bmRlZiBCRkRfU0VORF9GTVQKLSNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotICAoKChiZmQpICYmIChiZmQpLT54dmVjICYmIChiZmQpLT54dmVjLT5tZXNzYWdlKSA/IFwKLSAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KSA6IFwKLSAgIChiZmRfYXNzZXJ0IChfX0ZJTEVfXyxfX0xJTkVfXyksIE5VTEwpKQotI2VuZGlmCi1lbnVtIGJmZF9mbGF2b3VyIHsKLSAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X2llZWVfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9ubG1fZmxhdm91ciwKLSAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyLAotICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfc29tX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAotICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91ciwKLSAgYmZkX3RhcmdldF9vdmF4X2ZsYXZvdXIsCi0gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCi19OwotCi1lbnVtIGJmZF9lbmRpYW4geyBCRkRfRU5ESUFOX0JJRywgQkZEX0VORElBTl9MSVRUTEUsIEJGRF9FTkRJQU5fVU5LTk9XTiB9OwotCi0gLyogRm9yd2FyZCBkZWNsYXJhdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBiZmRfbGlua19pbmZvIF9iZmRfbGlua19pbmZvOwotCi10eXBlZGVmIHN0cnVjdCBiZmRfdGFyZ2V0Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGVudW0gYmZkX2ZsYXZvdXIgZmxhdm91cjsKLSAgZW51bSBiZmRfZW5kaWFuIGJ5dGVvcmRlcjsKLSAgZW51bSBiZmRfZW5kaWFuIGhlYWRlcl9ieXRlb3JkZXI7Ci0gIGZsYWd3b3JkIG9iamVjdF9mbGFnczsgICAgICAgCi0gIGZsYWd3b3JkIHNlY3Rpb25fZmxhZ3M7Ci0gIGNoYXIgc3ltYm9sX2xlYWRpbmdfY2hhcjsKLSAgY2hhciBhcl9wYWRfY2hhcjsgICAgICAgICAgICAKLSAgdW5zaWduZWQgc2hvcnQgYXJfbWF4X25hbWVsZW47Ci0gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfNjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX3B1dHg2NCkgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MzIpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8xNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDE2KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHg2NCkgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHg2NCkgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MzIpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4MzIpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLSAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDE2KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLSAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDE2KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0gIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICooKl9iZmRfY2hlY2tfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICAgICAgICAgICAgKCpfYmZkX3NldF9mb3JtYXRbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfd3JpdGVfY29udGVudHNbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotICAgLyogR2VuZXJpYyBlbnRyeSBwb2ludHMuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9HRU5FUklDKE5BTUUpXAotQ0FUKE5BTUUsX2Nsb3NlX2FuZF9jbGVhbnVwKSxcCi1DQVQoTkFNRSxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pLFwKLUNBVChOQU1FLF9uZXdfc2VjdGlvbl9ob29rKSxcCi1DQVQoTkFNRSxfZ2V0X3NlY3Rpb25fY29udGVudHMpLFwKLUNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0KLSAgIC8qIENhbGxlZCB3aGVuIHRoZSBCRkQgaXMgYmVpbmcgY2xvc2VkIHRvIGRvIGFueSBuZWNlc3NhcnkgY2xlYW51cC4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfY2xvc2VfYW5kX2NsZWFudXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0gICAvKiBBc2sgdGhlIEJGRCB0byBmcmVlIGFsbCBjYWNoZWQgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotICAgLyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9uZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotICAgLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBiZmRfd2luZG93ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgIC8qIEVudHJ5IHBvaW50cyB0byBjb3B5IHByaXZhdGUgZGF0YS4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0NPUFkoTkFNRSlcCi1DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSksXAotQ0FUKE5BTUUsX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpLFwKLUNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSxcCi1DQVQoTkFNRSxfYmZkX3NldF9wcml2YXRlX2ZsYWdzKSxcCi1DQVQoTkFNRSxfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpXAotICAgLyogQ2FsbGVkIHRvIGNvcHkgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICAgIHRvIGFub3RoZXIuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgLyogQ2FsbGVkIHRvIG1lcmdlIEJGRCBnZW5lcmFsIHByaXZhdGUgZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgICB0byBhIGNvbW1vbiBvdXRwdXQgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLSAgIC8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHNlY3Rpb24gZGF0YSBmcm9tIG9uZSBvYmplY3QgZmlsZQotICAgICB0byBhbm90aGVyLiAgKi8KLSAgYm9vbGVhbiAgICAgICAoKl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSkgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkICosIHNlY19wdHIpKTsKLSAgIC8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHN5bWJvbCBkYXRhIGZyb20gb25lIHN5bWJvbCAKLSAgICAgdG8gYW5vdGhlci4gICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgYXN5bWJvbCAqKSk7Ci0gICAvKiBDYWxsZWQgdG8gc2V0IHByaXZhdGUgYmFja2VuZCBmbGFncyAqLwotICBib29sZWFuICAgICAgICgqX2JmZF9zZXRfcHJpdmF0ZV9mbGFncykgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSk7Ci0KLSAgIC8qIENhbGxlZCB0byBwcmludCBwcml2YXRlIEJGRCBkYXRhICovCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotICAgLyogQ29yZSBmaWxlIGVudHJ5IHBvaW50cy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0NPUkUoTkFNRSlcCi1DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCksXAotQ0FUKE5BTUUsX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCksXAotQ0FUKE5BTUUsX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLSAgY2hhciAqICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkgUEFSQU1TICgoYmZkICopKTsKLSAgaW50ICAgICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKSBQQVJBTVMgKChiZmQgKikpOwotICBib29sZWFuICAoKl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3ApIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi0gICAvKiBBcmNoaXZlIGVudHJ5IHBvaW50cy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUoTkFNRSlcCi1DQVQoTkFNRSxfc2x1cnBfYXJtYXApLFwKLUNBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi1DQVQoTkFNRSxfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUpLFwKLUNBVChOQU1FLF90cnVuY2F0ZV9hcm5hbWUpLFwKLUNBVChOQU1FLF93cml0ZV9hcm1hcCksXAotQ0FUKE5BTUUsX3JlYWRfYXJfaGRyKSxcCi1DQVQoTkFNRSxfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlKSxcCi1DQVQoTkFNRSxfZ2V0X2VsdF9hdF9pbmRleCksXAotQ0FUKE5BTUUsX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCksXAotQ0FUKE5BTUUsX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApCi0gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9hcm1hcCkgUEFSQU1TICgoYmZkICopKTsKLSAgYm9vbGVhbiAgKCpfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIGJvb2xlYW4gICgqX2JmZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSkKLSAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0gIHZvaWQgICAgICgqX2JmZF90cnVuY2F0ZV9hcm5hbWUpIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGNoYXIgKikpOwotICBib29sZWFuICAoKndyaXRlX2FybWFwKSBQQVJBTVMgKChiZmQgKmFyY2gsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3JsICptYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZHgpKTsKLSAgUFRSICgqX2JmZF9yZWFkX2FyX2hkcl9mbikgUEFSQU1TICgoYmZkICopKTsKLSAgYmZkICogICAgKCpvcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpIFBBUkFNUyAoKGJmZCAqYXJjaCwgYmZkICpwcmV2KSk7Ci0jZGVmaW5lIGJmZF9nZXRfZWx0X2F0X2luZGV4KGIsaSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfZWx0X2F0X2luZGV4LCAoYixpKSkKLSAgYmZkICogICAgKCpfYmZkX2dldF9lbHRfYXRfaW5kZXgpIFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotICBpbnQgICAgICAoKl9iZmRfc3RhdF9hcmNoX2VsdCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzdGF0ICopKTsKLSAgYm9vbGVhbiAgKCpfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgIC8qIEVudHJ5IHBvaW50cyB1c2VkIGZvciBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyhOQU1FKVwKLUNBVChOQU1FLF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi1DQVQoTkFNRSxfZ2V0X3N5bXRhYiksXAotQ0FUKE5BTUUsX21ha2VfZW1wdHlfc3ltYm9sKSxcCi1DQVQoTkFNRSxfcHJpbnRfc3ltYm9sKSxcCi1DQVQoTkFNRSxfZ2V0X3N5bWJvbF9pbmZvKSxcCi1DQVQoTkFNRSxfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpLFwKLUNBVChOQU1FLF9nZXRfbGluZW5vKSxcCi1DQVQoTkFNRSxfZmluZF9uZWFyZXN0X2xpbmUpLFwKLUNBVChOQU1FLF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wpLFwKLUNBVChOQU1FLF9yZWFkX21pbmlzeW1ib2xzKSxcCi1DQVQoTkFNRSxfbWluaXN5bWJvbF90b19zeW1ib2wpCi0gIGxvbmcgICgqX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3N5bXRhYikgUEFSQU1TICgoYmZkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0gIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgICoKLSAgICAgICAgICAgICAgICAoKl9iZmRfbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIHZvaWQgICAgICAgICAgKCpfYmZkX3ByaW50X3N5bWJvbCkgUEFSQU1TICgoYmZkICosIFBUUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLSNkZWZpbmUgYmZkX3ByaW50X3N5bWJvbChiLHAscyxlKSBCRkRfU0VORChiLCBfYmZkX3ByaW50X3N5bWJvbCwgKGIscCxzLGUpKQotICB2b2lkICAgICAgICAgICgqX2JmZF9nZXRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKGJmZCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbF9pbmZvICopKTsKLSNkZWZpbmUgYmZkX2dldF9zeW1ib2xfaW5mbyhiLHAsZSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfc3ltYm9sX2luZm8sIChiLHAsZSkpCi0gIGJvb2xlYW4gICAgICAgKCpfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotICBhbGVudCAqICAgICgqX2dldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopKTsKLSAgYm9vbGVhbiAgICAoKl9iZmRfZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNlYyAqc2VjdGlvbiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKnN5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZSwgQ09OU1QgY2hhciAqKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbGluZSkpOwotICAvKiBCYWNrLWRvb3IgdG8gYWxsb3cgZm9ybWF0LWF3YXJlIGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgZGVidWcgc3ltYm9scwotICAgIHdoaWxlIHVzaW5nIEJGRCBmb3IgZXZlcnl0aGluZyBlbHNlLiAgQ3VycmVudGx5IHVzZWQgYnkgdGhlIGFzc2VtYmxlcgotICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICovCi0gIGFzeW1ib2wgKiAgKCpfYmZkX21ha2VfZGVidWdfc3ltYm9sKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgdm9pZCAqcHRyLAotICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkpOwotI2RlZmluZSBiZmRfcmVhZF9taW5pc3ltYm9scyhiLCBkLCBtLCBzKSBcCi0gIEJGRF9TRU5EIChiLCBfcmVhZF9taW5pc3ltYm9scywgKGIsIGQsIG0sIHMpKQotICBsb25nICAoKl9yZWFkX21pbmlzeW1ib2xzKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqKSk7Ci0jZGVmaW5lIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbChiLCBkLCBtLCBmKSBcCi0gIEJGRF9TRU5EIChiLCBfbWluaXN5bWJvbF90b19zeW1ib2wsIChiLCBkLCBtLCBmKSkKLSAgYXN5bWJvbCAqKCpfbWluaXN5bWJvbF90b19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICopKTsKLQotICAgLyogUm91dGluZXMgZm9yIHJlbG9jcy4gICovCi0jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyhOQU1FKVwKLUNBVChOQU1FLF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9jYW5vbmljYWxpemVfcmVsb2MpLFwKLUNBVChOQU1FLF9iZmRfcmVsb2NfdHlwZV9sb29rdXApCi0gIGxvbmcgICgqX2dldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGFyZWxlbnQgKiosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLSAgIC8qIFNlZSBkb2N1bWVudGF0aW9uIG9uIHJlbG9jIHR5cGVzLiAgKi8KLSAgcmVsb2NfaG93dG9fdHlwZSAqCi0gICAgICAgKCpyZWxvY190eXBlX2xvb2t1cCkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLSAgIC8qIFJvdXRpbmVzIHVzZWQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfV1JJVEUoTkFNRSlcCi1DQVQoTkFNRSxfc2V0X2FyY2hfbWFjaCksXAotQ0FUKE5BTUUsX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotICBib29sZWFuICAgICgqX2JmZF9zZXRfYXJjaF9tYWNoKSBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0gICAvKiBSb3V0aW5lcyB1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9MSU5LKE5BTUUpXAotQ0FUKE5BTUUsX3NpemVvZl9oZWFkZXJzKSxcCi1DQVQoTkFNRSxfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyksXAotQ0FUKE5BTUUsX2JmZF9yZWxheF9zZWN0aW9uKSxcCi1DQVQoTkFNRSxfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUpLFwKLUNBVChOQU1FLF9iZmRfbGlua19hZGRfc3ltYm9scyksXAotQ0FUKE5BTUUsX2JmZF9maW5hbF9saW5rKSxcCi1DQVQoTkFNRSxfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiksXAotQ0FUKE5BTUUsX2JmZF9nY19zZWN0aW9ucykKLSAgaW50ICAgICAgICAoKl9iZmRfc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0gIGJmZF9ieXRlICogKCpfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotICAgICAgICAgICAgICAgICAgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLQotICBib29sZWFuICAgICgqX2JmZF9yZWxheF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqLAotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICphZ2FpbikpOwotCi0gICAvKiBDcmVhdGUgYSBoYXNoIHRhYmxlIGZvciB0aGUgbGlua2VyLiAgRGlmZmVyZW50IGJhY2tlbmRzIHN0b3JlCi0gICAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKigqX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSBQQVJBTVMgKChiZmQgKikpOwotCi0gICAvKiBBZGQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGJvb2xlYW4gKCpfYmZkX2xpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSAgIC8qIERvIGEgbGluayBiYXNlZCBvbiB0aGUgbGlua19vcmRlciBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIGVhY2gKLSAgICAgc2VjdGlvbiBvZiB0aGUgQkZELiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAgLyogU2hvdWxkIHRoaXMgc2VjdGlvbiBiZSBzcGxpdCB1cCBpbnRvIHNtYWxsZXIgcGllY2VzIGR1cmluZyBsaW5raW5nLiAgKi8KLSAgYm9vbGVhbiAoKl9iZmRfbGlua19zcGxpdF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSk7Ci0KLSAgIC8qIFJlbW92ZSBzZWN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIHRoZSBvdXRwdXQuICAqLwotICBib29sZWFuICgqX2JmZF9nY19zZWN0aW9ucykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotICAgLyogUm91dGluZXMgdG8gaGFuZGxlIGR5bmFtaWMgc3ltYm9scyBhbmQgcmVsb2NzLiAgKi8KLSNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyhOQU1FKVwKLUNBVChOQU1FLF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQpLFwKLUNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpLFwKLUNBVChOQU1FLF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCksXAotQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotICAgLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgc3ltYm9scy4gKi8KLSAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgc3ltYm9scy4gICovCi0gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiopKTsKLSAgIC8qIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0gIGxvbmcgICgqX2JmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICopKTsKLSAgIC8qIFJlYWQgaW4gdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotICAgIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0KLSBQVFIgYmFja2VuZF9kYXRhOwotfSBiZmRfdGFyZ2V0OwotYm9vbGVhbiAKLWJmZF9zZXRfZGVmYXVsdF90YXJnZXQgIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLQotY29uc3QgYmZkX3RhcmdldCAqCi1iZmRfZmluZF90YXJnZXQgUEFSQU1TICgoQ09OU1QgY2hhciAqdGFyZ2V0X25hbWUsIGJmZCAqYWJmZCkpOwotCi1jb25zdCBjaGFyICoqCi1iZmRfdGFyZ2V0X2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi1ib29sZWFuIAotYmZkX2NoZWNrX2Zvcm1hdCBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLWJvb2xlYW4gCi1iZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCwgY2hhciAqKiptYXRjaGluZykpOwotCi1ib29sZWFuIAotYmZkX3NldF9mb3JtYXQgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfZm9ybWF0IGZvcm1hdCkpOwotCi1DT05TVCBjaGFyICoKLWJmZF9mb3JtYXRfc3RyaW5nIFBBUkFNUyAoKGJmZF9mb3JtYXQgZm9ybWF0KSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9iZmQuYyBiL2JmZC9iZmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3ZThmMC4uMDAwMDAwMAotLS0gYS9iZmQvYmZkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU5ICswLDAgQEAKLS8qIEdlbmVyaWMgQkZEIGxpYnJhcnkgaW50ZXJmYWNlIGFuZCBzdXBwb3J0IHJvdXRpbmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JPDx0eXBlZGVmIGJmZD4+Ci0KLQlBIEJGRCBoYXMgdHlwZSA8PGJmZD4+OyBvYmplY3RzIG9mIHRoaXMgdHlwZSBhcmUgdGhlCi0JY29ybmVyc3RvbmUgb2YgYW55IGFwcGxpY2F0aW9uIHVzaW5nIEJGRC4gVXNpbmcgQkZECi0JY29uc2lzdHMgb2YgbWFraW5nIHJlZmVyZW5jZXMgdGhvdWdoIHRoZSBCRkQgYW5kIHRvIGRhdGEgaW4gdGhlIEJGRC4KLQotCUhlcmUgaXMgdGhlIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIHR5cGUgPDxiZmQ+Pi4gIEl0Ci0JY29udGFpbnMgdGhlIG1ham9yIGRhdGEgYWJvdXQgdGhlIGZpbGUgYW5kIHBvaW50ZXJzCi0JdG8gdGhlIHJlc3Qgb2YgdGhlIGRhdGEuCi0KLUNPREVfRlJBR01FTlQKLS4KLS5zdHJ1Y3QgX2JmZCAKLS57Ci0uICAgIHsqIFRoZSBmaWxlbmFtZSB0aGUgYXBwbGljYXRpb24gb3BlbmVkIHRoZSBCRkQgd2l0aC4gICp9Ci0uICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgICAgICAgICAKLS4KLS4gICAgeyogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQganVtcCB0YWJsZS4gICAgICAgICAgICAgKn0KLS4gICAgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnh2ZWM7Ci0uCi0uICAgIHsqIFRvIGF2b2lkIGRyYWdnaW5nIHRvbyBtYW55IGhlYWRlciBmaWxlcyBpbnRvIGV2ZXJ5IGZpbGUgdGhhdAotLiAgICAgICBpbmNsdWRlcyBgPDxiZmQuaD4+JywgSU9TVFJFQU0gaGFzIGJlZW4gZGVjbGFyZWQgYXMgYSAiY2hhcgotLiAgICAgICAqIiwgYW5kIE1USU1FIGFzIGEgImxvbmciLiAgVGhlaXIgY29ycmVjdCB0eXBlcywgdG8gd2hpY2ggdGhleQotLiAgICAgICBhcmUgY2FzdCB3aGVuIHVzZWQsIGFyZSAiRklMRSAqIiBhbmQgInRpbWVfdCIuICAgIFRoZSBpb3N0cmVhbQotLiAgICAgICBpcyB0aGUgcmVzdWx0IG9mIGFuIGZvcGVuIG9uIHRoZSBmaWxlbmFtZS4gIEhvd2V2ZXIsIGlmIHRoZQotLiAgICAgICBCRkRfSU5fTUVNT1JZIGZsYWcgaXMgc2V0LCB0aGVuIGlvc3RyZWFtIGlzIGFjdHVhbGx5IGEgcG9pbnRlcgotLiAgICAgICB0byBhIGJmZF9pbl9tZW1vcnkgc3RydWN0LiAgKn0KLS4gICAgUFRSIGlvc3RyZWFtOwotLgotLiAgICB7KiBJcyB0aGUgZmlsZSBkZXNjcmlwdG9yIGJlaW5nIGNhY2hlZD8gIFRoYXQgaXMsIGNhbiBpdCBiZSBjbG9zZWQgYXMKLS4gICAgICAgbmVlZGVkLCBhbmQgcmUtb3BlbmVkIHdoZW4gYWNjZXNzZWQgbGF0ZXI/ICAqfQotLgotLiAgICBib29sZWFuIGNhY2hlYWJsZTsKLS4KLS4gICAgeyogTWFya3Mgd2hldGhlciB0aGVyZSB3YXMgYSBkZWZhdWx0IHRhcmdldCBzcGVjaWZpZWQgd2hlbiB0aGUKLS4gICAgICAgQkZEIHdhcyBvcGVuZWQuIFRoaXMgaXMgdXNlZCB0byBzZWxlY3Qgd2hpY2ggbWF0Y2hpbmcgYWxnb3JpdGhtCi0uICAgICAgIHRvIHVzZSB0byBjaG9vc2UgdGhlIGJhY2sgZW5kLiAqfQotLgotLiAgICBib29sZWFuIHRhcmdldF9kZWZhdWx0ZWQ7Ci0uCi0uICAgIHsqIFRoZSBjYWNoaW5nIHJvdXRpbmVzIHVzZSB0aGVzZSB0byBtYWludGFpbiBhCi0uICAgICAgIGxlYXN0LXJlY2VudGx5LXVzZWQgbGlzdCBvZiBCRkRzICp9Ci0uCi0uICAgIHN0cnVjdCBfYmZkICpscnVfcHJldiwgKmxydV9uZXh0OwotLgotLiAgICB7KiBXaGVuIGEgZmlsZSBpcyBjbG9zZWQgYnkgdGhlIGNhY2hpbmcgcm91dGluZXMsIEJGRCByZXRhaW5zCi0uICAgICAgIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaWxlIGhlcmU6ICp9Ci0uCi0uICAgIGZpbGVfcHRyIHdoZXJlOyAgICAgICAgICAgICAgCi0uCi0uICAgIHsqIGFuZCBoZXJlOiAoYGBvbmNlJycgbWVhbnMgYXQgbGVhc3Qgb25jZSkgKn0KLS4KLS4gICAgYm9vbGVhbiBvcGVuZWRfb25jZTsKLS4KLS4gICAgeyogU2V0IGlmIHdlIGhhdmUgYSBsb2NhbGx5IG1haW50YWluZWQgbXRpbWUgdmFsdWUsIHJhdGhlciB0aGFuCi0uICAgICAgIGdldHRpbmcgaXQgZnJvbSB0aGUgZmlsZSBlYWNoIHRpbWU6ICp9Ci0uCi0uICAgIGJvb2xlYW4gbXRpbWVfc2V0OwotLgotLiAgICB7KiBGaWxlIG1vZGlmaWVkIHRpbWUsIGlmIG10aW1lX3NldCBpcyB0cnVlOiAqfQotLgotLiAgICBsb25nIG10aW1lOyAgICAgICAgICAKLS4KLS4gICAgeyogUmVzZXJ2ZWQgZm9yIGFuIHVuaW1wbGVtZW50ZWQgZmlsZSBsb2NraW5nIGV4dGVuc2lvbi4qfQotLgotLiAgICBpbnQgaWZkOwotLgotLiAgICB7KiBUaGUgZm9ybWF0IHdoaWNoIGJlbG9uZ3MgdG8gdGhlIEJGRC4gKG9iamVjdCwgY29yZSwgZXRjLikgKn0KLS4KLS4gICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci0uCi0uICAgIHsqIFRoZSBkaXJlY3Rpb24gdGhlIEJGRCB3YXMgb3BlbmVkIHdpdGgqfQotLgotLiAgICBlbnVtIGJmZF9kaXJlY3Rpb24ge25vX2RpcmVjdGlvbiA9IDAsCi0uICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9kaXJlY3Rpb24gPSAxLAotLiAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2RpcmVjdGlvbiA9IDIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgYm90aF9kaXJlY3Rpb24gPSAzfSBkaXJlY3Rpb247Ci0uCi0uICAgIHsqIEZvcm1hdF9zcGVjaWZpYyBmbGFncyp9Ci0uCi0uICAgIGZsYWd3b3JkIGZsYWdzOyAgICAgICAgICAgICAgCi0uCi0uICAgIHsqIEN1cnJlbnRseSBteV9hcmNoaXZlIGlzIHRlc3RlZCBiZWZvcmUgYWRkaW5nIG9yaWdpbiB0bwotLiAgICAgICBhbnl0aGluZy4gSSBiZWxpZXZlIHRoYXQgdGhpcyBjYW4gYmVjb21lIGFsd2F5cyBhbiBhZGQgb2YKLS4gICAgICAgb3JpZ2luLCB3aXRoIG9yaWdpbiBzZXQgdG8gMCBmb3Igbm9uIGFyY2hpdmUgZmlsZXMuICAgKn0KLS4KLS4gICAgZmlsZV9wdHIgb3JpZ2luOyAgICAgICAgICAgICAKLS4KLS4gICAgeyogUmVtZW1iZXIgd2hlbiBvdXRwdXQgaGFzIGJlZ3VuLCB0byBzdG9wIHN0cmFuZ2UgdGhpbmdzCi0uICAgICAgIGZyb20gaGFwcGVuaW5nLiAqfQotLiAgICBib29sZWFuIG91dHB1dF9oYXNfYmVndW47Ci0uCi0uICAgIHsqIFBvaW50ZXIgdG8gbGlua2VkIGxpc3Qgb2Ygc2VjdGlvbnMqfQotLiAgICBzdHJ1Y3Qgc2VjICAqc2VjdGlvbnM7Ci0uCi0uICAgIHsqIFRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgKn0KLS4gICAgdW5zaWduZWQgaW50IHNlY3Rpb25fY291bnQ7Ci0uCi0uICAgIHsqIFN0dWZmIG9ubHkgdXNlZnVsIGZvciBvYmplY3QgZmlsZXM6IAotLiAgICAgICBUaGUgc3RhcnQgYWRkcmVzcy4gKn0KLS4gICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotLgotLiAgICB7KiBVc2VkIGZvciBpbnB1dCBhbmQgb3V0cHV0Kn0KLS4gICAgdW5zaWduZWQgaW50IHN5bWNvdW50OwotLgotLiAgICB7KiBTeW1ib2wgdGFibGUgZm9yIG91dHB1dCBCRkQgKHdpdGggc3ltY291bnQgZW50cmllcykgKn0KLS4gICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKipvdXRzeW1ib2xzOyAgICAgICAgICAgICAKLS4KLS4gICAgeyogUG9pbnRlciB0byBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uKn0KLS4gICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2hfaW5mbzsKLS4KLS4gICAgeyogU3R1ZmYgb25seSB1c2VmdWwgZm9yIGFyY2hpdmVzOip9Ci0uICAgIFBUUiBhcmVsdF9kYXRhOyAgICAgICAgICAgICAgCi0uICAgIHN0cnVjdCBfYmZkICpteV9hcmNoaXZlOyAgICAgeyogVGhlIGNvbnRhaW5pbmcgYXJjaGl2ZSBCRkQuICAqfQotLiAgICBzdHJ1Y3QgX2JmZCAqbmV4dDsgICAgICAgICAgIHsqIFRoZSBuZXh0IEJGRCBpbiB0aGUgYXJjaGl2ZS4gICp9Ci0uICAgIHN0cnVjdCBfYmZkICphcmNoaXZlX2hlYWQ7ICAgeyogVGhlIGZpcnN0IEJGRCBpbiB0aGUgYXJjaGl2ZS4gICp9Ci0uICAgIGJvb2xlYW4gaGFzX2FybWFwOyAgICAgICAgICAgCi0uCi0uICAgIHsqIEEgY2hhaW4gb2YgQkZEIHN0cnVjdHVyZXMgaW52b2x2ZWQgaW4gYSBsaW5rLiAgKn0KLS4gICAgc3RydWN0IF9iZmQgKmxpbmtfbmV4dDsKLS4KLS4gICAgeyogQSBmaWVsZCB1c2VkIGJ5IF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICBUaGlzIHdpbGwKLS4gICAgICAgYmUgdXNlZCBvbmx5IGZvciBhcmNoaXZlIGVsZW1lbnRzLiAgKn0KLS4gICAgaW50IGFyY2hpdmVfcGFzczsKLS4KLS4gICAgeyogVXNlZCBieSB0aGUgYmFjayBlbmQgdG8gaG9sZCBwcml2YXRlIGRhdGEuICp9Ci0uCi0uICAgIHVuaW9uIAotLiAgICAgIHsKLS4gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqYW91dF9kYXRhOwotLiAgICAgIHN0cnVjdCBhcnRkYXRhICphb3V0X2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IF9vYXN5c19kYXRhICpvYXN5c19vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgKm9hc3lzX2FyX2RhdGE7Ci0uICAgICAgc3RydWN0IGNvZmZfdGRhdGEgKmNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IHBlX3RkYXRhICpwZV9vYmpfZGF0YTsKLS4gICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBlY29mZl90ZGF0YSAqZWNvZmZfb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGllZWVfZGF0YV9zdHJ1Y3QgKmllZWVfZGF0YTsKLS4gICAgICBzdHJ1Y3QgaWVlZV9hcl9kYXRhX3N0cnVjdCAqaWVlZV9hcl9kYXRhOwotLiAgICAgIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0ICpzcmVjX2RhdGE7Ci0uICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKmloZXhfZGF0YTsKLS4gICAgICBzdHJ1Y3QgdGVraGV4X2RhdGFfc3RydWN0ICp0ZWtoZXhfZGF0YTsKLS4gICAgICBzdHJ1Y3QgZWxmX29ial90ZGF0YSAqZWxmX29ial9kYXRhOwotLiAgICAgIHN0cnVjdCBubG1fb2JqX3RkYXRhICpubG1fb2JqX2RhdGE7Ci0uICAgICAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKmJvdXRfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc3VuX2NvcmVfc3RydWN0ICpzdW5fY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBzY281X2NvcmVfc3RydWN0ICpzY281X2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqdHJhZF9jb3JlX2RhdGE7Ci0uICAgICAgc3RydWN0IHNvbV9kYXRhX3N0cnVjdCAqc29tX2RhdGE7Ci0uICAgICAgc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKmhwdXhfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICpocHBhYnNkX2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgc2dpX2NvcmVfc3RydWN0ICpzZ2lfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBseW54X2NvcmVfc3RydWN0ICpseW54X2NvcmVfZGF0YTsKLS4gICAgICBzdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0ICpvc2ZfY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCBjaXNjb19jb3JlX3N0cnVjdCAqY2lzY29fY29yZV9kYXRhOwotLiAgICAgIHN0cnVjdCB2ZXJzYWRvc19kYXRhX3N0cnVjdCAqdmVyc2Fkb3NfZGF0YTsKLS4gICAgICBzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICpuZXRic2RfY29yZV9kYXRhOwotLiAgICAgIFBUUiBhbnk7Ci0uICAgICAgfSB0ZGF0YTsKLS4gIAotLiAgICB7KiBVc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBob2xkIHByaXZhdGUgZGF0YSp9Ci0uICAgIFBUUiB1c3JkYXRhOwotLgotLiAgeyogV2hlcmUgYWxsIHRoZSBhbGxvY2F0ZWQgc3R1ZmYgdW5kZXIgdGhpcyBCRkQgZ29lcy4gIFRoaXMgaXMgYQotLiAgICAgc3RydWN0IG9iamFsbG9jICosIGJ1dCB3ZSB1c2UgUFRSIHRvIGF2b2lkIHJlcXVpcmluZyB0aGUgaW5jbHVzaW9uIG9mCi0uICAgICBvYmphbGxvYy5oLiAgKn0KLS4gICAgUFRSIG1lbW9yeTsKLS59OwotLgotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotI3VuZGVmIG9ial9zeW1ib2xzCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQwKLS8qIHByb3ZpZGUgc3RvcmFnZSBmb3Igc3Vic3lzdGVtLCBzdGFjayBhbmQgaGVhcCBkYXRhIHdoaWNoIG1heSBoYXZlIGJlZW4KLSAgIHBhc3NlZCBpbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgTGQgcHV0cyB0aGlzIGRhdGEgaW50byBhIGJmZF9saW5rX2luZm8KLSAgIHN0cnVjdCB3aGljaCB1bHRpbWF0ZWx5IGdldHMgcGFzc2VkIGluIHRvIHRoZSBiZmQuICBXaGVuIGl0IGFycml2ZXMsIGNvcHkKLSAgIGl0IHRvIHRoZSBmb2xsb3dpbmcgc3RydWN0IHNvIHRoYXQgdGhlIGRhdGEgd2lsbCBiZSBhdmFpbGFibGUgaW4gY29mZmNvZGUuaAotICAgd2hlcmUgaXQgaXMgbmVlZGVkLiAgVGhlIHR5cGVkZWYncyB1c2VkIGFyZSBkZWZpbmVkIGluIGJmZC5oICovCi0KLQotDAotLyoKLVNFQ1RJT04KLQlFcnJvciByZXBvcnRpbmcKLQotCU1vc3QgQkZEIGZ1bmN0aW9ucyByZXR1cm4gbm9uemVybyBvbiBzdWNjZXNzIChjaGVjayB0aGVpcgotCWluZGl2aWR1YWwgZG9jdW1lbnRhdGlvbiBmb3IgcHJlY2lzZSBzZW1hbnRpY3MpLiAgT24gYW4gZXJyb3IsCi0JdGhleSBjYWxsIDw8YmZkX3NldF9lcnJvcj4+IHRvIHNldCBhbiBlcnJvciBjb25kaXRpb24gdGhhdCBjYWxsZXJzCi0JY2FuIGNoZWNrIGJ5IGNhbGxpbmcgPDxiZmRfZ2V0X2Vycm9yPj4uCi0gICAgICAgIElmIHRoYXQgcmV0dXJucyA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LCB0aGVuIGNoZWNrCi0JPDxlcnJubz4+LgotCi0JVGhlIGVhc2llc3Qgd2F5IHRvIHJlcG9ydCBhIEJGRCBlcnJvciB0byB0aGUgdXNlciBpcyB0bwotCXVzZSA8PGJmZF9wZXJyb3I+Pi4KLQotU1VCU0VDVElPTgotCVR5cGUgPDxiZmRfZXJyb3JfdHlwZT4+Ci0KLQlUaGUgdmFsdWVzIHJldHVybmVkIGJ5IDw8YmZkX2dldF9lcnJvcj4+IGFyZSBkZWZpbmVkIGJ5IHRoZQotCWVudW1lcmF0ZWQgdHlwZSA8PGJmZF9lcnJvcl90eXBlPj4uCi0KLUNPREVfRlJBR01FTlQKLS4KLS50eXBlZGVmIGVudW0gYmZkX2Vycm9yCi0uewotLiAgYmZkX2Vycm9yX25vX2Vycm9yID0gMCwKLS4gIGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCwKLS4gIGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCwKLS4gIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQsCi0uICBiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24sCi0uICBiZmRfZXJyb3Jfbm9fbWVtb3J5LAotLiAgYmZkX2Vycm9yX25vX3N5bWJvbHMsCi0uICBiZmRfZXJyb3Jfbm9fYXJtYXAsCi0uICBiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcywKLS4gIGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSwKLS4gIGJmZF9lcnJvcl9maWxlX25vdF9yZWNvZ25pemVkLAotLiAgYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCwKLS4gIGJmZF9lcnJvcl9ub19jb250ZW50cywKLS4gIGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24sCi0uICBiZmRfZXJyb3Jfbm9fZGVidWdfc2VjdGlvbiwKLS4gIGJmZF9lcnJvcl9iYWRfdmFsdWUsCi0uICBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQsCi0uICBiZmRfZXJyb3JfZmlsZV90b29fYmlnLAotLiAgYmZkX2Vycm9yX2ludmFsaWRfZXJyb3JfY29kZQotLn0gYmZkX2Vycm9yX3R5cGU7Ci0uCi0qLwotCi1zdGF0aWMgYmZkX2Vycm9yX3R5cGUgYmZkX2Vycm9yID0gYmZkX2Vycm9yX25vX2Vycm9yOwotCi1DT05TVCBjaGFyICpDT05TVCBiZmRfZXJybXNnc1tdID0gewotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk5vIGVycm9yIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiU3lzdGVtIGNhbGwgZXJyb3IiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJJbnZhbGlkIGJmZCB0YXJnZXQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGluIHdyb25nIGZvcm1hdCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIkludmFsaWQgb3BlcmF0aW9uIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTWVtb3J5IGV4aGF1c3RlZCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk5vIHN5bWJvbHMiKSwKLQkJCU5fKCJBcmNoaXZlIGhhcyBubyBpbmRleDsgcnVuIHJhbmxpYiB0byBhZGQgb25lIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiTm8gbW9yZSBhcmNoaXZlZCBmaWxlcyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk1hbGZvcm1lZCBhcmNoaXZlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJGaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5fKCJTZWN0aW9uIGhhcyBubyBjb250ZW50cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgTl8oIk5vbnJlcHJlc2VudGFibGUgc2VjdGlvbiBvbiBvdXRwdXQiKSwKLQkJCU5fKCJTeW1ib2wgbmVlZHMgZGVidWcgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCIpLAotCQkJTl8oIkJhZCB2YWx1ZSIpLAotCQkJTl8oIkZpbGUgdHJ1bmNhdGVkIiksCi0JCQlOXygiRmlsZSB0b28gYmlnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBOXygiIzxJbnZhbGlkIGVycm9yIGNvZGU+IikKLSAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9lcnJvcgotCi1TWU5PUFNJUwotCWJmZF9lcnJvcl90eXBlIGJmZF9nZXRfZXJyb3IgKHZvaWQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgY3VycmVudCBCRkQgZXJyb3IgY29uZGl0aW9uLgotKi8KLQotYmZkX2Vycm9yX3R5cGUKLWJmZF9nZXRfZXJyb3IgKCkKLXsKLSAgcmV0dXJuIGJmZF9lcnJvcjsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9lcnJvcgotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3R5cGUgZXJyb3JfdGFnKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgdGhlIEJGRCBlcnJvciBjb25kaXRpb24gdG8gYmUgQHZhcntlcnJvcl90YWd9LgotKi8KLQotdm9pZAotYmZkX3NldF9lcnJvciAoZXJyb3JfdGFnKQotICAgICBiZmRfZXJyb3JfdHlwZSBlcnJvcl90YWc7Ci17Ci0gIGJmZF9lcnJvciA9IGVycm9yX3RhZzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Vycm1zZwotCi1TWU5PUFNJUwotCUNPTlNUIGNoYXIgKmJmZF9lcnJtc2cgKGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZyk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGVycm9yIEB2YXJ7ZXJyb3JfdGFnfSwgb3IKLQl0aGUgc3lzdGVtIGVycm9yIGlmIEB2YXJ7ZXJyb3JfdGFnfSBpcyA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LgotKi8KLQotQ09OU1QgY2hhciAqCi1iZmRfZXJybXNnIChlcnJvcl90YWcpCi0gICAgIGJmZF9lcnJvcl90eXBlIGVycm9yX3RhZzsKLXsKLSNpZm5kZWYgZXJybm8KLSAgZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotICBpZiAoZXJyb3JfdGFnID09IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLSAgICByZXR1cm4geHN0cmVycm9yIChlcnJubyk7Ci0KLSAgaWYgKCgoKGludCllcnJvcl90YWcgPChpbnQpIGJmZF9lcnJvcl9ub19lcnJvcikgfHwKLSAgICAgICAoKGludCllcnJvcl90YWcgPiAoaW50KWJmZF9lcnJvcl9pbnZhbGlkX2Vycm9yX2NvZGUpKSkKLSAgICBlcnJvcl90YWcgPSBiZmRfZXJyb3JfaW52YWxpZF9lcnJvcl9jb2RlOy8qIHNhbml0eSBjaGVjayAqLwotCi0gIHJldHVybiBfKGJmZF9lcnJtc2dzIFsoaW50KWVycm9yX3RhZ10pOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfcGVycm9yCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfcGVycm9yIChDT05TVCBjaGFyICptZXNzYWdlKTsKLQotREVTQ1JJUFRJT04KLQlQcmludCB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlCi0JbGFzdCBCRkQgZXJyb3IgdGhhdCBvY2N1cnJlZCwgb3IgdGhlIGxhc3Qgc3lzdGVtIGVycm9yIGlmCi0JdGhlIGxhc3QgQkZEIGVycm9yIHdhcyBhIHN5c3RlbSBjYWxsIGZhaWx1cmUuICBJZiBAdmFye21lc3NhZ2V9Ci0JaXMgbm9uLU5VTEwgYW5kIG5vbi1lbXB0eSwgdGhlIGVycm9yIHN0cmluZyBwcmludGVkIGlzIHByZWNlZGVkCi0JYnkgQHZhcnttZXNzYWdlfSwgYSBjb2xvbiwgYW5kIGEgc3BhY2UuICBJdCBpcyBmb2xsb3dlZCBieSBhIG5ld2xpbmUuCi0qLwotCi12b2lkCi1iZmRfcGVycm9yIChtZXNzYWdlKQotICAgICBDT05TVCBjaGFyICptZXNzYWdlOwotewotICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgcGVycm9yKChjaGFyICopbWVzc2FnZSk7ICAgICAgICAgICAgLyogbXVzdCBiZSBzeXN0ZW0gZXJyb3IgdGhlbi4uLiAqLwotICBlbHNlIHsKLSAgICBpZiAobWVzc2FnZSA9PSBOVUxMIHx8ICptZXNzYWdlID09ICdcMCcpCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlc1xuIiwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIGVsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgbWVzc2FnZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICB9Ci19Ci0KLS8qCi1TVUJTRUNUSU9OCi0JQkZEIGVycm9yIGhhbmRsZXIKLQotCVNvbWUgQkZEIGZ1bmN0aW9ucyB3YW50IHRvIHByaW50IG1lc3NhZ2VzIGRlc2NyaWJpbmcgdGhlCi0JcHJvYmxlbS4gIFRoZXkgY2FsbCBhIEJGRCBlcnJvciBoYW5kbGVyIGZ1bmN0aW9uLiAgVGhpcwotCWZ1bmN0aW9uIG1heSBiZSBvdmVycmlkZW4gYnkgdGhlIHByb2dyYW0uCi0KLQlUaGUgQkZEIGVycm9yIGhhbmRsZXIgYWN0cyBsaWtlIHByaW50Zi4KLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgdm9pZCAoKmJmZF9lcnJvcl9oYW5kbGVyX3R5cGUpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0uCi0qLwotCi0vKiBUaGUgcHJvZ3JhbSBuYW1lIHVzZWQgd2hlbiBwcmludGluZyBCRkQgZXJyb3IgbWVzc2FnZXMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqX2JmZF9lcnJvcl9wcm9ncmFtX25hbWU7Ci0KLS8qIFRoaXMgaXMgdGhlIGRlZmF1bHQgcm91dGluZSB0byBoYW5kbGUgQkZEIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotCi1zdGF0aWMgdm9pZCBfYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciBQQVJBTVMgKChjb25zdCBjaGFyICpzLCAuLi4pKTsKLQotc3RhdGljIHZvaWQKLV9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyIChjb25zdCBjaGFyICpzLCAuLi4pCi17Ci0gIHZhX2xpc3QgcDsKLQotICBpZiAoX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgX2JmZF9lcnJvcl9wcm9ncmFtX25hbWUpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiQkZEOiAiKTsKLQotICB2YV9zdGFydCAocCwgcyk7Ci0KLSAgdmZwcmludGYgKHN0ZGVyciwgcywgcCk7Ci0KLSAgdmFfZW5kIChwKTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotfQotCi0jZWxzZSAvKiAhIGRlZmluZWQgKEFOU0lfUFJPVE9UWVBFUykgKi8KLQotc3RhdGljIHZvaWQgX2JmZF9kZWZhdWx0X2Vycm9yX2hhbmRsZXIgKCk7Ci0KLXN0YXRpYyB2b2lkCi1fYmZkX2RlZmF1bHRfZXJyb3JfaGFuZGxlciAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICB2YV9saXN0IHA7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgaWYgKF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lICE9IE5VTEwpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIkJGRDogIik7Ci0KLSAgdmFfc3RhcnQgKHApOwotCi0gIHMgPSB2YV9hcmcgKHAsIGNvbnN0IGNoYXIgKik7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIHMsIHApOwotCi0gIHZhX2VuZCAocCk7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoQU5TSV9QUk9UT1RZUEVTKSAqLwotCi0vKiBUaGlzIGlzIGEgZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgcm91dGluZSB3aGljaCBzaG91bGQgaGFuZGxlIEJGRAotICAgZXJyb3IgbWVzc2FnZXMuICBJdCBpcyBjYWxsZWQgd2hlbiBhIEJGRCByb3V0aW5lIGVuY291bnRlcnMgYW4KLSAgIGVycm9yIGZvciB3aGljaCBpdCB3YW50cyB0byBwcmludCBhIG1lc3NhZ2UuICBHb2luZyB0aHJvdWdoIGEKLSAgIGZ1bmN0aW9uIHBvaW50ZXIgcGVybWl0cyBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgQkZEIHRvIGludGVyY2VwdAotICAgdGhlIG1lc3NhZ2VzIGFuZCBkZWFsIHdpdGggdGhlbSBpdHNlbGYuICAqLwotCi1iZmRfZXJyb3JfaGFuZGxlcl90eXBlIF9iZmRfZXJyb3JfaGFuZGxlciA9IF9iZmRfZGVmYXVsdF9lcnJvcl9oYW5kbGVyOwotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yX2hhbmRsZXIKLQotU1lOT1BTSVMKLQliZmRfZXJyb3JfaGFuZGxlcl90eXBlIGJmZF9zZXRfZXJyb3JfaGFuZGxlciAoYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBCRkQgZXJyb3IgaGFuZGxlciBmdW5jdGlvbi4gIFJldHVybnMgdGhlIHByZXZpb3VzCi0JZnVuY3Rpb24uCi0qLwotCi1iZmRfZXJyb3JfaGFuZGxlcl90eXBlCi1iZmRfc2V0X2Vycm9yX2hhbmRsZXIgKHBuZXcpCi0gICAgIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgcG5ldzsKLXsKLSAgYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBwb2xkOwotCi0gIHBvbGQgPSBfYmZkX2Vycm9yX2hhbmRsZXI7Ci0gIF9iZmRfZXJyb3JfaGFuZGxlciA9IHBuZXc7Ci0gIHJldHVybiBwb2xkOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZQotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgKGNvbnN0IGNoYXIgKik7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHRoZSBwcm9ncmFtIG5hbWUgdG8gdXNlIHdoZW4gcHJpbnRpbmcgYSBCRkQgZXJyb3IuICBUaGlzCi0JaXMgcHJpbnRlZCBiZWZvcmUgdGhlIGVycm9yIG1lc3NhZ2UgZm9sbG93ZWQgYnkgYSBjb2xvbiBhbmQKLQlzcGFjZS4gIFRoZSBzdHJpbmcgbXVzdCBub3QgYmUgY2hhbmdlZCBhZnRlciBpdCBpcyBwYXNzZWQgdG8KLQl0aGlzIGZ1bmN0aW9uLgotKi8KLQotdm9pZAotYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIF9iZmRfZXJyb3JfcHJvZ3JhbV9uYW1lID0gbmFtZTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X2Vycm9yX2hhbmRsZXIKLQotU1lOT1BTSVMKLQliZmRfZXJyb3JfaGFuZGxlcl90eXBlIGJmZF9nZXRfZXJyb3JfaGFuZGxlciAodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBCRkQgZXJyb3IgaGFuZGxlciBmdW5jdGlvbi4KLSovCi0KLWJmZF9lcnJvcl9oYW5kbGVyX3R5cGUKLWJmZF9nZXRfZXJyb3JfaGFuZGxlciAoKQotewotICByZXR1cm4gX2JmZF9lcnJvcl9oYW5kbGVyOwotfQotDAotLyoKLVNFQ1RJT04KLQlTeW1ib2xzCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3QpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZQotCXJlbG9jYXRpb24gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHNlY3Rpb24gQHZhcntzZWN0fQotCWF0dGFjaGVkIHRvIGJmZCBAdmFye2FiZmR9LiAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuCi0KLSovCi0KLQotbG9uZwotYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9nZXRfcmVsb2NfdXBwZXJfYm91bmQsIChhYmZkLCBhc2VjdCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY2Fub25pY2FsaXplX3JlbG9jCi0KLVNZTk9QU0lTCi0JbG9uZyBiZmRfY2Fub25pY2FsaXplX3JlbG9jCi0gICAgICAgIAkoYmZkICphYmZkLAotCQlhc2VjdGlvbiAqc2VjLAotCQlhcmVsZW50ICoqbG9jLAotCQlhc3ltYm9sCSoqc3ltcyk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbCB0aGUgYmFjayBlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGVuIEJGRAotCUB2YXJ7YWJmZH0gYW5kIHRyYW5zbGF0ZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgcmVsb2NhdGlvbgotCWluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIEB2YXJ7c2VjfSBpbnRvIHRoZSBpbnRlcm5hbCBjYW5vbmljYWwKLQlmb3JtLiAgUGxhY2UgdGhlIHRhYmxlIGludG8gbWVtb3J5IGF0IEB2YXJ7bG9jfSwgd2hpY2ggaGFzCi0JYmVlbiBwcmVhbGxvY2F0ZWQsIHVzdWFsbHkgYnkgYSBjYWxsIHRvCi0JPDxiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kPj4uICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVsb2NzLCBvcgotCS0xIG9uIGVycm9yLgotCi0JVGhlIEB2YXJ7c3ltc30gdGFibGUgaXMgYWxzbyBuZWVkZWQgZm9yIGhvcnJpYmxlIGludGVybmFsIG1hZ2ljCi0JcmVhc29ucy4KLQotCi0qLwotbG9uZwotYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgYXNlY3QsIGxvY2F0aW9uLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFyZWxlbnQgKipsb2NhdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfcmVsb2MsCi0JCSAgIChhYmZkLCBhc2VjdCwgbG9jYXRpb24sIHN5bWJvbHMpKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9yZWxvYwotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9yZWxvYwotCSAgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYXJlbGVudCAqKnJlbCwgdW5zaWduZWQgaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCVNldCB0aGUgcmVsb2NhdGlvbiBwb2ludGVyIGFuZCBjb3VudCB3aXRoaW4KLQlzZWN0aW9uIEB2YXJ7c2VjfSB0byB0aGUgdmFsdWVzIEB2YXJ7cmVsfSBhbmQgQHZhcntjb3VudH0uCi0JVGhlIGFyZ3VtZW50IEB2YXJ7YWJmZH0gaXMgaWdub3JlZC4KLQotKi8KLS8qQVJHU1VTRUQqLwotdm9pZAotYmZkX3NldF9yZWxvYyAoaWdub3JlX2FiZmQsIGFzZWN0LCBsb2NhdGlvbiwgY291bnQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFyZWxlbnQgKipsb2NhdGlvbjsKLSAgICAgdW5zaWduZWQgaW50IGNvdW50OwotewotICBhc2VjdC0+b3JlbG9jYXRpb24gPSBsb2NhdGlvbjsKLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gY291bnQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZmlsZV9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9maWxlX2ZsYWdzKGJmZCAqYWJmZCwgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgZmxhZyB3b3JkIGluIHRoZSBCRkQgQHZhcnthYmZkfSB0byB0aGUgdmFsdWUgQHZhcntmbGFnc30uCi0KLQlQb3NzaWJsZSBlcnJvcnMgYXJlOgotCW8gPDxiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0Pj4gLSBUaGUgdGFyZ2V0IGJmZCB3YXMgbm90IG9mIG9iamVjdCBmb3JtYXQuCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0gVGhlIHRhcmdldCBiZmQgd2FzIG9wZW4gZm9yIHJlYWRpbmcuCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlUaGUgZmxhZyB3b3JkIGNvbnRhaW5lZCBhIGJpdCB3aGljaCB3YXMgbm90IGFwcGxpY2FibGUgdG8gdGhlCi0JdHlwZSBvZiBmaWxlLiAgRS5nLiwgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBzZXQgdGhlIDw8RF9QQUdFRD4+IGJpdAotCW9uIGEgQkZEIGZvcm1hdCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGRlbWFuZCBwYWdpbmcuCi0KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfZmlsZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChiZmRfcmVhZF9wIChhYmZkKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSA9IGZsYWdzOwotICBpZiAoKGZsYWdzICYgYmZkX2FwcGxpY2FibGVfZmlsZV9mbGFncyAoYWJmZCkpICE9IGZsYWdzKSB7Ci0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQKLWJmZF9hc3NlcnQgKGZpbGUsIGxpbmUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGludCBsaW5lOwotewotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oImJmZCBhc3NlcnRpb24gZmFpbCAlczolZCIpLCBmaWxlLCBsaW5lKTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQliZmRfc2V0X3N0YXJ0X2FkZHJlc3MKLQotU1lOT1BTSVMKLSAJYm9vbGVhbiBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MoYmZkICphYmZkLCBiZmRfdm1hIHZtYSk7Ci0KLURFU0NSSVBUSU9OCi0JTWFrZSBAdmFye3ZtYX0gdGhlIGVudHJ5IHBvaW50IG9mIG91dHB1dCBCRkQgQHZhcnthYmZkfS4KLQotUkVUVVJOUwotCVJldHVybnMgPDx0cnVlPj4gb24gc3VjY2VzcywgPDxmYWxzZT4+IG90aGVyd2lzZS4KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfc3RhcnRfYWRkcmVzcyhhYmZkLCB2bWEpCi1iZmQgKmFiZmQ7Ci1iZmRfdm1hIHZtYTsKLXsKLSAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IHZtYTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9tdGltZQotCi1TWU5PUFNJUwotCWxvbmcgYmZkX2dldF9tdGltZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0aGUgZmlsZSBtb2RpZmljYXRpb24gdGltZSAoYXMgcmVhZCBmcm9tIHRoZSBmaWxlIHN5c3RlbSwgb3IKLQlmcm9tIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgYXJjaGl2ZSBtZW1iZXJzKS4KLQotKi8KLQotbG9uZwotYmZkX2dldF9tdGltZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBGSUxFICpmcDsKLSAgc3RydWN0IHN0YXQgYnVmOwotCi0gIGlmIChhYmZkLT5tdGltZV9zZXQpCi0gICAgcmV0dXJuIGFiZmQtPm10aW1lOwotCi0gIGZwID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gIGlmICgwICE9IGZzdGF0IChmaWxlbm8gKGZwKSwgJmJ1ZikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgYWJmZC0+bXRpbWUgPSBidWYuc3RfbXRpbWU7CQkvKiBTYXZlIHZhbHVlIGluIGNhc2UgYW55b25lIHdhbnRzIGl0ICovCi0gIHJldHVybiBidWYuc3RfbXRpbWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfc2l6ZQotCi1TWU5PUFNJUwotCWxvbmcgYmZkX2dldF9zaXplKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBmaWxlIHNpemUgKGFzIHJlYWQgZnJvbSBmaWxlIHN5c3RlbSkgZm9yIHRoZSBmaWxlCi0JYXNzb2NpYXRlZCB3aXRoIEJGRCBAdmFye2FiZmR9LgotCi0JVGhlIGluaXRpYWwgbW90aXZhdGlvbiBmb3IsIGFuZCB1c2Ugb2YsIHRoaXMgcm91dGluZSBpcyBub3QKLQlzbyB3ZSBjYW4gZ2V0IHRoZSBleGFjdCBzaXplIG9mIHRoZSBvYmplY3QgdGhlIEJGRCBhcHBsaWVzIHRvLCBzaW5jZQotCXRoYXQgbWlnaHQgbm90IGJlIGdlbmVyYWxseSBwb3NzaWJsZSAoYXJjaGl2ZSBtZW1iZXJzIGZvciBleGFtcGxlKS4KLQlJdCB3b3VsZCBiZSBpZGVhbCBpZiBzb21lb25lIGNvdWxkIGV2ZW50dWFsbHkgbW9kaWZ5Ci0JaXQgc28gdGhhdCBzdWNoIHJlc3VsdHMgd2VyZSBndWFyYW50ZWVkLgotCi0JSW5zdGVhZCwgd2Ugd2FudCB0byBhc2sgcXVlc3Rpb25zIGxpa2UgImlzIHRoaXMgTk5OIGJ5dGUgc2l6ZWQKLQlvYmplY3QgSSdtIGFib3V0IHRvIHRyeSByZWFkIGZyb20gZmlsZSBvZmZzZXQgWVlZIHJlYXNvbmFibGU/IgotCUFzIGFzIGV4YW1wbGUgb2Ygd2hlcmUgd2UgbWlnaHQgZG8gdGhpcywgc29tZSBvYmplY3QgZm9ybWF0cwotCXVzZSBzdHJpbmcgdGFibGVzIGZvciB3aGljaCB0aGUgZmlyc3QgPDxzaXplb2YobG9uZyk+PiBieXRlcyBvZiB0aGUKLQl0YWJsZSBjb250YWluIHRoZSBzaXplIG9mIHRoZSB0YWJsZSBpdHNlbGYsIGluY2x1ZGluZyB0aGUgc2l6ZSBieXRlcy4KLQlJZiBhbiBhcHBsaWNhdGlvbiB0cmllcyB0byByZWFkIHdoYXQgaXQgdGhpbmtzIGlzIG9uZSBvZiB0aGVzZQotCXN0cmluZyB0YWJsZXMsIHdpdGhvdXQgc29tZSB3YXkgdG8gdmFsaWRhdGUgdGhlIHNpemUsIGFuZCBmb3IKLQlzb21lIHJlYXNvbiB0aGUgc2l6ZSBpcyB3cm9uZyAoYnl0ZSBzd2FwcGluZyBlcnJvciwgd3JvbmcgbG9jYXRpb24KLQlmb3IgdGhlIHN0cmluZyB0YWJsZSwgZXRjLiksIHRoZSBvbmx5IGNsdWUgaXMgbGlrZWx5IHRvIGJlIGEgcmVhZAotCWVycm9yIHdoZW4gaXQgdHJpZXMgdG8gcmVhZCB0aGUgdGFibGUsIG9yIGEgInZpcnR1YWwgbWVtb3J5Ci0JZXhoYXVzdGVkIiBlcnJvciB3aGVuIGl0IHRyaWVzIHRvIGFsbG9jYXRlIDE1IGJhemlsbG9uIGJ5dGVzCi0Jb2Ygc3BhY2UgZm9yIHRoZSAxNSBiYXppbGxvbiBieXRlIHRhYmxlIGl0IGlzIGFib3V0IHRvIHJlYWQuCi0JVGhpcyBmdW5jdGlvbiBhdCBsZWFzdCBhbGxvd3MgdXMgdG8gYW5zd2VyIHRoZSBxdWVzaW9uLCAiaXMgdGhlCi0Jc2l6ZSByZWFzb25hYmxlPyIuCi0qLwotCi1sb25nCi1iZmRfZ2V0X3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRklMRSAqZnA7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgIT0gMCkKLSAgICByZXR1cm4gKChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKSBhYmZkLT5pb3N0cmVhbSktPnNpemU7Ci0KLSAgZnAgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgaWYgKDAgIT0gZnN0YXQgKGZpbGVubyAoZnApLCAmYnVmKSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gYnVmLnN0X3NpemU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfZ3Bfc2l6ZQotCi1TWU5PUFNJUwotCWludCBiZmRfZ2V0X2dwX3NpemUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIGJlIG9wdGltaXplZCB1c2luZyB0aGUgR1AKLQlyZWdpc3RlciB1bmRlciBNSVBTIEVDT0ZGLiAgVGhpcyBpcyB0eXBpY2FsbHkgc2V0IGJ5IHRoZSA8PC1HPj4KLQlhcmd1bWVudCB0byB0aGUgY29tcGlsZXIsIGFzc2VtYmxlciBvciBsaW5rZXIuCi0qLwotCi1pbnQKLWJmZF9nZXRfZ3Bfc2l6ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+Zm9ybWF0ID09IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotCXJldHVybiBlY29mZl9kYXRhIChhYmZkKS0+Z3Bfc2l6ZTsKLSAgICAgIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQlyZXR1cm4gZWxmX2dwX3NpemUgKGFiZmQpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZ3Bfc2l6ZQotCi1TWU5PUFNJUwotCXZvaWQgYmZkX3NldF9ncF9zaXplKGJmZCAqYWJmZCwgaW50IGkpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUAotCXJlZ2lzdGVyIHVuZGVyIEVDT0ZGIG9yIE1JUFMgRUxGLiAgVGhpcyBpcyB0eXBpY2FsbHkgc2V0IGJ5Ci0JdGhlIDw8LUc+PiBhcmd1bWVudCB0byB0aGUgY29tcGlsZXIsIGFzc2VtYmxlciBvciBsaW5rZXIuCi0qLwotCi12b2lkCi1iZmRfc2V0X2dwX3NpemUgKGFiZmQsIGkpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGk7Ci17Ci0gIC8qIERvbid0IHRyeSB0byBzZXQgR1Agc2l6ZSBvbiBhbiBhcmNoaXZlIG9yIGNvcmUgZmlsZSEgKi8KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybjsKLSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplID0gaTsKLSAgZWxzZSBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIGVsZl9ncF9zaXplIChhYmZkKSA9IGk7Ci19Ci0KLS8qIEdldCB0aGUgR1AgdmFsdWUuICBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgc29tZSBvZiB0aGUKLSAgIHJlbG9jYXRpb24gc3BlY2lhbF9mdW5jdGlvbiByb3V0aW5lcyBvbiB0YXJnZXRzIHdoaWNoIHN1cHBvcnQgYSBHUAotICAgcmVnaXN0ZXIuICAqLwotCi1iZmRfdm1hCi1fYmZkX2dldF9ncF92YWx1ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+Zm9ybWF0ID09IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotCXJldHVybiBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0gICAgICBlbHNlIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JcmV0dXJuIGVsZl9ncCAoYWJmZCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogU2V0IHRoZSBHUCB2YWx1ZS4gICovCi0KLXZvaWQKLV9iZmRfc2V0X2dwX3ZhbHVlIChhYmZkLCB2KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdjsKLXsKLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybjsKLSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKQotICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IHY7Ci0gIGVsc2UgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICBlbGZfZ3AgKGFiZmQpID0gdjsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NjYW5fdm1hCi0KLVNZTk9QU0lTCi0JYmZkX3ZtYSBiZmRfc2Nhbl92bWEoQ09OU1QgY2hhciAqc3RyaW5nLCBDT05TVCBjaGFyICoqZW5kLCBpbnQgYmFzZSk7Ci0KLURFU0NSSVBUSU9OCi0JQ29udmVydCwgbGlrZSA8PHN0cnRvdWw+PiwgYSBudW1lcmljYWwgZXhwcmVzc2lvbgotCUB2YXJ7c3RyaW5nfSBpbnRvIGEgPDxiZmRfdm1hPj4gaW50ZWdlciwgYW5kIHJldHVybiB0aGF0IGludGVnZXIuCi0JKFRob3VnaCB3aXRob3V0IGFzIG1hbnkgYmVsbHMgYW5kIHdoaXN0bGVzIGFzIDw8c3RydG91bD4+LikKLQlUaGUgZXhwcmVzc2lvbiBpcyBhc3N1bWVkIHRvIGJlIHVuc2lnbmVkIChpLmUuLCBwb3NpdGl2ZSkuCi0JSWYgZ2l2ZW4gYSBAdmFye2Jhc2V9LCBpdCBpcyB1c2VkIGFzIHRoZSBiYXNlIGZvciBjb252ZXJzaW9uLgotCUEgYmFzZSBvZiAwIGNhdXNlcyB0aGUgZnVuY3Rpb24gdG8gaW50ZXJwcmV0IHRoZSBzdHJpbmcKLQlpbiBoZXggaWYgYSBsZWFkaW5nICIweCIgb3IgIjBYIiBpcyBmb3VuZCwgb3RoZXJ3aXNlCi0JaW4gb2N0YWwgaWYgYSBsZWFkaW5nIHplcm8gaXMgZm91bmQsIG90aGVyd2lzZSBpbiBkZWNpbWFsLgotCi0JT3ZlcmZsb3cgaXMgbm90IGRldGVjdGVkLgotKi8KLQotYmZkX3ZtYQotYmZkX3NjYW5fdm1hIChzdHJpbmcsIGVuZCwgYmFzZSkKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotICAgICBDT05TVCBjaGFyICoqZW5kOwotICAgICBpbnQgYmFzZTsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgaW50IGRpZ2l0OwotCi0gIC8qIExldCB0aGUgaG9zdCBkbyBpdCBpZiBwb3NzaWJsZS4gICovCi0gIGlmIChzaXplb2YoYmZkX3ZtYSkgPD0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotICAgIHJldHVybiAoYmZkX3ZtYSkgc3RydG91bCAoc3RyaW5nLCAoY2hhciAqKikgZW5kLCBiYXNlKTsKLQotICAvKiBBIG5lZ2F0aXZlIGJhc2UgbWFrZXMgbm8gc2Vuc2UsIGFuZCB3ZSBvbmx5IG5lZWQgdG8gZ28gYXMgaGlnaCBhcyBoZXguICAqLwotICBpZiAoKGJhc2UgPCAwKSB8fCAoYmFzZSA+IDE2KSkKLSAgICByZXR1cm4gKGJmZF92bWEpIDA7Ci0KLSAgaWYgKGJhc2UgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoc3RyaW5nWzBdID09ICcwJykKLQl7Ci0JICBpZiAoKHN0cmluZ1sxXSA9PSAneCcpIHx8IChzdHJpbmdbMV0gPT0gJ1gnKSkKLQkgICAgYmFzZSA9IDE2OwotCSAgLyogWFhYIHNob3VsZCB3ZSBhbHNvIGFsbG93ICIwYiIgb3IgIjBCIiB0byBzZXQgYmFzZSB0byAyPyAqLwotCSAgZWxzZQotCSAgICBiYXNlID0gODsKLQl9Ci0gICAgICBlbHNlCi0JYmFzZSA9IDEwOwotICAgIH0KLSAgaWYgKChiYXNlID09IDE2KSAmJgotICAgICAgKHN0cmluZ1swXSA9PSAnMCcpICYmICgoc3RyaW5nWzFdID09ICd4JykgfHwgKHN0cmluZ1sxXSA9PSAnWCcpKSkKLSAgICBzdHJpbmcgKz0gMjsKLSAgLyogWFhYIHNob3VsZCB3ZSBhbHNvIHNraXAgb3ZlciAiMGIiIG9yICIwQiIgaWYgYmFzZSBpcyAyPyAqLwotICAgIAotLyogU3BlZWQgY291bGQgYmUgaW1wcm92ZWQgd2l0aCBhIHRhYmxlIGxpa2UgaGV4X3ZhbHVlW10gaW4gZ2FzLiAgKi8KLSNkZWZpbmUgSEVYX1ZBTFVFKGMpIFwKLSAgKGlzeGRpZ2l0ICgodW5zaWduZWQgY2hhcikgYykJCQkJCVwKLSAgID8gKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKQkJCQlcCi0gICAgICA/IChjIC0gJzAnKQkJCQkJCVwKLSAgICAgIDogKDEwICsgYyAtIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgYykgPyAnYScgOiAnQScpKSkJXAotICAgOiA0MikKLQotICBmb3IgKHZhbHVlID0gMDsgKGRpZ2l0ID0gSEVYX1ZBTFVFKCpzdHJpbmcpKSA8IGJhc2U7IHN0cmluZysrKQotICAgIHsKLSAgICAgIHZhbHVlID0gdmFsdWUgKiBiYXNlICsgZGlnaXQ7Ci0gICAgfQotCi0gIGlmIChlbmQpCi0gICAgKmVuZCA9IHN0cmluZzsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoYmZkICppYmZkLCBiZmQgKm9iZmQpOwotCi1ERVNDUklQVElPTgotCUNvcHkgcHJpdmF0ZSBCRkQgaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIEB2YXJ7aWJmZH0gdG8gdGhlIAotCXRoZSBCRkQgQHZhcntvYmZkfS4gIFJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuCi0JUG9zc2libGUgZXJyb3IgcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvYmZkfS4KLQotLiNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YShpYmZkLCBvYmZkKSBcCi0uICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEsIFwKLS4JCShpYmZkLCBvYmZkKSkKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKGJmZCAqaWJmZCwgYmZkICpvYmZkKTsKLQotREVTQ1JJUFRJT04KLQlNZXJnZSBwcml2YXRlIEJGRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgQHZhcntpYmZkfSB0byB0aGUgCi0JdGhlIG91dHB1dCBmaWxlIEJGRCBAdmFye29iZmR9IHdoZW4gbGlua2luZy4gIFJldHVybiA8PHRydWU+PgotCW9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uCi0KLS4jZGVmaW5lIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhKGliZmQsIG9iZmQpIFwKLS4gICAgIEJGRF9TRU5EIChvYmZkLCBfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIFwKLS4JCShpYmZkLCBvYmZkKSkKLQotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncyk7Ci0KLURFU0NSSVBUSU9OCi0JU2V0IHByaXZhdGUgQkZEIGZsYWcgaW5mb3JtYXRpb24gaW4gdGhlIEJGRCBAdmFye2FiZmR9LgotCVJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotCXJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uCi0KLS4jZGVmaW5lIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyhhYmZkLCBmbGFncykgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MsIFwKLS4JCShhYmZkLCBmbGFncykpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCXN0dWZmCi0KLURFU0NSSVBUSU9OCi0JU3R1ZmYgd2hpY2ggc2hvdWxkIGJlIGRvY3VtZW50ZWQ6Ci0KLS4jZGVmaW5lIGJmZF9zaXplb2ZfaGVhZGVycyhhYmZkLCByZWxvYykgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2l6ZW9mX2hlYWRlcnMsIChhYmZkLCByZWxvYykpCi0uCi0uI2RlZmluZSBiZmRfZmluZF9uZWFyZXN0X2xpbmUoYWJmZCwgc2VjLCBzeW1zLCBvZmYsIGZpbGUsIGZ1bmMsIGxpbmUpIFwKLS4gICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZpbmRfbmVhcmVzdF9saW5lLCAgKGFiZmQsIHNlYywgc3ltcywgb2ZmLCBmaWxlLCBmdW5jLCBsaW5lKSkKLS4KLS4gICAgICAgeyogRG8gdGhlc2UgdGhyZWUgZG8gYW55dGhpbmcgdXNlZnVsIGF0IGFsbCwgZm9yIGFueSBiYWNrIGVuZD8gICp9Ci0uI2RlZmluZSBiZmRfZGVidWdfaW5mb19zdGFydChhYmZkKSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0LCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfZGVidWdfaW5mb19lbmQoYWJmZCkgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19lbmQsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUoYWJmZCwgc2VjdGlvbikgXAotLiAgICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlLCAoYWJmZCwgc2VjdGlvbikpCi0uCi0uCi0uI2RlZmluZSBiZmRfc3RhdF9hcmNoX2VsdChhYmZkLCBzdGF0KSBcCi0uICAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9zdGF0X2FyY2hfZWx0LChhYmZkLCBzdGF0KSkKLS4KLS4jZGVmaW5lIGJmZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wKGFiZmQpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsIGFyY2gsIG1hY2gpXAotLiAgICAgICAgQkZEX1NFTkQgKCBhYmZkLCBfYmZkX3NldF9hcmNoX21hY2gsIChhYmZkLCBhcmNoLCBtYWNoKSkKLS4KLS4jZGVmaW5lIGJmZF9yZWxheF9zZWN0aW9uKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pIFwKLS4gICAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfcmVsYXhfc2VjdGlvbiwgKGFiZmQsIHNlY3Rpb24sIGxpbmtfaW5mbywgYWdhaW4pKQotLgotLiNkZWZpbmUgYmZkX2djX3NlY3Rpb25zKGFiZmQsIGxpbmtfaW5mbykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9nY19zZWN0aW9ucywgKGFiZmQsIGxpbmtfaW5mbykpCi0uCi0uI2RlZmluZSBiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZShhYmZkKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9saW5rX2FkZF9zeW1ib2xzKGFiZmQsIGluZm8pIFwKLS4JQkZEX1NFTkQgKGFiZmQsIF9iZmRfbGlua19hZGRfc3ltYm9scywgKGFiZmQsIGluZm8pKQotLgotLiNkZWZpbmUgYmZkX2ZpbmFsX2xpbmsoYWJmZCwgaW5mbykgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9maW5hbF9saW5rLCAoYWJmZCwgaW5mbykpCi0uCi0uI2RlZmluZSBiZmRfZnJlZV9jYWNoZWRfaW5mbyhhYmZkKSBcCi0uICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX2ZyZWVfY2FjaGVkX2luZm8sIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQoYWJmZCkgXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQsIChhYmZkKSkKLS4KLS4jZGVmaW5lIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKGFiZmQsIGZpbGUpXAotLglCRkRfU0VORCAoYWJmZCwgX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhLCAoYWJmZCwgZmlsZSkpCi0uCi0uI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiKGFiZmQsIGFzeW1ib2xzKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiwgKGFiZmQsIGFzeW1ib2xzKSkKLS4KLS4jZGVmaW5lIGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZChhYmZkKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MoYWJmZCwgYXJlbHMsIGFzeW1zKSBcCi0uCUJGRF9TRU5EIChhYmZkLCBfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jLCAoYWJmZCwgYXJlbHMsIGFzeW1zKSkKLS4KLS5leHRlcm4gYmZkX2J5dGUgKmJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLS4JUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0uCQkgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBiZmRfYnl0ZSAqLAotLgkJICBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0uCi0KLSovCi0KLWJmZF9ieXRlICoKLWJmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkgICAgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYmZkICphYmZkMjsKLSAgYmZkX2J5dGUgKigqZm4pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJICAgc3RydWN0IGJmZF9saW5rX29yZGVyICosIGJmZF9ieXRlICosIGJvb2xlYW4sCi0JCQkgICBhc3ltYm9sICoqKSk7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgYWJmZDIgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICAgICAgaWYgKGFiZmQyID09IDApCi0JYWJmZDIgPSBhYmZkOwotICAgIH0KLSAgZWxzZQotICAgIGFiZmQyID0gYWJmZDsKLSAgZm4gPSBhYmZkMi0+eHZlYy0+X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHM7Ci0KLSAgcmV0dXJuICgqZm4pIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scyk7Ci19Ci0KLS8qIFJlY29yZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBFTEYgcHJvZ3JhbSBoZWFkZXIuICAqLwotCi1ib29sZWFuCi1iZmRfcmVjb3JkX3BoZHIgKGFiZmQsIHR5cGUsIGZsYWdzX3ZhbGlkLCBmbGFncywgYXRfdmFsaWQsIGF0LAotCQkgaW5jbHVkZXNfZmlsZWhkciwgaW5jbHVkZXNfcGhkcnMsIGNvdW50LCBzZWNzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLSAgICAgYm9vbGVhbiBmbGFnc192YWxpZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJvb2xlYW4gYXRfdmFsaWQ7Ci0gICAgIGJmZF92bWEgYXQ7Ci0gICAgIGJvb2xlYW4gaW5jbHVkZXNfZmlsZWhkcjsKLSAgICAgYm9vbGVhbiBpbmNsdWRlc19waGRyczsKLSAgICAgdW5zaWduZWQgaW50IGNvdW50OwotICAgICBhc2VjdGlvbiAqKnNlY3M7Ci17Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm0sICoqcG07Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0gICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkgIChzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApCi0JCSAgICsgKChzaXplX3QpIGNvdW50IC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotICBpZiAobSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtLT5uZXh0ID0gTlVMTDsKLSAgbS0+cF90eXBlID0gdHlwZTsKLSAgbS0+cF9mbGFncyA9IGZsYWdzOwotICBtLT5wX3BhZGRyID0gYXQ7Ci0gIG0tPnBfZmxhZ3NfdmFsaWQgPSBmbGFnc192YWxpZDsKLSAgbS0+cF9wYWRkcl92YWxpZCA9IGF0X3ZhbGlkOwotICBtLT5pbmNsdWRlc19maWxlaGRyID0gaW5jbHVkZXNfZmlsZWhkcjsKLSAgbS0+aW5jbHVkZXNfcGhkcnMgPSBpbmNsdWRlc19waGRyczsKLSAgbS0+Y291bnQgPSBjb3VudDsKLSAgaWYgKGNvdW50ID4gMCkKLSAgICBtZW1jcHkgKG0tPnNlY3Rpb25zLCBzZWNzLCBjb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCi0gIGZvciAocG0gPSAmZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7ICpwbSAhPSBOVUxMOyBwbSA9ICYoKnBtKS0+bmV4dCkKLSAgICA7Ci0gICpwbSA9IG07Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvYmluYXJ5LmMgYi9iZmQvYmluYXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNjNmZmYuLjAwMDAwMDAKLS0tIGEvYmZkL2JpbmFyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgYmluYXJ5IG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyBhIEJGRCBiYWNrZW5kIHdoaWNoIG1heSBiZSB1c2VkIHRvIHdyaXRlIGJpbmFyeSBvYmplY3RzLgotICAgSXQgbWF5IG9ubHkgYmUgdXNlZCBmb3Igb3V0cHV0LCBub3QgaW5wdXQuICBUaGUgaW50ZW50aW9uIGlzIHRoYXQKLSAgIHRoaXMgbWF5IGJlIHVzZWQgYXMgYW4gb3V0cHV0IGZvcm1hdCBmb3Igb2JqY29weSBpbiBvcmRlciB0bwotICAgZ2VuZXJhdGUgcmF3IGJpbmFyeSBkYXRhLgotCi0gICBUaGlzIGlzIHZlcnkgc2ltcGxlLiAgVGhlIG9ubHkgY29tcGxpY2F0aW9uIGlzIHRoYXQgdGhlIHJlYWwgZGF0YQotICAgd2lsbCBzdGFydCBhdCBzb21lIGFkZHJlc3MgWCwgYW5kIGluIHNvbWUgY2FzZXMgd2Ugd2lsbCBub3Qgd2FudCB0bwotICAgaW5jbHVkZSBYIHplcm9lcyBqdXN0IHRvIGdldCB0byB0aGF0IHBvaW50LiAgU2luY2UgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIGlzIG5vdCBtZWFuaW5nZnVsIGZvciB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCwgd2UgdXNlIGl0Ci0gICBpbnN0ZWFkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgemVyb2VzIHRvIHNraXAgYXQgdGhlIHN0YXJ0IG9mCi0gICB0aGUgZmlsZS4gIG9iamNvcHkgY29vcGVyYXRlcyBieSBzcGVjaWFsbHkgc2V0dGluZyB0aGUgc3RhcnQKLSAgIGFkZHJlc3MgdG8gemVybyBieSBkZWZhdWx0LiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogQW55IGJmZCB3ZSBjcmVhdGUgYnkgcmVhZGluZyBhIGJpbmFyeSBmaWxlIGhhcyB0aHJlZSBzeW1ib2xzOgotICAgYSBzdGFydCBzeW1ib2wsIGFuIGVuZCBzeW1ib2wsIGFuZCBhbiBhYnNvbHV0ZSBsZW5ndGggc3ltYm9sLiAgKi8KLSNkZWZpbmUgQklOX1NZTVMgMwotCi1zdGF0aWMgYm9vbGVhbiBiaW5hcnlfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpiaW5hcnlfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGJpbmFyeV9nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGxvbmcgYmluYXJ5X2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICptYW5nbGVfbmFtZSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1zdGF0aWMgbG9uZyBiaW5hcnlfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzeW1ib2wgKmJpbmFyeV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgYmluYXJ5X2dldF9zeW1ib2xfaW5mbyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBiaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBpbnQgYmluYXJ5X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0KLS8qIENyZWF0ZSBhIGJpbmFyeSBvYmplY3QuICBJbnZva2VkIHZpYSBiZmRfc2V0X2Zvcm1hdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iaW5hcnlfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFueSBmaWxlIG1heSBiZSBjb25zaWRlcmVkIHRvIGJlIGEgYmluYXJ5IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKLSAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcwotICAgYmVpbmcgYmluYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotYmluYXJ5X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgaWYgKGFiZmQtPnRhcmdldF9kZWZhdWx0ZWQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPSBCSU5fU1lNUzsKLQotICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPbmUgZGF0YSBzZWN0aW9uLiAgKi8KLSAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5kYXRhIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc2VjLT5mbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWMtPnZtYSA9IDA7Ci0gIHNlYy0+X3Jhd19zaXplID0gc3RhdGJ1Zi5zdF9zaXplOwotICBzZWMtPmZpbGVwb3MgPSAwOwotCi0gIGFiZmQtPnRkYXRhLmFueSA9IChQVFIpIHNlYzsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2RlZmluZSBiaW5hcnlfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIGJpbmFyeV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgYmluYXJ5X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmluYXJ5X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotYmluYXJ5X2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChCSU5fU1lNUyArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0vKiBDcmVhdGUgYSBzeW1ib2wgbmFtZSBiYXNlZCBvbiB0aGUgYmZkJ3MgZmlsZW5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1tYW5nbGVfbmFtZSAoYWJmZCwgc3VmZml4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKnN1ZmZpeDsKLXsKLSAgaW50IHNpemU7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqcDsKLQotICBzaXplID0gKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpCi0JICArIHN0cmxlbiAoc3VmZml4KQotCSAgKyBzaXplb2YgIl9iaW5hcnlfXyIpOwotCi0gIGJ1ZiA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gIiI7Ci0KLSAgc3ByaW50ZiAoYnVmLCAiX2JpbmFyeV8lc18lcyIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdWZmaXgpOwotCi0gIC8qIENoYW5nZSBhbnkgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHRvIHVuZGVyc2NvcmVzLiAgKi8KLSAgZm9yIChwID0gYnVmOyAqcDsgcCsrKQotICAgIGlmICghIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcCkpCi0gICAgICAqcCA9ICdfJzsKLQotICByZXR1cm4gYnVmOwotfQotCi0vKiBSZXR1cm4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBsb25nCi1iaW5hcnlfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSAoYXNlY3Rpb24gKikgYWJmZC0+dGRhdGEuYW55OwotICBhc3ltYm9sICpzeW1zOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICBzeW1zID0gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBCSU5fU1lNUyAqIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAoc3ltcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTdGFydCBzeW1ib2wuICAqLwotICBzeW1zWzBdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzBdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInN0YXJ0Iik7Ci0gIHN5bXNbMF0udmFsdWUgPSAwOwotICBzeW1zWzBdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1swXS5zZWN0aW9uID0gc2VjOwotICBzeW1zWzBdLnVkYXRhLnAgPSBOVUxMOwotCi0gIC8qIEVuZCBzeW1ib2wuICAqLwotICBzeW1zWzFdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzFdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgImVuZCIpOwotICBzeW1zWzFdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMV0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzFdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMV0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogU2l6ZSBzeW1ib2wuICAqLwotICBzeW1zWzJdLnRoZV9iZmQgPSBhYmZkOwotICBzeW1zWzJdLm5hbWUgPSBtYW5nbGVfbmFtZSAoYWJmZCwgInNpemUiKTsKLSAgc3ltc1syXS52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICBzeW1zWzJdLmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgc3ltc1syXS5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgc3ltc1syXS51ZGF0YS5wID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgQklOX1NZTVM7IGkrKykKLSAgICAqYWxvY2F0aW9uKysgPSBzeW1zKys7Ci0gICphbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBCSU5fU1lNUzsKLX0KLQotLyogTWFrZSBhbiBlbXB0eSBzeW1ib2wuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi1iaW5hcnlfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci19Ci0KLSNkZWZpbmUgYmluYXJ5X3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLQotLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWJpbmFyeV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotI2RlZmluZSBiaW5hcnlfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiaW5hcnlfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGJpbmFyeV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiaW5hcnlfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBiaW5hcnlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBiaW5hcnlfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgYmluYXJ5X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBiaW5hcnlfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIGJpbmFyeV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUgb2YgYSBiaW5hcnkgZmlsZS4gICovCi0jZGVmaW5lIGJpbmFyeV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLS8qIFdyaXRlIHNlY3Rpb24gY29udGVudHMgb2YgYSBiaW5hcnkgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1iaW5hcnlfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBib29sZWFuIGZvdW5kX2xvdzsKLSAgICAgIGJmZF92bWEgbG93OwotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIFRoZSBsb3dlc3Qgc2VjdGlvbiBMTUEgc2V0cyB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBzdGFydAotICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSB1c2UgdGhpcyB0byBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQotICAgICAgICAgc2VjdGlvbnMuICAqLwotICAgICAgZm91bmRfbG93ID0gZmFsc2U7Ci0gICAgICBsb3cgPSAwOwotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JaWYgKCgocy0+ZmxhZ3MKLQkgICAgICAmIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfTkVWRVJfTE9BRCkpCi0JICAgICA9PSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLQkgICAgJiYgKCEgZm91bmRfbG93IHx8IHMtPmxtYSA8IGxvdykpCi0JICB7Ci0JICAgIGxvdyA9IHMtPmxtYTsKLQkgICAgZm91bmRfbG93ID0gdHJ1ZTsKLQkgIH0KLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgcy0+ZmlsZXBvcyA9IHMtPmxtYSAtIGxvdzsKLQotCSAgLyogU2tpcCBmb2xsb3dpbmcgd2FybmluZyBjaGVjayBmb3Igc2VjdGlvbnMgdGhhdCB3aWxsIG5vdAotCSAgICAgb2NjdXB5IGZpbGUgc3BhY2UuICAqLyAKLQkgIGlmICgocy0+ZmxhZ3MKLQkgICAgICAgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19ORVZFUl9MT0FEKSkKLQkgICAgICAhPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiBhdHRlbXB0aW5nIHRvIGdlbmVyYXRlIGEgYmluYXJ5IGZpbGUgZnJvbSBhIGJmZCB3aXRoCi0JICAgICBMTUEncyBhbGwgb3ZlciB0aGUgcGxhY2UsIGh1Z2UgKHNwYXJzZT8pIGJpbmFyeSBmaWxlcyBtYXkKLQkgICAgIHJlc3VsdC4gIFRoaXMgY29uZGl0aW9uIGF0dGVtcHRzIHRvIGRldGVjdCB0aGlzIHNpdHVhdGlvbgotCSAgICAgYW5kIHByaW50IGEgd2FybmluZy4gIEJldHRlciBoZXVyaXN0aWNzIHdvdWxkIGJlIG5pY2UgdG8KLQkgICAgIGhhdmUuICovCi0KLQkgIGlmIChzLT5maWxlcG9zIDwgMCkKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgKF8oIldhcm5pbmc6IFdyaXRpbmcgc2VjdGlvbiBgJXMnIHRvIGh1Z2UgKGllIG5lZ2F0aXZlKSBmaWxlIG9mZnNldCAweCVseC4iKSwKLQkgICAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHMpLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgcy0+ZmlsZXBvcyk7Ci0JfQotCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgYW55dGhpbmcgZm9yIGEgc2VjdGlvbiB0aGF0IGlzIG5laXRoZXIKLSAgICAgbG9hZGVkIG5vciBhbGxvY2F0ZWQuICBUaGUgY29udGVudHMgb2Ygc3VjaCBhIHNlY3Rpb24gYXJlIG5vdAotICAgICBtZWFuaW5nZnVsIGluIHRoZSBiaW5hcnkgZm9ybWF0LiAgKi8KLSAgaWYgKChzZWMtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIHNpemUpOwotfQotCi0vKiBObyBzcGFjZSBpcyByZXF1aXJlZCBmb3IgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGludAotYmluYXJ5X3NpemVvZl9oZWFkZXJzIChhYmZkLCBleGVjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZXhlYzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgYmluYXJ5X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgYmluYXJ5X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmluYXJ5X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBiaW5hcnlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmluYXJ5X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGJpbmFyeV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBiaW5hcnlfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0jZGVmaW5lIGJpbmFyeV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLWNvbnN0IGJmZF90YXJnZXQgYmluYXJ5X3ZlYyA9Ci17Ci0gICJiaW5hcnkiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCS8qIGZsYXZvdXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogYnl0ZW9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIGhlYWRlcl9ieXRlb3JkZXIgKi8KLSAgRVhFQ19QLAkJCS8qIG9iamVjdF9mbGFncyAqLwotICAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTKSwgLyogc2VjdGlvbl9mbGFncyAqLwotICAwLAkJCQkvKiBzeW1ib2xfbGVhZGluZ19jaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBiaW5hcnlfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgYmluYXJ5X21rb2JqZWN0LAotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF90cnVlLAotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmluYXJ5KSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGJpbmFyeSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2JvdXQuYyBiL2JmZC9ib3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZjEwZjUuLjAwMDAwMDAKLS0tIGEvYmZkL2JvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MzQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA5NjAgYi5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotI2luY2x1ZGUgImJvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLQotc3RhdGljIGludCBhbGlnbmNvZGUgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIGFyZWxlbnQgKnIsIHVuc2lnbmVkIGludCBzaHJpbmspKTsKLXN0YXRpYyB2b2lkIHBlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sIGJmZF92bWEgdmFsdWUpKTsKLXN0YXRpYyBib29sZWFuIGJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24pKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpiX291dF9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjYWxsanhfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFyZWxlbnQgKiwgUFRSIHNyYywgUFRSIGRzdCwKLQkgICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNhbGxqX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhcmVsZW50ICosIFBUUiBkYXRhLAotCSAgIHVuc2lnbmVkIGludCBzcmNpZHgsIHVuc2lnbmVkIGludCBkc3RpZHgsIGFzZWN0aW9uICosIGJvb2xlYW4pKTsKLXN0YXRpYyBiZmRfdm1hIGdldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgaW50IGFiczMyY29kZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLAotCQkJICAgICAgdW5zaWduZWQgaW50LCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBiX291dF9iZmRfcmVsYXhfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCXN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQlib29sZWFuICopKTsKLXN0YXRpYyBiZmRfYnl0ZSAqYl9vdXRfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdyBieXRlCi0gICBzdHJlYW0gbWVtb3J5IGltYWdlLCBpbnRvIHRoZSBpbnRlcm5hbCBleGVjX2hlYWRlciBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1ib3V0X3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgZXhlY3AtPmFfdGxvYWQgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3Rsb2FkKTsKLSAgZXhlY3AtPmFfZGxvYWQgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgZXhlY3AtPmFfdGFsaWduID0gYnl0ZXMtPmVfdGFsaWduWzBdOwotICBleGVjcC0+YV9kYWxpZ24gPSBieXRlcy0+ZV9kYWxpZ25bMF07Ci0gIGV4ZWNwLT5hX2JhbGlnbiA9IGJ5dGVzLT5lX2JhbGlnblswXTsKLSAgZXhlY3AtPmFfcmVsYXhhYmxlID0gYnl0ZXMtPmVfcmVsYXhhYmxlWzBdOwotfQotCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlIGludG8gdGhlCi0gICBzdXBwbGllZCBidWZmZXIgcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4gICovCi0KLVBST1RPKHZvaWQsIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9vdXQsCi0JICAoYmZkICphYmZkLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwKLQkgICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqcmF3X2J5dGVzKSk7Ci12b2lkCi1ib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjcCwgcmF3X2J5dGVzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKmJ5dGVzID0gKHN0cnVjdCBleHRlcm5hbF9leGVjICopcmF3X2J5dGVzOwotCi0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgcmF3IGRhdGEsIGZyb20gdGhlIGZpZWxkcyBpbiB0aGUgZXhlYyBzdHJ1Y3QuICovCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfaW5mbyAgLCBieXRlcy0+ZV9pbmZvKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX3RleHQgICwgYnl0ZXMtPmVfdGV4dCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kYXRhICAsIGJ5dGVzLT5lX2RhdGEpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfYnNzICAgLCBieXRlcy0+ZV9ic3MpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfc3ltcyAgLCBieXRlcy0+ZV9zeW1zKTsKLSAgUFVUX1dPUkQgKGFiZmQsIGV4ZWNwLT5hX2VudHJ5ICwgYnl0ZXMtPmVfZW50cnkpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdHJzaXplLCBieXRlcy0+ZV90cnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotICBQVVRfV09SRCAoYWJmZCwgZXhlY3AtPmFfdGxvYWQgLCBieXRlcy0+ZV90bG9hZCk7Ci0gIFBVVF9XT1JEIChhYmZkLCBleGVjcC0+YV9kbG9hZCAsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgYnl0ZXMtPmVfdGFsaWduWzBdID0gZXhlY3AtPmFfdGFsaWduOwotICBieXRlcy0+ZV9kYWxpZ25bMF0gPSBleGVjcC0+YV9kYWxpZ247Ci0gIGJ5dGVzLT5lX2JhbGlnblswXSA9IGV4ZWNwLT5hX2JhbGlnbjsKLSAgYnl0ZXMtPmVfcmVsYXhhYmxlWzBdID0gZXhlY3AtPmFfcmVsYXhhYmxlOwotfQotCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWJfb3V0X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGFuZXhlYy5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4ZWNfYnl0ZXMuZV9pbmZvKTsKLQotICBpZiAoTl9CQURNQUcgKGFuZXhlYykpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGJvdXRfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgJmV4ZWNfYnl0ZXMsICZhbmV4ZWMpOwotICByZXR1cm4gYW91dF8zMl9zb21lX2FvdXRfb2JqZWN0X3AgKGFiZmQsICZhbmV4ZWMsIGJfb3V0X2NhbGxiYWNrKTsKLX0KLQotCi0vKiBGaW5pc2ggdXAgdGhlIG9wZW5pbmcgb2YgYSBiLm91dCBmaWxlIGZvciByZWFkaW5nLiAgRmlsbCBpbiBhbGwgdGhlCi0gICBmaWVsZHMgdGhhdCBhcmUgbm90IGhhbmRsZWQgYnkgY29tbW9uIGNvZGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1iX291dF9jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGxvbmcgYnNzX3N0YXJ0OwotCi0gIC8qIEFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoKGFiZmQsCi0JCSAgICBiZmRfYXJjaF9pOTYwLCAvKiBCLm91dCBvbmx5IHVzZWQgb24gaTk2MCAqLwotCQkgICAgYmZkX21hY2hfaTk2MF9jb3JlIC8qIERlZmF1bHQgKi8KLQkJICAgICk7Ci0KLSAgLyogVGhlIHBvc2l0aW9ucyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICBvYmpfc3RyX2ZpbGVwb3MgKGFiZmQpID0gTl9TVFJPRkYgKCpleGVjcCk7Ci0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgYWxpZ25tZW50cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV90YWxpZ247Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfZGFsaWduOwotICBvYmpfYnNzc2VjICAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IGV4ZWNwLT5hX2JhbGlnbjsKLQotICAvKiBUaGUgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucy4gICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+dm1hID0gZXhlY3AtPmFfdGxvYWQ7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gZXhlY3AtPmFfZGxvYWQ7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5sbWEgPSBvYmpfdGV4dHNlYyAoYWJmZCktPnZtYTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5sbWEgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICAvKiBBbmQgcmVsb2FkIHRoZSBzaXplcywgc2luY2UgdGhlIGFvdXQgbW9kdWxlIHphcHMgdGhlbSAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX3RleHQ7Ci0KLSAgYnNzX3N0YXJ0ID0gZXhlY3AtPmFfZGxvYWQgKyBleGVjcC0+YV9kYXRhOyAvKiBCU1MgPSBlbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSBhbGlnbl9wb3dlciAoYnNzX3N0YXJ0LCBleGVjcC0+YV9iYWxpZ24pOwotCi0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9UWFRPRkYoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gTl9EQVRPRkYoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBwb3NpdGlvbnMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUk9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gIE5fRFJPRkYoKmV4ZWNwKTsKLQotICBhZGF0YShhYmZkKS5wYWdlX3NpemUgPSAxOwkvKiBOb3QgYXBwbGljYWJsZS4gKi8KLSAgYWRhdGEoYWJmZCkuc2VnbWVudF9zaXplID0gMTsgLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLQotICBpZiAoZXhlY3AtPmFfcmVsYXhhYmxlKQotICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0cnVjdCBib3V0X2RhdGFfc3RydWN0IHsKLSAgICBzdHJ1Y3QgYW91dGRhdGEgYTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKHN0cnVjdCBib3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhYmZkLT50ZGF0YS5ib3V0X2RhdGEgPSByYXdwdHI7Ci0gIGV4ZWNfaGRyIChhYmZkKSA9ICZyYXdwdHItPmU7Ci0KLSAgb2JqX3RleHRzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopTlVMTDsKLSAgb2JqX2Jzc3NlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKilOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1iX291dF9zeW1ib2xfY21wIChhLCBiKQotICAgICBzdHJ1Y3QgYW91dF9zeW1ib2wgKiphLCAqKmI7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF92bWEgYXYsIGJ2OwotCi0gIC8qIFByaW1hcnkga2V5IGlzIGFkZHJlc3MgKi8KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uICgmKCphKS0+c3ltYm9sKTsKLSAgYXYgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQgKyAoKmEpLT5zeW1ib2wudmFsdWU7Ci0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoJigqYiktPnN5bWJvbCk7Ci0gIGJ2ID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0ICsgKCpiKS0+c3ltYm9sLnZhbHVlOwotCi0gIGlmIChhdiA8IGJ2KQotICAgIHJldHVybiAtMTsKLSAgaWYgKGF2ID4gYnYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2Vjb25kYXJ5IGtleSBwdXRzIENBTExOQU1FIHN5bXMgbGFzdCBhbmQgQkFMTkFNRSBzeW1zIGZpcnN0LCBzbwotICAgICB0aGF0IHRoZXkgaGF2ZSB0aGUgYmVzdCBjaGFuY2Ugb2YgYmVpbmcgY29udGlndW91cy4gICovCi0gIGlmIChJU19CQUxOQU1FICgoKmEpLT5vdGhlcikgfHwgSVNfQ0FMTE5BTUUgKCgqYiktPm90aGVyKSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChJU19DQUxMTkFNRSAoKCphKS0+b3RoZXIpIHx8IElTX0JBTE5BTUUgKCgqYiktPm90aGVyKSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLQotICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfaW5mbyA9IEJNQUdJQzsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzID0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoc3RydWN0IG5saXN0KTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RhbGlnbiA9IG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfZGFsaWduID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9iYWxpZ24gPSBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90bG9hZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBleGVjX2hkciAoYWJmZCktPmFfZGxvYWQgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICBib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjX2hkciAoYWJmZCksICZzd2FwcGVkX2hkcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmc3dhcHBlZF9oZHIsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkKLQkgICE9IEVYRUNfQllURVNfU0laRSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3cml0ZSBvdXQgcmVsb2MgaW5mbywgZm9sbG93ZWQgYnkgc3ltcyBhbmQgc3RyaW5ncyAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUge0NBTEwsQkFMfU5BTUUgc3ltYm9scyByZW1haW4gYWRqYWNlbnQgb24gb3V0cHV0Ci0JIGJ5IHNvcnRpbmcuICBUaGlzIGlzIGNvbXBsaWNhdGVkIGJ5IHRoZSBmYWN0IHRoYXQgc3RhYnMgYXJlCi0JIGFsc28gb3JkZXJlZC4gIFNvbHZlIHRoaXMgYnkgc2hpZnRpbmcgYWxsIHN0YWJzIHRvIHRoZSBlbmQKLQkgaW4gb3JkZXIsIHRoZW4gc29ydGluZyB0aGUgcmVzdC4gICovCi0KLSAgICAgIGFzeW1ib2wgKipvdXRzeW1zLCAqKnAsICoqcTsKLQotICAgICAgb3V0c3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gICAgICBwID0gb3V0c3ltcyArIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gICAgICBmb3IgKHEgPSBwLS07IHAgPj0gb3V0c3ltczsgcC0tKQotCXsKLQkgIGlmICgoKnApLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0JICAgIHsKLQkgICAgICBhc3ltYm9sICp0ID0gKi0tcTsKLQkgICAgICAqcSA9ICpwOwotCSAgICAgICpwID0gdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHEgPiBvdXRzeW1zKQotCXFzb3J0IChvdXRzeW1zLCBxIC0gb3V0c3ltcywgc2l6ZW9mKGFzeW1ib2wqKSwgYl9vdXRfc3ltYm9sX2NtcCk7Ci0KLSAgICAgIC8qIEJhY2sgdG8geW91ciByZWd1bGFybHkgc2NoZWR1bGVkIHByb2dyYW0uICAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNfaGRyKGFiZmQpKSksIFNFRUtfU0VUKQotCSAgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGFvdXRfMzJfd3JpdGVfc3ltcyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUk9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9EUk9GRigqZXhlY19oZHIoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiogU29tZSByZWxvYyBoYWNrZXJ5ICovCi0KLSNkZWZpbmUgQ0FMTFMJICAweDY2MDAzODAwCS8qIFRlbXBsYXRlIGZvciAnY2FsbHMnIGluc3RydWN0aW9uCSovCi0jZGVmaW5lIEJBTAkgIDB4MGIwMDAwMDAJLyogVGVtcGxhdGUgZm9yICdiYWwnIGluc3RydWN0aW9uICovCi0jZGVmaW5lIEJBTF9NQVNLICAweDAwZmZmZmZmCi0jZGVmaW5lIEJBTFgJICAweDg1ZjAwMDAwCS8qIFRlbXBsYXRlIGZvciAnYmFseCcgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMWF9NQVNLIDB4MDAwN2ZmZmYKLSNkZWZpbmUgQ0FMTCAgICAgIDB4MDkwMDAwMDAKLSNkZWZpbmUgUENSRUwxM19NQVNLIDB4MWZmZgotCi0KLSNkZWZpbmUgb3V0cHV0X2FkZHIoc2VjKSAoKHNlYyktPm91dHB1dF9vZmZzZXQrKHNlYyktPm91dHB1dF9zZWN0aW9uLT52bWEpCi0KLS8qIE1hZ2ljIHRvIHR1cm4gY2FsbHggaW50byBjYWxsanggKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNhbGxqeF9jYWxsYmFjayAoYWJmZCwgbGlua19pbmZvLCByZWxvY19lbnRyeSwgc3JjLCBkc3QsIGlucHV0X3NlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotewotICBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYyk7Ci0gIGFzeW1ib2wgKnN5bWJvbF9pbiA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sID0gYW91dF9zeW1ib2wgKHN5bWJvbF9pbik7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jX2VudHJ5LCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gIGlmIChJU19DQUxMTkFNRSAoc3ltYm9sLT5vdGhlcikpCi0gICAgewotICAgICAgYW91dF9zeW1ib2xfdHlwZSAqYmFsc3ltID0gc3ltYm9sKzE7Ci0gICAgICBpbnQgaW5zdCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtNCk7Ci0gICAgICAvKiBUaGUgbmV4dCBzeW1ib2wgc2hvdWxkIGJlIGFuIE5fQkFMTkFNRSAqLwotICAgICAgQkZEX0FTU0VSVCAoSVNfQkFMTkFNRSAoYmFsc3ltLT5vdGhlcikpOwotICAgICAgaW5zdCAmPSBCQUxYX01BU0s7Ci0gICAgICBpbnN0IHw9IEJBTFg7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnN0LCAoYmZkX2J5dGUgKikgZHN0LTQpOwotICAgICAgc3ltYm9sID0gYmFsc3ltOwotICAgICAgdmFsdWUgPSAoc3ltYm9sLT5zeW1ib2wudmFsdWUKLQkgICAgICAgKyBvdXRwdXRfYWRkciAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbikpOwotICAgIH0KLQotICB3b3JkICs9IHZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBiZmRfcHV0XzMyKGFiZmQsIHdvcmQsIGRzdCk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotLyogTWFnaWMgdG8gdHVybiBjYWxsIGludG8gY2FsbGogKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNhbGxqX2NhbGxiYWNrIChhYmZkLCBsaW5rX2luZm8sIHJlbG9jX2VudHJ5LCAgZGF0YSwgc3JjaWR4LCBkc3RpZHgsCi0JCWlucHV0X3NlY3Rpb24sIHNocmlua2luZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCBzcmNpZHg7Ci0gICAgIHVuc2lnbmVkIGludCBkc3RpZHg7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBib29sZWFuIHNocmlua2luZzsKLXsKLSAgaW50IHdvcmQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHNyY2lkeCk7Ci0gIGFzeW1ib2wgKnN5bWJvbF9pbiA9ICoocmVsb2NfZW50cnktPnN5bV9wdHJfcHRyKTsKLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sID0gYW91dF9zeW1ib2wgKHN5bWJvbF9pbik7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jX2VudHJ5LCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gIGlmIChJU19PVEhFUihzeW1ib2wtPm90aGVyKSkKLSAgICB7Ci0gICAgICAvKiBDYWxsIHRvIGEgc3lzdGVtIHByb2NlZHVyZSAtIHJlcGxhY2UgY29kZSB3aXRoIHN5c3RlbQotCSBwcm9jZWR1cmUgbnVtYmVyLiAgKi8KLSAgICAgIHdvcmQgPSBDQUxMUyB8IChzeW1ib2wtPm90aGVyIC0gMSk7Ci0gICAgfQotICBlbHNlIGlmIChJU19DQUxMTkFNRShzeW1ib2wtPm90aGVyKSkKLSAgICB7Ci0gICAgICBhb3V0X3N5bWJvbF90eXBlICpiYWxzeW0gPSBzeW1ib2wrMTsKLQotICAgICAgLyogVGhlIG5leHQgc3ltYm9sIHNob3VsZCBiZSBhbiBOX0JBTE5BTUUuICAqLwotICAgICAgQkZEX0FTU0VSVChJU19CQUxOQU1FKGJhbHN5bS0+b3RoZXIpKTsKLSAgICAgIAotICAgICAgLyogV2UgYXJlIGNhbGxpbmcgYSBsZWFmLCBzbyByZXBsYWNlIHRoZSBjYWxsIGluc3RydWN0aW9uIHdpdGggYQotCSBiYWwuICAqLwotICAgICAgd29yZCA9IEJBTCB8ICgod29yZAotCQkgICAgICsgb3V0cHV0X2FkZHIgKGJhbHN5bS0+c3ltYm9sLnNlY3Rpb24pCi0JCSAgICAgKyBiYWxzeW0tPnN5bWJvbC52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQKLQkJICAgICAtIGRzdGlkeAotCQkgICAgIC0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkgICAgJiBCQUxfTUFTSyk7Ci0gICAgfQotICBlbHNlIGlmICgoc3ltYm9sLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgewotICAgICAgLyogQSBjYWxsaiBhZ2FpbnN0IGEgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24gaXMgYSBmdWxseQotICAgICAgICAgcmVzb2x2ZWQgcmVsYXRpdmUgY2FsbC4gIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZS4KLSAgICAgICAgIElmIHRoZSBzeW1ib2wgaXMgbm90IGluIHRoZSBzYW1lIHNlY3Rpb24sIEknbSBub3Qgc3VyZSB3aGF0Ci0gICAgICAgICB0byBkbzsgZm9ydHVuYXRlbHksIHRoaXMgY2FzZSB3aWxsIHByb2JhYmx5IG5ldmVyIGFyaXNlLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKCEgc2hyaW5raW5nKTsKLSAgICAgIEJGRF9BU1NFUlQgKHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd29yZCA9IENBTEwgfCAoKCh3b3JkICYgQkFMX01BU0spCi0JCSAgICAgICsgdmFsdWUKLQkJICAgICAgKyByZWxvY19lbnRyeS0+YWRkZW5kCi0JCSAgICAgIC0gKHNocmlua2luZyA/IGRzdGlkeCA6IDApCi0JCSAgICAgIC0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pKQotCQkgICAgICYgQkFMX01BU0spOwotICAgIH0KLSAgYmZkX3B1dF8zMihhYmZkLCB3b3JkLCAoYmZkX2J5dGUgKikgZGF0YSArIGRzdGlkeCk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIHR5cGUgcnNoaWZ0IHNpemUgIGJpdHNpemUgIAlwY3JlbAliaXRwb3MgIGFic29sdXRlIG92ZXJmbG93IGNoZWNrKi8KLQotI2RlZmluZSBBQlMzMkNPREUgMAotI2RlZmluZSBBQlMzMkNPREVfU0hSVU5LIDEKLSNkZWZpbmUgUENSRUwyNCAyCi0jZGVmaW5lIENBTExKIDMKLSNkZWZpbmUgQUJTMzIgNAotI2RlZmluZSBQQ1JFTDEzIDUKLSNkZWZpbmUgQUJTMzJfTUFZQkVfUkVMQVhBQkxFIDEKLSNkZWZpbmUgQUJTMzJfV0FTX1JFTEFYQUJMRSAyCi0KLSNkZWZpbmUgQUxJR05FUiAxMAotI2RlZmluZSBBTElHTkRPTkUgMTEKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2NhbGxqID0KLUhPV1RPKENBTExKLCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCJjYWxsaiIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsZmFsc2UpOwotc3RhdGljICByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyID0KLUhPV1RPKEFCUzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsImFiczMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX3BjcmVsMjQgPQotSE9XVE8oUENSRUwyNCwgMCwgMiwgMjQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwwLCJwY3JlbDI0IiwgdHJ1ZSwgMHgwMGZmZmZmZiwweDAwZmZmZmZmLGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fcmVsb2NfcGNyZWwxMyA9Ci1IT1dUTyhQQ1JFTDEzLCAwLCAyLCAxMywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLDAsInBjcmVsMTMiLCB0cnVlLCAweDAwMDAxZmZmLDB4MDAwMDFmZmYsZmFsc2UpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyY29kZXNocnVuayA9Ci1IT1dUTyhBQlMzMkNPREVfU0hSVU5LLCAwLCAyLCAyNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCJjYWxseC0+Y2FsbGoiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLGZhbHNlKTsKLQotc3RhdGljICByZWxvY19ob3d0b190eXBlIGhvd3RvX3JlbG9jX2FiczMyY29kZSA9Ci1IT1dUTyhBQlMzMkNPREUsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiY2FsbHgiLCB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19hbGlnbl90YWJsZVtdID0gewotICBIT1dUTyAoQUxJR05FUiwgMCwgMHgxLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMTYiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHgzLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMzIiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHg3LCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduNjQiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05FUiwgMCwgMHhmLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImFsaWduMTI4IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2RvbmVfYWxpZ25fdGFibGVbXSA9IHsKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHgxLCAweDEsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMTYiLCBmYWxzZSwgMCwgMCwgZmFsc2UpLAotICBIT1dUTyAoQUxJR05ET05FLCAweDMsIDB4MywgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsICJkb25lYWxpZ24zMiIsIGZhbHNlLCAwLCAwLCBmYWxzZSksCi0gIEhPV1RPIChBTElHTkRPTkUsIDB4NywgMHg3LCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgImRvbmVhbGlnbjY0IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLSAgSE9XVE8gKEFMSUdORE9ORSwgMHhmLCAweGYsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAiZG9uZWFsaWduMTI4IiwgZmFsc2UsIDAsIDAsIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJfb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSTk2MF9DQUxMSjoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfY2FsbGo7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiAmaG93dG9fcmVsb2NfYWJzMzI7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUENSRUw6Ci0gICAgICByZXR1cm4gJmhvd3RvX3JlbG9jX3BjcmVsMjQ7Ci0gICAgfQotfQotCi0vKiBBbGxvY2F0ZSBlbm91Z2ggcm9vbSBmb3IgYWxsIHRoZSByZWxvYyBlbnRyaWVzLCBwbHVzIHBvaW50ZXJzIHRvIHRoZW0gYWxsICovCi0KLXN0YXRpYyBib29sZWFuCi1iX291dF9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJwdHI7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyIDsKLSAgYXJlbGVudCAqY2FjaGVfcHRyIDsKLSAgaW50IGV4dGVybl9tYXNrLCBwY3JlbF9tYXNrLCBjYWxsal9tYXNrLCBsZW5ndGhfc2hpZnQ7Ci0gIGludCBpbmNvZGVfbWFzazsKLSAgaW50IHNpemVfbWFzazsKLSAgYmZkX3ZtYSBwcmV2X2FkZHIgPSAwOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHNpemVfdCAgcmVsb2Nfc2l6ZTsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyAqcmVsb2NzOwotICBhcmVsZW50ICpyZWxvY19jYWNoZTsKLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICghYW91dF8zMl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYXNlY3QgPT0gb2JqX2RhdGFzZWMgKGFiZmQpKSB7Ci0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgICBnb3RvIGRvaXQ7Ci0gIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX3RleHRzZWMgKGFiZmQpKSB7Ci0gICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgICBnb3RvIGRvaXQ7Ci0gIH0KLQotICBpZiAoYXNlY3QgPT0gb2JqX2Jzc3NlYyAoYWJmZCkpIHsKLSAgICByZWxvY19zaXplID0gMDsKLSAgICBnb3RvIGRvaXQ7Ci0gIH0KLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci0KLSBkb2l0OgotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoYXNlY3QtPnJlbF9maWxlcG9zKSwgIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgY291bnQgPSByZWxvY19zaXplIC8gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLQotICByZWxvY3MgPSAoc3RydWN0IHJlbG9jYXRpb25faW5mbyAqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY3MgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jICgoY291bnQrMSkgKiBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKCFyZWxvY19jYWNoZSkgewotICAgIGlmIChyZWxvY3MgIT0gTlVMTCkKLSAgICAgIGZyZWUgKChjaGFyKilyZWxvY3MpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgcmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKSB7Ci0gICAgZnJlZSAocmVsb2NfY2FjaGUpOwotICAgIGlmIChyZWxvY3MgIT0gTlVMTCkKLSAgICAgIGZyZWUgKHJlbG9jcyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgLyogYmlnLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLwotICAgIHBjcmVsX21hc2sgID0gMHg4MDsKLSAgICBleHRlcm5fbWFzayA9IDB4MTA7Ci0gICAgaW5jb2RlX21hc2sgPSAweDA4OwotICAgIGNhbGxqX21hc2sgID0gMHgwMjsKLSAgICBzaXplX21hc2sgPSAgIDB4MjA7Ci0gICAgbGVuZ3RoX3NoaWZ0ID0gNTsKLSAgfSBlbHNlIHsKLSAgICAvKiBsaXR0bGUtZW5kaWFuIGJpdCBmaWVsZCBhbGxvY2F0aW9uIG9yZGVyICovCi0gICAgcGNyZWxfbWFzayAgPSAweDAxOwotICAgIGV4dGVybl9tYXNrID0gMHgwODsKLSAgICBpbmNvZGVfbWFzayA9IDB4MTA7Ci0gICAgY2FsbGpfbWFzayAgPSAweDQwOwotICAgIHNpemVfbWFzayAgID0gMHgwMjsKLSAgICBsZW5ndGhfc2hpZnQgPSAxOwotICB9Ci0KLSAgZm9yIChycHRyID0gcmVsb2NzLCBjYWNoZV9wdHIgPSByZWxvY19jYWNoZSwgY291bnRlciA9IDA7Ci0gICAgICAgY291bnRlciA8IGNvdW50OwotICAgICAgIGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgKnJhdyA9ICh1bnNpZ25lZCBjaGFyICopcnB0cjsKLSAgICB1bnNpZ25lZCBpbnQgc3ltbnVtOwotICAgIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmF3ICsgMCk7Ci0gICAgY2FjaGVfcHRyLT5ob3d0byA9IDA7Ci0gICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgc3ltbnVtID0gKHJhd1s0XSA8PCAxNikgfCAocmF3WzVdIDw8IDgpIHwgcmF3WzZdOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3ltbnVtID0gKHJhd1s2XSA8PCAxNikgfCAocmF3WzVdIDw8IDgpIHwgcmF3WzRdOwotICAgIH0KLQotICAgIGlmIChyYXdbN10gJiBleHRlcm5fbWFzaykKLSAgICB7Ci0gICAgICAvKiBpZiB0aGlzIGlzIHNldCB0aGVuIHRoZSByX2luZGV4IGlzIGEgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlOwotICAgICAgICogaWYgdGhlIGJpdCBpcyBub3Qgc2V0IHRoZW4gcl9pbmRleCBjb250YWlucyBhIHNlY3Rpb24gbWFwLgotICAgICAgICogd2UgZWl0aGVyIGZpbGwgaW4gdGhlIHN5bSBlbnRyeSB3aXRoIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sLAotICAgICAgICogb3IgcG9pbnQgdG8gdGhlIGNvcnJlY3Qgc2VjdGlvbgotICAgICAgICovCi0gICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIHN5bW51bTsKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsKLSAgICB9IGVsc2UKLSAgICB7Ci0gICAgICAvKiBpbiBhLm91dCBzeW1ib2xzIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgICAgICogZmlsZSByYXRoZXIgdGhhbiBzZWN0aW9ucyA/Ci0gICAgICAgKiAobG9vayBpbiB0cmFuc2xhdGVfZnJvbV9uYXRpdmVfc3ltX2ZsYWdzKQotICAgICAgICogdGhlIHJlbG9jIGVudHJ5IGFkZGVuZCBoYXMgYWRkZWQgdG8gaXQgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAgICogZmlsZSBvZiB0aGUgZGF0YSwgc28gc3VidHJhY3QgdGhlIGJhc2UgdG8gbWFrZSB0aGUgcmVsb2MKLSAgICAgICAqIHNlY3Rpb24gcmVsYXRpdmUgKi8KLSAgICAgIGludCBzOwotICAgICAgewotCS8qIHNpZ24tZXh0ZW5kIHN5bW51bSBmcm9tIDI0IGJpdHMgdG8gd2hhdGV2ZXIgaG9zdCB1c2VzICovCi0JcyA9IHN5bW51bTsKLQlpZiAocyAmICgxIDw8IDIzKSkKLQkgIHMgfD0gKH4wKSA8PCAyNDsKLSAgICAgIH0KLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKilOVUxMOwotICAgICAgc3dpdGNoIChzKQotICAgICAgewotICAgICAgIGNhc2UgTl9URVhUOgotICAgICAgIGNhc2UgTl9URVhUIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial90ZXh0c2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKLQljYWNoZV9wdHItPmFkZGVuZCA9IC0gb2JqX3RleHRzZWMoYWJmZCktPnZtYTsKLQlicmVhazsKLSAgICAgICBjYXNlIE5fREFUQToKLSAgICAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgotCWNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBvYmpfZGF0YXNlYyhhYmZkKS0+c3ltYm9sX3B0cl9wdHI7Ci0JY2FjaGVfcHRyLT5hZGRlbmQgPSAtIG9ial9kYXRhc2VjKGFiZmQpLT52bWE7Ci0JYnJlYWs7Ci0gICAgICAgY2FzZSBOX0JTUzoKLSAgICAgICBjYXNlIE5fQlNTIHwgTl9FWFQ6Ci0JY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IG9ial9ic3NzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwotCWNhY2hlX3B0ci0+YWRkZW5kID0gIC0gb2JqX2Jzc3NlYyhhYmZkKS0+dm1hOwotCWJyZWFrOwotICAgICAgIGNhc2UgTl9BQlM6Ci0gICAgICAgY2FzZSBOX0FCUyB8IE5fRVhUOgotCWNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBvYmpfYnNzc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsKLQljYWNoZV9wdHItPmFkZGVuZCA9IDA7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIC0yOiAvKiAuYWxpZ24gKi8KLQlpZiAocmF3WzddICYgcGNyZWxfbWFzaykKLQkgIHsKLQkgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19hbGlnbl90YWJsZVsocmF3WzddID4+IGxlbmd0aF9zaGlmdCkgJiAzXTsKLQkgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogLm9yZz8gKi8KLQkgICAgYWJvcnQgKCk7Ci0JICB9Ci0JY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwotCWJyZWFrOwotICAgICAgIGRlZmF1bHQ6Ci0JQkZEX0FTU0VSVCgwKTsKLQlicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIC8qIHRoZSBpOTYwIG9ubHkgaGFzIGEgZmV3IHJlbG9jYXRpb24gdHlwZXM6Ci0gICAgICAgYWJzIDMyLWJpdCBhbmQgcGNyZWwgMjRiaXQuICAgZXhjZXB0IGZvciBjYWxsaidzISAgKi8KLSAgICBpZiAoY2FjaGVfcHRyLT5ob3d0byAhPSAwKQotICAgICAgOwotICAgIGVsc2UgaWYgKHJhd1s3XSAmIGNhbGxqX21hc2spCi0gICAgewotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19jYWxsajsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHJhd1s3XSAmIHBjcmVsX21hc2spCi0gICAgewotICAgICAgaWYgKHJhd1s3XSAmIHNpemVfbWFzaykKLSAgICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmhvd3RvX3JlbG9jX3BjcmVsMTM7Ci0gICAgICBlbHNlCi0gICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b19yZWxvY19wY3JlbDI0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHJhd1s3XSAmIGluY29kZV9tYXNrKQotICAgICAgewotCWNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfYWJzMzJjb2RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCWNhY2hlX3B0ci0+aG93dG8gPSAmaG93dG9fcmVsb2NfYWJzMzI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChjYWNoZV9wdHItPmFkZHJlc3MgPCBwcmV2X2FkZHIpCi0gICAgewotICAgICAgLyogT3VjaCEgdGhpcyByZWxvYyBpcyBvdXQgb2Ygb3JkZXIsIGluc2VydCBpbnRvIHRoZSByaWdodCBwbGFjZQotICAgICAgICovCi0gICAgICBhcmVsZW50IHRtcDsKLSAgICAgIGFyZWxlbnQgKmN1cnNvciA9IGNhY2hlX3B0ci0xOwotICAgICAgYmZkX3ZtYSBzdG9wID0gY2FjaGVfcHRyLT5hZGRyZXNzOwotICAgICAgdG1wICA9ICpjYWNoZV9wdHI7Ci0gICAgICB3aGlsZSAoY3Vyc29yLT5hZGRyZXNzID4gc3RvcCAmJiBjdXJzb3IgPj0gcmVsb2NfY2FjaGUpCi0gICAgICB7Ci0JY3Vyc29yWzFdID0gY3Vyc29yWzBdOwotCWN1cnNvci0tOwotICAgICAgfQotICAgICAgY3Vyc29yWzFdID0gdG1wOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJldl9hZGRyID0gY2FjaGVfcHRyLT5hZGRyZXNzOwotICAgIH0KLSAgfQotCi0KLSAgaWYgKHJlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X3NxdWlydF9vdXRfcmVsb2NzIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBhcmVsZW50ICoqZ2VuZXJpYzsKLSAgaW50IHJfZXh0ZXJuID0gMDsKLSAgaW50IHJfaWR4OwotICBpbnQgaW5jb2RlX21hc2s7Ci0gIGludCBsZW5fMTsKLSAgdW5zaWduZWQgaW50IGNvdW50ID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKm5hdGl2ZSwgKm5hdHB0cjsKLSAgc2l6ZV90IG5hdHNpemUgPSBjb3VudCAqIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0gIGludCBleHRlcm5fbWFzaywgcGNyZWxfbWFzaywgIGxlbl8yLCBjYWxsal9tYXNrOwotICBpZiAoY291bnQgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGdlbmVyaWMgICA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotICBuYXRpdmUgPSAoKHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKikgYmZkX21hbGxvYyAobmF0c2l6ZSkpOwotICBpZiAoIW5hdGl2ZSAmJiBuYXRzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICB7Ci0gICAgLyogQmlnLWVuZGlhbiBiaXQgZmllbGQgYWxsb2NhdGlvbiBvcmRlciAqLwotICAgIHBjcmVsX21hc2sgID0gMHg4MDsKLSAgICBleHRlcm5fbWFzayA9IDB4MTA7Ci0gICAgbGVuXzIgICAgICAgPSAweDQwOwotICAgIGxlbl8xICAgICAgID0gMHgyMDsKLSAgICBjYWxsal9tYXNrICA9IDB4MDI7Ci0gICAgaW5jb2RlX21hc2sgPSAweDA4OwotICB9Ci0gIGVsc2UKLSAgewotICAgIC8qIExpdHRsZS1lbmRpYW4gYml0IGZpZWxkIGFsbG9jYXRpb24gb3JkZXIgKi8KLSAgICBwY3JlbF9tYXNrICA9IDB4MDE7Ci0gICAgZXh0ZXJuX21hc2sgPSAweDA4OwotICAgIGxlbl8yICAgICAgID0gMHgwNDsKLSAgICBsZW5fMSAgICAgICA9IDB4MDI7Ci0gICAgY2FsbGpfbWFzayAgPSAweDQwOwotICAgIGluY29kZV9tYXNrID0gMHgxMDsKLSAgfQotCi0gIGZvciAobmF0cHRyID0gbmF0aXZlOyBjb3VudCA+IDA7IC0tY291bnQsICsrbmF0cHRyLCArK2dlbmVyaWMpCi0gIHsKLSAgICBhcmVsZW50ICpnID0gKmdlbmVyaWM7Ci0gICAgdW5zaWduZWQgY2hhciAqcmF3ID0gKHVuc2lnbmVkIGNoYXIgKiluYXRwdHI7Ci0gICAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0KLSAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gICAgYmZkX2hfcHV0XzMyKGFiZmQsIGctPmFkZHJlc3MsIHJhdyk7Ci0gICAgLyogRmluZCBhIHR5cGUgaW4gdGhlIG91dHB1dCBmb3JtYXQgd2hpY2ggbWF0Y2hlcyB0aGUgaW5wdXQgaG93dG8gLQotICAgICAqIGF0IHRoZSBtb21lbnQgd2UgYXNzdW1lIGlucHV0IGZvcm1hdCA9PSBvdXRwdXQgZm9ybWF0IEZJWE1FISEKLSAgICAgKi8KLSAgICByX2lkeCA9IDA7Ci0gICAgLyogRklYTUU6ICBOZWVkIGNhbGxqIHN0dWZmIGhlcmUsIGFuZCB0byBjaGVjayB0aGUgaG93dG8gZW50cmllcyB0bwotICAgICAgIGJlIHN1cmUgdGhleSBhcmUgcmVhbCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICAqLwotICAgIGlmIChnLT5ob3d0bz09ICZob3d0b19yZWxvY19jYWxsaikKLSAgICB7Ci0gICAgICByYXdbN10gPSBjYWxsal9tYXNrICsgcGNyZWxfbWFzayArIGxlbl8yOwotICAgIH0KLSAgICBlbHNlIGlmIChnLT5ob3d0byA9PSAmaG93dG9fcmVsb2NfcGNyZWwyNCkKLSAgICB7Ci0gICAgICByYXdbN10gPSBwY3JlbF9tYXNrICsgbGVuXzI7Ci0gICAgfQotICAgIGVsc2UgaWYgKGctPmhvd3RvID09ICZob3d0b19yZWxvY19wY3JlbDEzKQotICAgIHsKLSAgICAgIHJhd1s3XSA9IHBjcmVsX21hc2sgKyBsZW5fMTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZy0+aG93dG8gPT0gJmhvd3RvX3JlbG9jX2FiczMyY29kZSkKLSAgICB7Ci0gICAgICByYXdbN10gPSBsZW5fMiArIGluY29kZV9tYXNrOwotICAgIH0KLSAgICBlbHNlIGlmIChnLT5ob3d0byA+PSBob3d0b19hbGlnbl90YWJsZQotCSAgICAgJiYgZy0+aG93dG8gPD0gKGhvd3RvX2FsaWduX3RhYmxlCi0JCQkgICAgKyBzaXplb2YgKGhvd3RvX2FsaWduX3RhYmxlKSAvIHNpemVvZiAoaG93dG9fYWxpZ25fdGFibGVbMF0pCi0JCQkgICAgLSAxKSkKLSAgICAgIHsKLQkvKiBzeW1udW0gPT0gLTI7IGV4dGVybl9tYXNrIG5vdCBzZXQsIHBjcmVsX21hc2sgc2V0ICovCi0Jcl9pZHggPSAtMjsKLQlyX2V4dGVybiA9IDA7Ci0JcmF3WzddID0gKHBjcmVsX21hc2sKLQkJICB8ICgoZy0+aG93dG8gLSBob3d0b19hbGlnbl90YWJsZSkgPDwgMSkpOwotICAgICAgfQotICAgIGVsc2UgewotICAgICAgcmF3WzddID0gbGVuXzI7Ci0gICAgfQotCi0gICAgaWYgKHJfaWR4ICE9IDApCi0gICAgICAvKiBhbHJlYWR5IG11Y2tlZCB3aXRoIHJfZXh0ZXJuLCByX2lkeCAqLzsKLSAgICBlbHNlIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotCSAgICAgfHwgYmZkX2lzX2Fic19zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLQkgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pKQotICAgIHsKLQotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0gICAgICB7Ci0JLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgIGZyb20gdGhlIGFicyBzZWN0aW9uICovCi0Jcl9pZHggPSAwOwotCXJfZXh0ZXJuID0gMDsKLSAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0JLyogRmlsbCBpbiBzeW1ib2wgKi8KLQotCXJfZXh0ZXJuID0gMTsKLQlyX2lkeCA9ICgqZy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogSnVzdCBhbiBvcmRpbmFyeSBzZWN0aW9uICovCi0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2lkeCAgPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgICByYXdbNF0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4ID4+IDE2KTsKLSAgICAgIHJhd1s1XSA9ICh1bnNpZ25lZCBjaGFyKSAocl9pZHggPj4gIDgpOwotICAgICAgcmF3WzZdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCAgICAgKTsKLSAgICB9IGVsc2UgewotICAgICAgcmF3WzZdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCA+PiAxNik7Ci0gICAgICByYXdbNV0gPSAodW5zaWduZWQgY2hhcikgKHJfaWR4Pj4gIDgpOwotICAgICAgcmF3WzRdID0gKHVuc2lnbmVkIGNoYXIpIChyX2lkeCAgICAgKTsKLSAgICB9Ci0gICAgaWYgKHJfZXh0ZXJuKQotICAgICByYXdbN10gfD0gZXh0ZXJuX21hc2s7Ci0gIH0KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBuYXRpdmUsIDEsIG5hdHNpemUsIGFiZmQpICE9IG5hdHNpemUpIHsKLSAgICBmcmVlKChQVFIpbmF0aXZlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZnJlZSAoKFBUUiluYXRpdmUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUgKi8KLXN0YXRpYyBsb25nCi1iX291dF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHI7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uLT5yZWxvY2F0aW9uID09IE5VTEwKLQkgICYmICEgYl9vdXRfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQotCXJldHVybiAtMTsKLQotICAgICAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLQotICAqcmVscHRyID0gTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLXN0YXRpYyBsb25nCi1iX291dF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIGlmIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKGFzZWN0LT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICByZXR1cm4gc2l6ZW9mIChhcmVsZW50ICopICogKGFzZWN0LT5yZWxvY19jb3VudCArIDEpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikgKgotCSAgICAoKGV4ZWNfaGRyKGFiZmQpLT5hX2Ryc2l6ZSAvIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpCi0JICAgICArMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgcmV0dXJuIChzaXplb2YgKGFyZWxlbnQgKikgKgotCSAgICAoKGV4ZWNfaGRyKGFiZmQpLT5hX3Ryc2l6ZSAvIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpCi0JICAgICArMSkpOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfYnNzc2VjIChhYmZkKSkKLSAgICByZXR1cm4gMDsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gLTE7Ci19Ci0MCi1zdGF0aWMgYm9vbGVhbgotYl9vdXRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkgeyAvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLwotICAgIGlmICghIGFvdXRfMzJfbWFrZV9zZWN0aW9ucyAoYWJmZCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MgPSBzaXplb2Yoc3RydWN0IGludGVybmFsX2V4ZWMpOwotICAgIG9ial9kYXRhc2VjKGFiZmQpLT5maWxlcG9zID0gb2JqX3RleHRzZWMoYWJmZCktPmZpbGVwb3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gIH0KLSAgLyogcmVnYXJkbGVzcywgb25jZSB3ZSBrbm93IHdoYXQgd2UncmUgZG9pbmcsIHdlIG1pZ2h0IGFzIHdlbGwgZ2V0IGdvaW5nICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCAhPSAwKSB7Ci0gICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSA9PSBjb3VudCkgP3RydWU6ZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1iX291dF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2goYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci0KLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikJLyogVW5rbm93biBtYWNoaW5lIGFyY2ggaXMgT0sgKi8KLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfaTk2MCkJLyogaTk2MCBkZWZhdWx0IGlzIE9LICovCi0gICAgc3dpdGNoIChtYWNoaW5lKSB7Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2tiX3NiOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9tYzoKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfeGE6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2NhOgotICAgIGNhc2UgYmZkX21hY2hfaTk2MF9rYV9zYToKLSAgICBjYXNlIGJmZF9tYWNoX2k5NjBfang6Ci0gICAgY2FzZSBiZmRfbWFjaF9pOTYwX2h4OgotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotYl9vdXRfc2l6ZW9mX2hlYWRlcnMgKGlnbm9yZV9hYmZkLCBpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGJvb2xlYW4gaWdub3JlOwotewotICByZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9leGVjKTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgYmZkX3ZtYQotZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQotICAvKiBBIHN5bWJvbCBob2xkcyBhIHBvaW50ZXIgdG8gYSBzZWN0aW9uLCBhbmQgYW4gb2Zmc2V0IGZyb20gdGhlCi0gICAgIGJhc2Ugb2YgdGhlIHNlY3Rpb24uICBUbyByZWxvY2F0ZSwgd2UgZmluZCB3aGVyZSB0aGUgc2VjdGlvbiB3aWxsCi0gICAgIGxpdmUgaW4gdGhlIG91dHB1dCBhbmQgYWRkIHRoYXQgaW4gKi8KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIEJGRC4gIExvb2sgaXQgdXAgaW4gdGhlCi0JIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4KLQkgd2UgY29udmVydCBiLm91dCB0byB1c2UgYSBzcGVjaWZpYyBmaW5hbF9saW5rIGZ1bmN0aW9uIGFuZAotCSBjaGFuZ2UgdGhlIGludGVyZmFjZSB0byBiZmRfcmVsYXhfc2VjdGlvbiB0byBub3QgcmVxdWlyZSB0aGUKLQkgZ2VuZXJpYyBzeW1ib2xzLiAgKi8KLSAgICAgIGggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChpbnB1dF9zZWN0aW9uLT5vd25lciwgbGlua19pbmZvLAotCQkJCQliZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkJCQlmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl2YWx1ZSA9IGgtPnUuZGVmLnZhbHVlICsgb3V0cHV0X2FkZHIgKGgtPnUuZGVmLnNlY3Rpb24pOwotICAgICAgZWxzZSBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCXZhbHVlID0gaC0+dS5jLnNpemU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCQkgIGlucHV0X3NlY3Rpb24tPm93bmVyLCBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQkgIHZhbHVlID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBzeW1ib2wtPnZhbHVlICsgb3V0cHV0X2FkZHIgKHN5bWJvbC0+c2VjdGlvbik7Ci0gICAgfQotCi0gIC8qIEFkZCB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZWxvY2F0aW9uICovCi0gIHZhbHVlICs9IHJlbG9jLT5hZGRlbmQ7Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZAotcGVyZm9ybV9zbGlwIChhYmZkLCBzbGlwLCBpbnB1dF9zZWN0aW9uLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2xpcDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIEZpbmQgYWxsIHN5bWJvbHMgcGFzdCB0aGlzIHBvaW50LCBhbmQgbWFrZSB0aGVtIGtub3cKLSAgICAgd2hhdCdzIGhhcHBlbmVkICovCi0gIHdoaWxlICgqcykKLSAgewotICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIC8qIFRoaXMgd2FzIHBvaW50aW5nIGludG8gdGhpcyBzZWN0aW9uLCBzbyBtYW5nbGUgaXQgKi8KLSAgICAgIGlmIChwLT52YWx1ZSA+IHZhbHVlKQotICAgICAgewotCXAtPnZhbHVlIC09c2xpcDsKLQlpZiAocC0+dWRhdGEucCAhPSBOVUxMKQotCSAgewotCSAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgcC0+dWRhdGEucDsKLQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCk7Ci0JICAgIGgtPnJvb3QudS5kZWYudmFsdWUgLT0gc2xpcDsKLQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC51LmRlZi52YWx1ZSA9PSBwLT52YWx1ZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHMrKzsKLQotICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSB3b3JrcyBvdXQgaWYgdGhlIHRoaW5nIHdlIHdhbnQgdG8gZ2V0IHRvIGNhbiBiZQotICAgcmVhY2hlZCB3aXRoIGEgMjRiaXQgb2Zmc2V0IGluc3RlYWQgb2YgYSAzMiBiaXQgb25lLgotICAgSWYgaXQgY2FuLCB0aGVuIGl0IGNoYW5nZXMgdGhlIGFtb2RlICovCi0KLXN0YXRpYyBpbnQKLWFiczMyY29kZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgciwgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnI7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWUgPSBnZXRfdmFsdWUgKHIsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0gIGJmZF92bWEgZG90ID0gb3V0cHV0X2FkZHIgKGlucHV0X3NlY3Rpb24pICsgci0+YWRkcmVzczsKLSAgYmZkX3ZtYSBnYXA7Ci0KLSAgLyogU2VlIGlmIHRoZSBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgYXQgd2l0aGluIDJeMjMgYnl0ZXMgb2Ygd2hlcmUKLSAgICAgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0gICAgIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gIGdhcCA9IHZhbHVlIC0gKGRvdCAtIHNocmluayk7Ci0KLQotICBpZiAoLTE8PDIzIDwgKGxvbmcpZ2FwICYmIChsb25nKWdhcCA8IDE8PDIzICkKLSAgewotICAgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBmcm9tIDMyYml0Y29kZSBwb3NzaWJsZSAyNCwgdG8gMjRiaXQKLSAgICAgICBwb3NzaWJsZSAzMiAqLwotCi0gICAgci0+aG93dG8gPSAmaG93dG9fcmVsb2NfYWJzMzJjb2Rlc2hydW5rOwotICAgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgZm91ciBieXRlcyAqLwotICAgIHItPmFkZHJlc3MgLT00OwotCi0gICAgLyogVGhpcyB3aWxsIGJlIGZvdXIgYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLSAgICBzaHJpbmsgKz0gNCA7Ci0gICAgcGVyZm9ybV9zbGlwIChhYmZkLCA0LCBpbnB1dF9zZWN0aW9uLCByLT5hZGRyZXNzLXNocmluayArIDQpOwotICB9Ci0gIHJldHVybiBzaHJpbms7Ci19Ci0KLXN0YXRpYyBpbnQKLWFsaWduY29kZSAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgciwgc2hyaW5rKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBhcmVsZW50ICpyOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotewotICBiZmRfdm1hIGRvdCA9IG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSArIHItPmFkZHJlc3M7Ci0gIGJmZF92bWEgZ2FwOwotICBiZmRfdm1hIG9sZF9lbmQ7Ci0gIGJmZF92bWEgbmV3X2VuZDsKLSAgaW50IHNocmlua19kZWx0YTsKLSAgaW50IHNpemUgPSByLT5ob3d0by0+c2l6ZTsKLQotICAvKiBSZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGFsaWdubWVudCBzbyB0aGF0IGl0J3Mgc3RpbGwgYWxpZ25lZCBidXQKLSAgICAgc21hbGxlciAgLSB0aGUgY3VycmVudCBzaXplIGlzIGFscmVhZHkgdGhlIHNhbWUgc2l6ZSBhcyBvciBiaWdnZXIKLSAgICAgdGhhbiB0aGUgYWxpZ25tZW50IHJlcXVpcmVkLiAgKi8KLQotICAvKiBjYWxjdWxhdGUgdGhlIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBwYWRkaW5nIGJlZm9yZSB3ZSBvcHRpbWl6ZSAqLwotICBvbGRfZW5kID0gKChkb3QgKyBzaXplICkgJiB+c2l6ZSkgKyBzaXplKzE7Ci0gIC8qIHdvcmsgb3V0IHdoZXJlIHRoZSBuZXcgZW5kIHdpbGwgYmUgLSByZW1lbWJlciB0aGF0IHdlJ3JlIHNtYWxsZXIKLSAgICAgdGhhbiB3ZSB1c2VkIHRvIGJlICovCi0gIG5ld19lbmQgPSAoKGRvdCAtIHNocmluayArIHNpemUpICYgfnNpemUpOwotCi0gIC8qIFRoaXMgaXMgdGhlIG5ldyBlbmQgKi8KLSAgZ2FwID0gb2xkX2VuZCAtICgoZG90ICsgc2l6ZSkgJiB+c2l6ZSk7Ci0KLSAgc2hyaW5rX2RlbHRhID0gKG9sZF9lbmQgLSBuZXdfZW5kKSAtIHNocmluazsKLQotICBpZiAoc2hyaW5rX2RlbHRhKQotICB7Ci0gICAgLyogQ2hhbmdlIHRoZSByZWxvYyBzbyB0aGF0IGl0IGtub3dzIGhvdyBmYXIgdG8gYWxpZ24gdG8gKi8KLSAgICByLT5ob3d0byA9IGhvd3RvX2RvbmVfYWxpZ25fdGFibGUgKyAoci0+aG93dG8gLSBob3d0b19hbGlnbl90YWJsZSk7Ci0KLSAgICAvKiBFbmNvZGUgdGhlIHN0dWZmIGludG8gdGhlIGFkZGVuZCAtIGZvciBmdXR1cmUgdXNlIHdlIG5lZWQgdG8KLSAgICAgICBrbm93IGhvdyBiaWcgdGhlIHJlbG9jIHVzZWQgdG8gYmUgKi8KLSAgICByLT5hZGRlbmQgPSBvbGRfZW5kIC0gZG90ICsgci0+YWRkcmVzczsKLQotICAgIC8qIFRoaXMgd2lsbCBiZSBOIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuLCBhZGp1c3QgYWxsIHRoZSBzeW1ib2xzICovCi0gICAgcGVyZm9ybV9zbGlwIChhYmZkLCBzaHJpbmtfZGVsdGEsIGlucHV0X3NlY3Rpb24sIHItPmFkZHJlc3MgLSBzaHJpbmspOwotICAgIHNocmluayArPSBzaHJpbmtfZGVsdGE7Ci0gIH0KLSAgcmV0dXJuIHNocmluazsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWJfb3V0X2JmZF9yZWxheF9zZWN0aW9uIChhYmZkLCBpLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBpLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBpOwotICBpbnQgc2hyaW5rID0gMCA7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKGlucHV0X2JmZCwKLQkJCQkJICAgICAgaW5wdXRfc2VjdGlvbik7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBvbmx5IHJ1biB0aGlzIHJlbGF4YXRpb24gb25jZS4gIEl0IG1pZ2h0IHdvcmsgdG8gcnVuIGl0Ci0gICAgIG11bHRpcGxlIHRpbWVzLCBidXQgaXQgaGFzbid0IGJlZW4gdGVzdGVkLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgaWYgKHJlbG9jX3NpemUpCi0gICAgewotICAgICAgbG9uZyByZWxvY19jb3VudDsKLQotICAgICAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICAgICAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogR2V0IHRoZSByZWxvY3MgYW5kIHRoaW5rIGFib3V0IHRoZW0gKi8KLSAgICAgIHJlbG9jX2NvdW50ID0KLQliZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX3ZlY3RvciwKLQkJCQlfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSk7Ci0gICAgICBpZiAocmVsb2NfY291bnQgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLQl7Ci0JICBhcmVsZW50ICoqcGFyZW50OwotCSAgZm9yIChwYXJlbnQgPSByZWxvY192ZWN0b3I7ICpwYXJlbnQ7IHBhcmVudCsrKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqciA9ICpwYXJlbnQ7Ci0JICAgICAgc3dpdGNoIChyLT5ob3d0by0+dHlwZSkKLQkJewotCQljYXNlIEFMSUdORVI6Ci0JCSAgLyogQW4gYWxpZ25tZW50IHJlbG9jICovCi0JCSAgc2hyaW5rID0gYWxpZ25jb2RlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmspOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERToKLQkJICAvKiBBIDMyYml0IHJlbG9jIGluIGFuIGFkZHJlc3NpbmcgbW9kZSAqLwotCQkgIHNocmluayA9IGFiczMyY29kZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByLCBzaHJpbmssCi0JCQkJICAgICAgbGlua19pbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMzMkNPREVfU0hSVU5LOgotCQkgIHNocmluays9NDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplID0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplIC0gc2hyaW5rOwotCi0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1iX291dF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLAotCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0gIGFyZWxlbnQgKipyZWxvY192ZWN0b3IgPSBOVUxMOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBJZiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgZG9uJ3QgYm90aGVyIHRvIHJlbGF4LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwKLQkJCQkJCSAgICAgICBkYXRhLCByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSAxOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgQkZEX0FTU0VSVCAodHJ1ZSA9PSBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCQlkYXRhLAotCQkJCQkJMCwKLQkJCQkJCWlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipwYXJlbnQgPSByZWxvY192ZWN0b3I7Ci0gICAgICBhcmVsZW50ICpyZWxvYyA7Ci0KLSAgICAgIHVuc2lnbmVkIGludCBkc3RfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAwOwotICAgICAgdW5zaWduZWQgaW50IHJ1bjsKLSAgICAgIHVuc2lnbmVkIGludCBpZHg7Ci0KLSAgICAgIC8qIEZpbmQgaG93IGxvbmcgYSBydW4gd2UgY2FuIGRvICovCi0gICAgICB3aGlsZSAoZHN0X2FkZHJlc3MgPCBsaW5rX29yZGVyLT5zaXplKQotCXsKLQkgIHJlbG9jID0gKnBhcmVudDsKLQkgIGlmIChyZWxvYykKLQkgICAgewotCSAgICAgIC8qIE5vdGUgdGhhdCB0aGUgcmVsYXhpbmcgZGlkbid0IHRpZSB1cCB0aGUgYWRkcmVzc2VzIGluIHRoZQotCQkgcmVsb2NhdGlvbiwgc28gd2UgdXNlIHRoZSBvcmlnaW5hbCBhZGRyZXNzIHRvIHdvcmsgb3V0IHRoZQotCQkgcnVuIG9mIG5vbi1yZWxvY2F0ZWQgZGF0YSAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRyZXNzID49IHNyY19hZGRyZXNzKTsKLQkgICAgICBydW4gPSByZWxvYy0+YWRkcmVzcyAtIHNyY19hZGRyZXNzOwotCSAgICAgIHBhcmVudCsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBydW4gPSBsaW5rX29yZGVyLT5zaXplIC0gZHN0X2FkZHJlc3M7Ci0JICAgIH0KLQkgIC8qIENvcHkgdGhlIGJ5dGVzICovCi0JICBmb3IgKGlkeCA9IDA7IGlkeCA8IHJ1bjsgaWR4KyspCi0JICAgIHsKLQkgICAgICBkYXRhW2RzdF9hZGRyZXNzKytdID0gZGF0YVtzcmNfYWRkcmVzcysrXTsKLQkgICAgfQotCi0JICAvKiBOb3cgZG8gdGhlIHJlbG9jYXRpb24gKi8KLQotCSAgaWYgKHJlbG9jKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0JCXsKLQkJY2FzZSBBQlMzMkNPREU6Ci0JCSAgY2FsbGp4X2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsCi0JCQkJICAgc3JjX2FkZHJlc3MgKyBkYXRhLCBkc3RfYWRkcmVzcyArIGRhdGEsCi0JCQkJICAgaW5wdXRfc2VjdGlvbik7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUJTMzI6Ci0JCSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCQkJICAgICAgKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHNyY19hZGRyZXNzKQotCQkJICAgICAgICsgZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSksCi0JCQkgICAgICBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQkgIHNyY19hZGRyZXNzKz00OwotCQkgIGRzdF9hZGRyZXNzKz00OwotCQkgIGJyZWFrOwotCQljYXNlIENBTExKOgotCQkgIGNhbGxqX2NhbGxiYWNrIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgcmVsb2MsIGRhdGEsCi0JCQkJICBzcmNfYWRkcmVzcywgZHN0X2FkZHJlc3MsIGlucHV0X3NlY3Rpb24sCi0JCQkJICBmYWxzZSk7Ci0JCSAgc3JjX2FkZHJlc3MrPTQ7Ci0JCSAgZHN0X2FkZHJlc3MrPTQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQUxJR05ET05FOgotCQkgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRlbmQgPj0gc3JjX2FkZHJlc3MpOwotCQkgIEJGRF9BU1NFUlQgKHJlbG9jLT5hZGRlbmQgPD0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBzcmNfYWRkcmVzcyA9IHJlbG9jLT5hZGRlbmQ7Ci0JCSAgZHN0X2FkZHJlc3MgPSAoKGRzdF9hZGRyZXNzICsgcmVsb2MtPmhvd3RvLT5zaXplKQotCQkJCSAmIH5yZWxvYy0+aG93dG8tPnNpemUpOwotCQkgIGJyZWFrOwotCQljYXNlIEFCUzMyQ09ERV9TSFJVTks6Ci0JCSAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY2FsbHgsIGJ1dCB3ZSd2ZSBmb3VuZCBvdXQgdGhhdCBhCi0JCSAgICAgY2FsbGogd2lsbCByZWFjaCwgc28gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkJICBjYWxsal9jYWxsYmFjayAoaW5wdXRfYmZkLCBsaW5rX2luZm8sIHJlbG9jLCBkYXRhLAotCQkJCSAgc3JjX2FkZHJlc3MgKyA0LCBkc3RfYWRkcmVzcywgaW5wdXRfc2VjdGlvbiwKLQkJCQkgIHRydWUpOwotCQkgIGRzdF9hZGRyZXNzKz00OwotCQkgIHNyY19hZGRyZXNzKz04OwotCQkgIGJyZWFrOwotCQljYXNlIFBDUkVMMjQ6Ci0JCSAgewotCQkgICAgbG9uZyBpbnQgd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkJCWRhdGEgKyBzcmNfYWRkcmVzcyk7Ci0JCSAgICBiZmRfdm1hIHZhbHVlOwotCi0JCSAgICB2YWx1ZSA9IGdldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCSAgICB3b3JkID0gKCh3b3JkICYgfkJBTF9NQVNLKQotCQkJICAgIHwgKCgod29yZCAmIEJBTF9NQVNLKQotCQkJCSsgdmFsdWUKLQkJCQktIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKQotCQkJCSsgcmVsb2MtPmFkZGVuZCkKLQkJCSAgICAgICAmIEJBTF9NQVNLKSk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgd29yZCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkJICAgIGRzdF9hZGRyZXNzKz00OwotCQkgICAgc3JjX2FkZHJlc3MrPTQ7Ci0KLQkJICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBQQ1JFTDEzOgotCQkgIHsKLQkJICAgIGxvbmcgaW50IHdvcmQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCQlkYXRhICsgc3JjX2FkZHJlc3MpOwotCQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQotCQkgICAgdmFsdWUgPSBnZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCQkgICAgd29yZCA9ICgod29yZCAmIH5QQ1JFTDEzX01BU0spCi0JCQkgICAgfCAoKCh3b3JkICYgUENSRUwxM19NQVNLKQotCQkJCSsgdmFsdWUKLQkJCQkrIHJlbG9jLT5hZGRlbmQKLQkJCQktIG91dHB1dF9hZGRyIChpbnB1dF9zZWN0aW9uKSkKLQkJCSAgICAgICAmIFBDUkVMMTNfTUFTSykpOwotCi0JCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHdvcmQsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JCSAgICBkc3RfYWRkcmVzcys9NDsKLQkJICAgIHNyY19hZGRyZXNzKz00OwotCi0JCSAgfQotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQoKTsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBOVUxMOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBCdWlsZCB0aGUgdHJhbnNmZXIgdmVjdG9ycyBmb3IgQmlnIGFuZCBMaXR0bGUtRW5kaWFuIEIuT1VUIGZpbGVzLiAgKi8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgYW91dF8zMl9jbG9zZV9hbmRfY2xlYW51cCBhb3V0XzMyX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgYl9vdXRfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgYl9vdXRfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiAgX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBiX291dF9iZmRfZ2Nfc2VjdGlvbnMgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLSNkZWZpbmUgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLWNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2JpZ19ob3N0ID0KLXsKLSAgImIub3V0LmJpZyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGRyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFICksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgJ18nLAkJCQkvKiBzeW1ib2wgbGVhZGluZyBjaGFyICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBiX291dF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0ge2JmZF9mYWxzZSwgYl9vdXRfbWtvYmplY3QsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGJfb3V0X3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMCwKLX07Ci0KLQotY29uc3QgYmZkX3RhcmdldCBiX291dF92ZWNfbGl0dGxlX2hvc3QgPQotewotICAiYi5vdXQubGl0dGxlIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSApLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gICdfJywJCQkJLyogc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgYl9vdXRfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGJfb3V0X21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBiX291dF93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYW91dF8zMiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGJfb3V0KSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYl9vdXQpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jYWNoZS5jIGIvYmZkL2NhY2hlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOGRlNGIuLjAwMDAwMDAKLS0tIGEvYmZkL2NhY2hlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgLS0gY2FjaGluZyBvZiBmaWxlIGRlc2NyaXB0b3JzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCAoc3RldmVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNFQ1RJT04KLQlGaWxlIGNhY2hpbmcKLQotCVRoZSBmaWxlIGNhY2hpbmcgbWVjaGFuaXNtIGlzIGVtYmVkZGVkIHdpdGhpbiBCRkQgYW5kIGFsbG93cwotCXRoZSBhcHBsaWNhdGlvbiB0byBvcGVuIGFzIG1hbnkgQkZEcyBhcyBpdCB3YW50cyB3aXRob3V0Ci0JcmVnYXJkIHRvIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0ncyBmaWxlIGRlc2NyaXB0b3IKLQlsaW1pdCAob2Z0ZW4gYXMgbG93IGFzIDIwIG9wZW4gZmlsZXMpLiAgVGhlIG1vZHVsZSBpbgotCTw8Y2FjaGUuYz4+IG1haW50YWlucyBhIGxlYXN0IHJlY2VudGx5IHVzZWQgbGlzdCBvZgotCTw8QkZEX0NBQ0hFX01BWF9PUEVOPj4gZmlsZXMsIGFuZCBleHBvcnRzIHRoZSBuYW1lCi0JPDxiZmRfY2FjaGVfbG9va3VwPj4sIHdoaWNoIHJ1bnMgYXJvdW5kIGFuZCBtYWtlcyBzdXJlIHRoYXQKLQl0aGUgcmVxdWlyZWQgQkZEIGlzIG9wZW4uIElmIG5vdCwgdGhlbiBpdCBjaG9vc2VzIGEgZmlsZSB0bwotCWNsb3NlLCBjbG9zZXMgaXQgYW5kIG9wZW5zIHRoZSBvbmUgd2FudGVkLCByZXR1cm5pbmcgaXRzIGZpbGUKLQloYW5kbGUuIAotCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLXN0YXRpYyB2b2lkIGluc2VydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc25pcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY2xvc2Vfb25lIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGJmZF9jYWNoZV9kZWxldGUgUEFSQU1TICgoYmZkICopKTsKLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JQkZEX0NBQ0hFX01BWF9PUEVOIG1hY3JvCi0KLURFU0NSSVBUSU9OCi0JVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIHdoaWNoIHRoZSBjYWNoZSB3aWxsIGtlZXAgb3BlbiBhdAotCW9uZSB0aW1lLgotCi0uI2RlZmluZSBCRkRfQ0FDSEVfTUFYX09QRU4gMTAKLQotKi8KLQotLyogVGhlIG51bWJlciBvZiBCRkQgZmlsZXMgd2UgaGF2ZSBvcGVuLiAgKi8KLQotc3RhdGljIGludCBvcGVuX2ZpbGVzOwotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfbGFzdF9jYWNoZQotCi1TWU5PUFNJUwotCWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi1ERVNDUklQVElPTgotCVplcm8sIG9yIGEgcG9pbnRlciB0byB0aGUgdG9wbW9zdCBCRkQgb24gdGhlIGNoYWluLiAgVGhpcyBpcwotCXVzZWQgYnkgdGhlIDw8YmZkX2NhY2hlX2xvb2t1cD4+IG1hY3JvIGluIEBmaWxle2xpYmJmZC5ofSB0bwotCWRldGVybWluZSB3aGVuIGl0IGNhbiBhdm9pZCBhIGZ1bmN0aW9uIGNhbGwuCi0qLwotCi1iZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKgotICBJTlRFUk5BTF9GVU5DVElPTgotICAJYmZkX2NhY2hlX2xvb2t1cAotIAotICBERVNDUklQVElPTgotIAlDaGVjayB0byBzZWUgaWYgdGhlIHJlcXVpcmVkIEJGRCBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCBvbmUKLSAJbG9va2VkIHVwLiBJZiBzbywgdGhlbiBpdCBjYW4gdXNlIHRoZSBzdHJlYW0gaW4gdGhlIEJGRCB3aXRoCi0gCWltcHVuaXR5LCBzaW5jZSBpdCBjYW4ndCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgbG9va3VwOwotIAlvdGhlcndpc2UsIGl0IGhhcyB0byBwZXJmb3JtIHRoZSBjb21wbGljYXRlZCBsb29rdXAgZnVuY3Rpb24uCi0gCi0gIC4jZGVmaW5lIGJmZF9jYWNoZV9sb29rdXAoeCkgXAotICAuICAgICgoeCk9PWJmZF9sYXN0X2NhY2hlPyBcCi0gIC4gICAgICAoRklMRSopKGJmZF9sYXN0X2NhY2hlLT5pb3N0cmVhbSk6IFwKLSAgLiAgICAgICBiZmRfY2FjaGVfbG9va3VwX3dvcmtlcih4KSkKLSAKLSAKLSAqLwotCi0vKiBJbnNlcnQgYSBCRkQgaW50byB0aGUgY2FjaGUuICAqLwotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWluc2VydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2xhc3RfY2FjaGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhYmZkLT5scnVfbmV4dCA9IGFiZmQ7Ci0gICAgICBhYmZkLT5scnVfcHJldiA9IGFiZmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWJmZC0+bHJ1X25leHQgPSBiZmRfbGFzdF9jYWNoZTsKLSAgICAgIGFiZmQtPmxydV9wcmV2ID0gYmZkX2xhc3RfY2FjaGUtPmxydV9wcmV2OwotICAgICAgYWJmZC0+bHJ1X3ByZXYtPmxydV9uZXh0ID0gYWJmZDsKLSAgICAgIGFiZmQtPmxydV9uZXh0LT5scnVfcHJldiA9IGFiZmQ7Ci0gICAgfQotICBiZmRfbGFzdF9jYWNoZSA9IGFiZmQ7Ci19Ci0KLS8qIFJlbW92ZSBhIEJGRCBmcm9tIHRoZSBjYWNoZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgdm9pZAotc25pcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT5scnVfcHJldi0+bHJ1X25leHQgPSBhYmZkLT5scnVfbmV4dDsKLSAgYWJmZC0+bHJ1X25leHQtPmxydV9wcmV2ID0gYWJmZC0+bHJ1X3ByZXY7Ci0gIGlmIChhYmZkID09IGJmZF9sYXN0X2NhY2hlKQotICAgIHsKLSAgICAgIGJmZF9sYXN0X2NhY2hlID0gYWJmZC0+bHJ1X25leHQ7Ci0gICAgICBpZiAoYWJmZCA9PSBiZmRfbGFzdF9jYWNoZSkKLQliZmRfbGFzdF9jYWNoZSA9IE5VTEw7Ci0gICAgfQotfQotCi0vKiBXZSBuZWVkIHRvIG9wZW4gYSBuZXcgZmlsZSwgYW5kIHRoZSBjYWNoZSBpcyBmdWxsLiAgRmluZCB0aGUgbGVhc3QKLSAgIHJlY2VudGx5IHVzZWQgY2FjaGVhYmxlIEJGRCBhbmQgY2xvc2UgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY2xvc2Vfb25lICgpCi17Ci0gIHJlZ2lzdGVyIGJmZCAqa2lsbDsKLQotICBpZiAoYmZkX2xhc3RfY2FjaGUgPT0gTlVMTCkKLSAgICBraWxsID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoa2lsbCA9IGJmZF9sYXN0X2NhY2hlLT5scnVfcHJldjsKLQkgICAhIGtpbGwtPmNhY2hlYWJsZTsKLQkgICBraWxsID0ga2lsbC0+bHJ1X3ByZXYpCi0JewotCSAgaWYgKGtpbGwgPT0gYmZkX2xhc3RfY2FjaGUpCi0JICAgIHsKLQkgICAgICBraWxsID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGtpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgbm8gb3BlbiBjYWNoZWFibGUgQkZEJ3MuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGtpbGwtPndoZXJlID0gZnRlbGwgKChGSUxFICopIGtpbGwtPmlvc3RyZWFtKTsKLQotICByZXR1cm4gYmZkX2NhY2hlX2RlbGV0ZSAoa2lsbCk7Ci19Ci0KLS8qIENsb3NlIGEgQkZEIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgY2FjaGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYmZkX2NhY2hlX2RlbGV0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuIHJldDsKLQotICBpZiAoZmNsb3NlICgoRklMRSAqKSBhYmZkLT5pb3N0cmVhbSkgPT0gMCkKLSAgICByZXQgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgIH0KLQotICBzbmlwIChhYmZkKTsKLQotICBhYmZkLT5pb3N0cmVhbSA9IE5VTEw7Ci0gIC0tb3Blbl9maWxlczsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfaW5pdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NhY2hlX2luaXQgKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQWRkIGEgbmV3bHkgb3BlbmVkIEJGRCB0byB0aGUgY2FjaGUuCi0qLwotCi1ib29sZWFuCi1iZmRfY2FjaGVfaW5pdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBCRkRfQVNTRVJUIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKTsKLSAgaWYgKG9wZW5fZmlsZXMgPj0gQkZEX0NBQ0hFX01BWF9PUEVOKQotICAgIHsKLSAgICAgIGlmICghIGNsb3NlX29uZSAoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpbnNlcnQgKGFiZmQpOwotICArK29wZW5fZmlsZXM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfY2xvc2UKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jYWNoZV9jbG9zZSAoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlSZW1vdmUgdGhlIEJGRCBAdmFye2FiZmR9IGZyb20gdGhlIGNhY2hlLiBJZiB0aGUgYXR0YWNoZWQgZmlsZSBpcyBvcGVuLAotCXRoZW4gY2xvc2UgaXQgdG9vLgotCi1SRVRVUk5TCi0JPDxmYWxzZT4+IGlzIHJldHVybmVkIGlmIGNsb3NpbmcgdGhlIGZpbGUgZmFpbHMsIDw8dHJ1ZT4+IGlzCi0JcmV0dXJuZWQgaWYgYWxsIGlzIHdlbGwuCi0qLwotCi1ib29sZWFuCi1iZmRfY2FjaGVfY2xvc2UgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmlvc3RyZWFtID09IE5VTEwKLSAgICAgIHx8IChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGJmZF9jYWNoZV9kZWxldGUgKGFiZmQpOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfb3Blbl9maWxlCi0KLVNZTk9QU0lTCi0JRklMRSogYmZkX29wZW5fZmlsZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCUNhbGwgdGhlIE9TIHRvIG9wZW4gYSBmaWxlIGZvciBAdmFye2FiZmR9LiAgUmV0dXJuIHRoZSA8PEZJTEUgKj4+Ci0JKHBvc3NpYmx5IDw8TlVMTD4+KSB0aGF0IHJlc3VsdHMgZnJvbSB0aGlzIG9wZXJhdGlvbi4gIFNldCB1cCB0aGUKLQlCRkQgc28gdGhhdCBmdXR1cmUgYWNjZXNzZXMga25vdyB0aGUgZmlsZSBpcyBvcGVuLiBJZiB0aGUgPDxGSUxFICo+PgotCXJldHVybmVkIGlzIDw8TlVMTD4+LCB0aGVuIGl0IHdvbid0IGhhdmUgYmVlbiBwdXQgaW4gdGhlCi0JY2FjaGUsIHNvIGl0IHdvbid0IGhhdmUgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0LgotKi8KLQotRklMRSAqCi1iZmRfb3Blbl9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPmNhY2hlYWJsZSA9IHRydWU7CS8qIEFsbG93IGl0IHRvIGJlIGNsb3NlZCBsYXRlci4gKi8KLQotICBpZiAob3Blbl9maWxlcyA+PSBCRkRfQ0FDSEVfTUFYX09QRU4pCi0gICAgewotICAgICAgaWYgKCEgY2xvc2Vfb25lICgpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICBzd2l0Y2ggKGFiZmQtPmRpcmVjdGlvbikKLSAgICB7Ci0gICAgY2FzZSByZWFkX2RpcmVjdGlvbjoKLSAgICBjYXNlIG5vX2RpcmVjdGlvbjoKLSAgICAgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJvdGhfZGlyZWN0aW9uOgotICAgIGNhc2Ugd3JpdGVfZGlyZWN0aW9uOgotICAgICAgaWYgKGFiZmQtPm9wZW5lZF9vbmNlID09IHRydWUpCi0JewotCSAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1JVQik7Ci0JICBpZiAoYWJmZC0+aW9zdHJlYW0gPT0gTlVMTCkKLQkgICAgYWJmZC0+aW9zdHJlYW0gPSAoUFRSKSBmb3BlbiAoYWJmZC0+ZmlsZW5hbWUsIEZPUEVOX1dVQik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENyZWF0ZSB0aGUgZmlsZS4gIFVubGluayBpdCBmaXJzdCwgZm9yIHRoZSBjb252ZW5pZW5jZSBvZgotICAgICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW1zIHdoaWNoIHdvcnJ5IGFib3V0IG92ZXJ3cml0aW5nIHJ1bm5pbmcKLSAgICAgICAgICAgICBiaW5hcmllcy4gICovCi0JICB1bmxpbmsgKGFiZmQtPmZpbGVuYW1lKTsKLQkgIGFiZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGFiZmQtPmZpbGVuYW1lLCBGT1BFTl9XQik7Ci0JICBhYmZkLT5vcGVuZWRfb25jZSA9IHRydWU7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jYWNoZV9pbml0IChhYmZkKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChGSUxFICopIGFiZmQtPmlvc3RyZWFtOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfY2FjaGVfbG9va3VwX3dvcmtlcgotCi1TWU5PUFNJUwotCUZJTEUgKmJmZF9jYWNoZV9sb29rdXBfd29ya2VyKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JQ2FsbGVkIHdoZW4gdGhlIG1hY3JvIDw8YmZkX2NhY2hlX2xvb2t1cD4+IGZhaWxzIHRvIGZpbmQgYQotCXF1aWNrIGFuc3dlci4gIEZpbmQgYSBmaWxlIGRlc2NyaXB0b3IgZm9yIEB2YXJ7YWJmZH0uICBJZgotCW5lY2Vzc2FyeSwgaXQgb3BlbiBpdC4gIElmIHRoZXJlIGFyZSBhbHJlYWR5IG1vcmUgdGhhbgotCTw8QkZEX0NBQ0hFX01BWF9PUEVOPj4gZmlsZXMgb3BlbiwgaXQgdHJpZXMgdG8gY2xvc2Ugb25lIGZpcnN0LCB0bwotCWF2b2lkIHJ1bm5pbmcgb3V0IG9mIGZpbGUgZGVzY3JpcHRvcnMuICAKLSovCi0KLUZJTEUgKgotYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUpIAotICAgIGFiZmQgPSBhYmZkLT5teV9hcmNoaXZlOwotCi0gIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE1vdmUgdGhlIGZpbGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjYWNoZS4gICovCi0gICAgICBpZiAoYWJmZCAhPSBiZmRfbGFzdF9jYWNoZSkKLQl7Ci0JICBzbmlwIChhYmZkKTsKLQkgIGluc2VydCAoYWJmZCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChiZmRfb3Blbl9maWxlIChhYmZkKSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgICAgaWYgKGZzZWVrICgoRklMRSAqKSBhYmZkLT5pb3N0cmVhbSwgYWJmZC0+d2hlcmUsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKEZJTEUgKikgYWJmZC0+aW9zdHJlYW07Ci19CmRpZmYgLS1naXQgYS9iZmQvY2YtaTM4Nmx5bnguYyBiL2JmZC9jZi1pMzg2bHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTE0YmRlLi4wMDAwMDAwCi0tLSBhL2JmZC9jZi1pMzg2bHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBMeW54T1MgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jZGVmaW5lIFRBUkdFVF9TWU0JaTM4Nmx5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtaTM4Ni1seW54IgotCi0jZGVmaW5lIExZTlhPUwotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL2NmLW02OGtseW54LmMgYi9iZmQvY2YtbTY4a2x5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3NGYxYi4uMDAwMDAwMAotLS0gYS9iZmQvY2YtbTY4a2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgTTY4SyBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2x5bnhfY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay1seW54IgotI2RlZmluZSBMWU5YT1MKLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY2Ytc3BhcmNseW54LmMgYi9iZmQvY2Ytc3BhcmNseW54LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NGEwOTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NmLXNwYXJjbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTcGFyYyBDT0ZGIEx5bnhPUyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0Jc3BhcmNseW54X2NvZmZfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLXNwYXJjLWx5bngiCi0KLSNkZWZpbmUgTFlOWE9TCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0jaW5jbHVkZSAiY29mZi1zcGFyYy5jIgpkaWZmIC0tZ2l0IGEvYmZkL2Npc2NvLWNvcmUuYyBiL2JmZC9jaXNjby1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzliYmQuLjAwMDAwMDAKLS0tIGEvYmZkL2Npc2NvLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIENJU0NPIGNyYXNoIGR1bXBzLgotCi1Db3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0vKiBjb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgcmV0dXJucyBhIGhvc3Qgc2lnbmFsICh0aGlzIHByb2JhYmx5IHNob3VsZAotICAgYmUgZml4ZWQpLiAgKi8KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogZm9yIE1TVkMgYnVpbGRzICovCi0jaWZuZGVmIFNJR1RSQVAKLSMgZGVmaW5lIFNJR1RSQVAgNQotI2VuZGlmCi0jaWZuZGVmIFNJR0VNVAotIyBkZWZpbmUgU0lHRU1UIDYKLSNlbmRpZgotI2lmbmRlZiBTSUdCVVMKLSMgZGVmaW5lIFNJR0JVUyAxMAotI2VuZGlmCi0MCi0jZGVmaW5lIENSQVNIX0lORk8gKDB4ZmZjKQotI2RlZmluZSBDUkFTSF9NQUdJQyAweGRlYWQxMjM0Ci0KLXR5cGVkZWYgZW51bSB7Ci0gICAgQ1JBU0hfUkVBU09OX05PVENSQVNIRUQgPSAwLAotICAgIENSQVNIX1JFQVNPTl9FWENFUFRJT04gPSAxLAotICAgIENSQVNIX1JFQVNPTl9DT1JSVVBUID0gMiwKLSAgfSBjcmFzaHJlYXNvbjsKLQotc3RydWN0IGNyYXNoaW5mb19leHRlcm5hbAotewotICBjaGFyIG1hZ2ljWzRdOwkJCS8qIE1hZ2ljIG51bWJlciAqLwotICBjaGFyIHZlcnNpb25bNF07CQkvKiBWZXJzaW9uIG51bWJlciAqLwotICBjaGFyIHJlYXNvbls0XTsJCS8qIENyYXNoIHJlYXNvbiAqLwotICBjaGFyIGNwdV92ZWN0b3JbNF07CQkvKiBDUFUgdmVjdG9yIGZvciBleGNlcHRpb25zICovCi0gIGNoYXIgcmVnaXN0ZXJzWzRdOwkJLyogUG9pbnRlciB0byBzYXZlZCByZWdpc3RlcnMgKi8KLSAgY2hhciByYW1iYXNlWzRdOwkJLyogQmFzZSBvZiBSQU0gKG5vdCBpbiBWMSBjcmFzaCBpbmZvKSAqLwotfTsKLQwKLXN0cnVjdCBjaXNjb19jb3JlX3N0cnVjdAotewotICBpbnQgc2lnOwotfTsKLQwKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWNpc2NvX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgYnVmWzRdOwotICB1bnNpZ25lZCBpbnQgY3Jhc2hpbmZvX29mZnNldDsKLSAgc3RydWN0IGNyYXNoaW5mb19leHRlcm5hbCBjcmFzaGluZm87Ci0gIGludCBucmVhZDsKLSAgdW5zaWduZWQgaW50IHJhbWJhc2U7Ci0gIHNlY19wdHIgYXNlY3Q7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBDUkFTSF9JTkZPLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBucmVhZCA9IGJmZF9yZWFkIChidWYsIDEsIDQsIGFiZmQpOwotICBpZiAobnJlYWQgIT0gNCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGNyYXNoaW5mb19vZmZzZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3Jhc2hpbmZvX29mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbnJlYWQgPSBiZmRfcmVhZCAoJmNyYXNoaW5mbywgMSwgc2l6ZW9mIChjcmFzaGluZm8pLCBhYmZkKTsKLSAgaWYgKG5yZWFkICE9IHNpemVvZiAoY3Jhc2hpbmZvKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zdGF0IChhYmZkLCAmc3RhdGJ1ZikgPCAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5tYWdpYykgIT0gQ1JBU0hfTUFHSUMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgc3dpdGNoIChiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8udmVyc2lvbikpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSAxOgotICAgICAgcmFtYmFzZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMjoKLSAgICAgIHJhbWJhc2UgPSBiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8ucmFtYmFzZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlLiAgKi8KLQotICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEgPQotICAgICgoc3RydWN0IGNpc2NvX2NvcmVfc3RydWN0ICopCi0gICAgIGJmZF96bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjaXNjb19jb3JlX3N0cnVjdCkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHN3aXRjaCAoKGNyYXNocmVhc29uKSBiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8ucmVhc29uKSkKLSAgICB7Ci0gICAgY2FzZSBDUkFTSF9SRUFTT05fTk9UQ1JBU0hFRDoKLSAgICAgIC8qIENyYXNoIGZpbGUgcHJvYmFibHkgY2FtZSBmcm9tIHdyaXRlIGNvcmUuICAqLwotICAgICAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUkFTSF9SRUFTT05fQ09SUlVQVDoKLSAgICAgIC8qIFRoZSBjcmFzaCBjb250ZXh0IGFyZWEgd2FzIGNvcnJ1cHQgLS0gcHJvY2VlZCB3aXRoIGNhdXRpb24uCi0JIFdlIGhhdmUgbm8gd2F5IG9mIHBhc3NpbmcgdGhpcyBpbmZvcm1hdGlvbiBiYWNrIHRvIHRoZSBjYWxsZXIuICAqLwotICAgICAgYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUkFTSF9SRUFTT05fRVhDRVBUSU9OOgotICAgICAgLyogQ3Jhc2ggb2NjdXJlZCBkdWUgdG8gQ1BVIGV4Y2VwdGlvbi4gICovCi0KLSAgICAgIC8qIFRoaXMgaXMgNjhrLXNwZWNpZmljOyBmb3IgTUlQUyB3ZSdsbCBuZWVkIHRvIGludGVycHJldAotCSBjcHVfdmVjdG9yIGRpZmZlcmVudGx5IGJhc2VkIG9uIHRoZSB0YXJnZXQgY29uZmlndXJhdGlvbgotCSAoc2luY2UgQ0lTQ08gY29yZSBmaWxlcyBkb24ndCBzZWVtIHRvIGhhdmUgdGhlIHByb2Nlc3NvcgotCSBlbmNvZGVkIGluIHRoZW0pLiAgKi8KLQotICAgICAgc3dpdGNoIChiZmRfZ2V0XzMyIChhYmZkLCBjcmFzaGluZm8uY3B1X3ZlY3RvcikpCi0JewotCSAgIC8qIGJ1cyBlcnJvciAgICAgICAgICAgKi8KLQljYXNlIDIgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0JVUzsgYnJlYWs7Ci0JICAgLyogYWRkcmVzcyBlcnJvciAgICAgICAqLwotCWNhc2UgMyA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyBicmVhazsKLQkgICAvKiBpbGxlZ2FsIGluc3RydWN0aW9uICovCi0JY2FzZSA0IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdJTEw7ICBicmVhazsKLQkgICAvKiB6ZXJvIGRpdmlkZSAgICAgICAgICovCi0JY2FzZSA1IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgICAvKiBjaGsgaW5zdHJ1Y3Rpb24gICAgICovCi0JY2FzZSA2IDogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7IGJyZWFrOwotCSAgIC8qIHRyYXB2IGluc3RydWN0aW9uICAgKi8KLQljYXNlIDcgOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgYnJlYWs7Ci0JICAgLyogcHJpdmlsZWdlIHZpb2xhdGlvbiAqLwotCWNhc2UgOCA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHU0VHVjsgYnJlYWs7Ci0JICAgLyogdHJhY2UgdHJhcCAgICAgICAgICAqLwotCWNhc2UgOSA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHVFJBUDsgIGJyZWFrOwotCSAgIC8qIGxpbmUgMTAxMCBlbXVsYXRvciAgKi8KLQljYXNlIDEwOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOwotCSAgIC8qIGxpbmUgMTExMSBlbXVsYXRvciAgKi8KLQljYXNlIDExOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lMTDsgIGJyZWFrOwotCi0JICAvKiBDb3Byb2Nlc3NvciBwcm90b2NvbCB2aW9sYXRpb24uICBVc2luZyBhIHN0YW5kYXJkIE1NVSBvciBGUFUKLQkgICAgIHRoaXMgY2Fubm90IGJlIHRyaWdnZXJlZCBieSBzb2Z0d2FyZS4gIENhbGwgaXQgYSBTSUdCVVMuICAqLwotCWNhc2UgMTM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHQlVTOyAgYnJlYWs7Ci0KLQkgIC8qIGludGVycnVwdCAgICAgICAgICAgKi8KLQljYXNlIDMxOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0lOVDsgIGJyZWFrOwotCSAgLyogYnJlYWtwb2ludCAgICAgICAgICAqLwotCWNhc2UgMzM6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHVFJBUDsgIGJyZWFrOwotCi0JICAvKiBmbG9hdGluZyBwb2ludCBlcnIgICovCi0JY2FzZSA0ODogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIGZsb2F0aW5nIHBvaW50IGVyciAgKi8KLQljYXNlIDQ5OiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogemVybyBkaXZpZGUgICAgICAgICAqLwotCWNhc2UgNTA6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JICAvKiB1bmRlcmZsb3cgICAgICAgICAgICovCi0JY2FzZSA1MTogYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWcgPSBTSUdGUEU7ICBicmVhazsKLQkgIC8qIG9wZXJhbmQgZXJyb3IgICAgICAgKi8KLQljYXNlIDUyOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgIC8qIG92ZXJmbG93ICAgICAgICAgICAgKi8KLQljYXNlIDUzOiBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IFNJR0ZQRTsgIGJyZWFrOwotCSAgLyogTkFOICAgICAgICAgICAgICAgICAqLwotCWNhc2UgNTQ6IGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRlBFOyAgYnJlYWs7Ci0JZGVmYXVsdDoKLSNpZm5kZWYgU0lHRU1UCi0jZGVmaW5lIFNJR0VNVCBTSUdUUkFQCi0jZW5kaWYKLQkgIC8qICJzb2Z0d2FyZSBnZW5lcmF0ZWQiKi8KLQkgIGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YS0+c2lnID0gU0lHRU1UOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBVbmtub3duIGNyYXNoIHJlYXNvbi4gICovCi0gICAgICBhYmZkLT50ZGF0YS5jaXNjb19jb3JlX2RhdGEtPnNpZyA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLQotICBhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoYXNlY3QgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgYXNlY3QtPm5hbWUgPSAiLnJlZyI7Ci0gIGFzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIC8qIFRoaXMgY2FuIGJlIGJpZ2dlciB0aGFuIHRoZSByZWFsIHNpemUuICBTZXQgaXQgdG8gdGhlIHNpemUgb2YgdGhlIHdob2xlCi0gICAgIGNvcmUgZmlsZS4gICovCi0gIGFzZWN0LT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIGFzZWN0LT52bWEgPSAwOwotICBhc2VjdC0+ZmlsZXBvcyA9IGJmZF9nZXRfMzIgKGFiZmQsIGNyYXNoaW5mby5yZWdpc3RlcnMpIC0gcmFtYmFzZTsKLSAgYXNlY3QtPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKLSAgYWJmZC0+c2VjdGlvbnMgPSBhc2VjdDsKLSAgKythYmZkLT5zZWN0aW9uX2NvdW50OwotCi0gIC8qIFRoZXJlIGlzIG9ubHkgb25lIHNlY3Rpb24gY29udGFpbmluZyBkYXRhIGZyb20gdGhlIHRhcmdldCBzeXN0ZW0ncyBSQU0uCi0gICAgIFdlIGNhbGwgaXQgLmRhdGEuICAqLwotICBhc2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfem1hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoYXNlY3QgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgYXNlY3QtPm5hbWUgPSAiLmRhdGEiOwotICBhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIC8qIFRoZSBzaXplIG9mIG1lbW9yeSBpcyB0aGUgc2l6ZSBvZiB0aGUgY29yZSBmaWxlIGl0c2VsZi4gICovCi0gIGFzZWN0LT5fcmF3X3NpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIGFzZWN0LT52bWEgPSByYW1iYXNlOwotICBhc2VjdC0+ZmlsZXBvcyA9IDA7Ci0gIGFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0gIGFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0gICsrYWJmZC0+c2VjdGlvbl9jb3VudDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotIGVycm9yX3JldHVybjoKLSAgewotICAgIHNlY19wdHIgbmV4dHNlY3Q7Ci0gICAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdCAhPSBOVUxMOykKLSAgICAgIHsKLQluZXh0c2VjdCA9IGFzZWN0LT5uZXh0OwotCWZyZWUgKGFzZWN0KTsKLQlhc2VjdCA9IG5leHRzZWN0OwotICAgICAgfQotICAgIGZyZWUgKGFiZmQtPnRkYXRhLmNpc2NvX2NvcmVfZGF0YSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotY2hhciAqCi1jaXNjb19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBOVUxMOwotfQotCi1pbnQKLWNpc2NvX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gYWJmZC0+dGRhdGEuY2lzY29fY29yZV9kYXRhLT5zaWc7Ci19Ci0KLWJvb2xlYW4KLWNpc2NvX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLWNvbnN0IGJmZF90YXJnZXQgY2lzY29fY29yZV92ZWMgPQotICB7Ci0gICAgInRyYWQtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgY2lzY29fY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChjaXNjbyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfbm9zeW1ib2xzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICAoUFRSKSAwCQkJLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYTI5ay5jIGIvYmZkL2NvZmYtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmYyM2VlLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLWEyOWsuYworKysgL2Rldi9udWxsCkBAIC0xLDY0MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFNRCAyOTAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdmlkIFdvb2QgYXQgTmV3IFlvcmsgVW5pdmVyc2l0eSA3LzgvOTEuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBMjlLIDEKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvYTI5ay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyBsb25nIGdldF9zeW1ib2xfdmFsdWUgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGEyOWtfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYm9vbGVhbiAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgyKQotCi0jZGVmaW5lIElOU0VSVF9IV09SRChXT1JELEhXT1JEKQlcCi0gICAgKCgoV09SRCkgJiAweGZmMDBmZjAwKSB8ICgoKEhXT1JEKSAmIDB4ZmYwMCkgPDwgOCkgfCAoKEhXT1JEKSYgMHhmZikpCi0jZGVmaW5lIEVYVFJBQ1RfSFdPUkQoV09SRCkgXAotICAgICgoKChXT1JEKSAmIDB4MDBmZjAwMDApID4+IDgpIHwgKChXT1JEKSYgMHhmZikpCi0jZGVmaW5lIFNJR05fRVhURU5EX0hXT1JEKEhXT1JEKSBcCi0gICAgKChIV09SRCkgJiAweDgwMDAgPyAoSFdPUkQpfCh+MHhmZmZmTCkgOiAoSFdPUkQpKQotCi0vKiBQcm92aWRlZCB0aGUgc3ltYm9sLCByZXR1cm5zIHRoZSB2YWx1ZSByZWZmZWQgKi8KLXN0YXRpYyBsb25nCi1nZXRfc3ltYm9sX3ZhbHVlIChzeW1ib2wpICAgICAgIAotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgewotICAgIHJlbG9jYXRpb24gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0gIGVsc2UgCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlICsKLSAgICAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLSAgICAgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICByZXR1cm4ocmVsb2NhdGlvbik7Ci19Ci0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIHBlcmZvcm1pbmcgYWxsIHRoZSAyOWsgcmVsb2NhdGlvbnMgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYTI5a19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIHRoZSBjb25zdGggcmVsb2NhdGlvbiBjb21lcyBpbiB0d28gcGFydHMsIHdlIGhhdmUgdG8gcmVtZW1iZXIKLSAgICAgdGhlIHN0YXRlIGJldHdlZW4gY2FsbHMsIGluIHRoZXNlIHZhcmlhYmxlcyAqLwotICBzdGF0aWMgYm9vbGVhbiBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhcnQxX2NvbnN0aF92YWx1ZTsKLQotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgc3ltX3ZhbHVlOwotICB1bnNpZ25lZCBsb25nIHVuc2lnbmVkX3ZhbHVlOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7Ci0gIGxvbmcgc2lnbmVkX3ZhbHVlOwotCi0gIHVuc2lnbmVkIGxvbmcgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzIDsgLyorIGlucHV0X3NlY3Rpb24tPnZtYSovCi0gIGJmZF9ieXRlICAqaGl0X2RhdGEgPWFkZHIgKyAoYmZkX2J5dGUgKikoZGF0YSk7Ci0JCi0gIHJfdHlwZSA9IHJlbG9jX2VudHJ5LT5ob3d0by0+dHlwZTsKLQotICBpZiAob3V0cHV0X2JmZCkgewotICAgIC8qIFBhcnRpYWwgbGlua2luZyAtIGRvIG5vdGhpbmcgKi8KLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgfQotCi0gIGlmIChzeW1ib2xfaW4gIT0gTlVMTAotICAgICAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICB7Ci0gICAgLyogS2VlcCB0aGUgc3RhdGUgbWFjaGluZSBoYXBweSBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBhZ2FpbiAqLwotICAgIGlmIChyX3R5cGUgPT0gUl9JSElIQUxGKSAKLSAgICB7Ci0gICAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gdHJ1ZTsKLSAgICAgIHBhcnQxX2NvbnN0aF92YWx1ZSAgPSAwOwotICAgIH0KLSAgICByZXR1cm4oYmZkX3JlbG9jX3VuZGVmaW5lZCk7Ci0gIH0KLQotICBpZiAoKHBhcnQxX2NvbnN0aF9hY3RpdmUpICYmIChyX3R5cGUgIT0gUl9JSENPTlNUKSkgCi0gIHsKLSAgICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBfKCJNaXNzaW5nIElIQ09OU1QiKTsKLSAgICByZXR1cm4oYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gIH0KLQotCi0gIHN5bV92YWx1ZSA9IGdldF9zeW1ib2xfdmFsdWUoc3ltYm9sX2luKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkgCi0gIHsKLSAgIGNhc2UgUl9JUkVMOiAJCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBUYWtlIHRoZSB2YWx1ZSBpbiB0aGUgZmllbGQgYW5kIHNpZ24gZXh0ZW5kIGl0ICovCi0gICAgc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRChpbnNuKTsKLSAgICBzaWduZWRfdmFsdWUgPSBTSUdOX0VYVEVORF9IV09SRChzaWduZWRfdmFsdWUpOwotICAgIHNpZ25lZF92YWx1ZSA8PD0gMjsKLQotICAgIC8qIFNlZSB0aGUgbm90ZSBvbiB0aGUgUl9JUkVMIHJlbG9jIGluIGNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgICBpZiAoc2lnbmVkX3ZhbHVlID09IC0gKGxvbmcpIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotICAgICAgc2lnbmVkX3ZhbHVlID0gMDsKLQotICAgIHNpZ25lZF92YWx1ZSArPSBzeW1fdmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgIGlmICgoc2lnbmVkX3ZhbHVlICYgfjB4M2ZmZmYpID09IDApCi0gICAgewkJCQkvKiBBYnNvbHV0ZSBqbXAvY2FsbCAqLwotICAgICAgaW5zbiB8PSAoMTw8MjQpOwkJLyogTWFrZSBpdCBhYnNvbHV0ZSAqLwotICAgICAgLyogRklYTUU6IFNob3VsZCB3ZSBjaGFuZ2Ugcl90eXBlIHRvIFJfSUFCUyAqLwotICAgIH0gCi0gICAgZWxzZSAKLSAgICB7Ci0gICAgICAvKiBSZWxhdGl2ZSBqbXAvY2FsbCwgc28gc3VidHJhY3QgZnJvbSB0aGUgdmFsdWUgdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHBsYWNlIHdlJ3JlIGNvbWluZyBmcm9tICovCi0gICAgICBzaWduZWRfdmFsdWUgLT0gKHJlbG9jX2VudHJ5LT5hZGRyZXNzCi0JCSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoc2lnbmVkX3ZhbHVlPjB4MWZmZmYgfHwgc2lnbmVkX3ZhbHVlPC0weDIwMDAwKSAKLSAgICAgICByZXR1cm4oYmZkX3JlbG9jX292ZXJmbG93KTsKLSAgICB9Ci0gICAgc2lnbmVkX3ZhbHVlID4+PSAyOwotICAgIGluc24gPSBJTlNFUlRfSFdPUkQoaW5zbiwgc2lnbmVkX3ZhbHVlKTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24gLGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUxPSEFMRjogCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICB1bnNpZ25lZF92YWx1ZSA9IEVYVFJBQ1RfSFdPUkQoaW5zbik7Ci0gICAgdW5zaWduZWRfdmFsdWUgKz0gIHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgaW5zbiA9IElOU0VSVF9IV09SRChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0gICAgYmZkX3B1dF8zMihhYmZkLCBpbnNuLCBoaXRfZGF0YSk7IAotICAgIGJyZWFrOwotICAgY2FzZSBSX0lISUhBTEY6Ci0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBjb25zdGgsIHBhcnQgMSAKLSAgICAgICBKdXN0IGdldCB0aGUgc3ltYm9sIHZhbHVlIHRoYXQgaXMgcmVmZXJlbmNlZCAqLwotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSB0cnVlOwotICAgIHBhcnQxX2NvbnN0aF92YWx1ZSA9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgLyogRG9uJ3QgbW9kaWZ5IGluc24gdW50aWwgUl9JSENPTlNUICovCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfSUhDT05TVDoJCi0gICAgaW5zbiA9IGJmZF9nZXRfMzIoYWJmZCwgaGl0X2RhdGEpOyAKLSAgICAvKiBjb25zdGgsIHBhcnQgMiAKLSAgICAgICBOb3cgcmVsb2NhdGUgdGhlIHJlZmVyZW5jZSAqLwotICAgIGlmIChwYXJ0MV9jb25zdGhfYWN0aXZlID09IGZhbHNlKSB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIk1pc3NpbmcgSUhJSEFMRiIpOwotICAgICAgcmV0dXJuKGJmZF9yZWxvY19kYW5nZXJvdXMpOwotICAgIH0KLSAgICAvKiBzeW1fcHRyX3B0ciA9IHJfc3ltbmR4LCBpbiBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlKCkgKi8KLSAgICB1bnNpZ25lZF92YWx1ZSA9IDA7CQkvKkVYVFJBQ1RfSFdPUkQoaW5zbikgPDwgMTY7Ki8KLSAgICB1bnNpZ25lZF92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOyAvKiByX3N5bW5keCAqLwotICAgIHVuc2lnbmVkX3ZhbHVlICs9IHBhcnQxX2NvbnN0aF92YWx1ZTsKLSAgICB1bnNpZ25lZF92YWx1ZSA9IHVuc2lnbmVkX3ZhbHVlID4+IDE2OwotICAgIGluc24gPSBJTlNFUlRfSFdPUkQoaW5zbiwgdW5zaWduZWRfdmFsdWUpOwotICAgIHBhcnQxX2NvbnN0aF9hY3RpdmUgPSBmYWxzZTsKLSAgICBiZmRfcHV0XzMyKGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfQllURToKLSAgICBpbnNuID0gYmZkX2dldF84KGFiZmQsIGhpdF9kYXRhKTsgCi0gICAgdW5zaWduZWRfdmFsdWUgPSBpbnNuICsgc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsJCi0gICAgaWYgKHVuc2lnbmVkX3ZhbHVlICYgMHhmZmZmZmYwMCkKLSAgICAgIHJldHVybihiZmRfcmVsb2Nfb3ZlcmZsb3cpOwotICAgIGJmZF9wdXRfOChhYmZkLCB1bnNpZ25lZF92YWx1ZSwgaGl0X2RhdGEpOyAKLSAgICBicmVhazsKLSAgIGNhc2UgUl9IV09SRDoKLSAgICBpbnNuID0gYmZkX2dldF8xNihhYmZkLCBoaXRfZGF0YSk7IAotICAgIHVuc2lnbmVkX3ZhbHVlID0gaW5zbiArIHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7CQotICAgIGlmICh1bnNpZ25lZF92YWx1ZSAmIDB4ZmZmZjAwMDApCi0gICAgICByZXR1cm4oYmZkX3JlbG9jX292ZXJmbG93KTsKLSAgICBiZmRfcHV0XzE2KGFiZmQsIGluc24sIGhpdF9kYXRhKTsgCi0gICAgYnJlYWs7Ci0gICBjYXNlIFJfV09SRDoKLSAgICBpbnNuID0gYmZkX2dldF8zMihhYmZkLCBoaXRfZGF0YSk7IAotICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsgIAotICAgIGJmZF9wdXRfMzIoYWJmZCwgaW5zbiwgaGl0X2RhdGEpOwotICAgIGJyZWFrOwotICAgZGVmYXVsdDoKLSAgICAqZXJyb3JfbWVzc2FnZSA9IF8oIlVucmVjb2duaXplZCByZWxvYyIpOwotICAgIHJldHVybiAoYmZkX3JlbG9jX2Rhbmdlcm91cyk7Ci0gIH0KLQotCi0gIHJldHVybihiZmRfcmVsb2Nfb2spOwkKLX0KLQotLyogICAgICB0eXBlCSAgIHJpZ2h0c2hpZnQKLQkJICAgICAgIHNpemUKLQkJCSAgYml0c2l6ZQotCQkJICAgICAgIHBjLXJlbGF0aXZlCi0JCQkJICAgICBiaXRwb3MKLQkJCQkJIGFic29sdXRlCi0JCQkJCSAgICAgY29tcGxhaW5fb25fb3ZlcmZsb3cKLQkJCQkJCSAgc3BlY2lhbF9mdW5jdGlvbgotCQkJCQkJICAgIHJlbG9jYXRpb24gbmFtZQotCQkJCQkJCSAgICAgICBwYXJ0aWFsX2lucGxhY2UgCi0JCQkJCQkJCSAgICAgIHNyY19tYXNrCi0qLwotCi0vKkZJWE1FOiBJJ20gbm90IHJlYWwgc3VyZSBhYm91dCB0aGlzIHRhYmxlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gCi17Ci0gIHtSX0FCUywgICAgIDAsIDMsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYTI5a19yZWxvYywiQUJTIiwgICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2V9LAotICB7MX0sICB7Mn0sICB7M30sICAgezR9LCAgezV9LCAgezZ9LCAgezd9LCAgezh9LCAgezl9LCB7MTB9LAotICB7MTF9LCB7MTJ9LCB7MTN9LCB7MTR9LCB7MTV9LCB7MTZ9LCB7MTd9LCB7MTh9LCB7MTl9LCB7MjB9LAotICB7MjF9LCB7MjJ9LCB7MjN9LAotICB7Ul9JUkVMLCAgICAwLCAzLCAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCxhMjlrX3JlbG9jLCJJUkVMIiwgICAgdHJ1ZSwgMHhmZmZmZmZmZiwweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtSX0lBQlMsICAgIDAsIDMsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIklBQlMiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLSAge1JfSUxPSEFMRiwgMCwgMywgMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIGEyOWtfcmVsb2MsIklMT0hBTEYiLCB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge1JfSUhJSEFMRiwgMCwgMywgMTYsIHRydWUsICAxNiwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBhMjlrX3JlbG9jLCJJSElIQUxGIiwgdHJ1ZSwgMHhmZmZmMDAwMCwweGZmZmYwMDAwLCBmYWxzZX0sCi0gIHtSX0lIQ09OU1QsIDAsIDMsIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBhMjlrX3JlbG9jLCJJSENPTlNUIiwgdHJ1ZSwgMHhmZmZmMDAwMCwweGZmZmYwMDAwLCBmYWxzZX0sCi0gIHtSX0JZVEUsICAgIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYTI5a19yZWxvYywiQllURSIsICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2V9LAotICB7Ul9IV09SRCwgICAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBhMjlrX3JlbG9jLCJIV09SRCIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtSX1dPUkQsICAgIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGEyOWtfcmVsb2MsIldPUkQiLCAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlfSwKLX07Ci0KLSNkZWZpbmUgQkFETUFHKHgpIEEyOUtCQURNQUcoeCkKLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQscmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gICAgc3RhdGljIGJmZF92bWEgaWhpaGFsZl92YWRkciA9IChiZmRfdm1hKSAtMTsKLQotICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwkJCi0gICAgcmVsZW50LT5ob3d0byA9IGhvd3RvX3RhYmxlICsgcmVsb2MtPnJfdHlwZTsKLSAgICBpZiAocmVsb2MtPnJfdHlwZSA9PSBSX0lIQ09OU1QpIAotICAgIHsJCQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gUl9JSENPTlNUIHNob3VsZCBhbHdheXMgYmUgdGhlIGFkZHJlc3Mgb2YKLQkgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyBSX0lISUhBTEYuICByZWxvY3MgZ2VuZXJhdGVkIGJ5IGdhcwotCSBhcmUgY29ycmVjdCwgYnV0IHJlbG9jcyBnZW5lcmF0ZWQgYnkgSGlnaCBDIGFyZSBkaWZmZXJlbnQgKEkKLQkgY2FuJ3QgZmlndXJlIG91dCB3aGF0IHRoZSBhZGRyZXNzIG1lYW5zIGZvciBIaWdoIEMpLiAgV2UgY2FuCi0JIGhhbmRsZSBib3RoIGdhcyBhbmQgSGlnaCBDIGJ5IGlnbm9yaW5nIHRoZSBhZGRyZXNzIGhlcmUsIGFuZAotCSBzaW1wbHkgcmV1c2luZyB0aGUgYWRkcmVzcyBzYXZlZCBmb3IgUl9JSElIQUxGLiAgKi8KLSAgICAgICAgaWYgKGloaWhhbGZfdmFkZHIgPT0gKGJmZF92bWEpIC0xKQotCSAgYWJvcnQgKCk7Ci0JcmVsZW50LT5hZGRyZXNzID0gaWhpaGFsZl92YWRkcjsKLQlpaGloYWxmX3ZhZGRyID0gKGJmZF92bWEpIC0xOwotCXJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfc3ltbmR4OwkJCi0JcmVsZW50LT5zeW1fcHRyX3B0cj0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICAgIGVsc2UgCi0gICAgewotICAgICAgYXN5bWJvbCAqcHRyOwotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotCi0gICAgICBwdHIgPSAqKHJlbGVudC0+c3ltX3B0cl9wdHIpOwotCi0gICAgICBpZiAocHRyIAotCSAgJiYgYmZkX2FzeW1ib2xfYmZkKHB0cikgPT0gYWJmZAkJCi0KLQkgICYmICgocHRyLT5mbGFncyAmIEJTRl9PTERfQ09NTU9OKT09IDApKQkKLSAgICAgIHsJCQkJCQkKLQkgIHJlbGVudC0+YWRkZW5kID0gMDsKLSAgICAgIH0JCQkJCQkKLSAgICAgIGVsc2UKLSAgICAgIHsJCQkJCQotCSAgcmVsZW50LT5hZGRlbmQgPSAwOwkJCQotICAgICAgfQkJCQotICAgICAgcmVsZW50LT5hZGRyZXNzLT0gc2VjdGlvbi0+dm1hOwotICAgICAgaWYgKHJlbG9jLT5yX3R5cGUgPT0gUl9JSElIQUxGKQotCWloaWhhbGZfdmFkZHIgPSByZWxlbnQtPmFkZHJlc3M7Ci0gICAgICBlbHNlIGlmIChpaGloYWxmX3ZhZGRyICE9IChiZmRfdm1hKSAtMSkKLQlhYm9ydCAoKTsKLSAgfQotfQotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYTI5a19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotICBib29sZWFuIGhpaGFsZjsKLSAgYmZkX3ZtYSBoaWhhbGZfdmFsOwotCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoaWhhbGYgPSBmYWxzZTsKLSAgaGloYWxmX3ZhbCA9IDA7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBiZmRfYnl0ZSAqbG9jOwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgIGxvbmcgc2lnbmVkX3ZhbHVlOwotICAgICAgdW5zaWduZWQgbG9uZyB1bnNpZ25lZF92YWx1ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLSAgICAgIGxvYyA9IGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xIHx8IHJlbC0+cl90eXBlID09IFJfSUhDT05TVCkKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCi0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIC8qIEFuIFJfSUhDT05TVCByZWxvYyBkb2VzIG5vdCBoYXZlIGEgc3ltYm9sLiAgSW5zdGVhZCwgdGhlCi0gICAgICAgICBzeW1ib2wgaW5kZXggaXMgYW4gYWRkZW5kLiAgUl9JSENPTlNUIGlzIGFsd2F5cyB1c2VkIGluCi0gICAgICAgICBjb25qdW5jdGlvbiB3aXRoIFJfSUhIQUxGLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSAhPSBSX0lIQ09OU1QpCi0JewotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JCXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQkJICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotCQkgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICsgc3ltLT5uX3ZhbHVlCi0JCQkgLSBzZWMtPnZtYSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQl7Ci0JCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIHZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaGloYWxmKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGluZm8sIF8oIm1pc3NpbmcgSUhDT05TVCByZWxvYyIpLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaGloYWxmID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG92ZXJmbG93ID0gZmFsc2U7Ci0KLSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQotCWNhc2UgUl9JUkVMOgotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jKTsKLQotCSAgLyogRXh0cmFjdCB0aGUgYWRkZW5kLiAgKi8KLQkgIHNpZ25lZF92YWx1ZSA9IEVYVFJBQ1RfSFdPUkQgKGluc24pOwotCSAgc2lnbmVkX3ZhbHVlID0gU0lHTl9FWFRFTkRfSFdPUkQgKHNpZ25lZF92YWx1ZSk7Ci0JICBzaWduZWRfdmFsdWUgPDw9IDI7Ci0KLQkgIC8qIFVuZm9ydHVuYXRlbHksIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHZlcnNpb25zIG9mIENPRkYKLQkgICAgIGEyOWsuICBJbiB0aGUgb3JpZ2luYWwgQU1EIHZlcnNpb24sIHRoZSB2YWx1ZSBzdG9yZWQgaW4KLQkgICAgIHRoZSBmaWVsZCBmb3IgdGhlIFJfSVJFTCByZWxvYyBpcyBhIHNpbXBsZSBhZGRlbmQuICBJbgotCSAgICAgdGhlIEdOVSB2ZXJzaW9uLCB0aGUgdmFsdWUgaXMgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzCi0JICAgICBvZiB0aGUgcmVsb2Mgd2l0aGluIHNlY3Rpb24uICBXZSB0cnkgdG8gY29wZSBoZXJlIGJ5Ci0JICAgICBhc3N1bWluZyB0aGUgQU1EIHZlcnNpb24sIHVubGVzcyB0aGUgYWRkZW5kIGlzIGV4YWN0bHkKLQkgICAgIHRoZSBuZWdhdGl2ZSBvZiB0aGUgYWRkcmVzczsgaW4gdGhlIGxhdHRlciBjYXNlIHdlIGFzc3VtZQotCSAgICAgdGhlIEdOVSB2ZXJzaW9uLiAgVGhpcyBtZWFucyB0aGF0IHNvbWV0aGluZyBsaWtlCi0JICAgICAgICAgLnRleHQKLQkJIG5vcAotCQkgam1wIGktNAotCSAgICAgd2lsbCBmYWlsLCBiZWNhdXNlIHRoZSBhZGRlbmQgb2YgLTQgd2lsbCBoYXBwZW4gdG8gZXF1YWwKLQkgICAgIHRoZSBuZWdhdGl2ZSBvZiB0aGUgYWRkcmVzcyB3aXRoaW4gdGhlIHNlY3Rpb24uICBUaGUKLQkgICAgIGNvbXBpbGVyIHdpbGwgbmV2ZXIgZ2VuZXJhdGUgY29kZSBsaWtlIHRoaXMuCi0KLQkgICAgIEF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSB3ZSBtYXkgd2FudCB0byB0YWtlIG91dCB0aGlzCi0JICAgICBjaGVjay4gICovCi0KLQkgIGlmIChzaWduZWRfdmFsdWUgPT0gLSAobG9uZykgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpCi0JICAgIHNpZ25lZF92YWx1ZSA9IDA7Ci0KLQkgIC8qIERldGVybWluZSB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGp1bXAuICAqLwotCSAgc2lnbmVkX3ZhbHVlICs9IHZhbDsKLQotCSAgaWYgKChzaWduZWRfdmFsdWUgJiB+MHgzZmZmZikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiB1c2UgYW4gYWJzb2x1dGUganVtcC4gICovCi0JICAgICAgaW5zbiB8PSAoMSA8PCAyNCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIE1ha2UgdGhlIGRlc3RpbmF0aW9uIFBDIHJlbGF0aXZlLiAgKi8KLQkgICAgICBzaWduZWRfdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICArIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgICBpZiAoc2lnbmVkX3ZhbHVlID4gMHgxZmZmZiB8fCBzaWduZWRfdmFsdWUgPCAtIDB4MjAwMDApCi0JCXsKLQkJICBvdmVyZmxvdyA9IHRydWU7Ci0JCSAgc2lnbmVkX3ZhbHVlID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFB1dCB0aGUgYWRqdXN0ZWQgdmFsdWUgYmFjayBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICBzaWduZWRfdmFsdWUgPj49IDI7Ci0JICBpbnNuID0gSU5TRVJUX0hXT1JEIChpbnNuLCBzaWduZWRfdmFsdWUpOwotCi0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuLCBsb2MpOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9JTE9IQUxGOgotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jKTsKLQkgIHVuc2lnbmVkX3ZhbHVlID0gRVhUUkFDVF9IV09SRCAoaW5zbik7Ci0JICB1bnNpZ25lZF92YWx1ZSArPSB2YWw7Ci0JICBpbnNuID0gSU5TRVJUX0hXT1JEIChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGxvYyk7Ci0JICBicmVhazsKLQotCWNhc2UgUl9JSElIQUxGOgotCSAgLyogU2F2ZSB0aGUgdmFsdWUgZm9yIHRoZSBSX0lIQ09OU1QgcmVsb2MuICAqLwotCSAgaGloYWxmID0gdHJ1ZTsKLQkgIGhpaGFsZl92YWwgPSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgUl9JSENPTlNUOgotCSAgaWYgKCEgaGloYWxmKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGluZm8sIF8oIm1pc3NpbmcgSUhJSEFMRiByZWxvYyIpLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaGloYWxmX3ZhbCA9IDA7Ci0JICAgIH0KLQotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jKTsKLQkgIHVuc2lnbmVkX3ZhbHVlID0gcmVsLT5yX3N5bW5keCArIGhpaGFsZl92YWw7Ci0JICB1bnNpZ25lZF92YWx1ZSA+Pj0gMTY7Ci0JICBpbnNuID0gSU5TRVJUX0hXT1JEIChpbnNuLCB1bnNpZ25lZF92YWx1ZSk7Ci0JICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuLCBsb2MpOwotCi0JICBoaWhhbGYgPSBmYWxzZTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQllURToKLQljYXNlIFJfSFdPUkQ6Ci0JY2FzZSBSX1dPUkQ6Ci0JICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvX3RhYmxlICsgcmVsLT5yX3R5cGUsCi0JCQkJCSAgaW5wdXRfYmZkLCB2YWwsIGxvYyk7Ci0JICBpZiAocnN0YXQgPT0gYmZkX3JlbG9jX292ZXJmbG93KQotCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICBlbHNlIGlmIChyc3RhdCAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAob3ZlcmZsb3cpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UgaWYgKHN5bSA9PSBOVUxMKQotCSAgICBuYW1lID0gIip1bmtub3duKiI7Ci0JICBlbHNlIGlmIChzeW0tPl9uLl9uX24uX25femVyb2VzID09IDAKLQkJICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCSAgICBuYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCSAgICAgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCSAgICAgIG5hbWUgPSBidWY7Ci0JICAgIH0KLQotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChpbmZvLCBuYW1lLCBob3d0b190YWJsZVtyZWwtPnJfdHlwZV0ubmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0gICAgIAotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBjb2ZmX2EyOWtfcmVsb2NhdGVfc2VjdGlvbgotCi0vKiBXZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc3ltbmR4IG9mIGEgUl9JSENPTlNUIHJlbG9jLCBzaW5jZSBpdAotICAgaXMgYWN0dWFsbHkgYW4gYWRkZW5kLCBub3QgYSBzeW1ib2wgaW5kZXggYXQgYWxsLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hMjlrX2FkanVzdF9zeW1uZHggKG9iZmQsIGluZm8sIGliZmQsIHNlYywgaXJlbCwgYWRqdXN0ZWRwKQotICAgICBiZmQgKm9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwOwotewotICBpZiAoaXJlbC0+cl90eXBlID09IFJfSUhDT05TVCkKLSAgICAqYWRqdXN0ZWRwID0gdHJ1ZTsKLSAgZWxzZQotICAgICphZGp1c3RlZHAgPSBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4IGNvZmZfYTI5a19hZGp1c3Rfc3ltbmR4Ci0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1jb25zdCBiZmRfdGFyZ2V0IGEyOWtjb2ZmX2JpZ192ZWMgPQotewotICAiY29mZi1hMjlrLWJpZyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DICAKLSAgIHwgU0VDX1JFQURPTkxZICksCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsICAgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotICAvKiBoZHJzICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCAgIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotIHsKLQkgICAgCi0gICBfYmZkX2R1bW15X3RhcmdldCwKLSAgIGNvZmZfb2JqZWN0X3AsCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldAotICB9LAotIHsKLSAgIGJmZF9mYWxzZSwKLSAgIGNvZmZfbWtvYmplY3QsCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgYmZkX2ZhbHNlCi0gIH0sCi0gewotICAgYmZkX2ZhbHNlLAotICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICBiZmRfZmFsc2UKLSAgfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRQotIH07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1hbHBoYS5jIGIvYmZkL2NvZmYtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0MTY2My4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwMiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFMUEhBIEV4dGVuZGVkLUNvZmYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIE1vZGlmaWVkIGZyb20gY29mZi1taXBzLmMgYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPiBhbmQKLSAgIElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9hbHBoYS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0jaW5jbHVkZSAibGliZWNvZmYuaCIKLQwKLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqYWxwaGFfZWNvZmZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGFscGhhX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIFBUUiBmaWxlaGRyKSk7Ci1zdGF0aWMgUFRSIGFscGhhX2Vjb2ZmX21rb2JqZWN0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiBmaWxlaGRyLCBQVFIgYW91dGhkcikpOwotc3RhdGljIHZvaWQgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLAotCQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIHZvaWQgYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19vdXQgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJICAgICAgIFBUUikpOwotc3RhdGljIHZvaWQgYWxwaGFfYWRqdXN0X3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJICAgYXJlbGVudCAqKSk7Ci1zdGF0aWMgdm9pZCBhbHBoYV9hZGp1c3RfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJCSAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAotIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBiZmRfYnl0ZSAqYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKmRhdGEsIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGJmZF92bWEgYWxwaGFfY29udmVydF9leHRlcm5hbF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqLAotCSAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gYWxwaGFfcmVsb2NhdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICAgYmZkX2J5dGUgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBhbHBoYV9hZGp1c3RfaGVhZGVycwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKiwgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOwotc3RhdGljIFBUUiBhbHBoYV9lY29mZl9yZWFkX2FyX2hkciBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZCAqYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0cikpOwotc3RhdGljIGJmZCAqYWxwaGFfZWNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJmZCAqYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLQwKLS8qIEVDT0ZGIGhhcyBDT0ZGIHNlY3Rpb25zLCBidXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4KLSAgIGEgY29tcGxldGVseSBkaWZmZXJlbnQgZm9ybWF0LiAgRUNPRkYgdGFyZ2V0cyB1c2Ugc29tZSBvZiB0aGUKLSAgIHN3YXBwaW5nIHJvdXRpbmVzIGZyb20gY29mZnN3YXAuaCwgYW5kIHNvbWUgb2YgdGhlIGdlbmVyaWMgQ09GRgotICAgcm91dGluZXMgaW4gY29mZmdlbi5jLCBidXQsIHVubGlrZSB0aGUgcmVhbCBDT0ZGIHRhcmdldHMsIGRvIG5vdAotICAgdXNlIGNvZmZjb2RlLmggaXRzZWxmLgotCi0gICBHZXQgdGhlIGdlbmVyaWMgQ09GRiBzd2FwcGluZyByb3V0aW5lcywgZXhjZXB0IGZvciB0aGUgcmVsb2MsCi0gICBzeW1ib2wsIGFuZCBsaW5lbm8gb25lcy4gIEdpdmUgdGhlbSBlY29mZiBuYW1lcy4gIERlZmluZSBzb21lCi0gICBhY2Nlc3NvciBtYWNyb3MgZm9yIHRoZSBsYXJnZSBzaXplcyB1c2VkIGZvciBBbHBoYSBFQ09GRi4gICovCi0KLSNkZWZpbmUgR0VUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX1RTSVpFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9UU0laRSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfRFNJWkUgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9BT1VUSERSX0RTSVpFIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfQU9VVEhEUl9CU0laRSBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfQlNJWkUgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9BT1VUSERSX0VOVFJZIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9QQUREUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9QQUREUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9WQUREUiBiZmRfaF9nZXRfNjQKLSNkZWZpbmUgUFVUX1NDTkhEUl9WQUREUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9TSVpFIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1NJWkUgYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIEdFVF9TQ05IRFJfU0NOUFRSIGJmZF9oX2dldF82NAotI2RlZmluZSBQVVRfU0NOSERSX1NDTlBUUiBiZmRfaF9wdXRfNjQKLSNkZWZpbmUgR0VUX1NDTkhEUl9SRUxQVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfUkVMUFRSIGJmZF9oX3B1dF82NAotI2RlZmluZSBHRVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIFBVVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9wdXRfNjQKLQotI2RlZmluZSBBTFBIQUVDT0ZGCi0KLSNkZWZpbmUgTk9fQ09GRl9SRUxPQ1MKLSNkZWZpbmUgTk9fQ09GRl9TWU1CT0xTCi0jZGVmaW5lIE5PX0NPRkZfTElORU5PUwotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBhbHBoYV9lY29mZl9zd2FwX2ZpbGVoZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX2FvdXRoZHJfaW4gYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX291dCBhbHBoYV9lY29mZl9zd2FwX2FvdXRoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfaW4gYWxwaGFfZWNvZmZfc3dhcF9zY25oZHJfaW4KLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9vdXQgYWxwaGFfZWNvZmZfc3dhcF9zY25oZHJfb3V0Ci0jaW5jbHVkZSAiY29mZnN3YXAuaCIKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gICovCi0jZGVmaW5lIEVDT0ZGXzY0Ci0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0MCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvYyB0eXBlcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXJlbG9jX25pbCBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmVsb2NfbmlsIChhYmZkLCByZWxvYywgc3ltLCBkYXRhLCBzZWMsIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhbHBoYV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQgYnkgaXRzZWxmLiAgSG93ZXZlciwgaXQgYXBwZWFycyBhZnRlciBhCi0gICAgIEdQRElTUCByZWxvYyB0byBpZGVudGlmeSB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGxvdyBvcmRlciAxNiBiaXRzCi0gICAgIG9mIHRoZSBncCByZWdpc3RlciBhcmUgbG9hZGVkLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfSUdOT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJR05PUkUiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZMT05HIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDY0IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wuICAqLwotICBIT1dUTyAoQUxQSEFfUl9SRUZRVUFELAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBHUCByZWxhdGl2ZSBvZmZzZXQuICBUaGlzIGlzIGp1c3QgbGlrZSBSRUZMT05HIGV4Y2VwdAotICAgICB0aGF0IHdoZW4gdGhlIHZhbHVlIGlzIHVzZWQgdGhlIHZhbHVlIG9mIHRoZSBncCByZWdpc3RlciB3aWxsIGJlCi0gICAgIGFkZGVkIGluLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTDMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBVc2VkIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlZmVycyB0byBtZW1vcnkgb2ZmIHRoZSBHUAotICAgICByZWdpc3Rlci4gIFRoZSBvZmZzZXQgaXMgMTYgYml0cyBvZiB0aGUgMzIgYml0IGluc3RydWN0aW9uLiAgVGhpcwotICAgICByZWxvYyBhbHdheXMgc2VlbXMgdG8gYmUgYWdhaW5zdCB0aGUgLmxpdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkxJVEVSQUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIG9ubHkgYXBwZWFycyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYSBMSVRFUkFMIHJlbG9jLgotICAgICBJdCBpZGVudGlmaWVzIGEgdXNlIG9mIHRoZSBsaXRlcmFsLiAgSXQgc2VlbXMgdGhhdCB0aGUgbGlua2VyIGNhbgotICAgICB1c2UgdGhpcyB0byBlbGltaW5hdGUgYSBwb3J0aW9uIG9mIHRoZSAubGl0YSBzZWN0aW9uLiAgVGhlIHN5bWJvbAotICAgICBpbmRleCBpcyBzcGVjaWFsOiAxIG1lYW5zIHRoZSBsaXRlcmFsIGFkZHJlc3MgaXMgaW4gdGhlIGJhc2UKLSAgICAgcmVnaXN0ZXIgb2YgYSBtZW1vcnkgZm9ybWF0IGluc3RydWN0aW9uOyAyIG1lYW5zIHRoZSBsaXRlcmFsCi0gICAgIGFkZHJlc3MgaXMgaW4gdGhlIGJ5dGUgb2Zmc2V0IHJlZ2lzdGVyIG9mIGEgYnl0ZS1tYW5pcHVsYXRpb24KLSAgICAgaW5zdHJ1Y3Rpb247IDMgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgdGFyZ2V0Ci0gICAgIHJlZ2lzdGVyIG9mIGEganNyIGluc3RydWN0aW9uLiAgVGhpcyBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnkKLSAgICAgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0xJVFVTRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRVU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvYWQgdGhlIGdwIHJlZ2lzdGVyLiAgVGhpcyBpcyBhbHdheXMgdXNlZCBmb3IgYSBsZGFoIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIGxvYWRzIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSBncCByZWdpc3Rlci4gIFRoZSBuZXh0IHJlbG9jCi0gICAgIHdpbGwgYmUgYW4gSUdOT1JFIHJlbG9jIHdoaWNoIGlkZW50aWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBsZGEKLSAgICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbG9hZHMgdGhlIGxvd2VyIDE2IGJpdHMuICBUaGUgc3ltYm9sIGluZGV4IG9mCi0gICAgIHRoZSBHUERJU1AgaW5zdHJ1Y3Rpb24gYXBwZWFycyB0byBhY3R1YWxseSBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi0gICAgIGJldHdlZW4gdGhlIGxkYWggYW5kIGxkYSBpbnN0cnVjdGlvbnMuICBUaGlzIGdpdmVzIHR3byBkaWZmZXJlbnQKLSAgICAgd2F5cyB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIGxkYSBpbnN0cnVjdGlvbiBpczsgSSBkb24ndCBrbm93IHdoeQotICAgICBib3RoIGFyZSB1c2VkLiAgVGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIHJlbG9jYXRpb24gaXMgdGhlCi0gICAgIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgR1AgdmFsdWUgYW5kIHRoZSBjdXJyZW50IGxvY2F0aW9uOyB0aGUKLSAgICAgbG9hZCB3aWxsIGFsd2F5cyBiZSBkb25lIGFnYWluc3QgYSByZWdpc3RlciBob2xkaW5nIHRoZSBjdXJyZW50Ci0gICAgIGFkZHJlc3MuICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUERJU1AsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BESVNQIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyMSBiaXQgYnJhbmNoLiAgVGhlIG5hdGl2ZSBhc3NlbWJsZXIgZ2VuZXJhdGVzIHRoZXNlIGZvcgotICAgICBicmFuY2hlcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYW5kIGFsc28gZmlsbHMgaW4gdGhlIFBDCi0gICAgIHJlbGF0aXZlIG9mZnNldCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBIT1dUTyAoQUxQSEFfUl9CUkFERFIsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIxLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSElOVCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMNjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBQdXNoIGEgdmFsdWUgb24gdGhlIHJlbG9jIGV2YWx1YXRpb24gc3RhY2suICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9QVVNILAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QVVNIIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdG9yZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3RhY2sgYXQgdGhlIGdpdmVuIGFkZHJlc3MuICBTdG9yZSBpdCBpbgotICAgICBhIGJpdGZpZWxkIG9mIHNpemUgcl9zaXplIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiByX29mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1NUT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFNVQiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHJlbG9jYXRpb24gc3RhY2sgcmlnaHQgYnkgdGhlCi0gICAgIGdpdmVuIHZhbHVlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFJTSElGVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFJTSElGVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQWRqdXN0IHRoZSBHUCB2YWx1ZSBmb3IgYSBuZXcgcmFuZ2UgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BWQUxVRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BWQUxVRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotDAotLyogUmVjb2duaXplIGFuIEFscGhhIEVDT0ZGIGZpbGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1hbHBoYV9lY29mZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqcmV0OwotCi0gIHJldCA9IGNvZmZfb2JqZWN0X3AgKGFiZmQpOwotCi0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICAvKiBBbHBoYSBFQ09GRiBoYXMgYSAucGRhdGEgc2VjdGlvbi4gIFRoZSBsbm5vcHRyIGZpZWxkIG9mIHRoZQotCSAucGRhdGEgc2VjdGlvbiBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaXQgY29udGFpbnMuICBFYWNoCi0JIGVudHJ5IHRha2VzIHVwIDggYnl0ZXMuICBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaXMgcmVxdWlyZWQKLQkgc2luY2UgdGhlIHNlY3Rpb24gaXMgYWxpZ25lZCB0byBhIDE2IGJ5dGUgYm91bmRhcnkuICBXaGVuIHdlCi0JIGxpbmsgLnBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCB3ZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoZQotCSBhbGlnbm1lbnQgYnl0ZXMuICBXZSBoYW5kbGUgdGhpcyBvbiBpbnB1dCBieSBmYWtpbmcgdGhlIHNpemUKLQkgb2YgdGhlIC5wZGF0YSBzZWN0aW9uIHRvIHJlbW92ZSB0aGUgdW53YW50ZWQgYWxpZ25tZW50IGJ5dGVzLgotCSBPbiBvdXRwdXQgd2Ugd2lsbCBzZXQgdGhlIGxubm9wdHIgZmllbGQgYW5kIGZvcmNlIHRoZQotCSBhbGlnbm1lbnQuICAqLwotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIF9QREFUQSk7Ci0gICAgICBpZiAoc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgc2l6ZSA9IHNlYy0+bGluZV9maWxlcG9zICogODsKLQkgIEJGRF9BU1NFUlQgKHNpemUgPT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKQotCQkgICAgICB8fCBzaXplICsgOCA9PSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpKTsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMsIHNpemUpKQotCSAgICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIHRoZSBtYWdpYyBudW1iZXIgbWF0Y2hlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hbHBoYV9lY29mZl9iYWRfZm9ybWF0X2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgaWYgKEFMUEhBX0VDT0ZGX0JBRE1BRyAoKmludGVybmFsX2YpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBhIGhvb2sgY2FsbGVkIGJ5IGNvZmZfcmVhbF9vYmplY3RfcCB0byBjcmVhdGUgYW55IGJhY2tlbmQKLSAgIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIFBUUgotYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIFBUUiBlY29mZjsKLQotICBlY29mZiA9IF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcik7Ci0KLSAgaWYgKGVjb2ZmICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLQotICAgICAgLyogU2V0IGFkZGl0aW9uYWwgQkZEIGZsYWdzIGFjY29yZGluZyB0byB0aGUgb2JqZWN0IHR5cGUgZnJvbSB0aGUKLQkgbWFjaGluZSBzcGVjaWZpYyBmaWxlIGhlYWRlciBmbGFncy4gICovCi0gICAgICBzd2l0Y2ggKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0FMUEhBX09CSkVDVF9UWVBFX01BU0spCi0JewotCWNhc2UgRl9BTFBIQV9TSEFSQUJMRToKLQkgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0JICBicmVhazsKLQljYXNlIEZfQUxQSEFfQ0FMTF9TSEFSRUQ6Ci0JICAvKiBBbHdheXMgZXhlY3V0YWJsZSBpZiB1c2luZyBzaGFyZWQgbGlicmFyaWVzIGFzIHRoZSBydW4gdGltZQotCSAgICAgbG9hZGVyIG1pZ2h0IHJlc29sdmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMuICAqLwotCSAgYWJmZC0+ZmxhZ3MgfD0gKERZTkFNSUMgfCBFWEVDX1ApOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGVjb2ZmOwotfQotDAotLyogUmVsb2MgaGFuZGxpbmcuICAqLwotCi0vKiBTd2FwIGEgcmVsb2MgaW4uICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXh0X3B0ciwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybjsKLXsKLSAgY29uc3QgUkVMT0MgKmV4dCA9IChSRUxPQyAqKSBleHRfcHRyOwotCi0gIGludGVybi0+cl92YWRkciA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cl92YWRkcik7Ci0gIGludGVybi0+cl9zeW1uZHggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnJfc3ltbmR4KTsKLQotICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKLQotICBpbnRlcm4tPnJfdHlwZSA9ICgoZXh0LT5yX2JpdHNbMF0gJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSkKLQkJICAgID4+IFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFKTsKLSAgaW50ZXJuLT5yX2V4dGVybiA9IChleHQtPnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUpICE9IDA7Ci0gIGludGVybi0+cl9vZmZzZXQgPSAoKGV4dC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkKLQkJICAgICAgPj4gUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRSk7Ci0gIC8qIElnbm9yZWQgdGhlIHJlc2VydmVkIGJpdHMuICAqLwotICBpbnRlcm4tPnJfc2l6ZSA9ICgoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSkKLQkJICAgID4+IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKTsKLQotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9MSVRVU0UKLSAgICAgIHx8IGludGVybi0+cl90eXBlID09IEFMUEhBX1JfR1BESVNQKQotICAgIHsKLSAgICAgIC8qIEhhbmRsZSB0aGUgTElUVVNFIGFuZCBHUERJU1AgcmVsb2NzIHNwZWNpYWxseS4gIEl0cyBzeW1uZHgKLQkgdmFsdWUgaXMgbm90IGFjdHVhbGx5IGEgc3ltYm9sIGluZGV4LCBidXQgaXMgaW5zdGVhZCBhCi0JIHNwZWNpYWwgY29kZS4gIFdlIHB1dCB0aGUgY29kZSBpbiB0aGUgcl9zaXplIGZpZWxkLCBhbmQKLQkgY2xvYmJlciB0aGUgc3ltbmR4LiAgKi8KLSAgICAgIGlmIChpbnRlcm4tPnJfc2l6ZSAhPSAwKQotCWFib3J0ICgpOwotICAgICAgaW50ZXJuLT5yX3NpemUgPSBpbnRlcm4tPnJfc3ltbmR4OwotICAgICAgaW50ZXJuLT5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTk9ORTsKLSAgICB9Ci0gIGVsc2UgaWYgKGludGVybi0+cl90eXBlID09IEFMUEhBX1JfSUdOT1JFKQotICAgIHsKLSAgICAgIC8qIFRoZSBJR05PUkUgcmVsb2MgZ2VuZXJhbGx5IGZvbGxvd3MgYSBHUERJU1AgcmVsb2MsIGFuZCBpcwotCSBhZ2FpbnN0IHRoZSAubGl0YSBzZWN0aW9uLiAgVGhlIHNlY3Rpb24gaXMgaXJyZWxldmFudC4gICovCi0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuICYmCi0JICBpbnRlcm4tPnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fQUJTKQotCWFib3J0ICgpOwotICAgICAgaWYgKCEgaW50ZXJuLT5yX2V4dGVybiAmJiBpbnRlcm4tPnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fTElUQSkKLQlpbnRlcm4tPnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9BQlM7Ci0gICAgfQotfQotCi0vKiBTd2FwIGEgcmVsb2Mgb3V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBpbnRlcm4sIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybjsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKmV4dCA9IChSRUxPQyAqKSBkc3Q7Ci0gIGxvbmcgc3ltbmR4OwotICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0KLSAgLyogVW5kbyB0aGUgaGFja2VyeSBkb25lIGluIHN3YXBfcmVsb2NfaW4uICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gQUxQSEFfUl9MSVRVU0UKLSAgICAgIHx8IGludGVybi0+cl90eXBlID09IEFMUEhBX1JfR1BESVNQKQotICAgIHsKLSAgICAgIHN5bW5keCA9IGludGVybi0+cl9zaXplOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBBTFBIQV9SX0lHTk9SRQotCSAgICYmICEgaW50ZXJuLT5yX2V4dGVybgotCSAgICYmIGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0gICAgewotICAgICAgc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVRBOwotICAgICAgc2l6ZSA9IGludGVybi0+cl9zaXplOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bW5keCA9IGludGVybi0+cl9zeW1uZHg7Ci0gICAgICBzaXplID0gaW50ZXJuLT5yX3NpemU7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGludGVybi0+cl9leHRlcm4KLQkgICAgICB8fCAoaW50ZXJuLT5yX3N5bW5keCA+PSAwICYmIGludGVybi0+cl9zeW1uZHggPD0gMTQpKTsKLQotICBiZmRfaF9wdXRfNjQgKGFiZmQsIGludGVybi0+cl92YWRkciwgKGJmZF9ieXRlICopIGV4dC0+cl92YWRkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3ltbmR4LCAoYmZkX2J5dGUgKikgZXh0LT5yX3N5bW5keCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2hlYWRlcl9saXR0bGVfZW5kaWFuIChhYmZkKSk7Ci0KLSAgZXh0LT5yX2JpdHNbMF0gPSAoKGludGVybi0+cl90eXBlIDw8IFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFKQotCQkgICAgJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSk7Ci0gIGV4dC0+cl9iaXRzWzFdID0gKChpbnRlcm4tPnJfZXh0ZXJuID8gUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSA6IDApCi0JCSAgICB8ICgoaW50ZXJuLT5yX29mZnNldCA8PCBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKQotCQkgICAgICAgJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKSk7Ci0gIGV4dC0+cl9iaXRzWzJdID0gMDsKLSAgZXh0LT5yX2JpdHNbM10gPSAoKHNpemUgPDwgUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpCi0JCSAgICAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKTsKLX0KLQotLyogRmluaXNoIGNhbm9uaWNhbGl6aW5nIGEgcmVsb2MuICBQYXJ0IG9mIHRoaXMgaXMgZ2VuZXJpYyB0byBhbGwKLSAgIEVDT0ZGIHRhcmdldHMsIGFuZCB0aGF0IHBhcnQgaXMgaW4gZWNvZmYuYy4gIFRoZSByZXN0IGlzIGRvbmUgaW4KLSAgIHRoaXMgYmFja2VuZCByb3V0aW5lLiAgSXQgbXVzdCBmaWxsIGluIHRoZSBob3d0byBmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hZGp1c3RfcmVsb2NfaW4gKGFiZmQsIGludGVybiwgcnB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybjsKLSAgICAgYXJlbGVudCAqcnB0cjsKLXsKLSAgaWYgKGludGVybi0+cl90eXBlID4gQUxQSEFfUl9HUFZBTFVFKQotICAgIGFib3J0ICgpOwotCi0gIHN3aXRjaCAoaW50ZXJuLT5yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQUxQSEFfUl9CUkFERFI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUwxNjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDMyOgotICAgIGNhc2UgQUxQSEFfUl9TUkVMNjQ6Ci0gICAgICAvKiBUaGlzIHJlbG9jcyBhcHBlYXIgdG8gYmUgZnVsbHkgcmVzb2x2ZWQgd2hlbiB0aGV5IGFyZSBhZ2FpbnN0Ci0gICAgICAgICBpbnRlcm5hbCBzeW1ib2xzLiAgQWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLCBCUkFERFIgYXQgbGVhc3QKLSAgICAgICAgIGFwcGVhcnMgdG8gYmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgbmV4dCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAoISBpbnRlcm4tPnJfZXh0ZXJuKQotCXJwdHItPmFkZGVuZCA9IDA7Ci0gICAgICBlbHNlCi0JcnB0ci0+YWRkZW5kID0gLSAoaW50ZXJuLT5yX3ZhZGRyICsgNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFJFTDMyOgotICAgIGNhc2UgQUxQSEFfUl9MSVRFUkFMOgotICAgICAgLyogQ29weSB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgYWRkZW5kLCB0bwotCSBlbnN1cmUgdGhhdCB3ZSBhcmUgbm90IGNvbmZ1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotICAgICAgaWYgKCEgaW50ZXJuLT5yX2V4dGVybikKLQlycHRyLT5hZGRlbmQgKz0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfTElUVVNFOgotICAgIGNhc2UgQUxQSEFfUl9HUERJU1A6Ci0gICAgICAvKiBUaGUgTElUVVNFIGFuZCBHUERJU1AgcmVsb2NzIGRvIG5vdCB1c2UgYSBzeW1ib2wsIG9yIGFuCi0JIGFkZGVuZCwgYnV0IHRoZXkgZG8gdXNlIGEgc3BlY2lhbCBjb2RlLiAgUHV0IHRoaXMgY29kZSBpbiB0aGUKLQkgYWRkZW5kIGZpZWxkLiAgKi8KLSAgICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0gICAgICAvKiBUaGUgU1RPUkUgcmVsb2MgbmVlZHMgdGhlIHNpemUgYW5kIG9mZnNldCBmaWVsZHMuICBXZSBzdG9yZQotCSB0aGVtIGluIHRoZSBhZGRlbmQuICAqLwotICAgICAgQkZEX0FTU0VSVCAoaW50ZXJuLT5yX29mZnNldCA8PSAyNTYgJiYgaW50ZXJuLT5yX3NpemUgPD0gMjU2KTsKLSAgICAgIHJwdHItPmFkZGVuZCA9IChpbnRlcm4tPnJfb2Zmc2V0IDw8IDgpICsgaW50ZXJuLT5yX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9PUF9QVVNIOgotICAgIGNhc2UgQUxQSEFfUl9PUF9QU1VCOgotICAgIGNhc2UgQUxQSEFfUl9PUF9QUlNISUZUOgotICAgICAgLyogVGhlIFBVU0gsIFBTVUIgYW5kIFBSU0hJRlQgcmVsb2NzIGRvIG5vdCBhY3R1YWxseSB1c2UgYW4KLQkgYWRkcmVzcy4gIEkgYmVsaWV2ZSB0aGF0IHRoZSBhZGRyZXNzIHN1cHBsaWVkIGlzIHJlYWxseSBhbgotCSBhZGRlbmQuICAqLwotICAgICAgcnB0ci0+YWRkZW5kID0gaW50ZXJuLT5yX3ZhZGRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfR1BWQUxVRToKLSAgICAgIC8qIFNldCB0aGUgYWRkZW5kIGZpZWxkIHRvIHRoZSBuZXcgR1AgdmFsdWUuICAqLwotICAgICAgcnB0ci0+YWRkZW5kID0gaW50ZXJuLT5yX3N5bW5keCArIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0lHTk9SRToKLSAgICAgIC8qIElmIHRoZSB0eXBlIGlzIEFMUEhBX1JfSUdOT1JFLCBtYWtlIHN1cmUgdGhpcyBpcyBhIHJlZmVyZW5jZQotCSB0byB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzbyB0aGF0IHRoZSByZWxvYyBpcyBpZ25vcmVkLiAgRm9yCi0JIHNvbWUgcmVhc29uIHRoZSBhZGRyZXNzIG9mIHRoaXMgcmVsb2MgdHlwZSBpcyBub3QgYWRqdXN0ZWQgYnkKLQkgdGhlIHNlY3Rpb24gdm1hLiAgV2UgcmVjb3JkIHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBvYmplY3QgZmlsZQotCSBoZXJlLCBmb3IgY29udmVuaWVuY2Ugd2hlbiBkb2luZyB0aGUgR1BESVNQIHJlbG9jYXRpb24uICAqLwotICAgICAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIHJwdHItPmFkZHJlc3MgPSBpbnRlcm4tPnJfdmFkZHI7Ci0gICAgICBycHRyLT5hZGRlbmQgPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcnB0ci0+aG93dG8gPSAmYWxwaGFfaG93dG9fdGFibGVbaW50ZXJuLT5yX3R5cGVdOwotfQotCi0vKiBXaGVuIHdyaXRpbmcgb3V0IGEgcmVsb2Mgd2UgbmVlZCB0byBwdWxsIHNvbWUgdmFsdWVzIGJhY2sgb3V0IG9mCi0gICB0aGUgYWRkZW5kIGZpZWxkIGludG8gdGhlIHJlbG9jLiAgVGhpcyBpcyByb3VnaGx5IHRoZSByZXZlcnNlIG9mCi0gICBhbHBoYV9hZGp1c3RfcmVsb2NfaW4sIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBzZXZlcmFsIGNoYW5nZXMgd2UgZG8KLSAgIG5vdCBuZWVkIHRvIHVuZG8uICAqLwotCi1zdGF0aWMgdm9pZAotYWxwaGFfYWRqdXN0X3JlbG9jX291dCAoYWJmZCwgcmVsLCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgYXJlbGVudCAqcmVsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludGVybjsKLXsKLSAgc3dpdGNoIChpbnRlcm4tPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBBTFBIQV9SX0xJVFVTRToKLSAgICBjYXNlIEFMUEhBX1JfR1BESVNQOgotICAgICAgaW50ZXJuLT5yX3NpemUgPSByZWwtPmFkZGVuZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1NUT1JFOgotICAgICAgaW50ZXJuLT5yX3NpemUgPSByZWwtPmFkZGVuZCAmIDB4ZmY7Ci0gICAgICBpbnRlcm4tPnJfb2Zmc2V0ID0gKHJlbC0+YWRkZW5kID4+IDgpICYgMHhmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0gICAgICBpbnRlcm4tPnJfdmFkZHIgPSByZWwtPmFkZGVuZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX0lHTk9SRToKLSAgICAgIGludGVybi0+cl92YWRkciA9IHJlbC0+YWRkcmVzczsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogVGhlIHNpemUgb2YgdGhlIHN0YWNrIGZvciB0aGUgcmVsb2NhdGlvbiBldmFsdWF0b3IuICAqLwotI2RlZmluZSBSRUxPQ19TVEFDS1NJWkUgKDEwKQotCi0vKiBBbHBoYSBFQ09GRiByZWxvY3MgaGF2ZSBhIGJ1aWx0IGluIGV4cHJlc3Npb24gZXZhbHVhdG9yIGFzIHdlbGwgYXMKLSAgIG90aGVyIGludGVyZGVwZW5kZW5jaWVzLiAgUmF0aGVyIHRoYW4gdXNlIGEgYnVuY2ggb2Ygc3BlY2lhbAotICAgZnVuY3Rpb25zIGFuZCBnbG9iYWwgdmFyaWFibGVzLCB3ZSB1c2UgYSBzaW5nbGUgcm91dGluZSB0byBkbyBhbGwKLSAgIHRoZSByZWxvY2F0aW9uIGZvciBhIHNlY3Rpb24uICBJIGhhdmVuJ3QgeWV0IHdvcmtlZCBvdXQgaG93IHRoZQotICAgYXNzZW1ibGVyIGlzIGdvaW5nIHRvIGhhbmRsZSB0aGlzLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLWFscGhhX2Vjb2ZmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgICAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0gIGJmZCAqb3V0cHV0X2JmZCA9IHJlbG9jYXRlYWJsZSA/IGFiZmQgOiAoYmZkICopIE5VTEw7Ci0gIGJmZF92bWEgZ3A7Ci0gIGJvb2xlYW4gZ3BfdW5kZWZpbmVkOwotICBiZmRfdm1hIHN0YWNrW1JFTE9DX1NUQUNLU0laRV07Ci0gIGludCB0b3MgPSAwOwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBkYXRhLAotCQkJCSAgKGZpbGVfcHRyKSAwLCBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBzZWN0aW9uIHNpemUgaXMgbm90IGdvaW5nIHRvIGNoYW5nZS4gICovCi0gIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3Rvciwgc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChyZWxvY19jb3VudCA9PSAwKQotICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBHUCB2YWx1ZSBmb3IgdGhlIG91dHB1dCBCRkQuICAqLwotICBncF91bmRlZmluZWQgPSBmYWxzZTsKLSAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoYWJmZCk7Ci0gIGlmIChncCA9PSAwKQotICAgIHsKLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgIT0gZmFsc2UpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQkgIGJmZF92bWEgbG87Ci0KLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICBsbyA9IChiZmRfdm1hKSAtMTsKLQkgIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc2VjLT52bWEgPCBsbwotCQkgICYmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi5zYnNzIikgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKHNlYy0+bmFtZSwgIi5zZGF0YSIpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChzZWMtPm5hbWUsICIubGl0NCIpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChzZWMtPm5hbWUsICIubGl0OCIpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChzZWMtPm5hbWUsICIubGl0YSIpID09IDApKQotCQlsbyA9IHNlYy0+dm1hOwotCSAgICB9Ci0JICBncCA9IGxvICsgMHg4MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKGFiZmQsIGdwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLT5oYXNoLCAiX2dwIiwgZmFsc2UsIGZhbHNlLAotCQkJCSAgICB0cnVlKTsKLQkgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICAgIGdwX3VuZGVmaW5lZCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBncCA9IChoLT51LmRlZi52YWx1ZQotCQkgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChhYmZkLCBncCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoOyAqcmVsb2NfdmVjdG9yICE9IChhcmVsZW50ICopIE5VTEw7IHJlbG9jX3ZlY3RvcisrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICAgICAgY2hhciAqZXJyOwotCi0gICAgICByZWwgPSAqcmVsb2NfdmVjdG9yOwotICAgICAgciA9IGJmZF9yZWxvY19vazsKLSAgICAgIHN3aXRjaCAocmVsLT5ob3d0by0+dHlwZSkKLQl7Ci0JY2FzZSBBTFBIQV9SX0lHTk9SRToKLQkgIHJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfUkVGTE9ORzoKLQljYXNlIEFMUEhBX1JfUkVGUVVBRDoKLQljYXNlIEFMUEhBX1JfQlJBRERSOgotCWNhc2UgQUxQSEFfUl9ISU5UOgotCWNhc2UgQUxQSEFfUl9TUkVMMTY6Ci0JY2FzZSBBTFBIQV9SX1NSRUwzMjoKLQljYXNlIEFMUEhBX1JfU1JFTDY0OgotCSAgaWYgKHJlbG9jYXRlYWJsZQotCSAgICAgICYmICgoKnJlbC0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkgICAgewotCSAgICAgIHJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICByID0gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLCByZWwsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgb3V0cHV0X2JmZCwgJmVycik7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9HUFJFTDMyOgotCSAgLyogVGhpcyByZWxvY2F0aW9uIGlzIHVzZWQgaW4gYSBzd2l0Y2ggdGFibGUuICBJdCBpcyBhIDMyCi0JICAgICBiaXQgb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgR1AgdmFsdWUuICBXZSBtdXN0IGFkanVzdCBpdAotCSAgICAgYnkgdGhlIGRpZmZlcmVudCBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBHUCB2YWx1ZSBhbmQgdGhlCi0JICAgICBjdXJyZW50IEdQIHZhbHVlLiAgVGhlIG9yaWdpbmFsIEdQIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUKLQkgICAgIGFkZGVuZC4gIFdlIGFkanVzdCB0aGUgYWRkZW5kIGFuZCBsZXQKLQkgICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIHRoZSBqb2IuICAqLwotCSAgcmVsLT5hZGRlbmQgLT0gZ3A7Ci0JICByID0gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiAoaW5wdXRfYmZkLCByZWwsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgb3V0cHV0X2JmZCwgJmVycik7Ci0JICBpZiAociA9PSBiZmRfcmVsb2Nfb2sgJiYgZ3BfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgciA9IGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JICAgICAgZXJyID0gKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfTElURVJBTDoKLQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBsaXRlcmFsIHZhbHVlLCBnZW5lcmFsbHkKLQkgICAgIChhbHdheXM/KSBpbiB0aGUgLmxpdGEgc2VjdGlvbi4gIFRoaXMgaXMgYSAxNiBiaXQgR1AKLQkgICAgIHJlbGF0aXZlIHJlbG9jYXRpb24uICBTb21ldGltZXMgdGhlIHN1YnNlcXVlbnQgcmVsb2MgaXMgYQotCSAgICAgTElUVVNFIHJlbG9jLCB3aGljaCBpbmRpY2F0ZXMgaG93IHRoaXMgcmVsb2MgaXMgdXNlZC4KLQkgICAgIFRoaXMgc29tZXRpbWVzIHBlcm1pdHMgcmV3cml0aW5nIHRoZSB0d28gaW5zdHJ1Y3Rpb25zCi0JICAgICByZWZlcnJlZCB0byBieSB0aGUgTElURVJBTCBhbmQgdGhlIExJVFVTRSBpbnRvIGRpZmZlcmVudAotCSAgICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdCByZWZlciB0byAubGl0YS4gIFRoaXMgY2FuIHNhdmUKLQkgICAgIGEgbWVtb3J5IHJlZmVyZW5jZSwgYW5kIHBlcm1pdHMgcmVtb3ZpbmcgYSB2YWx1ZSBmcm9tCi0JICAgICAubGl0YSB0aHVzIHNhdmluZyBHUCByZWxhdGl2ZSBzcGFjZS4KLQotCSAgICAgV2UgZG8gbm90IHRoZXNlIG9wdGltaXphdGlvbnMuICBUbyBkbyB0aGVtIHdlIHdvdWxkIG5lZWQKLQkgICAgIHRvIGFycmFuZ2UgdG8gbGluayB0aGUgLmxpdGEgc2VjdGlvbiBmaXJzdCwgc28gdGhhdCBieQotCSAgICAgdGhlIHRpbWUgd2UgZ290IGhlcmUgd2Ugd291bGQga25vdyB0aGUgZmluYWwgdmFsdWVzIHRvCi0JICAgICB1c2UuICBUaGlzIHdvdWxkIG5vdCBiZSBwYXJ0aWN1bGFybHkgZGlmZmljdWx0LCBidXQgaXQgaXMKLQkgICAgIG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQuICAqLwotCi0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotCSAgICAvKiBJIGJlbGlldmUgdGhhdCB0aGUgTElURVJBTCByZWxvYyB3aWxsIG9ubHkgYXBwbHkgdG8gYQotCSAgICAgICBsZHEgb3IgbGRsIGluc3RydWN0aW9uLCBzbyBjaGVjayBteSBhc3N1bXB0aW9uLiAgKi8KLQkgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHJlbC0+YWRkcmVzcyk7Ci0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbiA+PiAyNikgJiAweDNmKSA9PSAweDI5Ci0JCQl8fCAoKGluc24gPj4gMjYpICYgMHgzZikgPT0gMHgyOCk7Ci0KLQkgICAgcmVsLT5hZGRlbmQgLT0gZ3A7Ci0JICAgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsIHJlbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJb3V0cHV0X2JmZCwgJmVycik7Ci0JICAgIGlmIChyID09IGJmZF9yZWxvY19vayAmJiBncF91bmRlZmluZWQpCi0JICAgICAgewotCQlyID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkJZXJyID0KLQkJICAoY2hhciAqKSBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHVzZWQgd2hlbiBHUCBub3QgZGVmaW5lZCIpOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0xJVFVTRToKLQkgIC8qIFNlZSBBTFBIQV9SX0xJVEVSQUwgYWJvdmUgZm9yIHRoZSB1c2VzIG9mIHRoaXMgcmVsb2MuICBJdAotCSAgICAgZG9lcyBub3QgY2F1c2UgYW55dGhpbmcgdG8gaGFwcGVuLCBpdHNlbGYuICAqLwotCSAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICBicmVhazsKLQkgICAgCi0JY2FzZSBBTFBIQV9SX0dQRElTUDoKLQkgIC8qIFRoaXMgbWFya3MgdGhlIGxkYWggb2YgYW4gbGRhaC9sZGEgcGFpciB3aGljaCBsb2FkcyB0aGUKLQkgICAgIGdwIHJlZ2lzdGVyIHdpdGggdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIGdwIHZhbHVlIGFuZCB0aGUKLQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICBUaGUgc2Vjb25kIG9mIHRoZSBwYWlyIGlzIHJfc2l6ZSBieXRlcwotCSAgICAgYWhlYWQ7IGl0IHVzZWQgdG8gYmUgbWFya2VkIHdpdGggYW4gQUxQSEFfUl9JR05PUkUgcmVsb2MsCi0JICAgICBidXQgdGhhdCBubyBsb25nZXIgaGFwcGVucyBpbiBPU0YvMSAzLjIuICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGluc24xLCBpbnNuMjsKLQkgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLQkgICAgLyogR2V0IHRoZSB0d28gaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgaW5zbjEgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGRhdGEgKyByZWwtPmFkZHJlc3MpOwotCSAgICBpbnNuMiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZGF0YSArIHJlbC0+YWRkcmVzcyArIHJlbC0+YWRkZW5kKTsKLQotCSAgICBCRkRfQVNTRVJUICgoKGluc24xID4+IDI2KSAmIDB4M2YpID09IDB4MDkpOyAvKiBsZGFoICovCi0JICAgIEJGRF9BU1NFUlQgKCgoaW5zbjIgPj4gMjYpICYgMHgzZikgPT0gMHgwOCk7IC8qIGxkYSAqLwotCi0JICAgIC8qIEdldCB0aGUgZXhpc3RpbmcgYWRkZW5kLiAgV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgc2lnbgotCSAgICAgICBleHRlbnNpb24gZG9uZSBieSBsZGEgYW5kIGxkYWguICAqLwotCSAgICBhZGRlbmQgPSAoKGluc24xICYgMHhmZmZmKSA8PCAxNikgKyAoaW5zbjIgJiAweGZmZmYpOwotCSAgICBpZiAoaW5zbjEgJiAweDgwMDApCi0JICAgICAgewotCQlhZGRlbmQgLT0gMHg4MDAwMDAwMDsKLQkJYWRkZW5kIC09IDB4ODAwMDAwMDA7Ci0JICAgICAgfQotCSAgICBpZiAoaW5zbjIgJiAweDgwMDApCi0JICAgICAgYWRkZW5kIC09IDB4MTAwMDA7Ci0KLQkgICAgLyogVGhlIGV4aXN0aW5nIGFkZGVuZCBpbmNsdWRlcyB0aGUgZGlmZmVyZW50IGJldHdlZW4gdGhlCi0JICAgICAgIGdwIG9mIHRoZSBpbnB1dCBCRkQgYW5kIHRoZSBhZGRyZXNzIGluIHRoZSBpbnB1dCBCRkQuCi0JICAgICAgIFN1YnRyYWN0IHRoaXMgb3V0LiAgKi8KLQkgICAgYWRkZW5kIC09IChlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncAotCQkgICAgICAgLSAoaW5wdXRfc2VjdGlvbi0+dm1hICsgcmVsLT5hZGRyZXNzKSk7Ci0KLQkgICAgLyogTm93IGFkZCBpbiB0aGUgZmluYWwgZ3AgdmFsdWUsIGFuZCBzdWJ0cmFjdCBvdXQgdGhlCi0JICAgICAgIGZpbmFsIGFkZHJlc3MuICAqLwotCSAgICBhZGRlbmQgKz0gKGdwCi0JCSAgICAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICArIHJlbC0+YWRkcmVzcykpOwotCi0JICAgIC8qIENoYW5nZSB0aGUgaW5zdHJ1Y3Rpb25zLCBhY2NvdW50aW5nIGZvciB0aGUgc2lnbgotCSAgICAgICBleHRlbnNpb24sIGFuZCB3cml0ZSB0aGVtIG91dC4gICovCi0JICAgIGlmIChhZGRlbmQgJiAweDgwMDApCi0JICAgICAgYWRkZW5kICs9IDB4MTAwMDA7Ci0JICAgIGluc24xID0gKGluc24xICYgMHhmZmZmMDAwMCkgfCAoKGFkZGVuZCA+PiAxNikgJiAweGZmZmYpOwotCSAgICBpbnNuMiA9IChpbnNuMiAmIDB4ZmZmZjAwMDApIHwgKGFkZGVuZCAmIDB4ZmZmZik7Ci0KLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAoYmZkX3ZtYSkgaW5zbjEsIGRhdGEgKyByZWwtPmFkZHJlc3MpOwotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuMiwKLQkJCWRhdGEgKyByZWwtPmFkZHJlc3MgKyByZWwtPmFkZGVuZCk7Ci0KLQkgICAgcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgQUxQSEFfUl9PUF9QVVNIOgotCSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLQkgIHsKLQkgICAgYXN5bWJvbCAqc3ltYm9sOwotCSAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLQkgICAgaWYgKHJlbG9jYXRlYWJsZSkKLQkgICAgICB7Ci0JCXJlbC0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIG91dCB0aGUgcmVsb2NhdGlvbiBvZiB0aGlzIHN5bWJvbC4gICovCi0JICAgIHN5bWJvbCA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgciA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLQkgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCSAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5hZGRlbmQ7Ci0KLQkgICAgaWYgKHRvcyA+PSBSRUxPQ19TVEFDS1NJWkUpCi0JICAgICAgYWJvcnQgKCk7Ci0KLQkgICAgc3RhY2tbdG9zKytdID0gcmVsb2NhdGlvbjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX09QX1NUT1JFOgotCSAgLyogU3RvcmUgYSB2YWx1ZSBmcm9tIHRoZSByZWxvYyBzdGFjayBpbnRvIGEgYml0ZmllbGQuICAqLwotCSAgewotCSAgICBiZmRfdm1hIHZhbDsKLQkgICAgaW50IG9mZnNldCwgc2l6ZTsKLQotCSAgICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICAgIHsKLQkJcmVsLT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBpZiAodG9zID09IDApCi0JICAgICAgYWJvcnQgKCk7Ci0KLQkgICAgLyogVGhlIG9mZnNldCBhbmQgc2l6ZSBmb3IgdGhpcyByZWxvYyBhcmUgZW5jb2RlZCBpbnRvIHRoZQotCSAgICAgICBhZGRlbmQgZmllbGQgYnkgYWxwaGFfYWRqdXN0X3JlbG9jX2luLiAgKi8KLQkgICAgb2Zmc2V0ID0gKHJlbC0+YWRkZW5kID4+IDgpICYgMHhmZjsKLQkgICAgc2l6ZSA9IHJlbC0+YWRkZW5kICYgMHhmZjsKLQotCSAgICB2YWwgPSBiZmRfZ2V0XzY0IChhYmZkLCBkYXRhICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgdmFsICY9fiAoKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0KTsKLQkgICAgdmFsIHw9IChzdGFja1stLXRvc10gJiAoKDEgPDwgc2l6ZSkgLSAxKSkgPDwgb2Zmc2V0OwotCSAgICBiZmRfcHV0XzY0IChhYmZkLCB2YWwsIGRhdGEgKyByZWwtPmFkZHJlc3MpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfUFNVQjoKLQkgIC8qIFN1YnRyYWN0IGEgdmFsdWUgZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCi0JICB7Ci0JICAgIGFzeW1ib2wgKnN5bWJvbDsKLQkgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0JICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgICAgewotCQlyZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIC8qIEZpZ3VyZSBvdXQgdGhlIHJlbG9jYXRpb24gb2YgdGhpcyBzeW1ib2wuICAqLwotCSAgICBzeW1ib2wgPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotCSAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHIgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0JICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+YWRkZW5kOwotCi0JICAgIGlmICh0b3MgPT0gMCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdGFja1t0b3MgLSAxXSAtPSByZWxvY2F0aW9uOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfUFJTSElGVDoKLQkgIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCi0JICB7Ci0JICAgIGFzeW1ib2wgKnN5bWJvbDsKLQkgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0JICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JICAgICAgewotCQlyZWwtPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIC8qIEZpZ3VyZSBvdXQgdGhlIHJlbG9jYXRpb24gb2YgdGhpcyBzeW1ib2wuICAqLwotCSAgICBzeW1ib2wgPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotCSAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICAgIHIgPSBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0JICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQkgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICAgIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+YWRkZW5kOwotCi0JICAgIGlmICh0b3MgPT0gMCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdGFja1t0b3MgLSAxXSA+Pj0gcmVsb2NhdGlvbjsKLQkgIH0KLQkgIGJyZWFrOwotCSAgICAKLQljYXNlIEFMUEhBX1JfR1BWQUxVRToKLQkgIC8qIEkgcmVhbGx5IGRvbid0IGtub3cgaWYgdGhpcyBkb2VzIHRoZSByaWdodCB0aGluZy4gICovCi0JICBncCA9IHJlbC0+YWRkZW5kOwotCSAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUpCi0JewotCSAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgIC8qIEEgcGFydGlhbCBsaW5rLCBzbyBrZWVwIHRoZSByZWxvY3MuICAqLwotCSAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSByZWw7Ci0JICBvcy0+cmVsb2NfY291bnQrKzsKLQl9Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykgCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsLT5zeW1fcHRyX3B0ciksCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5hZGRyZXNzKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6IAotCSAgICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCSAgICAgKGxpbmtfaW5mbywgZXJyLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+YWRkcmVzcykpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWwtPnN5bV9wdHJfcHRyKSwKLQkJICAgICAgcmVsLT5ob3d0by0+bmFtZSwgcmVsLT5hZGRlbmQsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5hZGRyZXNzKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAodG9zICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSBzdWNjZXNzZnVsX3JldHVybjoKLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0gICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdldCB0aGUgaG93dG8gc3RydWN0dXJlIGZvciBhIGdlbmVyaWMgcmVsb2MgdHlwZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgaW50IGFscGhhX3R5cGU7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1JFRkxPTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGUVVBRDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9HUFJFTDMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0xJVEVSQUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9MSVRVU0U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX0dQRElTUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2OgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfSUdOT1JFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9CUkFERFI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfSElOVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotICAgICAgYWxwaGFfdHlwZSA9IEFMUEhBX1JfU1JFTDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ182NF9QQ1JFTDoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX1NSRUw2NDsKLSAgICAgIGJyZWFrOwotI2lmIDAKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1BVU0g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlID8/PzoKLSAgICAgIGFscGhhX3R5cGUgPSBBTFBIQV9SX09QX1NUT1JFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA/Pz86Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9PUF9QU1VCOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA/Pz86Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9PUF9QUlNISUZUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA/Pz86Ci0gICAgICBhbHBoYV90eXBlID0gQUxQSEFfUl9HUFZBTFVFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmYWxwaGFfaG93dG9fdGFibGVbYWxwaGFfdHlwZV07Ci19Ci0MCi0vKiBBIGhlbHBlciByb3V0aW5lIGZvciBhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIHdoaWNoIGNvbnZlcnRzIGFuCi0gICBleHRlcm5hbCByZWxvYyB3aGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFJldHVybnMgdGhlCi0gICByZWxvY2F0aW9uIGFtb3VudC4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1hbHBoYV9jb252ZXJ0X2V4dGVybmFsX3JlbG9jIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGV4dF9yZWwsIGgpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWw7Ci0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICBCRkRfQVNTRVJUIChpbmZvLT5yZWxvY2F0ZWFibGUpOwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpoc2VjOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiB0aGUgb3V0cHV0LiAgQ29udmVydCB0aGUgcmVsb2MgZnJvbQotCSBiZWluZyBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gYmVpbmcgYWdhaW5zdCB0aGUgc2VjdGlvbi4gICovCi0KLSAgICAgIC8qIENsZWFyIHRoZSByX2V4dGVybiBiaXQuICAqLwotICAgICAgZXh0X3JlbC0+cl9iaXRzWzFdICY9fiBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFOwotCi0gICAgICAvKiBDb21wdXRlIGEgbmV3IHJfc3ltbmR4IHZhbHVlLiAgKi8KLSAgICAgIGhzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIGhzZWMtPm91dHB1dF9zZWN0aW9uKTsKLQotICAgICAgcl9zeW1uZHggPSAtMTsKLSAgICAgIHN3aXRjaCAobmFtZVsxXSkKLQl7Ci0JY2FzZSAnQSc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiKkFCUyoiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQUJTOwotCSAgYnJlYWs7Ci0JY2FzZSAnYic6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9CU1M7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9EQVRBOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fRklOSTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0lOSVQ7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIubGl0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVRBOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVDQ7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIucGRhdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7Ci0JICBicmVhazsKLQljYXNlICdyJzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIucmRhdGEiKSA9PSAwKQotCSAgICByX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUkRBVEE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmNvbnN0IikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JDT05TVDsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIudGV4dCIpID09IDApCi0JICAgIHJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9URVhUOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLnhkYXRhIikgPT0gMCkKLQkgICAgcl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOwotCSAgYnJlYWs7Ci0JfQotCQkgICAgICAKLSAgICAgIGlmIChyX3N5bW5keCA9PSAtMSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogQWRkIHRoZSBzZWN0aW9uIFZNQSBhbmQgdGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICsgaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDaGFuZ2UgdGhlIHN5bW5keCB2YWx1ZSB0byB0aGUgcmlnaHQgb25lIGZvcgotCSB0aGUgb3V0cHV0IEJGRC4gICovCi0gICAgICByX3N5bW5keCA9IGgtPmluZHg7Ci0gICAgICBpZiAocl9zeW1uZHggPT0gLTEpCi0JewotCSAgLyogQ2FsbGVyIG11c3QgZ2l2ZSBhbiBlcnJvci4gICovCi0JICByX3N5bW5keCA9IDA7Ci0JfQotICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgbmV3IHJfc3ltbmR4IHZhbHVlLiAgKi8KLSAgYmZkX2hfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSByX3N5bW5keCwKLQkJKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfc3ltbmR4KTsKLQotICByZXR1cm4gcmVsb2NhdGlvbjsKLX0KLQotLyogUmVsb2NhdGUgYSBzZWN0aW9uIHdoaWxlIGxpbmtpbmcgYW4gQWxwaGEgRUNPRkYgZmlsZS4gIFRoaXMgaXMKLSAgIHF1aXRlIHNpbWlsYXIgdG8gZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzLiAgUGVyaGFwcyB0aGV5Ci0gICBjb3VsZCBiZSBjb21iaW5lZCBzb21laG93LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFscGhhX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCWNvbnRlbnRzLCBleHRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotewotICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uLCAqbGl0YV9zZWM7Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hIGdwOwotICBib29sZWFuIGdwX3VuZGVmaW5lZDsKLSAgYmZkX3ZtYSBzdGFja1tSRUxPQ19TVEFDS1NJWkVdOwotICBpbnQgdG9zID0gMDsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotCi0gIC8qIFdlIGtlZXAgYSB0YWJsZSBtYXBwaW5nIHRoZSBzeW1uZHggZm91bmQgaW4gYW4gaW50ZXJuYWwgcmVsb2MgdG8KLSAgICAgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uICBUaGlzIGlzIGZhc3RlciB0aGFuIGxvb2tpbmcgdXAgdGhlCi0gICAgIHNlY3Rpb24gYnkgbmFtZSBlYWNoIHRpbWUuICAqLwotICBzeW1uZHhfdG9fc2VjdGlvbiA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnN5bW5keF90b19zZWN0aW9uOwotICBpZiAoc3ltbmR4X3RvX3NlY3Rpb24gPT0gKGFzZWN0aW9uICoqKSBOVUxMKQotICAgIHsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uID0gKChhc2VjdGlvbiAqKikKLQkJCSAgIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJCSAgICAgIChOVU1fUkVMT0NfU0VDVElPTlMKLQkJCQkgICAgICAgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotICAgICAgaWYgKCFzeW1uZHhfdG9fc2VjdGlvbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTk9ORV0gPSBOVUxMOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9URVhUXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi50ZXh0Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1JEQVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5yZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9EQVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5kYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1NEQVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5zZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9TQlNTXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5zYnNzIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0JTU10gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuYnNzIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0lOSVRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmluaXQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fTElUOF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIubGl0OCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVQ0XSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXQ0Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1hEQVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi54ZGF0YSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9QREFUQV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIucGRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fRklOSV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZmluaSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVRBXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0FCU10gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9SQ09OU1RdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnJjb25zdCIpOwotCi0gICAgICBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbiA9IHN5bW5keF90b19zZWN0aW9uOwotICAgIH0KLQotICBzeW1faGFzaGVzID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltX2hhc2hlczsKLQotICAvKiBPbiB0aGUgQWxwaGEsIHRoZSAubGl0YSBzZWN0aW9uIG11c3QgYmUgYWRkcmVzc2FibGUgYnkgdGhlIGdsb2JhbAotICAgICBwb2ludGVyLiAgVG8gc3VwcG9ydCBsYXJnZSBwcm9ncmFtcywgd2UgbmVlZCB0byBhbGxvdyBtdWx0aXBsZQotICAgICBnbG9iYWwgcG9pbnRlcnMuICBUaGlzIHdvcmtzIGFzIGxvbmcgYXMgZWFjaCBpbnB1dCAubGl0YSBzZWN0aW9uCi0gICAgIGlzIDw2NEtCIGJpZy4gIFRoaXMgaW1wbGllcyB0aGF0IHdoZW4gcHJvZHVjaW5nIHJlbG9jYXRhYmxlCi0gICAgIG91dHB1dCwgdGhlIC5saXRhIHNlY3Rpb24gaXMgbGltaXRlZCB0byA2NEtCLiAuICovCi0KLSAgbGl0YV9zZWMgPSBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVEFdOwotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlICYmIGxpdGFfc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKmxpdGFfc2VjX2RhdGE7Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2VjdGlvbiBkYXRhIHN0cnVjdHVyZSB0byB3aGljaCB3ZSBjYW4KLQkgaGFuZyBvbiB0byB0aGUgZ3AgdmFsdWUgd2UgcGljayBmb3IgdGhlIHNlY3Rpb24uICAqLwotICAgICAgbGl0YV9zZWNfZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBsaXRhX3NlYyk7Ci0gICAgICBpZiAobGl0YV9zZWNfZGF0YSA9PSBOVUxMKQotCXsKLQkgIGxpdGFfc2VjX2RhdGEgPSAoKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICopCi0JCQkgICBiZmRfemFsbG9jIChpbnB1dF9iZmQsCi0JCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICBlY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgbGl0YV9zZWMpID0gbGl0YV9zZWNfZGF0YTsKLQl9Ci0KLSAgICAgIGlmIChsaXRhX3NlY19kYXRhLT5ncCAhPSAwKQotCXsKLQkgIC8qIElmIHdlIGFscmVhZHkgYXNzaWduZWQgYSBncCB0byB0aGlzIHNlY3Rpb24sIHdlIGJldHRlcgotCSAgICAgc3RpY2sgd2l0aCB0aGF0IHZhbHVlLiAgKi8KLQkgIGdwID0gbGl0YV9zZWNfZGF0YS0+Z3A7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF92bWEgbGl0YV92bWE7Ci0JICBiZmRfc2l6ZV90eXBlIGxpdGFfc2l6ZTsKLQotCSAgbGl0YV92bWEgPSBsaXRhX3NlYy0+b3V0cHV0X29mZnNldCArIGxpdGFfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgbGl0YV9zaXplID0gbGl0YV9zZWMtPl9jb29rZWRfc2l6ZTsKLQkgIGlmIChsaXRhX3NpemUgPT0gMCkKLQkgICAgbGl0YV9zaXplID0gbGl0YV9zZWMtPl9yYXdfc2l6ZTsKLQotCSAgaWYgKGdwID09IDAKLQkgICAgICB8fCBsaXRhX3ZtYSA8ICBncCAtIDB4ODAwMAotCSAgICAgIHx8IGxpdGFfdm1hICsgbGl0YV9zaXplID49IGdwICsgMHg4MDAwKQotCSAgICB7Ci0JICAgICAgLyogRWl0aGVyIGdwIGhhc24ndCBiZWVuIHNldCBhdCBhbGwgb3IgdGhlIGN1cnJlbnQgZ3AKLQkJIGNhbm5vdCBhZGRyZXNzIHRoaXMgLmxpdGEgc2VjdGlvbi4gIEluIGJvdGggY2FzZXMgd2UKLQkJIHJlc2V0IHRoZSBncCB0byBwb2ludCBpbnRvIHRoZSAibWlkZGxlIiBvZiB0aGUKLQkJIGN1cnJlbnQgaW5wdXQgLmxpdGEgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKGdwICYmICFlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+aXNzdWVkX211bHRpcGxlX2dwX3dhcm5pbmcpCi0JCXsKLQkJICAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykgKGluZm8sCi0JCQkJCSAgICAgICBfKCJ1c2luZyBtdWx0aXBsZSBncCB2YWx1ZXMiKSwKLQkJCQkJICAgICAgIChjaGFyICopIE5VTEwsIG91dHB1dF9iZmQsCi0JCQkJCSAgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApOwotCQkgIGVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5pc3N1ZWRfbXVsdGlwbGVfZ3Bfd2FybmluZyA9IHRydWU7Ci0JCX0KLQkgICAgICBpZiAobGl0YV92bWEgPCBncCAtIDB4ODAwMCkKLQkJZ3AgPSBsaXRhX3ZtYSArIGxpdGFfc2l6ZSAtIDB4ODAwMDsKLQkgICAgICBlbHNlCi0JCWdwID0gbGl0YV92bWEgKyAweDgwMDA7Ci0KLQkgICAgfQotCi0JICBsaXRhX3NlY19kYXRhLT5ncCA9IGdwOwotCX0KLQotICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLSAgICB9Ci0KLSAgZ3BfdW5kZWZpbmVkID0gKGdwID09IDApOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAob3V0cHV0X2JmZCkpOwotICBCRkRfQVNTRVJUIChiZmRfaGVhZGVyX2xpdHRsZV9lbmRpYW4gKGlucHV0X2JmZCkpOwotCi0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIGV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHJfdmFkZHI7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIGludCByX29mZnNldDsKLSAgICAgIGludCByX3NpemU7Ci0gICAgICBib29sZWFuIHJlbG9jYXRlcDsKLSAgICAgIGJvb2xlYW4gYWRqdXN0X2FkZHJwOwotICAgICAgYm9vbGVhbiBncF91c2VkcDsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotCi0gICAgICByX3ZhZGRyID0gYmZkX2hfZ2V0XzY0IChpbnB1dF9iZmQsIChiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3ZhZGRyKTsKLSAgICAgIHJfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyIChpbnB1dF9iZmQsIChiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3N5bW5keCk7Ci0KLSAgICAgIHJfdHlwZSA9ICgoZXh0X3JlbC0+cl9iaXRzWzBdICYgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUpCi0JCT4+IFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFKTsKLSAgICAgIHJfZXh0ZXJuID0gKGV4dF9yZWwtPnJfYml0c1sxXSAmIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUpICE9IDA7Ci0gICAgICByX29mZnNldCA9ICgoZXh0X3JlbC0+cl9iaXRzWzFdICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkKLQkJICA+PiBSRUxPQ19CSVRTMV9PRkZTRVRfU0hfTElUVExFKTsKLSAgICAgIC8qIElnbm9yZWQgdGhlIHJlc2VydmVkIGJpdHMuICAqLwotICAgICAgcl9zaXplID0gKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSkKLQkJPj4gUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpOwotCi0gICAgICByZWxvY2F0ZXAgPSBmYWxzZTsKLSAgICAgIGFkanVzdF9hZGRycCA9IHRydWU7Ci0gICAgICBncF91c2VkcCA9IGZhbHNlOwotICAgICAgYWRkZW5kID0gMDsKLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgQUxQSEFfUl9JR05PUkU6Ci0JICAvKiBUaGlzIHJlbG9jIGFwcGVhcnMgYWZ0ZXIgYSBHUERJU1AgcmVsb2MuICBPbiBlYXJsaWVyCi0JICAgICB2ZXJzaW9ucyBvZiBPU0YvMSwgSXQgbWFya2VkIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2Vjb25kCi0JICAgICBpbnN0cnVjdGlvbiB0byBiZSBhbHRlcmVkIGJ5IHRoZSBHUERJU1AgcmVsb2MsIGJ1dCBpdCBpcwotCSAgICAgbm90IG90aGVyd2lzZSB1c2VkIGZvciBhbnl0aGluZy4gIEZvciBzb21lIHJlYXNvbiwgdGhlCi0JICAgICBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIGRvZXMgbm90IGFwcGVhciB0byBpbmNsdWRlIHRoZQotCSAgICAgc2VjdGlvbiBWTUEsIHVubGlrZSB0aGUgb3RoZXIgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0JICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICBiZmRfaF9wdXRfNjQgKGlucHV0X2JmZCwKLQkJCSAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIHJfdmFkZHIsCi0JCQkgIChiZmRfYnl0ZSAqKSBleHRfcmVsLT5yX3ZhZGRyKTsKLQkgIGFkanVzdF9hZGRycCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfUkVGTE9ORzoKLQljYXNlIEFMUEhBX1JfUkVGUVVBRDoKLQljYXNlIEFMUEhBX1JfSElOVDoKLQkgIHJlbG9jYXRlcCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9CUkFERFI6Ci0JY2FzZSBBTFBIQV9SX1NSRUwxNjoKLQljYXNlIEFMUEhBX1JfU1JFTDMyOgotCWNhc2UgQUxQSEFfUl9TUkVMNjQ6Ci0JICBpZiAocl9leHRlcm4pCi0JICAgIGFkZGVuZCArPSAtIChyX3ZhZGRyICsgNCk7Ci0JICByZWxvY2F0ZXAgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfR1BSRUwzMjoKLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBpcyB1c2VkIGluIGEgc3dpdGNoIHRhYmxlLiAgSXQgaXMgYSAzMgotCSAgICAgYml0IG9mZnNldCBmcm9tIHRoZSBjdXJyZW50IEdQIHZhbHVlLiAgV2UgbXVzdCBhZGp1c3QgaXQKLQkgICAgIGJ5IHRoZSBkaWZmZXJlbnQgYmV0d2VlbiB0aGUgb3JpZ2luYWwgR1AgdmFsdWUgYW5kIHRoZQotCSAgICAgY3VycmVudCBHUCB2YWx1ZS4gICovCi0JICByZWxvY2F0ZXAgPSB0cnVlOwotCSAgYWRkZW5kID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgLSBncDsKLQkgIGdwX3VzZWRwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0xJVEVSQUw6Ci0JICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgbGl0ZXJhbCB2YWx1ZSwgZ2VuZXJhbGx5Ci0JICAgICAoYWx3YXlzPykgaW4gdGhlIC5saXRhIHNlY3Rpb24uICBUaGlzIGlzIGEgMTYgYml0IEdQCi0JICAgICByZWxhdGl2ZSByZWxvY2F0aW9uLiAgU29tZXRpbWVzIHRoZSBzdWJzZXF1ZW50IHJlbG9jIGlzIGEKLQkgICAgIExJVFVTRSByZWxvYywgd2hpY2ggaW5kaWNhdGVzIGhvdyB0aGlzIHJlbG9jIGlzIHVzZWQuCi0JICAgICBUaGlzIHNvbWV0aW1lcyBwZXJtaXRzIHJld3JpdGluZyB0aGUgdHdvIGluc3RydWN0aW9ucwotCSAgICAgcmVmZXJyZWQgdG8gYnkgdGhlIExJVEVSQUwgYW5kIHRoZSBMSVRVU0UgaW50byBkaWZmZXJlbnQKLQkgICAgIGluc3RydWN0aW9ucyB3aGljaCBkbyBub3QgcmVmZXIgdG8gLmxpdGEuICBUaGlzIGNhbiBzYXZlCi0JICAgICBhIG1lbW9yeSByZWZlcmVuY2UsIGFuZCBwZXJtaXRzIHJlbW92aW5nIGEgdmFsdWUgZnJvbQotCSAgICAgLmxpdGEgdGh1cyBzYXZpbmcgR1AgcmVsYXRpdmUgc3BhY2UuCi0KLQkgICAgIFdlIGRvIG5vdCB0aGVzZSBvcHRpbWl6YXRpb25zLiAgVG8gZG8gdGhlbSB3ZSB3b3VsZCBuZWVkCi0JICAgICB0byBhcnJhbmdlIHRvIGxpbmsgdGhlIC5saXRhIHNlY3Rpb24gZmlyc3QsIHNvIHRoYXQgYnkKLQkgICAgIHRoZSB0aW1lIHdlIGdvdCBoZXJlIHdlIHdvdWxkIGtub3cgdGhlIGZpbmFsIHZhbHVlcyB0bwotCSAgICAgdXNlLiAgVGhpcyB3b3VsZCBub3QgYmUgcGFydGljdWxhcmx5IGRpZmZpY3VsdCwgYnV0IGl0IGlzCi0JICAgICBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLiAgKi8KLQotCSAgLyogSSBiZWxpZXZlIHRoYXQgdGhlIExJVEVSQUwgcmVsb2Mgd2lsbCBvbmx5IGFwcGx5IHRvIGEgbGRxCi0JICAgICBvciBsZGwgaW5zdHJ1Y3Rpb24sIHNvIGNoZWNrIG15IGFzc3VtcHRpb24uICAqLwotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCSAgICAgICBjb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICBCRkRfQVNTRVJUICgoKGluc24gPj4gMjYpICYgMHgzZikgPT0gMHgyOQotCQkJfHwgKChpbnNuID4+IDI2KSAmIDB4M2YpID09IDB4MjgpOwotCSAgfQotCi0JICByZWxvY2F0ZXAgPSB0cnVlOwotCSAgYWRkZW5kID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Z3AgLSBncDsKLQkgIGdwX3VzZWRwID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0xJVFVTRToKLQkgIC8qIFNlZSBBTFBIQV9SX0xJVEVSQUwgYWJvdmUgZm9yIHRoZSB1c2VzIG9mIHRoaXMgcmVsb2MuICBJdAotCSAgICAgZG9lcyBub3QgY2F1c2UgYW55dGhpbmcgdG8gaGFwcGVuLCBpdHNlbGYuICAqLwotCSAgYnJlYWs7Ci0JICAgIAotCWNhc2UgQUxQSEFfUl9HUERJU1A6Ci0JICAvKiBUaGlzIG1hcmtzIHRoZSBsZGFoIG9mIGFuIGxkYWgvbGRhIHBhaXIgd2hpY2ggbG9hZHMgdGhlCi0JICAgICBncCByZWdpc3RlciB3aXRoIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSBncCB2YWx1ZSBhbmQgdGhlCi0JICAgICBjdXJyZW50IGxvY2F0aW9uLiAgVGhlIHNlY29uZCBvZiB0aGUgcGFpciBpcyByX3N5bW5keAotCSAgICAgYnl0ZXMgYWhlYWQuICBJdCB1c2VkIHRvIGJlIG1hcmtlZCB3aXRoIGFuIEFMUEhBX1JfSUdOT1JFCi0JICAgICByZWxvYywgYnV0IE9TRi8xIDMuMiBubyBsb25nZXIgZG9lcyB0aGF0LiAgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgbG9uZyBpbnNuMSwgaW5zbjI7Ci0KLQkgICAgLyogR2V0IHRoZSB0d28gaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgaW5zbjEgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgaW5zbjIgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJKGNvbnRlbnRzCi0JCQkJICsgcl92YWRkcgotCQkJCSAtIGlucHV0X3NlY3Rpb24tPnZtYQotCQkJCSArIHJfc3ltbmR4KSk7Ci0KLQkgICAgQkZEX0FTU0VSVCAoKChpbnNuMSA+PiAyNikgJiAweDNmKSA9PSAweDA5KTsgLyogbGRhaCAqLwotCSAgICBCRkRfQVNTRVJUICgoKGluc24yID4+IDI2KSAmIDB4M2YpID09IDB4MDgpOyAvKiBsZGEgKi8KLQotCSAgICAvKiBHZXQgdGhlIGV4aXN0aW5nIGFkZGVuZC4gIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIHNpZ24KLQkgICAgICAgZXh0ZW5zaW9uIGRvbmUgYnkgbGRhIGFuZCBsZGFoLiAgKi8KLQkgICAgYWRkZW5kID0gKChpbnNuMSAmIDB4ZmZmZikgPDwgMTYpICsgKGluc24yICYgMHhmZmZmKTsKLQkgICAgaWYgKGluc24xICYgMHg4MDAwKQotCSAgICAgIHsKLQkJLyogVGhpcyBpcyBhZGRlbmQgLT0gMHgxMDAwMDAwMDAgd2l0aG91dCBjYXVzaW5nIGFuCi0JCSAgIGludGVnZXIgb3ZlcmZsb3cgb24gYSAzMiBiaXQgaG9zdC4gICovCi0JCWFkZGVuZCAtPSAweDgwMDAwMDAwOwotCQlhZGRlbmQgLT0gMHg4MDAwMDAwMDsKLQkgICAgICB9Ci0JICAgIGlmIChpbnNuMiAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgLT0gMHgxMDAwMDsKLQotCSAgICAvKiBUaGUgZXhpc3RpbmcgYWRkZW5kIGluY2x1ZGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi0JICAgICAgIGdwIG9mIHRoZSBpbnB1dCBCRkQgYW5kIHRoZSBhZGRyZXNzIGluIHRoZSBpbnB1dCBCRkQuCi0JICAgICAgIFdlIHdhbnQgdG8gY2hhbmdlIHRoaXMgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKLQkgICAgICAgZmluYWwgR1AgYW5kIHRoZSBmaW5hbCBhZGRyZXNzLiAgKi8KLQkgICAgYWRkZW5kICs9IChncAotCQkgICAgICAgLSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncAotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KSk7Ci0KLQkgICAgLyogQ2hhbmdlIHRoZSBpbnN0cnVjdGlvbnMsIGFjY291bnRpbmcgZm9yIHRoZSBzaWduCi0JICAgICAgIGV4dGVuc2lvbiwgYW5kIHdyaXRlIHRoZW0gb3V0LiAgKi8KLQkgICAgaWYgKGFkZGVuZCAmIDB4ODAwMCkKLQkgICAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQkgICAgaW5zbjEgPSAoaW5zbjEgJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZik7Ci0JICAgIGluc24yID0gKGluc24yICYgMHhmZmZmMDAwMCkgfCAoYWRkZW5kICYgMHhmZmZmKTsKLQotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuMSwKLQkJCWNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGJmZF92bWEpIGluc24yLAotCQkJY29udGVudHMgKyByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgcl9zeW1uZHgpOwotCi0JICAgIGdwX3VzZWRwID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0JY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0JY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0JICAvKiBNYW5pcHVsYXRlIHZhbHVlcyBvbiB0aGUgcmVsb2MgZXZhbHVhdGlvbiBzdGFjay4gIFRoZQotCSAgICAgcl92YWRkciBmaWVsZCBpcyBub3QgYW4gYWRkcmVzcyBpbiBpbnB1dF9zZWN0aW9uLCBpdCBpcwotCSAgICAgdGhlIGN1cnJlbnQgdmFsdWUgKGluY2x1ZGluZyBhbnkgYWRkZW5kKSBvZiB0aGUgb2JqZWN0Ci0JICAgICBiZWluZyB1c2VkLiAgKi8KLQkgIGlmICghIHJfZXh0ZXJuKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnM7Ci0KLQkgICAgICBzID0gc3ltbmR4X3RvX3NlY3Rpb25bcl9zeW1uZHhdOwotCSAgICAgIGlmIChzID09IChhc2VjdGlvbiAqKSBOVUxMKQotCQlhYm9ydCAoKTsKLQkgICAgICBhZGRlbmQgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCAtIHMtPnZtYTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4XTsKLQkgICAgICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQlhYm9ydCAoKTsKLQotCSAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJewotCQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICBhZGRlbmQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBwYXNzIHRoZSBhZGRyZXNzIGFzIDAsIHNpbmNlIHdlCi0JCQkgZG8gbm90IGhhdmUgYSBtZWFuaW5nZnVsIG51bWJlciBmb3IgdGhlCi0JCQkgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uIHRoYXQgaXMgYmVpbmcKLQkJCSByZWxvY2F0ZWQuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCAoYmZkX3ZtYSkgMCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBhZGRlbmQgPSAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICAmJiBoLT5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICBQYXNzCi0JCQkgdGhlIGFkZHJlc3MgYXMgMCwgYXMgd2l0aCB1bmRlZmluZWRfc3ltYm9sLAotCQkJIGFib3ZlLiAgKi8KLQkJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgKGJmZF92bWEpIDApKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIGFkZGVuZCA9IGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCQkJIGlucHV0X2JmZCwKLQkJCQkJCQkgZXh0X3JlbCwgaCk7Ci0JCX0KLQkgICAgfQotCi0JICBhZGRlbmQgKz0gcl92YWRkcjsKLQotCSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIC8qIEFkanVzdCByX3ZhZGRyIGJ5IHRoZSBhZGRlbmQuICAqLwotCSAgICAgIGJmZF9oX3B1dF82NCAoaW5wdXRfYmZkLCBhZGRlbmQsCi0JCQkgICAgKGJmZF9ieXRlICopIGV4dF9yZWwtPnJfdmFkZHIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHJfdHlwZSkKLQkJewotCQljYXNlIEFMUEhBX1JfT1BfUFVTSDoKLQkJICBpZiAodG9zID49IFJFTE9DX1NUQUNLU0laRSkKLQkJICAgIGFib3J0ICgpOwotCQkgIHN0YWNrW3RvcysrXSA9IGFkZGVuZDsKLQkJICBicmVhazsKLQotCQljYXNlIEFMUEhBX1JfT1BfUFNVQjoKLQkJICBpZiAodG9zID09IDApCi0JCSAgICBhYm9ydCAoKTsKLQkJICBzdGFja1t0b3MgLSAxXSAtPSBhZGRlbmQ7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0JCSAgaWYgKHRvcyA9PSAwKQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgc3RhY2tbdG9zIC0gMV0gPj49IGFkZGVuZDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGFkanVzdF9hZGRycCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIEFMUEhBX1JfT1BfU1RPUkU6Ci0JICAvKiBTdG9yZSBhIHZhbHVlIGZyb20gdGhlIHJlbG9jIHN0YWNrIGludG8gYSBiaXRmaWVsZC4gIElmCi0JICAgICB3ZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbGwgd2UgZG8gaXMKLQkgICAgIGFkanVzdCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2MuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBtYXNrOwotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgaWYgKHRvcyA9PSAwKQotCQlhYm9ydCAoKTsKLQotCSAgICAgIC8qIEdldCB0aGUgcmVsb2NhdGlvbiBtYXNrLiAgVGhlIHNlcGFyYXRlIHN0ZXBzIGFuZCB0aGUKLQkJIGNhc3RzIHRvIGJmZF92bWEgYXJlIGF0dGVtcHRzIHRvIGF2b2lkIGEgYnVnIGluIHRoZQotCQkgQWxwaGEgT1NGIDEuMyBDIGNvbXBpbGVyLiAgU2VlIHJlbG9jLmMgZm9yIG1vcmUKLQkJIGRldGFpbHMuICAqLwotCSAgICAgIG1hc2sgPSAxOwotCSAgICAgIG1hc2sgPDw9IChiZmRfdm1hKSByX3NpemU7Ci0JICAgICAgbWFzayAtPSAxOwotCi0JICAgICAgLyogRklYTUU6IEkgZG9uJ3Qga25vdyB3aGF0IGtpbmQgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcsCi0JCSBpZiBhbnksIHNob3VsZCBiZSBkb25lIGhlcmUuICAqLwotCSAgICAgIHZhbCA9IGJmZF9nZXRfNjQgKGlucHV0X2JmZCwKLQkJCQljb250ZW50cyArIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICAgIHZhbCAmPX4gbWFzayA8PCAoYmZkX3ZtYSkgcl9vZmZzZXQ7Ci0JICAgICAgdmFsIHw9IChzdGFja1stLXRvc10gJiBtYXNrKSA8PCAoYmZkX3ZtYSkgcl9vZmZzZXQ7Ci0JICAgICAgYmZkX3B1dF82NCAoaW5wdXRfYmZkLCB2YWwsCi0JCQkgIGNvbnRlbnRzICsgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX0dQVkFMVUU6Ci0JICAvKiBJIHJlYWxseSBkb24ndCBrbm93IGlmIHRoaXMgZG9lcyB0aGUgcmlnaHQgdGhpbmcuICAqLwotCSAgZ3AgPSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5ncCArIHJfc3ltbmR4OwotCSAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY2F0ZXApCi0JewotCSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0JICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQkgIGFzZWN0aW9uICpzID0gTlVMTDsKLQkgIGJmZF92bWEgcmVsb2NhdGlvbjsKLQkgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0JICAvKiBQZXJmb3JtIGEgcmVsb2NhdGlvbi4gICovCi0KLQkgIGhvd3RvID0gJmFscGhhX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0KLQkgIGlmIChyX2V4dGVybikKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4XTsKLQkgICAgICAvKiBJZiBoIGlzIE5VTEwsIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHJlbG9jCi0JCSBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCB3aGljaCB3ZSB0aG91Z2h0IHdhcyBqdXN0Ci0JCSBhIGRlYnVnZ2luZyBzeW1ib2wuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgICAgICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQlhYm9ydCAoKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHJfc3ltbmR4ID49IE5VTV9SRUxPQ19TRUNUSU9OUykKLQkJcyA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQlzID0gc3ltbmR4X3RvX3NlY3Rpb25bcl9zeW1uZHhdOwotCi0JICAgICAgaWYgKHMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCWFib3J0ICgpOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgbXVzdAotCQkgY29udmVydCB0aGUgZXhpc3RpbmcgcmVsb2MuICAqLwotCSAgICAgIGlmIChyX2V4dGVybikKLQkJewotCQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICAgICAgJiYgaC0+aW5keCA9PSAtMSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBzeW1ib2wgaXMgbm90IGJlaW5nIHdyaXR0ZW4gb3V0LiAgKi8KLQkJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgcmVsb2NhdGlvbiA9IGFscGhhX2NvbnZlcnRfZXh0ZXJuYWxfcmVsb2MgKG91dHB1dF9iZmQsCi0JCQkJCQkJICAgICBpbmZvLAotCQkJCQkJCSAgICAgaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgZXh0X3JlbCwKLQkJCQkJCQkgICAgIGgpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIHNlY3Rpb24uICBBZGp1c3QKLQkJICAgICB0aGUgdmFsdWUgYnkgdGhlIGFtb3VudCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJLSBzLT52bWEpOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIFBDIHJlbGF0aXZlLCB0aGUgZXhpc3Rpbmcgb2JqZWN0IGZpbGUKLQkJIGFwcGVhcnMgdG8gYWxyZWFkeSBoYXZlIHRoZSByZWxvYyB3b3JrZWQgb3V0LiAgV2UKLQkJIG11c3Qgc3VidHJhY3Qgb3V0IHRoZSBvbGQgdmFsdWUgYW5kIGFkZCBpbiB0aGUgbmV3Ci0JCSBvbmUuICAqLwotCSAgICAgIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0JCXJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgICAgICAvKiBQdXQgaW4gYW55IGFkZGVuZC4gICovCi0JICAgICAgcmVsb2NhdGlvbiArPSBhZGRlbmQ7Ci0KLQkgICAgICAvKiBBZGp1c3QgdGhlIGNvbnRlbnRzLiAgKi8KLQkgICAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkJICAoY29udGVudHMKLQkJCQkJICAgKyByX3ZhZGRyCi0JCQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBwcm9kdWNpbmcgYSBmaW5hbCBleGVjdXRhYmxlLiAgKi8KLQkgICAgICBpZiAocl9leHRlcm4pCi0JCXsKLQkJICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbC4gICovCi0JCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgIHsKLQkJICAgICAgYXNlY3Rpb24gKmhzZWM7Ci0KLQkJICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkJICAgICsgaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICAgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHNlY3Rpb24uICAqLwotCQkgIHJlbG9jYXRpb24gPSAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgcy0+b3V0cHV0X29mZnNldAotCQkJCS0gcy0+dm1hKTsKLQotCQkgIC8qIEFkanVzdCBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gYnkgcmVtb3ZpbmcgdGhlCi0JCSAgICAgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2Ugc2VjdGlvbi4gICovCi0JCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJICAgIHJlbG9jYXRpb24gKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCQl9Ci0KLQkgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywKLQkJCQkJICAgIGlucHV0X2JmZCwKLQkJCQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywKLQkJCQkJICAgIHJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCSAgICByZWxvY2F0aW9uLAotCQkJCQkgICAgYWRkZW5kKTsKLQkgICAgfQotCi0JICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHIpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkJICBhYm9ydCAoKTsKLQkJY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgICAgaWYgKHJfZXh0ZXJuKQotCQkgICAgICBuYW1lID0gc3ltX2hhc2hlc1tyX3N5bW5keF0tPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgICBzeW1uZHhfdG9fc2VjdGlvbltyX3N5bW5keF0pOwotCQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCSAgIChpbmZvLCBuYW1lLCBhbHBoYV9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsCi0JCQkgICAgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICByX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSAmJiBhZGp1c3RfYWRkcnApCi0JewotCSAgLyogQ2hhbmdlIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uLiAgKi8KLQkgIGJmZF9oX3B1dF82NCAoaW5wdXRfYmZkLAotCQkJKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAtIGlucHV0X3NlY3Rpb24tPnZtYQotCQkJICsgcl92YWRkciksCi0JCQkoYmZkX2J5dGUgKikgZXh0X3JlbC0+cl92YWRkcik7Ci0JfQotCi0gICAgICBpZiAoZ3BfdXNlZHAgJiYgZ3BfdW5kZWZpbmVkKQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgKGluZm8sIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBHUCBub3QgZGVmaW5lZCIpLAotCQkgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBPbmx5IGdpdmUgdGhlIGVycm9yIG9uY2UgcGVyIGxpbmsuICAqLwotCSAgZ3AgPSA0OwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHRvcyAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRG8gZmluYWwgYWRqdXN0bWVudHMgdG8gdGhlIGZpbGVoZHIgYW5kIHRoZSBhb3V0aGRyLiAgVGhpcyByb3V0aW5lCi0gICBzZXRzIHRoZSBkeW5hbWljIGJpdHMgaW4gdGhlIGZpbGUgaGVhZGVyLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotYWxwaGFfYWRqdXN0X2hlYWRlcnMgKGFiZmQsIGZoZHIsIGFoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZoZHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICphaGRyOwotewotICBpZiAoKGFiZmQtPmZsYWdzICYgKERZTkFNSUMgfCBFWEVDX1ApKSA9PSAoRFlOQU1JQyB8IEVYRUNfUCkpCi0gICAgZmhkci0+Zl9mbGFncyB8PSBGX0FMUEhBX0NBTExfU0hBUkVEOwotICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIGZoZHItPmZfZmxhZ3MgfD0gRl9BTFBIQV9TSEFSQUJMRTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBcmNoaXZlIGhhbmRsaW5nLiAgSW4gT1NGLzEgKG9yIERpZ2l0YWwgVW5peCkgdjMuMiwgRGlnaXRhbAotICAgaW50cm9kdWNlZCBhcmNoaXZlIHBhY2tpbmcsIGluIHdoaWNoIHRoZSBlbGVtZW50cyBpbiBhbiBhcmNoaXZlIGFyZQotICAgb3B0aW9uYWxseSBjb21wcmVzc2VkIHVzaW5nIGEgc2ltcGxlIGRpY3Rpb25hcnkgc2NoZW1lLiAgV2Uga25vdwotICAgaG93IHRvIHJlYWQgc3VjaCBhcmNoaXZlcywgYnV0IHdlIGRvbid0IHdyaXRlIHRoZW0uICAqLwotCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX3NsdXJwX2FybWFwIF9iZmRfZWNvZmZfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYWxwaGFfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBhbHBoYV9lY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfZWNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSNkZWZpbmUgYWxwaGFfZWNvZmZfdHJ1bmNhdGVfYXJuYW1lIF9iZmRfZWNvZmZfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIGFscGhhX2Vjb2ZmX3dyaXRlX2FybWFwIF9iZmRfZWNvZmZfd3JpdGVfYXJtYXAKLSNkZWZpbmUgYWxwaGFfZWNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IF9iZmRfZWNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIGFscGhhX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgX2JmZF9lY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi0KLS8qIEEgY29tcHJlc3NlZCBmaWxlIHVzZXMgdGhpcyBpbnN0ZWFkIG9mIEFSRk1BRy4gICovCi0KLSNkZWZpbmUgQVJGWk1BRyAiWlwwMTIiCi0KLS8qIFJlYWQgYW4gYXJjaGl2ZSBoZWFkZXIuICBUaGlzIGlzIGxpa2UgdGhlIHN0YW5kYXJkIHJvdXRpbmUsIGJ1dCBpdAotICAgYWxzbyBhY2NlcHRzIEFSRlpNQUcuICAqLwotCi1zdGF0aWMgUFRSCi1hbHBoYV9lY29mZl9yZWFkX2FyX2hkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJlbHRkYXRhICpyZXQ7Ci0gIHN0cnVjdCBhcl9oZHIgKmg7Ci0KLSAgcmV0ID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyAoYWJmZCwgQVJGWk1BRyk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBoID0gKHN0cnVjdCBhcl9oZHIgKikgcmV0LT5hcmNoX2hlYWRlcjsKLSAgaWYgKHN0cm5jbXAgKGgtPmFyX2ZtYWcsIEFSRlpNQUcsIDIpID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYWJbOF07Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBjb21wcmVzc2VkIGZpbGUuICBXZSBtdXN0IHNldCB0aGUgc2l6ZSBjb3JyZWN0bHkuCi0gICAgICAgICBUaGUgc2l6ZSBpcyB0aGUgZWlnaHQgYnl0ZXMgYWZ0ZXIgdGhlIGR1bW15IGZpbGUgaGVhZGVyLiAgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgRklMSFNaLCBTRUVLX0NVUikgIT0gMAotCSAgfHwgYmZkX3JlYWQgKGFiLCAxLCA4LCBhYmZkKSAhPSA4Ci0JICB8fCBiZmRfc2VlayAoYWJmZCwgLSAoRklMSFNaICsgOCksIFNFRUtfQ1VSKSAhPSAwKQotCXJldHVybiBOVUxMOwotCi0gICAgICByZXQtPnBhcnNlZF9zaXplID0gYmZkX2hfZ2V0XzY0IChhYmZkLCBhYik7Ci0gICAgfQotCi0gIHJldHVybiAoUFRSKSByZXQ7Ci19Ci0KLS8qIEdldCBhbiBhcmNoaXZlIGVsZW1lbnQgYXQgYSBzcGVjaWZpZWQgZmlsZSBwb3NpdGlvbi4gIFRoaXMgaXMgd2hlcmUKLSAgIHdlIHVuY29tcHJlc3MgdGhlIGFyY2hpdmUgZWxlbWVudCBpZiBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgYmZkICoKLWFscGhhX2Vjb2ZmX2dldF9lbHRfYXRfZmlsZXBvcyAoYXJjaGl2ZSwgZmlsZXBvcykKLSAgICAgYmZkICphcmNoaXZlOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBiZmQgKm5iZmQgPSBOVUxMOwotICBzdHJ1Y3QgYXJlbHRkYXRhICp0ZGF0YTsKLSAgc3RydWN0IGFyX2hkciAqaGRyOwotICBiZmRfYnl0ZSBhYls4XTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBiZmRfYnl0ZSAqYnVmLCAqcDsKLSAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbTsKLQotICBuYmZkID0gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVwb3MpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICgobmJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBleHBhbmRlZCB0aGlzIEJGRC4gICovCi0gICAgICByZXR1cm4gbmJmZDsKLSAgICB9Ci0KLSAgdGRhdGEgPSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBuYmZkLT5hcmVsdF9kYXRhOwotICBoZHIgPSAoc3RydWN0IGFyX2hkciAqKSB0ZGF0YS0+YXJjaF9oZWFkZXI7Ci0gIGlmIChzdHJuY21wIChoZHItPmFyX2ZtYWcsIEFSRlpNQUcsIDIpICE9IDApCi0gICAgcmV0dXJuIG5iZmQ7Ci0KLSAgLyogV2UgbXVzdCB1bmNvbXByZXNzIHRoaXMgZWxlbWVudC4gIFdlIGRvIHRoaXMgYnkgY29weWluZyBpdCBpbnRvIGEKLSAgICAgbWVtb3J5IGJ1ZmZlciwgYW5kIG1ha2luZyBiZmRfcmVhZCBhbmQgYmZkX3NlZWsgdXNlIHRoYXQgYnVmZmVyLgotICAgICBUaGlzIGNhbiB1c2UgYSBsb3Qgb2YgbWVtb3J5LCBidXQgaXQncyBzaW1wbGVyIHRoYW4gZ2V0dGluZyBhCi0gICAgIHRlbXBvcmFyeSBmaWxlLCBtYWtpbmcgdGhhdCB3b3JrIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBjYWNoaW5nCi0gICAgIGNvZGUsIGFuZCBtYWtpbmcgc3VyZSB0aGF0IGl0IGlzIGRlbGV0ZWQgYXQgYWxsIGFwcHJvcHJpYXRlCi0gICAgIHRpbWVzLiAgSXQgY2FuIGJlIGNoYW5nZWQgaWYgaXQgZXZlciBiZWNvbWVzIGltcG9ydGFudC4gICovCi0KLSAgLyogVGhlIGNvbXByZXNzZWQgZmlsZSBzdGFydHMgd2l0aCBhIGR1bW15IEVDT0ZGIGZpbGUgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChuYmZkLCBGSUxIU1osIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBuZXh0IGVpZ2h0IGJ5dGVzIGFyZSB0aGUgcmVhbCBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3JlYWQgKGFiLCAxLCA4LCBuYmZkKSAhPSA4KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBzaXplID0gYmZkX2hfZ2V0XzY0IChuYmZkLCBhYik7Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICBidWYgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsZWZ0OwotICAgICAgYmZkX2J5dGUgZGljdFs0MDk2XTsKLSAgICAgIHVuc2lnbmVkIGludCBoOwotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAobmJmZCwgc2l6ZSk7Ci0gICAgICBpZiAoYnVmID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBwID0gYnVmOwotCi0gICAgICBsZWZ0ID0gc2l6ZTsKLQotICAgICAgLyogSSBkb24ndCBrbm93IHdoYXQgdGhlIG5leHQgZWlnaHQgYnl0ZXMgYXJlIGZvci4gKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoYWIsIDEsIDgsIG5iZmQpICE9IDgpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIHVuY29tcHJlc3Npb24gYWxnb3JpdGhtLiAgSXQncyBhIHNpbXBsZQotCSBkaWN0aW9uYXJ5IGJhc2VkIHNjaGVtZSBpbiB3aGljaCBlYWNoIGNoYXJhY3RlciBpcyBwcmVkaWN0ZWQKLQkgYnkgYSBoYXNoIG9mIHRoZSBwcmV2aW91cyB0aHJlZSBjaGFyYWN0ZXJzLiAgQSBjb250cm9sIGJ5dGUKLQkgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBwcmVkaWN0ZWQgb3Igd2hldGhlciBpdAotCSBhcHBlYXJzIGluIHRoZSBpbnB1dCBzdHJlYW07IGVhY2ggY29udHJvbCBieXRlIG1hbmFnZXMgdGhlCi0JIG5leHQgZWlnaHQgYnl0ZXMgaW4gdGhlIG91dHB1dCBzdHJlYW0uICAqLwotICAgICAgbWVtc2V0IChkaWN0LCAwLCBzaXplb2YgZGljdCk7Ci0gICAgICBoID0gMDsKLSAgICAgIHdoaWxlIChiZmRfcmVhZCAoJmIsIDEsIDEsIG5iZmQpID09IDEpCi0JewotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyssIGIgPj49IDEpCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSBuOwotCi0JICAgICAgaWYgKChiICYgMSkgPT0gMCkKLQkJbiA9IGRpY3RbaF07Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgYmZkX3JlYWQgKCZuLCAxLCAxLCBuYmZkKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGRpY3RbaF0gPSBuOwotCQl9Ci0KLQkgICAgICAqcCsrID0gbjsKLQotCSAgICAgIC0tbGVmdDsKLQkgICAgICBpZiAobGVmdCA9PSAwKQotCQlicmVhazsKLQotCSAgICAgIGggPDw9IDQ7Ci0JICAgICAgaCBePSBuOwotCSAgICAgIGggJj0gc2l6ZW9mIGRpY3QgLSAxOwotCSAgICB9Ci0KLQkgIGlmIChsZWZ0ID09IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHRoZSB1bmNvbXByZXNzZWQgZmlsZSBjb250ZW50cyBhcmUgaW4gYnVmLiAgKi8KLSAgYmltID0gKChzdHJ1Y3QgYmZkX2luX21lbW9yeSAqKQotCSBiZmRfYWxsb2MgKG5iZmQsIHNpemVvZiAoc3RydWN0IGJmZF9pbl9tZW1vcnkpKSk7Ci0gIGlmIChiaW0gPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgYmltLT5zaXplID0gc2l6ZTsKLSAgYmltLT5idWZmZXIgPSBidWY7Ci0KLSAgbmJmZC0+bXRpbWVfc2V0ID0gdHJ1ZTsKLSAgbmJmZC0+bXRpbWUgPSBzdHJ0b2wgKGhkci0+YXJfZGF0ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLQotICBuYmZkLT5mbGFncyB8PSBCRkRfSU5fTUVNT1JZOwotICBuYmZkLT5pb3N0cmVhbSA9IChQVFIpIGJpbTsKLSAgQkZEX0FTU0VSVCAoISBuYmZkLT5jYWNoZWFibGUpOwotCi0gIHJldHVybiBuYmZkOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAobmJmZCAhPSBOVUxMKQotICAgIGJmZF9jbG9zZSAobmJmZCk7Ci0gIHJldHVybiBOVUxMOyAgCi19Ci0KLS8qIE9wZW4gdGhlIG5leHQgYXJjaGl2ZWQgZmlsZS4gICovCi0KLXN0YXRpYyBiZmQgKgotYWxwaGFfZWNvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoaXZlLCBsYXN0X2ZpbGUpCi0gICAgIGJmZCAqYXJjaGl2ZTsKLSAgICAgYmZkICpsYXN0X2ZpbGU7Ci17Ci0gIGZpbGVfcHRyIGZpbGVzdGFydDsKLQotICBpZiAobGFzdF9maWxlID09IE5VTEwpCi0gICAgZmlsZXN0YXJ0ID0gYmZkX2FyZGF0YSAoYXJjaGl2ZSktPmZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBhcmVsdGRhdGEgKnQ7Ci0gICAgICBzdHJ1Y3QgYXJfaGRyICpoOwotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gICAgICAvKiBXZSBjYW4ndCB1c2UgYXJlbHRfc2l6ZSBoZXJlLCBiZWNhdXNlIHRoYXQgdXNlcyBwYXJzZWRfc2l6ZSwKLSAgICAgICAgIHdoaWNoIGlzIHRoZSB1bmNvbXByZXNzZWQgc2l6ZS4gIFdlIG5lZWQgdGhlIGNvbXByZXNzZWQgc2l6ZS4gICovCi0gICAgICB0ID0gKHN0cnVjdCBhcmVsdGRhdGEgKikgbGFzdF9maWxlLT5hcmVsdF9kYXRhOwotICAgICAgaCA9IChzdHJ1Y3QgYXJfaGRyICopIHQtPmFyY2hfaGVhZGVyOwotICAgICAgc2l6ZSA9IHN0cnRvbCAoaC0+YXJfc2l6ZSwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLQotICAgICAgLyogUGFkIHRvIGFuIGV2ZW4gYm91bmRhcnkuLi4KLQkgTm90ZSB0aGF0IGxhc3RfZmlsZS0+b3JpZ2luIGNhbiBiZSBvZGQgaW4gdGhlIGNhc2Ugb2YKLQkgQlNELTQuNC1zdHlsZSBlbGVtZW50IHdpdGggYSBsb25nIG9kZCBzaXplLiAqLwotICAgICAgZmlsZXN0YXJ0ID0gbGFzdF9maWxlLT5vcmlnaW4gKyBzaXplOwotICAgICAgZmlsZXN0YXJ0ICs9IGZpbGVzdGFydCAlIDI7Ci0gICAgfQotCi0gIHJldHVybiBhbHBoYV9lY29mZl9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVzdGFydCk7Ci19Ci0KLS8qIE9wZW4gdGhlIGFyY2hpdmUgZmlsZSBnaXZlbiBhbiBpbmRleCBpbnRvIHRoZSBhcm1hcC4gICovCi0KLXN0YXRpYyBiZmQgKgotYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9pbmRleCAoYWJmZCwgaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3ltaW5kZXggaW5kZXg7Ci17Ci0gIGNhcnN5bSAqZW50cnk7Ci0KLSAgZW50cnkgPSBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyArIGluZGV4OwotICByZXR1cm4gYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zIChhYmZkLCBlbnRyeS0+ZmlsZV9vZmZzZXQpOwotfQotDAotLyogVGhpcyBpcyB0aGUgRUNPRkYgYmFja2VuZCBzdHJ1Y3R1cmUuICBUaGUgYmFja2VuZCBmaWVsZCBvZiB0aGUKLSAgIHRhcmdldCB2ZWN0b3IgcG9pbnRzIHRvIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSBhbHBoYV9lY29mZl9iYWNrZW5kX2RhdGEgPQotewotICAvKiBDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KLSAgewotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKSBiZmRfdm9pZCwgLyogYXV4X2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9pbiAqLwotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9faW4gKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpYmZkX3ZvaWQsLyphdXhfb3V0Ki8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHJlbG9jX291dCAqLwotICAgIGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9vdXQsIGFscGhhX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQsCi0gICAgYWxwaGFfZWNvZmZfc3dhcF9zY25oZHJfb3V0LAotICAgIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIDAsIDAsIDAsIDAsIHRydWUsIGZhbHNlLCA0LAotICAgIGFscGhhX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbiwgYWxwaGFfZWNvZmZfc3dhcF9hb3V0aGRyX2luLAotICAgIGFscGhhX2Vjb2ZmX3N3YXBfc2NuaGRyX2luLCBOVUxMLAotICAgIGFscGhhX2Vjb2ZmX2JhZF9mb3JtYXRfaG9vaywgX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gICAgYWxwaGFfZWNvZmZfbWtvYmplY3RfaG9vaywgX2JmZF9lY29mZl9zdHlwX3RvX3NlY19mbGFncywKLSAgICBfYmZkX2Vjb2ZmX3NldF9hbGlnbm1lbnRfaG9vaywgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICB9LAotICAvKiBTdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgYmZkX2FyY2hfYWxwaGEsCi0gIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLwotICAiX19fX19fX182NCIsCi0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgMHgyMDAwLAotICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBNSVBTLiAgKi8KLSAgdHJ1ZSwKLSAgLyogQml0c2l6ZSBvZiBjb25zdHJ1Y3RvciBlbnRyaWVzLiAgKi8KLSAgNjQsCi0gIC8qIFJlbG9jIHRvIHVzZSBmb3IgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gICZhbHBoYV9ob3d0b190YWJsZVtBTFBIQV9SX1JFRlFVQURdLAotICB7Ci0gICAgLyogU3ltYm9sIHRhYmxlIG1hZ2ljIG51bWJlci4gICovCi0gICAgbWFnaWNTeW0yLAotICAgIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgICA4LAotICAgIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBwZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBmZHJfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBpbiBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgICBlY29mZl9zd2FwX3Bkcl9pbiwKLSAgICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgICBlY29mZl9zd2FwX29wdF9pbiwKLSAgICBlY29mZl9zd2FwX2Zkcl9pbiwKLSAgICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luLAotICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAgIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBlY29mZl9zd2FwX2hkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICAgIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgICBlY29mZl9zd2FwX3N5bV9vdXQsCi0gICAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgICBlY29mZl9zd2FwX3JmZF9vdXQsCi0gICAgZWNvZmZfc3dhcF9leHRfb3V0LAotICAgIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICAgIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dCwKLSAgICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICAgIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9saWNfaW5mbwotICB9LAotICAvKiBFeHRlcm5hbCByZWxvYyBzaXplLiAgKi8KLSAgUkVMU1osCi0gIC8qIFJlbG9jIHN3YXBwaW5nIGZ1bmN0aW9ucy4gICovCi0gIGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2NfaW4sCi0gIGFscGhhX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0LAotICAvKiBCYWNrZW5kIHJlbG9jIHR3ZWFraW5nLiAgKi8KLSAgYWxwaGFfYWRqdXN0X3JlbG9jX2luLAotICBhbHBoYV9hZGp1c3RfcmVsb2Nfb3V0LAotICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLwotICBhbHBoYV9yZWxvY2F0ZV9zZWN0aW9uLAotICAvKiBEbyBmaW5hbCBhZGp1c3RtZW50cyB0byBmaWxlaGRyIGFuZCBhb3V0aGRyLiAgKi8KLSAgYWxwaGFfYWRqdXN0X2hlYWRlcnMsCi0gIC8qIFJlYWQgYW4gZWxlbWVudCBmcm9tIGFuIGFyY2hpdmUgYXQgYSBnaXZlbiBmaWxlIHBvc2l0aW9uLiAgKi8KLSAgYWxwaGFfZWNvZmZfZ2V0X2VsdF9hdF9maWxlcG9zCi19OwotCi0vKiBMb29raW5nIHVwIGEgcmVsb2MgdHlwZSBpcyBBbHBoYSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIGFscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBTbyBpcyBnZXR0aW5nIHJlbG9jYXRlZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYWxwaGFfZWNvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIEhhbmRsaW5nIGZpbGUgd2luZG93cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIFJlbGF4aW5nIHNlY3Rpb25zIGlzIGdlbmVyaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQotY29uc3QgYmZkX3RhcmdldCBlY29mZmFscGhhX2xpdHRsZV92ZWMgPQotewotICAiZWNvZmYtbGl0dGxlYWxwaGEiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IERZTkFNSUMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBhbHBoYV9lY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKGFscGhhX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAmYWxwaGFfZWNvZmZfYmFja2VuZF9kYXRhCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXBvbGxvLmMgYi9iZmQvY29mZi1hcG9sbG8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZWM4OS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hcG9sbG8uYworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFwb2xsbyA2ODAwMCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEJ5IFRyb3kgUm9sbG8gKHRyb3lAY2JtZS51bnN3LmVkdS5hdSkKLSAgIEJhc2VkIG9uIG02OGsgc3RhbmRhcmQgQ09GRiB2ZXJzaW9uIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvYXBvbGxvLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlW107Ci0jZWxzZQotcmVsb2NfaG93dG9fdHlwZSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HX05FRywJICAgICAgIDAsICAtMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICItMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2lmbmRlZiBCQURNQUcKLSNkZWZpbmUgQkFETUFHKHgpIE02OEtCQURNQUcoeCkKLSNlbmRpZgotI2RlZmluZSBBUE9MTE9fTTY4IDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNpZmRlZiBPTkxZX0RFQ0xBUkVfUkVMT0NTCi1leHRlcm4gdm9pZCBhcG9sbG9fcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqaW50ZXJuYWwsIGludCByZWxvY2VudHJ5KSk7Ci1leHRlcm4gaW50IGFwb2xsb19ob3d0bzJydHlwZSBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKLSNlbHNlCi12b2lkCi1hcG9sbG9fcnR5cGUyaG93dG8oaW50ZXJuYWwsIHJlbG9jZW50cnkpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBpbnQgcmVsb2NlbnRyeTsKLXsKLSAgc3dpdGNoIChyZWxvY2VudHJ5KSAKLSAgewotICAgY2FzZSBSX1JFTEJZVEU6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAwOyBicmVhazsKLSAgIGNhc2UgUl9SRUxXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgMTsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDI7IGJyZWFrOwotICAgY2FzZSBSX1BDUkJZVEU6CWludGVybmFsLT5ob3d0byA9IGFwb2xsb2NvZmZfaG93dG9fdGFibGUgKyAzOyBicmVhazsKLSAgIGNhc2UgUl9QQ1JXT1JEOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNDsgYnJlYWs7Ci0gICBjYXNlIFJfUENSTE9ORzoJaW50ZXJuYWwtPmhvd3RvID0gYXBvbGxvY29mZl9ob3d0b190YWJsZSArIDU7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkdfTkVHOglpbnRlcm5hbC0+aG93dG8gPSBhcG9sbG9jb2ZmX2hvd3RvX3RhYmxlICsgNjsgYnJlYWs7Ci0gIH0KLX0KLQotaW50IAotYXBvbGxvX2hvd3RvMnJ0eXBlIChpbnRlcm5hbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaW50ZXJuYWw7Ci17Ci0gIGlmIChpbnRlcm5hbC0+cGNfcmVsYXRpdmUpIAotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCi0gICAgewotICAgICBjYXNlIDMyOiByZXR1cm4gUl9QQ1JMT05HOwotICAgICBjYXNlIDE2OiByZXR1cm4gUl9QQ1JXT1JEOwotICAgICBjYXNlIDg6IHJldHVybiBSX1BDUkJZVEU7Ci0gICAgfQotICB9Ci0gIGVsc2UKLSAgewotICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpCi0gICAgIHsKLSAgICAgIGNhc2UgMzI6IHJldHVybiBSX1JFTExPTkc7Ci0gICAgICBjYXNlIDE2OiByZXR1cm4gUl9SRUxXT1JEOwotICAgICAgY2FzZSA4OiByZXR1cm4gUl9SRUxCWVRFOwotICAgICB9Ci0gIH0KLSAgcmV0dXJuIFJfUkVMTE9ORzsgICAgCi19Ci0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgXAotICBhcG9sbG9fcnR5cGUyaG93dG8oaW50ZXJuYWwsIChyZWxvY2VudHJ5KS0+cl90eXBlKQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhleHRlcm5hbCwgaW50ZXJuYWwpIFwKLSAgZXh0ZXJuYWwucl90eXBlID0gYXBvbGxvX2hvd3RvMnJ0eXBlKGludGVybmFsKTsKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgCi0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIGFwb2xsb2NvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImFwb2xsby1tNjhrIiwJCQkvKiBuYW1lICovCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICdfJywKLSNlbHNlCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2VuZGlmCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUKLSB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXJtLmMgYi9iZmQvY29mZi1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjNTdmZC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDI1NTcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBBUk0gQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2FybS5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIE1hY3JvcyBmb3IgbWFuaXB1bGF0aW9uIHRoZSBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgY29mZiBkYXRhCi0gICBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBBUENTXzI2X0ZMQUcoICAgICAgIGFiZmQgKQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiBGX0FQQ1NfMjYpCi0jZGVmaW5lIEFQQ1NfRkxPQVRfRkxBRyggICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfQVBDU19GTE9BVCkKLSNkZWZpbmUgUElDX0ZMQUcoICAgICAgICAgICBhYmZkICkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9QSUMpCi0jZGVmaW5lIEFQQ1NfU0VUKCAgICAgICAgICAgYWJmZCApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfQVBDU19TRVQpCi0jZGVmaW5lIFNFVF9BUENTX0ZMQUdTKCAgICAgYWJmZCwgZmxncykJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzID0gXAotCQkJCQkoY29mZl9kYXRhIChhYmZkKS0+ZmxhZ3MgJiB+IChGX0FQQ1NfMjYgfCBGX0FQQ1NfRkxPQVQgfCBGX1BJQykpIFwKLQkJCQkJIHwgKGZsZ3MgfCBGX0FQQ1NfU0VUKSkKLSNkZWZpbmUgSU5URVJXT1JLX0ZMQUcoICAgICBhYmZkICkgCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyAmIEZfSU5URVJXT1JLKQotI2RlZmluZSBJTlRFUldPUktfU0VUKCAgICAgIGFiZmQgKSAJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgRl9JTlRFUldPUktfU0VUKQotI2RlZmluZSBTRVRfSU5URVJXT1JLX0ZMQUcoIGFiZmQsIGZsZyApCShjb2ZmX2RhdGEgKGFiZmQpLT5mbGFncyA9IFwKLQkJCQkJKGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzICYgfiBGX0lOVEVSV09SSykgXAotCQkJCQkgfCAoZmxnIHwgRl9JTlRFUldPUktfU0VUKSkKLSAgICAgCi10eXBlZGVmIGVudW0ge2J1bmtub3duLCBiOSwgYjEyLCBiMjN9IHRodW1iX3BjcmVsX2JyYW5jaHR5cGU7Ci0vKiBzb21lIHR5cGVkZWZzIGZvciBob2xkaW5nIGluc3RydWN0aW9ucyAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBpbnNuMzI7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludCBpbnNuMTY7Ci0KLQotICAgICAvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3Igc3R1cGlkIGNvbXBpbGVycy4gICovCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLSAgICAgICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYW91dGFybV9maXhfcGNyZWxfMjZfZG9uZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYW91dGFybV9maXhfcGNyZWxfMjYKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfdGh1bWJfcGNyZWxfMjMKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfdGh1bWJfcGNyZWxfMTIKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfdGh1bWJfcGNyZWxfOQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29mZl9hcm1fcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2FybV9hZGp1c3Rfc3ltbmR4Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkgICBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwJYm9vbGVhbiAqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvIAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKiwKLQkgICB0aHVtYl9wY3JlbF9icmFuY2h0eXBlKSk7Ci1zdGF0aWMgQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqIGNvZmZfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqIGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnNuMzIgaW5zZXJ0X3RodW1iX2JyYW5jaAotICBQQVJBTVMgKChpbnNuMzIsIGludCkpOwotc3RhdGljIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGZpbmRfdGh1bWJfZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBDT05TVCBjaGFyICosIGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogZmluZF9hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBDT05TVCBjaGFyICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCByZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotCi0vKiBUaGUgbGlua2VyIHNjcmlwdCBrbm93cyB0aGUgc2VjdGlvbiBuYW1lcyBmb3IgcGxhY2VtZW50LgotICAgVGhlIGVudHJ5X25hbWVzIGFyZSB1c2VkIHRvIGRvIHNpbXBsZSBuYW1lIG1hbmdsaW5nIG9uIHRoZSBzdHVicy4KLSAgIEdpdmVuIGEgZnVuY3Rpb24gbmFtZSwgYW5kIGl0cyB0eXBlLCB0aGUgc3R1YiBjYW4gYmUgZm91bmQuIFRoZQotICAgbmFtZSBjYW4gYmUgY2hhbmdlZC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhlICVzIGJlIHByZXNlbnQuCi0gICAqLwotICAgCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfN3QiCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX3RodW1iIgotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfNyIKLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fYXJtIgotCi0vKiBVc2VkIGJ5IHRoZSBhc3NlbWJsZXIuICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX2FybV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBzeW12YWx1ZSBkaWZmOwotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgICBpZiAoZGlmZiAhPSAwKQotICAgICAgewotCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLQlzd2l0Y2ggKGhvd3RvLT5zaXplKQotCSAgewotCSAgY2FzZSAwOgotCSAgICB7Ci0JICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE6Ci0JICAgIHsKLQkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgewotCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBJZiBVU0VSX0xBQkVMX1BSRUZJWCBpcyBkZWZpbmVkIGFzICJfIiAoc2VlIGNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUoKQotICAgaW4gdGhpcyBmaWxlKSwgdGhlbiBUQVJHRVRfVU5ERVJTQ09SRSBzaG91bGQgYmUgZGVmaW5lZCwgb3RoZXJ3aXNlIGl0Ci0gICBzaG91bGQgbm90LiAgKi8KLSNpZm5kZWYgVEFSR0VUX1VOREVSU0NPUkUKLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgJ18nCi0jZW5kaWYKLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCB0cnVlCi0jZW5kaWYKLQotLyogVGhlc2UgbW9zdCBjZXJ0YWlubHkgYmVsb25nIHNvbWV3aGVyZSBlbHNlLiBKdXN0IGhhZCB0byBnZXQgcmlkIG9mCi0gICB0aGUgbWFuaWZlc3QgY29uc3RhbnRzIGluIHRoZSBjb2RlLiAqLwotCi0jZGVmaW5lIEFSTV84ICAgICAgICAwCi0jZGVmaW5lIEFSTV8xNiAgICAgICAxCi0jZGVmaW5lIEFSTV8zMiAgICAgICAyCi0jZGVmaW5lIEFSTV8yNiAgICAgICAzCi0jZGVmaW5lIEFSTV9ESVNQOCAgICA0Ci0jZGVmaW5lIEFSTV9ESVNQMTYgICA1Ci0jZGVmaW5lIEFSTV9ESVNQMzIgICA2Ci0jZGVmaW5lIEFSTV8yNkQgICAgICA3Ci0vKiA4IGlzIHVudXNlZCAqLwotI2RlZmluZSBBUk1fTkVHMTYgICAgOQotI2RlZmluZSBBUk1fTkVHMzIgICAxMAotI2RlZmluZSBBUk1fUlZBMzIgICAxMQotI2RlZmluZSBBUk1fVEhVTUI5ICAxMgotI2RlZmluZSBBUk1fVEhVTUIxMiAxMwotI2RlZmluZSBBUk1fVEhVTUIyMyAxNAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0b1tdID0gCi17Ci0gIC8qIHR5cGUgICAgICAgICAgICAgIHJzIHNpemUgYnN6ICBwY3JlbCBiaXRwb3Mgb3ZyZiAgICAgICAgICAgICAgICAgICAgIHNmIG5hbWUgICAgIHBhcnRfaW5wbCByZWFkbWFzayAgc2V0bWFzayAgICBwY2RvbmUgKi8KLSAgSE9XVE8oQVJNXzgsCQkJLyogdHlwZSAqLwotCTAsCQkJLyogcmlnaHRzaGlmdCAqLwotCTAsCQkJLyogc2l6ZSAqLwotCTgsCQkJLyogYml0c2l6ZSAqLwotCWZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JMCwJCQkvKiBiaXRwb3MgKi8KLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQljb2ZmX2FybV9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkiQVJNXzgiLAkJLyogbmFtZSAqLwotICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCTB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCTB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCVBDUkVMT0ZGU0VUCQkvKiBwY3JlbF9vZmZzZXQgKi8pLAotICBIT1dUTyhBUk1fMTYsICAKLQkwLCAKLQkxLCAKLQkxNiwgCi0JZmFsc2UsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNXzE2IiwgCi0JdHJ1ZSwKLQkweDAwMDBmZmZmLAotCTB4MDAwMGZmZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oQVJNXzMyLCAKLQkwLAotCTIsIAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV8zMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oQVJNXzI2LAotCTIsCi0JMiwKLQkyNCwKLQl0cnVlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAotCWFvdXRhcm1fZml4X3BjcmVsXzI2ICwKLQkiQVJNXzI2IiwKLQlmYWxzZSwKLQkweDAwZmZmZmZmLAotCTB4MDBmZmZmZmYsIAotCVBDUkVMT0ZGU0VUKSwKLSAgSE9XVE8oQVJNX0RJU1A4LCAgICAgICAgCi0JMCwKLQkwLAotCTgsIAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fRElTUDgiLCAgCi0JdHJ1ZSwKLQkweDAwMDAwMGZmLAotCTB4MDAwMDAwZmYsCi0JdHJ1ZSksCi0gIEhPV1RPKCBBUk1fRElTUDE2LCAKLQkwLAotCTEsCi0JMTYsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ESVNQMTYiLAotCXRydWUsCi0JMHgwMDAwZmZmZiwKLQkweDAwMDBmZmZmLAotCXRydWUpLAotICBIT1dUTyggQVJNX0RJU1AzMiwKLQkwLAotCTIsCi0JMzIsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgCi0gCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fRElTUDMyIiwKLQl0cnVlLAotCTB4ZmZmZmZmZmYsCi0JMHhmZmZmZmZmZiwKLQl0cnVlKSwKLSAgSE9XVE8oIEFSTV8yNkQsICAKLQkyLCAKLQkyLAotCTI0LAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQlhb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lLCAKLQkiQVJNXzI2RCIsCi0JdHJ1ZSwKLQkweDAwZmZmZmZmLAotCTB4MCwKLQlmYWxzZSksCi0gIC8qIDggaXMgdW51c2VkICovCi0gIHstMX0sCi0gIEhPV1RPKCBBUk1fTkVHMTYsCi0JMCwKLQktMSwKLQkxNiwKLQlmYWxzZSwKLQkwLCAKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQljb2ZmX2FybV9yZWxvYywKLQkiQVJNX05FRzE2IiwKLSAgICAgICAgdHJ1ZSwgCi0JMHgwMDAwZmZmZiwKLQkweDAwMDBmZmZmLCAKLQlmYWxzZSksCi0gIEhPV1RPKCBBUk1fTkVHMzIsIAotCTAsIAotCS0yLAotCTMyLAotCWZhbHNlLAotCTAsCi0JY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JY29mZl9hcm1fcmVsb2MsCi0JIkFSTV9ORUczMiIsCi0gICAgICAgIHRydWUsCi0JMHhmZmZmZmZmZiwKLQkweGZmZmZmZmZmLAotCWZhbHNlKSwKLSAgSE9XVE8oIEFSTV9SVkEzMiwgCi0JMCwKLQkyLCAKLQkzMiwKLQlmYWxzZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWNvZmZfYXJtX3JlbG9jLAotCSJBUk1fUlZBMzIiLAotICAgICAgICB0cnVlLAotCTB4ZmZmZmZmZmYsCi0JMHhmZmZmZmZmZiwKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKCBBUk1fVEhVTUI5LAotCTEsCi0JMSwKLQk4LAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JY29mZl90aHVtYl9wY3JlbF85ICwKLQkiQVJNX1RIVU1COSIsCi0JZmFsc2UsCi0JMHgwMDAwMDBmZiwKLQkweDAwMDAwMGZmLCAKLQlQQ1JFTE9GRlNFVCksCi0gIEhPV1RPKCBBUk1fVEhVTUIxMiwKLQkxLAotCTEsCi0JMTEsCi0JdHJ1ZSwKLQkwLAotCWNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQljb2ZmX3RodW1iX3BjcmVsXzEyICwKLQkiQVJNX1RIVU1CMTIiLAotCWZhbHNlLAotCTB4MDAwMDA3ZmYsCi0JMHgwMDAwMDdmZiwgCi0JUENSRUxPRkZTRVQpLAotICBIT1dUTyggQVJNX1RIVU1CMjMsCi0JMSwKLQkyLAotCTIyLAotCXRydWUsCi0JMCwKLQljb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JY29mZl90aHVtYl9wY3JlbF8yMyAsCi0JIkFSTV9USFVNQjIzIiwKLQlmYWxzZSwKLQkweDA3ZmYwN2ZmLAotCTB4MDdmZjA3ZmYsIAotCVBDUkVMT0ZGU0VUKSwKLX07Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQKLSAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYyBzZWN0aW9uLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotaW5fcmVsb2NfcCAoYWJmZCwgaG93dG8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0bzsKLXsKLSAgcmV0dXJuICFob3d0by0+cGNfcmVsYXRpdmUgJiYgaG93dG8tPnR5cGUgIT0gQVJNX1JWQTMyOwotfSAgICAgCi0jZW5kaWYKLQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGNhY2hlX3B0ciwgZHN0KSBcCi0JICAgIChjYWNoZV9wdHIpLT5ob3d0byA9IGFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvICsgKGRzdCktPnJfdHlwZTsKLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfYXJtX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaG93dG8gPSBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byArIHJlbC0+cl90eXBlOwotCi0gIGlmIChyZWwtPnJfdHlwZSA9PSBBUk1fUlZBMzIpCi0gICAgewotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgfQotCi0gIHJldHVybiBob3d0bzsKLQotfQotLyogVXNlZCBieSB0aGUgYXNzZW1ibGVyLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hb3V0YXJtX2ZpeF9wY3JlbF8yNl9kb25lIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBpcyBkZWFkIHNpbXBsZSBhdCBwcmVzZW50LiAgKi8KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVXNlZCBieSB0aGUgYXNzZW1ibGVyLiAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1hb3V0YXJtX2ZpeF9wY3JlbF8yNiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB0YXJnZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbgotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gb3V0cHV0X2JmZCA/IGJmZF9yZWxvY19jb250aW51ZSA6IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb25zIGFyZSBkaWZmZXJlbnQsIGFuZCB3ZSBhcmUgZG9pbmcgYSBwYXJ0aWFsIHJlbG9jYXRpb24sCi0gICAgIGp1c3QgaWdub3JlIGl0IGZvciBub3cuICAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lICE9IGlucHV0X3NlY3Rpb24tPm5hbWUKLSAgICAgICYmIG91dHB1dF9iZmQgIT0gKGJmZCAqKU5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZWxvY2F0aW9uID0gKHRhcmdldCAmIDB4MDBmZmZmZmYpIDw8IDI7Ci0gIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiBeIDB4MDIwMDAwMDApIC0gMHgwMjAwMDAwMDsgLyogU2lnbiBleHRlbmQgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnZhbHVlOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcjsKLSAgCi0gIGlmIChyZWxvY2F0aW9uICYgMykKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICBpZiAocmVsb2NhdGlvbiAmIDB4MDIwMDAwMDApCi0gICAgewotICAgICAgaWYgKChyZWxvY2F0aW9uICYgfiAoYmZkX3ZtYSkgMHgwM2ZmZmZmZikgIT0gfiAoYmZkX3ZtYSkgMHgwM2ZmZmZmZikKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgZWxzZSBpZiAocmVsb2NhdGlvbiAmIH4weDAzZmZmZmZmKQotICAgIGZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgdGFyZ2V0ICY9IH4weDAwZmZmZmZmOwotICB0YXJnZXQgfD0gKHJlbG9jYXRpb24gPj4gMikgJiAweDAwZmZmZmZmOwotICBiZmRfcHV0XzMyIChhYmZkLCB0YXJnZXQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgLyogTm93IHRoZSBBUk0gbWFnaWMuLi4gQ2hhbmdlIHRoZSByZWxvYyB0eXBlIHNvIHRoYXQgaXQgaXMgbWFya2VkIGFzIGRvbmUuCi0gICAgIFN0cmljdGx5IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLiAgKi8KLSAgcmVsb2NfZW50cnktPmhvd3RvID0gJmFvdXRhcm1fc3RkX3JlbG9jX2hvd3RvW0FSTV8yNkRdOwotCi0gIHJldHVybiBmbGFnOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBidHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci0gICAgIHRodW1iX3BjcmVsX2JyYW5jaHR5cGUgYnR5cGU7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hIGRzdG1zazsKLSAgYmZkX3ZtYSBvZmZtc2s7Ci0gIGJmZF92bWEgc2lnbmJpdDsKLQotICAvKiBOT1RFOiBUaGlzIHJvdXRpbmUgaXMgY3VycmVudGx5IHVzZWQgYnkgR0FTLCBidXQgbm90IGJ5IHRoZSBsaW5rCi0gICAgIHBoYXNlLiAgKi8KLQotICBzd2l0Y2ggKGJ0eXBlKQotICAgIHsKLSAgICBjYXNlIGI5OgotICAgICAgZHN0bXNrICA9IDB4MDAwMDAwZmY7Ci0gICAgICBvZmZtc2sgID0gMHgwMDAwMDFmZTsKLSAgICAgIHNpZ25iaXQgPSAweDAwMDAwMTAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGIxMjoKLSAgICAgIGRzdG1zayAgPSAweDAwMDAwN2ZmOwotICAgICAgb2ZmbXNrICA9IDB4MDAwMDBmZmU7Ci0gICAgICBzaWduYml0ID0gMHgwMDAwMDgwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiMjM6Ci0gICAgICBkc3Rtc2sgID0gMHgwN2ZmMDdmZjsKLSAgICAgIG9mZm1zayAgPSAweDAwN2ZmZmZmOwotICAgICAgc2lnbmJpdCA9IDB4MDA0MDAwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIAotICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHJldHVybiBlcnJvciAqLwotICBpZiAoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfdW5kX3NlY3Rpb24KLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIG91dHB1dF9iZmQgPyBiZmRfcmVsb2NfY29udGludWUgOiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gIC8qIElmIHRoZSBzZWN0aW9ucyBhcmUgZGlmZmVyZW50LCBhbmQgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLAotICAgICBqdXN0IGlnbm9yZSBpdCBmb3Igbm93LiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSAhPSBpbnB1dF9zZWN0aW9uLT5uYW1lCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgc3dpdGNoIChidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBiOToKLSAgICBjYXNlIGIxMjoKLSAgICAgIHJlbG9jYXRpb24gPSAoKHRhcmdldCAmIGRzdG1zaykgPDwgMSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYjIzOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlyZWxvY2F0aW9uID0gKCh0YXJnZXQgJiAweDdmZikgPDwgMSkgIHwgKCh0YXJnZXQgJiAweDA3ZmYwMDAwKSA+PiA0KTsKLSAgICAgIGVsc2UKLQlyZWxvY2F0aW9uID0gKCh0YXJnZXQgJiAweDdmZikgPDwgMTIpIHwgKCh0YXJnZXQgJiAweDA3ZmYwMDAwKSA+PiAxNSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gc2lnbmJpdCkgLSBzaWduYml0OyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotCi0gIGlmIChyZWxvY2F0aW9uICYgMSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICBpZiAocmVsb2NhdGlvbiAmIHNpZ25iaXQpCi0gICAgewotICAgICAgaWYgKChyZWxvY2F0aW9uICYgfm9mZm1zaykgIT0gfm9mZm1zaykKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgZWxzZSBpZiAocmVsb2NhdGlvbiAmIH5vZmZtc2spCi0gICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB0YXJnZXQgJj0gfmRzdG1zazsKLSAgc3dpdGNoIChidHlwZSkKLSAgIHsKLSAgIGNhc2UgYjk6Ci0gICBjYXNlIGIxMjoKLSAgICAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDEpOwotICAgICBicmVhazsKLQotICAgY2FzZSBiMjM6Ci0gICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgICAgdGFyZ2V0IHw9ICgocmVsb2NhdGlvbiAmIDB4ZmZmKSA+PiAxKSAgfCAoKHJlbG9jYXRpb24gPDwgNCkgICYgMHgwN2ZmMDAwMCk7Ci0gICAgIGVsc2UKLSAgICAgICB0YXJnZXQgfD0gKChyZWxvY2F0aW9uICYgMHhmZmUpIDw8IDE1KSB8ICgocmVsb2NhdGlvbiA+PiAxMikgJiAweDdmZik7Ci0gICAgIGJyZWFrOwotCi0gICBkZWZhdWx0OgotICAgICBhYm9ydCAoKTsKLSAgIH0KLQotICBiZmRfcHV0XzMyIChhYmZkLCB0YXJnZXQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgLyogTm93IHRoZSBBUk0gbWFnaWMuLi4gQ2hhbmdlIHRoZSByZWxvYyB0eXBlIHNvIHRoYXQgaXQgaXMgbWFya2VkIGFzIGRvbmUuCi0gICAgIFN0cmljdGx5IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgaWYgd2UgYXJlIGRvaW5nIGEgcGFydGlhbCByZWxvY2F0aW9uLiAgKi8KLSAgcmVsb2NfZW50cnktPmhvd3RvID0gJiBhb3V0YXJtX3N0ZF9yZWxvY19ob3d0byBbQVJNXzI2RF07Ci0gIAotICAvKiBUT0RPOiBXZSBzaG91bGQgcG9zc2libHkgaGF2ZSBET05FIGVudHJpZXMgZm9yIHRoZSBUSFVNQiBQQ1JFTCByZWxvY2F0aW9ucyAqLwotICByZXR1cm4gZmxhZzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotY29mZl90aHVtYl9wY3JlbF8yMyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGNvZmZfdGh1bWJfcGNyZWxfY29tbW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsIGIyMyk7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfdGh1bWJfcGNyZWxfMTIgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBiMTIpOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1jb2ZmX3RodW1iX3BjcmVsXzkgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHJldHVybiBjb2ZmX3RodW1iX3BjcmVsX2NvbW1vbiAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlLCBiOSk7Ci19Ci0KLQotc3RhdGljIENPTlNUIHN0cnVjdCByZWxvY19ob3d0b19zdHJ1Y3QgKgotY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgICBiZmQgKiBhYmZkOwotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0jZGVmaW5lIEFTVEQoaSxqKSAgICAgICBjYXNlIGk6IHJldHVybiAmYW91dGFybV9zdGRfcmVsb2NfaG93dG9bal0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DX0NUT1IpCi0gICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0gICAgICB7Ci0gICAgICBjYXNlIDMyOgotICAgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6IHJldHVybiAoQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSAwOwotICAgICAgfQotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfOCwgICAgICAgICAgICAgICAgICAgIEFSTV84KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNiwgICAgICAgICAgICAgICAgICAgQVJNXzE2KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgQVJNXzMyKTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgQVJNXzI2KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ184X1BDUkVMLCAgICAgICAgICAgICAgQVJNX0RJU1A4KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNl9QQ1JFTCwgICAgICAgICAgICAgQVJNX0RJU1AxNik7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzJfUENSRUwsICAgICAgICAgICAgIEFSTV9ESVNQMzIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX1JWQSwgICAgICAgICAgICAgICAgICBBUk1fUlZBMzIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDksICBBUk1fVEhVTUI5KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiwgQVJNX1RIVU1CMTIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzLCBBUk1fVEhVTUIyMyk7Ci0gICAgZGVmYXVsdDogcmV0dXJuIChDT05TVCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICopIDA7Ci0gICAgfQotfQotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMHgxMDAwCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jICBudW5tYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIHsgeC5yX3R5cGUgPSBob3d0by0+dHlwZTsgfQotI2RlZmluZSBCQURNQUcoeCkgQVJNQkFETUFHKHgpCi0jZGVmaW5lIEFSTSAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotLyogRXh0ZW5kIHRoZSBjb2ZmX2xpbmtfaGFzaF90YWJsZSBzdHJ1Y3R1cmUgd2l0aCBhIGZldyBBUk0gc3BlY2lmaWMgZmllbGRzLgotICAgVGhpcyBhbGxvd3MgdXMgdG8gc3RvcmUgZ2xvYmFsIGRhdGEgaGVyZSB3aXRob3V0IGFjdHVhbGx5IGNyZWF0aW5nIGFueQotICAgZ2xvYmFsIHZhcmlhYmxlcywgd2hpY2ggaXMgYSBuby1ubyBpbiB0aGUgQkZEIHdvcmxkLiAgKi8KLXN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG9yaWdpbmFsIGNvZmZfbGlua19oYXNoX3RhYmxlIHN0cnVjdHVyZS4gIE1VU1QgYmUgZmlyc3QgZmllbGQuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUJcm9vdDsKLSAgCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBUaHVtYi10by1BUk0gZ2x1ZS4gICovCi0gIGxvbmcgaW50IAkJCXRodW1iX2dsdWVfc2l6ZTsKLSAgCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBBUk0tdG8tVGh1bWIgZ2x1ZS4gICovCi0gIGxvbmcgaW50IAkJCWFybV9nbHVlX3NpemU7Ci0KLSAgLyogQW4gYXJiaXRhcnkgaW5wdXQgQkZEIGNob3NlbiB0byBob2xkIHRoZSBnbHVlIHNlY3Rpb25zLiAgKi8KLSAgYmZkICoJCQkJYmZkX29mX2dsdWVfb3duZXI7Ci0KLSAgLyogU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQsIG5vbi1pbnRlcndvcmtpbmcgYXdhcmUgQVJNIGNvZGUuICovCi0gIGludCAJCQkJc3VwcG9ydF9vbGRfY29kZTsKLX07Ci0KLS8qIEdldCB0aGUgQVJNIGNvZmYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX2FybV9oYXNoX3RhYmxlKGluZm8pIFwKLSAgKChzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICopICgoaW5mbyktPmhhc2gpKQotCi0vKiBDcmVhdGUgYW4gQVJNIGNvZmYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotY29mZl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIHJldDsKLQotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgICAgICgmIHJldC0+cm9vdCwgYWJmZCwgX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT50aHVtYl9nbHVlX3NpemUgICA9IDA7Ci0gIHJldC0+YXJtX2dsdWVfc2l6ZSAgICAgPSAwOwotICByZXQtPmJmZF9vZl9nbHVlX293bmVyID0gTlVMTDsKLQotICByZXR1cm4gJiByZXQtPnJvb3Qucm9vdDsKLX0KLQotc3RhdGljIHZvaWQKLWFybV9lbWl0X2Jhc2VfZmlsZV9lbnRyeSAoaW5mbywgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsb2Nfb2Zmc2V0KQotICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgIGJmZF92bWEgcmVsb2Nfb2Zmc2V0OwotewotICBiZmRfdm1hIGFkZHIgPSByZWxvY19vZmZzZXQKLSAgICAgICAgICAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIGlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotICAgICBhZGRyIC09IHBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gIGZ3cml0ZSAoJmFkZHIsIDEsIHNpemVvZiAoYWRkciksIChGSUxFICopIGluZm8tPmJhc2VfZmlsZSk7Ci0KLX0KLQwKLS8qIFRoZSB0aHVtYiBmb3JtIG9mIGEgbG9uZyBicmFuY2ggaXMgYSBiaXQgZmluaWNreSwgYmVjYXVzZSB0aGUgb2Zmc2V0Ci0gICBlbmNvZGluZyBpcyBzcGxpdCBvdmVyIHR3byBmaWVsZHMsIGVhY2ggaW4gaXQncyBvd24gaW5zdHJ1Y3Rpb24uIFRoZXkKLSAgIGNhbiBvY2N1ciBpbiBhbnkgb3JkZXIuIFNvIGdpdmVuIGEgdGh1bWIgZm9ybSBvZiBsb25nIGJyYW5jaCwgYW5kIGFuIAotICAgb2Zmc2V0LCBpbnNlcnQgdGhlIG9mZnNldCBpbnRvIHRoZSB0aHVtYiBicmFuY2ggYW5kIHJldHVybiBmaW5pc2hlZAotICAgaW5zdHJ1Y3Rpb24uIAotCi0gICBJdCB0YWtlcyB0d28gdGh1bWIgaW5zdHJ1Y3Rpb25zIHRvIGVuY29kZSB0aGUgdGFyZ2V0IGFkZHJlc3MuIEVhY2ggaGFzIAotICAgMTEgYml0cyB0byBpbnZlc3QuIFRoZSB1cHBlciAxMSBiaXRzIGFyZSBzdG9yZWQgaW4gb25lIChpZGVudGlmZWQgYnkKLSAgIEgtMC4uIHNlZSBiZWxvdyksIHRoZSBsb3dlciAxMSBiaXRzIGFyZSBzdG9yZWQgaW4gdGhlIG90aGVyIChpZGVudGlmaWVkIAotICAgYnkgSC0xKS4gCi0KLSAgIENvbWJpbmUgdG9nZXRoZXIgYW5kIHNoaWZ0ZWQgbGVmdCBieSAxIChpdCdzIGEgaGFsZiB3b3JkIGFkZHJlc3MpIGFuZCAKLSAgIHRoZXJlIHlvdSBoYXZlIGl0LgotCi0gICAgIE9wOiAxMTExID0gRiwKLSAgICAgSC0wLCB1cHBlciBhZGRyZXNzLTAgPSAwMDAKLSAgICAgT3A6IDExMTEgPSBGLAotICAgICBILTEsIGxvd2VyIGFkZHJlc3MtMCA9IDgwMAotCi0gICBUaGV5IGNhbiBiZSBvcmRlcmVkIGVpdGhlciB3YXksIGJ1dCB0aGUgYXJtIHRvb2xzIEkndmUgc2VlbiBhbHdheXMgcHV0IAotICAgdGhlIGxvd2VyIG9uZSBmaXJzdC4gSXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIuIGtya0BjeWdudXMuY29tCi0KLSAgIFhYWDogIEFjdHVhbGx5IHRoZSBvcmRlciBkb2VzIG1hdHRlci4gIFRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gKEgtMSkKLSAgIG1vdmVzIHRoZSBjb21wdXRlZCBhZGRyZXNzIGludG8gdGhlIFBDLCBzbyBpdCBtdXN0IGJlIHRoZSBzZWNvbmQgb25lCi0gICBpbiB0aGUgc2VxdWVuY2UuICBUaGUgcHJvYmxlbSwgaG93ZXZlciBpcyB0aGF0IHdoaWxzdCBsaXR0bGUgZW5kaWFuIGNvZGUKLSAgIHN0b3JlcyB0aGUgaW5zdHJ1Y3Rpb25zIGluIEhJIHRoZW4gTE9XIG9yZGVyLCBiaWcgZW5kaWFuIGNvZGUgZG9lcyB0aGUKLSAgIHJldmVyc2UuICBuaWNrY0BjeWdudXMuY29tICAqLwotCi0jZGVmaW5lIExPV19ISV9PUkRFUiAweEY4MDBGMDAwCi0jZGVmaW5lIEhJX0xPV19PUkRFUiAweEYwMDBGODAwCi0KLXN0YXRpYyBpbnNuMzIKLWluc2VydF90aHVtYl9icmFuY2ggKGJyX2luc24sIHJlbF9vZmYpCi0gICAgIGluc24zMiBicl9pbnNuOwotICAgICBpbnQgcmVsX29mZjsKLXsKLSAgdW5zaWduZWQgaW50IGxvd19iaXRzOwotICB1bnNpZ25lZCBpbnQgaGlnaF9iaXRzOwotCi0KLSAgQkZEX0FTU0VSVCgocmVsX29mZiAmIDEpICE9IDEpOwotCi0gIHJlbF9vZmYgPj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGFsZiB3b3JkIGFsaWduZWQgYWRkcmVzcyAqLwotICBsb3dfYml0cyA9IHJlbF9vZmYgJiAweDAwMDAwN0ZGOyAgICAgICAgICAgIC8qIHRoZSBib3R0b20gMTEgYml0cyAqLwotICBoaWdoX2JpdHMgPSAocmVsX29mZiA+PiAxMSkgJiAweDAwMDAwN0ZGOyAgIC8qIHRoZSB0b3AgMTEgYml0cyAqLwotCi0gIGlmICgoYnJfaW5zbiAmIExPV19ISV9PUkRFUikgPT0gTE9XX0hJX09SREVSKQotICAgIGJyX2luc24gPSBMT1dfSElfT1JERVIgfCAobG93X2JpdHMgPDwgMTYpIHwgaGlnaF9iaXRzOwotICBlbHNlIGlmICgoYnJfaW5zbiAmIEhJX0xPV19PUkRFUikgPT0gSElfTE9XX09SREVSKQotICAgIGJyX2luc24gPSBISV9MT1dfT1JERVIgfCAoaGlnaF9iaXRzIDw8IDE2KSB8IGxvd19iaXRzOwotICBlbHNlCi0gICAgYWJvcnQoKTsgLyogZXJyb3IgLSBub3QgYSB2YWxpZCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybSAqLwotCi0gIC8qIEZJWE1FOiBhYm9ydCBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGNhbGwuIGtya0BjeWdudXMuY29tICovCi0KLSAgcmV0dXJuIGJyX2luc247Ci19Ci0KLQwKLXN0YXRpYyBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKgotZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgdG1wX25hbWU7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotCSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotICAKLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogdW5hYmxlIHRvIGZpbmQgVEhVTUIgZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0gIAotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgcmV0dXJuIG15aDsKLX0KLQotc3RhdGljIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX2FybV9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgdG1wX25hbWU7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIG15aDsKLQotICB0bXBfbmFtZSA9ICgoY2hhciAqKQotCSAgICAgIGJmZF9tYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUpICsgMSkpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0gIAotICBteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgdG1wX25hbWUsIG5hbWUpOwotICAKLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLS8qCi0gIEFSTS0+VGh1bWIgZ2x1ZToKLQotICAgICAgIC5hcm0KLSAgICAgICBfX2Z1bmNfZnJvbV9hcm06Ci0JICAgICBsZHIgcjEyLCBfX2Z1bmNfYWRkcgotCSAgICAgYnggIHIxMgotICAgICAgIF9fZnVuY19hZGRyOgotICAgICAgICAgICAgLndvcmQgZnVuYyAgICBAIGJlaGF2ZSBhcyBpZiB5b3Ugc2F3IGEgQVJNXzMyIHJlbG9jCi0qLwotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NJWkUgMTIKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0MV9sZHJfaW5zbiAgICAgICA9IDB4ZTU5ZmMwMDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDJfYnhfcjEyX2luc24gICAgPSAweGUxMmZmZjFjOwotc3RhdGljIGNvbnN0IGluc24zMiBhMnQzX2Z1bmNfYWRkcl9pbnNuID0gMHgwMDAwMDAwMTsKLQotLyoKLSAgIFRodW1iLT5BUk06CQkJCVRodW1iLT4obm9uLWludGVyd29ya2luZyBhd2FyZSkgQVJNCi0KLSAgIC50aHVtYgkJCQkudGh1bWIKLSAgIC5hbGlnbiAyCQkJCS5hbGlnbiAyCi0gICAgICBfX2Z1bmNfZnJvbV90aHVtYjoJCSAgIF9fZnVuY19mcm9tX3RodW1iOgotCSAgIGJ4IHBjCQkJCXB1c2gge3I2LCBscn0KLQkgICBub3AJCQkJCWxkciAgcjYsIF9fZnVuY19hZGRyCi0gICAuYXJtCQkJCQkJbW92ICBsciwgcGMKLSAgICAgIF9fZnVuY19jaGFuZ2VfdG9fYXJtOgkJCWJ4ICAgcjYKLQkgICBiIGZ1bmMgICAJCQkuYXJtCi0JCQkJCSAgIF9fZnVuY19iYWNrX3RvX3RodW1iOgotICAgCQkgIAkJCQlsZG1pYSByMTMhIHtyNiwgbHJ9Ci0gICAJCQkJCSAgICAgICAgYnggICAgbHIKLSAgIAkJCQkJICAgX19mdW5jX2FkZHI6Ci0JCQkJCSAgICAgICAgLndvcmQJZnVuYyAKLSovCi0KLSNkZWZpbmUgVEhVTUIyQVJNX0dMVUVfU0laRSAoZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA/IDIwIDogOCkKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9ieF9wY19pbnNuID0gMHg0Nzc4Owotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX25vb3BfaW5zbiAgPSAweDQ2YzA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTNfYl9pbnNuICAgICA9IDB4ZWEwMDAwMDA7Ci0KLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9wdXNoX2luc24gID0gMHhiNTQwOwotc3RhdGljIGNvbnN0IGluc24xNiB0MmEyX2xkcl9pbnNuICAgPSAweDRlMDM7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTNfbW92X2luc24gICA9IDB4NDZmZTsKLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhNF9ieF9pbnNuICAgID0gMHg0NzMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE1X3BvcF9pbnNuICAgPSAweGU4YmQ0MDQwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmE2X2J4X2luc24gICAgPSAweGUxMmZmZjFlOwotCi0vKiBUT0RPOgotICAgICBXZSBzaG91bGQgcmVhbGx5IGNyZWF0ZSBuZXcgbG9jYWwgKHN0YXRpYykgc3ltYm9scyBpbiBkZXN0aW5hdGlvbgotICAgICBvYmplY3QgZm9yIGVhY2ggc3R1YiB3ZSBjcmVhdGUuICBXZSBzaG91bGQgYWxzbyBjcmVhdGUgbG9jYWwKLSAgICAgKHN0YXRpYykgc3ltYm9scyB3aXRoaW4gdGhlIHN0dWJzIHdoZW4gc3dpdGNoaW5nIGJldHdlZW4gQVJNIGFuZAotICAgICBUaHVtYiBjb2RlLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBkZWJ1Z2dlciBhbmQgZGlzYXNzZW1ibGVyCi0gICAgIGNhbiBwcmVzZW50IGEgYmV0dGVyIHZpZXcgb2Ygc3R1YnMuCi0KLSAgICAgV2UgY2FuIHRyZWF0IHN0dWJzIGxpa2UgbGl0ZXJhbCBzZWN0aW9ucywgYW5kIGZvciB0aGUgVEhVTUI5IG9uZXMKLSAgICAgKHNob3J0IGFkZHJlc3NpbmcgcmFuZ2UpIHdlIHNob3VsZCBiZSBhYmxlIHRvIGluc2VydCB0aGUgc3R1YnMKLSAgICAgYmV0d2VlbiBzZWN0aW9ucy4gaS5lLiB0aGUgc2ltcGxlc3QgYXBwcm9hY2ggKHNpbmNlIHJlbG9jYXRpb25zCi0gICAgIGFyZSBkb25lIG9uIGEgc2VjdGlvbiBiYXNpcykgaXMgdG8gZHVtcCB0aGUgc3R1YnMgYXQgdGhlIGVuZCBvZgotICAgICBwcm9jZXNzaW5nIGEgc2VjdGlvbi4gVGhhdCB3YXkgd2UgY2FuIGFsd2F5cyB0cnkgYW5kIG1pbmltaXNlIHRoZQotICAgICBvZmZzZXQgdG8gYW5kIGZyb20gYSBzdHViLiBIb3dldmVyLCB0aGlzIGRvZXMgbm90IG1hcCB3ZWxsIG9udG8KLSAgICAgdGhlIHdheSB0aGF0IHRoZSBsaW5rZXIvQkZEIGRvZXMgaXRzIHdvcms6IG1hcHBpbmcgYWxsIGlucHV0Ci0gICAgIHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucyB2aWEgdGhlIGxpbmtlciBzY3JpcHQgYmVmb3JlIGRvaW5nCi0gICAgIGFsbCB0aGUgcHJvY2Vzc2luZy4KLQotICAgICBVbmZvcnR1bmF0ZWx5IGl0IG1heSBiZSBlYXNpZXIgdG8ganVzdCB0byBkaXNhbGxvdyBzaG9ydCByYW5nZQotICAgICBUaHVtYi0+QVJNIHN0dWJzIChpLmUuIG5vIGNvbmRpdGlvbmFsIGludGVyLXdvcmtpbmcgYnJhbmNoZXMsCi0gICAgIG9ubHkgYnJhbmNoLWFuZC1saW5rIChCTCkgY2FsbHMuICBUaGlzIHdpbGwgc2ltcGxpZnkgdGhlIHByb2Nlc3NpbmcKLSAgICAgc2luY2Ugd2UgY2FuIHRoZW4gcHV0IGFsbCBvZiB0aGUgc3R1YnMgaW50byB0aGVpciBvd24gc2VjdGlvbi4KLQotICBUT0RPOgotICAgICBPbiBhIGRpZmZlcmVudCBzdWJqZWN0LCByYXRoZXIgdGhhbiBjb21wbGFpbmluZyB3aGVuIGEKLSAgICAgYnJhbmNoIGNhbm5vdCBmaXQgaW4gdGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBmb3IgdGhlCi0gICAgIGluc3RydWN0aW9uIHdlIHNob3VsZCBnZW5lcmF0ZSBhIHRyYW1wb2xpbmUgc3R1YiAobmVlZGVkIHRvCi0gICAgIGFkZHJlc3MgdGhlIGNvbXBsZXRlIDMyYml0IGFkZHJlc3Mgc3BhY2UpLiAgKi8KLQotLyogVGhlIHN0YW5kYXJkIENPRkYgYmFja2VuZCBsaW5rZXIgZG9lcyBub3QgY29wZSB3aXRoIHRoZSBzcGVjaWFsIAotICAgVGh1bWIgQlJBTkNIMjMgcmVsb2NhdGlvbi4gIFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBzcGxpdCB0aGUKLSAgIEJSQU5DSDIzIGludG8gc2VwZXJhdGUgSEkyMyBhbmQgTE8yMyByZWxvY2F0aW9ucy4gSG93ZXZlciwgaXQgaXMgYQotICAgYml0IHNpbXBsZXIgc2ltcGx5IHByb3ZpZGluZyBvdXIgb3duIHJlbG9jYXRpb24gZHJpdmVyLiAqLwotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgQVJNL1RodW1iIENPRkYgbGlua2VyLiAgTk9URToKLSAgIFRoaXMgY29kZSBpcyBhIHZlcnkgc2xpZ2h0bHkgbW9kaWZpZWQgY29weSBvZgotICAgX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbi4gIEl0IHdvdWxkIGJlIGEgbXVjaCBtb3JlCi0gICBtYWludGFpbmFibGUgc29sdXRpb24gdG8gaGF2ZSBhIE1BQ1JPIHRoYXQgY291bGQgYmUgZXhwYW5kZWQgd2l0aGluCi0gICBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIHRoYXQgd291bGQgb25seSBiZSBwcm92aWRlZCBmb3IKLSAgIEFSTS9UaHVtYiBidWlsZHMuICBJdCBpcyBvbmx5IHRoZSBjb2RlIG1hcmtlZCBUSFVNQkVYVEVOU0lPTiB0aGF0Ci0gICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICogcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDA7Ci0gICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICogICAgICAgc3ltOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgICAgcnN0YXQ7Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgaF92YWw7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICAvKiBDT0ZGIHRyZWF0cyBjb21tb24gc3ltYm9scyBpbiBvbmUgb2YgdHdvIHdheXMuICBFaXRoZXIgdGhlCi0gICAgICAgICBzaXplIG9mIHRoZSBzeW1ib2wgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIG9yIGl0Ci0gICAgICAgICBpcyBub3QuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBpcyBub3QgaW5jbHVkZWQsIGFuZCBmb3JjZQotICAgICAgICAgdGhlIHJ0eXBlX3RvX2hvd3RvIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgYWRkZW5kIGFzIG5lZWRlZC4gICovCi0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0KLSAgICAgIGhvd3RvID0gY29mZl9ydHlwZV90b19ob3d0byAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwsIGgsCi0JCQkJICAgICAgIHN5bSwgJmFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSByZWxvY2F0aW9uX3NlY3Rpb24gZnVuY3Rpb24gd2lsbCBza2lwIHBjcmVsX29mZnNldCByZWxvY3MKLSAgICAgICAgIHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluay4gIEhvd2V2ZXIsIHdlIHdhbnQgdG8gY29udmVydAotICAgICAgICAgQVJNMjYgdG8gQVJNMjZEIHJlbG9jcyBpZiBwb3NzaWJsZS4gIFdlIHJldHVybiBhIGZha2UgaG93dG8gaW4KLSAgICAgICAgIHRoaXMgY2FzZSB3aXRob3V0IHBjcmVsX29mZnNldCBzZXQsIGFuZCBhZGp1c3QgdGhlIGFkZGVuZCB0bwotICAgICAgICAgY29tcGVuc2F0ZS4gICovCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPT0gQVJNXzI2Ci0gICAgICAgICAgJiYgaCAhPSBOVUxMCi0gICAgICAgICAgJiYgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgICAgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICBzdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBmYWtlX2FybTI2X3JlbG9jID0gCi0JICAgIEhPV1RPIChBUk1fMjYsCi0gICAgCSAgICAgICAyLAotICAgIAkgICAgICAgMiwKLSAgICAJICAgICAgIDI0LAotICAgIAkgICAgICAgdHJ1ZSwKLSAgICAJICAgICAgIDAsCi0gICAgCSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0gICAgCSAgICAgICBhb3V0YXJtX2ZpeF9wY3JlbF8yNiAsCi0gICAgCSAgICAgICAiQVJNXzI2IiwKLSAgICAJICAgICAgIGZhbHNlLAotICAgIAkgICAgICAgMHgwMGZmZmZmZiwKLSAgICAJICAgICAgIDB4MDBmZmZmZmYsIAotICAgIAkgICAgICAgZmFsc2UpOwotCi0gICAgICAgICAgYWRkZW5kIC09IHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLSAgICAgICAgICBob3d0byA9ICZmYWtlX2FybTI2X3JlbG9jOwotICAgICAgICB9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGVuIHdlIGNhbiBqdXN0IGlnbm9yZQotICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyB0aGF0IGlzIHBjcmVsX29mZnNldC4gIEl0IHdpbGwgYWxyZWFkeQotICAgICAgICAgaGF2ZSB0aGUgY29ycmVjdCB2YWx1ZS4gIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssCi0gICAgICAgICB0aGVuIHdlIHNob3VsZCBpZ25vcmUgdGhlIHN5bWJvbCB2YWx1ZS4gICovCi0gICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotICAgICAgICAgICAgYWRkZW5kICs9IHN5bS0+bl92YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICB2YWwgPSAwOwotCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotI2lmIDEgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgICAgICAvKiBXZSBkb24ndCBvdXRwdXQgdGhlIHN0dWJzIGlmIHdlIGFyZSBnZW5lcmF0aW5nIGEKLSAgICAgICAgICAgICByZWxvY2F0YWJsZSBvdXRwdXQgZmlsZSwgc2luY2Ugd2UgbWF5IGFzIHdlbGwgbGVhdmUgdGhlCi0gICAgICAgICAgICAgc3R1YiBnZW5lcmF0aW9uIHRvIHRoZSBmaW5hbCBsaW5rZXIgcGFzcy4gSWYgd2UgZmFpbCB0bwotCSAgICAgdmVyaWZ5IHRoYXQgdGhlIG5hbWUgaXMgZGVmaW5lZCwgd2UnbGwgdHJ5IHRvIGJ1aWxkIHN0dWJzCi0JICAgICBmb3IgYW4gdW5kZWZpbmVkIG5hbWUuLi4gKi8KLSAgICAgICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICAgICAmJiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgICAgICAgICAgewotCSAgICAgIGFzZWN0aW9uICogICBoX3NlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBjb25zdCBjaGFyICogbmFtZSAgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIAotCSAgICAgIC8qIGggbG9jYXRlcyB0aGUgc3ltYm9sIHJlZmVyZW5jZWQgaW4gdGhlIHJlbG9jLiAgKi8KLQkgICAgICBoX3ZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGhfc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGhfc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotICAgICAgICAgICAgICBpZiAoaG93dG8tPnR5cGUgPT0gQVJNXzI2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggICBoLT5jbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMKLQkJICAgICAgfHwgaC0+Y2xhc3MgPT0gQ19USFVNQkVYVEZVTkMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEFybSBjb2RlIGNhbGxpbmcgYSBUaHVtYiBmdW5jdGlvbiAqLwotCQkgICAgICB1bnNpZ25lZCBsb25nIGludCAgICAgICAgICAgICAgICAgdG1wOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0OwotCQkgICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgczsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF9vZmZzZXQ7Ci0JCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICAgICBteWg7IAotCQkgICAgICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQkJICAgICAgCi0JCSAgICAgIG15aCA9IGZpbmRfYXJtX2dsdWUgKGluZm8sIG5hbWUsIGlucHV0X2JmZCk7Ci0JCSAgICAgIGlmIChteWggPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkgICAgICBnbG9iYWxzID0gY29mZl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0JCQkKLQkJICAgICAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICAKLQkJICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgCi0JCQkJCQkgIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHMtPmNvbnRlbnRzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKTsKLQotCQkgICAgICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0JCQl7Ci0JCQkgIGlmIChoX3NlYy0+b3duZXIgIT0gTlVMTAotCQkJICAgICAgJiYgSU5URVJXT1JLX1NFVCAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBJTlRFUldPUktfRkxBRyAoaF9zZWMtPm93bmVyKSkKLQkJCSAgICB7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaF9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JCQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJCShfKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiBhcm0gY2FsbCB0byB0aHVtYiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCSAgICB9Ci0KLQkJCSAgLS1teV9vZmZzZXQ7Ci0JCQkgIG15aC0+cm9vdC51LmRlZi52YWx1ZSA9IG15X29mZnNldDsKLQotCQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQxX2xkcl9pbnNuLAotCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJCSAgCi0JCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGEydDJfYnhfcjEyX2luc24sCi0JCQkJICAgICAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQkJCSAgCi0JCQkgIC8qIEl0J3MgYSB0aHVtYiBhZGRyZXNzLiAgQWRkIHRoZSBsb3cgb3JkZXIgYml0LiAgKi8KLQkJCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaF92YWwgfCBhMnQzX2Z1bmNfYWRkcl9pbnNuLAotCQkJCSAgICAgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIHMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2Zmc2V0ICsgOCk7Ci0KLQkJCX0KLQotCQkgICAgICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSk7Ci0KLQkJICAgICAgdG1wID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl92YWRkcgotCQkJCQktIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIAotCQkgICAgICB0bXAgPSB0bXAgJiAweEZGMDAwMDAwOwotCi0JCSAgICAgIC8qIFNvbWVob3cgdGhlc2UgYXJlIGJvdGggNCB0b28gZmFyLCBzbyBzdWJ0cmFjdCA4LiAqLwotCQkgICAgICByZXRfb2Zmc2V0ID0KLQkJCXMtPm91dHB1dF9vZmZzZXQKLQkJCSsgbXlfb2Zmc2V0IAotCQkJKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQktIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgCi0JCQkgICArIHJlbC0+cl92YWRkcikKLQkJCS0gODsKLQotCQkgICAgICB0bXAgPSB0bXAgfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKTsKLQkJICAgICAgCi0JCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHRtcCwgY29udGVudHMgKyByZWwtPnJfdmFkZHIKLQkJCQkgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQkJICAgICAgZG9uZSA9IDE7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgIAotCSAgICAgIC8qIE5vdGU6IFdlIHVzZWQgdG8gY2hlY2sgZm9yIEFSTV9USFVNQjkgYW5kIEFSTV9USFVNQjEyICovCi0gICAgICAgICAgICAgIGVsc2UgaWYgKGhvd3RvLT50eXBlID09IEFSTV9USFVNQjIzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggICBoLT5jbGFzcyA9PSBDX0VYVCAKLQkJICAgICAgfHwgaC0+Y2xhc3MgPT0gQ19TVEFUCi0JCSAgICAgIHx8IGgtPmNsYXNzID09IENfTEFCRUwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRodW1iIGNvZGUgY2FsbGluZyBhbiBBUk0gZnVuY3Rpb24gKi8KLQkJICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgICAgICBzID0gMDsKLQkJICAgICAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vZmZzZXQ7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgdG1wOwotCQkgICAgICBsb25nIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldF9vZmZzZXQ7Ci0JCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqICAgICAgbXloOwotCQkgICAgICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogIGdsb2JhbHM7Ci0KLQkJICAgICAgbXloID0gZmluZF90aHVtYl9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotCQkgICAgICBpZiAobXloID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJICAgICAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCQkgICAgICAKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0JCSAgICAgIAotCQkgICAgICBteV9vZmZzZXQgPSBteWgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIAotCQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCAKLQkJCQkJCSAgIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0JCSAgICAgIAotCQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCQkgICAgICBCRkRfQVNTRVJUIChzLT5jb250ZW50cyAhPSBOVUxMKTsKLQkJICAgICAgQkZEX0FTU0VSVCAocy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCk7Ci0JCSAgICAgIAotCQkgICAgICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0JCQl7Ci0JCQkgIGlmIChoX3NlYy0+b3duZXIgIT0gTlVMTAotCQkJICAgICAgJiYgSU5URVJXT1JLX1NFVCAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBJTlRFUldPUktfRkxBRyAoaF9zZWMtPm93bmVyKQotCQkJICAgICAgJiYgISBnbG9iYWxzLT5zdXBwb3J0X29sZF9jb2RlKQotCQkJICAgIHsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIpLAotCQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChoX3NlYy0+b3duZXIpLCBuYW1lKTsKLQkJCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkJKF8oIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCQkJICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JCQkJKF8oIiAgY29uc2lkZXIgcmVsaW5raW5nIHdpdGggLS1zdXBwb3J0LW9sZC1jb2RlIGVuYWJsZWQiKSk7Ci0JCQkgICAgfQotCQkJICAKLQkJCSAgLS0gbXlfb2Zmc2V0OwotCQkJICBteWgtPnJvb3QudS5kZWYudmFsdWUgPSBteV9vZmZzZXQ7Ci0KLQkJCSAgaWYgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUpCi0JCQkgICAgewotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9wdXNoX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX2xkcl9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMik7Ci0KLQkJCSAgICAgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHQyYTNfbW92X2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhNF9ieF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgNik7Ci0JCQkgICAgICAKLQkJCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHQyYTVfcG9wX2luc24sCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA4KTsKLQkJCSAgICAgIAotCQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdDJhNl9ieF9pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgMTIpOwotCQkJICAgICAgCi0JCQkgICAgICAvKiBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGxhc3Qgd29yZCBvZiB0aGUgc3R1Yi4gICovCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBoX3ZhbCwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDE2KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX2VtaXRfYmFzZV9maWxlX2VudHJ5IChpbmZvLCBvdXRwdXRfYmZkLCBzLCBteV9vZmZzZXQgKyAxNik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgdDJhMV9ieF9wY19pbnNuLAotCQkJCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX25vb3BfaW5zbiwKLQkJCQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOwotCQkgICAgICAKLQkJCSAgICAgIHJldF9vZmZzZXQgPQotCQkJCSgoYmZkX3NpZ25lZF92bWEpIGhfdmFsKQkvKiBBZGRyZXNzIG9mIGRlc3RpbmF0aW9uIG9mIHRoZSBzdHViICovCi0JCQkJLSAoKGJmZF9zaWduZWRfdm1hKQotCQkJCSAgIChzLT5vdXRwdXRfb2Zmc2V0IAkJLyogT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JCQkJICAgICsgbXlfb2Zmc2V0CQkJLyogT2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGlzIHN0dWIgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0dWJzLiAgKi8KLQkJCQkgICAgKyBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hKSAJLyogQWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi0JCQkJICAgKyA0CQkJCS8qIFRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXMgNCBieXRlcyBpbnRvIHRoZSBzdHViLiAgKi8KLQkJCQkgICArIDgpOwkJCS8qIEFSTSBicmFuY2hlcyB3b3JrIGZyb20gdGhlIHBjIG9mIHRoZSBpbnN0cnVjdGlvbiArIDguICAqLwotCQkJICAgICAgCi0JCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJCQkgIHQyYTNfYl9pbnNuIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRiksCi0JCQkJCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQgKyA0KTsKLQotCQkJICAgIH0KLQkJCX0KLQotCQkgICAgICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLQotCQkgICAgICAvKiBOb3cgZ28gYmFjayBhbmQgZml4IHVwIHRoZSBvcmlnaW5hbCBCTCBpbnNuIHRvIHBvaW50Ci0JCQkgdG8gaGVyZS4gICovCi0JCSAgICAgIHJldF9vZmZzZXQgPQotCQkJcy0+b3V0cHV0X29mZnNldAotCQkJKyBteV9vZmZzZXQKLQkJCS0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgcmVsLT5yX3ZhZGRyKQotCQkJLTQ7Ci0JCSAgICAgIAotCQkgICAgICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJCS0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJCSAgaW5zZXJ0X3RodW1iX2JyYW5jaCAodG1wLCByZXRfb2Zmc2V0KSwKLQkJCQkgIGNvbnRlbnRzICsgcmVsLT5yX3ZhZGRyCi0JCQkJICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0JCSAgICAgIAotCQkgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkgIAotICAgICAgICAgIC8qIElmIHRoZSByZWxvY2F0aW9uIHR5cGUgYW5kIGRlc3RpbmF0aW9uIHN5bWJvbCBkb2VzIG5vdAotICAgICAgICAgICAgIGZhbGwgaW50byBvbmUgb2YgdGhlIGFib3ZlIGNhdGVnb3JpZXMsIHRoZW4gd2UgY2FuIGp1c3QKLSAgICAgICAgICAgICBwZXJmb3JtIGEgZGlyZWN0IGxpbmsuICovCi0KLQkgIGlmIChkb25lKQotCSAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UgCi0jZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8KLQkgICAgaWYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5iYXNlX2ZpbGUpCi0JewotCSAgLyogRW1pdCBhIHJlbG9jIGlmIHRoZSBiYWNrZW5kIHRoaW5rcyBpdCBuZWVkcyBpdC4gKi8KLQkgIGlmIChzeW0gJiYgcGVfZGF0YShvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcChvdXRwdXRfYmZkLCBob3d0bykpCi0gICAgICAgICAgICBhcm1fZW1pdF9iYXNlX2ZpbGVfZW50cnkgKGluZm8sIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkcik7Ci0JfQotICAKLSNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICBpZiAoZG9uZSkKLQlyc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIC8qIE9ubHkgcGVyZm9ybSB0aGlzIGZpeCBkdXJpbmcgdGhlIGZpbmFsIGxpbmssIG5vdCBhIHJlbG9jYXRhYmxlIGxpbmsuICBuaWNrY0BjeWdudXMuY29tICAqLwotICAgICAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICAgICAgJiYgaG93dG8tPnR5cGUgPT0gQVJNX1RIVU1CMjMpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBUaGlzIGlzIHByZXR0eSBtdWNoIGEgY29weSBvZiB3aGF0IHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIGFuZCBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi0gICAgICAgICAgICAgcm91dGluZXMgZG8gdG8gcGVyZm9ybSBhIHJlbG9jYXRpb24sIHdpdGggc3BlY2lhbAotICAgICAgICAgICAgIHByb2Nlc3NpbmcgZm9yIHRoZSBzcGxpdCBhZGRyZXNzaW5nIG9mIHRoZSBUaHVtYiBCTAotICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgQWdhaW4sIGl0IHdvdWxkIHByb2JhYmx5IGJlIHNpbXBsZXIgYWRkaW5nIGEKLSAgICAgICAgICAgICBUaHVtYkJSQU5DSDIzIHNwZWNpZmljIG1hY3JvIGV4cGFuc2lvbiBpbnRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgY29kZS4gICovCi0JICAKLSAgICAgICAgICBiZmRfdm1hIGFkZHJlc3MgPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAKLSAgICAgICAgICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkgICAgcnN0YXQgPSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJmZF92bWEgICAgICAgICByZWxvY2F0aW9uICAgICAgID0gdmFsICsgYWRkZW5kOwotCSAgICAgIGludCAgICAgICAgICAgICBzaXplICAgICAgICAgICAgID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0JICAgICAgYm9vbGVhbiAgICAgICAgIG92ZXJmbG93ICAgICAgICAgPSBmYWxzZTsKLQkgICAgICBiZmRfYnl0ZSAqICAgICAgbG9jYXRpb24gICAgICAgICA9IGNvbnRlbnRzICsgYWRkcmVzczsKLQkgICAgICBiZmRfdm1hICAgICAgICAgeCAgICAgICAgICAgICAgICA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotCSAgICAgIGJmZF92bWEgICAgICAgICBzcmNfbWFzayAgICAgICAgID0gMHgwMDdGRkZGRTsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSAgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHJlbG9jX3NpZ25lZF9taW4gPSB+cmVsb2Nfc2lnbmVkX21heDsKLQkgICAgICBiZmRfdm1hICAgICAgICAgY2hlY2s7Ci0JICAgICAgYmZkX3NpZ25lZF92bWEgIHNpZ25lZF9jaGVjazsKLQkgICAgICBiZmRfdm1hICAgICAgICAgYWRkOwotCSAgICAgIGJmZF9zaWduZWRfdm1hICBzaWduZWRfYWRkOwotCi0JICAgICAgQkZEX0FTU0VSVCAoc2l6ZSA9PSA0KTsKLQkgICAgICAKLSAgICAgICAgICAgICAgLyogaG93dG8tPnBjX3JlbGF0aXZlIHNob3VsZCBiZSBUUlVFIGZvciB0eXBlIDE0IEJSQU5DSDIzICovCi0gICAgICAgICAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICAKLSAgICAgICAgICAgICAgLyogaG93dG8tPnBjcmVsX29mZnNldCBzaG91bGQgYmUgVFJVRSBmb3IgdHlwZSAxNCBCUkFOQ0gyMyAqLwotICAgICAgICAgICAgICByZWxvY2F0aW9uIC09IGFkZHJlc3M7Ci0JICAgICAgCi0JICAgICAgLyogTm8gbmVlZCB0byBuZWdhdGUgdGhlIHJlbG9jYXRpb24gd2l0aCBCUkFOQ0gyMy4gKi8KLQkgICAgICAvKiBob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkIGZvciBCUkFOQ0gyMy4gICovCi0JICAgICAgLyogaG93dG8tPnJpZ2h0c2hpZnQgPT0gMSAqLwotCSAgICAgIC8qIERyb3AgdW53YW50ZWQgYml0cyBmcm9tIHRoZSB2YWx1ZSB3ZSBhcmUgcmVsb2NhdGluZyB0by4gICovCi0JICAgICAgCi0JICAgICAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCQkKLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkJIGxlYWRpbmcgMSBiaXRzIChhc3N1bWluZyB0d29zIGNvbXBsZW1lbnQpLiAgKi8KLQkgICAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID49IDApCi0JCXNpZ25lZF9jaGVjayA9IGNoZWNrOwotCSAgICAgIGVsc2UKLQkJc2lnbmVkX2NoZWNrID0gKGNoZWNrCi0JCQkJfCAoKGJmZF92bWEpIC0gMQotCQkJCSAgICYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5yaWdodHNoaWZ0KSkpOwotCSAgICAgIAotCSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLwotCSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJewotCQkgIGFkZCA9ICgoKHgpICYgMHgwN2ZmMDAwMCkgPj4gNCkgfCAoKCh4KSAmIDB4N2ZmKSA8PCAxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFkZCA9ICgoKCh4KSAmIDB4N2ZmKSA8PCAxMikgfCAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDE1KSk7Ci0JCX0KLQotCSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBhbiBhcHByb3ByaWF0ZSBzaWduLgotCQkgVGhlIGV4cHJlc3Npb24gaW52b2x2aW5nIGhvd3RvLT5zcmNfbWFzayBpc29sYXRlcyB0aGUgdXBwZXIKLQkJIGJpdCBvZiBzcmNfbWFzay4gIElmIHRoYXQgYml0IGlzIHNldCBpbiB0aGUgdmFsdWUgd2UgYXJlCi0JCSBhZGRpbmcsIGl0IGlzIG5lZ2F0aXZlLCBhbmQgd2Ugc3VidHJhY3Qgb3V0IHRoYXQgbnVtYmVyIHRpbWVzCi0JCSB0d28uICBJZiBzcmNfbWFzayBpbmNsdWRlcyB0aGUgaGlnaGVzdCBwb3NzaWJsZSBiaXQsIHRoZW4gd2UKLQkJIGNhbiBub3QgZ2V0IHRoZSB1cHBlciBiaXQsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciBzaW5jZQotCQkgc2lnbmVkX2FkZCBuZWVkcyBubyBhZGp1c3RtZW50IHRvIGJlY29tZSBuZWdhdGl2ZSBpbiB0aGF0Ci0JCSBjYXNlLiAgKi8KLQkgICAgICAKLQkgICAgICBzaWduZWRfYWRkID0gYWRkOwotCSAgICAgIAotCSAgICAgIGlmICgoYWRkICYgKCgofiBzcmNfbWFzaykgPj4gMSkgJiBzcmNfbWFzaykpICE9IDApCi0JCXNpZ25lZF9hZGQgLT0gKCgofiBzcmNfbWFzaykgPj4gMSkgJiBzcmNfbWFzaykgPDwgMTsKLQkgICAgICAKLQkgICAgICAvKiBBZGQgdGhlIHZhbHVlIGZyb20gdGhlIG9iamVjdCBmaWxlLCBzaGlmdGVkIHNvIHRoYXQgaXQgaXMgYQotCQkgc3RyYWlnaHQgbnVtYmVyLiAgKi8KLQkgICAgICAvKiBob3d0by0+Yml0cG9zID09IDAgKi8KLQkgICAgICAKLQkgICAgICBzaWduZWRfY2hlY2sgKz0gc2lnbmVkX2FkZDsKLQkgICAgICByZWxvY2F0aW9uICs9IHNpZ25lZF9hZGQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKTsKLQotCSAgICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCi0JICAgICAgaWYgKCAgIHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJICB8fCBzaWduZWRfY2hlY2sgPCByZWxvY19zaWduZWRfbWluKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgCi0JICAgICAgLyogUHV0IFJFTE9DQVRJT04gaW50byB0aGUgY29ycmVjdCBiaXRzOiAgKi8KLQkgICAgICAKLQkgICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKCgocmVsb2NhdGlvbiAmIDB4ZmZlKSA+PiAxKSAgfCAoKHJlbG9jYXRpb24gPDwgNCkgJiAweDA3ZmYwMDAwKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICByZWxvY2F0aW9uID0gKCgocmVsb2NhdGlvbiAmIDB4ZmZlKSA8PCAxNSkgfCAoKHJlbG9jYXRpb24gPj4gMTIpICYgMHg3ZmYpKTsKLQkJfQotCSAgICAgIAotCSAgICAgIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSBjb3JyZWN0IGJpdHMgb2YgWDogICovCi0JICAgICAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgcmVsb2NhdGlvbik7Ci0KLQkgICAgICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZTogICovCi0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0KLQkgICAgICByc3RhdCA9IG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogVEhVTUJFWFRFTlNJT04gKi8KLSAgICAgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgYWRkZW5kKTsKLSNpZiAxIC8qIFRIVU1CRVhURU5TSU9OICovCi0gICAgICAvKiBGSVhNRTogCi0JIElzIHRoaXMgdGhlIGJlc3Qgd2F5IHRvIGZpeCB1cCB0aHVtYiBhZGRyZXNzZXM/IGtya0BjeWdudXMuY29tCi0JIFByb2JhYmx5IG5vdCwgYnV0IGl0IHdvcmtzLCBhbmQgaWYgaXQgd29ya3MgaXQgZG9uJ3QgbmVlZCBmaXhpbmchICBuaWNrY0BjeWdudXMuY29tICovCi0gICAgICAvKiBPbmx5IHBlcmZvcm0gdGhpcyBmaXggZHVyaW5nIHRoZSBmaW5hbCBsaW5rLCBub3QgYSByZWxvY2F0YWJsZSBsaW5rLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLSAgICAgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgJiYgKHJlbC0+cl90eXBlID09IEFSTV8zMiB8fCByZWwtPnJfdHlwZSA9PSBBUk1fUlZBMzIpKQotCXsKLQkgIC8qIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIHNldCB0aGUgYm90dG9tIGJpdCBvZiBhIHJlbG9jYXRlZCBhZGRyZXNzCi0JICAgICBiZWNhdXNlIHRoZSBhZGRyZXNzIGlzIHRoZSBhZGRyZXNzIG9mIGEgVGh1bWIgY29kZSBzeW1ib2wuICAqLwotCSAgICAgCi0JICBpbnQgcGF0Y2hpdCA9IGZhbHNlOwotCSAgCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKCAgIGgtPmNsYXNzID09IENfVEhVTUJTVEFURlVOQwotCQkgIHx8IGgtPmNsYXNzID09IENfVEhVTUJFWFRGVU5DKSkKLQkgICAgewotCSAgICAgIHBhdGNoaXQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzeW0gIT0gTlVMTAotCQkgICAmJiBzeW0tPm5fc2NudW0gPiBOX1VOREVGKQotCSAgICB7Ci0JICAgICAgLyogTm8gaGFzaCBlbnRyeSAtIHVzZSB0aGUgc3ltYm9sIGluc3RlYWQuICAqLwotCi0JICAgICAgaWYgKCAgIHN5bS0+bl9zY2xhc3MgPT0gQ19USFVNQlNUQVRGVU5DCi0JCSAgfHwgc3ltLT5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKLQkJcGF0Y2hpdCA9IHRydWU7Ci0JICAgIH0KLQotCSAgaWYgKHBhdGNoaXQpCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSAqIGxvY2F0aW9uID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0JICAgICAgYmZkX3ZtYSAgICB4ICAgICAgICA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotCi0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4IHwgMSwgbG9jYXRpb24pOwotCSAgICB9Ci0JfQotI2VuZGlmIC8qIFRIVU1CRVhURU5TSU9OICovICAgICAgCi0gICAgICAKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyLAotCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljCi0jZW5kaWYKLWJvb2xlYW4KLWJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIChpbmZvKSAKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotewotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICAgICAgczsKLSAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgICAgICAgICAgIGZvbzsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0jaWYgMAotICBzdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jaGFyID0gJzEnOwotI2VuZGlmCi0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotICAgICAgCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotI2lmIDAKLSAgICAgIG1lbXNldCAoZm9vLCB0ZXN0X2NoYXIsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUpOwotI2VuZGlmCi0gICAgICAKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IHMtPl9jb29rZWRfc2l6ZSA9IGdsb2JhbHMtPmFybV9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgaWYgKGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotICAgICAgCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICAKLSAgICAgIGZvbyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MKLQkoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZSk7Ci0jaWYgMAotICAgICAgbWVtc2V0IChmb28sIHRlc3RfY2hhciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLSNlbmRpZgotICAgICAgCi0gICAgICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemU7Ci0gICAgICBzLT5jb250ZW50cyA9IGZvbzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiAgICAgICAgICAgICAgIHM7Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgIG15aDsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0JICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLSAgCi0gIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cAotICAgIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB0bXBfbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47IC8qIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGd1eSAqLwotICAgIH0KLQotICAvKiBUaGUgb25seSB0cmljayBoZXJlIGlzIHVzaW5nIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgYXMgdGhlIHZhbHVlLiBFdmVuCi0gICAgIHRob3VnaCB0aGUgc2VjdGlvbiBpc24ndCBhbGxvY2F0ZWQgeWV0LCB0aGlzIGlzIHdoZXJlIHdlIHdpbGwgYmUgcHV0dGluZwotICAgICBpdC4gICovCi0KLSAgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJCUJTRl9HTE9CQUwsIAotCQkJCXMsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKyAxLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLSAgCi0gIGZyZWUgKHRtcF9uYW1lKTsKLSAgCi0gIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKz0gQVJNMlRIVU1CX0dMVUVfU0laRTsKLQotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1yZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgIGluZm87Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogICAgICAgICAgICAgICAgczsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfbmFtZTsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogICAgICBteWg7Ci0gIHN0cnVjdCBjb2ZmX2FybV9saW5rX2hhc2hfdGFibGUgKiAgZ2xvYmFsczsKLQotICAKLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAKLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsgLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfR0xPQkFMLCBzLCBnbG9iYWxzLT50aHVtYl9nbHVlX3NpemUgKyAxLAotCQkJCU5VTEwsIHRydWUsIGZhbHNlLCAKLQkJCQkoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICYgbXloKTsKLSAgCi0gIC8qIElmIHdlIG1hcmsgaXQgJ3RodW1iJywgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGRvIGEgYmV0dGVyIGpvYi4gICovCi0gIG15aC0+Y2xhc3MgPSBDX1RIVU1CRVhURlVOQzsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgLyogQWxsb2NhdGUgYW5vdGhlciBzeW1ib2wgdG8gbWFyayB3aGVyZSB3ZSBzd2l0Y2ggdG8gYXJtIG1vZGUuICAqLwotICAgICAgCi0jZGVmaW5lIENIQU5HRV9UT19BUk0gIl9fJXNfY2hhbmdlX3RvX2FybSIKLSNkZWZpbmUgQkFDS19GUk9NX0FSTSAiX18lc19iYWNrX2Zyb21fYXJtIgotICAKLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChDSEFOR0VfVE9fQVJNKSArIDEpOwotICAKLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotICAKLSAgc3ByaW50ZiAodG1wX25hbWUsIGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyBCQUNLX0ZST01fQVJNIDogQ0hBTkdFX1RPX0FSTSwgbmFtZSk7Ci0KLSAgbXloID0gTlVMTDsKLSAgCi0gIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCB0bXBfbmFtZSwKLQkJCQlCU0ZfTE9DQUwsIHMsIGdsb2JhbHMtPnRodW1iX2dsdWVfc2l6ZQotCQkJCSsgKGdsb2JhbHMtPnN1cHBvcnRfb2xkX2NvZGUgPyA4IDogNCksCi0JCQkJTlVMTCwgdHJ1ZSwgZmFsc2UsIAotCQkJCShzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJiBteWgpOwotCi0gIGZyZWUgKHRtcF9uYW1lKTsgIAotICAKLSAgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICs9IFRIVU1CMkFSTV9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBTZWxlY3QgYSBCRkQgdG8gYmUgdXNlZCB0byBob2xkIHRoZSBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBnbHVlIGNvZGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiBsZC9lbXVsdGVtcGwvCi0gICB7YXJtY29mZi9wZX0uZW0gICovCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMKLSNlbmRpZgotYm9vbGVhbgotYmZkX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqIAkJICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLXsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0gIGZsYWd3b3JkICAgCQkJICAgIGZsYWdzOwotICBhc2VjdGlvbiAqIAkJCSAgICBzZWM7Ci0gICAgCi0gIC8qIElmIHdlIGFyZSBvbmx5IHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmsgZG8gbm90IGJvdGhlcgotICAgICBnZXR0aW5nIGEgYmZkIHRvIGhvbGQgdGhlIGdsdWUuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLQotICBpZiAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotICAKLSAgaWYgKHNlYyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0gICAgICAKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gICAgICAKLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICBpZiAoc2VjID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLSAgICAgIAotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLSAgICAgIAotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAKLSAgLyogU2F2ZSB0aGUgYmZkIGZvciBsYXRlciB1c2UuICAqLwotICBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciA9IGFiZmQ7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotc3RhdGljCi0jZW5kaWYKLWJvb2xlYW4KLWJmZF9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbywgc3VwcG9ydF9vbGRfY29kZSkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgaW50CQkgICAgIHN1cHBvcnRfb2xkX2NvZGU7Ci17Ci0gIGFzZWN0aW9uICogc2VjOwotICBzdHJ1Y3QgY29mZl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgdG8gY29uc3RydWN0IGFueSBnbHVlLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIEhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiAgV2UgaGF2ZSBhIGhvb2sKLSAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICAqLwotCi0gIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCk7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotICAKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgZ2xvYmFscy0+c3VwcG9ydF9vbGRfY29kZSA9IHN1cHBvcnRfb2xkX2NvZGU7Ci0gIAotICAvKiBSdW1tYWdlIGFyb3VuZCBhbGwgdGhlIHJlbG9jcyBhbmQgbWFwIHRoZSBnbHVlIHZlY3RvcnMuICAqLwotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLQotICBpZiAoc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yICg7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICogaTsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbDsKLQotICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkgCi0JY29udGludWU7Ci0KLSAgICAgIC8qIExvYWQgdGhlIHJlbG9jcy4gICovCi0gICAgICAvKiBGSVhNRTogdGhlcmUgbWF5IGJlIGEgc3RvcmFnZSBsZWFrIGhlcmUuICovCi0gICAgICAKLSAgICAgIGkgPSBfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIHNlYywgMSwgMCwgMCwgMCk7Ci0gICAgCi0gICAgICBCRkRfQVNTRVJUIChpICE9IDApOwotCi0gICAgICBmb3IgKHJlbCA9IGk7IHJlbCA8IGkgKyBzZWMtPnJlbG9jX2NvdW50OyArK3JlbCkgCi0JewotCSAgdW5zaWduZWQgc2hvcnQgICAgICAgICAgICAgICAgIHJfdHlwZSAgPSByZWwtPnJfdHlwZTsKLQkgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1uZHg7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiAgaDsKLQotCSAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgbm90IGFnYWluc3QgYSBzeW1ib2wgaXQgY2Fubm90IGNvbmNlcm4gdXMuICovCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICBjb250aW51ZTsKLQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3N5bW5keF07Ci0KLQkgIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIGFnYWluc3QgYSBzdGF0aWMgc3ltYm9sIGl0IG11c3QgYmUgd2l0aGluCi0JICAgICB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCBzbyBjYW5ub3QgYmUgYSBjcm9zcyBBUk0vVGh1bWIgcmVsb2NhdGlvbi4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgc3dpdGNoIChyX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBBUk1fMjY6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gYXJtIGNvZGUuICBXZSBuZWVkIHRvIGxvb2sgdXAKLQkJIHRoZSB0YXJnZXQgb2YgdGhlIGNhbGwuIElmIGl0IGlzIGEgdGh1bWIgdGFyZ2V0LCB3ZQotCQkgaW5zZXJ0IGdsdWUuICAqLwotCSAgICAgIAotCSAgICAgIGlmIChoLT5jbGFzcyA9PSBDX1RIVU1CRVhURlVOQykKLQkJcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChpbmZvLCBoKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUk1fVEhVTUIyMzoKLQkgICAgICAvKiBUaGlzIG9uZSBpcyBhIGNhbGwgZnJvbSB0aHVtYiBjb2RlLiAgV2UgdXNlZCB0byBsb29rCi0JCSBmb3IgQVJNX1RIVU1COSBhbmQgQVJNX1RIVU1CMTIgYXMgd2VsbC4gIFdlIG5lZWQgdG8gbG9vawotCQkgdXAgdGhlIHRhcmdldCBvZiB0aGUgY2FsbC4gSWYgaXQgaXMgYW4gYXJtIHRhcmdldCwgd2UKLQkJIGluc2VydCBnbHVlLiAgSWYgdGhlIHN5bWJvbCBkb2VzIG5vdCBleGlzdCBpdCB3aWxsIGJlCi0JCSBnaXZlbiBhIGNsYXNzIG9mIENfRVhUIGFuZCBzbyB3ZSB3aWxsIGdlbmVyYXRlIGEgc3R1YgotCQkgZm9yIGl0LiAgVGhpcyBpcyBub3QgcmVhbGx5IGEgcHJvYmxlbSwgc2luY2UgdGhlIGxpbmsKLQkJIGlzIGRvb21lZCBhbnl3YXkuICAqLwotCi0JICAgICAgc3dpdGNoIChoLT5jbGFzcykKLQkJewotCQljYXNlIENfRVhUOgotCQljYXNlIENfU1RBVDoKLQkJY2FzZSBDX0xBQkVMOgotCQkgIHJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSAoaW5mbywgaCk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIAkJY29mZl9hcm1fcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIAkJCWNvZmZfYXJtX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAJCWNvZmZfYXJtX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4CQkJY29mZl9hcm1fYWRqdXN0X3N5bW5keAotI2RlZmluZSBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biAJCWNvZmZfYXJtX2xpbmtfb3V0cHV0X2hhc19iZWd1bgotI2RlZmluZSBjb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdAkJY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0Ci0jZGVmaW5lIGNvZmZfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEJCWNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQkJY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyAgICAgICAgICAgICAgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICAgICAgY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUJCWNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotCi0vKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIHdhbnQgdG8gY29udmVydCBBUk0yNiByZWxvY3MKLSAgIGludG8gQVJNMjZEIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2FybV9hZGp1c3Rfc3ltbmR4IChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIGlyZWwsIGFkanVzdGVkcCkKLSAgICAgYmZkICpvYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgIGJvb2xlYW4gKmFkanVzdGVkcDsKLXsKLSAgaWYgKGlyZWwtPnJfdHlwZSA9PSAzKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGliZmQpW2lyZWwtPnJfc3ltbmR4XTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gc2VjLT5vdXRwdXRfc2VjdGlvbikKLQlpcmVsLT5yX3R5cGUgPSA3OwotICAgIH0KLSAgKmFkanVzdGVkcCA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsbGVkIHdoZW4gbWVyZ2luZyB0aGUgcHJpdmF0ZSBkYXRhIGFyZWFzIG9mIHR3byBCRkRzLgotICAgVGhpcyBpcyBpbXBvcnRhbnQgYXMgaXQgYWxsb3dzIHVzIHRvIGRldGVjdCBpZiB3ZSBhcmUKLSAgIGF0dGVtcHRpbmcgdG8gbWVyZ2UgYmluYXJpZXMgY29tcGlsZWQgZm9yIGRpZmZlcmVudCBBUk0KLSAgIHRhcmdldHMsIGVnIGRpZmZlcmVudCBDUFVzIG9yIGRpZmZlcmVudHMgQVBDUydzLiAgICAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqICAgaWJmZDsKLSAgICAgYmZkICogICBvYmZkOwotewotICBCRkRfQVNTRVJUIChpYmZkICE9IE5VTEwgJiYgb2JmZCAhPSBOVUxMKTsKLQotICBpZiAoaWJmZCA9PSBvYmZkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZSB0d28gZm9ybWF0cyBhcmUgZGlmZmVyZW50IHdlIGNhbm5vdCBtZXJnZSBhbnl0aGluZy4KLSAgICAgVGhpcyBpcyBub3QgYW4gZXJyb3IsIHNpbmNlIGl0IGlzIHBlcm1pc3NhYmxlIHRvIGNoYW5nZSB0aGUKLSAgICAgaW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzLiAgKi8KLSAgaWYgKCAgIGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgdGhlIEFQQ1MgaXMgdGhlIHNhbWUgZm9yIHRoZSB0d28gQkZEcyAqLwotICBpZiAoQVBDU19TRVQgKGliZmQpKQotICAgIHsKLSAgICAgIGlmIChBUENTX1NFVCAob2JmZCkpCi0JewotCSAgLyogSWYgdGhlIHNyYyBhbmQgZGVzdCBoYXZlIGRpZmZlcmVudCBBUENTIGZsYWcgYml0cyBzZXQsIGZhaWwuICAqLwotCSAgaWYgKEFQQ1NfMjZfRkxBRyAob2JmZCkgIT0gQVBDU18yNl9GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlcgotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJKF8oIiVzOiBFUlJPUjogY29tcGlsZWQgZm9yIEFQQ1MtJWQgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBBUENTLSVkIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwgQVBDU18yNl9GTEFHIChpYmZkKSA/IDI2IDogMzIsCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSwgQVBDU18yNl9GTEFHIChvYmZkKSA/IDI2IDogMzIKLQkJICk7Ci0KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIAotCSAgaWYgKEFQQ1NfRkxPQVRfRkxBRyAob2JmZCkgIT0gQVBDU19GTE9BVF9GTEFHIChpYmZkKSkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm1zZzsKLQotCSAgICAgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGliZmQpKQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGZsb2F0IHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGludGVnZXIgcmVnaXN0ZXJzIik7Ci0JICAgICAgZWxzZQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGludGVnZXIgcmVnaXN0ZXJzIHdoZXJlYXMgdGFyZ2V0ICVzIHVzZXMgZmxvYXQgcmVnaXN0ZXJzIik7Ci0JICAgICAgCi0JICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAKLQkgIGlmIChQSUNfRkxBRyAob2JmZCkgIT0gUElDX0ZMQUcgKGliZmQpKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqIG1zZzsKLQotCSAgICAgIGlmIChQSUNfRkxBRyAoaWJmZCkpCi0JCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCQltc2cgPSBfKCIlczogRVJST1I6IGNvbXBpbGVkIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzIGFic29sdXRlIHBvc2l0aW9uIik7Ci0JICAgICAgZWxzZQotCQkvKiB4Z2V0dGV4dDogYy1mb3JtYXQgKi8KLQkJbXNnID0gXygiJXM6IEVSUk9SOiBjb21waWxlZCBhcyBhYnNvbHV0ZSBwb3NpdGlvbiBjb2RlLCB3aGVyZWFzIHRhcmdldCAlcyBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudCIpOwotCSAgICAgIF9iZmRfZXJyb3JfaGFuZGxlciAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTRVRfQVBDU19GTEFHUyAob2JmZCwgQVBDU18yNl9GTEFHIChpYmZkKSB8IEFQQ1NfRkxPQVRfRkxBRyAoaWJmZCkgfCBQSUNfRkxBRyAoaWJmZCkpOwotCSAgCi0JICAvKiBTZXQgdXAgdGhlIGFyY2ggYW5kIGZpZWxkcyBhcyB3ZWxsIGFzIHRoZXNlIGFyZSBwcm9iYWJseSB3cm9uZy4gICovCi0JICBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2dldF9hcmNoIChpYmZkKSwgYmZkX2dldF9tYWNoIChpYmZkKSk7Ci0JfQotICAgIH0KLQotICAvKiBDaGVjayB0aGUgaW50ZXJ3b3JraW5nIHN1cHBvcnQuICAqLwotICBpZiAoSU5URVJXT1JLX1NFVCAoaWJmZCkpCi0gICAgewotICAgICAgaWYgKElOVEVSV09SS19TRVQgKG9iZmQpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgZGlmZmVyIGluIHRoZWlyIGludGVyd29ya2luZyBpc3N1ZSBhIHdhcm5pbmcuICAqLwotCSAgaWYgKElOVEVSV09SS19GTEFHIChvYmZkKSAhPSBJTlRFUldPUktfRkxBRyAoaWJmZCkpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICogbXNnOwotCi0JICAgICAgaWYgKElOVEVSV09SS19GTEFHIChpYmZkKSkKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgc3VwcG9ydHMgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzIGRvZXMgbm90LiIpOwotCSAgICAgIGVsc2UKLQkJLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JCW1zZyA9IF8oIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcy4iKTsKLQkgICAgICAKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKG1zZywgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgU0VUX0lOVEVSV09SS19GTEFHIChvYmZkLCBJTlRFUldPUktfRkxBRyAoaWJmZCkpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKQotICAgICBiZmQgKiAgIGFiZmQ7Ci0gICAgIFBUUiAgICAgcHRyOwotewotICBGSUxFICogZmlsZSA9IChGSUxFICopIHB0cjsKLSAgCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0gIAotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJwcml2YXRlIGZsYWdzID0gJXg6IiksIGNvZmZfZGF0YSAoYWJmZCktPmZsYWdzKTsKLSAgCi0gIGlmIChBUENTX1NFVCAoYWJmZCkpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6IEFQQ1MgaXMgQVJNIFByb2RlY3VyZSBDYWxsIFN0YW5kYXJkLCBpdCBzaG91bGQgbm90IGJlIHRyYW5zbGF0ZWQuICAqLwotICAgICAgZnByaW50ZiAoZmlsZSwgIiBbQVBDUy0lZF0iLCBBUENTXzI2X0ZMQUcgKGFiZmQpID8gMjYgOiAzMik7Ci0KLSAgICAgIGlmIChBUENTX0ZMT0FUX0ZMQUcgKGFiZmQpKQotCWZwcmludGYgKGZpbGUsIF8oIiBbZmxvYXRzIHBhc3NlZCBpbiBmbG9hdCByZWdpc3RlcnNdIikpOwotICAgICAgZWxzZQotCWZwcmludGYgKGZpbGUsIF8oIiBbZmxvYXRzIHBhc3NlZCBpbiBpbnRlZ2VyIHJlZ2lzdGVyc10iKSk7Ci0KLSAgICAgIGlmIChQSUNfRkxBRyAoYWJmZCkpCi0JZnByaW50ZiAoZmlsZSwgXygiIFtwb3NpdGlvbiBpbmRlcGVuZGVudF0iKSk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZmlsZSwgXygiIFthYnNvbHV0ZSBwb3NpdGlvbl0iKSk7Ci0gICAgfQotICAKLSAgaWYgKCEgSU5URVJXT1JLX1NFVCAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXygiIFtpbnRlcndvcmtpbmcgZmxhZyBub3QgaW5pdGlhbGlzZWRdIikpOwotICBlbHNlIGlmIChJTlRFUldPUktfRkxBRyAoYWJmZCkpCi0gICAgZnByaW50ZiAoZmlsZSwgXygiIFtpbnRlcndvcmtpbmcgc3VwcG9ydGVkXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8oIiBbaW50ZXJ3b3JraW5nIG5vdCBzdXBwb3J0ZWRdIikpOwotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogQ29waWVzIHRoZSBnaXZlbiBmbGFncyBpbnRvIHRoZSBjb2ZmX3RkYXRhLmZsYWdzIGZpZWxkLgotICAgVHlwaWNhbGx5IHRoZXNlIGZsYWdzIGNvbWUgZnJvbSB0aGUgZl9mbGFnc1tdIGZpZWxkIG9mCi0gICB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwgd2hpY2ggY29udGFpbnMgaW1wb3J0YW50LAotICAgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uLgotICAgTm90ZTogQWx0aG91Z2ggdGhpcyBmdW5jdGlvbiBpcyBzdGF0aWMsIGl0IGlzIGV4cGxpY2l0bHkKLSAgIGNhbGxlZCBmcm9tIGJvdGggY29mZmNvZGUuaCBhbmQgcGVpY29kZS5oLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLV9iZmRfY29mZl9hcm1fc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotCWJmZCAqCSAgIGFiZmQ7Ci0JZmxhZ3dvcmQgICBmbGFnczsKLXsKLSAgZmxhZ3dvcmQgZmxhZzsKLQotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwpOwotCi0gIGZsYWcgPSAoZmxhZ3MgJiBGX0FQQ1MyNikgPyBGX0FQQ1NfMjYgOiAwOwotICAKLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIEFQQ1MgZmllbGQgaGFzIG5vdCBiZWVuIGluaXRpYWxpc2VkIHRvIHRoZSBvcHBvc2l0ZQotICAgICB2YWx1ZS4gICovCi0gIGlmIChBUENTX1NFVCAoYWJmZCkKLSAgICAgICYmICggICAoQVBDU18yNl9GTEFHICAgIChhYmZkKSAhPSBmbGFnKQotCSAgfHwgKEFQQ1NfRkxPQVRfRkxBRyAoYWJmZCkgIT0gKGZsYWdzICYgRl9BUENTX0ZMT0FUKSkKLQkgIHx8IChQSUNfRkxBRyAgICAgICAgKGFiZmQpICE9IChmbGFncyAmIEZfUElDKSkKLQkgICkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZsYWcgfD0gKGZsYWdzICYgKEZfQVBDU19GTE9BVCB8IEZfUElDKSk7Ci0gIAotICBTRVRfQVBDU19GTEFHUyAoYWJmZCwgZmxhZyk7Ci0KLSAgZmxhZyA9IChmbGFncyAmIEZfSU5URVJXT1JLKTsKLSAgCi0gIC8qIElmIHRoZSBCRkQgaGFzIGFscmVhZHkgaGFkIGl0cyBpbnRlcndvcmtpbmcgZmxhZyBzZXQsIGJ1dCBpdAotICAgICBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWUgdGhhdCB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gc2V0LAotICAgICB0aGVuIGFzc3VtZSB0aGF0IHRoYXQgbWVyZ2VkIGNvZGUgd2lsbCBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcKLSAgICAgYW5kIHNldCB0aGUgZmxhZyBhY2NvcmRpbmdseS4gICovCi0gIGlmIChJTlRFUldPUktfU0VUIChhYmZkKSAmJiAoSU5URVJXT1JLX0ZMQUcgKGFiZmQpICE9IGZsYWcpKQotICAgIHsKLSAgICAgIGlmIChmbGFnKQotCS8qIHhnZXR0ZXh0OiBjLWZvcm1hdCAqLwotCV9iZmRfZXJyb3JfaGFuZGxlciAoXygiV2FybmluZzogTm90IHNldHRpbmcgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMsIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JLyogeGdldHRleHQ6IGMtZm9ybWF0ICovCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfKCJXYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JraW5nIGZsYWcgb2YgJXMgZHVlIHRvIG91dHNpZGUgcmVxdWVzdCIpLAotCQkJICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGZsYWcgPSAwOwotICAgIH0KLQotICBTRVRfSU5URVJXT1JLX0ZMQUcgKGFiZmQsIGZsYWcpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENvcHkgdGhlIGltcG9ydGFudCBwYXJ0cyBvZiB0aGUgdGFyZ2V0IHNwZWNpZmljIGRhdGEKLSAgIGZyb20gb25lIGluc3RhbmNlIG9mIGEgQkZEIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhIChzcmMsIGRlc3QpCi0gICAgIGJmZCAqICBzcmM7Ci0gICAgIGJmZCAqICBkZXN0OwotewotICBCRkRfQVNTRVJUIChzcmMgIT0gTlVMTCAmJiBkZXN0ICE9IE5VTEwpOwotIAotICBpZiAoc3JjID09IGRlc3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIGlzIG5vdCBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIHNvdXJjZSwgZG8gbm90IGRvCi0gICAgIHRoZSBjb3B5LiAgKi8KLSAgaWYgKHNyYy0+eHZlYyAhPSBkZXN0LT54dmVjKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIGNvcHkgdGhlIGZsYWdzIGZpZWxkICovCi0gIGlmIChBUENTX1NFVCAoc3JjKSkKLSAgICB7Ci0gICAgICBpZiAoQVBDU19TRVQgKGRlc3QpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgQVBDUyBmbGFnIGJpdHMgc2V0LCBmYWlsLiAgKi8KLQkgIGlmIChBUENTXzI2X0ZMQUcgKGRlc3QpICE9IEFQQ1NfMjZfRkxBRyAoc3JjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgCi0JICBpZiAoQVBDU19GTE9BVF9GTEFHIChkZXN0KSAhPSBBUENTX0ZMT0FUX0ZMQUcgKHNyYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIAotCSAgaWYgKFBJQ19GTEFHIChkZXN0KSAhPSBQSUNfRkxBRyAoc3JjKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQlTRVRfQVBDU19GTEFHUyAoZGVzdCwgQVBDU18yNl9GTEFHIChzcmMpIHwgQVBDU19GTE9BVF9GTEFHIChzcmMpCi0JCQl8IFBJQ19GTEFHIChzcmMpKTsKLSAgICB9Ci0KLSAgaWYgKElOVEVSV09SS19TRVQgKHNyYykpCi0gICAgewotICAgICAgaWYgKElOVEVSV09SS19TRVQgKGRlc3QpKQotCXsKLQkgIC8qIElmIHRoZSBzcmMgYW5kIGRlc3QgaGF2ZSBkaWZmZXJlbnQgaW50ZXJ3b3JraW5nIGZsYWdzIHRoZW4gdHVybgotCSAgICAgb2ZmIHRoZSBpbnRlcndvcmtpbmcgYml0LiAgKi8KLQkgIGlmIChJTlRFUldPUktfRkxBRyAoZGVzdCkgIT0gSU5URVJXT1JLX0ZMQUcgKHNyYykpCi0JICAgIHsKLQkgICAgICBpZiAoSU5URVJXT1JLX0ZMQUcgKGRlc3QpKQotCQl7Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBfYmZkX2Vycm9yX2hhbmRsZXIgKCgiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBiaXQgb2YgJXMsIGJlY2F1c2UgdGhlIG5vbi1pbnRlcndvcmtpbmcgY29kZSBpbiAlcyBoYXMgYmVlbiBjb3BpZWQgaW50byBpdCIpLAotCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGRlc3QpLAotCQkJCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHNyYykpOwotCQl9Ci0JICAgICAgCi0JICAgICAgU0VUX0lOVEVSV09SS19GTEFHIChkZXN0LCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTRVRfSU5URVJXT1JLX0ZMQUcgKGRlc3QsIElOVEVSV09SS19GTEFHIChzcmMpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBOb3RlOiAgdGhlIGRlZmluaXRpb25zIGhlcmUgb2YgTE9DQUxfTEFCRUxfUFJFRklYIGFuZCBVU0VSX0xBQkVMX1BSRUlGWAotICptdXN0KiBtYXRjaCB0aGUgZGVmaW5pdGlvbnMgaW4gZ2NjL2NvbmZpZy9hcm0vY29mZi5oIGFuZCBzZW1pLmggKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxfUFJFRklYICIuIgotI2lmbmRlZiBVU0VSX0xBQkVMX1BSRUZJWAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAiXyIKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1faXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICogICAgICAgIGFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKiBuYW1lOwotewotI2lmZGVmIExPQ0FMX0xBQkVMX1BSRUZJWAotICAvKiBJZiB0aGVyZSBpcyBhIHByZWZpeCBmb3IgbG9jYWwgbGFiZWxzIHRoZW4gbG9vayBmb3IgdGhpcy4KLSAgICAgSWYgdGhlIHByZWZpeCBleGlzdHMsIGJ1dCBpdCBpcyBlbXB0eSwgdGhlbiBpZ25vcmUgdGhlIHRlc3QuICovCi0gIAotICBpZiAoTE9DQUxfTEFCRUxfUFJFRklYWzBdICE9IDApCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsIExPQ0FMX0xBQkVMX1BSRUZJWCwgc3RybGVuIChMT0NBTF9MQUJFTF9QUkVGSVgpKSA9PSAwKQotCXJldHVybiB0cnVlOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFVTRVJfTEFCRUxfUFJFRklYCi0gIGlmIChVU0VSX0xBQkVMX1BSRUZJWFswXSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCBVU0VSX0xBQkVMX1BSRUZJWCwgc3RybGVuIChVU0VSX0xBQkVMX1BSRUZJWCkpID09IDApCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotICAKLSAgLyogZGV2by9nY2MvY29uZmlnL2RieGNvZmYuaCBkZWZpbmVzIEFTTV9PVVRQVVRfU09VUkNFX0xJTkUgdG8gZ2VuZXJhdGUKLSAgICAgbG9jYWwgbGluZSBudW1iZXJzIGFzIC5MTTxudW1iZXI+LCBzbyB0cmVhdCB0aGVzZSBhcyBsb2NhbC4gICovCi0gIAotICBzd2l0Y2ggKG5hbWVbMF0pCi0gICAgewotICAgIGNhc2UgJ0wnOiByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlICcuJzogcmV0dXJuIChuYW1lWzFdID09ICdMJyAmJiBuYW1lWzJdID09ICdNJykgPyB0cnVlIDogZmFsc2U7Ci0gICAgZGVmYXVsdDogIHJldHVybiBmYWxzZTsgICAgIC8qIENhbm5vdCBtYWtlIG91ciBtaW5kcyB1cCAtIGRlZmF1bHQgdG8KLQkJCQkgICBmYWxzZSBzbyB0aGF0IGl0IHdpbGwgbm90IGJlIHN0cmlwcGVkCi0JCQkJICAgYnkgYWNjaWRlbnQuICAqLyAKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcGllY2Ugb2YgbWFjaGluZXJ5IGV4aXN0cyBvbmx5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBiZmQgdGhhdCBob2xkcwotICAgdGhlIGdsdWUgc2VjdGlvbiBpcyB3cml0dGVuIGxhc3QuIAotCi0gICBUaGlzIGRvZXMgZGVwZW5kIG9uIGJmZF9tYWtlX3NlY3Rpb24gYXR0YWNoaW5nIGEgbmV3IHNlY3Rpb24gdG8gdGhlCi0gICBlbmQgb2YgdGhlIHNlY3Rpb24gbGlzdCBmb3IgdGhlIGJmZC4gCi0KLSAgIGtya0BjeWdudXMuY29tICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fbGlua19vdXRwdXRfaGFzX2JlZ3VuIChzdWIsIGluZm8pCi0gICAgIGJmZCAqIHN1YjsKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogaW5mbzsKLXsKLSAgcmV0dXJuIChzdWItPm91dHB1dF9oYXNfYmVndW4KLQkgIHx8IHN1YiA9PSBjb2ZmX2FybV9oYXNoX3RhYmxlIChpbmZvLT5pbmZvKS0+YmZkX29mX2dsdWVfb3duZXIpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hcm1fZmluYWxfbGlua19wb3N0c2NyaXB0IChhYmZkLCBwZmluZm8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIHBmaW5mbzsKLXsKLSAgc3RydWN0IGNvZmZfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGNvZmZfYXJtX2hhc2hfdGFibGUgKHBmaW5mby0+aW5mbyk7Ci0gIAotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICAKLSAgaWYgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkIChwZmluZm8sIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmIDAKLSNkZWZpbmUgY29mZl9TV0FQX3N5bV9pbiAgYXJtX2JmZF9jb2ZmX3N3YXBfc3ltX2luCi0KLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0KLS8qIFNlcGNpYWwgdmVyc2lvbiBvZiBzeW1ib2wgc3dhcHBlciwgdXNlZCB0byBncmFiIGEgYmZkCi0gICBvbnRvIHdoaWNoIHRoZSBnbHVlIHNlY3Rpb25zIGNhbiBiZSBhdHRhY2hlZC4gICovCi1zdGF0aWMgdm9pZAotYXJtX2JmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIFBUUiAgIGV4dDE7Ci0gICAgIFBUUiAgIGluMTsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICogczsKLQotICAvKiBEbyB0aGUgbm9ybWFsIHN3YXAgaW4uICAqLwotICBjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHQxLCBpbjEpOwotCi0gIGlmIChiZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKSAvKiB3ZSBhbHJlYWR5IGhhdmUgYSB0b2MsIHNvIGdvIGhvbWUgKi8KLSAgICByZXR1cm47Ci0KLSAgLyogU2F2ZSB0aGUgYmZkIGZvciBsYXRlciBhbGxvY2F0aW9uLiAgKi8KLSAgYmZkX29mX2dsdWVfb3duZXIgPSBhYmZkOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYmZkX29mX2dsdWVfb3duZXIgLCAKLQkJCSAgICAgICBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzID09IE5VTEwpIAotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSA7Ci0gICAgICAKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChiZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYmZkX29mX2dsdWVfb3duZXIsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGJmZF9vZl9nbHVlX293bmVyLCBzLCAyKSkKLQl7Ci0JICAvKiBGSVhNRTogc2V0IGFwcHJvcHJpYXRlIGJmZCBlcnJvciAqLwotCSAgYWJvcnQoKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYmZkX29mX2dsdWVfb3duZXIsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHMgPT0gTlVMTCkgCi0gICAgewotICAgICAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIDsKLSAgICAgIAotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotICAgICAgCi0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChiZmRfb2ZfZ2x1ZV9vd25lciwgcywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYmZkX29mX2dsdWVfb3duZXIsIHMsIDIpKQotCXsKLQkgIC8qIEZJWE1FOiBzZXQgYXBwcm9wcmlhdGUgYmZkIGVycm9yIGtya0BjeWdudXMuY29tICovCi0JICBhYm9ydCgpOwotCX0KLSAgICB9Ci0gIAotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQKLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotVEFSR0VUX0xJVFRMRV9TWU0gPQotI2Vsc2UKLWFybWNvZmZfbGl0dGxlX3ZlYyA9Ci0jZW5kaWYKLXsKLSNpZmRlZiBUQVJHRVRfTElUVExFX05BTUUKLSAgVEFSR0VUX0xJVFRMRV9OQU1FLAotI2Vsc2UKLSAgImNvZmYtYXJtLWxpdHRsZSIsCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSNlbHNlCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0gIFRBUkdFVF9VTkRFUlNDT1JFLAkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZWxzZQotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbmRpZgotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAmIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlLAotfTsKLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1UQVJHRVRfQklHX1NZTSA9Ci0jZWxzZQotYXJtY29mZl9iaWdfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9CSUdfTkFNRQotICBUQVJHRVRfQklHX05BTUUsCi0jZWxzZQotICAiY29mZi1hcm0tYmlnIiwKLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotI2Vsc2UKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX1VOREVSU0NPUkUKLSAgVEFSR0VUX1VOREVSU0NPUkUsCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbHNlCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2VuZGlmCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLS8qIE5vdGUgdGhhdCB3ZSBhbGxvdyBhbiBvYmplY3QgZmlsZSB0byBiZSB0cmVhdGVkIGFzIGEgY29yZSBmaWxlIGFzIHdlbGwuICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBjb2ZmX29iamVjdF9wfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpICYgYmZkX2NvZmZfc3RkX3N3YXBfdGFibGUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtYXV4LmMgYi9iZmQvY29mZi1hdXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2NjM5Mi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1hdXguYworKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFwcGxlIE02OEsgQ09GRiBBL1VYIDMueCBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1Pi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JbTY4a2F1eF9jb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkiY29mZi1tNjhrLWF1eCIKLQotI2lmbmRlZiBUQVJHX0FVWAotI2RlZmluZSBUQVJHX0FVWAotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0vKiA0ayBwYWdlcyAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAKLQotLyogT24gQVVYLCBhIFNUWVBfTk9MT0FEfFNUWVBfQlNTIHNlY3Rpb24gaXMgcGFydCBvZiBhIHNoYXJlZCBsaWJyYXJ5LiAqLwotI2RlZmluZSBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0KLSNkZWZpbmUgU1RBVElDX1JFTE9DUwotCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgCi0gICAgICAgICAgIGFzZWN0aW9uICosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwgCi0gICAgICAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLSNkZWZpbmUgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sIGNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbAotCi0jaW5jbHVkZSAiY29mZi9hdXgtY29mZi5oIiAgLyogb3ZlcnJpZGUgY29mZi9pbnRlcm5hbC5oIGFuZCBjb2ZmL202OGsuaCAqLwotI2luY2x1ZGUgImNvZmYtbTY4ay5jIgotCi0vKiBXZSBuZWVkIG5vbi1hYnNvbHV0ZSBzeW1ib2xzIHRvIG92ZXJyaWRlIGFic29sdXRlIHN5bWJvbHMuICBUaGlzCi0gICBtaXJyb3JzIEFwcGxlJ3MgInNvbHV0aW9uIiB0byBsZXQgYSBzdGF0aWMgbGlicmFyeSBzeW1ib2wgb3ZlcnJpZGUKLSAgIGEgc2hhcmVkIGxpYnJhcnkgc3ltYm9sLiAgT24gdGhlIHdob2xlIG5vdCBhIGdvb2QgdGhpbmcsIGdpdmVuIGhvdwotICAgc2hhcmVkIGxpYnJhcmllcyB3b3JrIGhlcmUsIGJ1dCBjYW4gd29yayBpZiB5b3UgYXJlIGNhcmVmdWwgd2l0aAotICAgd2hhdCB5b3UgaW5jbHVkZSBpbiB0aGUgc2hhcmVkIG9iamVjdC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbTY4a19hdXhfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkJCSAgIHN0cmluZywgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKChmbGFncyAmIChCU0ZfV0FSTklORyB8IEJTRl9DT05TVFJVQ1RPUiB8IEJTRl9XRUFLKSkgPT0gMCAmJgotICAgICAgIWJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikgJiYKLSAgICAgICFiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIFRoZSBuZXcgc3ltYm9sIGlzIGEgZGVmaW5pdGlvbiBvciBhbiBpbmRpcmVjdCBkZWZpbml0aW9uICovCi0KLSAgICAgIC8qIFRoaXMgYml0IGNvcGllZCBmcm9tIGxpbmtlci5jICovCi0gICAgICBpZiAoaGFzaHAgIT0gTlVMTCAmJiAqaGFzaHAgIT0gTlVMTCkKLQl7Ci0JICBoID0gKmhhc2hwOwotCSAgQkZEX0FTU0VSVCAoc3RyY21wIChoLT5yb290LnN0cmluZywgbmFtZSkgPT0gMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpOwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoYXNocCAhPSBOVUxMKQotCQkqaGFzaHAgPSBOVUxMOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPm5vdGljZV9oYXNoICE9IChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikgTlVMTAotCSAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+bm90aWNlX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpKQotCXsKLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5ub3RpY2UpIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChoYXNocCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIE5VTEwpCi0JKmhhc2hwID0gaDsKLSAgICAgIC8qIGVuZCBkdXBsaWNhdGlvbiBmcm9tIGxpbmtlci5jICovCi0KLSAgICAgIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCXsKLQkgIGFzZWN0aW9uICptc2VjOwotCi0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICAgIG1zZWMgPSBoLT51LmRlZi5zZWN0aW9uOwotCSAgZWxzZQotCSAgICBtc2VjID0gYmZkX2luZF9zZWN0aW9uX3B0cjsKLQotCSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAobXNlYykgJiYgIWJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKLQkgICAgICBoLT51LmRlZi52YWx1ZSA9IHZhbHVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pICYmICFiZmRfaXNfYWJzX3NlY3Rpb24gKG1zZWMpKQotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGRpZG4ndCBleGl0IGVhcmx5LCBmaW5pc2ggcHJvY2Vzc2luZyBpbiB0aGUgZ2VuZXJpYyByb3V0aW5lICovCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sCi0JCQkJCSAgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgIGhhc2hwKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWdvMzIuYyBiL2JmZC9jb2ZmLWdvMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0YWRiMi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1nbzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzIChnbzMyIHZhcmlhbnQpLgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IERKIERlbG9yaWUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCQlnbzMyY29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJCSJjb2ZmLWdvMzIiCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFCSdfJwotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi1oODMwMC5jIGIvYmZkL2NvZmYtaDgzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhNGVjMy4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1oODMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4OCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvMzAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiY29mZi9oODMwMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi0vKiBXZSBkZXJpdmUgYSBoYXNoIHRhYmxlIGZyb20gdGhlIGJhc2ljIEJGRCBoYXNoIHRhYmxlIHRvCi0gICBob2xkIGVudHJpZXMgaW4gdGhlIGZ1bmN0aW9uIHZlY3Rvci4gIEFzaWRlIGZyb20gdGhlIAotICAgaW5mbyBzdG9yZWQgYnkgdGhlIGJhc2ljIGhhc2ggdGFibGUsIHdlIG5lZWQgdGhlIG9mZnNldAotICAgb2YgYSBwYXJ0aWN1bGFyIGVudHJ5IHdpdGhpbiB0aGUgaGFzaCB0YWJsZSBhcyB3ZWxsIGFzCi0gICB0aGUgb2Zmc2V0IHdoZXJlIHdlJ2xsIGFkZCB0aGUgbmV4dCBlbnRyeS4gICovCi0KLXN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkKLXsKLSAgLyogVGhlIGJhc2ljIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgdmVjdG9ycyBzZWN0aW9uIHdoZXJlCi0gICAgIHRoaXMgZW50cnkgbGl2ZXMuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLX07Ci0KLXN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGJhc2ljIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLQotICBiZmQgKmFiZmQ7Ci0KLSAgLyogT2Zmc2V0IGF0IHdoaWNoIHdlJ2xsIGFkZCB0aGUgbmV4dCBlbnRyeS4gICovCi0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWZ1bmN2ZWNfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1mdW5jdmVjX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICosIGJmZCAqLAotICAgICAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKikpKSk7Ci0KLS8qIFRvIGxvb2t1cCBhIHZhbHVlIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIGZ1bmN2ZWNfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFRoZSBkZXJpdmVkIGg4MzAwIENPRkYgbGlua2VyIHRhYmxlLiAgTm90ZSBpdCdzIGRlcml2ZWQgZnJvbQotICAgdGhlIGdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUsIG5vdCB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBoYXNoCi0gICB0YWJsZSEgIFdlIHVzZSB0aGlzIHRvIGF0dGFjaCBhZGRpdGlvbmFsIGRhdGEgc3RydWN0dXJlcyB3ZQotICAgbmVlZCB3aGlsZSBsaW5raW5nIG9uIHRoZSBoODMwMC4gICovCi1zdHJ1Y3QgaDgzMDBfY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIFNlY3Rpb24gZm9yIHRoZSB2ZWN0b3JzIHRhYmxlLiAgVGhpcyBnZXRzIGF0dGFjaGVkIHRvIGEKLSAgICAgcmFuZG9tIGlucHV0IGJmZCwgd2Uga2VlcCBpdCBoZXJlIGZvciBlYXN5IGFjY2Vzcy4gICovCi0gIGFzZWN0aW9uICp2ZWN0b3JzX3NlYzsKLQotICAvKiBIYXNoIHRhYmxlIG9mIHRoZSBmdW5jdGlvbnMgd2UgbmVlZCB0byBlbnRlciBpbnRvIHRoZSBmdW5jdGlvbgotICAgICB2ZWN0b3IuICAqLwotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICpmdW5jdmVjX2hhc2hfdGFibGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBHZXQgdGhlIEg4LzMwMCBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBoODMwMF9jb2ZmX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKGNvZmZfaGFzaF90YWJsZSAocCkpKSkKLQotLyogSW5pdGlhbGl6ZSBmaWVsZHMgd2l0aGluIGEgZnVuY3ZlYyBoYXNoIHRhYmxlIGVudHJ5LiAgQ2FsbGVkIHdoZW5ldmVyCi0gICBhIG5ldyBlbnRyeSBpcyBhZGRlZCB0byB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1mdW5jdmVjX2hhc2hfbmV3ZnVuYyAoZW50cnksIGdlbl90YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKmdlbl90YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICpyZXQ7Ci0gIHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKnRhYmxlOwotCi0gIHJldCA9IChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5ICopIGVudHJ5OwotICB0YWJsZSA9IChzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICopIGdlbl90YWJsZTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqKQotICAgICAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoZ2VuX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mIChzdHJ1Y3QgZnVuY3ZlY19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKikKLSAgICAgICAgIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCBnZW5fdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBOb3RlIHdoZXJlIHRoaXMgZW50cnkgd2lsbCByZXNpZGUgaW4gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICovCi0gIHJldC0+b2Zmc2V0ID0gdGFibGUtPm9mZnNldDsKLQotICAvKiBCdW1wIHRoZSBvZmZzZXQgYXQgd2hpY2ggd2Ugc3RvcmUgZW50cmllcyBpbiB0aGUgZnVuY3Rpb24KLSAgICAgdmVjdG9yLiAgV2UnZCBsaWtlIHRvIGJ1bXAgdXAgdGhlIHNpemUgb2YgdGhlIHZlY3RvcnMgc2VjdGlvbiwKLSAgICAgYnV0IGl0J3Mgbm90IGVhc2lseSBhdmFpbGFibGUgaGVyZS4gICovCi0gIGlmIChiZmRfZ2V0X21hY2ggKHRhYmxlLT5hYmZkKSA9PSBiZmRfbWFjaF9oODMwMCkKLSAgICB0YWJsZS0+b2Zmc2V0ICs9IDI7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgIHx8IGJmZF9nZXRfbWFjaCAodGFibGUtPmFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLSAgICB0YWJsZS0+b2Zmc2V0ICs9IDQ7Ci0gIGVsc2UKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBFdmVyeXRoaW5nIHdlbnQgT0suICAqLwotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZ1bmN2ZWNfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICopKTsKLXsKLSAgLyogSW5pdGlhbGl6ZSBvdXIgbG9jYWwgZmllbGRzLCB0aGVuIGNhbGwgdGhlIGdlbmVyaWMgaW5pdGlhbGl6YXRpb24KLSAgICAgcm91dGluZS4gICovCi0gIHRhYmxlLT5vZmZzZXQgPSAwOwotICB0YWJsZS0+YWJmZCA9IGFiZmQ7Ci0gIHJldHVybiAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBuZXdmdW5jKSk7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFdlIHVzZSBhIGRlcml2ZWQgaGFzaCB0YWJsZQotICAgYmFzaWNhbGx5IHRvIGhvbGQgInN0YXRpYyIgaW5mb3JtYXRpb24gZHVyaW5nIGFuIGg4LzMwMCBjb2ZmIGxpbmsKLSAgIHdpdGhvdXQgdXNpbmcgc3RhdGljIHZhcmlhYmxlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1oODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0gIHJldCA9ICgoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlICopCi0gICAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGg4MzAwX2NvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdC5yb290LCBhYmZkLCBfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIEluaXRpYWxpemUgb3VyIGRhdGEuICAqLwotICByZXQtPnZlY3RvcnNfc2VjID0gTlVMTDsKLSAgcmV0LT5mdW5jdmVjX2hhc2hfdGFibGUgPSBOVUxMOwotCi0gIC8qIE9LLiAgRXZlcnl0aGluZydzIGludGlhbGl6ZWQsIHJldHVybiB0aGUgYmFzZSBwb2ludGVyLiAgKi8KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogc3BlY2lhbCBoYW5kbGluZyBmb3IgSDgvMzAwIHJlbG9jcy4KLSAgIFdlIG9ubHkgY29tZSBoZXJlIGZvciBwY3JlbCBzdHVmZiBhbmQgcmV0dXJuIG5vcm1hbGx5IGlmIG5vdCBhbiAtciBsaW5rLgotICAgV2hlbiBkb2luZyAtciwgd2UgY2FuJ3QgZG8gYW55IGFyaXRobWV0aWMgZm9yIHRoZSBwY3JlbCBzdHVmZiwgYmVjYXVzZQotICAgdGhlIGNvZGUgaW4gcmVsb2MuYyBhc3N1bWVzIHRoYXQgd2UgY2FuIG1hbmlwdWxhdGUgdGhlIHRhcmdldHMgb2YKLSAgIHRoZSBwY3JlbCBicmFuY2hlcy4gIFRoaXMgaXNuJ3Qgc28sIHNpbmNlIHRoZSBIOC8zMDAgY2FuIGRvIHJlbGF4aW5nLCAKLSAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGdhcCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBlbm91Z2ggdG8KLSAgIGNvbnRhaW4gdGhlIG9mZnNldCByZXF1aXJlZCBmb3IgdGhlIGJyYW5jaCwgc28gd2UgaGF2ZSB0byB1c2UgdGhlIG9ubHkKLSAgIHRoZSBhZGRlbmQgdW50aWwgdGhlIGZpbmFsIGxpbmsgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BlY2lhbCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8gKFJfUkVMQllURSwgMCwgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiOCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTFdPUkQsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIxNiIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1JFTExPTkcsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1BDUkJZVEUsIDAsIDAsIDgsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgc3BlY2lhbCwgIkRJU1A4IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyAoUl9QQ1JXT1JELCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9QQ1JMT05HLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBzcGVjaWFsLCAiRElTUDMyIiwgZmFsc2UsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpLAotICBIT1dUTyAoUl9NT1YxNkIxLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhhYmxlIG1vdi5iOjE2IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfTU9WMTZCMiwgMCwgMSwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAicmVsYXhlZCBtb3YuYjoxNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUDEsIDAsIDEsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICIxNi9wY3JlbCIsIGZhbHNlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUDIsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInBjcmVjbC8xNiIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX0pNUEwxLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMjQvcGNyZWxsIiwgZmFsc2UsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfSk1QTDIsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInBjOC8yNCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX01PVjI0QjEsIDAsIDEsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGFibGUgbW92LmI6MjQiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9NT1YyNEIyLCAwLCAxLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIHNwZWNpYWwsICJyZWxheGVkIG1vdi5iOjI0IiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLQotICAvKiBBbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbi4gIFRoaXMgY2F1c2VzIHRoZSBmdW5jdGlvbidzIGFkZHJlc3MKLSAgICAgdG8gYmUgYWRkZWQgdG8gdGhlIGZ1bmN0aW9uIHZlY3RvciBpbiBsby1tZW0gYW5kIHB1dHMgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGZ1bmN0aW9uIHZlY3RvcidzIGVudHJ5IGluIHRoZSBqc3IgaW5zdHJ1Y3Rpb24uICAqLwotICBIT1dUTyAoUl9NRU1fSU5ESVJFQ1QsIDAsIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgIjgvaW5kaXJlY3QiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgZmFsc2UpLAotCi0gIC8qIEludGVybmFsIHJlbG9jIGZvciByZWxheGluZy4gIFRoaXMgaXMgY3JlYXRlZCB3aGVuIGEgMTZiaXQgcGMtcmVsYXRpdmUKLSAgICAgYnJhbmNoIGlzIHR1cm5lZCBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKFJfUENSV09SRF9CLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgc3BlY2lhbCwgInJlbGF4ZWQgYkNDOjE2IiwgZmFsc2UsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9NT1ZMMSwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGVjaWFsLCAiMzIvMjQgcmVsYXhhYmxlIG1vdmUiLCBmYWxzZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX01PVkwyLCAwLCAxLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBzcGVjaWFsLCAiMzIvMjQgcmVsYXhlZCBtb3ZlIiwgZmFsc2UsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLQotICBIT1dUTyAoUl9CQ0NfSU5WLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJESVNQOCBpbnZlcnRlZCIsIGZhbHNlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCB0cnVlKSwKLQotICBIT1dUTyAoUl9KTVBfREVMLCAwLCAwLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIHNwZWNpYWwsICJEZWxldGVkIGp1bXAiLCBmYWxzZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi19OwotCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKHgsaG93dG8pIFwKLSAgeyB4LnJfdHlwZSA9IHNlbGVjdF9yZWxvYyhob3d0byk7IH0KLQotI2RlZmluZSBCQURNQUcoeCkgKEg4MzAwQkFETUFHKHgpICYmIEg4MzAwSEJBRE1BRyh4KSAmJiBIODMwMFNCQURNQUcoeCkpCi0jZGVmaW5lIEg4MzAwIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0KLXN0YXRpYyBpbnQKLXNlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGU7Ci19Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvIChpbnRlcm5hbCwgZHN0KQotICAgICBhcmVsZW50ICppbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9SRUxCWVRFOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1JFTFdPUkQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUkVMTE9ORzoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JCWVRFOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1BDUldPUkQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfUENSTE9ORzoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1YxNkIxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVjE2QjI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVAyOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pNUEwxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9KTVBMMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMjRCMToKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTU9WMjRCMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUVNX0lORElSRUNUOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9QQ1JXT1JEX0I6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSBob3d0b190YWJsZSArIDE1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01PVkwxOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NT1ZMMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfQkNDX0lOVjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSk1QX0RFTDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotCi0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci0gIC8qICByZWxlbnQtPnNlY3Rpb24gPSAwOyovCi19Ci0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGFzeW1ib2wgKipzOwotCi0gIHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpOwotCi0gIC8qIFNlYXJjaCBhbGwgdGhlIHN5bWJvbHMgZm9yIG9uZSBpbiBJTlBVVF9TRUNUSU9OIHdpdGgKLSAgICAgYWRkcmVzcyBBRERSRVNTLiAgKi8KLSAgd2hpbGUgKCpzKSAKLSAgICB7Ci0gICAgICBhc3ltYm9sICpwID0gKnM7Ci0gICAgICBpZiAocC0+c2VjdGlvbiA9PSBpbnB1dF9zZWN0aW9uCi0JICAmJiAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCSAgICAgICsgcC0+dmFsdWUpID09IGFkZHJlc3MpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBzKys7Ci0gICAgfSAgICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIElmIFJFTE9DIHJlcHJlc2VudHMgYSByZWxheGFibGUgaW5zdHJ1Y3Rpb24vcmVsb2MsIGNoYW5nZSBpdCBpbnRvCi0gICB0aGUgcmVsYXhlZCByZWxvYywgbm90aWZ5IHRoZSBsaW5rZXIgdGhhdCBzeW1ib2wgYWRkcmVzc2VzCi0gICBoYXZlIGNoYW5nZWQgKGJmZF9wZXJmb3JtX3NsaXApIGFuZCByZXR1cm4gaG93IG11Y2ggdGhlIGN1cnJlbnQKLSAgIHNlY3Rpb24gaGFzIHNocnVuayBieS4KLQotICAgRklYTUU6IE11Y2ggb2YgdGhpcyBjb2RlIGhhcyBrbm93bGVkZ2Ugb2YgdGhlIG9yZGVyaW5nIG9mIGVudHJpZXMKLSAgIGluIHRoZSBob3d0byB0YWJsZS4gIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQuICAqLwotCi1zdGF0aWMgaW50Ci1oODMwMF9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqcmVsb2M7Ci0gICAgIHVuc2lnbmVkIGludCBzaHJpbms7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGJmZF92bWEgdmFsdWU7ICAKLSAgYmZkX3ZtYSBkb3Q7Ci0gIGJmZF92bWEgZ2FwOwotICBzdGF0aWMgYXNlY3Rpb24gKmxhc3RfaW5wdXRfc2VjdGlvbiA9IE5VTEw7Ci0gIHN0YXRpYyBhcmVsZW50ICpsYXN0X3JlbG9jID0gTlVMTDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgdGhpbmcgdG8gYmUgcmVsb2NhdGVkIHdpbGwgaGF2ZSBtb3ZlZCBiYWNrIGJ5IAotICAgICB0aGUgc2l6ZSBvZiB0aGUgc2hyaW5rIC0gYnV0IHdlIGRvbid0IGNoYW5nZSByZWxvYy0+YWRkcmVzcyBoZXJlLAotICAgICBzaW5jZSB3ZSBuZWVkIGl0IHRvIGtub3cgd2hlcmUgdGhlIHJlbG9jYXRpb24gbGl2ZXMgaW4gdGhlIHNvdXJjZQotICAgICB1bmNvb2tlZCBzZWN0aW9uLiAgKi8KLSAgYmZkX3ZtYSBhZGRyZXNzID0gcmVsb2MtPmFkZHJlc3MgLSBzaHJpbms7Ci0KLSAgaWYgKGlucHV0X3NlY3Rpb24gIT0gbGFzdF9pbnB1dF9zZWN0aW9uKQotICAgIGxhc3RfcmVsb2MgPSBOVUxMOwotCi0gIC8qIE9ubHkgZXhhbWluZSB0aGUgcmVsb2NzIHdoaWNoIG1pZ2h0IGJlIHJlbGF4YWJsZS4gICovCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsgICAgIAotCi0gICAgLyogVGhpcyBpcyB0aGUgMTYvMjQgYml0IGFic29sdXRlIGJyYW5jaCB3aGljaCBjb3VsZCBiZWNvbWUgYW4gOCBiaXQKLSAgICAgICBwYy1yZWxhdGl2ZSBicmFuY2guICAqLwotICAgIGNhc2UgUl9KTVAxOgotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiAobm90IHRoZSByZWxvYykuICAqLwotICAgICAgZG90ID0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCArIGFkZHJlc3MpOwotCi0gICAgICAvKiBBZGp1c3QgZm9yIFJfSk1QMSB2cyBSX0pNUEwxLiAgKi8KLSAgICAgIGRvdCArPSAocmVsb2MtPmhvd3RvLT50eXBlID09IFJfSk1QMSA/IDEgOiAyKTsKLQotICAgICAgLyogQ29tcHV0ZSB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluc24gdG8gdGhlIGJyYW5jaCB0YXJnZXQuICAqLwotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0gIAotICAgICAgLyogSWYgdGhlIGRpc3RhbmNlIGlzIHdpdGhpbiAtMTI4Li4rMTI4IGluY2x1c2l2ZSwgdGhlbiB3ZSBjYW4gcmVsYXgKLQkgdGhpcyBqdW1wLiAgKzEyOCBpcyB2YWxpZCBzaW5jZSB0aGUgdGFyZ2V0IHdpbGwgbW92ZSB0d28gYnl0ZXMKLQkgY2xvc2VyIGlmIHdlIGRvIHJlbGF4IHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIGlmICgoaW50KWdhcCA+PSAtMTI4ICYmIChpbnQpZ2FwIDw9IDEyOCApCi0JeyAKLQotCSAgLyogSXQncyBwb3NzaWJsZSB3ZSBtYXkgYmUgYWJsZSB0byBlbGltaW5hdGUgdGhpcyBicmFuY2ggZW50aXJlbHk7Ci0JICAgICBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggYXJvdW5kIHRoaXMgaW5zdHJ1Y3Rpb24sCi0JICAgICBhbmQgdGhlcmUncyBubyBsYWJlbCBhdCB0aGlzIGluc3RydWN0aW9uLCB0aGVuIHdlIGNhbiByZXZlcnNlCi0JICAgICB0aGUgY29uZGl0aW9uIG9uIHRoZSBwcmV2aW91cyBicmFuY2ggYW5kIGVsaW1pbmF0ZSB0aGlzIGp1bXAuCi0KLQkgICAgICAgb3JpZ2luYWw6CQkJbmV3OgotCQkgYkNDIGxhYjEJCQliQ0MnIGxhYjIKLQkJIGptcCBsYWIyCi0JCWxhYjE6CQkJCWxhYjE6Ci0JCi0JICAgICBUaGlzIHNhdmVzIDQgYnl0ZXMgaW5zdGVhZCBvZiB0d28sIGFuZCBzaG91bGQgYmUgcmVsYXRpdmVseQotCSAgICAgY29tbW9uLiAgKi8KLQotCSAgaWYgKGdhcCA8PSAxMjYKLQkgICAgICAmJiBsYXN0X3JlbG9jCi0JICAgICAgJiYgbGFzdF9yZWxvYy0+aG93dG8tPnR5cGUgPT0gUl9QQ1JCWVRFKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBsYXN0X3ZhbHVlOwotCSAgICAgIGxhc3RfdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAobGFzdF9yZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pICsgMTsKLQotCSAgICAgIGlmIChsYXN0X3ZhbHVlID09IGRvdCArIDIKLQkJICAmJiBsYXN0X3JlbG9jLT5hZGRyZXNzICsgMSA9PSByZWxvYy0+YWRkcmVzcwotCQkgICYmICEgaDgzMDBfc3ltYm9sX2FkZHJlc3NfcCAoYWJmZCwgaW5wdXRfc2VjdGlvbiwgZG90IC0gMikpCi0JCXsKLQkJICByZWxvYy0+aG93dG8gPSBob3d0b190YWJsZSArIDE5OwotCQkgIGxhc3RfcmVsb2MtPmhvd3RvID0gaG93dG9fdGFibGUgKyAxODsKLQkJICBsYXN0X3JlbG9jLT5zeW1fcHRyX3B0ciA9IHJlbG9jLT5zeW1fcHRyX3B0cjsKLQkJICBsYXN0X3JlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkZW5kOwotCQkgIHNocmluayArPSA0OwotCQkgIGJmZF9wZXJmb3JtX3NsaXAgKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFRoaXMgaXMgdGhlIDE2IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggd2hpY2ggY291bGQgYmVjb21lIGFuIDggYml0Ci0gICAgICAgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRDoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLCBhZGQgb25lIHRvIHRoZSB2YWx1ZQotICAgICAgICAgYmVjYXVzZSB0aGUgYWRkZW5kIGZpZWxkIGluIFBDcmVsIGp1bXBzIGlzIG9mZiBieSAtMS4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pICsgMTsKLQkKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpZiB3ZSB3ZXJlIHRvIHJlbGF4LiAgKi8KLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIENvbXB1dGUgdGhlIGRpc3RhbmNlIGZyb20gdGhpcyBpbnNuIHRvIHRoZSBicmFuY2ggdGFyZ2V0LiAgKi8KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBJZiB0aGUgZGlzdGFuY2UgaXMgd2l0aGluIC0xMjguLisxMjggaW5jbHVzaXZlLCB0aGVuIHdlIGNhbiByZWxheAotCSB0aGlzIGp1bXAuICArMTI4IGlzIHZhbGlkIHNpbmNlIHRoZSB0YXJnZXQgd2lsbCBtb3ZlIHR3byBieXRlcwotCSBjbG9zZXIgaWYgd2UgZG8gcmVsYXggdGhpcyBicmFuY2guICAqLwotICAgICAgaWYgKChpbnQpZ2FwID49IC0xMjggJiYgKGludClnYXAgPD0gMTI4ICkKLQl7IAotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTU7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFRoaXMgaXMgYSAxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdi5iIGluc24sIHdoaWNoIGNhbgotICAgICAgIGJlY29tZSBhbiA4IGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGlmIGl0J3MgaW4gdGhlIHJpZ2h0IHJhbmdlLiAgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoaXMgbW92LmIgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBpcyBpbiAweGZmMDAuLjB4ZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwIG9yCi0JIDB4ZmZmZjAwLi4weGZmZmZmZiBpbmNsdXNpdmUgb24gdGhlIGg4MzAwaCwgdGhlbiB3ZSBjYW4KLQkgcmVsYXggdGhpcyBtb3YuYiAgKi8KLSAgICAgIGlmICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMAotCSAgICYmIHZhbHVlID49IDB4ZmYwMAotCSAgICYmIHZhbHVlIDw9IDB4ZmZmZikKLQkgIHx8ICgoYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgKLQkgICAgICAgfHwgYmZkX2dldF9tYWNoIChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JICAgICAgJiYgdmFsdWUgPj0gMHhmZmZmMDAKLQkgICAgICAmJiB2YWx1ZSA8PSAweGZmZmZmZikpCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNCBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpbiBhIG1vdi5iLiAgTm90ZSB0aGF0Ci0gICAgICAgaWYgd2UgY2FuJ3QgcmVsYXggdGhpcyBpbnRvIGFuIDggYml0IGFic29sdXRlLCB3ZSdsbCBmYWxsIHRocm91Z2gKLSAgICAgICBhbmQgdHJ5IHRvIHJlbGF4IGl0IGludG8gYSAxNmJpdCBhYnNvbHV0ZS4gICovCi0gICAgY2FzZSBSX01PVjI0QjE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSB0aGlzIG1vdi5iIGluc24uICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogVGhlIGFkZHJlc3MgaXMgaW4gMHhmZmZmMDAuLjB4ZmZmZmZmIGluY2x1c2l2ZSBvbiB0aGUgaDgzMDBoLAotCSB0aGVuIHdlIGNhbiByZWxheCB0aGlzIG1vdi5iICAqLwotICAgICAgaWYgKChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwaAotCSAgIHx8IGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBzKQotCSAgJiYgdmFsdWUgPj0gMHhmZmZmMDAKLQkgICYmIHZhbHVlIDw9IDB4ZmZmZmZmKQotCXsKLQkgIC8qIENoYW5nZSB0aGUgcmVsb2MgdHlwZS4gICovCi0JICByZWxvYy0+aG93dG8gPSByZWxvYy0+aG93dG8gKyAxOwotCi0JICAvKiBUaGlzIHNocmlua3MgdGhpcyBzZWN0aW9uIGJ5IGZvdXIgYnl0ZXMuICAqLwotCSAgc2hyaW5rICs9IDQ7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDQsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCi0JICAvKiBEb25lIHdpdGggdGhpcyByZWxvYy4gICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEZBTExUSFJPVUdIIGFuZCB0cnkgdG8gdHVybiB0aGUgMzIvMjQgYml0IHJlbG9jIGludG8gYSAxNiBiaXQKLQkgcmVsb2MuICAqLwotCi0gICAgLyogVGhpcyBpcyBhIDI0LzMyIGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGluIGEgbW92IGluc24sIHdoaWNoIGNhbgotICAgICAgIGJlY29tZSBhbiAxNiBiaXQgYWJzb2x1dGUgYWRkcmVzcyBpZiBpdCdzIGluIHRoZSByaWdodCByYW5nZS4gICovCi0gICAgY2FzZSBSX01PVkwxOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhpcyBtb3YgaW5zbi4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBJZiB0aGlzIGFkZHJlc3MgaXMgaW4gMHgwMDAwLi4weDdmZmYgaW5jbHVzaXZlIG9yCi0gICAgICAgICAweGZmODAwMC4uMHhmZmZmZmYgaW5jbHVzaXZlLCB0aGVuIGl0IGNhbiBiZSByZWxheGVkLiAgKi8KLSAgICAgIGlmICh2YWx1ZSA8PSAweDdmZmYgfHwgdmFsdWUgPj0gMHhmZjgwMDApCi0JewotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlLiAgKi8KLQkgIHJlbG9jLT5ob3d0byA9IGhvd3RvX3RhYmxlICsgMTc7Ci0KLQkgIC8qIFRoaXMgc2hyaW5rcyB0aGlzIHNlY3Rpb24gYnkgdHdvIGJ5dGVzLiAgKi8KLQkgIHNocmluayArPSAyOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTm8gb3RoZXIgcmVsb2MgdHlwZXMgcmVwcmVzZW50IHJlbGF4aW5nIG9wcG9ydHVuaXRpZXMuICAqLwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICB9Ci0KLSAgbGFzdF9yZWxvYyA9IHJlbG9jOwotICBsYXN0X2lucHV0X3NlY3Rpb24gPSBpbnB1dF9zZWN0aW9uOwotICByZXR1cm4gc2hyaW5rOwotfQotCi0KLS8qIEhhbmRsZSByZWxvY2F0aW9ucyBmb3IgdGhlIEg4LzMwMCwgaW5jbHVkaW5nIHJlbG9jcyBmb3IgcmVsYXhlZAotICAgaW5zdHJ1Y3Rpb25zLgotCi0gICBGSVhNRTogTm90IGFsbCByZWxvY2F0aW9ucyBjaGVjayBmb3Igb3ZlcmZsb3chICAqLwotCi1zdGF0aWMgdm9pZAotaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAqc3JjX3B0cjsKLSAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gKmRzdF9wdHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmRfdm1hIHZhbHVlOwotICBiZmRfdm1hIGRvdDsKLSAgaW50IGdhcCx0bXA7Ci0KLSAgc3dpdGNoIChyZWxvYy0+aG93dG8tPnR5cGUpCi0gICAgewotCi0gICAgLyogR2VuZXJpYyA4Yml0IHBjLXJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9QQ1JCWVRFOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgZG90ID0gKGxpbmtfb3JkZXItPm9mZnNldCAKLQkgICAgICsgZHN0X2FkZHJlc3MgCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBFdmVyeXRoaW5nIGxvb2tzIE9LLiAgQXBwbHkgdGhlIHJlbG9jYXRpb24gYW5kIHVwZGF0ZSB0aGUKLQkgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLSAgICAgIGRzdF9hZGRyZXNzKys7Ci0gICAgICBzcmNfYWRkcmVzcysrOwotCi0gICAgICAvKiBBbGwgZG9uZS4gICovCi0gICAgICBicmVhazsKLQotICAgIC8qIEdlbmVyaWMgMTZiaXQgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX1BDUldPUkQ6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0IAotCSAgICAgKyBkc3RfYWRkcmVzcyAKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA+IDMyNzY2IHx8IGdhcCA8IC0zMjc2OCkKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogRXZlcnl0aGluZyBsb29rcyBPSy4gIEFwcGx5IHRoZSByZWxvY2F0aW9uIGFuZCB1cGRhdGUgdGhlCi0JIHNyYy9kc3QgYWRkcmVzcyBhcHByb3ByaWF0ZWx5LiAgKi8KLQotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gMjsKLSAgICAgIHNyY19hZGRyZXNzICs9IDI7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgLyogR2VuZXJpYyA4Yml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICAgIGNhc2UgUl9SRUxCWVRFOgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QgcmVmZXJlbmNlZCBieSB0aGlzIGluc24uICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAodmFsdWUgPD0gMHhmZgotCSAgfHwgKHZhbHVlID49IDB4MDAwMGZmMDAgJiYgdmFsdWUgPD0gMHgwMDAwZmZmZikKLSAgCSAgfHwgKHZhbHVlID49IDB4MDBmZmZmMDAgJiYgdmFsdWUgPD0gMHgwMGZmZmZmZikKLQkgIHx8ICh2YWx1ZSA+PSAweGZmZmZmZjAwICYmIHZhbHVlIDw9IDB4ZmZmZmZmZmYpKQotCXsKLQkgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBBcHBseSB0aGUgcmVsb2NhdGlvbiBhbmQgdXBkYXRlIHRoZQotCSAgICAgc3JjL2RzdCBhZGRyZXNzIGFwcHJvcHJpYXRlbHkuICAqLwotCi0JICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGRzdF9hZGRyZXNzICs9IDE7Ci0JICBzcmNfYWRkcmVzcyArPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogQWxsIGRvbmUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBWYXJpb3VzIHNpbXBsZSAxNmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9ucy4gICovCi0gICAgY2FzZSBSX01PVjE2QjE6Ci0gICAgY2FzZSBSX0pNUDE6Ci0gICAgY2FzZSBSX1JFTFdPUkQ6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSAyOwotICAgICAgc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogVmFyaW91cyBzaW1wbGUgMjQvMzJiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgUl9NT1YyNEIxOgotICAgIGNhc2UgUl9NT1ZMMToKLSAgICBjYXNlIFJfUkVMTE9ORzoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsdWUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0gICAgICBkc3RfYWRkcmVzcyArPSA0OwotICAgICAgc3JjX2FkZHJlc3MgKz0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQW5vdGhlciAyNC8zMmJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgICBjYXNlIFJfSk1QTDE6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgdmFsdWUgPSAoKHZhbHVlICYgMHgwMGZmZmZmZikKLQkgICAgICAgfCAoYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIHNyY19hZGRyZXNzKSAmIDB4ZmYwMDAwMDApKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MgKz0gNDsKLSAgICAgIHNyY19hZGRyZXNzICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJvbHV0ZSByZWxvY2F0aW9uIHRoYXQgd2FzIGZvcm1lcmxseSBhIDI0LzMyYml0Ci0gICAgICAgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gICAgY2FzZSBSX01PVkwyOgotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAodmFsdWUgPCAweDgwMDAgfHwgdmFsdWUgPiAweGZmODAwMCkKLQl7Ci0JICAvKiBJbnNlcnQgdGhlIDE2Yml0IHZhbHVlIGludG8gdGhlIHByb3BlciBsb2NhdGlvbi4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLCB2YWx1ZSwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQotCSAgLyogRml4IHRoZSBvcGNvZGUuICBGb3IgYWxsIHRoZSBtb3ZlIGluc25zLCB3ZSBzaW1wbHkKLQkgICAgIG5lZWQgdG8gdHVybiBvZmYgYml0IDB4MjAgaW4gdGhlIHByZXZpb3VzIGJ5dGUuICAqLwotICAgICAgICAgIGRhdGFbZHN0X2FkZHJlc3MgLSAxXSAmPSB+MHgyMDsKLQkgIGRzdF9hZGRyZXNzICs9IDI7Ci0JICBzcmNfYWRkcmVzcyArPSA0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJzb2x1dGUgYnJhbmNoIHRoYXQgaXMgbm93IGFuIDgtYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gICovCi0gICAgY2FzZSBSX0pNUDI6Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBvZiB0aGlzIGJyYW5jaC4gICovCi0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0IGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBOb3cgZml4IHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuICAqLwotICAgICAgc3dpdGNoIChkYXRhW2RzdF9hZGRyZXNzIC0gMV0pCi0JewotCWNhc2UgMHg1ZToKLQkgIC8qIGpzciAtPiBic3IgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg1NSwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0JICBicmVhazsKLQljYXNlIDB4NWE6Ci0JICAvKiBqbXAgLT5icmEgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0MCwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgOGJpdCB2YWx1ZS4gICovCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQotICAgICAgZHN0X2FkZHJlc3MgKz0gMTsKLSAgICAgIHNyY19hZGRyZXNzICs9IDM7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgLyogQSAxNmJpdCBwYy1yZWxhdGl2ZSBicmFuY2ggdGhhdCBpcyBub3cgYW4gOC1iaXQgcGMtcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgICBjYXNlIFJfUENSV09SRF9COgotICAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgb2YgdGhpcyBicmFuY2guICAqLwotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCB0aGUgcmVsb2MpLiAgKi8KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkgICAgICsgZHN0X2FkZHJlc3MKLQkgICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hIC0gMSk7Ci0KLSAgICAgIGdhcCA9IHZhbHVlIC0gZG90OwotCi0gICAgICAvKiBTYW5pdHkgY2hlY2suICAqLwotICAgICAgaWYgKGdhcCA8IC0xMjggfHwgZ2FwID4gMTI2KQotCXsKLQkgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgIHJlbG9jLT5ob3d0by0+bmFtZSwgcmVsb2MtPmFkZGVuZCwgaW5wdXRfc2VjdGlvbi0+b3duZXIsCi0JCSAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBOb3cgZml4IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbZHN0X2FkZHJlc3MgLSAyXSkKLQl7Ci0JY2FzZSAweDU4OgotCSAgLyogYkNDOjE2IC0+IGJDQzo4ICovCi0JICAvKiBHZXQgdGhlIGNvbmRpdGlvbiBjb2RlIGZyb20gdGhlIG9yaWdpbmFsIGluc24uICAqLwotCSAgdG1wID0gZGF0YVtkc3RfYWRkcmVzcyAtIDFdOwotCSAgdG1wICY9IDB4ZjA7Ci0JICB0bXAgPj49IDQ7Ci0KLQkgIC8qIE5vdyBvciBpbiB0aGUgaGlnaCBuaWJibGUgb2YgdGhlIG9wY29kZS4gICovCi0JICB0bXAgfD0gMHg0MDsKLQotCSAgLyogV3JpdGUgaXQuICAqLwotCSAgYmZkX3B1dF84IChhYmZkLCB0bXAsIGRhdGEgKyBkc3RfYWRkcmVzcyAtIDIpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0JLyogT3V0cHV0IHRoZSB0YXJnZXQuICAqLwotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLQotCS8qIFdlIGRvbid0IGFkdmFuY2UgZHN0X2FkZHJlc3MgLS0gdGhlIDhiaXQgcmVsb2MgaXMgYXBwbGllZCBhdAotCSAgIGRzdF9hZGRyZXNzIC0gMSwgc28gdGhlIG5leHQgaW5zbiBzaG91bGQgYmVnaW4gYXQgZHN0X2FkZHJlc3MuICAqLwotCXNyY19hZGRyZXNzICs9IDI7Ci0KLQlicmVhazsKLSAgICAgIAotICAgIC8qIFNpbWlsYXJseSBmb3IgYSAyNGJpdCBhYnNvbHV0ZSB0aGF0IGlzIG5vdyA4IGJpdHMuICAqLwotICAgIGNhc2UgUl9KTVBMMjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIChub3QgdGhlIHJlbG9jKS4gICovCi0gICAgICBkb3QgPSAobGlua19vcmRlci0+b2Zmc2V0Ci0JICAgICArIGRzdF9hZGRyZXNzCi0JICAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpOwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIGRvdDsKLQotICAgICAgLyogRml4IHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBzd2l0Y2ggKGRhdGFbc3JjX2FkZHJlc3NdKQotCXsKLQljYXNlIDB4NWU6Ci0JICAvKiBqc3IgLT4gYnNyICovCi0JICBiZmRfcHV0XzggKGFiZmQsIDB4NTUsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JICBicmVhazsKLQljYXNlIDB4NWE6Ci0JICAvKiBqbXAgLT5icmEgKi8KLQkgIGJmZF9wdXRfOCAoYWJmZCwgMHg0MCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MgKyAxKTsKLSAgICAgIGRzdF9hZGRyZXNzICs9IDI7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotCi0gICAgICBicmVhazsKLQotICAgIC8qIEEgMTZiaXQgYWJzb2x1dGUgbW92LmIgdGhhdCBpcyBub3cgYW4gOGJpdCBhYnNvbHV0ZSBtb3YuYi4gICovCi0gICAgY2FzZSBSX01PVjE2QjI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChkYXRhW2RzdF9hZGRyZXNzIC0gMl0gIT0gMHg2YSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogRml4IHVwIHRoZSBvcGNvZGUuICAqLwotICAgICAgc3dpdGNoIChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmMCkKLQl7Ci0JY2FzZSAweDAwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgyMDsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MDoKLQkgIGRhdGFbZHN0X2FkZHJlc3MgLSAyXSA9IChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmKSB8IDB4MzA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0gICAgICBzcmNfYWRkcmVzcyArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBTaW1pbGFybHkgZm9yIGEgMjRiaXQgbW92LmIgICovCi0gICAgY2FzZSBSX01PVjI0QjI6Ci0gICAgICB2YWx1ZSA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQotICAgICAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgICAgIGlmIChkYXRhW2RzdF9hZGRyZXNzIC0gMl0gIT0gMHg2YSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogRml4IHVwIHRoZSBvcGNvZGUuICAqLwotICAgICAgc3dpdGNoIChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmMCkKLQl7Ci0JY2FzZSAweDIwOgotCSAgZGF0YVtkc3RfYWRkcmVzcyAtIDJdID0gKGRhdGFbc3JjX2FkZHJlc3MtMV0gJiAweGYpIHwgMHgyMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhhMDoKLQkgIGRhdGFbZHN0X2FkZHJlc3MgLSAyXSA9IChkYXRhW3NyY19hZGRyZXNzLTFdICYgMHhmKSB8IDB4MzA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBiZmRfcHV0XzggKGFiZmQsIHZhbHVlICYgMHhmZiwgZGF0YSArIGRzdF9hZGRyZXNzIC0gMSk7Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfQkNDX0lOVjoKLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IG9mIHRoaXMgYnJhbmNoLiAgKi8KLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQgCi0JICAgICArIGRzdF9hZGRyZXNzIAotCSAgICAgKyBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpICsgMTsKLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3Q7Ci0KLSAgICAgIC8qIFNhbml0eSBjaGVjay4gICovCi0gICAgICBpZiAoZ2FwIDwgLTEyOCB8fCBnYXAgPiAxMjYpCi0JewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIC8qIEV2ZXJ5dGhpbmcgbG9va3MgT0suICBGaXggdGhlIGNvbmRpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGFwcGx5Ci0JIHRoZSByZWxvY2F0aW9uLCBhbmQgdXBkYXRlIHRoZSBzcmMvZHN0IGFkZHJlc3MgYXBwcm9wcmlhdGVseS4gICovCi0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX2dldF84IChhYmZkLCBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKSBeIDEsCi0JCSBkYXRhICsgZHN0X2FkZHJlc3MgLSAxKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotICAgICAgZHN0X2FkZHJlc3MrKzsKLSAgICAgIHNyY19hZGRyZXNzKys7Ci0KLSAgICAgIC8qIEFsbCBkb25lLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0pNUF9ERUw6Ci0gICAgICBzcmNfYWRkcmVzcyArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBBbiA4Yml0IG1lbW9yeSBpbmRpcmVjdCBpbnN0cnVjdGlvbiAoam1wL2pzcikuCi0KLSAgICAgICBUaGVyZSdzIHNldmVyYWwgdGhpbmdzIHRoYXQgbmVlZCB0byBiZSBkb25lIHRvIGhhbmRsZQotICAgICAgIHRoaXMgcmVsb2NhdGlvbi4KLQotICAgICAgIElmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzeW1ib2wsIHRoZW4KLSAgICAgICB3ZSBzaG91bGQgaGFuZGxlIGl0IGp1c3QgUl9SRUxCWVRFLiAgTGlrZXdpc2UgaWYgaXQncwotICAgICAgIGZvciBhIHN5bWJvbCB3aXRoIGEgdmFsdWUgZ2UgMCBhbmQgbGUgMHhmZi4KLQotICAgICAgIE90aGVyd2lzZSBpdCdzIGEganVtcC9jYWxsIHRocm91Z2ggdGhlIGZ1bmN0aW9uIHZlY3RvciwKLSAgICAgICBhbmQgdGhlIGxpbmtlciBpcyBleHBlY3RlZCB0byBzZXQgdXAgdGhlIGZ1bmN0aW9uIHZlY3RvcgotICAgICAgIGFuZCBwdXQgdGhlIHJpZ2h0IHZhbHVlIGludG8gdGhlIGp1bXAvY2FsbCBpbnN0cnVjdGlvbi4gICovCi0gICAgY2FzZSBSX01FTV9JTkRJUkVDVDoKLSAgICAgIHsKLQkvKiBXZSBuZWVkIHRvIGZpbmQgdGhlIHN5bWJvbCBzbyB3ZSBjYW4gZGV0ZXJtaW5lIGl0J3MKLQkgICBhZGRyZXNzIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IgdGFibGUuICAqLwotCWFzeW1ib2wgKnN5bWJvbDsKLQliZmRfdm1hIHZhbHVlOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc3RydWN0IGZ1bmN2ZWNfaGFzaF9lbnRyeSAqaDsKLQlhc2VjdGlvbiAqdmVjdG9yc19zZWMgPSBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGxpbmtfaW5mbyktPnZlY3RvcnNfc2VjOwotCi0JLyogRmlyc3Qgc2VlIGlmIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBzeW1ib2wKLQkgICBvciBhZ2FpbnN0IGEgc3ltYm9sIHdpdGggYSBub25uZWdhdGl2ZSB2YWx1ZSA8PSAweGZmLiAgKi8KLQlzeW1ib2wgPSAqKHJlbG9jLT5zeW1fcHRyX3B0cik7Ci0JdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JaWYgKHN5bWJvbCA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wKLQkgICAgfHwgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMHhmZikpCi0JICB7Ci0JICAgIC8qIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gYSBtYW5uZXIgdmVyeSBzaW1pbGFyIHRvCi0JICAgICAgIFJfUkVMQllURVMuICAgSWYgdGhlIHZhbHVlIGlzIGluIHJhbmdlLCB0aGVuIGp1c3Qgc2xhbQotCSAgICAgICB0aGUgdmFsdWUgaW50byB0aGUgcmlnaHQgbG9jYXRpb24uICBFbHNlIHRyaWdnZXIgYQotCSAgICAgICByZWxvYyBvdmVyZmxvdyBjYWxsYmFjay4gICovCi0JICAgIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDB4ZmYpCi0JICAgICAgewotCQliZmRfcHV0XzggKGFiZmQsIHZhbHVlLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCQlkc3RfYWRkcmVzcyArPSAxOwotCQlzcmNfYWRkcmVzcyArPSAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCQlyZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkJaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkJICBhYm9ydCAoKTsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JLyogVGhpcyBpcyBhIGp1bXAvY2FsbCB0aHJvdWdoIGEgZnVuY3Rpb24gdmVjdG9yLCBhbmQgd2UncmUKLQkgICBleHBlY3RlZCB0byBjcmVhdGUgdGhlIGZ1bmN0aW9uIHZlY3RvciBvdXJzZWx2ZXMuIAotCi0JICAgRmlyc3QgbG9vayB1cCB0aGlzIHN5bWJvbCBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUgLS0gd2UgbmVlZAotCSAgIHRoZSBkZXJpdmVkIGxpbmtlciBzeW1ib2wgd2hpY2ggaG9sZHMgdGhpcyBzeW1ib2wncyBpbmRleAotCSAgIGluIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICAqLwotCW5hbWUgPSBzeW1ib2wtPm5hbWU7Ci0JaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfTE9DQUwpCi0JICB7Ci0JICAgIGNoYXIgKm5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDkpOwotCSAgICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBzdHJjcHkgKG5ld19uYW1lLCBuYW1lKTsKLQkgICAgc3ByaW50ZiAobmV3X25hbWUgKyBzdHJsZW4gKG5hbWUpLCAiXyUwOHgiLAotCQkgICAgIChpbnQpc3ltYm9sLT5zZWN0aW9uKTsKLQkgICAgbmFtZSA9IG5ld19uYW1lOwotCSAgfQotCi0JaCA9IGZ1bmN2ZWNfaGFzaF9sb29rdXAgKGg4MzAwX2NvZmZfaGFzaF90YWJsZSAobGlua19pbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlLAotCQkJCSBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0JLyogVGhpcyBzaG91bGRuJ3QgZXZlciBoYXBwZW4uICBJZiBpdCBkb2VzIHRoYXQgbWVhbnMgd2UndmUgZ290Ci0JICAgZGF0YSBjb3JydXB0aW9uIG9mIHNvbWUga2luZC4gIEFib3J0aW5nIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlCi0JICAgdGhpbmsgdG8gZG8gaGVyZS4gICovCi0JaWYgKGggPT0gTlVMTCB8fCB2ZWN0b3JzX3NlYyA9PSBOVUxMKQotCSAgYWJvcnQgKCk7Ci0KLQkvKiBQbGFjZSB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gdmVjdG9yIGVudHJ5IGludG8gdGhlCi0JICAgcmVsb2MncyBhZGRyZXNzLiAgKi8KLQliZmRfcHV0XzggKGFiZmQsCi0JCSAgIHZlY3RvcnNfc2VjLT5vdXRwdXRfb2Zmc2V0ICsgaC0+b2Zmc2V0LAotCQkgICBkYXRhICsgZHN0X2FkZHJlc3MpOwotCi0JZHN0X2FkZHJlc3MrKzsKLQlzcmNfYWRkcmVzcysrOwotCi0JLyogTm93IGNyZWF0ZSBhbiBlbnRyeSBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGl0c2VsZi4gICovCi0JaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfc2VjdGlvbi0+b3duZXIpID09IGJmZF9tYWNoX2g4MzAwKQotCSAgYmZkX3B1dF8xNiAoYWJmZCwKLQkJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLAotCQkJCQkJICBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pLAotCQkgICAgICB2ZWN0b3JzX3NlYy0+Y29udGVudHMgKyBoLT5vZmZzZXQpOwotCWVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoaW5wdXRfc2VjdGlvbi0+b3duZXIpID09IGJmZF9tYWNoX2g4MzAwaAotCQkgfHwgYmZkX2dldF9tYWNoIChpbnB1dF9zZWN0aW9uLT5vd25lcikgPT0gYmZkX21hY2hfaDgzMDBzKQotCSAgYmZkX3B1dF8zMiAoYWJmZCwKLQkJICAgICAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLAotCQkJCQkJICBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pLAotCQkgICAgICB2ZWN0b3JzX3NlYy0+Y29udGVudHMgKyBoLT5vZmZzZXQpOwotCWVsc2UKLQkgIGFib3J0ICgpOwotCi0JLyogR3Jvc3MuICBXZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSB2ZWN0b3Igc2VjdGlvbgotCSAgIGJlZm9yZSB3ZSBnZXQgaGVyZS4uLiAgU28gd2Ugd3JpdGUgaXQgYWdhaW4gd2l0aCB0aGUgbmV3IGRhdGEuICAqLwotCWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAodmVjdG9yc19zZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciwKLQkJCQkgIHZlY3RvcnNfc2VjLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgIHZlY3RvcnNfc2VjLT5jb250ZW50cywKLQkJCQkgIHZlY3RvcnNfc2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkJCSAgdmVjdG9yc19zZWMtPl9yYXdfc2l6ZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLQotICAgIH0KLQotICAqc3JjX3B0ciA9IHNyY19hZGRyZXNzOwotICAqZHN0X3B0ciA9IGRzdF9hZGRyZXNzOwotfQotCi0KLS8qIFJvdXRpbmUgZm9yIHRoZSBoODMwMCBsaW5rZXIuCi0KLSAgIFRoaXMgcm91dGluZSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHRoZSBzcGVjaWFsIFJfTUVNX0lORElSRUNUCi0gICByZWxvY3Mgb24gdGhlIGg4MzAwLiAgSXQncyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhIHZlY3RvcnMKLSAgIHNlY3Rpb24gYW5kIGF0dGFjaGluZyBpdCB0byBhbiBpbnB1dCBiZmQgYXMgd2VsbCBhcyBzaXppbmcKLSAgIHRoZSB2ZWN0b3JzIHNlY3Rpb24uICBJdCBhbHNvIGNyZWF0ZXMgb3VyIHZlY3RvcnMgaGFzaCB0YWJsZS4KLQotICAgSXQgdXNlcyB0aGUgZ2VuZXJpYyBsaW5rZXIgcm91dGluZXMgdG8gYWN0dWFsbHkgYWRkIHRoZSBzeW1ib2xzLgotICAgZnJvbSB0aGlzIEJGRCB0byB0aGUgYmZkIGxpbmtlciBoYXNoIHRhYmxlLiAgSXQgbWF5IGFkZCBhIGZldwotICAgc2VsZWN0ZWQgc3RhdGljIHN5bWJvbHMgdG8gdGhlIGJmZCBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1oODMwMF9iZmRfbGlua19hZGRfc3ltYm9scyhhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZnVuY3ZlY19oYXNoX3RhYmxlICpmdW5jdmVjX2hhc2hfdGFibGU7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBjcmVhdGVkIGEgdmVjdG9ycyBzZWN0aW9uLCBkbyBzbyBub3cuICAqLwotICBpZiAoIWg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIGZsYWdzIGFyZSBzZXQsIGluY2x1ZGluZyBTRUNfSU5fTUVNT1JZLiAgKi8KLSAgICAgIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JICAgICAgIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfUkVBRE9OTFkpOwotICAgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLAotCQkJCQkJCQkgICAgIi52ZWN0b3JzIik7Ci0KLSAgICAgIC8qIElmIHRoZSBzZWN0aW9uIHdhc24ndCBjcmVhdGVkLCBvciB3ZSBjb3VsZG4ndCBzZXQgdGhlIGZsYWdzLAotCSBxdWl0IHF1aWNrbHkgbm93LCByYXRoZXIgdGhhbiBkaWVpbmcgYSBwYWluZnVsIGRlYXRoIGxhdGVyLiAgKi8KLSAgICAgIGlmICghIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwKLQkJCQkgICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUoaW5mbyktPnZlY3RvcnNfc2VjLAotCQkJCSAgICAgIGZsYWdzKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEFsc28gY3JlYXRlIHRoZSB2ZWN0b3IgaGFzaCB0YWJsZS4gICovCi0gICAgICBmdW5jdmVjX2hhc2hfdGFibGUgPSAoKHN0cnVjdCBmdW5jdmVjX2hhc2hfdGFibGUgKikKLQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGZ1bmN2ZWNfaGFzaF90YWJsZSkpKTsKLQotICAgICAgaWYgKCFmdW5jdmVjX2hhc2hfdGFibGUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgZnVuY3ZlYyBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGlmICghZnVuY3ZlY19oYXNoX3RhYmxlX2luaXQgKGZ1bmN2ZWNfaGFzaF90YWJsZSwgYWJmZCwKLQkJCQkgICAgZnVuY3ZlY19oYXNoX25ld2Z1bmMpKQotCXsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCBmdW5jdmVjX2hhc2hfdGFibGUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogU3RvcmUgYXdheSBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN2ZWMgaGFzaCB0YWJsZS4gICovCi0gICAgICBoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUgPSBmdW5jdmVjX2hhc2hfdGFibGU7Ci0gICAgfQotCi0gIC8qIExvYWQgdXAgdGhlIGZ1bmN0aW9uIHZlY3RvciBoYXNoIHRhYmxlLiAgKi8KLSAgZnVuY3ZlY19oYXNoX3RhYmxlID0gaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlOwotCi0gIC8qIEFkZCB0aGUgc3ltYm9scyB1c2luZyB0aGUgZ2VuZXJpYyBjb2RlLiAgKi8KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotCi0gIC8qIE5vdyBzY2FuIHRoZSByZWxvY3MgZm9yIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhpcyBiZmQ7IGNyZWF0ZQotICAgICBhZGRpdGlvbmFsIHNwYWNlIGluIHRoZSAudmVjdG9ycyBzZWN0aW9uIGFzIG5lZWRlZC4gICovCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGxvbmcgcmVsb2Nfc2l6ZSwgcmVsb2NfY291bnQsIGk7Ci0gICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgIGFyZWxlbnQgKipyZWxvY3M7Ci0KLSAgICAgIC8qIFN1Y2sgaW4gdGhlIHJlbG9jcywgc3ltYm9scyAmIGNhbm9uaWNhbGl6ZSB0aGVtLiAgKi8KLSAgICAgIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHJlbG9jX3NpemUgPD0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKiopYmZkX21hbGxvYyAoKHNpemVfdClyZWxvY19zaXplKTsKLSAgICAgIGlmICghcmVsb2NzKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIHN5bWJvbHMgc2hvdWxkIGhhdmUgYmVlbiByZWFkIGluIGJ5IF9iZmRfZ2VuZXJpYyBsaW5rX2FkZF9zeW1ib2xzCi0JIGNhbGwgYWJvdmVjLCBzbyB3ZSBjYW4gY2hlYXQgYW5kIHVzZSB0aGUgcG9pbnRlciB0byB0aGVtIHRoYXQgd2FzCi0JIHNhdmVkIGluIHRoZSBhYm92ZSBjYWxsLiAgKi8KLSAgICAgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyhhYmZkKTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWxvY3MsIHN5bWJvbHMpOwotICAgICAgaWYgKHJlbG9jX2NvdW50IDw9IDApCi0JewotCSAgZnJlZSAocmVsb2NzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHdhbGsgdGhyb3VnaCBhbGwgdGhlIHJlbG9jYXRpb25zIGluIHRoaXMgc2VjdGlvbi4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKykKLQl7Ci0JICBhcmVsZW50ICpyZWxvYyA9IHJlbG9jc1tpXTsKLQkgIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIC8qIFdlJ3ZlIGdvdCBhbiBpbmRpcmVjdCByZWxvYy4gIFNlZSBpZiB3ZSBuZWVkIHRvIGFkZCBpdAotCSAgICAgdG8gdGhlIGZ1bmN0aW9uIHZlY3RvciB0YWJsZS4gICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlCi0JICAgICB0byBhZGQgYSBuZXcgZW50cnkgZm9yIGVhY2ggdW5pcXVlIHN5bWJvbCByZWZlcmVuY2VkCi0JICAgICBieSBhbiBSX01FTV9JTkRJUkVDVCByZWxvY2F0aW9uIGV4Y2VwdCBmb3IgYSByZWxvYwotCSAgICAgYWdhaW5zdCB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX01FTV9JTkRJUkVDVAotCSAgICAgICYmIHN5bWJvbCAhPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2wpCi0KLQkgICAgewotCSAgICAgIHN0cnVjdCBmdW5jdmVjX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBuYW1lID0gc3ltYm9sLT5uYW1lOwotCSAgICAgIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKQotCQl7Ci0JCSAgY2hhciAqbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgOSk7Ci0KLQkJICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLQkJICAgIGFib3J0ICgpOwotCi0JCSAgc3RyY3B5IChuZXdfbmFtZSwgbmFtZSk7Ci0JCSAgc3ByaW50ZiAobmV3X25hbWUgKyBzdHJsZW4gKG5hbWUpLCAiXyUwOHgiLAotCQkJICAgKGludClzeW1ib2wtPnNlY3Rpb24pOwotCQkgIG5hbWUgPSBuZXdfbmFtZTsKLQkJfQotCi0JICAgICAgLyogTG9vayB0aGlzIHN5bWJvbCB1cCBpbiB0aGUgZnVuY3Rpb24gdmVjdG9yIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGggPSBmdW5jdmVjX2hhc2hfbG9va3VwIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5mdW5jdmVjX2hhc2hfdGFibGUsCi0JCQkJICAgICAgIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0KLQotCSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzbid0IGFscmVhZHkgaW4gdGhlIGhhc2ggdGFibGUsIGFkZAotCQkgaXQgYW5kIGJ1bXAgdXAgdGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGlmIChoID09IE5VTEwpCi0JCXsKLQkJICBoID0gZnVuY3ZlY19oYXNoX2xvb2t1cCAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZnVuY3ZlY19oYXNoX3RhYmxlLAotCQkJCQkgICBuYW1lLCB0cnVlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICBmcmVlIChyZWxvY3MpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBCdW1wIHRoZSBzaXplIG9mIHRoZSB2ZWN0b3JzIHNlY3Rpb24uICBFYWNoIHZlY3RvcgotCQkgICAgIHRha2VzIDIgYnl0ZXMgb24gdGhlIGg4MzAwIGFuZCA0IGJ5dGVzIG9uIHRoZSBoODMwMGguICAqLwotCQkgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwKQotCQkgICAgaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSArPSAyOwotCQkgIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gYmZkX21hY2hfaDgzMDBoCi0JCQkgICB8fCBiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2g4MzAwcykKLQkJICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5fcmF3X3NpemUgKz0gNDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIHJlbG9jYXRpb25zLCByZWxlYXNlIHRoZW0uICAqLwotICAgICAgZnJlZSAocmVsb2NzKTsKLSAgICB9Ci0KLSAgLyogTm93IGFjdHVhbGx5IGFsbG9jYXRlIHNvbWUgc3BhY2UgZm9yIHRoZSBmdW5jdGlvbiB2ZWN0b3IuICBJdCdzCi0gICAgIHdhc3RlZnVsIHRvIGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UsIGJ1dCB0aGlzIGlzIGVhc2llci4gICovCi0gIGlmIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgLyogRnJlZSB0aGUgb2xkIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChoODMwMF9jb2ZmX2hhc2hfdGFibGUgKGluZm8pLT52ZWN0b3JzX3NlYy0+Y29udGVudHMpCi0JZnJlZSAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPmNvbnRlbnRzKTsKLQotICAgICAgLyogQWxsb2NhdGUgbmV3IGNvbnRlbnRzLiAgKi8KLSAgICAgIGg4MzAwX2NvZmZfaGFzaF90YWJsZSAoaW5mbyktPnZlY3RvcnNfc2VjLT5jb250ZW50cwotCT0gYmZkX21hbGxvYyAoaDgzMDBfY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dmVjdG9yc19zZWMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBoODMwMF9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBoODMwMF9yZWxvYzE2X2VzdGltYXRlCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgaDgzMDBfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBoODMwMF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi0KLQotY29uc3QgYmZkX3RhcmdldCBoODMwMGNvZmZfdmVjID0KLXsKLSAgImNvZmYtaDgzMDAiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFICksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBjaGFyICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtaDg1MDAuYyBiL2JmZC9jb2ZmLWg4NTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTA5ZWEuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtaDg1MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgSDgvNTAwIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi9oODUwMC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgxKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTggPQotSE9XVE8gKFJfSDg1MDBfSU1NOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMTYgPQotSE9XVE8gKFJfSDg1MDBfSU1NMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMjQgPQotSE9XVE8gKFJfSDg1MDBfSU1NMjQsIDAsIDEsIDI0LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMjQiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMzIgPQotSE9XVE8gKFJfSDg1MDBfSU1NMzIsIDAsIDEsIDMyLCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMzIiLCB0cnVlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCBmYWxzZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9oaWdoOCA9Ci1IT1dUTyAoUl9IODUwMF9ISUdIOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfbG93MTYgPQotSE9XVE8gKFJfSDg1MDBfTE9XMTYsIDAsIDEsIDE2LCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLCAicl9sb3cxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9wY3JlbDggPQotSE9XVE8gKFJfSDg1MDBfUENSRUw4LCAwLCAxLCA4LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJyX3BjcmVsOCIsIHRydWUsIDAsIDAsIHRydWUpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfcGNyZWwxNiA9Ci1IT1dUTyAoUl9IODUwMF9QQ1JFTDE2LCAwLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicl9wY3JlbDE2IiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaGlnaDE2ID0KLUhPV1RPIChSX0g4NTAwX0hJR0gxNiwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgMCwgInJfaGlnaDE2IiwgdHJ1ZSwgMHgwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSk7Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotc3RhdGljIGludCAKLWNvZmZfaDg1MDBfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX2g4NTAwX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBIODUwMEJBRE1BRyh4KQotI2RlZmluZSBIODUwMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogQ29kZSB0byBzd2FwIGluIHRoZSByZWxvYyAqLwotI2RlZmluZSBTV0FQX0lOX1JFTE9DX09GRlNFVCAgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBcCi0gIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsgXAotICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7Ci0KLS8qIENvZGUgdG8gdHVybiBhIHJfdHlwZSBpbnRvIGEgaG93dG8gcHRyLCB1c2VzIHRoZSBhYm92ZSBob3d0byB0YWJsZQotICAgKi8KLQotc3RhdGljIHZvaWQKLXJ0eXBlMmhvd3RvKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKiBpbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIHN3aXRjaCAoZHN0LT5yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU04OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9JTU0xNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTI0OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfaW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9QQ1JFTDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9wY3JlbDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX3BjcmVsMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9IODUwMF9ISUdIMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9oaWdoMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9sb3cxNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotCi0vKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgbWFnaWMgdG8gdGhlIGFkZGVuZCBpbiBhIHJlbG9jIGVudHJ5ICovCi0KLQotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBzeW1ib2wsIGV4dF9yZWxvYywgY2FjaGVfcHRyKSBcCi0gY2FjaGVfcHRyLT5hZGRlbmQgPSAgZXh0X3JlbG9jLnJfb2Zmc2V0OwotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pIFwKLSByZWxvY19wcm9jZXNzaW5nKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0KLXN0YXRpYyB2b2lkIHJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKiByZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotewotICByZWxlbnQtPmFkZHJlc3MgPSByZWxvYy0+cl92YWRkcjsKLSAgcnR5cGUyaG93dG8gKHJlbGVudCwgcmVsb2MpOwotCi0gIGlmIChyZWxvYy0+cl9zeW1uZHggPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotICByZWxlbnQtPmFkZHJlc3MgLT0gc2VjdGlvbi0+dm1hOwotfQotCi1zdGF0aWMgdm9pZAotZXh0cmFfY2FzZSAoaW5fYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikKLSAgICAgYmZkICppbl9hYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmRzdF9wdHI7Ci17Ci0gIGJmZF9ieXRlICpkID0gZGF0YSsqZHN0X3B0cjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfSDg1MDBfSU1NODoKLSAgICAgIGJmZF9wdXRfOCAoaW5fYWJmZCwKLQkJIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJIGQpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgPj4gMTYpLAotCQkgZCApOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSU1NMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkICApOwotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSDg1MDBfTE9XMTY6Ci0gICAgICBiZmRfcHV0XzE2IChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkKTsKLQotICAgICAgKCpkc3RfcHRyKSArPSAyOwotICAgICAgKCpzcmNfcHRyKSArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfSDg1MDBfSElHSDE2OgotICAgICAgYmZkX3B1dF8xNiAoaW5fYWJmZCwKLQkJICAoYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pCi0JCSAgID4+MTYpLAotCQkgIGQpOwotCi0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9IODUwMF9JTU0yNDoKLSAgICAgIHsKLQlpbnQgdiA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pOwotCWludCBvID0gYmZkX2dldF8zMihpbl9hYmZkLCBkYXRhKyAqZHN0X3B0ciAtMSk7Ci0JdiA9ICh2ICYgMHgwMGZmZmZmZikgfCAobyAmIDB4ZmYwMDAwMCk7Ci0JYmZkX3B1dF8zMiAoaW5fYWJmZCwgdiwgZGF0YSAgKyAqZHN0X3B0ciAtMSk7Ci0JKCpkc3RfcHRyKSArPTM7Ci0JKCpzcmNfcHRyKSs9Mzs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSU1NMzI6Ci0gICAgICB7Ci0JaW50IHYgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzMyIChpbl9hYmZkLCB2LCBkYXRhICArICpkc3RfcHRyKTsKLQkoKmRzdF9wdHIpICs9NDsKLQkoKnNyY19wdHIpKz00OzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUw4OgotICAgICAgewotCWJmZF92bWEgZHN0ID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgIGlucHV0X3NlY3Rpb24pOwotCWJmZF92bWEgZG90ID0gbGlua19vcmRlci0+b2Zmc2V0Ci0JICArICpkc3RfcHRyCi0JICAgICsgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCWludCBnYXAgPSBkc3QgLSBkb3QgLSAxOyAvKiAtMSBzaW5jZSB3ZXJlIGluIHRoZSBvZGQgYnl0ZSBvZiB0aGUKLQkJCQkgICAgd29yZCBhbmQgdGhlIHBjJ3MgYmVlbiBpbmNyZW1lbnRlZCAqLwotCi0JaWYgKGdhcCA+IDEyOCB8fCBnYXAgPCAtMTI4KQotCSAgewotCSAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgICAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYmZkX3B1dF84IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSsrOwotCSgqc3JjX3B0cikrKzsKLQlicmVhazsKLSAgICAgIH0KLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgIHsKLQliZmRfdm1hIGRzdCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IGxpbmtfb3JkZXItPm9mZnNldAotCSAgKyAqZHN0X3B0cgotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQlpbnQgZ2FwID0gZHN0IC0gZG90IC0gMTsgLyogLTEgc2luY2Ugd2VyZSBpbiB0aGUgb2RkIGJ5dGUgb2YgdGhlCi0JCQkJICAgIHdvcmQgYW5kIHRoZSBwYydzIGJlZW4gaW5jcmVtZW50ZWQgKi8KLQotCWlmIChnYXAgPiAzMjc2NyB8fCBnYXAgPCAtMzI3NjgpCi0JICB7Ci0JICAgIGlmICghICgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsb2MtPmFkZHJlc3MpKSkKLQkgICAgICBhYm9ydCAoKTsKLQkgIH0KLQliZmRfcHV0XzE2IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSs9MjsKLQkoKnNyY19wdHIpKz0yOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgZXh0cmFfY2FzZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI3VuZGVmIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfcmVsYXhfc2VjdGlvbiBiZmRfY29mZl9yZWxvYzE2X3JlbGF4X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCBoODUwMGNvZmZfdmVjID0KLXsKLSAgImNvZmYtaDg1MDAiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWkzODYuYyBiL2JmZC9jb2ZmLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5OGNjMS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvaTM4Ni5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0dPMzJfRVhFCi0jaW5jbHVkZSAiY29mZi9nbzMyZXhlLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb2ZmX2kzODZfcmVsb2MgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmNvZmZfaTM4Nl9ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQotCSAgIGJmZF92bWEgKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBGb3Igc29tZSByZWFzb24gd2hlbiB1c2luZyBpMzg2IENPRkYgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMKLSAgIGFueSBkZXNpcmVkIG9mZnNldC4gIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfaTM4Nl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIFdlIGFyZSByZWxvY2F0aW5nIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBjdXJyZW50IHZhbHVlIGluIHRoZQotCSBvYmplY3QgZmlsZSBpcyBPUklHICsgT0ZGU0VULCB3aGVyZSBPUklHIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLQkgY29tbW9uIHN5bWJvbCBhcyBzZWVuIGJ5IHRoZSBvYmplY3QgZmlsZSB3aGVuIGl0IHdhcyBjb21waWxlZAotCSAodGhpcyBtYXkgYmUgemVybyBpZiB0aGUgc3ltYm9sIHdhcyB1bmRlZmluZWQpIGFuZCBPRkZTRVQgaXMKLQkgdGhlIG9mZnNldCBpbnRvIHRoZSBjb21tb24gc3ltYm9sIChub3JtYWxseSB6ZXJvLCBidXQgbWF5IGJlCi0JIG5vbi16ZXJvIHdoZW4gcmVmZXJyaW5nIHRvIGEgZmllbGQgaW4gYSBjb21tb24gc3RydWN0dXJlKS4KLQkgT1JJRyBpcyB0aGUgbmVnYXRpdmUgb2YgcmVsb2NfZW50cnktPmFkZGVuZCwgd2hpY2ggaXMgc2V0IGJ5Ci0JIHRoZSBDQUxDX0FEREVORCBtYWNybyBiZWxvdy4gIFdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgdmFsdWUgaW4KLQkgdGhlIG9iamVjdCBmaWxlIHdpdGggTkVXICsgT0ZGU0VULCB3aGVyZSBORVcgaXMgdGhlIHZhbHVlIG9mCi0JIHRoZSBjb21tb24gc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBwdXQgaW4gdGhlIGZpbmFsCi0JIG9iamVjdCBmaWxlLiAgTkVXIGlzIHN5bWJvbC0+dmFsdWUuICAqLwotICAgICAgZGlmZiA9IHN5bWJvbC0+dmFsdWUgKyByZWxvY19lbnRyeS0+YWRkZW5kOwotI2Vsc2UKLSAgICAgIC8qIEluIFBFIG1vZGUsIHdlIGRvIG5vdCBvZmZzZXQgdGhlIGNvbW1vbiBzeW1ib2wuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgMzg2Ci0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgLyogRklYTUU6IEhvdyBzaG91bGQgdGhpcyBjYXNlIGJlIGhhbmRsZWQ/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT50eXBlID09IFJfSU1BR0VCQVNFICYmIGRpZmYgIT0gMCkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICAgIGlmIChkaWZmICE9IDApCi0gICAgICB7Ci0JcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0JdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotCXN3aXRjaCAoaG93dG8tPnNpemUpCi0JICB7Ci0JICBjYXNlIDA6Ci0JICAgIHsKLQkgICAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMToKLQkgICAgewotCSAgICAgIHNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgICAgfQotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB7Ci0JICAgICAgbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotCi0gIC8qIE5vdyBsZXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmaW5pc2ggZXZlcnl0aGluZyB1cC4gICovCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQKLSAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYyBzZWN0aW9uLiAqLwotCi1zdGF0aWMgYm9vbGVhbiBpbl9yZWxvY19wKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKiBhYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuICEgaG93dG8tPnBjX3JlbGF0aXZlICYmIGhvd3RvLT50eXBlICE9IFJfSU1BR0VCQVNFOwotfSAgICAgCi0jZW5kaWYKLQotI2lmbmRlZiBQQ1JFTE9GRlNFVAotI2RlZmluZSBQQ1JFTE9GRlNFVCBmYWxzZQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPSAKLXsKLSAgezB9LAotICB7MX0sCi0gIHsyfSwKLSAgezN9LAotICB7NH0sCi0gIHs1fSwKLSAgSE9XVE8gKFJfRElSMzIsICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJkaXIzMiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgLyogezd9LCAqLwotICBIT1dUTyAoUl9JTUFHRUJBU0UsICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLCAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJydmEzMiIsCSAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIHswMTB9LAotICB7MDExfSwKLSAgezAxMn0sCi0gIHswMTN9LAotICB7MDE0fSwKLSAgezAxNX0sCi0gIHswMTZ9LAotICBIT1dUTyAoUl9SRUxCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiOCIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1JFTFdPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTM4Nl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiMTYiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9SRUxMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIjMyIiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSQllURSwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSA4LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1A4IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JXT1JELAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2kzODZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1AxNiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUENSTE9ORywJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pMzg2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBJMzg2QkFETUFHKHgpCi0jZGVmaW5lIEkzODYgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi0vKiBGb3IgMzg2IENPRkYgYSBTVFlQX05PTE9BRCB8IFNUWVBfQlNTIHNlY3Rpb24gaXMgcGFydCBvZiBhIHNoYXJlZAotICAgbGlicmFyeS4gIE9uIHNvbWUgb3RoZXIgQ09GRiB0YXJnZXRzIFNUWVBfQlNTIGlzIG5vcm1hbGx5Ci0gICBTVFlQX05PTE9BRC4gICovCi0jZGVmaW5lIEJTU19OT0xPQURfSVNfU0hBUkVEX0xJQlJBUlkKLQotLyogQ29tcHV0ZSB0aGUgYWRkZW5kIG9mIGEgcmVsb2MuICBJZiB0aGUgcmVsb2MgaXMgdG8gYSBjb21tb24gc3ltYm9sLAotICAgdGhlIG9iamVjdCBmaWxlIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4gIEJ5IHRoZQotICAgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIGxpbmtlciBtYXkgYmUgdXNpbmcgYSBkaWZmZXJlbnQgc3ltYm9sCi0gICBmcm9tIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuICBUaGVyZWZvcmUsIHdlCi0gICBoYWNrIHdpbGRseSB0byBsb2NhdGUgdGhlIG9yaWdpbmFsIHN5bWJvbCBmcm9tIHRoaXMgZmlsZSBzbyB0aGF0IHdlCi0gICBjYW4gbWFrZSB0aGUgY29ycmVjdCBhZGp1c3RtZW50LiAgVGhpcyBtYWNybyBzZXRzIGNvZmZzeW0gdG8gdGhlCi0gICBzeW1ib2wgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSwgYW5kIHVzZXMgaXQgdG8gc2V0IHRoZSBhZGRlbmQgdmFsdWUKLSAgIGNvcnJlY3RseS4gIElmIHRoaXMgaXMgbm90IGEgY29tbW9uIHN5bWJvbCwgdGhlIHVzdWFsIGFkZGVuZAotICAgY2FsY3VsYXRpb24gaXMgZG9uZSwgZXhjZXB0IHRoYXQgYW4gYWRkaXRpb25hbCB0d2VhayBpcyBuZWVkZWQgZm9yCi0gICBQQyByZWxhdGl2ZSByZWxvY3MuCi0gICBGSVhNRTogVGhpcyBtYWNybyByZWZlcnMgdG8gc3ltYm9scyBhbmQgYXNlY3Q7IHRoZXNlIGFyZSBmcm9tIHRoZQotICAgY2FsbGluZyBmdW5jdGlvbiwgbm90IHRoZSBtYWNybyBhcmd1bWVudHMuICAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikJCVwKLSAgewkJCQkJCQkJXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwlcCi0gICAgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgIT0gYWJmZCkJCQlcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKQkJCQlcCi0JICAgICAgICAgKyAoY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAtIHN5bWJvbHMpKTsJCVwKLSAgICBlbHNlIGlmIChwdHIpCQkJCQkJXAotICAgICAgY29mZnN5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHB0cik7CQkJXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwJCQlcCi0JJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlOwlcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkCQlcCi0JICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7CVwKLSAgICBlbHNlCQkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsJCQkJCVwKLSAgICBpZiAocHRyICYmIGhvd3RvX3RhYmxlW3JlbG9jLnJfdHlwZV0ucGNfcmVsYXRpdmUpCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCArPSBhc2VjdC0+dm1hOwkJCQlcCi0gIH0KLQotLyogV2UgdXNlIHRoZSBzcGVjaWFsIENPRkYgYmFja2VuZCBsaW5rZXIuICBGb3Igbm9ybWFsIGkzODYgQ09GRiwgd2UKLSAgIGNhbiB1c2UgdGhlIGdlbmVyaWMgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgRm9yIFBFLCB3ZSBuZWVkIG91cgotICAgb3duIHJvdXRpbmUuICAqLwotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0KLSNlbHNlIC8qIENPRkZfV0lUSF9QRSAqLwotCi0vKiBUaGUgUEUgcmVsb2NhdGUgc2VjdGlvbiByb3V0aW5lLiAgVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKLSAgIGFuZCB0aGUgcmVndWxhciByb3V0aW5lIGlzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBmb3IgYQotICAgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BlX2kzODZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkgICAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbG9jcywgc3ltcywKLQkJCSAgICAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JCQkJCSAgICAgcmVsb2NzLCBzeW1zLCBzZWN0aW9ucyk7Ci19Ci0KLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfcGVfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNlbmRpZiAvKiBDT0ZGX1dJVEhfUEUgKi8KLQotLyogQ29udmVydCBhbiBydHlwZSB0byBob3d0byBmb3IgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1jb2ZmX2kzODZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIGhvd3RvID0gaG93dG9fdGFibGUgKyByZWwtPnJfdHlwZTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICAqYWRkZW5kcCA9IDA7Ci0jZW5kaWYKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgICphZGRlbmRwICs9IHNlYy0+dm1hOwotCi0gIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gPT0gMCAmJiBzeW0tPm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgY29tbW9uIHN5bWJvbC4gIFRoZSBzZWN0aW9uIGNvbnRlbnRzIGluY2x1ZGUgdGhlCi0JIHNpemUgKHN5bS0+bl92YWx1ZSkgYXMgYW4gYWRkZW5kLiAgVGhlIHJlbG9jYXRlX3NlY3Rpb24KLQkgZnVuY3Rpb24gd2lsbCBiZSBhZGRpbmcgaW4gdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBXZQotCSBuZWVkIHRvIHN1YnRyYWN0IG91dCB0aGUgY3VycmVudCBzaXplIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgY29ycmVjdCByZXN1bHQuICAqLwotIAotICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotI2lmbmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZQotCSBzZWVuIHNvbWUgZGF0YSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsb2NhdGlvbiBhZGRyZXNzLgotCSBJZiBJIGxpbmsgdHdvIHZlcnNpb25zIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkCi0JIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlCi0JIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgY2FzZSBpbiB3aGljaAotCSB0aGlzIHNlY3Rpb24gaGFzIGJlZW4gYnlwYXNzZWQgaGFzIGFkZHJlc3NlcyB3aGljaCBjb3JyZXNwb25kCi0JIHRvIHZhbHVlcyBJIGNhbiBmaW5kIGluIHRoZSBtYXAuICAqLwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotI2VuZGlmCi0gICAgfQotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSAKLSAgICAqYWRkZW5kcCArPSBoLT5yb290LnUuYy5zaXplOwotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICAqYWRkZW5kcCAtPSA0OwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHRoZW4gdGhlIGdlbmVyaWMgY29kZSBpcyBnb2luZyB0bwotICAgICAgICAgYWRkIGJhY2sgdGhlIHN5bWJvbCB2YWx1ZSBpbiBvcmRlciB0byBjYW5jZWwgb3V0IGFuCi0gICAgICAgICBhZGp1c3RtZW50IGl0IG1hZGUgdG8gdGhlIGFkZGVuZC4gIEhvd2V2ZXIsIHdlIHNldCB0aGUgYWRkZW5kCi0gICAgICAgICB0byAwIGF0IHRoZSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uLiAgV2UgbmVlZCB0byBhZGp1c3QgaGVyZSwKLSAgICAgICAgIHRvIGF2b2lkIHRoZSBhZGp1c3RtZW50IHRoZSBnZW5lcmljIGNvZGUgd2lsbCBtYWtlLiAgRklYTUU6Ci0gICAgICAgICBUaGlzIGlzIGdldHRpbmcgYSBiaXQgaGFja2lzaC4gICovCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICBpZiAocmVsLT5yX3R5cGUgPT0gUl9JTUFHRUJBU0UpCi0gICAgewotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX1JWQToKLSAgICAgIHJldHVybiBob3d0b190YWJsZSArUl9JTUFHRUJBU0U7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gaG93dG9fdGFibGUgKyBSX0RJUjMyOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotICAgICAgcmV0dXJuIGhvd3RvX3RhYmxlICsgUl9QQ1JMT05HOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfRkFJTCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfaTM4Nl9ydHlwZV90b19ob3d0bwotCi0jaWZkZWYgVEFSR0VUX1VOREVSU0NPUkUKLQotLyogSWYgaTM4NiBnY2MgdXNlcyB1bmRlcnNjb3JlcyBmb3Igc3ltYm9sIG5hbWVzLCB0aGVuIGl0IGRvZXMgbm90IHVzZQotICAgYSBsZWFkaW5nIGRvdCBmb3IgbG9jYWwgbGFiZWxzLCBzbyBpZiBUQVJHRVRfVU5ERVJTQ09SRSBpcyBkZWZpbmVkCi0gICB3ZSB0cmVhdCBhbGwgc3ltYm9scyBzdGFydGluZyB3aXRoIEwgYXMgbG9jYWwuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2kzODZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnTCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGNvZmZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lCi0KLSNlbmRpZiAvKiBUQVJHRVRfVU5ERVJTQ09SRSAqLwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaTNjb2ZmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIC8qIFdlIG5lZWQgdG8gaGFjayBiYWRseSB0byBoYW5kbGUgYSBQRSBpbWFnZSBjb3JyZWN0bHkuICBJbiBQRQotICAgICBpbWFnZXMgY3JlYXRlZCBieSB0aGUgR05VIGxpbmtlciwgdGhlIG9mZnNldCB0byB0aGUgQ09GRiBoZWFkZXIKLSAgICAgaXMgYWx3YXlzIHRoZSBzaXplLiAgSG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UgaW4gaW1hZ2VzCi0gICAgIGdlbmVyYXRlZCBieSBvdGhlciBQRSBsaW5rZXJzLiAgVGhlIFBFIGZvcm1hdCBzdG9yZXMgYSBmb3VyIGJ5dGUKLSAgICAgb2Zmc2V0IHRvIHRoZSBQRSBzaWduYXR1cmUganVzdCBiZWZvcmUgdGhlIENPRkYgaGVhZGVyIGF0Ci0gICAgIGxvY2F0aW9uIDB4M2Mgb2YgdGhlIGZpbGUuICBXZSBwaWNrIHVwIHRoYXQgb2Zmc2V0LCB2ZXJpZnkgdGhhdAotICAgICB0aGUgUEUgc2lnbmF0dXJlIGlzIHRoZXJlLCBhbmQgdGhlbiBzZXQgb3Vyc2VsdmVzIHVwIHRvIHJlYWQgaW4KLSAgICAgdGhlIENPRkYgaGVhZGVyLiAgKi8KLSAgewotICAgIGJmZF9ieXRlIGV4dF9vZmZzZXRbNF07Ci0gICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgIGJmZF9ieXRlIGV4dF9zaWduYXR1cmVbNF07Ci0gICAgdW5zaWduZWQgbG9uZyBzaWduYXR1cmU7Ci0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIDB4M2MsIFNFRUtfU0VUKSAhPSAwCi0JfHwgYmZkX3JlYWQgKGV4dF9vZmZzZXQsIDEsIDQsIGFiZmQpICE9IDQpCi0gICAgICB7Ci0JaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHRfb2Zmc2V0KTsKLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCwgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoZXh0X3NpZ25hdHVyZSwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBzaWduYXR1cmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9zaWduYXR1cmUpOwotCi0gICAgaWYgKHNpZ25hdHVyZSAhPSAweDQ1NTApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgICAvKiBIZXJlIGlzIHRoZSBoYWNrLiAgY29mZl9vYmplY3RfcCB3YW50cyB0byByZWFkIGZpbGhzeiBieXRlcyB0bwotICAgICAgIHBpY2sgdXAgdGhlIENPRkYgaGVhZGVyLiAgV2UgYWRqdXN0IHNvIHRoYXQgdGhhdCB3aWxsIHdvcmsuICAyMAotICAgICAgIGlzIHRoZSBzaXplIG9mIHRoZSBpMzg2IENPRkYgZmlsZWhkci4gICovCi0KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgKGJmZF90ZWxsIChhYmZkKQotCQkgICAtIGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkKLQkJICAgKyAyMCksCi0JCSAgU0VFS19TRVQpCi0JIT0gMCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGNvZmZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIGkzODZjb2ZmX3ZlYyA9Ci0jZW5kaWYKLXsKLSNpZmRlZiBUQVJHRVRfTkFNRQotICBUQVJHRVRfTkFNRSwKLSNlbHNlCi0gICJjb2ZmLWkzODYiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0jZWxzZQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9VTkRFUlNDT1JFCi0gIFRBUkdFVF9VTkRFUlNDT1JFLAkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0jZWxzZQotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSNlbmRpZgotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgaTNjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBpM2NvZmZfb2JqZWN0X3B9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWk4NjAuYyBiL2JmZC9jb2ZmLWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5ZmE0Mi4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA4NjAgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDcmVhdGVkIG1vc3RseSBieSBzdWJzdGl0dXRpbmcgIjg2MCIgZm9yICIzODYiIGluIGNvZmYtaTM4Ni5jCi0gICBIYXJyeSBEb2xhbiA8ZG9sYW5Ac3NkLmludGVsLmNvbT4sIE9jdG9iZXIgMTk5NQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgImNvZmYvaTg2MC5oIgotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTg2MF9yZWxvYyAKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFIDB4MTAwMAotCi0vKiBGb3Igc29tZSByZWFzb24gd2hlbiB1c2luZyBpODYwIENPRkYgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24gZm9yIGEgcmVmZXJlbmNlIHRvIGEgY29tbW9uIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMKLSAgIGFueSBkZXNpcmVkIG9mZnNldC4gIElhbiBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LiAgKi8KLQotLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBuZWVkIHRvIGRvIHNvbWUKLSAgIGFkanVzdG1lbnRzIHRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IGFyZSBub3QgZG9uZSBieSB0aGUKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBldmVyeQotICAgcmVsb2MgdHlwZSB0byBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50cy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWNvZmZfaTg2MF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgcmVsb2NhdGluZyBhIGNvbW1vbiBzeW1ib2wuICBUaGUgY3VycmVudCB2YWx1ZSBpbiB0aGUKLQkgb2JqZWN0IGZpbGUgaXMgT1JJRyArIE9GRlNFVCwgd2hlcmUgT1JJRyBpcyB0aGUgdmFsdWUgb2YgdGhlCi0JIGNvbW1vbiBzeW1ib2wgYXMgc2VlbiBieSB0aGUgb2JqZWN0IGZpbGUgd2hlbiBpdCB3YXMgY29tcGlsZWQKLQkgKHRoaXMgbWF5IGJlIHplcm8gaWYgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkKSBhbmQgT0ZGU0VUIGlzCi0JIHRoZSBvZmZzZXQgaW50byB0aGUgY29tbW9uIHN5bWJvbCAobm9ybWFsbHkgemVybywgYnV0IG1heSBiZQotCSBub24temVybyB3aGVuIHJlZmVycmluZyB0byBhIGZpZWxkIGluIGEgY29tbW9uIHN0cnVjdHVyZSkuCi0JIE9SSUcgaXMgdGhlIG5lZ2F0aXZlIG9mIHJlbG9jX2VudHJ5LT5hZGRlbmQsIHdoaWNoIGlzIHNldCBieQotCSB0aGUgQ0FMQ19BRERFTkQgbWFjcm8gYmVsb3cuICBXZSB3YW50IHRvIHJlcGxhY2UgdGhlIHZhbHVlIGluCi0JIHRoZSBvYmplY3QgZmlsZSB3aXRoIE5FVyArIE9GRlNFVCwgd2hlcmUgTkVXIGlzIHRoZSB2YWx1ZSBvZgotCSB0aGUgY29tbW9uIHN5bWJvbCB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcHV0IGluIHRoZSBmaW5hbAotCSBvYmplY3QgZmlsZS4gIE5FVyBpcyBzeW1ib2wtPnZhbHVlLiAgKi8KLSAgICAgIGRpZmYgPSBzeW1ib2wtPnZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBhbHdheXMgZWZmZWN0aXZlbHkKLQkgaWdub3JlcyB0aGUgYWRkZW5kIGZvciBhIENPRkYgdGFyZ2V0IHdoZW4gcHJvZHVjaW5nCi0JIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBUaGlzIHNlZW1zIHRvIGJlIGFsd2F5cyB3cm9uZyBmb3IgODYwCi0JIENPRkYsIHNvIHdlIGhhbmRsZSB0aGUgYWRkZW5kIGhlcmUgaW5zdGVhZC4gICovCi0gICAgICBkaWZmID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICgoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyBkaWZmKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgICBpZiAoZGlmZiAhPSAwKQotICAgICAgewotCXJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotCXVuc2lnbmVkIGNoYXIgKmFkZHIgPSAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0KLQlzd2l0Y2ggKGhvd3RvLT5zaXplKQotCSAgewotCSAgY2FzZSAwOgotCSAgICB7Ci0JICAgICAgY2hhciB4ID0gYmZkX2dldF84IChhYmZkLCBhZGRyKTsKLQkgICAgICBET0lUICh4KTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBjYXNlIDE6Ci0JICAgIHsKLQkgICAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgICAgRE9JVCAoeCk7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgeCwgYWRkcik7Ci0JICAgIH0KLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMjoKLQkgICAgewotCSAgICAgIGxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIGFkZHIpOwotCSAgICAgIERPSVQgKHgpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgICB9Ci0JICAgIGJyZWFrOwotCi0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0jaWZuZGVmIFBDUkVMT0ZGU0VUCi0jZGVmaW5lIFBDUkVMT0ZGU0VUIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAotewotICB7MH0sCi0gIHsxfSwKLSAgezJ9LAotICB7M30sCi0gIHs0fSwKLSAgezV9LAotICBIT1dUTyAoUl9ESVIzMiwgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgImRpcjMyIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAvKiB7N30sICovCi0gIEhPV1RPIChSX0lNQUdFQkFTRSwgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgInJ2YTMyIiwJICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgezAxMH0sCi0gIHswMTF9LAotICB7MDEyfSwKLSAgezAxM30sCi0gIHswMTR9LAotICB7MDE1fSwKLSAgezAxNn0sCi0gIEhPV1RPIChSX1JFTEJZVEUsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgOCwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICI4IiwJCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgSE9XVE8gKFJfUkVMV09SRCwJCS8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJCQkvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgY29mZl9pODYwX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICIxNiIsCQkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1JFTExPTkcsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiMzIiLAkJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JCWVRFLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDgsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDgiLAkJLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgUENSRUxPRkZTRVQpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIEhPV1RPIChSX1BDUldPUkQsCQkvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCQkJLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkJLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGNvZmZfaTg2MF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiRElTUDE2IiwJCS8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIFBDUkVMT0ZGU0VUKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICBIT1dUTyAoUl9QQ1JMT05HLAkJLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJCS8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBjb2ZmX2k4NjBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkRJU1AzMiIsCQkvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBQQ1JFTE9GRlNFVCkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyAgbnVubWJlciAqLwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB7IHgucl90eXBlID0gaG93dG8tPnR5cGU7IH0KLSNkZWZpbmUgQkFETUFHKHgpIEk4NjBCQURNQUcoeCkKLSNkZWZpbmUgSTg2MCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotCSAgICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLS8qIEZvciA4NjAgQ09GRiBhIFNUWVBfTk9MT0FEIHwgU1RZUF9CU1Mgc2VjdGlvbiBpcyBwYXJ0IG9mIGEgc2hhcmVkCi0gICBsaWJyYXJ5LiAgT24gc29tZSBvdGhlciBDT0ZGIHRhcmdldHMgU1RZUF9CU1MgaXMgbm9ybWFsbHkKLSAgIFNUWVBfTk9MT0FELiAgKi8KLSNkZWZpbmUgQlNTX05PTE9BRF9JU19TSEFSRURfTElCUkFSWQotCi0vKiBDb21wdXRlIHRoZSBhZGRlbmQgb2YgYSByZWxvYy4gIElmIHRoZSByZWxvYyBpcyB0byBhIGNvbW1vbiBzeW1ib2wsCi0gICB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgQnkgdGhlCi0gICB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgbGlua2VyIG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBzeW1ib2wKLSAgIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gIFRoZXJlZm9yZSwgd2UKLSAgIGhhY2sgd2lsZGx5IHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGZyb20gdGhpcyBmaWxlIHNvIHRoYXQgd2UKLSAgIGNhbiBtYWtlIHRoZSBjb3JyZWN0IGFkanVzdG1lbnQuICBUaGlzIG1hY3JvIHNldHMgY29mZnN5bSB0byB0aGUKLSAgIHN5bWJvbCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCBhbmQgdXNlcyBpdCB0byBzZXQgdGhlIGFkZGVuZCB2YWx1ZQotICAgY29ycmVjdGx5LiAgSWYgdGhpcyBpcyBub3QgYSBjb21tb24gc3ltYm9sLCB0aGUgdXN1YWwgYWRkZW5kCi0gICBjYWxjdWxhdGlvbiBpcyBkb25lLCBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIHR3ZWFrIGlzIG5lZWRlZCBmb3IKLSAgIFBDIHJlbGF0aXZlIHJlbG9jcy4KLSAgIEZJWE1FOiBUaGlzIG1hY3JvIHJlZmVycyB0byBzeW1ib2xzIGFuZCBhc2VjdDsgdGhlc2UgYXJlIGZyb20gdGhlCi0gICBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgdGhlIG1hY3JvIGFyZ3VtZW50cy4gICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKQkJXAotICB7CQkJCQkJCQlcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CVwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKQkJCVwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpCQkJCVwKLQkgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOwkJXAotICAgIGVsc2UgaWYgKHB0cikJCQkJCQlcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsJCQlcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAkJCVwKLQkmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7CVwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQJCVwKLQkgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwkJCQkJXAotICAgIGlmIChwdHIgJiYgaG93dG9fdGFibGVbcmVsb2Mucl90eXBlXS5wY19yZWxhdGl2ZSkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotCi0vKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTg2MF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0KLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgaG93dG8gPSBob3d0b190YWJsZSArIHJlbC0+cl90eXBlOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0KLSAgICAgIC8qIEkgdGhpbmsgd2UgKmRvKiB3YW50IHRvIGJ5cGFzcyB0aGlzLiAgSWYgd2UgZG9uJ3QsIEkgaGF2ZSBzZWVuIHNvbWUgZGF0YQotCSBwYXJhbWV0ZXJzIGdldCB0aGUgd3JvbmcgcmVsY2F0aW9uIGFkZHJlc3MuICBJZiBJIGxpbmsgdHdvIHZlcnNpb25zCi0JIHdpdGggYW5kIHdpdGhvdXQgdGhpcyBzZWN0aW9uIGJ5cGFzc2VkIGFuZCB0aGVuIGRvIGEgYmluYXJ5IGNvbXBhcmlzb24sCi0JIHRoZSBhZGRyZXNzZXMgd2hpY2ggYXJlIGRpZmZlcmVudCBjYW4gYmUgbG9va2VkIHVwIGluIHRoZSBtYXAuICBUaGUgCi0JIGNhc2UgaW4gd2hpY2ggdGhpcyBzZWN0aW9uIGhhcyBiZWVuIGJ5cGFzc2VkIGhhcyBhZGRyZXNzZXMgd2hpY2ggY29ycmVzcG9uZAotCSB0byB2YWx1ZXMgSSBjYW4gZmluZCBpbiB0aGUgbWFwICovCi0gICAgICAqYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvdXRwdXQgc3ltYm9sIGlzIGNvbW1vbiAoaW4gd2hpY2ggY2FzZSB0aGlzIG11c3QgYmUgYQotICAgICByZWxvY2F0ZWFibGUgbGluayksIHdlIG5lZWQgdG8gYWRkIGluIHRoZSBmaW5hbCBzaXplIG9mIHRoZQotICAgICBjb21tb24gc3ltYm9sLiAgKi8KLSAgaWYgKGggIT0gTlVMTCAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pIAotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gY29mZl9pODYwX3J0eXBlX3RvX2hvd3RvCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1pM2NvZmZfb2JqZWN0X3AoYSkKLSAgICAgYmZkICphOwotewotICByZXR1cm4gY29mZl9vYmplY3RfcChhKTsKLX0KLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICBpODYwY29mZl92ZWMgPQotI2VuZGlmCi17Ci0jaWZkZWYgVEFSR0VUX05BTUUKLSAgVEFSR0VUX05BTUUsCi0jZWxzZQotICAiY29mZi1pODYwIiwJCQkvKiBuYW1lICovCi0jZW5kaWYKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgaTNjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBpM2NvZmZfb2JqZWN0X3B9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgICAgYmZkX2ZhbHNlfSwKLSAgICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLWk5NjAuYyBiL2JmZC9jb2ZmLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0NTVkOS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCA5NjAgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEk5NjAgMQotI2RlZmluZSBCQURNQUcoeCkgSTk2MEJBRE1BRyh4KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pOTYwLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIJCS8qIHRvIGFsbG93IGVhc2llciBhYnN0cmFjdGlvbi1icmVha2luZyAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2k5NjBfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG9wdGNhbGxfY2FsbGJhY2sKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGNvZmZfaTk2MF9yZWxvY2F0ZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9pOTYwX2FkanVzdF9zeW1uZHgKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBib29sZWFuICopKTsKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgMQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfQUxJR04gYmZkX2hfZ2V0XzMyCi0jZGVmaW5lIFBVVF9TQ05IRFJfQUxJR04gYmZkX2hfcHV0XzMyCi0KLS8qIFRoZSBpOTYwIGRvZXMgbm90IHN1cHBvcnQgYW4gTU1VLCBzbyBDT0ZGX1BBR0VfU0laRSBjYW4gYmUKLSAgIGFyYml0cmFyaWx5IHNtYWxsLiAgKi8KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgMQotCi0jZGVmaW5lIENPRkZfTE9OR19GSUxFTkFNRVMKLQotLyogVGhpcyBzZXQgb2YgbG9jYWwgbGFiZWwgbmFtZXMgaXMgdGFrZW4gZnJvbSBnYXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIChuYW1lWzBdID09ICdMJwotCSAgfHwgKG5hbWVbMF0gPT0gJy4nCi0JICAgICAgJiYgKG5hbWVbMV0gPT0gJ0MnCi0JCSAgfHwgbmFtZVsxXSA9PSAnSScKLQkJICB8fCBuYW1lWzFdID09ICcuJykpKTsKLX0KLQotLyogVGhpcyBpcyBqdXN0IGxpa2UgdGhlIHVzdWFsIENBTENfQURERU5ELCBidXQgaXQgaW5jbHVkZXMgdGhlCi0gICBzZWN0aW9uIFZNQSBmb3IgUEMgcmVsYXRpdmUgcmVsb2NzLiAgKi8KLSNpZm5kZWYgQ0FMQ19BRERFTkQKLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOyAgICAgIFwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOyAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7ICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHB0ciAmJiAocmVsb2Mucl90eXBlID09IDI1IHx8IHJlbG9jLnJfdHlwZSA9PSAyNykpCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotI2VuZGlmCi0KLSNkZWZpbmUgQ0FMTFMJIDB4NjYwMDM4MDAJLyogVGVtcGxhdGUgZm9yICdjYWxscycgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgQkFMCSAweDBiMDAwMDAwCS8qIFRlbXBsYXRlIGZvciAnYmFsJyBpbnN0cnVjdGlvbgkqLwotI2RlZmluZSBCQUxfTUFTSyAweDAwZmZmZmZmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1vcHRjYWxsX2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBUaGlzIGl0ZW0gaGFzIGFscmVhZHkgYmVlbiByZWxvY2F0ZWQgY29ycmVjdGx5LCBidXQgd2UgbWF5IGJlCi0gICAqIGFibGUgdG8gcGF0Y2ggaW4geWV0IGJldHRlciBjb2RlIC0gZG9uZSBieSBkaWdnaW5nIG91dCB0aGUKLSAgICogY29ycmVjdCBpbmZvIG9uIHRoaXMgc3ltYm9sICovCi0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXN1bHQ7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNzID0gY29mZnN5bWJvbChzeW1ib2xfaW4pOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIHdpdGggc3ltYm9scyB3aGljaCBhcmVuJ3QgdGllZCB1cCB5ZXQsCi0gICAgIGV4Y2VwdCBtb3ZlIHRoZSByZWxvYy4gKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoY3MtPnN5bWJvbC5zZWN0aW9uKSkgewotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgfQotICAgIAotICAvKiBTbyB0aGUgdGFyZ2V0IHN5bWJvbCBoYXMgdG8gYmUgb2YgY29mZiB0eXBlLCBhbmQgdGhlIHN5bWJvbCAKLSAgICAgaGFzIHRvIGhhdmUgdGhlIGNvcnJlY3QgbmF0aXZlIGluZm9ybWF0aW9uIHdpdGhpbiBpdCAqLwotICBpZiAoKGJmZF9hc3ltYm9sX2ZsYXZvdXIoJmNzLT5zeW1ib2wpICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgICAgfHwgKGNzLT5uYXRpdmUgPT0gKGNvbWJpbmVkX2VudHJ5X3R5cGUgKilOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGludGVyZXN0aW5nLCBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB3ZSdyZSBvdXRwdXR0aW5nIGNvZmYKLQkgZnJvbSBhIG1peCBuIG1hdGNoIGlucHV0LCBsaW5raW5nIGZyb20gY29mZiB0byBhIHN5bWJvbCBkZWZpbmVkIGluIGEKLQkgYm91dCBmaWxlIHdpbGwgY2F1c2UgdGhpcyBtYXRjaCB0byBiZSB0cnVlLiBTaG91bGQgSSBjb21wbGFpbj8gIFRoaXMKLQkgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGJvdXQgc3ltYm9sIGlzIG5vbiBsZWFmLiAgKi8KLSAgICAgICplcnJvcl9tZXNzYWdlID0KLQkoY2hhciAqKSBfKCJ1bmNlcnRhaW4gY2FsbGluZyBjb252ZW50aW9uIGZvciBub24tQ09GRiBzeW1ib2wiKTsKLSAgICAgIHJlc3VsdCA9IGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgIHN3aXRjaCAoY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MpIAotICAgICAgewotICAgICAgY2FzZSBDX0xFQUZTVEFUOgotICAgICAgY2FzZSBDX0xFQUZFWFQ6Ci0gIAkvKiBUaGlzIGlzIGEgY2FsbCB0byBhIGxlYWYgcHJvY2VkdXJlLCByZXBsYWNlIGluc3RydWN0aW9uIHdpdGggYSBiYWwKLQkgICB0byB0aGUgY29ycmVjdCBsb2NhdGlvbi4gICovCi0JewotCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXggPSAmKChjcy0+bmF0aXZlKzIpLT51LmF1eGVudCk7Ci0JICBpbnQgd29yZCA9IGJmZF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQkgIGludCBvbGYgPSAoYXV4LT54X2JhbC54X2JhbG50cnkgLSBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkgIEJGRF9BU1NFUlQoY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXg9PTIpOwotCi0JICAvKiBXZSByZXBsYWNlIHRoZSBvcmlnaW5hbCBjYWxsIGluc3RydWN0aW9uIHdpdGggYSBiYWwgdG8KLQkgICAgIHRoZSBiYWwgZW50cnkgcG9pbnQgLSB0aGUgb2Zmc2V0IG9mIHdoaWNoIGlzIGRlc2NyaWJlZCBpbgotCSAgICAgdGhlIDJuZCBhdXhlbnQgb2YgdGhlIG9yaWdpbmFsIHN5bWJvbC4gV2Uga2VlcCB0aGUgbmF0aXZlCi0JICAgICBzeW0gYW5kIGF1eGVudHMgdW50b3VjaGVkLCBzbyB0aGUgZGVsdGEgYmV0d2VlbiB0aGUgdHdvCi0JICAgICBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiYWwgZW50cnkgcG9pbnQuICAqLwotCSAgd29yZCA9ICgod29yZCArICBvbGYpICAmIEJBTF9NQVNLKSB8IEJBTDsKLSAgCSAgYmZkX3B1dF8zMihhYmZkLCB3b3JkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgCX0KLQlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIENfU0NBTEw6Ci0JLyogVGhpcyBpcyBhIGNhbGwgdG8gYSBzeXN0ZW0gY2FsbCwgcmVwbGFjZSB3aXRoIGEgY2FsbHMgdG8gIyAqLwotCUJGRF9BU1NFUlQoMCk7Ci0JcmVzdWx0ID0gYmZkX3JlbG9jX29rOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlyZXN1bHQgPSBiZmRfcmVsb2Nfb2s7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogaTk2MCBDT0ZGIGlzIHVzZWQgYnkgVnhXb3JrcyA1LjEuICBIb3dldmVyLCBWeFdvcmtzIDUuMSBkb2VzIG5vdAotICAgYXBwZWFyIHRvIGNvcnJlY3RseSBoYW5kbGUgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlCi0gICBzYW1lIG9iamVjdCBmaWxlLiAgSXQgYXBwZWFycyB0byBzaW1wbHkgZGlzY2FyZCBzdWNoIHJlbG9jcywgcmF0aGVyCi0gICB0aGFuIGFkZGluZyB0aGVpciB2YWx1ZXMgaW50byB0aGUgb2JqZWN0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBoZXJlCi0gICBieSBjb252ZXJ0aW5nIGFsbCByZWxvY3MgYWdhaW5zdCBkZWZpbmVkIHN5bWJvbHMgaW50byByZWxvY3MKLSAgIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLCB3aGVuIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0Ci0gICBmaWxlLgotCi0gICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgbm90IHVzaW5nIHRoZSBDT0ZGCi0gICBzcGVjaWZpYyBiYWNrZW5kIGxpbmtlci4gIEl0IG9ubHkgZG9lcyBzb21ldGhpbmcgd2hlbiBkb2luZyBhCi0gICByZWxvY2F0ZWFibGUgbGluaywgd2hpY2ggd2lsbCBhbG1vc3QgY2VydGFpbmx5IGZhaWwgd2hlbiBub3QKLSAgIGdlbmVyYXRpbmcgQ09GRiBpOTYwIG91dHB1dCwgc28gdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBubyBsb25nZXIKLSAgIHVzZWZ1bC4gIEl0IHdhcyB1c2VkIGJlZm9yZSB0aGlzIHRhcmdldCB3YXMgY29udmVydGVkIHRvIHVzZSB0aGUKLSAgIENPRkYgc3BlY2lmaWMgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIAotY29mZl9pOTYwX3JlbG9jYXRlIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGFzZWN0aW9uICpvc2VjOwotCi0gIGlmIChvdXRwdXRfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgLyogTm90IGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCi0gICAgewotICAgICAgLyogU3ltYm9sIGlzIG5vdCBkZWZpbmVkLCBzbyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0LiAgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCi0gICAgewotICAgICAgLyogSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoZSByaWdodCBhY3Rpb24gaXMgZm9yIGEgY29tbW9uCi0gICAgICAgICBzeW1ib2wuICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgLyogQ29udmVydCB0aGUgcmVsb2MgdG8gdXNlIHRoZSBzZWN0aW9uIHN5bWJvbC4gIEZJWE1FOiBUaGlzIG1ldGhvZAotICAgICBpcyByaWRpY3Vsb3VzLiAgKi8KLSAgb3NlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKS0+b3V0cHV0X3NlY3Rpb247Ci0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYykgIT0gTlVMTAotICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpLT50ZGF0YSAhPSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0ciA9Ci0gICAgICAoYXN5bWJvbCAqKikgY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpLT50ZGF0YTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY19uYW1lOwotICAgICAgYXN5bWJvbCAqKnN5bXMsICoqc3ltX2VuZDsKLQotICAgICAgc2VjX25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgb3NlYyk7Ci0gICAgICBzeW1zID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLSAgICAgIHN5bV9lbmQgPSBzeW1zICsgYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0gICAgICBmb3IgKDsgc3ltcyA8IHN5bV9lbmQ7IHN5bXMrKykKLQl7Ci0JICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoKnN5bXMpICE9IE5VTEwKLQkgICAgICAmJiAoKnN5bXMpLT52YWx1ZSA9PSAwCi0JICAgICAgJiYgc3RyY21wICgoKnN5bXMpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwKLQkJCSBzZWNfbmFtZSkgPT0gMCkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc3ltcyA+PSBzeW1fZW5kKQotCWFib3J0ICgpOwotCi0gICAgICByZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIgPSBzeW1zOwotCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKG91dHB1dF9iZmQsIG9zZWMpID09IE5VTEwpCi0JewotCSAgb3NlYy0+dXNlZF9ieV9iZmQgPQotCSAgICAoKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCSAgICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICBpZiAob3NlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQl9Ci0gICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAob3V0cHV0X2JmZCwgb3NlYyktPnRkYXRhID0gKFBUUikgc3ltczsKLSAgICB9Ci0KLSAgLyogTGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZG8gaXRzIHRoaW5nLCB3aGljaCB3aWxsIGluY2x1ZGUKLSAgICAgc3R1ZmZpbmcgdGhlIHN5bWJvbCBhZGRlbmQgaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b19yZWxsb25nID0KLSAgSE9XVE8gKCh1bnNpZ25lZCBpbnQpIFJfUkVMTE9ORywgMCwgMiwgMzIsZmFsc2UsIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBjb2ZmX2k5NjBfcmVsb2NhdGUsInJlbGxvbmciLCB0cnVlLAotCSAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCAwKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX2lwcm1lZCA9Ci0gIEhPV1RPIChSX0lQUk1FRCwgMCwgMiwgMjQsdHJ1ZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIGNvZmZfaTk2MF9yZWxvY2F0ZSwgImlwcm1lZCAiLCB0cnVlLCAweDAwZmZmZmZmLCAweDAwZmZmZmZmLCAwKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX29wdGNhbGwgPQotICBIT1dUTyAoUl9PUFRDQUxMLCAwLDIsMjQsdHJ1ZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIG9wdGNhbGxfY2FsbGJhY2ssICJvcHRjYWxsIiwgdHJ1ZSwgMHgwMGZmZmZmZiwgMHgwMGZmZmZmZiwgMCk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfaTk2MF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSTk2MF9DQUxMSjoKLSAgICAgIHJldHVybiAmaG93dG9fb3B0Y2FsbDsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgotICAgICAgcmV0dXJuICZob3d0b19yZWxsb25nOwotICAgIGNhc2UgQkZEX1JFTE9DXzI0X1BDUkVMOgotICAgICAgcmV0dXJuICZob3d0b19pcHJtZWQ7Ci0gICAgfQotfQotCi0vKiBUaGUgcmVhbCBjb2RlIGlzIGluIGNvZmZjb2RlLmggKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgXAotewkJCQkJCQlcCi0gICByZWxvY19ob3d0b190eXBlICpob3d0b19wdHI7CQkJCVwKLSAgIHN3aXRjaCAoKGRzdCktPnJfdHlwZSkgewkJCQlcCi0gICAgIGNhc2UgMTc6IGhvd3RvX3B0ciA9ICZob3d0b19yZWxsb25nOyBicmVhazsJXAotICAgICBjYXNlIDI1OiBob3d0b19wdHIgPSAmaG93dG9faXBybWVkOyBicmVhazsJCVwKLSAgICAgY2FzZSAyNzogaG93dG9fcHRyID0gJmhvd3RvX29wdGNhbGw7IGJyZWFrOwlcCi0gICAgIGRlZmF1bHQ6IGhvd3RvX3B0ciA9IDA7IGJyZWFrOwkJCVwKLSAgICAgfQkJCQkJCQlcCi0gICAoY2FjaGVfcHRyKS0+aG93dG8gPSBob3d0b19wdHI7CQkJXAotIH0KLQotLyogaTk2MCBDT0ZGIGlzIHVzZWQgYnkgVnhXb3JrcyA1LjEuICBIb3dldmVyLCBWeFdvcmtzIDUuMSBkb2VzIG5vdAotICAgYXBwZWFyIHRvIGNvcnJlY3RseSBoYW5kbGUgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlCi0gICBzYW1lIG9iamVjdCBmaWxlLiAgSXQgYXBwZWFycyB0byBzaW1wbHkgZGlzY2FyZCBzdWNoIHJlbG9jcywgcmF0aGVyCi0gICB0aGFuIGFkZGluZyB0aGVpciB2YWx1ZXMgaW50byB0aGUgb2JqZWN0IGZpbGUuICBXZSBoYW5kbGUgdGhpcyBieQotICAgY29udmVydGluZyBhbGwgcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMgaW50byByZWxvY3MgYWdhaW5zdAotICAgaW50ZXJuYWwgc3ltYm9scyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBUaGlzIHJvdXRpbmUgaXMKLSAgIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmtpbmcgcHJvY2VzcywgYW5kIGl0IGNyZWF0ZXMgdGhlCi0gICBuZWNlc3Nhcnkgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2k5NjBfc3RhcnRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBhc2VjdGlvbiAqbzsKLSAgYmZkX2J5dGUgKmVzeW07Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGVzeW0gPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3ltZXN6KTsKLSAgaWYgKGVzeW0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotCi0gICAgICBzdHJuY3B5IChpc3ltLl9uLl9uX25hbWUsIG8tPm5hbWUsIFNZTU5NTEVOKTsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IDA7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBvLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpc3ltLm5fdHlwZSA9IFRfTlVMTDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gICAgICBpc3ltLm5fbnVtYXV4ID0gMDsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZXN5bSk7Ci0KLSAgICAgIGlmIChiZmRfd3JpdGUgKGVzeW0sIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXsKLQkgIGZyZWUgKGVzeW0pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICs9IDE7Ci0gICAgfQotCi0gIGZyZWUgKGVzeW0pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgcmVsb2MgcHJvY2Vzc2luZyByb3V0aW5lIGZvciB0aGUgb3B0aW1pemVkIENPRkYgbGlua2VyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfaTk2MF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGxvbmcgc3ltbmR4OwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0ID0gYmZkX3JlbG9jX29rOwotICAgICAgYm9vbGVhbiBkb25lOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JeyAgICAKLQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3N5bW5keF07Ci0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCWFkZGVuZCA9IC0gc3ltLT5uX3ZhbHVlOwotICAgICAgZWxzZQotCWFkZGVuZCA9IDA7Ci0KLSAgICAgIHN3aXRjaCAocmVsLT5yX3R5cGUpCi0JewotCWNhc2UgMTc6IGhvd3RvID0gJmhvd3RvX3JlbGxvbmc7IGJyZWFrOwotCWNhc2UgMjU6IGhvd3RvID0gJmhvd3RvX2lwcm1lZDsgYnJlYWs7Ci0JY2FzZSAyNzogaG93dG8gPSAmaG93dG9fb3B0Y2FsbDsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZQotCQkgICAgIC0gc2VjLT52bWEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgZG9uZSA9IGZhbHNlOwotCi0gICAgICBpZiAoaG93dG8tPnR5cGUgPT0gUl9PUFRDQUxMICYmICEgaW5mby0+cmVsb2NhdGVhYmxlICYmIHN5bW5keCAhPSAtMSkKLQl7Ci0JICBpbnQgY2xhc3M7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIGNsYXNzID0gaC0+Y2xhc3M7Ci0JICBlbHNlCi0JICAgIGNsYXNzID0gc3ltLT5uX3NjbGFzczsKLQotCSAgc3dpdGNoIChjbGFzcykKLQkgICAgewotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBhcHBhcmVudGx5IG5vdCBmcm9tIGEgQ09GRiBpbnB1dCBmaWxlLgotICAgICAgICAgICAgICAgICBXZSB3YXJuLCBhbmQgdGhlbiBhc3N1bWUgdGhhdCBpdCBpcyBub3QgYSBsZWFmCi0gICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywKLQkJICAgICAgXygidW5jZXJ0YWluIGNhbGxpbmcgY29udmVudGlvbiBmb3Igbm9uLUNPRkYgc3ltYm9sIiksCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDX0xFQUZTVEFUOgotCSAgICBjYXNlIENfTEVBRkVYVDoKLQkgICAgICAvKiBUaGlzIGlzIGEgY2FsbCB0byBhIGxlYWYgcHJvY2VkdXJlOyB1c2UgdGhlIGJhbAotICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgewotCQlsb25nIG9sZjsKLQkJdW5zaWduZWQgbG9uZyB3b3JkOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgewotCQkgICAgQkZEX0FTU0VSVCAoaC0+bnVtYXV4ID09IDIpOwotCQkgICAgb2xmID0gaC0+YXV4WzFdLnhfYmFsLnhfYmFsbnRyeTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBiZmRfYnl0ZSAqZXN5bXM7Ci0JCSAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0JCSAgICBCRkRfQVNTRVJUIChzeW0tPm5fbnVtYXV4ID09IDIpOwotCQkgICAgZXN5bXMgPSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKTsKLQkJICAgIGVzeW1zICs9IChzeW1uZHggKyAyKSAqIGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLQkJICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW1zLCBzeW0tPm5fdHlwZSwKLQkJCQkJICBzeW0tPm5fc2NsYXNzLCAxLCBzeW0tPm5fbnVtYXV4LAotCQkJCQkgIChQVFIpICZhdXgpOwotCQkgICAgb2xmID0gYXV4LnhfYmFsLnhfYmFsbnRyeTsKLQkJICB9Ci0KLQkJd29yZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCQkgICAoY29udGVudHMKLQkJCQkgICAgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpOwotCQl3b3JkID0gKCh3b3JkICsgb2xmIC0gdmFsKSAmIEJBTF9NQVNLKSB8IEJBTDsKLQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCQkJICAgIHdvcmQsCi0JCQkgICAgKGNvbnRlbnRzCi0JCQkgICAgICsgKHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKTsKLQkJZG9uZSA9IHRydWU7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENfU0NBTEw6Ci0JICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGRvbmUpCi0JewotCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkgICAgYWRkZW5kICs9IGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsCi0JCQkJCSAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCSAgICB2YWwsIGFkZGVuZCk7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgc3ltLCBidWYpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9sIGluZGV4IG9mIGFueSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB0bwotICAgaW5zdGVhZCBiZSBhIHJlbG9jIGFnYWluc3QgdGhlIGludGVybmFsIHN5bWJvbCB3ZSBjcmVhdGVkIHNwZWNpYWxseQotICAgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9pOTYwX2FkanVzdF9zeW1uZHggKG9iZmQsIGluZm8sIGliZmQsIHNlYywgaXJlbCwgYWRqdXN0ZWRwKQotICAgICBiZmQgKm9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgKmFkanVzdGVkcCA9IGZhbHNlOwotCi0gIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpYmZkKVtpcmVsLT5yX3N5bW5keF07Ci0gIGlmIChoID09IE5VTEwKLSAgICAgIHx8IChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpcmVsLT5yX3N5bW5keCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleCAtIDE7Ci0gICphZGp1c3RlZHAgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgY29mZl9pOTYwX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2RlZmluZSBjb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsgY29mZl9pOTYwX3N0YXJ0X2ZpbmFsX2xpbmsKLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gY29mZl9pOTYwX3JlbG9jYXRlX3NlY3Rpb24KLQotI2RlZmluZSBjb2ZmX2FkanVzdF9zeW1uZHggY29mZl9pOTYwX2FkanVzdF9zeW1uZHgKLQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cCBjb2ZmX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgaWNvZmZfbGl0dGxlX3ZlYyA9Ci17Ci0gICJjb2ZmLUludGVsLWxpdHRsZSIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwotCi0KLWNvbnN0IGJmZF90YXJnZXQgaWNvZmZfYmlnX3ZlYyA9Ci17Ci0gICJjb2ZmLUludGVsLWJpZyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi1iZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi1iZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1tNjhrLmMgYi9iZmQvY29mZi1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDZiMTcuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbTY4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsNDgwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgNjgwMDAgQ09GRiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9tNjhrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBzb3VyY2UgZmlsZSBpcyBjb21waWxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgdmFyaW91cyBtNjhrIENPRkYKLSAgIHZhcmlhbnRzLiAgVGhlIGZvbGxvd2luZyBtYWNyb3MgY29udHJvbCBpdHMgYmVoYXZpb3VyOgotCi0gICBUQVJHRVRfU1lNCi0gICAgIFRoZSBDIG5hbWUgb2YgdGhlIEJGRCB0YXJnZXQgdmVjdG9yLiAgVGhlIGRlZmF1bHQgaXMgbTY4a2NvZmZfdmVjLgotICAgVEFSR0VUX05BTUUKLSAgICAgVGhlIHVzZXIgdmlzaWJsZSB0YXJnZXQgbmFtZS4gIFRoZSBkZWZhdWx0IGlzICJjb2ZmLW02OGsiLgotICAgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICAgIFdoZXRoZXIgc3ltYm9sIG5hbWVzIGhhdmUgYW4gdW5kZXJzY29yZS4KLSAgIE9OTFlfREVDTEFSRV9SRUxPQ1MKLSAgICAgT25seSBkZWNsYXJlIHRoZSByZWxvY2F0aW9uIGhvd3RvIGFycmF5LiAgRG9uJ3QgYWN0dWFsbHkgY29tcGlsZQotICAgICBpdC4gIFRoZSBhY3R1YWwgYXJyYXkgd2lsbCBiZSBwaWNrZWQgdXAgaW4gYW5vdGhlciB2ZXJzaW9uIG9mIHRoZQotICAgICBmaWxlLgotICAgU1RBVElDX1JFTE9DUwotICAgICBNYWtlIHRoZSByZWxvY2F0aW9uIGhvd3RvIGFycmF5LCBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbnMsIHN0YXRpYy4KLSAgIENPRkZfQ09NTU9OX0FEREVORAotICAgICBJZiB0aGlzIGlzIGRlZmluZWQsIHRoZW4sIGZvciBhIHJlbG9jYXRpb24gYWdhaW5zdCBhIGNvbW1vbgotICAgICBzeW1ib2wsIHRoZSBvYmplY3QgZmlsZSBob2xkcyB0aGUgdmFsdWUgKHRoZSBzaXplKSBvZiB0aGUgY29tbW9uCi0gICAgIHN5bWJvbC4gIElmIHRoaXMgaXMgbm90IGRlZmluZWQsIHRoZW4sIGZvciBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0gICAgIGNvbW1vbiBzeW1ib2wsIHRoZSBvYmplY3QgZmlsZSBob2xkcyB6ZXJvLiAgKi8KLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDIpCi0KLSNpZm5kZWYgQ09GRl9QQUdFX1NJWkUKLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDIwMDAKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfQ09NTU9OX0FEREVORAotI2RlZmluZSBSRUxPQ19TUEVDSUFMX0ZOIDAKLSNlbHNlCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfc3BlY2lhbF9mbgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICptNjhrY29mZl9jb21tb25fYWRkZW5kX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotI2RlZmluZSBSRUxPQ19TUEVDSUFMX0ZOIG02OGtjb2ZmX2NvbW1vbl9hZGRlbmRfc3BlY2lhbF9mbgotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIG02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLQotLyogT24gdGhlIGRlbHRhLCBhIHN5bWJvbCBzdGFydGluZyB3aXRoIEwlIGlzIGxvY2FsLiAgV2Ugd29uJ3Qgc2VlCi0gICBzdWNoIGEgc3ltYm9sIG9uIG90aGVyIHBsYXRmb3Jtcywgc28gaXQgc2hvdWxkIGJlIHNhZmUgdG8gYWx3YXlzCi0gICBjb25zaWRlciBpdCBsb2NhbCBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW02OGtfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChuYW1lWzBdID09ICdMJyAmJiBuYW1lWzFdID09ICclJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpOwotfQotCi0jaWZuZGVmIFNUQVRJQ19SRUxPQ1MKLS8qIENsZWFuIHVwIG5hbWVzcGFjZS4gICovCi0jZGVmaW5lIG02OGtjb2ZmX2hvd3RvX3RhYmxlCV9iZmRfbTY4a2NvZmZfaG93dG9fdGFibGUKLSNkZWZpbmUgbTY4a19ydHlwZTJob3d0bwlfYmZkX202OGtjb2ZmX3J0eXBlMmhvd3RvCi0jZGVmaW5lIG02OGtfaG93dG8ycnR5cGUJX2JmZF9tNjhrY29mZl9ob3d0bzJydHlwZQotI2RlZmluZSBtNjhrX3JlbG9jX3R5cGVfbG9va3VwCV9iZmRfbTY4a2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLSNlbmRpZgotCi0jaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgbTY4a2NvZmZfaG93dG9fdGFibGVbXTsKLSNlbHNlCi0jaWZkZWYgU1RBVElDX1JFTE9DUwotc3RhdGljCi0jZW5kaWYKLXJlbG9jX2hvd3RvX3R5cGUgbTY4a2NvZmZfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1JFTEJZVEUsCSAgICAgICAwLCAgMCwgIAk4LCAgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiOCIsCXRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTFdPUkQsCSAgICAgICAwLCAgMSwgCTE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICIxNiIsCXRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkcsCSAgICAgICAwLCAgMiwgCTMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIFJFTE9DX1NQRUNJQUxfRk4sICIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkJZVEUsCSAgICAgICAwLCAgMCwgCTgsICB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBSRUxPQ19TUEVDSUFMX0ZOLCAiRElTUDgiLCAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIkRJU1AxNiIsICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSTE9ORywJICAgICAgIDAsICAyLCAJMzIsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIFJFTE9DX1NQRUNJQUxfRk4sICJESVNQMzIiLCAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1JFTExPTkdfTkVHLAkgICAgICAgMCwgIC0yLCAJMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgUkVMT0NfU1BFQ0lBTF9GTiwgIi0zMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLSNlbmRpZiAvKiBub3QgT05MWV9ERUNMQVJFX1JFTE9DUyAqLwotCi0jaWZuZGVmIEJBRE1BRwotI2RlZmluZSBCQURNQUcoeCkgTTY4S0JBRE1BRyh4KQotI2VuZGlmCi0jZGVmaW5lIE02OCAxCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotCi0vKiBUdXJuIGEgaG93dG8gaW50byBhIHJlbG9jIG51bWJlciAqLwotCi0jaWZkZWYgT05MWV9ERUNMQVJFX1JFTE9DUwotZXh0ZXJuIHZvaWQgbTY4a19ydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICppbnRlcm5hbCwgaW50IHJlbG9jZW50cnkpKTsKLWV4dGVybiBpbnQgbTY4a19ob3d0bzJydHlwZSBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICopKTsKLWV4dGVybiByZWxvY19ob3d0b190eXBlICptNjhrX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLSNlbHNlCi0jaWZkZWYgU1RBVElDX1JFTE9DUwotc3RhdGljCi0jZW5kaWYKLXZvaWQKLW02OGtfcnR5cGUyaG93dG8oaW50ZXJuYWwsIHJlbG9jZW50cnkpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBpbnQgcmVsb2NlbnRyeTsKLXsKLSAgc3dpdGNoIChyZWxvY2VudHJ5KSAKLSAgewotICAgY2FzZSBSX1JFTEJZVEU6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMDsgYnJlYWs7Ci0gICBjYXNlIFJfUkVMV09SRDoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAxOyBicmVhazsKLSAgIGNhc2UgUl9SRUxMT05HOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDI7IGJyZWFrOwotICAgY2FzZSBSX1BDUkJZVEU6CWludGVybmFsLT5ob3d0byA9IG02OGtjb2ZmX2hvd3RvX3RhYmxlICsgMzsgYnJlYWs7Ci0gICBjYXNlIFJfUENSV09SRDoJaW50ZXJuYWwtPmhvd3RvID0gbTY4a2NvZmZfaG93dG9fdGFibGUgKyA0OyBicmVhazsKLSAgIGNhc2UgUl9QQ1JMT05HOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDU7IGJyZWFrOwotICAgY2FzZSBSX1JFTExPTkdfTkVHOglpbnRlcm5hbC0+aG93dG8gPSBtNjhrY29mZl9ob3d0b190YWJsZSArIDY7IGJyZWFrOwotICB9Ci19Ci0KLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotaW50IAotbTY4a19ob3d0bzJydHlwZSAoaW50ZXJuYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmludGVybmFsOwotewotICBpZiAoaW50ZXJuYWwtPnBjX3JlbGF0aXZlKSAKLSAgewotICAgIHN3aXRjaCAoaW50ZXJuYWwtPmJpdHNpemUpIAotICAgIHsKLSAgICAgY2FzZSAzMjogcmV0dXJuIFJfUENSTE9ORzsKLSAgICAgY2FzZSAxNjogcmV0dXJuIFJfUENSV09SRDsKLSAgICAgY2FzZSA4OiByZXR1cm4gUl9QQ1JCWVRFOwotICAgIH0KLSAgfQotICBlbHNlIAotICB7Ci0gICAgc3dpdGNoIChpbnRlcm5hbC0+Yml0c2l6ZSkgCi0gICAgIHsKLSAgICAgIGNhc2UgMzI6IHJldHVybiBSX1JFTExPTkc7Ci0gICAgICBjYXNlIDE2OiByZXR1cm4gUl9SRUxXT1JEOwotICAgICAgY2FzZSA4OiByZXR1cm4gUl9SRUxCWVRFOwotICAgICB9Ci0gIH0KLSAgcmV0dXJuIFJfUkVMTE9ORzsgICAgCi19Ci0KLSNpZmRlZiBTVEFUSUNfUkVMT0NTCi1zdGF0aWMKLSNlbmRpZgotcmVsb2NfaG93dG9fdHlwZSAqCi1tNjhrX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6CQkJcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoJCXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDA7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAxOwotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6CQlyZXR1cm4gbTY4a2NvZmZfaG93dG9fdGFibGUgKyAyOwotICAgIGNhc2UgQkZEX1JFTE9DXzhfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDM7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDQ7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CXJldHVybiBtNjhrY29mZl9ob3d0b190YWJsZSArIDU7Ci0gICAgICAvKiBGSVhNRTogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgY29kZSBmb3IgUl9SRUxMT05HX05FRy4gICovCi0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jZW5kaWYgLyogbm90IE9OTFlfREVDTEFSRV9SRUxPQ1MgKi8KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgXAotICBtNjhrX3J0eXBlMmhvd3RvKGludGVybmFsLCAocmVsb2NlbnRyeSktPnJfdHlwZSkKLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoZXh0ZXJuYWwsIGludGVybmFsKSBcCi0gIGV4dGVybmFsLnJfdHlwZSA9IG02OGtfaG93dG8ycnR5cGUgKGludGVybmFsKQotCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIG02OGtfcmVsb2NfdHlwZV9sb29rdXAKLQotI2lmbmRlZiBDT0ZGX0NPTU1PTl9BRERFTkQKLSNpZm5kZWYgY29mZl9ydHlwZV90b19ob3d0bwotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gbTY4a2NvZmZfcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW02OGtjb2ZmX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIFJUWVBFMkhPV1RPICgmcmVsZW50LCByZWwpOwotCi0gIGhvd3RvID0gcmVsZW50Lmhvd3RvOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQ09GRl9DT01NT05fQURERU5EKSAqLwotDAotI2lmZGVmIENPRkZfQ09NTU9OX0FEREVORAotCi0vKiBJZiBDT0ZGX0NPTU1PTl9BRERFTkQgaXMgZGVmaW5lZCwgdGhlbiB3aGVuIHVzaW5nIG02OGsgQ09GRiB0aGUKLSAgIHZhbHVlIHN0b3JlZCBpbiB0aGUgLnRleHQgc2VjdGlvbiBmb3IgYSByZWZlcmVuY2UgdG8gYSBjb21tb24KLSAgIHN5bWJvbCBpcyB0aGUgdmFsdWUgaXRzZWxmIHBsdXMgYW55IGRlc2lyZWQgb2Zmc2V0LiAgKHRha2VuIGZyb20KLSAgIHdvcmsgZG9uZSBieSBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgZm9yIEkzODYgQ09GRikuICAqLwotCi0vKiBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIG5lZWQgdG8gZG8gc29tZQotICAgYWRqdXN0bWVudHMgdG8gdGhlIG9iamVjdCBmaWxlIHRoYXQgYXJlIG5vdCBkb25lIGJ5IHRoZQotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGV2ZXJ5Ci0gICByZWxvYyB0eXBlIHRvIG1ha2UgYW55IHJlcXVpcmVkIGFkanVzdG1lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9zcGVjaWFsX2ZuIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBzeW12YWx1ZSBkaWZmOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogV2UgYXJlIHJlbG9jYXRpbmcgYSBjb21tb24gc3ltYm9sLiAgVGhlIGN1cnJlbnQgdmFsdWUgaW4gdGhlCi0JIG9iamVjdCBmaWxlIGlzIE9SSUcgKyBPRkZTRVQsIHdoZXJlIE9SSUcgaXMgdGhlIHZhbHVlIG9mIHRoZQotCSBjb21tb24gc3ltYm9sIGFzIHNlZW4gYnkgdGhlIG9iamVjdCBmaWxlIHdoZW4gaXQgd2FzIGNvbXBpbGVkCi0JICh0aGlzIG1heSBiZSB6ZXJvIGlmIHRoZSBzeW1ib2wgd2FzIHVuZGVmaW5lZCkgYW5kIE9GRlNFVCBpcwotCSB0aGUgb2Zmc2V0IGludG8gdGhlIGNvbW1vbiBzeW1ib2wgKG5vcm1hbGx5IHplcm8sIGJ1dCBtYXkgYmUKLQkgbm9uLXplcm8gd2hlbiByZWZlcnJpbmcgdG8gYSBmaWVsZCBpbiBhIGNvbW1vbiBzdHJ1Y3R1cmUpLgotCSBPUklHIGlzIHRoZSBuZWdhdGl2ZSBvZiByZWxvY19lbnRyeS0+YWRkZW5kLCB3aGljaCBpcyBzZXQgYnkKLQkgdGhlIENBTENfQURERU5EIG1hY3JvIGJlbG93LiAgV2Ugd2FudCB0byByZXBsYWNlIHRoZSB2YWx1ZSBpbgotCSB0aGUgb2JqZWN0IGZpbGUgd2l0aCBORVcgKyBPRkZTRVQsIHdoZXJlIE5FVyBpcyB0aGUgdmFsdWUgb2YKLQkgdGhlIGNvbW1vbiBzeW1ib2wgd2hpY2ggd2UgYXJlIGdvaW5nIHRvIHB1dCBpbiB0aGUgZmluYWwKLQkgb2JqZWN0IGZpbGUuICBORVcgaXMgc3ltYm9sLT52YWx1ZS4gICovCi0gICAgICBkaWZmID0gc3ltYm9sLT52YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRm9yIHNvbWUgcmVhc29uIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gYWx3YXlzIGVmZmVjdGl2ZWx5Ci0JIGlnbm9yZXMgdGhlIGFkZGVuZCBmb3IgYSBDT0ZGIHRhcmdldCB3aGVuIHByb2R1Y2luZwotCSByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhpcyBzZWVtcyB0byBiZSBhbHdheXMgd3JvbmcgZm9yIDM4NgotCSBDT0ZGLCBzbyB3ZSBoYW5kbGUgdGhlIGFkZGVuZCBoZXJlIGluc3RlYWQuICAqLwotICAgICAgZGlmZiA9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgfQotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArIGRpZmYpICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICBpZiAoZGlmZiAhPSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICAgICAgdW5zaWduZWQgY2hhciAqYWRkciA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotICAgICAgc3dpdGNoIChob3d0by0+c2l6ZSkKLQl7Ci0JY2FzZSAwOgotCSAgewotCSAgICBjaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIGFkZHIpOwotCSAgICBET0lUICh4KTsKLQkgICAgYmZkX3B1dF84IChhYmZkLCB4LCBhZGRyKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAxOgotCSAgewotCSAgICBzaG9ydCB4ID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcik7Ci0JICAgIERPSVQgKHgpOwotCSAgICBiZmRfcHV0XzE2IChhYmZkLCB4LCBhZGRyKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyOgotCSAgewotCSAgICBsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyKTsKLQkgICAgRE9JVCAoeCk7Ci0JICAgIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGFkZHIpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgbGV0IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZmluaXNoIGV2ZXJ5dGhpbmcgdXAuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKiBDb21wdXRlIHRoZSBhZGRlbmQgb2YgYSByZWxvYy4gIElmIHRoZSByZWxvYyBpcyB0byBhIGNvbW1vbiBzeW1ib2wsCi0gICB0aGUgb2JqZWN0IGZpbGUgY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBjb21tb24gc3ltYm9sLiAgQnkgdGhlCi0gICB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgbGlua2VyIG1heSBiZSB1c2luZyBhIGRpZmZlcmVudCBzeW1ib2wKLSAgIGZyb20gYSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gIFRoZXJlZm9yZSwgd2UKLSAgIGhhY2sgd2lsZGx5IHRvIGxvY2F0ZSB0aGUgb3JpZ2luYWwgc3ltYm9sIGZyb20gdGhpcyBmaWxlIHNvIHRoYXQgd2UKLSAgIGNhbiBtYWtlIHRoZSBjb3JyZWN0IGFkanVzdG1lbnQuICBUaGlzIG1hY3JvIHNldHMgY29mZnN5bSB0byB0aGUKLSAgIHN5bWJvbCBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCBhbmQgdXNlcyBpdCB0byBzZXQgdGhlIGFkZGVuZCB2YWx1ZQotICAgY29ycmVjdGx5LiAgSWYgdGhpcyBpcyBub3QgYSBjb21tb24gc3ltYm9sLCB0aGUgdXN1YWwgYWRkZW5kCi0gICBjYWxjdWxhdGlvbiBpcyBkb25lLCBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIHR3ZWFrIGlzIG5lZWRlZCBmb3IKLSAgIFBDIHJlbGF0aXZlIHJlbG9jcy4KLSAgIEZJWE1FOiBUaGlzIG1hY3JvIHJlZmVycyB0byBzeW1ib2xzIGFuZCBhc2VjdDsgdGhlc2UgYXJlIGZyb20gdGhlCi0gICBjYWxsaW5nIGZ1bmN0aW9uLCBub3QgdGhlIG1hY3JvIGFyZ3VtZW50cy4gICovCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKQkJXAotICB7CQkJCQkJCQlcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7CVwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKQkJCVwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpCQkJCVwKLQkgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOwkJXAotICAgIGVsc2UgaWYgKHB0cikJCQkJCQlcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsJCQlcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAkJCVwKLQkmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7CVwKLSAgICBlbHNlIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpID09IGFiZmQJCVwKLQkgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOwkJCQkJXAotICAgIGlmIChwdHIgJiYgKHJlbG9jLnJfdHlwZSA9PSBSX1BDUkJZVEUJCQlcCi0JCXx8IHJlbG9jLnJfdHlwZSA9PSBSX1BDUldPUkQJCQlcCi0JCXx8IHJlbG9jLnJfdHlwZSA9PSBSX1BDUkxPTkcpKQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kICs9IGFzZWN0LT52bWE7CQkJCVwKLSAgfQotCi0jaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KLQotLyogY29mZi1tNjhrLmMgdXNlcyB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgV2UgbmVlZCB0bwotICAgYWRqdXN0IGNvbW1vbiBzeW1ib2xzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tNjhrY29mZl9jb21tb25fYWRkZW5kX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gIFJUWVBFMkhPV1RPICgmcmVsZW50LCByZWwpOwotCi0gIGhvd3RvID0gcmVsZW50Lmhvd3RvOwotCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgKmFkZGVuZHAgKz0gc2VjLT52bWE7Ci0KLSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSA9PSAwICYmIHN5bS0+bl92YWx1ZSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgVGhlIHNlY3Rpb24gY29udGVudHMgaW5jbHVkZSB0aGUKLQkgc2l6ZSAoc3ltLT5uX3ZhbHVlKSBhcyBhbiBhZGRlbmQuICBUaGUgcmVsb2NhdGVfc2VjdGlvbgotCSBmdW5jdGlvbiB3aWxsIGJlIGFkZGluZyBpbiB0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFdlCi0JIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBjdXJyZW50IHNpemUgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSBjb3JyZWN0IHJlc3VsdC4gICovCi0gICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotICAgICAgKmFkZGVuZHAgLT0gc3ltLT5uX3ZhbHVlOwotICAgIH0KLQotICAvKiBJZiB0aGUgb3V0cHV0IHN5bWJvbCBpcyBjb21tb24gKGluIHdoaWNoIGNhc2UgdGhpcyBtdXN0IGJlIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmspLCB3ZSBuZWVkIHRvIGFkZCBpbiB0aGUgZmluYWwgc2l6ZSBvZiB0aGUKLSAgICAgY29tbW9uIHN5bWJvbC4gICovCi0gIGlmIChoICE9IE5VTEwgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgICphZGRlbmRwICs9IGgtPnJvb3QudS5jLnNpemU7Ci0KLSAgcmV0dXJuIGhvd3RvOwotfQotCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gbTY4a2NvZmZfY29tbW9uX2FkZGVuZF9ydHlwZV90b19ob3d0bwotCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotCi0jZW5kaWYgLyogQ09GRl9DT01NT05fQURERU5EICovCi0MCi0jZGVmaW5lIGNvZmZfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgbTY4a19jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI2lmbmRlZiBUQVJHRVRfU1lNCi0jZGVmaW5lIFRBUkdFVF9TWU0gbTY4a2NvZmZfdmVjCi0jZW5kaWYKLQotI2lmbmRlZiBUQVJHRVRfTkFNRQotI2RlZmluZSBUQVJHRVRfTkFNRSAiY29mZi1tNjhrIgotI2VuZGlmCi0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX1NZTSA9Ci17Ci0gIFRBUkdFVF9OQU1FLAotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0jaWZkZWYgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0gICdfJywKLSNlbHNlCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotI2VuZGlmCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1tODhrLmMgYi9iZmQvY29mZi1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYTBiMDUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbTg4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgODgwMDAgQ09GRiAiQmluYXJ5IENvbXBhdGFiaWxpdHkgU3RhbmRhcmQiIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgTTg4IDEJCS8qIEN1c3RvbWl6ZSB2YXJpb3VzIGluY2x1ZGUgZmlsZXMgKi8KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL204OGsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYm9vbGVhbiBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtODhrX3NwZWNpYWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBydHlwZTJob3d0byBQQVJBTVMgKChhcmVsZW50ICosIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1zdGF0aWMgdm9pZCByZWxvY19wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGFyZWxlbnQgKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGFzeW1ib2wgKiosIGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLSNkZWZpbmUgQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSICgzKQotCi0jZGVmaW5lIEdFVF9TQ05IRFJfTlJFTE9DIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU0NOSERSX05MTk5PIGJmZF9oX2dldF8zMgotCi0vKiBPbiBjb2ZmLW04OGssIGxvY2FsIGxhYmVscyBzdGFydCB3aXRoICdAJy4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBtODhrX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotc3RhdGljIGJvb2xlYW4KLW04OGtfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gbmFtZVswXSA9PSAnQCc7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1tODhrX3NwZWNpYWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0KLSAgc3dpdGNoIChob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0hWUlQxNjoKLSAgICBjYXNlIFJfTFZSVDE2OgotICAgICAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZQotCSAgICAgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgcmF0aGVyIHRoYW4gdGhlIHJhdyBkYXRhLgotCSAgICAgTW9kaWZ5IHRoZSByZWxvYyBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0KLQkgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotCSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0JICBiZmRfdm1hIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLQkgIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0KLQkgIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLQkgICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotCSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotCSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlCi0JICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0JICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0JICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLQkgIGlmIChvdXRwdXRfYmZkKQotCSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0JICBlbHNlCi0JICAgIG91dHB1dF9iYXNlID0gcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLQkgIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotCSAgcmVsb2NhdGlvbiArPSAoKHJlbG9jX2VudHJ5LT5hZGRlbmQgPDwgaG93dG8tPmJpdHNpemUpICsgeCk7Ci0KLQkgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotCi0JICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLQkgIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLQkgIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0JICBpZiAocmVsb2NhdGlvbikKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCByZWxvY2F0aW9uLCAodW5zaWduZWQgY2hhciAqKSBkYXRhICsgYWRkcik7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCByZXR1cm4gYW4gZXJyb3IgaWYKLQkgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZC4gICovCi0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUKLQkgICAgIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4KLQkgICAgIE1vZGlmeSB0aGUgcmVsb2MgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyAoUl9QQ1IxNkwsCQkJLyogdHlwZSAqLwotCSAwMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSMTZMIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QQ1IyNkwsCQkJLyogdHlwZSAqLwotCSAwMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSMjZMIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwM2ZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAzZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9WUlQxNiwJCQkvKiB0eXBlICovCi0JIDAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJWUlQxNiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfSFZSVDE2LAkJCS8qIHR5cGUgKi8KLQkgMTYsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbTg4a19zcGVjaWFsX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSFZSVDE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9MVlJUMTYsCQkJLyogdHlwZSAqLwotCSAwMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtODhrX3NwZWNpYWxfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMVlJUMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1ZSVDMyLAkJCS8qIHR5cGUgKi8KLQkgMDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG04OGtfc3BlY2lhbF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlZSVDMyIiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLS8qIENvZGUgdG8gdHVybiBhbiBleHRlcm5hbCByX3R5cGUgaW50byBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlCi0gICBhYm92ZSBob3d0byB0YWJsZS4gICovCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICBpZiAoZHN0LT5yX3R5cGUgPj0gUl9QQ1IxNkwgJiYgZHN0LT5yX3R5cGUgPD0gUl9WUlQzMikKLSAgICB7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gaG93dG9fdGFibGUgKyBkc3QtPnJfdHlwZSAtIFJfUENSMTZMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKDApOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2Mgb2Zmc2V0ICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMTYKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8xNgotCi0KLSNkZWZpbmUgUkVMT0NfUFJPQ0VTU0lORyhyZWxlbnQscmVsb2Msc3ltYm9scyxhYmZkLHNlY3Rpb24pCVwKLSAgcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAoKChpbnQpIHJlbG9jLT5yX3N5bW5keCkgPiAwKQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgb2JqX2NvbnZlcnQgKGFiZmQpW3JlbG9jLT5yX3N5bW5keF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLX0KLQotI2RlZmluZSBCQURNQUcoeCkgTUM4OEJBRE1BRyh4KQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLSN1bmRlZiBjb2ZmX3dyaXRlX2FybWFwCi0KLWNvbnN0IGJmZF90YXJnZXQgbTg4a2Jjc192ZWMgPQotewotICAiY29mZi1tODhrYmNzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtbWNvcmUuYyBiL2JmZC9jb2ZmLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZWZlYmYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDczMyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xsYSBNQ29yZSBDT0ZGL1BFCi0gICBDb3B5cmlnaHQgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL21jb3JlLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvcGUuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLSNpZmRlZiBCQURNQUcKLSN1bmRlZiBCQURNQUcKLSNlbmRpZgotI2RlZmluZSBCQURNQUcoeCkgTUNPUkVCQURNQUcoeCkKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShBKSAoc2l6ZW9mIChBKSAvIHNpemVvZiAoQSlbMF0pCi0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIG1vcmUgdGhhbiBvbmNlLCBidXQgd2Ugb25seSBjb21waWxlIHRoZQotICAgZmluYWxfbGluayByb3V0aW5lIG9uY2UuICAqLwotZXh0ZXJuIGJvb2xlYW4gbWNvcmVfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgICAgICAgIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MgCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgICAgY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgbWNvcmVfY29mZl9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBjb2ZmX21jb3JlX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICogICAgICAgICAgIHBlX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLQotDAotLyogVGhlIE5UIGxvYWRlciBwb2ludHMgdGhlIHRvYyByZWdpc3RlciB0byAmdG9jICsgMzI3NjgsIGluIG9yZGVyIHRvCi0gICB1c2UgdGhlIGNvbXBsZXRlIHJhbmdlIG9mIGEgMTYtYml0IGRpc3BsYWNlbWVudC4gV2UgaGF2ZSB0byBhZGp1c3QKLSAgIGZvciB0aGlzIHdoZW4gd2UgZml4IHVwIGxvYWRzIGRpc3BsYWNlZCBvZmYgdGhlIHRvYyByZWcuICAqLwotI2RlZmluZSBUT0NfTE9BRF9BREpVU1RNRU5UICgtMzI3NjgpCi0jZGVmaW5lIFRPQ19TRUNUSU9OX05BTUUgIi5wcml2YXRlLnRvYyIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLS8qIEluIGNhc2Ugd2UncmUgb24gYSAzMi1iaXQgbWFjaGluZSwgY29uc3RydWN0IGEgNjQtYml0ICItMSIgdmFsdWUKLSAgIGZyb20gc21hbGxlciB2YWx1ZXMuICBTdGFydCB3aXRoIHplcm8sIHdpZGVuLCAqdGhlbiogZGVjcmVtZW50LiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FCSgoKGJmZF92bWEpMCkgLSAxKQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfQUJTT0xVVEUsLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogZG9udCBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUJTT0xVVEUiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwJIAkgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDAsICAgICAgICAJCSAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9BRERSMzIsLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjMyIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2NvZmZfdW5zdXBwb3J0ZWRfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTThCWTQiLCAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogYnNyL2J0L2JmL2JyIGluc3RydWN0aW9uczsgMTEgYml0cyArIDEgemVybyBiaXQgCi0gICAgIFNwYW4gMmsgaW5zdHJ1Y3Rpb25zID09IDRrIGJ5dGVzLgotICAgICBPbmx5IHVzZWZ1bCBwaWVjZXMgYXQgdGhlIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSB0aGUgb3Bjb2RlICg1IGJpdHMpICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIsLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTTExQlkyIiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXRzICsgMSB6ZXJvIGJpdDsgJ2xvb3B0JyBpbnN0cnVjdGlvbiBvbmx5OyB1bnN1cHBvcnRlZC4gKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSU1NNEJZMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IHBjLXJlbGF0aXZlLiBFdmVudHVhbGx5IHRoaXMgd2lsbCBoZWxwIHN1cHBvcnQgUElDIGNvZGUuICovCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfMzIsLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUENSRUxfMzIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBQQ1JFTF9JTU0xMUJZMiwgdGhpcyByZWxvY2F0aW9uIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIGEKLSAgICAgJ2pzcmknIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlcmUgaXMgYSBzZXBhcmF0ZSByZWxvY2F0aW9uCi0gICAgIGVudHJ5IGZvciB0aGUgbGl0ZXJhbCBwb29sIGVudHJ5IHRoYXQgaXQgcmVmZXJlbmNlcywgYnV0IHdlIAotICAgICBtaWdodCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUganNyaSB0byBhIGJzciBpZiB0aGUgdGFyZ2V0IHR1cm5zIG91dAotICAgICB0byBiZSBjbG9zZSBlbm91Z2ggW2V2ZW4gdGhvdWdoIHdlIHdvbid0IHJlY2xhaW0gdGhlIGxpdGVyYWwgcG9vbAotICAgICBlbnRyeSwgd2UnbGwgZ2V0IHNvbWUgcnVudGltZSBlZmZpY2llbmN5IGJhY2tdLiBOb3RlIHRoYXQgdGhpcwotICAgICBpcyBhIHJlbG9jYXRpb24gdGhhdCB3ZSBhcmUgYWxsb3dlZCB0byBzYWZlbHkgaWdub3JlLiAgKi8gCi0gIEhPV1RPIChJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDExLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCSAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJKU1JfSU1NMTFCWTIiLCAgICAgICAgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgSE9XVE8gKElNQUdFX1JFTF9NQ09SRV9SVkEsICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTUNPUkVfUlZBIiwgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIEV4dGVuZCB0aGUgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlIHdpdGggYSBmZXcgTSpDb3JlIHNwZWNpZmljIGZpZWxkcy4KLSAgIFRoaXMgYWxsb3dzIHVzIHRvIHN0b3JlIGdsb2JhbCBkYXRhIGhlcmUgd2l0aG91dCBhY3R1YWxseSBjcmVhdGluZyBhbnkKLSAgIGdsb2JhbCB2YXJpYWJsZXMsIHdoaWNoIGlzIGEgbm8tbm8gaW4gdGhlIEJGRCB3b3JsZC4gICovCi10eXBlZGVmIHN0cnVjdCBjb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgb3JpZ2luYWwgY29mZl9saW5rX2hhc2hfdGFibGUgc3RydWN0dXJlLiAgTVVTVCBiZSBmaXJzdCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZQlyb290OwotCi0gIGJmZCAqICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9vZl90b2Nfb3duZXI7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90b2Nfc2l6ZTsKLSAgbG9uZyBpbnQgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3RhYmxlX3NpemU7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3RodW5rX2FkZHJlc3M7Ci0gIGxvbmcgaW50ICAgICAgICAgICAgICAgICAgICAgIHRodW5rX3NpemU7Ci19Ci1tY29yZV9oYXNoX3RhYmxlOwotCi0vKiBHZXQgdGhlIE1Db3JlIGNvZmYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBjb2ZmX21jb3JlX2hhc2hfdGFibGUoaW5mbykgXAotICAoKG1jb3JlX2hhc2hfdGFibGUgKikgKChpbmZvKS0+aGFzaCkpCi0KLS8qIENyZWF0ZSBhbiBNQ29yZSBjb2ZmIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1jb2ZmX21jb3JlX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG1jb3JlX2hhc2hfdGFibGUgKiByZXQ7Ci0KLSAgcmV0ID0gKChtY29yZV9oYXNoX3RhYmxlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqIHJldCkpKTsKLSAgaWYgKHJldCA9PSAobWNvcmVfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICAgICAgKCYgcmV0LT5yb290LCBhYmZkLCBfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmJmZF9vZl90b2Nfb3duZXIgPSBOVUxMOwotICByZXQtPmdsb2JhbF90b2Nfc2l6ZSAgPSAwOwotICByZXQtPmltcG9ydF90YWJsZV9zaXplID0gMDsKLSAgcmV0LT5maXJzdF90aHVua19hZGRyZXNzID0gMDsKLSAgcmV0LT50aHVua19zaXplID0gMDsKLQotICByZXR1cm4gJiByZXQtPnJvb3Qucm9vdDsKLX0KLQwKLS8qQVJHU1VTRUQqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWNvcmVfY29mZl91bnN1cHBvcnRlZF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqIHN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlOwotewotICBCRkRfQVNTRVJUIChyZWxvY19lbnRyeS0+aG93dG8gIT0gKHJlbG9jX2hvd3RvX3R5cGUgKikwKTsKLSAgCi0gIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJICAgICAgcmVsb2NfZW50cnktPmhvd3RvLT5uYW1lLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPnR5cGUpOwotICAKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLQwKLS8qIEEgY2hlZXN5IGxpdHRsZSBtYWNybyB0byBtYWtlIHRoZSBjb2RlIGEgbGl0dGxlIG1vcmUgcmVhZGFibGUuICovCi0jZGVmaW5lIEhPVzJNQVAoYmZkX3J0eXBlLCBtY29yZV9ydHlwZSkgIFwKLSBjYXNlIGJmZF9ydHlwZTogcmV0dXJuICYgbWNvcmVfY29mZl9ob3d0b190YWJsZSBbbWNvcmVfcnR5cGVdCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLW1jb3JlX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgeyAKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgICAgIElNQUdFX1JFTF9NQ09SRV9BRERSMzIpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQsICAgICAgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQpOwotICAgICAgSE9XMk1BUCAoQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyLCAgICAgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTTExQlkyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyLCAgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9JTU00QlkyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgICAgIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMik7Ci0gICAgICBIT1cyTUFQIChCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyLCBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyKTsKLSAgICAgIEhPVzJNQVAgKEJGRF9SRUxPQ19SVkEsICAgICAgICAgICAgICAgICAgICAgIElNQUdFX1JFTF9NQ09SRV9SVkEpOwotICAgZGVmYXVsdDogCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLSN1bmRlZiBIT1cyTUFQCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLSAgKGNhY2hlX3B0ciktPmhvd3RvID0gbWNvcmVfY29mZl9ob3d0b190YWJsZSArIChkc3QpLT5yX3R5cGU7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfbWNvcmVfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiBzeW07Ci0gICAgIGJmZF92bWEgKiBhZGRlbmRwOwotewotICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci0KLQotICBpZiAocmVsLT5yX3R5cGUgPj0gTlVNX0VMRU0gKG1jb3JlX2NvZmZfaG93dG9fdGFibGUpKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgaG93dG8gPSBtY29yZV9jb2ZmX2hvd3RvX3RhYmxlICsgcmVsLT5yX3R5cGU7Ci0KLSAgaWYgKHJlbC0+cl90eXBlID09IElNQUdFX1JFTF9NQ09SRV9SVkEpCi0gICAgKiBhZGRlbmRwIC09IHBlX2RhdGEgKHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLSAgCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgKiBhZGRlbmRwID0gc2VjLT52bWEgLSAyOyAvKiBYWFggZ3Vlc3MgLSBpcyB0aGlzIHJpZ2h0ID8gKi8KLSAgICAgIAotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCB0aGVuIHRoZSBnZW5lcmljIGNvZGUgaXMgZ29pbmcgdG8KLSAgICAgICAgIGFkZCBiYWNrIHRoZSBzeW1ib2wgdmFsdWUgaW4gb3JkZXIgdG8gY2FuY2VsIG91dCBhbgotICAgICAgICAgYWRqdXN0bWVudCBpdCBtYWRlIHRvIHRoZSBhZGRlbmQuICBIb3dldmVyLCB3ZSBzZXQgdGhlIGFkZGVuZAotICAgICAgICAgdG8gMCBhdCB0aGUgc3RhcnQgb2YgdGhpcyBmdW5jdGlvbi4gIFdlIG5lZWQgdG8gYWRqdXN0IGhlcmUsCi0gICAgICAgICB0byBhdm9pZCB0aGUgYWRqdXN0bWVudCB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgbWFrZS4gIEZJWE1FOgotICAgICAgICAgVGhpcyBpcyBnZXR0aW5nIGEgYml0IGhhY2tpc2guICAqLwotICAgICAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCSogYWRkZW5kcCAtPSBzeW0tPm5fdmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgKiBhZGRlbmRwID0gMDsKLSAgCi0gIHJldHVybiBob3d0bzsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhpcyByZWxvY2F0aW9uIHNob3VsZCBhcHBlYXIgaW4gdGhlIG91dHB1dCAucmVsb2Mgc2VjdGlvbi4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVmZXJlbmNlZCBpbiBwZV9ta29iamVjdCBpbiBwZWljb2RlLmguICAqLwotc3RhdGljIGJvb2xlYW4KLWluX3JlbG9jX3AgKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKiBhYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICogaG93dG87Ci17Ci0gIHJldHVybiAhIGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfTUNPUkVfUlZBOwotfSAgICAgCi0KLQwKLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWNvcmVfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYmZkICogaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqIHN5bXM7Ci0gICAgIGFzZWN0aW9uICoqIHNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiByZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqIHJlbGVuZDsKLSAgYm9vbGVhbiBoaWhhbGY7Ci0gIGJmZF92bWEgaGloYWxmX3ZhbDsKLSAgCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvdXRwdXRfYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuLlxuIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICAKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgIHRvY19zZWN0aW9uID0gTlVMTDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bW5keDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiAgICAgICBzeW07Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgICAgdmFsOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgICByc3RhdDsKLSAgICAgIGJmZF9ieXRlICogICAgICAgICAgICAgICAgICAgICBsb2M7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgICAgcl90eXBlID0gcmVsLT5yX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICogICAgICAgICAgICAgaG93dG8gPSBOVUxMOwotICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICogIGg7Ci0gICAgICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICAgbXlfbmFtZTsKLSAgCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gb2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdOwotCSAgc3ltID0gc3ltcyArIHN5bW5keDsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgaG93dG8gYW5kIGluaXRpYWxpc2UgdGhlIGFkZGVuZC4gICovCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmIGFkZGVuZCk7Ci0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0gICAgICAKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgbXlfbmFtZSA9ICIqQUJTKiI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgCi0JICAgICAgdmFsID0gKHN5bS0+bl92YWx1ZSAKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQkJbXlfbmFtZSA9ICIqdW5rbm93bioiOwotCSAgICAgIGVsc2UgaWYgKCAgIHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICAgJiYgc3ltLT5fbi5fbl9uLl9uX29mZnNldCAhPSAwKQotCQlteV9uYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgICAgZWxzZSAKLQkJewotCQkgIHN0YXRpYyBjaGFyIGJ1ZiBbU1lNTk1MRU4gKyAxXTsKLQkJICAKLQkJICBzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQkgIGJ1ZltTWU1OTUxFTl0gPSAnXDAnOwotCQkgIG15X25hbWUgPSBidWY7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoICAgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICAKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgCi0JICBteV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQl9CQotCi0gICAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgICAgLyogRWFjaCBjYXNlIG11c3QgZG8gaXRzIG93biByZWxvY2F0aW9uLCBzZXR0aW5nIHJzdGF0IGFwcHJvcHJpYXRlbHkuICAqLwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8oIiVzOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIHR5cGUgMHglMDJ4IiksCi0JCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByX3R5cGUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JICAKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9BQlNPTFVURToKLQkgIGZwcmludGYgKHN0ZGVyciwgCi0JCSAgIF8oIldhcm5pbmc6IHVuc3VwcG9ydGVkIHJlbG9jICVzIDxmaWxlICVzLCBzZWN0aW9uICVzPlxuIiksIAotCQkgICBob3d0by0+bmFtZSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjdGlvbi0+bmFtZSk7Ci0JICAKLQkgIGZwcmludGYgKHN0ZGVyciwic3ltICVsZCAoJXMpLCByX3ZhZGRyICVsZCAoJWx4KVxuIiwgCi0JCSAgIHJlbC0+cl9zeW1uZHgsIG15X25hbWUsIChsb25nKSByZWwtPnJfdmFkZHIsCi0JCSAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIpOyAgCi0JICBicmVhazsKLQkgIAotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQ6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMjoKLQljYXNlIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTI6Ci0JY2FzZSBJTUFHRV9SRUxfTUNPUkVfQUREUjMyOgotCWNhc2UgSU1BR0VfUkVMX01DT1JFX1JWQToKLQkgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwgdmFsLCBsb2MpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICAKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGluZm8sIG15X25hbWUsIGhvd3RvLT5uYW1lLCAKLQkJICAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0gICAgIAotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBUYWlsb3IgY29mZmNvZGUuaCAtLSBtYWNybyBoZWF2ZW4uICovCi0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLCB3aXRoIG91ciBvd24gc3BlY2lhbCB0b3VjaC4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgICBtY29yZV9jb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiAgICAgICAgY29mZl9tY29yZV9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfcnR5cGVfdG9faG93dG8gICAgICAgICAgY29mZl9tY29yZV9ydHlwZV90b19ob3d0bwotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhpbnRlcm5hbCwgaG93dG8pIHtpbnRlcm5hbC5yX3R5cGUgPSBob3d0by0+dHlwZTt9Ci0KLSNkZWZpbmUgQ09GRl9QQUdFX1NJWkUgICAgICAgICAgICAgICAweDEwMDAKLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0MCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1wZV9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgLyogV2UgbmVlZCB0byBoYWNrIGJhZGx5IHRvIGhhbmRsZSBhIFBFIGltYWdlIGNvcnJlY3RseS4gIEluIFBFCi0gICAgIGltYWdlcyBjcmVhdGVkIGJ5IHRoZSBHTlUgbGlua2VyLCB0aGUgb2Zmc2V0IHRvIHRoZSBDT0ZGIGhlYWRlcgotICAgICBpcyBhbHdheXMgdGhlIHNpemUuICBIb3dldmVyLCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiBpbWFnZXMKLSAgICAgZ2VuZXJhdGVkIGJ5IG90aGVyIFBFIGxpbmtlcnMuICBUaGUgUEUgZm9ybWF0IHN0b3JlcyBhIGZvdXIgYnl0ZQotICAgICBvZmZzZXQgdG8gdGhlIFBFIHNpZ25hdHVyZSBqdXN0IGJlZm9yZSB0aGUgQ09GRiBoZWFkZXIgYXQKLSAgICAgbG9jYXRpb24gMHgzYyBvZiB0aGUgZmlsZS4gIFdlIHBpY2sgdXAgdGhhdCBvZmZzZXQsIHZlcmlmeSB0aGF0Ci0gICAgIHRoZSBQRSBzaWduYXR1cmUgaXMgdGhlcmUsIGFuZCB0aGVuIHNldCBvdXJzZWx2ZXMgdXAgdG8gcmVhZCBpbgotICAgICB0aGUgQ09GRiBoZWFkZXIuICAqLwotICB7Ci0gICAgYmZkX2J5dGUgZXh0X29mZnNldFs0XTsKLSAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgYmZkX2J5dGUgZXh0X3NpZ25hdHVyZVs0XTsKLSAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZTsKLQotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgMHgzYywgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoZXh0X29mZnNldCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICAgIHsKLQlpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAKLSAgICBvZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dF9vZmZzZXQpOwotICAgIAotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCXx8IGJmZF9yZWFkIChleHRfc2lnbmF0dXJlLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIAotICAgIHNpZ25hdHVyZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgZXh0X3NpZ25hdHVyZSk7Ci0KLSAgICBpZiAoc2lnbmF0dXJlICE9IDB4NDU1MCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgIC8qIEhlcmUgaXMgdGhlIGhhY2suICBjb2ZmX29iamVjdF9wIHdhbnRzIHRvIHJlYWQgZmlsaHN6IGJ5dGVzIHRvCi0gICAgICAgcGljayB1cCB0aGUgQ09GRiBoZWFkZXIuICBXZSBhZGp1c3Qgc28gdGhhdCB0aGF0IHdpbGwgd29yay4gIDIwCi0gICAgICAgaXMgdGhlIHNpemUgb2YgdGhlIG1pcHMgQ09GRiBmaWxlaGRyLiAgKi8KLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChiZmRfdGVsbCAoYWJmZCkgLSBiZmRfY29mZl9maWxoc3ogKGFiZmQpICsgMjApLAotCQkgIFNFRUtfU0VUKSAhPSAwKQotICAgICAgewotCWlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQotCXJldHVybiBOVUxMOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gY29mZl9vYmplY3RfcCAoYWJmZCk7Ci19Ci0MCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IGxlYWQgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotY29uc3QgYmZkX3RhcmdldAotVEFSR0VUX0JJR19TWU0gPQotewotICBUQVJHRVRfQklHX05BTUUsCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAkKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgLyogc2VjdGlvbiBmbGFncyAqLwotICAgfCBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUyksCi0KLSAgMCwJCQkJLyogbGVhZGluZyBjaGFyICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHBlX29iamVjdF9wLCAJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIAkvKiBfYmZkX2R1bW15X3RhcmdldCAqLwotICAgIHBlX29iamVjdF9wCi0gIH0sCi0gIHsgYmZkX2ZhbHNlLAotICAgIGNvZmZfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsgYmZkX2ZhbHNlLAotICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0Ci1UQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIFRBUkdFVF9MSVRUTEVfTkFNRSwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAotICAKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICAKLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgcGVfb2JqZWN0X3AsIAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwKLSAgICBwZV9vYmplY3RfcAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIGNvZmZfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLW1pcHMuYyBiL2JmZC9jb2ZmLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUxZWI4Ni4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzI2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUlQUyBFeHRlbmRlZC1Db2ZmIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCi0gICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImNvZmYvbWlwcy5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJsaWJlY29mZi5oIgotDAotLyogUHJvdG90eXBlcyBmb3Igc3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuIG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwgUFRSIGZpbGVoZHIpKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLAotCQkJCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIHZvaWQgbWlwc19lY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLAotCQkJCQkgICAgICAgUFRSKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2FkanVzdF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJICBhcmVsZW50ICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfYWRqdXN0X3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgYXJlbGVudCAqLAotCQkJCQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJCSBhcmVsZW50ICpyZWxvYywKLQkJCQkJCQkgYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJCSBQVFIgZGF0YSwKLQkJCQkJCQkgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJIGJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCQkgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVmaGlfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVmbG9fcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZ3ByZWxfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVsaGlfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfcmVsbG9fcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfc3dpdGNoX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCQlhcmVsZW50ICpyZWxvYywKLQkJCQkJCQlhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJUFRSIGRhdGEsCi0JCQkJCQkJYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkJYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCWNoYXIgKiplcnJvcikpOwotc3RhdGljIHZvaWQgbWlwc19yZWxvY2F0ZV9oaSBQQVJBTVMgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmhpLAotCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVmbG8sCi0JCQkJICAgICAgYmZkICppbnB1dF9iZmQsCi0JCQkJICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCSAgICAgIHNpemVfdCBhZGp1c3QsCi0JCQkJICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uLAotCQkJCSAgICAgIGJvb2xlYW4gcGNyZWwpKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICAgYmZkICosIGFzZWN0aW9uICosCi0JCQkJCSAgICAgIGJmZF9ieXRlICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19yZWFkX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19yZWxheF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfcmVsYXhfcGNyZWwxNiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkJICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgICBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotCi0MCi0vKiBFQ09GRiBoYXMgQ09GRiBzZWN0aW9ucywgYnV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluCi0gICBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IGZvcm1hdC4gIEVDT0ZGIHRhcmdldHMgdXNlIHNvbWUgb2YgdGhlCi0gICBzd2FwcGluZyByb3V0aW5lcyBmcm9tIGNvZmZzd2FwLmgsIGFuZCBzb21lIG9mIHRoZSBnZW5lcmljIENPRkYKLSAgIHJvdXRpbmVzIGluIGNvZmZnZW4uYywgYnV0LCB1bmxpa2UgdGhlIHJlYWwgQ09GRiB0YXJnZXRzLCBkbyBub3QKLSAgIHVzZSBjb2ZmY29kZS5oIGl0c2VsZi4KLQotICAgR2V0IHRoZSBnZW5lcmljIENPRkYgc3dhcHBpbmcgcm91dGluZXMsIGV4Y2VwdCBmb3IgdGhlIHJlbG9jLAotICAgc3ltYm9sLCBhbmQgbGluZW5vIG9uZXMuICBHaXZlIHRoZW0gRUNPRkYgbmFtZXMuICAqLwotI2RlZmluZSBNSVBTRUNPRkYKLSNkZWZpbmUgTk9fQ09GRl9SRUxPQ1MKLSNkZWZpbmUgTk9fQ09GRl9TWU1CT0xTCi0jZGVmaW5lIE5PX0NPRkZfTElORU5PUwotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfZmlsZWhkcl9pbgotI2RlZmluZSBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgbWlwc19lY29mZl9zd2FwX2ZpbGVoZHJfb3V0Ci0jZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX2luIG1pcHNfZWNvZmZfc3dhcF9hb3V0aGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9hb3V0aGRyX291dCBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9vdXQKLSNkZWZpbmUgY29mZl9zd2FwX3Njbmhkcl9pbiBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX2luCi0jZGVmaW5lIGNvZmZfc3dhcF9zY25oZHJfb3V0IG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0Ci0jaW5jbHVkZSAiY29mZnN3YXAuaCIKLQotLyogR2V0IHRoZSBFQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gICovCi0jZGVmaW5lIEVDT0ZGXzMyCi0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0MCi0vKiBIb3cgdG8gcHJvY2VzcyB0aGUgdmFyaW91cyByZWxvY3MgdHlwZXMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBSZWxvYyB0eXBlIDAgaXMgaWdub3JlZC4gIFRoZSByZWxvYyByZWFkaW5nIGNvZGUgZW5zdXJlcyB0aGF0Ci0gICAgIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlIC5hYnMgc2VjdGlvbiwgd2hpY2ggd2lsbCBjYXVzZQotICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHRvIGRvIG5vdGhpbmcuICAqLwotICBIT1dUTyAoTUlQU19SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCByZWZlcmVuY2UgdG8gYSBzeW1ib2wsIG5vcm1hbGx5IGZyb20gYSBkYXRhIHNlY3Rpb24uICAqLwotICBIT1dUTyAoTUlQU19SX1JFRkhBTEYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGSEFMRiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbCwgbm9ybWFsbHkgZnJvbSBhIGRhdGEgc2VjdGlvbi4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGV09SRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZXT1JEIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDI2IGJpdCBhYnNvbHV0ZSBqdW1wIGFkZHJlc3MuICAqLwotICBIT1dUTyAoTUlQU19SX0pNUEFERFIsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93Ci0JCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCi0JCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCi0JIG1pcHNfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSk1QQUREUiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIDE2IGJpdHMgb2YgYSBzeW1ib2wgdmFsdWUuICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbgotICAgICBtaXBzX3JlZmhpX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUZISSwJCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlZmhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZISSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBsb3cgMTYgYml0cyBvZiBhIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVGTE8sCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfcmVmbG9fcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRkxPIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWZlcmVuY2UgdG8gYW4gb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgSGFuZGxlZCBieSB0aGUKLSAgICAgZnVuY3Rpb24gbWlwc19ncHJlbF9yZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfR1BSRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19ncHJlbF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUwiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlZmVyZW5jZSB0byBhIGxpdGVyYWwgdXNpbmcgYW4gb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLgotICAgICBIYW5kbGVkIGJ5IHRoZSBmdW5jdGlvbiBtaXBzX2dwcmVsX3JlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19ncHJlbF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElURVJBTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgOCB9LAotICB7IDkgfSwKLSAgeyAxMCB9LAotICB7IDExIH0sCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgYSAxNiBiaXQgUEMKLSAgICAgcmVsYXRpdmUgcmVsb2MgcmlnaHRzaGlmdGVkIHR3aWNlIGFzIHVzZWQgaW4gdGhlIE1JUFMgYnJhbmNoCi0gICAgIGluc3RydWN0aW9ucy4gICovCi0gIEhPV1RPIChNSVBTX1JfUENSRUwxNiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgbWlwc19nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQQ1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhpcyByZWxvYyBpcyBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcgcG9zaXRpb24KLSAgICAgaW5kZXBlbmRlbnQgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gIEl0IHJlcHJlc2VudHMgdGhlIGhpZ2ggMTYKLSAgICAgYml0cyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgVGhlIG5leHQgcmVsb2MgbXVzdCBiZQotICAgICBNSVBTX1JfUkVMTE8sIGFuZCB0aGUgYWRkZW5kIGlzIGZvcm1lZCBmcm9tIHRoZSBhZGRlbmRzIG9mIHRoZQotICAgICB0d28gaW5zdHJ1Y3Rpb25zLCBqdXN0IGFzIGluIE1JUFNfUl9SRUZISSBhbmQgTUlQU19SX1JFRkxPLiAgVGhlCi0gICAgIGZpbmFsIHZhbHVlIGlzIGFjdHVhbGx5IFBDIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCBub3QgdGhlIE1JUFNfUl9SRUxISSByZWxvYy4gICovCi0gIEhPV1RPIChNSVBTX1JfUkVMSEksCQkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlbGhpX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxISSIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2MgaXMgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uCi0gICAgIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBJdCByZXByZXNlbnRzIHRoZSBsb3cgMTYKLSAgICAgYml0cyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKE1JUFNfUl9SRUxMTywJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzX3JlbGxvX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxMTyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgMTUgfSwKLSAgeyAxNiB9LAotICB7IDE3IH0sCi0gIHsgMTggfSwKLSAgeyAxOSB9LAotICB7IDIwIH0sCi0gIHsgMjEgfSwKLQotICAvKiBUaGlzIHJlbG9jIGlzIGEgQ3lnbnVzIGV4dGVuc2lvbiB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbgotICAgICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgcmVwcmVzZW50cyBhbiBlbnRyeSBpbgotICAgICBhIHN3aXRjaCB0YWJsZSwgd2hpY2ggaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scyBpbgotICAgICB0aGUgLnRleHQgc2VjdGlvbi4gIFRoZSBzeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBzdWJ0cmFoZW5kLiAgU2VlIGluY2x1ZGUvY29mZi9taXBzLmggZm9yCi0gICAgIG1vcmUgZGV0YWlscy4gICovCi0gIEhPV1RPIChNSVBTX1JfU1dJVENILAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1pcHNfc3dpdGNoX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTV0lUQ0giLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpCQkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0jZGVmaW5lIE1JUFNfSE9XVE9fQ09VTlQgXAotICAoc2l6ZW9mIG1pcHNfaG93dG9fdGFibGUgLyBzaXplb2YgbWlwc19ob3d0b190YWJsZVswXSkKLQotLyogV2hlbiB0aGUgbGlua2VyIGlzIGRvaW5nIHJlbGF4aW5nLCBpdCBtYXkgY2hhbmdlIGEgZXh0ZXJuYWwgUENSRUwxNgotICAgcmVsb2MuICBUaGlzIHR5cGljYWxseSByZXByZXNlbnRzIGFuIGluc3RydWN0aW9uIGxpa2UKLSAgICAgICBiYWwgZm9vCi0gICBXZSBjaGFuZ2UgaXQgdG8KLSAgICAgICAuc2V0ICBub3Jlb3JkZXIKLSAgICAgICBiYWwgICAkTDEKLSAgICAgICBsdWkgICAkYXQsJWhpKGZvbyAtICRMMSkKLSAgICAgJEwxOgotICAgICAgIGFkZGl1ICRhdCwlbG8oZm9vIC0gJEwxKQotICAgICAgIGFkZHUgICRhdCwkYXQsJDMxCi0gICAgICAgamFsciAgJGF0Ci0gICBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhpcyBjaGFuZ2VzIHRoZQotICAgaW5zdHJ1Y3Rpb24gYnkuICAqLwotCi0jZGVmaW5lIFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQgKDQgKiA0KQotDAotLyogU2VlIHdoZXRoZXIgdGhlIG1hZ2ljIG51bWJlciBtYXRjaGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCBmaWxlaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmaWxlaGRyOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqaW50ZXJuYWxfZiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBmaWxlaGRyOwotCi0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0gICAgY2FzZSBNSVBTX01BR0lDXzE6Ci0gICAgICAvKiBJIGRvbid0IGtub3cgd2hhdCBlbmRpYW5uZXNzIHRoaXMgaW1wbGllcy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19CSUc6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzI6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzM6Ci0gICAgICByZXR1cm4gYmZkX2JpZ19lbmRpYW4gKGFiZmQpOwotCi0gICAgY2FzZSBNSVBTX01BR0lDX0xJVFRMRToKLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMjoKLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMzoKLSAgICAgIHJldHVybiBiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCk7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQwKLS8qIFJlbG9jIGhhbmRsaW5nLiAgTUlQUyBFQ09GRiByZWxvY3MgYXJlIHBhY2tlZCBpbnRvIDggYnl0ZXMgaW4KLSAgIGV4dGVybmFsIGZvcm0uICBUaGV5IHVzZSBhIGJpdCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3ltYm9sCi0gICBpcyBleHRlcm5hbC4gICovCi0KLS8qIFN3YXAgYSByZWxvYyBpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIGV4dF9wdHIsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm47Ci17Ci0gIGNvbnN0IFJFTE9DICpleHQgPSAoUkVMT0MgKikgZXh0X3B0cjsKLQotICBpbnRlcm4tPnJfdmFkZHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnJfdmFkZHIpOwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICB7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gKCgoaW50KSBleHQtPnJfYml0c1swXQotCQkJICAgPDwgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHKQotCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1sxXQotCQkJICAgICA8PCBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUcpCi0JCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzJdCi0JCQkgICAgIDw8IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRykpOwotICAgICAgaW50ZXJuLT5yX3R5cGUgPSAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRV9CSUcpCi0JCQk+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRyk7Ci0gICAgICBpbnRlcm4tPnJfZXh0ZXJuID0gKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0JJRykgIT0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm4tPnJfc3ltbmR4ID0gKCgoaW50KSBleHQtPnJfYml0c1swXQotCQkJICAgPDwgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFKQotCQkJICB8ICgoaW50KSBleHQtPnJfYml0c1sxXQotCQkJICAgICA8PCBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEUpCi0JCQkgIHwgKChpbnQpIGV4dC0+cl9iaXRzWzJdCi0JCQkgICAgIDw8IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRSkpOwotICAgICAgaW50ZXJuLT5yX3R5cGUgPSAoKChleHQtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFKQotCQkJID4+IFJFTE9DX0JJVFMzX1RZUEVfU0hfTElUVExFKQotCQkJfCAoKGV4dC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRSkKLQkJCSAgIDw8IFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUpKTsKLSAgICAgIGludGVybi0+cl9leHRlcm4gPSAoZXh0LT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFKSAhPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgTUlQU19SX1NXSVRDSCByZWxvYywgb3IgYW4gaW50ZXJuYWwgTUlQU19SX1JFTEhJIG9yCi0gICAgIE1JUFNfUl9SRUxMTyByZWxvYywgcl9zeW1uZHggaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZQotICAgICByZWxvYyBhZGRyZXNzIHRvIHRoZSBiYXNlIG9mIHRoZSBkaWZmZXJlbmNlIChzZWUKLSAgICAgaW5jbHVkZS9jb2ZmL21pcHMuaCBmb3IgbW9yZSBkZXRhaWxzKS4gIFdlIGNvcHkgc3ltbmR4IGludG8gdGhlCi0gICAgIHJfb2Zmc2V0IGZpZWxkIHNvIGFzIG5vdCB0byBjb25mdXNlIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIGluCi0gICAgIGVjb2ZmLmMuICBJbiBhZGp1c3RfcmVsb2NfaW4gd2UgdGhlbiBjb3B5IHJfb2Zmc2V0IGludG8gdGhlIHJlbG9jCi0gICAgIGFkZGVuZC4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfU1dJVENICi0gICAgICB8fCAoISBpbnRlcm4tPnJfZXh0ZXJuCi0JICAmJiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTExPCi0JICAgICAgfHwgaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKSkpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoISBpbnRlcm4tPnJfZXh0ZXJuKTsKLSAgICAgIGludGVybi0+cl9vZmZzZXQgPSBpbnRlcm4tPnJfc3ltbmR4OwotICAgICAgaWYgKGludGVybi0+cl9vZmZzZXQgJiAweDgwMDAwMCkKLQlpbnRlcm4tPnJfb2Zmc2V0IC09IDB4MTAwMDAwMDsKLSAgICAgIGludGVybi0+cl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0gICAgfQotfQotCi0vKiBTd2FwIGEgcmVsb2Mgb3V0LiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIGludGVybiwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBQVFIgZHN0OwotewotICBSRUxPQyAqZXh0ID0gKFJFTE9DICopIGRzdDsKLSAgbG9uZyByX3N5bW5keDsKLQotICBCRkRfQVNTRVJUIChpbnRlcm4tPnJfZXh0ZXJuCi0JICAgICAgfHwgKGludGVybi0+cl9zeW1uZHggPj0gMCAmJiBpbnRlcm4tPnJfc3ltbmR4IDw9IDEyKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIE1JUFNfUl9TV0lUQ0ggcmVsb2MsIG9yIGFuIGludGVybmFsIE1JUFNfUl9SRUxMTyBvcgotICAgICBNSVBTX1JfUkVMSEkgcmVsb2MsIHdlIGFjdHVhbGx5IHdhbnQgdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mCi0gICAgIHJfb2Zmc2V0IG91dCBhcyB0aGUgc3ltYm9sIGluZGV4LiAgVGhpcyB1bmRvZXMgdGhlIGNoYW5nZSBtYWRlIGJ5Ci0gICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCi0gIGlmIChpbnRlcm4tPnJfdHlwZSAhPSBNSVBTX1JfU1dJVENICi0gICAgICAmJiAoaW50ZXJuLT5yX2V4dGVybgotCSAgfHwgKGludGVybi0+cl90eXBlICE9IE1JUFNfUl9SRUxISQotCSAgICAgICYmIGludGVybi0+cl90eXBlICE9IE1JUFNfUl9SRUxMTykpKQotICAgIHJfc3ltbmR4ID0gaW50ZXJuLT5yX3N5bW5keDsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGludGVybi0+cl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9URVhUKTsKLSAgICAgIHJfc3ltbmR4ID0gaW50ZXJuLT5yX29mZnNldCAmIDB4ZmZmZmZmOwotICAgIH0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cl92YWRkciwgKGJmZF9ieXRlICopIGV4dC0+cl92YWRkcik7Ci0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dC0+cl9iaXRzWzBdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5yX2JpdHNbMV0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUc7Ci0gICAgICBleHQtPnJfYml0c1syXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+cl9iaXRzWzNdID0gKCgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzNfVFlQRV9TSF9CSUcpCi0JCQkgJiBSRUxPQ19CSVRTM19UWVBFX0JJRykKLQkJCXwgKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTM19FWFRFUk5fQklHIDogMCkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dC0+cl9iaXRzWzBdID0gcl9zeW1uZHggPj4gUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5yX2JpdHNbMV0gPSByX3N5bW5keCA+PiBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPnJfYml0c1syXSA9IHJfc3ltbmR4ID4+IFJFTE9DX0JJVFMyX1NZTU5EWF9TSF9MRUZUX0xJVFRMRTsKLSAgICAgIGV4dC0+cl9iaXRzWzNdID0gKCgoaW50ZXJuLT5yX3R5cGUgPDwgUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUpCi0JCQkgJiBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRSkKLQkJCXwgKChpbnRlcm4tPnJfdHlwZSA+PiBSRUxPQ19CSVRTM19UWVBFSElfU0hfTElUVExFCi0JCQkgICAgJiBSRUxPQ19CSVRTM19UWVBFSElfTElUVExFKSkKLQkJCXwgKGludGVybi0+cl9leHRlcm4gPyBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFIDogMCkpOwotICAgIH0KLX0KLQotLyogRmluaXNoIGNhbm9uaWNhbGl6aW5nIGEgcmVsb2MuICBQYXJ0IG9mIHRoaXMgaXMgZ2VuZXJpYyB0byBhbGwKLSAgIEVDT0ZGIHRhcmdldHMsIGFuZCB0aGF0IHBhcnQgaXMgaW4gZWNvZmYuYy4gIFRoZSByZXN0IGlzIGRvbmUgaW4KLSAgIHRoaXMgYmFja2VuZCByb3V0aW5lLiAgSXQgbXVzdCBmaWxsIGluIHRoZSBob3d0byBmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2FkanVzdF9yZWxvY19pbiAoYWJmZCwgaW50ZXJuLCBycHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotICAgICBhcmVsZW50ICpycHRyOwotewotICBpZiAoaW50ZXJuLT5yX3R5cGUgPiBNSVBTX1JfU1dJVENIKQotICAgIGFib3J0ICgpOwotCi0gIGlmICghIGludGVybi0+cl9leHRlcm4KLSAgICAgICYmIChpbnRlcm4tPnJfdHlwZSA9PSBNSVBTX1JfR1BSRUwKLQkgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9MSVRFUkFMKSkKLSAgICBycHRyLT5hZGRlbmQgKz0gZWNvZmZfZGF0YSAoYWJmZCktPmdwOwotCi0gIC8qIElmIHRoZSB0eXBlIGlzIE1JUFNfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0gICAgIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX0lHTk9SRSkKLSAgICBycHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCi0gIC8qIElmIHRoaXMgaXMgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCB3ZSB3YW50IHRoZSBhZGRlbmQgZmllbGQgb2YgdGhlIEJGRCByZWxvY3RvCi0gICAgIGhvbGQgdGhlIHZhbHVlIHdoaWNoIHdhcyBvcmlnaW5hbGx5IGluIHRoZSBzeW1uZHggZmllbGQgb2YgdGhlCi0gICAgIGludGVybmFsIE1JUFMgRUNPRkYgcmVsb2MuICBUaGlzIHZhbHVlIHdhcyBjb3BpZWQgaW50bwotICAgICBpbnRlcm4tPnJfb2Zmc2V0IGJ5IG1pcHNfc3dhcF9yZWxvY19pbiwgYW5kIGhlcmUgd2UgY29weSBpdCBpbnRvCi0gICAgIHRoZSBhZGRlbmQgZmllbGQuICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAotICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgotCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISQotCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTykpKQotICAgIHJwdHItPmFkZGVuZCA9IGludGVybi0+cl9vZmZzZXQ7Ci0KLSAgcnB0ci0+aG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRlcm4tPnJfdHlwZV07Ci19Ci0KLS8qIE1ha2UgYW55IGFkanVzdG1lbnRzIG5lZWRlZCB0byBhIHJlbG9jIGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIE5vbmUKLSAgIGFyZSBuZWVkZWQgZm9yIE1JUFMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19hZGp1c3RfcmVsb2Nfb3V0IChhYmZkLCByZWwsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBhcmVsZW50ICpyZWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuOwotewotICAvKiBGb3IgYSBNSVBTX1JfU1dJVENIIHJlbG9jLCBvciBhbiBpbnRlcm5hbCBNSVBTX1JfUkVMSEkgb3IKLSAgICAgTUlQU19SX1JFTExPIHJlbG9jLCB3ZSBtdXN0IGNvcHkgcmVsLT5hZGRlbmQgaW50bwotICAgICBpbnRlcm4tPnJfb2Zmc2V0LiAgVGhpcyB3aWxsIHRoZW4gYmUgd3JpdHRlbiBvdXQgYXMgdGhlIHN5bWJvbAotICAgICBpbmRleCBieSBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0LiAgVGhpcyBvcGVyYXRpb24gcGFyYWxsZWxzIHRoZQotICAgICBhY3Rpb24gb2YgbWlwc19hZGp1c3RfcmVsb2NfaW4uICAqLwotICBpZiAoaW50ZXJuLT5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSAotICAgICAgfHwgKCEgaW50ZXJuLT5yX2V4dGVybgotCSAgJiYgKGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxISQotCSAgICAgIHx8IGludGVybi0+cl90eXBlID09IE1JUFNfUl9SRUxMTykpKQotICAgIGludGVybi0+cl9vZmZzZXQgPSByZWwtPmFkZGVuZDsKLX0KLQotLyogRUNPRkYgcmVsb2NzIGFyZSBlaXRoZXIgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLCBvciBhZ2FpbnN0Ci0gICBzZWN0aW9ucy4gIElmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHRoZSByZWxvYwotICAgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCBub3RoaW5nIGhhcyBnaXZlbiB1cyBhbnkKLSAgIGFkZGl0aW9uYWwgYWRkZW5kLCB0aGUgcmVzdWx0aW5nIHJlbG9jIHdpbGwgYWxzbyBiZSBhZ2FpbnN0IHRoZQotICAgc2FtZSBzeW1ib2wuICBJbiBzdWNoIGEgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcKLSAgIGFib3V0IHRoZSB3YXkgdGhlIHJlbG9jIGlzIGhhbmRsZWQsIHNpbmNlIGl0IHdpbGwgYWxsIGJlIGRvbmUgYXQKLSAgIGZpbmFsIGxpbmsgdGltZS4gIFJhdGhlciB0aGFuIHB1dCBzcGVjaWFsIGNhc2UgY29kZSBpbnRvCi0gICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLCBhbGwgdGhlIHJlbG9jIHR5cGVzIHVzZSB0aGlzIGhvd3RvCi0gICBmdW5jdGlvbi4gIEl0IGp1c3Qgc2hvcnQgY2lyY3VpdHMgdGhlIHJlbG9jIGlmIHByb2R1Y2luZwotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyogRG8gYSBSRUZISSByZWxvY2F0aW9uLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBpbiBjb21iaW5hdGlvbiB3aXRoIGEKLSAgIFJFRkxPIHJlbG9jLCBiZWNhdXNlIHRoZXJlIGlzIGEgY2FycnkgZnJvbSB0aGUgUkVGTE8gdG8gdGhlIFJFRkhJLgotICAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZSBhY3R1YWwKLSAgIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIFJFRkxPLiAgTUlQUyBFQ09GRiByZXF1aXJlcyB0aGF0IHRoZQotICAgUkVGTE8gaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBSRUZISS4gIEFzIGEgR05VIGV4dGVuc2lvbiwgd2UgcGVybWl0Ci0gICBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJIHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8KLSAgIHJlbG9jLiAgVGhpcyBleHRlbnNpb24gcGVybWl0cyBnY2MgdG8gb3V0cHV0IHRoZSBISSBhbmQgTE8gcmVsb2NzCi0gICBpdHNlbGYuICAqLwotCi1zdHJ1Y3QgbWlwc19oaQotewotICBzdHJ1Y3QgbWlwc19oaSAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaSAqbWlwc19yZWZoaV9saXN0OwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX3JlZmhpX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBzdHJ1Y3QgbWlwc19oaSAqbjsKLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgUkVGTE8gZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbWlwc19oaSAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gIG1pcHNfcmVmaGlfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRG8gYSBSRUZMTyByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCAxNiBiaXQgaW5wbGFjZQotICAgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFRkhJCi0gICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobWlwc19yZWZoaV9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkgKmw7Ci0KLSAgICAgIGwgPSBtaXBzX3JlZmhpX2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotCi0JICAvKiBEbyB0aGUgUkVGSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAotCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUZMTyBpdHNlbGYsIGV4Y2VwdAotCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCi0JICAgICBSRUZISS4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotCQkgICAmIDB4ZmZmZik7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCi0JICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCi0JICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKLQkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCi0JICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KLQkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0JICAgIHZhbCAtPSAweDEwMDAwOwotCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0JICAgIHZhbCArPSAweDEwMDAwOwotCi0JICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbWlwc19yZWZoaV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBSRUZMTyByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIG1pcHNfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBhIEdQUkVMIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgMTYgYml0IHZhbHVlIHdoaWNoIG11c3QgYmVjb21lCi0gICB0aGUgb2Zmc2V0IGZyb20gdGhlIGdwIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19ncHJlbF9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfdm1hIGdwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFQ09GRgotICAgICBmaWxlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiByZWxvY2F0ZWFibGUgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBncCB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVDT0ZGCi0gICAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0gIGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoZ3AgPT0gMAotICAgICAgJiYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotCSAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApKQotICAgIHsKLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgIT0gZmFsc2UpCi0JewotCSAgLyogTWFrZSB1cCBhIHZhbHVlLiAgKi8KLQkgIGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgYXN5bWJvbCAqKnN5bTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCSAgc3ltID0gYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKTsKLQotCSAgaWYgKHN5bSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLQkgICAgaSA9IGNvdW50OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHN5bSsrKQotCQl7Ci0JCSAgcmVnaXN0ZXIgQ09OU1QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqc3ltKTsKLQkJICBpZiAoKm5hbWUgPT0gJ18nICYmIHN0cmNtcCAobmFtZSwgIl9ncCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGdwID0gYmZkX2FzeW1ib2xfdmFsdWUgKCpzeW0pOwotCQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID49IGNvdW50KQotCSAgICB7Ci0JICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotCSAgICAgIGdwID0gNDsKLQkgICAgICBfYmZkX3NldF9ncF92YWx1ZSAob3V0cHV0X2JmZCwgZ3ApOwotCSAgICAgICplcnJvcl9tZXNzYWdlID0KLQkJKGNoYXIgKikgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIF9ncCBub3QgZGVmaW5lZCIpOwotCSAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgKyByZWxvY19lbnRyeS0+YWRkZW5kKSAmIDB4ZmZmZjsKLSAgaWYgKHZhbCAmIDB4ODAwMCkKLSAgICB2YWwgLT0gMHgxMDAwMDsKLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSA9PSBmYWxzZQotICAgICAgfHwgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgdmFsICs9IHJlbG9jYXRpb24gLSBncDsKLQotICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlICE9IGZhbHNlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogTWFrZSBzdXJlIGl0IGZpdCBpbiAxNiBiaXRzLiAgKi8KLSAgaWYgKHZhbCA+PSAweDgwMDAgJiYgdmFsIDwgMHhmZmZmODAwMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIERvIGEgUkVMSEkgcmVsb2NhdGlvbi4gIFdlIGRvIHRoaXMgaW4gY29uanVuY3Rpb24gd2l0aCBhIFJFTExPCi0gICByZWxvYywganVzdCBhcyBSRUZISSBhbmQgUkVGTE8gYXJlIGRvbmUgdG9nZXRoZXIuICBSRUxISSBhbmQgUkVMTE8KLSAgIGFyZSBDeWdudXMgZXh0ZW5zaW9ucyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBwb3NpdGlvbiBpbmRlcGVuZGVudAotICAgY29kZSBmb3IgZW1iZWRkZWQgc3lzdGVtcy4gICovCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG1pcHNfaGkgKm1pcHNfcmVsaGlfbGlzdDsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwc19yZWxoaV9yZWxvYyAoYWJmZCwKLQkJICByZWxvY19lbnRyeSwKLQkJICBzeW1ib2wsCi0JCSAgZGF0YSwKLQkJICBpbnB1dF9zZWN0aW9uLAotCQkgIG91dHB1dF9iZmQsCi0JCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG1pcHNfaGkgKm47Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgdGhlbiBpdCBpcyBjb3JyZWN0Ci0gICAgIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBvbmx5IHRpbWUgd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyBjYXNlIGlzCi0gICAgIHdoZW4gd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhhdCBpcyBoYW5kbGVkIGVudGlyZWx5IGJ5Ci0gICAgIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBhbmQgbmV2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbi4gICovCi0gIGlmICgoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgSWYgd2UncmUgcmVsb2NhdGluZywgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIHJldCA9IGJmZF9yZWxvY19vazsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBSRUxMTyBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24uICAqLwotICBuID0gKHN0cnVjdCBtaXBzX2hpICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG1pcHNfcmVsaGlfbGlzdDsKLSAgbWlwc19yZWxoaV9saXN0ID0gbjsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBEbyBhIFJFTExPIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgc3RyYWlnaHRmb3J3YXJkIDE2IGJpdCBQQwotICAgcmVsYXRpdmUgcmVsb2NhdGlvbjsgdGhpcyBmdW5jdGlvbiBleGlzdHMgaW4gb3JkZXIgdG8gZG8gdGhlIFJFTEhJCi0gICByZWxvY2F0aW9uIGRlc2NyaWJlZCBhYm92ZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfcmVsbG9fcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobWlwc19yZWxoaV9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkgKmw7Ci0KLSAgICAgIGwgPSBtaXBzX3JlbGhpX2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtaXBzX2hpICpuZXh0OwotCi0JICAvKiBEbyB0aGUgUkVMSEkgcmVsb2NhdGlvbi4gIE5vdGUgdGhhdCB3ZSBhY3R1YWxseSBkb24ndAotCSAgICAgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBSRUxMTyBpdHNlbGYsIGV4Y2VwdAotCSAgICAgd2hlcmUgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlCi0JICAgICBSRUxISS4gICovCi0JICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgbC0+YWRkcik7Ci0JICB2YWxsbyA9IChiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKQotCQkgICAmIDB4ZmZmZik7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBtYWtlIHZhbCBQQyByZWxhdGl2ZS4gIElmIHRoZQotCSAgICAgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcywgYmVjYXVzZQotCSAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgdmFsdWUgaW4gdGhlIG9iamVjdCBmaWxlIHRvIGluY29ycG9yYXRlCi0JICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2MuICAqLwotCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bWJvbCkpCi0JICAgICAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltYm9sKSkpCi0JICAgIHZhbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotCSAgLyogVGhlIGxvdyBvcmRlciAxNiBiaXRzIGFyZSBhbHdheXMgdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgdmFsdWUuICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzCi0JICAgICByZXF1aXJlcyBhbiBhZGp1c3RtZW50IGluIHRoZSBoaWdoIG9yZGVyIGJpdHMuICBXZSBuZWVkCi0JICAgICB0byBtYWtlIHRoaXMgYWRqdXN0bWVudCBpbiB0d28gd2F5czogb25jZSBmb3IgdGhlIGJpdHMgd2UKLQkgICAgIHRvb2sgZnJvbSB0aGUgZGF0YSwgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nCi0JICAgICBiYWNrIGluIHRvIHRoZSBkYXRhLiAgKi8KLQkgIGlmICgodmFsbG8gJiAweDgwMDApICE9IDApCi0JICAgIHZhbCAtPSAweDEwMDAwOwotCSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0JICAgIHZhbCArPSAweDEwMDAwOwotCi0JICBpbnNuID0gKGluc24gJn4gMHhmZmZmKSB8ICgodmFsID4+IDE2KSAmIDB4ZmZmZik7Ci0JICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBsLT5hZGRyKTsKLQotCSAgbmV4dCA9IGwtPm5leHQ7Ci0JICBmcmVlIChsKTsKLQkgIGwgPSBuZXh0OwotCX0KLQotICAgICAgbWlwc19yZWxoaV9saXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwgdGhlbiBpdCBpcyBjb3JyZWN0Ci0gICAgIGluIHRoZSBvYmplY3QgZmlsZS4gIFRoZSBvbmx5IHRpbWUgd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyBjYXNlIGlzCi0gICAgIHdoZW4gd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhhdCBpcyBoYW5kbGVkIGVudGlyZWx5IGJ5Ci0gICAgIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiBhbmQgbmV2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbi4gICovCi0gIGlmICgoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0JcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gZG9lcyBub3QgaGFuZGxlIHBjcmVsX29mZnNldCByZWxvY2F0aW9ucwotICAgICBjb3JyZWN0bHkgd2hlbiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIGZpbGUsIHNvIGhhbmRsZSB0aGVtCi0gICAgIGRpcmVjdGx5IGhlcmUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgUkVMTE8gcmVsb2MgaW4gdGhlIHVzdWFsIHdheS4gICovCi0gIHJldHVybiBtaXBzX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogVGhpcyBpcyB0aGUgc3BlY2lhbCBmdW5jdGlvbiBmb3IgdGhlIE1JUFNfUl9TV0lUQ0ggcmVsb2MuICBUaGlzCi0gICBzcGVjaWFsIHJlbG9jIGlzIG5vcm1hbGx5IGNvcnJlY3QgaW4gdGhlIG9iamVjdCBmaWxlLCBhbmQgb25seQotICAgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyB3aGVuIHJlbGF4aW5nLiAgV2UgZG9uJ3Qgd2FudAotICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiB0byB0YW1wZXIgd2l0aCBpdCBhdCBhbGwuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfc3dpdGNoX3JlbG9jIChhYmZkLAotCQkgICByZWxvY19lbnRyeSwKLQkJICAgc3ltYm9sLAotCQkgICBkYXRhLAotCQkgICBpbnB1dF9zZWN0aW9uLAotCQkgICBvdXRwdXRfYmZkLAotCQkgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogR2V0IHRoZSBob3d0byBzdHJ1Y3R1cmUgZm9yIGEgZ2VuZXJpYyByZWxvYyB0eXBlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGludCBtaXBzX3R5cGU7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZIQUxGOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZXT1JEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfSk1QQUREUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUZISTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfUkVGTE87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dQUkVMOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX0dQUkVMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX0xJVEVSQUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QQ1JFTF9TMjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9QQ1JFTDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TOgotICAgICAgbWlwc190eXBlID0gTUlQU19SX1JFTEhJOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfTE8xNjoKLSAgICAgIG1pcHNfdHlwZSA9IE1JUFNfUl9SRUxMTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0gICAgICBtaXBzX3R5cGUgPSBNSVBTX1JfU1dJVENIOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gJm1pcHNfaG93dG9fdGFibGVbbWlwc190eXBlXTsKLX0KLQwKLS8qIEEgaGVscGVyIHJvdXRpbmUgZm9yIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiB3aGljaCBoYW5kbGVzIHRoZSBSRUZISQotICAgYW5kIFJFTEhJIHJlbG9jYXRpb25zLiAgVGhlIFJFRkhJIHJlbG9jYXRpb24gbXVzdCBiZSBmb2xsb3dlZCBieSBhCi0gICBSRUZMTyByZWxvY2F0aW9uIChhbmQgUkVMSEkgYnkgYSBSRUxMTyksIGFuZCB0aGUgYWRkZW5kIHVzZWQgaXMKLSAgIGZvcm1lZCBmcm9tIHRoZSBhZGRlbmRzIG9mIGJvdGggaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfcmVsb2NhdGVfaGkgKHJlZmhpLCByZWZsbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRqdXN0LAotCQkgIHJlbG9jYXRpb24sIHBjcmVsKQotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmhpOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlZmxvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc2l6ZV90IGFkanVzdDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBib29sZWFuIHBjcmVsOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICB1bnNpZ25lZCBsb25nIHZhbGxvOwotCi0gIGlmIChyZWZoaSA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgCi0gIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCSAgICAgY29udGVudHMgKyBhZGp1c3QgKyByZWZoaS0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0gIGlmIChyZWZsbyA9PSBOVUxMKQotICAgIHZhbGxvID0gMDsKLSAgZWxzZQotICAgIHZhbGxvID0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCSBjb250ZW50cyArIGFkanVzdCArIHJlZmxvLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKQotCSAgICAgJiAweGZmZmYpOwotIAotICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotICB2YWwgKz0gcmVsb2NhdGlvbjsKLQotICAvKiBUaGUgbG93IG9yZGVyIDE2IGJpdHMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgc2lnbmVkIHZhbHVlLgotICAgICBUaGVyZWZvcmUsIGEgbmVnYXRpdmUgdmFsdWUgaW4gdGhlIGxvdyBvcmRlciBiaXRzIHJlcXVpcmVzIGFuCi0gICAgIGFkanVzdG1lbnQgaW4gdGhlIGhpZ2ggb3JkZXIgYml0cy4gIFdlIG5lZWQgdG8gbWFrZSB0aGlzCi0gICAgIGFkanVzdG1lbnQgaW4gdHdvIHdheXM6IG9uY2UgZm9yIHRoZSBiaXRzIHdlIHRvb2sgZnJvbSB0aGUgZGF0YSwKLSAgICAgYW5kIG9uY2UgZm9yIHRoZSBiaXRzIHdlIGFyZSBwdXR0aW5nIGJhY2sgaW4gdG8gdGhlIGRhdGEuICAqLwotICBpZiAoKHZhbGxvICYgMHg4MDAwKSAhPSAwKQotICAgIHZhbCAtPSAweDEwMDAwOwotCi0gIGlmIChwY3JlbCkKLSAgICB2YWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JICAgICsgKHJlZmxvLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hICsgYWRqdXN0KSk7Ci0KLSAgaWYgKCh2YWwgJiAweDgwMDApICE9IDApCi0gICAgdmFsICs9IDB4MTAwMDA7Ci0KLSAgaW5zbiA9IChpbnNuICZ+IDB4ZmZmZikgfCAoKHZhbCA+PiAxNikgJiAweGZmZmYpOwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIChiZmRfdm1hKSBpbnNuLAotCSAgICAgIGNvbnRlbnRzICsgYWRqdXN0ICsgcmVmaGktPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotfQotCi0vKiBSZWxvY2F0ZSBhIHNlY3Rpb24gd2hpbGUgbGlua2luZyBhIE1JUFMgRUNPRkYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgIGNvbnRlbnRzLCBleHRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotewotICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uOwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSBncDsKLSAgYm9vbGVhbiBncF91bmRlZmluZWQ7Ci0gIHNpemVfdCBhZGp1c3Q7Ci0gIGxvbmcgKm9mZnNldHM7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsX2VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJvb2xlYW4gZ290X2xvOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgbG9faW50X3JlbDsKLQotICBCRkRfQVNTRVJUIChpbnB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotCSAgICAgID09IG91dHB1dF9iZmQtPnh2ZWMtPmJ5dGVvcmRlcik7Ci0KLSAgLyogV2Uga2VlcCBhIHRhYmxlIG1hcHBpbmcgdGhlIHN5bW5keCBmb3VuZCBpbiBhbiBpbnRlcm5hbCByZWxvYyB0bwotICAgICB0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4gIFRoaXMgaXMgZmFzdGVyIHRoYW4gbG9va2luZyB1cCB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lIGVhY2ggdGltZS4gICovCi0gIHN5bW5keF90b19zZWN0aW9uID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltbmR4X3RvX3NlY3Rpb247Ci0gIGlmIChzeW1uZHhfdG9fc2VjdGlvbiA9PSAoYXNlY3Rpb24gKiopIE5VTEwpCi0gICAgewotICAgICAgc3ltbmR4X3RvX3NlY3Rpb24gPSAoKGFzZWN0aW9uICoqKQotCQkJICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKE5VTV9SRUxPQ19TRUNUSU9OUwotCQkJCSAgICAgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gICAgICBpZiAoIXN5bW5keF90b19zZWN0aW9uKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9OT05FXSA9IE5VTEw7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1RFWFRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnRleHQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUkRBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnJkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmRhdGEiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fU0RBVEFdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNkYXRhIik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX1NCU1NdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLnNic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fQlNTXSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5ic3MiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fSU5JVF0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuaW5pdCIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVQ4XSA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi5saXQ4Iik7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0xJVDRdID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCAiLmxpdDQiKTsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fWERBVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fUERBVEFdID0gTlVMTDsKLSAgICAgIHN5bW5keF90b19zZWN0aW9uW1JFTE9DX1NFQ1RJT05fRklOSV0gPQotCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpbnB1dF9iZmQsICIuZmluaSIpOwotICAgICAgc3ltbmR4X3RvX3NlY3Rpb25bUkVMT0NfU0VDVElPTl9MSVRBXSA9IE5VTEw7Ci0gICAgICBzeW1uZHhfdG9fc2VjdGlvbltSRUxPQ19TRUNUSU9OX0FCU10gPSBOVUxMOwotCi0gICAgICBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5zeW1uZHhfdG9fc2VjdGlvbiA9IHN5bW5keF90b19zZWN0aW9uOwotICAgIH0KLQotICBzeW1faGFzaGVzID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+c3ltX2hhc2hlczsKLQotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgaWYgKGdwID09IDApCi0gICAgZ3BfdW5kZWZpbmVkID0gdHJ1ZTsKLSAgZWxzZQotICAgIGdwX3VuZGVmaW5lZCA9IGZhbHNlOwotCi0gIGdvdF9sbyA9IGZhbHNlOwotCi0gIGFkanVzdCA9IDA7Ci0KLSAgaWYgKGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSA9PSBOVUxMKQotICAgIG9mZnNldHMgPSBOVUxMOwotICBlbHNlCi0gICAgb2Zmc2V0cyA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+b2Zmc2V0czsKLQotICBleHRfcmVsID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSBleHRlcm5hbF9yZWxvY3M7Ci0gIGV4dF9yZWxfZW5kID0gZXh0X3JlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKGkgPSAwOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgYm9vbGVhbiB1c2VfbG8gPSBmYWxzZTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGFzZWN0aW9uICpzID0gTlVMTDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICBpZiAoISBnb3RfbG8pCi0JbWlwc19lY29mZl9zd2FwX3JlbG9jX2luIChpbnB1dF9iZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpbnRfcmVsID0gbG9faW50X3JlbDsKLQkgIGdvdF9sbyA9IGZhbHNlOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX3R5cGUKLQkJICA8IHNpemVvZiBtaXBzX2hvd3RvX3RhYmxlIC8gc2l6ZW9mIG1pcHNfaG93dG9fdGFibGVbMF0pOwotCi0gICAgICAvKiBUaGUgUkVGSEkgYW5kIFJFTEhJIHJlbG9jcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgdGhleQotCSBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgUkVGTE8gb3IgUkVMTE8gcmVsb2MsIHJlc3BlY3RpdmVseSwgYW5kCi0JIHRoZSBhZGRlbmQgaXMgZm9ybWVkIGZyb20gYm90aCByZWxvY3MuICAqLwotICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZISQotCSAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCXsKLQkgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqbG9fZXh0X3JlbDsKLQotCSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBwZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBSRUZISQotICAgICAgICAgICAgIG9yIFJFTEhJIHJlbG9jcyBiZWZvcmUgdGhlIFJFRkxPIG9yIFJFTExPIHJlbG9jLiAgVGhpcwotICAgICAgICAgICAgIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MgaXRzZWxmLiAgKi8KLQkgIGZvciAobG9fZXh0X3JlbCA9IGV4dF9yZWwgKyAxOwotCSAgICAgICBsb19leHRfcmVsIDwgZXh0X3JlbF9lbmQ7Ci0JICAgICAgIGxvX2V4dF9yZWwrKykKLQkgICAgewotCSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoaW5wdXRfYmZkLCAoUFRSKSBsb19leHRfcmVsLAotCQkJCQkmbG9faW50X3JlbCk7Ci0JICAgICAgaWYgKGxvX2ludF9yZWwucl90eXBlICE9IGludF9yZWwucl90eXBlKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAobG9fZXh0X3JlbCA8IGV4dF9yZWxfZW5kCi0JICAgICAgJiYgKGxvX2ludF9yZWwucl90eXBlCi0JCSAgPT0gKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUZISQotCQkgICAgICA/IE1JUFNfUl9SRUZMTwotCQkgICAgICA6IE1JUFNfUl9SRUxMTykpCi0JICAgICAgJiYgaW50X3JlbC5yX2V4dGVybiA9PSBsb19pbnRfcmVsLnJfZXh0ZXJuCi0JICAgICAgJiYgaW50X3JlbC5yX3N5bW5keCA9PSBsb19pbnRfcmVsLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgICAgdXNlX2xvID0gdHJ1ZTsKLQkgICAgICBpZiAobG9fZXh0X3JlbCA9PSBleHRfcmVsICsgMSkKLQkJZ290X2xvID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgaG93dG8gPSAmbWlwc19ob3d0b190YWJsZVtpbnRfcmVsLnJfdHlwZV07Ci0KLSAgICAgIC8qIFRoZSBTV0lUQ0ggcmVsb2MgbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFRoaXMgcmVsb2MgaXMKLQkgbWFya3MgdGhlIGxvY2F0aW9uIG9mIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBwb3J0aW9ucyBvZiBhbgotCSBvYmplY3QgZmlsZS4gIFRoZSBzeW1ib2wgaW5kZXggZG9lcyBub3QgcmVmZXJlbmNlIGEgc3ltYm9sLAotCSBidXQgaXMgYWN0dWFsbHkgdGhlIG9mZnNldCBmcm9tIHRoZSByZWxvYyB0byB0aGUgc3VidHJhaGVuZAotCSBvZiB0aGUgZGlmZmVyZW5jZS4gIFRoaXMgcmVsb2MgaXMgY29ycmVjdCBpbiB0aGUgb2JqZWN0IGZpbGUsCi0JIGFuZCBuZWVkcyBubyBmdXJ0aGVyIGFkanVzdG1lbnQsIHVubGVzcyB3ZSBhcmUgcmVsYXhpbmcuICBJZgotCSB3ZSBhcmUgcmVsYXhpbmcsIHdlIG1heSBoYXZlIHRvIGFkZCBpbiBhbiBvZmZzZXQuICBTaW5jZSBubwotCSBzeW1ib2xzIGFyZSBpbnZvbHZlZCBpbiB0aGlzIHJlbG9jLCB3ZSBoYW5kbGUgaXQgY29tcGxldGVseQotCSBoZXJlLiAgKi8KLSAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfU1dJVENIKQotCXsKLQkgIGlmIChvZmZzZXRzICE9IE5VTEwKLQkgICAgICAmJiBvZmZzZXRzW2ldICE9IDApCi0JICAgIHsKLQkgICAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJICAoYmZkX3ZtYSkgb2Zmc2V0c1tpXSwKLQkJCQkJICAoY29udGVudHMKLQkJCQkJICAgKyBhZGp1c3QKLQkJCQkJICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkgICAgICBCRkRfQVNTRVJUIChyID09IGJmZF9yZWxvY19vayk7Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoaW50X3JlbC5yX2V4dGVybikKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tpbnRfcmVsLnJfc3ltbmR4XTsKLQkgIC8qIElmIGggaXMgTlVMTCwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCBhbgotCSAgICAgZXh0ZXJuYWwgc3ltYm9sIHdoaWNoIHdlIHRob3VnaHQgd2FzIGp1c3QgYSBkZWJ1Z2dpbmcKLQkgICAgIHN5bWJvbC4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgaWYgKGggPT0gKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgYWJvcnQgKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChpbnRfcmVsLnJfc3ltbmR4IDwgMCB8fCBpbnRfcmVsLnJfc3ltbmR4ID49IE5VTV9SRUxPQ19TRUNUSU9OUykKLQkgICAgcyA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHMgPSBzeW1uZHhfdG9fc2VjdGlvbltpbnRfcmVsLnJfc3ltbmR4XTsKLQotCSAgaWYgKHMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogVGhlIEdQUkVMIHJlbG9jIHVzZXMgYW4gYWRkZW5kOiB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgR1AKLQkgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfR1BSRUwKLQkgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9MSVRFUkFMKQotCWFkZGVuZCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGdwX3VuZGVmaW5lZCkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2NfZGFuZ2Vyb3VzKQotCQkgICAgIChpbmZvLCBfKCJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiKSwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCi0JICAgICAgZ3AgPSA0OwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCBncCk7Ci0JICAgICAgZ3BfdW5kZWZpbmVkID0gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghIGludF9yZWwucl9leHRlcm4pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoZSBjdXJyZW50Ci0JCSBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJIElOUFVUX1NFQ1RJT04tPnZtYSBhbmQgdGhlIEdQIHZhbHVlIG9mIElOUFVUX0JGRC4gIFdlCi0JCSBtdXN0IGNoYW5nZSB0aGlzIHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi0JCSBmaW5hbCBkZWZpbml0aW9uICh3aGljaCB3aWxsIGVuZCB1cCBpbiBSRUxPQ0FUSU9OKQotCQkgYW5kIHRoZSBHUCB2YWx1ZSBvZiBPVVRQVVRfQkZEICh3aGljaCBpcyBpbiBHUCkuICAqLwotCSAgICAgIGFkZGVuZCA9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwIC0gZ3A7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBkZWZpbmVkIHN5bWJvbC4gIFRoZQotCQkgY3VycmVudCBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHNpbXBseSB0aGUKLQkJIGRlc2lyZWQgb2Zmc2V0IGludG8gdGhlIHN5bWJvbCAobm9ybWFsbHkgemVybykuICBXZQotCQkgYXJlIGdvaW5nIHRvIGNoYW5nZSB0aGlzIGludG8gYSByZWxvY2F0aW9uIGFnYWluc3QgYQotCQkgZGVmaW5lZCBzeW1ib2wsIHNvIHdlIHdhbnQgdGhlIGluc3RydWN0aW9uIHRvIGhvbGQKLQkJIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGZpbmFsIGRlZmluaXRpb24gb2YgdGhlCi0JCSBzeW1ib2wgKHdoaWNoIHdpbGwgZW5kIHVwIGluIFJFTE9DQVRJT04pIGFuZCB0aGUgR1AKLQkJIHZhbHVlIG9mIE9VVFBVVF9CRkQgKHdoaWNoIGlzIGluIEdQKS4gICovCi0JICAgICAgYWRkZW5kID0gLSBncDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jYXRpb24gYWdhaW5zdCBhbiB1bmRlZmluZWQgb3IgY29tbW9uCi0JCSBzeW1ib2wuICBUaGUgY3VycmVudCBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzCi0JCSBzaW1wbHkgdGhlIGRlc2lyZWQgb2Zmc2V0IGludG8gdGhlIHN5bWJvbCAobm9ybWFsbHkKLQkJIHplcm8pLiAgV2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHdlCi0JCSBhcmVuJ3QgZ29pbmcgdG8gZGVmaW5lIHRoaXMgc3ltYm9sLCBzbyB3ZSBqdXN0IGxlYXZlCi0JCSB0aGUgaW5zdHJ1Y3Rpb24gYWxvbmUuICAqLwotCSAgICAgIGFkZGVuZCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSByZWxheGluZywgbWlwc19yZWxheF9zZWN0aW9uIG1heSBoYXZlIHNldAotCSBvZmZzZXRzW2ldIHRvIHNvbWUgdmFsdWUuICBBIHZhbHVlIG9mIDEgbWVhbnMgd2UgbXVzdCBleHBhbmQKLQkgYSBQQyByZWxhdGl2ZSBicmFuY2ggaW50byBhIG11bHRpLWluc3RydWN0aW9uIG9mIHNlcXVlbmNlLAotCSBhbmQgYW55IG90aGVyIHZhbHVlIGlzIGFuIGFkZGVuZC4gICovCi0gICAgICBpZiAob2Zmc2V0cyAhPSBOVUxMCi0JICAmJiBvZmZzZXRzW2ldICE9IDApCi0JewotCSAgQkZEX0FTU0VSVCAoISBpbmZvLT5yZWxvY2F0ZWFibGUpOwotCSAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1BDUkVMMTYKLQkJICAgICAgfHwgaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJCi0JCSAgICAgIHx8IGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxMTyk7Ci0JICBpZiAob2Zmc2V0c1tpXSAhPSAxKQotCSAgICBhZGRlbmQgKz0gb2Zmc2V0c1tpXTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9ieXRlICpoZXJlOwotCi0JICAgICAgQkZEX0FTU0VSVCAoaW50X3JlbC5yX2V4dGVybgotCQkJICAmJiBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUENSRUwxNik7Ci0KLQkgICAgICAvKiBNb3ZlIHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbnMgdXAuICAqLwotCSAgICAgIGhlcmUgPSAoY29udGVudHMKLQkJICAgICAgKyBhZGp1c3QKLQkJICAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJICAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCSAgICAgIG1lbW1vdmUgKGhlcmUgKyBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5ULCBoZXJlLAotCQkgICAgICAgKHNpemVfdCkgKGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZQotCQkJCSAtIChpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSk7Ci0JCSAgICAgICAKLQkgICAgICAvKiBHZW5lcmF0ZSB0aGUgbmV3IGluc3RydWN0aW9ucy4gICovCi0JICAgICAgaWYgKCEgbWlwc19yZWxheF9wY3JlbDE2IChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWgsIGhlcmUsCi0JCQkJCShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCQkJICsgKGludF9yZWwucl92YWRkcgotCQkJCQkgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpCi0JCQkJCSArIGFkanVzdCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBXZSBtdXN0IGFkanVzdCBldmVyeXRoaW5nIGVsc2UgdXAgYSBub3RjaC4gICovCi0JICAgICAgYWRqdXN0ICs9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0KLQkgICAgICAvKiBtaXBzX3JlbGF4X3BjcmVsMTYgaGFuZGxlcyBhbGwgdGhlIGRldGFpbHMgb2YgdGhpcwotCQkgcmVsb2NhdGlvbi4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSByZWxheGluZywgYW5kIHRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSAudGV4dAotCSBzZWdtZW50LCB3ZSBtYXkgbmVlZCB0byBhZGp1c3QgaXQgaWYgc29tZSBicmFuY2hlcyBoYXZlIGJlZW4KLQkgZXhwYW5kZWQuICBUaGUgcmVsb2MgdHlwZXMgd2hpY2ggYXJlIGxpa2VseSB0byBvY2N1ciBpbiB0aGUKLQkgLnRleHQgc2VjdGlvbiBhcmUgaGFuZGxlZCBlZmZpY2llbnRseSBieSBtaXBzX3JlbGF4X3NlY3Rpb24sCi0JIGFuZCB0aHVzIGRvIG5vdCBuZWVkIHRvIGJlIGhhbmRsZWQgaGVyZS4gICovCi0gICAgICBpZiAoZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5hZGp1c3QgIT0gTlVMTAotCSAgJiYgISBpbnRfcmVsLnJfZXh0ZXJuCi0JICAmJiBpbnRfcmVsLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fVEVYVAotCSAgJiYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JCSAgICAgICIudGV4dCIpICE9IDAKLQkgICAgICB8fCAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1BDUkVMMTYKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfU1dJVENICi0JCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTEhJCi0JCSAgJiYgaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFTExPKSkpCi0JewotCSAgYmZkX3ZtYSBhZHI7Ci0JICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphOwotCi0JICAvKiBXZSBuZWVkIHRvIGdldCB0aGUgYWRkZW5kIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIHdlIG5lZWQKLQkgICAgIHRvIGFkanVzdCB0aGUgYWRkcmVzcy4gICovCi0JICBCRkRfQVNTRVJUIChpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVGV09SRCk7Ci0KLQkgIGFkciA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwKLQkJCSAgICAoY29udGVudHMKLQkJCSAgICAgKyBhZGp1c3QKLQkJCSAgICAgKyBpbnRfcmVsLnJfdmFkZHIKLQkJCSAgICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQotCSAgZm9yIChhID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5hZGp1c3Q7Ci0JICAgICAgIGEgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkgICAgICAgYSA9IGEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoYWRyID49IGEtPnN0YXJ0ICYmIGFkciA8IGEtPmVuZCkKLQkJYWRkZW5kICs9IGEtPmFkanVzdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgbXVzdCBjb252ZXJ0Ci0JICAgICB0aGUgZXhpc3RpbmcgcmVsb2MuICAqLwotCSAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICAvKiBUaGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBvdXRwdXQuICBDb252ZXJ0Ci0JCSAgICAgdGhlIHJlbG9jIGZyb20gYmVpbmcgYWdhaW5zdCB0aGUgc3ltYm9sIHRvIGJlaW5nCi0JCSAgICAgYWdhaW5zdCB0aGUgc2VjdGlvbi4gICovCi0KLQkJICAvKiBDbGVhciB0aGUgcl9leHRlcm4gYml0LiAgKi8KLQkJICBpbnRfcmVsLnJfZXh0ZXJuID0gMDsKLQotCQkgIC8qIENvbXB1dGUgYSBuZXcgcl9zeW1uZHggdmFsdWUuICAqLwotCQkgIHMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCi0JCSAgaW50X3JlbC5yX3N5bW5keCA9IC0xOwotCQkgIHN3aXRjaCAobmFtZVsxXSkKLQkJICAgIHsKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmJzcyIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9CU1M7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9EQVRBOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2YnOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fRklOSTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdpJzoKLQkJICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0lOSVQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnbCc6Ci0JCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ0OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3InOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JEQVRBOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3MnOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJCWludF9yZWwucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JCQlpbnRfcmVsLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ3QnOgotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotCQkJaW50X3JlbC5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgICAgIAotCQkgIGlmIChpbnRfcmVsLnJfc3ltbmR4ID09IC0xKQotCQkgICAgYWJvcnQgKCk7Ci0KLQkJICAvKiBBZGQgdGhlIHNlY3Rpb24gVk1BIGFuZCB0aGUgc3ltYm9sIHZhbHVlLiAgKi8KLQkJICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrIHMtPm91dHB1dF9vZmZzZXQpOwotCi0JCSAgLyogRm9yIGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiwgdGhlIG9iamVjdCBmaWxlCi0JCSAgICAgY3VycmVudGx5IGhvbGRzIGp1c3QgdGhlIGFkZGVuZC4gIFdlIG11c3QgYWRqdXN0Ci0JCSAgICAgYnkgdGhlIGFkZHJlc3MgdG8gZ2V0IHRoZSByaWdodCB2YWx1ZS4gICovCi0JCSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLQkJICAgIHsKLQkJICAgICAgcmVsb2NhdGlvbiAtPSBpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLQkJICAgICAgLyogSWYgd2UgYXJlIGNvbnZlcnRpbmcgYSBSRUxISSBvciBSRUxMTyByZWxvYwotCQkJIGZyb20gYmVpbmcgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wgdG8KLQkJCSBiZWluZyBhZ2FpbnN0IGEgc2VjdGlvbiwgd2UgbXVzdCBwdXQgYQotCQkJIHNwZWNpYWwgdmFsdWUgaW50byB0aGUgcl9vZmZzZXQgZmllbGQuICBUaGlzCi0JCQkgdmFsdWUgaXMgdGhlIG9sZCBhZGRlbmQuICBUaGUgcl9vZmZzZXQgZm9yCi0JCQkgYm90aCB0aGUgUkVMSEkgYW5kIFJFTExPIHJlbG9jcyBhcmUgdGhlIHNhbWUsCi0JCQkgYW5kIHdlIHNldCBib3RoIHdoZW4gd2Ugc2VlIFJFTEhJLiAgKi8KLQkJICAgICAgaWYgKGludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSkKLQkJCXsKLQkJCSAgbG9uZyBhZGRoaSwgYWRkbG87Ci0KLQkJCSAgYWRkaGkgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsCi0JCQkJCSAgICAgIChjb250ZW50cwotCQkJCQkgICAgICAgKyBhZGp1c3QKLQkJCQkJICAgICAgICsgaW50X3JlbC5yX3ZhZGRyCi0JCQkJCSAgICAgICAtIGlucHV0X3NlY3Rpb24tPnZtYSkpOwotCQkJICBhZGRoaSAmPSAweGZmZmY7Ci0JCQkgIGlmIChhZGRoaSAmIDB4ODAwMCkKLQkJCSAgICBhZGRoaSAtPSAweDEwMDAwOwotCQkJICBhZGRoaSA8PD0gMTY7Ci0KLQkJCSAgaWYgKCEgdXNlX2xvKQotCQkJICAgIGFkZGxvID0gMDsKLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLAotCQkJCQkJICAoY29udGVudHMKLQkJCQkJCSAgICsgYWRqdXN0Ci0JCQkJCQkgICArIGxvX2ludF9yZWwucl92YWRkcgotCQkJCQkJICAgLSBpbnB1dF9zZWN0aW9uLT52bWEpKTsKLQkJCSAgICAgIGFkZGxvICY9IDB4ZmZmZjsKLQkJCSAgICAgIGlmIChhZGRsbyAmIDB4ODAwMCkKLQkJCQlhZGRsbyAtPSAweDEwMDAwOwotCi0JCQkgICAgICBsb19pbnRfcmVsLnJfb2Zmc2V0ID0gYWRkaGkgKyBhZGRsbzsKLQkJCSAgICB9Ci0KLQkJCSAgaW50X3JlbC5yX29mZnNldCA9IGFkZGhpICsgYWRkbG87Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBoID0gTlVMTDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIENoYW5nZSB0aGUgc3ltbmR4IHZhbHVlIHRvIHRoZSByaWdodCBvbmUgZm9yIHRoZQotCQkgICAgIG91dHB1dCBCRkQuICAqLwotCQkgIGludF9yZWwucl9zeW1uZHggPSBoLT5pbmR4OwotCQkgIGlmIChpbnRfcmVsLnJfc3ltbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIHN5bWJvbCBpcyBub3QgYmVpbmcgd3JpdHRlbiBvdXQuICAqLwotCQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCQkgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGludF9yZWwucl9zeW1uZHggPSAwOwotCQkgICAgfQotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzZWN0aW9uLiAgQWRqdXN0IHRoZQotCQkgdmFsdWUgYnkgdGhlIGFtb3VudCB0aGUgc2VjdGlvbiBtb3ZlZC4gICovCi0JICAgICAgcmVsb2NhdGlvbiA9IChzLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgLSBzLT52bWEpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gKz0gYWRkZW5kOwotCSAgYWRkZW5kID0gMDsKLQotCSAgLyogQWRqdXN0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBieSByZW1vdmluZyB0aGUgcmVmZXJlbmNlCi0JICAgICB0byB0aGUgb3JpZ2luYWwgYWRkcmVzcyBpbiB0aGUgc2VjdGlvbiBhbmQgaW5jbHVkaW5nIHRoZQotCSAgICAgcmVmZXJlbmNlIHRvIHRoZSBuZXcgYWRkcmVzcy4gIEhvd2V2ZXIsIGV4dGVybmFsIFJFTEhJCi0JICAgICBhbmQgUkVMTE8gcmVsb2NzIGFyZSBQQyByZWxhdGl2ZSwgYnV0IGRvbid0IGluY2x1ZGUgYW55Ci0JICAgICByZWZlcmVuY2UgdG8gdGhlIGFkZHJlc3MuICBUaGUgYWRkZW5kIGlzIG1lcmVseSBhbgotCSAgICAgYWRkZW5kLiAgKi8KLQkgIGlmIChob3d0by0+cGNfcmVsYXRpdmUKLQkgICAgICAmJiAoISBpbnRfcmVsLnJfZXh0ZXJuCi0JCSAgfHwgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISQotCQkgICAgICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMTE8pKSkKLQkgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkgIC8qIEFkanVzdCB0aGUgY29udGVudHMuICAqLwotCSAgaWYgKHJlbG9jYXRpb24gPT0gMCkKLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVGSEkKLQkJICAmJiBpbnRfcmVsLnJfdHlwZSAhPSBNSVBTX1JfUkVMSEkpCi0JCXIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCQkgICAgKGNvbnRlbnRzCi0JCQkJCSAgICAgKyBhZGp1c3QKLQkJCQkJICAgICArIGludF9yZWwucl92YWRkcgotCQkJCQkgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbWlwc19yZWxvY2F0ZV9oaSAoJmludF9yZWwsCi0JCQkJICAgIHVzZV9sbyA/ICZsb19pbnRfcmVsIDogTlVMTCwKLQkJCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkgICAgYWRqdXN0LCByZWxvY2F0aW9uLAotCQkJCSAgICBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfUkVMSEkpOwotCQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3MuICAqLwotCSAgaW50X3JlbC5yX3ZhZGRyICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCSAgLyogU2F2ZSB0aGUgY2hhbmdlZCByZWxvYyBpbmZvcm1hdGlvbi4gICovCi0JICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2Nfb3V0IChpbnB1dF9iZmQsICZpbnRfcmVsLCAoUFRSKSBleHRfcmVsKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgYXJlIHByb2R1Y2luZyBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCSAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQl7Ci0JCSAgYXNlY3Rpb24gKmhzZWM7Ci0KLQkJICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgaHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgaHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCQkgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJCSAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgaW50X3JlbC5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLiAgKi8KLQkgICAgICByZWxvY2F0aW9uID0gKHMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICAtIHMtPnZtYSk7Ci0KLQkgICAgICAvKiBBIFBDIHJlbGF0aXZlIHJlbG9jIGlzIGFscmVhZHkgY29ycmVjdCBpbiB0aGUgb2JqZWN0Ci0JCSBmaWxlLiAgTWFrZSBpdCBsb29rIGxpa2UgYSBwY3JlbF9vZmZzZXQgcmVsb2NhdGlvbiBieQotCQkgYWRkaW5nIGluIHRoZSBzdGFydCBhZGRyZXNzLiAgKi8KLQkgICAgICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotCQl7Ci0JCSAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSB8fCAhIHVzZV9sbykKLQkJICAgIHJlbG9jYXRpb24gKz0gaW50X3JlbC5yX3ZhZGRyICsgYWRqdXN0OwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRpb24gKz0gbG9faW50X3JlbC5yX3ZhZGRyICsgYWRqdXN0OwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUZISQotCSAgICAgICYmIGludF9yZWwucl90eXBlICE9IE1JUFNfUl9SRUxISSkKLQkgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCi0JCQkJCSAgaW5wdXRfYmZkLAotCQkJCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgY29udGVudHMsCi0JCQkJCSAgKGludF9yZWwucl92YWRkcgotCQkJCQkgICAtIGlucHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgICArIGFkanVzdCksCi0JCQkJCSAgcmVsb2NhdGlvbiwKLQkJCQkJICBhZGRlbmQpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWlwc19yZWxvY2F0ZV9oaSAoJmludF9yZWwsCi0JCQkJdXNlX2xvID8gJmxvX2ludF9yZWwgOiBOVUxMLAotCQkJCWlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIGFkanVzdCwKLQkJCQlyZWxvY2F0aW9uLAotCQkJCWludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSk7Ci0JICAgICAgciA9IGJmZF9yZWxvY19vazsKLQkgICAgfQotCX0KLQotICAgICAgLyogTUlQU19SX0pNUEFERFIgcmVxdWlyZXMgcGVjdWxpYXIgb3ZlcmZsb3cgZGV0ZWN0aW9uLiAgVGhlCi0JIGluc3RydWN0aW9uIHByb3ZpZGVzIGEgMjggYml0IGFkZHJlc3MgKHRoZSB0d28gbG93ZXIgYml0cyBhcmUKLQkgaW1wbGljaXQgemVyb2VzKSB3aGljaCBpcyBjb21iaW5lZCB3aXRoIHRoZSB1cHBlciBmb3VyIGJpdHMKLQkgb2YgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MuICAqLwotICAgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rCi0JICAmJiBpbnRfcmVsLnJfdHlwZSA9PSBNSVBTX1JfSk1QQUREUgotCSAgJiYgKCgocmVsb2NhdGlvbgotCQkrIGFkZGVuZAotCQkrIChpbnRfcmVsLnJfZXh0ZXJuID8gMCA6IHMtPnZtYSkpCi0JICAgICAgICYgMHhmMDAwMDAwMCkKLQkgICAgICAhPSAoKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKGludF9yZWwucl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkKLQkJICAgKyBhZGp1c3QpCi0JCSAgJiAweGYwMDAwMDAwKSkpCi0JciA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGludF9yZWwucl9leHRlcm4pCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzKTsKLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQlpbnRfcmVsLnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLQotICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICBpZiAoc2VjdGlvbl90ZGF0YSA9PSAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzZWMtPnVzZWRfYnlfYmZkID0KLQkoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICAgICAgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICAgIHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzID0gTlVMTDsKLSAgICAgIHNlY3Rpb25fdGRhdGEtPm9mZnNldHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY3Nfc2l6ZTsKLQotICAgICAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSAoZWNvZmZfYmFja2VuZCAoYWJmZCktPmV4dGVybmFsX3JlbG9jX3NpemUKLQkJCSAgICAgICogc2VjLT5yZWxvY19jb3VudCk7Ci0KLSAgICAgIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyA9Ci0JKFBUUikgYmZkX2FsbG9jIChhYmZkLCBleHRlcm5hbF9yZWxvY3Nfc2l6ZSk7Ci0gICAgICBpZiAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgZXh0ZXJuYWxfcmVsb2NzX3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc2VjLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfcmVhZCAoc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzLCAxLAotCQkJZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2NzX3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbGF4IGEgc2VjdGlvbiB3aGVuIGxpbmtpbmcgYSBNSVBTIEVDT0ZGIGZpbGUuICBUaGlzIGlzIHVzZWQgZm9yCi0gICBlbWJlZGRlZCBQSUMgY29kZSwgd2hpY2ggYWx3YXlzIHVzZXMgUEMgcmVsYXRpdmUgYnJhbmNoZXMgd2hpY2gKLSAgIG9ubHkgaGF2ZSBhbiAxOCBiaXQgcmFuZ2Ugb24gTUlQUy4gIElmIGEgYnJhbmNoIGlzIG5vdCBpbiByYW5nZSwgd2UKLSAgIGdlbmVyYXRlIGEgbG9uZyBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB0byBjb21wZW5zYXRlLiAgRWFjaCB0aW1lIHdlCi0gICBmaW5kIGEgYnJhbmNoIHRvIGV4cGFuZCwgd2UgaGF2ZSB0byBjaGVjayBhbGwgdGhlIG90aGVycyBhZ2FpbiB0bwotICAgbWFrZSBzdXJlIHRoZXkgYXJlIHN0aWxsIGluIHJhbmdlLiAgVGhpcyBpcyBzbG93LCBidXQgaXQgb25seSBoYXMKLSAgIHRvIGJlIGRvbmUgd2hlbiAtcmVsYXggaXMgcGFzc2VkIHRvIHRoZSBsaW5rZXIuCi0KLSAgIFRoaXMgcm91dGluZSBmaWd1cmVzIG91dCB3aGljaCBicmFuY2hlcyBuZWVkIHRvIGV4cGFuZDsgdGhlIGFjdHVhbAotICAgZXhwYW5zaW9uIGlzIGRvbmUgaW4gbWlwc19yZWxvY2F0ZV9zZWN0aW9uIHdoZW4gdGhlIHNlY3Rpb24KLSAgIGNvbnRlbnRzIGFyZSByZWxvY2F0ZWQuICBUaGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBvZmZzZXRzCi0gICBmaWVsZCBvZiB0aGUgZWNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICBBbiBvZmZzZXQgb2YgMSBtZWFucwotICAgdGhhdCB0aGUgYnJhbmNoIG11c3QgYmUgZXhwYW5kZWQgaW50byBhIG11bHRpLWluc3RydWN0aW9uIFBDCi0gICByZWxhdGl2ZSBicmFuY2ggKHN1Y2ggYW4gb2Zmc2V0IHdpbGwgb25seSBvY2N1ciBmb3IgYSBQQyByZWxhdGl2ZQotICAgYnJhbmNoIHRvIGFuIGV4dGVybmFsIHN5bWJvbCkuICBBbnkgb3RoZXIgb2Zmc2V0IG11c3QgYmUgYSBtdWx0aXBsZQotICAgb2YgZm91ciwgYW5kIGlzIHRoZSBhbW91bnQgdG8gY2hhbmdlIHRoZSBicmFuY2ggYnkgKHN1Y2ggYW4gb2Zmc2V0Ci0gICB3aWxsIG9ubHkgb2NjdXIgZm9yIGEgUEMgcmVsYXRpdmUgYnJhbmNoIHdpdGhpbiB0aGUgc2FtZSBzZWN0aW9uKS4KLQotICAgV2UgZG8gbm90IG1vZGlmeSB0aGUgc2VjdGlvbiByZWxvY3Mgb3IgY29udGVudHMgdGhlbXNlbHZlcyBzbyB0aGF0Ci0gICBpZiBtZW1vcnkgdXNhZ2UgYmVjb21lcyBhbiBpc3N1ZSB3ZSBjYW4gZGlzY2FyZCB0aGVtIGFuZCByZWFkIHRoZW0KLSAgIGFnYWluLiAgVGhlIG9ubHkgaW5mb3JtYXRpb24gd2UgbXVzdCBzYXZlIGluIG1lbW9yeSBiZXR3ZWVuIHRoaXMKLSAgIHJvdXRpbmUgYW5kIHRoZSBtaXBzX3JlbG9jYXRlX3NlY3Rpb24gcm91dGluZSBpcyB0aGUgdGFibGUgb2YKLSAgIG9mZnNldHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGluZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY3Rpb25fdGRhdGE7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGxvbmcgKm9mZnNldHM7Ci0gIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqZXh0X3JlbDsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsX2VuZDsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogQXNzdW1lIHdlIGFyZSBub3QgZ29pbmcgdG8gbmVlZCBhbm90aGVyIHBhc3MuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgYW4gRUNPRkYgZmlsZSwgdGhpcyBpcyBtdWNoIHRvbwotICAgICBjb25mdXNpbmcgdG8gZGVhbCB3aXRoLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBhcmUgbm8gcmVsb2NzLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLiAgKi8KLSAgaWYgKHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIFBDIHJlbGF0aXZlIHJlbG9jcywgYW5kIHdoeSB3b3VsZCB0aGVyZQotICAgICBldmVyIGJlIG9uZSBmcm9tIGFueXRoaW5nIGJ1dCB0aGUgLnRleHQgc2VjdGlvbj8gICovCi0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnRleHQiKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFJlYWQgaW4gdGhlIHJlbG9jcywgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGdvdCB0aGVtLiAgKi8KLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKTsKLSAgaWYgKHNlY3Rpb25fdGRhdGEgPT0gKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICopIE5VTEwKLSAgICAgIHx8IHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIHNlYykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBzZWN0aW9uX3RkYXRhID0gZWNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpOwotICAgIH0KLQotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBtdXN0IGluaXRpYWxpemUgX2Nvb2tlZF9zaXplIG9ubHkgdGhlIGZpcnN0IHRpbWUgd2UgYXJlCi0JIGNhbGxlZC4gICovCi0gICAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotICAgIH0KLQotICBjb250ZW50cyA9IHNlY3Rpb25fdGRhdGEtPmNvbnRlbnRzOwotICBvZmZzZXRzID0gc2VjdGlvbl90ZGF0YS0+b2Zmc2V0czsKLQotICAvKiBMb29rIGZvciBhbnkgZXh0ZXJuYWwgUEMgcmVsYXRpdmUgcmVsb2NzLiAgSW50ZXJuYWwgUEMgcmVsYXRpdmUKLSAgICAgcmVsb2NzIGFyZSBhbHJlYWR5IGNvcnJlY3QgaW4gdGhlIG9iamVjdCBmaWxlLCBzbyB0aGV5IGNlcnRhaW5seQotICAgICBjYW4gbm90IG92ZXJmbG93LiAgKi8KLSAgZXh0X3JlbCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKikgc2VjdGlvbl90ZGF0YS0+ZXh0ZXJuYWxfcmVsb2NzOwotICBleHRfcmVsX2VuZCA9IGV4dF9yZWwgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGkgPSAwOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICpoc2VjOwotICAgICAgYmZkX3NpZ25lZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqYWRqX2V4dF9yZWw7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWRqX2k7Ci0gICAgICB1bnNpZ25lZCBsb25nIGV4dF9jb3VudDsKLSAgICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiphZGpfaF9wdHI7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqYWRqX2hfcHRyX2VuZDsKLSAgICAgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLQotICAgICAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IGV4cGFuZGVkIHRoaXMgcmVsb2MsIHdlIGNlcnRhaW5seSBkb24ndAotCSBuZWVkIHRvIGRvIGl0IGFnYWluLiAgKi8KLSAgICAgIGlmIChvZmZzZXRzICE9IChsb25nICopIE5VTEwgJiYgb2Zmc2V0c1tpXSA9PSAxKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBRdWlja2x5IGNoZWNrIHRoYXQgdGhpcyByZWxvYyBpcyBleHRlcm5hbCBQQ1JFTDE2LiAgKi8KLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotCXsKLQkgIGlmICgoZXh0X3JlbC0+cl9iaXRzWzNdICYgUkVMT0NfQklUUzNfRVhURVJOX0JJRykgPT0gMAotCSAgICAgIHx8ICgoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX1RZUEVfQklHKQotCQkgICA+PiBSRUxPQ19CSVRTM19UWVBFX1NIX0JJRykKLQkJICAhPSBNSVBTX1JfUENSRUwxNikpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKGV4dF9yZWwtPnJfYml0c1szXSAmIFJFTE9DX0JJVFMzX0VYVEVSTl9MSVRUTEUpID09IDAKLQkgICAgICB8fCAoKChleHRfcmVsLT5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19UWVBFX0xJVFRMRSkKLQkJICAgPj4gUkVMT0NfQklUUzNfVFlQRV9TSF9MSVRUTEUpCi0JCSAgIT0gTUlQU19SX1BDUkVMMTYpKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKFBUUikgZXh0X3JlbCwgJmludF9yZWwpOwotCi0gICAgICBoID0gZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07Ci0gICAgICBpZiAoaCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAvKiBKdXN0IGlnbm9yZSB1bmRlZmluZWQgc3ltYm9scy4gIFRoZXNlIHdpbGwgcHJlc3VtYWJseQotCSAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgbGF0ZXIgaW4gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICAqLwotICAgICAgaHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGhzZWMtPm91dHB1dF9vZmZzZXQpOwotCi0gICAgICAvKiBTdWJ0cmFjdCBvdXQgdGhlIGN1cnJlbnQgYWRkcmVzcy4gICovCi0gICAgICByZWxvY2F0aW9uIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgKGludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKSk7Ci0KLSAgICAgIC8qIFRoZSBhZGRlbmQgaXMgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZS4gIEluIHRoZSBub3JtYWwgY2FzZQotCSBvZiBgYGJhbCBzeW1ib2wnJywgdGhlIGFkZGVuZCB3aWxsIGJlIC00LiAgSXQgd2lsbCBvbmx5IGJlCi0JIGRpZmZlcmVudCBpbiB0aGUgY2FzZSBvZiBgYGJhbCBzeW1ib2wrY29uc3RhbnQnJy4gIFRvIGF2b2lkCi0JIGFsd2F5cyByZWFkaW5nIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCB3ZSBkb24ndCBjaGVjayB0aGUKLQkgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZSAod2UgY291bGQgZWFzaWx5IGNoZWNrIHRoZSBjb250ZW50cwotCSBpZiB3ZSBoYXBwZW4gdG8gaGF2ZSBhbHJlYWR5IHJlYWQgdGhlbSBpbiwgYnV0IEkgZmVhciB0aGF0Ci0JIHRoaXMgY291bGQgYmUgY29uZnVzaW5nKS4gIFRoaXMgbWVhbnMgd2Ugd2lsbCBzY3JldyB1cCBpZgotCSB0aGVyZSBpcyBhIGJyYW5jaCB0byBhIHN5bWJvbCB0aGF0IGlzIGluIHJhbmdlLCBidXQgYWRkZWQgdG8KLQkgYSBjb25zdGFudCB3aGljaCBwdXRzIGl0IG91dCBvZiByYW5nZTsgaW4gc3VjaCBhIGNhc2UgdGhlCi0JIGxpbmsgd2lsbCBmYWlsIHdpdGggYSByZWxvYyBvdmVyZmxvdyBlcnJvci4gIFNpbmNlIHRoZQotCSBjb21waWxlciB3aWxsIG5ldmVyIGdlbmVyYXRlIHN1Y2ggY29kZSwgaXQgc2hvdWxkIGJlIGVhc3kKLQkgZW5vdWdoIHRvIHdvcmsgYXJvdW5kIGl0IGJ5IGNoYW5naW5nIHRoZSBhc3NlbWJseSBjb2RlIGluIHRoZQotCSBzb3VyY2UgZmlsZS4gICovCi0gICAgICByZWxvY2F0aW9uIC09IDQ7Ci0KLSAgICAgIC8qIE5vdyBSRUxPQ0FUSU9OIGlzIHRoZSBudW1iZXIgd2Ugd2FudCB0byBwdXQgaW4gdGhlIG9iamVjdAotCSBmaWxlLiAgU2VlIHdoZXRoZXIgaXQgZml0cy4gICovCi0gICAgICBpZiAocmVsb2NhdGlvbiA+PSAtMHgyMDAwMCAmJiByZWxvY2F0aW9uIDwgMHgyMDAwMCkKLQljb250aW51ZTsKLQotICAgICAgLyogTm93IHRoYXQgd2Uga25vdyB0aGlzIHJlbG9jIG5lZWRzIHdvcmssIHdoaWNoIHdpbGwgcmFyZWx5Ci0JIGhhcHBlbiwgZ28gYWhlYWQgYW5kIGdyYWIgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCXsKLQkgIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLQkgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzZWMtPl9yYXdfc2l6ZSk7Ci0JICBlbHNlCi0JICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHNlYy0+X3Jhd19zaXplKTsKLQkgIGlmIChjb250ZW50cyA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgKFBUUikgY29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBzZWN0aW9uX3RkYXRhLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLQotICAgICAgLyogV2Ugb25seSBzdXBwb3J0IGNoYW5naW5nIHRoZSBiYWwgaW5zdHJ1Y3Rpb24uICBJdCB3b3VsZCBiZQotCSBwb3NzaWJsZSB0byBoYW5kbGUgb3RoZXIgUEMgcmVsYXRpdmUgYnJhbmNoZXMsIGJ1dCBzb21lIG9mCi0JIHRoZW0gKHRoZSBjb25kaXRpb25hbCBicmFuY2hlcykgd291bGQgcmVxdWlyZSBhIGRpZmZlcmVudAotCSBsZW5ndGggaW5zdHJ1Y3Rpb24gc2VxdWVuY2Ugd2hpY2ggd291bGQgY29tcGxpY2F0ZSBib3RoIHRoaXMKLQkgcm91dGluZSBhbmQgbWlwc19yZWxheF9wY3JlbDE2LiAgSXQgY291bGQgYmUgd3JpdHRlbiBpZgotCSBzb21lYm9keSBmZWx0IGl0IHdlcmUgaW1wb3J0YW50LiAgSWdub3JpbmcgdGhpcyByZWxvYyB3aWxsCi0JIHByZXN1bWFibHkgY2F1c2UgYSByZWxvYyBvdmVyZmxvdyBlcnJvciBsYXRlciBvbi4gICovCi0gICAgICBpZiAoYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBpbnRfcmVsLnJfdmFkZHIgLSBzZWMtPnZtYSkKLQkgICE9IDB4MDQxMWZmZmYpIC8qIGJnZXphbCAkMCwuID09IGJhbCAuICovCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEJvdGhlci4gIFdlIG5lZWQgdG8gZXhwYW5kIHRoaXMgcmVsb2MsIGFuZCB3ZSB3aWxsIG5lZWQgdG8KLQkgbWFrZSBhbm90aGVyIHJlbGF4YXRpb24gcGFzcyBzaW5jZSB0aGlzIGNoYW5nZSBtYXkgcHV0IG90aGVyCi0JIHJlbG9jcyBvdXQgb2YgcmFuZ2UuICBXZSBuZWVkIHRvIGV4YW1pbmUgdGhlIGxvY2FsIGJyYW5jaGVzCi0JIGFuZCB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBvZmZzZXRzIHdlIG11c3QKLQkgYWRkIHRvIHRoZW0uICBXZSBhbHNvIG5lZWQgdG8gYWRqdXN0IHRoZSB2YWx1ZXMgb2YgYWxsCi0JIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlIGZvbGxvd2luZyB0aGlzIGxvY2F0aW9uLiAgKi8KLQotICAgICAgc2VjLT5fY29va2VkX3NpemUgKz0gUENSRUwxNl9FWFBBTlNJT05fQURKVVNUTUVOVDsKLSAgICAgICphZ2FpbiA9IHRydWU7Ci0KLSAgICAgIGlmIChvZmZzZXRzID09IChsb25nICopIE5VTEwpCi0JewotCSAgc2l6ZV90IHNpemU7Ci0KLQkgIHNpemUgPSBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChsb25nKTsKLQkgIG9mZnNldHMgPSAobG9uZyAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCSAgaWYgKG9mZnNldHMgPT0gKGxvbmcgKikgTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtZW1zZXQgKG9mZnNldHMsIDAsIHNpemUpOwotCSAgc2VjdGlvbl90ZGF0YS0+b2Zmc2V0cyA9IG9mZnNldHM7Ci0JfQotCi0gICAgICBvZmZzZXRzW2ldID0gMTsKLQotICAgICAgLyogTm93IGxvb2sgZm9yIGFsbCBQQyByZWxhdGl2ZSByZWZlcmVuY2VzIHRoYXQgY3Jvc3MgdGhpcyByZWxvYwotCSBhbmQgYWRqdXN0IHRoZWlyIG9mZnNldHMuICAqLwotICAgICAgYWRqX2V4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgICAgIGZvciAoYWRqX2kgPSAwOyBhZGpfZXh0X3JlbCA8IGV4dF9yZWxfZW5kOyBhZGpfZXh0X3JlbCsrLCBhZGpfaSsrKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBhZGpfaW50X3JlbDsKLQkgIGJmZF92bWEgc3RhcnQsIHN0b3A7Ci0JICBpbnQgY2hhbmdlOwotCi0JICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGFkal9leHRfcmVsLCAmYWRqX2ludF9yZWwpOwotCi0JICBpZiAoYWRqX2ludF9yZWwucl90eXBlID09IE1JUFNfUl9QQ1JFTDE2KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0JICAgICAgLyogV2Ugb25seSBjYXJlIGFib3V0IGxvY2FsIHJlZmVyZW5jZXMuICBFeHRlcm5hbCBvbmVzCi0JCSB3aWxsIGJlIHJlbG9jYXRlZCBjb3JyZWN0bHkgYW55aG93LiAgKi8KLQkgICAgICBpZiAoYWRqX2ludF9yZWwucl9leHRlcm4pCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBhIFBDIHJlbGF0aXZlIHJlbG9jIHdpdGhpbgotCQkgdGhpcyBzZWN0aW9uLiAgRklYTUU6IENyb3NzIHNlY3Rpb24gUEMgcmVsYXRpdmUKLQkJIHJlbG9jcyBtYXkgbm90IGJlIGhhbmRsZWQgY29ycmVjdGx5OyBkb2VzIGFueWJvZHkKLQkJIGNhcmU/ICAqLwotCSAgICAgIGlmIChhZGpfaW50X3JlbC5yX3N5bW5keCAhPSBSRUxPQ19TRUNUSU9OX1RFWFQpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgc3RhcnQgPSBhZGpfaW50X3JlbC5yX3ZhZGRyOwotCi0JICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsCi0JCQkJIGNvbnRlbnRzICsgYWRqX2ludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKTsKLQotCSAgICAgIHN0b3AgPSAoaW5zbiAmIDB4ZmZmZikgPDwgMjsKLQkgICAgICBpZiAoKHN0b3AgJiAweDIwMDAwKSAhPSAwKQotCQlzdG9wIC09IDB4NDAwMDA7Ci0JICAgICAgc3RvcCArPSBhZGpfaW50X3JlbC5yX3ZhZGRyICsgNDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWRqX2ludF9yZWwucl90eXBlID09IE1JUFNfUl9SRUxISSkKLQkgICAgewotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyByZWxsbzsKLQkgICAgICBsb25nIGFkZGhpLCBhZGRsbzsKLQotCSAgICAgIC8qIFRoZSBuZXh0IHJlbG9jIG11c3QgYmUgTUlQU19SX1JFTExPLCBhbmQgd2UgaGFuZGxlCi0JCSB0aGVtIHRvZ2V0aGVyLiAgKi8KLQkgICAgICBCRkRfQVNTRVJUIChhZGpfZXh0X3JlbCArIDEgPCBleHRfcmVsX2VuZCk7Ci0KLQkgICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIChhZGpfZXh0X3JlbCArIDEpLCAmcmVsbG8pOwotCi0JICAgICAgQkZEX0FTU0VSVCAocmVsbG8ucl90eXBlID09IE1JUFNfUl9SRUxMTyk7Ci0JICAgICAgCi0JICAgICAgYWRkaGkgPSBiZmRfZ2V0XzMyIChhYmZkLAotCQkJCSAgIGNvbnRlbnRzICsgYWRqX2ludF9yZWwucl92YWRkciAtIHNlYy0+dm1hKTsKLQkgICAgICBhZGRoaSAmPSAweGZmZmY7Ci0JICAgICAgaWYgKGFkZGhpICYgMHg4MDAwKQotCQlhZGRoaSAtPSAweDEwMDAwOwotCSAgICAgIGFkZGhpIDw8PSAxNjsKLQotCSAgICAgIGFkZGxvID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyByZWxsby5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCSAgICAgIGFkZGxvICY9IDB4ZmZmZjsKLQkgICAgICBpZiAoYWRkbG8gJiAweDgwMDApCi0JCWFkZGxvIC09IDB4MTAwMDA7Ci0KLQkgICAgICBpZiAoYWRqX2ludF9yZWwucl9leHRlcm4pCi0JCXsKLQkJICAvKiBUaGUgdmFsdWUgd2Ugd2FudCBoZXJlIGlzCi0JCSAgICAgICBzeW0gLSBSRUxMT2FkZHIgKyBhZGRlbmQKLQkJICAgICB3aGljaCB3ZSBjYW4gZXhwcmVzcyBhcwotCQkgICAgICAgc3ltIC0gKFJFTExPYWRkciAtIGFkZGVuZCkKLQkJICAgICBUaGVyZWZvcmUgaWYgd2UgYXJlIGV4cGFuZGluZyB0aGUgYXJlYSBiZXR3ZWVuCi0JCSAgICAgUkVMTE9hZGRyIGFuZCBSRUxMT2FkZHIgLSBhZGRlbmQgd2UgbXVzdCBhZGp1c3QKLQkJICAgICB0aGUgYWRkZW5kLiAgVGhpcyBpcyBhZG1pdHRlZGx5IGFtYmlndW91cywgc2luY2UKLQkJICAgICB3ZSBtaWdodCBtZWFuIChzeW0gKyBhZGRlbmQpIC0gUkVMTE9hZGRyLCBidXQgaW4KLQkJICAgICBwcmFjdGljZSB3ZSBkb24ndCwgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBoYW5kbGUKLQkJICAgICB0aGF0IGNhc2UgY29ycmVjdGx5IHNpbmNlIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZQotCQkgICAgIG5vIGlkZWEgd2hldGhlciBhbnkgcmVsb2MgaXMgYmVpbmcgZXhwYW5kZWQKLQkJICAgICBiZXR3ZWVuIHN5bSBhbmQgc3ltICsgYWRkZW5kLiAgKi8KLQkJICBzdGFydCA9IHJlbGxvLnJfdmFkZHIgLSAoYWRkaGkgKyBhZGRsbyk7Ci0JCSAgc3RvcCA9IHJlbGxvLnJfdmFkZHI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBBbiBpbnRlcm5hbCBSRUxISS9SRUxMTyBwYWlyIHJlcHJlc2VudHMgdGhlCi0JCSAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhZGRyZXNzZXMsICRMQzAgLSBmb28uCi0JCSAgICAgVGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSB0aGUgZGlmZmVyZW5jZQotCQkgICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kICRMQzAuICBUaGlzIGxldHMgdXMKLQkJICAgICBjb21wdXRlICRMQzAsIGFuZCwgYnkgY29uc2lkZXJpbmcgdGhlIGFkZGVuZCwKLQkJICAgICBmb28uICBJZiB0aGUgcmVsb2Mgd2UgYXJlIGV4cGFuZGluZyBmYWxscyBiZXR3ZWVuCi0JCSAgICAgdGhvc2UgdHdvIHJlbG9jcywgd2UgbXVzdCBhZGp1c3QgdGhlIGFkZGVuZC4gIEF0Ci0JCSAgICAgdGhpcyBwb2ludCwgdGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSBpbiB0aGUKLQkJICAgICByX29mZnNldCBmaWVsZCwgd2hlcmUgaXQgd2FzIHB1dCBieQotCQkgICAgIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCi0JCSAgc3RhcnQgPSByZWxsby5yX3ZhZGRyIC0gYWRqX2ludF9yZWwucl9vZmZzZXQ7Ci0JCSAgc3RvcCA9IHN0YXJ0ICsgYWRkaGkgKyBhZGRsbzsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1NXSVRDSCkKLQkgICAgewotCSAgICAgIC8qIEEgTUlQU19SX1NXSVRDSCByZWxvYyByZXByZXNlbnRzIGEgd29yZCBvZiB0aGUgZm9ybQotCQkgICAud29yZCAkTDMtJExTMTIKLQkJIFRoZSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGZpbGUgaXMgY29ycmVjdCwgYXNzdW1pbmcgdGhlCi0JCSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMuICBUaGUgc3ltbmR4IHZhbHVlIGlzIGFjdHVhbGx5Ci0JCSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWxvYyBhZGRyZXNzIGFuZCAkTFMxMi4KLQkJIFRoaXMgbGV0cyB1cyBjb21wdXRlIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTFMxMiBhcwotCQkgICB2YWRkciAtIHN5bW5keAotCQkgYW5kIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDMgYXMKLQkJICAgdmFkZHIgLSBzeW1uZHggKyBhZGRlbmQKLQkJIHdoZXJlIGFkZGVuZCBpcyB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICBBdAotCQkgdGhpcyBwb2ludCwgdGhlIHN5bW5keCB2YWx1ZSBpcyBhY3R1YWxseSBmb3VuZCBpbiB0aGUKLQkJIHJfb2Zmc2V0IGZpZWxkLCBzaW5jZSBpdCB3YXMgbW92ZWQgYnkKLQkJIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19pbi4gICovCi0JICAgICAgc3RhcnQgPSBhZGpfaW50X3JlbC5yX3ZhZGRyIC0gYWRqX2ludF9yZWwucl9vZmZzZXQ7Ci0JICAgICAgc3RvcCA9IHN0YXJ0ICsgYmZkX2dldF8zMiAoYWJmZCwKLQkJCQkJIChjb250ZW50cwotCQkJCQkgICsgYWRqX2ludF9yZWwucl92YWRkcgotCQkJCQkgIC0gc2VjLT52bWEpKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhlIHJhbmdlIGV4cHJlc3NlZCBieSB0aGlzIHJlbG9jLCB3aGljaCBpcyB0aGUKLQkgICAgIGRpc3RhbmNlIGJldHdlZW4gU1RBUlQgYW5kIFNUT1AgY3Jvc3NlcyB0aGUgcmVsb2Mgd2UgYXJlCi0JICAgICBleHBhbmRpbmcsIHdlIG11c3QgYWRqdXN0IHRoZSBvZmZzZXQuICBUaGUgc2lnbiBvZiB0aGUKLQkgICAgIGFkanVzdG1lbnQgZGVwZW5kcyB1cG9uIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHJhbmdlCi0JICAgICBjcm9zc2VzIHRoZSByZWxvYyBiZWluZyBleHBhbmRlZC4gICovCi0JICBpZiAoc3RhcnQgPD0gaW50X3JlbC5yX3ZhZGRyICYmIHN0b3AgPiBpbnRfcmVsLnJfdmFkZHIpCi0JICAgIGNoYW5nZSA9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JICBlbHNlIGlmIChzdGFydCA+IGludF9yZWwucl92YWRkciAmJiBzdG9wIDw9IGludF9yZWwucl92YWRkcikKLQkgICAgY2hhbmdlID0gLSBQQ1JFTDE2X0VYUEFOU0lPTl9BREpVU1RNRU5UOwotCSAgZWxzZQotCSAgICBjaGFuZ2UgPSAwOwotCi0JICBvZmZzZXRzW2Fkal9pXSArPSBjaGFuZ2U7Ci0KLQkgIGlmIChhZGpfaW50X3JlbC5yX3R5cGUgPT0gTUlQU19SX1JFTEhJKQotCSAgICB7Ci0JICAgICAgYWRqX2V4dF9yZWwrKzsKLQkgICAgICBhZGpfaSsrOwotCSAgICAgIG9mZnNldHNbYWRqX2ldICs9IGNoYW5nZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogRmluZCBhbGwgc3ltYm9scyBpbiB0aGlzIHNlY3Rpb24gZGVmaW5lZCBieSB0aGlzIG9iamVjdCBmaWxlCi0JIGFuZCBhZGp1c3QgdGhlaXIgdmFsdWVzLiAgTm90ZSB0aGF0IHdlIGRlY2lkZSB3aGV0aGVyIHRvCi0JIGFkanVzdCB0aGUgdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgRUNPRkYgRVhUUgotCSBzdHJ1Y3R1cmUsIGJlY2F1c2UgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgaGFzaCB0YWJsZSBtYXkKLQkgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgYW4gZWFybGllciBleHBhbmRlZCByZWxvYyBhbmQgdGh1cyBtYXkKLQkgbm8gbG9uZ2VyIGNvcnJlY3RseSBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgYmVmb3JlIG9yCi0JIGFmdGVyIHRoZSBleHBhbmRlZCByZWxvYy4gICovCi0gICAgICBleHRfY291bnQgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLSAgICAgIGFkal9oX3B0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOwotICAgICAgYWRqX2hfcHRyX2VuZCA9IGFkal9oX3B0ciArIGV4dF9jb3VudDsKLSAgICAgIGZvciAoOyBhZGpfaF9wdHIgPCBhZGpfaF9wdHJfZW5kOyBhZGpfaF9wdHIrKykKLQl7Ci0JICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICphZGpfaDsKLQotCSAgYWRqX2ggPSAqYWRqX2hfcHRyOwotCSAgaWYgKGFkal9oICE9IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiAoYWRqX2gtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBhZGpfaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAmJiBhZGpfaC0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgICAgICYmIGFkal9oLT5lc3ltLmFzeW0udmFsdWUgPiBpbnRfcmVsLnJfdmFkZHIpCi0JICAgIGFkal9oLT5yb290LnUuZGVmLnZhbHVlICs9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0JfQotCi0gICAgICAvKiBBZGQgYW4gZW50cnkgdG8gdGhlIHN5bWJvbCB2YWx1ZSBhZGp1c3QgbGlzdC4gIFRoaXMgaXMgdXNlZAotCSBieSBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZSB0byBhZGp1c3QgdGhlIHZhbHVlcyBvZgotCSBpbnRlcm5hbCBzeW1ib2xzIGFuZCBGRFIncy4gICovCi0gICAgICBhZGp1c3QgPSAoKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikKLQkJYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QpKSk7Ci0gICAgICBpZiAoYWRqdXN0ID09IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGFkanVzdC0+c3RhcnQgPSBpbnRfcmVsLnJfdmFkZHI7Ci0gICAgICBhZGp1c3QtPmVuZCA9IHNlYy0+dm1hICsgc2VjLT5fcmF3X3NpemU7Ci0gICAgICBhZGp1c3QtPmFkanVzdCA9IFBDUkVMMTZfRVhQQU5TSU9OX0FESlVTVE1FTlQ7Ci0KLSAgICAgIGFkanVzdC0+bmV4dCA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmFkanVzdDsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmFkanVzdCA9IGFkanVzdDsKLSAgICB9Ci0KLSAgaWYgKGNvbnRlbnRzICE9IChiZmRfYnl0ZSAqKSBOVUxMICYmICEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZSAoY29udGVudHMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gKGJmZF9ieXRlICopIE5VTEwgJiYgISBpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIG1pcHNfcmVsb2NhdGVfc2VjdGlvbiB3aGVuIGEgUEMKLSAgIHJlbGF0aXZlIHJlbG9jIG11c3QgYmUgZXhwYW5kZWQgaW50byB0aGUgZml2ZSBpbnN0cnVjdGlvbiBzZXF1ZW5jZS4KLSAgIEl0IGhhbmRsZXMgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBleHBhbnNpb24sIGluY2x1ZGluZyByZXNvbHZpbmcKLSAgIHRoZSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX3JlbGF4X3BjcmVsMTYgKGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgaCwgbG9jYXRpb24sIGFkZHJlc3MpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogMHgwNDExZmZmZiBpcyBiZ2V6YWwgJDAsLiA9PSBiYWwgLiAgKi8KLSAgQkZEX0FTU0VSVCAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBsb2NhdGlvbikgPT0gMHgwNDExZmZmZik7Ci0KLSAgLyogV2UgbmVlZCB0byBjb21wdXRlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgYW5kIHRoZQotICAgICBjdXJyZW50IGFkZHJlc3MgcGx1cyBlaWdodC4gICovCi0gIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gIHJlbG9jYXRpb24gLT0gYWRkcmVzcyArIDg7Ci0KLSAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgbmVnYXRpdmUsIGluY3JlbWVudCB0aGUgdXBwZXIgMTYgaGFsZi4gICovCi0gIGlmICgocmVsb2NhdGlvbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZWxvY2F0aW9uICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDA0MTEwMDAxLCBsb2NhdGlvbik7IC8qIGJhbCAuKzggKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIDB4M2MwMTAwMDAgfCAoKHJlbG9jYXRpb24gPj4gMTYpICYgMHhmZmZmKSwgLyogbHVpICRhdCxYWCAqLwotCSAgICAgIGxvY2F0aW9uICsgNCk7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwKLQkgICAgICAweDI0MjEwMDAwIHwgKHJlbG9jYXRpb24gJiAweGZmZmYpLCAvKiBhZGRpdSAkYXQsJGF0LFhYICovCi0JICAgICAgbG9jYXRpb24gKyA4KTsKLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDAwM2YwODIxLCBsb2NhdGlvbiArIDEyKTsgLyogYWRkdSAkYXQsJGF0LCRyYSAqLwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIDB4MDAyMGY4MDksIGxvY2F0aW9uICsgMTYpOyAvKiBqYWxyICRhdCAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBHaXZlbiBhIC5zZGF0YSBzZWN0aW9uIGFuZCBhIC5yZWwuc2RhdGEgaW4tbWVtb3J5IHNlY3Rpb24sIHN0b3JlCi0gICByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGludG8gdGhlIC5yZWwuc2RhdGEgc2VjdGlvbiB3aGljaCBjYW4gYmUKLSAgIHVzZWQgYXQgcnVudGltZSB0byByZWxvY2F0ZSB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZQotICAgbGlua2VyIHdoZW4gdGhlIC0tZW1iZWRkZWQtcmVsb2NzIHN3aXRjaCBpcyB1c2VkLiAgVGhpcyBpcyBjYWxsZWQKLSAgIGFmdGVyIHRoZSBhZGRfc3ltYm9scyBlbnRyeSBwb2ludCBoYXMgYmVlbiBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIG9iamVjdHMsIGFuZCBiZWZvcmUgdGhlIGZpbmFsX2xpbmsgZW50cnkgcG9pbnQgaXMgY2FsbGVkLiAgVGhpcwotICAgZnVuY3Rpb24gcHJlc3VtZXMgdGhhdCB0aGUgb2JqZWN0IHdhcyBjb21waWxlZCB1c2luZwotICAgLW1lbWJlZGRlZC1waWMuICAqLwotCi1ib29sZWFuCi1iZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCBpbmZvLCBkYXRhc2VjLCByZWxzZWMsIGVycm1zZykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gICAgIGFzZWN0aW9uICpyZWxzZWM7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICpleHRfcmVsOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9yZWxfZW5kOwotICBiZmRfYnl0ZSAqcDsKLQotICBCRkRfQVNTRVJUICghIGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0KLSAgKmVycm1zZyA9IE5VTEw7Ci0KLSAgaWYgKGRhdGFzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltX2hhc2hlcyA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzOwotCi0gIGlmICghIG1pcHNfcmVhZF9yZWxvY3MgKGFiZmQsIGRhdGFzZWMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZWxzZWMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YXNlYy0+cmVsb2NfY291bnQgKiA0KTsKLSAgaWYgKHJlbHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcCA9IHJlbHNlYy0+Y29udGVudHM7Ci0KLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZGF0YXNlYyk7Ci0gIGV4dF9yZWwgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZXh0X3JlbF9lbmQgPSBleHRfcmVsICsgZGF0YXNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBleHRfcmVsIDwgZXh0X3JlbF9lbmQ7IGV4dF9yZWwrKywgcCArPSA0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRfcmVsOwotICAgICAgYm9vbGVhbiB0ZXh0X3JlbGF0aXZlOwotCi0gICAgICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGV4dF9yZWwsICZpbnRfcmVsKTsKLQotICAgICAgLyogV2UgYXJlIGdvaW5nIHRvIHdyaXRlIGEgZm91ciBieXRlIHdvcmQgaW50byB0aGUgcnVudGltZSByZWxvYwotCSBzZWN0aW9uLiAgVGhlIHdvcmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBpbiB0aGUgZGF0YSBzZWN0aW9uCi0JIHdoaWNoIG11c3QgYmUgcmVsb2NhdGVkLiAgVGhpcyBtdXN0IGJlIG9uIGEgd29yZCBib3VuZGFyeSwKLQkgd2hpY2ggbWVhbnMgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4gIFdlIHVzZSB0aGUKLQkgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGluZGljYXRlIGhvdyB0aGUgdmFsdWUgaW4gdGhlIGRhdGEKLQkgc2VjdGlvbiBtdXN0IGJlIHJlbG9jYXRlZC4gIEEgMCBtZWFucyB0aGF0IHRoZSB2YWx1ZSBpcwotCSByZWxhdGl2ZSB0byB0aGUgdGV4dCBzZWN0aW9uLCB3aGlsZSBhIDEgaW5kaWNhdGVzIHRoYXQgdGhlCi0JIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBkYXRhIHNlY3Rpb24uICBHaXZlbiB0aGF0IHdlIGFyZQotCSBhc3N1bWluZyB0aGUgY29kZSB3YXMgY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMsIHRoZXJlCi0JIHNob3VsZCBub3QgYmUgYW55IG90aGVyIHBvc3NpYmlsaXRpZXMuICAqLwotCi0gICAgICAvKiBXZSBjYW4gb25seSByZWxvY2F0ZSBSRUZXT1JEIHJlbG9jcyBhdCBydW4gdGltZS4gICovCi0gICAgICBpZiAoaW50X3JlbC5yX3R5cGUgIT0gTUlQU19SX1JFRldPUkQpCi0JewotCSAgKmVycm1zZyA9IF8oInVuc3VwcG9ydGVkIHJlbG9jIHR5cGUiKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGludF9yZWwucl9leHRlcm4pCi0JewotCSAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IHN5bV9oYXNoZXNbaW50X3JlbC5yX3N5bW5keF07Ci0JICAvKiBJZiBoIGlzIE5VTEwsIHRoYXQgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHJlbG9jIGFnYWluc3QgYW4KLQkgICAgIGV4dGVybmFsIHN5bWJvbCB3aGljaCB3ZSB0aG91Z2h0IHdhcyBqdXN0IGEgZGVidWdnaW5nCi0JICAgICBzeW1ib2wuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuLiAgKi8KLQkgIGlmIChoID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgaWYgKChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQkgICAgdGV4dF9yZWxhdGl2ZSA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHRleHRfcmVsYXRpdmUgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpbnRfcmVsLnJfc3ltbmR4KQotCSAgICB7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9URVhUOgotCSAgICAgIHRleHRfcmVsYXRpdmUgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9TQlNTOgotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODoKLQkgICAgICB0ZXh0X3JlbGF0aXZlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgLyogTm8gb3RoZXIgc2VjdGlvbnMgc2hvdWxkIGFwcGVhciBpbiAtbWVtYmVkZGVkLXBpYwotICAgICAgICAgICAgICAgICBjb2RlLiAgKi8KLQkgICAgICAqZXJybXNnID0gXygicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIik7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGludF9yZWwucl9vZmZzZXQgJiAzKSAhPSAwKQotCXsKLQkgICplcnJtc2cgPSBfKCJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLAotCQkgIChpbnRfcmVsLnJfdmFkZHIgLSBkYXRhc2VjLT52bWEgKyBkYXRhc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgKHRleHRfcmVsYXRpdmUgPyAwIDogMSkpLAotCQkgIHApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgdGhlIEVDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgVGhlIGJhY2tlbmQgZmllbGQgb2YgdGhlCi0gICB0YXJnZXQgdmVjdG9yIHBvaW50cyB0byB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgbWlwc19lY29mZl9iYWNrZW5kX2RhdGEgPQotewotICAvKiBDT0ZGIGJhY2tlbmQgc3RydWN0dXJlLiAgKi8KLSAgewotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsaW50LGludCxpbnQsaW50LFBUUikpKSBiZmRfdm9pZCwgLyogYXV4X2luICovCi0gICAgKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9pbiAqLwotICAgICh2b2lkICgqKSBQQVJBTVMgKChiZmQgKixQVFIsUFRSKSkpIGJmZF92b2lkLCAvKiBsaW5lbm9faW4gKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixpbnQsaW50LGludCxpbnQsUFRSKSkpYmZkX3ZvaWQsLyphdXhfb3V0Ki8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHN5bV9vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIGxpbmVub19vdXQgKi8KLSAgICAodW5zaWduZWQgKCopIFBBUkFNUyAoKGJmZCAqLFBUUixQVFIpKSkgYmZkX3ZvaWQsIC8qIHJlbG9jX291dCAqLwotICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX291dCwgbWlwc19lY29mZl9zd2FwX2FvdXRoZHJfb3V0LAotICAgIG1pcHNfZWNvZmZfc3dhcF9zY25oZHJfb3V0LAotICAgIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIDAsIDAsIDAsIDAsIHRydWUsIGZhbHNlLCA0LAotICAgIG1pcHNfZWNvZmZfc3dhcF9maWxlaGRyX2luLCBtaXBzX2Vjb2ZmX3N3YXBfYW91dGhkcl9pbiwKLSAgICBtaXBzX2Vjb2ZmX3N3YXBfc2NuaGRyX2luLCBOVUxMLAotICAgIG1pcHNfZWNvZmZfYmFkX2Zvcm1hdF9ob29rLCBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywKLSAgICBfYmZkX2Vjb2ZmX21rb2JqZWN0X2hvb2ssIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MsCi0gICAgX2JmZF9lY29mZl9zZXRfYWxpZ25tZW50X2hvb2ssIF9iZmRfZWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLAotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKLSAgfSwKLSAgLyogU3VwcG9ydGVkIGFyY2hpdGVjdHVyZS4gICovCi0gIGJmZF9hcmNoX21pcHMsCi0gIC8qIEluaXRpYWwgcG9ydGlvbiBvZiBhcm1hcCBzdHJpbmcuICAqLwotICAiX19fX19fX19fXyIsCi0gIC8qIFRoZSBwYWdlIGJvdW5kYXJ5IHVzZWQgdG8gYWxpZ24gc2VjdGlvbnMgaW4gYSBkZW1hbmQtcGFnZWQKLSAgICAgZXhlY3V0YWJsZSBmaWxlLiAgRS5nLiwgMHgxMDAwLiAgKi8KLSAgMHgxMDAwLAotICAvKiBUcnVlIGlmIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBBbHBoYS4gIEZhbHNlIGlmIC5yZGF0YSBpcyBwYXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQsIGFzIG9uIHRoZQotICAgICBNSVBTLiAgKi8KLSAgZmFsc2UsCi0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIDMyLAotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICAmbWlwc19ob3d0b190YWJsZVtNSVBTX1JfUkVGV09SRF0sCi0gIHsKLSAgICAvKiBTeW1ib2wgdGFibGUgbWFnaWMgbnVtYmVyLiAgKi8KLSAgICBtYWdpY1N5bSwKLSAgICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gICAgNCwKLSAgICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gICAgc2l6ZW9mIChzdHJ1Y3QgaGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgc3ltX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgcmZkX2V4dCksCi0gICAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gICAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gICAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9zeW1faW4sCi0gICAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gICAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gICAgZWNvZmZfc3dhcF9yZmRfaW4sCi0gICAgZWNvZmZfc3dhcF9leHRfaW4sCi0gICAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiwKLSAgICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gICAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICAgIGVjb2ZmX3N3YXBfZG5yX291dCwKLSAgICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICAgIGVjb2ZmX3N3YXBfb3B0X291dCwKLSAgICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gICAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICAgIGVjb2ZmX3N3YXBfZXh0X291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gICAgLyogRnVuY3Rpb24gdG8gcmVhZCBpbiBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgICBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbGljX2luZm8KLSAgfSwKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIFJFTFNaLAotICAvKiBSZWxvYyBzd2FwcGluZyBmdW5jdGlvbnMuICAqLwotICBtaXBzX2Vjb2ZmX3N3YXBfcmVsb2NfaW4sCi0gIG1pcHNfZWNvZmZfc3dhcF9yZWxvY19vdXQsCi0gIC8qIEJhY2tlbmQgcmVsb2MgdHdlYWtpbmcuICAqLwotICBtaXBzX2FkanVzdF9yZWxvY19pbiwKLSAgbWlwc19hZGp1c3RfcmVsb2Nfb3V0LAotICAvKiBSZWxvY2F0ZSBzZWN0aW9uIGNvbnRlbnRzIHdoaWxlIGxpbmtpbmcuICAqLwotICBtaXBzX3JlbG9jYXRlX3NlY3Rpb24sCi0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBOVUxMLAotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gICovCi0gIF9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zCi19OwotCi0vKiBMb29raW5nIHVwIGEgcmVsb2MgdHlwZSBpcyBNSVBTIHNwZWNpZmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogR2V0dGluZyByZWxvY2F0ZWQgc2VjdGlvbiBjb250ZW50cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLS8qIEhhbmRsaW5nIGZpbGUgd2luZG93cyBpcyBnZW5lcmljLiAgKi8KLSNkZWZpbmUgX2JmZF9lY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIFJlbGF4aW5nIHNlY3Rpb25zIGlzIE1JUFMgc3BlY2lmaWMuICAqLwotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIG1pcHNfcmVsYXhfc2VjdGlvbgotCi0vKiBHQyBvZiBzZWN0aW9ucyBpcyBub3QgZG9uZS4gICovCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLWNvbnN0IGJmZF90YXJnZXQgZWNvZmZfbGl0dGxlX3ZlYyA9Ci17Ci0gICJlY29mZi1saXR0bGVtaXBzIiwJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19DT0RFIHwgU0VDX0RBVEEpLAotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZWNvZmZfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIF9iZmRfZWNvZmZfbWtvYmplY3QsICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWMgPQotewotICAiZWNvZmYtYmlnbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9lY29mZl9hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0ge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgJm1pcHNfZWNvZmZfYmFja2VuZF9kYXRhCi19OwotCi1jb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ2xpdHRsZV92ZWMgPQotewotICAiZWNvZmYtYmlnbGl0dGxlbWlwcyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2Vjb2ZmX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBfYmZkX2Vjb2ZmX21rb2JqZWN0LCAgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgX2JmZF9lY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9lY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZWNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX2Vjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpICZtaXBzX2Vjb2ZmX2JhY2tlbmRfZGF0YQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXBtYWMuYyBiL2JmZC9jb2ZmLXBtYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzMzJkOS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1wbWFjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFwcGxlIGV0IGFsIFBvd2VyUEMgTWFjICJYQ09GRiIgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9TWU0JcG1hY194Y29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJInhjb2ZmLXBvd2VybWFjIgotCi0vKiBUd2VhayBjb2ZmY29kZS5oIGJhc2VkIG9uIHRoaXMgYmVpbmcgYSBQb3dlck1hYyBpbnN0ZWFkIG9mIFJTLzYwMDAuICovCi0KLSNkZWZpbmUgUE9XRVJNQUMKLQotI2luY2x1ZGUgImNvZmYtcnM2MDAwLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi1wcGMuYyBiL2JmZC9jb2ZmLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ1MDQ0Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXBwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFBvd2VyUEMgTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBPcmlnaW5hbCB2ZXJzaW9uIHBpZWNlZCB0b2dldGhlciBieSBLaW0gS251dHRpbGEgKGtya0BjeWdudXMuY29tKQotCi0gICBUaGVyZSBpcyBub3RoaW5nIG5ldyB1bmRlciB0aGUgc3VuLiBUaGlzIGZpbGUgZHJhd3MgYSBsb3Qgb24gb3RoZXIKLSAgIGNvZmYgZmlsZXMsIGluIHBhcnRpY3VsYXIsIHRob3NlIGZvciB0aGUgcnMvNjAwMCwgYWxwaGEsIG1pcHMsIGFuZCAKLSAgIGludGVsIGJhY2tlbmRzLCBhbmQgdGhlIFBFIHdvcmsgZm9yIHRoZSBhcm0uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEN1cnJlbnQgU3RhdGU6Ci0gICAtIG9iamR1bXAgd29ya3MKLSAgIC0gcmVsb2NzIGdlbmVyYXRlZCBieSBnYXMKLSAgIC0gbGQgd2lsbCBsaW5rIGZpbGVzLCBidXQgdGhleSBkbyBub3QgcnVuLgotICAgLSBkbGx0b29sIHdpbGwgbm90IHByb2R1Y2UgY29ycmVjdCBvdXRwdXQgaW4gc29tZSAucmVsb2MgY2FzZXMsIGFuZCB3aWxsIAotICAgICBub3QgcHJvZHVjZSB0aGUgcmlnaHQgZ2x1ZSBjb2RlIGZvciBkbGwgZnVuY3Rpb24gY2FsbHMuCi0qLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAiY29mZi9wb3dlcnBjLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotCi0jaWZkZWYgQkFETUFHCi0jdW5kZWYgQkFETUFHCi0jZW5kaWYKLQotI2RlZmluZSBCQURNQUcoeCkgUFBDQkFETUFHKHgpCi0KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBtb3JlIHRoYW4gb25jZSwgYnV0IHdlIG9ubHkgY29tcGlsZSB0aGUKLSAgIGZpbmFsX2xpbmsgcm91dGluZSBvbmNlLiAgKi8KLWV4dGVybiBib29sZWFuIHBwY19iZmRfY29mZl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBkdW1wX3RvYyBQQVJBTVMgKChQVFIpKTsKLQotLyogVGhlIHRvYyBpcyBhIHNldCBvZiBiZmRfdm1hIGZpZWxkcy4gV2UgdXNlIHRoZSBmYWN0IHRoYXQgdmFsaWQgICAgICAgICAqLwotLyogYWRkcmVzc2VzIGFyZSBldmVuIChpLmUuIHRoZSBiaXQgcmVwcmVzZW50aW5nICIxIiBpcyBvZmYpIHRvIGFsbG93ICAgICAqLwotLyogdXMgdG8gZW5jb2RlIGEgbGl0dGxlIGV4dHJhIGluZm9ybWF0aW9uIGluIHRoZSBmaWVsZCAgICAgICAgICAgICAgICAgICAqLwotLyogLSBVbmFsbG9jYXRlZCBhZGRyZXNzZXMgYXJlIGludGlhbGl6ZWQgdG8gMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogLSBBbGxvY2F0ZWQgYWRkcmVzc2VzIGFyZSBldmVuIG51bWJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIGZpcnN0IHRpbWUgd2UgYWN0dWFsbHkgd3JpdGUgYSByZWZlcmVuY2UgdG8gdGhlIHRvYyBpbiB0aGUgYmZkLCAgICAqLwotLyogd2Ugd2FudCB0byByZWNvcmQgdGhhdCBmYWN0IGluIGEgZml4dXAgZmlsZSAoaWYgaXQgaXMgYXNrZWQgZm9yKSwgc28gICAqLwotLyogd2Uga2VlcCB0cmFjayBvZiB3aGV0aGVyIG9yIG5vdCBhbiBhZGRyZXNzIGhhcyBiZWVuIHdyaXR0ZW4gYnkgbWFya2luZyAqLwotLyogdGhlIGxvdyBvcmRlciBiaXQgd2l0aCBhICIxIiB1cG9uIHdyaXRpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFNFVF9VTkFMTE9DQVRFRCh4KSAgKCh4KSA9IDEpCi0jZGVmaW5lIElTX1VOQUxMT0NBVEVEKHgpICAgKCh4KSA9PSAxKQotCi0jZGVmaW5lIElTX1dSSVRURU4oeCkgICAgICAgKCh4KSAmIDEpCi0jZGVmaW5lIE1BUktfQVNfV1JJVFRFTih4KSAgKCh4KSB8PSAxKQotI2RlZmluZSBNQUtFX0FERFJfQUdBSU4oeCkgICgoeCkgJj0gfjEpCi0KLQotLyogVHVybiBvbiB0aGlzIGNoZWNrIGlmIHlvdSBzdXNwZWN0IHNvbWV0aGluZyBhbWlzcyBpbiB0aGUgaGFzaCB0YWJsZXMgKi8KLSNpZmRlZiBERUJVR19IQVNICi0KLS8qIE5lZWQgYSA3IGNoYXIgc3RyaW5nIGZvciBhbiBleWUgY2F0Y2hlciAqLwotI2RlZmluZSBFWUUgImtya2p1bmsiCi0KLSNkZWZpbmUgSEFTSF9DSEVDS19EQ0wgY2hhciBleWVfY2F0Y2hlcls4XTsKLSNkZWZpbmUgSEFTSF9DSEVDS19JTklUKHJldCkgICAgICBzdHJjcHkocmV0LT5leWVfY2F0Y2hlciwgRVlFKQotI2RlZmluZSBIQVNIX0NIRUNLKGFkZHIpIFwKLSBpZiAoc3RyY21wKGFkZHItPmV5ZV9jYXRjaGVyLCBFWUUpICE9IDApIFwKLSAgeyBcCi0gICAgZnByaW50ZihzdGRlcnIsXAotICAgIF8oIkZpbGUgJXMsIGxpbmUgJWQsIEhhc2ggY2hlY2sgZmFpbHVyZSwgYmFkIGV5ZSAlOHNcbiIpLCBcCi0gICAgX19GSUxFX18sIF9fTElORV9fLCBhZGRyLT5leWVfY2F0Y2hlcik7IFwKLSAgICBhYm9ydCgpOyBcCi0gfQotCi0KLSNlbHNlCi0KLSNkZWZpbmUgSEFTSF9DSEVDS19EQ0wKLSNkZWZpbmUgSEFTSF9DSEVDS19JTklUKHJldCkKLSNkZWZpbmUgSEFTSF9DSEVDSyhhZGRyKQotCi0jZW5kaWYKLQotLyogSW4gb3JkZXIgbm90IHRvIGFkZCBhbiBpbnQgdG8gZXZlcnkgaGFzaCB0YWJsZSBpdGVtIGZvciBldmVyeSBjb2ZmCi0gICBsaW5rZXIsIHdlIGRlZmluZSBvdXIgb3duIGhhc2ggdGFibGUsIGRlcml2ZWQgZnJvbSB0aGUgY29mZiBvbmUgKi8KLQotLyogUEUgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gKi8KLQotc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgcm9vdDsgLyogRmlyc3QgZW50cnksIGFzIHJlcXVpcmVkICAqLwotCi0gIC8qIEFzIHdlIHdvbmRlciBhcm91bmQgdGhlIHJlbG9jcywgd2UnbGwga2VlcCB0aGUgYXNzaWduZWQgdG9jX29mZnNldAotICAgICBoZXJlICovCi0gIGJmZF92bWEgdG9jX29mZnNldDsgICAgICAgICAgICAgICAvKiBPdXIgYWRkaXRpb24sIGFzIHJlcXVpcmVkICovCi0gIGludCBzeW1ib2xfaXNfZ2x1ZTsKLSAgdW5zaWduZWQgbG9uZyBpbnQgZ2x1ZV9pbnNuOwotCi0gIEhBU0hfQ0hFQ0tfRENMCi19OwotCi0KLS8qIFBFIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgcm9vdDsgLyogRmlyc3QgZW50cnksIGFzIHJlcXVpcmVkICovCi19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpwcGNfY29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JICAgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX3BwY19ydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosCi0JICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwKLQkgICBiZmRfdm1hICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotcHBjX2NvZmZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKnJldCA9IAotICAgIChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgCi0JCQkgc2l6ZW9mIChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5KSk7Ci0KLSAgaWYgKHJldCA9PSAoc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIAotCQkJCSAgICAgIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICBTRVRfVU5BTExPQ0FURUQocmV0LT50b2Nfb2Zmc2V0KTsKLSAgICAgIHJldC0+c3ltYm9sX2lzX2dsdWUgPSAwOwotICAgICAgcmV0LT5nbHVlX2luc24gPSAwOwotCi0gICAgICBIQVNIX0NIRUNLX0lOSVQocmV0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGEgUEUgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICByZXR1cm4gX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnJvb3QsIGFiZmQsIG5ld2Z1bmMpOwotfQotCi0vKiBDcmVhdGUgYSBQRSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1wcGNfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgcHBjX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQgKHJldCwgYWJmZCwKLQkJCQkJcHBjX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTm93LCB0YWlsb3IgY29mZmNvZGUuaCB0byB1c2Ugb3VyIGhhc2ggc3R1ZmYgKi8KLQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIHBwY19jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotDAotLyogVGhlIG50IGxvYWRlciBwb2ludHMgdGhlIHRvYyByZWdpc3RlciB0byAmdG9jICsgMzI3NjgsIGluIG9yZGVyIHRvICovCi0vKiB1c2UgdGhlIGNvbXBsZXRlIHJhbmdlIG9mIGEgMTYtYml0IGRpc3BsYWNlbWVudC4gV2UgaGF2ZSB0byBhZGp1c3QgKi8KLS8qIGZvciB0aGlzIHdoZW4gd2UgZml4IHVwIGxvYWRzIGRpc3BsYWNlZCBvZmYgdGhlIHRvYyByZWcuICAgICAgICAgICAqLwotI2RlZmluZSBUT0NfTE9BRF9BREpVU1RNRU5UICgtMzI3NjgpCi0jZGVmaW5lIFRPQ19TRUNUSU9OX05BTUUgIi5wcml2YXRlLnRvYyIKLQotLyogVGhlIG1haW4gYm9keSBvZiBjb2RlIGlzIGluIGNvZmZjb2RlLmguICAqLwotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLS8qIHRoZXNlIHNob3VsZCBkZWZpbml0ZWx5IGdvIGluIGEgaGVhZGVyIGZpbGUgc29tZXdoZXJlLi4uICovCi0KLS8qIE5PUCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FCU09MVVRFICAgICAgICAgIDB4MDAwMAotCi0vKiA2NC1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFI2NCAgICAgICAgICAgIDB4MDAwMQotCi0vKiAzMi1iaXQgYWRkcmVzcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMiAgICAgICAgICAgIDB4MDAwMgotCi0vKiAyNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGJyYW5jaCBhYnNvbHV0ZSkgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMjQgICAgICAgICAgICAweDAwMDMKLQotLyogMTYtYml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19BRERSMTYgICAgICAgICAgICAweDAwMDQKLQotLyogMTYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChsb2FkIGRvdWJsZXdvcmQpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfQUREUjE0ICAgICAgICAgICAgMHgwMDA1Ci0KLS8qIDI2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggcmVsYXRpdmUpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfUkVMMjQgICAgICAgICAgICAgMHgwMDA2Ci0KLS8qIDE2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChiciBjb25kIHJlbGF0aXZlKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFTDE0ICAgICAgICAgICAgIDB4MDAwNwotCi0vKiAxNi1iaXQgb2Zmc2V0IGZyb20gVE9DIGJhc2UgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNiAgICAgICAgICAweDAwMDgKLQotLyogMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCBzaGlmdGVkIGxlZnQgMiAobG9hZCBkb3VibGV3b3JkKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0ICAgICAgICAgIDB4MDAwOQotCi0vKiAzMi1iaXQgYWRkciB3L28gaW1hZ2UgYmFzZSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5CICAgICAgICAgIDB4MDAwQQotCi0vKiB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGFzIGluIGFuIGltYWdlIHNlY3Rpb25oZHIpICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDUkVMICAgICAgICAgICAgMHgwMDBCCi0KLS8qIHNlY3Rpb25oZWFkZXIgbnVtYmVyICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfU0VDVElPTiAgICAgICAgICAgMHgwMDBDCi0KLS8qIHN1YnN0aXR1dGUgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gaWZmIHN5bWJvbCBpcyBnbHVlIGNvZGUgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19JRkdMVUUgICAgICAgICAgICAweDAwMEQKLQotLyogc3ltYm9sIGlzIGdsdWUgY29kZTsgdmlydHVhbCBhZGRyZXNzIGlzIFRPQyByZXN0b3JlIGluc3RydWN0aW9uICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfSU1HTFVFICAgICAgICAgICAgMHgwMDBFCi0KLS8qIHZhIG9mIGNvbnRhaW5pbmcgc2VjdGlvbiAobGltaXRlZCB0byAxNiBiaXRzKSAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1NFQ1JFTDE2ICAgICAgICAgIDB4MDAwRgotCi0vKiBzdHVmZiB0byBoYW5kbGUgaW1tZWRpYXRlIGRhdGEgd2hlbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlICovCi0vKiBkYXRhIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGltbWVkaWF0ZSBmaWVsZCAqLwotLyogV2UgbmVlZCB0byBkbyAodXN1YWxseSkgMzIgYml0IGFyaXRobWV0aWMgb24gMTYgYml0IGNodW5rcyAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFRkhJICAgICAgICAgICAgIDB4MDAxMAotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1JFRkxPICAgICAgICAgICAgIDB4MDAxMQotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1BBSVIgICAgICAgICAgICAgIDB4MDAxMgotCi0vKiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIHRvY3JlbDE2LCB3aXRoIFRPQ0RFRk4gYXNzdW1lZCAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4gICAgIDB4MDAxMwotCi0vKiAgRmxhZyBiaXRzIGluIElNQUdFX1JFTE9DQVRJT04uVFlQRSAqLwotCi0vKiBzdWJ0cmFjdCByZWxvYyB2YWx1ZSByYXRoZXIgdGhhbiBhZGRpbmcgaXQgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19ORUcgICAgICAgICAgICAgICAweDAxMDAKLQotLyogZml4IGJyYW5jaCBwcmVkaWN0aW9uIGJpdCB0byBwcmVkaWN0IGJyYW5jaCB0YWtlbiAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0JSVEFLRU4gICAgICAgICAgIDB4MDIwMAotCi0vKiBmaXggYnJhbmNoIHByZWRpY3Rpb24gYml0IHRvIHByZWRpY3QgYnJhbmNoIG5vdCB0YWtlbiAqLwotI2RlZmluZSBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOICAgICAgICAgIDB4MDQwMAotCi0vKiB0b2Mgc2xvdCBkZWZpbmVkIGluIGZpbGUgKG9yLCBkYXRhIGluIHRvYykgKi8KLSNkZWZpbmUgSU1BR0VfUkVMX1BQQ19UT0NERUZOICAgICAgICAgICAweDA4MDAKLQotLyogbWFza3MgdG8gaXNvbGF0ZSBhYm92ZSB2YWx1ZXMgaW4gSU1BR0VfUkVMT0NBVElPTi5UeXBlICovCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfVFlQRU1BU0sgICAgICAgICAgMHgwMEZGCi0jZGVmaW5lIElNQUdFX1JFTF9QUENfRkxBR01BU0sgICAgICAgICAgMHgwRjAwCi0KLSNkZWZpbmUgRVhUUkFDVF9UWVBFKHgpICAgICAgICAgICAgICAgICAoKHgpICYgSU1BR0VfUkVMX1BQQ19UWVBFTUFTSykKLSNkZWZpbmUgRVhUUkFDVF9GTEFHUyh4KSAoKHgpICYgSU1BR0VfUkVMX1BQQ19GTEFHTUFTSykKLSNkZWZpbmUgRVhUUkFDVF9KVU5LKHgpICBcCi0gICAgICAgICAgICgoeCkgJiB+KElNQUdFX1JFTF9QUENfVFlQRU1BU0sgfCBJTUFHRV9SRUxfUFBDX0ZMQUdNQVNLKSkKLQotDAotLyogc3RhdGljIGhlbHBlciBmdW5jdGlvbnMgdG8gbWFrZSByZWxvY2F0aW9uIHdvcmsgKi8KLS8qIChXb3JrIEluIFByb2dyZXNzKSAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19yZWZoaV9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLSNpZiAwCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19yZWZsb19yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICBjaGFyICoqZXJyb3IpKTsKLSNlbmRpZgotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfcGFpcl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgIFBUUiBkYXRhLAotCQkJCQkJICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICBjaGFyICoqZXJyb3IpKTsKLQotDAotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfdG9jMTZfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLSNpZiAwCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19hZGRyMzJuYl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJCSBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkJIFBUUiBkYXRhLAotCQkJCQkJCSBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCQkgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJCSBjaGFyICoqZXJyb3IpKTsKLSNlbmRpZgotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfc2VjdGlvbl9yZWxvYyBQQVJBTVMgKChiZmQgKmFiZmQsCi0JCQkJCQkJYXJlbGVudCAqcmVsb2MsCi0JCQkJCQkJYXN5bWJvbCAqc3ltYm9sLAotCQkJCQkJCVBUUiBkYXRhLAotCQkJCQkJCWFzZWN0aW9uICpzZWN0aW9uLAotCQkJCQkJCWJmZCAqb3V0cHV0X2JmZCwKLQkJCQkJCQljaGFyICoqZXJyb3IpKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBwcGNfc2VjcmVsX3JlbG9jIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJCSAgICAgICBhcmVsZW50ICpyZWxvYywKLQkJCQkJCSAgICAgICBhc3ltYm9sICpzeW1ib2wsCi0JCQkJCQkgICAgICAgUFRSIGRhdGEsCi0JCQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQkgICAgICAgYmZkICpvdXRwdXRfYmZkLAotCQkJCQkJICAgICAgIGNoYXIgKiplcnJvcikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19pbWdsdWVfcmVsb2MgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJICAgICAgIGFyZWxlbnQgKnJlbG9jLAotCQkJCQkJICAgICAgIGFzeW1ib2wgKnN5bWJvbCwKLQkJCQkJCSAgICAgICBQVFIgZGF0YSwKLQkJCQkJCSAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkJCSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0JCQkJCQkgICAgICAgY2hhciAqKmVycm9yKSk7Ci0KLQotCi1zdGF0aWMgYm9vbGVhbiBpbl9yZWxvY19wIFBBUkFNUygoYmZkICphYmZkLCByZWxvY19ob3d0b190eXBlICpob3d0bykpOwotCi0MCi0vKiBGSVhNRTogSXQnbGwgdGFrZSBhIHdoaWxlIHRvIGdldCB0aHJvdWdoIGFsbCBvZiB0aGVzZS4gSSBvbmx5IG5lZWQgYSBmZXcgdG8KLSAgIGdldCB1cyBzdGFydGVkLCBzbyB0aG9zZSBJJ2xsIG1ha2Ugc3VyZSB3b3JrLiBUaG9zZSBtYXJrZWQgRklYTUUgYXJlIGVpdGhlcgotICAgY29tcGxldGVseSB1bnZlcmlmaWVkIG9yIGhhdmUgYSBzcGVjaWZpYyB1bmtub3duIG1hcmtlZCBpbiB0aGUgY29tbWVudCAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSZWxvY2F0aW9uIGVudHJpZXMgZm9yIFdpbmRvd3MvTlQgb24gUG93ZXJQQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGcm9tIHRoZSBkb2N1bWVudCAiIiB3ZSBmaW5kIHRoZSBmb2xsb3dpbmcgbGlzdGVkIGFzIHVzZWQgcmVsb2NzOiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEFCU09MVVRFICAgICAgIDogVGhlIG5vb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEFERFJbNjR8MzJ8MTZdIDogZmllbGRzIHRoYXQgaG9sZCBhZGRyZXNzZXMgaW4gZGF0YSBmaWVsZHMgb3IgdGhlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgMTYgYml0IGRpc3BsYWNlbWVudCBmaWVsZCBvbiBhIGxvYWQvc3RvcmUuICAgICAgICAgICAgICovCi0vKiAgIEFERFJbMjR8MTRdICAgIDogZmllbGRzIHRoYXQgaG9sZCBhZGRyZXNzZXMgaW4gYnJhbmNoIGFuZCBjb25kICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYnJhbmNoZXMuIFRoZXNlIHJlcHJlc2VudCBbMjZ8MTZdIGJpdCBhZGRyZXNzZXMuICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgVGhlIGxvdyBvcmRlciAyIGJpdHMgYXJlIHByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFJFTFsyNHwxNF0gICAgIDogYnJhbmNoZXMgcmVsYXRpdmUgdG8gdGhlIEluc3RydWN0aW9uIEFkZHJlc3MgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIuIFRoZXNlIHJlcHJlc2VudCBbMjZ8MTZdIGJpdCBhZGRyZXNzZXMsICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgYXMgYmVmb3JlLiBUaGUgaW5zdHJ1Y3Rpb24gZmllbGQgd2lsbCBiZSB6ZXJvLCBhbmQgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIFNZTSB3aWxsIGJlIGluc2VydGVkIGF0IGxpbmsgdGltZS4gICovCi0vKiAgIFRPQ1JFTDE2ICAgICAgIDogMTYgYml0IGRpc3BsYWNlbWVudCBmaWVsZCByZWZlcnJpbmcgdG8gYSBzbG90IGluICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgdG9jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRPQ1JFTDE0ICAgICAgIDogMTYgYml0IGRpc3BsYWNlbWVudCBmaWVsZCwgc2ltaWxhciB0byBSRUwxNCBvciBBRERSMTQuICovCi0vKiAgIEFERFIzMk5CICAgICAgIDogMzIgYml0IGFkZHJlc3MgcmVsYXRpdmUgdG8gdGhlIHZpcnR1YWwgb3JpZ2luLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgKE9uIHRoZSBhbHBoYSwgdGhpcyBpcyBhbHdheXMgYSBsaW5rZXIgZ2VuZXJhdGVkIHRodW5rKSovCi0vKiAgICAgICAgICAgICAgICAgICAgKGkuZS4gMzJiaXQgYWRkciByZWxhdGl2ZSB0byB0aGUgaW1hZ2UgYmFzZSkgICAgICAgICAgICovCi0vKiAgIFNFQ1JFTCAgICAgICAgIDogVGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZyB0aGUgc3ltYm9sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFNFQ1RJT04gICAgICAgIDogYWNjZXNzIHRvIHRoZSBoZWFkZXIgY29udGFpbmluZyB0aGUgaXRlbS4gU3VwcG9ydHMgdGhlICovCi0vKiAgICAgICAgICAgICAgICAgICAgY29kZXZpZXcgZGVidWdnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbiBwYXJ0aWN1bGFyLCBub3RlIHRoYXQgdGhlIGRvY3VtZW50IGRvZXMgbm90IGluZGljYXRlIHRoYXQgdGhlICAgICAgICAgICovCi0vKiByZWxvY2F0aW9ucyBsaXN0ZWQgaW4gdGhlIGhlYWRlciBmaWxlIGFyZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHBwY19jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBJTUFHRV9SRUxfUFBDX0FCU09MVVRFIDB4MDAwMCAgIE5PUCAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FCU09MVVRFLCAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMCwJICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBkb250IGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBQlNPTFVURSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDAwLAkgCSAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgwMCwgICAgICAgIAkJIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX0FERFI2NCAweDAwMDEgIDY0LWJpdCBhZGRyZXNzICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8oSU1BR0VfUkVMX1BQQ19BRERSNjQsICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkwLAkgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkzLAkgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQk2NCwJICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCWZhbHNlLAkgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkwLAkgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQljb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgCSAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCTAsCQkgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JIkFERFI2NCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLwotCXRydWUsCSAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCU1JTlVTX09ORSwJIAkgLyogc3JjX21hc2sgKi8KLQlNSU5VU19PTkUsICAgICAgICAJIC8qIGRzdF9tYXNrICovCi0JZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMzIgMHgwMDAyICAzMi1iaXQgYWRkcmVzcyAqLwotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMzIsCS8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIzMiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjI0IDB4MDAwMyAgMjYtYml0IGFkZHJlc3MsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggYWJzb2x1dGUpICovCi0gIC8qIHRoZSBMSSBmaWVsZCBpcyBpbiBiaXQgNiB0aHJvdWdoIGJpdCAyOSBpcyAyNCBiaXRzLCArIDIgZm9yIHRoZSBzaGlmdCAqLwotICAvKiBPZiBjb3Vyc2UsIFRoYXQncyB0aGUgSUJNIGFwcHJvdmVkIGJpdCBudW1iZXJpbmcsIHdoaWNoIGlzIG5vdCB3aGF0ICovCi0gIC8qIGFueW9uZSBlbHNlIHVzZXMuLi4uIFRoZSBsaSBmaWVsZCBpcyBpbiBiaXQgMiB0aHJ1IDI1ICovIAotICAvKiBVc2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMjQsICAvKiB0eXBlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIyNCIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4MDdmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDA3ZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfQUREUjE2IDB4MDAwNCAgMTYtYml0IGFkZHJlc3MgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjE2LCAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJBRERSMTYiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMTQgMHgwMDA1ICovCi0gIC8qICAxNi1iaXQgYWRkcmVzcywgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSAgLyogRklYTUU6IHRoZSBtYXNrIGlzIGxpa2VseSB3cm9uZywgYW5kIHRoZSBiaXQgcG9zaXRpb24gbWF5IGJlIGFzIHdlbGwgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19BRERSMTQsICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIxNiIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX1JFTDI0IDB4MDAwNiAqLwotICAvKiAgIDI2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChicmFuY2ggcmVsYXRpdmUpICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1JFTDI0LCAgIC8qIHR5cGUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJFTDI0IiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX1JFTDE0IDB4MDAwNyAqLwotICAvKiAgIDE2LWJpdCBQQy1yZWxhdGl2ZSBvZmZzZXQsIHNoaWZ0ZWQgbGVmdCAyIChiciBjb25kIHJlbGF0aXZlKSAqLwotICAvKiBGSVhNRTogdGhlIG1hc2sgaXMgbGlrZWx5IHdyb25nLCBhbmQgdGhlIGJpdCBwb3NpdGlvbiBtYXkgYmUgYXMgd2VsbCAqLwotICAvKiBGSVhNRTogaG93IGRvZXMgaXQga25vdyBob3cgZmFyIHRvIHNoaWZ0PyAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0FERFIxNCwgIC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiQUREUjE2IiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSksICAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIElNQUdFX1JFTF9QUENfVE9DUkVMMTYgMHgwMDA4ICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2LC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY190b2MxNl9yZWxvYywgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiVE9DUkVMMTYiLCAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE0IDB4MDAwOSAqLwotICAvKiAgIDE2LWJpdCBvZmZzZXQgZnJvbSBUT0MgYmFzZSwgc2hpZnRlZCBsZWZ0IDIgKGxvYWQgZG91Ymxld29yZCkgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19UT0NSRUwxNCwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlRPQ1JFTDE0IiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSU1BR0VfUkVMX1BQQ19BRERSMzJOQiAweDAwMEEgKi8KLSAgLyogICAzMi1iaXQgYWRkciB3LyBpbWFnZSBiYXNlICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfQUREUjMyTkIsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIkFERFIzMk5CIiwgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJTUFHRV9SRUxfUFBDX1NFQ1JFTCAweDAwMEIgKi8KLSAgLyogICB2YSBvZiBjb250YWluaW5nIHNlY3Rpb24gKGFzIGluIGFuIGltYWdlIHNlY3Rpb25oZHIpICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfU0VDUkVMLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX3NlY3JlbF9yZWxvYywgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNSRUwiLCAgICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19TRUNUSU9OIDB4MDAwQyAqLwotICAvKiAgIHNlY3Rpb25oZWFkZXIgbnVtYmVyICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfU0VDVElPTiwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19zZWN0aW9uX3JlbG9jLCAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiU0VDVElPTiIsICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfSUZHTFVFIDB4MDAwRCAqLwotICAvKiAgIHN1YnN0aXR1dGUgVE9DIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gaWZmIHN5bWJvbCBpcyBnbHVlIGNvZGUgKi8KLSAgLyogVXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfSUZHTFVFLC8qIHR5cGUgKi8gICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiSUZHTFVFIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfSU1HTFVFIDB4MDAwRSAqLwotICAvKiAgIHN5bWJvbCBpcyBnbHVlIGNvZGU7IHZpcnR1YWwgYWRkcmVzcyBpcyBUT0MgcmVzdG9yZSBpbnN0cnVjdGlvbiAqLwotICAvKiBVbnVzZWQ6ICovCi0gIEhPV1RPIChJTUFHRV9SRUxfUFBDX0lNR0xVRSwvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfaW1nbHVlX3JlbG9jLCAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIklNR0xVRSIsICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfU0VDUkVMMTYgMHgwMDBGICovCi0gIC8qICAgdmEgb2YgY29udGFpbmluZyBzZWN0aW9uIChsaW1pdGVkIHRvIDE2IGJpdHMpICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfU0VDUkVMMTYsLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJTRUNSRUwxNiIsICAgICAgICAgICAgLyogbmFtZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlKSwgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfUkVGSEkgICAgICAgICAgICAgMHgwMDEwICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUkVGSEksICAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfcmVmaGlfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJFRkhJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSU1BR0VfUkVMX1BQQ19SRUZMTyAgICAgICAgICAgICAweDAwMTEgKi8KLSAgLyogVW51c2VkOiAqLwotICBIT1dUTyAoSU1BR0VfUkVMX1BQQ19SRUZMTywgICAvKiB0eXBlICovICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19yZWZoaV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUkVGTE8iLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8KLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIElNQUdFX1JFTF9QUENfUEFJUiAgICAgICAgICAgICAgMHgwMDEyICovCi0gIC8qIFVudXNlZDogKi8KLSAgSE9XVE8gKElNQUdFX1JFTF9QUENfUEFJUiwgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfcGFpcl9yZWxvYywgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlBBSVIiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4gMHgwMDEzICovCi0gIC8qICAgMTYtYml0IG9mZnNldCBmcm9tIFRPQyBiYXNlLCB3aXRob3V0IGNhdXNpbmcgYSBkZWZpbml0aW9uICovCi0gIC8qIFVzZWQ6ICovCi0gIEhPV1RPICggKElNQUdFX1JFTF9QUENfVE9DUkVMMTYgfCBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pLCAvKiB0eXBlICovIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlRPQ1JFTDE2LCBUT0NERUZOIiwgICAvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0KLQwKLQotLyogU29tZSByZWFsbHkgY2hlZXp5IG1hY3JvcyB0aGF0IGNhbiBiZSB0dXJuZWQgb24gdG8gdGVzdCBzdGRlcnIgOi0pICovCi0KLSNpZmRlZiBERUJVR19SRUxPQwotI2RlZmluZSBVTl9JTVBMKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBzdGF0aWMgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgaWYgKGkgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgaSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGZwcmludGYoc3RkZXJyLF8oIlVuaW1wbGVtZW50ZWQgUmVsb2NhdGlvbiAtLSAlc1xuIikseCk7IFwKLSAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgRFVNUF9SRUxPQyhuLHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBmcHJpbnRmKHN0ZGVyciwiJXMgc3ltICVkLCBhZGRyICVkLCBhZGRlbmQgJWRcbiIsIFwKLQkgICBuLCAoKihyLT5zeW1fcHRyX3B0cikpLT5uYW1lLCAgICAgICAgICAgICBcCi0JICAgci0+YWRkcmVzcywgci0+YWRkZW5kKTsgICAgICAgICAgICAgICAgICAgXAotfQotCi0vKiBHaXZlbiBhIHJlbG9jIG5hbWUsIG4sIGFuZCBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWxfcmVsb2MsIAotICAgZHVtcCBvdXQgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24gb24gdGhlIGNvbnRlbnRzIAotCi0jZGVmaW5lIG5fbmFtZQkJX24uX25fbmFtZQotI2RlZmluZSBuX3plcm9lcwlfbi5fbl9uLl9uX3plcm9lcwotI2RlZmluZSBuX29mZnNldAlfbi5fbl9uLl9uX29mZnNldAotCi0qLwotCi0jZGVmaW5lIERVTVBfUkVMT0MyKG4scikgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBmcHJpbnRmKHN0ZGVyciwiJXMgc3ltICVkLCByX3ZhZGRyICVkICVzXG4iLCBcCi0JICAgbiwgci0+cl9zeW1uZHgsIHItPnJfdmFkZHIsXAotCSAgICgoKHItPnJfdHlwZSkgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pID09IDApIFwKLQkgICA/IiAiOiIgVE9DREVGTiIgICk7ICAgICAgXAotfQotCi0jZWxzZQotI2RlZmluZSBVTl9JTVBMKHgpCi0jZGVmaW5lIERVTVBfUkVMT0MobixyKQotI2RlZmluZSBEVU1QX1JFTE9DMihuLHIpCi0jZW5kaWYKLQotCi0MCi0vKiB0b2MgY29uc3RydWN0aW9uIGFuZCBtYW5hZ2VtZW50IHJvdXRpbmVzICovCi0KLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCB0d2ljZSwgYW5kIHRoZXNlIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBpbiBvbmUKLSAgIG9mIHRoZSBjb21waWxhdGlvbnMuICBGSVhNRTogVGhpcyBpcyBjb25mdXNpbmcgYW5kIHdlaXJkLiAgQWxzbywKLSAgIEJGRCBzaG91bGQgbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLiAgKi8KLWV4dGVybiBiZmQqIGJmZF9vZl90b2Nfb3duZXI7Ci1leHRlcm4gbG9uZyBpbnQgZ2xvYmFsX3RvY19zaXplOwotCi1leHRlcm4gbG9uZyBpbnQgaW1wb3J0X3RhYmxlX3NpemU7Ci1leHRlcm4gbG9uZyBpbnQgZmlyc3RfdGh1bmtfYWRkcmVzczsKLWV4dGVybiBsb25nIGludCB0aHVua19zaXplOwotCi1lbnVtIHRvY190eXBlCi17Ci0gIGRlZmF1bHRfdG9jLAotICB0b2NfMzIsCi0gIHRvY182NAotfTsKLQotZW51bSByZWZfY2F0ZWdvcnkKLXsKLSAgcHJpdiwKLSAgcHViLAotICBkYXRhCi19OwotCi1zdHJ1Y3QgbGlzdF9lbGUKLXsKLSAgc3RydWN0IGxpc3RfZWxlICpuZXh0OwotICBiZmRfdm1hIGFkZHI7Ci0gIGVudW0gcmVmX2NhdGVnb3J5IGNhdDsKLSAgaW50IG9mZnNldDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgbGlzdF9lbGUgKmhlYWQ7Ci1leHRlcm4gc3RydWN0IGxpc3RfZWxlICp0YWlsOwotCi1zdGF0aWMgdm9pZCByZWNvcmRfdG9jCi0gIFBBUkFNUyAoKGFzZWN0aW9uICosIGludCwgZW51bSByZWZfY2F0ZWdvcnksIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcmVjb3JkX3RvYyAodG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBjYXQsIG5hbWUpCi0gICAgIGFzZWN0aW9uICp0b2Nfc2VjdGlvbjsKLSAgICAgaW50IG91cl90b2Nfb2Zmc2V0OwotICAgICBlbnVtIHJlZl9jYXRlZ29yeSBjYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIGFkZCB0aGlzIGVudHJ5IHRvIG91ciB0b2MgYWRkci1vZmZzZXQtbmFtZSBsaXN0ICovCi0gIHN0cnVjdCBsaXN0X2VsZSAqdDsKLSAgdCA9IChzdHJ1Y3QgbGlzdF9lbGUgKikgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGlzdF9lbGUpKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLSAgdC0+bmV4dCA9IDA7Ci0gIHQtPm9mZnNldCA9IG91cl90b2Nfb2Zmc2V0OwotICB0LT5uYW1lID0gbmFtZTsKLSAgdC0+Y2F0ID0gY2F0OwotICB0LT5hZGRyID0gdG9jX3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBvdXJfdG9jX29mZnNldDsKLQotICBpZiAoaGVhZCA9PSAwKQotICAgIHsKLSAgICAgIGhlYWQgPSB0OwotICAgICAgdGFpbCA9IHQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdGFpbC0+bmV4dCA9IHQ7Ci0gICAgICB0YWlsID0gdDsKLSAgICB9Ci19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotc3RhdGljIGJvb2xlYW4gcHBjX3JlY29yZF90b2NfZW50cnkKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIGludCwgZW51bSB0b2NfdHlwZSkpOwotc3RhdGljIHZvaWQgcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUKLSAgUEFSQU1TICgoYmZkICosIGludCwgc3RydWN0IGludGVybmFsX3JlbG9jICopKTsKLQotLyogcmVjb3JkIGEgdG9jIG9mZnNldCBhZ2FpbnN0IGEgc3ltYm9sICovCi1zdGF0aWMgYm9vbGVhbgotcHBjX3JlY29yZF90b2NfZW50cnkoYWJmZCwgaW5mbywgc2VjLCBzeW0sIHRvY19raW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgc3ltOwotICAgICBlbnVtIHRvY190eXBlIHRvY19raW5kOwotewotICBzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGludCAqbG9jYWxfc3ltczsKLQotICBoID0gMDsKLQotICBoID0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3N5bV0pOwotICBpZiAoaCAhPSAwKQotICAgIHsKLSAgICAgIEhBU0hfQ0hFQ0soaCk7Ci0gICAgfQotCi0gIGlmIChoID09IDApIAotICAgIHsgCi0gICAgICBsb2NhbF9zeW1zID0gb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGFiZmQpOwotICAgICAgaWYgKGxvY2FsX3N5bXMgPT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaTsKLQkgIC8qIGFsbG9jYXRlIGEgdGFibGUgKi8KLQkgIGxvY2FsX3N5bXMgPSAKLQkgICAgKGludCAqKSBiZmRfemFsbG9jIChhYmZkLCAKLQkJCQlvYmpfcmF3X3N5bWVudF9jb3VudChhYmZkKSAqIHNpemVvZihpbnQpKTsKLQkgIGlmIChsb2NhbF9zeW1zID09IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShhYmZkKSA9IGxvY2FsX3N5bXM7Ci0JICBmb3IgKGkgPSAwOyBpIDwgb2JqX3Jhd19zeW1lbnRfY291bnQoYWJmZCk7ICsraSkKLQkgICAgewotCSAgICAgIFNFVF9VTkFMTE9DQVRFRChsb2NhbF9zeW1zW2ldKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKElTX1VOQUxMT0NBVEVEKGxvY2FsX3N5bXNbc3ltXSkpIAotCXsKLQkgIGxvY2FsX3N5bXNbc3ltXSA9IGdsb2JhbF90b2Nfc2l6ZTsKLQkgIGdsb2JhbF90b2Nfc2l6ZSArPSA0OwotCi0JICAvKiBUaGUgc2l6ZSBtdXN0IGZpdCBpbiBhIDE2Yml0IGRpc3BsYWNtZW50ICovCi0JICBpZiAoZ2xvYmFsX3RvY19zaXplID4gNjU1MzUpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRPQyBvdmVyZmxvdyIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQotICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYSB0b2Mgc2xvdCBhbGxvY2F0ZWQuIElmIG5vdCwgZG8gaXQKLQkgaGVyZS4gSXQgd2lsbCBiZSB1c2VkIGluIHJlbG9jYXRlX3NlY3Rpb24gKi8KLSAgICAgIGlmIChJU19VTkFMTE9DQVRFRChoLT50b2Nfb2Zmc2V0KSkKLQl7Ci0JICBoLT50b2Nfb2Zmc2V0ID0gZ2xvYmFsX3RvY19zaXplOwotCSAgZ2xvYmFsX3RvY19zaXplICs9IDQ7Ci0KLQkgIC8qIFRoZSBzaXplIG11c3QgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkgIGlmIChnbG9iYWxfdG9jX3NpemUgPj0gNjU1MzUpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRPQyBvdmVyZmxvdyIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiByZWNvcmQgYSB0b2Mgb2Zmc2V0IGFnYWluc3QgYSBzeW1ib2wgKi8KLXN0YXRpYyB2b2lkCi1wcGNfbWFya19zeW1ib2xfYXNfZ2x1ZShhYmZkLCBzeW0sIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc3ltOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLXsKLSAgc3RydWN0IHBwY19jb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBoID0gKHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKikgKG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW3N5bV0pOwotCi0gIEhBU0hfQ0hFQ0soaCk7Ci0KLSAgaC0+c3ltYm9sX2lzX2dsdWUgPSAxOwotICBoLT5nbHVlX2luc24gPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgJnJlbC0+cl92YWRkcik7Ci0KLSAgcmV0dXJuOwotfQotCi0jZW5kaWYgLyogQ09GRl9JTUFHRV9XSVRIX1BFICovCi0MCi0KLS8qIFJldHVybiB0cnVlIGlmIHRoaXMgcmVsb2NhdGlvbiBzaG91bGQKLSAgIGFwcGVhciBpbiB0aGUgb3V0cHV0IC5yZWxvYyBzZWN0aW9uLiAqLwotCi1zdGF0aWMgYm9vbGVhbiBpbl9yZWxvY19wKGFiZmQsIGhvd3RvKQotICAgICBiZmQgKiBhYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuIAotICAgICghIGhvd3RvLT5wY19yZWxhdGl2ZSkgCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19BRERSMzJOQikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2KQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfSU1HTFVFKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfSUZHTFVFKSAKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1NFQ1JFTCkKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1NFQ1RJT04pCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19TRUNSRUwxNikKLSAgICAgICYmIChob3d0by0+dHlwZSAhPSBJTUFHRV9SRUxfUFBDX1JFRkhJKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfUkVGTE8pCi0gICAgICAmJiAoaG93dG8tPnR5cGUgIT0gSU1BR0VfUkVMX1BQQ19QQUlSKQotICAgICAgJiYgKGhvd3RvLT50eXBlICE9IElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTikgOwotfSAgICAgCi0KLSNpZiAwCi0KLS8qIHRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mIHBlcmZvcm1pbmcgYWxsIHRoZSBwcGMgUEUgcmVsb2NhdGlvbnMgKi8KLS8qIERvbid0IHlldCBrbm93IGlmIHdlIHdhbnQgdG8gZG8gdGhpcyB0aGlzIHBhcnRpY3VsYXIgd2F5IC4uLiAoa3JrKSAgKi8KLS8qIEZJWE1FOiAoaXQgaXMgbm90IHlldCBlbmFibGVkKSAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wZV9wcGNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIHRoZSBjb25zdGggcmVsb2NhdGlvbiBjb21lcyBpbiB0d28gcGFydHMsIHdlIGhhdmUgdG8gcmVtZW1iZXIKLSAgICAgdGhlIHN0YXRlIGJldHdlZW4gY2FsbHMsIGluIHRoZXNlIHZhcmlhYmxlcyAqLwotICBzdGF0aWMgYm9vbGVhbiBwYXJ0MV9jb25zdGhfYWN0aXZlID0gZmFsc2U7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBhcnQxX2NvbnN0aF92YWx1ZTsKLQotICB1bnNpZ25lZCBsb25nIHN5bV92YWx1ZTsKLSAgdW5zaWduZWQgc2hvcnQgcl90eXBlOwotICB1bnNpZ25lZCBsb25nIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzcyA7IC8qKyBpbnB1dF9zZWN0aW9uLT52bWEqLwotCQotICByX3R5cGUgPSByZWxvY19lbnRyeS0+aG93dG8tPnR5cGU7Ci0KLSAgaWYgKG91dHB1dF9iZmQpIAotICAgIHsKLSAgICAgIC8qIFBhcnRpYWwgbGlua2luZyAtIGRvIG5vdGhpbmcgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOyAKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogS2VlcCB0aGUgc3RhdGUgbWFjaGluZSBoYXBweSBpbiBjYXNlIHdlJ3JlIGNhbGxlZCBhZ2FpbiAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBJTUFHRV9SRUxfUFBDX1JFRkhJKSAKLQl7Ci0JICBwYXJ0MV9jb25zdGhfYWN0aXZlID0gdHJ1ZTsKLQkgIHBhcnQxX2NvbnN0aF92YWx1ZSAgPSAwOwotCX0KLSAgICAgIHJldHVybihiZmRfcmVsb2NfdW5kZWZpbmVkKTsKLSAgICB9Ci0gIAotICBpZiAoKHBhcnQxX2NvbnN0aF9hY3RpdmUpICYmIChyX3R5cGUgIT0gSU1BR0VfUkVMX1BQQ19QQUlSKSkgCi0gICAgewotICAgICAgcGFydDFfY29uc3RoX2FjdGl2ZSA9IGZhbHNlOwotICAgICAgKmVycm9yX21lc3NhZ2UgPSAoY2hhciAqKSBfKCJNaXNzaW5nIFBBSVIiKTsKLSAgICAgIHJldHVybihiZmRfcmVsb2NfZGFuZ2Vyb3VzKTsKLSAgICB9Ci0KLQotICBzeW1fdmFsdWUgPSBnZXRfc3ltYm9sX3ZhbHVlKHN5bWJvbF9pbik7Ci0gIAotICByZXR1cm4oYmZkX3JlbG9jX29rKTsJCi19Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFRoZSByZWxvYyBwcm9jZXNzaW5nIHJvdXRpbmUgZm9yIHRoZSBvcHRpbWl6ZWQgQ09GRiBsaW5rZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgc3ltcywgc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltczsKLSAgICAgYXNlY3Rpb24gKipzZWN0aW9uczsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsZW5kOwotICBib29sZWFuIGhpaGFsZjsKLSAgYmZkX3ZtYSBoaWhhbGZfdmFsOwotICBhc2VjdGlvbiAqdG9jX3NlY3Rpb24gPSAwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gMDsKLSAgCi0gIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdlIGRvbid0IG5lZWQgdG8gZG8gYQotICAgICB0aGluZy4gIFRoZSBjYWxsZXIgd2lsbCB0YWtlIGNhcmUgb2YgYWRqdXN0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzZXMgYW5kIHN5bWJvbCBpbmRpY2VzLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgCi0gIGhpaGFsZiA9IGZhbHNlOwotICBoaWhhbGZfdmFsID0gMDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBwcGNfY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIHZhbDsKLQotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpsb2M7Ci0KLSAgICAgIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHJfZmxhZ3MgPSBFWFRSQUNUX0ZMQUdTKHJlbC0+cl90eXBlKTsKLSAgCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotICAgICAgbG9jID0gY29udGVudHMgKyByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIC8qIEZJWE1FOiBjaGVjayBib3VuZHMgb24gcl90eXBlICovCi0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IChzdHJ1Y3QgcHBjX2NvZmZfbGlua19oYXNoX2VudHJ5ICopIAotCSAgICAob2JqX2NvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtzeW1uZHhdKTsKLQkgIGlmIChoICE9IDApIAotCSAgICB7Ci0JICAgICAgSEFTSF9DSEVDSyhoKTsKLQkgICAgfQotCi0JICBzeW0gPSBzeW1zICsgc3ltbmR4OwotCX0KLQotICAgICAgaWYgKHJfdHlwZSA9PSBJTUFHRV9SRUxfUFBDX0lNR0xVRSAmJiBoID09IDApCi0JewotCSAgLyogQW4gSU1HTFVFIHJlbG9jIG11c3QgaGF2ZSBhIG5hbWUuIFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotCSAgYWJvcnQoKTsKLQl9Ci0KLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICB2YWwgPSAwOwotCi0gICAgICAvKiBGSVhNRTogUEFJUiB1bnN1cHBvcnRlZCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgKi8KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0JICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyBzeW0tPm5fdmFsdWUpOwotCSAgICAgIGlmICghIG9ial9wZSAob3V0cHV0X2JmZCkpCi0JCXZhbCAtPSBzZWMtPnZtYTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBIQVNIX0NIRUNLKGgpOwotCi0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICByc3RhdCA9IGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgICAgLyogRWFjaCBjYXNlIG11c3QgZG8gaXRzIG93biByZWxvY2F0aW9uLCBzZXR0aW5nIHJzdGF0IGFwcHJvcHJpYXRlbHkgKi8KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIDB4JTAyeCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwgcl90eXBlKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLQkgIHsKLQkgICAgYmZkX3ZtYSBvdXJfdG9jX29mZnNldDsKLQkgICAgaW50IGZpeGl0OwotCi0JICAgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCi0JICAgIGlmICh0b2Nfc2VjdGlvbiA9PSAwKSAKLQkgICAgICB7Ci0JCXRvY19zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGJmZF9vZl90b2Nfb3duZXIsIAotCQkJCQkJICAgICAgIFRPQ19TRUNUSU9OX05BTUUpOwotCi0JCWlmICggdG9jX3NlY3Rpb24gPT0gTlVMTCApIAotCQkgIHsKLQkJICAgIC8qIFRoZXJlIGlzIG5vIHRvYyBzZWN0aW9uLiBTb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4gKi8KLQkJICAgIGFib3J0KCk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiAKLQkgICAgICogIEFtYXppbmcgYml0IHRyaWNrcyBwcmVzZW50LiBBcyB3ZSBtYXkgaGF2ZSBzZWVuIGVhcmxpZXIsIHdlCi0JICAgICAqICB1c2UgdGhlIDEgYml0IHRvIHRlbGwgdXMgd2hldGhlciBvciBub3QgYSB0b2Mgb2Zmc2V0IGhhcyBiZWVuCi0JICAgICAqICBhbGxvY2F0ZWQuIE5vdyB0aGF0IHRoZXkndmUgYWxsIGJlZW4gYWxsb2NhdGVkLCB3ZSB3aWxsIHVzZQotCSAgICAgKiAgdGhlIDEgYml0IHRvIHRlbGwgdXMgaWYgd2UndmUgd3JpdHRlbiB0aGlzIHBhcnRpY3VsYXIgdG9jCi0JICAgICAqICBlbnRyeSBvdXQuCi0JICAgICAqLwotCSAgICBmaXhpdCA9IGZhbHNlOwotCSAgICBpZiAoaCA9PSAwKQotCSAgICAgIHsgLyogaXQgaXMgYSBmaWxlIGxvY2FsIHN5bWJvbCAqLwotCQlpbnQgKmxvY2FsX3RvY190YWJsZTsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlzeW0gPSBzeW1zICsgc3ltbmR4OwotCQluYW1lID0gc3ltLT5fbi5fbl9uYW1lOwotCi0JCWxvY2FsX3RvY190YWJsZSA9IG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShpbnB1dF9iZmQpOwotCQlvdXJfdG9jX29mZnNldCA9IGxvY2FsX3RvY190YWJsZVtzeW1uZHhdOwotCi0JCWlmIChJU19XUklUVEVOKG91cl90b2Nfb2Zmc2V0KSkKLQkJICB7Ci0JCSAgICAvKiBpZiBpdCBoYXMgYmVlbiB3cml0dGVuIG91dCwgaXQgaXMgbWFya2VkIHdpdGggdGhlIAotCQkgICAgICAgMSBiaXQuIEZpeCB1cCBvdXIgb2Zmc2V0LCBidXQgZG8gbm90IHdyaXRlIGl0IG91dAotCQkgICAgICAgYWdhaW4uCi0JCSAgICAgKi8KLQkJICAgIE1BS0VfQUREUl9BR0FJTihvdXJfdG9jX29mZnNldCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogd3JpdGUgb3V0IHRoZSB0b2MgZW50cnkgKi8KLQkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIAotCQkJICAgICAgIG91cl90b2Nfb2Zmc2V0LCAKLQkJCSAgICAgICBwcml2LCAKLQkJCSAgICAgICBzdHJkdXAobmFtZSkpOwotCi0JCSAgICBiZmRfcHV0XzMyKG91dHB1dF9iZmQsCi0JCQkgICAgICAgdmFsLAotCQkJICAgICAgIHRvY19zZWN0aW9uLT5jb250ZW50cyArIG91cl90b2Nfb2Zmc2V0KTsKLQotCQkgICAgTUFSS19BU19XUklUVEVOKGxvY2FsX3RvY190YWJsZVtzeW1uZHhdKTsKLQkJICAgIGZpeGl0ID0gdHJ1ZTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCQlvdXJfdG9jX29mZnNldCA9IGgtPnRvY19vZmZzZXQ7Ci0KLQkJaWYgKChyX2ZsYWdzICYgSU1BR0VfUkVMX1BQQ19UT0NERUZOKSAKLQkJICAgID09IElNQUdFX1JFTF9QUENfVE9DREVGTiApCi0JCSAgewotCQkgICAgLyogVGhpcyBpcyB1bmJlbGlldmFibGUgY2hlZXNlLiBTb21lIGtub3dsZWRnYWJsZSBhc20gCi0JCSAgICAgICBoYWNrZXIgaGFzIGRlY2lkZWQgdG8gdXNlIHIyIGFzIGEgYmFzZSBmb3IgbG9hZGluZyAKLQkJICAgICAgIGEgdmFsdWUuIEhlL1NoZSBkb2VzIHRoaXMgYnkgc2V0dGluZyB0aGUgdG9jZGVmbiBiaXQsIAotCQkgICAgICAgYW5kIG5vdCBzdXBwbHlpbmcgYSB0b2MgZGVmaW5pdGlvbi4gVGhlIGJlaGF2aW91ciBpcyAKLQkJICAgICAgIHRoZW4gdG8gdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhbHVlIG9mIHRoZSAKLQkJICAgICAgIHN5bWJvbCBhbmQgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZiB0aGUgdG9jIGFzIHRoZSB0b2MgCi0JCSAgICAgICBpbmRleC4gCi0KLQkJICAgICAgIEluIGZhY3QsIHdoYXQgaXMgdXN1YWxseSBoYXBwZW5pbmcgaXMsIGJlY2F1c2UgdGhlCi0JCSAgICAgICBJbXBvcnQgQWRkcmVzcyBUYWJsZSBpcyBtYXBwZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCi0JCSAgICAgICB0aGUgdG9jLCBzb21lIHRyaXBweSBsaWJyYXJ5IGNvZGUgdHJ5aW5nIGZvciBzcGVlZCBvbgotCQkgICAgICAgZGxsIGxpbmthZ2UsIHRha2VzIGFkdmFudGFnZSBvZiB0aGF0IGFuZCBjb25zaWRlcnMgCi0JCSAgICAgICB0aGUgSUFUIHRvIGJlIHBhcnQgb2YgdGhlIHRvYywgdGh1cyBzYXZpbmcgYSBsb2FkLgotCQkgICAgKi8KLQotCQkgICAgb3VyX3RvY19vZmZzZXQgPSB2YWwgLSAKLQkJICAgICAgKHRvY19zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgCi0JCSAgICAgICB0b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkJICAgIC8qIFRoZSBzaXplIG11c3Qgc3RpbGwgZml0IGluIGEgMTZiaXQgZGlzcGxhY21lbnQgKi8KLQkJICAgIGlmIChvdXJfdG9jX29mZnNldCA+PSA2NTUzNSkKLQkJICAgICAgewotCQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgIChfKCIlczogUmVsb2NhdGlvbiBmb3IgJXMgb2YgJXggZXhjZWVkcyBUb2Mgc2l6ZSBsaW1pdCIpLCAKLQkJCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIG5hbWUsIG91cl90b2Nfb2Zmc2V0KTsKLQkJCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICB9Ci0KLQkJICAgIHJlY29yZF90b2ModG9jX3NlY3Rpb24sIG91cl90b2Nfb2Zmc2V0LCBwdWIsIHN0cmR1cChuYW1lKSk7Ci0JCSAgfQotCQllbHNlIGlmIChJU19XUklUVEVOKG91cl90b2Nfb2Zmc2V0KSkKLQkJICB7Ci0JCSAgICAvKiBpZiBpdCBoYXMgYmVlbiB3cml0dGVuIG91dCwgaXQgaXMgbWFya2VkIHdpdGggdGhlIAotCQkgICAgICAgMSBiaXQuIEZpeCB1cCBvdXIgb2Zmc2V0LCBidXQgZG8gbm90IHdyaXRlIGl0IG91dAotCQkgICAgICAgYWdhaW4uCi0JCSAgICAgKi8KLQkJICAgIE1BS0VfQUREUl9BR0FJTihvdXJfdG9jX29mZnNldCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgcmVjb3JkX3RvYyh0b2Nfc2VjdGlvbiwgb3VyX3RvY19vZmZzZXQsIHB1Yiwgc3RyZHVwKG5hbWUpKTsKLQotCQkgICAgLyogd3JpdGUgb3V0IHRoZSB0b2MgZW50cnkgKi8KLQkJICAgIGJmZF9wdXRfMzIob3V0cHV0X2JmZCwKLQkJCSAgICAgICB2YWwsCi0JCQkgICAgICAgdG9jX3NlY3Rpb24tPmNvbnRlbnRzICsgb3VyX3RvY19vZmZzZXQpOwotCi0JCSAgICBNQVJLX0FTX1dSSVRURU4oaC0+dG9jX29mZnNldCk7Ci0JCSAgICAvKiBUaGUgdHJpY2t5IHBhcnQgaXMgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIHRoYXQgKi8KLQkJICAgIC8qIG5lZWRzIGEgLnJlbG9jIGVudHJ5IGZvciBpdCAqLwotCQkgICAgZml4aXQgPSB0cnVlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKGZpeGl0ICYmIGluZm8tPmJhc2VfZmlsZSkgCi0JICAgICAgewotCQkvKiBTbyBpZiB0aGlzIGlzIG5vbiBwY3JlbGF0aXZlLCBhbmQgaXMgcmVmZXJlbmNlZAotCQkgICB0byBhIHNlY3Rpb24gb3IgYSBjb21tb24gc3ltYm9sLCB0aGVuIGl0IG5lZWRzIGEgcmVsb2MgKi8KLQotCQkvKiByZWxvY2F0aW9uIHRvIGEgc3ltYm9sIGluIGEgc2VjdGlvbiB3aGljaAotCQkgICBpc24ndCBhYnNvbHV0ZSAtIHdlIG91dHB1dCB0aGUgYWRkcmVzcyBoZXJlIAotCQkgICB0byBhIGZpbGUgKi8KLQotCQliZmRfdm1hIGFkZHIgPSAgdG9jX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHRvY19zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgb3VyX3RvY19vZmZzZXQ7Ci0JCSAgICAKLQkJaWYgKGNvZmZfZGF0YShvdXRwdXRfYmZkKS0+cGUpCi0JCSAgYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCi0JCWZ3cml0ZSAoJmFkZHIsIDEsNCwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKTsKLQkgICAgICB9Ci0KLQotCSAgICAvKiBGSVhNRTogdGhpcyB0ZXN0IGlzIGNvbnNlcnZhdGl2ZSAqLwotCSAgICBpZiAoIChyX2ZsYWdzICYgSU1BR0VfUkVMX1BQQ19UT0NERUZOKSAhPSBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4gJiYKLQkJb3VyX3RvY19vZmZzZXQgPiB0b2Nfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBSZWxvY2F0aW9uIGV4Y2VlZHMgYWxsb2NhdGVkIFRPQyAoJXgpIiksIAotCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkgICB0b2Nfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgLyogTm93IHdlIGtub3cgdGhlIHJlbG9jYXRpb24gZm9yIHRoaXMgdG9jIHJlZmVyZW5jZSAqLwotCSAgICByZWxvY2F0aW9uID0gIG91cl90b2Nfb2Zmc2V0ICsgVE9DX0xPQURfQURKVVNUTUVOVDsKLQkgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJICAgIGlucHV0X2JmZCwgCi0JCQkJCSAgICByZWxvY2F0aW9uLCAKLQkJCQkJICAgIGxvYyk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotCSAgewotCSAgICAvKiBUbyBzb2x2ZSB0aGlzLCB3ZSBuZWVkIHRvIGtub3cgd2hldGhlciBvciBub3QgdGhlIHN5bWJvbCAqLwotCSAgICAvKiBhcHBlYXJpbmcgb24gdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaXMgYSBnbHVlIGZ1bmN0aW9uIG9yIG5vdC4gKi8KLQkgICAgLyogQSBnbHVlIGZ1bmN0aW9uIG11c3QgYW5ub3VuY2UgaXRzZWxmIHZpYSBhIElNR0xVRSByZWxvYywgYW5kICovCi0JICAgIC8qIHRoZSByZWxvYyBjb250YWlucyB0aGUgcmVxdWlyZWQgdG9jIHJlc3RvcmUgaW5zdHJ1Y3Rpb24gKi8KLQkgIAotCSAgICBiZmRfdm1hIHg7Ci0JICAgIGNvbnN0IGNoYXIgKm15X25hbWU7Ci0JICAgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCi0JICAgIGlmIChoICE9IDApCi0JICAgICAgewotCQlteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCQlpZiAoaC0+c3ltYm9sX2lzX2dsdWUgPT0gMSkgCi0JCSAgewotCQkgICAgeCA9IGJmZF9nZXRfMzIoaW5wdXRfYmZkLCBsb2MpOwotCQkgICAgYmZkX3B1dF8zMihpbnB1dF9iZmQsIGgtPmdsdWVfaW5zbiwgbG9jKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX1NFQ1JFTDoKLQkgIC8qIFVuaW1wbGVtZW50ZWQ6IGNvZGV2aWV3IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLwotCSAgLyogRm9yIGZhc3QgYWNjZXNzIHRvIHRoZSBoZWFkZXIgb2YgdGhlIHNlY3Rpb24gCi0JICAgICBjb250YWluaW5nIHRoZSBpdGVtLiAqLwotCSAgYnJlYWs7Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX1NFQ1RJT046Ci0JICAvKiBVbmltcGxlbWVudGVkOiBjb2RldmlldyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKi8KLQkgIC8qIElzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHJlbGF0aXZlCi0JICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0JICAgICBzeW1ib2wgKi8KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19BQlNPTFVURToKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbXlfbmFtZTsKLQkgICAgaWYgKGggPT0gMCkKLQkJbXlfbmFtZSA9IChzeW1zK3N5bW5keCktPl9uLl9uX25hbWU7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW15X25hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgICAgfQotCi0JICAgIGZwcmludGYoc3RkZXJyLCAKLQkJICAgIF8oIldhcm5pbmc6IHVuc3VwcG9ydGVkIHJlbG9jICVzIDxmaWxlICVzLCBzZWN0aW9uICVzPlxuIiksIAotCQkgICAgaG93dG8tPm5hbWUsCi0JCSAgICBiZmRfZ2V0X2ZpbGVuYW1lKGlucHV0X2JmZCksCi0JCSAgICBpbnB1dF9zZWN0aW9uLT5uYW1lKTsKLQotCSAgICBmcHJpbnRmKHN0ZGVyciwic3ltICVsZCAoJXMpLCByX3ZhZGRyICVsZCAoJWx4KVxuIiwgCi0JCSAgICByZWwtPnJfc3ltbmR4LCBteV9uYW1lLCAobG9uZykgcmVsLT5yX3ZhZGRyLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl92YWRkcik7ICAKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19JTUdMVUU6Ci0JICB7Ci0JICAgIC8qIFRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gbm93LiBUaGlzIHJlbG9jIHdhcyBub3RlZCBpbiB0aGUgZmlyc3QKLQkgICAgICAgcGFzcyBvdmVyIHRoZSByZWxvY3MsIGFuZCB0aGUgZ2x1ZSBpbnN0cnVjdGlvbiBleHRyYWN0ZWQgKi8KLQkgICAgY29uc3QgY2hhciAqbXlfbmFtZTsKLQkgICAgaWYgKGgtPnN5bWJvbF9pc19nbHVlID09IDEpIAotCSAgICAgIGJyZWFrOwotCSAgICBteV9uYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nOwotCi0JICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgIChfKCIlczogT3V0IG9mIG9yZGVyIElNR0xVRSByZWxvYyBmb3IgJXMiKSwgCi0JICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIG15X25hbWUpOwotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotCSAgewotCSAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKm15aCA9IDA7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUgPSAwOwotCSAgICBEVU1QX1JFTE9DMihob3d0by0+bmFtZSwgcmVsKTsKLQotCSAgICBpZiAoc3RybmNtcCgiLmlkYXRhJDIiLGlucHV0X3NlY3Rpb24tPm5hbWUsOCkgPT0gMCAmJiBmaXJzdF90aHVua19hZGRyZXNzID09IDApCi0JICAgICAgewotCQkvKiBzZXQgbWFnaWMgdmFsdWVzICovCi0JCWludCBpZGF0YTVvZmZzZXQ7Ci0JCXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqbXloID0gMDsKLQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkgICAgICJfX2lkYXRhNV9tYWdpY19fIiwKLQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlmaXJzdF90aHVua19hZGRyZXNzID0gbXloLT5yb290LnUuZGVmLnZhbHVlICsgCi0JCSAgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgCi0JCSAgICBzZWMtPm91dHB1dF9vZmZzZXQgLSAKLQkJICAgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkJCi0JCWlkYXRhNW9mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkgICAgICJfX2lkYXRhNl9tYWdpY19fIiwKLQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQkKLQkJdGh1bmtfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSAtIGlkYXRhNW9mZnNldDsKLQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkgICAgICJfX2lkYXRhNF9tYWdpY19fIiwKLQkJCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlpbXBvcnRfdGFibGVfc2l6ZSA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGggPT0gMCkKLQkgICAgICB7IC8qIGl0IGlzIGEgZmlsZSBsb2NhbCBzeW1ib2wgKi8KLQkJc3ltID0gc3ltcyArIHN5bW5keDsKLQkJbmFtZSA9IHN5bS0+X24uX25fbmFtZTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNoYXIgKnRhcmdldCA9IDA7Ci0KLQkJbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkJaWYgKHN0cmNtcCgiLmlkYXRhJDIiLCBuYW1lKSA9PSAwKQotCQkgIHRhcmdldCA9ICJfX2lkYXRhMl9tYWdpY19fIjsKLQkJZWxzZSBpZiAoc3RyY21wKCIuaWRhdGEkNCIsIG5hbWUpID09IDApCi0JCSAgdGFyZ2V0ID0gIl9faWRhdGE0X21hZ2ljX18iOwotCQllbHNlIGlmIChzdHJjbXAoIi5pZGF0YSQ1IiwgbmFtZSkgPT0gMCkKLQkJICB0YXJnZXQgPSAiX19pZGF0YTVfbWFnaWNfXyI7Ci0KLQkJaWYgKHRhcmdldCAhPSAwKQotCQkgIHsKLQkJICAgIG15aCA9IDA7Ci0KLQkJICAgIG15aCA9IGNvZmZfbGlua19oYXNoX2xvb2t1cCAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSB0YXJnZXQsCi0JCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICAgIGlmIChteWggPT0gMCkgCi0JCSAgICAgIHsKLQkJCS8qIE1pc3NpbmcgbWFnaWMgY29va2llcy4gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0JCQlhYm9ydCgpOwotCQkgICAgICB9Ci0JCSAgICAKLQkJICAgIHZhbCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZSArIAotCQkgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0JCSAgICBpZiAoZmlyc3RfdGh1bmtfYWRkcmVzcyA9PSAwKQotCQkgICAgICB7Ci0JCQlpbnQgaWRhdGE1b2Zmc2V0OwotCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAiX19pZGF0YTVfbWFnaWNfXyIsCi0JCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQlmaXJzdF90aHVua19hZGRyZXNzID0gbXloLT5yb290LnUuZGVmLnZhbHVlICsgCi0JCQkgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIAotCQkJICAgIHNlYy0+b3V0cHV0X29mZnNldCAtIAotCQkJICAgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkJCQotCQkJaWRhdGE1b2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkJbXloID0gY29mZl9saW5rX2hhc2hfbG9va3VwIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgICAiX19pZGF0YTZfbWFnaWNfXyIsCi0JCQkJCQkgICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCQkKLQkJCXRodW5rX3NpemUgPSBteWgtPnJvb3QudS5kZWYudmFsdWUgLSBpZGF0YTVvZmZzZXQ7Ci0JCQlteWggPSBjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgICAgICJfX2lkYXRhNF9tYWdpY19fIiwKLQkJCQkJCSAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJCWltcG9ydF90YWJsZV9zaXplID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkgICAgICAJICAgICAgaW5wdXRfYmZkLCAKLQkJCSAgICAgIHZhbCAtIAotCQkJICAgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSwKLQkJCSAgICAgIGxvYyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgSU1BR0VfUkVMX1BQQ19SRUwyNDoKLQkgIERVTVBfUkVMT0MyKGhvd3RvLT5uYW1lLCByZWwpOwotCSAgdmFsIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywKLQkJCQkJICBpbnB1dF9iZmQsIAotCQkJCQkgIHZhbCwgCi0JCQkJCSAgbG9jKTsKLQkgIGJyZWFrOwotCWNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0JY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIyNDoKLQljYXNlIElNQUdFX1JFTF9QUENfQUREUjMyOgotCSAgRFVNUF9SRUxPQzIoaG93dG8tPm5hbWUsIHJlbCk7Ci0JICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLAotCQkJCQkgIGlucHV0X2JmZCwgCi0JCQkJCSAgdmFsLCAKLQkJCQkJICBsb2MpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoIGluZm8tPmJhc2VfZmlsZSApCi0JewotCSAgLyogU28gaWYgdGhpcyBpcyBub24gcGNyZWxhdGl2ZSwgYW5kIGlzIHJlZmVyZW5jZWQKLQkgICAgIHRvIGEgc2VjdGlvbiBvciBhIGNvbW1vbiBzeW1ib2wsIHRoZW4gaXQgbmVlZHMgYSByZWxvYyAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhKG91dHB1dF9iZmQpLT5pbl9yZWxvY19wKG91dHB1dF9iZmQsIGhvd3RvKSkKLQkgICAgewotCSAgICAgIC8qIHJlbG9jYXRpb24gdG8gYSBzeW1ib2wgaW4gYSBzZWN0aW9uIHdoaWNoCi0JCSBpc24ndCBhYnNvbHV0ZSAtIHdlIG91dHB1dCB0aGUgYWRkcmVzcyBoZXJlIAotCQkgdG8gYSBmaWxlICovCi0JICAgICAgYmZkX3ZtYSBhZGRyID0gcmVsLT5yX3ZhZGRyIAotCQktIGlucHV0X3NlY3Rpb24tPnZtYSAKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0IAotCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgICAgIGlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotCQl7Ci0JCSAgYWRkciAtPSBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCQl9Ci0JICAgICAgZndyaXRlICgmYWRkciwgMSw0LCAoRklMRSAqKSBpbmZvLT5iYXNlX2ZpbGUpOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZSBpZiAoc3ltID09IE5VTEwpCi0JICAgICAgbmFtZSA9ICIqdW5rbm93bioiOwotCSAgICBlbHNlIGlmIChzeW0tPl9uLl9uX24uX25femVyb2VzID09IDAKLQkJICAgICAmJiBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgICAgbmFtZSA9IG9ial9jb2ZmX3N0cmluZ3MgKGlucHV0X2JmZCkgKyBzeW0tPl9uLl9uX24uX25fb2Zmc2V0OwotCSAgICBlbHNlCi0JICAgICAgewotCQlzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQlidWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkJbmFtZSA9IGJ1ZjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAKLQkJICAgIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICB7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0JfQotCi0gICAgfSAgICAgCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogRklYTUU6IEJGRCBzaG91bGQgbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLiAgVGhpcyBmaWxlIGlzIGNvbXBpbGVkCi0gICB0d2ljZSwgYW5kIHRoZXNlIHZhcmlhYmxlcyBhcmUgc2hhcmVkLiAgVGhpcyBpcyBjb25mdXNpbmcgYW5kCi0gICB3ZWlyZC4gICovCi0KLWxvbmcgaW50IGdsb2JhbF90b2Nfc2l6ZSA9IDQ7Ci0KLWJmZCogYmZkX29mX3RvY19vd25lciA9IDA7Ci0KLWxvbmcgaW50IGltcG9ydF90YWJsZV9zaXplOwotbG9uZyBpbnQgZmlyc3RfdGh1bmtfYWRkcmVzczsKLWxvbmcgaW50IHRodW5rX3NpemU7Ci0KLXN0cnVjdCBsaXN0X2VsZSAqaGVhZDsKLXN0cnVjdCBsaXN0X2VsZSAqdGFpbDsKLQotc3RhdGljIGNoYXIgKgotaDEgPSBOXygiXG5cdFx0XHRUT0MgTUFQUElOR1xuXG4iKTsKLXN0YXRpYyBjaGFyICoKLWgyID0gTl8oIiBUT0MgICAgZGlzYXNzZW1ibHkgIENvbW1lbnRzICAgICAgIE5hbWVcbiIpOwotc3RhdGljIGNoYXIgKgotaDMgPSBOXygiIE9mZnNldCAgc3BlbGxpbmcgICAgICAgICAgICAgICAgICAgKGlmIHByZXNlbnQpXG4iKTsKLQotdm9pZAotZHVtcF90b2MgKHZmaWxlKQotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgc3RydWN0IGxpc3RfZWxlICp0OwotCi0gIGZwcmludGYoZmlsZSwgXyhoMSkpOwotICBmcHJpbnRmKGZpbGUsIF8oaDIpKTsKLSAgZnByaW50ZihmaWxlLCBfKGgzKSk7Ci0KLSAgZm9yKHQgPSBoZWFkOyB0ICE9IDA7IHQ9dC0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpjYXQgPSAiIjsKLQotICAgICAgaWYgKHQtPmNhdCA9PSBwcml2KQotCWNhdCA9IF8oInByaXZhdGUgICAgICAgIik7Ci0gICAgICBlbHNlIGlmICh0LT5jYXQgPT0gcHViKQotCWNhdCA9IF8oInB1YmxpYyAgICAgICAgIik7Ci0gICAgICBlbHNlIGlmICh0LT5jYXQgPT0gZGF0YSkKLQljYXQgPSBfKCJkYXRhLWluLXRvYyAgICIpOwotCi0gICAgICBpZiAodC0+b2Zmc2V0ID4gZ2xvYmFsX3RvY19zaXplKQotCXsKLQkgIGlmICh0LT5vZmZzZXQgPD0gZ2xvYmFsX3RvY19zaXplICsgdGh1bmtfc2l6ZSkKLQkgICAgY2F0ID0gXygiSUFUIHJlZmVyZW5jZSAiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYoZmlsZSwKLQkJICAgICAgXygiKioqKiBnbG9iYWxfdG9jX3NpemUgJWxkKCVseCksIHRodW5rX3NpemUgJWxkKCVseClcbiIpLAotCQkgICAgICBnbG9iYWxfdG9jX3NpemUsIGdsb2JhbF90b2Nfc2l6ZSwgdGh1bmtfc2l6ZSwgdGh1bmtfc2l6ZSk7Ci0JICAgICAgY2F0ID0gXygiT3V0IG9mIGJvdW5kcyEiKTsKLQkgICAgfQotCX0KLQotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgICIgJTA0bHggICAgKCVkKSIsICh1bnNpZ25lZCBsb25nKSB0LT5vZmZzZXQsIHQtPm9mZnNldCAtIDMyNzY4KTsKLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICAiICAgICVzICVzXG4iLAotCSAgICAgIGNhdCwgdC0+bmFtZSk7Ci0KLSAgICB9Ci0KLSAgZnByaW50ZihmaWxlLCAiXG4iKTsKLX0KLQotYm9vbGVhbgotcHBjX2FsbG9jYXRlX3RvY19zZWN0aW9uIChpbmZvKSAKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZm9vOwotICBzdGF0aWMgY2hhciB0ZXN0X2NoYXIgPSAnMSc7Ci0KLSAgaWYgKCBnbG9iYWxfdG9jX3NpemUgPT0gMCApIC8qIEZJWE1FOiBkb2VzIHRoaXMgZ2V0IG1lIGluIHRyb3VibGU/ICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9vZl90b2Nfb3duZXIgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgb3duZXI/IFNvbWV0aGluZyBpcyB2ZXJ5IHdyb25nLiAqLwotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lICggYmZkX29mX3RvY19vd25lciAsIFRPQ19TRUNUSU9OX05BTUUpOwotICBpZiAocyA9PSBOVUxMKSAKLSAgICB7Ci0gICAgICAvKiBObyB0b2Mgc2VjdGlvbj8gU29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuICovCi0gICAgICBhYm9ydCgpOwotICAgIH0KLQotICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jKGJmZF9vZl90b2Nfb3duZXIsIGdsb2JhbF90b2Nfc2l6ZSk7Ci0gIG1lbXNldChmb28sIHRlc3RfY2hhciwgZ2xvYmFsX3RvY19zaXplKTsKLQotICBzLT5fcmF3X3NpemUgPSBzLT5fY29va2VkX3NpemUgPSBnbG9iYWxfdG9jX3NpemU7Ci0gIHMtPmNvbnRlbnRzID0gZm9vOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1wcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppLCAqcmVsOwotCi0gIC8qIGhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiBXZSBoYXZlIGEgaG9vawotICAgICB0byBkbyByZWxvYyBydW1tYWdpbmcsIGJlZm9yZSBzZWN0aW9uIHNpemVzIGFyZSBuYWlsZWQgZG93bi4gKi8KLQotICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMoYWJmZCk7Ci0KLSAgLyogcnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgdG9jICovCi0gIHNlYyA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChzZWMgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yICg7IHNlYyAhPSAwOyBzZWMgPSBzZWMtPm5leHQpCi0gIHsKLSAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKSAKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgLyogbG9hZCB0aGUgcmVsb2NzICovCi0gICAgLyogRklYTUU6IHRoZXJlIG1heSBiZSBhIHN0b3JhZ2UgbGVhayBoZXJlICovCi0gICAgaT1fYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MoYWJmZCxzZWMsMSwwLDAsMCk7Ci0gICAgCi0gICAgaWYgKGkgPT0gMCkKLSAgICAgIGFib3J0KCk7Ci0KLSAgICBmb3IgKHJlbD1pO3JlbDxpK3NlYy0+cmVsb2NfY291bnQ7KytyZWwpIAotICAgICAgewotCXVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLQl1bnNpZ25lZCBzaG9ydCByX2ZsYWdzID0gRVhUUkFDVF9GTEFHUyhyZWwtPnJfdHlwZSk7Ci0JYm9vbGVhbiBvayA9IHRydWU7Ci0KLQlEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0KLQlzd2l0Y2gocl90eXBlKSAKLQkgIHsKLQkgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLQkgICAgLyogaWYgVE9DREVGTiBpcyBvbiwgaWdub3JlIGFzIHNvbWVvbmUgZWxzZSBoYXMgYWxsb2NhdGVkIHRoZQotCSAgICAgICB0b2MgZW50cnkgKi8KLQkgICAgaWYgKCAocl9mbGFncyAmIElNQUdFX1JFTF9QUENfVE9DREVGTikgIT0gSU1BR0VfUkVMX1BQQ19UT0NERUZOICkKLQkgICAgICBvayA9IHBwY19yZWNvcmRfdG9jX2VudHJ5KGFiZmQsIGluZm8sIHNlYywgCi0JCQkJCXJlbC0+cl9zeW1uZHgsIGRlZmF1bHRfdG9jKTsKLQkgICAgaWYgKCFvaykKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLQkgICAgcHBjX21hcmtfc3ltYm9sX2FzX2dsdWUoYWJmZCwgcmVsLT5yX3N5bW5keCwgcmVsKTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmaGlfcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJSRUZISSIpOwotICBEVU1QX1JFTE9DKCJSRUZISSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jaWYgMAotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfcmVmbG9fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJSRUZMTyIpOwotICBEVU1QX1JFTE9DKCJSRUZMTyIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3BhaXJfcmVsb2MgKGFiZmQsCi0JCXJlbG9jX2VudHJ5LAotCQlzeW1ib2wsCi0JCWRhdGEsCi0JCWlucHV0X3NlY3Rpb24sCi0JCW91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJQQUlSIik7Ci0gIERVTVBfUkVMT0MoIlBBSVIiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotDAotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3RvYzE2X3JlbG9jIChhYmZkLAotCQkgcmVsb2NfZW50cnksCi0JCSBzeW1ib2wsCi0JCSBkYXRhLAotCQkgaW5wdXRfc2VjdGlvbiwKLQkJIG91dHB1dF9iZmQsCi0JCSBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgVU5fSU1QTCgiVE9DUkVMMTYiKTsKLSAgRFVNUF9SRUxPQygiVE9DUkVMMTYiLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2lmIDAKLQotLyogQUREUjMyTkIgOiAzMiBiaXQgYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgdmlydHVhbCBvcmlnaW4uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgKE9uIHRoZSBhbHBoYSwgdGhpcyBpcyBhbHdheXMgYSBsaW5rZXIgZ2VuZXJhdGVkIHRodW5rKSovCi0vKiAgICAgICAgICAgIChpLmUuIDMyYml0IGFkZHIgcmVsYXRpdmUgdG8gdGhlIGltYWdlIGJhc2UpICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19hZGRyMzJuYl9yZWxvYyAoYWJmZCwKLQkJICAgIHJlbG9jX2VudHJ5LAotCQkgICAgc3ltYm9sLAotCQkgICAgZGF0YSwKLQkJICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICBvdXRwdXRfYmZkLAotCQkgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIFVOX0lNUEwoIkFERFIzMk5CIik7Ci0gIERVTVBfUkVMT0MoIkFERFIzMk5CIixyZWxvY19lbnRyeSk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwY19zZWNyZWxfcmVsb2MgKGFiZmQsCi0JCSAgcmVsb2NfZW50cnksCi0JCSAgc3ltYm9sLAotCQkgIGRhdGEsCi0JCSAgaW5wdXRfc2VjdGlvbiwKLQkJICBvdXRwdXRfYmZkLAotCQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJTRUNSRUwiKTsKLSAgRFVNUF9SRUxPQygiU0VDUkVMIixyZWxvY19lbnRyeSk7Ci0KLSAgaWYgKG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcHBjX3NlY3Rpb25fcmVsb2MgKGFiZmQsCi0JCSAgIHJlbG9jX2VudHJ5LAotCQkgICBzeW1ib2wsCi0JCSAgIGRhdGEsCi0JCSAgIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsCi0JCSAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBVTl9JTVBMKCJTRUNUSU9OIik7Ci0gIERVTVBfUkVMT0MoIlNFQ1RJT04iLHJlbG9jX2VudHJ5KTsKLQotICBpZiAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfaW1nbHVlX3JlbG9jIChhYmZkLAotCQkgIHJlbG9jX2VudHJ5LAotCQkgIHN5bWJvbCwKLQkJICBkYXRhLAotCQkgIGlucHV0X3NlY3Rpb24sCi0JCSAgb3V0cHV0X2JmZCwKLQkJICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgVU5fSU1QTCgiSU1HTFVFIik7Ci0gIERVTVBfUkVMT0MoIklNR0xVRSIscmVsb2NfZW50cnkpOwotCi0gIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLQotI2RlZmluZSBNQVhfUkVMT0NfSU5ERVggIFwKLSAgICAgIChzaXplb2YocHBjX2NvZmZfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHBwY19jb2ZmX2hvd3RvX3RhYmxlWzBdKSAtIDEpCi0KLQotLyogRklYTUU6IFRoZXJlIGlzIGEgcG9zc2libGl0eSB0aGF0IHdoZW4gd2UgcmVhZCBpbiBhIHJlbG9jIGZyb20gYSBmaWxlLAotICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIHNvbWUgYml0cyBlbmNvZGVkIGluIHRoZSB1cHBlciBwb3J0aW9uIG9mIHRoZSAKLQkgIHR5cGUgZmllbGQuIE5vdCB5ZXQgaW1wbGVtZW50ZWQuCi0qLwotc3RhdGljIHZvaWQgcHBjX2NvZmZfcnR5cGUyaG93dG8gUEFSQU1TICgoYXJlbGVudCAqcmVsZW50LAotCQkJCQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWwpKTsKLQotc3RhdGljIHZvaWQKLXBwY19jb2ZmX3J0eXBlMmhvd3RvIChyZWxlbnQsIGludGVybmFsKQotICAgICBhcmVsZW50ICpyZWxlbnQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWw7Ci17ICAKLQotICAvKiBXZSBjYW4gZW5jb2RlIG9uZSBvZiB0aHJlZSB0aGluZ3MgaW4gdGhlIHR5cGUgZmllbGQsIGFzaWRlIGZyb20gdGhlCi0gICAgIHR5cGU6Ci0gICAgIDEuIElNQUdFX1JFTF9QUENfTkVHIC0gaW5kaWNhdGVzIHRoZSB2YWx1ZSBmaWVsZCBpcyBhIHN1YnRyYWN0aW9uCi0gICAgICAgIHZhbHVlLCByYXRoZXIgdGhhbiBhbiBhZGRpdGlvbiB2YWx1ZQotICAgICAyLiBJTUFHRV9SRUxfUFBDX0JSVEFLRU4sIElNQUdFX1JFTF9QUENfQlJOVEFLRU4gLSBpbmRpY2F0ZXMgdGhhdAotICAgICAgICB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlIHRha2VuIG9yIG5vdC4KLSAgICAgMy4gSU1BR0VfUkVMX1BQQ19UT0NERUZOIC0gdG9jIHNsb3QgZGVmaW5pdGlvbiBpbiB0aGUgZmlsZQotICAgICBGb3Igbm93LCB3ZSBqdXN0IHN0cmlwIHRoaXMgc3R1ZmYgdG8gZmluZCB0aGUgdHlwZSwgYW5kIGlnbm9yZSBpdCBvdGhlcgotICAgICB0aGFuIHRoYXQuCi0gICovCi0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGUgID0gRVhUUkFDVF9UWVBFIChpbnRlcm5hbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MoaW50ZXJuYWwtPnJfdHlwZSk7Ci0gIHVuc2lnbmVkIHNob3J0IGp1bmsgICAgPSBFWFRSQUNUX0pVTksgKGludGVybmFsLT5yX3R5cGUpOwotCi0gIC8qIHRoZSBtYXNraW5nIHByb2Nlc3Mgb25seSBzbGljZXMgb2ZmIHRoZSBib3R0b20gYnl0ZSBmb3Igcl90eXBlLiAqLwotICBpZiAoIHJfdHlwZSA+IE1BWF9SRUxPQ19JTkRFWCApIAotICAgIGFib3J0KCk7Ci0KLSAgLyogY2hlY2sgZm9yIGFic29sdXRlIGNyYXAgKi8KLSAgaWYgKCBqdW5rICE9IDAgKQotICAgIGFib3J0KCk7Ci0KLSAgc3dpdGNoKHJfdHlwZSkgCi0gICAgewotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMzJOQjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDVElPTjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfU0VDUkVMOgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCBpbnRlcm5hbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjoKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgaW50ZXJuYWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmKHN0ZGVyciwgCi0JICAgICAgXygiV2FybmluZzogVW5zdXBwb3J0ZWQgcmVsb2MgJXMgWyVkXSB1c2VkIC0tIGl0IG1heSBub3Qgd29yay5cbiIpLAotCSAgICAgIHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwKLQkgICAgICByX3R5cGUpOwotICAgICAgaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIHJfdHlwZTsgICAgICAKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJlbGVudC0+aG93dG8gPSBob3d0bzsKLSAgCi19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgYmZkX3ZtYSAqYWRkZW5kcDsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0KLSAgLyogV2UgY2FuIGVuY29kZSBvbmUgb2YgdGhyZWUgdGhpbmdzIGluIHRoZSB0eXBlIGZpZWxkLCBhc2lkZSBmcm9tIHRoZQotICAgICB0eXBlOgotICAgICAxLiBJTUFHRV9SRUxfUFBDX05FRyAtIGluZGljYXRlcyB0aGUgdmFsdWUgZmllbGQgaXMgYSBzdWJ0cmFjdGlvbgotICAgICAgICB2YWx1ZSwgcmF0aGVyIHRoYW4gYW4gYWRkaXRpb24gdmFsdWUKLSAgICAgMi4gSU1BR0VfUkVMX1BQQ19CUlRBS0VOLCBJTUFHRV9SRUxfUFBDX0JSTlRBS0VOIC0gaW5kaWNhdGVzIHRoYXQKLSAgICAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbiBvciBub3QuCi0gICAgIDMuIElNQUdFX1JFTF9QUENfVE9DREVGTiAtIHRvYyBzbG90IGRlZmluaXRpb24gaW4gdGhlIGZpbGUKLSAgICAgRm9yIG5vdywgd2UganVzdCBzdHJpcCB0aGlzIHN0dWZmIHRvIGZpbmQgdGhlIHR5cGUsIGFuZCBpZ25vcmUgaXQgb3RoZXIKLSAgICAgdGhhbiB0aGF0LgotICAqLwotCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZSAgPSBFWFRSQUNUX1RZUEUgKHJlbC0+cl90eXBlKTsKLSAgdW5zaWduZWQgc2hvcnQgcl9mbGFncyA9IEVYVFJBQ1RfRkxBR1MocmVsLT5yX3R5cGUpOwotICB1bnNpZ25lZCBzaG9ydCBqdW5rICAgID0gRVhUUkFDVF9KVU5LIChyZWwtPnJfdHlwZSk7Ci0KLSAgLyogdGhlIG1hc2tpbmcgcHJvY2VzcyBvbmx5IHNsaWNlcyBvZmYgdGhlIGJvdHRvbSBieXRlIGZvciByX3R5cGUuICovCi0gIGlmICggcl90eXBlID4gTUFYX1JFTE9DX0lOREVYICkgCi0gICAgYWJvcnQoKTsKLSAgCi0gIC8qIGNoZWNrIGZvciBhYnNvbHV0ZSBjcmFwICovCi0gIGlmICgganVuayAhPSAwICkKLSAgICBhYm9ydCgpOwotICAgIAotICBzd2l0Y2gocl90eXBlKSAKLSAgICB7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMk5COgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgKmFkZGVuZHAgLT0gcGVfZGF0YShzZWMtPm91dHB1dF9zZWN0aW9uLT5vd25lciktPnBlX29wdGhkci5JbWFnZUJhc2U7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2OgotICAgICAgRFVNUF9SRUxPQzIocHBjX2NvZmZfaG93dG9fdGFibGVbcl90eXBlXS5uYW1lLCByZWwpOwotICAgICAgaWYgKHJfZmxhZ3MgJiBJTUFHRV9SRUxfUFBDX1RPQ0RFRk4pCi0JaG93dG8gPSBwcGNfY29mZl9ob3d0b190YWJsZSArIElNQUdFX1JFTF9QUENfVE9DUkVMMTZfREVGTjsKLSAgICAgIGVsc2UKLQlob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgSU1BR0VfUkVMX1BQQ19UT0NSRUwxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMTY6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX1JFTDI0OgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19BRERSMjQ6Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0FERFIzMjoKLSAgICBjYXNlIElNQUdFX1JFTF9QUENfSUZHTFVFOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNUSU9OOgotICAgIGNhc2UgSU1BR0VfUkVMX1BQQ19TRUNSRUw6Ci0gICAgICBEVU1QX1JFTE9DMihwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsIHJlbCk7Ci0gICAgICBob3d0byA9IHBwY19jb2ZmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTUFHRV9SRUxfUFBDX0lNR0xVRToKLSAgICAgIERVTVBfUkVMT0MyKHBwY19jb2ZmX2hvd3RvX3RhYmxlW3JfdHlwZV0ubmFtZSwgcmVsKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZihzdGRlcnIsIAotCSAgICAgIF8oIldhcm5pbmc6IFVuc3VwcG9ydGVkIHJlbG9jICVzIFslZF0gdXNlZCAtLSBpdCBtYXkgbm90IHdvcmsuXG4iKSwKLQkgICAgICBwcGNfY29mZl9ob3d0b190YWJsZVtyX3R5cGVdLm5hbWUsCi0JICAgICAgcl90eXBlKTsKLSAgICAgIGhvd3RvID0gcHBjX2NvZmZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gaG93dG87Ci19Ci0KLQotLyogYSBjaGVlc3kgbGl0dGxlIG1hY3JvIHRvIG1ha2UgdGhlIGNvZGUgYSBsaXR0bGUgbW9yZSByZWFkYWJsZSAqLwotI2RlZmluZSBIT1cyTUFQKGJmZF9ydHlwZSxwcGNfcnR5cGUpICBcCi0gY2FzZSBiZmRfcnR5cGU6IHJldHVybiAmcHBjX2NvZmZfaG93dG9fdGFibGVbcHBjX3J0eXBlXQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ18zMl9HT1RPRkYsICAgIElNQUdFX1JFTF9QUENfSU1HTFVFKTsKLSAgICAgIEhPVzJNQVAoQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwgSU1BR0VfUkVMX1BQQ19JRkdMVUUpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTYsICAgICAgICAgICBJTUFHRV9SRUxfUFBDX0FERFIxNik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfQjI2LCAgICAgIElNQUdFX1JFTF9QUENfUkVMMjQpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfUFBDX0JBMjYsICAgICBJTUFHRV9SRUxfUFBDX0FERFIyNCk7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19QUENfVE9DMTYsICAgIElNQUdFX1JFTF9QUENfVE9DUkVMMTYpOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMTZfR09UT0ZGLCAgICBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2X0RFRk4pOwotICAgICAgSE9XMk1BUChCRkRfUkVMT0NfMzIsICAgICAgICAgICBJTUFHRV9SRUxfUFBDX0FERFIzMik7Ci0gICAgICBIT1cyTUFQKEJGRF9SRUxPQ19SVkEsICAgICAgICAgIElNQUdFX1JFTF9QUENfQUREUjMyTkIpOwotICAgIGRlZmF1bHQ6IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0jdW5kZWYgSE9XMk1BUAotCi0MCi0vKiBUYWlsb3IgY29mZmNvZGUuaCAtLSBtYWNybyBoZWF2ZW4uICovCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpICBwcGNfY29mZl9ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi1zdGF0aWMgdm9pZCBwcGNfY29mZl9zd2FwX3N5bV9pbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2VuZGlmCi0KLS8qIFdlIHVzZSB0aGUgc3BlY2lhbCBDT0ZGIGJhY2tlbmQgbGlua2VyLCB3aXRoIG91ciBvd24gc3BlY2lhbCB0b3VjaC4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgICBwcGNfY29mZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvICAgICAgICAgIGNvZmZfcHBjX3J0eXBlX3RvX2hvd3RvCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiAgICAgICAgY29mZl9wcGNfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9maW5hbF9saW5rICAgICAgICAgIHBwY19iZmRfY29mZl9maW5hbF9saW5rIAotCi0jaWZuZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBjb2ZmX3N3YXBfc3ltX2luX2hvb2sgICAgICAgIHBwY19jb2ZmX3N3YXBfc3ltX2luX2hvb2sKLSNlbmRpZgotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyhpbnRlcm5hbCwgaG93dG8pIHtpbnRlcm5hbC5yX3R5cGU9aG93dG8tPnR5cGU7fQotCi0jZGVmaW5lIENPRkZfUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAKLQotI2RlZmluZSBQT1dFUlBDX0xFX1BFCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0MCi0KLSNpZm5kZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0vKiBGSVhNRToKLSAgIFdoYXQgd2UncmUgdHJ5aW5nIHRvIGRvIGhlcmUgaXMgYWxsb2NhdGUgYSB0b2Mgc2VjdGlvbiAoZWFybHkpLCBhbmQgYXR0YWNoIAotICAgaXQgdG8gdGhlIGxhc3QgYmZkIHRvIGJlIHByb2Nlc3NlZC4gVGhpcyBhdm9pZHMgdGhlIHByb2JsZW0gb2YgaGF2aW5nIGEgdG9jCi0gICB3cml0dGVuIG91dCBiZWZvcmUgYWxsIGZpbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQuIFRoaXMgY29kZSBhbGxvY2F0ZXMKLSAgIGEgdG9jIHNlY3Rpb24gZm9yIGV2ZXJ5IGZpbGUsIGFuZCByZWNvcmRzIHRoZSBsYXN0IG9uZSBzZWVuLiBUaGVyZSBhcmUKLSAgIGF0IGxlYXN0IHR3byBwcm9ibGVtcyB3aXRoIHRoaXMgYXBwcm9hY2g6Ci0gICAxLiBXZSBhbGxvY2F0ZSB3aG9sZSBidW5jaGVzIG9mIHRvYyBzZWN0aW9ucyB0aGF0IGFyZSBpZ25vcmVkLCBidXQgYXQKLSAgICAgIGF0IGxlYXN0IHdlIHdpbGwgbm90IGFsbG9jYXRlIGEgdG9jIGlmIG5vIC50b2MgaXMgcHJlc2VudC4KLSAgIDIuIEl0J3Mgbm90IGNsZWFyIHRvIG1lIHRoYXQgYmVpbmcgdGhlIGxhc3QgYmZkIHJlYWQgbmVjZXNzYXJpbHkgbWVhbnMKLSAgICAgIHRoYXQgeW91IGFyZSB0aGUgbGFzdCBiZmQgY2xvc2VkLgotICAgMy4gRG9pbmcgaXQgb24gYSAic3dhcCBpbiIgaG9vayBkZXBlbmRzIG9uIHdoZW4gdGhlICJzd2FwIGluIiBpcyBjYWxsZWQsCi0gICAgICBhbmQgaG93IG9mdGVuLCBldGMuIEl0J3Mgbm90IGNsZWFyIHRvIG1lIHRoYXQgdGhlcmUgaXNuJ3QgYSBob2xlIGhlcmUuCi0qLwotCi1zdGF0aWMgdm9pZAotcHBjX2NvZmZfc3dhcF9zeW1faW5faG9vayAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKLQotICBpZiAoYmZkX29mX3RvY19vd25lciAhPSAwKSAvKiB3ZSBhbHJlYWR5IGhhdmUgYSB0b2MsIHNvIGdvIGhvbWUgKi8KLSAgICByZXR1cm47Ci0KLSAgaWYgKHN0cmNtcChpbi0+X24uX25fbmFtZSwgIi50b2MiKSA9PSAwKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoIGFiZmQgLCBUT0NfU0VDVElPTl9OQU1FKTsKLSAgICAgIGlmIChzICE9IE5VTEwpIAotCXsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWSA7Ci0KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBUT0NfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JewotCSAgLyogRklYTUU6IHNldCBhcHByb3ByaWF0ZSBiZmQgZXJyb3IgKi8KLQkgIGFib3J0KCk7Ci0JfQotCi0gICAgICAvKiBzYXZlIHRoZSBiZmQgZm9yIGxhdGVyIGFsbG9jYXRpb24gKi8KLSAgICAgIGJmZF9vZl90b2Nfb3duZXIgPSBhYmZkOwotICAgIH0KLQotICByZXR1cm47Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotc3RhdGljIGJvb2xlYW4gcHBjX2RvX2xhc3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBiZmQgKnBwY19nZXRfbGFzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1wcGNfZG9fbGFzdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZCA9PSBiZmRfb2ZfdG9jX293bmVyKQotICAgIHJldHVybiB0cnVlOwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYmZkICoKLXBwY19nZXRfbGFzdCgpCi17Ci0gIHJldHVybiBiZmRfb2ZfdG9jX293bmVyOwotfQotCi0vKiB0aGlzIHBpZWNlIG9mIG1hY2hpbmVyeSBleGlzdHMgb25seSB0byBndWFyYW50ZWUgdGhhdCB0aGUgYmZkIHRoYXQgaG9sZHMKLSAgIHRoZSB0b2Mgc2VjdGlvbiBpcyB3cml0dGVuIGxhc3QuIAotCi0gICBUaGlzIGRvZXMgZGVwZW5kIG9uIGJmZF9tYWtlX3NlY3Rpb24gYXR0YWNoaW5nIGEgbmV3IHNlY3Rpb24gdG8gdGhlCi0gICBlbmQgb2YgdGhlIHNlY3Rpb24gbGlzdCBmb3IgdGhlIGJmZC4gCi0KLSAgIFRoaXMgaXMgb3RoZXJ3aXNlIGludGVuZGVkIHRvIGJlIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSBhcyAKLSAgIGNvZmZsaW5rLmM6X2JmZF9jb2ZmX2ZpbmFsX2xpbmsoKS4gSXQgaXMgc3BlY2lmaWNhbGx5IGRpZmZlcmVudCBvbmx5IAotICAgd2hlcmUgdGhlIFBPV0VSUENfTEVfUEUgbWFjcm8gbW9kaWZpZXMgdGhlIGNvZGUuIEl0IGlzIGxlZnQgaW4gYXMgYSAKLSAgIHByZWNpc2UgZm9ybSBvZiBjb21tZW50LiBrcmtAY3lnbnVzLmNvbQotKi8KLSNkZWZpbmUgUE9XRVJQQ19MRV9QRQotCi0KLS8qIERvIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1ib29sZWFuCi1wcGNfYmZkX2NvZmZfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyBmaW5mbzsKLSAgYm9vbGVhbiBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQ7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBzaXplX3QgbWF4X2xpbmVub19jb3VudDsKLSAgc2l6ZV90IG1heF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9vdXRwdXRfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKLSAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCByZWxzejsKLSAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgbGluZXN6OwotICBiZmQgKnN1YjsKLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGNoYXIgc3RyYnVmW1NUUklOR19TSVpFX1NJWkVdOwotCi0gIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCk7Ci0KLSAgZmluZm8uaW5mbyA9IGluZm87Ci0gIGZpbmZvLm91dHB1dF9iZmQgPSBhYmZkOwotICBmaW5mby5zdHJ0YWIgPSBOVUxMOwotICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICBmaW5mby5sYXN0X2ZpbGVfaW5kZXggPSAtMTsKLSAgZmluZm8ubGFzdF9iZl9pbmRleCA9IC0xOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uc2VjX3B0cnMgPSBOVUxMOwotICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSBmYWxzZTsKLQotICBjb2ZmX2RhdGEgKGFiZmQpLT5saW5rX2luZm8gPSBpbmZvOwotCi0gIGZpbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChmaW5mby5zdHJ0YWIgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCAoJmZpbmZvLmRlYnVnX21lcmdlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gdHJ1ZTsKLQotICAvKiBDb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENvdW50IHRoZSBsaW5lIG51bWJlcnMgYW5kIHJlbG9jYXRpb24gZW50cmllcyByZXF1aXJlZCBmb3IgdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9saW5lbm9fY291bnQgPSAwOwotICBtYXhfcmVsb2NfY291bnQgPSAwOwotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCi0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLQkgICAgICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSBsaW5rLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGV2ZXJ5IHNlY3Rpb24uICBXZSBuZWVkCi0JCSB0byBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IGFueSBzZWN0aW9ucyB3aGljaAotCQkgdGhlIGxpbmtlciBoYXMgZGVjaWRlZCB0byBub3QgaW5jbHVkZS4gICovCi0JICAgICAgc2VjLT5saW5rZXJfbWFyayA9IHRydWU7Ci0KLQkgICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotCQkgIHx8IGluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0JCW8tPmxpbmVub19jb3VudCArPSBzZWMtPmxpbmVub19jb3VudDsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCW8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5saW5lbm9fY291bnQgPiBtYXhfbGluZW5vX2NvdW50KQotCQltYXhfbGluZW5vX2NvdW50ID0gc2VjLT5saW5lbm9fY291bnQ7Ci0JICAgICAgaWYgKHNlYy0+cmVsb2NfY291bnQgPiBtYXhfcmVsb2NfY291bnQpCi0JCW1heF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotCQkgICAmJiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JfQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0Jby0+cmVsX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgIG8tPnJlbF9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0JICByZWxfZmlsZXBvcyArPSBvLT5yZWxvY19jb3VudCAqIHJlbHN6OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBwb2ludGVycyB3ZQotICAgICBuZWVkIHRvIGtlZXAuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAvKiBXZSB1c2Ugc2VjdGlvbl9jb3VudCArIDEsIHJhdGhlciB0aGFuIHNlY3Rpb25fY291bnQsIGJlY2F1c2UKLSAgICAgICAgIHRoZSB0YXJnZXRfaW5kZXggZmllbGRzIGFyZSAxIGJhc2VkLiAgKi8KLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9Ci0JKChzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqKQotCSBiZmRfbWFsbG9jICgoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpCi0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvKSkpOwotICAgICAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgZm9yIChpID0gMDsgaSA8PSBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyA9IE5VTEw7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICAvKiBXZSBub3cga25vdyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NzLCBzbyB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaWxlCi0gICAgIHBvc2l0aW9ucyBvZiB0aGUgbGluZSBudW1iZXJzLiAgKi8KLSAgbGluZV9maWxlcG9zID0gcmVsX2ZpbGVwb3M7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoby0+bGluZW5vX2NvdW50ID09IDApCi0Jby0+bGluZV9maWxlcG9zID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBvLT5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7Ci0JICBsaW5lX2ZpbGVwb3MgKz0gby0+bGluZW5vX2NvdW50ICogbGluZXN6OwotCX0KLQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ICE9IDApCi0JewotCSAgLyogV2UgZG9uJ3Qga25vdyB0aGUgaW5kaWNlcyBvZiBnbG9iYWwgc3ltYm9scyB1bnRpbCB3ZSBoYXZlCi0gICAgICAgICAgICAgd3JpdHRlbiBvdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLiAgRm9yIGVhY2ggc2VjdGlvbiBpbgotICAgICAgICAgICAgIHRoZSBvdXRwdXQgZmlsZSwgd2Uga2VlcCBhbiBhcnJheSBvZiBwb2ludGVycyB0byBoYXNoCi0gICAgICAgICAgICAgdGFibGUgZW50cmllcy4gIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGEKLSAgICAgICAgICAgICByZWxvYy4gIFdoZW4gd2UgZmluZCBhIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCB3ZQotICAgICAgICAgICAgIHNldCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGlzIGFycmF5IHNvIHRoYXQgd2UgY2FuCi0gICAgICAgICAgICAgZml4IHVwIHRoZSBzeW1ib2wgaW5kZXggYWZ0ZXIgd2UgaGF2ZSB3cml0dGVuIG91dCBhbGwgdGhlCi0gICAgICAgICAgICAgbG9jYWwgc3ltYm9scy4KLQotCSAgICAgQmVjYXVzZSBvZiB0aGlzIHByb2JsZW0sIHdlIGFsc28ga2VlcCB0aGUgcmVsb2NzIGluCi0JICAgICBtZW1vcnkgdW50aWwgdGhlIGVuZCBvZiB0aGUgbGluay4gIFRoaXMgd2FzdGVzIG1lbW9yeSwKLQkgICAgIGJ1dCBvbmx5IHdoZW4gZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgd2hpY2ggaXMgbm90IHRoZQotCSAgICAgY29tbW9uIGNhc2UuICAqLwotCSAgQkZEX0FTU0VSVCAoaW5mby0+cmVsb2NhdGVhYmxlKTsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9Ci0JICAgICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JICAgICBiZmRfbWFsbG9jIChvLT5yZWxvY19jb3VudCAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9Ci0JICAgICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID09IE5VTEwKLQkgICAgICB8fCBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPiBtYXhfb3V0cHV0X3JlbG9jX2NvdW50KQotCSAgICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gby0+cmVsb2NfY291bnQ7Ci0JfQotCi0gICAgICAvKiBSZXNldCB0aGUgcmVsb2MgYW5kIGxpbmVubyBjb3VudHMsIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIHRvCi0JIGNvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IGxpbmVfZmlsZXBvczsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBsYXJnZXN0IG51bWJlciBvZiBzeW1ib2xzIGluIGFuIGlucHV0IEJGRC4gIFRha2UKLSAgICAgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFyIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkcyBvZiBhbGwgdGhlCi0gICAgIGlucHV0IEJGRCdzLiAgKi8KLSAgbWF4X3N5bV9jb3VudCA9IDA7Ci0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHNpemVfdCBzejsKLQotICAgICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gICAgICBzeiA9IG9ial9yYXdfc3ltZW50X2NvdW50IChzdWIpOwotICAgICAgaWYgKHN6ID4gbWF4X3N5bV9jb3VudCkKLQltYXhfc3ltX2NvdW50ID0gc3o7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNvbWUgYnVmZmVycyB1c2VkIHdoaWxlIGxpbmtpbmcuICAqLwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gKChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gIGZpbmZvLnNlY19wdHJzID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50Ci0JCQkJCSAgICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgZmluZm8uc3ltX2luZGljZXMgPSAobG9uZyAqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChsb25nKSk7Ci0gIGZpbmZvLm91dHN5bXMgPSAoKGJmZF9ieXRlICopCi0JCSAgIGJmZF9tYWxsb2MgKChzaXplX3QpICgobWF4X3N5bV9jb3VudCArIDEpICogc3ltZXN6KSkpOwotICBmaW5mby5saW5lbm9zID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9saW5lbm9fY291bnQKLQkJCQkgICAgICAgKiBiZmRfY29mZl9saW5lc3ogKGFiZmQpKTsKLSAgZmluZm8uY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X2NvbnRlbnRzX3NpemUpOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X3JlbG9jX2NvdW50ICogcmVsc3opOwotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkJCSAgICAgYmZkX21hbGxvYyAobWF4X3JlbG9jX2NvdW50Ci0JCQkJCSAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotICBpZiAoKGZpbmZvLmludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5zZWNfcHRycyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLnN5bV9pbmRpY2VzID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCBmaW5mby5vdXRzeW1zID09IE5VTEwKLSAgICAgIHx8IChmaW5mby5saW5lbm9zID09IE5VTEwgJiYgbWF4X2xpbmVub19jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSA+IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X3JlbG9jX2NvdW50ID4gMCkKLSAgICAgIHx8ICghIGluZm8tPnJlbG9jYXRlYWJsZQotCSAgJiYgZmluZm8uaW50ZXJuYWxfcmVsb2NzID09IE5VTEwKLQkgICYmIG1heF9yZWxvY19jb3VudCA+IDApKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBwb3NpdGlvbiBvZiBldmVyeXRoaW5nIGluIHRoZSBmaWxlLCBleGNlcHQgdGhhdAotICAgICB3ZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUgYW5kIHRoZXJlZm9yZSB3ZSBkb24ndAotICAgICBrbm93IHdoZXJlIHRoZSBzdHJpbmcgdGFibGUgc3RhcnRzLiAgV2UganVzdCBidWlsZCB0aGUgc3RyaW5nCi0gICAgIHRhYmxlIGluIG1lbW9yeSBhcyB3ZSBnbyBhbG9uZy4gIFdlIHByb2Nlc3MgYWxsIHRoZSByZWxvY2F0aW9ucwotICAgICBmb3IgYSBzaW5nbGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLSAgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpID0gMDsKLQotICBpZiAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaykKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAocC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBzdWIgPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotI2lmZGVmIFBPV0VSUENfTEVfUEUKLQkgICAgICBpZiAoISBzdWItPm91dHB1dF9oYXNfYmVndW4gJiYgIXBwY19kb19sYXN0KHN1YikpCi0jZWxzZQotCSAgICAgIGlmICghIHN1Yi0+b3V0cHV0X2hhc19iZWd1bikKLSNlbmRpZgotCQl7Ci0JCSAgaWYgKCEgX2JmZF9jb2ZmX2xpbmtfaW5wdXRfYmZkICgmZmluZm8sIHN1YikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdWItPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgewotCSAgICAgIGlmICghIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCAmZmluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIHsKLSAgICBiZmQqIGxhc3Rfb25lID0gcHBjX2dldF9sYXN0KCk7Ci0gICAgaWYgKGxhc3Rfb25lKQotICAgICAgewotCWlmICghIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBsYXN0X29uZSkpCi0JICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIH0KLSAgICBsYXN0X29uZS0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gIH0KLSNlbmRpZgotCi0gIC8qIEZyZWUgdXAgdGhlIGJ1ZmZlcnMgdXNlZCBieSBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCi0gIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlICgmZmluZm8uZGVidWdfbWVyZ2UpOwotICBkZWJ1Z19tZXJnZV9hbGxvY2F0ZWQgPSBmYWxzZTsKLQotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICAgICAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uc2VjX3B0cnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5zZWNfcHRycyk7Ci0gICAgICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gICAgICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICAgICAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gICAgICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzeW1ib2wKLSAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGV4dGVybmFsIHN5bWJvbC4gIFdyaXRlIGl0IG91dCBhZ2FpbiBpZgotICAgICBuZWNlc3NhcnkuICAqLwotICBpZiAoZmluZm8ubGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAodW5zaWduZWQgaW50KSBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSAhPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkpCi0gICAgewotICAgICAgZmluZm8ubGFzdF9maWxlLm5fdmFsdWUgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsIChQVFIpICZmaW5mby5sYXN0X2ZpbGUsCi0JCQkgICAgIChQVFIpIGZpbmZvLm91dHN5bXMpOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKLQkJICAgICArIGZpbmZvLmxhc3RfZmlsZV9pbmRleCAqIHN5bWVzeiksCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlIChmaW5mby5vdXRzeW1zLCBzeW1lc3osIDEsIGFiZmQpICE9IHN5bWVzeikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLwotICBmaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLAotCQkJICAgKFBUUikgJmZpbmZvKTsKLSAgaWYgKGZpbmZvLmZhaWxlZCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgb3V0c3ltcyBidWZmZXIgaXMgdXNlZCBieSBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bS4gICovCi0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gICAgICBmaW5mby5vdXRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHdyaXR0ZW4gb3V0IGFsbCB0aGUgZ2xvYmFsIHN5bWJvbHMsIHdlIGtub3cKLQkgdGhlIHN5bWJvbCBpbmRpY2VzIHRvIHVzZSBmb3IgcmVsb2NzIGFnYWluc3QgdGhlbSwgYW5kIHdlIGNhbgotCSBmaW5hbGx5IHdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9ICgoYmZkX2J5dGUgKikKLQkJCSBiZmRfbWFsbG9jIChtYXhfb3V0cHV0X3JlbG9jX2NvdW50ICogcmVsc3opKTsKLSAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsZW5kOwotCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0JICBiZmRfYnl0ZSAqZXJlbDsKLQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpcmVsID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzOwotCSAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLQkgIHJlbF9oYXNoID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlczsKLQkgIGVyZWwgPSBleHRlcm5hbF9yZWxvY3M7Ci0JICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKywgcmVsX2hhc2grKywgZXJlbCArPSByZWxzeikKLQkgICAgewotCSAgICAgIGlmICgqcmVsX2hhc2ggIT0gTlVMTCkKLQkJewotCQkgIEJGRF9BU1NFUlQgKCgqcmVsX2hhc2gpLT5pbmR4ID49IDApOwotCQkgIGlyZWwtPnJfc3ltbmR4ID0gKCpyZWxfaGFzaCktPmluZHg7Ci0JCX0KLQkgICAgICBiZmRfY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgKFBUUikgaXJlbCwgKFBUUikgZXJlbCk7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKChQVFIpIGV4dGVybmFsX3JlbG9jcywgcmVsc3osIG8tPnJlbG9jX2NvdW50LAotCQkJICAgIGFiZmQpICE9IHJlbHN6ICogby0+cmVsb2NfY291bnQpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIEZyZWUgdXAgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPSBOVUxMOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlIG9wdGltaXplZCBzdGFicyBzdHJpbmdzLCBvdXRwdXQgdGhlbS4gICovCi0gIGlmIChjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAoYWJmZCwgJmNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLAotCQkgICAgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3RydGFiKSArIFNUUklOR19TSVpFX1NJWkUsCi0JCSAgICAoYmZkX2J5dGUgKikgc3RyYnVmKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0gICAgICBpZiAoYmZkX3dyaXRlIChzdHJidWYsIDEsIFNUUklOR19TSVpFX1NJWkUsIGFiZmQpICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLQotICAvKiBTZXR0aW5nIGJmZF9nZXRfc3ltY291bnQgdG8gMCB3aWxsIGNhdXNlIHdyaXRlX29iamVjdF9jb250ZW50cyB0bwotICAgICBub3QgdHJ5IHRvIHdyaXRlIG91dCB0aGUgc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGRlYnVnX21lcmdlX2FsbG9jYXRlZCkKLSAgICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSAoJmZpbmZvLmRlYnVnX21lcmdlKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLSNlbmRpZgotDAotCi0vKiBUaGUgdHJhbnNmZXIgdmVjdG9ycyB0aGF0IGxlYWQgdGhlIG91dHNpZGUgd29ybGQgdG8gYWxsIG9mIHRoZSBhYm92ZS4gKi8KLQotI2lmZGVmIFRBUkdFVF9MSVRUTEVfU1lNCi1jb25zdCBiZmRfdGFyZ2V0Ci1UQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIFRBUkdFVF9MSVRUTEVfTkFNRSwJCS8qIG5hbWUgb3IgY29mZi1hcm0tbGl0dGxlICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIEZJWE1FOiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAKLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0jZWxzZQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgIHwgU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpLAotI2VuZGlmCi0KLSAgMCwJCQkJLyogbGVhZGluZyBjaGFyICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuPz8/IEZJWE1FbWdvICovCi0KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogZGF0YSAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLSAgCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCAvKiBfYmZkX2R1bW15X3RhcmdldCAqLyBjb2ZmX29iamVjdF9wIH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotICAKLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLSAgCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0jZW5kaWYKLQotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1jb25zdCBiZmRfdGFyZ2V0Ci1UQVJHRVRfQklHX1NZTSA9Ci17Ci0gIFRBUkdFVF9CSUdfTkFNRSwKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCQotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIEZJWE1FOiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0jaWZuZGVmIENPRkZfV0lUSF9QRQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotI2Vsc2UKLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAvKiBzZWN0aW9uIGZsYWdzICovCi0gICB8IFNFQ19MSU5LX09OQ0UgfCBTRUNfTElOS19EVVBMSUNBVEVTKSwKLSNlbmRpZgotCi0gIDAsCQkJCS8qIGxlYWRpbmcgY2hhciAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbj8/PyBGSVhNRW1nbyAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIC8qIF9iZmRfZHVtbXlfdGFyZ2V0ICovIGNvZmZfb2JqZWN0X3AgfSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXJzNjAwMC5jIGIvYmZkL2NvZmYtcnM2MDAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGNkNDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtcnM2MDAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDE4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSUJNIFJTLzYwMDAgIlhDT0ZGIiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNZXRpbiBHLiBPemlzaWssIE1pbWkgUGhcMzczXDM2NG5nLVRoXDM0NW8gVlwzNjUsIAotICAgICBhbmQgSm9obiBHaWxtb3JlLgotICAgQXJjaGl2ZSBzdXBwb3J0IGZyb20gRGFtb24gQS4gUGVybWV6ZWwuCi0gICBDb250cmlidXRlZCBieSBJQk0gQ29ycG9yYXRpb24gYW5kIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEludGVybmFsY29mZi5oIGFuZCBjb2ZmY29kZS5oIG1vZGlmeSB0aGVtc2VsdmVzIGJhc2VkIG9uIHRoaXMgZmxhZy4gICovCi0jZGVmaW5lIFJTNjAwMENPRkZfQyAxCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9yczYwMDAuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoZSBtYWluIGJvZHkgb2YgY29kZSBpcyBpbiBjb2ZmY29kZS5oLiAgKi8KLQotc3RhdGljIGJvb2xlYW4geGNvZmZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgeGNvZmZfcnR5cGUyaG93dG8KLSAgUEFSQU1TICgoYXJlbGVudCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqeGNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgUFRSIHhjb2ZmX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkICp4Y29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgaW50IHhjb2ZmX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotc3RhdGljIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZV9maWxlbmFtZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBfYmZkX3hjb2ZmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0MCi0vKiBXZSB1c2Ugb3VyIG93biB0ZGF0YSB0eXBlLiAgSXRzIGZpcnN0IGZpZWxkIGlzIHRoZSBDT0ZGIHRkYXRhIHR5cGUsCi0gICBzbyB0aGUgQ09GRiByb3V0aW5lcyBhcmUgY29tcGF0aWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb2ZmX2RhdGFfdHlwZSAqY29mZjsKLQotICBhYmZkLT50ZGF0YS54Y29mZl9vYmpfZGF0YSA9Ci0gICAgKChzdHJ1Y3QgeGNvZmZfdGRhdGEgKikKLSAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfdGRhdGEpKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS54Y29mZl9vYmpfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgY29mZiA9IGNvZmZfZGF0YSAoYWJmZCk7Ci0gIGNvZmYtPnN5bWJvbHMgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICBjb2ZmLT5jb252ZXJzaW9uX3RhYmxlID0gKHVuc2lnbmVkIGludCAqKSBOVUxMOwotICBjb2ZmLT5yYXdfc3ltZW50cyA9IChzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICopIE5VTEw7Ci0gIGNvZmYtPnJlbG9jYmFzZSA9IDA7Ci0KLSAgeGNvZmZfZGF0YSAoYWJmZCktPm1vZHR5cGUgPSAoJzEnIDw8IDgpIHwgJ0wnOwotCi0gIC8qIFdlIHNldCBjcHV0eXBlIHRvIC0xIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzIG5vdCBiZWVuCi0gICAgIGluaXRpYWxpemVkLiAgKi8KLSAgeGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGUgPSAtMTsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+Y3NlY3RzID0gTlVMTDsKLSAgeGNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZGljZXMgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IFhDT0ZGIGRhdGEgZnJvbSBvbmUgQkZEIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX3RkYXRhICppeCwgKm94OwotICBhc2VjdGlvbiAqc2VjOwotCi0gIGlmIChpYmZkLT54dmVjICE9IG9iZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGl4ID0geGNvZmZfZGF0YSAoaWJmZCk7Ci0gIG94ID0geGNvZmZfZGF0YSAob2JmZCk7Ci0gIG94LT5mdWxsX2FvdXRoZHIgPSBpeC0+ZnVsbF9hb3V0aGRyOwotICBveC0+dG9jID0gaXgtPnRvYzsKLSAgaWYgKGl4LT5zbnRvYyA9PSAwKQotICAgIG94LT5zbnRvYyA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGliZmQsIGl4LT5zbnRvYyk7Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0Jb3gtPnNudG9jID0gMDsKLSAgICAgIGVsc2UKLQlveC0+c250b2MgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotICBpZiAoaXgtPnNuZW50cnkgPT0gMCkKLSAgICBveC0+c25lbnRyeSA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZWMgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGliZmQsIGl4LT5zbmVudHJ5KTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQlveC0+c25lbnRyeSA9IDA7Ci0gICAgICBlbHNlCi0Jb3gtPnNuZW50cnkgPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotICBveC0+dGV4dF9hbGlnbl9wb3dlciA9IGl4LT50ZXh0X2FsaWduX3Bvd2VyOwotICBveC0+ZGF0YV9hbGlnbl9wb3dlciA9IGl4LT5kYXRhX2FsaWduX3Bvd2VyOwotICBveC0+bW9kdHlwZSA9IGl4LT5tb2R0eXBlOwotICBveC0+Y3B1dHlwZSA9IGl4LT5jcHV0eXBlOwotICBveC0+bWF4ZGF0YSA9IGl4LT5tYXhkYXRhOwotICBveC0+bWF4c3RhY2sgPSBpeC0+bWF4c3RhY2s7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJIGRvbid0IHRoaW5rIFhDT0ZGIHJlYWxseSBoYXMgYSBub3Rpb24gb2YgbG9jYWwgbGFiZWxzIGJhc2VkIG9uCi0gICBuYW1lLiAgVGhpcyB3aWxsIG1lYW4gdGhhdCBsZCAtWCBkb2Vzbid0IGFjdHVhbGx5IHN0cmlwIGFueXRoaW5nLgotICAgVGhlIEFJWCBuYXRpdmUgbGlua2VyIGRvZXMgbm90IGhhdmUgYSAtWCBvcHRpb24sIGFuZCBpdCBpZ25vcmVzIHRoZQotICAgLXggb3B0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogVGhlIFhDT0ZGIHJlbG9jIHRhYmxlLiAgQWN0dWFsbHksIFhDT0ZGIHJlbG9jYXRpb25zIHNwZWNpZnkgdGhlCi0gICBiaXRzaXplIGFuZCB3aGV0aGVyIHRoZXkgYXJlIHNpZ25lZCBvciBub3QsIGFsb25nIHdpdGggYQotICAgY29udmVudGlvbmFsIHR5cGUuICBUaGlzIHRhYmxlIGlzIGZvciB0aGUgdHlwZXMsIHdoaWNoIGFyZSB1c2VkIGZvcgotICAgZGlmZmVyZW50IGFsZ29yaXRobXMgZm9yIHB1dHRpbmcgaW4gdGhlIHJlbG9jLiAgTWFueSBvZiB0aGVzZQotICAgcmVsb2NzIG5lZWQgc3BlY2lhbF9mdW5jdGlvbiBlbnRyaWVzLCB3aGljaCBJIGhhdmUgbm90IHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVE9DIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBJIGRvbid0IHJlYWxseSBrbm93IHdoYXQgdGhpcyBpcy4gICovCi0gIEhPV1RPICg0LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SVEIiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRXh0ZXJuYWwgVE9DIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gIEhPV1RPICg1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9HTCIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIExvY2FsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVENMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDcgfSwKLSAgCi0gIC8qIE5vbiBtb2RpZmlhYmxlIGFic29sdXRlIGJyYW5jaC4gICovCi0gIEhPV1RPICg4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9CQSIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgOSB9LAotCi0gIC8qIE5vbiBtb2RpZmlhYmxlIHJlbGF0aXZlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweGEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0JSIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweDNmZmZmZmMsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweGIgfSwKLQotICAvKiBJbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4YywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkwiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2FkIGFkZHJlc3MuICAqLwotICBIT1dUTyAoMHhkLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9STEEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHhlIH0sCi0gIAotICAvKiBOb24tcmVsb2NhdGluZyByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoMHhmLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUYiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCQkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwgICAgIAkgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyAweDEwIH0sCi0gIHsgMHgxMSB9LAotICAKLSAgLyogVE9DIHJlbGF0aXZlIGluZGlyZWN0IGxvYWQuICAqLwotICBIT1dUTyAoMHgxMiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfVFJMIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUT0MgcmVsYXRpdmUgbG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4MTMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTEEiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHgxNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlJUQkkiLCAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYWJzb2x1dGUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTUsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJBIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgYWJzb2x1dGUgaW5kaXJlY3QuICAqLwotICBIT1dUTyAoMHgxNiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ0FJIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGNhbGwgcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxNywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQ1JFTCIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE4LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkEiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MTksCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCQUMiLCAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggcmVsYXRpdmUuICAqLwotICBIT1dUTyAoMHgxYSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JCUiIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxYiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJSQyIsICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSAgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi1zdGF0aWMgdm9pZAoteGNvZmZfcnR5cGUyaG93dG8gKHJlbGVudCwgaW50ZXJuYWwpCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbDsKLXsKLSAgcmVsZW50LT5ob3d0byA9IHhjb2ZmX2hvd3RvX3RhYmxlICsgaW50ZXJuYWwtPnJfdHlwZTsKLQotICAvKiBUaGUgcl9zaXplIGZpZWxkIG9mIGFuIFhDT0ZGIHJlbG9jIGVuY29kZXMgdGhlIGJpdHNpemUgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24sIGFzIHdlbGwgYXMgaW5kaWNhdGluZyB3aGV0aGVyIGl0IGlzIHNpZ25lZCBvciBub3QuCi0gICAgIERvdWJsZWNoZWNrIHRoYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUKLSAgICAgdHlwZSBtYXRjaGVzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAocmVsZW50LT5ob3d0by0+Yml0c2l6ZSAhPSAoKHVuc2lnbmVkIGludCkgaW50ZXJuYWwtPnJfc2l6ZSAmIDB4MWYpICsgMSkKLSAgICBhYm9ydCAoKTsKLSNpZiAwCi0gIGlmICgoaW50ZXJuYWwtPnJfc2l6ZSAmIDB4ODApICE9IDAKLSAgICAgID8gKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLSAgICAgIDogKHJlbGVudC0+aG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi14Y29mZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjI2OgotICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVsweGFdOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19CQTI2OgotICAgICAgcmV0dXJuICZ4Y29mZl9ob3d0b190YWJsZVs4XTsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzNdOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICByZXR1cm4gJnhjb2ZmX2hvd3RvX3RhYmxlWzBdOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgU0VMRUNUX1JFTE9DKGludGVybmFsLCBob3d0bykJCQkJCVwKLSAgewkJCQkJCQkJCVwKLSAgICBpbnRlcm5hbC5yX3R5cGUgPSBob3d0by0+dHlwZTsJCQkJCVwKLSAgICBpbnRlcm5hbC5yX3NpemUgPQkJCQkJCQlcCi0gICAgICAoKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQJCVwKLQk/IDB4ODAJCQkJCQkJCVwKLQk6IDApCQkJCQkJCQlcCi0gICAgICAgfCAoaG93dG8tPmJpdHNpemUgLSAxKSk7CQkJCQkJXAotICB9Ci0MCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotI2RlZmluZSBDT0ZGX0xPTkdfRklMRU5BTUVTCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIHhjb2ZmX3J0eXBlMmhvd3RvIChjYWNoZV9wdHIsIGRzdCkKLQotI2RlZmluZSBjb2ZmX21rb2JqZWN0IHhjb2ZmX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSB4Y29mZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSB4Y29mZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHhjb2ZmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotDAotLyogWENPRkYgYXJjaGl2ZSBzdXBwb3J0LiAgVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBjb2RlIHdhcyBieQotICAgRGFtb24gQS4gUGVybWV6ZWwuICBJdCB3YXMgZW5oYW5jZWQgdG8gcGVybWl0IGNyb3NzIHN1cHBvcnQsIGFuZAotICAgd3JpdGluZyBhcmNoaXZlIGZpbGVzLCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgWENPRkYgdXNlcyBpdHMgb3duIGFyY2hpdmUgZm9ybWF0LiAgRXZlcnl0aGluZyBpcyBob29rZWQgdG9nZXRoZXIKLSAgIHdpdGggZmlsZSBvZmZzZXQgbGlua3MsIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHJhcGlkbHkgdXBkYXRlIGFuCi0gICBhcmNoaXZlIGluIHBsYWNlLiAgT2YgY291cnNlLCB3ZSBkb24ndCBkbyB0aGF0LiAgQW4gWENPRkYgYXJjaGl2ZQotICAgaGFzIGEgcmVhbCBmaWxlIGhlYWRlciwgbm90IGp1c3QgYW4gQVJNQUcgc3RyaW5nLiAgVGhlIHN0cnVjdHVyZSBvZgotICAgdGhlIGZpbGUgaGVhZGVyIGFuZCBvZiBlYWNoIGFyY2hpdmUgaGVhZGVyIGFwcGVhciBiZWxvdy4KLQotICAgQW4gWENPRkYgYXJjaGl2ZSBhbHNvIGhhcyBhIG1lbWJlciB0YWJsZSwgd2hpY2ggaXMgYSBsaXN0IG9mCi0gICBlbGVtZW50cyBpbiB0aGUgYXJjaGl2ZSAoeW91IGNhbiBnZXQgdGhhdCBieSBsb29raW5nIHRocm91Z2ggdGhlCi0gICBsaW5rZWQgbGlzdCwgYnV0IHlvdSBoYXZlIHRvIHJlYWQgYSBsb3QgbW9yZSBvZiB0aGUgZmlsZSkuICBUaGUKLSAgIG1lbWJlciB0YWJsZSBoYXMgYSBub3JtYWwgYXJjaGl2ZSBoZWFkZXIgd2l0aCBhbiBlbXB0eSBuYW1lLiAgSXQgaXMKLSAgIG5vcm1hbGx5IChhbmQgcGVyaGFwcyBtdXN0IGJlKSB0aGUgc2Vjb25kIHRvIGxhc3QgZW50cnkgaW4gdGhlCi0gICBhcmNoaXZlLiAgVGhlIG1lbWJlciB0YWJsZSBkYXRhIGlzIGFsbW9zdCBwcmludGFibGUgQVNDSUkuICBJdAotICAgc3RhcnRzIHdpdGggYSAxMiBjaGFyYWN0ZXIgZGVjaW1hbCBzdHJpbmcgd2hpY2ggaXMgdGhlIG51bWJlciBvZgotICAgZW50cmllcyBpbiB0aGUgdGFibGUuICBGb3IgZWFjaCBlbnRyeSBpdCBoYXMgYSAxMiBjaGFyYWN0ZXIgZGVjaW1hbAotICAgc3RyaW5nIHdoaWNoIGlzIHRoZSBvZmZzZXQgaW4gdGhlIGFyY2hpdmUgb2YgdGhhdCBtZW1iZXIuICBUaGVzZQotICAgZW50cmllcyBhcmUgZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3Mgd2hpY2gKLSAgIGFyZSB0aGUgbWVtYmVyIG5hbWVzIGZvciBlYWNoIGVudHJ5LgotCi0gICBGaW5hbGx5LCBhbiBYQ09GRiBhcmNoaXZlIGhhcyBhIGdsb2JhbCBzeW1ib2wgdGFibGUsIHdoaWNoIGlzIHdoYXQKLSAgIHdlIGNhbGwgdGhlIGFybWFwLiAgVGhlIGdsb2JhbCBzeW1ib2wgdGFibGUgaGFzIGEgbm9ybWFsIGFyY2hpdmUKLSAgIGhlYWRlciB3aXRoIGFuIGVtcHR5IG5hbWUuICBJdCBpcyBub3JtYWxseSAoYW5kIHBlcmhhcHMgbXVzdCBiZSkKLSAgIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcmNoaXZlLiAgVGhlIGNvbnRlbnRzIHN0YXJ0IHdpdGggYSBmb3VyIGJ5dGUKLSAgIGJpbmFyeSBudW1iZXIgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgVGhpcyBpcyBmb2xsb3dlZCBieQotICAgYSB0aGF0IG1hbnkgZm91ciBieXRlIGJpbmFyeSBudW1iZXJzOyBlYWNoIGlzIHRoZSBmaWxlIG9mZnNldCBvZiBhbgotICAgZW50cnkgaW4gdGhlIGFyY2hpdmUuICBUaGVzZSBudW1iZXJzIGFyZSBmb2xsb3dlZCBieSBhIHNlcmllcyBvZgotICAgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MsIHdoaWNoIGFyZSBzeW1ib2wgbmFtZXMuICAqLwotCi0vKiBYQ09GRiBhcmNoaXZlcyB1c2UgdGhpcyBhcyBhIG1hZ2ljIHN0cmluZy4gICovCi0KLSNkZWZpbmUgWENPRkZBUk1BRyAiPGFpYWZmPlwwMTIiCi0jZGVmaW5lIFNYQ09GRkFSTUFHIDgKLQotLyogVGhpcyB0ZXJtaW5hdGVzIGFuIFhDT0ZGIGFyY2hpdmUgbWVtYmVyIG5hbWUuICAqLwotCi0jZGVmaW5lIFhDT0ZGQVJGTUFHICJgXDAxMiIKLSNkZWZpbmUgU1hDT0ZGQVJGTUFHIDIKLQotLyogWENPRkYgYXJjaGl2ZXMgc3RhcnQgd2l0aCB0aGlzIChwcmludGFibGUpIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCB4Y29mZl9hcl9maWxlX2hkcgotewotICAvKiBNYWdpYyBzdHJpbmcuICAqLwotICBjaGFyIG1hZ2ljW1NYQ09GRkFSTUFHXTsKLQotICAvKiBPZmZzZXQgb2YgdGhlIG1lbWJlciB0YWJsZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBzeW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgZmlyc3QgbWVtYmVyIGluIHRoZSBhcmNoaXZlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIGZpcnN0bWVtb2ZmWzEyXTsKLQotICAvKiBPZmZzZXQgb2YgdGhlIGxhc3QgbWVtYmVyIGluIHRoZSBhcmNoaXZlIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIGxhc3RtZW1vZmZbMTJdOwotCi0gIC8qIE9mZnNldCBvZiB0aGUgZmlyc3QgbWVtYmVyIG9uIHRoZSBmcmVlIGxpc3QgKGRlY2ltYWwgQVNDSUkKLSAgICAgc3RyaW5nKS4gICovCi0gIGNoYXIgZnJlZW9mZlsxMl07Ci19OwotCi0jZGVmaW5lIFNJWkVPRl9BUl9GSUxFX0hEUiAoNSAqIDEyICsgU1hDT0ZGQVJNQUcpCi0KLS8qIEVhY2ggWENPRkYgYXJjaGl2ZSBtZW1iZXIgc3RhcnRzIHdpdGggdGhpcyAocHJpbnRhYmxlKSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgeGNvZmZfYXJfaGRyCi17Ci0gIC8qIEZpbGUgc2l6ZSBub3QgaW5jbHVkaW5nIHRoZSBoZWFkZXIgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgc2l6ZVsxMl07Ci0KLSAgLyogRmlsZSBvZmZzZXQgb2YgbmV4dCBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBuZXh0b2ZmWzEyXTsKLQotICAvKiBGaWxlIG9mZnNldCBvZiBwcmV2aW91cyBhcmNoaXZlIG1lbWJlciAoZGVjaW1hbCBBU0NJSSBzdHJpbmcpLiAgKi8KLSAgY2hhciBwcmV2b2ZmWzEyXTsKLQotICAvKiBGaWxlIG10aW1lIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIGRhdGVbMTJdOwotCi0gIC8qIEZpbGUgVUlEIChkZWNpbWFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIHVpZFsxMl07Ci0KLSAgLyogRmlsZSBHSUQgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgZ2lkWzEyXTsKLQotICAvKiBGaWxlIG1vZGUgKG9jdGFsIEFTQ0lJIHN0cmluZykuICAqLwotICBjaGFyIG1vZGVbMTJdOwotCi0gIC8qIExlbmd0aCBvZiBmaWxlIG5hbWUgKGRlY2ltYWwgQVNDSUkgc3RyaW5nKS4gICovCi0gIGNoYXIgbmFtbGVuWzRdOwotCi0gIC8qIFRoaXMgc3RydWN0dXJlIGlzIGZvbGxvd2VkIGJ5IHRoZSBmaWxlIG5hbWUuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgICBuYW1lIGlzIGdpdmVuIGluIHRoZSBuYW1sZW4gZmllbGQuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBuYW1lIGlzCi0gICAgIG9kZCwgdGhlIG5hbWUgaXMgZm9sbG93ZWQgYnkgYSBudWxsIGJ5dGUuICBUaGUgbmFtZSBhbmQgb3B0aW9uYWwKLSAgICAgbnVsbCBieXRlIGFyZSBmb2xsb3dlZCBieSBYQ09GRkFSRk1BRywgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluCi0gICAgIG5hbWxlbi4gIFRoZSBjb250ZW50cyBvZiB0aGUgYXJjaGl2ZSBtZW1iZXIgZm9sbG93OyB0aGUgbnVtYmVyIG9mCi0gICAgIGJ5dGVzIGlzIGdpdmVuIGluIHRoZSBzaXplIGZpZWxkLiAgKi8KLX07Ci0KLSNkZWZpbmUgU0laRU9GX0FSX0hEUiAoNyAqIDEyICsgNCkKLQotLyogV2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSB4Y29mZl9hcl9maWxlX2hkciBpbiB0aGUgdGRhdGEgZmllbGQgb2YgdGhlCi0gICBhcnRkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHhjb2ZmX2FyZGF0YShhYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyICopIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSkKLQotLyogV2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSB4Y29mZl9hcl9oZHIgaW4gdGhlIGFyZWx0X2RhdGEgZmllbGQgb2YgYW4KLSAgIGFyY2hpdmUgZWxlbWVudC4gICovCi0jZGVmaW5lIGFyY2hfZWx0ZGF0YShiZmQpICgoc3RydWN0IGFyZWx0ZGF0YSAqKSAoKGJmZCktPmFyZWx0X2RhdGEpKQotI2RlZmluZSBhcmNoX3hoZHIoYmZkKSBcCi0gICgoc3RydWN0IHhjb2ZmX2FyX2hkciAqKSBhcmNoX2VsdGRhdGEgKGJmZCktPmFyY2hfaGVhZGVyKQotCi0vKiBYQ09GRiBhcmNoaXZlcyBkbyBub3QgaGF2ZSBhbnl0aGluZyB3aGljaCBjb3JyZXNwb25kcyB0byBhbgotICAgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfZmFsc2UKLSNkZWZpbmUgeGNvZmZfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSB4Y29mZl90cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0KLS8qIFdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIGdldF9lbHRfYXRfaW5kZXggcm91dGluZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotCi0vKiBYQ09GRiBhcmNoaXZlcyBkbyBub3QgaGF2ZSBhIHRpbWVzdGFtcC4gICovCi0KLSNkZWZpbmUgeGNvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0vKiBSZWFkIGluIHRoZSBhcm1hcCBvZiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGZpbGVfcHRyIG9mZjsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7Ci0gIHNpemVfdCBuYW1sZW47Ci0gIGJmZF9zaXplX3R5cGUgc3o7Ci0gIGJmZF9ieXRlICpjb250ZW50cywgKmNlbmQ7Ci0gIHVuc2lnbmVkIGludCBjLCBpOwotICBjYXJzeW0gKmFyc3ltOwotICBiZmRfYnl0ZSAqcDsKLQotICBpZiAoeGNvZmZfYXJkYXRhIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9oYXNfbWFwIChhYmZkKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG9mZiA9IHN0cnRvbCAoeGNvZmZfYXJkYXRhIChhYmZkKS0+c3ltb2ZmLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBpZiAob2ZmID09IDApCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3ltYm9sIHRhYmxlIHN0YXJ0cyB3aXRoIGEgbm9ybWFsIGFyY2hpdmUgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmaGRyLCBTSVpFT0ZfQVJfSERSLCAxLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTa2lwIHRoZSBuYW1lIChub3JtYWxseSBlbXB0eSkuICAqLwotICBuYW1sZW4gPSBzdHJ0b2wgKGhkci5uYW1sZW4sIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKChuYW1sZW4gKyAxKSAmIH4xKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlYWQgaW4gdGhlIGVudGlyZSBzeW1ib2wgdGFibGUuICAqLwotICBzeiA9IHN0cnRvbCAoaGRyLnNpemUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgc3opOwotICBpZiAoY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIHN6LCBhYmZkKSAhPSBzeikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBzdGFydHMgd2l0aCBhIGZvdXIgYnl0ZSBjb3VudC4gICovCi0gIGMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzKTsKLQotICBpZiAoYyAqIDQgPj0gc3opCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID0gKChjYXJzeW0gKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKGNhcnN5bSkpKTsKLSAgaWYgKGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFmdGVyIHRoZSBjb3VudCBjb21lcyBhIGxpc3Qgb2YgZm91ciBieXRlIGZpbGUgb2Zmc2V0cy4gICovCi0gIGZvciAoaSA9IDAsIGFyc3ltID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMsIHAgPSBjb250ZW50cyArIDQ7Ci0gICAgICAgaSA8IGM7Ci0gICAgICAgKytpLCArK2Fyc3ltLCBwICs9IDQpCi0gICAgYXJzeW0tPmZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBwKTsKLQotICAvKiBBZnRlciB0aGUgZmlsZSBvZmZzZXRzIGNvbWUgbnVsbCB0ZXJtaW5hdGVkIHN5bWJvbCBuYW1lcy4gICovCi0gIGNlbmQgPSBjb250ZW50cyArIHN6OwotICBmb3IgKGkgPSAwLCBhcnN5bSA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzOwotICAgICAgIGkgPCBjOwotICAgICAgICsraSwgKythcnN5bSwgcCArPSBzdHJsZW4gKChjaGFyICopIHApICsgMSkKLSAgICB7Ci0gICAgICBpZiAocCA+PSBjZW5kKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGFyc3ltLT5uYW1lID0gKGNoYXIgKikgcDsKLSAgICB9Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudCA9IGM7Ci0gIGJmZF9oYXNfbWFwIChhYmZkKSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiB0aGlzIGlzIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi14Y29mZl9hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2ZpbGVfaGRyIGhkcjsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9GSUxFX0hEUiwgMSwgYWJmZCkKLSAgICAgICE9IFNJWkVPRl9BUl9GSUxFX0hEUikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKHN0cm5jbXAgKGhkci5tYWdpYywgWENPRkZBUk1BRywgU1hDT0ZGQVJNQUcpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogV2UgYXJlIHNldHRpbmcgYmZkX2FyZGF0YShhYmZkKSBoZXJlLCBidXQgc2luY2UgYmZkX2FyZGF0YQotICAgICBpbnZvbHZlcyBhIGNhc3QsIHdlIGNhbid0IGRvIGl0IGFzIHRoZSBsZWZ0IG9wZXJhbmQgb2YKLSAgICAgYXNzaWdubWVudC4gICovCi0gIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9Ci0gICAgKHN0cnVjdCBhcnRkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGFydGRhdGEpKTsKLQotICBpZiAoYmZkX2FyZGF0YSAoYWJmZCkgPT0gKHN0cnVjdCBhcnRkYXRhICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYmZkX2FyZGF0YSAoYWJmZCktPmZpcnN0X2ZpbGVfZmlsZXBvcyA9IHN0cnRvbCAoaGRyLmZpcnN0bWVtb2ZmLAotCQkJCQkJICAoY2hhciAqKikgTlVMTCwgMTApOwotICBiZmRfYXJkYXRhIChhYmZkKS0+Y2FjaGUgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJjaGl2ZV9oZWFkID0gTlVMTDsKLSAgYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnMgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+ZXh0ZW5kZWRfbmFtZXMgPSBOVUxMOwotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IGJmZF96YWxsb2MgKGFiZmQsIFNJWkVPRl9BUl9GSUxFX0hEUik7Ci0gIGlmIChiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtZW1jcHkgKGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSwgJmhkciwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLQotICBpZiAoISB4Y29mZl9zbHVycF9hcm1hcCAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IChzdHJ1Y3QgYXJ0ZGF0YSAqKSBOVUxMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0vKiBSZWFkIHRoZSBhcmNoaXZlIGhlYWRlciBpbiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIFBUUgoteGNvZmZfcmVhZF9hcl9oZHIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7Ci0gIHNpemVfdCBuYW1sZW47Ci0gIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmhkcnA7Ci0gIHN0cnVjdCBhcmVsdGRhdGEgKnJldDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIFNJWkVPRl9BUl9IRFIsIDEsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmFtbGVuID0gc3RydG9sIChoZHIubmFtbGVuLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBoZHJwID0gKHN0cnVjdCB4Y29mZl9hcl9oZHIgKikgYmZkX2FsbG9jIChhYmZkLCBTSVpFT0ZfQVJfSERSICsgbmFtbGVuICsgMSk7Ci0gIGlmIChoZHJwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG1lbWNweSAoaGRycCwgJmhkciwgU0laRU9GX0FSX0hEUik7Ci0gIGlmIChiZmRfcmVhZCAoKGNoYXIgKikgaGRycCArIFNJWkVPRl9BUl9IRFIsIDEsIG5hbWxlbiwgYWJmZCkgIT0gbmFtbGVuKQotICAgIHJldHVybiBOVUxMOwotICAoKGNoYXIgKikgaGRycClbU0laRU9GX0FSX0hEUiArIG5hbWxlbl0gPSAnXDAnOwotCi0gIHJldCA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJlbHRkYXRhKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0LT5hcmNoX2hlYWRlciA9IChjaGFyICopIGhkcnA7Ci0gIHJldC0+cGFyc2VkX3NpemUgPSBzdHJ0b2wgKGhkci5zaXplLCAoY2hhciAqKikgTlVMTCwgMTApOwotICByZXQtPmZpbGVuYW1lID0gKGNoYXIgKikgaGRycCArIFNJWkVPRl9BUl9IRFI7Ci0KLSAgLyogU2tpcCBvdmVyIHRoZSBYQ09GRkFSRk1BRyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChuYW1sZW4gJiAxKSArIFNYQ09GRkFSRk1BRywgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogT3BlbiB0aGUgbmV4dCBlbGVtZW50IGluIGFuIFhDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYmZkICoKLXhjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaGl2ZSwgbGFzdF9maWxlKQotICAgICBiZmQgKmFyY2hpdmU7Ci0gICAgIGJmZCAqbGFzdF9maWxlOwotewotICBmaWxlX3B0ciBmaWxlc3RhcnQ7Ci0KLSAgaWYgKHhjb2ZmX2FyZGF0YSAoYXJjaGl2ZSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChsYXN0X2ZpbGUgPT0gTlVMTCkKLSAgICBmaWxlc3RhcnQgPSBiZmRfYXJkYXRhIChhcmNoaXZlKS0+Zmlyc3RfZmlsZV9maWxlcG9zOwotICBlbHNlCi0gICAgZmlsZXN0YXJ0ID0gc3RydG9sIChhcmNoX3hoZHIgKGxhc3RfZmlsZSktPm5leHRvZmYsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0KLSAgaWYgKGZpbGVzdGFydCA9PSAwCi0gICAgICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5tZW1vZmYsCi0JCQkgICAgICAoY2hhciAqKikgTlVMTCwgMTApCi0gICAgICB8fCBmaWxlc3RhcnQgPT0gc3RydG9sICh4Y29mZl9hcmRhdGEgKGFyY2hpdmUpLT5zeW1vZmYsCi0JCQkgICAgICAoY2hhciAqKikgTlVMTCwgMTApKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFyY2hpdmUsIGZpbGVzdGFydCk7Ci19Ci0KLS8qIFN0YXQgYW4gZWxlbWVudCBpbiBhbiBYQ09GRiBhcmNoaXZlLiAgKi8KLQotc3RhdGljIGludAoteGNvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpzOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfaGRyICpoZHJwOwotCi0gIGlmIChhYmZkLT5hcmVsdF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaGRycCA9IGFyY2hfeGhkciAoYWJmZCk7Ci0KLSAgcy0+c3RfbXRpbWUgPSBzdHJ0b2wgKGhkcnAtPmRhdGUsIChjaGFyICoqKSBOVUxMLCAxMCk7Ci0gIHMtPnN0X3VpZCA9IHN0cnRvbCAoaGRycC0+dWlkLCAoY2hhciAqKikgTlVMTCwgMTApOwotICBzLT5zdF9naWQgPSBzdHJ0b2wgKGhkcnAtPmdpZCwgKGNoYXIgKiopIE5VTEwsIDEwKTsKLSAgcy0+c3RfbW9kZSA9IHN0cnRvbCAoaGRycC0+bW9kZSwgKGNoYXIgKiopIE5VTEwsIDgpOwotICBzLT5zdF9zaXplID0gYXJjaF9lbHRkYXRhIChhYmZkKS0+cGFyc2VkX3NpemU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE5vcm1hbGl6ZSBhIGZpbGUgbmFtZSBmb3IgaW5jbHVzaW9uIGluIGFuIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemVfZmlsZW5hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgY2hhciAqZmlsZTsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgZmlsZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGUsICcvJyk7Ci0gIGlmIChmaWxlbmFtZSAhPSBOVUxMKQotICAgIGZpbGVuYW1lKys7Ci0gIGVsc2UKLSAgICBmaWxlbmFtZSA9IGZpbGU7Ci0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIFhDT0ZGIGFybWFwLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfYXJtYXAgKGFiZmQsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBoZHI7Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmWzRdOwotICBiZmQgKnN1YjsKLSAgZmlsZV9wdHIgZmlsZW9mZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgbWVtc2V0ICgmaGRyLCAwLCBzaXplb2YgaGRyKTsKLSAgc3ByaW50ZiAoaGRyLnNpemUsICIlbGQiLCAobG9uZykgKDQgKyBvcmxfY291bnQgKiA0ICsgc3RyaWR4KSk7Ci0gIHNwcmludGYgKGhkci5uZXh0b2ZmLCAiJWQiLCAwKTsKLSAgbWVtY3B5IChoZHIucHJldm9mZiwgeGNvZmZfYXJkYXRhIChhYmZkKS0+bWVtb2ZmLCAxMik7Ci0gIHNwcmludGYgKGhkci5kYXRlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoaGRyLnVpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5naWQsICIlZCIsIDApOwotICBzcHJpbnRmIChoZHIubW9kZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGhkci5uYW1sZW4sICIlZCIsIDApOwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZoZHI7IHAgPCAoY2hhciAqKSAmaGRyICsgU0laRU9GX0FSX0hEUjsgcCsrKQotICAgIGlmICgqcCA9PSAnXDAnKQotICAgICAgKnAgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgU0laRU9GX0FSX0hEUiwgMSwgYWJmZCkgIT0gU0laRU9GX0FSX0hEUgotICAgICAgfHwgYmZkX3dyaXRlIChYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKSAhPSBTWENPRkZBUkZNQUcpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBvcmxfY291bnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICBmaWxlb2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSOwotICBpID0gMDsKLSAgd2hpbGUgKHN1YiAhPSBOVUxMICYmIGkgPCBvcmxfY291bnQpCi0gICAgewotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbaV0pLnBvcykgPT0gc3ViKQotCXsKLQkgIGJmZF9oX3B1dF8zMiAoYWJmZCwgZmlsZW9mZiwgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKytpOwotCX0KLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpKTsKLSAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOwotICAgICAgZmlsZW9mZiArPSAoU0laRU9GX0FSX0hEUgotCQkgICsgbmFtbGVuCi0JCSAgKyBTWENPRkZBUkZNQUcKLQkJICArIGFyZWx0X3NpemUgKHN1YikpOwotICAgICAgZmlsZW9mZiA9IChmaWxlb2ZmICsgMSkgJn4gMTsKLSAgICAgIHN1YiA9IHN1Yi0+bmV4dDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG9ybF9jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzaXplX3QgbmFtbGVuOwotCi0gICAgICBuYW1lID0gKm1hcFtpXS5uYW1lOwotICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKG5hbWUsIDEsIG5hbWxlbiArIDEsIGFiZmQpICE9IG5hbWxlbiArIDEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKHN0cmlkeCAmIDEpICE9IDApCi0gICAgewotICAgICAgY2hhciBiOwotCi0gICAgICBiID0gJ1wwJzsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBYQ09GRiBhcmNoaXZlLiAgV2UgYWx3YXlzIHdyaXRlIGFuIGVudGlyZSBhcmNoaXZlLAotICAgcmF0aGVyIHRoYW4gZnVzc2luZyB3aXRoIHRoZSBmcmVlbGlzdCBhbmQgc28gZm9ydGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfd3JpdGVfYXJjaGl2ZV9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgeGNvZmZfYXJfZmlsZV9oZHIgZmhkcjsKLSAgc2l6ZV90IGNvdW50OwotICBzaXplX3QgdG90YWxfbmFtbGVuOwotICBmaWxlX3B0ciAqb2Zmc2V0czsKLSAgYm9vbGVhbiBtYWtlbWFwOwotICBib29sZWFuIGhhc29iamVjdHM7Ci0gIGZpbGVfcHRyIHByZXZvZmYsIG5leHRvZmY7Ci0gIGJmZCAqc3ViOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IHhjb2ZmX2FyX2hkciBhaGRyOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgZGVjYnVmWzEzXTsKLQotICBtZW1zZXQgKCZmaGRyLCAwLCBzaXplb2YgZmhkcik7Ci0gIHN0cm5jcHkgKGZoZHIubWFnaWMsIFhDT0ZGQVJNQUcsIFNYQ09GRkFSTUFHKTsKLSAgc3ByaW50ZiAoZmhkci5maXJzdG1lbW9mZiwgIiVkIiwgU0laRU9GX0FSX0ZJTEVfSERSKTsKLSAgc3ByaW50ZiAoZmhkci5mcmVlb2ZmLCAiJWQiLCAwKTsKLQotICBjb3VudCA9IDA7Ci0gIHRvdGFsX25hbWxlbiA9IDA7Ci0gIGZvciAoc3ViID0gYWJmZC0+YXJjaGl2ZV9oZWFkOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5uZXh0KQotICAgIHsKLSAgICAgICsrY291bnQ7Ci0gICAgICB0b3RhbF9uYW1sZW4gKz0gc3RybGVuIChub3JtYWxpemVfZmlsZW5hbWUgKHN1YikpICsgMTsKLSAgICB9Ci0gIG9mZnNldHMgPSAoZmlsZV9wdHIgKikgYmZkX2FsbG9jIChhYmZkLCBjb3VudCAqIHNpemVvZiAoZmlsZV9wdHIpKTsKLSAgaWYgKG9mZnNldHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBTSVpFT0ZfQVJfRklMRV9IRFIsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtYWtlbWFwID0gYmZkX2hhc19tYXAgKGFiZmQpOwotICBoYXNvYmplY3RzID0gZmFsc2U7Ci0gIHByZXZvZmYgPSAwOwotICBuZXh0b2ZmID0gU0laRU9GX0FSX0ZJTEVfSERSOwotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZCwgaSA9IDA7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPm5leHQsIGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLSAgICAgIHN0cnVjdCB4Y29mZl9hcl9oZHIgKmFoZHJwOwotICAgICAgYmZkX3NpemVfdHlwZSByZW1haW5pbmc7Ci0KLSAgICAgIGlmIChtYWtlbWFwICYmICEgaGFzb2JqZWN0cykKLQl7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoc3ViLCBiZmRfb2JqZWN0KSkKLQkgICAgaGFzb2JqZWN0cyA9IHRydWU7Ci0JfQotCi0gICAgICBuYW1lID0gbm9ybWFsaXplX2ZpbGVuYW1lIChzdWIpOwotICAgICAgbmFtbGVuID0gc3RybGVuIChuYW1lKTsKLQotICAgICAgaWYgKHN1Yi0+YXJlbHRfZGF0YSAhPSBOVUxMKQotCWFoZHJwID0gYXJjaF94aGRyIChzdWIpOwotICAgICAgZWxzZQotCWFoZHJwID0gTlVMTDsKLQotICAgICAgaWYgKGFoZHJwID09IE5VTEwpCi0JewotCSAgc3RydWN0IHN0YXQgczsKLQotCSAgbWVtc2V0ICgmYWhkciwgMCwgc2l6ZW9mIGFoZHIpOwotCSAgYWhkcnAgPSAmYWhkcjsKLQkgIGlmIChzdGF0IChiZmRfZ2V0X2ZpbGVuYW1lIChzdWIpLCAmcykgIT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHNwcmludGYgKGFoZHJwLT5zaXplLCAiJWxkIiwgKGxvbmcpIHMuc3Rfc2l6ZSk7Ci0JICBzcHJpbnRmIChhaGRycC0+ZGF0ZSwgIiVsZCIsIChsb25nKSBzLnN0X210aW1lKTsKLQkgIHNwcmludGYgKGFoZHJwLT51aWQsICIlbGQiLCAobG9uZykgcy5zdF91aWQpOwotCSAgc3ByaW50ZiAoYWhkcnAtPmdpZCwgIiVsZCIsIChsb25nKSBzLnN0X2dpZCk7Ci0JICBzcHJpbnRmIChhaGRycC0+bW9kZSwgIiVvIiwgKHVuc2lnbmVkIGludCkgcy5zdF9tb2RlKTsKLQotCSAgaWYgKHN1Yi0+YXJlbHRfZGF0YSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3ViLT5hcmVsdF9kYXRhID0gYmZkX2FsbG9jIChzdWIsIHNpemVvZiAoc3RydWN0IGFyZWx0ZGF0YSkpOwotCSAgICAgIGlmIChzdWItPmFyZWx0X2RhdGEgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGFyY2hfZWx0ZGF0YSAoc3ViKS0+cGFyc2VkX3NpemUgPSBzLnN0X3NpemU7Ci0JfQotCi0gICAgICBzcHJpbnRmIChhaGRycC0+cHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLSAgICAgIHNwcmludGYgKGFoZHJwLT5uYW1sZW4sICIlbGQiLCAobG9uZykgbmFtbGVuKTsKLQotICAgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBpcyBvZGQsIHdlIHdyaXRlIG91dCB0aGUgbnVsbCBieXRlCi0gICAgICAgICBhZnRlciB0aGUgbmFtZSBhcyB3ZWxsLiAgKi8KLSAgICAgIG5hbWxlbiA9IChuYW1sZW4gKyAxKSAmfiAxOwotCi0gICAgICByZW1haW5pbmcgPSBhcmVsdF9zaXplIChzdWIpOwotICAgICAgc2l6ZSA9IChTSVpFT0ZfQVJfSERSCi0JICAgICAgKyBuYW1sZW4KLQkgICAgICArIFNYQ09GRkFSRk1BRwotCSAgICAgICsgcmVtYWluaW5nKTsKLQotICAgICAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotCi0gICAgICBvZmZzZXRzW2ldID0gbmV4dG9mZjsKLQotICAgICAgcHJldm9mZiA9IG5leHRvZmY7Ci0gICAgICBuZXh0b2ZmICs9IHNpemUgKyAoc2l6ZSAmIDEpOwotCi0gICAgICBzcHJpbnRmIChhaGRycC0+bmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLQotICAgICAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgICAgIGZvciAocCA9IChjaGFyICopIGFoZHJwOyBwIDwgKGNoYXIgKikgYWhkcnAgKyBTSVpFT0ZfQVJfSERSOyBwKyspCi0JaWYgKCpwID09ICdcMCcpCi0JICAqcCA9ICcgJzsKLQotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYWhkcnAsIDEsIFNJWkVPRl9BUl9IRFIsIGFiZmQpICE9IFNJWkVPRl9BUl9IRFIKLQkgIHx8IGJmZF93cml0ZSAoKFBUUikgbmFtZSwgMSwgbmFtbGVuLCBhYmZkKSAhPSBuYW1sZW4KLQkgIHx8IChiZmRfd3JpdGUgKChQVFIpIFhDT0ZGQVJGTUFHLCAxLCBTWENPRkZBUkZNQUcsIGFiZmQpCi0JICAgICAgIT0gU1hDT0ZGQVJGTUFHKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoc3ViLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHdoaWxlIChyZW1haW5pbmcgIT0gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGFtdDsKLQkgIGJmZF9ieXRlIGJ1ZmZlcltERUZBVUxUX0JVRkZFUlNJWkVdOwotCi0JICBhbXQgPSBzaXplb2YgYnVmZmVyOwotCSAgaWYgKGFtdCA+IHJlbWFpbmluZykKLQkgICAgYW10ID0gcmVtYWluaW5nOwotCSAgaWYgKGJmZF9yZWFkIChidWZmZXIsIDEsIGFtdCwgc3ViKSAhPSBhbXQKLQkgICAgICB8fCBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgYW10LCBhYmZkKSAhPSBhbXQpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbWFpbmluZyAtPSBhbXQ7Ci0JfQotCi0gICAgICBpZiAoKHNpemUgJiAxKSAhPSAwKQotCXsKLQkgIGJmZF9ieXRlIGI7Ci0KLQkgIGIgPSAnXDAnOwotCSAgaWYgKGJmZF93cml0ZSAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHNwcmludGYgKGZoZHIubGFzdG1lbW9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIG1lbWJlciB0YWJsZS4gICovCi0KLSAgQkZEX0FTU0VSVCAobmV4dG9mZiA9PSBiZmRfdGVsbCAoYWJmZCkpOwotICBzcHJpbnRmIChmaGRyLm1lbW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLQotICBtZW1zZXQgKCZhaGRyLCAwLCBzaXplb2YgYWhkcik7Ci0gIHNwcmludGYgKGFoZHIuc2l6ZSwgIiVsZCIsIChsb25nKSAoMTIgKyBjb3VudCAqIDEyICsgdG90YWxfbmFtbGVuKSk7Ci0gIHNwcmludGYgKGFoZHIucHJldm9mZiwgIiVsZCIsIChsb25nKSBwcmV2b2ZmKTsKLSAgc3ByaW50ZiAoYWhkci5kYXRlLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoYWhkci51aWQsICIlZCIsIDApOwotICBzcHJpbnRmIChhaGRyLmdpZCwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIubW9kZSwgIiVkIiwgMCk7Ci0gIHNwcmludGYgKGFoZHIubmFtbGVuLCAiJWQiLCAwKTsKLQotICBzaXplID0gKFNJWkVPRl9BUl9IRFIKLQkgICsgMTIKLQkgICsgY291bnQgKiAxMgotCSAgKyB0b3RhbF9uYW1sZW4KLQkgICsgU1hDT0ZGQVJGTUFHKTsKLQotICBwcmV2b2ZmID0gbmV4dG9mZjsKLSAgbmV4dG9mZiArPSBzaXplICsgKHNpemUgJiAxKTsKLQotICBpZiAobWFrZW1hcCAmJiBoYXNvYmplY3RzKQotICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLSAgZWxzZQotICAgIHNwcmludGYgKGFoZHIubmV4dG9mZiwgIiVkIiwgMCk7Ci0KLSAgLyogV2UgbmVlZCBzcGFjZXMsIG5vdCBudWxsIGJ5dGVzLCBpbiB0aGUgaGVhZGVyLiAgKi8KLSAgZm9yIChwID0gKGNoYXIgKikgJmFoZHI7IHAgPCAoY2hhciAqKSAmYWhkciArIFNJWkVPRl9BUl9IRFI7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZhaGRyLCAxLCBTSVpFT0ZfQVJfSERSLCBhYmZkKSAhPSBTSVpFT0ZfQVJfSERSCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSBYQ09GRkFSRk1BRywgMSwgU1hDT0ZGQVJGTUFHLCBhYmZkKQotCSAgIT0gU1hDT0ZGQVJGTUFHKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3ByaW50ZiAoZGVjYnVmLCAiJS0xMmxkIiwgKGxvbmcpIGNvdW50KTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVjYnVmLCAxLCAxMiwgYWJmZCkgIT0gMTIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzcHJpbnRmIChkZWNidWYsICIlLTEybGQiLCAobG9uZykgb2Zmc2V0c1tpXSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBkZWNidWYsIDEsIDEyLCBhYmZkKSAhPSAxMikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBmb3IgKHN1YiA9IGFiZmQtPmFyY2hpdmVfaGVhZDsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc2l6ZV90IG5hbWxlbjsKLQotICAgICAgbmFtZSA9IG5vcm1hbGl6ZV9maWxlbmFtZSAoc3ViKTsKLSAgICAgIG5hbWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBuYW1lLCAxLCBuYW1sZW4gKyAxLCBhYmZkKSAhPSBuYW1sZW4gKyAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoc2l6ZSAmIDEpICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYjsKLQotICAgICAgYiA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgYXJtYXAsIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQotICBpZiAoISBtYWtlbWFwIHx8ICEgaGFzb2JqZWN0cykKLSAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVkIiwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChuZXh0b2ZmID09IGJmZF90ZWxsIChhYmZkKSk7Ci0gICAgICBzcHJpbnRmIChmaGRyLnN5bW9mZiwgIiVsZCIsIChsb25nKSBuZXh0b2ZmKTsKLSAgICAgIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IChQVFIpICZmaGRyOwotICAgICAgaWYgKCEgX2JmZF9jb21wdXRlX2FuZF93cml0ZV9hcm1hcCAoYWJmZCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGFyY2hpdmUgZmlsZSBoZWFkZXIuICAqLwotCi0gIC8qIFdlIG5lZWQgc3BhY2VzLCBub3QgbnVsbCBieXRlcywgaW4gdGhlIGhlYWRlci4gICovCi0gIGZvciAocCA9IChjaGFyICopICZmaGRyOyBwIDwgKGNoYXIgKikgJmZoZHIgKyBTSVpFT0ZfQVJfRklMRV9IRFI7IHArKykKLSAgICBpZiAoKnAgPT0gJ1wwJykKLSAgICAgICpwID0gJyAnOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgJmZoZHIsIFNJWkVPRl9BUl9GSUxFX0hEUiwgMSwgYWJmZCkgIT0KLQkgIFNJWkVPRl9BUl9GSUxFX0hEUikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgY2FuJ3QgdXNlIHRoZSB1c3VhbCBjb2ZmX3NpemVvZl9oZWFkZXJzIHJvdXRpbmUsIGJlY2F1c2UgQUlYCi0gICBhbHdheXMgdXNlcyBhbiBhLm91dCBoZWFkZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLV9iZmRfeGNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gIGludCBzaXplOwotCi0gIHNpemUgPSBGSUxIU1o7Ci0gIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNpemUgKz0gQU9VVFNaOwotICBlbHNlCi0gICAgc2l6ZSArPSBTTUFMTF9BT1VUU1o7Ci0gIHNpemUgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIFNDTkhTWjsKLSAgcmV0dXJuIHNpemU7Ci19Ci0MCi0jZGVmaW5lIENPUkVfRklMRV9QIF9iZmRfZHVtbXlfdGFyZ2V0Ci0KLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFwKLSAgX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLSNpZmRlZiBBSVhfQ09SRQotI3VuZGVmIENPUkVfRklMRV9QCi0jZGVmaW5lIENPUkVfRklMRV9QIHJzNjAwMGNvZmZfY29yZV9wCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIHJzNjAwMGNvZmZfY29yZV9wICgpOwotZXh0ZXJuIGJvb2xlYW4gcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoKTsKLWV4dGVybiBib29sZWFuIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotCi0jdW5kZWYJY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSNkZWZpbmUgY29mZl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIFwKLQkJCQkgICAgIHJzNjAwMGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLWV4dGVybiBjaGFyICpyczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotZXh0ZXJuIGludCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCByczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi0jdW5kZWYJY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZQljb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCXJzNjAwMGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZiAvKiBBSVhfQ09SRSAqLwotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLSN1bmRlZiBDT1JFX0ZJTEVfUAotI2RlZmluZSBDT1JFX0ZJTEVfUCBseW54X2NvcmVfZmlsZV9wCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gbHlueF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICpjb3JlX2JmZCwKLQkJCQkJCQkgICAgYmZkICpleGVjX2JmZCkpOwotI3VuZGVmCWNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0KLWV4dGVybiBjaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jdW5kZWYgY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi0jZGVmaW5lIGNvZmZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLQotZXh0ZXJuIGludCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSN1bmRlZiBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotI2RlZmluZSBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCi0KLSNkZWZpbmUgX2JmZF94Y29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIF9iZmRfeGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9nY19zZWN0aW9ucyBjb2ZmX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBfYmZkX3hjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gY29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoZSB0cmFuc2ZlciB2ZWN0b3IgdGhhdCBsZWFkcyB0aGUgb3V0c2lkZSB3b3JsZCB0byBhbGwgb2YgdGhlIGFib3ZlLiAqLwotCi1jb25zdCBiZmRfdGFyZ2V0Ci0jaWZkZWYgVEFSR0VUX1NZTQotICBUQVJHRVRfU1lNID0KLSNlbHNlCi0gIHJzNjAwMGNvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImFpeGNvZmYtcnM2MDAwIiwJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwJCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGJpZyAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgRFlOQU1JQyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIGNoYXIgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4/Pz8gRklYTUVtZ28gKi8KLQotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIHhjb2ZmX2FyY2hpdmVfcCwgQ09SRV9GSUxFX1B9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LAkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICB4Y29mZl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHhjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF94Y29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfeGNvZmYpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi1zaC5jIGIvYmZkL2NvZmYtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2MDI4ZC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhpdGFjaGkgU3VwZXItSCBDT0ZGIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotICAgUmVsYXhpbmcgY29kZSB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJjb2ZmL3NoLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogSW50ZXJuYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc2hfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBnZXRfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKnNoX2luc25faW5mbyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNoX2FsaWduX2xvYWRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX2J5dGUgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9zd2FwX2luc25zCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHNoX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSk7Ci0KLS8qIERlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4gICovCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoNCkKLQotLyogR2VuZXJhdGUgbG9uZyBmaWxlIG5hbWVzLiAgKi8KLSNkZWZpbmUgQ09GRl9MT05HX0ZJTEVOQU1FUwotCi0vKiBUaGUgc3VwcG9ydGVkIHJlbG9jYXRpb25zLiAgVGhlcmUgYXJlIGEgbG90IG9mIHJlbG9jYXRpb25zIGRlZmluZWQKLSAgIGluIGNvZmYvaW50ZXJuYWwuaCB3aGljaCB3ZSBkbyBub3QgZXhwZWN0IHRvIGV2ZXIgc2VlLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHNoX2NvZmZfaG93dG9zW10gPQotewotICB7IDAgfSwKLSAgeyAxIH0sCi0gIHsgMiB9LAotICB7IDMgfSwgLyogUl9TSF9QQ1JFTDggKi8KLSAgeyA0IH0sIC8qIFJfU0hfUENSRUwxNiAqLwotICB7IDUgfSwgLyogUl9TSF9ISUdIOCAqLwotICB7IDYgfSwgLyogUl9TSF9JTU0yNCAqLwotICB7IDcgfSwgLyogUl9TSF9MT1cxNiAqLwotICB7IDggfSwKLSAgeyA5IH0sIC8qIFJfU0hfUENESVNQOEJZNCAqLwotCi0gIEhPV1RPIChSX1NIX1BDRElTUDhCWTIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjZGlzcDhieTIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICB7IDExIH0sIC8qIFJfU0hfUENESVNQOCAqLwotCi0gIEhPV1RPIChSX1NIX1BDRElTUCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9wY2Rpc3AxMmJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgeyAxMyB9LAotCi0gIEhPV1RPIChSX1NIX0lNTTMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2ltbTMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICB7IDE1IH0sCi0gIHsgMTYgfSwgLyogUl9TSF9JTU04ICovCi0gIHsgMTcgfSwgLyogUl9TSF9JTU04QlkyICovCi0gIHsgMTggfSwgLyogUl9TSF9JTU04Qlk0ICovCi0gIHsgMTkgfSwgLyogUl9TSF9JTU00ICovCi0gIHsgMjAgfSwgLyogUl9TSF9JTU00QlkyICovCi0gIHsgMjEgfSwgLyogUl9TSF9JTU00Qlk0ICovCi0KLSAgSE9XVE8gKFJfU0hfUENSRUxJTU04QlkyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3BjcmVsaW1tOGJ5MiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1BDUkVMSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9wY3JlbGltbThieTQiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9JTU0xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9pbW0xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1NXSVRDSDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX3N3aXRjaDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfU1dJVENIMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfc3dpdGNoMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX1VTRVMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfdXNlcyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0NPVU5ULAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2NvdW50IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9BTElHTiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9hbGlnbiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfU0hfQ09ERSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAicl9jb2RlIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9EQVRBLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2RhdGEiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1NIX0xBQkVMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJyX2xhYmVsIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9TSF9TV0lUQ0g4LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgInJfc3dpdGNoOCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSkJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLSNkZWZpbmUgU0hfQ09GRl9IT1dUT19DT1VOVCAoc2l6ZW9mIHNoX2NvZmZfaG93dG9zIC8gc2l6ZW9mIHNoX2NvZmZfaG93dG9zWzBdKQotCi0vKiBDaGVjayBmb3IgYSBiYWQgbWFnaWMgbnVtYmVyLiAgKi8KLSNkZWZpbmUgQkFETUFHKHgpIFNIQkFETUFHKHgpCi0KLS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICh0aGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZCkuICAqLwotI2RlZmluZSBTSCAxCi0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgc2V0IGhlcmUuICAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogU3dhcCB0aGUgcl9vZmZzZXQgZmllbGQgaW4gYW5kIG91dC4gICovCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotCi0vKiBTd2FwIG91dCBleHRyYSBpbmZvcm1hdGlvbiBpbiB0aGUgcmVsb2Mgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCwgc3JjLCBkc3QpCVwKLSAgZG8JCQkJCQlcCi0gICAgewkJCQkJCVwKLSAgICAgIGRzdC0+cl9zdHVmZlswXSA9ICdTJzsJCQlcCi0gICAgICBkc3QtPnJfc3R1ZmZbMV0gPSAnQyc7CQkJXAotICAgIH0JCQkJCQlcCi0gIHdoaWxlICgwKQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLCB3aGVuIHBlcmZvcm1pbmcgYSByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGxvbmcKLWdldF9zeW1ib2xfdmFsdWUgKHN5bWJvbCkgICAgICAgCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgCi0gICAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlICsKLQkJICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCQkgIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgcmV0dXJuIHJlbG9jYXRpb247Ci19Ci0KLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCBpbiBjb2ZmY29kZS5oIHRvIGdldCB0aGUgaG93dG8gY29ycmVzcG9uZGluZyB0bwotICAgYW4gaW50ZXJuYWwgcmVsb2MuICAqLwotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKHJlbGVudCwgaW50ZXJuYWwpCQlcCi0gICgocmVsZW50KS0+aG93dG8gPQkJCQlcCi0gICAoKGludGVybmFsKS0+cl90eXBlIDwgU0hfQ09GRl9IT1dUT19DT1VOVAlcCi0gICAgPyAmc2hfY29mZl9ob3d0b3NbKGludGVybmFsKS0+cl90eXBlXQlcCi0gICAgOiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKSkKLQotLyogVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbWFjcm8gaW4gY29mZmNvZGUuaCwgZXhjZXB0IHRoYXQgaXQgY29waWVzCi0gICByX29mZnNldCBpbnRvIHJlbG9jX2VudHJ5LT5hZGRlbmQgZm9yIHNvbWUgcmVsb2NzLiAgKi8KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgcHRyLCByZWxvYywgY2FjaGVfcHRyKSAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZzeW0gPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOyAgICAgIFwKLSAgICBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSAhPSBhYmZkKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gKG9ial9zeW1ib2xzIChhYmZkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICArIChjYWNoZV9wdHItPnN5bV9wdHJfcHRyIC0gc3ltYm9scykpOyAgICAgICAgIFwKLSAgICBlbHNlIGlmIChwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb2Zmc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcHRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChjb2Zmc3ltICE9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgJiYgY29mZnN5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID09IDApICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0ciAmJiBiZmRfYXN5bWJvbF9iZmQgKHB0cikgPT0gYWJmZCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAmJiBwdHItPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpICAgICAgICAgICAgICBcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IC0gKHB0ci0+c2VjdGlvbi0+dm1hICsgcHRyLT52YWx1ZSk7ICAgXAotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKChyZWxvYykucl90eXBlID09IFJfU0hfU1dJVENIOAkJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9TV0lUQ0gxNgkJCVwKLQl8fCAocmVsb2MpLnJfdHlwZSA9PSBSX1NIX1NXSVRDSDMyCQkJXAotCXx8IChyZWxvYykucl90eXBlID09IFJfU0hfVVNFUwkJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9DT1VOVAkJCQlcCi0JfHwgKHJlbG9jKS5yX3R5cGUgPT0gUl9TSF9BTElHTikJCQlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IChyZWxvYykucl9vZmZzZXQ7CQkJXAotICB9Ci0KLS8qIFRoaXMgaXMgdGhlIGhvd3RvIGZ1bmN0aW9uIGZvciB0aGUgU0ggcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zaF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF92bWEgc3ltX3ZhbHVlOwotICB1bnNpZ25lZCBzaG9ydCByX3R5cGU7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBhZGRyICsgKGJmZF9ieXRlICopIGRhdGE7Ci0KLSAgcl90eXBlID0gcmVsb2NfZW50cnktPmhvd3RvLT50eXBlOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogUGFydGlhbCBsaW5raW5nLS1kbyBub3RoaW5nLiAgKi8KLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBBbG1vc3QgYWxsIHJlbG9jcyBoYXZlIHRvIGRvIHdpdGggcmVsYXhpbmcuICBJZiBhbnkgd29yayBtdXN0IGJlCi0gICAgIGRvbmUgZm9yIHRoZW0sIGl0IGhhcyBiZWVuIGRvbmUgaW4gc2hfcmVsYXhfc2VjdGlvbi4gICovCi0gIGlmIChyX3R5cGUgIT0gUl9TSF9JTU0zMgotICAgICAgJiYgKHJfdHlwZSAhPSBSX1NIX1BDRElTUAotCSAgfHwgKHN5bWJvbF9pbi0+ZmxhZ3MgJiBCU0ZfTE9DQUwpICE9IDApKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgaWYgKHN5bWJvbF9pbiAhPSBOVUxMCi0gICAgICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9pbi0+c2VjdGlvbikpCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgc3ltX3ZhbHVlID0gZ2V0X3N5bWJvbF92YWx1ZSAoc3ltYm9sX2luKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1NIX0lNTTMyOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIGluc24gKz0gc3ltX3ZhbHVlICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9TSF9QQ0RJU1A6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgaGl0X2RhdGEpOwotICAgICAgc3ltX3ZhbHVlICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBzeW1fdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgKyBhZGRyCi0JCSAgICArIDQpOwotICAgICAgc3ltX3ZhbHVlICs9IChpbnNuICYgMHhmZmYpIDw8IDE7Ci0gICAgICBpZiAoaW5zbiAmIDB4ODAwKQotCXN5bV92YWx1ZSAtPSAweDEwMDA7Ci0gICAgICBpbnNuID0gKGluc24gJiAweGYwMDApIHwgKHN5bV92YWx1ZSAmIDB4ZmZmKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGhpdF9kYXRhKTsKLSAgICAgIGlmIChzeW1fdmFsdWUgPCAoYmZkX3ZtYSkgLTB4MTAwMCB8fCBzeW1fdmFsdWUgPj0gMHgxMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotI2RlZmluZSBjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoCi0KLS8qIFdlIGNhbiBkbyByZWxheGluZy4gICovCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24gc2hfcmVsYXhfc2VjdGlvbgotCi0vKiBXZSB1c2UgdGhlIHNwZWNpYWwgQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0jZGVmaW5lIGNvZmZfcmVsb2NhdGVfc2VjdGlvbiBzaF9yZWxvY2F0ZV9zZWN0aW9uCi0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gdXNlIHNwZWNpYWwgY29kZSB0byBnZXQgdGhlIHJlbG9jYXRlZAotICAgc2VjdGlvbiBjb250ZW50cy4gICovCi0jZGVmaW5lIGNvZmZfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIHNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIG9uIHRoZSBTSC4KLQotICAgRnVuY3Rpb24gY2FsbHMgb24gdGhlIFNIIGxvb2sgbGlrZSB0aGlzOgotCi0gICAgICAgbW92bCAgTDEscjAKLSAgICAgICAuLi4KLSAgICAgICBqc3IgICBAcjAKLSAgICAgICAuLi4KLSAgICAgTDE6Ci0gICAgICAgLmxvbmcgZnVuY3Rpb24KLQotICAgVGhlIGNvbXBpbGVyIGFuZCBhc3NlbWJsZXIgd2lsbCBjb29wZXJhdGUgdG8gY3JlYXRlIFJfU0hfVVNFUwotICAgcmVsb2NzIG9uIHRoZSBqc3IgaW5zdHJ1Y3Rpb25zLiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZQotICAgUl9TSF9VU0VTIHJlbG9jIGlzIHRoZSBQQyByZWxhdGl2ZSBvZmZzZXQgdG8gdGhlIGluc3RydWN0aW9uIHdoaWNoCi0gICBsb2FkcyB0aGUgcmVnaXN0ZXIgKHRoZSByX29mZnNldCBmaWVsZCBpcyBjb21wdXRlZCBhcyB0aG91Z2ggaXQKLSAgIHdlcmUgYSBqdW1wIGluc3RydWN0aW9uLCBzbyB0aGUgb2Zmc2V0IHZhbHVlIGlzIGFjdHVhbGx5IGZyb20gZm91cgotICAgYnl0ZXMgcGFzdCB0aGUgaW5zdHJ1Y3Rpb24pLiAgVGhlIGxpbmtlciBjYW4gdXNlIHRoaXMgcmVsb2MgdG8KLSAgIGRldGVybWluZSBqdXN0IHdoaWNoIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCwgYW5kIHRodXMgZGVjaWRlCi0gICB3aGV0aGVyIGl0IGlzIHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLgotCi0gICBJZiBtdWx0aXBsZSBmdW5jdGlvbiBjYWxscyBhcmUgYWxsIGJhc2VkIG9uIGEgc2luZ2xlIHJlZ2lzdGVyIGxvYWQKLSAgIChpLmUuLCB0aGUgc2FtZSBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMpLCB0aGUgY29tcGlsZXIKLSAgIGd1YXJhbnRlZXMgdGhhdCBlYWNoIGZ1bmN0aW9uIGNhbGwgd2lsbCBoYXZlIGFuIFJfU0hfVVNFUyByZWxvYy4KLSAgIFRoZXJlZm9yZSwgaWYgdGhlIGxpbmtlciBpcyBhYmxlIHRvIGNvbnZlcnQgZWFjaCBSX1NIX1VTRVMgcmVsb2MKLSAgIHdoaWNoIHJlZmVycyB0byB0aGF0IGFkZHJlc3MsIGl0IGNhbiBzYWZlbHkgZWxpbWluYXRlIHRoZSByZWdpc3RlcgotICAgbG9hZC4KLQotICAgV2hlbiB0aGUgYXNzZW1ibGVyIGNyZWF0ZXMgYW4gUl9TSF9VU0VTIHJlbG9jLCBpdCBleGFtaW5lcyBpdCB0bwotICAgZGV0ZXJtaW5lIHdoaWNoIGFkZHJlc3MgaXMgYmVpbmcgbG9hZGVkIChMMSBpbiB0aGUgYWJvdmUgZXhhbXBsZSkuCi0gICBJdCB0aGVuIGNvdW50cyB0aGUgbnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gdGhhdCBhZGRyZXNzLCBhbmQKLSAgIGNyZWF0ZXMgYW4gUl9TSF9DT1VOVCByZWxvYyBhdCB0aGF0IGFkZHJlc3MuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YKLSAgIHRoZSBSX1NIX0NPVU5UIHJlbG9jIHdpbGwgYmUgdGhlIG51bWJlciBvZiByZWZlcmVuY2VzLiAgSWYgdGhlCi0gICBsaW5rZXIgaXMgYWJsZSB0byBlbGltaW5hdGUgYSByZWdpc3RlciBsb2FkLCBpdCBjYW4gdXNlIHRoZQotICAgUl9TSF9DT1VOVCByZWxvYyB0byBzZWUgd2hldGhlciBpdCBjYW4gYWxzbyBlbGltaW5hdGUgdGhlIGZ1bmN0aW9uCi0gICBhZGRyZXNzLgotCi0gICBTSCByZWxheGluZyBhbHNvIGhhbmRsZXMgYW5vdGhlciwgdW5yZWxhdGVkLCBtYXR0ZXIuICBPbiB0aGUgU0gsIGlmCi0gICBhIGxvYWQgb3Igc3RvcmUgaW5zdHJ1Y3Rpb24gaXMgbm90IGFsaWduZWQgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnksCi0gICB0aGUgbWVtb3J5IGN5Y2xlIGludGVyZmVyZXMgd2l0aCB0aGUgMzIgYml0IGluc3RydWN0aW9uIGZldGNoLAotICAgY2F1c2luZyBhIG9uZSBjeWNsZSBidWJibGUgaW4gdGhlIHBpcGVsaW5lLiAgVGhlcmVmb3JlLCB3ZSB0cnkgdG8KLSAgIGFsaWduIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyBvbiBmb3VyIGJ5dGUgYm91bmRhcmllcyBpZiB3ZQotICAgY2FuLCBieSBzd2FwcGluZyB0aGVtIHdpdGggb25lIG9mIHRoZSBhZGphY2VudCBpbnN0cnVjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNoX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBib29sZWFuIGhhdmVfY29kZTsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotCi0gICphZ2FpbiA9IGZhbHNlOwotCi0gIGlmIChsaW5rX2luZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLSAgICAgIHx8IHNlYy0+cmVsb2NfY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGhhdmUgYmVlbiBjYWxsZWQgZm9yIHRoaXMgc2VjdGlvbiwKLSAgICAgaW5pdGlhbGl6ZSB0aGUgY29va2VkIHNpemUuICAqLwotICBpZiAoc2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzZWMtPl9jb29rZWRfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCBsaW5rX2luZm8tPmtlZXBfbWVtb3J5LAotCQkgICAgICAoYmZkX2J5dGUgKikgTlVMTCwgZmFsc2UsCi0JCSAgICAgIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgaGF2ZV9jb2RlID0gZmFsc2U7Ci0KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxhZGRyLCBwYWRkciwgc3ltdmFsOwotICAgICAgdW5zaWduZWQgc2hvcnQgaW5zbjsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbGZuLCAqaXJlbHNjYW4sICppcmVsY291bnQ7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIGJmZF9zaWduZWRfdm1hIGZvZmY7Ci0KLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9DT0RFKQotCWhhdmVfY29kZSA9IHRydWU7Ci0KLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgIT0gUl9TSF9VU0VTKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlIFJfU0hfVVNFUyByZWxvYyB3aWxsIHBvaW50IHVzIHRvCi0gICAgICAgICB0aGUgcmVnaXN0ZXIgbG9hZC4gIFRoZSA0IGlzIGJlY2F1c2UgdGhlIHJfb2Zmc2V0IGZpZWxkIGlzCi0gICAgICAgICBjb21wdXRlZCBhcyB0aG91Z2ggaXQgd2VyZSBhIGp1bXAgb2Zmc2V0LCB3aGljaCBhcmUgYmFzZWQKLSAgICAgICAgIGZyb20gNCBieXRlcyBhZnRlciB0aGUganVtcCBpbnN0cnVjdGlvbi4gICovCi0gICAgICBsYWRkciA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSArIDQ7Ci0gICAgICAvKiBDYXJlZnVsIHRvIHNpZ24gZXh0ZW5kIHRoZSAzMi1iaXQgb2Zmc2V0LiAgKi8KLSAgICAgIGxhZGRyICs9ICgoaXJlbC0+cl9vZmZzZXQgJiAweGZmZmZmZmZmKSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMDsKLSAgICAgIGlmIChsYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IiwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGxhZGRyKTsKLQotICAgICAgLyogSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBtb3YubCBOTixyTiwgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgIT0gMHhkMDAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogUl9TSF9VU0VTIHBvaW50cyB0byB1bnJlY29nbml6ZWQgaW5zbiAweCV4IiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX3ZhZGRyLCBpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSByZWdpc3RlciBpcyBiZWluZyBsb2FkZWQuICBUaGUKLSAgICAgIAkgZGlzcGxhY2VtZW50IGluIHRoZSBtb3YubCBpbnN0cnVjdGlvbiBpcyBxdWFkcnVwbGVkLiAgSXQgaXMgYQotICAgICAgCSBkaXNwbGFjZW1lbnQgZnJvbSBmb3VyIGJ5dGVzIGFmdGVyIHRoZSBtb3ZsIGluc3RydWN0aW9uLCBidXQsCi0gICAgICAJIGJlZm9yZSBhZGRpbmcgaW4gdGhlIFBDIGFkZHJlc3MsIHR3byBsZWFzdCBzaWduaWZpY2FudCBiaXRzCi0gICAgICAJIG9mIHRoZSBQQyBhcmUgY2xlYXJlZC4gIFdlIGFzc3VtZSB0aGF0IHRoZSBzZWN0aW9uIGlzIGFsaWduZWQKLSAgICAgIAkgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICAgICAgcGFkZHIgPSBpbnNuICYgMHhmZjsKLSAgICAgIHBhZGRyICo9IDQ7Ci0gICAgICBwYWRkciArPSAobGFkZHIgKyA0KSAmfiAzOwotICAgICAgaWYgKHBhZGRyID49IHNlYy0+X3Jhd19zaXplKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHJlbG9jIGZvciB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRoZSByZWdpc3RlciBpcwotICAgICAgICAgYmVpbmcgbG9hZGVkLiAgVGhpcyByZWxvYyB3aWxsIHRlbGwgdXMgd2hpY2ggZnVuY3Rpb24gaXMKLSAgICAgICAgIGFjdHVhbGx5IGJlaW5nIGNhbGxlZC4gICovCi0gICAgICBwYWRkciArPSBzZWMtPnZtYTsKLSAgICAgIGZvciAoaXJlbGZuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsZm4gPCBpcmVsZW5kOyBpcmVsZm4rKykKLQlpZiAoaXJlbGZuLT5yX3ZhZGRyID09IHBhZGRyCi0JICAgICYmIGlyZWxmbi0+cl90eXBlID09IFJfU0hfSU1NMzIpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsZm4gPj0gaXJlbGVuZCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIiwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwKLQkJCSAgICAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkgICAgICsgKGlyZWxmbi0+cl9zeW1uZHgKLQkJCQkqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCSAgICAmc3ltKTsKLSAgICAgIGlmIChzeW0ubl9zY251bSAhPSAwICYmIHN5bS5uX3NjbnVtICE9IHNlYy0+dGFyZ2V0X2luZGV4KQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0VYVCkKLQl7Ci0JICBzeW12YWwgPSAoc3ltLm5fdmFsdWUKLQkJICAgIC0gc2VjLT52bWEKLQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGFiZmQpW2lyZWxmbi0+cl9zeW1uZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgc3ltdmFsICs9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgcGFkZHIgLSBzZWMtPnZtYSk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbGwgY2FuIGJlIHNob3J0ZW5lZC4gICovCi0gICAgICBmb2ZmID0gKHN5bXZhbAotCSAgICAgIC0gKGlyZWwtPnJfdmFkZHIKLQkJIC0gc2VjLT52bWEKLQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgKyA0KSk7Ci0gICAgICBpZiAoZm9mZiA8IC0weDEwMDAgfHwgZm9mZiA+PSAweDEwMDApCi0JewotCSAgLyogQWZ0ZXIgYWxsIHRoYXQgd29yaywgd2UgY2FuJ3Qgc2hvcnRlbiB0aGlzIGZ1bmN0aW9uIGNhbGwuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBTaG9ydGVuIHRoZSBmdW5jdGlvbiBjYWxsLiAgKi8KLQotICAgICAgLyogRm9yIHNpbXBsaWNpdHkgb2YgY29kaW5nLCB3ZSBhcmUgZ29pbmcgdG8gbW9kaWZ5IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzLCB0aGUgc2VjdGlvbiByZWxvY3MsIGFuZCB0aGUgQkZEIHN5bWJvbCB0YWJsZS4gIFdlCi0JIG11c3QgdGVsbCB0aGUgcmVzdCBvZiB0aGUgY29kZSBub3QgdG8gZnJlZSB1cCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaW5zdGVhZCBjcmVhdGUgYSB0YWJsZQotCSBvZiBjaGFuZ2VzIHdoaWNoIGhhdmUgdG8gYmUgbWFkZSwgYXMgaXMgZG9uZSBpbiBjb2ZmLW1pcHMuYzsKLQkgdGhhdCB3b3VsZCBiZSBtb3JlIHdvcmssIGJ1dCB3b3VsZCByZXF1aXJlIGxlc3MgbWVtb3J5IHdoZW4KLQkgdGhlIGxpbmtlciBpcyBydW4uICAqLwotCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQl7Ci0JICBzZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX3JlbG9jcyA9IHRydWU7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLSAgICAgIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gICAgICAvKiBSZXBsYWNlIHRoZSBqc3Igd2l0aCBhIGJzci4gICovCi0KLSAgICAgIC8qIENoYW5nZSB0aGUgUl9TSF9VU0VTIHJlbG9jIGludG8gYW4gUl9TSF9QQ0RJU1AgcmVsb2MsIGFuZAotICAgICAgICAgcmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotICAgICAgaXJlbC0+cl90eXBlID0gUl9TSF9QQ0RJU1A7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IGlyZWxmbi0+cl9zeW1uZHg7Ci0gICAgICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUKQotCXsKLQkgIC8qIElmIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWNhdXNlIG9mIGZ1dHVyZSByZWxheGluZywKLSAgICAgICAgICAgICBpdCB3aWxsIGJlIGhhbmRsZWQgaGVyZSBsaWtlIG90aGVyIGludGVybmFsIFBDRElTUAotICAgICAgICAgICAgIHJlbG9jcy4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICAweGIwMDAgfCAoKGZvZmYgPj4gMSkgJiAweGZmZiksCi0JCSAgICAgIGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgY2FuJ3QgZnVsbHkgcmVzb2x2ZSB0aGlzIHlldCwgYmVjYXVzZSB0aGUgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wgdmFsdWUgbWF5IGJlIGNoYW5nZWQgYnkgZnV0dXJlIHJlbGF4aW5nLiAgV2UgbGV0Ci0gICAgICAgICAgICAgdGhlIGZpbmFsIGxpbmsgcGhhc2UgaGFuZGxlIGl0LiAgKi8KLQkgIGJmZF9wdXRfMTYgKGFiZmQsIDB4YjAwMCwgY29udGVudHMgKyBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEpOwotCX0KLQotICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGFub3RoZXIgUl9TSF9VU0VTIHJlbG9jIHJlZmVycmluZyB0byB0aGUgc2FtZQotICAgICAgICAgcmVnaXN0ZXIgbG9hZC4gICovCi0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxlbmQ7IGlyZWxzY2FuKyspCi0JaWYgKGlyZWxzY2FuLT5yX3R5cGUgPT0gUl9TSF9VU0VTCi0JICAgICYmIGxhZGRyID09IGlyZWxzY2FuLT5yX3ZhZGRyIC0gc2VjLT52bWEgKyA0ICsgaXJlbHNjYW4tPnJfb2Zmc2V0KQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbHNjYW4gPCBpcmVsZW5kKQotCXsKLQkgIC8qIFNvbWUgb3RoZXIgZnVuY3Rpb24gY2FsbCBkZXBlbmRzIHVwb24gdGhpcyByZWdpc3RlciBsb2FkLAotCSAgICAgYW5kIHdlIGhhdmUgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBmdW5jdGlvbiBjYWxsLgotCSAgICAgSW5kZWVkLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byBjb252ZXJ0IGl0LiAgVGhlcmUgaXMKLQkgICAgIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIGEgUl9TSF9DT1VOVCByZWxvYyBvbiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCi0gICAgICAgICBmdW5jdGlvbiBhZGRyZXNzIGlzIHN0b3JlZC4gIERvIHRoaXMgYmVmb3JlIGRlbGV0aW5nIGFueQotICAgICAgICAgYnl0ZXMsIHRvIGF2b2lkIGNvbmZ1c2lvbiBhYm91dCB0aGUgYWRkcmVzcy4gICovCi0gICAgICBmb3IgKGlyZWxjb3VudCA9IGludGVybmFsX3JlbG9jczsgaXJlbGNvdW50IDwgaXJlbGVuZDsgaXJlbGNvdW50KyspCi0JaWYgKGlyZWxjb3VudC0+cl92YWRkciA9PSBwYWRkcgotCSAgICAmJiBpcmVsY291bnQtPnJfdHlwZSA9PSBSX1NIX0NPVU5UKQotCSAgYnJlYWs7Ci0KLSAgICAgIC8qIERlbGV0ZSB0aGUgcmVnaXN0ZXIgbG9hZC4gICovCi0gICAgICBpZiAoISBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgbGFkZHIsIDIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIGp1c3QgaW4gY2FzZSBpdCBwZXJtaXRzIHNvbWUKLSAgICAgICAgIG90aGVyIGZ1bmN0aW9uIGNhbGwgdG8gY29tZSB3aXRoaW4gcmFuZ2UsIHdlIHNob3VsZCByZWxheAotICAgICAgICAgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0gICAgICAqYWdhaW4gPSB0cnVlOwotCi0gICAgICAvKiBOb3cgY2hlY2sgd2hldGhlciB3ZSBnb3QgYSBDT1VOVCByZWxvYy4gICovCi0gICAgICBpZiAoaXJlbGNvdW50ID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICgiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCBDT1VOVCByZWxvYyIsCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhlIG51bWJlciBvZiB1c2VzIGlzIHN0b3JlZCBpbiB0aGUgcl9vZmZzZXQgZmllbGQuICBXZSd2ZQotICAgICAgICAganVzdCBkZWxldGVkIG9uZS4gICovCi0gICAgICBpZiAoaXJlbGNvdW50LT5yX29mZnNldCA9PSAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBjb3VudCIsCi0JCQkJICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCQkgICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAtLWlyZWxjb3VudC0+cl9vZmZzZXQ7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHVzZXMsIHdlIGNhbiBkZWxldGUgdGhlIGFkZHJlc3MuICBSZWxvYWQKLSAgICAgICAgIHRoZSBhZGRyZXNzIGZyb20gaXJlbGZuLCBpbiBjYXNlIGl0IHdhcyBjaGFuZ2VkIGJ5IHRoZQotICAgICAgICAgcHJldmlvdXMgY2FsbCB0byBzaF9yZWxheF9kZWxldGVfYnl0ZXMuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gMCkKLQl7Ci0JICBpZiAoISBzaF9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkgICAgICAgaXJlbGZuLT5yX3ZhZGRyIC0gc2VjLT52bWEsIDQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFdlJ3ZlIGRvbmUgYWxsIHdlIGNhbiB3aXRoIHRoYXQgZnVuY3Rpb24gY2FsbC4gICovCi0gICAgfQotCi0gIC8qIExvb2sgZm9yIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IHdlIGNhbiBhbGlnbiBvbiBmb3VyCi0gICAgIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmIChoYXZlX2NvZGUpCi0gICAgewotICAgICAgYm9vbGVhbiBzd2FwcGVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBzaF9hbGlnbl9sb2FkcyAoYWJmZCwgc2VjLCBpbnRlcm5hbF9yZWxvY3MsIGNvbnRlbnRzLCAmc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzd2FwcGVkKQotCXsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2VjLT51c2VkX2J5X2JmZCA9Ci0JCSgoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKSk7Ci0JICAgICAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5rZWVwX3JlbG9jcyA9IHRydWU7Ci0JICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmtlZXBfY29udGVudHMgPSB0cnVlOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGNvZmZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZWMtPnVzZWRfYnlfYmZkID0KLQkJKChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpKTsKLQkgICAgICBpZiAoc2VjLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWwsICppcmVsZW5kOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBhc2VjdGlvbiAqbzsKLQotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50czsKLQotICAvKiBUaGUgZGVsZXRpb24gbXVzdCBzdG9wIGF0IHRoZSBuZXh0IEFMSUdOIHJlbG9jIGZvciBhbiBhbGlnbWVudAotICAgICBwb3dlciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGFyZSBkZWxldGluZy4gICovCi0KLSAgaXJlbGFsaWduID0gTlVMTDsKLSAgdG9hZGRyID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgaXJlbCA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaWYgKGlyZWwtPnJfdHlwZSA9PSBSX1NIX0FMSUdOCi0JICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPiBhZGRyCi0JICAmJiBjb3VudCA8ICgxIDw8IGlyZWwtPnJfb2Zmc2V0KSkKLQl7Ci0JICBpcmVsYWxpZ24gPSBpcmVsOwotCSAgdG9hZGRyID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgaWYgKGlyZWxhbGlnbiA9PSBOVUxMKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSNkZWZpbmUgTk9QX09QQ09ERSAoMHgwMDA5KQotCi0gICAgICBCRkRfQVNTRVJUICgoY291bnQgJiAxKSA9PSAwKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSAyKQotCWJmZF9wdXRfMTYgKGFiZmQsIE5PUF9PUENPREUsIGNvbnRlbnRzICsgdG9hZGRyIC0gY291bnQgKyBpKTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIG5yYWRkciwgc3RvcDsKLSAgICAgIGJmZF92bWEgc3RhcnQgPSAwOwotICAgICAgaW50IGluc24gPSAwOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0gICAgICBpbnQgb2ZmLCBhZGp1c3QsIG9pbnNuOwotICAgICAgYmZkX3NpZ25lZF92bWEgdm9mZiA9IDA7Ci0gICAgICBib29sZWFuIG92ZXJmbG93OwotCi0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIG5yYWRkciA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLSAgICAgIGlmICgoaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hID4gYWRkcgotCSAgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA8IHRvYWRkcikKLQkgIHx8IChpcmVsLT5yX3R5cGUgPT0gUl9TSF9BTElHTgotCSAgICAgICYmIGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA9PSB0b2FkZHIpKQotCW5yYWRkciAtPSBjb3VudDsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgcmVsb2Mgd2FzIGZvciB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLCBpbiB3aGljaAotCSBjYXNlIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IGl0LiAgRG9uJ3QgZGVsZXRlIHJlbG9jcyB3aGljaAotCSByZXByZXNlbnQgYWRkcmVzc2VzLCB0aG91Z2guICAqLwotICAgICAgaWYgKGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSA+PSBhZGRyCi0JICAmJiBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPCBhZGRyICsgY291bnQKLQkgICYmIGlyZWwtPnJfdHlwZSAhPSBSX1NIX0FMSUdOCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9DT0RFCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9EQVRBCi0JICAmJiBpcmVsLT5yX3R5cGUgIT0gUl9TSF9MQUJFTCkKLQlpcmVsLT5yX3R5cGUgPSBSX1NIX1VOVVNFRDsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jLCBzZWUgaWYgdGhlIHJhbmdlIGl0IGNvdmVycwotICAgICAgICAgaW5jbHVkZXMgdGhlIGJ5dGVzIHdlIGhhdmUgZGVsZXRlZC4gICovCi0gICAgICBzd2l0Y2ggKGlyZWwtPnJfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JY2FzZSBSX1NIX1BDRElTUDoKLQljYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX0lNTTMyOgotCSAgLyogSWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgaW4gdGhpcwotICAgICAgICAgICAgIHNlY3Rpb24sIGFuZCB0aGUgc3ltYm9sIHdpbGwgbm90IGJlIGFkanVzdGVkIGJlbG93LCB3ZQotICAgICAgICAgICAgIG11c3QgY2hlY2sgdGhlIGFkZGVuZCB0byBzZWUgaXQgd2lsbCBwdXQgdGhlIHZhbHVlIGluCi0gICAgICAgICAgICAgcmFuZ2UgdG8gYmUgYWRqdXN0ZWQsIGFuZCBoZW5jZSBtdXN0IGJlIGNoYW5nZWQuICAqLwotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkJKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJCSArIChpcmVsLT5yX3N5bW5keAotCQkJCSAgICAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCQkmc3ltKTsKLQkgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQKLQkgICAgICAmJiBzeW0ubl9zY251bSA9PSBzZWMtPnRhcmdldF9pbmRleAotCSAgICAgICYmICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPD0gYWRkcgotCQkgIHx8IChiZmRfdm1hKSBzeW0ubl92YWx1ZSA+PSB0b2FkZHIpKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgdmFsICs9IHN5bS5uX3ZhbHVlOwotCSAgICAgIGlmICh2YWwgPiBhZGRyICYmIHZhbCA8IHRvYWRkcikKLQkJYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgfQotCSAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIGlmIChvZmYgJiAweDgwKQotCSAgICBvZmYgLT0gMHgxMDA7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0ICsgNCArIG9mZiAqIDIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfUENESVNQOgotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkJKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJCSArIChpcmVsLT5yX3N5bW5keAotCQkJCSAgICAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpKSwKLQkJCQkmc3ltKTsKLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JICAgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvZmYgPSBpbnNuICYgMHhmZmY7Ci0JICAgICAgaWYgKG9mZiAmIDB4ODAwKQotCQlvZmYgLT0gMHgxMDAwOwotCSAgICAgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NIX1BDUkVMSU1NOEJZMjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IHN0YXJ0ICsgNCArIG9mZiAqIDI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9QQ1JFTElNTThCWTQ6Ci0JICBvZmYgPSBpbnNuICYgMHhmZjsKLQkgIHN0b3AgPSAoc3RhcnQgJn4gKGJmZF92bWEpIDMpICsgNCArIG9mZiAqIDQ7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9TV0lUQ0g4OgotCWNhc2UgUl9TSF9TV0lUQ0gxNjoKLQljYXNlIFJfU0hfU1dJVENIMzI6Ci0JICAvKiBUaGVzZSByZWxvY3MgdHlwZXMgcmVwcmVzZW50Ci0JICAgICAgIC53b3JkIEwyLUwxCi0JICAgICBUaGUgcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MKLQkgICAgIGFkZHJlc3MgYW5kIEwxLiAgVGhhdCBpcyB0aGUgc3RhcnQgb2YgdGhlIHJlbG9jLCBhbmQKLQkgICAgIGFkZGluZyBpbiB0aGUgY29udGVudHMgZ2l2ZXMgdXMgdGhlIHRvcC4gIFdlIG11c3QgYWRqdXN0Ci0JICAgICBib3RoIHRoZSByX29mZnNldCBmaWVsZCBhbmQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCi0JICBzdGFydCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgLSAobG9uZykgaXJlbC0+cl9vZmZzZXQpOwotCi0JICBpZiAoc3RhcnQgPiBhZGRyCi0JICAgICAgJiYgc3RhcnQgPCB0b2FkZHIKLQkgICAgICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9vZmZzZXQgKz0gY291bnQ7Ci0JICBlbHNlIGlmIChzdG9wID4gYWRkcgotCQkgICAmJiBzdG9wIDwgdG9hZGRyCi0JCSAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JICAgIGlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotCi0JICBzdGFydCA9IHN0b3A7Ci0KLQkgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9TV0lUQ0gxNikKLQkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9TV0lUQ0g4KQotCSAgICB2b2ZmID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIHZvZmYpOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TSF9VU0VTOgotCSAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0JICBzdG9wID0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0YXJ0Ci0JCQkgICAgKyAobG9uZykgaXJlbC0+cl9vZmZzZXQKLQkJCSAgICArIDQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc3RhcnQgPiBhZGRyCi0JICAmJiBzdGFydCA8IHRvYWRkcgotCSAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JYWRqdXN0ID0gY291bnQ7Ci0gICAgICBlbHNlIGlmIChzdG9wID4gYWRkcgotCSAgICAgICAmJiBzdG9wIDwgdG9hZGRyCi0JICAgICAgICYmIChzdGFydCA8PSBhZGRyIHx8IHN0YXJ0ID49IHRvYWRkcikpCi0JYWRqdXN0ID0gLSBjb3VudDsKLSAgICAgIGVsc2UKLQlhZGp1c3QgPSAwOwotCi0gICAgICBpZiAoYWRqdXN0ICE9IDApCi0JewotCSAgb2luc24gPSBpbnNuOwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAoaXJlbC0+cl90eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDRElTUDhCWTI6Ci0JICAgIGNhc2UgUl9TSF9QQ1JFTElNTThCWTI6Ci0JICAgICAgaW5zbiArPSBhZGp1c3QgLyAyOwotCSAgICAgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmMDAwKSAhPSAoaW5zbiAmIDB4ZjAwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1BDUkVMSU1NOEJZNDoKLQkgICAgICBCRkRfQVNTRVJUIChhZGp1c3QgPT0gY291bnQgfHwgY291bnQgPj0gNCk7Ci0JICAgICAgaWYgKGNvdW50ID49IDQpCi0JCWluc24gKz0gYWRqdXN0IC8gNDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGlyZWwtPnJfdmFkZHIgJiAzKSA9PSAwKQotCQkgICAgKytpbnNuOwotCQl9Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0g4OgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGlmICh2b2ZmIDwgMCB8fCB2b2ZmID49IDB4ZmYpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMTY6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgaWYgKHZvZmYgPCAtIDB4ODAwMCB8fCB2b2ZmID49IDB4ODAwMCkKLQkJb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfc2lnbmVkXzE2IChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgICAgIHZvZmYgKz0gYWRqdXN0OwotCSAgICAgIGJmZF9wdXRfc2lnbmVkXzMyIChhYmZkLCB2b2ZmLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX1VTRVM6Ci0JICAgICAgaXJlbC0+cl9vZmZzZXQgKz0gYWRqdXN0OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChvdmVyZmxvdykKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKCIlczogMHglbHg6IGZhdGFsOiByZWxvYyBvdmVyZmxvdyB3aGlsZSByZWxheGluZyIsCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgaXJlbC0+cl92YWRkcikpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaXJlbC0+cl92YWRkciA9IG5yYWRkciArIHNlYy0+dm1hOwotICAgIH0KLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBvdGhlciBzZWN0aW9ucy4gIElmIHRoZXJlIGNvbnRhaW4gYW55IElNTTMyCi0gICAgIHJlbG9jcyBhZ2FpbnN0IGludGVybmFsIHN5bWJvbHMgd2hpY2ggd2UgYXJlIG5vdCBnb2luZyB0byBhZGp1c3QKLSAgICAgYmVsb3csIHdlIG1heSBuZWVkIHRvIGFkanVzdCB0aGUgYWRkZW5kcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsc2NhbiwgKmlyZWxzY2FuZW5kOwotICAgICAgYmZkX2J5dGUgKm9jb250ZW50czsKLQotICAgICAgaWYgKG8gPT0gc2VjCi0JICB8fCAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgcmVsb2NzLiAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMKLSAgICAgICAgIGZhbHNlLCB3ZSBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLCB3aGVuIHdlCi0gICAgICAgICBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkJIChhYmZkLCBvLCB0cnVlLCAoYmZkX2J5dGUgKikgTlVMTCwgZmFsc2UsCi0JCQkgIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2NvbnRlbnRzID0gTlVMTDsKLSAgICAgIGlyZWxzY2FuZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxzY2FuZW5kOyBpcmVsc2NhbisrKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotCi0JICBpZiAoaXJlbHNjYW4tPnJfdHlwZSAhPSBSX1NIX0lNTTMyKQotCSAgICBjb250aW51ZTsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsCi0JCQkJKChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKQotCQkJCSArIChpcmVsc2Nhbi0+cl9zeW1uZHgKLQkJCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKGFiZmQpKSksCi0JCQkJJnN5bSk7Ci0JICBpZiAoc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JICAgICAgJiYgc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICAgICAmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDw9IGFkZHIKLQkJICB8fCAoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgPj0gdG9hZGRyKSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgaWYgKG9jb250ZW50cyA9PSBOVUxMKQotCQl7Ci0JCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+Y29udGVudHMgIT0gTlVMTCkKLQkJICAgIG9jb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+Y29udGVudHM7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0JCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAotCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5jb250ZW50cyA9IG9jb250ZW50czsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfdmFkZHIgLSBvLT52bWEpOwotCSAgICAgIHZhbCArPSBzeW0ubl92YWx1ZTsKLQkgICAgICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCWJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LAotCQkJICAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX3ZhZGRyIC0gby0+dm1hKTsKLQotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+a2VlcF9jb250ZW50cyA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkanVzdGluZyB0aGUgaW50ZXJuYWwgc3ltYm9scyB3aWxsIG5vdCB3b3JrIGlmIHNvbWV0aGluZyBoYXMKLSAgICAgYWxyZWFkeSByZXRyaWV2ZWQgdGhlIGdlbmVyaWMgc3ltYm9scy4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvCi0gICAgIG1ha2UgdGhpcyB3b3JrIGJ5IGFkanVzdGluZyB0aGUgZ2VuZXJpYyBzeW1ib2xzIGF0IHRoZSBzYW1lIHRpbWUuCi0gICAgIEhvd2V2ZXIsIHRoaXMgY2FzZSBzaG91bGQgbm90IGFyaXNlIGluIG5vcm1hbCB1c2FnZS4gICovCi0gIGlmIChvYmpfc3ltYm9scyAoYWJmZCkgIT0gTlVMTAotICAgICAgfHwgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSAhPSBOVUxMKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoIiVzOiBmYXRhbDogZ2VuZXJpYyBzeW1ib2xzIHJldHJpZXZlZCBiZWZvcmUgcmVsYXhpbmciLAotCWJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBZGp1c3QgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgc3ltX2hhc2ggPSBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgZXN5bWVuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLm5fc2NudW0gPT0gc2VjLT50YXJnZXRfaW5kZXgKLQkgICYmIChiZmRfdm1hKSBpc3ltLm5fdmFsdWUgPiBhZGRyCi0JICAmJiAoYmZkX3ZtYSkgaXN5bS5uX3ZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIGlzeW0ubl92YWx1ZSAtPSBjb3VudDsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgZXN5bSk7Ci0KLQkgIGlmICgqc3ltX2hhc2ggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLQkgICAgICBCRkRfQVNTRVJUICgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA+PSBhZGRyCi0JCQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKTsKLQkgICAgICAoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSAtPSBjb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoaXN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgICAgc3ltX2hhc2ggKz0gaXN5bS5uX251bWF1eCArIDE7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiB3ZSBjYW4gbW92ZSB0aGUgQUxJR04gcmVsb2MgZm9yd2FyZC4gIFdlIGhhdmUgYWRqdXN0ZWQKLSAgICAgcl92YWRkciBmb3IgaXQgYWxyZWFkeS4gICovCi0gIGlmIChpcmVsYWxpZ24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGFsaWdudG8sIGFsaWduYWRkcjsKLQotICAgICAgYWxpZ250byA9IEJGRF9BTElHTiAodG9hZGRyLCAxIDw8IGlyZWxhbGlnbi0+cl9vZmZzZXQpOwotICAgICAgYWxpZ25hZGRyID0gQkZEX0FMSUdOIChpcmVsYWxpZ24tPnJfdmFkZHIgLSBzZWMtPnZtYSwKLQkJCSAgICAgMSA8PCBpcmVsYWxpZ24tPnJfb2Zmc2V0KTsKLSAgICAgIGlmIChhbGlnbnRvICE9IGFsaWduYWRkcikKLQl7Ci0JICAvKiBUYWlsIHJlY3Vyc2lvbi4gICovCi0JICByZXR1cm4gc2hfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFsaWduYWRkciwKLQkJCQkJYWxpZ250byAtIGFsaWduYWRkcik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgeWV0IGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgU0ggb3Bjb2RlIHRhYmxlLCB1c2VkIHRvIHJhcGlkbHkKLSAgIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgaW5zdHJ1Y3Rpb24uICAqLwotCi0vKiBUaGUgb3Bjb2RlIG1hcCBpcyByZXByZXNlbnRlZCBieSBhbiBhcnJheSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgVGhlCi0gICBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBoaWdoIG9yZGVyIGZvdXIgYml0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlCi17Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgaW5zdHJ1Y3Rpb24gbGlzdC4gIFRoaXMgaXMgYW4gYXJyYXkgd2hpY2gKLSAgICAgY29udGFpbnMgYWxsIHRoZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGlzIG1ham9yIG9wY29kZS4gICovCi0gIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgKm1pbm9yX29wY29kZXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gbWlub3Jfb3Bjb2Rlcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvdW50OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgc2V0IG9mIFNIIG9wY29kZXMuICBUaGUKLSAgIGluc3RydWN0aW9uIGNvZGUgaXMgYW5kZWQgd2l0aCB0aGUgbWFzayB2YWx1ZSwgYW5kIHRoZSByZXN1bHRpbmcKLSAgIHZhbHVlIGlzIHVzZWQgdG8gc2VhcmNoIHRoZSBvcmRlciBvcGNvZGUgbGlzdC4gICovCi0KLXN0cnVjdCBzaF9taW5vcl9vcGNvZGUKLXsKLSAgLyogVGhlIHNvcnRlZCBvcGNvZGUgbGlzdC4gICovCi0gIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKm9wY29kZXM7Ci0gIC8qIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gb3Bjb2Rlcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGNvdW50OwotICAvKiBUaGUgbWFzayB2YWx1ZSB0byB1c2Ugd2hlbiBzZWFyY2hpbmcgdGhlIG9wY29kZSBsaXN0LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWFzazsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhbiBTSCBpbnN0cnVjdGlvbi4gIEFuIGFycmF5Ci0gICBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHNvcnRlZCBpbiBvcmRlciBieSBvcGNvZGUuICAqLwotCi1zdHJ1Y3Qgc2hfb3Bjb2RlCi17Ci0gIC8qIFRoZSBjb2RlIGZvciB0aGlzIGluc3RydWN0aW9uLCBhZnRlciBpdCBoYXMgYmVlbiBhbmRlZCB3aXRoIHRoZQotICAgICBtYXNrIHZhbHVlIGluIHRoZSBzaF9tYWpvcl9vcGNvZGUgc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgb3Bjb2RlOwotICAvKiBGbGFncyBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gIHVuc2lnbmVkIHNob3J0IGZsYWdzOwotfTsKLQotLyogRmxhZyB3aGljaCBhcHBlYXIgaW4gdGhlIHNoX29wY29kZSBzdHJ1Y3R1cmUuICAqLwotCi0vKiBUaGlzIGluc3RydWN0aW9uIGxvYWRzIGEgdmFsdWUgZnJvbSBtZW1vcnkuICAqLwotI2RlZmluZSBMT0FEICgweDEpCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc3RvcmVzIGEgdmFsdWUgdG8gbWVtb3J5LiAgKi8KLSNkZWZpbmUgU1RPUkUgKDB4MikKLQotLyogVGhpcyBpbnN0cnVjdGlvbiBpcyBhIGJyYW5jaC4gICovCi0jZGVmaW5lIEJSQU5DSCAoMHg0KQotCi0vKiBUaGlzIGluc3RydWN0aW9uIGhhcyBhIGRlbGF5IHNsb3QuICAqLwotI2RlZmluZSBERUxBWSAoMHg4KQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVTRVMxICgweDEwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIHZhbHVlIGluIHRoZSByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwMGYwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVTRVMyICgweDIwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIHZhbHVlIGluIHJlZ2lzdGVyIDAuICAqLwotI2RlZmluZSBVU0VTUjAgKDB4NDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDBmMDAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VUUzEgKDB4ODApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyB0aGUgdmFsdWUgaW4gdGhlIHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDAwZjAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0VUUzIgKDB4MTAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHNldHMgcmVnaXN0ZXIgMC4gICovCi0jZGVmaW5lIFNFVFNSMCAoMHgyMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyBhIHNwZWNpYWwgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBTRVRTU1AgKDB4NDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgYSBzcGVjaWFsIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgVVNFU1NQICgweDgwMCkKLQotLyogVGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiB0aGUgZmllbGQgYXQKLSAgIG1hc2sgMHgwZjAwIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFVTRVNGMSAoMHgxMDAwKQotCi0vKiBUaGlzIGluc3RydWN0aW9uIHVzZXMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHRoZSBmaWVsZCBhdAotICAgbWFzayAweDAwZjAgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgVVNFU0YyICgweDIwMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyBmbG9hdGluZyBwb2ludCByZWdpc3RlciAwLiAgKi8KLSNkZWZpbmUgVVNFU0YwICgweDQwMDApCi0KLS8qIFRoaXMgaW5zdHJ1Y3Rpb24gc2V0cyB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gdGhlIGZpZWxkIGF0Ci0gICBtYXNrIDB4MGYwMCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTRVRTRjEgKDB4ODAwMCkKLQotc3RhdGljIGJvb2xlYW4gc2hfaW5zbl91c2VzX3JlZwotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9pbnNuX3VzZXNfZnJlZwotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzaF9pbnNuc19jb25mbGljdAotICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKiwgdW5zaWduZWQgaW50LAotCSAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKikpOwotc3RhdGljIGJvb2xlYW4gc2hfbG9hZF91c2UKLSAgUEFSQU1TICgodW5zaWduZWQgaW50LCBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICosIHVuc2lnbmVkIGludCwKLQkgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICopKTsKLQotLyogVGhlIG9wY29kZSBtYXBzLiAgKi8KLQotI2RlZmluZSBNQVAoYSkgYSwgc2l6ZW9mIGEgLyBzaXplb2YgYVswXQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUwMFtdID0KLXsKLSAgeyAweDAwMDgsIFNFVFNTUCB9LAkJCS8qIGNscnQgKi8KLSAgeyAweDAwMDksIDAgfSwJCQkvKiBub3AgKi8KLSAgeyAweDAwMGIsIEJSQU5DSCB8IERFTEFZIHwgVVNFU1NQIH0sCS8qIHJ0cyAqLwotICB7IDB4MDAxOCwgU0VUU1NQIH0sCQkJLyogc2V0dCAqLwotICB7IDB4MDAxOSwgU0VUU1NQIH0sCQkJLyogZGl2MHUgKi8KLSAgeyAweDAwMWIsIDAgfSwJCQkvKiBzbGVlcCAqLwotICB7IDB4MDAyOCwgU0VUU1NQIH0sCQkJLyogY2xybWFjICovCi0gIHsgMHgwMDJiLCBCUkFOQ0ggfCBERUxBWSB8IFNFVFNTUCB9LAkvKiBydGUgKi8KLSAgeyAweDAwMzgsIFVTRVNTUCB8IFNFVFNTUCB9LAkJLyogbGR0bGIgKi8KLSAgeyAweDAwNDgsIFNFVFNTUCB9LAkJCS8qIGNscnMgKi8KLSAgeyAweDAwNTgsIFNFVFNTUCB9CQkJLyogc2V0cyAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMDFbXSA9Ci17Ci0gIHsgMHgwMDAyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBzcixybiAqLwotICB7IDB4MDAwMywgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB8IFNFVFNTUCB9LAkvKiBic3JmIHJuICovCi0gIHsgMHgwMDBhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBtYWNoLHJuICovCi0gIHsgMHgwMDEyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBnYnIscm4gKi8KLSAgeyAweDAwMWEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIG1hY2wscm4gKi8KLSAgeyAweDAwMjIsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RjIHZicixybiAqLwotICB7IDB4MDAyMywgQlJBTkNIIHwgREVMQVkgfCBVU0VTMSB9LAkJLyogYnJhZiBybiAqLwotICB7IDB4MDAyOSwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBtb3Z0IHJuICovCi0gIHsgMHgwMDJhLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0cyBwcixybiAqLwotICB7IDB4MDAzMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgc3NyLHJuICovCi0gIHsgMHgwMDQyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyBzcGMscm4gKi8KLSAgeyAweDAwNWEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIGZwdWwscm4gKi8KLSAgeyAweDAwNmEsIFNFVFMxIHwgVVNFU1NQIH0sCQkJLyogc3RzIGZwc2NyLHJuICovCi0gIHsgMHgwMDgyLCBTRVRTMSB8IFVTRVNTUCB9LAkJCS8qIHN0YyByMF9iYW5rLHJuICovCi0gIHsgMHgwMDgzLCBMT0FEIHwgVVNFUzEgfSwJCQkvKiBwcmVmIEBybiAqLwotICB7IDB4MDA5MiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjFfYmFuayxybiAqLwotICB7IDB4MDBhMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjJfYmFuayxybiAqLwotICB7IDB4MDBiMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjNfYmFuayxybiAqLwotICB7IDB4MDBjMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjRfYmFuayxybiAqLwotICB7IDB4MDBkMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjVfYmFuayxybiAqLwotICB7IDB4MDBlMiwgU0VUUzEgfCBVU0VTU1AgfSwJCQkvKiBzdGMgcjZfYmFuayxybiAqLwotICB7IDB4MDBmMiwgU0VUUzEgfCBVU0VTU1AgfQkJCS8qIHN0YyByN19iYW5rLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUwMltdID0KLXsKLSAgeyAweDAwMDQsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YuYiBybSxAKHIwLHJuKSAqLwotICB7IDB4MDAwNSwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi53IHJtLEAocjAscm4pICovCi0gIHsgMHgwMDA2LCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92Lmwgcm0sQChyMCxybikgKi8KLSAgeyAweDAwMDcsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG11bC5sIHJtLHJuICovCi0gIHsgMHgwMDBjLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB8IFVTRVNSMCB9LAkvKiBtb3YuYiBAKHIwLHJtKSxybiAqLwotICB7IDB4MDAwZCwgTE9BRCB8IFNFVFMxIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LncgQChyMCxybSkscm4gKi8KLSAgeyAweDAwMGUsIExPQUQgfCBTRVRTMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5sIEAocjAscm0pLHJuICovCi0gIHsgMHgwMDBmLCBMT0FEfFNFVFMxfFNFVFMyfFNFVFNTUHxVU0VTMXxVU0VTMnxVU0VTU1AgfSwgLyogbWFjLmwgQHJtKyxAcm4rICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUwW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMDApLCAweGZmZmYgfSwKLSAgeyBNQVAgKHNoX29wY29kZTAxKSwgMHhmMGZmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUwMiksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUxMFtdID0KLXsKLSAgeyAweDEwMDAsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9CS8qIG1vdi5sIHJtLEAoZGlzcCxybikgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTFbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUxMCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGUyMFtdID0KLXsKLSAgeyAweDIwMDAsIFNUT1JFIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogbW92LmIgcm0sQHJuICovCi0gIHsgMHgyMDAxLCBTVE9SRSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG1vdi53IHJtLEBybiAqLwotICB7IDB4MjAwMiwgU1RPUkUgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtb3YubCBybSxAcm4gKi8KLSAgeyAweDIwMDQsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi5iIHJtLEAtcm4gKi8KLSAgeyAweDIwMDUsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi53IHJtLEAtcm4gKi8KLSAgeyAweDIwMDYsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIG1vdi5sIHJtLEAtcm4gKi8KLSAgeyAweDIwMDcsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfCBVU0VTU1AgfSwJLyogZGl2MHMgKi8KLSAgeyAweDIwMDgsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHRzdCBybSxybiAqLwotICB7IDB4MjAwOSwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBhbmQgcm0scm4gKi8KLSAgeyAweDIwMGEsIFNFVFMxIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogeG9yIHJtLHJuICovCi0gIHsgMHgyMDBiLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIG9yIHJtLHJuICovCi0gIHsgMHgyMDBjLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvc3RyIHJtLHJuICovCi0gIHsgMHgyMDBkLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHh0cmN0IHJtLHJuICovCi0gIHsgMHgyMDBlLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBtdWx1Lncgcm0scm4gKi8KLSAgeyAweDIwMGYsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfQkJLyogbXVscy53IHJtLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGUyW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlMjApLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlMzBbXSA9Ci17Ci0gIHsgMHgzMDAwLCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCQkvKiBjbXAvZXEgcm0scm4gKi8KLSAgeyAweDMwMDIsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9ocyBybSxybiAqLwotICB7IDB4MzAwMywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2dlIHJtLHJuICovCi0gIHsgMHgzMDA0LCBTRVRTU1AgfCBVU0VTU1AgfCBVU0VTMSB8IFVTRVMyIH0sCS8qIGRpdjEgcm0scm4gKi8KLSAgeyAweDMwMDUsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGRtdWx1Lmwgcm0scm4gKi8KLSAgeyAweDMwMDYsIFNFVFNTUCB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGNtcC9oaSBybSxybiAqLwotICB7IDB4MzAwNywgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogY21wL2d0IHJtLHJuICovCi0gIHsgMHgzMDA4LCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIHN1YiBybSxybiAqLwotICB7IDB4MzAwYSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1NQIH0sIC8qIHN1YmMgcm0scm4gKi8KLSAgeyAweDMwMGIsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkvKiBzdWJ2IHJtLHJuICovCi0gIHsgMHgzMDBjLCBTRVRTMSB8IFVTRVMxIHwgVVNFUzIgfSwJCS8qIGFkZCBybSxybiAqLwotICB7IDB4MzAwZCwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9LAkJLyogZG11bHMubCBybSxybiAqLwotICB7IDB4MzAwZSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVMyIHwgVVNFU1NQIH0sIC8qIGFkZGMgcm0scm4gKi8KLSAgeyAweDMwMGYsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfCBVU0VTMiB9CS8qIGFkZHYgcm0scm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUzMCksIDB4ZjAwZiB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU0MFtdID0KLXsKLSAgeyAweDQwMDAsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNobGwgcm4gKi8KLSAgeyAweDQwMDEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJCS8qIHNobHIgcm4gKi8KLSAgeyAweDQwMDIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdHMubCBtYWNoLEAtcm4gKi8KLSAgeyAweDQwMDMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBzcixALXJuICovCi0gIHsgMHg0MDA0LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiByb3RsIHJuICovCi0gIHsgMHg0MDA1LCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiByb3RyIHJuICovCi0gIHsgMHg0MDA2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLG1hY2ggKi8KLSAgeyAweDQwMDcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssc3IgKi8KLSAgeyAweDQwMDgsIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxsMiBybiAqLwotICB7IDB4NDAwOSwgU0VUUzEgfCBVU0VTMSB9LAkJCS8qIHNobHIyIHJuICovCi0gIHsgMHg0MDBhLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkcyBybSxtYWNoICovCi0gIHsgMHg0MDBiLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIH0sCQkvKiBqc3IgQHJuICovCi0gIHsgMHg0MDBlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSxzciAqLwotICB7IDB4NDAxMCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogZHQgcm4gKi8KLSAgeyAweDQwMTEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogY21wL3B6IHJuICovCi0gIHsgMHg0MDEyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgbWFjbCxALXJuICovCi0gIHsgMHg0MDEzLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RjLmwgZ2JyLEAtcm4gKi8KLSAgeyAweDQwMTUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogY21wL3BsIHJuICovCi0gIHsgMHg0MDE2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLG1hY2wgKi8KLSAgeyAweDQwMTcsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkYy5sIEBybSssZ2JyICovCi0gIHsgMHg0MDE4LCBTRVRTMSB8IFVTRVMxIH0sCQkJLyogc2hsbDggcm4gKi8KLSAgeyAweDQwMTksIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxyOCBybiAqLwotICB7IDB4NDAxYSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZHMgcm0sbWFjbCAqLwotICB7IDB4NDAxYiwgTE9BRCB8IFNFVFNTUCB8IFVTRVMxIH0sCQkvKiB0YXMuYiBAcm4gKi8KLSAgeyAweDQwMWUsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLGdiciAqLwotICB7IDB4NDAyMCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hhbCBybiAqLwotICB7IDB4NDAyMSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkJLyogc2hhciBybiAqLwotICB7IDB4NDAyMiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIHByLEAtcm4gKi8KLSAgeyAweDQwMjMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCB2YnIsQC1ybiAqLwotICB7IDB4NDAyNCwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiByb3RjbCBybiAqLwotICB7IDB4NDAyNSwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiByb3RjciBybiAqLwotICB7IDB4NDAyNiwgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRzLmwgQHJtKyxwciAqLwotICB7IDB4NDAyNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyx2YnIgKi8KLSAgeyAweDQwMjgsIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxsMTYgcm4gKi8KLSAgeyAweDQwMjksIFNFVFMxIHwgVVNFUzEgfSwJCQkvKiBzaGxyMTYgcm4gKi8KLSAgeyAweDQwMmEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzIHJtLHByICovCi0gIHsgMHg0MDJiLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVMxIH0sCQkvKiBqbXAgQHJuICovCi0gIHsgMHg0MDJlLCBTRVRTU1AgfCBVU0VTMSB9LAkJCS8qIGxkYyBybSx2YnIgKi8KLSAgeyAweDQwMzMsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNTUCB9LAkvKiBzdGMubCBzc3IsQC1ybiAqLwotICB7IDB4NDAzNywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxzc3IgKi8KLSAgeyAweDQwM2UsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRjIHJtLHNzciAqLwotICB7IDB4NDA0MywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHNwYyxALXJuICovCi0gIHsgMHg0MDQ3LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZGMubCBAcm0rLHNwYyAqLwotICB7IDB4NDA0ZSwgU0VUU1NQIHwgVVNFUzEgfSwJCQkvKiBsZGMgcm0sc3BjICovCi0gIHsgMHg0MDUyLCBTVE9SRSB8IFNFVFMxIHwgVVNFUzEgfCBVU0VTU1AgfSwJLyogc3RzLmwgZnB1bCxALXJuICovCi0gIHsgMHg0MDU2LCBMT0FEIHwgU0VUUzEgfCBTRVRTU1AgfCBVU0VTMSB9LAkvKiBsZHMubCBAcm0rLGZwdWwgKi8KLSAgeyAweDQwNWEsIFNFVFNTUCB8IFVTRVMxIH0sCQkJLyogbGRzLmwgcm0sZnB1bCAqLwotICB7IDB4NDA2MiwgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0cy5sIGZwc2NyLEAtcm4gKi8KLSAgeyAweDQwNjYsIExPQUQgfCBTRVRTMSB8IFNFVFNTUCB8IFVTRVMxIH0sCS8qIGxkcy5sIEBybSssZnBzY3IgKi8KLSAgeyAweDQwNmEsIFNFVFNTUCB8IFVTRVMxIH0JCQkvKiBsZHMgcm0sZnBzY3IgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTQxW10gPQotewotICB7IDB4NDA4MywgU1RPUkUgfCBTRVRTMSB8IFVTRVMxIHwgVVNFU1NQIH0sCS8qIHN0Yy5sIHJ4X2JhbmssQC1ybiAqLwotICB7IDB4NDA4NywgTE9BRCB8IFNFVFMxIHwgU0VUU1NQIHwgVVNFUzEgfSwJLyogbGRjLmwgQHJtKyxyeF9iYW5rICovCi0gIHsgMHg0MDhlLCBTRVRTU1AgfCBVU0VTMSB9CQkJLyogbGRjIHJtLHJ4X2JhbmsgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZTQyW10gPQotewotICB7IDB4NDAwYywgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkJLyogc2hhZCBybSxybiAqLwotICB7IDB4NDAwZCwgU0VUUzEgfCBVU0VTMSB8IFVTRVMyIH0sCQkJLyogc2hsZCBybSxybiAqLwotICB7IDB4NDAwZiwgTE9BRHxTRVRTMXxTRVRTMnxTRVRTU1B8VVNFUzF8VVNFUzJ8VVNFU1NQIH0sIC8qIG1hYy53IEBybSssQHJuKyAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlNFtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZTQwKSwgMHhmMGZmIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU0MSksIDB4ZjA4ZiB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNDIpLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNTBbXSA9Ci17Ci0gIHsgMHg1MDAwLCBMT0FEIHwgU0VUUzEgfCBVU0VTMiB9CS8qIG1vdi5sIEAoZGlzcCxybSkscm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTVbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU1MCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU2MFtdID0KLXsKLSAgeyAweDYwMDAsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YuYiBAcm0scm4gKi8KLSAgeyAweDYwMDEsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YudyBAcm0scm4gKi8KLSAgeyAweDYwMDIsIExPQUQgfCBTRVRTMSB8IFVTRVMyIH0sCQkvKiBtb3YubCBAcm0scm4gKi8KLSAgeyAweDYwMDMsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBtb3Ygcm0scm4gKi8KLSAgeyAweDYwMDQsIExPQUQgfCBTRVRTMSB8IFNFVFMyIHwgVVNFUzIgfSwJLyogbW92LmIgQHJtKyxybiAqLwotICB7IDB4NjAwNSwgTE9BRCB8IFNFVFMxIHwgU0VUUzIgfCBVU0VTMiB9LAkvKiBtb3YudyBAcm0rLHJuICovCi0gIHsgMHg2MDA2LCBMT0FEIHwgU0VUUzEgfCBTRVRTMiB8IFVTRVMyIH0sCS8qIG1vdi5sIEBybSsscm4gKi8KLSAgeyAweDYwMDcsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBub3Qgcm0scm4gKi8KLSAgeyAweDYwMDgsIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBzd2FwLmIgcm0scm4gKi8KLSAgeyAweDYwMDksIFNFVFMxIHwgVVNFUzIgfSwJCQkvKiBzd2FwLncgcm0scm4gKi8KLSAgeyAweDYwMGEsIFNFVFMxIHwgU0VUU1NQIHwgVVNFUzIgfCBVU0VTU1AgfSwJLyogbmVnYyBybSxybiAqLwotICB7IDB4NjAwYiwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIG5lZyBybSxybiAqLwotICB7IDB4NjAwYywgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHUuYiBybSxybiAqLwotICB7IDB4NjAwZCwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHUudyBybSxybiAqLwotICB7IDB4NjAwZSwgU0VUUzEgfCBVU0VTMiB9LAkJCS8qIGV4dHMuYiBybSxybiAqLwotICB7IDB4NjAwZiwgU0VUUzEgfCBVU0VTMiB9CQkJLyogZXh0cy53IHJtLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU2W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNjApLCAweGYwMGYgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlNzBbXSA9Ci17Ci0gIHsgMHg3MDAwLCBTRVRTMSB8IFVTRVMxIH0JCS8qIGFkZCAjaW1tLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGU3W10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlNzApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlODBbXSA9Ci17Ci0gIHsgMHg4MDAwLCBTVE9SRSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIG1vdi5iIHIwLEAoZGlzcCxybikgKi8KLSAgeyAweDgxMDAsIFNUT1JFIHwgVVNFUzIgfCBVU0VTUjAgfSwJLyogbW92LncgcjAsQChkaXNwLHJuKSAqLwotICB7IDB4ODQwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVMyIH0sCS8qIG1vdi5iIEAoZGlzcCxybSkscjAgKi8KLSAgeyAweDg1MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTMiB9LAkvKiBtb3YudyBAKGRpc3Ascm4pLHIwICovCi0gIHsgMHg4ODAwLCBTRVRTU1AgfCBVU0VTUjAgfSwJCS8qIGNtcC9lcSAjaW1tLHIwICovCi0gIHsgMHg4OTAwLCBCUkFOQ0ggfCBVU0VTU1AgfSwJCS8qIGJ0IGxhYmVsICovCi0gIHsgMHg4YjAwLCBCUkFOQ0ggfCBVU0VTU1AgfSwJCS8qIGJmIGxhYmVsICovCi0gIHsgMHg4ZDAwLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVNTUCB9LAkvKiBidC9zIGxhYmVsICovCi0gIHsgMHg4ZjAwLCBCUkFOQ0ggfCBERUxBWSB8IFVTRVNTUCB9CS8qIGJmL3MgbGFiZWwgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZThbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU4MCksIDB4ZmYwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGU5MFtdID0KLXsKLSAgeyAweDkwMDAsIExPQUQgfCBTRVRTMSB9CS8qIG1vdi53IEAoZGlzcCxwYykscm4gKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZTlbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGU5MCksIDB4ZjAwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVhMFtdID0KLXsKLSAgeyAweGEwMDAsIEJSQU5DSCB8IERFTEFZIH0JLyogYnJhIGxhYmVsICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVhW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlYTApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlYjBbXSA9Ci17Ci0gIHsgMHhiMDAwLCBCUkFOQ0ggfCBERUxBWSB9CS8qIGJzciBsYWJlbCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlYltdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWIwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWMwW10gPQotewotICB7IDB4YzAwMCwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi5iIHIwLEAoZGlzcCxnYnIpICovCi0gIHsgMHhjMTAwLCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9LAkJLyogbW92LncgcjAsQChkaXNwLGdicikgKi8KLSAgeyAweGMyMDAsIFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YubCByMCxAKGRpc3AsZ2JyKSAqLwotICB7IDB4YzMwMCwgQlJBTkNIIHwgVVNFU1NQIH0sCQkJLyogdHJhcGEgI2ltbSAqLwotICB7IDB4YzQwMCwgTE9BRCB8IFNFVFNSMCB8IFVTRVNTUCB9LAkJLyogbW92LmIgQChkaXNwLGdicikscjAgKi8KLSAgeyAweGM1MDAsIExPQUQgfCBTRVRTUjAgfCBVU0VTU1AgfSwJCS8qIG1vdi53IEAoZGlzcCxnYnIpLHIwICovCi0gIHsgMHhjNjAwLCBMT0FEIHwgU0VUU1IwIHwgVVNFU1NQIH0sCQkvKiBtb3YubCBAKGRpc3AsZ2JyKSxyMCAqLwotICB7IDB4YzcwMCwgU0VUU1IwIH0sCQkJCS8qIG1vdmEgQChkaXNwLHBjKSxyMCAqLwotICB7IDB4YzgwMCwgU0VUU1NQIHwgVVNFU1IwIH0sCQkJLyogdHN0ICNpbW0scjAgKi8KLSAgeyAweGM5MDAsIFNFVFNSMCB8IFVTRVNSMCB9LAkJCS8qIGFuZCAjaW1tLHIwICovCi0gIHsgMHhjYTAwLCBTRVRTUjAgfCBVU0VTUjAgfSwJCQkvKiB4b3IgI2ltbSxyMCAqLwotICB7IDB4Y2IwMCwgU0VUU1IwIHwgVVNFU1IwIH0sCQkJLyogb3IgI2ltbSxyMCAqLwotICB7IDB4Y2MwMCwgTE9BRCB8IFNFVFNTUCB8IFVTRVNSMCB8IFVTRVNTUCB9LAkvKiB0c3QuYiAjaW1tLEAocjAsZ2JyKSAqLwotICB7IDB4Y2QwMCwgTE9BRCB8IFNUT1JFIHwgVVNFU1IwIHwgVVNFU1NQIH0sCS8qIGFuZC5iICNpbW0sQChyMCxnYnIpICovCi0gIHsgMHhjZTAwLCBMT0FEIHwgU1RPUkUgfCBVU0VTUjAgfCBVU0VTU1AgfSwJLyogeG9yLmIgI2ltbSxAKHIwLGdicikgKi8KLSAgeyAweGNmMDAsIExPQUQgfCBTVE9SRSB8IFVTRVNSMCB8IFVTRVNTUCB9CS8qIG9yLmIgI2ltbSxAKHIwLGdicikgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWlub3Jfb3Bjb2RlIHNoX29wY29kZWNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGVjMCksIDB4ZmYwMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSBzaF9vcGNvZGVkMFtdID0KLXsKLSAgeyAweGQwMDAsIExPQUQgfCBTRVRTMSB9CQkvKiBtb3YubCBAKGRpc3AscGMpLHJuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVkW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlZDApLCAweGYwMDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZTBbXSA9Ci17Ci0gIHsgMHhlMDAwLCBTRVRTMSB9CQkvKiBtb3YgI2ltbSxybiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgc2hfb3Bjb2RlZVtdID0KLXsKLSAgeyBNQVAgKHNoX29wY29kZWUwKSwgMHhmMDAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlIHNoX29wY29kZWYwW10gPQotewotICB7IDB4ZjAwMCwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmYWRkIGZtLGZuICovCi0gIHsgMHhmMDAxLCBTRVRTRjEgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZzdWIgZm0sZm4gKi8KLSAgeyAweGYwMDIsIFNFVFNGMSB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZm11bCBmbSxmbiAqLwotICB7IDB4ZjAwMywgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIH0sCQkvKiBmZGl2IGZtLGZuICovCi0gIHsgMHhmMDA0LCBTRVRTU1AgfCBVU0VTRjEgfCBVU0VTRjIgfSwJCS8qIGZjbXAvZXEgZm0sZm4gKi8KLSAgeyAweGYwMDUsIFNFVFNTUCB8IFVTRVNGMSB8IFVTRVNGMiB9LAkJLyogZmNtcC9ndCBmbSxmbiAqLwotICB7IDB4ZjAwNiwgTE9BRCB8IFNFVFNGMSB8IFVTRVMyIHwgVVNFU1IwIH0sCS8qIGZtb3YucyBAKHIwLHJtKSxmbiAqLwotICB7IDB4ZjAwNywgU1RPUkUgfCBVU0VTMSB8IFVTRVNGMiB8IFVTRVNSMCB9LAkvKiBmbW92LnMgZm0sQChyMCxybikgKi8KLSAgeyAweGYwMDgsIExPQUQgfCBTRVRTRjEgfCBVU0VTMiB9LAkJLyogZm1vdi5zIEBybSxmbiAqLwotICB7IDB4ZjAwOSwgTE9BRCB8IFNFVFMyIHwgU0VUU0YxIHwgVVNFUzIgfSwJLyogZm1vdi5zIEBybSssZm4gKi8KLSAgeyAweGYwMGEsIFNUT1JFIHwgVVNFUzEgfCBVU0VTRjIgfSwJCS8qIGZtb3YucyBmbSxAcm4gKi8KLSAgeyAweGYwMGIsIFNUT1JFIHwgU0VUUzEgfCBVU0VTMSB8IFVTRVNGMiB9LAkvKiBmbW92LnMgZm0sQC1ybiAqLwotICB7IDB4ZjAwYywgU0VUU0YxIHwgVVNFU0YyIH0sCQkJLyogZm1vdiBmbSxmbiAqLwotICB7IDB4ZjAwZSwgU0VUU0YxIHwgVVNFU0YxIHwgVVNFU0YyIHwgVVNFU0YwIH0JLyogZm1hYyBmMCxmbSxmbiAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgc2hfb3Bjb2RlZjFbXSA9Ci17Ci0gIHsgMHhmMDBkLCBTRVRTRjEgfCBVU0VTU1AgfSwJLyogZnN0cyBmcHVsLGZuICovCi0gIHsgMHhmMDFkLCBTRVRTU1AgfCBVU0VTRjEgfSwJLyogZmxkcyBmbixmcHVsICovCi0gIHsgMHhmMDJkLCBTRVRTRjEgfCBVU0VTU1AgfSwJLyogZmxvYXQgZnB1bCxmbiAqLwotICB7IDB4ZjAzZCwgU0VUU1NQIHwgVVNFU0YxIH0sCS8qIGZ0cmMgZm4sZnB1bCAqLwotICB7IDB4ZjA0ZCwgU0VUU0YxIHwgVVNFU0YxIH0sCS8qIGZuZWcgZm4gKi8KLSAgeyAweGYwNWQsIFNFVFNGMSB8IFVTRVNGMSB9LAkvKiBmYWJzIGZuICovCi0gIHsgMHhmMDZkLCBTRVRTRjEgfCBVU0VTRjEgfSwJLyogZnNxcnQgZm4gKi8KLSAgeyAweGYwN2QsIFNFVFNTUCB8IFVTRVNGMSB9LAkvKiBmdHN0L25hbiBmbiAqLwotICB7IDB4ZjA4ZCwgU0VUU0YxIH0sCQkvKiBmbGRpMCBmbiAqLwotICB7IDB4ZjA5ZCwgU0VUU0YxIH0JCS8qIGZsZGkxIGZuICovCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX21pbm9yX29wY29kZSBzaF9vcGNvZGVmW10gPQotewotICB7IE1BUCAoc2hfb3Bjb2RlZjApLCAweGYwMGYgfSwKLSAgeyBNQVAgKHNoX29wY29kZWYxKSwgMHhmMGZmIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlIHNoX29wY29kZXNbXSA9Ci17Ci0gIHsgTUFQIChzaF9vcGNvZGUwKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlMSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTIpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGUzKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZTUpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU2KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlNykgfSwKLSAgeyBNQVAgKHNoX29wY29kZTgpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGU5KSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlYSkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWIpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVjKSB9LAotICB7IE1BUCAoc2hfb3Bjb2RlZCkgfSwKLSAgeyBNQVAgKHNoX29wY29kZWUpIH0sCi0gIHsgTUFQIChzaF9vcGNvZGVmKSB9Ci19OwotCi0vKiBHaXZlbiBhbiBpbnN0cnVjdGlvbiwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZwotICAgc2hfb3Bjb2RlIHN0cnVjdHVyZS4gIFJldHVybiBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBub3QKLSAgIHJlY29nbml6ZWQuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqCi1zaF9pbnNuX2luZm8gKGluc24pCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotewotICBjb25zdCBzdHJ1Y3Qgc2hfbWFqb3Jfb3Bjb2RlICptYWo7Ci0gIGNvbnN0IHN0cnVjdCBzaF9taW5vcl9vcGNvZGUgKm1pbiwgKm1pbmVuZDsKLQotICBtYWogPSAmc2hfb3Bjb2Rlc1soaW5zbiAmIDB4ZjAwMCkgPj4gMTJdOwotICBtaW4gPSBtYWotPm1pbm9yX29wY29kZXM7Ci0gIG1pbmVuZCA9IG1pbiArIG1hai0+Y291bnQ7Ci0gIGZvciAoOyBtaW4gPCBtaW5lbmQ7IG1pbisrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsOwotICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AsICpvcGVuZDsKLQotICAgICAgbCA9IGluc24gJiBtaW4tPm1hc2s7Ci0gICAgICBvcCA9IG1pbi0+b3Bjb2RlczsKLSAgICAgIG9wZW5kID0gb3AgKyBtaW4tPmNvdW50OwotCi0gICAgICAvKiBTaW5jZSB0aGUgb3Bjb2RlcyB0YWJsZXMgYXJlIHNvcnRlZCwgd2UgY291bGQgdXNlIGEgYmluYXJ5Ci0gICAgICAgICBzZWFyY2ggaGVyZSBpZiB0aGUgY291bnQgd2VyZSBhYm92ZSBzb21lIGN1dG9mZiB2YWx1ZS4gICovCi0gICAgICBmb3IgKDsgb3AgPCBvcGVuZDsgb3ArKykKLQlpZiAob3AtPm9wY29kZSA9PSBsKQotCSAgcmV0dXJuIG9wOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsgIAotfQotCi0vKiBTZWUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiB1c2VzIGEgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2luc25fdXNlc19yZWcgKGluc24sIG9wLCByZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IHJlZzsKLXsKLSAgdW5zaWduZWQgaW50IGY7Ci0KLSAgZiA9IG9wLT5mbGFnczsKLQotICBpZiAoKGYgJiBVU0VTMSkgIT0gMAotICAgICAgJiYgKChpbnNuICYgMHgwZjAwKSA+PiA4KSA9PSByZWcpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVMyKSAhPSAwCi0gICAgICAmJiAoKGluc24gJiAweDAwZjApID4+IDQpID09IHJlZykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmICYgVVNFU1IwKSAhPSAwCi0gICAgICAmJiByZWcgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGFuIGluc3RydWN0aW9uIHVzZXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuX3VzZXNfZnJlZyAoaW5zbiwgb3AsIGZyZWcpCi0gICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDsKLSAgICAgdW5zaWduZWQgaW50IGZyZWc7Ci17Ci0gIHVuc2lnbmVkIGludCBmOwotCi0gIGYgPSBvcC0+ZmxhZ3M7Ci0KLSAgLyogV2UgY2FuJ3QgdGVsbCBpZiB0aGlzIGlzIGEgZG91YmxlLXByZWNpc2lvbiBpbnNuLCBzbyBqdXN0IHBsYXkgc2FmZQotICAgICBhbmQgYXNzdW1lIHRoYXQgaXQgbWlnaHQgYmUuICBTbyBub3Qgb25seSBoYXZlIHdlIHRlc3QgRlJFRyBhZ2FpbnN0Ci0gICAgIGl0c2VsZiwgYnV0IGFsc28gZXZlbiBGUkVHIGFnYWluc3QgRlJFRysxIC0gaWYgdGhlIHVzaW5nIGluc24gdXNlcwotICAgICBqdXN0IHRoZSBsb3cgcGFydCBvZiBhIGRvdWJsZSBwcmVjaXNpb24gdmFsdWUgLSBidXQgYWxzbyBhbiBvZGQKLSAgICAgRlJFRyBhZ2FpbnN0IEZSRUctMSAtICBpZiB0aGUgc2V0dGluZyBpbnNuIHNldHMganVzdCB0aGUgbG93IHBhcnQKLSAgICAgb2YgYSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlLgotICAgICBTbyB3aGF0IHRoaXMgYWxsIGJvaWxzIGRvd24gdG8gaXMgdGhhdCB3ZSBoYXZlIHRvIGlnbm9yZSB0aGUgbG93ZXN0Ci0gICAgIGJpdCBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgCi0gIGlmICgoZiAmIFVTRVNGMSkgIT0gMAotICAgICAgJiYgKChpbnNuICYgMHgwZTAwKSA+PiA4KSA9PSAoZnJlZyAmIDB4ZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNGMikgIT0gMAotICAgICAgJiYgKChpbnNuICYgMHgwMGUwKSA+PiA0KSA9PSAoZnJlZyAmIDB4ZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZiAmIFVTRVNGMCkgIT0gMAotICAgICAgJiYgZnJlZyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VlIHdoZXRoZXIgaW5zdHJ1Y3Rpb25zIEkxIGFuZCBJMiBjb25mbGljdCwgYXNzdW1pbmcgSTEgY29tZXMKLSAgIGJlZm9yZSBJMi4gIE9QMSBhbmQgT1AyIGFyZSB0aGUgY29ycmVzcG9uZGluZyBzaF9vcGNvZGUgc3RydWN0dXJlcy4KLSAgIFRoaXMgc2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGEgY29uZmxpY3QsIG9yIGZhbHNlIGlmIHRoZQotICAgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBzd2FwcGVkIHNhZmVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9pbnNuc19jb25mbGljdCAoaTEsIG9wMSwgaTIsIG9wMikKLSAgICAgdW5zaWduZWQgaW50IGkxOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDE7Ci0gICAgIHVuc2lnbmVkIGludCBpMjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AyOwotewotICB1bnNpZ25lZCBpbnQgZjEsIGYyOwotCi0gIGYxID0gb3AxLT5mbGFnczsKLSAgZjIgPSBvcDItPmZsYWdzOwotCi0gIC8qIExvYWQgb2YgZnBzY3IgY29uZmxpY3RzIHdpdGggZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucy4KLSAgICAgRklYTUU6IHNob3VsZG4ndCB0ZXN0IHJhdyBvcGNvZGVzIGhlcmUuICAqLwotICBpZiAoKChpMSAmIDB4ZjBmZikgPT0gMHg0MDY2ICYmIChpMiAmIDB4ZjAwMCkgPT0gMHhmMDAwKQotICAgICAgfHwgKChpMiAmIDB4ZjBmZikgPT0gMHg0MDY2ICYmIChpMSAmIDB4ZjAwMCkgPT0gMHhmMDAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgKEJSQU5DSCB8IERFTEFZKSkgIT0gMAotICAgICAgfHwgKGYyICYgKEJSQU5DSCB8IERFTEFZKSkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUU1NQKSAhPSAwICYmIChmMiAmIFVTRVNTUCkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMiAmIFNFVFNTUCkgIT0gMCAmJiAoZjEgJiBVU0VTU1ApICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChmMSAmIFNFVFMxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAoaTEgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUUzIpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIChpMSAmIDB4MDBmMCkgPj4gNCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjEgJiBTRVRTUjApICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkyLCBvcDIsIDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGYxICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfZnJlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYyICYgU0VUUzEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19yZWcgKGkxLCBvcDEsIChpMiAmIDB4MGYwMCkgPj4gOCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTMikgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTEsIG9wMSwgKGkyICYgMHgwMGYwKSA+PiA0KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKChmMiAmIFNFVFNSMCkgIT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTEsIG9wMSwgMCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmICgoZjIgJiBTRVRTRjEpICE9IDAKLSAgICAgICYmIHNoX2luc25fdXNlc19mcmVnIChpMSwgb3AxLCAoaTIgJiAweDBmMDApID4+IDgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgZG8gbm90IGNvbmZsaWN0LiAgKi8KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBJMSBpcyBhIGxvYWQgaW5zdHJ1Y3Rpb24sIGFuZCBJMiBpcyBzb21lIG90aGVyIGluc3RydWN0aW9uLiAgUmV0dXJuCi0gICB0cnVlIGlmIEkxIGxvYWRzIGEgcmVnaXN0ZXIgd2hpY2ggSTIgdXNlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9sb2FkX3VzZSAoaTEsIG9wMSwgaTIsIG9wMikKLSAgICAgdW5zaWduZWQgaW50IGkxOwotICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpvcDE7Ci0gICAgIHVuc2lnbmVkIGludCBpMjsKLSAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3AyOwotewotICB1bnNpZ25lZCBpbnQgZjE7Ci0KLSAgZjEgPSBvcDEtPmZsYWdzOwotCi0gIGlmICgoZjEgJiBMT0FEKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiBib3RoIFNFVFMxIGFuZCBTRVRTU1AgYXJlIHNldCwgdGhhdCBtZWFucyBhIGxvYWQgdG8gYSBzcGVjaWFsCi0gICAgIHJlZ2lzdGVyIHVzaW5nIHBvc3RpbmNyZW1lbnQgYWRkcmVzc2luZyBtb2RlLCB3aGljaCB3ZSBkb24ndCBjYXJlCi0gICAgIGFib3V0IGhlcmUuICAqLwotICBpZiAoKGYxICYgU0VUUzEpICE9IDAKLSAgICAgICYmIChmMSAmIFNFVFNTUCkgPT0gMAotICAgICAgJiYgc2hfaW5zbl91c2VzX3JlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUU1IwKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfcmVnIChpMiwgb3AyLCAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGYxICYgU0VUU0YxKSAhPSAwCi0gICAgICAmJiBzaF9pbnNuX3VzZXNfZnJlZyAoaTIsIG9wMiwgKGkxICYgMHgwZjAwKSA+PiA4KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRyeSB0byBhbGlnbiBsb2FkcyBhbmQgc3RvcmVzIHdpdGhpbiBhIHNwYW4gb2YgbWVtb3J5LiAgVGhpcyBpcwotICAgY2FsbGVkIGJ5IGJvdGggdGhlIEVMRiBhbmQgdGhlIENPRkYgc2ggdGFyZ2V0cy4gIEFCRkQgYW5kIFNFQyBhcmUKLSAgIHRoZSBCRkQgYW5kIHNlY3Rpb24gd2UgYXJlIGV4YW1pbmluZy4gIENPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZgotICAgdGhlIHNlY3Rpb24uICBTV0FQIGlzIHRoZSByb3V0aW5lIHRvIGNhbGwgdG8gc3dhcCB0d28gaW5zdHJ1Y3Rpb25zLgotICAgUkVMT0NTIGlzIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgdG8gYmUKLSAgIHBhc3NlZCB0byBTV0FQLiAgUExBQkVMIGlzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBsYWJlbCBpbiBhCi0gICBzb3J0ZWQgbGlzdCBvZiBsYWJlbHM7IExBQkVMX0VORCBpcyB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgU1RBUlQgYW5kCi0gICBTVE9QIGFyZSB0aGUgcmFuZ2Ugb2YgbWVtb3J5IHRvIGV4YW1pbmUuICBJZiBhIHN3YXAgaXMgbWFkZSwKLSAgICpQU1dBUFBFRCBpcyBzZXQgdG8gdHJ1ZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBzd2FwLCByZWxvY3MsCi0JCQkgcGxhYmVsLCBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJvb2xlYW4gKCpzd2FwKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci0gICAgIFBUUiByZWxvY3M7Ci0gICAgIGJmZF92bWEgKipwbGFiZWw7Ci0gICAgIGJmZF92bWEgKmxhYmVsX2VuZDsKLSAgICAgYmZkX3ZtYSBzdGFydDsKLSAgICAgYmZkX3ZtYSBzdG9wOwotICAgICBib29sZWFuICpwc3dhcHBlZDsKLXsKLSAgYmZkX3ZtYSBpOwotCi0gIC8qIEluc3RydWN0aW9ucyBzaG91bGQgYmUgYWxpZ25lZCBvbiAyIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmICgoc3RhcnQgJiAxKSA9PSAxKQotICAgICsrc3RhcnQ7Ci0KLSAgLyogTm93IGxvb2sgdGhyb3VnaCB0aGUgdW5hbGlnbmVkIGFkZHJlc3Nlcy4gICovCi0gIGkgPSBzdGFydDsKLSAgaWYgKChpICYgMikgPT0gMCkKLSAgICBpICs9IDI7Ci0gIGZvciAoOyBpIDwgc3RvcDsgaSArPSA0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpbnNuOwotICAgICAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqb3A7Ci0gICAgICB1bnNpZ25lZCBpbnQgcHJldl9pbnNuID0gMDsKLSAgICAgIGNvbnN0IHN0cnVjdCBzaF9vcGNvZGUgKnByZXZfb3AgPSBOVUxMOwotCi0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpKTsKLSAgICAgIG9wID0gc2hfaW5zbl9pbmZvIChpbnNuKTsKLSAgICAgIGlmIChvcCA9PSBOVUxMCi0JICB8fCAob3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBsb2FkIG9yIHN0b3JlIHdoaWNoIGlzIG5vdCBvbiBhIGZvdXIgYnl0ZSBib3VuZGFyeS4gICovCi0KLSAgICAgIHdoaWxlICgqcGxhYmVsIDwgbGFiZWxfZW5kICYmICoqcGxhYmVsIDwgaSkKLQkrKypwbGFiZWw7Ci0KLSAgICAgIGlmIChpID4gc3RhcnQpCi0JewotCSAgcHJldl9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpIC0gMik7Ci0JICBwcmV2X29wID0gc2hfaW5zbl9pbmZvIChwcmV2X2luc24pOwotCi0JICAvKiBJZiB0aGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBpcyBpbiBhIGRlbGF5IHNsb3QsIHdlCi0JICAgICBjYW4ndCBzd2FwLiAgKi8KLQkgIGlmIChwcmV2X29wID09IE5VTEwKLQkgICAgICB8fCAocHJldl9vcC0+ZmxhZ3MgJiBERUxBWSkgIT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgaWYgKGkgPiBzdGFydAotCSAgJiYgKCpwbGFiZWwgPj0gbGFiZWxfZW5kIHx8ICoqcGxhYmVsICE9IGkpCi0JICAmJiBwcmV2X29wICE9IE5VTEwKLQkgICYmIChwcmV2X29wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwCi0JICAmJiAhIHNoX2luc25zX2NvbmZsaWN0IChwcmV2X2luc24sIHByZXZfb3AsIGluc24sIG9wKSkKLQl7Ci0JICBib29sZWFuIG9rOwotCi0JICAvKiBUaGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGEgbGFiZWwsIGFuZAotCSAgICAgdGhlcmUgaXMgYSBwcmV2aW91cyBpbnN0cnVjdGlvbjsgUFJFVl9JTlNOIGlzIG5vdAotCSAgICAgaXRzZWxmIGEgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiwgYW5kIFBSRVZfSU5TTiBhbmQKLQkgICAgIElOU04gZG8gbm90IGNvbmZsaWN0LiAgKi8KLQotCSAgb2sgPSB0cnVlOwotCi0JICBpZiAoaSA+PSBzdGFydCArIDQpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgcHJldjJfaW5zbjsKLQkgICAgICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpwcmV2Ml9vcDsKLQotCSAgICAgIHByZXYyX2luc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGkgLSA0KTsKLQkgICAgICBwcmV2Ml9vcCA9IHNoX2luc25faW5mbyAocHJldjJfaW5zbik7Ci0KLQkgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIFBSRVZfSU5TTiBoYXMgYSBkZWxheQotCQkgc2xvdC0tdGhhdCBpcywgUFJFVl9JTlNOIGlzIGluIGEgZGVsYXkgc2xvdC0td2UKLQkJIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgaWYgKHByZXYyX29wID09IE5VTEwKLQkJICB8fCAocHJldjJfb3AtPmZsYWdzICYgREVMQVkpICE9IDApCi0JCW9rID0gZmFsc2U7Ci0KLQkgICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIFBSRVZfSU5TTiBpcyBhIGxvYWQsCi0JCSBhbmQgaXQgc2V0cyBhIHJlZ2lzdGVyIHdoaWNoIElOU04gdXNlcywgdGhlbgotCQkgcHV0dGluZyBJTlNOIGltbWVkaWF0ZWx5IGFmdGVyIFBSRVZfSU5TTiB3aWxsCi0JCSBjYXVzZSBhIHBpcGVsaW5lIGJ1YmJsZSwgc28gdGhlcmUgaXMgbm8gcG9pbnQgdG8KLQkJIG1ha2luZyB0aGUgc3dhcC4gICovCi0JICAgICAgaWYgKG9rCi0JCSAgJiYgKHByZXYyX29wLT5mbGFncyAmIExPQUQpICE9IDAKLQkJICAmJiBzaF9sb2FkX3VzZSAocHJldjJfaW5zbiwgcHJldjJfb3AsIGluc24sIG9wKSkKLQkJb2sgPSBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAob2spCi0JICAgIHsKLQkgICAgICBpZiAoISAoKnN3YXApIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGkgLSAyKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwc3dhcHBlZCA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHdoaWxlICgqcGxhYmVsIDwgbGFiZWxfZW5kICYmICoqcGxhYmVsIDwgaSArIDIpCi0JKysqcGxhYmVsOwotCi0gICAgICBpZiAoaSArIDIgPCBzdG9wCi0JICAmJiAoKnBsYWJlbCA+PSBsYWJlbF9lbmQgfHwgKipwbGFiZWwgIT0gaSArIDIpKQotCXsKLQkgIHVuc2lnbmVkIGludCBuZXh0X2luc247Ci0JICBjb25zdCBzdHJ1Y3Qgc2hfb3Bjb2RlICpuZXh0X29wOwotCi0JICAvKiBUaGVyZSBpcyBhbiBpbnN0cnVjdGlvbiBhZnRlciB0aGUgbG9hZC9zdG9yZQotCSAgICAgaW5zdHJ1Y3Rpb24sIGFuZCBpdCBkb2VzIG5vdCBoYXZlIGEgbGFiZWwuICAqLwotCSAgbmV4dF9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpICsgMik7Ci0JICBuZXh0X29wID0gc2hfaW5zbl9pbmZvIChuZXh0X2luc24pOwotCSAgaWYgKG5leHRfb3AgIT0gTlVMTAotCSAgICAgICYmIChuZXh0X29wLT5mbGFncyAmIChMT0FEIHwgU1RPUkUpKSA9PSAwCi0JICAgICAgJiYgISBzaF9pbnNuc19jb25mbGljdCAoaW5zbiwgb3AsIG5leHRfaW5zbiwgbmV4dF9vcCkpCi0JICAgIHsKLQkgICAgICBib29sZWFuIG9rOwotCi0JICAgICAgLyogTkVYVF9JTlNOIGlzIG5vdCBpdHNlbGYgYSBsb2FkL3N0b3JlIGluc3RydWN0aW9uLAotCQkgYW5kIGl0IGRvZXMgbm90IGNvbmZsaWN0IHdpdGggSU5TTi4gICovCi0KLQkgICAgICBvayA9IHRydWU7Ci0KLQkgICAgICAvKiBJZiBQUkVWX0lOU04gaXMgYSBsb2FkLCBhbmQgaXQgc2V0cyBhIHJlZ2lzdGVyCi0JCSB3aGljaCBORVhUX0lOU04gdXNlcywgdGhlbiBwdXR0aW5nIE5FWFRfSU5TTgotCQkgaW1tZWRpYXRlbHkgYWZ0ZXIgUFJFVl9JTlNOIHdpbGwgY2F1c2UgYSBwaXBlbGluZQotCQkgYnViYmxlLCBzbyB0aGVyZSBpcyBubyByZWFzb24gdG8gbWFrZSB0aGlzIHN3YXAuICAqLwotCSAgICAgIGlmIChwcmV2X29wICE9IE5VTEwKLQkJICAmJiAocHJldl9vcC0+ZmxhZ3MgJiBMT0FEKSAhPSAwCi0JCSAgJiYgc2hfbG9hZF91c2UgKHByZXZfaW5zbiwgcHJldl9vcCwgbmV4dF9pbnNuLCBuZXh0X29wKSkKLQkJb2sgPSBmYWxzZTsKLQotCSAgICAgIC8qIElmIElOU04gaXMgYSBsb2FkLCBhbmQgaXQgc2V0cyBhIHJlZ2lzdGVyIHdoaWNoCi0JCSB0aGUgaW5zbiBhZnRlciBORVhUX0lOU04gdXNlcywgdGhlbiBkb2luZyB0aGUKLQkJIHN3YXAgd2lsbCBjYXVzZSBhIHBpcGVsaW5lIGJ1YmJsZSwgc28gdGhlcmUgaXMgbm8KLQkJIHJlYXNvbiB0byBtYWtlIHRoZSBzd2FwLiAgSG93ZXZlciwgaWYgdGhlIGluc24KLQkJIGFmdGVyIE5FWFRfSU5TTiBpcyBpdHNlbGYgYSBsb2FkIG9yIHN0b3JlCi0JCSBpbnN0cnVjdGlvbiwgdGhlbiBpdCBpcyBtaXNhbGlnbmVkLCBzbwotCQkgb3B0aW1pc3RpY2FsbHkgaG9wZSB0aGF0IGl0IHdpbGwgYmUgc3dhcHBlZAotCQkgaXRzZWxmLCBhbmQganVzdCBsaXZlIHdpdGggdGhlIHBpcGVsaW5lIGJ1YmJsZSBpZgotCQkgaXQgaXNuJ3QuICAqLwotCSAgICAgIGlmIChvawotCQkgICYmIGkgKyA0IDwgc3RvcAotCQkgICYmIChvcC0+ZmxhZ3MgJiBMT0FEKSAhPSAwKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IG5leHQyX2luc247Ci0JCSAgY29uc3Qgc3RydWN0IHNoX29wY29kZSAqbmV4dDJfb3A7Ci0KLQkJICBuZXh0Ml9pbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpICsgNCk7Ci0JCSAgbmV4dDJfb3AgPSBzaF9pbnNuX2luZm8gKG5leHQyX2luc24pOwotCQkgIGlmICgobmV4dDJfb3AtPmZsYWdzICYgKExPQUQgfCBTVE9SRSkpID09IDAKLQkJICAgICAgJiYgc2hfbG9hZF91c2UgKGluc24sIG9wLCBuZXh0Ml9pbnNuLCBuZXh0Ml9vcCkpCi0JCSAgICBvayA9IGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAob2spCi0JCXsKLQkJICBpZiAoISAoKnN3YXApIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGkpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgICpwc3dhcHBlZCA9IHRydWU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgZm9yIGxvYWRzIGFuZCBzdG9yZXMgd2hpY2ggd2UgY2FuIGFsaWduIHRvIGZvdXIgYnl0ZQotICAgYm91bmRhcmllcy4gIFNlZSB0aGUgbG9uZ2VyIGNvbW1lbnQgYWJvdmUgc2hfcmVsYXhfc2VjdGlvbiBmb3Igd2h5Ci0gICB0aGlzIGlzIGRlc2lyYWJsZS4gIFRoaXMgc2V0cyAqUFNXQVBQRUQgaWYgc29tZSBpbnN0cnVjdGlvbiB3YXMKLSAgIHN3YXBwZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywgcHN3YXBwZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYm9vbGVhbiAqcHN3YXBwZWQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF92bWEgKmxhYmVscyA9IE5VTEw7Ci0gIGJmZF92bWEgKmxhYmVsLCAqbGFiZWxfZW5kOwotCi0gICpwc3dhcHBlZCA9IGZhbHNlOwotCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gIC8qIEdldCBhbGwgdGhlIGFkZHJlc3NlcyB3aXRoIGxhYmVscyBvbiB0aGVtLiAgKi8KLSAgbGFiZWxzID0gKGJmZF92bWEgKikgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudCAqIHNpemVvZiAoYmZkX3ZtYSkpOwotICBpZiAobGFiZWxzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGxhYmVsX2VuZCA9IGxhYmVsczsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9MQUJFTCkKLQl7Ci0JICAqbGFiZWxfZW5kID0gaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgKytsYWJlbF9lbmQ7Ci0JfQotICAgIH0KLQotICAvKiBOb3RlIHRoYXQgdGhlIGFzc2VtYmxlciBjdXJyZW50bHkgYWx3YXlzIG91dHB1dHMgcmVsb2NzIGluCi0gICAgIGFkZHJlc3Mgb3JkZXIuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBzb3J0Ci0gICAgIHRoZSBsYWJlbCB2YWx1ZXMgYW5kIHRoZSByZWxvY3MuICAqLwotCi0gIGxhYmVsID0gbGFiZWxzOwotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN0YXJ0LCBzdG9wOwotCi0gICAgICBpZiAoaXJlbC0+cl90eXBlICE9IFJfU0hfQ09ERSkKLQljb250aW51ZTsKLQotICAgICAgc3RhcnQgPSBpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWE7Ci0KLSAgICAgIGZvciAoaXJlbCsrOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCWlmIChpcmVsLT5yX3R5cGUgPT0gUl9TSF9EQVRBKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbCA8IGlyZWxlbmQpCi0Jc3RvcCA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYTsKLSAgICAgIGVsc2UKLQlzdG9wID0gc2VjLT5fY29va2VkX3NpemU7Ci0KLSAgICAgIGlmICghIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuIChhYmZkLCBzZWMsIGNvbnRlbnRzLCBzaF9zd2FwX2luc25zLAotCQkJCSAgICAgKFBUUikgaW50ZXJuYWxfcmVsb2NzLCAmbGFiZWwsCi0JCQkJICAgICBsYWJlbF9lbmQsIHN0YXJ0LCBzdG9wLCBwc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZyZWUgKGxhYmVscyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChsYWJlbHMgIT0gTlVMTCkKLSAgICBmcmVlIChsYWJlbHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFN3YXAgdHdvIFNIIGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9zd2FwX2luc25zIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHJlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSByZWxvY3M7Ci0gIHVuc2lnbmVkIHNob3J0IGkxLCBpMjsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsLCAqaXJlbGVuZDsKLQotICAvKiBTd2FwIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gICovCi0gIGkxID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgaTIgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTIsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkxLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLQotICAvKiBBZGp1c3QgYWxsIHJlbG9jIGFkZHJlc3Nlcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgaW50IHR5cGUsIGFkZDsKLQotICAgICAgLyogVGhlcmUgYXJlIGEgZmV3IHNwZWNpYWwgdHlwZXMgb2YgcmVsb2NzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgYWRqdXN0LiAgVGhlc2UgcmVsb2NzIGRvIG5vdCBhcHBseSB0byB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLAotICAgICAgICAgYnV0IGFyZSBvbmx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRkcmVzcy4gICovCi0gICAgICB0eXBlID0gaXJlbC0+cl90eXBlOwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9BTElHTgotCSAgfHwgdHlwZSA9PSBSX1NIX0NPREUKLQkgIHx8IHR5cGUgPT0gUl9TSF9EQVRBCi0JICB8fCB0eXBlID09IFJfU0hfTEFCRUwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIGFuIFJfU0hfVVNFUyByZWxvYyBwb2ludHMgdG8gb25lIG9mIHRoZSBhZGRyZXNzZXMgYmVpbmcKLSAgICAgICAgIHN3YXBwZWQsIHdlIG11c3QgYWRqdXN0IGl0LiAgSXQgd291bGQgYmUgaW5jb3JyZWN0IHRvIGRvIHRoaXMKLSAgICAgICAgIGZvciBhIGp1bXAsIHRob3VnaCwgc2luY2Ugd2Ugd2FudCB0byBleGVjdXRlIGJvdGgKLSAgICAgICAgIGluc3RydWN0aW9ucyBhZnRlciB0aGUganVtcC4gIChXZSBoYXZlIGF2b2lkZWQgc3dhcHBpbmcKLSAgICAgICAgIGFyb3VuZCBhIGxhYmVsLCBzbyB0aGUganVtcCB3aWxsIG5vdCB3aW5kIHVwIGV4ZWN1dGluZyBhbgotICAgICAgICAgaW5zdHJ1Y3Rpb24gaXQgc2hvdWxkbid0KS4gICovCi0gICAgICBpZiAodHlwZSA9PSBSX1NIX1VTRVMpCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIG9mZiA9IGlyZWwtPnJfdmFkZHIgLSBzZWMtPnZtYSArIDQgKyBpcmVsLT5yX29mZnNldDsKLQkgIGlmIChvZmYgPT0gYWRkcikKLQkgICAgaXJlbC0+cl9vZmZzZXQgKz0gMjsKLQkgIGVsc2UgaWYgKG9mZiA9PSBhZGRyICsgMikKLQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKLQl9Ci0KLSAgICAgIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gYWRkcikKLQl7Ci0JICBpcmVsLT5yX3ZhZGRyICs9IDI7Ci0JICBhZGQgPSAtMjsKLQl9Ci0gICAgICBlbHNlIGlmIChpcmVsLT5yX3ZhZGRyIC0gc2VjLT52bWEgPT0gYWRkciArIDIpCi0JewotCSAgaXJlbC0+cl92YWRkciAtPSAyOwotCSAgYWRkID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JYWRkID0gMDsKLQotICAgICAgaWYgKGFkZCAhPSAwKQotCXsKLQkgIGJmZF9ieXRlICpsb2M7Ci0JICB1bnNpZ25lZCBzaG9ydCBpbnNuLCBvaW5zbjsKLQkgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLQkgIGxvYyA9IGNvbnRlbnRzICsgaXJlbC0+cl92YWRkciAtIHNlYy0+dm1hOwotCSAgb3ZlcmZsb3cgPSBmYWxzZTsKLQkgIHN3aXRjaCAodHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9QQ0RJU1A4QlkyOgotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04QlkyOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENESVNQOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfUENSRUxJTU04Qlk0OgotCSAgICAgIC8qIFRoaXMgcmVsb2MgaWdub3JlcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMyBiaXRzIG9mCi0gICAgICAgICAgICAgICAgIHRoZSBwcm9ncmFtIGNvdW50ZXIgYmVmb3JlIGFkZGluZyBpbiB0aGUgb2Zmc2V0LgotICAgICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgaWYgQUREUiBpcyBhdCBhbiBldmVuIGFkZHJlc3MsIHRoZQotICAgICAgICAgICAgICAgICBzd2FwIHdpbGwgbm90IGFmZmVjdCB0aGUgb2Zmc2V0LiAgSWYgQUREUiBpcyBhbiBhdCBhbgotICAgICAgICAgICAgICAgICBvZGQgYWRkcmVzcywgdGhlbiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBiZSBjcm9zc2luZyBhCi0gICAgICAgICAgICAgICAgIGZvdXIgYnl0ZSBib3VuZGFyeSwgYW5kIG11c3QgYmUgYWRqdXN0ZWQuICAqLwotCSAgICAgIGlmICgoYWRkciAmIDMpICE9IDApCi0JCXsKLQkJICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgbG9jKTsKLQkJICBvaW5zbiA9IGluc247Ci0JCSAgaW5zbiArPSBhZGQgLyAyOwotCQkgIGlmICgob2luc24gJiAweGZmMDApICE9IChpbnNuICYgMHhmZjAwKSkKLQkJICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQkJICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBsb2MpOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAob3ZlcmZsb3cpCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgICgiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfdmFkZHIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyBpcyBhIG1vZGlmaWNhdGlvbiBvZiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLCB3aGljaAotICAgd2lsbCBoYW5kbGUgU0ggcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc2hfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJICAgICByZWxvY3MsIHN5bXMsIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bTsKLSAgICAgIGJmZF92bWEgYWRkZW5kOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgLyogQWxtb3N0IGFsbCByZWxvY3MgaGF2ZSB0byBkbyB3aXRoIHJlbGF4aW5nLiAgSWYgYW55IHdvcmsgbXVzdAotICAgICAgICAgYmUgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KLSAgICAgIGlmIChyZWwtPnJfdHlwZSAhPSBSX1NIX0lNTTMyCi0JICAmJiByZWwtPnJfdHlwZSAhPSBSX1NIX1BDRElTUCkKLQljb250aW51ZTsKLQotICAgICAgc3ltbmR4ID0gcmVsLT5yX3N5bW5keDsKLQotICAgICAgaWYgKHN5bW5keCA9PSAtMSkKLQl7Ci0JICBoID0gTlVMTDsKLQkgIHN5bSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBpZiAoc3ltbmR4IDwgMAotCSAgICAgIHx8ICh1bnNpZ25lZCBsb25nKSBzeW1uZHggPj0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKCIlczogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIsCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBzeW1uZHgpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICBpZiAoc3ltICE9IE5VTEwgJiYgc3ltLT5uX3NjbnVtICE9IDApCi0JYWRkZW5kID0gLSBzeW0tPm5fdmFsdWU7Ci0gICAgICBlbHNlCi0JYWRkZW5kID0gMDsKLQotICAgICAgaWYgKHJlbC0+cl90eXBlID09IFJfU0hfUENESVNQKQotCWFkZGVuZCAtPSA0OwotCi0gICAgICBpZiAocmVsLT5yX3R5cGUgPj0gU0hfQ09GRl9IT1dUT19DT1VOVCkKLQlob3d0byA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaG93dG8gPSAmc2hfY29mZl9ob3d0b3NbcmVsLT5yX3R5cGVdOwotCi0gICAgICBpZiAoaG93dG8gPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBkbyBmb3IgYW4gaW50ZXJuYWwgUENESVNQIHJlbG9jLiAgKi8KLQkgIGlmIChyZWwtPnJfdHlwZSA9PSBSX1NIX1BDRElTUCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICAgIHZhbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNlYyA9IHNlY3Rpb25zW3N5bW5keF07Ci0gICAgICAgICAgICAgIHZhbCA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICsgc3ltLT5uX3ZhbHVlCi0JCSAgICAgLSBzZWMtPnZtYSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsCi0JCQkJCXJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSwKLQkJCQkJdmFsLCBhZGRlbmQpOwotCi0gICAgICBzd2l0Y2ggKHJzdGF0KQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLQotCSAgICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICAgIG5hbWUgPSAiKkFCUyoiOwotCSAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UgaWYgKHN5bS0+X24uX25fbi5fbl96ZXJvZXMgPT0gMAotCQkgICAgICYmIHN5bS0+X24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgICBuYW1lID0gb2JqX2NvZmZfc3RyaW5ncyAoaW5wdXRfYmZkKSArIHN5bS0+X24uX25fbi5fbl9vZmZzZXQ7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0gCQlzdHJuY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotCQlidWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkJbmFtZSA9IGJ1ZjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBzaF9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLXNoX2NvZmZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCWRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSA9PSBOVUxMCi0gICAgICB8fCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgbWVtY3B5IChkYXRhLCBjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKS0+Y29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgICAgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgZmFsc2UsIChiZmRfYnl0ZSAqKSBOVUxMLAotCQkJICBmYWxzZSwgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpCi0JCQkJICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAob2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkKLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIHN5bWVzejsKLSAgICAgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQl7Ci0JICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+bl9zY251bSAhPSAwKQotCSAgICAqc2VjcHAgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPm5fc2NudW0pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGlzeW1wLT5uX3ZhbHVlID09IDApCi0JCSpzZWNwcCA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICAgICAgZWxzZQotCQkqc2VjcHAgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0KLQkgIGVzeW0gKz0gKGlzeW1wLT5uX251bWF1eCArIDEpICogc3ltZXN6OwotCSAgc2VjcHAgKz0gaXN5bXAtPm5fbnVtYXV4ICsgMTsKLQkgIGlzeW1wICs9IGlzeW1wLT5uX251bWF1eCArIDE7Ci0JfQotCi0gICAgICBpZiAoISBzaF9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBUaGUgdGFyZ2V0IHZlY3RvcnMuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0IHNoY29mZl92ZWMgPQotewotICAiY29mZi1zaCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IEJGRF9JU19SRUxBWEFCTEUpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWMgPQotewotICAiY29mZi1zaGwiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogZGF0YSBieXRlIG9yZGVyIGlzIGxpdHRsZSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGxpdHRsZSBlbmRpYW4gdG9vKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sICAgCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKLQotLyogU29tZSBwZW9wbGUgd2FudCB2ZXJzaW9ucyBvZiB0aGUgU0ggQ09GRiB0YXJnZXQgd2hpY2ggZG8gbm90IGFsaWduCi0gICB0byAxNiBieXRlIGJvdW5kYXJpZXMuICBXZSBpbXBsZW1lbnQgdGhhdCBieSBhZGRpbmcgYSBjb3VwbGUgb2YgbmV3Ci0gICB0YXJnZXQgdmVjdG9ycy4gIFRoZXNlIGFyZSBqdXN0IGxpa2UgdGhlIG9uZXMgYWJvdmUsIGJ1dCB0aGV5Ci0gICBjaGFuZ2UgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQuICBUbyBnZW5lcmF0ZSB0aGVtIGluIHRoZQotICAgYXNzZW1ibGVyLCB1c2UgLXNtYWxsLiAgVG8gdXNlIHRoZW0gaW4gdGhlIGxpbmtlciwgdXNlIC1iCi0gICBjb2ZmLXNoe2x9LXNtYWxsIGFuZCAtb2Zvcm1hdCBjb2ZmLXNoe2x9LXNtYWxsLgotCi0gICBZZXMsIHRoaXMgaXMgYSBob3JyaWJsZSBoYWNrLiAgQSBnZW5lcmFsIHNvbHV0aW9uIGZvciBzZXR0aW5nCi0gICBzZWN0aW9uIGFsaWdubWVudCBpbiBDT0ZGIGlzIHJhdGhlciBjb21wbGV4LiAgRUxGIGhhbmRsZXMgdGhpcwotICAgY29ycmVjdGx5LiAgKi8KLQotLyogT25seSByZWNvZ25pemUgdGhlIHNtYWxsIHZlcnNpb25zIGlmIHRoZSB0YXJnZXQgd2FzIG5vdCBkZWZhdWx0ZWQuCi0gICBPdGhlcndpc2Ugd2Ugd29uJ3QgcmVjb2duaXplIHRoZSBub24gZGVmYXVsdCBlbmRpYW5uZXNzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY29mZl9zbWFsbF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGNvZmZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi0vKiBTZXQgdGhlIHNlY3Rpb24gYWxpZ25tZW50IGZvciB0aGUgc21hbGwgdmVyc2lvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbWFsbF9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBpZiAoISBjb2ZmX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSBtdXN0IGFsaWduIHRvIGF0IGxlYXN0IGEgZm91ciBieXRlIGJvdW5kYXJ5LCBiZWNhdXNlIGxvbmd3b3JkCi0gICAgIGFjY2Vzc2VzIG11c3QgYmUgb24gYSBmb3VyIGJ5dGUgYm91bmRhcnkuICAqLwotICBpZiAoc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID09IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUikKLSAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNvcGllZCBmcm9tIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlIHNvIHRoYXQgd2UgY2FuIGNoYW5nZQotICAgdGhlIGRlZmF1bHQgc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUgPQotewotICBjb2ZmX3N3YXBfYXV4X2luLCBjb2ZmX3N3YXBfc3ltX2luLCBjb2ZmX3N3YXBfbGluZW5vX2luLAotICBjb2ZmX3N3YXBfYXV4X291dCwgY29mZl9zd2FwX3N5bV9vdXQsCi0gIGNvZmZfc3dhcF9saW5lbm9fb3V0LCBjb2ZmX3N3YXBfcmVsb2Nfb3V0LAotICBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQsIGNvZmZfc3dhcF9hb3V0aGRyX291dCwKLSAgY29mZl9zd2FwX3Njbmhkcl9vdXQsCi0gIEZJTEhTWiwgQU9VVFNaLCBTQ05IU1osIFNZTUVTWiwgQVVYRVNaLCBSRUxTWiwgTElORVNaLAotI2lmZGVmIENPRkZfTE9OR19GSUxFTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgdHJ1ZSwKLSNlbHNlCi0gIGZhbHNlLAotI2VuZGlmCi0gIDIsCi0gIGNvZmZfc3dhcF9maWxlaGRyX2luLCBjb2ZmX3N3YXBfYW91dGhkcl9pbiwgY29mZl9zd2FwX3Njbmhkcl9pbiwKLSAgY29mZl9zd2FwX3JlbG9jX2luLCBjb2ZmX2JhZF9mb3JtYXRfaG9vaywgY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gIGNvZmZfbWtvYmplY3RfaG9vaywgc3R5cF90b19zZWNfZmxhZ3MsIGNvZmZfc2V0X2FsaWdubWVudF9ob29rLAotICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwgc3ltbmFtZV9pbl9kZWJ1Z19ob29rLCBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2ssCi0gIGNvZmZfcHJpbnRfYXV4LCBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSwKLSAgY29mZl9zeW1faXNfZ2xvYmFsLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLSAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCi0gIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAotICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLX07Ci0KLSNkZWZpbmUgY29mZl9zbWFsbF9jbG9zZV9hbmRfY2xlYW51cCBcCi0gIGNvZmZfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgY29mZl9zbWFsbF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBcCi0gIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9zbWFsbF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi1jb25zdCBiZmRfdGFyZ2V0IHNoY29mZl9zbWFsbF92ZWMgPQotewotICAiY29mZi1zaC1zbWFsbCIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCi0gICdfJywJCQkJLyogbGVhZGluZyBzeW1ib2wgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfc21hbGxfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmZfc21hbGwpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgJmJmZF9jb2ZmX3NtYWxsX3N3YXBfdGFibGUKLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWMgPQotewotICAiY29mZi1zaGwtc21hbGwiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIGVuZGlhbiB0b28qLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBCRkRfSVNfUkVMQVhBQkxFKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwKLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9zbWFsbF9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwgICAKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsIC8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZl9zbWFsbCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAmYmZkX2NvZmZfc21hbGxfc3dhcF90YWJsZQotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXNwYXJjLmMgYi9iZmQvY29mZi1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzJjZjE1Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBTcGFyYyBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL3NwYXJjLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDMpCi0KLSNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBTUEFSQ01BR0lDICYmICh4KS5mX21hZ2ljICE9IExZTlhDT0ZGTUFHSUMpCi0KLS8qIFRoZSBwYWdlIHNpemUgaXMgYSBndWVzcyBiYXNlZCBvbiBFTEYuICAqLwotI2RlZmluZSBDT0ZGX1BBR0VfU0laRSAweDEwMDAwCi0KLWVudW0gcmVsb2NfdHlwZQotICB7Ci0gICAgUl9TUEFSQ19OT05FID0gMCwKLSAgICBSX1NQQVJDXzgsCQlSX1NQQVJDXzE2LAkJUl9TUEFSQ18zMiwgCi0gICAgUl9TUEFSQ19ESVNQOCwJUl9TUEFSQ19ESVNQMTYsCQlSX1NQQVJDX0RJU1AzMiwgCi0gICAgUl9TUEFSQ19XRElTUDMwLAlSX1NQQVJDX1dESVNQMjIsCi0gICAgUl9TUEFSQ19ISTIyLAlSX1NQQVJDXzIyLAotICAgIFJfU1BBUkNfMTMsCQlSX1NQQVJDX0xPMTAsCi0gICAgUl9TUEFSQ19HT1QxMCwJUl9TUEFSQ19HT1QxMywJCVJfU1BBUkNfR09UMjIsCi0gICAgUl9TUEFSQ19QQzEwLAlSX1NQQVJDX1BDMjIsCi0gICAgUl9TUEFSQ19XUExUMzAsCi0gICAgUl9TUEFSQ19DT1BZLAotICAgIFJfU1BBUkNfR0xPQl9EQVQsCVJfU1BBUkNfSk1QX1NMT1QsCi0gICAgUl9TUEFSQ19SRUxBVElWRSwKLSAgICBSX1NQQVJDX1VBMzIsCi0gICAgUl9TUEFSQ19tYXgKLSAgfTsKLQotI2lmIDAKLXN0YXRpYyBDT05TVCBjaGFyICpDT05TVCByZWxvY190eXBlX25hbWVzW10gPQotewotICAiUl9TUEFSQ19OT05FIiwKLSAgIlJfU1BBUkNfOCIsCQkiUl9TUEFSQ18xNiIsCQkiUl9TUEFSQ18zMiIsCi0gICJSX1NQQVJDX0RJU1A4IiwJIlJfU1BBUkNfRElTUDE2IiwJIlJfU1BBUkNfRElTUDMyIiwKLSAgIlJfU1BBUkNfV0RJU1AzMCIsCSJSX1NQQVJDX1dESVNQMjIiLAotICAiUl9TUEFSQ19ISTIyIiwJIlJfU1BBUkNfMjIiLAotICAiUl9TUEFSQ18xMyIsCQkiUl9TUEFSQ19MTzEwIiwKLSAgIlJfU1BBUkNfR09UMTAiLAkiUl9TUEFSQ19HT1QxMyIsCSJSX1NQQVJDX0dPVDIyIiwKLSAgIlJfU1BBUkNfUEMxMCIsCSJSX1NQQVJDX1BDMjIiLAotICAiUl9TUEFSQ19XUExUMzAiLAotICAiUl9TUEFSQ19DT1BZIiwKLSAgIlJfU1BBUkNfR0xPQl9EQVQiLAkiUl9TUEFSQ19KTVBfU0xPVCIsCi0gICJSX1NQQVJDX1JFTEFUSVZFIiwKLSAgIlJfU1BBUkNfVUEzMiIsCi19OwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgc3RvbGVuIHByZXR0eSBkaXJlY3RseSBmcm9tIGVsZi5jLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsCi0JCQkJYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2NvZmZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBjb2ZmX3NwYXJjX2hvd3RvX3RhYmxlW10gPSAKLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgMCwwLCA4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgMCwwLCA4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgIDAsMSwxNix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgMiwyLDMwLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsIDIsMiwyMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgIDAsMiwxMyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgMCwyLDEwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgIDAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfY29mZl9nZW5lcmljX3JlbG9jLCJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2NvZmZfZ2VuZXJpY19yZWxvYywiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9jb2ZmX2dlbmVyaWNfcmVsb2MsIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLX07Ci0KLXN0cnVjdCBjb2ZmX3JlbG9jX21hcCB7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGNvZmZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBjb2ZmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwgLyogQEAgQXNzdW1lcyAzMiBiaXRzLiAgKi8KLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qICB7IEJGRF9SRUxPQ19TUEFSQ19VQTMyLCBSX1NQQVJDX1VBMzIgfSwgbm90IHVzZWQ/PyAqLwotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl9zcGFyY19yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNwYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBjb2ZmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3BhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmNvZmZfc3BhcmNfaG93dG9fdGFibGVbKGludCkgc3BhcmNfcmVsb2NfbWFwW2ldLmNvZmZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotI2RlZmluZSBjb2ZmX2JmZF9yZWxvY190eXBlX2xvb2t1cAljb2ZmX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoY2FjaGVfcHRyLCBkc3QpCi0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpkc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKGRzdC0+cl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmNvZmZfc3BhcmNfaG93dG9fdGFibGVbZHN0LT5yX3R5cGVdOwotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0jZGVmaW5lIFNXQVBfSU5fUkVMT0NfT0ZGU0VUCWJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQJYmZkX2hfcHV0XzMyCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHB0ciwgcmVsb2MsIGNhY2hlX3B0cikgXAotICBjYWNoZV9wdHItPmFkZGVuZCA9IHJlbG9jLnJfb2Zmc2V0OwotCi0vKiBDbGVhciB0aGUgcl9zcGFyZSBmaWVsZCBpbiByZWxvY3MuICAqLwotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHNyYyxkc3QpIFwKLSAgZG8geyBcCi0gICAgICAgZHN0LT5yX3NwYXJlWzBdID0gMDsgXAotICAgICAgIGRzdC0+cl9zcGFyZVsxXSA9IDA7IFwKLSAgICAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotLyogRW5hYmxlIFNwYXJjLXNwZWNpZmljIGhhY2tzIGluIGNvZmZjb2RlLmguICovCi0KLSNkZWZpbmUgQ09GRl9TUEFSQwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotY29uc3QgYmZkX3RhcmdldAotI2lmZGVmIFRBUkdFVF9TWU0KLSAgVEFSR0VUX1NZTSA9Ci0jZWxzZQotICBzcGFyY2NvZmZfdmVjID0KLSNlbmRpZgotewotI2lmZGVmIFRBUkdFVF9OQU1FCi0gIFRBUkdFVF9OQU1FLAotI2Vsc2UKLSAgImNvZmYtc3BhcmMiLAkJCS8qIG5hbWUgKi8KLSNlbmRpZgotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCS8qIGhlYWRlciBieXRlIG9yZGVyIGlzIGJpZyAqLwotCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogaGRycyAqLwotCi0vKiBOb3RlIHRoYXQgd2UgYWxsb3cgYW4gb2JqZWN0IGZpbGUgdG8gYmUgdHJlYXRlZCBhcyBhIGNvcmUgZmlsZSBhcyB3ZWxsLiAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgY29mZl9vYmplY3RfcH0sCi0gICAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwgLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtc3RnbzMyLmMgYi9iZmQvY29mZi1zdGdvMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3MjRmZS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi1zdGdvMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEludGVsIDM4NiBDT0ZGIGZpbGVzIChnbzMyIHZhcmlhbnQgd2l0aCBhIHN0dWIpLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFJvYmVydCBIb2VobmUuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhhbmRsZXMgbm93IGFsc28gc3R1YmJlZCBjb2ZmIGltYWdlcy4gVGhlIHN0dWIgaXMgYSBzbWFsbAotICAgRE9TIGV4ZWN1dGFibGUgcHJvZ3JhbSBiZWZvcmUgdGhlIGNvZmYgaW1hZ2UgdG8gbG9hZCBpdCBpbiBtZW1vcnkKLSAgIGFuZCBleGVjdXRlIGl0LiBUaGlzIGlzIG5lZWRlZCwgYmVjYXVzZSBET1MgY2Fubm90IHJ1biBjb2ZmIGZpbGVzLgotCi0gICBBbGwgdGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgY2FsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucwotICAgZnJvbSBjb2Zmc3dhcC5oLgotICAgVGhlIG9ubHkgdGhpbmcgd2hhdCB0aGV5IGRvIGlzIHRvIGFkanVzdCB0aGUgaW5mb3JtYXRpb24gc3RvcmVkIGluCi0gICB0aGUgQ09GRiBmaWxlIHdoaWNoIGFyZSBvZmZzZXQgaW50byB0aGUgZmlsZS4KLSAgIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIERKR1BQIHVzZXMgYSB2ZXJ5IHNwZWNpYWwgd2F5IHRvIGxvYWQgYW5kIHJ1bgotICAgdGhlIGNvZmYgaW1hZ2UuIEl0IGxvYWRzIHRoZSBpbWFnZSBpbiBtZW1vcnkgYW5kIGFzc3VtZXMgdGhlbiwgdGhhdCB0aGUKLSAgIGltYWdlIGhhZCBubyBzdHViIGJ5IHVzaW5nIHRoZSBmaWxlcG9pbnRlcnMgYXMgcG9pbnRlcnMgaW4gdGhlIGNvZmYKLSAgIGltYWdlIGFuZCBOT1QgaW4gdGhlIGZpbGUuCi0KLSAgIFRvIGJlIGNvbXBhdGlibGUgd2l0aCBhbnkgZXhpc3RpbmcgZXhlY3V0YWJsZXMgSSBoYXZlIGZpeGVkIHRoaXMKLSAgIGhlcmUgYW5kIE5PVCBpbiB0aGUgREpHUFAgc3RhcnR1cCBjb2RlLgotICovCi0KLSNkZWZpbmUgVEFSR0VUX1NZTQkJZ28zMnN0dWJiZWRjb2ZmX3ZlYwotI2RlZmluZSBUQVJHRVRfTkFNRQkJImNvZmYtZ28zMi1leGUiCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFCSdfJwotI2RlZmluZSBDT0ZGX0dPMzJfRVhFCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotLyogQXQgZmlyc3QgdGhlIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIHNyYywgUFRSIGRzdCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9maWxlaGRyX291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGV4dCwgUFRSIGluKSk7Ci1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9vdXRfcHJlIFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbiwgUFRSIG91dCkpOwotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGluLCBQVFIgb3V0KSk7Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X2luX3Bvc3QgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGV4dDEsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAotCQkJICAgIGludCBudW1hdXgsIFBUUiBpbjEpKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wcmUgUEFSQU1TICgoYmZkICogYWJmZCwgUFRSIGlucCwgaW50IHR5cGUsIGludCBjbGFzcywgaW50IGluZHgsCi0JCQkgICAgaW50IG51bWF1eCwgUFRSIGV4dHApKTsKLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wb3N0IFBBUkFNUyAoKGJmZCAqIGFiZmQsIFBUUiBpbnAsIGludCB0eXBlLCBpbnQgY2xhc3MsIGludCBpbmR4LAotCQkJICAgICBpbnQgbnVtYXV4LCBQVFIgZXh0cCkpOwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2dvMzJfc3R1YiBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLS8qCi0gICBBbGwgdGhhdCAuLi5fUFJFIGFuZCAuLi5QT1NUIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcKLSAgIGNvZmZfc3dhcC4uLiBmdW5jdGlvbnMuIFRoZSAuLi5QUkUgZnVuY3Rpb25zIGFyZSBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZwotICAgb2YgdGhlIGZ1bmN0aW9uIGFuZCB0aGUgLi4uUE9TVCBmdW5jdGlvbnMgYXQgdGhlIGVuZCBvZiB0aGUgc3dhcCByb3V0aW5lcy4KLSAqLwotCi0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCBhZGp1c3RfZmlsZWhkcl9pbl9wb3N0Ci0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRSBhZGp1c3RfZmlsZWhkcl9vdXRfcHJlCi0jZGVmaW5lIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QgYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QKLQotI2RlZmluZSBDT0ZGX0FESlVTVF9TQ05IRFJfSU5fUE9TVCBhZGp1c3Rfc2NuaGRyX2luX3Bvc3QKLSNkZWZpbmUgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUgYWRqdXN0X3Njbmhkcl9vdXRfcHJlCi0jZGVmaW5lIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVCBhZGp1c3Rfc2NuaGRyX291dF9wb3N0Ci0KLSNkZWZpbmUgQ09GRl9BREpVU1RfQVVYX0lOX1BPU1QgYWRqdXN0X2F1eF9pbl9wb3N0Ci0jZGVmaW5lIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIGFkanVzdF9hdXhfb3V0X3ByZQotI2RlZmluZSBDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QgYWRqdXN0X2F1eF9vdXRfcG9zdAotCi1zdGF0aWMgYm9vbGVhbgotICBnbzMyX3N0dWJiZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqIGliZmQsIGJmZCAqIG9iZmQpKTsKLQotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotCi0jaW5jbHVkZSAiY29mZi1pMzg2LmMiCi0KLS8qIEkgaG9sZCBpbiB0aGUgdXNyZGF0YSB0aGUgc3R1YiAqLwotI2RlZmluZSBiZmRfY29mZl9nbzMyc3R1YiBiZmRfdXNyZGF0YQotCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQsIGJlY2F1c2UgSSBjYW5ub3QgYXNzdW1lIHRoZSBlbmRpYW5lc3Mgb2YgdGhlCi0gICBob3N0IHN5c3RlbSAqLwotI2RlZmluZSBfSChpbmRleCkgKGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikoaGVhZGVyK2luZGV4KjIpKSkKLQotLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIGJmZCBpcyBhIHN0dWJiZWQgY29mZiBpbWFnZSAqLwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotZ28zMl9zdHViYmVkX2NvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciBoZWFkZXJbMTBdOwotICBjaGFyIG1hZ2ljWzhdOwotICB1bnNpZ25lZCBsb25nIGNvZmZfc3RhcnQsIGV4ZV9zdGFydDsKLQotICBpZiAoYmZkX3JlYWQgKCZoZWFkZXIsIDEsIHNpemVvZiAoaGVhZGVyKSwgYWJmZCkgIT0gc2l6ZW9mIChoZWFkZXIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKF9IICgwKSAhPSAweDVhNGQpCQkvKiBpdCBpcyBub3QgYW4gZXhlIGZpbGUuIG1heWJlIGEgY29mZi1pbWFnZSAqLwotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgY29mZl9zdGFydCA9IChsb25nKSBfSCAoMikgKiA1MTJMOwotICBpZiAoX0ggKDEpKQotICAgIGNvZmZfc3RhcnQgKz0gKGxvbmcpIF9IICgxKSAtIDUxMkw7Ci0KLSAgLyogV2UgY2FuIGhhbmRsZSBvbmx5IGEgc3R1YiB3aXRoIGEgbGVuZ3RoIG9mIFNUVUJTSVpFICovCi0gIGlmIChjb2ZmX3N0YXJ0ICE9IFNUVUJTSVpFKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBleGVfc3RhcnQgPSBfSCAoNCkgKiAxNjsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBleGVfc3RhcnQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiAwOwotICBpZiAoYmZkX3JlYWQgKCZtYWdpYywgMSwgOCwgYWJmZCkgIT0gOCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChtZW1jbXAgKG1hZ2ljLCAiZ28zMnN0dWIiLCA4KSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIC8qIENhbGwgdGhlIG5vcm1hbCBDT0ZGIGRldGVjdGlvbiByb3V0aW5lICovCi0gIHJldHVybiBjb2ZmX29iamVjdF9wIChhYmZkKTsKLX0KLQotLyogVGhlc2UgYnl0ZXMgYXJlIGEgMjA0OC1ieXRlIERPUyBleGVjdXRhYmxlLCB3aGljaCBsb2FkcyB0aGUgQ09GRgotICAgaW1hZ2UgaW50byBtZW1vcnkgYW5kIHRoZW4gcnVucyBpdC4gSXQgaXMgY2FsbGVkICdzdHViJyAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzdHViX2J5dGVzW1NUVUJTSVpFXSA9Ci17Ci0jaW5jbHVkZSAiZ28zMnN0dWIuaCIKLX07Ci0KLS8qCi0gICBJIGhhdmUgbm90IGNvbW1lbnRlZCBlYWNoIHN3YXAgZnVuY3Rpb24gYmVsb3csIGJlY2F1c2UgdGhlCi0gICB0ZWNobmlxdWUgaXMgaW4gYW55IGZ1bmN0aW9uIHRoZSBzYW1lLiBGb3IgdGhlIC4uLmluIGZ1bmN0aW9uLAotICAgYWxsIHRoZSBwb2ludGVycyBhcmUgYWRqdXN0ZWQgYnkgYWRkaW5nIFNUVUJTSVpFIGFuZCBmb3IgdGhlCi0gICAuLi5vdXQgZnVuY3Rpb24sIGl0IGlzIHN1YnRyYWN0ZWQgZmlyc3QgYW5kIGFmdGVyIGNhbGxpbmcgdGhlCi0gICBzdGFuZGFyZCBzd2FwIGZ1bmN0aW9uIGl0IGlzIHJlc2V0IHRvIHRoZSBvbGQgdmFsdWUgKi8KLQotLyogVGhpcyBtYWNybyBpcyB1c2VkIGZvciBhZGp1c3RpbmcgdGhlIGZpbGVwb2ludGVycywgd2hpY2gKLSAgIGlzIGRvbmUgb25seSwgaWYgdGhlIHBvaW50ZXIgaXMgbm9uemVybyAqLwotCi0jZGVmaW5lIEFESlVTVF9WQUwodmFsLGRpZmYpIFwKLSAgaWYgKHZhbCAhPSAwKSB2YWwgKz0gZGlmZgotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfaW5fcG9zdCAgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBzcmM7Ci0gICAgIFBUUiBkc3Q7Ci17Ci0gIEZJTEhEUiAqZmlsZWhkcl9zcmMgPSAoRklMSERSICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGRzdDsKLQotICBBREpVU1RfVkFMIChmaWxlaGRyX2RzdC0+Zl9zeW1wdHIsIFNUVUJTSVpFKTsKLQotICAvKiBTYXZlIG5vdyB0aGUgc3R1YiB0byBiZSB1c2VkIGxhdGVyICovCi0gIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgU1RVQlNJWkUpOwotCi0gIC8qIFNpbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBubyBzdGF0dXMsIEkgZG8gbm90IHNldCBoZXJlCi0gICAgIGFueSBiZmRfZXJyb3JfLi4uCi0gICAgIFRoYXQgbWVhbnMsIGJlZm9yZSB0aGUgdXNlIG9mIGJmZF9jb2ZmX2dvMzJzdHViICgpLCB0aGlzIHZhbHVlCi0gICAgIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzICE9IE5VTEwgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIGZpbGVoZHJfc3JjLT5zdHViLCBTVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfZmlsZWhkcl9vdXRfcHJlICAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgaW47Ci0gICAgIFBUUiBvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKSBvdXQ7Ci0KLSAgLyogR2VuZXJhdGUgdGhlIHN0dWIgKi8KLSAgY3JlYXRlX2dvMzJfc3R1YiAoYWJmZCk7Ci0KLSAgLyogQ29weSB0aGUgc3R1YiB0byB0aGUgZmlsZSBoZWFkZXIgKi8KLSAgaWYgKGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSAhPSBOVUxMKQotICAgIG1lbWNweSAoZmlsZWhkcl9vdXQtPnN0dWIsIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSwgU1RVQlNJWkUpOwotICBlbHNlCi0gICAgLyogdXNlIHRoZSBkZWZhdWx0ICovCi0gICAgbWVtY3B5IChmaWxlaGRyX291dC0+c3R1Yiwgc3R1Yl9ieXRlcywgU1RVQlNJWkUpOwotCi0gIEFESlVTVF9WQUwgKGZpbGVoZHJfaW4tPmZfc3ltcHRyLCAtU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2ZpbGVoZHJfb3V0X3Bvc3QgIChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfaW4gPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgaW47Ci0gIC8qIHVuZG8gdGhlIGFib3ZlIGNoYW5nZSAqLwotICBBREpVU1RfVkFMIChmaWxlaGRyX2luLT5mX3N5bXB0ciwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3Njbmhkcl9pbl9wb3N0ICAoYWJmZCwgZXh0LCBpbikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0OwotICAgICBQVFIgaW47Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3NjbnB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX3JlbHB0ciwgU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIFNUVUJTSVpFKTsKLX0KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zY25oZHJfb3V0X3ByZSAgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGluOwotICAgICBQVFIgb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICpzY25oZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaW47Ci0KLSAgQURKVVNUX1ZBTCAoc2NuaGRyX2ludC0+c19zY25wdHIsIC1TVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCAtU1RVQlNJWkUpOwotICBBREpVU1RfVkFMIChzY25oZHJfaW50LT5zX2xubm9wdHIsIC1TVFVCU0laRSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc2NuaGRyX291dF9wb3N0IChhYmZkLCBpbiwgb3V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBpbjsKLSAgICAgUFRSIG91dDsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfc2NucHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfcmVscHRyLCBTVFVCU0laRSk7Ci0gIEFESlVTVF9WQUwgKHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwgU1RVQlNJWkUpOwotfQotCi1zdGF0aWMgdm9pZAotYWRqdXN0X2F1eF9pbl9wb3N0ICAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGNsYXNzOwotICAgICBpbnQgaW5keDsKLSAgICAgaW50IG51bWF1eDsKLSAgICAgUFRSIGluMTsKLXsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikgaW4xOwotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIEFESlVTVF9WQUwgKGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIFNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wcmUgIChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGlucDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBjbGFzczsKLSAgICAgaW50IGluZHg7Ci0gICAgIGludCBudW1hdXg7Ci0gICAgIFBUUiBleHRwOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgLVNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1hZGp1c3RfYXV4X291dF9wb3N0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGlucDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBjbGFzczsKLSAgICAgaW50IGluZHg7Ci0gICAgIGludCBudW1hdXg7Ci0gICAgIFBUUiBleHRwOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKSBpbnA7Ci0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgQURKVVNUX1ZBTCAoaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgU1RVQlNJWkUpOwotICAgIH0KLX0KLQotLyoKLSAgIFRoYXQncyB0aGUgZnVuY3Rpb24sIHdoaWNoIGNyZWF0ZXMgdGhlIHN0dWIuIFRoZXJlIGFyZQotICAgZGlmZmVyZW50IGNhc2VzIGZyb20gd2hlcmUgdGhlIHN0dWIgaXMgdGFrZW4uCi0gICBBdCBmaXJzdCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChHTzMyU1RVQikgaXMgY2hlY2tlZCBhbmQgdGhlbgotICAgJChTVFVCKSBpZiBpdCB3YXMgbm90IHNldC4KLSAgIElmIGl0IGV4aXN0cyBhbmQgcG9pbnRzIHRvIGEgdmFsaWQgc3R1YiB0aGUgc3R1YiBpcyB0YWtlbiBmcm9tCi0gICB0aGF0IGZpbGUuIFRoaXMgZmlsZSBjYW4gYmUgYWxzbyBhIHdob2xlIGV4ZWN1dGFibGUgZmlsZSwgYmVjYXVzZQotICAgdGhlIHN0dWIgaXMgY29tcHV0ZWQgZnJvbSB0aGUgZXhlIGluZm9ybWF0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGF0Ci0gICBmaWxlLgotCi0gICBJZiB0aGVyZSB3YXMgYW55IGVycm9yLCB0aGUgc3RhbmRhcmQgc3R1YiAoY29tcGlsZWQgaW4gdGhpcyBmaWxlKQotICAgaXMgdGFrZW4uCi0gKi8KLQotc3RhdGljIHZvaWQKLWNyZWF0ZV9nbzMyX3N0dWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogRG8gaXQgb25seSBvbmNlICovCi0gIGlmIChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzdHViOwotICAgICAgc3RydWN0IHN0YXQgc3Q7Ci0gICAgICBpbnQgZjsKLSAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyWzEwXTsKLSAgICAgIGNoYXIgbWFnaWNbOF07Ci0gICAgICB1bnNpZ25lZCBsb25nIGNvZmZfc3RhcnQsIGV4ZV9zdGFydDsKLQotICAgICAgLyogQ2hlY2sgYXQgZmlyc3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICQoR08zMlNUVUIpICovCi0gICAgICBzdHViID0gZ2V0ZW52ICgiR08zMlNUVUIiKTsKLSAgICAgIC8qIE5vdyBjaGVjayB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJChTVFVCKSAqLwotICAgICAgaWYgKHN0dWIgPT0gTlVMTCkKLQlzdHViID0gZ2V0ZW52ICgiU1RVQiIpOwotICAgICAgaWYgKHN0dWIgPT0gTlVMTCkKLQlnb3RvIHN0dWJfZW5kOwotICAgICAgaWYgKHN0YXQgKHN0dWIsICZzdCkgIT0gMCkKLQlnb3RvIHN0dWJfZW5kOwotI2lmZGVmIE9fQklOQVJZCi0gICAgICBmID0gb3BlbiAoc3R1YiwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0jZWxzZQotICAgICAgZiA9IG9wZW4gKHN0dWIsIE9fUkRPTkxZKTsKLSNlbmRpZgotICAgICAgaWYgKGYgPCAwKQotCWdvdG8gc3R1Yl9lbmQ7Ci0gICAgICBpZiAocmVhZCAoZiwgJmhlYWRlciwgc2l6ZW9mIChoZWFkZXIpKSA8IDApCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAoX0ggKDApICE9IDB4NWE0ZCkJLyogaXQgaXMgbm90IGFuIGV4ZSBmaWxlICovCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBzdHViIChpdCBpcyBldmVyeSB0aGluZyB1cAotICAgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29mZiBpbWFnZSkgKi8KLSAgICAgIGNvZmZfc3RhcnQgPSAobG9uZykgX0ggKDIpICogNTEyTDsKLSAgICAgIGlmIChfSCAoMSkpCi0JY29mZl9zdGFydCArPSAobG9uZykgX0ggKDEpIC0gNTEyTDsKLQotICAgICAgLyogQ3VycmVudGx5IHRoZXJlIGlzIG9ubHkgYSBmaXhlZCBzdHViIHNpemUgb2YgMjA0OCBieXRlcwotICAgICAgICAgc3VwcG9ydGVkICovCi0gICAgICBpZiAoY29mZl9zdGFydCAhPSAyMDQ4KQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgZXhlX3N0YXJ0ID0gX0ggKDQpICogMTY7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGxzZWVrIChmLCBleGVfc3RhcnQsIFNFRUtfU0VUKSAhPSBleGVfc3RhcnQpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICBpZiAocmVhZCAoZiwgJm1hZ2ljLCA4KSAhPSA4KQotCXsKLQkgIGNsb3NlIChmKTsKLQkgIGdvdG8gc3R1Yl9lbmQ7Ci0JfQotICAgICAgaWYgKG1lbWNtcCAobWFnaWMsICJnbzMyc3R1YiIsIDgpICE9IDApCi0JewotCSAgY2xvc2UgKGYpOwotCSAgZ290byBzdHViX2VuZDsKLQl9Ci0gICAgICAvKiBOb3cgd2UgZm91bmQgYSBjb3JyZWN0IHN0dWIgKGhvcGVmdWxseSkgKi8KLSAgICAgIGJmZF9jb2ZmX2dvMzJzdHViIChhYmZkKSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgY29mZl9zdGFydCk7Ci0gICAgICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0JewotCSAgY2xvc2UgKGYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxzZWVrIChmLCAwTCwgU0VFS19TRVQpOwotICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSByZWFkIChmLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIGNvZmZfc3RhcnQpCi0JICAhPSBjb2ZmX3N0YXJ0KQotCXsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCkpOwotCSAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gTlVMTDsKLQl9Ci0gICAgICBjbG9zZSAoZik7Ci0gICAgfQotc3R1Yl9lbmQ6Ci0gIC8qIFRoZXJlIHdhcyBzb21ldGhpbmcgd3JvbmcgYWJvdmUsIHNvIHVzZSBub3cgdGhlIHN0YW5kYXJkIGJ1aWx0aW4KLSAgICAgc3R1YiAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBTVFVCU0laRSk7Ci0gICAgICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGFiZmQpID09IE5VTEwpCi0JewotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbWVtY3B5IChiZmRfY29mZl9nbzMyc3R1YiAoYWJmZCksIHN0dWJfYnl0ZXMsIFNUVUJTSVpFKTsKLSAgICB9Ci19Ci0KLS8qIElmIGliZmQgd2FzIGEgc3R1YmJlZCBjb2ZmIGltYWdlLCBjb3B5IHRoZSBzdHViIGZyb20gdGhhdCBiZmQKLSAgIHRvIHRoZSBuZXcgb2JmZC4KLSAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ28zMl9zdHViYmVkX2NvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICAvKiBjaGVjayBpZiBib3RoIGFyZSB0aGUgc2FtZSB0YXJnZXRzICovCi0gIGlmIChpYmZkLT54dmVjICE9IG9iZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogY2hlY2sgaWYgYm90aCBoYXZlIGEgdmFsaWQgc3R1YiAqLwotICBpZiAoYmZkX2NvZmZfZ28zMnN0dWIgKGliZmQpID09IE5VTEwKLSAgICAgIHx8IGJmZF9jb2ZmX2dvMzJzdHViIChvYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE5vdyBjb3B5IHRoZSBzdHViICovCi0gIG1lbWNweSAoYmZkX2NvZmZfZ28zMnN0dWIgKG9iZmQpLCBiZmRfY29mZl9nbzMyc3R1YiAoaWJmZCksIFNUVUJTSVpFKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXN2bTY4ay5jIGIvYmZkL2NvZmYtc3ZtNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmE1YTcuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmYtc3ZtNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE1vdG9yb2xhIHN5c3Y2OAotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBoaWxpcHBlIERlIE11eXRlciA8cGhkbUBpbmZvLnVjbC5hYy5iZT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCW02OGtzeXN2Y29mZl92ZWMKLSNkZWZpbmUgVEFSR0VUX05BTUUJImNvZmYtbTY4ay1zeXN2IgotI2RlZmluZSBTVEFUSUNfUkVMT0NTCi0jZGVmaW5lIENPRkZfQ09NTU9OX0FEREVORAotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi10aWMzMC5jIGIvYmZkL2NvZmYtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmOGM1OS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgVE1TMzIwQzMwIGNvZmYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBTdGV2ZW4gSGF3b3J0aCAoc3RldmVAcG0uY3NlLnJtaXQuZWR1LmF1KQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImNvZmYvdGljMzAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLQotcmVsb2NfaG93dG9fdHlwZSB0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9USUMzMF9BQlMxNiwgMiwgMSwgMTYsIGZhbHNlLCAwLCAwLCBOVUxMLAotCSAiMTYiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9BQlMyNCwgMiwgMiwgMjQsIGZhbHNlLCA4LCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIjI0IiwgZmFsc2UsIDB4RkZGRkZGMDAsIDB4RkZGRkZGMDAsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVElDMzBfTERQLCAxOCwgMCwgMjQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgTlVMTCwKLQkgIkxEUCIsIGZhbHNlLCAweDAwRkYwMDAwLCAweDAwMDAwMEZGLCBmYWxzZSksCi0gIEhPV1RPIChSX1RJQzMwX0FCUzMyLCAyLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBOVUxMLAotCSAiMzIiLCBmYWxzZSwgMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiwgZmFsc2UpLAotICBIT1dUTyAoUl9USUMzMF9QQzE2LCAyLCAxLCAxNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBOVUxMLAotCSAiUENSRUwiLCBmYWxzZSwgMHgwMDAwRkZGRiwgMHgwMDAwRkZGRiwgZmFsc2UpLAotICB7LTF9Ci19OwotCi0jaWZuZGVmIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGNvZmZfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHRpYzMwX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAKLQotLyogRm9yIHRoZSBjYXNlIHN0YXRlbWVudCB1c2UgdGhlIGNvZGUgdmFsdWVzIHVzZWQgaW4gdGNfZ2VuX3JlbG9jIHRvCi0gICBtYXAgdG8gdGhlIGhvd3RvIHRhYmxlIGVudHJpZXMgdGhhdCBtYXRjaCB0aG9zZSBpbiBib3RoIHRoZSBhb3V0Ci0gICBhbmQgY29mZiBpbXBsZW1lbnRhdGlvbnMuICovCi1yZWxvY19ob3d0b190eXBlICoKLXRpYzMwX2NvZmZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICBjYXNlIEJGRF9SRUxPQ19USUMzMF9MRFA6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMl07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjQ6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMV07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbNF07Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbM107Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLXN0YXRpYyBpbnQKLWNvZmZfdGljMzBfc2VsZWN0X3JlbG9jIChob3d0bykKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci17Ci0gIHJldHVybiBob3d0by0+dHlwZTsKLX0KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeC5yX3R5cGUgPSBjb2ZmX3RpYzMwX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBUSUMzMEJBRE1BRyh4KQotI2RlZmluZSBUSUMzMCAxCQkJLyogQ3VzdG9taXplIGNvZmZjb2RlLmggKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgIGJmZF9oX2dldF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19PRkZTRVQgYmZkX2hfcHV0XzMyCi0jZGVmaW5lIFNXQVBfT1VUX1JFTE9DX0VYVFJBKGFiZmQsIHNyYywgZHN0KSBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLWRzdC0+cl9zdHVmZlsxXSA9ICdDJzsKLQotLyogQ29kZSB0byB0dXJuIGEgcl90eXBlIGludG8gYSBob3d0byBwdHIsIHVzZXMgdGhlIGFib3ZlIGhvd3RvIHRhYmxlLiAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGludGVybmFsLCBkc3QpCi0gICAgIGFyZWxlbnQgKmludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1RJQzMwX0FCUzE2OgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnRpYzMwX2NvZmZfaG93dG9fdGFibGVbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVElDMzBfQUJTMjQ6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9USUMzMF9BQlMzMjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzNdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX0xEUDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZ0aWMzMF9jb2ZmX2hvd3RvX3RhYmxlWzJdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1RJQzMwX1BDMTY6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmdGljMzBfY29mZl9ob3d0b190YWJsZVs0XTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhpbnRlcm5hbCwgcmVsb2NlbnRyeSkgcnR5cGUyaG93dG8oaW50ZXJuYWwscmVsb2NlbnRyeSkKLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKLSBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQKLXJlbG9jX3Byb2Nlc3NpbmcgKHJlbGVudCwgcmVsb2MsIHN5bWJvbHMsIGFiZmQsIHNlY3Rpb24pCi0gICAgIGFyZWxlbnQgKnJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKHJlbG9jLT5yX3N5bW5keCA+IDApCi0gICAgewotICAgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHN5bWJvbHMgKyBvYmpfY29udmVydCAoYWJmZClbcmVsb2MtPnJfc3ltbmR4XTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgfQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLX0KLQotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgdGljMzBfY29mZl92ZWMgPQotewotICAiY29mZi10aWMzMCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgJ18nLAkJCQkvKiBsZWFkaW5nIHN5bWJvbCB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgY29mZl9vYmplY3RfcCwJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgYmZkX2dlbmVyaWNfYXJjaGl2ZV9wLCBfYmZkX2R1bW15X3RhcmdldH0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi10aWM4MC5jIGIvYmZkL2NvZmYtdGljODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzYzhhMC4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi10aWM4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzgwIE11bHRpbWVkaWEgVmlkZW8gUHJvY2Vzc29yIChNVlApLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIChmbmZAY3lnbnVzLmNvbSkKLQotICAgVGhlcmUgaXMgbm90aGluZyBuZXcgdW5kZXIgdGhlIHN1bi4gVGhpcyBmaWxlIGRyYXdzIGEgbG90IG9uIG90aGVyCi0gICBjb2ZmIGZpbGVzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvdGljODAuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMikKLSNkZWZpbmUgQ09GRl9BTElHTl9JTl9TRUNUSU9OX0hFQURFUiAxCi0jZGVmaW5lIENPRkZfQUxJR05fSU5fU0ZMQUdTIDEKLQotI2RlZmluZSBHRVRfU0NOSERSX0ZMQUdTIGJmZF9oX2dldF8xNgotI2RlZmluZSBQVVRfU0NOSERSX0ZMQUdTIGJmZF9oX3B1dF8xNgotCi1zdGF0aWMgdm9pZCBydHlwZTJob3d0bwotICBQQVJBTVMgKChhcmVsZW50ICpjYWNoZV9wdHIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwYmFzZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZ2xvYjE1X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBnbG9iMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGxvY2FsMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3RpYzgwX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICosIGFzZWN0aW9uICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHRpYzgwX2hvd3RvX3RhYmxlW10gPQotewotCi0gIEhPV1RPIChSX1JFTExPTkcsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUxMT05HIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01QUENSLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTVBQQ1IiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQUJTLAkJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkFCUyIsCQkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQQkFTRSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBiYXNlX3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQQkFTRSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExCQVNFLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGJhc2VfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMQkFTRSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNSIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUDE1VywJCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQMTVILAkJCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFAxNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFAxNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUDE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNSwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTDE1VywJCQkvKiB0eXBlICovCi0JIDIsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMMTVXIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUEwxNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTDE1SCIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMMTZCLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTDE2QiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTUsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTUiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MWZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgxZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBOMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZ2xvYjE1X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTjE1VyIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZjMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmMwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUE4xNUgsCQkJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBnbG9iMTVfcmVsb2MsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBOMTVIIiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDFmZmMwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmYzAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTjE2QiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGdsb2IxNl9yZWxvYywJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJQUE4xNkIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmYzAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZjMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE1LAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1IiwJCQkvKiBuYW1lICovCi0JIHRydWUsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9QUExOMTVXLAkJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAtMiwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE1LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwJCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUFBMTjE1VyIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHg3ZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfUFBMTjE1SCwJCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgLTIsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNSwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTE4xNUgiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2ZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX1BQTE4xNkIsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIC0yLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBsb2NhbDE2X3JlbG9jLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlBQTE4xNkIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpCQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQwKLS8qIFNwZWNpYWwgcmVsb2NhdGlvbiBmdW5jdGlvbnMsIHVzZWQgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaXMgbm90Ci0gICBpdHNlbGYgYSBDT0ZGIFRJYzgwIGZpbGUuICAqLwotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGJhc2UgYWRkcmVzcyB0eXBlCi0gICByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXBwYmFzZV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQotLyogVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHRoZSBnbG9iYWwgMTUgYml0IHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ2xvYjE1X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBGSVhNRS4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIHNwZWNpYWwgZnVuY3Rpb24gaXMgdXNlZCBmb3IgdGhlIGdsb2JhbCAxNiBiaXQgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1nbG9iMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgbG9jYWwgMTYgYml0IHJlbG9jYXRpb25zLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbG9jYWwxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwKLQkgICAgICBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogRklYTUUuICAqLwotICBhYm9ydCAoKTsKLX0KLQwKLS8qIENvZGUgdG8gdHVybiBhbiBleHRlcm5hbCByX3R5cGUgaW50byBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIGhvd3RvX3RhYmxlLgotICAgSWYgcGFzc2VkIGFuIHJfdHlwZSB3ZSBkb24ndCByZWNvZ25pemUgdGhlIGFib3J0IHJhdGhlciB0aGFuIHNpbGVudGx5IGZhaWxpbmcKLSAgIHRvIGdlbmVyYXRlIGFuIG91dHB1dCBmaWxlLiAqLwotCi1zdGF0aWMgdm9pZAotcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRpYzgwX2hvd3RvX3RhYmxlIC8gc2l6ZW9mIHRpYzgwX2hvd3RvX3RhYmxlWzBdOyBpKyspCi0gICAgewotICAgICAgaWYgKHRpYzgwX2hvd3RvX3RhYmxlW2ldLnR5cGUgPT0gZHN0LT5yX3R5cGUpCi0JewotCSAgY2FjaGVfcHRyLT5ob3d0byA9IHRpYzgwX2hvd3RvX3RhYmxlICsgaTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5yZWNvZ25pemVkIHJlbG9jIHR5cGUgMHgleCIpLAotCQkJICh1bnNpZ25lZCBpbnQpIGRzdC0+cl90eXBlKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9IHRpYzgwX2hvd3RvX3RhYmxlICsgMDsKLX0KLQotI2RlZmluZSBSVFlQRTJIT1dUTyhjYWNoZV9wdHIsIGRzdCkgcnR5cGUyaG93dG8gKGNhY2hlX3B0ciwgZHN0KQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIGNvZmZfdGljODBfcnR5cGVfdG9faG93dG8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotY29mZl90aWM4MF9ydHlwZV90b19ob3d0byAoYWJmZCwgc2VjLCByZWwsIGgsIHN5bSwgYWRkZW5kcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgIGJmZF92bWEgKmFkZGVuZHA7Ci17Ci0gIGFyZWxlbnQgZ2VucmVsOwotCi0gIGlmIChyZWwgLT4gcl9zeW1uZHggPT0gLTEgJiYgYWRkZW5kcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBUSSAiaW50ZXJuYWwgcmVsb2NhdGlvbiIsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHJlbG9jYXRpb24KLQkgYW1vdW50IGlzIHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGN1cnJlbnQgc2VjdGlvbiBpcyBiZWluZyByZWxvY2F0ZWQKLQkgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAqLwotICAgICAgKmFkZGVuZHAgPSAoc2VjIC0+IG91dHB1dF9zZWN0aW9uIC0+IHZtYSArIHNlYyAtPiBvdXRwdXRfb2Zmc2V0KSAtIHNlYyAtPiB2bWE7Ci0gICAgfQotICBSVFlQRTJIT1dUTyAoJmdlbnJlbCwgcmVsKTsKLSAgcmV0dXJuIGdlbnJlbC5ob3d0bzsKLX0KLQotI2lmbmRlZiBCQURNQUcKLSNkZWZpbmUgQkFETUFHKHgpIFRJQzgwQkFETUFHKHgpCi0jZW5kaWYKLQwKLSNkZWZpbmUgY29mZl9yZWxvY2F0ZV9zZWN0aW9uIGNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbgotCi0vKiBXZSBuZWVkIGEgc3BlY2lhbCByZWxvY2F0aW9uIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSBQUCByZWxvY3MuICBNb3N0Ci0gICBvZiB0aGlzIGlzIGEgY29weSBvZiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfdGljODBfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJICAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfdm1hIGFkZHI7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICAvKiBDT0ZGIHRyZWF0cyBjb21tb24gc3ltYm9scyBpbiBvbmUgb2YgdHdvIHdheXMuICBFaXRoZXIgdGhlCi0gICAgICAgICBzaXplIG9mIHRoZSBzeW1ib2wgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIG9yIGl0Ci0gICAgICAgICBpcyBub3QuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBpcyBub3QgaW5jbHVkZWQsIGFuZCBmb3JjZQotICAgICAgICAgdGhlIHJ0eXBlX3RvX2hvd3RvIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgYWRkZW5kIGFzIG5lZWRlZC4gICovCi0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0gICAgICBob3d0byA9IGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbCwgaCwKLQkJCQkgICAgICAgc3ltLCAmYWRkZW5kKTsKLSAgICAgIGlmIChob3d0byA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZSk7Ci0JICAgICAgaWYgKCEgb2JqX3BlIChvdXRwdXRfYmZkKSkKLQkJdmFsIC09IHNlYy0+dm1hOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgIGVsc2UgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGFkZHIgPSByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIC8qIEZJWE1FOiBUaGlzIGNvZGUgYXNzdW1lcyBsaXR0bGUgZW5kaWFuLCBidXQgdGhlIFBQIGNhbgotICAgICAgICAgYXBwYXJlbnRseSBiZSBiaS1lbmRpYW4uICBJIGRvbid0IGtub3cgaWYgdGhlIGJpLWVuZGlhbm5lc3MKLSAgICAgICAgIGFwcGxpZXMgdG8gdGhlIGluc3RydWN0aW9uIHNldCBvciBqdXN0IHRvIHRoZSBkYXRhLiAgKi8KLSAgICAgIHN3aXRjaCAoaG93dG8tPnR5cGUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBSX0FCUzoKLQljYXNlIFJfUkVMTE9OR1g6Ci0JY2FzZSBSX1BQTDE1OgotCWNhc2UgUl9QUEwxNVc6Ci0JY2FzZSBSX1BQTDE1SDoKLQljYXNlIFJfUFBMTjE1OgotCWNhc2UgUl9QUExOMTVXOgotCWNhc2UgUl9QUExOMTVIOgotCSAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywgYWRkciwgdmFsLCBhZGRlbmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFAxNToKLQljYXNlIFJfUFAxNVc6Ci0JY2FzZSBSX1BQMTVIOgotCWNhc2UgUl9QUE4xNToKLQljYXNlIFJfUFBOMTVXOgotCWNhc2UgUl9QUE4xNUg6Ci0JICAvKiBPZmZzZXQgdGhlIGFkZHJlc3Mgc28gdGhhdCB3ZSBjYW4gdXNlIDQgYnl0ZSByZWxvY2F0aW9ucy4gICovCi0JICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzICsgMiwgYWRkciwgdmFsLCBhZGRlbmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFAxNkI6Ci0JY2FzZSBSX1BQTjE2QjoKLQkgIHsKLQkgICAgLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHN0b3JlZCBpbiBiaXQgNi4gICovCi0JICAgIGJmZF9ieXRlIGhvbGQ7Ci0KLQkgICAgaG9sZCA9IGNvbnRlbnRzW2FkZHIgKyA0XTsKLQkgICAgY29udGVudHNbYWRkciArIDRdICY9fiAweDIwOwotCSAgICBjb250ZW50c1thZGRyICsgNF0gfD0gKGNvbnRlbnRzW2FkZHJdID4+IDEpICYgMHgyMDsKLQkgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzICsgMiwgYWRkciwKLQkJCQkJICAgICAgdmFsLCBhZGRlbmQpOwotCSAgICBjb250ZW50c1thZGRyXSAmPX4gMHg0MDsKLQkgICAgY29udGVudHNbYWRkcl0gfD0gKGNvbnRlbnRzW2FkZHIgKyA0XSA8PCAxKSAmIDB4NDA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyA0XSAmPX4gMHgyMDsKLQkgICAgY29udGVudHNbYWRkciArIDRdIHw9IGhvbGQgJiAweDIwOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgUl9QUEwxNkI6Ci0JY2FzZSBSX1BQTE4xNkI6Ci0JICB7Ci0JICAgIC8qIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyBzdG9yZWQgaW4gYml0IDI4LiAgKi8KLQkgICAgYmZkX2J5dGUgaG9sZDsKLQotCSAgICBob2xkID0gY29udGVudHNbYWRkciArIDFdOwotCSAgICBjb250ZW50c1thZGRyICsgMV0gJj1+IDB4ODA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSB8PSAoY29udGVudHNbYWRkciArIDNdIDw8IDMpICYgMHg4MDsKLQkgICAgcnN0YXQgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzLCBhZGRyLAotCQkJCQkgICAgICB2YWwsIGFkZGVuZCk7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAzXSAmPSB+MHgxMDsKLQkgICAgY29udGVudHNbYWRkciArIDNdIHw9IChjb250ZW50c1thZGRyICsgMV0gPj4gMykgJiAweDEwOwotCSAgICBjb250ZW50c1thZGRyICsgMV0gJj1+IDB4ODA7Ci0JICAgIGNvbnRlbnRzW2FkZHIgKyAxXSB8PSBob2xkICYgMHg4MDsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JCi0JY2FzZSBSX1BQQkFTRToKLQkgIC8qIFBhcmFtZXRlciBSQU0gaXMgZnJvbSAweDEwMDAwMDAgdG8gMHgxMDAwODAwLiAgKi8KLQkgIGNvbnRlbnRzW2FkZHJdICY9fiAweDM7Ci0JICBpZiAodmFsID49IDB4MTAwMDAwMCAmJiB2YWwgPCAweDEwMDA4MDApCi0JICAgIGNvbnRlbnRzW2FkZHJdIHw9IDB4MzsKLQkgIGVsc2UKLQkgICAgY29udGVudHNbYWRkcl0gfD0gMHgyOwotCSAgcnN0YXQgPSBiZmRfcmVsb2Nfb2s7Ci0JICBicmVhazsKLQotCWNhc2UgUl9QUExCQVNFOgotCSAgLyogUGFyYW1ldGVyIFJBTSBpcyBmcm9tIDB4MTAwMDAwMCB0byAweDEwMDA4MDAuICAqLwotCSAgY29udGVudHNbYWRkciArIDJdICY9IH4weGMwOwotCSAgaWYgKHZhbCA+PSAweDEwMDAwMDAgJiYgdmFsIDwgMHgxMDAwODAwKQotCSAgICBjb250ZW50c1thZGRyICsgMl0gfD0gMHhjMDsKLQkgIGVsc2UKLQkgICAgY29udGVudHNbYWRkciArIDJdIHw9IDB4ODA7Ci0JICByc3RhdCA9IGJmZF9yZWxvY19vazsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGJhZCByZWxvYyBhZGRyZXNzIDB4JWx4IGluIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICAgICh1bnNpZ25lZCBsb25nKSByZWwtPnJfdmFkZHIsCi0JICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsIGlucHV0X2JmZCwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl92YWRkciAtIGlucHV0X3NlY3Rpb24tPnZtYSkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNkZWZpbmUgVElDODBDT0ZGIDEJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jdW5kZWYgQ19BVVRPQVJHCQkvKiBDbGFzaGVzIHdpdGggVEljODAncyBDX1VFWFQgKi8KLSN1bmRlZiBDX0xBU1RFTlQJCS8qIENsYXNoZXMgd2l0aCBUSWM4MCdzIENfU1RBVExBQiAqLwotI2luY2x1ZGUgImNvZmZjb2RlLmgiCi0KLWNvbnN0IGJmZF90YXJnZXQgCi0gIHRpYzgwY29mZl92ZWMgPQotewotICAiY29mZi10aWM4MCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgbGl0dGxlIChhcmNoIHN1cHBvcnRzIGJvdGgpICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICdfJywJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotCi0ge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLCAvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSB7YmZkX2ZhbHNlLCBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBDT0ZGX1NXQVBfVEFCTEUKLSB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NvZmYtdTY4ay5jIGIvYmZkL2NvZmYtdTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2VhNzNmLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXU2OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgNjgwMDAgQ09GRiBiaW5hcmllcyBoYXZpbmcgdW5kZXJzY29yZSB3aXRoIG5hbWUuCi0gICBDb3B5cmlnaHQgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfU1lNCW02OGtjb2ZmdW5fdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FCSJjb2ZmLW02OGstdW4iCi0KLSNkZWZpbmUgTkFNRVNfSEFWRV9VTkRFUlNDT1JFCi0KLS8qIGRlZmluZSB0aGlzIHRvIG5vdCBoYXZlIG11bHRpcGxlIGNvcHkgb2YgbTY4a19ydHlwZTJob3d0bwotICAgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZSAqLwotI2RlZmluZSBPTkxZX0RFQ0xBUkVfUkVMT0NTCi0KLS8qIFRoaXMgbWFnaWMgbnVtYmVyIGluZGljYXRlcyB0aGF0IHRoZSBuYW1lcyBoYXZlIHVuZGVyc2NvcmVzLgotICAgT3RoZXIgNjhrIG1hZ2ljIG51bWJlcnMgaW5kaWNhdGUgdGhhdCB0aGUgbmFtZXMgZG8gbm90IGhhdmUKLSAgIHVuZGVyc2NvcmVzLiAgKi8KLSNkZWZpbmUgQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBNQzY4S0JDU01BR0lDKQotCi0jaW5jbHVkZSAiY29mZi1tNjhrLmMiCmRpZmYgLS1naXQgYS9iZmQvY29mZi13NjUuYyBiL2JmZC9jb2ZmLXc2NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGQ2OGMzLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgV0RDIDY1ODE2IENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluLCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiY29mZi93NjUuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMSkKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9XNjVfQUJTOCwgICAgMCwgIDAsIDgsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9BQlMxNiwgICAxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMjQsICAgMCwgIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJhYnMyNCIsIHRydWUsIDB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzhTOCwgIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICI+YWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzhTMTYsIDAsICAwLCA4LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJeYWJzOCIsIHRydWUsIDB4MDAwMDAwZmYsIDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfVzY1X0FCUzE2UzgsIDEsICAwLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiPmFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9XNjVfQUJTMTZTMTYsMSwgIDAsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJeYWJzMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPIChSX1c2NV9QQ1I4LCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicGNyZWw4IiwgdHJ1ZSwgMHgwMDAwMDBmZiwgMHgwMDAwMDBmZiwgdHJ1ZSksCi0gIEhPV1RPIChSX1c2NV9QQ1IxNiwgICAxLCAgMCwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInBjcmVsMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8gKFJfVzY1X0RQLCAgICAwLCAgMCwgOCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiZHAiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLCBmYWxzZSksCi0KLX07Ci0KLQotLyogVHVybiBhIGhvd3RvIGludG8gYSByZWxvYyBudW1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgXAotICB7IHgucl90eXBlID0gc2VsZWN0X3JlbG9jKGhvd3RvKTsgfQotCi0jZGVmaW5lIEJBRE1BRyh4KSAoVzY1QkFETUFHKHgpKQotI2RlZmluZSBXNjUgMQkJCS8qIEN1c3RvbWl6ZSBjb2ZmY29kZS5oICovCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0KLXN0YXRpYyBpbnQKLXNlbGVjdF9yZWxvYyAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICByZXR1cm4gaG93dG8tPnR5cGUgOwotfQotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqaW50ZXJuYWw7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqZHN0OwotewotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gaG93dG9fdGFibGUgKyBkc3QtPnJfdHlwZSAtIDE7Ci19Ci0KLSNkZWZpbmUgUlRZUEUySE9XVE8oaW50ZXJuYWwsIHJlbG9jZW50cnkpIHJ0eXBlMmhvd3RvKGludGVybmFsLHJlbG9jZW50cnkpCi0KLQotLyogUGVyZm9ybSBhbnkgbmVjZXNzYXJ5IG1hZ2ljIHRvIHRoZSBhZGRlbmQgaW4gYSByZWxvYyBlbnRyeSAqLwotCi0KLSNkZWZpbmUgQ0FMQ19BRERFTkQoYWJmZCwgc3ltYm9sLCBleHRfcmVsb2MsIGNhY2hlX3B0cikgXAotIGNhY2hlX3B0ci0+YWRkZW5kID0gIGV4dF9yZWxvYy5yX29mZnNldDsKLQotCi0jZGVmaW5lIFJFTE9DX1BST0NFU1NJTkcocmVsZW50LHJlbG9jLHN5bWJvbHMsYWJmZCxzZWN0aW9uKSBcCi0gcmVsb2NfcHJvY2Vzc2luZyhyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotCi1zdGF0aWMgdm9pZAotcmVsb2NfcHJvY2Vzc2luZyAocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLSAgICAgYXJlbGVudCAqIHJlbGVudDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIHJlbGVudC0+YWRkcmVzcyA9IHJlbG9jLT5yX3ZhZGRyOwotICBydHlwZTJob3d0byAocmVsZW50LCByZWxvYyk7Ci0KLSAgaWYgKCgoaW50KSByZWxvYy0+cl9zeW1uZHgpID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikmKGJmZF9hYnNfc3ltYm9sKTsKLSAgICB9Ci0KLQotCi0gIHJlbGVudC0+YWRkZW5kID0gcmVsb2MtPnJfb2Zmc2V0OwotCi0gIHJlbGVudC0+YWRkcmVzcyAtPSBzZWN0aW9uLT52bWE7Ci0gIC8qICByZWxlbnQtPnNlY3Rpb24gPSAwOyovCi19Ci0KLQotc3RhdGljIGludAotaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZShhYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBiZmRfdm1hIHZhbHVlOyAgCi0gIGJmZF92bWEgZG90OwotICBiZmRfdm1hIGdhcDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgdGhpbmcgdG8gYmUgcmVsb2NhdGVkIHdpbGwgaGF2ZSBtb3ZlZCBiYWNrIGJ5IAotICAgdGhlIHNpemUgb2YgdGhlIHNocmluayAgLSBidXQgd2UgZG9uJ3QgY2hhbmdlIHJlbG9jLT5hZGRyZXNzIGhlcmUsCi0gICBzaW5jZSB3ZSBuZWVkIGl0IHRvIGtub3cgd2hlcmUgdGhlIHJlbG9jYXRpb24gbGl2ZXMgaW4gdGhlIHNvdXJjZQotICAgdW5jb29rZWQgc2VjdGlvbiAqLwotCi0gIC8qICByZWxvYy0+YWRkcmVzcyAtPSBzaHJpbms7ICAgY29uY2VwdHVhbCAqLwotCi0gIGJmZF92bWEgYWRkcmVzcyA9IHJlbG9jLT5hZGRyZXNzIC0gc2hyaW5rOwotICAKLQotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7ICAgICAKLSAgICBjYXNlIFJfTU9WMTZCMjoKLSAgICBjYXNlIFJfSk1QMjoKLSAgICAgIHNocmluays9MjsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBUaGluZyBpcyBhIG1vdmUgb25lIGJ5dGUgKi8KLSAgICBjYXNlIFJfTU9WMTZCMToKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0KLSAgICAgIGlmICh2YWx1ZSA+PSAweGZmMDApCi0JeyAKLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMTZiaXQsIHBvc3NpYmxlIDggdG8gOGJpdAotCSAgICAgcG9zc2libGUgMTYgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0JICAvKiBUaGUgcGxhY2UgdG8gcmVsYyBtb3ZlcyBiYWNrIGJ5IG9uZSAqLwotCSAgLyogVGhpcyB3aWxsIGJlIHR3byBieXRlcyBzbWFsbGVyIGluIHRoZSBsb25nIHJ1biAqLwotCSAgc2hyaW5rICs9MiA7Ci0JICBiZmRfcGVyZm9ybV9zbGlwKGFiZmQsIDIsIGlucHV0X3NlY3Rpb24sIGFkZHJlc3MpOwotCX0gICAgICAKLQotICAgICAgYnJlYWs7Ci0gICAgICAvKiBUaGlzIGlzIHRoZSAyNCBiaXQgYnJhbmNoIHdoaWNoIGNvdWxkIGJlY29tZSBhbiA4IGJpdHRlciwgCi0gICAgICAgdGhlIHJlbG9jYXRpb24gcG9pbnRzIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBpbnNuLCBub3QgdGhlCi0gICAgICAgYWN0dWFsIGRhdGEgKi8KLQotICAgIGNhc2UgUl9KTVBMMToKLSAgICAgIHZhbHVlID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbik7Ci0JCi0gICAgICBkb3QgPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsgYWRkcmVzczsKLSAgCi0gICAgICAvKiBTZWUgaWYgdGhlIGFkZHJlc3Mgd2UncmUgbG9va2luZyBhdCB3aXRoaW4gMTI3IGJ5dGVzIG9mIHdoZXJlCi0JIHdlIGFyZSwgaWYgc28gdGhlbiB3ZSBjYW4gdXNlIGEgc21hbGwgYnJhbmNoIHJhdGhlciB0aGFuIHRoZQotCSBqdW1wIHdlIHdlcmUgZ29pbmcgdG8gKi8KLQotICAgICAgZ2FwID0gdmFsdWUgLSBkb3QgOwotICAKLSAgICAgIGlmICgtMTIwIDwgKGxvbmcpZ2FwICYmIChsb25nKWdhcCA8IDEyMCApCi0JeyAKLQotCSAgLyogQ2hhbmdlIHRoZSByZWxvYyB0eXBlIGZyb20gMjRiaXQsIHBvc3NpYmxlIDggdG8gOGJpdAotCSAgICAgcG9zc2libGUgMzIgKi8KLQkgIHJlbG9jLT5ob3d0byA9IHJlbG9jLT5ob3d0byArIDE7CSAgCi0JICAvKiBUaGlzIHdpbGwgYmUgdHdvIGJ5dGVzIHNtYWxsZXIgaW4gdGhlIGxvbmcgcnVuICovCi0JICBzaHJpbmsgKz0yIDsKLQkgIGJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgMiwgaW5wdXRfc2VjdGlvbiwgYWRkcmVzcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSk1QMToKLQotICAgICAgdmFsdWUgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZShyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKTsKLQkKLSAgICAgIGRvdCA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKyBhZGRyZXNzOwotICAKLSAgICAgIC8qIFNlZSBpZiB0aGUgYWRkcmVzcyB3ZSdyZSBsb29raW5nIGF0IHdpdGhpbiAxMjcgYnl0ZXMgb2Ygd2hlcmUKLQkgd2UgYXJlLCBpZiBzbyB0aGVuIHdlIGNhbiB1c2UgYSBzbWFsbCBicmFuY2ggcmF0aGVyIHRoYW4gdGhlCi0JIGp1bXAgd2Ugd2VyZSBnb2luZyB0byAqLwotCi0gICAgICBnYXAgPSB2YWx1ZSAtIChkb3QgLSBzaHJpbmspOwotICAKLQotICAgICAgaWYgKC0xMjAgPCAobG9uZylnYXAgJiYgKGxvbmcpZ2FwIDwgMTIwICkKLQl7IAotCi0JICAvKiBDaGFuZ2UgdGhlIHJlbG9jIHR5cGUgZnJvbSAxNmJpdCwgcG9zc2libGUgOCB0byA4Yml0Ci0JICAgICBwb3NzaWJsZSAxNiAqLwotCSAgcmVsb2MtPmhvd3RvID0gcmVsb2MtPmhvd3RvICsgMTsJICAKLQkgIC8qIFRoZSBwbGFjZSB0byByZWxjIG1vdmVzIGJhY2sgYnkgb25lICovCi0KLQkgIC8qIFRoaXMgd2lsbCBiZSB0d28gYnl0ZXMgc21hbGxlciBpbiB0aGUgbG9uZyBydW4gKi8KLQkgIHNocmluayArPTIgOwotCSAgYmZkX3BlcmZvcm1fc2xpcChhYmZkLCAyLCBpbnB1dF9zZWN0aW9uLCBhZGRyZXNzKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgCi0gIHJldHVybiBzaHJpbms7Ci19Ci0KLQotLyogRmlyc3QgcGhhc2Ugb2YgYSByZWxheGluZyBsaW5rICovCi0KLS8qIFJlbG9jIHR5cGVzCi0gICBsYXJnZQkJc21hbGwKLSAgIFJfTU9WMTZCMQkJUl9NT1YxNkIyCW1vdi5iIHdpdGggMTZiaXQgb3IgOCBiaXQgYWRkcmVzcwotICAgUl9KTVAxCQlSX0pNUDIJCWptcCBvciBwY3JlbCBicmFuY2gKLSAgIFJfSk1QTDEJCVJfSk1QTF9COAkyNGptcCBvciBwY3JlbCBicmFuY2gKLSAgIFJfTU9WMjRCMQkJUl9NT1YyNEIyCTI0IG9yIDggYml0IHJlbG9jIGZvciBtb3YuYgotCi0qLwotCi1zdGF0aWMgdm9pZAotaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICB1bnNpZ25lZCBpbnQgc3JjX2FkZHJlc3MgPSAqc3JjX3B0cjsKLSAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gKmRzdF9wdHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0gIHN3aXRjaCAocmVsb2MtPmhvd3RvLT50eXBlKQotICAgIHsKLSAgICBjYXNlIFJfVzY1X0FCUzg6Ci0gICAgY2FzZSBSX1c2NV9EUDoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzhTODoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSA4OwotCWJmZF9wdXRfOCAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDE7Ci0Jc3JjX2FkZHJlc3MgKz0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9BQlM4UzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQlnYXAgPj49MTY7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMTsKLQlzcmNfYWRkcmVzcyArPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzE2OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQotCWJmZF9wdXRfMTYgKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAyOwotCXNyY19hZGRyZXNzICs9IDI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X0FCUzE2Uzg6Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGdhcCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pOwotCWdhcCA+Pj0gODsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNlMxNjoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZ2FwID0gYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JZ2FwID4+PSAxNjsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JZHN0X2FkZHJlc3MgKz0gMjsKLQlzcmNfYWRkcmVzcyArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVzY1X0FCUzI0OgotICAgICAgewotCXVuc2lnbmVkIGludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfcHV0XzE2IChhYmZkLCBnYXAsIGRhdGEgKyBkc3RfYWRkcmVzcyk7Ci0JYmZkX3B1dF84IChhYmZkLCBnYXA+PjE2LCBkYXRhK2RzdF9hZGRyZXNzKzIpOwotCWRzdF9hZGRyZXNzICs9IDM7Ci0Jc3JjX2FkZHJlc3MgKz0gMzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX1c2NV9QQ1I4OgotICAgICAgewotCWludCBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJICAgICAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQgCi0JICArIGRzdF9hZGRyZXNzIAotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCWdhcCAtPSBkb3QgKyAxOwotCWlmIChnYXAgPCAtMTI4IHx8IGdhcCA+IDEyNykgewotCSAgaWYgKCEgKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgKGxpbmtfaW5mbywgYmZkX2FzeW1ib2xfbmFtZSAoKnJlbG9jLT5zeW1fcHRyX3B0ciksCi0JCSAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICBpbnB1dF9zZWN0aW9uLCByZWxvYy0+YWRkcmVzcykpKQotCSAgICBhYm9ydCgpOwotCX0KLQliZmRfcHV0XzggKGFiZmQsIGdhcCwgZGF0YSArIGRzdF9hZGRyZXNzKTsKLQlkc3RfYWRkcmVzcyArPSAxOwotCXNyY19hZGRyZXNzICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9XNjVfUENSMTY6Ci0gICAgICB7Ci0JYmZkX3ZtYSBnYXAgPSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywKLQkJCQkJCSAgaW5wdXRfc2VjdGlvbik7Ci0JYmZkX3ZtYSBkb3QgPSBsaW5rX29yZGVyLT5vZmZzZXQgCi0JICArIGRzdF9hZGRyZXNzIAotCSAgICArIGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCi0JLyogVGhpcyB3cmFwcyB3aXRoaW4gdGhlIHBhZ2UsIHNvIGlnbm9yZSB0aGUgcmVsYXRpdmVuZXNzLCBsb29rIGF0IHRoZQotCSAgIGhpZ2ggcGFydCAqLwotCWlmICgoZ2FwICYgMHhmMDAwMCkgIT0gKGRvdCAmIDB4ZjAwMDApKSB7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAobGlua19pbmZvLCBiZmRfYXN5bWJvbF9uYW1lICgqcmVsb2MtPnN5bV9wdHJfcHRyKSwKLQkJICByZWxvYy0+aG93dG8tPm5hbWUsIHJlbG9jLT5hZGRlbmQsIGlucHV0X3NlY3Rpb24tPm93bmVyLAotCQkgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0KCk7Ci0JfQotCi0JZ2FwIC09IGRvdCArIDI7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgZ2FwLCBkYXRhICsgZHN0X2FkZHJlc3MpOwotCWRzdF9hZGRyZXNzICs9IDI7Ci0Jc3JjX2FkZHJlc3MgKz0gMjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYoXygiaWdub3JpbmcgcmVsb2MgJXNcbiIpLCByZWxvYy0+aG93dG8tPm5hbWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICB9Ci0gICpzcmNfcHRyID0gc3JjX2FkZHJlc3M7Ci0gICpkc3RfcHRyID0gZHN0X2FkZHJlc3M7Ci0KLX0KLQotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMgaDgzMDBfcmVsb2MxNl9leHRyYV9jYXNlcwotI2RlZmluZSBjb2ZmX3JlbG9jMTZfZXN0aW1hdGUgaDgzMDBfcmVsb2MxNl9lc3RpbWF0ZQotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotCi0jdW5kZWYgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi0KLQotYmZkX3RhcmdldCB3NjVfdmVjID0KLXsKLSAgImNvZmYtdzY1IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgQkZEX0lTX1JFTEFYQUJMRSApLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgY2hhciAqLwotICAnLycsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBjb2ZmX21rb2JqZWN0LCBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgYmZkX2ZhbHNlfSwKLSAge2JmZF9mYWxzZSwgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgQ09GRl9TV0FQX1RBQkxFLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmLXdlMzJrLmMgYi9iZmQvY29mZi13ZTMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZiYmUzLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmLXdlMzJrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciB3ZTMyayBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQnJlbmRhbiBLZWhvZSAoYnJlbmRhbkBjcy53aWRlbmVyLmVkdSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvd2UzMmsuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jZGVmaW5lIENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiAoMykKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fdGFibGVbXSA9IAotewotICAgIHswfSwKLSAgICB7MX0sCi0gICAgezJ9LAotICAgIHszfSwKLSAgICB7NH0sCi0gICAgezV9LAotICBIT1dUTyhSX0RJUjMyLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJkaXIzMiIsCXRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgZmFsc2UpLAotICAgIHs3fSwKLSAgICB7MDEwfSwKLSAgICB7MDExfSwKLSAgICB7MDEyfSwKLSAgICB7MDEzfSwKLSAgICB7MDE0fSwKLSAgICB7MDE1fSwKLSAgICB7MDE2fSwKLSAgSE9XVE8oUl9SRUxCWVRFLAkgICAgICAgMCwgIDAsICAJOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIjgiLAl0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxXT1JELAkgICAgICAgMCwgIDEsIAkxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMTYiLAl0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9SRUxMT05HLAkgICAgICAgMCwgIDIsIAkzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiMzIiLAl0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oUl9QQ1JCWVRFLAkgICAgICAgMCwgIDAsIAk4LCAgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgIkRJU1A4IiwgICAgdHJ1ZSwgMHgwMDAwMDBmZiwweDAwMDAwMGZmLCBmYWxzZSksCi0gIEhPV1RPKFJfUENSV09SRCwJICAgICAgIDAsICAxLCAJMTYsIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIDAsICJESVNQMTYiLCAgIHRydWUsIDB4MDAwMGZmZmYsMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyhSX1BDUkxPTkcsCSAgICAgICAwLCAgMiwgCTMyLCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAiRElTUDMyIiwgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLX07Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgIG51bm1iZXIgKi8KLQotI2RlZmluZSBTRUxFQ1RfUkVMT0MoeCxob3d0bykgeyB4LnJfdHlwZSA9IGhvd3RvLT50eXBlOyB9Ci0jZGVmaW5lIEJBRE1BRyh4KSBXRTMyS0JBRE1BRyh4KQotI2RlZmluZSBXRTMySwkxCi0KLSNkZWZpbmUgUlRZUEUySE9XVE8oY2FjaGVfcHRyLCBkc3QpIFwKLQkgICAgKGNhY2hlX3B0ciktPmhvd3RvID0gaG93dG9fdGFibGUgKyAoZHN0KS0+cl90eXBlOwotCi0jaW5jbHVkZSAiY29mZmNvZGUuaCIKLQotI2RlZmluZSBjb2ZmX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAotCi1jb25zdCBiZmRfdGFyZ2V0IHdlMzJrY29mZl92ZWMgPQotewotICAiY29mZi13ZTMyayIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiBkYXRhIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgYmlnICovCi0KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCksCi0KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0KLSB7X2JmZF9kdW1teV90YXJnZXQsIGNvZmZfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotIHtiZmRfZmFsc2UsIGNvZmZfbWtvYmplY3QsIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIC8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBiZmRfZmFsc2V9LAotIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZi16OGsuYyBiL2JmZC9jb2ZmLXo4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDA0OWU4OS4uMDAwMDAwMAotLS0gYS9iZmQvY29mZi16OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFppbG9nIFo4MDBuIENPRkYgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiwgPHNhY0BjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImNvZmYvejhrLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotI2RlZmluZSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIgKDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJfaW1tMzIgPQotSE9XVE8gKFJfSU1NMzIsIDAsIDEsIDMyLCBmYWxzZSwgMCwKLSAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgInJfaW1tMzIiLCB0cnVlLCAweGZmZmZmZmZmLAotICAgICAgIDB4ZmZmZmZmZmYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9pbW00bCA9Ci1IT1dUTyAoUl9JTU00TCwgMCwgMSwgNCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTRsIiwgdHJ1ZSwgMHhmLCAweGYsIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9kYSA9Ci1IT1dUTyAoUl9JTU0xNiwgMCwgMSwgMTYsIGZhbHNlLCAwLAotICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAicl9kYSIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsCi0gICAgICAgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByX2ltbTggPQotSE9XVE8gKFJfSU1NOCwgMCwgMSwgOCwgZmFsc2UsIDAsCi0gICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJyX2ltbTgiLCB0cnVlLCAweDAwMDAwMGZmLCAweDAwMDAwMGZmLAotICAgICAgIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcl9qciA9Ci1IT1dUTyAoUl9KUiwgMCwgMSwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLAotICAgICAgICJyX2pyIiwgdHJ1ZSwgMCwgMCwgdHJ1ZSk7Ci0KLS8qIFR1cm4gYSBob3d0byBpbnRvIGEgcmVsb2MgbnVtYmVyICovCi0KLXN0YXRpYyBpbnQgCi1jb2ZmX3o4a19zZWxlY3RfcmVsb2MgKGhvd3RvKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLXsKLSAgcmV0dXJuIGhvd3RvLT50eXBlOwotfQotCi0jZGVmaW5lIFNFTEVDVF9SRUxPQyh4LGhvd3RvKSB4LnJfdHlwZSA9IGNvZmZfejhrX3NlbGVjdF9yZWxvYyhob3d0bykKLQotCi0jZGVmaW5lIEJBRE1BRyh4KSBaOEtCQURNQUcoeCkKLSNkZWZpbmUgWjhLIDEJCQkvKiBDdXN0b21pemUgY29mZmNvZGUuaCAqLwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLQotCi0KLS8qIENvZGUgdG8gc3dhcCBpbiB0aGUgcmVsb2MgKi8KLSNkZWZpbmUgU1dBUF9JTl9SRUxPQ19PRkZTRVQgICBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUIGJmZF9oX3B1dF8zMgotI2RlZmluZSBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLCBzcmMsIGRzdCkgXAotICBkc3QtPnJfc3R1ZmZbMF0gPSAnUyc7IFwKLSAgZHN0LT5yX3N0dWZmWzFdID0gJ0MnOwotCi0vKiBDb2RlIHRvIHR1cm4gYSByX3R5cGUgaW50byBhIGhvd3RvIHB0ciwgdXNlcyB0aGUgYWJvdmUgaG93dG8gdGFibGUKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1ydHlwZTJob3d0byAoaW50ZXJuYWwsIGRzdCkKLSAgICAgYXJlbGVudCAqIGludGVybmFsOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmRzdDsKLXsKLSAgc3dpdGNoIChkc3QtPnJfdHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0lNTTg6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW04OwotICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgUl9JTU0xNjoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2RhOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0pSOgotICAgICAgaW50ZXJuYWwtPmhvd3RvID0gJnJfanI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NMzI6Ci0gICAgICBpbnRlcm5hbC0+aG93dG8gPSAmcl9pbW0zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU00TDoKLSAgICAgIGludGVybmFsLT5ob3d0byA9ICZyX2ltbTRsOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZGVmaW5lIFJUWVBFMkhPV1RPKGludGVybmFsLCByZWxvY2VudHJ5KSBydHlwZTJob3d0byhpbnRlcm5hbCxyZWxvY2VudHJ5KQotCi0KLS8qIFBlcmZvcm0gYW55IG5lY2Vzc2FyeSBtYWdpYyB0byB0aGUgYWRkZW5kIGluIGEgcmVsb2MgZW50cnkgKi8KLQotCi0jZGVmaW5lIENBTENfQURERU5EKGFiZmQsIHN5bWJvbCwgZXh0X3JlbG9jLCBjYWNoZV9wdHIpIFwKLSBjYWNoZV9wdHItPmFkZGVuZCA9ICBleHRfcmVsb2Mucl9vZmZzZXQ7Ci0KLQotI2RlZmluZSBSRUxPQ19QUk9DRVNTSU5HKHJlbGVudCxyZWxvYyxzeW1ib2xzLGFiZmQsc2VjdGlvbikgXAotIHJlbG9jX3Byb2Nlc3NpbmcocmVsZW50LCByZWxvYywgc3ltYm9scywgYWJmZCwgc2VjdGlvbikKLQotc3RhdGljIHZvaWQgCi1yZWxvY19wcm9jZXNzaW5nIChyZWxlbnQsIHJlbG9jLCBzeW1ib2xzLCBhYmZkLCBzZWN0aW9uKQotICAgICBhcmVsZW50ICogcmVsZW50OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jOwotICAgICBhc3ltYm9sICoqIHN5bWJvbHM7Ci0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLXsKLSAgcmVsZW50LT5hZGRyZXNzID0gcmVsb2MtPnJfdmFkZHI7Ci0gIHJ0eXBlMmhvd3RvIChyZWxlbnQsIHJlbG9jKTsKLQotICBpZiAocmVsb2MtPnJfc3ltbmR4ID4gMCkKLSAgICB7Ci0gICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIG9ial9jb252ZXJ0IChhYmZkKVtyZWxvYy0+cl9zeW1uZHhdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLQotICByZWxlbnQtPmFkZGVuZCA9IHJlbG9jLT5yX29mZnNldDsKLSAgcmVsZW50LT5hZGRyZXNzIC09IHNlY3Rpb24tPnZtYTsKLX0KLQotc3RhdGljIHZvaWQKLWV4dHJhX2Nhc2UgKGluX2FiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpCi0gICAgIGJmZCAqaW5fYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotICBzd2l0Y2ggKHJlbG9jLT5ob3d0by0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0lNTTg6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSAocmVsb2MsIGxpbmtfaW5mbywgaW5wdXRfc2VjdGlvbiksCi0JCSBkYXRhICsgKmRzdF9wdHIpOwotICAgICAgKCpkc3RfcHRyKSArPSAxOwotICAgICAgKCpzcmNfcHRyKSArPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSU1NMzI6Ci0gICAgICBiZmRfcHV0XzMyIChpbl9hYmZkLAotCQkgIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKSwKLQkJICBkYXRhICsgKmRzdF9wdHIpOwotICAgICAgKCpkc3RfcHRyKSArPSA0OwotICAgICAgKCpzcmNfcHRyKSArPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSU1NNEw6Ci0gICAgICBiZmRfcHV0XzggKGluX2FiZmQsCi0JCSAoKGJmZF9nZXRfOCAoaW5fYWJmZCwgZGF0YSArICpkc3RfcHRyKSAmIDB4ZjApIAotCQkgIHwgKDB4MGYKLQkJICAgICAmIGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICAgaW5wdXRfc2VjdGlvbikpKSwKLQkJIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDE7Ci0gICAgICAoKnNyY19wdHIpICs9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU0xNjoKLSAgICAgIGJmZF9wdXRfMTYgKGluX2FiZmQsCi0JCSAgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgKHJlbG9jLCBsaW5rX2luZm8sIGlucHV0X3NlY3Rpb24pLAotCQkgIGRhdGEgKyAqZHN0X3B0cik7Ci0gICAgICAoKmRzdF9wdHIpICs9IDI7Ci0gICAgICAoKnNyY19wdHIpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9KUjoKLSAgICAgIHsKLQliZmRfdm1hIGRzdCA9IGJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLAotCQkJCQkJICBpbnB1dF9zZWN0aW9uKTsKLQliZmRfdm1hIGRvdCA9IChsaW5rX29yZGVyLT5vZmZzZXQKLQkJICAgICAgICsgKmRzdF9wdHIKLQkJICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0JaW50IGdhcCA9IGRzdCAtIGRvdCAtIDE7LyogLTEgc2luY2Ugd2VyZSBpbiB0aGUgb2RkIGJ5dGUgb2YgdGhlCi0JCQkJICAgIHdvcmQgYW5kIHRoZSBwYydzIGJlZW4gaW5jcmVtZW50ZWQgKi8KLQotCWlmIChnYXAgJiAxKQotCSAgYWJvcnQgKCk7Ci0JZ2FwIC89IDI7Ci0JaWYgKGdhcCA+IDEyOCB8fCBnYXAgPCAtMTI4KQotCSAgewotCSAgICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCpyZWxvYy0+c3ltX3B0cl9wdHIpLAotCQkgICAgcmVsb2MtPmhvd3RvLT5uYW1lLCByZWxvYy0+YWRkZW5kLCBpbnB1dF9zZWN0aW9uLT5vd25lciwKLQkJICAgIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0JYmZkX3B1dF84IChpbl9hYmZkLCBnYXAsIGRhdGEgKyAqZHN0X3B0cik7Ci0JKCpkc3RfcHRyKSsrOwotCSgqc3JjX3B0cikrKzsKLQlicmVhazsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9leHRyYV9jYXNlcyBleHRyYV9jYXNlCi0KLSNpbmNsdWRlICJjb2ZmY29kZS5oIgotCi0KLSN1bmRlZiAgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jdW5kZWYgY29mZl9iZmRfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfY29mZl9yZWxvYzE2X2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotCi1jb25zdCBiZmRfdGFyZ2V0IHo4a2NvZmZfdmVjID0KLXsKLSAgImNvZmYtejhrIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLSAgQkZEX0VORElBTl9CSUcsCQkvKiBoZWFkZXIgYnl0ZSBvcmRlciBpcyBiaWcgKi8KLQotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUKSwKLQotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgc3ltYm9sIHVuZGVyc2NvcmUgKi8KLSAgJy8nLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LCBjb2ZmX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgY29mZl9ta29iamVjdCwgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoY29mZiksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGNvZmYpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChjb2ZmKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIENPRkZfU1dBUF9UQUJMRSwKLX07CmRpZmYgLS1naXQgYS9iZmQvY29mZmNvZGUuaCBiL2JmZC9jb2ZmY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWU3YjMwLi4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDM1MSArMCwwIEBACi0vKiBTdXBwb3J0IGZvciB0aGUgZ2VuZXJpYyBwYXJ0cyBvZiBtb3N0IENPRkYgdmFyaWFudHMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotKi8KLS8qCi0KLVNFQ1RJT04KLQljb2ZmIGJhY2tlbmRzCi0KLQlCRkQgc3VwcG9ydHMgYSBudW1iZXIgb2YgZGlmZmVyZW50IGZsYXZvdXJzIG9mIGNvZmYgZm9ybWF0LgotCVRoZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIGZvcm1hdHMgYXJlIHRoZSBzaXplcyBhbmQKLQlhbGlnbm1lbnRzIG9mIGZpZWxkcyBpbiBzdHJ1Y3R1cmVzIG9uIGRpc2ssIGFuZCB0aGUgb2NjYXNpb25hbAotCWV4dHJhIGZpZWxkLgotCi0JQ29mZiBpbiBhbGwgaXRzIHZhcmlldGllcyBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgZmV3IGNvbW1vbgotCWZpbGVzIGFuZCBhIG51bWJlciBvZiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBmaWxlcy4gRm9yCi0JZXhhbXBsZSwgVGhlIDg4ayBiY3MgY29mZiBmb3JtYXQgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIGZpbGUKLQlAZmlsZXtjb2ZmLW04OGsuY30uIFRoaXMgZmlsZSBAY29kZXsjaW5jbHVkZX1zCi0JQGZpbGV7Y29mZi9tODhrLmh9IHdoaWNoIGRlZmluZXMgdGhlIGV4dGVybmFsIHN0cnVjdHVyZSBvZiB0aGUKLQljb2ZmIGZvcm1hdCBmb3IgdGhlIDg4aywgYW5kIEBmaWxle2NvZmYvaW50ZXJuYWwuaH0gd2hpY2gKLQlkZWZpbmVzIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUuIEBmaWxle2NvZmYtbTg4ay5jfSBhbHNvCi0JZGVmaW5lcyB0aGUgcmVsb2NhdGlvbnMgdXNlZCBieSB0aGUgODhrIGZvcm1hdAotCUB4cmVme1JlbG9jYXRpb25zfS4KLQotCVRoZSBJbnRlbCBpOTYwIHByb2Nlc3NvciB2ZXJzaW9uIG9mIGNvZmYgaXMgaW1wbGVtZW50ZWQgaW4KLQlAZmlsZXtjb2ZmLWk5NjAuY30uIFRoaXMgZmlsZSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzCi0JQGZpbGV7Y29mZi1tODhrLmN9LCBleGNlcHQgdGhhdCBpdCBpbmNsdWRlcyBAZmlsZXtjb2ZmL2k5NjAuaH0KLQlyYXRoZXIgdGhhbiBAZmlsZXtjb2ZmLW04OGsuaH0uCi0KLVNVQlNFQ1RJT04KLQlQb3J0aW5nIHRvIGEgbmV3IHZlcnNpb24gb2YgY29mZgotCi0JVGhlIHJlY29tbWVuZGVkIG1ldGhvZCBpcyB0byBzZWxlY3QgZnJvbSB0aGUgZXhpc3RpbmcKLQlpbXBsZW1lbnRhdGlvbnMgdGhlIHZlcnNpb24gb2YgY29mZiB3aGljaCBpcyBtb3N0IGxpa2UgdGhlIG9uZQotCXlvdSB3YW50IHRvIHVzZS4gIEZvciBleGFtcGxlLCB3ZSdsbCBzYXkgdGhhdCBpMzg2IGNvZmYgaXMKLQl0aGUgb25lIHlvdSBzZWxlY3QsIGFuZCB0aGF0IHlvdXIgY29mZiBmbGF2b3VyIGlzIGNhbGxlZCBmb28uCi0JQ29weSBAZmlsZXtpMzg2Y29mZi5jfSB0byBAZmlsZXtmb29jb2ZmLmN9LCBjb3B5Ci0JQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2kzODYuaH0gdG8gQGZpbGV7Li4vaW5jbHVkZS9jb2ZmL2Zvby5ofSwKLQlhbmQgYWRkIHRoZSBsaW5lcyB0byBAZmlsZXt0YXJnZXRzLmN9IGFuZCBAZmlsZXtNYWtlZmlsZS5pbn0KLQlzbyB0aGF0IHlvdXIgbmV3IGJhY2sgZW5kIGlzIHVzZWQuIEFsdGVyIHRoZSBzaGFwZXMgb2YgdGhlCi0Jc3RydWN0dXJlcyBpbiBAZmlsZXsuLi9pbmNsdWRlL2NvZmYvZm9vLmh9IHNvIHRoYXQgdGhleSBtYXRjaAotCXdoYXQgeW91IG5lZWQuIFlvdSB3aWxsIHByb2JhYmx5IGFsc28gaGF2ZSB0byBhZGQKLQlAY29kZXsjaWZkZWZ9cyB0byB0aGUgY29kZSBpbiBAZmlsZXtjb2ZmL2ludGVybmFsLmh9IGFuZAotCUBmaWxle2NvZmZjb2RlLmh9IGlmIHlvdXIgdmVyc2lvbiBvZiBjb2ZmIGlzIHRvbyB3aWxkLgotCi0JWW91IGNhbiB2ZXJpZnkgdGhhdCB5b3VyIG5ldyBCRkQgYmFja2VuZCB3b3JrcyBxdWl0ZSBzaW1wbHkgYnkKLQlidWlsZGluZyBAZmlsZXtvYmpkdW1wfSBmcm9tIHRoZSBAZmlsZXtiaW51dGlsc30gZGlyZWN0b3J5LAotCWFuZCBtYWtpbmcgc3VyZSB0aGF0IGl0cyB2ZXJzaW9uIG9mIHdoYXQncyBnb2luZyBvbiBhbmQgeW91cgotCWhvc3Qgc3lzdGVtJ3MgaWRlYSAoYXNzdW1pbmcgaXQgaGFzIHRoZSBwcmV0dHkgc3RhbmRhcmQgY29mZgotCWR1bXAgdXRpbGl0eSwgdXN1YWxseSBjYWxsZWQgQGNvZGV7YXR0LWR1bXB9IG9yIGp1c3QKLQlAY29kZXtkdW1wfSkgYXJlIHRoZSBzYW1lLiAgVGhlbiBjbGVhbiB1cCB5b3VyIGNvZGUsIGFuZCBzZW5kCi0Jd2hhdCB5b3UndmUgZG9uZSB0byBDeWdudXMuIFRoZW4geW91ciBzdHVmZiB3aWxsIGJlIGluIHRoZQotCW5leHQgcmVsZWFzZSwgYW5kIHlvdSB3b24ndCBoYXZlIHRvIGtlZXAgaW50ZWdyYXRpbmcgaXQuCi0KLVNVQlNFQ1RJT04KLQlIb3cgdGhlIGNvZmYgYmFja2VuZCB3b3JrcwotCi1TVUJTVUJTRUNUSU9OCi0JRmlsZSBsYXlvdXQKLQotCVRoZSBDb2ZmIGJhY2tlbmQgaXMgc3BsaXQgaW50byBnZW5lcmljIHJvdXRpbmVzIHRoYXQgYXJlCi0JYXBwbGljYWJsZSB0byBhbnkgQ29mZiB0YXJnZXQgYW5kIHJvdXRpbmVzIHRoYXQgYXJlIHNwZWNpZmljCi0JdG8gYSBwYXJ0aWN1bGFyIHRhcmdldC4gIFRoZSB0YXJnZXQtc3BlY2lmaWMgcm91dGluZXMgYXJlCi0JZnVydGhlciBzcGxpdCBpbnRvIG9uZXMgd2hpY2ggYXJlIGJhc2ljYWxseSB0aGUgc2FtZSBmb3IgYWxsCi0JQ29mZiB0YXJnZXRzIGV4Y2VwdCB0aGF0IHRoZXkgdXNlIHRoZSBleHRlcm5hbCBzeW1ib2wgZm9ybWF0Ci0Jb3IgdXNlIGRpZmZlcmVudCB2YWx1ZXMgZm9yIGNlcnRhaW4gY29uc3RhbnRzLgotCi0JVGhlIGdlbmVyaWMgcm91dGluZXMgYXJlIGluIEBmaWxle2NvZmZnZW4uY30uICBUaGVzZSByb3V0aW5lcwotCXdvcmsgZm9yIGFueSBDb2ZmIHRhcmdldC4gIFRoZXkgdXNlIHNvbWUgaG9va3MgaW50byB0aGUgdGFyZ2V0Ci0Jc3BlY2lmaWMgY29kZTsgdGhlIGhvb2tzIGFyZSBpbiBhIEBjb2Rle2JmZF9jb2ZmX2JhY2tlbmRfZGF0YX0KLQlzdHJ1Y3R1cmUsIG9uZSBvZiB3aGljaCBleGlzdHMgZm9yIGVhY2ggdGFyZ2V0LgotCi0JVGhlIGVzc2VudGlhbGx5IHNpbWlsYXIgdGFyZ2V0LXNwZWNpZmljIHJvdXRpbmVzIGFyZSBpbgotCUBmaWxle2NvZmZjb2RlLmh9LiAgVGhpcyBoZWFkZXIgZmlsZSBpbmNsdWRlcyBleGVjdXRhYmxlIEMgY29kZS4KLQlUaGUgdmFyaW91cyBDb2ZmIHRhcmdldHMgZmlyc3QgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgQ29mZgotCWhlYWRlciBmaWxlLCBtYWtlIGFueSBzcGVjaWFsIGRlZmluZXMgdGhhdCBhcmUgbmVlZGVkLCBhbmQKLQl0aGVuIGluY2x1ZGUgQGZpbGV7Y29mZmNvZGUuaH0uCi0KLQlTb21lIG9mIHRoZSBDb2ZmIHRhcmdldHMgdGhlbiBhbHNvIGhhdmUgYWRkaXRpb25hbCByb3V0aW5lcyBpbgotCXRoZSB0YXJnZXQgc291cmNlIGZpbGUgaXRzZWxmLgotCi0JRm9yIGV4YW1wbGUsIEBmaWxle2NvZmYtaTk2MC5jfSBpbmNsdWRlcwotCUBmaWxle2NvZmYvaW50ZXJuYWwuaH0gYW5kIEBmaWxle2NvZmYvaTk2MC5ofS4gIEl0IHRoZW4KLQlkZWZpbmVzIGEgZmV3IGNvbnN0YW50cywgc3VjaCBhcyBAY29kZXtJOTYwfSwgYW5kIGluY2x1ZGVzCi0JQGZpbGV7Y29mZmNvZGUuaH0uICBTaW5jZSB0aGUgaTk2MCBoYXMgY29tcGxleCByZWxvY2F0aW9uCi0JdHlwZXMsIEBmaWxle2NvZmYtaTk2MC5jfSBhbHNvIGluY2x1ZGVzIHNvbWUgY29kZSB0bwotCW1hbmlwdWxhdGUgdGhlIGk5NjAgcmVsb2NzLiAgVGhpcyBjb2RlIGlzIG5vdCBpbgotCUBmaWxle2NvZmZjb2RlLmh9IGJlY2F1c2UgaXQgd291bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyCi0JdGFyZ2V0LgotCi1TVUJTVUJTRUNUSU9OCi0JQml0IHR3aWRkbGluZwotCi0JRWFjaCBmbGF2b3VyIG9mIGNvZmYgc3VwcG9ydGVkIGluIEJGRCBoYXMgaXRzIG93biBoZWFkZXIgZmlsZQotCWRlc2NyaWJpbmcgdGhlIGV4dGVybmFsIGxheW91dCBvZiB0aGUgc3RydWN0dXJlcy4gVGhlcmUgaXMgYWxzbwotCWFuIGludGVybmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2ZmIGxheW91dCwgaW4KLQlAZmlsZXtjb2ZmL2ludGVybmFsLmh9LiBBIG1ham9yIGZ1bmN0aW9uIG9mIHRoZQotCWNvZmYgYmFja2VuZCBpcyBzd2FwcGluZyB0aGUgYnl0ZXMgYW5kIHR3aWRkbGluZyB0aGUgYml0cyB0bwotCXRyYW5zbGF0ZSB0aGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgc3RydWN0dXJlcyBpbnRvIHRoZSBub3JtYWwKLQlpbnRlcm5hbCBmb3JtLiBUaGlzIGlzIGFsbCBwZXJmb3JtZWQgaW4gdGhlCi0JQGNvZGV7YmZkX3N3YXB9X0Bpe3RoaW5nfV9AaXtkaXJlY3Rpb259IHJvdXRpbmVzLiBTb21lCi0JZWxlbWVudHMgYXJlIGRpZmZlcmVudCBzaXplcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZgotCWNvZmY7IGl0IGlzIHRoZSBkdXR5IG9mIHRoZSBjb2ZmIHZlcnNpb24gc3BlY2lmaWMgaW5jbHVkZSBmaWxlCi0JdG8gb3ZlcnJpZGUgdGhlIGRlZmluaXRpb25zIG9mIHZhcmlvdXMgcGFja2luZyByb3V0aW5lcyBpbgotCUBmaWxle2NvZmZjb2RlLmh9LiBFLmcuLCB0aGUgc2l6ZSBvZiBsaW5lIG51bWJlciBlbnRyeSBpbiBjb2ZmIGlzCi0Jc29tZXRpbWVzIDE2IGJpdHMsIGFuZCBzb21ldGltZXMgMzIgYml0cy4gQGNvZGV7I2RlZmluZX1pbmcKLQlAY29kZXtQVVRfTE5TWl9MTk5PfSBhbmQgQGNvZGV7R0VUX0xOU1pfTE5OT30gd2lsbCBzZWxlY3QgdGhlCi0JY29ycmVjdCBvbmUuIE5vIGRvdWJ0LCBzb21lIGRheSBzb21lb25lIHdpbGwgZmluZCBhIHZlcnNpb24gb2YKLQljb2ZmIHdoaWNoIGhhcyBhIHZhcnlpbmcgZmllbGQgc2l6ZSBub3QgY2F0ZXJlZCB0byBhdCB0aGUKLQltb21lbnQuIFRvIHBvcnQgQkZELCB0aGF0IHBlcnNvbiB3aWxsIGhhdmUgdG8gYWRkIG1vcmUgQGNvZGV7I2RlZmluZXN9LgotCVRocmVlIG9mIHRoZSBiaXQgdHdpZGRsaW5nIHJvdXRpbmVzIGFyZSBleHBvcnRlZCB0bwotCUBjb2Rle2dkYn07IEBjb2Rle2NvZmZfc3dhcF9hdXhfaW59LCBAY29kZXtjb2ZmX3N3YXBfc3ltX2lufQotCWFuZCBAY29kZXtjb2ZmX3N3YXBfbGlubm9faW59LiBAY29kZXtHREJ9IHJlYWRzIHRoZSBzeW1ib2wKLQl0YWJsZSBvbiBpdHMgb3duLCBidXQgdXNlcyBCRkQgdG8gZml4IHRoaW5ncyB1cC4gIE1vcmUgb2YgdGhlCi0JYml0IHR3aWRkbGVycyBhcmUgZXhwb3J0ZWQgZm9yIEBjb2Rle2dhc307Ci0JQGNvZGV7Y29mZl9zd2FwX2F1eF9vdXR9LCBAY29kZXtjb2ZmX3N3YXBfc3ltX291dH0sCi0JQGNvZGV7Y29mZl9zd2FwX2xpbmVub19vdXR9LCBAY29kZXtjb2ZmX3N3YXBfcmVsb2Nfb3V0fSwKLQlAY29kZXtjb2ZmX3N3YXBfZmlsZWhkcl9vdXR9LCBAY29kZXtjb2ZmX3N3YXBfYW91dGhkcl9vdXR9LAotCUBjb2Rle2NvZmZfc3dhcF9zY25oZHJfb3V0fS4gQGNvZGV7R2FzfSBjdXJyZW50bHkga2VlcHMgdHJhY2sKLQlvZiBhbGwgdGhlIHN5bWJvbCB0YWJsZSBhbmQgcmVsb2MgZHJ1ZGdlcnkgaXRzZWxmLCB0aGVyZWJ5Ci0Jc2F2aW5nIHRoZSBpbnRlcm5hbCBCRkQgb3ZlcmhlYWQsIGJ1dCB1c2VzIEJGRCB0byBzd2FwIHRoaW5ncwotCW9uIHRoZSB3YXkgb3V0LCBtYWtpbmcgY3Jvc3MgcG9ydHMgbXVjaCBzYWZlci4gIERvaW5nIHNvIGFsc28KLQlhbGxvd3MgQkZEIChhbmQgdGh1cyB0aGUgbGlua2VyKSB0byB1c2UgdGhlIHNhbWUgaGVhZGVyIGZpbGVzCi0JYXMgQGNvZGV7Z2FzfSwgd2hpY2ggbWFrZXMgb25lIGF2ZW51ZSB0byBkaXNhc3RlciBkaXNhcHBlYXIuCi0KLVNVQlNVQlNFQ1RJT04KLQlTeW1ib2wgcmVhZGluZwotCi0JVGhlIHNpbXBsZSBjYW5vbmljYWwgZm9ybSBmb3Igc3ltYm9scyB1c2VkIGJ5IEJGRCBpcyBub3QgcmljaAotCWVub3VnaCB0byBrZWVwIGFsbCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIGEgY29mZiBzeW1ib2wKLQl0YWJsZS4gVGhlIGJhY2sgZW5kIGdldHMgYXJvdW5kIHRoaXMgcHJvYmxlbSBieSBrZWVwaW5nIHRoZSBvcmlnaW5hbAotCXN5bWJvbCB0YWJsZSBhcm91bmQsICJiZWhpbmQgdGhlIHNjZW5lcyIuCi0KLQlXaGVuIGEgc3ltYm9sIHRhYmxlIGlzIHJlcXVlc3RlZCAodGhyb3VnaCBhIGNhbGwgdG8KLQlAY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0pLCBhIHJlcXVlc3QgZ2V0cyB0aHJvdWdoIHRvCi0JQGNvZGV7Y29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWJ9LiBUaGlzIHJlYWRzIHRoZSBzeW1ib2wgdGFibGUgZnJvbQotCXRoZSBjb2ZmIGZpbGUgYW5kIHN3YXBzIGFsbCB0aGUgc3RydWN0dXJlcyBpbnNpZGUgaW50byB0aGUKLQlpbnRlcm5hbCBmb3JtLiBJdCBhbHNvIGZpeGVzIHVwIGFsbCB0aGUgcG9pbnRlcnMgaW4gdGhlIHRhYmxlCi0JKHJlcHJlc2VudGVkIGluIHRoZSBmaWxlIGJ5IG9mZnNldHMgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluCi0JdGhlIHRhYmxlKSBpbnRvIHBoeXNpY2FsIHBvaW50ZXJzIHRvIGVsZW1lbnRzIGluIHRoZSBuZXcKLQlpbnRlcm5hbCB0YWJsZS4gVGhpcyBpbnZvbHZlcyBzb21lIHdvcmsgc2luY2UgdGhlIG1lYW5pbmdzIG9mCi0JZmllbGRzIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiBjb250ZXh0OiBhIGZpZWxkIHRoYXQgaXMgYQotCXBvaW50ZXIgdG8gYW5vdGhlciBzdHJ1Y3R1cmUgaW4gdGhlIHN5bWJvbCB0YWJsZSBhdCBvbmUgbW9tZW50Ci0JbWF5IGJlIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgc3RydWN0dXJlIGF0IHRoZSBuZXh0LiAgQW5vdGhlcgotCXBhc3MgaXMgbWFkZSBvdmVyIHRoZSB0YWJsZS4gQWxsIHN5bWJvbHMgd2hpY2ggbWFyayBmaWxlIG5hbWVzCi0JKDw8Q19GSUxFPj4gc3ltYm9scykgYXJlIG1vZGlmaWVkIHNvIHRoYXQgdGhlIGludGVybmFsCi0Jc3RyaW5nIHBvaW50cyB0byB0aGUgdmFsdWUgaW4gdGhlIGF1eGVudCAodGhlIHJlYWwgZmlsZW5hbWUpCi0JcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sCi0JKEBjb2RleyIuZmlsZSJ9KS4KLQotCUF0IHRoaXMgdGltZSB0aGUgc3ltYm9sIG5hbWVzIGFyZSBtb3ZlZCBhcm91bmQuIENvZmYgc3RvcmVzCi0JYWxsIHN5bWJvbHMgbGVzcyB0aGFuIG5pbmUgY2hhcmFjdGVycyBsb25nIHBoeXNpY2FsbHkKLQl3aXRoaW4gdGhlIHN5bWJvbCB0YWJsZTsgbG9uZ2VyIHN0cmluZ3MgYXJlIGtlcHQgYXQgdGhlIGVuZCBvZgotCXRoZSBmaWxlIGluIHRoZSBzdHJpbmcgCXRhYmxlLiBUaGlzIHBhc3MgbW92ZXMgYWxsIHN0cmluZ3MKLQlpbnRvIG1lbW9yeSBhbmQgcmVwbGFjZXMgdGhlbSB3aXRoIHBvaW50ZXJzIHRvIHRoZSBzdHJpbmdzLgotCi0KLQlUaGUgc3ltYm9sIHRhYmxlIGlzIG1hc3NhZ2VkIG9uY2UgYWdhaW4sIHRoaXMgdGltZSB0byBjcmVhdGUKLQl0aGUgY2Fub25pY2FsIHRhYmxlIHVzZWQgYnkgdGhlIEJGRCBhcHBsaWNhdGlvbi4gRWFjaCBzeW1ib2wKLQlpcyBpbnNwZWN0ZWQgaW4gdHVybiwgYW5kIGEgZGVjaXNpb24gbWFkZSAodXNpbmcgdGhlCi0JQGNvZGV7c2NsYXNzfSBmaWVsZCkgYWJvdXQgdGhlIHZhcmlvdXMgZmxhZ3MgdG8gc2V0IGluIHRoZQotCUBjb2Rle2FzeW1ib2x9LiAgQHhyZWZ7U3ltYm9sc30uIFRoZSBnZW5lcmF0ZWQgY2Fub25pY2FsIHRhYmxlCi0Jc2hhcmVzIHN0cmluZ3Mgd2l0aCB0aGUgaGlkZGVuIGludGVybmFsIHN5bWJvbCB0YWJsZS4KLQotCUFueSBsaW5lbnVtYmVycyBhcmUgcmVhZCBmcm9tIHRoZSBjb2ZmIGZpbGUgdG9vLCBhbmQgYXR0YWNoZWQKLQl0byB0aGUgc3ltYm9scyB3aGljaCBvd24gdGhlIGZ1bmN0aW9ucyB0aGUgbGluZW51bWJlcnMgYmVsb25nIHRvLgotCi1TVUJTVUJTRUNUSU9OCi0JU3ltYm9sIHdyaXRpbmcKLQotCVdyaXRpbmcgYSBzeW1ib2wgdG8gYSBjb2ZmIGZpbGUgd2hpY2ggZGlkbid0IGNvbWUgZnJvbSBhIGNvZmYKLQlmaWxlIHdpbGwgbG9zZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGUgQGNvZGV7YXN5bWJvbH0KLQlzdHJ1Y3R1cmUgcmVtZW1iZXJzIHRoZSBCRkQgZnJvbSB3aGljaCB0aGUgc3ltYm9sIHdhcyB0YWtlbiwgYW5kIG9uCi0Jb3V0cHV0IHRoZSBiYWNrIGVuZCBtYWtlcyBzdXJlIHRoYXQgdGhlIHNhbWUgZGVzdGluYXRpb24gdGFyZ2V0IGFzCi0Jc291cmNlIHRhcmdldCBpcyBwcmVzZW50LgotCi0JV2hlbiB0aGUgc3ltYm9scyBoYXZlIGNvbWUgZnJvbSBhIGNvZmYgZmlsZSB0aGVuIGFsbCB0aGUKLQlkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkLgotCi0JU3ltYm9sIHRhYmxlcyBhcmUgcHJvdmlkZWQgZm9yIHdyaXRpbmcgdG8gdGhlIGJhY2sgZW5kIGluIGEKLQl2ZWN0b3Igb2YgcG9pbnRlcnMgdG8gcG9pbnRlcnMuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucyBsaWtlCi0JdGhlIGxpbmtlciB0byBhY2N1bXVsYXRlIGFuZCBvdXRwdXQgbGFyZ2Ugc3ltYm9sIHRhYmxlcwotCXdpdGhvdXQgaGF2aW5nIHRvIGRvIHRvbyBtdWNoIGJ5dGUgY29weWluZy4KLQotCVRoaXMgZnVuY3Rpb24gcnVucyB0aHJvdWdoIHRoZSBwcm92aWRlZCBzeW1ib2wgdGFibGUgYW5kCi0JcGF0Y2hlcyBlYWNoIHN5bWJvbCBtYXJrZWQgYXMgYSBmaWxlIHBsYWNlIGhvbGRlcgotCShAY29kZXtDX0ZJTEV9KSB0byBwb2ludCB0byB0aGUgbmV4dCBmaWxlIHBsYWNlIGhvbGRlciBpbiB0aGUKLQlsaXN0LiBJdCBhbHNvIG1hcmtzIGVhY2ggQGNvZGV7b2Zmc2V0fSBmaWVsZCBpbiB0aGUgbGlzdCB3aXRoCi0JdGhlIG9mZnNldCBmcm9tIHRoZSBmaXJzdCBzeW1ib2wgb2YgdGhlIGN1cnJlbnQgc3ltYm9sLgotCi0JQW5vdGhlciBmdW5jdGlvbiBvZiB0aGlzIHByb2NlZHVyZSBpcyB0byB0dXJuIHRoZSBjYW5vbmljYWwKLQl2YWx1ZSBmb3JtIG9mIEJGRCBpbnRvIHRoZSBmb3JtIHVzZWQgYnkgY29mZi4gSW50ZXJuYWxseSwgQkZECi0JZXhwZWN0cyBzeW1ib2wgdmFsdWVzIHRvIGJlIG9mZnNldHMgZnJvbSBhIHNlY3Rpb24gYmFzZTsgc28gYQotCXN5bWJvbCBwaHlzaWNhbGx5IGF0IDB4MTIwLCBidXQgaW4gYSBzZWN0aW9uIHN0YXJ0aW5nIGF0Ci0JMHgxMDAsIHdvdWxkIGhhdmUgdGhlIHZhbHVlIDB4MjAuIENvZmYgZXhwZWN0cyBzeW1ib2xzIHRvCi0JY29udGFpbiB0aGVpciBmaW5hbCB2YWx1ZSwgc28gc3ltYm9scyBoYXZlIHRoZWlyIHZhbHVlcwotCWNoYW5nZWQgYXQgdGhpcyBwb2ludCB0byByZWZsZWN0IHRoZWlyIHN1bSB3aXRoIHRoZWlyIG93bmluZwotCXNlY3Rpb24uICBUaGlzIHRyYW5zZm9ybWF0aW9uIHVzZXMgdGhlCi0JPDxvdXRwdXRfc2VjdGlvbj4+IGZpZWxkIG9mIHRoZSBAY29kZXthc3ltYm9sfSdzCi0JQGNvZGV7YXNlY3Rpb259IEB4cmVme1NlY3Rpb25zfS4KLQotCW8gPDxjb2ZmX21hbmdsZV9zeW1ib2xzPj4KLQotCVRoaXMgcm91dGluZSBydW5zIHRob3VnaCB0aGUgcHJvdmlkZWQgc3ltYm9sIHRhYmxlIGFuZCB1c2VzCi0JdGhlIG9mZnNldHMgZ2VuZXJhdGVkIGJ5IHRoZSBwcmV2aW91cyBwYXNzIGFuZCB0aGUgcG9pbnRlcnMKLQlnZW5lcmF0ZWQgd2hlbiB0aGUgc3ltYm9sIHRhYmxlIHdhcyByZWFkIGluIHRvIGNyZWF0ZSB0aGUKLQlzdHJ1Y3R1cmVkIGhpZXJhY2h5IHJlcXVpcmVkIGJ5IGNvZmYuIEl0IGNoYW5nZXMgZWFjaCBwb2ludGVyCi0JdG8gYSBzeW1ib2wgaW50byB0aGUgaW5kZXggaW50byB0aGUgc3ltYm9sIHRhYmxlIG9mIHRoZSBhc3ltYm9sLgotCi0JbyA8PGNvZmZfd3JpdGVfc3ltYm9scz4+Ci0KLQlUaGlzIHJvdXRpbmUgcnVucyB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgYW5kIHBhdGNoZXMgdXAgdGhlCi0Jc3ltYm9scyBmcm9tIHRoZWlyIGludGVybmFsIGZvcm0gaW50byB0aGUgY29mZiB3YXksIGNhbGxzIHRoZQotCWJpdCB0d2lkZGxlcnMsIGFuZCB3cml0ZXMgb3V0IHRoZSB0YWJsZSB0byB0aGUgZmlsZS4KLQotKi8KLQotLyoKLUlOVEVSTkFMX0RFRklOSVRJT04KLQljb2ZmX3N5bWJvbF90eXBlCi0KLURFU0NSSVBUSU9OCi0JVGhlIGhpZGRlbiBpbmZvcm1hdGlvbiBmb3IgYW4gPDxhc3ltYm9sPj4gaXMgZGVzY3JpYmVkIGluIGEKLQk8PGNvbWJpbmVkX2VudHJ5X3R5cGU+PjoKLQotQ09ERV9GUkFHTUVOVAotLgotLnR5cGVkZWYgc3RydWN0IGNvZmZfcHRyX3N0cnVjdAotLnsKLS4KLS4gICAgICAgeyogUmVtZW1iZXJzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBmaWxlIGZvcgotLiAgICAgICAgICB0aGlzIHN5bWJvbC4gR2VuZXJhdGVkIGJ5IGNvZmZfcmVudW1iZXJfc3ltYm9scy4gKn0KLS51bnNpZ25lZCBpbnQgb2Zmc2V0OwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuICBVc2VkIGZvcgotLiAgICAgICAgICBYQ09GRiBDX0JTVEFUIHN5bWJvbHMuICBTZXQgYnkgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqfQotLnVuc2lnbmVkIGludCBmaXhfdmFsdWUgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHRhZyBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF90YWcgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIGVuZGlkeCBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotLiAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICp9Ci0udW5zaWduZWQgaW50IGZpeF9lbmQgOiAxOwotLgotLiAgICAgICB7KiBTaG91bGQgdGhlIHhfY3NlY3QueF9zY25sZW4gZmllbGQgYmUgcmVudW1iZXJlZC4KLS4gICAgICAgICAgQ3JlYXRlZCBieSBjb2ZmX3BvaW50ZXJpemVfYXV4LiAqfQotLnVuc2lnbmVkIGludCBmaXhfc2NubGVuIDogMTsKLS4KLS4gICAgICAgeyogRml4IHVwIGFuIFhDT0ZGIENfQklOQ0wvQ19FSU5DTCBzeW1ib2wuICBUaGUgdmFsdWUgaXMgdGhlCi0uICAgICAgICAgIGluZGV4IGludG8gdGhlIGxpbmUgbnVtYmVyIGVudHJpZXMuICBTZXQgYnkKLS4gICAgICAgICAgY29mZl9zbHVycF9zeW1ib2xfdGFibGUuICAqfQotLnVuc2lnbmVkIGludCBmaXhfbGluZSA6IDE7Ci0uCi0uICAgICAgIHsqIFRoZSBjb250YWluZXIgZm9yIHRoZSBzeW1ib2wgc3RydWN0dXJlIGFzIHJlYWQgYW5kIHRyYW5zbGF0ZWQKLS4gICAgICAgICAgIGZyb20gdGhlIGZpbGUuICp9Ci0uCi0udW5pb24gewotLiAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0uICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0uIH0gdTsKLS59IGNvbWJpbmVkX2VudHJ5X3R5cGU7Ci0uCi0uCi0ueyogRWFjaCBjYW5vbmljYWwgYXN5bWJvbCByZWFsbHkgbG9va3MgbGlrZSB0aGlzOiAqfQotLgotLnR5cGVkZWYgc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdAotLnsKLS4gICB7KiBUaGUgYWN0dWFsIHN5bWJvbCB3aGljaCB0aGUgcmVzdCBvZiBCRkQgd29ya3Mgd2l0aCAqfQotLmFzeW1ib2wgc3ltYm9sOwotLgotLiAgIHsqIEEgcG9pbnRlciB0byB0aGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqfQotLmNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLS4KLS4gICB7KiBBIHBvaW50ZXIgdG8gdGhlIGxpbmVudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoaXMgc3ltYm9sICp9Ci0uc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSAqbGluZW5vOwotLgotLiAgIHsqIEhhdmUgdGhlIGxpbmUgbnVtYmVycyBiZWVuIHJlbG9jYXRlZCB5ZXQgPyAqfQotLmJvb2xlYW4gZG9uZV9saW5lbm87Ci0ufSBjb2ZmX3N5bWJvbF90eXBlOwotCi0KLSovCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNpbmNsdWRlICJwZWljb2RlLmgiCi0jZWxzZQotI2luY2x1ZGUgImNvZmZzd2FwLmgiCi0jZW5kaWYKLQotI2RlZmluZSBTVFJJTkdfU0laRV9TSVpFICg0KQotCi1zdGF0aWMgbG9uZyBzZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICosIGZsYWd3b3JkKSk7Ci1zdGF0aWMgZmxhZ3dvcmQgc3R5cF90b19zZWNfZmxhZ3MgUEFSQU1TICgoYmZkICosIFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2JhZF9mb3JtYXRfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2V0X2FyY2hfbWFjaF9ob29rIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfc2V0X2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgc2hvcnQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIFBUUiBidXlfYW5kX3JlYWQgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBpbnQsIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zbHVycF9saW5lX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gY29mZl9zbHVycF9yZWxvY190YWJsZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGxvbmcgY29mZl9jYW5vbmljYWxpemVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLSNpZm5kZWYgY29mZl9ta29iamVjdF9ob29rCi1zdGF0aWMgUFRSIGNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSLCAgUFRSKSk7Ci0jZW5kaWYKLQwKLS8qIHZvaWQgd2FybmluZygpOyAqLwotCi0vKgotICogUmV0dXJuIGEgd29yZCB3aXRoIFNUWVBfKiAoc2NuaGRyLnNfZmxhZ3MpIGZsYWdzIHNldCB0byByZXByZXNlbnQgdGhlCi0gKiBpbmNvbWluZyBTRUNfKiBmbGFncy4gIFRoZSBpbnZlcnNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgc3R5cF90b19zZWNfZmxhZ3MoKS4KLSAqIE5PVEU6IElmIHlvdSBhZGQgdG8vY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IHNob3VsZCBtaXJyb3IgdGhlIGNoYW5nZXMKLSAqIAlpbiBzdHlwX3RvX3NlY19mbGFncygpLgotICovCi1zdGF0aWMgbG9uZwotc2VjX3RvX3N0eXBfZmxhZ3MgKHNlY19uYW1lLCBzZWNfZmxhZ3MpCi0gICAgIENPTlNUIGNoYXIgKnNlY19uYW1lOwotICAgICBmbGFnd29yZCBzZWNfZmxhZ3M7Ci17Ci0gIGxvbmcgc3R5cF9mbGFncyA9IDA7Ci0KLSAgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfVEVYVCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfVEVYVDsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfREFUQSkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfREFUQTsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfQlNTKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9CU1M7Ci0jaWZkZWYgX0NPTU1FTlQKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfQ09NTUVOVCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfSU5GTzsKLSNlbmRpZiAvKiBfQ09NTUVOVCAqLwotI2lmZGVmIF9MSUIKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfTElCKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MSUI7Ci0jZW5kaWYgLyogX0xJQiAqLwotI2lmZGVmIF9MSVQKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJjbXAgKHNlY19uYW1lLCBfTElUKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9MSVQ7Ci0jZW5kaWYgLyogX0xJVCAqLwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsICIuZGVidWciKSkKLSAgICB7Ci0jaWZkZWYgU1RZUF9ERUJVRwotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfREVCVUc7Ci0jZWxzZQotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfSU5GTzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoIXN0cm5jbXAgKHNlY19uYW1lLCAiLnN0YWIiLCA1KSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9JTkZPOwotICAgIH0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsICIuZWRhdGEiKSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSNlbmRpZgotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICghc3RyY21wIChzZWNfbmFtZSwgX1BBRCkpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfUEFEOwotICAgIH0KLSAgZWxzZSBpZiAoIXN0cmNtcCAoc2VjX25hbWUsIF9MT0FERVIpKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX0xPQURFUjsKLSAgICB9Ci0jZW5kaWYKLSAgLyogVHJ5IGFuZCBmaWd1cmUgb3V0IHdoYXQgaXQgc2hvdWxkIGJlICovCi0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19DT0RFKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfREFUQSkKLSAgICB7Ci0gICAgICBzdHlwX2ZsYWdzID0gU1RZUF9EQVRBOwotICAgIH0KLSAgZWxzZSBpZiAoc2VjX2ZsYWdzICYgU0VDX1JFQURPTkxZKQotICAgIHsKLSNpZmRlZiBTVFlQX0xJVAkJCS8qIDI5ayByZWFkb25seSB0ZXh0L2RhdGEgc2VjdGlvbiAqLwotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfTElUOwotI2Vsc2UKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHNlY19mbGFncyAmIFNFQ19MT0FEKQotICAgIHsKLSAgICAgIHN0eXBfZmxhZ3MgPSBTVFlQX1RFWFQ7Ci0gICAgfQotICBlbHNlIGlmIChzZWNfZmxhZ3MgJiBTRUNfQUxMT0MpCi0gICAgewotICAgICAgc3R5cF9mbGFncyA9IFNUWVBfQlNTOwotICAgIH0KLQotI2lmZGVmIFNUWVBfTk9MT0FECi0gIGlmICgoc2VjX2ZsYWdzICYgKFNFQ19ORVZFUl9MT0FEIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpKSAhPSAwKQotICAgIHN0eXBfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBpZiAoc2VjX2ZsYWdzICYgU0VDX0xJTktfT05DRSkKLSAgICBzdHlwX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOwotI2VuZGlmCi0KLSAgcmV0dXJuIChzdHlwX2ZsYWdzKTsKLX0KLS8qCi0gKiBSZXR1cm4gYSB3b3JkIHdpdGggU0VDXyogZmxhZ3Mgc2V0IHRvIHJlcHJlc2VudCB0aGUgaW5jb21pbmcKLSAqIFNUWVBfKiBmbGFncyAoZnJvbSBzY25oZHIuc19mbGFncykuICAgVGhlIGludmVyc2Ugb2YgdGhpcwotICogZnVuY3Rpb24gaXMgc2VjX3RvX3N0eXBfZmxhZ3MoKS4KLSAqIE5PVEU6IElmIHlvdSBhZGQgdG8vY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IHNob3VsZCBtaXJyb3IgdGhlIGNoYW5nZXMKLSAqICAgICAgaW4gc2VjX3RvX3N0eXBfZmxhZ3MoKS4KLSAqLwotc3RhdGljIGZsYWd3b3JkCi1zdHlwX3RvX3NlY19mbGFncyAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmludGVybmFsX3MgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBoZHI7Ci0gIGxvbmcgc3R5cF9mbGFncyA9IGludGVybmFsX3MtPnNfZmxhZ3M7Ci0gIGZsYWd3b3JkIHNlY19mbGFncyA9IDA7Ci0KLSNpZmRlZiBTVFlQX05PTE9BRAotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0jZW5kaWYgLyogU1RZUF9OT0xPQUQgKi8KLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmIChzdHlwX2ZsYWdzICYgU1RZUF9URVhUKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0RBVEEpCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotICAgIHsKLSNpZmRlZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotI2VuZGlmCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pCi0gICAgewotICAgICAgLyogV2UgbWFyayB0aGVzZSBhcyBTRUNfREVCVUdHSU5HLCBidXQgb25seSBpZiBDT0ZGX1BBR0VfU0laRSBpcwotCSBkZWZpbmVkLiAgY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgdXNlcwotCSBDT0ZGX1BBR0VfU0laRSB0byBlbnN1cmUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdHMgb2YgdGhlCi0JIHNlY3Rpb24gVk1BIGFuZCB0aGUgZmlsZSBvZmZzZXQgbWF0Y2guICBJZiB3ZSBkb24ndCBrbm93Ci0JIENPRkZfUEFHRV9TSVpFLCB3ZSBjYW4ndCBlbnN1cmUgdGhlIGNvcnJlY3QgY29ycmVzcG9uZGVuY2UsCi0JIGFuZCBkZW1hbmQgcGFnZSBsb2FkaW5nIG9mIHRoZSBmaWxlIHdpbGwgZmFpbC4gICovCi0jaWYgZGVmaW5lZCAoQ09GRl9QQUdFX1NJWkUpICYmICFkZWZpbmVkIChDT0ZGX0FMSUdOX0lOX1NfRkxBR1MpCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoc3R5cF9mbGFncyAmIFNUWVBfUEFEKQotICAgIHsKLSAgICAgIHNlY19mbGFncyA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9URVhUKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChzZWNfZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfQ09GRl9TSEFSRURfTElCUkFSWTsKLSAgICAgIGVsc2UKLQlzZWNfZmxhZ3MgfD0gU0VDX0NPREUgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RBVEEpID09IDApCi0gICAgewotICAgICAgaWYgKHNlY19mbGFncyAmIFNFQ19ORVZFUl9MT0FEKQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotCXNlY19mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQlNTKSA9PSAwKQotICAgIHsKLSNpZmRlZiBCU1NfTk9MT0FEX0lTX1NIQVJFRF9MSUJSQVJZCi0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19DT0ZGX1NIQVJFRF9MSUJSQVJZOwotICAgICAgZWxzZQotI2VuZGlmCi0Jc2VjX2ZsYWdzIHw9IFNFQ19BTExPQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kZWJ1ZyIpID09IDAKLSNpZmRlZiBfQ09NTUVOVAotCSAgIHx8IHN0cmNtcCAobmFtZSwgX0NPTU1FTlQpID09IDAKLSNlbmRpZgotCSAgIHx8IHN0cm5jbXAgKG5hbWUsICIuc3RhYiIsIDUpID09IDApCi0gICAgewotI2lmZGVmIENPRkZfUEFHRV9TSVpFCi0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLSNlbmRpZgotICAgIH0KLSNpZmRlZiBfTElCCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJQikgPT0gMCkKLSAgICA7Ci0jZW5kaWYKLSNpZmRlZiBfTElUCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVCkgPT0gMCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLSAgICB9Ci0KLSNpZmRlZiBTVFlQX0xJVAkJCS8qIEEyOWsgcmVhZG9ubHkgdGV4dC9kYXRhIHNlY3Rpb24gdHlwZSAqLwotICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0xJVCkgPT0gU1RZUF9MSVQpCi0gICAgewotICAgICAgc2VjX2ZsYWdzID0gKFNFQ19MT0FEIHwgU0VDX0FMTE9DIHwgU0VDX1JFQURPTkxZKTsKLSAgICB9Ci0jZW5kaWYgLyogU1RZUF9MSVQgKi8KLSNpZmRlZiBTVFlQX09USEVSX0xPQUQJCS8qIE90aGVyIGxvYWRlZCBzZWN0aW9ucyAqLwotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfT1RIRVJfTE9BRCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgPSAoU0VDX0xPQUQgfCBTRUNfQUxMT0MpOwotICAgIH0KLSNlbmRpZiAvKiBTVFlQX1NEQVRBICovCi0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX1JFTU9WRSkKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKHN0eXBfZmxhZ3MgJiBJTUFHRV9TQ05fTE5LX0NPTURBVCkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfT05DRTsKLQotICAgICAgLyogVW5mb3J0dW5hdGVseSwgdGhlIFBFIGZvcm1hdCBzdG9yZXMgZXNzZW50aWFsIGluZm9ybWF0aW9uIGluCi0gICAgICAgICB0aGUgc3ltYm9sIHRhYmxlLCBvZiBhbGwgcGxhY2VzLiAgV2UgbmVlZCB0byBleHRyYWN0IHRoYXQKLSAgICAgICAgIGluZm9ybWF0aW9uIG5vdywgc28gdGhhdCBvYmpkdW1wIGFuZCB0aGUgbGlua2VyIHdpbGwga25vdyBob3cKLSAgICAgICAgIHRvIGhhbmRsZSB0aGUgc2VjdGlvbiB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZSBzeW1ib2xzLiAgV2UKLSAgICAgICAgIGNhbid0IGNhbGwgc2x1cnBfc3ltdGFiLCBiZWNhdXNlIHRoZSBsaW5rZXIgZG9lc24ndCB3YW50IHRoZQotICAgICAgICAgc3dhcHBlZCBzeW1ib2xzLiAgKi8KLQotICAgICAgLyogQ09NREFUIHNlY3Rpb25zIGFyZSBzcGVjaWFsLiAgVGhlIGZpcnN0IHN5bWJvbCBpcyB0aGUgc2VjdGlvbgotCSBzeW1ib2wsIHdoaWNoIHRlbGxzIHdoYXQga2luZCBvZiBDT01EQVQgc2VjdGlvbiBpdCBpcy4gIFRoZQotCSAqc2Vjb25kKiBzeW1ib2wgaXMgdGhlICJjb21kYXQgc3ltYm9sIiAtIHRoZSBvbmUgd2l0aCB0aGUKLQkgdW5pcXVlIG5hbWUuICBHTlUgdXNlcyB0aGUgc2VjdGlvbiBzeW1ib2wgZm9yIHRoZSB1bmlxdWUKLQkgbmFtZTsgTVMgdXNlcyAiLnRleHQiIGZvciBldmVyeSBjb21kYXQgc2VjdGlvbi4gIFNpZ2guICAtIERKICovCi0KLSAgICAgIGlmIChfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotCXsKLQkgIGJmZF9ieXRlICplc3ltLCAqZXN5bWVuZDsKLQotCSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLQkgIGVzeW1lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogU1lNRVNaOwotCi0JICB3aGlsZSAoZXN5bSA8IGVzeW1lbmQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJmlzeW0pOwotCi0JICAgICAgaWYgKHNpemVvZiAoaW50ZXJuYWxfcy0+c19uYW1lKSA+IFNZTU5NTEVOKQotCQl7Ci0JCSAgLyogVGhpcyBjYXNlIGltcGxpZXMgdGhhdCB0aGUgbWF0Y2hpbmcgc3ltYm9sIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIGlmIChpc3ltLm5fc2NsYXNzID09IENfU1RBVAotCQkgICYmIGlzeW0ubl90eXBlID09IFRfTlVMTAotCQkgICYmIGlzeW0ubl9udW1hdXggPT0gMSkKLQkJewotCQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JCSAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCQkgIHN5bW5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZpc3ltLCBidWYpOwotCQkgIGlmIChzeW1uYW1lID09IE5VTEwpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIGlmIChzdHJjbXAgKG5hbWUsIHN5bW5hbWUpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0KLQkJICAgICAgLyogVGhpcyBpcyB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSAoZXN5bSArIFNZTUVTWiksCi0JCQkJCSAgICBpc3ltLm5fdHlwZSwgaXN5bS5uX3NjbGFzcywKLQkJCQkJICAgIDAsIGlzeW0ubl9udW1hdXgsIChQVFIpICZhdXgpOwotCi0JCSAgICAgIC8qIEZJWE1FOiBNaWNyb3NvZnQgdXNlcyBOT0RVUExJQ0FURVMgYW5kCi0JCQkgQVNTT0NJQVRJVkUsIGJ1dCBnbnUgdXNlcyBBTlkgYW5kIFNBTUVfU0laRS4KLQkJCSBVbmZvcnR1bmF0ZWx5LCBnbnUgZG9lc24ndCBkbyB0aGUgY29tZGF0Ci0JCQkgc3ltYm9scyByaWdodC4gIFNvLCB1bnRpbCB3ZSBjYW4gZml4IGl0IHRvIGRvCi0JCQkgdGhlIHJpZ2h0IHRoaW5nLCB3ZSBhcmUgdGVtcG9yYXJpbHkgZGlzYWJsaW5nCi0JCQkgY29tZGF0cyBmb3IgdGhlIE1TIHR5cGVzICh0aGV5J3JlIHVzZWQgaW4KLQkJCSBETExzIGFuZCBDKyssIGJ1dCB3ZSBkb24ndCBzdXBwb3J0ICp0aGVpcioKLQkJCSBDKysgbGlicmFyaWVzIGFueXdheSAtIERKICovCi0KLQkJICAgICAgc3dpdGNoIChhdXgueF9zY24ueF9jb21kYXQpCi0JCQl7Ci0JCQljYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTOgotI2lmIDAKLQkJCSAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk7Ci0jZWxzZQotCQkJICBzZWNfZmxhZ3MgJj0gflNFQ19MSU5LX09OQ0U7Ci0jZW5kaWYKLQkJCSAgYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQljYXNlIElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOgotCQkJICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotCQkJICBicmVhazsKLQotCQkJY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRToKLQkJCSAgc2VjX2ZsYWdzIHw9IFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9TSVpFOwotCQkJICBicmVhazsKLQotCQkJY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOgotCQkJICBzZWNfZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOwotCQkJICBicmVhazsKLQotCQkJY2FzZSBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFOgotI2lmIDAKLQkJCSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC4gICovCi0JCQkgIHNlY19mbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ7Ci0jZWxzZQotCQkJICBzZWNfZmxhZ3MgJj0gflNFQ19MSU5LX09OQ0U7Ci0jZW5kaWYKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0KLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGVzeW0gKz0gKGlzeW0ubl9udW1hdXggKyAxKSAqIFNZTUVTWjsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gKHNlY19mbGFncyk7Ci19Ci0KLSNkZWZpbmUJZ2V0X2luZGV4KHN5bWJvbCkJKChzeW1ib2wpLT51ZGF0YS5pKQotCi0vKgotSU5URVJOQUxfREVGSU5JVElPTgotCWJmZF9jb2ZmX2JhY2tlbmRfZGF0YQotCi1DT0RFX0ZSQUdNRU5UCi0KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnZGIgdG8gc3dhcCBpbiBjb2ZmIHN5bWJvbCB0YWJsZSBwYXJ0czoKLS50eXBlZGVmIHN0cnVjdAotLnsKLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9hdXhfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLS4gICAgICAgaW50ICAgICAgICAgICAgIHR5cGUsCi0uICAgICAgIGludCAgICAgICAgICAgICBjbGFzcywKLS4gICAgICAgaW50ICAgICAgICAgICAgIGluZGF1eCwKLS4gICAgICAgaW50ICAgICAgICAgICAgIG51bWF1eCwKLS4gICAgICAgUFRSICAgICAgICAgICAgIGluKSk7Ci0uCi0uICB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc3ltX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQgLAotLiAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLS4gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICAgICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICAgICAgICAgZXh0LAotLiAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLS4KLQotU3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIGdhcyB0byBzd2FwIG91dCBjb2ZmIHBhcnRzOgotCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAJKmFiZmQsCi0uICAgICAgIFBUUglpbiwKLS4gICAgICAgaW50ICAgIAl0eXBlLAotLiAgICAgICBpbnQgICAgCWNsYXNzLAotLiAgICAgICBpbnQgICAgIGluZGF1eCwKLS4gICAgICAgaW50ICAgICBudW1hdXgsCi0uICAgICAgIFBUUiAgICAJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3N5bV9vdXQpIFBBUkFNUyAoKAotLiAgICAgIGJmZCAgICAgICphYmZkLAotLiAgICAgIFBUUglpbiwKLS4gICAgICBQVFIJZXh0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgICAJKmFiZmQsCi0uICAgICAgCVBUUglpbiwKLS4JUFRSCWV4dCkpOwotLgotLiB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgICAgICphYmZkLAotLiAgICAgCVBUUglzcmMsCi0uCVBUUglkc3QpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgIAkqYWJmZCwKLS4JUFRSIAlpbiwKLS4JUFRSIAlvdXQpKTsKLS4KLS4gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgCSphYmZkLAotLglQVFIgCWluLAotLglQVFIJb3V0KSk7Ci0uCi0uIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIFBBUkFNUyAoKAotLiAgICAgIAliZmQgIAkqYWJmZCwKLS4gICAgICAJUFRSCWluLAotLglQVFIJb3V0KSk7Ci0uCi0KLVNwZWNpYWwgZW50cnkgcG9pbnRzIGZvciBnZW5lcmljIENPRkYgcm91dGluZXMgdG8gY2FsbCB0YXJnZXQKLWRlcGVuZGVudCBDT0ZGIHJvdXRpbmVzOgotCi0uIHVuc2lnbmVkIGludCBfYmZkX2ZpbGhzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfYW91dHN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9zY25oc3o7Ci0uIHVuc2lnbmVkIGludCBfYmZkX3N5bWVzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfYXV4ZXN6OwotLiB1bnNpZ25lZCBpbnQgX2JmZF9yZWxzejsKLS4gdW5zaWduZWQgaW50IF9iZmRfbGluZXN6OwotLiBib29sZWFuIF9iZmRfY29mZl9sb25nX2ZpbGVuYW1lczsKLS4gYm9vbGVhbiBfYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzOwotLiB1bnNpZ25lZCBpbnQgX2JmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXI7Ci0uIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgaW4pKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGV4dCwKLS4gICAgICAgUFRSICAgICBpbikpOwotLiB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgaW4pKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgUFRSICAgICBleHQsCi0uICAgICAgIFBUUiAgICAgaW4pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLS4gUFRSICgqX2JmZF9jb2ZmX21rb2JqZWN0X2hvb2spIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfYW91dGhkcikpOwotLiBmbGFnd29yZCAoKl9iZmRfc3R5cF90b19zZWNfZmxhZ3NfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyLAotLiAgICAgICBjb25zdCBjaGFyICpuYW1lKSk7Ci0uIHZvaWQgKCpfYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAgICAgKmFiZmQsCi0uICAgICAgIGFzZWN0aW9uICpzZWMsCi0uICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgICAgICphYmZkLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0pKTsKLS4gYm9vbGVhbiAoKl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0uICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgsCi0uICAgICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3ByaW50X2F1eCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgRklMRSAqZmlsZSwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLS4gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sLAotLiAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgsCi0uICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgpKTsKLS4gdm9pZCAoKl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICAgICAqYWJmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyLAotLiAgICAgICBhcmVsZW50ICpyZWxvYywKLS4gICAgICAgYmZkX2J5dGUgKmRhdGEsCi0uICAgICAgIHVuc2lnbmVkIGludCAqc3JjX3B0ciwKLS4gICAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyKSk7Ci0uIGludCAoKl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKSBQQVJBTVMgKCgKLS4gICAgICAgYmZkICphYmZkLAotLiAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLS4gICAgICAgYXJlbGVudCAqciwKLS4gICAgICAgdW5zaWduZWQgaW50IHNocmluaywKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwpIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCkpOwotLiBib29sZWFuICgqX2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspIFBBUkFNUyAoKAotLiAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbikgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0uICAgICAgIGJmZCAqaW5wdXRfYmZkLAotLiAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLS4gICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotLiAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jcywKLS4gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltcywKLS4gICAgICAgYXNlY3Rpb24gKipzZWN0aW9ucykpOwotLiByZWxvY19ob3d0b190eXBlICooKl9iZmRfY29mZl9ydHlwZV90b19ob3d0bykgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgYXNlY3Rpb24gKnNlYywKLS4gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWwsCi0uICAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLS4gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltLAotLiAgICAgICBiZmRfdm1hICphZGRlbmRwKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqb2JmZCwKLS4gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0uICAgICAgIGJmZCAqaWJmZCwKLS4gICAgICAgYXNlY3Rpb24gKnNlYywKLS4gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvYywKLS4gICAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotLiAgICAgICBiZmQgKmFiZmQsCi0uICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0uICAgICAgIGZsYWd3b3JkIGZsYWdzLCAKLS4gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0uICAgICAgIGJmZF92bWEgdmFsdWUsCi0uICAgICAgIGNvbnN0IGNoYXIgKnN0cmluZywKLS4gICAgICAgYm9vbGVhbiBjb3B5LAotLiAgICAgICBib29sZWFuIGNvbGxlY3QsIAotLiAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwKSk7Ci0uCi0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSBQQVJBTVMgKCgKLS4JYmZkICogYWJmZCwKLS4gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0uIGJvb2xlYW4gKCpfYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSBQQVJBTVMgKCgKLS4JYmZkICogYWJmZCwKLS4Jc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0uCi0ufSBiZmRfY29mZl9iYWNrZW5kX2RhdGE7Ci0uCi0uI2RlZmluZSBjb2ZmX2JhY2tlbmRfaW5mbyhhYmZkKSAoKGJmZF9jb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X2luKGEsZSx0LGMsaW5kLG51bSxpKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X2luKSAoYSxlLHQsYyxpbmQsbnVtLGkpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1faW4oYSxlLGkpIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9zeW1faW4pIChhLGUsaSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19pbihhLGUsaSkgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoIGEpLT5fYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIChhLGUsaSkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX291dChhYmZkLCBpLCBvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0KSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQoYWJmZCwgaSwgbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2xpbmVub19vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X291dChhLGksdCxjLGluZCxudW0sbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIChhLGksdCxjLGluZCxudW0sbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgKGFiZmQsIGksIG8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQoYWJmZCwgaSxvKSBcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2ZpbGhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbGhzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX2FvdXRzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2FvdXRzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX3NjbmhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3NjbmhzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX3N5bWVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N5bWVzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX2F1eGVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2F1eGVzeikKLS4jZGVmaW5lIGJmZF9jb2ZmX3JlbHN6KGFiZmQpICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3JlbHN6KQotLiNkZWZpbmUgYmZkX2NvZmZfbGluZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfbGluZXN6KQotLiNkZWZpbmUgYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMoYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xvbmdfZmlsZW5hbWVzKQotLiNkZWZpbmUgYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzKGFiZmQpIFwKLS4gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpCi0uI2RlZmluZSBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKGFiZmQpIFwKLS4JIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyKQotLiNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKGFiZmQsIGksbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2ZpbGVoZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbihhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luKSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbihhYmZkLCBpLG8pIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zY25oZHJfaW4pIChhYmZkLCBpLCBvKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4oYWJmZCwgaSwgbykgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSAoYWJmZCwgaSwgbykpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2soYWJmZCwgZmlsZWhkcikgXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9iYWRfZm9ybWF0X2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayhhYmZkLCBmaWxlaGRyKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc2V0X2FyY2hfbWFjaF9ob29rKSAoYWJmZCwgZmlsZWhkcikpCi0uI2RlZmluZSBiZmRfY29mZl9ta29iamVjdF9ob29rKGFiZmQsIGZpbGVoZHIsIGFvdXRoZHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ta29iamVjdF9ob29rKSAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zdHlwX3RvX3NlY19mbGFnc19ob29rKGFiZmQsIHNjbmhkciwgbmFtZSlcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSAoYWJmZCwgc2NuaGRyLCBuYW1lKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayhhYmZkLCBzZWMsIHNjbmhkcilcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUoYWJmZClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3ltbmFtZV9pbl9kZWJ1ZyhhYmZkLCBzeW0pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX3ByaW50X2F1eChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLS4gICAgICAgICAoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKVwKLS4gICAgICAgICAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwgZHN0X3B0cikpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKGFiZmQsIHNlY3Rpb24sIHJlbG9jLCBzaHJpbmssIGxpbmtfaW5mbylcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUpXAotLiAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotLgotLiNkZWZpbmUgYmZkX2NvZmZfc3ltX2lzX2dsb2JhbChhYmZkLCBzeW0pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsKVwKLS4gICAgICAgICAoYWJmZCwgc3ltKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyhhYmZkKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zKVwKLS4gICAgICAgICAoYWJmZCkpCi0uCi0uI2RlZmluZSBiZmRfY29mZl9zdGFydF9maW5hbF9saW5rKG9iZmQsIGluZm8pXAotLiAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAob2JmZCktPl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKVwKLS4gICAgICAgICAob2JmZCwgaW5mbykpCi0uI2RlZmluZSBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uKG9iZmQsaW5mbyxpYmZkLG8sY29uLHJlbCxpc3ltcyxzZWNzKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGliZmQpLT5fYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbilcCi0uICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIG8sIGNvbiwgcmVsLCBpc3ltcywgc2VjcykpCi0uI2RlZmluZSBiZmRfY29mZl9ydHlwZV90b19ob3d0byhhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKVwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pXAotLiAgICAgICAgIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2FkanVzdF9zeW1uZHgob2JmZCwgaW5mbywgaWJmZCwgc2VjLCByZWwsIGFkanVzdGVkcClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2FkanVzdF9zeW1uZHgpXAotLiAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2woaW5mbyxhYmZkLG5hbWUsZmxhZ3Msc2VjdGlvbix2YWx1ZSxzdHJpbmcsY3AsY29sbCxoYXNocClcCi0uICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wpXAotLiAgICAgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY3AsIGNvbGwsIGhhc2hwKSkKLS4KLS4jZGVmaW5lIGJmZF9jb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1bihhLHApIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSAoYSxwKSkKLS4jZGVmaW5lIGJmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdChhLHApIFwKLS4gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KSAoYSxwKSkKLS4KLSovCi0KLS8qIFNlZSB3aGV0aGVyIHRoZSBtYWdpYyBudW1iZXIgbWF0Y2hlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2JhZF9mb3JtYXRfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgaWYgKEJBRE1BRyAoKmludGVybmFsX2YpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBpZiB0aGUgb3B0aW9uYWwgaGVhZGVyIGlzIE5VTEwgb3Igbm90IHRoZSBjb3JyZWN0IHNpemUgdGhlbgotICAgICBxdWl0OyB0aGUgb25seSBkaWZmZXJlbmNlIEkgY2FuIHNlZSBiZXR3ZWVuIG04OGsgZGd1eCBoZWFkZXJzIChNQzg4RE1BR0lDKQotICAgICBhbmQgSW50ZWwgOTYwIHJlYWR3cml0ZSBoZWFkZXJzIChJOTYwV1JNQUdJQykgaXMgdGhhdCB0aGUKLSAgICAgb3B0aW9uYWwgaGVhZGVyIGlzIG9mIGEgZGlmZmVyZW50IHNpemUuCi0KLSAgICAgQnV0IHRoZSBtaXBzIGtlZXBzIGV4dHJhIHN0dWZmIGluIGl0J3Mgb3B0aGRyLCBzbyBkb250IGNoZWNrCi0gICAgIHdoZW4gZG9pbmcgdGhhdAotICAgICAqLwotCi0jaWYgZGVmaW5lZChNODgpIHx8IGRlZmluZWQoSTk2MCkKLSAgaWYgKGludGVybmFsX2YtPmZfb3B0aGRyICE9IDAgJiYgQU9VVFNaICE9IGludGVybmFsX2YtPmZfb3B0aGRyKQotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotICAgaW5pdGlhbGl6ZSBhIHNlY3Rpb24gc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gcGVjdWxpYXIgdG8gdGhpcwotICAgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBjb2ZmCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZTsKLQotICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVI7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT50ZXh0X2FsaWduX3Bvd2VyICE9IDAKLSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlY3Rpb24pLCAiLnRleHQiKSA9PSAwKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHhjb2ZmX2RhdGEgKGFiZmQpLT50ZXh0X2FsaWduX3Bvd2VyOwotICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmRhdGFfYWxpZ25fcG93ZXIgIT0gMAotICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjdGlvbiksICIuZGF0YSIpID09IDApCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0geGNvZmZfZGF0YSAoYWJmZCktPmRhdGFfYWxpZ25fcG93ZXI7Ci0jZW5kaWYKLQotICAvKiBBbGxvY2F0ZSBhdXggcmVjb3JkcyBmb3Igc2VjdGlvbiBzeW1ib2xzLCB0byBzdG9yZSBzaXplIGFuZAotICAgICByZWxhdGVkIGluZm8uCi0KLSAgICAgQEAgVGhlIDEwIGlzIGEgZ3Vlc3MgYXQgYSBwbGF1c2libGUgbWF4aW11bSBudW1iZXIgb2YgYXV4IGVudHJpZXMKLSAgICAgKGJ1dCBzaG91bGRuJ3QgYmUgYSBjb25zdGFudCkuICAqLwotICBuYXRpdmUgPSAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChjb21iaW5lZF9lbnRyeV90eXBlKSAqIDEwKSk7Ci0gIGlmIChuYXRpdmUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgdXAgbl9uYW1lLCBuX3ZhbHVlLCBvciBuX3NjbnVtIGluIHRoZSBuYXRpdmUKLSAgICAgc3ltYm9sIGluZm9ybWF0aW9uLCBzaW5jZSB0aGV5J2xsIGJlIG92ZXJyaWRlbiBieSB0aGUgQkZEIHN5bWJvbAotICAgICBhbnlob3cuICBIb3dldmVyLCB3ZSBkbyBuZWVkIHRvIHNldCB0aGUgdHlwZSBhbmQgc3RvcmFnZSBjbGFzcywKLSAgICAgaW4gY2FzZSB0aGlzIHN5bWJvbCB3aW5kcyB1cCBnZXR0aW5nIHdyaXR0ZW4gb3V0LiAgVGhlIHZhbHVlIDAKLSAgICAgZm9yIG5fbnVtYXV4IGlzIGFscmVhZHkgY29ycmVjdC4gICovCi0KLSAgbmF0aXZlLT51LnN5bWVudC5uX3R5cGUgPSBUX05VTEw7Ci0gIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBDX1NUQVQ7Ci0KLSAgY29mZnN5bWJvbCAoc2VjdGlvbi0+c3ltYm9sKS0+bmF0aXZlID0gbmF0aXZlOwotCi0gIC8qIFRoZSAuc3RhYiBzZWN0aW9uIG11c3QgYmUgYWxpZ25lZCB0byAyKioyIGF0IG1vc3QsIGJlY2F1c2UKLSAgICAgb3RoZXJ3aXNlIHRoZXJlIG1heSBiZSBnYXBzIGluIHRoZSBzZWN0aW9uIHdoaWNoIGdkYiB3aWxsIG5vdAotICAgICBrbm93IGhvdyB0byBpbnRlcnByZXQuICBFeGFtaW5pbmcgdGhlIHNlY3Rpb24gbmFtZSBpcyBhIGhhY2ssIGJ1dAotICAgICB0aGF0IGlzIGFsc28gaG93IGdkYiBsb2NhdGVzIHRoZSBzZWN0aW9uLgotICAgICBXZSBuZWVkIHRvIGhhbmRsZSB0aGUgLmN0b3JzIGFuZCAuZHRvcnMgc2VjdGlvbnMgc2ltaWxhcmx5LCB0bwotICAgICBhdm9pZCBpbnRyb2R1Y2luZyBudWxsIHdvcmRzIGluIHRoZSB0YWJsZXMuICAqLwotICBpZiAoQ09GRl9ERUZBVUxUX1NFQ1RJT05fQUxJR05NRU5UX1BPV0VSID4gMgotICAgICAgJiYgKHN0cm5jbXAgKHNlY3Rpb24tPm5hbWUsICIuc3RhYiIsIDUpID09IDAKLQkgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5jdG9ycyIpID09IDAKLQkgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5kdG9ycyIpID09IDApKQotICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgLyogU2ltaWxhcmx5LCB0aGUgLnN0YWJzdHIgc2VjdGlvbiBtdXN0IGJlIGFsaWduZWQgdG8gMioqMCBhdCBtb3N0LiAgKi8KLSAgaWYgKENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUiA+IDAKLSAgICAgICYmIHN0cm5jbXAgKHNlY3Rpb24tPm5hbWUsICIuc3RhYnN0ciIsIDgpID09IDApCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmZGVmIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIKLQotLyogU2V0IHRoZSBhbGlnbm1lbnQgb2YgYSBCRkQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgUFRSIHNjbmhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgc2NuaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLQotI2lmZGVmIEk5NjAKLSAgLyogRXh0cmFjdCBBTElHTiBmcm9tIDIqKkFMSUdOIHN0b3JlZCBpbiBzZWN0aW9uIGhlYWRlciAqLwotICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKLSAgICBpZiAoKDEgPDwgaSkgPj0gaGRyLT5zX2FsaWduKQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBUSUM4MENPRkYKLSAgLyogVEkgdG9vbHMgaGlqYWNrIGJpdHMgOC0xMSBmb3IgdGhlIGFsaWdubWVudCAqLwotICBpID0gKGhkci0+c19mbGFncyA+PiA4KSAmIDB4RiA7Ci0jZW5kaWYKLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gaTsKLX0KLQotI2Vsc2UgLyogISBDT0ZGX0FMSUdOX0lOX1NFQ1RJT05fSEVBREVSICovCi0jaWZkZWYgQ09GRl9XSVRIX1BFCi0KLS8qIGEgY291cGxlIG9mIG1hY3JvcyB0byBoZWxwIHNldHRpbmcgdGhlIGFsaWdubWVudCBwb3dlciBmaWVsZCAqLwotI2RlZmluZSBBTElHTl9TRVQoZmllbGQseCx5KSBcCi0gIGlmICgoKGZpZWxkKSAmIElNQUdFX1NDTl9BTElHTl82NEJZVEVTKSA9PSB4IClcCi0gIHtcCi0gICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHk7XAotICB9Ci0KLSNkZWZpbmUgRUxJRkFMSUdOX1NFVChmaWVsZCx4LHkpIFwKLSAgZWxzZSBpZiAoKCAoZmllbGQpICYgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMpID09IHggKSBcCi0gIHtcCi0gICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHk7XAotICB9Ci0KLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgICAgUFRSIHNjbmhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgc2NuaGRyOwotCi0gIEFMSUdOX1NFVCAgICAgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzY0QllURVMsIDYpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzMyQllURVMsIDUpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMsIDQpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUywgIDMpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzRCWVRFUywgIDIpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUywgIDEpCi0gIEVMSUZBTElHTl9TRVQgKGhkci0+c19mbGFncywgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUywgIDApCi0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuaWRhdGEkMiIpID09IDApCi0gICAgewotICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQzIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLmlkYXRhJDQiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuaWRhdGEkNSIpID09IDApCi0gICAgewotICAgICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5pZGF0YSQ2IikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCAiLnJlbG9jIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIC8qIEluIGEgUEUgaW1hZ2UgZmlsZSwgdGhlIHNfcGFkZHIgZmllbGQgaG9sZHMgdGhlIHZpcnR1YWwgc2l6ZSBvZiBhCi0gICAgIHNlY3Rpb24sIHdoaWxlIHRoZSBzX3NpemUgZmllbGQgaG9sZHMgdGhlIHJhdyBzaXplLiAgKi8KLSAgaWYgKGhkci0+c19wYWRkciAhPSAwKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbikgPT0gTlVMTCkKLQl7Ci0JICBzZWN0aW9uLT51c2VkX2J5X2JmZCA9Ci0JICAgIChQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogUmV0dXJuIGVycm9yLiAgKi8KLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dGRhdGEgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWN0aW9uKS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBSZXR1cm4gZXJyb3IuICAqLwotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JfQotICAgICAgcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjdGlvbiktPnZpcnRfc2l6ZSA9IGhkci0+c19wYWRkcjsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICBzZWN0aW9uLT5sbWEgPSBoZHItPnNfdmFkZHI7Ci0jZW5kaWYKLX0KLSN1bmRlZiBBTElHTl9TRVQKLSN1bmRlZiBFTElGQUxJR05fU0VUCi0KLSNlbHNlIC8qICEgQ09GRl9XSVRIX1BFICovCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0KLS8qIFdlIGdyb3NzbHkgYWJ1c2UgdGhpcyBmdW5jdGlvbiB0byBoYW5kbGUgWENPRkYgb3ZlcmZsb3cgaGVhZGVycy4KLSAgIFdoZW4gd2Ugc2VlIG9uZSwgd2UgY29ycmVjdCB0aGUgcmVsb2MgYW5kIGxpbmUgbnVtYmVyIGNvdW50cyBpbiB0aGUKLSAgIHJlYWwgaGVhZGVyLCBhbmQgcmVtb3ZlIHRoZSBzZWN0aW9uIHdlIGp1c3QgY3JlYXRlZC4gICovCi0KLXN0YXRpYyB2b2lkIGNvZmZfc2V0X2FsaWdubWVudF9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLQotc3RhdGljIHZvaWQKLWNvZmZfc2V0X2FsaWdubWVudF9ob29rIChhYmZkLCBzZWN0aW9uLCBzY25oZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBzY25oZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKmhkciA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIHNjbmhkcjsKLSAgYXNlY3Rpb24gKnJlYWxfc2VjOwotICBhc2VjdGlvbiAqKnBzOwotCi0gIGlmICgoaGRyLT5zX2ZsYWdzICYgU1RZUF9PVlJGTE8pID09IDApCi0gICAgcmV0dXJuOwotCi0gIHJlYWxfc2VjID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBoZHItPnNfbnJlbG9jKTsKLSAgaWYgKHJlYWxfc2VjID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIHJlYWxfc2VjLT5yZWxvY19jb3VudCA9IGhkci0+c19wYWRkcjsKLSAgcmVhbF9zZWMtPmxpbmVub19jb3VudCA9IGhkci0+c192YWRkcjsKLQotICBmb3IgKHBzID0gJmFiZmQtPnNlY3Rpb25zOyAqcHMgIT0gTlVMTDsgcHMgPSAmKCpwcyktPm5leHQpCi0gICAgewotICAgICAgaWYgKCpwcyA9PSBzZWN0aW9uKQotCXsKLQkgICpwcyA9ICgqcHMpLT5uZXh0OwotCSAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotI2Vsc2UgLyogISBSUzYwMDBDT0ZGX0MgKi8KLQotI2RlZmluZSBjb2ZmX3NldF9hbGlnbm1lbnRfaG9vayBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpKSBiZmRfdm9pZCkKLQotI2VuZGlmIC8qICEgUlM2MDAwQ09GRl9DICovCi0jZW5kaWYgLyogISBDT0ZGX1dJVEhfUEUgKi8KLSNlbmRpZiAvKiAhIENPRkZfQUxJR05fSU5fU0VDVElPTl9IRUFERVIgKi8KLQotI2lmbmRlZiBjb2ZmX21rb2JqZWN0Ci0KLXN0YXRpYyBib29sZWFuIGNvZmZfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGFiZmQtPnRkYXRhLmNvZmZfb2JqX2RhdGEgPSAoc3RydWN0IGNvZmZfdGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChjb2ZmX2RhdGFfdHlwZSkpOwotICBpZiAoYWJmZC0+dGRhdGEuY29mZl9vYmpfZGF0YSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgY29mZiA9IGNvZmZfZGF0YSAoYWJmZCk7Ci0gIGNvZmYtPnN5bWJvbHMgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICBjb2ZmLT5jb252ZXJzaW9uX3RhYmxlID0gKHVuc2lnbmVkIGludCAqKSBOVUxMOwotICBjb2ZmLT5yYXdfc3ltZW50cyA9IChzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICopIE5VTEw7Ci0gIGNvZmYtPnJlbG9jYmFzZSA9IDA7Ci0gIGNvZmYtPmxvY2FsX3RvY19zeW1fbWFwID0gMDsKLQotLyogIG1ha2VfYWJzX3NlY3Rpb24oYWJmZCk7Ki8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZgotCi0vKiBDcmVhdGUgdGhlIENPRkYgYmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0jaWZuZGVmIGNvZmZfbWtvYmplY3RfaG9vawotc3RhdGljIFBUUgotY29mZl9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKiBhYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIGNvZmZfZGF0YV90eXBlICpjb2ZmOwotCi0gIGlmIChjb2ZmX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb2ZmID0gY29mZl9kYXRhIChhYmZkKTsKLQotICBjb2ZmLT5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJwotICAgICB1bmZvcnR1bmF0ZWx5IHZhcnkgYW1vbmcgY29mZiBpbXBsZW1lbnRhdGlvbnMuLi4gICovCi0gIGNvZmYtPmxvY2FsX25fYnRtYXNrID0gTl9CVE1BU0s7Ci0gIGNvZmYtPmxvY2FsX25fYnRzaGZ0ID0gTl9CVFNIRlQ7Ci0gIGNvZmYtPmxvY2FsX25fdG1hc2sgPSBOX1RNQVNLOwotICBjb2ZmLT5sb2NhbF9uX3RzaGlmdCA9IE5fVFNISUZUOwotICBjb2ZmLT5sb2NhbF9zeW1lc3ogPSBTWU1FU1o7Ci0gIGNvZmYtPmxvY2FsX2F1eGVzeiA9IEFVWEVTWjsKLSAgY29mZi0+bG9jYWxfbGluZXN6ID0gTElORVNaOwotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9Ci0gICAgb2JqX2NvbnZfdGFibGVfc2l6ZSAoYWJmZCkgPQotICAgICAgaW50ZXJuYWxfZi0+Zl9uc3ltczsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX1NIUk9CSikgIT0gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotICBpZiAoYW91dGhkciAhPSBOVUxMICYmIGludGVybmFsX2YtPmZfb3B0aGRyID49IEFPVVRTWikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqaW50ZXJuYWxfYSA9Ci0JKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfdGRhdGEgKnhjb2ZmOwotCi0gICAgICB4Y29mZiA9IHhjb2ZmX2RhdGEgKGFiZmQpOwotICAgICAgeGNvZmYtPmZ1bGxfYW91dGhkciA9IHRydWU7Ci0gICAgICB4Y29mZi0+dG9jID0gaW50ZXJuYWxfYS0+b190b2M7Ci0gICAgICB4Y29mZi0+c250b2MgPSBpbnRlcm5hbF9hLT5vX3NudG9jOwotICAgICAgeGNvZmYtPnNuZW50cnkgPSBpbnRlcm5hbF9hLT5vX3NuZW50cnk7Ci0gICAgICB4Y29mZi0+dGV4dF9hbGlnbl9wb3dlciA9IGludGVybmFsX2EtPm9fYWxnbnRleHQ7Ci0gICAgICB4Y29mZi0+ZGF0YV9hbGlnbl9wb3dlciA9IGludGVybmFsX2EtPm9fYWxnbmRhdGE7Ci0gICAgICB4Y29mZi0+bW9kdHlwZSA9IGludGVybmFsX2EtPm9fbW9kdHlwZTsKLSAgICAgIHhjb2ZmLT5jcHV0eXBlID0gaW50ZXJuYWxfYS0+b19jcHV0eXBlOwotICAgICAgeGNvZmYtPm1heGRhdGEgPSBpbnRlcm5hbF9hLT5vX21heGRhdGE7Ci0gICAgICB4Y29mZi0+bWF4c3RhY2sgPSBpbnRlcm5hbF9hLT5vX21heHN0YWNrOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQVJNIAotICAvKiBTZXQgdGhlIGZsYWdzIGZpZWxkIGZyb20gdGhlIENPRkYgaGVhZGVyIHJlYWQgaW4gKi8KLSAgaWYgKCEgX2JmZF9jb2ZmX2FybV9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgaW50ZXJuYWxfZi0+Zl9mbGFncykpCi0gICAgY29mZi0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gIAotICByZXR1cm4gKFBUUikgY29mZjsKLX0KLSNlbmRpZgotCi0vKiBEZXRlcm1pbmUgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLiAgRklYTUU6IFRoaXMgaXMgdGFyZ2V0Ci0gICBkZXBlbmRlbnQgYmVjYXVzZSB0aGUgbWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiB0aGUgdGFyZ2V0Ci0gICBkZXBlbmRlbnQgaGVhZGVyIGZpbGVzLiAgQnV0IHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIgbmVlZCBmb3IgdGhpcy4KLSAgIElmIHRoZSBtYWdpYyBudW1iZXJzIHdlcmUgbW92ZWQgdG8gYSBzZXBhcmF0ZSBmaWxlLCB0aGlzIGZ1bmN0aW9uCi0gICB3b3VsZCBiZSB0YXJnZXQgaW5kZXBlbmRlbnQgYW5kIHdvdWxkIGFsc28gYmUgbXVjaCBtb3JlIHN1Y2Nlc3NmdWwKLSAgIGF0IGxpbmtpbmcgdG9nZXRoZXIgQ09GRiBmaWxlcyBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgKGFiZmQsIGZpbGVoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGZpbGVoZHI7Ci17Ci0gIGxvbmcgbWFjaGluZTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0KLSAgbWFjaGluZSA9IDA7Ci0gIHN3aXRjaCAoaW50ZXJuYWxfZi0+Zl9tYWdpYykKLSAgICB7Ci0jaWZkZWYgUFBDTUFHSUMKLSAgICBjYXNlIFBQQ01BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0gICAgICBtYWNoaW5lID0gMDsgLyogd2hhdCBkb2VzIHRoaXMgbWVhbj8gKGtyaykgKi8KLSAgICAgIGJyZWFrOyAKLSNlbmRpZgotI2lmZGVmIEkzODZNQUdJQwotICAgIGNhc2UgSTM4Nk1BR0lDOgotICAgIGNhc2UgSTM4NlBUWE1BR0lDOgotICAgIGNhc2UgSTM4NkFJWE1BR0lDOgkJLyogRGFuYnVyeSBQUy8yIEFJWCBDIENvbXBpbGVyICovCi0gICAgY2FzZSBMWU5YQ09GRk1BR0lDOgkvKiBzaGFkb3dzIHRoZSBtNjhrIEx5bnggbnVtYmVyIGJlbG93LCBzaWdoICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBMjlLX01BR0lDX0JJRwotICAgIGNhc2UgQTI5S19NQUdJQ19CSUc6Ci0gICAgY2FzZSBBMjlLX01BR0lDX0xJVFRMRToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hMjlrOwotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSTU1BR0lDCi0gICAgY2FzZSBBUk1NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hcm07Ci0gICAgICBzd2l0Y2ggKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSykKLQl7Ci0gICAgICAgIGNhc2UgRl9BUk1fMjogIG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fMjsgIGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzJhOiBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzJhOyBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV8zOiAgbWFjaGluZSA9IGJmZF9tYWNoX2FybV8zOyAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNhc2UgRl9BUk1fM006IG1hY2hpbmUgPSBiZmRfbWFjaF9hcm1fM007IGJyZWFrOwotICAgICAgICBjYXNlIEZfQVJNXzQ6ICBtYWNoaW5lID0gYmZkX21hY2hfYXJtXzQ7ICBicmVhazsKLSAgICAgICAgY2FzZSBGX0FSTV80VDogbWFjaGluZSA9IGJmZF9tYWNoX2FybV80VDsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNQzY4TUFHSUMKLSAgICBjYXNlIE1DNjhNQUdJQzoKLSAgICBjYXNlIE02OE1BR0lDOgotI2lmZGVmIE1DNjhLQkNTTUFHSUMKLSAgICBjYXNlIE1DNjhLQkNTTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBBUE9MTE9NNjhLTUFHSUMKLSAgICBjYXNlIEFQT0xMT002OEtNQUdJQzoKLSNlbmRpZgotI2lmZGVmIExZTlhDT0ZGTUFHSUMKLSAgICBjYXNlIExZTlhDT0ZGTUFHSUM6Ci0jZW5kaWYKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tNjhrOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX202ODAyMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTUM4OE1BR0lDCi0gICAgY2FzZSBNQzg4TUFHSUM6Ci0gICAgY2FzZSBNQzg4RE1BR0lDOgotICAgIGNhc2UgTUM4OE9NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9tODhrOwotICAgICAgbWFjaGluZSA9IDg4MTAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBaOEtNQUdJQwotICAgIGNhc2UgWjhLTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfejhrOwotICAgICAgc3dpdGNoIChpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9NQUNITUFTSykKLQl7Ci0JY2FzZSBGX1o4MDAxOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAxOwotCSAgYnJlYWs7Ci0JY2FzZSBGX1o4MDAyOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEk4NjAKLSAgICBjYXNlIEk4NjBNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9pODYwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBJOTYwCi0jaWZkZWYgSTk2MFJPTUFHSUMKLSAgICBjYXNlIEk5NjBST01BR0lDOgotICAgIGNhc2UgSTk2MFJXTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTk2MDsKLSAgICAgIHN3aXRjaCAoRl9JOTYwVFlQRSAmIGludGVybmFsX2YtPmZfZmxhZ3MpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBGX0k5NjBDT1JFOgotCSAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwS0I6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwTUM6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9tYzsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwWEE6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF94YTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwQ0E6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jYTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwS0E6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwSlg6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9qeDsKLQkgIGJyZWFrOwotCWNhc2UgRl9JOTYwSFg6Ci0JICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9oeDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAgIGNhc2UgVTgwMlJPTUFHSUM6Ci0gICAgY2FzZSBVODAyV1JNQUdJQzoKLSAgICBjYXNlIFU4MDJUT0NNQUdJQzoKLSAgICAgIHsKLQlpbnQgY3B1dHlwZTsKLQotCWlmICh4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAhPSAtMSkKLQkgIGNwdXR5cGUgPSB4Y29mZl9kYXRhIChhYmZkKS0+Y3B1dHlwZSAmIDB4ZmY7Ci0JZWxzZQotCSAgewotCSAgICAvKiBXZSBkaWQgbm90IGdldCBhIHZhbHVlIGZyb20gdGhlIGEub3V0IGhlYWRlci4gIElmIHRoZQotCSAgICAgICBmaWxlIGhhcyBub3QgYmVlbiBzdHJpcHBlZCwgd2UgbWF5IGJlIGFibGUgdG8gZ2V0IHRoZQotCSAgICAgICBhcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlyc3Qgc3ltYm9sLCBpZiBpdAotCSAgICAgICBpcyBhIC5maWxlIHN5bWJvbC4gICovCi0JICAgIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPT0gMCkKLQkgICAgICBjcHV0eXBlID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYmZkX2J5dGUgYnVmW1NZTUVTWl07Ci0JCXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotCi0JCWlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLQkJICAgIHx8IGJmZF9yZWFkIChidWYsIDEsIFNZTUVTWiwgYWJmZCkgIT0gU1lNRVNaKQotCQkgIHJldHVybiBmYWxzZTsKLQkJY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgYnVmLCAoUFRSKSAmc3ltKTsKLQkJaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCSAgY3B1dHlwZSA9IHN5bS5uX3R5cGUgJiAweGZmOwotCQllbHNlCi0JCSAgY3B1dHlwZSA9IDA7Ci0JICAgICAgfQotCSAgfQotCi0JLyogRklYTUU6IFdlIGRvbid0IGhhbmRsZSBhbGwgY2FzZXMgaGVyZS4gICovCi0Jc3dpdGNoIChjcHV0eXBlKQotCSAgewotCSAgZGVmYXVsdDoKLQkgIGNhc2UgMDoKLSNpZmRlZiBQT1dFUk1BQwotCSAgICAvKiBQb3dlclBDIE1hY3MgdXNlIHRoZSBzYW1lIG1hZ2ljIG51bWJlcnMgYXMgUlMvNjAwMAotCSAgICAgICAoYmVjYXVzZSB0aGF0J3MgaG93IHRoZXkgd2VyZSBib290c3RyYXBwZWQgb3JpZ2luYWxseSksCi0JICAgICAgIGJ1dCB0aGV5IGFyZSBhbHdheXMgUG93ZXJQQyBhcmNoaXRlY3R1cmUuICAqLwotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDA7Ci0jZWxzZQotCSAgICBhcmNoID0gYmZkX2FyY2hfcnM2MDAwOwotCSAgICBtYWNoaW5lID0gNjAwMDsKLSNlbmRpZiAvKiBQT1dFUk1BQyAqLwotCSAgICBicmVhazsKLQotCSAgY2FzZSAxOgotCSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQkgICAgbWFjaGluZSA9IDYwMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6IC8qIDY0IGJpdCBQb3dlclBDICovCi0JICAgIGFyY2ggPSBiZmRfYXJjaF9wb3dlcnBjOwotCSAgICBtYWNoaW5lID0gNjIwOwotCSAgICBicmVhazsKLQkgIGNhc2UgMzoKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3Bvd2VycGM7Ci0JICAgIG1hY2hpbmUgPSAwOwotCSAgICBicmVhazsKLQkgIGNhc2UgNDoKLQkgICAgYXJjaCA9IGJmZF9hcmNoX3JzNjAwMDsKLQkgICAgbWFjaGluZSA9IDYwMDA7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFdFMzJLTUFHSUMKLSAgICBjYXNlIFdFMzJLTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfd2UzMms7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBIODMwME1BR0lDCi0gICAgY2FzZSBIODMwME1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwOwotICAgICAgLyogISEgRklYTUUgdGhpcyBwcm9iYWJseSBpc24ndCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgKi8KLSAgICAgIGFiZmQtPmZsYWdzIHw9IEJGRF9JU19SRUxBWEFCTEU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgSDgzMDBITUFHSUMKLSAgICBjYXNlIEg4MzAwSE1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2g4MzAwOwotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX2g4MzAwaDsKLSAgICAgIC8qICEhIEZJWE1FIHRoaXMgcHJvYmFibHkgaXNuJ3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzICovCi0gICAgICBhYmZkLT5mbGFncyB8PSBCRkRfSVNfUkVMQVhBQkxFOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4MzAwU01BR0lDCi0gICAgY2FzZSBIODMwMFNNQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9oODMwMDsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9oODMwMHM7Ci0gICAgICAvKiAhISBGSVhNRSB0aGlzIHByb2JhYmx5IGlzbid0IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gQkZEX0lTX1JFTEFYQUJMRTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTSF9BUkNIX01BR0lDX0JJRwotICAgIGNhc2UgU0hfQVJDSF9NQUdJQ19CSUc6Ci0gICAgY2FzZSBTSF9BUkNIX01BR0lDX0xJVFRMRToKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zaDsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4NTAwTUFHSUMKLSAgICBjYXNlIEg4NTAwTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaDg1MDA7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBTUEFSQ01BR0lDCi0gICAgY2FzZSBTUEFSQ01BR0lDOgotI2lmZGVmIExZTlhDT0ZGTUFHSUMKLSAgICBjYXNlIExZTlhDT0ZGTUFHSUM6Ci0jZW5kaWYKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIFRJQzMwTUFHSUMKLSAgICBjYXNlIFRJQzMwTUFHSUM6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfdGljMzA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgVElDODBfQVJDSF9NQUdJQwotICAgIGNhc2UgVElDODBfQVJDSF9NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF90aWM4MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBNQ09SRU1BR0lDCi0gICAgY2FzZSBNQ09SRU1BR0lDOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX21jb3JlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgkJCS8qIFVucmVhZGFibGUgaW5wdXQgZmlsZSB0eXBlICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBTWU1OQU1FX0lOX0RFQlVHCi0KLXN0YXRpYyBib29sZWFuIHN5bW5hbWVfaW5fZGVidWdfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1zeW1uYW1lX2luX2RlYnVnX2hvb2sgKGFiZmQsIHN5bSkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotewotICByZXR1cm4gU1lNTkFNRV9JTl9ERUJVRyAoc3ltKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotI2Vsc2UKLQotI2RlZmluZSBzeW1uYW1lX2luX2RlYnVnX2hvb2sgXAotICAoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpKSBiZmRfZmFsc2UKLQotI2VuZGlmCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQotLyogSGFuZGxlIHRoZSBjc2VjdCBhdXhlbnQgb2YgYSBDX0VYVCBvciBDX0hJREVYVCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vayAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICp0YWJsZV9iYXNlOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXg7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmF1eDsKLXsKLSAgaW50IGNsYXNzID0gc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzczsKLQotICBpZiAoKGNsYXNzID09IENfRVhUIHx8IGNsYXNzID09IENfSElERVhUKQotICAgICAgJiYgaW5kYXV4ICsgMSA9PSBzeW1ib2wtPnUuc3ltZW50Lm5fbnVtYXV4KQotICAgIHsKLSAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApID09IFhUWV9MRCkKLQl7Ci0JICBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ucCA9Ci0JICAgIHRhYmxlX2Jhc2UgKyBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubDsKLQkgIGF1eC0+Zml4X3NjbmxlbiA9IDE7Ci0JfQotCi0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBkbyBhbnkKLSAgICAgICAgIGZ1cnRoZXIgd29yayBvbiB0aGlzIGF1eGVudC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogUmV0dXJuIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgdGhpcyBhdXhlbnQgc2hvdWxkIGJlIGhhbmRsZWQgYnkKLSAgICAgdGhlIGNhbGxlci4gICovCi0gIHJldHVybiBmYWxzZTsKLX0KLQotI2Vsc2UKLSNpZmRlZiBJOTYwCi0KLS8qIFdlIGRvbid0IHdhbnQgdG8gcG9pbnRlcml6ZSBiYWwgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfcG9pbnRlcml6ZV9hdXhfaG9vawotICBQQVJBTVMgKChiZmQgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosCi0JICAgdW5zaWduZWQgaW50LCBjb21iaW5lZF9lbnRyeV90eXBlICopKTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wb2ludGVyaXplX2F1eF9ob29rIChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4OwotewotICAvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBkb24ndCB3YW50IHRvIHBvaW50ZXJpemUgdGhpcyBhdXggZW50cnksIHdoaWNoCi0gICAgIGlzIHRoZSBjYXNlIGZvciB0aGUgbGFzdGZpcnN0IGF1eCBlbnRyeSBmb3IgYSBDX0xFQUZQUk9DIHN5bWJvbC4gICovCi0gIHJldHVybiAoaW5kYXV4ID09IDEKLQkgICYmIChzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTEVBRlBST0MKLQkgICAgICB8fCBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTEVBRlNUQVQKLQkgICAgICB8fCBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTEVBRkVYVCkpOwotfQotCi0jZWxzZSAvKiAhIEk5NjAgKi8KLQotI2RlZmluZSBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2sgMAotCi0jZW5kaWYgLyogISBJOTYwICovCi0jZW5kaWYgLyogISBSUzYwMDBDT0ZGX0MgKi8KLQotLyogUHJpbnQgYW4gYXV4IGVudHJ5LiAgVGhpcyByZXR1cm5zIHRydWUgaWYgaXQgaGFzIHByaW50ZWQgaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3ByaW50X2F1eAotICBQQVJBTVMgKChiZmQgKiwgRklMRSAqLCBjb21iaW5lZF9lbnRyeV90eXBlICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwKLQkgICBjb21iaW5lZF9lbnRyeV90eXBlICosIHVuc2lnbmVkIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9wcmludF9hdXggKGFiZmQsIGZpbGUsIHRhYmxlX2Jhc2UsIHN5bWJvbCwgYXV4LCBpbmRhdXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZTsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXg7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRhdXg7Ci17Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGlmICgoc3ltYm9sLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0VYVAotICAgICAgIHx8IHN5bWJvbC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19ISURFWFQpCi0gICAgICAmJiBpbmRhdXggKyAxID09IHN5bWJvbC0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGNzZWN0IGVudHJ5LiAgKi8KLSAgICAgIGZwcmludGYgKGZpbGUsICJBVVggIik7Ci0gICAgICBpZiAoU01UWVBfU01UWVAgKGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3NtdHlwKSAhPSBYVFlfTEQpCi0JewotCSAgQkZEX0FTU0VSVCAoISBhdXgtPmZpeF9zY25sZW4pOwotCSAgZnByaW50ZiAoZmlsZSwgInZhbCAlNWxkIiwgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLmwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCAiaW5keCAiKTsKLQkgIGlmICghIGF1eC0+Zml4X3NjbmxlbikKLQkgICAgZnByaW50ZiAoZmlsZSwgIiU0bGQiLCBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKGZpbGUsICIlNGxkIiwKLQkJICAgICAobG9uZykgKGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wIC0gdGFibGVfYmFzZSkpOwotCX0KLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgICIgcHJtaHNoICVsZCBzbmhzaCAldSB0eXAgJWQgYWxnbiAlZCBjbHNzICV1IHN0YiAlbGQgc25zdGIgJXUiLAotCSAgICAgICBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9wYXJtaGFzaCwKLQkgICAgICAgKHVuc2lnbmVkIGludCkgYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc25oYXNoLAotCSAgICAgICBTTVRZUF9TTVRZUCAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApLAotCSAgICAgICBTTVRZUF9BTElHTiAoYXV4LT51LmF1eGVudC54X2NzZWN0Lnhfc210eXApLAotCSAgICAgICAodW5zaWduZWQgaW50KSBhdXgtPnUuYXV4ZW50LnhfY3NlY3QueF9zbWNsYXMsCi0JICAgICAgIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3N0YWIsCi0JICAgICAgICh1bnNpZ25lZCBpbnQpIGF1eC0+dS5hdXhlbnQueF9jc2VjdC54X3Nuc3RhYik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBSZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCBubyBzcGVjaWFsIGFjdGlvbiB3YXMgdGFrZW4uICAqLwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCi1TVUJTVUJTRUNUSU9OCi0JV3JpdGluZyByZWxvY2F0aW9ucwotCi0JVG8gd3JpdGUgcmVsb2NhdGlvbnMsIHRoZSBiYWNrIGVuZCBzdGVwcyB0aG91Z2ggdGhlCi0JY2Fub25pY2FsIHJlbG9jYXRpb24gdGFibGUgYW5kIGNyZWF0ZSBhbgotCUBjb2Rle2ludGVybmFsX3JlbG9jfS4gVGhlIHN5bWJvbCBpbmRleCB0byB1c2UgaXMgcmVtb3ZlZCBmcm9tCi0JdGhlIEBjb2Rle29mZnNldH0gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBzdXBwbGllZC4gIFRoZQotCWFkZHJlc3MgY29tZXMgZGlyZWN0bHkgZnJvbSB0aGUgc3VtIG9mIHRoZSBzZWN0aW9uIGJhc2UKLQlhZGRyZXNzIGFuZCB0aGUgcmVsb2NhdGlvbiBvZmZzZXQ7IHRoZSB0eXBlIGlzIGR1ZyBkaXJlY3RseQotCWZyb20gdGhlIGhvd3RvIGZpZWxkLiAgVGhlbiB0aGUgQGNvZGV7aW50ZXJuYWxfcmVsb2N9IGlzCi0Jc3dhcHBlZCBpbnRvIHRoZSBzaGFwZSBvZiBhbiBAY29kZXtleHRlcm5hbF9yZWxvY30gYW5kIHdyaXR0ZW4KLQlvdXQgdG8gZGlzay4KLQotKi8KLQotI2lmZGVmIFRBUkdfQVVYCi0KLXN0YXRpYyBpbnQgY29tcGFyZV9hcmVsZW50X3B0ciBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi0vKiBBVVgncyBsZCB3YW50cyByZWxvY2F0aW9ucyB0byBiZSBzb3J0ZWQgKi8KLXN0YXRpYyBpbnQKLWNvbXBhcmVfYXJlbGVudF9wdHIgKHgsIHkpCi0gICAgIGNvbnN0IFBUUiB4OwotICAgICBjb25zdCBQVFIgeTsKLXsKLSAgY29uc3QgYXJlbGVudCAqKmEgPSAoY29uc3QgYXJlbGVudCAqKikgeDsKLSAgY29uc3QgYXJlbGVudCAqKmIgPSAoY29uc3QgYXJlbGVudCAqKikgeTsKLSAgYmZkX3NpemVfdHlwZSBhYWRyID0gKCphKS0+YWRkcmVzczsKLSAgYmZkX3NpemVfdHlwZSBiYWRyID0gKCpiKS0+YWRkcmVzczsKLQotICByZXR1cm4gKGFhZHIgPCBiYWRyID8gLTEgOiBiYWRyIDwgYWFkciA/IDEgOiAwKTsKLX0KLQotI2VuZGlmIC8qIFRBUkdfQVVYICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX3JlbG9jcyAoYWJmZCwgZmlyc3RfdW5kZWYpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGludCBmaXJzdF91bmRlZjsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgc3RydWN0IGV4dGVybmFsX3JlbG9jIGRzdDsKLSAgICAgIGFyZWxlbnQgKipwOwotCi0jaWZuZGVmIFRBUkdfQVVYCi0gICAgICBwID0gcy0+b3JlbG9jYXRpb247Ci0jZWxzZQotICAgICAgLyogc29ydCByZWxvY2F0aW9ucyBiZWZvcmUgd2Ugd3JpdGUgdGhlbSBvdXQgKi8KLSAgICAgIHAgPSAoYXJlbGVudCAqKikgYmZkX21hbGxvYyAocy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICAgICAgaWYgKHAgPT0gTlVMTCAmJiBzLT5yZWxvY19jb3VudCA+IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtY3B5IChwLCBzLT5vcmVsb2NhdGlvbiwgcy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICAgICAgcXNvcnQgKHAsIHMtPnJlbG9jX2NvdW50LCBzaXplb2YgKGFyZWxlbnQgKiksIGNvbXBhcmVfYXJlbGVudF9wdHIpOwotI2VuZGlmCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5yZWxvY19jb3VudDsgaSsrKQotCXsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBuOwotCSAgYXJlbGVudCAqcSA9IHBbaV07Ci0JICBtZW1zZXQgKChQVFIpICYgbiwgMCwgc2l6ZW9mIChuKSk7Ci0KLQkgIC8qIE5vdyB3ZSd2ZSByZW51bWJlcmVkIHRoZSBzeW1ib2xzIHdlIGtub3cgd2hlcmUgdGhlCi0JICAgICB1bmRlZmluZWQgc3ltYm9scyBsaXZlIGluIHRoZSB0YWJsZS4gIENoZWNrIHRoZSByZWxvYwotCSAgICAgZW50cmllcyBmb3Igc3ltYm9scyB3aG8ncyBvdXRwdXQgYmZkIGlzbid0IHRoZSByaWdodCBvbmUuCi0JICAgICBUaGlzIGlzIGJlY2F1c2UgdGhlIHN5bWJvbCB3YXMgdW5kZWZpbmVkICh3aGljaCBtZWFucwotCSAgICAgdGhhdCBhbGwgdGhlIHBvaW50ZXJzIGFyZSBuZXZlciBtYWRlIHRvIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBwbGFjZSkuIFRoaXMgaXMgYSBiYWQgdGhpbmcsJ2NhdXNlIHRoZSBzeW1ib2xzIGF0dGFjaGVkCi0JICAgICB0byB0aGUgb3V0cHV0IGJmZCBhcmUgaW5kZXhlZCwgc28gdGhhdCB0aGUgcmVsb2NhdGlvbgotCSAgICAgZW50cmllcyBrbm93IHdoaWNoIHN5bWJvbCBpbmRleCB0aGV5IHBvaW50IHRvLiAgU28gd2UKLQkgICAgIGhhdmUgdG8gbG9vayB1cCB0aGUgb3V0cHV0IHN5bWJvbCBoZXJlLiAqLwotCi0JICBpZiAocS0+c3ltX3B0cl9wdHJbMF0tPnRoZV9iZmQgIT0gYWJmZCkKLQkgICAgewotCSAgICAgIGludCBpOwotCSAgICAgIGNvbnN0IGNoYXIgKnNuYW1lID0gcS0+c3ltX3B0cl9wdHJbMF0tPm5hbWU7Ci0JICAgICAgYXN5bWJvbCAqKm91dHN5bXMgPSBhYmZkLT5vdXRzeW1ib2xzOwotCSAgICAgIGZvciAoaSA9IGZpcnN0X3VuZGVmOyBvdXRzeW1zW2ldOyBpKyspCi0JCXsKLQkJICBjb25zdCBjaGFyICppbnRhYmxlID0gb3V0c3ltc1tpXS0+bmFtZTsKLQkJICBpZiAoc3RyY21wIChpbnRhYmxlLCBzbmFtZSkgPT0gMCkgewotCQkgICAgLyogZ290IGEgaGl0LCBzbyByZXBvaW50IHRoZSByZWxvYyAqLwotCQkgICAgcS0+c3ltX3B0cl9wdHIgPSBvdXRzeW1zICsgaTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkJfQotCSAgICB9Ci0KLQkgIG4ucl92YWRkciA9IHEtPmFkZHJlc3MgKyBzLT52bWE7Ci0KLSNpZmRlZiBSX0lIQ09OU1QKLQkgIC8qIFRoZSAyOWsgY29uc3QvY29uc3RoIHJlbG9jIHBhaXIgaXMgYSByZWFsIGtsdWRnZS4gIFRoZSBjb25zdGgKLQkgICAgIHBhcnQgZG9lc24ndCBoYXZlIGEgc3ltYm9sOyBpdCBoYXMgYW4gb2Zmc2V0LiAgU28gcmVidWlsdAotCSAgICAgdGhhdCBoZXJlLiAgKi8KLQkgIGlmIChxLT5ob3d0by0+dHlwZSA9PSBSX0lIQ09OU1QpCi0JICAgIG4ucl9zeW1uZHggPSBxLT5hZGRlbmQ7Ci0JICBlbHNlCi0jZW5kaWYKLQkgICAgaWYgKHEtPnN5bV9wdHJfcHRyKQotCSAgICAgIHsKLQkJaWYgKHEtPnN5bV9wdHJfcHRyID09IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyKQotCQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBhYnNvbHV0ZSBzeW1ib2wuICAqLwotCQkgIG4ucl9zeW1uZHggPSAtMTsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG4ucl9zeW1uZHggPSBnZXRfaW5kZXggKCgqKHEtPnN5bV9wdHJfcHRyKSkpOwotCQkgICAgLyogVGFrZSBub3RpY2UgaWYgdGhlIHN5bWJvbCByZWxvYyBwb2ludHMgdG8gYSBzeW1ib2wKLQkJICAgICAgIHdlIGRvbid0IGhhdmUgaW4gb3VyIHN5bWJvbCB0YWJsZS4gIFdoYXQgc2hvdWxkIHdlCi0JCSAgICAgICBkbyBmb3IgdGhpcz8/ICAqLwotCQkgICAgaWYgKG4ucl9zeW1uZHggPiBvYmpfY29udl90YWJsZV9zaXplIChhYmZkKSkKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgfQotCSAgICAgIH0KLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotCSAgbi5yX29mZnNldCA9IHEtPmFkZGVuZDsKLSNlbmRpZgotCi0jaWZkZWYgU0VMRUNUX1JFTE9DCi0JICAvKiBXb3JrIG91dCByZWxvYyB0eXBlIGZyb20gd2hhdCBpcyByZXF1aXJlZCAqLwotCSAgU0VMRUNUX1JFTE9DIChuLCBxLT5ob3d0byk7Ci0jZWxzZQotCSAgbi5yX3R5cGUgPSBxLT5ob3d0by0+dHlwZTsKLSNlbmRpZgotCSAgY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJm4sICZkc3QpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBkc3QsIDEsIFJFTFNaLCBhYmZkKSAhPSBSRUxTWikKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotI2lmZGVmIFRBUkdfQVVYCi0gICAgICBpZiAocCAhPSBOVUxMKQotCWZyZWUgKHApOwotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgZmxhZ3MgYW5kIG1hZ2ljIG51bWJlciBvZiBhIGNvZmYgZmlsZSBmcm9tIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotICAgdHlwZS4gIFJlc3VsdCBpcyB0cnVlIGlmIHdlIGNhbiByZXByZXNlbnQgdGhlIGFyY2gmdHlwZSwgZmFsc2UgaWYgbm90LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfc2V0X2ZsYWdzIChhYmZkLCBtYWdpY3AsIGZsYWdzcCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50ICptYWdpY3A7Ci0gICAgIHVuc2lnbmVkIHNob3J0ICpmbGFnc3A7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0jaWZkZWYgWjhLTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX3o4azoKLSAgICAgICptYWdpY3AgPSBaOEtNQUdJQzsKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF96ODAwMToKLQkgICpmbGFnc3AgPSBGX1o4MDAxOwotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF96ODAwMjoKLQkgICpmbGFnc3AgPSBGX1o4MDAyOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIEk5NjBST01BR0lDCi0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0KLSAgICAgIHsKLQl1bnNpZ25lZCBmbGFnczsKLQkqbWFnaWNwID0gSTk2MFJPTUFHSUM7Ci0JLyoKLQkgICgoYmZkX2dldF9maWxlX2ZsYWdzKGFiZmQpICYgV1BfVEVYVCkgPyBJOTYwUk9NQUdJQyA6Ci0JICBJOTYwUldNQUdJQyk7ICAgRklYTUU/Pz8KLQkgICovCi0Jc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCSAgewotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0JICAgIGZsYWdzID0gRl9JOTYwQ09SRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0JICAgIGZsYWdzID0gRl9JOTYwS0I7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotCSAgICBmbGFncyA9IEZfSTk2ME1DOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF94YToKLQkgICAgZmxhZ3MgPSBGX0k5NjBYQTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfY2E6Ci0JICAgIGZsYWdzID0gRl9JOTYwQ0E7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotCSAgICBmbGFncyA9IEZfSTk2MEtBOwotCSAgICBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfaTk2MF9qeDoKLQkgICAgZmxhZ3MgPSBGX0k5NjBKWDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX2k5NjBfaHg6Ci0JICAgIGZsYWdzID0gRl9JOTYwSFg7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSpmbGFnc3AgPSBmbGFnczsKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBUSUMzME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF90aWMzMDoKLSAgICAgICptYWdpY3AgPSBUSUMzME1BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBUSUM4MF9BUkNIX01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF90aWM4MDoKLSAgICAgICptYWdpY3AgPSBUSUM4MF9BUkNIX01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0jZW5kaWYKLSNpZmRlZiBBUk1NQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfYXJtOgotICAgICAgKiBtYWdpY3AgPSBBUk1NQUdJQzsKLSAgICAgICogZmxhZ3NwID0gMDsKLSAgICAgIGlmIChBUENTX1NFVCAoYWJmZCkpCi0JewotCSAgaWYgKEFQQ1NfMjZfRkxBRyAoYWJmZCkpCi0JICAgICogZmxhZ3NwIHw9IEZfQVBDUzI2OwotCSAgCi0JICBpZiAoQVBDU19GTE9BVF9GTEFHIChhYmZkKSkKLQkgICAgKiBmbGFnc3AgfD0gRl9BUENTX0ZMT0FUOwotCSAgCi0JICBpZiAoUElDX0ZMQUcgKGFiZmQpKQotCSAgICAqIGZsYWdzcCB8PSBGX1BJQzsKLQl9Ci0gICAgICBpZiAoSU5URVJXT1JLX1NFVCAoYWJmZCkgJiYgSU5URVJXT1JLX0ZMQUcgKGFiZmQpKQotCSogZmxhZ3NwIHw9IEZfSU5URVJXT1JLOwotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2FybV8yOiAgKiBmbGFnc3AgfD0gRl9BUk1fMjsgIGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzJhOiAqIGZsYWdzcCB8PSBGX0FSTV8yYTsgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fMzogICogZmxhZ3NwIHw9IEZfQVJNXzM7ICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2FybV8zTTogKiBmbGFnc3AgfD0gRl9BUk1fM007IGJyZWFrOwotCWNhc2UgYmZkX21hY2hfYXJtXzQ6ICAqIGZsYWdzcCB8PSBGX0FSTV80OyAgYnJlYWs7Ci0JY2FzZSBiZmRfbWFjaF9hcm1fNFQ6ICogZmxhZ3NwIHw9IEZfQVJNXzRUOyBicmVhazsKLQl9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotI2lmZGVmIFBQQ01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgKm1hZ2ljcCA9IFBQQ01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEkzODZNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgICptYWdpY3AgPSBJMzg2TUFHSUM7Ci0jaWZkZWYgTFlOWE9TCi0gICAgICAvKiBKdXN0IG92ZXJ3cml0ZSB0aGUgdXN1YWwgdmFsdWUgaWYgd2UncmUgZG9pbmcgTHlueC4gKi8KLSAgICAgICptYWdpY3AgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSTg2ME1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9pODYwOgotICAgICAgKm1hZ2ljcCA9IEk4NjBNQUdJQzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBNQzY4TUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0jaWZkZWYgQVBPTExPTTY4S01BR0lDCi0gICAgICAqbWFnaWNwID0gQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVI7Ci0jZWxzZQotICAgICAgLyogTkFNRVNfSEFWRV9VTkRFUlNDT1JFIG1heSBiZSBkZWZpbmVkIGJ5IGNvZmYtdTY4ay5jLiAgKi8KLSNpZmRlZiBOQU1FU19IQVZFX1VOREVSU0NPUkUKLSAgICAgICptYWdpY3AgPSBNQzY4S0JDU01BR0lDOwotI2Vsc2UKLSAgICAgICptYWdpY3AgPSBNQzY4TUFHSUM7Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIExZTlhPUwotICAgICAgLyogSnVzdCBvdmVyd3JpdGUgdGhlIHVzdWFsIHZhbHVlIGlmIHdlJ3JlIGRvaW5nIEx5bnguICovCi0gICAgICAqbWFnaWNwID0gTFlOWENPRkZNQUdJQzsKLSNlbmRpZgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgTUM4OE1BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9tODhrOgotICAgICAgKm1hZ2ljcCA9IE1DODhPTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgSDgzMDBNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBzd2l0Y2ggKGJmZF9nZXRfbWFjaCAoYWJmZCkpCi0JewotCWNhc2UgYmZkX21hY2hfaDgzMDA6Ci0JICAqbWFnaWNwID0gSDgzMDBNQUdJQzsKLQkgIHJldHVybiB0cnVlOwotCWNhc2UgYmZkX21hY2hfaDgzMDBoOgotCSAgKm1hZ2ljcCA9IEg4MzAwSE1BR0lDOwotCSAgcmV0dXJuIHRydWU7Ci0JY2FzZSBiZmRfbWFjaF9oODMwMHM6Ci0JICAqbWFnaWNwID0gSDgzMDBTTUFHSUM7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU0hfQVJDSF9NQUdJQ19CSUcKLSAgICBjYXNlIGJmZF9hcmNoX3NoOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQkqbWFnaWNwID0gU0hfQVJDSF9NQUdJQ19CSUc7Ci0gICAgICBlbHNlCi0JKm1hZ2ljcCA9IFNIX0FSQ0hfTUFHSUNfTElUVExFOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgU1BBUkNNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICAqbWFnaWNwID0gU1BBUkNNQUdJQzsKLSNpZmRlZiBMWU5YT1MKLSAgICAgIC8qIEp1c3Qgb3ZlcndyaXRlIHRoZSB1c3VhbCB2YWx1ZSBpZiB3ZSdyZSBkb2luZyBMeW54LiAqLwotICAgICAgKm1hZ2ljcCA9IExZTlhDT0ZGTUFHSUM7Ci0jZW5kaWYKLSAgICAgIHJldHVybiB0cnVlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotI2lmZGVmIEg4NTAwTUFHSUMKLSAgICBjYXNlIGJmZF9hcmNoX2g4NTAwOgotICAgICAgKm1hZ2ljcCA9IEg4NTAwTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQTI5S19NQUdJQ19CSUcKLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCSptYWdpY3AgPSBBMjlLX01BR0lDX0JJRzsKLSAgICAgIGVsc2UKLQkqbWFnaWNwID0gQTI5S19NQUdJQ19MSVRUTEU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBXRTMyS01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF93ZTMyazoKLSAgICAgICptYWdpY3AgPSBXRTMyS01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgVTgwMlRPQ01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9yczYwMDA6Ci0jaWZuZGVmIFBQQ01BR0lDCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotI2VuZGlmCi0gICAgICAqbWFnaWNwID0gVTgwMlRPQ01BR0lDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgTUNPUkVNQUdJQwotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICAqIG1hZ2ljcCA9IE1DT1JFTUFHSUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotICAgICAgCi0gICAgZGVmYXVsdDoJCQkvKiBVbmtub3duIGFyY2hpdGVjdHVyZSAqLwotICAgICAgLyogcmV0dXJuIGZhbHNlOyAgLS0gZmFsbCB0aHJvdWdoIHRvICJyZXR1cm4gZmFsc2UiIGJlbG93LCB0byBhdm9pZAotICAgICAgICJzdGF0ZW1lbnQgbmV2ZXIgcmVhY2hlZCIgZXJyb3JzIG9uIHRoZSBvbmUgYmVsb3cuICovCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIHVuc2lnbmVkIGR1bW15MTsKLSAgdW5zaWduZWQgc2hvcnQgZHVtbXkyOwotCi0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYXJjaCAhPSBiZmRfYXJjaF91bmtub3duICYmCi0gICAgICBjb2ZmX3NldF9mbGFncyAoYWJmZCwgJmR1bW15MSwgJmR1bW15MikgIT0gdHJ1ZSkKLSAgICByZXR1cm4gZmFsc2U7CQkvKiBXZSBjYW4ndCByZXByZXNlbnQgdGhpcyB0eXBlICovCi0KLSAgcmV0dXJuIHRydWU7CQkJLyogV2UncmUgZWFzeSAuLi4gKi8KLX0KLQotCi0vKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb24gZm9yIGVhY2ggc2VjdGlvbi4gKi8KLQotI2lmbmRlZiBJOTYwCi0jZGVmaW5lIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSNlbmRpZgotI2lmZGVmIFRJQzgwQ09GRgotI3VuZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICBhc2VjdGlvbiAqcHJldmlvdXMgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgZmlsZV9wdHIgc29mYXIgPSBGSUxIU1o7Ci0gIGJvb2xlYW4gYWxpZ25fYWRqdXN0OwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0jaWZkZWYgQUxJR05fU0VDVElPTlNfSU5fRklMRQotICBmaWxlX3B0ciBvbGRfc29mYXI7Ci0jZW5kaWYKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAvKiBPbiBYQ09GRiwgaWYgd2UgaGF2ZSBzeW1ib2xzLCBzZXQgdXAgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN6OwotICAgICAgYmZkX3NpemVfdHlwZSBpLCBzeW1jb3VudDsKLSAgICAgIGFzeW1ib2wgKipzeW1wOwotCi0gICAgICBzeiA9IDA7Ci0gICAgICBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICAgICAgZm9yIChzeW1wID0gYWJmZC0+b3V0c3ltYm9scywgaSA9IDA7IGkgPCBzeW1jb3VudDsgc3ltcCsrLCBpKyspCi0JewotCSAgY29mZl9zeW1ib2xfdHlwZSAqY2Y7Ci0KLQkgIGNmID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgKnN5bXApOwotCSAgaWYgKGNmICE9IE5VTEwKLQkgICAgICAmJiBjZi0+bmF0aXZlICE9IE5VTEwKLQkgICAgICAmJiBTWU1OQU1FX0lOX0RFQlVHICgmY2YtPm5hdGl2ZS0+dS5zeW1lbnQpKQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoKnN5bXApKTsKLQkgICAgICBpZiAobGVuID4gU1lNTk1MRU4pCi0JCXN6ICs9IGxlbiArIDM7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3ogPiAwKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRlYnVnIik7Ci0JICBpZiAoZHNlYyA9PSBOVUxMKQotCSAgICBhYm9ydCAoKTsKLQkgIGRzZWMtPl9yYXdfc2l6ZSA9IHN6OwotCSAgZHNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgaW50IHBhZ2Vfc2l6ZTsKLSAgaWYgKGNvZmZfZGF0YSAoYWJmZCktPmxpbmtfaW5mbykgCi0gICAgewotICAgICAgcGFnZV9zaXplID0gcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkci5GaWxlQWxpZ25tZW50OwotICAgIH0KLSAgZWxzZQotICAgIHBhZ2Vfc2l6ZSA9IFBFX0RFRl9GSUxFX0FMSUdOTUVOVDsKLSNlbHNlCi0jaWZkZWYgQ09GRl9QQUdFX1NJWkUKLSAgaW50IHBhZ2Vfc2l6ZSA9IENPRkZfUEFHRV9TSVpFOwotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiAgQSBzdGFydCBhZGRyZXNzIG1heSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIG9yaWdpbmFsIGZpbGUuIEluIHRoaXMKLQkgIGNhc2UgaXQgd2lsbCBuZWVkIGFuIG9wdGlvbmFsIGhlYWRlciB0byByZWNvcmQgaXQuICAqLwotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICAgIH0KLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgc29mYXIgKz0gQU9VVFNaOwotI2lmZGVmIFJTNjAwMENPRkZfQwotICBlbHNlIGlmICh4Y29mZl9kYXRhIChhYmZkKS0+ZnVsbF9hb3V0aGRyKQotICAgIHNvZmFyICs9IEFPVVRTWjsKLSAgZWxzZQotICAgIHNvZmFyICs9IFNNQUxMX0FPVVRTWjsKLSNlbmRpZgotCi0gIHNvZmFyICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBTQ05IU1o7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgLyogWENPRkYgaGFuZGxlcyBvdmVyZmxvd3MgaW4gdGhlIHJlbG9jIGFuZCBsaW5lIG51bWJlciBjb3VudCBmaWVsZHMKLSAgICAgYnkgYWxsb2NhdGluZyBhIG5ldyBzZWN0aW9uIGhlYWRlciB0byBob2xkIHRoZSBjb3JyZWN0IGNvdW50cy4gICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLSAgICAgIHNvZmFyICs9IFNDTkhTWjsKLSNlbmRpZgotCi0gIGFsaWduX2FkanVzdCA9IGZhbHNlOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9ucywgY291bnQgPSAxOwotICAgICAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQsICsrY291bnQpCi0gICAgewotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogVGhlIE5UIGxvYWRlciBkb2VzIG5vdCB3YW50IGVtcHR5IHNlY3Rpb24gaGVhZGVycywgc28gd2Ugb21pdAotICAgICAgICAgdGhlbS4gIFdlIGRvbid0IGFjdHVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbiBmcm9tIHRoZSBCRkQsCi0gICAgICAgICBhbHRob3VnaCB3ZSBwcm9iYWJseSBzaG91bGQuICBUaGlzIG1hdGNoZXMgY29kZSBpbgotICAgICAgICAgY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuICAqLwotICAgICAgaWYgKGN1cnJlbnQtPl9yYXdfc2l6ZSA9PSAwKQotCXsKLQkgIGN1cnJlbnQtPnRhcmdldF9pbmRleCA9IC0xOwotCSAgLS1jb3VudDsKLQkgIGNvbnRpbnVlOwotCX0KLSNlbmRpZgotCi0gICAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSBjb3VudDsKLQotICAgICAgLyogT25seSBkZWFsIHdpdGggc2VjdGlvbnMgd2hpY2ggaGF2ZSBjb250ZW50cyAqLwotICAgICAgaWYgKCEoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSkKLQljb250aW51ZTsKLQotICAgICAgLyogQWxpZ24gdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIHRvIHRoZSBzYW1lIGJvdW5kYXJ5IG9uCi0JIHdoaWNoIHRoZXkgYXJlIGFsaWduZWQgaW4gdmlydHVhbCBtZW1vcnkuICBJOTYwIGRvZXNuJ3QKLQkgZG8gdGhpcyAoRklYTUUpIHNvIHdlIGNhbiBzdGF5IGluIHN5bmMgd2l0aCBJbnRlbC4gIDk2MAotCSBkb2Vzbid0IHlldCBwYWdlIGZyb20gZmlsZXMuLi4gKi8KLSNpZmRlZiBBTElHTl9TRUNUSU9OU19JTl9GSUxFCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQotCXsKLQkgIC8qIG1ha2Ugc3VyZSB0aGlzIHNlY3Rpb24gaXMgYWxpZ25lZCBvbiB0aGUgcmlnaHQgYm91bmRhcnkgLSBieQotCSAgICAgcGFkZGluZyB0aGUgcHJldmlvdXMgc2VjdGlvbiB1cCBpZiBuZWNlc3NhcnkgKi8KLQotCSAgb2xkX3NvZmFyID0gc29mYXI7Ci0JICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGlmIChwcmV2aW91cyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIHByZXZpb3VzLT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0JICAgIH0KLQl9Ci0KLSNlbmRpZgotCi0gICAgICAvKiBJbiBkZW1hbmQgcGFnZWQgZmlsZXMgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZSBmaWxlIG9mZnNldAotCSBtdXN0IG1hdGNoIHRoZSBsb3cgb3JkZXIgYml0cyBvZiB0aGUgdmlydHVhbCBhZGRyZXNzLiAgKi8KLSNpZmRlZiBDT0ZGX1BBR0VfU0laRQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQlzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcGFnZV9zaXplOwotI2VuZGlmCi0gICAgICBjdXJyZW50LT5maWxlcG9zID0gc29mYXI7Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIFdpdGggUEUgd2UgaGF2ZSB0byBwYWQgZWFjaCBzZWN0aW9uIHRvIGJlIGEgbXVsdGlwbGUgb2YgaXRzCi0JIHBhZ2Ugc2l6ZSB0b28sIGFuZCByZW1lbWJlciBib3RoIHNpemVzLiAgKi8KLQotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSA9PSBOVUxMKQotCXsKLQkgIGN1cnJlbnQtPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAoY3VycmVudC0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KSA9PSBOVUxMKQotCXsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dGRhdGEgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChhYmZkLCBjdXJyZW50KS0+dmlydF9zaXplID09IDApCi0JcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLQotICAgICAgY3VycmVudC0+X3Jhd19zaXplID0gKGN1cnJlbnQtPl9yYXdfc2l6ZSArIHBhZ2Vfc2l6ZSAtMSkgJiAtcGFnZV9zaXplOwotI2VuZGlmCi0KLSAgICAgIHNvZmFyICs9IGN1cnJlbnQtPl9yYXdfc2l6ZTsKLQotI2lmZGVmIEFMSUdOX1NFQ1RJT05TX0lOX0ZJTEUKLSAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApID09IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBvbGRfc2l6ZTsKLQotCSAgb2xkX3NpemUgPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0JICBjdXJyZW50LT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKGN1cnJlbnQtPl9yYXdfc2l6ZSwKLQkJCQkJICAxIDw8IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcik7Ci0JICBhbGlnbl9hZGp1c3QgPSBjdXJyZW50LT5fcmF3X3NpemUgIT0gb2xkX3NpemU7Ci0JICBzb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemUgLSBvbGRfc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb2xkX3NvZmFyID0gc29mYXI7Ci0JICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyKTsKLQkgIGFsaWduX2FkanVzdCA9IHNvZmFyICE9IG9sZF9zb2ZhcjsKLQkgIGN1cnJlbnQtPl9yYXdfc2l6ZSArPSBzb2ZhciAtIG9sZF9zb2ZhcjsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogRm9yIFBFIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIHBhZCBvdXQgdG8gdGhlIGFsaWduZWQKLSAgICAgICAgIF9yYXdfc2l6ZSwgaW4gY2FzZSB0aGUgY2FsbGVyIG9ubHkgd3JpdGVzIG91dCBkYXRhIHRvIHRoZQotICAgICAgICAgdW5hbGlnbmVkIF9yYXdfc2l6ZS4gICovCi0gICAgICBpZiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZSA8IGN1cnJlbnQtPl9yYXdfc2l6ZSkKLQlhbGlnbl9hZGp1c3QgPSB0cnVlOwotI2VuZGlmCi0KLSNpZmRlZiBfTElCCi0gICAgICAvKiBGb3JjZSAubGliIHNlY3Rpb25zIHRvIHN0YXJ0IGF0IHplcm8uICBUaGUgdm1hIGlzIHRoZW4KLQkgaW5jcmVtZW50ZWQgaW4gY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cy4gIFRoaXMgaXMgcmlnaHQgZm9yCi0JIFNWUjMuMi4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCWJmZF9zZXRfc2VjdGlvbl92bWEgKGFiZmQsIGN1cnJlbnQsIDApOwotI2VuZGlmCi0KLSAgICAgIHByZXZpb3VzID0gY3VycmVudDsKLSAgICB9Ci0KLSAgLyogSXQgaXMgbm93IHNhZmUgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCBmaWxlLiAgSWYgd2UgbmVlZGVkIGFuCi0gICAgIGFsaWdubWVudCBhZGp1c3RtZW50IGZvciB0aGUgbGFzdCBzZWN0aW9uLCB0aGVuIG1ha2Ugc3VyZSB0aGF0Ci0gICAgIHRoZXJlIGlzIGEgYnl0ZSBhdCBvZmZzZXQgc29mYXIuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scyBhbmQgbm8KLSAgICAgcmVsb2NzLCB0aGVuIG5vdGhpbmcgZm9sbG93cyB0aGUgbGFzdCBzZWN0aW9uLiAgSWYgd2UgZG9uJ3QgZm9yY2UKLSAgICAgdGhlIGxhc3QgYnl0ZSBvdXQsIHRoZW4gdGhlIGZpbGUgbWF5IGFwcGVhciB0byBiZSB0cnVuY2F0ZWQuICAqLwotICBpZiAoYWxpZ25fYWRqdXN0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIGIgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBzb2ZhciAtIDEsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKCZiLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSByZWxvY2F0aW9ucyBhcmUgYWxpZ25lZC4gIFdlIGRvbid0IG5lZWQgdG8gbWFrZQotICAgICBzdXJlIHRoYXQgdGhpcyBieXRlIGV4aXN0cywgYmVjYXVzZSBpdCB3aWxsIG9ubHkgbWF0dGVyIGlmIHRoZXJlCi0gICAgIHJlYWxseSBhcmUgcmVsb2NzLiAgKi8KLSAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IENPRkZfREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVF9QT1dFUik7Ci0KLSAgb2JqX3JlbG9jYmFzZSAoYWJmZCkgPSBzb2ZhcjsKLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0KLS8qIFRoaXMgY2FuIG5ldmVyIHdvcmssIGJlY2F1c2UgaXQgaXMgY2FsbGVkIHRvbyBsYXRlLS1hZnRlciB0aGUKLSAgIHNlY3Rpb24gcG9zaXRpb25zIGhhdmUgYmVlbiBzZXQuICBJIGNhbid0IGZpZ3VyZSBvdXQgd2hhdCBpdCBpcwotICAgZm9yLCBzbyBJIGFtIGdvaW5nIHRvIGRpc2FibGUgaXQtLUlhbiBUYXlsb3IgMjAgTWFyY2ggMTk5Ni4gICovCi0KLS8qIElmIC5maWxlLCAudGV4dCwgLmRhdGEsIC5ic3Mgc3ltYm9scyBhcmUgbWlzc2luZywgYWRkIHRoZW0uICAqLwotLyogQEAgU2hvdWxkIHdlIG9ubHkgYmUgYWRkaW5nIG1pc3Npbmcgc3ltYm9scywgb3Igb3ZlcnJpZGluZyB0aGUgYXV4Ci0gICB2YWx1ZXMgZm9yIGV4aXN0aW5nIHNlY3Rpb24gc3ltYm9scz8gICovCi1zdGF0aWMgYm9vbGVhbgotY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBuc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcHAgPSBhYmZkLT5vdXRzeW1ib2xzOwotICBhc3ltYm9sICoqc3ltcHAyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IG5lZWRfdGV4dCA9IDEsIG5lZWRfZGF0YSA9IDEsIG5lZWRfYnNzID0gMSwgbmVlZF9maWxlID0gMTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbnN5bXM7IGkrKykKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgc3ltcHBbaV0pOwotICAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgIGlmIChjc3ltKQotCXsKLQkgIC8qIG9ubHkgZG8gdGhpcyBpZiB0aGVyZSBpcyBhIGNvZmYgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0Ci0JICAgc3ltYm9sICovCi0JICBpZiAoY3N5bS0+bmF0aXZlICYmIGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgbmVlZF9maWxlID0gMDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgbmFtZSA9IGNzeW0tPnN5bWJvbC5uYW1lOwotCSAgaWYgKCFuYW1lKQotCSAgICBjb250aW51ZTsKLQkgIGlmICghc3RyY21wIChuYW1lLCBfVEVYVCkpCi0JICAgIG5lZWRfdGV4dCA9IDA7Ci0jaWZkZWYgQVBPTExPX002OAotCSAgZWxzZSBpZiAoIXN0cmNtcCAobmFtZSwgIi53dGV4dCIpKQotCSAgICBuZWVkX3RleHQgPSAwOwotI2VuZGlmCi0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfREFUQSkpCi0JICAgIG5lZWRfZGF0YSA9IDA7Ci0JICBlbHNlIGlmICghc3RyY21wIChuYW1lLCBfQlNTKSkKLQkgICAgbmVlZF9ic3MgPSAwOwotCX0KLSAgICB9Ci0gIC8qIE5vdyBpID09IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpLiAgKi8KLSAgLyogQEAgRm9yIG5vdywgZG9uJ3QgZGVhbCB3aXRoIC5maWxlIHN5bWJvbC4gICovCi0gIG5lZWRfZmlsZSA9IDA7Ci0KLSAgaWYgKCFuZWVkX3RleHQgJiYgIW5lZWRfZGF0YSAmJiAhbmVlZF9ic3MgJiYgIW5lZWRfZmlsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgbnN5bXMgKz0gbmVlZF90ZXh0ICsgbmVlZF9kYXRhICsgbmVlZF9ic3MgKyBuZWVkX2ZpbGU7Ci0gIHN5bXBwMiA9IChhc3ltYm9sICoqKSBiZmRfYWxsb2MgKGFiZmQsIG5zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWYgKCFzeW1wcDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1jcHkgKHN5bXBwMiwgc3ltcHAsIGkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICBpZiAobmVlZF9maWxlKQotICAgIHsKLSAgICAgIC8qIEBAIEdlbmVyYXRlIGZha2UgLmZpbGUgc3ltYm9sLCBpbiBzeW1wcDJbaV0sIGFuZCBpbmNyZW1lbnQgaS4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGlmIChuZWVkX3RleHQpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfVEVYVCk7Ci0gIGlmIChuZWVkX2RhdGEpCi0gICAgc3ltcHAyW2krK10gPSBjb2ZmX3NlY3Rpb25fc3ltYm9sIChhYmZkLCBfREFUQSk7Ci0gIGlmIChuZWVkX2JzcykKLSAgICBzeW1wcDJbaSsrXSA9IGNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIF9CU1MpOwotICBCRkRfQVNTRVJUIChpID09IG5zeW1zKTsKLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXBwMiwgbnN5bXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIDAgKi8KLQotLyogU1VQUFJFU1MgNTU4ICovCi0vKiBTVVBQUkVTUyA1MjkgKi8KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGJvb2xlYW4gaGFzcmVsb2NzID0gZmFsc2U7Ci0gIGJvb2xlYW4gaGFzbGlubm8gPSBmYWxzZTsKLSAgZmlsZV9wdHIgc2NuX2Jhc2U7Ci0gIGZpbGVfcHRyIHJlbG9jX2Jhc2U7Ci0gIGZpbGVfcHRyIGxpbmVub19iYXNlOwotICBmaWxlX3B0ciBzeW1fYmFzZTsKLSAgdW5zaWduZWQgbG9uZyByZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgbG9uZyBsbm5vX3NpemUgPSAwOwotICBib29sZWFuIGxvbmdfc2VjdGlvbl9uYW1lczsKLSAgYXNlY3Rpb24gKnRleHRfc2VjID0gTlVMTDsKLSAgYXNlY3Rpb24gKmRhdGFfc2VjID0gTlVMTDsKLSAgYXNlY3Rpb24gKmJzc19zZWMgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOwotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIHNpemVfdCBzdHJpbmdfc2l6ZSA9IFNUUklOR19TSVpFX1NJWkU7Ci0jZW5kaWYKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCi0gIC8qIE1ha2UgYSBwYXNzIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSB0byBjb3VudCBsaW5lIG51bWJlciBlbnRyaWVzIGFuZAotICAgICBwdXQgdGhlbSBpbnRvIHRoZSBjb3JyZWN0IGFzZWN0aW9ucyAqLwotCi0gIGxubm9fc2l6ZSA9IGNvZmZfY291bnRfbGluZW51bWJlcnMgKGFiZmQpICogTElORVNaOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICghIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJlbG9jX2Jhc2UgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLQotICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MgYW5kIGxpbm5vIGFyZWFzICovCi0KLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7IGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9Ci0gICAgICAgY3VycmVudC0+bmV4dCkKLSAgICByZWxvY19zaXplICs9IGN1cnJlbnQtPnJlbG9jX2NvdW50ICogUkVMU1o7Ci0KLSAgbGluZW5vX2Jhc2UgPSByZWxvY19iYXNlICsgcmVsb2Nfc2l6ZTsKLSAgc3ltX2Jhc2UgPSBsaW5lbm9fYmFzZSArIGxubm9fc2l6ZTsKLQotICAvKiBJbmRpY2F0ZSBpbiBlYWNoIHNlY3Rpb24tPmxpbmVfZmlsZXBvcyBpdHMgYWN0dWFsIGZpbGUgYWRkcmVzcyAqLwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0KLSAgICAgICBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50LT5saW5lbm9fY291bnQpCi0JewotCSAgY3VycmVudC0+bGluZV9maWxlcG9zID0gbGluZW5vX2Jhc2U7Ci0JICBjdXJyZW50LT5tb3ZpbmdfbGluZV9maWxlcG9zID0gbGluZW5vX2Jhc2U7Ci0JICBsaW5lbm9fYmFzZSArPSBjdXJyZW50LT5saW5lbm9fY291bnQgKiBMSU5FU1o7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IDA7Ci0JfQotICAgICAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50KQotCXsKLQkgIGN1cnJlbnQtPnJlbF9maWxlcG9zID0gcmVsb2NfYmFzZTsKLQkgIHJlbG9jX2Jhc2UgKz0gY3VycmVudC0+cmVsb2NfY291bnQgKiBSRUxTWjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY3VycmVudC0+cmVsX2ZpbGVwb3MgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgc2VjdGlvbiBoZWFkZXJzIHRvIHRoZSBmaWxlLiAgKi8KLSAgaW50ZXJuYWxfZi5mX25zY25zID0gMDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQotICAgIHNjbl9iYXNlID0gRklMSFNaICsgQU9VVFNaOwotICBlbHNlCi0gICAgewotICAgICAgc2NuX2Jhc2UgPSBGSUxIU1o7Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKLQlzY25fYmFzZSArPSBBT1VUU1o7Ci0gICAgICBlbHNlCi0Jc2NuX2Jhc2UgKz0gU01BTExfQU9VVFNaOwotI2VuZGlmCi0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc2NuX2Jhc2UsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBsb25nX3NlY3Rpb25fbmFtZXMgPSBmYWxzZTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgICAgY3VycmVudCAhPSBOVUxMOwotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgc2VjdGlvbjsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgICAgLyogSWYgd2UndmUgZ290IGEgLnJlbG9jIHNlY3Rpb24sIHJlbWVtYmVyLiAqLwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCAiLnJlbG9jIikgPT0gMCkKLQl7Ci0JICBwZV9kYXRhIChhYmZkKS0+aGFzX3JlbG9jX3NlY3Rpb24gPSAxOwotCX0KLSNlbmRpZgotCi0jZW5kaWYKLSAgICAgIGludGVybmFsX2YuZl9uc2NucysrOwotCi0gICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgU0NOTk1MRU4pOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLSAgICAgIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMgYXMgaW4gUEUuICBUaGlzIG11c3QgYmUgY29tcGF0aWJsZQotICAgICAgICAgd2l0aCB0aGUgY29kZSBpbiBjb2ZmX3dyaXRlX3N5bWJvbHMuICAqLwotICAgICAgewotCXNpemVfdCBsZW47Ci0KLQlsZW4gPSBzdHJsZW4gKGN1cnJlbnQtPm5hbWUpOwotCWlmIChsZW4gPiBTQ05OTUxFTikKLQkgIHsKLQkgICAgbWVtc2V0IChzZWN0aW9uLnNfbmFtZSwgMCwgU0NOTk1MRU4pOwotCSAgICBzcHJpbnRmIChzZWN0aW9uLnNfbmFtZSwgIi8lbHUiLCAodW5zaWduZWQgbG9uZykgc3RyaW5nX3NpemUpOwotCSAgICBzdHJpbmdfc2l6ZSArPSBsZW4gKyAxOwotCSAgICBsb25nX3NlY3Rpb25fbmFtZXMgPSB0cnVlOwotCSAgfQotICAgICAgfQotI2VuZGlmCi0KLSNpZmRlZiBfTElCCi0gICAgICAvKiBBbHdheXMgc2V0IHNfdmFkZHIgb2YgLmxpYiB0byAwLiAgVGhpcyBpcyByaWdodCBmb3IgU1ZSMy4yCi0JIElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXNlY3Rpb24uc192YWRkciA9IDA7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgIHNlY3Rpb24uc192YWRkciA9IGN1cnJlbnQtPnZtYTsKLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IGN1cnJlbnQtPmxtYTsKLSAgICAgIHNlY3Rpb24uc19zaXplID0gIGN1cnJlbnQtPl9yYXdfc2l6ZTsKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotICAgICAgc2VjdGlvbi5zX3BhZGRyID0gMDsKLSNlbmRpZgotI2lmZGVmIENPRkZfSU1BR0VfV0lUSF9QRQotICAgICAgLyogUmVtaW5kZXI6IHNfcGFkZHIgaG9sZHMgdGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpICE9IE5VTEwKLQkgICYmIHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIGN1cnJlbnQpICE9IE5VTEwpCi0Jc2VjdGlvbi5zX3BhZGRyID0gcGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3VycmVudCktPnZpcnRfc2l6ZTsKLSAgICAgIGVsc2UKLQlzZWN0aW9uLnNfcGFkZHIgPSAwOwotI2VuZGlmCi0KLSAgICAgIC8qCi0JIElmIHRoaXMgc2VjdGlvbiBoYXMgbm8gc2l6ZSBvciBpcyB1bmxvYWRhYmxlIHRoZW4gdGhlIHNjbnB0cgotCSB3aWxsIGJlIDAgdG9vCi0JICovCi0gICAgICBpZiAoY3VycmVudC0+X3Jhd19zaXplID09IDAgfHwKLQkgIChjdXJyZW50LT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpKSA9PSAwKQotCXsKLQkgIHNlY3Rpb24uc19zY25wdHIgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzZWN0aW9uLnNfc2NucHRyID0gY3VycmVudC0+ZmlsZXBvczsKLQl9Ci0gICAgICBzZWN0aW9uLnNfcmVscHRyID0gY3VycmVudC0+cmVsX2ZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfbG5ub3B0ciA9IGN1cnJlbnQtPmxpbmVfZmlsZXBvczsKLSAgICAgIHNlY3Rpb24uc19ucmVsb2MgPSBjdXJyZW50LT5yZWxvY19jb3VudDsKLSAgICAgIHNlY3Rpb24uc19ubG5ubyA9IGN1cnJlbnQtPmxpbmVub19jb3VudDsKLSAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCAhPSAwKQotCWhhc3JlbG9jcyA9IHRydWU7Ci0gICAgICBpZiAoY3VycmVudC0+bGluZW5vX2NvdW50ICE9IDApCi0JaGFzbGlubm8gPSB0cnVlOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgICAvKiBJbmRpY2F0ZSB0aGUgdXNlIG9mIGFuIFhDT0ZGIG92ZXJmbG93IHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLQl7Ci0JICBzZWN0aW9uLnNfbnJlbG9jID0gMHhmZmZmOwotCSAgc2VjdGlvbi5zX25sbm5vID0gMHhmZmZmOwotCX0KLSNlbmRpZgotCi0gICAgICBzZWN0aW9uLnNfZmxhZ3MgPSBzZWNfdG9fc3R5cF9mbGFncyAoY3VycmVudC0+bmFtZSwgY3VycmVudC0+ZmxhZ3MpOwotCi0gICAgICBpZiAoIXN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1RFWFQpKQotCXsKLQkgIHRleHRfc2VjID0gY3VycmVudDsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChjdXJyZW50LT5uYW1lLCBfREFUQSkpCi0JewotCSAgZGF0YV9zZWMgPSBjdXJyZW50OwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9CU1MpKQotCXsKLQkgIGJzc19zZWMgPSBjdXJyZW50OwotCX0KLQotI2lmZGVmIEk5NjAKLSAgICAgIHNlY3Rpb24uc19hbGlnbiA9IChjdXJyZW50LT5hbGlnbm1lbnRfcG93ZXIKLQkJCSA/IDEgPDwgY3VycmVudC0+YWxpZ25tZW50X3Bvd2VyCi0JCQkgOiAwKTsKLSNlbHNlCi0jaWZkZWYgVElDODBDT0ZGCi0gICAgICBzZWN0aW9uLnNfZmxhZ3MgfD0gKGN1cnJlbnQtPmFsaWdubWVudF9wb3dlciAmIDB4RikgPDwgODsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSAgICAgIC8qIHN1cHByZXNzIG91dHB1dCBvZiB0aGUgc2VjdGlvbnMgaWYgdGhleSBhcmUgbnVsbC4gIGxkIGluY2x1ZGVzCi0JIHRoZSBic3MgYW5kIGRhdGEgc2VjdGlvbnMgZXZlbiBpZiB0aGVyZSBpcyBubyBzaXplIGFzc2lnbmVkCi0JIHRvIHRoZW0uICBOVCBsb2FkZXIgZG9lc24ndCBsaWtlIGl0IGlmIHRoZXNlIHNlY3Rpb24gaGVhZGVycyBhcmUKLQkgaW5jbHVkZWQgaWYgdGhlIHNlY3Rpb25zIHRoZW1zZWx2ZXMgYXJlIG5vdCBuZWVkZWQgKi8KLSAgICAgIGlmIChzZWN0aW9uLnNfc2l6ZSA9PSAwKQotCWludGVybmFsX2YuZl9uc2Nucy0tOwotICAgICAgZWxzZQotI2VuZGlmCi0JewotCSAgU0NOSERSIGJ1ZmY7Ci0JICBpZiAoY29mZl9zd2FwX3Njbmhkcl9vdXQgKGFiZmQsICZzZWN0aW9uLCAmYnVmZikgPT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgKCZidWZmKSwgMSwgU0NOSFNaLCBhYmZkKSAhPSBTQ05IU1opCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgIC8qIFBFIHN0b3JlcyBDT01EQVQgc2VjdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSWYKLSAgICAgICAgIHRoaXMgc2VjdGlvbiBpcyBzdXBwb3NlZCB0byBoYXZlIHNvbWUgQ09NREFUIGluZm8sIHRyYWNrIGRvd24KLSAgICAgICAgIHRoZSBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSBhbmQgbW9kaWZ5IGl0LiAgKi8KLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfTElOS19PTkNFKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpLCBjb3VudDsKLQkgIGFzeW1ib2wgKipwc3ltOwotCSAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bSA9IE5VTEw7Ci0JICBhc3ltYm9sICoqcHN5bXNlYzsKLQotCSAgcHN5bXNlYyA9IE5VTEw7Ci0JICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCSAgZm9yIChpID0gMCwgcHN5bSA9IGFiZmQtPm91dHN5bWJvbHM7IGkgPCBjb3VudDsgaSsrLCBwc3ltKyspCi0JICAgIHsKLQkgICAgICBpZiAoKCpwc3ltKS0+c2VjdGlvbiAhPSBjdXJyZW50KQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKHBzeW1zZWMgPT0gTlVMTCkKLQkJcHN5bXNlYyA9IHBzeW07Ci0KLQkgICAgICAvKiBTZWUgaWYgdGhpcyBpcyB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKCgqcHN5bSktPm5hbWUsIGN1cnJlbnQtPm5hbWUpID09IDApCi0JCXsKLQkJICBjc3ltID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgKnBzeW0pOwotCQkgIGlmIChjc3ltID09IE5VTEwKLQkJICAgICAgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwKLQkJICAgICAgfHwgY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA8IDEKLQkJICAgICAgfHwgY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyAhPSBDX1NUQVQKLQkJICAgICAgfHwgY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX3R5cGUgIT0gVF9OVUxMKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBIZXJlICpQU1lNIGlzIHRoZSBzZWN0aW9uIHN5bWJvbCBmb3IgQ1VSUkVOVC4gICovCi0KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIERpZCB3ZSBmaW5kIGl0PwotCSAgICAgTm90ZSB0aGF0IHdlIG1pZ2h0IG5vdCBpZiB3ZSdyZSBjb252ZXJ0aW5nIHRoZSBmaWxlIGZyb20KLQkgICAgIHNvbWUgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0LiAgKi8KLQkgIGlmIChpIDwgY291bnQpCi0JICAgIHsKLQkgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXg7Ci0KLQkgICAgICAvKiBXZSBkb24ndCB0b3VjaCB0aGUgeF9jaGVja3N1bSBmaWVsZC4gIFRoZQotCQkgeF9hc3NvY2lhdGVkIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiAgKi8KLQotCSAgICAgIGF1eCA9IGNzeW0tPm5hdGl2ZSArIDE7Ci0JICAgICAgc3dpdGNoIChjdXJyZW50LT5mbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCi0JCXsKLQkJY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX0RJU0NBUkQ6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9IElNQUdFX0NPTURBVF9TRUxFQ1RfQU5ZOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19PTkVfT05MWToKLQkJICBhdXgtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ID0KLQkJICAgIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU6Ci0JCSAgYXV4LT51LmF1eGVudC54X3Njbi54X2NvbWRhdCA9Ci0JCSAgICBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRTsKLQkJICBicmVhazsKLQotCQljYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfU0FNRV9DT05URU5UUzoKLQkJICBhdXgtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0ID0KLQkJICAgIElNQUdFX0NPTURBVF9TRUxFQ1RfRVhBQ1RfTUFUQ0g7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFRoZSBDT01EQVQgc3ltYm9sIG11c3QgYmUgdGhlIGZpcnN0IHN5bWJvbCBmcm9tIHRoaXMKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSW4gb3JkZXIgdG8gbWFrZSB0aGlzCi0gICAgICAgICAgICAgICAgIHdvcmssIHdlIG1vdmUgdGhlIENPTURBVCBzeW1ib2wgYmVmb3JlIHRoZSBmaXJzdAotICAgICAgICAgICAgICAgICBzeW1ib2wgd2UgZm91bmQgaW4gdGhlIHNlYXJjaCBhYm92ZS4gIEl0J3MgT0sgdG8KLSAgICAgICAgICAgICAgICAgcmVhcnJhbmdlIHRoZSBzeW1ib2wgdGFibGUgYXQgdGhpcyBwb2ludCwgYmVjYXVzZQotICAgICAgICAgICAgICAgICBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgaXMgZ29pbmcgdG8gcmVhcnJhbmdlIGl0Ci0gICAgICAgICAgICAgICAgIGZ1cnRoZXIgYW5kIGZpeCB1cCBhbGwgdGhlIGF1eCBlbnRyaWVzLiAgKi8KLQkgICAgICBpZiAocHN5bSAhPSBwc3ltc2VjKQotCQl7Ci0JCSAgYXN5bWJvbCAqaG9sZDsKLQkJICBhc3ltYm9sICoqcGNvcHk7Ci0KLQkJICBob2xkID0gKnBzeW07Ci0JCSAgZm9yIChwY29weSA9IHBzeW07IHBjb3B5ID4gcHN5bXNlYzsgcGNvcHktLSkKLQkJICAgIHBjb3B5WzBdID0gcGNvcHlbLTFdOwotCQkgICpwc3ltc2VjID0gaG9sZDsKLQkJfQotCSAgICB9Ci0JfQotI2VuZGlmIC8qIENPRkZfV0lUSF9QRSAqLwotICAgIH0KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAvKiBYQ09GRiBoYW5kbGVzIG92ZXJmbG93cyBpbiB0aGUgcmVsb2MgYW5kIGxpbmUgbnVtYmVyIGNvdW50IGZpZWxkcwotICAgICBieSBjcmVhdGluZyBhIG5ldyBzZWN0aW9uIGhlYWRlciB0byBob2xkIHRoZSBjb3JyZWN0IHZhbHVlcy4gICovCi0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50LT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgY3VycmVudC0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIHNjbmhkcjsKLQkgIFNDTkhEUiBidWZmOwotCi0JICBpbnRlcm5hbF9mLmZfbnNjbnMrKzsKLQkgIHN0cm5jcHkgKCYoc2NuaGRyLnNfbmFtZVswXSksIGN1cnJlbnQtPm5hbWUsIDgpOwotCSAgc2NuaGRyLnNfcGFkZHIgPSBjdXJyZW50LT5yZWxvY19jb3VudDsKLQkgIHNjbmhkci5zX3ZhZGRyID0gY3VycmVudC0+bGluZW5vX2NvdW50OwotCSAgc2NuaGRyLnNfc2l6ZSA9IDA7Ci0JICBzY25oZHIuc19zY25wdHIgPSAwOwotCSAgc2NuaGRyLnNfcmVscHRyID0gY3VycmVudC0+cmVsX2ZpbGVwb3M7Ci0JICBzY25oZHIuc19sbm5vcHRyID0gY3VycmVudC0+bGluZV9maWxlcG9zOwotCSAgc2NuaGRyLnNfbnJlbG9jID0gY3VycmVudC0+dGFyZ2V0X2luZGV4OwotCSAgc2NuaGRyLnNfbmxubm8gPSBjdXJyZW50LT50YXJnZXRfaW5kZXg7Ci0JICBzY25oZHIuc19mbGFncyA9IFNUWVBfT1ZSRkxPOwotCSAgaWYgKGNvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAmc2NuaGRyLCAmYnVmZikgPT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgJmJ1ZmYsIDEsIFNDTkhTWiwgYWJmZCkgIT0gU0NOSFNaKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIC8qIE9LLCBub3cgc2V0IHVwIHRoZSBmaWxlaGRyLi4uICovCi0KLSAgLyogRG9uJ3QgaW5jbHVkZSB0aGUgaW50ZXJuYWwgYWJzIHNlY3Rpb24gaW4gdGhlIHNlY3Rpb24gY291bnQgKi8KLQotICAvKgotICAgICBXZSB3aWxsIE5PVCBwdXQgYSBmdWNraW5nIHRpbWVzdGFtcCBpbiB0aGUgaGVhZGVyIGhlcmUuIEV2ZXJ5IHRpbWUgeW91Ci0gICAgIHB1dCBpdCBiYWNrLCBJIHdpbGwgY29tZSBpbiBhbmQgdGFrZSBpdCBvdXQgYWdhaW4uICBJJ20gc29ycnkuICBUaGlzCi0gICAgIGZpZWxkIGRvZXMgbm90IGJlbG9uZyBoZXJlLiAgV2UgZmlsbCBpdCB3aXRoIGEgMCBzbyBpdCBjb21wYXJlcyB0aGUKLSAgICAgc2FtZSBidXQgaXMgbm90IGEgcmVhc29uYWJsZSB0aW1lLiAtLSBnbnVAY3lnbnVzLmNvbQotICAgICAqLwotICBpbnRlcm5hbF9mLmZfdGltZGF0ID0gMDsKLQotICBpbnRlcm5hbF9mLmZfZmxhZ3MgPSAwOwotCi0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBpbnRlcm5hbF9mLmZfb3B0aGRyID0gQU9VVFNaOwotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuYWxfZi5mX29wdGhkciA9IDA7Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKLQlpbnRlcm5hbF9mLmZfb3B0aGRyID0gQU9VVFNaOwotICAgICAgZWxzZQotCWludGVybmFsX2YuZl9vcHRoZHIgPSBTTUFMTF9BT1VUU1o7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCFoYXNyZWxvY3MpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfUkVMRkxHOwotICBpZiAoIWhhc2xpbm5vKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xOTk87Ci0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9FWEVDOwotCi0gIC8qIEZJWE1FOiB0aGlzIGlzIHdyb25nIGZvciBQUENfUEUhICovCi0gIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMldSOwotICBlbHNlCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMlc7Ci0KLSNpZmRlZiBUSUM4MF9UQVJHRVRfSUQKLSAgaW50ZXJuYWxfZi5mX3RhcmdldF9pZCA9IFRJQzgwX1RBUkdFVF9JRDsKLSNlbmRpZgotCi0gIC8qCi0gICAgIEZJWE1FLCBzaG91bGQgZG8gc29tZXRoaW5nIGFib3V0IHRoZSBvdGhlciBieXRlIG9yZGVycyBhbmQKLSAgICAgYXJjaGl0ZWN0dXJlcy4KLSAgICAgKi8KLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9TSFJPQko7Ci0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgX0xPQURFUikgIT0gTlVMTCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9EWU5MT0FEOwotI2VuZGlmCi0KLSAgbWVtc2V0ICgmaW50ZXJuYWxfYSwgMCwgc2l6ZW9mIGludGVybmFsX2EpOwotCi0gIC8qIFNldCB1cCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHN0dWZmICovCi0KLSAgewotICAgIHVuc2lnbmVkIGludCBtYWdpYyA9IDA7Ci0gICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MgPSAwOwotICAgIGNvZmZfc2V0X2ZsYWdzIChhYmZkLCAmbWFnaWMsICZmbGFncyk7Ci0gICAgaW50ZXJuYWxfZi5mX21hZ2ljID0gbWFnaWM7Ci0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IGZsYWdzOwotICAgIC8qIC4uLmFuZCB0aGUgIm9wdCJoZHIuLi4gKi8KLQotI2lmZGVmIEEyOUsKLSNpZmRlZiBVTFRSQTMJCQkvKiBOWVUncyBtYWNoaW5lICovCi0gICAgLyogRklYTUU6IFRoaXMgaXMgYSBib2d1cyBjaGVjay4gIEkgcmVhbGx5IHdhbnQgdG8gc2VlIGlmIHRoZXJlCi0gICAgICogaXMgYSAuc2hic3Mgb3IgYSAuc2hkYXRhIHNlY3Rpb24sIGlmIHNvIHRoZW4gc2V0IHRoZSBtYWdpYwotICAgICAqIG51bWJlciB0byBpbmRpY2F0ZSBhIHNoYXJlZCBkYXRhIGV4ZWN1dGFibGUuCi0gICAgICovCi0gICAgaWYgKGludGVybmFsX2YuZl9uc2NucyA+PSA3KQotICAgICAgaW50ZXJuYWxfYS5tYWdpYyA9IFNITUFHSUM7IC8qIFNoYXJlZCBtYWdpYyAqLwotICAgIGVsc2UKLSNlbmRpZiAvKiBVTFRSQTMgKi8KLSAgICAgIGludGVybmFsX2EubWFnaWMgPSBOTUFHSUM7IC8qIEFzc3VtZSBzZXBhcmF0ZSBpL2QgKi8KLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogQTI5SyAqLwotI2lmZGVmIFRJQzgwQ09GRgotICAgIGludGVybmFsX2EubWFnaWMgPSBUSUM4MF9BUkNIX01BR0lDOwotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNlbmRpZiAvKiBUSUM4MCAqLwotI2lmZGVmIEk4NjAKLSAgICAvKiBGSVhNRTogV2hhdCBhcmUgdGhlIGEub3V0IG1hZ2ljIG51bWJlcnMgZm9yIHRoZSBpODYwPyAgKi8KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gMDsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogSTg2MCAqLwotI2lmZGVmIEk5NjAKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gKG1hZ2ljID09IEk5NjBST01BR0lDID8gTk1BR0lDIDogT01BR0lDKTsKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYgLyogSTk2MCAqLwotI2lmIE04OAotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gUEFHRU1BR0lDQkNTOwotI2VuZGlmIC8qIE04OCAqLwotCi0jaWYgQVBPTExPX002OAotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gQVBPTExPX0NPRkZfVkVSU0lPTl9OVU1CRVI7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoTTY4KSB8fCBkZWZpbmVkKFdFMzJLKSB8fCBkZWZpbmVkKE02OEspCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2lmIGRlZmluZWQoTFlOWE9TKQotICAgIGludGVybmFsX2EubWFnaWMgPSBMWU5YQ09GRk1BR0lDOwotI2Vsc2UKLSNpZiBkZWZpbmVkKFRBUkdfQVVYKQotICAgIGludGVybmFsX2EubWFnaWMgPSAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEID8gUEFHRU1BR0lDUEVYRUNQQUdFRCA6Ci0JCQlhYmZkLT5mbGFncyAmIFdQX1RFWFQgPyBQQUdFTUFHSUNQRVhFQ1NXQVBQRUQgOgotCQkJUEFHRU1BR0lDRVhFQ1NXQVBQRUQpOwotI2Vsc2UKLSNpZiBkZWZpbmVkIChQQUdFTUFHSUNQRVhFQ1BBR0VEKQotICAgIGludGVybmFsX2EubWFnaWMgPSBQQUdFTUFHSUNQRVhFQ1BBR0VEOwotI2VuZGlmCi0jZW5kaWYgLyogVEFSR19BVVggKi8KLSNlbmRpZiAvKiBMWU5YT1MgKi8KLSNlbmRpZiAvKiBNNjggfHwgV0UzMksgfHwgTTY4SyAqLwotCi0jaWYgZGVmaW5lZChBUk0pCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotICAgIGludGVybmFsX2EubWFnaWMgPSBaTUFHSUM7Ci0jZW5kaWYgCi0KLSNpZiBkZWZpbmVkKFBQQ19QRSkKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQzsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBNQ09SRV9QRQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gSU1BR0VfTlRfT1BUSU9OQUxfSERSX01BR0lDOwotI2VuZGlmIAotCi0jaWYgZGVmaW5lZChJMzg2KQotI2RlZmluZSBfX0FfTUFHSUNfU0VUX18KLSNpZiBkZWZpbmVkKExZTlhPUykKLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gTFlOWENPRkZNQUdJQzsKLSNlbHNlICAvKiBMWU5YT1MgKi8KLSAgICBpbnRlcm5hbF9hLm1hZ2ljID0gWk1BR0lDOwotI2VuZGlmIC8qIExZTlhPUyAqLwotI2VuZGlmIC8qIEkzODYgKi8KLQotI2lmIGRlZmluZWQoU1BBUkMpCi0jZGVmaW5lIF9fQV9NQUdJQ19TRVRfXwotI2lmIGRlZmluZWQoTFlOWE9TKQotICAgIGludGVybmFsX2EubWFnaWMgPSBMWU5YQ09GRk1BR0lDOwotI2VuZGlmIC8qIExZTlhPUyAqLwotI2VuZGlmIC8qIFNQQVJDICovCi0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSNkZWZpbmUgX19BX01BR0lDX1NFVF9fCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IChhYmZkLT5mbGFncyAmIERfUEFHRUQpID8gUlM2S19BT1VUSERSX1pNQUdJQyA6Ci0gICAgKGFiZmQtPmZsYWdzICYgV1BfVEVYVCkgPyBSUzZLX0FPVVRIRFJfTk1BR0lDIDoKLSAgICBSUzZLX0FPVVRIRFJfT01BR0lDOwotI2VuZGlmCi0KLSNpZm5kZWYgX19BX01BR0lDX1NFVF9fCi0jaW5jbHVkZSAiWW91ciBhb3V0aGRyIG1hZ2ljIG51bWJlciBpcyBub3QgYmVpbmcgc2V0ISIKLSNlbHNlCi0jdW5kZWYgX19BX01BR0lDX1NFVF9fCi0jZW5kaWYKLSAgfQotCi0gIC8qIEZJWE1FOiBEb2VzIGFueWJvZHkgZXZlciBzZXQgdGhpcyB0byBhbm90aGVyIHZhbHVlPyAgKi8KLSAgaW50ZXJuYWxfYS52c3RhbXAgPSAwOwotCi0gIC8qIE5vdyBzaG91bGQgd3JpdGUgcmVsb2NzLCBzdHJpbmdzLCBzeW1zICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBzeW1fYmFzZTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZmlyc3R1bmRlZjsKLSNpZiAwCi0gICAgICBpZiAoIWNvZmZfYWRkX21pc3Npbmdfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0gICAgICBpZiAoIWNvZmZfcmVudW1iZXJfc3ltYm9scyAoYWJmZCwgJmZpcnN0dW5kZWYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGNvZmZfbWFuZ2xlX3N5bWJvbHMgKGFiZmQpOwotICAgICAgaWYgKCEgY29mZl93cml0ZV9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBjb2ZmX3dyaXRlX3JlbG9jcyAoYWJmZCwgZmlyc3R1bmRlZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICBlbHNlIGlmIChsb25nX3NlY3Rpb25fbmFtZXMpCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBsb25nIHNlY3Rpb24gbmFtZXMgd2UgaGF2ZSB0byB3cml0ZSBvdXQgdGhlIHN0cmluZwotICAgICAgICAgdGFibGUgZXZlbiBpZiB0aGVyZSBhcmUgbm8gc3ltYm9scy4gICovCi0gICAgICBpZiAoISBjb2ZmX3dyaXRlX3N5bWJvbHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNpZmRlZiBQUENfUEUKLSAgZWxzZSBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlIGI7Ci0KLSAgICAgIC8qIFBvd2VyUEMgUEUgYXBwZWFycyB0byByZXF1aXJlIHRoYXQgYWxsIGV4ZWN1dGFibGUgZmlsZXMgYmUKLSAgICAgICAgIHJvdW5kZWQgdXAgdG8gdGhlIHBhZ2Ugc2l6ZS4gICovCi0gICAgICBiID0gMDsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIEJGRF9BTElHTiAoc3ltX2Jhc2UsIENPRkZfUEFHRV9TSVpFKSAtIDEsCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlICgmYiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLQotICAvKiBJZiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwLCB0aGVuIHdlIGFyZSBub3QgdXNpbmcgdGhlIENPRkYKLSAgICAgYmFja2VuZCBsaW5rZXIsIGFuZCBvYmpfcmF3X3N5bWVudF9jb3VudCBpcyBub3QgdmFsaWQgdW50aWwgYWZ0ZXIKLSAgICAgY29mZl93cml0ZV9zeW1ib2xzIGlzIGNhbGxlZC4gICovCi0gIGlmIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9mLmZfc3ltcHRyID0gc3ltX2Jhc2U7Ci0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgICAvKiBBSVggYXBwZWFycyB0byByZXF1aXJlIHRoYXQgRl9SRUxGTEcgbm90IGJlIHNldCBpZiB0aGVyZSBhcmUKLSAgICAgICAgIGxvY2FsIHN5bWJvbHMgYnV0IG5vIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIGludGVybmFsX2YuZl9mbGFncyAmPX4gRl9SRUxGTEc7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobG9uZ19zZWN0aW9uX25hbWVzKQotCWludGVybmFsX2YuZl9zeW1wdHIgPSBzeW1fYmFzZTsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9mLmZfc3ltcHRyID0gMDsKLSAgICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX0xTWU1TOwotICAgIH0KLQotICBpZiAodGV4dF9zZWMpCi0gICAgewotICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAodGV4dF9zZWMpOwotICAgICAgaW50ZXJuYWxfYS50ZXh0X3N0YXJ0ID0gaW50ZXJuYWxfYS50c2l6ZSA/IHRleHRfc2VjLT52bWEgOiAwOwotICAgIH0KLSAgaWYgKGRhdGFfc2VjKQotICAgIHsKLSAgICAgIGludGVybmFsX2EuZHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGRhdGFfc2VjKTsKLSAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGludGVybmFsX2EuZHNpemUgPyBkYXRhX3NlYy0+dm1hIDogMDsKLSAgICB9Ci0gIGlmIChic3Nfc2VjKQotICAgIHsKLSAgICAgIGludGVybmFsX2EuYnNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGJzc19zZWMpOwotICAgICAgaWYgKGludGVybmFsX2EuYnNpemUgJiYgYnNzX3NlYy0+dm1hIDwgaW50ZXJuYWxfYS5kYXRhX3N0YXJ0KQotCWludGVybmFsX2EuZGF0YV9zdGFydCA9IGJzc19zZWMtPnZtYTsKLSAgICB9Ci0KLSAgaW50ZXJuYWxfYS5lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gIGludGVybmFsX2YuZl9uc3ltcyA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICBpZiAoeGNvZmZfZGF0YSAoYWJmZCktPmZ1bGxfYW91dGhkcikKLSAgICB7Ci0gICAgICBiZmRfdm1hIHRvYzsKLSAgICAgIGFzZWN0aW9uICpsb2FkZXJfc2VjOwotCi0gICAgICBpbnRlcm5hbF9hLnZzdGFtcCA9IDE7Ci0KLSAgICAgIGludGVybmFsX2Eub19zbmVudHJ5ID0geGNvZmZfZGF0YSAoYWJmZCktPnNuZW50cnk7Ci0gICAgICBpZiAoaW50ZXJuYWxfYS5vX3NuZW50cnkgPT0gMCkKLQlpbnRlcm5hbF9hLmVudHJ5ID0gKGJmZF92bWEpIC0xOwotCi0gICAgICBpZiAodGV4dF9zZWMgIT0gTlVMTCkKLQl7Ci0JICBpbnRlcm5hbF9hLm9fc250ZXh0ID0gdGV4dF9zZWMtPnRhcmdldF9pbmRleDsKLQkgIGludGVybmFsX2Eub19hbGdudGV4dCA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHRleHRfc2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50ZXJuYWxfYS5vX3NudGV4dCA9IDA7Ci0JICBpbnRlcm5hbF9hLm9fYWxnbnRleHQgPSAwOwotCX0KLSAgICAgIGlmIChkYXRhX3NlYyAhPSBOVUxMKQotCXsKLQkgIGludGVybmFsX2Eub19zbmRhdGEgPSBkYXRhX3NlYy0+dGFyZ2V0X2luZGV4OwotCSAgaW50ZXJuYWxfYS5vX2FsZ25kYXRhID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgZGF0YV9zZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnRlcm5hbF9hLm9fc25kYXRhID0gMDsKLQkgIGludGVybmFsX2Eub19hbGduZGF0YSA9IDA7Ci0JfQotICAgICAgbG9hZGVyX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICAgICAgaWYgKGxvYWRlcl9zZWMgIT0gTlVMTCkKLQlpbnRlcm5hbF9hLm9fc25sb2FkZXIgPSBsb2FkZXJfc2VjLT50YXJnZXRfaW5kZXg7Ci0gICAgICBlbHNlCi0JaW50ZXJuYWxfYS5vX3NubG9hZGVyID0gMDsKLSAgICAgIGlmIChic3Nfc2VjICE9IE5VTEwpCi0JaW50ZXJuYWxfYS5vX3NuYnNzID0gYnNzX3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgZWxzZQotCWludGVybmFsX2Eub19zbmJzcyA9IDA7Ci0KLSAgICAgIHRvYyA9IHhjb2ZmX2RhdGEgKGFiZmQpLT50b2M7Ci0gICAgICBpbnRlcm5hbF9hLm9fdG9jID0gdG9jOwotICAgICAgaW50ZXJuYWxfYS5vX3NudG9jID0geGNvZmZfZGF0YSAoYWJmZCktPnNudG9jOwotCi0gICAgICBpbnRlcm5hbF9hLm9fbW9kdHlwZSA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5tb2R0eXBlOwotICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5jcHV0eXBlICE9IC0xKQotCWludGVybmFsX2Eub19jcHV0eXBlID0geGNvZmZfZGF0YSAoYWJmZCktPmNwdXR5cGU7Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotCSAgICAgIGludGVybmFsX2Eub19jcHV0eXBlID0gNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotCSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IDApCi0JCWludGVybmFsX2Eub19jcHV0eXBlID0gMzsKLQkgICAgICBlbHNlCi0JCWludGVybmFsX2Eub19jcHV0eXBlID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCX0KLSAgICAgIGludGVybmFsX2Eub19tYXhzdGFjayA9IHhjb2ZmX2RhdGEgKGFiZmQpLT5tYXhzdGFjazsKLSAgICAgIGludGVybmFsX2Eub19tYXhkYXRhID0geGNvZmZfZGF0YSAoYWJmZCktPm1heGRhdGE7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogbm93IHdyaXRlIHRoZW0gKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgewotICAgIGNoYXIgYnVmZltGSUxIU1pdOwotICAgIGNvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgKFBUUikgJiBpbnRlcm5hbF9mLCAoUFRSKSBidWZmKTsKLSAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmLCAxLCBGSUxIU1osIGFiZmQpICE9IEZJTEhTWikKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgLyogTm90ZSB0aGF0IHBlaWNvZGUuaCBmaWxscyBpbiBhIFBFQU9VVEhEUiwgbm90IGFuIEFPVVRIRFIuIAotCSBpbmNsdWRlL2NvZmYvcGUuaCBzZXRzIEFPVVRTWiA9PSBzaXplb2YoUEVBT1VUSERSKSkgKi8KLSAgICAgIGNoYXIgYnVmZltBT1VUU1pdOwotICAgICAgY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmIGludGVybmFsX2EsIChQVFIpIGJ1ZmYpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZiwgMSwgQU9VVFNaLCBhYmZkKSAhPSBBT1VUU1opCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLSAgZWxzZQotICAgIHsKLSAgICAgIEFPVVRIRFIgYnVmZjsKLSAgICAgIHNpemVfdCBzaXplOwotCi0gICAgICAvKiBYQ09GRiBzZWVtcyB0byBhbHdheXMgd3JpdGUgYXQgbGVhc3QgYSBzbWFsbCBhLm91dCBoZWFkZXIuICAqLwotICAgICAgY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmaW50ZXJuYWxfYSwgKFBUUikgJmJ1ZmYpOwotICAgICAgaWYgKHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIpCi0Jc2l6ZSA9IEFPVVRTWjsKLSAgICAgIGVsc2UKLQlzaXplID0gU01BTExfQU9VVFNaOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmJ1ZmYsIDEsIHNpemUsIGFiZmQpICE9IHNpemUpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQkvKiBzZXQgYnkgYmZkLmMgaGFuZGxlciAqLwotICAgIHsKLSAgICAgIGlmICghIGNvZmZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0jaWYgZGVmaW5lZChfTElCKSAmJiAhZGVmaW5lZChUQVJHX0FVWCkKLQotICAgLyogVGhlIHBoeXNpY2FsIGFkZHJlc3MgZmllbGQgb2YgYSAubGliIHNlY3Rpb24gaXMgdXNlZCB0byBob2xkIHRoZQotICAgICAgbnVtYmVyIG9mIHNoYXJlZCBsaWJyYXJpZXMgaW4gdGhlIHNlY3Rpb24uICBUaGlzIGNvZGUgY291bnRzIHRoZQotICAgICAgbnVtYmVyIG9mIHNlY3Rpb25zIGJlaW5nIHdyaXR0ZW4sIGFuZCBpbmNyZW1lbnRzIHRoZSBsbWEgZmllbGQKLSAgICAgIHdpdGggdGhlIG51bWJlci4KLQotICAgICAgSSBoYXZlIGZvdW5kIG5vIGRvY3VtZW50YXRpb24gb24gdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbi4KLSAgICAgIEV4cGVyaW1lbnRhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VjdGlvbiBjb250YWlucyB6ZXJvIG9yIG1vcmUKLSAgICAgIHJlY29yZHMsIGVhY2ggb2Ygd2hpY2ggaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotCi0gICAgICAtIGEgKGZvdXIgYnl0ZSkgd29yZCBob2xkaW5nIHRoZSBsZW5ndGggb2YgdGhpcyByZWNvcmQsIGluIHdvcmRzLAotICAgICAgLSBhIHdvcmQgdGhhdCBhbHdheXMgc2VlbXMgdG8gYmUgc2V0IHRvICIyIiwKLSAgICAgIC0gdGhlIHBhdGggdG8gYSBzaGFyZWQgbGlicmFyeSwgbnVsbC10ZXJtaW5hdGVkIGFuZCB0aGVuIHBhZGRlZAotICAgICAgICB0byBhIHdob2xlIHdvcmQgYm91bmRhcnkuCi0KLSAgICAgIGJmZF9hc3NlcnQgY2FsbHMgaGF2ZSBiZWVuIGFkZGVkIHRvIGFsZXJ0IGlmIGFuIGF0dGVtcHQgaXMgbWFkZQotICAgICAgdG8gd3JpdGUgYSBzZWN0aW9uIHdoaWNoIGRvZXNuJ3QgZm9sbG93IHRoZXNlIGFzc3VtcHRpb25zLiAgVGhlCi0gICAgICBjb2RlIGhhcyBiZWVuIHRlc3RlZCBvbiBJU0MgNC4xIGJ5IG1lLCBhbmQgb24gU0NPIGJ5IFJvYmVydCBMaXBlCi0gICAgICA8cm9iZXJ0bEBhcm5ldC5jb20+IChUaGFua3MhKS4KLSAgCi0gICAgICBHdnJhbiBVZGRlYm9yZyA8Z3ZyYW5AdWRkZWJvcmcucHAuc2U+ICovCi0KLSAgICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElCKSA9PSAwKQotICAgICAgewotCWJmZF9ieXRlICpyZWMsICpyZWNlbmQ7Ci0KLQlyZWMgPSAoYmZkX2J5dGUgKikgbG9jYXRpb247Ci0JcmVjZW5kID0gcmVjICsgY291bnQ7Ci0Jd2hpbGUgKHJlYyA8IHJlY2VuZCkKLQkgIHsKLQkgICAgKytzZWN0aW9uLT5sbWE7Ci0JICAgIHJlYyArPSBiZmRfZ2V0XzMyIChhYmZkLCByZWMpICogNDsKLQkgIH0KLQotCUJGRF9BU1NFUlQgKHJlYyA9PSByZWNlbmQpOwotICAgICAgfQotCi0jZW5kaWYKLQotICAvKiBEb24ndCB3cml0ZSBvdXQgYnNzIHNlY3Rpb25zIC0gb25lIHdheSB0byBkbyB0aGlzIGlzIHRvCi0gICAgICAgc2VlIGlmIHRoZSBmaWxlcG9zIGhhcyBub3QgYmVlbiBzZXQuICovCi0gIGlmIChzZWN0aW9uLT5maWxlcG9zID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCAhPSAwKQotICAgIHsKLSAgICAgIHJldHVybiAoYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpID09IGNvdW50KSA/IHRydWUgOiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotI2lmIDAKLXN0YXRpYyBib29sZWFuCi1jb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICghYmZkX3JlYWRfcCAoYWJmZCkpCi0gICAgc3dpdGNoIChhYmZkLT5mb3JtYXQpCi0gICAgICB7Ci0gICAgICBjYXNlIGJmZF9hcmNoaXZlOgotCWlmICghX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIChhYmZkKSkKLQkgIHJldHVybiBmYWxzZTsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX29iamVjdDoKLQlpZiAoIWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKSkKLQkgIHJldHVybiBmYWxzZTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgLyogV2UgZGVwZW5kIG9uIGJmZF9jbG9zZSB0byBmcmVlIGFsbCB0aGUgbWVtb3J5IG9uIHRoZSBvYmphbGxvYy4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKLQotc3RhdGljIFBUUgotYnV5X2FuZF9yZWFkIChhYmZkLCB3aGVyZSwgc2Vla19kaXJlY3Rpb24sIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmlsZV9wdHIgd2hlcmU7Ci0gICAgIGludCBzZWVrX2RpcmVjdGlvbjsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBhcmVhID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgaWYgKCFhcmVhKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgd2hlcmUsIHNlZWtfZGlyZWN0aW9uKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoYXJlYSwgMSwgc2l6ZSwgYWJmZCkgIT0gc2l6ZSkKLSAgICByZXR1cm4gKE5VTEwpOwotICByZXR1cm4gKGFyZWEpOwotfQkJCQkvKiBidXlfYW5kX3JlYWQoKSAqLwotCi0vKgotU1VCU1VCU0VDVElPTgotCVJlYWRpbmcgbGluZW51bWJlcnMKLQotCUNyZWF0aW5nIHRoZSBsaW5lbnVtYmVyIHRhYmxlIGlzIGRvbmUgYnkgcmVhZGluZyBpbiB0aGUgZW50aXJlCi0JY29mZiBsaW5lbnVtYmVyIHRhYmxlLCBhbmQgY3JlYXRpbmcgYW5vdGhlciB0YWJsZSBmb3IgaW50ZXJuYWwgdXNlLgotCi0JQSBjb2ZmIGxpbmVudW1iZXIgdGFibGUgaXMgc3RydWN0dXJlZCBzbyB0aGF0IGVhY2ggZnVuY3Rpb24KLQlpcyBtYXJrZWQgYXMgaGF2aW5nIGEgbGluZSBudW1iZXIgb2YgMC4gRWFjaCBsaW5lIHdpdGhpbiB0aGUKLQlmdW5jdGlvbiBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgbGluZSBpbiB0aGUgZnVuY3Rpb24uIFRoZQotCWJhc2Ugb2YgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGUgdGFibGUgaXMgc3RvcmVkIGluCi0JdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgotCi0JVGhlIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBleHRlcm5hbCB0byB0aGUgaW50ZXJuYWwKLQl0YWJsZSwgYW5kIGVhY2ggc3ltYm9sIHdoaWNoIG1hcmtzIGEgZnVuY3Rpb24gaXMgbWFya2VkIGJ5Ci0JcG9pbnRpbmcgaXRzLi4uCi0KLQlIb3cgZG9lcyB0aGlzIHdvcmsgPwotCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zbHVycF9saW5lX3RhYmxlIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci17Ci0gIExJTkVOTyAqbmF0aXZlX2xpbmVubzsKLSAgYWxlbnQgKmxpbmVub19jYWNoZTsKLQotICBCRkRfQVNTRVJUIChhc2VjdC0+bGluZW5vID09IChhbGVudCAqKSBOVUxMKTsKLQotICBuYXRpdmVfbGluZW5vID0gKExJTkVOTyAqKSBidXlfYW5kX3JlYWQgKGFiZmQsCi0JCQkJCSAgIGFzZWN0LT5saW5lX2ZpbGVwb3MsCi0JCQkJCSAgIFNFRUtfU0VULAotCQkJCQkgICAoc2l6ZV90KSAoTElORVNaICoKLQkJCQkJCSAgICAgYXNlY3QtPmxpbmVub19jb3VudCkpOwotICBsaW5lbm9fY2FjaGUgPQotICAgIChhbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIChzaXplX3QpICgoYXNlY3QtPmxpbmVub19jb3VudCArIDEpICogc2l6ZW9mIChhbGVudCkpKTsKLSAgaWYgKGxpbmVub19jYWNoZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKLSAgICAgIGFsZW50ICpjYWNoZV9wdHIgPSBsaW5lbm9fY2FjaGU7Ci0gICAgICBMSU5FTk8gKnNyYyA9IG5hdGl2ZV9saW5lbm87Ci0KLSAgICAgIHdoaWxlIChjb3VudGVyIDwgYXNlY3QtPmxpbmVub19jb3VudCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vIGRzdDsKLQkgIGNvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIHNyYywgJmRzdCk7Ci0JICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gZHN0LmxfbG5ubzsKLQotCSAgaWYgKGNhY2hlX3B0ci0+bGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gd2FybmVkOwotCSAgICAgIGxvbmcgc3ltbmR4OwotCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKnN5bTsKLQotCSAgICAgIHdhcm5lZCA9IGZhbHNlOwotCSAgICAgIHN5bW5keCA9IGRzdC5sX2FkZHIubF9zeW1uZHg7Ci0JICAgICAgaWYgKHN5bW5keCA8IDAKLQkJICB8fCAodW5zaWduZWQgbG9uZykgc3ltbmR4ID49IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gbGluZSBudW1iZXJzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5sX2FkZHIubF9zeW1uZHgpOwotCQkgIHN5bW5keCA9IDA7Ci0JCSAgd2FybmVkID0gdHJ1ZTsKLQkJfQotCSAgICAgIC8qIEZJWE1FOiBXZSBzaG91bGQgbm90IGJlIGNhc3RpbmcgYmV0d2VlbiBpbnRzIGFuZAotICAgICAgICAgICAgICAgICBwb2ludGVycyBsaWtlIHRoaXMuICAqLwotCSAgICAgIHN5bSA9ICgoY29mZl9zeW1ib2xfdHlwZSAqKQotCQkgICAgICgoc3ltbmR4ICsgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSkKLQkJICAgICAgLT51LnN5bWVudC5fbi5fbl9uLl9uX3plcm9lcykpOwotCSAgICAgIGNhY2hlX3B0ci0+dS5zeW0gPSAoYXN5bWJvbCAqKSBzeW07Ci0JICAgICAgaWYgKHN5bS0+bGluZW5vICE9IE5VTEwgJiYgISB3YXJuZWQpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogd2FybmluZzogZHVwbGljYXRlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBgJXMnIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCSAgICAgYmZkX2FzeW1ib2xfbmFtZSAoJnN5bS0+c3ltYm9sKSk7Ci0JCX0KLQkgICAgICBzeW0tPmxpbmVubyA9IGNhY2hlX3B0cjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2FjaGVfcHRyLT51Lm9mZnNldCA9IGRzdC5sX2FkZHIubF9wYWRkcgotCQktIGJmZF9zZWN0aW9uX3ZtYSAoYWJmZCwgYXNlY3QpOwotCSAgICB9CQkJLyogSWYgbm8gbGluZW51bWJlciBleHBlY3QgYSBzeW1ib2wgaW5kZXggKi8KLQotCSAgY2FjaGVfcHRyKys7Ci0JICBzcmMrKzsKLQkgIGNvdW50ZXIrKzsKLQl9Ci0gICAgICBjYWNoZV9wdHItPmxpbmVfbnVtYmVyID0gMDsKLQotICAgIH0KLSAgYXNlY3QtPmxpbmVubyA9IGxpbmVub19jYWNoZTsKLSAgLyogRklYTUUsIGZyZWUgbmF0aXZlX2xpbmVubyBoZXJlLCBvciB1c2UgYWxsb2NhIG9yIHNvbWV0aGluZy4gKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlX3N5bWJvbHM7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNhY2hlZF9hcmVhOwotICB1bnNpZ25lZCBpbnQgKnRhYmxlX3B0cjsKLQotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX3N5bWJvbHMgPSAwOwotCi0gIGlmIChvYmpfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHRhYmxlICovCi0gIGlmICgobmF0aXZlX3N5bWJvbHMgPSBjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiAoYWJmZCkpID09IE5VTEwpCi0gICAgewotICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQkJCQkvKiBvbiBlcnJvciAqLwotCi0gIC8qIEFsbG9jYXRlIGVub3VnaCByb29tIGZvciBhbGwgdGhlIHN5bWJvbHMgaW4gY2FjaGVkIGZvcm0gKi8KLSAgY2FjaGVkX2FyZWEgPSAoKGNvZmZfc3ltYm9sX3R5cGUgKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAob2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpCi0JCQkgICAgICogc2l6ZW9mIChjb2ZmX3N5bWJvbF90eXBlKSkpKTsKLQotICBpZiAoY2FjaGVkX2FyZWEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHRhYmxlX3B0ciA9ICgodW5zaWduZWQgaW50ICopCi0JICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKQotCQkJICAgKiBzaXplb2YgKHVuc2lnbmVkIGludCkpKSk7Ci0KLSAgaWYgKHRhYmxlX3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmRzdCA9IGNhY2hlZF9hcmVhOwotICAgICAgdW5zaWduZWQgaW50IGxhc3RfbmF0aXZlX2luZGV4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotICAgICAgdW5zaWduZWQgaW50IHRoaXNfaW5kZXggPSAwOwotICAgICAgd2hpbGUgKHRoaXNfaW5kZXggPCBsYXN0X25hdGl2ZV9pbmRleCkKLQl7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpzcmMgPSBuYXRpdmVfc3ltYm9scyArIHRoaXNfaW5kZXg7Ci0JICB0YWJsZV9wdHJbdGhpc19pbmRleF0gPSBudW1iZXJfb2Zfc3ltYm9sczsKLQkgIGRzdC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0JICBkc3QtPnN5bWJvbC5uYW1lID0gKGNoYXIgKikgKHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQpOwotCSAgLyogV2UgdXNlIHRoZSBuYXRpdmUgbmFtZSBmaWVsZCB0byBwb2ludCB0byB0aGUgY2FjaGVkIGZpZWxkLiAgKi8KLQkgIHNyYy0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAobG9uZykgZHN0OwotCSAgZHN0LT5zeW1ib2wuc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCSAgICAgc3JjLT51LnN5bWVudC5uX3NjbnVtKTsKLQkgIGRzdC0+c3ltYm9sLmZsYWdzID0gMDsKLQkgIGRzdC0+ZG9uZV9saW5lbm8gPSBmYWxzZTsKLQotCSAgc3dpdGNoIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzKQotCSAgICB7Ci0jaWZkZWYgSTk2MAotCSAgICBjYXNlIENfTEVBRkVYVDoKLSNpZiAwCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUgLSBkc3QtPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKLSNlbmRpZgotCSAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBuZXh0IGNhc2UgKi8KLQotI2VuZGlmCi0KLQkgICAgY2FzZSBDX0VYVDoKLQkgICAgY2FzZSBDX1dFQUtFWFQ6Ci0jaWYgZGVmaW5lZCBBUk0KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVDoKLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkVYVEZVTkM6Ci0jZW5kaWYKLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgY2FzZSBDX0hJREVYVDoKLSNlbmRpZgotI2lmZGVmIENfU1lTVEVNCi0JICAgIGNhc2UgQ19TWVNURU06CS8qIFN5c3RlbSBXaWRlIHZhcmlhYmxlICovCi0jZW5kaWYKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSAgICAgICAgICAgIC8qIFBFIHVzZXMgc3RvcmFnZSBjbGFzcyAweDY4IHRvIGRlbm90ZSBhIHNlY3Rpb24gc3ltYm9sICovCi0gICAgICAgICAgICBjYXNlIENfU0VDVElPTjoKLQkgICAgLyogUEUgdXNlcyBzdG9yYWdlIGNsYXNzIDB4NjkgZm9yIGEgd2VhayBleHRlcm5hbCBzeW1ib2wuICAqLwotCSAgICBjYXNlIENfTlRfV0VBSzoKLSNlbmRpZgotCSAgICAgIGlmICgoc3JjLT51LnN5bWVudC5uX3NjbnVtKSA9PSAwKQotCQl7Ci0JCSAgaWYgKChzcmMtPnUuc3ltZW50Lm5fdmFsdWUpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGRzdC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkJICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoc3JjLT51LnN5bWVudC5uX3ZhbHVlKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSAgICAgc2VjdGlvbiAqLwotCi0JCSAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX0dMT0JBTDsKLQotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQotCQkgIGlmIChJU0ZDTiAoKHNyYy0+dS5zeW1lbnQubl90eXBlKSkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEEgZnVuY3Rpb24gZXh0IGRvZXMgbm90IGdvIGF0IHRoZSBlbmQgb2YgYQotCQkJIGZpbGUuICAqLwotCQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORCB8IEJTRl9GVU5DVElPTjsKLQkJICAgIH0KLQkJfQotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0JICAgICAgLyogQSBDX0hJREVYVCBzeW1ib2wgaXMgbm90IGdsb2JhbC4gICovCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19ISURFWFQpCi0JCWRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgICAgIC8qIEEgc3ltYm9sIHdpdGggYSBjc2VjdCBlbnRyeSBzaG91bGQgbm90IGdvIGF0IHRoZSBlbmQuICAqLwotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgfD0gQlNGX05PVF9BVF9FTkQ7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfV0lUSF9QRQotCSAgICAgIGlmIChzcmMtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfTlRfV0VBSykKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfV0VBSzsKLQkgICAgICBpZiAoc3JjLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1NFQ1RJT04KLQkJICAmJiBzcmMtPnUuc3ltZW50Lm5fc2NudW0gPiAwKQotCQl7Ci0JCSAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JCX0KLSNlbmRpZgotCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9XRUFLOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX1NUQVQ6CS8qIHN0YXRpYwkJCSAqLwotI2lmZGVmIEk5NjAKLQkgICAgY2FzZSBDX0xFQUZTVEFUOgkvKiBzdGF0aWMgbGVhZiBwcm9jZWR1cmUgICAgICAgICovCi0jZW5kaWYKLSNpZiBkZWZpbmVkIEFSTSAKLSAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVQ6ICAgLyogVGh1bWIgc3RhdGljICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQkxBQkVMOiAgLyogVGh1bWIgbGFiZWwgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGNhc2UgQ19USFVNQlNUQVRGVU5DOi8qIFRodW1iIHN0YXRpYyBmdW5jdGlvbiAgICAgICAgKi8KLSNlbmRpZgotCSAgICBjYXNlIENfTEFCRUw6CS8qIGxhYmVsCQkJICovCi0JICAgICAgaWYgKHNyYy0+dS5zeW1lbnQubl9zY251bSA9PSAtMikKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGVsc2UKLQkJZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0KLQkgICAgICAvKiBCYXNlIHRoZSB2YWx1ZSBhcyBhbiBpbmRleCBmcm9tIHRoZSBiYXNlIG9mIHRoZQotCQkgc2VjdGlvbiwgaWYgdGhlcmUgaXMgb25lLiAgKi8KLQkgICAgICBpZiAoZHN0LT5zeW1ib2wuc2VjdGlvbikKLQkJewotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JCSAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgc2VjdGlvbi4gICovCi0JCSAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCQkgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCSAgICAgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGVsc2UKLQkJZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX01PUzoJLyogbWVtYmVyIG9mIHN0cnVjdHVyZQkgKi8KLQkgICAgY2FzZSBDX0VPUzoJLyogZW5kIG9mIHN0cnVjdHVyZQkJICovCi0jaWZkZWYgTk9UREVGCQkJLyogQ19BVVRPQVJHIGhhcyB0aGUgc2FtZSB2YWx1ZSAqLwotI2lmZGVmIENfR0xCTFJFRwotCSAgICBjYXNlIENfR0xCTFJFRzoJLyogQTI5ay1zcGVjaWZpYyBzdG9yYWdlIGNsYXNzICovCi0jZW5kaWYKLSNlbmRpZgotCSAgICBjYXNlIENfUkVHUEFSTToJLyogcmVnaXN0ZXIgcGFyYW1ldGVyCQkgKi8KLQkgICAgY2FzZSBDX1JFRzoJLyogcmVnaXN0ZXIgdmFyaWFibGUJCSAqLwotI2lmbmRlZiBUSUM4MENPRkYKLSNpZmRlZiBDX0FVVE9BUkcKLQkgICAgY2FzZSBDX0FVVE9BUkc6CS8qIDk2MC1zcGVjaWZpYyBzdG9yYWdlIGNsYXNzICovCi0jZW5kaWYKLSNlbmRpZgotCSAgICBjYXNlIENfVFBERUY6CS8qIHR5cGUgZGVmaW5pdGlvbgkJICovCi0JICAgIGNhc2UgQ19BUkc6Ci0JICAgIGNhc2UgQ19BVVRPOgkvKiBhdXRvbWF0aWMgdmFyaWFibGUgKi8KLQkgICAgY2FzZSBDX0ZJRUxEOgkvKiBiaXQgZmllbGQgKi8KLQkgICAgY2FzZSBDX0VOVEFHOgkvKiBlbnVtZXJhdGlvbiB0YWcJCSAqLwotCSAgICBjYXNlIENfTU9FOgkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24JICovCi0JICAgIGNhc2UgQ19NT1U6CS8qIG1lbWJlciBvZiB1bmlvbgkJICovCi0JICAgIGNhc2UgQ19VTlRBRzoJLyogdW5pb24gdGFnCQkJICovCi0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDX0ZJTEU6CS8qIGZpbGUgbmFtZQkJCSAqLwotCSAgICBjYXNlIENfU1RSVEFHOgkvKiBzdHJ1Y3R1cmUgdGFnCQkgKi8KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgY2FzZSBDX0dTWU06Ci0JICAgIGNhc2UgQ19MU1lNOgotCSAgICBjYXNlIENfUFNZTToKLQkgICAgY2FzZSBDX1JTWU06Ci0JICAgIGNhc2UgQ19SUFNZTToKLQkgICAgY2FzZSBDX1NUU1lNOgotCSAgICBjYXNlIENfQkNPTU06Ci0JICAgIGNhc2UgQ19FQ09NTToKLQkgICAgY2FzZSBDX0RFQ0w6Ci0JICAgIGNhc2UgQ19FTlRSWToKLQkgICAgY2FzZSBDX0ZVTjoKLQkgICAgY2FzZSBDX0VTVEFUOgotI2VuZGlmCi0JICAgICAgZHN0LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gKHNyYy0+dS5zeW1lbnQubl92YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBSUzYwMDBDT0ZGX0MKLQkgICAgY2FzZSBDX0JJTkNMOgkvKiBiZWdpbm5pbmcgb2YgaW5jbHVkZSBmaWxlICAgICAqLwotCSAgICBjYXNlIENfRUlOQ0w6CS8qIGVuZGluZyBvZiBpbmNsdWRlIGZpbGUgICAgICAgICovCi0JICAgICAgLyogVGhlIHZhbHVlIGlzIGFjdHVhbGx5IGEgcG9pbnRlciBpbnRvIHRoZSBsaW5lIG51bWJlcnMKLSAgICAgICAgICAgICAgICAgb2YgdGhlIGZpbGUuICBXZSBsb2NhdGUgdGhlIGxpbmUgbnVtYmVyIGVudHJ5LCBhbmQKLSAgICAgICAgICAgICAgICAgc2V0IHRoZSBzZWN0aW9uIHRvIHRoZSBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIGl0LCBhbmQKLSAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRoZSBpbmRleCBpbiB0aGF0IHNlY3Rpb24uICAqLwotCSAgICAgIHsKLQkJYXNlY3Rpb24gKnNlYzsKLQotCQlkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0JCWZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0JCSAgaWYgKHNlYy0+bGluZV9maWxlcG9zIDw9IChmaWxlX3B0cikgc3JjLT51LnN5bWVudC5uX3ZhbHVlCi0JCSAgICAgICYmICgoZmlsZV9wdHIpIChzZWMtPmxpbmVfZmlsZXBvcwotCQkJCSAgICAgICsgc2VjLT5saW5lbm9fY291bnQgKiBMSU5FU1opCi0JCQkgID4gKGZpbGVfcHRyKSBzcmMtPnUuc3ltZW50Lm5fdmFsdWUpKQotCQkgICAgYnJlYWs7Ci0JCWlmIChzZWMgPT0gTlVMTCkKLQkJICBkc3QtPnN5bWJvbC52YWx1ZSA9IDA7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBkc3QtPnN5bWJvbC5zZWN0aW9uID0gc2VjOwotCQkgICAgZHN0LT5zeW1ib2wudmFsdWUgPSAoKHNyYy0+dS5zeW1lbnQubl92YWx1ZQotCQkJCQkgIC0gc2VjLT5saW5lX2ZpbGVwb3MpCi0JCQkJCSAvIExJTkVTWik7Ci0JCSAgICBzcmMtPmZpeF9saW5lID0gMTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQ19CU1RBVDoKLQkgICAgICBkc3QtPnN5bWJvbC5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0KLQkgICAgICAvKiBUaGUgdmFsdWUgaXMgYWN0dWFsbHkgYSBzeW1ib2wgaW5kZXguICBTYXZlIGEgcG9pbnRlcgotCQkgdG8gdGhlIHN5bWJvbCBpbnN0ZWFkIG9mIHRoZSBpbmRleC4gIEZJWE1FOiBUaGlzCi0JCSBzaG91bGQgdXNlIGEgdW5pb24uICAqLwotCSAgICAgIHNyYy0+dS5zeW1lbnQubl92YWx1ZSA9Ci0JCShsb25nKSAobmF0aXZlX3N5bWJvbHMgKyBzcmMtPnUuc3ltZW50Lm5fdmFsdWUpOwotCSAgICAgIGRzdC0+c3ltYm9sLnZhbHVlID0gc3JjLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgICAgIHNyYy0+Zml4X3ZhbHVlID0gMTsKLQkgICAgICBicmVhazsKLSNlbmRpZgotCi0JICAgIGNhc2UgQ19CTE9DSzoJLyogIi5iYiIgb3IgIi5lYiIJCSAqLwotCSAgICBjYXNlIENfRkNOOgkJLyogIi5iZiIgb3IgIi5lZiIJCSAqLwotCSAgICBjYXNlIENfRUZDTjoJLyogcGh5c2ljYWwgZW5kIG9mIGZ1bmN0aW9uCSAqLwotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotI2lmIGRlZmluZWQgQ09GRl9XSVRIX1BFCi0JICAgICAgLyogUEUgc2V0cyB0aGUgc3ltYm9sIHRvIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0Ci0JCSBvZiB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZHN0LT5zeW1ib2wudmFsdWUgPSBzcmMtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCSAgICAgIC8qIEJhc2UgdGhlIHZhbHVlIGFzIGFuIGluZGV4IGZyb20gdGhlIGJhc2Ugb2YgdGhlCi0JCSBzZWN0aW9uLiAgKi8KLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUKLQkJCQkgICAtIGRzdC0+c3ltYm9sLnNlY3Rpb24tPnZtYSk7Ci0jZW5kaWYKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENfTlVMTDoKLQkgICAgY2FzZSBDX0VYVERFRjoJLyogZXh0ZXJuYWwgZGVmaW5pdGlvbgkJICovCi0JICAgIGNhc2UgQ19VTEFCRUw6CS8qIHVuZGVmaW5lZCBsYWJlbAkJICovCi0JICAgIGNhc2UgQ19VU1RBVElDOgkvKiB1bmRlZmluZWQgc3RhdGljCQkgKi8KLSNpZm5kZWYgQ09GRl9XSVRIX1BFCi0gICAgICAgICAgICAvKiBDX0xJTkUgaW4gcmVndWxhciBjb2ZmIGlzIDB4NjguICBOVCBoYXMgdGFrZW4gb3ZlciB0aGlzIHN0b3JhZ2UKLSAgICAgICAgICAgICAgIGNsYXNzIHRvIHJlcHJlc2VudCBhIHNlY3Rpb24gc3ltYm9sICovCi0JICAgIGNhc2UgQ19MSU5FOgkvKiBsaW5lICMgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sIHRhYmxlIGVudHJ5ICovCi0JICAgICAgLyogTlQgdXNlcyAweDY3IGZvciBhIHdlYWsgc3ltYm9sLCBub3QgQ19BTElBUy4gICovCi0JICAgIGNhc2UgQ19BTElBUzoJLyogZHVwbGljYXRlIHRhZwkJICovCi0jZW5kaWYKLQkgICAgICAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciBUSWM4MCAqLwotI2lmZGVmIFRJQzgwQ09GRgotCSAgICBjYXNlIENfVUVYVDoJLyogVGVudGF0aXZlIGV4dGVybmFsIGRlZmluaXRpb24gKi8KLSNlbmRpZgotCSAgICBjYXNlIENfU1RBVExBQjoJLyogU3RhdGljIGxvYWQgdGltZSBsYWJlbCAqLwotCSAgICBjYXNlIENfRVhUTEFCOgkvKiBFeHRlcm5hbCBsb2FkIHRpbWUgbGFiZWwgKi8KLQkgICAgY2FzZSBDX0hJRERFTjoJLyogZXh0IHN5bWJvbCBpbiBkbWVydCBwdWJsaWMgbGliICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogVW5yZWNvZ25pemVkIHN0b3JhZ2UgY2xhc3MgJWQgZm9yICVzIHN5bWJvbCBgJXMnIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgc3JjLT51LnN5bWVudC5uX3NjbGFzcywKLQkJIGRzdC0+c3ltYm9sLnNlY3Rpb24tPm5hbWUsIGRzdC0+c3ltYm9sLm5hbWUpOwotCSAgICAgIGRzdC0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkgICAgICBkc3QtPnN5bWJvbC52YWx1ZSA9IChzcmMtPnUuc3ltZW50Lm5fdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLS8qICAgICAgQkZEX0FTU0VSVChkc3QtPnN5bWJvbC5mbGFncyAhPSAwKTsqLwotCi0JICBkc3QtPm5hdGl2ZSA9IHNyYzsKLQotCSAgZHN0LT5zeW1ib2wudWRhdGEuaSA9IDA7Ci0JICBkc3QtPmxpbmVubyA9IChhbGVudCAqKSBOVUxMOwotCSAgdGhpc19pbmRleCArPSAoc3JjLT51LnN5bWVudC5uX251bWF1eCkgKyAxOwotCSAgZHN0Kys7Ci0JICBudW1iZXJfb2Zfc3ltYm9scysrOwotCX0JCQkvKiB3YWxrIHRoZSBuYXRpdmUgc3ltdGFiICovCi0gICAgfQkJCQkvKiBiZmRpemUgdGhlIG5hdGl2ZSBzeW10YWIgKi8KLQotICBvYmpfc3ltYm9scyAoYWJmZCkgPSBjYWNoZWRfYXJlYTsKLSAgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSA9IG5hdGl2ZV9zeW1ib2xzOwotCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gbnVtYmVyX29mX3N5bWJvbHM7Ci0gIG9ial9jb252ZXJ0IChhYmZkKSA9IHRhYmxlX3B0cjsKLSAgLyogU2x1cnAgdGhlIGxpbmUgdGFibGVzIGZvciBlYWNoIHNlY3Rpb24gdG9vICovCi0gIHsKLSAgICBhc2VjdGlvbiAqcDsKLSAgICBwID0gYWJmZC0+c2VjdGlvbnM7Ci0gICAgd2hpbGUgKHApCi0gICAgICB7Ci0JY29mZl9zbHVycF9saW5lX3RhYmxlIChhYmZkLCBwKTsKLQlwID0gcC0+bmV4dDsKLSAgICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0JCQkJLyogY29mZl9zbHVycF9zeW1ib2xfdGFibGUoKSAqLwotCi0vKiBDaGVjayB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbGx5IHZpc2libGUuICBUaGlzIGlzIHVzZWQgYnkgdGhlCi0gICBDT0ZGIGJhY2tlbmQgbGlua2VyIGNvZGUgaW4gY29mZmxpbmsuYywgc2luY2UgYSBjb3VwbGUgb2YgdGFyZ2V0cwotICAgaGF2ZSBnbG9iYWxseSB2aXNpYmxlIHN5bWJvbHMgd2hpY2ggYXJlIG5vdCBjbGFzcyBDX0VYVC4gIFRoaXMKLSAgIGZ1bmN0aW9uIG5lZWQgbm90IGhhbmRsZSB0aGUgY2FzZSBvZiBuX2NsYXNzID09IENfRVhULiAgKi8KLQotI3VuZGVmIE9USEVSX0dMT0JBTF9DTEFTUwotCi0jaWZkZWYgSTk2MAotI2RlZmluZSBPVEhFUl9HTE9CQUxfQ0xBU1MgQ19MRUFGRVhUCi0jZW5kaWYKLQotI2lmZGVmIENPRkZBUk0KLSNkZWZpbmUgT1RIRVJfR0xPQkFMX0NMQVNTIENfVEhVTUJFWFQgfHwgc3ltZW50LT5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQwotI2Vsc2UKLSNpZmRlZiBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgT1RIRVJfR0xPQkFMX0NMQVNTIENfU0VDVElPTgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9USEVSX0dMT0JBTF9DTEFTUwotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX3N5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9zeW1faXNfZ2xvYmFsIChhYmZkLCBzeW1lbnQpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiBzeW1lbnQ7Ci17Ci0gIHJldHVybiAoc3ltZW50LT5uX3NjbGFzcyA9PSBPVEhFUl9HTE9CQUxfQ0xBU1MpOwotfQotCi0jdW5kZWYgT1RIRVJfR0xPQkFMX0NMQVNTCi0KLSNlbHNlIC8qICEgZGVmaW5lZCAoT1RIRVJfR0xPQkFMX0NMQVNTKSAqLwotCi0vKiBzeW1faXNfZ2xvYmFsIHNob3VsZCBub3QgYmUgZGVmaW5lZCBpZiBpdCBoYXMgbm90aGluZyB0byBkby4gICovCi0KLSNkZWZpbmUgY29mZl9zeW1faXNfZ2xvYmFsIDAKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoT1RIRVJfR0xPQkFMX0NMQVNTKSAqLwotCi0vKgotU1VCU1VCU0VDVElPTgotCVJlYWRpbmcgcmVsb2NhdGlvbnMKLQotCUNvZmYgcmVsb2NhdGlvbnMgYXJlIGVhc2lseSB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBpbnRlcm5hbCBCRkQgZm9ybQotCShAY29kZXthcmVsZW50fSkuCi0KLQlSZWFkaW5nIGEgY29mZiByZWxvY2F0aW9uIHRhYmxlIGlzIGRvbmUgaW4gdGhlIGZvbGxvd2luZyBzdGFnZXM6Ci0KLQlvIFJlYWQgdGhlIGVudGlyZSBjb2ZmIHJlbG9jYXRpb24gdGFibGUgaW50byBtZW1vcnkuCi0KLQlvIFByb2Nlc3MgZWFjaCByZWxvY2F0aW9uIGluIHR1cm47IGZpcnN0IHN3YXAgaXQgZnJvbSB0aGUKLQlleHRlcm5hbCB0byB0aGUgaW50ZXJuYWwgZm9ybS4KLQotCW8gVHVybiB0aGUgc3ltYm9sIHJlZmVyZW5jZWQgaW4gdGhlIHJlbG9jYXRpb24ncyBzeW1ib2wgaW5kZXgKLQlpbnRvIGEgcG9pbnRlciBpbnRvIHRoZSBjYW5vbmljYWwgc3ltYm9sIHRhYmxlLgotCVRoaXMgdGFibGUgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSByZXR1cm5lZCBieSBhIGNhbGwgdG8KLQlAY29kZXtiZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uIFRoZSBiYWNrIGVuZCB3aWxsIGNhbGwgdGhhdAotCXJvdXRpbmUgYW5kIHNhdmUgdGhlIHJlc3VsdCBpZiBhIGNhbm9uaWNhbGl6YXRpb24gaGFzbid0IGJlZW4gZG9uZS4KLQotCW8gVGhlIHJlbG9jIGluZGV4IGlzIHR1cm5lZCBpbnRvIGEgcG9pbnRlciB0byBhIGhvd3RvCi0Jc3RydWN0dXJlLCBpbiBhIGJhY2sgZW5kIHNwZWNpZmljIHdheS4gRm9yIGluc3RhbmNlLCB0aGUgMzg2Ci0JYW5kIDk2MCB1c2UgdGhlIEBjb2Rle3JfdHlwZX0gdG8gZGlyZWN0bHkgcHJvZHVjZSBhbiBpbmRleAotCWludG8gYSBob3d0byB0YWJsZSB2ZWN0b3I7IHRoZSA4OGsgc3VidHJhY3RzIGEgbnVtYmVyIGZyb20gdGhlCi0JQGNvZGV7cl90eXBlfSBmaWVsZCBhbmQgY3JlYXRlcyBhbiBhZGRlbmQgZmllbGQuCi0KLQotKi8KLQotI2lmbmRlZiBDQUxDX0FEREVORAotI2RlZmluZSBDQUxDX0FEREVORChhYmZkLCBwdHIsIHJlbG9jLCBjYWNoZV9wdHIpICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZnN5bSA9IChjb2ZmX3N5bWJvbF90eXBlICopIE5VTEw7ICAgICAgXAotICAgIGlmIChwdHIgJiYgYmZkX2FzeW1ib2xfYmZkIChwdHIpICE9IGFiZmQpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSAob2JqX3N5bWJvbHMgKGFiZmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICsgKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgLSBzeW1ib2xzKSk7ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvZmZzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBwdHIpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZmZzeW0gIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAmJiBjb2Zmc3ltLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPT0gMCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAocHRyICYmIGJmZF9hc3ltYm9sX2JmZCAocHRyKSA9PSBhYmZkICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICYmIHB0ci0+c2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkgICAgICAgICAgICAgIFwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gLSAocHRyLT5zZWN0aW9uLT52bWEgKyBwdHItPnZhbHVlKTsgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLSAgICAgYXN5bWJvbCAqKiBzeW1ib2xzOwotewotICBSRUxPQyAqbmF0aXZlX3JlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIGFyZWxlbnQgKmNhY2hlX3B0cjsKLQotICB1bnNpZ25lZCBpbnQgaWR4OwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGFzZWN0LT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoIWNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5hdGl2ZV9yZWxvY3MgPQotICAgIChSRUxPQyAqKSBidXlfYW5kX3JlYWQgKGFiZmQsCi0JCQkgICAgYXNlY3QtPnJlbF9maWxlcG9zLAotCQkJICAgIFNFRUtfU0VULAotCQkJICAgIChzaXplX3QpIChSRUxTWiAqCi0JCQkJICAgICAgYXNlY3QtPnJlbG9jX2NvdW50KSk7Ci0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIChzaXplX3QpIChhc2VjdC0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0KLSAgaWYgKHJlbG9jX2NhY2hlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0KLSAgZm9yIChpZHggPSAwOyBpZHggPCBhc2VjdC0+cmVsb2NfY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBkc3Q7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnNyYzsKLSNpZm5kZWYgUkVMT0NfUFJPQ0VTU0lORwotICAgICAgYXN5bWJvbCAqcHRyOwotI2VuZGlmCi0KLSAgICAgIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlICsgaWR4OwotICAgICAgc3JjID0gbmF0aXZlX3JlbG9jcyArIGlkeDsKLQotICAgICAgY29mZl9zd2FwX3JlbG9jX2luIChhYmZkLCBzcmMsICZkc3QpOwotCi0jaWZkZWYgUkVMT0NfUFJPQ0VTU0lORwotICAgICAgUkVMT0NfUFJPQ0VTU0lORyAoY2FjaGVfcHRyLCAmZHN0LCBzeW1ib2xzLCBhYmZkLCBhc2VjdCk7Ci0jZWxzZQotICAgICAgY2FjaGVfcHRyLT5hZGRyZXNzID0gZHN0LnJfdmFkZHI7Ci0KLSAgICAgIGlmIChkc3Qucl9zeW1uZHggIT0gLTEpCi0JewotCSAgaWYgKGRzdC5yX3N5bW5keCA8IDAgfHwgZHN0LnJfc3ltbmR4ID49IG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogd2FybmluZzogaWxsZWdhbCBzeW1ib2wgaW5kZXggJWxkIGluIHJlbG9jcyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5yX3N5bW5keCk7Ci0JICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIHB0ciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSAoc3ltYm9scwotCQkJCQkrIG9ial9jb252ZXJ0IChhYmZkKVtkc3Qucl9zeW1uZHhdKTsKLQkgICAgICBwdHIgPSAqKGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHB0ciA9IE5VTEw7Ci0JfQotCi0gICAgICAvKiBUaGUgc3ltYm9scyBkZWZpbml0aW9ucyB0aGF0IHdlIGhhdmUgcmVhZCBpbiBoYXZlIGJlZW4KLQkgcmVsb2NhdGVkIGFzIGlmIHRoZWlyIHNlY3Rpb25zIHN0YXJ0ZWQgYXQgMC4gQnV0IHRoZSBvZmZzZXRzCi0JIHJlZmVyaW5nIHRvIHRoZSBzeW1ib2xzIGluIHRoZSByYXcgZGF0YSBoYXZlIG5vdCBiZWVuCi0JIG1vZGlmaWVkLCBzbyB3ZSBoYXZlIHRvIGhhdmUgYSBuZWdhdGl2ZSBhZGRlbmQgdG8gY29tcGVuc2F0ZS4KLQotCSBOb3RlIHRoYXQgc3ltYm9scyB3aGljaCB1c2VkIHRvIGJlIGNvbW1vbiBtdXN0IGJlIGxlZnQgYWxvbmUgKi8KLQotICAgICAgLyogQ2FsY3VsYXRlIGFueSByZWxvYyBhZGRlbmQgYnkgbG9va2luZyBhdCB0aGUgc3ltYm9sICovCi0gICAgICBDQUxDX0FEREVORCAoYWJmZCwgcHRyLCBkc3QsIGNhY2hlX3B0cik7Ci0KLSAgICAgIGNhY2hlX3B0ci0+YWRkcmVzcyAtPSBhc2VjdC0+dm1hOwotLyogISEgICAgIGNhY2hlX3B0ci0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOyovCi0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGNhY2hlX3B0ci0+aG93dG8gZmllbGQgZnJvbSBkc3Qucl90eXBlICovCi0gICAgICBSVFlQRTJIT1dUTyAoY2FjaGVfcHRyLCAmZHN0KTsKLSNlbmRpZgkvKiBSRUxPQ19QUk9DRVNTSU5HICovCi0KLSAgICAgIGlmIChjYWNoZV9wdHItPmhvd3RvID09IE5VTEwpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGRzdC5yX3R5cGUsIChsb25nKSBkc3Qucl92YWRkcik7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZuZGVmIGNvZmZfcnR5cGVfdG9faG93dG8KLSNpZmRlZiBSVFlQRTJIT1dUTwotCi0vKiBHZXQgdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgYSByZWxvYy4gIFRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBmaWxlCi0gICBpbmNsdWRpbmcgdGhpcyBvbmUgZGVmaW5lcyBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gdG8gYmUKLSAgIF9iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb24sIHNvIGl0IGlzIE9LIGlmIGl0IGRvZXMgbm90Ci0gICBhbHdheXMgd29yay4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaW5jbHVkaW5nIGZpbGUgdG8KLSAgIG1ha2Ugc3VyZSBpdCBpcyByZWFzb25hYmxlIGlmIGl0IGlzIG5lZWRlZC4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpjb2ZmX3J0eXBlX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLAotCSAgIGJmZF92bWEgKikpOwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWNvZmZfcnR5cGVfdG9faG93dG8gKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBiZmRfdm1hICphZGRlbmRwOwotewotICBhcmVsZW50IGdlbnJlbDsKLQotICBSVFlQRTJIT1dUTyAoJmdlbnJlbCwgcmVsKTsKLSAgcmV0dXJuIGdlbnJlbC5ob3d0bzsKLX0KLQotI2Vsc2UgLyogISBkZWZpbmVkIChSVFlQRTJIT1dUTykgKi8KLQotI2RlZmluZSBjb2ZmX3J0eXBlX3RvX2hvd3RvIE5VTEwKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoUlRZUEUySE9XVE8pICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3J0eXBlX3RvX2hvd3RvKSAqLwotCi0vKiBUaGlzIGlzIHN0dXBpZC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgYm9vbGVhbiBwcmVkaWNhdGUuICAqLwotc3RhdGljIGxvbmcKLWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKiByZWxwdHI7Ci0gICAgIGFzeW1ib2wgKiogc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICAvKiB0aGlzIHNlY3Rpb24gaGFzIHJlbG9jcyBtYWRlIHVwIGJ5IHVzLCB0aGV5IGFyZSBub3QgaW4gdGhlCi0gICAgICAgZmlsZSwgc28gdGFrZSB0aGVtIG91dCBvZiB0aGVpciBjaGFpbiBhbmQgcGxhY2UgdGhlbSBpbnRvCi0gICAgICAgdGhlIGRhdGEgYXJlYSBwcm92aWRlZCAqLwotICAgICAgYXJlbGVudF9jaGFpbiAqY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgICpyZWxwdHIrKyA9ICZjaGFpbi0+cmVsZW50OwotCSAgY2hhaW4gPSBjaGFpbi0+bmV4dDsKLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0KLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLSNpZmRlZiBHTlU5NjAKLWZpbGVfcHRyCi1jb2ZmX3N5bV9maWxlcG9zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWxvYzE2X2VzdGltYXRlCi0jZGVmaW5lIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSBkdW1teV9yZWxvYzE2X2VzdGltYXRlCi0KLXN0YXRpYyBpbnQgZHVtbXlfcmVsb2MxNl9lc3RpbWF0ZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLCB1bnNpZ25lZCBpbnQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1kdW1teV9yZWxvYzE2X2VzdGltYXRlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGFyZWxlbnQgKnJlbG9jOwotICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotICBhYm9ydCAoKTsKLX0KLQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0KLSNkZWZpbmUgY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIGR1bW15X3JlbG9jMTZfZXh0cmFfY2FzZXMKLQotLyogVGhpcyB3b3JrcyBldmVuIGlmIGFib3J0IGlzIG5vdCBkZWNsYXJlZCBpbiBhbnkgaGVhZGVyIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZCBkdW1teV9yZWxvYzE2X2V4dHJhX2Nhc2VzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwgYXJlbGVudCAqLAotCSAgIGJmZF9ieXRlICosIHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1zdGF0aWMgdm9pZAotZHVtbXlfcmVsb2MxNl9leHRyYV9jYXNlcyAoYWJmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLCByZWxvYywgZGF0YSwgc3JjX3B0ciwKLQkJCSAgIGRzdF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGludCAqc3JjX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpkc3RfcHRyOwotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi0vKiBJZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gaXMgZGVmaW5lZCwgd2UgY2FuIHVzZSB0aGUgb3B0aW1pemVkIENPRkYKLSAgIGJhY2tlbmQgbGlua2VyLiAgT3RoZXJ3aXNlIHdlIG11c3QgY29udGludWUgdG8gdXNlIHRoZSBvbGQgbGlua2VyLiAgKi8KLSNpZmRlZiBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24KLSNpZm5kZWYgY29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9iZmRfZmluYWxfbGluawotI2RlZmluZSBjb2ZmX2JmZF9maW5hbF9saW5rIF9iZmRfY29mZl9maW5hbF9saW5rCi0jZW5kaWYKLSNlbHNlIC8qICEgZGVmaW5lZCAoY29mZl9yZWxvY2F0ZV9zZWN0aW9uKSAqLwotI2RlZmluZSBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24gTlVMTAotI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNlbmRpZgotI2RlZmluZSBjb2ZmX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZW5kaWYgLyogISBkZWZpbmVkIChjb2ZmX3JlbG9jYXRlX3NlY3Rpb24pICovCi0KLSNkZWZpbmUgY29mZl9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLSNpZm5kZWYgY29mZl9zdGFydF9maW5hbF9saW5rCi0jZGVmaW5lIGNvZmZfc3RhcnRfZmluYWxfbGluayBOVUxMCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2FkanVzdF9zeW1uZHgKLSNkZWZpbmUgY29mZl9hZGp1c3Rfc3ltbmR4IE5VTEwKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfbGlua19hZGRfb25lX3N5bWJvbAotI2RlZmluZSBjb2ZmX2xpbmtfYWRkX29uZV9zeW1ib2wgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuCi0KLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIHJldHVybiBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLQotc3RhdGljIGJvb2xlYW4gY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCAoYWJmZCwgcGZpbmZvKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiBwZmluZm87Ci17Ci0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9TV0FQX2F1eF9pbgotI2RlZmluZSBjb2ZmX1NXQVBfYXV4X2luIGNvZmZfc3dhcF9hdXhfaW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfc3ltX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9zeW1faW4gY29mZl9zd2FwX3N5bV9pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9saW5lbm9faW4KLSNkZWZpbmUgY29mZl9TV0FQX2xpbmVub19pbiBjb2ZmX3N3YXBfbGluZW5vX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2F1eF9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2F1eF9vdXQgY29mZl9zd2FwX2F1eF9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfc3ltX291dAotI2RlZmluZSBjb2ZmX1NXQVBfc3ltX291dCBjb2ZmX3N3YXBfc3ltX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9saW5lbm9fb3V0Ci0jZGVmaW5lIGNvZmZfU1dBUF9saW5lbm9fb3V0IGNvZmZfc3dhcF9saW5lbm9fb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3JlbG9jX291dAotI2RlZmluZSBjb2ZmX1NXQVBfcmVsb2Nfb3V0IGNvZmZfc3dhcF9yZWxvY19vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfZmlsZWhkcl9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX2ZpbGVoZHJfb3V0IGNvZmZfc3dhcF9maWxlaGRyX291dAotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9hb3V0aGRyX291dAotI2RlZmluZSBjb2ZmX1NXQVBfYW91dGhkcl9vdXQgY29mZl9zd2FwX2FvdXRoZHJfb3V0Ci0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX3Njbmhkcl9vdXQKLSNkZWZpbmUgY29mZl9TV0FQX3Njbmhkcl9vdXQgY29mZl9zd2FwX3Njbmhkcl9vdXQKLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfcmVsb2NfaW4KLSNkZWZpbmUgY29mZl9TV0FQX3JlbG9jX2luIGNvZmZfc3dhcF9yZWxvY19pbgotI2VuZGlmCi0jaWZuZGVmIGNvZmZfU1dBUF9maWxlaGRyX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9maWxlaGRyX2luIGNvZmZfc3dhcF9maWxlaGRyX2luCi0jZW5kaWYKLSNpZm5kZWYgY29mZl9TV0FQX2FvdXRoZHJfaW4KLSNkZWZpbmUgY29mZl9TV0FQX2FvdXRoZHJfaW4gY29mZl9zd2FwX2FvdXRoZHJfaW4KLSNlbmRpZgotI2lmbmRlZiBjb2ZmX1NXQVBfc2NuaGRyX2luCi0jZGVmaW5lIGNvZmZfU1dBUF9zY25oZHJfaW4gY29mZl9zd2FwX3Njbmhkcl9pbgotI2VuZGlmCi0KLQotCi1zdGF0aWMgQ09OU1QgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGJmZF9jb2ZmX3N0ZF9zd2FwX3RhYmxlID0KLXsKLSAgY29mZl9TV0FQX2F1eF9pbiwgY29mZl9TV0FQX3N5bV9pbiwgY29mZl9TV0FQX2xpbmVub19pbiwKLSAgY29mZl9TV0FQX2F1eF9vdXQsIGNvZmZfU1dBUF9zeW1fb3V0LAotICBjb2ZmX1NXQVBfbGluZW5vX291dCwgY29mZl9TV0FQX3JlbG9jX291dCwKLSAgY29mZl9TV0FQX2ZpbGVoZHJfb3V0LCBjb2ZmX1NXQVBfYW91dGhkcl9vdXQsCi0gIGNvZmZfU1dBUF9zY25oZHJfb3V0LAotICBGSUxIU1osIEFPVVRTWiwgU0NOSFNaLCBTWU1FU1osIEFVWEVTWiwgUkVMU1osIExJTkVTWiwKLSNpZmRlZiBDT0ZGX0xPTkdfRklMRU5BTUVTCi0gIHRydWUsCi0jZWxzZQotICBmYWxzZSwKLSNlbmRpZgotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIHRydWUsCi0jZWxzZQotICBmYWxzZSwKLSNlbmRpZgotICBDT0ZGX0RFRkFVTFRfU0VDVElPTl9BTElHTk1FTlRfUE9XRVIsCi0gIGNvZmZfU1dBUF9maWxlaGRyX2luLCBjb2ZmX1NXQVBfYW91dGhkcl9pbiwgY29mZl9TV0FQX3Njbmhkcl9pbiwKLSAgY29mZl9TV0FQX3JlbG9jX2luLCBjb2ZmX2JhZF9mb3JtYXRfaG9vaywgY29mZl9zZXRfYXJjaF9tYWNoX2hvb2ssCi0gIGNvZmZfbWtvYmplY3RfaG9vaywgc3R5cF90b19zZWNfZmxhZ3MsIGNvZmZfc2V0X2FsaWdubWVudF9ob29rLAotICBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSwgc3ltbmFtZV9pbl9kZWJ1Z19ob29rLCBjb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2ssCi0gIGNvZmZfcHJpbnRfYXV4LCBjb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMsIGNvZmZfcmVsb2MxNl9lc3RpbWF0ZSwKLSAgY29mZl9zeW1faXNfZ2xvYmFsLCBjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucywKLSAgY29mZl9zdGFydF9maW5hbF9saW5rLCBjb2ZmX3JlbG9jYXRlX3NlY3Rpb24sIGNvZmZfcnR5cGVfdG9faG93dG8sCi0gIGNvZmZfYWRqdXN0X3N5bW5keCwgY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sLAotICBjb2ZmX2xpbmtfb3V0cHV0X2hhc19iZWd1biwgY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQKLX07Ci0KLSNpZm5kZWYgY29mZl9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZQljb2ZmX2Nsb3NlX2FuZF9jbGVhbnVwICAgICAgICAgICAgICBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgY29mZl9iZmRfZnJlZV9jYWNoZWRfaW5mbyAgICAgICAgICAgX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lCWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgICAgICAgICAgIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAotI2RlZmluZSBjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgICAgICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhICAgICBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGNvZmZfYmZkX3NldF9wcml2YXRlX2ZsYWdzICAgICAgICAgIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNlbmRpZgotCi0jaWZuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgCi0jZGVmaW5lIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgICAgIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCSAgICBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgY29mZl9yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGNvZmZfcmVhZF9taW5pc3ltYm9scwkJICAgIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIGNvZmZfbWluaXN5bWJvbF90b19zeW1ib2wJICAgIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotI2VuZGlmCi0KLS8qIFRoZSByZWxvYyBsb29rdXAgcm91dGluZSBtdXN0IGJlIHN1cHBsaWVkIGJ5IGVhY2ggaW5kaXZpZHVhbCBDT0ZGCi0gICBiYWNrZW5kLiAgKi8KLSNpZm5kZWYgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJICAgIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgY29mZl9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGNvZmZfYmZkX3JlbGF4X3NlY3Rpb24JCSAgICBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZW5kaWYKLQotI2lmbmRlZiBjb2ZmX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBjb2ZmX2JmZF9nY19zZWN0aW9ucwkJICAgIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9jb2ZmZ2VuLmMgYi9iZmQvY29mZmdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDZlZDY2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzg4ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIENPRkYsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBNb3N0IG9mIHRoaXMgaGFja2VkIGJ5ICBTdGV2ZSBDaGFtYmVybGFpbiwgc2FjQGN5Z251cy5jb20uCi0gICBTcGxpdCBvdXQgb2YgY29mZmNvZGUuaCBieSBJYW4gVGF5bG9yLCBpYW5AY3lnbnVzLmNvbS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBDT0ZGIGNvZGUgdGhhdCBpcyBub3QgZGVwZW5kZW50IG9uIGFueQotICAgcGFydGljdWxhciBDT0ZGIHRhcmdldC4gIFRoZXJlIGlzIG9ubHkgb25lIHZlcnNpb24gb2YgdGhpcyBmaWxlIGluCi0gICBsaWJiZmQuYSwgc28gbm8gdGFyZ2V0IHNwZWNpZmljIGNvZGUgbWF5IGJlIHB1dCBpbiBoZXJlLiAgT3IsIHRvCi0gICBwdXQgaXQgYW5vdGhlciB3YXksCi0KLSAgICoqKioqKioqKiogRE8gTk9UIFBVVCBUQVJHRVQgU1BFQ0lGSUMgQ09ERSBJTiBUSElTIEZJTEUgKioqKioqKioqKgotCi0gICBJZiB5b3UgbmVlZCB0byBhZGQgc29tZSB0YXJnZXQgc3BlY2lmaWMgYmVoYXZpb3VyLCBhZGQgYSBuZXcgaG9vawotICAgZnVuY3Rpb24gdG8gYmZkX2NvZmZfYmFja2VuZF9kYXRhLgotCi0gICBTb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgYWxzbyBjYWxsZWQgYnkgdGhlIEVDT0ZGIHJvdXRpbmVzLgotICAgVGhvc2UgZnVuY3Rpb25zIG1heSBub3QgdXNlIGFueSBDT0ZGIHNwZWNpZmljIGluZm9ybWF0aW9uLCBzdWNoIGFzCi0gICBjb2ZmX2RhdGEgKGFiZmQpLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLXN0YXRpYyB2b2lkIGNvZmZfZml4X3N5bWJvbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgdW5zaWduZWQgaW50ICosCi0JICAgYmZkX3NpemVfdHlwZSAqLCBhc2VjdGlvbiAqKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX3dyaXRlX2FsaWVuX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCB1bnNpZ25lZCBpbnQgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgY29mZl9zeW1ib2xfdHlwZSAqLCB1bnNpZ25lZCBpbnQgKiwgYmZkX3NpemVfdHlwZSAqLAotCSAgIGFzZWN0aW9uICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIGNvZmZfcG9pbnRlcml6ZV9hdXgKLSAgUEFSQU1TICgoYmZkICosIGNvbWJpbmVkX2VudHJ5X3R5cGUgKiwgY29tYmluZWRfZW50cnlfdHlwZSAqLAotCSAgIHVuc2lnbmVkIGludCwgY29tYmluZWRfZW50cnlfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYWtlX2Ffc2VjdGlvbl9mcm9tX2ZpbGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqY29mZl9yZWFsX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCwgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKiwgCi0JICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOwotc3RhdGljIHZvaWQgZml4dXBfc3ltYm9sX3ZhbHVlCi0gIFBBUkFNUyAoKGJmZCAqLCBjb2ZmX3N5bWJvbF90eXBlICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotc3RhdGljIGNoYXIgKmJ1aWxkX2RlYnVnX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjaGFyICpjb3B5X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgaW50KSk7Ci0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogVGFrZSBhIHNlY3Rpb24gaGVhZGVyIHJlYWQgZnJvbSBhIGNvZmYgZmlsZSAoaW4gSE9TVCBieXRlIG9yZGVyKSwKLSAgIGFuZCBtYWtlIGEgQkZEICJzZWN0aW9uIiBvdXQgb2YgaXQuICBUaGlzIGlzIHVzZWQgYnkgRUNPRkYuICAqLwotc3RhdGljIGJvb2xlYW4KLW1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSAoYWJmZCwgaGRyLCB0YXJnZXRfaW5kZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciAqaGRyOwotICAgICB1bnNpZ25lZCBpbnQgdGFyZ2V0X2luZGV4OwotewotICBhc2VjdGlvbiAqcmV0dXJuX3NlY3Rpb247Ci0gIGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IE5VTEw7Ci0KLSAgLyogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBpbiBQRS4gICovCi0gIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpCi0gICAgICAmJiBoZHItPnNfbmFtZVswXSA9PSAnLycpCi0gICAgewotICAgICAgY2hhciBidWZbU0NOTk1MRU5dOwotICAgICAgbG9uZyBzdHJpbmRleDsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBjb25zdCBjaGFyICpzdHJpbmdzOwotCi0gICAgICBtZW1jcHkgKGJ1ZiwgaGRyLT5zX25hbWUgKyAxLCBTQ05OTUxFTiAtIDEpOwotICAgICAgYnVmW1NDTk5NTEVOIC0gMV0gPSAnXDAnOwotICAgICAgc3RyaW5kZXggPSBzdHJ0b2wgKGJ1ZiwgJnAsIDEwKTsKLSAgICAgIGlmICgqcCA9PSAnXDAnICYmIHN0cmluZGV4ID49IDApCi0JewotCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCk7Ci0JICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGSVhNRTogRm9yIGV4dHJhIHNhZmV0eSwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0Ci0gICAgICAgICAgICAgc3RyaW5kZXggZG9lcyBub3QgcnVuIHVzIHBhc3QgdGhlIGVuZCwgYnV0IHJpZ2h0IG5vdyB3ZQotICAgICAgICAgICAgIGRvbid0IGtub3cgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIHN0cmluZ3MgKz0gc3RyaW5kZXg7Ci0JICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN0cmluZ3MpICsgMSk7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzdHJjcHkgKG5hbWUsIHN0cmluZ3MpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBBc3NvcnRlZCB3YXN0YWdlIHRvIG51bGwtdGVybWluYXRlIHRoZSBuYW1lLCB0aGFua3MgQVQmVCEgKi8KLSAgICAgIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaGRyLT5zX25hbWUpICsgMSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN0cm5jcHkgKG5hbWUsIChjaGFyICopICZoZHItPnNfbmFtZVswXSwgc2l6ZW9mIChoZHItPnNfbmFtZSkpOwotICAgICAgbmFtZVtzaXplb2YgKGhkci0+c19uYW1lKV0gPSAwOwotICAgIH0KLQotICByZXR1cm5fc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKHJldHVybl9zZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybl9zZWN0aW9uLT52bWEgPSBoZHItPnNfdmFkZHI7Ci0gIHJldHVybl9zZWN0aW9uLT5sbWEgPSBoZHItPnNfcGFkZHI7Ci0gIHJldHVybl9zZWN0aW9uLT5fcmF3X3NpemUgPSBoZHItPnNfc2l6ZTsKLSAgcmV0dXJuX3NlY3Rpb24tPmZpbGVwb3MgPSBoZHItPnNfc2NucHRyOwotICByZXR1cm5fc2VjdGlvbi0+cmVsX2ZpbGVwb3MgPSBoZHItPnNfcmVscHRyOwotICByZXR1cm5fc2VjdGlvbi0+cmVsb2NfY291bnQgPSBoZHItPnNfbnJlbG9jOwotCi0gIGJmZF9jb2ZmX3NldF9hbGlnbm1lbnRfaG9vayAoYWJmZCwgcmV0dXJuX3NlY3Rpb24sIGhkcik7Ci0KLSAgcmV0dXJuX3NlY3Rpb24tPmxpbmVfZmlsZXBvcyA9IGhkci0+c19sbm5vcHRyOwotCi0gIHJldHVybl9zZWN0aW9uLT5saW5lbm9fY291bnQgPSBoZHItPnNfbmxubm87Ci0gIHJldHVybl9zZWN0aW9uLT51c2VyZGF0YSA9IE5VTEw7Ci0gIHJldHVybl9zZWN0aW9uLT5uZXh0ID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIHJldHVybl9zZWN0aW9uLT5mbGFncyA9IGJmZF9jb2ZmX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2sgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLSAgcmV0dXJuX3NlY3Rpb24tPnRhcmdldF9pbmRleCA9IHRhcmdldF9pbmRleDsKLQotICAvKiBBdCBsZWFzdCBvbiBpMzg2LWNvZmYsIHRoZSBsaW5lIG51bWJlciBjb3VudCBmb3IgYSBzaGFyZWQgbGlicmFyeQotICAgICBzZWN0aW9uIG11c3QgYmUgaWdub3JlZC4gICovCi0gIGlmICgocmV0dXJuX3NlY3Rpb24tPmZsYWdzICYgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkpICE9IDApCi0gICAgcmV0dXJuX3NlY3Rpb24tPmxpbmVub19jb3VudCA9IDA7Ci0KLSAgaWYgKGhkci0+c19ucmVsb2MgIT0gMCkKLSAgICByZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotICAvKiBGSVhNRTogc2hvdWxkIHRoaXMgY2hlY2sgJ2hkci0+c19zaXplID4gMCcgKi8KLSAgaWYgKGhkci0+c19zY25wdHIgIT0gMCkKLSAgICByZXR1cm5fc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgaW4gYSBDT0ZGIG9iamVjdCBhbmQgbWFrZSBpdCBpbnRvIGEgQkZELiAgVGhpcyBpcyB1c2VkIGJ5Ci0gICBFQ09GRiBhcyB3ZWxsLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotY29mZl9yZWFsX29iamVjdF9wIChhYmZkLCBuc2NucywgaW50ZXJuYWxfZiwgaW50ZXJuYWxfYSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBuc2NuczsKLSAgICAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2Y7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hOwotewotICBmbGFnd29yZCBvZmxhZ3MgPSBhYmZkLT5mbGFnczsKLSAgYmZkX3ZtYSBvc3RhcnQgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBQVFIgdGRhdGE7Ci0gIHNpemVfdCByZWFkc2l6ZTsJCS8qIGxlbmd0aCBvZiBmaWxlX2luZm8gKi8KLSAgdW5zaWduZWQgaW50IHNjbmhzejsKLSAgY2hhciAqZXh0ZXJuYWxfc2VjdGlvbnM7Ci0KLSAgaWYgKCEoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfUkVMRkxHKSkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRVhFQykpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICBpZiAoIShpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9MTk5PKSkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5POwotICBpZiAoIShpbnRlcm5hbF9mLT5mX2ZsYWdzICYgRl9MU1lNUykpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xPQ0FMUzsKLQotICAvKiBGSVhNRTogSG93IGNhbiB3ZSBzZXQgRF9QQUdFRCBjb3JyZWN0bHk/ICAqLwotICBpZiAoKGludGVybmFsX2YtPmZfZmxhZ3MgJiBGX0VYRUMpICE9IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKLQotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGludGVybmFsX2YtPmZfbnN5bXM7Ci0gIGlmIChpbnRlcm5hbF9mLT5mX25zeW1zKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIGlmIChpbnRlcm5hbF9hICE9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSBOVUxMKQotICAgIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpbnRlcm5hbF9hLT5lbnRyeTsKLSAgZWxzZQotICAgIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSAwOwotCi0gIC8qIFNldCB1cCB0aGUgdGRhdGEgYXJlYS4gIEVDT0ZGIHVzZXMgaXRzIG93biByb3V0aW5lLCBhbmQgb3ZlcnJpZGVzCi0gICAgIGFiZmQtPmZsYWdzLiAgKi8KLSAgdGRhdGEgPSBiZmRfY29mZl9ta29iamVjdF9ob29rIChhYmZkLCAoUFRSKSBpbnRlcm5hbF9mLCAoUFRSKSBpbnRlcm5hbF9hKTsKLSAgaWYgKHRkYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgc2NuaHN6ID0gYmZkX2NvZmZfc2NuaHN6IChhYmZkKTsKLSAgcmVhZHNpemUgPSBuc2NucyAqIHNjbmhzejsKLSAgZXh0ZXJuYWxfc2VjdGlvbnMgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHJlYWRzaXplKTsKLSAgaWYgKCFleHRlcm5hbF9zZWN0aW9ucykKLSAgICBnb3RvIGZhaWw7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBleHRlcm5hbF9zZWN0aW9ucywgMSwgcmVhZHNpemUsIGFiZmQpICE9IHJlYWRzaXplKQotICAgIGdvdG8gZmFpbDsKLQotICAvKiBOb3cgY29weSBkYXRhIGFzIHJlcXVpcmVkOyBjb25zdHJ1Y3QgYWxsIGFzZWN0aW9ucyBldGMgKi8KLSAgaWYgKG5zY25zICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnNjbnM7IGkrKykKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIHRtcDsKLQkgIGJmZF9jb2ZmX3N3YXBfc2NuaGRyX2luIChhYmZkLAotCQkJCSAgIChQVFIpIChleHRlcm5hbF9zZWN0aW9ucyArIGkgKiBzY25oc3opLAotCQkJCSAgIChQVFIpICYgdG1wKTsKLQkgIGlmICghIG1ha2VfYV9zZWN0aW9uX2Zyb21fZmlsZSAoYWJmZCwgJnRtcCwgaSArIDEpKQotCSAgICBnb3RvIGZhaWw7Ci0JfQotICAgIH0KLQotICAvKiAgbWFrZV9hYnNfc2VjdGlvbiAoYWJmZCk7ICovCi0KLSAgaWYgKGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayAoYWJmZCwgKFBUUikgaW50ZXJuYWxfZikgPT0gZmFsc2UpCi0gICAgZ290byBmYWlsOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotCi0gZmFpbDoKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHRkYXRhKTsKLSAgYWJmZC0+ZmxhZ3MgPSBvZmxhZ3M7Ci0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBvc3RhcnQ7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi0vKiBUdXJuIGEgQ09GRiBmaWxlIGludG8gYSBCRkQsIGJ1dCBmYWlsIHdpdGggYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCBpZiBpdCBpcwotICAgbm90IGEgQ09GRiBmaWxlLiAgVGhpcyBpcyBhbHNvIHVzZWQgYnkgRUNPRkYuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWNvZmZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGZpbGhzejsKLSAgdW5zaWduZWQgaW50IGFvdXRzejsKLSAgaW50IG5zY25zOwotICBQVFIgZmlsZWhkcjsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgaW50ZXJuYWxfZjsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgaW50ZXJuYWxfYTsKLQotICAvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIHRvIHJlYWQgKi8KLSAgZmlsaHN6ID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgYW91dHN6ID0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLQotICBmaWxlaGRyID0gYmZkX2FsbG9jIChhYmZkLCBmaWxoc3opOwotICBpZiAoZmlsZWhkciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBpZiAoYmZkX3JlYWQgKGZpbGVoZHIsIDEsIGZpbGhzeiwgYWJmZCkgIT0gZmlsaHN6KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBmaWxlaGRyLCAmaW50ZXJuYWxfZik7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBmaWxlaGRyKTsKLQotICBpZiAoYmZkX2NvZmZfYmFkX2Zvcm1hdF9ob29rIChhYmZkLCAmaW50ZXJuYWxfZikgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIG5zY25zID0gaW50ZXJuYWxfZi5mX25zY25zOwotCi0gIGlmIChpbnRlcm5hbF9mLmZfb3B0aGRyKQotICAgIHsKLSAgICAgIFBUUiBvcHRoZHI7Ci0KLSAgICAgIG9wdGhkciA9IGJmZF9hbGxvYyAoYWJmZCwgYW91dHN6KTsKLSAgICAgIGlmIChvcHRoZHIgPT0gTlVMTCkKLQlyZXR1cm4gMDs7Ci0gICAgICBpZiAoYmZkX3JlYWQgKG9wdGhkciwgMSwgaW50ZXJuYWxfZi5mX29wdGhkciwgYWJmZCkKLQkgICE9IGludGVybmFsX2YuZl9vcHRoZHIpCi0JewotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBvcHRoZHIsIChQVFIpICZpbnRlcm5hbF9hKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNvZmZfcmVhbF9vYmplY3RfcCAoYWJmZCwgbnNjbnMsICZpbnRlcm5hbF9mLAotCQkJICAgICAoaW50ZXJuYWxfZi5mX29wdGhkciAhPSAwCi0JCQkgICAgICA/ICZpbnRlcm5hbF9hCi0JCQkgICAgICA6IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKSBOVUxMKSk7Ci19Ci0KLS8qIEdldCB0aGUgQkZEIHNlY3Rpb24gZnJvbSBhIENPRkYgc3ltYm9sIHNlY3Rpb24gbnVtYmVyLiAgKi8KLQotYXNlY3Rpb24gKgotY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIHN0cnVjdCBzZWMgKmFuc3dlciA9IGFiZmQtPnNlY3Rpb25zOwotCi0gIGlmIChpbmRleCA9PSBOX0FCUykKLSAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgaWYgKGluZGV4ID09IE5fVU5ERUYpCi0gICAgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChpbmRleCA9PSBOX0RFQlVHKQotICAgIHJldHVybiBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0gIHdoaWxlIChhbnN3ZXIpCi0gICAgewotICAgICAgaWYgKGFuc3dlci0+dGFyZ2V0X2luZGV4ID09IGluZGV4KQotCXJldHVybiBhbnN3ZXI7Ci0gICAgICBhbnN3ZXIgPSBhbnN3ZXItPm5leHQ7Ci0gICAgfQotCi0gIC8qIFdlIHNob3VsZCBub3QgcmVhY2ggdGhpcyBwb2ludCwgYnV0IHRoZSBTQ08gMy4ydjQgL2xpYi9saWJjX3MuYQotICAgICBoYXMgYSBiYWQgc3ltYm9sIHRhYmxlIGluIGJpZ2xpdHBvdy5vLiAgKi8KLSAgcmV0dXJuIGJmZF91bmRfc2VjdGlvbl9wdHI7Ci19Ci0KLS8qIEdldCB0aGUgdXBwZXIgYm91bmQgb2YgYSBDT0ZGIHN5bWJvbCB0YWJsZS4gICovCi0KLWxvbmcKLWNvZmZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoIWJmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKyAxKSAqIChzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUgKikpOwotfQotCi0KLS8qIENhbm9uaWNhbGl6ZSBhIENPRkYgc3ltYm9sIHRhYmxlLiAgKi8KLQotbG9uZwotY29mZl9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXI7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKipsb2NhdGlvbiA9IChjb2ZmX3N5bWJvbF90eXBlICoqKSBhbG9jYXRpb247Ci0KLSAgaWYgKCFiZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBzeW1iYXNlID0gb2JqX3N5bWJvbHMgKGFiZmQpOwotICBjb3VudGVyID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHdoaWxlIChjb3VudGVyLS0gPiAwKQotICAgICpsb2NhdGlvbisrID0gc3ltYmFzZSsrOwotCi0gICpsb2NhdGlvbiA9IE5VTEw7Ci0KLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgb2YgYSBzeW1ib2wuICBUaGUgY2FsbGVyIG11c3QgcGFzcyBpbiBhIGJ1ZmZlciBvZiBzaXplCi0gICA+PSBTWU1OTUxFTiArIDEuICAqLwotCi1jb25zdCBjaGFyICoKLV9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgc3ltLCBidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltOwotICAgICBjaGFyICpidWY7Ci17Ci0gIC8qIEZJWE1FOiBJdCdzIG5vdCBjbGVhciB0aGlzIHdpbGwgd29yayBjb3JyZWN0bHkgaWYgc2l6ZW9mCi0gICAgIChfbl96ZXJvZXMpICE9IDQuICAqLwotICBpZiAoc3ltLT5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0gICAgICB8fCBzeW0tPl9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgbWVtY3B5IChidWYsIHN5bS0+X24uX25fbmFtZSwgU1lNTk1MRU4pOwotICAgICAgYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0gICAgICByZXR1cm4gYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHN5bS0+X24uX25fbi5fbl9vZmZzZXQgPj0gU1RSSU5HX1NJWkVfU0laRSk7Ci0gICAgICBzdHJpbmdzID0gb2JqX2NvZmZfc3RyaW5ncyAoYWJmZCk7Ci0gICAgICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCXsKLQkgIHN0cmluZ3MgPSBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgKGFiZmQpOwotCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcmV0dXJuIHN0cmluZ3MgKyBzeW0tPl9uLl9uX24uX25fb2Zmc2V0OwotICAgIH0KLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgcmVsb2NzLiAgVGhpcyByZXR1cm5zIGEgYnVmZmVyIGhvbGRpbmcgdGhlCi0gICByZWxvY3MgZm9yIHNlY3Rpb24gU0VDIGluIGZpbGUgQUJGRC4gIElmIENBQ0hFIGlzIHRydWUgYW5kCi0gICBJTlRFUk5BTF9SRUxPQ1MgaXMgTlVMTCwgdGhlIHJlbG9jcyByZWFkIGluIHdpbGwgYmUgc2F2ZWQgaW4gY2FzZQotICAgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZ2Fpbi4gIElmIEVYVEVSTkFMX1JFTE9DUyBpcyBub3QgTlVMTCwgaXQKLSAgIGlzIGEgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSB1bnN3YXBwZWQgcmVsb2NzLiAgSWYKLSAgIElOVEVSTkFMX1JFTE9DUyBpcyBub3QgTlVMTCwgaXQgaXMgYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQKLSAgIHRoZSBzd2FwcGVkIHJlbG9jcy4gIElmIFJFUVVJUkVfSU5URVJOQUwgaXMgdHJ1ZSwgdGhlbiB0aGUgcmV0dXJuCi0gICB2YWx1ZSBtdXN0IGJlIElOVEVSTkFMX1JFTE9DUy4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIE5VTEwgb24gZXJyb3IuICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKgotX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJcmVxdWlyZV9pbnRlcm5hbCwgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJvb2xlYW4gY2FjaGU7Ci0gICAgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9pbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIGJmZF9zaXplX3R5cGUgcmVsc3o7Ci0gIGJmZF9ieXRlICpmcmVlX2V4dGVybmFsID0gTlVMTDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpmcmVlX2ludGVybmFsID0gTlVMTDsKLSAgYmZkX2J5dGUgKmVyZWw7Ci0gIGJmZF9ieXRlICplcmVsX2VuZDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCi0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgcmVxdWlyZV9pbnRlcm5hbCkKLQlyZXR1cm4gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnJlbG9jczsKLSAgICAgIG1lbWNweSAoaW50ZXJuYWxfcmVsb2NzLCBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzLAotCSAgICAgIHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpOwotICAgICAgcmV0dXJuIGludGVybmFsX3JlbG9jczsKLSAgICB9Ci0KLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0KLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWVfZXh0ZXJuYWwgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgICAgIGlmIChmcmVlX2V4dGVybmFsID09IE5VTEwgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBleHRlcm5hbF9yZWxvY3MgPSBmcmVlX2V4dGVybmFsOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlYy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgcmVsc3osIHNlYy0+cmVsb2NfY291bnQsIGFiZmQpCi0JICAhPSByZWxzeiAqIHNlYy0+cmVsb2NfY291bnQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlX2ludGVybmFsID0gKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQKLQkJCQkgICAqIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSkpOwotICAgICAgaWYgKGZyZWVfaW50ZXJuYWwgPT0gTlVMTCAmJiBzZWMtPnJlbG9jX2NvdW50ID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IGZyZWVfaW50ZXJuYWw7Ci0gICAgfQotCi0gIC8qIFN3YXAgaW4gdGhlIHJlbG9jcy4gICovCi0gIGVyZWwgPSBleHRlcm5hbF9yZWxvY3M7Ci0gIGVyZWxfZW5kID0gZXJlbCArIHJlbHN6ICogc2VjLT5yZWxvY19jb3VudDsKLSAgaXJlbCA9IGludGVybmFsX3JlbG9jczsKLSAgZm9yICg7IGVyZWwgPCBlcmVsX2VuZDsgZXJlbCArPSByZWxzeiwgaXJlbCsrKQotICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIChQVFIpIGVyZWwsIChQVFIpIGlyZWwpOwotCi0gIGlmIChmcmVlX2V4dGVybmFsICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9leHRlcm5hbCk7Ci0gICAgICBmcmVlX2V4dGVybmFsID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGNhY2hlICYmIGZyZWVfaW50ZXJuYWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYykgPT0gTlVMTCkKLQl7Ci0JICBzZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKHNlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+Y29udGVudHMgPSBOVUxMOwotCX0KLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5yZWxvY3MgPSBmcmVlX2ludGVybmFsOwotICAgIH0KLQotICByZXR1cm4gaW50ZXJuYWxfcmVsb2NzOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9leHRlcm5hbCAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0ZXJuYWwpOwotICBpZiAoZnJlZV9pbnRlcm5hbCAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfaW50ZXJuYWwpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IGxpbmVub19jb3VudCBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucyBvZiBhIENPRkYgZmlsZS4gICovCi0KLWludAotY29mZl9jb3VudF9saW5lbnVtYmVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgbGltaXQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCB0b3RhbCA9IDA7Ci0gIGFzeW1ib2wgKipwOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAobGltaXQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG1heSBiZSBmcm9tIHRoZSBiYWNrZW5kIGxpbmtlciwgaW4gd2hpY2ggY2FzZSB0aGUKLSAgICAgICAgIGxpbmVub19jb3VudCBpbiB0aGUgc2VjdGlvbnMgaXMgY29ycmVjdC4gICovCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl0b3RhbCArPSBzLT5saW5lbm9fY291bnQ7Ci0gICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIEJGRF9BU1NFUlQgKHMtPmxpbmVub19jb3VudCA9PSAwKTsKLQotICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsgaSA8IGxpbWl0OyBpKyssIHArKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpxX21heWJlID0gKnA7Ci0KLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChxX21heWJlKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLQl7Ci0JICBjb2ZmX3N5bWJvbF90eXBlICpxID0gY29mZnN5bWJvbCAocV9tYXliZSk7Ci0KLQkgIC8qIFRoZSBBSVggNC4xIGNvbXBpbGVyIGNhbiBzb21ldGltZXMgZ2VuZXJhdGUgbGluZSBudW1iZXJzCi0gICAgICAgICAgICAgYXR0YWNoZWQgdG8gZGVidWdnaW5nIHN5bWJvbHMuICBXZSB0cnkgdG8gc2ltcGx5IGlnbm9yZQotICAgICAgICAgICAgIHRob3NlIGhlcmUuICAqLwotCSAgaWYgKHEtPmxpbmVubyAhPSBOVUxMCi0JICAgICAgJiYgcS0+c3ltYm9sLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgbGluZSBudW1iZXJzLiAgSW5jcmVtZW50IHRoZSBvd25pbmcKLQkgICAgICAgICBzZWN0aW9uJ3MgbGluZW51bWJlciBjb3VudC4gICovCi0JICAgICAgYWxlbnQgKmwgPSBxLT5saW5lbm87Ci0KLQkgICAgICArK3EtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50OwotCSAgICAgICsrdG90YWw7Ci0JICAgICAgKytsOwotCSAgICAgIHdoaWxlIChsLT5saW5lX251bWJlciAhPSAwKQotCQl7Ci0JCSAgKyt0b3RhbDsKLQkJICArK3EtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bGluZW5vX2NvdW50OwotCQkgICsrbDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdG90YWw7Ci19Ci0KLS8qIFRha2VzIGEgYmZkIGFuZCBhIHN5bWJvbCwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNvZmYgc3BlY2lmaWMKLSAgIGFyZWEgb2YgdGhlIHN5bWJvbCBpZiB0aGVyZSBpcyBvbmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLWNvZmZfc3ltYm9sX3R5cGUgKgotY29mZl9zeW1ib2xfZnJvbSAoaWdub3JlX2FiZmQsIHN5bWJvbCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltYm9sKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQotICBpZiAoYmZkX2FzeW1ib2xfYmZkIChzeW1ib2wpLT50ZGF0YS5jb2ZmX29ial9kYXRhID09IChjb2ZmX2RhdGFfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotCi0gIHJldHVybiAoY29mZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2w7Ci19Ci0KLXN0YXRpYyB2b2lkCi1maXh1cF9zeW1ib2xfdmFsdWUgKGFiZmQsIGNvZmZfc3ltYm9sX3B0ciwgc3ltZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmZfc3ltYm9sX3B0cjsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltZW50OwotewotCi0gIC8qIE5vcm1hbGl6ZSB0aGUgc3ltYm9sIGZsYWdzICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24pKQotICAgIHsKLSAgICAgIC8qIGEgY29tbW9uIHN5bWJvbCBpcyB1bmRlZmluZWQgd2l0aCBhIHZhbHVlICovCi0gICAgICBzeW1lbnQtPm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgc3ltZW50LT5uX3ZhbHVlID0gY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5mbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0gICAgewotICAgICAgc3ltZW50LT5uX3ZhbHVlID0gY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWU7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHN5bWVudC0+bl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBzeW1lbnQtPm5fdmFsdWUgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC5zZWN0aW9uKQotCXsKLQkgIHN5bWVudC0+bl9zY251bSA9Ci0JICAgIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0KLQkgIHN5bWVudC0+bl92YWx1ZSA9IChjb2ZmX3N5bWJvbF9wdHItPnN5bWJvbC52YWx1ZQotCQkJICAgICArIGNvZmZfc3ltYm9sX3B0ci0+c3ltYm9sLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgaWYgKCEgb2JqX3BlIChhYmZkKSkKLQkgICAgc3ltZW50LT5uX3ZhbHVlICs9Ci0JICAgICAgY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoMCk7Ci0JICAvKiBUaGlzIGNhbiBoYXBwZW4sIGJ1dCBJIGRvbid0IGtub3cgd2h5IHlldCAoc3RldmVAY3lnbnVzLmNvbSkgKi8KLQkgIHN5bWVudC0+bl9zY251bSA9IE5fQUJTOwotCSAgc3ltZW50LT5uX3ZhbHVlID0gY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wudmFsdWU7Ci0JfQotICAgIH0KLX0KLQotLyogUnVuIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGUgYW5kIHdvcmsgb3V0IHdoYXQKLSAgIHRoZWlyIGluZGV4ZXMgaW50byB0aGUgc3ltYm9sIHRhYmxlIHdpbGwgYmUgd2hlbiBvdXRwdXQuCi0KLSAgIENvZmYgcmVxdWlyZXMgdGhhdCBlYWNoIENfRklMRSBzeW1ib2wgcG9pbnRzIHRvIHRoZSBuZXh0IG9uZSBpbiB0aGUKLSAgIGNoYWluLCBhbmQgdGhhdCB0aGUgbGFzdCBvbmUgcG9pbnRzIHRvIHRoZSBmaXJzdCBleHRlcm5hbCBzeW1ib2wuIFdlCi0gICBkbyB0aGF0IGhlcmUgdG9vLiAgKi8KLQotYm9vbGVhbgotY29mZl9yZW51bWJlcl9zeW1ib2xzIChiZmRfcHRyLCBmaXJzdF91bmRlZikKLSAgICAgYmZkICpiZmRfcHRyOwotICAgICBpbnQgKmZpcnN0X3VuZGVmOwotewotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYmZkX3B0cik7Ci0gIGFzeW1ib2wgKipzeW1ib2xfcHRyX3B0ciA9IGJmZF9wdHItPm91dHN5bWJvbHM7Ci0gIHVuc2lnbmVkIGludCBuYXRpdmVfaW5kZXggPSAwOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpsYXN0X2ZpbGUgPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKSBOVUxMOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2luZGV4OwotCi0gIC8qIENPRkYgZGVtYW5kcyB0aGF0IHVuZGVmaW5lZCBzeW1ib2xzIGNvbWUgYWZ0ZXIgYWxsIG90aGVyIHN5bWJvbHMuCi0gICAgIFNpbmNlIHdlIGRvbid0IG5lZWQgdG8gaW1wb3NlIHRoaXMgZXh0cmEga25vd2xlZGdlIG9uIGFsbCBvdXIKLSAgICAgY2xpZW50IHByb2dyYW1zLCBkZWFsIHdpdGggdGhhdCBoZXJlLiAgU29ydCB0aGUgc3ltYm9sIHRhYmxlOwotICAgICBqdXN0IG1vdmUgdGhlIHVuZGVmaW5lZCBzeW1ib2xzIHRvIHRoZSBlbmQsIGxlYXZpbmcgdGhlIHJlc3QKLSAgICAgYWxvbmUuICBUaGUgTydSZWlsbHkgYm9vayBzYXlzIHRoYXQgZGVmaW5lZCBnbG9iYWwgc3ltYm9scyBjb21lCi0gICAgIGF0IHRoZSBlbmQgYmVmb3JlIHRoZSB1bmRlZmluZWQgc3ltYm9scywgc28gd2UgZG8gdGhhdCBoZXJlIGFzCi0gICAgIHdlbGwuICAqLwotICAvKiBAQCBEbyB3ZSBoYXZlIHNvbWUgY29uZGl0aW9uIHdlIGNvdWxkIHRlc3QgZm9yLCBzbyB3ZSBkb24ndCBhbHdheXMKLSAgICAgaGF2ZSB0byBkbyB0aGlzPyAgSSBkb24ndCB0aGluayByZWxvY2F0YWJpbGl0eSBpcyBxdWl0ZSByaWdodCwgYnV0Ci0gICAgIEknbSBub3QgY2VydGFpbi4gIFtyYWVidXJuOjE5OTIwNTA4LjE3MTFFU1RdICAqLwotICB7Ci0gICAgYXN5bWJvbCAqKm5ld3N5bXM7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBuZXdzeW1zID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAoYmZkX3B0ciwKLQkJCQkgICAgICBzaXplb2YgKGFzeW1ib2wgKikgKiAoc3ltYm9sX2NvdW50ICsgMSkpOwotICAgIGlmICghbmV3c3ltcykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBiZmRfcHRyLT5vdXRzeW1ib2xzID0gbmV3c3ltczsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc3ltYm9sX2NvdW50OyBpKyspCi0gICAgICBpZiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSAhPSAwCi0JICB8fCAoIWJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pCi0JICAgICAgJiYgIWJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pCi0JICAgICAgJiYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IDAKLQkJICB8fCAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKQotCQkgICAgICA9PSAwKSkpKQotCSpuZXdzeW1zKysgPSBzeW1ib2xfcHRyX3B0cltpXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzeW1ib2xfY291bnQ7IGkrKykKLSAgICAgIGlmICgoc3ltYm9sX3B0cl9wdHJbaV0tPmZsYWdzICYgQlNGX05PVF9BVF9FTkQpID09IDAKLQkgICYmICFiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbF9wdHJfcHRyW2ldLT5zZWN0aW9uKQotCSAgJiYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sX3B0cl9wdHJbaV0tPnNlY3Rpb24pCi0JICAgICAgfHwgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pID09IDAKLQkJICAmJiAoKHN5bWJvbF9wdHJfcHRyW2ldLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX1dFQUspKQotCQkgICAgICAhPSAwKSkpKQotCSpuZXdzeW1zKysgPSBzeW1ib2xfcHRyX3B0cltpXTsKLQotICAgICpmaXJzdF91bmRlZiA9IG5ld3N5bXMgLSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHN5bWJvbF9jb3VudDsgaSsrKQotICAgICAgaWYgKChzeW1ib2xfcHRyX3B0cltpXS0+ZmxhZ3MgJiBCU0ZfTk9UX0FUX0VORCkgPT0gMAotCSAgJiYgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2xfcHRyX3B0cltpXS0+c2VjdGlvbikpCi0JKm5ld3N5bXMrKyA9IHN5bWJvbF9wdHJfcHRyW2ldOwotICAgICpuZXdzeW1zID0gKGFzeW1ib2wgKikgTlVMTDsKLSAgICBzeW1ib2xfcHRyX3B0ciA9IGJmZF9wdHItPm91dHN5bWJvbHM7Ci0gIH0KLQotICBmb3IgKHN5bWJvbF9pbmRleCA9IDA7IHN5bWJvbF9pbmRleCA8IHN5bWJvbF9jb3VudDsgc3ltYm9sX2luZGV4KyspCi0gICAgewotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY29mZl9zeW1ib2xfcHRyID0gY29mZl9zeW1ib2xfZnJvbSAoYmZkX3B0ciwgc3ltYm9sX3B0cl9wdHJbc3ltYm9sX2luZGV4XSk7Ci0gICAgICBzeW1ib2xfcHRyX3B0cltzeW1ib2xfaW5kZXhdLT51ZGF0YS5pID0gc3ltYm9sX2luZGV4OyAKLSAgICAgIGlmIChjb2ZmX3N5bWJvbF9wdHIgJiYgY29mZl9zeW1ib2xfcHRyLT5uYXRpdmUpCi0JewotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcyA9IGNvZmZfc3ltYm9sX3B0ci0+bmF0aXZlOwotCSAgaW50IGk7Ci0KLQkgIGlmIChzLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JICAgIHsKLQkgICAgICBpZiAobGFzdF9maWxlICE9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopIE5VTEwpCi0JCWxhc3RfZmlsZS0+bl92YWx1ZSA9IG5hdGl2ZV9pbmRleDsKLQkgICAgICBsYXN0X2ZpbGUgPSAmKHMtPnUuc3ltZW50KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0KLQkgICAgICAvKiBNb2RpZnkgdGhlIHN5bWJvbCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZWlyIHNlY3Rpb24gYW5kCi0JICAgICAgICAgdHlwZSAqLwotCi0JICAgICAgZml4dXBfc3ltYm9sX3ZhbHVlIChiZmRfcHRyLCBjb2ZmX3N5bWJvbF9wdHIsICYocy0+dS5zeW1lbnQpKTsKLQkgICAgfQotCSAgZm9yIChpID0gMDsgaSA8IHMtPnUuc3ltZW50Lm5fbnVtYXV4ICsgMTsgaSsrKQotCSAgICBzW2ldLm9mZnNldCA9IG5hdGl2ZV9pbmRleCsrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuYXRpdmVfaW5kZXgrKzsKLQl9Ci0gICAgfQotICBvYmpfY29udl90YWJsZV9zaXplIChiZmRfcHRyKSA9IG5hdGl2ZV9pbmRleDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUnVuIHRob3JvdWdoIHRoZSBzeW1ib2wgdGFibGUgYWdhaW4sIGFuZCBmaXggaXQgc28gdGhhdCBhbGwKLSAgIHBvaW50ZXJzIHRvIGVudHJpZXMgYXJlIGNoYW5nZWQgdG8gdGhlIGVudHJpZXMnIGluZGV4IGluIHRoZSBvdXRwdXQKLSAgIHN5bWJvbCB0YWJsZS4gICovCi0KLXZvaWQKLWNvZmZfbWFuZ2xlX3N5bWJvbHMgKGJmZF9wdHIpCi0gICAgIGJmZCAqYmZkX3B0cjsKLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGJmZF9wdHIpOwotICBhc3ltYm9sICoqc3ltYm9sX3B0cl9wdHIgPSBiZmRfcHRyLT5vdXRzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2luZGV4OwotCi0gIGZvciAoc3ltYm9sX2luZGV4ID0gMDsgc3ltYm9sX2luZGV4IDwgc3ltYm9sX2NvdW50OyBzeW1ib2xfaW5kZXgrKykKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXBlICpjb2ZmX3N5bWJvbF9wdHIgPQotICAgICAgY29mZl9zeW1ib2xfZnJvbSAoYmZkX3B0ciwgc3ltYm9sX3B0cl9wdHJbc3ltYm9sX2luZGV4XSk7Ci0KLSAgICAgIGlmIChjb2ZmX3N5bWJvbF9wdHIgJiYgY29mZl9zeW1ib2xfcHRyLT5uYXRpdmUpCi0JewotCSAgaW50IGk7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpzID0gY29mZl9zeW1ib2xfcHRyLT5uYXRpdmU7Ci0KLQkgIGlmIChzLT5maXhfdmFsdWUpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHVzZSBhIHVuaW9uIGhlcmUuICAqLwotCSAgICAgIHMtPnUuc3ltZW50Lm5fdmFsdWUgPQotCQkoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcy0+dS5zeW1lbnQubl92YWx1ZSktPm9mZnNldDsKLQkgICAgICBzLT5maXhfdmFsdWUgPSAwOwotCSAgICB9Ci0JICBpZiAocy0+Zml4X2xpbmUpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzCi0gICAgICAgICAgICAgICAgIGZvciB0aGUgc3ltYm9sJ3Mgc2VjdGlvbi4gIE9uIG91dHB1dCwgdGhlIHN5bWJvbCdzCi0gICAgICAgICAgICAgICAgIHNlY3Rpb24gc2hvdWxkIGJlIE5fREVCVUcuICAqLwotCSAgICAgIHMtPnUuc3ltZW50Lm5fdmFsdWUgPQotCQkoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmxpbmVfZmlsZXBvcwotCQkgKyBzLT51LnN5bWVudC5uX3ZhbHVlICogYmZkX2NvZmZfbGluZXN6IChiZmRfcHRyKSk7Ci0JICAgICAgY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYmZkX3B0ciwgTl9ERUJVRyk7Ci0JICAgICAgQkZEX0FTU0VSVCAoY29mZl9zeW1ib2xfcHRyLT5zeW1ib2wuZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKTsKLQkgICAgfQotCSAgZm9yIChpID0gMDsgaSA8IHMtPnUuc3ltZW50Lm5fbnVtYXV4OyBpKyspCi0JICAgIHsKLQkgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphID0gcyArIGkgKyAxOwotCSAgICAgIGlmIChhLT5maXhfdGFnKQotCQl7Ci0JCSAgYS0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubCA9Ci0JCSAgICBhLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wLT5vZmZzZXQ7Ci0JCSAgYS0+Zml4X3RhZyA9IDA7Ci0JCX0KLQkgICAgICBpZiAoYS0+Zml4X2VuZCkKLQkJewotCQkgIGEtPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPQotCQkgICAgYS0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgucC0+b2Zmc2V0OwotCQkgIGEtPmZpeF9lbmQgPSAwOwotCQl9Ci0JICAgICAgaWYgKGEtPmZpeF9zY25sZW4pCi0JCXsKLQkJICBhLT51LmF1eGVudC54X2NzZWN0Lnhfc2NubGVuLmwgPQotCQkgICAgYS0+dS5hdXhlbnQueF9jc2VjdC54X3Njbmxlbi5wLT5vZmZzZXQ7Ci0JCSAgYS0+Zml4X3NjbmxlbiA9IDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX2ZpeF9zeW1ib2xfbmFtZSAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHN0cmluZ19zaXplX3AsCi0JCSAgICAgIGRlYnVnX3N0cmluZ19zZWN0aW9uX3AsIGRlYnVnX3N0cmluZ19zaXplX3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgdW5zaWduZWQgaW50IG5hbWVfbGVuZ3RoOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eGVudDsKLSAgY2hhciAqbmFtZSA9IChjaGFyICopIChzeW1ib2wtPm5hbWUpOwotCi0gIGlmIChuYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgLyogY29mZiBzeW1ib2xzIGFsd2F5cyBoYXZlIG5hbWVzLCBzbyB3ZSdsbCBtYWtlIG9uZSB1cCAqLwotICAgICAgc3ltYm9sLT5uYW1lID0gInN0cmFuZ2UiOwotICAgICAgbmFtZSA9IChjaGFyICopIHN5bWJvbC0+bmFtZTsKLSAgICB9Ci0gIG5hbWVfbGVuZ3RoID0gc3RybGVuIChuYW1lKTsKLQotICBpZiAobmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX0ZJTEUKLSAgICAgICYmIG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXggPiAwKQotICAgIHsKLSAgICAgIHN0cm5jcHkgKG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbmFtZSwgIi5maWxlIiwgU1lNTk1MRU4pOwotICAgICAgYXV4ZW50ID0gJihuYXRpdmUgKyAxKS0+dS5hdXhlbnQ7Ci0KLSAgICAgIGlmIChiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyAoYWJmZCkpCi0JewotCSAgaWYgKG5hbWVfbGVuZ3RoIDw9IEZJTE5NTEVOKQotCSAgICB7Ci0JICAgICAgc3RybmNweSAoYXV4ZW50LT54X2ZpbGUueF9mbmFtZSwgbmFtZSwgRklMTk1MRU4pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhdXhlbnQtPnhfZmlsZS54X24ueF9vZmZzZXQgPSAqc3RyaW5nX3NpemVfcCArIFNUUklOR19TSVpFX1NJWkU7Ci0JICAgICAgYXV4ZW50LT54X2ZpbGUueF9uLnhfemVyb2VzID0gMDsKLQkgICAgICAqc3RyaW5nX3NpemVfcCArPSBuYW1lX2xlbmd0aCArIDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RybmNweSAoYXV4ZW50LT54X2ZpbGUueF9mbmFtZSwgbmFtZSwgRklMTk1MRU4pOwotCSAgaWYgKG5hbWVfbGVuZ3RoID4gRklMTk1MRU4pCi0JICAgIHsKLQkgICAgICBuYW1lW0ZJTE5NTEVOXSA9ICdcMCc7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG5hbWVfbGVuZ3RoIDw9IFNZTU5NTEVOKQotCXsKLQkgIC8qIFRoaXMgbmFtZSB3aWxsIGZpdCBpbnRvIHRoZSBzeW1ib2wgbmVhdGx5ICovCi0JICBzdHJuY3B5IChuYXRpdmUtPnUuc3ltZW50Ll9uLl9uX25hbWUsIHN5bWJvbC0+bmFtZSwgU1lNTk1MRU4pOwotCX0KLSAgICAgIGVsc2UgaWYgKCFiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChhYmZkLCAmbmF0aXZlLT51LnN5bWVudCkpCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9ICgqc3RyaW5nX3NpemVfcAotCQkJCQkJKyBTVFJJTkdfU0laRV9TSVpFKTsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgKnN0cmluZ19zaXplX3AgKz0gbmFtZV9sZW5ndGggKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGZpbGVwb3M7Ci0JICBiZmRfYnl0ZSBidWZbMl07Ci0KLQkgIC8qIFRoaXMgbmFtZSBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIHRoZSAuZGVidWcgc2VjdGlvbi4gIEZvcgotCSAgICAgc29tZSByZWFzb24gZWFjaCBuYW1lIGlzIHByZWNlZGVkIGJ5IGEgdHdvIGJ5dGUgbGVuZ3RoCi0JICAgICBhbmQgYWxzbyBmb2xsb3dlZCBieSBhIG51bGwgYnl0ZS4gIEZJWE1FOiBXZSBhc3N1bWUgdGhhdAotCSAgICAgdGhlIC5kZWJ1ZyBzZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgYW5kIHRoYXQgaXQKLQkgICAgIGlzIGxhcmdlIGVub3VnaC4gICovCi0JICBpZiAoKmRlYnVnX3N0cmluZ19zZWN0aW9uX3AgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgICpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWciKTsKLQkgIGZpbGVwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICBiZmRfcHV0XzE2IChhYmZkLCBuYW1lX2xlbmd0aCArIDEsIGJ1Zik7Ci0JICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCQkJICpkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLAotCQkJCQkgKFBUUikgYnVmLAotCQkJCQkgKGZpbGVfcHRyKSAqZGVidWdfc3RyaW5nX3NpemVfcCwKLQkJCQkJIChiZmRfc2l6ZV90eXBlKSAyKQotCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsCi0JCQkJCSAgICAqZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwKLQkJCQkJICAgIChQVFIpIHN5bWJvbC0+bmFtZSwKLQkJCQkJICAgICgoZmlsZV9wdHIpICpkZWJ1Z19zdHJpbmdfc2l6ZV9wCi0JCQkJCSAgICAgKyAyKSwKLQkJCQkJICAgIChiZmRfc2l6ZV90eXBlKSBuYW1lX2xlbmd0aCArIDEpKQotCSAgICBhYm9ydCAoKTsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICAgIGFib3J0ICgpOwotCSAgbmF0aXZlLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9ICpkZWJ1Z19zdHJpbmdfc2l6ZV9wICsgMjsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQuX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgKmRlYnVnX3N0cmluZ19zaXplX3AgKz0gbmFtZV9sZW5ndGggKyAzOwotCX0KLSAgICB9Ci19Ci0KLS8qIFdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3ltYm9sIGluZGV4IHNvIHRoYXQgd2hlbiB3ZSB3cml0ZSBvdXQKLSAgIHRoZSByZWxvY3Mgd2UgY2FuIGdldCB0aGUgaW5kZXggZm9yIGEgc3ltYm9sLiAgVGhpcyBtZXRob2QgaXMgYQotICAgaGFjay4gIEZJWE1FLiAgKi8KLQotI2RlZmluZSBzZXRfaW5kZXgoc3ltYm9sLCBpZHgpCSgoc3ltYm9sKS0+dWRhdGEuaSA9IChpZHgpKQotCi0vKiBXcml0ZSBhIHN5bWJvbCBvdXQgdG8gYSBDT0ZGIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl93cml0ZV9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgbmF0aXZlLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkgICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotICAgICB1bnNpZ25lZCBpbnQgKndyaXR0ZW47Ci0gICAgIGJmZF9zaXplX3R5cGUgKnN0cmluZ19zaXplX3A7Ci0gICAgIGFzZWN0aW9uICoqZGVidWdfc3RyaW5nX3NlY3Rpb25fcDsKLSAgICAgYmZkX3NpemVfdHlwZSAqZGVidWdfc3RyaW5nX3NpemVfcDsKLXsKLSAgdW5zaWduZWQgaW50IG51bWF1eCA9IG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXg7Ci0gIGludCB0eXBlID0gbmF0aXZlLT51LnN5bWVudC5uX3R5cGU7Ci0gIGludCBjbGFzcyA9IG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3M7Ci0gIFBUUiBidWY7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotCi0gIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKLSAgICBzeW1ib2wtPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HCi0gICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9ERUJVRzsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX0FCUzsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9Ci0Jc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotICBjb2ZmX2ZpeF9zeW1ib2xfbmFtZSAoYWJmZCwgc3ltYm9sLCBuYXRpdmUsIHN0cmluZ19zaXplX3AsCi0JCQlkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBidWYgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWVzeik7Ci0gIGlmICghYnVmKQotICAgIHJldHVybiBmYWxzZTsKLSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAmbmF0aXZlLT51LnN5bWVudCwgYnVmKTsKLSAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCBzeW1lc3osIGFiZmQpICE9IHN5bWVzeikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBidWYpOwotCi0gIGlmIChuYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGF1eGVzejsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICBhdXhlc3ogPSBiZmRfY29mZl9hdXhlc3ogKGFiZmQpOwotICAgICAgYnVmID0gYmZkX2FsbG9jIChhYmZkLCBhdXhlc3opOwotICAgICAgaWYgKCFidWYpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChqID0gMDsgaiA8IG5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXg7IGorKykKLQl7Ci0JICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKGFiZmQsCi0JCQkJICYoKG5hdGl2ZSArIGogKyAxKS0+dS5hdXhlbnQpLAotCQkJCSB0eXBlLAotCQkJCSBjbGFzcywKLQkJCQkgaiwKLQkJCQkgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eCwKLQkJCQkgYnVmKTsKLQkgIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgYXV4ZXN6LCBhYmZkKSAhPSBhdXhlc3opCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgYnVmKTsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIGluZGV4IGZvciB1c2Ugd2hlbiB3ZSB3cml0ZSBvdXQgdGhlIHJlbG9jcy4gICovCi0gIHNldF9pbmRleCAoc3ltYm9sLCAqd3JpdHRlbik7Ci0KLSAgKndyaXR0ZW4gKz0gbnVtYXV4ICsgMTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN5bWJvbCB0byBhIENPRkYgZmlsZSB0aGF0IGRvZXMgbm90IGNvbWUgZnJvbSBhIENPRkYKLSAgIGZpbGUgb3JpZ2luYWxseS4gIFRoaXMgc3ltYm9sIG1heSBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUgbGlua2VyLAotICAgb3Igd2UgbWF5IGJlIGxpbmtpbmcgYSBub24gQ09GRiBmaWxlIHRvIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sIChhYmZkLCBzeW1ib2wsIHdyaXR0ZW4sIHN0cmluZ19zaXplX3AsCi0JCQkgZGVidWdfc3RyaW5nX3NlY3Rpb25fcCwgZGVidWdfc3RyaW5nX3NpemVfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHVuc2lnbmVkIGludCAqd3JpdHRlbjsKLSAgICAgYmZkX3NpemVfdHlwZSAqc3RyaW5nX3NpemVfcDsKLSAgICAgYXNlY3Rpb24gKipkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wOwotICAgICBiZmRfc2l6ZV90eXBlICpkZWJ1Z19zdHJpbmdfc2l6ZV9wOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICpuYXRpdmU7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgZHVtbXk7Ci0KLSAgbmF0aXZlID0gJmR1bW15OwotICBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSA9IFRfTlVMTDsKLSAgbmF0aXZlLT51LnN5bWVudC5uX2ZsYWdzID0gMDsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgbmF0aXZlLT51LnN5bWVudC5uX3ZhbHVlID0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzbid0IG11Y2ggcG9pbnQgdG8gd3JpdGluZyBvdXQgYSBkZWJ1Z2dpbmcgc3ltYm9sCi0gICAgICAgICB1bmxlc3Mgd2UgYXJlIHByZXBhcmVkIHRvIGNvbnZlcnQgaXQgaW50byBDT0ZGIGRlYnVnZ2luZwotICAgICAgICAgZm9ybWF0LiAgU28sIHdlIGp1c3QgaWdub3JlIHRoZW0uICBXZSBtdXN0IGNsb2JiZXIgdGhlIHN5bWJvbAotICAgICAgICAgbmFtZSB0byBrZWVwIGl0IGZyb20gYmVpbmcgcHV0IGluIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICAgICAgc3ltYm9sLT5uYW1lID0gIiI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPQotCXN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IChzeW1ib2wtPnZhbHVlCi0JCQkJICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoISBvYmpfcGUgKGFiZmQpKQotCW5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIC8qIENvcHkgdGhlIGFueSBmbGFncyBmcm9tIHRoZSB0aGUgZmlsZSBoZWFkZXIgaW50byB0aGUgc3ltYm9sLgotICAgICAgICAgRklYTUU6IFdoeT8gICovCi0gICAgICB7Ci0JY29mZl9zeW1ib2xfdHlwZSAqYyA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0JaWYgKGMgIT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTCkKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IGJmZF9hc3ltYm9sX2JmZCAoJmMtPnN5bWJvbCktPmZsYWdzOwotICAgICAgfQotICAgIH0KLQotICBuYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSA9IDA7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0xPQ0FMKQotICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykKLSAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gb2JqX3BlIChhYmZkKSA/IENfTlRfV0VBSyA6IENfV0VBS0VYVDsKLSAgZWxzZQotICAgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSBDX0VYVDsKLSAgbmF0aXZlLT51LnN5bWVudC5uX251bWF1eCA9IDA7Ci0KLSAgcmV0dXJuIGNvZmZfd3JpdGVfc3ltYm9sIChhYmZkLCBzeW1ib2wsIG5hdGl2ZSwgd3JpdHRlbiwgc3RyaW5nX3NpemVfcCwKLQkJCSAgICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKTsKLX0KLQotLyogV3JpdGUgYSBuYXRpdmUgc3ltYm9sIHRvIGEgQ09GRiBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfd3JpdGVfbmF0aXZlX3N5bWJvbCAoYWJmZCwgc3ltYm9sLCB3cml0dGVuLCBzdHJpbmdfc2l6ZV9wLAotCQkJICBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLCBkZWJ1Z19zdHJpbmdfc2l6ZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvZmZfc3ltYm9sX3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICp3cml0dGVuOwotICAgICBiZmRfc2l6ZV90eXBlICpzdHJpbmdfc2l6ZV9wOwotICAgICBhc2VjdGlvbiAqKmRlYnVnX3N0cmluZ19zZWN0aW9uX3A7Ci0gICAgIGJmZF9zaXplX3R5cGUgKmRlYnVnX3N0cmluZ19zaXplX3A7Ci17Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKm5hdGl2ZSA9IHN5bWJvbC0+bmF0aXZlOwotICBhbGVudCAqbGluZW5vID0gc3ltYm9sLT5saW5lbm87Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaGFzIGFuIGFzc29jaWF0ZWQgbGluZSBudW1iZXIsIHdlIG11c3Qgc3RvcmUgdGhlCi0gICAgIHN5bWJvbCBpbmRleCBpbiB0aGUgbGluZSBudW1iZXIgZmllbGQuICBXZSBhbHNvIHRhZyB0aGUgYXV4ZW50IHRvCi0gICAgIHBvaW50IHRvIHRoZSByaWdodCBwbGFjZSBpbiB0aGUgbGluZW5vIHRhYmxlLiAgKi8KLSAgaWYgKGxpbmVubyAmJiAhc3ltYm9sLT5kb25lX2xpbmVubyAmJiBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vd25lciAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0gICAgICBsaW5lbm9bY291bnRdLnUub2Zmc2V0ID0gKndyaXR0ZW47Ci0gICAgICBpZiAobmF0aXZlLT51LnN5bWVudC5uX251bWF1eCkKLQl7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmEgPSAmKChuYXRpdmUgKyAxKS0+dS5hdXhlbnQpOwotCi0JICBhLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPQotCSAgICBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bW92aW5nX2xpbmVfZmlsZXBvczsKLQl9Ci0KLSAgICAgIC8qIENvdW50IGFuZCByZWxvY2F0ZSBhbGwgb3RoZXIgbGluZW51bWJlcnMuICAqLwotICAgICAgY291bnQrKzsKLSAgICAgIHdoaWxlIChsaW5lbm9bY291bnRdLmxpbmVfbnVtYmVyICE9IDApCi0JewotI2lmIDAKLQkgIC8qIDEzIGFwcmlsIDkyLiBzYWMgCi0JICAgICBJJ3ZlIGJlZW4gdG9sZCB0aGlzLCBidXQgc3RpbGwgbmVlZCBwcm9vZjoKLQkgICAgID4gVGhlIHNlY29uZCBidWcgaXMgYWxzbyBpbiBgYmZkL2NvZmZjb2RlLmgnLiAgVGhpcyBidWcKLQkgICAgID4gY2F1c2VzIHRoZSBsaW5rZXIgdG8gc2NyZXcgdXAgdGhlIHBjLXJlbG9jYXRpb25zIGZvcgotCSAgICAgPiBhbGwgdGhlIGxpbmUgbnVtYmVycyBpbiBDT0ZGIGNvZGUuICBUaGlzIGJ1ZyBpc24ndCBvbmx5Ci0JICAgICA+IHNwZWNpZmljIHRvIEEyOUsgaW1wbGVtZW50YXRpb25zLCBidXQgYWZmZWN0cyBhbGwKLQkgICAgID4gc3lzdGVtcyB1c2luZyBDT0ZGIGZvcm1hdCBiaW5hcmllcy4gIE5vdGUgdGhhdCBpbiBDT0ZGCi0JICAgICA+IG9iamVjdCBmaWxlcywgdGhlIGxpbmUgbnVtYmVyIGNvcmUgb2Zmc2V0cyBvdXRwdXQgYnkKLQkgICAgID4gdGhlIGFzc2VtYmxlciBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIGVhY2gKLQkgICAgID4gcHJvY2VkdXJlLCBub3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSAudGV4dCBzZWN0aW9uLiAgVGhpcwotCSAgICAgPiBwYXRjaCByZWxvY2F0ZXMgdGhlIGxpbmUgbnVtYmVycyByZWxhdGl2ZSB0byB0aGUKLQkgICAgID4gYG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZScgaW5zdGVhZCBvZiB0aGUgc2VjdGlvbgotCSAgICAgPiB2aXJ0dWFsIGFkZHJlc3MuCi0JICAgICA+IG1vZHVsYXIhb2xzb25AY3MuYXJpem9uYS5lZHUgKEpvbiBPbHNvbikKLQkgICAqLwotCSAgbGluZW5vW2NvdW50XS51Lm9mZnNldCArPSBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWU7Ci0jZWxzZQotCSAgbGluZW5vW2NvdW50XS51Lm9mZnNldCArPQotCSAgICAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgKyBzeW1ib2wtPnN5bWJvbC5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCSAgY291bnQrKzsKLQl9Ci0gICAgICBzeW1ib2wtPmRvbmVfbGluZW5vID0gdHJ1ZTsKLQotICAgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm1vdmluZ19saW5lX2ZpbGVwb3MgKz0KLQljb3VudCAqIGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gICAgfQotCi0gIHJldHVybiBjb2ZmX3dyaXRlX3N5bWJvbCAoYWJmZCwgJihzeW1ib2wtPnN5bWJvbCksIG5hdGl2ZSwgd3JpdHRlbiwKLQkJCSAgICBzdHJpbmdfc2l6ZV9wLCBkZWJ1Z19zdHJpbmdfc2VjdGlvbl9wLAotCQkJICAgIGRlYnVnX3N0cmluZ19zaXplX3ApOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIENPRkYgc3ltYm9scy4gICovCi0KLWJvb2xlYW4KLWNvZmZfd3JpdGVfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfc2l6ZV90eXBlIHN0cmluZ19zaXplOwotICBhc2VjdGlvbiAqZGVidWdfc3RyaW5nX3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgZGVidWdfc3RyaW5nX3NpemU7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgbGltaXQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IHdyaXR0ZW4gPSAwOwotICBhc3ltYm9sICoqcDsKLQotICBzdHJpbmdfc2l6ZSA9IDA7Ci0gIGRlYnVnX3N0cmluZ19zZWN0aW9uID0gTlVMTDsKLSAgZGVidWdfc3RyaW5nX3NpemUgPSAwOwotCi0gIC8qIElmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIGxvbmcgc2VjdGlvbiBuYW1lcywgdGhleSBtdXN0IGJlIHB1dCBpbnRvCi0gICAgIHRoZSBzdHJpbmcgdGFibGUuICBUaGlzIGlzIHN1cHBvcnRlZCBieSBQRS4gIFRoaXMgY29kZSBtdXN0Ci0gICAgIGhhbmRsZSBzZWN0aW9uIG5hbWVzIGp1c3QgYXMgdGhleSBhcmUgaGFuZGxlZCBpbgotICAgICBjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cy4gICovCi0gIGlmIChiZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMgKGFiZmQpKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzaXplX3QgbGVuOwotCi0JICBsZW4gPSBzdHJsZW4gKG8tPm5hbWUpOwotCSAgaWYgKGxlbiA+IFNDTk5NTEVOKQotCSAgICBzdHJpbmdfc2l6ZSArPSBsZW4gKyAxOwotCX0KLSAgICB9Ci0KLSAgLyogU2VlayB0byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT3V0cHV0IGFsbCB0aGUgc3ltYm9scyB3ZSBoYXZlICovCi0KLSAgd3JpdHRlbiA9IDA7Ci0gIGZvciAocCA9IGFiZmQtPm91dHN5bWJvbHMsIGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgcCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bWJvbCA9ICpwOwotICAgICAgY29mZl9zeW1ib2xfdHlwZSAqY19zeW1ib2wgPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCi0gICAgICBpZiAoY19zeW1ib2wgPT0gKGNvZmZfc3ltYm9sX3R5cGUgKikgTlVMTAotCSAgfHwgY19zeW1ib2wtPm5hdGl2ZSA9PSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBOVUxMKQotCXsKLQkgIGlmICghY29mZl93cml0ZV9hbGllbl9zeW1ib2wgKGFiZmQsIHN5bWJvbCwgJndyaXR0ZW4sICZzdHJpbmdfc2l6ZSwKLQkJCQkJJmRlYnVnX3N0cmluZ19zZWN0aW9uLAotCQkJCQkmZGVidWdfc3RyaW5nX3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghY29mZl93cml0ZV9uYXRpdmVfc3ltYm9sIChhYmZkLCBjX3N5bWJvbCwgJndyaXR0ZW4sCi0JCQkJCSAmc3RyaW5nX3NpemUsICZkZWJ1Z19zdHJpbmdfc2VjdGlvbiwKLQkJCQkJICZkZWJ1Z19zdHJpbmdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9IHdyaXR0ZW47Ci0KLSAgLyogTm93IHdyaXRlIG91dCBzdHJpbmdzICovCi0KLSAgaWYgKHN0cmluZ19zaXplICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemUgPSBzdHJpbmdfc2l6ZSArIFNUUklOR19TSVpFX1NJWkU7Ci0gICAgICBiZmRfYnl0ZSBidWZmZXJbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSNpZiBTVFJJTkdfU0laRV9TSVpFID09IDQKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgc2l6ZSwgYnVmZmVyKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpICE9IHNpemVvZiAoYnVmZmVyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuICBUaGlzIGNvZGUgbXVzdCBoYW5kbGUgc2VjdGlvbgotCSBuYW1lcyBqdXN0IGFzIHRoZXkgYXJlIGhhbmRsZWQgaW4gY29mZl93cml0ZV9vYmplY3RfY29udGVudHMuICAqLwotICAgICAgaWYgKGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyAoYWJmZCkpCi0JewotCSAgYXNlY3Rpb24gKm87Ci0KLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCSAgICB7Ci0JICAgICAgc2l6ZV90IGxlbjsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoby0+bmFtZSk7Ci0JICAgICAgaWYgKGxlbiA+IFNDTk5NTEVOKQotCQl7Ci0JCSAgaWYgKGJmZF93cml0ZSAoby0+bmFtZSwgMSwgbGVuICsgMSwgYWJmZCkgIT0gbGVuICsgMSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBmb3IgKHAgPSBhYmZkLT5vdXRzeW1ib2xzLCBpID0gMDsKLQkgICBpIDwgbGltaXQ7Ci0JICAgaSsrLCBwKyspCi0JewotCSAgYXN5bWJvbCAqcSA9ICpwOwotCSAgc2l6ZV90IG5hbWVfbGVuZ3RoID0gc3RybGVuIChxLT5uYW1lKTsKLQkgIGNvZmZfc3ltYm9sX3R5cGUgKmNfc3ltYm9sID0gY29mZl9zeW1ib2xfZnJvbSAoYWJmZCwgcSk7Ci0JICBzaXplX3QgbWF4bGVuOwotCi0JICAvKiBGaWd1cmUgb3V0IHdoZXRoZXIgdGhlIHN5bWJvbCBuYW1lIHNob3VsZCBnbyBpbiB0aGUgc3RyaW5nCi0JICAgICB0YWJsZS4gIFN5bWJvbCBuYW1lcyB0aGF0IGFyZSBzaG9ydCBlbm91Z2ggYXJlIHN0b3JlZAotCSAgICAgZGlyZWN0bHkgaW4gdGhlIHN5bWVudCBzdHJ1Y3R1cmUuICBGaWxlIG5hbWVzIHBlcm1pdCBhCi0JICAgICBkaWZmZXJlbnQsIGxvbmdlciwgbGVuZ3RoIGluIHRoZSBzeW1lbnQgc3RydWN0dXJlLiAgT24KLQkgICAgIFhDT0ZGLCBzb21lIHN5bWJvbCBuYW1lcyBhcmUgc3RvcmVkIGluIHRoZSAuZGVidWcgc2VjdGlvbgotCSAgICAgcmF0aGVyIHRoYW4gaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0KLQkgIGlmIChjX3N5bWJvbCA9PSBOVUxMCi0JICAgICAgfHwgY19zeW1ib2wtPm5hdGl2ZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBub3QgYSBDT0ZGIHN5bWJvbCwgc28gaXQgY2VydGFpbmx5IGlzIG5vdCBhCi0JICAgICAgICAgZmlsZSBuYW1lLCBub3IgZG9lcyBpdCBnbyBpbiB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotCSAgICAgIG1heGxlbiA9IFNZTU5NTEVOOwotCSAgICB9Ci0JICBlbHNlIGlmIChiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChhYmZkLAotCQkJCQkgICAgICAmY19zeW1ib2wtPm5hdGl2ZS0+dS5zeW1lbnQpKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzeW1ib2wgbmFtZSBpcyBpbiB0aGUgWENPRkYgLmRlYnVnIHNlY3Rpb24uCi0JICAgICAgICAgRG9uJ3Qgd3JpdGUgaXQgaW50byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgICAgICBtYXhsZW4gPSBuYW1lX2xlbmd0aDsKLQkgICAgfQotCSAgZWxzZSBpZiAoY19zeW1ib2wtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFCi0JCSAgICYmIGNfc3ltYm9sLT5uYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkgICAgbWF4bGVuID0gRklMTk1MRU47Ci0JICBlbHNlCi0JICAgIG1heGxlbiA9IFNZTU5NTEVOOwotCi0JICBpZiAobmFtZV9sZW5ndGggPiBtYXhsZW4pCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAocS0+bmFtZSksIDEsIG5hbWVfbGVuZ3RoICsgMSwgYWJmZCkKLQkJICAhPSBuYW1lX2xlbmd0aCArIDEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSB3b3VsZCBub3JtYWxseSBub3Qgd3JpdGUgYW55dGhpbmcgaGVyZSwgYnV0IHdlJ2xsIHdyaXRlCi0gICAgICAgICBvdXQgNCBzbyB0aGF0IGFueSBzdHVwaWQgY29mZiByZWFkZXIgd2hpY2ggdHJpZXMgdG8gcmVhZCB0aGUKLSAgICAgICAgIHN0cmluZyB0YWJsZSBldmVuIHdoZW4gdGhlcmUgaXNuJ3Qgb25lIHdvbid0IGNyb2FrLiAgKi8KLSAgICAgIHVuc2lnbmVkIGludCBzaXplID0gU1RSSU5HX1NJWkVfU0laRTsKLSAgICAgIGJmZF9ieXRlIGJ1ZmZlcltTVFJJTkdfU0laRV9TSVpFXTsKLQotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLCBzaXplLCBidWZmZXIpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIFNUUklOR19TSVpFX1NJWkUsIGFiZmQpCi0JICAhPSBTVFJJTkdfU0laRV9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSAuZGVidWcgc2VjdGlvbiB3YXMgY3JlYXRlZCB0byBiZSB0aGUgY29ycmVjdCBzaXplLgotICAgICBXZSBzaG91bGQgY3JlYXRlIGl0IG91cnNlbHZlcyBvbiB0aGUgZmx5LCBidXQgd2UgZG9uJ3QgYmVjYXVzZQotICAgICBCRkQgd29uJ3QgbGV0IHVzIHdyaXRlIHRvIGFueSBzZWN0aW9uIHVudGlsIHdlIGtub3cgaG93IGxhcmdlIGFsbAotICAgICB0aGUgc2VjdGlvbnMgYXJlLiAgV2UgY291bGQgc3RpbGwgZG8gaXQgYnkgbWFraW5nIGFub3RoZXIgcGFzcwotICAgICBvdmVyIHRoZSBzeW1ib2xzLiAgRklYTUUuICAqLwotICBCRkRfQVNTRVJUIChkZWJ1Z19zdHJpbmdfc2l6ZSA9PSAwCi0JICAgICAgfHwgKGRlYnVnX3N0cmluZ19zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMCi0JCSAgJiYgKEJGRF9BTElHTiAoZGVidWdfc3RyaW5nX3NpemUsCi0JCQkJIDEgPDwgZGVidWdfc3RyaW5nX3NlY3Rpb24tPmFsaWdubWVudF9wb3dlcikKLQkJICAgICAgPT0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgZGVidWdfc3RyaW5nX3NlY3Rpb24pKSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1jb2ZmX3dyaXRlX2xpbmVudW1iZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKLSAgUFRSIGJ1ZmY7Ci0KLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChhYmZkKTsKLSAgYnVmZiA9IGJmZF9hbGxvYyAoYWJmZCwgbGluZXN6KTsKLSAgaWYgKCFidWZmKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzLT5saW5lbm9fY291bnQpCi0JewotCSAgYXN5bWJvbCAqKnEgPSBhYmZkLT5vdXRzeW1ib2xzOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzLT5saW5lX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGaW5kIGFsbCB0aGUgbGluZW51bWJlcnMgaW4gdGhpcyBzZWN0aW9uICovCi0JICB3aGlsZSAoKnEpCi0JICAgIHsKLQkgICAgICBhc3ltYm9sICpwID0gKnE7Ci0JICAgICAgaWYgKHAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IHMpCi0JCXsKLQkJICBhbGVudCAqbCA9Ci0JCSAgQkZEX1NFTkQgKGJmZF9hc3ltYm9sX2JmZCAocCksIF9nZXRfbGluZW5vLAotCQkJICAgIChiZmRfYXN5bWJvbF9iZmQgKHApLCBwKSk7Ci0JCSAgaWYgKGwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEZvdW5kIGEgbGluZW51bWJlciBlbnRyeSwgb3V0cHV0ICovCi0JCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gb3V0OwotCQkgICAgICBtZW1zZXQgKChQVFIpICYgb3V0LCAwLCBzaXplb2YgKG91dCkpOwotCQkgICAgICBvdXQubF9sbm5vID0gMDsKLQkJICAgICAgb3V0LmxfYWRkci5sX3N5bW5keCA9IGwtPnUub2Zmc2V0OwotCQkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsICZvdXQsIGJ1ZmYpOwotCQkgICAgICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBsaW5lc3osIGFiZmQpICE9IGxpbmVzeikKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgbCsrOwotCQkgICAgICB3aGlsZSAobC0+bGluZV9udW1iZXIpCi0JCQl7Ci0JCQkgIG91dC5sX2xubm8gPSBsLT5saW5lX251bWJlcjsKLQkJCSAgb3V0LmxfYWRkci5sX3N5bW5keCA9IGwtPnUub2Zmc2V0OwotCQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsICZvdXQsIGJ1ZmYpOwotCQkJICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBsaW5lc3osIGFiZmQpICE9IGxpbmVzeikKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIGwrKzsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIHErKzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGJmZF9yZWxlYXNlIChhYmZkLCBidWZmKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qQVJHU1VTRUQgKi8KLWFsZW50ICoKLWNvZmZfZ2V0X2xpbmVubyAoaWdub3JlX2FiZmQsIHN5bWJvbCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotewotICByZXR1cm4gY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gY29mZl9hZGRfbWlzc2luZ19zeW1ib2xzLCB3aGljaCBoYXMgYmVlbgotICAgZGlzYWJsZWQuICAqLwotCi1hc3ltYm9sICoKLWNvZmZfc2VjdGlvbl9zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSk7Ci0gIGFzeW1ib2wgKnN5bTsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqY3N5bTsKLQotICBzeW0gPSBzZWMtPnN5bWJvbDsKLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bSktPm5hdGl2ZTsKLSAgLyogTWFrZSBzdXJlIGJhY2stZW5kIENPRkYgc3R1ZmYgaXMgdGhlcmUuICAqLwotICBpZiAoY3N5bSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBmb28KLQl7Ci0JICBjb2ZmX3N5bWJvbF90eXBlIHN5bTsKLQkgIC8qIEBARklYTUUgVGhpcyBzaG91bGRuJ3QgdXNlIGEgZml4ZWQgc2l6ZSEhICAqLwotCSAgY29tYmluZWRfZW50cnlfdHlwZSBlWzEwXTsKLQl9OwotICAgICAgc3RydWN0IGZvbyAqZjsKLSAgICAgIGYgPSAoc3RydWN0IGZvbyAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKmYpKTsKLSAgICAgIGlmICghZikKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgbWVtc2V0ICgoY2hhciAqKSBmLCAwLCBzaXplb2YgKCpmKSk7Ci0gICAgICBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW0pLT5uYXRpdmUgPSBjc3ltID0gZi0+ZTsKLSAgICB9Ci0gIGNzeW1bMF0udS5zeW1lbnQubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gIGNzeW1bMF0udS5zeW1lbnQubl9udW1hdXggPSAxOwotLyogIFNGX1NFVF9TVEFUSUNTIChzeW0pOyAgICAgICBAQCA/Pz8gKi8KLSAgY3N5bVsxXS51LmF1eGVudC54X3Njbi54X3NjbmxlbiA9IHNlYy0+X3Jhd19zaXplOwotICBjc3ltWzFdLnUuYXV4ZW50Lnhfc2NuLnhfbnJlbG9jID0gc2VjLT5yZWxvY19jb3VudDsKLSAgY3N5bVsxXS51LmF1eGVudC54X3Njbi54X25saW5ubyA9IHNlYy0+bGluZW5vX2NvdW50OwotCi0gIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNlYzsKLSAgICAgIHNlYy0+b3V0cHV0X29mZnNldCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiBzeW07Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gdHJhbnNmb3JtcyB0aGUgb2Zmc2V0cyBpbnRvIHRoZSBzeW1ib2wgdGFibGUgaW50bwotICAgcG9pbnRlcnMgdG8gc3ltZW50cy4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3BvaW50ZXJpemVfYXV4IChhYmZkLCB0YWJsZV9iYXNlLCBzeW1ib2wsIGluZGF1eCwgYXV4ZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnRhYmxlX2Jhc2U7Ci0gICAgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGF1eDsKLSAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4ZW50OwotewotICB1bnNpZ25lZCBpbnQgdHlwZSA9IHN5bWJvbC0+dS5zeW1lbnQubl90eXBlOwotICB1bnNpZ25lZCBpbnQgY2xhc3MgPSBzeW1ib2wtPnUuc3ltZW50Lm5fc2NsYXNzOwotCi0gIGlmIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKQotICAgIHsKLSAgICAgIGlmICgoKmNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3BvaW50ZXJpemVfYXV4X2hvb2spCi0JICAoYWJmZCwgdGFibGVfYmFzZSwgc3ltYm9sLCBpbmRhdXgsIGF1eGVudCkpCi0JcmV0dXJuOwotICAgIH0KLQotICAvKiBEb24ndCBib3RoZXIgaWYgdGhpcyBpcyBhIGZpbGUgb3IgYSBzZWN0aW9uICovCi0gIGlmIChjbGFzcyA9PSBDX1NUQVQgJiYgdHlwZSA9PSBUX05VTEwpCi0gICAgcmV0dXJuOwotICBpZiAoY2xhc3MgPT0gQ19GSUxFKQotICAgIHJldHVybjsKLQotICAvKiBPdGhlcndpc2UgcGF0Y2ggdXAgKi8KLSNkZWZpbmUgTl9UTUFTSyBjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX3RtYXNrCi0jZGVmaW5lIE5fQlRTSEZUIGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0Ci0gIGlmICgoSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykgfHwgY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTikKLSAgICAgICYmIGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA+IDApCi0gICAgewotICAgICAgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wID0KLQl0YWJsZV9iYXNlICsgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotICAgICAgYXV4ZW50LT5maXhfZW5kID0gMTsKLSAgICB9Ci0gIC8qIEEgbmVnYXRpdmUgdGFnbmR4IGlzIG1lYW5pbmdsZXNzLCBidXQgdGhlIFNDTyAzLjJ2NCBjYyBjYW4KLSAgICAgZ2VuZXJhdGUgb25lLCBzbyB3ZSBtdXN0IGJlIGNhcmVmdWwgdG8gaWdub3JlIGl0LiAgKi8KLSAgaWYgKGF1eGVudC0+dS5hdXhlbnQueF9zeW0ueF90YWduZHgubCA+IDApCi0gICAgewotICAgICAgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wID0KLQl0YWJsZV9iYXNlICsgYXV4ZW50LT51LmF1eGVudC54X3N5bS54X3RhZ25keC5sOwotICAgICAgYXV4ZW50LT5maXhfdGFnID0gMTsKLSAgICB9Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgIi5kZWJ1ZyIgc2VjdGlvbiwgYW5kIHJlYWQgaXQuCi0gICBXZSBkaWQgbm90IHJlYWQgdGhlIGRlYnVnIHNlY3Rpb24gdW50aWwgbm93LCBiZWNhdXNlCi0gICB3ZSBkaWRuJ3Qgd2FudCB0byBnbyB0byB0aGUgdHJvdWJsZSB1bnRpbCBzb21lb25lIG5lZWRlZCBpdC4gKi8KLQotc3RhdGljIGNoYXIgKgotYnVpbGRfZGVidWdfc2VjdGlvbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpkZWJ1Z19zZWN0aW9uOwotICBsb25nIHBvc2l0aW9uOwotCi0gIGFzZWN0aW9uICpzZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWciKTsKLQotICBpZiAoIXNlY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2RlYnVnX3NlY3Rpb24pOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGRlYnVnX3NlY3Rpb24gPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KSk7Ci0gIGlmIChkZWJ1Z19zZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBgLmRlYnVnJyBzZWN0aW9uIGFuZCByZWFkIGl0LiAKLSAgICAgU2F2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBmaXJzdDsgaXQgaXMgbmVlZGVkIGJ5IG91ciBjYWxsZXIuCi0gICAgIFRoZW4gcmVhZCBkZWJ1ZyBzZWN0aW9uIGFuZCByZXNldCB0aGUgZmlsZSBwb2ludGVyLiAgKi8KLQotICBwb3NpdGlvbiA9IGJmZF90ZWxsIChhYmZkKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0LT5maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChkZWJ1Z19zZWN0aW9uLAotCQkgICAgYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KSwgMSwgYWJmZCkKLQkgICE9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjdCkpCi0gICAgICB8fCBiZmRfc2VlayAoYWJmZCwgcG9zaXRpb24sIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gZGVidWdfc2VjdGlvbjsKLX0KLQotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbWFsbG9jJ2QgY29weSBvZiAnbmFtZScuICAnbmFtZScgbWF5IG5vdCBiZQotICAgXDAtdGVybWluYXRlZCwgYnV0IHdpbGwgbm90IGV4Y2VlZCAnbWF4bGVuJyBjaGFyYWN0ZXJzLiAgVGhlIGNvcHkgKndpbGwqCi0gICBiZSBcMC10ZXJtaW5hdGVkLiAgKi8KLXN0YXRpYyBjaGFyICoKLWNvcHlfbmFtZSAoYWJmZCwgbmFtZSwgbWF4bGVuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCBtYXhsZW47Ci17Ci0gIGludCBsZW47Ci0gIGNoYXIgKm5ld25hbWU7Ci0KLSAgZm9yIChsZW4gPSAwOyBsZW4gPCBtYXhsZW47ICsrbGVuKQotICAgIHsKLSAgICAgIGlmIChuYW1lW2xlbl0gPT0gJ1wwJykKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmICgobmV3bmFtZSA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgbGVuICsgMSkpID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgc3RybmNweSAobmV3bmFtZSwgbmFtZSwgbGVuKTsKLSAgbmV3bmFtZVtsZW5dID0gJ1wwJzsKLSAgcmV0dXJuIG5ld25hbWU7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHNpemVfdCBzaXplOwotICBQVFIgc3ltczsKLQotICBpZiAob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotCi0gIHNpemUgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0KLSAgc3ltcyA9IChQVFIpIGJmZF9tYWxsb2MgKHNpemUpOwotICBpZiAoc3ltcyA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3JlYWQgKHN5bXMsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgICAgaWYgKHN5bXMgIT0gTlVMTCkKLQlmcmVlIChzeW1zKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBzeW1zOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGluIHRoZSBleHRlcm5hbCBzdHJpbmdzLiAgVGhlIHN0cmluZ3MgYXJlIG5vdCBsb2FkZWQgdW50aWwKLSAgIHRoZXkgYXJlIG5lZWRlZC4gIFRoaXMgaXMgYmVjYXVzZSB3ZSBoYXZlIG5vIHNpbXBsZSB3YXkgb2YKLSAgIGRldGVjdGluZyBhIG1pc3Npbmcgc3RyaW5nIHRhYmxlIGluIGFuIGFyY2hpdmUuICAqLwotCi1jb25zdCBjaGFyICoKLV9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyIGV4dHN0cnNpemVbU1RSSU5HX1NJWkVfU0laRV07Ci0gIHNpemVfdCBzdHJzaXplOwotICBjaGFyICpzdHJpbmdzOwotCi0gIGlmIChvYmpfY29mZl9zdHJpbmdzIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiBvYmpfY29mZl9zdHJpbmdzIChhYmZkKTsKLQotICBpZiAob2JqX3N5bV9maWxlcG9zIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIGJmZF9jb2ZmX3N5bWVzeiAoYWJmZCkpLAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgICAKLSAgaWYgKGJmZF9yZWFkIChleHRzdHJzaXplLCBzaXplb2YgZXh0c3Ryc2l6ZSwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dHN0cnNpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKQotCXJldHVybiBOVUxMOwotCi0gICAgICAvKiBUaGVyZSBpcyBubyBzdHJpbmcgdGFibGUuICAqLwotICAgICAgc3Ryc2l6ZSA9IFNUUklOR19TSVpFX1NJWkU7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgc3Ryc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dHN0cnNpemUpOwotI2Vsc2UKLSAjZXJyb3IgQ2hhbmdlIGJmZF9oX2dldF8zMgotI2VuZGlmCi0gICAgfQotCi0gIGlmIChzdHJzaXplIDwgU1RSSU5HX1NJWkVfU0laRSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGJhZCBzdHJpbmcgdGFibGUgc2l6ZSAlbHUiKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JICh1bnNpZ25lZCBsb25nKSBzdHJzaXplKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN0cmluZ3MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJzaXplKTsKLSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoYmZkX3JlYWQgKHN0cmluZ3MgKyBTVFJJTkdfU0laRV9TSVpFLAotCQlzdHJzaXplIC0gU1RSSU5HX1NJWkVfU0laRSwgMSwgYWJmZCkKLSAgICAgICE9IHN0cnNpemUgLSBTVFJJTkdfU0laRV9TSVpFKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZ3MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpID0gc3RyaW5nczsKLQotICByZXR1cm4gc3RyaW5nczsKLX0KLQotLyogRnJlZSB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgc3RyaW5ncyByZWFkIGZyb20gYSBDT0ZGIGZpbGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSAhPSBOVUxMCi0gICAgICAmJiAhIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkpCi0gICAgewotICAgICAgZnJlZSAob2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpOwotICAgICAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkgPSBOVUxMOwotICAgIH0KLSAgaWYgKG9ial9jb2ZmX3N0cmluZ3MgKGFiZmQpICE9IE5VTEwKLSAgICAgICYmICEgb2JqX2NvZmZfa2VlcF9zdHJpbmdzIChhYmZkKSkKLSAgICB7Ci0gICAgICBmcmVlIChvYmpfY29mZl9zdHJpbmdzIChhYmZkKSk7Ci0gICAgICBvYmpfY29mZl9zdHJpbmdzIChhYmZkKSA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIHN5bWJvbCB0YWJsZSBpbnRvIGZyZXNobHkgYmZkX2FsbG9jYXRlZCBtZW1vcnksIHN3YXAgaXQsIGFuZAotICAga25pdCB0aGUgc3ltYm9sIG5hbWVzIGludG8gYSBub3JtYWxpemVkIGZvcm0uICBCeSBub3JtYWxpemVkIGhlcmUgSQotICAgbWVhbiB0aGF0IGFsbCBzeW1ib2xzIGhhdmUgYW4gbl9vZmZzZXQgcG9pbnRlciB0aGF0IHBvaW50cyB0byBhIG51bGwtCi0gICB0ZXJtaW5hdGVkIHN0cmluZy4gICovCi0KLWNvbWJpbmVkX2VudHJ5X3R5cGUgKgotY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqaW50ZXJuYWw7Ci0gIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmludGVybmFsX3B0cjsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqc3ltYm9sX3B0cjsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqaW50ZXJuYWxfZW5kOwotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgY2hhciAqcmF3X3NyYzsKLSAgY2hhciAqcmF3X2VuZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nX3RhYmxlID0gTlVMTDsKLSAgY2hhciAqZGVidWdfc2VjdGlvbiA9IE5VTEw7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotICBpZiAob2JqX3Jhd19zeW1lbnRzIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiBvYmpfcmF3X3N5bWVudHMgKGFiZmQpOwotCi0gIHNpemUgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzaXplb2YgKGNvbWJpbmVkX2VudHJ5X3R5cGUpOwotICBpbnRlcm5hbCA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoaW50ZXJuYWwgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGludGVybmFsX2VuZCA9IGludGVybmFsICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmF3X3NyYyA9IChjaGFyICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotCi0gIC8qIG1hcmsgdGhlIGVuZCBvZiB0aGUgc3ltYm9scyAqLwotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICByYXdfZW5kID0gKGNoYXIgKikgcmF3X3NyYyArIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAqIHN5bWVzejsKLQotICAvKiBGSVhNRSBTT01FREFZLiAgQSBzdHJpbmcgdGFibGUgc2l6ZSBvZiB6ZXJvIGlzIHZlcnkgd2VpcmQsIGJ1dAotICAgICBwcm9iYWJseSBwb3NzaWJsZS4gIElmIG9uZSBzaG93cyB1cCwgaXQgd2lsbCBwcm9iYWJseSBraWxsIHVzLiAgKi8KLQotICAvKiBTd2FwIGFsbCB0aGUgcmF3IGVudHJpZXMgKi8KLSAgZm9yIChpbnRlcm5hbF9wdHIgPSBpbnRlcm5hbDsKLSAgICAgICByYXdfc3JjIDwgcmF3X2VuZDsKLSAgICAgICByYXdfc3JjICs9IHN5bWVzeiwgaW50ZXJuYWxfcHRyKyspCi0gICAgewotCi0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSByYXdfc3JjLAotCQkJICAgIChQVFIpICYgaW50ZXJuYWxfcHRyLT51LnN5bWVudCk7Ci0gICAgICBzeW1ib2xfcHRyID0gaW50ZXJuYWxfcHRyOwotCi0gICAgICBmb3IgKGkgPSAwOwotCSAgIGkgPCBzeW1ib2xfcHRyLT51LnN5bWVudC5uX251bWF1eDsKLQkgICBpKyspCi0JewotCSAgaW50ZXJuYWxfcHRyKys7Ci0JICByYXdfc3JjICs9IHN5bWVzejsKLQkgIGJmZF9jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCAoUFRSKSByYXdfc3JjLAotCQkJCXN5bWJvbF9wdHItPnUuc3ltZW50Lm5fdHlwZSwKLQkJCQlzeW1ib2xfcHRyLT51LnN5bWVudC5uX3NjbGFzcywKLQkJCQlpLCBzeW1ib2xfcHRyLT51LnN5bWVudC5uX251bWF1eCwKLQkJCQkmKGludGVybmFsX3B0ci0+dS5hdXhlbnQpKTsKLQkgIGNvZmZfcG9pbnRlcml6ZV9hdXggKGFiZmQsIGludGVybmFsLCBzeW1ib2xfcHRyLCBpLAotCQkJICAgICAgIGludGVybmFsX3B0cik7Ci0JfQotICAgIH0KLQotICAvKiBGcmVlIHRoZSByYXcgc3ltYm9scywgYnV0IG5vdCB0aGUgc3RyaW5ncyAoaWYgd2UgaGF2ZSB0aGVtKS4gICovCi0gIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyAoYWJmZCkgPSB0cnVlOwotICBpZiAoISBfYmZkX2NvZmZfZnJlZV9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKGludGVybmFsX3B0ciA9IGludGVybmFsOyBpbnRlcm5hbF9wdHIgPCBpbnRlcm5hbF9lbmQ7Ci0gICAgICAgaW50ZXJuYWxfcHRyKyspCi0gICAgewotICAgICAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFCi0JICAmJiBpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQl7Ci0JICAvKiBtYWtlIGEgZmlsZSBzeW1ib2wgcG9pbnQgdG8gdGhlIG5hbWUgaW4gdGhlIGF1eGVudCwgc2luY2UKLQkgICAgIHRoZSB0ZXh0ICIuZmlsZSIgaXMgcmVkdW5kYW50ICovCi0JICBpZiAoKGludGVybmFsX3B0ciArIDEpLT51LmF1eGVudC54X2ZpbGUueF9uLnhfemVyb2VzID09IDApCi0JICAgIHsKLQkgICAgICAvKiB0aGUgZmlsZW5hbWUgaXMgYSBsb25nIG9uZSwgcG9pbnQgaW50byB0aGUgc3RyaW5nIHRhYmxlICovCi0JICAgICAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQl7Ci0JCSAgc3RyaW5nX3RhYmxlID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKTsKLQkJICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCi0JCSAgICByZXR1cm4gTlVMTDsKLQkJfQotCi0JICAgICAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9Ci0JCSgobG9uZykKLQkJIChzdHJpbmdfdGFibGUKLQkJICArIChpbnRlcm5hbF9wdHIgKyAxKS0+dS5hdXhlbnQueF9maWxlLnhfbi54X29mZnNldCkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBvcmRpbmFyeSBzaG9ydCBmaWxlbmFtZSwgcHV0IGludG8gbWVtb3J5IGFueXdheSAqLwotCSAgICAgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Lm5fbnVtYXV4ID4gMQotCQkgICYmIGNvZmZfZGF0YSAoYWJmZCktPnBlKQotCQl7Ci0JCSAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nKQotCQkgICAgY29weV9uYW1lIChhYmZkLCAoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X2ZuYW1lLAotCQkJICAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQubl9udW1hdXggKiBzeW1lc3opOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9IChsb25nKQotCQkgICAgY29weV9uYW1lIChhYmZkLCAoaW50ZXJuYWxfcHRyICsgMSktPnUuYXV4ZW50LnhfZmlsZS54X2ZuYW1lLAotCQkJICAgICAgIEZJTE5NTEVOKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgInNob3J0IiBuYW1lLiAgTWFrZSBpdCBsb25nLiAgKi8KLQkgICAgICB1bnNpZ25lZCBsb25nIGkgPSAwOwotCSAgICAgIGNoYXIgKm5ld3N0cmluZyA9IE5VTEw7Ci0KLQkgICAgICAvKiBmaW5kIHRoZSBsZW5ndGggb2YgdGhpcyBzdHJpbmcgd2l0aG91dCB3YWxraW5nIGludG8gbWVtb3J5Ci0JICAgICAgICAgdGhhdCBpc24ndCBvdXJzLiAgKi8KLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKQotCQl7Ci0JCSAgaWYgKGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbmFtZVtpXSA9PSAnXDAnKQotCQkgICAgewotCQkgICAgICBicmVhazsKLQkJICAgIH0JCS8qIGlmIGVuZCBvZiBzdHJpbmcgKi8KLQkJfQkJLyogcG9zc2libGUgbGVuZ3RocyBvZiB0aGlzIHN0cmluZy4gKi8KLQotCSAgICAgIGlmICgobmV3c3RyaW5nID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCArK2kpKSA9PSBOVUxMKQotCQlyZXR1cm4gKE5VTEwpOwotCSAgICAgIG1lbXNldCAobmV3c3RyaW5nLCAwLCBpKTsKLQkgICAgICBzdHJuY3B5IChuZXdzdHJpbmcsIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbmFtZSwgaSAtIDEpOwotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZyBpbnQpIG5ld3N0cmluZzsKLQkgICAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25femVyb2VzID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCA9PSAwKQotCSAgICBpbnRlcm5hbF9wdHItPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0ID0gKGxvbmcgaW50KSAiIjsKLQkgIGVsc2UgaWYgKCFiZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnIChhYmZkLCAmaW50ZXJuYWxfcHRyLT51LnN5bWVudCkpCi0JICAgIHsKLQkgICAgICAvKiBMb25nIG5hbWUgYWxyZWFkeS4gIFBvaW50IHN5bWJvbCBhdCB0aGUgc3RyaW5nIGluIHRoZQotICAgICAgICAgICAgICAgICB0YWJsZS4gICovCi0JICAgICAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQl7Ci0JCSAgc3RyaW5nX3RhYmxlID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChhYmZkKTsKLQkJICBpZiAoc3RyaW5nX3RhYmxlID09IE5VTEwpCi0JCSAgICByZXR1cm4gTlVMTDsKLQkJfQotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPQotCQkoKGxvbmcgaW50KQotCQkgKHN0cmluZ190YWJsZQotCQkgICsgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBMb25nIG5hbWUgaW4gZGVidWcgc2VjdGlvbi4gIFZlcnkgc2ltaWxhci4gICovCi0JICAgICAgaWYgKGRlYnVnX3NlY3Rpb24gPT0gTlVMTCkKLQkJZGVidWdfc2VjdGlvbiA9IGJ1aWxkX2RlYnVnX3NlY3Rpb24gKGFiZmQpOwotCSAgICAgIGludGVybmFsX3B0ci0+dS5zeW1lbnQuX24uX25fbi5fbl9vZmZzZXQgPSAobG9uZyBpbnQpCi0JCShkZWJ1Z19zZWN0aW9uICsgaW50ZXJuYWxfcHRyLT51LnN5bWVudC5fbi5fbl9uLl9uX29mZnNldCk7Ci0JICAgIH0KLQl9Ci0gICAgICBpbnRlcm5hbF9wdHIgKz0gaW50ZXJuYWxfcHRyLT51LnN5bWVudC5uX251bWF1eDsKLSAgICB9Ci0KLSAgb2JqX3Jhd19zeW1lbnRzIChhYmZkKSA9IGludGVybmFsOwotICBCRkRfQVNTRVJUIChvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkKLQkgICAgICA9PSAodW5zaWduZWQgaW50KSAoaW50ZXJuYWxfcHRyIC0gaW50ZXJuYWwpKTsKLQotICByZXR1cm4gKGludGVybmFsKTsKLX0JCQkJLyogY29mZl9nZXRfbm9ybWFsaXplZF9zeW10YWIoKSAqLwotCi1sb25nCi1jb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi1hc3ltYm9sICoKLWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqbmV3ID0gKGNvZmZfc3ltYm9sX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKG5ldyA9PSBOVUxMKQotICAgIHJldHVybiAoTlVMTCk7Ci0gIG1lbXNldCAobmV3LCAwLCBzaXplb2YgKm5ldyk7Ci0gIG5ldy0+c3ltYm9sLnNlY3Rpb24gPSAwOwotICBuZXctPm5hdGl2ZSA9IDA7Ci0gIG5ldy0+bGluZW5vID0gKGFsZW50ICopIE5VTEw7Ci0gIG5ldy0+ZG9uZV9saW5lbm8gPSBmYWxzZTsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIE1ha2UgYSBkZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLQotYXN5bWJvbCAqCi1jb2ZmX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCAoYWJmZCwgcHRyLCBzeikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotICAgICB1bnNpZ25lZCBsb25nIHN6OwotewotICBjb2ZmX3N5bWJvbF90eXBlICpuZXcgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgLyogQEAgVGhlIDEwIGlzIGEgZ3Vlc3MgYXQgYSBwbGF1c2libGUgbWF4aW11bSBudW1iZXIgb2YgYXV4IGVudHJpZXMKLSAgICAgKGJ1dCBzaG91bGRuJ3QgYmUgYSBjb25zdGFudCkuICAqLwotICBuZXctPm5hdGl2ZSA9IChjb21iaW5lZF9lbnRyeV90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSkgKiAxMCk7Ci0gIGlmICghbmV3LT5uYXRpdmUpCi0gICAgcmV0dXJuIChOVUxMKTsKLSAgbmV3LT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gIG5ldy0+c3ltYm9sLmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgbmV3LT5saW5lbm8gPSAoYWxlbnQgKikgTlVMTDsKLSAgbmV3LT5kb25lX2xpbmVubyA9IGZhbHNlOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQotLypBUkdTVVNFRCAqLwotdm9pZAotY29mZl9nZXRfc3ltYm9sX2luZm8gKGFiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci0gIGlmIChjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgIT0gTlVMTAotICAgICAgJiYgY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLT5maXhfdmFsdWUpCi0gICAgewotICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqcHN5bTsKLQotICAgICAgcHN5bSA9ICgoY29tYmluZWRfZW50cnlfdHlwZSAqKQotCSAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSk7Ci0gICAgICByZXQtPnZhbHVlID0gKGJmZF92bWEpIChwc3ltIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIENPRkYgc3ltZW50IGZvciBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bWJvbCwgcHN5bWVudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnBzeW1lbnQ7Ci17Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKmNzeW07Ci0KLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0gIGlmIChjc3ltID09IE5VTEwgfHwgY3N5bS0+bmF0aXZlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKnBzeW1lbnQgPSBjc3ltLT5uYXRpdmUtPnUuc3ltZW50OwotCi0gIGlmIChjc3ltLT5uYXRpdmUtPmZpeF92YWx1ZSkKLSAgICBwc3ltZW50LT5uX3ZhbHVlID0gKChjb21iaW5lZF9lbnRyeV90eXBlICopIHBzeW1lbnQtPm5fdmFsdWUKLQkJCS0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgLyogRklYTUU6IFdlIHNob3VsZCBoYW5kbGUgZml4X2xpbmUgaGVyZS4gICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgQ09GRiBhdXhlbnQgZm9yIGEgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltYm9sLCBpbmR4LCBwYXV4ZW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgaW50IGluZHg7Ci0gICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqcGF1eGVudDsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqY3N5bTsKLSAgY29tYmluZWRfZW50cnlfdHlwZSAqZW50OwotCi0gIGNzeW0gPSBjb2ZmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1ib2wpOwotCi0gIGlmIChjc3ltID09IE5VTEwKLSAgICAgIHx8IGNzeW0tPm5hdGl2ZSA9PSBOVUxMCi0gICAgICB8fCBpbmR4ID49IGNzeW0tPm5hdGl2ZS0+dS5zeW1lbnQubl9udW1hdXgpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50ID0gY3N5bS0+bmF0aXZlICsgaW5keCArIDE7Ci0KLSAgKnBhdXhlbnQgPSBlbnQtPnUuYXV4ZW50OwotCi0gIGlmIChlbnQtPmZpeF90YWcpCi0gICAgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9zeW0ueF90YWduZHgucAotICAgICAgIC0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKSk7Ci0KLSAgaWYgKGVudC0+Zml4X2VuZCkKLSAgICBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0KLSAgICAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICBpZiAoZW50LT5maXhfc2NubGVuKQotICAgIHBhdXhlbnQtPnhfY3NlY3QueF9zY25sZW4ubCA9Ci0gICAgICAoKGNvbWJpbmVkX2VudHJ5X3R5cGUgKikgcGF1eGVudC0+eF9jc2VjdC54X3Njbmxlbi5wCi0gICAgICAgLSBvYmpfcmF3X3N5bWVudHMgKGFiZmQpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IENPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgImNvZmYgJXMgJXMiLAotCSAgICAgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgPyAibiIgOiAiZyIsCi0JICAgICAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubyA/ICJsIiA6ICIgIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICBpZiAoY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgaW50IGF1eDsKLQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKmNvbWJpbmVkID0gY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlOwotCSAgY29tYmluZWRfZW50cnlfdHlwZSAqcm9vdCA9IG9ial9yYXdfc3ltZW50cyAoYWJmZCk7Ci0JICBzdHJ1Y3QgbGluZW5vX2NhY2hlX2VudHJ5ICpsID0gY29mZnN5bWJvbCAoc3ltYm9sKS0+bGluZW5vOwotCi0JICBmcHJpbnRmIChmaWxlLCAiWyUzbGRdIiwgKGxvbmcpIChjb21iaW5lZCAtIHJvb3QpKTsKLQotCSAgaWYgKCEgY29tYmluZWQtPmZpeF92YWx1ZSkKLQkgICAgdmFsID0gKHVuc2lnbmVkIGxvbmcpIGNvbWJpbmVkLT51LnN5bWVudC5uX3ZhbHVlOwotCSAgZWxzZQotCSAgICB2YWwgPSAoKHVuc2lnbmVkIGxvbmcpCi0JCSAgICgoY29tYmluZWRfZW50cnlfdHlwZSAqKSBjb21iaW5lZC0+dS5zeW1lbnQubl92YWx1ZQotCQkgICAgLSByb290KSk7Ci0KLQkgIGZwcmludGYgKGZpbGUsCi0JCSAgICIoc2VjICUyZCkoZmwgMHglMDJ4KSh0eSAlM3gpKHNjbCAlM2QpIChueCAlZCkgMHglMDhseCAlcyIsCi0JCSAgIGNvbWJpbmVkLT51LnN5bWVudC5uX3NjbnVtLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9mbGFncywKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fdHlwZSwKLQkJICAgY29tYmluZWQtPnUuc3ltZW50Lm5fc2NsYXNzLAotCQkgICBjb21iaW5lZC0+dS5zeW1lbnQubl9udW1hdXgsCi0JCSAgIHZhbCwKLQkJICAgc3ltYm9sLT5uYW1lKTsKLQotCSAgZm9yIChhdXggPSAwOyBhdXggPCBjb21iaW5lZC0+dS5zeW1lbnQubl9udW1hdXg7IGF1eCsrKQotCSAgICB7Ci0JICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4cCA9IGNvbWJpbmVkICsgYXV4ICsgMTsKLQkgICAgICBsb25nIHRhZ25keDsKLQotCSAgICAgIGlmIChhdXhwLT5maXhfdGFnKQotCQl0YWduZHggPSBhdXhwLT51LmF1eGVudC54X3N5bS54X3RhZ25keC5wIC0gcm9vdDsKLQkgICAgICBlbHNlCi0JCXRhZ25keCA9IGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4Lmw7Ci0KLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotCSAgICAgIGlmIChiZmRfY29mZl9wcmludF9hdXggKGFiZmQsIGZpbGUsIHJvb3QsIGNvbWJpbmVkLCBhdXhwLCBhdXgpKQotCQljb250aW51ZTsKLQotCSAgICAgIHN3aXRjaCAoY29tYmluZWQtPnUuc3ltZW50Lm5fc2NsYXNzKQotCQl7Ci0JCWNhc2UgQ19GSUxFOgotCQkgIGZwcmludGYgKGZpbGUsICJGaWxlICIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgQ19TVEFUOgotCQkgIGlmIChjb21iaW5lZC0+dS5zeW1lbnQubl90eXBlID09IFRfTlVMTCkKLQkJICAgIC8qIHByb2JhYmx5IGEgc2VjdGlvbiBzeW1ib2w/ICovCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYgKGZpbGUsICJBVVggc2NubGVuIDB4JWx4IG5yZWxvYyAlZCBubG5ubyAlZCIsCi0JCQkgICAgICAgKGxvbmcpIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfc2NubGVuLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfbnJlbG9jLAotCQkJICAgICAgIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfbmxpbm5vKTsKLQkJICAgICAgaWYgKGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY2hlY2tzdW0gIT0gMAotCQkJICB8fCBhdXhwLT51LmF1eGVudC54X3Njbi54X2Fzc29jaWF0ZWQgIT0gMAotCQkJICB8fCBhdXhwLT51LmF1eGVudC54X3Njbi54X2NvbWRhdCAhPSAwKQotCQkJZnByaW50ZiAoZmlsZSwgIiBjaGVja3N1bSAweCVseCBhc3NvYyAlZCBjb21kYXQgJWQiLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2NoZWNrc3VtLAotCQkJCSBhdXhwLT51LmF1eGVudC54X3Njbi54X2Fzc29jaWF0ZWQsCi0JCQkJIGF1eHAtPnUuYXV4ZW50Lnhfc2NuLnhfY29tZGF0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyogZWxzZSBmYWxsIHRocm91Z2ggKi8KLQotCQlkZWZhdWx0OgotCQkgIGZwcmludGYgKGZpbGUsICJBVVggbG5ubyAlZCBzaXplIDB4JXggdGFnbmR4ICVsZCIsCi0JCQkgICBhdXhwLT51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywKLQkJCSAgIGF1eHAtPnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJICAgdGFnbmR4KTsKLQkJICBpZiAoYXV4cC0+Zml4X2VuZCkKLQkJICAgIGZwcmludGYgKGZpbGUsICIgZW5kbmR4ICVsZCIsCi0JCQkgICAgICgobG9uZykKLQkJCSAgICAgIChhdXhwLT51LmF1eGVudC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5wCi0JCQkgICAgICAgLSByb290KSkpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGwpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiXG4lcyA6IiwgbC0+dS5zeW0tPm5hbWUpOwotCSAgICAgIGwrKzsKLQkgICAgICB3aGlsZSAobC0+bGluZV9udW1iZXIpCi0JCXsKLQkJICBmcHJpbnRmIChmaWxlLCAiXG4lNGQgOiAweCVseCIsCi0JCQkgICBsLT5saW5lX251bWJlciwKLQkJCSAgICgodW5zaWduZWQgbG9uZykKLQkJCSAgICAobC0+dS5vZmZzZXQgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYSkpKTsKLQkJICBsKys7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCSAgZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzICVzICVzIiwKLQkJICAgc3ltYm9sLT5zZWN0aW9uLT5uYW1lLAotCQkgICBjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUgPyAibiIgOiAiZyIsCi0JCSAgIGNvZmZzeW1ib2wgKHN5bWJvbCktPmxpbmVubyA/ICJsIiA6ICIgIiwKLQkJICAgc3ltYm9sLT5uYW1lKTsKLQl9Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBuYW1lIGltcGxpZXMgYSBsb2NhbCBzeW1ib2wuICBJbiBDT0ZGLAotICAgbG9jYWwgc3ltYm9scyBnZW5lcmFsbHkgc3RhcnQgd2l0aCBgYC5MJycuICBNb3N0IHRhcmdldHMgdXNlIHRoaXMKLSAgIGZ1bmN0aW9uIGZvciB0aGUgaXNfbG9jYWxfbGFiZWxfbmFtZSBlbnRyeSBwb2ludCwgYnV0IHNvbWUgbWF5Ci0gICBvdmVycmlkZSBpdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICcuJyAmJiBuYW1lWzFdID09ICdMJzsKLX0KLQotLyogUHJvdmlkZWQgYSBCRkQsIGEgc2VjdGlvbiBhbmQgYW4gb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24sIGNhbGN1bGF0ZQotICAgYW5kIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlCi0gICB3YW50ZWQgbG9jYXRpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWNvZmZfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIGJvb2xlYW4gZm91bmQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgbGluZV9iYXNlOwotICBjb2ZmX2RhdGFfdHlwZSAqY29mID0gY29mZl9kYXRhIChhYmZkKTsKLSAgLyogUnVuIHRocm91Z2ggdGhlIHJhdyBzeW1lbnRzIGlmIGF2YWlsYWJsZSAqLwotICBjb21iaW5lZF9lbnRyeV90eXBlICpwOwotICBjb21iaW5lZF9lbnRyeV90eXBlICpwZW5kOwotICBhbGVudCAqbDsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjX2RhdGE7Ci0KLSAgLyogQmVmb3JlIGxvb2tpbmcgdGhyb3VnaCB0aGUgc3ltYm9sIHRhYmxlLCB0cnkgdG8gdXNlIGEgLnN0YWIKLSAgICAgc2VjdGlvbiB0byBmaW5kIHRoZSBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsCi0JCQkJCSAgICAgJmZvdW5kLCBmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIsCi0JCQkJCSAgICAgJmNvZmZfZGF0YSAoYWJmZCktPmxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IDA7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gMDsKLSAgKmxpbmVfcHRyID0gMDsKLQotICAvKiBEb24ndCB0cnkgYW5kIGZpbmQgbGluZSBudW1iZXJzIGluIGEgbm9uIGNvZmYgZmlsZSAqLwotICBpZiAoYWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvZiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBDX0ZJTEUgc3ltYm9sLiAgKi8KLSAgcCA9IGNvZi0+cmF3X3N5bWVudHM7Ci0gIGlmICghcCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcGVuZCA9IHAgKyBjb2YtPnJhd19zeW1lbnRfY291bnQ7Ci0gIHdoaWxlIChwIDwgcGVuZCkKLSAgICB7Ci0gICAgICBpZiAocC0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19GSUxFKQotCWJyZWFrOwotICAgICAgcCArPSAxICsgcC0+dS5zeW1lbnQubl9udW1hdXg7Ci0gICAgfQotCi0gIGlmIChwIDwgcGVuZCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHNlY192bWE7Ci0gICAgICBiZmRfdm1hIG1heGRpZmY7Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgQ19GSUxFIHN5bWJvbHMgdG8gZmluZCB0aGUgYmVzdCBvbmUuICAqLwotICAgICAgc2VjX3ZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotICAgICAgKmZpbGVuYW1lX3B0ciA9IChjaGFyICopIHAtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0OwotICAgICAgbWF4ZGlmZiA9IChiZmRfdm1hKSAwIC0gKGJmZF92bWEpIDE7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBjb21iaW5lZF9lbnRyeV90eXBlICpwMjsKLQotCSAgZm9yIChwMiA9IHAgKyAxICsgcC0+dS5zeW1lbnQubl9udW1hdXg7Ci0JICAgICAgIHAyIDwgcGVuZDsKLQkgICAgICAgcDIgKz0gMSArIHAyLT51LnN5bWVudC5uX251bWF1eCkKLQkgICAgewotCSAgICAgIGlmIChwMi0+dS5zeW1lbnQubl9zY251bSA+IDAKLQkJICAmJiAoc2VjdGlvbgotCQkgICAgICA9PSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsCi0JCQkJCQkgICAgICBwMi0+dS5zeW1lbnQubl9zY251bSkpKQotCQlicmVhazsKLQkgICAgICBpZiAocDItPnUuc3ltZW50Lm5fc2NsYXNzID09IENfRklMRSkKLQkJewotCQkgIHAyID0gcGVuZDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChwMiA8IHBlbmQKLQkgICAgICAmJiBvZmZzZXQgKyBzZWNfdm1hID49IChiZmRfdm1hKSBwMi0+dS5zeW1lbnQubl92YWx1ZQotCSAgICAgICYmIG9mZnNldCArIHNlY192bWEgLSAoYmZkX3ZtYSkgcDItPnUuc3ltZW50Lm5fdmFsdWUgPCBtYXhkaWZmKQotCSAgICB7Ci0JICAgICAgKmZpbGVuYW1lX3B0ciA9IChjaGFyICopIHAtPnUuc3ltZW50Ll9uLl9uX24uX25fb2Zmc2V0OwotCSAgICAgIG1heGRpZmYgPSBvZmZzZXQgKyBzZWNfdm1hIC0gcDItPnUuc3ltZW50Lm5fdmFsdWU7Ci0JICAgIH0KLQotCSAgLyogQXZvaWQgZW5kbGVzcyBsb29wcyBvbiBlcnJvbmVvdXMgZmlsZXMgYnkgZW5zdXJpbmcgdGhhdAotCSAgICAgd2UgYWx3YXlzIG1vdmUgZm9yd2FyZCBpbiB0aGUgZmlsZS4gICovCi0JICBpZiAocCAtIGNvZi0+cmF3X3N5bWVudHMgPj0gcC0+dS5zeW1lbnQubl92YWx1ZSkKLQkgICAgYnJlYWs7Ci0KLQkgIHAgPSBjb2YtPnJhd19zeW1lbnRzICsgcC0+dS5zeW1lbnQubl92YWx1ZTsKLQkgIGlmIChwID4gcGVuZCB8fCBwLT51LnN5bWVudC5uX3NjbGFzcyAhPSBDX0ZJTEUpCi0JICAgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHdhbmRlciB0aG91Z2ggdGhlIHJhdyBsaW5lbnVtYmVycyBvZiB0aGUgc2VjdGlvbiAqLwotICAvKiBJZiB3ZSBoYXZlIGJlZW4gY2FsbGVkIG9uIHRoaXMgc2VjdGlvbiBiZWZvcmUsIGFuZCB0aGUgb2Zmc2V0IHdlCi0gICAgIHdhbnQgaXMgZnVydGhlciBkb3duIHRoZW4gd2UgY2FuIHByaW1lIHRoZSBsb29rdXAgbG9vcC4gICovCi0gIHNlY19kYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoc2VjX2RhdGEgIT0gTlVMTAotICAgICAgJiYgc2VjX2RhdGEtPmkgPiAwCi0gICAgICAmJiBvZmZzZXQgPj0gc2VjX2RhdGEtPm9mZnNldCkKLSAgICB7Ci0gICAgICBpID0gc2VjX2RhdGEtPmk7Ci0gICAgICAqZnVuY3Rpb25uYW1lX3B0ciA9IHNlY19kYXRhLT5mdW5jdGlvbjsKLSAgICAgIGxpbmVfYmFzZSA9IHNlY19kYXRhLT5saW5lX2Jhc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaSA9IDA7Ci0gICAgICBsaW5lX2Jhc2UgPSAwOwotICAgIH0KLQotICBpZiAoc2VjdGlvbi0+bGluZW5vICE9IE5VTEwpCi0gICAgewotICAgICAgbCA9ICZzZWN0aW9uLT5saW5lbm9baV07Ci0KLSAgICAgIGZvciAoOyBpIDwgc2VjdGlvbi0+bGluZW5vX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGwtPmxpbmVfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICAvKiBHZXQgdGhlIHN5bWJvbCB0aGlzIGxpbmUgbnVtYmVyIHBvaW50cyBhdCAqLwotCSAgICAgIGNvZmZfc3ltYm9sX3R5cGUgKmNvZmYgPSAoY29mZl9zeW1ib2xfdHlwZSAqKSAobC0+dS5zeW0pOwotCSAgICAgIGlmIChjb2ZmLT5zeW1ib2wudmFsdWUgPiBvZmZzZXQpCi0JCWJyZWFrOwotCSAgICAgICpmdW5jdGlvbm5hbWVfcHRyID0gY29mZi0+c3ltYm9sLm5hbWU7Ci0JICAgICAgaWYgKGNvZmYtPm5hdGl2ZSkKLQkJewotCQkgIGNvbWJpbmVkX2VudHJ5X3R5cGUgKnMgPSBjb2ZmLT5uYXRpdmU7Ci0JCSAgcyA9IHMgKyAxICsgcy0+dS5zeW1lbnQubl9udW1hdXg7Ci0KLQkJICAvKiBJbiBYQ09GRiBhIGRlYnVnZ2luZyBzeW1ib2wgY2FuIGZvbGxvdyB0aGUKLQkJICAgICBmdW5jdGlvbiBzeW1ib2wuICAqLwotCQkgIGlmIChzLT51LnN5bWVudC5uX3NjbnVtID09IE5fREVCVUcpCi0JCSAgICBzID0gcyArIDEgKyBzLT51LnN5bWVudC5uX251bWF1eDsKLQotCQkgIC8qIFMgc2hvdWxkIG5vdyBwb2ludCB0byB0aGUgLmJmIG9mIHRoZSBmdW5jdGlvbi4gICovCi0JCSAgaWYgKHMtPnUuc3ltZW50Lm5fbnVtYXV4KQotCQkgICAgewotCQkgICAgICAvKiBUaGUgbGluZW51bWJlciBpcyBzdG9yZWQgaW4gdGhlIGF1eGVudC4gICovCi0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYSA9ICYoKHMgKyAxKS0+dS5hdXhlbnQpOwotCQkgICAgICBsaW5lX2Jhc2UgPSBhLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubzsKLQkJICAgICAgKmxpbmVfcHRyID0gbGluZV9iYXNlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChsLT51Lm9mZnNldCA+IG9mZnNldCkKLQkJYnJlYWs7Ci0JICAgICAgKmxpbmVfcHRyID0gbC0+bGluZV9udW1iZXIgKyBsaW5lX2Jhc2UgLSAxOwotCSAgICB9Ci0JICBsKys7Ci0JfQotICAgIH0KLQotICAvKiBDYWNoZSB0aGUgcmVzdWx0cyBmb3IgdGhlIG5leHQgY2FsbC4gICovCi0gIGlmIChzZWNfZGF0YSA9PSBOVUxMICYmIHNlY3Rpb24tPm93bmVyID09IGFiZmQpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPQotCSgoUFRSKSBiZmRfemFsbG9jIChhYmZkLAotCQkJICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSkpOwotICAgICAgc2VjX2RhdGEgPSAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZDsKLSAgICB9Ci0gIGlmIChzZWNfZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNlY19kYXRhLT5vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICBzZWNfZGF0YS0+aSA9IGk7Ci0gICAgICBzZWNfZGF0YS0+ZnVuY3Rpb24gPSAqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgIHNlY19kYXRhLT5saW5lX2Jhc2UgPSBsaW5lX2Jhc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1pbnQKLWNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gIHNpemVfdCBzaXplOwotCi0gIGlmIChyZWxvYyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBzaXplID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKSArIGJmZF9jb2ZmX2FvdXRzeiAoYWJmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2l6ZSA9IGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCk7Ci0gICAgfQotCi0gIHNpemUgKz0gYWJmZC0+c2VjdGlvbl9jb3VudCAqIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0gIHJldHVybiBzaXplOwotfQotCi0vKiBDaGFuZ2UgdGhlIGNsYXNzIG9mIGEgY29mZiBzeW1ib2wgaGVsZCBieSBCRkQuICAqLwotYm9vbGVhbgotYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyAoYWJmZCwgc3ltYm9sLCBjbGFzcykKLSAgICAgYmZkICogICAgICAgICBhYmZkOwotICAgICBhc3ltYm9sICogICAgIHN5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICBjbGFzczsKLXsKLSAgY29mZl9zeW1ib2xfdHlwZSAqIGNzeW07Ci0KLSAgY3N5bSA9IGNvZmZfc3ltYm9sX2Zyb20gKGFiZmQsIHN5bWJvbCk7Ci0gIGlmIChjc3ltID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGNzeW0tPm5hdGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gYWxpZW4gc3ltYm9sIHdoaWNoIG5vIG5hdGl2ZSBjb2ZmIGJhY2tlbmQgZGF0YS4KLQkgV2UgY2hlYXQgaGVyZSBieSBjcmVhdGluZyBhIGZha2UgbmF0aXZlIGVudHJ5IGZvciBpdCBhbmQKLQkgdGhlbiBmaWxsaW5nIGluIHRoZSBjbGFzcy4gIFRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGF0IGluCi0JIGNvZmZfd3JpdGVfYWxpZW5fc3ltYm9sKCkuICAqLwotICAgICAgCi0gICAgICBjb21iaW5lZF9lbnRyeV90eXBlICogbmF0aXZlOwotCi0gICAgICBuYXRpdmUgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoKiBuYXRpdmUpKTsKLSAgICAgIGlmIChuYXRpdmUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIG1lbXNldCAobmF0aXZlLCAwLCBzaXplb2YgKCogbmF0aXZlKSk7Ci0gICAgICAKLSAgICAgIG5hdGl2ZS0+dS5zeW1lbnQubl90eXBlICAgPSBUX05VTEw7Ci0gICAgICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID0gY2xhc3M7Ci0gICAgICAKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0JewotCSAgbmF0aXZlLT51LnN5bWVudC5uX3NjbnVtID0gTl9VTkRFRjsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSA9IHN5bWJvbC0+dmFsdWU7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCXsKLQkgIG5hdGl2ZS0+dS5zeW1lbnQubl9zY251bSA9IE5fVU5ERUY7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSBzeW1ib2wtPnZhbHVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fc2NudW0gPQotCSAgICBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBuYXRpdmUtPnUuc3ltZW50Lm5fdmFsdWUgPSAoc3ltYm9sLT52YWx1ZQotCQkJCSAgICAgICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIGlmICghIG9ial9wZSAoYWJmZCkpCi0JICAgIG5hdGl2ZS0+dS5zeW1lbnQubl92YWx1ZSArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICAKLQkgIC8qIENvcHkgdGhlIGFueSBmbGFncyBmcm9tIHRoZSB0aGUgZmlsZSBoZWFkZXIgaW50byB0aGUgc3ltYm9sLgotCSAgICAgRklYTUU6IFdoeT8gICovCi0JICBuYXRpdmUtPnUuc3ltZW50Lm5fZmxhZ3MgPSBiZmRfYXN5bWJvbF9iZmQgKCYgY3N5bS0+c3ltYm9sKS0+ZmxhZ3M7Ci0JfQotICAgICAgCi0gICAgICBjc3ltLT5uYXRpdmUgPSBuYXRpdmU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY3N5bS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9IGNsYXNzOwotICAgIH0KLSAgCi0gIHJldHVybiB0cnVlOwotfQotCmRpZmYgLS1naXQgYS9iZmQvY29mZmxpbmsuYyBiL2JmZC9jb2ZmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjU2ODY5Li4wMDAwMDAwCi0tLSBhL2JmZC9jb2ZmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1MiArMCwwIEBACi0vKiBDT0ZGIHNwZWNpZmljIGxpbmtlciBjb2RlLgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQ09GRiBiYWNrZW5kIGxpbmtlciBjb2RlLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIGNvZmZfbGlua19hZGRfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGNoYXIgKmRvcmVzX2NvbSBQQVJBTVMgKChjaGFyICosIGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBjaGFyICpnZXRfbmFtZSBQQVJBTVMgKChjaGFyICosIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIG1hcmtfcmVsb2NzIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfY29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPnR5cGUgPSBUX05VTEw7Ci0gICAgICByZXQtPmNsYXNzID0gQ19OVUxMOwotICAgICAgcmV0LT5udW1hdXggPSAwOwotICAgICAgcmV0LT5hdXhiZmQgPSBOVUxMOwotICAgICAgcmV0LT5hdXggPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgYWJmZCwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+c3RhYl9pbmZvID0gTlVMTDsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdCAocmV0LCBhYmZkLAotCQkJCQlfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Q7Ci19Ci0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIENPRkYgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dHlwZXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEdpdmVuIGEgQ09GRiBCRkQsIGFkZCBzeW1ib2xzIHRvIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBhcwotICAgYXBwcm9wcmlhdGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiBjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0dXJuIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgICAgKGFiZmQsIGluZm8sIGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQpKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGEgQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoISBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiAqcG5lZWRlZDsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgY29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29mZl9saW5rX2NoZWNrX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGJvb2xlYW4gKCpzeW1faXNfZ2xvYmFsKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqKSk7Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBiZmRfYnl0ZSAqZXN5bTsKLSAgYmZkX2J5dGUgKmVzeW1fZW5kOwotCi0gICpwbmVlZGVkID0gZmFsc2U7Ci0KLSAgc3ltX2lzX2dsb2JhbCA9IGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N5bV9pc19nbG9iYWw7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKTsKLSAgZXN5bV9lbmQgPSBlc3ltICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6OwotICB3aGlsZSAoZXN5bSA8IGVzeW1fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgc3ltOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7Ci0KLSAgICAgIGlmICgoc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAgfHwgc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCSAgIHx8IChvYmpfcGUgKGFiZmQpICYmIHN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspCi0jaWZkZWYgQ19TWVNURU0KLQkgICB8fCBzeW0ubl9zY2xhc3MgPT0gQ19TWVNURU0KLSNlbmRpZgotCSAgIHx8IChzeW1faXNfZ2xvYmFsICYmICgqc3ltX2lzX2dsb2JhbCkgKGFiZmQsICZzeW0pKSkKLQkgICYmIChzeW0ubl9zY251bSAhPSAwIHx8IHN5bS5uX3ZhbHVlICE9IDApKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGV4dGVybmFsbHkgdmlzaWJsZSwgYW5kIGlzIGRlZmluZWQgYnkgdGhpcwotICAgICAgICAgICAgIG9iamVjdCBmaWxlLiAgKi8KLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCSAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQotCSAgICAgdW5kZWZpbmVkLiAgSWYgYSBzeW1ib2wgaXMgY3VycmVudGx5IGtub3duIHRvIGJlIGNvbW1vbiwKLQkgICAgIENPRkYgbGlua2VycyBkbyBub3QgYnJpbmcgaW4gYW4gb2JqZWN0IGZpbGUgd2hpY2ggZGVmaW5lcwotCSAgICAgaXQuICAqLwotCSAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgfQotCi0gIC8qIFdlIGRvIG5vdCBuZWVkIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGFsbCB0aGUgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiAoKnN5bV9pc19nbG9iYWwpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0gIGJvb2xlYW4gZGVmYXVsdF9jb3B5OwotICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0KLSAgLyogS2VlcCB0aGUgc3ltYm9scyBkdXJpbmcgdGhpcyBmdW5jdGlvbiwgaW4gY2FzZSB0aGUgbGlua2VyIG5lZWRzCi0gICAgIHRvIHJlYWQgdGhlIGdlbmVyaWMgc3ltYm9scyBpbiBvcmRlciB0byByZXBvcnQgYW4gZXJyb3IgbWVzc2FnZS4gICovCi0gIGtlZXBfc3ltcyA9IG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCk7Ci0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gIHN5bV9pc19nbG9iYWwgPSBjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsOwotCi0gIGlmIChpbmZvLT5rZWVwX21lbW9yeSkKLSAgICBkZWZhdWx0X2NvcHkgPSBmYWxzZTsKLSAgZWxzZQotICAgIGRlZmF1bHRfY29weSA9IHRydWU7Ci0KLSAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7Ci0KLSAgLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kCi0gICAgIHRvIHBhcnRpY3VsYXIgc3ltYm9scy4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJICgoc2l6ZV90KSBzeW1jb3VudAotCQkJICAqIHNpemVvZiAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopKSkpOwotICBpZiAoc3ltX2hhc2ggPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBvYmpfY29mZl9zeW1faGFzaGVzIChhYmZkKSA9IHN5bV9oYXNoOwotICBtZW1zZXQgKHN5bV9oYXNoLCAwLAotCSAgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgQkZEX0FTU0VSVCAoc3ltZXN6ID09IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCkpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIGJvb2xlYW4gY29weTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICBpZiAoc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAgfHwgc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCSAgIHx8IChvYmpfcGUgKGFiZmQpICYmIHN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspCi0jaWZkZWYgQ19TWVNURU0KLQkgIHx8IHN5bS5uX3NjbGFzcyA9PSBDX1NZU1RFTQotI2VuZGlmCi0JICB8fCAoc3ltX2lzX2dsb2JhbCAmJiAoKnN5bV9pc19nbG9iYWwpIChhYmZkLCAmc3ltKSkpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBmbGFnd29yZCBmbGFnczsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCSAgYmZkX3ZtYSB2YWx1ZTsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLiAgKi8KLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBXZSBtdXN0IGNvcHkgdGhlIG5hbWUgaW50byBtZW1vcnkgaWYgd2UgZ290IGl0IGZyb20gdGhlCi0gICAgICAgICAgICAgc3ltZW50IGl0c2VsZiwgcmF0aGVyIHRoYW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICBjb3B5ID0gZGVmYXVsdF9jb3B5OwotCSAgaWYgKHN5bS5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0JICAgICAgfHwgc3ltLl9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0JICAgIGNvcHkgPSB0cnVlOwotCi0JICB2YWx1ZSA9IHN5bS5uX3ZhbHVlOwotCi0JICBpZiAoc3ltLm5fc2NudW0gPT0gMCkKLQkgICAgewotCSAgICAgIGlmICh2YWx1ZSA9PSAwKQotCQl7Ci0JCSAgZmxhZ3MgPSAwOwotCQkgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZmxhZ3MgPSBCU0ZfR0xPQkFMOwotCQkgIHNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZsYWdzID0gQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUw7Ci0JICAgICAgc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICAgIGlmICghIG9ial9wZSAoYWJmZCkpCi0JCXZhbHVlIC09IHNlY3Rpb24tPnZtYTsKLQkgICAgfQotCi0JICBpZiAoc3ltLm5fc2NsYXNzID09IENfV0VBS0VYVAotCSAgICAgIHx8IChvYmpfcGUgKGFiZmQpICYmIHN5bS5uX3NjbGFzcyA9PSBDX05UX1dFQUspKQotCSAgICBmbGFncyA9IEJTRl9XRUFLOwotCi0JICBpZiAoISAoYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwKLQkJICAoY29uc3QgY2hhciAqKSBOVUxMLCBjb3B5LCBmYWxzZSwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIHN5bV9oYXNoKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoc2VjdGlvbiA9PSBiZmRfY29tX3NlY3Rpb25fcHRyCi0JICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmICgoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+YWxpZ25tZW50X3Bvd2VyCi0JCSAgPiBiZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyIChhYmZkKSkpCi0JICAgICgqc3ltX2hhc2gpLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIKLQkgICAgICA9IGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIgKGFiZmQpOwotCi0JICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpKQotCSAgICB7Ci0JICAgICAgaWYgKCgoKnN5bV9oYXNoKS0+Y2xhc3MgPT0gQ19OVUxMCi0JCSAgICYmICgqc3ltX2hhc2gpLT50eXBlID09IFRfTlVMTCkKLQkJICB8fCBzeW0ubl9zY251bSAhPSAwCi0JCSAgfHwgKHN5bS5uX3ZhbHVlICE9IDAKLQkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgJiYgKCpzeW1faGFzaCktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQl7Ci0JCSAgKCpzeW1faGFzaCktPmNsYXNzID0gc3ltLm5fc2NsYXNzOwotCQkgIGlmIChzeW0ubl90eXBlICE9IFRfTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCgqc3ltX2hhc2gpLT50eXBlICE9IFRfTlVMTAotCQkJICAmJiAoKnN5bV9oYXNoKS0+dHlwZSAhPSBzeW0ubl90eXBlKQotCQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgIChfKCJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIpLAotCQkJICAgbmFtZSwgKCpzeW1faGFzaCktPnR5cGUsIHN5bS5uX3R5cGUsCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCSAgICAgICgqc3ltX2hhc2gpLT50eXBlID0gc3ltLm5fdHlwZTsKLQkJICAgIH0KLQkJICAoKnN5bV9oYXNoKS0+YXV4YmZkID0gYWJmZDsKLQkJICBpZiAoc3ltLm5fbnVtYXV4ICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCAqYWxsb2M7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBpOwotCQkgICAgICBiZmRfYnl0ZSAqZWF1eDsKLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppYXV4OwotCi0JCSAgICAgICgqc3ltX2hhc2gpLT5udW1hdXggPSBzeW0ubl9udW1hdXg7Ci0JCSAgICAgIGFsbG9jID0gKCh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKikKLQkJCSAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkJICAoc3ltLm5fbnVtYXV4Ci0JCQkJCQkgICAqIHNpemVvZiAoKmFsbG9jKSkpKTsKLQkJICAgICAgaWYgKGFsbG9jID09IE5VTEwpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQkJICAgICAgZm9yIChpID0gMCwgZWF1eCA9IGVzeW0gKyBzeW1lc3osIGlhdXggPSBhbGxvYzsKLQkJCSAgIGkgPCBzeW0ubl9udW1hdXg7Ci0JCQkgICBpKyssIGVhdXggKz0gc3ltZXN6LCBpYXV4KyspCi0JCQliZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgZWF1eCwgc3ltLm5fdHlwZSwKLQkJCQkJICAgICAgc3ltLm5fc2NsYXNzLCBpLCBzeW0ubl9udW1hdXgsCi0JCQkJCSAgICAgIChQVFIpIGlhdXgpOwotCQkgICAgICAoKnN5bV9oYXNoKS0+YXV4ID0gYWxsb2M7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgZXN5bSArPSAoc3ltLm5fbnVtYXV4ICsgMSkgKiBzeW1lc3o7Ci0gICAgICBzeW1faGFzaCArPSBzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bwotICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgYW55IC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIGluZm8tPnRyYWRpdGlvbmFsX2Zvcm1hdAotICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvci0+Zmxhdm91ciA9PSBiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpCi0gICAgICAmJiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsICYmIGluZm8tPnN0cmlwICE9IHN0cmlwX2RlYnVnZ2VyKSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3RhYiwgKnN0YWJzdHI7Ci0KLSAgICAgIHN0YWIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFiIik7Ci0gICAgICBpZiAoc3RhYiAhPSBOVUxMKQotCXsKLQkgIHN0YWJzdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zdGFic3RyIik7Ci0KLQkgIGlmIChzdGFic3RyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKnRhYmxlOwotCSAgICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKnNlY2RhdGE7Ci0KLQkgICAgICBzZWNkYXRhID0gY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHN0YWIpOwotCSAgICAgIGlmIChzZWNkYXRhID09IE5VTEwpCi0JCXsKLQkJICBzdGFiLT51c2VkX2J5X2JmZCA9Ci0JCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLAotCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCQkgIGlmIChzdGFiLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc2VjZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzdGFiKTsKLQkJfQotCi0JICAgICAgdGFibGUgPSBjb2ZmX2hhc2hfdGFibGUgKGluZm8pOwotCi0JICAgICAgaWYgKCEgX2JmZF9saW5rX3NlY3Rpb25fc3RhYnMgKGFiZmQsICZ0YWJsZS0+c3RhYl9pbmZvLAotCQkJCQkgICAgIHN0YWIsIHN0YWJzdHIsCi0JCQkJCSAgICAgJnNlY2RhdGEtPnN0YWJfaW5mbykpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpID0ga2VlcF9zeW1zOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBEbyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltZXN6OwotICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gZmluZm87Ci0gIGJvb2xlYW4gZGVidWdfbWVyZ2VfYWxsb2NhdGVkOwotICBib29sZWFuIGxvbmdfc2VjdGlvbl9uYW1lczsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBmaWxlX3B0ciByZWxfZmlsZXBvczsKLSAgdW5zaWduZWQgaW50IHJlbHN6OwotICBmaWxlX3B0ciBsaW5lX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCBsaW5lc3o7Ci0gIGJmZCAqc3ViOwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgY2hhciBzdHJidWZbU1RSSU5HX1NJWkVfU0laRV07Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN0cnRhYiA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gIGZpbmZvLmxhc3RfZmlsZV9pbmRleCA9IC0xOwotICBmaW5mby5sYXN0X2JmX2luZGV4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zZWNfcHRycyA9IE5VTEw7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gIGZpbmZvLmxpbmVub3MgPSBOVUxMOwotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmdsb2JhbF90b19zdGF0aWMgPSBmYWxzZTsKLSAgZGVidWdfbWVyZ2VfYWxsb2NhdGVkID0gZmFsc2U7Ci0KLSAgY29mZl9kYXRhIChhYmZkKS0+bGlua19pbmZvID0gaW5mbzsKLQotICBmaW5mby5zdHJ0YWIgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAoZmluZm8uc3RydGFiID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2luaXQgKCZmaW5mby5kZWJ1Z19tZXJnZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IHRydWU7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMuICAqLwotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIENvdW50IHRoZSBsaW5lIG51bWJlcnMgYW5kIHJlbG9jYXRpb24gZW50cmllcyByZXF1aXJlZCBmb3IgdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgU2V0IHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHJlbF9maWxlcG9zID0gb2JqX3JlbG9jYmFzZSAoYWJmZCk7Ci0gIHJlbHN6ID0gYmZkX2NvZmZfcmVsc3ogKGFiZmQpOwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9saW5lbm9fY291bnQgPSAwOwotICBtYXhfcmVsb2NfY291bnQgPSAwOwotCi0gIGxvbmdfc2VjdGlvbl9uYW1lcyA9IGZhbHNlOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQkJby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9yZWxvY19jb3VudCkKLQkJbWF4X3JlbG9jX2NvdW50ID0gc2VjLT5yZWxvY19jb3VudDsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgICYmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKSkKLQkgICAgKytvLT5yZWxvY19jb3VudDsKLQl9Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgIHJlbF9maWxlcG9zICs9IG8tPnJlbG9jX2NvdW50ICogcmVsc3o7Ci0JfQotCi0gICAgICBpZiAoYmZkX2NvZmZfbG9uZ19zZWN0aW9uX25hbWVzIChhYmZkKQotCSAgJiYgc3RybGVuIChvLT5uYW1lKSA+IFNDTk5NTEVOKQotCXsKLQkgIC8qIFRoaXMgc2VjdGlvbiBoYXMgYSBsb25nIG5hbWUgd2hpY2ggbXVzdCBnbyBpbiB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgdGFibGUuICBUaGlzIG11c3QgY29ycmVzcG9uZCB0byB0aGUgY29kZSBpbgotICAgICAgICAgICAgIGNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIHdoaWNoIHB1dHMgdGhlIHN0cmluZyBpbmRleAotICAgICAgICAgICAgIGludG8gdGhlIHNfbmFtZSBmaWVsZCBvZiB0aGUgc2VjdGlvbiBoZWFkZXIuICBUaGF0IGlzIHdoeQotICAgICAgICAgICAgIHdlIHBhc3MgaGFzaCBhcyBmYWxzZS4gICovCi0JICBpZiAoX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby5zdHJ0YWIsIG8tPm5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbG9uZ19zZWN0aW9uX25hbWVzID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcG9pbnRlcnMgd2UKLSAgICAgbmVlZCB0byBrZWVwLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogV2UgdXNlIHNlY3Rpb25fY291bnQgKyAxLCByYXRoZXIgdGhhbiBzZWN0aW9uX2NvdW50LCBiZWNhdXNlCi0gICAgICAgICB0aGUgdGFyZ2V0X2luZGV4IGZpZWxkcyBhcmUgMSBiYXNlZC4gICovCi0gICAgICBmaW5mby5zZWN0aW9uX2luZm8gPQotCSgoc3RydWN0IGNvZmZfbGlua19zZWN0aW9uX2luZm8gKikKLQkgYmZkX21hbGxvYyAoKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKQotCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbykpKTsKLSAgICAgIGlmIChmaW5mby5zZWN0aW9uX2luZm8gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPD0gYWJmZC0+c2VjdGlvbl9jb3VudDsgaSsrKQotCXsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgPSBOVUxMOwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHNpemUgb2YgdGhlIHJlbG9jcywgc28gd2UgY2FuIGRldGVybWluZSB0aGUgZmlsZQotICAgICBwb3NpdGlvbnMgb2YgdGhlIGxpbmUgbnVtYmVycy4gICovCi0gIGxpbmVfZmlsZXBvcyA9IHJlbF9maWxlcG9zOwotICBsaW5lc3ogPSBiZmRfY29mZl9saW5lc3ogKGFiZmQpOwotICBtYXhfb3V0cHV0X3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgaWYgKG8tPmxpbmVub19jb3VudCA9PSAwKQotCW8tPmxpbmVfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgby0+bGluZV9maWxlcG9zID0gbGluZV9maWxlcG9zOwotCSAgbGluZV9maWxlcG9zICs9IG8tPmxpbmVub19jb3VudCAqIGxpbmVzejsKLQl9Ci0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCAhPSAwKQotCXsKLQkgIC8qIFdlIGRvbid0IGtub3cgdGhlIGluZGljZXMgb2YgZ2xvYmFsIHN5bWJvbHMgdW50aWwgd2UgaGF2ZQotICAgICAgICAgICAgIHdyaXR0ZW4gb3V0IGFsbCB0aGUgbG9jYWwgc3ltYm9scy4gIEZvciBlYWNoIHNlY3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgb3V0cHV0IGZpbGUsIHdlIGtlZXAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGFzaAotICAgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhCi0gICAgICAgICAgICAgcmVsb2MuICBXaGVuIHdlIGZpbmQgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgd2UKLSAgICAgICAgICAgICBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGNhbgotICAgICAgICAgICAgIGZpeCB1cCB0aGUgc3ltYm9sIGluZGV4IGFmdGVyIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZQotICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuCi0KLQkgICAgIEJlY2F1c2Ugb2YgdGhpcyBwcm9ibGVtLCB3ZSBhbHNvIGtlZXAgdGhlIHJlbG9jcyBpbgotCSAgICAgbWVtb3J5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIHdhc3RlcyBtZW1vcnksCi0JICAgICBidXQgb25seSB3aGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHdoaWNoIGlzIG5vdCB0aGUKLQkgICAgIGNvbW1vbiBjYXNlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGluZm8tPnJlbG9jYXRlYWJsZSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPQotCSAgICAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLQkgIGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMgPQotCSAgICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50Ci0JCSAgICAgKiBzaXplb2YgKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9PSBOVUxMCi0JICAgICAgfHwgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID4gbWF4X291dHB1dF9yZWxvY19jb3VudCkKLQkgICAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IG8tPnJlbG9jX2NvdW50OwotCX0KLQotICAgICAgLyogUmVzZXQgdGhlIHJlbG9jIGFuZCBsaW5lbm8gY291bnRzLCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhlbSB0bwotCSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIG8tPmxpbmVub19jb3VudCA9IDA7Ci0gICAgfQotCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBsaW5lX2ZpbGVwb3M7Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgbGFyZ2VzdCBudW1iZXIgb2Ygc3ltYm9scyBpbiBhbiBpbnB1dCBCRkQuICBUYWtlCi0gICAgIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhciB0aGUgb3V0cHV0X2hhc19iZWd1biBmaWVsZHMgb2YgYWxsIHRoZQotICAgICBpbnB1dCBCRkQncy4gICovCi0gIG1heF9zeW1fY291bnQgPSAwOwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc3o7Ci0KLSAgICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICAgICAgc3ogPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKLSAgICAgIGlmIChzeiA+IG1heF9zeW1fY291bnQpCi0JbWF4X3N5bV9jb3VudCA9IHN6OwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzb21lIGJ1ZmZlcnMgdXNlZCB3aGlsZSBsaW5raW5nLiAgKi8KLSAgZmluZm8uaW50ZXJuYWxfc3ltcyA9ICgoc3RydWN0IGludGVybmFsX3N5bWVudCAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KSkpOwotICBmaW5mby5zZWNfcHRycyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCQkgICAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gKGxvbmcgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAobG9uZykpOwotICBmaW5mby5vdXRzeW1zID0gKChiZmRfYnl0ZSAqKQotCQkgICBiZmRfbWFsbG9jICgoc2l6ZV90KSAoKG1heF9zeW1fY291bnQgKyAxKSAqIHN5bWVzeikpKTsKLSAgZmluZm8ubGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfbGluZW5vX2NvdW50Ci0JCQkJICAgICAgICogYmZkX2NvZmZfbGluZXN6IChhYmZkKSk7Ci0gIGZpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIGZpbmZvLmludGVybmFsX3JlbG9jcyA9ICgoc3RydWN0IGludGVybmFsX3JlbG9jICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudAotCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYykpKTsKLSAgaWYgKChmaW5mby5pbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc2VjX3B0cnMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5zeW1faW5kaWNlcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgPiAwKQotICAgICAgfHwgZmluZm8ub3V0c3ltcyA9PSBOVUxMCi0gICAgICB8fCAoZmluZm8ubGluZW5vcyA9PSBOVUxMICYmIG1heF9saW5lbm9fY291bnQgPiAwKQotICAgICAgfHwgKGZpbmZvLmNvbnRlbnRzID09IE5VTEwgJiYgbWF4X2NvbnRlbnRzX3NpemUgPiAwKQotICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9yZWxvY19jb3VudCA+IDApCi0gICAgICB8fCAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLQkgICYmIGZpbmZvLmludGVybmFsX3JlbG9jcyA9PSBOVUxMCi0JICAmJiBtYXhfcmVsb2NfY291bnQgPiAwKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSBub3cga25vdyB0aGUgcG9zaXRpb24gb2YgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgZXhjZXB0IHRoYXQKLSAgICAgd2UgZG9uJ3Qga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGFuZCB0aGVyZWZvcmUgd2UgZG9uJ3QKLSAgICAga25vdyB3aGVyZSB0aGUgc3RyaW5nIHRhYmxlIHN0YXJ0cy4gIFdlIGp1c3QgYnVpbGQgdGhlIHN0cmluZwotICAgICB0YWJsZSBpbiBtZW1vcnkgYXMgd2UgZ28gYWxvbmcuICBXZSBwcm9jZXNzIGFsbCB0aGUgcmVsb2NhdGlvbnMKLSAgICAgZm9yIGEgc2luZ2xlIGlucHV0IGZpbGUgYXQgb25jZS4gICovCi0gIG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSA9IDA7Ci0KLSAgaWYgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmspCi0gICAgewotICAgICAgaWYgKCEgYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluayAoYWJmZCwgaW5mbykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSAgICAgICYmIChiZmRfZ2V0X2ZsYXZvdXIgKHAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXIpCi0JCSAgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgc3ViID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4gKHN1YiwgJiBmaW5mbykpCi0JCXsKLQkJICBpZiAoISBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsICZmaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBiZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQgKGFiZmQsICYgZmluZm8pKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAKLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IF9iZmRfY29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlX2ZyZWUgKCZmaW5mby5kZWJ1Z19tZXJnZSk7Ci0gIGRlYnVnX21lcmdlX2FsbG9jYXRlZCA9IGZhbHNlOwotCi0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgICAgIGZpbmZvLnNlY19wdHJzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5zeW1faW5kaWNlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLnN5bV9pbmRpY2VzKTsKLSAgICAgIGZpbmZvLnN5bV9pbmRpY2VzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gICAgICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgICAgIGZpbmZvLmNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICAgICAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHN5bWJvbAotICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sLiAgV3JpdGUgaXQgb3V0IGFnYWluIGlmCi0gICAgIG5lY2Vzc2FyeS4gICovCi0gIGlmIChmaW5mby5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmICh1bnNpZ25lZCBpbnQpIGZpbmZvLmxhc3RfZmlsZS5uX3ZhbHVlICE9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKTsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgKFBUUikgJmZpbmZvLmxhc3RfZmlsZSwKLQkJCSAgICAgKFBUUikgZmluZm8ub3V0c3ltcyk7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgZmluZm8ubGFzdF9maWxlX2luZGV4ICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfd3JpdGUgKGZpbmZvLm91dHN5bXMsIHN5bWVzeiwgMSwgYWJmZCkgIT0gc3ltZXN6KQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgZG9pbmcgdGFzayBsaW5raW5nIChsZCAtLXRhc2stbGluaykgdGhlbiBtYWtlIGEgcGFzcyB0aHJvdWdoIHRoZQotICAgICBnbG9iYWwgc3ltYm9scywgd3JpdGluZyBvdXQgYW55IHRoYXQgYXJlIGRlZmluZWQsIGFuZCBtYWtpbmcgdGhlbQotICAgICBzdGF0aWMuICovCi0gIGlmIChpbmZvLT50YXNrX2xpbmspCi0gICAgewotICAgICAgZmluZm8uZmFpbGVkID0gZmFsc2U7Ci0gICAgICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscywKLQkJCSAgICAgICAoUFRSKSAmZmluZm8pOwotICAgICAgaWYgKGZpbmZvLmZhaWxlZCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBnbG9iYWwgc3ltYm9scy4gICovCi0gIGZpbmZvLmZhaWxlZCA9IGZhbHNlOwotICBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSAoY29mZl9oYXNoX3RhYmxlIChpbmZvKSwgX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0sCi0JCQkgICAoUFRSKSAmZmluZm8pOwotICBpZiAoZmluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBvdXRzeW1zIGJ1ZmZlciBpcyB1c2VkIGJ5IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltLiAgKi8KLSAgaWYgKGZpbmZvLm91dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5vdXRzeW1zKTsKLSAgICAgIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlICYmIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdwotCSB0aGUgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuCi0JIGZpbmFsbHkgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKChiZmRfYnl0ZSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9vdXRwdXRfcmVsb2NfY291bnQgKiByZWxzeikpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaDsKLQkgIGJmZF9ieXRlICplcmVsOwotCi0JICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlyZWwgPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzOwotCSAgZXJlbCA9IGV4dGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCSAgICB7Ci0JICAgICAgaWYgKCpyZWxfaGFzaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoKCpyZWxfaGFzaCktPmluZHggPj0gMCk7Ci0JCSAgaXJlbC0+cl9zeW1uZHggPSAoKnJlbF9oYXNoKS0+aW5keDsKLQkJfQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAoUFRSKSBpcmVsLCAoUFRSKSBlcmVsKTsKLQkgICAgfQotCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NzLCByZWxzeiwgby0+cmVsb2NfY291bnQsCi0JCQkgICAgYWJmZCkgIT0gcmVsc3ogKiBvLT5yZWxvY19jb3VudCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgb3B0aW1pemVkIHN0YWJzIHN0cmluZ3MsIG91dHB1dCB0aGVtLiAgKi8KLSAgaWYgKGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIChhYmZkLCAmY29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgaWYgKG9ial9yYXdfc3ltZW50X2NvdW50IChhYmZkKSAhPSAwIHx8IGxvbmdfc2VjdGlvbl9uYW1lcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAob2JqX3N5bV9maWxlcG9zIChhYmZkKQotCQkgICAgICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6KSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotI2lmIFNUUklOR19TSVpFX1NJWkUgPT0gNAotICAgICAgYmZkX2hfcHV0XzMyIChhYmZkLAotCQkgICAgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3RydGFiKSArIFNUUklOR19TSVpFX1NJWkUsCi0JCSAgICAoYmZkX2J5dGUgKikgc3RyYnVmKTsKLSNlbHNlCi0gI2Vycm9yIENoYW5nZSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0gICAgICBpZiAoYmZkX3dyaXRlIChzdHJidWYsIDEsIFNUUklOR19TSVpFX1NJWkUsIGFiZmQpICE9IFNUUklOR19TSVpFX1NJWkUpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLQotICAvKiBTZXR0aW5nIGJmZF9nZXRfc3ltY291bnQgdG8gMCB3aWxsIGNhdXNlIHdyaXRlX29iamVjdF9jb250ZW50cyB0bwotICAgICBub3QgdHJ5IHRvIHdyaXRlIG91dCB0aGUgc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGRlYnVnX21lcmdlX2FsbG9jYXRlZCkKLSAgICBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSAoJmZpbmZvLmRlYnVnX21lcmdlKTsKLSAgaWYgKGZpbmZvLnN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN0cnRhYik7Ci0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICB9Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChmaW5mby5zZWNfcHRycyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLnNlY19wdHJzKTsKLSAgaWYgKGZpbmZvLnN5bV9pbmRpY2VzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uc3ltX2luZGljZXMpOwotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gIGlmIChmaW5mby5leHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5leHRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8uaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogcGFyc2Ugb3V0IGEgLWhlYXAgPHJlc2VydmVkPiw8Y29tbWl0PiBsaW5lICovCi0KLXN0YXRpYyBjaGFyICoKLWRvcmVzX2NvbSAocHRyLCBvdXRwdXRfYmZkLCBoZWFwKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgaW50IGhlYXA7Ci17Ci0gIGlmIChjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKSAKLSAgICB7Ci0gICAgICBpbnQgdmFsID0gc3RydG91bCAocHRyLCAmcHRyLCAwKTsKLSAgICAgIGlmIChoZWFwKQotCXBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZIZWFwUmVzZXJ2ZSA9dmFsOwotICAgICAgZWxzZQotCXBlX2RhdGEob3V0cHV0X2JmZCktPnBlX29wdGhkci5TaXplT2ZTdGFja1Jlc2VydmUgPXZhbDsKLQotICAgICAgaWYgKHB0clswXSA9PSAnLCcpIAotCXsKLQkgIGludCB2YWwgPSBzdHJ0b3VsIChwdHIrMSwgJnB0ciwgMCk7Ci0JICBpZiAoaGVhcCkKLQkgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLlNpemVPZkhlYXBDb21taXQgPXZhbDsKLQkgIGVsc2UKLQkgICAgcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLlNpemVPZlN0YWNrQ29tbWl0ID12YWw7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIGNoYXIgKmdldF9uYW1lKHB0ciwgZHN0KQotY2hhciAqcHRyOwotY2hhciAqKmRzdDsKLXsKLSAgd2hpbGUgKCpwdHIgPT0gJyAnKQotICAgIHB0cisrOwotICAqZHN0ID0gcHRyOwotICB3aGlsZSAoKnB0ciAmJiAqcHRyICE9ICcgJykKLSAgICBwdHIrKzsKLSAgKnB0ciA9IDA7Ci0gIHJldHVybiBwdHIrMTsKLX0KLQotLyogUHJvY2VzcyBhbnkgbWFnaWMgZW1iZWRkZWQgY29tbWFuZHMgaW4gYSBzZWN0aW9uIGNhbGxlZCAuZHJlY3R2ZSAqLwotCQkJCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2VtYmVkZGVkX2NvbW1hbmRzIChvdXRwdXRfYmZkLCBpbmZvLCAgYWJmZCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHJlY3R2ZSIpOwotICBjaGFyICpzOwotICBjaGFyICplOwotICBjaGFyICpjb3B5OwotICBpZiAoIXNlYykgCi0gICAgcmV0dXJuIDE7Ci0gIAotICBjb3B5ID0gYmZkX21hbGxvYyAoKHNpemVfdCkgc2VjLT5fcmF3X3NpemUpOwotICBpZiAoIWNvcHkpIAotICAgIHJldHVybiAwOwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMoYWJmZCwgc2VjLCBjb3B5LCAwLCBzZWMtPl9yYXdfc2l6ZSkpIAotICAgIHsKLSAgICAgIGZyZWUgKGNvcHkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlID0gY29weSArIHNlYy0+X3Jhd19zaXplOwotICBmb3IgKHMgPSBjb3B5OyAgcyA8IGUgOyApIAotICAgIHsKLSAgICAgIGlmIChzWzBdIT0gJy0nKSB7Ci0JcysrOwotCWNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKHN0cm5jbXAgKHMsIi1hdHRyIiwgNSkgPT0gMCkKLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgY2hhciAqYXR0cmliczsKLQkgIGFzZWN0aW9uICphc2VjOwotCi0JICBpbnQgbG9vcCA9IDE7Ci0JICBpbnQgaGFkX3dyaXRlID0gMDsKLQkgIGludCBoYWRfcmVhZCA9IDA7Ci0JICBpbnQgaGFkX2V4ZWM9IDA7Ci0JICBpbnQgaGFkX3NoYXJlZD0gMDsKLQkgIHMgKz0gNTsKLQkgIHMgPSBnZXRfbmFtZShzLCAmbmFtZSk7Ci0JICBzID0gZ2V0X25hbWUocywgJmF0dHJpYnMpOwotCSAgd2hpbGUgKGxvb3ApIHsKLQkgICAgc3dpdGNoICgqYXR0cmlicysrKSAKLQkgICAgICB7Ci0JICAgICAgY2FzZSAnVyc6Ci0JCWhhZF93cml0ZSA9IDE7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJ1InOgotCQloYWRfcmVhZCA9IDE7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJ1MnOgotCQloYWRfc2hhcmVkID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnWCc6Ci0JCWhhZF9leGVjID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJbG9vcCA9IDA7Ci0JICAgICAgfQotCSAgfQotCSAgYXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgIGlmIChhc2VjKSB7Ci0JICAgIGlmIChoYWRfZXhlYykKLQkgICAgICBhc2VjLT5mbGFncyB8PSBTRUNfQ09ERTsKLQkgICAgaWYgKCFoYWRfd3JpdGUpCi0JICAgICAgYXNlYy0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCSAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsIi1oZWFwIiwgNSkgPT0gMCkKLQl7Ci0JICBzID0gZG9yZXNfY29tIChzKzUsIG91dHB1dF9iZmQsIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsIi1zdGFjayIsIDYpID09IDApCi0JewotCSAgcyA9IGRvcmVzX2NvbSAocys2LCBvdXRwdXRfYmZkLCAwKTsKLQl9Ci0gICAgICBlbHNlIAotCXMrKzsKLSAgICB9Ci0gIGZyZWUgKGNvcHkpOwotICByZXR1cm4gMTsKLX0KLQotLyogUGxhY2UgYSBtYXJrZXIgYWdhaW5zdCBhbGwgc3ltYm9scyB3aGljaCBhcmUgdXNlZCBieSByZWxvY2F0aW9ucy4KLSAgIFRoaXMgbWFya2VyIGNhbiBiZSBwaWNrZWQgdXAgYnkgdGhlICdkbyB3ZSBza2lwIHRoaXMgc3ltYm9sID8nCi0gICBsb29wIGluIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZCgpIGFuZCB1c2VkIHRvIHByZXZlbnQgc2tpcHBpbmcKLSAgIHRoYXQgc3ltYm9sLiAKLSAgICovCi0KLXN0YXRpYyB2b2lkCi1tYXJrX3JlbG9jcyAoZmluZm8sIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICoJZmluZm87Ci0gICAgIGJmZCAqIAkJCQlpbnB1dF9iZmQ7Ci17Ci0gIGFzZWN0aW9uICogYTsKLQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoaW5wdXRfYmZkKSAmIEhBU19TWU1TKSA9PSAwKQotICAgIHJldHVybjsKLSAgCi0gIGZvciAoYSA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IGEgIT0gKGFzZWN0aW9uICopIE5VTEw7IGEgPSBhLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqCWludGVybmFsX3JlbG9jczsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqCWlyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKglpcmVsZW5kOwotCi0gICAgICAKLSAgICAgIGlmICgoYS0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAgfHwgYS0+cmVsb2NfY291bnQgIDwgMSkKLQljb250aW51ZTsKLQotICAgICAgLyogUmVhZCBpbiB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCShpbnB1dF9iZmQsIGEsIGZhbHNlLAotCSBmaW5mby0+ZXh0ZXJuYWxfcmVsb2NzLAotCSBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlLAotCSAoZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCSAgPyAoZmluZm8tPnNlY3Rpb25faW5mb1sgYS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleCBdLnJlbG9jcyArIGEtPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCkKLQkgIDogZmluZm8tPmludGVybmFsX3JlbG9jcykKLQkpOwotICAgICAgCi0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIGlyZWwgICAgID0gaW50ZXJuYWxfcmVsb2NzOwotICAgICAgaXJlbGVuZCAgPSBpcmVsICsgYS0+cmVsb2NfY291bnQ7Ci0KLSAgICAgIC8qIFBsYWNlIGEgbWFyayBpbiB0aGUgc3ltX2luZGljZXMgYXJyYXkgKHdob3NlIGVudHJpZXMgaGF2ZQotCSBiZWVuIGluaXRpYWxpc2VkIHRvIDApIGZvciBhbGwgb2YgdGhlIHN5bWJvbHMgdGhhdCBhcmUgdXNlZAotCSBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZS4gIFRoaXMgd2lsbCB0aGVuIGJlIHBpY2tlZCB1cCBpbiB0aGUKLQkgc2tpcC9kb24ndCBwYXNzICovCi0gICAgICAKLSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotCXsKLQkgIGZpbmZvLT5zeW1faW5kaWNlc1sgaXJlbC0+cl9zeW1uZHggXSA9IC0xOwotCX0KLSAgICB9Ci19Ci0KLS8qIExpbmsgYW4gaW5wdXQgZmlsZSBpbnRvIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuICBUaGlzIGZ1bmN0aW9uCi0gICBoYW5kbGVzIGFsbCB0aGUgc2VjdGlvbnMgYW5kIHJlbG9jYXRpb25zIG9mIHRoZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBib29sZWFuICgqc3ltX2lzX2dsb2JhbCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKikpOwotICBib29sZWFuICgqYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLAotCQkJCSAgICBhc2VjdGlvbiAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkgICAgYm9vbGVhbiAqKSk7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBzeW1lbnRfYmFzZTsKLSAgdW5zaWduZWQgaW50IG5fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdDsKLSAgYm9vbGVhbiBjb3B5LCBoYXNoOwotICBiZmRfc2l6ZV90eXBlIGlzeW1lc3o7Ci0gIGJmZF9zaXplX3R5cGUgb3N5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzeW1wOwotICBhc2VjdGlvbiAqKnNlY3BwOwotICBsb25nICppbmRleHA7Ci0gIHVuc2lnbmVkIGxvbmcgb3V0cHV0X2luZGV4OwotICBiZmRfYnl0ZSAqb3V0c3ltOwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgLyogTW92ZSBhbGwgdGhlIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHN5bV9pc19nbG9iYWwgPSBjb2ZmX2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+X2JmZF9jb2ZmX3N5bV9pc19nbG9iYWw7Ci0gIHN0cmluZ3MgPSBOVUxMOwotICBzeW1lbnRfYmFzZSA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLSAgaXN5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAoaW5wdXRfYmZkKTsKLSAgb3N5bWVzeiA9IGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoaW5wdXRfYmZkKTsKLSAgQkZEX0FTU0VSVCAobGluZXN6ID09IGJmZF9jb2ZmX2xpbmVzeiAob3V0cHV0X2JmZCkpOwotCi0gIG5fdG1hc2sgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fdG1hc2s7Ci0gIG5fYnRzaGZ0ID0gY29mZl9kYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9uX2J0c2hmdDsKLQotICAvKiBEZWZpbmUgbWFjcm9zIHNvIHRoYXQgSVNGQ04sIGV0LiBhbC4sIG1hY3JvcyB3b3JrIGNvcnJlY3RseS4gICovCi0jZGVmaW5lIE5fVE1BU0sgbl90bWFzawotI2RlZmluZSBOX0JUU0hGVCBuX2J0c2hmdAotCi0gIGNvcHkgPSBmYWxzZTsKLSAgaWYgKCEgZmluZm8tPmluZm8tPmtlZXBfbWVtb3J5KQotICAgIGNvcHkgPSB0cnVlOwotICBoYXNoID0gdHJ1ZTsKLSAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0gICAgaGFzaCA9IGZhbHNlOwotCi0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIHNlY3BwID0gZmluZm8tPnNlY19wdHJzOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIG91dHB1dF9pbmRleCA9IHN5bWVudF9iYXNlOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLQotICBpZiAoY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0gICAgewotICAgICAgaWYgKCEgcHJvY2Vzc19lbWJlZGRlZF9jb21tYW5kcyAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIGlucHV0X2JmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gcGVyZm9ybSByZWxvY2F0aW9ucyBhbmQgYWxzbyBzdHJpcC9kaXNjYXJkIHNvbWUgc3ltYm9scwotICAgICB0aGVuIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHN0cmlwL2Rpc2NhcmQgdGhvc2Ugc3ltYm9scyB0aGF0IGFyZQotICAgICBnb2luZyB0byBiZSBpbnZvbHZlZCBpbiB0aGUgcmVsb2NhdGlvbnMgKi8KLSAgaWYgKCggICBmaW5mby0+aW5mby0+c3RyaXAgICAhPSBzdHJpcF9ub25lCi0gICAgICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgIT0gZGlzY2FyZF9ub25lKQotICAgICAgJiYgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAvKiBtYXJrIHRoZSBzeW1ib2wgYXJyYXkgYXMgJ25vdC11c2VkJyAqLwotICAgICAgbWVtc2V0IChpbmRleHAsIDAsIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogc2l6ZW9mICogaW5kZXhwKTsgCi0gICAgICAgCi0gICAgICBtYXJrX3JlbG9jcyAoZmluZm8sIGlucHV0X2JmZCk7Ci0gICAgfQotCi0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICAgICAgYm9vbGVhbiBza2lwOwotICAgICAgYm9vbGVhbiBnbG9iYWw7Ci0gICAgICBib29sZWFuIGRvbnRfc2tpcF9zeW1ib2w7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAoaW5wdXRfYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSBpc3ltcCk7Ci0KLSAgICAgIC8qIE1ha2UgYSBjb3B5IG9mICppc3ltcCBzbyB0aGF0IHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uCi0JIGFsd2F5cyBzZWVzIHRoZSBvcmlnaW5hbCB2YWx1ZXMuICBUaGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbgotCSBhbHdheXMgcmVjb21wdXRpbmcgdGhlIHN5bWJvbCB2YWx1ZSBldmVuIGlmIHdlIGFyZSBzdHJpcHBpbmcKLQkgdGhlIHN5bWJvbC4gICovCi0gICAgICBpc3ltID0gKmlzeW1wOwotCi0gICAgICBpZiAoaXN5bS5uX3NjbnVtICE9IDApCi0JKnNlY3BwID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChpbnB1dF9iZmQsIGlzeW0ubl9zY251bSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGlzeW0ubl92YWx1ZSA9PSAwKQotCSAgICAqc2VjcHAgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICAqc2VjcHAgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCX0KLQotICAgICAgLyogRXh0cmFjdCB0aGUgZmxhZyBpbmRpY2F0aW5nIGlmIHRoaXMgc3ltYm9sIGlzIHVzZWQgYnkgYQotICAgICAgICAgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoKGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9ub25lCi0JICAgfHwgZmluZm8tPmluZm8tPmRpc2NhcmQgIT0gZGlzY2FyZF9ub25lKQotCSAgJiYgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQlkb250X3NraXBfc3ltYm9sID0gKmluZGV4cDsKLSAgICAgIGVsc2UKLQlkb250X3NraXBfc3ltYm9sID0gZmFsc2U7Ci0gICAgICAKLSAgICAgICppbmRleHAgPSAtMTsKLQotICAgICAgc2tpcCA9IGZhbHNlOwotICAgICAgZ2xvYmFsID0gZmFsc2U7Ci0gICAgICBhZGQgPSAxICsgaXN5bS5uX251bWF1eDsKLQotICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2Ugd2FudCB0byBza2lwIHRoaXMgb25lLiAgKi8KLSAgICAgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsICYmICEgZG9udF9za2lwX3N5bWJvbCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgaWYgKCEgc2tpcCkKLQl7Ci0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19XRUFLRVhUCi0JICAgICAgfHwgKG9ial9wZSAoaW5wdXRfYmZkKSAmJiBpc3ltLm5fc2NsYXNzID09IENfTlRfV0VBSykKLSNpZmRlZiBDX1NZU1RFTQotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19TWVNURU0KLSNlbmRpZgotCSAgICAgIHx8IChzeW1faXNfZ2xvYmFsICYmICgqc3ltX2lzX2dsb2JhbCkgKGlucHV0X2JmZCwgJmlzeW0pKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sLiAgR2xvYmFsIHN5bWJvbHMgY29tZSBhdCB0aGUKLQkJIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLCBzbyBza2lwIHRoZW0gZm9yIG5vdy4KLQkJIExvY2FsbHkgZGVmaW5lZCBmdW5jdGlvbiBzeW1ib2xzLCBob3dldmVyLCBhcmUgYW4KLQkJIGV4Y2VwdGlvbiwgYW5kIGFyZSBub3QgbW92ZWQgdG8gdGhlIGVuZC4gICovCi0JICAgICAgZ2xvYmFsID0gdHJ1ZTsKLQkgICAgICBpZiAoISBJU0ZDTiAoaXN5bS5uX3R5cGUpIHx8IGlzeW0ubl9zY251bSA9PSAwKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGxvY2FsIHN5bWJvbC4gIFNraXAgaXQgaWYgd2UgYXJlIGRpc2NhcmRpbmcKLSAgICAgICAgICAgICAgICAgbG9jYWwgc3ltYm9scy4gICovCi0JICAgICAgaWYgKGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfYWxsICYmICEgZG9udF9za2lwX3N5bWJvbCkKLQkJc2tpcCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHdlIHN0cmlwcGluZyBkZWJ1Z2dpbmcgc3ltYm9scywgYW5kIHRoaXMgaXMgYSBkZWJ1Z2dpbmcKLSAgICAgICAgIHN5bWJvbCwgdGhlbiBza2lwIGl0LiAgRklYTUU6IGdhcyBzZXRzIHRoZSBzZWN0aW9uIHRvIE5fQUJTCi0gICAgICAgICBmb3Igc29tZSB0eXBlcyBvZiBkZWJ1Z2dpbmcgc3ltYm9sczsgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgICAgICAgIGEgYnVnIG9yIG5vdC4gIEluIGFueSBjYXNlLCB3ZSBoYW5kbGUgaXQgaGVyZS4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIKLQkgICYmICEgZG9udF9za2lwX3N5bWJvbAotCSAgJiYgKGlzeW0ubl9zY251bSA9PSBOX0RFQlVHCi0JICAgICAgfHwgKGlzeW0ubl9zY251bSA9PSBOX0FCUwotCQkgICYmIChpc3ltLm5fc2NsYXNzID09IENfQVVUTwotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfUkVHCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19NT1MKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX01PRQotCQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfTU9VCi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19BUkcKLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX1JFR1BBUk0KLQkJICAgICAgfHwgaXN5bS5uX3NjbGFzcyA9PSBDX0ZJRUxECi0JCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19FT1MpKSkpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIElmIHNvbWUgc3ltYm9scyBhcmUgc3RyaXBwZWQgYmFzZWQgb24gdGhlIG5hbWUsIHdvcmsgb3V0IHRoZQotCSBuYW1lIGFuZCBkZWNpZGUgd2hldGhlciB0byBza2lwIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbCkpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGlucHV0X2JmZCwgJmlzeW0sIGJ1Zik7Ci0JICBpZiAobmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIGRvbnRfc2tpcF9zeW1ib2wKLQkgICAgICAmJiAoKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JCSAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLAotCQkJCSAgICBmYWxzZSkgPT0gTlVMTCkpCi0JCSAgIHx8ICghIGdsb2JhbAotCQkgICAgICAgJiYgZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sCi0JCSAgICAgICAmJiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKSkpKQotCSAgICBza2lwID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gZW51bSwgc3RydWN0LCBvciB1bmlvbiB0YWcsIHNlZSBpZiB3ZSBoYXZlCi0gICAgICAgICBhbHJlYWR5IG91dHB1dCBhbiBpZGVudGljYWwgdHlwZS4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiAoZmluZm8tPm91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgPT0gMAotCSAgJiYgKGlzeW0ubl9zY2xhc3MgPT0gQ19FTlRBRwotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19TVFJUQUcKLQkgICAgICB8fCBpc3ltLm5fc2NsYXNzID09IENfVU5UQUcpCi0JICAmJiBpc3ltLm5fbnVtYXV4ID09IDEpCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX2VudHJ5ICptaDsKLQkgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKm10OwotCSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGF1eDsKLQkgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKiplcHA7Ci0JICBiZmRfYnl0ZSAqZXNsLCAqZXNsZW5kOwotCSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXNscDsKLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCAmaXN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogSWdub3JlIGZha2UgbmFtZXMgaW52ZW50ZWQgYnkgY29tcGlsZXI7IHRyZWF0IHRoZW0gYWxsIGFzCi0gICAgICAgICAgICAgdGhlIHNhbWUgbmFtZS4gICovCi0JICBpZiAoKm5hbWUgPT0gJ34nIHx8ICpuYW1lID09ICcuJyB8fCAqbmFtZSA9PSAnJCcKLQkgICAgICB8fCAoKm5hbWUgPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChpbnB1dF9iZmQpCi0JCSAgJiYgKG5hbWVbMV0gPT0gJ34nIHx8IG5hbWVbMV0gPT0gJy4nIHx8IG5hbWVbMV0gPT0gJyQnKSkpCi0JICAgIG5hbWUgPSAiIjsKLQotCSAgbWggPSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwICgmZmluZm8tPmRlYnVnX21lcmdlLCBuYW1lLAotCQkJCQkgICAgIHRydWUsIHRydWUpOwotCSAgaWYgKG1oID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdHlwZSBpbmZvcm1hdGlvbi4gIElmIHRoaXMgdHVybnMKLSAgICAgICAgICAgICBvdXQgdG8gYmUgYSBkdXBsaWNhdGUsIHdlIHBhc3MgdGhpcyBhZGRyZXNzIHRvCi0gICAgICAgICAgICAgYmZkX3JlbGVhc2UuICAqLwotCSAgbXQgPSAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKikKLQkJYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkgICBzaXplb2YgKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUpKSk7Ci0JICBpZiAobXQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbXQtPmNsYXNzID0gaXN5bS5uX3NjbGFzczsKLQotCSAgLyogUGljayB1cCB0aGUgYXV4IGVudHJ5LCB3aGljaCBwb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgdGFnCi0gICAgICAgICAgICAgZW50cmllcy4gICovCi0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoaW5wdXRfYmZkLCAoUFRSKSAoZXN5bSArIGlzeW1lc3opLAotCQkJCWlzeW0ubl90eXBlLCBpc3ltLm5fc2NsYXNzLCAwLCBpc3ltLm5fbnVtYXV4LAotCQkJCShQVFIpICZhdXgpOwotCi0JICAvKiBHYXRoZXIgdGhlIGVsZW1lbnRzLiAgKi8KLQkgIGVwcCA9ICZtdC0+ZWxlbWVudHM7Ci0JICBtdC0+ZWxlbWVudHMgPSBOVUxMOwotCSAgaXNscCA9IGlzeW1wICsgMjsKLQkgIGVzbCA9IGVzeW0gKyAyICogaXN5bWVzejsKLQkgIGVzbGVuZCA9ICgoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKQotCQkgICAgKyBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCAqIGlzeW1lc3opOwotCSAgd2hpbGUgKGVzbCA8IGVzbGVuZCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKmVsZW5hbWU7Ci0JICAgICAgY2hhciBlbGVidWZbU1lNTk1MRU4gKyAxXTsKLQkgICAgICBjaGFyICpjb3B5OwotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGlucHV0X2JmZCwgKFBUUikgZXNsLCAoUFRSKSBpc2xwKTsKLQotCSAgICAgICplcHAgPSAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQgKikKLQkJICAgICAgYmZkX2FsbG9jIChpbnB1dF9iZmQsCi0JCQkJIHNpemVvZiAoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCkpKTsKLQkgICAgICBpZiAoKmVwcCA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBlbGVuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIGlzbHAsCi0JCQkJCQkJZWxlYnVmKTsKLQkgICAgICBpZiAoZWxlbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBjb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChpbnB1dF9iZmQsIHN0cmxlbiAoZWxlbmFtZSkgKyAxKTsKLQkgICAgICBpZiAoY29weSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc3RyY3B5IChjb3B5LCBlbGVuYW1lKTsKLQotCSAgICAgICgqZXBwKS0+bmFtZSA9IGNvcHk7Ci0JICAgICAgKCplcHApLT50eXBlID0gaXNscC0+bl90eXBlOwotCSAgICAgICgqZXBwKS0+dGFnbmR4ID0gMDsKLQkgICAgICBpZiAoaXNscC0+bl9udW1hdXggPj0gMQotCQkgICYmIGlzbHAtPm5fdHlwZSAhPSBUX05VTEwKLQkJICAmJiBpc2xwLT5uX3NjbGFzcyAhPSBDX0VPUykKLQkJewotCQkgIHVuaW9uIGludGVybmFsX2F1eGVudCBlbGVhdXg7Ci0JCSAgbG9uZyBpbmR4OwotCi0JCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgKGVzbCArIGlzeW1lc3opLAotCQkJCQlpc2xwLT5uX3R5cGUsIGlzbHAtPm5fc2NsYXNzLCAwLAotCQkJCQlpc2xwLT5uX251bWF1eCwgKFBUUikgJmVsZWF1eCk7Ci0JCSAgaW5keCA9IGVsZWF1eC54X3N5bS54X3RhZ25keC5sOwotCi0JCSAgLyogRklYTUU6IElmIHRoaXMgdGFnbmR4IGVudHJ5IHJlZmVycyB0byBhIHN5bWJvbAotCQkgICAgIGRlZmluZWQgbGF0ZXIgaW4gdGhpcyBmaWxlLCB3ZSBqdXN0IGlnbm9yZSBpdC4KLQkJICAgICBIYW5kbGluZyB0aGlzIGNvcnJlY3RseSB3b3VsZCBiZSB0ZWRpb3VzLCBhbmQgbWF5Ci0JCSAgICAgbm90IGJlIHJlcXVpcmVkLiAgKi8KLQotCQkgIGlmIChpbmR4ID4gMAotCQkgICAgICAmJiAoaW5keAotCQkJICA8ICgoZXN5bSAtCi0JCQkgICAgICAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkKLQkJCSAgICAgLyAobG9uZykgaXN5bWVzeikpKQotCQkgICAgewotCQkgICAgICAoKmVwcCktPnRhZ25keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICAgICAgaWYgKCgqZXBwKS0+dGFnbmR4IDwgMCkKLQkJCSgqZXBwKS0+dGFnbmR4ID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVwcCA9ICYoKmVwcCktPm5leHQ7Ci0JICAgICAgKmVwcCA9IE5VTEw7Ci0KLQkgICAgICBlc2wgKz0gKGlzbHAtPm5fbnVtYXV4ICsgMSkgKiBpc3ltZXN6OwotCSAgICAgIGlzbHAgKz0gaXNscC0+bl9udW1hdXggKyAxOwotCSAgICB9Ci0KLQkgIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBkZWZpbml0aW9uIHdoaWNoIG1hdGNoZXMgdGhpcwotICAgICAgICAgICAgIHR5cGUuICBXZSBhbHdheXMgb3V0cHV0IHRoZSB0eXBlIGlmIGl0IGhhcyBubyBlbGVtZW50cywKLSAgICAgICAgICAgICBmb3Igc2ltcGxpY2l0eS4gICovCi0JICBpZiAobXQtPmVsZW1lbnRzID09IE5VTEwpCi0JICAgIGJmZF9yZWxlYXNlIChpbnB1dF9iZmQsIChQVFIpIG10KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX3R5cGUgKm10bDsKLQotCSAgICAgIGZvciAobXRsID0gbWgtPnR5cGVzOyBtdGwgIT0gTlVMTDsgbXRsID0gbXRsLT5uZXh0KQotCQl7Ci0JCSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbWUsICptZWw7Ci0KLQkJICBpZiAobXRsLT5jbGFzcyAhPSBtdC0+Y2xhc3MpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGZvciAobWUgPSBtdC0+ZWxlbWVudHMsIG1lbCA9IG10bC0+ZWxlbWVudHM7Ci0JCSAgICAgICBtZSAhPSBOVUxMICYmIG1lbCAhPSBOVUxMOwotCQkgICAgICAgbWUgPSBtZS0+bmV4dCwgbWVsID0gbWVsLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoc3RyY21wIChtZS0+bmFtZSwgbWVsLT5uYW1lKSAhPSAwCi0JCQkgIHx8IG1lLT50eXBlICE9IG1lbC0+dHlwZQotCQkJICB8fCBtZS0+dGFnbmR4ICE9IG1lbC0+dGFnbmR4KQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBpZiAobWUgPT0gTlVMTCAmJiBtZWwgPT0gTlVMTCkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAobXRsID09IE5VTEwgfHwgKGJmZF9zaXplX3R5cGUpIG10bC0+aW5keCA+PSBzeW1lbnRfYmFzZSkKLQkJewotCQkgIC8qIFRoaXMgaXMgdGhlIGZpcnN0IGRlZmluaXRpb24gb2YgdGhpcyB0eXBlLiAgKi8KLQkJICBtdC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkJICBtdC0+bmV4dCA9IG1oLT50eXBlczsKLQkJICBtaC0+dHlwZXMgPSBtdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWRlZmluaXRpb24gd2hpY2ggY2FuIGJlIG1lcmdlZC4gICovCi0JCSAgYmZkX3JlbGVhc2UgKGlucHV0X2JmZCwgKFBUUikgbXQpOwotCQkgICppbmRleHAgPSBtdGwtPmluZHg7Ci0JCSAgYWRkID0gKGVzbGVuZCAtIGVzeW0pIC8gaXN5bWVzejsKLQkJICBza2lwID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBub3cga25vdyB3aGV0aGVyIHdlIGFyZSB0byBza2lwIHRoaXMgc3ltYm9sIG9yIG5vdC4gICovCi0gICAgICBpZiAoISBza2lwKQotCXsKLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIGluIG9yZGVyIHRvIG91dHB1dCBpdC4gICovCi0KLQkgIGlmIChpc3ltLl9uLl9uX24uX25femVyb2VzID09IDAKLQkgICAgICAmJiBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ICE9IDApCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIGxvbmcgbmFtZS4gIEVudGVyIGl0IGluIHRoZSBzdHJpbmcKLQkJIHRhYmxlIHdlIGFyZSBidWlsZGluZy4gIE5vdGUgdGhhdCB3ZSBkbyBub3QgY2hlY2sKLQkJIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcuICBUaGF0IGlzIG9ubHkgdHJ1ZSBmb3IKLQkJIFhDT0ZGLCBhbmQgWENPRkYgcmVxdWlyZXMgZGlmZmVyZW50IGxpbmtpbmcgY29kZQotCQkgYW55aG93LiAgKi8KLQkgICAgICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLAotCQkJCQkJICAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgbmFtZSwgaGFzaCwgY29weSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCSAgICB9Ci0KLQkgIGlmIChpc3ltLm5fc2NudW0gPiAwKQotCSAgICB7Ci0JICAgICAgaXN5bS5uX3NjbnVtID0gKCpzZWNwcCktPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgICAgaXN5bS5uX3ZhbHVlICs9ICgqc2VjcHApLT5vdXRwdXRfb2Zmc2V0OwotCSAgICAgIGlmICghIG9ial9wZSAoaW5wdXRfYmZkKSkKLQkJaXN5bS5uX3ZhbHVlIC09ICgqc2VjcHApLT52bWE7Ci0JICAgICAgaWYgKCEgb2JqX3BlIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JCWlzeW0ubl92YWx1ZSArPSAoKnNlY3BwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgfQotCi0JICAvKiBUaGUgdmFsdWUgb2YgYSBDX0ZJTEUgc3ltYm9sIGlzIHRoZSBzeW1ib2wgaW5kZXggb2YgdGhlCi0JICAgICBuZXh0IENfRklMRSBzeW1ib2wuICBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbAotCSAgICAgaXMgdGhlIHN5bWJvbCBpbmRleCB0byB0aGUgZmlyc3QgZXh0ZXJuYWwgc3ltYm9sCi0JICAgICAoYWN0dWFsbHksIGNvZmZfcmVudW1iZXJfc3ltYm9scyBkb2VzIG5vdCBnZXQgdGhpcwotCSAgICAgcmlnaHQtLWl0IGp1c3Qgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIHN5bWJvbAotCSAgICAgdG8gemVyby0tYW5kIG5vYm9keSBoYXMgZXZlciBjb21wbGFpbmVkIGFib3V0IGl0KS4gIFdlCi0JICAgICB0cnkgdG8gZ2V0IHRoaXMgcmlnaHQsIGJlbG93LCBqdXN0IGJlZm9yZSB3ZSB3cml0ZSB0aGUKLQkgICAgIHN5bWJvbHMgb3V0LCBidXQgaW4gdGhlIGdlbmVyYWwgY2FzZSB3ZSBtYXkgaGF2ZSB0byB3cml0ZQotCSAgICAgdGhlIHN5bWJvbCBvdXQgdHdpY2UuICAqLwotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICB7Ci0JICAgICAgaWYgKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLQkJICAmJiBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgIT0gKGxvbmcpIG91dHB1dF9pbmRleCkKLQkJewotCQkgIC8qIFdlIG11c3QgY29ycmVjdCB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgQ19GSUxFIGVudHJ5LiAgKi8KLQkJICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7Ci0JCSAgaWYgKChiZmRfc2l6ZV90eXBlKSBmaW5mby0+bGFzdF9maWxlX2luZGV4ID49IHN5bWVudF9iYXNlKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgbGFzdCBDX0ZJTEUgc3ltYm9sIGlzIGluIHRoaXMgaW5wdXQgZmlsZS4gICovCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAoUFRSKSAmZmluZm8tPmxhc3RfZmlsZSwKLQkJCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLQkJCQkJCSAgICArICgoZmluZm8tPmxhc3RfZmlsZV9pbmRleAotCQkJCQkJCS0gc3ltZW50X2Jhc2UpCi0JCQkJCQkgICAgICAgKiBvc3ltZXN6KSkpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IHRoZSBsYXN0IENfRklMRQotCQkJIHN5bWJvbC4gIFdlIG5lZWQgdG8gd3JpdGUgaXQgb3V0IGFnYWluLiAgV2UKLQkJCSBib3Jyb3cgKm91dHN5bSB0ZW1wb3JhcmlseS4gICovCi0JCSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAoUFRSKSAmZmluZm8tPmxhc3RfZmlsZSwKLQkJCQkJICAgICAoUFRSKSBvdXRzeW0pOwotCQkgICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCQkJICAgICArIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggKiBvc3ltZXN6KSwKLQkJCQkgICAgU0VFS19TRVQpICE9IDAKLQkJCSAgfHwgKGJmZF93cml0ZSAob3V0c3ltLCBvc3ltZXN6LCAxLCBvdXRwdXRfYmZkKQotCQkJICAgICAgIT0gb3N5bWVzeikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggPSBvdXRwdXRfaW5kZXg7Ci0JICAgICAgZmluZm8tPmxhc3RfZmlsZSA9IGlzeW07Ci0JICAgIH0KLQotCSAgLyogSWYgZG9pbmcgdGFzayBsaW5raW5nLCBjb252ZXJ0IG5vcm1hbCBnbG9iYWwgZnVuY3Rpb24gc3ltYm9scyB0bwotCSAgICAgc3RhdGljIGZ1bmN0aW9ucy4gKi8KLQotCSAgaWYgKGZpbmZvLT5pbmZvLT50YXNrX2xpbmsKLQkgICAgICAmJiAoaXN5bS5uX3NjbGFzcyA9PSBDX0VYVAotCQkgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19XRUFLRVhUCi0JCSAgfHwgKG9ial9wZSAoaW5wdXRfYmZkKSAmJiBpc3ltLm5fc2NsYXNzID09IENfTlRfV0VBSykpKQotCSAgICBpc3ltLm5fc2NsYXNzID0gQ19TVEFUOwotCi0JICAvKiBPdXRwdXQgdGhlIHN5bWJvbC4gICovCi0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIG91dHN5bSk7Ci0KLQkgICppbmRleHAgPSBvdXRwdXRfaW5kZXg7Ci0KLQkgIGlmIChnbG9iYWwpCi0JICAgIHsKLQkgICAgICBsb25nIGluZHg7Ci0JICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaW5keCA9ICgoZXN5bSAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQotCQkgICAgICAvIGlzeW1lc3opOwotCSAgICAgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZHhdOwotCSAgICAgIGlmIChoID09IE5VTEwpCi0JCXsKLQkJICAvKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlcmUgd2VyZSBlcnJvcnMgZWFybGllciBpbgotICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmsuICAqLwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGgtPmluZHggPSBvdXRwdXRfaW5kZXg7Ci0JICAgIH0KLQotCSAgb3V0cHV0X2luZGV4ICs9IGFkZDsKLQkgIG91dHN5bSArPSBhZGQgKiBvc3ltZXN6OwotCX0KLQotICAgICAgZXN5bSArPSBhZGQgKiBpc3ltZXN6OwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgKytzZWNwcDsKLSAgICAgICsraW5kZXhwOwotICAgICAgZm9yICgtLWFkZDsgYWRkID4gMDsgLS1hZGQpCi0JewotCSAgKnNlY3BwKysgPSBOVUxMOwotCSAgKmluZGV4cCsrID0gLTE7Ci0JfQotICAgIH0KLQotICAvKiBGaXggdXAgdGhlIGF1eCBlbnRyaWVzLiAgVGhpcyBtdXN0IGJlIGRvbmUgaW4gYSBzZXBhcmF0ZSBwYXNzLAotICAgICBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGNvcnJlY3Qgc3ltYm9sIGluZGljZXMgdW50aWwgd2UgaGF2ZQotICAgICBhbHJlYWR5IGRlY2lkZWQgd2hpY2ggc3ltYm9scyB3ZSBhcmUgZ29pbmcgdG8ga2VlcC4gICovCi0KLSAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSAqIGlzeW1lc3o7Ci0gIGlzeW1wID0gZmluZm8tPmludGVybmFsX3N5bXM7Ci0gIGluZGV4cCA9IGZpbmZvLT5zeW1faW5kaWNlczsKLSAgc3ltX2hhc2ggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICBhZGQgPSAxICsgaXN5bXAtPm5fbnVtYXV4OwotCi0gICAgICBpZiAoKCppbmRleHAgPCAwCi0JICAgfHwgKGJmZF9zaXplX3R5cGUpICppbmRleHAgPCBzeW1lbnRfYmFzZSkKLQkgICYmICgqc3ltX2hhc2ggPT0gTlVMTAotCSAgICAgIHx8ICgqc3ltX2hhc2gpLT5hdXhiZmQgIT0gaW5wdXRfYmZkKSkKLQllc3ltICs9IGFkZCAqIGlzeW1lc3o7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgaW50IGk7Ci0KLQkgIGggPSBOVUxMOwotCSAgaWYgKCppbmRleHAgPCAwKQotCSAgICB7Ci0JICAgICAgaCA9ICpzeW1faGFzaDsKLQotCSAgICAgIC8qIFRoZSBtNjhrLW1vdG9yb2xhLXN5c3YgYXNzZW1ibGVyIHdpbGwgc29tZXRpbWVzCi0gICAgICAgICAgICAgICAgIGdlbmVyYXRlIHR3byBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSwgYnV0IG9ubHkgb25lCi0gICAgICAgICAgICAgICAgIHdpbGwgaGF2ZSBhdXggZW50cmllcy4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoaXN5bXAtPm5fbnVtYXV4ID09IDAKLQkJCSAgfHwgaC0+bnVtYXV4ID09IGlzeW1wLT5uX251bWF1eCk7Ci0JICAgIH0KLQotCSAgZXN5bSArPSBpc3ltZXN6OwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBvdXRzeW0gKz0gb3N5bWVzejsKLQotCSAgLyogSGFuZGxlIHRoZSBhdXggZW50cmllcy4gIFRoaXMgaGFuZGxpbmcgaXMgYmFzZWQgb24KLQkgICAgIGNvZmZfcG9pbnRlcml6ZV9hdXguICBJIGRvbid0IGtub3cgaWYgaXQgYWx3YXlzIGNvcnJlY3QuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IGlzeW1wLT5uX251bWF1eCAmJiBlc3ltIDwgZXN5bV9lbmQ7IGkrKykKLQkgICAgewotCSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0JICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXhwOwotCi0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJYXV4cCA9IGgtPmF1eCArIGk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgaXN5bXAtPm5fdHlwZSwKLQkJCQkJaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJCShQVFIpICZhdXgpOwotCQkgIGF1eHAgPSAmYXV4OwotCQl9Ci0KLQkgICAgICBpZiAoaXN5bXAtPm5fc2NsYXNzID09IENfRklMRSkKLQkJewotCQkgIC8qIElmIHRoaXMgaXMgYSBsb25nIGZpbGVuYW1lLCB3ZSBtdXN0IHB1dCBpdCBpbiB0aGUKLQkJICAgICBzdHJpbmcgdGFibGUuICAqLwotCQkgIGlmIChhdXhwLT54X2ZpbGUueF9uLnhfemVyb2VzID09IDAKLQkJICAgICAgJiYgYXV4cC0+eF9maWxlLnhfbi54X29mZnNldCAhPSAwKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JCSAgICAgIEJGRF9BU1NFUlQgKGF1eHAtPnhfZmlsZS54X24ueF9vZmZzZXQKLQkJCQkgID49IFNUUklOR19TSVpFX1NJWkUpOwotCQkgICAgICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCQkJewotCQkJICBzdHJpbmdzID0gX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlIChpbnB1dF9iZmQpOwotCQkJICBpZiAoc3RyaW5ncyA9PSBOVUxMKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZmlsZW5hbWUgPSBzdHJpbmdzICsgYXV4cC0+eF9maWxlLnhfbi54X29mZnNldDsKLQkJICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgZmlsZW5hbWUsCi0JCQkJCQkgaGFzaCwgY29weSk7Ci0JCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgYXV4cC0+eF9maWxlLnhfbi54X29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoaXN5bXAtPm5fc2NsYXNzICE9IENfU1RBVCB8fCBpc3ltcC0+bl90eXBlICE9IFRfTlVMTCkKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCQkgIGlmIChJU0ZDTiAoaXN5bXAtPm5fdHlwZSkKLQkJICAgICAgfHwgSVNUQUcgKGlzeW1wLT5uX3NjbGFzcykKLQkJICAgICAgfHwgaXN5bXAtPm5fc2NsYXNzID09IENfQkxPQ0sKLQkJICAgICAgfHwgaXN5bXAtPm5fc2NsYXNzID09IENfRkNOKQotCQkgICAgewotCQkgICAgICBpbmR4ID0gYXV4cC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLQkJICAgICAgaWYgKGluZHggPiAwCi0JCQkgICYmIGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCXsKLQkJCSAgLyogV2UgbG9vayBmb3J3YXJkIHRocm91Z2ggdGhlIHN5bWJvbCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHN5bWJvbCB3ZSBhcmUgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaW5jbHVkZS4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZWx5IHJpZ2h0LiAgKi8KLQkJCSAgd2hpbGUgKChmaW5mby0+c3ltX2luZGljZXNbaW5keF0gPCAwCi0JCQkJICB8fCAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XQotCQkJCSAgICAgIDwgc3ltZW50X2Jhc2UpKQotCQkJCSAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQkgICAgKytpbmR4OwotCQkJICBpZiAoaW5keCA+PSBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCSAgICBpbmR4ID0gb3V0cHV0X2luZGV4OwotCQkJICBlbHNlCi0JCQkgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJCSAgYXV4cC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA9IGluZHg7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBpbmR4ID0gYXV4cC0+eF9zeW0ueF90YWduZHgubDsKLQkJICBpZiAoaW5keCA+IDAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkgICAgewotCQkgICAgICBsb25nIHN5bWluZHg7Ci0KLQkJICAgICAgc3ltaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJICAgICAgaWYgKHN5bWluZHggPCAwKQotCQkJYXV4cC0+eF9zeW0ueF90YWduZHgubCA9IDA7Ci0JCSAgICAgIGVsc2UKLQkJCWF1eHAtPnhfc3ltLnhfdGFnbmR4LmwgPSBzeW1pbmR4OwotCQkgICAgfQotCi0JCSAgLyogVGhlIC5iZiBzeW1ib2xzIGFyZSBzdXBwb3NlZCB0byBiZSBsaW5rZWQgdGhyb3VnaAotCQkgICAgIHRoZSBlbmRuZHggZmllbGQuICBXZSBuZWVkIHRvIGNhcnJ5IHRoaXMgbGlzdAotCQkgICAgIGFjcm9zcyBvYmplY3QgZmlsZXMuICAqLwotCQkgIGlmIChpID09IDAKLQkJICAgICAgJiYgaCA9PSBOVUxMCi0JCSAgICAgICYmIGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZDTgotCQkgICAgICAmJiAoaXN5bXAtPl9uLl9uX24uX25femVyb2VzICE9IDAKLQkJCSAgfHwgaXN5bXAtPl9uLl9uX24uX25fb2Zmc2V0ID09IDApCi0JCSAgICAgICYmIGlzeW1wLT5fbi5fbl9uYW1lWzBdID09ICcuJwotCQkgICAgICAmJiBpc3ltcC0+X24uX25fbmFtZVsxXSA9PSAnYicKLQkJICAgICAgJiYgaXN5bXAtPl9uLl9uX25hbWVbMl0gPT0gJ2YnCi0JCSAgICAgICYmIGlzeW1wLT5fbi5fbl9uYW1lWzNdID09ICdcMCcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChmaW5mby0+bGFzdF9iZl9pbmRleCAhPSAtMSkKLQkJCXsKLQkJCSAgZmluZm8tPmxhc3RfYmYueF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCA9Ci0JCQkgICAgKmluZGV4cDsKLQotCQkJICBpZiAoKGJmZF9zaXplX3R5cGUpIGZpbmZvLT5sYXN0X2JmX2luZGV4Ci0JCQkgICAgICA+PSBzeW1lbnRfYmFzZSkKLQkJCSAgICB7Ci0JCQkgICAgICBQVFIgYXV4b3V0OwotCi0JCQkgICAgICAvKiBUaGUgbGFzdCAuYmYgc3ltYm9sIGlzIGluIHRoaXMgaW5wdXQKLQkJCQkgZmlsZS4gIFRoaXMgd2lsbCBvbmx5IGhhcHBlbiBpZiB0aGUKLQkJCQkgYXNzZW1ibGVyIGRpZCBub3Qgc2V0IHVwIHRoZSAuYmYKLQkJCQkgZW5kbmR4IHN5bWJvbHMgY29ycmVjdGx5LiAgKi8KLQkJCSAgICAgIGF1eG91dCA9IChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkgICAgICArICgoZmluZm8tPmxhc3RfYmZfaW5kZXgKLQkJCQkJCSAgLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAqIG9zeW1lc3opKTsKLQkJCSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2JmLAotCQkJCQkJICAgICBpc3ltcC0+bl90eXBlLAotCQkJCQkJICAgICBpc3ltcC0+bl9zY2xhc3MsCi0JCQkJCQkgICAgIDAsIGlzeW1wLT5uX251bWF1eCwKLQkJCQkJCSAgICAgYXV4b3V0KTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBXZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5iZiBhdXggZW50cnkuICBXZSBuZWVkIHRvIHdyaXRlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgYWdhaW4uICBXZSBib3Jyb3cgKm91dHN5bQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJpbHkuICBGSVhNRTogVGhpcyBjYXNlIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgbWFkZSBmYXN0ZXIuICAqLwotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLAotCQkJCQkJICAgICAoUFRSKSAmZmluZm8tPmxhc3RfYmYsCi0JCQkJCQkgICAgIGlzeW1wLT5uX3R5cGUsCi0JCQkJCQkgICAgIGlzeW1wLT5uX3NjbGFzcywKLQkJCQkJCSAgICAgMCwgaXN5bXAtPm5fbnVtYXV4LAotCQkJCQkJICAgICAoUFRSKSBvdXRzeW0pOwotCQkJICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJCQkgICAgKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJCQkJICAgICArIGZpbmZvLT5sYXN0X2JmX2luZGV4ICogb3N5bWVzeiksCi0JCQkJCSAgICBTRUVLX1NFVCkgIT0gMAotCQkJCSAgfHwgYmZkX3dyaXRlIChvdXRzeW0sIG9zeW1lc3osIDEsCi0JCQkJCQlvdXRwdXRfYmZkKSAhPSBvc3ltZXN6KQotCQkJCXJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgIT0gMCkKLQkJCWZpbmZvLT5sYXN0X2JmX2luZGV4ID0gLTE7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogVGhlIGVuZG5keCBmaWVsZCBvZiB0aGlzIGF1eCBlbnRyeSBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVwZGF0ZWQgd2l0aCB0aGUgc3ltYm9sIG51bWJlciBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCAuYmYgc3ltYm9sLiAgKi8KLQkJCSAgZmluZm8tPmxhc3RfYmYgPSAqYXV4cDsKLQkJCSAgZmluZm8tPmxhc3RfYmZfaW5kZXggPSAoKChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykKLQkJCQkJCSAgIC8gb3N5bWVzeikKLQkJCQkJCSAgKyBzeW1lbnRfYmFzZSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChoID09IE5VTEwpCi0JCXsKLQkJICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpIGF1eHAsIGlzeW1wLT5uX3R5cGUsCi0JCQkJCSBpc3ltcC0+bl9zY2xhc3MsIGksIGlzeW1wLT5uX251bWF1eCwKLQkJCQkJIChQVFIpIG91dHN5bSk7Ci0JCSAgb3V0c3ltICs9IG9zeW1lc3o7Ci0JCX0KLQotCSAgICAgIGVzeW0gKz0gaXN5bWVzejsKLQkgICAgfQotCX0KLQotICAgICAgaW5kZXhwICs9IGFkZDsKLSAgICAgIGlzeW1wICs9IGFkZDsKLSAgICAgIHN5bV9oYXNoICs9IGFkZDsKLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIGxpbmUgbnVtYmVycywgdW5sZXNzIHdlIGFyZSBzdHJpcHBpbmcgdGhlbS4gICovCi0gIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfbm9uZQotICAgICAgfHwgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUpCi0gICAgewotICAgICAgZm9yIChvID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBiZmRfdm1hIG9mZnNldDsKLQkgIGJmZF9ieXRlICplbGluZTsKLQkgIGJmZF9ieXRlICplbGluZWVuZDsKLQotCSAgLyogRklYTUU6IElmIFNFQ19IQVNfQ09OVEVOVFMgaXMgbm90IGZvciB0aGUgc2VjdGlvbiwgdGhlbgotCSAgICAgYnVpbGRfbGlua19vcmRlciBpbiBsZHdyaXRlLmMgd2lsbCBub3QgaGF2ZSBjcmVhdGVkIGEKLQkgICAgIGxpbmsgb3JkZXIsIHdoaWNoIG1lYW5zIHRoYXQgd2Ugd2lsbCBub3QgaGF2ZSBzZWVuIHRoaXMKLQkgICAgIGlucHV0IHNlY3Rpb24gaW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmssIHdoaWNoIG1lYW5zIHRoYXQKLQkgICAgIHdlIHdpbGwgbm90IGhhdmUgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgbGluZSBudW1iZXJzIG9mCi0JICAgICB0aGlzIHNlY3Rpb24uICBJIGRvbid0IHRoaW5rIGxpbmUgbnVtYmVycyBjYW4gYmUKLQkgICAgIG1lYW5pbmdmdWwgZm9yIGEgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBoYXZlCi0JICAgICBTRUNfSEFTX0NPTlRFTlRTIHNldCwgYnV0LCBpZiB0aGV5IGRvLCB0aGlzIG11c3QgYmUKLQkgICAgIGNoYW5nZWQuICAqLwotCSAgaWYgKG8tPmxpbmVub19jb3VudCA9PSAwCi0JICAgICAgfHwgKG8tPm91dHB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgby0+bGluZV9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChmaW5mby0+bGluZW5vcywgbGluZXN6LCBvLT5saW5lbm9fY291bnQsCi0JCQkgICBpbnB1dF9iZmQpICE9IGxpbmVzeiAqIG8tPmxpbmVub19jb3VudCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBvZmZzZXQgPSBvLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgby0+b3V0cHV0X29mZnNldCAtIG8tPnZtYTsKLQkgIGVsaW5lID0gZmluZm8tPmxpbmVub3M7Ci0JICBlbGluZWVuZCA9IGVsaW5lICsgbGluZXN6ICogby0+bGluZW5vX2NvdW50OwotCSAgZm9yICg7IGVsaW5lIDwgZWxpbmVlbmQ7IGVsaW5lICs9IGxpbmVzeikKLQkgICAgewotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gaWxpbmU7Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19pbiAoaW5wdXRfYmZkLCAoUFRSKSBlbGluZSwgKFBUUikgJmlsaW5lKTsKLQotCSAgICAgIGlmIChpbGluZS5sX2xubm8gIT0gMCkKLQkJaWxpbmUubF9hZGRyLmxfcGFkZHIgKz0gb2Zmc2V0OwotCSAgICAgIGVsc2UgaWYgKGlsaW5lLmxfYWRkci5sX3N5bW5keCA+PSAwCi0JCSAgICAgICAmJiAoKHVuc2lnbmVkIGxvbmcpIGlsaW5lLmxfYWRkci5sX3N5bW5keAotCQkJICAgPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkpCi0JCXsKLQkJICBsb25nIGluZHg7Ci0KLQkJICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2lsaW5lLmxfYWRkci5sX3N5bW5keF07Ci0KLQkJICBpZiAoaW5keCA8IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZXNlIGxpbmUgbnVtYmVycyBhcmUgYXR0YWNoZWQgdG8gYSBzeW1ib2wKLQkJCSB3aGljaCB3ZSBhcmUgc3RyaXBwaW5nLiAgV2Ugc2hvdWxkIHJlYWxseQotCQkJIGp1c3QgZGlzY2FyZCB0aGUgbGluZSBudW1iZXJzLCBidXQgdGhhdCB3b3VsZAotCQkJIGJlIGEgcGFpbiBiZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSBjb3VudGVkCi0JCQkgdGhlbS4gICovCi0JCSAgICAgIGluZHggPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBpczsKLQkJICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGlhOwotCi0JCSAgICAgIC8qIEZpeCB1cCB0aGUgbG5ub3B0ciBmaWVsZCBpbiB0aGUgYXV4IGVudHJ5IG9mCi0JCQkgdGhlIHN5bWJvbC4gIEl0IHR1cm5zIG91dCB0aGF0IHdlIGNhbid0IGRvCi0JCQkgdGhpcyB3aGVuIHdlIG1vZGlmeSB0aGUgc3ltYm9sIGF1eCBlbnRyaWVzLAotCQkJIGJlY2F1c2UgZ2FzIHNvbWV0aW1lcyBzY3Jld3MgdXAgdGhlIGxubm9wdHIKLQkJCSBmaWVsZCBhbmQgbWFrZXMgaXQgYW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0Ci0JCQkgb2YgdGhlIGxpbmUgbnVtYmVycyByYXRoZXIgdGhhbiBhbiBhYnNvbHV0ZQotCQkJIGZpbGUgaW5kZXguICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9pbiAob3V0cHV0X2JmZCwKLQkJCQkJICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotCQkJCQkJICAgKyAoKGluZHggLSBzeW1lbnRfYmFzZSkKLQkJCQkJCSAgICAgICogb3N5bWVzeikpLAotCQkJCQkgICAgKFBUUikgJmlzKTsKLQkJICAgICAgaWYgKChJU0ZDTiAoaXMubl90eXBlKQotCQkJICAgfHwgaXMubl9zY2xhc3MgPT0gQ19CTE9DSykKLQkJCSAgJiYgaXMubl9udW1hdXggPj0gMSkKLQkJCXsKLQkJCSAgUFRSIGF1eHB0cjsKLQotCQkJICBhdXhwdHIgPSAoUFRSKSAoZmluZm8tPm91dHN5bXMKLQkJCQkJICArICgoaW5keCAtIHN5bWVudF9iYXNlICsgMSkKLQkJCQkJICAgICAqIG9zeW1lc3opKTsKLQkJCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKG91dHB1dF9iZmQsIGF1eHB0ciwKLQkJCQkJCWlzLm5fdHlwZSwgaXMubl9zY2xhc3MsCi0JCQkJCQkwLCBpcy5uX251bWF1eCwgKFBUUikgJmlhKTsKLQkJCSAgaWEueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0KLQkJCSAgICAoby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVfZmlsZXBvcwotCQkJICAgICArIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKiBsaW5lc3oKLQkJCSAgICAgKyBlbGluZSAtIGZpbmZvLT5saW5lbm9zKTsKLQkJCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaWEsCi0JCQkJCQkgaXMubl90eXBlLCBpcy5uX3NjbGFzcywgMCwKLQkJCQkJCSBpcy5uX251bWF1eCwgYXV4cHRyKTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGlsaW5lLmxfYWRkci5sX3N5bW5keCA9IGluZHg7Ci0JCX0KLQotCSAgICAgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlsaW5lLCAoUFRSKSBlbGluZSk7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJKG8tPm91dHB1dF9zZWN0aW9uLT5saW5lX2ZpbGVwb3MKLQkJCSArIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKiBsaW5lc3opLAotCQkJU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCBiZmRfd3JpdGUgKGZpbmZvLT5saW5lbm9zLCBsaW5lc3osIG8tPmxpbmVub19jb3VudCwKLQkJCSAgICBvdXRwdXRfYmZkKSAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVub19jb3VudCArPSBvLT5saW5lbm9fY291bnQ7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBzd2FwcGVkIG91dCBhIENfRklMRSBzeW1ib2wsIGd1ZXNzIHRoYXQgdGhlIG5leHQgQ19GSUxFCi0gICAgIHN5bWJvbCB3aWxsIGJlIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG5leHQgaW5wdXQgZmlsZS4gIEluIHRoZQotICAgICBub3JtYWwgY2FzZSwgdGhpcyB3aWxsIHNhdmUgdXMgZnJvbSB3cml0aW5nIG91dCB0aGUgQ19GSUxFIHN5bWJvbAotICAgICBhZ2Fpbi4gICovCi0gIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0gICAgICAmJiAoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLSAgICB7Ci0gICAgICBmaW5mby0+bGFzdF9maWxlLm5fdmFsdWUgPSBvdXRwdXRfaW5kZXg7Ci0gICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZmaW5mby0+bGFzdF9maWxlLAotCQkJICAgICAoUFRSKSAoZmluZm8tPm91dHN5bXMKLSAJCQkJICAgICsgKChmaW5mby0+bGFzdF9maWxlX2luZGV4IC0gc3ltZW50X2Jhc2UpCi0gCQkJCSAgICAgICAqIG9zeW1lc3opKSk7Ci0gICAgfQotCi0gIC8qIFdyaXRlIHRoZSBtb2RpZmllZCBzeW1ib2xzIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChvdXRzeW0gPiBmaW5mby0+b3V0c3ltcykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICBvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpICsgc3ltZW50X2Jhc2UgKiBvc3ltZXN6LAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBvdXRzeW0gLSBmaW5mby0+b3V0c3ltcywgMSwKLQkJCW91dHB1dF9iZmQpCi0JICAgICAgIT0gKGJmZF9zaXplX3R5cGUpIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgQkZEX0FTU0VSVCAoKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkgICArIChvdXRzeW0gLSBmaW5mby0+b3V0c3ltcykgLyBvc3ltZXN6KQotCQkgID09IG91dHB1dF9pbmRleCk7Ci0KLSAgICAgIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSA9IG91dHB1dF9pbmRleDsKLSAgICB9Ci0KLSAgLyogUmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc2VjdGlvbi4gICovCi0gIGFkanVzdF9zeW1uZHggPSBjb2ZmX2JhY2tlbmRfaW5mbyAoaW5wdXRfYmZkKS0+X2JmZF9jb2ZmX2FkanVzdF9zeW1uZHg7Ci0gIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICAgc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjZGF0YTsKLQotICAgICAgaWYgKCEgby0+bGlua2VyX21hcmspCi0JewotCSAgLyogVGhpcyBzZWN0aW9uIHdhcyBvbWl0dGVkIGZyb20gdGhlIGxpbmsuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgfHwgKG8tPl9yYXdfc2l6ZSA9PSAwICYmIChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkpCi0JewotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgICAgICYmIG8tPnJlbG9jX2NvdW50ICE9IDApCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogcmVsb2NzIGluIHNlY3Rpb24gYCVzJywgYnV0IGl0IGhhcyBubyBjb250ZW50cyIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQliZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBvKSkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgc2VjZGF0YSA9IGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pOwotICAgICAgaWYgKHNlY2RhdGEgIT0gTlVMTCAmJiBzZWNkYXRhLT5jb250ZW50cyAhPSBOVUxMKQotCWNvbnRlbnRzID0gc2VjZGF0YS0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIG8sIGZpbmZvLT5jb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIG8tPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGNvbnRlbnRzID0gZmluZm8tPmNvbnRlbnRzOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICBpbnQgdGFyZ2V0X2luZGV4OwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0KLQkgIC8qIFJlYWQgaW4gdGhlIHJlbG9jcy4gICovCi0JICB0YXJnZXRfaW5kZXggPSBvLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkJICAgICAoaW5wdXRfYmZkLCBvLCBmYWxzZSwgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkJCSAgICAgIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUsCi0JCQkgICAgICAoZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZQotCQkJICAgICAgID8gKGZpbmZvLT5zZWN0aW9uX2luZm9bdGFyZ2V0X2luZGV4XS5yZWxvY3MKLQkJCQkgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KQotCQkJICAgICAgIDogZmluZm8tPmludGVybmFsX3JlbG9jcykpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBDYWxsIHByb2Nlc3NvciBzcGVjaWZpYyBjb2RlIHRvIHJlbG9jYXRlIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgY29udGVudHMuICAqLwotCSAgaWYgKCEgYmZkX2NvZmZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSAgIGlucHV0X2JmZCwgbywKLQkJCQkJICAgY29udGVudHMsCi0JCQkJCSAgIGludGVybmFsX3JlbG9jcywKLQkJCQkJICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJCSAgIGZpbmZvLT5zZWNfcHRycykpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZnNldDsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICAgICAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0KLQkgICAgICBvZmZzZXQgPSBvLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgby0+b3V0cHV0X29mZnNldCAtIG8tPnZtYTsKLQkgICAgICBpcmVsID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgcmVsX2hhc2ggPSAoZmluZm8tPnNlY3Rpb25faW5mb1t0YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMKLQkJCSAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrKQotCQl7Ci0JCSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCQkgIGJvb2xlYW4gYWRqdXN0ZWQ7Ci0KLQkJICAqcmVsX2hhc2ggPSBOVUxMOwotCi0JCSAgLyogQWRqdXN0IHRoZSByZWxvYyBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLwotCi0JCSAgaXJlbC0+cl92YWRkciArPSBvZmZzZXQ7Ci0KLQkJICBpZiAoaXJlbC0+cl9zeW1uZHggPT0gLTEpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIGlmIChhZGp1c3Rfc3ltbmR4KQotCQkgICAgewotCQkgICAgICBpZiAoISAoKmFkanVzdF9zeW1uZHgpIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJICAgICAgaW5wdXRfYmZkLCBvLCBpcmVsLAotCQkJCQkgICAgICAmYWRqdXN0ZWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBpZiAoYWRqdXN0ZWQpCi0JCQljb250aW51ZTsKLQkJICAgIH0KLQotCQkgIGggPSBvYmpfY29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2lyZWwtPnJfc3ltbmR4XTsKLQkJICBpZiAoaCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gICovCi0JCSAgICAgIGlmIChoLT5pbmR4ID49IDApCi0JCQlpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogVGhpcyBzeW1ib2wgaXMgYmVpbmcgd3JpdHRlbiBhdCB0aGUgZW5kCi0JCQkgICAgIG9mIHRoZSBmaWxlLCBhbmQgd2UgZG8gbm90IHlldCBrbm93IHRoZQotCQkJICAgICBzeW1ib2wgaW5kZXguICBXZSBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZQotCQkJICAgICBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZSByZWxfaGFzaCBsaXN0LgotCQkJICAgICBXZSBzZXQgdGhlIGluZHggZmllbGQgdG8gLTIgdG8gaW5kaWNhdGUKLQkJCSAgICAgdGhhdCB0aGlzIHN5bWJvbCBtdXN0IG5vdCBiZSBzdHJpcHBlZC4gICovCi0JCQkgICpyZWxfaGFzaCA9IGg7Ci0JCQkgIGgtPmluZHggPSAtMjsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2lyZWwtPnJfc3ltbmR4XTsKLQkJICAgICAgaWYgKGluZHggIT0gLTEpCi0JCQlpcmVsLT5yX3N5bW5keCA9IGluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXM7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCQkgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0KLQkJCSAgLyogVGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcHBpbmcuICBUaGlzIHNob3VsZCBoYXZlIGJlZW4gaGFuZGxlZAotCQkJICAgICBieSB0aGUgJ2RvbnRfc2tpcF9zeW1ib2wnIGNvZGUgaW4gdGhlIHdoaWxlCi0JCQkgICAgIGxvb3AgYXQgdGhlIHRvcCBvZiB0aGlzIGZ1bmN0aW9uLiAqLwotCQkJICAKLQkJCSAgaXMgPSBmaW5mby0+aW50ZXJuYWxfc3ltcyArIGlyZWwtPnJfc3ltbmR4OwotCi0JCQkgIG5hbWUgPSAoX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lCi0JCQkJICAoaW5wdXRfYmZkLCBpcywgYnVmKSk7Ci0JCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIGlmICghICgoKmZpbmZvLT5pbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkJIChmaW5mby0+aW5mbywgbmFtZSwgaW5wdXRfYmZkLCBvLAotCQkJCSAgaXJlbC0+cl92YWRkcikpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCi0JICAgICAgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ICs9IG8tPnJlbG9jX2NvdW50OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIG1vZGlmaWVkIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKHNlY2RhdGEgPT0gTlVMTCB8fCBzZWNkYXRhLT5zdGFiX2luZm8gPT0gTlVMTCkKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgIChvLT5fY29va2VkX3NpemUgIT0gMAotCQkJCQkgICA/IG8tPl9jb29rZWRfc2l6ZQotCQkJCQkgICA6IG8tPl9yYXdfc2l6ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLQkJIChvdXRwdXRfYmZkLCAmY29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnN0YWJfaW5mbywKLQkJICBvLCAmc2VjZGF0YS0+c3RhYl9pbmZvLCBjb250ZW50cykpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBnbG9iYWwgc3ltYm9sLiAgQ2FsbGVkIHZpYSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSBkYXRhOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaXN5bTsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLQotICBpZiAoaC0+aW5keCA+PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLCBmYWxzZSwgZmFsc2UpCi0JCSAgPT0gTlVMTCkpKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3ZhbHVlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICB7Ci0JYXNlY3Rpb24gKnNlYzsKLQotCXNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkgIGlzeW0ubl9zY251bSA9IE5fQUJTOwotCWVsc2UKLQkgIGlzeW0ubl9zY251bSA9IHNlYy0+dGFyZ2V0X2luZGV4OwotCWlzeW0ubl92YWx1ZSA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkrIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JaWYgKCEgb2JqX3BlIChmaW5mby0+b3V0cHV0X2JmZCkpCi0JICBpc3ltLm5fdmFsdWUgKz0gc2VjLT52bWE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBpc3ltLm5fc2NudW0gPSBOX1VOREVGOwotICAgICAgaXN5bS5uX3ZhbHVlID0gaC0+cm9vdC51LmMuc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogSnVzdCBpZ25vcmUgdGhlc2UuICBUaGV5IGNhbid0IGJlIGhhbmRsZWQgYW55aG93LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoc3RybGVuIChoLT5yb290LnJvb3Quc3RyaW5nKSA8PSBTWU1OTUxFTikKLSAgICBzdHJuY3B5IChpc3ltLl9uLl9uX25hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJvb2xlYW4gaGFzaDsKLSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotICAgICAgaGFzaCA9IHRydWU7Ci0gICAgICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLQloYXNoID0gZmFsc2U7Ci0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoYXNoLAotCQkJCSBmYWxzZSk7Ci0gICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JewotCSAgZmluZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaXN5bS5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgICBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0gICAgfQotCi0gIGlzeW0ubl9zY2xhc3MgPSBoLT5jbGFzczsKLSAgaXN5bS5uX3R5cGUgPSBoLT50eXBlOwotCi0gIGlmIChpc3ltLm5fc2NsYXNzID09IENfTlVMTCkKLSAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0KLSAgLyogSWYgZG9pbmcgdGFzayBsaW5raW5nIGFuZCB0aGlzIGlzIHRoZSBwYXNzIHdoZXJlIHdlIGNvbnZlcnQKLSAgICAgZGVmaW5lZCBnbG9iYWxzIHRvIHN0YXRpY3MsIHRoZW4gZG8gdGhhdCBjb252ZXJzaW9uIG5vdy4gIElmIHRoZQotICAgICBzeW1ib2wgaXMgbm90IGJlaW5nIGNvbnZlcnRlZCwganVzdCBpZ25vcmUgaXQgYW5kIGl0IHdpbGwgYmUKLSAgICAgb3V0cHV0IGR1cmluZyBhIGxhdGVyIHBhc3MuICovCi0gIGlmIChmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYykKLSAgICB7Ci0gICAgICBpZiAoaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX1dFQUtFWFQKLQkgICYmICghIG9ial9wZSAob3V0cHV0X2JmZCkgfHwgaXN5bS5uX3NjbGFzcyAhPSBDX05UX1dFQUspKQotCXsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX1NUQVQ7Ci0gICAgfQotCi0gIGlzeW0ubl9udW1hdXggPSBoLT5udW1hdXg7Ci0gIAotICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBmaW5mby0+b3V0c3ltcyk7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCShvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKSAqIHN5bWVzeiksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfd3JpdGUgKGZpbmZvLT5vdXRzeW1zLCBzeW1lc3osIDEsIG91dHB1dF9iZmQpICE9IHN5bWVzeikKLSAgICB7Ci0gICAgICBmaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaC0+aW5keCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICArK29ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgYW55IGFzc29jaWF0ZWQgYXV4IGVudHJpZXMuICBUaGVyZSBub3JtYWxseSB3aWxsIGJlCi0gICAgIG5vbmUuICBJZiB0aGVyZSBhcmUgYW55LCBJIGhhdmUgbm8gaWRlYSBob3cgdG8gbW9kaWZ5IHRoZW0uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgaXN5bS5uX251bWF1eDsgaSsrKQotICAgIHsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfYXV4X291dCAob3V0cHV0X2JmZCwgKFBUUikgKGgtPmF1eCArIGkpLCBpc3ltLm5fdHlwZSwKLQkJCSAgICAgaXN5bS5uX3NjbGFzcywgaSwgaXN5bS5uX251bWF1eCwKLQkJCSAgICAgKFBUUikgZmluZm8tPm91dHN5bXMpOwotICAgICAgaWYgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIHN5bWVzeiwgMSwgb3V0cHV0X2JmZCkgIT0gc3ltZXN6KQotCXsKLQkgIGZpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRhc2sgZ2xvYmFsIHN5bWJvbHMsIGNvbnZlcnRpbmcgdGhlbSB0byBzdGF0aWNzLiAgQ2FsbGVkCi0gICB2aWEgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UuICBDYWxscyBiZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltIHRvIGRvCi0gICB0aGUgZGlydHkgd29yaywgaWYgdGhlIHN5bWJvbCB3ZSBhcmUgcHJvY2Vzc2luZyBuZWVkcyBjb252ZXJzaW9uLiAqLwotCi1ib29sZWFuCi1fYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvID0gKHN0cnVjdCBjb2ZmX2ZpbmFsX2xpbmtfaW5mbyAqKSBkYXRhOwotICBib29sZWFuIHJ0bnZhbCA9IHRydWU7Ci0gIGJvb2xlYW4gc2F2ZV9nbG9iYWxfdG9fc3RhdGljOwotCi0gIGlmIChoLT5pbmR4IDwgMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQl7Ci0JY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICBzYXZlX2dsb2JhbF90b19zdGF0aWMgPSBmaW5mby0+Z2xvYmFsX3RvX3N0YXRpYzsKLQkgIGZpbmZvLT5nbG9iYWxfdG9fc3RhdGljID0gdHJ1ZTsKLQkgIHJ0bnZhbCA9IF9iZmRfY29mZl93cml0ZV9nbG9iYWxfc3ltIChoLCBkYXRhKTsKLQkgIGZpbmZvLT5nbG9iYWxfdG9fc3RhdGljID0gc2F2ZV9nbG9iYWxfdG9fc3RhdGljOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAocnRudmFsKTsKLX0KLQotLyogSGFuZGxlIGEgbGluayBvcmRlciB3aGljaCBpcyBzdXBwb3NlZCB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIGZpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hfcHRyOwotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgb3V0cHV0X2JmZCwKLQkJCQkgICAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChmaW5mby0+aW5mbywKLQkJICAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgID8gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkgICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24pCi0JCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAotCQkgIGhvd3RvLT5uYW1lLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCwKLQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbiwgKFBUUikgYnVmLAotCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsIHNpemUpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGlmICghIG9rKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIHJlbG9jIGluZm9ybWF0aW9uIGluIHRoZSByaWdodCBwbGFjZS4gIEl0IHdpbGwgZ2V0Ci0gICAgIHN3YXBwZWQgYW5kIHdyaXR0ZW4gb3V0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbmFsX2xpbmsgcm91dGluZS4gICovCi0KLSAgaXJlbCA9IChmaW5mby0+c2VjdGlvbl9pbmZvW291dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXhdLnJlbG9jcwotCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotICByZWxfaGFzaF9wdHIgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCi0JCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCi0gIG1lbXNldCAoaXJlbCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLSAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0KLSAgaXJlbC0+cl92YWRkciA9IG91dHB1dF9zZWN0aW9uLT52bWEgKyBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHNvbWVob3cgbG9jYXRlIGEgc3ltYm9sIGluIHRoZSByaWdodCBzZWN0aW9uLiAgVGhlCi0gICAgICAgICBzeW1ib2wgbXVzdCBlaXRoZXIgaGF2ZSBhIHZhbHVlIG9mIHplcm8sIG9yIHdlIG11c3QgYWRqdXN0Ci0gICAgICAgICB0aGUgYWRkZW5kIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgRklYTUU6IFdyaXRlIHRoaXMKLSAgICAgICAgIHdoZW4gd2UgbmVlZCBpdC4gIFRoZSBvbGQgbGlua2VyIGNvdWxkbid0IGhhbmRsZSB0aGlzIGFueWhvdy4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICAgICpyZWxfaGFzaF9wdHIgPSBOVUxMOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9ICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICBpZiAoaC0+aW5keCA+PSAwKQotCSAgICBpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIC0yIHRvIGZvcmNlIHRoaXMgc3ltYm9sIHRvIGdldAotCQkgd3JpdHRlbiBvdXQuICAqLwotCSAgICAgIGgtPmluZHggPSAtMjsKLQkgICAgICAqcmVsX2hhc2hfcHRyID0gaDsKLQkgICAgICBpcmVsLT5yX3N5bW5keCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqZmluZm8tPmluZm8tPmNhbGxiYWNrcy0+dW5hdHRhY2hlZF9yZWxvYykKLQkJIChmaW5mby0+aW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaXJlbC0+cl9zeW1uZHggPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogRklYTUU6IElzIHRoaXMgYWx3YXlzIHJpZ2h0PyAgKi8KLSAgaXJlbC0+cl90eXBlID0gaG93dG8tPnR5cGU7Ci0KLSAgLyogcl9zaXplIGlzIG9ubHkgdXNlZCBvbiB0aGUgUlMvNjAwMCwgd2hpY2ggbmVlZHMgaXRzIG93biBsaW5rZXIKLSAgICAgcm91dGluZXMgYW55aG93LiAgcl9leHRlcm4gaXMgb25seSB1c2VkIGZvciBFQ09GRi4gICovCi0KLSAgLyogRklYTUU6IFdoYXQgaXMgdGhlIHJpZ2h0IHZhbHVlIGZvciByX29mZnNldD8gIElzIHplcm8gT0s/ICAqLwotCi0gICsrb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBIGJhc2ljIHJlbG9jIGhhbmRsaW5nIHJvdXRpbmUgd2hpY2ggbWF5IGJlIHVzZWQgYnkgcHJvY2Vzc29ycyB3aXRoCi0gICBzaW1wbGUgcmVsb2NzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsb2NzLCBzeW1zLAotCQkJCSAgICBzZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW1zOwotICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxlbmQ7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWwgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgbG9uZyBzeW1uZHg7Ci0gICAgICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0KLSAgICAgIHN5bW5keCA9IHJlbC0+cl9zeW1uZHg7Ci0KLSAgICAgIGlmIChzeW1uZHggPT0gLTEpCi0JewotCSAgaCA9IE5VTEw7Ci0JICBzeW0gPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7ICAgIAotCSAgaCA9IG9ial9jb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JfQotCi0gICAgICAvKiBDT0ZGIHRyZWF0cyBjb21tb24gc3ltYm9scyBpbiBvbmUgb2YgdHdvIHdheXMuICBFaXRoZXIgdGhlCi0gICAgICAgICBzaXplIG9mIHRoZSBzeW1ib2wgaXMgaW5jbHVkZWQgaW4gdGhlIHNlY3Rpb24gY29udGVudHMsIG9yIGl0Ci0gICAgICAgICBpcyBub3QuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2l6ZSBpcyBub3QgaW5jbHVkZWQsIGFuZCBmb3JjZQotICAgICAgICAgdGhlIHJ0eXBlX3RvX2hvd3RvIGZ1bmN0aW9uIHRvIGFkanVzdCB0aGUgYWRkZW5kIGFzIG5lZWRlZC4gICovCi0KLSAgICAgIGlmIChzeW0gIT0gTlVMTCAmJiBzeW0tPm5fc2NudW0gIT0gMCkKLQlhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLSAgICAgIGVsc2UKLQlhZGRlbmQgPSAwOwotCi0KLSAgICAgIGhvd3RvID0gYmZkX2NvZmZfcnR5cGVfdG9faG93dG8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLCBoLAotCQkJCSAgICAgICBzeW0sICZhZGRlbmQpOwotICAgICAgaWYgKGhvd3RvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgZG9pbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdGhlbiB3ZSBjYW4ganVzdCBpZ25vcmUKLSAgICAgICAgIGEgUEMgcmVsYXRpdmUgcmVsb2MgdGhhdCBpcyBwY3JlbF9vZmZzZXQuICBJdCB3aWxsIGFscmVhZHkKLSAgICAgICAgIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWUuICBJZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLAotICAgICAgICAgdGhlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBzeW1ib2wgdmFsdWUuICAqLwotICAgICAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSAmJiBob3d0by0+cGNyZWxfb2Zmc2V0KQotCXsKLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIGNvbnRpbnVlOwotCSAgaWYgKHN5bSAhPSBOVUxMICYmIHN5bS0+bl9zY251bSAhPSAwKQotCSAgICBhZGRlbmQgKz0gc3ltLT5uX3ZhbHVlOwotCX0KLQotICAgICAgdmFsID0gMDsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCi0JICBpZiAoc3ltbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgICB2YWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzZWMgPSBzZWN0aW9uc1tzeW1uZHhdOwotICAgICAgICAgICAgICB2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICArIHN5bS0+bl92YWx1ZSk7Ci0JICAgICAgaWYgKCEgb2JqX3BlIChpbnB1dF9iZmQpKQotCQl2YWwgLT0gc2VjLT52bWE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICB2YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIH0KLQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGluZm8tPmJhc2VfZmlsZSkKLQl7Ci0JICAvKiBFbWl0IGEgcmVsb2MgaWYgdGhlIGJhY2tlbmQgdGhpbmtzIGl0IG5lZWRzIGl0LiAqLwotCSAgaWYgKHN5bSAmJiBwZV9kYXRhIChvdXRwdXRfYmZkKS0+aW5fcmVsb2NfcCAob3V0cHV0X2JmZCwgaG93dG8pKQotCSAgICB7Ci0JICAgICAgLyogUmVsb2NhdGlvbiB0byBhIHN5bWJvbCBpbiBhIHNlY3Rpb24gd2hpY2ggaXNuJ3QKLQkJIGFic29sdXRlLiAgV2Ugb3V0cHV0IHRoZSBhZGRyZXNzIGhlcmUgdG8gYSBmaWxlLgotCQkgVGhpcyBmaWxlIGlzIHRoZW4gcmVhZCBieSBkbGx0b29sIHdoZW4gZ2VuZXJhdGluZyB0aGUKLQkJIHJlbG9jIHNlY3Rpb24uICBOb3RlIHRoYXQgdGhlIGJhc2UgZmlsZSBpcyBub3QKLQkJIHBvcnRhYmxlIGJldHdlZW4gc3lzdGVtcy4gIFdlIHdyaXRlIG91dCBhIGxvbmcgaGVyZSwKLQkJIGFuZCBkbGx0b29sIHJlYWRzIGluIGEgbG9uZy4gICovCi0JICAgICAgbG9uZyBhZGRyID0gKHJlbC0+cl92YWRkciAKLQkJCSAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hIAotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0IAotCQkJICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgICBpZiAoY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0JCWFkZHIgLT0gcGVfZGF0YShvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQkgICAgICBpZiAoZndyaXRlICgmYWRkciwgMSwgc2l6ZW9mIChsb25nKSwgKEZJTEUgKikgaW5mby0+YmFzZV9maWxlKQotCQkgICE9IHNpemVvZiAobG9uZykpCi0JCXsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JfQotICAKLSAgICAgIHJzdGF0ID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQljb250ZW50cywKLQkJCQkJcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hLAotCQkJCQl2YWwsIGFkZGVuZCk7Ci0KLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vazoKLQkgIGJyZWFrOwotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgcmVsLT5yX3ZhZGRyLAotCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICAgIGlmIChzeW1uZHggPT0gLTEpCi0JICAgICAgbmFtZSA9ICIqQUJTKiI7Ci0JICAgIGVsc2UgaWYgKGggIT0gTlVMTCkKLQkgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoaW5wdXRfYmZkLCBzeW0sIGJ1Zik7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLCBpbnB1dF9iZmQsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KZGlmZiAtLWdpdCBhL2JmZC9jb2Zmc3dhcC5oIGIvYmZkL2NvZmZzd2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYzE4MGYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvZmZzd2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLyogR2VuZXJpYyBDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB1c2VkIHRvIHN3YXAgQ09GRiBkYXRhLiAgSXQgaXMgYSBoZWFkZXIKLSAgIGZpbGUgYmVjYXVzZSB0aGUgZGV0YWlscyBvZiBzd2FwcGluZyBkZXBlbmQgb24gdGhlIGRldGFpbHMgb2YgdGhlCi0gICBzdHJ1Y3R1cmVzIHVzZWQgYnkgZWFjaCBDT0ZGIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpcyBpbmNsdWRlZCBieQotICAgY29mZmNvZGUuaCwgYXMgd2VsbCBhcyBieSB0aGUgRUNPRkYgYmFja2VuZC4KLQotICAgQW55IGZpbGUgd2hpY2ggdXNlcyB0aGlzIG11c3QgZmlyc3QgaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIiBhbmQKLSAgICJjb2ZmL0NQVS5oIi4gIFRoZSBmdW5jdGlvbnMgd2lsbCB0aGVuIGJlIGNvcnJlY3QgZm9yIHRoYXQgQ1BVLiAgKi8KLQotI2lmbmRlZiBJTUFHRV9CQVNFCi0jZGVmaW5lIElNQUdFX0JBU0UgMAotI2VuZGlmCi0KLSNkZWZpbmUgUFVUV09SRCBiZmRfaF9wdXRfMzIKLSNkZWZpbmUgUFVUSEFMRiBiZmRfaF9wdXRfMTYKLSNkZWZpbmUJUFVUQllURSBiZmRfaF9wdXRfOAotCi0jaWZuZGVmIEdFVF9GQ05fTE5OT1BUUgotI2RlZmluZSBHRVRfRkNOX0xOTk9QVFIoYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotCi0jaWZuZGVmIEdFVF9GQ05fRU5ETkRYCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotCi0jaWZuZGVmIFBVVF9GQ05fTE5OT1BUUgotI2RlZmluZSBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgaW4sIGV4dCkgIFBVVFdPUkQoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgUFVUV09SRChhYmZkLCBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfTE5OTwotI2RlZmluZSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MTlNaX1NJWkUKLSNkZWZpbmUgR0VUX0xOU1pfU0laRShhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBQVVRfTE5TWl9MTk5PCi0jZGVmaW5lIFBVVF9MTlNaX0xOTk8oYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX1NJWkUKLSNkZWZpbmUgUFVUX0xOU1pfU0laRShhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9TQ05MRU4KLSNkZWZpbmUgR0VUX1NDTl9TQ05MRU4oYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fTlJFTE9DCi0jZGVmaW5lIEdFVF9TQ05fTlJFTE9DKGFiZmQsICBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05fTkxJTk5PCi0jZGVmaW5lIEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbmxpbm5vKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fU0NOTEVOCi0jZGVmaW5lIFBVVF9TQ05fU0NOTEVOKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX05SRUxPQwotI2RlZmluZSBQVVRfU0NOX05SRUxPQyhhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOX05MSU5OTwotI2RlZmluZSBQVVRfU0NOX05MSU5OTyhhYmZkLGluLCBleHQpICBiZmRfaF9wdXRfMTYoYWJmZCxpbiwgKGJmZF9ieXRlICAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQotI2VuZGlmCi0jaWZuZGVmIEdFVF9MSU5FTk9fTE5OTwotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2VuZGlmCi0jaWZuZGVmIFBVVF9MSU5FTk9fTE5OTwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2VuZGlmCi0KLS8qIFRoZSBmX3N5bXB0ciBmaWVsZCBpbiB0aGUgZmlsZWhkciBpcyBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9GSUxFSERSX1NZTVBUUgotI2RlZmluZSBHRVRfRklMRUhEUl9TWU1QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIFBVVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgYW91dGhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfQU9VVEhEUl9UU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9UU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9UU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9UU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9EU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9EU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9EU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9EU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9CU0laRQotI2RlZmluZSBHRVRfQU9VVEhEUl9CU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9CU0laRQotI2RlZmluZSBQVVRfQU9VVEhEUl9CU0laRSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9FTlRSWQotI2RlZmluZSBHRVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9FTlRSWQotI2RlZmluZSBQVVRfQU9VVEhEUl9FTlRSWSBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0FPVVRIRFJfVEVYVF9TVEFSVAotI2RlZmluZSBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotLyogU29tZSBmaWVsZHMgaW4gdGhlIHNjbmhkciBhcmUgc29tZXRpbWVzIDY0IGJpdHMuICAqLwotI2lmbmRlZiBHRVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIEdFVF9TQ05IRFJfUEFERFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9QQUREUgotI2RlZmluZSBQVVRfU0NOSERSX1BBRERSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9WQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1ZBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfVkFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TSVpFCi0jZGVmaW5lIEdFVF9TQ05IRFJfU0laRSBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgUFVUX1NDTkhEUl9TSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfU0NOUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfU0NOUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0NOUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfU0NOUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfUkVMUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfUkVMUFRSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfUkVMUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUkVMUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfTE5OT1BUUgotI2RlZmluZSBHRVRfU0NOSERSX0xOTk9QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIFBVVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX05SRUxPQwotI2RlZmluZSBHRVRfU0NOSERSX05SRUxPQyBiZmRfaF9nZXRfMTYKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX05SRUxPQwotI2RlZmluZSBQVVRfU0NOSERSX05SRUxPQyBiZmRfaF9wdXRfMTYKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX05MTk5PCi0jZGVmaW5lIEdFVF9TQ05IRFJfTkxOTk8gYmZkX2hfZ2V0XzE2Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9OTE5OTwotI2RlZmluZSBQVVRfU0NOSERSX05MTk5PIGJmZF9oX3B1dF8xNgotI2VuZGlmCi0jaWZuZGVmIEdFVF9TQ05IRFJfRkxBR1MKLSNkZWZpbmUgR0VUX1NDTkhEUl9GTEFHUyBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0ZMQUdTCi0jZGVmaW5lIFBVVF9TQ05IRFJfRkxBR1MgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLQotCi1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfYW91dGhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2FvdXRoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3Njbmhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3Njbmhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfZmlsZWhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2ZpbGVoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2lmbmRlZiBOT19DT0ZGX1JFTE9DUwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3JlbG9jX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfcmVsb2Nfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotI2VuZGlmIC8qIE5PX0NPRkZfUkVMT0NTICovCi0jaWZuZGVmIE5PX0NPRkZfU1lNQk9MUwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3N5bV9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3N5bV9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfYXV4X2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9hdXhfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIGludCwgaW50LCBpbnQsIGludCwgUFRSKSk7Ci0jZW5kaWYgLyogTk9fQ09GRl9TWU1CT0xTICovCi0jaWZuZGVmIE5PX0NPRkZfTElORU5PUwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2xpbmVub19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2xpbmVub19vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci0jZW5kaWYgLyogTk9fQ09GRl9MSU5FTk9TICovCi0KLSNpZm5kZWYgTk9fQ09GRl9SRUxPQ1MKLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7Ci0KLSAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7Ci0gIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF84KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlKTsKLSAgcmVsb2NfZHN0LT5yX3NpemUgPSBiZmRfaF9nZXRfOChhYmZkLCByZWxvY19zcmMtPnJfc2l6ZSk7Ci0jZWxzZQotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOwotI2VuZGlmCi0KLSNpZmRlZiBTV0FQX0lOX1JFTE9DX09GRlNFVAotICByZWxvY19kc3QtPnJfb2Zmc2V0ID0gU1dBUF9JTl9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCQkJICAgICAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX29mZnNldCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCXNyYzsKLSAgICAgUFRSCWRzdDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGJmZF9oX3B1dF84IChhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl90eXBlKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHJlbG9jX3NyYy0+cl9zaXplLCAoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX3NpemUpOwotI2Vsc2UKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIHJlbG9jX3NyYy0+cl90eXBlLCAoYmZkX2J5dGUgKikKLQkgICAgICAgcmVsb2NfZHN0LT5yX3R5cGUpOwotI2VuZGlmCi0KLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19PRkZTRVQKLSAgU1dBUF9PVVRfUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQlyZWxvY19zcmMtPnJfb2Zmc2V0LAotCQkJKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9vZmZzZXQpOwotI2VuZGlmCi0jaWZkZWYgU1dBUF9PVVRfUkVMT0NfRVhUUkEKLSAgU1dBUF9PVVRfUkVMT0NfRVhUUkEoYWJmZCxyZWxvY19zcmMsIHJlbG9jX2RzdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gUkVMU1o7Ci19Ci0KLSNlbmRpZiAvKiBOT19DT0ZGX1JFTE9DUyAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2ZpbGVoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSCSAgICAgc3JjOwotICAgICBQVFIJICAgICBkc3Q7Ci17Ci0gIEZJTEhEUiAqZmlsZWhkcl9zcmMgPSAoRklMSERSICopIHNyYzsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmZpbGVoZHJfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGRzdDsKLSNpZmRlZiBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BSRQotICBDT0ZGX0FESlVTVF9GSUxFSERSX0lOX1BSRSAoYWJmZCwgc3JjLCBkc3QpOwotI2VuZGlmCi0gIGZpbGVoZHJfZHN0LT5mX21hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9tYWdpYyk7Ci0gIGZpbGVoZHJfZHN0LT5mX25zY25zID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc2Nucyk7Ci0gIGZpbGVoZHJfZHN0LT5mX3RpbWRhdCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGltZGF0KTsKLSAgZmlsZWhkcl9kc3QtPmZfc3ltcHRyID0KLSAgICBHRVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9zeW1wdHIpOwotICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnN5bXMpOwotICBmaWxlaGRyX2RzdC0+Zl9vcHRoZHIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZmlsZWhkcl9zcmMtPiBmX29wdGhkcik7Ci0gIGZpbGVoZHJfZHN0LT5mX2ZsYWdzID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9mbGFncyk7Ci0jaWZkZWYgVElDODBfVEFSR0VUX0lECi0gIGZpbGVoZHJfZHN0LT5mX3RhcmdldF9pZCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGFyZ2V0X2lkKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09GRl9BREpVU1RfRklMRUhEUl9JTl9QT1NUCi0gIENPRkZfQURKVVNUX0ZJTEVIRFJfSU5fUE9TVCAoYWJmZCwgc3JjLCBkc3QpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyAgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKW91dDsKLQotI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BSRQotICBDT0ZGX0FESlVTVF9GSUxFSERSX09VVF9QUkUgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfdGltZGF0LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0jaWZkZWYgVElDODBfVEFSR0VUX0lECi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX3RhcmdldF9pZCwgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3RhcmdldF9pZCk7Ci0jZW5kaWYKLQotI2lmZGVmIENPRkZfQURKVVNUX0ZJTEVIRFJfT1VUX1BPU1QKLSAgQ09GRl9BREpVU1RfRklMRUhEUl9PVVRfUE9TVCAoYWJmZCwgaW4sIG91dCk7Ci0jZW5kaWYKLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotCi0jaWZuZGVmIE5PX0NPRkZfU1lNQk9MUwotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIFNZTUVOVCAqZXh0ID0gKFNZTUVOVCAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX3N5bWVudCAqKWluMTsKLQotICBpZiggZXh0LT5lLmVfbmFtZVswXSA9PSAwKSB7Ci0gICAgaW4tPl9uLl9uX24uX25femVyb2VzID0gMDsKLSAgICBpbi0+X24uX25fbi5fbl9vZmZzZXQgPSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKLSAgfQotICBlbHNlIHsKLSNpZiBTWU1OTUxFTiAhPSBFX1NZTU5NTEVOCi0gICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOwotI2Vsc2UKLSAgICBtZW1jcHkoaW4tPl9uLl9uX25hbWUsIGV4dC0+ZS5lX25hbWUsIFNZTU5NTEVOKTsKLSNlbmRpZgotICB9Ci0gIGluLT5uX3ZhbHVlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOyAKLSAgaW4tPm5fc2NudW0gPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpewotICAgIGluLT5uX3R5cGUgPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgaW4tPm5fc2NsYXNzID0gYmZkX2hfZ2V0XzgoYWJmZCwgZXh0LT5lX3NjbGFzcyk7Ci0gIGluLT5uX251bWF1eCA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9udW1hdXgpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgaW5wLCBleHRwKQotICAgICBiZmQgICAgICAgKmFiZmQ7Ci0gICAgIFBUUglpbnA7Ci0gICAgIFBUUglleHRwOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbiA9IChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopaW5wOwotICBTWU1FTlQgKmV4dCA9KFNZTUVOVCAqKWV4dHA7Ci0gIGlmKGluLT5fbi5fbl9uYW1lWzBdID09IDApIHsKLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+ZS5lLmVfemVyb2VzKTsKLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPl9uLl9uX24uX25fb2Zmc2V0LCAoYmZkX2J5dGUgKikgIGV4dC0+ZS5lLmVfb2Zmc2V0KTsKLSAgfQotICBlbHNlIHsKLSNpZiBTWU1OTUxFTiAhPSBFX1NZTU5NTEVOCi0gICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIFNZTU5NTEVOITsKLSNlbHNlCi0gICAgbWVtY3B5KGV4dC0+ZS5lX25hbWUsIGluLT5fbi5fbl9uYW1lLCBTWU1OTUxFTik7Ci0jZW5kaWYKLSAgfQotICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3ZhbHVlICwgKGJmZF9ieXRlICopIGV4dC0+ZV92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCAgaW4tPm5fc2NudW0gLCAoYmZkX2J5dGUgKikgZXh0LT5lX3NjbnVtKTsKLSAgaWYgKHNpemVvZihleHQtPmVfdHlwZSkgPT0gMikKLSAgICAgIHsKLQliZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgICAgfQotICBlbHNlCi0gICAgICB7Ci0JYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICAgIH0KLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX3NjbGFzcyAsIGV4dC0+ZV9zY2xhc3MpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fbnVtYXV4ICwgZXh0LT5lX251bWF1eCk7Ci0gIHJldHVybiBTWU1FU1o7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfYXV4X2luIChhYmZkLCBleHQxLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBpbjEpCi0gICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICAgICBQVFIgCSAgICAgIGV4dDE7Ci0gICAgIGludCAgICAgICAgICAgICB0eXBlOwotICAgICBpbnQgICAgICAgICAgICAgY2xhc3M7Ci0gICAgIGludAkgICAgICBpbmR4OwotICAgICBpbnQJICAgICAgbnVtYXV4OwotICAgICBQVFIgCSAgICAgIGluMTsKLXsKLSAgQVVYRU5UICAgICpleHQgPSAoQVVYRU5UICopZXh0MTsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICppbiA9ICh1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKilpbjE7Ci0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfSU5fUFJFCi0gIENPRkZfQURKVVNUX0FVWF9JTl9QUkUgKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSk7Ci0jZW5kaWYKLSAgc3dpdGNoIChjbGFzcykgewotICAgIGNhc2UgQ19GSUxFOgotICAgICAgaWYgKGV4dC0+eF9maWxlLnhfZm5hbWVbMF0gPT0gMCkgewotCSAgaW4tPnhfZmlsZS54X24ueF96ZXJvZXMgPSAwOwotCSAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQgPSAKLQkgICBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0JfSBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0JICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBGSUxOTUxFTiE7Ci0jZWxzZQotCSAgICBpZiAobnVtYXV4ID4gMSkKLQkgICAgICB7Ci0JCWlmIChpbmR4ID09IDApCi0JCSAgbWVtY3B5IChpbi0+eF9maWxlLnhfZm5hbWUsIGV4dC0+eF9maWxlLnhfZm5hbWUsCi0JCQkgIG51bWF1eCAqIHNpemVvZiAoQVVYRU5UKSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQltZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotCSAgICAgIH0KLSNlbmRpZgotCSAgfQotICAgICAgZ290byBlbmQ7Ci0KLSAgICAgIC8qIFJTLzYwMDAgImNzZWN0IiBhdXhlbnRzICovCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfSElERVhUOgotICAgICAgaWYgKGluZHggKyAxID09IG51bWF1eCkKLQl7Ci0JICBpbi0+eF9jc2VjdC54X3Njbmxlbi5sID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQtPnhfY3NlY3QueF9zY25sZW4pOwotCSAgaW4tPnhfY3NlY3QueF9wYXJtaGFzaCA9IGJmZF9oX2dldF8zMiAoYWJmZCwKLQkJCQkJCSBleHQtPnhfY3NlY3QueF9wYXJtaGFzaCk7Ci0JICBpbi0+eF9jc2VjdC54X3NuaGFzaCAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQtPnhfY3NlY3QueF9zbmhhc2gpOwotCSAgLyogV2UgZG9uJ3QgaGF2ZSB0byBoYWNrIGJpdGZpZWxkcyBpbiB4X3NtdHlwIGJlY2F1c2UgaXQncwotCSAgICAgZGVmaW5lZCBieSBzaGlmdHMtYW5kLWFuZHMsIHdoaWNoIGFyZSBlcXVpdmFsZW50IG9uIGFsbAotCSAgICAgYnl0ZSBvcmRlcnMuICAqLwotCSAgaW4tPnhfY3NlY3QueF9zbXR5cCAgICA9IGJmZF9oX2dldF84ICAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc210eXApOwotCSAgaW4tPnhfY3NlY3QueF9zbWNsYXMgICA9IGJmZF9oX2dldF84ICAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc21jbGFzKTsKLQkgIGluLT54X2NzZWN0Lnhfc3RhYiAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4dC0+eF9jc2VjdC54X3N0YWIpOwotCSAgaW4tPnhfY3NlY3QueF9zbnN0YWIgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgZXh0LT54X2NzZWN0Lnhfc25zdGFiKTsKLQkgIGdvdG8gZW5kOwotCX0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIENfU1RBVDoKLSNpZmRlZiBDX0xFQUZTVEFUCi0gICAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gICAgY2FzZSBDX0hJRERFTjoKLSAgICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotCSAgaW4tPnhfc2NuLnhfc2NubGVuID0gR0VUX1NDTl9TQ05MRU4oYWJmZCwgZXh0KTsKLQkgIGluLT54X3Njbi54X25yZWxvYyA9IEdFVF9TQ05fTlJFTE9DKGFiZmQsIGV4dCk7Ci0JICBpbi0+eF9zY24ueF9ubGlubm8gPSBHRVRfU0NOX05MSU5OTyhhYmZkLCBleHQpOwotCi0JICAvKiBQRSBkZWZpbmVzIHNvbWUgZXh0cmEgZmllbGRzOyB3ZSB6ZXJvIHRoZW0gb3V0IGZvcgotICAgICAgICAgICAgIHNhZmV0eS4gICovCi0JICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IDA7Ci0JICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0gMDsKLQkgIGluLT54X3Njbi54X2NvbWRhdCA9IDA7Ci0KLQkgIGdvdG8gZW5kOwotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpbi0+eF9zeW0ueF90YWduZHgubCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3RhZ25keCk7Ci0jaWZuZGVmIE5PX1RWTkRYCi0gIGluLT54X3N5bS54X3R2bmR4ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdHZuZHgpOwotI2VuZGlmCi0KLSAgaWYgKGNsYXNzID09IENfQkxPQ0sgfHwgY2xhc3MgPT0gQ19GQ04gfHwgSVNGQ04gKHR5cGUpIHx8IElTVEFHIChjbGFzcykpCi0gICAgewotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9IEdFVF9GQ05fTE5OT1BUUiAoYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sID0gR0VUX0ZDTl9FTkRORFggKGFiZmQsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTih0eXBlKSkgewotICAgIGluLT54X3N5bS54X21pc2MueF9mc2l6ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9mc2l6ZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vID0gR0VUX0xOU1pfTE5OTyhhYmZkLCBleHQpOwotICAgIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSA9IEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KTsKLSAgfQotCi1lbmQ6IDsKLSAgLyogdGhlIHNlbWljb2xvbiBpcyBiZWNhdXNlIE1TVkMgZG9lc24ndCBsaWtlIGxhYmVscyBhdAotICAgICBlbmQgb2YgYmxvY2suICovCi0KLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVAotICBDT0ZGX0FESlVTVF9BVVhfSU5fUE9TVCAoYWJmZCwgZXh0MSwgdHlwZSwgY2xhc3MsIGluZHgsIG51bWF1eCwgaW4xKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYXV4X291dCAoYWJmZCwgaW5wLCB0eXBlLCBjbGFzcywgaW5keCwgbnVtYXV4LCBleHRwKQotICAgICBiZmQgICAqYWJmZDsKLSAgICAgUFRSIAlpbnA7Ci0gICAgIGludCAgIHR5cGU7Ci0gICAgIGludCAgIGNsYXNzOwotICAgICBpbnQgICBpbmR4OwotICAgICBpbnQgICBudW1hdXg7Ci0gICAgIFBUUglleHRwOwotewotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWlucDsKLSAgQVVYRU5UICpleHQgPSAoQVVYRU5UICopZXh0cDsKLQotI2lmZGVmIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFCi0gIENPRkZfQURKVVNUX0FVWF9PVVRfUFJFIChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApOwotI2VuZGlmCi0gIG1lbXNldCgoUFRSKWV4dCwgMCwgQVVYRVNaKTsKLSAgc3dpdGNoIChjbGFzcykgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoaW4tPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIFBVVFdPUkQoYWJmZCwgMCwgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X3plcm9lcyk7Ci0gICAgICBQVVRXT1JEKGFiZmQsCi0JICAgICAgaW4tPnhfZmlsZS54X24ueF9vZmZzZXQsCi0JICAgICAgKGJmZF9ieXRlICopIGV4dC0+eF9maWxlLnhfbi54X29mZnNldCk7Ci0gICAgfQotICAgIGVsc2UgewotI2lmIEZJTE5NTEVOICE9IEVfRklMTk1MRU4KLSAgICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBGSUxOTUxFTiE7Ci0jZWxzZQotICAgICAgbWVtY3B5IChleHQtPnhfZmlsZS54X2ZuYW1lLCBpbi0+eF9maWxlLnhfZm5hbWUsIEZJTE5NTEVOKTsKLSNlbmRpZgotICAgIH0KLSAgICBnb3RvIGVuZDsKLQotI2lmZGVmIFJTNjAwMENPRkZfQwotICAvKiBSUy82MDAwICJjc2VjdCIgYXV4ZW50cyAqLwotICBjYXNlIENfRVhUOgotICBjYXNlIENfSElERVhUOgotICAgIGlmIChpbmR4ICsgMSA9PSBudW1hdXgpCi0gICAgICB7Ci0JUFVUV09SRCAoYWJmZCwgaW4tPnhfY3NlY3QueF9zY25sZW4ubCwJZXh0LT54X2NzZWN0Lnhfc2NubGVuKTsKLQlQVVRXT1JEIChhYmZkLCBpbi0+eF9jc2VjdC54X3Bhcm1oYXNoLAlleHQtPnhfY3NlY3QueF9wYXJtaGFzaCk7Ci0JUFVUSEFMRiAoYWJmZCwgaW4tPnhfY3NlY3QueF9zbmhhc2gsCWV4dC0+eF9jc2VjdC54X3NuaGFzaCk7Ci0JLyogV2UgZG9uJ3QgaGF2ZSB0byBoYWNrIGJpdGZpZWxkcyBpbiB4X3NtdHlwIGJlY2F1c2UgaXQncwotCSAgIGRlZmluZWQgYnkgc2hpZnRzLWFuZC1hbmRzLCB3aGljaCBhcmUgZXF1aXZhbGVudCBvbiBhbGwKLQkgICBieXRlIG9yZGVycy4gICovCi0JUFVUQllURSAoYWJmZCwgaW4tPnhfY3NlY3QueF9zbXR5cCwJZXh0LT54X2NzZWN0Lnhfc210eXApOwotCVBVVEJZVEUgKGFiZmQsIGluLT54X2NzZWN0Lnhfc21jbGFzLAlleHQtPnhfY3NlY3QueF9zbWNsYXMpOwotCVBVVFdPUkQgKGFiZmQsIGluLT54X2NzZWN0Lnhfc3RhYiwJZXh0LT54X2NzZWN0Lnhfc3RhYik7Ci0JUFVUSEFMRiAoYWJmZCwgaW4tPnhfY3NlY3QueF9zbnN0YWIsCWV4dC0+eF9jc2VjdC54X3Nuc3RhYik7Ci0JZ290byBlbmQ7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLQotICBjYXNlIENfU1RBVDoKLSNpZmRlZiBDX0xFQUZTVEFUCi0gIGNhc2UgQ19MRUFGU1RBVDoKLSNlbmRpZgotICBjYXNlIENfSElEREVOOgotICAgIGlmICh0eXBlID09IFRfTlVMTCkgewotICAgICAgUFVUX1NDTl9TQ05MRU4oYWJmZCwgaW4tPnhfc2NuLnhfc2NubGVuLCBleHQpOwotICAgICAgUFVUX1NDTl9OUkVMT0MoYWJmZCwgaW4tPnhfc2NuLnhfbnJlbG9jLCBleHQpOwotICAgICAgUFVUX1NDTl9OTElOTk8oYWJmZCwgaW4tPnhfc2NuLnhfbmxpbm5vLCBleHQpOwotICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0KLSAgUFVUV09SRChhYmZkLCBpbi0+eF9zeW0ueF90YWduZHgubCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90YWduZHgpOwotI2lmbmRlZiBOT19UVk5EWAotICBiZmRfaF9wdXRfMTYoYWJmZCwgaW4tPnhfc3ltLnhfdHZuZHggLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X3R2bmR4KTsKLSNlbmRpZgotCi0gIGlmIChjbGFzcyA9PSBDX0JMT0NLIHx8IGNsYXNzID09IENfRkNOIHx8IElTRkNOICh0eXBlKSB8fCBJU1RBRyAoY2xhc3MpKQotICAgIHsKLSAgICAgIFBVVF9GQ05fTE5OT1BUUihhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwgZXh0KTsKLSAgICAgIFBVVF9GQ05fRU5ETkRYKGFiZmQsICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgRElNTlVNICE9IEVfRElNTlVNCi0gI2Vycm9yIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIERJTU5VTQotI2VuZGlmCi0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzJdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSk7Ci0gICAgfQotCi0gIGlmIChJU0ZDTiAodHlwZSkpCi0gICAgUFVUV09SRCAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplLAotCSAgICAgKGJmZF9ieXRlICopICBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9MTlNaX0xOTk8gKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywgZXh0KTsKLSAgICAgIFBVVF9MTlNaX1NJWkUgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSwgZXh0KTsKLSAgICB9Ci0KLWVuZDoKLSNpZmRlZiBDT0ZGX0FESlVTVF9BVVhfT1VUX1BPU1QKLSAgQ09GRl9BREpVU1RfQVVYX09VVF9QT1NUIChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApOwotI2VuZGlmCi0gIHJldHVybiBBVVhFU1o7Ci19Ci0KLSNlbmRpZiAvKiBOT19DT0ZGX1NZTUJPTFMgKi8KLQotI2lmbmRlZiBOT19DT0ZGX0xJTkVOT1MKLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9saW5lbm9faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBMSU5FTk8gKmV4dCA9IChMSU5FTk8gKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGluZW5vICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbjE7Ci0KLSAgaW4tPmxfYWRkci5sX3N5bW5keCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5sX2FkZHIubF9zeW1uZHgpOwotICBpbi0+bF9sbm5vID0gR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9saW5lbm9fb3V0IChhYmZkLCBpbnAsIG91dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCW91dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKmluID0gKHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gKilpbnA7Ci0gIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmV4dCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vICopb3V0cDsKLSAgUFVUV09SRChhYmZkLCBpbi0+bF9hZGRyLmxfc3ltbmR4LCAoYmZkX2J5dGUgKikKLQkgIGV4dC0+bF9hZGRyLmxfc3ltbmR4KTsKLQotICBQVVRfTElORU5PX0xOTk8gKGFiZmQsIGluLT5sX2xubm8sIGV4dCk7Ci0gIHJldHVybiBMSU5FU1o7Ci19Ci0KLSNlbmRpZiAvKiBOT19DT0ZGX0xJTkVOT1MgKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBhb3V0aGRyX2V4dDEsIGFvdXRoZHJfaW50MSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBhb3V0aGRyX2V4dDE7Ci0gICAgIFBUUiBhb3V0aGRyX2ludDE7Ci17Ci0gIEFPVVRIRFIgICAgICAgICphb3V0aGRyX2V4dCA9IChBT1VUSERSICopIGFvdXRoZHJfZXh0MTsKLSAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKmFvdXRoZHJfaW50ID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopYW91dGhkcl9pbnQxOwotCi0gIGFvdXRoZHJfaW50LT5tYWdpYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm1hZ2ljKTsKLSAgYW91dGhkcl9pbnQtPnZzdGFtcCA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnZzdGFtcCk7Ci0gIGFvdXRoZHJfaW50LT50c2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfVFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dHNpemUpOwotICBhb3V0aGRyX2ludC0+ZHNpemUgPQotICAgIEdFVF9BT1VUSERSX0RTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmRzaXplKTsKLSAgYW91dGhkcl9pbnQtPmJzaXplID0KLSAgICBHRVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5ic2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5lbnRyeSA9Ci0gICAgR0VUX0FPVVRIRFJfRU5UUlkgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZW50cnkpOwotICBhb3V0aGRyX2ludC0+dGV4dF9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50ZXh0X3N0YXJ0KTsKLSAgYW91dGhkcl9pbnQtPmRhdGFfc3RhcnQgPQotICAgIEdFVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZGF0YV9zdGFydCk7Ci0KLSNpZmRlZiBJOTYwCi0gIGFvdXRoZHJfaW50LT50YWdlbnRyaWVzID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dGFnZW50cmllcyk7Ci0jZW5kaWYKLQotI2lmZGVmIEFQT0xMT19NNjgKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT5vX2lubGliLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm9faW5saWIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbnQtPm9fc3JpLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPm9fc3JpKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT52aWRbMF0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dmlkKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW50LT52aWRbMV0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dmlkICsgNCk7Ci0jZW5kaWYKLQotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGFvdXRoZHJfaW50LT5vX3RvYyA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+b190b2MpOwotICBhb3V0aGRyX2ludC0+b19zbmVudHJ5ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NuZW50cnkpOwotICBhb3V0aGRyX2ludC0+b19zbnRleHQgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc250ZXh0KTsKLSAgYW91dGhkcl9pbnQtPm9fc25kYXRhID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NuZGF0YSk7Ci0gIGFvdXRoZHJfaW50LT5vX3NudG9jID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX3NudG9jKTsKLSAgYW91dGhkcl9pbnQtPm9fc25sb2FkZXIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fc25sb2FkZXIpOwotICBhb3V0aGRyX2ludC0+b19zbmJzcyA9IGJmZF9oX2dldF8xNihhYmZkLCBhb3V0aGRyX2V4dC0+b19zbmJzcyk7Ci0gIGFvdXRoZHJfaW50LT5vX2FsZ250ZXh0ID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX2FsZ250ZXh0KTsKLSAgYW91dGhkcl9pbnQtPm9fYWxnbmRhdGEgPSBiZmRfaF9nZXRfMTYoYWJmZCwgYW91dGhkcl9leHQtPm9fYWxnbmRhdGEpOwotICBhb3V0aGRyX2ludC0+b19tb2R0eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX21vZHR5cGUpOwotICBhb3V0aGRyX2ludC0+b19jcHV0eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIGFvdXRoZHJfZXh0LT5vX2NwdXR5cGUpOwotICBhb3V0aGRyX2ludC0+b19tYXhzdGFjayA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+b19tYXhzdGFjayk7Ci0gIGFvdXRoZHJfaW50LT5vX21heGRhdGEgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPm9fbWF4ZGF0YSk7Ci0jZW5kaWYKLQotI2lmZGVmIE1JUFNFQ09GRgotICBhb3V0aGRyX2ludC0+YnNzX3N0YXJ0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ic3Nfc3RhcnQpOwotICBhb3V0aGRyX2ludC0+Z3BfdmFsdWUgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmdwX3ZhbHVlKTsKLSAgYW91dGhkcl9pbnQtPmdwcm1hc2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmdwcm1hc2spOwotICBhb3V0aGRyX2ludC0+Y3BybWFza1swXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1swXSk7Ci0gIGFvdXRoZHJfaW50LT5jcHJtYXNrWzFdID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5jcHJtYXNrWzFdKTsKLSAgYW91dGhkcl9pbnQtPmNwcm1hc2tbMl0gPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmNwcm1hc2tbMl0pOwotICBhb3V0aGRyX2ludC0+Y3BybWFza1szXSA9IGJmZF9oX2dldF8zMihhYmZkLCBhb3V0aGRyX2V4dC0+Y3BybWFza1szXSk7Ci0jZW5kaWYKLQotI2lmZGVmIEFMUEhBRUNPRkYKLSAgYW91dGhkcl9pbnQtPmJzc19zdGFydCA9IGJmZF9oX2dldF82NChhYmZkLCBhb3V0aGRyX2V4dC0+YnNzX3N0YXJ0KTsKLSAgYW91dGhkcl9pbnQtPmdwX3ZhbHVlID0gYmZkX2hfZ2V0XzY0KGFiZmQsIGFvdXRoZHJfZXh0LT5ncF92YWx1ZSk7Ci0gIGFvdXRoZHJfaW50LT5ncHJtYXNrID0gYmZkX2hfZ2V0XzMyKGFiZmQsIGFvdXRoZHJfZXh0LT5ncHJtYXNrKTsKLSAgYW91dGhkcl9pbnQtPmZwcm1hc2sgPSBiZmRfaF9nZXRfMzIoYWJmZCwgYW91dGhkcl9leHQtPmZwcm1hc2spOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9hb3V0aGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICphb3V0aGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopaW47Ci0gIEFPVVRIRFIgKmFvdXRoZHJfb3V0ID0gKEFPVVRIRFIgKilvdXQ7Ci0KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRoZHJfaW4tPm1hZ2ljLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPm1hZ2ljKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGFvdXRoZHJfaW4tPnZzdGFtcCwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT52c3RhbXApOwotICBQVVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+dHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+dHNpemUpOwotICBQVVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+ZHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZHNpemUpOwotICBQVVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+YnNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+YnNpemUpOwotICBQVVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgYW91dGhkcl9pbi0+ZW50cnksIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+ZW50cnkpOwotICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0LAotCQkJICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnRleHRfc3RhcnQpOwotICBQVVRfQU9VVEhEUl9EQVRBX1NUQVJUIChhYmZkLCBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0LAotCQkJICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmRhdGFfc3RhcnQpOwotCi0jaWZkZWYgSTk2MAotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+dGFnZW50cmllcywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT50YWdlbnRyaWVzKTsKLSNlbmRpZgotCi0jaWZkZWYgUlM2MDAwQ09GRl9DCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYW91dGhkcl9pbi0+b190b2MsIGFvdXRoZHJfb3V0LT5vX3RvYyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmVudHJ5LCBhb3V0aGRyX291dC0+b19zbmVudHJ5KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NudGV4dCwgYW91dGhkcl9vdXQtPm9fc250ZXh0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NuZGF0YSwgYW91dGhkcl9vdXQtPm9fc25kYXRhKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX3NudG9jLCBhb3V0aGRyX291dC0+b19zbnRvYyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19zbmxvYWRlciwgYW91dGhkcl9vdXQtPm9fc25sb2FkZXIpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fc25ic3MsIGFvdXRoZHJfb3V0LT5vX3NuYnNzKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBhb3V0aGRyX2luLT5vX2FsZ250ZXh0LCBhb3V0aGRyX291dC0+b19hbGdudGV4dCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19hbGduZGF0YSwgYW91dGhkcl9vdXQtPm9fYWxnbmRhdGEpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGFvdXRoZHJfaW4tPm9fbW9kdHlwZSwgYW91dGhkcl9vdXQtPm9fbW9kdHlwZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgYW91dGhkcl9pbi0+b19jcHV0eXBlLCBhb3V0aGRyX291dC0+b19jcHV0eXBlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBhb3V0aGRyX2luLT5vX21heHN0YWNrLCBhb3V0aGRyX291dC0+b19tYXhzdGFjayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgYW91dGhkcl9pbi0+b19tYXhkYXRhLCBhb3V0aGRyX291dC0+b19tYXhkYXRhKTsKLSAgbWVtc2V0IChhb3V0aGRyX291dC0+b19yZXN2MiwgMCwgc2l6ZW9mIGFvdXRoZHJfb3V0LT5vX3Jlc3YyKTsKLSNlbmRpZgotCi0jaWZkZWYgTUlQU0VDT0ZGCi0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ic3Nfc3RhcnQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+YnNzX3N0YXJ0KTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmdwX3ZhbHVlLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmdwcm1hc2ssIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Z3BybWFzayk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzBdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbMF0pOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+Y3BybWFza1sxXSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5jcHJtYXNrWzFdKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGFvdXRoZHJfaW4tPmNwcm1hc2tbMl0sIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Y3BybWFza1syXSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5jcHJtYXNrWzNdLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmNwcm1hc2tbM10pOwotI2VuZGlmCi0KLSNpZmRlZiBBTFBIQUVDT0ZGCi0gIC8qIEZJWE1FOiBXaGF0IGRvZXMgYmxkcmV2IG1lYW4/ICAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgKGJmZF92bWEpIDIsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+YmxkcmV2KTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIChiZmRfdm1hKSAwLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnBhZGRpbmcpOwotICBiZmRfaF9wdXRfNjQoYWJmZCwgYW91dGhkcl9pbi0+YnNzX3N0YXJ0LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmJzc19zdGFydCk7Ci0gIGJmZF9oX3B1dF82NChhYmZkLCBhb3V0aGRyX2luLT5ncF92YWx1ZSwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5ncF92YWx1ZSk7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBhb3V0aGRyX2luLT5ncHJtYXNrLCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPmdwcm1hc2spOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgYW91dGhkcl9pbi0+ZnBybWFzaywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5mcHJtYXNrKTsKLSNlbmRpZgotCi0gIHJldHVybiBBT1VUU1o7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jb2ZmX3N3YXBfc2NuaGRyX2luIChhYmZkLCBleHQsIGluKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSCSAgICAgZXh0OwotICAgICBQVFIJICAgICBpbjsKLXsKLSAgU0NOSERSICpzY25oZHJfZXh0ID0gKFNDTkhEUiAqKSBleHQ7Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKSBpbjsKLQotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QUkUKLSAgQ09GRl9BREpVU1RfU0NOSERSX0lOX1BSRSAoYWJmZCwgZXh0LCBpbik7Ci0jZW5kaWYKLSAgbWVtY3B5KHNjbmhkcl9pbnQtPnNfbmFtZSwgc2NuaGRyX2V4dC0+c19uYW1lLCBzaXplb2Yoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0gIHNjbmhkcl9pbnQtPnNfdmFkZHIgPQotICAgIEdFVF9TQ05IRFJfVkFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19wYWRkciA9Ci0gICAgR0VUX1NDTkhEUl9QQUREUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcGFkZHIpOwotICBzY25oZHJfaW50LT5zX3NpemUgPQotICAgIEdFVF9TQ05IRFJfU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2l6ZSk7Ci0KLSAgc2NuaGRyX2ludC0+c19zY25wdHIgPQotICAgIEdFVF9TQ05IRFJfU0NOUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19zY25wdHIpOwotICBzY25oZHJfaW50LT5zX3JlbHB0ciA9Ci0gICAgR0VUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIHNjbmhkcl9pbnQtPnNfbG5ub3B0ciA9Ci0gICAgR0VUX1NDTkhEUl9MTk5PUFRSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLSAgc2NuaGRyX2ludC0+c19mbGFncyA9Ci0gICAgR0VUX1NDTkhEUl9GTEFHUyAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfZmxhZ3MpOwotICBzY25oZHJfaW50LT5zX25yZWxvYyA9Ci0gICAgR0VUX1NDTkhEUl9OUkVMT0MgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gIHNjbmhkcl9pbnQtPnNfbmxubm8gPQotICAgIEdFVF9TQ05IRFJfTkxOTk8gKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSNpZmRlZiBJOTYwCi0gIHNjbmhkcl9pbnQtPnNfYWxpZ24gPQotICAgIEdFVF9TQ05IRFJfQUxJR04gKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2FsaWduKTsKLSNlbmRpZgotI2lmZGVmIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QT1NUCi0gIENPRkZfQURKVVNUX1NDTkhEUl9JTl9QT1NUIChhYmZkLCBleHQsIGluKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKWluOwotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopb3V0OwotICB1bnNpZ25lZCBpbnQgcmV0ID0gU0NOSFNaOwotCi0jaWZkZWYgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUKLSAgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QUkUgKGFiZmQsIGluLCBvdXQpOwotI2VuZGlmCi0gIG1lbWNweShzY25oZHJfZXh0LT5zX25hbWUsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotCi0gIFBVVF9TQ05IRFJfVkFERFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfdmFkZHIsCi0JCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0KLQotICBQVVRfU0NOSERSX1BBRERSIChhYmZkLCBzY25oZHJfaW50LT5zX3BhZGRyLAotCQkgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcGFkZHIpOwotICBQVVRfU0NOSERSX1NJWkUgKGFiZmQsIHNjbmhkcl9pbnQtPnNfc2l6ZSwKLQkJICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2l6ZSk7Ci0KLSAgUFVUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfc2NucHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7Ci0gIFBVVF9TQ05IRFJfUkVMUFRSIChhYmZkLCBzY25oZHJfaW50LT5zX3JlbHB0ciwKLQkJICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19yZWxwdHIpOwotICBQVVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfbG5ub3B0ciwKLQkJICAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbG5ub3B0cik7Ci0gIFBVVF9TQ05IRFJfRkxBR1MgKGFiZmQsIHNjbmhkcl9pbnQtPnNfZmxhZ3MsCi0JCSAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19mbGFncyk7Ci0jaWYgZGVmaW5lZChNODgpCi0gIFBVVFdPUkQoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICBQVVRXT1JEKGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotI2Vsc2UKLSAgaWYgKHNjbmhkcl9pbnQtPnNfbmxubm8gPD0gMHhmZmZmKQotICAgIFBVVEhBTEYoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciBidWZbc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpICsgMV07Ci0KLSAgICAgIG1lbWNweSAoYnVmLCBzY25oZHJfaW50LT5zX25hbWUsIHNpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSk7Ci0gICAgICBidWZbc2l6ZW9mIChzY25oZHJfaW50LT5zX25hbWUpXSA9ICdcMCc7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IHdhcm5pbmc6ICVzOiBsaW5lIG51bWJlciBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JIGJ1Ziwgc2NuaGRyX2ludC0+c19ubG5ubyk7Ci0gICAgICBQVVRIQUxGIChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLSAgICB9Ci0gIGlmIChzY25oZHJfaW50LT5zX25yZWxvYyA8PSAweGZmZmYpCi0gICAgUFVUSEFMRihhYmZkLCBzY25oZHJfaW50LT5zX25yZWxvYywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbnJlbG9jKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKSArIDFdOwotCi0gICAgICBtZW1jcHkgKGJ1Ziwgc2NuaGRyX2ludC0+c19uYW1lLCBzaXplb2YgKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICAgICAgYnVmW3NpemVvZiAoc2NuaGRyX2ludC0+c19uYW1lKV0gPSAnXDAnOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogJXM6IHJlbG9jIG92ZXJmbG93OiAweCVseCA+IDB4ZmZmZiIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCSAgICAgYnVmLCBzY25oZHJfaW50LT5zX25yZWxvYyk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgUFVUSEFMRiAoYWJmZCwgMHhmZmZmLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICAgICAgcmV0ID0gMDsKLSAgICB9Ci0jZW5kaWYKLQotI2lmZGVmIEk5NjAKLSAgUFVUX1NDTkhEUl9BTElHTiAoYWJmZCwgc2NuaGRyX2ludC0+c19hbGlnbiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfYWxpZ24pOwotI2VuZGlmCi0jaWZkZWYgQ09GRl9BREpVU1RfU0NOSERSX09VVF9QT1NUCi0gIENPRkZfQURKVVNUX1NDTkhEUl9PVVRfUE9TVCAoYWJmZCwgaW4sIG91dCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jb25maWcuYmZkIGIvYmZkL2NvbmZpZy5iZmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjk0YjUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZy5iZmQKKysrIC9kZXYvbnVsbApAQCAtMSw3NDEgKzAsMCBAQAotIyBjb25maWcuYmZkCi0jIENvbnZlcnQgYSBjYW5vbmljYWwgaG9zdCB0eXBlIGludG8gYSBCRkQgaG9zdCB0eXBlLgotIyBTZXQgc2hlbGwgdmFyaWFibGUgdGFyZyB0byBjYW5vbmljYWwgdGFyZ2V0IG5hbWUsIGFuZCBydW4KLSMgdXNpbmcgYGAuIGNvbmZpZy5iZmQnJy4KLSMgU2V0cyB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKLSMgIHRhcmdfZGVmdmVjCQlEZWZhdWx0IHZlY3RvciBmb3IgdGhpcyB0YXJnZXQKLSMgIHRhcmdfc2VsdmVjcwkJVmVjdG9ycyB0byBidWlsZCBmb3IgdGhpcyB0YXJnZXQKLSMgIHRhcmdfYXJjaHMJCUFyY2hpdGVjdHVyZXMgZm9yIHRoaXMgdGFyZ2V0Ci0jICB0YXJnX2NmbGFncwkJJChDRkxBR1MpIGZvciB0aGlzIHRhcmdldCAoRklYTUU6IHByZXR0eSBib2d1cykKLSMgIHRhcmdfdW5kZXJzY29yZQlXaGV0aGVyIHVuZGVyc2NvcmVzIGFyZSB1c2VkOiB5ZXMgb3Igbm8KLQotIyBQYXJ0IG9mIHRoaXMgZmlsZSBpcyBwcm9jZXNzZWQgYnkgdGFyZ21hdGNoLnNlZCB0byBnZW5lcmF0ZSB0aGUKLSMgdGFyZ21hdGNoLmggZmlsZS4gIFRoZSAjaWZkZWYgYW5kICNlbmRpZiBsaW5lcyB0aGF0IGFwcGVhciBiZWxvdyBhcmUKLSMgY29waWVkIGRpcmVjdGx5IGludG8gdGFyZ21hdGNoLmguCi0KLSMgVGhlIGJpbnV0aWxzIGMrK2ZpbHQgcHJvZ3JhbSB3YW50cyB0byBrbm93IHdoZXRoZXIgdW5kZXJzY29yZXMgYXJlCi0jIHN0cmlwcGVkIG9yIG5vdC4gIFRoYXQgaXMgd2h5IHdlIHNldCB0YXJnX3VuZGVyc2NvcmUuICBjKytmaWx0IHVzZXMKLSMgdGhpcyBpbmZvcm1hdGlvbiB0byBjaG9vc2UgYSBkZWZhdWx0LiAgVGhpcyBpbmZvcm1hdGlvbiBpcwotIyBkdXBsaWNhdGVkIGluIHRoZSBzeW1ib2xfbGVhZGluZ19jaGFyIGZpZWxkIG9mIHRoZSBCRkQgdGFyZ2V0Ci0jIHZlY3RvciwgYnV0IGMrK2ZpbHQgZG9lcyBub3QgZGVhbCB3aXRoIG9iamVjdCBmaWxlcyBhbmQgaXMgbm90Ci0jIGxpbmtlZCBhZ2FpbnN0IGxpYmJmZC5hLiAgSXQgaXMgbm90IHRlcnJpYmx5IGltcG9ydGFudCB0aGF0IGMrK2ZpbHQKLSMgZ2V0IHRoaXMgcmlnaHQ7IGl0IGlzIGp1c3QgY29udmVuaWVudC4KLQotdGFyZ19kZWZ2ZWM9Ci10YXJnX3NlbHZlY3M9Ci10YXJnX2NmbGFncz0KLXRhcmdfdW5kZXJzY29yZT1ubwotCi10YXJnX2NwdT1gZWNobyAkdGFyZyB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1jYXNlICIke3RhcmdfY3B1fSIgaW4KLWFscGhhKikgdGFyZ19hcmNocz1iZmRfYWxwaGFfYXJjaCA7OwotYXJtKikJdGFyZ19hcmNocz1iZmRfYXJtX2FyY2ggOzsKLXN0cm9uZ2FybSopIHRhcmdfYXJjaHM9YmZkX2FybV9hcmNoIDs7Ci10aHVtYiopCXRhcmdfYXJjaHM9YmZkX2FybV9hcmNoIDs7Ci1jMzAqKQl0YXJnX2FyY2hzPWJmZF90aWMzMF9hcmNoIDs7Ci1ocHBhKikJdGFyZ19hcmNocz1iZmRfaHBwYV9hcmNoIDs7Ci1pWzM0NTZdODYpIHRhcmdfYXJjaHM9YmZkX2kzODZfYXJjaCA7OwotbTY4KikJdGFyZ19hcmNocz1iZmRfbTY4a19hcmNoIDs7Ci1tODgqKQl0YXJnX2FyY2hzPWJmZF9tODhrX2FyY2ggOzsKLW1pcHMqKQl0YXJnX2FyY2hzPWJmZF9taXBzX2FyY2ggOzsKLXBvd2VycGMqKSB0YXJnX2FyY2hzPSJiZmRfcnM2MDAwX2FyY2ggYmZkX3Bvd2VycGNfYXJjaCIgOzsKLXJzNjAwMCkJdGFyZ19hcmNocz0iYmZkX3JzNjAwMF9hcmNoIGJmZF9wb3dlcnBjX2FyY2giIDs7Ci1zcGFyYyopIHRhcmdfYXJjaHM9YmZkX3NwYXJjX2FyY2ggOzsKLXY4NTAqKQl0YXJnX2FyY2hzPWJmZF92ODUwX2FyY2ggOzsKLXo4ayopCXRhcmdfYXJjaHM9YmZkX3o4a19hcmNoIDs7Ci0qKQl0YXJnX2FyY2hzPWJmZF8ke3RhcmdfY3B1fV9hcmNoIDs7Ci1lc2FjCi0KLQotIyBXSEVOIEFERElORyBFTlRSSUVTIFRPIFRISVMgTUFUUklYOgotIyAgTWFrZSBzdXJlIHRoYXQgdGhlIGxlZnQgc2lkZSBhbHdheXMgaGFzIHR3byBkYXNoZXMuICBPdGhlcndpc2UgeW91Ci0jICBjYW4gZ2V0IHNwdXJpb3VzIG1hdGNoZXMuICBFdmVuIGZvciB1bmFtYmlndW91cyBjYXNlcywgZG8gdGhpcyBhcyBhCi0jICBjb252ZW50aW9uLCBlbHNlIHRoZSB0YWJsZSBiZWNvbWVzIGEgcmVhbCBtZXNzIHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLgotCi1jYXNlICIke3Rhcmd9IiBpbgotIyBTVEFSVCBPRiB0YXJnbWF0Y2guaAotI2lmZGVmIEJGRDY0Ci0gIGFscGhhKi0qLW5ldGJzZCogfCBhbHBoYSotKi1mcmVlYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfYWxwaGFfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWVjb2ZmYWxwaGFfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1ubG0zMl9hbHBoYV92ZWMKLSAgICA7OwotICBhbHBoYSotKi1saW51eGVjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz1lY29mZmFscGhhX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjY0X2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLWxpbnV4LWdudSogfCBhbHBoYSotKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGY2NF9hbHBoYV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSAgYWxwaGEqLSotKnZtcyopCi0gICAgdGFyZ19kZWZ2ZWM9dm1zX2FscGhhX3ZlYwotICAgIDs7Ci0gIGFscGhhKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZhbHBoYV9saXR0bGVfdmVjCi0gICAgOzsKLSNlbmRpZiAvKiBCRkQ2NCAqLwotCi0gIGFyYy0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2xpdHRsZWFyY192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2JpZ2FyY192ZWMKLSAgICA7OwotCi0gIGFybS0qLXJpc2NpeCopCi0gICAgdGFyZ19kZWZ2ZWM9cmlzY2l4X3ZlYwotICAgIDs7Ci0gIGFybS1lcG9jLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1fZXBvY19wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1fZXBvY19wZV9saXR0bGVfdmVjIGFybV9lcG9jX3BlX2JpZ192ZWMgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPW5vCi0gICAgOzsKLSAgYXJtLSotcGUqKQotICAgIHRhcmdfZGVmdmVjPWFybXBlX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImFybXBlX2xpdHRsZV92ZWMgYXJtcGVfYmlnX3ZlYyBhcm1wZWlfbGl0dGxlX3ZlYyBhcm1wZWlfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgYXJtLSotYW91dCB8IGFybWVsLSotYW91dCkJCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9hcm1fbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1hb3V0X2FybV9iaWdfdmVjCi0gICAgOzsKLSAgYXJtZWItKi1hb3V0KQotICAgIHRhcmdfZGVmdmVjPWFvdXRfYXJtX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9YW91dF9hcm1fbGl0dGxlX3ZlYwotICAgIDs7Ci0gIGFybS0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhcm0tKi1lbGYgfCBhcm0qLSotbGludXgtZ251KQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVhcm1fdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fdmVjCi0gICAgOzsKLSAgYXJtLSotb2FiaSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMKLSAgICA7OwotCi0gIHRodW1iLSotY29mZikKLSAgICB0YXJnX2RlZnZlYz1hcm1jb2ZmX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YXJtY29mZl9iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHRodW1iLSotb2FiaSkKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMKLSAgICA7OwotICB0aHVtYi0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIHRodW1iLWVwb2MtcGUqKQotICAgIHRhcmdfZGVmdmVjPWFybV9lcG9jX3BlX2xpdHRsZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImFybV9lcG9jX3BlX2xpdHRsZV92ZWMgYXJtX2Vwb2NfcGVfYmlnX3ZlYyBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYyBhcm1fZXBvY19wZWlfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9bm8KLSAgICA7OwotICB0aHVtYi0qLXBlKikKLSAgICB0YXJnX2RlZnZlYz1hcm1wZV9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJhcm1wZV9saXR0bGVfdmVjIGFybXBlX2JpZ192ZWMgYXJtcGVpX2xpdHRsZV92ZWMgYXJtcGVpX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHN0cm9uZ2FybS0qLWVsZikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfYmlnYXJtX3ZlYwotICAgIDs7Ci0gIHN0cm9uZ2FybS0qLWNvZmYpCi0gICAgdGFyZ19kZWZ2ZWM9YXJtY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWFybWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGEyOWstKi1lYm1vbiogfCBhMjlrLSotdWRpKiB8IGEyOWstKi1jb2ZmKiB8IGEyOWstKi1zeW0xKiB8IFwKLSAgYTI5ay0qLXZ4d29ya3MqIHwgYTI5ay0qLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPWEyOWtjb2ZmX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBhMjlrLSotYW91dCogfCBhMjlrLSotYnNkKiB8IGEyOWstKi12c3RhKikKLSAgICB0YXJnX2RlZnZlYz1zdW5vc19iaWdfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgYzMwLSotKmFvdXQqIHwgdGljMzAtKi0qYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9dGljMzBfYW91dF92ZWMKLSAgICA7OwotICBjMzAtKi0qY29mZiogfCB0aWMzMC0qLSpjb2ZmKikKLSAgICB0YXJnX2RlZnZlYz10aWMzMF9jb2ZmX3ZlYwotICAgIDs7Ci0KLSAgZDEwdi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2QxMHZfdmVjCi0gICAgOzsKLQotICBkMzB2LSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfZDMwdl92ZWMKLSAgICA7OwotCi0gIGZyMzAtKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2ZyMzBfdmVjCi0gICAgOzsKLQotCi0gIGg4MzAwKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9aDgzMDBjb2ZmX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIGg4NTAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1oODUwMGNvZmZfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgaHBwYSotKi0qZWxmKiB8IGhwcGEqLSotbGl0ZXMqIHwgaHBwYSotKi1zeXN2NCogfCBocHBhKi0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaHBwYV92ZWMKLSAgICA7OwotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFNUEVJWCkKLSAgaHBwYSotKi1ic2QqKQotICAgIHRhcmdfZGVmdmVjPXNvbV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSAgaHBwYSotKi1ocHV4KiB8IGhwcGEqLSotaGl1eCogfCBocHBhKi0qLW1wZWl4KikKLSAgICB0YXJnX2RlZnZlYz1zb21fdmVjCi0gICAgOzsKLSAgaHBwYSotKi1vc2YqKQotICAgIHRhcmdfZGVmdmVjPXNvbV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9YmZkX2VsZjMyX2hwcGFfdmVjCi0gICAgOzsKLSNlbmRpZiAvKiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFCU0QpIHx8IGRlZmluZWQgKEhPU1RfSFBQQU9TRikgKi8KLQotICBpWzM0NTZdODYtKi1zY28zLjJ2NSpjb2ZmKQotICAgIHRhcmdfZGVmdmVjPWkzODZjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1zeXN2NCogfCBpWzM0NTZdODYtKi11bml4d2FyZSB8IGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKiB8IFwKLSAgaVszNDU2XTg2LSotZWxmIHwgaVszNDU2XTg2LSotc2NvMy4ydjUqIHwgXAotICBpWzM0NTZdODYtKi1kZ3V4KiB8IGlbMzQ1Nl04Ni0qLXN5c3Y1KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4NmNvZmZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotcnRlbXNlbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iaTM4NmNvZmZfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1tc2Rvc2RqZ3BwKiB8IGlbMzQ1Nl0qLSotZ28zMiogfCBpWzM0NTZdODYtZ28zMi1ydGVtcyogKQotICAgIHRhcmdfZGVmdmVjPWdvMzJjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iZ28zMnN0dWJiZWRjb2ZmX3ZlYyBpMzg2YW91dF92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc3lzdiogfCBpWzM0NTZdODYtKi1pc2MqIHwgaVszNDU2XTg2LSotc2NvKiB8IGlbMzQ1Nl04Ni0qLWNvZmYgfCBcCi0gIGlbMzQ1Nl04Ni0qLWFpeCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmNvZmZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2Ki0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2Y29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9pMzg2X3ZlYyBpMzg2YW91dF92ZWMiCi0gICAgOzsKLSBpWzM0NTZdODYtc2VxdWVudC1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWkzODZkeW5peF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotYnNkKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1mcmVlYnNkYW91dCogfCBpWzM0NTZdODYtKi1mcmVlYnNkWzEyXS4qIHwgXAotICBpWzM0NTZdODYtKi1mcmVlYnNkWzEyXSkKLSAgICB0YXJnX2RlZnZlYz1pMzg2ZnJlZWJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4NmJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZnJlZWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWkzODZjb2ZmX3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldGJzZCogfCBpWzM0NTZdODYtKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bmV0YnNkX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2YnNkX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpWzM0NTZdODYtKi1uZXR3YXJlKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im5sbTMyX2kzODZfdmVjIGkzODZjb2ZmX3ZlYyBpMzg2YW91dF92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbGludXgqYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmxpbnV4X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4NmxpbnV4X3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWx5bnhvcyopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4Nmx5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9aTM4Nmx5bnhfYW91dF92ZWMKLSAgICA7OwotICBpWzM0NTZdODYtKi1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9pMzg2X3ZlYwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1hY2gqIHwgaVszNDU2XTg2LSotb3NmMW1rKikKLSAgICB0YXJnX2RlZnZlYz1pMzg2bWFjaDNfdmVjCi0gICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW9zOWspCi0gICAgdGFyZ19kZWZ2ZWM9aTM4Nm9zOWtfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbXNkb3MqKQotICAgIHRhcmdfZGVmdmVjPWkzODZhb3V0X3ZlYwotICAgIHRhcmdfc2VsdmVjcz1pMzg2bXNkb3NfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbW9zcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2kzODZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2bXNkb3NfdmVjIGkzODZhb3V0X3ZlYyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1iZW9zcGUqKQotICAgIHRhcmdfZGVmdmVjPWkzODZwZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZwZV92ZWMgaTM4NnBlaV92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotYmVvc2VsZiogfCBpWzM0NTZdODYtKi1iZW9zKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTM4Nl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImkzODZwZV92ZWMgaTM4NnBlaV92ZWMiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbWluZ3czMiogfCBpWzM0NTZdODYtKi1jeWd3aW4qIHwgaVszNDU2XTg2LSotd2lubnQgfCBpWzM0NTZdODYtKi1wZSkKLSAgICB0YXJnX2RlZnZlYz1pMzg2cGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpMzg2cGVfdmVjIGkzODZwZWlfdmVjIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni1ub25lLSopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmNvZmZfdmVjCi0gICAgOzsKLSAgaVszNDU2XTg2LSotYW91dCogfCBpWzM0NTZdODYqLSotdnN0YSopCi0gICAgdGFyZ19kZWZ2ZWM9aTM4NmFvdXRfdmVjCi0gICAgOzsKLQotICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqIHwgaTg2MC0qLWNvZmYqKQotICAgIHRhcmdfZGVmdmVjPWk4NjBjb2ZmX3ZlYwotICAgIDs7Ci0gIGk4NjAtKi1zeXN2NCogfCBpODYwLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTg2MF92ZWMKLSAgICA7OwotCi0gIGk5NjAtKi12eHdvcmtzNCogfCBpOTYwLSotdnh3b3JrczUuMCkKLSAgICB0YXJnX2RlZnZlYz1iX291dF92ZWNfbGl0dGxlX2hvc3QKLSAgICB0YXJnX3NlbHZlY3M9ImJfb3V0X3ZlY19iaWdfaG9zdCBpY29mZl9saXR0bGVfdmVjIGljb2ZmX2JpZ192ZWMgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi12eHdvcmtzNS4qIHwgaTk2MC0qLWNvZmYqIHwgaTk2MC0qLXN5c3YqIHwgaTk2MC0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1pY29mZl9saXR0bGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJpY29mZl9iaWdfdmVjIGJfb3V0X3ZlY19saXR0bGVfaG9zdCBiX291dF92ZWNfYmlnX2hvc3QgaWVlZV92ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIGk5NjAtKi12eHdvcmtzKiB8IGk5NjAtKi1hb3V0KiB8IGk5NjAtKi1ib3V0KiB8IGk5NjAtKi1uaW5keSopCi0gICAgdGFyZ19kZWZ2ZWM9Yl9vdXRfdmVjX2xpdHRsZV9ob3N0Ci0gICAgdGFyZ19zZWx2ZWNzPSJiX291dF92ZWNfYmlnX2hvc3QgaWNvZmZfbGl0dGxlX3ZlYyBpY29mZl9iaWdfdmVjIGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBpOTYwLSotZWxmKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfaTk2MF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Imljb2ZmX2xpdHRsZV92ZWMgaWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotCi0gIG0zMnItKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tMzJyX3ZlYwotICAgIDs7Ci0KLSAgbTY4Ki1hcG9sbG8tKikKLSAgICB0YXJnX2RlZnZlYz1hcG9sbG9jb2ZmX3ZlYwotICAgIDs7Ci0gIG02OCotYnVsbC1zeXN2KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZnVuX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLW1vdG9yb2xhLXN5c3YqKQotICAgIHRhcmdfZGVmdmVjPW02OGtzeXN2Y29mZl92ZWMKLSAgICA7OwotICBtNjgqLWhwLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9aHAzMDBic2RfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1hb3V0KikKLSAgICB0YXJnX2RlZnZlYz1hb3V0MF9iaWdfdmVjCi0gICAgIyBXZSBpbmNsdWRlIGNpc2NvX2NvcmVfdmVjIGhlcmUsIHJhdGhlciB0aGFuIG1ha2luZyBhIHNlcGFyYXRlIGNpc2NvCi0gICAgIyBjb25maWd1cmF0aW9uLCBzbyB0aGF0IGNpc2NvLWNvcmUuYyBnZXRzIHJvdXRpbmVseSB0ZXN0ZWQgYXQKLSAgICAjIGxlYXN0IGZvciBjb21waWxhdGlvbi4KLSAgICB0YXJnX3NlbHZlY3M9ImNpc2NvX2NvcmVfdmVjIGllZWVfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotZWxmKiB8IG02OCotKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrY29mZl92ZWMgaWVlZV92ZWMiCi0gICAgOzsKLSAgbTY4Ki0qLXJ0ZW1zKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgaWVlZV92ZWMgYW91dDBfYmlnX3ZlYyIKLSAgICA7OwotICBtNjgqLSotY29mZiogfCBtNjgqLSotc3lzdiopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrY29mZl92ZWMgdmVyc2Fkb3NfdmVjIGllZWVfdmVjIgotICAgIDs7Ci0gIG02OCotKi1ocHV4KikKLSAgICB0YXJnX2RlZnZlYz1ocDMwMGhwdXhfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1saW51eCphb3V0KikKLSAgICB0YXJnX2RlZnZlYz1tNjhrbGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBtNjgqLSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTY4a2xpbnV4X3ZlYwotICAgIDs7Ci0gIG02OCotKi1nbnUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tNjhrX3ZlYwotICAgICMgdGFyZ19zZWx2ZWNzPW02OGttYWNoM192ZWMKLSAgICAjIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG02OCotKi1seW54b3MqKQotICAgIHRhcmdfZGVmdmVjPW02OGtseW54X2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPW02OGtseW54X2FvdXRfdmVjCi0gICAgOzsKLSAgbTY4Ki1ocCotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1tNjhrNGtuZXRic2RfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJtNjhrbmV0YnNkX3ZlYyBocDMwMGJzZF92ZWMgc3Vub3NfYmlnX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki0qLW5ldGJzZCogfCBtNjgqLSotb3BlbmJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a25ldGJzZF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGs0a25ldGJzZF92ZWMgaHAzMDBic2RfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG02OCotKi1zdW5vcyogfCBtNjgqLSotb3M2OGsqIHwgbTY4Ki0qLXZ4d29ya3MqIHwgbTY4Ki1uZXR4LSogfCBcCi0gIG02OCotKi1ic2QqIHwgbTY4Ki0qLXZzdGEqKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki1lcmljc3Nvbi0qKQotICAgIHRhcmdfZGVmdmVjPXN1bm9zX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9Im02OGtjb2ZmX3ZlYyB2ZXJzYWRvc192ZWMgdGVraGV4X3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgbTY4Ki1jYm0tKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbTY4a192ZWMKLSAgICB0YXJnX3NlbHZlY3M9bTY4a2NvZmZfdmVjCi0gICAgOzsKLSAgbTY4Ki1hcHBsZS1hdXgqKQotICAgIHRhcmdfZGVmdmVjPW02OGthdXhfY29mZl92ZWMKLSAgICA7OwotICBtNjgqLSotcHNvcyopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX202OGtfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWllZWVfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgbTg4Ki1oYXJyaXMtY3h1eCogfCBtODgqLSotZGd1eCogfCBtODgqLSotc3lzdjQqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9tODhrX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1tODhrYmNzX3ZlYwotICAgIDs7Ci0gIG04OCotKi1tYWNoMyopCi0gICAgdGFyZ19kZWZ2ZWM9bTg4a21hY2gzX3ZlYwotICAgIHRhcmdfY2ZsYWdzPS1EU1RBVF9GT1JfRVhFQwotICAgIDs7Ci0gIG04OCotKi0qKQotICAgIHRhcmdfZGVmdmVjPW04OGtiY3NfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0KLSAgbWNvcmUtKi1lbGYpCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX21jb3JlX2JpZ192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9tY29yZV9iaWdfdmVjIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjIgotICAgIDs7Ci0gIG1jb3JlLSotcGUpCi0gICAgdGFyZ19kZWZ2ZWM9bWNvcmVfcGVfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibWNvcmVfcGVfYmlnX3ZlYyBtY29yZV9wZV9saXR0bGVfdmVjIG1jb3JlX3BlaV9iaWdfdmVjIG1jb3JlX3BlaV9saXR0bGVfdmVjIgotICAgIDs7Ci0KLSAgbWlwcyotYmlnLSopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9saXR0bGVfdmVjCi0gICAgOzsKLSAgbWlwcy1kZWMtbmV0YnNkKiB8IG1pcHMqZWwqLSotbmV0YnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9iaWdtaXBzX3ZlYyBlY29mZl9saXR0bGVfdmVjIGVjb2ZmX2JpZ192ZWMiCi0gICAgOzsKLSBtaXBzKi0qLW5ldGJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgZWNvZmZfYmlnX3ZlYyBlY29mZl9saXR0bGVfdmVjIgotICAgIDs7Ci0gIG1pcHMqLWRlYy1ic2QqKQotICAgIHRhcmdfZGVmdmVjPWFvdXRfbWlwc19saXR0bGVfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG1pcHMqLWRlYy1tYWNoMyopCi0gICAgdGFyZ19kZWZ2ZWM9YW91dF9taXBzX2xpdHRsZV92ZWMKLSAgICB0YXJnX2NmbGFncz0tRFNUQVRfRk9SX0VYRUMKLSAgICA7OwotICBtaXBzKi1kZWMtKiB8IG1pcHMqZWwtKi1lY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9iaWdfdmVjCi0gICAgOzsKLSAgbWlwcyotKi1lY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9saXR0bGVfdmVjCi0gICAgOzsKLSAgbWlwcyotKi1pcml4NiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgYmZkX2VsZjY0X2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLWlyaXg1KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfYmlnbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYyBlY29mZl9iaWdfdmVjIGVjb2ZmX2xpdHRsZV92ZWMiCi0gICAgOzsKLSAgbWlwcyotc2dpLSogfCBtaXBzKi0qLWJzZCopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9saXR0bGVfdmVjCi0gICAgOzsKLSAgbWlwcyotKi1sbmV3cyopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnbGl0dGxlX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iZWNvZmZfbGl0dGxlX3ZlYyBlY29mZl9iaWdfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotbWFjaDMqKQotICAgIHRhcmdfZGVmdmVjPWFvdXRfbWlwc19saXR0bGVfdmVjCi0gICAgdGFyZ19jZmxhZ3M9LURTVEFUX0ZPUl9FWEVDCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMgZWNvZmZfYmlnX3ZlYyBlY29mZl9saXR0bGVfdmVjIgotICAgIDs7Ci0gIG1pcHMqLSotc3lzdiogfCBtaXBzKi0qLXJpc2NvcyopCi0gICAgdGFyZ19kZWZ2ZWM9ZWNvZmZfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1lY29mZl9saXR0bGVfdmVjCi0gICAgOzsKLSAgbWlwcyplbC0qLWVsZiogfCBtaXBzKmVsLSotcnRlbXMqIHwgbWlwcyplbC0qLXZ4d29ya3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2JpZ21pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1lbGYqIHwgbWlwcyotKi1ydGVtcyogfCBtaXBzKi0qLXZ4d29ya3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMiCi0gICAgOzsKLSAgbWlwcyotKi1ub25lKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMiCi0gICAgOzsKLSAgbWlwcyplbCotKi1saW51eC1nbnUqIHwgbWlwcyplbCotKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfYmlnbWlwc192ZWMgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjIGVjb2ZmX2xpdHRsZV92ZWMgZWNvZmZfYmlnX3ZlYyIKLSAgICA7OwotICBtaXBzKi0qLWxpbnV4LWdudSogfCBtaXBzKi0qLW9wZW5ic2QqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9iaWdtaXBzX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0iYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjIGJmZF9lbGY2NF9iaWdtaXBzX3ZlYyBiZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMgZWNvZmZfYmlnX3ZlYyBlY29mZl9saXR0bGVfdmVjIgotICAgIDs7Ci0KLSAgbW4xMDIwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX21uMTAyMDBfdmVjCi0gICAgOzsKLQotICBtbjEwMzAwLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfbW4xMDMwMF92ZWMKLSAgICA7OwotCi0gIG5zMzJrLXBjNTMyLW1hY2gqIHwgbnMzMmstcGM1MzItdXgqKQotICAgIHRhcmdfZGVmdmVjPXBjNTMybWFjaGFvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIG5zMzJrLSotbmV0YnNkKiB8IG5zMzJrLSotbGl0ZXMqIHwgbnMzMmstKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1wYzUzMm5ldGJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICBwb3dlcnBjLSotYWl4KiB8IHBvd2VycGMtKi1iZW9zKikKLSAgICB0YXJnX2RlZnZlYz1yczYwMDBjb2ZmX3ZlYwotICAgIDs7Ci0gIHBvd2VycGMtKi0qYnNkKiB8IHBvd2VycGMtKi1lbGYqIHwgcG93ZXJwYy0qLXN5c3Y0KiB8IHBvd2VycGMtKi1lYWJpKiB8IFwKLSAgcG93ZXJwYy0qLXNvbGFyaXMyKiB8IHBvd2VycGMtKi1saW51eC1nbnUqIHwgcG93ZXJwYy0qLXJ0ZW1zKiB8IFwKLSAgcG93ZXJwYy0qLXZ4d29ya3MqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0icnM2MDAwY29mZl92ZWMgYmZkX2VsZjMyX3Bvd2VycGNsZV92ZWMgcHBjYm9vdF92ZWMiCi0gICAgOzsKLSAgcG93ZXJwYy0qLW1hY29zKiB8IHBvd2VycGMtKi1tcHcqKQotICAgIHRhcmdfZGVmdmVjPXBtYWNfeGNvZmZfdmVjCi0gICAgOzsKLSAgcG93ZXJwYy0qLW5ldHdhcmUqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfcG93ZXJwY192ZWMgcnM2MDAwY29mZl92ZWMiCi0gICAgOzsKLSAgcG93ZXJwY2xlLSotZWxmKiB8IHBvd2VycGNsZS0qLXN5c3Y0KiB8IHBvd2VycGNsZS0qLWVhYmkqIHwgXAotICBwb3dlcnBjbGUtKi1zb2xhcmlzMiogfCBwb3dlcnBjbGUtKi1saW51eC1nbnUqIHwgcG93ZXJwY2xlLSotdnh3b3JrcyogfFwKLSAgcG93ZXJwY2xlLSotcnRlbXMqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJyczYwMDBjb2ZmX3ZlYyBiZmRfZWxmMzJfcG93ZXJwY192ZWMgcHBjYm9vdF92ZWMiCi0gICAgOzsKLQotICBwb3dlcnBjbGUtKi1wZSB8IHBvd2VycGNsZS0qLXdpbm50KiB8IHBvd2VycGNsZS0qLWN5Z3dpbiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX3Bvd2VycGNsZV9wZV92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9wb3dlcnBjbGVfcGVpX3ZlYyBiZmRfcG93ZXJwY19wZWlfdmVjIGJmZF9wb3dlcnBjbGVfcGVfdmVjIGJmZF9wb3dlcnBjX3BlX3ZlYyIKLSAgICA7OwotCi0gIHJzNjAwMC0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9cnM2MDAwY29mZl92ZWMKLSAgICA7OwotCi0gIHNoLSotZWxmKiB8IHNoLSotcnRlbXNlbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zaF92ZWMKLSAgICB0YXJnX3NlbHZlY3M9ImJmZF9lbGYzMl9zaGxfdmVjIHNoY29mZl92ZWMgc2hsY29mZl92ZWMgc2hjb2ZmX3NtYWxsX3ZlYyBzaGxjb2ZmX3NtYWxsX3ZlYyIKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc2gtKi0qIHwgc2gtKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9c2hjb2ZmX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ic2hjb2ZmX3ZlYyBzaGxjb2ZmX3ZlYyBzaGNvZmZfc21hbGxfdmVjIHNobGNvZmZfc21hbGxfdmVjIgotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gIHNwYXJjbGV0LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zcGFyY2xlX2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjODZ4LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyY2xpdGUtKi1lbGYqIHwgc3BhcmM4NngtKi1lbGYqKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl9zcGFyY192ZWMKLSAgICA7OwotICBzcGFyYy0qLWxpbnV4KmFvdXQqKQotICAgIHRhcmdfZGVmdmVjPXNwYXJjbGludXhfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0gIHNwYXJjLSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJzcGFyY2xpbnV4X3ZlYyBzdW5vc19iaWdfdmVjIgotICAgIDs7Ci0gIHNwYXJjLSotbHlueG9zKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY2x5bnhfY29mZl92ZWMKLSAgICB0YXJnX3NlbHZlY3M9c3BhcmNseW54X2FvdXRfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1uZXRic2QqIHwgc3BhcmMtKi1vcGVuYnNkKikKLSAgICB0YXJnX2RlZnZlYz1zcGFyY25ldGJzZF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSAgc3BhcmMtKi1lbGYqIHwgc3BhcmMtKi1zb2xhcmlzMiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1zdW5vc19iaWdfdmVjCi0gICAgOzsKLSAgc3BhcmMtKi1zeXN2NCopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIDs7Ci0gIHNwYXJjLSotbmV0d2FyZSopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjMyX3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz0ibmxtMzJfc3BhcmNfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSNpZmRlZiBCRkQ2NAotICBzcGFyYzY0LSotYW91dCopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotICBzcGFyYzY0LSotbGludXgtZ251KikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmNjRfc3BhcmNfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPSJiZmRfZWxmMzJfc3BhcmNfdmVjIHNwYXJjbGludXhfdmVjIHN1bm9zX2JpZ192ZWMiCi0gICAgOzsKLSAgc3BhcmM2NC0qLWVsZiopCi0gICAgdGFyZ19kZWZ2ZWM9YmZkX2VsZjY0X3NwYXJjX3ZlYwotICAgIHRhcmdfc2VsdmVjcz1iZmRfZWxmMzJfc3BhcmNfdmVjCi0gICAgOzsgICAgCi0jZW5kaWYgLyogQkZENjQgKi8KLSAgc3BhcmMqLSotY29mZiopCi0gICAgdGFyZ19kZWZ2ZWM9c3BhcmNjb2ZmX3ZlYwotICAgIDs7Ci0gIHNwYXJjKi0qLSogfCBzcGFyYyotKi1ydGVtcyopCi0gICAgdGFyZ19kZWZ2ZWM9c3Vub3NfYmlnX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0jaWYgSEFWRV9ob3N0X2FvdXRfdmVjCi0gIHRhaG9lLSotKikKLSAgICB0YXJnX2RlZnZlYz1ob3N0X2FvdXRfdmVjCi0gICAgdGFyZ191bmRlcnNjb3JlPXllcwotICAgIDs7Ci0jZW5kaWYKLQotICB0aWM4MCotKi0qKQotICAgIHRhcmdfZGVmdmVjPXRpYzgwY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotCi0gIHY4NTAtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl92ODUwX3ZlYwotICAgIDs7Ci0gIHY4NTBlLSotKikKLSAgICB0YXJnX2RlZnZlYz1iZmRfZWxmMzJfdjg1MF92ZWMKLSAgICA7OwotICB2ODUwZWEtKi0qKQotICAgIHRhcmdfZGVmdmVjPWJmZF9lbGYzMl92ODUwX3ZlYwotICAgIDs7Ci0jaWYgSEFWRV9ob3N0X2FvdXRfdmVjCi0gIHZheC0qLWJzZCogfCB2YXgtKi11bHRyaXgqKQotICAgIHRhcmdfZGVmdmVjPWhvc3RfYW91dF92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLSNlbmRpZgotCi0gIHZheCotKi0qdm1zKikKLSAgICB0YXJnX2RlZnZlYz12bXNfdmF4X3ZlYwotICAgIDs7Ci0KLSAgd2UzMmstKi0qKQotICAgIHRhcmdfZGVmdmVjPXdlMzJrY29mZl92ZWMKLSAgICA7OwotCi0gIHc2NS0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9dzY1X3ZlYwotICAgIDs7Ci0KLSAgejhrKi0qLSopCi0gICAgdGFyZ19kZWZ2ZWM9ejhrY29mZl92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICAqLSotaWVlZSopCi0gICAgdGFyZ19kZWZ2ZWM9aWVlZV92ZWMKLSAgICA7OwotCi0gICotYWRvYmUtKikKLSAgICB0YXJnX2RlZnZlYz1hX291dF9hZG9iZV92ZWMKLSAgICB0YXJnX3VuZGVyc2NvcmU9eWVzCi0gICAgOzsKLQotICAqLXNvbnktKikKLSAgICB0YXJnX2RlZnZlYz1uZXdzb3MzX3ZlYwotICAgIHRhcmdfdW5kZXJzY29yZT15ZXMKLSAgICA7OwotCi0gICotdGFuZGVtLSopCi0gICAgdGFyZ19kZWZ2ZWM9bTY4a2NvZmZfdmVjCi0gICAgdGFyZ19zZWx2ZWNzPWllZWVfdmVjCi0gICAgOzsKLSMgRU5EIE9GIHRhcmdtYXRjaC5oCi0gICopCi0gICAgZWNobyAxPiYyICIqKiogQkZEIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0ICR7dGFyZ30uIgotICAgIGVjaG8gMT4mMiAiKioqIExvb2sgaW4gYmZkL2NvbmZpZy5iZmQgZm9yIHN1cHBvcnRlZCB0YXJnZXRzLiIKLSAgICBleGl0IDEKLSAgICA7OwotZXNhYwotCi0jIElmIHdlIHN1cHBvcnQgYW55IEVMRiB0YXJnZXQsIHRoZW4gYXV0b21hdGljYWxseSBhZGQgc3VwcG9ydCBmb3IgdGhlCi0jIGdlbmVyaWMgRUxGIHRhcmdldHMuICBUaGlzIHBlcm1pdHMgYW4gb2JqZHVtcCB3aXRoIHNvbWUgRUxGIHN1cHBvcnQKLSMgdG8gYmUgdXNlZCBvbiBhbiBhcmJpdHJhcnkgRUxGIGZpbGUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4KLSMgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLWNhc2UgIiR7dGFyZ19kZWZ2ZWN9ICR7dGFyZ19zZWx2ZWNzfSIgaW4KLSAgKmJmZF9lbGY2NCopCi0gICAgdGFyZ19zZWx2ZWNzPSIke3Rhcmdfc2VsdmVjc30gYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYyBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMgYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYyIKLSAgICA7OwotICAqYmZkX2VsZjMyKikKLSAgICB0YXJnX3NlbHZlY3M9IiR7dGFyZ19zZWx2ZWNzfSBiZmRfZWxmMzJfbGl0dGxlX2dlbmVyaWNfdmVjIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMiCi0gICAgOzsKLWVzYWMKZGlmZiAtLWdpdCBhL2JmZC9jb25maWcuaW4gYi9iZmQvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmIyYzc4Li4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvdGltZS5oPiBhbmQgPHRpbWUuaD4uICAqLwotI3VuZGVmIFRJTUVfV0lUSF9TWVNfVElNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GQ05UTAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGZkb3BlbiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9GRE9QRU4KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Z2lkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVEdJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0dWlkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFVJRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1hZHZpc2UgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUFEVklTRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1wcm90ZWN0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01QUk9URUNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0aXRpbWVyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVElUSU1FUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c2NvbmYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1lTQ09ORgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRElSRU5UX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERERUZfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0RJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19GSUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL25kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Byb2Nmcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUFJPQ0ZTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1RJTUVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBtYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLQotLyogRGVmaW5lIGlmIHJlYWxsb2MgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DCi0KLS8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBEZWZpbmUgaWYgZ2V0ZW52IGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJzdGF0dXNfdC4gKi8KLSN1bmRlZiBIQVZFX1BSU1RBVFVTX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwcnN0YXR1c190LnByX3doby4gKi8KLSN1bmRlZiBIQVZFX1BSU1RBVFVTX1RfUFJfV0hPCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHN0YXR1c190LiAqLwotI3VuZGVmIEhBVkVfUFNUQVRVU19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgcHJwc2luZm9fdC4gKi8KLSN1bmRlZiBIQVZFX1BSUFNJTkZPX1QKLQotLyogRGVmaW5lIGlmIDxzeXMvcHJvY2ZzLmg+IGhhcyBwc2luZm9fdC4gKi8KLSN1bmRlZiBIQVZFX1BTSU5GT19UCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVAotCi0vKiBEZWZpbmUgaWYgPHN5cy9wcm9jZnMuaD4gaGFzIGx3cHN0YXR1c190LnByX2NvbnRleHQuICovCi0jdW5kZWYgSEFWRV9MV1BTVEFUVVNfVF9QUl9DT05URVhUCi0KLS8qIERlZmluZSBpZiA8c3lzL3Byb2Nmcy5oPiBoYXMgbHdwc3RhdHVzX3QucHJfcmVnLiAqLwotI3VuZGVmIEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHCi0KLS8qIE5hbWUgb2YgaG9zdCBzcGVjaWZpYyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIHRyYWQtY29yZS5jLiAqLwotI3VuZGVmIFRSQURfSEVBREVSCi0KLS8qIFVzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlPyAqLwotI3VuZGVmIFVTRV9NTUFQCi0KZGlmZiAtLWdpdCBhL2JmZC9jb25maWd1cmUgYi9iZmQvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4M2U5M2U2Li4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw2MzM5ICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLW1tYXAgICAgICAgICAgICAgdHJ5IHVzaW5nIG1tYXAgZm9yIEJGRCBpbnB1dCBmaWxlcyBpZiBhdmFpbGFibGUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWxpYmJmZC5jCi0KLSMgRmluZCB0aGUgc291cmNlIGZpbGVzLCBpZiBsb2NhdGlvbiB3YXMgbm90IHNwZWNpZmllZC4KLWlmIHRlc3QgLXogIiRzcmNkaXIiOyB0aGVuCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9eWVzCi0gICMgVHJ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGlzIHNjcmlwdCwgdGhlbiBpdHMgcGFyZW50LgotICBhY19wcm9nPSQwCi0gIGFjX2NvbmZkaXI9YGVjaG8gJGFjX3Byb2d8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICB0ZXN0ICJ4JGFjX2NvbmZkaXIiID0gIngkYWNfcHJvZyIgJiYgYWNfY29uZmRpcj0uCi0gIHNyY2Rpcj0kYWNfY29uZmRpcgotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgICBzcmNkaXI9Li4KLSAgZmkKLWVsc2UKLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubwotZmkKLWlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICBpZiB0ZXN0ICIkYWNfc3JjZGlyX2RlZmF1bHRlZCIgPSB5ZXM7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRhY19jb25mZGlyIG9yIC4uIiAxPiYyOyBleGl0IDE7IH0KLSAgZWxzZQotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJHNyY2RpciIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi1maQotc3JjZGlyPWBlY2hvICIke3NyY2Rpcn0iIHwgc2VkICdzJVwoW14vXVwpLyokJVwxJSdgCi0KLSMgUHJlZmVyIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCi1pZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgIENPTkZJR19TSVRFPSIkcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBlbHNlCi0gICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICBmaQotZmkKLWZvciBhY19zaXRlX2ZpbGUgaW4gJENPTkZJR19TSVRFOyBkbwotICBpZiB0ZXN0IC1yICIkYWNfc2l0ZV9maWxlIjsgdGhlbgotICAgIGVjaG8gImxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIKLSAgICAuICIkYWNfc2l0ZV9maWxlIgotICBmaQotZG9uZQotCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotYWNfZXhlZXh0PQotYWNfb2JqZXh0PW8KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLSMgRG8gc29tZSBlcnJvciBjaGVja2luZyBhbmQgZGVmYXVsdGluZyBmb3IgdGhlIGhvc3QgYW5kIHRhcmdldCB0eXBlLgotIyBUaGUgaW5wdXRzIGFyZToKLSMgICAgY29uZmlndXJlIC0taG9zdD1IT1NUIC0tdGFyZ2V0PVRBUkdFVCAtLWJ1aWxkPUJVSUxEIE5PTk9QVAotIwotIyBUaGUgcnVsZXMgYXJlOgotIyAxLiBZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHNwZWNpZnkgLS1ob3N0LCAtLXRhcmdldCwgYW5kIG5vbm9wdCBhdCB0aGUKLSMgICAgc2FtZSB0aW1lLgotIyAyLiBIb3N0IGRlZmF1bHRzIHRvIG5vbm9wdC4KLSMgMy4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaG9zdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBob3N0LAotIyAgICBhcyBkZXRlcm1pbmVkIGJ5IGNvbmZpZy5ndWVzcy4KLSMgNC4gVGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIG5vbm9wdC4KLSMgNS4gSWYgbm9ub3B0IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGFyZ2V0IGFuZCBidWlsZCBkZWZhdWx0IHRvIGhvc3QuCi0KLSMgVGhlIGFsaWFzZXMgc2F2ZSB0aGUgbmFtZXMgdGhlIHVzZXIgc3VwcGxpZWQsIHdoaWxlICRob3N0IGV0Yy4KLSMgd2lsbCBnZXQgY2Fub25pY2FsaXplZC4KLWNhc2UgJGhvc3QtLS0kdGFyZ2V0LS0tJG5vbm9wdCBpbgotTk9ORS0tLSotLS0qIHwgKi0tLU5PTkUtLS0qIHwgKi0tLSotLS1OT05FKSA7OwotKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU5ODogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTk6IGNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLXRhcmdldF9hbGlhcz0kdGFyZ2V0Ci1jYXNlICIkdGFyZ2V0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIHRhcmdldF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSB0YXJnZXRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLXRhcmdldD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdldF9hbGlhc2AKLXRhcmdldF9jcHU9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiR0YXJnZXQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYzNzogY2hlY2tpbmcgYnVpbGQgc3lzdGVtIHR5cGUiID4mNQotCi1idWlsZF9hbGlhcz0kYnVpbGQKLWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSBidWlsZF9hbGlhcz0kaG9zdF9hbGlhcyA7OwotICAqKSBidWlsZF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotYnVpbGQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRidWlsZF9hbGlhc2AKLWJ1aWxkX2NwdT1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotYnVpbGRfdmVuZG9yPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1idWlsZF9vcz1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRidWlsZCIgMT4mNgotCi10ZXN0ICIkaG9zdF9hbGlhcyIgIT0gIiR0YXJnZXRfYWxpYXMiICYmCi0gIHRlc3QgIiRwcm9ncmFtX3ByZWZpeCRwcm9ncmFtX3N1ZmZpeCRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IFwKLSAgICBOT05FTk9ORXMseCx4LCAmJgotICBwcm9ncmFtX3ByZWZpeD0ke3RhcmdldF9hbGlhc30tCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjYyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc3NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgNzg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzkxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgxNzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjgyMjogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6ODMxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1MDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg4MjogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTE1OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk2ODogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDI1OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1iZmQKLQotVkVSU0lPTj0yLjkuNAotCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0IiAxPiYyOyBleGl0IDE7IH0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBQQUNLQUdFICIkUEFDS0FHRSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBWRVJTSU9OICIkVkVSU0lPTiIKLUVPRgotCi0KLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNzE6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk3OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b21ha2UgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPTUFLRT1hdXRvbWFrZQotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPTUFLRT0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b21ha2UiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExMDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTIzOiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFyOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUj0iJEFSIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUj0iJHthY190b29sX3ByZWZpeH1hciIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiICYmIGFjX2N2X3Byb2dfQVI9ImFyIgotZmkKLWZpCi1BUj0iJGFjX2N2X3Byb2dfQVIiCi1pZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIxMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgUkFOTElCPSI6IgotZmkKLWZpCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPW5vCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxNjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzU1OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNzk6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM4MjogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MTg6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0MzQ6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDcyOiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTM1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTM5OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2Mzc6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NDY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY0OTogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjc1OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTcxMSAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTcxMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzMzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTczOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc0NTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3Njg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg2NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTY0LWJpdC1iZmQgb3IgLS1kaXNhYmxlLTY0LWJpdC1iZmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfNjRfYml0X2JmZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfNjRfYml0X2JmZCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50NjQ9ZmFsc2UKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdGFyZ2V0cyBvciAtLWRpc2FibGUtdGFyZ2V0cyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV90YXJnZXRzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV90YXJnZXRzIgotICBjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnIiAxPiYyOyBleGl0IDE7IH0KLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWMKLWZpCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY29tbW9uYmZkbGliIG9yIC0tZGlzYWJsZS1jb21tb25iZmRsaWIgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfY29tbW9uYmZkbGliK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9jb21tb25iZmRsaWIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbW1hcCBvciAtLXdpdGhvdXQtbW1hcCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfbW1hcCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9tbWFwIgotICBjYXNlICIke3dpdGh2YWx9IiBpbgotICB5ZXMpICB3YW50X21tYXA9dHJ1ZSA7OwotICBubykgICB3YW50X21tYXA9ZmFsc2UgOzsKLSAgKikgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBmb3IgQkZEIHdpdGgtbW1hcCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50X21tYXA9ZmFsc2UKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDY4OiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA5MTogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEwNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEyNDogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzNjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTU1OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotCi1ob3N0NjQ9ZmFsc2UKLXRhcmdldDY0PWZhbHNlCi0KLSMgaG9zdCBzdHVmZjoKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTk0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjI0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI3NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMwNzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjMxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM0OTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNTQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM4MjogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDE2OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0OTY6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI1MDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjAwOiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjY1NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc1OiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2ODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjg5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjcxNTogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjcyMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzQ4OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3ODM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzg4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3OTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODE2OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4MjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4ODE6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkxMTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5NjY6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTc0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5OTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAxODogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMjg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzA1NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA2MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTEwOiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI4NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyOTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMyOTY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzI2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNTQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzODM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQxMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDQ1OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDU3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ3ODogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDk4OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MTc6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUyNzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NDQ6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTcyOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MDc6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzYxMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2MTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjQ3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjgxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjg2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3MDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MzY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzcyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM4MTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODQ0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg3ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5MTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMDQ6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMzI6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwMzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA0MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLSMgUGVybWl0IGhvc3Qgc3BlY2lmaWMgc2V0dGluZ3MuCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDEyMDogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1CRkRfSE9TVF82NEJJVF9MT05HPTAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTAKLUJGRF9IT1NUXzY0X0JJVD0KLUJGRF9IT1NUX1VfNjRfQklUPQotaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgPSAieGxvbmciOyB0aGVuCi0gIEJGRF9IT1NUXzY0QklUX0xPTkc9MQotZWxpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiAhPSAieCI7IHRoZW4KLSAgQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MQotICBCRkRfSE9TVF82NF9CSVQ9JHtIT1NUXzY0QklUX1RZUEV9Ci0gIEJGRF9IT1NUX1VfNjRfQklUPSR7SE9TVF9VXzY0QklUX1RZUEV9Ci1maQotCi0KLQotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi0KLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIwMzogY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2J1aWxkX2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGFjX2NfdGVzdC5jIDw8ICdFT0YnCi1pbnQgbWFpbigpIHsKLS8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KLX0KLUVPRgotICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBhY19jX3Rlc3QgYW1fY190ZXN0LmMgMT4mNSAyPiY1Ci0gICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyBhY19jX3Rlc3QuKiB8IGdyZXAgLXYgYWNfY190ZXN0LmMgfCBzZWQgLWUgcy9hY19jX3Rlc3QvL2AKLSAgICBybSAtZiBhY19jX3Rlc3QqCi0gICAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iID0geCAmJiBiZmRfY3ZfYnVpbGRfZXhlZXh0PW5vCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9idWlsZF9leGVleHQiIDE+JjYKLSAgRVhFRVhUX0ZPUl9CVUlMRD0iIgotICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVF9GT1JfQlVJTEQ9JHtiZmRfY3ZfYnVpbGRfZXhlZXh0fQotZmkKLQotCi1mb3IgYWNfaGRyIGluIHN0ZGRlZi5oIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB0aW1lLmggdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjI4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDIzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDIzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19oZHIgaW4gZmNudGwuaCBzeXMvZmlsZS5oIHN5cy90aW1lLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjY4OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDI3MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDI3ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGltZS5oIGFuZCBzeXMvdGltZS5oIG1heSBib3RoIGJlIGluY2x1ZGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzA1OiBjaGVja2luZyB3aGV0aGVyIHRpbWUuaCBhbmQgc3lzL3RpbWUuaCBtYXkgYm90aCBiZSBpbmNsdWRlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3RpbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLWludCBtYWluKCkgewotc3RydWN0IHRtICp0cDsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzE5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3RpbWU9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl90aW1lPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl90aW1lIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfdGltZSA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKLUVPRgotCi1maQotCi1hY19oZWFkZXJfZGlyZW50PW5vCi1mb3IgYWNfaGRyIGluIGRpcmVudC5oIHN5cy9uZGlyLmggc3lzL2Rpci5oIG5kaXIuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM0NDogY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzNDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPCRhY19oZHI+Ci1pbnQgbWFpbigpIHsKLURJUiAqZGlycCA9IDA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM1NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl9kaXJlbnRfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIGFjX2hlYWRlcl9kaXJlbnQ9JGFjX2hkcjsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotIyBUd28gdmVyc2lvbnMgb2Ygb3BlbmRpciBldCBhbC4gYXJlIGluIC1sZGlyIGFuZCAtbHggb24gU0NPIFhlbml4LgotaWYgdGVzdCAkYWNfaGVhZGVyX2RpcmVudCA9IGRpcmVudC5oOyB0aGVuCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM4MjogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkaXInXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRpciAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzkwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1sZGlyIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQyMzogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8geCdfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1seCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDMxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1seCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi1mb3IgYWNfZnVuYyBpbiBmY250bCBnZXRwYWdlc2l6ZSBzZXRpdGltZXIgc3lzY29uZiBmZG9wZW4gZ2V0dWlkIGdldGdpZAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQ2NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NDk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNFX0JJTkFSWV9GT1BFTiAxCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTMwOiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDUzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTU2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDU3NzogY2hlY2tpbmcgd2hldGhlciBtYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1ODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgbWFsbG9jCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDYwMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9tYWxsb2M9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYyIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX21hbGxvYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgcmVhbGxvYyBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjI0OiBjaGVja2luZyB3aGV0aGVyIHJlYWxsb2MgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHJlYWxsb2MKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjUwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2M9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3JlYWxsb2M9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9yZWFsbG9jIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfcmVhbGxvYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9SRUFMTE9DIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY3MTogY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9mcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY3NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBmcmVlCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDY5NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZSIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRlJFRSAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDcxODogY2hlY2tpbmcgd2hldGhlciBnZXRlbnYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3MjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZ2V0ZW52Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDc0NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYgMQotRU9GCi0KLWZpCi0KLQotIyBJZiB3ZSBhcmUgY29uZmlndXJlZCBuYXRpdmUsIHBpY2sgYSBjb3JlIGZpbGUgc3VwcG9ydCBmaWxlLgotQ09SRUZJTEU9Ci1DT1JFRkxBRz0KLVRSQURfSEVBREVSPQotaWYgdGVzdCAiJHt0YXJnZXR9IiA9ICIke2hvc3R9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICBhbHBoYSotKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvYWxwaGFsaW51eC5oIicKLQk7OwotICBhbHBoYSotKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBhbHBoYSotKi0qKQkJQ09SRUZJTEU9b3NmLWNvcmUubG8gOzsKLSAgYXJtLSotcmlzY2l4KQkJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLWhpdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgaHBwYSotKi1tcGVpeCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLWJzZCopCQlDT1JFRklMRT0iaHB1eC1jb3JlLmxvIGhwcGFic2QtY29yZS5sbyIKLQkJCUNPUkVGTEFHPSItREhQVVhfQ09SRSAtREhQUEFCU0RfQ09SRSIgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG87Ci0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotICBpWzM0NTZdODYtc2VxdWVudC1zeXN2NCopIDs7Ci0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvc3ltbWV0cnkuaCInCi0JOzsKLSAgaVszNDU2XTg2LSotYnNkKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NmJzZC5oIicKLQk7OwotICBpWzM0NTZdODYtKi1uZXRic2QqIHwgaVszNDU2XTg2LSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBpWzM0NTZdODYtZXNpeC1zeXN2MyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9lc2l4LmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLQlDT1JFRklMRT1zY281LWNvcmUubG8KLQk7OwotICBpWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2kzODZzY28uaCInCi0JOzsKLSAgaVszNDU2XTg2LSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4Nm1hY2gzLmgiJwotCTs7Ci0gIGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bGludXguaCInCi0JOzsKLSAgaVszNDU2XTg2LSotaXNjKikJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7Ci0gIGlbMzQ1Nl04Ni0qLWFpeCopCUNPUkVGSUxFPWFpeDM4Ni1jb3JlLmxvIDs7Ci0gIGk4NjAtKi1tYWNoMyogfCBpODYwLSotb3NmMSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pODYwbWFjaDMuaCInCi0JOzsKLSAgbWlwcy1kZWMtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNic2QuaCInCi0JOzsKLSAgbWlwcy1kZWMtbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJwotCTs7Ci0gIG1pcHMtKi1uZXRic2QqIHwgbWlwcyotKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIG1pcHMtZGVjLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kZWNzdGF0aW9uLmgiJwotCTs7Ci0gIG1pcHMtc2dpLWlyaXg0KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtc2dpLWlyaXg1KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtc2dpLWlyaXg2KikJQ09SRUZJTEU9aXJpeC1jb3JlLmxvIDs7Ci0gIG1pcHMtKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzbWFjaDMuaCInCi0JOzsKLSAgbWlwcy0qLXN5c3Y0KikJOzsKLSAgbWlwcy0qLXN5c3YqIHwgbWlwcy0qLXJpc2NvcyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9yaXNjb3MuaCInCi0JOzsKLSAgbWlwcy1zb255LWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9uZXdzLW1pcHMuaCInCi0JOzsKLSAgbTY4Ki1idWxsKi1zeXN2KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2RweDIuaCInCi0JOzsKLSAgbTY4Ki1ocC1ocHV4KikJQ09SRUZJTEU9aHB1eC1jb3JlLmxvIDs7Ci0gIG02OCotaHAtYnNkKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2hwMzAwYnNkLmgiJwotCTs7Ci0gIG02OCotKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbTY4a2xpbnV4LmgiJwotCTs7Ci0gIG02OCotbW90b3JvbGEtc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kZWx0YTY4LmgiJwotCTs7Ci0gIG02OCotc29ueS0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy5oIicKLQk7OwotICBtNjgqLSotbmV0YnNkKiB8IG02OCotKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIG02OCotYXBwbGUtYXV4KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL202OGthdXguaCInCi0JOzsKLSAgbTg4Ki0qLXN5c3Y0KikJOzsKLSAgbTg4Ki1tb3Rvcm9sYS1zeXN2KikJQ09SRUZJTEU9cHRyYWNlLWNvcmUubG8gOzsKLSAgbTg4Ki0qLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL204OGttYWNoMy5oIicKLQk7OwotICBuczMyay1wYzUzMi1tYWNoKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvcGM1MzJtYWNoLmgiJwotCTs7Ci0gIG5zMzJrLSotbmV0YnNkKiB8IG5zMzJrLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICByczYwMDAtKi1seW54KikJQ09SRUZJTEU9bHlueC1jb3JlLmxvIDs7Ci0gIHJzNjAwMC0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICByczYwMDAtKi0qKQkJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLSpic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4NCopCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi1haXgqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYmVvcyopCTs7Ci0gIHBvd2VycGMtKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBzcGFyYy0qLW5ldGJzZCogfCBzcGFyYy0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgdGFob2UtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdGFob2UuaCInCi0JOzsKLSAgdmF4LSotdWx0cml4MiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXh1bHQyLmgiJwotCTs7Ci0gIHZheC0qLSopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy92YXhic2QuaCInCi0JOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRDT1JFRklMRSIgaW4KLSAgYWl4Mzg2LWNvcmUubG8pCUNPUkVGTEFHPS1EQUlYMzg2X0NPUkUgOzsKLSAgaHBwYWJzZC1jb3JlLmxvKQlDT1JFRkxBRz0tREhQUEFCU0RfQ09SRSA7OwotICBocHV4LWNvcmUubG8pCQlDT1JFRkxBRz0tREhQVVhfQ09SRSA7OwotICBpcml4LWNvcmUubG8pCQlDT1JFRkxBRz0tRElSSVhfQ09SRSA7OwotICBseW54LWNvcmUubG8pCQlDT1JFRkxBRz0tRExZTlhfQ09SRSA7OwotICBuZXRic2QtY29yZS5sbykJQ09SRUZMQUc9LURORVRCU0RfQ09SRSA7OwotICBvc2YtY29yZS5sbykJCUNPUkVGTEFHPS1ET1NGX0NPUkUgOzsKLSAgcHRyYWNlLWNvcmUubG8pCUNPUkVGTEFHPS1EUFRSQUNFX0NPUkUgOzsKLSAgcnM2MDAwLWNvcmUubG8pCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURBSVhfQ09SRSIgOzsKLSAgc2NvNS1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFNDTzVfQ09SRSIgOzsKLSAgdHJhZC1jb3JlLmxvKQkJQ09SRUZMQUc9IiRDT1JFRkxBRyAtRFRSQURfQ09SRSIgOzsKLSAgZXNhYwotCi0gICMgRUxGIGNvcmVmaWxlIHN1cHBvcnQgaGFzIHNldmVyYWwgZmxhdm9ycywgYnV0IGFsbCBvZgotICAjIHRoZW0gdXNlIHNvbWV0aGluZyBjYWxsZWQgPHN5cy9wcm9jZnMuaD4KLSAgZm9yIGFjX2hkciBpbiBzeXMvcHJvY2ZzLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTQ1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDk1MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk1NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9zeXNfcHJvY2ZzX2giID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHByc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTgzOiBjaGVja2luZyBmb3IgcHJzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5ODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHJzdGF0dXNfdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDk5NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnN0YXR1c190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJzdGF0dXNfdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BSU1RBVFVTX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3Byc3RhdHVzX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwcnN0YXR1c190LnByX3dobyBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwMTc6IGNoZWNraW5nIGZvciBwcnN0YXR1c190LnByX3dobyBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTAyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wcnN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX3dobwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMjk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvPW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QUlNUQVRVU19UX1BSX1dITyAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX3Byc3RhdHVzX3RfcHJfd2hvIiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcHN0YXR1c190IGluIHN5cy9wcm9jZnMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTA1MTogY2hlY2tpbmcgZm9yIHBzdGF0dXNfdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTA1NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1wc3RhdHVzX3QgYXZhcgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwNjM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHN0YXR1c190ID0geWVzOyB0aGVuCi0gICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9QU1RBVFVTX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzdGF0dXNfdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHBycHNpbmZvX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDg1OiBjaGVja2luZyBmb3IgcHJwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUwOTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy9wcm9jZnMuaD4KLWludCBtYWluKCkgewotcHJwc2luZm9fdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA5NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wcnBzaW5mb190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHJwc2luZm9fdD1ubwotICAgCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi0gaWYgdGVzdCAkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1BSUFNJTkZPX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BycHNpbmZvX3QiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxMTk6IGNoZWNraW5nIGZvciBwc2luZm9fdCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTI0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLXBzaW5mb190IGF2YXIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTMxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfcHNpbmZvX3Q9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9wc2luZm9fdCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfUFNJTkZPX1QgMQotRU9GCi0KLSBmaQotIGVjaG8gIiRhY190IiIkYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX3BzaW5mb190IiAxPiY2Ci0KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTUzOiBjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QgaW4gc3lzL3Byb2Nmcy5oIiA+JjUKLSBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTE1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1sd3BzdGF0dXNfdCBhdmFyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE2NTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX2x3cHN0YXR1c190PW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbHdwc3RhdHVzX3QgPSB5ZXM7IHRoZW4KLSAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xXUFNUQVRVU19UIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9sd3BzdGF0dXNfdCIgMT4mNgotCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGx3cHN0YXR1c190LnByX2NvbnRleHQgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTg3OiBjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfY29udGV4dCBpbiBzeXMvcHJvY2ZzLmgiID4mNQotIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MTkyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci1pbnQgbWFpbigpIHsKLWx3cHN0YXR1c190IGF2YXI7IHZvaWQqIGFyZWYgPSAodm9pZCopICZhdmFyLnByX2NvbnRleHQKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MTk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9jb250ZXh0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQ9bm8KLSAgIAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotIGlmIHRlc3QgJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfY29udGV4dCA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVCAxCi1FT0YKLQotIGZpCi0gZWNobyAiJGFjX3QiIiRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX2NvbnRleHQiIDE+JjYKLQotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsd3BzdGF0dXNfdC5wcl9yZWcgaW4gc3lzL3Byb2Nmcy5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjIxOiBjaGVja2luZyBmb3IgbHdwc3RhdHVzX3QucHJfcmVnIGluIHN5cy9wcm9jZnMuaCIgPiY1Ci0gaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTIyNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3Byb2Nmcy5oPgotaW50IG1haW4oKSB7Ci1sd3BzdGF0dXNfdCBhdmFyOyB2b2lkKiBhcmVmID0gKHZvaWQqKSAmYXZhci5wcl9yZWcKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjMzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2hhdmVfc3lzX3Byb2Nmc190eXBlX21lbWJlcl9sd3BzdGF0dXNfdF9wcl9yZWc9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnPW5vCi0gICAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLSBpZiB0ZXN0ICRiZmRfY3ZfaGF2ZV9zeXNfcHJvY2ZzX3R5cGVfbWVtYmVyX2x3cHN0YXR1c190X3ByX3JlZyA9IHllczsgdGhlbgotICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHIDEKLUVPRgotCi0gZmkKLSBlY2hvICIkYWNfdCIiJGJmZF9jdl9oYXZlX3N5c19wcm9jZnNfdHlwZV9tZW1iZXJfbHdwc3RhdHVzX3RfcHJfcmVnIiAxPiY2Ci0KLSAgZmkKLWZpCi0KLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVFJBRF9IRUFERVIgJFRSQURfSEVBREVSCi1FT0YKLQotCi0jIEhvcnJpYmxlIGhhY2tzIHRvIGJ1aWxkIERMTHMgb24gV2luZG93cy4KLVdJTjMyTERGTEFHUz0KLVdJTjMyTElCQUREPQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1jeWd3aW4qKQotICBpZiB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSAieWVzIjsgdGhlbgotICAgIFdJTjMyTERGTEFHUz0iLW5vLXVuZGVmaW5lZCIKLSAgICBXSU4zMkxJQkFERD0iLUxgcHdkYC8uLi9saWJpYmVydHkgLWxpYmVydHkgLUxgcHdkYC8uLi9pbnRsIC1saW50bCAtbGN5Z3dpbiAtbGtlcm5lbDMyIgotICBmaQotICA7OwotZXNhYwotCi0KLQotIyB0YXJnZXQgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLQllbHNlCi0JICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgotCWZpCi0gICAgZG9uZQotZmkKLQotYWxsX3RhcmdldHM9ZmFsc2UKLWRlZnZlYz0KLXNlbHZlY3M9Ci1zZWxhcmNocz0KLVRERUZJTkVTPQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLSAgICBlbHNlCi0JLiAkc3JjZGlyL2NvbmZpZy5iZmQKLQlpZiB0ZXN0ICJ4JHRhcmciID0gIngkdGFyZ2V0IjsgdGhlbgotCSAgICBkZWZ2ZWM9JHRhcmdfZGVmdmVjCi0JZmkKLQlzZWx2ZWNzPSIkc2VsdmVjcyAkdGFyZ19kZWZ2ZWMgJHRhcmdfc2VsdmVjcyIKLQlzZWxhcmNocz0iJHNlbGFyY2hzICR0YXJnX2FyY2hzIgotCVRERUZJTkVTPSIkVERFRklORVMgJHRhcmdfY2ZsYWdzIgotICAgIGZpCi1kb25lCi0KLQotIyBUaGlzIHByb2Nlc3Npbmcgc3RpbGwgbmVlZHMgdG8gYmUgZG9uZSBpZiB3ZSdyZSB0byBkZWNpZGUgcHJvcGVybHkgd2hldGhlcgotIyA2NC1iaXQgc3VwcG9ydCBuZWVkcyB0byBiZSBjb21waWxlZCBpbi4gIEN1cnJlbnRseSwgaXQgd2lsbCBiZSBpbmNsdWRlZCBpZgotIyB0aGUgZGVmYXVsdCBvciBhbnkgb3RoZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgdGFyZ2V0IHJlcXVpcmVzIGl0OyBpdAotIyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBvbiBhIDMyLWJpdCBob3N0IGlmIG5vIDY0LWJpdCB0YXJnZXQgaXMgcmVxdWVzdGVkLCBhbmQKLSMgbm8gIi0td2l0aC02NC1iaXQtYmZkIiBvcHRpb24gaXMgZ2l2ZW4sIGV2ZW4gaWYgIi0td2l0aC10YXJnZXRzPWFsbCIgaXMKLSMgdXNlZC4KLQotIyB1bmlxIHRoZSBkZWZhdWx0IGFuZCBzZWxlY3RlZCB2ZWN0b3JzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgotZj0iIgotZm9yIGkgaW4gJHNlbHZlY3MgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsdmVjcz0iJGYiCi0KLQotIyB1bmlxIHRoZSBhcmNoaXRlY3R1cmVzIGluIGFsbCB0aGUgY29uZmlndXJlZCB0YXJnZXRzLgotZj0iIgotZm9yIGkgaW4gJHNlbGFyY2hzIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXNlbGFyY2hzPSIkZiIKLQotIyBUYXJnZXQgYmFja2VuZCAubyBmaWxlcy4KLXRiPQotCi1lbGY9ImVsZi5sbyBlbGZsaW5rLmxvIGR3YXJmMi5sbyBkd2FyZjEubG8iCi0KLWZvciB2ZWMgaW4gJHNlbHZlY3MKLWRvCi0gICAgY2FzZSAiJHZlYyIgaW4KLSAgICAjIFRoaXMgbGlzdCBpcyBhbHBoYWJldGl6ZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGNvbXBhcmUKLSAgICAjIHdpdGggdGhlIHR3byB2ZWN0b3IgbGlzdHMgaW4gdGFyZ2V0cy5jLgotICAgIGEyOWtjb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtYTI5ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBhX291dF9hZG9iZV92ZWMpCQl0Yj0iJHRiIGFvdXQtYWRvYmUubG8gYW91dDMyLmxvIiA7OwotICAgIGFybWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlX2xpdHRsZV92ZWMpCQl0Yj0iJHRiIHBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlX2JpZ192ZWMpCXRiPSIkdGIgZXBvYy1wZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVwb2MtcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2JpZ192ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhb3V0MF9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0MC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fYmlnX3ZlYykJCXRiPSIkdGIgYW91dC1hcm0ubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfYXJtX2xpdHRsZV92ZWMpCXRiPSIkdGIgYW91dC1hcm0ubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19iaWdfdmVjKQkJdGI9IiR0YiBtaXBzYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X21pcHNfbGl0dGxlX3ZlYykJdGI9IiR0YiBtaXBzYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhcG9sbG9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hcG9sbG8ubG8iIDs7Ci0gICAgYl9vdXRfdmVjX2JpZ19ob3N0KQkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiX291dF92ZWNfbGl0dGxlX2hvc3QpCXRiPSIkdGIgYm91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2FscGhhX3ZlYykJdGI9IiR0YiBlbGY2NC1hbHBoYS5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1hcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYykJdGI9IiR0YiBlbGZhcm0tbmFiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWMpIHRiPSIkdGIgZWxmYXJtLW9hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnYXJjX3ZlYykJdGI9IiR0YiBlbGYzMi1hcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnYXJtX3ZlYykJdGI9IiR0YiBlbGZhcm0tbmFiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fb2FiaV92ZWMpCXRiPSIkdGIgZWxmYXJtLW9hYmkubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2JpZ21pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9kMTB2X3ZlYykJCXRiPSIkdGIgZWxmMzItZDEwdi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9kMzB2X3ZlYykJCXRiPSIkdGIgZWxmMzItZDMwdi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9mcjMwX3ZlYykJCXRiPSIkdGIgZWxmMzItZnIzMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9ocHBhX3ZlYykJCXRiPSIkdGIgZWxmMzItaHBwYS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9pMzg2X3ZlYykJCXRiPSIkdGIgZWxmMzItaTM4Ni5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9pODYwX3ZlYykJCXRiPSIkdGIgZWxmMzItaTg2MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9pOTYwX3ZlYykJCXRiPSIkdGIgZWxmMzItaTk2MC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMpIHRiPSIkdGIgZWxmMzItZ2VuLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYykgCXRiPSIkdGIgZWxmNjQtbWlwcy5sbyBlbGY2NC5sbyBlbGYzMi1taXBzLmxvIGVsZjMyLmxvICRlbGYgZWNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBiZmRfZWxmMzJfbTMycl92ZWMpCQl0Yj0iJHRiIGVsZjMyLW0zMnIubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbTY4a192ZWMpCQl0Yj0iJHRiIGVsZjMyLW02OGsubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbTg4a192ZWMpCQl0Yj0iJHRiIGVsZjMyLW04OGsubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYykJdGI9IiR0YiBlbGYzMi1tY29yZS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21uMTAyMDBfdmVjKQl0Yj0iJHRiIGVsZi1tMTAyMDAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDMwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDMwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfcG93ZXJwY2xlX3ZlYykJdGI9IiR0YiBlbGYzMi1wcGMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfc2hfdmVjKQkJdGI9IiR0YiBlbGYzMi1zaC5sbyBlbGYzMi5sbyAkZWxmIGNvZmYtc2gubG8iIDs7Ci0gICAgYmZkX2VsZjMyX3NobF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc3BhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLXNwYXJjLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Y4NTBfdmVjKQkJdGI9IiR0YiBlbGYzMi12ODUwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYykgCXRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9saXR0bGVfZ2VuZXJpY192ZWMpIHRiPSIkdGIgZWxmNjQtZ2VuLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGY2NF9zcGFyY192ZWMpCXRiPSIkdGIgZWxmNjQtc3BhcmMubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgY2lzY29fY29yZV92ZWMpCQl0Yj0iJHRiIGNpc2NvLWNvcmUubG8iIDs7Ci0gICAgZGVtb182NF92ZWMpCQl0Yj0iJHRiIGRlbW82NC5sbyBhb3V0NjQubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGVjb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7Ci0gICAgZWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9iaWdsaXR0bGVfdmVjKQl0Yj0iJHRiIGNvZmYtbWlwcy5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iIDs7Ci0gICAgZWNvZmZhbHBoYV9saXR0bGVfdmVjKQl0Yj0iJHRiIGNvZmYtYWxwaGEubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBnbzMyY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtZ28zMi5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBnbzMyc3R1YmJlZGNvZmZfdmVjKQl0Yj0iJHRiIGNvZmYtc3RnbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGg4MzAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDgzMDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBoODUwMGNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWg4NTAwLmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgaG9zdF9hb3V0X3ZlYykJCXRiPSIkdGIgaG9zdC1hb3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBocDMwMGJzZF92ZWMpCQl0Yj0iJHRiIGhwMzAwYnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBocDMwMGhwdXhfdmVjKQkJdGI9IiR0YiBocDMwMGhwdXgubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZhb3V0X3ZlYykJCXRiPSIkdGIgaTM4NmFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZic2RfdmVjKQkJdGI9IiR0YiBpMzg2YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTM4Ni5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpMzg2ZHluaXhfdmVjKQkJdGI9IiR0YiBpMzg2ZHluaXgubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZmcmVlYnNkX3ZlYykJCXRiPSIkdGIgaTM4NmZyZWVic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZtc2Rvc192ZWMpCQl0Yj0iJHRiIGkzODZtc2Rvcy5sbyIgOzsKLSAgICBpMzg2cGVfdmVjKQkJCXRiPSIkdGIgcGUtaTM4Ni5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgaTM4NnBlaV92ZWMpCQl0Yj0iJHRiIHBlaS1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZsaW51eF92ZWMpCQl0Yj0iJHRiIGkzODZsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIGkzODZseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nmx5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLWkzODZseW54LmxvIGNvZmZsaW5rLmxvIGx5bngtY29yZS5sbyIgOzsKLSAgICBpMzg2bWFjaDNfdmVjKQkJdGI9IiR0YiBpMzg2bWFjaDMubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZuZXRic2RfdmVjKQkJdGI9IiR0YiBpMzg2bmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2b3M5a192ZWMpCQl0Yj0iJHRiIGkzODZvczlrLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpODYwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaTg2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWNvZmZfbGl0dGxlX3ZlYykJCXRiPSIkdGIgY29mZi1pOTYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGllZWVfdmVjKQkJCXRiPSIkdGIgaWVlZS5sbyIgOzsKLSAgICBtNjhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrY29mZnVuX3ZlYykJCXRiPSIkdGIgY29mZi11NjhrLmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrbGludXhfdmVjKQkJdGI9IiR0YiBtNjhrbGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBtNjhrbHlueC5sbyBseW54LWNvcmUubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGtseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1tNjhrbHlueC5sbyBjb2ZmLW02OGsubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIG02OGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrbmV0YnNkLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBtNjhrNGtuZXRic2RfdmVjKQkJdGI9IiR0YiBtNjhrNGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGthdXhfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtYXV4LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtNjhrc3lzdmNvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXN2bTY4ay5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtODhrYmNzX3ZlYykJCXRiPSIkdGIgY29mZi1tODhrLmxvIiA7OwotICAgIG1jb3JlX3BlX2JpZ192ZWMpCQl0Yj0iJHRiIHBlLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlX2xpdHRsZV92ZWMpCXRiPSIkdGIgcGUtbWNvcmUubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVpX2JpZ192ZWMpCQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZWktbWNvcmUubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbmV3c29zM192ZWMpCQl0Yj0iJHRiIG5ld3NvczMubG8gYW91dDMyLmxvIiA7OwotICAgIG5sbTMyX2kzODZfdmVjKQkJdGI9IiR0YiBubG0zMi1pMzg2LmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9zcGFyY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXNwYXJjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBubG0zMl9hbHBoYV92ZWMpCQl0Yj0iJHRiIG5sbTMyLWFscGhhLmxvIG5sbTMyLmxvIG5sbS5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgcmlzY2l4X3ZlYykJCQl0Yj0iJHRiIGFvdXQzMi5sbyByaXNjaXgubG8iIDs7Ci0gICAgbmxtMzJfcG93ZXJwY192ZWMpCQl0Yj0iJHRiIG5sbTMyLXBwYy5sbyBubG0zMi5sbyBubG0ubG8iIDs7Ci0gICAgcGM1MzJuZXRic2RfdmVjKQkJdGI9IiR0YiBuczMya25ldGJzZC5sbyBhb3V0LW5zMzJrLmxvIiA7OwotICAgIHBjNTMybWFjaGFvdXRfdmVjKQkJdGI9IiR0YiBwYzUzMi1tYWNoLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcG1hY194Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcG1hYy5sbyB4Y29mZmxpbmsubG8iIDs7Ci0gICAgcnM2MDAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtcnM2MDAwLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfcG93ZXJwY19wZV92ZWMpICAgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gY29mZmxpbmsubG8iIDs7ICAKLSAgICBiZmRfcG93ZXJwY2xlX3BlX3ZlYykgICAgICAgdGI9IiR0YiBwZS1wcGMubG8gY29mZmxpbmsubG8iIDs7ICAKLSAgICBiZmRfcG93ZXJwY19wZWlfdmVjKSAgICAgICAgdGI9IiR0YiBwZWktcHBjLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjbGVfcGVpX3ZlYykgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgcHBjYm9vdF92ZWMpCQl0Yj0iJHRiIHBwY2Jvb3QubG8iIDs7Ci0gICAgc2hjb2ZmX3ZlYykJCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hsY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc2gubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgc2hjb2ZmX3NtYWxsX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3NtYWxsX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzb21fdmVjKQkJCXRiPSIkdGIgc29tLmxvIiA7OwotICAgIHNwYXJjbGVfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtc3BhcmNsZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNsaW51eF92ZWMpCQl0Yj0iJHRiIHNwYXJjbGludXgubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjbHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgc3BhcmNseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2NvZmZfdmVjKQkJdGI9IiR0YiBjZi1zcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIHNwYXJjbmV0YnNkX3ZlYykJCXRiPSIkdGIgc3BhcmNuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIHNwYXJjY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3BhcmMubG8iIDs7Ci0gICAgc3JlY192ZWMpCQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHN1bm9zX2JpZ192ZWMpCQl0Yj0iJHRiIHN1bm9zLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzeW1ib2xzcmVjX3ZlYykJCXRiPSIkdGIgc3JlYy5sbyIgOzsKLSAgICB0ZWtoZXhfdmVjKQkJCXRiPSIkdGIgdGVraGV4LmxvIiA7OwotICAgIHRpYzMwX2FvdXRfdmVjKQkJdGI9IiR0YiBhb3V0LXRpYzMwLmxvIiA7OwotICAgIHRpYzMwX2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLXRpYzMwLmxvIiA7OwotICAgIHRpYzgwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljODAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgdmVyc2Fkb3NfdmVjKQkJdGI9IiR0YiB2ZXJzYWRvcy5sbyIgOzsKLSAgICB2bXNfYWxwaGFfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iCi0gCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICB2bXNfdmF4X3ZlYykJCXRiPSIkdGIgdm1zLmxvIHZtcy1oZHIubG8gdm1zLWdzZC5sbyB2bXMtdGlyLmxvIHZtcy1taXNjLmxvIiA7OwotICAgIHc2NV92ZWMpCQkJdGI9IiR0YiBjb2ZmLXc2NS5sbyByZWxvYzE2LmxvIiA7OwotICAgIHdlMzJrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtd2UzMmsubG8iIDs7Ci0gICAgejhrY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtejhrLmxvIHJlbG9jMTYubG8iIDs7Ci0KLSAgICAiIikJCQk7OwotICAgICopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogKioqIHVua25vd24gdGFyZ2V0IHZlY3RvciAkdmVjIiAxPiYyOyBleGl0IDE7IH0gOzsKLSAgICBlc2FjCi1kb25lCi0KLSMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KLSMgQSBjb3VwbGUgb2YgQ1BVcyB1c2Ugc2hvcnRlciBmaWxlIG5hbWVzIHRvIGF2b2lkIHByb2JsZW1zIG9uIERPUwotIyBmaWxlc3lzdGVtcy4KLXRhPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSBzL2JmZF8vY3B1LS9nIC1lIHMvX2FyY2gvLmxvL2cgLWUgcy9tbjEwMjAwL20xMDIwMC8gLWUgcy9tbjEwMzAwL20xMDMwMC9gCi0KLSMgV2VlZCBvdXQgZHVwbGljYXRlIC5vIGZpbGVzLgotZj0iIgotZm9yIGkgaW4gJHRiIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXRiPSIkZiIKLQotZj0iIgotZm9yIGkgaW4gJHRhIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXRhPSIkZiIKLQotYmZkX2JhY2tlbmRzPSIkdGIiCi1iZmRfbWFjaGluZXM9IiR0YSIKLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZSA7IHRoZW4KLSAgYmZkX2JhY2tlbmRzPSIke2JmZF9iYWNrZW5kc30iJyAkKEFMTF9CQUNLRU5EUyknCi0gIGJmZF9tYWNoaW5lcz0iJHtiZmRfbWFjaGluZXN9IicgJChBTExfTUFDSElORVMpJwotICBzZWx2ZWNzPQotICBoYXZldmVjcz0KLSAgc2VsYXJjaHM9Ci1lbHNlCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotICAjIE9ubHkgc2V0IHRoZXNlIGlmIHRoZXkgd2lsbCBiZSBub25lbXB0eSwgZm9yIHRoZSBjbGV2ZXIgZWNoby4KLSAgaGF2ZXZlY3M9Ci0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIGhhdmV2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vLURIQVZFXy8nIC1lICdzLyBcKC5cKS8gLURIQVZFX1wxL2cnYAotICB0ZXN0IC1uICIkc2VsdmVjcyIgJiYKLSAgICBzZWx2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vXCYvJyAtZSAncy8gXCguXCkvLFwmXDEvZydgCi0gIHRlc3QgLW4gIiRzZWxhcmNocyIgJiYKLSAgICBzZWxhcmNocz1gZWNobyAkc2VsYXJjaHMgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLWZpCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotCi1jYXNlICR7aG9zdDY0fS0ke3RhcmdldDY0fS0ke3dhbnQ2NH0gaW4KLSAgKnRydWUqKQotICAgIHdvcmRzaXplPTY0Ci0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDY0X0JBQ0tFTkRTKSAkKEJGRDMyX0JBQ0tFTkRTKScKLSAgICBpZiB0ZXN0IC16ICIkR0NDIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRCSVRfTE9ORyIgPSAiMCIgJiYgdGVzdCAiJEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEIiA9ICIwIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBZb3UgaGF2ZSByZXF1ZXN0ZWQgYSA2NCBiaXQgQkZEIGNvbmZpZ3VyYXRpb24sIGJ1dCIgMT4mMgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiB5b3VyIGNvbXBpbGVyIG1heSBub3QgaGF2ZSBhIDY0IGJpdCBpbnRlZ3JhbCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICA7OwotICBmYWxzZS1mYWxzZS1mYWxzZSkKLSAgICB3b3Jkc2l6ZT0zMgotICAgIGFsbF9iYWNrZW5kcz0nJChCRkQzMl9CQUNLRU5EUyknCi0gICAgOzsKLWVzYWMKLQotCi0KLQotCi0KLXRkZWZhdWx0cz0iIgotdGVzdCAtbiAiJHtkZWZ2ZWN9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAtRERFRkFVTFRfVkVDVE9SPSR7ZGVmdmVjfSIKLXRlc3QgLW4gIiR7c2VsdmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EU0VMRUNUX1ZFQ1M9JyR7c2VsdmVjc30nIgotdGVzdCAtbiAiJHtzZWxhcmNoc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EU0VMRUNUX0FSQ0hJVEVDVFVSRVM9JyR7c2VsYXJjaHN9JyIKLXRlc3QgLW4gIiR7aGF2ZXZlY3N9IiAmJiB0ZGVmYXVsdHM9IiR7dGRlZmF1bHRzfSAke2hhdmV2ZWNzfSIKLQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTU4MzogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDU1ODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjU1OTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTYyMjogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTYyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NjUwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1Njc1OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NjgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1ODIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotZm9yIGFjX2Z1bmMgaW4gbWFkdmlzZSBtcHJvdGVjdAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTg0ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTg1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1ODc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1jYXNlICR7d2FudF9tbWFwfSske2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWR9IGluCi0gIHRydWUreWVzICkgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0VfTU1BUCAxCi1FT0YKLSA7OwotZXNhYwotCi1ybSAtZiBkb2MvY29uZmlnLnN0YXR1cwotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBDQ0AlJENDJWcKLXMlQElOU1RBTExfUFJPR1JBTUAlJElOU1RBTExfUFJPR1JBTSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBQQUNLQUdFQCUkUEFDS0FHRSVnCi1zJUBWRVJTSU9OQCUkVkVSU0lPTiVnCi1zJUBBQ0xPQ0FMQCUkQUNMT0NBTCVnCi1zJUBBVVRPQ09ORkAlJEFVVE9DT05GJWcKLXMlQEFVVE9NQUtFQCUkQVVUT01BS0UlZwotcyVAQVVUT0hFQURFUkAlJEFVVE9IRUFERVIlZwotcyVATUFLRUlORk9AJSRNQUtFSU5GTyVnCi1zJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQExEQCUkTEQlZwotcyVATk1AJSROTSVnCi1zJUBVU0VfU1lNQk9MX1VOREVSU0NPUkVAJSRVU0VfU1lNQk9MX1VOREVSU0NPUkUlZwotcyVATE5fU0AlJExOX1MlZwotcyVARExMVE9PTEAlJERMTFRPT0wlZwotcyVAQVNAJSRBUyVnCi1zJUBMSUJUT09MQCUkTElCVE9PTCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBDUFBAJSRDUFAlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVASERFRklORVNAJSRIREVGSU5FUyVnCi1zJUBCRkRfSE9TVF82NEJJVF9MT05HQCUkQkZEX0hPU1RfNjRCSVRfTE9ORyVnCi1zJUBCRkRfSE9TVF82NF9CSVRfREVGSU5FREAlJEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEJWcKLXMlQEJGRF9IT1NUXzY0X0JJVEAlJEJGRF9IT1NUXzY0X0JJVCVnCi1zJUBCRkRfSE9TVF9VXzY0X0JJVEAlJEJGRF9IT1NUX1VfNjRfQklUJWcKLXMlQENDX0ZPUl9CVUlMREAlJENDX0ZPUl9CVUlMRCVnCi1zJUBFWEVFWFRfRk9SX0JVSUxEQCUkRVhFRVhUX0ZPUl9CVUlMRCVnCi1zJUBDT1JFRklMRUAlJENPUkVGSUxFJWcKLXMlQENPUkVGTEFHQCUkQ09SRUZMQUclZwotcyVAV0lOMzJMREZMQUdTQCUkV0lOMzJMREZMQUdTJWcKLXMlQFdJTjMyTElCQUREQCUkV0lOMzJMSUJBREQlZwotcyVAVERFRklORVNAJSRUREVGSU5FUyVnCi1zJUB3b3Jkc2l6ZUAlJHdvcmRzaXplJWcKLXMlQGFsbF9iYWNrZW5kc0AlJGFsbF9iYWNrZW5kcyVnCi1zJUBiZmRfYmFja2VuZHNAJSRiZmRfYmFja2VuZHMlZwotcyVAYmZkX21hY2hpbmVzQCUkYmZkX21hY2hpbmVzJWcKLXMlQHRkZWZhdWx0c0AlJHRkZWZhdWx0cyVnCi0KLUNFT0YKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0KLSMgU3BsaXQgdGhlIHN1YnN0aXR1dGlvbnMgaW50byBiaXRlLXNpemVkIHBpZWNlcyBmb3Igc2VkcyB3aXRoCi0jIHNtYWxsIGNvbW1hbmQgbnVtYmVyIGxpbWl0cywgbGlrZSBvbiBEaWdpdGFsIE9TRi8xIGFuZCBIUC1VWC4KLWFjX21heF9zZWRfY21kcz05MCAjIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNlZCBzY3JpcHQuCi1hY19maWxlPTEgIyBOdW1iZXIgb2YgY3VycmVudCBmaWxlLgotYWNfYmVnPTEgIyBGaXJzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19lbmQ9JGFjX21heF9zZWRfY21kcyAjIExpbmUgYWZ0ZXIgbGFzdCBsaW5lIGZvciBjdXJyZW50IGZpbGUuCi1hY19tb3JlX2xpbmVzPToKLWFjX3NlZF9jbWRzPSIiCi13aGlsZSAkYWNfbW9yZV9saW5lczsgZG8KLSAgaWYgdGVzdCAkYWNfYmVnIC1ndCAxOyB0aGVuCi0gICAgc2VkICIxLCR7YWNfYmVnfWQ7ICR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIHNlZCAiJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBmaQotICBpZiB0ZXN0ICEgLXMgY29uZnRlc3QucyRhY19maWxlOyB0aGVuCi0gICAgYWNfbW9yZV9saW5lcz1mYWxzZQotICAgIHJtIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICAgICAgYWNfc2VkX2NtZHM9InNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZWxzZQotICAgICAgYWNfc2VkX2NtZHM9IiRhY19zZWRfY21kcyB8IHNlZCAtZiBjb25mdGVzdC5zJGFjX2ZpbGUiCi0gICAgZmkKLSAgICBhY19maWxlPWBleHByICRhY19maWxlICsgMWAKLSAgICBhY19iZWc9JGFjX2VuZAotICAgIGFjX2VuZD1gZXhwciAkYWNfZW5kICsgJGFjX21heF9zZWRfY21kc2AKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgYWNfc2VkX2NtZHM9Y2F0Ci1maQotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1DT05GSUdfRklMRVM9XCR7Q09ORklHX0ZJTEVTLSJNYWtlZmlsZSBkb2MvTWFrZWZpbGUgYmZkLWluMy5oOmJmZC1pbjIuaCBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLXNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2JmZC9jb25maWd1cmUuYmF0IGIvYmZkL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZmU3OWUuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1AZWNobyBvZmYNCi1pZiAiJTEiID09ICJoOC8zMDAiIGdvdG8gaDgzMDANCi0NCi1lY2hvIENvbmZpZ3VyaW5nIGJmZCBmb3IgZ28zMg0KLXVwZGF0ZSBob3N0c1xnbzMyLmggc3lzZGVwLmgNCi11cGRhdGUgTWFrZWZpbGUuZG9zIE1ha2VmaWxlDQotZWNobyBzL0BXT1JEU0laRUAvMzIvZz5jb25maWcuc2VkDQotc2VkIC1lIHMvXi9zXC9AVkVSU0lPTkBcLy8gLWUgcy8kL1wvZy9nIHZlcnNpb24gPj5jb25maWcuc2VkDQotc2VkIC1mIGNvbmZpZy5zZWQgPCBiZmQtaW4yLmggPiBiZmQuaDINCi11cGRhdGUgYmZkLmgyIGJmZC5oDQotZ290byBleGl0DQotDQotOmg4MzAwDQotZWNobyBDb25maWd1cmluZyBiZmQgZm9yIEg4LzMwMA0KLXVwZGF0ZSBob3N0c1xoLWdvMzIuaCBzeXNkZXAuaA0KLXVwZGF0ZSBNYWtlZmlsZS5kb3MgTWFrZWZpbGUNCi0NCi06ZXhpdA0KZGlmZiAtLWdpdCBhL2JmZC9jb25maWd1cmUuY29tIGIvYmZkL2NvbmZpZ3VyZS5jb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOTk3N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5jb20KKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotJCEKLSQhIFRoaXMgZmlsZSBjb25maWd1cmVzIHRoZSBiZmQgbGlicmFyeSBmb3IgdXNlIHdpdGggb3BlblZNUyAoQWxwaGEgYW5kIFZheCkKLSQhCi0kISBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZSBkbyBub3QgaGF2ZSAvYmluL3NoCi0kISB0byBleGVjdXRlIGl0LgotJCEKLSQhIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLSQhCi0kYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpICAgICAgISB2YXg9PTEsIGFscGhhPT0yCi0kYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIQotJGlmIGFyY2ggLmVxcy4gIkFscGhhIgotJHRoZW4KLSQgd3JpdGUgc3lzJG91dHB1dCAiQ29uZmlndXJpbmcgZm9yIEFscGhhIHRhcmdldCIKLSQgdGFyZ2V0ID0gImFscGhhIgotJCEKLSQhIGNvcHkgYmZkLWluMi5oIHRvIGJmZC5oLCByZXBsYWNpbmcgQCBtYWNyb3MKLSQhCi0kIGVkaXQvdHB1L25vam91cm5hbC9ub3NlY3Rpb24vbm9kaXNwbGF5L2NvbW1hbmQ9c3lzJGlucHV0IC0KLSAgICAgICAgW11iZmQtaW4yLmggL291dHB1dD1bXWJmZC5oCi0kREVDSwotIQotISAgQ29weSBmaWxlLCBjaGFuZ2luZyBsaW5lcyB3aXRoIG1hY3JvcyAoQEApCi0hCi0hCi0gICB2ZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJ2ZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRih2ZmlsZSksIEVORF9PRih2ZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJmZCwgJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICB2ZXJzIDo9IENVUlJFTlRfTElORS0iKSI7Ci0gICBFTFNFOwotICAgICB2ZXJzIDo9ICJ1bmtub3duIjsKLSAgIEVORElGOwotCi0gICBmaWxlIDo9IENSRUFURV9CVUZGRVIoImZpbGUiLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJmaWxlX25hbWUiKSk7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YoZmlsZSksIEVORF9PRihmaWxlKSk7Ci0KLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQodmVycyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQHdvcmRzaXplQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCc2NCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NEJJVF9MT05HQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCcwJyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCdfX0RFQ0MnKTsKLSAgICAgIFNQTElUX0xJTkU7Ci0gICAgICBDT1BZX1RFWFQoJyNpbmNsdWRlIDxpbnRzLmg+Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUXzY0X0JJVEAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnaW50NjQnKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfVV82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ3VpbnQ2NCcpOwotICAgRU5ESUY7Ci0gICBXUklURV9GSUxFKGZpbGUsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgIm91dHB1dF9maWxlIikpOwotICAgUVVJVAotJCAgRU9ECi0kCi0kZWxzZQotJAotJCB3cml0ZSBzeXMkb3V0cHV0ICJDb25maWd1cmluZyBmb3IgVmF4IHRhcmdldCIKLSQgdGFyZ2V0ID0gInZheCIKLSQhCi0kISBjb3B5IGJmZC1pbjIuaCB0byBiZmQuaCwgcmVwbGFjaW5nIEAgbWFjcm9zCi0kIQotJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCi0gICAgICAgIFtdYmZkLWluMi5oIC9vdXRwdXQ9W11iZmQuaAotJERFQ0sKLSEKLSEgIENvcHkgZmlsZSwgY2hhbmdpbmcgbGluZXMgd2l0aCBtYWNyb3MgKEBAKQotIQotIQotICAgdmZpbGUgOj0gQ1JFQVRFX0JVRkZFUigidmZpbGUiLCAiQ09ORklHVVJFLklOIik7Ci0gICByYW5nIDo9IENSRUFURV9SQU5HRShCRUdJTk5JTkdfT0YodmZpbGUpLCBFTkRfT0YodmZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQU1fSU5JVF9BVVRPTUFLRShiZmQsICcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgdmVycyA6PSBDVVJSRU5UX0xJTkUtIikiOwotICAgRUxTRTsKLSAgICAgdmVycyA6PSAidW5rbm93biI7Ci0gICBFTkRJRjsKLQotICAgZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJmaWxlIiwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAiZmlsZV9uYW1lIikpOwotICAgcmFuZyA6PSBDUkVBVEVfUkFOR0UoQkVHSU5OSU5HX09GKGZpbGUpLCBFTkRfT0YoZmlsZSkpOwotCi0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BWRVJTSU9OQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKHZlcnMpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0B3b3Jkc2l6ZUAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnMzInKTsKLSAgIEVORElGOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdAQkZEX0hPU1RfNjRCSVRfTE9OR0AnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnMCcpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRfREVGSU5FREAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgICAgIENPUFlfVEVYVCgnX19ERUNDJyk7Ci0gICAgICBTUExJVF9MSU5FOwotICAgICAgQ09QWV9URVhUKCcjaW5jbHVkZSA8aW50cy5oPicpOwotICAgRU5ESUY7Ci0gICBtYXRjaF9wb3MgOj0gU0VBUkNIX1FVSUVUTFkoJ0BCRkRfSE9TVF82NF9CSVRAJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgSUYgbWF0Y2hfcG9zIDw+IDAgVEhFTjsKLSAgICAgIFBPU0lUSU9OKEJFR0lOTklOR19PRihtYXRjaF9wb3MpKTsKLSAgICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgICBDT1BZX1RFWFQoJ2ludDY0Jyk7Ci0gICBFTkRJRjsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQEJGRF9IT1NUX1VfNjRfQklUQCcsIEZPUldBUkQsIEVYQUNULCByYW5nKTsKLSAgIElGIG1hdGNoX3BvcyA8PiAwIFRIRU47Ci0gICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgICBFUkFTRShtYXRjaF9wb3MpOwotICAgICAgQ09QWV9URVhUKCd1aW50NjQnKTsKLSAgIEVORElGOwotICAgV1JJVEVfRklMRShmaWxlLCBHRVRfSU5GTyhDT01NQU5EX0xJTkUsICJvdXRwdXRfZmlsZSIpKTsKLSAgIFFVSVQKLSQgIEVPRAotJGVuZGlmCi0kCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgYmZkLmgnIGZyb20gYGJmZC1pbjIuaCcuIgotJCEKLSQhCi0kISBjcmVhdGUgdGFyZ21hdGNoLmgKLSQhCi0kIG9wZW4vd3JpdGUgdGZpbGUgW110YXJnbWF0Y2guaAotJCB3cml0ZSB0ZmlsZSAieyAiIiIgKyB0YXJnZXQgKyAiLSotKnZtcyoiIiIgKyAiLCIKLSQgd3JpdGUgdGZpbGUgIiNpZiBkZWZpbmVkIChTRUxFQ1RfVkVDUykiCi0kIHdyaXRlIHRmaWxlICJTRUxFQ1RfVkVDUyIKLSQgd3JpdGUgdGZpbGUgIiNlbHNlIgotJCB3cml0ZSB0ZmlsZSAiVU5TVVBQT1JURURfVEFSR0VUIgotJCB3cml0ZSB0ZmlsZSAiI2VuZGlmIgotJCB3cml0ZSB0ZmlsZSAifSwiCi0kIGNsb3NlIHRmaWxlCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgdGFyZ21hdGNoLmgnIgotJCEKLSQhCi0kISBjcmVhdGUgY29uZmlnLmgKLSQhCi0kIGNyZWF0ZSBbXWNvbmZpZy5oCi0vKiBjb25maWcuaC12bXMuICBHZW5lcmF0ZWQgYnkgaGFuZCBieSBLbGF1cyBL5G1wZiwga2thZW1wZkBkaWR5bXVzLnJtaS5kZS4gICovCi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLS8qIFdoZXRoZXIgbWFsbG9jIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KLS8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQyAqLwotLyogV2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQgZXZlbiBpZiA8c3RkbGliLmg+IGlzIGluY2x1ZGVkLiAgKi8KLS8qICN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgKi8KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLS8qICNkZWZpbmUgSEFWRV9NTUFQIDEgKi8KLS8qIERvIHdlIG5lZWQgdG8gdXNlIHRoZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICAqLwotLyogI3VuZGVmIFVTRV9CSU5BUllfRk9QRU4gKi8KLS8qIE5hbWUgb2YgaG9zdCBzcGVjaWZpYyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIHRyYWQtY29yZS5jLiAgKi8KLS8qICN1bmRlZiBUUkFEX0hFQURFUiAqLwotLyogRGVmaW5lIG9ubHkgaWYgPHN5cy9wcm9jZnMuaD4gaXMgYXZhaWxhYmxlICphbmQqIGl0IGRlZmluZXMgcHJzdGF0dXNfdC4gICovCi0vKiAjdW5kZWYgSEFWRV9TWVNfUFJPQ0ZTX0ggKi8KLS8qIERvIHdlIHJlYWxseSB3YW50IHRvIHVzZSBtbWFwIGlmIGl0J3MgYXZhaWxhYmxlPyAgKi8KLS8qICN1bmRlZiBVU0VfTU1BUCAqLwotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBmY250bCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfRkNOVEwgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfR0VUUEFHRVNJWkUgMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtYWR2aXNlIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgSEFWRV9NQURWSVNFIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXByb3RlY3QgZnVuY3Rpb24uICAqLwotI2RlZmluZSBIQVZFX01QUk9URUNUIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGRlZi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1REREVGX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUUklOR19IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1lTX0ZJTEVfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx0aW1lLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9USU1FX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0kIQotJCB3cml0ZSBzeXMkb3V0cHV0ICJHZW5lcmF0ZWQgYGNvbmZpZy5oJyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5ob3N0IGIvYmZkL2NvbmZpZ3VyZS5ob3N0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjRjZDYwLi4wMDAwMDAwCi0tLSBhL2JmZC9jb25maWd1cmUuaG9zdAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgb3ZlcnJpZGVzIHNvbWUgb2YgdGhlIHRvb2xzIGFuZAotIyBmbGFncyB1c2VkIG9uIGEgaG9zdCBzcGVjaWZpYyBiYXNpcy4KLQotIyBTaW5jZSB0aGUgImJmZC9ob3N0cyIgZGlyZWN0b3J5IGlzIHNoYXJlZCBieSB0aGUgYmZkLCBvcGNvZGVzLCBhbmQKLSMgYmludXRpbHMgZGlyZWN0b3JpZXMgKGF0IGxlYXN0KSwgdGhlIGluZGV4IHRvIGl0IGlzIGFsc28gc2hhcmVkLgotIyBUaGlzIGlzIHRoYXQgaW5kZXguICBFYWNoIGNvbmZpZ3VyZS5pbiBmaWxlIHNob3VsZCBzb3VyY2UgdGhpcyBmaWxlCi0jIGluIGl0cyBwZXItaG9zdCBwYXJ0LgotCi0jIFRoaXMgc2V0cyB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKLSMgIEhERUZJTkVTCQlob3N0IHNwZWNpZmljIGNvbXBpbGVyIG9wdGlvbnMKLSMgIGhvc3Q2NAkJc2V0IHRvIHRydWUgaWYgNjQgYml0IHR5cGVzIGFyZSBhcyBmYXN0IGFzIDMyIGJpdAotIyAgSE9TVF82NEJJVF9UWVBFCWhvc3QgNjQgYml0IHR5cGUKLSMgIEhPU1RfVV82NEJJVF9UWVBFCXVuc2lnbmVkIDY0IGJpdCB0eXBlIChub3QgbmVlZGVkIGlmIDY0QklUX1RZUEUgaXMgbG9uZykKLQotSERFRklORVM9Ci1ob3N0NjQ9ZmFsc2UKLUhPU1RfNjRCSVRfVFlQRT0KLUhPU1RfVV82NEJJVF9UWVBFPQotCi1jYXNlICIke2hvc3R9IiBpbgotCi1hbHBoYSotKi0qKQkJaG9zdDY0PXRydWU7IEhPU1RfNjRCSVRfVFlQRT1sb25nIDs7Ci0KLWhwcGEqLSotaHB1eCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUhQVVggOzsKLWhwcGEqLSotaGl1eCopCQlIREVGSU5FUz0tREhPU1RfSFBQQUhQVVggOzsKLWhwcGEqLSotbXBlaXgqKQkJSERFRklORVM9LURIT1NUX0hQUEFNUEVJWCA7OwotaHBwYSotKi1ic2QqKQkJSERFRklORVM9LURIT1NUX0hQUEFCU0QgOzsKLWhwcGEqLSotb3NmKikJCUhERUZJTkVTPS1ESE9TVF9IUFBBT1NGIDs7Ci0KLWlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCUhERUZJTkVTPS1Ec2hhcmVkPWdlbnNoYXJlZCA7OwotaVszNDU2XTg2LXNlcXVlbnQtc3lzdjQqKSA7OwotaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCUhERUZJTkVTPS1Ec2hhcmVkPWdlbnNoYXJlZCA7OwotCi1taXBzKi1kZWMtbmV0YnNkKikJOzsKLW1pcHMqLSotb3BlbmJzZCopCTs7Ci1taXBzKi1kZWMtKikJCUhERUZJTkVTPSItRyA0Igk7OwotbWlwcyotc2dpLWlyaXgzKikJSERFRklORVM9Ii1HIDQiIDs7Ci1taXBzKi1zZ2ktaXJpeDQqKQlIREVGSU5FUz0iLUcgNCIgOzsKLW1pcHMqLXNnaS1pcml4NiopCWhvc3Q2ND10cnVlCi0JCQlIT1NUXzY0QklUX1RZUEU9ImxvbmcgbG9uZyI7Ci0JCQlIT1NUX1VfNjRCSVRfVFlQRT0idW5zaWduZWQgbG9uZyBsb25nIjsKLQkJCTs7Ci1taXBzKi0qLXN5c3Y0KikJCTs7Ci1taXBzKi0qLXN5c3YqKQkJSERFRklORVM9Ii1HIDQiIDs7Ci1taXBzKi0qLXJpc2NvcyopCUhERUZJTkVTPSItRyA0IiA7OwotCi1tNjgqLWhwLWhwdXgqKQkJSERFRklORVM9LURIT1NUX0hQMzAwSFBVWCA7OwotCi0qLSotc29sYXJpcyopCQlIT1NUXzY0QklUX1RZUEU9ImxvbmcgbG9uZyIKLQkJCUhPU1RfVV82NEJJVF9UWVBFPSJ1bnNpZ25lZCBsb25nIGxvbmciCi0JCQk7OwotCi0qLSotd2luZG93cyopCi0JCQlIT1NUXzY0QklUX1RZUEU9X19pbnQ2NAotCQkJSE9TVF9VXzY0QklUX1RZUEU9InVuc2lnbmVkIF9faW50NjQiCi0jIFRoZSBmb2xsb3dpbmcga3JvY2sgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY2FuJ3QgcnVuIHRoZSBidWlsZCBjb21waWxlcgotIyAoTVNWQykgb24gdGhlIGNvbmZpZ3VyZSBob3N0LCBzbyB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSB2YWx1ZXMgaGVyZS4KLSMgTm90ZSB0aGF0IHRoaXMgZmlsZSBpcyBuZXZlciBydW4gdGhyb3VnaCBhdXRvY29uZiwgc28gd2UgY2FuJ3QgdXNlIGFueQotIyBhdXRvY29uZiBtYWNyb3MgaGVyZS4gIEJlY2F1c2Ugb2YgdGhpcywgd2UgaGF2ZSB0byBtdWNrIHdpdGggYXV0b2NvbmYKLSMgdmFyaWFibGVzIGV4cGxpY2l0bHkuCi0JCQlhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi0JCQlhY19jdl9oZWFkZXJfdGltZT1ubwotCQkJYWNfY3ZfZnVuY19nZXRwYWdlc2l6ZT1ubwotCQkJYWNfY3ZfZnVuY19tYWR2aXNlPW5vCi0JCQlhY19jdl9mdW5jX21wcm90ZWN0PW5vCi0JCQlhY19jdl9mdW5jX2dldHVpZD1ubwotCQkJYWNfY3ZfZnVuY19nZXRnaWQ9bm8KLQkJCWFjX2N2X2hlYWRlcl9zeXNfZmlsZV9oPW5vCi0JCQlhY19jdl9oZWFkZXJfc3lzX3RpbWVfaD1ubwotCQkJYWNfY3ZfaGVhZGVyX3VuaXN0ZF9oPW5vCi0JCQk7OwotZXNhYwpkaWZmIC0tZ2l0IGEvYmZkL2NvbmZpZ3VyZS5pbiBiL2JmZC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZjNlZjYuLjAwMDAwMDAKLS0tIGEvYmZkL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY0OSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLWRubAotCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQobGliYmZkLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLUFDX0lTQ19QT1NJWAotCi1BTV9JTklUX0FVVE9NQUtFKGJmZCwgMi45LjQpCi0KLWRubCBUaGVzZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLCBiZWNhdXNlIGl0IG1heSB3YW50Ci1kbmwgdG8gY2FsbCBBQ19DSEVDS19QUk9HLgotQUNfQ0hFQ0tfVE9PTChBUiwgYXIpCi1BQ19DSEVDS19UT09MKFJBTkxJQiwgcmFubGliLCA6KQotCi1kbmwgRGVmYXVsdCB0byBhIG5vbiBzaGFyZWQgbGlicmFyeS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlCi1kbmwgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1zaGFyZWQuCi1BTV9ESVNBQkxFX1NIQVJFRAotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSg2NC1iaXQtYmZkLAotWyAgLS1lbmFibGUtNjQtYml0LWJmZCAgICAgNjQtYml0IHN1cHBvcnQgKG9uIGhvc3RzIHdpdGggbmFycm93ZXIgd29yZCBzaXplcyldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSAgd2FudDY0PXRydWUgIDs7Ci0gIG5vKSAgIHdhbnQ2ND1mYWxzZSA7OwotICAqKSAgICBBQ19NU0dfRVJST1IoYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24pIDs7Ci1lc2FjXSxbd2FudDY0PWZhbHNlXSlkbmwKLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9uc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoY29tbW9uYmZkbGliLAotWyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIEJGRCBjb21tb25iZmRsaWIgb3B0aW9uXSkgOzsKLWVzYWNdKWRubAotQUNfQVJHX1dJVEgobW1hcCwKLVsgIC0td2l0aC1tbWFwICAgICAgICAgICAgIHRyeSB1c2luZyBtbWFwIGZvciBCRkQgaW5wdXQgZmlsZXMgaWYgYXZhaWxhYmxlXSwKLVtjYXNlICIke3dpdGh2YWx9IiBpbgotICB5ZXMpICB3YW50X21tYXA9dHJ1ZSA7OwotICBubykgICB3YW50X21tYXA9ZmFsc2UgOzsKLSAgKikgICAgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke3dpdGh2YWx9IGZvciBCRkQgd2l0aC1tbWFwIG9wdGlvbikgOzsKLWVzYWNdLFt3YW50X21tYXA9ZmFsc2VdKWRubAotCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi1BQ19BUkdfUFJPR1JBTQotCi1BTV9NQUlOVEFJTkVSX01PREUKLUFDX0VYRUVYVAotCi1ob3N0NjQ9ZmFsc2UKLXRhcmdldDY0PWZhbHNlCi0KLSMgaG9zdCBzdHVmZjoKLQotQUNfUFJPR19DQwotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLSMgUGVybWl0IGhvc3Qgc3BlY2lmaWMgc2V0dGluZ3MuCi0uICR7c3JjZGlyfS9jb25maWd1cmUuaG9zdAotCi1BQ19TVUJTVChIREVGSU5FUykKLUFDX1BST0dfSU5TVEFMTAotCi1CRkRfSE9TVF82NEJJVF9MT05HPTAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEPTAKLUJGRF9IT1NUXzY0X0JJVD0KLUJGRF9IT1NUX1VfNjRfQklUPQotaWYgdGVzdCAieCR7SE9TVF82NEJJVF9UWVBFfSIgPSAieGxvbmciOyB0aGVuCi0gIEJGRF9IT1NUXzY0QklUX0xPTkc9MQotZWxpZiB0ZXN0ICJ4JHtIT1NUXzY0QklUX1RZUEV9IiAhPSAieCI7IHRoZW4KLSAgQkZEX0hPU1RfNjRfQklUX0RFRklORUQ9MQotICBCRkRfSE9TVF82NF9CSVQ9JHtIT1NUXzY0QklUX1RZUEV9Ci0gIEJGRF9IT1NUX1VfNjRfQklUPSR7SE9TVF9VXzY0QklUX1RZUEV9Ci1maQotQUNfU1VCU1QoQkZEX0hPU1RfNjRCSVRfTE9ORykKLUFDX1NVQlNUKEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEKQotQUNfU1VCU1QoQkZEX0hPU1RfNjRfQklUKQotQUNfU1VCU1QoQkZEX0hPU1RfVV82NF9CSVQpCi0KLUJGRF9DQ19GT1JfQlVJTEQKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdGRkZWYuaCBzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdGltZS5oIHVuaXN0ZC5oKQotQUNfQ0hFQ0tfSEVBREVSUyhmY250bC5oIHN5cy9maWxlLmggc3lzL3RpbWUuaCkKLUFDX0hFQURFUl9USU1FCi1BQ19IRUFERVJfRElSRU5UCi1BQ19DSEVDS19GVU5DUyhmY250bCBnZXRwYWdlc2l6ZSBzZXRpdGltZXIgc3lzY29uZiBmZG9wZW4gZ2V0dWlkIGdldGdpZCkKLQotQkZEX0JJTkFSWV9GT1BFTgotCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihtYWxsb2MpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihyZWFsbG9jKQotQkZEX05FRURfREVDTEFSQVRJT04oZnJlZSkKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGdldGVudikKLQotIyBJZiB3ZSBhcmUgY29uZmlndXJlZCBuYXRpdmUsIHBpY2sgYSBjb3JlIGZpbGUgc3VwcG9ydCBmaWxlLgotQ09SRUZJTEU9Ci1DT1JFRkxBRz0KLVRSQURfSEVBREVSPQotaWYgdGVzdCAiJHt0YXJnZXR9IiA9ICIke2hvc3R9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICBhbHBoYSotKi1saW51eC1nbnUqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvYWxwaGFsaW51eC5oIicKLQk7OwotICBhbHBoYSotKi1uZXRic2QqKQlDT1JFRklMRT1uZXRic2QtY29yZS5sbyA7OwotICBhbHBoYSotKi0qKQkJQ09SRUZJTEU9b3NmLWNvcmUubG8gOzsKLSAgYXJtLSotcmlzY2l4KQkJQ09SRUZJTEU9dHJhZC1jb3JlLmxvIDs7Ci0gIGhwcGEqLSotaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLWhpdXgqKQlDT1JFRklMRT1ocHV4LWNvcmUubG8gOzsKLSAgaHBwYSotKi1tcGVpeCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBocHBhKi0qLWJzZCopCQlDT1JFRklMRT0iaHB1eC1jb3JlLmxvIGhwcGFic2QtY29yZS5sbyIKLQkJCUNPUkVGTEFHPSItREhQVVhfQ09SRSAtREhQUEFCU0RfQ09SRSIgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni1zZXF1ZW50LWJzZCopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvOwotCVRSQURfSEVBREVSPSciaG9zdHMvc3ltbWV0cnkuaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3Y0KikgOzsKLSAgaVszNDU2XTg2LXNlcXVlbnQtc3lzdiopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9zeW1tZXRyeS5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotYnNkKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2QqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTM4NmJzZC5oIicKLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotbmV0YnNkKiB8IGlbMzQ1Nl04Ni0qLW9wZW5ic2QqKQotY2hhbmdlcXVvdGUoWyxdKWRubAotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni1lc2l4LXN5c3YzKikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL2VzaXguaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLXNjbzMuMnY1KikKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQlDT1JFRklMRT1zY281LWNvcmUubG8KLQk7OwotY2hhbmdlcXVvdGUoLClkbmwKLSAgaVszNDU2XTg2LSotc2NvKiB8IGlbMzQ1Nl04Ni0qLWlzYyopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2c2NvLmgiJwotCTs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICBpWzM0NTZdODYtKi1tYWNoMyopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bWFjaDMuaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9pMzg2bGludXguaCInCi0JOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0gIGlbMzQ1Nl04Ni0qLWlzYyopCUNPUkVGSUxFPXRyYWQtY29yZS5sbyA7OwotICBpWzM0NTZdODYtKi1haXgqKQlDT1JFRklMRT1haXgzODYtY29yZS5sbyA7OwotY2hhbmdlcXVvdGUoWyxdKWRubAotICBpODYwLSotbWFjaDMqIHwgaTg2MC0qLW9zZjEqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvaTg2MG1hY2gzLmgiJwotCTs7Ci0gIG1pcHMtZGVjLWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9taXBzYnNkLmgiJwotCTs7Ci0gIG1pcHMtZGVjLW1hY2gzKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL21pcHNtYWNoMy5oIicKLQk7OwotICBtaXBzLSotbmV0YnNkKiB8IG1pcHMqLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBtaXBzLWRlYy0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZGVjc3RhdGlvbi5oIicKLQk7OwotICBtaXBzLXNnaS1pcml4NCopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLXNnaS1pcml4NSopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLXNnaS1pcml4NiopCUNPUkVGSUxFPWlyaXgtY29yZS5sbyA7OwotICBtaXBzLSotbWFjaDMqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbWlwc21hY2gzLmgiJwotCTs7Ci0gIG1pcHMtKi1zeXN2NCopCTs7Ci0gIG1pcHMtKi1zeXN2KiB8IG1pcHMtKi1yaXNjb3MqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvcmlzY29zLmgiJwotCTs7Ci0gIG1pcHMtc29ueS1ic2QqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvbmV3cy1taXBzLmgiJwotCTs7Ci0gIG02OCotYnVsbCotc3lzdiopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9kcHgyLmgiJwotCTs7Ci0gIG02OCotaHAtaHB1eCopCUNPUkVGSUxFPWhwdXgtY29yZS5sbyA7OwotICBtNjgqLWhwLWJzZCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9ocDMwMGJzZC5oIicKLQk7OwotICBtNjgqLSotbGludXgtZ251KikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL202OGtsaW51eC5oIicKLQk7OwotICBtNjgqLW1vdG9yb2xhLXN5c3YqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvZGVsdGE2OC5oIicKLQk7OwotICBtNjgqLXNvbnktKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL25ld3MuaCInCi0JOzsKLSAgbTY4Ki0qLW5ldGJzZCogfCBtNjgqLSotb3BlbmJzZCopCi0JQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8KLQk7OwotICBtNjgqLWFwcGxlLWF1eCopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tNjhrYXV4LmgiJwotCTs7Ci0gIG04OCotKi1zeXN2NCopCTs7Ci0gIG04OCotbW90b3JvbGEtc3lzdiopCUNPUkVGSUxFPXB0cmFjZS1jb3JlLmxvIDs7Ci0gIG04OCotKi1tYWNoMyopCi0JQ09SRUZJTEU9dHJhZC1jb3JlLmxvCi0JVFJBRF9IRUFERVI9JyJob3N0cy9tODhrbWFjaDMuaCInCi0JOzsKLSAgbnMzMmstcGM1MzItbWFjaCkKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3BjNTMybWFjaC5oIicKLQk7OwotICBuczMyay0qLW5ldGJzZCogfCBuczMyay0qLW9wZW5ic2QqKQotCUNPUkVGSUxFPW5ldGJzZC1jb3JlLmxvCi0JOzsKLSAgcnM2MDAwLSotbHlueCopCUNPUkVGSUxFPWx5bngtY29yZS5sbyA7OwotICByczYwMDAtKi1haXg0KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcnM2MDAwLSotKikJCUNPUkVGSUxFPXJzNjAwMC1jb3JlLmxvIDs7Ci0gIHBvd2VycGMtKi0qYnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWFpeDQqKQlDT1JFRklMRT1yczYwMDAtY29yZS5sbyA7OwotICBwb3dlcnBjLSotYWl4KikJQ09SRUZJTEU9cnM2MDAwLWNvcmUubG8gOzsKLSAgcG93ZXJwYy0qLWJlb3MqKQk7OwotICBwb3dlcnBjLSotbmV0YnNkKikJQ09SRUZJTEU9bmV0YnNkLWNvcmUubG8gOzsKLSAgc3BhcmMtKi1uZXRic2QqIHwgc3BhcmMtKi1vcGVuYnNkKikKLQlDT1JFRklMRT1uZXRic2QtY29yZS5sbwotCTs7Ci0gIHRhaG9lLSotKikKLQlDT1JFRklMRT10cmFkLWNvcmUubG8KLQlUUkFEX0hFQURFUj0nImhvc3RzL3RhaG9lLmgiJwotCTs7Ci0gIHZheC0qLXVsdHJpeDIqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKLQk7OwotICB2YXgtKi11bHRyaXgqKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4dWx0Mi5oIicKLQk7OwotICB2YXgtKi0qKQotCUNPUkVGSUxFPXRyYWQtY29yZS5sbwotCVRSQURfSEVBREVSPSciaG9zdHMvdmF4YnNkLmgiJwotCTs7Ci0gIGVzYWMKLQotICBjYXNlICIkQ09SRUZJTEUiIGluCi0gIGFpeDM4Ni1jb3JlLmxvKQlDT1JFRkxBRz0tREFJWDM4Nl9DT1JFIDs7Ci0gIGhwcGFic2QtY29yZS5sbykJQ09SRUZMQUc9LURIUFBBQlNEX0NPUkUgOzsKLSAgaHB1eC1jb3JlLmxvKQkJQ09SRUZMQUc9LURIUFVYX0NPUkUgOzsKLSAgaXJpeC1jb3JlLmxvKQkJQ09SRUZMQUc9LURJUklYX0NPUkUgOzsKLSAgbHlueC1jb3JlLmxvKQkJQ09SRUZMQUc9LURMWU5YX0NPUkUgOzsKLSAgbmV0YnNkLWNvcmUubG8pCUNPUkVGTEFHPS1ETkVUQlNEX0NPUkUgOzsKLSAgb3NmLWNvcmUubG8pCQlDT1JFRkxBRz0tRE9TRl9DT1JFIDs7Ci0gIHB0cmFjZS1jb3JlLmxvKQlDT1JFRkxBRz0tRFBUUkFDRV9DT1JFIDs7Ci0gIHJzNjAwMC1jb3JlLmxvKQlDT1JFRkxBRz0iJENPUkVGTEFHIC1EQUlYX0NPUkUiIDs7Ci0gIHNjbzUtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURTQ081X0NPUkUiIDs7Ci0gIHRyYWQtY29yZS5sbykJCUNPUkVGTEFHPSIkQ09SRUZMQUcgLURUUkFEX0NPUkUiIDs7Ci0gIGVzYWMKLQotICAjIEVMRiBjb3JlZmlsZSBzdXBwb3J0IGhhcyBzZXZlcmFsIGZsYXZvcnMsIGJ1dCBhbGwgb2YKLSAgIyB0aGVtIHVzZSBzb21ldGhpbmcgY2FsbGVkIDxzeXMvcHJvY2ZzLmg+Ci0gIEFDX0NIRUNLX0hFQURFUlMoc3lzL3Byb2Nmcy5oKQotICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3N5c19wcm9jZnNfaCIgPSB5ZXM7IHRoZW4KLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUocHJzdGF0dXNfdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKHByc3RhdHVzX3QsIHByX3dobykKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUocHN0YXR1c190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwcnBzaW5mb190KQotICAgIEJGRF9IQVZFX1NZU19QUk9DRlNfVFlQRShwc2luZm9fdCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEUobHdwc3RhdHVzX3QpCi0gICAgQkZEX0hBVkVfU1lTX1BST0NGU19UWVBFX01FTUJFUihsd3BzdGF0dXNfdCwgcHJfY29udGV4dCkKLSAgICBCRkRfSEFWRV9TWVNfUFJPQ0ZTX1RZUEVfTUVNQkVSKGx3cHN0YXR1c190LCBwcl9yZWcpCi0gIGZpCi1maQotQUNfU1VCU1QoQ09SRUZJTEUpCi1BQ19TVUJTVChDT1JFRkxBRykKLUFDX0RFRklORV9VTlFVT1RFRChUUkFEX0hFQURFUiwgJFRSQURfSEVBREVSLAotICBbTmFtZSBvZiBob3N0IHNwZWNpZmljIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gdHJhZC1jb3JlLmMuXSkKLQotIyBIb3JyaWJsZSBoYWNrcyB0byBidWlsZCBETExzIG9uIFdpbmRvd3MuCi1XSU4zMkxERkxBR1M9Ci1XSU4zMkxJQkFERD0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotY3lnd2luKikKLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gInllcyI7IHRoZW4KLSAgICBXSU4zMkxERkxBR1M9Ii1uby11bmRlZmluZWQiCi0gICAgV0lOMzJMSUJBREQ9Ii1MYHB3ZGAvLi4vbGliaWJlcnR5IC1saWJlcnR5IC1MYHB3ZGAvLi4vaW50bCAtbGludGwgLWxjeWd3aW4gLWxrZXJuZWwzMiIKLSAgZmkKLSAgOzsKLWVzYWMKLUFDX1NVQlNUKFdJTjMyTERGTEFHUykKLUFDX1NVQlNUKFdJTjMyTElCQUREKQotCi0jIHRhcmdldCBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotZGVmdmVjPQotc2VsdmVjcz0KLXNlbGFyY2hzPQotVERFRklORVM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotICAgIGVsc2UKLQkuICRzcmNkaXIvY29uZmlnLmJmZAotCWlmIHRlc3QgIngkdGFyZyIgPSAieCR0YXJnZXQiOyB0aGVuCi0JICAgIGRlZnZlYz0kdGFyZ19kZWZ2ZWMKLQlmaQotCXNlbHZlY3M9IiRzZWx2ZWNzICR0YXJnX2RlZnZlYyAkdGFyZ19zZWx2ZWNzIgotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0JVERFRklORVM9IiRUREVGSU5FUyAkdGFyZ19jZmxhZ3MiCi0gICAgZmkKLWRvbmUKLUFDX1NVQlNUKFRERUZJTkVTKQotCi0jIFRoaXMgcHJvY2Vzc2luZyBzdGlsbCBuZWVkcyB0byBiZSBkb25lIGlmIHdlJ3JlIHRvIGRlY2lkZSBwcm9wZXJseSB3aGV0aGVyCi0jIDY0LWJpdCBzdXBwb3J0IG5lZWRzIHRvIGJlIGNvbXBpbGVkIGluLiAgQ3VycmVudGx5LCBpdCB3aWxsIGJlIGluY2x1ZGVkIGlmCi0jIHRoZSBkZWZhdWx0IG9yIGFueSBvdGhlciBleHBsaWNpdGx5IHJlcXVlc3RlZCB0YXJnZXQgcmVxdWlyZXMgaXQ7IGl0Ci0jIHdpbGwgbm90IGJlIGluY2x1ZGVkIG9uIGEgMzItYml0IGhvc3QgaWYgbm8gNjQtYml0IHRhcmdldCBpcyByZXF1ZXN0ZWQsIGFuZAotIyBubyAiLS13aXRoLTY0LWJpdC1iZmQiIG9wdGlvbiBpcyBnaXZlbiwgZXZlbiBpZiAiLS13aXRoLXRhcmdldHM9YWxsIiBpcwotIyB1c2VkLgotCi0jIHVuaXEgdGhlIGRlZmF1bHQgYW5kIHNlbGVjdGVkIHZlY3RvcnMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsdmVjcyA7IGRvCi0gICAgY2FzZSAiICRmICIgaW4KLSAgICAqIiAkaSAiKikgOzsKLSAgICAqKSBmPSIkZiAkaSIgOzsKLSAgICBlc2FjCi1kb25lCi1zZWx2ZWNzPSIkZiIKLQotCi0jIHVuaXEgdGhlIGFyY2hpdGVjdHVyZXMgaW4gYWxsIHRoZSBjb25maWd1cmVkIHRhcmdldHMuCi1mPSIiCi1mb3IgaSBpbiAkc2VsYXJjaHMgOyBkbwotICAgIGNhc2UgIiAkZiAiIGluCi0gICAgKiIgJGkgIiopIDs7Ci0gICAgKikgZj0iJGYgJGkiIDs7Ci0gICAgZXNhYwotZG9uZQotc2VsYXJjaHM9IiRmIgotCi0jIFRhcmdldCBiYWNrZW5kIC5vIGZpbGVzLgotdGI9Ci0KLWVsZj0iZWxmLmxvIGVsZmxpbmsubG8gZHdhcmYyLmxvIGR3YXJmMS5sbyIKLQotZm9yIHZlYyBpbiAkc2VsdmVjcwotZG8KLSAgICBjYXNlICIkdmVjIiBpbgotICAgICMgVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQotICAgICMgd2l0aCB0aGUgdHdvIHZlY3RvciBsaXN0cyBpbiB0YXJnZXRzLmMuCi0gICAgYTI5a2NvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1hMjlrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGFfb3V0X2Fkb2JlX3ZlYykJCXRiPSIkdGIgYW91dC1hZG9iZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYXJtY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtY29mZl9iaWdfdmVjKQkJdGI9IiR0YiBjb2ZmLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtcGVfbGl0dGxlX3ZlYykJCXRiPSIkdGIgcGUtYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZV9iaWdfdmVjKQkJdGI9IiR0YiBwZS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFybXBlaV9saXR0bGVfdmVjKQkJdGI9IiR0YiBwZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlLWFybS5sbyBjb2ZmbGluay5sbyAiIDs7Ci0gICAgYXJtX2Vwb2NfcGVpX2xpdHRsZV92ZWMpCXRiPSIkdGIgZXBvYy1wZWktYXJtLmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYykJdGI9IiR0YiBlcG9jLXBlaS1hcm0ubG8gY29mZmxpbmsubG8gIiA7OwotICAgIGFvdXQwX2JpZ192ZWMpCQl0Yj0iJHRiIGFvdXQwLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBhb3V0X2FybV9iaWdfdmVjKQkJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9hcm1fbGl0dGxlX3ZlYykJdGI9IiR0YiBhb3V0LWFybS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgYW91dF9taXBzX2JpZ192ZWMpCQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFvdXRfbWlwc19saXR0bGVfdmVjKQl0Yj0iJHRiIG1pcHNic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGFwb2xsb2NvZmZfdmVjKQkJdGI9IiR0YiBjb2ZmLWFwb2xsby5sbyIgOzsKLSAgICBiX291dF92ZWNfYmlnX2hvc3QpCQl0Yj0iJHRiIGJvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGJfb3V0X3ZlY19saXR0bGVfaG9zdCkJdGI9IiR0YiBib3V0LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYWxwaGFfdmVjKQl0Yj0iJHRiIGVsZjY0LWFscGhhLmxvIGVsZjY0LmxvICRlbGYiCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9saXR0bGVhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYykgdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcmNfdmVjKQl0Yj0iJHRiIGVsZjMyLWFyYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjKQl0Yj0iJHRiIGVsZmFybS1uYWJpLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2JpZ2FybV9vYWJpX3ZlYykJdGI9IiR0YiBlbGZhcm0tb2FiaS5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdfZ2VuZXJpY192ZWMpIAl0Yj0iJHRiIGVsZjMyLWdlbi5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9iaWdtaXBzX3ZlYykgCXRiPSIkdGIgZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIgOzsKLSAgICBiZmRfZWxmNjRfYmlnbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjY0LW1pcHMubG8gZWxmNjQubG8gZWxmMzItbWlwcy5sbyBlbGYzMi5sbyAkZWxmIGVjb2ZmbGluay5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjMyX2QxMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMTB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2QzMHZfdmVjKQkJdGI9IiR0YiBlbGYzMi1kMzB2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2ZyMzBfdmVjKQkJdGI9IiR0YiBlbGYzMi1mcjMwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2hwcGFfdmVjKQkJdGI9IiR0YiBlbGYzMi1ocHBhLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2kzODZfdmVjKQkJdGI9IiR0YiBlbGYzMi1pMzg2LmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k4NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pODYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2k5NjBfdmVjKQkJdGI9IiR0YiBlbGYzMi1pOTYwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGYzMi1nZW4ubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMpIAl0Yj0iJHRiIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjKSAJdGI9IiR0YiBlbGY2NC1taXBzLmxvIGVsZjY0LmxvIGVsZjMyLW1pcHMubG8gZWxmMzIubG8gJGVsZiBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGJmZF9lbGYzMl9tMzJyX3ZlYykJCXRiPSIkdGIgZWxmMzItbTMyci5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tNjhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTY4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tODhrX3ZlYykJCXRiPSIkdGIgZWxmMzItbTg4ay5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjKQl0Yj0iJHRiIGVsZjMyLW1jb3JlLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWMpCXRiPSIkdGIgZWxmMzItbWNvcmUubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfbW4xMDIwMF92ZWMpCXRiPSIkdGIgZWxmLW0xMDIwMC5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9tbjEwMzAwX3ZlYykJdGI9IiR0YiBlbGYtbTEwMzAwLmxvIGVsZjMyLmxvICRlbGYiIDs7Ci0gICAgYmZkX2VsZjMyX3Bvd2VycGNfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjKQl0Yj0iJHRiIGVsZjMyLXBwYy5sbyBlbGYzMi5sbyAkZWxmIiA7OwotICAgIGJmZF9lbGYzMl9zaF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXNoLmxvIGVsZjMyLmxvICRlbGYgY29mZi1zaC5sbyIgOzsKLSAgICBiZmRfZWxmMzJfc2hsX3ZlYykJCXRiPSIkdGIgZWxmMzItc2gubG8gZWxmMzIubG8gJGVsZiBjb2ZmLXNoLmxvIiA7OwotICAgIGJmZF9lbGYzMl9zcGFyY192ZWMpCXRiPSIkdGIgZWxmMzItc3BhcmMubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmMzJfdjg1MF92ZWMpCQl0Yj0iJHRiIGVsZjMyLXY4NTAubG8gZWxmMzIubG8gJGVsZiIgOzsKLSAgICBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjKSAJdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYykgdGI9IiR0YiBlbGY2NC1nZW4ubG8gZWxmNjQubG8gJGVsZiIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgYmZkX2VsZjY0X3NwYXJjX3ZlYykJdGI9IiR0YiBlbGY2NC1zcGFyYy5sbyBlbGY2NC5sbyAkZWxmIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICBjaXNjb19jb3JlX3ZlYykJCXRiPSIkdGIgY2lzY28tY29yZS5sbyIgOzsKLSAgICBkZW1vXzY0X3ZlYykJCXRiPSIkdGIgZGVtbzY0LmxvIGFvdXQ2NC5sbyIKLQkJCQl0YXJnZXQ2ND10cnVlIDs7Ci0gICAgZWNvZmZfYmlnX3ZlYykJCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLW1pcHMubG8gZWNvZmYubG8gZWNvZmZsaW5rLmxvIiA7OwotICAgIGVjb2ZmX2JpZ2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1taXBzLmxvIGVjb2ZmLmxvIGVjb2ZmbGluay5sbyIgOzsKLSAgICBlY29mZmFscGhhX2xpdHRsZV92ZWMpCXRiPSIkdGIgY29mZi1hbHBoYS5sbyBlY29mZi5sbyBlY29mZmxpbmsubG8iCi0JCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIGdvMzJjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1nbzMyLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGdvMzJzdHViYmVkY29mZl92ZWMpCXRiPSIkdGIgY29mZi1zdGdvMzIubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaDgzMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1oODMwMC5sbyByZWxvYzE2LmxvIiA7OwotICAgIGg4NTAwY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtaDg1MDAubG8gcmVsb2MxNi5sbyIgOzsKLSAgICBob3N0X2FvdXRfdmVjKQkJdGI9IiR0YiBob3N0LWFvdXQubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwYnNkX3ZlYykJCXRiPSIkdGIgaHAzMDBic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGhwMzAwaHB1eF92ZWMpCQl0Yj0iJHRiIGhwMzAwaHB1eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmFvdXRfdmVjKQkJdGI9IiR0YiBpMzg2YW91dC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmJzZF92ZWMpCQl0Yj0iJHRiIGkzODZic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pMzg2LmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGkzODZkeW5peF92ZWMpCQl0Yj0iJHRiIGkzODZkeW5peC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4NmZyZWVic2RfdmVjKQkJdGI9IiR0YiBpMzg2ZnJlZWJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm1zZG9zX3ZlYykJCXRiPSIkdGIgaTM4Nm1zZG9zLmxvIiA7OwotICAgIGkzODZwZV92ZWMpCQkJdGI9IiR0YiBwZS1pMzg2LmxvIGNvZmZsaW5rLmxvICIgOzsKLSAgICBpMzg2cGVpX3ZlYykJCXRiPSIkdGIgcGVpLWkzODYubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaTM4NmxpbnV4X3ZlYykJCXRiPSIkdGIgaTM4NmxpbnV4LmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9hb3V0X3ZlYykJCXRiPSIkdGIgaTM4Nmx5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBpMzg2bHlueF9jb2ZmX3ZlYykJCXRiPSIkdGIgY2YtaTM4Nmx5bngubG8gY29mZmxpbmsubG8gbHlueC1jb3JlLmxvIiA7OwotICAgIGkzODZtYWNoM192ZWMpCQl0Yj0iJHRiIGkzODZtYWNoMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgaTM4Nm5ldGJzZF92ZWMpCQl0Yj0iJHRiIGkzODZuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIGkzODZvczlrX3ZlYykJCXRiPSIkdGIgaTM4Nm9zOWsubG8gYW91dDMyLmxvIiA7OwotICAgIGk4NjBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1pODYwLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIGljb2ZmX2JpZ192ZWMpCQl0Yj0iJHRiIGNvZmYtaTk2MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBpY29mZl9saXR0bGVfdmVjKQkJdGI9IiR0YiBjb2ZmLWk5NjAubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgaWVlZV92ZWMpCQkJdGI9IiR0YiBpZWVlLmxvIiA7OwotICAgIG02OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtjb2ZmdW5fdmVjKQkJdGI9IiR0YiBjb2ZmLXU2OGsubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtsaW51eF92ZWMpCQl0Yj0iJHRiIG02OGtsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfYW91dF92ZWMpCQl0Yj0iJHRiIG02OGtseW54LmxvIGx5bngtY29yZS5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLW02OGtseW54LmxvIGNvZmYtbTY4ay5sbyBjb2ZmbGluay5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgbTY4a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGtuZXRic2QubG8gYW91dDMyLmxvIiA7OwotICAgIG02OGs0a25ldGJzZF92ZWMpCQl0Yj0iJHRiIG02OGs0a25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbTY4a2F1eF9jb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1hdXgubG8gY29mZi1tNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG02OGtzeXN2Y29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtc3ZtNjhrLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG04OGtiY3NfdmVjKQkJdGI9IiR0YiBjb2ZmLW04OGsubG8iIDs7Ci0gICAgbWNvcmVfcGVfYmlnX3ZlYykJCXRiPSIkdGIgcGUtbWNvcmUubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgbWNvcmVfcGVfbGl0dGxlX3ZlYykJdGI9IiR0YiBwZS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBtY29yZV9wZWlfYmlnX3ZlYykJCXRiPSIkdGIgcGVpLW1jb3JlLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIG1jb3JlX3BlaV9saXR0bGVfdmVjKQl0Yj0iJHRiIHBlaS1tY29yZS5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBuZXdzb3MzX3ZlYykJCXRiPSIkdGIgbmV3c29zMy5sbyBhb3V0MzIubG8iIDs7Ci0gICAgbmxtMzJfaTM4Nl92ZWMpCQl0Yj0iJHRiIG5sbTMyLWkzODYubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX3NwYXJjX3ZlYykJCXRiPSIkdGIgbmxtMzItc3BhcmMubG8gbmxtMzIubG8gbmxtLmxvIiA7OwotICAgIG5sbTMyX2FscGhhX3ZlYykJCXRiPSIkdGIgbmxtMzItYWxwaGEubG8gbmxtMzIubG8gbmxtLmxvIgotCQkJCXRhcmdldDY0PXRydWUgOzsKLSAgICByaXNjaXhfdmVjKQkJCXRiPSIkdGIgYW91dDMyLmxvIHJpc2NpeC5sbyIgOzsKLSAgICBubG0zMl9wb3dlcnBjX3ZlYykJCXRiPSIkdGIgbmxtMzItcHBjLmxvIG5sbTMyLmxvIG5sbS5sbyIgOzsKLSAgICBwYzUzMm5ldGJzZF92ZWMpCQl0Yj0iJHRiIG5zMzJrbmV0YnNkLmxvIGFvdXQtbnMzMmsubG8iIDs7Ci0gICAgcGM1MzJtYWNoYW91dF92ZWMpCQl0Yj0iJHRiIHBjNTMyLW1hY2gubG8gYW91dC1uczMyay5sbyIgOzsKLSAgICBwbWFjX3hjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1wbWFjLmxvIHhjb2ZmbGluay5sbyIgOzsKLSAgICByczYwMDBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1yczYwMDAubG8geGNvZmZsaW5rLmxvIiA7OwotICAgIGJmZF9wb3dlcnBjX3BlX3ZlYykgICAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjbGVfcGVfdmVjKSAgICAgICB0Yj0iJHRiIHBlLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsgIAotICAgIGJmZF9wb3dlcnBjX3BlaV92ZWMpICAgICAgICB0Yj0iJHRiIHBlaS1wcGMubG8gY29mZmxpbmsubG8iIDs7Ci0gICAgYmZkX3Bvd2VycGNsZV9wZWlfdmVjKSAgICAgIHRiPSIkdGIgcGVpLXBwYy5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBwcGNib290X3ZlYykJCXRiPSIkdGIgcHBjYm9vdC5sbyIgOzsKLSAgICBzaGNvZmZfdmVjKQkJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGxjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zaC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICBzaGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNobGNvZmZfc21hbGxfdmVjKQkJdGI9IiR0YiBjb2ZmLXNoLmxvIGNvZmZsaW5rLmxvIiA7OwotICAgIHNvbV92ZWMpCQkJdGI9IiR0YiBzb20ubG8iIDs7Ci0gICAgc3BhcmNsZV9hb3V0X3ZlYykJCXRiPSIkdGIgYW91dC1zcGFyY2xlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2xpbnV4X3ZlYykJCXRiPSIkdGIgc3BhcmNsaW51eC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNseW54X2FvdXRfdmVjKQkJdGI9IiR0YiBzcGFyY2x5bngubG8gbHlueC1jb3JlLmxvIGFvdXQzMi5sbyIgOzsKLSAgICBzcGFyY2x5bnhfY29mZl92ZWMpCQl0Yj0iJHRiIGNmLXNwYXJjbHlueC5sbyBseW54LWNvcmUubG8iIDs7Ci0gICAgc3BhcmNuZXRic2RfdmVjKQkJdGI9IiR0YiBzcGFyY25ldGJzZC5sbyBhb3V0MzIubG8iIDs7Ci0gICAgc3BhcmNjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi1zcGFyYy5sbyIgOzsKLSAgICBzcmVjX3ZlYykJCQl0Yj0iJHRiIHNyZWMubG8iIDs7Ci0gICAgc3Vub3NfYmlnX3ZlYykJCXRiPSIkdGIgc3Vub3MubG8gYW91dDMyLmxvIiA7OwotICAgIHN5bWJvbHNyZWNfdmVjKQkJdGI9IiR0YiBzcmVjLmxvIiA7OwotICAgIHRla2hleF92ZWMpCQkJdGI9IiR0YiB0ZWtoZXgubG8iIDs7Ci0gICAgdGljMzBfYW91dF92ZWMpCQl0Yj0iJHRiIGFvdXQtdGljMzAubG8iIDs7Ci0gICAgdGljMzBfY29mZl92ZWMpCQl0Yj0iJHRiIGNvZmYtdGljMzAubG8iIDs7Ci0gICAgdGljODBjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi10aWM4MC5sbyBjb2ZmbGluay5sbyIgOzsKLSAgICB2ZXJzYWRvc192ZWMpCQl0Yj0iJHRiIHZlcnNhZG9zLmxvIiA7OwotICAgIHZtc19hbHBoYV92ZWMpCQl0Yj0iJHRiIHZtcy5sbyB2bXMtaGRyLmxvIHZtcy1nc2QubG8gdm1zLXRpci5sbyB2bXMtbWlzYy5sbyIKLSAJCQkJdGFyZ2V0NjQ9dHJ1ZSA7OwotICAgIHZtc192YXhfdmVjKQkJdGI9IiR0YiB2bXMubG8gdm1zLWhkci5sbyB2bXMtZ3NkLmxvIHZtcy10aXIubG8gdm1zLW1pc2MubG8iIDs7Ci0gICAgdzY1X3ZlYykJCQl0Yj0iJHRiIGNvZmYtdzY1LmxvIHJlbG9jMTYubG8iIDs7Ci0gICAgd2UzMmtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi13ZTMyay5sbyIgOzsKLSAgICB6OGtjb2ZmX3ZlYykJCXRiPSIkdGIgY29mZi16OGsubG8gcmVsb2MxNi5sbyIgOzsKLQotICAgICIiKQkJCTs7Ci0gICAgKikgQUNfTVNHX0VSUk9SKCoqKiB1bmtub3duIHRhcmdldCB2ZWN0b3IgJHZlYykgOzsKLSAgICBlc2FjCi1kb25lCi0KLSMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KLSMgQSBjb3VwbGUgb2YgQ1BVcyB1c2Ugc2hvcnRlciBmaWxlIG5hbWVzIHRvIGF2b2lkIHByb2JsZW1zIG9uIERPUwotIyBmaWxlc3lzdGVtcy4KLXRhPWBlY2hvICRzZWxhcmNocyB8IHNlZCAtZSBzL2JmZF8vY3B1LS9nIC1lIHMvX2FyY2gvLmxvL2cgLWUgcy9tbjEwMjAwL20xMDIwMC8gLWUgcy9tbjEwMzAwL20xMDMwMC9gCi0KLSMgV2VlZCBvdXQgZHVwbGljYXRlIC5vIGZpbGVzLgotZj0iIgotZm9yIGkgaW4gJHRiIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXRiPSIkZiIKLQotZj0iIgotZm9yIGkgaW4gJHRhIDsgZG8KLSAgICBjYXNlICIgJGYgIiBpbgotICAgICoiICRpICIqKSA7OwotICAgICopIGY9IiRmICRpIiA7OwotICAgIGVzYWMKLWRvbmUKLXRhPSIkZiIKLQotYmZkX2JhY2tlbmRzPSIkdGIiCi1iZmRfbWFjaGluZXM9IiR0YSIKLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZSA7IHRoZW4KLSAgYmZkX2JhY2tlbmRzPSIke2JmZF9iYWNrZW5kc30iJyAkKEFMTF9CQUNLRU5EUyknCi0gIGJmZF9tYWNoaW5lcz0iJHtiZmRfbWFjaGluZXN9IicgJChBTExfTUFDSElORVMpJwotICBzZWx2ZWNzPQotICBoYXZldmVjcz0KLSAgc2VsYXJjaHM9Ci1lbHNlCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotICAjIE9ubHkgc2V0IHRoZXNlIGlmIHRoZXkgd2lsbCBiZSBub25lbXB0eSwgZm9yIHRoZSBjbGV2ZXIgZWNoby4KLSAgaGF2ZXZlY3M9Ci0gIHRlc3QgLW4gIiRzZWx2ZWNzIiAmJgotICAgIGhhdmV2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vLURIQVZFXy8nIC1lICdzLyBcKC5cKS8gLURIQVZFX1wxL2cnYAotICB0ZXN0IC1uICIkc2VsdmVjcyIgJiYKLSAgICBzZWx2ZWNzPWBlY2hvICRzZWx2ZWNzIHwgc2VkIC1lICdzL14vXCYvJyAtZSAncy8gXCguXCkvLFwmXDEvZydgCi0gIHRlc3QgLW4gIiRzZWxhcmNocyIgJiYKLSAgICBzZWxhcmNocz1gZWNobyAkc2VsYXJjaHMgfCBzZWQgLWUgJ3MvXi9cJi8nIC1lICdzLyBcKC5cKS8sXCZcMS9nJ2AKLWZpCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotCi1jYXNlICR7aG9zdDY0fS0ke3RhcmdldDY0fS0ke3dhbnQ2NH0gaW4KLSAgKnRydWUqKQotICAgIHdvcmRzaXplPTY0Ci0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDY0X0JBQ0tFTkRTKSAkKEJGRDMyX0JBQ0tFTkRTKScKLSAgICBpZiB0ZXN0IC16ICIkR0NDIiAmJiB0ZXN0ICIkQkZEX0hPU1RfNjRCSVRfTE9ORyIgPSAiMCIgJiYgdGVzdCAiJEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEIiA9ICIwIjsgdGhlbgotICAgICAgQUNfTVNHX1dBUk4oW1lvdSBoYXZlIHJlcXVlc3RlZCBhIDY0IGJpdCBCRkQgY29uZmlndXJhdGlvbiwgYnV0XSkKLSAgICAgIEFDX01TR19XQVJOKFt5b3VyIGNvbXBpbGVyIG1heSBub3QgaGF2ZSBhIDY0IGJpdCBpbnRlZ3JhbCB0eXBlXSkKLSAgICBmaQotICAgIDs7Ci0gIGZhbHNlLWZhbHNlLWZhbHNlKQotICAgIHdvcmRzaXplPTMyCi0gICAgYWxsX2JhY2tlbmRzPSckKEJGRDMyX0JBQ0tFTkRTKScKLSAgICA7OwotZXNhYwotCi1BQ19TVUJTVCh3b3Jkc2l6ZSkKLUFDX1NVQlNUKGFsbF9iYWNrZW5kcykKLUFDX1NVQlNUKGJmZF9iYWNrZW5kcykKLUFDX1NVQlNUKGJmZF9tYWNoaW5lcykKLQotdGRlZmF1bHRzPSIiCi10ZXN0IC1uICIke2RlZnZlY30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9IC1EREVGQVVMVF9WRUNUT1I9JHtkZWZ2ZWN9IgotdGVzdCAtbiAiJHtzZWx2ZWNzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfVkVDUz0nJHtzZWx2ZWNzfSciCi10ZXN0IC1uICIke3NlbGFyY2hzfSIgJiYgdGRlZmF1bHRzPSIke3RkZWZhdWx0c30gLURTRUxFQ1RfQVJDSElURUNUVVJFUz0nJHtzZWxhcmNoc30nIgotdGVzdCAtbiAiJHtoYXZldmVjc30iICYmIHRkZWZhdWx0cz0iJHt0ZGVmYXVsdHN9ICR7aGF2ZXZlY3N9IgotQUNfU1VCU1QodGRlZmF1bHRzKQotCi1kbmwgQUNfQ0hFQ0tfSEVBREVSUyhzeXMvbW1hbi5oKQotQUNfRlVOQ19NTUFQCi1BQ19DSEVDS19GVU5DUyhtYWR2aXNlIG1wcm90ZWN0KQotY2FzZSAke3dhbnRfbW1hcH0rJHthY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkfSBpbgotICB0cnVlK3llcyApICBBQ19ERUZJTkUoVVNFX01NQVAsIDEsIFtVc2UgbW1hcCBpZiBpdCdzIGF2YWlsYWJsZT9dKSA7OwotZXNhYwotCi1ybSAtZiBkb2MvY29uZmlnLnN0YXR1cwotQUNfT1VUUFVUKE1ha2VmaWxlIGRvYy9NYWtlZmlsZSBiZmQtaW4zLmg6YmZkLWluMi5oIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlXSkKZGlmZiAtLWdpdCBhL2JmZC9jb3JlZmlsZS5jIGIvYmZkL2NvcmVmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMmY1MTkuLjAwMDAwMDAKLS0tIGEvYmZkL2NvcmVmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyogQ29yZSBmaWxlIGdlbmVyaWMgaW50ZXJmYWNlIHJvdXRpbmVzIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCUNvcmUgZmlsZXMKLQotREVTQ1JJUFRJT04KLQlUaGVzZSBhcmUgZnVuY3Rpb25zIHBlcnRhaW5pbmcgdG8gY29yZSBmaWxlcy4KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotCi1TWU5PUFNJUwotCUNPTlNUIGNoYXIgKmJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kKGJmZCAqYWJmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcmVhZC1vbmx5IHN0cmluZyBleHBsYWluaW5nIHdoaWNoIHByb2dyYW0gd2FzIHJ1bm5pbmcKLQl3aGVuIGl0IGZhaWxlZCBhbmQgcHJvZHVjZWQgdGhlIGNvcmUgZmlsZSBAdmFye2FiZmR9LgotCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX2NvcmUpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQsIChhYmZkKSk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLQotU1lOT1BTSVMKLQlpbnQgYmZkX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbChiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybnMgdGhlIHNpZ25hbCBudW1iZXIgd2hpY2ggY2F1c2VkIHRoZSBjb3JlIGR1bXAgd2hpY2gKLQlnZW5lcmF0ZWQgdGhlIGZpbGUgdGhlIEJGRCBAdmFye2FiZmR9IGlzIGF0dGFjaGVkIHRvLgotKi8KLQotaW50Ci1iZmRfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX2NvcmUpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCwgKGFiZmQpKTsKLX0KLQotCi0vKgotRlVOQ1RJT04KLQljb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQotU1lOT1BTSVMKLQlib29sZWFuIGNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkoYmZkICpjb3JlX2JmZCwgYmZkICpleGVjX2JmZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIDw8dHJ1ZT4+IGlmIHRoZSBjb3JlIGZpbGUgYXR0YWNoZWQgdG8gQHZhcntjb3JlX2JmZH0KLQl3YXMgZ2VuZXJhdGVkIGJ5IGEgcnVuIG9mIHRoZSBleGVjdXRhYmxlIGZpbGUgYXR0YWNoZWQgdG8KLQlAdmFye2V4ZWNfYmZkfSwgPDxmYWxzZT4+IG90aGVyd2lzZS4KLSovCi1ib29sZWFuCi1jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICAgIGlmICgoY29yZV9iZmQtPmZvcm1hdCAhPSBiZmRfY29yZSkgfHwgKGV4ZWNfYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdCkpIHsKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICByZXR1cm4gQkZEX1NFTkQgKGNvcmVfYmZkLCBfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wLAotCQkgICAgIChjb3JlX2JmZCwgZXhlY19iZmQpKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtYTI5ay5jIGIvYmZkL2NwdS1hMjlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDI1YTQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hMjlrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFNRCAyOTAwMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYTI5a19hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfYTI5aywKLSAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJhMjlrIiwKLSAgICAiYTI5ayIsCi0gICAgNCwKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtYWxwaGEuYyBiL2JmZC9jcHUtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg5OTAwYi4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEFscGhhIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKEJJVFNfV09SRCwgQklUU19BRERSLCBOVU1CRVIsIFBSSU5ULCBERUZBVUxULCBORVhUKSBcCi0gIHsJCQkJCQkJXAotICAgIEJJVFNfV09SRCwgLyogYml0cyBpbiBhIHdvcmQgKi8JCQlcCi0gICAgQklUU19BRERSLCAvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8JCQlcCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwkJCQlcCi0gICAgYmZkX2FyY2hfYWxwaGEsCQkJCQlcCi0gICAgTlVNQkVSLAkJCQkJCVwKLSAgICAiYWxwaGEiLAkJCQkJCVwKLSAgICBQUklOVCwJCQkJCQlcCi0gICAgMywJCQkJCQkJXAotICAgIERFRkFVTFQsCQkJCQkJXAotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQkJCVwKLSAgICBORVhULAkJCQkJCVwKLSAgfQotCi0jZGVmaW5lIE5OKGluZGV4KSAoJmFyY2hfaW5mb19zdHJ1Y3RbaW5kZXhdKQotCi0vKiBUaGVzZSBleGlzdCBvbmx5IHNvIHRoYXQgd2UgY2FuIHJlc29uYWJseSBkaXNhc3NlbWJsZSBQQUxjb2RlLiAgKi8KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIE4gKDY0LCA2NCwgYmZkX21hY2hfYWxwaGFfZXY0LCAiYWxwaGE6ZXY0IiwgZmFsc2UsIE5OKDEpKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9hbHBoYV9ldjUsICJhbHBoYTpldjUiLCBmYWxzZSwgTk4oMikpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX2FscGhhX2V2NiwgImFscGhhOmV2NiIsIGZhbHNlLCAwKSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYWxwaGFfYXJjaCA9Ci0gIE4gKDY0LCA2NCwgMCwgImFscGhhIiwgdHJ1ZSwgTk4oMCkpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1hcmMuYyBiL2JmZC9jcHUtYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZTU5ZDQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1hcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgQVJDIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQyhtYWNoLCBwcmludF9uYW1lLCBkZWZhdWx0X3AsIG5leHQpIFwKLXsJCQkJCVwKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8JCVwKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQlcCi0gICAgYmZkX2FyY2hfYXJjLAkJCVwKLSAgICBtYWNoLAkJCQlcCi0gICAgImFyYyIsCQkJCVwKLSAgICBwcmludF9uYW1lLAkJCQlcCi0gICAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JXAotICAgIGRlZmF1bHRfcCwJCQkJXAotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJXAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCQkJXAotICAgIG5leHQsCQkJCVwKLSAgfQotCi0jaWYgMCAvKiA/Pz8gTm90IGN1cnJlbnRseSBuZWVkZWQsIGJ1dCBrZWVwIGluIGZvciBmdXR1cmUgcmVmZXJlbmNlLiAgKi8KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgQVJDIChiZmRfbWFjaF9hcmNfZm9vLCAiYXJjLWZvbyIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIEFSQyAoYmZkX21hY2hfYXJjX2JhciwgImFyYy1iYXIiLCBmYWxzZSwgMCksCi19OwotI2VuZGlmCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfYXJjX2FyY2ggPQotICBBUkMgKGJmZF9tYWNoX2FyY19iYXNlLCAiYXJjLWJhc2UiLCB0cnVlLCAwIC8qJmFyY2hfaW5mb19zdHJ1Y3RbMF0qLyk7Ci0MCi0vKiBVdGlsaXR5IHJvdXRpbmVzLiAgKi8KLQotLyogR2l2ZW4gY3B1IHR5cGUgTkFNRSwgcmV0dXJuIGl0cyBiZmRfbWFjaF9hcmNfeHh4IHZhbHVlLgotICAgUmV0dXJucyAtMSBpZiBub3QgZm91bmQuICAqLwotCi1pbnQKLWFyY19nZXRfbWFjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpwOwotCi0gIGZvciAocCA9ICZiZmRfYXJjX2FyY2g7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgLyogKzQ6IHNraXAgb3ZlciAiYXJjLSIgKi8KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHAtPnByaW50YWJsZV9uYW1lICsgNCkgPT0gMCkKLQlyZXR1cm4gcC0+bWFjaDsKLSAgICB9Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtYXJtLmMgYi9iZmQvY3B1LWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk5YzBmLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBBUk0gcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHNjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHdoaWNoIEFSTQotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGEsYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICogYjsKLXsKLSAgLyogSWYgYSAmIGIgYXJlIGZvciBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlIHdlIGNhbiBkbyBub3RoaW5nICovCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2gpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBhICYgYiBhcmUgZm9yIHRoZSBzYW1lIG1hY2hpbmUgdGhlbiBhbGwgaXMgd2VsbCAqLwotICBpZiAoYS0+bWFjaCA9PSBiLT5tYWNoKQotICAgIHJldHVybiBhOwotCi0gIC8qIE90aGVyd2lzZSBpZiBlaXRoZXIgYSBvciBiIGlzIHRoZSAnZGVmYXVsdCcgbWFjaGluZSB0aGVuCi0gICAgIGl0IGNhbiBiZSBwb2x5bW9ycGhlZCBpbnRvIHRoZSBvdGhlciAqLwotICBpZiAoYS0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGI7Ci0gIAotICBpZiAoYi0+dGhlX2RlZmF1bHQpCi0gICAgcmV0dXJuIGE7Ci0KLSAgLyogU28gZmFyIGFsbCBuZXdlciBBUk0gYXJjaGl0ZWN0dXJlIGNvcmVzIGFyZSBzdXBlcnNldHMgb2YgcHJldmlvdXMgY29yZXMgKi8KLSAgaWYgKGEtPm1hY2ggPCBiLT5tYWNoKQotICAgIHJldHVybiBiOwotICBlbHNlIGlmIChhLT5tYWNoID4gYi0+bWFjaCkKLSAgICByZXR1cm4gYTsKLQotICAvKiBOZXZlciByZWFjaGVkISAqLwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdAotewotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgY2hhciAqICAgICAgICAgICAgICAgIG5hbWU7Ci19Ci1wcm9jZXNzb3JzW10gPQotewotICB7IGJmZF9tYWNoX2FybV8yLCAgImFybTIiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTI1MCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8yYSwgImFybTMiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYwMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTYxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTciICAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTcxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTc1MDAiICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkIiAgICB9LAotICB7IGJmZF9tYWNoX2FybV8zLCAgImFybTdkaSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbSIgICB9LAotICB7IGJmZF9tYWNoX2FybV8zTSwgImFybTdkbWkiICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgiICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgImFybTgxMCIgICB9LAotICB7IGJmZF9tYWNoX2FybV80LCAgInNhMSIgICAgICB9LAotICB7IGJmZF9tYWNoX2FybV80VCwgImFybTd0ZG1pIiB9Ci19OwotCi1zdGF0aWMgYm9vbGVhbiAKLXNjYW4gKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKiBpbmZvOwotICAgICBjb25zdCBjaGFyICogc3RyaW5nOwotewotICBpbnQgIGk7Ci0KLSAgLyogRmlyc3QgdGVzdCBmb3IgYW4gZXhhY3QgbWF0Y2ggKi8KLSAgaWYgKHN0cmNhc2VjbXAgKHN0cmluZywgaW5mby0+cHJpbnRhYmxlX25hbWUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTmV4dCBjaGVjayBmb3IgYSBwcm9jZXNzb3IgbmFtZSBpbnN0ZWFkIG9mIGFuIEFyY2hpdGVjdHVyZSBuYW1lICovCi0gIGZvciAoaSA9IHNpemVvZiAocHJvY2Vzc29ycykgLyBzaXplb2YgKHByb2Nlc3NvcnNbMF0pOyBpLS07KQotICAgIHsKLSAgICAgIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIHByb2Nlc3NvcnNbIGkgXS5uYW1lKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSAhPSAtMSAmJiBpbmZvLT5hcmNoID09IHByb2Nlc3NvcnNbIGkgXS5hcmNoKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpbmFsbHkgY2hlY2sgZm9yIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSAqLwotICBpZiAoc3RyY2FzZWNtcCAoc3RyaW5nLCAiYXJtIikgPT0gMCkKLSAgICByZXR1cm4gaW5mby0+dGhlX2RlZmF1bHQ7Ci0gIAotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2RlZmluZSBOKG51bWJlciwgcHJpbnQsIGRlZmF1bHQsIG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX2FybSwgbnVtYmVyLCAiYXJtIiwgcHJpbnQsIDQsIGRlZmF1bHQsIGNvbXBhdGlibGUsIHNjYW4sIG5leHQgfQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17IAotICBOKCBiZmRfbWFjaF9hcm1fMiwgICJhcm12MiIsICBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzFdICksCi0gIE4oIGJmZF9tYWNoX2FybV8yYSwgImFybXYyYSIsIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbMl0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzMsICAiYXJtdjMiLCAgZmFsc2UsICYgYXJjaF9pbmZvX3N0cnVjdFszXSApLAotICBOKCBiZmRfbWFjaF9hcm1fM00sICJhcm12M20iLCBmYWxzZSwgJiBhcmNoX2luZm9fc3RydWN0WzRdICksCi0gIE4oIGJmZF9tYWNoX2FybV80LCAgImFybXY0IiwgIGZhbHNlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbNV0gKSwKLSAgTiggYmZkX21hY2hfYXJtXzRULCAiYXJtdjR0IiwgZmFsc2UsIE5VTEwgKQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9hcm1fYXJjaCA9Ci0gIE4oIDAsICJhcm0iLCB0cnVlLCAmIGFyY2hfaW5mb19zdHJ1Y3RbMF0gKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtZDEwdi5jIGIvYmZkL2NwdS1kMTB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZmYwODguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1kMTB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEQxMFYgcHJvY2Vzc29yCi0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kMTB2X2FyY2ggPSAKLXsJCQkJCQotICAgIDE2LAkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwkJCi0gICAgMTYsCS8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkKLSAgICBiZmRfYXJjaF9kMTB2LAotICAgIDAsCQkKLSAgICAiZDEwdiIsCQkJCQotICAgICJkMTB2IiwJCQkJCi0gICAgNCwgLyogc2VjdGlvbiBhbGlnbm1lbnQgcG93ZXIgKi8JCi0gICAgdHJ1ZSwJCQkJCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCQkKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAkJCQotICAgIDAsCQkJCQotfTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1kMzB2LmMgYi9iZmQvY3B1LWQzMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhZGZlZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWQzMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTWl0c3ViaXNoaSBEMzBWIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJ0aW4gSHVudCAoaHVudEBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfZDMwdl9hcmNoID0KLXsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9kMzB2LAotICAgIDAsCi0gICAgImQzMHYiLAotICAgICJkMzB2IiwKLSAgICA0LCAvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwotICAgIHRydWUsCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1mcjMwLmMgYi9iZmQvY3B1LWZyMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMyMDhmOC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LWZyMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgRlIzMCBwcm9jZXNzb3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2ZyMzBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiBiaXRzIHBlciB3b3JkICovCi0gIDMyLAkJCQkvKiBiaXRzIHBlciBhZGRyZXNzICovCi0gIDgsCQkJCS8qIGJpdHMgcGVyIGJ5dGUgKi8KLSAgYmZkX2FyY2hfZnIzMCwJCS8qIGFyY2hpdGVjdHVyZSAqLwotICBiZmRfbWFjaF9mcjMwLAkJLyogbWFjaGluZSAqLwotICAiZnIzMCIsCQkJLyogYXJjaGl0ZWN0dXJlIG5hbWUgKi8KLSAgImZyMzAiLAkJCS8qIHByaW50YWJsZSBuYW1lICovCi0gIDQsCQkJCS8qIHNlY3Rpb24gYWxpZ24gcG93ZXIgKi8KLSAgdHJ1ZSwJCQkJLyogdGhlIGRlZmF1bHQgPyAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAkvKiBhcmNoaXRlY3R1cmUgY29tcGFyaXNvbiBmbiAqLwotICBiZmRfZGVmYXVsdF9zY2FuLAkJLyogc3RyaW5nIHRvIGFyY2hpdGVjdHVyZSBjb252ZXJ0IGZuICovCi0gIE5VTEwJCQkJLyogbmV4dCBpbiBsaXN0ICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1oODMwMC5jIGIvYmZkL2NwdS1oODMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjdiN2RmLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaDgzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgSGl0YWNoaSBIOC8zMDAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoICgpOwotCi1zdGF0aWMgYm9vbGVhbgotaDgzMDBfc2NhbiAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBpZiAoKnN0cmluZyAhPSAnaCcgJiYgKnN0cmluZyAhPSAnSCcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyAhPSAnOCcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyA9PSAnLycpCi0gICAgc3RyaW5nKys7Ci0KLSAgaWYgKCpzdHJpbmcgIT0gJzMnKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyaW5nKys7Ci0gIGlmICgqc3RyaW5nICE9ICcwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmluZysrOwotICBpZiAoKnN0cmluZyAhPSAnMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJpbmcrKzsKLSAgaWYgKCpzdHJpbmcgPT0gJy0nKQotICAgIHN0cmluZysrOwotICBpZiAoKnN0cmluZyA9PSAnaCcgfHwgKnN0cmluZyA9PSAnSCcpCi0gICAgewotICAgICAgcmV0dXJuIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2g4MzAwaCk7Ci0gICAgfQotICBlbHNlIGlmICgqc3RyaW5nID09ICdzJyB8fCAqc3RyaW5nID09ICdTJykKLSAgICB7Ci0gICAgICByZXR1cm4gKGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaDgzMDBzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9oODMwMDsKLSAgICB9Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCB3b3JrcyBvdXQgdGhlIAotICAgbWFjaGluZSB3aGljaCB3b3VsZCBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBhbmQgcmV0dXJucyBhIHBvaW50ZXIKLSAgIHRvIGl0cyBpbmZvIHN0cnVjdHVyZSAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLWNvbXBhdGlibGUgKGluLCBvdXQpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqIGluOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiBvdXQ7Ci17Ci0gIC8qIEl0J3MgcmVhbGx5IG5vdCBhIGdvb2QgaWRlYSB0byBtaXggYW5kIG1hdGNoIG1vZGVzLiAgKi8KLSAgaWYgKGluLT5tYWNoICE9IG91dC0+bWFjaCkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHJldHVybiBpbjsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBoODMwMF9pbmZvX3N0cnVjdCA9Ci17Ci0gIDE2LAkJCQkvKiAxNiBiaXRzIGluIGEgd29yZCAqLwotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaDgzMDAsCi0gIGJmZF9tYWNoX2g4MzAwLAotICAiaDgzMDAiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgImg4MzAwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGNvbXBhdGlibGUsCi0gIGg4MzAwX3NjYW4sCi0vKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCi0gIDAsCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGg4MzAwaF9pbmZvX3N0cnVjdCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaDgzMDAsCi0gIGJmZF9tYWNoX2g4MzAwaCwKLSAgImg4MzAwaCIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDgzMDBoIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICBmYWxzZSwJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGNvbXBhdGlibGUsCi0gIGg4MzAwX3NjYW4sCi0vKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCi0gICZoODMwMF9pbmZvX3N0cnVjdCwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaDgzMDBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaDgzMDAsCi0gIGJmZF9tYWNoX2g4MzAwcywKLSAgImg4MzAwcyIsCQkJLyogYXJjaF9uYW1lICAqLwotICAiaDgzMDBzIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICBmYWxzZSwJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGNvbXBhdGlibGUsCi0gIGg4MzAwX3NjYW4sCi0vKiAgICBsb2NhbF9iZmRfcmVsb2NfdHlwZV9sb29rdXAsICovCi0gICZoODMwMGhfaW5mb19zdHJ1Y3QsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1oODUwMC5jIGIvYmZkL2NwdS1oODUwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGFiZmQxLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaDg1MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgSDgvNTAwIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiAwCi0KLS8qIAotUmVsb2NhdGlvbnMgZm9yIHRoZSBaOEsKLQotKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1ob3d0bzE2X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sX2luKTsKLQotICB4ID0gKHggKyByZWxvY2F0aW9uICsgcmVsb2NfZW50cnktPmFkZGVuZCk7Ci0KLSAgYmZkX3B1dF8xNihhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAKLWhvd3RvOF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOChhYmZkLCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0KLSAgSE9XVE9fUFJFUEFSRShyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzgoYWJmZCwgeCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1ob3d0bzhfRkZubl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotICBsb25nIHggPSBiZmRfZ2V0XzgoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICBhYm9ydCgpOwotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgCi1ob3d0bzhfcGNyZWxfY2FsbGJhY2sgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCSAgICAgICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzgoYWJmZCwgKGJmZF9ieXRlICopZGF0YSArIGFkZHIpOwotICBhYm9ydCgpOwotICBIT1dUT19QUkVQQVJFKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOChhYmZkLCB4LCAoYmZkX2J5dGUgKilkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b18xNgotICA9IE5FV0hPV1RPKGhvd3RvMTZfY2FsbGJhY2ssImFiczE2IiwxLGZhbHNlLGZhbHNlKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzgKLSAgPSBORVdIT1dUTyhob3d0bzhfY2FsbGJhY2ssImFiczgiLDAsZmFsc2UsZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X0ZGbm4KLSAgPSBORVdIT1dUTyhob3d0bzhfRkZubl9jYWxsYmFjaywiZmYwMCthYnM4IiwwLGZhbHNlLGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOF9wY3JlbAotICA9IE5FV0hPV1RPKGhvd3RvOF9wY3JlbF9jYWxsYmFjaywicGNyZWw4IiwwLGZhbHNlLHRydWUpOwotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWxvY2FsX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYXJjaCwgY29kZSkKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmFyY2g7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpIHsKLSAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgcmV0dXJuICZob3d0b18xNjsKLSAgY2FzZSBCRkRfUkVMT0NfOF9GRm5uOgotICAgIHJldHVybiAmaG93dG9fOF9GRm5uOwotICBjYXNlIEJGRF9SRUxPQ184OgotICAgIHJldHVybiAmaG93dG9fODsKLSAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICByZXR1cm4gJmhvd3RvXzhfcGNyZWw7Ci0gIH0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopTlVMTDsKLX0KLSNlbmRpZgotCi1pbnQgYmZkX2RlZmF1bHRfc2Nhbl9udW1fbWFjaCgpOwotCi1zdGF0aWMgYm9vbGVhbiAKLXNjYW5fbWFjaCAoaW5mbywgc3RyaW5nKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBpZiAoc3RyY21wKHN0cmluZywiaDgvNTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJIOC81MDAiKSA9PSAwKSByZXR1cm4gdHJ1ZTsKLSAgaWYgKHN0cmNtcChzdHJpbmcsImg4NTAwIikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIGlmIChzdHJjbXAoc3RyaW5nLCJIODUwMCIpID09IDApIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotI2lmIDAgLyogbm90IHVzZWQgY3VycmVudGx5ICovCi0vKiBUaGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgdHdvIGFyY2hfaW5mb3MgYW5kIHJldHVybnMgd2hldGhlcgotICAgdGhleSdkIGJlIGNvbXBhdGlibGUgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1jb21wYXRpYmxlIChhLGIpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYTsKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpiOwotewotICBpZiAoYS0+YXJjaCAhPSBiLT5hcmNoIHx8IGEtPm1hY2ggIT0gYi0+bWFjaCkKLSAgIHJldHVybiBOVUxMOwotICByZXR1cm4gYTsKLX0KLSNlbmRpZgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2g4NTAwX2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2g4NTAwLAotICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAiaDg1MDAiLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgImg4NTAwIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWhwcGEuYyBiL2JmZC9jcHUtaHBwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDI2YTkyLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaHBwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBIUCBQcmVjaXNpb24gQXJjaGl0ZWN0dXJlIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaHBwYTEwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDEwLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4wID0gMTAgKi8KLSAgImhwcGEiLAotICAiaHBwYTEuMCIsCi0gIDMsCi0gIHRydWUsCQkJCS8qIFVubGVzcyB3ZSB1c2UgMS4xIHNwZWNpZmljIGZlYXR1cmVzICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgMCwKLX07Ci0KLS8qIFBBMi4wIGluIG5hcnJvdyBtb2RlICovCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9ocHBhMjBfYXJjaCA9Ci17Ci0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaHBwYSwKLSAgMjAsCQkJCS8qIEJ5IGNvbnZlbnRpb24gUEExLjAgPSAxMCAqLwotICAiaHBwYSIsCi0gICJocHBhMi4wIiwKLSAgMywKLSAgZmFsc2UsCQkJLyogVW5sZXNzIHdlIHVzZSAxLjEgc3BlY2lmaWMgZmVhdHVyZXMgKi8KLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2hwcGExMF9hcmNoLAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9ocHBhX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX2hwcGEsCi0gIDExLAkJCQkvKiBCeSBjb252ZW50aW9uIFBBMS4xID0gMTEgKi8KLSAgImhwcGEiLAotICAiaHBwYTEuMSIsCi0gIDMsCi0gIGZhbHNlLAkJCS8qIDEuMSBzcGVjaWZpYyBmZWF0dXJlcyB1c2VkICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgJmJmZF9ocHBhMjBfYXJjaCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LWkzODYuYyBiL2JmZC9jcHUtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI5YjE4Li4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCAzODYgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IDE5OTIsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTM4Nl9hcmNoX2ludGVsX3N5bnRheCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCwKLSAgImkzODY6aW50ZWwiLAotICAiaTM4NjppbnRlbCIsCi0gIDMsCi0gIHRydWUsCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgMCwKLX07Ci1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGk4MDg2X2FyY2ggPQotewotICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAod2VsbCwgbm90IHJlYWxseSkgKi8KLSAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9pMzg2LAotICBiZmRfbWFjaF9pMzg2X2k4MDg2LAotICAiaTgwODYiLAotICAiaTgwODYiLAotICAzLAotICBmYWxzZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmYmZkX2kzODZfYXJjaF9pbnRlbF9zeW50YXgsCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2kzODZfYXJjaCA9Ci17Ci0gIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfaTM4NiwKLSAgYmZkX21hY2hfaTM4Nl9pMzg2LAotICAiaTM4NiIsCi0gICJpMzg2IiwKLSAgMywKLSAgdHJ1ZSwKLSAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gIGJmZF9kZWZhdWx0X3NjYW4gLAotICAmaTgwODZfYXJjaCwKLX07Ci0KZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTg2MC5jIGIvYmZkL2NwdS1pODYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yzg2N2MuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIEludGVsIDg2MCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENyZWF0ZWQgbW9zdGx5IGJ5IHN1YnN0aXR1dGluZyAiODYwIiBmb3IgIjM4NiIgaW4gY3B1LWkzODYuYwotICAgSGFycnkgRG9sYW4gPGRvbGFuQHNzZC5pbnRlbC5jb20+LCBPY3RvYmVyIDE5OTUKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfaTg2MF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfaTg2MCwKLSAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJpODYwIiwKLSAgICAiaTg2MCIsCi0gICAgMywKLSAgICB0cnVlLCAvKiB0aGUgb25lIGFuZCBvbmx5ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgMCwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtaTk2MC5jIGIvYmZkL2NwdS1pOTYwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjJjN2UuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1pOTYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIGk5NjAgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIGEgc3RyaW5nLCBhbmQgdHJpZXMgdG8gd29yayBvdXQgaWYgaXQKLSAgIGNvdWxkIHBvc3NpYmx5IHJlZmVyIHRvIHRoZSBpOTYwIG1hY2hpbmUgcG9pbnRlZCBhdCBpbiB0aGUKLSAgIGluZm9fc3RydWN0IHBvaW50ZXIgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNjYW5fOTYwX21hY2ggKGFwLCBzdHJpbmcpCi0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXA7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotCi0gIC8qIExvb2sgZm9yIHRoZSBzdHJpbmcgaTk2MCwgb3Igc29tZXN1Y2ggYXQgdGhlIGZyb250IG9mIHRoZSBzdHJpbmcgICovCi0KLSAgaWYgKHN0cm5jbXAoImk5NjAiLHN0cmluZyw0KSA9PSAwKSB7Ci0gICAgc3RyaW5nKz00OwotICB9Ci0gIGVsc2UgewotICAgIC8qIG5vIG1hdGNoLCBjYW4gYmUgdXMgKi8KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHN0cmluZ1swXSA9PSAwKSB7Ci0gICAgLyogaTk2MCBvbiBpdCdzIG93biBtZWFucyBjb3JlIHRvIHVzKi8KLSAgICBpZiAoYXAtPm1hY2ggPT0gYmZkX21hY2hfaTk2MF9jb3JlKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoc3RyaW5nWzBdICE9ICc6JykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdHJpbmcrKzsKLSAgaWYgKHN0cmluZ1swXSA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHN0cmluZ1swXSA9PSAnYycgJiYgc3RyaW5nWzFdID09ICdvJyAmJiBzdHJpbmdbMl0gPT0gJ3InICYmCi0gICAgICBzdHJpbmdbM10gPT0gJ2UnICYmIHN0cmluZ1s0XSA9PSAnXDAnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2NvcmU7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc3RyaW5nLCAia2Ffc2EiKSA9PSAwKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJjbXAgKHN0cmluZywgImtiX3NiIikgPT0gMCkKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYl9zYjsKLSAgZWxzZSBpZiAoc3RyaW5nWzFdID09ICdcMCcgfHwgc3RyaW5nWzJdICE9ICdcMCcpIC8qIHJlc3QgYXJlIDItY2hhciAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdrJyAmJiBzdHJpbmdbMV0gPT0gJ2InKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2tiX3NiOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ3MnICYmIHN0cmluZ1sxXSA9PSAnYicpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfa2Jfc2I7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnbScgJiYgc3RyaW5nWzFdID09ICdjJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9tYzsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICd4JyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX3hhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2MnICYmIHN0cmluZ1sxXSA9PSAnYScpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY2E7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaycgJiYgc3RyaW5nWzFdID09ICdhJykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9rYV9zYTsKLSAgZWxzZSBpZiAoc3RyaW5nWzBdID09ICdzJyAmJiBzdHJpbmdbMV0gPT0gJ2EnKQotICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9pOTYwX2thX3NhOwotICBlbHNlIGlmIChzdHJpbmdbMF0gPT0gJ2onICYmIHN0cmluZ1sxXSA9PSAneCcpCi0gICAgbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfang7Ci0gIGVsc2UgaWYgKHN0cmluZ1swXSA9PSAnaCcgJiYgc3RyaW5nWzFdID09ICd4JykKLSAgICBtYWNoaW5lID0gYmZkX21hY2hfaTk2MF9oeDsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG1hY2hpbmUgPT0gYXAtPm1hY2gpICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLS8qIFRoaXMgcm91dGluZSBpcyBwcm92aWRlZCB0d28gYXJjaF9pbmZvcyBhbmQgd29ya3Mgb3V0IHRoZSBpOTYwCi0gICBtYWNoaW5lIHdoaWNoIHdvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCBib3RoIGFuZCByZXR1cm5zIGEgcG9pbnRlcgotICAgdG8gaXRzIGluZm8gc3RydWN0dXJlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLQotICAvKiBUaGUgaTk2MCBoYXMgZGlzdGluY3Qgc3Vic3BlY2llcyB3aGljaCBtYXkgbm90IGludGVyYnJlZWQ6Ci0JQ09SRSBDQSAgICAgICAgICAKLQlDT1JFIEtBIEtCIE1DIFhBCi0JQ09SRSBIWCBKWAotICAgICBBbnkgYXJjaGl0ZWN0dXJlIG9uIHRoZSBzYW1lIGxpbmUgaXMgY29tcGF0aWJsZSwgdGhlIG9uZSBvbgotICAgICB0aGUgcmlnaHQgaXMgdGhlIGxlYXN0IHJlc3RyaWN0aXZlLiAgCi0gICAgIAotICAgICBXZSByZXByZXNlbnQgdGhpcyBpbmZvcm1hdGlvbiBpbiBhbiBhcnJheSwgZWFjaCBtYWNoaW5lIHRvIGEgc2lkZSAqLwotCi0jZGVmaW5lIEVSUk9SCTAKLSNkZWZpbmUgQ09SRQliZmRfbWFjaF9pOTYwX2NvcmUgIC8qMSovICAKLSNkZWZpbmUgS0EgCWJmZF9tYWNoX2k5NjBfa2Ffc2EgLyoyKi8gCi0jZGVmaW5lIEtCIAliZmRfbWFjaF9pOTYwX2tiX3NiIC8qMyovCi0jZGVmaW5lIE1DIAliZmRfbWFjaF9pOTYwX21jICAgIC8qNCovCi0jZGVmaW5lIFhBIAliZmRfbWFjaF9pOTYwX3hhICAgIC8qNSovCi0jZGVmaW5lIENBIAliZmRfbWFjaF9pOTYwX2NhICAgIC8qNiovCi0jZGVmaW5lIEpYCWJmZF9tYWNoX2k5NjBfanggICAgLyo3Ki8KLSNkZWZpbmUgSFgJYmZkX21hY2hfaTk2MF9oeCAgICAvKjgqLwotI2RlZmluZSBNQVhfQVJDSCAoKGludClIWCkKLQotICBzdGF0aWMgQ09OU1QgdW5zaWduZWQgbG9uZyBtYXRyaXhbTUFYX0FSQ0grMV1bTUFYX0FSQ0grMV0gPSAKLSAgICB7Ci0gICAgICB7IEVSUk9SLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBDT1JFLAlDT1JFLAlLQSwJS0IsCU1DLAlYQSwJQ0EsCUpYLAlIWCB9LAotICAgICAgeyBLQSwJS0EsCUtBLAlLQiwJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgS0IsCUtCLAlLQiwJS0IsCU1DLAlYQSwJRVJST1IsIAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBNQywJTUMsCU1DLAlNQywJTUMsCVhBLAlFUlJPUiwJRVJST1IsCUVSUk9SfSwKLSAgICAgIHsgWEEsCVhBLAlYQSwJWEEsCVhBLAlYQSwJRVJST1IsCUVSUk9SLAlFUlJPUn0sCi0gICAgICB7IENBLAlDQSwJRVJST1IsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUNBLAlFUlJPUiwJRVJST1J9LAotICAgICAgeyBKWCwJSlgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwgIEpYLAlIWCB9LAotICAgICAgeyBIWCwJSFgsCUVSUk9SLAlFUlJPUiwJRVJST1IsCUVSUk9SLAlFUlJPUiwJSFgsCUhYIH0sCi0gICAgfTsKLQotCi0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgbWF0cml4W2EtPm1hY2hdW2ItPm1hY2hdID09IEVSUk9SKSAKLSAgICB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICByZXR1cm4gKGEtPm1hY2ggID09ICBtYXRyaXhbYS0+bWFjaF1bYi0+bWFjaF0pID8gIGEgOiBiOwotICAgIH0KLX0KLQotCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoKCk7Ci0jZGVmaW5lIE4oYSxiLGQsbikgXAoteyAzMiwgMzIsIDgsYmZkX2FyY2hfaTk2MCxhLCJpOTYwIixiLDMsZCxjb21wYXRpYmxlLHNjYW5fOTYwX21hY2gsbix9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17IAotICBOKGJmZF9tYWNoX2k5NjBfa2Ffc2EsImk5NjA6a2Ffc2EiLGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4oYmZkX21hY2hfaTk2MF9rYl9zYiwiaTk2MDprYl9zYiIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzJdKSwKLSAgTihiZmRfbWFjaF9pOTYwX21jLCAgICJpOTYwOm1jIiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbM10pLAotICBOKGJmZF9tYWNoX2k5NjBfeGEsICAgImk5NjA6eGEiLCAgIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCi0gIE4oYmZkX21hY2hfaTk2MF9jYSwgICAiaTk2MDpjYSIsICAgZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzVdKSwKLSAgTihiZmRfbWFjaF9pOTYwX2p4LCAgICJpOTYwOmp4IiwgICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbNl0pLAotICBOKGJmZF9tYWNoX2k5NjBfaHgsCSJpOTYwOmh4IiwgICBmYWxzZSwgMCksCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX2k5NjBfYXJjaCA9Ci0gIE4oYmZkX21hY2hfaTk2MF9jb3JlLCAiaTk2MDpjb3JlIiwgdHJ1ZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMF0pOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tMTAyMDAuYyBiL2JmZC9jcHUtbTEwMjAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGE2NzguLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tMTAyMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTWF0c3VzaGl0YSAxMDIwMCBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9tbjEwMjAwX2FyY2ggPQotICB7Ci0gICAgMTYsIC8qIDE2IGJpdHMgaW4gYSB3b3JkICovCi0gICAgMjQsIC8qIDE2IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsICAvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfbW4xMDIwMCwKLSAgICAyMDAsCi0gICAgIm1uMTAyMDAiLAotICAgICJtbjEwMjAwIiwKLSAgICAyLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW0xMDMwMC5jIGIvYmZkL2NwdS1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhMGJmZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogQkZEIHN1cHBvcnQgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMzAwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE5FWFQgTlVMTAotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX21uMTAzMDBfYXJjaCA9Ci0gIHsKLSAgICAzMiwgLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwgLyogMTYgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwgIC8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9tbjEwMzAwLAotICAgIDMwMCwKLSAgICAibW4xMDMwMCIsCi0gICAgIm1uMTAzMDAiLAotICAgIDIsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgYmZkX2RlZmF1bHRfc2NhbiAsCi0gICAgTkVYVCwKLSAgfTsKLQpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tMzJyLmMgYi9iZmQvY3B1LW0zMnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzY2MzMS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LW0zMnIuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgTTMyUiBwcm9jZXNzb3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIE4obnVtYmVyLCBwcmludCwgZGVmYXVsdCwgbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbTMyciwgbnVtYmVyLCAibTMyciIsIHByaW50LCA0LCBkZWZhdWx0LCBcCi0gICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIGJmZF9kZWZhdWx0X3NjYW4sIG5leHQgfQotCi0jZGVmaW5lIE5FWFQgTlVMTAotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTMycl9hcmNoID0KLSAgTiAoYmZkX21hY2hfbTMyciwgIm0zMnIiLCB0cnVlLCBORVhUKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTY4ay5jIGIvYmZkL2NwdS1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NDE4MmQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciBhcmNoaXRlY3R1cmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUgTihuYW1lLCBwcmludCxkLG5leHQpICBcCi17ICAzMiwgMzIsIDgsIGJmZF9hcmNoX202OGssIG5hbWUsICJtNjhrIixwcmludCwyLGQsYmZkX2RlZmF1bHRfY29tcGF0aWJsZSxiZmRfZGVmYXVsdF9zY2FuLCBuZXh0LCB9Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsgCi0gIE4oYmZkX21hY2hfbTY4MDAwLCAibTY4azo2ODAwMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsxXSksCi0gIE4oYmZkX21hY2hfbTY4MDA4LCAibTY4azo2ODAwOCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFsyXSksCi0gIE4oYmZkX21hY2hfbTY4MDEwLCAibTY4azo2ODAxMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFszXSksCi0gIE4oYmZkX21hY2hfbTY4MDIwLCAibTY4azo2ODAyMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs0XSksCi0gIE4oYmZkX21hY2hfbTY4MDMwLCAibTY4azo2ODAzMCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs1XSksCi0gIE4oYmZkX21hY2hfbTY4MDQwLCAibTY4azo2ODA0MCIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs2XSksCi0gIE4oYmZkX21hY2hfY3B1MzIsICAibTY4azpjcHUzMiIsIGZhbHNlLCAmYXJjaF9pbmZvX3N0cnVjdFs3XSksCi0gIE4oYmZkX21hY2hfbTY4MDYwLCAibTY4azo2ODA2MCIsIGZhbHNlLCAwKSwKLX07Ci0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbTY4a19hcmNoID0KLSAgTigwLCAibTY4ayIsIHRydWUsICZhcmNoX2luZm9fc3RydWN0WzBdKTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtbTg4ay5jIGIvYmZkL2NwdS1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzE2YzUuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIG04OGsgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0KLQotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX204OGtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX204OGssCi0gICAgODgxMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgIm04OGsiLAotICAgICJtODhrOjg4MTAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS1tY29yZS5jIGIvYmZkL2NwdS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJmZTFiLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIE1vdG9yb2xsYSdzIE1Db3JlIGFyY2hpdGVjdHVyZQotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWNvcmVfYXJjaCA9Ci17Ci0gIDMyLAkJICAJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJICAJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJICAJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgYmZkX2FyY2hfbWNvcmUsIAkJLyogQXJjaGl0ZWN0dXJlICovCi0gIDAsCQkgIAkJLyogTWFjaGluZSBudW1iZXIgLSAwIGZvciBub3cgKi8KLSAgIk1Db3JlIiwJICAJCS8qIEFyY2hpdGVjdHVyZSBuYW1lICovCi0gICJNQ29yZSIsCSAgCQkvKiBQcmludGFibGUgbmFtZSAqLwotICAzLAkJICAJCS8qIFNlY3Rpb24gYWxpZ24gcG93ZXIgKi8KLSAgdHJ1ZSwJCSAgCQkvKiBJcyB0aGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSA/ICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCS8qIEFyY2hpdGVjdHVyZSBjb21wYXJpc29uIGZ1bmN0aW9uICovCi0gIGJmZF9kZWZhdWx0X3NjYW4sCSAgIAkvKiBTdHJpbmcgdG8gYXJjaGl0ZWN0dXJlIGNvbnZlcnNpb24gKi8KLSAgTlVMTAkJCSAgIAkvKiBOZXh0IGluIGxpc3QgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LW1pcHMuYyBiL2JmZC9jcHUtbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTMzYjhjLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciBtaXBzIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEtOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBOKEJJVFNfV09SRCwgQklUU19BRERSLCBOVU1CRVIsIFBSSU5ULCBERUZBVUxULCBORVhUKQkJXAotICB7CQkJCQkJCVwKLSAgICBCSVRTX1dPUkQsIC8qICBiaXRzIGluIGEgd29yZCAqLwkJCVwKLSAgICBCSVRTX0FERFIsIC8qIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwkJCVwKLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCQkJCVwKLSAgICBiZmRfYXJjaF9taXBzLAkJCQkJXAotICAgIE5VTUJFUiwJCQkJCQlcCi0gICAgIm1pcHMiLAkJCQkJCVwKLSAgICBQUklOVCwJCQkJCQlcCi0gICAgMywJCQkJCQkJXAotICAgIERFRkFVTFQsCQkJCQkJXAotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAkJCQlcCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwJCQkJCVwKLSAgICBORVhULAkJCQkJCVwKLSAgfQotCi1lbnVtIHsKLUlfbWlwczMwMDAsIAotSV9taXBzMzkwMCwgCi1JX21pcHM0MDAwLCAKLUlfbWlwczQwMTAsIAotSV9taXBzNDEwMCwgCi1JX21pcHM0MTExLAotSV9taXBzNDMwMCwgCi1JX21pcHM0NDAwLCAKLUlfbWlwczQ2MDAsIAotSV9taXBzNDY1MCwgCi1JX21pcHM1MDAwLCAKLUlfbWlwczYwMDAsIAotSV9taXBzODAwMCwgCi1JX21pcHMxMDAwMCwKLUlfbWlwczE2Ci19OwotCi0KLSNkZWZpbmUgTk4oaW5kZXgpICgmYXJjaF9pbmZvX3N0cnVjdFsoaW5kZXgpKzFdKQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICBOICgzMiwgMzIsIGJmZF9tYWNoX21pcHMzMDAwLCAibWlwczozMDAwIiwgZmFsc2UsIE5OKElfbWlwczMwMDApKSwKLSAgTiAoMzIsIDMyLCBiZmRfbWFjaF9taXBzMzkwMCwgIm1pcHM6MzkwMCIsIGZhbHNlLCBOTihJX21pcHMzOTAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQwMDAsICJtaXBzOjQwMDAiLCBmYWxzZSwgTk4oSV9taXBzNDAwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MDEwLCAibWlwczo0MDEwIiwgZmFsc2UsIE5OKElfbWlwczQwMTApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDEwMCwgIm1pcHM6NDEwMCIsIGZhbHNlLCBOTihJX21pcHM0MTAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQxMTEsICJtaXBzOjQxMTEiLCBmYWxzZSwgTk4oSV9taXBzNDExMSkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0MzAwLCAibWlwczo0MzAwIiwgZmFsc2UsIE5OKElfbWlwczQzMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNDQwMCwgIm1pcHM6NDQwMCIsIGZhbHNlLCBOTihJX21pcHM0NDAwKSksCi0gIE4gKDY0LCA2NCwgYmZkX21hY2hfbWlwczQ2MDAsICJtaXBzOjQ2MDAiLCBmYWxzZSwgTk4oSV9taXBzNDYwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM0NjUwLCAibWlwczo0NjUwIiwgZmFsc2UsIE5OKElfbWlwczQ2NTApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzNTAwMCwgIm1pcHM6NTAwMCIsIGZhbHNlLCBOTihJX21pcHM1MDAwKSksCi0gIE4gKDMyLCAzMiwgYmZkX21hY2hfbWlwczYwMDAsICJtaXBzOjYwMDAiLCBmYWxzZSwgTk4oSV9taXBzNjAwMCkpLAotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHM4MDAwLCAibWlwczo4MDAwIiwgZmFsc2UsIE5OKElfbWlwczgwMDApKSwKLSAgTiAoNjQsIDY0LCBiZmRfbWFjaF9taXBzMTAwMDAsICJtaXBzOjEwMDAwIiwgZmFsc2UsIE5OKElfbWlwczEwMDAwKSksCi0KLQotICBOICg2NCwgNjQsIGJmZF9tYWNoX21pcHMxNiwgICAibWlwczoxNiIsICAgZmFsc2UsIDApLAotfTsKLQotLyogVGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGlzIG1pcHM6MzAwMCwgYnV0IHdpdGggYSBtYWNoaW5lIG51bWJlciBvZgotICAgemVyby4gIFRoaXMgbGV0cyB0aGUgbGlua2VyIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBkZWZhdWx0IHNldHRpbmcKLSAgIG9mIG1pcHMsIGFuZCBhbiBleHBsaWNpdCBzZXR0aW5nIG9mIG1pcHM6MzAwMC4gICovCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfbWlwc19hcmNoID0KLU4gKDMyLCAzMiwgMCwgIm1pcHMiLCB0cnVlLCAmYXJjaF9pbmZvX3N0cnVjdFswXSk7CmRpZmYgLS1naXQgYS9iZmQvY3B1LW5zMzJrLmMgYi9iZmQvY3B1LW5zMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMGExOGQuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1uczMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsODQ2ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgbnMzMmsgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEFsbW9zdCB0b3RhbGx5IHJld3JpdHRlbiBieSBJYW4gRGFsbCBmcm9tIGluaXRpYWwgd29yawotICAgYnkgQW5kcmV3IENhZ25leS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibnMzMmsuaCIKLQotI2RlZmluZSBOKG1hY2hpbmUsIHByaW50YWJsZSwgZCwgbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfbnMzMmssIG1hY2hpbmUsICJuczMyayIscHJpbnRhYmxlLDMsZCxiZmRfZGVmYXVsdF9jb21wYXRpYmxlLGJmZF9kZWZhdWx0X3NjYW4sIG5leHQsIH0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQoteyAKLSAgTigzMjUzMiwibnMzMms6MzI1MzIiLHRydWUsIDApLCAvKiB0aGUgd29yZCBuczMyayB3aWxsIG1hdGNoIHRoaXMgdG9vICovCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX25zMzJrX2FyY2ggPQotICBOKDMyMDMyLCJuczMyazozMjAzMiIsZmFsc2UsICZhcmNoX2luZm9fc3RydWN0WzBdKTsKLQotc3RhdGljIGxvbmcKLW5zMzJrX3NpZ25fZXh0ZW5kKHZhbHVlLCBiaXRzKQotICAgICBpbnQgdmFsdWU7Ci0gICAgIGludCBiaXRzOwotewotICB2YWx1ZSA9IHZhbHVlICYgKCgxIDw8IGJpdHMpIC0gMSk7Ci0gIHJldHVybiAodmFsdWUgJiAoMSA8PCAoYml0cy0xKSkKLQkgID8gdmFsdWUgfCAofigoMSA8PCBiaXRzKSAtIDEpKQotCSAgOiB2YWx1ZSk7Ci19Ci0KLWxvbmcKLV9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudChidWZmZXIsIG9mZnNldCwgc2l6ZSkKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGxvbmcgc2l6ZTsKLXsKLSAgbG9uZyB2YWx1ZTsKLSAgYnVmZmVyICs9IG9mZnNldDsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICB2YWx1ZSA9IG5zMzJrX3NpZ25fZXh0ZW5kICgqYnVmZmVyLCA3KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQoKmJ1ZmZlcisrLCA2KTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHZhbHVlID0gbnMzMmtfc2lnbl9leHRlbmQoKmJ1ZmZlcisrLCA2KTsKLSAgICAgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgKDB4ZmYgJiAqYnVmZmVyKyspOwotICAgICAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCAoMHhmZiAmICpidWZmZXIrKyk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgweGZmICYgKmJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW50Ci1fYmZkX25zMzJrX3B1dF9kaXNwbGFjZW1lbnQodmFsdWUsIGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBsb25nIHZhbHVlOwotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBidWZmZXIgKz0gb2Zmc2V0OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGlmICh2YWx1ZSA8IC02NCB8fCB2YWx1ZSA+IDYzKQotCXJldHVybiAtMTsKLSAgICAgIHZhbHVlJj0weDdmOwotICAgICAgKmJ1ZmZlcisrPXZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHZhbHVlIDwgLTgxOTIgfHwgdmFsdWUgPiA4MTkxKQotCXJldHVybiAtMTsKLSAgICAgIHZhbHVlJj0weDNmZmY7Ci0gICAgICB2YWx1ZXw9MHg4MDAwOwotICAgICAgKmJ1ZmZlcisrPSh2YWx1ZT4+OCk7Ci0gICAgICAqYnVmZmVyKys9dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAodmFsdWUgPCAtMHgxZjAwMDAwMCB8fCB2YWx1ZSA+PSAweDIwMDAwMDAwKQotCXJldHVybiAtMTsKLSAgICAgIHZhbHVlfD0weGMwMDAwMDAwOwotICAgICAgKmJ1ZmZlcisrPSh2YWx1ZT4+MjQpOwotICAgICAgKmJ1ZmZlcisrPSh2YWx1ZT4+MTYpOwotICAgICAgKmJ1ZmZlcisrPSh2YWx1ZT4+OCk7Ci0gICAgICAqYnVmZmVyKys9dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1sb25nCi1fYmZkX25zMzJrX2dldF9pbW1lZGlhdGUgKGJ1ZmZlciwgb2Zmc2V0LCBzaXplKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBsb25nIG9mZnNldDsKLSAgICAgbG9uZyBzaXplOwotewotICBsb25nIHZhbHVlID0gMDsKLSAgYnVmZmVyICs9IG9mZnNldDsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgqYnVmZmVyKysgJiAweGZmKTsKLSAgICBjYXNlIDM6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgqYnVmZmVyKysgJiAweGZmKTsKLSAgICBjYXNlIDI6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgqYnVmZmVyKysgJiAweGZmKTsKLSAgICBjYXNlIDE6Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8ICgqYnVmZmVyKysgJiAweGZmKTsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW50Ci1fYmZkX25zMzJrX3B1dF9pbW1lZGlhdGUgKHZhbHVlLCBidWZmZXIsIG9mZnNldCwgc2l6ZSkKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmZlcjsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGxvbmcgc2l6ZTsKLXsKLSAgYnVmZmVyICs9IG9mZnNldCArIHNpemUgLSAxOwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICBjYXNlIDM6Ci0gICAgICAqYnVmZmVyLS0gPSAodmFsdWUgJiAweGZmKTsgdmFsdWUgPj49IDg7Ci0gICAgY2FzZSAyOgotICAgICAgKmJ1ZmZlci0tID0gKHZhbHVlICYgMHhmZik7IHZhbHVlID4+PSA4OwotICAgIGNhc2UgMToKLSAgICAgICpidWZmZXItLSA9ICh2YWx1ZSAmIDB4ZmYpOyB2YWx1ZSA+Pj0gODsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgcGVyZm9ybV9yZWxvY2F0aW9uIGV4Y2VwdCB3ZQotICogdXNlIGdldF9kYXRhIGFuZCBwdXRfZGF0YSB3aGljaCBrbm93IGFib3V0IHRoZSBuczMyawotICogc3RvcmFnZSBtZXRob2RzLgotICogVGhpcyBpcyBwcm9iYWJseSBhIGxvdCBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaXQgbmVlZHMgdG8gYmUhCi0gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWRvX25zMzJrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQllcnJvcl9tZXNzYWdlLCBnZXRfZGF0YSwgcHV0X2RhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotICAgICBsb25nICgqZ2V0X2RhdGEpKCk7Ci0gICAgIGludCAoKnB1dF9kYXRhKSgpOwotewotICBpbnQgb3ZlcmZsb3cgPSAwOwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotCi0gIGlmICgoc3ltYm9sLT5zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgcmV0dXJuIGFuIGVycm9yIGlmCi0gICAgIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQuICBBbiB1bmRlZmluZWQgd2VhayBzeW1ib2wgaXMKLSAgICAgY29uc2lkZXJlZCB0byBoYXZlIGEgdmFsdWUgb2YgemVybyAoU1ZSNCBBQkksIHAuIDQtMjcpLiAgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICBXZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OCi0JIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYW5kIHRoZQotCSBsb2NhdGlvbi4gIFJFTE9DQVRJT04gaXMgYWxyZWFkeSB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLgotCi0JIFdlIHN0YXJ0IGJ5IHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcKLQkgdGhlIGxvY2F0aW9uLgotCi0JIElmIHBjcmVsX29mZnNldCBpcyBzZXQsIHdlIG11c3QgZnVydGhlciBzdWJ0cmFjdCB0aGUgcG9zaXRpb24KLQkgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFNvbWUgdGFyZ2V0cyBhcnJhbmdlIGZvcgotCSB0aGUgYWRkZW5kIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uCi0JIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIGV4YW1wbGUsIGkzODYtYW91dCBkb2VzIHRoaXMuICBGb3IKLQkgaTM4Ni1hb3V0LCBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBTb21lIG90aGVyIHRhcmdldHMgZG8gbm90Ci0JIGluY2x1ZGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbjsgZm9yIGV4YW1wbGUsIG04OGtiY3MsCi0JIG9yIEVMRi4gIEZvciB0aG9zZSB0YXJnZXRzLCBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4KLQotCSBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZW4gd2UgbXVzdCBlbnN1cmUKLQkgdGhhdCB0aGlzIHJlbG9jIHdpbGwgYmUgY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gdGhlIGZpbmFsCi0JIHJlbG9jYXRpb24gaXMgZG9uZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSB3YW50IHRvIHdpbmQKLQkgdXAgd2l0aCB0aGUgbmVnYXRpdmUgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwKLQkgd2hpY2ggbWVhbnMgd2UgbXVzdCBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBieSB0aGUgY2hhbmdlCi0JIGluIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBJZiBwY3JlbF9vZmZzZXQgaXMgdHJ1ZQotCSB3ZSBkbyBub3Qgd2FudCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBhdCBhbGwuCi0KLQkgRklYTUU6IFRoaXMgc2VlbXMgbG9naWNhbCB0byBtZSwgYnV0IGZvciB0aGUgY2FzZSBvZgotCSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBpdCBpcyBub3Qgd2hhdCB0aGUgY29kZQotCSBhY3R1YWxseSBkb2VzLiAgSSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBzZWVtcwotCSBmYXIgdG9vIGxpa2VseSB0aGF0IHNvbWV0aGluZyB3aWxsIGJyZWFrLiAgKi8KLQotICAgICAgcmVsb2NhdGlvbiAtPQotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUgcmVsb2NhdGlvbgotCSAgICAgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSAgICAgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGZsYWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGJ1dCBpbnBsYWNlLCBzbyBtb2RpZnkgdGhlCi0JICAgICByZWxvYyByZWNvcmQgYSBiaXQuCi0KLQkgICAgIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgICAgIGludG8gYSByZWYgdG8gdGhlIHNlY3Rpb24gYmVsb25naW5nIHRvIHRoZSBzeW1ib2wuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0JICAvKiBXVEY/PyAqLwotCSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmLXJzNjAwMCIpICE9IDApCi0JICAgIHsKLSNpZiAxCi0JICAgICAgLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLQkJIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotCQkgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIHsKLSAgICAgIGJmZF92bWEgY2hlY2s7Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSByZWxvY2F0aW9uLCBidXQKLQkgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHplcm8uICAqLwotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID4gaG93dG8tPmJpdHBvcykKLQljaGVjayA9IHJlbG9jYXRpb24gPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcyk7Ci0gICAgICBlbHNlCi0JY2hlY2sgPSByZWxvY2F0aW9uIDw8IChob3d0by0+Yml0cG9zIC0gaG93dG8tPnJpZ2h0c2hpZnQpOwotICAgICAgc3dpdGNoIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cpCi0JewotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWF4ID0gKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMTsKLQkgICAgYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH5yZWxvY19zaWduZWRfbWF4OwotCi0JICAgIC8qIFRoZSBhYm92ZSByaWdodCBzaGlmdCBpcyBpbmNvcnJlY3QgZm9yIGEgc2lnbmVkIHZhbHVlLgotCSAgICAgICBGaXggaXQgdXAgYnkgZm9yY2luZyBvbiB0aGUgdXBwZXIgYml0cy4gICovCi0JICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA+IGhvd3RvLT5iaXRwb3MKLQkJJiYgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgMCkKLQkgICAgICBjaGVjayB8PSAoKGJmZF92bWEpIC0gMQotCQkJJiB+KChiZmRfdm1hKSAtIDEKLQkJCSAgICA+PiAoaG93dG8tPnJpZ2h0c2hpZnQgLSBob3d0by0+Yml0cG9zKSkpOwotCSAgICBpZiAoKGJmZF9zaWduZWRfdm1hKSBjaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJfHwgKGJmZF9zaWduZWRfdm1hKSBjaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKLQkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JICAgICAgIGJmZF92bWEuICAqLwotCSAgICBiZmRfdm1hIHJlbG9jX3Vuc2lnbmVkX21heCA9Ci0JICAgICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmICgoYmZkX3ZtYSkgY2hlY2sgPiByZWxvY191bnNpZ25lZF9tYXgpCi0JICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gIFRoaXMgZXhwcmVzc2lvbiBhdm9pZHMKLQkgICAgICAgb3ZlcmZsb3cgaWYgaG93dG8tPmJpdHNpemUgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCi0JICAgICAgIGJmZF92bWEuICAqLwotCSAgICBiZmRfdm1hIHJlbG9jX2JpdHMgPSAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoKChiZmRfdm1hKSBjaGVjayAmIH5yZWxvY19iaXRzKSAhPSAwCi0JCSYmICgoYmZkX3ZtYSkgY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gKC0xICYgfnJlbG9jX2JpdHMpKQotCSAgICAgIHsKLQkJLyogVGhlIGFib3ZlIHJpZ2h0IHNoaWZ0IGlzIGluY29ycmVjdCBmb3IgYSBzaWduZWQKLQkJICAgdmFsdWUuICBTZWUgaWYgdHVybmluZyBvbiB0aGUgdXBwZXIgYml0cyBmaXhlcyB0aGUKLQkJICAgb3ZlcmZsb3cuICAqLwotCQlpZiAoaG93dG8tPnJpZ2h0c2hpZnQgPiBob3d0by0+Yml0cG9zCi0JCSAgICAmJiAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPCAwKQotCQkgIHsKLQkJICAgIGNoZWNrIHw9ICgoYmZkX3ZtYSkgLSAxCi0JCQkgICAgICAmIH4oKGJmZF92bWEpIC0gMQotCQkJCSAgPj4gKGhvd3RvLT5yaWdodHNoaWZ0IC0gaG93dG8tPmJpdHBvcykpKTsKLQkJICAgIGlmICgoKGJmZF92bWEpIGNoZWNrICYgfnJlbG9jX2JpdHMpICE9ICgtMSAmIH5yZWxvY19iaXRzKSkKLQkJICAgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQkJICB9Ci0JCWVsc2UKLQkJICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAgRWl0aGVyIHdlIGFyZSByZWxvY2F0aW5nIGFsbCB0aGUgd2F5LCBvciB3ZSBkb24ndCB3YW50IHRvIGFwcGx5Ci0gICAgdGhlIHJlbG9jYXRpb24gdG8gdGhlIHJlbG9jIGVudHJ5IChwcm9iYWJseSBiZWNhdXNlIHRoZXJlIGlzbid0Ci0gICAgYW55IHJvb20gaW4gdGhlIG91dHB1dCBmb3JtYXQgdG8gZGVzY3JpYmUgYWRkZW5kcyB0byByZWxvY3MpCi0gICAgKi8KLQotICAvKiBUaGUgY2FzdCB0byBiZmRfdm1hIGF2b2lkcyBhIGJ1ZyBpbiB0aGUgQWxwaGEgT1NGLzEgQyBjb21waWxlcgotICAgICAoT1NGIHZlcnNpb24gMS4zLCBjb21waWxlciB2ZXJzaW9uIDMuMTEpLiAgSXQgbWlzY29tcGlsZXMgdGhlCi0gICAgIGZvbGxvd2luZyBwcm9ncmFtOgotCi0gICAgIHN0cnVjdCBzdHIKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGludCBpMDsKLSAgICAgfSBzID0geyAwIH07Ci0KLSAgICAgaW50Ci0gICAgIG1haW4gKCkKLSAgICAgewotICAgICAgIHVuc2lnbmVkIGxvbmcgeDsKLQotICAgICAgIHggPSAweDEwMDAwMDAwMDsKLSAgICAgICB4IDw8PSAodW5zaWduZWQgbG9uZykgcy5pMDsKLSAgICAgICBpZiAoeCA9PSAwKQotCSBwcmludGYgKCJmYWlsZWRcbiIpOwotICAgICAgIGVsc2UKLQkgcHJpbnRmICgic3VjY2VlZGVkICglbHgpXG4iLCB4KTsKLSAgICAgfQotICAgICAqLwotCi0gIHJlbG9jYXRpb24gPj49IChiZmRfdm1hKSBob3d0by0+cmlnaHRzaGlmdDsKLQotICAvKiBTaGlmdCBldmVyeXRoaW5nIHVwIHRvIHdoZXJlIGl0J3MgZ29pbmcgdG8gYmUgdXNlZCAqLwotCi0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIFdhaXQgZm9yIHRoZSBkYXkgd2hlbiBhbGwgaGF2ZSB0aGUgbWFzayBpbiB0aGVtICovCi0KLSAgLyogV2hhdCB3ZSBkbzoKLSAgICAgaSBpbnN0cnVjdGlvbiB0byBiZSBsZWZ0IGFsb25lCi0gICAgIG8gb2Zmc2V0IHdpdGhpbiBpbnN0cnVjdGlvbgotICAgICByIHJlbG9jYXRpb24gb2Zmc2V0IHRvIGFwcGx5Ci0gICAgIFMgc3JjIG1hc2sKLSAgICAgRCBkc3QgbWFzawotICAgICBOIH5kc3QgbWFzawotICAgICBBIHBhcnQgMQotICAgICBCIHBhcnQgMgotICAgICBSIHJlc3VsdAotCi0gICAgIERvIHRoaXM6Ci0gICAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gICAgICAgIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICAgICAgICAgIFMgUyBTIFMgUyAgICB0byBnZXQgdGhlIHNpemUgb2Zmc2V0IHdlIHdhbnQKLSAgICAgKyAgIHIgciByIHIgciByIHIgciByIHIgIHRvIGdldCB0aGUgZmluYWwgdmFsdWUgdG8gcGxhY2UKLSAgICAgYW5kICAgICAgICAgICBEIEQgRCBEIEQgIHRvIGNob3AgdG8gcmlnaHQgc2l6ZQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBBIEEgQSBBIEEKLSAgICAgQW5kIHRoaXM6Ci0gICAgIC4uLiAgIGkgaSBpIGkgaSBvIG8gbyBvIG8gIGZyb20gYmZkX2dldDxzaXplPgotICAgICBhbmQgICBOIE4gTiBOIE4gICAgICAgICAgICBnZXQgaW5zdHJ1Y3Rpb24KLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgLi4uICAgQiBCIEIgQiBCCi0KLSAgICAgQW5kIHRoZW46Ci0gICAgIEIgQiBCIEIgQgotICAgICBvciAgICAgICAgICAgICAgQSBBIEEgQSBBCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIFIgUiBSIFIgUiBSIFIgUiBSIFIgICAgICAgIHB1dCBpbnRvIGJmZF9wdXQ8c2l6ZT4KLSAgICAgKi8KLQotI2RlZmluZSBET0lUKHgpIFwKLSAgeCA9ICggKHggJiB+aG93dG8tPmRzdF9tYXNrKSB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgIHJlbG9jYXRpb24pICYgaG93dG8tPmRzdF9tYXNrKSkKLQotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0JY2hhciB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDEpOwotCURPSVQgKHgpOwotCW92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSwgYWRkciwgMSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIGlmIChyZWxvY2F0aW9uKQotCXsKLQkgIHNob3J0IHggPSBnZXRfZGF0YSAoZGF0YSwgYWRkciwgMik7Ci0JICBET0lUICh4KTsKLQkgIG92ZXJmbG93ID0gcHV0X2RhdGEoeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSwgYWRkciwgMik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHJlbG9jYXRpb24pCi0JewotCSAgbG9uZyB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDQpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDQpOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyAgeCA9IGdldF9kYXRhKGRhdGEsIGFkZHIsIDQpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUKHgpOwotCW92ZXJmbG93ID0gcHV0X2RhdGEoeCwgZGF0YSAsIGFkZHIsIDQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBEbyBub3RoaW5nICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSNpZmRlZiBCRkQ2NAotICAgICAgaWYgKHJlbG9jYXRpb24pCi0JewotCSAgYmZkX3ZtYSB4ID0gZ2V0X2RhdGEgKGRhdGEsIGFkZHIsIDgpOwotCSAgRE9JVCAoeCk7Ci0JICBvdmVyZmxvdyA9IHB1dF9kYXRhKHgsIGRhdGEsIGFkZHIsIDgpOwotCX0KLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci0gICAgfQotICBpZiAoKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KSAmJiBvdmVyZmxvdykKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHJldHVybiBmbGFnOwotfQotCi0vKiBSZWxvY2F0ZSBhIGdpdmVuIGxvY2F0aW9uIHVzaW5nIGEgZ2l2ZW4gdmFsdWUgYW5kIGhvd3RvLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX2RvX25zMzJrX3JlbG9jX2NvbnRlbnRzICggaG93dG8sIGlucHV0X2JmZCwgcmVsb2NhdGlvbiwgbG9jYXRpb24sCi0JCQkgICAgICBnZXRfZGF0YSwgcHV0X2RhdGEpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICBiZmRfYnl0ZSAqbG9jYXRpb247Ci0gICAgIGxvbmcgKCpnZXRfZGF0YSkoKTsKLSAgICAgaW50ICgqcHV0X2RhdGEpKCk7Ci17Ci0gIGludCBzaXplOwotICBiZmRfdm1hIHg7Ci0gIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLSAgLyogSWYgdGhlIHNpemUgaXMgbmVnYXRpdmUsIG5lZ2F0ZSBSRUxPQ0FUSU9OLiAgVGhpcyBpc24ndCB2ZXJ5Ci0gICAgIGdlbmVyYWwuICAqLwotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICAvKiBHZXQgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZWxvY2F0ZS4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA0OgotI2lmZGVmIEJGRDY0Ci0gICAgY2FzZSA4OgotI2VuZGlmCi0gICAgICB4ID0gZ2V0X2RhdGEgKGxvY2F0aW9uLCAwLCBzaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICBGSVhNRTogV2UgbWF5IGRyb3AgYml0cyBkdXJpbmcgdGhlIGFkZGl0aW9uCi0gICAgIHdoaWNoIHdlIGRvbid0IGNoZWNrIGZvci4gIFdlIG11c3QgZWl0aGVyIGNoZWNrIGF0IGV2ZXJ5IHNpbmdsZQotICAgICBvcGVyYXRpb24sIHdoaWNoIHdvdWxkIGJlIHRlZGlvdXMsIG9yIHdlIG11c3QgZG8gdGhlIGNvbXB1dGF0aW9ucwotICAgICBpbiBhIHR5cGUgbGFyZ2VyIHRoYW4gYmZkX3ZtYSwgd2hpY2ggd291bGQgYmUgaW5lZmZpY2llbnQuICAqLwotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBjaGVjazsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHNpZ25lZF9jaGVjazsKLSAgICAgIGJmZF92bWEgYWRkOwotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbmVkX2FkZDsKLQotICAgICAgaWYgKGhvd3RvLT5yaWdodHNoaWZ0ID09IDApCi0JewotCSAgY2hlY2sgPSByZWxvY2F0aW9uOwotCSAgc2lnbmVkX2NoZWNrID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBEcm9wIHVud2FudGVkIGJpdHMgZnJvbSB0aGUgdmFsdWUgd2UgYXJlIHJlbG9jYXRpbmcgdG8uICAqLwotCSAgY2hlY2sgPSByZWxvY2F0aW9uID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotCi0JICAvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkgICAgIGxlYWRpbmcgMSBiaXRzIChhc3N1bWluZyB0d29zIGNvbXBsZW1lbnQpLiAgKi8KLQkgIGlmICgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj0gMCkKLQkgICAgc2lnbmVkX2NoZWNrID0gY2hlY2s7Ci0JICBlbHNlCi0JICAgIHNpZ25lZF9jaGVjayA9IChjaGVjawotCQkJICAgIHwgKChiZmRfdm1hKSAtIDEKLQkJCSAgICAgICAmIH4oKGJmZF92bWEpIC0gMSA+PiBob3d0by0+cmlnaHRzaGlmdCkpKTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgdmFsdWUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICAqLwotICAgICAgYWRkID0geCAmIGhvd3RvLT5zcmNfbWFzazsKLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSB3aXRoIGFuIGFwcHJvcHJpYXRlIHNpZ24uCi0JIFRoZSBleHByZXNzaW9uIGludm9sdmluZyBob3d0by0+c3JjX21hc2sgaXNvbGF0ZXMgdGhlIHVwcGVyCi0JIGJpdCBvZiBzcmNfbWFzay4gIElmIHRoYXQgYml0IGlzIHNldCBpbiB0aGUgdmFsdWUgd2UgYXJlCi0JIGFkZGluZywgaXQgaXMgbmVnYXRpdmUsIGFuZCB3ZSBzdWJ0cmFjdCBvdXQgdGhhdCBudW1iZXIgdGltZXMKLQkgdHdvLiAgSWYgc3JjX21hc2sgaW5jbHVkZXMgdGhlIGhpZ2hlc3QgcG9zc2libGUgYml0LCB0aGVuIHdlCi0JIGNhbiBub3QgZ2V0IHRoZSB1cHBlciBiaXQsIGJ1dCB0aGF0IGRvZXMgbm90IG1hdHRlciBzaW5jZQotCSBzaWduZWRfYWRkIG5lZWRzIG5vIGFkanVzdG1lbnQgdG8gYmVjb21lIG5lZ2F0aXZlIGluIHRoYXQKLQkgY2FzZS4gICovCi0gICAgICBzaWduZWRfYWRkID0gYWRkOwotICAgICAgaWYgKChhZGQgJiAoKCh+aG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzaykpICE9IDApCi0Jc2lnbmVkX2FkZCAtPSAoKCh+aG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzaykgPDwgMTsKLQotICAgICAgLyogQWRkIHRoZSB2YWx1ZSBmcm9tIHRoZSBvYmplY3QgZmlsZSwgc2hpZnRlZCBzbyB0aGF0IGl0IGlzIGEKLQkgc3RyYWlnaHQgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChob3d0by0+Yml0cG9zID09IDApCi0JewotCSAgY2hlY2sgKz0gYWRkOwotCSAgc2lnbmVkX2NoZWNrICs9IHNpZ25lZF9hZGQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoZWNrICs9IGFkZCA+PiBob3d0by0+Yml0cG9zOwotCi0JICAvKiBGb3IgdGhlIHNpZ25lZCBjYXNlIHdlIHVzZSBBREQsIHJhdGhlciB0aGFuIFNJR05FRF9BREQsCi0JICAgICB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuICBUaGlzIGlzIE9LIHNpbmNlIHdlCi0JICAgICBleHBsaWN0bHkgaGFuZGxlIHRoZSBzaWduIGJpdHMuICAqLwotCSAgaWYgKHNpZ25lZF9hZGQgPj0gMCkKLQkgICAgc2lnbmVkX2NoZWNrICs9IGFkZCA+PiBob3d0by0+Yml0cG9zOwotCSAgZWxzZQotCSAgICBzaWduZWRfY2hlY2sgKz0gKChhZGQgPj4gaG93dG8tPmJpdHBvcykKLQkJCSAgICAgfCAoKGJmZF92bWEpIC0gMQotCQkJCSYgfigoYmZkX3ZtYSkgLSAxID4+IGhvd3RvLT5iaXRwb3MpKSk7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICB7Ci0JICAgIC8qIEFzc3VtZXMgdHdvJ3MgY29tcGxlbWVudC4gICovCi0JICAgIGJmZF9zaWduZWRfdm1hIHJlbG9jX3NpZ25lZF9tYXggPSAoMSA8PCAoaG93dG8tPmJpdHNpemUgLSAxKSkgLSAxOwotCSAgICBiZmRfc2lnbmVkX3ZtYSByZWxvY19zaWduZWRfbWluID0gfnJlbG9jX3NpZ25lZF9tYXg7Ci0KLQkgICAgaWYgKHNpZ25lZF9jaGVjayA+IHJlbG9jX3NpZ25lZF9tYXgKLQkJfHwgc2lnbmVkX2NoZWNrIDwgcmVsb2Nfc2lnbmVkX21pbikKLQkgICAgICBvdmVyZmxvdyA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkOgotCSAgewotCSAgICAvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICBUaGlzIGV4cHJlc3Npb24gYXZvaWRzCi0JICAgICAgIG92ZXJmbG93IGlmIGhvd3RvLT5iaXRzaXplIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbgotCSAgICAgICBiZmRfdm1hLiAgKi8KLQkgICAgYmZkX3ZtYSByZWxvY191bnNpZ25lZF9tYXggPQotCSAgICAoKCgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotCSAgICBpZiAoY2hlY2sgPiByZWxvY191bnNpZ25lZF9tYXgpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZDoKLQkgIHsKLQkgICAgLyogQXNzdW1lcyB0d28ncyBjb21wbGVtZW50LiAgVGhpcyBleHByZXNzaW9uIGF2b2lkcwotCSAgICAgICBvdmVyZmxvdyBpZiBob3d0by0+Yml0c2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4KLQkgICAgICAgYmZkX3ZtYS4gICovCi0JICAgIGJmZF92bWEgcmVsb2NfYml0cyA9ICgoKDEgPDwgKGhvd3RvLT5iaXRzaXplIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0JICAgIGlmICgoY2hlY2sgJiB+cmVsb2NfYml0cykgIT0gMAotCQkmJiAoKChiZmRfdm1hKSBzaWduZWRfY2hlY2sgJiB+cmVsb2NfYml0cykKLQkJICAgICE9ICgtMSAmIH5yZWxvY19iaXRzKSkpCi0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICB9Ci0KLSAgLyogUHV0IFJFTE9DQVRJT04gaW4gdGhlIHJpZ2h0IGJpdHMuICAqLwotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBob3d0by0+Yml0cG9zOwotCi0gIC8qIEFkZCBSRUxPQ0FUSU9OIHRvIHRoZSByaWdodCBiaXRzIG9mIFguICAqLwotICB4ID0gKCh4ICYgfmhvd3RvLT5kc3RfbWFzaykKLSAgICAgICB8ICgoKHggJiBob3d0by0+c3JjX21hc2spICsgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKTsKLQotICAvKiBQdXQgdGhlIHJlbG9jYXRlZCB2YWx1ZSBiYWNrIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgNDoKLSNpZmRlZiBCRkQ2NAotICAgIGNhc2UgODoKLSNlbmRpZgotICAgICAgcHV0X2RhdGEoeCwgbG9jYXRpb24sIDAsIHNpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX25zMzJrX3JlbG9jX2Rpc3AgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGRvX25zMzJrX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UsCi0JCQkgX2JmZF9uczMya19nZXRfZGlzcGxhY2VtZW50LAotCQkJIF9iZmRfbnMzMmtfcHV0X2Rpc3BsYWNlbWVudCk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9uczMya19yZWxvY19pbW0gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gZG9fbnMzMmtfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSwgX2JmZF9uczMya19nZXRfaW1tZWRpYXRlLAotCQkJIF9iZmRfbnMzMmtfcHV0X2ltbWVkaWF0ZSk7Ci19Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9uczMya19maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQlhZGRyZXNzLCB2YWx1ZSwgYWRkZW5kKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MuICAqLwotICBpZiAoYWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIGJhc2ljIHJlbG9jYXRpb24KLSAgICAgYWdhaW5zdCBhIHN5bWJvbC4gIFdlIHdhbnQgdG8gY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB0bwotICAgICByZWxvY2F0ZSB0by4gIFRoaXMgaXMganVzdCBWQUxVRSwgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHBsdXMKLSAgICAgQURERU5ELCBhbnkgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2MuICAqLwotICByZWxvY2F0aW9uID0gdmFsdWUgKyBhZGRlbmQ7Ci0KLSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgUEMgcmVsYXRpdmUsIHdlIHdhbnQgdG8gc2V0IFJFTE9DQVRJT04gdG8KLSAgICAgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN5bWJvbCAoY3VycmVudGx5IGluIFJFTE9DQVRJT04pIGFuZCB0aGUKLSAgICAgbG9jYXRpb24gd2UgYXJlIHJlbG9jYXRpbmcuICBTb21lIHRhcmdldHMgKGUuZy4sIGkzODYtYW91dCkKLSAgICAgYXJyYW5nZSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUKLSAgICAgb2Zmc2V0IG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBzdWNoIHRhcmdldHMKLSAgICAgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgT3RoZXIgdGFyZ2V0cyAoZS5nLiwgbTg4a2JjcyBvciBFTEYpCi0gICAgIHNpbXBseSBsZWF2ZSB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gYXMgemVybzsgZm9yIHN1Y2gKLSAgICAgdGFyZ2V0cyBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSBkbyBub3QKLSAgICAgbmVlZCB0byBzdWJ0cmFjdCBvdXQgdGhlIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZQotICAgICBzZWN0aW9uICh3aGljaCBpcyBqdXN0IEFERFJFU1MpLiAgKi8KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICByZWxvY2F0aW9uIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0KQotCXJlbG9jYXRpb24gLT0gYWRkcmVzczsKLSAgICB9Ci0KLSAgcmV0dXJuIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgICAgIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci19CmRpZmYgLS1naXQgYS9iZmQvY3B1LXBvd2VycGMuYyBiL2JmZC9jcHUtcG93ZXJwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWYwZjgwLi4wMDAwMDAwCi0tLSBhL2JmZC9jcHUtcG93ZXJwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qIEJGRCBQb3dlclBDIENQVSBkZWZpbml0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBjb21tb24gUG93ZXJQQyBhcmNoaXRlY3R1cmUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBSUy82MDAwLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqcG93ZXJwY19jb21wYXRpYmxlCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqLCBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKikpOwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICoKLXBvd2VycGNfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgQkZEX0FTU0VSVCAoYS0+YXJjaCA9PSBiZmRfYXJjaF9wb3dlcnBjKTsKLSAgc3dpdGNoIChiLT5hcmNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgcmV0dXJuIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUgKGEsIGIpOwotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotICAgICAgaWYgKGEtPm1hY2ggPT0gMCkKLQlyZXR1cm4gYTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBhcmNoX2luZm9fc3RydWN0W10gPQotewotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDYwMywgLyogZm9yIHRoZSBtcGM2MDMgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NjAzIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMV0KLSAgfSwKLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcG93ZXJwYywKLSAgICA2MDQsIC8qIGZvciB0aGUgbXBjNjA0ICovCi0gICAgInBvd2VycGMiLAotICAgICJwb3dlcnBjOjYwNCIsCi0gICAgMywKLSAgICBmYWxzZSwgLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzJdCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgNDAzLCAvKiBmb3IgdGhlIDQwMyAqLwotICAgICJwb3dlcnBjIiwKLSAgICAicG93ZXJwYzo0MDMiLAotICAgIDMsCi0gICAgZmFsc2UsIC8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIHBvd2VycGNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFszXQotICB9LAotICB7Ci0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9wb3dlcnBjLAotICAgIDYwMSwgLyogZm9yIHRoZSBtcGM2MDEgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6NjAxIiwKLSAgICAzLAotICAgIGZhbHNlLCAvKiBub3QgdGhlIGRlZmF1bHQgKi8KLSAgICBwb3dlcnBjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMAotICB9Ci19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3Bvd2VycGNfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3Bvd2VycGMsCi0gICAgMCwgLyogZm9yIHRoZSBQT1dFUi9Qb3dlclBDIGNvbW1vbiBhcmNoaXRlY3R1cmUgKi8KLSAgICAicG93ZXJwYyIsCi0gICAgInBvd2VycGM6Y29tbW9uIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBkZWZhdWx0ICovCi0gICAgcG93ZXJwY19jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgICZhcmNoX2luZm9fc3RydWN0WzBdCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXJzNjAwMC5jIGIvYmZkL2NwdS1yczYwMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MmFlOS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXJzNjAwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciByczYwMDAgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgRklYTUU6IENhbiBzb21lb25lIHByb3ZpZGUgYSB0cmFuc2xpdGVyYXRpb24gb2YgdGhpcyBuYW1lIGludG8gQVNDSUk/Ci0gICBVc2luZyB0aGUgZm9sbG93aW5nIGNoYXJzIGNhdXNlZCBhIGNvbXBpbGVyIHdhcm5pbmcgb24gSElVWCAoc28gSSByZXBsYWNlZAotICAgdGhlbSB3aXRoIG9jdGFsIGVzY2FwZXMpLCBhbmQgaXNuJ3QgdXNlZnVsIHdpdGhvdXQgYW4gdW5kZXJzdGFuZGluZyBvZiB3aGF0Ci0gICBjaGFyYWN0ZXIgc2V0IGl0IGlzLgotICAgV3JpdHRlbiBieSBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1IG9mIElCTQotICAgYW5kIEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFRoZSBSUy82MDAwIGFyY2hpdGVjdHVyZSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFBvd2VyUEMgY29tbW9uCi0gICBhcmNoaXRlY3R1cmUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICpyczYwMDBfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1yczYwMDBfY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgQkZEX0FTU0VSVCAoYS0+YXJjaCA9PSBiZmRfYXJjaF9yczYwMDApOwotICBzd2l0Y2ggKGItPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICBjYXNlIGJmZF9hcmNoX3JzNjAwMDoKLSAgICAgIHJldHVybiBiZmRfZGVmYXVsdF9jb21wYXRpYmxlIChhLCBiKTsKLSAgICBjYXNlIGJmZF9hcmNoX3Bvd2VycGM6Ci0gICAgICBpZiAoYi0+bWFjaCA9PSAwKQotCXJldHVybiBiOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3JzNjAwMF9hcmNoID0KLSAgewotICAgIDMyLAkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfcnM2MDAwLAotICAgIDYwMDAsCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgInJzNjAwMCIsCi0gICAgInJzNjAwMDo2MDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICByczYwMDBfY29tcGF0aWJsZSwKLSAgICBiZmRfZGVmYXVsdF9zY2FuLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXNoLmMgYi9iZmQvY3B1LXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YWRmOTIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1zaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qIEJGRCBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpLVNIIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEhhY2tlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuX21hY2ggKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNhc2VjbXAgKGluZm8tPnByaW50YWJsZV9uYW1lLCBzdHJpbmcpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0jaWYgMAotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSxiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmFyY2ggIT0gYi0+YXJjaCB8fCBhLT5tYWNoICE9IGItPm1hY2gpCi0gICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGE7Ci19Ci0jZW5kaWYKLQotI2RlZmluZSBTSF9ORVhUICZhcmNoX2luZm9fc3RydWN0WzBdCi0jZGVmaW5lIFNIM19ORVhUICZhcmNoX2luZm9fc3RydWN0WzFdCi0jZGVmaW5lIFNIM0VfTkVYVCBOVUxMCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0gCi17Ci0gIHsKLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJCQkJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NoLAotICAgIGJmZF9tYWNoX3NoMywKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2gzIiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAgIDEsCi0gICAgZmFsc2UsCQkJLyogbm90IHRoZSBkZWZhdWx0ICovCi0gICAgYmZkX2RlZmF1bHRfY29tcGF0aWJsZSwKLSAgICBzY2FuX21hY2gsCi0gICAgU0gzX05FWFQKLSAgfSwKLSAgewotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gICAgYmZkX2FyY2hfc2gsCi0gICAgYmZkX21hY2hfc2gzZSwKLSAgICAic2giLAkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgICAic2gzZSIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAxLAotICAgIGZhbHNlLAkJCS8qIG5vdCB0aGUgZGVmYXVsdCAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gICAgc2Nhbl9tYWNoLAotICAgIFNIM0VfTkVYVAotICB9LAotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zaF9hcmNoID0KLXsKLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gIDMyLAkJCQkvKiAzMiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgOCwJCQkJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICBiZmRfYXJjaF9zaCwKLSAgYmZkX21hY2hfc2gsCi0gICJzaCIsCQkJCS8qIGFyY2hfbmFtZSAgKi8KLSAgInNoIiwJCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgMSwKLSAgdHJ1ZSwJCQkJLyogdGhlIGRlZmF1bHQgbWFjaGluZSAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICBzY2FuX21hY2gsCi0gIFNIX05FWFQKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXNwYXJjLmMgYi9iZmQvY3B1LXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNGJkOTIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS1zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qIEJGRCBzdXBwb3J0IGZvciB0aGUgU1BBUkMgYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyogRG9uJ3QgbWl4IDMyIGJpdCBhbmQgNjQgYml0IGZpbGVzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqc3BhcmNfY29tcGF0aWJsZQotICBQQVJBTVMgKChjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKiwgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICopKTsKLQotc3RhdGljIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqCi1zcGFyY19jb21wYXRpYmxlIChhLCBiKQotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmE7Ci0gICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYjsKLXsKLSAgaWYgKGEtPmJpdHNfcGVyX3dvcmQgIT0gYi0+Yml0c19wZXJfd29yZCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gYmZkX2RlZmF1bHRfY29tcGF0aWJsZSAoYSwgYik7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYXJjaF9pbmZvX3N0cnVjdFtdID0KLXsKLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0LAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnNwYXJjbGV0IiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMV0sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6c3BhcmNsaXRlIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbMl0sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OHBsdXMsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6djhwbHVzIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbM10sCi0gIH0sCi0gIHsKLSAgICAzMiwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OHBsdXNhLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY4cGx1c2EiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFs0XSwKLSAgfSwKLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSwKLSAgICAic3BhcmMiLAotICAgICJzcGFyYzpzcGFyY2xpdGVfbGUiLAotICAgIDMsCi0gICAgZmFsc2UsCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFs1XSwKLSAgfSwKLSAgewotICAgIDY0LAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDY0LAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjX3Y5LAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjOnY5IiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgJmFyY2hfaW5mb19zdHJ1Y3RbNl0sCi0gIH0sCi0gIHsKLSAgICA2NCwJLyogYml0cyBpbiBhIHdvcmQgKi8KLSAgICA2NCwJLyogYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF9zcGFyYywKLSAgICBiZmRfbWFjaF9zcGFyY192OWEsCi0gICAgInNwYXJjIiwKLSAgICAic3BhcmM6djlhIiwKLSAgICAzLAotICAgIGZhbHNlLAotICAgIHNwYXJjX2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4sCi0gICAgMCwKLSAgfQotfTsKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9zcGFyY19hcmNoID0KLSAgewotICAgIDMyLAkvKiBiaXRzIGluIGEgd29yZCAqLwotICAgIDMyLAkvKiBiaXRzIGluIGFuIGFkZHJlc3MgKi8KLSAgICA4LAkvKiBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3NwYXJjLAotICAgIGJmZF9tYWNoX3NwYXJjLAotICAgICJzcGFyYyIsCi0gICAgInNwYXJjIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBkZWZhdWx0ICovCi0gICAgc3BhcmNfY29tcGF0aWJsZSwgCi0gICAgYmZkX2RlZmF1bHRfc2NhbiwKLSAgICAmYXJjaF9pbmZvX3N0cnVjdFswXSwKLSAgfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdGljMzAuYyBiL2JmZC9jcHUtdGljMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ3MjNmNy4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXRpYzMwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzMwX2FyY2ggPQotewotICAzMiwJCQkJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3RpYzMwLAotICAwLAkJCQkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAidGljMzAiLAotICAidG1zMzIwYzMwIiwKLSAgMiwKLSAgdHJ1ZSwJCQkJLyogdGhlIG9uZSBhbmQgb25seSAqLwotICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICBiZmRfZGVmYXVsdF9zY2FuLAotICAwLAotfTsKZGlmZiAtLWdpdCBhL2JmZC9jcHUtdGljODAuYyBiL2JmZC9jcHUtdGljODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyODY2ZS4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXRpYzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBiZmQgYmFjay1lbmQgZm9yIFRJIFRNUzMyMEM4MCAoTVZQKSBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBhdCBDeWdudXMgc3VwcG9ydCAoZm5mQGN5Z251cy5jb20pCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3RpYzgwX2FyY2ggPQotICB7Ci0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYSB3b3JkICovCi0gICAgMzIsCQkJCS8qIDMyIGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICAgIDgsCQkJCS8qIDggYml0cyBpbiBhIGJ5dGUgKi8KLSAgICBiZmRfYXJjaF90aWM4MCwJCS8qIGJmZF9hcmNoaXRlY3R1cmUgZW51bSAqLwotICAgIDAsCQkJCS8qIG9ubHkgMSBtYWNoaW5lICovCi0gICAgInRpYzgwIiwJCQkvKiBhcmNoaXRlY3R1cmUgbmFtZSAqLwotICAgICJ0aWM4MCIsCQkJLyogcHJpbnRhYmxlIG5hbWUgKi8KLSAgICAyLAkJCQkvKiBzZWN0aW9uIGFsaWdubWVudCBwb3dlciAqLwotICAgIHRydWUsCQkJLyogZGVmYXVsdCBtYWNoaW5lIGZvciBhcmNoaXRlY3R1cmUgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIE5VTEwsCQkJCS8qIFBvaW50ZXIgdG8gbmV4dCBpbiBjaGFpbiAqLwotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS12ODUwLmMgYi9iZmQvY3B1LXY4NTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5NDEzZC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXY4NTAuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgdGhlIE5FQyBWODUwIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqIHN0cmluZzsKLXsKLSAgY29uc3QgY2hhciAqcHRyX3NyYzsKLSAgY29uc3QgY2hhciAqcHRyX3RzdDsKLSAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qIEZpcnN0IHRlc3QgZm9yIGFuIGV4YWN0IG1hdGNoICovCi0gIGlmIChzdHJjYXNlY21wIChzdHJpbmcsIGluZm8tPnByaW50YWJsZV9uYW1lKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSBob3cgbXVjaCBvZiB0aGUgc3VwcGxpZWQgc3RyaW5nIG1hdGNoZXMgd2l0aCB0aGUKLSAgICAgYXJjaGl0ZWN0dXJlLCBlZyB0aGUgc3RyaW5nIG02OGs6NjgwMjAgd291bGQgbWF0Y2ggdGhlIG02OGsgZW50cnkKLSAgICAgdXAgdG8gdGhlIDosIHRoZW4gd2UgZ2V0IGxlZnQgd2l0aCB0aGUgbWFjaGluZSBudW1iZXIgKi8KLQotICBmb3IgKHB0cl9zcmMgPSBzdHJpbmcsIHB0cl90c3QgPSBpbmZvLT5hcmNoX25hbWU7IAotICAgICAgICpwdHJfc3JjICYmICpwdHJfdHN0OwotICAgICAgIHB0cl9zcmMrKywgcHRyX3RzdCsrKSAKLSAgICB7Ci0gICAgICBpZiAoKnB0cl9zcmMgIT0gKnB0cl90c3QpIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGV3ZWQgdXAgYXMgbXVjaCBvZiB0aGUgYXJjaGl0ZWN0dXJlIGFzIHdpbGwgbWF0Y2gsIHNraXAgYW55Ci0gICAgIGNvbG9ucyAqLwotICBpZiAoKnB0cl9zcmMgPT0gJzonKQotICAgIHB0cl9zcmMrKzsKLSAgCi0gIGlmICgqcHRyX3NyYyA9PSAwKQotICAgIHsKLSAgICAgIC8qIG5vdGhpbmcgbW9yZSwgdGhlbiBvbmx5IGtlZXAgdGhpcyBvbmUgaWYgaXQgaXMgdGhlIGRlZmF1bHQKLQkgbWFjaGluZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUgKi8KLSAgICAgIHJldHVybiBpbmZvLT50aGVfZGVmYXVsdDsKLSAgICB9Ci0KLSAgbnVtYmVyID0gMDsKLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcHRyX3NyYykpCi0gICAgewotICAgICAgbnVtYmVyID0gbnVtYmVyICogMTAgKyAqIHB0cl9zcmMgIC0gJzAnOwotICAgICAgcHRyX3NyYysrOwotICAgIH0KLQotICBzd2l0Y2ggKG51bWJlcikgCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfdjg1MGU6ICBhcmNoID0gYmZkX2FyY2hfdjg1MDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZWE6IGFyY2ggPSBiZmRfYXJjaF92ODUwOyBicmVhazsKLSAgICBkZWZhdWx0OiAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChhcmNoICE9IGluZm8tPmFyY2gpIAotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobnVtYmVyICE9IGluZm8tPm1hY2gpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE4obnVtYmVyLCBwcmludCwgZGVmYXVsdCwgbmV4dCkgIFwKLXsgIDMyLCAzMiwgOCwgYmZkX2FyY2hfdjg1MCwgbnVtYmVyLCAidjg1MCIsIHByaW50LCAyLCBkZWZhdWx0LCBcCi0gICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIHNjYW4sIG5leHQgfQotCi0jZGVmaW5lIE5FWFQgTlVMTAotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9IAotewotICBOIChiZmRfbWFjaF92ODUwZSwgICJ2ODUwZSIsICBmYWxzZSwgJmFyY2hfaW5mb19zdHJ1Y3RbMV0pLAotICBOIChiZmRfbWFjaF92ODUwZWEsICJ2ODUwZWEiLCBmYWxzZSwgTlVMTCkKLX07Ci0KLSN1bmRlZiBORVhUCi0jZGVmaW5lIE5FWFQgJmFyY2hfaW5mb19zdHJ1Y3RbMF0KLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92ODUwX2FyY2ggPQotICBOIChiZmRfbWFjaF92ODUwLCAidjg1MCIsIHRydWUsIE5FWFQpOwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS12YXguYyBiL2JmZC9jcHUtdmF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYzZkMzkuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS12YXguYworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgdmF4IHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF92YXhfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3ZheCwKLSAgICAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ2YXgiLAotICAgICJ2YXgiLAotICAgIDMsCi0gICAgdHJ1ZSwgLyogdGhlIG9uZSBhbmQgb25seSAqLwotICAgIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsIAotICAgIGJmZF9kZWZhdWx0X3NjYW4gLAotICAgIDAsCi0gIH07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXc2NS5jIGIvYmZkL2NwdS13NjUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiYmYwNC4uMDAwMDAwMAotLS0gYS9iZmQvY3B1LXc2NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIGxpYnJhcnkgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIFdEQyA2NTgxNiBhcmNoaXRlY3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBIYWNrZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGl3NjVlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSB3NjVvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLQotaW50IGJmZF9kZWZhdWx0X3NjYW5fbnVtX21hY2goKTsKLQotc3RhdGljIGJvb2xlYW4gCi1zY2FuX21hY2ggKGluZm8sIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHN0cmNtcChzdHJpbmcsInc2NSIpID09IDApIHJldHVybiB0cnVlOwotICBpZiAoc3RyY21wKHN0cmluZywidzY1ODE2IikgPT0gMCkgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfdzY1X2FyY2ggPQotewotICAxNiwJCQkJLyogMTYgYml0cyBpbiBhIHdvcmQgKi8KLSAgMjQsCQkJCS8qIDI0IGJpdHMgaW4gYW4gYWRkcmVzcyAqLwotICA4LAkJCQkvKiA4IGJpdHMgaW4gYSBieXRlICovCi0gIGJmZF9hcmNoX3c2NSwKLSAgMCwJCQkJLyogb25seSAxIG1hY2hpbmUgKi8KLSAgInc2NSIsCQkJLyogYXJjaF9uYW1lICAqLwotICAidzY1IiwJCQkvKiBwcmludGFibGUgbmFtZSAqLwotICAxLAotICB0cnVlLAkJCQkvKiB0aGUgZGVmYXVsdCBtYWNoaW5lICovCi0gIGJmZF9kZWZhdWx0X2NvbXBhdGlibGUsCi0gIHNjYW5fbWFjaCwKLSAgMCwKLX07CmRpZmYgLS1naXQgYS9iZmQvY3B1LXdlMzJrLmMgYi9iZmQvY3B1LXdlMzJrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGNiYzEuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS13ZTMyay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogYmZkIGJhY2stZW5kIGZvciB3ZTMyayBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBCcmVuZGFuIEtlaG9lIChicmVuZGFuQGNzLndpZGVuZXIuZWR1KS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLWNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSBiZmRfd2UzMmtfYXJjaCA9Ci0gIHsKLSAgICAzMiwJLyogMzIgYml0cyBpbiBhIHdvcmQgKi8KLSAgICAzMiwJLyogMzIgYml0cyBpbiBhbiBhZGRyZXNzICovCi0gICAgOCwJLyogOCBiaXRzIGluIGEgYnl0ZSAqLwotICAgIGJmZF9hcmNoX3dlMzJrLAotICAgIDMyMDAwLAkvKiBvbmx5IDEgbWFjaGluZSAqLwotICAgICJ3ZTMyayIsCi0gICAgIndlMzJrOjMyMDAwIiwKLSAgICAzLAotICAgIHRydWUsIC8qIHRoZSBvbmUgYW5kIG9ubHkgKi8KLSAgICBiZmRfZGVmYXVsdF9jb21wYXRpYmxlLCAKLSAgICBiZmRfZGVmYXVsdF9zY2FuICwKLSAgICAwLAotICB9OwpkaWZmIC0tZ2l0IGEvYmZkL2NwdS16OGsuYyBiL2JmZC9jcHUtejhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjY2U4ZWIuLjAwMDAwMDAKLS0tIGEvYmZkL2NwdS16OGsuYworKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKiBCRkQgbGlicmFyeSBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgWjgwMG4gYXJjaGl0ZWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgSGFja2VkIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotCi0jaWYgMAkJCQkvKiBub3QgdXNlZCBjdXJyZW50bHkgKi8KLS8qCi1SZWxvY2F0aW9ucyBmb3IgdGhlIFo4SwotCi0qLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG8xNl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICBpZ25vcmVfaW5wdXRfc2VjdGlvbiwgaWdub3JlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlnbm9yZV9pbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKmlnbm9yZV9iZmQ7Ci17Ci0gIGxvbmcgcmVsb2NhdGlvbiA9IDA7Ci0gIGJmZF92bWEgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaG93dG84X2NhbGxiYWNrIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLAotCQkgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbG9uZyB4ID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1ob3d0bzhfRkZubl9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgaWdub3JlX2lucHV0X3NlY3Rpb24sIGlnbm9yZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppZ25vcmVfaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICppZ25vcmVfYmZkOwotewotICBsb25nIHJlbG9jYXRpb24gPSAwOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLQotICBsb25nIHggPSBiZmRfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGFib3J0ICgpOwotICBIT1dUT19QUkVQQVJFIChyZWxvY2F0aW9uLCBzeW1ib2xfaW4pOwotCi0gIHggPSAoeCArIHJlbG9jYXRpb24gKyByZWxvY19lbnRyeS0+YWRkZW5kKTsKLQotICBiZmRfcHV0XzggKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWhvd3RvOF9wY3JlbF9jYWxsYmFjayAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbF9pbiwgZGF0YSwKLQkJICAgICAgIGlnbm9yZV9pbnB1dF9zZWN0aW9uLCBpZ25vcmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICpzeW1ib2xfaW47Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaWdub3JlX2lucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqaWdub3JlX2JmZDsKLXsKLSAgbG9uZyByZWxvY2F0aW9uID0gMDsKLSAgYmZkX3ZtYSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGxvbmcgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgYWJvcnQgKCk7Ci0gIEhPV1RPX1BSRVBBUkUgKHJlbG9jYXRpb24sIHN5bWJvbF9pbik7Ci0KLSAgeCA9ICh4ICsgcmVsb2NhdGlvbiArIHJlbG9jX2VudHJ5LT5hZGRlbmQpOwotCi0gIGJmZF9wdXRfOCAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzE2Ci09IE5FV0hPV1RPIChob3d0bzE2X2NhbGxiYWNrLCAiYWJzMTYiLCAxLCBmYWxzZSwgZmFsc2UpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgaG93dG9fOAotPSBORVdIT1dUTyAoaG93dG84X2NhbGxiYWNrLCAiYWJzOCIsIDAsIGZhbHNlLCBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGhvd3RvXzhfRkZubgotPSBORVdIT1dUTyAoaG93dG84X0ZGbm5fY2FsbGJhY2ssICJmZjAwK2FiczgiLCAwLCBmYWxzZSwgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b184X3BjcmVsCi09IE5FV0hPV1RPIChob3d0bzhfcGNyZWxfY2FsbGJhY2ssICJwY3JlbDgiLCAwLCBmYWxzZSwgdHJ1ZSk7Ci0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotbG9jYWxfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhcmNoLCBjb2RlKQotICAgICBjb25zdCBzdHJ1Y3QgYmZkX2FyY2hfaW5mbyAqYXJjaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICByZXR1cm4gJmhvd3RvXzE2OwotICAgIGNhc2UgQkZEX1JFTE9DXzhfRkZubjoKLSAgICAgIHJldHVybiAmaG93dG9fOF9GRm5uOwotICAgIGNhc2UgQkZEX1JFTE9DXzg6Ci0gICAgICByZXR1cm4gJmhvd3RvXzg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLSAgICAgIHJldHVybiAmaG93dG9fOF9wY3JlbDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotI2VuZGlmCi0KLWludCBiZmRfZGVmYXVsdF9zY2FuX251bV9tYWNoICgpOwotCi1zdGF0aWMgYm9vbGVhbgotc2Nhbl9tYWNoIChpbmZvLCBzdHJpbmcpCi0gICAgIGNvbnN0IHN0cnVjdCBiZmRfYXJjaF9pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChzdHJjbXAgKHN0cmluZywgIno4MDAxIikgPT0gMCB8fCBzdHJjbXAgKHN0cmluZywgIno4ayIpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAxID09IGluZm8tPm1hY2g7Ci0gICAgfQotICBpZiAoc3RyY21wIChzdHJpbmcsICJ6ODAwMiIpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9tYWNoX3o4MDAyID09IGluZm8tPm1hY2g7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGlzIHByb3ZpZGVkIHR3byBhcmNoX2luZm9zIGFuZCByZXR1cm5zIHdoZXRoZXIKLSAgIHRoZXknZCBiZSBjb21wYXRpYmxlICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotY29tcGF0aWJsZSAoYSwgYikKLSAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphOwotICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmI7Ci17Ci0gIGlmIChhLT5hcmNoICE9IGItPmFyY2ggfHwgYS0+bWFjaCAhPSBiLT5tYWNoKQotICAgIHJldHVybiBOVUxMOwotICByZXR1cm4gYTsKLX0KLQotCi1zdGF0aWMgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGFyY2hfaW5mb19zdHJ1Y3RbXSA9Ci17Ci0gIHszMiwgMzIsIDgsIGJmZF9hcmNoX3o4aywgYmZkX21hY2hfejgwMDEsICJ6OGsiLCAiejgwMDEiLCAxLCBmYWxzZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAwLH0sCi19OwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgYmZkX3o4a19hcmNoID0KLXsKLSAgMzIsIDE2LCA4LCBiZmRfYXJjaF96OGssIGJmZF9tYWNoX3o4MDAyLCAiejhrIiwgIno4MDAyIiwgMSwgdHJ1ZSwgY29tcGF0aWJsZSwgc2Nhbl9tYWNoLCAmYXJjaF9pbmZvX3N0cnVjdFswXSwKLX07CmRpZmYgLS1naXQgYS9iZmQvZGVtbzY0LmMgYi9iZmQvZGVtbzY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTM4MWQuLjAwMDAwMDAKLS0tIGEvYmZkL2RlbW82NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGRlbW9uc3RyYXRpb24gNjQtYml0IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgNjQKLSNkZWZpbmUgTVkoT1ApIENBVChkZW1vXzY0XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAgImRlbW82NCIKLSNpbmNsdWRlICJhb3V0ZjEuaCIKZGlmZiAtLWdpdCBhL2JmZC9kZXAtaW4uc2VkIGIvYmZkL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0NGRkZTAuLjAwMDAwMDAKLS0tIGEvYmZkL2RlcC1pbi5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi06bG9vcAotL1xcJC9OCi1zL1xcXG4gKi8gL2cKLXQgbG9vcAotCi1zIVwubzohLmxvOiEKLXMhIEBCRkRfSEAhIWcKLXMhQElOQ0RJUkAhJChJTkNESVIpIWcKLXMhQFNSQ0RJUkAvISFnCi1zIWhvc3RzL1teIF0qXC5oICEgIWcKLXMvIHN5c2RlcC5oLy9nCi1zISBcLlwuL2JmZC9zeXNkZXAuaCEhZwotcy8gbGliYmZkLmgvL2cKLXMvIGNvbmZpZy5oLy9nCi1zISBcJChJTkNESVIpL2ZvcGVuLVteIF0qXC5oISFnCi1zISBcJChJTkNESVIpL2Fuc2lkZWNsXC5oISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLXMvICo6LzovZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2JmZC9kb2MvQ2hhbmdlTG9nIGIvYmZkL2RvYy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllODIwN2EuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotVGh1IEZlYiAgNCAyMzoyMTozNiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggY3VycmVudCBhdXRvY29uZi9hdXRvbWFrZS4KLQotVGh1IEp1bCAyMyAwOTozNjo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiZmRpbnQudGV4aSAoQkZEIEVMRiBwcm9jZXNzb3IgcmVxdWlyZWQpOiBBZGQgcGFyYWdyYXBoCi0JZGVzY3JpYmluZyB0aGUgbmVjZXNzaXR5IHRvIGNyZWF0ZSAiaW5jbHVkZS9lbGYvQ1BVLmgiLgotCi1UaHUgTWF5ICA3IDE0OjQ1OjQzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGNoZXcubyk6IEFkZCAtSSBvcHRpb25zIGZvciBpbnRsIHNyY2RpciBhbmQKLQlvYmpkaXIuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAyNyAyMDoxOToyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGludC50ZXhpOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmFtIChub2luc3RfVEVYSU5GT1MpOiBOZXcgdmFyaWFibGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAxMyAxNjo0ODo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gQXByICA2IDE0OjA2OjU1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFNUQUdFU1RVRkYpOiBSZW1vdmUgdmFyaWFibGUuCi0JKENMRUFORklMRVMpOiBEb24ndCByZW1vdmUgJChTVEFHRVNUVUZGKS4KLQkoRElTVENMRUFORklMRVMsIE1BSU5UQUlORVJDTEVBTkZJTEVTKTogTmV3IHZhcmlhYmxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgTWFyIDI3IDE2OjI1OjI1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2hldy5jIChza2lwX3doaXRlX2FuZF9zdGFydHMpOiBSZW1vdmUgdW51c2VkIGRlY2xhcmF0aW9uLgotCShza2lwX3doaXRlX2FuZF9zdGFycyk6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkoc2tpcF90cmFpbGluZ19uZXdsaW5lcywgcGFyYW1zdHVmZiwgY291cmllcml6ZSk6IExpa2V3aXNlLgotCShidWxsZXRpemUsIGRvX2ZhbmN5X3N0dWZmLCBpc2NvbW1hbmQpOiBMaWtld2lzZS4KLQkoa2lsbF9ib2d1c19saW5lcywgbmV4dHdvcmQsIG1haW4pOiBMaWtld2lzZS4KLQkobWFuZ2xlY29tbWVudHMpOiBDb21tZW50IG91dC4KLQkob3V0cHV0ZG90cywga2lsbF9ib2d1c19saW5lcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGVzLgotCShwZXJmb3JtLCBjb21waWxlKTogTGlrZXdpc2UuCi0JKGNvdXJpZXJpemUpOiBGdWxseSBwYXJlbnRoZXNpemUgZXhwcmVzc2lvbi4KLQkoY29weV9wYXN0X25ld2xpbmUpOiBEZWNsYXJlIHJldHVybiB2YWx1ZS4KLQkocHJpbnQpOiBDaGFuZ2UgcHJpbnRmIGZvcm1hdCBzdHJpbmcuCi0JKG1haW4pOiBDYWxsIHVzYWdlIGZvciBhbiB1bnJlY29nbml6ZWQgb3B0aW9uLgotCi1GcmkgRmViIDEzIDE0OjM3OjE0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEphbiAyNiAxNTozODozNiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jLnN0ciAoYm9keXRleHQpOiBEb24ndCBvdXRwdXQgQCogYXQgdGhlIGVuZC4KLQkqIGNoZXcuYyAoa2lsbF9ib2d1c19saW5lcyk6IE1ha2Ugc3VyZSB0aGF0IGEgcGVyaW9kIGF0IHRoZQotCWJlZ2lubmluZyBpcyByZWNvZ25pemVkLgotCShpbmRlbnQpOiBEb24ndCBwdXQgaW5kZW50YXRpb24gYXQgdGhlIGVuZC4KLQkoY29weV9wYXN0X25ld2xpbmUpOiBFeHBhbmQgdGFicy4KLQkqIE1ha2VmaWxlLmFtIChzLXJlbG9jLCBzLXN5bXMpOiBEZXBlbmQgb24gZG9jLnN0ci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgT2N0ICAxIDE0OjQxOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZC5oKTogRG9uJ3QgdXNlIGNwdS1oODMwMC5jLCBjcHUtaTk2MC5jLCBvcgotCWVsZmNvZGUuaCBhcyBpbnB1dCBmaWxlczsgdGhleSBkb24ndCBjb250cmlidXRlIGFueXRoaW5nLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBBdWcgMTUgMDQ6NTU6MTUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxpYmJmZC5oLCBsaWJjb2ZmLmgpOiBJbnZva2UgJChNS0RPQykgYXMgLi8kKE1LRE9DKS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgQXVnICAxIDEyOjU5OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENDX0ZPUl9CVUlMRCk6IERvbid0IHNldCBleHBsaWNpdGx5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKdWwgMzEgMjA6MDA6MTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQotVHVlIEp1bCAyMiAxNDo0NDowMCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2Ugc3RhbXAtKiBmaWxlcyB0byBzLSogZmlsZXMuICBVc2UgYmZkdC50ZXhpCi0JcmF0aGVyIHRoYW4gYmZkLnRleGkuCi0gCShET0NGSUxFUyk6IENoYW5nZSBiZmQudGV4aSB0byBiZmR0LnRleGkuCi0JKiBiZmQudGV4aW5mbzogSW5jbHVkZSBiZmR0LnRleGksIG5vdCBiZmQudGV4aS4KLQotTW9uIEp1biAxNiAxNTozMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQywgQ0ZMQUdTKTogU3Vic3RpdHV0ZSBmcm9tIGNvbmZpZ3VyZSBzY3JpcHQuCi0JRnJvbSBKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgotCi1UdWUgQXByIDE1IDEyOjM3OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFVzZSBta2luc3RhbGxkaXJzIHRvIGJ1aWxkCi0JJChpbmZvZGlyKS4KLQotVHVlIEFwciAgOCAxMjo0OTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBQZXJtaXQgaW5mbyBmaWxlcyB0byBiZSBpbiBzcmNkaXIuCi0JKHN0YW1wLSopOiBBZGQgYSBzdGFtcC1YIHRhcmdldCBmb3IgZWFjaCBYLnRleGkgdGFyZ2V0LgotCSgqLnRleGkpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLVguCi0JKGNsZWFuKTogUmVtb3ZlIHN0YW1wLSouCi0JKGRpc3RjbGVhbik6IERlcGVuZCB1cG9uIG1vc3RseWNsZWFuLiAgUmVtb3ZlIHN0YW1wLSouICBEb24ndAotCXJlbW92ZSAkKERPQ0ZJTEVTKS4KLQotTW9uIEFwciAgNyAxNToyMzoyNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgKi5pbmZvIGZpbGVzLgotCi1UaHUgRmViIDEzIDIwOjUwOjAyIDE5OTcgIEtsYXVzIEthZW1wZiAgKGtrYWVtcGZAcHJvZ2lzLmRlKQotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCi1UdWUgSnVuIDE4IDE4OjMyOjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY2hldy5jIChraWxsX2JvZ3VzX2xpbmVzKTogUmVzZXQgc2wgd2hlbiBub3QgYXQgdGhlIHN0YXJ0IG9mIGEKLQlsaW5lLiAgRnJvbSBVd2UgT2hzZSA8dXdlQHRpcmthLmd1bi5kZT4uCi0KLVR1ZSBKYW4gMzAgMTQ6MTA6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogRGVwZW5kIHVwb24gcHJvdG8uc3RyLgotCShsaWJjb2ZmLmgsIGJmZC5oKTogTGlrZXdpc2UuCi0KLUZyaSBOb3YgIDMgMTQ6NDY6NDggMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChTUkNET0MsIFNSQ1BST1QsIGNvcmUudGV4aSwgYmZkLmgpOiAgVXNlIGNvcmVmaWxlLmMsIAotCXJlbmFtZWQgZnJvbSBjb3JlLmMuCi0KLVdlZCBOb3YgIDEgMTQ6Mjg6MjMgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNoZXcuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0KLUZyaSBPY3QgIDYgMTY6MjM6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBPbmx5IHJlbWFrZSB0aGlzIE1ha2VmaWxlLgotCi1XZWQgT2N0ICA0IDE1OjUxOjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjaGV3LmM6IEluY2x1ZGUgPHN0ZGlvLmg+LgotCi1UdWUgU2VwIDEyIDE4OjE0OjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LgotCi1UaHUgQXVnIDMxIDEyOjE4OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGJmZC5oKTogQWRkIGFkZGl0aW9uYWwgI2VuZGlmIGF0IGVuZCBvZiBiZmQuaCBpZgotCV9fY3BsdXNwbHVzIGlzIGRlZmluZWQuCi0KLVR1ZSBOb3YgMjkgMTY6MTM6MzQgMTk5NCAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2hldy5jICh3cml0ZV9idWZmZXIpOiBOZXcgYXJndW1lbnQgYGYnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgotCShzdGRvdXQsIHN0ZGVyciwgcHJpbnQsIGRyb3AsIGlkcm9wKTogTmV3IGZvcnRoIHdvcmRzLgotCSogcHJvdG8uc3RyIChDT01NRU5UKTogTmV3IGNvbW1hbmQuCi0JKiBkb2Muc3RyIChDT01NRU5UKTogTGlrZXdpc2UuCi0KLU1vbiBTZXAgMTIgMTE6NDQ6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBSZW1vdmUgY3Rvci50ZXhpLgotCShJUFJPVE9TKTogUmVtb3ZlIGN0b3IuaXAuCi0JKFNSQ0lQUk9UKTogUmVtb3ZlICQoc3JjZGlyKS8uLi9jdG9yLmMuCi0JKGN0b3IudGV4aSk6IFJlbW92ZSB0YXJnZXQuCi0JKGxpYmJmZC5oKTogUmVtb3ZlIGRlcGVuZGVuY3kgb24gJChzcmNkaXIpLy4uL2N0b3IuYy4gIFJlbW92ZQotCSQoTUtET0MpIHJ1biBvbiAkKHNyY2RpcikvLi4vY3Rvci5jLgotCSogYmZkLnRleGluZm8gKENvbnN0cnVjdG9ycyk6IFJlbW92ZSBzZWN0aW9uLgotCi1GcmkgU2VwICAyIDEzOjMzOjQ0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogSW5jbHVkZSBhc3NlcnQuaC4gIEFkZGVkIHByb3RvdHlwZXMgZm9yIG1vc3QgZnVuY3Rpb25zLgotCUNoYW5nZWQgbW9zdCB1c2VzIG9mIGludCB0byBsb25nLiAgRG8gYm91bmRzIGNoZWNraW5nIG9uIHRoZQotCXN0YWNrcy4gIEFkZGVkIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBkb2N1bWVudGluZyBtb3N0IG9mIHRoZQotCWludHJpbnNpY3MuICBMb3RzIG9mIHdoaXRlc3BhY2UgY2hhbmdlcy4gIFJlLW9yZGVyZWQgc29tZQotCWZ1bmN0aW9ucy4KLQkoZGllLCBjaGVja19yYW5nZSwgaWNoZWNrX3JhbmdlKTogTmV3IGZ1bmN0aW9ucy4KLQkoc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMsIHByaW50X3N0YWNrX2xldmVsKTogTmV3IGZ1bmN0aW9ucy4KLQkodHJhbnNsYXRlY29tbWVudHMpOiBEb24ndCBpbnNlcnQgdGFiIGJlZm9yZSAiLyoiLgotCShpc2NvbW1hbmQpOiBNaW5pbXVtIGNvbW1hbmQgbGVuZ3RoIGlzIG5vdyA0LgotCShuZXh0d29yZCk6IEhhbmRsZSBzb21lIFwtc2VxdWVuY2VzLgotCShwdXNoX2FkZHIpOiBEZWxldGVkLgotCShtYWluKTogQWRkIG5ldyBpbnRyaW5zaWNzIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzIGFuZAotCXByaW50X3N0YWNrX2xldmVsLiAgQ29tcGxhaW4gYXQgZW5kIGlmIHN0YWNrIGNvbnRhaW5zIG1vcmUgdGhhbgotCW9uZSBlbGVtZW50LCBvciBsZXNzLgotCShyZW1jaGFyKTogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgbm90IGVtcHR5IGJlZm9yZSBjaG9wcGluZyBvZmYgYQotCWNoYXJhY3Rlci4KLQotCSogZG9jLnN0ciwgcHJvdG8uc3RyOiBIYW5kbGUgbmV3IGNvbW1hbmRzIFNFTlVNLCBFTlVNLCBFTlVNWCwKLQlFTlVNRVEsIEVOVU1FUVgsIEVOVU1ET0MuCi0KLVdlZCBKYW4gMTIgMTg6Mzc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogQWRkZWQgTGlua2VyIEZ1bmN0aW9ucyBub2RlLgotCSogZG9jL01ha2VmaWxlLmluIChET0NGSUxFUyk6IEFkZGVkIGxpbmtlci50ZXhpLgotCShTUkNET0MpOiBBZGRlZCBsaW5rZXIuYy4KLQkobGlua2VyLnRleGkpOiBOZXcgdGFyZ2V0LgotCi1UdWUgSmFuICA0IDEwOjUyOjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiBEb24ndCByZWx5IG9uIGEgY29ycmVjdCBkZWNsYXJhdGlvbiBvZiBleGl0LgotCShjaGV3X2V4aXQpOiBOZXcgZnVuY3Rpb24gd2hpY2gganVzdCBjYWxscyBleGl0LgotCShtYWluKTogVXNlIGl0LgotCi1Nb24gSmFuICAzIDExOjQwOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IEFkZGVkIEhhc2ggVGFibGVzIG5vZGUuCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBBZGRlZCBoYXNoLnRleGkuCi0JKFNSQ0RPQyk6IEFkZGVkIGhhc2guYy4KLQkoaGFzaC50ZXhpKTogTmV3IHRhcmdldC4KLQotVGh1IERlYyAzMCAxNjo1NzowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRGVsZXRlIGFsbCByZWZlcmVuY2VzIHRvIHNlY2xldC5jLCBzaW5jZSBpdCdzIGp1c3QKLQliZWVuIGRlbGV0ZWQuICBEb24ndCBtZW50aW9uIGhhc2guYywgbGlua2VyLmMsIG9yIGdlbmxpbmsuaCB5ZXQsCi0Jc2luY2UgdGhleSBkb24ndCBjb250YWluIGRvY3VtZW50YXRpb24geWV0IChoaW50LCBoaW50ISkuCi0KLUZyaSBOb3YgIDUgMTA6NTg6NTMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbzogU21hbGwgY2xlYW51cHMuCi0KLUZyaSBOb3YgMTkgMDM6NDY6MTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXJjaHVyZXMudGV4aSk6IERlcGVuZHMgb24gJChNS0RPQykuCi0KLVR1ZSBBdWcgMTAgMTQ6MjI6MzkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbyAoQkZEIGJhY2sgZW5kKTogRG9uJ3QgaW5jbHVkZSBlbGZjb2RlLnRleGksIHNpbmNlCi0JaXQncyBlbXB0eSBub3cgYW5kIHRoYXQgdHJpZ2dlcnMgYSBtYWtlaW5mbyBidWcuCi0KLU1vbiBBdWcgIDkgMTY6Mjc6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBiZmQudGV4aW5mbyAoQkZEIGJhY2sgZW5kKTogTmV3IHNlY3Rpb24gb24gRUxGLCBpbmNsdWRlcwotCWVsZi50ZXhpIGFuZCBlbGZjb2RlLnRleGkuCi0JKiBNYWtlZmlsZS5pbiAoRE9DRklMRVMpOiBJbmNsdWRlIGVsZi50ZXhpLCBlbGZjb2RlLnRleGkuCi0JKFNSQ0RPQyk6IEluY2x1ZGUgZWxmY29kZS5oLCBlbGYuYy4KLQkoZWxmLnRleGksIGVsZmNvZGUudGV4aSk6IE5ldyBpbnRlcm1lZGlhdGUgdGFyZ2V0cy4KLQotVGh1IEp1biAyNCAxMzo0ODoxMyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICguYy5vLCBjaGV3Lm8pOiBQdXQgQ0ZMQUdTIGxhc3QuCi0JKiBiZmRzdW1tLnRleGk6IE5ldyBmaWxlLCBicm9rZW4gb3V0IG9mIGJmZC50ZXhpbmZvLCB0byBzaGFyZQotCXdpdGggbGQudGV4aW5mby4KLQotTW9uIEp1biAxNCAxMjowNzowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiByZW1vdmUgcGFyZW50ZGlyIGNydWZ0LCAKLQotV2VkIEp1biAgOSAxNjowMDozMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNoZXcuby4KLQotVHVlIE1heSAyNSAxNDo0Njo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChsaWJiZmQuaCk6IFVzZSBlbGZjb2RlLmgsIG5vdCBlbGYzMi5jLgotCi1Nb24gTWF5IDI0IDE1OjUwOjA3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjaGV3LmMgKGNvbXBpbGUpOiBBZGQgYSBjb3VwbGUgb2YgbWlzc2luZyBjYXN0cy4KLQotV2VkIE1heSAxMiAxNDo0NToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUsIGRlZmluZSB0byBiZSAkKENDKS4KLQkoY2hldy5vLCAkKE1LRE9DKSk6IEJ1aWxkIHVzaW5nIENDX0ZPUl9CVUlMRCByYXRoZXIgdGhhbiBDQywgc2luY2UKLQlpdCBtdXN0IHJ1biBvbiB0aGUgYnVpbGQgbWFjaGluZS4KLQotVHVlIEFwciAgNiAyMjozODoxMCAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZXcpOiAgRG9uJ3QgY29tcGlsZSBmcm9tIC5jIHRvIGV4ZWN1dGFibGUgaW4gYQotCXNpbmdsZSBzdGVwOyBpdCBwdXRzIGEgdGVtcG9yYXJ5IC5vIGZpbGVuYW1lIGludG8gdGhlIGV4ZWN1dGFibGUsCi0Jd2hpY2ggbWFrZXMgbXVsdGktc3RhZ2UgY29tcGFyaXNvbnMgZmFpbC4gIENvbXBpbGUgY2hldy5jIHRvCi0JY2hldy5vLCBhbmQgbGluayB0aGF0LCB3aGljaCBtYWtlcyBpZGVudGljYWwgZXhlY3V0YWJsZXMgZXZlcnkgdGltZS4KLQotV2VkIE1hciAyNCAxNzoyNjoyOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCB0eXBvIChiZmQudGV4aW5mbyBub3QgYmZkLnRleGlubykKLQotRnJpIE1hciAxOSAwMToxMzowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYmZkLnRleGluZm86IFNpbmNlIEJGRCB2ZXJzaW9uIG51bWJlciBoYXMgYmVlbiBidW1wZWQsIGRvIHNhbWUKLQl0byAidmVyc2lvbiBudW1iZXIiIG9uIHRpdGxlIHBhZ2UsIGFuZCBlbHNld2hlcmUuICBTaG91bGQgYmUKLQlmaXhlZCB0byBleHRyYWN0IHJlYWwgdmVyc2lvbiBudW1iZXIuCi0KLVR1ZSBNYXIgMTYgMTI6MTU6MTMgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCAqY2xlYW4gcnVsZXMuCi0KLU1vbiBKYW4gMTEgMTg6NDM6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGliYmZkLmgpOiBSZW1vdmVkIGR1cGxpY2F0ZSBpbml0LmMgYW5kIGxpYmJmZC5jLgotCUFkZGVkIHNlY2xldC5jLgotCShiZmQuaCk6IEFkZGVkIGRlcGVuZGVuY3kgb24gYmZkLmMgYW5kIHNlY2xldC5jLiAgQWRkZWQgc2VjbGV0LmMKLQl0byBidWlsZC4KLQotVGh1IERlYyAxNyAxOTozNTo0MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBkdmkgdGFyZ2V0LCBkZWZpbmUgYW5kIHVzZSAkKFRFWEkyRFZJKQotCi1UaHUgRGVjICAzIDE3OjQyOjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRFWElESVIpOiBOZXcgdmFyaWFibGUuCi0JKGJmZC5kdmkpOiBMb29rIGZvciBiZmQudGV4aW5mbyBpbiAkKHNyY2RpcikuICBHZW5lcmF0ZSBpbmRleC4KLQotCSogYmZkLnRleGluZm86IE1pbm9yIGRvYyBmaXhlcy4KLQotVGh1IE5vdiAgNSAwMzoxMzo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCUNsZWFudXA6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGluIHRoZSBCRkQgc291cmNlcywgd2l0aCBQQVJBTVMuCi0KLSAJKiBkb2MvY2hldy5jIChleGZ1bnN0dWZmKTogIEVsaW1pbmF0ZS4KLQkocGFyYW1zdHVmZik6ICBSZXBsYWNlIGV4ZnVuc3R1ZmYgd2l0aCBmdW5jdGlvbiB0byBnZW5lcmF0ZSBQQVJBTVMuCi0JKiBkb2MvcHJvdG8uc3RyOiAgVXNlIHBhcmFtc3R1ZmYgcmF0aGVyIHRoYW4gZXhmdW5zdHVmZi4KLQotTW9uIEF1ZyAxNyAxMjo0MDozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY2hldy5jOiB2YXJpb3VzIHBhdGNoZXMgcHJvdmlkZWQgYnkgSG93YXJkIENodS4KLQotRnJpIEp1biAxOSAxODo1OTo1NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxpYmJmZC5oKTogIEFkZCBlbGYuYyBhcyBhIHNvdXJjZSBvZiBwcm90b3R5cGVzLgotCi1Nb24gTWF5IDExIDE4OjU1OjU5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjaGV3LmM6ICBleGl0KCkgc2hvdWxkIGJlIGRlY2xhcmVkIGJ5IGNvbmZpZyBmaWxlcywgbm90IGJ5Ci0JcG9ydGFibGUgc291cmNlIGNvZGUuICBJdHMgdHlwZSBjb3VsZCBiZSBpbnQgb3Igdm9pZCBmdW5jdGlvbi4JCi0KLU1vbiBNYXkgIDQgMTM6NDU6NTcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYW5vdGhlciBDRkxBR1MgY29ycmVjdGlvbi4KLQotVHVlIEFwciAyOCAxMDoyMTozMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBEbyB0aGUgQ0ZMQUdTIHRoaW5nLgotCi1GcmkgQXByIDEwIDIyOjM0OjUyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUlOVVNfRyk6ICBBZGQgbWFjcm8gYW5kIGRlZmF1bHQgdG8gLWcuCi0KLUZyaSBNYXIgIDYgMTg6NTM6MTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNoZXcuYzogbm93IGhhcyAtdyBzd2l0Y2ggdHVybiBvbiB3YXJuaW5ncwotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotVHVlIERlYyAxMCAyMjoxMTowNSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBidWlsZCBjaGV3IGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQ29tcGxldGUKLQkgIHRoZSBNS0RPQyBtYWNybyB0cmFuc2l0aW9uLgotCi1UdWUgRGVjIDEwIDA4OjI2OjI4IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IGRvbid0IGNvcmUgZHVtcCB3aGVuIGNhbid0IG9wZW4gZmlsZQotCSogTWFrZWZpbGUuaW46IGdldCBwcm90by5zdHIgZnJvbSB0aGUgcmlnaHQgcGxhY2Ugd2hlbiBidWlsdCBpbgotCW9kZCBkaXJlY3RvcmllcwotCi1UdWUgRGVjIDEwIDA0OjA3OjI1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluZm9kaXIgYmVsb25ncyBpbiBkYXRhZGlyLgotCi1TYXQgRGVjICA3IDE3OjAxOjIzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjaGV3LmM6IE11Y2ggbW9kaWZpZWQKLQkqIHByb3RvLnN0ciwgZG9jLnN0cjogTmV3IGZpbGVzIGZvciBleHRyYWN0aW5nIHRvIHByb2R1Y3QKLQlwcm90b3R5cGVzIGFuZCBkb2N1bWVudHMgcmVzcGVjdGl2ZWx5LgotCi0KLUZyaSBEZWMgIDYgMjI6NTc6MTIgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgc3RhbmRhcmRzLnRleHQgc3VwcG9ydCwgaG9zdC9zaXRlL3RhcmdldAotCSAgaW5jbHVzaW9uIGhvb2tzLCBpbnN0YWxsIHVzaW5nIElOU1RBTExfREFUQSByYXRoZXIgdGhhbiBjcCwKLQkgIGRvbid0IGVjaG8gb24gaW5zdGFsbC4KLQotVGh1IERlYyAgNSAyMjo0NjoxNyAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JmZC9kb2MvTWFrZWZpbGUuYW0gYi9iZmQvZG9jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDUyNjhlLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLURPQ0ZJTEVTID0gYW91dHgudGV4aSAgYXJjaGl2ZS50ZXhpIGFyY2h1cmVzLnRleGkgXAotCWJmZHQudGV4aSAgY2FjaGUudGV4aSBjb2ZmY29kZS50ZXhpIFwKLQljb3JlLnRleGkgZWxmLnRleGkgZWxmY29kZS50ZXhpICBmb3JtYXQudGV4aSAgbGliYmZkLnRleGkgIFwKLQlvcG5jbHMudGV4aSAgcmVsb2MudGV4aSAgc2VjdGlvbi50ZXhpICBcCi0Jc3ltcy50ZXhpICB0YXJnZXRzLnRleGkgaW5pdC50ZXhpIGhhc2gudGV4aSBsaW5rZXIudGV4aQotCi1QUk9UT1MgPSBhcmNoaXZlLnAgYXJjaHVyZXMucCBiZmQucCBcCi0JIGNvcmUucCBmb3JtYXQucCBcCi0JbGliYmZkLnAgb3BuY2xzLnAgcmVsb2MucCBcCi0Jc2VjdGlvbi5wIHN5bXMucCB0YXJnZXRzLnAgIFwKLQlmb3JtYXQucCAgY29yZS5wIGluaXQucAotCi1JUFJPVE9TID0gY2FjaGUuaXAgbGliYmZkLmlwIHJlbG9jLmlwIGluaXQuaXAgYXJjaHVyZXMuaXAgY29mZmNvZGUuaXAKLQotIyBTUkNET0MsIFNSQ1BST1QsIFNSQ0lQUk9UIG9ubHkgdXNlZCB0byBzaWRlc3RlcCBTdW4gTWFrZSBidWcgaW4gaW50ZXJhY3Rpb24gCi0jIGJldHdlZW4gVlBBVEggYW5kIHN1ZmZpeCBydWxlcy4gIElmIHlvdSB1c2UgR05VIE1ha2UsIHBlcmhhcHMgb3RoZXIgTWFrZXMsCi0jIHlvdSBkb24ndCBuZWVkIHRoZXNlIHRocmVlOgotU1JDRE9DID0gJChzcmNkaXIpLy4uL2FvdXR4LmggICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jICQoc3JjZGlyKS8uLi9iZmQuYyBcCi0JJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggXAotCSQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jICQoc3JjZGlyKS8uLi9lbGYuYyBcCi0JJChzcmNkaXIpLy4uL2VsZmNvZGUuaCAgJChzcmNkaXIpLy4uL2Zvcm1hdC5jIFwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMgJChzcmNkaXIpLy4uL29wbmNscy5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAgJChzcmNkaXIpLy4uL3NlY3Rpb24uYyBcCi0JJChzcmNkaXIpLy4uL3N5bXMuYyAgJChzcmNkaXIpLy4uL3RhcmdldHMuYyBcCi0JJChzcmNkaXIpLy4uL2hhc2guYyAkKHNyY2RpcikvLi4vbGlua2VyLmMKLQotU1JDUFJPVCA9ICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyBcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS8uLi9yZWxvYy5jIFwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS8uLi9zeW1zLmMgXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpLy4uL2luaXQuYwotCi1TUkNJUFJPVCA9ICQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpLy4uL2NwdS1oODMwMC5jIFwKLQkkKHNyY2RpcikvLi4vY3B1LWk5NjAuYyAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyBcCi0JJChzcmNkaXIpLy4uL2luaXQuYwotCi1URVhJRElSID0gJChzcmNkaXIpLy4uLy4uL3RleGluZm8vZnNmCi0KLWluZm9fVEVYSU5GT1MgPSBiZmQudGV4aW5mbwotCi1NS0RPQyA9IGNoZXckKEVYRUVYVF9GT1JfQlVJTEQpCi0KLSQoTUtET0MpOiBjaGV3Lm8KLQkkKENDX0ZPUl9CVUlMRCkgLW8gJChNS0RPQykgY2hldy5vICQoTE9BRExJQkVTKSAkKExERkxBR1MpCi0KLWNoZXcubzogY2hldy5jCi0JJChDQ19GT1JfQlVJTEQpIC1jIC1JLi4gLUkkKHNyY2RpcikvLi4gLUkkKHNyY2RpcikvLi4vLi4vaW5jbHVkZSAtSSQoc3JjZGlyKS8uLi8uLi9pbnRsIC1JLi4vLi4vaW50bCAkKEhfQ0ZMQUdTKSAkKENGTEFHUykgJChzcmNkaXIpL2NoZXcuYwotCi1wcm90b3M6IGxpYmJmZC5oIGxpYmNvZmYuaCBiZmQuaAotCi1iZmQuaW5mbyBiZmQuZHZpOiAkKERPQ0ZJTEVTKSBiZmRzdW1tLnRleGkgYmZkLnRleGluZm8KLQotIyBXZSBjYW4ndCByZXBsYWNlIHRoZXNlIHJ1bGVzIHdpdGggYW4gaW1wbGljaXQgcnVsZSwgYmVjYXVzZQotIyBtYWtlcyB3aXRob3V0IFZQQVRIIHN1cHBvcnQgY291bGRuJ3QgZmluZCB0aGUgLmggZmlsZXMgaW4gYC4uJy4KLQotIyBXZSB1c2Ugcy1YWFggdGFyZ2V0cyBzbyB0aGF0IHdlIGNhbiBkaXN0cmlidXRlIHRoZSBpbmZvIGZpbGVzLAotIyBhbmQgcGVybWl0IHBlb3BsZSB0byByZWJ1aWxkIHRoZW0sIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBtYWtlaW5mbwotIyBwcm9ncmFtLiAgSWYgc29tZWJvZHkgdHJpZXMgdG8gcmVidWlsZCBpbmZvLCBidXQgbm9uZSBvZiB0aGUgLnRleGkKLSMgZmlsZXMgaGF2ZSBjaGFuZ2VkLCB0aGVuIHRoaXMgTWFrZWZpbGUgd2lsbCBidWlsZCBjaGV3LCBhbmQgd2lsbAotIyBidWlsZCBhbGwgb2YgdGhlIHN0YW1wIGZpbGVzLCBidXQgd2lsbCBub3QgYWN0dWFsbHkgaGF2ZSB0byByZWJ1aWxkCi0jIGJmZC5pbmZvLgotCi1zLWFvdXR4OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYW91dHguaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9hb3V0eC5oID5hb3V0eC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYW91dHgudG1wIGFvdXR4LnRleGkKLQl0b3VjaCBzLWFvdXR4Ci1hb3V0eC50ZXhpOiBzLWFvdXR4Ci0KLXMtYXJjaGl2ZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2FyY2hpdmUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgPmFyY2hpdmUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFyY2hpdmUudG1wIGFyY2hpdmUudGV4aQotCXRvdWNoIHMtYXJjaGl2ZQotYXJjaGl2ZS50ZXhpOiBzLWFyY2hpdmUKLQotcy1hcmNodXJlczogJChNS0RPQykgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPmFyY2h1cmVzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhcmNodXJlcy50bXAgYXJjaHVyZXMudGV4aQotCXRvdWNoIHMtYXJjaHVyZXMKLWFyY2h1cmVzLnRleGk6IHMtYXJjaHVyZXMKLQotIyBXZSB1c2UgYmZkdC50ZXhpLCByYXRoZXIgdGhhbiBiZmQudGV4aSwgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aAotIyBiZmQudGV4aW5mbyBvbiBhbiA4LjMgZmlsZXN5c3RlbS4KLXMtYmZkOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYmZkLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2JmZC5jID5iZmQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGJmZC50bXAgYmZkdC50ZXhpCi0JdG91Y2ggcy1iZmQKLWJmZHQudGV4aTogcy1iZmQKLQotcy1jYWNoZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwgJChzcmNkaXIpLy4uL2NhY2hlLmMgPmNhY2hlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBjYWNoZS50bXAgY2FjaGUudGV4aQotCXRvdWNoIHMtY2FjaGUKLWNhY2hlLnRleGk6IHMtY2FjaGUKLQotcy1jb2ZmY29kZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NvZmZjb2RlLmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vY29mZmNvZGUuaCA+Y29mZmNvZGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNvZmZjb2RlLnRtcCBjb2ZmY29kZS50ZXhpCi0JdG91Y2ggcy1jb2ZmY29kZQotY29mZmNvZGUudGV4aTogcy1jb2ZmY29kZQotCi1zLWNvcmU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgPmNvcmUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNvcmUudG1wIGNvcmUudGV4aQotCXRvdWNoIHMtY29yZQotY29yZS50ZXhpOiBzLWNvcmUKLQotcy1lbGY6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9lbGYuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9lbGYuYyA+ZWxmLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBlbGYudG1wIGVsZi50ZXhpCi0JdG91Y2ggcy1lbGYKLWVsZi50ZXhpOiBzLWVsZgotCi1zLWVsZmNvZGU6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9lbGZjb2RlLmggJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZWxmY29kZS5oID5lbGZjb2RlLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBlbGZjb2RlLnRtcCBlbGZjb2RlLnRleGkKLQl0b3VjaCBzLWVsZmNvZGUKLWVsZmNvZGUudGV4aTogcy1lbGZjb2RlCi0KLXMtZm9ybWF0OiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vZm9ybWF0LmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vZm9ybWF0LmMgPmZvcm1hdC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgZm9ybWF0LnRtcCBmb3JtYXQudGV4aQotCXRvdWNoIHMtZm9ybWF0Ci1mb3JtYXQudGV4aTogcy1mb3JtYXQKLQotcy1saWJiZmQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9saWJiZmQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vbGliYmZkLmMgPmxpYmJmZC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgbGliYmZkLnRtcCBsaWJiZmQudGV4aQotCXRvdWNoIHMtbGliYmZkCi1saWJiZmQudGV4aTogcy1saWJiZmQKLQotcy1vcG5jbHM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9vcG5jbHMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgIDwkKHNyY2RpcikvLi4vb3BuY2xzLmMgPm9wbmNscy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugb3BuY2xzLnRtcCBvcG5jbHMudGV4aQotCXRvdWNoIHMtb3BuY2xzCi1vcG5jbHMudGV4aTogcy1vcG5jbHMKLQotcy1yZWxvYzogJChNS0RPQykgJChzcmNkaXIpLy4uL3JlbG9jLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vcmVsb2MuYyA+cmVsb2MudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHJlbG9jLnRtcCByZWxvYy50ZXhpCi0JdG91Y2ggcy1yZWxvYwotcmVsb2MudGV4aTogcy1yZWxvYwotCi1zLXNlY3Rpb246ICQoTUtET0MpICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vc2VjdGlvbi5jID5zZWN0aW9uLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBzZWN0aW9uLnRtcCBzZWN0aW9uLnRleGkKLQl0b3VjaCBzLXNlY3Rpb24KLXNlY3Rpb24udGV4aTogcy1zZWN0aW9uCi0KLXMtc3ltczogJChNS0RPQykgJChzcmNkaXIpLy4uL3N5bXMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9zeW1zLmMgPnN5bXMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHN5bXMudG1wIHN5bXMudGV4aQotCXRvdWNoIHMtc3ltcwotc3ltcy50ZXhpOiBzLXN5bXMKLQotcy10YXJnZXRzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vdGFyZ2V0cy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3RhcmdldHMuYyA+dGFyZ2V0cy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgdGFyZ2V0cy50bXAgdGFyZ2V0cy50ZXhpCi0JdG91Y2ggcy10YXJnZXRzCi10YXJnZXRzLnRleGk6IHMtdGFyZ2V0cwotCi1zLWluaXQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9pbml0LmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vaW5pdC5jID5pbml0LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBpbml0LnRtcCBpbml0LnRleGkKLQl0b3VjaCBzLWluaXQKLWluaXQudGV4aTogcy1pbml0Ci0KLXMtaGFzaDogJChNS0RPQykgJChzcmNkaXIpLy4uL2hhc2guYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9oYXNoLmMgPmhhc2gudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGhhc2gudG1wIGhhc2gudGV4aQotCXRvdWNoIHMtaGFzaAotaGFzaC50ZXhpOiBzLWhhc2gKLQotcy1saW5rZXI6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9saW5rZXIuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9saW5rZXIuYyA+bGlua2VyLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBsaW5rZXIudG1wIGxpbmtlci50ZXhpCi0JdG91Y2ggcy1saW5rZXIKLWxpbmtlci50ZXhpOiBzLWxpbmtlcgotCi1saWJiZmQuaDogJChzcmNkaXIpLy4uL2xpYmJmZC1pbi5oCVwKLQkkKHNyY2RpcikvLi4vaW5pdC5jCQlcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jCQlcCi0JJChzcmNkaXIpLy4uL2NhY2hlLmMJCVwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYwkJXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9saWJiZmQtaW4uaCA+bGliYmZkLmggCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9pbml0LmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vbGliYmZkLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vY2FjaGUuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9yZWxvYy5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vZWxmLmMgPj5saWJiZmQuaAotCi1saWJjb2ZmLmg6ICQoc3JjZGlyKS8uLi9saWJjb2ZmLWluLmgJXAotCSQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9saWJjb2ZmLWluLmggPmxpYmNvZmYuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCA+PmxpYmNvZmYuaAotCi1iZmQuaDogJChzcmNkaXIpLy4uL2JmZC1pbi5oIAkJXAotCSQoc3JjZGlyKS8uLi9pbml0LmMgCQlcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jIAkJXAotCSQoc3JjZGlyKS8uLi9saWJiZmQuYyAJCVwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jIAkJXAotCSQoc3JjZGlyKS8uLi9hcmNodXJlcy5jCQlcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMJCVwKLQkkKHNyY2RpcikvLi4vc3ltcy5jCQlcCi0JJChzcmNkaXIpLy4uL2JmZC5jCQlcCi0JJChzcmNkaXIpLy4uL2FyY2hpdmUuYwkJXAotCSQoc3JjZGlyKS8uLi9jb3JlZmlsZS5jCQlcCi0JJChzcmNkaXIpLy4uL3RhcmdldHMuYwkJXAotCSQoc3JjZGlyKS8uLi9mb3JtYXQuYwkJXAotCSQoc3JjZGlyKS9wcm90by5zdHIJCVwKLQkkKE1LRE9DKQotCWNhdCAkKHNyY2RpcikvLi4vYmZkLWluLmggPmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9pbml0LmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vb3BuY2xzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vbGliYmZkLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vc2VjdGlvbi5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vcmVsb2MuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9zeW1zLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYmZkLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYXJjaGl2ZS5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vdGFyZ2V0cy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2Zvcm1hdC5jID4+YmZkLmgJCi0JZWNobyAiI2lmZGVmIF9fY3BsdXNwbHVzIiA+PmJmZC5oCi0JZWNobyAifSIgPj5iZmQuaAotCWVjaG8gIiNlbmRpZiIgPj5iZmQuaAotCWVjaG8gIiNlbmRpZiIgPj5iZmQuaAotCi1ub2luc3RfVEVYSU5GT1MgPSBiZmRpbnQudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChNS0RPQykgKi5vCi0KLUNMRUFORklMRVMgPSBzLSogKi5wICouaXAKLQotRElTVENMRUFORklMRVMgPSBiZmQuPz8gYmZkLj8/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCmRpZmYgLS1naXQgYS9iZmQvZG9jL01ha2VmaWxlLmluIGIvYmZkL2RvYy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5NWMxMC4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLi4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUiA9IEBBUkAKLUFTID0gQEFTQAotQkZEX0hPU1RfNjRCSVRfTE9ORyA9IEBCRkRfSE9TVF82NEJJVF9MT05HQAotQkZEX0hPU1RfNjRfQklUID0gQEJGRF9IT1NUXzY0X0JJVEAKLUJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEID0gQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQAotQkZEX0hPU1RfVV82NF9CSVQgPSBAQkZEX0hPU1RfVV82NF9CSVRACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1DT1JFRklMRSA9IEBDT1JFRklMRUAKLUNPUkVGTEFHID0gQENPUkVGTEFHQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVRERUZJTkVTID0gQFRERUZJTkVTQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotV0lOMzJMREZMQUdTID0gQFdJTjMyTERGTEFHU0AKLVdJTjMyTElCQUREID0gQFdJTjMyTElCQUREQAotYWxsX2JhY2tlbmRzID0gQGFsbF9iYWNrZW5kc0AKLWJmZF9iYWNrZW5kcyA9IEBiZmRfYmFja2VuZHNACi1iZmRfbWFjaGluZXMgPSBAYmZkX21hY2hpbmVzQAotbCA9IEBsQAotdGRlZmF1bHRzID0gQHRkZWZhdWx0c0AKLXdvcmRzaXplID0gQHdvcmRzaXplQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLURPQ0ZJTEVTID0gYW91dHgudGV4aSAgYXJjaGl2ZS50ZXhpIGFyY2h1cmVzLnRleGkgXAotCWJmZHQudGV4aSAgY2FjaGUudGV4aSBjb2ZmY29kZS50ZXhpIFwKLQljb3JlLnRleGkgZWxmLnRleGkgZWxmY29kZS50ZXhpICBmb3JtYXQudGV4aSAgbGliYmZkLnRleGkgIFwKLQlvcG5jbHMudGV4aSAgcmVsb2MudGV4aSAgc2VjdGlvbi50ZXhpICBcCi0Jc3ltcy50ZXhpICB0YXJnZXRzLnRleGkgaW5pdC50ZXhpIGhhc2gudGV4aSBsaW5rZXIudGV4aQotCi0KLVBST1RPUyA9IGFyY2hpdmUucCBhcmNodXJlcy5wIGJmZC5wIFwKLQkgY29yZS5wIGZvcm1hdC5wIFwKLQlsaWJiZmQucCBvcG5jbHMucCByZWxvYy5wIFwKLQlzZWN0aW9uLnAgc3ltcy5wIHRhcmdldHMucCAgXAotCWZvcm1hdC5wICBjb3JlLnAgaW5pdC5wCi0KLQotSVBST1RPUyA9IGNhY2hlLmlwIGxpYmJmZC5pcCByZWxvYy5pcCBpbml0LmlwIGFyY2h1cmVzLmlwIGNvZmZjb2RlLmlwCi0KLSMgU1JDRE9DLCBTUkNQUk9ULCBTUkNJUFJPVCBvbmx5IHVzZWQgdG8gc2lkZXN0ZXAgU3VuIE1ha2UgYnVnIGluIGludGVyYWN0aW9uIAotIyBiZXR3ZWVuIFZQQVRIIGFuZCBzdWZmaXggcnVsZXMuICBJZiB5b3UgdXNlIEdOVSBNYWtlLCBwZXJoYXBzIG90aGVyIE1ha2VzLAotIyB5b3UgZG9uJ3QgbmVlZCB0aGVzZSB0aHJlZToKLVNSQ0RPQyA9ICQoc3JjZGlyKS8uLi9hb3V0eC5oICAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jIFwKLQkkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvLi4vYmZkLmMgXAotCSQoc3JjZGlyKS8uLi9jYWNoZS5jICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oIFwKLQkkKHNyY2RpcikvLi4vY29yZWZpbGUuYyAkKHNyY2RpcikvLi4vZWxmLmMgXAotCSQoc3JjZGlyKS8uLi9lbGZjb2RlLmggICQoc3JjZGlyKS8uLi9mb3JtYXQuYyBcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS8uLi9vcG5jbHMuYyBcCi0JJChzcmNkaXIpLy4uL3JlbG9jLmMgICQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgXAotCSQoc3JjZGlyKS8uLi9zeW1zLmMgICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgXAotCSQoc3JjZGlyKS8uLi9oYXNoLmMgJChzcmNkaXIpLy4uL2xpbmtlci5jCi0KLQotU1JDUFJPVCA9ICQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMgXAotCSQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvLi4vY29yZWZpbGUuYyBcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jICQoc3JjZGlyKS8uLi9saWJiZmQuYyBcCi0JJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS8uLi9yZWxvYy5jIFwKLQkkKHNyY2RpcikvLi4vc2VjdGlvbi5jICQoc3JjZGlyKS8uLi9zeW1zLmMgXAotCSQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpLy4uL2luaXQuYwotCi0KLVNSQ0lQUk9UID0gJChzcmNkaXIpLy4uL2NhY2hlLmMgJChzcmNkaXIpLy4uL2xpYmJmZC5jIFwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvLi4vY3B1LWg4MzAwLmMgXAotCSQoc3JjZGlyKS8uLi9jcHUtaTk2MC5jICQoc3JjZGlyKS8uLi9hcmNodXJlcy5jIFwKLQkkKHNyY2RpcikvLi4vaW5pdC5jCi0KLQotVEVYSURJUiA9ICQoc3JjZGlyKS8uLi8uLi90ZXhpbmZvL2ZzZgotCi1pbmZvX1RFWElORk9TID0gYmZkLnRleGluZm8KLQotTUtET0MgPSBjaGV3JChFWEVFWFRfRk9SX0JVSUxEKQotCi1ub2luc3RfVEVYSU5GT1MgPSBiZmRpbnQudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChNS0RPQykgKi5vCi0KLUNMRUFORklMRVMgPSBzLSogKi5wICouaXAKLQotRElTVENMRUFORklMRVMgPSBiZmQuPz8gYmZkLj8/PyBiZmQuaCBsaWJiZmQuaCBsaWJjb2ZmLmggdGV4cHV0LmxvZwotCi1NQUlOVEFJTkVSQ0xFQU5GSUxFUyA9ICQoRE9DRklMRVMpCi1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gLi4vY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGJmZC5pbmZvCi1EVklTID0gYmZkLmR2aQotVEVYSU5GT1MgPSBiZmQudGV4aW5mbwotRElTVF9DT01NT04gPSAgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gdGFyCi1HWklQX0VOViA9IC0tYmVzdAotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmR2aSAuaW5mbyAucHMgLnRleGkgLnRleGluZm8gLnR4aQotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBkb2MvTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLQotYmZkLmluZm86IGJmZC50ZXhpbmZvCi1iZmQuZHZpOiBiZmQudGV4aW5mbwotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBiZmQuYXV4IGJmZC5jcCBiZmQuY3BzIGJmZC5kdmkgYmZkLmZuIGJmZC5mbnMgYmZkLmt5IGJmZC5reXMgXAotCSAgYmZkLnBzIGJmZC5sb2cgYmZkLnBnIGJmZC50b2MgYmZkLnRwIGJmZC50cHMgYmZkLnZyIGJmZC52cnMgXAotCSAgYmZkLm9wIGJmZC50ciBiZmQuY3YgYmZkLmNuCi0KLWNsZWFuLWFtaW5mbzoKLQotZGlzdGNsZWFuLWFtaW5mbzoKLQotbWFpbnRhaW5lci1jbGVhbi1hbWluZm86Ci0JZm9yIGkgaW4gJChJTkZPX0RFUFMpOyBkbyBcCi0JICBybSAtZiAkJGk7IFwKLQkgIGlmIHRlc3QgImBlY2hvICQkaS1bMC05XSpgIiAhPSAiJCRpLVswLTldKiI7IHRoZW4gXAotCSAgICBybSAtZiAkJGktWzAtOV0qOyBcCi0JICBmaTsgXAotCWRvbmUKLWNsZWFuLWluZm86IG1vc3RseWNsZWFuLWFtaW5mbwotdGFnczogVEFHUwotVEFHUzoKLQotCi1kaXN0ZGlyID0gJCh0b3BfYnVpbGRkaXIpLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLQotc3ViZGlyID0gZG9jCi0KLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tYW0KLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktYW0KLWNoZWNrLWFtOgotY2hlY2s6IGNoZWNrLWFtCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1hbQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLWFtCi1pbnN0YWxsLWV4ZWMtYW06Ci1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1hbQotCi1pbnN0YWxsLWRhdGEtYW06Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1hbQotCi1pbnN0YWxsLWFtOiBhbGwtYW0KLQlAJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZGF0YS1hbQotaW5zdGFsbDogaW5zdGFsbC1hbQotdW5pbnN0YWxsLWFtOgotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLWFsbC1hbTogTWFrZWZpbGUKLWFsbC1yZWRpcmVjdDogYWxsLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczoKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNQUlOVEFJTkVSQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi1nZW5lcmljCi0KLW1vc3RseWNsZWFuOiBtb3N0bHljbGVhbi1hbQotCi1jbGVhbi1hbTogIGNsZWFuLWFtaW5mbyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1hbQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tYW0KLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLWFtCi0KLS5QSE9OWTogaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIG1vc3RseWNsZWFuLWFtaW5mbyBcCi1kaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyB0YWdzIGRpc3RkaXIgXAotaW5mby1hbSBpbmZvIGR2aS1hbSBkdmkgY2hlY2sgY2hlY2stYW0gaW5zdGFsbGNoZWNrLWFtIGluc3RhbGxjaGVjayBcCi1pbnN0YWxsLWluZm8tYW0gaW5zdGFsbC1pbmZvIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWV4ZWMgXAotaW5zdGFsbC1kYXRhLWFtIGluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBcCi1hbGwtcmVkaXJlY3QgYWxsLWFtIGFsbCBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotJChNS0RPQyk6IGNoZXcubwotCSQoQ0NfRk9SX0JVSUxEKSAtbyAkKE1LRE9DKSBjaGV3Lm8gJChMT0FETElCRVMpICQoTERGTEFHUykKLQotY2hldy5vOiBjaGV3LmMKLQkkKENDX0ZPUl9CVUlMRCkgLWMgLUkuLiAtSSQoc3JjZGlyKS8uLiAtSSQoc3JjZGlyKS8uLi8uLi9pbmNsdWRlIC1JJChzcmNkaXIpLy4uLy4uL2ludGwgLUkuLi8uLi9pbnRsICQoSF9DRkxBR1MpICQoQ0ZMQUdTKSAkKHNyY2RpcikvY2hldy5jCi0KLXByb3RvczogbGliYmZkLmggbGliY29mZi5oIGJmZC5oCi0KLWJmZC5pbmZvIGJmZC5kdmk6ICQoRE9DRklMRVMpIGJmZHN1bW0udGV4aSBiZmQudGV4aW5mbwotCi0jIFdlIGNhbid0IHJlcGxhY2UgdGhlc2UgcnVsZXMgd2l0aCBhbiBpbXBsaWNpdCBydWxlLCBiZWNhdXNlCi0jIG1ha2VzIHdpdGhvdXQgVlBBVEggc3VwcG9ydCBjb3VsZG4ndCBmaW5kIHRoZSAuaCBmaWxlcyBpbiBgLi4nLgotCi0jIFdlIHVzZSBzLVhYWCB0YXJnZXRzIHNvIHRoYXQgd2UgY2FuIGRpc3RyaWJ1dGUgdGhlIGluZm8gZmlsZXMsCi0jIGFuZCBwZXJtaXQgcGVvcGxlIHRvIHJlYnVpbGQgdGhlbSwgd2l0aG91dCByZXF1aXJpbmcgdGhlIG1ha2VpbmZvCi0jIHByb2dyYW0uICBJZiBzb21lYm9keSB0cmllcyB0byByZWJ1aWxkIGluZm8sIGJ1dCBub25lIG9mIHRoZSAudGV4aQotIyBmaWxlcyBoYXZlIGNoYW5nZWQsIHRoZW4gdGhpcyBNYWtlZmlsZSB3aWxsIGJ1aWxkIGNoZXcsIGFuZCB3aWxsCi0jIGJ1aWxkIGFsbCBvZiB0aGUgc3RhbXAgZmlsZXMsIGJ1dCB3aWxsIG5vdCBhY3R1YWxseSBoYXZlIHRvIHJlYnVpbGQKLSMgYmZkLmluZm8uCi0KLXMtYW91dHg6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9hb3V0eC5oICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FvdXR4LmggPmFvdXR4LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBhb3V0eC50bXAgYW91dHgudGV4aQotCXRvdWNoIHMtYW91dHgKLWFvdXR4LnRleGk6IHMtYW91dHgKLQotcy1hcmNoaXZlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaGl2ZS5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2FyY2hpdmUuYyA+YXJjaGl2ZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYXJjaGl2ZS50bXAgYXJjaGl2ZS50ZXhpCi0JdG91Y2ggcy1hcmNoaXZlCi1hcmNoaXZlLnRleGk6IHMtYXJjaGl2ZQotCi1zLWFyY2h1cmVzOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+YXJjaHVyZXMudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGFyY2h1cmVzLnRtcCBhcmNodXJlcy50ZXhpCi0JdG91Y2ggcy1hcmNodXJlcwotYXJjaHVyZXMudGV4aTogcy1hcmNodXJlcwotCi0jIFdlIHVzZSBiZmR0LnRleGksIHJhdGhlciB0aGFuIGJmZC50ZXhpLCB0byBhdm9pZCBjb25mbGljdGluZyB3aXRoCi0jIGJmZC50ZXhpbmZvIG9uIGFuIDguMyBmaWxlc3lzdGVtLgotcy1iZmQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9iZmQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vYmZkLmMgPmJmZC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgYmZkLnRtcCBiZmR0LnRleGkKLQl0b3VjaCBzLWJmZAotYmZkdC50ZXhpOiBzLWJmZAotCi1zLWNhY2hlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY2FjaGUuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCAkKHNyY2RpcikvLi4vY2FjaGUuYyA+Y2FjaGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGNhY2hlLnRtcCBjYWNoZS50ZXhpCi0JdG91Y2ggcy1jYWNoZQotY2FjaGUudGV4aTogcy1jYWNoZQotCi1zLWNvZmZjb2RlOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vY29mZmNvZGUuaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oID5jb2ZmY29kZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY29mZmNvZGUudG1wIGNvZmZjb2RlLnRleGkKLQl0b3VjaCBzLWNvZmZjb2RlCi1jb2ZmY29kZS50ZXhpOiBzLWNvZmZjb2RlCi0KLXMtY29yZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vY29yZWZpbGUuYyA+Y29yZS50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgY29yZS50bXAgY29yZS50ZXhpCi0JdG91Y2ggcy1jb3JlCi1jb3JlLnRleGk6IHMtY29yZQotCi1zLWVsZjogJChNS0RPQykgJChzcmNkaXIpLy4uL2VsZi5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2VsZi5jID5lbGYudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGVsZi50bXAgZWxmLnRleGkKLQl0b3VjaCBzLWVsZgotZWxmLnRleGk6IHMtZWxmCi0KLXMtZWxmY29kZTogJChNS0RPQykgJChzcmNkaXIpLy4uL2VsZmNvZGUuaCAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9lbGZjb2RlLmggPmVsZmNvZGUudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGVsZmNvZGUudG1wIGVsZmNvZGUudGV4aQotCXRvdWNoIHMtZWxmY29kZQotZWxmY29kZS50ZXhpOiBzLWVsZmNvZGUKLQotcy1mb3JtYXQ6ICQoTUtET0MpICQoc3JjZGlyKS8uLi9mb3JtYXQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9mb3JtYXQuYyA+Zm9ybWF0LnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBmb3JtYXQudG1wIGZvcm1hdC50ZXhpCi0JdG91Y2ggcy1mb3JtYXQKLWZvcm1hdC50ZXhpOiBzLWZvcm1hdAotCi1zLWxpYmJmZDogJChNS0RPQykgJChzcmNkaXIpLy4uL2xpYmJmZC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8ICQoc3JjZGlyKS8uLi9saWJiZmQuYyA+bGliYmZkLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBsaWJiZmQudG1wIGxpYmJmZC50ZXhpCi0JdG91Y2ggcy1saWJiZmQKLWxpYmJmZC50ZXhpOiBzLWxpYmJmZAotCi1zLW9wbmNsczogJChNS0RPQykgJChzcmNkaXIpLy4uL29wbmNscy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciAgPCQoc3JjZGlyKS8uLi9vcG5jbHMuYyA+b3BuY2xzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSBvcG5jbHMudG1wIG9wbmNscy50ZXhpCi0JdG91Y2ggcy1vcG5jbHMKLW9wbmNscy50ZXhpOiBzLW9wbmNscwotCi1zLXJlbG9jOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vcmVsb2MuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9yZWxvYy5jID5yZWxvYy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgcmVsb2MudG1wIHJlbG9jLnRleGkKLQl0b3VjaCBzLXJlbG9jCi1yZWxvYy50ZXhpOiBzLXJlbG9jCi0KLXMtc2VjdGlvbjogJChNS0RPQykgJChzcmNkaXIpLy4uL3NlY3Rpb24uYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgPnNlY3Rpb24udG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIHNlY3Rpb24udG1wIHNlY3Rpb24udGV4aQotCXRvdWNoIHMtc2VjdGlvbgotc2VjdGlvbi50ZXhpOiBzLXNlY3Rpb24KLQotcy1zeW1zOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vc3ltcy5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL3N5bXMuYyA+c3ltcy50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2Ugc3ltcy50bXAgc3ltcy50ZXhpCi0JdG91Y2ggcy1zeW1zCi1zeW1zLnRleGk6IHMtc3ltcwotCi1zLXRhcmdldHM6ICQoTUtET0MpICQoc3JjZGlyKS8uLi90YXJnZXRzLmMgJChzcmNkaXIpL2RvYy5zdHIKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9kb2Muc3RyIDwkKHNyY2RpcikvLi4vdGFyZ2V0cy5jID50YXJnZXRzLnRtcAotCSQoc3JjZGlyKS8uLi8uLi9tb3ZlLWlmLWNoYW5nZSB0YXJnZXRzLnRtcCB0YXJnZXRzLnRleGkKLQl0b3VjaCBzLXRhcmdldHMKLXRhcmdldHMudGV4aTogcy10YXJnZXRzCi0KLXMtaW5pdDogJChNS0RPQykgJChzcmNkaXIpLy4uL2luaXQuYyAkKHNyY2RpcikvZG9jLnN0cgotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL2RvYy5zdHIgPCQoc3JjZGlyKS8uLi9pbml0LmMgPmluaXQudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGluaXQudG1wIGluaXQudGV4aQotCXRvdWNoIHMtaW5pdAotaW5pdC50ZXhpOiBzLWluaXQKLQotcy1oYXNoOiAkKE1LRE9DKSAkKHNyY2RpcikvLi4vaGFzaC5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2hhc2guYyA+aGFzaC50bXAKLQkkKHNyY2RpcikvLi4vLi4vbW92ZS1pZi1jaGFuZ2UgaGFzaC50bXAgaGFzaC50ZXhpCi0JdG91Y2ggcy1oYXNoCi1oYXNoLnRleGk6IHMtaGFzaAotCi1zLWxpbmtlcjogJChNS0RPQykgJChzcmNkaXIpLy4uL2xpbmtlci5jICQoc3JjZGlyKS9kb2Muc3RyCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvZG9jLnN0ciA8JChzcmNkaXIpLy4uL2xpbmtlci5jID5saW5rZXIudG1wCi0JJChzcmNkaXIpLy4uLy4uL21vdmUtaWYtY2hhbmdlIGxpbmtlci50bXAgbGlua2VyLnRleGkKLQl0b3VjaCBzLWxpbmtlcgotbGlua2VyLnRleGk6IHMtbGlua2VyCi0KLWxpYmJmZC5oOiAkKHNyY2RpcikvLi4vbGliYmZkLWluLmgJXAotCSQoc3JjZGlyKS8uLi9pbml0LmMJCVwKLQkkKHNyY2RpcikvLi4vbGliYmZkLmMJCVwKLQkkKHNyY2RpcikvLi4vY2FjaGUuYwkJXAotCSQoc3JjZGlyKS8uLi9yZWxvYy5jCQlcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2xpYmJmZC1pbi5oID5saWJiZmQuaCAKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL2luaXQuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9saWJiZmQuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9jYWNoZS5jID4+bGliYmZkLmgKLQkuLyQoTUtET0MpIC1pIC1mICQoc3JjZGlyKS9wcm90by5zdHIgIDwgJChzcmNkaXIpLy4uL3JlbG9jLmMgPj5saWJiZmQuaAotCS4vJChNS0RPQykgLWkgLWYgJChzcmNkaXIpL3Byb3RvLnN0ciAgPCAkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+PmxpYmJmZC5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9lbGYuYyA+PmxpYmJmZC5oCi0KLWxpYmNvZmYuaDogJChzcmNkaXIpLy4uL2xpYmNvZmYtaW4uaAlcCi0JJChzcmNkaXIpLy4uL2NvZmZjb2RlLmgJCVwKLQkkKHNyY2RpcikvcHJvdG8uc3RyCQlcCi0JJChNS0RPQykKLQljYXQgJChzcmNkaXIpLy4uL2xpYmNvZmYtaW4uaCA+bGliY29mZi5oCi0JLi8kKE1LRE9DKSAtaSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyICA8ICQoc3JjZGlyKS8uLi9jb2ZmY29kZS5oID4+bGliY29mZi5oCi0KLWJmZC5oOiAkKHNyY2RpcikvLi4vYmZkLWluLmggCQlcCi0JJChzcmNkaXIpLy4uL2luaXQuYyAJCVwKLQkkKHNyY2RpcikvLi4vb3BuY2xzLmMgCQlcCi0JJChzcmNkaXIpLy4uL2xpYmJmZC5jIAkJXAotCSQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgCQlcCi0JJChzcmNkaXIpLy4uL2FyY2h1cmVzLmMJCVwKLQkkKHNyY2RpcikvLi4vcmVsb2MuYwkJXAotCSQoc3JjZGlyKS8uLi9zeW1zLmMJCVwKLQkkKHNyY2RpcikvLi4vYmZkLmMJCVwKLQkkKHNyY2RpcikvLi4vYXJjaGl2ZS5jCQlcCi0JJChzcmNkaXIpLy4uL2NvcmVmaWxlLmMJCVwKLQkkKHNyY2RpcikvLi4vdGFyZ2V0cy5jCQlcCi0JJChzcmNkaXIpLy4uL2Zvcm1hdC5jCQlcCi0JJChzcmNkaXIpL3Byb3RvLnN0cgkJXAotCSQoTUtET0MpCi0JY2F0ICQoc3JjZGlyKS8uLi9iZmQtaW4uaCA+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL2luaXQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9vcG5jbHMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9saWJiZmQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9zZWN0aW9uLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vYXJjaHVyZXMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9yZWxvYy5jID4+YmZkLmgKLQkuLyQoTUtET0MpIC1mICQoc3JjZGlyKS9wcm90by5zdHI8JChzcmNkaXIpLy4uL3N5bXMuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9iZmQuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi9hcmNoaXZlLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vY29yZWZpbGUuYyA+PmJmZC5oCi0JLi8kKE1LRE9DKSAtZiAkKHNyY2RpcikvcHJvdG8uc3RyPCQoc3JjZGlyKS8uLi90YXJnZXRzLmMgPj5iZmQuaAotCS4vJChNS0RPQykgLWYgJChzcmNkaXIpL3Byb3RvLnN0cjwkKHNyY2RpcikvLi4vZm9ybWF0LmMgPj5iZmQuaAkKLQllY2hvICIjaWZkZWYgX19jcGx1c3BsdXMiID4+YmZkLmgKLQllY2hvICJ9IiA+PmJmZC5oCi0JZWNobyAiI2VuZGlmIiA+PmJmZC5oCi0JZWNobyAiI2VuZGlmIiA+PmJmZC5oCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JmZC9kb2MvYmZkLnRleGluZm8gYi9iZmQvZG9jL2JmZC50ZXhpbmZvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWRmODdjLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvYmZkLnRleGluZm8KKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotXGlucHV0IHRleGluZm8udGV4Ci1Ac2V0ZmlsZW5hbWUgYmZkLmluZm8KLUBjICRJZCQKLUB0ZXgKLSUgTk9URSBMT0NBTCBLTFVHRSBUTyBBVk9JRCBUT08gTVVDSCBXSElURVNQQUNFCi1cZ2xvYmFsXGxvbmdcZGVmXGV4YW1wbGV7JQotXGJlZ2luZ3JvdXAKLVxsZXRcYWJvdmVlbnZicmVhaz1ccGFyCi1cbGV0XGFmdGVyZW52YnJlYWs9XHBhcgotXHBhcnNraXA9MHB0Ci1cbGlzcH0KLVxnbG9iYWxcbG9uZ1xkZWZcRWV4YW1wbGV7JQotXEVsaXNwCi1cZW5kZ3JvdXAKLVx2c2tpcCAtXHBhcnNraXAlIHRvIGNhbmNlbCBvdXQgZWZmZWN0IG9mIGZvbGxvd2luZyBccGFyCi19Ci1AZW5kIHRleAotQHN5bmluZGV4IGZuIGNwCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIEJmZDogKGJmZCkuICAgICAgICAgICAgICAgICAgIFRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBCRkQgbGlicmFyeS4KLQotQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIGlmaW5mbwotQGlmdGV4Ci1AY0BmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9uCi1AY0BzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBMSUIgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBMaWJyYXJ5Ci1AdGl0bGVwYWdlCi1AdGl0bGV7bGliYmZkfQotQHN1YnRpdGxle1RoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIExpYnJhcnl9Ci1Ac3AgMQotQHN1YnRpdGxlIEZpcnN0IEVkaXRpb24tLS1CRkQgdmVyc2lvbiA8IDMuMAotQHN1YnRpdGxlIEFwcmlsIDE5OTEKLUBhdXRob3Ige1N0ZXZlIENoYW1iZXJsYWlufQotQGF1dGhvciB7Q3lnbnVzIFN1cHBvcnR9Ci1AcGFnZQotCi1AdGV4Ci1cZGVmXCQjMSR7eyMxfX0gICUgS2x1Z2U6IGNvbGxlY3QgUkNTIHJldmlzaW9uIGluZm8gd2l0aG91dCAkLi4uJAotXHhkZWZcbWFudmVyc3tcJFJldmlzaW9uJH0gICUgRm9yIHVzZSBpbiBoZWFkZXJzLCBmb290ZXJzIHRvbwote1xwYXJza2lwPTBwdAotXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhcgotXGhmaWxsIHNhY1xAY3lnbnVzLmNvbVxwYXIKLVxoZmlsbCB7XGl0IEJGRH0sIFxtYW52ZXJzXHBhcgotXGhmaWxsIFxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhcgotfQotXGdsb2JhbFxwYXJpbmRlbnQ9MHB0ICUgU3RldmUgbGlrZXMgaXQgdGhpcyB3YXkKLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHN1YmplY3QgdG8gdGhlIHRlcm1zCi1vZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIGluY2x1ZGVzIHRoZSBwcm92aXNpb24gdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIHRpdGxlcGFnZQotQGVuZCBpZnRleAotCi1Abm9kZSBUb3AsIE92ZXJ2aWV3LCAoZGlyKSwgKGRpcikKLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGJpbmFyeSBmaWxlIGRlc2NyaXB0b3IgbGlicmFyeSBsaWJiZmQuCi1AZW5kIGlmaW5mbwotCi1AbWVudQotKiBPdmVydmlldzo6CQkJT3ZlcnZpZXcgb2YgQkZECi0qIEJGRCBmcm9udCBlbmQ6OgkJQkZEIGZyb250IGVuZAotKiBCRkQgYmFjayBlbmRzOjoJCUJGRCBiYWNrIGVuZHMKLSogSW5kZXg6OgkJCUluZGV4Ci1AZW5kIG1lbnUKLQotQG5vZGUgT3ZlcnZpZXcsIEJGRCBmcm9udCBlbmQsIFRvcCwgVG9wCi1AY2hhcHRlciBJbnRyb2R1Y3Rpb24KLUBjaW5kZXggQkZECi1AY2luZGV4IHdoYXQgaXMgaXQ/Ci1CRkQgaXMgYSBwYWNrYWdlIHdoaWNoIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gdXNlIHRoZQotc2FtZSByb3V0aW5lcyB0byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcyB3aGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUKLWZvcm1hdC4gIEEgbmV3IG9iamVjdCBmaWxlIGZvcm1hdCBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieQotY3JlYXRpbmcgYSBuZXcgQkZEIGJhY2sgZW5kIGFuZCBhZGRpbmcgaXQgdG8gdGhlIGxpYnJhcnkuCi0KLUJGRCBpcyBzcGxpdCBpbnRvIHR3byBwYXJ0czogdGhlIGZyb250IGVuZCwgYW5kIHRoZSBiYWNrIGVuZHMgKG9uZSBmb3IKLWVhY2ggb2JqZWN0IGZpbGUgZm9ybWF0KS4KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtIFRoZSBmcm9udCBlbmQgb2YgQkZEIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHVzZXIuIEl0IG1hbmFnZXMKLW1lbW9yeSBhbmQgdmFyaW91cyBjYW5vbmljYWwgZGF0YSBzdHJ1Y3R1cmVzLiBUaGUgZnJvbnQgZW5kIGFsc28KLWRlY2lkZXMgd2hpY2ggYmFjayBlbmQgdG8gdXNlIGFuZCB3aGVuIHRvIGNhbGwgYmFjayBlbmQgcm91dGluZXMuCi1AaXRlbSBUaGUgYmFjayBlbmRzIHByb3ZpZGUgQkZEIGl0cyB2aWV3IG9mIHRoZSByZWFsIHdvcmxkLiBFYWNoIGJhY2sKLWVuZCBwcm92aWRlcyBhIHNldCBvZiBjYWxscyB3aGljaCB0aGUgQkZEIGZyb250IGVuZCBjYW4gdXNlIHRvIG1haW50YWluCi1pdHMgY2Fub25pY2FsIGZvcm0uIFRoZSBiYWNrIGVuZHMgYWxzbyBtYXkga2VlcCBhcm91bmQgaW5mb3JtYXRpb24gZm9yCi10aGVpciBvd24gdXNlLCBmb3IgZ3JlYXRlciBlZmZpY2llbmN5LgotQGVuZCBpdGVtaXplCi1AbWVudQotKiBIaXN0b3J5OjoJCQlIaXN0b3J5Ci0qIEhvdyBJdCBXb3Jrczo6CQlIb3cgSXQgV29ya3MKLSogV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbzo6CVdoYXQgQkZEIFZlcnNpb24gMiBDYW4gRG8KLUBlbmQgbWVudQotCi1Abm9kZSBIaXN0b3J5LCBIb3cgSXQgV29ya3MsIE92ZXJ2aWV3LCBPdmVydmlldwotQHNlY3Rpb24gSGlzdG9yeQotCi1PbmUgc3B1ciBiZWhpbmQgQkZEIHdhcyB0aGUgZGVzaXJlLCBvbiB0aGUgcGFydCBvZiB0aGUgR05VIDk2MCB0ZWFtIGF0Ci1JbnRlbCBPcmVnb24sIGZvciBpbnRlcm9wZXJhYmlsaXR5IG9mIGFwcGxpY2F0aW9ucyBvbiB0aGVpciBDT0ZGIGFuZAotYi5vdXQgZmlsZSBmb3JtYXRzLiAgQ3lnbnVzIHdhcyBwcm92aWRpbmcgR05VIHN1cHBvcnQgZm9yIHRoZSB0ZWFtLCBhbmQKLXdhcyBjb250cmFjdGVkIHRvIHByb3ZpZGUgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkuCi0KLVRoZSBuYW1lIGNhbWUgZnJvbSBhIGNvbnZlcnNhdGlvbiBEYXZpZCBXYWxsYWNlIHdhcyBoYXZpbmcgd2l0aCBSaWNoYXJkCi1TdGFsbG1hbiBhYm91dCB0aGUgbGlicmFyeTogUk1TIHNhaWQgdGhhdCBpdCB3b3VsZCBiZSBxdWl0ZSBoYXJkLS0tRGF2aWQKLXNhaWQgYGBCRkQnJy4gIFN0YWxsbWFuIHdhcyByaWdodCwgYnV0IHRoZSBuYW1lIHN0dWNrLgotCi1BdCB0aGUgc2FtZSB0aW1lLCBSZWFkeSBTeXN0ZW1zIHdhbnRlZCBtdWNoIHRoZSBzYW1lIHRoaW5nLCBidXQgZm9yCi1kaWZmZXJlbnQgb2JqZWN0IGZpbGUgZm9ybWF0czogSUVFRS02OTUsIE9hc3lzLCBTcmVjb3JkcywgYS5vdXQgYW5kIDY4awotY29mZi4KLQotQkZEIHdhcyBmaXJzdCBpbXBsZW1lbnRlZCBieSBtZW1iZXJzIG9mIEN5Z251cyBTdXBwb3J0OyBTdGV2ZQotQ2hhbWJlcmxhaW4gKEBjb2Rle3NhY0BAY3lnbnVzLmNvbX0pLCBKb2huIEdpbG1vcmUKLShAY29kZXtnbnVAQGN5Z251cy5jb219KSwgSy4gIFJpY2hhcmQgUGl4bGV5IChAY29kZXtyaWNoQEBjeWdudXMuY29tfSkKLWFuZCBEYXZpZCBIZW5rZWwtV2FsbGFjZSAoQGNvZGV7Z3VtYnlAQGN5Z251cy5jb219KS4KLQotCi0KLUBub2RlIEhvdyBJdCBXb3JrcywgV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbywgSGlzdG9yeSwgT3ZlcnZpZXcKLUBzZWN0aW9uIEhvdyBUbyBVc2UgQkZECi0KLVRvIHVzZSB0aGUgbGlicmFyeSwgaW5jbHVkZSBAZmlsZXtiZmQuaH0gYW5kIGxpbmsgd2l0aCBAZmlsZXtsaWJiZmQuYX0uCQotCi1CRkQgcHJvdmlkZXMgYSBjb21tb24gaW50ZXJmYWNlIHRvIHRoZSBwYXJ0cyBvZiBhbiBvYmplY3QgZmlsZQotZm9yIGEgY2FsbGluZyBhcHBsaWNhdGlvbi4gCi0KLVdoZW4gYW4gYXBwbGljYXRpb24gc3VjZXNzZnVsbHkgb3BlbnMgYSB0YXJnZXQgZmlsZSAob2JqZWN0LCBhcmNoaXZlLCBvcgotd2hhdGV2ZXIpLCBhIHBvaW50ZXIgdG8gYW4gaW50ZXJuYWwgc3RydWN0dXJlIGlzIHJldHVybmVkLiBUaGlzIHBvaW50ZXIKLXBvaW50cyB0byBhIHN0cnVjdHVyZSBjYWxsZWQgQGNvZGV7YmZkfSwgZGVzY3JpYmVkIGluCi1AZmlsZXtiZmQuaH0uICBPdXIgY29udmVudGlvbiBpcyB0byBjYWxsIHRoaXMgcG9pbnRlciBhIEJGRCwgYW5kCi1pbnN0YW5jZXMgb2YgaXQgd2l0aGluIGNvZGUgQGNvZGV7YWJmZH0uICBBbGwgb3BlcmF0aW9ucyBvbgotdGhlIHRhcmdldCBvYmplY3QgZmlsZSBhcmUgYXBwbGllZCBhcyBtZXRob2RzIHRvIHRoZSBCRkQuICBUaGUgbWFwcGluZyBpcwotZGVmaW5lZCB3aXRoaW4gQGNvZGV7YmZkLmh9IGluIGEgc2V0IG9mIG1hY3JvcywgYWxsIGJlZ2lubmluZwotd2l0aCBAc2FtcHtiZmRffSB0byByZWR1Y2UgbmFtZXNwYWNlIHBvbGx1dGlvbi4KLQotRm9yIGV4YW1wbGUsIHRoaXMgc2VxdWVuY2UgZG9lcyB3aGF0IHlvdSB3b3VsZCBwcm9iYWJseSBleHBlY3Q6Ci1yZXR1cm4gdGhlIG51bWJlciBvZiBzZWN0aW9ucyBpbiBhbiBvYmplY3QgZmlsZSBhdHRhY2hlZCB0byBhIEJGRAotQGNvZGV7YWJmZH0uIAotCi1AbGlzcAotQGMgQGNhcnRvdWNoZQotI2luY2x1ZGUgImJmZC5oIgotCi11bnNpZ25lZCBpbnQgbnVtYmVyX29mX3NlY3Rpb25zKGFiZmQpCi1iZmQgKmFiZmQ7Ci1AewotICByZXR1cm4gYmZkX2NvdW50X3NlY3Rpb25zKGFiZmQpOwotQH0KLUBjIEBlbmQgY2FydG91Y2hlCi1AZW5kIGxpc3AKLQotVGhlIGFic3RyYWN0aW9uIHVzZWQgd2l0aGluIEJGRCBpcyB0aGF0IGFuIG9iamVjdCBmaWxlIGhhczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLWEgaGVhZGVyLAotQGl0ZW0KLWEgbnVtYmVyIG9mIHNlY3Rpb25zIGNvbnRhaW5pbmcgcmF3IGRhdGEgKEBweHJlZntTZWN0aW9uc30pLAotQGl0ZW0KLWEgc2V0IG9mIHJlbG9jYXRpb25zIChAcHhyZWZ7UmVsb2NhdGlvbnN9KSwgYW5kCi1AaXRlbQotc29tZSBzeW1ib2wgaW5mb3JtYXRpb24gKEBweHJlZntTeW1ib2xzfSkuCi1AZW5kIGl0ZW1pemUKLUBub2luZGVudAotQWxzbywgQkZEcyBvcGVuZWQgZm9yIGFyY2hpdmVzIGhhdmUgdGhlIGFkZGl0aW9uYWwgYXR0cmlidXRlIG9mIGFuIGluZGV4Ci1hbmQgY29udGFpbiBzdWJvcmRpbmF0ZSBCRkRzLiBUaGlzIGFwcHJvYWNoIGlzIGZpbmUgZm9yIGEub3V0IGFuZCBjb2ZmLAotYnV0IGxvc2VzIGVmZmljaWVuY3kgd2hlbiBhcHBsaWVkIHRvIGZvcm1hdHMgc3VjaCBhcyBTLXJlY29yZHMgYW5kCi1JRUVFLTY5NS4KLQotQG5vZGUgV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbywgICwgSG93IEl0IFdvcmtzLCBPdmVydmlldwotQHNlY3Rpb24gV2hhdCBCRkQgVmVyc2lvbiAyIENhbiBEbwotQGluY2x1ZGUgYmZkc3VtbS50ZXhpCi0KLUBub2RlIEJGRCBmcm9udCBlbmQsIEJGRCBiYWNrIGVuZHMsIE92ZXJ2aWV3LCBUb3AKLUBjaGFwdGVyIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlIGJmZHQudGV4aQotCi1AbWVudQotKiBNZW1vcnkgVXNhZ2U6OgotKiBJbml0aWFsaXphdGlvbjo6Ci0qIFNlY3Rpb25zOjoKLSogU3ltYm9sczo6Ci0qIEFyY2hpdmVzOjoKLSogRm9ybWF0czo6Ci0qIFJlbG9jYXRpb25zOjoKLSogQ29yZSBGaWxlczo6Ci0qIFRhcmdldHM6OgotKiBBcmNoaXRlY3R1cmVzOjoKLSogT3BlbmluZyBhbmQgQ2xvc2luZzo6Ci0qIEludGVybmFsOjoKLSogRmlsZSBDYWNoaW5nOjoKLSogTGlua2VyIEZ1bmN0aW9uczo6Ci0qIEhhc2ggVGFibGVzOjoKLUBlbmQgbWVudQotCi1Abm9kZSBNZW1vcnkgVXNhZ2UsIEluaXRpYWxpemF0aW9uLCBCRkQgZnJvbnQgZW5kLCBCRkQgZnJvbnQgZW5kCi1Ac2VjdGlvbiBNZW1vcnkgdXNhZ2UKLUJGRCBrZWVwcyBhbGwgb2YgaXRzIGludGVybmFsIHN0cnVjdHVyZXMgaW4gb2JzdGFja3MuIFRoZXJlIGlzIG9uZSBvYnN0YWNrCi1wZXIgb3BlbiBCRkQgZmlsZSwgaW50byB3aGljaCB0aGUgY3VycmVudCBzdGF0ZSBpcyBzdG9yZWQuIFdoZW4gYSBCRkQgaXMKLWNsb3NlZCwgdGhlIG9ic3RhY2sgaXMgZGVsZXRlZCwgYW5kIHNvIGV2ZXJ5dGhpbmcgd2hpY2ggaGFzIGJlZW4KLWFsbG9jYXRlZCBieSBCRkQgZm9yIHRoZSBjbG9zaW5nIGZpbGUgaXMgdGhyb3duIGF3YXkuCi0KLUJGRCBkb2VzIG5vdCBmcmVlIGFueXRoaW5nIGNyZWF0ZWQgYnkgYW4gYXBwbGljYXRpb24sIGJ1dCBwb2ludGVycyBpbnRvCi1AY29kZXtiZmR9IHN0cnVjdHVyZXMgYmVjb21lIGludmFsaWQgb24gYSBAY29kZXtiZmRfY2xvc2V9OyBmb3IgZXhhbXBsZSwKLWFmdGVyIGEgQGNvZGV7YmZkX2Nsb3NlfSB0aGUgdmVjdG9yIHBhc3NlZCB0bwotQGNvZGV7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9IGlzIHN0aWxsIGFyb3VuZCwgc2luY2UgaXQgaGFzIGJlZW4KLWFsbG9jYXRlZCBieSB0aGUgYXBwbGljYXRpb24sIGJ1dCB0aGUgZGF0YSB0aGF0IGl0IHBvaW50ZWQgdG8gYXJlCi1sb3N0LgotCi1UaGUgZ2VuZXJhbCBydWxlIGlzIHRvIG5vdCBjbG9zZSBhIEJGRCB1bnRpbCBhbGwgb3BlcmF0aW9ucyBkZXBlbmRlbnQKLXVwb24gZGF0YSBmcm9tIHRoZSBCRkQgaGF2ZSBiZWVuIGNvbXBsZXRlZCwgb3IgYWxsIHRoZSBkYXRhIGZyb20gd2l0aGluCi10aGUgZmlsZSBoYXMgYmVlbiBjb3BpZWQuIFRvIGhlbHAgd2l0aCB0aGUgbWFuYWdlbWVudCBvZiBtZW1vcnksIHRoZXJlCi1pcyBhIGZ1bmN0aW9uIChAY29kZXtiZmRfYWxsb2Nfc2l6ZX0pIHdoaWNoIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcwotaW4gb2JzdGFja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdXBwbGllZCBCRkQuIFRoaXMgY291bGQgYmUgdXNlZCB0bwotc2VsZWN0IHRoZSBncmVlZGllc3Qgb3BlbiBCRkQsIGNsb3NlIGl0IHRvIHJlY2xhaW0gdGhlIG1lbW9yeSwgcGVyZm9ybQotc29tZSBvcGVyYXRpb24gYW5kIHJlb3BlbiB0aGUgQkZEIGFnYWluLCB0byBnZXQgYSBmcmVzaCBjb3B5IG9mIHRoZSBkYXRhCi1zdHJ1Y3R1cmVzLgotCi1Abm9kZSBJbml0aWFsaXphdGlvbiwgU2VjdGlvbnMsIE1lbW9yeSBVc2FnZSwgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGluaXQudGV4aQotCi1Abm9kZSBTZWN0aW9ucywgU3ltYm9scywgSW5pdGlhbGl6YXRpb24sIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBzZWN0aW9uLnRleGkKLQotQG5vZGUgU3ltYm9scywgQXJjaGl2ZXMsIFNlY3Rpb25zLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgc3ltcy50ZXhpCi0KLUBub2RlIEFyY2hpdmVzLCBGb3JtYXRzLCBTeW1ib2xzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgYXJjaGl2ZS50ZXhpCi0KLUBub2RlIEZvcm1hdHMsIFJlbG9jYXRpb25zLCBBcmNoaXZlcywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGZvcm1hdC50ZXhpCi0KLUBub2RlIFJlbG9jYXRpb25zLCBDb3JlIEZpbGVzLCBGb3JtYXRzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgcmVsb2MudGV4aQotCi1Abm9kZSBDb3JlIEZpbGVzLCBUYXJnZXRzLCBSZWxvY2F0aW9ucywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGNvcmUudGV4aQotCi1Abm9kZSBUYXJnZXRzLCBBcmNoaXRlY3R1cmVzLCBDb3JlIEZpbGVzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgdGFyZ2V0cy50ZXhpCi0KLUBub2RlIEFyY2hpdGVjdHVyZXMsIE9wZW5pbmcgYW5kIENsb3NpbmcsIFRhcmdldHMsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBhcmNodXJlcy50ZXhpCi0KLUBub2RlIE9wZW5pbmcgYW5kIENsb3NpbmcsIEludGVybmFsLCBBcmNoaXRlY3R1cmVzLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgb3BuY2xzLnRleGkKLQotQG5vZGUgSW50ZXJuYWwsIEZpbGUgQ2FjaGluZywgT3BlbmluZyBhbmQgQ2xvc2luZywgQkZEIGZyb250IGVuZAotQGluY2x1ZGUgIGxpYmJmZC50ZXhpCi0KLUBub2RlIEZpbGUgQ2FjaGluZywgTGlua2VyIEZ1bmN0aW9ucywgSW50ZXJuYWwsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBjYWNoZS50ZXhpCi0KLUBub2RlIExpbmtlciBGdW5jdGlvbnMsIEhhc2ggVGFibGVzLCBGaWxlIENhY2hpbmcsIEJGRCBmcm9udCBlbmQKLUBpbmNsdWRlICBsaW5rZXIudGV4aQotCi1Abm9kZSBIYXNoIFRhYmxlcywgLCBMaW5rZXIgRnVuY3Rpb25zLCBCRkQgZnJvbnQgZW5kCi1AaW5jbHVkZSAgaGFzaC50ZXhpCi0KLUBub2RlIEJGRCBiYWNrIGVuZHMsIEluZGV4LCBCRkQgZnJvbnQgZW5kLCBUb3AKLUBjaGFwdGVyIEJGRCBiYWNrIGVuZHMKLUBtZW51Ci0qIFdoYXQgdG8gUHV0IFdoZXJlOjoKLSogYW91dCA6OglhLm91dCBiYWNrZW5kcwotKiBjb2ZmIDo6CWNvZmYgYmFja2VuZHMKLSogZWxmICA6OgllbGYgYmFja2VuZHMKLUBpZ25vcmUKLSogb2FzeXMgOjoJb2FzeXMgYmFja2VuZHMKLSogaWVlZSA6OglpZWVlIGJhY2tlbmQKLSogc3JlY29yZCA6OglzLXJlY29yZCBiYWNrZW5kCi1AZW5kIGlnbm9yZQotQGVuZCBtZW51Ci1Abm9kZSBXaGF0IHRvIFB1dCBXaGVyZSwgYW91dCwgQkZEIGJhY2sgZW5kcywgQkZEIGJhY2sgZW5kcwotQWxsIG9mIEJGRCBsaXZlcyBpbiBvbmUgZGlyZWN0b3J5LgotCi1Abm9kZSBhb3V0LCBjb2ZmLCBXaGF0IHRvIFB1dCBXaGVyZSwgQkZEIGJhY2sgZW5kcwotQGluY2x1ZGUgIGFvdXR4LnRleGkKLQotQG5vZGUgY29mZiwgZWxmLCBhb3V0LCBCRkQgYmFjayBlbmRzCi1AaW5jbHVkZSAgY29mZmNvZGUudGV4aQotCi1Abm9kZSBlbGYsICAsIGNvZmYsIEJGRCBiYWNrIGVuZHMKLUBpbmNsdWRlICBlbGYudGV4aQotQGMgTGVhdmUgdGhpcyBvdXQgdW50aWwgdGhlIGZpbGUgaGFzIHNvbWUgYWN0dWFsIGNvbnRlbnRzLi4uCi1AYyBAaW5jbHVkZSAgZWxmY29kZS50ZXhpCi0KLUBub2RlIEluZGV4LCAgLCBCRkQgYmFjayBlbmRzICwgVG9wCi1AdW5udW1iZXJlZCBJbmRleAotQHByaW50aW5kZXggY3AKLQotQHRleAotJSBJIHRoaW5rIHNvbWV0aGluZyBsaWtlIEBjb2xvcGhvbiBzaG91bGQgYmUgaW4gdGV4aW5mby4gIEluIHRoZQotJSBtZWFudGltZToKLVxsb25nXGRlZlxjb2xvcGhvbntcaGJveCB0bzBwdHt9XHZmaWxsCi1cY2VudGVybGluZXtUaGUgYm9keSBvZiB0aGlzIG1hbnVhbCBpcyBzZXQgaW59Ci1cY2VudGVybGluZXtcZm9udG5hbWVcdGVucm0sfQotXGNlbnRlcmxpbmV7d2l0aCBoZWFkaW5ncyBpbiB7XGJmXGZvbnRuYW1lXHRlbmJmfX0KLVxjZW50ZXJsaW5le2FuZCBleGFtcGxlcyBpbiB7XHR0XGZvbnRuYW1lXHRlbnR0fS59Ci1cY2VudGVybGluZXt7XGl0XGZvbnRuYW1lXHRlbml0XC99IGFuZH0KLVxjZW50ZXJsaW5le3tcc2xcZm9udG5hbWVcdGVuc2xcL319Ci1cY2VudGVybGluZXthcmUgdXNlZCBmb3IgZW1waGFzaXMufVx2ZmlsbH0KLVxwYWdlXGNvbG9waG9uCi0lIEJsYW1lOiBkb2NAY3lnbnVzLmNvbSwgMjhtYXI5MS4KLUBlbmQgdGV4Ci0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvYmZkL2RvYy9iZmRpbnQudGV4aSBiL2JmZC9kb2MvYmZkaW50LnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMDliMzQuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmRpbnQudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDE4ODUgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBiZmRpbnQuaW5mbwotCi1Ac2V0dGl0bGUgQkZEIEludGVybmFscwotQGlmdGV4Ci1AdGl0bGVwYWdlCi1AdGl0bGV7QkZEIEludGVybmFsc30KLUBhdXRob3J7SWFuIExhbmNlIFRheWxvcn0KLUBhdXRob3J7Q3lnbnVzIFNvbHV0aW9uc30KLUBwYWdlCi1AZW5kIGlmdGV4Ci0KLUBub2RlIFRvcAotQHRvcCBCRkQgSW50ZXJuYWxzCi1AcmFpc2VzZWN0aW9ucwotQGNpbmRleCBiZmQgaW50ZXJuYWxzCi0KLVRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHNvbWUgQkZEIGludGVybmFsIGluZm9ybWF0aW9uIHdoaWNoIG1heSBiZQotaGVscGZ1bCB3aGVuIHdvcmtpbmcgb24gQkZELiAgSXQgaXMgdmVyeSBpbmNvbXBsZXRlLgotCi1UaGlzIGRvY3VtZW50IGlzIG5vdCB1cGRhdGVkIHJlZ3VsYXJseSwgYW5kIG1heSBiZSBvdXQgb2YgZGF0ZS4gIEl0IHdhcwotbGFzdCBtb2RpZmllZCBvbiAkRGF0ZSQuCi0KLVRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCB3YXMgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yCi1AZW1haWx7aWFuQEBjeWdudXMuY29tfS4KLQotQG1lbnUKLSogQkZEIG92ZXJ2aWV3OjoJCUJGRCBvdmVydmlldwotKiBCRkQgZ3VpZGVsaW5lczo6CQlCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lcwotKiBCRkQgdGFyZ2V0IHZlY3Rvcjo6CQlCRkQgdGFyZ2V0IHZlY3RvcgotKiBCRkQgZ2VuZXJhdGVkIGZpbGVzOjoJCUJGRCBnZW5lcmF0ZWQgZmlsZXMKLSogQkZEIG11bHRpcGxlIGNvbXBpbGF0aW9uczo6CUZpbGVzIGNvbXBpbGVkIG11bHRpcGxlIHRpbWVzIGluIEJGRAotKiBCRkQgcmVsb2NhdGlvbiBoYW5kbGluZzo6CUJGRCByZWxvY2F0aW9uIGhhbmRsaW5nCi0qIEJGRCBFTEYgc3VwcG9ydDo6CQlCRkQgRUxGIHN1cHBvcnQKLSogQkZEIGdsb3NzYXJ5OjoJCUdsb3NzYXJ5Ci0qIEluZGV4OjoJCQlJbmRleAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBvdmVydmlldwotQHNlY3Rpb24gQkZEIG92ZXJ2aWV3Ci0KLUJGRCBpcyBhIGxpYnJhcnkgd2hpY2ggcHJvdmlkZXMgYSBzaW5nbGUgaW50ZXJmYWNlIHRvIHJlYWQgYW5kIHdyaXRlCi1vYmplY3QgZmlsZXMsIGV4ZWN1dGFibGVzLCBhcmNoaXZlIGZpbGVzLCBhbmQgY29yZSBmaWxlcyBpbiBhbnkgZm9ybWF0LgotCi1AbWVudQotKiBCRkQgbGlicmFyeSBpbnRlcmZhY2VzOjoJQkZEIGxpYnJhcnkgaW50ZXJmYWNlcwotKiBCRkQgbGlicmFyeSB1c2Vyczo6CQlCRkQgbGlicmFyeSB1c2VycwotKiBCRkQgdmlldzo6CQkJVGhlIEJGRCB2aWV3IG9mIGEgZmlsZQotKiBCRkQgYmxpbmRuZXNzOjoJCUJGRCBsb3NlcyBpbmZvcm1hdGlvbgotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBsaWJyYXJ5IGludGVyZmFjZXMKLUBzdWJzZWN0aW9uIEJGRCBsaWJyYXJ5IGludGVyZmFjZXMKLQotT25lIHdheSB0byBsb29rIGF0IHRoZSBCRkQgbGlicmFyeSBpcyB0byBkaXZpZGUgaXQgaW50byBmb3VyIHBhcnRzIGJ5Ci10eXBlIG9mIGludGVyZmFjZS4KLQotVGhlIGZpcnN0IGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIGdlbmVyaWMgZnVuY3Rpb25zIHdoaWNoIHByb2dyYW1zIHVzaW5nCi10aGUgQkZEIGxpYnJhcnkgd2lsbCBjYWxsLiAgVGhlc2UgZ2VuZXJpYyBmdW5jdGlvbiBub3JtYWxseSB0cmFuc2xhdGUKLWRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW50byBjYWxscyB0byByb3V0aW5lcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gYQotcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQuICBNYW55IG9mIHRoZXNlIGdlbmVyaWMgZnVuY3Rpb25zIGFyZQotYWN0dWFsbHkgZGVmaW5lZCBhcyBtYWNyb3MgaW4gQGZpbGV7YmZkLmh9LiAgVGhlc2UgZnVuY3Rpb25zIGNvbXByaXNlCi10aGUgb2ZmaWNpYWwgQkZEIGludGVyZmFjZS4KLQotVGhlIHNlY29uZCBpbnRlcmZhY2UgaXMgdGhlIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSB0YXJnZXQKLXZlY3RvcnMuICBUaGlzIGlzIHRoZSBidWxrIG9mIHRoZSBjb2RlIGluIEJGRC4gIEEgdGFyZ2V0IHZlY3RvciBpcyBhIHNldAotb2YgZnVuY3Rpb24gcG9pbnRlcnMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQotdGFyZ2V0IHZlY3RvciBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgZ2VuZXJpYyBCRkQgZnVuY3Rpb25zLiAgVGhlc2UKLWZ1bmN0aW9ucyBhcmUgYWx3YXlzIGNhbGxlZCB0aHJvdWdoIHRoZSB0YXJnZXQgdmVjdG9yLCBhbmQgYXJlIG5ldmVyCi1jYWxsZWQgZGlyZWN0bHkuICBUaGUgdGFyZ2V0IHZlY3RvciBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluIEByZWZ7QkZECi10YXJnZXQgdmVjdG9yfS4gIFRoZSBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGFwcGVhciBpbiBhIHBhcnRpY3VsYXIKLXRhcmdldCB2ZWN0b3IgaXMgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYSBCRkQgYmFja2VuZC4KLQotVGhlIHRoaXJkIGludGVyZmFjZSBpcyBhIHNldCBvZiBvZGRiYWxsIGZ1bmN0aW9ucyB3aGljaCBhcmUgdHlwaWNhbGx5Ci1zcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUgZm9ybWF0LCBhcmUgbm90IGdlbmVyaWMgZnVuY3Rpb25zLAotYW5kIGFyZSBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBCRkQgbGlicmFyeS4gIFRoZXNlIGFyZSB1c2VkIGFzIGhvb2tzCi1ieSB0aGUgbGlua2VyIGFuZCB0aGUgYXNzZW1ibGVyIHdoZW4gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdAotcmVxdWlyZXMgc29tZSBhY3Rpb24gd2hpY2ggdGhlIEJGRCBnZW5lcmljIGludGVyZmFjZSBkb2VzIG5vdCBwcm92aWRlLgotVGhlc2UgZnVuY3Rpb25zIGFyZSB0eXBpY2FsbHkgZGVjbGFyZWQgaW4gQGZpbGV7YmZkLmh9LCBidXQgaW4gbWFueQotY2FzZXMgdGhleSBhcmUgb25seSBwcm92aWRlZCB3aGVuIEJGRCBpcyBjb25maWd1cmVkIHdpdGggc3VwcG9ydCBmb3IgYQotcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGVzZSBmdW5jdGlvbnMgbGl2ZSBpbiBhIGdyZXkgYXJlYSwgYW5kCi1hcmUgbm90IHJlYWxseSBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLgotCi1UaGUgZm91cnRoIGludGVyZmFjZSBpcyB0aGUgc2V0IG9mIEJGRCBzdXBwb3J0IGZ1bmN0aW9ucyB3aGljaCBhcmUKLWNhbGxlZCBieSB0aGUgb3RoZXIgQkZEIGZ1bmN0aW9ucy4gIFRoZXNlIG1hbmFnZSBpc3N1ZXMgbGlrZSBtZW1vcnkKLWFsbG9jYXRpb24sIGVycm9yIGhhbmRsaW5nLCBmaWxlIGFjY2VzcywgaGFzaCB0YWJsZXMsIHN3YXBwaW5nLCBhbmQgdGhlCi1saWtlLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBuZXZlciBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBCRkQgbGlicmFyeS4KLQotQG5vZGUgQkZEIGxpYnJhcnkgdXNlcnMKLUBzdWJzZWN0aW9uIEJGRCBsaWJyYXJ5IHVzZXJzCi0KLUFub3RoZXIgd2F5IHRvIGxvb2sgYXQgdGhlIEJGRCBsaWJyYXJ5IGlzIHRvIGRpdmlkZSBpdCBpbnRvIHRocmVlIHBhcnRzCi1ieSB0aGUgbWFubmVyIGluIHdoaWNoIGl0IGlzIHVzZWQuCi0KLVRoZSBmaXJzdCB1c2UgaXMgdG8gcmVhZCBhbiBvYmplY3QgZmlsZS4gIFRoZSBvYmplY3QgZmlsZSByZWFkZXJzIGFyZQotcHJvZ3JhbXMgbGlrZSBAc2FtcHtnZGJ9LCBAc2FtcHtubX0sIEBzYW1we29iamR1bXB9LCBhbmQgQHNhbXB7b2JqY29weX0uCi1UaGVzZSBwcm9ncmFtcyB1c2UgQkZEIHRvIHZpZXcgYW4gb2JqZWN0IGZpbGUgaW4gYSBnZW5lcmljIGZvcm0uICBUaGUKLW9mZmljaWFsIEJGRCBpbnRlcmZhY2UgaXMgbm9ybWFsbHkgZnVsbHkgYWRlcXVhdGUgZm9yIHRoZXNlIHByb2dyYW1zLgotCi1UaGUgc2Vjb25kIHVzZSBpcyB0byB3cml0ZSBhbiBvYmplY3QgZmlsZS4gIFRoZSBvYmplY3QgZmlsZSB3cml0ZXJzIGFyZQotcHJvZ3JhbXMgbGlrZSBAc2FtcHtnYXN9IGFuZCBAc2FtcHtvYmpjb3B5fS4gIFRoZXNlIHByb2dyYW1zIHVzZSBCRkQgdG8KLWNyZWF0ZSBhbiBvYmplY3QgZmlsZS4gIFRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlIGlzIG5vcm1hbGx5IGFkZXF1YXRlCi1mb3IgdGhlc2UgcHJvZ3JhbXMsIGJ1dCBmb3Igc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIHRoZSBhc3NlbWJsZXIgbmVlZHMKLXNvbWUgYWRkaXRpb25hbCBob29rcyBpbiBvcmRlciB0byBzZXQgcGFydGljdWxhciBmbGFncyBvciBvdGhlcgotaW5mb3JtYXRpb24uICBUaGUgb2ZmaWNpYWwgQkZEIGludGVyZmFjZSBpbmNsdWRlcyBmdW5jdGlvbnMgdG8gY29weQotcHJpdmF0ZSBpbmZvcm1hdGlvbiBmcm9tIG9uZSBvYmplY3QgZmlsZSB0byBhbm90aGVyLCBhbmQgdGhlc2UgZnVuY3Rpb25zCi1hcmUgdXNlZCBieSBAc2FtcHtvYmpjb3B5fSB0byBhdm9pZCBpbmZvcm1hdGlvbiBsb3NzLgotCi1UaGUgdGhpcmQgdXNlIGlzIHRvIGxpbmsgb2JqZWN0IGZpbGVzLiAgVGhlcmUgaXMgb25seSBvbmUgb2JqZWN0IGZpbGUKLWxpbmtlciwgQHNhbXB7bGR9LiAgT3JpZ2luYWxseSwgQHNhbXB7bGR9IHdhcyBhbiBvYmplY3QgZmlsZSByZWFkZXIgYW5kCi1hbiBvYmplY3QgZmlsZSB3cml0ZXIsIGFuZCBpdCBkaWQgdGhlIGxpbmsgb3BlcmF0aW9uIHVzaW5nIHRoZSBnZW5lcmljCi1CRkQgc3RydWN0dXJlcy4gIEhvd2V2ZXIsIHRoaXMgdHVybmVkIG91dCB0byBiZSB0b28gc2xvdyBhbmQgdG9vIG1lbW9yeQotaW50ZW5zaXZlLgotCi1UaGUgb2ZmaWNpYWwgQkZEIGxpbmtlciBmdW5jdGlvbnMgd2VyZSB3cml0dGVuIHRvIHBlcm1pdCBzcGVjaWZpYyBCRkQKLWJhY2tlbmRzIHRvIHBlcmZvcm0gdGhlIGxpbmsgd2l0aG91dCB0cmFuc2xhdGluZyB0aHJvdWdoIHRoZSBnZW5lcmljCi1zdHJ1Y3R1cmVzLCBpbiB0aGUgbm9ybWFsIGNhc2Ugd2hlcmUgYWxsIHRoZSBpbnB1dCBmaWxlcyBhbmQgb3V0cHV0IGZpbGUKLWhhdmUgdGhlIHNhbWUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgTm90IGFsbCBvZiB0aGUgYmFja2VuZHMgY3VycmVudGx5Ci1pbXBsZW1lbnQgdGhlIG5ldyBpbnRlcmZhY2UsIGFuZCB0aGVyZSBhcmUgZGVmYXVsdCBsaW5raW5nIGZ1bmN0aW9ucwotd2l0aGluIEJGRCB3aGljaCB1c2UgdGhlIGdlbmVyaWMgc3RydWN0dXJlcyBhbmQgd2hpY2ggd29yayB3aXRoIGFsbAotYmFja2VuZHMuCi0KLUZvciBzZXZlcmFsIG9iamVjdCBmaWxlIGZvcm1hdHMgdGhlIGxpbmtlciBuZWVkcyBhZGRpdGlvbmFsIGhvb2tzIHdoaWNoCi1hcmUgbm90IHByb3ZpZGVkIGJ5IHRoZSBvZmZpY2lhbCBCRkQgaW50ZXJmYWNlLCBwYXJ0aWN1bGFybHkgZm9yIGR5bmFtaWMKLWxpbmtpbmcgc3VwcG9ydC4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdHlwaWNhbGx5IGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIKLWVtdWxhdGlvbiB0ZW1wbGF0ZS4KLQotQG5vZGUgQkZEIHZpZXcKLUBzdWJzZWN0aW9uIFRoZSBCRkQgdmlldyBvZiBhIGZpbGUKLQotQkZEIHVzZXMgZ2VuZXJpYyBzdHJ1Y3R1cmVzIHRvIG1hbmFnZSBpbmZvcm1hdGlvbi4gIEl0IHRyYW5zbGF0ZXMgZGF0YQotaW50byB0aGUgZ2VuZXJpYyBmb3JtIHdoZW4gcmVhZGluZyBmaWxlcywgYW5kIG91dCBvZiB0aGUgZ2VuZXJpYyBmb3JtCi13aGVuIHdyaXRpbmcgZmlsZXMuCi0KLUJGRCBkZXNjcmliZXMgYSBmaWxlIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YmZkfSB0eXBlLiAgQSBAc2FtcHtiZmR9Ci1pcyBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzLiAgVGhlIEJGRCBpbmZvcm1hdGlvbiBjYW4gYmUKLWRpc3BsYXllZCB1c2luZyB0aGUgQHNhbXB7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoIHZhcmlvdXMgb3B0aW9ucy4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBnZW5lcmFsIGluZm9ybWF0aW9uCi1UaGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhIGZldyBnZW5lcmFsIGZsYWdzLCB0aGUgc3RhcnQgYWRkcmVzcy4KLUBpdGVtIGFyY2hpdGVjdHVyZQotVGhlIGFyY2hpdGVjdHVyZSwgaW5jbHVkaW5nIGJvdGggYSBnZW5lcmFsIHByb2Nlc3NvciB0eXBlIChtNjhrLCBNSVBTCi1ldGMuKSBhbmQgYSBzcGVjaWZpYyBtYWNoaW5lIG51bWJlciAobTY4MDAwLCBSNDAwMCwgZXRjLikuCi1AaXRlbSBzZWN0aW9ucwotQSBsaXN0IG9mIHNlY3Rpb25zLgotQGl0ZW0gc3ltYm9scwotQSBzeW1ib2wgdGFibGUuCi1AZW5kIHRhYmxlCi0KLUJGRCByZXByZXNlbnRzIGEgc2VjdGlvbiBhcyBhIHBvaW50ZXIgdG8gdGhlIEBzYW1we2FzZWN0aW9ufSB0eXBlLiAgRWFjaAotc2VjdGlvbiBoYXMgYSBuYW1lIGFuZCBhIHNpemUuICBNb3N0IHNlY3Rpb25zIGFsc28gaGF2ZSBhbiBhc3NvY2lhdGVkCi1ibG9jayBvZiBkYXRhLCBrbm93biBhcyB0aGUgc2VjdGlvbiBjb250ZW50cy4gIFNlY3Rpb25zIGFsc28gaGF2ZQotYXNzb2NpYXRlZCBmbGFncywgYSB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzLCBhIGxvYWQgbWVtb3J5IGFkZHJlc3MsIGEKLXJlcXVpcmVkIGFsaWdubWVudCwgYSBsaXN0IG9mIHJlbG9jYXRpb25zLCBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cwotaW5mb3JtYXRpb24uCi0KLUJGRCByZXByZXNlbnRzIGEgcmVsb2NhdGlvbiBhcyBhIHBvaW50ZXIgdG8gdGhlIEBzYW1we2FyZWxlbnR9IHR5cGUuICBBCi1yZWxvY2F0aW9uIGRlc2NyaWJlcyBhbiBhY3Rpb24gd2hpY2ggdGhlIGxpbmtlciBtdXN0IHRha2UgdG8gbW9kaWZ5IHRoZQotc2VjdGlvbiBjb250ZW50cy4gIFJlbG9jYXRpb25zIGhhdmUgYSBzeW1ib2wsIGFuIGFkZHJlc3MsIGFuIGFkZGVuZCwgYW5kCi1hIHBvaW50ZXIgdG8gYSBob3d0byBzdHJ1Y3R1cmUgd2hpY2ggZGVzY3JpYmVzIGhvdyB0byBwZXJmb3JtIHRoZQotcmVsb2NhdGlvbi4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQHJlZntCRkQgcmVsb2NhdGlvbiBoYW5kbGluZ30uCi0KLUJGRCByZXByZXNlbnRzIGEgc3ltYm9sIGFzIGEgcG9pbnRlciB0byB0aGUgQHNhbXB7YXN5bWJvbH0gdHlwZS4gIEEKLXN5bWJvbCBoYXMgYSBuYW1lLCBhIHBvaW50ZXIgdG8gYSBzZWN0aW9uLCBhbiBvZmZzZXQgd2l0aGluIHRoYXQKLXNlY3Rpb24sIGFuZCBzb21lIGZsYWdzLgotCi1BcmNoaXZlIGZpbGVzIGRvIG5vdCBoYXZlIGFueSBzZWN0aW9ucyBvciBzeW1ib2xzLiAgSW5zdGVhZCwgQkZECi1yZXByZXNlbnRzIGFuIGFyY2hpdmUgZmlsZSBhcyBhIGZpbGUgd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mCi1Ac2FtcHtiZmR9cy4gIEJGRCBhbHNvIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYXJjaGl2ZSBzeW1ib2wgbWFwLCBhcyBhCi1saXN0IG9mIHN5bWJvbCBuYW1lcy4gIEJGRCBwcm92aWRlcyBhIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgQHNhbXB7YmZkfQotd2l0aGluIHRoZSBhcmNoaXZlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBlbnRyeSBpbiB0aGUKLWFyY2hpdmUgc3ltYm9sIG1hcC4KLQotQG5vZGUgQkZEIGJsaW5kbmVzcwotQHN1YnNlY3Rpb24gQkZEIGxvc2VzIGluZm9ybWF0aW9uCi0KLU1vc3Qgb2JqZWN0IGZpbGUgZm9ybWF0cyBoYXZlIGluZm9ybWF0aW9uIHdoaWNoIEJGRCBjYW4gbm90IHJlcHJlc2VudCBpbgotaXRzIGdlbmVyaWMgZm9ybSwgYXQgbGVhc3QgYXMgY3VycmVudGx5IGRlZmluZWQuCi0KLVRoZXJlIGlzIG9mdGVuIGV4cGxpY2l0IGluZm9ybWF0aW9uIHdoaWNoIEJGRCBjYW4gbm90IHJlcHJlc2VudC4gIEZvcgotZXhhbXBsZSwgdGhlIENPRkYgdmVyc2lvbiBzdGFtcCwgb3IgdGhlIEVMRiBwcm9ncmFtIHNlZ21lbnRzLiAgQkZECi1wcm92aWRlcyBzcGVjaWFsIGhvb2tzIHRvIGhhbmRsZSB0aGlzIGluZm9ybWF0aW9uIHdoZW4gY29weWluZywKLXByaW50aW5nLCBvciBsaW5raW5nIGFuIG9iamVjdCBmaWxlLiAgVGhlIEJGRCBzdXBwb3J0IGZvciBhIHBhcnRpY3VsYXIKLW9iamVjdCBmaWxlIGZvcm1hdCB3aWxsIG5vcm1hbGx5IHN0b3JlIHRoaXMgaW5mb3JtYXRpb24gaW4gcHJpdmF0ZSBkYXRhCi1hbmQgaGFuZGxlIGl0IHVzaW5nIHRoZSBzcGVjaWFsIGhvb2tzLgotCi1JbiBzb21lIGNhc2VzIHRoZXJlIGlzIGFsc28gaW1wbGljaXQgaW5mb3JtYXRpb24gd2hpY2ggQkZEIGNhbiBub3QKLXJlcHJlc2VudC4gIEZvciBleGFtcGxlLCB0aGUgTUlQUyBwcm9jZXNzb3IgZGlzdGluZ3Vpc2hlcyBzbWFsbCBhbmQKLWxhcmdlIHN5bWJvbHMsIGFuZCByZXF1aXJlcyB0aGF0IGFsbCBzbWFsbCBzeW1ibHMgYmUgd2l0aGluIDMySyBvZiB0aGUKLUdQIHJlZ2lzdGVyLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBNSVBTIGFzc2VtYmxlciBtdXN0IGJlIGFibGUgdG8gbWFyawotdmFyaWFibGVzIGFzIGVpdGhlciBzbWFsbCBvciBsYXJnZSwgYW5kIHRoZSBNSVBTIGxpbmtlciBtdXN0IGtub3cgdG8gcHV0Ci1zbWFsbCBzeW1ib2xzIHdpdGhpbiByYW5nZSBvZiB0aGUgR1AgcmVnaXN0ZXIuICBTaW5jZSBCRkQgY2FuIG5vdAotcmVwcmVzZW50IHRoaXMgaW5mb3JtYXRpb24sIHRoaXMgbWVhbnMgdGhhdCB0aGUgYXNzZW1ibGVyIGFuZCBsaW5rZXIKLW11c3QgaGF2ZSBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBvYmplY3QgZmlsZQotZm9ybWF0IHdoaWNoIGlzIG91dHNpZGUgb2YgdGhlIEJGRCBsaWJyYXJ5LgotCi1UaGlzIGxvc3Mgb2YgaW5mb3JtYXRpb24gaW5kaWNhdGVzIGFyZWFzIHdoZXJlIHRoZSBCRkQgcGFyYWRpZ20gYnJlYWtzCi1kb3duLiAgSXQgaXMgbm90IGFjdHVhbGx5IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgbXlyaWFkIGRpZmZlcmVuY2VzCi1hbW9uZyBvYmplY3QgZmlsZSBmb3JtYXRzIHVzaW5nIGEgc2luZ2xlIGdlbmVyaWMgaW50ZXJmYWNlLCBhdCBsZWFzdCBub3QKLWluIHRoZSBtYW5uZXIgd2hpY2ggQkZEIGRvZXMgaXQgdG9kYXkuCi0KLU5ldmVydGhlbGVzcywgdGhlIEJGRCBsaWJyYXJ5IGRvZXMgZ3JlYXRseSBzaW1wbGlmeSB0aGUgdGFzayBvZiBkZWFsaW5nCi13aXRoIG9iamVjdCBmaWxlcywgYW5kIHBhcnRpY3VsYXIgcHJvYmxlbXMgY2F1c2VkIGJ5IGluZm9ybWF0aW9uIGxvc3MKLWNhbiBub3JtYWxseSBiZSBzb2x2ZWQgdXNpbmcgc29tZSBzb3J0IG9mIHJlbGF0aXZlbHkgY29uc3RyYWluZWQgaG9vawotaW50byB0aGUgbGlicmFyeS4KLQotCi0KLUBub2RlIEJGRCBndWlkZWxpbmVzCi1Ac2VjdGlvbiBCRkQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lcwotQGNpbmRleCBiZmQgcHJvZ3JhbW1pbmcgZ3VpZGVsaW5lcwotQGNpbmRleCBwcm9ncmFtbWluZyBndWlkZWxpbmVzIGZvciBiZmQKLUBjaW5kZXggZ3VpZGVsaW5lcywgYmZkIHByb2dyYW1taW5nCi0KLVRoZXJlIGlzIGEgbG90IG9mIHBvb3JseSB3cml0dGVuIGFuZCBjb25mdXNpbmcgY29kZSBpbiBCRkQuICBOZXcgQkZECi1jb2RlIHNob3VsZCBiZSB3cml0dGVuIHRvIGEgaGlnaGVyIHN0YW5kYXJkLiAgTWVyZWx5IGJlY2F1c2Ugc29tZSBCRkQKLWNvZGUgaXMgd3JpdHRlbiBpbiBhIHBhcnRpY3VsYXIgbWFubmVyIGRvZXMgbm90IG1lYW4gdGhhdCB5b3Ugc2hvdWxkCi1lbXVsYXRlIGl0LgotCi1IZXJlIGFyZSBzb21lIGdlbmVyYWwgQkZEIHByb2dyYW1taW5nIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Gb2xsb3cgdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1AaXRlbQotQXZvaWQgZ2xvYmFsIHZhcmlhYmxlcy4gIFdlIGlkZWFsbHkgd2FudCBCRkQgdG8gYmUgZnVsbHkgcmVlbnRyYW50LCBzbwotdGhhdCBpdCBjYW4gYmUgdXNlZCBpbiBtdWx0aXBsZSB0aHJlYWRzLiAgQWxsIHVzZXMgb2YgZ2xvYmFsIG9yIHN0YXRpYwotdmFyaWFibGVzIGludGVyZmVyZSB3aXRoIHRoYXQuICBJbml0aWFsaXplZCBjb25zdGFudCB2YXJpYWJsZXMgYXJlIE9LLAotYW5kIHRoZXkgc2hvdWxkIGJlIGV4cGxpY2l0bHkgbWFya2VkIHdpdGggY29uc3QuICBJbnN0ZWFkIG9mIGdsb2JhbAotdmFyaWFibGVzLCB1c2UgZGF0YSBhdHRhY2hlZCB0byBhIEJGRCBvciB0byBhIGxpbmtlciBoYXNoIHRhYmxlLgotCi1AaXRlbQotQWxsIGV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbnMgc2hvdWxkIGhhdmUgbmFtZXMgd2hpY2ggc3RhcnQgd2l0aAotQHNhbXB7YmZkX30uICBBbGwgc3VjaCBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIHNvbWUgaGVhZGVyIGZpbGUsCi10eXBpY2FsbHkgQGZpbGV7YmZkLmh9LiAgU2VlLCBmb3IgZXhhbXBsZSwgdGhlIHZhcmlvdXMgZGVjbGFyYXRpb25zIG5lYXIKLXRoZSBlbmQgb2YgQGZpbGV7YmZkLWluLmh9LCB3aGljaCBtb3N0bHkgZGVjbGFyZSBmdW5jdGlvbnMgcmVxdWlyZWQgYnkKLXNwZWNpZmljIGxpbmtlciBlbXVsYXRpb25zLgotCi1AaXRlbQotQWxsIGZ1bmN0aW9ucyB3aGljaCBuZWVkIHRvIGJlIHZpc2libGUgZnJvbSBvbmUgZmlsZSB0byBhbm90aGVyIHdpdGhpbgotQkZELCBidXQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIG91dHNpZGUgb2YgQkZELCBzaG91bGQgc3RhcnQgd2l0aAotQHNhbXB7X2JmZF99LiAgQWx0aG91Z2ggZXh0ZXJuYWwgbmFtZXMgYmVnaW5uaW5nIHdpdGggQHNhbXB7X30gYXJlCi1wcm9oaWJpdGVkIGJ5IHRoZSBBTlNJIHN0YW5kYXJkLCBpbiBwcmFjdGljZSB0aGlzIHVzYWdlIHdpbGwgYWx3YXlzCi13b3JrLCBhbmQgaXQgaXMgcmVxdWlyZWQgYnkgdGhlIEdOVSBjb2Rpbmcgc3RhbmRhcmRzLgotCi1AaXRlbQotQWx3YXlzIHJlbWVtYmVyIHRoYXQgcGVvcGxlIGNhbiBjb21waWxlIHVzaW5nIEBzYW1wey0tZW5hYmxlLXRhcmdldHN9IHRvCi1idWlsZCBzZXZlcmFsLCBvciBhbGwsIHRhcmdldHMgYXQgb25jZS4gIEl0IG11c3QgYmUgcG9zc2libGUgdG8gbGluawotdG9nZXRoZXIgdGhlIGZpbGVzIGZvciBhbGwgdGFyZ2V0cy4KLQotQGl0ZW0KLUJGRCBjb2RlIHNob3VsZCBjb21waWxlIHdpdGggZmV3IG9yIG5vIHdhcm5pbmdzIHVzaW5nIEBzYW1we2djYyAtV2FsbH0uCi1Tb21lIHdhcm5pbmdzIGFyZSBPSywgbGlrZSB0aGUgYWJzZW5jZSBvZiBjZXJ0YWluIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucwotd2hpY2ggbWF5IG9yIG1heSBub3QgYmUgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gIFdhcm5pbmdzIGFib3V0Ci1hbWJpZ3VvdXMgZXhwcmVzc2lvbnMgYW5kIHRoZSBsaWtlIHNob3VsZCBhbHdheXMgYmUgZml4ZWQuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3IKLUBzZWN0aW9uIEJGRCB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IGJmZCB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IHRhcmdldCB2ZWN0b3IgaW4gYmZkCi0KLUJGRCBzdXBwb3J0cyBtdWx0aXBsZSBvYmplY3QgZmlsZSBmb3JtYXRzIGJ5IHVzaW5nIHRoZSBAZGZue3RhcmdldAotdmVjdG9yfS4gIFRoaXMgaXMgc2ltcGx5IGEgc2V0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGltcGxlbWVudAotYmVoYXZpb3VyIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIG9iamVjdCBmaWxlIGZvcm1hdC4KLQotSW4gdGhpcyBzZWN0aW9uIEkgbGlzdCBhbGwgb2YgdGhlIGVudHJpZXMgaW4gdGhlIHRhcmdldCB2ZWN0b3IgYW5kCi1kZXNjcmliZSB3aGF0IHRoZXkgZG8uCi0KLUBtZW51Ci0qIEJGRCB0YXJnZXQgdmVjdG9yIG1pc2NlbGxhbmVvdXM6OglNaXNjZWxsYW5lb3VzIGNvbnN0YW50cwotKiBCRkQgdGFyZ2V0IHZlY3RvciBzd2FwOjoJCVN3YXBwaW5nIGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBmb3JtYXQ6OgkJRm9ybWF0IHR5cGUgZGVwZW5kZW50IGZ1bmN0aW9ucwotKiBCRkRfSlVNUF9UQUJMRSBtYWNyb3M6OgkJQkZEX0pVTVBfVEFCTEUgbWFjcm9zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGdlbmVyaWM6OgkJR2VuZXJpYyBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3IgY29weTo6CQlDb3B5IGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBjb3JlOjoJCUNvcmUgZmlsZSBzdXBwb3J0IGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciBhcmNoaXZlOjoJCUFyY2hpdmUgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIHN5bWJvbHM6OgkJU3ltYm9sIHRhYmxlIGZ1bmN0aW9ucwotKiBCRkQgdGFyZ2V0IHZlY3RvciByZWxvY3M6OgkJUmVsb2NhdGlvbiBzdXBwb3J0Ci0qIEJGRCB0YXJnZXQgdmVjdG9yIHdyaXRlOjoJCU91dHB1dCBmdW5jdGlvbnMKLSogQkZEIHRhcmdldCB2ZWN0b3IgbGluazo6CQlMaW5rZXIgZnVuY3Rpb25zCi0qIEJGRCB0YXJnZXQgdmVjdG9yIGR5bmFtaWM6OgkJRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uIGZ1bmN0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIG1pc2NlbGxhbmVvdXMKLUBzdWJzZWN0aW9uIE1pc2NlbGxhbmVvdXMgY29uc3RhbnRzCi0KLVRoZSB0YXJnZXQgdmVjdG9yIHN0YXJ0cyB3aXRoIGEgc2V0IG9mIGNvbnN0YW50cy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBuYW1lCi1UaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IHN0cmluZy4gIFRoaXMgaXMKLWhvdyB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBpbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgdG9vbHMgd2hpY2gKLXVzZSBCRkQsIHN1Y2ggYXMgdGhlIEBzYW1wey1vZm9ybWF0fSBsaW5rZXIgb3B0aW9uLgotCi1AaXRlbSBmbGF2b3VyCi1BIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUgb2YgdGFyZ2V0LiAgVGhlIGZvbGxvd2luZyBmbGF2b3VycyBhcmUKLWN1cnJlbnRseSBkZWZpbmVkOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyCi1VbmRlZmluZWQgb3IgdW5rbm93bi4KLUBpdGVtIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi1hLm91dC4KLUBpdGVtIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi1DT0ZGLgotQGl0ZW0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi1FQ09GRi4KLUBpdGVtIGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLUVMRi4KLUBpdGVtIGJmZF90YXJnZXRfaWVlZV9mbGF2b3VyCi1JRUVFLTY5NS4KLUBpdGVtIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIKLU5MTS4KLUBpdGVtIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91cgotT0FTWVMuCi1AaXRlbSBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyCi1UZWt0cm9uaXggaGV4IGZvcm1hdC4KLUBpdGVtIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyCi1Nb3Rvcm9sYSBTLXJlY29yZCBmb3JtYXQuCi1AaXRlbSBiZmRfdGFyZ2V0X2loZXhfZmxhdm91cgotSW50ZWwgaGV4IGZvcm1hdC4KLUBpdGVtIGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLVNPTSAodXNlZCBvbiBIUC9VWCkuCi1AaXRlbSBiZmRfdGFyZ2V0X29zOWtfZmxhdm91cgotb3M5MDAwLgotQGl0ZW0gYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyCi1WRVJTQWRvcy4KLUBpdGVtIGJmZF90YXJnZXRfbXNkb3NfZmxhdm91cgotTVMtRE9TLgotQGl0ZW0gYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIKLW9wZW5WTVMuCi1AZW5kIHRhYmxlCi0KLUBpdGVtIGJ5dGVvcmRlcgotVGhlIGJ5dGUgb3JkZXIgb2YgZGF0YSBpbiB0aGUgb2JqZWN0IGZpbGUuICBPbmUgb2YKLUBzYW1we0JGRF9FTkRJQU5fQklHfSwgQHNhbXB7QkZEX0VORElBTl9MSVRUTEV9LCBvcgotQHNhbXB7QkZEX0VORElBTl9VTktOT1dOfS4gIFRoZSBsYXR0ZXIgd291bGQgYmUgdXNlZCBmb3IgYSBmb3JtYXQgc3VjaAotYXMgUy1yZWNvcmRzIHdoaWNoIGRvIG5vdCByZWNvcmQgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgZGF0YS4KLQotQGl0ZW0gaGVhZGVyX2J5dGVvcmRlcgotVGhlIGJ5dGUgb3JkZXIgb2YgaGVhZGVyIGluZm9ybWF0aW9uIGluIHRoZSBvYmplY3QgZmlsZS4gIE5vcm1hbGx5IHRoZQotc2FtZSBhcyB0aGUgQHNhbXB7Ynl0ZW9yZGVyfSBmaWVsZCwgYnV0IHRoZXJlIGFyZSBjZXJ0YWluIGNhc2VzIHdoZXJlIGl0Ci1tYXkgYmUgZGlmZmVyZW50LgotCi1AaXRlbSBvYmplY3RfZmxhZ3MKLUZsYWdzIHdoaWNoIG1heSBhcHBlYXIgaW4gdGhlIEBzYW1we2ZsYWdzfSBmaWVsZCBvZiBhIEJGRCB3aXRoIHRoaXMKLWZvcm1hdC4KLQotQGl0ZW0gc2VjdGlvbl9mbGFncwotRmxhZ3Mgd2hpY2ggbWF5IGFwcGVhciBpbiB0aGUgQHNhbXB7ZmxhZ3N9IGZpZWxkIG9mIGEgc2VjdGlvbiB3aXRoaW4gYQotQkZEIHdpdGggdGhpcyBmb3JtYXQuCi0KLUBpdGVtIHN5bWJvbF9sZWFkaW5nX2NoYXIKLUEgY2hhcmFjdGVyIHdoaWNoIHRoZSBDIGNvbXBpbGVyIG5vcm1hbGx5IHB1dHMgYmVmb3JlIGEgc3ltYm9sLiAgRm9yCi1leGFtcGxlLCBhbiBhLm91dCBjb21waWxlciB3aWxsIHR5cGljYWxseSBnZW5lcmF0ZSB0aGUgc3ltYm9sCi1Ac2FtcHtfZm9vfSBmb3IgYSBmdW5jdGlvbiBuYW1lZCBAc2FtcHtmb299IGluIHRoZSBDIHNvdXJjZSwgaW4gd2hpY2gKLWNhc2UgdGhpcyBmaWVsZCB3b3VsZCBiZSBAc2FtcHtffS4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggY2hhcmFjdGVyLCB0aGlzCi1maWVsZCB3aWxsIGJlIEBzYW1wezB9LgotCi1AaXRlbSBhcl9wYWRfY2hhcgotVGhlIHBhZGRpbmcgY2hhcmFjdGVyIHRvIHVzZSBhdCB0aGUgZW5kIG9mIGFuIGFyY2hpdmUgbmFtZS4gIE5vcm1hbGx5Ci1Ac2FtcHsvfS4KLQotQGl0ZW0gYXJfbWF4X25hbWVsZW4KLVRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNob3J0IG5hbWUgaW4gYW4gYXJjaGl2ZS4gIE5vcm1hbGx5IEBzYW1wezE0fS4KLQotQGl0ZW0gYmFja2VuZF9kYXRhCi1BIHBvaW50ZXIgdG8gY29uc3RhbnQgYmFja2VuZCBkYXRhLiAgVGhpcyBpcyB1c2VkIGJ5IGJhY2tlbmRzIHRvIHN0b3JlCi13aGF0ZXZlciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoZXkgbmVlZCB0byBkaXN0aW5ndWlzaCBzaW1pbGFyIHRhcmdldAotdmVjdG9ycyB3aGljaCB1c2UgdGhlIHNhbWUgc2V0cyBvZiBmdW5jdGlvbnMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIHN3YXAKLUBzdWJzZWN0aW9uIFN3YXBwaW5nIGZ1bmN0aW9ucwotCi1FdmVyeSB0YXJnZXQgdmVjdG9yIGhhcyBmdWN0aW9uIHBvaW50ZXJzIHVzZWQgZm9yIHN3YXBwaW5nIGluZm9ybWF0aW9uCi1pbiBhbmQgb3V0IG9mIHRoZSB0YXJnZXQgcmVwcmVzZW50YXRpb24uICBUaGVyZSBhcmUgdHdvIHNldHMgb2YKLWZ1bmN0aW9uczogb25lIGZvciBkYXRhIGluZm9ybWF0aW9uLCBhbmQgb25lIGZvciBoZWFkZXIgaW5mb3JtYXRpb24uCi1FYWNoIHNldCBoYXMgdGhyZWUgc2l6ZXM6IDY0LWJpdCwgMzItYml0LCBhbmQgMTYtYml0LiAgRWFjaCBzaXplIGhhcwotdGhyZWUgYWN0dWFsIGZ1bmN0aW9uczogcHV0LCBnZXQgdW5zaWduZWQsIGFuZCBnZXQgc2lnbmVkLgotCi1UaGVzZSAxOCBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gY29udmVydCBkYXRhIGJldHdlZW4gdGhlIGhvc3QgYW5kIHRhcmdldAotcmVwcmVzZW50YXRpb25zLgotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBmb3JtYXQKLUBzdWJzZWN0aW9uIEZvcm1hdCB0eXBlIGRlcGVuZGVudCBmdW5jdGlvbnMKLQotRXZlcnkgdGFyZ2V0IHZlY3RvciBoYXMgdGhyZWUgYXJyYXlzIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGFyZQotaW5kZXhlZCBieSB0aGUgQkZEIGZvcm1hdCB0eXBlLiAgVGhlIEJGRCBmb3JtYXQgdHlwZXMgYXJlIGFzIGZvbGxvd3M6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmZkX3Vua25vd24KLVVua25vd24gZm9ybWF0LiAgTm90IHVzZWQgZm9yIGFueXRoaW5nIHVzZWZ1bC4KLUBpdGVtIGJmZF9vYmplY3QKLU9iamVjdCBmaWxlLgotQGl0ZW0gYmZkX2FyY2hpdmUKLUFyY2hpdmUgZmlsZS4KLUBpdGVtIGJmZF9jb3JlCi1Db3JlIGZpbGUuCi1AZW5kIHRhYmxlCi0KLVRoZSB0aHJlZSBhcnJheXMgb2YgZnVuY3Rpb24gcG9pbnRlcnMgYXJlIGFzIGZvbGxvd3M6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmZkX2NoZWNrX2Zvcm1hdAotQ2hlY2sgd2hldGhlciB0aGUgQkZEIGlzIG9mIGEgcGFydGljdWxhciBmb3JtYXQgKG9iamVjdCBmaWxlLCBhcmNoaXZlCi1maWxlLCBvciBjb3JlIGZpbGUpIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0YXJnZXQgdmVjdG9yLiAgVGhpcyBpcyBjYWxsZWQKLWJ5IHRoZSBAc2FtcHtiZmRfY2hlY2tfZm9ybWF0fSBmdW5jdGlvbiB3aGVuIGV4YW1pbmluZyBhbiBleGlzdGluZyBCRkQuCi1JZiB0aGUgQkZEIG1hdGNoZXMgdGhlIGRlc2lyZWQgZm9ybWF0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgaW5pdGlhbGl6ZSBhbnkKLWZvcm1hdCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBAc2FtcHt0ZGF0YX0gZmllbGQgb2YgdGhlIEJGRC4KLVRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBCRkQgdGFyZ2V0IHZlY3RvciBmdW5jdGlvbgotb24gYSBmaWxlIG9wZW5lZCBmb3IgcmVhZGluZy4KLQotQGl0ZW0gYmZkX3NldF9mb3JtYXQKLVNldCB0aGUgZm9ybWF0IG9mIGEgQkZEIHdoaWNoIHdhcyBjcmVhdGVkIGZvciBvdXRwdXQuICBUaGlzIGlzIGNhbGxlZCBieQotdGhlIEBzYW1we2JmZF9zZXRfZm9ybWF0fSBmdW5jdGlvbiBhZnRlciBjcmVhdGluZyB0aGUgQkZEIHdpdGggYQotZnVuY3Rpb24gc3VjaCBhcyBAc2FtcHtiZmRfb3Blbnd9LiAgVGhpcyBmdW5jdGlvbiB3aWxsIGluaXRpYWxpemUgZm9ybWF0Ci1zcGVjaWZpYyBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byB3cml0ZSBvdXQgYW4gb2JqZWN0IGZpbGUgb3Igd2hhdGV2ZXIgb2YKLXRoZSBnaXZlbiBmb3JtYXQuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgQkZECi10YXJnZXQgdmVjdG9yIGZ1bmN0aW9uIG9uIGEgZmlsZSBvcGVuZWQgZm9yIHdyaXRpbmcuCi0KLUBpdGVtIGJmZF93cml0ZV9jb250ZW50cwotV3JpdGUgb3V0IHRoZSBjb250ZW50cyBvZiB0aGUgQkZEIGluIHRoZSBnaXZlbiBmb3JtYXQuICBUaGlzIGlzIGNhbGxlZAotYnkgQHNhbXB7YmZkX2Nsb3NlfSBmdW5jdGlvbiBmb3IgYSBCRkQgb3BlbmVkIGZvciB3cml0aW5nLiAgVGhpcyByZWFsbHkKLXNob3VsZCBub3QgYmUgYW4gYXJyYXkgc2VsZWN0ZWQgYnkgZm9ybWF0IHR5cGUsIGFzIHRoZQotQHNhbXB7YmZkX3NldF9mb3JtYXR9IGZ1bmN0aW9uIHByb3ZpZGVzIGFsbCB0aGUgcmVxdWlyZWQgaW5mb3JtYXRpb24uCi1JbiBmYWN0LCBCRkQgd2lsbCBmYWlsIGlmIGEgZGlmZmVyZW50IGZvcm1hdCBpcyB1c2VkIHdoZW4gY2FsbGluZwotdGhyb3VnaCB0aGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGFuZCB0aGUgQHNhbXB7YmZkX3dyaXRlX2NvbnRlbnRzfQotYXJyYXlzOyBmb3J0dW5hdGVseSwgc2luY2UgQHNhbXB7YmZkX2Nsb3NlfSBnZXRzIGl0IHJpZ2h0LCB0aGlzIGlzIGEKLWRpZmZpY3VsdCBlcnJvciB0byBtYWtlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkRfSlVNUF9UQUJMRSBtYWNyb3MKLUBzdWJzZWN0aW9uIEBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNyb3MKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEV9Ci0KLU1vc3QgdGFyZ2V0IHZlY3RvcnMgYXJlIGRlZmluZWQgdXNpbmcgQHNhbXB7QkZEX0pVTVBfVEFCTEV9IG1hY3Jvcy4KLVRoZXNlIG1hY3JvcyB0YWtlIGEgc2luZ2xlIGFyZ3VtZW50LCB3aGljaCBpcyBhIHByZWZpeCBhcHBsaWVkIHRvIGEgc2V0Ci1vZiBmdW5jdGlvbnMuICBUaGUgbWFjcm9zIGFyZSB0aGVuIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIGluIHRoZQotdGFyZ2V0IHZlY3Rvci4KLQotRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1N9IG1hY3JvIGRlZmluZXMgdGhyZWUKLWZ1bmN0aW9uczogQHNhbXB7X2dldF9yZWxvY191cHBlcl9ib3VuZH0sIEBzYW1we19jYW5vbmljYWxpemVfcmVsb2N9LAotYW5kIEBzYW1we19iZmRfcmVsb2NfdHlwZV9sb29rdXB9LiAgQSByZWZlcmVuY2UgbGlrZQotQHNhbXB7QkZEX0pVTVBfVEFCTEVfUkVMT0NTIChmb28pfSB3aWxsIGV4cGFuZCBpbnRvIHRocmVlIGZ1bmN0aW9ucwotcHJlZml4ZWQgd2l0aCBAc2FtcHtmb299OiBAc2FtcHtmb29fZ2V0X3JlbG9jX3VwcGVyX2ZvdW5kfSwgZXRjLiAgVGhlCi1Ac2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1N9IG1hY3JvIHdpbGwgYmUgcGxhY2VkIHN1Y2ggdGhhdCB0aG9zZSB0aHJlZQotZnVuY3Rpb25zIGluaXRpYWxpemUgdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBpbiB0aGUgQkZEIHRhcmdldCB2ZWN0b3IuCi0KLVRoaXMgaXMgZG9uZSBiZWNhdXNlIGl0IHR1cm5zIG91dCB0aGF0IG1hbnkgZGlmZmVyZW50IHRhcmdldCB2ZWN0b3JzIGNhbgotc2hhcmUgY2VydGFpbiBjbGFzc2VzIG9mIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBhcmNoaXZlcyBhcmUgc2ltaWxhcgotb24gbW9zdCBwbGF0Zm9ybXMsIHNvIG1vc3QgdGFyZ2V0IHZlY3RvcnMgY2FuIHVzZSB0aGUgc2FtZSBhcmNoaXZlCi1mdW5jdGlvbnMuICBUaG9zZSB0YXJnZXQgdmVjdG9ycyBhbGwgdXNlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0FSQ0hJVkV9Ci13aXRoIHRoZSBzYW1lIGFyZ3VtZW50LCBjYWxsaW5nIGEgc2V0IG9mIGZ1bmN0aW9ucyB3aGljaCBpcyBkZWZpbmVkIGluCi1AZmlsZXthcmNoaXZlLmN9LgotCi1FYWNoIG9mIHRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRX0gbWFjcm9zIGlzIG1lbnRpb25lZCBiZWxvdyBhbG9uZyB3aXRoCi10aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHdoaWNoIGl0IGRlZmluZXMuICBUaGUgZnVuY3Rpb24KLXBvaW50ZXJzIHdpbGwgYmUgZGVzY3JpYmVkIHVzaW5nIHRoZSBuYW1lIHdpdGhvdXQgdGhlIHByZWZpeCB3aGljaCB0aGUKLUBzYW1we0JGRF9KVU1QX1RBQkxFfSBtYWNybyBkZWZpbmVzLiAgVGhpcyBuYW1lIGlzIG5vcm1hbGx5IHRoZSBzYW1lIGFzCi10aGUgbmFtZSBvZiB0aGUgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3Igc3RydWN0dXJlLiAgQW55IGRpZmZlcmVuY2VzCi13aWxsIGJlIG5vdGVkLgotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBnZW5lcmljCi1Ac3Vic2VjdGlvbiBHZW5lcmljIGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9HRU5FUklDfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfR0VORVJJQ30gbWFjcm8gaXMgdXNlZCBmb3Igc29tZSBjYXRjaCBhbGwKLWZ1bmN0aW9ucyB3aGljaCBkb24ndCBlYXNpbHkgZml0IGludG8gb3RoZXIgY2F0ZWdvcmllcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBfY2xvc2VfYW5kX2NsZWFudXAKLUZyZWUgYW55IHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEJGRC4gIFRoaXMgaXMKLWNhbGxlZCB3aGVuIGFueSBCRkQgaXMgY2xvc2VkICh0aGUgQHNhbXB7YmZkX3dyaXRlX2NvbnRlbnRzfSBmdW5jdGlvbgotbWVudGlvbmVkIGVhcmxpZXIgaXMgb25seSBjYWxsZWQgZm9yIGEgQkZEIG9wZW5lZCBmb3Igd3JpdGluZykuICBNb3N0Ci10YXJnZXRzIHVzZSBAc2FtcHtiZmRfYWxsb2N9IHRvIGFsbG9jYXRlIGFsbCB0YXJnZXQgc3BlY2lmaWMKLWluZm9ybWF0aW9uLCBhbmQgdGhlcmVmb3JlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLVRoaXMgZnVuY3Rpb24gcG9pbnRlciBpcyB0eXBpY2FsbHkgc2V0IHRvCi1Ac2FtcHtfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXB9LCB3aGljaCBzaW1wbHkgcmV0dXJucyB0cnVlLgotCi1AaXRlbSBfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLUZyZWUgYW55IGNhY2hlZCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEJGRCB3aGljaCBjYW4gYmUKLXJlY3JlYXRlZCBsYXRlciBpZiBuZWNlc3NhcnkuICBUaGlzIGlzIHVzZWQgdG8gcmVkdWNlIHRoZSBtZW1vcnkKLWNvbnN1bXB0aW9uIHJlcXVpcmVkIGJ5IHByb2dyYW1zIHVzaW5nIEJGRC4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIHZpYQotdGhlIEBzYW1we2JmZF9mcmVlX2NhY2hlZF9pbmZvfSBtYWNyby4gIEl0IGlzIHVzZWQgYnkgdGhlIGRlZmF1bHQKLWFyY2hpdmUgcm91dGluZXMgd2hlbiBjb21wdXRpbmcgdGhlIGFyY2hpdmUgbWFwLiAgTW9zdCB0YXJnZXRzIGRvIG5vdAotZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhpcyBlbnRyeSBwb2ludCwgYW5kIGp1c3Qgc2V0IGl0IHRvCi1Ac2FtcHtfYmZkX2dlbmVyaWNfZnJlZV9jYWNoZWRfaW5mb30sIHdoaWNoIHNpbXBseSByZXR1cm5zIHRydWUuCi0KLUBpdGVtIF9uZXdfc2VjdGlvbl9ob29rCi1UaGlzIGlzIGNhbGxlZCBmcm9tIEBzYW1we2JmZF9tYWtlX3NlY3Rpb25fYW55d2F5fSB3aGVuZXZlciBhIG5ldwotc2VjdGlvbiBpcyBjcmVhdGVkLiAgTW9zdCB0YXJnZXRzIHVzZSBpdCB0byBpbml0aWFsaXplIHNlY3Rpb24gc3BlY2lmaWMKLWluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hldGhlciBvciBub3QgdGhlIHNlY3Rpb24KLWNvcnJlc3BvbmRzIHRvIGFuIGFjdHVhbCBzZWN0aW9uIGluIGFuIGFjdHVhbCBCRkQuCi0KLUBpdGVtIF9nZXRfc2VjdGlvbl9jb250ZW50cwotR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBmcm9tCi1Ac2FtcHtiZmRfZ2V0X3NlY3Rpb25fY29udGVudHN9LiAgTW9zdCB0YXJnZXRzIHNldCB0aGlzIHRvCi1Ac2FtcHtfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHN9LCB3aGljaCBkb2VzIGEgQHNhbXB7YmZkX3NlZWt9Ci1iYXNlZCBvbiB0aGUgc2VjdGlvbidzIEBzYW1we2ZpbGVwb3N9IGZpZWxkIGFuZCBhIEBzYW1we2JmZF9yZWFkfS4gIFRoZQotY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30uCi0KLUBpdGVtIF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLVNldCBhIEBzYW1we2JmZF93aW5kb3d9IHRvIGhvbGQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMKLWNhbGxlZCBmcm9tIEBzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3d9LiAgVGhlCi1Ac2FtcHtiZmRfd2luZG93fSBpZGVhIG5ldmVyIHJlYWxseSBjYXVnaHQgb24sIGFuZCBJIGRvbid0IHRoaW5rIHRoaXMgaXMKLWV2ZXIgY2FsbGVkLiAgUHJldHR5IG11Y2ggYWxsIHRhcmdldHMgaW1wbGVtZW50IHRoaXMgYXMKLUBzYW1we2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30sIHdoaWNoIHVzZXMKLUBzYW1we2JmZF9nZXRfc2VjdGlvbl9jb250ZW50c30gdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvd30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGNvcHkKLUBzdWJzZWN0aW9uIENvcHkgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0NPUFl9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1BZfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggYXJlCi1jYWxsZWQgd2hlbiBjb3B5aW5nIEJGRHMsIGFuZCBmb3IgYSBjb3VwbGUgb2YgZnVuY3Rpb25zIHdoaWNoIGRlYWwgd2l0aAotaW50ZXJuYWwgQkZEIGluZm9ybWF0aW9uLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhCi1UaGlzIGlzIGNhbGxlZCB3aGVuIGNvcHlpbmcgYSBCRkQsIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX2JmZF9kYXRhfS4KLUlmIHRoZSBpbnB1dCBhbmQgb3V0cHV0IEJGRHMgaGF2ZSB0aGUgc2FtZSBmb3JtYXQsIHRoaXMgd2lsbCBjb3B5IGFueQotcHJpdmF0ZSBpbmZvcm1hdGlvbiBvdmVyLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi1oYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgb3V0cHV0IGZpbGUuICBPbmx5IGEgZmV3IHRhcmdldHMgZG8gYW55dGhpbmcgaW4KLXRoaXMgZnVuY3Rpb24uCi0KLUBpdGVtIF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotVGhpcyBpcyBjYWxsZWQgd2hlbiBsaW5raW5nLCB2aWEgQHNhbXB7YmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGF9LiAgSXQKLWdpdmVzIHRoZSBiYWNrZW5kIGxpbmtlciBjb2RlIGEgY2hhbmNlIHRvIHNldCBhbnkgc3BlY2lhbCBmbGFncyBpbiB0aGUKLW91dHB1dCBmaWxlIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgZmlsZS4gIE9ubHkgYSBmZXcgdGFyZ2V0cwotZG8gYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi1UaGlzIGlzIHNpbWlsYXIgdG8gQHNhbXB7X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGF9LCBidXQgaXQgaXMgY2FsbGVkCi1mb3IgZWFjaCBzZWN0aW9uLCB2aWEgQHNhbXB7YmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGF9LiAgVGhpcwotZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBhbnkgc2VjdGlvbiBjb250ZW50cyBoYXZlIGJlZW4gd3JpdHRlbi4gIE9ubHkKLWEgZmV3IHRhcmdldHMgZG8gYW55dGhpbmcgaW4gdGhpcyBmdW5jdGlvbi4KLQotQGl0ZW0gX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLVRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhfSwgYnV0IEkgZG9uJ3QKLXRoaW5rIGFueXRoaW5nIGFjdHVhbGx5IGNhbGxzIGl0LiAgSWYgaXQgd2VyZSBkZWZpbmVkLCBpdCBjb3VsZCBiZSB1c2VkCi10byBjb3B5IHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgQkZEIHRvIGFub3RoZXIuICBIb3dldmVyLCBtb3N0IEJGRHMKLXN0b3JlIGV4dHJhIHN5bWJvbCBpbmZvcm1hdGlvbiBieSBhbGxvY2F0aW5nIHNwYWNlIHdoaWNoIGlzIGxhcmdlciB0aGFuCi10aGUgQHNhbXB7YXN5bWJvbH0gc3RydWN0dXJlIGFuZCBzdG9yaW5nIHByaXZhdGUgaW5mb3JtYXRpb24gaW4gdGhlCi1leHRyYSBzcGFjZS4gIFNpbmNlIEBzYW1we29iamNvcHl9IGFuZCBvdGhlciBwcm9ncmFtcyBjb3B5IHN5bWJvbAotaW5mb3JtYXRpb24gYnkgY29weWluZyBwb2ludGVycyB0byBAc2FtcHthc3ltYm9sfSBzdHJ1Y3R1cmVzLCB0aGUKLXByaXZhdGUgc3ltYm9sIGluZm9ybWF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgY29waWVkIGFzIHdlbGwuICBNb3N0Ci10YXJnZXRzIGRvIG5vdCBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1UaGlzIGlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3NldF9wcml2YXRlX2ZsYWdzfS4gIEl0IGlzIGJhc2ljYWxseSBhIGhvb2sKLWZvciB0aGUgYXNzZW1ibGVyIHRvIHNldCBtYWdpYyBpbmZvcm1hdGlvbi4gIEZvciBleGFtcGxlLCB0aGUgUG93ZXJQQwotRUxGIGFzc2VtYmxlciB1c2VzIGl0IHRvIHNldCBmbGFncyB3aGljaCBhcHBlYXIgaW4gdGhlIGVfZmxhZ3MgZmllbGQgb2YKLXRoZSBFTEYgaGVhZGVyLiAgTW9zdCB0YXJnZXRzIGRvIG5vdCBkbyBhbnl0aGluZyBpbiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLVRoaXMgaXMgY2FsbGVkIGJ5IEBzYW1we29iamR1bXB9IHdoZW4gdGhlIEBzYW1wey1wfSBvcHRpb24gaXMgdXNlZC4gIEl0Ci1pcyBjYWxsZWQgdmlhIEBzYW1we2JmZF9wcmludF9wcml2YXRlX2RhdGF9LiAgSXQgcHJpbnRzIGFueSBpbnRlcmVzdGluZwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJGRCB3aGljaCBjYW4gbm90IGJlIG90aGVyd2lzZSByZXByZXNlbnRlZCBieSBCRkQKLWFuZCB0aHVzIGNhbiBub3QgYmUgcHJpbnRlZCBieSBAc2FtcHtvYmpkdW1wfS4gIE1vc3QgdGFyZ2V0cyBkbyBub3QgZG8KLWFueXRoaW5nIGluIHRoaXMgZnVuY3Rpb24uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGNvcmUKLUBzdWJzZWN0aW9uIENvcmUgZmlsZSBzdXBwb3J0IGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9DT1JFfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQ09SRX0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggY29yZSBmaWxlcy4gIE9idmlvdXNseSwgdGhlc2UgZnVuY3Rpb25zIG9ubHkgZG8gc29tZXRoaW5nCi1pbnRlcmVzdGluZyBmb3IgdGFyZ2V0cyB3aGljaCBoYXZlIGNvcmUgZmlsZSBzdXBwb3J0LgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kCi1HaXZlbiBhIGNvcmUgZmlsZSwgdGhpcyByZXR1cm5zIHRoZSBjb21tYW5kIHdoaWNoIHdhcyBydW4gdG8gcHJvZHVjZSB0aGUKLWNvcmUgZmlsZS4KLQotQGl0ZW0gX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAotR2l2ZW4gYSBjb3JlIGZpbGUsIHRoaXMgcmV0dXJucyB0aGUgc2lnbmFsIG51bWJlciB3aGljaCBwcm9kdWNlZCB0aGUKLWNvcmUgZmlsZS4KLQotQGl0ZW0gX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotR2l2ZW4gYSBjb3JlIGZpbGUgYW5kIGEgQkZEIGZvciBhbiBleGVjdXRhYmxlLCB0aGlzIHJldHVybnMgd2hldGhlciB0aGUKLWNvcmUgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBleGVjdXRhYmxlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBhcmNoaXZlCi1Ac3Vic2VjdGlvbiBBcmNoaXZlIGZ1bmN0aW9ucwotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfQotCi1UaGUgQHNhbXB7QkZEX0pVTVBfVEFCTEVfQVJDSElWRX0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggYXJjaGl2ZSBmaWxlcy4gIE1vc3QgdGFyZ2V0cyB1c2UgQ09GRiBzdHlsZSBhcmNoaXZlIGZpbGVzCi0oaW5jbHVkaW5nIEVMRiB0YXJnZXRzKSwgYW5kIHRoZXNlIHVzZSBAc2FtcHtfYmZkX2FyY2hpdmVfY29mZn0gYXMgdGhlCi1hcmd1bWVudCB0byBAc2FtcHtCRkRfSlVNUF9UQUJMRV9BUkNISVZFfS4gIFNvbWUgdGFyZ2V0cyB1c2UgQlNEL2Eub3V0Ci1zdHlsZSBhcmNoaXZlcywgYW5kIHRoZXNlIHVzZSBAc2FtcHtfYmZkX2FyY2hpdmVfYnNkfS4gIChUaGUgbWFpbgotZGlmZmVyZW5jZSBiZXR3ZWVuIEJTRCBhbmQgQ09GRiBhcmNoaXZlcyBpcyB0aGUgZm9ybWF0IG9mIHRoZSBhcmNoaXZlCi1zeW1ib2wgdGFibGUpLiAgVGFyZ2V0cyB3aXRoIG5vIGFyY2hpdmUgc3VwcG9ydCB1c2UKLUBzYW1we19iZmRfbm9hcmNoaXZlfS4gIEZpbmFsbHksIGEgZmV3IHRhcmdldHMgaGF2ZSB1bnVzdWFsIGFyY2hpdmUKLWhhbmRsaW5nLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9zbHVycF9hcm1hcAotUmVhZCBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUsIHN0b3JpbmcgaXQgaW4gcHJpdmF0ZSBCRkQgZGF0YS4gIFRoaXMKLWlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZSBhcmNoaXZlIEBzYW1we2NoZWNrX2Zvcm1hdH0gcm91dGluZS4gIFRoZQotY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9zbHVycF9hcm1hcH0uCi0KLUBpdGVtIF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi1SZWFkIGluIHRoZSBleHRlbmRlZCBuYW1lIHRhYmxlIGZyb20gdGhlIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSwKLXN0b3JpbmcgaXQgaW4gcHJpdmF0ZSBCRkQgZGF0YS4gIFRoaXMgaXMgbm9ybWFsbHkgY2FsbGVkIGZyb20gdGhlCi1hcmNoaXZlIEBzYW1we2NoZWNrX2Zvcm1hdH0gcm91dGluZS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGV9LgotCi1AaXRlbSBjb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotQnVpbGQgYW5kIHJldHVybiBhbiBleHRlbmRlZCBuYW1lIHRhYmxlIGlmIG9uZSBpcyBuZWVkZWQgdG8gd3JpdGUgb3V0Ci10aGUgYXJjaGl2ZS4gIFRoaXMgYWxzbyBhZGp1c3RzIHRoZSBhcmNoaXZlIGhlYWRlcnMgdG8gcmVmZXIgdG8gdGhlCi1leHRlbmRlZCBuYW1lIHRhYmxlIGFwcHJvcHJpYXRlbHkuICBUaGlzIGlzIG5vcm1hbGx5IGNhbGxlZCBmcm9tIHRoZQotYXJjaGl2ZSBAc2FtcHt3cml0ZV9jb250ZW50c30gcm91dGluZS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlfS4KLQotQGl0ZW0gX3RydW5jYXRlX2FybmFtZQotVGhpcyBjb3BpZXMgYSBmaWxlIG5hbWUgaW50byBhbiBhcmNoaXZlIGhlYWRlciwgdHJ1bmNhdGluZyBpdCBhcwotcmVxdWlyZWQuICBJdCBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUgYXJjaGl2ZSBAc2FtcHt3cml0ZV9jb250ZW50c30KLXJvdXRpbmUuICBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgaW50ZXJlc3RpbmcgaW4gdGFyZ2V0cyB3aGljaCBkbyBub3QKLXN1cHBvcnQgZXh0ZW5kZWQgbmFtZSB0YWJsZXMsIGJ1dCBJIHRoaW5rIHRoZSBHTlUgQHNhbXB7YXJ9IHByb2dyYW0KLWFsd2F5cyB1c2VzIGV4dGVuZGVkIG5hbWUgdGFibGVzIGFueWhvdy4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX3RydW5jYXRlX2FybmFtZX0uCi0KLUBpdGVtIF93cml0ZV9hcm1hcAotV3JpdGUgb3V0IHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSB1c2luZyBjYWxscyB0byBAc2FtcHtiZmRfd3JpdGV9LgotVGhpcyBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUgYXJjaGl2ZSBAc2FtcHt3cml0ZV9jb250ZW50c30gcm91dGluZS4KLVRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we3dyaXRlX2FybWFwfQotKG5vIGxlYWRpbmcgdW5kZXJzY29yZSkuCi0KLUBpdGVtIF9yZWFkX2FyX2hkcgotUmVhZCBhbmQgcGFyc2UgYW4gYXJjaGl2ZSBoZWFkZXIuICBUaGlzIGhhbmRsZXMgZXhwYW5kaW5nIHRoZSBhcmNoaXZlCi1oZWFkZXIgbmFtZSBpbnRvIHRoZSByZWFsIGZpbGUgbmFtZSB1c2luZyB0aGUgZXh0ZW5kZWQgbmFtZSB0YWJsZS4gIFRoaXMKLWlzIGNhbGxlZCBieSByb3V0aW5lcyB3aGljaCByZWFkIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBvciB0aGUgYXJjaGl2ZQotaXRzZWxmLiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldCB2ZWN0b3IgaXMgbmFtZWQKLUBzYW1we19iZmRfcmVhZF9hcl9oZHJfZm59LgotCi1AaXRlbSBfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi1HaXZlbiBhbiBhcmNoaXZlIGFuZCBhIEJGRCByZXByZXNlbnRpbmcgYSBmaWxlIHN0b3JlZCB3aXRoaW4gdGhlCi1hcmNoaXZlLCByZXR1cm4gYSBCRkQgZm9yIHRoZSBuZXh0IGZpbGUgaW4gdGhlIGFyY2hpdmUuICBUaGlzIGlzIGNhbGxlZAotdmlhIEBzYW1we2JmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGV9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZX0gKG5vIGxlYWRpbmcKLXVuZGVyc2NvcmUpLgotCi1AaXRlbSBfZ2V0X2VsdF9hdF9pbmRleAotR2l2ZW4gYW4gYXJjaGl2ZSBhbmQgYW4gaW5kZXgsIHJldHVybiBhIEJGRCBmb3IgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUKLWNvcnJlc3BvbmRpbmcgdG8gdGhhdCBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGNhbGxlZAotdmlhIEBzYW1we2JmZF9nZXRfZWx0X2F0X2luZGV4fS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9lbHRfYXRfaW5kZXh9LgotCi1AaXRlbSBfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci1EbyBhIHN0YXQgb24gYW4gZWxlbWVudCBvZiBhbiBhcmNoaXZlLCByZXR1cm5pbmcgaW5mb3JtYXRpb24gcmVhZCBmcm9tCi10aGUgYXJjaGl2ZSBoZWFkZXIgKG1vZGlmaWNhdGlvbiB0aW1lLCB1aWQsIGdpZCwgZmlsZSBtb2RlLCBzaXplKS4gIFRoaXMKLWlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX3N0YXRfYXJjaF9lbHR9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc3RhdF9hcmNoX2VsdH0uCi0KLUBpdGVtIF91cGRhdGVfYXJtYXBfdGltZXN0YW1wCi1BZnRlciB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0LCB1cGRhdGUKLXRoZSB0aW1lc3RhbXAgb2YgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIHRvIGJlIG5ld2VyIHRoYW4gdGhhdCBvZiB0aGUKLWZpbGUuICBUaGlzIGlzIHJlcXVpcmVkIGZvciBhLm91dCBzdHlsZSBhcmNoaXZlcy4gIFRoaXMgaXMgbm9ybWFsbHkKLWNhbGxlZCBieSB0aGUgYXJjaGl2ZSBAc2FtcHt3cml0ZV9jb250ZW50c30gcm91dGluZS4gIFRoZSBjb3JyZXNwb25kaW5nCi1maWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXB9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBzeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgdGFibGUgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX1NZTUJPTFN9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9TWU1CT0xTfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVhbAotd2l0aCBzeW1ib2xzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi1SZXR1cm4gYSBzZW5zaWJsZSB1cHBlciBib3VuZCBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSB3aGljaCB3aWxsIGJlCi1yZXF1aXJlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICBJbiBwcmFjdGljZSBtb3N0IHRhcmdldHMgcmV0dXJuIHRoZQotYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIEBzYW1we2FzeW1ib2x9IHBvaW50ZXJzIGZvciBhbGwgdGhlCi1zeW1ib2xzIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kIHN0b3JlIHRoZSBhY3R1YWwgc3ltYm9sCi1pbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZH0uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUKLXRhcmdldCB2ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kfS4KLQotQGl0ZW0gX2dldF9zeW10YWIKLVJlYWQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX3N5bXRhYn0uCi0KLUBpdGVtIF9tYWtlX2VtcHR5X3N5bWJvbAotQ3JlYXRlIGFuIGVtcHR5IHN5bWJvbCBmb3IgdGhlIEJGRC4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgbW9zdCB0YXJnZXRzCi1zdG9yZSBleHRyYSBpbmZvcm1hdGlvbiB3aXRoIGVhY2ggc3ltYm9sIGJ5IGFsbG9jYXRpbmcgYSBzdHJ1Y3R1cmUKLWxhcmdlciB0aGFuIGFuIEBzYW1we2FzeW1ib2x9IGFuZCBzdG9yaW5nIHRoZSBleHRyYSBpbmZvcm1hdGlvbiBhdCB0aGUKLWVuZC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSB0aGUgcmlnaHQgYW1vdW50IG9mIG1lbW9yeSwgYW5kIHJldHVybgotd2hhdCBsb29rcyBsaWtlIGEgcG9pbnRlciB0byBhbiBlbXB0eSBAc2FtcHthc3ltYm9sfS4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX21ha2VfZW1wdHlfc3ltYm9sfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX21ha2VfZW1wdHlfc3ltYm9sfS4KLQotQGl0ZW0gX3ByaW50X3N5bWJvbAotUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX3ByaW50X3N5bWJvbH0uICBPbmUgb2YgdGhlIGFyZ3VtZW50cyBpbmRpY2F0ZXMgd2hhdCBzb3J0IG9mCi1pbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnRlZDoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBiZmRfcHJpbnRfc3ltYm9sX25hbWUKLUp1c3QgcHJpbnQgdGhlIHN5bWJvbCBuYW1lLgotQGl0ZW0gYmZkX3ByaW50X3N5bWJvbF9tb3JlCi1QcmludCB0aGUgc3ltYm9sIG5hbWUgYW5kIHNvbWUgaW50ZXJlc3RpbmcgZmxhZ3MuICBJIGRvbid0IHRoaW5rCi1hbnl0aGluZyBhY3R1YWxseSB1c2VzIHRoaXMuCi1AaXRlbSBiZmRfcHJpbnRfc3ltYm9sX2FsbAotUHJpbnQgYWxsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeW1ib2wuICBUaGlzIGlzIHVzZWQgYnkgQHNhbXB7b2JqZHVtcH0KLXdoZW4gcnVuIHdpdGggdGhlIEBzYW1wey10fSBvcHRpb24uCi1AZW5kIHRhYmxlCi1UaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZAotQHNhbXB7X2JmZF9wcmludF9zeW1ib2x9LgotCi1AaXRlbSBfZ2V0X3N5bWJvbF9pbmZvCi1SZXR1cm4gYSBzdGFuZGFyZCBzZXQgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkCi12aWEgQHNhbXB7YmZkX3N5bWJvbF9pbmZvfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9zeW1ib2xfaW5mb30uCi0KLUBpdGVtIF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmluZyB3b3VsZCBub3JtYWxseSByZXByZXNlbnQgdGhlIG5hbWUgb2YgYQotbG9jYWwgbGFiZWwuICBUaGlzIGlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX2lzX2xvY2FsX2xhYmVsfSBhbmQKLUBzYW1we2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lfS4gIExvY2FsIGxhYmVscyBhcmUgbm9ybWFsbHkgZGlzY2FyZGVkIGJ5Ci10aGUgYXNzZW1ibGVyLiAgSW4gdGhlIGxpbmtlciwgdGhpcyBkZWZpbmVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi1Ac2FtcHsteH0gYW5kIEBzYW1wey1YfSBvcHRpb25zLgotCi1AaXRlbSBfZ2V0X2xpbmVubwotUmV0dXJuIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsCi1mb3IgYSBDT0ZGIHRhcmdldC4gIFRoaXMgaXMgY2FsbGVkIHdoZW4gd3JpdGluZyBvdXQgQ09GRiBsaW5lIG51bWJlcnMuCi0KLUBpdGVtIF9maW5kX25lYXJlc3RfbGluZQotR2l2ZW4gYW4gYWRkcmVzcyB3aXRoaW4gYSBzZWN0aW9uLCB1c2UgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBmaW5kCi10aGUgbWF0Y2hpbmcgZmlsZSBuYW1lLCBmdW5jdGlvbiBuYW1lLCBhbmQgbGluZSBudW1iZXIsIGlmIGFueS4gIFRoaXMgaXMKLWNhbGxlZCB2aWEgQHNhbXB7YmZkX2ZpbmRfbmVhcmVzdF9saW5lfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2ZpbmRfbmVhcmVzdF9saW5lfS4KLQotQGl0ZW0gX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotTWFrZSBhIGRlYnVnZ2luZyBzeW1ib2wuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgYSBDT0ZGIHRhcmdldCwKLXdoZXJlIGl0IHNpbXBseSByZXR1cm5zIGEgc3ltYm9sIHdoaWNoIHdpbGwgYmUgcGxhY2VkIGluIHRoZQotQHNhbXB7Tl9ERUJVR30gc2VjdGlvbiB3aGVuIGl0IGlzIHdyaXR0ZW4gb3V0LiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfbWFrZV9kZWJ1Z19zeW1ib2x9LgotCi1AaXRlbSBfcmVhZF9taW5pc3ltYm9scwotTWluaXN5bWJvbHMgYXJlIHVzZWQgdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIG9mIHByb2dyYW1zIGxpa2UKLUBzYW1we25tfS4gIEEgbWluaXN5bWJvbCBpcyBhIGNvb2tpZSBwb2ludGluZyB0byBpbnRlcm5hbCBzeW1ib2wKLWluZm9ybWF0aW9uIHdoaWNoIHRoZSBjYWxsZXIgY2FuIHVzZSB0byBleHRyYWN0IGNvbXBsZXRlIHN5bWJvbAotaW5mb3JtYXRpb24uICBUaGlzIHBlcm1pdHMgQkZEIHRvIG5vdCBjb252ZXJ0IGFsbCB0aGUgc3ltYm9scyBpbnRvCi1nZW5lcmljIGZvcm0sIGJ1dCB0byBpbnN0ZWFkIGNvbnZlcnQgdGhlbSBvbmUgYXQgYSB0aW1lLiAgVGhpcyBpcyBjYWxsZWQKLXZpYSBAc2FtcHtiZmRfcmVhZF9taW5pc3ltYm9sc30uICBNb3N0IHRhcmdldHMgZG8gbm90IGltcGxlbWVudCB0aGlzLAotYW5kIGp1c3QgdXNlIGdlbmVyaWMgc3VwcG9ydCB3aGljaCBpcyBiYXNlZCBvbiB1c2luZyBzdGFuZGFyZAotQHNhbXB7YXN5bWJvbH0gc3RydWN0dXJlcy4KLQotQGl0ZW0gX21pbmlzeW1ib2xfdG9fc3ltYm9sCi1Db252ZXJ0IGEgbWluaXN5bWJvbCB0byBhIHN0YW5kYXJkIEBzYW1we2FzeW1ib2x9LiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfbWluaXN5bWJvbF90b19zeW1ib2x9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciByZWxvY3MKLUBzdWJzZWN0aW9uIFJlbG9jYXRpb24gc3VwcG9ydAotQGNpbmRleCBAc2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1N9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9SRUxPQ1N9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZWFsCi13aXRoIHJlbG9jYXRpb25zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9nZXRfcmVsb2NfdXBwZXJfYm91bmQKLVJldHVybiBhIHNlbnNpYmxlIHVwcGVyIGJvdW5kIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHdoaWNoIHdpbGwgYmUKLXJlcXVpcmVkIHRvIHJlYWQgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uICBJbiBwcmFjdGljZSBtb3N0Ci10YXJnZXRzIHJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIEBzYW1we2FyZWxlbnR9Ci1wb2ludGVycyBmb3IgYWxsIHRoZSByZWxvY2F0aW9ucyBwbHVzIGEgdHJhaWxpbmcgQHNhbXB7TlVMTH0gZW50cnksIGFuZAotc3RvcmUgdGhlIGFjdHVhbCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGluIEJGRCBwcml2YXRlIGRhdGEuICBUaGlzIGlzCi1jYWxsZWQgdmlhIEBzYW1we2JmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmR9LgotCi1AaXRlbSBfY2Fub25pY2FsaXplX3JlbG9jCi1SZXR1cm4gdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX2Nhbm9uaWNhbGl6ZV9yZWxvY30uICBUaGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiB0aGUgdGFyZ2V0Ci12ZWN0b3IgaXMgbmFtZWQgQHNhbXB7X2JmZF9jYW5vbmljYWxpemVfcmVsb2N9LgotCi1AaXRlbSBfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi1HaXZlbiBhIHJlbG9jYXRpb24gY29kZSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGhvd3RvIHN0cnVjdHVyZQotKEBweHJlZntCRkQgcmVsb2NhdGlvbiBjb2Rlc30pLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfcmVsb2NfdHlwZV9sb29rdXB9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we3JlbG9jX3R5cGVfbG9va3VwfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgQkZEIHRhcmdldCB2ZWN0b3Igd3JpdGUKLUBzdWJzZWN0aW9uIE91dHB1dCBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfV1JJVEV9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9XUklURX0gbWFjcm8gaXMgdXNlZCBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlYWwKLXdpdGggd3JpdGluZyBvdXQgYSBCRkQuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX3NldF9hcmNoX21hY2gKLVNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIG51bWJlciBmb3IgYSBCRkQuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9zZXRfYXJjaF9tYWNofS4gIE1vc3QgdGFyZ2V0cyBpbXBsZW1lbnQgdGhpcyBieSBjYWxsaW5nCi1Ac2FtcHtiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNofS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQKLXZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX3NldF9hcmNoX21hY2h9LgotCi1AaXRlbSBfc2V0X3NlY3Rpb25fY29udGVudHMKLVdyaXRlIG91dCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfc2V0X3NlY3Rpb25fY29udGVudHN9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlIHRhcmdldAotdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfc2V0X3NlY3Rpb25fY29udGVudHN9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgdGFyZ2V0IHZlY3RvciBsaW5rCi1Ac3Vic2VjdGlvbiBMaW5rZXIgZnVuY3Rpb25zCi1AY2luZGV4IEBzYW1we0JGRF9KVU1QX1RBQkxFX0xJTkt9Ci0KLVRoZSBAc2FtcHtCRkRfSlVNUF9UQUJMRV9MSU5LfSBtYWNybyBpcyB1c2VkIGZvciBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZQotbGlua2VyLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIF9zaXplb2ZfaGVhZGVycwotUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIGEgQkZELiAgVGhpcyBpcwotdXNlZCB0byBpbXBsZW1lbnQgdGhlIEBzYW1we1NJWkVPRl9IRUFERVJTfSBsaW5rZXIgc2NyaXB0IGZ1bmN0aW9uLiAgSXQKLWlzIG5vcm1hbGx5IHVzZWQgdG8gYWxpZ24gdGhlIGZpcnN0IHNlY3Rpb24gYXQgYW4gZWZmaWNpZW50IHBvc2l0aW9uIG9uCi10aGUgcGFnZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfc2l6ZW9mX2hlYWRlcnN9LiAgVGhlCi1jb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZSB0YXJnZXQgdmVjdG9yIGlzIG5hbWVkCi1Ac2FtcHtfYmZkX3NpemVvZl9oZWFkZXJzfS4KLQotQGl0ZW0gX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLVJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBhbmQgYXBwbHkgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi1UaGlzIGhhbmRsZXMgYm90aCBhIGZpbmFsIGxpbmsgYW5kIGEgcmVsb2NhdGVhYmxlIGxpbms7IGluIHRoZSBsYXR0ZXIKLWNhc2UsIGl0IGFkanVzdCB0aGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBhcyB3ZWxsLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfS4gIE1vc3QgdGFyZ2V0cyBpbXBsZW1lbnQgaXQgYnkKLWNhbGxpbmcgQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfS4KLQotQGl0ZW0gX2JmZF9yZWxheF9zZWN0aW9uCi1UcnkgdG8gdXNlIHJlbGF4YXRpb24gdG8gc2hyaW5rIHRoZSBzaXplIG9mIGEgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkCi1ieSB0aGUgbGlua2VyIHdoZW4gdGhlIEBzYW1wey1yZWxheH0gb3B0aW9uIGlzIHVzZWQuICBUaGlzIGlzIGNhbGxlZCB2aWEKLUBzYW1we2JmZF9yZWxheF9zZWN0aW9ufS4gIE1vc3QgdGFyZ2V0cyBkbyBub3Qgc3VwcG9ydCBhbnkgc29ydCBvZgotcmVsYXhhdGlvbi4KLQotQGl0ZW0gX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi1DcmVhdGUgdGhlIHN5bWJvbCBoYXNoIHRhYmxlIHRvIHVzZSBmb3IgdGhlIGxpbmtlci4gIFRoaXMgbGlua2VyIGhvb2sKLXBlcm1pdHMgdGhlIGJhY2tlbmQgdG8gY29udHJvbCB0aGUgc2l6ZSBhbmQgaW5mb3JtYXRpb24gb2YgdGhlIGVsZW1lbnRzCi1pbiB0aGUgbGlua2VyIHN5bWJvbCBoYXNoIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZX0uCi0KLUBpdGVtIF9iZmRfbGlua19hZGRfc3ltYm9scwotR2l2ZW4gYW4gb2JqZWN0IGZpbGUgb3IgYW4gYXJjaGl2ZSwgYWRkIGFsbCBzeW1ib2xzIGludG8gdGhlIGxpbmtlcgotc3ltYm9sIGhhc2ggdGFibGUuICBVc2UgY2FsbGJhY2tzIHRvIHRoZSBsaW5rZXIgdG8gaW5jbHVkZSBhcmNoaXZlCi1lbGVtZW50cyBpbiB0aGUgbGluay4gIFRoaXMgaXMgY2FsbGVkIHZpYSBAc2FtcHtiZmRfbGlua19hZGRfc3ltYm9sc30uCi0KLUBpdGVtIF9iZmRfZmluYWxfbGluawotRmluaXNoIHRoZSBsaW5raW5nIHByb2Nlc3MuICBUaGUgbGlua2VyIGNhbGxzIHRoaXMgaG9vayBhZnRlciBhbGwgb2YgdGhlCi1pbnB1dCBmaWxlcyBoYXZlIGJlZW4gcmVhZCwgd2hlbiBpdCBpcyByZWFkeSB0byBmaW5pc2ggdGhlIGxpbmsgYW5kCi1nZW5lcmF0ZSB0aGUgb3V0cHV0IGZpbGUuICBUaGlzIGlzIGNhbGxlZCB2aWEgQHNhbXB7YmZkX2ZpbmFsX2xpbmt9LgotCi1AaXRlbSBfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbgotSSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBmb3IuICBOb3RoaW5nIHNlZW1zIHRvIGNhbGwgaXQuICBUaGUgb25seQotbm9uLXRyaXZpYWwgZGVmaW5pdGlvbiBpcyBpbiBAZmlsZXtzb20uY30uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEJGRCB0YXJnZXQgdmVjdG9yIGR5bmFtaWMKLUBzdWJzZWN0aW9uIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBmdW5jdGlvbnMKLUBjaW5kZXggQHNhbXB7QkZEX0pVTVBfVEFCTEVfRFlOQU1JQ30KLQotVGhlIEBzYW1we0JGRF9KVU1QX1RBQkxFX0RZTkFNSUN9IG1hY3JvIGlzIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aGljaCByZWFkCi1keW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZAotUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQotcmVxdWlyZWQgdG8gcmVhZCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBJbiBwcmFjdGljZSBtb3N0IHRhcmdldHMKLXJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIEBzYW1we2FzeW1ib2x9IHBvaW50ZXJzIGZvcgotYWxsIHRoZSBzeW1ib2xzIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kIHN0b3JlIHRoZSBhY3R1YWwKLXN5bWJvbCBpbmZvcm1hdGlvbiBpbiBCRkQgcHJpdmF0ZSBkYXRhLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluCi10aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZH0uCi0KLUBpdGVtIF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLVJlYWQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFifS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluIHRoZQotdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYn0uCi0KLUBpdGVtIF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZAotUmV0dXJuIGEgc2Vuc2libGUgdXBwZXIgYm91bmQgb24gdGhlIGFtb3VudCBvZiBtZW1vcnkgd2hpY2ggd2lsbCBiZQotcmVxdWlyZWQgdG8gcmVhZCB0aGUgZHluYW1pYyByZWxvY2F0aW9ucy4gIEluIHByYWN0aWNlIG1vc3QgdGFyZ2V0cwotcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgQHNhbXB7YXJlbGVudH0gcG9pbnRlcnMgZm9yCi1hbGwgdGhlIHJlbG9jYXRpb25zIHBsdXMgYSB0cmFpbGluZyBAc2FtcHtOVUxMfSBlbnRyeSwgYW5kIHN0b3JlIHRoZQotYWN0dWFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gQkZEIHByaXZhdGUgZGF0YS4gIFRoaXMgaXMgY2FsbGVkIHZpYQotQHNhbXB7YmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kfS4gIFRoZSBjb3JyZXNwb25kaW5nIGZpZWxkIGluCi10aGUgdGFyZ2V0IHZlY3RvciBpcyBuYW1lZCBAc2FtcHtfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kfS4KLQotQGl0ZW0gX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi1SZWFkIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi1Ac2FtcHtiZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2N9LiAgVGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4gdGhlCi10YXJnZXQgdmVjdG9yIGlzIG5hbWVkIEBzYW1we19iZmRfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2N9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgZ2VuZXJhdGVkIGZpbGVzCi1Ac2VjdGlvbiBCRkQgZ2VuZXJhdGVkIGZpbGVzCi1AY2luZGV4IGdlbmVyYXRlZCBmaWxlcyBpbiBiZmQKLUBjaW5kZXggYmZkIGdlbmVyYXRlZCBmaWxlcwotCi1CRkQgY29udGFpbnMgc2V2ZXJhbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlcy4gIFRoaXMgc2VjdGlvbgotZGVzY3JpYmVzIHRoZW0uICBTb21lIGZpbGVzIGFyZSBjcmVhdGVkIGF0IGNvbmZpZ3VyZSB0aW1lLCB3aGVuIHlvdQotY29uZmlndXJlIEJGRC4gIFNvbWUgZmlsZXMgYXJlIGNyZWF0ZWQgYXQgbWFrZSB0aW1lLCB3aGVuIHlvdSBidWlsZAotdGltZS4gIFNvbWUgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmVidWlsdCBhdCBtYWtlIHRpbWUsIGJ1dCBvbmx5IGlmCi15b3UgY29uZmlndXJlIHdpdGggdGhlIEBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLiAgU29tZQotZmlsZXMgbGl2ZSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS0tLXRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB5b3UgcnVuCi1jb25maWd1cmUtLS1hbmQgc29tZSBsaXZlIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQWxsIGZpbGVzIHRoYXQgbGl2ZQotaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlIGNoZWNrZWQgaW50byB0aGUgQ1ZTIHJlcG9zaXRvcnkuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gYmZkLmgKLUBjaW5kZXggQGZpbGV7YmZkLmh9Ci1AY2luZGV4IEBmaWxle2JmZC1pbjMuaH0KLUxpdmVzIGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LiAgQ3JlYXRlZCBhdCBtYWtlIHRpbWUgZnJvbQotQGZpbGV7YmZkLWluMi5ofSB2aWEgQGZpbGV7YmZkLWluMy5ofS4gIEBmaWxle2JmZC1pbjMuaH0gaXMgY3JlYXRlZCBhdAotY29uZmlndXJlIHRpbWUgZnJvbSBAZmlsZXtiZmQtaW4yLmh9LiAgVGhlcmUgYXJlIGF1dG9tYXRpYyBkZXBlbmRlbmNpZXMKLXRvIHJlYnVpbGQgQGZpbGV7YmZkLWluMy5ofSBhbmQgaGVuY2UgQGZpbGV7YmZkLmh9IGlmIEBmaWxle2JmZC1pbjIuaH0KLWNoYW5nZXMsIHNvIHlvdSBjYW4gbm9ybWFsbHkgaWdub3JlIEBmaWxle2JmZC1pbjMuaH0sIGFuZCBqdXN0IHRoaW5rCi1hYm91dCBAZmlsZXtiZmQtaW4yLmh9IGFuZCBAZmlsZXtiZmQuaH0uCi0KLUBmaWxle2JmZC5ofSBpcyBidWlsdCBieSByZXBsYWNpbmcgYSBmZXcgc3RyaW5ncyBpbiBAZmlsZXtiZmQtaW4yLmh9LgotVG8gc2VlIHRoZW0sIHNlYXJjaCBmb3IgQHNhbXB7QEB9IGluIEBmaWxle2JmZC1pbjIuaH0uICBUaGV5IG1haW5seQotY29udHJvbCB3aGV0aGVyIEJGRCBpcyBidWlsdCBmb3IgYSAzMiBiaXQgdGFyZ2V0IG9yIGEgNjQgYml0IHRhcmdldC4KLQotQGl0ZW0gYmZkLWluMi5oCi1AY2luZGV4IEBmaWxle2JmZC1pbjIuaH0KLUxpdmVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2JmZC1pbi5ofSBhbmQgc2V2ZXJhbAotb3RoZXIgQkZEIHNvdXJjZSBmaWxlcy4gIElmIHlvdSBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBAZmlsZXtiZmQtaW4yLmh9IGlzIHJlYnVpbHQKLWF1dG9tYXRpY2FsbHkgd2hlbiBhIHNvdXJjZSBmaWxlIGNoYW5nZXMuCi0KLUBpdGVtIGVsZjMyLXRhcmdldC5oCi1AaXRlbXggZWxmNjQtdGFyZ2V0LmgKLUBjaW5kZXggQGZpbGV7ZWxmMzItdGFyZ2V0Lmh9Ci1AY2luZGV4IEBmaWxle2VsZjY0LXRhcmdldC5ofQotTGl2ZSBpbiB0aGUgb2JqZWN0IGRpcmVjdG9yeS4gIENyZWF0ZWQgZnJvbSBAZmlsZXtlbGZ4eC10YXJnZXQuaH0uCi1UaGVzZSBmaWxlcyBhcmUgdmVyc2lvbnMgb2YgQGZpbGV7ZWxmeHgtdGFyZ2V0Lmh9IGN1c3RvbWl6ZWQgZm9yIGVpdGhlcgotYSAzMiBiaXQgRUxGIHRhcmdldCBvciBhIDY0IGJpdCBFTEYgdGFyZ2V0LgotCi1AaXRlbSBsaWJiZmQuaAotQGNpbmRleCBAZmlsZXtsaWJiZmQuaH0KLUxpdmVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2xpYmJmZC1pbi5ofSBhbmQKLXNldmVyYWwgb3RoZXIgQkZEIHNvdXJjZSBmaWxlcy4gIElmIHlvdSBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBAZmlsZXtsaWJiZmQuaH0gaXMgcmVidWlsdAotYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGZpbGUgY2hhbmdlcy4KLQotQGl0ZW0gbGliY29mZi5oCi1AY2luZGV4IEBmaWxle2xpYmNvZmYuaH0KLUxpdmVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgQ3JlYXRlZCBmcm9tIEBmaWxle2xpYmNvZmYtaW4uaH0gYW5kCi1AZmlsZXtjb2ZmY29kZS5ofS4gIElmIHlvdSBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBAZmlsZXtsaWJjb2ZmLmh9IGlzIHJlYnVpbHQKLWF1dG9tYXRpY2FsbHkgd2hlbiBhIHNvdXJjZSBmaWxlIGNoYW5nZXMuCi0KLUBpdGVtIHRhcmdtYXRjaC5oCi1AY2luZGV4IEBmaWxle3RhcmdtYXRjaC5ofQotTGl2ZXMgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnkuICBDcmVhdGVkIGF0IG1ha2UgdGltZSBmcm9tCi1AZmlsZXtjb25maWcuYmZkfS4gIFRoaXMgZmlsZSBpcyB1c2VkIHRvIG1hcCBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGludG8KLUJGRCB0YXJnZXQgdmVjdG9yIHZhcmlhYmxlIG5hbWVzIGF0IHJ1biB0aW1lLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgbXVsdGlwbGUgY29tcGlsYXRpb25zCi1Ac2VjdGlvbiBGaWxlcyBjb21waWxlZCBtdWx0aXBsZSB0aW1lcyBpbiBCRkQKLVNldmVyYWwgZmlsZXMgaW4gQkZEIGFyZSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcy4gIEJ5IHRoaXMgSSBtZWFuIHRoYXQKLXRoZXJlIGFyZSBoZWFkZXIgZmlsZXMgd2hpY2ggY29udGFpbiBmdW5jdGlvbiBkZWZpbml0aW9ucy4gIFRoZXNlIGhlYWRlcgotZmlsZXMgYXJlIGluY2x1ZGVkIGJ5IG90aGVyIGZpbGVzLCBhbmQgdGh1cyB0aGUgZnVuY3Rpb25zIGFyZSBjb21waWxlZAotb25jZSBwZXIgZmlsZSB3aGljaCBpbmNsdWRlcyB0aGVtLgotCi1QcmVwcm9jZXNzb3IgbWFjcm9zIGFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGNvbXBpbGF0aW9uLCBzbyB0aGF0IGVhY2gKLXRpbWUgdGhlIGZpbGVzIGFyZSBjb21waWxlZCB0aGUgcmVzdWx0aW5nIGZ1bmN0aW9ucyBhcmUgc2xpZ2h0bHkKLWRpZmZlcmVudC4gIE5hdHVyYWxseSwgaWYgdGhleSB3ZXJlbid0IGRpZmZlcmVudCwgdGhlcmUgd291bGQgYmUgbm8KLXJlYXNvbiB0byBjb21waWxlIHRoZW0gbXVsdGlwbGUgdGltZXMuCi0KLVRoaXMgaXMgYSBub3QgYSBwYXJ0aWN1bGFybHkgZ29vZCBwcm9ncmFtbWluZyB0ZWNobmlxdWUsIGFuZCBmdXR1cmUgQkZECi13b3JrIHNob3VsZCBhdm9pZCBpdC4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVNpbmNlIHRoaXMgdGVjaG5pcXVlIGlzIHJhcmVseSB1c2VkLCBldmVuIGV4cGVyaWVuY2VkIEMgcHJvZ3JhbW1lcnMgZmluZAotaXQgY29uZnVzaW5nLgotCi1AaXRlbQotSXQgaXMgZGlmZmljdWx0IHRvIGRlYnVnIHByb2dyYW1zIHdoaWNoIHVzZSBCRkQsIHNpbmNlIHRoZXJlIGlzIG5vIHdheQotdG8gZGVzY3JpYmUgd2hpY2ggdmVyc2lvbiBvZiBhIHBhcnRpY3VsYXIgZnVuY3Rpb24geW91IGFyZSBsb29raW5nIGF0LgotCi1AaXRlbQotUHJvZ3JhbXMgd2hpY2ggdXNlIEJGRCB3aW5kIHVwIGluY29ycG9yYXRpbmcgdHdvIG9yIG1vcmUgc2xpZ2h0bHkKLWRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBmdW5jdGlvbiwgd2hpY2ggd2FzdGVzIHNwYWNlIGluIHRoZQotZXhlY3V0YWJsZS4KLQotQGl0ZW0KLVRoaXMgdGVjaG5pcXVlIGlzIG5ldmVyIHJlcXVpcmVkIG5vciBpcyBpdCBlc3BlY2lhbGx5IGVmZmljaWVudC4gIEl0IGlzCi1hbHdheXMgcG9zc2libGUgdG8gdXNlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgc3RydWN0dXJlcyBob2xkaW5nCi1mdW5jdGlvbiBwb2ludGVycyBhbmQgbWFnaWMgY29uc3RhbnRzIGluc3RlYWQuCi1AZW5kIGl0ZW1pemUKLQotVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdGhlIGZpbGVzIHdoaWNoIGFyZSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcy4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBhb3V0LXRhcmdldC5oCi1AY2luZGV4IEBmaWxle2FvdXQtdGFyZ2V0Lmh9Ci1EZXNjcmliZXMgYSBmZXcgZnVuY3Rpb25zIGFuZCB0aGUgdGFyZ2V0IHZlY3RvciBmb3IgYS5vdXQgdGFyZ2V0cy4gIFRoaXMKLWlzIHVzZWQgYnkgaW5kaXZpZHVhbCBhLm91dCB0YXJnZXRzIHdpdGggZGlmZmVyZW50IGRlZmluaXRpb25zIG9mCi1Ac2FtcHtOX1RYVEFERFJ9IGFuZCBzaW1pbGFyIGEub3V0IG1hY3Jvcy4KLQotQGl0ZW0gYW91dGYxLmgKLUBjaW5kZXggQGZpbGV7YW91dGYxLmh9Ci1JbXBsZW1lbnRzIHN0YW5kYXJkIFN1bk9TIGEub3V0IGZpbGVzLiAgSW4gcHJpbmNpcGxlIGl0IHN1cHBvcnRzIDY0IGJpdAotYS5vdXQgdGFyZ2V0cyBiYXNlZCBvbiB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvIEBzYW1we0FSQ0hfU0laRX0sIGJ1dAotc2luY2UgYWxsIGtub3duIGEub3V0IHRhcmdldHMgYXJlIDMyIGJpdHMsIHRoaXMgY29kZSBtYXkgb3IgbWF5IG5vdAotd29yay4gIFRoaXMgZmlsZSBpcyBvbmx5IGluY2x1ZGVkIGJ5IGEgZmV3IG90aGVyIGZpbGVzLCBhbmQgaXQgaXMKLWRpZmZpY3VsdCB0byBqdXN0aWZ5IGl0cyBleGlzdGVuY2UuCi0KLUBpdGVtIGFvdXR4LmgKLUBjaW5kZXggQGZpbGV7YW91dHguaH0KLUltcGxlbWVudHMgYmFzaWMgYS5vdXQgc3VwcG9ydCByb3V0aW5lcy4gIFRoaXMgZmlsZSBjYW4gYmUgY29tcGlsZWQgZm9yCi1laXRoZXIgMzIgb3IgNjQgYml0IHN1cHBvcnQuICBTaW5jZSBhbGwga25vd24gYS5vdXQgdGFyZ2V0cyBhcmUgMzIgYml0cywKLXRoZSA2NCBiaXQgc3VwcG9ydCBtYXkgb3IgbWF5IG5vdCB3b3JrLiAgSSBiZWxpZXZlIHRoZSBvcmlnaW5hbAotaW50ZW50aW9uIHdhcyB0aGF0IHRoaXMgZmlsZSB3b3VsZCBvbmx5IGJlIGluY2x1ZGVkIGJ5IEBzYW1we2FvdXQzMi5jfQotYW5kIEBzYW1we2FvdXQ2NC5jfSwgYW5kIHRoYXQgb3RoZXIgYS5vdXQgdGFyZ2V0cyB3b3VsZCBzaW1wbHkgcmVmZXIgdG8KLXRoZSBmdW5jdGlvbnMgaXQgZGVmaW5lZC4gIFVuZm9ydHVuYXRlbHksIHNvbWUgb3RoZXIgYS5vdXQgdGFyZ2V0cwotc3RhcnRlZCBpbmNsdWRpbmcgaXQgZGlyZWN0bHksIGxlYWRpbmcgdG8gYSBzb21ld2hhdCBjb25mdXNlZCBzdGF0ZSBvZgotYWZmYWlycy4KLQotQGl0ZW0gY29mZmNvZGUuaAotQGNpbmRleCBAZmlsZXtjb2ZmY29kZS5ofQotSW1wbGVtZW50cyBiYXNpYyBDT0ZGIHN1cHBvcnQgcm91dGluZXMuICBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgYnkgZXZlcnkKLUNPRkYgdGFyZ2V0LiAgSXQgaW1wbGVtZW50cyBjb2RlIHdoaWNoIGhhbmRsZXMgQ09GRiBtYWdpYyBudW1iZXJzIGFzCi13ZWxsIGFzIHZhcmlvdXMgaG9vayBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZSBnZW5lcmljIENPRkYgZnVuY3Rpb25zIGluCi1AZmlsZXtjb2ZmZ2VuLmN9LiAgVGhpcyBmaWxlIGlzIGNvbnRyb2xsZWQgYnkgYSBudW1iZXIgb2YgZGlmZmVyZW50Ci1tYWNyb3MsIGFuZCBtb3JlIGFyZSBhZGRlZCByZWd1bGFybHkuCi0KLUBpdGVtIGNvZmZzd2FwLmgKLUBjaW5kZXggQGZpbGV7Y29mZnN3YXAuaH0KLUltcGxlbWVudHMgQ09GRiBzd2FwcGluZyByb3V0aW5lcy4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieQotQGZpbGV7Y29mZmNvZGUuaH0sIGFuZCB0aHVzIGJ5IGV2ZXJ5IENPRkYgdGFyZ2V0LiAgSXQgaW1wbGVtZW50cyB0aGUKLXJvdXRpbmVzIHdoaWNoIHN3YXAgQ09GRiBzdHJ1Y3R1cmVzIGJldHdlZW4gaW50ZXJuYWwgYW5kIGV4dGVybmFsCi1mb3JtYXQuICBUaGUgbWFpbiBjb250cm9sIGZvciB0aGlzIGZpbGUgaXMgdGhlIGV4dGVybmFsIHN0cnVjdHVyZQotZGVmaW5pdGlvbnMgaW4gdGhlIGZpbGVzIGluIHRoZSBAZmlsZXtpbmNsdWRlL2NvZmZ9IGRpcmVjdG9yeS4gIEEgQ09GRgotdGFyZ2V0IGZpbGUgd2lsbCBpbmNsdWRlIG9uZSBvZiB0aG9zZSBmaWxlcyBiZWZvcmUgaW5jbHVkaW5nCi1AZmlsZXtjb2ZmY29kZS5ofSBhbmQgdGh1cyBAZmlsZXtjb2Zmc3dhcC5ofS4gIFRoZXJlIGFyZSBhIGZldyBvdGhlcgotbWFjcm9zIHdoaWNoIGFmZmVjdCBAZmlsZXtjb2Zmc3dhcC5ofSBhcyB3ZWxsLCBtb3N0bHkgZGVzY3JpYmluZyB3aGV0aGVyCi1jZXJ0YWluIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgZXh0ZXJuYWwgc3RydWN0dXJlcy4KLQotQGl0ZW0gZWNvZmZzd2FwLmgKLUBjaW5kZXggQGZpbGV7ZWNvZmZzd2FwLmh9Ci1JbXBsZW1lbnRzIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhpcyBpcyBsaWtlIEBmaWxle2NvZmZzd2FwLmh9LCBidXQKLWZvciBFQ09GRi4gIEl0IGlzIGluY2x1ZGVkIGJ5IHRoZSBFQ09GRiB0YXJnZXQgZmlsZXMgKG9mIHdoaWNoIHRoZXJlIGFyZQotb25seSB0d28pLiAgVGhlIGNvbnRyb2wgaXMgdGhlIHByZXByb2Nlc3NvciBtYWNybyBAc2FtcHtFQ09GRl8zMn0gb3IKLUBzYW1we0VDT0ZGXzY0fS4KLQotQGl0ZW0gZWxmY29kZS5oCi1AY2luZGV4IEBmaWxle2VsZmNvZGUuaH0KLUltcGxlbWVudHMgRUxGIGZ1bmN0aW9ucyB0aGF0IHVzZSBleHRlcm5hbCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICBUaGlzCi1maWxlIGlzIGluY2x1ZGVkIGJ5IHR3byBvdGhlciBmaWxlczogQGZpbGV7ZWxmMzIuY30gYW5kIEBmaWxle2VsZjY0LmN9LgotSXQgaXMgY29udHJvbGxlZCBieSB0aGUgQHNhbXB7QVJDSF9TSVpFfSBtYWNybyB3aGljaCBpcyBkZWZpbmVkIHRvIGJlCi1Ac2FtcHszMn0gb3IgQHNhbXB7NjR9IGJlZm9yZSBpbmNsdWRpbmcgaXQuICBUaGUgQHNhbXB7TkFNRX0gbWFjcm8gaXMKLXVzZWQgaW50ZXJuYWxseSB0byBnaXZlIHRoZSBmdW5jdGlvbnMgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgdHdvIHRhcmdldAotc2l6ZXMuCi0KLUBpdGVtIGVsZmNvcmUuaAotQGNpbmRleCBAZmlsZXtlbGZjb3JlLmh9Ci1MaWtlIEBmaWxle2VsZmNvZGUuaH0sIGJ1dCBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIHNwZWNpZmljIHRvIEVMRiBjb3JlCi1maWxlcy4gIFRoaXMgaXMgaW5jbHVkZWQgb25seSBieSBAZmlsZXtlbGZjb2RlLmh9LgotCi1AaXRlbSBlbGZsaW5rLmgKLUBjaW5kZXggQGZpbGV7ZWxmbGluay5ofQotTGlrZSBAZmlsZXtlbGZjb2RlLmh9LCBidXQgZm9yIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBFTEYgbGlua2VyLiAgVGhpcwotaXMgaW5jbHVkZWQgb25seSBieSBAZmlsZXtlbGZjb2RlLmh9LgotCi1AaXRlbSBlbGZ4eC10YXJnZXQuaAotQGNpbmRleCBAZmlsZXtlbGZ4eC10YXJnZXQuaH0KLVRoaXMgZmlsZSBpcyB0aGUgc291cmNlIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGVzIEBmaWxle2VsZjMyLXRhcmdldC5ofQotYW5kIEBmaWxle2VsZjY0LXRhcmdldC5ofSwgb25lIG9mIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IGV2ZXJ5IEVMRiB0YXJnZXQuCi1JdCBkZWZpbmVzIHRoZSBFTEYgdGFyZ2V0IHZlY3Rvci4KLQotQGl0ZW0gZnJlZWJzZC5oCi1AY2luZGV4IEBmaWxle2ZyZWVic2QuaH0KLVByZXN1bWFibHkgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgYWxsIEZyZWVCU0QgdGFyZ2V0cywgYnV0IGluIGZhY3QKLXRoZXJlIGlzIG9ubHkgb25lIHN1Y2ggdGFyZ2V0LCBAc2FtcHtpMzg2LWZyZWVic2R9LiAgVGhpcyBkZWZpbmVzIGEKLWZ1bmN0aW9uIHVzZWQgdG8gc2V0IHRoZSByaWdodCBtYWdpYyBudW1iZXIgZm9yIEZyZWVCU0QsIGFzIHdlbGwgYXMKLXZhcmlvdXMgbWFjcm9zLCBhbmQgaW5jbHVkZXMgQGZpbGV7YW91dC10YXJnZXQuaH0uCi0KLUBpdGVtIG5ldGJzZC5oCi1AY2luZGV4IEBmaWxle25ldGJzZC5ofQotTGlrZSBAZmlsZXtmcmVlYnNkLmh9LCBleGNlcHQgdGhhdCB0aGVyZSBhcmUgc2V2ZXJhbCBmaWxlcyB3aGljaCBpbmNsdWRlCi1pdC4KLQotQGl0ZW0gbmxtLXRhcmdldC5oCi1AY2luZGV4IEBmaWxle25sbS10YXJnZXQuaH0KLURlZmluZXMgdGhlIHRhcmdldCB2ZWN0b3IgZm9yIGEgc3RhbmRhcmQgTkxNIHRhcmdldC4KLQotQGl0ZW0gbmxtY29kZS5oCi1AY2luZGV4IEBmaWxle25sbWNvZGUuaH0KLUxpa2UgQGZpbGV7ZWxmY29kZS5ofSwgYnV0IGZvciBOTE0gdGFyZ2V0cy4gIFRoaXMgaXMgb25seSBpbmNsdWRlZCBieQotQGZpbGV7bmxtMzIuY30gYW5kIEBmaWxle25sbTY0LmN9LCBib3RoIG9mIHdoaWNoIGRlZmluZSB0aGUgbWFjcm8KLUBzYW1we0FSQ0hfU0laRX0gdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUuICBUaGVyZSBhcmUgbm8gNjQgYml0IE5MTQotdGFyZ2V0cyBhbnlob3csIHNvIHRoaXMgaXMgc29ydCBvZiB1c2VsZXNzLgotCi1AaXRlbSBubG1zd2FwLmgKLUBjaW5kZXggQGZpbGV7bmxtc3dhcC5ofQotTGlrZSBAZmlsZXtjb2Zmc3dhcC5ofSwgYnV0IGZvciBOTE0gdGFyZ2V0cy4gIFRoaXMgaXMgaW5jbHVkZWQgYnkgZWFjaAotTkxNIHRhcmdldCwgYnV0IEkgdGhpbmsgaXQgd2luZHMgdXAgY29tcGlsaW5nIHRvIHRoZSBleGFjdCBzYW1lIGNvZGUgZm9yCi1ldmVyeSB0YXJnZXQsIGFuZCBhcyBzdWNoIGlzIGZhaXJseSB1c2VsZXNzLgotCi1AaXRlbSBwZWljb2RlLmgKLUBjaW5kZXggQGZpbGV7cGVpY29kZS5ofQotUHJvdmlkZXMgc3dhcHBpbmcgcm91dGluZXMgYW5kIG90aGVyIGhvb2tzIGZvciBQRSB0YXJnZXRzLgotQGZpbGV7Y29mZmNvZGUuaH0gd2lsbCBpbmNsdWRlIHRoaXMgcmF0aGVyIHRoYW4gQGZpbGV7Y29mZnN3YXAuaH0gZm9yIGEKLVBFIHRhcmdldC4gIFRoaXMgZGVmaW5lcyBQRSBzcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGUgQ09GRiBzd2FwcGluZwotcm91dGluZXMsIGFuZCBhbHNvIGRlZmluZXMgc29tZSBtYWNyb3Mgd2hpY2ggY29udHJvbCBAZmlsZXtjb2ZmY29kZS5ofQotaXRzZWxmLgotQGVuZCB0YWJsZQotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBoYW5kbGluZwotQHNlY3Rpb24gQkZEIHJlbG9jYXRpb24gaGFuZGxpbmcKLUBjaW5kZXggYmZkIHJlbG9jYXRpb24gaGFuZGxpbmcKLUBjaW5kZXggcmVsb2NhdGlvbnMgaW4gYmZkCi0KLVRoZSBoYW5kbGluZyBvZiByZWxvY2F0aW9ucyBpcyBvbmUgb2YgdGhlIG1vcmUgY29uZnVzaW5nIGFzcGVjdHMgb2YgQkZELgotUmVsb2NhdGlvbiBoYW5kbGluZyBoYXMgYmVlbiBpbXBsZW1lbnRlZCBpbiB2YXJpb3VzIGRpZmZlcmVudCB3YXlzLCBhbGwKLXNvbWV3aGF0IGluY29tcGF0aWJsZSwgbm9uZSBwZXJmZWN0LgotCi1AbWVudQotKiBCRkQgcmVsb2NhdGlvbiBjb25jZXB0czo6CUJGRCByZWxvY2F0aW9uIGNvbmNlcHRzCi0qIEJGRCByZWxvY2F0aW9uIGZ1bmN0aW9uczo6CUJGRCByZWxvY2F0aW9uIGZ1bmN0aW9ucwotKiBCRkQgcmVsb2NhdGlvbiBjb2Rlczo6CUJGRCByZWxvY2F0aW9uIGNvZGVzCi0qIEJGRCByZWxvY2F0aW9uIGZ1dHVyZTo6CUJGRCByZWxvY2F0aW9uIGZ1dHVyZQotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGNvbmNlcHRzCi1Ac3Vic2VjdGlvbiBCRkQgcmVsb2NhdGlvbiBjb25jZXB0cwotCi1BIHJlbG9jYXRpb24gaXMgYW4gYWN0aW9uIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCB0YWtlIHdoZW4gbGlua2luZy4gIEl0Ci1kZXNjcmliZXMgYSBjaGFuZ2UgdG8gdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gIFRoZSBjaGFuZ2UgaXMgbm9ybWFsbHkKLWJhc2VkIG9uIHRoZSBmaW5hbCB2YWx1ZSBvZiBvbmUgb3IgbW9yZSBzeW1ib2xzLiAgUmVsb2NhdGlvbnMgYXJlCi1jcmVhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgd2hlbiBpdCBjcmVhdGVzIGFuIG9iamVjdCBmaWxlLgotCi1Nb3N0IHJlbG9jYXRpb25zIGFyZSBzaW1wbGUuICBBIHR5cGljYWwgc2ltcGxlIHJlbG9jYXRpb24gaXMgdG8gc2V0IDMyCi1iaXRzIGF0IGEgZ2l2ZW4gb2Zmc2V0IGluIGEgc2VjdGlvbiB0byB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuICBUaGlzIHR5cGUKLW9mIHJlbG9jYXRpb24gd291bGQgYmUgZ2VuZXJhdGVkIGZvciBjb2RlIGxpa2UgQGNvZGV7aW50ICpwID0gJmk7fSB3aGVyZQotQHNhbXB7cH0gYW5kIEBzYW1we2l9IGFyZSBnbG9iYWwgdmFyaWFibGVzLiAgQSByZWxvY2F0aW9uIGZvciB0aGUgc3ltYm9sCi1Ac2FtcHtpfSB3b3VsZCBiZSBnZW5lcmF0ZWQgc3VjaCB0aGF0IHRoZSBsaW5rZXIgd291bGQgaW5pdGlhbGl6ZSB0aGUKLWFyZWEgb2YgbWVtb3J5IHdoaWNoIGhvbGRzIHRoZSB2YWx1ZSBvZiBAc2FtcHtwfSB0byB0aGUgdmFsdWUgb2YgdGhlCi1zeW1ib2wgQHNhbXB7aX0uCi0KLVNsaWdodGx5IG1vcmUgY29tcGxleCByZWxvY2F0aW9ucyBtYXkgaW5jbHVkZSBhbiBhZGRlbmQsIHdoaWNoIGlzIGEKLWNvbnN0YW50IHRvIGFkZCB0byB0aGUgc3ltYm9sIHZhbHVlIGJlZm9yZSB1c2luZyBpdC4gIEluIHNvbWUgY2FzZXMgYQotcmVsb2NhdGlvbiB3aWxsIHJlcXVpcmUgYWRkaW5nIHRoZSBzeW1ib2wgdmFsdWUgdG8gdGhlIGV4aXN0aW5nIGNvbnRlbnRzCi1vZiB0aGUgc2VjdGlvbiBpbiB0aGUgb2JqZWN0IGZpbGUuICBJbiBvdGhlcnMgdGhlIHJlbG9jYXRpb24gd2lsbCBzaW1wbHkKLXJlcGxhY2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHdpdGggdGhlIHN5bWJvbCB2YWx1ZS4gIFNvbWUKLXJlbG9jYXRpb25zIGFyZSBQQyByZWxhdGl2ZSwgc28gdGhhdCB0aGUgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZQotc2VjdGlvbiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBhbmQgdGhlIGZpbmFsCi1hZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCi1JbiBnZW5lcmFsLCByZWxvY2F0aW9ucyBjYW4gYmUgYXJiaXRyYXJpbHkgY29tcGxleC4gIEZvciBleGFtcGxlLAotcmVsb2NhdGlvbnMgdXNlZCBpbiBkeW5hbWljIGxpbmtpbmcgc3lzdGVtcyBvZnRlbiByZXF1aXJlIHRoZSBsaW5rZXIgdG8KLWFsbG9jYXRlIHNwYWNlIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gYW5kIHVzZSB0aGUgb2Zmc2V0IHdpdGhpbiB0aGF0Ci1zZWN0aW9uIGFzIHRoZSB2YWx1ZSB0byBzdG9yZS4gIEluIHRoZSBJRUVFIG9iamVjdCBmaWxlIGZvcm1hdCwKLXJlbG9jYXRpb25zIG1heSBpbnZvbHZlIGFyYml0cmFyeSBleHByZXNzaW9ucy4KLQotV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGUgbGlua2VyIG1heSBvciBtYXkgbm90IGhhdmUgdG8gZG8KLWFueXRoaW5nIHdpdGggYSByZWxvY2F0aW9uLCBkZXBlbmRpbmcgdXBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLXJlbG9jYXRpb24uICBTaW1wbGUgcmVsb2NhdGlvbnMgZ2VuZXJhbGx5IGRvIG5vdCByZXF1aXJlIGFueSBzcGVjaWFsCi1hY3Rpb24uCi0KLUBub2RlIEJGRCByZWxvY2F0aW9uIGZ1bmN0aW9ucwotQHN1YnNlY3Rpb24gQkZEIHJlbG9jYXRpb24gZnVuY3Rpb25zCi0KLUluIEJGRCwgZWFjaCBzZWN0aW9uIGhhcyBhbiBhcnJheSBvZiBAc2FtcHthcmVsZW50fSBzdHJ1Y3R1cmVzLiAgRWFjaAotc3RydWN0dXJlIGhhcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wsIGFuIGFkZHJlc3Mgd2l0aGluIHRoZSBzZWN0aW9uLCBhbgotYWRkZW5kLCBhbmQgYSBwb2ludGVyIHRvIGEgQHNhbXB7cmVsb2NfaG93dG9fc3RydWN0fSBzdHJ1Y3R1cmUuICBUaGUKLWhvd3RvIHN0cnVjdHVyZSBoYXMgYSBidW5jaCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgcmVsb2MsIGluY2x1ZGluZyBhCi10eXBlIGZpZWxkLiAgVGhlIHR5cGUgZmllbGQgaXMgc3BlY2lmaWMgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdAotYmFja2VuZDsgbm9uZSBvZiB0aGUgZ2VuZXJpYyBjb2RlIGluIEJGRCBleGFtaW5lcyBpdC4KLQotT3JpZ2luYWxseSwgdGhlIGZ1bmN0aW9uIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IHdhcyBzdXBwb3NlZCB0bwotaGFuZGxlIGFsbCByZWxvY2F0aW9ucy4gIEluIHRoZW9yeSwgbWFueSByZWxvY2F0aW9ucyB3b3VsZCBiZSBzaW1wbGUKLWVub3VnaCB0byBiZSBkZXNjcmliZWQgYnkgdGhlIGZpZWxkcyBpbiB0aGUgaG93dG8gc3RydWN0dXJlLiAgRm9yIHRob3NlCi10aGF0IHdlcmVuJ3QsIHRoZSBob3d0byBzdHJ1Y3R1cmUgaW5jbHVkZWQgYSBAc2FtcHtzcGVjaWFsX2Z1bmN0aW9ufQotZmllbGQgdG8gdXNlIGFzIGFuIGVzY2FwZS4KLQotV2hpbGUgdGhpcyBzZWVtcyBwbGF1c2libGUsIGEgbG9vayBhdCBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufQotc2hvd3MgdGhhdCBpdCBmYWlsZWQuICBUaGUgZnVuY3Rpb24gaGFzIG9kZCBzcGVjaWFsIGNhc2VzLiAgU29tZSBvZiB0aGUKLWZpZWxkcyBpbiB0aGUgaG93dG8gc3RydWN0dXJlLCBzdWNoIGFzIEBzYW1we3BjcmVsX29mZnNldH0sIHdlcmUgbm90Ci1hZGVxdWF0ZWx5IGRvY3VtZW50ZWQuCi0KLVRoZSBsaW5rZXIgdXNlcyBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSB0byBkbyBhbGwgcmVsb2NhdGlvbnMgd2hlbgotdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBoYXZlIGRpZmZlcmVudCBmb3JtYXRzIChlLmcuLCB3aGVuIGdlbmVyYXRpbmcKLVMtcmVjb3JkcykuICBUaGUgZ2VuZXJpYyBsaW5rZXIgY29kZSwgd2hpY2ggaXMgdXNlZCBieSBhbGwgdGFyZ2V0cyB3aGljaAotZG8gbm90IGRlZmluZSB0aGVpciBvd24gc3BlY2lhbCBwdXJwb3NlIGxpbmtlciwgdXNlcwotQHNhbXB7YmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoIGZvciBtb3N0IHRhcmdldHMgdHVybnMKLWludG8gYSBjYWxsIHRvIEBzYW1we2JmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50c30sIHdoaWNoCi1jYWxscyBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufS4gIFNvIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259Ci1pcyBzdGlsbCB3aWRlbHkgdXNlZCwgd2hpY2ggbWFrZXMgaXQgZGlmZmljdWx0IHRvIGNoYW5nZSwgc2luY2UgaXQgaXMKLWRpZmZpY3VsdCB0byB0ZXN0IGFsbCBwb3NzaWJsZSBjYXNlcy4KLQotVGhlIGFzc2VtYmxlciB1c2VkIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IGZvciBhIHdoaWxlLiAgVGhpcwotdHVybmVkIG91dCB0byBiZSB0aGUgd3JvbmcgdGhpbmcgdG8gZG8sIHNpbmNlCi1Ac2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSB3YXMgd3JpdHRlbiB0byBoYW5kbGUgcmVsb2NhdGlvbnMgb24gYW4KLWV4aXN0aW5nIG9iamVjdCBmaWxlLCB3aGlsZSB0aGUgYXNzZW1ibGVyIG5lZWRlZCB0byBjcmVhdGUgcmVsb2NhdGlvbnMKLWluIGEgbmV3IG9iamVjdCBmaWxlLiAgVGhlIGFzc2VtYmxlciB3YXMgY2hhbmdlZCB0byB1c2UgdGhlIG5ldyBmdW5jdGlvbgotQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0gaW5zdGVhZCwgYW5kIEBzYW1we2JmZF9pbnN0YWxsX3JlbG9jYXRpb259Ci13YXMgY3JlYXRlZCBhcyBhIGNvcHkgb2YgQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0uCi0KLVVuZm9ydHVuYXRlbHksIHRoZSB3b3JrIGRpZCBub3QgcHJvZ3Jlc3MgYW55IGZhcnRoZXIsIHNvCi1Ac2FtcHtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufSByZW1haW5zIGEgc2ltcGxlIGNvcHkgb2YKLUBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LCB3aXRoIGFsbCB0aGUgb2RkIHNwZWNpYWwgY2FzZXMgYW5kCi1jb25mdXNpbmcgY29kZS4gIFRoaXMgYWdhaW4gaXMgZGlmZmljdWx0IHRvIGNoYW5nZSwgYmVjYXVzZSBhZ2FpbiBhbnkKLWNoYW5nZSBjYW4gYWZmZWN0IGFueSBhc3NlbWJsZXIgdGFyZ2V0LCBhbmQgc28gaXMgZGlmZmljdWx0IHRvIHRlc3QuCi0KLVRoZSBuZXcgbGlua2VyLCB3aGVuIHVzaW5nIHRoZSBzYW1lIG9iamVjdCBmaWxlIGZvcm1hdCBmb3IgYWxsIGlucHV0Ci1maWxlcyBhbmQgdGhlIG91dHB1dCBmaWxlLCBkb2VzIG5vdCBjb252ZXJ0IHJlbG9jYXRpb25zIGludG8KLUBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZXMsIHNvIGl0IGNhbiBub3QgdXNlCi1Ac2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSBhdCBhbGwuICBJbnN0ZWFkLCB1c2VycyBvZiB0aGUgbmV3IGxpbmtlcgotYXJlIGV4cGVjdGVkIHRvIHdyaXRlIGEgQHNhbXB7cmVsb2NhdGVfc2VjdGlvbn0gZnVuY3Rpb24gd2hpY2ggd2lsbAotaGFuZGxlIHJlbG9jYXRpb25zIGluIGEgdGFyZ2V0IHNwZWNpZmljIGZhc2hpb24uCi0KLVRoZXJlIGFyZSB0d28gaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb246Ci1Ac2FtcHtfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGV9IGFuZCBAc2FtcHtfYmZkX3JlbG9jYXRlX2NvbnRlbnRzfS4KLVRoZXNlIGZ1bmN0aW9ucyB1c2UgYSBob3d0byBzdHJ1Y3R1cmUsIGJ1dCB0aGV5IEBlbXBoe2RvIG5vdH0gdXNlIHRoZQotQHNhbXB7c3BlY2lhbF9mdW5jdGlvbn0gZmllbGQuICBTaW5jZSB0aGUgZnVuY3Rpb25zIGFyZSBub3JtYWxseSBjYWxsZWQKLWZyb20gdGFyZ2V0IHNwZWNpZmljIGNvZGUsIHRoZSBAc2FtcHtzcGVjaWFsX2Z1bmN0aW9ufSBmaWVsZCBhZGRzCi1saXR0bGU7IGFueSByZWxvY2F0aW9ucyB3aGljaCByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgY2FuIGJlIGhhbmRsZWQKLXdpdGhvdXQgY2FsbGluZyB0aG9zZSBmdW5jdGlvbnMuCi0KLVNvLCBpZiB5b3Ugd2FudCB0byBhZGQgYSBuZXcgdGFyZ2V0LCBvciBhZGQgYSBuZXcgcmVsb2NhdGlvbiB0byBhbgotZXhpc3RpbmcgdGFyZ2V0LCB5b3UgbmVlZCB0byBkbyB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotTWFrZSBzdXJlIHlvdSBjbGVhcmx5IHVuZGVyc3RhbmQgd2hhdCB0aGUgY29udGVudHMgb2YgdGhlIHNlY3Rpb24gc2hvdWxkCi1sb29rIGxpa2UgYWZ0ZXIgYXNzZW1ibHksIGFmdGVyIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuZCBhZnRlciBhIGZpbmFsCi1saW5rLiAgTWFrZSBzdXJlIHlvdSBjbGVhcmx5IHVuZGVyc3RhbmQgdGhlIG9wZXJhdGlvbnMgdGhlIGxpbmtlciBtdXN0Ci1wZXJmb3JtIGR1cmluZyBhIHJlbG9jYXRlYWJsZSBsaW5rIGFuZCBkdXJpbmcgYSBmaW5hbCBsaW5rLgotCi1AaXRlbQotV3JpdGUgYSBob3d0byBzdHJ1Y3R1cmUgZm9yIHRoZSByZWxvY2F0aW9uLiAgVGhlIGhvd3RvIHN0cnVjdHVyZSBpcwotZmxleGlibGUgZW5vdWdoIHRvIHJlcHJlc2VudCBhbnkgcmVsb2NhdGlvbiB3aGljaCBzaG91bGQgYmUgaGFuZGxlZCBieQotc2V0dGluZyBhIGNvbnRpZ3VvdXMgYml0ZmllbGQgaW4gdGhlIGRlc3RpbmF0aW9uIHRvIHRoZSB2YWx1ZSBvZiBhCi1zeW1ib2wsIHBvc3NpYmx5IHdpdGggYW4gYWRkZW5kLCBwb3NzaWJseSBhZGRpbmcgdGhlIHN5bWJvbCB2YWx1ZSB0byB0aGUKLXZhbHVlIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgZGVzdGluYXRpb24uCi0KLUBpdGVtCi1DaGFuZ2UgdGhlIGFzc2VtYmxlciB0byBnZW5lcmF0ZSB5b3VyIHJlbG9jYXRpb24uICBUaGUgYXNzZW1ibGVyIHdpbGwKLWNhbGwgQHNhbXB7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0sIHNvIHlvdXIgaG93dG8gc3RydWN0dXJlIGhhcyB0byBiZQotYWJsZSB0byBoYW5kbGUgdGhhdC4gIFlvdSBtYXkgbmVlZCB0byBzZXQgdGhlIEBzYW1we3NwZWNpYWxfZnVuY3Rpb259Ci1maWVsZCB0byBoYW5kbGUgYXNzZW1ibHkgY29ycmVjdGx5LiAgQmUgY2FyZWZ1bCB0byBlbnN1cmUgdGhhdCBhbnkgY29kZQoteW91IHdyaXRlIHRvIGhhbmRsZSB0aGUgYXNzZW1ibGVyIHdpbGwgYWxzbyB3b3JrIGNvcnJlY3RseSB3aGVuIGRvaW5nIGEKLXJlbG9jYXRlYWJsZSBsaW5rLiAgRm9yIGV4YW1wbGUsIHNlZSBAc2FtcHtiZmRfZWxmX2dlbmVyaWNfcmVsb2N9LgotCi1AaXRlbQotVGVzdCB0aGUgYXNzZW1ibGVyLiAgQ29uc2lkZXIgdGhlIGNhc2VzIG9mIHJlbG9jYXRpb24gYWdhaW5zdCBhbgotdW5kZWZpbmVkIHN5bWJvbCwgYSBjb21tb24gc3ltYm9sLCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBvYmplY3QgZmlsZQotaW4gdGhlIHNhbWUgc2VjdGlvbiwgYW5kIGEgc3ltYm9sIGRlZmluZWQgaW4gdGhlIG9iamVjdCBmaWxlIGluIGEKLWRpZmZlcmVudCBzZWN0aW9uLiAgVGhlc2UgY2FzZXMgbWF5IG5vdCBhbGwgYmUgYXBwbGljYWJsZSBmb3IgeW91cgotcmVsb2MuCi0KLUBpdGVtCi1JZiB5b3VyIHRhcmdldCB1c2VzIHRoZSBuZXcgbGlua2VyLCB3aGljaCBpcyByZWNvbW1lbmRlZCwgYWRkIGFueQotcmVxdWlyZWQgaGFuZGxpbmcgdG8gdGhlIHRhcmdldCBzcGVjaWZpYyByZWxvY2F0aW9uIGZ1bmN0aW9uLiAgSW4gc2ltcGxlCi1jYXNlcyB0aGlzIHdpbGwganVzdCBpbnZvbHZlIGEgY2FsbCB0byBAc2FtcHtfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGV9Ci1vciBAc2FtcHtfYmZkX3JlbG9jYXRlX2NvbnRlbnRzfSwgZGVwZW5kaW5nIHVwb24gdGhlIGRlZmluaXRpb24gb2YgdGhlCi1yZWxvY2F0aW9uIGFuZCB3aGV0aGVyIHRoZSBsaW5rIGlzIHJlbG9jYXRlYWJsZSBvciBub3QuCi0KLUBpdGVtCi1UZXN0IHRoZSBsaW5rZXIuICBUZXN0IHRoZSBjYXNlIG9mIGEgZmluYWwgbGluay4gIElmIHRoZSByZWxvY2F0aW9uIGNhbgotb3ZlcmZsb3csIHVzZSBhIGxpbmtlciBzY3JpcHQgdG8gZm9yY2UgYW4gb3ZlcmZsb3cgYW5kIG1ha2Ugc3VyZSB0aGUKLWVycm9yIGlzIHJlcG9ydGVkIGNvcnJlY3RseS4gIFRlc3QgYSByZWxvY2F0ZWFibGUgbGluaywgd2hldGhlciB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkIG9yIHVuZGVmaW5lZCBpbiB0aGUgcmVsb2NhdGVhYmxlIG91dHB1dC4gIEZvciBib3RoIHRoZQotZmluYWwgYW5kIHJlbG9jYXRlYWJsZSBsaW5rLCB0ZXN0IHRoZSBjYXNlIHdoZW4gdGhlIHN5bWJvbCBpcyBhIGNvbW1vbgotc3ltYm9sLCB3aGVuIHRoZSBzeW1ib2wgbG9va2VkIGxpa2UgYSBjb21tb24gc3ltYm9sIGJ1dCBiZWNhbWUgYSBkZWZpbmVkCi1zeW1ib2wsIHdoZW4gdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlLCBhbmQgd2hlbgotdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIHRoZSBzYW1lIG9iamVjdCBmaWxlLgotCi1AaXRlbQotSW4gb3JkZXIgZm9yIGxpbmtpbmcgdG8gYW5vdGhlciBvYmplY3QgZmlsZSBmb3JtYXQsIHN1Y2ggYXMgUy1yZWNvcmRzLAotdG8gd29yayBjb3JyZWN0bHksIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259IGhhcyB0byBkbyB0aGUgcmlnaHQKLXRoaW5nIGZvciB0aGUgcmVsb2NhdGlvbi4gIFlvdSBtYXkgbmVlZCB0byBzZXQgdGhlCi1Ac2FtcHtzcGVjaWFsX2Z1bmN0aW9ufSBmaWVsZCB0byBoYW5kbGUgdGhpcyBjb3JyZWN0bHkuICBUZXN0IHRoaXMgYnkKLWRvaW5nIGEgbGluayBpbiB3aGljaCB0aGUgb3V0cHV0IG9iamVjdCBmaWxlIGZvcm1hdCBpcyBTLXJlY29yZHMuCi0KLUBpdGVtCi1Vc2luZyB0aGUgbGlua2VyIHRvIGdlbmVyYXRlIHJlbG9jYXRlYWJsZSBvdXRwdXQgaW4gYSBkaWZmZXJlbnQgb2JqZWN0Ci1maWxlIGZvcm1hdCBpcyBpbXBvc3NpYmxlIGluIHRoZSBnZW5lcmFsIGNhc2UsIHNvIHlvdSBnZW5lcmFsbHkgZG9uJ3QKLWhhdmUgdG8gd29ycnkgYWJvdXQgdGhhdC4gIExpbmtpbmcgaW5wdXQgZmlsZXMgb2YgZGlmZmVyZW50IG9iamVjdCBmaWxlCi1mb3JtYXRzIHRvZ2V0aGVyIGlzIHF1aXRlIHVudXN1YWwsIGJ1dCBpZiB5b3UncmUgcmVhbGx5IGRlZGljYXRlZCB5b3UKLW1heSB3YW50IHRvIGNvbnNpZGVyIHRlc3RpbmcgdGhpcyBjYXNlLCBib3RoIHdoZW4gdGhlIG91dHB1dCBvYmplY3QgZmlsZQotZm9ybWF0IGlzIHRoZSBzYW1lIGFzIHlvdXIgZm9ybWF0LCBhbmQgd2hlbiBpdCBpcyBkaWZmZXJlbnQuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgQkZEIHJlbG9jYXRpb24gY29kZXMKLUBzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGNvZGVzCi0KLUJGRCBoYXMgYW5vdGhlciB3YXkgb2YgZGVzY3JpYmluZyByZWxvY2F0aW9ucyBiZXNpZGVzIHRoZSBob3d0bwotc3RydWN0dXJlcyBkZXNjcmliZWQgYWJvdmU6IHRoZSBlbnVtIEBzYW1we2JmZF9yZWxvY19jb2RlX3JlYWxfdHlwZX0uCi0KLUV2ZXJ5IGtub3duIHJlbG9jYXRpb24gdHlwZSBjYW4gYmUgZGVzY3JpYmVkIGFzIGEgdmFsdWUgaW4gdGhpcwotZW51bWVyYXRpb24uICBUaGUgZW51bWVyYXRpb24gY29udGFpbnMgbWFueSB0YXJnZXQgc3BlY2lmaWMgcmVsb2NhdGlvbnMsCi1idXQgd2hlcmUgdHdvIG9yIG1vcmUgdGFyZ2V0cyBoYXZlIHRoZSBzYW1lIHJlbG9jYXRpb24sIGEgc2luZ2xlIGNvZGUgaXMKLXVzZWQuICBGb3IgZXhhbXBsZSwgdGhlIHNpbmdsZSB2YWx1ZSBAc2FtcHtCRkRfUkVMT0NfMzJ9IGlzIHVzZWQgZm9yIGFsbAotc2ltcGxlIDMyIGJpdCByZWxvY2F0aW9uIHR5cGVzLgotCi1UaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgcmVsb2NhdGlvbiBjb2RlIGlzIHRvIGdpdmUgdGhlIGFzc2VtYmxlciBzb21lCi1tZWNoYW5pc20gdG8gY3JlYXRlIEBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZXMuICBJbiBvcmRlciBmb3IgdGhlCi1hc3NlbWJsZXIgdG8gY3JlYXRlIGFuIEBzYW1we2FyZWxlbnR9IHN0cnVjdHVyZSwgaXQgaGFzIHRvIGJlIGFibGUgdG8KLW9idGFpbiBhIGhvd3RvIHN0cnVjdHVyZS4gIFRoZSBmdW5jdGlvbiBAc2FtcHtiZmRfcmVsb2NfdHlwZV9sb29rdXB9LAotd2hpY2ggc2ltcGx5IGNhbGxzIHRoZSB0YXJnZXQgdmVjdG9yIGVudHJ5IHBvaW50Ci1Ac2FtcHtyZWxvY190eXBlX2xvb2t1cH0sIHRha2VzIGEgcmVsb2NhdGlvbiBjb2RlIGFuZCByZXR1cm5zIGEgaG93dG8KLXN0cnVjdHVyZS4KLQotVGhlIGZ1bmN0aW9uIEBzYW1we2JmZF9nZXRfcmVsb2NfY29kZV9uYW1lfSByZXR1cm5zIHRoZSBuYW1lIG9mIGEKLXJlbG9jYXRpb24gY29kZS4gIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMuCi0KLVVzaW5nIGJvdGggaG93dG8gc3RydWN0dXJlcyBhbmQgcmVsb2NhdGlvbiBjb2RlcyBjYW4gYmUgc29tZXdoYXQKLWNvbmZ1c2luZy4gIFRoZXJlIGFyZSBtYW55IHByb2Nlc3NvciBzcGVjaWZpYyByZWxvY2F0aW9uIGNvZGVzLgotSG93ZXZlciwgdGhlIHJlbG9jYXRpb24gaXMgb25seSBmdWxseSBkZWZpbmVkIGJ5IHRoZSBob3d0byBzdHJ1Y3R1cmUuCi1UaGUgc2FtZSByZWxvY2F0aW9uIGNvZGUgd2lsbCBtYXAgdG8gZGlmZmVyZW50IGhvd3RvIHN0cnVjdHVyZXMgaW4KLWRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGV4YW1wbGUsIHRoZSBhZGRlbmQgaGFuZGxpbmcgbWF5IGJlCi1kaWZmZXJlbnQuCi0KLU1vc3Qgb2YgdGhlIHJlbG9jYXRpb24gY29kZXMgYXJlIG5vdCByZWFsbHkgZ2VuZXJhbC4gIFRoZSBhc3NlbWJsZXIgY2FuCi1ub3QgdXNlIHRoZW0gd2l0aG91dCBhbHJlYWR5IHVuZGVyc3RhbmRpbmcgd2hhdCBzb3J0cyBvZiByZWxvY2F0aW9ucyBjYW4KLWJlIHVzZWQgZm9yIGEgcGFydGljdWxhciB0YXJnZXQuICBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byByZXBsYWNlIHRoZQotcmVsb2NhdGlvbiBjb2RlcyB3aXRoIHNvbWV0aGluZyBzaW1wbGVyLgotCi1Abm9kZSBCRkQgcmVsb2NhdGlvbiBmdXR1cmUKLUBzdWJzZWN0aW9uIEJGRCByZWxvY2F0aW9uIGZ1dHVyZQotCi1DbGVhcmx5IHRoZSBjdXJyZW50IEJGRCByZWxvY2F0aW9uIHN1cHBvcnQgaXMgaW4gYmFkIHNoYXBlLiAgQQotd2hvbGVzY2FsZSByZXdyaXRlIHdvdWxkIGJlIHZlcnkgZGlmZmljdWx0LCBiZWNhdXNlIGl0IHdvdWxkIHJlcXVpcmUKLXRob3JvdWdoIHRlc3Rpbmcgb2YgZXZlcnkgQkZEIHRhcmdldC4gIFNvIHNvbWUgc29ydCBvZiBpbmNyZW1lbnRhbAotY2hhbmdlIGlzIHJlcXVpcmVkLgotCi1NeSB2YWd1ZSB0aG91Z2h0cyBvbiB0aGlzIHdvdWxkIGludm9sdmUgZGVmaW5pbmcgYSBuZXcsIGNsZWFybHkgZGVmaW5lZCwKLWhvd3RvIHN0cnVjdHVyZS4gIFNvbWUgbWVjaGFuaXNtIHdvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHR5cGUKLW9mIGhvd3RvIHN0cnVjdHVyZSB3YXMgYmVpbmcgdXNlZCBieSBhIHBhcnRpY3VsYXIgZm9ybWF0LgotCi1UaGUgbmV3IGhvd3RvIHN0cnVjdHVyZSB3b3VsZCBjbGVhcmx5IGRlZmluZSB0aGUgcmVsb2NhdGlvbiBiZWhhdmlvdXIgaW4KLXRoZSBjYXNlIG9mIGFuIGFzc2VtYmx5LCBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbmQgYSBmaW5hbCBsaW5rLiAgQXQKLWxlYXN0IG9uZSBzcGVjaWFsIGZ1bmN0aW9uIHdvdWxkIGJlIGRlZmluZWQgYXMgYW4gZXNjYXBlLCBhbmQgaXQgbWlnaHQKLW1ha2Ugc2Vuc2UgdG8gZGVmaW5lIG1vcmUuCi0KLU9uZSBvciBtb3JlIGdlbmVyaWMgZnVuY3Rpb25zIHNpbWlsYXIgdG8gQHNhbXB7YmZkX3BlcmZvcm1fcmVsb2NhdGlvbn0KLXdvdWxkIGJlIHdyaXR0ZW4gdG8gaGFuZGxlIHRoZSBuZXcgaG93dG8gc3RydWN0dXJlLgotCi1UaGlzIHNob3VsZCBtYWtlIGl0IHBvc3NpYmxlIHRvIHdyaXRlIGEgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSByZWxvY2F0ZQotc2VjdGlvbiBmdW5jdGlvbnMgdXNlZCBieSB0aGUgbmV3IGxpbmtlci4gIFRoZSB0YXJnZXQgc3BlY2lmaWMgY29kZQotd291bGQgcHJvdmlkZSBzb21lIG1lY2hhbmlzbSAoYSBmdW5jdGlvbiBwb2ludGVyIG9yIGFuIGluaXRpYWwKLWNvbnZlcnNpb24pIHRvIGNvbnZlcnQgdGFyZ2V0IHNwZWNpZmljIHJlbG9jYXRpb25zIGludG8gaG93dG8KLXN0cnVjdHVyZXMuCi0KLUlkZWFsbHkgaXQgd291bGQgYmUgcG9zc2libGUgdG8gdXNlIHRoaXMgZ2VuZXJpYyByZWxvY2F0ZSBzZWN0aW9uCi1mdW5jdGlvbiBmb3IgdGhlIGdlbmVyaWMgbGlua2VyIGFzIHdlbGwuICBUaGF0IGlzLCBpdCB3b3VsZCByZXBsYWNlIHRoZQotQHNhbXB7YmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzfSBmdW5jdGlvbiB3aGljaCBpcwotY3VycmVudGx5IG5vcm1hbGx5IHVzZWQuCi0KLUZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIEVMRiBkeW5hbWljIGxpbmtpbmcsIG1vcmUgY29uc2lkZXJhdGlvbiBuZWVkcyB0bwotYmUgZ2l2ZW4gdG8gd3JpdGluZyBFTEYgc3BlY2lmaWMgYnV0IEVMRiB0YXJnZXQgZ2VuZXJpYyBjb2RlIHRvIGhhbmRsZQotc3BlY2lhbCByZWxvY2F0aW9uIHR5cGVzIHN1Y2ggYXMgR09UIGFuZCBQTFQuCi0KLUBub2RlIEJGRCBFTEYgc3VwcG9ydAotQHNlY3Rpb24gQkZEIEVMRiBzdXBwb3J0Ci1AY2luZGV4IGVsZiBzdXBwb3J0IGluIGJmZAotQGNpbmRleCBiZmQgZWxmIHN1cHBvcnQKLQotVGhlIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiB0d28gcGFydHM6IGEgZ2VuZXJpYyBBQkkgYW5kIGEKLXByb2Nlc3NvciBzcGVjaWZpYyBzdXBwbGVtZW50LiAgVGhlIEVMRiBzdXBwb3J0IGluIEJGRCBpcyBzcGxpdCBpbiBhCi1zaW1pbGFyIGZhc2hpb24uICBUaGUgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQgaXMgbGFyZ2VseSBrZXB0IHdpdGhpbgotYSBzaW5nbGUgZmlsZS4gIFRoZSBnZW5lcmljIHN1cHBvcnQgaXMgcHJvdmlkZWQgYnkgc2V2ZXJhbCBvdGhlciBmaWxlcy4KLVRoZSBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyBhbmQKLWNvbnN0YW50cyB1c2VkIGJ5IHRoZSBnZW5lcmljIHN1cHBvcnQuCi0KLUBtZW51Ci0qIEJGRCBFTEYgc2VjdGlvbnMgYW5kIHNlZ21lbnRzOjoJRUxGIHNlY3Rpb25zIGFuZCBzZWdtZW50cwotKiBCRkQgRUxGIGdlbmVyaWMgc3VwcG9ydDo6CQlCRkQgRUxGIGdlbmVyaWMgc3VwcG9ydAotKiBCRkQgRUxGIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0OjoJQkZEIEVMRiBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydAotKiBCRkQgRUxGIGNvcmUgZmlsZXM6OgkJCUJGRCBFTEYgY29yZSBmaWxlcwotKiBCRkQgRUxGIGZ1dHVyZTo6CQkJQkZEIEVMRiBmdXR1cmUKLUBlbmQgbWVudQotCi1Abm9kZSBCRkQgRUxGIHNlY3Rpb25zIGFuZCBzZWdtZW50cwotQHN1YnNlY3Rpb24gRUxGIHNlY3Rpb25zIGFuZCBzZWdtZW50cwotCi1UaGUgRUxGIEFCSSBwZXJtaXRzIGEgZmlsZSB0byBoYXZlIGVpdGhlciBzZWN0aW9ucyBvciBzZWdtZW50cyBvciBib3RoLgotUmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlcyBjb252ZW50aW9uYWxseSBoYXZlIG9ubHkgc2VjdGlvbnMuCi1FeGVjdXRhYmxlcyBjb252ZW50aW9uYWxseSBoYXZlIGJvdGguICBDb3JlIGZpbGVzIGNvbnZlbnRpb25hbGx5IGhhdmUKLW9ubHkgcHJvZ3JhbSBzZWdtZW50cy4KLQotRUxGIHNlY3Rpb25zIGFyZSBzaW1pbGFyIHRvIHNlY3Rpb25zIGluIG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHM6IHRoZXkKLWhhdmUgYSBuYW1lLCBhIFZNQSwgZmlsZSBjb250ZW50cywgZmxhZ3MsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzCi1pbmZvcm1hdGlvbi4gIEVMRiByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGluIHNlY3Rpb25zIG9mIGEgcGFydGljdWxhcgotdHlwZTsgQkZEIGF1dG9tYXRpY2FsbHkgY29udmVydHMgdGhlc2Ugc2VjdGlvbnMgaW50byBpbnRlcm5hbCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbi4KLQotRUxGIHByb2dyYW0gc2VnbWVudHMgYXJlIGludGVuZGVkIGZvciBmYXN0IGludGVycHJldGF0aW9uIGJ5IGEgc3lzdGVtCi1sb2FkZXIuICBUaGV5IGhhdmUgYSB0eXBlLCBhIFZNQSwgYW4gTE1BLCBmaWxlIGNvbnRlbnRzLCBhbmQgYSBjb3VwbGUgb2YKLW90aGVyIGZpZWxkcy4gIFdoZW4gYW4gRUxGIGV4ZWN1dGFibGUgaXMgcnVuIG9uIGEgVW5peCBzeXN0ZW0sIHRoZQotc3lzdGVtIGxvYWRlciB3aWxsIGV4YW1pbmUgdGhlIHByb2dyYW0gc2VnbWVudHMgdG8gZGVjaWRlIGhvdyB0byBsb2FkCi1pdC4gIFRoZSBsb2FkZXIgd2lsbCBpZ25vcmUgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBMb2FkYWJsZSBwcm9ncmFtCi1zZWdtZW50cyAodHlwZSBAc2FtcHtQVF9MT0FEfSkgYXJlIGRpcmVjdGx5IGxvYWRlZCBpbnRvIG1lbW9yeS4gIE90aGVyCi1wcm9ncmFtIHNlZ21lbnRzIGFyZSBpbnRlcnByZXRlZCBieSB0aGUgbG9hZGVyLCBhbmQgZ2VuZXJhbGx5IHByb3ZpZGUKLWR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4KLQotV2hlbiBhbiBFTEYgZmlsZSBoYXMgYm90aCBwcm9ncmFtIHNlZ21lbnRzIGFuZCBzZWN0aW9ucywgYW4gRUxGIHByb2dyYW0KLXNlZ21lbnQgbWF5IGVuY29tcGFzcyBvbmUgb3IgbW9yZSBFTEYgc2VjdGlvbnMsIGluIHRoZSBzZW5zZSB0aGF0IHRoZQotcG9ydGlvbiBvZiB0aGUgZmlsZSB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgcHJvZ3JhbSBzZWdtZW50IG1heSBpbmNsdWRlCi10aGUgcG9ydGlvbnMgb2YgdGhlIGZpbGUgY29ycmVzcG9uZGluZyB0byBvbmUgb3IgbW9yZSBzZWN0aW9ucy4gIFdoZW4KLXRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc2VjdGlvbiBpbiBhIGxvYWRhYmxlIHByb2dyYW0gc2VnbWVudCwgdGhlCi1yZWxhdGl2ZSBwb3NpdGlvbnMgb2YgdGhlIHNlY3Rpb24gY29udGVudHMgaW4gdGhlIGZpbGUgbXVzdCBjb3JyZXNwb25kCi10byB0aGUgcmVsYXRpdmUgcG9zaXRpb25zIHRoZXkgc2hvdWxkIGhvbGQgd2hlbiB0aGUgcHJvZ3JhbSBzZWdtZW50IGlzCi1sb2FkZWQuICBUaGlzIHJlcXVpcmVtZW50IHNob3VsZCBiZSBvYnZpb3VzIGlmIHlvdSBjb25zaWRlciB0aGF0IHRoZQotc3lzdGVtIGxvYWRlciB3aWxsIGxvYWQgYW4gZW50aXJlIHByb2dyYW0gc2VnbWVudCBhdCBhIHRpbWUuCi0KLU9uIGEgc3lzdGVtIHdoaWNoIHN1cHBvcnRzIGR5bmFtaWMgcGFnaW5nLCBzdWNoIGFzIGFueSBuYXRpdmUgVW5peAotc3lzdGVtLCB0aGUgY29udGVudHMgb2YgYSBsb2FkYWJsZSBwcm9ncmFtIHNlZ21lbnQgbXVzdCBiZSBhdCB0aGUgc2FtZQotb2Zmc2V0IGluIHRoZSBmaWxlIGFzIGluIG1lbW9yeSwgbW9kdWxvIHRoZSBtZW1vcnkgcGFnZSBzaXplIHVzZWQgb24gdGhlCi1zeXN0ZW0uICBUaGlzIGlzIGJlY2F1c2UgdGhlIHN5c3RlbSBsb2FkZXIgd2lsbCBtYXAgdGhlIGZpbGUgaW50byBtZW1vcnkKLXN0YXJ0aW5nIGF0IHRoZSBzdGFydCBvZiBhIHBhZ2UuICBUaGUgc3lzdGVtIGxvYWRlciBjYW4gZWFzaWx5IHJlbWFwCi1lbnRpcmUgcGFnZXMgdG8gdGhlIGNvcnJlY3QgbG9hZCBhZGRyZXNzLiAgSG93ZXZlciwgaWYgdGhlIGNvbnRlbnRzIG9mCi10aGUgZmlsZSB3ZXJlIG5vdCBjb3JyZWN0bHkgYWxpZ25lZCB3aXRoaW4gdGhlIHBhZ2UsIHRoZSBzeXN0ZW0gbG9hZGVyCi13b3VsZCBoYXZlIHRvIHNoaWZ0IHRoZSBjb250ZW50cyBhcm91bmQgd2l0aGluIHRoZSBwYWdlLCB3aGljaCBpcyB0b28KLWV4cGVuc2l2ZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgTE1BIG9mIGEgbG9hZGFibGUgcHJvZ3JhbSBzZWdtZW50IGlzCi1Ac2FtcHsweDQwMDgwfSBhbmQgdGhlIHBhZ2Ugc2l6ZSBpcyBAc2FtcHsweDEwMDB9LCB0aGVuIHRoZSBwb3NpdGlvbiBvZgotdGhlIHNlZ21lbnQgY29udGVudHMgd2l0aGluIHRoZSBmaWxlIG11c3QgZXF1YWwgQHNhbXB7MHg4MH0gbW9kdWxvCi1Ac2FtcHsweDEwMDB9LgotCi1CRkQgaGFzIG9ubHkgYSBzaW5nbGUgc2V0IG9mIHNlY3Rpb25zLiAgSXQgZG9lcyBub3QgcHJvdmlkZSBhbnkgZ2VuZXJpYwotd2F5IHRvIGV4YW1pbmUgYm90aCBzZWN0aW9ucyBhbmQgc2VnbWVudHMuICBXaGVuIEJGRCBpcyB1c2VkIHRvIG9wZW4gYW4KLW9iamVjdCBmaWxlIG9yIGV4ZWN1dGFibGUsIHRoZSBCRkQgc2VjdGlvbnMgd2lsbCByZXByZXNlbnQgRUxGIHNlY3Rpb25zLgotV2hlbiBCRkQgaXMgdXNlZCB0byBvcGVuIGEgY29yZSBmaWxlLCB0aGUgQkZEIHNlY3Rpb25zIHdpbGwgcmVwcmVzZW50Ci1FTEYgcHJvZ3JhbSBzZWdtZW50cy4KLQotV2hlbiBCRkQgaXMgdXNlZCB0byBleGFtaW5lIGFuIG9iamVjdCBmaWxlIG9yIGV4ZWN1dGFibGUsIGFueSBwcm9ncmFtCi1zZWdtZW50cyB3aWxsIGJlIHJlYWQgdG8gc2V0IHRoZSBMTUEgb2YgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyBiZWNhdXNlCi1FTEYgc2VjdGlvbnMgb25seSBoYXZlIGEgVk1BLCB3aGlsZSBFTEYgcHJvZ3JhbSBzZWdtZW50cyBoYXZlIGJvdGggYSBWTUEKLWFuZCBhbiBMTUEuICBBbnkgcHJvZ3JhbSBzZWdtZW50cyB3aWxsIGJlIGNvcGllZCBieSB0aGUKLUBzYW1we2NvcHlfcHJpdmF0ZX0gZW50cnkgcG9pbnRzLiAgVGhleSB3aWxsIGJlIHByaW50ZWQgYnkgdGhlCi1Ac2FtcHtwcmludF9wcml2YXRlfSBlbnRyeSBwb2ludC4gIE90aGVyd2lzZSwgdGhlIHByb2dyYW0gc2VnbWVudHMgYXJlCi1pZ25vcmVkLiAgSW4gcGFydGljdWxhciwgcHJvZ3JhbXMgd2hpY2ggdXNlIEJGRCBjdXJyZW50bHkgaGF2ZSBubyBkaXJlY3QKLWFjY2VzcyB0byB0aGUgcHJvZ3JhbSBzZWdtZW50cy4KLQotV2hlbiBCRkQgaXMgdXNlZCB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSwgdGhlIHByb2dyYW0gc2VnbWVudHMgd2lsbCBiZQotY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBkb25lIGluCi10aGUgZnVuY3Rpb24gQHNhbXB7YXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9zZWdtZW50c30gaW4gQGZpbGV7ZWxmLmN9LgotVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB0d2Vha2VkIG1hbnkgdGltZXMsIGFuZCBwcm9iYWJseSBzdGlsbCBoYXMKLXByb2JsZW1zIHRoYXQgYXJpc2UgaW4gcGFydGljdWxhciBjYXNlcy4KLQotVGhlcmUgaXMgYSBob29rIHdoaWNoIG1heSBiZSB1c2VkIHRvIGV4cGxpY2l0bHkgZGVmaW5lIHRoZSBwcm9ncmFtCi1zZWdtZW50cyB3aGVuIGNyZWF0aW5nIGFuIGV4ZWN1dGFibGU6IHRoZSBAc2FtcHtiZmRfcmVjb3JkX3BoZHJ9Ci1mdW5jdGlvbiBpbiBAZmlsZXtiZmQuY30uICBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgQkZEIHdpbGwgbm90Ci1jcmVhdGUgcHJvZ3JhbSBzZWdtZW50cyBpdHNlbGYsIGJ1dCB3aWxsIG9ubHkgY3JlYXRlIHRoZSBwcm9ncmFtCi1zZWdtZW50cyBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlci4gIFRoZSBsaW5rZXIgdXNlcyB0aGlzIGZ1bmN0aW9uIHRvCi1pbXBsZW1lbnQgdGhlIEBzYW1we1BIRFJTfSBsaW5rZXIgc2NyaXB0IGNvbW1hbmQuCi0KLUBub2RlIEJGRCBFTEYgZ2VuZXJpYyBzdXBwb3J0Ci1Ac3Vic2VjdGlvbiBCRkQgRUxGIGdlbmVyaWMgc3VwcG9ydAotCi1JbiBnZW5lcmFsLCBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IHJlYWQgZXh0ZXJuYWwgZGF0YSBmcm9tIHRoZSBFTEYgZmlsZQotYXJlIGZvdW5kIGluIEBmaWxle2VsZi5jfS4gIFRoZXkgb3BlcmF0ZSBvbiB0aGUgaW50ZXJuYWwgZm9ybXMgb2YgdGhlCi1FTEYgc3RydWN0dXJlcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gQGZpbGV7aW5jbHVkZS9lbGYvaW50ZXJuYWwuaH0uICBUaGUKLWludGVybmFsIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gdGVybXMgb2YgQHNhbXB7YmZkX3ZtYX0sIGFuZCBzbyBtYXkKLWJlIHVzZWQgZm9yIGJvdGggMzIgYml0IGFuZCA2NCBiaXQgRUxGIHRhcmdldHMuCi0KLVRoZSBmaWxlIEBmaWxle2VsZmNvZGUuaH0gY29udGFpbnMgZnVuY3Rpb25zIHdoaWNoIG9wZXJhdGUgb24gdGhlCi1leHRlcm5hbCBkYXRhLiAgQGZpbGV7ZWxmY29kZS5ofSBpcyBjb21waWxlZCB0d2ljZSwgb25jZSB2aWEKLUBmaWxle2VsZjMyLmN9IHdpdGggQHNhbXB7QVJDSF9TSVpFfSBkZWZpbmVkIGFzIEBzYW1wezMyfSwgYW5kIG9uY2UgdmlhCi1AZmlsZXtlbGY2NC5jfSB3aXRoIEBzYW1we0FSQ0hfU0laRX0gZGVmaW5lZCBhcyBAc2FtcHs2NH0uCi1AZmlsZXtlbGZjb2RlLmh9IGluY2x1ZGVzIGZ1bmN0aW9ucyB0byBzd2FwIHRoZSBFTEYgc3RydWN0dXJlcyBpbiBhbmQKLW91dCBvZiBleHRlcm5hbCBmb3JtLCBhcyB3ZWxsIGFzIGEgZmV3IG1vcmUgY29tcGxleCBmdW5jdGlvbnMuCi0KLUxpbmtlciBzdXBwb3J0IGlzIGZvdW5kIGluIEBmaWxle2VsZmxpbmsuY30gYW5kIEBmaWxle2VsZmxpbmsuaH0uICBUaGUKLWxhdHRlciBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBmb3IgYm90aCAzMiBhbmQgNjQgYml0IHN1cHBvcnQuICBUaGUKLWxpbmtlciBzdXBwb3J0IGlzIG9ubHkgdXNlZCBpZiB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIGZpbGUgZGVmaW5lcwotQHNhbXB7ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbn0sIHdoaWNoIGlzIHJlcXVpcmVkIHRvIHJlbG9jYXRlIHRoZQotc2VjdGlvbiBjb250ZW50cy4gIElmIHRoYXQgbWFjcm8gaXMgbm90IGRlZmluZWQsIHRoZSBnZW5lcmljIGxpbmtlciBjb2RlCi1pcyB1c2VkLCBhbmQgcmVsb2NhdGlvbnMgYXJlIGhhbmRsZWQgdmlhIEBzYW1we2JmZF9wZXJmb3JtX3JlbG9jYXRpb259LgotCi1UaGUgY29yZSBmaWxlIHN1cHBvcnQgaXMgaW4gQGZpbGV7ZWxmY29yZS5ofSwgd2hpY2ggaXMgY29tcGlsZWQgdHdpY2UsCi1mb3IgYm90aCAzMiBhbmQgNjQgYml0IHN1cHBvcnQuICBUaGUgbW9yZSBpbnRlcmVzdGluZyBjYXNlcyBvZiBjb3JlIGZpbGUKLXN1cHBvcnQgb25seSB3b3JrIG9uIGEgbmF0aXZlIHN5c3RlbSB3aGljaCBoYXMgdGhlIEBmaWxle3N5cy9wcm9jZnMuaH0KLWhlYWRlciBmaWxlLiAgV2l0aG91dCB0aGF0IGZpbGUsIHRoZSBjb3JlIGZpbGUgc3VwcG9ydCBkb2VzIGxpdHRsZSBtb3JlCi10aGFuIHJlYWQgdGhlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGFzIEJGRCBzZWN0aW9ucy4KLQotVGhlIEJGRCBpbnRlcm5hbCBoZWFkZXIgZmlsZSBAZmlsZXtlbGYtYmZkLmh9IGlzIHVzZWQgZm9yIGNvbW11bmljYXRpb24KLWFtb25nIHRoZXNlIGZpbGVzIGFuZCB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIGZpbGVzLgotCi1UaGUgZGVmYXVsdCBlbnRyaWVzIGZvciB0aGUgQkZEIEVMRiB0YXJnZXQgdmVjdG9yIGFyZSBmb3VuZCBtYWlubHkgaW4KLUBmaWxle2VsZi5jfS4gIFNvbWUgZnVuY3Rpb25zIGFyZSBmb3VuZCBpbiBAZmlsZXtlbGZjb2RlLmh9LgotCi1UaGUgcHJvY2Vzc29yIHNwZWNpZmljIGZpbGVzIG1heSBvdmVycmlkZSBwYXJ0aWN1bGFyIGVudHJpZXMgaW4gdGhlCi10YXJnZXQgdmVjdG9yLCBidXQgbW9zdCBkbyBub3QsIHdpdGggb25lIGV4Y2VwdGlvbjogdGhlCi1Ac2FtcHtiZmRfcmVsb2NfdHlwZV9sb29rdXB9IGVudHJ5IHBvaW50IGlzIGFsd2F5cyBwcm9jZXNzb3Igc3BlY2lmaWMuCi0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLUBzdWJzZWN0aW9uIEJGRCBFTEYgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLQotQnkgY29udmVudGlvbiwgdGhlIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IGZvciBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yCi13aWxsIGJlIGZvdW5kIGluIEBmaWxle2VsZkB2YXJ7bm59LUB2YXJ7Y3B1fS5jfSwgd2hlcmUgQHZhcntubn0gaXMKLWVpdGhlciAzMiBvciA2NCwgYW5kIEB2YXJ7Y3B1fSBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvY2Vzc29yLgotCi1AbWVudQotKiBCRkQgRUxGIHByb2Nlc3NvciByZXF1aXJlZDo6CVJlcXVpcmVkIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0Ci0qIEJGRCBFTEYgcHJvY2Vzc29yIGxpbmtlcjo6CVByb2Nlc3NvciBzcGVjaWZpYyBsaW5rZXIgc3VwcG9ydAotKiBCRkQgRUxGIHByb2Nlc3NvciBvdGhlcjo6CU90aGVyIHByb2Nlc3NvciBzcGVjaWZpYyBzdXBwb3J0IG9wdGlvbnMKLUBlbmQgbWVudQotCi1Abm9kZSBCRkQgRUxGIHByb2Nlc3NvciByZXF1aXJlZAotQHN1YnN1YnNlY3Rpb24gUmVxdWlyZWQgcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBvcnQKLQotV2hlbiB3cml0aW5nIGEgQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9IGZpbGUsIHlvdSBtdXN0IGRvIHRoZQotZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotRGVmaW5lIGVpdGhlciBAc2FtcHtUQVJHRVRfQklHX1NZTX0gb3IgQHNhbXB7VEFSR0VUX0xJVFRMRV9TWU19LCBvcgotYm90aCwgdG8gYSB1bmlxdWUgQyBuYW1lIHRvIHVzZSBmb3IgdGhlIHRhcmdldCB2ZWN0b3IuICBUaGlzIG5hbWUgc2hvdWxkCi1hcHBlYXIgaW4gdGhlIGxpc3Qgb2YgdGFyZ2V0IHZlY3RvcnMgaW4gQGZpbGV7dGFyZ2V0cy5jfSwgYW5kIHdpbGwgYWxzbwotaGF2ZSB0byBhcHBlYXIgaW4gQGZpbGV7Y29uZmlnLmJmZH0gYW5kIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBEZWZpbmUKLUBzYW1we1RBUkdFVF9CSUdfU1lNfSBmb3IgYSBiaWctZW5kaWFuIHByb2Nlc3NvciwKLUBzYW1we1RBUkdFVF9MSVRUTEVfU1lNfSBmb3IgYSBsaXR0bGUtZW5kaWFuIHByb2Nlc3NvciwgYW5kIGRlZmluZSBib3RoCi1mb3IgYSBiaS1lbmRpYW4gcHJvY2Vzc29yLgotQGl0ZW0KLURlZmluZSBlaXRoZXIgQHNhbXB7VEFSR0VUX0JJR19OQU1FfSBvciBAc2FtcHtUQVJHRVRfTElUVExFX05BTUV9LCBvcgotYm90aCwgdG8gYSBzdHJpbmcgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHZlY3Rvci4gIFRoaXMgaXMgdGhlCi1uYW1lIHdoaWNoIGEgdXNlciBvZiB0aGUgQkZEIHRvb2wgd291bGQgdXNlIHRvIHNwZWNpZnkgdGhlIG9iamVjdCBmaWxlCi1mb3JtYXQuICBJdCB3b3VsZCBub3JtYWxseSBhcHBlYXIgaW4gYSBsaW5rZXIgZW11bGF0aW9uIHBhcmFtZXRlcnMKLWZpbGUuCi1AaXRlbQotRGVmaW5lIEBzYW1we0VMRl9BUkNIfSB0byB0aGUgQkZEIGFyY2hpdGVjdHVyZSAoYW4gZWxlbWVudCBvZiB0aGUKLUBzYW1we2JmZF9hcmNoaXRlY3R1cmV9IGVudW0sIHR5cGljYWxseSBAc2FtcHtiZmRfYXJjaF9AdmFye2NwdX19KS4KLUBpdGVtCi1EZWZpbmUgQHNhbXB7RUxGX01BQ0hJTkVfQ09ERX0gdG8gdGhlIG1hZ2ljIG51bWJlciB3aGljaCBzaG91bGQgYXBwZWFyCi1pbiB0aGUgQHNhbXB7ZV9tYWNoaW5lfSBmaWVsZCBvZiB0aGUgRUxGIGhlYWRlci4gIEFzIG9mIHRoaXMgd3JpdGluZywKLXRoZXNlIG1hZ2ljIG51bWJlcnMgYXJlIGFzc2lnbmVkIGJ5IFNDTzsgaWYgeW91IHdhbnQgdG8gZ2V0IGEgbWFnaWMKLW51bWJlciBmb3IgYSBwYXJ0aWN1bGFyIHByb2Nlc3NvciwgdHJ5IHNlbmRpbmcgYSBub3RlIHRvCi1AZW1haWx7cmVnaXN0cnlAQHNjby5jb219LiAgSW4gdGhlIEJGRCBzb3VyY2VzLCB0aGUgbWFnaWMgbnVtYmVycyBhcmUKLWZvdW5kIGluIEBmaWxle2luY2x1ZGUvZWxmL2NvbW1vbi5ofTsgdGhleSBoYXZlIG5hbWVzIGJlZ2lubmluZyB3aXRoCi1Ac2FtcHtFTV99LgotQGl0ZW0KLURlZmluZSBAc2FtcHtFTEZfTUFYUEFHRVNJWkV9IHRvIHRoZSBtYXhpbXVtIHNpemUgb2YgYSB2aXJ0dWFsIHBhZ2UgaW4KLW1lbW9yeS4gIFRoaXMgY2FuIG5vcm1hbGx5IGJlIGZvdW5kIGF0IHRoZSBzdGFydCBvZiBjaGFwdGVyIDUgaW4gdGhlCi1wcm9jZXNzb3Igc3BlY2lmaWMgc3VwcGxlbWVudC4gIEZvciBhIHByb2Nlc3NvciB3aGljaCB3aWxsIG9ubHkgYmUgdXNlZAotaW4gYW4gZW1iZWRkZWQgc3lzdGVtLCBvciB3aGljaCBoYXMgbm8gbWVtb3J5IG1hbmFnZW1lbnQgaGFyZHdhcmUsIHRoaXMKLWNhbiBzaW1wbHkgYmUgQHNhbXB7MX0uCi1AaXRlbQotSWYgdGhlIGZvcm1hdCBzaG91bGQgdXNlIEBzYW1we1JlbH0gcmF0aGVyIHRoYW4gQHNhbXB7UmVsYX0gcmVsb2NhdGlvbnMsCi1kZWZpbmUgQHNhbXB7VVNFX1JFTH0uICBUaGlzIGlzIG5vcm1hbGx5IGRlZmluZWQgaW4gY2hhcHRlciA0IG9mIHRoZQotcHJvY2Vzc29yIHNwZWNpZmljIHN1cHBsZW1lbnQuCi0KLUluIHRoZSBhYnNlbmNlIG9mIGEgc3VwcGxlbWVudCwgaXQncyBlYXNpZXIgdG8gd29yayB3aXRoIEBzYW1we1JlbGF9Ci1yZWxvY2F0aW9ucy4gIEBzYW1we1JlbGF9IHJlbG9jYXRpb25zIHdpbGwgcmVxdWlyZSBtb3JlIHNwYWNlIGluIG9iamVjdAotZmlsZXMgKGJ1dCBub3QgaW4gZXhlY3V0YWJsZXMsIGV4Y2VwdCB3aGVuIHVzaW5nIGR5bmFtaWMgbGlua2luZykuCi1Ib3dldmVyLCB0aGlzIGlzIG91dHdlaWdoZWQgYnkgdGhlIHNpbXBsaWNpdHkgb2YgYWRkZW5kIGhhbmRsaW5nIHdoZW4KLXVzaW5nIEBzYW1we1JlbGF9IHJlbG9jYXRpb25zLiAgV2l0aCBAc2FtcHtSZWx9IHJlbG9jYXRpb25zLCB0aGUgYWRkZW5kCi1tdXN0IGJlIHN0b3JlZCBpbiB0aGUgc2VjdGlvbiBjb250ZW50cywgd2hpY2ggbWFrZXMgcmVsb2NhdGVhYmxlIGxpbmtzCi1tb3JlIGNvbXBsZXguCi0KLUZvciBleGFtcGxlLCBjb25zaWRlciBDIGNvZGUgbGlrZSBAY29kZXtpID0gYVsxMDAwXTt9IHdoZXJlIEBzYW1we2F9IGlzCi1hIGdsb2JhbCBhcnJheS4gIFRoZSBpbnN0cnVjdGlvbnMgd2hpY2ggbG9hZCB0aGUgdmFsdWUgb2YgQHNhbXB7YVsxMDAwXX0KLXdpbGwgbW9zdCBsaWtlbHkgdXNlIGEgcmVsb2NhdGlvbiB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbAotcmVwcmVzZW50aW5nIEBzYW1we2F9LCB3aXRoIGFuIGFkZGVuZCB0aGF0IGdpdmVzIHRoZSBvZmZzZXQgZnJvbSB0aGUKLXN0YXJ0IG9mIEBzYW1we2F9IHRvIGVsZW1lbnQgQHNhbXB7MTAwMH0uICBXaGVuIHVzaW5nIEBzYW1we1JlbH0KLXJlbG9jYXRpb25zLCB0aGF0IGFkZGVuZCBtdXN0IGJlIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb25zIHRoZW1zZWx2ZXMuCi1JZiB5b3UgYXJlIGFkZGluZyBzdXBwb3J0IGZvciBhIFJJU0MgY2hpcCB3aGljaCB1c2VzIHR3byBvciBtb3JlCi1pbnN0cnVjdGlvbnMgdG8gbG9hZCBhbiBhZGRyZXNzLCB0aGVuIHRoZSBhZGRlbmQgbWF5IG5vdCBmaXQgaW4gYSBzaW5nbGUKLWluc3RydWN0aW9uLCBhbmQgd2lsbCBoYXZlIHRvIGJlIHNvbWVob3cgc3BsaXQgYW1vbmcgdGhlIGluc3RydWN0aW9ucy4KLVRoaXMgbWFrZXMgbGlua2luZyBhd2t3YXJkLCBwYXJ0aWN1bGFybHkgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rCi1pbiB3aGljaCB0aGUgYWRkZW5kIG1heSBoYXZlIHRvIGJlIHVwZGF0ZWQuICBJdCBjYW4gYmUgZG9uZS0tLXRoZSBNSVBTCi1FTEYgc3VwcG9ydCBkb2VzIGl0LS0tYnV0IGl0IHNob3VsZCBiZSBhdm9pZGVkIHdoZW4gcG9zc2libGUuCi0KLUl0IGlzIHBvc3NpYmxlLCB0aG91Z2ggc29tZXdoYXQgYXdrd2FyZCwgdG8gc3VwcG9ydCBib3RoIEBzYW1we1JlbH0gYW5kCi1Ac2FtcHtSZWxhfSByZWxvY2F0aW9ucyBmb3IgYSBzaW5nbGUgdGFyZ2V0OyBAZmlsZXtlbGY2NC1taXBzLmN9IGRvZXMgaXQKLWJ5IG92ZXJyaWRpbmcgdGhlIHJlbG9jYXRpb24gcmVhZGluZyBhbmQgd3JpdGluZyByb3V0aW5lcy4KLUBpdGVtCi1EZWZpbmUgaG93dG8gc3RydWN0dXJlcyBmb3IgYWxsIHRoZSByZWxvY2F0aW9uIHR5cGVzLgotQGl0ZW0KLURlZmluZSBhIEBzYW1we2JmZF9yZWxvY190eXBlX2xvb2t1cH0gcm91dGluZS4gIFRoaXMgbXVzdCBiZSBuYW1lZAotQHNhbXB7YmZkX2VsZkB2YXJ7bm59X2JmZF9yZWxvY190eXBlX2xvb2t1cH0sIGFuZCBtYXkgYmUgZWl0aGVyIGEKLWZ1bmN0aW9uIG9yIGEgbWFjcm8uICBJdCBtdXN0IHRyYW5zbGF0ZSBhIEJGRCByZWxvY2F0aW9uIGNvZGUgaW50byBhCi1ob3d0byBzdHJ1Y3R1cmUuICBUaGlzIGlzIG5vcm1hbGx5IGEgdGFibGUgbG9va3VwIG9yIGEgc2ltcGxlIHN3aXRjaC4KLUBpdGVtCi1JZiB1c2luZyBAc2FtcHtSZWx9IHJlbG9jYXRpb25zLCBkZWZpbmUgQHNhbXB7ZWxmX2luZm9fdG9faG93dG9fcmVsfS4KLUlmIHVzaW5nIEBzYW1we1JlbGF9IHJlbG9jYXRpb25zLCBkZWZpbmUgQHNhbXB7ZWxmX2luZm9fdG9faG93dG99LgotRWl0aGVyIHdheSwgdGhpcyBpcyBhIG1hY3JvIGRlZmluZWQgYXMgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiB3aGljaAotdGFrZXMgYW4gQHNhbXB7YXJlbGVudH0gYW5kIGEgQHNhbXB7UmVsfSBvciBAc2FtcHtSZWxhfSBzdHJ1Y3R1cmUsIGFuZAotc2V0cyB0aGUgQHNhbXB7aG93dG99IGZpZWxkIG9mIHRoZSBAc2FtcHthcmVsZW50fSBiYXNlZCBvbiB0aGUKLUBzYW1we1JlbH0gb3IgQHNhbXB7UmVsYX0gc3RydWN0dXJlLiAgVGhpcyBpcyBub3JtYWxseSB1c2VzCi1Ac2FtcHtFTEZAdmFye25ufV9SX1RZUEV9IHRvIGdldCB0aGUgRUxGIHJlbG9jYXRpb24gdHlwZSBhbmQgdXNlcyBpdCBhcwotYW4gaW5kZXggaW50byBhIHRhYmxlIG9mIGhvd3RvIHN0cnVjdHVyZXMuCi1AZW5kIGl0ZW1pemUKLQotWW91IG11c3QgYWxzbyBhZGQgdGhlIG1hZ2ljIG51bWJlciBmb3IgdGhpcyBwcm9jZXNzb3IgdG8gdGhlCi1Ac2FtcHtwcmVwX2hlYWRlcnN9IGZ1bmN0aW9uIGluIEBmaWxle2VsZi5jfS4KLQotWW91IG11c3QgYWxzbyBjcmVhdGUgYSBoZWFkZXIgZmlsZSBpbiB0aGUgQGZpbGV7aW5jbHVkZS9lbGZ9IGRpcmVjdG9yeQotY2FsbGVkIEBmaWxle0B2YXJ7Y3B1fS5ofS4gIFRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIGFueSB0YXJnZXQgc3BlY2lmaWMgCi1pbmZvcm1hdGlvbiB3aGljaCBtYXkgYmUgbmVlZGVkIG91dHNpZGUgb2YgdGhlIEJGRCBjb2RlLiAgSW4gcGFydGljdWxhcgotaXQgc2hvdWxkIHVzZSB0aGUgQHNhbXB7U1RBUlRfUkVMT0NfTlVNQkVSU30sIEBzYW1we1JFTE9DX05VTUJFUn0sCi1Ac2FtcHtGQUtFX1JFTE9DfSwgQHNhbXB7RU1QVFlfUkVMT0N9IGFuZCBAc2FtcHtFTkRfUkVMT0NfTlVNQkVSU30KLW1hY3JvcyB0byBjcmVhdGUgYSB0YWJsZSBtYXBwaW5nIHRoZSBudW1iZXIgdXNlZCB0byBpbmRlbnRpZnkgYQotcmVsb2NhdGlvbiB0byBhIG5hbWUgZGVzY3JpYmluZyB0aGF0IHJlbG9jYXRpb24uCi0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIGxpbmtlcgotQHN1YnN1YnNlY3Rpb24gUHJvY2Vzc29yIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0Ci0KLVRoZSBsaW5rZXIgd2lsbCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IGlmIHlvdSBkZWZpbmUgYSByZWxvY2F0ZSBzZWN0aW9uCi1mdW5jdGlvbi4gIFRoaXMgd2lsbCBwZXJtaXQgQkZEIHRvIHVzZSB0aGUgRUxGIHNwZWNpZmljIGxpbmtlciBzdXBwb3J0LgotCi1JZiB5b3UgZG8gbm90IGRlZmluZSBhIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24sIEJGRCBtdXN0IHVzZSB0aGUKLWdlbmVyaWMgbGlua2VyIHN1cHBvcnQsIHdoaWNoIHJlcXVpcmVzIGNvbnZlcnRpbmcgYWxsIHN5bWJvbHMgYW5kCi1yZWxvY2F0aW9ucyBpbnRvIEJGRCBAc2FtcHthc3ltYm9sfSBhbmQgQHNhbXB7YXJlbGVudH0gc3RydWN0dXJlcy4gIEluCi10aGlzIGNhc2UsIHJlbG9jYXRpb25zIHdpbGwgYmUgaGFuZGxlZCBieSBjYWxsaW5nCi1Ac2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSwgd2hpY2ggd2lsbCB1c2UgdGhlIGhvd3RvIHN0cnVjdHVyZXMgeW91Ci1oYXZlIGRlZmluZWQuICBAeHJlZntCRkQgcmVsb2NhdGlvbiBoYW5kbGluZ30uCi0KLUluIG9yZGVyIHRvIHN1cHBvcnQgbGlua2luZyBpbnRvIGEgZGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdCwgc3VjaCBhcwotUy1yZWNvcmRzLCBAc2FtcHtiZmRfcGVyZm9ybV9yZWxvY2F0aW9ufSBtdXN0IHdvcmsgY29ycmVjdGx5IHdpdGggeW91cgotaG93dG8gc3RydWN0dXJlcywgc28geW91IGNhbid0IHNraXAgdGhhdCBzdGVwLiAgSG93ZXZlciwgaWYgeW91IGRlZmluZQotdGhlIHJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24sIHRoZW4gaW4gdGhlIG5vcm1hbCBjYXNlIG9mIGxpbmtpbmcgaW50bwotYW4gRUxGIGZpbGUgdGhlIGxpbmtlciB3aWxsIG5vdCBuZWVkIHRvIGNvbnZlcnQgc3ltYm9scyBhbmQgcmVsb2NhdGlvbnMsCi1hbmQgd2lsbCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50LgotCi1UbyB1c2UgYSByZWxvY2F0aW9uIHNlY3Rpb24gZnVuY3Rpb24sIGRlZmluZSB0aGUgbWFjcm8KLUBzYW1we2VsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb259IGFzIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gd2hpY2ggd2lsbAotdGFrZSB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLCBhcyB3ZWxsIGFzIHJlbG9jYXRpb24sIHN5bWJvbCwgYW5kIG90aGVyCi1pbmZvcm1hdGlvbiwgYW5kIG1vZGlmeSB0aGUgc2VjdGlvbiBjb250ZW50cyBhY2NvcmRpbmcgdG8gdGhlIHJlbG9jYXRpb24KLWluZm9ybWF0aW9uLiAgSW4gc2ltcGxlIGNhc2VzLCB0aGlzIGlzIGxpdHRsZSBtb3JlIHRoYW4gYSBsb29wIG92ZXIgdGhlCi1yZWxvY2F0aW9ucyB3aGljaCBjb21wdXRlcyB0aGUgdmFsdWUgb2YgZWFjaCByZWxvY2F0aW9uIGFuZCBjYWxscwotQHNhbXB7X2JmZF9maW5hbF9saW5rX3JlbG9jYXRlfS4gIFRoZSBmdW5jdGlvbiBtdXN0IGNoZWNrIGZvciBhCi1yZWxvY2F0ZWFibGUgbGluaywgYW5kIGluIHRoYXQgY2FzZSBub3JtYWxseSBuZWVkcyB0byBkbyBub3RoaW5nIG90aGVyCi10aGFuIGFkanVzdCB0aGUgYWRkZW5kIGZvciByZWxvY2F0aW9ucyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wuCi0KLVRoZSBjb21wbGV4IGNhc2VzIGdlbmVyYWxseSBoYXZlIHRvIGRvIHdpdGggZHluYW1pYyBsaW5rZXIgc3VwcG9ydC4gIEdPVAotYW5kIFBMVCByZWxvY2F0aW9ucyBtdXN0IGJlIGhhbmRsZWQgc3BlY2lhbGx5LCBhbmQgdGhlIGxpbmtlciBub3JtYWxseQotYXJyYW5nZXMgdG8gc2V0IHVwIHRoZSBHT1QgYW5kIFBMVCBzZWN0aW9ucyB3aGlsZSBoYW5kbGluZyByZWxvY2F0aW9ucy4KLVdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCByYW5kb20gcmVsb2NhdGlvbnMgbXVzdCBub3JtYWxseSBiZQotY29waWVkIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LCBvciBjb252ZXJ0ZWQgdG8gUkVMQVRJVkUgcmVsb2NhdGlvbnMKLXdoZW4gcG9zc2libGUuCi0KLUBub2RlIEJGRCBFTEYgcHJvY2Vzc29yIG90aGVyCi1Ac3Vic3Vic2VjdGlvbiBPdGhlciBwcm9jZXNzb3Igc3BlY2lmaWMgc3VwcG9ydCBvcHRpb25zCi0KLVRoZXJlIGFyZSBtYW55IG90aGVyIG1hY3JvcyB3aGljaCBtYXkgYmUgZGVmaW5lZCBpbgotQGZpbGV7ZWxmQHZhcntubn0tQHZhcntjcHV9LmN9LiAgVGhlc2UgbWFjcm9zIG1heSBiZSBmb3VuZCBpbgotQGZpbGV7ZWxmeHgtdGFyZ2V0Lmh9LgotCi1NYWNyb3MgbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgc29tZSBvZiB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0IHZlY3RvcgotZnVuY3Rpb25zLgotCi1TZXZlcmFsIHByb2Nlc3NvciBzcGVjaWZpYyBob29rIGZ1bmN0aW9ucyB3aGljaCBtYXkgYmUgZGVmaW5lZCBhcwotbWFjcm9zLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3VuZCBhcyBmdW5jdGlvbiBwb2ludGVycyBpbiB0aGUKLUBzYW1we2VsZl9iYWNrZW5kX2RhdGF9IHN0cnVjdHVyZSBkZWZpbmVkIGluIEBmaWxle2VsZi1iZmQuaH0uICBJbgotZ2VuZXJhbCwgYSBob29rIGZ1bmN0aW9uIGlzIHNldCBieSBkZWZpbmluZyBhIG1hY3JvCi1Ac2FtcHtlbGZfYmFja2VuZF9AdmFye25hbWV9fS4KLQotVGhlcmUgYXJlIGEgZmV3IHByb2Nlc3NvciBzcGVjaWZpYyBjb25zdGFudHMgd2hpY2ggbWF5IGFsc28gYmUgZGVmaW5lZC4KLVRoZXNlIGFyZSBhZ2FpbiBmb3VuZCBpbiB0aGUgQHNhbXB7ZWxmX2JhY2tlbmRfZGF0YX0gc3RydWN0dXJlLgotCi1JIHdpbGwgbm90IGRlZmluZSB0aGUgdmFyaW91cyBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyBoZXJlOyBzZWUgdGhlCi1jb21tZW50cyBpbiBAZmlsZXtlbGYtYmZkLmh9LgotCi1Ob3JtYWxseSBhbnkgb2RkIGNoYXJhY3RlcmlzdGljIG9mIGEgcGFydGljdWxhciBFTEYgcHJvY2Vzc29yIGlzIGhhbmRsZWQKLXZpYSBhIGhvb2sgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgdGhlIHNwZWNpYWwgQHNhbXB7U0hOX01JUFNfU0NPTU1PTn0KLXNlY3Rpb24gbnVtYmVyIGZvdW5kIGluIE1JUFMgRUxGIGlzIGhhbmRsZWQgdmlhIHRoZSBob29rcwotQHNhbXB7c2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9ufSwgQHNhbXB7c3ltYm9sX3Byb2Nlc3Npbmd9LAotQHNhbXB7YWRkX3N5bWJvbF9ob29rfSwgYW5kIEBzYW1we291dHB1dF9zeW1ib2xfaG9va30uCi0KLUR5bmFtaWMgbGlua2luZyBzdXBwb3J0LCB3aGljaCBpbnZvbHZlcyBwcm9jZXNzb3Igc3BlY2lmaWMgcmVsb2NhdGlvbnMKLXJlcXVpcmluZyBzcGVjaWFsIGhhbmRsaW5nLCBpcyBhbHNvIGltcGxlbWVudGVkIHZpYSBob29rIGZ1bmN0aW9ucy4KLQotQG5vZGUgQkZEIEVMRiBjb3JlIGZpbGVzCi1Ac3Vic2VjdGlvbiBCRkQgRUxGIGNvcmUgZmlsZXMKLUBjaW5kZXggZWxmIGNvcmUgZmlsZXMKLQotT24gbmF0aXZlIEVMRiBVbml4IHN5c3RlbXMsIGNvcmUgZmlsZXMgYXJlIGdlbmVyYXRlZCB3aXRob3V0IGFueQotc2VjdGlvbnMuICBJbnN0ZWFkLCB0aGV5IG9ubHkgaGF2ZSBwcm9ncmFtIHNlZ21lbnRzLgotCi1XaGVuIEJGRCBpcyB1c2VkIHRvIHJlYWQgYW4gRUxGIGNvcmUgZmlsZSwgdGhlIEJGRCBzZWN0aW9ucyB3aWxsCi1hY3R1YWxseSByZXByZXNlbnQgcHJvZ3JhbSBzZWdtZW50cy4gIFNpbmNlIEVMRiBwcm9ncmFtIHNlZ21lbnRzIGRvIG5vdAotaGF2ZSBuYW1lcywgQkZEIHdpbGwgaW52ZW50IG5hbWVzIGxpa2UgQHNhbXB7c2VnbWVudEB2YXJ7bn19IHdoZXJlCi1AdmFye259IGlzIGEgbnVtYmVyLgotCi1BIHNpbmdsZSBFTEYgcHJvZ3JhbSBzZWdtZW50IG1heSBpbmNsdWRlIGJvdGggYW4gaW5pdGlhbGl6ZWQgcGFydCBhbmQgYW4KLXVuaW5pdGlhbGl6ZWQgcGFydC4gIFRoZSBzaXplIG9mIHRoZSBpbml0aWFsaXplZCBwYXJ0IGlzIGdpdmVuIGJ5IHRoZQotQHNhbXB7cF9maWxlc3p9IGZpZWxkLiAgVGhlIHRvdGFsIHNpemUgb2YgdGhlIHNlZ21lbnQgaXMgZ2l2ZW4gYnkgdGhlCi1Ac2FtcHtwX21lbXN6fSBmaWVsZC4gIElmIEBzYW1we3BfbWVtc3p9IGlzIGxhcmdlciB0aGFuIEBzYW1we3BfZmlsZXN6fSwKLXRoZW4gdGhlIGV4dHJhIHNwYWNlIGlzIHVuaW5pdGlhbGl6ZWQsIG9yLCBtb3JlIHByZWNpc2VseSwgaW5pdGlhbGl6ZWQKLXRvIHplcm8uCi0KLUJGRCB3aWxsIHJlcHJlc2VudCBzdWNoIGEgcHJvZ3JhbSBzZWdtZW50IGFzIHR3byBkaWZmZXJlbnQgc2VjdGlvbnMuCi1UaGUgZmlyc3QsIG5hbWVkIEBzYW1we3NlZ21lbnRAdmFye259YX0sIHdpbGwgcmVwcmVzZW50IHRoZSBpbml0aWFsaXplZAotcGFydCBvZiB0aGUgcHJvZ3JhbSBzZWdtZW50LiAgVGhlIHNlY29uZCwgbmFtZWQgQHNhbXB7c2VnbWVudEB2YXJ7bn1ifSwKLXdpbGwgcmVwcmVzZW50IHRoZSB1bmluaXRpYWxpemVkIHBhcnQuCi0KLUVMRiBjb3JlIGZpbGVzIHN0b3JlIHNwZWNpYWwgaW5mb3JtYXRpb24gc3VjaCBhcyByZWdpc3RlciB2YWx1ZXMgaW4KLXByb2dyYW0gc2VnbWVudHMgd2l0aCB0aGUgdHlwZSBAc2FtcHtQVF9OT1RFfS4gIEJGRCB3aWxsIGF0dGVtcHQgdG8KLWludGVycHJldCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlc2Ugc2VnbWVudHMsIGFuZCB3aWxsIGNyZWF0ZSBhZGRpdGlvbmFsCi1zZWN0aW9ucyBob2xkaW5nIHRoZSBpbmZvcm1hdGlvbi4gIFNvbWUgb2YgdGhpcyBpbnRlcnByZXRhdGlvbiByZXF1aXJlcwotaW5mb3JtYXRpb24gZm91bmQgaW4gdGhlIGhvc3QgaGVhZGVyIGZpbGUgQGZpbGV7c3lzL3Byb2Nmcy5ofSwgYW5kIHNvCi13aWxsIG9ubHkgd29yayB3aGVuIEJGRCBpcyBidWlsdCBvbiBhIG5hdGl2ZSBzeXN0ZW0uCi0KLUJGRCBkb2VzIG5vdCBjdXJyZW50bHkgcHJvdmlkZSBhbnkgd2F5IHRvIGNyZWF0ZSBhbiBFTEYgY29yZSBmaWxlLiAgSW4KLWdlbmVyYWwsIEJGRCBkb2VzIG5vdCBwcm92aWRlIGEgd2F5IHRvIGNyZWF0ZSBjb3JlIGZpbGVzLiAgVGhlIHdheSB0bwotaW1wbGVtZW50IHRoaXMgd291bGQgYmUgdG8gd3JpdGUgQHNhbXB7YmZkX3NldF9mb3JtYXR9IGFuZAotQHNhbXB7YmZkX3dyaXRlX2NvbnRlbnRzfSByb3V0aW5lcyBmb3IgdGhlIEBzYW1we2JmZF9jb3JlfSB0eXBlOyBzZWUKLUByZWZ7QkZEIHRhcmdldCB2ZWN0b3IgZm9ybWF0fS4KLQotQG5vZGUgQkZEIEVMRiBmdXR1cmUKLUBzdWJzZWN0aW9uIEJGRCBFTEYgZnV0dXJlCi0KLVRoZSBjdXJyZW50IGR5bmFtaWMgbGlua2luZyBzdXBwb3J0IGhhcyB0b28gbXVjaCBjb2RlIGR1cGxpY2F0aW9uLgotV2hpbGUgZWFjaCBwcm9jZXNzb3IgaGFzIHBhcnRpY3VsYXIgZGlmZmVyZW5jZXMsIG11Y2ggb2YgdGhlIGR5bmFtaWMKLWxpbmtpbmcgc3VwcG9ydCBpcyBxdWl0ZSBzaW1pbGFyIGZvciBlYWNoIHByb2Nlc3Nvci4gIFRoZSBHT1QgYW5kIFBMVAotYXJlIGhhbmRsZWQgaW4gZmFpcmx5IHNpbWlsYXIgd2F5cywgdGhlIGRldGFpbHMgb2YgLUJzeW1ib2xpYyBsaW5raW5nCi1hcmUgZ2VuZXJhbGx5IHNpbWlsYXIsIGV0Yy4gIFRoaXMgY29kZSBzaG91bGQgYmUgcmV3b3JrZWQgdG8gdXNlIG1vcmUKLWdlbmVyaWMgZnVuY3Rpb25zLCBlbGltaW5hdGluZyB0aGUgZHVwbGljYXRpb24uCi0KLVNpbWlsYXJseSwgdGhlIHJlbG9jYXRpb24gaGFuZGxpbmcgaGFzIHRvbyBtdWNoIGR1cGxpY2F0aW9uLiAgTWFueSBvZgotdGhlIEBzYW1we3JlbG9jX3R5cGVfbG9va3VwfSBhbmQgQHNhbXB7aW5mb190b19ob3d0b30gZnVuY3Rpb25zIGFyZQotcXVpdGUgc2ltaWxhci4gIFRoZSByZWxvY2F0ZSBzZWN0aW9uIGZ1bmN0aW9ucyBhcmUgYWxzbyBvZnRlbiBxdWl0ZQotc2ltaWxhciwgYm90aCBpbiB0aGUgc3RhbmRhcmQgbGlua2VyIGhhbmRsaW5nIGFuZCB0aGUgZHluYW1pYyBsaW5rZXIKLWhhbmRsaW5nLiAgTWFueSBvZiB0aGUgQ09GRiBwcm9jZXNzb3Igc3BlY2lmaWMgYmFja2VuZHMgc2hhcmUgYSBzaW5nbGUKLXJlbG9jYXRlIHNlY3Rpb24gZnVuY3Rpb24gKEBzYW1we19iZmRfY29mZl9nZW5lcmljX3JlbG9jYXRlX3NlY3Rpb259KSwKLWFuZCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpcyBmb3IgdGhlIEVMRiB0YXJnZXRzCi1hcyB3ZWxsLgotCi1UaGUgYXBwZWFyYW5jZSBvZiB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIG1hZ2ljIG51bWJlciBpbgotQHNhbXB7cHJlcF9oZWFkZXJzfSBpbiBAZmlsZXtlbGYuY30gaXMgc29tZXdoYXQgYm9ndXMuICBJdCBzaG91bGQgYmUKLXBvc3NpYmxlIHRvIGFkZCBzdXBwb3J0IGZvciBhIG5ldyBwcm9jZXNzb3Igd2l0aG91dCBjaGFuZ2luZyB0aGUgZ2VuZXJpYwotc3VwcG9ydC4KLQotVGhlIHByb2Nlc3NvciBmdW5jdGlvbiBob29rcyBhbmQgY29uc3RhbnRzIGFyZSBhZCBob2MgYW5kIG5lZWQgYmV0dGVyCi1kb2N1bWVudGF0aW9uLgotCi1XaGVuIGEgbGlua2VyIHNjcmlwdCB1c2VzIEBzYW1we1NJWkVPRl9IRUFERVJTfSwgdGhlIEVMRiBiYWNrZW5kIG11c3QKLWd1ZXNzIGF0IHRoZSBudW1iZXIgb2YgcHJvZ3JhbSBzZWdtZW50cyB3aGljaCB3aWxsIGJlIHJlcXVpcmVkLCBpbgotQHNhbXB7Z2V0X3Byb2dyYW1faGVhZGVyX3NpemV9LiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBsaW5rZXIgY2FsbHMKLUBzYW1we2JmZF9zaXplb2ZfaGVhZGVyc30gYmVmb3JlIGl0IGtub3dzIGFsbCB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgYW5kCi1zaXplcy4gIFRoZSBFTEYgYmFja2VuZCBtYXkgbGF0ZXIgZGlzY292ZXIsIHdoZW4gY3JlYXRpbmcgcHJvZ3JhbQotc2VnbWVudHMsIHRoYXQgbW9yZSBwcm9ncmFtIHNlZ21lbnRzIGFyZSByZXF1aXJlZC4gIFRoaXMgaXMgY3VycmVudGx5Ci1yZXBvcnRlZCBhcyBhbiBlcnJvciBpbiBAc2FtcHthc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzfS4KLQotSW4gcHJhY3RpY2UgdGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gdXNlIEBzYW1we1NJWkVPRl9IRUFERVJTfSBleGNlcHQKLXdpdGggYSBjYXJlZnVsbHkgZGVmaW5lZCBsaW5rZXIgc2NyaXB0LiAgVW5mb3J0dW5hdGVseSwKLUBzYW1we1NJWkVPRl9IRUFERVJTfSBpcyByZXF1aXJlZCBmb3IgZmFzdCBwcm9ncmFtIGxvYWRpbmcgb24gYSBuYXRpdmUKLXN5c3RlbSwgc2luY2UgaXQgcGVybWl0cyB0aGUgaW5pdGlhbCBjb2RlIHNlY3Rpb24gdG8gYXBwZWFyIG9uIHRoZSBzYW1lCi1wYWdlIGFzIHRoZSBwcm9ncmFtIHNlZ21lbnRzLCBzYXZpbmcgYSBwYWdlIHJlYWQgd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMKLXJ1bm5pbmcuICBGb3J0dW5hdGVseSwgbmF0aXZlIHN5c3RlbXMgcGVybWl0IGNhcmVmdWwgZGVmaW5pdGlvbiBvZiB0aGUKLWxpbmtlciBzY3JpcHQuICBTdGlsbCwgaWRlYWxseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgcmVsYXhhdGlvbiB0bwotY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHByb2dyYW0gc2VnbWVudHMuCi0KLUBub2RlIEJGRCBnbG9zc2FyeQotQHNlY3Rpb24gQkZEIGdsb3NzYXJ5Ci1AY2luZGV4IGdsb3NzYXJ5IGZvciBiZmQKLUBjaW5kZXggYmZkIGdsb3NzYXJ5Ci0KLVRoaXMgaXMgYSBzaG9ydCBnbG9zc2FyeSBvZiBzb21lIEJGRCB0ZXJtcy4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBhLm91dAotVGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZSBvcmlnaW5hbCBVbml4IG9iamVjdCBmaWxlIGZvcm1hdC4KLVN0aWxsIHVzZWQgb24gU3VuT1MsIHRob3VnaCBub3QgU29sYXJpcy4gIFN1cHBvcnRzIG9ubHkgdGhyZWUgc2VjdGlvbnMuCi0KLUBpdGVtIGFyY2hpdmUKLUEgY29sbGVjdGlvbiBvZiBvYmplY3QgZmlsZXMgcHJvZHVjZWQgYW5kIG1hbmlwdWxhdGVkIGJ5IHRoZSBAc2FtcHthcn0KLXByb2dyYW0uCi0KLUBpdGVtIGJhY2tlbmQKLVRoZSBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gQkZEIG9mIGEgcGFydGljdWxhciBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUKLXNldCBvZiBmdW5jdGlvbnMgd2hpY2ggYXBwZWFyIGluIGEgcGFydGljdWxhciB0YXJnZXQgdmVjdG9yLgotCi1AaXRlbSBCRkQKLVRoZSBCRkQgbGlicmFyeSBpdHNlbGYuICBBbHNvLCBlYWNoIG9iamVjdCBmaWxlLCBhcmNoaXZlLCBvciBleGVjdGFibGUKLW9wZW5lZCBieSB0aGUgQkZEIGxpYnJhcnkgaGFzIHRoZSB0eXBlIEBzYW1we2JmZCAqfSwgYW5kIGlzIHNvbWV0aW1lcwotcmVmZXJyZWQgdG8gYXMgYSBiZmQuCi0KLUBpdGVtIENPRkYKLVRoZSBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBVbml4IFNWUjMuICBVc2VkIGJ5IHNvbWUKLWVtYmVkZGVkIHRhcmdldHMsIGFsdGhvdWdoIEVMRiBpcyBub3JtYWxseSBiZXR0ZXIuCi0KLUBpdGVtIERMTAotQSBzaGFyZWQgbGlicmFyeSBvbiBXaW5kb3dzLgotCi1AaXRlbSBkeW5hbWljIGxpbmtlcgotV2hlbiBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSBpcyBydW4sIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBsb2NhdGUgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBsaWJyYXJ5IGFuZCBhcnJhbmdlIHRvIHNvbWVob3cKLWluY2x1ZGUgaXQgaW4gdGhlIHJ1bm5pbmcgaW1hZ2UuCi0KLUBpdGVtIGR5bmFtaWMgb2JqZWN0Ci1Bbm90aGVyIG5hbWUgZm9yIGFuIEVMRiBzaGFyZWQgbGlicmFyeS4KLQotQGl0ZW0gRUNPRkYKLVRoZSBFeHRlbmRlZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0LiAgVXNlZCBvbiBBbHBoYSBEaWdpdGFsIFVuaXgKLShmb3JtZXJseSBPU0YvMSksIGFzIHdlbGwgYXMgVWx0cml4IGFuZCBJcml4IDQuICBBIHZhcmlhbnQgb2YgQ09GRi4KLQotQGl0ZW0gRUxGCi1UaGUgRXhlY3V0YWJsZSBhbmQgTGlua2luZyBGb3JtYXQuICBUaGUgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZWQgb24gbW9zdAotbW9kZXJuIFVuaXggc3lzdGVtcywgaW5jbHVkaW5nIEdOVS9MaW51eCwgU29sYXJpcywgSXJpeCwgYW5kIFNWUjQuICBBbHNvCi11c2VkIG9uIG1hbnkgZW1iZWRkZWQgc3lzdGVtcy4KLQotQGl0ZW0gZXhlY3V0YWJsZQotQSBwcm9ncmFtLCB3aXRoIGluc3RydWN0aW9ucyBhbmQgc3ltYm9scywgYW5kIHBlcmhhcHMgZHluYW1pYyBsaW5raW5nCi1pbmZvcm1hdGlvbi4gIE5vcm1hbGx5IHByb2R1Y2VkIGJ5IGEgbGlua2VyLgotCi1AaXRlbSBMTUEKLUxvYWQgTWVtb3J5IEFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIGEgc2VjdGlvbiB3aWxsIGJlCi1sb2FkZWQuICBDb21wYXJlIHdpdGggVk1BLCBiZWxvdy4KLQotQGl0ZW0gTkxNCi1OZXRXYXJlIExvYWRhYmxlIE1vZHVsZS4gIFVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBhbiBvYmplY3Qgd2hpY2gKLWJlIGxvYWRlZCBpbnRvIE5ldFdhcmUsIHdoaWNoIGlzIHNvbWUga2luZCBvZiBQQyBiYXNlZCBuZXR3b3JrIHNlcnZlcgotcHJvZ3JhbS4KLQotQGl0ZW0gb2JqZWN0IGZpbGUKLUEgYmluYXJ5IGZpbGUgaW5jbHVkaW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbgotaW5mb3JtYXRpb24uICBOb3JtYWxseSBwcm9kdWNlZCBieSBhbiBhc3NlbWJsZXIuCi0KLUBpdGVtIG9iamVjdCBmaWxlIGZvcm1hdAotVGhlIGZvcm1hdCBvZiBhbiBvYmplY3QgZmlsZS4gIFR5cGljYWxseSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzCi1mb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbSBhcmUgaW4gdGhlIHNhbWUgZm9ybWF0LCBhbHRob3VnaCBleGVjdXRhYmxlcwotd2lsbCBub3QgY29udGFpbiBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gUEUKLVRoZSBQb3J0YWJsZSBFeGVjdXRhYmxlIGZvcm1hdC4gIFRoaXMgaXMgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCB1c2VkIGZvcgotV2luZG93cyAoc3BlY2lmaWNhbGx5LCBXaW4zMikgb2JqZWN0IGZpbGVzLiAgSXQgaXMgYmFzZWQgY2xvc2VseSBvbgotQ09GRiwgYnV0IGhhcyBhIGZldyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcy4KLQotQGl0ZW0gUEVJCi1UaGUgUG9ydGFibGUgRXhlY3V0YWJsZSBJbWFnZSBmb3JtYXQuICBUaGlzIGlzIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQKLXVzZWQgZm9yIFdpbmRvd3MgKHNwZWNpZmljYWxseSwgV2luMzIpIGV4ZWN1dGFibGVzLiAgSXQgaXMgdmVyeSBzaW1pbGFyCi10byBQRSwgYnV0IGluY2x1ZGVzIHNvbWUgYWRkaXRpb25hbCBoZWFkZXIgaW5mb3JtYXRpb24uCi0KLUBpdGVtIHJlbG9jYXRpb25zCi1JbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gYWRqdXN0IHNlY3Rpb24gY29udGVudHMuICBBbHNvIGNhbGxlZAotcmVsb2NzLgotCi1AaXRlbSBzZWN0aW9uCi1PYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGUgYXJlIGNvbXBvc2VkIG9mIHNlY3Rpb25zLiAgU2VjdGlvbnMgaGF2ZQotb3B0aW9uYWwgZGF0YSBhbmQgb3B0aW9uYWwgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gc2hhcmVkIGxpYnJhcnkKLUEgbGlicmFyeSBvZiBmdW5jdGlvbnMgd2hpY2ggbWF5IGJlIHVzZWQgYnkgbWFueSBleGVjdXRhYmxlcyB3aXRob3V0Ci1hY3R1YWxseSBiZWluZyBsaW5rZWQgaW50byBlYWNoIGV4ZWN1dGFibGUuICBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQKLWltcGxlbWVudGF0aW9ucyBvZiBzaGFyZWQgbGlicmFyaWVzLCBlYWNoIGhhdmluZyBzbGlnaHRseSBkaWZmZXJlbnQKLWZlYXR1cmVzLgotCi1AaXRlbSBzeW1ib2wKLUVhY2ggb2JqZWN0IGZpbGUgYW5kIGV4ZWN1dGFibGUgbWF5IGhhdmUgYSBsaXN0IG9mIHN5bWJvbHMsIG9mdGVuCi1yZWZlcnJlZCB0byBhcyB0aGUgc3ltYm9sIHRhYmxlLiAgQSBzeW1ib2wgaXMgYmFzaWNhbGx5IGEgbmFtZSBhbmQgYW4KLWFkZHJlc3MuICBUaGVyZSBtYXkgYWxzbyBiZSBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbGlrZSB0aGUgdHlwZSBvZgotc3ltYm9sLCBhbHRob3VnaCB0aGUgdHlwZSBvZiBhIHN5bWJvbCBpcyBub3JtYWxseSBzb21ldGhpbmcgc2ltcGxlIGxpa2UKLWZ1bmN0aW9uIG9yIG9iamVjdCwgYW5kIHNob3VsZCBiZSBjb25mdXNlZCB3aXRoIHRoZSBtb3JlIGNvbXBsZXggQwotbm90aW9uIG9mIHR5cGUuICBUeXBpY2FsbHkgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBpbiBhIEMKLXByb2dyYW0gd2lsbCBoYXZlIGFuIGFzc29jaWF0ZWQgc3ltYm9sLgotCi1AaXRlbSB0YXJnZXQgdmVjdG9yCi1BIHNldCBvZiBmdW5jdGlvbnMgd2hpY2ggaW1wbGVtZW50IHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciBvYmplY3QgZmlsZQotZm9ybWF0LiAgVGhlIEBzYW1we2JmZF90YXJnZXR9IHN0cnVjdHVyZS4KLQotQGl0ZW0gV2luMzIKLVRoZSBjdXJyZW50IFdpbmRvd3MgQVBJLCBpbXBsZW1lbnRlZCBieSBXaW5kb3dzIDk1IGFuZCBsYXRlciBhbmQgV2luZG93cwotTlQgMy41MSBhbmQgbGF0ZXIsIGJ1dCBub3QgYnkgV2luZG93cyAzLjEuCi0KLUBpdGVtIFhDT0ZGCi1UaGUgZVh0ZW5kZWQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdC4gIFVzZWQgb24gQUlYLiAgQSB2YXJpYW50IG9mCi1DT0ZGLCB3aXRoIGEgY29tcGxldGVseSBkaWZmZXJlbnQgc3ltYm9sIHRhYmxlIGltcGxlbWVudGF0aW9uLgotCi1AaXRlbSBWTUEKLVZpcnR1YWwgTWVtb3J5IEFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGEgc2VjdGlvbiB3aWxsIGhhdmUgd2hlbgotYW4gZXhlY3V0YWJsZSBpcyBydW4uICBDb21wYXJlIHdpdGggTE1BLCBhYm92ZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkc2VjIEluZGV4Ci1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2JmZC9kb2MvYmZkc3VtbS50ZXhpIGIvYmZkL2RvYy9iZmRzdW1tLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NDUzMWEuLjAwMDAwMDAKLS0tIGEvYmZkL2RvYy9iZmRzdW1tLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotQGMgVGhpcyBzdW1tYXJ5IG9mIEJGRCBpcyBzaGFyZWQgYnkgdGhlIEJGRCBhbmQgTEQgZG9jcy4KLVdoZW4gYW4gb2JqZWN0IGZpbGUgaXMgb3BlbmVkLCBCRkQgc3Vicm91dGluZXMgYXV0b21hdGljYWxseSBkZXRlcm1pbmUKLXRoZSBmb3JtYXQgb2YgdGhlIGlucHV0IG9iamVjdCBmaWxlLiAgVGhleSB0aGVuIGJ1aWxkIGEgZGVzY3JpcHRvciBpbgotbWVtb3J5IHdpdGggcG9pbnRlcnMgdG8gcm91dGluZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIGVsZW1lbnRzIG9mCi10aGUgb2JqZWN0IGZpbGUncyBkYXRhIHN0cnVjdHVyZXMuCi0KLUFzIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0aGUgb2JqZWN0IGZpbGVzIGlzIHJlcXVpcmVkLAotQkZEIHJlYWRzIGZyb20gZGlmZmVyZW50IHNlY3Rpb25zIG9mIHRoZSBmaWxlIGFuZCBwcm9jZXNzZXMgdGhlbS4KLUZvciBleGFtcGxlLCBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbiBmb3IgdGhlIGxpbmtlciBpcyBwcm9jZXNzaW5nIHN5bWJvbAotdGFibGVzLiAgRWFjaCBCRkQgYmFjayBlbmQgcHJvdmlkZXMgYSByb3V0aW5lIGZvciBjb252ZXJ0aW5nCi1iZXR3ZWVuIHRoZSBvYmplY3QgZmlsZSdzIHJlcHJlc2VudGF0aW9uIG9mIHN5bWJvbHMgYW5kIGFuIGludGVybmFsCi1jYW5vbmljYWwgZm9ybWF0LiBXaGVuIHRoZSBsaW5rZXIgYXNrcyBmb3IgdGhlIHN5bWJvbCB0YWJsZSBvZiBhbiBvYmplY3QKLWZpbGUsIGl0IGNhbGxzIHRocm91Z2ggYSBtZW1vcnkgcG9pbnRlciB0byB0aGUgcm91dGluZSBmcm9tIHRoZQotcmVsZXZhbnQgQkZEIGJhY2sgZW5kIHdoaWNoIHJlYWRzIGFuZCBjb252ZXJ0cyB0aGUgdGFibGUgaW50byBhIGNhbm9uaWNhbAotZm9ybS4gIFRoZSBsaW5rZXIgdGhlbiBvcGVyYXRlcyB1cG9uIHRoZSBjYW5vbmljYWwgZm9ybS4gV2hlbiB0aGUgbGluayBpcwotZmluaXNoZWQgYW5kIHRoZSBsaW5rZXIgd3JpdGVzIHRoZSBvdXRwdXQgZmlsZSdzIHN5bWJvbCB0YWJsZSwKLWFub3RoZXIgQkZEIGJhY2sgZW5kIHJvdXRpbmUgaXMgY2FsbGVkIHRvIHRha2UgdGhlIG5ld2x5Ci1jcmVhdGVkIHN5bWJvbCB0YWJsZSBhbmQgY29udmVydCBpdCBpbnRvIHRoZSBjaG9zZW4gb3V0cHV0IGZvcm1hdC4KLQotQG1lbnUKLSogQkZEIGluZm9ybWF0aW9uIGxvc3M6OglJbmZvcm1hdGlvbiBMb3NzCi0qIENhbm9uaWNhbCBmb3JtYXQ6OgkJVGhlIEJGRAljYW5vbmljYWwgb2JqZWN0LWZpbGUgZm9ybWF0IAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBpbmZvcm1hdGlvbiBsb3NzCi1Ac3Vic2VjdGlvbiBJbmZvcm1hdGlvbiBMb3NzCi0KLUBlbXBoe0luZm9ybWF0aW9uIGNhbiBiZSBsb3N0IGR1cmluZyBvdXRwdXQufSBUaGUgb3V0cHV0IGZvcm1hdHMKLXN1cHBvcnRlZCBieSBCRkQgZG8gbm90IHByb3ZpZGUgaWRlbnRpY2FsIGZhY2lsaXRpZXMsIGFuZAotaW5mb3JtYXRpb24gd2hpY2ggY2FuIGJlIGRlc2NyaWJlZCBpbiBvbmUgZm9ybSBoYXMgbm93aGVyZSB0byBnbyBpbgotYW5vdGhlciBmb3JtYXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgYWxpZ25tZW50IGluZm9ybWF0aW9uIGluCi1AY29kZXtiLm91dH0uIFRoZXJlIGlzIG5vd2hlcmUgaW4gYW4gQGNvZGV7YS5vdXR9IGZvcm1hdCBmaWxlIHRvIHN0b3JlCi1hbGlnbm1lbnQgaW5mb3JtYXRpb24gb24gdGhlIGNvbnRhaW5lZCBkYXRhLCBzbyB3aGVuIGEgZmlsZSBpcyBsaW5rZWQKLWZyb20gQGNvZGV7Yi5vdXR9IGFuZCBhbiBAY29kZXthLm91dH0gaW1hZ2UgaXMgcHJvZHVjZWQsIGFsaWdubWVudAotaW5mb3JtYXRpb24gd2lsbCBub3QgcHJvcGFnYXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4gKFRoZSBsaW5rZXIgd2lsbAotc3RpbGwgdXNlIHRoZSBhbGlnbm1lbnQgaW5mb3JtYXRpb24gaW50ZXJuYWxseSwgc28gdGhlIGxpbmsgaXMgcGVyZm9ybWVkCi1jb3JyZWN0bHkpLgotCi1Bbm90aGVyIGV4YW1wbGUgaXMgQ09GRiBzZWN0aW9uIG5hbWVzLiBDT0ZGIGZpbGVzIG1heSBjb250YWluIGFuCi11bmxpbWl0ZWQgbnVtYmVyIG9mIHNlY3Rpb25zLCBlYWNoIG9uZSB3aXRoIGEgdGV4dHVhbCBzZWN0aW9uIG5hbWUuIElmCi10aGUgdGFyZ2V0IG9mIHRoZSBsaW5rIGlzIGEgZm9ybWF0IHdoaWNoIGRvZXMgbm90IGhhdmUgbWFueSBzZWN0aW9ucyAoZS5nLiwKLUBjb2Rle2Eub3V0fSkgb3IgaGFzIHNlY3Rpb25zIHdpdGhvdXQgbmFtZXMgKGUuZy4sIHRoZSBPYXN5cyBmb3JtYXQpLCB0aGUKLWxpbmsgY2Fubm90IGJlIGRvbmUgc2ltcGx5LiBZb3UgY2FuIGNpcmN1bXZlbnQgdGhpcyBwcm9ibGVtIGJ5Ci1kZXNjcmliaW5nIHRoZSBkZXNpcmVkIGlucHV0LXRvLW91dHB1dCBzZWN0aW9uIG1hcHBpbmcgd2l0aCB0aGUgbGlua2VyIGNvbW1hbmQKLWxhbmd1YWdlLgotCi1AZW1waHtJbmZvcm1hdGlvbiBjYW4gYmUgbG9zdCBkdXJpbmcgY2Fub25pY2FsaXphdGlvbi59IFRoZSBCRkQKLWludGVybmFsIGNhbm9uaWNhbCBmb3JtIG9mIHRoZSBleHRlcm5hbCBmb3JtYXRzIGlzIG5vdCBleGhhdXN0aXZlOyB0aGVyZQotYXJlIHN0cnVjdHVyZXMgaW4gaW5wdXQgZm9ybWF0cyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gZGlyZWN0Ci1yZXByZXNlbnRhdGlvbiBpbnRlcm5hbGx5LiAgVGhpcyBtZWFucyB0aGF0IHRoZSBCRkQgYmFjayBlbmRzCi1jYW5ub3QgbWFpbnRhaW4gYWxsIHBvc3NpYmxlIGRhdGEgcmljaG5lc3MgdGhyb3VnaCB0aGUgdHJhbnNmb3JtYXRpb24KLWJldHdlZW4gZXh0ZXJuYWwgdG8gaW50ZXJuYWwgYW5kIGJhY2sgdG8gZXh0ZXJuYWwgZm9ybWF0cy4KLQotVGhpcyBsaW1pdGF0aW9uIGlzIG9ubHkgYSBwcm9ibGVtIHdoZW4gYW4gYXBwbGljYXRpb24gcmVhZHMgb25lCi1mb3JtYXQgYW5kIHdyaXRlcyBhbm90aGVyLiAgRWFjaCBCRkQgYmFjayBlbmQgaXMgcmVzcG9uc2libGUgZm9yCi1tYWludGFpbmluZyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCB0aGUgaW50ZXJuYWwgQkZECi1jYW5vbmljYWwgZm9ybSBoYXMgc3RydWN0dXJlcyB3aGljaCBhcmUgb3BhcXVlIHRvIHRoZSBCRkQgY29yZSwKLWFuZCBleHBvcnRlZCBvbmx5IHRvIHRoZSBiYWNrIGVuZHMuIFdoZW4gYSBmaWxlIGlzIHJlYWQgaW4gb25lIGZvcm1hdCwKLXRoZSBjYW5vbmljYWwgZm9ybSBpcyBnZW5lcmF0ZWQgZm9yIEJGRCBhbmQgdGhlIGFwcGxpY2F0aW9uLiBBdCB0aGUKLXNhbWUgdGltZSwgdGhlIGJhY2sgZW5kIHNhdmVzIGF3YXkgYW55IGluZm9ybWF0aW9uIHdoaWNoIG1heSBvdGhlcndpc2UKLWJlIGxvc3QuIElmIHRoZSBkYXRhIGlzIHRoZW4gd3JpdHRlbiBiYWNrIGluIHRoZSBzYW1lIGZvcm1hdCwgdGhlIGJhY2sKLWVuZCByb3V0aW5lIHdpbGwgYmUgYWJsZSB0byB1c2UgdGhlIGNhbm9uaWNhbCBmb3JtIHByb3ZpZGVkIGJ5IHRoZQotQkZEIGNvcmUgYXMgd2VsbCBhcyB0aGUgaW5mb3JtYXRpb24gaXQgcHJlcGFyZWQgZWFybGllci4gIFNpbmNlCi10aGVyZSBpcyBhIGdyZWF0IGRlYWwgb2YgY29tbW9uYWxpdHkgYmV0d2VlbiBiYWNrIGVuZHMsCi10aGVyZSBpcyBubyBpbmZvcm1hdGlvbiBsb3N0IHdoZW4KLWxpbmtpbmcgb3IgY29weWluZyBiaWcgZW5kaWFuIENPRkYgdG8gbGl0dGxlIGVuZGlhbiBDT0ZGLCBvciBAY29kZXthLm91dH0gdG8KLUBjb2Rle2Iub3V0fS4gIFdoZW4gYSBtaXh0dXJlIG9mIGZvcm1hdHMgaXMgbGlua2VkLCB0aGUgaW5mb3JtYXRpb24gaXMKLW9ubHkgbG9zdCBmcm9tIHRoZSBmaWxlcyB3aG9zZSBmb3JtYXQgZGlmZmVycyBmcm9tIHRoZSBkZXN0aW5hdGlvbi4KLQotQG5vZGUgQ2Fub25pY2FsIGZvcm1hdAotQHN1YnNlY3Rpb24gVGhlIEJGRCBjYW5vbmljYWwgb2JqZWN0LWZpbGUgZm9ybWF0Ci0KLVRoZSBncmVhdGVzdCBwb3RlbnRpYWwgZm9yIGxvc3Mgb2YgaW5mb3JtYXRpb24gb2NjdXJzIHdoZW4gdGhlcmUgaXMgdGhlIGxlYXN0Ci1vdmVybGFwIGJldHdlZW4gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UgZm9ybWF0LCB0aGF0Ci1zdG9yZWQgYnkgdGhlIGNhbm9uaWNhbCBmb3JtYXQsIGFuZCB0aGF0IG5lZWRlZCBieSB0aGUKLWRlc3RpbmF0aW9uIGZvcm1hdC4gQSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgY2Fub25pY2FsIGZvcm0gbWF5IGhlbHAKLXlvdSB1bmRlcnN0YW5kIHdoaWNoIGtpbmRzIG9mIGRhdGEgeW91IGNhbiBjb3VudCBvbiBwcmVzZXJ2aW5nIGFjcm9zcwotY29udmVyc2lvbnMuCi1AY2luZGV4IEJGRCBjYW5vbmljYWwgZm9ybWF0Ci1AY2luZGV4IGludGVybmFsIG9iamVjdC1maWxlIGZvcm1hdAotCi1AdGFibGUgQGVtcGgKLUBpdGVtIGZpbGVzCi1JbmZvcm1hdGlvbiBzdG9yZWQgb24gYSBwZXItZmlsZSBiYXNpcyBpbmNsdWRlcyB0YXJnZXQgbWFjaGluZQotYXJjaGl0ZWN0dXJlLCBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9uIGZvcm1hdCB0eXBlLCBhIGRlbWFuZCBwYWdlYWJsZQotYml0LCBhbmQgYSB3cml0ZSBwcm90ZWN0ZWQgYml0LiAgSW5mb3JtYXRpb24gbGlrZSBVbml4IG1hZ2ljIG51bWJlcnMgaXMKLW5vdCBzdG9yZWQgaGVyZS0tLW9ubHkgdGhlIG1hZ2ljIG51bWJlcnMnIG1lYW5pbmcsIHNvIGEgQGNvZGV7Wk1BR0lDfQotZmlsZSB3b3VsZCBoYXZlIGJvdGggdGhlIGRlbWFuZCBwYWdlYWJsZSBiaXQgYW5kIHRoZSB3cml0ZSBwcm90ZWN0ZWQKLXRleHQgYml0IHNldC4gIFRoZSBieXRlIG9yZGVyIG9mIHRoZSB0YXJnZXQgaXMgc3RvcmVkIG9uIGEgcGVyLWZpbGUKLWJhc2lzLCBzbyB0aGF0IGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gb2JqZWN0IGZpbGVzIG1heSBiZSB1c2VkIHdpdGggb25lCi1hbm90aGVyLgotCi1AaXRlbSBzZWN0aW9ucwotRWFjaCBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uLCB0aGUKLXNlY3Rpb24ncyBvcmlnaW5hbCBhZGRyZXNzIGluIHRoZSBvYmplY3QgZmlsZSwgc2l6ZSBhbmQgYWxpZ25tZW50Ci1pbmZvcm1hdGlvbiwgdmFyaW91cyBmbGFncywgYW5kIHBvaW50ZXJzIGludG8gb3RoZXIgQkZEIGRhdGEKLXN0cnVjdHVyZXMuCi0KLUBpdGVtIHN5bWJvbHMKLUVhY2ggc3ltYm9sIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBvYmplY3QgZmlsZQotd2hpY2ggb3JpZ2luYWxseSBkZWZpbmVkIGl0LCBpdHMgbmFtZSwgaXRzIHZhbHVlLCBhbmQgdmFyaW91cyBmbGFnCi1iaXRzLiAgV2hlbiBhIEJGRCBiYWNrIGVuZCByZWFkcyBpbiBhIHN5bWJvbCB0YWJsZSwgaXQgcmVsb2NhdGVzIGFsbAotc3ltYm9scyB0byBtYWtlIHRoZW0gcmVsYXRpdmUgdG8gdGhlIGJhc2Ugb2YgdGhlIHNlY3Rpb24gd2hlcmUgdGhleSB3ZXJlCi1kZWZpbmVkLiAgRG9pbmcgdGhpcyBlbnN1cmVzIHRoYXQgZWFjaCBzeW1ib2wgcG9pbnRzIHRvIGl0cyBjb250YWluaW5nCi1zZWN0aW9uLiAgRWFjaCBzeW1ib2wgYWxzbyBoYXMgYSB2YXJ5aW5nIGFtb3VudCBvZiBoaWRkZW4gcHJpdmF0ZSBkYXRhCi1mb3IgdGhlIEJGRCBiYWNrIGVuZC4gIFNpbmNlIHRoZSBzeW1ib2wgcG9pbnRzIHRvIHRoZSBvcmlnaW5hbCBmaWxlLCB0aGUKLXByaXZhdGUgZGF0YSBmb3JtYXQgZm9yIHRoYXQgc3ltYm9sIGlzIGFjY2Vzc2libGUuICBAY29kZXtsZH0gY2FuCi1vcGVyYXRlIG9uIGEgY29sbGVjdGlvbiBvZiBzeW1ib2xzIG9mIHdpbGRseSBkaWZmZXJlbnQgZm9ybWF0cyB3aXRob3V0Ci1wcm9ibGVtcy4KLQotTm9ybWFsIGdsb2JhbCBhbmQgc2ltcGxlIGxvY2FsIHN5bWJvbHMgYXJlIG1haW50YWluZWQgb24gb3V0cHV0LCBzbyBhbgotb3V0cHV0IGZpbGUgKG5vIG1hdHRlciBpdHMgZm9ybWF0KSB3aWxsIHJldGFpbiBzeW1ib2xzIHBvaW50aW5nIHRvCi1mdW5jdGlvbnMgYW5kIHRvIGdsb2JhbCwgc3RhdGljLCBhbmQgY29tbW9uIHZhcmlhYmxlcy4gIFNvbWUgc3ltYm9sCi1pbmZvcm1hdGlvbiBpcyBub3Qgd29ydGggcmV0YWluaW5nOyBpbiBAY29kZXthLm91dH0sIHR5cGUgaW5mb3JtYXRpb24gaXMKLXN0b3JlZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGFzIGxvbmcgc3ltYm9sIG5hbWVzLiAgVGhpcyBpbmZvcm1hdGlvbiB3b3VsZAotYmUgdXNlbGVzcyB0byBtb3N0IENPRkYgZGVidWdnZXJzOyB0aGUgbGlua2VyIGhhcyBjb21tYW5kIGxpbmUgc3dpdGNoZXMKLXRvIGFsbG93IHVzZXJzIHRvIHRocm93IGl0IGF3YXkuCi0KLVRoZXJlIGlzIG9uZSB3b3JkIG9mIHR5cGUgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBzeW1ib2wsIHNvIGlmIHRoZQotZm9ybWF0IHN1cHBvcnRzIHN5bWJvbCB0eXBlIGluZm9ybWF0aW9uIHdpdGhpbiBzeW1ib2xzIChmb3IgZXhhbXBsZSwgQ09GRiwKLUlFRUUsIE9hc3lzKSBhbmQgdGhlIHR5cGUgaXMgc2ltcGxlIGVub3VnaCB0byBmaXQgd2l0aGluIG9uZSB3b3JkCi0obmVhcmx5IGV2ZXJ5dGhpbmcgYnV0IGFnZ3JlZ2F0ZXMpLCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBwcmVzZXJ2ZWQuCi0KLUBpdGVtIHJlbG9jYXRpb24gbGV2ZWwKLUVhY2ggY2Fub25pY2FsIEJGRCByZWxvY2F0aW9uIHJlY29yZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB0bwotcmVsb2NhdGUgdG8sIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdG8gcmVsb2NhdGUsIHRoZSBzZWN0aW9uIHRoZSBkYXRhCi1pcyBpbiwgYW5kIGEgcG9pbnRlciB0byBhIHJlbG9jYXRpb24gdHlwZSBkZXNjcmlwdG9yLiBSZWxvY2F0aW9uIGlzCi1wZXJmb3JtZWQgYnkgcGFzc2luZyBtZXNzYWdlcyB0aHJvdWdoIHRoZSByZWxvY2F0aW9uIHR5cGUKLWRlc2NyaXB0b3IgYW5kIHRoZSBzeW1ib2wgcG9pbnRlci4gVGhlcmVmb3JlLCByZWxvY2F0aW9ucyBjYW4gYmUgcGVyZm9ybWVkCi1vbiBvdXRwdXQgZGF0YSB1c2luZyBhIHJlbG9jYXRpb24gbWV0aG9kIHRoYXQgaXMgb25seSBhdmFpbGFibGUgaW4gb25lIG9mIHRoZQotaW5wdXQgZm9ybWF0cy4gRm9yIGluc3RhbmNlLCBPYXN5cyBwcm92aWRlcyBhIGJ5dGUgcmVsb2NhdGlvbiBmb3JtYXQuCi1BIHJlbG9jYXRpb24gcmVjb3JkIHJlcXVlc3RpbmcgdGhpcyByZWxvY2F0aW9uIHR5cGUgd291bGQgcG9pbnQKLWluZGlyZWN0bHkgdG8gYSByb3V0aW5lIHRvIHBlcmZvcm0gdGhpcywgc28gdGhlIHJlbG9jYXRpb24gbWF5IGJlCi1wZXJmb3JtZWQgb24gYSBieXRlIGJlaW5nIHdyaXR0ZW4gdG8gYSA2OGsgQ09GRiBmaWxlLCBldmVuIHRob3VnaCA2OGsgQ09GRgotaGFzIG5vIHN1Y2ggcmVsb2NhdGlvbiB0eXBlLgotCi1AaXRlbSBsaW5lIG51bWJlcnMKLU9iamVjdCBmb3JtYXRzIGNhbiBjb250YWluLCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCBzb21lIGZvcm0gb2YgbWFwcGluZwotYmV0d2VlbiBzeW1ib2xzLCBzb3VyY2UgbGluZSBudW1iZXJzLCBhbmQgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQgZmlsZS4KLVRoZXNlIGFkZHJlc3NlcyBoYXZlIHRvIGJlIHJlbG9jYXRlZCBhbG9uZyB3aXRoIHRoZSBzeW1ib2wgaW5mb3JtYXRpb24uCi1FYWNoIHN5bWJvbCB3aXRoIGFuIGFzc29jaWF0ZWQgbGlzdCBvZiBsaW5lIG51bWJlciByZWNvcmRzIHBvaW50cyB0byB0aGUKLWZpcnN0IHJlY29yZCBvZiB0aGUgbGlzdC4gIFRoZSBoZWFkIG9mIGEgbGluZSBudW1iZXIgbGlzdCBjb25zaXN0cyBvZiBhCi1wb2ludGVyIHRvIHRoZSBzeW1ib2wsIHdoaWNoIGFsbG93cyBmaW5kaW5nIG91dCB0aGUgYWRkcmVzcyBvZiB0aGUKLWZ1bmN0aW9uIHdob3NlIGxpbmUgbnVtYmVyIGlzIGJlaW5nIGRlc2NyaWJlZC4gVGhlIHJlc3Qgb2YgdGhlIGxpc3QgaXMKLW1hZGUgdXAgb2YgcGFpcnM6IG9mZnNldHMgaW50byB0aGUgc2VjdGlvbiBhbmQgbGluZSBudW1iZXJzLiBBbnkgZm9ybWF0Ci13aGljaCBjYW4gc2ltcGx5IGRlcml2ZSB0aGlzIGluZm9ybWF0aW9uIGNhbiBwYXNzIGl0IHN1Y2Nlc3NmdWxseQotYmV0d2VlbiBmb3JtYXRzIChDT0ZGLCBJRUVFIGFuZCBPYXN5cykuCi1AZW5kIHRhYmxlCmRpZmYgLS1naXQgYS9iZmQvZG9jL2NoZXcuYyBiL2JmZC9kb2MvY2hldy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmE2OWMyLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvY2hldy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU3OSArMCwwIEBACi0vKiBjaGV3Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgc3RldmUgY2hhbWJlcmxhaW4gQGN5Z251cwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFlldCBhbm90aGVyIHdheSBvZiBleHRyYWN0aW5nIGRvY3VtZW50YXRpb24gZnJvbSBzb3VyY2UuCi0gICBObywgSSBoYXZlbid0IGZpbmlzaGVkIGl0IHlldCwgYnV0IEkgaG9wZSB5b3UgcGVvcGxlIGxpa2UgaXQgYmV0dGVyCi0gICB0aGFuIHRoZSBvbGQgd2F5Ci0gIAotICAgc2FjCi0KLSAgIEJhc2ljYWxseSwgdGhpcyBpcyBhIHNvcnQgb2Ygc3RyaW5nIGZvcnRoLCBtYXliZSB3ZSBzaG91bGQgY2FsbCBpdAotICAgc3RydXRoPwotCi0gICBZb3UgZGVmaW5lIG5ldyB3b3JkcyB0aHVzOgotICAgOiA8bmV3d29yZD4gPG9sZHdvcmRzPiA7Ci0KLSovCi0KLS8qIFByaW1pdGl2ZXMgcHJvdmlkZWQgYnkgdGhlIHByb2dyYW06Ci0KLSAgIFR3byBzdGFja3MgYXJlIHByb3ZpZGVkLCBhIHN0cmluZyBzdGFjayBhbmQgYW4gaW50ZWdlciBzdGFjay4KLQotICAgSW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzOgotCWludGVybmFsX3dhbnRlZCAtIGluZGljYXRlcyB3aGV0aGVyIGAtaScgd2FzIHBhc3NlZAotCWludGVybmFsX21vZGUgLSB1c2VyLXNldHRhYmxlCi0KLSAgIENvbW1hbmRzOgotCXB1c2hfdGV4dAotCSEgLSBwb3AgdG9wIG9mIGludGVnZXIgc3RhY2sgZm9yIGFkZHJlc3MsIHBvcCBuZXh0IGZvciB2YWx1ZTsgc3RvcmUKLQlAIC0gdHJlYXQgdmFsdWUgb24gaW50ZWdlciBzdGFjayBhcyB0aGUgYWRkcmVzcyBvZiBhbiBpbnRlZ2VyOyBwdXNoCi0JCXRoYXQgaW50ZWdlciBvbiB0aGUgaW50ZWdlciBzdGFjayBhZnRlciBwb3BwaW5nIHRoZSAiYWRkcmVzcyIKLQloZWxsbyAtIHByaW50ICJoZWxsb1xuIiB0byBzdGRvdXQKLQlzdGRvdXQgLSBwdXQgc3Rkb3V0IG1hcmtlciBvbiBUT1MKLQlzdGRlcnIgLSBwdXQgc3RkZXJyIG1hcmtlciBvbiBUT1MKLQlwcmludCAtIHByaW50IFRPUy0xIG9uIFRPUyAoZWc6ICJoZWxsb1xuIiBzdGRvdXQgcHJpbnQpCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljYXRzdHIgLSBmbiBpY2F0c3RyCi0JY29weV9wYXN0X25ld2xpbmUgLSBhcHBlbmQgaW5wdXQsIHVwIHRvIGFuZCBpbmNsdWRpbmcgbmV3bGluZSBpbnRvIFRPUwotCWR1cCAtIGZuIG90aGVyX2R1cAotCWRyb3AgLSBkaXNjYXJkIFRPUwotCWlkcm9wIC0gZGl0dG8KLQlyZW1jaGFyIC0gZGVsZXRlIGxhc3QgY2hhcmFjdGVyIGZyb20gVE9TCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlkb19mYW5jeV9zdHVmZiAtIHRyYW5zbGF0ZSA8PGZvbz4+IHRvIEBjb2Rle2Zvb30gaW4gVE9TCi0JYnVsbGV0aXplIC0gaWYgIm8iIGxpbmVzIGZvdW5kLCBwcmVwZW5kIEBpdGVtaXplIEBidWxsZXQgdG8gVE9TCi0JCWFuZCBAaXRlbSB0byBlYWNoICJvIiBsaW5lOyBhcHBlbmQgQGVuZCBpdGVtaXplCi0JY291cmllcml6ZSAtIHB1dCBAZXhhbXBsZSBhcm91bmQgLiBhbmQgfCBsaW5lcywgdHJhbnNsYXRlIHsqICp9IHsgfQotCWV4aXQgLSBmbiBjaGV3X2V4aXQKLQlzd2FwCi0Jb3V0cHV0ZG90cyAtIHN0cmlwIG91dCBsaW5lcyB3aXRob3V0IGxlYWRpbmcgZG90cwotCXBhcmFtc3R1ZmYgLSBjb252ZXJ0IGZ1bGwgZGVjbGFyYXRpb24gaW50byAiUEFSQU1TIiBmb3JtIGlmIG5vdCBhbHJlYWR5Ci0JbWF5YmVjYXRzdHIgLSBkbyBjYXRzdHIgaWYgaW50ZXJuYWxfbW9kZSA9PSBpbnRlcm5hbF93YW50ZWQsIGRpc2NhcmQKLQkJdmFsdWUgaW4gYW55IGNhc2UKLQl0cmFuc2xhdGVjb21tZW50cyAtIHR1cm4geyogYW5kICp9IGludG8gY29tbWVudCBkZWxpbWl0ZXJzCi0Ja2lsbF9ib2d1c19saW5lcyAtIGdldCByaWQgb2YgZXh0cmEgbmV3bGluZXMKLQlpbmRlbnQKLQlpbnRlcm5hbG1vZGUgLSBwb3AgZnJvbSBpbnRlZ2VyIHN0YWNrLCBzZXQgYGludGVybmFsbW9kZScgdG8gdGhhdCB2YWx1ZQotCXByaW50X3N0YWNrX2xldmVsIC0gcHJpbnQgY3VycmVudCBzdGFjayBkZXB0aCB0byBzdGRlcnIKLQlzdHJpcF90cmFpbGluZ19uZXdsaW5lcyAtIGdvIGFoZWFkLCBndWVzcy4uLgotCVtxdW90ZWQgc3RyaW5nXSAtIHB1c2ggc3RyaW5nIG9udG8gc3RyaW5nIHN0YWNrCi0JW3dvcmQgc3RhcnRpbmcgd2l0aCBkaWdpdF0gLSBwdXNoIGF0b2woc3RyKSBvbnRvIGludGVnZXIgc3RhY2sKLQotICAgQSBjb21tYW5kIG11c3QgYmUgYWxsIHVwcGVyLWNhc2UsIGFuZCBhbG9uZSBvbiBhIGxpbmUuCi0KLSAgIEZvby4gICovCi0KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jZGVmaW5lIERFRl9TSVpFIDUwMDAKLSNkZWZpbmUgU1RBQ0sgNTAKLQotaW50IGludGVybmFsX3dhbnRlZDsKLWludCBpbnRlcm5hbF9tb2RlOwotCi1pbnQgd2FybmluZzsKLQotLyogSGVyZSBpcyBhIHN0cmluZyB0eXBlIC4uLiAqLwotCi10eXBlZGVmIHN0cnVjdCBidWZmZXIgCi17Ci0gIGNoYXIgKnB0cjsKLSAgdW5zaWduZWQgbG9uZyB3cml0ZV9pZHg7Ci0gIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLX0gc3RyaW5nX3R5cGU7Ci0KLQotI2lmZGVmIF9fU1REQ19fCi1zdGF0aWMgdm9pZCBpbml0X3N0cmluZ193aXRoX3NpemUgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBpbml0X3N0cmluZyAoc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgaW50IGZpbmQgKHN0cmluZ190eXBlICosIGNoYXIgKik7Ci1zdGF0aWMgdm9pZCB3cml0ZV9idWZmZXIgKHN0cmluZ190eXBlICosIEZJTEUgKik7Ci1zdGF0aWMgdm9pZCBkZWxldGVfc3RyaW5nIChzdHJpbmdfdHlwZSAqKTsKLXN0YXRpYyBjaGFyICphZGRyIChzdHJpbmdfdHlwZSAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIGNoYXIgYXQgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBjYXRjaGFyIChzdHJpbmdfdHlwZSAqLCBpbnQpOwotc3RhdGljIHZvaWQgb3ZlcndyaXRlX3N0cmluZyAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBjYXRidWYgKHN0cmluZ190eXBlICosIGNoYXIgKiwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyB2b2lkIGNhdHRleHQgKHN0cmluZ190eXBlICosIGNoYXIgKik7Ci1zdGF0aWMgdm9pZCBjYXRzdHIgKHN0cmluZ190eXBlICosIHN0cmluZ190eXBlICopOwotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQgREVGVU4oaW5pdF9zdHJpbmdfd2l0aF9zaXplLChidWZmZXIsIHNpemUpLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgdW5zaWduZWQgaW50IHNpemUgKQotewotICAgIGJ1ZmZlci0+d3JpdGVfaWR4ID0gMDsKLSAgICBidWZmZXItPnNpemUgPSBzaXplOwotICAgIGJ1ZmZlci0+cHRyID0gbWFsbG9jKHNpemUpOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihpbml0X3N0cmluZywoYnVmZmVyKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyKQotewotICAgIGluaXRfc3RyaW5nX3dpdGhfc2l6ZShidWZmZXIsIERFRl9TSVpFKTsKLQotfQotCi1zdGF0aWMgaW50IERFRlVOKGZpbmQsIChzdHIsIHdoYXQpLAotCSAgc3RyaW5nX3R5cGUgKnN0ciBBTkQKLQkgIGNoYXIgKndoYXQpCi17Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0gICAgY2hhciAqcDsKLSAgICBwID0gd2hhdDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc3RyLT53cml0ZV9pZHggJiYgKnA7IGkrKykgCi0gICAgewotCWlmICgqcCA9PSBzdHItPnB0cltpXSkKLQkgcCsrOwotCWVsc2UKLQkgcCA9IHdoYXQ7Ci0gICAgfQotICAgIHJldHVybiAoKnAgPT0gMCk7Ci0gICAgCi19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKHdyaXRlX2J1ZmZlciwoYnVmZmVyLCBmKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIEZJTEUgKmYpCi17Ci0gICAgZndyaXRlKGJ1ZmZlci0+cHRyLCBidWZmZXItPndyaXRlX2lkeCwgMSwgZik7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4oZGVsZXRlX3N0cmluZywoYnVmZmVyKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyKQotewotICAgIGZyZWUoYnVmZmVyLT5wdHIpOwotfQotCi0KLXN0YXRpYyBjaGFyICpERUZVTihhZGRyLCAoYnVmZmVyLCBpZHgpLAotCSAgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICAgIHJldHVybiBidWZmZXItPnB0ciArIGlkeDsKLX0KLQotc3RhdGljIGNoYXIgREVGVU4oYXQsKGJ1ZmZlciwgcG9zKSwKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIHVuc2lnbmVkIGludCBwb3MpIAotewotICBpZiAocG9zID49IGJ1ZmZlci0+d3JpdGVfaWR4KSAKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGJ1ZmZlci0+cHRyW3Bvc107Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdGNoYXIsKGJ1ZmZlciwgY2gpLCAKLQkgICBzdHJpbmdfdHlwZSAqYnVmZmVyIEFORAotCSAgIGludCBjaCkKLXsKLSAgaWYgKGJ1ZmZlci0+d3JpdGVfaWR4ID09IGJ1ZmZlci0+c2l6ZSkgCi0gICAgewotICAgICAgYnVmZmVyLT5zaXplICo9MjsKLSAgICAgIGJ1ZmZlci0+cHRyID0gcmVhbGxvYyhidWZmZXItPnB0ciwgYnVmZmVyLT5zaXplKTsKLSAgICB9Ci0KLSAgYnVmZmVyLT5wdHJbYnVmZmVyLT53cml0ZV9pZHggKysgXSA9IGNoOwotfQotCi0KLXN0YXRpYyB2b2lkIERFRlVOKG92ZXJ3cml0ZV9zdHJpbmcsKGRzdCwgICBzcmMpLAotCSAgIHN0cmluZ190eXBlICpkc3QgQU5ECi0JICAgc3RyaW5nX3R5cGUgKnNyYykKLXsKLSAgICBmcmVlKGRzdC0+cHRyKTsKLSAgICBkc3QtPnNpemUgPSBzcmMtPnNpemU7Ci0gICAgZHN0LT53cml0ZV9pZHggPSBzcmMtPndyaXRlX2lkeDsKLSAgICBkc3QtPnB0ciA9IHNyYy0+cHRyOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihjYXRidWYsKGJ1ZmZlciwgYnVmLCBsZW4pLAotCSAgIHN0cmluZ190eXBlICpidWZmZXIgQU5ECi0JICAgY2hhciAqYnVmIEFORAotCSAgIHVuc2lnbmVkIGludCBsZW4pCi17Ci0gIGlmIChidWZmZXItPndyaXRlX2lkeCArIGxlbiA+PSBidWZmZXItPnNpemUpCi0gICAgewotICAgICAgd2hpbGUgKGJ1ZmZlci0+d3JpdGVfaWR4ICsgbGVuID49IGJ1ZmZlci0+c2l6ZSkKLQlidWZmZXItPnNpemUgKj0gMjsKLSAgICAgIGJ1ZmZlci0+cHRyID0gcmVhbGxvYyAoYnVmZmVyLT5wdHIsIGJ1ZmZlci0+c2l6ZSk7Ci0gICAgfQotICBtZW1jcHkgKGJ1ZmZlci0+cHRyICsgYnVmZmVyLT53cml0ZV9pZHgsIGJ1ZiwgbGVuKTsKLSAgYnVmZmVyLT53cml0ZV9pZHggKz0gbGVuOwotfQotCi1zdGF0aWMgdm9pZCBERUZVTihjYXR0ZXh0LChidWZmZXIsIHN0cmluZyksCi0JICAgc3RyaW5nX3R5cGUgKmJ1ZmZlciBBTkQKLQkgICBjaGFyICpzdHJpbmcpCi17Ci0gIGNhdGJ1ZiAoYnVmZmVyLCBzdHJpbmcsICh1bnNpZ25lZCBpbnQpIHN0cmxlbiAoc3RyaW5nKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERFRlVOKGNhdHN0ciwoZHN0LCBzcmMpLAotCSAgIHN0cmluZ190eXBlICpkc3QgQU5ECi0JICAgc3RyaW5nX3R5cGUgKnNyYykKLXsKLSAgY2F0YnVmIChkc3QsIHNyYy0+cHRyLCBzcmMtPndyaXRlX2lkeCk7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludCAKLURFRlVOKHNraXBfd2hpdGVfYW5kX3N0YXJzLChzcmMsIGlkeCksCi0gICAgICBzdHJpbmdfdHlwZSAqc3JjIEFORAotICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgY2hhciBjOwotICB3aGlsZSAoKGMgPSBhdChzcmMsaWR4KSksCi0JIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSBjKQotCSB8fCAoYyA9PSAnKicKLQkgICAgIC8qIERvbid0IHNraXAgcGFzdCBlbmQtb2YtY29tbWVudCBvciBzdGFyIGFzIGZpcnN0Ci0JCWNoYXJhY3RlciBvbiBpdHMgbGluZS4gICovCi0JICAgICAmJiBhdChzcmMsaWR4ICsxKSAhPSAnLycKLQkgICAgICYmIGF0KHNyYyxpZHggLTEpICE9ICdcbicpKSAKLSAgICBpZHgrKzsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cmluZ190eXBlIHN0YWNrW1NUQUNLXTsKLXN0cmluZ190eXBlICp0b3M7Ci0KLXVuc2lnbmVkIGludCBpZHggPSAwOyAvKiBQb3MgaW4gaW5wdXQgYnVmZmVyICovCi1zdHJpbmdfdHlwZSAqcHRyOyAvKiBhbmQgdGhlIGJ1ZmZlciAqLwotdHlwZWRlZiB2b2lkICgqc3RpbnN0X3R5cGUpKCk7Ci1zdGluc3RfdHlwZSAqcGM7Ci1zdGluc3RfdHlwZSBzc3RhY2tbU1RBQ0tdOwotc3RpbnN0X3R5cGUgKnNzcCA9ICZzc3RhY2tbMF07Ci1sb25nIGlzdGFja1tTVEFDS107Ci1sb25nICppc3AgPSAmaXN0YWNrWzBdOwotCi10eXBlZGVmIGludCAqd29yZF90eXBlOwotCi0KLQotc3RydWN0IGRpY3Rfc3RydWN0Ci17Ci0gICAgY2hhciAqd29yZDsKLSAgICBzdHJ1Y3QgZGljdF9zdHJ1Y3QgKm5leHQ7Ci0gICAgc3RpbnN0X3R5cGUgKmNvZGU7Ci0gICAgaW50IGNvZGVfbGVuZ3RoOwotICAgIGludCBjb2RlX2VuZDsKLSAgICBpbnQgdmFyOwotICAgIAotfTsKLXR5cGVkZWYgc3RydWN0IGRpY3Rfc3RydWN0IGRpY3RfdHlwZTsKLSNkZWZpbmUgV09SRCh4KSBzdGF0aWMgdm9pZCB4KCkKLQotc3RhdGljIHZvaWQKLWRpZSAobXNnKQotICAgICBjaGFyICptc2c7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBtc2cpOwotICBleGl0ICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX3JhbmdlICgpCi17Ci0gIGlmICh0b3MgPCBzdGFjaykKLSAgICBkaWUgKCJ1bmRlcmZsb3cgaW4gc3RyaW5nIHN0YWNrIik7Ci0gIGlmICh0b3MgPj0gc3RhY2sgKyBTVEFDSykKLSAgICBkaWUgKCJvdmVyZmxvdyBpbiBzdHJpbmcgc3RhY2siKTsKLX0KLQotc3RhdGljIHZvaWQKLWljaGVja19yYW5nZSAoKQotewotICBpZiAoaXNwIDwgaXN0YWNrKQotICAgIGRpZSAoInVuZGVyZmxvdyBpbiBpbnRlZ2VyIHN0YWNrIik7Ci0gIGlmIChpc3AgPj0gaXN0YWNrICsgU1RBQ0spCi0gICAgZGllICgib3ZlcmZsb3cgaW4gaW50ZWdlciBzdGFjayIpOwotfQotCi0jaWZkZWYgX19TVERDX18KLXN0YXRpYyB2b2lkIGV4ZWMgKGRpY3RfdHlwZSAqKTsKLXN0YXRpYyB2b2lkIGNhbGwgKHZvaWQpOwotc3RhdGljIHZvaWQgcmVtY2hhciAodm9pZCksIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzICh2b2lkKSwgcHVzaF9udW1iZXIgKHZvaWQpOwotc3RhdGljIHZvaWQgcHVzaF90ZXh0ICh2b2lkKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9ub25jb21tZW50cyAoc3RyaW5nX3R5cGUgKiwgc3RyaW5nX3R5cGUgKik7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGFja19sZXZlbCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBwYXJhbXN0dWZmICh2b2lkKSwgdHJhbnNsYXRlY29tbWVudHMgKHZvaWQpOwotc3RhdGljIHZvaWQgb3V0cHV0ZG90cyAodm9pZCksIGNvdXJpZXJpemUgKHZvaWQpLCBidWxsZXRpemUgKHZvaWQpOwotc3RhdGljIHZvaWQgZG9fZmFuY3lfc3R1ZmYgKHZvaWQpOwotc3RhdGljIGludCBpc2NvbW1hbmQgKHN0cmluZ190eXBlICosIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgaW50IGNvcHlfcGFzdF9uZXdsaW5lIChzdHJpbmdfdHlwZSAqLCB1bnNpZ25lZCBpbnQsIHN0cmluZ190eXBlICopOwotc3RhdGljIHZvaWQgaWNvcHlfcGFzdF9uZXdsaW5lICh2b2lkKSwga2lsbF9ib2d1c19saW5lcyAodm9pZCksIGluZGVudCAodm9pZCk7Ci1zdGF0aWMgdm9pZCBnZXRfc3R1ZmZfaW5fY29tbWFuZCAodm9pZCksIHN3YXAgKHZvaWQpLCBvdGhlcl9kdXAgKHZvaWQpOwotc3RhdGljIHZvaWQgZHJvcCAodm9pZCksIGlkcm9wICh2b2lkKTsKLXN0YXRpYyB2b2lkIGljYXRzdHIgKHZvaWQpLCBza2lwX3Bhc3RfbmV3bGluZSAodm9pZCksIGludGVybmFsbW9kZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBtYXliZWNhdHN0ciAodm9pZCk7Ci1zdGF0aWMgY2hhciAqbmV4dHdvcmQgKGNoYXIgKiwgY2hhciAqKik7Ci1kaWN0X3R5cGUgKmxvb2t1cF93b3JkIChjaGFyICopOwotc3RhdGljIHZvaWQgcGVyZm9ybSAodm9pZCk7Ci1kaWN0X3R5cGUgKm5ld2VudHJ5IChjaGFyICopOwotdW5zaWduZWQgaW50IGFkZF90b19kZWZpbml0aW9uIChkaWN0X3R5cGUgKiwgc3RpbnN0X3R5cGUpOwotdm9pZCBhZGRfaW50cmluc2ljIChjaGFyICosIHZvaWQgKCopKCkpOwotdm9pZCBhZGRfdmFyIChjaGFyICopOwotdm9pZCBjb21waWxlIChjaGFyICopOwotc3RhdGljIHZvaWQgYmFuZyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBhdHNpZ24gKHZvaWQpOwotc3RhdGljIHZvaWQgaGVsbG8gKHZvaWQpOwotc3RhdGljIHZvaWQgc3Rkb3V0XyAodm9pZCk7Ci1zdGF0aWMgdm9pZCBzdGRlcnJfICh2b2lkKTsKLXN0YXRpYyB2b2lkIHByaW50ICh2b2lkKTsKLXN0YXRpYyB2b2lkIHJlYWRfaW4gKHN0cmluZ190eXBlICosIEZJTEUgKik7Ci1zdGF0aWMgdm9pZCB1c2FnZSAodm9pZCk7Ci1zdGF0aWMgdm9pZCBjaGV3X2V4aXQgKHZvaWQpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIERFRlVOKGV4ZWMsKHdvcmQpLAotCQkgIGRpY3RfdHlwZSAqd29yZCkKLXsKLSAgcGMgPSB3b3JkLT5jb2RlOwotICB3aGlsZSAoKnBjKSAKLSAgICAoKnBjKSgpOwotfQotV09SRChjYWxsKQotewotICAgIHN0aW5zdF90eXBlICpvbGRwYyA9IHBjOwotICAgIGRpY3RfdHlwZSAqZTsKLSAgICBlID0gIChkaWN0X3R5cGUgKikocGMgWzFdKTsKLSAgICBleGVjKGUpOwotICAgIHBjID0gb2xkcGMgKyAyOwotICAgIAotfQotCi1XT1JEKHJlbWNoYXIpCi17Ci0gIGlmICh0b3MtPndyaXRlX2lkeCkKLSAgICB0b3MtPndyaXRlX2lkeC0tOyAgICAKLSAgcGMrKzsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzICgpCi17Ci0gIHdoaWxlICgoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGF0ICh0b3MsIHRvcy0+d3JpdGVfaWR4IC0gMSkpCi0JICB8fCBhdCAodG9zLCB0b3MtPndyaXRlX2lkeCAtIDEpID09ICdcbicpCi0JICYmIHRvcy0+d3JpdGVfaWR4ID4gMCkKLSAgICB0b3MtPndyaXRlX2lkeC0tOwotICBwYysrOwotfQotCi1XT1JEKHB1c2hfbnVtYmVyKQotewotICAgIGlzcCsrOwotICAgIGljaGVja19yYW5nZSAoKTsKLSAgICBwYysrOwotICAgICppc3AgPSAobG9uZykoKnBjKTsKLSAgICBwYysrOwotfQotCi1XT1JEKHB1c2hfdGV4dCkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIHBjKys7Ci0gICAgY2F0dGV4dCh0b3MsKigoY2hhciAqKilwYykpOwotICAgIHBjKys7Ci0gICAgCi19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiByZW1vdmVzIGV2ZXJ5dGhpbmcgbm90IGluc2lkZSBjb21tZW50cyBzdGFydGluZyBvbgotICAgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGxpbmUgZnJvbSB0aGUgIHN0cmluZywgYWxzbyB3aGVuIGNvcHlpbmcKLSAgIGNvbW1lbnRzLCByZW1vdmVzIGJsYW5rIHNwYWNlIGFuZCBsZWFkaW5nIConcy4KLSAgIEJsYW5rIGxpbmVzIGFyZSB0dXJuZWQgaW50byBvbmUgYmxhbmsgbGluZS4gICovCi0KLXN0YXRpYyB2b2lkIAotREVGVU4ocmVtb3ZlX25vbmNvbW1lbnRzLChzcmMsZHN0KSwKLQkgICBzdHJpbmdfdHlwZSAqc3JjIEFORAotCSAgIHN0cmluZ190eXBlICpkc3QpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHNyYyxpZHgpKSAKLSAgICB7Ci0JLyogTm93IHNlZSBpZiB3ZSBoYXZlIGEgY29tbWVudCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgKi8KLQlpZiAoYXQoc3JjLGlkeCkgPT0gJ1xuJyAKLQkgICAgJiYgYXQoc3JjLGlkeCsxKSA9PSAgJy8nIAotCSAgICAmJiBhdChzcmMsaWR4KzIpID09ICcqJykgCi0JewotCSAgICBpZHgrPTM7Ci0JICAgIAotCSAgICBpZHggPSBza2lwX3doaXRlX2FuZF9zdGFycyhzcmMsaWR4KTsKLQotCSAgICAvKiBSZW1vdmUgbGVhZGluZyBkb3QgKi8KLQkgICAgaWYgKGF0KHNyYywgaWR4KSA9PSAnLicpCi0JICAgICBpZHgrKzsKLQkgICAgCi0JICAgIC8qIENvcHkgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgb3IgdGlsbCB0aGUgZW5kIG9mIHRoZQotCSAgICAgICBjb21tZW50ICovCi0JICAgIHdoaWxlIChhdChzcmMsIGlkeCkpCi0JICAgIHsKLQkJaWYgKGF0KHNyYywgaWR4KSA9PSAnXG4nKSAKLQkJewotCQkgICAgLyogZW5kIG9mIGxpbmUsIGVjaG8gYW5kIHNjcmFwZSBvZiBsZWFkaW5nIGJsYW5rcyAgKi8KLQkJICAgIGlmIChhdChzcmMsaWR4ICsxKSA9PSAnXG4nKQotCQkgICAgIGNhdGNoYXIoZHN0LCdcbicpOwotCQkgICAgY2F0Y2hhcihkc3QsJ1xuJyk7Ci0JCSAgICBpZHgrKzsKLQkJICAgIGlkeCA9ICAgc2tpcF93aGl0ZV9hbmRfc3RhcnMoc3JjLCBpZHgpOwotCQl9Ci0JCWVsc2UgaWYgKGF0KHNyYywgaWR4KSA9PSAnKicgJiYgYXQoc3JjLGlkeCsxKSA9PSAnLycpIAotCQl7Ci0JCSAgICBpZHggKz0yIDsKLQkJICAgIGNhdHRleHQoZHN0LCJcbkVOREREXG4iKTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JCWVsc2UgCi0JCXsKLQkJICAgIGNhdGNoYXIoZHN0LCBhdChzcmMsIGlkeCkpOwotCQkgICAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCX0KLQllbHNlIGlkeCsrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N0YWNrX2xldmVsICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImN1cnJlbnQgc3RyaW5nIHN0YWNrIGRlcHRoID0gJWQsICIsIHRvcyAtIHN0YWNrKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiY3VycmVudCBpbnRlZ2VyIHN0YWNrIGRlcHRoID0gJWRcbiIsIGlzcCAtIGlzdGFjayk7Ci0gIHBjKys7Ci19Ci0KLS8qIHR1cm46Ci0gICAgIGZvb2JhciBuYW1lKHN0dWZmKTsKLSAgIGludG86Ci0gICAgIGZvb2JhcgotICAgICBuYW1lIFBBUkFNUyAoKHN0dWZmKSk7Ci0gICBhbmQgYSBibGFuayBsaW5lLgotICovCi0KLXN0YXRpYyB2b2lkCi1ERUZVTl9WT0lEKHBhcmFtc3R1ZmYpCi17Ci0gICAgdW5zaWduZWQgaW50IG9wZW5wOwotICAgIHVuc2lnbmVkIGludCBmbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgaWR4OwotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLQotICAgIC8qIG1ha2Ugc3VyZSB0aGF0IGl0J3Mgbm90IGFscmVhZHkgcGFyYW0nZCBvciBwcm90bydkICovCi0gICAgaWYoZmluZCh0b3MsIlBBUkFNUyIpIHx8IGZpbmQodG9zLCJQUk9UTyIpIHx8ICFmaW5kKHRvcywiKCIpKSB7Ci0JICAgIGNhdHN0cigmb3V0LHRvcyk7Ci0JfQotICAgIGVsc2UgCi0gICAgewotCS8qIEZpbmQgdGhlIG9wZW4gcGFyZW4gKi8KLQlmb3IgKG9wZW5wID0gMDsgYXQodG9zLCBvcGVucCkgIT0gJygnICAmJiBhdCh0b3Msb3BlbnApOyBvcGVucCsrKQotCSA7Ci0KLQlmbmFtZSA9IG9wZW5wOwotCS8qIFN0ZXAgYmFjayB0byB0aGUgZm5hbWUgKi8KLQlmbmFtZS0tOwotCXdoaWxlIChmbmFtZSAmJiBpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsIGZuYW1lKSkpCi0JIGZuYW1lIC0tOwotCXdoaWxlIChmbmFtZQotCSAgICAgICAmJiAhaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGZuYW1lKSkKLQkgICAgICAgJiYgYXQodG9zLGZuYW1lKSAhPSAnKicpCi0JIGZuYW1lLS07Ci0KLQlmbmFtZSsrOwotCQotCWZvciAoaWR4ID0gMDsgaWR4IDwgZm5hbWU7IGlkeCsrKSAJLyogT3V0cHV0IHR5cGUgKi8KLQl7Ci0JICAgIGNhdGNoYXIoJm91dCwgYXQodG9zLGlkeCkpOwotCX0KLSAgICAKLSAgICAgICAgY2F0dGV4dCgmb3V0LCAiXG4iKTsJLyogSW5zZXJ0IGEgbmV3bGluZSBiZXR3ZWVuIHR5cGUgYW5kIGZubmFtZSAqLwotCi0JZm9yIChpZHggPSBmbmFtZTsgaWR4IDwgb3BlbnA7IGlkeCsrKSAJCS8qIE91dHB1dCBmbm5hbWUgKi8KLQl7Ci0JICAgIGNhdGNoYXIoJm91dCwgYXQodG9zLGlkeCkpOwotCX0KLQotCWNhdHRleHQoJm91dCwiIFBBUkFNUyAoIik7Ci0KLQl3aGlsZSAoYXQodG9zLGlkeCkgJiYgYXQodG9zLGlkeCkgIT0nOycpIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0JY2F0dGV4dCgmb3V0LCIpO1xuXG4iKTsKLSAgICB9Ci0gICAgb3ZlcndyaXRlX3N0cmluZyh0b3MsICZvdXQpOyAgICAKLSAgICBwYysrOwotICAgIAotfQotCi0KLQotLyogdHVybiB7KgotICAgYW5kICp9IGludG8gY29tbWVudHMgKi8KLQotV09SRCh0cmFuc2xhdGVjb21tZW50cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsaWR4KSA9PSAneycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JewotCSAgICBjYXR0ZXh0KCZvdXQsIi8qIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotCi0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7Ci0gICAgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiB0dXJuIGV2ZXJ5dGhpbmcgbm90IHN0YXJ0aW5nIHdpdGggYSAuIGludG8gYSBjb21tZW50ICovCi0KLVdPUkQobWFuZ2xlY29tbWVudHMpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIGluaXRfc3RyaW5nKCZvdXQpOwotICAgIAotICAgIHdoaWxlIChhdCh0b3MsIGlkeCkpIAotICAgIHsKLQlpZiAoYXQodG9zLGlkeCkgPT0gJ1xuJyAmJiBhdCh0b3MsaWR4KzEpID09JyonKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiCS8qIik7Ci0JICAgIGlkeCs9MjsKLQl9Ci0JZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJyonICYmIGF0KHRvcyxpZHgrMSkgPT0nfScpIAotCXsKLQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCSAgICBpZHgrPTI7Ci0JfQotCWVsc2UgIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotCi0KLSAgICBvdmVyd3JpdGVfc3RyaW5nKHRvcywgJm91dCk7Ci0gICAgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotI2VuZGlmCi0KLS8qIE1vZCB0b3Mgc28gdGhhdCBvbmx5IGxpbmVzIHdpdGggbGVhZGluZyBkb3RzIHJlbWFpbiAqLwotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQob3V0cHV0ZG90cykKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJ1xuJyAmJiBhdCh0b3MsIGlkeCsxKSA9PSAnLicpIAotCXsKLQkgIGNoYXIgYzsKLQkgIGlkeCArPSAyOwotCSAgICAKLQkgICAgd2hpbGUgKChjID0gYXQodG9zLCBpZHgpKSAmJiBjICE9ICdcbicpCi0JICAgIHsKLQkgICAgICBpZiAoYyA9PSAneycgJiYgYXQodG9zLGlkeCsxKSA9PScqJykgCi0JCXsKLQkJICAgIGNhdHRleHQoJm91dCwiIC8qIik7Ci0JCSAgICBpZHgrPTI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChjID09ICcqJyAmJiBhdCh0b3MsaWR4KzEpID09J30nKSAKLQkJewotCQkgICAgY2F0dGV4dCgmb3V0LCIqLyIpOwotCQkgICAgaWR4Kz0yOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgICBjYXRjaGFyKCZvdXQsIGMpOwotCQkgICAgaWR4Kys7Ci0JCX0KLQkgICAgfQotCSAgICBjYXRjaGFyKCZvdXQsJ1xuJyk7Ci0JfQotCWVsc2UgCi0JewotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQkKLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICBwYysrOwotICAgIAotfQotCi0vKiBGaW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggLiBhbmQgfCBhbmQgcHV0IGV4YW1wbGUgYXJvdW5kIHRoZW0gb24gdG9zICovCi1XT1JEKGNvdXJpZXJpemUpCi17Ci0gICAgc3RyaW5nX3R5cGUgb3V0OwotICAgIHVuc2lnbmVkIGludCBpZHggPSAwOwotICAgIGludCBjb21tYW5kID0gMDsKLSAgICAKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAKLSAgICB3aGlsZSAoYXQodG9zLCBpZHgpKSAKLSAgICB7Ci0JaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nIAotCSAgICAmJiAoYXQodG9zLCBpZHggKzEgKSA9PSAnLicKLQkJfHwgYXQodG9zLGlkeCsxKSA9PSAnfCcpKSAKLQl7Ci0JICAgIGNhdHRleHQoJm91dCwiXG5AZXhhbXBsZVxuIik7Ci0JICAgIGRvIAotCSAgICB7Ci0JCWlkeCArPSAyOwotCQkKLQkJd2hpbGUgKGF0KHRvcywgaWR4KSAmJiBhdCh0b3MsIGlkeCkhPSdcbicpCi0JCXsKLQkJICAgIGlmIChhdCh0b3MsaWR4KT09J3snICYmIGF0KHRvcyxpZHgrMSkgPT0nKicpIAotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCIgLyoiKTsKLQkJCWlkeCs9MjsKLQkJICAgIH0KLQkJICAgIGVsc2UgaWYgKGF0KHRvcyxpZHgpPT0nKicgJiYgYXQodG9zLGlkeCsxKSA9PSd9JykgCi0JCSAgICB7Ci0JCQljYXR0ZXh0KCZvdXQsIiovIik7Ci0JCQlpZHgrPTI7Ci0JCSAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJ3snICYmICFjb21tYW5kKQotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCJAeyIpOwotCQkJaWR4Kys7Ci0JCSAgICB9Ci0JICAgICAgICAgICAgZWxzZSBpZiAoYXQodG9zLGlkeCkgPT0gJ30nICYmICFjb21tYW5kKQotCQkgICAgewotCQkJY2F0dGV4dCgmb3V0LCJAfSIpOwotCQkJaWR4Kys7Ci0JCSAgICB9Ci0JCSAgICBlbHNlIAotCQkgICAgewotCQkJaWYgKGF0KHRvcyxpZHgpID09ICdAJykKLQkJCSAgICBjb21tYW5kID0gMTsKLQkJCWVsc2UgaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcyxpZHgpKQotCQkJCSB8fCBhdCh0b3MsaWR4KSA9PSAnfScpCi0JCQkgICAgY29tbWFuZCA9IDA7Ci0JCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCQlpZHgrKzsKLQkJICAgIH0KLQkJICAgIAotCQl9Ci0JCWNhdGNoYXIoJm91dCwnXG4nKTsKLQkgICAgfSAgCi0JICAgIHdoaWxlIChhdCh0b3MsIGlkeCkgPT0gJ1xuJyAKLQkJICAgJiYgKChhdCh0b3MsIGlkeCsxKSA9PSAnLicpCi0JCSAgICAgICB8fCAoYXQodG9zLGlkeCsxKSA9PSAnfCcpKSkKLQkgICAgICA7Ci0JICAgIGNhdHRleHQoJm91dCwiQGVuZCBleGFtcGxlIik7Ci0JfQotCWVsc2UgCi0JeyAgICAKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfSAgICAKLQotICAgIG92ZXJ3cml0ZV9zdHJpbmcodG9zLCAmb3V0KTsKLSAgICBwYysrOwotCi0gICAgCi19Ci0KLS8qIEZpbmRzIGFueSBsaW5lcyBzdGFydGluZyB3aXRoICJvICIsIGlmIHRoZXJlIGFyZSBhbnksIHRoZW4gdHVybnMKLSAgIG9uIEBpdGVtaXplIEBidWxsZXQsIGFuZCBAaXRlbXMgZWFjaCBvZiB0aGVtLiBUaGVuIGVuZHMgd2l0aCBAZW5kCi0gICBpdGVtaXplLCBpbnBsYWNlIGF0IFRPUyovCi0KLQotV09SRChidWxsZXRpemUpCi17Ci0gICAgdW5zaWduZWQgaW50IGlkeCA9IDA7Ci0gICAgaW50IG9uID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgCi0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJ0AnICYmCi0JICAgIGF0KHRvcywgaWR4KzEpID09ICcqJykgCi0JewotCSAgY2F0dGV4dCgmb3V0LCIqIik7Ci0JICBpZHgrPTI7Ci0JfQotCQotCWVsc2UKLQkgICAgaWYgKGF0KHRvcywgaWR4KSA9PSAnXG4nICYmCi0JCWF0KHRvcywgaWR4KzEpID09ICdvJyAmJgotCQlpc3NwYWNlKCh1bnNpZ25lZCBjaGFyKSBhdCh0b3MsIGlkeCArMikpKQotCSAgICB7Ci0JCWlmICghb24pIAotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIlxuQGl0ZW1pemUgQGJ1bGxldFxuIik7Ci0JCSAgICBvbiA9IDE7Ci0JCSAgICAKLQkJfQotCQljYXR0ZXh0KCZvdXQsIlxuQGl0ZW1cbiIpOwotCQlpZHgrPTM7Ci0JICAgIH0KLQkgICAgZWxzZSAKLQkgICAgewotCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCWlmIChvbiAmJiBhdCh0b3MsIGlkeCkgPT0gJ1xuJyAmJgotCQkgICAgYXQodG9zLCBpZHgrMSkgPT0gJ1xuJyAmJgotCQkgICAgYXQodG9zLCBpZHgrMikgIT0gJ28nKQotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsICJAZW5kIGl0ZW1pemUiKTsKLQkJICAgIG9uID0gMDsKLQkJfQotCQlpZHgrKzsKLQkJCi0JICAgIH0KLQl9Ci0gICAgaWYgKG9uKSAKLSAgICB7Ci0JY2F0dGV4dCgmb3V0LCJAZW5kIGl0ZW1pemVcbiIpOwotICAgIH0JCi0KLSAgICBkZWxldGVfc3RyaW5nKHRvcyk7Ci0gICAgKnRvcyA9IG91dDsKLSAgICBwYysrOwotICAgIAotfQotCi0vKiBUdXJuIDw8Zm9vPj4gaW50byBAY29kZXtmb299IGluIHBsYWNlIGF0IFRPUyovCi0gICAKLQotV09SRChkb19mYW5jeV9zdHVmZikKLXsKLSAgICB1bnNpZ25lZCBpbnQgaWR4ID0gMDsKLSAgICBzdHJpbmdfdHlwZSBvdXQ7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgd2hpbGUgKGF0KHRvcywgaWR4KSkgCi0gICAgewotCWlmIChhdCh0b3MsIGlkeCkgPT0gJzwnIAotCSAgICAmJiBhdCh0b3MsIGlkeCsxKSA9PSAnPCcKLQkgICAgJiYgIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpIGF0KHRvcyxpZHggKyAyKSkpIAotCXsKLQkgICAgLyogVGhpcyBxdWFsaWZpZXMgYXMgYSA8PCBzdGFydHVwICovCi0JICAgIGlkeCArPTI7Ci0JICAgIGNhdHRleHQoJm91dCwiQGNvZGV7Iik7Ci0JICAgIHdoaWxlKGF0KHRvcyxpZHgpICYmCi0JCSAgYXQodG9zLGlkeCkgIT0gJz4nICkKLQkgICAgewotCQljYXRjaGFyKCZvdXQsIGF0KHRvcywgaWR4KSk7Ci0JCWlkeCsrOwotCQkKLQkgICAgfQotCSAgICBjYXR0ZXh0KCZvdXQsIn0iKTsKLQkgICAgaWR4Kz0yOwotCX0KLQllbHNlIAotCXsKLQkgICAgY2F0Y2hhcigmb3V0LCBhdCh0b3MsIGlkeCkpOwotCSAgICBpZHgrKzsKLQl9Ci0gICAgfQotICAgIGRlbGV0ZV9zdHJpbmcodG9zKTsKLSAgICAqdG9zID0gb3V0OwotICAgIHBjKys7Ci0gICAgCi19Ci0vKiBBIGNvbW1hbmQgaXMgYWxsIHVwcGVyIGNhc2UsYW5kIGFsb25lIG9uIGEgbGluZSAqLwotc3RhdGljIGludCAKLURFRlVOKCBpc2NvbW1hbmQsKHB0ciwgaWR4KSwKLSAgICAgIHN0cmluZ190eXBlICpwdHIgQU5ECi0gICAgICB1bnNpZ25lZCBpbnQgaWR4KQotewotICAgIHVuc2lnbmVkIGludCBsZW4gPSAwOwotICAgIHdoaWxlIChhdChwdHIsaWR4KSkgewotCSAgICBpZiAoaXN1cHBlcigodW5zaWduZWQgY2hhcikgYXQocHRyLGlkeCkpIHx8IGF0KHB0cixpZHgpID09ICcgJyB8fAotCQlhdChwdHIsaWR4KSA9PSAnXycpIAotCSAgICB7Ci0JICAgICBsZW4rKzsKLQkgICAgIGlkeCsrOwotCSB9Ci0JICAgIGVsc2UgaWYoYXQocHRyLGlkeCkgPT0gJ1xuJykKLQkgICAgewotCQlpZiAobGVuID4gMykgcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCSAgICB9Ci0JICAgIGVsc2UgcmV0dXJuIDA7Ci0JfQotICAgIHJldHVybiAwOwotCi19Ci0KLQotc3RhdGljIGludAotREVGVU4oY29weV9wYXN0X25ld2xpbmUsKHB0ciwgaWR4LCBkc3QpLAotICAgICAgc3RyaW5nX3R5cGUgKnB0ciBBTkQKLSAgICAgIHVuc2lnbmVkIGludCBpZHggQU5ECi0gICAgICBzdHJpbmdfdHlwZSAqZHN0KQotewotICAgIGludCBjb2x1bW4gPSAwOwotCi0gICAgd2hpbGUgKGF0KHB0ciwgaWR4KSAmJiBhdChwdHIsIGlkeCkgIT0gJ1xuJykgCi0gICAgewotCWlmIChhdCAocHRyLCBpZHgpID09ICdcdCcpCi0JICB7Ci0JICAgIC8qIEV4cGFuZCB0YWJzLiAgTmVpdGhlciBtYWtlaW5mbyBub3IgVGVYIGNhbiBjb3BlIHdlbGwgd2l0aAotCSAgICAgICB0aGVtLiAgKi8KLQkgICAgZG8KLQkgICAgICBjYXRjaGFyIChkc3QsICcgJyk7Ci0JICAgIHdoaWxlICgrK2NvbHVtbiAmIDcpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgY2F0Y2hhcihkc3QsIGF0KHB0ciwgaWR4KSk7Ci0JICAgIGNvbHVtbisrOwotCSAgfQotCWlkeCsrOwotCQotICAgIH0gICAgCi0gICAgY2F0Y2hhcihkc3QsIGF0KHB0ciwgaWR4KSk7Ci0gICAgaWR4Kys7Ci0gICAgcmV0dXJuIGlkeDsKLQotfQotCi1XT1JEKGljb3B5X3Bhc3RfbmV3bGluZSkKLXsKLSAgICB0b3MrKzsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBpbml0X3N0cmluZyh0b3MpOwotICAgIGlkeCA9IGNvcHlfcGFzdF9uZXdsaW5lKHB0ciwgaWR4LCB0b3MpOwotICAgIHBjKys7CQotfQotCi0vKiBpbmRlbnQKLSAgIFRha2UgdGhlIHN0cmluZyBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywgZG8gc29tZSBwcmV0dHlpbmcgKi8KLQotCi1XT1JEKGtpbGxfYm9ndXNfbGluZXMpCi17Ci0gICAgaW50IHNsIDsKLSAgICAKLSAgICBpbnQgaWR4ID0gMDsKLSAgICBpbnQgYzsKLSAgICBpbnQgZG90ID0gMCAgICA7Ci0gICAgCi0gICAgc3RyaW5nX3R5cGUgb3V0OyAgICAKLSAgICBpbml0X3N0cmluZygmb3V0KTsKLSAgICAvKiBEcm9wIGxlYWRpbmcgbmwgKi8KLSAgICB3aGlsZSAoYXQodG9zLGlkeCkgPT0gJ1xuJykKLSAgICB7Ci0JaWR4Kys7Ci0gICAgfQotICAgIGMgPSBpZHg7Ci0gICAgCi0gICAgLyogSWYgdGhlIGZpcnN0IGNoYXIgaXMgYSAnLicgcHJlcGVuZCBhIG5ld2xpbmUgc28gdGhhdCBpdCBpcwotICAgICAgIHJlY29nbml6ZWQgcHJvcGVybHkgbGF0ZXIuICAqLwotICAgIGlmIChhdCAodG9zLCBpZHgpID09ICcuJykKLSAgICAgIGNhdGNoYXIgKCZvdXQsICdcbicpOwotCi0gICAgLyogRmluZCB0aGUgbGFzdCBjaGFyICovCi0gICAgd2hpbGUgKGF0KHRvcyxpZHgpKQotICAgIHsKLQlpZHgrKzsKLSAgICB9Ci0gICAgCi0gICAgLyogZmluZCB0aGUgbGFzdCBub24gd2hpdGUgYmVmb3JlIHRoZSBubCAqLwotICAgIGlkeC0tOwotICAgIAotICAgIHdoaWxlIChpZHggJiYgaXNzcGFjZSgodW5zaWduZWQgY2hhcikgYXQodG9zLGlkeCkpKQotICAgICBpZHgtLTsKLSAgICBpZHgrKzsKLSAgICAKLSAgICAvKiBDb3B5IGJ1ZmZlciB1cHRvIGxhc3QgY2hhciwgYnV0IGJsYW5rIGxpbmVzIGJlZm9yZSBhbmQgYWZ0ZXIKLSAgICAgICBkb3RzIGRvbid0IGNvdW50ICovCi0gICAgc2wgPSAxOwotCi0gICAgd2hpbGUgKGMgPCBpZHgpCi0gICAgewotCWlmIChhdCh0b3MsYykgPT0gJ1xuJyAKLQkgICAgJiYgYXQodG9zLGMrMSkgPT0gJ1xuJwotCSAgICAmJiBhdCh0b3MsYysyKSA9PSAnLicpIAotCXsKLQkgICAgLyogSWdub3JlIHR3byBuZXdsaW5lcyBiZWZvcmUgYSBkb3QqLwotCSAgICBjKys7Ci0JfQotCWVsc2UgaWYgKGF0KHRvcyxjKSA9PSAnLicgJiYgc2wpCi0JewotCSAgICAvKiByZW1lbWJlciB0aGF0IHRoaXMgbGluZSBzdGFydGVkIHdpdGggYSBkb3QgKi8KLQkgICAgZG90PTI7Ci0JfQotCWVsc2UgaWYgKGF0KHRvcyxjKSA9PSAnXG4nIAotCQkgJiYgYXQodG9zLGMrMSkgPT0gJ1xuJwotCQkgJiYgZG90KQotCXsKLQkgICAgYysrOwotCSAgICAvKiBJZ25vcmUgdHdvIG5ld2xpbmVzIHdoZW4gbGFzdCBsaW5lIHdhcyBkb3QgKi8KLQl9Ci0KLQljYXRjaGFyKCZvdXQsIGF0KHRvcyxjKSk7Ci0JaWYgKGF0KHRvcyxjKSA9PSAnXG4nKQotCXsKLQkgICAgc2wgPSAxOwotCSAgICAKLQkgICAgaWYgKGRvdCA9PSAyKWRvdD0xO2Vsc2UgZG90ID0gMDsKLQl9Ci0JZWxzZQotCSAgc2wgPSAwOwotCQotCWMrKzsJCi0KLSAgICB9Ci0gICAgCi0gICAgLyogQXBwZW5kIG5sKi8KLSAgICBjYXRjaGFyKCZvdXQsICdcbicpOwotICAgIHBjKys7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0gICAgCi0gICAgCi19Ci0KLVdPUkQoaW5kZW50KQotewotICAgIHN0cmluZ190eXBlIG91dDsKLSAgICBpbnQgdGFiID0gMDsKLSAgICBpbnQgaWR4ID0gMDsKLSAgICBpbnQgb2wgPTA7Ci0gICAgaW5pdF9zdHJpbmcoJm91dCk7Ci0gICAgd2hpbGUgKGF0KHRvcyxpZHgpKSB7Ci0JICAgIHN3aXRjaCAoYXQodG9zLGlkeCkpIAotCSAgICB7Ci0JICAgICAgY2FzZSAnXG4nOgotCQljYXR0ZXh0KCZvdXQsIlxuIik7Ci0JCWlkeCsrOwotCQlpZiAodGFiICYmIGF0KHRvcyxpZHgpKQotCQl7Ci0JCSAgICBjYXR0ZXh0KCZvdXQsIiAgICAiKTsKLQkJfQotCQlvbCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgJygnOgotCQl0YWIrKzsKLQkJaWYgKG9sID09IDApCi0JCSAgICBjYXR0ZXh0KCZvdXQsIiAgICIpOwotCQlpZHgrKzsKLQkJY2F0dGV4dCgmb3V0LCIoIik7Ci0JCW9sID0gMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAnKSc6Ci0JCXRhYi0tOwotCQljYXR0ZXh0KCZvdXQsIikiKTsKLQkJaWR4Kys7Ci0JCW9sPTE7Ci0JCQotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQljYXRjaGFyKCZvdXQsYXQodG9zLGlkeCkpOwotCQlvbD0xOwotCQkKLQkJaWR4Kys7Ci0JCWJyZWFrOwotCSAgICB9Ci0JfQkKLQotICAgIHBjKys7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgICp0b3MgPSBvdXQ7Ci0KLX0KLQotCi1XT1JEKGdldF9zdHVmZl9pbl9jb21tYW5kKQotewotICAgIHRvcysrOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIGluaXRfc3RyaW5nKHRvcyk7Ci0KLSAgICB3aGlsZSAoYXQocHRyLCBpZHgpKSB7Ci0JICAgIGlmIChpc2NvbW1hbmQocHRyLCBpZHgpKSAgYnJlYWs7Ci0JICAgIGlkeCA9ICAgY29weV9wYXN0X25ld2xpbmUocHRyLCBpZHgsIHRvcyk7Ci0JfQotICAgIHBjKys7ICAgIAotfQotCi1XT1JEKHN3YXApCi17Ci0gICAgc3RyaW5nX3R5cGUgdDsKLSAgICAKLSAgICB0ID0gdG9zWzBdOwotICAgIHRvc1swXSA9IHRvc1stMV07Ci0gICAgdG9zWy0xXSA9dDsgCi0gICAgcGMrKzsKLSAgICAKLX0KLQotV09SRChvdGhlcl9kdXApCi17Ci0gICAgdG9zKys7Ci0gICAgY2hlY2tfcmFuZ2UgKCk7Ci0gICAgaW5pdF9zdHJpbmcodG9zKTsKLSAgICBjYXRzdHIodG9zLCB0b3MtMSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChkcm9wKQotewotICB0b3MtLTsKLSAgY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoaWRyb3ApCi17Ci0gIGlzcC0tOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoaWNhdHN0cikKLXsKLSAgICB0b3MtLTsKLSAgICBjaGVja19yYW5nZSAoKTsKLSAgICBjYXRzdHIodG9zLCB0b3MrMSk7Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MrMSk7Ci0gICAgcGMrKzsKLX0KLQotV09SRChza2lwX3Bhc3RfbmV3bGluZSkKLXsKLSAgICB3aGlsZSAoYXQocHRyLGlkeCkgCi0JICAgJiYgYXQocHRyLGlkeCkgIT0gJ1xuJykKLSAgICAgaWR4Kys7Ci0gICAgaWR4Kys7Ci0gICAgcGMrKzsKLX0KLQotCi1XT1JEKGludGVybmFsbW9kZSkKLXsKLSAgICBpbnRlcm5hbF9tb2RlID0gKihpc3ApOwotICAgIGlzcC0tOwotICAgIGljaGVja19yYW5nZSAoKTsKLSAgICBwYysrOwotfQotCi1XT1JEKG1heWJlY2F0c3RyKQotewotICAgIGlmIChpbnRlcm5hbF93YW50ZWQgPT0gaW50ZXJuYWxfbW9kZSkgCi0gICAgewotCWNhdHN0cih0b3MtMSwgdG9zKTsKLSAgICB9Ci0gICAgZGVsZXRlX3N0cmluZyh0b3MpOwotICAgIHRvcy0tOwotICAgIGNoZWNrX3JhbmdlICgpOwotICAgIHBjKys7Ci19Ci0KLWNoYXIgKgotREVGVU4obmV4dHdvcmQsKHN0cmluZywgd29yZCksCi0gICAgICBjaGFyICpzdHJpbmcgQU5ECi0gICAgICBjaGFyICoqd29yZCkKLXsKLSAgICBjaGFyICp3b3JkX3N0YXJ0OwotICAgIGludCBpZHg7Ci0gICAgY2hhciAqZHN0OwotICAgIGNoYXIgKnNyYzsKLSAgICAKLSAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAKLSAgICB3aGlsZSAoaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykgfHwgKnN0cmluZyA9PSAnLScpIHsKLQkgICAgaWYgKCpzdHJpbmcgPT0gJy0nKSAKLQkgICAgewotCQl3aGlsZSAoKnN0cmluZyAmJiAqc3RyaW5nICE9ICdcbicpIAotCQkgc3RyaW5nKys7Ci0JCQotCSAgICB9Ci0JICAgIGVsc2UgewotCQkgICAgc3RyaW5nKys7Ci0JCX0KLQl9Ci0gICAgaWYgKCEqc3RyaW5nKSByZXR1cm4gMDsKLSAgICAKLSAgICB3b3JkX3N0YXJ0ID0gc3RyaW5nOwotICAgIGlmICgqc3RyaW5nID09ICciJykgCi0gICAgICB7Ci0JZG8KLQkgIHsKLQkgICAgc3RyaW5nKys7Ci0JICAgIGxlbmd0aCsrOwotCSAgICBpZiAoKnN0cmluZyA9PSAnXFwnKQotCSAgICAgIHsKLQkJc3RyaW5nICs9IDI7Ci0JCWxlbmd0aCArPSAyOwotCSAgICAgIH0KLQkgIH0KLQl3aGlsZSAoKnN0cmluZyAhPSAnIicpOwotICAgICAgfQotICAgIGVsc2UgICAgIAotICAgICAgewotCXdoaWxlICghaXNzcGFjZSgodW5zaWduZWQgY2hhcikgKnN0cmluZykpIAotCXsKLQkgICAgc3RyaW5nKys7Ci0JICAgIGxlbmd0aCsrOwotCQotCX0KLSAgICB9Ci0gICAgCi0gICAgKndvcmQgPSBtYWxsb2MobGVuZ3RoICsgMSk7Ci0KLSAgICBkc3QgPSAqd29yZDsKLSAgICBzcmMgPSB3b3JkX3N0YXJ0OwotCi0KLSAgICBmb3IgKGlkeD0gMDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykgCi0gICAgICB7Ci0JaWYgKHNyY1tpZHhdID09ICdcXCcpCi0JICBzd2l0Y2ggKHNyY1tpZHgrMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKmRzdCsrID0gJ1xuJzsKLQkgICAgICBpZHgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnIic6Ci0JICAgIGNhc2UgJ1xcJzoKLQkgICAgICAqZHN0KysgPSBzcmNbaWR4KzFdOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgICpkc3QrKyA9ICdcXCc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQllbHNlCi0JICAqZHN0KysgPSBzcmNbaWR4XTsKLSAgICB9Ci0gICAgKmRzdCsrID0gMDsKLQotCi0KLQotCi0gICAgaWYoKnN0cmluZykgICAgCi0gICAgIHJldHVybiBzdHJpbmcgKyAxOwotICAgIGVsc2UgCi0gICAgIHJldHVybiAwOwotICAgIAotfQotZGljdF90eXBlICpyb290OwotZGljdF90eXBlICoKLURFRlVOKGxvb2t1cF93b3JkLCh3b3JkKSwKLSAgICAgIGNoYXIgKndvcmQpCi17Ci0gIGRpY3RfdHlwZSAqcHRyID0gcm9vdDsKLSAgd2hpbGUgKHB0cikgewotICAgICAgaWYgKHN0cmNtcChwdHItPndvcmQsIHdvcmQpID09IDApIHJldHVybiBwdHI7Ci0gICAgICBwdHIgPSBwdHItPm5leHQ7Ci0JICAgIAotICAgIH0KLSAgaWYgKHdhcm5pbmcpCi0gICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3QgZmluZCAlc1xuIix3b3JkKTsKLSAgcmV0dXJuIDA7Ci0gICAgCi0gICAgCi19Ci0KLXN0YXRpYyB2b2lkIERFRlVOX1ZPSUQocGVyZm9ybSkKLXsKLSAgdG9zID0gc3RhY2s7Ci0gICAgCi0gIHdoaWxlIChhdChwdHIsIGlkeCkpIHsKLSAgICAgIC8qIEl0J3Mgd29ydGggbG9va2luZyB0aHJvdWdoIHRoZSBjb21tYW5kIGxpc3QgKi8KLSAgICAgIGlmIChpc2NvbW1hbmQocHRyLCBpZHgpKQotICAgICAgewotCWNoYXIgKm5leHQ7Ci0JZGljdF90eXBlICp3b3JkIDsKLQkJCi0JKHZvaWQpCQluZXh0d29yZChhZGRyKHB0ciwgaWR4KSwgJm5leHQpOwotCi0KLQl3b3JkID0gbG9va3VwX3dvcmQobmV4dCk7Ci0KLQotCQkKLQotCWlmICh3b3JkKSAKLQl7Ci0JICBleGVjKHdvcmQpOwotCX0KLQllbHNlCi0JewotCSAgaWYgKHdhcm5pbmcpCi0JICAgZnByaW50ZihzdGRlcnIsIndhcm5pbmcsICVzIGlzIG5vdCByZWNvZ25pc2VkXG4iLCAgbmV4dCk7Ci0JICBza2lwX3Bhc3RfbmV3bGluZSgpOwotCX0KLQkJCi0gICAgICB9Ci0gICAgICBlbHNlIHNraXBfcGFzdF9uZXdsaW5lKCk7Ci0KLSAgICB9Ci19Ci0KLWRpY3RfdHlwZSAqCi1ERUZVTihuZXdlbnRyeSwod29yZCksCi0gICAgICBjaGFyICp3b3JkKQotewotICAgIGRpY3RfdHlwZSAqbmV3ID0gKGRpY3RfdHlwZSAqKW1hbGxvYyhzaXplb2YoZGljdF90eXBlKSk7Ci0gICAgbmV3LT53b3JkID0gd29yZDsKLSAgICBuZXctPm5leHQgPSByb290OwotICAgIHJvb3QgPSBuZXc7Ci0gICAgbmV3LT5jb2RlID0gKHN0aW5zdF90eXBlICopbWFsbG9jKHNpemVvZihzdGluc3RfdHlwZSApKTsKLSAgICBuZXctPmNvZGVfbGVuZ3RoID0gMTsKLSAgICBuZXctPmNvZGVfZW5kID0gMDsKLSAgICByZXR1cm4gbmV3OwotICAgIAotfQotCi0KLXVuc2lnbmVkIGludAotREVGVU4oYWRkX3RvX2RlZmluaXRpb24sKGVudHJ5LCB3b3JkKSwgCi0gICAgICBkaWN0X3R5cGUgKmVudHJ5IEFORAotICAgICAgc3RpbnN0X3R5cGUgd29yZCkKLXsKLSAgICBpZiAoZW50cnktPmNvZGVfZW5kID09IGVudHJ5LT5jb2RlX2xlbmd0aCkgCi0gICAgewotCWVudHJ5LT5jb2RlX2xlbmd0aCArPSAyOwotCWVudHJ5LT5jb2RlID0KLQkgKHN0aW5zdF90eXBlICopIHJlYWxsb2MoKGNoYXIgKikoZW50cnktPmNvZGUpLAotCQkJICAgICAgIGVudHJ5LT5jb2RlX2xlbmd0aCAqc2l6ZW9mKHdvcmRfdHlwZSkpOwotICAgIH0KLSAgICBlbnRyeS0+Y29kZVtlbnRyeS0+Y29kZV9lbmRdID0gd29yZDsKLSAgICAKLXJldHVybiAgICAgZW50cnktPmNvZGVfZW5kKys7ICAKLX0KLQotCi0KLQotCi0KLQotdm9pZAotREVGVU4oYWRkX2ludHJpbnNpYywobmFtZSwgZnVuYyksCi0gICAgICBjaGFyICpuYW1lIEFORAotICAgICAgdm9pZCAoKmZ1bmMpKCkpCi17Ci0gICAgZGljdF90eXBlICpuZXcgPSBuZXdlbnRyeShuYW1lKTsKLSAgICBhZGRfdG9fZGVmaW5pdGlvbihuZXcsIGZ1bmMpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgMCk7Ci19Ci0KLXZvaWQKLURFRlVOKGFkZF92YXIsKG5hbWUpLAotICAgICAgY2hhciAqbmFtZSkKLXsKLSAgICBkaWN0X3R5cGUgKm5ldyA9IG5ld2VudHJ5KG5hbWUpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgcHVzaF9udW1iZXIpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywgKHN0aW5zdF90eXBlKSgmKG5ldy0+dmFyKSkpOwotICAgIGFkZF90b19kZWZpbml0aW9uKG5ldywwKTsKLX0KLQotCi12b2lkIAotREVGVU4oY29tcGlsZSwgKHN0cmluZyksIAotICAgICAgY2hhciAqc3RyaW5nKQotewotICAgIC8qIGFkZCB3b3JkcyB0byB0aGUgZGljdGlvbmFyeSAqLwotICAgIGNoYXIgKndvcmQ7Ci0gICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0gICAgd2hpbGUgKHN0cmluZyAmJiAqc3RyaW5nICYmIHdvcmRbMF0pIAotICAgIHsKLQlpZiAoc3RyY21wKHdvcmQsInZhciIpPT0wKSAKLQl7Ci0gc3RyaW5nPW5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgCi0JICBhZGRfdmFyKHdvcmQpOwotIHN0cmluZz1uZXh0d29yZChzdHJpbmcsICZ3b3JkKTsKLQl9Ci1lbHNlCQotCSAgICAKLQlpZiAod29yZFswXSA9PSAnOicpCi0JewotCSAgICBkaWN0X3R5cGUgKnB0cjsKLQkgICAgLyogQ29tcGlsZSBhIHdvcmQgYW5kIGFkZCB0byBkaWN0aW9uYXJ5ICovCi0JICAgIHN0cmluZyA9IG5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgICAKLQkgICAgcHRyID0gbmV3ZW50cnkod29yZCk7Ci0JICAgIHN0cmluZyA9IG5leHR3b3JkKHN0cmluZywgJndvcmQpOwotCSAgICB3aGlsZSAod29yZFswXSAhPSAnOycgKSAKLQkgICAgewotCQkgc3dpdGNoICh3b3JkWzBdKSAKLQkJIHsKLQkJICAgY2FzZSAnIic6Ci0JCSAgICAgLyogZ290IGEgc3RyaW5nLCBlbWJlZCBtYWdpYyBwdXNoIHN0cmluZwotCQkJZnVuY3Rpb24gKi8KLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIHB1c2hfdGV4dCk7Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCAoc3RpbnN0X3R5cGUpKHdvcmQrMSkpOwotCQkgICAgIGJyZWFrOwotCQkgICBjYXNlICcwJzoKLQkJICAgY2FzZSAnMSc6Ci0JCSAgIGNhc2UgJzInOgotCQkgICBjYXNlICczJzoKLQkJICAgY2FzZSAnNCc6Ci0JCSAgIGNhc2UgJzUnOgotCQkgICBjYXNlICc2JzoKLQkJICAgY2FzZSAnNyc6Ci0JCSAgIGNhc2UgJzgnOgotCQkgICBjYXNlICc5JzoKLQkJICAgICAvKiBHb3QgYSBudW1iZXIsIGVtYmVkZCB0aGUgbWFnaWMgcHVzaCBudW1iZXIKLQkJCWZ1bmN0aW9uICovCi0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCBwdXNoX251bWJlcik7Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCAoc3RpbnN0X3R5cGUpYXRvbCh3b3JkKSk7Ci0JCSAgICAgYnJlYWs7Ci0JCSAgIGRlZmF1bHQ6Ci0JCSAgICAgYWRkX3RvX2RlZmluaXRpb24ocHRyLCBjYWxsKTsKLQkJICAgICBhZGRfdG9fZGVmaW5pdGlvbihwdHIsIChzdGluc3RfdHlwZSlsb29rdXBfd29yZCh3b3JkKSk7Ci0JCSB9Ci0KLQkJc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7CQkgICAgIAotCSAgICB9Ci0JICAgIGFkZF90b19kZWZpbml0aW9uKHB0ciwwKTsKLQkgICAgc3RyaW5nID0gbmV4dHdvcmQoc3RyaW5nLCAmd29yZCk7Ci0JfQotCWVsc2UgCi0JewotCSAgICBmcHJpbnRmKHN0ZGVyciwic3ludGF4IGVycm9yIGF0ICVzXG4iLHN0cmluZy0xKTsKLQl9CSAgICAKLSAgICB9Ci0KLX0KLQotIAotc3RhdGljIHZvaWQgREVGVU5fVk9JRChiYW5nKQotewotICAqKGxvbmcgKikoKGlzcFswXSkpID0gaXNwWy0xXTsKLSAgaXNwLT0yOwotICBpY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLVdPUkQoYXRzaWduKQotewotICAgIGlzcFswXSA9ICoobG9uZyAqKShpc3BbMF0pOwotICAgIHBjKys7Ci19Ci0KLVdPUkQoaGVsbG8pCi17Ci0gIHByaW50ZigiaGVsbG9cbiIpOwotICBwYysrOyAgICAKLX0KLQotV09SRChzdGRvdXRfKQotewotICBpc3ArKzsKLSAgaWNoZWNrX3JhbmdlICgpOwotICAqaXNwID0gMTsKLSAgcGMrKzsKLX0KLQotV09SRChzdGRlcnJfKQotewotICBpc3ArKzsKLSAgaWNoZWNrX3JhbmdlICgpOwotICAqaXNwID0gMjsKLSAgcGMrKzsKLX0KLQotV09SRChwcmludCkKLXsKLSAgaWYgKCppc3AgPT0gMSkKLSAgICB3cml0ZV9idWZmZXIgKHRvcywgc3Rkb3V0KTsKLSAgZWxzZSBpZiAoKmlzcCA9PSAyKQotICAgIHdyaXRlX2J1ZmZlciAodG9zLCBzdGRlcnIpOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCAicHJpbnQ6IGlsbGVnYWwgcHJpbnQgZGVzdGluYXRpb24gYCVsZCdcbiIsICppc3ApOwotICBpc3AtLTsKLSAgdG9zLS07Ci0gIGljaGVja19yYW5nZSAoKTsKLSAgY2hlY2tfcmFuZ2UgKCk7Ci0gIHBjKys7Ci19Ci0KLQotc3RhdGljIHZvaWQgREVGVU4ocmVhZF9pbiwgKHN0ciwgZmlsZSksIAotCSAgIHN0cmluZ190eXBlICpzdHIgQU5ECi0JCSAgRklMRSAqZmlsZSkKLXsKLSAgICBjaGFyIGJ1ZmZbMTAwMDBdOyAgICAKLSAgICB1bnNpZ25lZCBpbnQgcjsKLSAgICBkbyAKLSAgICB7Ci0JciA9IGZyZWFkKGJ1ZmYsIDEsIHNpemVvZihidWZmKSwgZmlsZSk7Ci0JY2F0YnVmKHN0ciwgYnVmZiwgcik7Ci0gICAgfQotICAgIHdoaWxlIChyKTsKLSAgICBidWZmWzBdID0gMDsKLSAgICAKLSAgICBjYXRidWYoc3RyLCBidWZmLDEpOwotfQotCi0KLXN0YXRpYyB2b2lkIERFRlVOX1ZPSUQodXNhZ2UpCi17Ci0gICAgZnByaW50ZihzdGRlcnIsInVzYWdlOiAtW2R8aXxnXSA8ZmlsZSA+ZmlsZVxuIik7Ci0gICAgZXhpdCgzMyk7ICAgIAotfQotCi0vKiBUaGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gZGVjbGFyZSBleGl0LiAgU29tZXRpbWVzIGl0IHJldHVybnMKLSAgIGludCwgYW5kIHNvbWV0aW1lcyBpdCByZXR1cm5zIHZvaWQuICBTb21ldGltZXMgaXQgY2hhbmdlcyBiZXR3ZWVuCi0gICBPUyByZWxlYXNlcy4gIFRyeWluZyB0byBnZXQgaXQgZGVjbGFyZWQgY29ycmVjdGx5IGluIHRoZSBob3N0cyBmaWxlCi0gICBpcyBhIHBvaW50bGVzcyB3YXN0ZSBvZiB0aW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZXdfZXhpdCAoKQotewotICBleGl0ICgwKTsKLX0KLQotaW50IERFRlVOKG1haW4sKGFjLGF2KSwKLWludCBhYyBBTkQKLWNoYXIgKmF2W10pCi17Ci0gIHVuc2lnbmVkIGludCBpOwotICBzdHJpbmdfdHlwZSBidWZmZXI7Ci0gIHN0cmluZ190eXBlIHBwdHI7Ci0KLSAgaW5pdF9zdHJpbmcoJmJ1ZmZlcik7Ci0gIGluaXRfc3RyaW5nKCZwcHRyKTsKLSAgaW5pdF9zdHJpbmcoc3RhY2srMCk7Ci0gIHRvcz1zdGFjaysxOwotICBwdHIgPSAmcHB0cjsKLSAgICAKLSAgYWRkX2ludHJpbnNpYygicHVzaF90ZXh0IiwgcHVzaF90ZXh0KTsKLSAgYWRkX2ludHJpbnNpYygiISIsIGJhbmcpOwotICBhZGRfaW50cmluc2ljKCJAIiwgYXRzaWduKTsKLSAgYWRkX2ludHJpbnNpYygiaGVsbG8iLGhlbGxvKTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInN0ZG91dCIsc3Rkb3V0Xyk7ICAgIAotICBhZGRfaW50cmluc2ljKCJzdGRlcnIiLHN0ZGVycl8pOyAgICAKLSAgYWRkX2ludHJpbnNpYygicHJpbnQiLHByaW50KTsgICAgCi0gIGFkZF9pbnRyaW5zaWMoInNraXBfcGFzdF9uZXdsaW5lIiwgc2tpcF9wYXN0X25ld2xpbmUgKTsKLSAgYWRkX2ludHJpbnNpYygiY2F0c3RyIiwgaWNhdHN0ciApOwotICBhZGRfaW50cmluc2ljKCJjb3B5X3Bhc3RfbmV3bGluZSIsIGljb3B5X3Bhc3RfbmV3bGluZSApOwotICBhZGRfaW50cmluc2ljKCJkdXAiLCBvdGhlcl9kdXAgKTsKLSAgYWRkX2ludHJpbnNpYygiZHJvcCIsIGRyb3ApOwotICBhZGRfaW50cmluc2ljKCJpZHJvcCIsIGlkcm9wKTsKLSAgYWRkX2ludHJpbnNpYygicmVtY2hhciIsIHJlbWNoYXIgKTsKLSAgYWRkX2ludHJpbnNpYygiZ2V0X3N0dWZmX2luX2NvbW1hbmQiLCBnZXRfc3R1ZmZfaW5fY29tbWFuZCApOwotICBhZGRfaW50cmluc2ljKCJkb19mYW5jeV9zdHVmZiIsIGRvX2ZhbmN5X3N0dWZmICk7Ci0gIGFkZF9pbnRyaW5zaWMoImJ1bGxldGl6ZSIsIGJ1bGxldGl6ZSApOwotICBhZGRfaW50cmluc2ljKCJjb3VyaWVyaXplIiwgY291cmllcml6ZSApOwotICAvKiBJZiB0aGUgZm9sbG93aW5nIGxpbmUgZ2l2ZXMgYW4gZXJyb3IsIGV4aXQoKSBpcyBub3QgZGVjbGFyZWQgaW4gdGhlCi0gICAgIC4uL2hvc3RzL2Zvby5oIGZpbGUgZm9yIHRoaXMgaG9zdC4gIEZpeCBpdCB0aGVyZSwgbm90IGhlcmUhICAqLwotICAvKiBObywgZG9uJ3QgZml4IGl0IGFueXdoZXJlOyBzZWUgY29tbWVudCBvbiBjaGV3X2V4aXQtLUlhbiBUYXlsb3IuICAqLwotICBhZGRfaW50cmluc2ljKCJleGl0IiwgY2hld19leGl0ICk7Ci0gIGFkZF9pbnRyaW5zaWMoInN3YXAiLCBzd2FwICk7Ci0gIGFkZF9pbnRyaW5zaWMoIm91dHB1dGRvdHMiLCBvdXRwdXRkb3RzICk7Ci0gIGFkZF9pbnRyaW5zaWMoInBhcmFtc3R1ZmYiLCBwYXJhbXN0dWZmICk7Ci0gIGFkZF9pbnRyaW5zaWMoIm1heWJlY2F0c3RyIiwgbWF5YmVjYXRzdHIgKTsKLSAgYWRkX2ludHJpbnNpYygidHJhbnNsYXRlY29tbWVudHMiLCB0cmFuc2xhdGVjb21tZW50cyApOwotICBhZGRfaW50cmluc2ljKCJraWxsX2JvZ3VzX2xpbmVzIiwga2lsbF9ib2d1c19saW5lcyk7Ci0gIGFkZF9pbnRyaW5zaWMoImluZGVudCIsIGluZGVudCk7Ci0gIGFkZF9pbnRyaW5zaWMoImludGVybmFsbW9kZSIsIGludGVybmFsbW9kZSk7Ci0gIGFkZF9pbnRyaW5zaWMoInByaW50X3N0YWNrX2xldmVsIiwgcHJpbnRfc3RhY2tfbGV2ZWwpOwotICBhZGRfaW50cmluc2ljKCJzdHJpcF90cmFpbGluZ19uZXdsaW5lcyIsIHN0cmlwX3RyYWlsaW5nX25ld2xpbmVzKTsKLSAgICAKLSAgLyogUHV0IGEgbmwgYXQgdGhlIHN0YXJ0ICovCi0gIGNhdGNoYXIoJmJ1ZmZlciwnXG4nKTsKLQotICByZWFkX2luKCZidWZmZXIsIHN0ZGluKTsgCi0gIHJlbW92ZV9ub25jb21tZW50cygmYnVmZmVyLCBwdHIpOwotICBmb3IgKGk9IDE7IGkgPCAodW5zaWduZWQgaW50KSBhYzsgaSsrKSAKLSAgewotICAgIGlmIChhdltpXVswXSA9PSAnLScpCi0gICAgewotICAgICAgaWYgKGF2W2ldWzFdID09ICdmJykKLSAgICAgIHsKLQlzdHJpbmdfdHlwZSBiOwotCUZJTEUgKmY7Ci0JaW5pdF9zdHJpbmcoJmIpOwotCi0JZiAgPSBmb3BlbihhdltpKzFdLCJyIik7Ci0JaWYgKCFmKSAKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwiQ2FuJ3Qgb3BlbiB0aGUgaW5wdXQgZmlsZSAlc1xuIixhdltpKzFdKTsKLQkgIHJldHVybiAzMzsKLQl9Ci0KLQlyZWFkX2luKCZiLCBmKTsKLQljb21waWxlKGIucHRyKTsKLQlwZXJmb3JtKCk7CQotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ2knKSAKLSAgICAgIHsKLQlpbnRlcm5hbF93YW50ZWQgPSAxOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXZbaV1bMV0gPT0gJ3cnKSAKLSAgICAgIHsKLQl3YXJuaW5nID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLQl1c2FnZSAoKTsKLSAgICB9Ci0gIH0gICAgICAKLSAgd3JpdGVfYnVmZmVyKHN0YWNrKzAsIHN0ZG91dCk7Ci0gIGlmICh0b3MgIT0gc3RhY2spCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiZmluaXNoaW5nIHdpdGggY3VycmVudCBzdGFjayBsZXZlbCAlZFxuIiwgdG9zIC0gc3RhY2spOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9kb2MvZG9jLnN0ciBiL2JmZC9kb2MvZG9jLnN0cgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyNzZmZS4uMDAwMDAwMAotLS0gYS9iZmQvZG9jL2RvYy5zdHIKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotOiBET0NERAotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQga2lsbF9ib2d1c19saW5lcyBjYXRzdHIKLQk7Ci0KLTogRU5EREQKLQlza2lwX3Bhc3RfbmV3bGluZQotCTsKLQotOiBFWEFNUExFCi0Jc2tpcF9wYXN0X25ld2xpbmUJCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQga2lsbF9ib2d1c19saW5lcyBkb19mYW5jeV9zdHVmZiB0cmFuc2xhdGVjb21tZW50cyAKLQljb3VyaWVyaXplIGNhdHN0cgotCi0JOwotCi06IElOT0RFIAotCSJAbm9kZSAiIGNhdHN0ciBza2lwX3Bhc3RfbmV3bGluZSBjb3B5X3Bhc3RfbmV3bGluZSBjYXRzdHIgCi0JOwotCi06IENPREVfRlJBR01FTlQKLQlFWEFNUExFIAotCTsKLQotOiBDT01NRU5UCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCWRyb3AKLQk7Ci0KLTogU1lOT1BTSVMKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAc3Ryb25ne1N5bm9wc2lzfVxuIiBjYXRzdHIKLQkiQGV4YW1wbGVcbiIgY2F0c3RyCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQgIAotCWtpbGxfYm9ndXNfbGluZXMKLQlpbmRlbnQKLQljYXRzdHIKLQkiQGVuZCBleGFtcGxlXG4iIGNhdHN0cgotCi0JOwotCi06IGZ1bmMKLQkiQGZpbmRleCAiCS0gYQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlkdXAJCS0gYSB4IHggCi0JIkBzdWJzdWJzZWN0aW9uIEBjb2RleyIgLSBhIHggeCBiIAotCXN3YXAKLQlyZW1jaGFyCi0JIn1cbiIgLSBhIHggYiB4IGMKLQljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAKLQk7Ci0KLTogRlVOQ1RJT04KLQkiQGZpbmRleCAiCS0gYQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlkdXAJCS0gYSB4IHggCi0JIkBzdWJzdWJzZWN0aW9uIEBjb2RleyIgLSBhIHggeCBiIAotCXN3YXAKLQlyZW1jaGFyCi0JIn1cbiIgLSBhIHggYiB4IGMKLQljYXRzdHIgCWNhdHN0ciAJY2F0c3RyIAljYXRzdHIgCWNhdHN0ciAKLQk7Ci0KLTogYm9keXRleHQKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCAKLQlidWxsZXRpemUKLQlraWxsX2JvZ3VzX2xpbmVzCi0JZG9fZmFuY3lfc3R1ZmYKLQljb3VyaWVyaXplCi0JY2F0c3RyCi0JIlxuIiBjYXRzdHIKLQk7Ci0KLTogYXNlY3Rpb24KLQlza2lwX3Bhc3RfbmV3bGluZQotCWNhdHN0cgotCWNvcHlfcGFzdF9uZXdsaW5lIAkKLQlkb19mYW5jeV9zdHVmZiBjYXRzdHIgCQotCWJvZHl0ZXh0CQotCTsKLQotOiBTRUNUSU9OIAotCSJAc2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogU1VCU0VDVElPTgotCSJAc3Vic2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogU1VCU1VCU0VDVElPTgotCSJAc3Vic3Vic2VjdGlvbiAiIGFzZWN0aW9uICA7Ci0KLTogc3ViaGVhZAotCXNraXBfcGFzdF9uZXdsaW5lCi0JYm9keXRleHQKLQk7Ci0KLQotCi0JCi06IERFU0NSSVBUSU9OIAotCSJAc3Ryb25ne0Rlc2NyaXB0aW9ufUAqXG4iIGNhdHN0ciBzdWJoZWFkIDsKLQotOiBSRVRVUk5TCi0JIkBzdHJvbmd7UmV0dXJuc31AKlxuIiBjYXRzdHIgc3ViaGVhZCA7Ci0KLTogSU5URVJOQUxfRlVOQ1RJT04KLQlmdW5jIDsKLQotCi06IElOVEVSTkFMX0RFRklOSVRJT04gCi0JZnVuYyA7Ci0KLQotOiBJTlRFUk5BTAotCWZ1bmMgOwotCi06IFRZUEVERUYKLQlGVU5DVElPTiA7Ci0KLTogU0VOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCSJIZXJlIGFyZSB0aGUgcG9zc2libGUgdmFsdWVzIGZvciBAY29kZXtlbnVtICIKLQljb3B5X3Bhc3RfbmV3bGluZSByZW1jaGFyIGNhdHN0cgotCSJ9OlxuXG4iIGNhdHN0ciBjYXRzdHIKLQk7Ci06IEVOVU0KLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm4ge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciBjYXRzdHIKLQk7Ci06IEVOVU1YCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQkiQGRlZmZueCB7fSAiCi0JY29weV9wYXN0X25ld2xpbmUgY2F0c3RyCi0JY2F0c3RyCi0JOwotOiBFTlVNRVEKLQlza2lwX3Bhc3RfbmV3bGluZQotCSJAZGVmZm4ge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0ciBjYXRzdHIKLQlza2lwX3Bhc3RfbmV3bGluZQotCTsKLTogRU5VTUVRWAotCXNraXBfcGFzdF9uZXdsaW5lCi0JIkBkZWZmbngge30gIgotCWNvcHlfcGFzdF9uZXdsaW5lIGNhdHN0cgotCWNhdHN0cgotCXNraXBfcGFzdF9uZXdsaW5lCi0JOwotOiBFTlVNRE9DCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZAotCXN0cmlwX3RyYWlsaW5nX25ld2xpbmVzCi0JY2F0c3RyCi0JIlxuQGVuZCBkZWZmblxuIiBjYXRzdHIKLQk7CmRpZmYgLS1naXQgYS9iZmQvZG9jL21ha2VmaWxlLnZtcyBiL2JmZC9kb2MvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDg1N2MwLi4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1DRkxBR1MgPSAvbm9vcHQvaW5jbHVkZT0oW10sWy1dLFstLi0uaW5jbHVkZV0pCi1MREZMQUdTID0gL25vbWFwCi1MRExJQlMgPSAsc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotCi1hbGw6IGNoZXcuZXhlCmRpZmYgLS1naXQgYS9iZmQvZG9jL3Byb3RvLnN0ciBiL2JmZC9kb2MvcHJvdG8uc3RyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDMxYzE2Li4wMDAwMDAwCi0tLSBhL2JmZC9kb2MvcHJvdG8uc3RyCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLQotOiBTWU5PUFNJUwotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQJCi0JcGFyYW1zdHVmZgotCWluZGVudAotCW1heWJlY2F0c3RyCi07Ci0KLTogaWdub3JlCi0Jc2tpcF9wYXN0X25ld2xpbmUgCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQlvdXRwdXRkb3RzCi0JbWF5YmVjYXRzdHIKLQk7Ci0KLTogQ09ERV9GUkFHTUVOVAotCWlnbm9yZSA7Ci0KLTogZXh0ZXJuYWwKLQkwIGludGVybmFsbW9kZSBpZ25vcmUgOwotCi06IGludGVybmFsIAotCTEgaW50ZXJuYWxtb2RlIGlnbm9yZSA7Ci0KLS0gaW5wdXQgc3RhY2sgeyBhIGIgfSBvdXRwdXQgYiBpZiBpbnRlcm5hbCwgYSBpZiBleHRlcm5hbAotOiBpZmludGVybmFsCi0JIiIgc3dhcCAxIGludGVybmFsbW9kZSBtYXliZWNhdHN0cgotCXN3YXAKLQkiIiBzd2FwIDAgaW50ZXJuYWxtb2RlIG1heWJlY2F0c3RyCi0JY2F0c3RyCi0JOwotCi0tIFB1dCBub3RlIGluIG91dHB1dCBzdHJpbmcsIHJlZ2FyZGxlc3Mgb2YgaW50ZXJuYWwgbW9kZS4KLTogQ09NTUVOVAotCXNraXBfcGFzdF9uZXdsaW5lCi0JZ2V0X3N0dWZmX2luX2NvbW1hbmQKLQl0cmFuc2xhdGVjb21tZW50cwotCWNhdHN0cgotCTsKLQotLSBTRU5VTSAgICBlbnVtLXR5cGUtbmFtZQotLSBFTlVNICAgICBlbnVtLW5hbWUKLS0gRU5VTVggICAgYWRkbC1lbnVtLW5hbWUKLS0gRU5VTURPQyAgZG9jIGZvciBwcmVjZWRpbmcgZW51bXMKLS0gRU5EU0VOVU0gbWF4LWVudW0tbmFtZQotCi06IG1ha2VfZW51bV9oZWFkZXIKLQlkdXAKLQkiZW51bSAiIHN3YXAgY2F0c3RyCi0JIiB7XG4iIGNhdHN0cgotCXN3YXAgIiAgX2R1bW15X2ZpcnN0XyIgc3dhcCBjYXRzdHIgY2F0c3RyCi0JIixcbiIgY2F0c3RyCi0JOwotOiBtYWtlX3N0cmluZ190YWJsZV9oZWFkZXIKLQlkdXAKLQkiI2lmZGVmIF9CRkRfTUFLRV9UQUJMRV8iIHN3YXAgY2F0c3RyIHN3YXAKLQkiXG5cbnN0YXRpYyBjb25zdCBjaGFyICpjb25zdCAiIHN3YXAgY2F0c3RyIGNhdHN0cgotCSJfbmFtZXNbXSA9IHsgXCJAQHVuaW5pdGlhbGl6ZWRAQFwiLFxuIiBjYXRzdHIKLQk7Ci06IFNFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZQotCXJlbWNoYXIKLQlkdXAKLQltYWtlX2VudW1faGVhZGVyCi0Jc3dhcAotCW1ha2Vfc3RyaW5nX3RhYmxlX2hlYWRlcgotCWlmaW50ZXJuYWwKLQljYXRzdHIKLQlnZXRfc3R1ZmZfaW5fY29tbWFuZCBjYXRzdHIKLQl0cmFuc2xhdGVjb21tZW50cyA7Ci06IEVORFNFTlVNCi0Jc2tpcF9wYXN0X25ld2xpbmUKLQljb3B5X3Bhc3RfbmV3bGluZSBzdHJpcF90cmFpbGluZ19uZXdsaW5lcwotCWR1cAotCSIgICIgc3dhcCBjYXRzdHIgIiB9O1xuIiBjYXRzdHIJc3dhcAotCSIgXCJAQG92ZXJmbG93OiAiIHN3YXAgY2F0c3RyICJAQFwiLFxufTtcbiNlbmRpZlxuXG4iIGNhdHN0cgotCWlmaW50ZXJuYWwKLQljYXRzdHIKLQk7Ci06IG1ha2VfZW51bWVyYXRvcgotCSIgICIgc3dhcCBjYXRzdHIKLQkiLFxuIiBjYXRzdHIKLQk7Ci06IG1ha2VfZW51bWVyYXRvcl9zdHJpbmcKLQkiICBcIiIgc3dhcCBjYXRzdHIKLQkiXCIsXG4iIGNhdHN0cgotCTsKLTogRU5VTQotCXNraXBfcGFzdF9uZXdsaW5lCi0JY29weV9wYXN0X25ld2xpbmUKLQlyZW1jaGFyCi0JZHVwCi0JbWFrZV9lbnVtZXJhdG9yCi0Jc3dhcAotCW1ha2VfZW51bWVyYXRvcl9zdHJpbmcKLQlpZmludGVybmFsCi0JOwotOiBFTlVNWCBFTlVNIGNhdHN0ciA7Ci06IEVOVU1FUQotCXNraXBfcGFzdF9uZXdsaW5lCi0JIiNkZWZpbmUgIgotCWNvcHlfcGFzdF9uZXdsaW5lIHJlbWNoYXIKLQljYXRzdHIKLQkiICIKLQljYXRzdHIKLQljb3B5X3Bhc3RfbmV3bGluZQotCWNhdHN0cgotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQk7Ci06IEVOVU1FUVggRU5VTUVRIGNhdHN0ciA7Ci06IEVOVU1ET0MKLQlza2lwX3Bhc3RfbmV3bGluZQotCWdldF9zdHVmZl9pbl9jb21tYW5kCi0Jc3RyaXBfdHJhaWxpbmdfbmV3bGluZXMKLQkiXG57KiAiIHN3YXAgY2F0c3RyICIgKn1cbiIgY2F0c3RyCi0JdHJhbnNsYXRlY29tbWVudHMKLQktIGRpc2NhcmQgaXQgaWYgd2UncmUgZG9pbmcgaW50ZXJuYWwgbW9kZQotCSIiIHN3YXAgMCBpbnRlcm5hbG1vZGUgbWF5YmVjYXRzdHIKLQlzd2FwCi0JY2F0c3RyIGNhdHN0cgotCTsKLTogRU5EREQgZXh0ZXJuYWwgOwotOiBTRUNUSU9OIGlnbm9yZSA7Ci06IFNVQlNFQ1RJT04gaWdub3JlIDsKLTogU1VCU1VCU0VDVElPTiBpZ25vcmUgOwotOiBJTlRFUk5BTF9ERUZJTklUSU9OIGludGVybmFsIDsKLTogREVTQ1JJUFRJT04gaWdub3JlIDsKLTogRlVOQ1RJT04gZXh0ZXJuYWwgOwotOiBSRVRVUk5TIGlnbm9yZSA7Ci06IFRZUEVERUYgZXh0ZXJuYWwgOwotOiBJTlRFUk5BTF9GVU5DVElPTiBpbnRlcm5hbCA7Ci06IElOVEVSTkFMIGludGVybmFsIDsKLTogSU5PREUgaWdub3JlIDsKZGlmZiAtLWdpdCBhL2JmZC9kd2FyZjEuYyBiL2JmZC9kd2FyZjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3ZGY5Mi4uMDAwMDAwMAotLS0gYS9iZmQvZHdhcmYxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NzYgKzAsMCBAQAotLyogRFdBUkYgMSBmaW5kIG5lYXJlc3QgbGluZSAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUpLgotICAgQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVdyaXR0ZW4gYnkgR2F2aW4gUm9taWctS29jaCBvZiBDeWdudXMgU29sdXRpb25zIChnYXZpbkBjeWdudXMuY29tKS4gIAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2R3YXJmLmgiCi0KLS8qIGR3YXJmMV9kZWJ1ZyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIGFsbCBkd2FyZjEgaW5mby4gKi8KLQotc3RydWN0IGR3YXJmMV9kZWJ1ZyB7Ci0KLSAgLyogVGhlIGJmZCB3ZSBhcmUgd29ya2luZyB3aXRoLiAqLwotICBiZmQqIGFiZmQ7Ci0KLSAgLyogTGlzdCBvZiBhbHJlYWR5IHBhcnNlZCBjb21waWxhdGlvbiB1bml0cy4gKi8KLSAgc3RydWN0IGR3YXJmMV91bml0KiBsYXN0VW5pdDsKLQotICAvKiBUaGUgYnVmZmVyIGZvciB0aGUgLmRlYnVnIHNlY3Rpb24uIAotICAgICBaZXJvIGluZGljYXRlcyB0aGF0IHRoZSAuZGVidWcgc2VjdGlvbiBmYWlsZWQgdG8gbG9hZC4gKi8KLSAgY2hhciogZGVidWdfc2VjdGlvbjsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gbWVtb3J5IGJ1ZmZlci4gKi8KLSAgY2hhciogZGVidWdfc2VjdGlvbl9lbmQ7Ci0KLSAgLyogVGhlIGJ1ZmZlciBmb3IgdGhlIC5saW5lIHNlY3Rpb24uICovCi0gIGNoYXIqIGxpbmVfc2VjdGlvbjsKLQotICAvKiBFbmQgb2YgdGhhdCBidWZmZXIuICovCi0gIGNoYXIqIGxpbmVfc2VjdGlvbl9lbmQ7Ci0KLSAgLyogVGhlIGN1cnJlbnQgb3IgbmV4dCB1bnJlYWQgZGllIHdpdGhpbiB0aGUgLmRlYnVnIHNlY3Rpb24uICovCi0gIGNoYXIqIGN1cnJlbnREaWU7Ci19OwotCi0vKiBPbmUgZHdhcmYxX3VuaXQgZm9yIGVhY2ggcGFyc2VkIGNvbXBpbGF0aW9uIHVuaXQgZGllLiAqLwotCi1zdHJ1Y3QgZHdhcmYxX3VuaXQgewotICAvKiBMaW5rZWQgc3RhcnRpbmcgZnJvbSBzdGFzaC0+bGFzdFVuaXQuICovCi0gIHN0cnVjdCBkd2FyZjFfdW5pdCogcHJldjsKLQotICAvKiBOYW1lIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICBjaGFyKiBuYW1lOwotCi0gIC8qIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWRkcmVzcyB1c2VkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvd19wYzsKLSAgdW5zaWduZWQgbG9uZyBoaWdoX3BjOwotCi0gIC8qIERvZXMgdGhpcyB1bml0IGhhdmUgYSBzdGF0ZW1lbnQgbGlzdD8gKi8KLSAgaW50IGhhc19zdG10X2xpc3Q7Ci0KLSAgLyogSWYgYW55LCB0aGUgb2Zmc2V0IG9mIHRoZSBsaW5lIG51bWJlciB0YWJsZSBpbiB0aGUgLmxpbmUgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgbG9uZyBzdG10X2xpc3Rfb2Zmc2V0OwotCi0gIC8qIElmIG5vbi16ZXJvLCBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgdW5pdC4gKi8KLSAgY2hhciogZmlyc3RfY2hpbGQ7Ci0KLSAgLyogSG93IG1hbnkgbGluZSBlbnRyaWVzPyAqLwotICB1bnNpZ25lZCBsb25nIGxpbmVfY291bnQ7Ci0KLSAgLyogVGhlIGRlY29kZWQgbGluZSBudW1iZXIgdGFibGUgKGxpbmVfY291bnQgZW50cmllcykuICovCi0gIHN0cnVjdCBsaW5lbnVtYmVyKiBsaW5lbnVtYmVyX3RhYmxlOwotCi0gIC8qIFRoZSBsaXN0IG9mIGZ1bmN0aW9ucyBpbiB0aGlzIHVuaXQuICovCi0gIHN0cnVjdCBkd2FyZjFfZnVuYyogZnVuY19saXN0OwotfTsKLQotCi0KLS8qIE9uZSBkd2FyZjFfZnVuYyBmb3IgZWFjaCBwYXJzZWQgZnVuY3Rpb24gZGllLiAgKi8KLQotc3RydWN0IGR3YXJmMV9mdW5jIHsKLSAgLyogTGlua2VkIHN0YXJ0aW5nIGZyb20gYVVuaXQtPmZ1bmNfbGlzdC4gKi8KLSAgc3RydWN0IGR3YXJmMV9mdW5jKiBwcmV2OwotICAKLSAgLyogTmFtZSBvZiBmdW5jdGlvbi4gKi8KLSAgY2hhciogbmFtZTsKLSAgCi0gIC8qIFRoZSBoaWdoZXN0IGFuZCBsb3dlc3QgYWRkcmVzcyB1c2VkIGluIHRoZSBjb21waWxhdGlvbiB1bml0LiAqLwotICB1bnNpZ25lZCBsb25nIGxvd19wYzsKLSAgdW5zaWduZWQgbG9uZyBoaWdoX3BjOwotfTsKLQotCi0vKiBVc2VkIHRvIHJldHVybiBpbmZvIGFib3V0IGEgcGFyc2VkIGRpZS4gKi8KLXN0cnVjdCBkaWVfaW5mbyB7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICB1bnNpZ25lZCBsb25nIHNpYmxpbmc7Ci0gIHVuc2lnbmVkIGxvbmcgbG93X3BjOwotICB1bnNpZ25lZCBsb25nIGhpZ2hfcGM7Ci0gIHVuc2lnbmVkIGxvbmcgc3RtdF9saXN0X29mZnNldDsKLSAgCi0gIGNoYXIqIG5hbWU7IAotICAKLSAgaW50IGhhc19zdG10X2xpc3Q7Ci0KLSAgdW5zaWduZWQgc2hvcnQgdGFnOwotfTsKLQotCi0vKiBQYXJzZWQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICovCi1zdHJ1Y3QgbGluZW51bWJlciB7Ci0gIC8qIEZpcnN0IGFkZHJlc3MgaW4gdGhlIGxpbmUuICovCi0gIHVuc2lnbmVkIGxvbmcgYWRkcjsKLQotICAvKiBUaGUgbGluZSBudW1iZXIuICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZW51bWJlcjsKLX07Ci0KLQotLyogRmluZCB0aGUgZm9ybSBvZiBhbiBhdHRyLCBmcm9tIHRoZSBhdHRyIGZpZWxkLiAqLwotI2RlZmluZSBGT1JNX0ZST01fQVRUUihhdHRyKQkoKGF0dHIpICYgMHhGKQkvKiBJbXBsaWNpdGx5IHNwZWNpZmllZCAqLwotCi0KLS8qIFJldHVybiBhIG5ld2x5IGFsbG9jYXRlZCBkd2FyZjFfdW5pdC4gIEl0IHNob3VsZCBiZSBjbGVhcmVkIGFuZAotICAgdGhlbiBhdHRhY2hlZCBpbnRvIHRoZSAnc3Rhc2gnIGF0ICdzdGFzaC0+bGFzdFVuaXQnLiAqLwotCi1zdGF0aWMgc3RydWN0IGR3YXJmMV91bml0KgotYWxsb2NfZHdhcmYxX3VuaXQgKHN0YXNoKQotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLXsKLSAgc3RydWN0IGR3YXJmMV91bml0KiB4ID0gCi0gICAgKHN0cnVjdCBkd2FyZjFfdW5pdCopIGJmZF96YWxsb2MgKHN0YXNoLT5hYmZkLCAKLQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBkd2FyZjFfdW5pdCkpOwotICB4LT5wcmV2ID0gc3Rhc2gtPmxhc3RVbml0OwotICBzdGFzaC0+bGFzdFVuaXQgPSB4OwotCi0gIHJldHVybiB4OwotfQotCi0vKiBSZXR1cm4gYSBuZXdseSBhbGxvY2F0ZWQgZHdhcmYxX2Z1bmMuICBJdCBtdXN0IGJlIGNsZWFyZWQgYW5kCi0gICBhdHRhY2hlZCBpbnRvICdhVW5pdCcgYXQgJ2FVbml0LT5mdW5jX2xpc3QnLiAqLwotCi1zdGF0aWMgc3RydWN0IGR3YXJmMV9mdW5jKgotYWxsb2NfZHdhcmYxX2Z1bmMgKHN0YXNoLCBhVW5pdCkKLSAgICAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gICAgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci17Ci0gIHN0cnVjdCBkd2FyZjFfZnVuYyogeCA9IAotICAgIChzdHJ1Y3QgZHdhcmYxX2Z1bmMqKSBiZmRfemFsbG9jIChzdGFzaC0+YWJmZCwgCi0JCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZHdhcmYxX2Z1bmMpKTsKLSAgeC0+cHJldiA9IGFVbml0LT5mdW5jX2xpc3Q7Ci0gIGFVbml0LT5mdW5jX2xpc3QgPSB4OwotICAKLSAgcmV0dXJuIHg7Ci19Ci0KLS8qIHBhcnNlX2RpZSAtIHBhcnNlIGEgRHdhcmYxIGRpZS4KLSAgIFBhcnNlIHRoZSBkaWUgc3RhcnRpbmcgYXQgJ2FEaWVQdHInIGludG8gJ2FEaWVJbmZvJy4KLSAgICdhYmZkJyBtdXN0IGJlIHRoZSBiZmQgZnJvbSB3aGljaCB0aGUgc2VjdGlvbiB0aGF0ICdhRGllUHRyJwotICAgcG9pbnRzIHRvIHdhcyBwdWxsZWQgZnJvbS4gCi0KLSAgIFJldHVybiBmYWxzZSBpZiB0aGUgZGllIGlzIGludmFsaWRseSBmb3JtYXR0ZWQ7IHRydWUgb3RoZXJ3aXNlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfZGllIChhYmZkLCBhRGllSW5mbywgYURpZVB0cikKLSAgICAgYmZkKiBhYmZkOwotICAgICBzdHJ1Y3QgZGllX2luZm8qIGFEaWVJbmZvOwotICAgICBjaGFyKiAgICAgICAgICAgIGFEaWVQdHI7Ci17Ci0gIGNoYXIqIHRoaXNfZGllID0gYURpZVB0cjsKLSAgY2hhciogeHB0ciA9IHRoaXNfZGllOwotCi0gIG1lbXNldCAoYURpZUluZm8sMCxzaXplb2YoKmFEaWVJbmZvKSk7Ci0KLSAgLyogRmlyc3QgY29tZXMgdGhlIGxlbmd0aC4gKi8KLSAgYURpZUluZm8tPmxlbmd0aCA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotICB4cHRyICs9IDQ7Ci0gIGlmIChhRGllSW5mby0+bGVuZ3RoIDwgNikKLSAgICB7Ci0gICAgICAvKiBKdXN0IHBhZGRpbmcgYnl0ZXMuICovCi0gICAgICBhRGllSW5mby0+dGFnID0gVEFHX3BhZGRpbmc7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhlbiB0aGUgdGFnLiAqLwotICBhRGllSW5mby0+dGFnID0gYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7Ci0gIHhwdHIgKz0gMjsKLSAgICAgIAotICAvKiBUaGVuIHRoZSBhdHRyaWJ1dGVzLiAqLwotICB3aGlsZSAoeHB0ciA8ICh0aGlzX2RpZSArIGFEaWVJbmZvLT5sZW5ndGgpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGF0dHI7Ci0gICAgICAKLSAgICAgIC8qIFBhcnNlIHRoZSBhdHRyaWJ1dGUgYmFzZWQgb24gaXRzIGZvcm0uICBUaGlzIHNlY3Rpb24gCi0gICAgICAgICBtdXN0IGhhbmRsZSBhbGwgZHdhcmYxIGZvcm1zLCBidXQgbmVlZCBvbmx5IGhhbmRsZSB0aGUKLQkgYWN0dWFsIGF0dHJpYnV0ZXMgdGhhdCB3ZSBjYXJlIGFib3V0LiAqLwotCi0gICAgICBhdHRyID0gYmZkX2dldF8xNiAoYWJmZCwgeHB0cik7Ci0gICAgICB4cHRyICs9IDI7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAoRk9STV9GUk9NX0FUVFIgKGF0dHIpKQotCXsKLQljYXNlIEZPUk1fREFUQTI6Ci0JICB4cHRyICs9IDI7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fREFUQTQ6Ci0JY2FzZSBGT1JNX1JFRjoKLQkgIGlmIChhdHRyID09IEFUX3NpYmxpbmcpCi0JICAgIGFEaWVJbmZvLT5zaWJsaW5nID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICBlbHNlIGlmIChhdHRyID09IEFUX3N0bXRfbGlzdCkKLQkgICAgewotCSAgICAgIGFEaWVJbmZvLT5zdG10X2xpc3Rfb2Zmc2V0ID0gYmZkX2dldF8zMiAoYWJmZCwgeHB0cik7Ci0JICAgICAgYURpZUluZm8tPmhhc19zdG10X2xpc3QgPSAxOwotCSAgICB9Ci0JICB4cHRyICs9IDQ7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fREFUQTg6Ci0JICB4cHRyICs9IDg7Ci0JICBicmVhazsKLQljYXNlIEZPUk1fQUREUjoKLQkgIGlmIChhdHRyID09IEFUX2xvd19wYykKLQkgICAgYURpZUluZm8tPmxvd19wYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgZWxzZSBpZiAoYXR0ciA9PSBBVF9oaWdoX3BjKQotCSAgICBhRGllSW5mby0+aGlnaF9wYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgeHB0ciArPSA0OwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0JMT0NLMjoKLQkgIHhwdHIgKz0gMiArIGJmZF9nZXRfMTYgKGFiZmQsIHhwdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX0JMT0NLNDoKLQkgIHhwdHIgKz0gNCArIGJmZF9nZXRfMzIgKGFiZmQsIHhwdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBGT1JNX1NUUklORzoKLQkgIGlmIChhdHRyID09IEFUX25hbWUpCi0JICAgIGFEaWVJbmZvLT5uYW1lID0geHB0cjsKLQkgIHhwdHIgKz0gc3RybGVuICh4cHRyKSArIDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIGR3YXJmMSBsaW5lIG51bWJlciB0YWJsZSBmb3IgJ2FVbml0LT5zdG10X2xpc3Rfb2Zmc2V0JwotICAgaW50byAnYVVuaXQtPmxpbmVudW1iZXJfdGFibGUnLiAgUmV0dXJuIGZhbHNlIGlmIGFuIGVycm9yIAotICAgb2NjdXJzOyB0cnVlIG90aGVyd2lzZS4gKi8KLSAgCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfbGluZV90YWJsZSAoc3Rhc2gsIGFVbml0KQotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLXsKLSAgY2hhciogeHB0cjsKLQotICAvKiBMb2FkIHRoZSAiLmxpbmUiIHNlY3Rpb24gZnJvbSB0aGUgYmZkIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS4gKi8gCi0gIGlmIChzdGFzaC0+bGluZV9zZWN0aW9uID09IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci0gICAgICAKLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rhc2gtPmFiZmQsICIubGluZSIpOwotICAgICAgaWYgKCEgbXNlYykKLQlyZXR1cm4gZmFsc2U7Ci0JICAKLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmxpbmVfc2VjdGlvbiA9ICh1bnNpZ25lZCBjaGFyKikgYmZkX2FsbG9jIChzdGFzaC0+YWJmZCwgc2l6ZSk7Ci0gICAgICAKLSAgICAgIGlmICghIHN0YXNoLT5saW5lX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHN0YXNoLT5hYmZkLCBtc2VjLCBzdGFzaC0+bGluZV9zZWN0aW9uLCAwLCBzaXplKSkKLQl7Ci0JICBzdGFzaC0+bGluZV9zZWN0aW9uID0gMDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN0YXNoLT5saW5lX3NlY3Rpb25fZW5kID0gc3Rhc2gtPmxpbmVfc2VjdGlvbiArIHNpemU7Ci0gICAgfQotCi0gIHhwdHIgPSBzdGFzaC0+bGluZV9zZWN0aW9uICsgYVVuaXQtPnN0bXRfbGlzdF9vZmZzZXQ7Ci0gIGlmICh4cHRyIDwgc3Rhc2gtPmxpbmVfc2VjdGlvbl9lbmQpCi0gICAgewotICAgICAgaW50IGVhY2hMaW5lOwotCi0gICAgICBjaGFyKiB0YmxlbmQ7Ci0gICAgICB1bnNpZ25lZCBsb25nIGJhc2U7Ci0KLSAgICAgIC8qIEZpcnN0IGNvbWVzIHRoZSBsZW5ndGguICovCi0gICAgICB0YmxlbmQgPSBiZmRfZ2V0XzMyIChzdGFzaC0+YWJmZCwgeHB0cikgKyB4cHRyOwotICAgICAgeHB0ciArPSA0OwotCi0gICAgICAvKiBUaGVuIHRoZSBiYXNlIGFkZHJlc3MgZm9yIGVhY2ggYWRkcmVzcyBpbiB0aGUgdGFibGUuICovCi0gICAgICBiYXNlID0gYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpOwotICAgICAgeHB0ciArPSA0OwotCi0gICAgICAvKiBIb3cgbWFueSBsaW5lIGVudHJ5cz8KLQkgMTAgPSA0IChsaW5lIG51bWJlcikgKyAyIChwb3MgaW4gbGluZSkgKyA0IChhZGRyZXNzIGluIGxpbmUpICovCi0gICAgICBhVW5pdC0+bGluZV9jb3VudCA9ICh0YmxlbmQgLSB4cHRyKSAvIDEwOwotCi0gICAgICAvKiBBbGxvY2F0ZSBhbiBhcnJheSBmb3IgdGhlIGVudHJpZXMuICovCi0gICAgICBhVW5pdC0+bGluZW51bWJlcl90YWJsZSA9IChzdHJ1Y3QgbGluZW51bWJlciopCi0JYmZkX2FsbG9jIChzdGFzaC0+YWJmZCwgCi0JCSAgIHNpemVvZiAoc3RydWN0IGxpbmVudW1iZXIpICogYVVuaXQtPmxpbmVfY291bnQpOwotCQotICAgICAgZm9yIChlYWNoTGluZSA9IDA7IGVhY2hMaW5lIDwgYVVuaXQtPmxpbmVfY291bnQ7IGVhY2hMaW5lKyspCi0JewotCSAgLyogQSBsaW5lIG51bWJlci4gKi8KLQkgIGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2VhY2hMaW5lXS5saW5lbnVtYmVyCi0JICAgID0gYmZkX2dldF8zMiAoc3Rhc2gtPmFiZmQsIHhwdHIpOwotCSAgeHB0ciArPSA0OwotCi0JICAvKiBTa2lwIHRoZSBwb3NpdGlvbiB3aXRoaW4gdGhlIGxpbmUuICovCi0JICB4cHRyICs9IDI7Ci0KLQkgIC8qIEFuZCBmaW5hbGx5IHRoZSBhZGRyZXNzLiAqLwotCSAgYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbZWFjaExpbmVdLmFkZHIgCi0JICAgID0gYmFzZSArIGJmZF9nZXRfMzIgKHN0YXNoLT5hYmZkLCB4cHRyKTsKLQkgIHhwdHIgKz0gNDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBlYWNoIGZ1bmN0aW9uIGRpZSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQgJ2FVbml0Jy4KLSAgIFRoZSBmaXJzdCBjaGlsZCBkaWUgb2YgJ2FVbml0JyBzaG91bGQgYmUgaW4gJ2FVbml0LT5maXJzdF9jaGlsZCcsCi0gICB0aGUgcmVzdWx0IGlzIHBsYWNlZCBpbiAnYVVuaXQtPmZ1bmNfbGlzdCcuCi0gICBSZXR1cm4gZmFsc2UgaWYgZXJyb3I7IHRydWUgb3RoZXJ3aXNlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfZnVuY3Rpb25zX2luX3VuaXQgKHN0YXNoLCBhVW5pdCkKLSAgICAgc3RydWN0IGR3YXJmMV9kZWJ1Zyogc3Rhc2g7Ci0gICAgIHN0cnVjdCBkd2FyZjFfdW5pdCogYVVuaXQ7Ci17Ci0gIGNoYXIqIGVhY2hEaWU7Ci0KLSAgaWYgKGFVbml0LT5maXJzdF9jaGlsZCkKLSAgICBmb3IgKGVhY2hEaWUgPSBhVW5pdC0+Zmlyc3RfY2hpbGQ7Ci0JIGVhY2hEaWUgPCBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQ7Ci0JICkKLSAgICAgIHsKLQlzdHJ1Y3QgZGllX2luZm8gZWFjaERpZUluZm87Ci0JCi0JaWYgKCEgcGFyc2VfZGllIChzdGFzaC0+YWJmZCwgJmVhY2hEaWVJbmZvLCBlYWNoRGllKSkKLQkgIHJldHVybiBmYWxzZTsKLQkKLQlpZiAoZWFjaERpZUluZm8udGFnID09IFRBR19nbG9iYWxfc3Vicm91dGluZQotCSAgICB8fCBlYWNoRGllSW5mby50YWcgPT0gVEFHX3N1YnJvdXRpbmUKLQkgICAgfHwgZWFjaERpZUluZm8udGFnID09IFRBR19pbmxpbmVkX3N1YnJvdXRpbmUKLQkgICAgfHwgZWFjaERpZUluZm8udGFnID09IFRBR19lbnRyeV9wb2ludCkKLQkgIHsKLQkgICAgc3RydWN0IGR3YXJmMV9mdW5jKiBhRnVuYyA9IGFsbG9jX2R3YXJmMV9mdW5jIChzdGFzaCxhVW5pdCk7Ci0JICAgIAotCSAgICBhRnVuYy0+bmFtZSA9IGVhY2hEaWVJbmZvLm5hbWU7Ci0JICAgIGFGdW5jLT5sb3dfcGMgPSBlYWNoRGllSW5mby5sb3dfcGM7Ci0JICAgIGFGdW5jLT5oaWdoX3BjID0gZWFjaERpZUluZm8uaGlnaF9wYzsKLQkgIH0KLQkKLQkvKiBNb3ZlIHRvIG5leHQgc2libGluZywgaWYgbm9uZSwgZW5kIGxvb3AgKi8KLQlpZiAoZWFjaERpZUluZm8uc2libGluZykKLQkgIGVhY2hEaWUgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIGVhY2hEaWVJbmZvLnNpYmxpbmc7Ci0JZWxzZQotCSAgYnJlYWs7Ci0gICAgICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHRvICdhZGRyJyBpbiAnYVVuaXQnLgotICAgUmV0dXJuIHdoZXRoZXIgd2UgZm91bmQgdGhlIGxpbmUgKG9yIGEgZnVuY3Rpb24pIHdpdGhvdXQgZXJyb3IuICovCi0KLXN0YXRpYyBib29sZWFuCi1kd2FyZjFfdW5pdF9maW5kX25lYXJlc3RfbGluZSAoc3Rhc2gsIGFVbml0LCBhZGRyLCAKLQkJICAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJICAgICAgIGxpbmVudW1iZXJfcHRyKQotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnKiBzdGFzaDsKLSAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdDsKLSAgdW5zaWduZWQgbG9uZyBhZGRyOwotICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKLXsKLSAgaW50IGxpbmVfcCA9IGZhbHNlOwotICBpbnQgZnVuY19wID0gZmFsc2U7Ci0KLSAgaWYgKGFVbml0LT5sb3dfcGMgPD0gYWRkciAmJiBhZGRyIDwgYVVuaXQtPmhpZ2hfcGMpCi0gICAgewotICAgICAgaWYgKGFVbml0LT5oYXNfc3RtdF9saXN0KQotCXsKLQkgIGludCBpOwotCSAgc3RydWN0IGR3YXJmMV9mdW5jKiBlYWNoRnVuYzsKLQotCSAgaWYgKCEgYVVuaXQtPmxpbmVudW1iZXJfdGFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISBwYXJzZV9saW5lX3RhYmxlIChzdGFzaCwgYVVuaXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKCEgYVVuaXQtPmZ1bmNfbGlzdCkKLQkgICAgewotCSAgICAgIGlmICghIHBhcnNlX2Z1bmN0aW9uc19pbl91bml0IChzdGFzaCwgYVVuaXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgZm9yIChpID0gMDsgaSA8IGFVbml0LT5saW5lX2NvdW50OyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoYVVuaXQtPmxpbmVudW1iZXJfdGFibGVbaV0uYWRkciA8PSBhZGRyCi0JCSAgJiYgYWRkciA8IGFVbml0LT5saW5lbnVtYmVyX3RhYmxlW2krMV0uYWRkcikKLQkJewotCQkgICpmaWxlbmFtZV9wdHIgPSBhVW5pdC0+bmFtZTsKLQkJICAqbGluZW51bWJlcl9wdHIgPSBhVW5pdC0+bGluZW51bWJlcl90YWJsZVtpXS5saW5lbnVtYmVyOwotCQkgIGxpbmVfcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBmb3IgKGVhY2hGdW5jID0gYVVuaXQtPmZ1bmNfbGlzdDsgCi0JICAgICAgIGVhY2hGdW5jOyAKLQkgICAgICAgZWFjaEZ1bmMgPSBlYWNoRnVuYy0+cHJldikKLQkgICAgewotCSAgICAgIGlmIChlYWNoRnVuYy0+bG93X3BjIDw9IGFkZHIKLQkJICAmJiBhZGRyIDwgZWFjaEZ1bmMtPmhpZ2hfcGMpCi0JCXsKLQkJICAqZnVuY3Rpb25uYW1lX3B0ciA9IGVhY2hGdW5jLT5uYW1lOwotCQkgIGZ1bmNfcCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGxpbmVfcCB8fCBmdW5jX3A7Ci19Ci0KLQotCi0KLS8qIFRoZSBEV0FSRiAxIHZlcnNpb24gb2YgZmluZF9uZWFyZXN0IGxpbmUuCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAqLwotCi1ib29sZWFuCi1fYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLCBsaW5lbnVtYmVyX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lbnVtYmVyX3B0cjsKLXsKLSAgc3RydWN0IGR3YXJmMV9kZWJ1ZyAqc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjFfZmluZF9saW5lX2luZm87Ci0KLSAgc3RydWN0IGR3YXJmMV91bml0KiBlYWNoVW5pdDsKLQotICAvKiBXaGF0IGFkZHJlc3MgYXJlIHdlIGxvb2tpbmcgZm9yPyAqLwotICBiZmRfdm1hIGFkZHIgPSBvZmZzZXQgKyBzZWN0aW9uLT52bWE7Ci0KLSAgKmZpbGVuYW1lX3B0ciA9IE5VTEw7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gTlVMTDsKLSAgKmxpbmVudW1iZXJfcHRyID0gMDsKLSAgCi0KLSAgaWYgKCEgc3Rhc2gpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci0gICAgICAKLSAgICAgIHN0YXNoID0gZWxmX3RkYXRhIChhYmZkKS0+ZHdhcmYxX2ZpbmRfbGluZV9pbmZvID0KLQkoc3RydWN0IGR3YXJmMV9kZWJ1ZyopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGR3YXJmMV9kZWJ1ZykpOwotICAgICAgCi0gICAgICBpZiAoISBzdGFzaCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1ZyIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAvKiBObyBkd2FyZjEgaW5mby4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzdGFzaAotCSAgICAgaGFzIGJlZW4gYWxsb2NhdGVkLCBidXQgY29udGFpbnMgemVyb3MsIHRoaXMgbGV0cwotCSAgICAgZnV0dXJlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gZmFpbCBxdWlja2VyLiAqLwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBzdGFzaC0+ZGVidWdfc2VjdGlvbiA9ICh1bnNpZ25lZCBjaGFyKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gtPmRlYnVnX3NlY3Rpb24pCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG1zZWMsIHN0YXNoLT5kZWJ1Z19zZWN0aW9uLCAwLCBzaXplKSkKLQl7Ci0JICBzdGFzaC0+ZGVidWdfc2VjdGlvbiA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+ZGVidWdfc2VjdGlvbl9lbmQgPSBzdGFzaC0+ZGVidWdfc2VjdGlvbiArIHNpemU7Ci0gICAgICBzdGFzaC0+Y3VycmVudERpZSA9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uOwotICAgICAgc3Rhc2gtPmFiZmQgPSBhYmZkOwotICAgIH0KLQotICAvKiBBIG51bGwgZGVidWdfc2VjdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSB3YXMgbm8gZHdhcmYxIGluZm8KLSAgICAgb3IgdGhhdCBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIHN0YXNoLiAqLwotCi0gIGlmICghIHN0YXNoLT5kZWJ1Z19zZWN0aW9uKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0KLSAgLyogTG9vayBhdCB0aGUgcHJldmlvdXNseSBwYXJzZWQgdW5pdHMgdG8gc2VlIGlmIGFueSBjb250YWluCi0gICAgIHRoZSBhZGRyLiAqLwotICBmb3IgKGVhY2hVbml0ID0gc3Rhc2gtPmxhc3RVbml0OyBlYWNoVW5pdDsgZWFjaFVuaXQgPSBlYWNoVW5pdC0+cHJldikKLSAgICB7Ci0gICAgICBpZiAoZWFjaFVuaXQtPmxvd19wYyA8PSBhZGRyICYmIGFkZHIgPCBlYWNoVW5pdC0+aGlnaF9wYykKLQlyZXR1cm4gZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHN0YXNoLCBlYWNoVW5pdCwgYWRkciwKLQkJCQkJICAgICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJICAgICAgZnVuY3Rpb25uYW1lX3B0ciwgCi0JCQkJCSAgICAgIGxpbmVudW1iZXJfcHRyKTsKLSAgICB9Ci0KLSAgd2hpbGUgKHN0YXNoLT5jdXJyZW50RGllIDwgc3Rhc2gtPmRlYnVnX3NlY3Rpb25fZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBkaWVfaW5mbyBhRGllSW5mbzsKLQotICAgICAgaWYgKCEgcGFyc2VfZGllIChzdGFzaC0+YWJmZCwgJmFEaWVJbmZvLCBzdGFzaC0+Y3VycmVudERpZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBpZiAoYURpZUluZm8udGFnID09IFRBR19jb21waWxlX3VuaXQpCi0JewotCSAgc3RydWN0IGR3YXJmMV91bml0KiBhVW5pdAotCSAgICA9IGFsbG9jX2R3YXJmMV91bml0IChzdGFzaCk7Ci0JICAKLQkgIGFVbml0LT5uYW1lID0gYURpZUluZm8ubmFtZTsKLQkgIGFVbml0LT5sb3dfcGMgPSBhRGllSW5mby5sb3dfcGM7Ci0JICBhVW5pdC0+aGlnaF9wYyA9IGFEaWVJbmZvLmhpZ2hfcGM7Ci0JICBhVW5pdC0+aGFzX3N0bXRfbGlzdCA9IGFEaWVJbmZvLmhhc19zdG10X2xpc3Q7Ci0JICBhVW5pdC0+c3RtdF9saXN0X29mZnNldCA9IGFEaWVJbmZvLnN0bXRfbGlzdF9vZmZzZXQ7Ci0JICAKLQkgIC8qIEEgZGllIGhhcyBhIGNoaWxkIGlmIGl0J3MgZm9sbG93ZWQgYnkgYSBkaWUgdGhhdCBpcwotCSAgICAgbm90IGl0J3Mgc2libGluZy4gKi8KLQkgIGlmIChhRGllSW5mby5zaWJsaW5nIAotCSAgICAgICYmIHN0YXNoLT5jdXJyZW50RGllICsgYURpZUluZm8ubGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICA8IHN0YXNoLT5kZWJ1Z19zZWN0aW9uX2VuZAotCSAgICAgICYmIHN0YXNoLT5jdXJyZW50RGllICsgYURpZUluZm8ubGVuZ3RoIAotCSAgICAgICAgICAgICE9IHN0YXNoLT5kZWJ1Z19zZWN0aW9uICsgYURpZUluZm8uc2libGluZykKLQkgICAgYVVuaXQtPmZpcnN0X2NoaWxkID0gc3Rhc2gtPmN1cnJlbnREaWUgKyBhRGllSW5mby5sZW5ndGg7Ci0JICBlbHNlCi0JICAgIGFVbml0LT5maXJzdF9jaGlsZCA9IDA7Ci0KLQkgIGlmIChhVW5pdC0+bG93X3BjIDw9IGFkZHIgJiYgYWRkciA8IGFVbml0LT5oaWdoX3BjKQotCSAgICByZXR1cm4gZHdhcmYxX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKHN0YXNoLCBhVW5pdCwgYWRkciwgCi0JCQkJCQkgIGZpbGVuYW1lX3B0ciwgCi0JCQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIsIAotCQkJCQkJICBsaW5lbnVtYmVyX3B0cik7Ci0JfQotICAgICAgCi0gICAgICBpZiAoYURpZUluZm8uc2libGluZyAhPSAwKQotCXN0YXNoLT5jdXJyZW50RGllID0gc3Rhc2gtPmRlYnVnX3NlY3Rpb24gKyBhRGllSW5mby5zaWJsaW5nOwotICAgICAgZWxzZQotCXN0YXNoLT5jdXJyZW50RGllICs9IGFEaWVJbmZvLmxlbmd0aDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvYmZkL2R3YXJmMi5jIGIvYmZkL2R3YXJmMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVkYWM2Li4wMDAwMDAwCi0tLSBhL2JmZC9kd2FyZjIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1ODkgKzAsMCBAQAotLyogRFdBUkYgMiBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIEFkYXB0ZWQgZnJvbSBnZGIvZHdhcmYycmVhZC5jIGJ5IEdhdmluIEtvY2ggb2YgQ3lnbnVzIFNvbHV0aW9ucwotICAgKGdhdmluQGN5Z251cy5jb20pLgotCi0gICBGcm9tIHRoZSBkd2FyZjJyZWFkLmMgaGVhZGVyOgotICAgQWRhcHRlZCBieSBHYXJ5IEZ1bmNrIChnYXJ5QGludHJlcGlkLmNvbSksIEludHJlcGlkIFRlY2hub2xvZ3ksCi0gICBJbmMuICB3aXRoIHN1cHBvcnQgZnJvbSBGbG9yaWRhIFN0YXRlIFVuaXZlcnNpdHkgKHVuZGVyIGNvbnRyYWN0Ci0gICB3aXRoIHRoZSBBZGEgSm9pbnQgUHJvZ3JhbSBPZmZpY2UpLCBhbmQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgotICAgSW5pdGlhbCBjb250cmlidXRpb24gYnkgQnJlbnQgQmVuc29uLCBIYXJyaXMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLiwKLSAgIGJhc2VkIG9uIEZyZWQgRmlzaCdzIChDeWdudXMgU3VwcG9ydCkgaW1wbGVtZW50YXRpb24gb2YgRFdBUkYgMQotICAgc3VwcG9ydCBpbiBkd2FyZnJlYWQuYwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci15b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgotCi0vKiBUaGUgZGF0YSBpbiB0aGUgLmRlYnVnX2xpbmUgc3RhdGVtZW50IHByb2xvZ3VlIGxvb2tzIGxpa2UgdGhpcy4gICovCi1zdHJ1Y3QgbGluZV9oZWFkCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuZ3RoOwotICAgIHVuc2lnbmVkIHNob3J0IHZlcnNpb247Ci0gICAgdW5zaWduZWQgaW50IHByb2xvZ3VlX2xlbmd0aDsKLSAgICB1bnNpZ25lZCBjaGFyIG1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoOwotICAgIHVuc2lnbmVkIGNoYXIgZGVmYXVsdF9pc19zdG10OwotICAgIGludCBsaW5lX2Jhc2U7Ci0gICAgdW5zaWduZWQgY2hhciBsaW5lX3JhbmdlOwotICAgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX2Jhc2U7Ci0gICAgdW5zaWduZWQgY2hhciAqc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHM7Ci0gIH07Ci0KLS8qIEF0dHJpYnV0ZXMgaGF2ZSBhIG5hbWUgYW5kIGEgdmFsdWUgKi8KLXN0cnVjdCBhdHRyaWJ1dGUKLSAgewotICAgIGVudW0gZHdhcmZfYXR0cmlidXRlIG5hbWU7Ci0gICAgZW51bSBkd2FyZl9mb3JtIGZvcm07Ci0gICAgdW5pb24KLSAgICAgIHsKLQljaGFyICpzdHI7Ci0Jc3RydWN0IGR3YXJmX2Jsb2NrICpibGs7Ci0JdW5zaWduZWQgaW50IHVuc25kOwotCWludCBzbmQ7Ci0JYmZkX3ZtYSBhZGRyOwotICAgICAgfQotICAgIHU7Ci0gIH07Ci0KLS8qIEdldCBhdCBwYXJ0cyBvZiBhbiBhdHRyaWJ1dGUgc3RydWN0dXJlICovCi0KLSNkZWZpbmUgRFdfU1RSSU5HKGF0dHIpICAgICgoYXR0ciktPnUuc3RyKQotI2RlZmluZSBEV19VTlNORChhdHRyKSAgICAgKChhdHRyKS0+dS51bnNuZCkKLSNkZWZpbmUgRFdfQkxPQ0soYXR0cikgICAgICgoYXR0ciktPnUuYmxrKQotI2RlZmluZSBEV19TTkQoYXR0cikgICAgICAgKChhdHRyKS0+dS5zbmQpCi0jZGVmaW5lIERXX0FERFIoYXR0cikJICAgKChhdHRyKS0+dS5hZGRyKQotCi0vKiBCbG9ja3MgYXJlIGEgYnVuY2ggb2YgdW50eXBlZCBieXRlcy4gKi8KLXN0cnVjdCBkd2FyZl9ibG9jawotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgY2hhciAqZGF0YTsKLSAgfTsKLQotCi1zdHJ1Y3QgZHdhcmYyX2RlYnVnIHsKLQotICAvKiBBIGxpc3Qgb2YgYWxsIHByZXZpb3VzbHkgcmVhZCBjb21wX3VuaXRzLiAqLwotICBzdHJ1Y3QgY29tcF91bml0KiBhbGxfY29tcF91bml0czsKLQotICAvKiBUaGUgbmV4dCB1bnJlYWQgY29tcGlsYXRpb24gdW5pdCB3aXRoaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uCi0gICAgIFplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gaGFzIG5vdCBiZWVuIGxvYWRlZAotICAgICBpbnRvIGEgYnVmZmVyIHlldC4qLwotICBjaGFyKiBpbmZvX3B0cjsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gbWVtb3J5IGJ1ZmZlci4gKi8KLSAgY2hhciogaW5mb19wdHJfZW5kOwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbiBsb2FkZWQgaW50byBtZW1vcnkuICovCi0gIGNoYXIqIGR3YXJmX2FiYnJldl9idWZmZXI7Ci0KLSAgLyogTGVuZ3RoIG9mIHRoZSBsb2FkZWQgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiAqLwotICB1bnNpZ25lZCBsb25nIGR3YXJmX2FiYnJldl9zaXplOwotCi0gIC8qIEJ1ZmZlciBmb3IgZGVjb2RlX2xpbmVfaW5mby4gICovCi0gIGNoYXIgKmR3YXJmX2xpbmVfYnVmZmVyOwotfTsKLQotc3RydWN0IGFyYW5nZSB7Ci0gIHN0cnVjdCBhcmFuZ2UgKm5leHQ7Ci0gIGJmZF92bWEgbG93OwotICBiZmRfdm1hIGhpZ2g7Ci19OwotCi0KLS8qIEEgbWluaW1hbCBkZWNvZGluZyBvZiBEV0FSRjIgY29tcGlsYXRpb24gdW5pdHMuICBXZSBvbmx5IGRlY29kZQotICAgd2hhdCdzIG5lZWRlZCB0byBnZXQgdG8gdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAqLwotCi1zdHJ1Y3QgY29tcF91bml0IHsKLQotICAvKiBDaGFpbiB0aGUgcHJldmlvdXNseSByZWFkIGNvbXBpbGF0aW9uIHVuaXRzLiAqLwotICBzdHJ1Y3QgY29tcF91bml0KiBuZXh0X3VuaXQ7Ci0KLSAgLyogS2VlcCB0aGUgYmRmIGNvbnZlbmllbnQgKGZvciBtZW1vcnkgYWxsb2NhdGlvbikuICovCi0gIGJmZCogYWJmZDsKLQotICAvKiBUaGUgbG93ZXN0IGFuZCBoaWdlc3QgYWRkcmVzc2VzIGNvbnRhaW5lZCBpbiB0aGlzIGNvbXBpbGF0aW9uCi0gICAgIHVuaXQgYXMgc3BlY2lmaWVkIGluIHRoZSBjb21waWxhdGlvbiB1bml0IGhlYWRlci4gKi8KLSAgc3RydWN0IGFyYW5nZSBhcmFuZ2U7Ci0KLSAgLyogVGhlIERXX0FUX25hbWUgYXR0cmlidXRlIChmb3IgZXJyb3IgbWVzc2FnZXMpLiAqLwotICBjaGFyKiBuYW1lOwotCi0gIC8qIFRoZSBhYmJyZXYgaGFzaCB0YWJsZS4gKi8KLSAgc3RydWN0IGFiYnJldl9pbmZvKiogYWJicmV2czsKLQotICAvKiBOb3RlIHRoYXQgYW4gZXJyb3Igd2FzIGZvdW5kIGJ5IGNvbXBfdW5pdF9maW5kX25lYXJlc3RfbGluZS4gKi8KLSAgaW50IGVycm9yOwotCi0gIC8qIFRoZSBEV19BVF9jb21wX2RpciBhdHRyaWJ1dGUgKi8KLSAgY2hhciogY29tcF9kaXI7Ci0KLSAgLyogVHJ1ZSBpZiB0aGVyZSBpcyBhIGxpbmUgbnVtYmVyIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbXAuIHVuaXQuICovCi0gIGludCBzdG10bGlzdDsKLSAgCi0gIC8qIFRoZSBvZmZzZXQgaW50byAuZGVidWdfbGluZSBvZiB0aGUgbGluZSBudW1iZXIgdGFibGUuICovCi0gIHVuc2lnbmVkIGxvbmcgbGluZV9vZmZzZXQ7Ci0KLSAgLyogUG9pbnRlciB0byB0aGUgZmlyc3QgY2hpbGQgZGllIGZvciB0aGUgY29tcCB1bml0LiAqLwotICBjaGFyICpmaXJzdF9jaGlsZF9kaWVfcHRyOwotCi0gIC8qIFRoZSBlbmQgb2YgdGhlIGNvbXAgdW5pdC4gKi8KLSAgY2hhciAqZW5kX3B0cjsKLQotICAvKiBUaGUgZGVjb2RlZCBsaW5lIG51bWJlciwgTlVMTCBpZiBub3QgeWV0IGRlY29kZWQuICovCi0gIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIGxpbmVfdGFibGU7Ci0KLSAgLyogQSBsaXN0IG9mIHRoZSBmdW5jdGlvbnMgZm91bmQgaW4gdGhpcyBjb21wLiB1bml0LiAqLwotICBzdHJ1Y3QgZnVuY2luZm8qIGZ1bmN0aW9uX3RhYmxlOyAKLQotICAvKiBBZGRyZXNzIHNpemUgZm9yIHRoaXMgdW5pdCAtIGZyb20gdW5pdCBoZWFkZXIgKi8KLSAgdW5zaWduZWQgY2hhciBhZGRyX3NpemU7Ci19OwotCi0KLQotLyogVkVSQkFUSU0gCi0gICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHVwIHRvIHRoZSBFTkQgVkVSQkFUSU0gbWFyayBhcmUgCi0gICBjb3BpZWQgZGlyZWN0bHkgZnJvbSBkd2FyZjJyZWFkLmMuICovCi0KLS8qIHJlYWQgZHdhcmYgaW5mb3JtYXRpb24gZnJvbSBhIGJ1ZmZlciAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzFfYnl0ZSAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlYWRfMV9zaWduZWRfYnl0ZSAoYWJmZCwgYnVmKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgcmV0dXJuIGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsIChiZmRfYnl0ZSAqKSBidWYpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzJfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfMl9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyBpbnQKLXJlYWRfNF9zaWduZWRfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkXzhfYnl0ZXMgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci17Ci0gIHJldHVybiBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9uX2J5dGVzIChhYmZkLCBidWYsIHNpemUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIC8qIElmIHRoZSBzaXplIG9mIGEgaG9zdCBjaGFyIGlzIDggYml0cywgd2UgY2FuIHJldHVybiBhIHBvaW50ZXIKLSAgICAgdG8gdGhlIGJ1ZmZlciwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgZGF0YSB0byBhIGJ1ZmZlcgotICAgICBhbGxvY2F0ZWQgb24gdGhlIHRlbXBvcmFyeSBvYnN0YWNrLiAgKi8KLSAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGNoYXIgKgotcmVhZF9zdHJpbmcgKGFiZmQsIGJ1ZiwgYnl0ZXNfcmVhZF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqYnVmOwotICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX3JlYWRfcHRyOwotewotICAvKiBJZiB0aGUgc2l6ZSBvZiBhIGhvc3QgY2hhciBpcyA4IGJpdHMsIHdlIGNhbiByZXR1cm4gYSBwb2ludGVyCi0gICAgIHRvIHRoZSBzdHJpbmcsIG90aGVyd2lzZSB3ZSBoYXZlIHRvIGNvcHkgdGhlIHN0cmluZyB0byBhIGJ1ZmZlcgotICAgICBhbGxvY2F0ZWQgb24gdGhlIHRlbXBvcmFyeSBvYnN0YWNrLiAgKi8KLSAgaWYgKCpidWYgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAqYnl0ZXNfcmVhZF9wdHIgPSAxOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAqYnl0ZXNfcmVhZF9wdHIgPSBzdHJsZW4gKGJ1ZikgKyAxOwotICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1yZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgYnVmLCBieXRlc19yZWFkX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpidWY7Ci0gICAgIHVuc2lnbmVkIGludCAqYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIHVuc2lnbmVkIGludCAgcmVzdWx0OwotICB1bnNpZ25lZCBpbnQgIG51bV9yZWFkOwotICBpbnQgICAgICAgICAgIHNoaWZ0OwotICB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0KLSAgcmVzdWx0ICAgPSAwOwotICBzaGlmdCAgICA9IDA7Ci0gIG51bV9yZWFkID0gMDsKLSAgCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IGJmZF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgICBidWYgKys7Ci0gICAgICBudW1fcmVhZCArKzsKLSAgICAgIHJlc3VsdCB8PSAoKGJ5dGUgJiAweDdmKSA8PCBzaGlmdCk7Ci0gICAgICBzaGlmdCArPSA3OwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLSAgCi0gICogYnl0ZXNfcmVhZF9wdHIgPSBudW1fcmVhZDsKLSAgCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLXJlYWRfc2lnbmVkX2xlYjEyOCAoYWJmZCwgYnVmLCBieXRlc19yZWFkX3B0cikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgdW5zaWduZWQgaW50ICogYnl0ZXNfcmVhZF9wdHI7Ci17Ci0gIGludCAgICAgICAgICAgcmVzdWx0OwotICBpbnQgICAgICAgICAgIHNoaWZ0OwotICBpbnQgICAgICAgICAgIG51bV9yZWFkOwotICB1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0KLSAgcmVzdWx0ID0gMDsKLSAgc2hpZnQgPSAwOwotICBudW1fcmVhZCA9IDA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gYmZkX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICAgIGJ1ZiArKzsKLSAgICAgIG51bV9yZWFkICsrOwotICAgICAgcmVzdWx0IHw9ICgoYnl0ZSAmIDB4N2YpIDw8IHNoaWZ0KTsKLSAgICAgIHNoaWZ0ICs9IDc7Ci0gICAgfQotICB3aGlsZSAoYnl0ZSAmIDB4ODApOwotICAKLSAgaWYgKChzaGlmdCA8IDMyKSAmJiAoYnl0ZSAmIDB4NDApKQotICAgIHJlc3VsdCB8PSAtKDEgPDwgc2hpZnQpOwotCi0gICogYnl0ZXNfcmVhZF9wdHIgPSBudW1fcmVhZDsKLSAgCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEVORCBWRVJCQVRJTSAqLwotCi1zdGF0aWMgYmZkX3ZtYQotcmVhZF9hZGRyZXNzICh1bml0LCBidWYpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGNoYXIgKmJ1ZjsKLXsKLSAgYmZkX3ZtYSByZXR2YWwgPSAwOwotCi0gIGlmICh1bml0LT5hZGRyX3NpemUgPT0gNCkKLSAgICB7Ci0gICAgICByZXR2YWwgPSBiZmRfZ2V0XzMyICh1bml0LT5hYmZkLCAoYmZkX2J5dGUgKikgYnVmKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dmFsID0gYmZkX2dldF82NCAodW5pdC0+YWJmZCwgKGJmZF9ieXRlICopIGJ1Zik7Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLQotCi0KLS8qIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGluZm9ybWF0aW9uIG9mIGFuIGFiYnJldi4gKi8KLXN0cnVjdCBhYmJyZXZfaW5mbwotICB7Ci0gICAgdW5zaWduZWQgaW50IG51bWJlcjsJLyogbnVtYmVyIGlkZW50aWZ5aW5nIGFiYnJldiAqLwotICAgIGVudW0gZHdhcmZfdGFnIHRhZzsJCS8qIGR3YXJmIHRhZyAqLwotICAgIGludCBoYXNfY2hpbGRyZW47CQkvKiBib29sZWFuICovCi0gICAgdW5zaWduZWQgaW50IG51bV9hdHRyczsJLyogbnVtYmVyIG9mIGF0dHJpYnV0ZXMgKi8KLSAgICBzdHJ1Y3QgYXR0cl9hYmJyZXYgKmF0dHJzOwkvKiBhbiBhcnJheSBvZiBhdHRyaWJ1dGUgZGVzY3JpcHRpb25zICovCi0gICAgc3RydWN0IGFiYnJldl9pbmZvICpuZXh0OwkvKiBuZXh0IGluIGNoYWluICovCi0gIH07Ci0KLXN0cnVjdCBhdHRyX2FiYnJldgotICB7Ci0gICAgZW51bSBkd2FyZl9hdHRyaWJ1dGUgbmFtZTsKLSAgICBlbnVtIGR3YXJmX2Zvcm0gZm9ybTsKLSAgfTsKLQotI2lmbmRlZiBBQkJSRVZfSEFTSF9TSVpFCi0jZGVmaW5lIEFCQlJFVl9IQVNIX1NJWkUgMTIxCi0jZW5kaWYKLSNpZm5kZWYgQVRUUl9BTExPQ19DSFVOSwotI2RlZmluZSBBVFRSX0FMTE9DX0NIVU5LIDQKLSNlbmRpZgotCi0vKiBMb29rdXAgYW4gYWJicmV2X2luZm8gc3RydWN0dXJlIGluIHRoZSBhYmJyZXYgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYWJicmV2X2luZm8gKgotbG9va3VwX2FiYnJldiAobnVtYmVyLGFiYnJldnMpCi0gICAgIHVuc2lnbmVkIGludCBudW1iZXI7Ci0gICAgIHN0cnVjdCBhYmJyZXZfaW5mbyAqKmFiYnJldnM7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoX251bWJlcjsKLSAgc3RydWN0IGFiYnJldl9pbmZvICphYmJyZXY7Ci0KLSAgaGFzaF9udW1iZXIgPSBudW1iZXIgJSBBQkJSRVZfSEFTSF9TSVpFOwotICBhYmJyZXYgPSBhYmJyZXZzW2hhc2hfbnVtYmVyXTsKLQotICB3aGlsZSAoYWJicmV2KQotICAgIHsKLSAgICAgIGlmIChhYmJyZXYtPm51bWJlciA9PSBudW1iZXIpCi0JcmV0dXJuIGFiYnJldjsKLSAgICAgIGVsc2UKLQlhYmJyZXYgPSBhYmJyZXYtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW4gRFdBUkYgdmVyc2lvbiAyLCB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcwotICAgc3RvcmVkIGluIGEgc2VwYXJhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiAgQmVmb3JlIHdlIHJlYWQgYW55Ci0gICBkaWVzIGZyb20gYSBzZWN0aW9uIHdlIHJlYWQgaW4gYWxsIGFiYnJldmlhdGlvbnMgYW5kIGluc3RhbGwgdGhlbQotICAgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBhYmJyZXZfaW5mbyoqCi1yZWFkX2FiYnJldnMgKGFiZmQsIG9mZnNldCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG9mZnNldDsKLXsKLSAgc3RydWN0IGFiYnJldl9pbmZvICoqYWJicmV2czsKLSAgY2hhciAqYWJicmV2X3B0cjsKLSAgc3RydWN0IGFiYnJldl9pbmZvICpjdXJfYWJicmV2OwotICB1bnNpZ25lZCBpbnQgYWJicmV2X251bWJlciwgYnl0ZXNfcmVhZCwgYWJicmV2X25hbWU7Ci0gIHVuc2lnbmVkIGludCBhYmJyZXZfZm9ybSwgaGFzaF9udW1iZXI7Ci0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKnN0YXNoOwotCi0gIHN0YXNoID0gZWxmX3RkYXRhKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgaWYgKCEgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm1zZWM7Ci0KLSAgICAgIG1zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5kZWJ1Z19hYmJyZXYiKTsKLSAgICAgIGlmICghIG1zZWMpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfYWJicmV2IHNlY3Rpb24uIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIHN0YXNoLT5kd2FyZl9hYmJyZXZfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlciA9IChjaGFyKikgYmZkX2FsbG9jIChhYmZkLCBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUpOwotICAgICAgaWYgKCEgc3Rhc2gtPmR3YXJmX2FiYnJldl9idWZmZXIpCi0JICByZXR1cm4gMDsKLSAgICAgIAotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCAKLQkJCQkgICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlciwgMCwKLQkJCQkgICAgICBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUpKQotCXJldHVybiAwOwotICAgIH0KLQotICBpZiAob2Zmc2V0ID4gc3Rhc2gtPmR3YXJmX2FiYnJldl9zaXplKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IEFiYnJldiBvZmZzZXQgKCV1KSBiaWdnZXIgdGhhbiBhYmJyZXYgc2l6ZSAoJXUpLiIpLCAKLQkJCSAgICAgb2Zmc2V0LCBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUgKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFiYnJldnMgPSAoc3RydWN0IGFiYnJldl9pbmZvKiopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZihzdHJ1Y3QgYWJicmV2X2luZm8qKSAqIEFCQlJFVl9IQVNIX1NJWkUpOwotCi0gIGFiYnJldl9wdHIgPSBzdGFzaC0+ZHdhcmZfYWJicmV2X2J1ZmZlciArIG9mZnNldDsKLSAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLQotICAvKiBsb29wIHVudGlsIHdlIHJlYWNoIGFuIGFiYnJldiBudW1iZXIgb2YgMCAqLwotICB3aGlsZSAoYWJicmV2X251bWJlcikKLSAgICB7Ci0gICAgICBjdXJfYWJicmV2ID0gKHN0cnVjdCBhYmJyZXZfaW5mbyopYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWJicmV2X2luZm8pKTsKLQotICAgICAgLyogcmVhZCBpbiBhYmJyZXYgaGVhZGVyICovCi0gICAgICBjdXJfYWJicmV2LT5udW1iZXIgPSBhYmJyZXZfbnVtYmVyOwotICAgICAgY3VyX2FiYnJldi0+dGFnID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGN1cl9hYmJyZXYtPmhhc19jaGlsZHJlbiA9IHJlYWRfMV9ieXRlIChhYmZkLCBhYmJyZXZfcHRyKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gMTsKLQotICAgICAgLyogbm93IHJlYWQgaW4gZGVjbGFyYXRpb25zICovCi0gICAgICBhYmJyZXZfbmFtZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBhYmJyZXZfZm9ybSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBhYmJyZXZfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBhYmJyZXZfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICB3aGlsZSAoYWJicmV2X25hbWUpCi0JewotCSAgaWYgKChjdXJfYWJicmV2LT5udW1fYXR0cnMgJSBBVFRSX0FMTE9DX0NIVU5LKSA9PSAwKQotCSAgICB7Ci0JICAgICAgY3VyX2FiYnJldi0+YXR0cnMgPSAoc3RydWN0IGF0dHJfYWJicmV2ICopCi0JCWJmZF9yZWFsbG9jIChjdXJfYWJicmV2LT5hdHRycywKLQkJCSAgICAgKGN1cl9hYmJyZXYtPm51bV9hdHRycyArIEFUVFJfQUxMT0NfQ0hVTkspCi0JCQkgICAgICogc2l6ZW9mIChzdHJ1Y3QgYXR0cl9hYmJyZXYpKTsKLQkgICAgICBpZiAoISBjdXJfYWJicmV2LT5hdHRycykKLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQkgIGN1cl9hYmJyZXYtPmF0dHJzW2N1cl9hYmJyZXYtPm51bV9hdHRyc10ubmFtZSA9IGFiYnJldl9uYW1lOwotCSAgY3VyX2FiYnJldi0+YXR0cnNbY3VyX2FiYnJldi0+bnVtX2F0dHJzKytdLmZvcm0gPSBhYmJyZXZfZm9ybTsKLQkgIGFiYnJldl9uYW1lID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLQkgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgIGFiYnJldl9mb3JtID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLQkgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLQl9Ci0KLSAgICAgIGhhc2hfbnVtYmVyID0gYWJicmV2X251bWJlciAlIEFCQlJFVl9IQVNIX1NJWkU7Ci0gICAgICBjdXJfYWJicmV2LT5uZXh0ID0gYWJicmV2c1toYXNoX251bWJlcl07Ci0gICAgICBhYmJyZXZzW2hhc2hfbnVtYmVyXSA9IGN1cl9hYmJyZXY7Ci0KLSAgICAgIC8qIEdldCBuZXh0IGFiYnJldmlhdGlvbi4KLSAgICAgICAgIFVuZGVyIElyaXg2IHRoZSBhYmJyZXZpYXRpb25zIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQgYXJlIG5vdAotCSBhbHdheXMgcHJvcGVybHkgdGVybWluYXRlZCB3aXRoIGFuIGFiYnJldiBudW1iZXIgb2YgMC4KLQkgRXhpdCBsb29wIGlmIHdlIGVuY291bnRlciBhbiBhYmJyZXZpYXRpb24gd2hpY2ggd2UgaGF2ZQotCSBhbHJlYWR5IHJlYWQgKHdoaWNoIG1lYW5zIHdlIGFyZSBhYm91dCB0byByZWFkIHRoZSBhYmJyZXZpYXRpb25zCi0JIGZvciB0aGUgbmV4dCBjb21waWxlIHVuaXQpIG9yIGlmIHRoZSBlbmQgb2YgdGhlIGFiYnJldmlhdGlvbgotCSB0YWJsZSBpcyByZWFjaGVkLiAgKi8KLSAgICAgIGlmICgodW5zaWduZWQgaW50KSAoYWJicmV2X3B0ciAtIHN0YXNoLT5kd2FyZl9hYmJyZXZfYnVmZmVyKQotCSAgICA+PSBzdGFzaC0+ZHdhcmZfYWJicmV2X3NpemUpCi0JYnJlYWs7Ci0gICAgICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGFiYnJldl9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGFiYnJldl9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGlmIChsb29rdXBfYWJicmV2IChhYmJyZXZfbnVtYmVyLGFiYnJldnMpICE9IE5VTEwpCi0JYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBhYmJyZXZzOwotfQotCi0vKiBSZWFkIGFuIGF0dHJpYnV0ZSBkZXNjcmliZWQgYnkgYW4gYWJicmV2aWF0ZWQgYXR0cmlidXRlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotcmVhZF9hdHRyaWJ1dGUgKGF0dHIsIGFiYnJldiwgdW5pdCwgaW5mb19wdHIpCi0gICAgIHN0cnVjdCBhdHRyaWJ1dGUgICAqYXR0cjsKLSAgICAgc3RydWN0IGF0dHJfYWJicmV2ICphYmJyZXY7Ci0gICAgIHN0cnVjdCBjb21wX3VuaXQgICAqdW5pdDsKLSAgICAgY2hhciAgICAgICAgICAgICAgICppbmZvX3B0cjsKLXsKLSAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKLSAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQ7Ci0gIHN0cnVjdCBkd2FyZl9ibG9jayAqYmxrOwotCi0gIGF0dHItPm5hbWUgPSBhYmJyZXYtPm5hbWU7Ci0gIGF0dHItPmZvcm0gPSBhYmJyZXYtPmZvcm07Ci0gIHN3aXRjaCAoYWJicmV2LT5mb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjoKLSAgICBjYXNlIERXX0ZPUk1fcmVmX2FkZHI6Ci0gICAgICBEV19BRERSIChhdHRyKSA9IHJlYWRfYWRkcmVzcyAodW5pdCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gdW5pdC0+YWRkcl9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2Jsb2NrMjoKLSAgICAgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOwotICAgICAgYmxrLT5zaXplID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAyOwotICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKLSAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKLSAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gNDsKLSAgICAgIGJsay0+ZGF0YSA9IHJlYWRfbl9ieXRlcyAoYWJmZCwgaW5mb19wdHIsIGJsay0+c2l6ZSk7Ci0gICAgICBpbmZvX3B0ciArPSBibGstPnNpemU7Ci0gICAgICBEV19CTE9DSyAoYXR0cikgPSBibGs7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTI6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzJfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTg6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzhfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fc3RyaW5nOgotICAgICAgRFdfU1RSSU5HIChhdHRyKSA9IHJlYWRfc3RyaW5nIChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgaW5mb19wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazoKLSAgICAgIGJsayA9IChzdHJ1Y3QgZHdhcmZfYmxvY2sgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZl9ibG9jaykpOwotICAgICAgYmxrLT5zaXplID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKLSAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKLSAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazE6Ci0gICAgICBibGsgPSAoc3RydWN0IGR3YXJmX2Jsb2NrICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZHdhcmZfYmxvY2spKTsKLSAgICAgIGJsay0+c2l6ZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAxOwotICAgICAgYmxrLT5kYXRhID0gcmVhZF9uX2J5dGVzIChhYmZkLCBpbmZvX3B0ciwgYmxrLT5zaXplKTsKLSAgICAgIGluZm9fcHRyICs9IGJsay0+c2l6ZTsKLSAgICAgIERXX0JMT0NLIChhdHRyKSA9IGJsazsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9kYXRhMToKLSAgICAgIERXX1VOU05EIChhdHRyKSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX2ZsYWc6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9zZGF0YToKLSAgICAgIERXX1NORCAoYXR0cikgPSByZWFkX3NpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3VkYXRhOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjE6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzFfYnl0ZSAoYWJmZCwgaW5mb19wdHIpOwotICAgICAgaW5mb19wdHIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfRk9STV9yZWYyOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF8yX2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gICAgICBpbmZvX3B0ciArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjQ6Ci0gICAgICBEV19VTlNORCAoYXR0cikgPSByZWFkXzRfYnl0ZXMgKGFiZmQsIGluZm9fcHRyKTsKLSAgICAgIGluZm9fcHRyICs9IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX0ZPUk1fcmVmX3VkYXRhOgotICAgICAgRFdfVU5TTkQgKGF0dHIpID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19GT1JNX3N0cnA6Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OgotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBJbnZhbGlkIG9yIHVuaGFuZGxlZCBGT1JNIHZhbHVlOiAlZC4iKSwKLQkJCSAgICAgYWJicmV2LT5mb3JtKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLSAgcmV0dXJuIGluZm9fcHRyOwotfQotCi0KLS8qIFNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHRhYmxlIHJvdXRpbmVzLiAqLwotCi0jZGVmaW5lIEZJTEVfQUxMT0NfQ0hVTksgNQotI2RlZmluZSBESVJfQUxMT0NfQ0hVTksgNQotCi1zdHJ1Y3QgbGluZV9pbmZvIHsKLSAgc3RydWN0IGxpbmVfaW5mbyogcHJldl9saW5lOwotCi0gIGJmZF92bWEgYWRkcmVzczsKLSAgY2hhciogZmlsZW5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICBpbnQgZW5kX3NlcXVlbmNlOwkJLyogZW5kIG9mIChzZXF1ZW50aWFsKSBjb2RlIHNlcXVlbmNlICovCi19OwotCi1zdHJ1Y3QgZmlsZWluZm8gewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZGlyOwotICB1bnNpZ25lZCBpbnQgdGltZTsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi1zdHJ1Y3QgbGluZV9pbmZvX3RhYmxlIHsKLSAgYmZkKiBhYmZkOwotCi0gIHVuc2lnbmVkIGludCBudW1fZmlsZXM7Ci0gIHVuc2lnbmVkIGludCBudW1fZGlyczsKLQotICBjaGFyKiBjb21wX2RpcjsKLSAgY2hhcioqIGRpcnM7Ci0gIHN0cnVjdCBmaWxlaW5mbyogZmlsZXM7Ci0gIHN0cnVjdCBsaW5lX2luZm8qIGxhc3RfbGluZTsKLX07Ci0KLXN0YXRpYyB2b2lkIAotYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIGVuZF9zZXF1ZW5jZSkKLSAgICAgc3RydWN0IGxpbmVfaW5mb190YWJsZSogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgY2hhciogZmlsZW5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICAgICBpbnQgZW5kX3NlcXVlbmNlOwotewotICBzdHJ1Y3QgbGluZV9pbmZvKiBpbmZvID0gKHN0cnVjdCBsaW5lX2luZm8qKQotICAgIGJmZF9hbGxvYyAodGFibGUtPmFiZmQsIHNpemVvZiAoc3RydWN0IGxpbmVfaW5mbykpOwotCi0gIGluZm8tPnByZXZfbGluZSA9IHRhYmxlLT5sYXN0X2xpbmU7Ci0gIHRhYmxlLT5sYXN0X2xpbmUgPSBpbmZvOwotCi0gIGluZm8tPmFkZHJlc3MgPSBhZGRyZXNzOwotICBpbmZvLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBpbmZvLT5saW5lID0gbGluZTsKLSAgaW5mby0+Y29sdW1uID0gY29sdW1uOwotICBpbmZvLT5lbmRfc2VxdWVuY2UgPSBlbmRfc2VxdWVuY2U7Ci19Ci0KLXN0YXRpYyBjaGFyKiAKLWNvbmNhdF9maWxlbmFtZSAodGFibGUsIGZpbGUpCi0gICAgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOwotICAgICB1bnNpZ25lZCBpbnQgZmlsZTsKLXsKLSAgY2hhciogZmlsZW5hbWU7Ci0KLSAgaWYgKGZpbGUgLSAxID49IHRhYmxlLT5udW1fZmlsZXMpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciAiCi0JCQkgICAgICAgInNlY3Rpb24gKGJhZCBmaWxlIG51bWJlcikuIikpOwotICAgICAgcmV0dXJuICI8dW5rbm93bj4iOwotICAgIH0KLQotICBmaWxlbmFtZSA9IHRhYmxlLT5maWxlc1tmaWxlIC0gMV0ubmFtZTsKLSAgaWYgKCpmaWxlbmFtZSA9PSAnLycpCi0gICAgcmV0dXJuIGZpbGVuYW1lOwotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyKiBkaXJuYW1lID0gKHRhYmxlLT5maWxlc1tmaWxlIC0gMV0uZGlyCi0JCSAgICAgICA/IHRhYmxlLT5kaXJzW3RhYmxlLT5maWxlc1tmaWxlIC0gMV0uZGlyIC0gMV0KLQkJICAgICAgIDogdGFibGUtPmNvbXBfZGlyKTsKLSAgICAgIHJldHVybiAoY2hhciopIGNvbmNhdCAoZGlybmFtZSwgIi8iLCBmaWxlbmFtZSwgTlVMTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotYXJhbmdlX2FkZCAodW5pdCwgbG93X3BjLCBoaWdoX3BjKQotICAgICBzdHJ1Y3QgY29tcF91bml0ICp1bml0OwotICAgICBiZmRfdm1hIGxvd19wYzsKLSAgICAgYmZkX3ZtYSBoaWdoX3BjOwotewotICBzdHJ1Y3QgYXJhbmdlICphcmFuZ2U7Ci0KLSAgLyogZmlyc3Qgc2VlIGlmIHdlIGNhbiBjaGVhcGx5IGV4dGVuZCBhbiBleGlzdGluZyByYW5nZTogKi8KLSAgYXJhbmdlID0gJnVuaXQtPmFyYW5nZTsKLSAgZG8KLSAgICB7Ci0gICAgICBpZiAobG93X3BjID09IGFyYW5nZS0+aGlnaCkKLQl7Ci0JICBhcmFuZ2UtPmhpZ2ggPSBoaWdoX3BjOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChoaWdoX3BjID09IGFyYW5nZS0+bG93KQotCXsKLQkgIGFyYW5nZS0+bG93ID0gbG93X3BjOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGFyYW5nZSA9IGFyYW5nZS0+bmV4dDsKLSAgICB9Ci0gIHdoaWxlIChhcmFuZ2UpOwotCi0gIGlmICh1bml0LT5hcmFuZ2UuaGlnaCA9PSAwKQotICAgIHsKLSAgICAgIC8qIHRoaXMgaXMgdGhlIGZpcnN0IGFkZHJlc3MgcmFuZ2U6IHN0b3JlIGl0IGluIHVuaXQtPmFyYW5nZTogKi8KLSAgICAgIHVuaXQtPmFyYW5nZS5uZXh0ID0gMDsKLSAgICAgIHVuaXQtPmFyYW5nZS5sb3cgPSBsb3dfcGM7Ci0gICAgICB1bml0LT5hcmFuZ2UuaGlnaCA9IGhpZ2hfcGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYXJhbmdlIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgYXJhbmdlIGxpc3Q6ICovCi0gIGFyYW5nZSA9IGJmZF96YWxsb2MgKHVuaXQtPmFiZmQsIHNpemVvZiAoKmFyYW5nZSkpOwotICBhcmFuZ2UtPmxvdyA9IGxvd19wYzsKLSAgYXJhbmdlLT5oaWdoID0gaGlnaF9wYzsKLQotICBhcmFuZ2UtPm5leHQgPSB1bml0LT5hcmFuZ2UubmV4dDsKLSAgdW5pdC0+YXJhbmdlLm5leHQgPSBhcmFuZ2U7Ci19Ci0KLS8qIERlY29kZSB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIFVOSVQuICovCi0KLXN0YXRpYyBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKgotZGVjb2RlX2xpbmVfaW5mbyAodW5pdCkKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAqdW5pdDsKLXsKLSAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKLQotICBzdHJ1Y3QgZHdhcmYyX2RlYnVnICpzdGFzaDsKLQotICBzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKiB0YWJsZTsKLQotICBjaGFyICpsaW5lX3B0cjsKLSAgY2hhciAqbGluZV9lbmQ7Ci0gIHN0cnVjdCBsaW5lX2hlYWQgbGg7Ci0gIHVuc2lnbmVkIGludCBpLCBieXRlc19yZWFkOwotICBjaGFyICpjdXJfZmlsZSwgKmN1cl9kaXI7Ci0gIHVuc2lnbmVkIGNoYXIgb3BfY29kZSwgZXh0ZW5kZWRfb3AsIGFkal9vcGNvZGU7Ci0KLSAgc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgaWYgKCEgc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfbGluZSIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDYW4ndCBmaW5kIC5kZWJ1Z19saW5lIHNlY3Rpb24uIikpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKG1zZWMpOwotICAgICAgc3Rhc2gtPmR3YXJmX2xpbmVfYnVmZmVyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIGlmICghIHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlcikKLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCAKLQkJCQkgICAgICBzdGFzaC0+ZHdhcmZfbGluZV9idWZmZXIsIDAsCi0JCQkJICAgICAgc2l6ZSkpCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIEZJWE1FOiBXZSBvdWdodCB0byBhcHBseSB0aGUgcmVsb2NzIGFnYWluc3QgdGhpcyBzZWN0aW9uIGJlZm9yZQotCSB3ZSBwcm9jZXNzIGl0Li4uLiAqLwotICAgIH0KLQotICB0YWJsZSA9IChzdHJ1Y3QgbGluZV9pbmZvX3RhYmxlKikgYmZkX2FsbG9jIChhYmZkLCAKLQkJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGxpbmVfaW5mb190YWJsZSkpOwotICB0YWJsZS0+YWJmZCA9IGFiZmQ7Ci0gIHRhYmxlLT5jb21wX2RpciA9IHVuaXQtPmNvbXBfZGlyOwotCi0gIHRhYmxlLT5udW1fZmlsZXMgPSAwOwotICB0YWJsZS0+ZmlsZXMgPSBOVUxMOwotCi0gIHRhYmxlLT5udW1fZGlycyA9IDA7Ci0gIHRhYmxlLT5kaXJzID0gTlVMTDsKLQotICB0YWJsZS0+ZmlsZXMgPSBOVUxMOwotICB0YWJsZS0+bGFzdF9saW5lID0gTlVMTDsKLQotICBsaW5lX3B0ciA9IHN0YXNoLT5kd2FyZl9saW5lX2J1ZmZlciArIHVuaXQtPmxpbmVfb2Zmc2V0OwotCi0gIC8qIHJlYWQgaW4gdGhlIHByb2xvZ3VlICovCi0gIGxoLnRvdGFsX2xlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSA0OwotICBsaW5lX2VuZCA9IGxpbmVfcHRyICsgbGgudG90YWxfbGVuZ3RoOwotICBsaC52ZXJzaW9uID0gcmVhZF8yX2J5dGVzIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDI7Ci0gIGxoLnByb2xvZ3VlX2xlbmd0aCA9IHJlYWRfNF9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSA0OwotICBsaC5taW5pbXVtX2luc3RydWN0aW9uX2xlbmd0aCA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLmRlZmF1bHRfaXNfc3RtdCA9IHJlYWRfMV9ieXRlIChhYmZkLCBsaW5lX3B0cik7Ci0gIGxpbmVfcHRyICs9IDE7Ci0gIGxoLmxpbmVfYmFzZSA9IHJlYWRfMV9zaWduZWRfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5saW5lX3JhbmdlID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLSAgbGluZV9wdHIgKz0gMTsKLSAgbGgub3Bjb2RlX2Jhc2UgPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICBsaW5lX3B0ciArPSAxOwotICBsaC5zdGFuZGFyZF9vcGNvZGVfbGVuZ3RocyA9ICh1bnNpZ25lZCBjaGFyICopCi0gICAgYmZkX2FsbG9jIChhYmZkLCBsaC5vcGNvZGVfYmFzZSAqIHNpemVvZiAodW5zaWduZWQgY2hhcikpOwotCi0gIGxoLnN0YW5kYXJkX29wY29kZV9sZW5ndGhzWzBdID0gMTsKLSAgZm9yIChpID0gMTsgaSA8IGxoLm9wY29kZV9iYXNlOyArK2kpCi0gICAgewotICAgICAgbGguc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHNbaV0gPSByZWFkXzFfYnl0ZSAoYWJmZCwgbGluZV9wdHIpOwotICAgICAgbGluZV9wdHIgKz0gMTsKLSAgICB9Ci0KLSAgLyogUmVhZCBkaXJlY3RvcnkgdGFibGUgICovCi0gIHdoaWxlICgoY3VyX2RpciA9IHJlYWRfc3RyaW5nIChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBpZiAoKHRhYmxlLT5udW1fZGlycyAlIERJUl9BTExPQ19DSFVOSykgPT0gMCkKLQl7Ci0JICB0YWJsZS0+ZGlycyA9IChjaGFyICoqKQotCSAgICBiZmRfcmVhbGxvYyAodGFibGUtPmRpcnMsCi0JCQkgKHRhYmxlLT5udW1fZGlycyArIERJUl9BTExPQ19DSFVOSykgKiBzaXplb2YgKGNoYXIgKikpOwotCSAgaWYgKCEgdGFibGUtPmRpcnMpCi0JICAgIHJldHVybiAwOwotCX0KLSAgICAgIHRhYmxlLT5kaXJzW3RhYmxlLT5udW1fZGlycysrXSA9IGN1cl9kaXI7Ci0gICAgfQotICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCi0gIC8qIFJlYWQgZmlsZSBuYW1lIHRhYmxlICovCi0gIHdoaWxlICgoY3VyX2ZpbGUgPSByZWFkX3N0cmluZyAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgaWYgKCh0YWJsZS0+bnVtX2ZpbGVzICUgRklMRV9BTExPQ19DSFVOSykgPT0gMCkKLQl7Ci0JICB0YWJsZS0+ZmlsZXMgPSAoc3RydWN0IGZpbGVpbmZvICopCi0JICAgIGJmZF9yZWFsbG9jICh0YWJsZS0+ZmlsZXMsCi0JCQkgKHRhYmxlLT5udW1fZmlsZXMgKyBGSUxFX0FMTE9DX0NIVU5LKQotCQkJICogc2l6ZW9mIChzdHJ1Y3QgZmlsZWluZm8pKTsKLQkgIGlmICghIHRhYmxlLT5maWxlcykKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgICAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLm5hbWUgPSBjdXJfZmlsZTsKLSAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5kaXIgPQotCXJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS50aW1lID0KLQlyZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICB0YWJsZS0+ZmlsZXNbdGFibGUtPm51bV9maWxlc10uc2l6ZSA9Ci0JcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotICAgICAgdGFibGUtPm51bV9maWxlcysrOwotICAgIH0KLSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQotICAvKiBSZWFkIHRoZSBzdGF0ZW1lbnQgc2VxdWVuY2VzIHVudGlsIHRoZXJlJ3Mgbm90aGluZyBsZWZ0LiAgKi8KLSAgd2hpbGUgKGxpbmVfcHRyIDwgbGluZV9lbmQpCi0gICAgewotICAgICAgLyogc3RhdGUgbWFjaGluZSByZWdpc3RlcnMgICovCi0gICAgICBiZmRfdm1hIGFkZHJlc3MgPSAwOwotICAgICAgY2hhciogZmlsZW5hbWUgPSBjb25jYXRfZmlsZW5hbWUgKHRhYmxlLCAxKTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lID0gMTsKLSAgICAgIHVuc2lnbmVkIGludCBjb2x1bW4gPSAwOwotICAgICAgaW50IGlzX3N0bXQgPSBsaC5kZWZhdWx0X2lzX3N0bXQ7Ci0gICAgICBpbnQgYmFzaWNfYmxvY2sgPSAwOwotICAgICAgaW50IGVuZF9zZXF1ZW5jZSA9IDAsIG5lZWRfbG93X3BjID0gMTsKLSAgICAgIGJmZF92bWEgbG93X3BjID0gMDsKLQotICAgICAgLyogRGVjb2RlIHRoZSB0YWJsZS4gKi8KLSAgICAgIHdoaWxlICghIGVuZF9zZXF1ZW5jZSkKLQl7Ci0JICBvcF9jb2RlID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLQkgIGxpbmVfcHRyICs9IDE7Ci0JICBzd2l0Y2ggKG9wX2NvZGUpCi0JICAgIHsKLQkgICAgY2FzZSBEV19MTlNfZXh0ZW5kZWRfb3A6Ci0JICAgICAgbGluZV9wdHIgKz0gMTsJLyogaWdub3JlIGxlbmd0aCAqLwotCSAgICAgIGV4dGVuZGVkX29wID0gcmVhZF8xX2J5dGUgKGFiZmQsIGxpbmVfcHRyKTsKLQkgICAgICBsaW5lX3B0ciArPSAxOwotCSAgICAgIHN3aXRjaCAoZXh0ZW5kZWRfb3ApCi0JCXsKLQkJY2FzZSBEV19MTkVfZW5kX3NlcXVlbmNlOgotCQkgIGVuZF9zZXF1ZW5jZSA9IDE7Ci0JCSAgYWRkX2xpbmVfaW5mbyAodGFibGUsIGFkZHJlc3MsIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sCi0JCQkJIGVuZF9zZXF1ZW5jZSk7Ci0JCSAgaWYgKG5lZWRfbG93X3BjKQotCQkgICAgewotCQkgICAgICBuZWVkX2xvd19wYyA9IDA7Ci0JCSAgICAgIGxvd19wYyA9IGFkZHJlc3M7Ci0JCSAgICB9Ci0JCSAgYXJhbmdlX2FkZCAodW5pdCwgbG93X3BjLCBhZGRyZXNzKTsKLQkJICBicmVhazsKLQkJY2FzZSBEV19MTkVfc2V0X2FkZHJlc3M6Ci0JCSAgYWRkcmVzcyA9IHJlYWRfYWRkcmVzcyAodW5pdCwgbGluZV9wdHIpOwotCQkgIGxpbmVfcHRyICs9IHVuaXQtPmFkZHJfc2l6ZTsKLQkJICBicmVhazsKLQkJY2FzZSBEV19MTkVfZGVmaW5lX2ZpbGU6Ci0JCSAgY3VyX2ZpbGUgPSByZWFkX3N0cmluZyAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQkgIGlmICgodGFibGUtPm51bV9maWxlcyAlIEZJTEVfQUxMT0NfQ0hVTkspID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHRhYmxlLT5maWxlcyA9IChzdHJ1Y3QgZmlsZWluZm8gKikKLQkJCWJmZF9yZWFsbG9jICh0YWJsZS0+ZmlsZXMsCi0JCQkJICAgICAodGFibGUtPm51bV9maWxlcyArIEZJTEVfQUxMT0NfQ0hVTkspCi0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IGZpbGVpbmZvKSk7Ci0JCSAgICAgIGlmICghIHRhYmxlLT5maWxlcykKLQkJCXJldHVybiAwOwotCQkgICAgfQotCQkgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS5uYW1lID0gY3VyX2ZpbGU7Ci0JCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLmRpciA9Ci0JCSAgICByZWFkX3Vuc2lnbmVkX2xlYjEyOCAoYWJmZCwgbGluZV9wdHIsICZieXRlc19yZWFkKTsKLQkJICBsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQkgIHRhYmxlLT5maWxlc1t0YWJsZS0+bnVtX2ZpbGVzXS50aW1lID0KLQkJICAgIHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQkgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JCSAgdGFibGUtPmZpbGVzW3RhYmxlLT5udW1fZmlsZXNdLnNpemUgPQotCQkgICAgcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JCSAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkJICB0YWJsZS0+bnVtX2ZpbGVzKys7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uLiIpKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERXX0xOU19jb3B5OgotCSAgICAgIGFkZF9saW5lX2luZm8gKHRhYmxlLCBhZGRyZXNzLCBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCAwKTsKLQkgICAgICBiYXNpY19ibG9jayA9IDA7Ci0JICAgICAgaWYgKG5lZWRfbG93X3BjKQotCQl7Ci0JCSAgbmVlZF9sb3dfcGMgPSAwOwotCQkgIGxvd19wYyA9IGFkZHJlc3M7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKLQkgICAgICBhZGRyZXNzICs9IGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoCi0JCSogcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9saW5lOgotCSAgICAgIGxpbmUgKz0gcmVhZF9zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCSAgICAgIGxpbmVfcHRyICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX3NldF9maWxlOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IGZpbGU7Ci0KLQkJLyogVGhlIGZpbGUgYW5kIGRpcmVjdG9yeSB0YWJsZXMgYXJlIDAgYmFzZWQsIHRoZSByZWZlcmVuY2VzCi0JCSAgIGFyZSAxIGJhc2VkLiAgKi8KLQkJZmlsZSA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBsaW5lX3B0ciwgJmJ5dGVzX3JlYWQpOwotCQlsaW5lX3B0ciArPSBieXRlc19yZWFkOwotCQlmaWxlbmFtZSA9IGNvbmNhdF9maWxlbmFtZSAodGFibGUsIGZpbGUpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGNhc2UgRFdfTE5TX3NldF9jb2x1bW46Ci0JICAgICAgY29sdW1uID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGxpbmVfcHRyLCAmYnl0ZXNfcmVhZCk7Ci0JICAgICAgbGluZV9wdHIgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6Ci0JICAgICAgaXNfc3RtdCA9ICghaXNfc3RtdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX3NldF9iYXNpY19ibG9jazoKLQkgICAgICBiYXNpY19ibG9jayA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFdfTE5TX2NvbnN0X2FkZF9wYzoKLQkgICAgICBhZGRyZXNzICs9IGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoCi0JCSAgICAgICogKCgyNTUgLSBsaC5vcGNvZGVfYmFzZSkgLyBsaC5saW5lX3JhbmdlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEV19MTlNfZml4ZWRfYWR2YW5jZV9wYzoKLQkgICAgICBhZGRyZXNzICs9IHJlYWRfMl9ieXRlcyAoYWJmZCwgbGluZV9wdHIpOwotCSAgICAgIGxpbmVfcHRyICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CQkvKiBzcGVjaWFsIG9wZXJhbmQgKi8KLQkgICAgICBhZGpfb3Bjb2RlID0gb3BfY29kZSAtIGxoLm9wY29kZV9iYXNlOwotCSAgICAgIGFkZHJlc3MgKz0gKGFkal9vcGNvZGUgLyBsaC5saW5lX3JhbmdlKQotCQkqIGxoLm1pbmltdW1faW5zdHJ1Y3Rpb25fbGVuZ3RoOwotCSAgICAgIGxpbmUgKz0gbGgubGluZV9iYXNlICsgKGFkal9vcGNvZGUgJSBsaC5saW5lX3JhbmdlKTsKLQkgICAgICAvKiBhcHBlbmQgcm93IHRvIG1hdHJpeCB1c2luZyBjdXJyZW50IHZhbHVlcyAqLwotCSAgICAgIGFkZF9saW5lX2luZm8gKHRhYmxlLCBhZGRyZXNzLCBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCAwKTsKLQkgICAgICBiYXNpY19ibG9jayA9IDE7Ci0JICAgICAgaWYgKG5lZWRfbG93X3BjKQotCQl7Ci0JCSAgbmVlZF9sb3dfcGMgPSAwOwotCQkgIGxvd19wYyA9IGFkZHJlc3M7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRhYmxlOwotfQotCi0KLS8qIElmIEFERFIgaXMgd2l0aGluIFRBQkxFIHNldCB0aGUgb3V0cHV0IHBhcmFtZXRlcnMgYW5kIHJldHVybiB0cnVlLAotICAgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4gIFRoZSBvdXRwdXQgcGFyYW1ldGVycywgRklMRU5BTUVfUFRSIGFuZAotICAgTElORU5VTUJFUl9QVFIsIGFyZSBwb2ludGVycyB0byB0aGUgb2JqZWN0cyB0byBiZSBmaWxsZWQgaW4uICovCi0KLXN0YXRpYyBib29sZWFuCi1sb29rdXBfYWRkcmVzc19pbl9saW5lX2luZm9fdGFibGUgKHRhYmxlLCAKLQkJCQkgICBhZGRyLAotCQkJCSAgIGZpbGVuYW1lX3B0ciwgCi0JCQkJICAgbGluZW51bWJlcl9wdHIpCi0gICAgIHN0cnVjdCBsaW5lX2luZm9fdGFibGUqIHRhYmxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZW51bWJlcl9wdHI7Ci17Ci0gIHN0cnVjdCBsaW5lX2luZm8qIG5leHRfbGluZSA9IHRhYmxlLT5sYXN0X2xpbmU7Ci0gIHN0cnVjdCBsaW5lX2luZm8qIGVhY2hfbGluZTsKLSAgCi0gIGlmICghbmV4dF9saW5lKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlYWNoX2xpbmUgPSBuZXh0X2xpbmUtPnByZXZfbGluZTsKLQotICB3aGlsZSAoZWFjaF9saW5lICYmIG5leHRfbGluZSkKLSAgICB7Ci0gICAgICBpZiAoIWVhY2hfbGluZS0+ZW5kX3NlcXVlbmNlCi0JICAmJiBhZGRyID49IGVhY2hfbGluZS0+YWRkcmVzcyAmJiBhZGRyIDwgbmV4dF9saW5lLT5hZGRyZXNzKQotCXsKLQkgICpmaWxlbmFtZV9wdHIgPSBlYWNoX2xpbmUtPmZpbGVuYW1lOwotCSAgKmxpbmVudW1iZXJfcHRyID0gZWFjaF9saW5lLT5saW5lOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgbmV4dF9saW5lID0gZWFjaF9saW5lOwotICAgICAgZWFjaF9saW5lID0gZWFjaF9saW5lLT5wcmV2X2xpbmU7Ci0gICAgfQotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotICAKLQotCi0KLS8qIEZ1bmN0aW9uIHRhYmxlIGZ1bmN0aW9ucy4gKi8KLQotc3RydWN0IGZ1bmNpbmZvIHsKLSAgc3RydWN0IGZ1bmNpbmZvICpwcmV2X2Z1bmM7Ci0KLSAgY2hhciogbmFtZTsKLSAgYmZkX3ZtYSBsb3c7Ci0gIGJmZF92bWEgaGlnaDsKLX07Ci0KLQotLyogSWYgQUREUiBpcyB3aXRoaW4gVEFCTEUsIHNldCBGVU5DVElPTk5BTUVfUFRSLCBhbmQgcmV0dXJuIHRydWUuICovCi0KLXN0YXRpYyBib29sZWFuCi1sb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSAodGFibGUsIAotCQkJCSAgYWRkciwKLQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIpCi0gICAgIHN0cnVjdCBmdW5jaW5mbyogdGFibGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci17Ci0gIHN0cnVjdCBmdW5jaW5mbyogZWFjaF9mdW5jOwotCi0gIGZvciAoZWFjaF9mdW5jID0gdGFibGU7Ci0gICAgICAgZWFjaF9mdW5jOwotICAgICAgIGVhY2hfZnVuYyA9IGVhY2hfZnVuYy0+cHJldl9mdW5jKQotICAgIHsKLSAgICAgIGlmIChhZGRyID49IGVhY2hfZnVuYy0+bG93ICYmIGFkZHIgPCBlYWNoX2Z1bmMtPmhpZ2gpCi0JewotCSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBlYWNoX2Z1bmMtPm5hbWU7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotICAKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLQotCi0vKiBEV0FSRjIgQ29tcGlsYXRpb24gdW5pdCBmdW5jdGlvbnMuICovCi0KLQotLyogU2NhbiBvdmVyIGVhY2ggZGllIGluIGEgY29tcC4gdW5pdCBsb29raW5nIGZvciBmdW5jdGlvbnMgdG8gYWRkCi0gICB0byB0aGUgZnVuY3Rpb24gdGFibGUuICovCi0KLXN0YXRpYyBib29sZWFuCi1zY2FuX3VuaXRfZm9yX2Z1bmN0aW9ucyAodW5pdCkKLSAgICAgc3RydWN0IGNvbXBfdW5pdCAqdW5pdDsKLXsKLSAgYmZkICphYmZkID0gdW5pdC0+YWJmZDsKLSAgY2hhciAqaW5mb19wdHIgPSB1bml0LT5maXJzdF9jaGlsZF9kaWVfcHRyOwotICBpbnQgbmVzdGluZ19sZXZlbCA9IDE7Ci0KLSAgd2hpbGUgKG5lc3RpbmdfbGV2ZWwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGk7Ci0gICAgICBzdHJ1Y3QgYWJicmV2X2luZm8gKmFiYnJldjsKLSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLSAgICAgIHN0cnVjdCBmdW5jaW5mbyAqZnVuYzsKLSAgICAgIGNoYXIqIG5hbWUgPSAwOwotCi0gICAgICBhYmJyZXZfbnVtYmVyID0gcmVhZF91bnNpZ25lZF9sZWIxMjggKGFiZmQsIGluZm9fcHRyLCAmYnl0ZXNfcmVhZCk7Ci0gICAgICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotCi0gICAgICBpZiAoISBhYmJyZXZfbnVtYmVyKQotCXsKLQkgIG5lc3RpbmdfbGV2ZWwtLTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIAotICAgICAgYWJicmV2ID0gbG9va3VwX2FiYnJldiAoYWJicmV2X251bWJlcix1bml0LT5hYmJyZXZzKTsKLSAgICAgIGlmICghIGFiYnJldikKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBDb3VsZCBub3QgZmluZCBhYmJyZXYgbnVtYmVyICVkLiIpLCAKLQkJCSAgICAgYWJicmV2X251bWJlcik7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChhYmJyZXYtPnRhZyA9PSBEV19UQUdfc3VicHJvZ3JhbSkKLQl7Ci0JICBmdW5jID0gKHN0cnVjdCBmdW5jaW5mbyopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGZ1bmNpbmZvKSk7Ci0JICBmdW5jLT5wcmV2X2Z1bmMgPSB1bml0LT5mdW5jdGlvbl90YWJsZTsKLQkgIHVuaXQtPmZ1bmN0aW9uX3RhYmxlID0gZnVuYzsKLQl9Ci0gICAgICBlbHNlCi0JZnVuYyA9IE5VTEw7Ci0gIAotICAgICAgZm9yIChpID0gMDsgaSA8IGFiYnJldi0+bnVtX2F0dHJzOyArK2kpCi0JewotCSAgaW5mb19wdHIgPSByZWFkX2F0dHJpYnV0ZSAoJmF0dHIsICZhYmJyZXYtPmF0dHJzW2ldLCB1bml0LCBpbmZvX3B0cik7Ci0JICAKLQkgIGlmIChmdW5jKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChhdHRyLm5hbWUpCi0JCXsKLQkJY2FzZSBEV19BVF9uYW1lOgotCQkgIAotCQkgIG5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQotCQkgIC8qIFByZWZlciBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSBvdmVyIERXX0FUX25hbWUuICAqLwotCQkgIGlmIChmdW5jLT5uYW1lID09IE5VTEwpCi0JCSAgICBmdW5jLT5uYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgRFdfQVRfTUlQU19saW5rYWdlX25hbWU6Ci0JCSAgZnVuYy0+bmFtZSA9IERXX1NUUklORyAoJmF0dHIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRFdfQVRfbG93X3BjOgotCQkgIGZ1bmMtPmxvdyA9IERXX0FERFIgKCZhdHRyKTsKLQkJICBicmVhazsKLQotCQljYXNlIERXX0FUX2hpZ2hfcGM6Ci0JCSAgZnVuYy0+aGlnaCA9IERXX0FERFIgKCZhdHRyKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN3aXRjaCAoYXR0ci5uYW1lKQotCQl7Ci0JCWNhc2UgRFdfQVRfbmFtZToKLQkJICBuYW1lID0gRFdfU1RSSU5HICgmYXR0cik7Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGFiYnJldi0+aGFzX2NoaWxkcmVuKQotCW5lc3RpbmdfbGV2ZWwrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0KLQotCi0vKiBQYXJzZSBhIERXQVJGMiBjb21waWxhdGlvbiB1bml0IHN0YXJ0aW5nIGF0IElORk9fUFRSLiAgVGhpcyBpbmNsdWRlcwotICAgdGhlIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyIHRoYXQgcHJvY2VlZHMgdGhlIERJRSdzLCBidXQgZG9lcyBub3QKLSAgIGluY2x1ZGUgdGhlIGxlbmd0aCBmaWVsZCB0aGF0IHByZWNlZWRzIGVhY2ggY29tcGlsYXRpb24gdW5pdCBoZWFkZXIuCi0gICBFTkRfUFRSIHBvaW50cyBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoaXMgY29tcCB1bml0LgotCi0gICBUaGlzIHJvdXRpbmUgZG9lcyBub3QgcmVhZCB0aGUgd2hvbGUgY29tcGlsYXRpb24gdW5pdDsgb25seSBlbm91Z2gKLSAgIHRvIGdldCB0byB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBjb21wX3VuaXQgKgotcGFyc2VfY29tcF91bml0IChhYmZkLCBpbmZvX3B0ciwgZW5kX3B0cikKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBpbmZvX3B0cjsKLSAgICAgY2hhciogZW5kX3B0cjsKLXsKLSAgc3RydWN0IGNvbXBfdW5pdCogdW5pdDsKLQotICB1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uOwotICB1bnNpZ25lZCBpbnQgYWJicmV2X29mZnNldDsKLSAgdW5zaWduZWQgY2hhciBhZGRyX3NpemU7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyoqIGFiYnJldnM7Ci0KLSAgdW5zaWduZWQgaW50IGFiYnJldl9udW1iZXIsIGJ5dGVzX3JlYWQsIGk7Ci0gIHN0cnVjdCBhYmJyZXZfaW5mbyAqYWJicmV2OwotICBzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0KLSAgdmVyc2lvbiA9IHJlYWRfMl9ieXRlcyAoYWJmZCwgaW5mb19wdHIpOwotICBpbmZvX3B0ciArPSAyOwotICBhYmJyZXZfb2Zmc2V0ID0gcmVhZF80X2J5dGVzIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IDQ7Ci0gIGFkZHJfc2l6ZSA9IHJlYWRfMV9ieXRlIChhYmZkLCBpbmZvX3B0cik7Ci0gIGluZm9fcHRyICs9IDE7Ci0KLSAgaWYgKHZlcnNpb24gIT0gMikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBmb3VuZCBkd2FyZiB2ZXJzaW9uICclaHUnLCB0aGlzIHJlYWRlciBvbmx5IGhhbmRsZXMgdmVyc2lvbiAyIGluZm9ybWF0aW9uLiIpLCB2ZXJzaW9uICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoYWRkcl9zaXplID4gc2l6ZW9mIChiZmRfdm1hKSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG5vdCBoYW5kbGUgc2l6ZXMgZ3JlYXRlciB0aGFuICcldScuIiksCi0JCQkgYWRkcl9zaXplLAotCQkJIHNpemVvZiAoYmZkX3ZtYSkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGFkZHJfc2l6ZSAhPSA0ICYmIGFkZHJfc2l6ZSAhPSA4KQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkR3YXJmIEVycm9yOiBmb3VuZCBhZGRyZXNzIHNpemUgJyV1JywgdGhpcyByZWFkZXIgY2FuIG9ubHkgaGFuZGxlIGFkZHJlc3Mgc2l6ZXMgJzQnIGFuZCAnOCcuIiwgYWRkcl9zaXplICk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBhYmJyZXZzIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQgaW50byBhIHRhYmxlICovCi0gIGFiYnJldnMgPSByZWFkX2FiYnJldnMgKGFiZmQsIGFiYnJldl9vZmZzZXQpOwotICBpZiAoISBhYmJyZXZzKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgYWJicmV2X251bWJlciA9IHJlYWRfdW5zaWduZWRfbGViMTI4IChhYmZkLCBpbmZvX3B0ciwgJmJ5dGVzX3JlYWQpOwotICBpbmZvX3B0ciArPSBieXRlc19yZWFkOwotICBpZiAoISBhYmJyZXZfbnVtYmVyKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRHdhcmYgRXJyb3I6IEJhZCBhYmJyZXYgbnVtYmVyOiAlZC4iKSwKLQkJCSBhYmJyZXZfbnVtYmVyKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFiYnJldiA9IGxvb2t1cF9hYmJyZXYgKGFiYnJldl9udW1iZXIsIGFiYnJldnMpOwotICBpZiAoISBhYmJyZXYpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJEd2FyZiBFcnJvcjogQ291bGQgbm90IGZpbmQgYWJicmV2IG51bWJlciAlZC4iKSwKLQkJCSBhYmJyZXZfbnVtYmVyKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAKLSAgdW5pdCA9IChzdHJ1Y3QgY29tcF91bml0KikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgY29tcF91bml0KSk7Ci0gIHVuaXQtPmFiZmQgPSBhYmZkOwotICB1bml0LT5hZGRyX3NpemUgPSBhZGRyX3NpemU7IAotICB1bml0LT5hYmJyZXZzID0gYWJicmV2czsKLSAgdW5pdC0+ZW5kX3B0ciA9IGVuZF9wdHI7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGFiYnJldi0+bnVtX2F0dHJzOyArK2kpCi0gICAgewotICAgICAgaW5mb19wdHIgPSByZWFkX2F0dHJpYnV0ZSAoJmF0dHIsICZhYmJyZXYtPmF0dHJzW2ldLCB1bml0LCBpbmZvX3B0cik7Ci0KLSAgICAgIC8qIFN0b3JlIHRoZSBkYXRhIGlmIGl0IGlzIG9mIGFuIGF0dHJpYnV0ZSB3ZSB3YW50IHRvIGtlZXAgaW4gYQotCSBwYXJ0aWFsIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzd2l0Y2ggKGF0dHIubmFtZSkKLQl7Ci0JY2FzZSBEV19BVF9zdG10X2xpc3Q6Ci0JICB1bml0LT5zdG10bGlzdCA9IDE7Ci0JICB1bml0LT5saW5lX29mZnNldCA9IERXX1VOU05EICgmYXR0cik7Ci0JICBicmVhazsKLQotCWNhc2UgRFdfQVRfbmFtZToKLQkgIHVuaXQtPm5hbWUgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9sb3dfcGM6Ci0JICB1bml0LT5hcmFuZ2UubG93ID0gRFdfQUREUiAoJmF0dHIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIERXX0FUX2hpZ2hfcGM6Ci0JICB1bml0LT5hcmFuZ2UuaGlnaCA9IERXX0FERFIgKCZhdHRyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEV19BVF9jb21wX2RpcjoKLQkgIHsKLQkgICAgY2hhciogY29tcF9kaXIgPSBEV19TVFJJTkcgKCZhdHRyKTsKLQkgICAgaWYgKGNvbXBfZGlyKQotCSAgICAgIHsKLQkJLyogSXJpeCA2LjIgbmF0aXZlIGNjIHByZXBlbmRzIDxtYWNoaW5lPi46IHRvIHRoZSBjb21waWxhdGlvbgotCQkgICBkaXJlY3RvcnksIGdldCByaWQgb2YgaXQuICAqLwotCQljaGFyICpjcCA9IChjaGFyKikgc3RyY2hyIChjb21wX2RpciwgJzonKTsKLQotCQlpZiAoY3AgJiYgY3AgIT0gY29tcF9kaXIgJiYgY3BbLTFdID09ICcuJyAmJiBjcFsxXSA9PSAnLycpCi0JCSAgY29tcF9kaXIgPSBjcCArIDE7Ci0JICAgICAgfQotCSAgICB1bml0LT5jb21wX2RpciA9IGNvbXBfZGlyOwotCSAgICBicmVhazsKLQkgIH0KLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHVuaXQtPmZpcnN0X2NoaWxkX2RpZV9wdHIgPSBpbmZvX3B0cjsKLSAgcmV0dXJuIHVuaXQ7Ci19Ci0KLQotCi0KLQotLyogUmV0dXJuIHRydWUgaWYgVU5JVCBjb250YWlucyB0aGUgYWRkcmVzcyBnaXZlbiBieSBBRERSLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29tcF91bml0X2NvbnRhaW5zX2FkZHJlc3MgKHVuaXQsIGFkZHIpCi0gICAgIHN0cnVjdCBjb21wX3VuaXQqIHVuaXQ7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGFyYW5nZSAqYXJhbmdlOwotCi0gIGlmICh1bml0LT5lcnJvcikKLSAgICByZXR1cm4gMDsKLQotICBhcmFuZ2UgPSAmdW5pdC0+YXJhbmdlOwotICBkbwotICAgIHsKLSAgICAgIGlmIChhZGRyID49IGFyYW5nZS0+bG93ICYmIGFkZHIgPCBhcmFuZ2UtPmhpZ2gpCi0JcmV0dXJuIDE7Ci0gICAgICBhcmFuZ2UgPSBhcmFuZ2UtPm5leHQ7Ci0gICAgfQotICB3aGlsZSAoYXJhbmdlKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogSWYgVU5JVCBjb250YWlucyBBRERSLCBzZXQgdGhlIG91dHB1dCBwYXJhbWV0ZXJzIHRvIHRoZSB2YWx1ZXMgZm9yCi0gICB0aGUgbGluZSBjb250YWluaW5nIEFERFIuICBUaGUgb3V0cHV0IHBhcmFtZXRlcnMsIEZJTEVOQU1FX1BUUiwKLSAgIEZVTkNUSU9OTkFNRV9QVFIsIGFuZCBMSU5FTlVNQkVSX1BUUiwgYXJlIHBvaW50ZXJzIHRvIHRoZSBvYmplY3RzCi0gICB0byBiZSBmaWxsZWQgaW4uICAKLQotICAgUmV0dXJuIHRydWUgb2YgVU5JVCBjb250YWlucyBBRERSLCBhbmQgbm8gZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQ7Ci0gICBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lICh1bml0LCBhZGRyLAotCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBzdHJ1Y3QgY29tcF91bml0KiB1bml0OwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICBib29sZWFuIGxpbmVfcDsKLSAgYm9vbGVhbiBmdW5jX3A7Ci0gIAotICBpZiAodW5pdC0+ZXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHVuaXQtPmxpbmVfdGFibGUpCi0gICAgewotICAgICAgaWYgKCEgdW5pdC0+c3RtdGxpc3QpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgCi0gICAgICB1bml0LT5saW5lX3RhYmxlID0gZGVjb2RlX2xpbmVfaW5mbyAodW5pdCk7Ci0KLSAgICAgIGlmICghIHVuaXQtPmxpbmVfdGFibGUpCi0JewotCSAgdW5pdC0+ZXJyb3IgPSAxOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIAotICAgICAgaWYgKCEgc2Nhbl91bml0X2Zvcl9mdW5jdGlvbnMgKHVuaXQpKQotCXsKLQkgIHVuaXQtPmVycm9yID0gMTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGxpbmVfcCA9IGxvb2t1cF9hZGRyZXNzX2luX2xpbmVfaW5mb190YWJsZSAodW5pdC0+bGluZV90YWJsZSwKLQkJCQkJICAgICAgYWRkciwKLQkJCQkJICAgICAgZmlsZW5hbWVfcHRyLCAKLQkJCQkJICAgICAgbGluZW51bWJlcl9wdHIpOwotICBmdW5jX3AgPSBsb29rdXBfYWRkcmVzc19pbl9mdW5jdGlvbl90YWJsZSAodW5pdC0+ZnVuY3Rpb25fdGFibGUsIAotCQkJCQkgICAgIGFkZHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0cik7Ci0gIHJldHVybiBsaW5lX3AgfHwgZnVuY19wOwotfQotCi0vKiBUaGUgRFdBUkYyIHZlcnNpb24gb2YgZmluZF9uZWFyZXN0IGxpbmUuCi0gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBpcyBmb3VuZCB3aXRob3V0IGVycm9yLiAqLwotCi1ib29sZWFuCi1fYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVudW1iZXJfcHRyOwotewotICAvKiBSZWFkIGVhY2ggY29tcGlsYXRpb24gdW5pdCBmcm9tIHRoZSBzZWN0aW9uIC5kZWJ1Z19pbmZvLCBhbmQgY2hlY2sKLSAgICAgdG8gc2VlIGlmIGl0IGNvbnRhaW5zIHRoZSBhZGRyZXNzIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiAgSWYgeWVzLAotICAgICBsb29rdXAgdGhlIGFkZHJlc3MsIGFuZCByZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGluZm8uICBJZiBubywgZ28KLSAgICAgb24gdG8gdGhlIG5leHQgY29tcGlsYXRpb24gdW5pdC4gIAotCi0gICAgIFdlIGtlZXAgYSBsaXN0IG9mIGFsbCB0aGUgcHJldmlvdXNseSByZWFkIGNvbXBpbGF0aW9uIHVuaXRzLCBhbmQKLSAgICAgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHVuLXJlYWQgY29tcGlsYXRpb24gdW5pdC4gIENoZWNrIHRoZSAKLSAgICAgcHJldmlvdXNseSByZWFkIHVuaXRzIGJlZm9yZSByZWFkaW5nIG1vcmUuCi0gICAgICovCi0KLSAgc3RydWN0IGR3YXJmMl9kZWJ1ZyAqc3Rhc2ggPSBlbGZfdGRhdGEgKGFiZmQpLT5kd2FyZjJfZmluZF9saW5lX2luZm87Ci0KLSAgLyogV2hhdCBhZGRyZXNzIGFyZSB3ZSBsb29raW5nIGZvcj8gKi8KLSAgYmZkX3ZtYSBhZGRyID0gb2Zmc2V0ICsgc2VjdGlvbi0+dm1hOwotCi0gIHN0cnVjdCBjb21wX3VuaXQqIGVhY2g7Ci0gIAotICAqZmlsZW5hbWVfcHRyID0gTlVMTDsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBOVUxMOwotICAqbGluZW51bWJlcl9wdHIgPSAwOwotCi0gIGlmICghIHN0YXNoKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICptc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBzaXplOwotICAgICAgCi0gICAgICBzdGFzaCA9IGVsZl90ZGF0YSAoYWJmZCktPmR3YXJmMl9maW5kX2xpbmVfaW5mbyA9Ci0JKHN0cnVjdCBkd2FyZjJfZGVidWcqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkd2FyZjJfZGVidWcpKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZGVidWdfaW5mbyIpOwotICAgICAgaWYgKCEgbXNlYykKLQl7Ci0JICAvKiBObyBkd2FyZjIgaW5mby4gIE5vdGUgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzdGFzaAotCSAgICAgaGFzIGJlZW4gYWxsb2NhdGVkLCBidXQgY29udGFpbnMgemVyb3MsIHRoaXMgbGV0cwotCSAgICAgZnV0dXJlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gZmFpbCBxdWlja2VyLiAqLwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAobXNlYyk7Ci0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIAotICAgICAgc3Rhc2gtPmluZm9fcHRyID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIAotICAgICAgaWYgKCEgc3Rhc2gtPmluZm9fcHRyKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBtc2VjLCBzdGFzaC0+aW5mb19wdHIsIDAsIHNpemUpKQotCXsKLQkgIHN0YXNoLT5pbmZvX3B0ciA9IDA7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdGFzaC0+aW5mb19wdHJfZW5kID0gc3Rhc2gtPmluZm9fcHRyICsgc2l6ZTsKLQotICAgICAgLyogRklYTUU6IFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUKLQkgLmRlYnVnX2luZm8gc2VjdGlvbi4gIFRoZSAnbG93JyBhbmQgJ2hpZ2gnIGFkZHJlc3NlcyBvZiB0aGUKLQkgY29tcF91bml0cyBhcmUgY29tcHV0ZWQgYnkgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBpbiB0aGUKLQkgLnRleHQgc2VnbWVudC4gIFdlIG5lZWQgdGhlc2UgYWRkcmVzc2VzIGluIG9yZGVyIHRvIGRldGVybWluZQotCSB0aGUgbmVhcmVzdCBsaW5lIG51bWJlciwgYW5kIHNvIHdlIGhhdmUgdG8gcmVzb2x2ZSB0aGUKLQkgcmVsb2NzLiAgVGhlcmUgaXMgYSBzaW1pbGFyIHByb2JsZW0gd2hlbiB0aGUgLmRlYnVnX2xpbmUKLQkgc2VjdGlvbiBpcyBwcm9jZXNzZWQgYXMgd2VsbCAoZS5nLiwgdGhlcmUgbWF5IGJlIHJlbG9jcwotCSBhZ2FpbnN0IHRoZSBvcGVyYW5kIG9mIHRoZSBEV19MTkVfc2V0X2FkZHJlc3Mgb3BlcmF0b3IpLgotCSAKLQkgVW5mb3J0dW5hdGVseSBnZXR0aW5nIGhvbGQgb2YgdGhlIHJlbG9jIGluZm9ybWF0aW9uIGlzIGhhcmQuLi4KLQotCSBGb3Igbm93LCB0aGlzIG1lYW5zIHRoYXQgZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgKGFzCi0JIG9wcG9zZWQgdG8gZnVsbHkgZXhlY3V0YWJsZXMpIGRvZXMgbm90IGFsd2F5cyB3b3JrIGFzIHdlbGwgYXMKLQkgd2Ugd291bGQgbGlrZS4gICovCi0gICAgfQotICAKLSAgLyogQSBudWxsIGluZm9fcHRyIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGR3YXJmMiBpbmZvIAotICAgICAob3IgdGhhdCBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNldHRpbmcgdXAgdGhlIHN0YXNoKS4gKi8KLQotICBpZiAoISBzdGFzaC0+aW5mb19wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENoZWNrIHRoZSBwcmV2aW91c2x5IHJlYWQgY29tcC4gdW5pdHMgZmlyc3QuICovCi0KLSAgZm9yIChlYWNoID0gc3Rhc2gtPmFsbF9jb21wX3VuaXRzOyBlYWNoOyBlYWNoID0gZWFjaC0+bmV4dF91bml0KQotICAgIGlmIChjb21wX3VuaXRfY29udGFpbnNfYWRkcmVzcyAoZWFjaCwgYWRkcikpCi0gICAgICByZXR1cm4gY29tcF91bml0X2ZpbmRfbmVhcmVzdF9saW5lIChlYWNoLCBhZGRyLCBmaWxlbmFtZV9wdHIsIAotCQkJCQkgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVudW1iZXJfcHRyKTsKLQotICAvKiBSZWFkIGVhY2ggcmVtYWluaW5nIGNvbXAuIHVuaXRzIGNoZWNraW5nIGVhY2ggYXMgdGhleSBhcmUgcmVhZC4gKi8KLSAgd2hpbGUgKHN0YXNoLT5pbmZvX3B0ciA8IHN0YXNoLT5pbmZvX3B0cl9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGNvbXBfdW5pdCogZWFjaDsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gICAgICBib29sZWFuIGZvdW5kOwotCi0gICAgICBsZW5ndGggPSByZWFkXzRfYnl0ZXMgKGFiZmQsIHN0YXNoLT5pbmZvX3B0cik7Ci0gICAgICBzdGFzaC0+aW5mb19wdHIgKz0gNDsKLQotICAgICAgaWYgKGxlbmd0aCA+IDApCi0gICAgICAgIHsKLQkgIGVhY2ggPSBwYXJzZV9jb21wX3VuaXQgKGFiZmQsIHN0YXNoLT5pbmZvX3B0ciwgCi0JCQkJICBzdGFzaC0+aW5mb19wdHIgKyBsZW5ndGgpOwotCSAgc3Rhc2gtPmluZm9fcHRyICs9IGxlbmd0aDsKLQotCSAgaWYgKGVhY2gpCi0JICAgIHsKLQkgICAgICBlYWNoLT5uZXh0X3VuaXQgPSBzdGFzaC0+YWxsX2NvbXBfdW5pdHM7Ci0JICAgICAgc3Rhc2gtPmFsbF9jb21wX3VuaXRzID0gZWFjaDsKLQotCSAgICAgIC8qIERXX0FUX2xvd19wYyBhbmQgRFdfQVRfaGlnaF9wYyBhcmUgb3B0aW9uYWwgZm9yCi0JCSBjb21waWxhdGlvbiB1bml0cy4gIElmIHdlIGRvbid0IGhhdmUgdGhlbSAoaS5lLiwKLQkJIHVuaXQtPmhpZ2ggPT0gMCksIHdlIG5lZWQgdG8gY29uc3VsdCB0aGUgbGluZSBpbmZvCi0JCSB0YWJsZSB0byBzZWUgaWYgYSBjb21waWxhdGlvbiB1bml0IGNvbnRhaW5zIHRoZSBnaXZlbgotCQkgYWRkcmVzcy4gKi8KLQkgICAgICBpZiAoZWFjaC0+YXJhbmdlLmhpZ2ggPiAwKQotCQl7Ci0JCSAgaWYgKGNvbXBfdW5pdF9jb250YWluc19hZGRyZXNzIChlYWNoLCBhZGRyKSkKLQkJICAgIHJldHVybiBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKGVhY2gsIGFkZHIsCi0JCQkJCQkgICAgICAgZmlsZW5hbWVfcHRyLAotCQkJCQkJICAgICAgIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJCQkgICAgICAgbGluZW51bWJlcl9wdHIpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZm91bmQgPSBjb21wX3VuaXRfZmluZF9uZWFyZXN0X2xpbmUgKGVhY2gsIGFkZHIsCi0JCQkJCQkgICAgICAgZmlsZW5hbWVfcHRyLAotCQkJCQkJICAgICAgIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJCQkgICAgICAgbGluZW51bWJlcl9wdHIpOwotCQkgIGlmIChmb3VuZCkKLQkJICAgIHJldHVybiB0cnVlOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogZW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2JmZC9lY29mZi5jIGIvYmZkL2Vjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYTIzMDkuLjAwMDAwMDAKLS0tIGEvYmZkL2Vjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMyICswLDAgQEAKLS8qIEdlbmVyaWMgRUNPRkYgKEV4dGVuZGVkLUNPRkYpIHJvdXRpbmVzLgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIE9yaWdpbmFsIHZlcnNpb24gYnkgUGVyIEJvdGhuZXIuCi0gICBGdWxsIHN1cHBvcnQgYWRkZWQgYnkgSWFuIExhbmNlIFRheWxvciwgaWFuQGN5Z251cy5jb20uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIEZJWE1FOiBXZSBuZWVkIHRoZSBkZWZpbml0aW9ucyBvZiBOX1NFVFtBRFRCXSwgYnV0IGFvdXQ2NC5oIGRlZmluZXMKLSAgIHNvbWUgb3RoZXIgc3R1ZmYgd2hpY2ggd2UgZG9uJ3Qgd2FudCBhbmQgd2hpY2ggY29uZmxpY3RzIHdpdGggc3R1ZmYKLSAgIHdlIGRvIHdhbnQuICAqLwotI2luY2x1ZGUgImxpYmFvdXQuaCIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI3VuZGVmIE5fQUJTCi0jdW5kZWYgZXhlY19oZHIKLSN1bmRlZiBvYmpfc3ltX2ZpbGVwb3MKLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi0vKiBQcm90b3R5cGVzIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIGludCBlY29mZl9nZXRfbWFnaWMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgbG9uZyBlY29mZl9zZWNfdG9fc3R5cF9mbGFncyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgIGZsYWd3b3JkIGZsYWdzKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9zZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICphYmZkLCBTWU1SICplY29mZl9zeW0sCi0JCQkJCSAgIGFzeW1ib2wgKmFzeW0sIGludCBleHQsIGludCB3ZWFrKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSBQQVJBTVMgKChiZmQgKmFiZmQsIEZEUiAqZmRyLAotCQkJCQkgIGNoYXIgKnN0cmluZywKLQkJCQkJICBSTkRYUiAqcm5keCwgbG9uZyBpc3ltLAotCQkJCQkgIGNvbnN0IGNoYXIgKndoaWNoKSk7Ci1zdGF0aWMgY2hhciAqZWNvZmZfdHlwZV90b19zdHJpbmcgUEFSQU1TICgoYmZkICphYmZkLCBGRFIgKmZkciwKLQkJCQkJICAgdW5zaWduZWQgaW50IGluZHgpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJCQlhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGludCBlY29mZl9zb3J0X2hkcnMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9nZXRfZXh0ciBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHVuc2lnbmVkIGludCBlY29mZl9hcm1hcF9oYXNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKnMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCAqcmVoYXNoLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50IGhsb2cpKTsKLQwKLS8qIFRoaXMgc3R1ZmYgaXMgc29tZXdoYXQgY29waWVkIGZyb20gY29mZmNvZGUuaC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiBiZmRfZGVidWdfc2VjdGlvbiA9IHsgIipERUJVRyoiIH07Ci0KLS8qIENyZWF0ZSBhbiBFQ09GRiBvYmplY3QuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID0gKChzdHJ1Y3QgZWNvZmZfdGRhdGEgKikKLQkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGVjb2ZmX2RhdGFfdHlwZSkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmVjb2ZmX29ial9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBjYWxsZWQgYnkgY29mZl9yZWFsX29iamVjdF9wIHRvIGNyZWF0ZSBhbnkgYmFja2VuZAotICAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotCi1QVFIKLV9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICppbnRlcm5hbF9hID0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIGFvdXRoZHI7Ci0gIGVjb2ZmX2RhdGFfdHlwZSAqZWNvZmY7Ci0KLSAgaWYgKF9iZmRfZWNvZmZfbWtvYmplY3QgKGFiZmQpID09IGZhbHNlKQotICAgIHJldHVybiBOVUxMOwotCi0gIGVjb2ZmID0gZWNvZmZfZGF0YSAoYWJmZCk7Ci0gIGVjb2ZmLT5ncF9zaXplID0gODsKLSAgZWNvZmYtPnN5bV9maWxlcG9zID0gaW50ZXJuYWxfZi0+Zl9zeW1wdHI7Ci0KLSAgaWYgKGludGVybmFsX2EgIT0gKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyICopIE5VTEwpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGVjb2ZmLT50ZXh0X3N0YXJ0ID0gaW50ZXJuYWxfYS0+dGV4dF9zdGFydDsKLSAgICAgIGVjb2ZmLT50ZXh0X2VuZCA9IGludGVybmFsX2EtPnRleHRfc3RhcnQgKyBpbnRlcm5hbF9hLT50c2l6ZTsKLSAgICAgIGVjb2ZmLT5ncCA9IGludGVybmFsX2EtPmdwX3ZhbHVlOwotICAgICAgZWNvZmYtPmdwcm1hc2sgPSBpbnRlcm5hbF9hLT5ncHJtYXNrOwotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQllY29mZi0+Y3BybWFza1tpXSA9IGludGVybmFsX2EtPmNwcm1hc2tbaV07Ci0gICAgICBlY29mZi0+ZnBybWFzayA9IGludGVybmFsX2EtPmZwcm1hc2s7Ci0gICAgICBpZiAoaW50ZXJuYWxfYS0+bWFnaWMgPT0gRUNPRkZfQU9VVF9aTUFHSUMpCi0JYWJmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKLSAgICAgIGVsc2UKLQlhYmZkLT5mbGFncyAmPX4gRF9QQUdFRDsKLSAgICB9Ci0KLSAgLyogSXQgdHVybnMgb3V0IHRoYXQgbm8gc3BlY2lhbCBhY3Rpb24gaXMgcmVxdWlyZWQgYnkgdGhlIE1JUFMgb3IKLSAgICAgQWxwaGEgRUNPRkYgYmFja2VuZHMuICBUaGV5IGhhdmUgZGlmZmVyZW50IGluZm9ybWF0aW9uIGluIHRoZQotICAgICBhLm91dCBoZWFkZXIsIGJ1dCB3ZSBqdXN0IGNvcHkgaXQgYWxsIChlLmcuLCBncHJtYXNrLCBjcHJtYXNrIGFuZAotICAgICBmcHJtYXNrKSBhbmQgbGV0IHRoZSBzd2FwcGluZyByb3V0aW5lcyBlbnN1cmUgdGhhdCBvbmx5IHJlbGV2YW50Ci0gICAgIGluZm9ybWF0aW9uIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLQotICByZXR1cm4gKFBUUikgZWNvZmY7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBuZXcgc2VjdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gNDsKLQotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfVEVYVCkgPT0gMAotICAgICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfSU5JVCkgPT0gMAotICAgICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfRklOSSkgPT0gMCkKLSAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERSB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9EQVRBKSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfU0RBVEEpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLSAgZWxzZSBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfUkRBVEEpID09IDAKLQkgICB8fCBzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSVQ4KSA9PSAwCi0JICAgfHwgc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElUNCkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1JDT05TVCkgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1BEQVRBKSA9PSAwKQotICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFk7Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX0JTUykgPT0gMAotCSAgIHx8IHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgX1NCU1MpID09IDApCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotICBlbHNlIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsIF9MSUIpID09IDApCi0gICAgewotICAgICAgLyogQW4gSXJpeCA0IHNoYXJlZCBsaWJhcnkuICAqLwotICAgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgfQotCi0gIC8qIFByb2JhYmx5IGFueSBvdGhlciBzZWN0aW9uIG5hbWUgaXMgU0VDX05FVkVSX0xPQUQsIGJ1dCBJJ20KLSAgICAgdW5jZXJ0YWluIGFib3V0IC5pbml0IG9uIHNvbWUgc3lzdGVtcyBhbmQgSSBkb24ndCBrbm93IGhvdyBzaGFyZWQKLSAgICAgbGlicmFyaWVzIHdvcmsuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZXRlcm1pbmUgdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlIGFuZCB0eXBlLiAgVGhpcyBpcyBjYWxsZWQgZnJvbQotICAgdGhlIGdlbmVyaWMgQ09GRiByb3V0aW5lcy4gIEl0IGlzIHRoZSBpbnZlcnNlIG9mIGVjb2ZmX2dldF9tYWdpYywKLSAgIGJlbG93LiAgVGhpcyBjb3VsZCBiZSBhbiBFQ09GRiBiYWNrZW5kIHJvdXRpbmUsIHdpdGggb25lIHZlcnNpb24KLSAgIGZvciBlYWNoIHRhcmdldCwgYnV0IHRoZXJlIGFyZW4ndCBhbGwgdGhhdCBtYW55IEVDT0ZGIHRhcmdldHMuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vayAoYWJmZCwgZmlsZWhkcikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLXsKLSAgc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKmludGVybmFsX2YgPSAoc3RydWN0IGludGVybmFsX2ZpbGVoZHIgKikgZmlsZWhkcjsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIHVuc2lnbmVkIGxvbmcgbWFjaDsKLQotICBzd2l0Y2ggKGludGVybmFsX2YtPmZfbWFnaWMpCi0gICAgewotICAgIGNhc2UgTUlQU19NQUdJQ18xOgotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEU6Ci0gICAgY2FzZSBNSVBTX01BR0lDX0JJRzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9taXBzOwotICAgICAgbWFjaCA9IDMwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTUlQU19NQUdJQ19MSVRUTEUyOgotICAgIGNhc2UgTUlQU19NQUdJQ19CSUcyOgotICAgICAgLyogTUlQUyBJU0EgbGV2ZWwgMjogdGhlIHI2MDAwICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICAgIG1hY2ggPSA2MDAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1JUFNfTUFHSUNfTElUVExFMzoKLSAgICBjYXNlIE1JUFNfTUFHSUNfQklHMzoKLSAgICAgIC8qIE1JUFMgSVNBIGxldmVsIDM6IHRoZSByNDAwMCAqLwotICAgICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgICBtYWNoID0gNDAwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9NQUdJQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9hbHBoYTsKLSAgICAgIG1hY2ggPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBtYWNoID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaCk7Ci19Ci0KLS8qIEdldCB0aGUgbWFnaWMgbnVtYmVyIHRvIHVzZSBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLgotICAgVGhpcyBpcyB0aGUgaW52ZXJzZSBvZiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2hfaG9vaywgYWJvdmUuICAqLwotCi1zdGF0aWMgaW50Ci1lY29mZl9nZXRfbWFnaWMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGJpZywgbGl0dGxlOwotCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQlkZWZhdWx0OgotCWNhc2UgMDoKLQljYXNlIDMwMDA6Ci0JICBiaWcgPSBNSVBTX01BR0lDX0JJRzsKLQkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFOwotCSAgYnJlYWs7Ci0KLQljYXNlIDYwMDA6Ci0JICBiaWcgPSBNSVBTX01BR0lDX0JJRzI7Ci0JICBsaXR0bGUgPSBNSVBTX01BR0lDX0xJVFRMRTI7Ci0JICBicmVhazsKLQotCWNhc2UgNDAwMDoKLQkgIGJpZyA9IE1JUFNfTUFHSUNfQklHMzsKLQkgIGxpdHRsZSA9IE1JUFNfTUFHSUNfTElUVExFMzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgcmV0dXJuIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IGJpZyA6IGxpdHRsZTsKLQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICByZXR1cm4gQUxQSEFfTUFHSUM7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIEdldCB0aGUgc2VjdGlvbiBzX2ZsYWdzIHRvIHVzZSBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGxvbmcKLWVjb2ZmX3NlY190b19zdHlwX2ZsYWdzIChuYW1lLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGxvbmcgc3R5cDsKLQotICBzdHlwID0gMDsKLQotICBpZiAoc3RyY21wIChuYW1lLCBfVEVYVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9URVhUOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9EQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0RBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1NEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1NEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SREFUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9SREFUQTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElUQSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSVQ4KSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0xJVDg7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0xJVDQpID09IDApCi0gICAgc3R5cCA9IFNUWVBfTElUNDsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfQlNTKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0JTUzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0JTUykgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9TQlNTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9JTklUKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0VDT0ZGX0lOSVQ7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0ZJTkkpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRUNPRkZfRklOSTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUERBVEEpID09IDApCi0gICAgc3R5cCA9IFNUWVBfUERBVEE7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1hEQVRBKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX1hEQVRBOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9MSUIpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRUNPRkZfTElCOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9HT1QpID09IDApCi0gICAgc3R5cCA9IFNUWVBfR09UOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9IQVNIKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0hBU0g7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTkFNSUMpID09IDApCi0gICAgc3R5cCA9IFNUWVBfRFlOQU1JQzsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfTElCTElTVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9MSUJMSVNUOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SRUxEWU4pID09IDApCi0gICAgc3R5cCA9IFNUWVBfUkVMRFlOOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9DT05GTElDKSA9PSAwKQotICAgIHN0eXAgPSBTVFlQX0NPTkZMSUM7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTlNUUikgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EWU5TVFI7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0RZTlNZTSkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9EWU5TWU07Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0NPTU1FTlQpID09IDApCi0gICAgewotICAgICAgc3R5cCA9IFNUWVBfQ09NTUVOVDsKLSAgICAgIGZsYWdzICY9fiBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1JDT05TVCkgPT0gMCkKLSAgICBzdHlwID0gU1RZUF9SQ09OU1Q7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX0NPREUpIAotICAgIHN0eXAgPSBTVFlQX1RFWFQ7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX0RBVEEpIAotICAgIHN0eXAgPSBTVFlQX0RBVEE7Ci0gIGVsc2UgaWYgKGZsYWdzICYgU0VDX1JFQURPTkxZKQotICAgIHN0eXAgPSBTVFlQX1JEQVRBOwotICBlbHNlIGlmIChmbGFncyAmIFNFQ19MT0FEKQotICAgIHN0eXAgPSBTVFlQX1JFRzsKLSAgZWxzZQotICAgIHN0eXAgPSBTVFlQX0JTUzsKLQotICBpZiAoZmxhZ3MgJiBTRUNfTkVWRVJfTE9BRCkKLSAgICBzdHlwIHw9IFNUWVBfTk9MT0FEOwotCi0gIHJldHVybiBzdHlwOwotfQotCi0vKiBHZXQgdGhlIEJGRCBmbGFncyB0byB1c2UgZm9yIGEgc2VjdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotZmxhZ3dvcmQKLV9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgaGRyOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICppbnRlcm5hbF9zID0gKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKikgaGRyOwotICBsb25nIHN0eXBfZmxhZ3MgPSBpbnRlcm5hbF9zLT5zX2ZsYWdzOwotICBmbGFnd29yZCBzZWNfZmxhZ3M9MDsKLQotICBpZiAoc3R5cF9mbGFncyAmIFNUWVBfTk9MT0FEKQotICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQotICAvKiBGb3IgMzg2IENPRkYsIGF0IGxlYXN0LCBhbiB1bmxvYWRhYmxlIHRleHQgb3IgZGF0YSBzZWN0aW9uIGlzCi0gICAgIGFjdHVhbGx5IGEgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gICovCi0gIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfVEVYVCkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9FQ09GRl9JTklUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOQU1JQykKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSUJMSVNUKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1JFTERZTikKLSAgICAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT05GTElDCi0gICAgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfRFlOU1RSKQotICAgICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX0RZTlNZTSkKLSAgICAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9IQVNIKSkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfREFUQSkKLQkgICB8fCAoc3R5cF9mbGFncyAmIFNUWVBfUkRBVEEpCi0JICAgfHwgKHN0eXBfZmxhZ3MgJiBTVFlQX1NEQVRBKQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9QREFUQQotCSAgIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9YREFUQQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9HT1QpCi0JICAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1JDT05TVCkKLSAgICB7Ci0gICAgICBpZiAoc2VjX2ZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgICBlbHNlCi0Jc2VjX2ZsYWdzIHw9IFNFQ19EQVRBIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0gICAgICBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX1JEQVRBKQotCSAgfHwgc3R5cF9mbGFncyA9PSBTVFlQX1BEQVRBCi0JICB8fCBzdHlwX2ZsYWdzID09IFNUWVBfUkNPTlNUKQotCXNlY19mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0gICAgfQotICBlbHNlIGlmICgoc3R5cF9mbGFncyAmIFNUWVBfQlNTKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9TQlNTKSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgIH0KLSAgZWxzZSBpZiAoKHN0eXBfZmxhZ3MgJiBTVFlQX0lORk8pIHx8IHN0eXBfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQotICAgIHsKLSAgICAgIHNlY19mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHlwX2ZsYWdzICYgU1RZUF9MSVRBKQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ4KQotCSAgIHx8IChzdHlwX2ZsYWdzICYgU1RZUF9MSVQ0KSkKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19BTExPQyB8IFNFQ19SRUFET05MWTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0eXBfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikKLSAgICB7Ci0gICAgICBzZWNfZmxhZ3MgfD0gU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2VjX2ZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotICAgIH0KLQotICByZXR1cm4gc2VjX2ZsYWdzOwotfQotDAotLyogUmVhZCBpbiB0aGUgc3ltYm9saWMgaGVhZGVyIGZvciBhbiBFQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9zbHVycF9zeW1ib2xpY19oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgUFRSIHJhdyA9IE5VTEw7Ci0gIEhEUlIgKmludGVybmFsX3N5bWhkcjsKLQotICAvKiBTZWUgaWYgd2UndmUgYWxyZWFkeSByZWFkIGl0IGluLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5tYWdpYyA9PSAKLSAgICAgIGJhY2tlbmQtPmRlYnVnX3N3YXAuc3ltX21hZ2ljKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSB3aGV0aGVyIHRoZXJlIGlzIGEgc3ltYm9saWMgaGVhZGVyLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpIGhvbGRzIHRoZSBudW1iZXIgb2Ygc3ltYm9scwotICAgICBhcyByZWFkIGZyb20gdGhlIGZpbGUgaGVhZGVyLCBidXQgb24gRUNPRkYgdGhpcyBpcyBhbHdheXMgdGhlCi0gICAgIHNpemUgb2YgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGhlYWRlci4gIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8KLSAgICAgaGFuZGxlIHRoaXMgd2hlbiB3ZSBmaXJzdCByZWFkIHRoZSBmaWxlIGluIGNvZmZnZW4uYy4gICovCi0gIGV4dGVybmFsX2hkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZTsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IGV4dGVybmFsX2hkcl9zaXplKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBoZWFkZXIuICAqLwotICByYXcgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBleHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChyYXcgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcywgU0VFS19TRVQpID09IC0xCi0gICAgICB8fCAoYmZkX3JlYWQgKHJhdywgZXh0ZXJuYWxfaGRyX3NpemUsIDEsIGFiZmQpCi0JICAhPSBleHRlcm5hbF9oZHJfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGludGVybmFsX3N5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0gICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2hkcl9pbikgKGFiZmQsIHJhdywgaW50ZXJuYWxfc3ltaGRyKTsKLQotICBpZiAoaW50ZXJuYWxfc3ltaGRyLT5tYWdpYyAhPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN5bV9tYWdpYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBOb3cgd2UgY2FuIGdldCB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc3ltYm9scy4gICovCi0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gKGludGVybmFsX3N5bWhkci0+aXN5bU1heAotCQkJICAgICArIGludGVybmFsX3N5bWhkci0+aWV4dE1heCk7Ci0KLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKHJhdyAhPSBOVUxMKQotICAgIGZyZWUgKHJhdyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVhZCBpbiBhbmQgc3dhcCB0aGUgaW1wb3J0YW50IHN5bWJvbGljIGluZm9ybWF0aW9uIGZvciBhbiBFQ09GRgotICAgb2JqZWN0IGZpbGUuICBUaGlzIGlzIGNhbGxlZCBieSBnZGIgdmlhIHRoZSByZWFkX2RlYnVnX2luZm8gZW50cnkKLSAgIHBvaW50IGluIHRoZSBiYWNrZW5kIHN0cnVjdHVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCBpZ25vcmUsIGRlYnVnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppZ25vcmU7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgSERSUiAqaW50ZXJuYWxfc3ltaGRyOwotICBiZmRfc2l6ZV90eXBlIHJhd19iYXNlOwotICBiZmRfc2l6ZV90eXBlIHJhd19zaXplOwotICBQVFIgcmF3OwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotICBjaGFyICpmcmF3X3NyYzsKLSAgY2hhciAqZnJhd19lbmQ7Ci0gIHN0cnVjdCBmZHIgKmZkcl9wdHI7Ci0gIGJmZF9zaXplX3R5cGUgcmF3X2VuZDsKLSAgYmZkX3NpemVfdHlwZSBjYl9lbmQ7Ci0KLSAgQkZEX0FTU0VSVCAoZGVidWcgPT0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKTsKLQotICAvKiBDaGVjayB3aGV0aGVyIHdlJ3ZlIGFscmVhZHkgZ290dGVuIGl0LCBhbmQgd2hldGhlciB0aGVyZSdzIGFueSB0bwotICAgICBnZXQuICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPnJhd19zeW1lbnRzICE9IChQVFIpIE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50ZXJuYWxfc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0KLSAgLyogUmVhZCBhbGwgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGF0IG9uY2UuICAqLwotICByYXdfYmFzZSA9IChlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MKLQkgICAgICArIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemUpOwotCi0gIC8qIEFscGhhIGVjb2ZmIG1ha2VzIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHJhd19zaXplIGRpZmZpY3VsdC4gSXQgaGFzCi0gICAgIGFuIHVuZG9jdW1lbnRlZCBkZWJ1ZyBkYXRhIHNlY3Rpb24gYmV0d2VlbiB0aGUgc3ltaGRyIGFuZCB0aGUgZmlyc3QKLSAgICAgZG9jdW1lbnRlZCBzZWN0aW9uLiBBbmQgdGhlIG9yZGVyaW5nIG9mIHRoZSBzZWN0aW9ucyB2YXJpZXMgYmV0d2VlbgotICAgICBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZXMuCi0gICAgIElmIGJmZCBzdXBwb3J0cyBTRUVLX0VORCBzb21lZGF5LCB0aGlzIGNvZGUgY291bGQgYmUgc2ltcGxpZmllZC4gICovCi0KLSAgcmF3X2VuZCA9IDA7Ci0KLSNkZWZpbmUgVVBEQVRFX1JBV19FTkQoc3RhcnQsIGNvdW50LCBzaXplKSBcCi0gIGNiX2VuZCA9IGludGVybmFsX3N5bWhkci0+c3RhcnQgKyBpbnRlcm5hbF9zeW1oZHItPmNvdW50ICogKHNpemUpOyBcCi0gIGlmIChjYl9lbmQgPiByYXdfZW5kKSBcCi0gICAgcmF3X2VuZCA9IGNiX2VuZAotCi0gIFVQREFURV9SQVdfRU5EIChjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYkRuT2Zmc2V0LCBpZG5NYXgsIGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZG5yX3NpemUpOwotICBVUERBVEVfUkFXX0VORCAoY2JQZE9mZnNldCwgaXBkTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3N5bV9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX29wdF9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiU3NPZmZzZXQsIGlzc01heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFVQREFURV9SQVdfRU5EIChjYlNzRXh0T2Zmc2V0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhcikpOwotICBVUERBVEVfUkFXX0VORCAoY2JGZE9mZnNldCwgaWZkTWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiUmZkT2Zmc2V0LCBjcmZkLCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX3JmZF9zaXplKTsKLSAgVVBEQVRFX1JBV19FTkQgKGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBiYWNrZW5kLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplKTsKLQotI3VuZGVmIFVQREFURV9SQVdfRU5ECi0KLSAgcmF3X3NpemUgPSByYXdfZW5kIC0gcmF3X2Jhc2U7Ci0gIGlmIChyYXdfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJhdyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmF3X3NpemUpOwotICBpZiAocmF3ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCShlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MKLQkJICsgYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9oZHJfc2l6ZSksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAocmF3LCByYXdfc2l6ZSwgMSwgYWJmZCkgIT0gcmF3X3NpemUpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJhdyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5yYXdfc3ltZW50cyA9IHJhdzsKLQotICAvKiBHZXQgcG9pbnRlcnMgZm9yIHRoZSBudW1lcmljIG9mZnNldHMgaW4gdGhlIEhEUlIgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgRklYKG9mZjEsIG9mZjIsIHR5cGUpIFwKLSAgaWYgKGludGVybmFsX3N5bWhkci0+b2ZmMSA9PSAwKSBcCi0gICAgZGVidWctPm9mZjIgPSAodHlwZSkgTlVMTDsgXAotICBlbHNlIFwKLSAgICBkZWJ1Zy0+b2ZmMiA9ICh0eXBlKSAoKGNoYXIgKikgcmF3IFwKLQkJCSAgKyAoaW50ZXJuYWxfc3ltaGRyLT5vZmYxIFwKLQkJCSAgICAgLSByYXdfYmFzZSkpCi0gIEZJWCAoY2JMaW5lT2Zmc2V0LCBsaW5lLCB1bnNpZ25lZCBjaGFyICopOwotICBGSVggKGNiRG5PZmZzZXQsIGV4dGVybmFsX2RuciwgUFRSKTsKLSAgRklYIChjYlBkT2Zmc2V0LCBleHRlcm5hbF9wZHIsIFBUUik7Ci0gIEZJWCAoY2JTeW1PZmZzZXQsIGV4dGVybmFsX3N5bSwgUFRSKTsKLSAgRklYIChjYk9wdE9mZnNldCwgZXh0ZXJuYWxfb3B0LCBQVFIpOwotICBGSVggKGNiQXV4T2Zmc2V0LCBleHRlcm5hbF9hdXgsIHVuaW9uIGF1eF9leHQgKik7Ci0gIEZJWCAoY2JTc09mZnNldCwgc3MsIGNoYXIgKik7Ci0gIEZJWCAoY2JTc0V4dE9mZnNldCwgc3NleHQsIGNoYXIgKik7Ci0gIEZJWCAoY2JGZE9mZnNldCwgZXh0ZXJuYWxfZmRyLCBQVFIpOwotICBGSVggKGNiUmZkT2Zmc2V0LCBleHRlcm5hbF9yZmQsIFBUUik7Ci0gIEZJWCAoY2JFeHRPZmZzZXQsIGV4dGVybmFsX2V4dCwgUFRSKTsKLSN1bmRlZiBGSVgKLQotICAvKiBJIGRvbid0IHdhbnQgdG8gYWx3YXlzIHN3YXAgYWxsIHRoZSBkYXRhLCBiZWNhdXNlIGl0IHdpbGwganVzdAotICAgICB3YXN0ZSB0aW1lIGFuZCBtb3N0IHByb2dyYW1zIHdpbGwgbmV2ZXIgbG9vayBhdCBpdC4gIFRoZSBvbmx5Ci0gICAgIHRpbWUgdGhlIGxpbmtlciBuZWVkcyBtb3N0IG9mIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gc3dhcHBlZAotICAgICBpcyB3aGVuIGxpbmtpbmcgYmlnLWVuZGlhbiBhbmQgbGl0dGxlLWVuZGlhbiBNSVBTIG9iamVjdCBmaWxlcwotICAgICB0b2dldGhlciwgd2hpY2ggaXMgbm90IGEgY29tbW9uIG9jY3VycmVuY2UuCi0KLSAgICAgV2UgbmVlZCB0byBsb29rIGF0IHRoZSBmZHIgdG8gZGVhbCB3aXRoIGEgbG90IG9mIGluZm9ybWF0aW9uIGluCi0gICAgIHRoZSBzeW1ib2xzLCBzbyB3ZSBzd2FwIHRoZW0gaGVyZS4gICovCi0gIGRlYnVnLT5mZHIgPSAoc3RydWN0IGZkciAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAoaW50ZXJuYWxfc3ltaGRyLT5pZmRNYXggKgotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZkcikpKTsKLSAgaWYgKGRlYnVnLT5mZHIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGV4dGVybmFsX2Zkcl9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9mZHJfc2l6ZTsKLSAgZmRyX3B0ciA9IGRlYnVnLT5mZHI7Ci0gIGZyYXdfc3JjID0gKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2ZkcjsKLSAgZnJhd19lbmQgPSBmcmF3X3NyYyArIGludGVybmFsX3N5bWhkci0+aWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIGZvciAoOyBmcmF3X3NyYyA8IGZyYXdfZW5kOyBmcmF3X3NyYyArPSBleHRlcm5hbF9mZHJfc2l6ZSwgZmRyX3B0cisrKQotICAgICgqYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2Zkcl9pbikgKGFiZmQsIChQVFIpIGZyYXdfc3JjLCBmZHJfcHRyKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN5bWJvbCB0YWJsZSByb3V0aW5lcy4gIFRoZSBFQ09GRiBzeW1ib2wgdGFibGUgaXMgZGVzY3JpYmVkCi0gICBpbiBnY2MvbWlwcy10ZmlsZS5jLiAgKi8KLQotLyogRUNPRkYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUKLSAgIG90aGVyIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0Ci0gICB0b2dldGhlciwgYW5kIHRoZW4gcmVmZXJlbmNlZCB2aWEgdGhlIGdwIHBvaW50ZXIsIHdoaWNoIHlpZWxkcwotICAgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcyBpcyB3aGF0IHdlIHVzZSBmb3IgdGhlIHNtYWxsIGNvbW1vbgotICAgc2VjdGlvbi4gICovCi1zdGF0aWMgYXNlY3Rpb24gZWNvZmZfc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgZWNvZmZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqZWNvZmZfc2NvbV9zeW1ib2xfcHRyOwotCi0vKiBDcmVhdGUgYW4gZW1wdHkgc3ltYm9sLiAgKi8KLQotYXN5bWJvbCAqCi1fYmZkX2Vjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICpuZXc7Ci0KLSAgbmV3ID0gKGVjb2ZmX3N5bWJvbF90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlY29mZl9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IChlY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMKQotICAgIHJldHVybiAoYXN5bWJvbCAqKSBOVUxMOwotICBtZW1zZXQgKChQVFIpIG5ldywgMCwgc2l6ZW9mICpuZXcpOwotICBuZXctPnN5bWJvbC5zZWN0aW9uID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG5ldy0+ZmRyID0gKEZEUiAqKSBOVUxMOwotICBuZXctPmxvY2FsID0gZmFsc2U7Ci0gIG5ldy0+bmF0aXZlID0gTlVMTDsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIFNldCB0aGUgQkZEIGZsYWdzIGFuZCBzZWN0aW9uIGZvciBhbiBFQ09GRiBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfc2V0X3N5bWJvbF9pbmZvIChhYmZkLCBlY29mZl9zeW0sIGFzeW0sIGV4dCwgd2VhaykKLSAgICAgYmZkICphYmZkOwotICAgICBTWU1SICplY29mZl9zeW07Ci0gICAgIGFzeW1ib2wgKmFzeW07Ci0gICAgIGludCBleHQ7Ci0gICAgIGludCB3ZWFrOwotewotICBhc3ltLT50aGVfYmZkID0gYWJmZDsKLSAgYXN5bS0+dmFsdWUgPSBlY29mZl9zeW0tPnZhbHVlOwotICBhc3ltLT5zZWN0aW9uID0gJmJmZF9kZWJ1Z19zZWN0aW9uOwotICBhc3ltLT51ZGF0YS5pID0gMDsKLQotICAvKiBNb3N0IHN5bWJvbCB0eXBlcyBhcmUganVzdCBmb3IgZGVidWdnaW5nLiAgKi8KLSAgc3dpdGNoIChlY29mZl9zeW0tPnN0KQotICAgIHsKLSAgICBjYXNlIHN0R2xvYmFsOgotICAgIGNhc2Ugc3RTdGF0aWM6Ci0gICAgY2FzZSBzdExhYmVsOgotICAgIGNhc2Ugc3RQcm9jOgotICAgIGNhc2Ugc3RTdGF0aWNQcm9jOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzdE5pbDoKLSAgICAgIGlmIChFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQotCXsKLQkgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKHdlYWspCi0gICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfRVhQT1JUIHwgQlNGX1dFQUs7Ci0gIGVsc2UgaWYgKGV4dCkKLSAgICBhc3ltLT5mbGFncyA9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotICBlbHNlCi0gICAgewotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0gICAgICAvKiBOb3JtYWxseSwgYSBsb2NhbCBzdFByb2Mgc3ltYm9sIHdpbGwgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKLSAgICAgICAgIGV4dGVybmFsIHN5bWJvbC4gIFdlIG1hcmsgdGhlIGxvY2FsIHN5bWJvbCBhcyBhIGRlYnVnZ2luZwotICAgICAgICAgc3ltYm9sLCBpbiBvcmRlciB0byBwcmV2ZW50IG5tIGZyb20gcHJpbnRpbmcgYm90aCBvdXQuCi0gICAgICAgICBTaW1pbGFybHksIHdlIG1hcmsgc3RMYWJlbCBhbmQgc3RhYnMgc3ltYm9scyBhcyBkZWJ1Z2dpbmcKLSAgICAgICAgIHN5bWJvbHMuICBJbiBib3RoIGNhc2VzLCB3ZSBkbyB3YW50IHRvIHNldCB0aGUgdmFsdWUKLSAgICAgICAgIGNvcnJlY3RseSBiYXNlZCBvbiB0aGUgc3ltYm9sIGNsYXNzLiAgKi8KLSAgICAgIGlmIChlY29mZl9zeW0tPnN0ID09IHN0UHJvYwotCSAgfHwgZWNvZmZfc3ltLT5zdCA9PSBzdExhYmVsCi0JICB8fCBFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQotCWFzeW0tPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gICAgfQotICBzd2l0Y2ggKGVjb2ZmX3N5bS0+c2MpCi0gICAgewotICAgIGNhc2Ugc2NOaWw6Ci0gICAgICAvKiBVc2VkIGZvciBjb21waWxlciBnZW5lcmF0ZWQgbGFiZWxzLiAgTGVhdmUgdGhlbSBpbiB0aGUKLQkgZGVidWdnaW5nIHNlY3Rpb24sIGFuZCBtYXJrIHRoZW0gYXMgbG9jYWwuICBJZiBCU0ZfREVCVUdHSU5HCi0JIGlzIHNldCwgdGhlbiBubSBkb2VzIG5vdCBkaXNwbGF5IHRoZW0gZm9yIHNvbWUgcmVhc29uLiAgSWYgbm8KLQkgZmxhZ3MgYXJlIHNldCB0aGVuIHRoZSBsaW5rZXIgd2hpbmVzIGFib3V0IHRoZW0uICAqLwotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjVGV4dDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIudGV4dCIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0RhdGE6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmRhdGEiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NCc3M6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLmJzcyIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1JlZ2lzdGVyOgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0FiczoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1VuZGVmaW5lZDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgYXN5bS0+ZmxhZ3MgPSAwOwotICAgICAgYXN5bS0+dmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0NkYkxvY2FsOgotICAgIGNhc2Ugc2NCaXRzOgotICAgIGNhc2Ugc2NDZGJTeXN0ZW06Ci0gICAgY2FzZSBzY1JlZ0ltYWdlOgotICAgIGNhc2Ugc2NJbmZvOgotICAgIGNhc2Ugc2NVc2VyU3RydWN0OgotICAgICAgYXN5bS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1NEYXRhOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5zZGF0YSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1NCc3M6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNic3MiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NSRGF0YToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmRhdGEiKTsKLSAgICAgIGFzeW0tPnZhbHVlIC09IGFzeW0tPnNlY3Rpb24tPnZtYTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NWYXI6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjQ29tbW9uOgotICAgICAgaWYgKGFzeW0tPnZhbHVlID4gZWNvZmZfZGF0YSAoYWJmZCktPmdwX3NpemUpCi0JewotCSAgYXN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBhc3ltLT5mbGFncyA9IDA7Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2Ugc2NTQ29tbW9uOgotICAgICAgaWYgKGVjb2ZmX3Njb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgc21hbGwgY29tbW9uIHNlY3Rpb24uICAqLwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPSBTQ09NTU9OOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgIGVjb2ZmX3Njb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICZlY29mZl9zY29tX3NlY3Rpb247Ci0JICBlY29mZl9zY29tX3NlY3Rpb24uc3ltYm9sID0gJmVjb2ZmX3Njb21fc3ltYm9sOwotCSAgZWNvZmZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sX3B0cjsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sLm5hbWUgPSBTQ09NTU9OOwotCSAgZWNvZmZfc2NvbV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBlY29mZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgIGVjb2ZmX3Njb21fc3ltYm9sX3B0ciA9ICZlY29mZl9zY29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPmZsYWdzID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NWYXJSZWdpc3RlcjoKLSAgICBjYXNlIHNjVmFyaWFudDoKLSAgICAgIGFzeW0tPmZsYWdzID0gQlNGX0RFQlVHR0lORzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugc2NTVW5kZWZpbmVkOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBhc3ltLT5mbGFncyA9IDA7Ci0gICAgICBhc3ltLT52YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjSW5pdDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuaW5pdCIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY0Jhc2VkVmFyOgotICAgIGNhc2Ugc2NYRGF0YToKLSAgICBjYXNlIHNjUERhdGE6Ci0gICAgICBhc3ltLT5mbGFncyA9IEJTRl9ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHNjRmluaToKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZmluaSIpOwotICAgICAgYXN5bS0+dmFsdWUgLT0gYXN5bS0+c2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBzY1JDb25zdDoKLSAgICAgIGFzeW0tPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmNvbnN0Iik7Ci0gICAgICBhc3ltLT52YWx1ZSAtPSBhc3ltLT5zZWN0aW9uLT52bWE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIHNwZWNpYWwgY29uc3RydWN0b3JzIHN5bWJvbHMgYW5kIG1ha2UgcmVsb2NhdGlvbiBlbnRyaWVzCi0gICAgIGluIGEgc3BlY2lhbCBjb25zdHJ1Y3Rpb24gc2VjdGlvbi4gIFRoZXNlIGFyZSBwcm9kdWNlZCBieSB0aGUKLSAgICAgLWZnbnUtbGlua2VyIGFyZ3VtZW50IHRvIGcrKy4gICovCi0gIGlmIChFQ09GRl9JU19TVEFCIChlY29mZl9zeW0pKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUNPRkZfVU5NQVJLX1NUQUIgKGVjb2ZmX3N5bS0+aW5kZXgpKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIE5fU0VUQToKLQljYXNlIE5fU0VUVDoKLQljYXNlIE5fU0VURDoKLQljYXNlIE5fU0VUQjoKLQkgIHsKLQkgICAgLyogVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBuZWVkZWQuICBJdCB1c2VkIHRvIGJlIHVzZWQgdG8KLQkgICAgICAgbWFrZSB0aGUgbGlua2VyIGhhbmRsZSBzZXQgc3ltYm9scywgYnV0IHRoZXkgYXJlIG5vdwotCSAgICAgICBoYW5kbGVkIGluIHRoZSBhZGRfc3ltYm9scyByb3V0aW5lIGluc3RlYWQuICAqLwotI2lmIDAKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0JICAgIGFyZWxlbnRfY2hhaW4gKnJlbG9jX2NoYWluOwotCSAgICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQotCSAgICAvKiBHZXQgYSBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgc3ltYm9sICh1c3VhbGx5Ci0JICAgICAgIF9fQ1RPUl9MSVNUX18gb3IgX19EVE9SX0xJU1RfXykuICBGSVhNRTogZ2NjIHVzZXMgdGhlCi0JICAgICAgIG5hbWUgX19fQ1RPUl9MSVNUICh0aHJlZSB1bmRlcnNjb3JlcykuICBXZSBuZWVkCi0JICAgICAgIF9fQ1RPUl9MSVNUICh0d28gdW5kZXJzY29yZXMpLCBzaW5jZSBFQ09GRiBkb2Vzbid0IHVzZQotCSAgICAgICBhIGxlYWRpbmcgdW5kZXJzY29yZS4gIFRoaXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgZ2NjLAotCSAgICAgICBidXQgaW5zdGVhZCB3ZSBkbyBpdCBoZXJlLiAgQWN0dWFsbHksIHRoaXMgc2hvdWxkIGFsbAotCSAgICAgICBiZSBkb25lIGRpZmZlcmVudGx5IGFueWhvdy4gICovCi0JICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChhc3ltKTsKLQkgICAgaWYgKG5hbWVbMF0gPT0gJ18nICYmIG5hbWVbMV0gPT0gJ18nICYmIG5hbWVbMl0gPT0gJ18nKQotCSAgICAgIHsKLQkJKytuYW1lOwotCQlhc3ltLT5uYW1lID0gbmFtZTsKLQkgICAgICB9Ci0JICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICAgIHsKLQkJY2hhciAqY29weTsKLQotCQljb3B5ID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0JCWlmICghY29weSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXN0cmNweSAoY29weSwgbmFtZSk7Ci0JCXNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBjb3B5KTsKLQkgICAgICB9Ci0KLQkgICAgLyogQnVpbGQgYSByZWxvYyBwb2ludGluZyB0byB0aGlzIGNvbnN0cnVjdG9yLiAgKi8KLQkgICAgcmVsb2NfY2hhaW4gPQotCSAgICAgIChhcmVsZW50X2NoYWluICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChhcmVsZW50X2NoYWluKSk7Ci0JICAgIGlmICghcmVsb2NfY2hhaW4pCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgICBiZmRfZ2V0X3NlY3Rpb24gKGFzeW0pLT5zeW1ib2xfcHRyX3B0cjsKLQkgICAgcmVsb2NfY2hhaW4tPnJlbGVudC5hZGRyZXNzID0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50LmFkZGVuZCA9IGFzeW0tPnZhbHVlOwotCSAgICByZWxvY19jaGFpbi0+cmVsZW50Lmhvd3RvID0KLQkgICAgICBlY29mZl9iYWNrZW5kIChhYmZkKS0+Y29uc3RydWN0b3JfcmVsb2M7Ci0KLQkgICAgLyogU2V0IHVwIHRoZSBjb25zdHJ1Y3RvciBzZWN0aW9uIHRvIGhvbGQgdGhlIHJlbG9jLiAgKi8KLQkgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQ09OU1RSVUNUT1I7Ci0JICAgICsrc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLQkgICAgLyogQ29uc3RydWN0b3Igc2VjdGlvbnMgbXVzdCBiZSByb3VuZGVkIHRvIGEgYm91bmRhcnkKLQkgICAgICAgYmFzZWQgb24gdGhlIGJpdHNpemUuICBUaGVzZSBhcmUgbm90IHJlYWwgc2VjdGlvbnMtLQotCSAgICAgICB0aGV5IGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSB0aGUgbGlua2VyLS1zbyB0aGUgRUNPRkYKLQkgICAgICAgMTYgYnl0ZSBhbGlnbm1lbnQgcmVzdHJpY3Rpb24gZG9lcyBub3QgYXBwbHkuICAqLwotCSAgICBiaXRzaXplID0gZWNvZmZfYmFja2VuZCAoYWJmZCktPmNvbnN0cnVjdG9yX2JpdHNpemU7Ci0JICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IDE7Ci0JICAgIHdoaWxlICgoMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpIDwgYml0c2l6ZSAvIDgpCi0JICAgICAgKytzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLQkgICAgcmVsb2NfY2hhaW4tPm5leHQgPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQkgICAgc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW4gPSByZWxvY19jaGFpbjsKLQkgICAgc2VjdGlvbi0+X3Jhd19zaXplICs9IGJpdHNpemUgLyA4OwotCi0jZW5kaWYgLyogMCAqLwotCi0JICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyBhIGNvbnN0cnVjdG9yLiAgKi8KLQkgICAgYXN5bS0+ZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYW4gRUNPRkYgc3ltYm9sIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9zeW1fc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSkKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuc3dhcF9leHRfaW47Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfc3ltX2luOwotICBiZmRfc2l6ZV90eXBlIGludGVybmFsX3NpemU7Ci0gIGVjb2ZmX3N5bWJvbF90eXBlICppbnRlcm5hbDsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmludGVybmFsX3B0cjsKLSAgY2hhciAqZXJhd19zcmM7Ci0gIGNoYXIgKmVyYXdfZW5kOwotICBGRFIgKmZkcl9wdHI7Ci0gIEZEUiAqZmRyX2VuZDsKLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IHJlYWQgaW4gdGhlIHN5bWJvbCB0YWJsZSwgZG8gbm90aGluZy4gICovCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHMgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBHZXQgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGludGVybmFsX3NpemUgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoZWNvZmZfc3ltYm9sX3R5cGUpOwotICBpbnRlcm5hbCA9IChlY29mZl9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGludGVybmFsX3NpemUpOwotICBpZiAoaW50ZXJuYWwgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50ZXJuYWxfcHRyID0gaW50ZXJuYWw7Ci0gIGVyYXdfc3JjID0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0OwotICBlcmF3X2VuZCA9IChlcmF3X3NyYwotCSAgICAgICsgKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCSAqIGV4dGVybmFsX2V4dF9zaXplKSk7Ci0gIGZvciAoOyBlcmF3X3NyYyA8IGVyYXdfZW5kOyBlcmF3X3NyYyArPSBleHRlcm5hbF9leHRfc2l6ZSwgaW50ZXJuYWxfcHRyKyspCi0gICAgewotICAgICAgRVhUUiBpbnRlcm5hbF9lc3ltOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXJhd19zcmMsICZpbnRlcm5hbF9lc3ltKTsKLSAgICAgIGludGVybmFsX3B0ci0+c3ltYm9sLm5hbWUgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3NleHQKLQkJCQkgICArIGludGVybmFsX2VzeW0uYXN5bS5pc3MpOwotICAgICAgaWYgKCFlY29mZl9zZXRfc3ltYm9sX2luZm8gKGFiZmQsICZpbnRlcm5hbF9lc3ltLmFzeW0sCi0JCQkJICAmaW50ZXJuYWxfcHRyLT5zeW1ib2wsIDEsCi0JCQkJICBpbnRlcm5hbF9lc3ltLndlYWtleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFRoZSBhbHBoYSB1c2VzIGEgbmVnYXRpdmUgaWZkIGZpZWxkIGZvciBzZWN0aW9uIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGludGVybmFsX2VzeW0uaWZkID49IDApCi0JaW50ZXJuYWxfcHRyLT5mZHIgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZmRyCi0JCQkgICAgICsgaW50ZXJuYWxfZXN5bS5pZmQpOwotICAgICAgZWxzZQotCWludGVybmFsX3B0ci0+ZmRyID0gTlVMTDsKLSAgICAgIGludGVybmFsX3B0ci0+bG9jYWwgPSBmYWxzZTsKLSAgICAgIGludGVybmFsX3B0ci0+bmF0aXZlID0gKFBUUikgZXJhd19zcmM7Ci0gICAgfQotCi0gIC8qIFRoZSBsb2NhbCBzeW1ib2xzIG11c3QgYmUgYWNjZXNzZWQgdmlhIHRoZSBmZHIncywgYmVjYXVzZSB0aGUKLSAgICAgc3RyaW5nIGFuZCBhdXggaW5kaWNlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGZkciBpbmZvcm1hdGlvbi4gICovCi0gIGZkcl9wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5mZHI7Ci0gIGZkcl9lbmQgPSBmZHJfcHRyICsgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlmZE1heDsKLSAgZm9yICg7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCi0gICAgewotICAgICAgY2hhciAqbHJhd19zcmM7Ci0gICAgICBjaGFyICpscmF3X2VuZDsKLQotICAgICAgbHJhd19zcmMgPSAoKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfc3ltCi0JCSAgKyBmZHJfcHRyLT5pc3ltQmFzZSAqIGV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIGxyYXdfZW5kID0gbHJhd19zcmMgKyBmZHJfcHRyLT5jc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBmb3IgKDsKLQkgICBscmF3X3NyYyA8IGxyYXdfZW5kOwotCSAgIGxyYXdfc3JjICs9IGV4dGVybmFsX3N5bV9zaXplLCBpbnRlcm5hbF9wdHIrKykKLQl7Ci0JICBTWU1SIGludGVybmFsX3N5bTsKLQotCSAgKCpzd2FwX3N5bV9pbikgKGFiZmQsIChQVFIpIGxyYXdfc3JjLCAmaW50ZXJuYWxfc3ltKTsKLQkgIGludGVybmFsX3B0ci0+c3ltYm9sLm5hbWUgPSAoZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3MKLQkJCQkgICAgICAgKyBmZHJfcHRyLT5pc3NCYXNlCi0JCQkJICAgICAgICsgaW50ZXJuYWxfc3ltLmlzcyk7Ci0JICBpZiAoIWVjb2ZmX3NldF9zeW1ib2xfaW5mbyAoYWJmZCwgJmludGVybmFsX3N5bSwKLQkJCQkgICAgICAmaW50ZXJuYWxfcHRyLT5zeW1ib2wsIDAsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpbnRlcm5hbF9wdHItPmZkciA9IGZkcl9wdHI7Ci0JICBpbnRlcm5hbF9wdHItPmxvY2FsID0gdHJ1ZTsKLQkgIGludGVybmFsX3B0ci0+bmF0aXZlID0gKFBUUikgbHJhd19zcmM7Ci0JfQotICAgIH0KLQotICBlY29mZl9kYXRhIChhYmZkKS0+Y2Fub25pY2FsX3N5bWJvbHMgPSBpbnRlcm5hbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGZvciB0aGUgY2Fub25pY2FsIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2Vjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoZWNvZmZfc3ltYm9sX3R5cGUgKikpOwotfQotCi0vKiBHZXQgdGhlIGNhbm9uaWNhbCBzeW1ib2xzLiAgKi8KLQotbG9uZwotX2JmZF9lY29mZl9nZXRfc3ltdGFiIChhYmZkLCBhbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFsb2NhdGlvbjsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICBlY29mZl9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKipsb2NhdGlvbiA9IChlY29mZl9zeW1ib2xfdHlwZSAqKikgYWxvY2F0aW9uOwotCi0gIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBzeW1iYXNlID0gZWNvZmZfZGF0YSAoYWJmZCktPmNhbm9uaWNhbF9zeW1ib2xzOwotICB3aGlsZSAoY291bnRlciA8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKQotICAgIHsKLSAgICAgICoobG9jYXRpb24rKykgPSBzeW1iYXNlKys7Ci0gICAgICBjb3VudGVyKys7Ci0gICAgfQotICAqbG9jYXRpb24rKyA9IChlY29mZl9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICByZXR1cm4gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci19Ci0KLS8qIFR1cm4gRUNPRkYgdHlwZSBpbmZvcm1hdGlvbiBpbnRvIGEgcHJpbnRhYmxlIHN0cmluZy4KLSAgIGVjb2ZmX2VtaXRfYWdncmVnYXRlIGFuZCBlY29mZl90eXBlX3RvX3N0cmluZyBhcmUgZnJvbQotICAgZ2NjL21pcHMtdGR1bXAuYywgd2l0aCBzd2FwcGluZyBhZGRlZCBhbmQgdXNlZF9wdHIgcmVtb3ZlZC4gICovCi0KLS8qIFdyaXRlIGFnZ3JlZ2F0ZSBpbmZvcm1hdGlvbiB0byBhIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBzdHJpbmcsIHJuZHgsIGlzeW0sIHdoaWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEZEUiAqZmRyOwotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIFJORFhSICpybmR4OwotICAgICBsb25nIGlzeW07Ci0gICAgIGNvbnN0IGNoYXIgKndoaWNoOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAgPQotICAgICZlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcDsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOwotICB1bnNpZ25lZCBpbnQgaWZkID0gcm5keC0+cmZkOwotICB1bnNpZ25lZCBpbnQgaW5keCA9IHJuZHgtPmluZGV4OwotICBjb25zdCBjaGFyICpuYW1lOwotICAKLSAgaWYgKGlmZCA9PSAweGZmZikKLSAgICBpZmQgPSBpc3ltOwotCi0gIC8qIEFuIGlmZCBvZiAtMSBpcyBhbiBvcGFxdWUgdHlwZS4gIEFuIGVzY2FwZWQgaW5kZXggb2YgMCBpcyBhCi0gICAgIHN0cnVjdCByZXR1cm4gdHlwZSBvZiBhIHByb2NlZHVyZSBjb21waWxlZCB3aXRob3V0IC1nLiAgKi8KLSAgaWYgKGlmZCA9PSAweGZmZmZmZmZmCi0gICAgICB8fCAocm5keC0+cmZkID09IDB4ZmZmICYmIGluZHggPT0gMCkpCi0gICAgbmFtZSA9ICI8dW5kZWZpbmVkPiI7Ci0gIGVsc2UgaWYgKGluZHggPT0gaW5kZXhOaWwpCi0gICAgbmFtZSA9ICI8bm8gbmFtZT4iOwotICBlbHNlCi0gICAgewotICAgICAgU1lNUiBzeW07Ci0KLSAgICAgIGlmIChkZWJ1Z19pbmZvLT5leHRlcm5hbF9yZmQgPT0gTlVMTCkKLQlmZHIgPSBkZWJ1Z19pbmZvLT5mZHIgKyBpZmQ7Ci0gICAgICBlbHNlCi0JewotCSAgUkZEVCByZmQ7Ci0KLQkgICgqZGVidWdfc3dhcC0+c3dhcF9yZmRfaW4pIChhYmZkLAotCQkJCSAgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9yZmQKLQkJCQkgICAgICAgKyAoKGZkci0+cmZkQmFzZSArIGlmZCkKLQkJCQkJICAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3JmZF9zaXplKSksCi0JCQkJICAgICAgJnJmZCk7Ci0JICBmZHIgPSBkZWJ1Z19pbmZvLT5mZHIgKyByZmQ7Ci0JfQotCi0gICAgICBpbmR4ICs9IGZkci0+aXN5bUJhc2U7Ci0KLSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLAotCQkJCSAgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkJCSAgICsgaW5keCAqIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKSwKLQkJCQkgICZzeW0pOwotCi0gICAgICBuYW1lID0gZGVidWdfaW5mby0+c3MgKyBmZHItPmlzc0Jhc2UgKyBzeW0uaXNzOwotICAgIH0KLQotICBzcHJpbnRmIChzdHJpbmcsCi0JICAgIiVzICVzIHsgaWZkID0gJXUsIGluZGV4ID0gJWx1IH0iLAotCSAgIHdoaWNoLCBuYW1lLCBpZmQsCi0JICAgKChsb25nKSBpbmR4Ci0JICAgICsgZGVidWdfaW5mby0+c3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKTsKLX0KLQotLyogQ29udmVydCB0aGUgdHlwZSBpbmZvcm1hdGlvbiB0byBzdHJpbmcgZm9ybWF0LiAgKi8KLQotc3RhdGljIGNoYXIgKgotZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCkKLSAgICAgYmZkICphYmZkOwotICAgICBGRFIgKmZkcjsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci17Ci0gIHVuaW9uIGF1eF9leHQgKmF1eF9wdHI7Ci0gIGludCBiaWdlbmRpYW47Ci0gIEFVWFUgdTsKLSAgc3RydWN0IHF1YWwgewotICAgIHVuc2lnbmVkIGludCAgdHlwZTsKLSAgICBpbnQgIGxvd19ib3VuZDsKLSAgICBpbnQgIGhpZ2hfYm91bmQ7Ci0gICAgaW50ICBzdHJpZGU7Ci0gIH0gcXVhbGlmaWVyc1s3XTsKLSAgdW5zaWduZWQgaW50IGJhc2ljX3R5cGU7Ci0gIGludCBpOwotICBjaGFyIGJ1ZmZlcjFbMTAyNF07Ci0gIHN0YXRpYyBjaGFyIGJ1ZmZlcjJbMTAyNF07Ci0gIGNoYXIgKnAxID0gYnVmZmVyMTsKLSAgY2hhciAqcDIgPSBidWZmZXIyOwotICBSTkRYUiBybmR4OwotCi0gIGF1eF9wdHIgPSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9hdXggKyBmZHItPmlhdXhCYXNlOwotICBiaWdlbmRpYW4gPSBmZHItPmZCaWdlbmRpYW47Ci0KLSAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLSAgICB7Ci0gICAgICBxdWFsaWZpZXJzW2ldLmxvd19ib3VuZCA9IDA7Ci0gICAgICBxdWFsaWZpZXJzW2ldLmhpZ2hfYm91bmQgPSAwOwotICAgICAgcXVhbGlmaWVyc1tpXS5zdHJpZGUgPSAwOwotICAgIH0KLQotICBpZiAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHhdKSA9PSAoYmZkX3ZtYSkgLTEpCi0gICAgcmV0dXJuICItMSAobm8gdHlwZSkiOwotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrK10uYV90aSwgJnUudGkpOwotCi0gIGJhc2ljX3R5cGUgPSB1LnRpLmJ0OwotICBxdWFsaWZpZXJzWzBdLnR5cGUgPSB1LnRpLnRxMDsKLSAgcXVhbGlmaWVyc1sxXS50eXBlID0gdS50aS50cTE7Ci0gIHF1YWxpZmllcnNbMl0udHlwZSA9IHUudGkudHEyOwotICBxdWFsaWZpZXJzWzNdLnR5cGUgPSB1LnRpLnRxMzsKLSAgcXVhbGlmaWVyc1s0XS50eXBlID0gdS50aS50cTQ7Ci0gIHF1YWxpZmllcnNbNV0udHlwZSA9IHUudGkudHE1OwotICBxdWFsaWZpZXJzWzZdLnR5cGUgPSB0cU5pbDsKLQotICAvKgotICAgKiBHbyBnZXQgdGhlIGJhc2ljIHR5cGUuCi0gICAqLwotICBzd2l0Y2ggKGJhc2ljX3R5cGUpCi0gICAgewotICAgIGNhc2UgYnROaWw6CQkJLyogdW5kZWZpbmVkICovCi0gICAgICBzdHJjcHkgKHAxLCAibmlsIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRBZHI6CQkJLyogYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHBvaW50ZXIgKi8KLSAgICAgIHN0cmNweSAocDEsICJhZGRyZXNzIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRDaGFyOgkJLyogY2hhcmFjdGVyICovCi0gICAgICBzdHJjcHkgKHAxLCAiY2hhciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VUNoYXI6CQkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBjaGFyIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRTaG9ydDoJCS8qIHNob3J0ICovCi0gICAgICBzdHJjcHkgKHAxLCAic2hvcnQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFVTaG9ydDoJCS8qIHVuc2lnbmVkIHNob3J0ICovCi0gICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgc2hvcnQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidEludDoJCQkvKiBpbnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJpbnQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFVJbnQ6CQkvKiB1bnNpZ25lZCBpbnQgKi8KLSAgICAgIHN0cmNweSAocDEsICJ1bnNpZ25lZCBpbnQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidExvbmc6CQkvKiBsb25nICovCi0gICAgICBzdHJjcHkgKHAxLCAibG9uZyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0VUxvbmc6CQkvKiB1bnNpZ25lZCBsb25nICovCi0gICAgICBzdHJjcHkgKHAxLCAidW5zaWduZWQgbG9uZyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RmxvYXQ6CQkvKiBmbG9hdCAocmVhbCkgKi8KLSAgICAgIHN0cmNweSAocDEsICJmbG9hdCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RG91YmxlOgkJLyogRG91YmxlIChyZWFsKSAqLwotICAgICAgc3RyY3B5IChwMSwgImRvdWJsZSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFN0cnVjdHVyZXMgYWRkIDEtMiBhdXggd29yZHM6Ci0JIDFzdCB3b3JkIGlzIFtTVF9SRkRFU0NBUEUsIG9mZnNldF0gcG9pbnRlciB0byBzdHJ1Y3QgZGVmOwotCSAybmQgd29yZCBpcyBmaWxlIGluZGV4IGlmIDFzdCB3b3JkIHJmZCBpcyBTVF9SRkRFU0NBUEUuICAqLwotCi0gICAgY2FzZSBidFN0cnVjdDoJCS8qIFN0cnVjdHVyZSAoUmVjb3JkKSAqLwotICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7Ci0gICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCi0JCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKLQkJCSAgICAic3RydWN0Iik7Ci0gICAgICBpbmR4Kys7CQkJLyogc2tpcCBhdXggd29yZHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBVbmlvbnMgYWRkIDEtMiBhdXggd29yZHM6Ci0JIDFzdCB3b3JkIGlzIFtTVF9SRkRFU0NBUEUsIG9mZnNldF0gcG9pbnRlciB0byB1bmlvbiBkZWY7Ci0JIDJuZCB3b3JkIGlzIGZpbGUgaW5kZXggaWYgMXN0IHdvcmQgcmZkIGlzIFNUX1JGREVTQ0FQRS4gICovCi0KLSAgICBjYXNlIGJ0VW5pb246CQkvKiBVbmlvbiAqLwotICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7Ci0gICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCi0JCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKLQkJCSAgICAidW5pb24iKTsKLSAgICAgIGluZHgrKzsJCQkvKiBza2lwIGF1eCB3b3JkcyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEVudW1lcmF0aW9ucyBhZGQgMS0yIGF1eCB3b3JkczoKLQkgMXN0IHdvcmQgaXMgW1NUX1JGREVTQ0FQRSwgb2Zmc2V0XSBwb2ludGVyIHRvIGVudW0gZGVmOwotCSAybmQgd29yZCBpcyBmaWxlIGluZGV4IGlmIDFzdCB3b3JkIHJmZCBpcyBTVF9SRkRFU0NBUEUuICAqLwotCi0gICAgY2FzZSBidEVudW06CQkvKiBFbnVtZXJhdGlvbiAqLwotICAgICAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keF0uYV9ybmR4LCAmcm5keCk7Ci0gICAgICBlY29mZl9lbWl0X2FnZ3JlZ2F0ZSAoYWJmZCwgZmRyLCBwMSwgJnJuZHgsCi0JCQkgICAgKGxvbmcpIEFVWF9HRVRfSVNZTSAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzFdKSwKLQkJCSAgICAiZW51bSIpOwotICAgICAgaW5keCsrOwkJCS8qIHNraXAgYXV4IHdvcmRzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRUeXBlZGVmOgkJLyogZGVmaW5lZCB2aWEgYSB0eXBlZGVmLCBpc3ltUmVmIHBvaW50cyAqLwotICAgICAgc3RyY3B5IChwMSwgInR5cGVkZWYiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFJhbmdlOgkJLyogc3VicmFuZ2Ugb2YgaW50ICovCi0gICAgICBzdHJjcHkgKHAxLCAic3VicmFuZ2UiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidFNldDoJCQkvKiBwYXNjYWwgc2V0cyAqLwotICAgICAgc3RyY3B5IChwMSwgInNldCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Q29tcGxleDoJCS8qIGZvcnRyYW4gY29tcGxleCAqLwotICAgICAgc3RyY3B5IChwMSwgImNvbXBsZXgiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidERDb21wbGV4OgkJLyogZm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotICAgICAgc3RyY3B5IChwMSwgImRvdWJsZSBjb21wbGV4Iik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRJbmRpcmVjdDoJCS8qIGZvcndhcmQgb3IgdW5uYW1lZCB0eXBlZGVmICovCi0gICAgICBzdHJjcHkgKHAxLCAiZm9yd2FyZC91bmFtZWQgdHlwZWRlZiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Rml4ZWREZWM6CQkvKiBGaXhlZCBEZWNpbWFsICovCi0gICAgICBzdHJjcHkgKHAxLCAiZml4ZWQgZGVjaW1hbCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0RmxvYXREZWM6CQkvKiBGbG9hdCBEZWNpbWFsICovCi0gICAgICBzdHJjcHkgKHAxLCAiZmxvYXQgZGVjaW1hbCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0U3RyaW5nOgkJLyogVmFyeWluZyBMZW5ndGggQ2hhcmFjdGVyIFN0cmluZyAqLwotICAgICAgc3RyY3B5IChwMSwgInN0cmluZyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0Qml0OgkJCS8qIEFsaWduZWQgQml0IFN0cmluZyAqLwotICAgICAgc3RyY3B5IChwMSwgImJpdCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ0UGljdHVyZToJCS8qIFBpY3R1cmUgKi8KLSAgICAgIHN0cmNweSAocDEsICJwaWN0dXJlIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnRWb2lkOgkJLyogVm9pZCAqLwotICAgICAgc3RyY3B5IChwMSwgInZvaWQiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKHAxLCBfKCJVbmtub3duIGJhc2ljIHR5cGUgJWQiKSwgKGludCkgYmFzaWNfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcDEgKz0gc3RybGVuIChidWZmZXIxKTsKLQotICAvKgotICAgKiBJZiB0aGlzIGlzIGEgYml0ZmllbGQsIGdldCB0aGUgYml0c2l6ZS4KLSAgICovCi0gIGlmICh1LnRpLmZCaXRmaWVsZCkKLSAgICB7Ci0gICAgICBpbnQgYml0c2l6ZTsKLQotICAgICAgYml0c2l6ZSA9IEFVWF9HRVRfV0lEVEggKGJpZ2VuZGlhbiwgJmF1eF9wdHJbaW5keCsrXSk7Ci0gICAgICBzcHJpbnRmIChwMSwgIiA6ICVkIiwgYml0c2l6ZSk7Ci0gICAgICBwMSArPSBzdHJsZW4gKGJ1ZmZlcjEpOwotICAgIH0KLQotCi0gIC8qCi0gICAqIERlYWwgd2l0aCBhbnkgcXVhbGlmaWVycy4KLSAgICovCi0gIGlmIChxdWFsaWZpZXJzWzBdLnR5cGUgIT0gdHFOaWwpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNuYXJmIHVwIGFueSBhcnJheSBib3VuZHMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuICBBcnJheXMKLSAgICAgICAqIHN0b3JlIDUgc3VjY2Vzc2l2ZSB3b3JkcyBpbiB0aGUgYXV4LiB0YWJsZToKLSAgICAgICAqCXdvcmQgMAlSTkRYUiB0byB0eXBlIG9mIHRoZSBib3VuZHMgKGllLCBpbnQpCi0gICAgICAgKgl3b3JkIDEJQ3VycmVudCBmaWxlIGRlc2NyaXB0b3IgaW5kZXgKLSAgICAgICAqCXdvcmQgMglsb3cgYm91bmQKLSAgICAgICAqCXdvcmQgMwloaWdoIGJvdW5kIChvciAtMSBpZiBbXSkKLSAgICAgICAqCXdvcmQgNAlzdHJpZGUgc2l6ZSBpbiBiaXRzCi0gICAgICAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0JewotCSAgaWYgKHF1YWxpZmllcnNbaV0udHlwZSA9PSB0cUFycmF5KQotCSAgICB7Ci0JICAgICAgcXVhbGlmaWVyc1tpXS5sb3dfYm91bmQgPQotCQlBVVhfR0VUX0ROTE9XIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrMl0pOwotCSAgICAgIHF1YWxpZmllcnNbaV0uaGlnaF9ib3VuZCA9Ci0JCUFVWF9HRVRfRE5ISUdIIChiaWdlbmRpYW4sICZhdXhfcHRyW2luZHgrM10pOwotCSAgICAgIHF1YWxpZmllcnNbaV0uc3RyaWRlID0KLQkJQVVYX0dFVF9XSURUSCAoYmlnZW5kaWFuLCAmYXV4X3B0cltpbmR4KzRdKTsKLQkgICAgICBpbmR4ICs9IDU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBOb3cgcHJpbnQgb3V0IHRoZSBxdWFsaWZpZXJzLgotICAgICAgICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCXsKLQkgIHN3aXRjaCAocXVhbGlmaWVyc1tpXS50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgdHFOaWw6Ci0JICAgIGNhc2UgdHFNYXg6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cVB0cjoKLQkgICAgICBzdHJjcHkgKHAyLCAicHRyIHRvICIpOwotCSAgICAgIHAyICs9IHNpemVvZiAoInB0ciB0byAiKS0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFWb2w6Ci0JICAgICAgc3RyY3B5IChwMiwgInZvbGF0aWxlICIpOwotCSAgICAgIHAyICs9IHNpemVvZiAoInZvbGF0aWxlICIpLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cUZhcjoKLQkgICAgICBzdHJjcHkgKHAyLCAiZmFyICIpOwotCSAgICAgIHAyICs9IHNpemVvZiAoImZhciAiKS0xOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgdHFQcm9jOgotCSAgICAgIHN0cmNweSAocDIsICJmdW5jLiByZXQuICIpOwotCSAgICAgIHAyICs9IHNpemVvZiAoImZ1bmMuIHJldC4gIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSB0cUFycmF5OgotCSAgICAgIHsKLQkJaW50IGZpcnN0X2FycmF5ID0gaTsKLQkJaW50IGo7Ci0KLQkJLyogUHJpbnQgYXJyYXkgYm91bmRzIHJldmVyc2VkIChpZSwgaW4gdGhlIG9yZGVyIHRoZSBDCi0JCSAgIHByb2dyYW1tZXIgd3JpdGVzIHRoZW0pLiAgQyBpcyBzdWNoIGEgZnVuIGxhbmd1YWdlLi4uLiAqLwotCi0JCXdoaWxlIChpIDwgNSAmJiBxdWFsaWZpZXJzW2krMV0udHlwZSA9PSB0cUFycmF5KQotCQkgIGkrKzsKLQotCQlmb3IgKGogPSBpOyBqID49IGZpcnN0X2FycmF5OyBqLS0pCi0JCSAgewotCQkgICAgc3RyY3B5IChwMiwgImFycmF5IFsiKTsKLQkJICAgIHAyICs9IHNpemVvZiAoImFycmF5IFsiKS0xOwotCQkgICAgaWYgKHF1YWxpZmllcnNbal0ubG93X2JvdW5kICE9IDApCi0JCSAgICAgIHNwcmludGYgKHAyLAotCQkJICAgICAgICIlbGQ6JWxkIHslbGQgYml0c30iLAotCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLmxvd19ib3VuZCwKLQkJCSAgICAgICAobG9uZykgcXVhbGlmaWVyc1tqXS5oaWdoX2JvdW5kLAotCQkJICAgICAgIChsb25nKSBxdWFsaWZpZXJzW2pdLnN0cmlkZSk7Ci0KLQkJICAgIGVsc2UgaWYgKHF1YWxpZmllcnNbal0uaGlnaF9ib3VuZCAhPSAtMSkKLQkJICAgICAgc3ByaW50ZiAocDIsCi0JCQkgICAgICAgIiVsZCB7JWxkIGJpdHN9IiwKLQkJCSAgICAgICAobG9uZykgKHF1YWxpZmllcnNbal0uaGlnaF9ib3VuZCArIDEpLAotCQkJICAgICAgIChsb25nKSAocXVhbGlmaWVyc1tqXS5zdHJpZGUpKTsKLQotCQkgICAgZWxzZQotCQkgICAgICBzcHJpbnRmIChwMiwgIiB7JWxkIGJpdHN9IiwgKGxvbmcpIChxdWFsaWZpZXJzW2pdLnN0cmlkZSkpOwotCi0JCSAgICBwMiArPSBzdHJsZW4gKHAyKTsKLQkJICAgIHN0cmNweSAocDIsICJdIG9mICIpOwotCQkgICAgcDIgKz0gc2l6ZW9mICgiXSBvZiAiKS0xOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHN0cmNweSAocDIsIGJ1ZmZlcjEpOwotICByZXR1cm4gYnVmZmVyMjsKLX0KLQotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IEVDT0ZGIHN5bWJvbCBTWU1CT0wgaW4gUkVULiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1fYmZkX2Vjb2ZmX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZDsJCQkvKiBJZ25vcmVkLiAgKi8KLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGxvY2FsIGxhYmVsLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBuYW1lWzBdID09ICckJzsKLX0KLQotLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gRUNPRkYgc3ltYm9sLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoYWJmZCktPmRlYnVnX3N3YXA7Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKWZpbGVwOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JewotCSAgU1lNUiBlY29mZl9zeW07Ci0JCi0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwgZWNvZmZzeW1ib2wgKHN5bWJvbCktPm5hdGl2ZSwKLQkJCQkgICAgICAmZWNvZmZfc3ltKTsKLQkgIGZwcmludGYgKGZpbGUsICJlY29mZiBsb2NhbCAiKTsKLQkgIGZwcmludGZfdm1hIChmaWxlLCAoYmZkX3ZtYSkgZWNvZmZfc3ltLnZhbHVlKTsKLQkgIGZwcmludGYgKGZpbGUsICIgJXggJXgiLCAodW5zaWduZWQpIGVjb2ZmX3N5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9zeW0uc2MpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBFWFRSIGVjb2ZmX2V4dDsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJICAgICAgJmVjb2ZmX2V4dCk7Ci0JICBmcHJpbnRmIChmaWxlLCAiZWNvZmYgZXh0ZXJuICIpOwotCSAgZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JICBmcHJpbnRmIChmaWxlLCAiICV4ICV4IiwgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zdCwKLQkJICAgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYyk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLSAgICAgIC8qIFByaW50IG91dCB0aGUgc3ltYm9scyBpbiBhIHJlYXNvbmFibGUgd2F5ICovCi0gICAgICB7Ci0JY2hhciB0eXBlOwotCWludCBwb3M7Ci0JRVhUUiBlY29mZl9leHQ7Ci0JY2hhciBqbXB0Ymw7Ci0JY2hhciBjb2JvbF9tYWluOwotCWNoYXIgd2Vha2V4dDsKLQotCWlmIChlY29mZnN5bWJvbCAoc3ltYm9sKS0+bG9jYWwpCi0JICB7Ci0JICAgICgqZGVidWdfc3dhcC0+c3dhcF9zeW1faW4pIChhYmZkLCBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlLAotCQkJCQkmZWNvZmZfZXh0LmFzeW0pOwotCSAgICB0eXBlID0gJ2wnOwotCSAgICBwb3MgPSAoKCgoY2hhciAqKSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+bmF0aXZlCi0JCSAgICAgLSAoY2hhciAqKSBlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5leHRlcm5hbF9zeW0pCi0JCSAgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKQotCQkgICArIGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4KTsKLQkgICAgam1wdGJsID0gJyAnOwotCSAgICBjb2JvbF9tYWluID0gJyAnOwotCSAgICB3ZWFrZXh0ID0gJyAnOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9pbikgKGFiZmQsIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUsCi0JCQkJCSZlY29mZl9leHQpOwotCSAgICB0eXBlID0gJ2UnOwotCSAgICBwb3MgPSAoKChjaGFyICopIGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5uYXRpdmUKLQkJICAgIC0gKGNoYXIgKikgZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uZXh0ZXJuYWxfZXh0KQotCQkgICAvIGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQkgICAgam1wdGJsID0gZWNvZmZfZXh0LmptcHRibCA/ICdqJyA6ICcgJzsKLQkgICAgY29ib2xfbWFpbiA9IGVjb2ZmX2V4dC5jb2JvbF9tYWluID8gJ2MnIDogJyAnOwotCSAgICB3ZWFrZXh0ID0gZWNvZmZfZXh0LndlYWtleHQgPyAndycgOiAnICc7Ci0JICB9Ci0KLQlmcHJpbnRmIChmaWxlLCAiWyUzZF0gJWMgIiwKLQkJIHBvcywgdHlwZSk7Ci0JZnByaW50Zl92bWEgKGZpbGUsIChiZmRfdm1hKSBlY29mZl9leHQuYXN5bS52YWx1ZSk7Ci0JZnByaW50ZiAoZmlsZSwgIiBzdCAleCBzYyAleCBpbmR4ICV4ICVjJWMlYyAlcyIsCi0JCSAodW5zaWduZWQpIGVjb2ZmX2V4dC5hc3ltLnN0LAotCQkgKHVuc2lnbmVkKSBlY29mZl9leHQuYXN5bS5zYywKLQkJICh1bnNpZ25lZCkgZWNvZmZfZXh0LmFzeW0uaW5kZXgsCi0JCSBqbXB0YmwsIGNvYm9sX21haW4sIHdlYWtleHQsCi0JCSBzeW1ib2wtPm5hbWUpOwotCi0JaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5mZHIgIT0gTlVMTAotCSAgICAmJiBlY29mZl9leHQuYXN5bS5pbmRleCAhPSBpbmRleE5pbCkKLQkgIHsKLQkgICAgRkRSICpmZHI7Ci0JICAgIHVuc2lnbmVkIGludCBpbmR4OwotCSAgICBpbnQgYmlnZW5kaWFuOwotCSAgICBiZmRfc2l6ZV90eXBlIHN5bV9iYXNlOwotCSAgICB1bmlvbiBhdXhfZXh0ICphdXhfYmFzZTsKLQotCSAgICBmZHIgPSBlY29mZnN5bWJvbCAoc3ltYm9sKS0+ZmRyOwotCSAgICBpbmR4ID0gZWNvZmZfZXh0LmFzeW0uaW5kZXg7Ci0KLQkgICAgLyogc3ltX2Jhc2UgaXMgdXNlZCB0byBtYXAgdGhlIGZkciByZWxhdGl2ZSBpbmRpY2VzIHdoaWNoCi0JICAgICAgIGFwcGVhciBpbiB0aGUgZmlsZSB0byB0aGUgcG9zaXRpb24gbnVtYmVyIHdoaWNoIHdlIGFyZQotCSAgICAgICB1c2luZy4gICovCi0JICAgIHN5bV9iYXNlID0gZmRyLT5pc3ltQmFzZTsKLQkgICAgaWYgKGVjb2Zmc3ltYm9sIChzeW1ib2wpLT5sb2NhbCkKLQkgICAgICBzeW1fYmFzZSArPQotCQllY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLQotCSAgICAvKiBhdXhfYmFzZSBpcyB0aGUgc3RhcnQgb2YgdGhlIGF1eCBlbnRyaWVzIGZvciB0aGlzIGZpbGU7Ci0JICAgICAgIGFzeW0uaW5kZXggaXMgYW4gb2Zmc2V0IGZyb20gdGhpcy4gICovCi0JICAgIGF1eF9iYXNlID0gKGVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvLmV4dGVybmFsX2F1eAotCQkJKyBmZHItPmlhdXhCYXNlKTsKLQotCSAgICAvKiBUaGUgYXV4IGVudHJpZXMgYXJlIHN0b3JlZCBpbiBob3N0IGJ5dGUgb3JkZXI7IHRoZQotCSAgICAgICBvcmRlciBpcyBpbmRpY2F0ZWQgYnkgYSBiaXQgaW4gdGhlIGZkci4gICovCi0JICAgIGJpZ2VuZGlhbiA9IGZkci0+ZkJpZ2VuZGlhbjsKLQotCSAgICAvKiBUaGlzIHN3aXRjaCBpcyBiYXNpY2FsbHkgZnJvbSBnY2MvbWlwcy10ZHVtcC5jICAqLwotCSAgICBzd2l0Y2ggKGVjb2ZmX2V4dC5hc3ltLnN0KQotCSAgICAgIHsKLQkgICAgICBjYXNlIHN0TmlsOgotCSAgICAgIGNhc2Ugc3RMYWJlbDoKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RmlsZToKLQkgICAgICBjYXNlIHN0QmxvY2s6Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlbGQiKSwKLQkJCSAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQlicmVhazsKLQotCSAgICAgIGNhc2Ugc3RFbmQ6Ci0JCWlmIChlY29mZl9leHQuYXN5bS5zYyA9PSBzY1RleHQKLQkJICAgIHx8IGVjb2ZmX2V4dC5hc3ltLnNjID09IHNjSW5mbykKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIiksCi0JCQkgICAobG9uZykgKGluZHggKyBzeW1fYmFzZSkpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBGaXJzdCBzeW1ib2w6ICVsZCIpLCAKLQkJCSAgICgobG9uZykKLQkJCSAgICAoQVVYX0dFVF9JU1lNIChiaWdlbmRpYW4sCi0JCQkJCSAgICZhdXhfYmFzZVtlY29mZl9leHQuYXN5bS5pbmRleF0pCi0JCQkgICAgICsgc3ltX2Jhc2UpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFByb2M6Ci0JICAgICAgY2FzZSBzdFN0YXRpY1Byb2M6Ci0JCWlmIChFQ09GRl9JU19TVEFCICgmZWNvZmZfZXh0LmFzeW0pKQotCQkgIDsKLQkJZWxzZSBpZiAoZWNvZmZzeW1ib2wgKHN5bWJvbCktPmxvY2FsKQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIpLAotCQkJICAgKChsb25nKQotCQkJICAgIChBVVhfR0VUX0lTWU0gKGJpZ2VuZGlhbiwKLQkJCQkJICAgJmF1eF9iYXNlW2Vjb2ZmX2V4dC5hc3ltLmluZGV4XSkKLQkJCSAgICAgKyBzeW1fYmFzZSkpLAotCQkJICAgZWNvZmZfdHlwZV90b19zdHJpbmcgKGFiZmQsIGZkciwgaW5keCArIDEpKTsKLQkJZWxzZQotCQkgIGZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgTG9jYWwgc3ltYm9sOiAlbGQiKSwKLQkJCSAgICgobG9uZykgaW5keAotCQkJICAgICsgKGxvbmcpIHN5bV9iYXNlCi0JCQkgICAgKyAoZWNvZmZfZGF0YSAoYWJmZCkKLQkJCSAgICAgICAtPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXgpKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSBzdFN0cnVjdDoKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBzdHJ1Y3Q7IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0VW5pb246Ci0JCWZwcmludGYgKGZpbGUsIF8oIlxuICAgICAgdW5pb247IEVuZCsxIHN5bWJvbDogJWxkIiksCi0JCQkgKGxvbmcpIChpbmR4ICsgc3ltX2Jhc2UpKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHN0RW51bToKLQkJZnByaW50ZiAoZmlsZSwgXygiXG4gICAgICBlbnVtOyBFbmQrMSBzeW1ib2w6ICVsZCIpLAotCQkJIChsb25nKSAoaW5keCArIHN5bV9iYXNlKSk7Ci0JCWJyZWFrOwotCi0JICAgICAgZGVmYXVsdDoKLQkJaWYgKCEgRUNPRkZfSVNfU1RBQiAoJmVjb2ZmX2V4dC5hc3ltKSkKLQkJICBmcHJpbnRmIChmaWxlLCBfKCJcbiAgICAgIFR5cGU6ICVzIiksCi0JCQkgICBlY29mZl90eXBlX3RvX3N0cmluZyAoYWJmZCwgZmRyLCBpbmR4KSk7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qIFJlYWQgaW4gdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgYXJlbGVudCAqaW50ZXJuYWxfcmVsb2NzOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2NzX3NpemU7Ci0gIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKLSAgYXJlbGVudCAqcnB0cjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTAotICAgICAgfHwgc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaW50ZXJuYWxfcmVsb2NzID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoc2l6ZW9mIChhcmVsZW50KQotCQkJCQkgICAgKiBzZWN0aW9uLT5yZWxvY19jb3VudCkpOwotICBleHRlcm5hbF9yZWxvY19zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGV4dGVybmFsX3JlbG9jcyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgZXh0ZXJuYWxfcmVsb2NzX3NpemUpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IChhcmVsZW50ICopIE5VTEwKLSAgICAgIHx8IGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGFiZmQpCi0gICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMCwgcnB0ciA9IGludGVybmFsX3JlbG9jczsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyssIHJwdHIrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW50ZXJuOwotCi0gICAgICAoKmJhY2tlbmQtPnN3YXBfcmVsb2NfaW4pIChhYmZkLAotCQkJCSBleHRlcm5hbF9yZWxvY3MgKyBpICogZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwKLQkJCQkgJmludGVybik7Ci0KLSAgICAgIGlmIChpbnRlcm4ucl9leHRlcm4pCi0JewotCSAgLyogcl9zeW1uZHggaXMgYW4gaW5kZXggaW50byB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0JICBCRkRfQVNTRVJUIChpbnRlcm4ucl9zeW1uZHggPj0gMAotCQkgICAgICAmJiAoaW50ZXJuLnJfc3ltbmR4Ci0JCQkgIDwgKGVjb2ZmX2RhdGEgKGFiZmQpCi0JCQkgICAgIC0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCkpKTsKLQkgIHJwdHItPnN5bV9wdHJfcHRyID0gc3ltYm9scyArIGludGVybi5yX3N5bW5keDsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW50ZXJuLnJfc3ltbmR4ID09IFJFTE9DX1NFQ1RJT05fTk9ORQotCSAgICAgICB8fCBpbnRlcm4ucl9zeW1uZHggPT0gUkVMT0NfU0VDVElPTl9BQlMpCi0JewotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgIHJwdHItPmFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIENPTlNUIGNoYXIgKnNlY19uYW1lOwotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgLyogcl9zeW1uZHggaXMgYSBzZWN0aW9uIGtleS4gICovCi0JICBzd2l0Y2ggKGludGVybi5yX3N5bW5keCkKLQkgICAgewotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fVEVYVDogIHNlY19uYW1lID0gIi50ZXh0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUkRBVEE6IHNlY19uYW1lID0gIi5yZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fREFUQTogIHNlY19uYW1lID0gIi5kYXRhIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0RBVEE6IHNlY19uYW1lID0gIi5zZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fU0JTUzogIHNlY19uYW1lID0gIi5zYnNzIjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fQlNTOiAgIHNlY19uYW1lID0gIi5ic3MiOyAgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fSU5JVDogIHNlY19uYW1lID0gIi5pbml0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUODogIHNlY19uYW1lID0gIi5saXQ4IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fTElUNDogIHNlY19uYW1lID0gIi5saXQ0IjsgIGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fWERBVEE6IHNlY19uYW1lID0gIi54ZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fUERBVEE6IHNlY19uYW1lID0gIi5wZGF0YSI7IGJyZWFrOwotCSAgICBjYXNlIFJFTE9DX1NFQ1RJT05fRklOSTogIHNlY19uYW1lID0gIi5maW5pIjsgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9MSVRBOiAgc2VjX25hbWUgPSAiLmxpdGEiOyAgYnJlYWs7Ci0JICAgIGNhc2UgUkVMT0NfU0VDVElPTl9SQ09OU1Q6IHNlY19uYW1lID0gIi5yY29uc3QiOyBicmVhazsKLQkgICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0JICAgIH0KLQotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlY19uYW1lKTsKLQkgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIGFib3J0ICgpOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBzZWMtPnN5bWJvbF9wdHJfcHRyOwotCi0JICBycHRyLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0JfQotCi0gICAgICBycHRyLT5hZGRyZXNzID0gaW50ZXJuLnJfdmFkZHIgLSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWN0aW9uKTsKLQotICAgICAgLyogTGV0IHRoZSBiYWNrZW5kIHNlbGVjdCB0aGUgaG93dG8gZmllbGQgYW5kIGRvIGFueSBvdGhlcgotCSByZXF1aXJlZCBwcm9jZXNzaW5nLiAgKi8KLSAgICAgICgqYmFja2VuZC0+YWRqdXN0X3JlbG9jX2luKSAoYWJmZCwgJmludGVybiwgcnB0cik7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChhYmZkLCBleHRlcm5hbF9yZWxvY3MpOwotCi0gIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCBhIGNhbm9uaWNhbCBsaXN0IG9mIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfZWNvZmZfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKSAKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbjsKLQotICAgICAgLyogVGhpcyBzZWN0aW9uIGhhcyByZWxvY3MgbWFkZSB1cCBieSB1cywgbm90IHRoZSBmaWxlLCBzbyB0YWtlCi0JIHRoZW0gb3V0IG9mIHRoZWlyIGNoYWluIGFuZCBwbGFjZSB0aGVtIGludG8gdGhlIGRhdGEgYXJlYQotCSBwcm92aWRlZC4gICovCi0gICAgICBmb3IgKGNvdW50ID0gMCwgY2hhaW4gPSBzZWN0aW9uLT5jb25zdHJ1Y3Rvcl9jaGFpbjsKLQkgICBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgIGNvdW50KyssIGNoYWluID0gY2hhaW4tPm5leHQpCi0JKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgfQotICBlbHNlCi0gICAgeyAKLSAgICAgIGFyZWxlbnQgKnRibHB0cjsKLQotICAgICAgaWYgKGVjb2ZmX3NsdXJwX3JlbG9jX3RhYmxlIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSA9PSBmYWxzZSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCSpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgIH0KLQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0MCi0vKiBQcm92aWRlZCBhIEJGRCwgYSBzZWN0aW9uIGFuZCBhbiBvZmZzZXQgaW50byB0aGUgc2VjdGlvbiwgY2FsY3VsYXRlCi0gICBhbmQgcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBhbmQgdGhlIGxpbmUgbmVhcmVzdCB0byB0aGUKLSAgIHdhbnRlZCBsb2NhdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgaWdub3JlX3N5bWJvbHMsIG9mZnNldCwKLQkJCSAgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKippZ25vcmVfc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXAKLSAgICA9ICZlY29mZl9iYWNrZW5kIChhYmZkKS0+ZGVidWdfc3dhcDsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvID0gJmVjb2ZmX2RhdGEgKGFiZmQpLT5kZWJ1Z19pbmZvOwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgdGhlIEZEUidzLiAgKi8KLSAgaWYgKCEgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvIChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgZGVidWdfaW5mbykKLSAgICAgIHx8IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPQotCSgoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl9maW5kX2xpbmUpKSk7Ci0gICAgICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbGluZV9pbmZvID0gZWNvZmZfZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvOwotCi0gIHJldHVybiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsIGRlYnVnX2luZm8sCi0JCQkJIGRlYnVnX3N3YXAsIGxpbmVfaW5mbywgZmlsZW5hbWVfcHRyLAotCQkJCSBmdW5jdGlvbm5hbWVfcHRyLCByZXRsaW5lX3B0cik7Ci19Ci0MCi0vKiBDb3B5IHByaXZhdGUgQkZEIGRhdGEuICBUaGlzIGlzIGNhbGxlZCBieSBvYmpjb3B5IGFuZCBzdHJpcC4gIFdlCi0gICB1c2UgaXQgdG8gY29weSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gb25lIEJGRCB0byB0aGUKLSAgIG90aGVyLiAgSXQgd291bGQgYmUgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byByZXByZXNlbnQgdGhlIEVDT0ZGCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHN5bWJvbCB0YWJsZS4gIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIGEKLSAgIGxvdCBvZiB3b3JrLCBhbmQgdGhlcmUgd291bGQgYmUgbGl0dGxlIGdhaW4gKGdhcywgZ2RiLCBhbmQgbGQKLSAgIGFscmVhZHkgYWNjZXNzIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdmlhIHRoZQotICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUsIGFuZCB0aGF0IHN0cnVjdHVyZSB3b3VsZCBoYXZlIHRvIGJlCi0gICByZXRhaW5lZCBpbiBvcmRlciB0byBzdXBwb3J0IEVDT0ZGIGRlYnVnZ2luZyBpbiBNSVBTIEVMRikuCi0KLSAgIFRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBFQ09GRiBleHRlcm5hbCBzeW1ib2xzIGNvbWVzIGZyb20KLSAgIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoaXMgZnVuY3Rpb24gb25seSBoYW5kbGVzIHRoZSBvdGhlciBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmlpbmZvID0gJmVjb2ZmX2RhdGEgKGliZmQpLT5kZWJ1Z19pbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqb2luZm8gPSAmZWNvZmZfZGF0YSAob2JmZCktPmRlYnVnX2luZm87Ci0gIHJlZ2lzdGVyIGludCBpOwotICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7Ci0gIHNpemVfdCBjOwotICBib29sZWFuIGxvY2FsOwotCi0gIC8qIFdlIG9ubHkgd2FudCB0byBjb3B5IGluZm9ybWF0aW9uIG92ZXIgaWYgYm90aCBCRkQncyB1c2UgRUNPRkYKLSAgICAgZm9ybWF0LiAgKi8KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBDb3B5IHRoZSBHUCB2YWx1ZSBhbmQgdGhlIHJlZ2lzdGVyIG1hc2tzLiAgKi8KLSAgZWNvZmZfZGF0YSAob2JmZCktPmdwID0gZWNvZmZfZGF0YSAoaWJmZCktPmdwOwotICBlY29mZl9kYXRhIChvYmZkKS0+Z3BybWFzayA9IGVjb2ZmX2RhdGEgKGliZmQpLT5ncHJtYXNrOwotICBlY29mZl9kYXRhIChvYmZkKS0+ZnBybWFzayA9IGVjb2ZmX2RhdGEgKGliZmQpLT5mcHJtYXNrOwotICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotICAgIGVjb2ZmX2RhdGEgKG9iZmQpLT5jcHJtYXNrW2ldID0gZWNvZmZfZGF0YSAoaWJmZCktPmNwcm1hc2tbaV07Ci0KLSAgLyogQ29weSB0aGUgdmVyc2lvbiBzdGFtcC4gICovCi0gIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIudnN0YW1wID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci52c3RhbXA7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIGRvbid0IGNvcHkgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGMgPSBiZmRfZ2V0X3N5bWNvdW50IChvYmZkKTsKLSAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG9iZmQpOwotICBpZiAoYyA9PSAwIHx8IHN5bV9wdHJfcHRyID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSBpZiB0aGVyZSBhcmUgYW55IGxvY2FsIHN5bWJvbHMuICAqLwotICBsb2NhbCA9IGZhbHNlOwotICBmb3IgKDsgYyA+IDA7IGMtLSwgc3ltX3B0cl9wdHIrKykKLSAgICB7Ci0gICAgICBpZiAoZWNvZmZzeW1ib2wgKCpzeW1fcHRyX3B0ciktPmxvY2FsKQotCXsKLQkgIGxvY2FsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxvY2FsKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBzb21lIGxvY2FsIHN5bWJvbHMuICBXZSBqdXN0IGJyaW5nIG92ZXIgYWxsIHRoZQotCSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBGSVhNRTogVGhpcyBpcyBub3QgcXVpdGUgdGhlIHJpZ2h0Ci0JIHRoaW5nIHRvIGRvLiAgSWYgdGhlIHVzZXIgaGFzIGFza2VkIHVzIHRvIGRpc2NhcmQgYWxsCi0JIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlbiB3ZSBhcmUgcHJvYmFibHkgZ29pbmcgdG8gd2luZCB1cAotCSBrZWVwaW5nIGl0IGJlY2F1c2UgdGhlcmUgd2lsbCBwcm9iYWJseSBiZSBzb21lIGxvY2FsIHN5bWJvbAotCSB3aGljaCBvYmpjb3B5IGRpZCBub3QgZGlzY2FyZC4gIFdlIHNob3VsZCBhY3R1YWxseSBicmVhawotCSBhcGFydCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBvbmx5IGtlZXAgdGhhdCB3aGljaAotCSBhcHBsaWVzIHRvIHRoZSBzeW1ib2xzIHdlIHdhbnQgdG8ga2VlcC4gICovCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlsaW5lTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pbGluZU1heDsKLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuY2JMaW5lID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5jYkxpbmU7Ci0gICAgICBvaW5mby0+bGluZSA9IGlpbmZvLT5saW5lOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlkbk1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaWRuTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX2RuciA9IGlpbmZvLT5leHRlcm5hbF9kbnI7Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaXBkTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pcGRNYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfcGRyID0gaWluZm8tPmV4dGVybmFsX3BkcjsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pc3ltTWF4ID0gaWluZm8tPnN5bWJvbGljX2hlYWRlci5pc3ltTWF4OwotICAgICAgb2luZm8tPmV4dGVybmFsX3N5bSA9IGlpbmZvLT5leHRlcm5hbF9zeW07Ci0KLSAgICAgIG9pbmZvLT5zeW1ib2xpY19oZWFkZXIuaW9wdE1heCA9IGlpbmZvLT5zeW1ib2xpY19oZWFkZXIuaW9wdE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9vcHQgPSBpaW5mby0+ZXh0ZXJuYWxfb3B0OwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmlhdXhNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlhdXhNYXg7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfYXV4ID0gaWluZm8tPmV4dGVybmFsX2F1eDsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlzc01heDsKLSAgICAgIG9pbmZvLT5zcyA9IGlpbmZvLT5zczsKLQotICAgICAgb2luZm8tPnN5bWJvbGljX2hlYWRlci5pZmRNYXggPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmlmZE1heDsKLSAgICAgIG9pbmZvLT5leHRlcm5hbF9mZHIgPSBpaW5mby0+ZXh0ZXJuYWxfZmRyOwotCi0gICAgICBvaW5mby0+c3ltYm9saWNfaGVhZGVyLmNyZmQgPSBpaW5mby0+c3ltYm9saWNfaGVhZGVyLmNyZmQ7Ci0gICAgICBvaW5mby0+ZXh0ZXJuYWxfcmZkID0gaWluZm8tPmV4dGVybmFsX3JmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBhcmUgZGlzY2FyZGluZyBhbGwgdGhlIGxvY2FsIHN5bWJvbCBpbmZvcm1hdGlvbi4gIExvb2sKLQkgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgcmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIEZEUgotCSBvciBhdXggaW5mb3JtYXRpb24uICAqLwotICAgICAgYyA9IGJmZF9nZXRfc3ltY291bnQgKG9iZmQpOwotICAgICAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKG9iZmQpOwotICAgICAgZm9yICg7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCi0JewotCSAgRVhUUiBlc3ltOwotCi0JICAoKihlY29mZl9iYWNrZW5kIChvYmZkKS0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbikpCi0JICAgIChvYmZkLCBlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bmF0aXZlLCAmZXN5bSk7Ci0JICBlc3ltLmlmZCA9IGlmZE5pbDsKLQkgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotCSAgKCooZWNvZmZfYmFja2VuZCAob2JmZCktPmRlYnVnX3N3YXAuc3dhcF9leHRfb3V0KSkKLQkgICAgKG9iZmQsICZlc3ltLCBlY29mZnN5bWJvbCAoKnN5bV9wdHJfcHRyKS0+bmF0aXZlKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUuICBUaGUgc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBpcyBzdG9yZWQgaW4gdGhlCi0gICBiYWNrZW5kIHBvaW50ZXIuICBXZSBhbHdheXMgc2V0IHRoZSBhcmNoaXRlY3R1cmUgYW55aG93LCBzaW5jZSBtYW55Ci0gICBjYWxsZXJzIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotICByZXR1cm4gYXJjaCA9PSBlY29mZl9iYWNrZW5kIChhYmZkKS0+YXJjaDsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi0vKkFSR1NVU0VEKi8KLWludAotX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnQ7Ci0gIGludCBjOwotICBpbnQgcmV0OwotCi0gIGMgPSAwOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICArK2M7Ci0KLSAgcmV0ID0gKGJmZF9jb2ZmX2ZpbGhzeiAoYWJmZCkKLQkgKyBiZmRfY29mZl9hb3V0c3ogKGFiZmQpCi0JICsgYyAqIGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCkpOwotICByZXR1cm4gQkZEX0FMSUdOIChyZXQsIDE2KTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAotCQkJCQkgICAgb2Zmc2V0LCBjb3VudCk7Ci19Ci0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgVk1BLCBidXQgcHV0IFNFQ19BTExPQyBzZWN0aW9ucyBmaXJzdC4gIFRoaXMgaXMKLSAgIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1lY29mZl9zb3J0X2hkcnMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLXsKLSAgY29uc3QgYXNlY3Rpb24gKmhkcjEgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcxOwotICBjb25zdCBhc2VjdGlvbiAqaGRyMiA9ICooY29uc3QgYXNlY3Rpb24gKiopIGFyZzI7Ci0KLSAgaWYgKChoZHIxLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKGhkcjItPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGhkcjItPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCXJldHVybiAxOwotICAgIH0KLSAgaWYgKGhkcjEtPnZtYSA8IGhkcjItPnZtYSkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGhkcjEtPnZtYSA+IGhkcjItPnZtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb24gZm9yIGVhY2ggc2VjdGlvbiwgYW5kIHNldAotICAgcmVsb2NfZmlsZXBvcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgc29mYXIsIGZpbGVfc29mYXI7Ci0gIGFzZWN0aW9uICoqc29ydGVkX2hkcnM7Ci0gIGFzZWN0aW9uICpjdXJyZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZmlsZV9wdHIgb2xkX3NvZmFyOwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0gIGJvb2xlYW4gZmlyc3RfZGF0YSwgZmlyc3Rfbm9uYWxsb2M7Ci0gIGNvbnN0IGJmZF92bWEgcm91bmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQ7Ci0KLSAgc29mYXIgPSBfYmZkX2Vjb2ZmX3NpemVvZl9oZWFkZXJzIChhYmZkLCBmYWxzZSk7Ci0gIGZpbGVfc29mYXIgPSBzb2ZhcjsKLQotICAvKiBTb3J0IHRoZSBzZWN0aW9ucyBieSBWTUEuICAqLwotICBzb3J0ZWRfaGRycyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoYWJmZC0+c2VjdGlvbl9jb3VudAotCQkJCQkgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gIGlmIChzb3J0ZWRfaGRycyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChjdXJyZW50ID0gYWJmZC0+c2VjdGlvbnMsIGkgPSAwOwotICAgICAgIGN1cnJlbnQgIT0gTlVMTDsKLSAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCwgaSsrKQotICAgIHNvcnRlZF9oZHJzW2ldID0gY3VycmVudDsKLSAgQkZEX0FTU0VSVCAoaSA9PSBhYmZkLT5zZWN0aW9uX2NvdW50KTsKLQotICBxc29ydCAoc29ydGVkX2hkcnMsIGFiZmQtPnNlY3Rpb25fY291bnQsIHNpemVvZiAoYXNlY3Rpb24gKiksCi0JIGVjb2ZmX3NvcnRfaGRycyk7Ci0KLSAgLyogU29tZSB2ZXJzaW9ucyBvZiB0aGUgT1NGIGxpbmtlciBwdXQgdGhlIC5yZGF0YSBzZWN0aW9uIGluIHRoZQotICAgICB0ZXh0IHNlZ21lbnQsIGFuZCBzb21lIGRvIG5vdC4gICovCi0gIHJkYXRhX2luX3RleHQgPSBlY29mZl9iYWNrZW5kIChhYmZkKS0+cmRhdGFfaW5fdGV4dDsKLSAgaWYgKHJkYXRhX2luX3RleHQpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBjdXJyZW50ID0gc29ydGVkX2hkcnNbaV07Ci0JICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkRBVEEpID09IDApCi0JICAgIGJyZWFrOwotCSAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9SQ09OU1QpICE9IDApCi0JICAgIHsKLQkgICAgICByZGF0YV9pbl90ZXh0ID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlY29mZl9kYXRhIChhYmZkKS0+cmRhdGFfaW5fdGV4dCA9IHJkYXRhX2luX3RleHQ7Ci0KLSAgZmlyc3RfZGF0YSA9IHRydWU7Ci0gIGZpcnN0X25vbmFsbG9jID0gdHJ1ZTsKLSAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X3Bvd2VyOwotCi0gICAgICBjdXJyZW50ID0gc29ydGVkX2hkcnNbaV07Ci0KLSAgICAgIC8qIEZvciB0aGUgQWxwaGEgRUNPRkYgLnBkYXRhIHNlY3Rpb24gdGhlIGxubm9wdHIgZmllbGQgaXMKLQkgc3VwcG9zZWQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiAucGRhdGEgZW50cmllcyB0aGF0IGFyZQotCSByZWFsbHkgaW4gdGhlIHNlY3Rpb24uICBFYWNoIGVudHJ5IGlzIDggYnl0ZXMuICBXZSBzdG9yZSB0aGlzCi0JIGF3YXkgaW4gbGluZV9maWxlcG9zIGJlZm9yZSBpbmNyZWFzaW5nIHRoZSBzZWN0aW9uIHNpemUuICAqLwotICAgICAgaWYgKHN0cmNtcCAoY3VycmVudC0+bmFtZSwgX1BEQVRBKSA9PSAwKQotCWN1cnJlbnQtPmxpbmVfZmlsZXBvcyA9IGN1cnJlbnQtPl9yYXdfc2l6ZSAvIDg7Ci0KLSAgICAgIGFsaWdubWVudF9wb3dlciA9IGN1cnJlbnQtPmFsaWdubWVudF9wb3dlcjsKLQotICAgICAgLyogT24gVWx0cml4LCB0aGUgZGF0YSBzZWN0aW9ucyBpbiBhbiBleGVjdXRhYmxlIGZpbGUgbXVzdCBiZQotCSBhbGlnbmVkIHRvIGEgcGFnZSBib3VuZGFyeSB3aXRoaW4gdGhlIGZpbGUuICBUaGlzIGRvZXMgbm90Ci0JIGFmZmVjdCB0aGUgc2VjdGlvbiBzaXplLCB0aG91Z2guICBGSVhNRTogRG9lcyB0aGlzIHdvcmsgZm9yCi0JIG90aGVyIHBsYXRmb3Jtcz8gIEl0IHJlcXVpcmVzIHNvbWUgbW9kaWZpY2F0aW9uIGZvciB0aGUKLQkgQWxwaGEsIGJlY2F1c2UgLnJkYXRhIG9uIHRoZSBBbHBoYSBnb2VzIHdpdGggdGhlIHRleHQsIG5vdAotCSB0aGUgZGF0YS4gICovCi0gICAgICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwCi0JICAmJiAhIGZpcnN0X2RhdGEKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAmJiAoISByZGF0YV9pbl90ZXh0Ci0JICAgICAgfHwgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkRBVEEpICE9IDApCi0JICAmJiBzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9QREFUQSkgIT0gMAotCSAgJiYgc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUkNPTlNUKSAhPSAwKQotCXsKLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JICBmaXJzdF9kYXRhID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfTElCKSA9PSAwKQotCXsKLQkgIC8qIE9uIElyaXggNCwgdGhlIGxvY2F0aW9uIG9mIGNvbnRlbnRzIG9mIHRoZSAubGliIHNlY3Rpb24KLQkgICAgIGZyb20gYSBzaGFyZWQgbGlicmFyeSBzZWN0aW9uIGlzIGFsc28gcm91bmRlZCB1cCB0byBhCi0JICAgICBwYWdlIGJvdW5kYXJ5LiAgKi8KLQotCSAgc29mYXIgPSAoc29mYXIgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotCSAgZmlsZV9zb2ZhciA9IChmaWxlX3NvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQl9Ci0gICAgICBlbHNlIGlmIChmaXJzdF9ub25hbGxvYwotCSAgICAgICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDAKLQkgICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQl7Ci0JICAvKiBTa2lwIHVwIHRvIHRoZSBuZXh0IHBhZ2UgZm9yIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24sIHN1Y2gKLSAgICAgICAgICAgICBhcyB0aGUgLmNvbW1lbnQgc2VjdGlvbiBvbiB0aGUgQWxwaGEuICBUaGlzIGxlYXZlcyByb29tCi0gICAgICAgICAgICAgZm9yIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCSAgZmlyc3Rfbm9uYWxsb2MgPSBmYWxzZTsKLQkgIHNvZmFyID0gKHNvZmFyICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLQkgIGZpbGVfc29mYXIgPSAoZmlsZV9zb2ZhciArIHJvdW5kIC0gMSkgJn4gKHJvdW5kIC0gMSk7Ci0JfQotCi0gICAgICAvKiBBbGlnbiB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgdG8gdGhlIHNhbWUgYm91bmRhcnkgb24KLQkgd2hpY2ggdGhleSBhcmUgYWxpZ25lZCBpbiB2aXJ0dWFsIG1lbW9yeS4gICovCi0gICAgICBzb2ZhciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgYWxpZ25tZW50X3Bvd2VyKTsKLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCWZpbGVfc29mYXIgPSBCRkRfQUxJR04gKGZpbGVfc29mYXIsIDEgPDwgYWxpZ25tZW50X3Bvd2VyKTsKLQotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDAKLQkgICYmIChjdXJyZW50LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICBzb2ZhciArPSAoY3VycmVudC0+dm1hIC0gc29mYXIpICUgcm91bmQ7Ci0JICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgICAgZmlsZV9zb2ZhciArPSAoY3VycmVudC0+dm1hIC0gZmlsZV9zb2ZhcikgJSByb3VuZDsKLQl9Ci0KLSAgICAgIGlmICgoY3VycmVudC0+ZmxhZ3MgJiAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEKSkgIT0gMCkKLQljdXJyZW50LT5maWxlcG9zID0gZmlsZV9zb2ZhcjsKLQotICAgICAgc29mYXIgKz0gY3VycmVudC0+X3Jhd19zaXplOwotICAgICAgaWYgKChjdXJyZW50LT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDApCi0JZmlsZV9zb2ZhciArPSBjdXJyZW50LT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHRoaXMgc2VjdGlvbiBpcyBvZiB0aGUgcmlnaHQgc2l6ZSB0b28gKi8KLSAgICAgIG9sZF9zb2ZhciA9IHNvZmFyOwotICAgICAgc29mYXIgPSBCRkRfQUxJR04gKHNvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQlmaWxlX3NvZmFyID0gQkZEX0FMSUdOIChmaWxlX3NvZmFyLCAxIDw8IGFsaWdubWVudF9wb3dlcik7Ci0gICAgICBjdXJyZW50LT5fcmF3X3NpemUgKz0gc29mYXIgLSBvbGRfc29mYXI7Ci0gICAgfQotCi0gIGZyZWUgKHNvcnRlZF9oZHJzKTsKLSAgc29ydGVkX2hkcnMgPSBOVUxMOwotCi0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5yZWxvY19maWxlcG9zID0gZmlsZV9zb2ZhcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVsb2NzIGZvciBhbGwgdGhlIHNlY3Rpb25zIGluIHRoZQotICAgb3V0cHV0IGZpbGUsIGFzIHdlbGwgYXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2xpYyBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUKLWVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplID0KLSAgICBlY29mZl9iYWNrZW5kIChhYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZmlsZV9wdHIgcmVsb2NfYmFzZTsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19zaXplOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgZmlsZV9wdHIgc3ltX2Jhc2U7Ci0KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBpZiAoISBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCWFib3J0ICgpOwotICAgICAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0gICAgfQotICAKLSAgcmVsb2NfYmFzZSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5yZWxvY19maWxlcG9zOwotCi0gIHJlbG9jX3NpemUgPSAwOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudC0+cmVsb2NfY291bnQgPT0gMCkKLQljdXJyZW50LT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NpemVfdHlwZSByZWxzaXplOwotCi0JICBjdXJyZW50LT5yZWxfZmlsZXBvcyA9IHJlbG9jX2Jhc2U7Ci0JICByZWxzaXplID0gY3VycmVudC0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplOwotCSAgcmVsb2Nfc2l6ZSArPSByZWxzaXplOwotCSAgcmVsb2NfYmFzZSArPSByZWxzaXplOwotCX0KLSAgICB9Ci0KLSAgc3ltX2Jhc2UgPSBlY29mZl9kYXRhIChhYmZkKS0+cmVsb2NfZmlsZXBvcyArIHJlbG9jX3NpemU7Ci0KLSAgLyogQXQgbGVhc3Qgb24gVWx0cml4LCB0aGUgc3ltYm9sIHRhYmxlIG9mIGFuIGV4ZWN1dGFibGUgZmlsZSBtdXN0Ci0gICAgIGJlIGFsaWduZWQgdG8gYSBwYWdlIGJvdW5kYXJ5LiAgRklYTUU6IElzIHRoaXMgdHJ1ZSBvbiBvdGhlcgotICAgICBwbGF0Zm9ybXM/ICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRVhFQ19QKSAhPSAwCi0gICAgICAmJiAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHN5bV9iYXNlID0gKChzeW1fYmFzZSArIGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5yb3VuZCAtIDEpCi0JCSZ+IChlY29mZl9iYWNrZW5kIChhYmZkKS0+cm91bmQgLSAxKSk7Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zID0gc3ltX2Jhc2U7Ci0KLSAgcmV0dXJuIHJlbG9jX3NpemU7Ci19Ci0KLS8qIFNldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICAvKiBUaGlzIG11c3QgYmUgZG9uZSBmaXJzdCwgYmVjYXVzZSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgaXMKLSAgICAgZ29pbmcgdG8gc2V0IG91dHB1dF9oYXNfYmVndW4gdG8gdHJ1ZS4gICovCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIGlmICghIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIC5saWIgc2VjdGlvbiBzcGVjaWFsbHkgc28gdGhhdCBJcml4IDQgc2hhcmVkIGxpYnJhcmllcwotICAgICB3b3JrIG91dC4gIFNlZSBjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzIGluIGNvZmZjb2RlLmguICAqLwotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBfTElCKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpyZWMsICpyZWNlbmQ7Ci0KLSAgICAgIHJlYyA9IChiZmRfYnl0ZSAqKSBsb2NhdGlvbjsKLSAgICAgIHJlY2VuZCA9IHJlYyArIGNvdW50OwotICAgICAgd2hpbGUgKHJlYyA8IHJlY2VuZCkKLQl7Ci0JICArK3NlY3Rpb24tPmxtYTsKLQkgIHJlYyArPSBiZmRfZ2V0XzMyIChhYmZkLCByZWMpICogNDsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKHJlYyA9PSByZWNlbmQpOwotICAgIH0KLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBHUCB2YWx1ZSBmb3IgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSBob29rIHVzZWQgYnkKLSAgIG5sbWNvbnYuICAqLwotCi1iZmRfdm1hCi1iZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIHJldHVybiBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci19Ci0KLS8qIFNldCB0aGUgR1AgdmFsdWUgZm9yIGFuIEVDT0ZGIGZpbGUuICBUaGlzIGlzIGEgaG9vayB1c2VkIGJ5IHRoZQotICAgYXNzZW1ibGVyLiAgKi8KLQotYm9vbGVhbgotYmZkX2Vjb2ZmX3NldF9ncF92YWx1ZSAoYWJmZCwgZ3BfdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSBncF92YWx1ZTsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgIT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgIT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlY29mZl9kYXRhIChhYmZkKS0+Z3AgPSBncF92YWx1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSByZWdpc3RlciBtYXNrcyBmb3IgYW4gRUNPRkYgZmlsZS4gIFRoaXMgaXMgYSBob29rIHVzZWQgYnkKLSAgIHRoZSBhc3NlbWJsZXIuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfc2V0X3JlZ21hc2tzIChhYmZkLCBncHJtYXNrLCBmcHJtYXNrLCBjcHJtYXNrKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZ3BybWFzazsKLSAgICAgdW5zaWduZWQgbG9uZyBmcHJtYXNrOwotICAgICB1bnNpZ25lZCBsb25nICpjcHJtYXNrOwotewotICBlY29mZl9kYXRhX3R5cGUgKnRkYXRhOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgdGRhdGEgPSBlY29mZl9kYXRhIChhYmZkKTsKLSAgdGRhdGEtPmdwcm1hc2sgPSBncHJtYXNrOwotICB0ZGF0YS0+ZnBybWFzayA9IGZwcm1hc2s7Ci0gIGlmIChjcHJtYXNrICE9ICh1bnNpZ25lZCBsb25nICopIE5VTEwpCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JdGRhdGEtPmNwcm1hc2tbaV0gPSBjcHJtYXNrW2ldOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IEVDT0ZGIEVYVFIgaW5mb3JtYXRpb24gZm9yIGFuIGV4dGVybmFsIHN5bWJvbC4gIFRoaXMgZnVuY3Rpb24KLSAgIGlzIHBhc3NlZCB0byBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2dldF9leHRyIChzeW0sIGVzeW0pCi0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgRVhUUiAqZXN5bTsKLXsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmVjb2ZmX3N5bV9wdHI7Ci0gIGJmZCAqaW5wdXRfYmZkOwotCi0gIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyIChzeW0pICE9IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgZWNvZmZzeW1ib2wgKHN5bSktPm5hdGl2ZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIERvbid0IGluY2x1ZGUgZGVidWdnaW5nLCBsb2NhbCwgb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKLQkgIHx8IChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSAhPSAwCi0JICB8fCAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGVzeW0tPmptcHRibCA9IDA7Ci0gICAgICBlc3ltLT5jb2JvbF9tYWluID0gMDsKLSAgICAgIGVzeW0tPndlYWtleHQgPSAoc3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwOwotICAgICAgZXN5bS0+cmVzZXJ2ZWQgPSAwOwotICAgICAgZXN5bS0+aWZkID0gaWZkTmlsOwotICAgICAgLyogRklYTUU6IHdlIGNhbiBkbyBiZXR0ZXIgdGhhbiB0aGlzIGZvciBzdCBhbmQgc2MuICAqLwotICAgICAgZXN5bS0+YXN5bS5zdCA9IHN0R2xvYmFsOwotICAgICAgZXN5bS0+YXN5bS5zYyA9IHNjQWJzOwotICAgICAgZXN5bS0+YXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBlc3ltLT5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZWNvZmZfc3ltX3B0ciA9IGVjb2Zmc3ltYm9sIChzeW0pOwotCi0gIGlmIChlY29mZl9zeW1fcHRyLT5sb2NhbCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5wdXRfYmZkID0gYmZkX2FzeW1ib2xfYmZkIChzeW0pOwotICAoKihlY29mZl9iYWNrZW5kIChpbnB1dF9iZmQpLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luKSkKLSAgICAoaW5wdXRfYmZkLCBlY29mZl9zeW1fcHRyLT5uYXRpdmUsIGVzeW0pOwotCi0gIC8qIElmIHRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYnkgdGhlIGxpbmtlciwgdGhlbiBlc3ltIHdpbGwgYmUKLSAgICAgdW5kZWZpbmVkIGJ1dCBzeW0gd2lsbCBub3QgYmUuICBHZXQgYSBiZXR0ZXIgY2xhc3MgZm9yIHN1Y2ggYQotICAgICBzeW1ib2wuICAqLwotICBpZiAoKGVzeW0tPmFzeW0uc2MgPT0gc2NVbmRlZmluZWQKLSAgICAgICB8fCBlc3ltLT5hc3ltLnNjID09IHNjU1VuZGVmaW5lZCkKLSAgICAgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotICAgIGVzeW0tPmFzeW0uc2MgPSBzY0FiczsKLQotICAvKiBBZGp1c3QgdGhlIEZEUiBpbmRleCBmb3IgdGhlIHN5bWJvbCBieSB0aGF0IHVzZWQgZm9yIHRoZSBpbnB1dAotICAgICBCRkQuICAqLwotICBpZiAoZXN5bS0+aWZkICE9IC0xKQotICAgIHsKLSAgICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKLQotICAgICAgaW5wdXRfZGVidWcgPSAmZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mbzsKLSAgICAgIEJGRF9BU1NFUlQgKGVzeW0tPmlmZCA8IGlucHV0X2RlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+aWZkbWFwICE9IChSRkRUICopIE5VTEwpCi0JZXN5bS0+aWZkID0gaW5wdXRfZGVidWctPmlmZG1hcFtlc3ltLT5pZmRdOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5kZXguICBUaGlzIHJvdXRpbmUgaXMgcGFzc2VkIHRvCi0gICBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3NldF9pbmRleCAoc3ltLCBpbmR4KQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLXsKLSAgZWNvZmZfc2V0X3N5bV9pbmRleCAoc3ltLCBpbmR4KTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEVDT0ZGIGZpbGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICBjb25zdCBiZmRfdm1hIHJvdW5kID0gYmFja2VuZC0+cm91bmQ7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZmlsaHN6ID0gYmZkX2NvZmZfZmlsaHN6IChhYmZkKTsKLSAgY29uc3QgYmZkX3NpemVfdHlwZSBhb3V0c3ogPSBiZmRfY29mZl9hb3V0c3ogKGFiZmQpOwotICBjb25zdCBiZmRfc2l6ZV90eXBlIHNjbmhzeiA9IGJmZF9jb2ZmX3NjbmhzeiAoYWJmZCk7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfaGRyX3NpemUKLSAgICA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfaGRyX3NpemU7Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGJhY2tlbmQtPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHZvaWQgKCogY29uc3QgYWRqdXN0X3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgIGNvbnN0IGFyZWxlbnQgKiwKLQkJCQkJICAgc3RydWN0IGludGVybmFsX3JlbG9jICopKQotICAgID0gYmFja2VuZC0+YWRqdXN0X3JlbG9jX291dDsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosCi0JCQkJCSBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkJIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX3JlbG9jX291dDsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1ZyA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mbzsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBhc2VjdGlvbiAqY3VycmVudDsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwotICBiZmRfdm1hIHRleHRfc3RhcnQ7Ci0gIGJvb2xlYW4gc2V0X3RleHRfc3RhcnQ7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YV9zaXplOwotICBiZmRfdm1hIGRhdGFfc3RhcnQ7Ci0gIGJvb2xlYW4gc2V0X2RhdGFfc3RhcnQ7Ci0gIGJmZF9zaXplX3R5cGUgYnNzX3NpemU7Ci0gIFBUUiBidWZmID0gTlVMTDsKLSAgUFRSIHJlbG9jX2J1ZmYgPSBOVUxMOwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBpbnRlcm5hbF9mOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciBpbnRlcm5hbF9hOwotICBpbnQgaTsKLQotICAvKiBEZXRlcm1pbmUgd2hlcmUgdGhlIHNlY3Rpb25zIGFuZCByZWxvY3Mgd2lsbCBnbyBpbiB0aGUgb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICByZWxvY19zaXplID0gZWNvZmZfY29tcHV0ZV9yZWxvY19maWxlX3Bvc2l0aW9ucyAoYWJmZCk7Ci0KLSAgY291bnQgPSAxOwotICBmb3IgKGN1cnJlbnQgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBjdXJyZW50ICE9IChhc2VjdGlvbiAqKU5VTEw7IAotICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0KSAKLSAgICB7Ci0gICAgICBjdXJyZW50LT50YXJnZXRfaW5kZXggPSBjb3VudDsKLSAgICAgICsrY291bnQ7Ci0gICAgfQotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotICAgIHRleHRfc2l6ZSA9IF9iZmRfZWNvZmZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGZhbHNlKTsKLSAgZWxzZQotICAgIHRleHRfc2l6ZSA9IDA7Ci0gIHRleHRfc3RhcnQgPSAwOwotICBzZXRfdGV4dF9zdGFydCA9IGZhbHNlOwotICBkYXRhX3NpemUgPSAwOwotICBkYXRhX3N0YXJ0ID0gMDsKLSAgc2V0X2RhdGFfc3RhcnQgPSBmYWxzZTsKLSAgYnNzX3NpemUgPSAwOwotCi0gIC8qIFdyaXRlIHNlY3Rpb24gaGVhZGVycyB0byB0aGUgZmlsZS4gICovCi0KLSAgLyogQWxsb2NhdGUgYnVmZiBiaWcgZW5vdWdoIHRvIGhvbGQgYSBzZWN0aW9uIGhlYWRlciwKLSAgICAgZmlsZSBoZWFkZXIsIG9yIGEub3V0IGhlYWRlci4gICovCi0gIHsKLSAgICBiZmRfc2l6ZV90eXBlIHNpejsKLSAgICBzaXogPSBzY25oc3o7Ci0gICAgaWYgKHNpeiA8IGZpbGhzeikKLSAgICAgIHNpeiA9IGZpbGhzejsKLSAgICBpZiAoc2l6IDwgYW91dHN6KQotICAgICAgc2l6ID0gYW91dHN6OwotICAgIGJ1ZmYgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzaXopOwotICAgIGlmIChidWZmID09IE5VTEwpCi0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgfQotCi0gIGludGVybmFsX2YuZl9uc2NucyA9IDA7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoZmlsaHN6ICsgYW91dHN6KSwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3NjbmhkciBzZWN0aW9uOwotICAgICAgYmZkX3ZtYSB2bWE7Ci0KLSAgICAgICsraW50ZXJuYWxfZi5mX25zY25zOwotCi0gICAgICBzdHJuY3B5IChzZWN0aW9uLnNfbmFtZSwgY3VycmVudC0+bmFtZSwgc2l6ZW9mIHNlY3Rpb24uc19uYW1lKTsKLQotICAgICAgLyogVGhpcyBzZWVtcyB0byBiZSBjb3JyZWN0IGZvciBJcml4IDQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0gICAgICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBjdXJyZW50KTsKLSAgICAgIGlmIChzdHJjbXAgKGN1cnJlbnQtPm5hbWUsIF9MSUIpID09IDApCi0Jc2VjdGlvbi5zX3ZhZGRyID0gMDsKLSAgICAgIGVsc2UKLQlzZWN0aW9uLnNfdmFkZHIgPSB2bWE7Ci0KLSAgICAgIHNlY3Rpb24uc19wYWRkciA9IGN1cnJlbnQtPmxtYTsKLSAgICAgIHNlY3Rpb24uc19zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQotICAgICAgLyogSWYgdGhpcyBzZWN0aW9uIGlzIHVubG9hZGFibGUgdGhlbiB0aGUgc2NucHRyIHdpbGwgYmUgMC4gICovCi0gICAgICBpZiAoKGN1cnJlbnQtPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykpID09IDApCi0Jc2VjdGlvbi5zX3NjbnB0ciA9IDA7Ci0gICAgICBlbHNlCi0Jc2VjdGlvbi5zX3NjbnB0ciA9IGN1cnJlbnQtPmZpbGVwb3M7Ci0gICAgICBzZWN0aW9uLnNfcmVscHRyID0gY3VycmVudC0+cmVsX2ZpbGVwb3M7Ci0KLSAgICAgIC8qIEZJWE1FOiB0aGUgbG5ub3B0ciBvZiB0aGUgLnNic3Mgb3IgLnNkYXRhIHNlY3Rpb24gb2YgYW4KLQkgb2JqZWN0IGZpbGUgcHJvZHVjZWQgYnkgdGhlIGFzc2VtYmxlciBpcyBzdXBwb3NlZCB0byBwb2ludCB0bwotCSBpbmZvcm1hdGlvbiBhYm91dCBob3cgbXVjaCByb29tIGlzIHJlcXVpcmVkIGJ5IG9iamVjdHMgb2YKLQkgdmFyaW91cyBkaWZmZXJlbnQgc2l6ZXMuICBJIHRoaW5rIHRoaXMgb25seSBtYXR0ZXJzIGlmIHdlCi0JIHdhbnQgdGhlIGxpbmtlciB0byBjb21wdXRlIHRoZSBiZXN0IHNpemUgdG8gdXNlLCBvcgotCSBzb21ldGhpbmcuICBJIGRvbid0IGtub3cgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbmZvcm1hdGlvbiBpcwotCSBub3QgcHJlc2VudC4gICovCi0gICAgICBpZiAoc3RyY21wIChjdXJyZW50LT5uYW1lLCBfUERBVEEpICE9IDApCi0Jc2VjdGlvbi5zX2xubm9wdHIgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBBbHBoYSBFQ09GRiAucGRhdGEgc2VjdGlvbiB1c2VzIHRoZSBsbm5vcHRyIGZpZWxkIHRvCi0JICAgICBob2xkIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2VjdGlvbiAoZWFjaCBlbnRyeSBpcwotCSAgICAgOCBieXRlcykuICBXZSBzdG9yZWQgdGhpcyBpbiB0aGUgbGluZV9maWxlcG9zIGZpZWxkIGluCi0JICAgICBlY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICAqLwotCSAgc2VjdGlvbi5zX2xubm9wdHIgPSBjdXJyZW50LT5saW5lX2ZpbGVwb3M7Ci0JfQotCi0gICAgICBzZWN0aW9uLnNfbnJlbG9jID0gY3VycmVudC0+cmVsb2NfY291bnQ7Ci0gICAgICBzZWN0aW9uLnNfbmxubm8gPSAwOwotICAgICAgc2VjdGlvbi5zX2ZsYWdzID0gZWNvZmZfc2VjX3RvX3N0eXBfZmxhZ3MgKGN1cnJlbnQtPm5hbWUsCi0JCQkJCQkgY3VycmVudC0+ZmxhZ3MpOwotCi0gICAgICBpZiAoYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLCAoUFRSKSAmc2VjdGlvbiwgYnVmZikgPT0gMAotCSAgfHwgYmZkX3dyaXRlIChidWZmLCAxLCBzY25oc3osIGFiZmQpICE9IHNjbmhzeikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1RFWFQpICE9IDAKLQkgIHx8ICgoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9SREFUQSkgIT0gMAotCSAgICAgICYmIGVjb2ZmX2RhdGEgKGFiZmQpLT5yZGF0YV9pbl90ZXh0KQotCSAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfUERBVEEKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RZTkFNSUMpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJQkxJU1QpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1JFTERZTikgIT0gMAotCSAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfQ09ORkxJQwotCSAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfRFlOU1RSKSAhPSAwCi0JICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9EWU5TWU0pICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0hBU0gpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0lOSVQpICE9IDAKLQkgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0ZJTkkpICE9IDAKLQkgIHx8IHNlY3Rpb24uc19mbGFncyA9PSBTVFlQX1JDT05TVCkKLQl7Ci0JICB0ZXh0X3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLQkgIGlmICghIHNldF90ZXh0X3N0YXJ0IHx8IHRleHRfc3RhcnQgPiB2bWEpCi0JICAgIHsKLQkgICAgICB0ZXh0X3N0YXJ0ID0gdm1hOwotCSAgICAgIHNldF90ZXh0X3N0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1JEQVRBKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0RBVEEpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfTElUQSkgIT0gMAotCSAgICAgICB8fCAoc2VjdGlvbi5zX2ZsYWdzICYgU1RZUF9MSVQ4KSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0xJVDQpICE9IDAKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfU0RBVEEpICE9IDAKLQkgICAgICAgfHwgc2VjdGlvbi5zX2ZsYWdzID09IFNUWVBfWERBVEEKLQkgICAgICAgfHwgKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfR09UKSAhPSAwKQotCXsKLQkgIGRhdGFfc2l6ZSArPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGN1cnJlbnQpOwotCSAgaWYgKCEgc2V0X2RhdGFfc3RhcnQgfHwgZGF0YV9zdGFydCA+IHZtYSkKLQkgICAgewotCSAgICAgIGRhdGFfc3RhcnQgPSB2bWE7Ci0JICAgICAgc2V0X2RhdGFfc3RhcnQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKHNlY3Rpb24uc19mbGFncyAmIFNUWVBfQlNTKSAhPSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX1NCU1MpICE9IDApCi0JYnNzX3NpemUgKz0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChjdXJyZW50KTsKLSAgICAgIGVsc2UgaWYgKHNlY3Rpb24uc19mbGFncyA9PSAwCi0JICAgICAgIHx8IChzZWN0aW9uLnNfZmxhZ3MgJiBTVFlQX0VDT0ZGX0xJQikgIT0gMAotCSAgICAgICB8fCBzZWN0aW9uLnNfZmxhZ3MgPT0gU1RZUF9DT01NRU5UKQotCS8qIERvIG5vdGhpbmcgKi8gOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0JCi0KLSAgLyogU2V0IHVwIHRoZSBmaWxlIGhlYWRlci4gICovCi0KLSAgaW50ZXJuYWxfZi5mX21hZ2ljID0gZWNvZmZfZ2V0X21hZ2ljIChhYmZkKTsKLQotICAvKiBXZSB3aWxsIE5PVCBwdXQgYSBmdWNraW5nIHRpbWVzdGFtcCBpbiB0aGUgaGVhZGVyIGhlcmUuIEV2ZXJ5Ci0gICAgIHRpbWUgeW91IHB1dCBpdCBiYWNrLCBJIHdpbGwgY29tZSBpbiBhbmQgdGFrZSBpdCBvdXQgYWdhaW4uICBJJ20KLSAgICAgc29ycnkuICBUaGlzIGZpZWxkIGRvZXMgbm90IGJlbG9uZyBoZXJlLiAgV2UgZmlsbCBpdCB3aXRoIGEgMCBzbwotICAgICBpdCBjb21wYXJlcyB0aGUgc2FtZSBidXQgaXMgbm90IGEgcmVhc29uYWJsZSB0aW1lLiAtLQotICAgICBnbnVAY3lnbnVzLmNvbS4gICovCi0gIGludGVybmFsX2YuZl90aW1kYXQgPSAwOwotCi0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSBFQ09GRiBmX25zeW1zIGZpZWxkIGlzIG5vdCBhY3R1YWxseSB0aGUgbnVtYmVyIG9mCi0JIHN5bWJvbHMsIGl0J3MgdGhlIHNpemUgb2Ygc3ltYm9saWMgaW5mb3JtYXRpb24gaGVhZGVyLiAgKi8KLSAgICAgIGludGVybmFsX2YuZl9uc3ltcyA9IGV4dGVybmFsX2hkcl9zaXplOwotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvczsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlcm5hbF9mLmZfbnN5bXMgPSAwOwotICAgICAgaW50ZXJuYWxfZi5mX3N5bXB0ciA9IDA7Ci0gICAgfQotCi0gIGludGVybmFsX2YuZl9vcHRoZHIgPSBhb3V0c3o7Ci0KLSAgaW50ZXJuYWxfZi5mX2ZsYWdzID0gRl9MTk5POwotICBpZiAocmVsb2Nfc2l6ZSA9PSAwKQotICAgIGludGVybmFsX2YuZl9mbGFncyB8PSBGX1JFTEZMRzsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDApCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfTFNZTVM7Ci0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICBpbnRlcm5hbF9mLmZfZmxhZ3MgfD0gRl9FWEVDOwotCi0gIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMldSOwotICBlbHNlCi0gICAgaW50ZXJuYWxfZi5mX2ZsYWdzIHw9IEZfQVIzMlc7Ci0KLSAgLyogU2V0IHVwIHRoZSBgYG9wdGlvbmFsJycgaGVhZGVyLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEVDT0ZGX0FPVVRfWk1BR0lDOwotICBlbHNlCi0gICAgaW50ZXJuYWxfYS5tYWdpYyA9IEVDT0ZGX0FPVVRfT01BR0lDOwotCi0gIC8qIEZJWE1FOiBJcyB0aGlzIHJlYWxseSBjb3JyZWN0PyAgKi8KLSAgaW50ZXJuYWxfYS52c3RhbXAgPSBzeW1oZHItPnZzdGFtcDsKLQotICAvKiBBdCBsZWFzdCBvbiBVbHRyaXgsIHRoZXNlIGhhdmUgdG8gYmUgcm91bmRlZCB0byBwYWdlIGJvdW5kYXJpZXMuCi0gICAgIEZJWE1FOiBJcyB0aGlzIHRydWUgb24gb3RoZXIgcGxhdGZvcm1zPyAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpICE9IDApCi0gICAgewotICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9ICh0ZXh0X3NpemUgKyByb3VuZCAtIDEpICZ+IChyb3VuZCAtIDEpOwotICAgICAgaW50ZXJuYWxfYS50ZXh0X3N0YXJ0ID0gdGV4dF9zdGFydCAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EuZHNpemUgPSAoZGF0YV9zaXplICsgcm91bmQgLSAxKSAmfiAocm91bmQgLSAxKTsKLSAgICAgIGludGVybmFsX2EuZGF0YV9zdGFydCA9IGRhdGFfc3RhcnQgJn4gKHJvdW5kIC0gMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuYWxfYS50c2l6ZSA9IHRleHRfc2l6ZTsKLSAgICAgIGludGVybmFsX2EudGV4dF9zdGFydCA9IHRleHRfc3RhcnQ7Ci0gICAgICBpbnRlcm5hbF9hLmRzaXplID0gZGF0YV9zaXplOwotICAgICAgaW50ZXJuYWxfYS5kYXRhX3N0YXJ0ID0gZGF0YV9zdGFydDsKLSAgICB9Ci0KLSAgLyogT24gVWx0cml4LCB0aGUgaW5pdGlhbCBwb3J0aW9ucyBvZiB0aGUgLnNic3MgYW5kIC5ic3Mgc2VnbWVudHMKLSAgICAgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgc2VjdGlvbi4gIFRoZSBic2l6ZSBmaWVsZCBpbiB0aGUKLSAgICAgb3B0aW9uYWwgaGVhZGVyIHJlY29yZHMgaG93IG1hbnkgYnNzIGJ5dGVzIGFyZSByZXF1aXJlZCBiZXlvbmQKLSAgICAgdGhvc2UgaW4gdGhlIGRhdGEgc2VjdGlvbi4gIFRoZSB2YWx1ZSBpcyBub3Qgcm91bmRlZCB0byBhIHBhZ2UKLSAgICAgYm91bmRhcnkuICAqLwotICBpZiAoYnNzX3NpemUgPCBpbnRlcm5hbF9hLmRzaXplIC0gZGF0YV9zaXplKQotICAgIGJzc19zaXplID0gMDsKLSAgZWxzZQotICAgIGJzc19zaXplIC09IGludGVybmFsX2EuZHNpemUgLSBkYXRhX3NpemU7Ci0gIGludGVybmFsX2EuYnNpemUgPSBic3Nfc2l6ZTsKLSAgaW50ZXJuYWxfYS5ic3Nfc3RhcnQgPSBpbnRlcm5hbF9hLmRhdGFfc3RhcnQgKyBpbnRlcm5hbF9hLmRzaXplOwotCi0gIGludGVybmFsX2EuZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotCi0gIGludGVybmFsX2EuZ3BfdmFsdWUgPSBlY29mZl9kYXRhIChhYmZkKS0+Z3A7Ci0KLSAgaW50ZXJuYWxfYS5ncHJtYXNrID0gZWNvZmZfZGF0YSAoYWJmZCktPmdwcm1hc2s7Ci0gIGludGVybmFsX2EuZnBybWFzayA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5mcHJtYXNrOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIGludGVybmFsX2EuY3BybWFza1tpXSA9IGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrW2ldOwotCi0gIC8qIExldCB0aGUgYmFja2VuZCBhZGp1c3QgdGhlIGhlYWRlcnMgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGJhY2tlbmQtPmFkanVzdF9oZWFkZXJzKQotICAgIHsKLSAgICAgIGlmICghICgqYmFja2VuZC0+YWRqdXN0X2hlYWRlcnMpIChhYmZkLCAmaW50ZXJuYWxfZiwgJmludGVybmFsX2EpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGZpbGUgaGVhZGVyIGFuZCB0aGUgb3B0aW9uYWwgaGVhZGVyLiAgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgKFBUUikgJmludGVybmFsX2YsIGJ1ZmYpOwotICBpZiAoYmZkX3dyaXRlIChidWZmLCAxLCBmaWxoc3osIGFiZmQpICE9IGZpbGhzeikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBiZmRfY29mZl9zd2FwX2FvdXRoZHJfb3V0IChhYmZkLCAoUFRSKSAmaW50ZXJuYWxfYSwgYnVmZik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIGFvdXRzeiwgYWJmZCkgIT0gYW91dHN6KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEJ1aWxkIHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgZG9uZSBiZWZvcmUKLSAgICAgd3JpdGluZyBvdXQgdGhlIHJlbG9jcyBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgV2UKLSAgICAgZG9uJ3QgZG8gdGhpcyBpZiB0aGlzIEJGRCB3YXMgY3JlYXRlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIsCi0gICAgIHNpbmNlIGl0IHdpbGwgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgdGhlIHN5bWJvbHMgYW5kIHJlbG9jcy4gICovCi0gIGlmICghIGVjb2ZmX2RhdGEgKGFiZmQpLT5saW5rZXIpCi0gICAgewotICAgICAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLSAgICAgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9leHQgPSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+c3NleHQgPSBkZWJ1Zy0+c3NleHRfZW5kID0gTlVMTDsKLSAgICAgIGlmIChiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsCi0JCQkJICAgICAoKChhYmZkLT5mbGFncyAmIEVYRUNfUCkgPT0gMCkKLQkJCQkgICAgICA/IHRydWUgOiBmYWxzZSksCi0JCQkJICAgICBlY29mZl9nZXRfZXh0ciwgZWNvZmZfc2V0X2luZGV4KQotCSAgPT0gZmFsc2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgcmVsb2NzLiAgKi8KLSAgICAgIGZvciAoY3VycmVudCA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIGN1cnJlbnQgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQpCi0JewotCSAgYXJlbGVudCAqKnJlbG9jX3B0cl9wdHI7Ci0JICBhcmVsZW50ICoqcmVsb2NfZW5kOwotCSAgY2hhciAqb3V0X3B0cjsKLQotCSAgaWYgKGN1cnJlbnQtPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICByZWxvY19idWZmID0KLQkgICAgYmZkX2FsbG9jIChhYmZkLCBjdXJyZW50LT5yZWxvY19jb3VudCAqIGV4dGVybmFsX3JlbG9jX3NpemUpOwotCSAgaWYgKHJlbG9jX2J1ZmYgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIHJlbG9jX3B0cl9wdHIgPSBjdXJyZW50LT5vcmVsb2NhdGlvbjsKLQkgIHJlbG9jX2VuZCA9IHJlbG9jX3B0cl9wdHIgKyBjdXJyZW50LT5yZWxvY19jb3VudDsKLQkgIG91dF9wdHIgPSAoY2hhciAqKSByZWxvY19idWZmOwotCSAgZm9yICg7Ci0JICAgICAgIHJlbG9jX3B0cl9wdHIgPCByZWxvY19lbmQ7Ci0JICAgICAgIHJlbG9jX3B0cl9wdHIrKywgb3V0X3B0ciArPSBleHRlcm5hbF9yZWxvY19zaXplKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqcmVsb2M7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbjsKLQkgIAotCSAgICAgIG1lbXNldCAoKFBUUikgJmluLCAwLCBzaXplb2YgaW4pOwotCi0JICAgICAgcmVsb2MgPSAqcmVsb2NfcHRyX3B0cjsKLQkgICAgICBzeW0gPSAqcmVsb2MtPnN5bV9wdHJfcHRyOwotCi0JICAgICAgaW4ucl92YWRkciA9IChyZWxvYy0+YWRkcmVzcwotCQkJICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY3VycmVudCkpOwotCSAgICAgIGluLnJfdHlwZSA9IHJlbG9jLT5ob3d0by0+dHlwZTsKLQotCSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQkJewotCQkgIGluLnJfc3ltbmR4ID0gZWNvZmZfZ2V0X3N5bV9pbmRleCAoKnJlbG9jLT5zeW1fcHRyX3B0cik7Ci0JCSAgaW4ucl9leHRlcm4gPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgQ09OU1QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKTsKLQkJICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1RFWFQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fREFUQTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9TQlNTOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0JTUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaW5pdCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fSU5JVDsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUODsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUNDsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIueGRhdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1hEQVRBOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wZGF0YSIpID09IDApCi0JCSAgICBpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fUERBVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0ZJTkk7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdGEiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0xJVEE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiKkFCUyoiKSA9PSAwKQotCQkgICAgaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX0FCUzsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmNvbnN0IikgPT0gMCkKLQkJICAgIGluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9SQ09OU1Q7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgaW4ucl9leHRlcm4gPSAwOwotCQl9Ci0KLQkgICAgICAoKmFkanVzdF9yZWxvY19vdXQpIChhYmZkLCByZWxvYywgJmluKTsKLQotCSAgICAgICgqc3dhcF9yZWxvY19vdXQpIChhYmZkLCAmaW4sIChQVFIpIG91dF9wdHIpOwotCSAgICB9Ci0KLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfd3JpdGUgKHJlbG9jX2J1ZmYsCi0JCQkgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwgY3VycmVudC0+cmVsb2NfY291bnQsIGFiZmQpCi0JICAgICAgIT0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSAqIGN1cnJlbnQtPnJlbG9jX2NvdW50KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLQkgIHJlbG9jX2J1ZmYgPSBOVUxMOwotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLQl7Ci0JICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0JICBpZiAoYmZkX2Vjb2ZmX3dyaXRlX2RlYnVnIChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsCi0JCQkJICAgICBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MpCi0JICAgICAgPT0gZmFsc2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIC5ic3Mgc2VjdGlvbiBvZiBhIGRlbWFuZCBwYWdlZCBleGVjdXRhYmxlIG11c3QgcmVjZWl2ZSBhbgotICAgICBlbnRpcmUgcGFnZS4gIElmIHRoZXJlIGFyZSBzeW1ib2xzLCB0aGUgc3ltYm9scyB3aWxsIHN0YXJ0IG9uIHRoZQotICAgICBuZXh0IHBhZ2UuICBJZiB0aGVyZSBhcmUgbm8gc3ltYm9scywgd2UgbXVzdCBmaWxsIG91dCB0aGUgcGFnZSBieQotICAgICBoYW5kLiAgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID09IDAKLSAgICAgICYmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkgIT0gMAotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBlY29mZl9kYXRhIChhYmZkKS0+c3ltX2ZpbGVwb3MgLSAxLAotCQkgICAgU0VFS19TRVQpICE9IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKCZjLCAxLCAxLCBhYmZkKSA9PSAwKQotCWMgPSAwOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1fZmlsZXBvcyAtIDEsCi0JCSAgICBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZjLCAxLCAxLCBhYmZkKSAhPSAxKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICBpZiAocmVsb2NfYnVmZiAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIHRydWU7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAocmVsb2NfYnVmZiAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19idWZmKTsKLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogQXJjaGl2ZSBoYW5kbGluZy4gIEVDT0ZGIHVzZXMgd2hhdCBhcHBlYXJzIHRvIGJlIGEgdW5pcXVlIHR5cGUgb2YKLSAgIGFyY2hpdmUgaGVhZGVyIChhcm1hcCkuICBUaGUgYnl0ZSBvcmRlcmluZyBvZiB0aGUgYXJtYXAgYW5kIHRoZQotICAgY29udGVudHMgYXJlIGVuY29kZWQgaW4gdGhlIG5hbWUgb2YgdGhlIGFybWFwIGl0c2VsZi4gIEF0IGxlYXN0IGZvcgotICAgbm93LCB3ZSBvbmx5IHN1cHBvcnQgYXJjaGl2ZXMgd2l0aCB0aGUgc2FtZSBieXRlIG9yZGVyaW5nIGluIHRoZQotICAgYXJtYXAgYW5kIHRoZSBjb250ZW50cy4KLQotICAgVGhlIGZpcnN0IGZvdXIgYnl0ZXMgaW4gdGhlIGFybWFwIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbAotICAgZGVmaW5pdGlvbnMuICBUaGlzIGlzIGFsd2F5cyBhIHBvd2VyIG9mIHR3by4KLQotICAgVGhpcyBpcyBmb2xsb3dlZCBieSB0aGUgc3ltYm9sIGRlZmluaXRpb25zLiAgRWFjaCBzeW1ib2wgZGVmaW5pdGlvbgotICAgb2NjdXBpZXMgOCBieXRlcy4gIFRoZSBmaXJzdCBmb3VyIGJ5dGVzIGFyZSB0aGUgb2Zmc2V0IGZyb20gdGhlCi0gICBzdGFydCBvZiB0aGUgYXJtYXAgc3RyaW5ncyB0byB0aGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBuYW1pbmcKLSAgIHRoaXMgc3ltYm9sLiAgVGhlIHNlY29uZCBmb3VyIGJ5dGVzIGFyZSB0aGUgZmlsZSBvZmZzZXQgdG8gdGhlCi0gICBhcmNoaXZlIG1lbWJlciB3aGljaCBkZWZpbmVzIHRoaXMgc3ltYm9sLiAgSWYgdGhlIHNlY29uZCBmb3VyIGJ5dGVzCi0gICBhcmUgMCwgdGhlbiB0aGlzIGlzIG5vdCBhY3R1YWxseSBhIHN5bWJvbCBkZWZpbml0aW9uLCBhbmQgaXQgc2hvdWxkCi0gICBiZSBpZ25vcmVkLgotCi0gICBUaGUgc3ltYm9scyBhcmUgaGFzaGVkIGludG8gdGhlIGFybWFwIHdpdGggYSBjbG9zZWQgaGFzaGluZyBzY2hlbWUuCi0gICBTZWUgdGhlIGZ1bmN0aW9ucyBiZWxvdyBmb3IgdGhlIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobS4KLQotICAgQWZ0ZXIgdGhlIHN5bWJvbCBkZWZpbml0aW9ucyBjb21lcyBmb3VyIGJ5dGVzIGhvbGRpbmcgdGhlIHNpemUgb2YKLSAgIHRoZSBzdHJpbmcgdGFibGUsIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmcgdGFibGUgaXRzZWxmLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgYW4gYXJjaGl2ZSBoZWFkZXJzIGxvb2tzIGxpa2UgdGhpczoKLSAgIF9fX19fX19fX19FW0JMXUVbQkxdXyAod2l0aCBhIHRyYWlsaW5nIHNwYWNlKS4KLSAgIFRoZSB0cmFpbGluZyBzcGFjZSBpcyBjaGFuZ2VkIHRvIGFuIFggaWYgdGhlIGFyY2hpdmUgaXMgY2hhbmdlZCB0bwotICAgaW5kaWNhdGUgdGhhdCB0aGUgYXJtYXAgaXMgb3V0IG9mIGRhdGUuCi0KLSAgIFRoZSBBbHBoYSBzZWVtcyB0byB1c2UgX19fX19fX182NEVbQkxdRVtCTF1fLiAgKi8KLQotI2RlZmluZSBBUk1BUF9CSUdfRU5ESUFOICdCJwotI2RlZmluZSBBUk1BUF9MSVRUTEVfRU5ESUFOICdMJwotI2RlZmluZSBBUk1BUF9NQVJLRVIgJ0UnCi0jZGVmaW5lIEFSTUFQX1NUQVJUX0xFTkdUSCAxMAotI2RlZmluZSBBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYIDEwCi0jZGVmaW5lIEFSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVggMTEKLSNkZWZpbmUgQVJNQVBfT0JKRUNUX01BUktFUl9JTkRFWCAxMgotI2RlZmluZSBBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYIDEzCi0jZGVmaW5lIEFSTUFQX0VORF9JTkRFWCAxNAotI2RlZmluZSBBUk1BUF9FTkQgIl8gIgotCi0vKiBUaGlzIGlzIGEgbWFnaWMgbnVtYmVyIHVzZWQgaW4gdGhlIGhhc2hpbmcgYWxnb3JpdGhtLiAgKi8KLSNkZWZpbmUgQVJNQVBfSEFTSF9NQUdJQyAweDlkZDY4YWI1Ci0KLS8qIFRoaXMgcmV0dXJucyB0aGUgaGFzaCB2YWx1ZSB0byB1c2UgZm9yIGEgc3RyaW5nLiAgSXQgYWxzbyBzZXRzCi0gICAqUkVIQVNIIHRvIHRoZSByZWhhc2ggYWRqdXN0bWVudCBpZiB0aGUgZmlyc3Qgc2xvdCBpcyB0YWtlbi4gIFNJWkUKLSAgIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIEhMT0cgaXMgdGhlIGxvZwotICAgYmFzZSAyIG9mIFNJWkUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1lY29mZl9hcm1hcF9oYXNoIChzLCByZWhhc2gsIHNpemUsIGhsb2cpCi0gICAgIENPTlNUIGNoYXIgKnM7Ci0gICAgIHVuc2lnbmVkIGludCAqcmVoYXNoOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgdW5zaWduZWQgaW50IGhsb2c7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChobG9nID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIGhhc2ggPSAqcysrOwotICB3aGlsZSAoKnMgIT0gJ1wwJykKLSAgICBoYXNoID0gKChoYXNoID4+IDI3KSB8IChoYXNoIDw8IDUpKSArICpzKys7Ci0gIGhhc2ggKj0gQVJNQVBfSEFTSF9NQUdJQzsKLSAgKnJlaGFzaCA9IChoYXNoICYgKHNpemUgLSAxKSkgfCAxOwotICByZXR1cm4gaGFzaCA+PiAoMzIgLSBobG9nKTsKLX0KLQotLyogUmVhZCBpbiB0aGUgYXJtYXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IGFyZWx0ZGF0YSAqbWFwZGF0YTsKLSAgYmZkX3NpemVfdHlwZSBwYXJzZWRfc2l6ZTsKLSAgY2hhciAqcmF3X2FybWFwOwotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGNoYXIgKnJhd19wdHI7Ci0gIHN0cnVjdCBzeW1kZWYgKnN5bWRlZl9wdHI7Ci0gIGNoYXIgKnN0cmluZ2Jhc2U7Ci0gIAotICAvKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGVsZW1lbnQuICAqLwotICBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0gIGlmIChpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIC0xNiwgU0VFS19DVVIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElyaXggNC4wLjVGIGFwcGFyZW50bHkgY2FuIHVzZSBlaXRoZXIgYW4gRUNPRkYgYXJtYXAgb3IgYQotICAgICBzdGFuZGFyZCBDT0ZGIGFybWFwLiAgV2UgY291bGQgbW92ZSB0aGUgRUNPRkYgYXJtYXAgc3R1ZmYgaW50bwotICAgICBiZmRfc2x1cnBfYXJtYXAsIGJ1dCB0aGF0IHNlZW1zIGluYXBwcm9wcmlhdGUgc2luY2Ugbm8gb3RoZXIKLSAgICAgdGFyZ2V0IHVzZXMgdGhpcyBmb3JtYXQuICBJbnN0ZWFkLCB3ZSBjaGVjayBkaXJlY3RseSBmb3IgYSBDT0ZGCi0gICAgIGFybWFwLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSA9PSAwKQotICAgIHJldHVybiBiZmRfc2x1cnBfYXJtYXAgKGFiZmQpOwotCi0gIC8qIFNlZSBpZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBhbiBhcm1hcC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgZWNvZmZfYmFja2VuZCAoYWJmZCktPmFybWFwX3N0YXJ0LAotCSAgICAgICBBUk1BUF9TVEFSVF9MRU5HVEgpICE9IDAKLSAgICAgIHx8IG5leHRuYW1lW0FSTUFQX0hFQURFUl9NQVJLRVJfSU5ERVhdICE9IEFSTUFQX01BUktFUgotICAgICAgfHwgKG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdICE9IEFSTUFQX0JJR19FTkRJQU4KLQkgICYmIG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdICE9IEFSTUFQX0xJVFRMRV9FTkRJQU4pCi0gICAgICB8fCBuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfTUFSS0VSX0lOREVYXSAhPSBBUk1BUF9NQVJLRVIKLSAgICAgIHx8IChuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9CSUdfRU5ESUFOCi0JICAmJiBuZXh0bmFtZVtBUk1BUF9PQkpFQ1RfRU5ESUFOX0lOREVYXSAhPSBBUk1BUF9MSVRUTEVfRU5ESUFOKQotICAgICAgfHwgc3RybmNtcCAobmV4dG5hbWUgKyBBUk1BUF9FTkRfSU5ERVgsCi0JCSAgQVJNQVBfRU5ELCBzaXplb2YgQVJNQVBfRU5EIC0gMSkgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgYnl0ZSBvcmRlcmluZy4gICovCi0gIGlmICgoKG5leHRuYW1lW0FSTUFQX0hFQURFUl9FTkRJQU5fSU5ERVhdID09IEFSTUFQX0JJR19FTkRJQU4pCi0gICAgICAgXiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkpCi0gICAgICB8fCAoKG5leHRuYW1lW0FSTUFQX09CSkVDVF9FTkRJQU5fSU5ERVhdID09IEFSTUFQX0JJR19FTkRJQU4pCi0JICBeIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgYXJtYXAuICAqLwotICBhcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSAoc3RydWN0IGFyZWx0ZGF0YSAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwotICAgIAotICByYXdfYXJtYXAgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHBhcnNlZF9zaXplKTsKLSAgaWYgKHJhd19hcm1hcCA9PSAoY2hhciAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByYXdfYXJtYXAsIDEsIHBhcnNlZF9zaXplLCBhYmZkKSAhPSBwYXJzZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCAoUFRSKSByYXdfYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgYXJkYXRhLT50ZGF0YSA9IChQVFIpIHJhd19hcm1hcDsKLQotICBjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X2FybWFwKTsKLQotICBhcmRhdGEtPnN5bWRlZl9jb3VudCA9IDA7Ci0gIGFyZGF0YS0+Y2FjaGUgPSAoc3RydWN0IGFyX2NhY2hlICopIE5VTEw7Ci0KLSAgLyogVGhpcyBjb2RlIHVzZWQgdG8gb3ZlcmxheSB0aGUgc3ltZGVmcyBvdmVyIHRoZSByYXcgYXJjaGl2ZSBkYXRhLAotICAgICBidXQgdGhhdCBkb2Vzbid0IHdvcmsgb24gYSA2NCBiaXQgaG9zdC4gICovCi0KLSAgc3RyaW5nYmFzZSA9IHJhd19hcm1hcCArIGNvdW50ICogOCArIDg7Ci0KLSNpZmRlZiBDSEVDS19BUk1BUF9IQVNICi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaGxvZzsKLQotICAgIC8qIERvdWJsZSBjaGVjayB0aGF0IEkgaGF2ZSB0aGUgaGFzaGluZyBhbGdvcml0aG0gcmlnaHQgYnkgbWFraW5nCi0gICAgICAgc3VyZSB0aGF0IGV2ZXJ5IHN5bWJvbCBjYW4gYmUgbG9va2VkIHVwIHN1Y2Nlc3NmdWxseS4gICovCi0gICAgaGxvZyA9IDA7Ci0gICAgZm9yIChpID0gMTsgaSA8IGNvdW50OyBpIDw8PSAxKQotICAgICAgaGxvZysrOwotICAgIEJGRF9BU1NFUlQgKGkgPT0gY291bnQpOwotCi0gICAgcmF3X3B0ciA9IHJhd19hcm1hcCArIDQ7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgbmFtZV9vZmZzZXQsIGZpbGVfb2Zmc2V0OwotCXVuc2lnbmVkIGludCBoYXNoLCByZWhhc2gsIHNyY2g7Ci0gICAgICAKLQluYW1lX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgcmF3X3B0cik7Ci0JZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChyYXdfcHRyICsgNCkpOwotCWlmIChmaWxlX29mZnNldCA9PSAwKQotCSAgY29udGludWU7Ci0JaGFzaCA9IGVjb2ZmX2FybWFwX2hhc2ggKHN0cmluZ2Jhc2UgKyBuYW1lX29mZnNldCwgJnJlaGFzaCwgY291bnQsCi0JCQkJIGhsb2cpOwotCWlmIChoYXNoID09IGkpCi0JICBjb250aW51ZTsKLQotCS8qIFNlZSBpZiB3ZSBjYW4gcmVoYXNoIHRvIHRoaXMgbG9jYXRpb24uICAqLwotCWZvciAoc3JjaCA9IChoYXNoICsgcmVoYXNoKSAmIChjb3VudCAtIDEpOwotCSAgICAgc3JjaCAhPSBoYXNoICYmIHNyY2ggIT0gaTsKLQkgICAgIHNyY2ggPSAoc3JjaCArIHJlaGFzaCkgJiAoY291bnQgLSAxKSkKLQkgIEJGRF9BU1NFUlQgKGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19hcm1hcCArIDggKyBzcmNoICogOCkpCi0JCSAgICAgICE9IDApOwotCUJGRF9BU1NFUlQgKHNyY2ggPT0gaSk7Ci0gICAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIENIRUNLX0FSTUFQX0hBU0ggKi8KLQotICByYXdfcHRyID0gcmF3X2FybWFwICsgNDsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSAocmF3X3B0ciArIDQpKSAhPSAwKQotICAgICAgKythcmRhdGEtPnN5bWRlZl9jb3VudDsKLQotICBzeW1kZWZfcHRyID0gKChzdHJ1Y3Qgc3ltZGVmICopCi0JCWJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgIGFyZGF0YS0+c3ltZGVmX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc3ltZGVmKSkpOwotICBpZiAoIXN5bWRlZl9wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgc3ltZGVmX3B0cjsKLQotICByYXdfcHRyID0gcmF3X2FybWFwICsgNDsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJhd19wdHIgKz0gOCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmFtZV9vZmZzZXQsIGZpbGVfb2Zmc2V0OwotCi0gICAgICBmaWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKFBUUikgKHJhd19wdHIgKyA0KSk7Ci0gICAgICBpZiAoZmlsZV9vZmZzZXQgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIG5hbWVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoUFRSKSByYXdfcHRyKTsKLSAgICAgIHN5bWRlZl9wdHItPnMubmFtZSA9IHN0cmluZ2Jhc2UgKyBuYW1lX29mZnNldDsKLSAgICAgIHN5bWRlZl9wdHItPmZpbGVfb2Zmc2V0ID0gZmlsZV9vZmZzZXQ7Ci0gICAgICArK3N5bWRlZl9wdHI7Ci0gICAgfQotCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpOwotICAvKiBQYWQgdG8gYW4gZXZlbiBib3VuZGFyeS4gICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICs9IGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zICUgMjsKLQotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gYXJtYXAuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX3dyaXRlX2FybWFwIChhYmZkLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBlbGVuZ3RoOwotICAgICBzdHJ1Y3Qgb3JsICptYXA7Ci0gICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQ7Ci0gICAgIGludCBzdHJpZHg7Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoc2l6ZSwgaGFzaGxvZzsKLSAgdW5zaWduZWQgaW50IHN5bWRlZnNpemU7Ci0gIGludCBwYWRpdDsKLSAgdW5zaWduZWQgaW50IHN0cmluZ3NpemU7Ci0gIHVuc2lnbmVkIGludCBtYXBzaXplOwotICBmaWxlX3B0ciBmaXJzdHJlYWw7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLSAgYmZkX2J5dGUgKmhhc2h0YWJsZTsKLSAgYmZkICpjdXJyZW50OwotICBiZmQgKmxhc3RfZWx0OwotCi0gIC8qIFVsdHJpeCBhcHBlYXJzIHRvIHVzZSBhcyBhIGhhc2ggdGFibGUgc2l6ZSB0aGUgbGVhc3QgcG93ZXIgb2YgdHdvCi0gICAgIGdyZWF0ZXIgdGhhbiB0d2ljZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMuICAqLwotICBmb3IgKGhhc2hsb2cgPSAwOyAoKHVuc2lnbmVkIGludCkgMSA8PCBoYXNobG9nKSA8PSAyICogb3JsX2NvdW50OyBoYXNobG9nKyspCi0gICAgOwotICBoYXNoc2l6ZSA9IDEgPDwgaGFzaGxvZzsKLQotICBzeW1kZWZzaXplID0gaGFzaHNpemUgKiA4OwotICBwYWRpdCA9IHN0cmlkeCAlIDI7Ci0gIHN0cmluZ3NpemUgPSBzdHJpZHggKyBwYWRpdDsKLQotICAvKiBJbmNsdWRlIDggYnl0ZXMgdG8gc3RvcmUgc3ltZGVmc2l6ZSBhbmQgc3RyaW5nc2l6ZSBpbiBvdXRwdXQuICovCi0gIG1hcHNpemUgPSBzeW1kZWZzaXplICsgc3RyaW5nc2l6ZSArIDg7Ci0KLSAgZmlyc3RyZWFsID0gU0FSTUFHICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSArIG1hcHNpemUgKyBlbGVuZ3RoOwotCi0gIG1lbXNldCAoKFBUUikgJmhkciwgMCwgc2l6ZW9mIGhkcik7Ci0KLSAgLyogV29yayBvdXQgdGhlIEVDT0ZGIGFybWFwIG5hbWUuICAqLwotICBzdHJjcHkgKGhkci5hcl9uYW1lLCBlY29mZl9iYWNrZW5kIChhYmZkKS0+YXJtYXBfc3RhcnQpOwotICBoZHIuYXJfbmFtZVtBUk1BUF9IRUFERVJfTUFSS0VSX0lOREVYXSA9IEFSTUFQX01BUktFUjsKLSAgaGRyLmFyX25hbWVbQVJNQVBfSEVBREVSX0VORElBTl9JTkRFWF0gPQotICAgIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpCi0gICAgID8gQVJNQVBfQklHX0VORElBTgotICAgICA6IEFSTUFQX0xJVFRMRV9FTkRJQU4pOwotICBoZHIuYXJfbmFtZVtBUk1BUF9PQkpFQ1RfTUFSS0VSX0lOREVYXSA9IEFSTUFQX01BUktFUjsKLSAgaGRyLmFyX25hbWVbQVJNQVBfT0JKRUNUX0VORElBTl9JTkRFWF0gPQotICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IEFSTUFQX0JJR19FTkRJQU4gOiBBUk1BUF9MSVRUTEVfRU5ESUFOOwotICBtZW1jcHkgKGhkci5hcl9uYW1lICsgQVJNQVBfRU5EX0lOREVYLCBBUk1BUF9FTkQsIHNpemVvZiBBUk1BUF9FTkQgLSAxKTsKLQotICAvKiBXcml0ZSB0aGUgdGltZXN0YW1wIG9mIHRoZSBhcmNoaXZlIGhlYWRlciB0byBiZSBqdXN0IGEgbGl0dGxlIGJpdAotICAgICBsYXRlciB0aGFuIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGZpbGUsIG90aGVyd2lzZSB0aGUgbGlua2VyIHdpbGwKLSAgICAgY29tcGxhaW4gdGhhdCB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUuICBBY3R1YWxseSwgdGhlIFVsdHJpeAotICAgICBsaW5rZXIganVzdCBjaGVja3MgdGhlIGFyY2hpdmUgbmFtZTsgdGhlIEdOVSBsaW5rZXIgbWF5IGNoZWNrIHRoZQotICAgICBkYXRlLiAgKi8KLSAgc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZzdGF0YnVmKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2RhdGUsICIlbGQiLCAobG9uZykgKHN0YXRidWYuc3RfbXRpbWUgKyA2MCkpOwotCi0gIC8qIFRoZSBERUNzdGF0aW9uIHVzZXMgemVyb2VzIGZvciB0aGUgdWlkLCBnaWQgYW5kIG1vZGUgb2YgdGhlCi0gICAgIGFybWFwLiAgKi8KLSAgaGRyLmFyX3VpZFswXSA9ICcwJzsKLSAgaGRyLmFyX2dpZFswXSA9ICcwJzsKLSNpZiAwCi0gIGhkci5hcl9tb2RlWzBdID0gJzAnOwotI2Vsc2UKLSAgLyogQnVpbGRpbmcgZ2NjIGVuZHMgdXAgZXh0cmFjdGluZyB0aGUgYXJtYXAgYXMgYSBmaWxlIC0gdHdpY2UuICovCi0gIGhkci5hcl9tb2RlWzBdID0gJzYnOwotICBoZHIuYXJfbW9kZVsxXSA9ICc0JzsKLSAgaGRyLmFyX21vZGVbMl0gPSAnNCc7Ci0jZW5kaWYKLQotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbWFwc2l6ZSk7Ci0KLSAgaGRyLmFyX2ZtYWdbMF0gPSAnYCc7Ci0gIGhkci5hcl9mbWFnWzFdID0gJ1wwMTInOwotCi0gIC8qIFR1cm4gYWxsIG51bGwgYnl0ZXMgaW4gdGhlIGhlYWRlciBpbnRvIHNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOyBpKyspCi0gICBpZiAoKChjaGFyICopKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAoKChjaGFyICopKCZoZHIpKVtpXSkgPSAnICc7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmhkciwgMSwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3RydWN0IGFyX2hkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGhhc2hzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBoYXNodGFibGUgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc3ltZGVmc2l6ZSk7Ci0gIGlmICghaGFzaHRhYmxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjdXJyZW50ID0gYWJmZC0+YXJjaGl2ZV9oZWFkOwotICBsYXN0X2VsdCA9IGN1cnJlbnQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoOwotCi0gICAgICAvKiBBZHZhbmNlIGZpcnN0cmVhbCB0byB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGlzIGFyY2hpdmUKLQkgZWxlbWVudC4gICovCi0gICAgICBpZiAoKChiZmQgKikgbWFwW2ldLnBvcykgIT0gbGFzdF9lbHQpCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGZpcnN0cmVhbCArPSBhcmVsdF9zaXplIChjdXJyZW50KSArIHNpemVvZiAoc3RydWN0IGFyX2hkcik7Ci0JICAgICAgZmlyc3RyZWFsICs9IGZpcnN0cmVhbCAlIDI7Ci0JICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7Ci0JICAgIH0KLQkgIHdoaWxlIChjdXJyZW50ICE9IChiZmQgKikgbWFwW2ldLnBvcyk7Ci0JfQotCi0gICAgICBsYXN0X2VsdCA9IGN1cnJlbnQ7Ci0KLSAgICAgIGhhc2ggPSBlY29mZl9hcm1hcF9oYXNoICgqbWFwW2ldLm5hbWUsICZyZWhhc2gsIGhhc2hzaXplLCBoYXNobG9nKTsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChoYXNodGFibGUgKyAoaGFzaCAqIDgpICsgNCkpICE9IDApCi0JewotCSAgdW5zaWduZWQgaW50IHNyY2g7Ci0KLQkgIC8qIFRoZSBkZXNpcmVkIHNsb3QgaXMgYWxyZWFkeSB0YWtlbi4gICovCi0JICBmb3IgKHNyY2ggPSAoaGFzaCArIHJlaGFzaCkgJiAoaGFzaHNpemUgLSAxKTsKLQkgICAgICAgc3JjaCAhPSBoYXNoOwotCSAgICAgICBzcmNoID0gKHNyY2ggKyByZWhhc2gpICYgKGhhc2hzaXplIC0gMSkpCi0JICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIChQVFIpIChoYXNodGFibGUgKyAoc3JjaCAqIDgpICsgNCkpID09IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgIEJGRF9BU1NFUlQgKHNyY2ggIT0gaGFzaCk7Ci0KLQkgIGhhc2ggPSBzcmNoOwotCX0KLQkKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIG1hcFtpXS5uYW1pZHgsCi0JCSAgICAoUFRSKSAoaGFzaHRhYmxlICsgaGFzaCAqIDgpKTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGZpcnN0cmVhbCwKLQkJICAgIChQVFIpIChoYXNodGFibGUgKyBoYXNoICogOCArIDQpKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgaGFzaHRhYmxlLCAxLCBzeW1kZWZzaXplLCBhYmZkKSAhPSBzeW1kZWZzaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcmVsZWFzZSAoYWJmZCwgaGFzaHRhYmxlKTsKLQotICAvKiBOb3cgd3JpdGUgdGhlIHN0cmluZ3MuICAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJpbmdzaXplLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGVtcCwgMSwgNCwgYWJmZCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoaSA9IDA7IGkgPCBvcmxfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuICgqbWFwW2ldLm5hbWUpICsgMTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICgqbWFwW2ldLm5hbWUpLCAxLCBsZW4sIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNleiB0aGlzIHNob3VsZCBiZSBhIG5ld2xpbmUuICBCdXQgaW4gb3JkZXIgdG8gYmUKLSAgICAgYnVnLWNvbXBhdGlibGUgZm9yIERFQ3N0YXRpb24gYXIgd2UgdXNlIGEgbnVsbC4gICovCi0gIGlmIChwYWRpdCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYWJmZCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgd2hldGhlciB0aGlzIEJGRCBpcyBhbiBhcmNoaXZlLiAgSWYgaXQgaXMsIHJlYWQgaW4gdGhlIGFybWFwCi0gICBhbmQgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLV9iZmRfZWNvZmZfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBhcnRkYXRhICp0ZGF0YV9ob2xkOwotICBjaGFyIGFybWFnW1NBUk1BRyArIDFdOwotCi0gIHRkYXRhX2hvbGQgPSBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGE7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBhcm1hZywgMSwgU0FSTUFHLCBhYmZkKSAhPSBTQVJNQUcpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wIChhcm1hZywgQVJNQUcsIFNBUk1BRykgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBhcmUgc2V0dGluZyBiZmRfYXJkYXRhKGFiZmQpIGhlcmUsIGJ1dCBzaW5jZSBiZmRfYXJkYXRhCi0gICAgIGludm9sdmVzIGEgY2FzdCwgd2UgY2FuJ3QgZG8gaXQgYXMgdGhlIGxlZnQgb3BlcmFuZCBvZgotICAgICBhc3NpZ25tZW50LiAgKi8KLSAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0KLSAgICAoc3RydWN0IGFydGRhdGEgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYXJ0ZGF0YSkpOwotCi0gIGlmIChiZmRfYXJkYXRhIChhYmZkKSA9PSAoc3RydWN0IGFydGRhdGEgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2FyX2RhdGEgPSB0ZGF0YV9ob2xkOwotICAgICAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci0gICAgfQotCi0gIGJmZF9hcmRhdGEgKGFiZmQpLT5maXJzdF9maWxlX2ZpbGVwb3MgPSBTQVJNQUc7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5jYWNoZSA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5hcmNoaXZlX2hlYWQgPSBOVUxMOwotICBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT5leHRlbmRlZF9uYW1lcyA9IE5VTEw7Ci0gIGJmZF9hcmRhdGEgKGFiZmQpLT50ZGF0YSA9IE5VTEw7Ci0gIAotICBpZiAoX2JmZF9lY29mZl9zbHVycF9hcm1hcCAoYWJmZCkgPT0gZmFsc2UKLSAgICAgIHx8IF9iZmRfZWNvZmZfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGJmZF9hcmRhdGEgKGFiZmQpKTsKLSAgICAgIGFiZmQtPnRkYXRhLmFvdXRfYXJfZGF0YSA9IHRkYXRhX2hvbGQ7Ci0gICAgICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLSAgICB9Ci0gIAotICBpZiAoYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIGJmZCAqZmlyc3Q7Ci0KLSAgICAgIC8qIFRoaXMgYXJjaGl2ZSBoYXMgYSBtYXAsIHNvIHdlIG1heSBwcmVzdW1lIHRoYXQgdGhlIGNvbnRlbnRzCi0JIGFyZSBvYmplY3QgZmlsZXMuICBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgZmlyc3QgZmlsZSBpbiB0aGUKLQkgYXJjaGl2ZSBjYW4gYmUgcmVjb2duaXplZCBhcyBhbiBvYmplY3QgZmlsZSwgaXQgaXMgZm9yIHRoaXMKLQkgdGFyZ2V0LiAgSWYgbm90LCBhc3N1bWUgdGhhdCB0aGlzIGlzIHRoZSB3cm9uZyBmb3JtYXQuICBJZgotCSB0aGUgZmlyc3QgZmlsZSBpcyBub3QgYW4gb2JqZWN0IGZpbGUsIHNvbWVib2R5IGlzIGRvaW5nCi0JIHNvbWV0aGluZyB3ZWlyZCwgYW5kIHdlIHBlcm1pdCBpdCBzbyB0aGF0IGFyIC10IHdpbGwgd29yay4gICovCi0KLSAgICAgIGZpcnN0ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMKQotCXsKLQkgIGJvb2xlYW4gZmFpbDsKLQotCSAgZmlyc3QtPnRhcmdldF9kZWZhdWx0ZWQgPSBmYWxzZTsKLQkgIGZhaWwgPSBmYWxzZTsKLQkgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaXJzdCwgYmZkX29iamVjdCkKLQkgICAgICAmJiBmaXJzdC0+eHZlYyAhPSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoZmlyc3QpOwotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBiZmRfYXJkYXRhIChhYmZkKSk7Ci0JICAgICAgYWJmZC0+dGRhdGEuYW91dF9hcl9kYXRhID0gdGRhdGFfaG9sZDsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCi0JICAvKiBXZSBvdWdodCB0byBjbG9zZSBmaXJzdCBoZXJlLCBidXQgd2UgY2FuJ3QsIGJlY2F1c2Ugd2UKLSAgICAgICAgICAgICBoYXZlIG5vIHdheSB0byByZW1vdmUgaXQgZnJvbSB0aGUgYXJjaGl2ZSBjYWNoZS4gIEZJWE1FLiAgKi8KLQl9Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotDAotLyogRUNPRkYgbGlua2VyIGNvZGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplY29mZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LAotCSAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICpwbmVlZGVkKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBQVFIsIGNoYXIgKikpOwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPmFiZmQgPSBOVUxMOwotICAgICAgcmV0LT53cml0dGVuID0gMDsKLSAgICAgIHJldC0+c21hbGwgPSAwOwotICAgIH0KLSAgbWVtc2V0ICgoUFRSKSAmcmV0LT5lc3ltLCAwLCBzaXplb2YgcmV0LT5lc3ltKTsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2Vjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICBlY29mZl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIEVDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBFQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIEVDT0ZGIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBlY29mZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogR2l2ZW4gYW4gRUNPRkYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9iZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiBlY29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBlY29mZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pOwotICAgIGRlZmF1bHQ6Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkZCB0aGUgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuCi0gICBUaGlzIGxvb2tzIHRocm91Z2ggdGhlIHVuZGVmaW5lZCBzeW1ib2xzLCBsb29rcyBlYWNoIG9uZSB1cCBpbiB0aGUKLSAgIGFyY2hpdmUgaGFzaCB0YWJsZSwgYW5kIGFkZHMgYW55IGFzc29jaWF0ZWQgb2JqZWN0IGZpbGUuICBXZSBkbyBub3QKLSAgIHVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGJlY2F1c2UgRUNPRkYgYXJjaGl2ZXMKLSAgIGFscmVhZHkgaGF2ZSBhIGhhc2ggdGFibGUsIHNvIHRoZXJlIGlzIG5vIHJlYXNvbiB0byBjb25zdHJ1Y3QKLSAgIGFub3RoZXIgb25lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqIGNvbnN0IGJhY2tlbmQgPSBlY29mZl9iYWNrZW5kIChhYmZkKTsKLSAgY29uc3QgYmZkX2J5dGUgKnJhd19hcm1hcDsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipwdW5kZWY7Ci0gIHVuc2lnbmVkIGludCBhcm1hcF9jb3VudDsKLSAgdW5zaWduZWQgaW50IGFybWFwX2xvZzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGJmZF9ieXRlICpoYXNodGFibGU7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ2Jhc2U7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIGRvbid0IGhhdmUgYW55IHJhdyBkYXRhIGZvciB0aGlzIGFyY2hpdmUsIGFzIGNhbiBoYXBwZW4gb24KLSAgICAgSXJpeCA0LjAuNUYsIHdlIGNhbGwgdGhlIGdlbmVyaWMgcm91dGluZS4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBiZSBtb3JlIGNsZXZlciBhYm91dCB0aGlzLCBzaW5jZSBzb21lZGF5IHRkYXRhCi0gICAgIG1heSBnZXQgdG8gc29tZXRoaW5nIGZvciBhIGdlbmVyaWMgYXJjaGl2ZS4gICovCi0gIHJhd19hcm1hcCA9IChjb25zdCBiZmRfYnl0ZSAqKSBiZmRfYXJkYXRhIChhYmZkKS0+dGRhdGE7Ci0gIGlmIChyYXdfYXJtYXAgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgcmV0dXJuIChfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0JICAgIChhYmZkLCBpbmZvLCBlY29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCkpOwotCi0gIGFybWFwX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByYXdfYXJtYXApOwotCi0gIGFybWFwX2xvZyA9IDA7Ci0gIGZvciAoaSA9IDE7IGkgPCBhcm1hcF9jb3VudDsgaSA8PD0gMSkKLSAgICBhcm1hcF9sb2crKzsKLSAgQkZEX0FTU0VSVCAoaSA9PSBhcm1hcF9jb3VudCk7Ci0KLSAgaGFzaHRhYmxlID0gcmF3X2FybWFwICsgNDsKLSAgc3RyaW5nYmFzZSA9IChjb25zdCBjaGFyICopIHJhd19hcm1hcCArIGFybWFwX2NvdW50ICogOCArIDg7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLSAgcHVuZGVmID0gJmluZm8tPmhhc2gtPnVuZGVmczsKLSAgd2hpbGUgKCpwdW5kZWYgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaCwgcmVoYXNoOwotICAgICAgdW5zaWduZWQgaW50IGZpbGVfb2Zmc2V0OwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJmZCAqZWxlbWVudDsKLQotICAgICAgaCA9ICpwdW5kZWY7Ci0KLSAgICAgIC8qIFdoZW4gYSBzeW1ib2wgaXMgZGVmaW5lZCwgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbQotCSB0aGUgbGlzdC4gICovCi0gICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl7Ci0JICAvKiBSZW1vdmUgdGhpcyBlbnRyeSBmcm9tIHRoZSBsaXN0LCBmb3IgZ2VuZXJhbCBjbGVhbmxpbmVzcwotCSAgICAgYW5kIGJlY2F1c2Ugd2UgYXJlIGdvaW5nIHRvIGxvb2sgdGhyb3VnaCB0aGUgbGlzdCBhZ2FpbgotCSAgICAgaWYgd2Ugc2VhcmNoIGFueSBtb3JlIGxpYnJhcmllcy4gIFdlIGNhbid0IHJlbW92ZSB0aGUKLQkgICAgIGVudHJ5IGlmIGl0IGlzIHRoZSB0YWlsLCBiZWNhdXNlIHRoYXQgd291bGQgbG9zZSBhbnkKLQkgICAgIGVudHJpZXMgd2UgYWRkIHRvIHRoZSBsaXN0IGxhdGVyIG9uLiAgKi8KLQkgIGlmICgqcHVuZGVmICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQotCSAgICAqcHVuZGVmID0gKCpwdW5kZWYpLT5uZXh0OwotCSAgZWxzZQotCSAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOYXRpdmUgRUNPRkYgbGlua2VycyBkbyBub3QgcHVsbCBpbiBhcmNoaXZlIGVsZW1lbnRzIG1lcmVseQotCSB0byBzYXRpc2Z5IGNvbW1vbiBkZWZpbml0aW9ucywgc28gbmVpdGhlciBkbyB3ZS4gIFdlIGxlYXZlCi0JIHRoZW0gb24gdGhlIGxpc3QsIHRob3VnaCwgaW4gY2FzZSB3ZSBhcmUgbGlua2luZyBhZ2FpbnN0IHNvbWUKLQkgb3RoZXIgb2JqZWN0IGZvcm1hdC4gICovCi0gICAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLSAgICAgIGhhc2ggPSBlY29mZl9hcm1hcF9oYXNoIChoLT5yb290LnN0cmluZywgJnJlaGFzaCwgYXJtYXBfY291bnQsCi0JCQkgICAgICAgYXJtYXBfbG9nKTsKLQotICAgICAgZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhhc2h0YWJsZSArIChoYXNoICogOCkgKyA0KTsKLSAgICAgIGlmIChmaWxlX29mZnNldCA9PSAwKQotCXsKLQkgIC8qIE5vdGhpbmcgaW4gdGhpcyBzbG90LiAgKi8KLQkgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBzdHJpbmdiYXNlICsgYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoaGFzaCAqIDgpKTsKLSAgICAgIGlmIChuYW1lWzBdICE9IGgtPnJvb3Quc3RyaW5nWzBdCi0JICB8fCBzdHJjbXAgKG5hbWUsIGgtPnJvb3Quc3RyaW5nKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBzcmNoOwotCSAgYm9vbGVhbiBmb3VuZDsKLQotCSAgLyogVGhhdCB3YXMgdGhlIHdyb25nIHN5bWJvbC4gIFRyeSByZWhhc2hpbmcuICAqLwotCSAgZm91bmQgPSBmYWxzZTsKLQkgIGZvciAoc3JjaCA9IChoYXNoICsgcmVoYXNoKSAmIChhcm1hcF9jb3VudCAtIDEpOwotCSAgICAgICBzcmNoICE9IGhhc2g7Ci0JICAgICAgIHNyY2ggPSAoc3JjaCArIHJlaGFzaCkgJiAoYXJtYXBfY291bnQgLSAxKSkKLQkgICAgewotCSAgICAgIGZpbGVfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoc3JjaCAqIDgpICsgNCk7Ci0JICAgICAgaWYgKGZpbGVfb2Zmc2V0ID09IDApCi0JCWJyZWFrOwotCSAgICAgIG5hbWUgPSBzdHJpbmdiYXNlICsgYmZkX2hfZ2V0XzMyIChhYmZkLCBoYXNodGFibGUgKyAoc3JjaCAqIDgpKTsKLQkgICAgICBpZiAobmFtZVswXSA9PSBoLT5yb290LnN0cmluZ1swXQotCQkgICYmIHN0cmNtcCAobmFtZSwgaC0+cm9vdC5zdHJpbmcpID09IDApCi0JCXsKLQkJICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBmb3VuZCkKLQkgICAgewotCSAgICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaGFzaCA9IHNyY2g7Ci0JfQotCi0gICAgICBlbGVtZW50ID0gKCpiYWNrZW5kLT5nZXRfZWx0X2F0X2ZpbGVwb3MpIChhYmZkLCBmaWxlX29mZnNldCk7Ci0gICAgICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFVubGlrZSB0aGUgZ2VuZXJpYyBsaW5rZXIsIHdlIGtub3cgdGhhdCB0aGlzIGVsZW1lbnQgcHJvdmlkZXMKLQkgYSBkZWZpbml0aW9uIGZvciBhbiB1bmRlZmluZWQgc3ltYm9sIGFuZCB3ZSBrbm93IHRoYXQgd2Ugd2FudAotCSB0byBpbmNsdWRlIGl0LiAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayBhbnl0aGluZy4gICovCi0gICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkgKGluZm8sIGVsZW1lbnQsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGVjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChlbGVtZW50LCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHB1bmRlZiA9ICYoKnB1bmRlZiktPm5leHQ7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBpZiB3ZSB1c2VkIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgIGJlY2F1c2Ugd2Ugd2VyZSBub3QgZGVhbGluZyB3aXRoIGFuIEVDT0ZGIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9leHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEVYVFIgKikpCi0gICAgPSBiYWNrZW5kLT5kZWJ1Z19zd2FwLnN3YXBfZXh0X2luOwotICBIRFJSICpzeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIFBUUiBleHRlcm5hbF9leHQgPSBOVUxMOwotICBzaXplX3QgZXNpemU7Ci0gIGNoYXIgKnNzZXh0ID0gTlVMTDsKLSAgY2hhciAqZXh0X3B0cjsKLSAgY2hhciAqZXh0X2VuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICghIGVjb2ZmX3NsdXJwX3N5bWJvbGljX2hlYWRlciAoYWJmZCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgaXQuICAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIHN5bWhkciA9ICZlY29mZl9kYXRhIChhYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXI7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhbmQgZXh0ZXJuYWwgc3RyaW5ncy4gICovCi0gIGV4dGVybmFsX2V4dF9zaXplID0gYmFja2VuZC0+ZGVidWdfc3dhcC5leHRlcm5hbF9leHRfc2l6ZTsKLSAgZXNpemUgPSBzeW1oZHItPmlleHRNYXggKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZXh0ZXJuYWxfZXh0ID0gKFBUUikgYmZkX21hbGxvYyAoZXNpemUpOwotICBpZiAoZXh0ZXJuYWxfZXh0ID09IE5VTEwgJiYgZXNpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoZXh0ZXJuYWxfZXh0LCAxLCBlc2l6ZSwgYWJmZCkgIT0gZXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3NleHQgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzeW1oZHItPmlzc0V4dE1heCk7Ci0gIGlmIChzc2V4dCA9PSBOVUxMICYmIHN5bWhkci0+aXNzRXh0TWF4ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzeW1oZHItPmNiU3NFeHRPZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3JlYWQgKHNzZXh0LCAxLCBzeW1oZHItPmlzc0V4dE1heCwgYWJmZCkgIT0KLQkgIChiZmRfc2l6ZV90eXBlKSBzeW1oZHItPmlzc0V4dE1heCkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBleHRlcm5hbCBzeW1ib2xzIHRvIHNlZSBpZiB0aGV5IGRlZmluZSBzb21lCi0gICAgIHN5bWJvbCB0aGF0IGlzIGN1cnJlbnRseSB1bmRlZmluZWQuICAqLwotICBleHRfcHRyID0gKGNoYXIgKikgZXh0ZXJuYWxfZXh0OwotICBleHRfZW5kID0gZXh0X3B0ciArIGVzaXplOwotICBmb3IgKDsgZXh0X3B0ciA8IGV4dF9lbmQ7IGV4dF9wdHIgKz0gZXh0ZXJuYWxfZXh0X3NpemUpCi0gICAgewotICAgICAgRVhUUiBlc3ltOwotICAgICAgYm9vbGVhbiBkZWY7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgICgqc3dhcF9leHRfaW4pIChhYmZkLCAoUFRSKSBleHRfcHRyLCAmZXN5bSk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIHN5bWJvbCBkZWZpbmVzIHNvbWV0aGluZy4gICovCi0gICAgICBpZiAoZXN5bS5hc3ltLnN0ICE9IHN0R2xvYmFsCi0JICAmJiBlc3ltLmFzeW0uc3QgIT0gc3RMYWJlbAotCSAgJiYgZXN5bS5hc3ltLnN0ICE9IHN0UHJvYykKLQljb250aW51ZTsKLQotICAgICAgc3dpdGNoIChlc3ltLmFzeW0uc2MpCi0JewotCWNhc2Ugc2NUZXh0OgotCWNhc2Ugc2NEYXRhOgotCWNhc2Ugc2NCc3M6Ci0JY2FzZSBzY0FiczoKLQljYXNlIHNjU0RhdGE6Ci0JY2FzZSBzY1NCc3M6Ci0JY2FzZSBzY1JEYXRhOgotCWNhc2Ugc2NDb21tb246Ci0JY2FzZSBzY1NDb21tb246Ci0JY2FzZSBzY0luaXQ6Ci0JY2FzZSBzY0Zpbmk6Ci0JY2FzZSBzY1JDb25zdDoKLQkgIGRlZiA9IHRydWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZGVmID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGRlZikKLQljb250aW51ZTsKLQotICAgICAgbmFtZSA9IHNzZXh0ICsgZXN5bS5hc3ltLmlzczsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgLyogVW5saWtlIHRoZSBnZW5lcmljIGxpbmtlciwgd2UgZG8gbm90IHB1bGwgaW4gZWxlbWVudHMgYmVjYXVzZQotCSBvZiBjb21tb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQljb250aW51ZTsKLQotICAgICAgLyogSW5jbHVkZSB0aGlzIGVsZW1lbnQuICAqLwotICAgICAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmICghIGVjb2ZmX2xpbmtfYWRkX2V4dGVybmFscyAoYWJmZCwgaW5mbywgZXh0ZXJuYWxfZXh0LCBzc2V4dCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgICpwbmVlZGVkID0gdHJ1ZTsKLSAgICAgIGdvdG8gc3VjY2Vzc2Z1bF9yZXR1cm47Ci0gICAgfQotCi0gc3VjY2Vzc2Z1bF9yZXR1cm46Ci0gIGlmIChleHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9leHQpOwotICBpZiAoc3NleHQgIT0gTlVMTCkKLSAgICBmcmVlIChzc2V4dCk7Ci0gIHJldHVybiB0cnVlOwotIGVycm9yX3JldHVybjoKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVDT0ZGIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2gKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBIRFJSICpzeW1oZHI7Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIFBUUiBleHRlcm5hbF9leHQgPSBOVUxMOwotICBzaXplX3QgZXNpemU7Ci0gIGNoYXIgKnNzZXh0ID0gTlVMTDsKLSAgYm9vbGVhbiByZXN1bHQ7Ci0KLSAgaWYgKCEgZWNvZmZfc2x1cnBfc3ltYm9saWNfaGVhZGVyIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhlcmUgYXJlIG5vIHN5bWJvbHMsIHdlIGRvbid0IHdhbnQgaXQuICAqLwotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzeW1oZHIgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyOwotCi0gIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIGV4dGVybmFsIHN0cmluZ3MuICAqLwotICBleHRlcm5hbF9leHRfc2l6ZSA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpLT5kZWJ1Z19zd2FwLmV4dGVybmFsX2V4dF9zaXplOwotICBlc2l6ZSA9IHN5bWhkci0+aWV4dE1heCAqIGV4dGVybmFsX2V4dF9zaXplOwotICBleHRlcm5hbF9leHQgPSAoUFRSKSBiZmRfbWFsbG9jIChlc2l6ZSk7Ci0gIGlmIChleHRlcm5hbF9leHQgPT0gTlVMTCAmJiBlc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltaGRyLT5jYkV4dE9mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChleHRlcm5hbF9leHQsIDEsIGVzaXplLCBhYmZkKSAhPSBlc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzc2V4dCA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN5bWhkci0+aXNzRXh0TWF4KTsKLSAgaWYgKHNzZXh0ID09IE5VTEwgJiYgc3ltaGRyLT5pc3NFeHRNYXggIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bWhkci0+Y2JTc0V4dE9mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoc3NleHQsIDEsIHN5bWhkci0+aXNzRXh0TWF4LCBhYmZkKQotCSAgIT0gKGJmZF9zaXplX3R5cGUpIHN5bWhkci0+aXNzRXh0TWF4KSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICByZXN1bHQgPSBlY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpOwotCi0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiByZXN1bHQ7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzc2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKHNzZXh0KTsKLSAgaWYgKGV4dGVybmFsX2V4dCAhPSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX2V4dCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIHRoZSBleHRlcm5hbCBzeW1ib2xzIG9mIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBnbG9iYWwgbGlua2VyCi0gICBoYXNoIHRhYmxlLiAgVGhlIGV4dGVybmFsIHN5bWJvbHMgYW5kIHN0cmluZ3Mgd2UgYXJlIHBhc3NlZCBhcmUKLSAgIGp1c3QgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgYW5kIHdpbGwgYmUgZGlzY2FyZGVkLiAgV2UgbXVzdAotICAgZXhwbGljaXRseSBzYXZlIGFueSBpbmZvcm1hdGlvbiB3ZSBtYXkgbmVlZCBsYXRlciBvbiBpbiB0aGUgbGluay4KLSAgIFdlIGRvIG5vdCB3YW50IHRvIHJlYWQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiBhZ2Fpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9saW5rX2FkZF9leHRlcm5hbHMgKGFiZmQsIGluZm8sIGV4dGVybmFsX2V4dCwgc3NleHQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIFBUUiBleHRlcm5hbF9leHQ7Ci0gICAgIGNoYXIgKnNzZXh0OwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfYmFja2VuZF9kYXRhICogY29uc3QgYmFja2VuZCA9IGVjb2ZmX2JhY2tlbmQgKGFiZmQpOwotICB2b2lkICgqIGNvbnN0IHN3YXBfZXh0X2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKQotICAgID0gYmFja2VuZC0+ZGVidWdfc3dhcC5zd2FwX2V4dF9pbjsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZSA9IGJhY2tlbmQtPmRlYnVnX3N3YXAuZXh0ZXJuYWxfZXh0X3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcgZXh0X2NvdW50OwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGNoYXIgKmV4dF9wdHI7Ci0gIGNoYXIgKmV4dF9lbmQ7Ci0KLSAgZXh0X2NvdW50ID0gZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm8uc3ltYm9saWNfaGVhZGVyLmlleHRNYXg7Ci0KLSAgc3ltX2hhc2ggPSAoKHN0cnVjdCBlY29mZl9saW5rX2hhc2hfZW50cnkgKiopCi0JICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJIGV4dF9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpKTsKLSAgaWYgKCFzeW1faGFzaCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVjb2ZmX2RhdGEgKGFiZmQpLT5zeW1faGFzaGVzID0gc3ltX2hhc2g7Ci0KLSAgZXh0X3B0ciA9IChjaGFyICopIGV4dGVybmFsX2V4dDsKLSAgZXh0X2VuZCA9IGV4dF9wdHIgKyBleHRfY291bnQgKiBleHRlcm5hbF9leHRfc2l6ZTsKLSAgZm9yICg7IGV4dF9wdHIgPCBleHRfZW5kOyBleHRfcHRyICs9IGV4dGVybmFsX2V4dF9zaXplLCBzeW1faGFzaCsrKQotICAgIHsKLSAgICAgIEVYVFIgZXN5bTsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAqc3ltX2hhc2ggPSBOVUxMOwotCi0gICAgICAoKnN3YXBfZXh0X2luKSAoYWJmZCwgKFBUUikgZXh0X3B0ciwgJmVzeW0pOwotCi0gICAgICAvKiBTa2lwIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLSAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgIHN3aXRjaCAoZXN5bS5hc3ltLnN0KQotCXsKLQljYXNlIHN0R2xvYmFsOgotCWNhc2Ugc3RTdGF0aWM6Ci0JY2FzZSBzdExhYmVsOgotCWNhc2Ugc3RQcm9jOgotCWNhc2Ugc3RTdGF0aWNQcm9jOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNraXAgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoc2tpcCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgdmFsdWUgPSBlc3ltLmFzeW0udmFsdWU7Ci0gICAgICBzd2l0Y2ggKGVzeW0uYXN5bS5zYykKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIHNjTmlsOgotCWNhc2Ugc2NSZWdpc3RlcjoKLQljYXNlIHNjQ2RiTG9jYWw6Ci0JY2FzZSBzY0JpdHM6Ci0JY2FzZSBzY0NkYlN5c3RlbToKLQljYXNlIHNjUmVnSW1hZ2U6Ci0JY2FzZSBzY0luZm86Ci0JY2FzZSBzY1VzZXJTdHJ1Y3Q6Ci0JY2FzZSBzY1ZhcjoKLQljYXNlIHNjVmFyUmVnaXN0ZXI6Ci0JY2FzZSBzY1ZhcmlhbnQ6Ci0JY2FzZSBzY0Jhc2VkVmFyOgotCWNhc2Ugc2NYRGF0YToKLQljYXNlIHNjUERhdGE6Ci0JICBzZWN0aW9uID0gTlVMTDsKLQkgIGJyZWFrOwotCWNhc2Ugc2NUZXh0OgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50ZXh0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjRGF0YToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0JzczoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuYnNzIik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjQWJzOgotCSAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjVW5kZWZpbmVkOgotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBicmVhazsKLQljYXNlIHNjU0RhdGE6Ci0JICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNkYXRhIik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjU0JzczoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2JzcyIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1JEYXRhOgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5yZGF0YSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY0NvbW1vbjoKLQkgIGlmICh2YWx1ZSA+IGVjb2ZmX2RhdGEgKGFiZmQpLT5ncF9zaXplKQotCSAgICB7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBzY1NDb21tb246Ci0JICBpZiAoZWNvZmZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24ubmFtZSA9IFNDT01NT047Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBlY29mZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgICAgIGVjb2ZmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICAgICAgZWNvZmZfc2NvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJmVjb2ZmX3Njb21fc3ltYm9sX3B0cjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5uYW1lID0gU0NPTU1PTjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbC5zZWN0aW9uID0gJmVjb2ZmX3Njb21fc2VjdGlvbjsKLQkgICAgICBlY29mZl9zY29tX3N5bWJvbF9wdHIgPSAmZWNvZmZfc2NvbV9zeW1ib2w7Ci0JICAgIH0KLQkgIHNlY3Rpb24gPSAmZWNvZmZfc2NvbV9zZWN0aW9uOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1NVbmRlZmluZWQ6Ci0JICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCWNhc2Ugc2NJbml0OgotCSAgc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi5pbml0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQljYXNlIHNjRmluaToKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuZmluaSIpOwotCSAgdmFsdWUgLT0gc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0JY2FzZSBzY1JDb25zdDoKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIucmNvbnN0Iik7Ci0JICB2YWx1ZSAtPSBzZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gc3NleHQgKyBlc3ltLmFzeW0uaXNzOwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsCi0JICAgICAgZXN5bS53ZWFrZXh0ID8gQlNGX1dFQUsgOiBCU0ZfR0xPQkFMLAotCSAgICAgIHNlY3Rpb24sIHZhbHVlLCAoY29uc3QgY2hhciAqKSBOVUxMLCB0cnVlLCB0cnVlLAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICpzeW1faGFzaCA9IGg7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBidWlsZGluZyBhbiBFQ09GRiBoYXNoIHRhYmxlLCBzYXZlIHRoZSBleHRlcm5hbAotCSBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX2dldF9mbGF2b3VyIChhYmZkKSkKLQl7Ci0JICBpZiAoaC0+YWJmZCA9PSAoYmZkICopIE5VTEwKLQkgICAgICB8fCAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCSAgJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKQotCQkgICAgICB8fCAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAmJiBoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkpKQotCSAgICB7Ci0JICAgICAgaC0+YWJmZCA9IGFiZmQ7Ci0JICAgICAgaC0+ZXN5bSA9IGVzeW07Ci0JICAgIH0KLQotCSAgLyogUmVtZW1iZXIgd2hldGhlciB0aGlzIHN5bWJvbCB3YXMgc21hbGwgdW5kZWZpbmVkLiAgKi8KLQkgIGlmIChlc3ltLmFzeW0uc2MgPT0gc2NTVW5kZWZpbmVkKQotCSAgICBoLT5zbWFsbCA9IDE7Ci0KLQkgIC8qIElmIHRoaXMgc3ltYm9sIHdhcyBldmVyIHNtYWxsIHVuZGVmaW5lZCwgaXQgbmVlZHMgdG8gd2luZAotCSAgICAgdXAgaW4gYSBHUCByZWxhdGl2ZSBzZWN0aW9uLiAgV2UgY2FuJ3QgY29udHJvbCB0aGUKLQkgICAgIHNlY3Rpb24gb2YgYSBkZWZpbmVkIHN5bWJvbCwgYnV0IHdlIGNhbiBjb250cm9sIHRoZQotCSAgICAgc2VjdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIGNhc2UgaXMgYWN0dWFsbHkgbmVlZGVkCi0JICAgICBvbiBVbHRyaXggNC4yIHRvIGhhbmRsZSB0aGUgc3ltYm9sIGNyZWQgaW4gLWxja3JiLiAgKi8KLQkgIGlmIChoLT5zbWFsbAotCSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+bmFtZSwgU0NPTU1PTikgIT0gMCkKLQkgICAgewotCSAgICAgIGgtPnJvb3QudS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsCi0JCQkJCQkJCSBTQ09NTU9OKTsKLQkgICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1NDb21tb247Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgZmluYWwgbGluayByb3V0aW5lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIGVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZQotICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIGJmZCAqaW5wdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgIFBUUiBoYW5kbGUpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLXN0YXRpYyBib29sZWFuIGVjb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBlY29mZl9saW5rX3dyaXRlX2V4dGVybmFsLiAgKi8KLQotc3RydWN0IGV4dHN5bV9pbmZvCi17Ci0gIGJmZCAqYWJmZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci19OwotCi0vKiBFQ09GRiBmaW5hbCBsaW5rIHJvdXRpbmUuICBUaGlzIGxvb2tzIHRocm91Z2ggYWxsIHRoZSBpbnB1dCBCRkRzCi0gICBhbmQgZ2F0aGVycyB0b2dldGhlciBhbGwgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgYW5kIHRoZW4KLSAgIHByb2Nlc3NlcyBhbGwgdGhlIGxpbmsgb3JkZXIgaW5mb3JtYXRpb24uICBUaGlzIG1heSBjYXVzZSBpdCB0bwotICAgY2xvc2UgYW5kIHJlb3BlbiBzb21lIGlucHV0IEJGRHM7IEknbGwgc2VlIGhvdyBiYWQgdGhpcyBpcy4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBiYWNrZW5kID0gZWNvZmZfYmFja2VuZCAoYWJmZCk7Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWcgPSAmZWNvZmZfZGF0YSAoYWJmZCktPmRlYnVnX2luZm87Ci0gIEhEUlIgKnN5bWhkcjsKLSAgUFRSIGhhbmRsZTsKLSAgcmVnaXN0ZXIgYmZkICppbnB1dF9iZmQ7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gY291bnRzIGluIHRoZSBzeW1ib2xpYwotICAgICBoZWFkZXIuICAqLwotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgc3ltaGRyLT52c3RhbXAgPSAwOwotICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLSAgc3ltaGRyLT5jYkxpbmUgPSAwOwotICBzeW1oZHItPmlkbk1heCA9IDA7Ci0gIHN5bWhkci0+aXBkTWF4ID0gMDsKLSAgc3ltaGRyLT5pc3ltTWF4ID0gMDsKLSAgc3ltaGRyLT5pb3B0TWF4ID0gMDsKLSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLSAgc3ltaGRyLT5pc3NNYXggPSAwOwotICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0gIHN5bWhkci0+aWZkTWF4ID0gMDsKLSAgc3ltaGRyLT5jcmZkID0gMDsKLSAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLQotICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZSBkZWJ1Z19pbmZvCi0gICAgIHN0cnVjdHVyZS4gICovCi0gIGRlYnVnLT5saW5lID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2RuciA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9wZHIgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfc3ltID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX29wdCA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9hdXggPSBOVUxMOwotICBkZWJ1Zy0+c3MgPSBOVUxMOwotICBkZWJ1Zy0+c3NleHQgPSBkZWJ1Zy0+c3NleHRfZW5kID0gTlVMTDsKLSAgZGVidWctPmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0gIGRlYnVnLT5leHRlcm5hbF9yZmQgPSBOVUxMOwotICBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0ID0gZGVidWctPmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotCi0gIGhhbmRsZSA9IGJmZF9lY29mZl9kZWJ1Z19pbml0IChhYmZkLCBkZWJ1ZywgJmJhY2tlbmQtPmRlYnVnX3N3YXAsIGluZm8pOwotICBpZiAoaGFuZGxlID09IChQVFIpIE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBzeW1ib2xzIGZyb20gZWFjaCBpbnB1dCBCRkQuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGluZm8tPmlucHV0X2JmZHM7Ci0gICAgICAgaW5wdXRfYmZkICE9IChiZmQgKikgTlVMTDsKLSAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBib29sZWFuIHJldDsKLQotICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JewotCSAgLyogQWJpdHJhcmlseSBzZXQgdGhlIHN5bWJvbGljIGhlYWRlciB2c3RhbXAgdG8gdGhlIHZzdGFtcAotCSAgICAgb2YgdGhlIGZpcnN0IG9iamVjdCBmaWxlIGluIHRoZSBsaW5rLiAgKi8KLQkgIGlmIChzeW1oZHItPnZzdGFtcCA9PSAwKQotCSAgICBzeW1oZHItPnZzdGFtcAotCSAgICAgID0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIudnN0YW1wOwotCSAgcmV0ID0gZWNvZmZfZmluYWxfbGlua19kZWJ1Z19hY2N1bXVsYXRlIChhYmZkLCBpbnB1dF9iZmQsIGluZm8sCi0JCQkJCQkgICBoYW5kbGUpOwotCX0KLSAgICAgIGVsc2UKLQlyZXQgPSBiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZV9vdGhlciAoaGFuZGxlLCBhYmZkLAotCQkJCQkJZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLAotCQkJCQkJaW5wdXRfYmZkLCBpbmZvKTsKLSAgICAgIGlmICghIHJldCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIENvbWJpbmUgdGhlIHJlZ2lzdGVyIG1hc2tzLiAgKi8KLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncHJtYXNrIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmdwcm1hc2s7Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+ZnBybWFzayB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5mcHJtYXNrOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbMF0gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1swXTsKLSAgICAgIGVjb2ZmX2RhdGEgKGFiZmQpLT5jcHJtYXNrWzFdIHw9IGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNwcm1hc2tbMV07Ci0gICAgICBlY29mZl9kYXRhIChhYmZkKS0+Y3BybWFza1syXSB8PSBlY29mZl9kYXRhIChpbnB1dF9iZmQpLT5jcHJtYXNrWzJdOwotICAgICAgZWNvZmZfZGF0YSAoYWJmZCktPmNwcm1hc2tbM10gfD0gZWNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3BybWFza1szXTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgZWluZm8uYWJmZCA9IGFiZmQ7Ci0gIGVpbmZvLmluZm8gPSBpbmZvOwotICBlY29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIGVjb2ZmX2xpbmtfd3JpdGVfZXh0ZXJuYWwsCi0JCQkgICAgKFBUUikgJmVpbmZvKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gbWFrZSBhIHBhc3Mgb3ZlciB0aGUgbGlua19vcmRlcnMgdG8gY291bnQgdXAgdGhlCi0JIG51bWJlciBvZiByZWxvY2F0aW9ucyB3ZSB3aWxsIG5lZWQgdG8gb3V0cHV0LCBzbyB0aGF0IHdlIGtub3cKLQkgaG93IG11Y2ggc3BhY2UgdGhleSB3aWxsIHRha2UgdXAuICAqLwotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkgICAgICBvLT5yZWxvY19jb3VudCArPSBwLT51LmluZGlyZWN0LnNlY3Rpb24tPnJlbG9jX2NvdW50OwotCSAgICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkgICAgICArK28tPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgcmVsb2MgYW5kIHN5bWJvbCBmaWxlIHBvc2l0aW9ucy4gICovCi0gIGVjb2ZmX2NvbXB1dGVfcmVsb2NfZmlsZV9wb3NpdGlvbnMgKGFiZmQpOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX2Vjb2ZmX3dyaXRlX2FjY3VtdWxhdGVkX2RlYnVnIChoYW5kbGUsIGFiZmQsIGRlYnVnLAotCQkJCQkgICAmYmFja2VuZC0+ZGVidWdfc3dhcCwgaW5mbywKLQkJCQkJICAgZWNvZmZfZGF0YSAoYWJmZCktPnN5bV9maWxlcG9zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKGhhbmRsZSwgYWJmZCwgZGVidWcsICZiYWNrZW5kLT5kZWJ1Z19zd2FwLCBpbmZvKTsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIC8qIE5vdyByZXNldCB0aGUgcmVsb2NfY291bnQgZmllbGQgb2YgdGhlIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQKLQkgQkZEIHRvIDAsIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKLQkgcmVsb2NzIHdlIGhhdmUgb3V0cHV0IHRodXMgZmFyLiAgKi8KLSAgICAgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQlvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgfQotCi0gIC8qIEdldCBhIHZhbHVlIGZvciB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBpZiAoZWNvZmZfZGF0YSAoYWJmZCktPmdwID09IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9ncCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JZWNvZmZfZGF0YSAoYWJmZCktPmdwID0gKGgtPnUuZGVmLnZhbHVlCi0JCQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZSBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIGJmZF92bWEgbG87Ci0KLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICBsbyA9IChiZmRfdm1hKSAtMTsKLQkgIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChvLT52bWEgPCBsbwotCQkgICYmIChzdHJjbXAgKG8tPm5hbWUsIF9TQlNTKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX1NEQVRBKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoby0+bmFtZSwgX0xJVDQpID09IDAKLQkJICAgICAgfHwgc3RyY21wIChvLT5uYW1lLCBfTElUOCkgPT0gMAotCQkgICAgICB8fCBzdHJjbXAgKG8tPm5hbWUsIF9MSVRBKSA9PSAwKSkKLQkJbG8gPSBvLT52bWE7Ci0JICAgIH0KLQkgIGVjb2ZmX2RhdGEgKGFiZmQpLT5ncCA9IGxvICsgMHg4MDAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbiBuZWVkcyB0byBkbyBhIHJlbG9jCi0JICAgICBpbnZvbHZpbmcgdGhlIEdQIHZhbHVlLCBpdCBzaG91bGQgbWFrZSBhIHJlbG9jX2Rhbmdlcm91cwotCSAgICAgY2FsbGJhY2sgdG8gd2FybiB0aGF0IEdQIGlzIG5vdCBkZWZpbmVkLiAgKi8KLQl9Ci0gICAgfQotCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cikpCi0JICAgIHsKLQkgICAgICBpZiAoISBlY29mZl9pbmRpcmVjdF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISBlY29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1oZHItPmlleHRNYXggKyBzeW1oZHItPmlzeW1NYXg7Ci0KLSAgZWNvZmZfZGF0YSAoYWJmZCktPmxpbmtlciA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFjY3VtdWxhdGUgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYW4gaW5wdXQgQkZEIGludG8gdGhlCi0gICBvdXRwdXQgQkZELiAgVGhpcyBtdXN0IHJlYWQgaW4gdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIG9mIHRoZQotICAgaW5wdXQgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2ZpbmFsX2xpbmtfZGVidWdfYWNjdW11bGF0ZSAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLCBoYW5kbGUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBQVFIgaGFuZGxlOwotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnID0gJmVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmRlYnVnX2luZm87Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3Qgc3dhcCA9Ci0gICAgJmVjb2ZmX2JhY2tlbmQgKGlucHV0X2JmZCktPmRlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBib29sZWFuIHJldDsKLQotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQl7CQkJCQkJCQlcCi0gICAgICAgICAgcmV0ID0gZmFsc2U7CQkJCQkJCVwKLSAgICAgICAgICBnb3RvIHJldHVybl9zb21ldGhpbmc7CQkJCQlcCi0JfQkJCQkJCQkJXAotICAgICAgaWYgKChiZmRfc2VlayAoaW5wdXRfYmZkLCAoZmlsZV9wdHIpIHN5bWhkci0+b2Zmc2V0LCBTRUVLX1NFVCkJXAotCSAgICE9IDApCQkJCQkJCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWlucHV0X2JmZCkgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpKQkJXAotCXsJCQkJCQkJCVwKLSAgICAgICAgICByZXQgPSBmYWxzZTsJCQkJCQkJXAotICAgICAgICAgIGdvdG8gcmV0dXJuX3NvbWV0aGluZzsJCQkJCVwKLQl9CQkJCQkJCQlcCi0gICAgfQotCi0gIC8qIElmIHJhd19zeW1lbnRzIGlzIG5vdCBOVUxMLCB0aGVuIHRoZSBkYXRhIHdhcyBhbHJlYWR5IGJ5IHJlYWQgYnkKLSAgICAgX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvLiAgKi8KLSAgaWYgKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnJhd19zeW1lbnRzID09IE5VTEwpCi0gICAgewotICAgICAgUkVBRCAobGluZSwgY2JMaW5lT2Zmc2V0LCBjYkxpbmUsIHNpemVvZiAodW5zaWduZWQgY2hhciksCi0JICAgIHVuc2lnbmVkIGNoYXIgKik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9kbnIsIGNiRG5PZmZzZXQsIGlkbk1heCwgc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9zeW0sIGNiU3ltT2Zmc2V0LCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgUFRSKTsKLSAgICAgIFJFQUQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplLCBQVFIpOwotICAgICAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQkgICAgdW5pb24gYXV4X2V4dCAqKTsKLSAgICAgIFJFQUQgKHNzLCBjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhciksIGNoYXIgKik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gICAgICBSRUFEIChleHRlcm5hbF9yZmQsIGNiUmZkT2Zmc2V0LCBjcmZkLCBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSwgUFRSKTsKLSAgICB9Ci0jdW5kZWYgUkVBRAotCi0gIC8qIFdlIGRvIG5vdCByZWFkIHRoZSBleHRlcm5hbCBzdHJpbmdzIG9yIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQotICByZXQgPSAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLQkgKGhhbmRsZSwgb3V0cHV0X2JmZCwgJmVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5kZWJ1Z19pbmZvLAotCSAgJmVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5kZWJ1Z19zd2FwLAotCSAgaW5wdXRfYmZkLCBkZWJ1Zywgc3dhcCwgaW5mbykpOwotCi0gcmV0dXJuX3NvbWV0aGluZzoKLSAgaWYgKGVjb2ZmX2RhdGEgKGlucHV0X2JmZCktPnJhd19zeW1lbnRzID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5saW5lICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmxpbmUpOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9kbnIgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3N5bSAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9zeW0pOwotICAgICAgaWYgKGRlYnVnLT5leHRlcm5hbF9vcHQgIT0gTlVMTCkKLQlmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0KTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gICAgICBpZiAoZGVidWctPnNzICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPnNzKTsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyICE9IE5VTEwpCi0JZnJlZSAoZGVidWctPmV4dGVybmFsX2Zkcik7Ci0gICAgICBpZiAoZGVidWctPmV4dGVybmFsX3JmZCAhPSBOVUxMKQotCWZyZWUgKGRlYnVnLT5leHRlcm5hbF9yZmQpOwotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IGZvbGxvdyBvbmUgb2YgdGhlc2UgcG9pbnRlcnMKLQkgaW50byBmcmVlZCBtZW1vcnkuICAqLwotICAgICAgZGVidWctPmxpbmUgPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX2RuciA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfcGRyID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9zeW0gPSBOVUxMOwotICAgICAgZGVidWctPmV4dGVybmFsX29wdCA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLSAgICAgIGRlYnVnLT5zcyA9IE5VTEw7Ci0gICAgICBkZWJ1Zy0+ZXh0ZXJuYWxfZmRyID0gTlVMTDsKLSAgICAgIGRlYnVnLT5leHRlcm5hbF9yZmQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBQdXQgb3V0IGluZm9ybWF0aW9uIGZvciBhbiBleHRlcm5hbCBzeW1ib2wuICBUaGVzZSBjb21lIG9ubHkgZnJvbQotICAgdGhlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfbGlua193cml0ZV9leHRlcm5hbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBleHRzeW1faW5mbyAqZWluZm8gPSAoc3RydWN0IGV4dHN5bV9pbmZvICopIGRhdGE7Ci0gIGJmZCAqb3V0cHV0X2JmZCA9IGVpbmZvLT5hYmZkOwotICBib29sZWFuIHN0cmlwOwotCi0gIC8qIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhpcyBzeW1ib2wgaXMgYmVpbmcgc3RyaXBwZWQuICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLSAgICBzdHJpcCA9IGZhbHNlOwotICBlbHNlIGlmIChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICAgfHwgKGVpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIGJmZF9oYXNoX2xvb2t1cCAoZWluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICBpZiAoc3RyaXAgfHwgaC0+d3JpdHRlbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+YWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaC0+ZXN5bS5qbXB0YmwgPSAwOwotICAgICAgaC0+ZXN5bS5jb2JvbF9tYWluID0gMDsKLSAgICAgIGgtPmVzeW0ud2Vha2V4dCA9IDA7Ci0gICAgICBoLT5lc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uaWZkID0gaWZkTmlsOwotICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0R2xvYmFsOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBvdXRwdXRfc2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X3NlY3Rpb24tPm93bmVyLCBvdXRwdXRfc2VjdGlvbik7Ci0JCi0JICBpZiAoc3RyY21wIChuYW1lLCBfVEVYVCkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfU0RBVEEpID09IDApCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0RhdGE7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9SREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NSRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX0JTUykgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9TQlNTKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9JTklUKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0luaXQ7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9GSU5JKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0Zpbmk7Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIF9QREFUQSkgPT0gMCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NQRGF0YTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgX1hEQVRBKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1hEYXRhOwotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBfUkNPTlNUKSA9PSAwKQotCSAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1JDb25zdDsKLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0JfQotCi0gICAgICBoLT5lc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotICAgICAgaC0+ZXN5bS5hc3ltLmluZGV4ID0gaW5kZXhOaWw7Ci0gICAgfQotICBlbHNlIGlmIChoLT5lc3ltLmlmZCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0KLSAgICAgIC8qIEFkanVzdCB0aGUgRkRSIGluZGV4IGZvciB0aGUgc3ltYm9sIGJ5IHRoYXQgdXNlZCBmb3IgdGhlCi0JIGlucHV0IEJGRC4gICovCi0gICAgICBkZWJ1ZyA9ICZlY29mZl9kYXRhIChoLT5hYmZkKS0+ZGVidWdfaW5mbzsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPmVzeW0uaWZkID49IDAKLQkJICAmJiBoLT5lc3ltLmlmZCA8IGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLSAgICAgIGgtPmVzeW0uaWZkID0gZGVidWctPmlmZG1hcFtoLT5lc3ltLmlmZF07Ci0gICAgfQotCi0gIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICBhYm9ydCAoKTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjICE9IHNjVW5kZWZpbmVkCi0JICAmJiBoLT5lc3ltLmFzeW0uc2MgIT0gc2NTVW5kZWZpbmVkKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjVW5kZWZpbmVkCi0JICB8fCBoLT5lc3ltLmFzeW0uc2MgPT0gc2NTVW5kZWZpbmVkKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjQ29tbW9uKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQnNzOwotICAgICAgZWxzZSBpZiAoaC0+ZXN5bS5hc3ltLnNjID09IHNjU0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgIT0gc2NDb21tb24KLQkgICYmIGgtPmVzeW0uYXN5bS5zYyAhPSBzY1NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NDb21tb247Ci0gICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSBoLT5yb290LnUuYy5zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IElnbm9yZSB0aGVzZSBmb3Igbm93LiAgVGhlIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2gKLQkgdGhleSBzaG91bGQgYmUgd3JpdHRlbiBvdXQgYXJlIG5vdCBjbGVhciB0byBtZS4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCB1c2VzIGlleHRNYXggdG8ga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc3ltYm9sIG51bWJlci4gICovCi0gIGgtPmluZHggPSBlY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+ZGVidWdfaW5mby5zeW1ib2xpY19oZWFkZXIuaWV4dE1heDsKLSAgaC0+d3JpdHRlbiA9IDE7Ci0KLSAgcmV0dXJuIChiZmRfZWNvZmZfZGVidWdfb25lX2V4dGVybmFsCi0JICAob3V0cHV0X2JmZCwgJmVjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5kZWJ1Z19pbmZvLAotCSAgICZlY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+ZGVidWdfc3dhcCwgaC0+cm9vdC5yb290LnN0cmluZywKLQkgICAmaC0+ZXN5bSkpOwotfQotCi0vKiBSZWxvY2F0ZSBhbmQgd3JpdGUgYW4gRUNPRkYgc2VjdGlvbiBpbnRvIGFuIEVDT0ZGIG91dHB1dCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVjb2ZmX2luZGlyZWN0X2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIGluZm8sIG91dHB1dF9zZWN0aW9uLCBsaW5rX29yZGVyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqc2VjdGlvbl90ZGF0YTsKLSAgYmZkX3NpemVfdHlwZSByYXdfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBjb29rZWRfc2l6ZTsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZWxvY19zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jc19zaXplOwotICBQVFIgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLQotICBCRkRfQVNTRVJUICgob3V0cHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCk7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnNpemUgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgc2VjdGlvbl90ZGF0YSA9IGVjb2ZmX3NlY3Rpb25fZGF0YSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLQotICByYXdfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemU7Ci0gIGlmIChjb29rZWRfc2l6ZSA9PSAwKQotICAgIGNvb2tlZF9zaXplID0gcmF3X3NpemU7Ci0KLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gb3V0cHV0X3NlY3Rpb24pOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ID09IGxpbmtfb3JkZXItPm9mZnNldCk7Ci0gIEJGRF9BU1NFUlQgKGNvb2tlZF9zaXplID09IGxpbmtfb3JkZXItPnNpemUpOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gIFdlIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGxhcmdlciBvZgotICAgICB0aGUgc2l6ZSBiZWZvcmUgcmVsb2NhdGluZyBhbmQgdGhlIHNpemUgYWZ0ZXIgcmVsb2NhdGluZy4gICovCi0gIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHJhd19zaXplID49IGNvb2tlZF9zaXplCi0JCQkJICAgICAgPyAoc2l6ZV90KSByYXdfc2l6ZQotCQkJCSAgICAgIDogKHNpemVfdCkgY29va2VkX3NpemUpOwotICBpZiAoY29udGVudHMgPT0gTlVMTCAmJiByYXdfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIElmIHdlIGFyZSByZWxheGluZywgdGhlIGNvbnRlbnRzIG1heSBoYXZlIGFscmVhZHkgYmVlbiByZWFkIGludG8KLSAgICAgbWVtb3J5LCBpbiB3aGljaCBjYXNlIHdlIGNvcHkgdGhlbSBpbnRvIG91ciBuZXcgYnVmZmVyLiAgV2UgZG9uJ3QKLSAgICAgc2ltcGx5IHJldXNlIHRoZSBvbGQgYnVmZmVyIGluIGNhc2UgY29va2VkX3NpemUgPiByYXdfc2l6ZS4gICovCi0gIGlmIChzZWN0aW9uX3RkYXRhICE9IChzdHJ1Y3QgZWNvZmZfc2VjdGlvbl90ZGF0YSAqKSBOVUxMCi0gICAgICAmJiBzZWN0aW9uX3RkYXRhLT5jb250ZW50cyAhPSAoYmZkX2J5dGUgKikgTlVMTCkKLSAgICBtZW1jcHkgKGNvbnRlbnRzLCBzZWN0aW9uX3RkYXRhLT5jb250ZW50cywgKHNpemVfdCkgcmF3X3NpemUpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgKFBUUikgY29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCByYXdfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgcmVsb2NzLiAgSWYgd2UgYXJlIHJlbGF4aW5nIE1JUFMgY29kZSwgdGhleSB3aWxsIGFscmVhZHkKLSAgICAgaGF2ZSBiZWVuIHJlYWQgaW4uICBPdGhlcndpc2UsIHdlIHJlYWQgdGhlbSBpbiBub3cuICAqLwotICBleHRlcm5hbF9yZWxvY19zaXplID0gZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+ZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgZXh0ZXJuYWxfcmVsb2NzX3NpemUgPSBleHRlcm5hbF9yZWxvY19zaXplICogaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgaWYgKHNlY3Rpb25fdGRhdGEgIT0gKHN0cnVjdCBlY29mZl9zZWN0aW9uX3RkYXRhICopIE5VTEwKLSAgICAgICYmIHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGV4dGVybmFsX3JlbG9jcyA9IHNlY3Rpb25fdGRhdGEtPmV4dGVybmFsX3JlbG9jczsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IChQVFIpIGJmZF9tYWxsb2MgKChzaXplX3QpIGV4dGVybmFsX3JlbG9jc19zaXplKTsKLSAgICAgIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBleHRlcm5hbF9yZWxvY3Nfc2l6ZSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbi0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3JlbG9jcywgMSwgZXh0ZXJuYWxfcmVsb2NzX3NpemUsIGlucHV0X2JmZCkKLQkgICAgICAhPSBleHRlcm5hbF9yZWxvY3Nfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFJlbG9jYXRlIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgaWYgKCEgKCgqZWNvZmZfYmFja2VuZCAoaW5wdXRfYmZkKS0+cmVsb2NhdGVfc2VjdGlvbikKLQkgKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsCi0JICBleHRlcm5hbF9yZWxvY3MpKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jYXRlZCBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLAotCQkJCSAgb3V0cHV0X3NlY3Rpb24sCi0JCQkJICAoUFRSKSBjb250ZW50cywKLQkJCQkgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCQkJICBjb29rZWRfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGUgcmVsb2NzIHdlcmUKLSAgICAgbW9kaWZpZWQsIGFuZCB3ZSB3cml0ZSB0aGVtIG91dCBub3cuICBXZSB1c2UgdGhlIHJlbG9jX2NvdW50Ci0gICAgIGZpZWxkIG9mIG91dHB1dF9zZWN0aW9uIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3Mgd2UKLSAgICAgaGF2ZSBvdXRwdXQgc28gZmFyLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgICAob3V0cHV0X3NlY3Rpb24tPnJlbF9maWxlcG9zICsKLQkJICAgICBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKiBleHRlcm5hbF9yZWxvY19zaXplKSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3dyaXRlIChleHRlcm5hbF9yZWxvY3MsIDEsIGV4dGVybmFsX3JlbG9jc19zaXplLCBvdXRwdXRfYmZkKQotCSAgICAgICE9IGV4dGVybmFsX3JlbG9jc19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCArPSBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKGNvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoY29udGVudHMpOwotICBpZiAoZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwgJiYgc2VjdGlvbl90ZGF0YSA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jcyk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCAmJiBzZWN0aW9uX3RkYXRhID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfcmVsb2NzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBHZW5lcmF0ZSBhIHJlbG9jIHdoZW4gbGlua2luZyBhbiBFQ09GRiBmaWxlLiAgVGhpcyBpcyBhIHJlbG9jCi0gICByZXF1ZXN0ZWQgYnkgdGhlIGxpbmtlciwgYW5kIGRvZXMgY29tZSBmcm9tIGFueSBpbnB1dCBmaWxlLiAgVGhpcwotICAgaXMgdXNlZCB0byBidWlsZCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMgd2hlbiBsaW5raW5nCi0gICB3aXRoIC1Vci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGVudW0gYmZkX2xpbmtfb3JkZXJfdHlwZSB0eXBlOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIGFyZWxlbnQgcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgaW47Ci0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgYmZkX2J5dGUgKnJidWY7Ci0gIGJvb2xlYW4gb2s7Ci0KLSAgdHlwZSA9IGxpbmtfb3JkZXItPnR5cGU7Ci0gIHNlY3Rpb24gPSBOVUxMOwotICBhZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLQotICAvKiBXZSBzZXQgdXAgYW4gYXJlbGVudCB0byBwYXNzIHRvIHRoZSBiYWNrZW5kIGFkanVzdF9yZWxvY19vdXQKLSAgICAgcm91dGluZS4gICovCi0gIHJlbC5hZGRyZXNzID0gbGlua19vcmRlci0+b2Zmc2V0OwotCi0gIHJlbC5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT5yZWxvYyk7Ci0gIGlmIChyZWwuaG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKHR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBzZWN0aW9uID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb247Ci0gICAgICByZWwuc3ltX3B0cl9wdHIgPSBzZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogVHJlYXQgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wgYXMgdGhvdWdoIGl0IHdlcmUKLSAgICAgICAgIGFjdHVhbGx5IGFnYWluc3QgdGhlIHNlY3Rpb24uICAqLwotICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGluZm8sCi0JCQkJCWxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQl7Ci0JICB0eXBlID0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjsKLQkgIHNlY3Rpb24gPSBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQkgIC8qIEl0IHNlZW1zIHRoYXQgd2Ugb3VnaHQgdG8gYWRkIHRoZSBzeW1ib2wgdmFsdWUgdG8gdGhlCi0gICAgICAgICAgICAgYWRkZW5kIGhlcmUsIGJ1dCBpbiBwcmFjdGljZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgYmVjYXVzZSBpdCB3YXMgcGFzc2VkIHRvIGNvbnN0cnVjdG9yX2NhbGxiYWNrLiAgKi8KLQkgIGFkZGVuZCArPSBzZWN0aW9uLT52bWEgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBjYW4ndCBzZXQgdXAgYSByZWxvYyBhZ2FpbnN0IGEgc3ltYm9sIGNvcnJlY3RseSwKLQkgICAgIGJlY2F1c2Ugd2UgaGF2ZSBubyBhc3ltYm9sIHN0cnVjdHVyZS4gIEN1cnJlbnRseSBubwotCSAgICAgYWRqdXN0X3JlbG9jX291dCByb3V0aW5lIGNhcmVzLiAgKi8KLQkgIHJlbC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogQWxsIEVDT0ZGIHJlbG9jcyBhcmUgaW4tcGxhY2UuICBQdXQgdGhlIGFkZGVuZCBpbnRvIHRoZSBvYmplY3QKLSAgICAgZmlsZS4gICovCi0KLSAgQkZEX0FTU0VSVCAocmVsLmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UpOwotICBpZiAoYWRkZW5kICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbC5ob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKHJlbC5ob3d0bywgb3V0cHV0X2JmZCwgYWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywKLQkJICAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgID8gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwgc2VjdGlvbikKLQkJICAgOiBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSksCi0JCSAgcmVsLmhvd3RvLT5uYW1lLCBhZGRlbmQsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJlbC5hZGRlbmQgPSAwOwotCi0gIC8qIE1vdmUgdGhlIGluZm9ybWF0aW9uIGludG8gYSBpbnRlcm5hbF9yZWxvYyBzdHJ1Y3R1cmUuICAqLwotICBpbi5yX3ZhZGRyID0gKHJlbC5hZGRyZXNzCi0JCSsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pKTsKLSAgaW4ucl90eXBlID0gcmVsLmhvd3RvLT50eXBlOwotCi0gIGlmICh0eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gKChzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiBoLT5pbmR4ICE9IC0xKQotCWluLnJfc3ltbmR4ID0gaC0+aW5keDsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCSAoaW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsIChiZmQgKikgTlVMTCwKLQkJICAoYXNlY3Rpb24gKikgTlVMTCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW4ucl9zeW1uZHggPSAwOwotCX0KLSAgICAgIGluLnJfZXh0ZXJuID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBDT05TVCBjaGFyICpuYW1lOwotCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIHNlY3Rpb24pOwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi50ZXh0IikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fVEVYVDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JEQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9EQVRBOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fU0RBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1NCU1M7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQlNTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9JTklUOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDgiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ4OwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9MSVQ0OwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnhkYXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fWERBVEE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucGRhdGEiKSA9PSAwKQotCWluLnJfc3ltbmR4ID0gUkVMT0NfU0VDVElPTl9QREFUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5maW5pIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fRklOSTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5saXRhIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fTElUQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIipBQlMqIikgPT0gMCkKLQlpbi5yX3N5bW5keCA9IFJFTE9DX1NFQ1RJT05fQUJTOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJjb25zdCIpID09IDApCi0JaW4ucl9zeW1uZHggPSBSRUxPQ19TRUNUSU9OX1JDT05TVDsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICAgIGluLnJfZXh0ZXJuID0gMDsKLSAgICB9Ci0KLSAgLyogTGV0IHRoZSBCRkQgYmFja2VuZCBhZGp1c3QgdGhlIHJlbG9jLiAgKi8KLSAgKCplY29mZl9iYWNrZW5kIChvdXRwdXRfYmZkKS0+YWRqdXN0X3JlbG9jX291dCkgKG91dHB1dF9iZmQsICZyZWwsICZpbik7Ci0KLSAgLyogR2V0IHNvbWUgbWVtb3J5IGFuZCBzd2FwIG91dCB0aGUgcmVsb2MuICAqLwotICBleHRlcm5hbF9yZWxvY19zaXplID0gZWNvZmZfYmFja2VuZCAob3V0cHV0X2JmZCktPmV4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0gIGlmIChyYnVmID09IChiZmRfYnl0ZSAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAoKmVjb2ZmX2JhY2tlbmQgKG91dHB1dF9iZmQpLT5zd2FwX3JlbG9jX291dCkgKG91dHB1dF9iZmQsICZpbiwgKFBUUikgcmJ1Zik7Ci0KLSAgb2sgPSAoYmZkX3NlZWsgKG91dHB1dF9iZmQsCi0JCSAgKG91dHB1dF9zZWN0aW9uLT5yZWxfZmlsZXBvcyArCi0JCSAgIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCAqIGV4dGVybmFsX3JlbG9jX3NpemUpLAotCQkgIFNFRUtfU0VUKSA9PSAwCi0JJiYgKGJmZF93cml0ZSAoKFBUUikgcmJ1ZiwgMSwgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSwgb3V0cHV0X2JmZCkKLQkgICAgPT0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZSkpOwotCi0gIGlmIChvaykKLSAgICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICBmcmVlIChyYnVmKTsKLQotICByZXR1cm4gb2s7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWNvZmZsaW5rLmMgYi9iZmQvZWNvZmZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMjBhMmIuLjAwMDAwMDAKLS0tIGEvYmZkL2Vjb2ZmbGluay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5OSArMCwwIEBACi0vKiBSb3V0aW5lcyB0byBsaW5rIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydCwgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0MCi1zdGF0aWMgYm9vbGVhbiBlY29mZl9hZGRfYnl0ZXMgUEFSQU1TICgoY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkJCQkJc2l6ZV90IG5lZWQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0cmluZ19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCSAgIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfYWxpZ25fZGVidWcgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCSAgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWcsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwKSk7Ci1zdGF0aWMgYm9vbGVhbiBlY29mZl93cml0ZV9zeW1oZHIgUEFSQU1TICgoYmZkICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICosCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICosCi0JCQkJCSAgIGZpbGVfcHRyIHdoZXJlKSk7Ci1zdGF0aWMgaW50IGNtcF9mZHJ0YWJfZW50cnkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIG1rX2ZkcnRhYiBQQVJBTVMgKChiZmQgKiwKLQkJCQkgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCi0JCQkJICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0LAotCQkJCSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKSk7Ci1zdGF0aWMgbG9uZyBmZHJ0YWJfbG9va3VwIFBBUkFNUyAoKHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbG9va3VwX2xpbmUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqKSk7Ci0MCi0vKiBSb3V0aW5lcyB0byBzd2FwIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0LiAgSSBhbSBhc3N1bWluZwotICAgdGhhdCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIGZvcm1hdCBpcyBhbHdheXMgZ29pbmcgdG8gYmUgdGFyZ2V0Ci0gICBpbmRlcGVuZGVudC4gICovCi0KLS8qIFN3YXAgaW4gYSB0eXBlIGluZm9ybWF0aW9uIHJlY29yZC4KLSAgIEJJR0VORCBzYXlzIHdoZXRoZXIgQVVYIHN5bWJvbHMgYXJlIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbjsgdGhpcwotICAgaW5mbyBjb21lcyBmcm9tIHRoZSBmaWxlIGhlYWRlciByZWNvcmQgKGZoLWZCaWdlbmRpYW4pLiAgKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiAoYmlnZW5kLCBleHRfY29weSwgaW50ZXJuKQotICAgICBpbnQgYmlnZW5kOwotICAgICBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqZXh0X2NvcHk7Ci0gICAgIFRJUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgdGlyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICpleHRfY29weTsJCS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmlnZW5kKSB7Ci0gICAgaW50ZXJuLT5mQml0ZmllbGQgICA9IDAgIT0gKGV4dC0+dF9iaXRzMVswXSAmIFRJUl9CSVRTMV9GQklURklFTERfQklHKTsKLSAgICBpbnRlcm4tPmNvbnRpbnVlZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0NPTlRJTlVFRF9CSUcpOwotICAgIGludGVybi0+YnQgICAgICAgICAgPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0JUX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFMxX0JUX1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxNCAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE0X0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFE0X1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxNSAgICAgICAgID0gKGV4dC0+dF90cTQ1WzBdICYgVElSX0JJVFNfVFE1X0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFE1X1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxMCAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFEwX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEwX1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxMSAgICAgICAgID0gKGV4dC0+dF90cTAxWzBdICYgVElSX0JJVFNfVFExX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFExX1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxMiAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEyX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEyX1NIX0JJRzsKLSAgICBpbnRlcm4tPnRxMyAgICAgICAgID0gKGV4dC0+dF90cTIzWzBdICYgVElSX0JJVFNfVFEzX0JJRykKLQkJCT4+CQkgICAgVElSX0JJVFNfVFEzX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPmZCaXRmaWVsZCAgID0gMCAhPSAoZXh0LT50X2JpdHMxWzBdICYgVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUpOwotICAgIGludGVybi0+Y29udGludWVkICAgPSAwICE9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5idCAgICAgICAgICA9IChleHQtPnRfYml0czFbMF0gJiBUSVJfQklUUzFfQlRfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUUzFfQlRfU0hfTElUVExFOwotICAgIGludGVybi0+dHE0ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTRfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTRfU0hfTElUVExFOwotICAgIGludGVybi0+dHE1ICAgICAgICAgPSAoZXh0LT50X3RxNDVbMF0gJiBUSVJfQklUU19UUTVfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTVfU0hfTElUVExFOwotICAgIGludGVybi0+dHEwICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTBfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTBfU0hfTElUVExFOwotICAgIGludGVybi0+dHExICAgICAgICAgPSAoZXh0LT50X3RxMDFbMF0gJiBUSVJfQklUU19UUTFfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTFfU0hfTElUVExFOwotICAgIGludGVybi0+dHEyICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTJfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTJfU0hfTElUVExFOwotICAgIGludGVybi0+dHEzICAgICAgICAgPSAoZXh0LT50X3RxMjNbMF0gJiBUSVJfQklUU19UUTNfTElUVExFKQotCQkJPj4JCSAgICBUSVJfQklUU19UUTNfU0hfTElUVExFOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgdHlwZSBpbmZvcm1hdGlvbiByZWNvcmQuCi0gICBCSUdFTkQgc2F5cyB3aGV0aGVyIEFVWCBzeW1ib2xzIGFyZSBiaWctZW5kaWFuIG9yIGxpdHRsZS1lbmRpYW47IHRoaXMKLSAgIGluZm8gY29tZXMgZnJvbSB0aGUgZmlsZSBoZWFkZXIgcmVjb3JkIChmaC1mQmlnZW5kaWFuKS4gICovCi0KLXZvaWQKLV9iZmRfZWNvZmZfc3dhcF90aXJfb3V0IChiaWdlbmQsIGludGVybl9jb3B5LCBleHQpCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IFRJUiAqaW50ZXJuX2NvcHk7Ci0gICAgIHN0cnVjdCB0aXJfZXh0ICpleHQ7Ci17Ci0gIFRJUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBleHQtPnRfYml0czFbMF0gPSAoKGludGVybi0+ZkJpdGZpZWxkID8gVElSX0JJVFMxX0ZCSVRGSUVMRF9CSUcgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5jb250aW51ZWQgPyBUSVJfQklUUzFfQ09OVElOVUVEX0JJRyA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5idCA8PCBUSVJfQklUUzFfQlRfU0hfQklHKQotCQkJICAmIFRJUl9CSVRTMV9CVF9CSUcpKTsKLSAgICBleHQtPnRfdHE0NVswXSA9ICgoKGludGVybi0+dHE0IDw8IFRJUl9CSVRTX1RRNF9TSF9CSUcpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRNF9CSUcpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxNSA8PCBUSVJfQklUU19UUTVfU0hfQklHKQotCQkJICYgVElSX0JJVFNfVFE1X0JJRykpOwotICAgIGV4dC0+dF90cTAxWzBdID0gKCgoaW50ZXJuLT50cTAgPDwgVElSX0JJVFNfVFEwX1NIX0JJRykKLQkJICAgICAgICYgVElSX0JJVFNfVFEwX0JJRykKLQkJICAgICAgfCAoKGludGVybi0+dHExIDw8IFRJUl9CSVRTX1RRMV9TSF9CSUcpCi0JCQkgJiBUSVJfQklUU19UUTFfQklHKSk7Ci0gICAgZXh0LT50X3RxMjNbMF0gPSAoKChpbnRlcm4tPnRxMiA8PCBUSVJfQklUU19UUTJfU0hfQklHKQotCQkgICAgICAgJiBUSVJfQklUU19UUTJfQklHKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTMgPDwgVElSX0JJVFNfVFEzX1NIX0JJRykKLQkJCSAmIFRJUl9CSVRTX1RRM19CSUcpKTsKLSAgfSBlbHNlIHsKLSAgICBleHQtPnRfYml0czFbMF0gPSAoKGludGVybi0+ZkJpdGZpZWxkID8gVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUgOiAwKQotCQkgICAgICAgfCAoaW50ZXJuLT5jb250aW51ZWQgPyBUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRSA6IDApCi0JCSAgICAgICB8ICgoaW50ZXJuLT5idCA8PCBUSVJfQklUUzFfQlRfU0hfTElUVExFKQotCQkJICAmIFRJUl9CSVRTMV9CVF9MSVRUTEUpKTsKLSAgICBleHQtPnRfdHE0NVswXSA9ICgoKGludGVybi0+dHE0IDw8IFRJUl9CSVRTX1RRNF9TSF9MSVRUTEUpCi0JCSAgICAgICAmIFRJUl9CSVRTX1RRNF9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPnRxNSA8PCBUSVJfQklUU19UUTVfU0hfTElUVExFKQotCQkJICYgVElSX0JJVFNfVFE1X0xJVFRMRSkpOwotICAgIGV4dC0+dF90cTAxWzBdID0gKCgoaW50ZXJuLT50cTAgPDwgVElSX0JJVFNfVFEwX1NIX0xJVFRMRSkKLQkJICAgICAgICYgVElSX0JJVFNfVFEwX0xJVFRMRSkKLQkJICAgICAgfCAoKGludGVybi0+dHExIDw8IFRJUl9CSVRTX1RRMV9TSF9MSVRUTEUpCi0JCQkgJiBUSVJfQklUU19UUTFfTElUVExFKSk7Ci0gICAgZXh0LT50X3RxMjNbMF0gPSAoKChpbnRlcm4tPnRxMiA8PCBUSVJfQklUU19UUTJfU0hfTElUVExFKQotCQkgICAgICAgJiBUSVJfQklUU19UUTJfTElUVExFKQotCQkgICAgICB8ICgoaW50ZXJuLT50cTMgPDwgVElSX0JJVFNfVFEzX1NIX0xJVFRMRSkKLQkJCSAmIFRJUl9CSVRTX1RRM19MSVRUTEUpKTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIGluIGEgcmVsYXRpdmUgc3ltYm9sIHJlY29yZC4gIEJJR0VORCBzYXlzIHdoZXRoZXIgaXQgaXMgaW4KLSAgIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXQuKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4gKGJpZ2VuZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgaW50IGJpZ2VuZDsKLSAgICAgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICpleHRfY29weTsKLSAgICAgUk5EWFIgKmludGVybjsKLXsKLSAgc3RydWN0IHJuZHhfZXh0IGV4dFsxXTsKLQotICAqZXh0ID0gKmV4dF9jb3B5OwkJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiaWdlbmQpIHsKLSAgICBpbnRlcm4tPnJmZCAgID0gKGV4dC0+cl9iaXRzWzBdIDw8IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfQklHKQotCQkgIHwgKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfUkZEX0JJRykKLQkJICAgIAkJICAgID4+IFJORFhfQklUUzFfUkZEX1NIX0JJRyk7Ci0gICAgaW50ZXJuLT5pbmRleCA9ICgoZXh0LT5yX2JpdHNbMV0gJiBSTkRYX0JJVFMxX0lOREVYX0JJRykKLQkJICAgIAkJICAgIDw8IFJORFhfQklUUzFfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCSAgfCAoZXh0LT5yX2JpdHNbMl0gPDwgUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRykKLQkJICB8IChleHQtPnJfYml0c1szXSA8PCBSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHKTsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPnJmZCAgID0gKGV4dC0+cl9iaXRzWzBdIDw8IFJORFhfQklUUzBfUkZEX1NIX0xFRlRfTElUVExFKQotCQkgIHwgKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfUkZEX0xJVFRMRSkKLQkJICAgIAkJICAgIDw8IFJORFhfQklUUzFfUkZEX1NIX0xFRlRfTElUVExFKTsKLSAgICBpbnRlcm4tPmluZGV4ID0gKChleHQtPnJfYml0c1sxXSAmIFJORFhfQklUUzFfSU5ERVhfTElUVExFKQotCQkgICAgCQkgICAgPj4gUk5EWF9CSVRTMV9JTkRFWF9TSF9MSVRUTEUpCi0JCSAgfCAoZXh0LT5yX2JpdHNbMl0gPDwgUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRSkKLQkJICB8ICgodW5zaWduZWQgaW50KSBleHQtPnJfYml0c1szXQotCQkgICAgIDw8IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUpOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGEgcmVsYXRpdmUgc3ltYm9sIHJlY29yZC4gIEJJR0VORCBzYXlzIHdoZXRoZXIgaXQgaXMgaW4KLSAgIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbiBmb3JtYXQuKi8KLQotdm9pZAotX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0IChiaWdlbmQsIGludGVybl9jb3B5LCBleHQpCi0gICAgIGludCBiaWdlbmQ7Ci0gICAgIGNvbnN0IFJORFhSICppbnRlcm5fY29weTsKLSAgICAgc3RydWN0IHJuZHhfZXh0ICpleHQ7Ci17Ci0gIFJORFhSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJpZ2VuZCkgewotICAgIGV4dC0+cl9iaXRzWzBdID0gaW50ZXJuLT5yZmQgPj4gUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9CSUc7Ci0gICAgZXh0LT5yX2JpdHNbMV0gPSAoKChpbnRlcm4tPnJmZCA8PCBSTkRYX0JJVFMxX1JGRF9TSF9CSUcpCi0JCSAgICAgICAmIFJORFhfQklUUzFfUkZEX0JJRykKLQkJICAgICAgfCAoKGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMV9JTkRFWF9TSF9MRUZUX0JJRykKLQkJCSAmIFJORFhfQklUUzFfSU5ERVhfQklHKSk7Ci0gICAgZXh0LT5yX2JpdHNbMl0gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9CSUc7Ci0gICAgZXh0LT5yX2JpdHNbM10gPSBpbnRlcm4tPmluZGV4ID4+IFJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9CSUc7Ci0gIH0gZWxzZSB7Ci0gICAgZXh0LT5yX2JpdHNbMF0gPSBpbnRlcm4tPnJmZCA+PiBSTkRYX0JJVFMwX1JGRF9TSF9MRUZUX0xJVFRMRTsKLSAgICBleHQtPnJfYml0c1sxXSA9ICgoKGludGVybi0+cmZkID4+IFJORFhfQklUUzFfUkZEX1NIX0xFRlRfTElUVExFKQotCQkgICAgICAgJiBSTkRYX0JJVFMxX1JGRF9MSVRUTEUpCi0JCSAgICAgIHwgKChpbnRlcm4tPmluZGV4IDw8IFJORFhfQklUUzFfSU5ERVhfU0hfTElUVExFKQotCQkJICYgUk5EWF9CSVRTMV9JTkRFWF9MSVRUTEUpKTsKLSAgICBleHQtPnJfYml0c1syXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRTsKLSAgICBleHQtPnJfYml0c1szXSA9IGludGVybi0+aW5kZXggPj4gUk5EWF9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRTsKLSAgfQotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotDAotLyogVGhlIG1pbmltdW0gYW1vdW50IG9mIGRhdGEgdG8gYWxsb2NhdGUuICAqLwotI2RlZmluZSBBTExPQ19TSVpFICg0MDY0KQotCi0vKiBBZGQgYnl0ZXMgdG8gYSBidWZmZXIuICBSZXR1cm4gc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLCBuZWVkKQotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICBzaXplX3QgbmVlZDsKLXsKLSAgc2l6ZV90IGhhdmU7Ci0gIHNpemVfdCB3YW50OwotICBjaGFyICpuZXdidWY7Ci0KLSAgaGF2ZSA9ICpidWZlbmQgLSAqYnVmOwotICBpZiAoaGF2ZSA+IG5lZWQpCi0gICAgd2FudCA9IEFMTE9DX1NJWkU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3YW50ID0gbmVlZCAtIGhhdmU7Ci0gICAgICBpZiAod2FudCA8IEFMTE9DX1NJWkUpCi0Jd2FudCA9IEFMTE9DX1NJWkU7Ci0gICAgfQotICBuZXdidWYgPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAoKmJ1ZiwgaGF2ZSArIHdhbnQpOwotICBpZiAobmV3YnVmID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqYnVmID0gbmV3YnVmOwotICAqYnVmZW5kID0gKmJ1ZiArIGhhdmUgKyB3YW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2Uga2VlcCBhIGhhc2ggdGFibGUgd2hpY2ggbWFwcyBzdHJpbmdzIHRvIG51bWJlcnMuICBXZSB1c2UgaXQgdG8KLSAgIG1hcCBGRFIgbmFtZXMgdG8gaW5kaWNlcyBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCB0byBtYXAgbG9jYWwKLSAgIHN0cmluZ3Mgd2hlbiBjb21iaW5pbmcgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBGRFIgaW5kZXggb3Igc3RyaW5nIHRhYmxlIG9mZnNldC4gICovCi0gIGxvbmcgdmFsOwotICAvKiBOZXh0IGVudHJ5IGluIHN0cmluZyB0YWJsZS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqbmV4dDsKLX07Ci0KLXN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci19OwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1zdHJpbmdfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dmFsID0gLTE7Ci0gICAgICByZXQtPm5leHQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN0cmluZ19oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIFdlIGNhbid0IGFmZm9yZCB0byByZWFkIGluIGFsbCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoZW4gd2UgZG8KLSAgIGEgbGluay4gIEluc3RlYWQsIHdlIGJ1aWxkIGEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIHRvIHNob3cgaG93Ci0gICBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGlucHV0IGZpbGUgbWFwIHRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0cnVjdCBzaHVmZmxlCi17Ci0gIC8qIFRoZSBuZXh0IGVudHJ5IGluIHRoaXMgbGlua2VkIGxpc3QuICAqLwotICBzdHJ1Y3Qgc2h1ZmZsZSAqbmV4dDsKLSAgLyogVGhlIGxlbmd0aCBvZiB0aGUgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIHNpemU7Ci0gIC8qIFdoZXRoZXIgdGhpcyBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIGEgZmlsZSBvciBub3QuICAqLwotICBib29sZWFuIGZpbGVwOwotICB1bmlvbgotICAgIHsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIFRoZSBCRkQgdGhlIGRhdGEgY29tZXMgZnJvbS4gICovCi0JICBiZmQgKmlucHV0X2JmZDsKLQkgIC8qIFRoZSBvZmZzZXQgd2l0aGluIGlucHV0X2JmZC4gICovCi0JICBmaWxlX3B0ciBvZmZzZXQ7Ci0JfSBmaWxlOwotICAgICAgLyogVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiBvdXQuICAqLwotICAgICAgUFRSIG1lbW9yeTsKLSAgICB9IHU7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBhY3Jvc3MgY2FsbHMgdG8KLSAgIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlLiAgKi8KLQotc3RydWN0IGFjY3VtdWxhdGUKLXsKLSAgLyogVGhlIEZEUiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIGZkcl9oYXNoOwotICAvKiBUaGUgc3RyaW5ncyBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlIHN0cl9oYXNoOwotICAvKiBMaW5rZWQgbGlzdHMgZGVzY3JpYmluZyBob3cgdG8gc2h1ZmZsZSB0aGUgaW5wdXQgZGVidWcKLSAgICAgaW5mb3JtYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBrZWVwIGEgcG9pbnRlciB0byBib3RoIHRoZQotICAgICBoZWFkIGFuZCB0aGUgdGFpbC4gICovCi0gIHN0cnVjdCBzaHVmZmxlICpsaW5lOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqbGluZV9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpwZHI7Ci0gIHN0cnVjdCBzaHVmZmxlICpwZHJfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqc3ltOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqc3ltX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKm9wdDsKLSAgc3RydWN0IHNodWZmbGUgKm9wdF9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICphdXg7Ci0gIHN0cnVjdCBzaHVmZmxlICphdXhfZW5kOwotICBzdHJ1Y3Qgc2h1ZmZsZSAqc3M7Ci0gIHN0cnVjdCBzaHVmZmxlICpzc19lbmQ7Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc3NfaGFzaDsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzc19oYXNoX2VuZDsKLSAgc3RydWN0IHNodWZmbGUgKmZkcjsKLSAgc3RydWN0IHNodWZmbGUgKmZkcl9lbmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpyZmQ7Ci0gIHN0cnVjdCBzaHVmZmxlICpyZmRfZW5kOwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBmaWxlIHNodWZmbGUuICAqLwotICB1bnNpZ25lZCBsb25nIGxhcmdlc3RfZmlsZV9zaHVmZmxlOwotICAvKiBBbiBvYmphbGxvYyBmb3IgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IG9iamFsbG9jICptZW1vcnk7Ci19OwotCi0vKiBBZGQgYSBmaWxlIGVudHJ5IHRvIGEgc2h1ZmZsZSBsaXN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gYWRkX2ZpbGVfc2h1ZmZsZSBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAotCQkJCSAgICAgIHN0cnVjdCBzaHVmZmxlICoqLAotCQkJCSAgICAgIHN0cnVjdCBzaHVmZmxlICoqLCBiZmQgKiwgZmlsZV9wdHIsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZykpOwotCi1zdGF0aWMgYm9vbGVhbgotYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sIGhlYWQsIHRhaWwsIGlucHV0X2JmZCwgb2Zmc2V0LCBzaXplKQotICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87Ci0gICAgIHN0cnVjdCBzaHVmZmxlICoqaGVhZDsKLSAgICAgc3RydWN0IHNodWZmbGUgKip0YWlsOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci17Ci0gIHN0cnVjdCBzaHVmZmxlICpuOwotCi0gIGlmICgqdGFpbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTAotICAgICAgJiYgKCp0YWlsKS0+ZmlsZXAKLSAgICAgICYmICgqdGFpbCktPnUuZmlsZS5pbnB1dF9iZmQgPT0gaW5wdXRfYmZkCi0gICAgICAmJiAoKnRhaWwpLT51LmZpbGUub2Zmc2V0ICsgKCp0YWlsKS0+c2l6ZSA9PSAodW5zaWduZWQgbG9uZykgb2Zmc2V0KQotICAgIHsKLSAgICAgIC8qIEp1c3QgbWVyZ2UgdGhpcyBlbnRyeSBvbnRvIHRoZSBleGlzdGluZyBvbmUuICAqLwotICAgICAgKCp0YWlsKS0+c2l6ZSArPSBzaXplOwotICAgICAgaWYgKCgqdGFpbCktPnNpemUgPiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpCi0JYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlID0gKCp0YWlsKS0+c2l6ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBuID0gKHN0cnVjdCBzaHVmZmxlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LAotCQkJCQkgc2l6ZW9mIChzdHJ1Y3Qgc2h1ZmZsZSkpOwotICBpZiAoIW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+c2l6ZSA9IHNpemU7Ci0gIG4tPmZpbGVwID0gdHJ1ZTsKLSAgbi0+dS5maWxlLmlucHV0X2JmZCA9IGlucHV0X2JmZDsKLSAgbi0+dS5maWxlLm9mZnNldCA9IG9mZnNldDsKLSAgaWYgKCpoZWFkID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICpoZWFkID0gbjsKLSAgaWYgKCp0YWlsICE9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKQotICAgICgqdGFpbCktPm5leHQgPSBuOwotICAqdGFpbCA9IG47Ci0gIGlmIChzaXplID4gYWluZm8tPmxhcmdlc3RfZmlsZV9zaHVmZmxlKQotICAgIGFpbmZvLT5sYXJnZXN0X2ZpbGVfc2h1ZmZsZSA9IHNpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBtZW1vcnkgZW50cnkgdG8gYSBzaHVmZmxlIGxpc3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfbWVtb3J5X3NodWZmbGUgUEFSQU1TICgoc3RydWN0IGFjY3VtdWxhdGUgKiwKLQkJCQkJICAgc3RydWN0IHNodWZmbGUgKipoZWFkLAotCQkJCQkgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWwsCi0JCQkJCSAgIGJmZF9ieXRlICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpKTsKLQotc3RhdGljIGJvb2xlYW4KLWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sIGhlYWQsIHRhaWwsIGRhdGEsIHNpemUpCi0gICAgIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbzsKLSAgICAgc3RydWN0IHNodWZmbGUgKipoZWFkOwotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqKnRhaWw7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci17Ci0gIHN0cnVjdCBzaHVmZmxlICpuOwotICAgICAKLSAgbiA9IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKLQkJCQkJIHNpemVvZiAoc3RydWN0IHNodWZmbGUpKTsKLSAgaWYgKCFuKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbi0+bmV4dCA9IE5VTEw7Ci0gIG4tPnNpemUgPSBzaXplOwotICBuLT5maWxlcCA9IGZhbHNlOwotICBuLT51Lm1lbW9yeSA9IChQVFIpIGRhdGE7Ci0gIGlmICgqaGVhZCA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKLSAgICAqaGVhZCA9IG47Ci0gIGlmICgqdGFpbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCkKLSAgICAoKnRhaWwpLT5uZXh0ID0gbjsKLSAgKnRhaWwgPSBuOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5pdGlhbGl6ZSB0aGUgRkRSIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgYSBoYW5kbGUgd2hpY2ggaXMgdGhlbgotICAgcGFzc2VkIGluIHRvIGJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlLCBldC4gYWwuICAqLwotCi0vKkFSR1NVU0VEKi8KLVBUUgotYmZkX2Vjb2ZmX2RlYnVnX2luaXQgKG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvOwotCi0gIGFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGFjY3VtdWxhdGUpKTsKLSAgaWYgKCFhaW5mbykKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdF9uICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jLAotCQkJICAgICAgIDEwMjEpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFpbmZvLT5saW5lID0gTlVMTDsKLSAgYWluZm8tPmxpbmVfZW5kID0gTlVMTDsKLSAgYWluZm8tPnBkciA9IE5VTEw7Ci0gIGFpbmZvLT5wZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnN5bSA9IE5VTEw7Ci0gIGFpbmZvLT5zeW1fZW5kID0gTlVMTDsKLSAgYWluZm8tPm9wdCA9IE5VTEw7Ci0gIGFpbmZvLT5vcHRfZW5kID0gTlVMTDsKLSAgYWluZm8tPmF1eCA9IE5VTEw7Ci0gIGFpbmZvLT5hdXhfZW5kID0gTlVMTDsKLSAgYWluZm8tPnNzID0gTlVMTDsKLSAgYWluZm8tPnNzX2VuZCA9IE5VTEw7Ci0gIGFpbmZvLT5zc19oYXNoID0gTlVMTDsKLSAgYWluZm8tPnNzX2hhc2hfZW5kID0gTlVMTDsKLSAgYWluZm8tPmZkciA9IE5VTEw7Ci0gIGFpbmZvLT5mZHJfZW5kID0gTlVMTDsKLSAgYWluZm8tPnJmZCA9IE5VTEw7Ci0gIGFpbmZvLT5yZmRfZW5kID0gTlVMTDsKLQotICBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgPSAwOwotCi0gIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmYWluZm8tPnN0cl9oYXNoLnRhYmxlLCBzdHJpbmdfaGFzaF9uZXdmdW5jKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgLyogVGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzdHJpbmcgdGFibGUgaXMgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gICAgICBvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NNYXggPSAxOwotICAgIH0KLQotICBhaW5mby0+bWVtb3J5ID0gb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAoYWluZm8tPm1lbW9yeSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoUFRSKSBhaW5mbzsKLX0KLQotLyogRnJlZSB0aGUgYWNjdW11bGF0ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1iZmRfZWNvZmZfZGVidWdfZnJlZSAoaGFuZGxlLCBvdXRwdXRfYmZkLCBvdXRwdXRfZGVidWcsIG91dHB1dF9zd2FwLCBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIAotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmYWluZm8tPmZkcl9oYXNoLnRhYmxlKTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmFpbmZvLT5zdHJfaGFzaC50YWJsZSk7Ci0KLSAgb2JqYWxsb2NfZnJlZSAoYWluZm8tPm1lbW9yeSk7Ci0KLSAgZnJlZSAoYWluZm8pOwotfQotCi0vKiBBY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBJTlBVVF9CRkQgaW50bwotICAgT1VUUFVUX0JGRC4gIFRoZSBJTlBVVF9ERUJVRyBhcmd1bWVudCBwb2ludHMgdG8gc29tZSBFQ09GRgotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIHdlIHdhbnQgdG8gbGluayBpbnRvIHRoZSBpbmZvcm1hdGlvbgotICAgcG9pbnRlZCB0byBieSB0aGUgT1VUUFVUX0RFQlVHIGFyZ3VtZW50LiAgT1VUUFVUX1NXQVAgYW5kCi0gICBJTlBVVF9TV0FQIHBvaW50IHRvIHRoZSBzd2FwcGluZyBpbmZvcm1hdGlvbiBuZWVkZWQuICBJTkZPIGlzIHRoZQotICAgbGlua2VyIGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gIEhBTkRMRSBpcyByZXR1cm5lZCBieQotICAgYmZkX2Vjb2ZmX2RlYnVnX2luaXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1Zywgb3V0cHV0X3N3YXAsCi0JCQkgICAgaW5wdXRfYmZkLCBpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwKLQkJCSAgICBpbmZvKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpvdXRwdXRfZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpvdXRwdXRfc3dhcDsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICppbnB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotICB2b2lkICgqIGNvbnN0IHN3YXBfc3ltX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBTWU1SICopKQotICAgID0gaW5wdXRfc3dhcC0+c3dhcF9zeW1faW47Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9yZmRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpCi0gICAgPSBpbnB1dF9zd2FwLT5zd2FwX3JmZF9pbjsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpCi0gICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9zeW1fb3V0OwotICB2b2lkICgqIGNvbnN0IHN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKQotICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfZmRyX291dDsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3JmZF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpCi0gICAgPSBvdXRwdXRfc3dhcC0+c3dhcF9yZmRfb3V0OwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3N5bV9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX29wdF9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX29wdF9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JmZF9zaXplID0gb3V0cHV0X3N3YXAtPmV4dGVybmFsX3JmZF9zaXplOwotICBIRFJSICogY29uc3Qgb3V0cHV0X3N5bWhkciA9ICZvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgSERSUiAqIGNvbnN0IGlucHV0X3N5bWhkciA9ICZpbnB1dF9kZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBiZmRfdm1hIHNlY3Rpb25fYWRqdXN0W3NjTWF4XTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX2J5dGUgKmZkcl9zdGFydDsKLSAgYmZkX2J5dGUgKmZkcl9wdHI7Ci0gIGJmZF9ieXRlICpmZHJfZW5kOwotICBiZmRfc2l6ZV90eXBlIGZkcl9hZGQ7Ci0gIHVuc2lnbmVkIGludCBjb3BpZWQ7Ci0gIFJGRFQgaTsKLSAgdW5zaWduZWQgbG9uZyBzejsKLSAgYmZkX2J5dGUgKnJmZF9vdXQ7Ci0gIGJmZF9ieXRlICpyZmRfaW47Ci0gIGJmZF9ieXRlICpyZmRfZW5kOwotICBsb25nIG5ld3JmZGJhc2UgPSAwOwotICBsb25nIG9sZHJmZGJhc2UgPSAwOwotICBiZmRfYnl0ZSAqZmRyX291dDsKLQotICAvKiBVc2Ugc2VjdGlvbl9hZGp1c3QgdG8gaG9sZCB0aGUgdmFsdWUgdG8gYWRkIHRvIGEgc3ltYm9sIGluIGEKLSAgICAgcGFydGljdWxhciBzZWN0aW9uLiAgKi8KLSAgbWVtc2V0ICgoUFRSKSBzZWN0aW9uX2FkanVzdCwgMCwgc2l6ZW9mIHNlY3Rpb25fYWRqdXN0KTsKLQotI2RlZmluZSBTRVQobmFtZSwgaW5keCkgXAotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5wdXRfYmZkLCBuYW1lKTsgXAotICBpZiAoc2VjICE9IE5VTEwpIFwKLSAgICBzZWN0aW9uX2FkanVzdFtpbmR4XSA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgXAotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0IFwKLQkJCSAgICAtIHNlYy0+dm1hKTsKLQotICBTRVQgKCIudGV4dCIsIHNjVGV4dCk7Ci0gIFNFVCAoIi5kYXRhIiwgc2NEYXRhKTsKLSAgU0VUICgiLmJzcyIsIHNjQnNzKTsKLSAgU0VUICgiLnNkYXRhIiwgc2NTRGF0YSk7Ci0gIFNFVCAoIi5zYnNzIiwgc2NTQnNzKTsKLSAgLyogc2NSZGF0YSBzZWN0aW9uIG1heSBiZSBlaXRoZXIgLnJkYXRhIG9yIC5yb2RhdGEuICAqLwotICBTRVQgKCIucmRhdGEiLCBzY1JEYXRhKTsKLSAgU0VUICgiLnJvZGF0YSIsIHNjUkRhdGEpOwotICBTRVQgKCIuaW5pdCIsIHNjSW5pdCk7Ci0gIFNFVCAoIi5maW5pIiwgc2NGaW5pKTsKLSAgU0VUICgiLnJjb25zdCIsIHNjUkNvbnN0KTsKLQotI3VuZGVmIFNFVAotCi0gIC8qIEZpbmQgYWxsIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIEZEUidzLiAgV2UgbmVlZAotICAgICB0byBoYW5kbGUgdGhlbSB3aGV0aGVyIHRoZXkgYXJlIHN3YXBwZWQgb3Igbm90LiAgKi8KLSAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZkcl9zdGFydCA9IChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZmRyOwotICAgICAgZmRyX2FkZCA9IHNpemVvZiAoRkRSKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmZHJfc3RhcnQgPSAoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX2ZkcjsKLSAgICAgIGZkcl9hZGQgPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZTsKLSAgICB9Ci0gIGZkcl9lbmQgPSBmZHJfc3RhcnQgKyBpbnB1dF9zeW1oZHItPmlmZE1heCAqIGZkcl9hZGQ7Ci0KLSAgaW5wdXRfZGVidWctPmlmZG1hcCA9IChSRkRUICopIGJmZF9hbGxvYyAoaW5wdXRfYmZkLAotCQkJCQkgICAgKGlucHV0X3N5bWhkci0+aWZkTWF4Ci0JCQkJCSAgICAgKiBzaXplb2YgKFJGRFQpKSk7Ci0KLSAgc3ogPSAoaW5wdXRfc3ltaGRyLT5jcmZkICsgaW5wdXRfc3ltaGRyLT5pZmRNYXgpICogZXh0ZXJuYWxfcmZkX3NpemU7Ci0gIHJmZF9vdXQgPSAoYmZkX2J5dGUgKikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksIHN6KTsKLSAgaWYgKCFpbnB1dF9kZWJ1Zy0+aWZkbWFwIHx8ICFyZmRfb3V0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnJmZCwgJmFpbmZvLT5yZmRfZW5kLCByZmRfb3V0LCBzeikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvcGllZCA9IDA7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBGRFIncyB0byBzZWUgd2hpY2ggb25lcyB3ZSBhcmUgZ29pbmcgdG8gaW5jbHVkZQotICAgICBpbiB0aGUgZmluYWwgb3V0cHV0LiAgV2UgZG8gbm90IHdhbnQgZHVwbGljYXRlIEZEUiBpbmZvcm1hdGlvbgotICAgICBmb3IgaGVhZGVyIGZpbGVzLCBiZWNhdXNlIEVDT0ZGIGRlYnVnZ2luZyBpcyBvZnRlbiB2ZXJ5IGxhcmdlLgotICAgICBXaGVuIHdlIGZpbmQgYW4gRkRSIHdpdGggbm8gbGluZSBpbmZvcm1hdGlvbiB3aGljaCBjYW4gYmUgbWVyZ2VkLAotICAgICB3ZSBsb29rIGl0IHVwIGluIGEgaGFzaCB0YWJsZSB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IGluY2x1ZGUgaXQKLSAgICAgb25jZS4gIFdlIGtlZXAgYSB0YWJsZSBtYXBwaW5nIEZEUiBudW1iZXJzIHRvIHRoZSBmaW5hbCBudW1iZXIKLSAgICAgdGhleSBnZXQgd2l0aCB0aGUgQkZELCBzbyB0aGF0IHdlIGNhbiByZWZlciB0byBpdCB3aGVuIHdlIHdyaXRlCi0gICAgIG91dCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gIGZvciAoZmRyX3B0ciA9IGZkcl9zdGFydCwgaSA9IDA7Ci0gICAgICAgZmRyX3B0ciA8IGZkcl9lbmQ7Ci0gICAgICAgZmRyX3B0ciArPSBmZHJfYWRkLCBpKyssIHJmZF9vdXQgKz0gZXh0ZXJuYWxfcmZkX3NpemUpCi0gICAgewotICAgICAgRkRSIGZkcjsKLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotCWZkciA9ICooRkRSICopIGZkcl9wdHI7Ci0gICAgICBlbHNlCi0JKCppbnB1dF9zd2FwLT5zd2FwX2Zkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgZmRyX3B0ciwgJmZkcik7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIEZEUiBjYW4gYmUgbWVyZ2VkIHdpdGggYW4gZXhpc3Rpbmcgb25lLiAgKi8KLSAgICAgIGlmIChmZHIuY2JMaW5lID09IDAgJiYgZmRyLnJzcyAhPSAtMSAmJiBmZHIuZk1lcmdlKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyICpsb29rdXA7Ci0JICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmZoOwotCi0JICAvKiBXZSBsb29rIHVwIGEgc3RyaW5nIGZvcm1lZCBmcm9tIHRoZSBmaWxlIG5hbWUgYW5kIHRoZQotCSAgICAgbnVtYmVyIG9mIHN5bWJvbHMgYW5kIGF1eCBlbnRyaWVzLiAgU29tZXRpbWVzIGFuIGluY2x1ZGUKLQkgICAgIGZpbGUgd2lsbCBjb25kaXRpb25hbGx5IGRlZmluZSBhIHR5cGVkZWYgb3Igc29tZXRoaW5nCi0JICAgICBiYXNlZCBvbiB0aGUgb3JkZXIgb2YgaW5jbHVkZSBmaWxlcy4gIFVzaW5nIHRoZSBudW1iZXIgb2YKLQkgICAgIHN5bWJvbHMgYW5kIGF1eCBlbnRyaWVzIGFzIGEgaGFzaCByZWR1Y2VzIHRoZSBjaGFuY2UgdGhhdAotCSAgICAgd2Ugd2lsbCBtZXJnZSBzeW1ib2wgaW5mb3JtYXRpb24gdGhhdCBzaG91bGQgbm90IGJlCi0JICAgICBtZXJnZWQuICAqLwotCSAgbmFtZSA9IGlucHV0X2RlYnVnLT5zcyArIGZkci5pc3NCYXNlICsgZmRyLnJzczsKLQotCSAgbG9va3VwID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDIwKTsKLQkgIGlmIChsb29rdXAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3ByaW50ZiAobG9va3VwLCAiJXMgJWx4ICVseCIsIG5hbWUsIGZkci5jc3ltLCBmZHIuY2F1eCk7Ci0KLQkgIGZoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmYWluZm8tPmZkcl9oYXNoLCBsb29rdXAsIHRydWUsIHRydWUpOwotCSAgZnJlZSAobG9va3VwKTsKLQkgIGlmIChmaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKGZoLT52YWwgIT0gLTEpCi0JICAgIHsKLQkgICAgICBpbnB1dF9kZWJ1Zy0+aWZkbWFwW2ldID0gZmgtPnZhbDsKLQkgICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsIGlucHV0X2RlYnVnLT5pZmRtYXAgKyBpLAotCQkJICAgICAgIChQVFIpIHJmZF9vdXQpOwotCi0JICAgICAgLyogRG9uJ3QgY29weSB0aGlzIEZEUi4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgZmgtPnZhbCA9IG91dHB1dF9zeW1oZHItPmlmZE1heCArIGNvcGllZDsKLQl9Ci0KLSAgICAgIGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPSBvdXRwdXRfc3ltaGRyLT5pZmRNYXggKyBjb3BpZWQ7Ci0gICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsIGlucHV0X2RlYnVnLT5pZmRtYXAgKyBpLCAoUFRSKSByZmRfb3V0KTsKLSAgICAgICsrY29waWVkOwotICAgIH0KLQotICBuZXdyZmRiYXNlID0gb3V0cHV0X3N5bWhkci0+Y3JmZDsKLSAgb3V0cHV0X3N5bWhkci0+Y3JmZCArPSBpbnB1dF9zeW1oZHItPmlmZE1heDsKLQotICAvKiBDb3B5IG92ZXIgYW55IGV4aXN0aW5nIFJGRCdzLiAgUkZEJ3MgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUKLSAgICAgbGlua2VyLCBzbyB0aGlzIHdpbGwgb25seSBoYXBwZW4gZm9yIGlucHV0IGZpbGVzIHdoaWNoIGFyZSB0aGUKLSAgICAgcmVzdWx0IG9mIGEgcGFydGlhbCBsaW5rLiAgKi8KLSAgcmZkX2luID0gKGJmZF9ieXRlICopIGlucHV0X2RlYnVnLT5leHRlcm5hbF9yZmQ7Ci0gIHJmZF9lbmQgPSByZmRfaW4gKyBpbnB1dF9zeW1oZHItPmNyZmQgKiBpbnB1dF9zd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKLSAgZm9yICg7Ci0gICAgICAgcmZkX2luIDwgcmZkX2VuZDsKLSAgICAgICByZmRfaW4gKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpCi0gICAgewotICAgICAgUkZEVCByZmQ7Ci0KLSAgICAgICgqc3dhcF9yZmRfaW4pIChpbnB1dF9iZmQsIChQVFIpIHJmZF9pbiwgJnJmZCk7Ci0gICAgICBCRkRfQVNTRVJUIChyZmQgPj0gMCAmJiByZmQgPCBpbnB1dF9zeW1oZHItPmlmZE1heCk7Ci0gICAgICByZmQgPSBpbnB1dF9kZWJ1Zy0+aWZkbWFwW3JmZF07Ci0gICAgICAoKnN3YXBfcmZkX291dCkgKG91dHB1dF9iZmQsICZyZmQsIChQVFIpIHJmZF9vdXQpOwotICAgICAgcmZkX291dCArPSBleHRlcm5hbF9yZmRfc2l6ZTsKLSAgICB9Ci0KLSAgb2xkcmZkYmFzZSA9IG91dHB1dF9zeW1oZHItPmNyZmQ7Ci0gIG91dHB1dF9zeW1oZHItPmNyZmQgKz0gaW5wdXRfc3ltaGRyLT5jcmZkOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgRkRSJ3MgYW5kIGNvcHkgb3ZlciBhbGwgYXNzb2NpYXRlZCBkZWJ1Z2dpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBzeiA9IGNvcGllZCAqIGV4dGVybmFsX2Zkcl9zaXplOwotICBmZHJfb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0gIGlmICghZmRyX291dCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5mZHIsICZhaW5mby0+ZmRyX2VuZCwgZmRyX291dCwgc3opKQotICAgIHJldHVybiBmYWxzZTsKLSAgZm9yIChmZHJfcHRyID0gZmRyX3N0YXJ0LCBpID0gMDsKLSAgICAgICBmZHJfcHRyIDwgZmRyX2VuZDsKLSAgICAgICBmZHJfcHRyICs9IGZkcl9hZGQsIGkrKykKLSAgICB7Ci0gICAgICBGRFIgZmRyOwotICAgICAgYmZkX3ZtYSBmZHJfYWRyOwotICAgICAgYmZkX2J5dGUgKnN5bV9vdXQ7Ci0gICAgICBiZmRfYnl0ZSAqbHJhd19zcmM7Ci0gICAgICBiZmRfYnl0ZSAqbHJhd19lbmQ7Ci0gICAgICBib29sZWFuIGZnb3RmaWxlbmFtZTsKLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5pZmRtYXBbaV0gPCBvdXRwdXRfc3ltaGRyLT5pZmRNYXgpCi0JewotCSAgLyogV2UgYXJlIG5vdCBjb3B5aW5nIHRoaXMgRkRSLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGlucHV0X2RlYnVnLT5mZHIgIT0gKEZEUiAqKSBOVUxMKQotCWZkciA9ICooRkRSICopIGZkcl9wdHI7Ci0gICAgICBlbHNlCi0JKCppbnB1dF9zd2FwLT5zd2FwX2Zkcl9pbikgKGlucHV0X2JmZCwgKFBUUikgZmRyX3B0ciwgJmZkcik7Ci0KLSAgICAgIGZkcl9hZHIgPSBmZHIuYWRyOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIEZEUiBhZGRyZXNzIGZvciBhbnkgY2hhbmdlcyB0aGF0IG1heSBoYXZlIGJlZW4KLQkgbWFkZSBieSByZWxheGluZy4gICovCi0gICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCXsKLQkgIHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKmFkanVzdDsKLQotCSAgZm9yIChhZGp1c3QgPSBpbnB1dF9kZWJ1Zy0+YWRqdXN0OwotCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkgICAgICAgYWRqdXN0ID0gYWRqdXN0LT5uZXh0KQotCSAgICBpZiAoZmRyX2FkciA+PSBhZGp1c3QtPnN0YXJ0Ci0JCSYmIGZkcl9hZHIgPCBhZGp1c3QtPmVuZCkKLQkgICAgICBmZHIuYWRyICs9IGFkanVzdC0+YWRqdXN0OwotCX0KLQotICAgICAgLyogRklYTUU6IEl0IGlzIGNvbmNlaXZhYmxlIHRoYXQgdGhpcyBGRFIgcG9pbnRzIHRvIHRoZSAuaW5pdCBvcgotCSAuZmluaSBzZWN0aW9uLCBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCBub3QgZG8gdGhlIHJpZ2h0Ci0JIHRoaW5nLiAgKi8KLSAgICAgIGZkci5hZHIgKz0gc2VjdGlvbl9hZGp1c3Rbc2NUZXh0XTsKLQotICAgICAgLyogU3dhcCBpbiB0aGUgbG9jYWwgc3ltYm9scywgYWRqdXN0IHRoZWlyIHZhbHVlcywgYW5kIHN3YXAgdGhlbQotCSBvdXQgYWdhaW4uICAqLwotICAgICAgZmdvdGZpbGVuYW1lID0gZmFsc2U7Ci0gICAgICBzeiA9IGZkci5jc3ltICogZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBzeW1fb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0gICAgICBpZiAoIXN5bV9vdXQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnN5bSwgJmFpbmZvLT5zeW1fZW5kLCBzeW1fb3V0LAotCQkJICAgICAgIHN6KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBscmF3X3NyYyA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3N5bQotCQkgICsgZmRyLmlzeW1CYXNlICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgbHJhd19lbmQgPSBscmF3X3NyYyArIGZkci5jc3ltICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBmb3IgKDsgIGxyYXdfc3JjIDwgbHJhd19lbmQ7ICBscmF3X3NyYyArPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSkKLQl7Ci0JICBTWU1SIGludGVybmFsX3N5bTsKLQotCSAgKCpzd2FwX3N5bV9pbikgKGlucHV0X2JmZCwgKFBUUikgbHJhd19zcmMsICZpbnRlcm5hbF9zeW0pOwotCi0JICBCRkRfQVNTRVJUIChpbnRlcm5hbF9zeW0uc2MgIT0gc2NDb21tb24KLQkJICAgICAgJiYgaW50ZXJuYWxfc3ltLnNjICE9IHNjU0NvbW1vbik7Ci0KLQkgIC8qIEFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgIHN3aXRjaCAoaW50ZXJuYWxfc3ltLnN0KQotCSAgICB7Ci0JICAgIGNhc2Ugc3ROaWw6Ci0JICAgICAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZpbnRlcm5hbF9zeW0pKQotCQlicmVhazsKLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIHN0R2xvYmFsOgotCSAgICBjYXNlIHN0U3RhdGljOgotCSAgICBjYXNlIHN0TGFiZWw6Ci0JICAgIGNhc2Ugc3RQcm9jOgotCSAgICBjYXNlIHN0U3RhdGljUHJvYzoKLQkgICAgICBpZiAoaW5wdXRfZGVidWctPmFkanVzdCAhPSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCQl7Ci0JCSAgYmZkX3ZtYSB2YWx1ZTsKLQkJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Ci0KLQkJICB2YWx1ZSA9IGludGVybmFsX3N5bS52YWx1ZTsKLQkJICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7Ci0JCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkJICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKLQkJICAgIGlmICh2YWx1ZSA+PSBhZGp1c3QtPnN0YXJ0Ci0JCQkmJiB2YWx1ZSA8IGFkanVzdC0+ZW5kKQotCQkgICAgICBpbnRlcm5hbF9zeW0udmFsdWUgKz0gYWRqdXN0LT5hZGp1c3Q7Ci0JCX0KLQkgICAgICBpbnRlcm5hbF9zeW0udmFsdWUgKz0gc2VjdGlvbl9hZGp1c3RbaW50ZXJuYWxfc3ltLnNjXTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmssIHdlIGhhc2ggYWxsIHRoZSBzdHJpbmdzIGluCi0JICAgICB0aGUgbG9jYWwgc3ltYm9sIHRhYmxlIHRvZ2V0aGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBhbW91bnQKLQkgICAgIG9mIHNwYWNlIHJlcXVpcmVkIGJ5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFdlIGRvbid0IGRvCi0JICAgICB0aGlzIHdoZW4gcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rIGJlY2F1c2UgaXQgd291bGQKLQkgICAgIHByZXZlbnQgdXMgZnJvbSBlYXNpbHkgbWVyZ2luZyBkaWZmZXJlbnQgRkRSJ3MuICAqLwotCSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYm9vbGVhbiBmZmlsZW5hbWU7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIGlmICghIGZnb3RmaWxlbmFtZSAmJiBpbnRlcm5hbF9zeW0uaXNzID09IGZkci5yc3MpCi0JCWZmaWxlbmFtZSA9IHRydWU7Ci0JICAgICAgZWxzZQotCQlmZmlsZW5hbWUgPSBmYWxzZTsKLQotCSAgICAgIC8qIEhhc2ggdGhlIG5hbWUgaW50byB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgICAgICBuYW1lID0gaW5wdXRfZGVidWctPnNzICsgZmRyLmlzc0Jhc2UgKyBpbnRlcm5hbF9zeW0uaXNzOwotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQlpbnRlcm5hbF9zeW0uaXNzID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnNoOwotCi0JCSAgc2ggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+c3RyX2hhc2gsIG5hbWUsIHRydWUsIHRydWUpOwotCQkgIGlmIChzaCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgaWYgKHNoLT52YWwgPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIHNoLT52YWwgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7Ci0JCSAgICAgIG91dHB1dF9zeW1oZHItPmlzc01heCArPSBzdHJsZW4gKG5hbWUpICsgMTsKLQkJICAgICAgaWYgKGFpbmZvLT5zc19oYXNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkJCWFpbmZvLT5zc19oYXNoID0gc2g7Ci0JCSAgICAgIGlmIChhaW5mby0+c3NfaGFzaF9lbmQKLQkJCSAgIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCQkJYWluZm8tPnNzX2hhc2hfZW5kLT5uZXh0ID0gc2g7Ci0JCSAgICAgIGFpbmZvLT5zc19oYXNoX2VuZCA9IHNoOwotCQkgICAgfQotCQkgIGludGVybmFsX3N5bS5pc3MgPSBzaC0+dmFsOwotCQl9Ci0KLQkgICAgICBpZiAoZmZpbGVuYW1lKQotCQl7Ci0JCSAgZmRyLnJzcyA9IGludGVybmFsX3N5bS5pc3M7Ci0JCSAgZmdvdGZpbGVuYW1lID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0KLQkgICgqc3dhcF9zeW1fb3V0KSAob3V0cHV0X2JmZCwgJmludGVybmFsX3N5bSwgc3ltX291dCk7Ci0JICBzeW1fb3V0ICs9IGV4dGVybmFsX3N5bV9zaXplOwotCX0KLQotICAgICAgZmRyLmlzeW1CYXNlID0gb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKLSAgICAgIG91dHB1dF9zeW1oZHItPmlzeW1NYXggKz0gZmRyLmNzeW07Ci0KLSAgICAgIC8qIENvcHkgdGhlIGluZm9ybWF0aW9uIHRoYXQgZG9lcyBub3QgbmVlZCBzd2FwcGluZy4gICovCi0KLSAgICAgIC8qIEZJWE1FOiBJZiB3ZSBhcmUgcmVsYXhpbmcsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSBsaW5lCi0JIG51bWJlcnMuICBGcmFua2x5LCBmb3JnZXQgaXQuICBBbnlib2R5IHVzaW5nIHN0YWJzIGRlYnVnZ2luZwotCSBpbmZvcm1hdGlvbiB3aWxsIG5vdCB1c2UgdGhpcyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiwgYW5kCi0JIHN0YWJzIGFyZSBhZGp1c3RlZCBjb3JyZWN0bHkuICAqLwotICAgICAgaWYgKGZkci5jYkxpbmUgPiAwKQotCXsKLQkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+bGluZSwgJmFpbmZvLT5saW5lX2VuZCwKLQkJCQkgaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zeW1oZHItPmNiTGluZU9mZnNldCArIGZkci5jYkxpbmVPZmZzZXQsCi0JCQkJIGZkci5jYkxpbmUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmZHIuaWxpbmVCYXNlID0gb3V0cHV0X3N5bWhkci0+aWxpbmVNYXg7Ci0JICBmZHIuY2JMaW5lT2Zmc2V0ID0gb3V0cHV0X3N5bWhkci0+Y2JMaW5lOwotCSAgb3V0cHV0X3N5bWhkci0+aWxpbmVNYXggKz0gZmRyLmNsaW5lOwotCSAgb3V0cHV0X3N5bWhkci0+Y2JMaW5lICs9IGZkci5jYkxpbmU7Ci0JfQotICAgICAgaWYgKGZkci5jYXV4ID4gMCkKLQl7Ci0JICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPmF1eCwgJmFpbmZvLT5hdXhfZW5kLAotCQkJCSBpbnB1dF9iZmQsCi0JCQkJIChpbnB1dF9zeW1oZHItPmNiQXV4T2Zmc2V0Ci0JCQkJICArIGZkci5pYXV4QmFzZSAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpLAotCQkJCSBmZHIuY2F1eCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmZHIuaWF1eEJhc2UgPSBvdXRwdXRfc3ltaGRyLT5pYXV4TWF4OwotCSAgb3V0cHV0X3N5bWhkci0+aWF1eE1heCArPSBmZHIuY2F1eDsKLQl9Ci0gICAgICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCi0JICAvKiBXaGVuIGFyZSBhcmUgaGFzaGluZyBzdHJpbmdzLCB3ZSBsaWUgYWJvdXQgdGhlIG51bWJlciBvZgotCSAgICAgc3RyaW5ncyBhdHRhY2hlZCB0byBlYWNoIEZEUi4gIFdlIG5lZWQgdG8gc2V0IGNiU3MKLQkgICAgIGJlY2F1c2Ugc29tZSB2ZXJzaW9ucyBvZiBkYnggYXBwYXJlbnRseSB1c2UgaXQgdG8gZGVjaWRlCi0JICAgICBob3cgbXVjaCBvZiB0aGUgc3RyaW5nIHRhYmxlIHRvIHJlYWQgaW4uICAqLwotCSAgZmRyLmlzc0Jhc2UgPSAwOwotCSAgZmRyLmNiU3MgPSBvdXRwdXRfc3ltaGRyLT5pc3NNYXg7Ci0JfQotICAgICAgZWxzZSBpZiAoZmRyLmNiU3MgPiAwKQotCXsKLQkgIGlmICghYWRkX2ZpbGVfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3MsICZhaW5mby0+c3NfZW5kLAotCQkJCSBpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3N5bWhkci0+Y2JTc09mZnNldCArIGZkci5pc3NCYXNlLAotCQkJCSBmZHIuY2JTcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGZkci5pc3NCYXNlID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OwotCSAgb3V0cHV0X3N5bWhkci0+aXNzTWF4ICs9IGZkci5jYlNzOwotCX0KLQotICAgICAgaWYgKChvdXRwdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyCi0JICAgPT0gaW5wdXRfYmZkLT54dmVjLT5oZWFkZXJfYnl0ZW9yZGVyKQotCSAgJiYgaW5wdXRfZGVidWctPmFkanVzdCA9PSAoc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqKSBOVUxMKQotCXsKLQkgIC8qIFRoZSB0d28gQkZEJ3MgaGF2ZSB0aGUgc2FtZSBlbmRpYW5uZXNzLCBhbmQgd2UgZG9uJ3QgaGF2ZQotCSAgICAgdG8gYWRqdXN0IHRoZSBQRFIgYWRkcmVzc2VzLCBzbyBzaW1wbHkgY29weWluZyB0aGUKLQkgICAgIGluZm9ybWF0aW9uIHdpbGwgc3VmZmljZS4gICovCi0JICBCRkRfQVNTRVJUIChleHRlcm5hbF9wZHJfc2l6ZSA9PSBpbnB1dF9zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0JICBpZiAoZmRyLmNwZCA+IDApCi0JICAgIHsKLQkgICAgICBpZiAoIWFkZF9maWxlX3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnBkciwgJmFpbmZvLT5wZHJfZW5kLAotCQkJCSAgICAgaW5wdXRfYmZkLAotCQkJCSAgICAgKGlucHV0X3N5bWhkci0+Y2JQZE9mZnNldAotCQkJCSAgICAgICsgZmRyLmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpLAotCQkJCSAgICAgZmRyLmNwZCAqIGV4dGVybmFsX3Bkcl9zaXplKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBCRkRfQVNTRVJUIChleHRlcm5hbF9vcHRfc2l6ZSA9PSBpbnB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0JICBpZiAoZmRyLmNvcHQgPiAwKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRfZmlsZV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5vcHQsICZhaW5mby0+b3B0X2VuZCwKLQkJCQkgICAgIGlucHV0X2JmZCwKLQkJCQkgICAgIChpbnB1dF9zeW1oZHItPmNiT3B0T2Zmc2V0Ci0JCQkJICAgICAgKyBmZHIuaW9wdEJhc2UgKiBleHRlcm5hbF9vcHRfc2l6ZSksCi0JCQkJICAgICBmZHIuY29wdCAqIGV4dGVybmFsX29wdF9zaXplKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zaXplX3R5cGUgb3V0c3osIGluc3o7Ci0JICBiZmRfYnl0ZSAqaW47Ci0JICBiZmRfYnl0ZSAqZW5kOwotCSAgYmZkX2J5dGUgKm91dDsKLQotCSAgLyogVGhlIHR3byBCRkQncyBoYXZlIGRpZmZlcmVudCBlbmRpYW5uZXNzLCBzbyB3ZSBtdXN0IHN3YXAKLQkgICAgIGV2ZXJ5dGhpbmcgaW4gYW5kIG91dC4gIFRoaXMgY29kZSB3b3VsZCBhbHdheXMgd29yaywgYnV0Ci0JICAgICBpdCB3b3VsZCBiZSB1bm5lY2Vzc2FyaWx5IHNsb3cgaW4gdGhlIG5vcm1hbCBjYXNlLiAgKi8KLQkgIG91dHN6ID0gZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICBpbnN6ID0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICBpbiA9ICgoYmZkX2J5dGUgKikgaW5wdXRfZGVidWctPmV4dGVybmFsX3BkcgotCQkrIGZkci5pcGRGaXJzdCAqIGluc3opOwotCSAgZW5kID0gaW4gKyBmZHIuY3BkICogaW5zejsKLQkgIHN6ID0gZmRyLmNwZCAqIG91dHN6OwotCSAgb3V0ID0gKGJmZF9ieXRlICopIG9iamFsbG9jX2FsbG9jIChhaW5mby0+bWVtb3J5LCBzeik7Ci0JICBpZiAoIW91dCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCFhZGRfbWVtb3J5X3NodWZmbGUgKGFpbmZvLCAmYWluZm8tPnBkciwgJmFpbmZvLT5wZHJfZW5kLCBvdXQsCi0JCQkJICAgc3opKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmb3IgKDsgaW4gPCBlbmQ7IGluICs9IGluc3osIG91dCArPSBvdXRzeikKLQkgICAgewotCSAgICAgIFBEUiBwZHI7Ci0KLQkgICAgICAoKmlucHV0X3N3YXAtPnN3YXBfcGRyX2luKSAoaW5wdXRfYmZkLCAoUFRSKSBpbiwgJnBkcik7Ci0KLQkgICAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gcmVsYXhpbmcsIHdlIG1heSBoYXZlIHRvIGFkanVzdCB0aGUKLQkJIGFkZHJlc3MuICAqLwotCSAgICAgIGlmIChpbnB1dF9kZWJ1Zy0+YWRqdXN0ICE9IChzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICopIE5VTEwpCi0JCXsKLQkJICBiZmRfdm1hIGFkcjsKLQkJICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICphZGp1c3Q7Ci0KLQkJICBhZHIgPSBmZHJfYWRyICsgcGRyLmFkcjsKLQkJICBmb3IgKGFkanVzdCA9IGlucHV0X2RlYnVnLT5hZGp1c3Q7Ci0JCSAgICAgICBhZGp1c3QgIT0gKHN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QgKikgTlVMTDsKLQkJICAgICAgIGFkanVzdCA9IGFkanVzdC0+bmV4dCkKLQkJICAgIGlmIChhZHIgPj0gYWRqdXN0LT5zdGFydAotCQkJJiYgYWRyIDwgYWRqdXN0LT5lbmQpCi0JCSAgICAgIHBkci5hZHIgKz0gYWRqdXN0LT5hZGp1c3Q7Ci0JCX0KLQotCSAgICAgICgqb3V0cHV0X3N3YXAtPnN3YXBfcGRyX291dCkgKG91dHB1dF9iZmQsICZwZHIsIChQVFIpIG91dCk7Ci0JICAgIH0KLQotCSAgLyogU3dhcCBvdmVyIHRoZSBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24uICAqLwotCSAgb3V0c3ogPSBleHRlcm5hbF9vcHRfc2l6ZTsKLQkgIGluc3ogPSBpbnB1dF9zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZTsKLQkgIGluID0gKChiZmRfYnl0ZSAqKSBpbnB1dF9kZWJ1Zy0+ZXh0ZXJuYWxfb3B0Ci0JCSsgZmRyLmlvcHRCYXNlICogaW5zeik7Ci0JICBlbmQgPSBpbiArIGZkci5jb3B0ICogaW5zejsKLQkgIHN6ID0gZmRyLmNvcHQgKiBvdXRzejsKLQkgIG91dCA9IChiZmRfYnl0ZSAqKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwgc3opOwotCSAgaWYgKCFvdXQpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGlmICghYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5vcHQsICZhaW5mby0+b3B0X2VuZCwgb3V0LAotCQkJCSAgIHN6KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZm9yICg7IGluIDwgZW5kOyBpbiArPSBpbnN6LCBvdXQgKz0gb3V0c3opCi0JICAgIHsKLQkgICAgICBPUFRSIG9wdDsKLQotCSAgICAgICgqaW5wdXRfc3dhcC0+c3dhcF9vcHRfaW4pIChpbnB1dF9iZmQsIChQVFIpIGluLCAmb3B0KTsKLQkgICAgICAoKm91dHB1dF9zd2FwLT5zd2FwX29wdF9vdXQpIChvdXRwdXRfYmZkLCAmb3B0LCAoUFRSKSBvdXQpOwotCSAgICB9Ci0JfQotCi0gICAgICBmZHIuaXBkRmlyc3QgPSBvdXRwdXRfc3ltaGRyLT5pcGRNYXg7Ci0gICAgICBvdXRwdXRfc3ltaGRyLT5pcGRNYXggKz0gZmRyLmNwZDsKLSAgICAgIGZkci5pb3B0QmFzZSA9IG91dHB1dF9zeW1oZHItPmlvcHRNYXg7Ci0gICAgICBvdXRwdXRfc3ltaGRyLT5pb3B0TWF4ICs9IGZkci5jb3B0OwotCi0gICAgICBpZiAoZmRyLmNyZmQgPD0gMCkKLQl7Ci0JICAvKiBQb2ludCB0aGlzIEZEUiBhdCB0aGUgdGFibGUgb2YgUkZEJ3Mgd2UgY3JlYXRlZC4gICovCi0JICBmZHIucmZkQmFzZSA9IG5ld3JmZGJhc2U7Ci0JICBmZHIuY3JmZCA9IGlucHV0X3N5bWhkci0+aWZkTWF4OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQb2ludCB0aGlzIEZEUiBhdCB0aGUgcmVtYXBwZWQgUkZEJ3MuICAqLwotCSAgZmRyLnJmZEJhc2UgKz0gb2xkcmZkYmFzZTsKLQl9Ci0KLSAgICAgICgqc3dhcF9mZHJfb3V0KSAob3V0cHV0X2JmZCwgJmZkciwgZmRyX291dCk7Ci0gICAgICBmZHJfb3V0ICs9IGV4dGVybmFsX2Zkcl9zaXplOwotICAgICAgKytvdXRwdXRfc3ltaGRyLT5pZmRNYXg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBzdHJpbmcgdG8gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3ZSBhcmUgYWNjdW11bGF0aW5nLgotICAgUmV0dXJuIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmRyIHN0cmluZyBiYXNlLiAgKi8KLQotc3RhdGljIGxvbmcgZWNvZmZfYWRkX3N0cmluZyBQQVJBTVMgKChzdHJ1Y3QgYWNjdW11bGF0ZSAqLAotCQkJCSAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiwKLQkJCQkgICAgICBGRFIgKmZkciwgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLXN0YXRpYyBsb25nCi1lY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgZGVidWcsIGZkciwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIEZEUiAqZmRyOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIEhEUlIgKnN5bWhkcjsKLSAgc2l6ZV90IGxlbjsKLSAgYmZkX3NpemVfdHlwZSByZXQ7Ci0KLSAgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBpZiAoIWFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3MsICZhaW5mby0+c3NfZW5kLCAoUFRSKSBzdHJpbmcsCi0JCQkgICAgICAgbGVuICsgMSkpCi0JcmV0dXJuIC0xOwotICAgICAgcmV0ID0gc3ltaGRyLT5pc3NNYXg7Ci0gICAgICBzeW1oZHItPmlzc01heCArPSBsZW4gKyAxOwotICAgICAgZmRyLT5jYlNzICs9IGxlbiArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpzaDsKLQotICAgICAgc2ggPSBzdHJpbmdfaGFzaF9sb29rdXAgKCZhaW5mby0+c3RyX2hhc2gsIHN0cmluZywgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBpZiAoc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChzaC0+dmFsID09IC0xKQotCXsKLQkgIHNoLT52YWwgPSBzeW1oZHItPmlzc01heDsKLQkgIHN5bWhkci0+aXNzTWF4ICs9IGxlbiArIDE7Ci0JICBpZiAoYWluZm8tPnNzX2hhc2ggPT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBhaW5mby0+c3NfaGFzaCA9IHNoOwotCSAgaWYgKGFpbmZvLT5zc19oYXNoX2VuZAotCSAgICAgICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLQkgICAgYWluZm8tPnNzX2hhc2hfZW5kLT5uZXh0ID0gc2g7Ci0JICBhaW5mby0+c3NfaGFzaF9lbmQgPSBzaDsKLQl9Ci0gICAgICByZXQgPSBzaC0+dmFsOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBZGQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBub24tRUNPRkYgZmlsZS4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19hY2N1bXVsYXRlX290aGVyIChoYW5kbGUsIG91dHB1dF9iZmQsIG91dHB1dF9kZWJ1ZywKLQkJCQkgIG91dHB1dF9zd2FwLCBpbnB1dF9iZmQsIGluZm8pCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKm91dHB1dF9kZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKm91dHB1dF9zd2FwOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9zeW1fb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgU1lNUiAqLCBQVFIpKQotICAgID0gb3V0cHV0X3N3YXAtPnN3YXBfc3ltX291dDsKLSAgSERSUiAqb3V0cHV0X3N5bWhkciA9ICZvdXRwdXRfZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgRkRSIGZkcjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gIGFzeW1ib2wgKipzeW1fcHRyOwotICBhc3ltYm9sICoqc3ltX2VuZDsKLSAgbG9uZyBzeW1zaXplOwotICBsb25nIHN5bWNvdW50OwotICBQVFIgZXh0ZXJuYWxfZmRyOwotCi0gIG1lbXNldCAoKFBUUikgJmZkciwgMCwgc2l6ZW9mIGZkcik7Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlucHV0X2JmZCwgIi50ZXh0Iik7Ci0gIGlmIChzZWMgIT0gTlVMTCkKLSAgICBmZHIuYWRyID0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0OwotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUU6IFdoYXQgYWJvdXQgLmluaXQgb3IgLmZpbmk/ICAqLwotICAgICAgZmRyLmFkciA9IDA7Ci0gICAgfQotCi0gIGZkci5pc3NCYXNlID0gb3V0cHV0X3N5bWhkci0+aXNzTWF4OwotICBmZHIuY2JTcyA9IDA7Ci0gIGZkci5yc3MgPSBlY29mZl9hZGRfc3RyaW5nIChhaW5mbywgaW5mbywgb3V0cHV0X2RlYnVnLCAmZmRyLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0gIGlmIChmZHIucnNzID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgZmRyLmlzeW1CYXNlID0gb3V0cHV0X3N5bWhkci0+aXN5bU1heDsKLQotICAvKiBHZXQgdGhlIGxvY2FsIHN5bWJvbHMgZnJvbSB0aGUgaW5wdXQgQkZELiAgKi8KLSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQpOwotICBpZiAoc3ltc2l6ZSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc3ltc2l6ZSk7Ci0gIGlmIChzeW1ib2xzID09IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaW5wdXRfYmZkLCBzeW1ib2xzKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bV9lbmQgPSBzeW1ib2xzICsgc3ltY291bnQ7Ci0KLSAgLyogSGFuZGxlIHRoZSBsb2NhbCBzeW1ib2xzLiAgQW55IGV4dGVybmFsIHN5bWJvbHMgYXJlIGhhbmRsZWQKLSAgICAgc2VwYXJhdGVseS4gICovCi0gIGZkci5jc3ltID0gMDsKLSAgZm9yIChzeW1fcHRyID0gc3ltYm9sczsgc3ltX3B0ciAhPSBzeW1fZW5kOyBzeW1fcHRyKyspCi0gICAgewotICAgICAgU1lNUiBpbnRlcm5hbF9zeW07Ci0gICAgICBQVFIgZXh0ZXJuYWxfc3ltOwotCi0gICAgICBpZiAoKCgqc3ltX3B0ciktPmZsYWdzICYgQlNGX0VYUE9SVCkgIT0gMCkKLQljb250aW51ZTsKLSAgICAgIG1lbXNldCAoKFBUUikgJmludGVybmFsX3N5bSwgMCwgc2l6ZW9mIGludGVybmFsX3N5bSk7Ci0gICAgICBpbnRlcm5hbF9zeW0uaXNzID0gZWNvZmZfYWRkX3N0cmluZyAoYWluZm8sIGluZm8sIG91dHB1dF9kZWJ1ZywgJmZkciwKLQkJCQkJICAgKCpzeW1fcHRyKS0+bmFtZSk7Ci0KLSAgICAgIGlmIChpbnRlcm5hbF9zeW0uaXNzID09IC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKCgqc3ltX3B0ciktPnNlY3Rpb24pCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKCgqc3ltX3B0ciktPnNlY3Rpb24pKQotCWludGVybmFsX3N5bS52YWx1ZSA9ICgqc3ltX3B0ciktPnZhbHVlOwotICAgICAgZWxzZQotCWludGVybmFsX3N5bS52YWx1ZSA9ICgoKnN5bV9wdHIpLT52YWx1ZQotCQkJICAgICAgKyAoKnN5bV9wdHIpLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICArICgqc3ltX3B0ciktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgaW50ZXJuYWxfc3ltLnN0ID0gc3ROaWw7Ci0gICAgICBpbnRlcm5hbF9zeW0uc2MgPSBzY1VuZGVmaW5lZDsKLSAgICAgIGludGVybmFsX3N5bS5pbmRleCA9IGluZGV4TmlsOwotCi0gICAgICBleHRlcm5hbF9zeW0gPSAoUFRSKSBvYmphbGxvY19hbGxvYyAoYWluZm8tPm1lbW9yeSwKLQkJCQkJICAgb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgIGlmICghZXh0ZXJuYWxfc3ltKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICgqc3dhcF9zeW1fb3V0KSAob3V0cHV0X2JmZCwgJmludGVybmFsX3N5bSwgZXh0ZXJuYWxfc3ltKTsKLSAgICAgIGFkZF9tZW1vcnlfc2h1ZmZsZSAoYWluZm8sICZhaW5mby0+c3ltLCAmYWluZm8tPnN5bV9lbmQsCi0JCQkgIGV4dGVybmFsX3N5bSwgb3V0cHV0X3N3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgICAgICsrZmRyLmNzeW07Ci0gICAgICArK291dHB1dF9zeW1oZHItPmlzeW1NYXg7Ci0gICAgfQotCi0gIGJmZF9yZWxlYXNlIChvdXRwdXRfYmZkLCAoUFRSKSBzeW1ib2xzKTsKLQotICAvKiBMZWF2ZSBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIEZEUiB6ZXJvZWQgb3V0LiAgVGhpcyB3aWxsIGNhdXNlCi0gICAgIHRoZSBsYW5nIGZpZWxkIHRvIGJlIGxhbmdDLiAgVGhlIGZCaWdlbmRpYW4gZmllbGQgd2lsbAotICAgICBpbmRpY2F0ZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UKLSAgICAgaXQgb25seSBhcHBsaWVzIHRvIGF1eCBmaWVsZHMgYW5kIHRoZXJlIGFyZSBub25lLiAgKi8KLSAgZXh0ZXJuYWxfZmRyID0gKFBUUikgb2JqYWxsb2NfYWxsb2MgKGFpbmZvLT5tZW1vcnksCi0JCQkJICAgICAgIG91dHB1dF9zd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIGlmICghZXh0ZXJuYWxfZmRyKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKCpvdXRwdXRfc3dhcC0+c3dhcF9mZHJfb3V0KSAob3V0cHV0X2JmZCwgJmZkciwgZXh0ZXJuYWxfZmRyKTsKLSAgYWRkX21lbW9yeV9zaHVmZmxlIChhaW5mbywgJmFpbmZvLT5mZHIsICZhaW5mby0+ZmRyX2VuZCwKLQkJICAgICAgZXh0ZXJuYWxfZmRyLCBvdXRwdXRfc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUpOwotCi0gICsrb3V0cHV0X3N5bWhkci0+aWZkTWF4OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdXAgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZXh0ZXJuYWwgc3ltYm9scy4KLSAgIEZJWE1FOiBUaGlzIGlzIGRvbmUgdXNpbmcgYSBtZW1vcnkgYnVmZmVyLCBidXQgaXQgc2hvdWxkIGJlCi0gICBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvIHVzZSBhIHNodWZmbGUgc3RydWN0dXJlLiAgVGhlIGFzc2VtYmxlciB1c2VzCi0gICB0aGlzIGludGVyZmFjZSwgc28gdGhhdCBtdXN0IGJlIGNoYW5nZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UuICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzIChhYmZkLCBkZWJ1Zywgc3dhcCwgcmVsb2NhdGVhYmxlLCBnZXRfZXh0ciwKLQkJCSAgIHNldF9pbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYm9vbGVhbiAoKmdldF9leHRyKSBQQVJBTVMgKChhc3ltYm9sICosIEVYVFIgKikpOwotICAgICB2b2lkICgqc2V0X2luZGV4KSBQQVJBTVMgKChhc3ltYm9sICosIGJmZF9zaXplX3R5cGUpKTsKLXsKLSAgSERSUiAqIGNvbnN0IHN5bWhkciA9ICZkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyOwotICBhc3ltYm9sICoqc3ltX3B0cl9wdHI7Ci0gIHNpemVfdCBjOwotCi0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bV9wdHJfcHRyID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChjID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7IGMgPiAwOyBjLS0sIHN5bV9wdHJfcHRyKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltX3B0cjsKLSAgICAgIEVYVFIgZXN5bTsKLQotICAgICAgc3ltX3B0ciA9ICpzeW1fcHRyX3B0cjsKLQotICAgICAgLyogR2V0IHRoZSBleHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCgqZ2V0X2V4dHIpIChzeW1fcHRyLCAmZXN5bSkgPT0gZmFsc2UpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlJ3JlIHByb2R1Y2luZyBhbiBleGVjdXRhYmxlLCBtb3ZlIGNvbW1vbiBzeW1ib2xzIGludG8KLQkgYnNzLiAgKi8KLSAgICAgIGlmIChyZWxvY2F0ZWFibGUgPT0gZmFsc2UpCi0JewotCSAgaWYgKGVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQkgICAgZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0JICBlbHNlIGlmIChlc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotCSAgICBlc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0JfQotCi0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1fcHRyLT5zZWN0aW9uKQotCSAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1fcHRyLT5zZWN0aW9uKQotCSAgfHwgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgLyogRklYTUU6IGdhcyBkb2VzIG5vdCBrZWVwIHRoZSB2YWx1ZSBvZiBhIHNtYWxsIHVuZGVmaW5lZAotCSAgICAgc3ltYm9sIGluIHRoZSBzeW1ib2wgaXRzZWxmLCBiZWNhdXNlIG9mIHJlbG9jYXRpb24KLQkgICAgIHByb2JsZW1zLiAgKi8KLQkgIGlmIChlc3ltLmFzeW0uc2MgIT0gc2NTVW5kZWZpbmVkCi0JICAgICAgfHwgZXN5bS5hc3ltLnZhbHVlID09IDAKLQkgICAgICB8fCBzeW1fcHRyLT52YWx1ZSAhPSAwKQotCSAgICBlc3ltLmFzeW0udmFsdWUgPSBzeW1fcHRyLT52YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JZXN5bS5hc3ltLnZhbHVlID0gKHN5bV9wdHItPnZhbHVlCi0JCQkgICArIHN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICsgc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLSAgICAgIGlmIChzZXRfaW5kZXgpCi0JKCpzZXRfaW5kZXgpIChzeW1fcHRyLCAoYmZkX3NpemVfdHlwZSkgc3ltaGRyLT5pZXh0TWF4KTsKLQotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgZGVidWcsIHN3YXAsCi0JCQkJCSAgc3ltX3B0ci0+bmFtZSwgJmVzeW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHNpbmdsZSBleHRlcm5hbCBzeW1ib2wgdG8gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsIGRlYnVnLCBzd2FwLCBuYW1lLCBlc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVYVFIgKmVzeW07Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZXh0X3NpemUgPSBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX2V4dF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpCi0gICAgPSBzd2FwLT5zd2FwX2V4dF9vdXQ7Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgc2l6ZV90IG5hbWVsZW47Ci0KLSAgbmFtZWxlbiA9IHN0cmxlbiAobmFtZSk7Ci0KLSAgaWYgKChzaXplX3QpIChkZWJ1Zy0+c3NleHRfZW5kIC0gZGVidWctPnNzZXh0KQotICAgICAgPCBzeW1oZHItPmlzc0V4dE1heCArIG5hbWVsZW4gKyAxKQotICAgIHsKLSAgICAgIGlmIChlY29mZl9hZGRfYnl0ZXMgKChjaGFyICoqKSAmZGVidWctPnNzZXh0LAotCQkJICAgKGNoYXIgKiopICZkZWJ1Zy0+c3NleHRfZW5kLAotCQkJICAgc3ltaGRyLT5pc3NFeHRNYXggKyBuYW1lbGVuICsgMSkKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoc2l6ZV90KSAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dF9lbmQKLQkJLSAoY2hhciAqKSBkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KQotICAgICAgPCAoc3ltaGRyLT5pZXh0TWF4ICsgMSkgKiBleHRlcm5hbF9leHRfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoZWNvZmZfYWRkX2J5dGVzICgoY2hhciAqKikgJmRlYnVnLT5leHRlcm5hbF9leHQsCi0JCQkgICAoY2hhciAqKikgJmRlYnVnLT5leHRlcm5hbF9leHRfZW5kLAotCQkJICAgKHN5bWhkci0+aWV4dE1heCArIDEpICogZXh0ZXJuYWxfZXh0X3NpemUpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVzeW0tPmFzeW0uaXNzID0gc3ltaGRyLT5pc3NFeHRNYXg7Ci0KLSAgKCpzd2FwX2V4dF9vdXQpIChhYmZkLCBlc3ltLAotCQkgICAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX2V4dAotCQkgICAgKyBzeW1oZHItPmlleHRNYXggKiBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSkpOwotCi0gICsrc3ltaGRyLT5pZXh0TWF4OwotCi0gIHN0cmNweSAoZGVidWctPnNzZXh0ICsgc3ltaGRyLT5pc3NFeHRNYXgsIG5hbWUpOwotICBzeW1oZHItPmlzc0V4dE1heCArPSBuYW1lbGVuICsgMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxpZ24gdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotewotICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIGJmZF9zaXplX3R5cGUgZGVidWdfYWxpZ24sIGF1eF9hbGlnbiwgcmZkX2FsaWduOwotICBzaXplX3QgYWRkOwotCi0gIC8qIEFkanVzdCB0aGUgY291bnRzIHNvIHRoYXQgc3RydWN0dXJlcyBhcmUgYWxpZ25lZC4gICovCi0gIGRlYnVnX2FsaWduID0gc3dhcC0+ZGVidWdfYWxpZ247Ci0gIGF1eF9hbGlnbiA9IGRlYnVnX2FsaWduIC8gc2l6ZW9mICh1bmlvbiBhdXhfZXh0KTsKLSAgcmZkX2FsaWduID0gZGVidWdfYWxpZ24gLyBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZTsKLQotICBhZGQgPSBkZWJ1Z19hbGlnbiAtIChzeW1oZHItPmNiTGluZSAmIChkZWJ1Z19hbGlnbiAtIDEpKTsKLSAgaWYgKGFkZCAhPSBkZWJ1Z19hbGlnbikKLSAgICB7Ci0gICAgICBpZiAoZGVidWctPmxpbmUgIT0gKHVuc2lnbmVkIGNoYXIgKikgTlVMTCkKLQltZW1zZXQgKChQVFIpIChkZWJ1Zy0+bGluZSArIHN5bWhkci0+Y2JMaW5lKSwgMCwgYWRkKTsKLSAgICAgIHN5bWhkci0+Y2JMaW5lICs9IGFkZDsKLSAgICB9Ci0KLSAgYWRkID0gZGVidWdfYWxpZ24gLSAoc3ltaGRyLT5pc3NNYXggJiAoZGVidWdfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gZGVidWdfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5zcyAhPSAoY2hhciAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5zcyArIHN5bWhkci0+aXNzTWF4KSwgMCwgYWRkKTsKLSAgICAgIHN5bWhkci0+aXNzTWF4ICs9IGFkZDsKLSAgICB9Ci0KLSAgYWRkID0gZGVidWdfYWxpZ24gLSAoc3ltaGRyLT5pc3NFeHRNYXggJiAoZGVidWdfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gZGVidWdfYWxpZ24pCi0gICAgewotICAgICAgaWYgKGRlYnVnLT5zc2V4dCAhPSAoY2hhciAqKSBOVUxMKQotCW1lbXNldCAoKFBUUikgKGRlYnVnLT5zc2V4dCArIHN5bWhkci0+aXNzRXh0TWF4KSwgMCwgYWRkKTsKLSAgICAgIHN5bWhkci0+aXNzRXh0TWF4ICs9IGFkZDsKLSAgICB9Ci0KLSAgYWRkID0gYXV4X2FsaWduIC0gKHN5bWhkci0+aWF1eE1heCAmIChhdXhfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gYXV4X2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9ICh1bmlvbiBhdXhfZXh0ICopIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoZGVidWctPmV4dGVybmFsX2F1eCArIHN5bWhkci0+aWF1eE1heCksIDAsCi0JCWFkZCAqIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICAgICAgc3ltaGRyLT5pYXV4TWF4ICs9IGFkZDsKLSAgICB9Ci0KLSAgYWRkID0gcmZkX2FsaWduIC0gKHN5bWhkci0+Y3JmZCAmIChyZmRfYWxpZ24gLSAxKSk7Ci0gIGlmIChhZGQgIT0gcmZkX2FsaWduKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkICE9IChQVFIpIE5VTEwpCi0JbWVtc2V0ICgoUFRSKSAoKGNoYXIgKikgZGVidWctPmV4dGVybmFsX3JmZAotCQkgICAgICAgKyBzeW1oZHItPmNyZmQgKiBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSksCi0JCTAsIChzaXplX3QpIChhZGQgKiBzd2FwLT5leHRlcm5hbF9yZmRfc2l6ZSkpOwotICAgICAgc3ltaGRyLT5jcmZkICs9IGFkZDsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgc2l6ZSByZXF1aXJlZCBieSB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotYmZkX3NpemVfdHlwZQotYmZkX2Vjb2ZmX2RlYnVnX3NpemUgKGFiZmQsIGRlYnVnLCBzd2FwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci17Ci0gIGJmZF9zaXplX3R5cGUgdG90OwotCi0gIGVjb2ZmX2FsaWduX2RlYnVnIChhYmZkLCBkZWJ1Zywgc3dhcCk7Ci0gIHRvdCA9IHN3YXAtPmV4dGVybmFsX2hkcl9zaXplOwotCi0jZGVmaW5lIEFERChjb3VudCwgc2l6ZSkgXAotICB0b3QgKz0gZGVidWctPnN5bWJvbGljX2hlYWRlci5jb3VudCAqIHNpemUKLQotICBBREQgKGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIEFERCAoaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSk7Ci0gIEFERCAoaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIEFERCAoaXN5bU1heCwgc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICBBREQgKGlvcHRNYXgsIHN3YXAtPmV4dGVybmFsX29wdF9zaXplKTsKLSAgQUREIChpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgQUREIChpc3NNYXgsIHNpemVvZiAoY2hhcikpOwotICBBREQgKGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIEFERCAoaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIEFERCAoY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOwotICBBREQgKGlleHRNYXgsIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLQotI3VuZGVmIEFERAotCi0gIHJldHVybiB0b3Q7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgRUNPRkYgc3ltYm9saWMgaGVhZGVyLCBnaXZlbiB0aGUgZmlsZSBwb3NpdGlvbiBpdCBpcwotICAgZ29pbmcgdG8gYmUgcGxhY2VkIGF0LiAgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNvdW50cyBhcmUgc2V0Ci0gICBjb3JyZWN0bHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfd3JpdGVfc3ltaGRyIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgICAgZmlsZV9wdHIgd2hlcmU7Ci17Ci0gIEhEUlIgKiBjb25zdCBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgY2hhciAqYnVmZiA9IE5VTEw7Ci0KLSAgZWNvZmZfYWxpZ25fZGVidWcgKGFiZmQsIGRlYnVnLCBzd2FwKTsKLQotICAvKiBHbyB0byB0aGUgcmlnaHQgbG9jYXRpb24gaW4gdGhlIGZpbGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hlcmUgKz0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemU7Ci0KLSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQotICAvKiBGaWxsIGluIHRoZSBmaWxlIG9mZnNldHMuICAqLwotI2RlZmluZSBTRVQob2Zmc2V0LCBjb3VudCwgc2l6ZSkgXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKSBcCi0gICAgc3ltaGRyLT5vZmZzZXQgPSAwOyBcCi0gIGVsc2UgXAotICAgIHsgXAotICAgICAgc3ltaGRyLT5vZmZzZXQgPSB3aGVyZTsgXAotICAgICAgd2hlcmUgKz0gc3ltaGRyLT5jb3VudCAqIHNpemU7IFwKLSAgICB9Ci0KLSAgU0VUIChjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIFNFVCAoY2JEbk9mZnNldCwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSk7Ci0gIFNFVCAoY2JQZE9mZnNldCwgaXBkTWF4LCBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIFNFVCAoY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplKTsKLSAgU0VUIChjYk9wdE9mZnNldCwgaW9wdE1heCwgc3dhcC0+ZXh0ZXJuYWxfb3B0X3NpemUpOwotICBTRVQgKGNiQXV4T2Zmc2V0LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpKTsKLSAgU0VUIChjYlNzT2Zmc2V0LCBpc3NNYXgsIHNpemVvZiAoY2hhcikpOwotICBTRVQgKGNiU3NFeHRPZmZzZXQsIGlzc0V4dE1heCwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoY2JGZE9mZnNldCwgaWZkTWF4LCBzd2FwLT5leHRlcm5hbF9mZHJfc2l6ZSk7Ci0gIFNFVCAoY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplKTsKLSAgU0VUIChjYkV4dE9mZnNldCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotI3VuZGVmIFNFVAotCi0gIGJ1ZmYgPSAoUFRSKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChidWZmID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAoKnN3YXAtPnN3YXBfaGRyX291dCkgKGFiZmQsIHN5bWhkciwgYnVmZik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZmYsIDEsIHN3YXAtPmV4dGVybmFsX2hkcl9zaXplLCBhYmZkKQotICAgICAgIT0gc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJ1ZmYgIT0gTlVMTCkKLSAgICBmcmVlIChidWZmKTsKLSAgcmV0dXJuIHRydWU7Ci0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1ZmYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbiBhc3N1bWVzCi0gICB0aGF0IHRoZSBpbmZvcm1hdGlvbiAodGhlIHBvaW50ZXJzIGFuZCBjb3VudHMpIGluICpERUJVRyBoYXZlIGJlZW4KLSAgIHNldCBjb3JyZWN0bHkuICBXSEVSRSBpcyB0aGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gd3JpdGUgdGhlCi0gICBpbmZvcm1hdGlvbiB0by4gIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4gdGhlIGZpbGUgb2Zmc2V0cyBpbiB0aGUKLSAgIHN5bWJvbGljIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9lY29mZl93cml0ZV9kZWJ1ZyAoYWJmZCwgZGVidWcsIHN3YXAsIHdoZXJlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIGZpbGVfcHRyIHdoZXJlOwotewotICBIRFJSICogY29uc3Qgc3ltaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0KLSAgaWYgKCEgZWNvZmZfd3JpdGVfc3ltaGRyIChhYmZkLCBkZWJ1Zywgc3dhcCwgd2hlcmUpKQotICAgIHJldHVybiBmYWxzZTsKLQotI2RlZmluZSBXUklURShwdHIsIGNvdW50LCBzaXplLCBvZmZzZXQpIFwKLSAgQkZEX0FTU0VSVCAoc3ltaGRyLT5vZmZzZXQgPT0gMCBcCi0JICAgICAgfHwgKGJmZF92bWEpIGJmZF90ZWxsIChhYmZkKSA9PSBzeW1oZHItPm9mZnNldCk7IFwKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwgYWJmZCkgXAotICAgICAgIT0gc2l6ZSAqIHN5bWhkci0+Y291bnQpIFwKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgV1JJVEUgKGxpbmUsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgY2JMaW5lT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX2RuciwgaWRuTWF4LCBzd2FwLT5leHRlcm5hbF9kbnJfc2l6ZSwgY2JEbk9mZnNldCk7Ci0gIFdSSVRFIChleHRlcm5hbF9wZHIsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIGNiUGRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfc3ltLCBpc3ltTWF4LCBzd2FwLT5leHRlcm5hbF9zeW1fc2l6ZSwgY2JTeW1PZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfb3B0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgY2JPcHRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfYXV4LCBpYXV4TWF4LCBzaXplb2YgKHVuaW9uIGF1eF9leHQpLCBjYkF1eE9mZnNldCk7Ci0gIFdSSVRFIChzcywgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjYlNzT2Zmc2V0KTsKLSAgV1JJVEUgKHNzZXh0LCBpc3NFeHRNYXgsIHNpemVvZiAoY2hhciksIGNiU3NFeHRPZmZzZXQpOwotICBXUklURSAoZXh0ZXJuYWxfZmRyLCBpZmRNYXgsIHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplLCBjYkZkT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX3JmZCwgY3JmZCwgc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUsIGNiUmZkT2Zmc2V0KTsKLSAgV1JJVEUgKGV4dGVybmFsX2V4dCwgaWV4dE1heCwgc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUsIGNiRXh0T2Zmc2V0KTsKLSN1bmRlZiBXUklURQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBzaHVmZmxlIGxpc3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlY29mZl93cml0ZV9zaHVmZmxlIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiwKLQkJCQkJICAgIHN0cnVjdCBzaHVmZmxlICosIFBUUiBzcGFjZSkpOwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgc2h1ZmZsZSwgc3BhY2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIHN0cnVjdCBzaHVmZmxlICpzaHVmZmxlOwotICAgICBQVFIgc3BhY2U7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzaHVmZmxlICpsOwotICB1bnNpZ25lZCBsb25nIHRvdGFsOwotCi0gIHRvdGFsID0gMDsKLSAgZm9yIChsID0gc2h1ZmZsZTsgbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgbC0+ZmlsZXApCi0JewotCSAgaWYgKGJmZF93cml0ZSAobC0+dS5tZW1vcnksIDEsIGwtPnNpemUsIGFiZmQpICE9IGwtPnNpemUpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJmZF9zZWVrIChsLT51LmZpbGUuaW5wdXRfYmZkLCBsLT51LmZpbGUub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChzcGFjZSwgMSwgbC0+c2l6ZSwgbC0+dS5maWxlLmlucHV0X2JmZCkgIT0gbC0+c2l6ZQotCSAgICAgIHx8IGJmZF93cml0ZSAoc3BhY2UsIDEsIGwtPnNpemUsIGFiZmQpICE9IGwtPnNpemUpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICB0b3RhbCArPSBsLT5zaXplOwotICAgIH0KLQotICBpZiAoKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBiZmRfYnl0ZSAqczsKLQotICAgICAgaSA9IHN3YXAtPmRlYnVnX2FsaWduIC0gKHRvdGFsICYgKHN3YXAtPmRlYnVnX2FsaWduIC0gMSkpOwotICAgICAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKLSAgICAgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbWVtc2V0ICgoUFRSKSBzLCAwLCBpKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMsIDEsIGksIGFiZmQpICE9IGkpCi0JewotCSAgZnJlZSAocyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZnJlZSAocyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHVzaW5nIGFjY3VtdWxhdGVkIGxpbmtlcgotICAgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1iZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcgKGhhbmRsZSwgYWJmZCwgZGVidWcsIHN3YXAsIGluZm8sIHdoZXJlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBmaWxlX3B0ciB3aGVyZTsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLSAgUFRSIHNwYWNlID0gTlVMTDsKLQotICBpZiAoISBlY29mZl93cml0ZV9zeW1oZHIgKGFiZmQsIGRlYnVnLCBzd2FwLCB3aGVyZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3BhY2UgPSAoUFRSKSBiZmRfbWFsbG9jIChhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUpOwotICBpZiAoc3BhY2UgPT0gTlVMTCAmJiBhaW5mby0+bGFyZ2VzdF9maWxlX3NodWZmbGUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+bGluZSwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5wZHIsIHNwYWNlKQotICAgICAgfHwgISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+c3ltLCBzcGFjZSkKLSAgICAgIHx8ICEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPm9wdCwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5hdXgsIHNwYWNlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIGlzIHdyaXR0ZW4gb3V0IGZyb20gdGhlIGhhc2ggdGFibGUgaWYgdGhpcyBpcyBhCi0gICAgIGZpbmFsIGxpbmsuICAqLwotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGFpbmZvLT5zc19oYXNoID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCk7Ci0gICAgICBpZiAoISBlY29mZl93cml0ZV9zaHVmZmxlIChhYmZkLCBzd2FwLCBhaW5mby0+c3MsIHNwYWNlKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHRvdGFsOwotICAgICAgYmZkX2J5dGUgbnVsbDsKLSAgICAgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc2g7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGFpbmZvLT5zcyA9PSAoc3RydWN0IHNodWZmbGUgKikgTlVMTCk7Ci0gICAgICBudWxsID0gMDsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpICZudWxsLCAxLCAxLCBhYmZkKSAhPSAxKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgdG90YWwgPSAxOwotICAgICAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gTlVMTCB8fCBhaW5mby0+c3NfaGFzaC0+dmFsID09IDEpOwotICAgICAgZm9yIChzaCA9IGFpbmZvLT5zc19oYXNoOwotCSAgIHNoICE9IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTDsKLQkgICBzaCA9IHNoLT5uZXh0KQotCXsKLQkgIHNpemVfdCBsZW47Ci0KLQkgIGxlbiA9IHN0cmxlbiAoc2gtPnJvb3Quc3RyaW5nKTsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNoLT5yb290LnN0cmluZywgMSwgbGVuICsgMSwgYWJmZCkgIT0gbGVuICsgMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB0b3RhbCArPSBsZW4gKyAxOwotCX0KLQotICAgICAgaWYgKCh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKSAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgYmZkX2J5dGUgKnM7Ci0KLQkgIGkgPSBzd2FwLT5kZWJ1Z19hbGlnbiAtICh0b3RhbCAmIChzd2FwLT5kZWJ1Z19hbGlnbiAtIDEpKTsKLQkgIHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoaSk7Ci0JICBpZiAocyA9PSBOVUxMICYmIGkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBtZW1zZXQgKChQVFIpIHMsIDAsIGkpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcywgMSwgaSwgYWJmZCkgIT0gaSkKLQkgICAgewotCSAgICAgIGZyZWUgKHMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBmcmVlIChzKTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBleHRlcm5hbCBzdHJpbmdzIGFuZCBzeW1ib2wgYXJlIG5vdCBjb252ZXJ0ZWQgb3ZlciB0byB1c2luZwotICAgICBzaHVmZmxlcy4gIEZJWE1FOiBUaGV5IHByb2JhYmx5IHNob3VsZCBiZS4gICovCi0gIGlmIChiZmRfd3JpdGUgKGRlYnVnLT5zc2V4dCwgMSwgZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXgsIGFiZmQpCi0gICAgICAhPSAoYmZkX3NpemVfdHlwZSkgZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXgpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICgoZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXggJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICAgIGJmZF9ieXRlICpzOwotCi0gICAgICBpID0gKHN3YXAtPmRlYnVnX2FsaWduCi0JICAgLSAoZGVidWctPnN5bWJvbGljX2hlYWRlci5pc3NFeHRNYXggJiAoc3dhcC0+ZGVidWdfYWxpZ24gLSAxKSkpOwotICAgICAgcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChpKTsKLSAgICAgIGlmIChzID09IE5VTEwgJiYgaSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbWVtc2V0ICgoUFRSKSBzLCAwLCBpKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHMsIDEsIGksIGFiZmQpICE9IGkpCi0JewotCSAgZnJlZSAocyk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgICBmcmVlIChzKTsKLSAgICB9Ci0KLSAgaWYgKCEgZWNvZmZfd3JpdGVfc2h1ZmZsZSAoYWJmZCwgc3dhcCwgYWluZm8tPmZkciwgc3BhY2UpCi0gICAgICB8fCAhIGVjb2ZmX3dyaXRlX3NodWZmbGUgKGFiZmQsIHN3YXAsIGFpbmZvLT5yZmQsIHNwYWNlKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBCRkRfQVNTRVJUIChkZWJ1Zy0+c3ltYm9saWNfaGVhZGVyLmNiRXh0T2Zmc2V0ID09IDAKLQkgICAgICB8fCAoZGVidWctPnN5bWJvbGljX2hlYWRlci5jYkV4dE9mZnNldAotCQkgID09IChiZmRfdm1hKSBiZmRfdGVsbCAoYWJmZCkpKTsKLQotICBpZiAoYmZkX3dyaXRlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwKLQkJIGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCwgYWJmZCkKLSAgICAgICE9IGRlYnVnLT5zeW1ib2xpY19oZWFkZXIuaWV4dE1heCAqIHN3YXAtPmV4dGVybmFsX2V4dF9zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChzcGFjZSAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzcGFjZSAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogSGFuZGxlIHRoZSBmaW5kX25lYXJlc3RfbGluZSBmdW5jdGlvbiBmb3IgYm90aCBFQ09GRiBhbmQgTUlQUyBFTEYKLSAgIGZpbGVzLiAgKi8KLQotLyogQ29tcGFyZSBGRFIgZW50cmllcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBxc29ydC4gICovCi0KLXN0YXRpYyBpbnQKLWNtcF9mZHJ0YWJfZW50cnkgKGxlZnRwLCByaWdodHApCi0gICAgIGNvbnN0IFBUUiBsZWZ0cDsKLSAgICAgY29uc3QgUFRSIHJpZ2h0cDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqbHAgPQotICAgIChjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICopIGxlZnRwOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5ICpycCA9Ci0gICAgKGNvbnN0IHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKikgcmlnaHRwOwotCi0gIGlmIChscC0+YmFzZV9hZGRyIDwgcnAtPmJhc2VfYWRkcikKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChscC0+YmFzZV9hZGRyID4gcnAtPmJhc2VfYWRkcikKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEVhY2ggZmlsZSBkZXNjcmlwdG9yIChGRFIpIGhhcyBhIG1lbW9yeSBhZGRyZXNzLCB0byBzaW1wbGlmeQotICAgbG9va2luZyB1cCBhbiBGRFIgYnkgYWRkcmVzcywgd2UgYnVpbGQgYSB0YWJsZSBjb3ZlcmluZyBhbGwgRkRScwotICAgdGhhdCBoYXZlIGEgbGVhc3Qgb25lIHByb2NlZHVyZSBkZXNjcmlwdG9yIGluIHRoZW0uICBUaGUgZmluYWwKLSAgIHRhYmxlIHdpbGwgYmUgc29ydGVkIGJ5IGFkZHJlc3Mgc28gd2UgY2FuIGxvb2sgaXQgdXAgdmlhIGJpbmFyeQotICAgc2VhcmNoLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1rX2ZkcnRhYiAoYWJmZCwgZGVidWdfaW5mbywgZGVidWdfc3dhcCwgbGluZV9pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QgZGVidWdfaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwOwotICAgICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpsaW5lX2luZm87Ci17Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnRhYjsKLSAgRkRSICpmZHJfcHRyOwotICBGRFIgKmZkcl9zdGFydDsKLSAgRkRSICpmZHJfZW5kOwotICBib29sZWFuIHN0YWJzOwotICBsb25nIGxlbjsKLQotICBmZHJfc3RhcnQgPSBkZWJ1Z19pbmZvLT5mZHI7Ci0gIGZkcl9lbmQgPSBmZHJfc3RhcnQgKyBkZWJ1Z19pbmZvLT5zeW1ib2xpY19oZWFkZXIuaWZkTWF4OwotCi0gIC8qIEZpcnN0LCBsZXQncyBzZWUgaG93IGxvbmcgdGhlIHRhYmxlIG5lZWRzIHRvIGJlOiAqLwotICBmb3IgKGxlbiA9IDAsIGZkcl9wdHIgPSBmZHJfc3RhcnQ7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCi0gICAgewotICAgICAgaWYgKGZkcl9wdHItPmNwZCA9PSAwKQkvKiBza2lwIEZEUnMgdGhhdCBoYXZlIG5vIFBEUnMgKi8KLQljb250aW51ZTsKLSAgICAgICsrbGVuOwotICAgIH0KLQotICAvKiBOb3csIGNyZWF0ZSBhbmQgZmlsbCBpbiB0aGUgdGFibGU6ICovCi0KLSAgbGluZV9pbmZvLT5mZHJ0YWIgPSAoKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkqKQotCQkgICAgICAgYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkgICBsZW4gKiBzaXplb2YgKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkpKSk7Ci0gIGlmIChsaW5lX2luZm8tPmZkcnRhYiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbGluZV9pbmZvLT5mZHJ0YWJfbGVuID0gbGVuOwotCi0gIHRhYiA9IGxpbmVfaW5mby0+ZmRydGFiOwotICBmb3IgKGZkcl9wdHIgPSBmZHJfc3RhcnQ7IGZkcl9wdHIgPCBmZHJfZW5kOyBmZHJfcHRyKyspCi0gICAgewotICAgICAgaWYgKGZkcl9wdHItPmNwZCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBDaGVjayB3aGV0aGVyIHRoaXMgZmlsZSBoYXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgSW4KLQkgYSBmaWxlIHdpdGggc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB0aGUgc2Vjb25kIGxvY2FsCi0JIHN5bWJvbCBpcyBuYW1lZCBAc3RhYnMuICAqLwotICAgICAgc3RhYnMgPSBmYWxzZTsKLSAgICAgIGlmIChmZHJfcHRyLT5jc3ltID49IDIpCi0JewotCSAgY2hhciAqc3ltX3B0cjsKLQkgIFNZTVIgc3ltOwotCi0JICBzeW1fcHRyID0gKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX3N5bQotCQkgICAgICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMSkqZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOwotCSAgaWYgKHN0cmNtcCAoZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzcywKLQkJICAgICAgU1RBQlNfU1lNQk9MKSA9PSAwKQotCSAgICBzdGFicyA9IHRydWU7Ci0JfQotCi0gICAgICBpZiAoIXN0YWJzKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7Ci0JICBjaGFyICpwZHJfcHRyOwotCSAgUERSIHBkcjsKLQotCSAgZXh0ZXJuYWxfcGRyX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9wZHJfc2l6ZTsKLQotCSAgcGRyX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9wZHIKLQkJICAgICArIGZkcl9wdHItPmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpOwotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIHBkcl9wdHIsICZwZHIpOwotCSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IFBEUiBpcyB0aGUgb2Zmc2V0IG9mIHRoYXQKLQkgICAgIHByb2NlZHVyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIGZpbGUgRkRSLiAgKi8KLQkgIHRhYi0+YmFzZV9hZGRyID0gZmRyX3B0ci0+YWRyIC0gcGRyLmFkcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogWFhYIEkgZG9uJ3Qga25vdyBhYm91dCBzdGFicywgc28gdGhpcyBpcyBhIGd1ZXNzCi0JICAgICAoZGF2aWRtQGNzLmFyaXpvbmEuZWR1KTogKi8KLQkgIHRhYi0+YmFzZV9hZGRyID0gZmRyX3B0ci0+YWRyOwotCX0KLSAgICAgIHRhYi0+ZmRyID0gZmRyX3B0cjsKLSAgICAgICsrdGFiOwotICAgIH0KLQotICAvKiBGaW5hbGx5LCB0aGUgdGFibGUgaXMgc29ydGVkIGluIGluY3JlYXNpbmcgbWVtb3J5LWFkZHJlc3Mgb3JkZXIuCi0gICAgIFRoZSB0YWJsZSBpcyBtb3N0bHkgc29ydGVkIGFscmVhZHksIGJ1dCB0aGVyZSBhcmUgY2FzZXMgKGUuZy4sCi0gICAgIHN0YXRpYyBmdW5jdGlvbnMgaW4gaW5jbHVkZSBmaWxlcyksIHdoZXJlIHRoaXMgZG9lcyBub3QgaG9sZC4KLSAgICAgVXNlICJvZHVtcCAtUEZ2IiB0byB2ZXJpZnkuLi4gICovCi0gIHFzb3J0ICgoUFRSKSBsaW5lX2luZm8tPmZkcnRhYiwgbGVuLAotCSBzaXplb2YgKHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkpLCBjbXBfZmRydGFiX2VudHJ5KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIGluZGV4IG9mIGZpcnN0IEZEUiB0aGF0IGNvdmVycyB0byBPRkZTRVQuICAqLwotCi1zdGF0aWMgbG9uZwotZmRydGFiX2xvb2t1cCAobGluZV9pbmZvLCBvZmZzZXQpCi0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIGxvbmcgbG93LCBoaWdoLCBsZW47Ci0gIGxvbmcgbWlkID0gLTE7Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKnRhYjsKLQotICBsZW4gPSBsaW5lX2luZm8tPmZkcnRhYl9sZW47Ci0gIGlmIChsZW4gPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgdGFiID0gbGluZV9pbmZvLT5mZHJ0YWI7Ci0gIGZvciAobG93ID0gMCwgaGlnaCA9IGxlbiAtIDEgOyBsb3cgIT0gaGlnaCA7KQotICAgIHsKLSAgICAgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0gICAgICBpZiAob2Zmc2V0ID49IHRhYlttaWRdLmJhc2VfYWRkciAmJiBvZmZzZXQgPCB0YWJbbWlkICsgMV0uYmFzZV9hZGRyKQotCWdvdG8gZmluZF9taW47Ci0KLSAgICAgIGlmICh0YWJbbWlkXS5iYXNlX2FkZHIgPiBvZmZzZXQpCi0JaGlnaCA9IG1pZDsKLSAgICAgIGVsc2UKLQlsb3cgPSBtaWQgKyAxOwotICAgIH0KLSAgKyttaWQ7Ci0KLSAgLyogbGFzdCBlbnRyeSBpcyBjYXRjaC1hbGwgZm9yIGFsbCBoaWdoZXIgYWRkcmVzc2VzOiAqLwotICBpZiAob2Zmc2V0IDwgdGFiW21pZF0uYmFzZV9hZGRyKQotICAgIHJldHVybiAtMTsKLQotIGZpbmRfbWluOgotCi0gIHdoaWxlIChtaWQgPiAwICYmIHRhYlttaWQgLSAxXS5iYXNlX2FkZHIgPT0gdGFiW21pZF0uYmFzZV9hZGRyKQotICAgIC0tbWlkOwotCi0gIHJldHVybiBtaWQ7Ci19Ci0KLS8qIExvb2sgdXAgYSBsaW5lIGdpdmVuIGFuIGFkZHJlc3MsIHN0b3JpbmcgdGhlIGluZm9ybWF0aW9uIGluCi0gICBMSU5FX0lORk8tPmNhY2hlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxvb2t1cF9saW5lIChhYmZkLCBkZWJ1Z19pbmZvLCBkZWJ1Z19zd2FwLCBsaW5lX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKiBjb25zdCBkZWJ1Z19pbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IGRlYnVnX3N3YXA7Ci0gICAgIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKmxpbmVfaW5mbzsKLXsKLSAgc3RydWN0IGVjb2ZmX2ZkcnRhYl9lbnRyeSAqdGFiOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYm9vbGVhbiBzdGFiczsKLSAgRkRSICpmZHJfcHRyOwotICBpbnQgaTsKLSAgCi0gIG9mZnNldCA9IGxpbmVfaW5mby0+Y2FjaGUuc3RhcnQ7Ci0gICAgIAotICAvKiBCdWlsZCBGRFIgdGFibGUgKHNvcnRlZCBieSBvYmplY3QgZmlsZSdzIGJhc2UtYWRkcmVzcykgaWYgd2UKLSAgICAgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5LiAgKi8KLSAgaWYgKGxpbmVfaW5mby0+ZmRydGFiID09IE5VTEwKLSAgICAgICYmICFta19mZHJ0YWIgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHRhYiA9IGxpbmVfaW5mby0+ZmRydGFiOwotCi0gIC8qIGZpbmQgZmlyc3QgRkRSIGZvciBhZGRyZXNzIE9GRlNFVCAqLwotICBpID0gZmRydGFiX2xvb2t1cCAobGluZV9pbmZvLCBvZmZzZXQpOwotICBpZiAoaSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwkJLyogbm8gRkRSLCBubyBmdW4uLi4gKi8KLSAgZmRyX3B0ciA9IHRhYltpXS5mZHI7Ci0KLSAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGZpbGUgaGFzIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluIGEKLSAgICAgZmlsZSB3aXRoIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgdGhlIHNlY29uZCBsb2NhbCBzeW1ib2wgaXMKLSAgICAgbmFtZWQgQHN0YWJzLiAgKi8KLSAgc3RhYnMgPSBmYWxzZTsKLSAgaWYgKGZkcl9wdHItPmNzeW0gPj0gMikKLSAgICB7Ci0gICAgICBjaGFyICpzeW1fcHRyOwotICAgICAgU1lNUiBzeW07Ci0KLSAgICAgIHN5bV9wdHIgPSAoKGNoYXIgKikgZGVidWdfaW5mby0+ZXh0ZXJuYWxfc3ltCi0JCSArIChmZHJfcHRyLT5pc3ltQmFzZSArIDEpICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICAgICAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOwotICAgICAgaWYgKHN0cmNtcCAoZGVidWdfaW5mby0+c3MgKyBmZHJfcHRyLT5pc3NCYXNlICsgc3ltLmlzcywKLQkJICBTVEFCU19TWU1CT0wpID09IDApCi0Jc3RhYnMgPSB0cnVlOwotICAgIH0KLQotICBpZiAoIXN0YWJzKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemU7Ci0gICAgICBjaGFyICpwZHJfcHRyOwotICAgICAgY2hhciAqYmVzdF9wZHIgPSBOVUxMOwotICAgICAgRkRSICpiZXN0X2ZkcjsKLSAgICAgIGJmZF92bWEgYmVzdF9kaXN0ID0gfjA7Ci0gICAgICBQRFIgcGRyOwotICAgICAgdW5zaWduZWQgY2hhciAqbGluZV9wdHI7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpsaW5lX2VuZDsKLSAgICAgIGludCBsaW5lbm87Ci0gICAgICAvKiBUaGlzIGZpbGUgdXNlcyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFYWNoIEZEUiBoYXMgYQotICAgICAgICAgbGlzdCBvZiBwcm9jZWR1cmUgZGVzY3JpcHRvcnMgKFBEUikuICBUaGUgYWRkcmVzcyBpbiB0aGUgRkRSCi0gICAgICAgICBpcyB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlLiAgVGhlIGFkZHJlc3MKLSAgICAgICAgIGluIHRoZSBmaXJzdCBQRFIgZ2l2ZXMgdGhlIG9mZnNldCBvZiB0aGF0IHByb2NlZHVyZSByZWxhdGl2ZQotICAgICAgICAgdG8gdGhlIG9iamVjdCBmaWxlJ3MgYmFzZS1hZGRyZXNzLiAgVGhlIGFkZHJlc3NlcyBpbgotICAgICAgICAgc3Vic2VxdWVudCBQRFJzIHNwZWNpZnkgZWFjaCBwcm9jZWR1cmUncyBhZGRyZXNzIHJlbGF0aXZlIHRvCi0gICAgICAgICB0aGUgb2JqZWN0IGZpbGUncyBiYXNlLWFkZHJlc3MuICBUbyBtYWtlIHRoaW5ncyBtb3JlIGp1aWN5LAotICAgICAgICAgd2hlbmV2ZXIgdGhlIFBST0YgYml0IGluIHRoZSBQRFIgaXMgc2V0LCB0aGUgcmVhbCBlbnRyeSBwb2ludAotICAgICAgICAgb2YgdGhlIHByb2NlZHVyZSBtYXkgYmUgMTYgYnl0ZXMgYmVsb3cgd2hhdCB3b3VsZCBub3JtYWxseSBiZQotICAgICAgICAgdGhlIHByb2NlZHVyZSdzIGVudHJ5IHBvaW50LiAgSW5zdGVhZCwgREVDIGNhbWUgdXAgd2l0aCBhCi0gICAgICAgICB3aWNrZWQgc2NoZW1lIHRvIGNyZWF0ZSBwcm9maWxlZCBsaWJyYXJpZXMgIm9uIHRoZSBmbHkiOgotICAgICAgICAgaW5zdGVhZCBvZiBzaGlwcGluZyBhIHJlZ3VsYXIgYW5kIGEgcHJvZmlsZWQgdmVyc2lvbiBvZiBlYWNoCi0gICAgICAgICBsaWJyYXJ5LCB0aGV5IGluc2VydCAxNiBieXRlcyBvZiB1bnVzZWQgc3BhY2UgaW4gZnJvbnQgb2YKLSAgICAgICAgIGVhY2ggcHJvY2VkdXJlIGFuZCBzZXQgdGhlICJwcm9mIiBiaXQgaW4gdGhlIFBEUiB0byBpbmRpY2F0ZQotICAgICAgICAgdGhhdCB0aGVyZSBpcyBhIGdhcCB0aGVyZSAodGhpcyBpcyBkb25lIGF1dG9tYWdpY2FsbHkgYnkgImFzIgotICAgICAgICAgd2hlbiBvcHRpb24gIi1wZyIgaXMgc3BlY2lmaWVkKS4gIFRodXMsIG5vcm1hbGx5LCB5b3UgbGluawotICAgICAgICAgYWdhaW5zdCBzdWNoIGEgbGlicmFyeSBhbmQsIGV4Y2VwdCBmb3IgbG90cyBvZiAxNiBieXRlIGdhcHMKLSAgICAgICAgIGJldHdlZW4gZnVuY3Rpb25zLCB0aGluZ3Mgd2lsbCBiZWhhdmUgYXMgdXN1YWwuICBIb3dldmVyLAotICAgICAgICAgd2hlbiBpbnZva2luZyAibGQiIHdpdGggb3B0aW9uICItcGciLCBpdCB3aWxsIGZpbGwgdGhvc2UgZ2FwcwotICAgICAgICAgd2l0aCBjb2RlIHRoYXQgY2FsbHMgbWNvdW50KCkuICBJdCB0aGVuIG1vdmVzIHRoZSBmdW5jdGlvbidzCi0gICAgICAgICBlbnRyeSBwb2ludCBkb3duIGJ5IDE2IGJ5dGVzLCBhbmQgb3V0IHBvcHMgYSBiaW5hcnkgdGhhdCBoYXMKLSAgICAgICAgIGFsbCBmdW5jdGlvbnMgcHJvZmlsZWQuCi0KLSAgICAgICAgIE5PVEU6IE5laXRoZXIgRkRScyBub3IgUERScyBhcmUgc3RyaWN0bHkgc29ydGVkIGluIG1lbW9yeQotICAgICAgICAgICAgICAgb3JkZXIuICBGb3IgZXhhbXBsZSwgd2hlbiBpbmNsdWRpbmcgaGVhZGVyLWZpbGVzIHRoYXQKLSAgICAgICAgICAgICAgIGRlZmluZSBmdW5jdGlvbnMsIHRoZSBGRFJzIGZvbGxvdyBiZWhpbmQgdGhlIGluY2x1ZGluZwotICAgICAgICAgICAgICAgZmlsZSwgZXZlbiB0aG91Z2ggdGhlaXIgY29kZSBtYXkgaGF2ZSBiZWVuIGdlbmVyYXRlZCBhdAotICAgICAgICAgICAgICAgYSBsb3dlciBhZGRyZXNzLiAgRmlsZSBjb2ZmLWFscGhhLmMgZnJvbSBsaWJiZmQKLSAgICAgICAgICAgICAgIGlsbHVzdHJhdGVzIHRoaXMgKHVzZSAib2R1bXAgLVBGdiIgdG8gbG9vayBhdCBhIGZpbGUncwotICAgICAgICAgICAgICAgRkRSL1BEUikuICBTaW1pbGFybHksIFBEUnMgYXJlIHNvbWV0aW1lcyBvdXQgb2Ygb3JkZXIKLSAgICAgICAgICAgICAgIGFzIHdlbGwuICBBbiBleGFtcGxlIG9mIHRoaXMgaXMgT1NGLzEgdjMuMCBsaWJjJ3MKLSAgICAgICAgICAgICAgIG1hbGxvYy5jLiAgSSdtIG5vdCBzdXJlIHdoeSB0aGlzIGhhcHBlbnMsIGJ1dCBpdCBjb3VsZAotICAgICAgICAgICAgICAgYmUgZHVlIHRvIG9wdGltaXphdGlvbnMgdGhhdCByZW9yZGVyIGEgZnVuY3Rpb24ncwotICAgICAgICAgICAgICAgcG9zaXRpb24gd2l0aGluIGFuIG9iamVjdC1maWxlLgotICAgICAgICAKLSAgICAgICAgIFN0cmF0ZWd5OgotICAgICAgICAgCi0gICAgICAgICBPbiB0aGUgZmlyc3QgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCB3ZSBidWlsZCBhIHRhYmxlIG9mIEZEUnMKLSAgICAgICAgIHRoYXQgaXMgc29ydGVkIGJ5IHRoZSBiYXNlLWFkZHJlc3Mgb2YgdGhlIG9iamVjdC1maWxlIHRoZSBGRFIKLSAgICAgICAgIGlzIHJlZmVycmluZyB0by4gIE5vdGljZSB0aGF0IGVhY2ggb2JqZWN0LWZpbGUgbWF5IGNvbnRhaW4KLSAgICAgICAgIGNvZGUgZnJvbSBtdWx0aXBsZSBzb3VyY2UgZmlsZXMgKGUuZy4sIGR1ZSB0byBjb2RlIGRlZmluZWQgaW4KLSAgICAgICAgIGluY2x1ZGUgZmlsZXMpLiAgVGh1cywgZm9yIGFueSBnaXZlbiBiYXNlLWFkZHJlc3MsIHRoZXJlIG1heQotICAgICAgICAgYmUgbXVsdGlwbGUgRkRScyAoYnV0IHRoaXMgY2FzZSBpcywgZm9ydHVuYXRlbHksIHVuY29tbW9uKS4KLSAgICAgICAgIGxvb2t1cChhZGRyKSBndWFyYW50ZWVzIHRvIHJldHVybiB0aGUgZmlyc3QgRkRSIHRoYXQgYXBwbGllcwotICAgICAgICAgdG8gYWRkcmVzcyBBRERSLiAgVGh1cywgYWZ0ZXIgaW52b2tpbmcgbG9va3VwKCksIHdlIGhhdmUgYQotICAgICAgICAgbGlzdCBvZiBGRFJzIHRoYXQgbWF5IGNvbnRhaW4gdGhlIFBEUiBmb3IgQUREUi4gIE5leHQsIHdlCi0gICAgICAgICB3YWxrIHRocm91Z2ggdGhlIFBEUnMgb2YgdGhlc2UgRkRScyBhbmQgbG9jYXRlIHRoZSBvbmUgdGhhdAotICAgICAgICAgaXMgY2xvc2VzdCB0byBBRERSIChpLmUuLCBmb3Igd2hpY2ggdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotICAgICAgICAgQUREUiBhbmQgdGhlIFBEUidzIGVudHJ5IHBvaW50IGlzIHBvc2l0aXZlIGFuZCBtaW5pbWFsKS4KLSAgICAgICAgIE9uY2UsIHRoZSByaWdodCBGRFIgYW5kIFBEUiBhcmUgbG9jYXRlZCwgd2Ugc2ltcGx5IHdhbGsKLSAgICAgICAgIHRocm91Z2ggdGhlIGxpbmUtbnVtYmVyIHRhYmxlIHRvIGxvb2t1cCB0aGUgbGluZS1udW1iZXIgdGhhdAotICAgICAgICAgYmVzdCBtYXRjaGVzIEFERFIuICBPYnZpb3VzbHksIHRoaW5ncyBjb3VsZCBiZSBzcGVkIHVwIGJ5Ci0gICAgICAgICBrZWVwaW5nIGEgc29ydGVkIGxpc3Qgb2YgUERScyBpbnN0ZWFkIG9mIGEgc29ydGVkIGxpc3Qgb2YKLSAgICAgICAgIEZEUnMuICBIb3dldmVyLCB0aGlzIHdvdWxkIGluY3JlYXNlIHNwYWNlIHJlcXVpcmVtZW50cwotICAgICAgICAgY29uc2lkZXJhYmx5LCB3aGljaCBpcyB1bmRlc2lyYWJsZS4gICovCi0gICAgICBleHRlcm5hbF9wZHJfc2l6ZSA9IGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplOwotCi0gICAgICAvKiBNYWtlIG9mZnNldCByZWxhdGl2ZSB0byBvYmplY3QgZmlsZSdzIHN0YXJ0LWFkZHJlc3M6ICovCi0gICAgICBvZmZzZXQgLT0gdGFiW2ldLmJhc2VfYWRkcjsKLSAgICAgIC8qIFNlYXJjaCBGRFIgbGlzdCBzdGFydGluZyBhdCB0YWJbaV0gZm9yIHRoZSBQRFIgdGhhdCBiZXN0IG1hdGNoZXMKLSAgICAgICAgIE9GRlNFVC4gIE5vcm1hbGx5LCB0aGUgRkRSIGxpc3QgaXMgb25seSBvbmUgZW50cnkgbG9uZy4gICovCi0gICAgICBiZXN0X2ZkciA9IE5VTEw7Ci0gICAgICBkbwotCXsKLQkgIGJmZF92bWEgZGlzdCwgbWluX2Rpc3QgPSAwOwotCSAgY2hhciAqcGRyX2hvbGQ7Ci0JICBjaGFyICpwZHJfZW5kOwotCSAgCi0JICBmZHJfcHRyID0gdGFiW2ldLmZkcjsKLQkgIAotCSAgcGRyX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9wZHIKLQkJICAgICArIGZkcl9wdHItPmlwZEZpcnN0ICogZXh0ZXJuYWxfcGRyX3NpemUpOwotCSAgcGRyX2VuZCA9IHBkcl9wdHIgKyBmZHJfcHRyLT5jcGQgKiBleHRlcm5hbF9wZHJfc2l6ZTsKLQkgICgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKTsKLQkgIC8qIEZpbmQgUERSIHRoYXQgaXMgY2xvc2VzdCB0byBPRkZTRVQuICBJZiBwZHIucHJvZiBpcyBzZXQsCi0JICAgICB0aGUgcHJvY2VkdXJlIGVudHJ5LXBvaW50ICptYXkqIGJlIDB4MTAgYmVsb3cgcGRyLmFkci4gIFdlCi0JICAgICBzaW1wbHkgcHJldGVuZCB0aGF0IHBkci5wcm9mICppbXBsaWVzKiBhIGxvd2VyIGVudHJ5LXBvaW50LgotCSAgICAgVGhpcyBpcyBzYWZlIGJlY2F1c2UgaXQganVzdCBtZWFucyB0aGF0IG1heSBpZGVudGlmeSA0IE5PUHMKLQkgICAgIGluIGZyb250IG9mIHRoZSBmdW5jdGlvbiBhcyBiZWxvbmdpbmcgdG8gdGhlIGZ1bmN0aW9uLiAgKi8KLQkgIGZvciAocGRyX2hvbGQgPSBOVUxMOwotCSAgICAgICBwZHJfcHRyIDwgcGRyX2VuZDsKLQkgICAgICAgKHBkcl9wdHIgKz0gZXh0ZXJuYWxfcGRyX3NpemUsCi0JCSgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKSkpCi0JICAgIHsKLQkgICAgICBpZiAob2Zmc2V0ID49IChwZHIuYWRyIC0gMHgxMCAqIHBkci5wcm9mKSkKLQkJewotCQkgIGRpc3QgPSBvZmZzZXQgLSAocGRyLmFkciAtIDB4MTAgKiBwZHIucHJvZik7Ci0JCSAgaWYgKCFwZHJfaG9sZCB8fCBkaXN0IDwgbWluX2Rpc3QpCi0JCSAgICB7Ci0JCSAgICAgIG1pbl9kaXN0ID0gZGlzdDsKLQkJICAgICAgcGRyX2hvbGQgPSBwZHJfcHRyOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIAotCSAgaWYgKCFiZXN0X3BkciB8fCBtaW5fZGlzdCA8IGJlc3RfZGlzdCkKLQkgICAgewotCSAgICAgIGJlc3RfZGlzdCA9IG1pbl9kaXN0OwotCSAgICAgIGJlc3RfZmRyID0gZmRyX3B0cjsKLQkgICAgICBiZXN0X3BkciA9IHBkcl9ob2xkOwotCSAgICB9Ci0JICAvKiBjb250aW51ZSBsb29waW5nIHVudGlsIGJhc2VfYWRkciBvZiBuZXh0IGVudHJ5IGlzIGRpZmZlcmVudDogKi8KLQl9Ci0gICAgICB3aGlsZSAoKytpIDwgbGluZV9pbmZvLT5mZHJ0YWJfbGVuCi0JICAgICAmJiB0YWJbaV0uYmFzZV9hZGRyID09IHRhYltpIC0gMV0uYmFzZV9hZGRyKTsKLQotICAgICAgaWYgKCFiZXN0X2ZkciB8fCAhYmVzdF9wZHIpCi0JcmV0dXJuIGZhbHNlOwkJCS8qIHNob3VsZG4ndCBoYXBwZW4uLi4gKi8KLQotICAgICAgLyogcGhldywgZmluYWxseSB3ZSBnb3Qgc29tZXRoaW5nIHRoYXQgd2UgY2FuIGhvbGQgb250bzogKi8KLSAgICAgIGZkcl9wdHIgPSBiZXN0X2ZkcjsKLSAgICAgIHBkcl9wdHIgPSBiZXN0X3BkcjsKLSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9wZHJfaW4pIChhYmZkLCAoUFRSKSBwZHJfcHRyLCAmcGRyKTsKLSAgICAgIC8qIE5vdyB3ZSBjYW4gbG9vayBmb3IgdGhlIGFjdHVhbCBsaW5lIG51bWJlci4gIFRoZSBsaW5lIG51bWJlcnMKLSAgICAgICAgIGFyZSBzdG9yZWQgaW4gYSB2ZXJ5IGZ1bmt5IGZvcm1hdCwgd2hpY2ggSSB3b24ndCB0cnkgdG8KLSAgICAgICAgIGRlc2NyaWJlLiAgVGhlIHNlYXJjaCBpcyBib3VuZGVkIGJ5IHRoZSBlbmQgb2YgdGhlIEZEUnMgbGluZQotICAgICAgICAgbnVtYmVyIGVudHJpZXMuICAqLwotICAgICAgbGluZV9lbmQgPSBkZWJ1Z19pbmZvLT5saW5lICsgZmRyX3B0ci0+Y2JMaW5lT2Zmc2V0ICsgZmRyX3B0ci0+Y2JMaW5lOwotCi0gICAgICAvKiBNYWtlIG9mZnNldCByZWxhdGl2ZSB0byBwcm9jZWR1cmUgZW50cnk6ICovCi0gICAgICBvZmZzZXQgLT0gcGRyLmFkciAtIDB4MTAgKiBwZHIucHJvZjsKLSAgICAgIGxpbmVubyA9IHBkci5sbkxvdzsKLSAgICAgIGxpbmVfcHRyID0gZGVidWdfaW5mby0+bGluZSArIGZkcl9wdHItPmNiTGluZU9mZnNldCArIHBkci5jYkxpbmVPZmZzZXQ7Ci0gICAgICB3aGlsZSAobGluZV9wdHIgPCBsaW5lX2VuZCkKLQl7Ci0JICBpbnQgZGVsdGE7Ci0JICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLQkgIGRlbHRhID0gKmxpbmVfcHRyID4+IDQ7Ci0JICBpZiAoZGVsdGEgPj0gMHg4KQotCSAgICBkZWx0YSAtPSAweDEwOwotCSAgY291bnQgPSAoKmxpbmVfcHRyICYgMHhmKSArIDE7Ci0JICArK2xpbmVfcHRyOwotCSAgaWYgKGRlbHRhID09IC04KQotCSAgICB7Ci0JICAgICAgZGVsdGEgPSAoKChsaW5lX3B0clswXSkgJiAweGZmKSA8PCA4KSArICgobGluZV9wdHJbMV0pICYgMHhmZik7Ci0JICAgICAgaWYgKGRlbHRhID49IDB4ODAwMCkKLQkJZGVsdGEgLT0gMHgxMDAwMDsKLQkgICAgICBsaW5lX3B0ciArPSAyOwotCSAgICB9Ci0JICBsaW5lbm8gKz0gZGVsdGE7Ci0JICBpZiAob2Zmc2V0IDwgY291bnQgKiA0KQotCSAgICB7Ci0JICAgICAgbGluZV9pbmZvLT5jYWNoZS5zdG9wICs9IGNvdW50ICogNCAtIG9mZnNldDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgb2Zmc2V0IC09IGNvdW50ICogNDsKLQl9Ci0KLSAgICAgIC8qIElmIGZkcl9wdHItPnJzcyBpcyAtMSwgdGhlbiB0aGlzIGZpbGUgZG9lcyBub3QgaGF2ZSBmdWxsCi0gICAgICAgICBzeW1ib2xzLCBhdCBsZWFzdCBhY2NvcmRpbmcgdG8gZ2RiL21pcHNyZWFkLmMuICAqLwotICAgICAgaWYgKGZkcl9wdHItPnJzcyA9PSAtMSkKLQl7Ci0JICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gTlVMTDsKLQkgIGlmIChwZHIuaXN5bSA9PSAtMSkKLQkgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgRVhUUiBwcm9jX2V4dDsKLQotCSAgICAgICgqZGVidWdfc3dhcC0+c3dhcF9leHRfaW4pCi0JCShhYmZkLAotCQkgKChjaGFyICopIGRlYnVnX2luZm8tPmV4dGVybmFsX2V4dAotCQkgICsgcGRyLmlzeW0gKiBkZWJ1Z19zd2FwLT5leHRlcm5hbF9leHRfc2l6ZSksCi0JCSAmcHJvY19leHQpOwotCSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gKGRlYnVnX2luZm8tPnNzZXh0Ci0JCQkJCSAgICAgICArIHByb2NfZXh0LmFzeW0uaXNzKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBTWU1SIHByb2Nfc3ltOwotCi0JICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gKGRlYnVnX2luZm8tPnNzCi0JCQkJICAgICAgICsgZmRyX3B0ci0+aXNzQmFzZQotCQkJCSAgICAgICArIGZkcl9wdHItPnJzcyk7Ci0JICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKQotCSAgICAoYWJmZCwKLQkgICAgICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkgICAgICArICgoZmRyX3B0ci0+aXN5bUJhc2UgKyBwZHIuaXN5bSkKLQkJICogZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpKSwKLQkgICAgICZwcm9jX3N5bSk7Ci0JICBsaW5lX2luZm8tPmNhY2hlLmZ1bmN0aW9ubmFtZSA9IChkZWJ1Z19pbmZvLT5zcwotCQkJCQkgICArIGZkcl9wdHItPmlzc0Jhc2UKLQkJCQkJICAgKyBwcm9jX3N5bS5pc3MpOwotCX0KLSAgICAgIGlmIChsaW5lbm8gPT0gaWxpbmVOaWwpCi0JbGluZW5vID0gMDsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUubGluZV9udW0gPSBsaW5lbm87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgICAgIGNvbnN0IGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqbWFpbl9maWxlX25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpjdXJyZW50X2ZpbGVfbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci0gICAgICBjb25zdCBjaGFyICpsaW5lX2ZpbGVfbmFtZTsKLSAgICAgIGJmZF92bWEgbG93X2Z1bmNfdm1hOwotICAgICAgYmZkX3ZtYSBsb3dfbGluZV92bWE7Ci0gICAgICBib29sZWFuIHBhc3RfbGluZTsKLSAgICAgIGJvb2xlYW4gcGFzdF9mbjsKLSAgICAgIGNoYXIgKnN5bV9wdHIsICpzeW1fcHRyX2VuZDsKLSAgICAgIHNpemVfdCBsZW4sIGZ1bmNsZW47Ci0gICAgICBjaGFyICpidWZmZXIgPSBOVUxMOwotCi0gICAgICAvKiBUaGlzIGZpbGUgdXNlcyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXaGVuIGdjYyBpcyBub3QKLQkgb3B0aW1pemluZywgaXQgd2lsbCBwdXQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGJlZm9yZQotCSB0aGUgZnVuY3Rpb24gbmFtZSBzdGFicyBlbnRyeS4gIFdoZW4gZ2NjIGlzIG9wdGltaXppbmcsIGl0Ci0JIHdpbGwgcHV0IHRoZSBzdGFicyBlbnRyeSBmb3IgYWxsIHRoZSBmdW5jdGlvbiBmaXJzdCwgZm9sbG93ZWQKLQkgYnkgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKFRoaXMgYXBwZWFycyB0byBoYXBwZW4KLQkgYmVjYXVzZSBvZiB0aGUgdHdvIG91dHB1dCBmaWxlcyB1c2VkIGJ5IHRoZSAtbWdwb3B0IHN3aXRjaCwKLQkgd2hpY2ggaXMgaW1wbGllZCBieSAtTykuICBUaGlzIG1lYW5zIHRoYXQgd2UgbXVzdCBrZWVwCi0JIGxvb2tpbmcgdGhyb3VnaCB0aGUgc3ltYm9scyB1bnRpbCB3ZSBmaW5kIGJvdGggYSBsaW5lIG51bWJlcgotCSBhbmQgYSBmdW5jdGlvbiBuYW1lIHdoaWNoIGFyZSBiZXlvbmQgdGhlIGFkZHJlc3Mgd2Ugd2FudC4gICovCi0KLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBOVUxMOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5mdW5jdGlvbm5hbWUgPSBOVUxMOwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IDA7Ci0KLSAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIG1haW5fZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGN1cnJlbnRfZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGZ1bmN0aW9uX25hbWUgPSBOVUxMOwotICAgICAgbGluZV9maWxlX25hbWUgPSBOVUxMOwotICAgICAgbG93X2Z1bmNfdm1hID0gMDsKLSAgICAgIGxvd19saW5lX3ZtYSA9IDA7Ci0gICAgICBwYXN0X2xpbmUgPSBmYWxzZTsKLSAgICAgIHBhc3RfZm4gPSBmYWxzZTsKLQotICAgICAgZXh0ZXJuYWxfc3ltX3NpemUgPSBkZWJ1Z19zd2FwLT5leHRlcm5hbF9zeW1fc2l6ZTsKLQotICAgICAgc3ltX3B0ciA9ICgoY2hhciAqKSBkZWJ1Z19pbmZvLT5leHRlcm5hbF9zeW0KLQkJICsgKGZkcl9wdHItPmlzeW1CYXNlICsgMikgKiBleHRlcm5hbF9zeW1fc2l6ZSk7Ci0gICAgICBzeW1fcHRyX2VuZCA9IHN5bV9wdHIgKyAoZmRyX3B0ci0+Y3N5bSAtIDIpICogZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBmb3IgKDsKLQkgICBzeW1fcHRyIDwgc3ltX3B0cl9lbmQgJiYgKCEgcGFzdF9saW5lIHx8ICEgcGFzdF9mbik7Ci0JICAgc3ltX3B0ciArPSBleHRlcm5hbF9zeW1fc2l6ZSkKLQl7Ci0JICBTWU1SIHN5bTsKLQotCSAgKCpkZWJ1Z19zd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIHN5bV9wdHIsICZzeW0pOwotCi0JICBpZiAoRUNPRkZfSVNfU1RBQiAoJnN5bSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKEVDT0ZGX1VOTUFSS19TVEFCIChzeW0uaW5kZXgpKQotCQl7Ci0JCWNhc2UgTl9TTzoKLQkJICBtYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0KLQkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0KLQkJICAvKiBDaGVjayB0aGUgbmV4dCBzeW1ib2wgdG8gc2VlIGlmIGl0IGlzIGFsc28gYW4KLSAgICAgICAgICAgICAgICAgICAgIE5fU08gc3ltYm9sLiAgKi8KLQkJICBpZiAoc3ltX3B0ciArIGV4dGVybmFsX3N5bV9zaXplIDwgc3ltX3B0cl9lbmQpCi0JCSAgICB7Ci0JCSAgICAgIFNZTVIgbmV4dHN5bTsKLQotCQkgICAgICAoKmRlYnVnX3N3YXAtPnN3YXBfc3ltX2luKSAoYWJmZCwKLQkJCQkJCSAgc3ltX3B0ciArIGV4dGVybmFsX3N5bV9zaXplLAotCQkJCQkJICAmbmV4dHN5bSk7Ci0JCSAgICAgIGlmIChFQ09GRl9JU19TVEFCICgmbmV4dHN5bSkKLQkJCSAgJiYgRUNPRkZfVU5NQVJLX1NUQUIgKG5leHRzeW0uaW5kZXgpID09IE5fU08pCi0JCQl7Ci0gCQkJICBkaXJlY3RvcnlfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lOwotCQkJICBtYWluX2ZpbGVfbmFtZSA9IGN1cnJlbnRfZmlsZV9uYW1lID0KLQkJCSAgICBkZWJ1Z19pbmZvLT5zcyArIGZkcl9wdHItPmlzc0Jhc2UgKyBuZXh0c3ltLmlzczsKLQkJCSAgc3ltX3B0ciArPSBleHRlcm5hbF9zeW1fc2l6ZTsKLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlIE5fU09MOgotCQkgIGN1cnJlbnRfZmlsZV9uYW1lID0KLQkJICAgIGRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBOX0ZVTjoKLQkJICBpZiAoc3ltLnZhbHVlID4gb2Zmc2V0KQotCQkgICAgcGFzdF9mbiA9IHRydWU7Ci0JCSAgZWxzZSBpZiAoc3ltLnZhbHVlID49IGxvd19mdW5jX3ZtYSkKLQkJICAgIHsKLQkJICAgICAgbG93X2Z1bmNfdm1hID0gc3ltLnZhbHVlOwotCQkgICAgICBmdW5jdGlvbl9uYW1lID0KLQkJCWRlYnVnX2luZm8tPnNzICsgZmRyX3B0ci0+aXNzQmFzZSArIHN5bS5pc3M7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoc3ltLnN0ID09IHN0TGFiZWwgJiYgc3ltLmluZGV4ICE9IGluZGV4TmlsKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bS52YWx1ZSA+IG9mZnNldCkKLQkJcGFzdF9saW5lID0gdHJ1ZTsKLQkgICAgICBlbHNlIGlmIChzeW0udmFsdWUgPj0gbG93X2xpbmVfdm1hKQotCQl7Ci0JCSAgbG93X2xpbmVfdm1hID0gc3ltLnZhbHVlOwotCQkgIGxpbmVfZmlsZV9uYW1lID0gY3VycmVudF9maWxlX25hbWU7Ci0JCSAgbGluZV9pbmZvLT5jYWNoZS5saW5lX251bSA9IHN5bS5pbmRleDsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobGluZV9pbmZvLT5jYWNoZS5saW5lX251bSAhPSAwKQotCW1haW5fZmlsZV9uYW1lID0gbGluZV9maWxlX25hbWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBzdHVmZiBhZnRlciB0aGUgY29sb24gaW4gdGhlIGZ1bmN0aW9uCi0gICAgICAgICBuYW1lLiAgV2UgYWxzbyBuZWVkIHRvIHB1dCB0aGUgZGlyZWN0b3J5IG5hbWUgYW5kIHRoZSBmaWxlCi0gICAgICAgICBuYW1lIHRvZ2V0aGVyLiAgKi8KLSAgICAgIGlmIChmdW5jdGlvbl9uYW1lID09IE5VTEwpCi0JbGVuID0gZnVuY2xlbiA9IDA7Ci0gICAgICBlbHNlCi0JbGVuID0gZnVuY2xlbiA9IHN0cmxlbiAoZnVuY3Rpb25fbmFtZSkgKyAxOwotCi0gICAgICBpZiAobWFpbl9maWxlX25hbWUgIT0gTlVMTAotCSAgJiYgZGlyZWN0b3J5X25hbWUgIT0gTlVMTAotCSAgJiYgbWFpbl9maWxlX25hbWVbMF0gIT0gJy8nKQotCWxlbiArPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKSArIHN0cmxlbiAobWFpbl9maWxlX25hbWUpICsgMTsKLQotICAgICAgaWYgKGxlbiAhPSAwKQotCXsKLQkgIGlmIChsaW5lX2luZm8tPmZpbmRfYnVmZmVyICE9IE5VTEwpCi0JICAgIGZyZWUgKGxpbmVfaW5mby0+ZmluZF9idWZmZXIpOwotCSAgYnVmZmVyID0gKGNoYXIgKikgYmZkX21hbGxvYyAobGVuKTsKLQkgIGlmIChidWZmZXIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbGluZV9pbmZvLT5maW5kX2J1ZmZlciA9IGJ1ZmZlcjsKLQl9Ci0KLSAgICAgIGlmIChmdW5jdGlvbl9uYW1lICE9IE5VTEwpCi0JewotCSAgY2hhciAqY29sb247Ci0KLQkgIHN0cmNweSAoYnVmZmVyLCBmdW5jdGlvbl9uYW1lKTsKLQkgIGNvbG9uID0gc3RyY2hyIChidWZmZXIsICc6Jyk7Ci0JICBpZiAoY29sb24gIT0gTlVMTCkKLQkgICAgKmNvbG9uID0gJ1wwJzsKLQkgIGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lID0gYnVmZmVyOwotCX0KLQotICAgICAgaWYgKG1haW5fZmlsZV9uYW1lICE9IE5VTEwpCi0JewotCSAgaWYgKGRpcmVjdG9yeV9uYW1lID09IE5VTEwgfHwgbWFpbl9maWxlX25hbWVbMF0gPT0gJy8nKQotCSAgICBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lID0gbWFpbl9maWxlX25hbWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcHJpbnRmIChidWZmZXIgKyBmdW5jbGVuLCAiJXMlcyIsIGRpcmVjdG9yeV9uYW1lLAotCQkgICAgICAgbWFpbl9maWxlX25hbWUpOwotCSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuZmlsZW5hbWUgPSBidWZmZXIgKyBmdW5jbGVuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRG8gdGhlIHdvcmsgb2YgZmluZF9uZWFyZXN0X2xpbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lIChhYmZkLCBzZWN0aW9uLCBvZmZzZXQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsCi0JCQlsaW5lX2luZm8sIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwgcmV0bGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0IGRlYnVnX2luZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QgZGVidWdfc3dhcDsKLSAgICAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqbGluZV9pbmZvOwotICAgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBjb25zdCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpyZXRsaW5lX3B0cjsKLXsKLSAgb2Zmc2V0ICs9IHNlY3Rpb24tPnZtYTsKLQotICBpZiAobGluZV9pbmZvLT5jYWNoZS5zZWN0ID09IE5VTEwKLSAgICAgIHx8IGxpbmVfaW5mby0+Y2FjaGUuc2VjdCAhPSBzZWN0aW9uCi0gICAgICB8fCBvZmZzZXQgPCBsaW5lX2luZm8tPmNhY2hlLnN0YXJ0Ci0gICAgICB8fCBvZmZzZXQgPj0gbGluZV9pbmZvLT5jYWNoZS5zdG9wKQotICAgIHsKLSAgICAgIGxpbmVfaW5mby0+Y2FjaGUuc2VjdCA9IHNlY3Rpb247Ci0gICAgICBsaW5lX2luZm8tPmNhY2hlLnN0YXJ0ID0gb2Zmc2V0OwotICAgICAgbGluZV9pbmZvLT5jYWNoZS5zdG9wID0gb2Zmc2V0OwotICAgICAgaWYgKCEgbG9va3VwX2xpbmUgKGFiZmQsIGRlYnVnX2luZm8sIGRlYnVnX3N3YXAsIGxpbmVfaW5mbykpCi0JewotCSAgbGluZV9pbmZvLT5jYWNoZS5zZWN0ID0gTlVMTDsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gICpmaWxlbmFtZV9wdHIgPSBsaW5lX2luZm8tPmNhY2hlLmZpbGVuYW1lOwotICAqZnVuY3Rpb25uYW1lX3B0ciA9IGxpbmVfaW5mby0+Y2FjaGUuZnVuY3Rpb25uYW1lOwotICAqcmV0bGluZV9wdHIgPSBsaW5lX2luZm8tPmNhY2hlLmxpbmVfbnVtOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhlc2Ugcm91dGluZXMgY29weSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4KLQotICAgRklYTUU6IFRoZSB3aG9sZSBwb2ludCBvZiB0aGUgc2h1ZmZsZSBjb2RlIGlzIHRvIGF2b2lkIHN0b3JpbmcKLSAgIGV2ZXJ5dGhpbmcgaW4gbWVtb3J5LCBzaW5jZSB0aGUgbGlua2VyIGlzIHN1Y2ggYSBtZW1vcnkgaG9nLiAgVGhpcwotICAgY29kZSBtYWtlcyB0aGF0IGVmZm9ydCB1c2VsZXNzLiAgSXQgaXMgb25seSBjYWxsZWQgYnkgdGhlIE1JUFMgRUxGCi0gICBjb2RlIHdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBzbyBpdCBpcyBub3QgdGhhdCBiaWcgYQotICAgZGVhbCwgYnV0IGl0IHNob3VsZCBiZSBmaXhlZCBldmVudHVhbGx5LiAgKi8KLQotLyogQ29sbGVjdCBhIHNodWZmbGUgaW50byBhIG1lbW9yeSBidWZmZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlY29mZl9jb2xsZWN0X3NodWZmbGUgUEFSQU1TICgoc3RydWN0IHNodWZmbGUgKiwgYmZkX2J5dGUgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZWNvZmZfY29sbGVjdF9zaHVmZmxlIChsLCBidWZmKQotICAgICBzdHJ1Y3Qgc2h1ZmZsZSAqbDsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0KLSAgdG90YWwgPSAwOwotICBmb3IgKDsgbCAhPSAoc3RydWN0IHNodWZmbGUgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgbC0+ZmlsZXApCi0JbWVtY3B5IChidWZmLCBsLT51Lm1lbW9yeSwgbC0+c2l6ZSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJmZF9zZWVrIChsLT51LmZpbGUuaW5wdXRfYmZkLCBsLT51LmZpbGUub2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChidWZmLCAxLCBsLT5zaXplLCBsLT51LmZpbGUuaW5wdXRfYmZkKSAhPSBsLT5zaXplKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgdG90YWwgKz0gbC0+c2l6ZTsKLSAgICAgIGJ1ZmYgKz0gbC0+c2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgUERSIGluZm9ybWF0aW9uIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIChoYW5kbGUsIGJ1ZmYpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF9ieXRlICpidWZmOwotewotICBzdHJ1Y3QgYWNjdW11bGF0ZSAqYWluZm8gPSAoc3RydWN0IGFjY3VtdWxhdGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBlY29mZl9jb2xsZWN0X3NodWZmbGUgKGFpbmZvLT5wZHIsIGJ1ZmYpOwotfQotCi0vKiBDb3B5IHN5bWJvbCBpbmZvcm1hdGlvbiBpbnRvIGEgbWVtb3J5IGJ1ZmZlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWNvZmZfZ2V0X2FjY3VtdWxhdGVkX3N5bSAoaGFuZGxlLCBidWZmKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfYnl0ZSAqYnVmZjsKLXsKLSAgc3RydWN0IGFjY3VtdWxhdGUgKmFpbmZvID0gKHN0cnVjdCBhY2N1bXVsYXRlICopIGhhbmRsZTsKLQotICByZXR1cm4gZWNvZmZfY29sbGVjdF9zaHVmZmxlIChhaW5mby0+c3ltLCBidWZmKTsKLX0KLQotLyogQ29weSB0aGUgc3RyaW5nIHRhYmxlIGludG8gYSBtZW1vcnkgYnVmZmVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgKGhhbmRsZSwgYnVmZikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKmJ1ZmY7Ci17Ci0gIHN0cnVjdCBhY2N1bXVsYXRlICphaW5mbyA9IChzdHJ1Y3QgYWNjdW11bGF0ZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqc2g7Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZSBpcyB3cml0dGVuIG91dCBmcm9tIHRoZSBoYXNoIHRhYmxlIGlmIHRoaXMgaXMgYQotICAgICBmaW5hbCBsaW5rLiAgKi8KLSAgQkZEX0FTU0VSVCAoYWluZm8tPnNzID09IChzdHJ1Y3Qgc2h1ZmZsZSAqKSBOVUxMKTsKLSAgKmJ1ZmYrKyA9ICdcMCc7Ci0gIHRvdGFsID0gMTsKLSAgQkZEX0FTU0VSVCAoYWluZm8tPnNzX2hhc2ggPT0gTlVMTCB8fCBhaW5mby0+c3NfaGFzaC0+dmFsID09IDEpOwotICBmb3IgKHNoID0gYWluZm8tPnNzX2hhc2g7Ci0gICAgICAgc2ggIT0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIHNoID0gc2gtPm5leHQpCi0gICAgewotICAgICAgc2l6ZV90IGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuIChzaC0+cm9vdC5zdHJpbmcpOwotICAgICAgbWVtY3B5IChidWZmLCAoUFRSKSBzaC0+cm9vdC5zdHJpbmcsIGxlbiArIDEpOwotICAgICAgdG90YWwgKz0gbGVuICsgMTsKLSAgICAgIGJ1ZmYgKz0gbGVuICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvZWNvZmZzd2FwLmggYi9iZmQvZWNvZmZzd2FwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMjhkMTYuLjAwMDAwMDAKLS0tIGEvYmZkL2Vjb2Zmc3dhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qIEdlbmVyaWMgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogTk9URTogVGhpcyBpcyBhIGhlYWRlciBmaWxlLCBidXQgaXQgY29udGFpbnMgZXhlY3V0YWJsZSByb3V0aW5lcy4KLSAgIFRoaXMgaXMgZG9uZSB0aGlzIHdheSBiZWNhdXNlIHRoZXNlIHJvdXRpbmVzIGFyZSBzdWJzdGFudGlhbGx5Ci0gICBzaW1pbGFyLCBidXQgYXJlIG5vdCBpZGVudGljYWwsIGZvciBhbGwgRUNPRkYgdGFyZ2V0cy4KLQotICAgVGhlc2UgYXJlIHJvdXRpbmVzIHRvIHN3YXAgdGhlIEVDT0ZGIHN5bWJvbGljIGluZm9ybWF0aW9uIGluIGFuZAotICAgb3V0LiAgVGhlIHJvdXRpbmVzIGFyZSBkZWZpbmVkIHN0YXRpY2FsbHkuICBZb3UgY2FuIHNldCBicmVha3BvaW50cwotICAgb24gdGhlbSBpbiBnZGIgYnkgbmFtaW5nIHRoZSBpbmNsdWRpbmcgc291cmNlIGZpbGU7IGUuZy4sCi0gICAnY29mZi1taXBzLmMnOmVjb2ZmX3N3YXBfaGRyX2luLgotCi0gICBCZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIGZpbGUsIG9uZSBvZiBFQ09GRl8zMiBvciBFQ09GRl82NCBtdXN0Ci0gICBiZSBkZWZpbmVkLiAgVGhlc2UgYXJlIGNoZWNrZWQgd2hlbiBzd2FwcGluZyBpbmZvcm1hdGlvbiB0aGF0Ci0gICBkZXBlbmRzIHVwb24gdGhlIHRhcmdldCBzaXplLiAgVGhpcyBjb2RlIHdvcmtzIGZvciAzMiBiaXQgYW5kIDY0Ci0gICBiaXQgRUNPRkYsIGJ1dCBtYXkgbmVlZCB0byBiZSBnZW5lcmFsaXplZCBpbiB0aGUgZnV0dXJlLgotCi0gICBTb21lIGhlYWRlciBmaWxlIHdoaWNoIGRlZmluZXMgdGhlIGV4dGVybmFsIGZvcm1zIG9mIHRoZXNlCi0gICBzdHJ1Y3R1cmVzIG11c3QgYWxzbyBiZSBpbmNsdWRlZCBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgaGVhZGVyIGZpbGUuCi0gICBDdXJyZW50bHkgdGhpcyBpcyBlaXRoZXIgY29mZi9taXBzLmggb3IgY29mZi9hbHBoYS5oLgotCi0gICBJZiB0aGUgc3ltYm9sIFRFU1QgaXMgZGVmaW5lZCB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZCwgYQotICAgY29tcGFyaXNvbiBpcyBtYWRlIHRvIGVuc3VyZSB0aGF0LCBpbiBmYWN0LCB0aGUgb3V0cHV0IGlzCi0gICBiaXQtZm9yLWJpdCB0aGUgc2FtZSBhcyB0aGUgaW5wdXQuICBPZiBjb3Vyc2UsIHRoaXMgc3ltYm9sIHNob3VsZAotICAgb25seSBiZSBkZWZpbmVkIHdoZW4gZGVsaWJlcmF0ZWx5IHRlc3RpbmcgdGhlIGNvZGUgb24gYSBtYWNoaW5lCi0gICB3aXRoIHRoZSBwcm9wZXIgYnl0ZSBzZXggYW5kIHN1Y2guICAqLwotCi0jaWZkZWYgRUNPRkZfMzIKLSNkZWZpbmUgZWNvZmZfZ2V0X29mZiBiZmRfaF9nZXRfMzIKLSNkZWZpbmUgZWNvZmZfcHV0X29mZiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmZGVmIEVDT0ZGXzY0Ci0jZGVmaW5lIGVjb2ZmX2dldF9vZmYgYmZkX2hfZ2V0XzY0Ci0jZGVmaW5lIGVjb2ZmX3B1dF9vZmYgYmZkX2hfcHV0XzY0Ci0jZW5kaWYKLQotLyogRUNPRkYgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHRoZSBzYW1lCi0gICBmb3IgYWxsIEVDT0ZGIHRhcmdldHMsIHNvIHRoZXkgYXJlIGRlZmluZWQgaW4gZWNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7Ci0KLS8qIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEhEUlIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9oZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBIRFJSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9mZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgRkRSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZmRyX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgRkRSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9wZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUERSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcGRyX291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgUERSICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9zeW1faW4gUEFSQU1TICgoYmZkICosIFBUUiwgU1lNUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX3N5bV9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IFNZTVIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2V4dF9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBFWFRSICopKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfZXh0X291dCBQQVJBTVMgKChiZmQgKiwgY29uc3QgRVhUUiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3N3YXBfcmZkX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFJGRFQgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9yZmRfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBSRkRUICosIFBUUikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9vcHRfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgT1BUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX29wdF9vdXQgUEFSQU1TICgoYmZkICosIGNvbnN0IE9QVFIgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9zd2FwX2Rucl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBETlIgKikpOwotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9kbnJfb3V0IFBBUkFNUyAoKGJmZCAqLCBjb25zdCBETlIgKiwgUFRSKSk7Ci0KLS8qIFN3YXAgaW4gdGhlIHN5bWJvbGljIGhlYWRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2hkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEhEUlIgKmludGVybjsKLXsKLSAgc3RydWN0IGhkcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBoZHJfZXh0ICopIGV4dF9jb3B5OwotCi0gIGludGVybi0+bWFnaWMgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9tYWdpYyk7Ci0gIGludGVybi0+dnN0YW1wICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF92c3RhbXApOwotICBpbnRlcm4tPmlsaW5lTWF4ICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pbGluZU1heCk7Ci0gIGludGVybi0+Y2JMaW5lICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkxpbmUpOwotICBpbnRlcm4tPmNiTGluZU9mZnNldCAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lT2Zmc2V0KTsKLSAgaW50ZXJuLT5pZG5NYXggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWRuTWF4KTsKLSAgaW50ZXJuLT5jYkRuT2Zmc2V0ICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRG5PZmZzZXQpOwotICBpbnRlcm4tPmlwZE1heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pcGRNYXgpOwotICBpbnRlcm4tPmNiUGRPZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JQZE9mZnNldCk7Ci0gIGludGVybi0+aXN5bU1heCAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lzeW1NYXgpOwotICBpbnRlcm4tPmNiU3ltT2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JTeW1PZmZzZXQpOwotICBpbnRlcm4tPmlvcHRNYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pb3B0TWF4KTsKLSAgaW50ZXJuLT5jYk9wdE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiT3B0T2Zmc2V0KTsKLSAgaW50ZXJuLT5pYXV4TWF4ICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaWF1eE1heCk7Ci0gIGludGVybi0+Y2JBdXhPZmZzZXQgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkF1eE9mZnNldCk7Ci0gIGludGVybi0+aXNzTWF4ICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc01heCk7Ci0gIGludGVybi0+Y2JTc09mZnNldCAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlNzT2Zmc2V0KTsKLSAgaW50ZXJuLT5pc3NFeHRNYXggICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfaXNzRXh0TWF4KTsKLSAgaW50ZXJuLT5jYlNzRXh0T2Zmc2V0ID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NFeHRPZmZzZXQpOwotICBpbnRlcm4tPmlmZE1heCAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZmRNYXgpOwotICBpbnRlcm4tPmNiRmRPZmZzZXQgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JGZE9mZnNldCk7Ci0gIGludGVybi0+Y3JmZCAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NyZmQpOwotICBpbnRlcm4tPmNiUmZkT2Zmc2V0ICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY2JSZmRPZmZzZXQpOwotICBpbnRlcm4tPmlleHRNYXggICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+aF9pZXh0TWF4KTsKLSAgaW50ZXJuLT5jYkV4dE9mZnNldCAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRXh0T2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgdGhlIHN5bWJvbGljIGhlYWRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2hkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEhEUlIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IGhkcl9leHQgKmV4dCA9IChzdHJ1Y3QgaGRyX2V4dCAqKSBleHRfcHRyOwotICBIRFJSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwotCi0gIGJmZF9oX3B1dF9zaWduZWRfMTYgKGFiZmQsIGludGVybi0+bWFnaWMsIChiZmRfYnl0ZSAqKWV4dC0+aF9tYWdpYyk7Ci0gIGJmZF9oX3B1dF9zaWduZWRfMTYgKGFiZmQsIGludGVybi0+dnN0YW1wLCAoYmZkX2J5dGUgKilleHQtPmhfdnN0YW1wKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlsaW5lTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWxpbmVNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiTGluZSwgKGJmZF9ieXRlICopZXh0LT5oX2NiTGluZSk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JMaW5lT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlkbk1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lkbk1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JEbk9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiRG5PZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXBkTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXBkTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYlBkT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JQZE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaXN5bU1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTeW1PZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlN5bU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaW9wdE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JPcHRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYk9wdE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pYXV4TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWF1eE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JBdXhPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkF1eE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3NNYXgsIChiZmRfYnl0ZSAqKWV4dC0+aF9pc3NNYXgpOwotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmNiU3NPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlNzT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlzc0V4dE1heCwgKGJmZF9ieXRlICopZXh0LT5oX2lzc0V4dE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTc0V4dE9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5oX2NiU3NFeHRPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWZkTWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWZkTWF4KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkZkT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmhfY2JGZE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jcmZkLCAoYmZkX2J5dGUgKilleHQtPmhfY3JmZCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JSZmRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYlJmZE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pZXh0TWF4LCAoYmZkX2J5dGUgKilleHQtPmhfaWV4dE1heCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JFeHRPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+aF9jYkV4dE9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gdGhlIGZpbGUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9mZHJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBGRFIgKmludGVybjsKLXsKLSAgc3RydWN0IGZkcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBmZHJfZXh0ICopIGV4dF9jb3B5OwotICAKLSAgaW50ZXJuLT5hZHIgICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2Fkcik7Ci0gIGludGVybi0+cnNzICAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX3Jzcyk7Ci0jaWZkZWYgRUNPRkZfNjQKLSAgaWYgKGludGVybi0+cnNzID09IDB4ZmZmZmZmZmYpCi0gICAgaW50ZXJuLT5yc3MgPSAtMTsKLSNlbmRpZgotICBpbnRlcm4tPmlzc0Jhc2UgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3NCYXNlKTsKLSAgaW50ZXJuLT5jYlNzICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NiU3MpOwotICBpbnRlcm4tPmlzeW1CYXNlICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3ltQmFzZSk7Ci0gIGludGVybi0+Y3N5bSAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NzeW0pOwotICBpbnRlcm4tPmlsaW5lQmFzZSAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pbGluZUJhc2UpOwotICBpbnRlcm4tPmNsaW5lICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jbGluZSk7Ci0gIGludGVybi0+aW9wdEJhc2UgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lvcHRCYXNlKTsKLSAgaW50ZXJuLT5jb3B0ICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY29wdCk7Ci0jaWZkZWYgRUNPRkZfMzIKLSAgaW50ZXJuLT5pcGRGaXJzdCAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaXBkRmlyc3QpOwotICBpbnRlcm4tPmNwZCAgICAgICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSAgaW50ZXJuLT5pcGRGaXJzdCAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfaXBkRmlyc3QpOwotICBpbnRlcm4tPmNwZCAgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0gIGludGVybi0+aWF1eEJhc2UgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2lhdXhCYXNlKTsKLSAgaW50ZXJuLT5jYXV4ICAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY2F1eCk7Ci0gIGludGVybi0+cmZkQmFzZSAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX3JmZEJhc2UpOwotICBpbnRlcm4tPmNyZmQgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcmZkKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGludGVybi0+bGFuZyAgICAgICAgPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0xBTkdfQklHKQotCQkJCQk+PiBGRFJfQklUUzFfTEFOR19TSF9CSUc7Ci0gICAgaW50ZXJuLT5mTWVyZ2UgICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GTUVSR0VfQklHKTsKLSAgICBpbnRlcm4tPmZSZWFkaW4gICAgID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZSRUFESU5fQklHKTsKLSAgICBpbnRlcm4tPmZCaWdlbmRpYW4gID0gMCAhPSAoZXh0LT5mX2JpdHMxWzBdICYgRkRSX0JJVFMxX0ZCSUdFTkRJQU5fQklHKTsKLSAgICBpbnRlcm4tPmdsZXZlbCAgICAgID0gKGV4dC0+Zl9iaXRzMlswXSAmIEZEUl9CSVRTMl9HTEVWRUxfQklHKQotCQkJCQk+PiBGRFJfQklUUzJfR0xFVkVMX1NIX0JJRzsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPmxhbmcgICAgICAgID0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9MQU5HX0xJVFRMRSkKLQkJCQkJPj4gRkRSX0JJVFMxX0xBTkdfU0hfTElUVExFOwotICAgIGludGVybi0+Zk1lcmdlICAgICAgPSAwICE9IChleHQtPmZfYml0czFbMF0gJiBGRFJfQklUUzFfRk1FUkdFX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5mUmVhZGluICAgICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5mQmlnZW5kaWFuICA9IDAgIT0gKGV4dC0+Zl9iaXRzMVswXSAmIEZEUl9CSVRTMV9GQklHRU5ESUFOX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5nbGV2ZWwgICAgICA9IChleHQtPmZfYml0czJbMF0gJiBGRFJfQklUUzJfR0xFVkVMX0xJVFRMRSkKLQkJCQkJPj4gRkRSX0JJVFMyX0dMRVZFTF9TSF9MSVRUTEU7Ci0gIH0KLSAgaW50ZXJuLT5yZXNlcnZlZCA9IDA7Ci0KLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5mX2NiTGluZU9mZnNldCk7Ci0gIGludGVybi0+Y2JMaW5lICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmUpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgZmlsZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Zkcl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEZEUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgZmRyX2V4dCAqZXh0ID0gKHN0cnVjdCBmZHJfZXh0ICopIGV4dF9wdHI7Ci0gIEZEUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+YWRyLCAoYmZkX2J5dGUgKilleHQtPmZfYWRyKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJzcywgKGJmZF9ieXRlICopZXh0LT5mX3Jzcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3NCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfaXNzQmFzZSk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JTcywgKGJmZF9ieXRlICopZXh0LT5mX2NiU3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXN5bUJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pc3ltQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jc3ltLCAoYmZkX2J5dGUgKilleHQtPmZfY3N5bSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZUJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pbGluZUJhc2UpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y2xpbmUsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jbGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0QmFzZSwgKGJmZF9ieXRlICopZXh0LT5mX2lvcHRCYXNlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmNvcHQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jb3B0KTsKLSNpZmRlZiBFQ09GRl8zMgotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+aXBkRmlyc3QsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pcGRGaXJzdCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5jcGQsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jcGQpOwotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmlwZEZpcnN0LCAoYmZkX2J5dGUgKilleHQtPmZfaXBkRmlyc3QpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+Y3BkLCAoYmZkX2J5dGUgKilleHQtPmZfY3BkKTsKLSNlbmRpZgotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWF1eEJhc2UsIChiZmRfYnl0ZSAqKWV4dC0+Zl9pYXV4QmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jYXV4LCAoYmZkX2J5dGUgKilleHQtPmZfY2F1eCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZmRCYXNlLCAoYmZkX2J5dGUgKilleHQtPmZfcmZkQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5jcmZkLCAoYmZkX2J5dGUgKilleHQtPmZfY3JmZCk7Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBleHQtPmZfYml0czFbMF0gPSAoKChpbnRlcm4tPmxhbmcgPDwgRkRSX0JJVFMxX0xBTkdfU0hfQklHKQotCQkJJiBGRFJfQklUUzFfTEFOR19CSUcpCi0JCSAgICAgICB8IChpbnRlcm4tPmZNZXJnZSA/IEZEUl9CSVRTMV9GTUVSR0VfQklHIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZlJlYWRpbiA/IEZEUl9CSVRTMV9GUkVBRElOX0JJRyA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmZCaWdlbmRpYW4gPyBGRFJfQklUUzFfRkJJR0VORElBTl9CSUcgOiAwKSk7Ci0gICAgZXh0LT5mX2JpdHMyWzBdID0gKChpbnRlcm4tPmdsZXZlbCA8PCBGRFJfQklUUzJfR0xFVkVMX1NIX0JJRykKLQkJICAgICAgICYgRkRSX0JJVFMyX0dMRVZFTF9CSUcpOwotICAgIGV4dC0+Zl9iaXRzMlsxXSA9IDA7Ci0gICAgZXh0LT5mX2JpdHMyWzJdID0gMDsKLSAgfSBlbHNlIHsKLSAgICBleHQtPmZfYml0czFbMF0gPSAoKChpbnRlcm4tPmxhbmcgPDwgRkRSX0JJVFMxX0xBTkdfU0hfTElUVExFKQotCQkJJiBGRFJfQklUUzFfTEFOR19MSVRUTEUpCi0JCSAgICAgICB8IChpbnRlcm4tPmZNZXJnZSA/IEZEUl9CSVRTMV9GTUVSR0VfTElUVExFIDogMCkKLQkJICAgICAgIHwgKGludGVybi0+ZlJlYWRpbiA/IEZEUl9CSVRTMV9GUkVBRElOX0xJVFRMRSA6IDApCi0JCSAgICAgICB8IChpbnRlcm4tPmZCaWdlbmRpYW4gPyBGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUgOiAwKSk7Ci0gICAgZXh0LT5mX2JpdHMyWzBdID0gKChpbnRlcm4tPmdsZXZlbCA8PCBGRFJfQklUUzJfR0xFVkVMX1NIX0xJVFRMRSkKLQkJICAgICAgICYgRkRSX0JJVFMyX0dMRVZFTF9MSVRUTEUpOwotICAgIGV4dC0+Zl9iaXRzMlsxXSA9IDA7Ci0gICAgZXh0LT5mX2JpdHMyWzJdID0gMDsKLSAgfQotCi0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPmZfY2JMaW5lT2Zmc2V0KTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmUsIChiZmRfYnl0ZSAqKWV4dC0+Zl9jYkxpbmUpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0jaWZuZGVmIE1QV19DCi0KLS8qIFN3YXAgaW4gdGhlIHByb2NlZHVyZSBkZXNjcmlwdG9yIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3Bkcl9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIFBEUiAqaW50ZXJuOwotewotICBzdHJ1Y3QgcGRyX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IHBkcl9leHQgKikgZXh0X2NvcHk7Ci0KLSAgbWVtc2V0ICgoUFRSKSBpbnRlcm4sIDAsIHNpemVvZiAoKmludGVybikpOwotCi0gIGludGVybi0+YWRyICAgICAgICAgICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9hZHIpOwotICBpbnRlcm4tPmlzeW0gICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pc3ltKTsKLSAgaW50ZXJuLT5pbGluZSAgICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaWxpbmUpOwotICBpbnRlcm4tPnJlZ21hc2sgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgaW50ZXJuLT5yZWdvZmZzZXQgICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdvZmZzZXQpOwotICBpbnRlcm4tPmlvcHQgICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGludGVybi0+ZnJlZ21hc2sgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgaW50ZXJuLT5mcmVnb2Zmc2V0ICAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZW9mZnNldCAgID0gYmZkX2hfZ2V0X3NpZ25lZF8zMiAoYWJmZCwKLQkJCQkJICAgICAgIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZW9mZnNldCk7Ci0gIGludGVybi0+ZnJhbWVyZWcgICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lcmVnKTsKLSAgaW50ZXJuLT5wY3JlZyAgICAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfcGNyZWcpOwotICBpbnRlcm4tPmxuTG93ICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9sbkxvdyk7Ci0gIGludGVybi0+bG5IaWdoICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuSGlnaCk7Ci0gIGludGVybi0+Y2JMaW5lT2Zmc2V0ICA9IGVjb2ZmX2dldF9vZmYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgRUNPRkZfNjQKLSAgaW50ZXJuLT5ncF9wcm9sb2d1ZSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5wX2dwX3Byb2xvZ3VlKTsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgaW50ZXJuLT5ncF91c2VkID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX0dQX1VTRURfQklHKTsKLSAgICAgIGludGVybi0+cmVnX2ZyYW1lID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFR19GUkFNRV9CSUcpOwotICAgICAgaW50ZXJuLT5wcm9mID0gMCAhPSAoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1BST0ZfQklHKTsKLSAgICAgIGludGVybi0+cmVzZXJ2ZWQgPSAoKChleHQtPnBfYml0czFbMF0gJiBQRFJfQklUUzFfUkVTRVJWRURfQklHKQotCQkJICAgPDwgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xFRlRfQklHKQotCQkJICB8ICgoZXh0LT5wX2JpdHMyWzBdICYgUERSX0JJVFMyX1JFU0VSVkVEX0JJRykKLQkJCSAgICAgPj4gUERSX0JJVFMyX1JFU0VSVkVEX1NIX0JJRykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludGVybi0+Z3BfdXNlZCA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9HUF9VU0VEX0xJVFRMRSk7Ci0gICAgICBpbnRlcm4tPnJlZ19mcmFtZSA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9SRUdfRlJBTUVfTElUVExFKTsKLSAgICAgIGludGVybi0+cHJvZiA9IDAgIT0gKGV4dC0+cF9iaXRzMVswXSAmIFBEUl9CSVRTMV9QUk9GX0xJVFRMRSk7Ci0gICAgICBpbnRlcm4tPnJlc2VydmVkID0gKCgoZXh0LT5wX2JpdHMxWzBdICYgUERSX0JJVFMxX1JFU0VSVkVEX0xJVFRMRSkKLQkJCSAgID4+IFBEUl9CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUpCi0JCQkgIHwgKChleHQtPnBfYml0czJbMF0gJiBQRFJfQklUUzJfUkVTRVJWRURfTElUVExFKQotCQkJICAgICA8PCBQRFJfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUpKTsKLSAgICB9Ci0gIGludGVybi0+bG9jYWxvZmYgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+cF9sb2NhbG9mZik7Ci0jZW5kaWYgIAotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCB0aGUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfcGRyX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgUERSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBwZHJfZXh0ICpleHQgPSAoc3RydWN0IHBkcl9leHQgKikgZXh0X3B0cjsKLSAgUERSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotICAKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5hZHIsIChiZmRfYnl0ZSAqKWV4dC0+cF9hZHIpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXN5bSwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aWxpbmUsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZWdtYXNrLCAoYmZkX2J5dGUgKilleHQtPnBfcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5yZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdvZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aW9wdCwgKGJmZF9ieXRlICopZXh0LT5wX2lvcHQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+ZnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmFtZW9mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbnRlcm4tPmZyYW1lcmVnLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+cGNyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5sbkxvdywgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuSGlnaCwgKGJmZF9ieXRlICopZXh0LT5wX2xuSGlnaCk7Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIGludGVybi0+Y2JMaW5lT2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfY2JMaW5lT2Zmc2V0KTsKLQotI2lmZGVmIEVDT0ZGXzY0Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBpbnRlcm4tPmdwX3Byb2xvZ3VlLCAoYmZkX2J5dGUgKikgZXh0LT5wX2dwX3Byb2xvZ3VlKTsKLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgZXh0LT5wX2JpdHMxWzBdID0gKChpbnRlcm4tPmdwX3VzZWQgPyBQRFJfQklUUzFfR1BfVVNFRF9CSUcgOiAwKQotCQkJIHwgKGludGVybi0+cmVnX2ZyYW1lID8gUERSX0JJVFMxX1JFR19GUkFNRV9CSUcgOiAwKQotCQkJIHwgKGludGVybi0+cHJvZiA/IFBEUl9CSVRTMV9QUk9GX0JJRyA6IDApCi0JCQkgfCAoKGludGVybi0+cmVzZXJ2ZWQKLQkJCSAgICAgPj4gUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xFRlRfQklHKQotCQkJICAgICYgUERSX0JJVFMxX1JFU0VSVkVEX0JJRykpOwotICAgICAgZXh0LT5wX2JpdHMyWzBdID0gKChpbnRlcm4tPnJlc2VydmVkIDw8IFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9CSUcpCi0JCQkgJiBQRFJfQklUUzJfUkVTRVJWRURfQklHKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHQtPnBfYml0czFbMF0gPSAoKGludGVybi0+Z3BfdXNlZCA/IFBEUl9CSVRTMV9HUF9VU0VEX0xJVFRMRSA6IDApCi0JCQkgfCAoaW50ZXJuLT5yZWdfZnJhbWUgPyBQRFJfQklUUzFfUkVHX0ZSQU1FX0xJVFRMRSA6IDApCi0JCQkgfCAoaW50ZXJuLT5wcm9mID8gUERSX0JJVFMxX1BST0ZfTElUVExFIDogMCkKLQkJCSB8ICgoaW50ZXJuLT5yZXNlcnZlZCA8PCBQRFJfQklUUzFfUkVTRVJWRURfU0hfTElUVExFKQotCQkJICAgICYgUERSX0JJVFMxX1JFU0VSVkVEX0xJVFRMRSkpOwotICAgICAgZXh0LT5wX2JpdHMyWzBdID0gKChpbnRlcm4tPnJlc2VydmVkID4+Ci0JCQkgIFBEUl9CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRSkKLQkJCSAmIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUpOwotICAgIH0KLSAgYmZkX2hfcHV0XzggKGFiZmQsIGludGVybi0+bG9jYWxvZmYsIChiZmRfYnl0ZSAqKSBleHQtPnBfbG9jYWxvZmYpOwotI2VuZGlmICAKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotI2Vsc2UgLyogTVBXX0MgKi8KLS8qIFNhbWUgcm91dGluZXMsIGJ1dCB3aXRoIEVDT0ZGXzY0IGNvZGUgcmVtb3ZlZCwgc28gXiYlJCMmISBNUFcgQyBkb2Vzbid0Ci0gICBjb3JydXB0IGl0c2VsZiBhbmQgdGhlbiBmcmVhayBvdXQuICovCi0vKiBTd2FwIGluIHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBQRFIgKmludGVybjsKLXsKLSAgc3RydWN0IHBkcl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBwZHJfZXh0ICopIGV4dF9jb3B5OwotICAKLSAgaW50ZXJuLT5hZHIgICAgICAgICAgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGludGVybi0+aXN5bSAgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2lzeW0pOwotICBpbnRlcm4tPmlsaW5lICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pbGluZSk7Ci0gIGludGVybi0+cmVnbWFzayAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ21hc2spOwotICBpbnRlcm4tPnJlZ29mZnNldCAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGludGVybi0+aW9wdCAgICAgICAgICA9IGJmZF9oX2dldF9zaWduZWRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9pb3B0KTsKLSAgaW50ZXJuLT5mcmVnbWFzayAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJlZ21hc2spOwotICBpbnRlcm4tPmZyZWdvZmZzZXQgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdvZmZzZXQpOwotICBpbnRlcm4tPmZyYW1lb2Zmc2V0ICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLAotCQkJCQkgICAgICAgKGJmZF9ieXRlICopZXh0LT5wX2ZyYW1lb2Zmc2V0KTsKLSAgaW50ZXJuLT5mcmFtZXJlZyAgICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVyZWcpOwotICBpbnRlcm4tPnBjcmVnICAgICAgICAgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+cF9wY3JlZyk7Ci0gIGludGVybi0+bG5Mb3cgICAgICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2xuTG93KTsKLSAgaW50ZXJuLT5sbkhpZ2ggICAgICAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgaW50ZXJuLT5jYkxpbmVPZmZzZXQgID0gZWNvZmZfZ2V0X29mZiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5wX2NiTGluZU9mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IHRoZSBwcm9jZWR1cmUgZGVzY3JpcHRvciByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9wZHJfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBQRFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IHBkcl9leHQgKmV4dCA9IChzdHJ1Y3QgcGRyX2V4dCAqKSBleHRfcHRyOwotICBQRFIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBlY29mZl9wdXRfb2ZmIChhYmZkLCBpbnRlcm4tPmFkciwgKGJmZF9ieXRlICopZXh0LT5wX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pc3ltLCAoYmZkX2J5dGUgKilleHQtPnBfaXN5bSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbGluZSwgKGJmZF9ieXRlICopZXh0LT5wX2lsaW5lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKWV4dC0+cF9yZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnJlZ29mZnNldCwgKGJmZF9ieXRlICopZXh0LT5wX3JlZ29mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pb3B0LCAoYmZkX2J5dGUgKilleHQtPnBfaW9wdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5mcmVnbWFzaywgKGJmZF9ieXRlICopZXh0LT5wX2ZyZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmZyYW1lb2Zmc2V0LCAoYmZkX2J5dGUgKilleHQtPnBfZnJhbWVvZmZzZXQpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGludGVybi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKWV4dC0+cF9mcmFtZXJlZyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW50ZXJuLT5wY3JlZywgKGJmZF9ieXRlICopZXh0LT5wX3BjcmVnKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPmxuTG93LCAoYmZkX2J5dGUgKilleHQtPnBfbG5Mb3cpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+bG5IaWdoLCAoYmZkX2J5dGUgKilleHQtPnBfbG5IaWdoKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT5jYkxpbmVPZmZzZXQsIChiZmRfYnl0ZSAqKWV4dC0+cF9jYkxpbmVPZmZzZXQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotI2VuZGlmIC8qIE1QV19DICovCi0KLS8qIFN3YXAgaW4gYSBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfc3ltX2luIChhYmZkLCBleHRfY29weSwgaW50ZXJuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBleHRfY29weTsKLSAgICAgU1lNUiAqaW50ZXJuOwotewotICBzdHJ1Y3Qgc3ltX2V4dCBleHRbMV07Ci0KLSAgKmV4dCA9ICooc3RydWN0IHN5bV9leHQgKikgZXh0X2NvcHk7Ci0gIAotICBpbnRlcm4tPmlzcyAgICAgICAgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+c19pc3MpOwotICBpbnRlcm4tPnZhbHVlICAgICAgICAgPSBlY29mZl9nZXRfb2ZmIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPnNfdmFsdWUpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgaW50ZXJuLT5zdCAgICAgICAgICA9ICAoZXh0LT5zX2JpdHMxWzBdICYgU1lNX0JJVFMxX1NUX0JJRykKLQkJCQkJICAgPj4gU1lNX0JJVFMxX1NUX1NIX0JJRzsKLSAgICBpbnRlcm4tPnNjICAgICAgICAgID0gKChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU0NfQklHKQotCQkJCQkgICA8PCBTWU1fQklUUzFfU0NfU0hfTEVGVF9CSUcpCi0JCQl8ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1NDX0JJRykKLQkJCQkJICAgPj4gU1lNX0JJVFMyX1NDX1NIX0JJRyk7Ci0gICAgaW50ZXJuLT5yZXNlcnZlZCAgICA9IDAgIT0gKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9SRVNFUlZFRF9CSUcpOwotICAgIGludGVybi0+aW5kZXggICAgICAgPSAoKGV4dC0+c19iaXRzMlswXSAmIFNZTV9CSVRTMl9JTkRFWF9CSUcpCi0JCQkJCSAgIDw8IFNZTV9CSVRTMl9JTkRFWF9TSF9MRUZUX0JJRykKLQkJCXwgKGV4dC0+c19iaXRzM1swXSA8PCBTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcpCi0JCQl8IChleHQtPnNfYml0czRbMF0gPDwgU1lNX0JJVFM0X0lOREVYX1NIX0xFRlRfQklHKTsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm4tPnN0ICAgICAgICAgID0gIChleHQtPnNfYml0czFbMF0gJiBTWU1fQklUUzFfU1RfTElUVExFKQotCQkJCQkgICA+PiBTWU1fQklUUzFfU1RfU0hfTElUVExFOwotICAgIGludGVybi0+c2MgICAgICAgICAgPSAoKGV4dC0+c19iaXRzMVswXSAmIFNZTV9CSVRTMV9TQ19MSVRUTEUpCi0JCQkJCSAgID4+IFNZTV9CSVRTMV9TQ19TSF9MSVRUTEUpCi0JCQl8ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1NDX0xJVFRMRSkKLQkJCQkJICAgPDwgU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFKTsKLSAgICBpbnRlcm4tPnJlc2VydmVkICAgID0gMCAhPSAoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX1JFU0VSVkVEX0xJVFRMRSk7Ci0gICAgaW50ZXJuLT5pbmRleCAgICAgICA9ICgoZXh0LT5zX2JpdHMyWzBdICYgU1lNX0JJVFMyX0lOREVYX0xJVFRMRSkKLQkJCQkJICAgPj4gU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRSkKLQkJCXwgKGV4dC0+c19iaXRzM1swXSA8PCBTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUpCi0JCQl8ICgodW5zaWduZWQgaW50KSBleHQtPnNfYml0czRbMF0KLQkJCSAgIDw8IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0xJVFRMRSk7Ci0gIH0KLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYSBzeW1ib2wgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgaW50ZXJuX2NvcHksIGV4dF9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgU1lNUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3Qgc3ltX2V4dCAqZXh0ID0gKHN0cnVjdCBzeW1fZXh0ICopIGV4dF9wdHI7Ci0gIFNZTVIgaW50ZXJuWzFdOwotCi0gICppbnRlcm4gPSAqaW50ZXJuX2NvcHk7CS8qIE1ha2UgaXQgcmVhc29uYWJsZSB0byBkbyBpbi1wbGFjZS4gICovCi0gIAotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+aXNzLCAoYmZkX2J5dGUgKilleHQtPnNfaXNzKTsKLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW50ZXJuLT52YWx1ZSwgKGJmZF9ieXRlICopZXh0LT5zX3ZhbHVlKTsKLQotICAvKiBub3cgdGhlIGZ1biBzdHVmZi4uLiAqLwotICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkgewotICAgIGV4dC0+c19iaXRzMVswXSA9ICgoKGludGVybi0+c3QgPDwgU1lNX0JJVFMxX1NUX1NIX0JJRykKLQkJCSYgU1lNX0JJVFMxX1NUX0JJRykKLQkJICAgICAgIHwgKChpbnRlcm4tPnNjID4+IFNZTV9CSVRTMV9TQ19TSF9MRUZUX0JJRykKLQkJCSAgJiBTWU1fQklUUzFfU0NfQklHKSk7Ci0gICAgZXh0LT5zX2JpdHMyWzBdID0gKCgoaW50ZXJuLT5zYyA8PCBTWU1fQklUUzJfU0NfU0hfQklHKQotCQkJJiBTWU1fQklUUzJfU0NfQklHKQotCQkgICAgICAgfCAoaW50ZXJuLT5yZXNlcnZlZCA/IFNZTV9CSVRTMl9SRVNFUlZFRF9CSUcgOiAwKQotCQkgICAgICAgfCAoKGludGVybi0+aW5kZXggPj4gU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHKQotCQkJICAmIFNZTV9CSVRTMl9JTkRFWF9CSUcpKTsKLSAgICBleHQtPnNfYml0czNbMF0gPSAoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzNfSU5ERVhfU0hfTEVGVF9CSUcpICYgMHhmZjsKLSAgICBleHQtPnNfYml0czRbMF0gPSAoaW50ZXJuLT5pbmRleCA+PiBTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcpICYgMHhmZjsKLSAgfSBlbHNlIHsKLSAgICBleHQtPnNfYml0czFbMF0gPSAoKChpbnRlcm4tPnN0IDw8IFNZTV9CSVRTMV9TVF9TSF9MSVRUTEUpCi0JCQkmIFNZTV9CSVRTMV9TVF9MSVRUTEUpCi0JCSAgICAgICB8ICgoaW50ZXJuLT5zYyA8PCBTWU1fQklUUzFfU0NfU0hfTElUVExFKQotCQkJICAmIFNZTV9CSVRTMV9TQ19MSVRUTEUpKTsKLSAgICBleHQtPnNfYml0czJbMF0gPSAoKChpbnRlcm4tPnNjID4+IFNZTV9CSVRTMl9TQ19TSF9MRUZUX0xJVFRMRSkKLQkJCSYgU1lNX0JJVFMyX1NDX0xJVFRMRSkKLQkJICAgICAgIHwgKGludGVybi0+cmVzZXJ2ZWQgPyBTWU1fQklUUzJfUkVTRVJWRURfTElUVExFIDogMCkKLQkJICAgICAgIHwgKChpbnRlcm4tPmluZGV4IDw8IFNZTV9CSVRTMl9JTkRFWF9TSF9MSVRUTEUpCi0JCQkgICYgU1lNX0JJVFMyX0lOREVYX0xJVFRMRSkpOwotICAgIGV4dC0+c19iaXRzM1swXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTM19JTkRFWF9TSF9MRUZUX0xJVFRMRSkgJiAweGZmOwotICAgIGV4dC0+c19iaXRzNFswXSA9IChpbnRlcm4tPmluZGV4ID4+IFNZTV9CSVRTNF9JTkRFWF9TSF9MRUZUX0xJVFRMRSkgJiAweGZmOwotICB9Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYW4gZXh0ZXJuYWwgc3ltYm9sIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2V4dF9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIEVYVFIgKmludGVybjsKLXsKLSAgc3RydWN0IGV4dF9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBleHRfZXh0ICopIGV4dF9jb3B5OwotICAKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYuLi4gKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpIHsKLSAgICBpbnRlcm4tPmptcHRibCAgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9KTVBUQkxfQklHKTsKLSAgICBpbnRlcm4tPmNvYm9sX21haW4gID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9DT0JPTF9NQUlOX0JJRyk7Ci0gICAgaW50ZXJuLT53ZWFrZXh0ICAgICA9IDAgIT0gKGV4dC0+ZXNfYml0czFbMF0gJiBFWFRfQklUUzFfV0VBS0VYVF9CSUcpOwotICB9IGVsc2UgewotICAgIGludGVybi0+am1wdGJsICAgICAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0pNUFRCTF9MSVRUTEUpOwotICAgIGludGVybi0+Y29ib2xfbWFpbiAgPSAwICE9IChleHQtPmVzX2JpdHMxWzBdICYgRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFKTsKLSAgICBpbnRlcm4tPndlYWtleHQgICAgID0gMCAhPSAoZXh0LT5lc19iaXRzMVswXSAmIEVYVF9CSVRTMV9XRUFLRVhUX0xJVFRMRSk7Ci0gIH0KLSAgaW50ZXJuLT5yZXNlcnZlZCA9IDA7Ci0KLSNpZmRlZiBFQ09GRl8zMgotICBpbnRlcm4tPmlmZCAgICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzE2IChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLSNpZmRlZiBFQ09GRl82NAotICBpbnRlcm4tPmlmZCAgICAgICAgICAgPSBiZmRfaF9nZXRfc2lnbmVkXzMyIChhYmZkLCAoYmZkX2J5dGUgKilleHQtPmVzX2lmZCk7Ci0jZW5kaWYKLQotICBlY29mZl9zd2FwX3N5bV9pbiAoYWJmZCwgJmV4dC0+ZXNfYXN5bSwgJmludGVybi0+YXN5bSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgb3V0IGFuIGV4dGVybmFsIHN5bWJvbCByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9leHRfb3V0IChhYmZkLCBpbnRlcm5fY29weSwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFWFRSICppbnRlcm5fY29weTsKLSAgICAgUFRSIGV4dF9wdHI7Ci17Ci0gIHN0cnVjdCBleHRfZXh0ICpleHQgPSAoc3RydWN0IGV4dF9leHQgKikgZXh0X3B0cjsKLSAgRVhUUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLSAgCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmLi4uICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKSB7Ci0gICAgZXh0LT5lc19iaXRzMVswXSA9ICgoaW50ZXJuLT5qbXB0YmwgPyBFWFRfQklUUzFfSk1QVEJMX0JJRyA6IDApCi0JCQl8IChpbnRlcm4tPmNvYm9sX21haW4gPyBFWFRfQklUUzFfQ09CT0xfTUFJTl9CSUcgOiAwKQotCQkJfCAoaW50ZXJuLT53ZWFrZXh0ID8gRVhUX0JJVFMxX1dFQUtFWFRfQklHIDogMCkpOwotICAgIGV4dC0+ZXNfYml0czJbMF0gPSAwOwotI2lmZGVmIEVDT0ZGXzY0Ci0gICAgZXh0LT5lc19iaXRzMlsxXSA9IDA7Ci0gICAgZXh0LT5lc19iaXRzMlsyXSA9IDA7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBleHQtPmVzX2JpdHMxWzBdID0gKChpbnRlcm4tPmptcHRibCA/IEVYVF9CSVRTMV9KTVBUQkxfTElUVExFIDogMCkKLQkJCXwgKGludGVybi0+Y29ib2xfbWFpbiA/IEVYVF9CSVRTMV9DT0JPTF9NQUlOX0xJVFRMRSA6IDApCi0JCQl8IChpbnRlcm4tPndlYWtleHQgPyBFWFRfQklUUzFfV0VBS0VYVF9MSVRUTEUgOiAwKSk7Ci0gICAgZXh0LT5lc19iaXRzMlswXSA9IDA7Ci0jaWZkZWYgRUNPRkZfNjQKLSAgICBleHQtPmVzX2JpdHMyWzFdID0gMDsKLSAgICBleHQtPmVzX2JpdHMyWzJdID0gMDsKLSNlbmRpZgotICB9Ci0KLSNpZmRlZiBFQ09GRl8zMgotICBiZmRfaF9wdXRfc2lnbmVkXzE2IChhYmZkLCBpbnRlcm4tPmlmZCwgKGJmZF9ieXRlICopZXh0LT5lc19pZmQpOwotI2VuZGlmCi0jaWZkZWYgRUNPRkZfNjQKLSAgYmZkX2hfcHV0X3NpZ25lZF8zMiAoYWJmZCwgaW50ZXJuLT5pZmQsIChiZmRfYnl0ZSAqKWV4dC0+ZXNfaWZkKTsKLSNlbmRpZgotCi0gIGVjb2ZmX3N3YXBfc3ltX291dCAoYWJmZCwgJmludGVybi0+YXN5bSwgJmV4dC0+ZXNfYXN5bSk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYSByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9yZmRfaW4gKGFiZmQsIGV4dF9wdHIsIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X3B0cjsKLSAgICAgUkZEVCAqaW50ZXJuOwotewotICBzdHJ1Y3QgcmZkX2V4dCAqZXh0ID0gKHN0cnVjdCByZmRfZXh0ICopIGV4dF9wdHI7Ci0KLSAgKmludGVybiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopZXh0LT5yZmQpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIHJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX3JmZF9vdXQgKGFiZmQsIGludGVybiwgZXh0X3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBSRkRUICppbnRlcm47Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgcmZkX2V4dCAqZXh0ID0gKHN0cnVjdCByZmRfZXh0ICopIGV4dF9wdHI7Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAqaW50ZXJuLCAoYmZkX2J5dGUgKilleHQtPnJmZCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYW4gb3B0aW1pemF0aW9uIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX29wdF9pbiAoYWJmZCwgZXh0X2NvcHksIGludGVybikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZXh0X2NvcHk7Ci0gICAgIE9QVFIgKmludGVybjsKLXsKLSAgc3RydWN0IG9wdF9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBvcHRfZXh0ICopIGV4dF9jb3B5OwotCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGludGVybi0+b3QgPSBleHQtPm9fYml0czFbMF07Ci0gICAgICBpbnRlcm4tPnZhbHVlID0gKCgodW5zaWduZWQgaW50KSBleHQtPm9fYml0czJbMF0KLQkJCTw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRykKLQkJICAgICAgIHwgKCh1bnNpZ25lZCBpbnQpIGV4dC0+b19iaXRzM1swXQotCQkJICA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9CSUcpCi0JCSAgICAgICB8ICgodW5zaWduZWQgaW50KSBleHQtPm9fYml0czRbMF0KLQkJCSAgPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ZXJuLT5vdCA9IGV4dC0+b19iaXRzMVswXTsKLSAgICAgIGludGVybi0+dmFsdWUgPSAoKGV4dC0+b19iaXRzMlswXSA8PCBPUFRfQklUUzJfVkFMVUVfU0hfTEVGVF9MSVRUTEUpCi0JCSAgICAgICB8IChleHQtPm9fYml0czNbMF0gPDwgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFKQotCQkgICAgICAgfCAoZXh0LT5vX2JpdHM0WzBdIDw8IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRSkpOwotICAgIH0KLQotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9pbiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSwKLQkJCSAgICZleHQtPm9fcm5keCwgJmludGVybi0+cm5keCk7Ci0KLSAgaW50ZXJuLT5vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPm9fb2Zmc2V0KTsKLQotI2lmZGVmIFRFU1QKLSAgaWYgKG1lbWNtcCAoKGNoYXIgKilleHQsIChjaGFyICopaW50ZXJuLCBzaXplb2YgKCppbnRlcm4pKSAhPSAwKQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLX0KLQotLyogU3dhcCBvdXQgYW4gb3B0aW1pemF0aW9uIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX29wdF9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IE9QVFIgKmludGVybl9jb3B5OwotICAgICBQVFIgZXh0X3B0cjsKLXsKLSAgc3RydWN0IG9wdF9leHQgKmV4dCA9IChzdHJ1Y3Qgb3B0X2V4dCAqKSBleHRfcHRyOwotICBPUFRSIGludGVyblsxXTsKLQotICAqaW50ZXJuID0gKmludGVybl9jb3B5OwkvKiBNYWtlIGl0IHJlYXNvbmFibGUgdG8gZG8gaW4tcGxhY2UuICAqLwotCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dC0+b19iaXRzMVswXSA9IGludGVybi0+b3Q7Ci0gICAgICBleHQtPm9fYml0czJbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0JJRzsKLSAgICAgIGV4dC0+b19iaXRzM1swXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfQklHOwotICAgICAgZXh0LT5vX2JpdHM0WzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9CSUc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXh0LT5vX2JpdHMxWzBdID0gaW50ZXJuLT5vdDsKLSAgICAgIGV4dC0+b19iaXRzMlswXSA9IGludGVybi0+dmFsdWUgPj4gT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfTElUVExFOwotICAgICAgZXh0LT5vX2JpdHMzWzBdID0gaW50ZXJuLT52YWx1ZSA+PiBPUFRfQklUUzNfVkFMVUVfU0hfTEVGVF9MSVRUTEU7Ci0gICAgICBleHQtPm9fYml0czRbMF0gPSBpbnRlcm4tPnZhbHVlID4+IE9QVF9CSVRTNF9WQUxVRV9TSF9MRUZUX0xJVFRMRTsKLSAgICB9Ci0KLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0IChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpLAotCQkJICAgICZpbnRlcm4tPnJuZHgsICZleHQtPm9fcm5keCk7Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbnRlcm4tPnZhbHVlLCAoYmZkX2J5dGUgKikgZXh0LT5vX29mZnNldCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19Ci0KLS8qIFN3YXAgaW4gYSBkZW5zZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9kbnJfaW4gKGFiZmQsIGV4dF9jb3B5LCBpbnRlcm4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIGV4dF9jb3B5OwotICAgICBETlIgKmludGVybjsKLXsKLSAgc3RydWN0IGRucl9leHQgZXh0WzFdOwotCi0gICpleHQgPSAqKHN0cnVjdCBkbnJfZXh0ICopIGV4dF9jb3B5OwotCi0gIGludGVybi0+cmZkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5kX3JmZCk7Ci0gIGludGVybi0+aW5kZXggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmRfaW5kZXgpOwotCi0jaWZkZWYgVEVTVAotICBpZiAobWVtY21wICgoY2hhciAqKWV4dCwgKGNoYXIgKilpbnRlcm4sIHNpemVvZiAoKmludGVybikpICE9IDApCi0gICAgYWJvcnQoKTsKLSNlbmRpZgotfQotCi0vKiBTd2FwIG91dCBhIGRlbnNlIG51bWJlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lY29mZl9zd2FwX2Rucl9vdXQgKGFiZmQsIGludGVybl9jb3B5LCBleHRfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEROUiAqaW50ZXJuX2NvcHk7Ci0gICAgIFBUUiBleHRfcHRyOwotewotICBzdHJ1Y3QgZG5yX2V4dCAqZXh0ID0gKHN0cnVjdCBkbnJfZXh0ICopIGV4dF9wdHI7Ci0gIEROUiBpbnRlcm5bMV07Ci0KLSAgKmludGVybiA9ICppbnRlcm5fY29weTsJLyogTWFrZSBpdCByZWFzb25hYmxlIHRvIGRvIGluLXBsYWNlLiAgKi8KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGludGVybi0+cmZkLCAoYmZkX2J5dGUgKikgZXh0LT5kX3JmZCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW50ZXJuLT5pbmRleCwgKGJmZF9ieXRlICopIGV4dC0+ZF9pbmRleCk7Ci0KLSNpZmRlZiBURVNUCi0gIGlmIChtZW1jbXAgKChjaGFyICopZXh0LCAoY2hhciAqKWludGVybiwgc2l6ZW9mICgqaW50ZXJuKSkgIT0gMCkKLSAgICBhYm9ydCgpOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9iZmQvZWxmLWJmZC5oIGIvYmZkL2VsZi1iZmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2ZGFhYi4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLWJmZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEzOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBFTEYgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9MSUJFTEZfSF8KLSNkZWZpbmUgX0xJQkVMRl9IXyAxCi0KLSNpbmNsdWRlICJlbGYvY29tbW9uLmgiCi0jaW5jbHVkZSAiZWxmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiZWxmL2V4dGVybmFsLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiBJZiBzaXplIGlzbid0IHNwZWNpZmllZCBhcyA2NCBvciAzMiwgTkFNRSBtYWNybyBzaG91bGQgZmFpbC4gICovCi0jaWZuZGVmIE5BTUUKLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIE5BTUUoeCx5KSBDQVQ0KHgsNjQsXyx5KQotI2VuZGlmCi0jaWYgQVJDSF9TSVpFPT0zMgotI2RlZmluZSBOQU1FKHgseSkgQ0FUNCh4LDMyLF8seSkKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUNCh4LE5PU0laRSxfLHkpCi0jZW5kaWYKLQotI2RlZmluZSBFbGZOQU1FKFgpCU5BTUUoRWxmLFgpCi0jZGVmaW5lIGVsZk5BTUUoWCkJTkFNRShlbGYsWCkKLQotLyogSW5mb3JtYXRpb24gaGVsZCBmb3IgYW4gRUxGIHN5bWJvbC4gIFRoZSBmaXJzdCBmaWVsZCBpcyB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgYXN5bWJvbC4gIEV2ZXJ5IHN5bWJvbCBpcyBhbiBFTEYgZmlsZSBpcyBhY3R1YWxseSBhCi0gICBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbHRob3VnaCBpdCBpcyBvZnRlbiBoYW5kbGVkIGFzIGEKLSAgIHBvaW50ZXIgdG8gYW4gYXN5bWJvbC4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRoZSBCRkQgc3ltYm9sLiAgKi8KLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIC8qIEVMRiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFbGZfSW50ZXJuYWxfU3ltIGludGVybmFsX2VsZl9zeW07Ci0gIC8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBocHBhX2FyZ19yZWxvYzsKLSAgICAgIFBUUiBtaXBzX2V4dHI7Ci0gICAgICBQVFIgYW55OwotICAgIH0KLSAgdGNfZGF0YTsKLQotICAvKiBWZXJzaW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBmcm9tIGFuIEVsZl9JbnRlcm5hbF9WZXJzeW0KLSAgICAgc3RydWN0dXJlIGluIGEgU0hUX0dOVV92ZXJzeW0gc2VjdGlvbi4gIEl0IGlzIHplcm8gaWYgdGhlcmUgaXMgbm8KLSAgICAgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZlcnNpb247Ci0KLX0gZWxmX3N5bWJvbF90eXBlOwotDAotLyogRUxGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gLTEuICBJdCBpcwotICAgICBzZXQgdG8gLTIgaWYgdGhlIHN5bWJvbCBpcyB1c2VkIGJ5IGEgcmVsb2MuICAqLwotICBsb25nIGluZHg7Ci0KLSAgLyogU3ltYm9sIHNpemUuICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGFzIGEgZHluYW1pYyBzeW1ib2wuICBJbml0aWFsaXplZCB0byAtMSwgYW5kIHJlbWFpbnMKLSAgICAgLTEgaWYgdGhpcyBpcyBub3QgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gIGxvbmcgZHluaW5keDsKLQotICAvKiBTdHJpbmcgdGFibGUgaW5kZXggaW4gLmR5bnN0ciBpZiB0aGlzIGlzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBsb25nIGR5bnN0cl9pbmRleDsKLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbmVkIHN5bWJvbCBmcm9tIGEgZHluYW1pYyBvYmplY3QsIHRoaXMKLSAgICAgZmllbGQgcG9pbnRzIHRvIGEgZGVmaW5lZCBzeW1ib2wgd2l0aCB0aGUgc2FtZSB2YWx1ZSwgaWYgdGhlcmUgaXMKLSAgICAgb25lLiAgT3RoZXJ3aXNlIGl0IGlzIE5VTEwuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqd2Vha2RlZjsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCByZXF1aXJlcyBhbiBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgdGhlCi0gICAgIHByb2Nlc3NvciBzcGVjaWZpYyBiYWNrZW5kIHVzZXMgdGhpcyBmaWVsZCB0byB0cmFjayB1c2FnZSBhbmQKLSAgICAgZmluYWwgb2Zmc2V0LiAgV2UgdXNlIGEgdW5pb24gYW5kIHR3byBuYW1lcyBwcmltYXJpbHkgdG8gZG9jdW1lbnQKLSAgICAgdGhlIGludGVudCBvZiBhbnkgcGFydGljdWxhciBwaWVjZSBvZiBjb2RlLiAgVGhlIGZpZWxkIHNob3VsZCBiZQotICAgICB1c2VkIGFzIGEgY291bnQgdW50aWwgc2l6ZV9keW5hbWljX3NlY3Rpb25zLCBhdCB3aGljaCBwb2ludCB0aGUKLSAgICAgY29udGVudHMgb2YgdGhlIC5nb3QgaXMgZml4ZWQuICBBZnRlcndhcmQsIGlmIHRoaXMgZmllbGQgaXMgLTEsCi0gICAgIHRoZW4gdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0gIHVuaW9uCi0gICAgewotICAgICAgYmZkX3NpZ25lZF92bWEgcmVmY291bnQ7Ci0gICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICB9IGdvdDsKLQotICAvKiBTYW1lLCBidXQgdHJhY2tzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHJlZmNvdW50OwotICAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgfSBwbHQ7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgdXNlZCBpbiB0aGUgbGlua2VyIGNyZWF0ZWQgc2VjdGlvbnMsIHRoZSBwcm9jZXNzb3IKLSAgICAgc3BlY2lmaWMgYmFja2VuZCB1c2VzIHRoaXMgZmllbGQgdG8gbWFwIHRoZSBmaWVsZCBpbnRvIHRoZSBvZmZzZXQKLSAgICAgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVycyAqbGlua2VyX3NlY3Rpb25fcG9pbnRlcjsKLQotICAvKiBWZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgdW5pb24KLSAgewotICAgIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBmb3IgYSBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQgaW4gYQotICAgICAgIHJlZ3VsYXIgb2JqZWN0LiAgSXQgcG9pbnRzIHRvIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHJlYWQgaW4KLSAgICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdC4gICovCi0gICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqdmVyZGVmOwotICAgIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBmb3IgYSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIKLSAgICAgICBvYmplY3QuICBJdCBpcyBzZXQgdXAgaW4gc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgSXQgcG9pbnRzIHRvCi0gICAgICAgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gd2Ugc2hvdWxkIHdyaXRlIG91dCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVydHJlZTsKLSAgfSB2ZXJpbmZvOwotCi0gIC8qIFZpcnR1YWwgdGFibGUgZW50cnkgdXNlIGluZm9ybWF0aW9uLiAgVGhpcyBhcnJheSBpcyBub21pbmFsbHkgb2Ygc2l6ZQotICAgICBzaXplL3NpemVvZih0YXJnZXRfdm9pZF9wb2ludGVyKSwgdGhvdWdoIHdlIGhhdmUgdG8gYmUgYWJsZSB0byBhc3N1bWUKLSAgICAgYW5kIHRyYWNrIGEgc2l6ZSB3aGlsZSB0aGUgc3ltYm9sIGlzIHN0aWxsIHVuZGVmaW5lZC4gIEl0IGlzIGluZGV4ZWQKLSAgICAgdmlhIG9mZnNldC9zaXplb2YodGFyZ2V0X3ZvaWRfcG9pbnRlcikuICAqLwotICBzaXplX3QgdnRhYmxlX2VudHJpZXNfc2l6ZTsKLSAgYm9vbGVhbiAqdnRhYmxlX2VudHJpZXNfdXNlZDsKLQotICAvKiBWaXJ0dWFsIHRhYmxlIGRlcml2YXRpb24gaW5mby4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp2dGFibGVfcGFyZW50OwotCi0gIC8qIFN5bWJvbCB0eXBlIChTVFRfTk9UWVBFLCBTVFRfT0JKRUNULCBldGMuKS4gICovCi0gIGNoYXIgdHlwZTsKLQotICAvKiBTeW1ib2wgc3Rfb3RoZXIgdmFsdWUuICAqLwotICB1bnNpZ25lZCBjaGFyIG90aGVyOwotCi0gIC8qIEhhc2ggdmFsdWUgb2YgdGhlIG5hbWUgY29tcHV0ZWQgdXNpbmcgdGhlIEVMRiBoYXNoIGZ1bmN0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBlbGZfaGFzaF92YWx1ZTsKLQotICAvKiBTb21lIGZsYWdzOyBsZWdhbCB2YWx1ZXMgZm9sbG93LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZWxmX2xpbmtfaGFzaF9mbGFnczsKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSBub24tc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIgMDEKLSAgLyogU3ltYm9sIGlzIGRlZmluZWQgYnkgYSBub24tc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIgMDIKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQyAwNAotICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIHNoYXJlZCBvYmplY3QuICAqLwotI2RlZmluZSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDIDAxMAotICAvKiBTeW1ib2wgaGFzIGEgbm9uLXdlYWsgcmVmZXJlbmNlIGZyb20gYSBub24tc2hhcmVkIG9iamVjdC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyAwMjAKLSAgLyogRHluYW1pYyBzeW1ib2wgaGFzIGJlZW4gYWRqdXN0ZC4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfRFlOQU1JQ19BREpVU1RFRCAwNDAKLSAgLyogU3ltYm9sIG5lZWRzIGEgY29weSByZWxvYy4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWSAwMTAwCi0gIC8qIFN5bWJvbCBuZWVkcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQgMDIwMAotICAvKiBTeW1ib2wgYXBwZWFycyBpbiBhIG5vbi1FTEYgaW5wdXQgZmlsZS4gICovCi0jZGVmaW5lIEVMRl9MSU5LX05PTl9FTEYgMDQwMAotICAvKiBTeW1ib2wgc2hvdWxkIGJlIG1hcmtlZCBhcyBoaWRkZW4gaW4gdGhlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBFTEZfTElOS19ISURERU4gMDEwMDAKLSAgLyogU3ltYm9sIHdhcyBmb3JjZWQgdG8gbG9jYWwgc2NvcGUgZHVlIHRvIGEgdmVyc2lvbiBzY3JpcHQgZmlsZS4gICovCi0jZGVmaW5lIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCAwMjAwMAotICAvKiBTeW1ib2wgd2FzIG1hcmtlZCBkdXJpbmcgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0xJTktfSEFTSF9NQVJLIDA0MDAwCi19OwotCi0vKiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotICAvKiBXaGV0aGVyIHdlIGhhdmUgY3JlYXRlZCB0aGUgc3BlY2lhbCBkeW5hbWljIHNlY3Rpb25zIHJlcXVpcmVkCi0gICAgIHdoZW4gbGlua2luZyBhZ2FpbnN0IG9yIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQ7Ci0gIC8qIFRoZSBCRkQgdXNlZCB0byBob2xkIHNwZWNpYWwgc2VjdGlvbnMgY3JlYXRlZCBieSB0aGUgbGlua2VyLgotICAgICBUaGlzIHdpbGwgYmUgdGhlIGZpcnN0IEJGRCBmb3VuZCB3aGljaCByZXF1aXJlcyB0aGVzZSBzZWN0aW9ucyB0bwotICAgICBiZSBjcmVhdGVkLiAgKi8KLSAgYmZkICpkeW5vYmo7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3VuZCBpbiB0aGUgbGluayB3aGljaCBtdXN0IGJlIHB1dCBpbnRvCi0gICAgIHRoZSAuZHluc3ltIHNlY3Rpb24uICAqLwotICBiZmRfc2l6ZV90eXBlIGR5bnN5bWNvdW50OwotICAvKiBUaGUgc3RyaW5nIHRhYmxlIG9mIGR5bmFtaWMgc3ltYm9scywgd2hpY2ggYmVjb21lcyB0aGUgLmR5bnN0cgotICAgICBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gdGhlIGhhc2ggdGFibGUgaW4gdGhlIC5oYXNoIHNlY3Rpb24uCi0gICAgIFRoaXMgaXMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMuICAqLwotICBiZmRfc2l6ZV90eXBlIGJ1Y2tldGNvdW50OwotICAvKiBBIGxpbmtlZCBsaXN0IG9mIERUX05FRURFRCBuYW1lcyBmb3VuZCBpbiBkeW5hbWljIG9iamVjdHMKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKLSAgLyogVGhlIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGdvdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCVwKLSAgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGFuIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIENvbnN0YW50IGluZm9ybWF0aW9uIGhlbGQgZm9yIGFuIEVMRiBiYWNrZW5kLiAgKi8KLQotc3RydWN0IGVsZl9zaXplX2luZm8gewotICB1bnNpZ25lZCBjaGFyIHNpemVvZl9laGRyLCBzaXplb2ZfcGhkciwgc2l6ZW9mX3NoZHI7Ci0gIHVuc2lnbmVkIGNoYXIgc2l6ZW9mX3JlbCwgc2l6ZW9mX3JlbGEsIHNpemVvZl9zeW0sIHNpemVvZl9keW4sIHNpemVvZl9ub3RlOwotCi0gIHVuc2lnbmVkIGNoYXIgYXJjaF9zaXplLCBmaWxlX2FsaWduOwotICB1bnNpZ25lZCBjaGFyIGVsZmNsYXNzLCBldl9jdXJyZW50OwotICBpbnQgKCp3cml0ZV9vdXRfcGhkcnMpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLSAgYm9vbGVhbiAoKndyaXRlX3NoZHJzX2FuZF9laGRyKSBQQVJBTVMgKChiZmQgKikpOwotICB2b2lkICgqd3JpdGVfcmVsb2NzKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3N5bWJvbF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIFBUUikpOwotICBib29sZWFuICgqc2x1cnBfcmVsb2NfdGFibGUpCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLSAgbG9uZyAoKnNsdXJwX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLSAgdm9pZCAoKnN3YXBfZHluX2luKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLX07Ci0KLSNkZWZpbmUgZWxmX3N5bWJvbF9mcm9tKEFCRkQsUykgXAotCSgoKFMpLT50aGVfYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIgXAotCSAgJiYgKFMpLT50aGVfYmZkLT50ZGF0YS5lbGZfb2JqX2RhdGEgIT0gMCkgXAotCSA/IChlbGZfc3ltYm9sX3R5cGUgKikgKFMpIFwKLQkgOiAwKQotCi1zdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YQotewotICAvKiBUaGUgYXJjaGl0ZWN0dXJlIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLQotICAvKiBUaGUgRUxGIG1hY2hpbmUgY29kZSAoRU1feHh4eCkgZm9yIHRoaXMgYmFja2VuZC4gICovCi0gIGludCBlbGZfbWFjaGluZV9jb2RlOwotCi0gIC8qIFRoZSBtYXhpbXVtIHBhZ2Ugc2l6ZSBmb3IgdGhpcyBiYWNrZW5kLiAgKi8KLSAgYmZkX3ZtYSBtYXhwYWdlc2l6ZTsKLQotICAvKiBUaGlzIGlzIHRydWUgaWYgdGhlIGxpbmtlciBzaG91bGQgYWN0IGxpa2UgY29sbGVjdCBhbmQgZ2F0aGVyCi0gICAgIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGJ5IG5hbWUuICBUaGlzIGlzIHRydWUgZm9yCi0gICAgIE1JUFMgRUxGIGJlY2F1c2UgdGhlIElyaXggNSB0b29scyBjYW4gbm90IGhhbmRsZSB0aGUgLmluaXQKLSAgICAgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gY29sbGVjdDsKLQotICAvKiBUaGlzIGlzIHRydWUgaWYgdGhlIGxpbmtlciBzaG91bGQgaWdub3JlIGNoYW5nZXMgdG8gdGhlIHR5cGUgb2YgYQotICAgICBzeW1ib2wuICBUaGlzIGlzIHRydWUgZm9yIE1JUFMgRUxGIGJlY2F1c2Ugc29tZSBJcml4IDUgb2JqZWN0cwotICAgICByZWNvcmQgdW5kZWZpbmVkIGZ1bmN0aW9ucyBhcyBTVFRfT0JKRUNUIGFsdGhvdWdoIHRoZSBkZWZpbml0aW9ucwotICAgICBhcmUgU1RUX0ZVTkMuICAqLwotICBib29sZWFuIHR5cGVfY2hhbmdlX29rOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gdHJhbnNsYXRlIGFuIEVMRiBSRUxBIHJlbG9jYXRpb24gdG8gYSBCRkQgYXJlbGVudAotICAgICBzdHJ1Y3R1cmUuICAqLwotICB2b2lkICgqZWxmX2luZm9fdG9faG93dG8pIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLSAgLyogQSBmdW5jdGlvbiB0byB0cmFuc2xhdGUgYW4gRUxGIFJFTCByZWxvY2F0aW9uIHRvIGEgQkZEIGFyZWxlbnQKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdm9pZCAoKmVsZl9pbmZvX3RvX2hvd3RvX3JlbCkgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKLQkJCQkJIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgZ2xvYmFsIHdoZW4KLSAgICAgcGFydGl0aW9uaW5nIHRoZSBzeW1ib2wgdGFibGUgaW50byBsb2NhbCBhbmQgZ2xvYmFsIHN5bWJvbHMuCi0gICAgIFRoaXMgc2hvdWxkIGJlIE5VTEwgZm9yIG1vc3QgdGFyZ2V0cywgaW4gd2hpY2ggY2FzZSB0aGUgY29ycmVjdAotICAgICB0aGluZyB3aWxsIGJlIGRvbmUuICBNSVBTIEVMRiwgYXQgbGVhc3Qgb24gdGhlIElyaXggNSwgaGFzCi0gICAgIHNwZWNpYWwgcmVxdWlyZW1lbnRzLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLQotICAvKiBUaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBhcmUgaG9va3Mgd2hpY2ggYXJlIGNhbGxlZCBvbmx5IGlmIHRoZXkKLSAgICAgYXJlIG5vdCBOVUxMLiAgKi8KLQotICAvKiBBIGZ1bmN0aW9uIHRvIHBlcm1pdCBhIGJhY2tlbmQgc3BlY2lmaWMgY2hlY2sgb24gd2hldGhlciBhCi0gICAgIHBhcnRpY3VsYXIgQkZEIGZvcm1hdCBpcyByZWxldmFudCBmb3IgYW4gb2JqZWN0IGZpbGUsIGFuZCB0bwotICAgICBwZXJtaXQgdGhlIGJhY2tlbmQgdG8gc2V0IGFueSBnbG9iYWwgaW5mb3JtYXRpb24gaXQgd2lzaGVzLiAgV2hlbgotICAgICB0aGlzIGlzIGNhbGxlZCBlbGZfZWxmaGVhZGVyIGlzIHNldCwgYnV0IGFueXRoaW5nIGVsc2Ugc2hvdWxkIGJlCi0gICAgIHVzZWQgd2l0aCBjYXV0aW9uLiAgSWYgdGhpcyByZXR1cm5zIGZhbHNlLCB0aGUgY2hlY2tfZm9ybWF0Ci0gICAgIHJvdXRpbmUgd2lsbCByZXR1cm4gYSBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0IGVycm9yLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYWRkaXRpb25hbCBzeW1ib2wgcHJvY2Vzc2luZyB3aGVuIHJlYWRpbmcgdGhlCi0gICAgIEVMRiBzeW1ib2wgdGFibGUuICBUaGlzIGlzIHdoZXJlIGFueSBwcm9jZXNzb3Itc3BlY2lmaWMgc3BlY2lhbAotICAgICBzZWN0aW9uIGluZGljZXMgYXJlIGhhbmRsZWQuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFkZGl0aW9uYWwgc3ltYm9sIHByb2Nlc3NpbmcgYWZ0ZXIgcmVhZGluZyB0aGUKLSAgICAgZW50aXJlIEVMRiBzeW1ib2wgdGFibGUuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc3ltYm9sX3RhYmxlX3Byb2Nlc3NpbmcpIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJCSAgZWxmX3N5bWJvbF90eXBlICosCi0JCQkJCQkJICB1bnNpZ25lZCBpbnQpKTsKLQotICAgLyogQSBmdW5jdGlvbiB0byBzZXQgdGhlIHR5cGUgb2YgdGhlIGluZm8gZmllbGQuICBQcm9jZXNzb3Itc3BlY2lmaWMKLSAgICAgdHlwZXMgc2hvdWxkIGJlIGhhbmRsZWQgaGVyZS4gKi8KLSAgaW50ICgqZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKSBQQVJBTVMgKCggRWxmX0ludGVybmFsX1N5bSAqLCBpbnQpKTsgCi0gCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYWRkaXRpb25hbCBwcm9jZXNzaW5nIG9uIHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIKLSAgICAganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBUaGlzIGlzIHVzZWQgdG8gc2V0IHRoZSBmbGFncyBhbmQKLSAgICAgdHlwZSBmaWVsZHMgZm9yIHNvbWUgc2VjdGlvbnMsIG9yIHRvIGFjdHVhbGx5IHdyaXRlIG91dCBkYXRhIGZvcgotICAgICB1bnVzdWFsIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3NlY3Rpb25fcHJvY2Vzc2luZykgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gaGFuZGxlIHVudXN1YWwgc2VjdGlvbiB0eXBlcyB3aGVuIGNyZWF0aW5nIEJGRAotICAgICBzZWN0aW9ucyBmcm9tIEVMRiBzZWN0aW9ucy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJICAgIGNoYXIgKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gc2V0IHVwIHRoZSBFTEYgc2VjdGlvbiBoZWFkZXIgZm9yIGEgQkZEIHNlY3Rpb24gaW4KLSAgICAgcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyBpcyB3aGVyZSB0aGUgZmxhZ3MgYW5kIHR5cGUKLSAgICAgZmllbGRzIGFyZSBzZXQgZm9yIHVudXN1YWwgc2VjdGlvbnMuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucykgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwKLQkJCQkJCWFzZWN0aW9uICopKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGdldCB0aGUgRUxGIHNlY3Rpb24gaW5kZXggZm9yIGEgQkZEIHNlY3Rpb24uICBJZgotICAgICB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIHNlY3Rpb24gd2FzIGZvdW5kLiAgSWYgaXQgaXMgYSBub3JtYWwgRUxGCi0gICAgIHNlY3Rpb24sICpSRVRWQUwgc2hvdWxkIGJlIGxlZnQgdW5jaGFuZ2VkLiAgSWYgaXQgaXMgbm90IGEgbm9ybWFsCi0gICAgIEVMRiBzZWN0aW9uICpSRVRWQUwgc2hvdWxkIGJlIHNldCB0byB0aGUgU0hOX3h4eHggaW5kZXguICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKQotICAgIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICosIGludCAqcmV0dmFsKSk7Ci0KLSAgLyogSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgaXQgaXMgY2FsbGVkIGJ5IHRoZSBhZGRfc3ltYm9scyBwaGFzZQotICAgICBvZiBhIGxpbmsganVzdCBiZWZvcmUgYWRkaW5nIGEgc3ltYm9sIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2gKLSAgICAgdGFibGUuICBJdCBtYXkgbW9kaWZ5IGFueSBvZiB0aGUgZmllbGRzIGFzIGl0IHdpc2hlcy4gIElmICpOQU1FCi0gICAgIGlzIHNldCB0byBOVUxMLCB0aGUgc3ltYm9sIHdpbGwgYmUgc2tpcHBlZCByYXRoZXIgdGhhbiBiZWluZwotICAgICBhZGRlZCB0byB0aGUgaGFzaCB0YWJsZS4gIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yCi0gICAgIGhhbmRsaW5nIGFsbCBwcm9jZXNzb3IgZGVwZW5kZW50IHN5bWJvbCBiaW5kaW5ncyBhbmQgc2VjdGlvbgotICAgICBpbmRpY2VzLCBhbmQgbXVzdCBzZXQgYXQgbGVhc3QgKkZMQUdTIGFuZCAqU0VDIGZvciBlYWNoIHByb2Nlc3NvcgotICAgICBkZXBlbmRlbnQgY2FzZTsgZmFpbHVyZSB0byBkbyBzbyB3aWxsIGNhdXNlIGEgbGluayBlcnJvci4gICovCi0gIGJvb2xlYW4gKCplbGZfYWRkX3N5bWJvbF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosIGNvbnN0IGNoYXIgKipuYW1lLAotCSAgICAgZmxhZ3dvcmQgKmZsYWdzLCBhc2VjdGlvbiAqKnNlYywgYmZkX3ZtYSAqdmFsdWUpKTsKLQotICAvKiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCBpdCBpcyBjYWxsZWQgYnkgdGhlIGVsZl9saW5rX291dHB1dF9zeW0KLSAgICAgcGhhc2Ugb2YgYSBsaW5rIGZvciBlYWNoIHN5bWJvbCB3aGljaCB3aWxsIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBib29sZWFuICgqZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2spCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBjb25zdCBjaGFyICosCi0JICAgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLQotICAvKiBUaGUgQ1JFQVRFX0RZTkFNSUNfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZAotICAgICBsaW5rZXIgdGhlIGZpcnN0IHRpbWUgaXQgZW5jb3VudGVycyBhIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLgotICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgY3JlYXRlIGFueSBzZWN0aW9ucyByZXF1aXJlZCBmb3IgZHluYW1pYwotICAgICBsaW5raW5nLiAgVGhlIEFCRkQgYXJndW1lbnQgaXMgYSBkeW5hbWljIG9iamVjdC4gIFRoZSAuaW50ZXJwLAotICAgICAuZHluYW1pYywgLmR5bnN5bSwgLmR5bnN0ciwgYW5kIC5oYXNoIGZ1bmN0aW9ucyBoYXZlIGFscmVhZHkgYmVlbgotICAgICBjcmVhdGVkLCBhbmQgdGhpcyBmdW5jdGlvbiBtYXkgbW9kaWZ5IHRoZSBzZWN0aW9uIGZsYWdzIGlmCi0gICAgIGRlc2lyZWQuICBUaGlzIGZ1bmN0aW9uIHdpbGwgbm9ybWFsbHkgY3JlYXRlIHRoZSAuZ290IGFuZCAucGx0Ci0gICAgIHNlY3Rpb25zLCBidXQgZGlmZmVyZW50IGJhY2tlbmRzIGhhdmUgZGlmZmVyZW50IHJlcXVpcmVtZW50cy4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci0KLSAgLyogVGhlIENIRUNLX1JFTE9DUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGFkZF9zeW1ib2xzIHBoYXNlIG9mCi0gICAgIHRoZSBFTEYgYmFja2VuZCBsaW5rZXIuICBJdCBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzZWN0aW9uIHdpdGgKLSAgICAgcmVsb2NzIG9mIGFuIG9iamVjdCBmaWxlLCBqdXN0IGFmdGVyIHRoZSBzeW1ib2xzIGZvciB0aGUgb2JqZWN0Ci0gICAgIGZpbGUgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBnbG9iYWwgbGlua2VyIGhhc2ggdGFibGUuICBUaGUKLSAgICAgZnVuY3Rpb24gbXVzdCBsb29rIHRocm91Z2ggdGhlIHJlbG9jcyBhbmQgZG8gYW55IHNwZWNpYWwgaGFuZGxpbmcKLSAgICAgcmVxdWlyZWQuICBUaGlzIGdlbmVyYWxseSBtZWFucyBhbGxvY2F0aW5nIHNwYWNlIGluIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLCBhbmQgcGVyaGFwcyBhbGxvY2F0aW5nIHNwYWNlIGZvciBhIHJlbG9jLiAgVGhlCi0gICAgIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgICB6ZXJvLiAgKi8KLSAgYm9vbGVhbiAoKmNoZWNrX3JlbG9jcykKLSAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotICAvKiBUaGUgQURKVVNUX0RZTkFNSUNfU1lNQk9MIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGZvciBldmVyeSBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZAotICAgICByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlCi0gICAgIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBzZWVuLCBidXQgYmVmb3JlIHRoZSBTSVpFX0RZTkFNSUNfU0VDVElPTlMKLSAgICAgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLiAgVGhlIGhhc2ggdGFibGUgZW50cnkgc2hvdWxkIGJlCi0gICAgIGJmZF9saW5rX2hhc2hfZGVmaW5lZCBvcmUgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLCBhbmQgaXQgc2hvdWxkIGJlCi0gICAgIGRlZmluZWQgaW4gYSBzZWN0aW9uIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIER5bmFtaWMgb2JqZWN0Ci0gICAgIHNlY3Rpb25zIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIGxpbmssIGFuZCB0aGlzIGZ1bmN0aW9uIGlzCi0gICAgIHJlc3BvbnNpYmxlIGZvciBjaGFuZ2luZyB0aGUgdmFsdWUgdG8gc29tZXRoaW5nIHdoaWNoIHRoZSByZXN0IG9mCi0gICAgIHRoZSBsaW5rIGNhbiBkZWFsIHdpdGguICBUaGlzIHdpbGwgbm9ybWFsbHkgaW52b2x2ZSBhZGRpbmcgYW4KLSAgICAgZW50cnkgdG8gdGhlIC5wbHQgb3IgLmdvdCBvciBzb21lIHN1Y2ggc2VjdGlvbiwgYW5kIHNldHRpbmcgdGhlCi0gICAgIHN5bWJvbCB0byBwb2ludCB0byB0aGF0LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgpKTsKLQotICAvKiBUaGUgQUxXQVlTX1NJWkVfU0VDVElPTlMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlcgotICAgICBhZnRlciBhbGwgdGhlIGxpbmtlciBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiBidXQgYmVmb3JlIHRoZQotICAgICBzZWN0aW9uIHNpemVzIGhhdmUgYmVlbiBzZXQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgotICAgICBBREpVU1RfRFlOQU1JQ19TWU1CT0wsIGJ1dCBiZWZvcmUgU0laRV9EWU5BTUlDX1NFQ1RJT05TLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBUaGUgU0laRV9EWU5BTUlDX1NFQ1RJT05TIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGFmdGVyIGFsbCB0aGUgbGlua2VyIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBzZWVuIGJ1dCBiZWZvcmUKLSAgICAgdGhlIHNlY3Rpb25zIHNpemVzIGhhdmUgYmVlbiBzZXQuICBUaGlzIGlzIGNhbGxlZCBhZnRlcgotICAgICBBREpVU1RfRFlOQU1JQ19TWU1CT0wgaGFzIGJlZW4gY2FsbGVkIG9uIGFsbCBhcHByb3ByaWF0ZSBzeW1ib2xzLgotICAgICBJdCBpcyBvbmx5IGNhbGxlZCB3aGVuIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgSXQgbXVzdAotICAgICBzZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLCBhbmQgbWF5IGZpbGwgaW4gdGhlaXIKLSAgICAgY29udGVudHMgYXMgd2VsbC4gIFRoZSBnZW5lcmljIEVMRiBsaW5rZXIgY2FuIGhhbmRsZSB0aGUgLmR5bnN5bSwKLSAgICAgLmR5bnN0ciBhbmQgLmhhc2ggc2VjdGlvbnMuICBUaGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlIHRoZQotICAgICAuaW50ZXJwIHNlY3Rpb24gYW5kIGFueSBzZWN0aW9ucyBjcmVhdGVkIGJ5IHRoZQotICAgICBDUkVBVEVfRFlOQU1JQ19TRUNUSU9OUyBlbnRyeSBwb2ludC4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi0gIC8qIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyCi0gICAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICAgIHplcm8uCi0KLSAgICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgICAgbmVjZXNzYXJ5LgotCi0gICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICAgIGFjY29yZGluZ2x5LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24pCi0gICAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICAgIGJmZCAqaW5wdXRfYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwgYmZkX2J5dGUgKmNvbnRlbnRzLAotCSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywKLQkgICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnMpKTsKLQotICAvKiBUaGUgRklOSVNIX0RZTkFNSUNfU1lNQk9MIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQKLSAgICAgbGlua2VyIGp1c3QgYmVmb3JlIGl0IHdyaXRlcyBhIHN5bWJvbCBvdXQgdG8gdGhlIC5keW5zeW0gc2VjdGlvbi4KLSAgICAgVGhlIHByb2Nlc3NvciBiYWNrZW5kIG1heSBtYWtlIGFueSByZXF1aXJlZCBhZGp1c3RtZW50IHRvIHRoZQotICAgICBzeW1ib2wuICBJdCBtYXkgYWxzbyB0YWtlIHRoZSBvcHBvcnR1bml0eSB0byBzZXQgY29udGVudHMgb2YgdGhlCi0gICAgIGR5bmFtaWMgc2VjdGlvbnMuICBOb3RlIHRoYXQgRklOSVNIX0RZTkFNSUNfU1lNQk9MIGlzIGNhbGxlZCBvbgotICAgICBhbGwgLmR5bnN5bSBzeW1ib2xzLCB3aGlsZSBBREpVU1RfRFlOQU1JQ19TWU1CT0wgaXMgb25seSBjYWxsZWQKLSAgICAgb24gdGhvc2Ugc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCkKLSAgICBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIEVsZl9JbnRlcm5hbF9TeW0gKnN5bSkpOwotCi0gIC8qIFRoZSBGSU5JU0hfRFlOQU1JQ19TRUNUSU9OUyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kCi0gICAgIGxpbmtlciBqdXN0IGJlZm9yZSBpdCB3cml0ZXMgYWxsIHRoZSBkeW5hbWljIHNlY3Rpb25zIG91dCB0byB0aGUKLSAgICAgb3V0cHV0IGZpbGUuICBUaGUgRklOSVNIX0RZTkFNSUNfU1lNQk9MIHdpbGwgaGF2ZSBiZWVuIGNhbGxlZCBvbgotICAgICBhbGwgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgYm9vbGVhbiAoKmVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zKQotICAgIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLQotICAvKiBBIGZ1bmN0aW9uIHRvIGRvIGFueSBiZWdpbm5pbmcgcHJvY2Vzc2luZyBuZWVkZWQgZm9yIHRoZSBFTEYgZmlsZQotICAgICBiZWZvcmUgYnVpbGRpbmcgdGhlIEVMRiBoZWFkZXJzIGFuZCBjb21wdXRpbmcgZmlsZSBwb3NpdGlvbnMuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZykKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gIC8qIEEgZnVuY3Rpb24gdG8gZG8gYW55IGZpbmFsIHByb2Nlc3NpbmcgbmVlZGVkIGZvciB0aGUgRUxGIGZpbGUKLSAgICAgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhlIExJTktFUiBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMgQkZECi0gICAgIHdhcyBjcmVhdGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIuICAqLwotICB2b2lkICgqZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZykKLSAgICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiBsaW5rZXIpKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZS4gIEl0IHNob3VsZAotICAgICByZXR1cm4gdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHByb2dyYW0gc2VnbWVudHMgd2hpY2ggdGhpcyBCRkQKLSAgICAgd2lsbCBuZWVkLiAgSXQgc2hvdWxkIHJldHVybiAtMSBvbiBlcnJvci4gICovCi0gIGludCAoKmVsZl9iYWNrZW5kX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIG1vZGlmeSBhbiBleGlzdGluZyBzZWdtZW50IG1hcCBpbiBhCi0gICAgIGJhY2tlbmQgc3BlY2lmaWMgZmFzaGlvbi4gICovCi0gIGJvb2xlYW4gKCplbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIHNlY3Rpb24gZ2MgdG8gZGlzY292ZXIgdGhlIHNlY3Rpb24gYQotICAgICBwYXJ0aWN1bGFyIHJlbG9jYXRpb24gcmVmZXJzIHRvLiAgSXQgbmVlZCBub3QgYmUgZGVmaW5lZCBmb3IgaG9zdHMKLSAgICAgdGhhdCBoYXZlIG5vIHF1ZWVyIHJlbG9jYXRpb24gdHlwZXMuICAqLwotICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotICAvKiBUaGlzIGZ1bmN0aW9uLCBpZiBkZWZpbmVkLCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBzd2VlcCBwaGFzZSBvZiBnYwotICAgICBpbiBvcmRlciB0aGF0IGEgYmFja2VuZCBtaWdodCB1cGRhdGUgYW55IGRhdGEgc3RydWN0dXJlcyBpdCBtaWdodAotICAgICBiZSBtYWludGFpbmluZy4gICovCi0gIGJvb2xlYW4gKCpnY19zd2VlcF9ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24sIGlmIGRlZmluZWQsIGlzIGNhbGxlZCBhZnRlciB0aGUgRUxGIGhlYWRlcnMgaGF2ZQotICAgICBiZWVuIGNyZWF0ZWQuICBUaGlzIGFsbG93cyBmb3IgdGhpbmdzIGxpa2UgdGhlIE9TIGFuZCBBQkkgdmVyc2lvbnMKLSAgICAgdG8gYmUgY2hhbmdlZC4gICovCi0gIHZvaWQgKCplbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycykKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0gIC8qIFRoZSBzd2FwcGluZyB0YWJsZSB0byB1c2Ugd2hlbiBkZWFsaW5nIHdpdGggRUNPRkYgaW5mb3JtYXRpb24uCi0gICAgIFVzZWQgZm9yIHRoZSBNSVBTIEVMRiAubWRlYnVnIHNlY3Rpb24uICAqLwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLQotICAvKiBBbHRlcm5hdGUgRU1feHh4eCBtYWNoaW5lIGNvZGVzIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBpbnQgZWxmX21hY2hpbmVfYWx0MTsKLSAgaW50IGVsZl9tYWNoaW5lX2FsdDI7Ci0KLSAgY29uc3Qgc3RydWN0IGVsZl9zaXplX2luZm8gKnM7Ci0KLSAgLyogb2Zmc2V0IG9mIHRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8gc3ltYm9sIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQotICAgICAuZ290IHNlY3Rpb24gKi8KLSAgYmZkX3ZtYSBnb3Rfc3ltYm9sX29mZnNldDsKLQotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgaGVhZGVycyBmb3IgdGhlIEdPVCBhbmQgUExULiAgVGhpcyBpbmNsdWRlcwotICAgICB0aGUgc28tY2FsbGVkIHJlc2VydmVkIGVudHJpZXMgb24gc29tZSBzeXN0ZW1zLiAgKi8KLSAgYmZkX3ZtYSBnb3RfaGVhZGVyX3NpemU7Ci0gIGJmZF92bWEgcGx0X2hlYWRlcl9zaXplOwotCi0gIC8qIFdoZXRoZXIgdGhlIGJhY2tlbmQgbWF5IHVzZSBSRUwgcmVsb2NhdGlvbnMuICAoU29tZSBiYWNrZW5kcyB1c2UKLSAgICAgYm90aCBSRUwgYW5kIFJFTEEgcmVsb2NhdGlvbnMsIGFuZCB0aGlzIGZsYWcgaXMgc2V0IGZvciB0aG9zZQotICAgICBiYWNrZW5kcy4pICAqLwotICB1bnNpZ25lZCBtYXlfdXNlX3JlbF9wIDogMTsKLSAgICAKLSAgLyogV2hldGhlciB0aGUgYmFja2VuZCBtYXkgdXNlIFJFTEEgcmVsb2NhdGlvbnMuICAoU29tZSBiYWNrZW5kcyB1c2UKLSAgICAgYm90aCBSRUwgYW5kIFJFTEEgcmVsb2NhdGlvbnMsIGFuZCB0aGlzIGZsYWcgaXMgc2V0IGZvciB0aG9zZQotICAgICBiYWNrZW5kcy4pICAqLwotICB1bnNpZ25lZCBtYXlfdXNlX3JlbGFfcCA6IDE7Ci0KLSAgLyogV2hldGhlciB0aGUgZGVmYXVsdCByZWxvY2F0aW9uIHR5cGUgaXMgUkVMQS4gIElmIGEgYmFja2VuZCB3aXRoCi0gICAgIHRoaXMgZmxhZyBzZXQgd2FudHMgUkVMIHJlbG9jYXRpb25zIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbiwKLSAgICAgaXQgbXVzdCBub3RlIHRoYXQgZXhwbGljaXRseS4gIFNpbWlsYXJseSwgaWYgdGhpcyBmbGFnIGlzIGNsZWFyLAotICAgICBhbmQgdGhlIGJhY2tlbmQgd2FudHMgUkVMQSByZWxvY2F0aW9ucyBmb3IgYSBwYXJ0aWN1bGFyIAotICAgICBzZWN0aW9uLiAgKi8gICAKLSAgdW5zaWduZWQgZGVmYXVsdF91c2VfcmVsYV9wIDogMTsKLQotICB1bnNpZ25lZCB3YW50X2dvdF9wbHQgOiAxOwotICB1bnNpZ25lZCBwbHRfcmVhZG9ubHkgOiAxOwotICB1bnNpZ25lZCB3YW50X3BsdF9zeW0gOiAxOwotICB1bnNpZ25lZCBwbHRfbm90X2xvYWRlZCA6IDE7Ci0gIHVuc2lnbmVkIHBsdF9hbGlnbm1lbnQgOiA0OwotICB1bnNpZ25lZCBjYW5fZ2Nfc2VjdGlvbnMgOiAxOwotfTsKLQotLyogSW5mb3JtYXRpb24gc3RvcmVkIGZvciBlYWNoIEJGRCBzZWN0aW9uIGluIGFuIEVMRiBmaWxlLiAgVGhpcwotICAgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSBlbGZfbmV3X3NlY3Rpb25faG9vay4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YQotewotICAvKiBUaGUgRUxGIGhlYWRlciBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgdGhpc19oZHI7Ci0gIC8qIFRoZSBFTEYgaGVhZGVyIGZvciB0aGUgcmVsb2Mgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICBzZWN0aW9uLCBpZiBhbnkuICAqLwotICBFbGZfSW50ZXJuYWxfU2hkciByZWxfaGRyOwotICAvKiBJZiB0aGVyZSBpcyBhIHNlY29uZCByZWxvYyBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlY3Rpb24sCi0gICAgIGFzIGNhbiBoYXBwZW4gb24gSXJpeCA2LCB0aGlzIGZpZWxkIHBvaW50cyB0byB0aGUgaGVhZGVyLiAgKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHIyOwotICAvKiBUaGUgRUxGIHNlY3Rpb24gbnVtYmVyIG9mIHRoaXMgc2VjdGlvbi4gIE9ubHkgdXNlZCBmb3IgYW4gb3V0cHV0Ci0gICAgIGZpbGUuICAqLwotICBpbnQgdGhpc19pZHg7Ci0gIC8qIFRoZSBFTEYgc2VjdGlvbiBudW1iZXIgb2YgdGhlIHJlbG9jIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLSAgICAgc2VjdGlvbiwgaWYgYW55LiAgT25seSB1c2VkIGZvciBhbiBvdXRwdXQgZmlsZS4gICovCi0gIGludCByZWxfaWR4OwotICAvKiBVc2VkIGJ5IHRoZSBiYWNrZW5kIGxpbmtlciB0byBzdG9yZSB0aGUgc3ltYm9sIGhhc2ggdGFibGUgZW50cmllcwotICAgICBhc3NvY2lhdGVkIHdpdGggcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci0gIC8qIEEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCByZWxvY3MuICBJZiB0aGUgc2VjdGlvbiB1c2VzIFJFTCByZWxvY3MsCi0gICAgIHJhdGhlciB0aGFuIFJFTEEsIGFsbCB0aGUgcl9hZGRlbmQgZmllbGRzIHdpbGwgYmUgemVyby4gIFRoaXMKLSAgICAgcG9pbnRlciBtYXkgYmUgTlVMTC4gIEl0IGlzIHVzZWQgYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgLyogVXNlZCBieSB0aGUgYmFja2VuZCBsaW5rZXIgd2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnkgdG8KLSAgICAgcmVjb3JkIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBmb3IgYSBzZWN0aW9uIHN5bWJvbAotICAgICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc2VjdGlvbi4gIEEgdmFsdWUgb2YgMCBtZWFucyB0aGF0IHRoZXJlIGlzCi0gICAgIG5vIGR5bmFtaWMgc3ltYm9sIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBsb25nIGR5bmluZHg7Ci0gIC8qIEEgcG9pbnRlciB1c2VkIGZvciAuc3RhYiBsaW5raW5nIG9wdGltaXphdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotICAvKiBBIHBvaW50ZXIgYXZhaWxhYmxlIGZvciB0aGUgcHJvY2Vzc29yIHNwZWNpZmljIEVMRiBiYWNrZW5kLiAgKi8KLSAgUFRSIHRkYXRhOwotICAvKiBOb256ZXJvIGlmIHRoaXMgc2VjdGlvbiB1c2VzIFJFTEEgcmVsb2NhdGlvbnMsIHJhdGhlciB0aGFuIFJFTC4gICovCi0gIHVuc2lnbmVkIGludCB1c2VfcmVsYV9wOjE7Ci19OwotCi0jZGVmaW5lIGVsZl9zZWN0aW9uX2RhdGEoc2VjKSAgKChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEqKXNlYy0+dXNlZF9ieV9iZmQpCi0KLSNkZWZpbmUgZ2V0X2VsZl9iYWNrZW5kX2RhdGEoYWJmZCkgXAotICAoKHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi0vKiBFbnVtZXJhdGlvbiB0byBzcGVjaWZ5IHRoZSBzcGVjaWFsIHNlY3Rpb24uICAqLwotdHlwZWRlZiBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtCi17Ci0gIExJTktFUl9TRUNUSU9OX1VOS05PV04sCQkvKiBub3QgdXNlZCAqLwotICBMSU5LRVJfU0VDVElPTl9HT1QsCQkJLyogLmdvdCBzZWN0aW9uIGZvciBnbG9iYWwgb2Zmc2V0IHBvaW50ZXJzICovCi0gIExJTktFUl9TRUNUSU9OX1BMVCwJCQkvKiAucGx0IHNlY3Rpb24gZm9yIGdlbmVyYXRlZCBwcm9jZWR1cmUgc3R1YnMgKi8KLSAgTElOS0VSX1NFQ1RJT05fU0RBVEEsCQkJLyogLnNkYXRhLy5zYnNzIHNlY3Rpb24gZm9yIFBvd2VyUEMgKi8KLSAgTElOS0VSX1NFQ1RJT05fU0RBVEEyLAkJLyogLnNkYXRhMi8uc2JzczIgc2VjdGlvbiBmb3IgUG93ZXJQQyAqLwotICBMSU5LRVJfU0VDVElPTl9NQVgJCQkvKiAjIG9mIGxpbmtlciBzZWN0aW9ucyAqLwotfSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90OwotCi0vKiBTZWN0aW9ucyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb24KLXsKLSAgY2hhciAqbmFtZTsJCQkJLyogbmFtZSBvZiB0aGUgc2VjdGlvbiAqLwotICBjaGFyICpyZWxfbmFtZTsJCQkvKiBuYW1lIG9mIHRoZSBhc3NvY2lhdGVkIC5yZWx7LGF9LiBzZWN0aW9uICovCi0gIGNoYXIgKmJzc19uYW1lOwkJCS8qIG5hbWUgb2YgYSByZWxhdGVkIC5ic3Mgc2VjdGlvbiAqLwotICBjaGFyICpzeW1fbmFtZTsJCQkvKiBuYW1lIG9mIHN5bWJvbCB0byByZWZlcmVuY2UgdGhpcyBzZWN0aW9uICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwkJCS8qIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gKi8KLSAgYXNlY3Rpb24gKmJzc19zZWN0aW9uOwkJLyogcG9pbnRlciB0byB0aGUgYnNzIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgKi8KLSAgYXNlY3Rpb24gKnJlbF9zZWN0aW9uOwkJLyogcG9pbnRlciB0byB0aGUgcmVsb2NhdGlvbnMgbmVlZGVkIGZvciB0aGlzIHNlY3Rpb24gKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKnN5bV9oYXNoOwkvKiBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIHN5bWJvbCBoYXNoIHZhbHVlICovCi0gIGJmZF92bWEgaW5pdGlhbF9zaXplOwkJCS8qIGluaXRpYWwgc2l6ZSBiZWZvcmUgYW55IGxpbmtlciBnZW5lcmF0ZWQgYWxsb2NhdGlvbnMgKi8KLSAgYmZkX3ZtYSBzeW1fb2Zmc2V0OwkJCS8qIG9mZnNldCBvZiBzeW1ib2wgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLwotICBiZmRfdm1hIGhvbGVfc2l6ZTsJCQkvKiBzaXplIG9mIHJlc2VydmVkIGFkZHJlc3MgaG9sZSBpbiBhbGxvY2F0aW9uICovCi0gIGJmZF92bWEgaG9sZV9vZmZzZXQ7CQkJLyogY3VycmVudCBvZmZzZXQgZm9yIHRoZSBob2xlICovCi0gIGJmZF92bWEgbWF4X2hvbGVfb2Zmc2V0OwkJLyogbWF4aW11bSBvZmZzZXQgZm9yIHRoZSBob2xlICovCi0gIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7CS8qIHdoaWNoIHNlY3Rpb24gdGhpcyBpcyAqLwotICBib29sZWFuIGhvbGVfd3JpdHRlbl9wOwkJLyogd2hldGhlciB0aGUgaG9sZSBoYXMgYmVlbiBpbml0aWFsaXplZCAqLwotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50OwkJLyogYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbiAqLwotICBmbGFnd29yZCBmbGFnczsJCQkvKiBmbGFncyB0byB1c2UgdG8gY3JlYXRlIHRoZSBzZWN0aW9uICovCi19IGVsZl9saW5rZXJfc2VjdGlvbl90OwotCi0vKiBMaW5rZWQgbGlzdCBvZiBhbGxvY2F0ZWQgcG9pbnRlciBlbnRyaWVzLiAgVGhpcyBoYW5ncyBvZmYgb2YgdGhlIHN5bWJvbCBsaXN0cywgYW5kCi0gICBwcm92aWRlcyBhbGxvd3MgdXMgdG8gcmV0dXJuIGRpZmZlcmVudCBwb2ludGVycywgYmFzZWQgb24gZGlmZmVyZW50IGFkZGVuZCdzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzCi17Ci0gIHN0cnVjdCBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnMgKm5leHQ7CS8qIG5leHQgYWxsb2NhdGVkIHBvaW50ZXIgZm9yIHRoaXMgc3ltYm9sICovCi0gIGJmZF92bWEgb2Zmc2V0OwkJCQkvKiBvZmZzZXQgb2YgcG9pbnRlciBmcm9tIGJlZ2lubmluZyBvZiBzZWN0aW9uICovCi0gIGJmZF9zaWduZWRfdm1hIGFkZGVuZDsJCQkvKiBhZGRlbmQgdXNlZCAqLwotICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoOwkJLyogd2hpY2ggbGlua2VyIHNlY3Rpb24gdGhpcyBpcyAqLwotICBib29sZWFuIHdyaXR0ZW5fYWRkcmVzc19wOwkJCS8qIHdoZXRoZXIgYWRkcmVzcyB3YXMgd3JpdHRlbiB5ZXQgKi8KLX0gZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3Q7Ci0KLS8qIFNvbWUgcHJpdmF0ZSBkYXRhIGlzIHN0YXNoZWQgYXdheSBmb3IgZnV0dXJlIHVzZSB1c2luZyB0aGUgdGRhdGEgcG9pbnRlcgotICAgaW4gdGhlIGJmZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZWxmX29ial90ZGF0YQotewotICBFbGZfSW50ZXJuYWxfRWhkciBlbGZfaGVhZGVyWzFdOwkvKiBBY3R1YWwgZGF0YSwgYnV0IHJlZiBsaWtlIHB0ciAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmVsZl9zZWN0X3B0cjsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnBoZHI7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKnNlZ21lbnRfbWFwOwotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpzdHJ0YWJfcHRyOwotICBpbnQgbnVtX2xvY2FsczsKLSAgaW50IG51bV9nbG9iYWxzOwotICBhc3ltYm9sICoqc2VjdGlvbl9zeW1zOwkJLyogU1RUX1NFQ1RJT04gc3ltYm9scyBmb3IgZWFjaCBzZWN0aW9uICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyIHN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyIHNoc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHluc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHluc3RydGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVyc3ltX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVycmVmX2hkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgZHludmVyZGVmX2hkcjsKLSAgdW5zaWduZWQgaW50IHN5bXRhYl9zZWN0aW9uLCBzaHN0cnRhYl9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgc3RydGFiX3NlY3Rpb24sIGR5bnN5bXRhYl9zZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgZHludmVyc3ltX3NlY3Rpb24sIGR5bnZlcmRlZl9zZWN0aW9uLCBkeW52ZXJyZWZfc2VjdGlvbjsKLSAgZmlsZV9wdHIgbmV4dF9maWxlX3BvczsKLSNpZiAwCi0gIC8qIHdlIGRvbid0IG5lZWQgdGhlc2UgaW5zaWRlIGJmZCBhbnltb3JlLCBhbmQgSSB0aGluawotICAgICB0aGVzZSB3ZXJlbid0IHVzZWQgb3V0c2lkZSBiZmQuICovCi0gIHZvaWQgKnByc3RhdHVzOwkJCS8qIFRoZSByYXcgL3Byb2MgcHJzdGF0dXMgc3RydWN0dXJlICovCi0gIHZvaWQgKnBycHNpbmZvOwkJCS8qIFRoZSByYXcgL3Byb2MgcHJwc2luZm8gc3RydWN0dXJlICovCi0jZW5kaWYKLSAgYmZkX3ZtYSBncDsJCQkJLyogVGhlIGdwIHZhbHVlIChNSVBTIG9ubHksIGZvciBub3cpICovCi0gIHVuc2lnbmVkIGludCBncF9zaXplOwkJCS8qIFRoZSBncCBzaXplIChNSVBTIG9ubHksIGZvciBub3cpICovCi0KLSAgLyogSW5mb3JtYXRpb24gZ3JhYmJlZCBmcm9tIGFuIGVsZiBjb3JlIGZpbGUuICovCi0gIGludCBjb3JlX3NpZ25hbDsKLSAgaW50IGNvcmVfcGlkOwotICBpbnQgY29yZV9sd3BpZDsKLSAgY2hhciogY29yZV9wcm9ncmFtOwotICBjaGFyKiBjb3JlX2NvbW1hbmQ7Ci0KLSAgLyogVGhpcyBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIGJ5IHRoZSBiYWNrZW5kCi0gICAgIGxpbmtlci4gICovCi0gIGJvb2xlYW4gbGlua2VyOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGV4dGVybmFsIHN5bWJvbHMgdG8gZW50cmllcyBpbiB0aGUgbGlua2VyIGhhc2gKLSAgICAgdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhpcyBpcyBpbmRleGVkIGJ5IHRoZSBzeW1ib2wgaW5kZXgKLSAgICAgbWludXMgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bWJvbCB0YWJsZSBoZWFkZXIuICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0KLSAgLyogQSBtYXBwaW5nIGZyb20gbG9jYWwgc3ltYm9scyB0byBvZmZzZXRzIGludG8gdGhlIGdsb2JhbCBvZmZzZXQKLSAgICAgdGFibGUsIHVzZWQgd2hlbiBsaW5raW5nLiAgVGhpcyBpcyBpbmRleGVkIGJ5IHRoZSBzeW1ib2wgaW5kZXguCi0gICAgIExpa2UgZm9yIHRoZSBnbG9iYWxzLCB3ZSB1c2UgYSB1bmlvbiBhbmQgdHdvIG5hbWVzIHByaW1hcmlseSB0bwotICAgICBkb2N1bWVudCB0aGUgaW50ZW50IG9mIGFueSBwYXJ0aWN1bGFyIHBpZWNlIG9mIGNvZGUuICBUaGUgZmllbGQKLSAgICAgc2hvdWxkIGJlIHVzZWQgYXMgYSBjb3VudCB1bnRpbCBzaXplX2R5bmFtaWNfc2VjdGlvbnMsIGF0IHdoaWNoCi0gICAgIHBvaW50IHRoZSBjb250ZW50cyBvZiB0aGUgLmdvdCBpcyBmaXhlZC4gIEFmdGVyd2FyZCwgaWYgYW4gZW50cnkKLSAgICAgaXMgLTEsIHRoZW4gdGhlIHN5bWJvbCBkb2VzIG5vdCByZXF1aXJlIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBiZmRfc2lnbmVkX3ZtYSAqcmVmY291bnRzOwotICAgICAgYmZkX3ZtYSAqb2Zmc2V0czsKLSAgICB9IGxvY2FsX2dvdDsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBsb2NhbCBzeW1ib2xzIHRvIG9mZnNldHMgaW50byB0aGUgdmFyaW91cyBsaW5rZXIKLSAgICAgc2VjdGlvbnMgYWRkZWQuICBUaGlzIGlzIGluZGV4IGJ5IHRoZSBzeW1ib2wgaW5kZXguICAqLwotICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKmxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzOwotCi0gIC8qIFRoZSBsaW5rZXIgRUxGIGVtdWxhdGlvbiBjb2RlIG5lZWRzIHRvIGxldCB0aGUgYmFja2VuZCBFTEYgbGlua2VyCi0gICAgIGtub3cgd2hhdCBmaWxlbmFtZSBzaG91bGQgYmUgdXNlZCBmb3IgYSBkeW5hbWljIG9iamVjdCBpZiB0aGUKLSAgICAgZHluYW1pYyBvYmplY3QgaXMgZm91bmQgdXNpbmcgYSBzZWFyY2guICBUaGUgZW11bGF0aW9uIGNvZGUgdGhlbgotICAgICBzb21ldGltZXMgbmVlZHMgdG8ga25vdyB3aGF0IG5hbWUgd2FzIGFjdHVhbGx5IHVzZWQuICBVbnRpbCB0aGUKLSAgICAgZmlsZSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbGlua2VyIHN5bWJvbCB0YWJsZSwgdGhpcyBmaWVsZCBob2xkcwotICAgICB0aGUgbmFtZSB0aGUgbGlua2VyIHdhbnRzLiAgQWZ0ZXIgaXQgaGFzIGJlZW4gYWRkZWQsIGl0IGhvbGRzIHRoZQotICAgICBuYW1lIGFjdHVhbGx5IHVzZWQsIHdoaWNoIHdpbGwgYmUgdGhlIERUX1NPTkFNRSBlbnRyeSBpZiB0aGVyZSBpcwotICAgICBvbmUuICAqLwotICBjb25zdCBjaGFyICpkdF9uYW1lOwotCi0gIC8qIElyaXggNSBvZnRlbiBzY3Jld3MgdXAgdGhlIHN5bWJvbCB0YWJsZSwgc29ydGluZyBsb2NhbCBzeW1ib2xzCi0gICAgIGFmdGVyIGdsb2JhbCBzeW1ib2xzLiAgVGhpcyBmbGFnIGlzIHNldCBpZiB0aGUgc3ltYm9sIHRhYmxlIGluCi0gICAgIHRoaXMgQkZEIGFwcGVhcnMgdG8gYmUgc2NyZXdlZCB1cC4gIElmIGl0IGlzLCB3ZSBpZ25vcmUgdGhlCi0gICAgIHNoX2luZm8gZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBoZWFkZXIsIGFuZCBhbHdheXMgcmVhZCBhbGwgdGhlCi0gICAgIHN5bWJvbHMuICAqLwotICBib29sZWFuIGJhZF9zeW10YWI7Ci0KLSAgLyogUmVjb3JkcyB0aGUgcmVzdWx0IG9mIGBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZScuICAqLwotICBiZmRfc2l6ZV90eXBlIHByb2dyYW1faGVhZGVyX3NpemU7Ci0KLSAgLyogVXNlZCBieSBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogVXNlZCBieSBNSVBTIEVMRiBmaW5kX25lYXJlc3RfbGluZSBlbnRyeSBwb2ludC4gIFRoZSBzdHJ1Y3R1cmUKLSAgICAgY291bGQgYmUgaW5jbHVkZWQgZGlyZWN0bHkgaW4gdGhpcyBvbmUsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IHRvCi0gICAgIHdhc3RpbmcgdGhlIG1lbW9yeSBqdXN0IGZvciB0aGUgaW5mcmVxdWVudGx5IGNhbGxlZAotICAgICBmaW5kX25lYXJlc3RfbGluZS4gICovCi0gIHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKmZpbmRfbGluZV9pbmZvOwotCi0gIC8qIEEgcGxhY2UgdG8gc3Rhc2ggZHdhcmYxIGluZm8gZm9yIHRoaXMgYmZkLiAqLwotICBzdHJ1Y3QgZHdhcmYxX2RlYnVnICpkd2FyZjFfZmluZF9saW5lX2luZm87Ci0KLSAgLyogQSBwbGFjZSB0byBzdGFzaCBkd2FyZjIgaW5mbyBmb3IgdGhpcyBiZmQuICovCi0gIHN0cnVjdCBkd2FyZjJfZGVidWcgKmR3YXJmMl9maW5kX2xpbmVfaW5mbzsKLQotICAvKiBBbiBhcnJheSBvZiBzdHViIHNlY3Rpb25zIGluZGV4ZWQgYnkgc3ltYm9sIG51bWJlciwgdXNlZCBieSB0aGUKLSAgICAgTUlQUyBFTEYgbGlua2VyLiAgRklYTUU6IFdlIHNob3VsZCBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIG9ubHkKLSAgICAgaW5jbHVkZSB0aGlzIGZpZWxkIGZvciBhIE1JUFMgRUxGIHRhcmdldC4gICovCi0gIGFzZWN0aW9uICoqbG9jYWxfc3R1YnM7Ci0KLSAgLyogVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGVfZmxhZ3MgZmllbGQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KLSAgYm9vbGVhbiBmbGFnc19pbml0OwotCi0gIC8qIE51bWJlciBvZiBzeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9ucyB3ZSBhcmUgYWJvdXQgdG8gZW1pdC4gICovCi0gIHVuc2lnbmVkIGludCBjdmVyZGVmczsKLQotICAvKiBOdW1iZXIgb2Ygc3ltYm9sIHZlcnNpb24gcmVmZXJlbmNlcyB3ZSBhcmUgYWJvdXQgdG8gZW1pdC4gICovCi0gIHVuc2lnbmVkIGludCBjdmVycmVmczsKLQotICAvKiBTeW1ib2wgdmVyc2lvbiBkZWZpbml0aW9ucyBpbiBleHRlcm5hbCBvYmplY3RzLiAgKi8KLSAgRWxmX0ludGVybmFsX1ZlcmRlZiAqdmVyZGVmOwotCi0gIC8qIFN5bWJvbCB2ZXJzaW9uIHJlZmVyZW5jZXMgdG8gZXh0ZXJuYWwgb2JqZWN0cy4gICovCi0gIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp2ZXJyZWY7Ci0KLSAgLyogTGlua2VyIHNlY3Rpb25zIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4uICAqLwotICBzdHJ1Y3QgZWxmX2xpbmtlcl9zZWN0aW9uICpsaW5rZXJfc2VjdGlvblsgKGludClMSU5LRVJfU0VDVElPTl9NQVggXTsKLX07Ci0KLSNkZWZpbmUgZWxmX3RkYXRhKGJmZCkJCSgoYmZkKSAtPiB0ZGF0YS5lbGZfb2JqX2RhdGEpCi0jZGVmaW5lIGVsZl9lbGZoZWFkZXIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZWxmX2hlYWRlcikKLSNkZWZpbmUgZWxmX2VsZnNlY3Rpb25zKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGVsZl9zZWN0X3B0cikKLSNkZWZpbmUgZWxmX3Noc3RydGFiKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN0cnRhYl9wdHIpCi0jZGVmaW5lIGVsZl9vbmVzeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gc3ltdGFiX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW5zeW10YWIoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHluc3ltdGFiX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJzeW0oYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVyc3ltX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJkZWYoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVyZGVmX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9keW52ZXJyZWYoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gZHludmVycmVmX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9udW1fbG9jYWxzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IG51bV9sb2NhbHMpCi0jZGVmaW5lIGVsZl9udW1fZ2xvYmFscyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBudW1fZ2xvYmFscykKLSNkZWZpbmUgZWxmX3NlY3Rpb25fc3ltcyhiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBzZWN0aW9uX3N5bXMpCi0jZGVmaW5lIGNvcmVfcHJwc2luZm8oYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gcHJwc2luZm8pCi0jZGVmaW5lIGNvcmVfcHJzdGF0dXMoYmZkKQkoZWxmX3RkYXRhKGJmZCkgLT4gcHJzdGF0dXMpCi0jZGVmaW5lIGVsZl9ncChiZmQpCQkoZWxmX3RkYXRhKGJmZCkgLT4gZ3ApCi0jZGVmaW5lIGVsZl9ncF9zaXplKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IGdwX3NpemUpCi0jZGVmaW5lIGVsZl9zeW1faGFzaGVzKGJmZCkJKGVsZl90ZGF0YShiZmQpIC0+IHN5bV9oYXNoZXMpCi0jZGVmaW5lIGVsZl9sb2NhbF9nb3RfcmVmY291bnRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxvY2FsX2dvdC5yZWZjb3VudHMpCi0jZGVmaW5lIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyhiZmQpIChlbGZfdGRhdGEoYmZkKSAtPiBsb2NhbF9nb3Qub2Zmc2V0cykKLSNkZWZpbmUgZWxmX2xvY2FsX3B0cl9vZmZzZXRzKGJmZCkgKGVsZl90ZGF0YShiZmQpIC0+IGxpbmtlcl9zZWN0aW9uX3BvaW50ZXJzKQotI2RlZmluZSBlbGZfZHRfbmFtZShiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBkdF9uYW1lKQotI2RlZmluZSBlbGZfYmFkX3N5bXRhYihiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBiYWRfc3ltdGFiKQotI2RlZmluZSBlbGZfZmxhZ3NfaW5pdChiZmQpCShlbGZfdGRhdGEoYmZkKSAtPiBmbGFnc19pbml0KQotI2RlZmluZSBlbGZfbGlua2VyX3NlY3Rpb24oYmZkLG4pIChlbGZfdGRhdGEoYmZkKSAtPiBsaW5rZXJfc2VjdGlvblsoaW50KW5dKQotDAotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJkZWZfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkZWYgKiwgRWxmX0ludGVybmFsX1ZlcmRlZiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkZWYgKiwgRWxmX0V4dGVybmFsX1ZlcmRlZiAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJkYXV4ICosIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9WZXJkYXV4ICosIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVybmVlZF9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKiwgRWxmX0ludGVybmFsX1Zlcm5lZWQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuZWVkX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5lZWQgKiwgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKikpOwotZXh0ZXJuIHZvaWQgX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqLCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmF1eCAqLCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1ZlcnN5bSAqLCBFbGZfSW50ZXJuYWxfVmVyc3ltICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1ZlcnN5bSAqLCBFbGZfRXh0ZXJuYWxfVmVyc3ltICopKTsKLQotZXh0ZXJuIGludCBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCwgdW5zaWduZWQpKTsKLWV4dGVybiBjaGFyICpiZmRfZWxmX2dldF9zdHJfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQpKTsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosCi0JCQkJCSAgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci0jZGVmaW5lIGVsZl9zdHJpbmdfZnJvbV9lbGZfc3RydGFiKGFiZmQsc3RyaW5kZXgpIFwKLSAgICAgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbihhYmZkLGVsZl9lbGZoZWFkZXIoYWJmZCktPmVfc2hzdHJuZHgsc3RyaW5kZXgpCi0KLSNkZWZpbmUgYmZkX2VsZjMyX3ByaW50X3N5bWJvbAliZmRfZWxmX3ByaW50X3N5bWJvbAotI2RlZmluZSBiZmRfZWxmNjRfcHJpbnRfc3ltYm9sCWJmZF9lbGZfcHJpbnRfc3ltYm9sCi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJmZF9lbGZfaGFzaCBQQVJBTVMgKChDT05TVCB1bnNpZ25lZCBjaGFyICopKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJICAgIGFyZWxlbnQgKiwKLQkJCQkJCQkgICAgYXN5bWJvbCAqLAotCQkJCQkJCSAgICBQVFIsCi0JCQkJCQkJICAgIGFzZWN0aW9uICosCi0JCQkJCQkJICAgIGJmZCAqLAotCQkJCQkJCSAgICBjaGFyICoqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmX21rY29yZWZpbGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBFbGZfSW50ZXJuYWxfU2hkciAqYmZkX2VsZl9maW5kX3NlY3Rpb24gUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMgKChiZmQgKmFiZmQsIEVsZl9JbnRlcm5hbF9TaGRyICpoZHIsIGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl93cml0ZV9jb3JlZmlsZV9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwKLQkJCQkJCSAgICAgICBmaWxlX3B0ciwKLQkJCQkJCSAgICAgICBiZmRfc2l6ZV90eXBlKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfcmVsb2MgUEFSQU1TICgoYmZkICosIHNlY19wdHIsCi0JCQkJCQkgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwKLQkJCQkJCQkgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWxmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2VsZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICAgIHN5bWJvbF9pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFsZW50ICpfYmZkX2VsZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLQkJCQkJCXVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgIGFzeW1ib2wgKiosCi0JCQkJCQkgICAgYmZkX3ZtYSwgQ09OU1QgY2hhciAqKiwKLQkJCQkJCSAgICBDT05TVCBjaGFyICoqLAotCQkJCQkJICAgIHVuc2lnbmVkIGludCAqKSk7Ci0jZGVmaW5lIF9iZmRfZWxmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgX2JmZF9lbGZfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi1leHRlcm4gaW50IF9iZmRfZWxmX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0KLS8qIElmIHRoZSB0YXJnZXQgZG9lc24ndCBoYXZlIHJlbG9jIGhhbmRsaW5nIHdyaXR0ZW4geWV0OiAgKi8KLWV4dGVybiB2b2lkIF9iZmRfZWxmX25vX2luZm9fdG9faG93dG8gUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwKLQkJCQkJICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotZXh0ZXJuIGJvb2xlYW4gYmZkX3NlY3Rpb25fZnJvbV9zaGRyIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgc2hpbmRleCkpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX3NlY3Rpb25fZnJvbV9waGRyIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLQotZXh0ZXJuIGludCBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci0KLWFzZWN0aW9uICpiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50KSk7Ci1ib29sZWFuIF9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1ib29sZWFuCi1fYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLWJvb2xlYW4KLV9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci12b2lkIF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzIFBBUkFNUyAoKGJmZCAqKSk7Ci1maWxlX3B0ciBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiBQQVJBTVMgKChFbGZfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJCSAgICBmaWxlX3B0ciwKLQkJCQkJCQkgICAgYm9vbGVhbikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWJvb2xlYW4gX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWJvb2xlYW4gX2JmZF9lbGZfbGlua19hZGp1c3RfZHluaW5keCBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgICAgICBQVFIpKTsKLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKl9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKmFiZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZW51bSBlbGZfbGlua2VyX3NlY3Rpb25fZW51bSwKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqZGVmYXVsdHMpKTsKLQotZWxmX2xpbmtlcl9zZWN0aW9uX3BvaW50ZXJzX3QgKl9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbgotICBQQVJBTVMgKChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzLAotCSAgIGJmZF9zaWduZWRfdm1hIGFkZGVuZCwKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fZW51bV90IHdoaWNoKSk7Ci0KLWJvb2xlYW4gYmZkX2VsZjMyX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgY29uc3QgRWxmMzJfSW50ZXJuYWxfUmVsYSAqcmVsKSk7Ci0KLWJmZF92bWEgYmZkX2VsZjMyX2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2FiZmQsCi0JICAgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkgICBjb25zdCBFbGYzMl9JbnRlcm5hbF9SZWxhICpyZWwsCi0JICAgaW50IHJlbGF0aXZlX3JlbG9jKSk7Ci0KLWJvb2xlYW4gYmZkX2VsZjY0X2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3QsCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JICAgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVsYSAqcmVsKSk7Ci0KLWJmZF92bWEgYmZkX2VsZjY0X2ZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqb3V0cHV0X2FiZmQsCi0JICAgYmZkICppbnB1dF9iZmQsCi0JICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0LAotCSAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLAotCSAgIGJmZF92bWEgcmVsb2NhdGlvbiwKLQkgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWxhICpyZWwsCi0JICAgaW50IHJlbGF0aXZlX3JlbG9jKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhCi0gIFBBUkFNUyAoKGJmZCAqZHlub2JqLAotCSAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdCwKLQkgICBpbnQgYWxpZ25tZW50KSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGZjb3JlX3NlY3Rpb25fZnJvbV9waGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGYzMl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmJmZF9lbGYzMl9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNoYXIgKmJmZF9lbGYzMl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IGJmZF9lbGYzMl9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgUEFSQU1TICgoYmZkICosCi0JCQkJCQkJCSBiZmQgKikpOwotCi1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1N5bSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfRXh0ZXJuYWxfUmVsICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICosIEVsZjMyX0V4dGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmMzJfc3dhcF9waGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9QaGRyICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX3BoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBFbGYzMl9FeHRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX2R5bl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9EeW4gKiwgRWxmMzJfRXh0ZXJuYWxfRHluICopKTsKLWV4dGVybiBsb25nIGJmZF9lbGYzMl9zbHVycF9zeW1ib2xfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl93cml0ZV9zaGRyc19hbmRfZWhkciBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBiZmRfZWxmMzJfd3JpdGVfb3V0X3BoZHJzCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmMzJfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9SZWxhICpfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYm9vbGVhbikpOwotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjY0X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2VsZjY0X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gY2hhciAqYmZkX2VsZjY0X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgYmZkX2VsZjY0X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2VsZjY0X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCQkJIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9zeW1ib2xfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1N5bSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3N5bWJvbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwgUFRSKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9yZWxvY19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfRXh0ZXJuYWxfUmVsICosIEVsZl9JbnRlcm5hbF9SZWwgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2Nfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICosIEVsZjY0X0V4dGVybmFsX1JlbCAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1JlbGEgKikpOwotZXh0ZXJuIHZvaWQgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfZWxmNjRfc3dhcF9waGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9QaGRyICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX3BoZHJfb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBFbGY2NF9FeHRlcm5hbF9QaGRyICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX2R5bl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLWV4dGVybiB2b2lkIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9EeW4gKiwgRWxmNjRfRXh0ZXJuYWxfRHluICopKTsKLWV4dGVybiBsb25nIGJmZF9lbGY2NF9zbHVycF9zeW1ib2xfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGJvb2xlYW4pKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF93cml0ZV9zaGRyc19hbmRfZWhkciBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGludCBiZmRfZWxmNjRfd3JpdGVfb3V0X3BoZHJzCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqLCBpbnQpKTsKLWV4dGVybiBib29sZWFuIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gYm9vbGVhbiBiZmRfZWxmNjRfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIEVsZl9JbnRlcm5hbF9SZWxhICpfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYm9vbGVhbikpOwotCi0jZGVmaW5lIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbgotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosIFBUUiwKLSAgICAgICAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGYzMl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX2NvbW1vbl9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1ib29sZWFuIF9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotYm9vbGVhbiBfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBiZmRfdm1hKSk7Ci0KLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvKSk7Ci1ib29sZWFuIF9iZmRfZWxmNjRfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19jb21tb25fZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotYm9vbGVhbiBfYmZkX2VsZjY0X2djX3JlY29yZF92dGluaGVyaXQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIGJmZF92bWEpKTsKLWJvb2xlYW4gX2JmZF9lbGY2NF9nY19yZWNvcmRfdnRlbnRyeQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgYmZkX3ZtYSkpOwotCi0vKiBNSVBTIEVMRiBzcGVjaWZpYyByb3V0aW5lcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9TaGRyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX21pcHNfZWxmX3N5bWJvbF9wcm9jZXNzaW5nIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotCi0jZW5kaWYgLyogX0xJQkVMRl9IXyAqLwpkaWZmIC0tZ2l0IGEvYmZkL2VsZi1ocHBhLmggYi9iZmQvZWxmLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1MjNlMy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKiBDb21tb24gY29kZSBmb3IgUEEgRUxGIGltcGxlbWVudGF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBFTEZfSE9XVE9fVEFCTEVfU0laRSAgICAgICBSX1BBUklTQ19VTklNUExFTUVOVEVEICsgMQotCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIEVMRl9SX1RZUEUoWCkgICBFTEY2NF9SX1RZUEUoWCkKLSNkZWZpbmUgX2JmZF9lbGZfaHBwYV9nZW5fcmVsb2NfdHlwZSBfYmZkX2VsZjY0X2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBFTEZfUl9UWVBFKFgpICAgRUxGMzJfUl9UWVBFKFgpCi0jZGVmaW5lIF9iZmRfZWxmX2hwcGFfZ2VuX3JlbG9jX3R5cGUgX2JmZF9lbGYzMl9ocHBhX2dlbl9yZWxvY190eXBlCi0jZW5kaWYKLQotLyogRUxGL1BBIHJlbG9jYXRpb24gaG93dG8gZW50cmllcy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9ocHBhX2hvd3RvX3RhYmxlW0VMRl9IT1dUT19UQUJMRV9TSVpFXSA9Ci17Ci0gIHtSX1BBUklTQ19OT05FLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19OT05FIn0sCi0KLSAgLyogVGhlIHZhbHVlcyBpbiBESVIzMiBhcmUgdG8gcGxhY2F0ZSB0aGUgY2hlY2sgaW4KLSAgICAgX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICB7Ul9QQVJJU0NfRElSMzIsIDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19ESVIzMiIsIGZhbHNlLCAwLCAweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtSX1BBUklTQ19ESVIyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19ESVIyMUwifSwKLSAge1JfUEFSSVNDX0RJUjE3UiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RJUjE3UiJ9LAotICB7Ul9QQVJJU0NfRElSMTdGLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfRElSMTdGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ESVIxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19ESVIxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1BDUkVMMzIsIDAsIDAsIDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1BDUkVMMzIifSwKLQotICB7Ul9QQVJJU0NfUENSRUwyMUwsIDAsIDAsIDIxLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1BDUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE3UiwgMCwgMCwgMTcsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUENSRUwxN1IifSwKLSAge1JfUEFSSVNDX1BDUkVMMTdGLCAwLCAwLCAxNywgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QQ1JFTDE3RiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxN0MsIDAsIDAsIDE3LCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1BDUkVMMTdDIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE0UiwgMCwgMCwgMTQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUENSRUwxNFIifSwKLSAge1JfUEFSSVNDX1BDUkVMMTRGLCAwLCAwLCAxNCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QQ1JFTDE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRFBSRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19EUFJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfRFBSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19EUFJFTDE0V1IifSwKLQotICB7Ul9QQVJJU0NfRFBSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19EUFJFTDE0RFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RQUkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfRFBSRUwxNFIifSwKLSAge1JfUEFSSVNDX0RQUkVMMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfRFBSRUwxNEYifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVFJFTDIxTCwgMCwgMCwgMjEsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RMVFJFTDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19ETFRSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19ETFRSRUwxNFIifSwKLSAge1JfUEFSSVNDX0RMVFJFTDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RMVFJFTDE0RiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfRExUSU5EMjFMLCAwLCAwLCAyMSwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfRExUSU5EMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRJTkQxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19ETFRJTkQxNFIifSwKLSAge1JfUEFSSVNDX0RMVElORDE0RiwgMCwgMCwgMTQsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RMVElORDE0RiJ9LAotCi0gIHtSX1BBUklTQ19TRVRCQVNFLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19TRVRCQVNFIn0sCi0gIHtSX1BBUklTQ19TRUNSRUwzMiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfU0VDUkVMMzIifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19CQVNFUkVMMjFMIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTdSLCAwLCAwLCAxNywgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfQkFTRVJFTDE3UiJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDE3RiwgMCwgMCwgMTcsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0JBU0VSRUwxN0YifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNFIsIDAsIDAsIDE0LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19CQVNFUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19CQVNFUkVMMTRGLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfQkFTRVJFTDE0RiJ9LAotICB7Ul9QQVJJU0NfU0VHQkFTRSwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfU0VHQkFTRSJ9LAotICB7Ul9QQVJJU0NfU0VHUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1NFR1JFTDMyIn0sCi0KLSAge1JfUEFSSVNDX1BMVE9GRjIxTCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUExUT0ZGMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1BMVE9GRjE0UiJ9LAotICB7Ul9QQVJJU0NfUExUT0ZGMTRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QTFRPRkYxNEYifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIzMiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjMyIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19MVE9GRl9GUFRSMjFMIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFIifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0ZQVFI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfRlBUUjY0In0sCi0gIHtSX1BBUklTQ19QTEFCRUwzMiwgMCwgMCwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1BMQUJFTDMyIn0sCi0gIHtSX1BBUklTQ19QTEFCRUwyMUwsIDAsIDAsIDIxLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QTEFCRUwyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfUExBQkVMMTRSLCAwLCAwLCAxNCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUExBQkVMMTRSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QQ1JFTDY0In0sCi0gIHtSX1BBUklTQ19QQ1JFTDIyQywgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUENSRUwyMkMifSwKLSAge1JfUEFSSVNDX1BDUkVMMjJGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QQ1JFTDIyRiJ9LAotICB7Ul9QQVJJU0NfUENSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QQ1JFTDE0V1IifSwKLSAge1JfUEFSSVNDX1BDUkVMMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUENSRUwxNERSIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUENSRUwxNkYifSwKLSAge1JfUEFSSVNDX1BDUkVMMTZXRiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUENSRUwxNldGIn0sCi0gIHtSX1BBUklTQ19QQ1JFTDE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1BDUkVMMTZERiJ9LAotCi0gIHtSX1BBUklTQ19ESVI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfRElSNjQifSwKLSAge1JfUEFSSVNDX0RJUjY0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RJUjY0V1IifSwKLSAge1JfUEFSSVNDX0RJUjY0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RJUjY0RFIifSwKLSAge1JfUEFSSVNDX0RJUjE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RJUjE0V1IifSwKLSAge1JfUEFSSVNDX0RJUjE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RJUjE0RFIifSwKLSAge1JfUEFSSVNDX0RJUjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfRElSMTZGIn0sCi0gIHtSX1BBUklTQ19ESVIxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19ESVIxNldGIn0sCi0gIHtSX1BBUklTQ19ESVIxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19ESVIxNkRGIn0sCi0gIHtSX1BBUklTQ19HUFJFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19HUFJFTDY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0RMVFJFTDE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RMVFJFTDE0V1IifSwKLSAge1JfUEFSSVNDX0RMVFJFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RMVFJFTDE0RFIifSwKLSAge1JfUEFSSVNDX0dQUkVMMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19HUFJFTDE2RiJ9LAotICB7Ul9QQVJJU0NfR1BSRUwxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19HUFJFTDE2V0YifSwKLSAge1JfUEFSSVNDX0dQUkVMMTZERiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfR1BSRUwxNkRGIn0sCi0gIHtSX1BBUklTQ19MVE9GRjY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19MVE9GRjY0In0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19ETFRJTkQxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19ETFRJTkQxNFdSIn0sCi0KLSAge1JfUEFSSVNDX0RMVElORDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0RMVElORDE0RFIifSwKLSAge1JfUEFSSVNDX0xUT0ZGMTZGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19MVE9GRjE2RiJ9LAotICB7Ul9QQVJJU0NfTFRPRkYxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19MVE9GRjE2REYifSwKLSAge1JfUEFSSVNDX1NFQ1JFTDY0LCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19TRUNSRUw2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfQkFTRVJFTDE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0JTRVJFTDE0V1IifSwKLSAge1JfUEFSSVNDX0JBU0VSRUwxNERSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19CQVNFUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19TRUdSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfU0VHUkVMNjQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1BMVE9GRjE0V1IifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1BMVE9GRjE0RFIifSwKLSAge1JfUEFSSVNDX1BMVE9GRjE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfUExUT0ZGMTZGIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QTFRPRkYxNldGIn0sCi0gIHtSX1BBUklTQ19QTFRPRkYxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19QTFRPRkYxNkRGIn0sCi0KLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFI2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE0V1IsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNFdSIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9GUFRSMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfTFRPRkZfRlBUUjE0RFIifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0xUT0ZGX0ZQVFIxNkYifSwKLSAge1JfUEFSSVNDX0xUT0ZGX0ZQVFIxNldGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19MVE9GRl9GUFRSMTZXRiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfRlBUUjE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0NPUFksIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0NPUFkifSwKLSAge1JfUEFSSVNDX0lQTFQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0lQTFQifSwKLQotICB7Ul9QQVJJU0NfRVBMVCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfRVBMVCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMMzIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwzMiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwyMUwsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwyMUwifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1RQUkVMMTRSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTRSIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLQotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMjFMLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19MVE9GRl9UUDIxTCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9UUDE0UiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNEYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0xUT0ZGX1RQMTRGIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0gIHtSX1BBUklTQ19VTklNUExFTUVOVEVELCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19VTklNUExFTUVOVEVEIn0sCi0KLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1VOSU1QTEVNRU5URUQifSwKLSAge1JfUEFSSVNDX1VOSU1QTEVNRU5URUQsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUw2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVFBSRUw2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgTlVMTCwgIlJfUEFSSVNDX1RQUkVMMTRXUiJ9LAotCi0gIHtSX1BBUklTQ19UUFJFTDE0RFIsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1RQUkVMMTREUiJ9LAotICB7Ul9QQVJJU0NfVFBSRUwxNkYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1RQUkVMMTZGIn0sCi0gIHtSX1BBUklTQ19UUFJFTDE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCBOVUxMLCAiUl9QQVJJU0NfVFBSRUwxNldGIn0sCi0gIHtSX1BBUklTQ19UUFJFTDE2REYsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX1RQUkVMMTZERiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFA2NCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfTFRPRkZfVFA2NCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfVU5JTVBMRU1FTlRFRCwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNFdSLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19MVE9GRl9UUDE0V1IifSwKLSAge1JfUEFSSVNDX0xUT0ZGX1RQMTREUiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLCAiUl9QQVJJU0NfTFRPRkZfVFAxNERSIn0sCi0gIHtSX1BBUklTQ19MVE9GRl9UUDE2RiwgMCwgMCwgMCwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1BBUklTQ19MVE9GRl9UUDE2RiJ9LAotCi0gIHtSX1BBUklTQ19MVE9GRl9UUDE2V0YsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgIlJfUEFSSVNDX0xUT0ZGX1RQMTZXRiJ9LAotICB7Ul9QQVJJU0NfTFRPRkZfVFAxNkRGLCAwLCAwLCAwLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJSX1BBUklTQ19MVE9GRl9UUDE2REYifSwKLX07Ci0KLS8qIFJldHVybiBvbmUgKG9yIG1vcmUpIEJGRCByZWxvY2F0aW9ucyB3aGljaCBpbXBsZW1lbnQgdGhlIGJhc2UKLSAgIHJlbG9jYXRpb24gd2l0aCBtb2RpZmljYXRpb25zIGJhc2VkIG9uIGZvcm1hdCBhbmQgZmllbGQuICAqLwotCi1lbGZfaHBwYV9yZWxvY190eXBlICoqCi1fYmZkX2VsZl9ocHBhX2dlbl9yZWxvY190eXBlIChhYmZkLCBiYXNlX3R5cGUsIGZvcm1hdCwgZmllbGQsIGlnbm9yZSwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVsZl9ocHBhX3JlbG9jX3R5cGUgYmFzZV90eXBlOwotICAgICBpbnQgZm9ybWF0OwotICAgICBpbnQgZmllbGQ7Ci0gICAgIGludCBpZ25vcmU7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgZWxmX2hwcGFfcmVsb2NfdHlwZSAqZmluYWx0eXBlOwotICBlbGZfaHBwYV9yZWxvY190eXBlICoqZmluYWxfdHlwZXM7Ci0KLSAgLyogQWxsb2NhdGUgc2xvdHMgZm9yIHRoZSBCRkQgcmVsb2NhdGlvbi4gICovCi0gIGZpbmFsX3R5cGVzID0gKChlbGZfaHBwYV9yZWxvY190eXBlICoqKQotCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9ocHBhX3JlbG9jX3R5cGUgKikgKiAyKSk7Ci0gIGlmIChmaW5hbF90eXBlcyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgcmVsb2NhdGlvbiBpdHNlbGYuICAqLwotICBmaW5hbHR5cGUgPSAoKGVsZl9ocHBhX3JlbG9jX3R5cGUgKikKLQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGVsZl9ocHBhX3JlbG9jX3R5cGUpKSk7Ci0gIGlmIChmaW5hbHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBTb21lIHJlYXNvbmFibGUgZGVmYXVsdHMuICAqLwotICBmaW5hbF90eXBlc1swXSA9IGZpbmFsdHlwZTsKLSAgZmluYWxfdHlwZXNbMV0gPSBOVUxMOwotCi0jZGVmaW5lIGZpbmFsX3R5cGUgZmluYWx0eXBlWzBdCi0KLSAgZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQotICAvKiBKdXN0IGEgdGFuZ2xlIG9mIG5lc3RlZCBzd2l0Y2ggc3RhdGVtZW50cyB0byBkZWFsIHdpdGggdGhlIGJyYWluZGFtYWdlCi0gICAgIHRoYXQgYSBkaWZmZXJlbnQgZmllbGQgc2VsZWN0b3IgbWVhbnMgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCByZWxvY2F0aW9uCi0gICAgIGZvciBQQSBFTEYuICAqLwotICBzd2l0Y2ggKGJhc2VfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0hQUEE6Ci0gICAgY2FzZSBSX0hQUEFfQUJTX0NBTEw6Ci0gICAgICBzd2l0Y2ggKGZvcm1hdCkKLQl7Ci0JY2FzZSAxNDoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMTRSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfcnRzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RMVFJFTDE0UjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3RzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RMVFJFTDE0RjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3Jwc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QTEFCRUwxNFI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAxNzoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2ZzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjE3RjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRElSMTdSOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMjE6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9sc2VsOgotCSAgICBjYXNlIGVfbHJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RJUjIxTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX2x0c2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ETFRSRUwyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9scHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUExBQkVMMjFMOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgMzI6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19ESVIzMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBlX3BzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BMQUJFTDMyOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBSX0hQUEFfR09UT0ZGOgotICAgICAgc3dpdGNoIChmb3JtYXQpCi0JewotCWNhc2UgMTQ6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX0RQUkVMMTRSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRFBSRUwxNEY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAyMToKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX2xyc2VsOgotCSAgICBjYXNlIGVfbHNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfRFBSRUwyMUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9QQ1JFTF9DQUxMOgotICAgICAgc3dpdGNoIChmb3JtYXQpCi0JewotCWNhc2UgMTQ6Ci0JICBzd2l0Y2ggKGZpZWxkKQotCSAgICB7Ci0JICAgIGNhc2UgZV9yc2VsOgotCSAgICBjYXNlIGVfcnJzZWw6Ci0JICAgICAgZmluYWxfdHlwZSA9IFJfUEFSSVNDX1BDUkVMMTRSOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGVfZnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxNEY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAxNzoKLQkgIHN3aXRjaCAoZmllbGQpCi0JICAgIHsKLQkgICAgY2FzZSBlX3JzZWw6Ci0JICAgIGNhc2UgZV9ycnNlbDoKLQkgICAgICBmaW5hbF90eXBlID0gUl9QQVJJU0NfUENSRUwxN1I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZV9mc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDE3RjsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIDIxOgotCSAgc3dpdGNoIChmaWVsZCkKLQkgICAgewotCSAgICBjYXNlIGVfbHNlbDoKLQkgICAgY2FzZSBlX2xyc2VsOgotCSAgICAgIGZpbmFsX3R5cGUgPSBSX1BBUklTQ19QQ1JFTDIxTDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBmaW5hbF90eXBlczsKLX0KLQotLyogVHJhbnNsYXRlIGZyb20gYW4gZWxmIGludG8gZmllbGQgaW50byBhIGhvd3RvIHJlbG9jYXRpb24gcG9pbnRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfaHBwYV9pbmZvX3RvX2hvd3RvIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIEJGRF9BU1NFUlQgKEVMRl9SX1RZUEUoZWxmX3JlbG9jLT5yX2luZm8pCi0JICAgICAgPCAodW5zaWduZWQgaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKTsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZlbGZfaHBwYV9ob3d0b190YWJsZVtFTEZfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyldOwotfQotCi0vKiBUcmFuc2xhdGUgZnJvbSBhbiBlbGYgaW50byBmaWVsZCBpbnRvIGEgaG93dG8gcmVsb2NhdGlvbiBwb2ludGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZl9ocHBhX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBiZmRfcmVsb2MsIGVsZl9yZWxvYykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgQkZEX0FTU0VSVCAoRUxGX1JfVFlQRShlbGZfcmVsb2MtPnJfaW5mbykKLQkgICAgICA8ICh1bnNpZ25lZCBpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpOwotICBiZmRfcmVsb2MtPmhvd3RvID0gJmVsZl9ocHBhX2hvd3RvX3RhYmxlW0VMRl9SX1RZUEUgKGVsZl9yZWxvYy0+cl9pbmZvKV07Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgaG93dG8gdGFibGUgZW50cnkgdG8gcGVyZm9ybSB0aGUgQ09ERQotICAgcmVsb2NhdGlvbiBmb3IgYW4gQVJDSCBtYWNoaW5lLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGlmICgoaW50KSBjb2RlIDwgKGludCkgUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgoaW50KSBlbGZfaHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXS50eXBlID09IChpbnQpIGNvZGUpOwotICAgICAgcmV0dXJuICZlbGZfaHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXTsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotZWxmX2hwcGFfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyOwotewotICBpbnQgbWFjaCA9IGJmZF9nZXRfbWFjaCAoYWJmZCk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfihFRl9QQVJJU0NfQVJDSCB8IEVGX1BBUklTQ19UUkFQTklMCi0JCQkJICAgICB8IEVGX1BBUklTQ19FWFQgfCBFRl9QQVJJU0NfTFNCCi0JCQkJICAgICB8IEVGX1BBUklTQ19XSURFIHwgRUZfUEFSSVNDX05PX0tBQlAKLQkJCQkgICAgIHwgRUZfUEFSSVNDX0xBWllTV0FQKTsKLQotICBpZiAobWFjaCA9PSAxMCkKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzFfMDsKLSAgZWxzZSBpZiAobWFjaCA9PSAxMSkKLSAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzFfMTsKLSAgZWxzZSBpZiAobWFjaCA9PSAyMCkKLSAgICB7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRkFfUEFSSVNDXzJfMDsKLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1BBUklTQ19XSURFOwotI2VuZGlmCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDIwMC5jIGIvYmZkL2VsZi1tMTAyMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkMTkzZC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNSArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMjAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgdm9pZCBtbjEwMjAwX2luZm9fdG9faG93dG8KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMjAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDIwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSX01OMTAyMDBfTk9ORSA9IDAsCi0gIFJfTU4xMDIwMF8zMiwKLSAgUl9NTjEwMjAwXzE2LAotICBSX01OMTAyMDBfOCwKLSAgUl9NTjEwMjAwXzI0LAotICBSX01OMTAyMDBfUENSRUw4LAotICBSX01OMTAyMDBfUENSRUwxNiwKLSAgUl9NTjEwMjAwX1BDUkVMMjQsCi0gIFJfTU4xMDIwMF9NQVgKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9tbjEwMjAwX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBEdW1teSByZWxvY2F0aW9uLiAgRG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDIwMF9OT05FLAotCSAwLAotCSAyLAotCSAxNiwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfTk9ORSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDMyIGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8zMiIsCi0JIGZhbHNlLAotCSAweGZmZmZmZmZmLAotCSAweGZmZmZmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDE2IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMTYsCi0JIDAsCi0JIDEsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8xNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgZmFsc2UpLAotICAvKiBTdGFuZGFyZCA4IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDI0IGJpdCByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfMjQsCi0JIDAsCi0JIDIsCi0JIDI0LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF8yNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU2ltcGxlIDggcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMjAwX1BDUkVMOCwKLQkgMCwKLQkgMCwKLQkgOCwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDIwMF9QQ1JFTDgiLAotCSBmYWxzZSwKLQkgMHhmZiwKLQkgMHhmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAxNiBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwxNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwxNiIsCi0JIGZhbHNlLAotCSAweGZmZmYsCi0JIDB4ZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFNpbXBsZSAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIGEgMSBieXRlIGFkanVzdG1lbnQKLSAgICAgdG8gZ2V0IHRoZSBwYy1yZWxhdGl2ZSBvZmZzZXQgY29ycmVjdC4gICovCi0gIEhPV1RPIChSX01OMTAyMDBfUENSRUwyNCwKLQkgMCwKLQkgMiwKLQkgMjQsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAyMDBfUENSRUwyNCIsCi0JIGZhbHNlLAotCSAweGZmZmZmZiwKLQkgMHhmZmZmZmYsCi0JIHRydWUpLAotfTsKLQotc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG1uMTAyMDBfcmVsb2NfbWFwIG1uMTAyMDBfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX01OMTAyMDBfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfTU4xMDIwMF8zMiwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTU4xMDIwMF8xNiwgfSwKLSAgeyBCRkRfUkVMT0NfOCwgUl9NTjEwMjAwXzgsIH0sCi0gIHsgQkZEX1JFTE9DXzI0LCBSX01OMTAyMDBfMjQsIH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDgsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAyMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfMjRfUENSRUwsIFJfTU4xMDIwMF9QQ1JFTDI0LCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChtbjEwMjAwX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtbjEwMjAwX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChtbjEwMjAwX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfbW4xMDIwMF9ob3d0b190YWJsZVttbjEwMjAwX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTU4xMDIwMCBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbW4xMDIwMF9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NTjEwMjAwX01BWCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21uMTAyMDBfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotLyogUGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICAqLwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbW4xMDIwMF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgaXNfbG9jYWwpCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgaW50IGlzX2xvY2FsOwotewotICB1bnNpZ25lZCBsb25nIHJfdHlwZSA9IGhvd3RvLT50eXBlOwotICBiZmRfYnl0ZSAqaGl0X2RhdGEgPSBjb250ZW50cyArIG9mZnNldDsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzMyOgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMjAwXzE2OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDIwMF84OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmIHx8IChsb25nKXZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfMjQ6Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4N2ZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIHZhbHVlICY9IDB4ZmZmZmZmOwotICAgICAgdmFsdWUgfD0gKGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmZjAwMDAwMCk7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUw4OgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IChvZmZzZXQgKyAxKTsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHhmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUwxNjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMik7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwKQotICAgICAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAyMDBfUENSRUwyNDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSAob2Zmc2V0ICsgMyk7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4MTAwMDAwMCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgdmFsdWUgJj0gMHhmZmZmZmY7Ci0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmMDAwMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotfQotCi0MCi0vKiBSZWxvY2F0ZSBhbiBNTjEwMjAwIEVMRiBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaG93dG8gPSBlbGZfbW4xMDIwMF9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgciA9IG1uMTAyMDBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kLAotCQkJCQkgICBpbmZvLCBzZWMsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCSAgY29uc3QgY2hhciAqbXNnID0gKGNvbnN0IGNoYXIgKikwOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZWxheGluZyBmb3IgdGhlIG1uMTAyMDAuCi0KLSAgIFRoZXJlJ3MgcXVpdGUgYSBmZXcgcmVsYXhpbmcgb3Bwb3J0dW5pdGVzIGF2YWlsYWJsZSBvbiB0aGUgbW4xMDIwMDoKLQotCSoganNyOjI0IC0+IGpzcjoxNiAJCQkJCSAgIDIgYnl0ZXMKLQotCSogam1wOjI0IC0+IGptcDoxNgkJCQkJICAgMiBieXRlcwotCSogam1wOjE2IC0+IGJyYTo4CQkJCQkgICAxIGJ5dGUKLQotCQkqIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaAotCQlhcm91bmQgdGhlIGp1bXAvYnJhLCB3ZSBtYXkgYmUgYWJsZSB0byByZXZlcnNlIGl0cyBjb25kaXRpb24KLQkJYW5kIGNoYW5nZSBpdHMgdGFyZ2V0IHRvIHRoZSBqdW1wJ3MgdGFyZ2V0LiAgVGhlIGp1bXAvYnJhCi0JCWNhbiB0aGVuIGJlIGRlbGV0ZWQuCQkJCSAgIDIgYnl0ZXMKLQotCSogbW92IGFiczI0IC0+IG1vdiBhYnMxNgkyIGJ5dGUgc2F2aW5ncwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMjQgY2FuIHJlbGF4IHRvIGltbTE2ICAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMTYgY2FuIHJlbGF4IHRvIGltbTggICAxIGJ5dGUKLQotCSogTW9zdCBpbnN0cnVjdGlvbnMgd2hpY2ggYWNjZXB0IGQyNCBjYW4gcmVsYXggdG8gZDE2CSAgIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBkMTYgY2FuIHJlbGF4IHRvIGQ4CSAgIDEgYnl0ZQotCi0JYWJzMjQsIGltbTI0LCBkMjQgYWxsIGxvb2sgdGhlIHNhbWUgYXQgdGhlIHJlbG9jIGxldmVsLiAgSXQKLQltaWdodCBtYWtlIHRoZSBjb2RlIHNpbXBsZXIgaWYgd2UgaGFkIGRpZmZlcmVudCByZWxvY3MgZm9yCi0JdGhlIHZhcmlvdXMgcmVsYXhhYmxlIG9wZXJhbmQgdHlwZXMuCi0gICAKLQlXZSBkb24ndCBoYW5kbGUgaW1tMTYtPmltbTggb3IgZDE2LT5kOCBhcyB0aGV5J3JlIHZlcnkgcmFyZQotCWFuZCBzb21ld2hhdCBtb3JlIGRpZmZpY3VsdCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi1tbjEwMjAwX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIEFzc3VtZSBub3RoaW5nIGNoYW5nZXMuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzZWN0aW9uLAotICAgICBpbml0aWFsaXplIHRoZSBjb29rZWQgc2l6ZS4gICovCi0gIGlmIChzZWMtPl9jb29rZWRfc2l6ZSA9PSAwKQotICAgIHNlYy0+X2Nvb2tlZF9zaXplID0gc2VjLT5fcmF3X3NpemU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotCi0gIC8qIEdldCBhIGNvcHkgb2YgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAoYWJmZCwgc2VjLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogV2FsayB0aHJvdWdoIHRoZW0gbG9va2luZyBmb3IgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBzeW12YWw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlbGF4ZWQsIHRoZW4gaWdub3JlCi0JIHRoaXMgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfTk9ORQotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF84Ci0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX01BWCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDI0Yml0IHBjLXJlbGF0aXZlIGJyYW5jaC9jYWxsIGludG8gYSAxNmJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2gvY2FsbC4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDI0KQotCXsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gKGlyZWwtPnJfb2Zmc2V0ICsgMyk7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmZmYgKyAyIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSB0d28gYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwMDEgJiYgKGxvbmcpdmFsdWUgPiAtMHg4MDAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZTAgJiYgY29kZSAhPSAweGUxKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhlMCkKLQkJYmZkX3B1dF84IChhYmZkLCAweGZjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGUxKQotCQliZmRfcHV0XzggKGFiZmQsIDB4ZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDIwMF9QQ1JFTDE2KTsKLQotCSAgICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUgb2Zmc2V0LiAgKi8KLQkgICAgICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JICAgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgOGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2guICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAyMDBfUENSRUwxNikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBEZWFsIHdpdGggcGMtcmVsYXRpdmUgZ3Vuay4gICovCi0JICB2YWx1ZSAtPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIHZhbHVlIC09IChpcmVsLT5yX29mZnNldCArIDIpOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQgaW4gOCBiaXRzLCBub3RlIHRoZSBoaWdoIHZhbHVlIGlzCi0JICAgICAweDdmICsgMSBhcyB0aGUgdGFyZ2V0IHdpbGwgYmUgb25lIGJ5dGVzIGNsb3NlciBpZiB3ZSBhcmUKLQkgICAgIGFibGUgdG8gcmVsYXguICAqLwotCSAgaWYgKChsb25nKXZhbHVlIDwgMHg4MCAmJiAobG9uZyl2YWx1ZSA+IC0weDgwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIGlmIChjb2RlICE9IDB4ZmMpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZWEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfTU4xMDIwMF9QQ1JFTDgpOwotCi0JICAgICAgLyogRGVsZXRlIG9uZSBieXRlIG9mIGRhdGEuICAqLwotCSAgICAgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICBpcmVsLT5yX29mZnNldCArIDEsIDEpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRyeSB0byBlbGltaW5hdGUgYW4gdW5jb25kaXRpb25hbCA4IGJpdCBwYy1yZWxhdGl2ZSBicmFuY2gKLQkgd2hpY2ggaW1tZWRpYXRlbHkgZm9sbG93cyBhIGNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlCi0JIGJyYW5jaCBhcm91bmQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLgotCi0JICAgIG9yaWdpbmFsOgkJbmV3OgotCSAgICBiQ0MgbGFiMQkJYkNDJyBsYWIyCi0JICAgIGJyYSBsYWIyCi0JICAgbGFiMToJICAgICAgIGxhYjE6Ci0KLQotCSBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgYkNDIGNhbid0IHJlYWNoIGxhYjIgYXQgYXNzZW1ibHkgdGltZSwKLQkgYnV0IGR1ZSB0byBvdGhlciByZWxheGF0aW9ucyBpdCBjYW4gcmVhY2ggYXQgbGluayB0aW1lLiAgKi8KLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMjAwX1BDUkVMOCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgdmFsdWUgPSBzeW12YWw7Ci0JICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gKGlyZWwtPnJfb2Zmc2V0ICsgMSk7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogRG8gbm90aGluZyBpZiB0aGlzIHJlbG9jIGlzIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKGlyZWwtPnJfb2Zmc2V0ID09IHNlYy0+X2Nvb2tlZF9zaXplKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogU2VlIGlmIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGFuIHVuY29uZGl0aW9uYWwgcGMtcmVsYXRpdmUKLQkgICAgIGJyYW5jaCwgbW9yZSBvZnRlbiB0aGFuIG5vdCB0aGlzIHRlc3Qgd2lsbCBmYWlsLCBzbyB3ZQotCSAgICAgdGVzdCBpdCBmaXJzdCB0byBzcGVlZCB0aGluZ3MgdXAuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhlYSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEFsc28gbWFrZSBzdXJlIHRoZSBuZXh0IHJlbG9jYXRpb24gYXBwbGllcyB0byB0aGUgbmV4dAotCSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoYXQgaXQncyBhIHBjLXJlbGF0aXZlIDggYml0IGJyYW5jaC4gICovCi0JICBucmVsID0gaXJlbCArIDE7Ci0JICBpZiAobnJlbCA9PSBpcmVsZW5kCi0JICAgICAgfHwgaXJlbC0+cl9vZmZzZXQgKyAyICE9IG5yZWwtPnJfb2Zmc2V0Ci0JICAgICAgfHwgRUxGMzJfUl9UWVBFIChucmVsLT5yX2luZm8pICE9IChpbnQpIFJfTU4xMDIwMF9QQ1JFTDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgb3VyIGRlc3RpbmF0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlCi0JICAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0JICBpZiAoc3ltdmFsICE9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIGlyZWwtPnJfb2Zmc2V0ICsgMykpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3cgbWFrZSBzdXJlIHdlIGFyZSBhIGNvbmRpdGlvbmFsIGJyYW5jaC4gIFRoaXMgbWF5IG5vdAotCSAgICAgYmUgbmVjZXNzYXJ5LCBidXQgd2h5IHRha2UgdGhlIGNoYW5jZS4gCi0KLQkgICAgIE5vdGUgdGhlc2UgY2hlY2tzIGFzc3VtZSB0aGF0IFJfTU4xMDIwMF9QQ1JFTDggcmVsb2NzCi0JICAgICBvbmx5IG9jY3VyIG9uIGJDQyBhbmQgYkNDeCBpbnNucy4gIElmIHRoZXkgb2NjdXJlZAotCSAgICAgZWxzZXdoZXJlLCB3ZSdkIG5lZWQgdG8ga25vdyB0aGUgc3RhcnQgb2YgdGhpcyBpbnNuCi0JICAgICBmb3IgdGhpcyBjaGVjayB0byBiZSBhY2N1cmF0ZS4gICovCi0JICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICBpZiAoY29kZSAhPSAweGUwICYmIGNvZGUgIT0gMHhlMSAmJiBjb2RlICE9IDB4ZTIKLQkgICAgICAmJiBjb2RlICE9IDB4ZTMgJiYgY29kZSAhPSAweGU0ICYmIGNvZGUgIT0gMHhlNQotCSAgICAgICYmIGNvZGUgIT0gMHhlNiAmJiBjb2RlICE9IDB4ZTcgJiYgY29kZSAhPSAweGU4Ci0JICAgICAgJiYgY29kZSAhPSAweGU5ICYmIGNvZGUgIT0gMHhlYyAmJiBjb2RlICE9IDB4ZWQKLQkgICAgICAmJiBjb2RlICE9IDB4ZWUgJiYgY29kZSAhPSAweGVmICYmIGNvZGUgIT0gMHhmYwotCSAgICAgICYmIGNvZGUgIT0gMHhmZCAmJiBjb2RlICE9IDB4ZmUgJiYgY29kZSAhPSAweGZmKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgYWxzbyBoYXZlIHRvIGJlIHN1cmUgdGhlcmUgaXMgbm8gc3ltYm9sL2xhYmVsCi0JICAgICBhdCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotCSAgaWYgKG1uMTAyMDBfZWxmX3N5bWJvbF9hZGRyZXNzX3AgKGFiZmQsIHNlYywgZXh0c3ltcywKLQkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0JICBzd2l0Y2ggKGNvZGUpCi0JICAgIHsKLQkgICAgICBjYXNlIDB4ZmM6Ci0JCWNvZGUgPSAweGZkOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmQ6Ci0JCWNvZGUgPSAweGZjOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmU6Ci0JCWNvZGUgPSAweGZmOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZmY6Ci0JCWNvZGUgPSAweGZlOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTg6Ci0JCWNvZGUgPSAweGU5OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTk6Ci0JCWNvZGUgPSAweGU4OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTA6Ci0JCWNvZGUgPSAweGUyOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTI6Ci0JCWNvZGUgPSAweGUwOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTM6Ci0JCWNvZGUgPSAweGUxOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTE6Ci0JCWNvZGUgPSAweGUzOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTQ6Ci0JCWNvZGUgPSAweGU2OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTY6Ci0JCWNvZGUgPSAweGU0OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTc6Ci0JCWNvZGUgPSAweGU1OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZTU6Ci0JCWNvZGUgPSAweGU3OwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWM6Ci0JCWNvZGUgPSAweGVkOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWQ6Ci0JCWNvZGUgPSAweGVjOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWU6Ci0JCWNvZGUgPSAweGVmOwotCQlicmVhazsKLQkgICAgICBjYXNlIDB4ZWY6Ci0JCWNvZGUgPSAweGVlOwotCQlicmVhazsKLQkgICAgfQotCSAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAKLQkgIC8qIFNldCB0aGUgcmVsb2MgdHlwZSBhbmQgc3ltYm9sIGZvciB0aGUgZmlyc3QgYnJhbmNoCi0JICAgICBmcm9tIHRoZSBzZWNvbmQgYnJhbmNoLiAgKi8KLQkgIGlyZWwtPnJfaW5mbyA9IG5yZWwtPnJfaW5mbzsKLQotCSAgLyogTWFrZSB0aGUgcmVsb2MgZm9yIHRoZSBzZWNvbmQgYnJhbmNoIGEgbnVsbCByZWxvYy4gICovCi0JICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCSAgICAgICBSX01OMTAyMDBfTk9ORSk7Ci0KLQkgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgKmFnYWluID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMjRiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDIwMF8yNCkKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMuIAotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBBbGwgaW5zbnMgd2hpY2ggaGF2ZSAyNGJpdCBvcGVyYW5kcyBhcmUgNSBieXRlcyBsb25nLAotCQkgdGhlIGZpcnN0IGJ5dGUgd2lsbCBhbHdheXMgYmUgMHhmNCwgYnV0IHdlIGRvdWJsZSBjaGVjawotCQkgaXQganVzdCBpbiBjYXNlLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGY0KQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgc3dpdGNoIChjb2RlICYgMHhmYykKLQkJewotCQkvKiBtb3YgaW1tMjQsZG4gLT4gbW92IGltbTE2LGRuICovCi0JCWNhc2UgMHg3MDoKLQkJICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICBpbiBhIHNpZ25lZCAxNmJpdCB2YWx1ZS4gICovCi0JCSAgaWYgKHZhbHVlICYgMHg4MDAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZjggKyAoY29kZSAmIDB4MDMpLAotCQkJICAgICBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgICAgUl9NTjEwMjAwXzE2KTsKLQotCQkgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKLQkJICAgICBvZmZzZXQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJLyogbW92IGltbTI0LGFuIC0+IG1vdiBpbW0xNixhbiAKLQkJICAgY21wIGltbTI0LGFuIC0+IGNtcCBpbW0xNixhbgotCQkgICBtb3YgKGFiczI0KSxkbiAtPiBtb3YgKGFiczE2KSxkbgotCQkgICBtb3YgZG4sKGFiczI0KSAtPiBtb3YgZG4sKGFiczE2KQotCQkgICBtb3ZiIGRuLChhYnMyNCkgLT4gbW92YiBkbiwoYWJzMTYpCi0JCSAgIG1vdmJ1IChhYnMyNCksZG4gLT4gbW92YnUgKGFiczE2KSxkbiAqLwotCQljYXNlIDB4NzQ6Ci0JCWNhc2UgMHg3YzoKLQkJY2FzZSAweGMwOgotCQljYXNlIDB4NDA6Ci0JCWNhc2UgMHg0NDoKLQkJY2FzZSAweGM4OgotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxkZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgaWYgKChjb2RlICYgMHhmYykgPT0gMHg3NCkKLQkJICAgIGNvZGUgPSAweGRjICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4N2MpCi0JCSAgICBjb2RlID0gMHhlYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGMwKQotCQkgICAgY29kZSA9IDB4YzggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg0MCkKLQkJICAgIGNvZGUgPSAweGMwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NDQpCi0JCSAgICBjb2RlID0gMHhjNCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGM4KQotCQkgICAgY29kZSA9IDB4Y2MgKyAoY29kZSAmIDB4MDMpOwotCi0JCSAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgb3Bjb2RlIGdvdCBzaG9ydGVyIHRvbywgc28gd2UgaGF2ZSB0byBmaXggdGhlCi0JCSAgICAgb2Zmc2V0LiAgKi8KLQkJICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIGNtcCBpbW0yNCxkbiAtPiBjbXAgaW1tMTYsZG4KLQkJICAgbW92IChhYnMyNCksYW4gLT4gbW92IChhYnMxNiksYW4KLQkJICAgbW92IGFuLChhYnMyNCkgLT4gbW92IGFuLChhYnMxNikKLQkJICAgYWRkIGltbTI0LGRuIC0+IGFkZCBpbW0xNixkbgotCQkgICBhZGQgaW1tMjQsYW4gLT4gYWRkIGltbTE2LGFuCi0JCSAgIHN1YiBpbW0yNCxkbiAtPiBzdWIgaW1tMTYsZG4KLQkJICAgc3ViIGltbTI0LGFuIC0+IHN1YiBpbW0xNixhbiAKLQkJICAgQW5kIGFsbCBkMjQtPmQxNiBpbiBtZW1vcnkgb3BzLiAgKi8KLQkJY2FzZSAweDc4OgotCQljYXNlIDB4ZDA6Ci0JCWNhc2UgMHg1MDoKLQkJY2FzZSAweDYwOgotCQljYXNlIDB4NjQ6Ci0JCWNhc2UgMHg2ODoKLQkJY2FzZSAweDZjOgotCQljYXNlIDB4ODA6Ci0JCWNhc2UgMHhmMDoKLQkJY2FzZSAweDAwOgotCQljYXNlIDB4MTA6Ci0JCWNhc2UgMHhiMDoKLQkJY2FzZSAweDMwOgotCQljYXNlIDB4YTA6Ci0JCWNhc2UgMHgyMDoKLQkJY2FzZSAweDkwOgotCQkgIC8qIE5vdCBzYWZlIGlmIHRoZSBoaWdoIGJpdCBpcyBvbiBhcyByZWxheGluZyBtYXkKLQkJICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KLQkJICBpZiAoKChjb2RlICYgMHhmYykgPT0gMHg3OAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDYwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4NjQKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHg2OAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDZjCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4ODAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHhmMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDAwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4MTAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHhiMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDMwCi0JCQl8fCAoY29kZSAmIDB4ZmMpID09IDB4YTAKLQkJCXx8IChjb2RlICYgMHhmYykgPT0gMHgyMAotCQkJfHwgKGNvZGUgJiAweGZjKSA9PSAweDkwKQotCQkgICAgICAgJiYgKHZhbHVlICYgMHg4MDAwKSAhPSAwKQotCQkgICAgY29udGludWU7Ci0KLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsZGVjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICBiZmRfcHV0XzggKGFiZmQsIDB4ZjcsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NzgpCi0JCSAgICBjb2RlID0gMHg0OCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGQwKQotCQkgICAgY29kZSA9IDB4MzAgKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg1MCkKLQkJICAgIGNvZGUgPSAweDIwICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NjApCi0JCSAgICBjb2RlID0gMHgxOCArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDY0KQotCQkgICAgY29kZSA9IDB4MDggKyAoY29kZSAmIDB4MDMpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHg2OCkKLQkJICAgIGNvZGUgPSAweDFjICsgKGNvZGUgJiAweDAzKTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4NmMpCi0JCSAgICBjb2RlID0gMHgwYyArIChjb2RlICYgMHgwMyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDgwKQotCQkgICAgY29kZSA9IDB4YzAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhmMCkKLQkJICAgIGNvZGUgPSAweGIwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MDApCi0JCSAgICBjb2RlID0gMHg4MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweDEwKQotCQkgICAgY29kZSA9IDB4YTAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhiMCkKLQkJICAgIGNvZGUgPSAweDcwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4MzApCi0JCSAgICBjb2RlID0gMHg2MCArIChjb2RlICYgMHgwNyk7Ci0JCSAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGEwKQotCQkgICAgY29kZSA9IDB4ZDAgKyAoY29kZSAmIDB4MDcpOwotCQkgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHgyMCkKLQkJICAgIGNvZGUgPSAweDkwICsgKGNvZGUgJiAweDA3KTsKLQkJICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4OTApCi0JCSAgICBjb2RlID0gMHg1MCArIChjb2RlICYgMHgwNyk7Ci0KLQkJICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgICAgICBSX01OMTAyMDBfMTYpOwotCi0JCSAgLyogRGVsZXRlIG9uZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCS8qIG1vdmIgKGFiczI0KSxkbiAtPm1vdmJ1IChhYnMxNiksZG4gZXh0eGIgYm4gKi8KLQkJY2FzZSAweGM0OgotCQkgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxkZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGNjICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGI4ICsgKGNvZGUgJiAweDAzKSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgICAgIFJfTU4xMDIwMF8xNik7Ci0KLQkJICAvKiBUaGUgcmVsb2Mgd2lsbCBiZSBhcHBsaWVkIG9uZSBieXRlIGluIGZyb250IG9mIGl0cwotCQkgICAgIGN1cnJlbnQgbG9jYXRpb24uICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAvKiBEZWxldGUgb25lIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDIwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAyLCAxKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERlbGV0ZSBzb21lIGJ5dGVzIGZyb20gYSBzZWN0aW9uIHdoaWxlIHJlbGF4aW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAyMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBhZGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltczsKLSAgaW50IHNobmR4LCBpbmRleDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWxpZ247Ci0gIGJmZF92bWEgdG9hZGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogQWN0dWFsbHkgZGVsZXRlIHRoZSBieXRlcy4gICovCi0gIG1lbW1vdmUgKGNvbnRlbnRzICsgYWRkciwgY29udGVudHMgKyBhZGRyICsgY291bnQsIHRvYWRkciAtIGFkZHIgLSBjb3VudCk7Ci0gIHNlYy0+X2Nvb2tlZF9zaXplIC09IGNvdW50OwotCi0gIC8qIEFkanVzdCBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAoaXJlbCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIG5ldyByZWxvYyBhZGRyZXNzLiAgKi8KLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpKQotCWlyZWwtPnJfb2Zmc2V0IC09IGNvdW50OwotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIGxvY2FsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA+IGFkZHIKLQkgICYmIGlzeW0uc3RfdmFsdWUgPCB0b2FkZHIpCi0JewotCSAgaXN5bS5zdF92YWx1ZSAtPSBjb3VudDsKLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZpc3ltLCBlc3ltKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhZGp1c3QgdGhlIGdsb2JhbCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXMgKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBlc3ltZW5kID0gZXh0c3ltcyArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLSAgZm9yIChpbmRleCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGluZGV4KyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLSAgICAgIHN5bV9oYXNoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZGV4XTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IChzeW1faGFzaCktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID4gYWRkcgotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC51LmRlZi52YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGEgc3ltYm9sIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgZWxzZSByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMjAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBpbnQgc2huZHg7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2gsICoqc3ltX2hhc2hfZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYyk7Ci0KLSAgLyogRXhhbWluZSBhbGwgdGhlIHN5bWJvbHMuICAqLwotICBlc3ltID0gZXh0c3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotCi0gICAgICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCSAgJiYgaXN5bS5zdF92YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICBzeW1faGFzaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hfZW5kID0gKHN5bV9oYXNoCi0JCSAgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKQotCQkgICAgIC0gc3ltdGFiX2hkci0+c2hfaW5mbykpOwotICBmb3IgKDsgc3ltX2hhc2ggPCBzeW1faGFzaF9lbmQ7IHN5bV9oYXNoKyspCi0gICAgewotICAgICAgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlID09IGFkZHIpCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBtbjEwMjAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBsaW5rX29yZGVyLAotCQkJCQkgICAgZGF0YSwgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBiZmQgKmlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKmludGVybmFsX3N5bXMgPSBOVUxMOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgdGhlIGNhc2Ugb2YgcmVsYXhpbmcsIG9yIG9mIGhhdmluZyBhCi0gICAgIHBhcnRpY3VsYXIgc2V0IG9mIHNlY3Rpb24gY29udGVudHMsIHNwZWNpYWxseS4gICovCi0gIGlmIChyZWxvY2F0ZWFibGUKLSAgICAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywKLQkJCQkJCSAgICAgICBsaW5rX29yZGVyLCBkYXRhLAotCQkJCQkJICAgICAgIHJlbG9jYXRlYWJsZSwKLQkJCQkJCSAgICAgICBzeW1ib2xzKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBtZW1jcHkgKGRhdGEsIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT50aGlzX2hkci5jb250ZW50cywKLQkgIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKmlzeW1wOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0KLSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCWV4dGVybmFsX3N5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGV4dGVybmFsX3N5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICAgICAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpOwotCSAgaWYgKGV4dGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoZXh0ZXJuYWxfc3ltcywgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIHN5bXRhYl9oZHItPnNoX2luZm8sIGlucHV0X2JmZCkKLQkJICAhPSAoc3ltdGFiX2hkci0+c2hfaW5mbyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwgZmFsc2UpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaW50ZXJuYWxfc3ltcyA9ICgoRWxmX0ludGVybmFsX1N5bSAqKQotCQkgICAgICAgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCSAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSkpOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkJICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpc3ltcCA9IGludGVybmFsX3N5bXM7Ci0gICAgICBzZWNwcCA9IHNlY3Rpb25zOwotICAgICAgZXN5bSA9IGV4dGVybmFsX3N5bXM7Ci0gICAgICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7ICsrZXN5bSwgKytpc3ltcCwgKytzZWNwcCkKLQl7Ci0JICBhc2VjdGlvbiAqaXNlYzsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsIGVzeW0sIGlzeW1wKTsKLQotCSAgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JICAgIGlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID4gMCAmJiBpc3ltcC0+c3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bXAtPnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCSAgICBpc2VjID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCSAgICBpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdobyBrbm93cz8gICovCi0JICAgICAgaXNlYyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnNlY3BwID0gaXNlYzsKLQl9Ci0KLSAgICAgIGlmICghIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgaW5wdXRfYmZkLAotCQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgZGF0YSwgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX21uMTAyMDBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbW4xMDIwMCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21uMTAyMDAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfTU4xMDIwMAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1uMTAyMDBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJMAotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIG1uMTAyMDBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCW1uMTAyMDBfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCW1uMTAyMDBfZWxmX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyICdfJwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmLW0xMDMwMC5jIGIvYmZkL2VsZi1tMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhMDlhOC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmLW0xMDMwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgyMSArMCwwIEBACi0vKiBNYXRzdXNoaXRhIDEwMzAwIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tbjEwMzAwLmgiCi0KLXN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeQotewotICAvKiBUaGUgYmFzaWMgZWxmIGxpbmsgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcwotICAgICBjYWxsZWQgZGlyZWN0bHkgKGllIGJ5IG5hbWUpLiAgKi8KLSAgdW5zaWduZWQgaW50IGRpcmVjdF9jYWxsczsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgdGhlIHNpemUgb2YgdGhpcyBmdW5jdGlvbidzIHN0YWNrCi0gICAgIChpZiA8PSAyNTUgYnl0ZXMpLiAgV2Ugc3R1ZmYgdGhpcyBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMKLSAgICAgdG8gdGhpcyB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLgotCi0gICAgIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBzdGFjayBhbGxvY2F0ZWQgYnkgbW92bSEgICovCi0gIHVuc2lnbmVkIGNoYXIgc3RhY2tfc2l6ZTsKLQotICAvKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgYXJndW1lbnRzIChpZiBhbnkpIGZvciBtb3ZtIGluc3RydWN0aW9uCi0gICAgIGluIHRoZSBwcm9sb2d1ZS4gIFdlIHN0dWZmIHRoaXMgdmFsdWUgaW50byAiY2FsbCIgaW5zdHJ1Y3Rpb25zCi0gICAgIHRvIHRoZSB0YXJnZXQgd2hlbiBpdCdzIHZhbGlkIGFuZCBwcm9maXRhYmxlIHRvIGRvIHNvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX2FyZ3M7Ci0KLSAgLyogRm9yIGZ1bnRpb24gc3ltYm9scywgdGhlIGFtb3VudCBvZiBzdGFjayBzcGFjZSB0aGF0IHdvdWxkIGJlIGFsbG9jYXRlZAotICAgICBieSB0aGUgbW92bSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgcmVkdW5kYW50IHdpdGggbW92bV9hcmdzLCBidXQgd2UKLSAgICAgYWRkIGl0IHRvIHRoZSBoYXNoIHRhYmxlIHRvIGF2b2lkIGNvbXB1dGluZyBpdCBvdmVyIGFuZCBvdmVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBtb3ZtX3N0YWNrX3NpemU7Ci0KLS8qIFdoZW4gc2V0LCBjb252ZXJ0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHRvIHRoaXMgdGFyZ2V0IGludG8gImNhbGxzIgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMgMHgxCi0KLS8qIFVzZWQgdG8gbWFyayBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBoYWQgcmVkdW5kYW50IHBhcnRzIG9mIHRoZWlyCi0gICBwcm9sb2d1ZSBkZWxldGVkLiAgKi8KLSNkZWZpbmUgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTIDB4MgotICB1bnNpZ25lZCBjaGFyIGZsYWdzOwotfTsKLQotLyogV2UgZGVyaXZlIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBtYWluIGVsZiBsaW5rZXIgaGFzaCB0YWJsZSBzbwotICAgd2UgY2FuIHN0b3JlIHN0YXRlIHZhcmlhYmxlcyBhbmQgYSBzZWNvbmRhcnkgaGFzaCB0YWJsZSB3aXRob3V0Ci0gICByZXNvcnRpbmcgdG8gZ2xvYmFsIHZhcmlhYmxlcy4gICovCi1zdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogQSBoYXNoIHRhYmxlIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgV2UgY291bGQgZGVyaXZlIGEgbmV3IGhhc2ggdGFibGUKLSAgICAgaW5zdGVhZCBvZiB1c2luZyB0aGUgZnVsbCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSBpZiB3ZSB3YW50ZWQKLSAgICAgdG8gc2F2ZSBzb21lIG1lbW9yeS4gICovCi0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqc3RhdGljX2hhc2hfdGFibGU7Ci0KLSAgLyogUmFuZG9tIGxpbmtlciBzdGF0ZSBmbGFncy4gICovCi0jZGVmaW5lIE1OMTAzMDBfSEFTSF9FTlRSSUVTX0lOSVRJQUxJWkVEIDB4MQotICBjaGFyIGZsYWdzOwotfTsKLQotLyogRm9yIE1OMTAzMDAgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0vKiBHZXQgdGhlIE1OMTAzMDAgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUocCkgXAotICAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotI2RlZmluZSBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG1uMTAzMDBfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIG1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKm1uMTAzMDBfZWxmX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gbW4xMDMwMF9lbGZfc3ltYm9sX2FkZHJlc3NfcAotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgRWxmMzJfRXh0ZXJuYWxfU3ltICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgY29tcHV0ZV9mdW5jdGlvbl9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBiZmRfdm1hLCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogV2UgaGF2ZSB0byB1c2UgUkVMQSBpbnN0cnVjdGlvbnMgc2luY2UgbWRfYXBwbHlfZml4MyBpbiB0aGUgYXNzZW1ibGVyCi0gICBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gICovCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21uMTAzMDBfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIER1bW15IHJlbG9jYXRpb24uICBEb2VzIG5vdGhpbmcuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX05PTkUsCi0JIDAsCi0JIDIsCi0JIDE2LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9OT05FIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8zMiwKLQkgMCwKLQkgMiwKLQkgMzIsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzMyIiwKLQkgZmFsc2UsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMTYgYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF8xNiwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwXzE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSBmYWxzZSksCi0gIC8qIFN0YW5kYXJkIDggYml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF84LAotCSAwLAotCSAwLAotCSA4LAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF84IiwKLQkgZmFsc2UsCi0JIDB4ZmYsCi0JIDB4ZmYsCi0JIGZhbHNlKSwKLSAgLyogU3RhbmRhcmQgMzJiaXQgcGMtcmVsYXRpdmUgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwX1BDUkVMMzIsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMMzIiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmZmZiwKLQkgMHhmZmZmZmZmZiwKLQkgdHJ1ZSksCi0gIC8qIFN0YW5kYXJkIDE2Yml0IHBjLXJlbGF0aXZlIHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfTU4xMDMwMF9QQ1JFTDE2LAotCSAwLAotCSAxLAotCSAxNiwKLQkgdHJ1ZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIlJfTU4xMDMwMF9QQ1JFTDE2IiwKLQkgZmFsc2UsCi0JIDB4ZmZmZiwKLQkgMHhmZmZmLAotCSB0cnVlKSwKLSAgLyogU3RhbmRhcmQgOCBwYy1yZWxhdGl2ZSByZWxvYy4gICovCi0gIEhPV1RPIChSX01OMTAzMDBfUENSRUw4LAotCSAwLAotCSAwLAotCSA4LAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAotCSAiUl9NTjEwMzAwX1BDUkVMOCIsCi0JIGZhbHNlLAotCSAweGZmLAotCSAweGZmLAotCSB0cnVlKSwKLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX01OMTAzMDBfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTU4xMDMwMF9HTlVfVlRFTlRSWSIsIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdGFuZGFyZCAyNCBiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9NTjEwMzAwXzI0LAotCSAwLAotCSAyLAotCSAyNCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSX01OMTAzMDBfMjQiLAotCSBmYWxzZSwKLQkgMHhmZmZmZmYsCi0JIDB4ZmZmZmZmLAotCSBmYWxzZSksCi0KLX07Ci0KLXN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtbjEwMzAwX3JlbG9jX21hcCBtbjEwMzAwX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NTjEwMzAwX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01OMTAzMDBfMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSX01OMTAzMDBfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfTU4xMDMwMF84LCB9LAotICB7IEJGRF9SRUxPQ18zMl9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMMzIsIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSX01OMTAzMDBfUENSRUwxNiwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9NTjEwMzAwX1BDUkVMOCwgfSwKLSAgeyBCRkRfUkVMT0NfMjQsIFJfTU4xMDMwMF8yNCwgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSwgUl9NTjEwMzAwX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKG1uMTAzMDBfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IG1uMTAzMDBfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKG1uMTAzMDBfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJmVsZl9tbjEwMzAwX2hvd3RvX3RhYmxlW21uMTAzMDBfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBNTjEwMzAwIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMzAwX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX01OMTAzMDBfTUFYKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbW4xMDMwMF9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplL3NpemVvZihFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCWggPSBOVUxMOwotICAgICAgZWxzZQotCWggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCS8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX01OMTAzMDBfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCS8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbW4xMDMwMF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTU4xMDMwMF9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NTjEwMzAwX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICBpbnQgaXNfbG9jYWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfTU4xMDMwMF9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzMyOgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwXzI0OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotCi0gICAgICBpZiAoKGxvbmcpdmFsdWUgPiAweDdmZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwMDAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgdmFsdWUgJiAweGZmLCBoaXRfZGF0YSk7Ci0gICAgICBiZmRfcHV0XzggKGlucHV0X2JmZCwgKHZhbHVlID4+IDgpICYgMHhmZiwgaGl0X2RhdGEgKyAxKTsKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCAodmFsdWUgPj4gMTYpICYgMHhmZiwgaGl0X2RhdGEgKyAyKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF8xNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZmZmIHx8IChsb25nKXZhbHVlIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfODoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKXZhbHVlID4gMHg3ZiB8fCAobG9uZyl2YWx1ZSA8IC0weDgwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX1BDUkVMODoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmYgfHwgKGxvbmcpdmFsdWUgPCAtMHgxMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX01OMTAzMDBfUENSRUwxNjoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIGlmICgobG9uZyl2YWx1ZSA+IDB4ZmZmZiB8fCAobG9uZyl2YWx1ZSA8IC0weDEwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfTU4xMDMwMF9QQ1JFTDMyOgotICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHZhbHVlIC09IG9mZnNldDsKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQ6Ci0gICAgY2FzZSBSX01OMTAzMDBfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLX0KLQotDAotLyogUmVsb2NhdGUgYW4gTU4xMDMwMCBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKiopCi0JCSAoZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaG93dG8gPSBlbGZfbW4xMDMwMF9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgLyogSnVzdCBza2lwIHRoZSB2dGFibGUgZ2MgcmVsb2NzLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSX01OMTAzMDBfR05VX1ZURU5UUlkpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnJvb3QudS5pLmxpbms7Ci0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHIgPSBtbjEwMzAwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJICAgcmVsb2NhdGlvbiwgcmVsLT5yX2FkZGVuZCwKLQkJCQkJICAgaW5mbywgc2VjLCBoID09IE5VTEwpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNvbnN0IGNoYXIgKm1zZyA9IChjb25zdCBjaGFyICopMDsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0JCW5hbWUgPSBiZmRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIHNlYyk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IG91dCBvZiByYW5nZSBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JICAgIGNvbW1vbl9lcnJvcjoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykKLQkJICAgIChpbmZvLCBtc2csIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCBpbml0aWFsaXppbmcgb25lIGhhc2ggdGFibGUgZW50cnkuICAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX21uMTAzMDBfZmluaXNoX2hhc2hfdGFibGVfZW50cnkgKGdlbl9lbnRyeSwgaW5fYXJncykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpnZW5fZW50cnk7Ci0gICAgIFBUUiBpbl9hcmdzOwotewotICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmVudHJ5OwotICB1bnNpZ25lZCBpbnQgYnl0ZV9jb3VudCA9IDA7Ci0KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotCi0gIC8qIElmIHdlIGFscmVhZHkga25vdyB3ZSB3YW50IHRvIGNvbnZlcnQgImNhbGwiIHRvICJjYWxscyIgZm9yIGNhbGxzCi0gICAgIHRvIHRoaXMgc3ltYm9sLCB0aGVuIHJldHVybiBub3cuICAqLwotICBpZiAoZW50cnktPmZsYWdzID09IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHRoZXJlIGFyZSBubyBuYW1lZCBjYWxscyB0byB0aGlzIHN5bWJvbCwgb3IgdGhlcmUncyBub3RoaW5nIHdlCi0gICAgIGNhbiBtb3ZlIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24sIHRoZW4KLSAgICAgbm90ZSB0aGF0IGFsbCAiY2FsbCIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byAiY2FsbHMiCi0gICAgIGluc3RydWN0aW9ucyBhbmQgcmV0dXJuLiAgKi8KLSAgaWYgKGVudHJ5LT5kaXJlY3RfY2FsbHMgPT0gMAotICAgICAgfHwgKGVudHJ5LT5zdGFja19zaXplID09IDAgJiYgZW50cnktPm1vdm1fYXJncyA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIGEgbm90ZSB0aGF0IHdlIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgotCSBpbnN0cnVjdGlvbnMgZm9yIGNhbGxzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGVudHJ5LT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBXZSBtYXkgYmUgYWJsZSB0byBtb3ZlIHNvbWUgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGZ1bmN0aW9uIGl0c2VsZiBpbnRvCi0gICAgIHRoZSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICBDb3VudCBob3cgbWFueSBieXRlcyB3ZSBtaWdodCBiZSBhYmxlIHRvCi0gICAgIGVsaW1pbmF0ZSBpbiB0aGUgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLQotICAvKiBBIG1vdm0gaW5zdHJ1Y3Rpb24gaXMgdHdvIGJ5dGVzLiAgKi8KLSAgaWYgKGVudHJ5LT5tb3ZtX2FyZ3MpCi0gICAgYnl0ZV9jb3VudCArPSAyOwotCi0gIC8qIENvdW50IHRoZSBpbnNuIHRvIGFsbG9jYXRlIHN0YWNrIHNwYWNlIHRvby4gICovCi0gIGlmIChlbnRyeS0+c3RhY2tfc2l6ZSA+IDAgJiYgZW50cnktPnN0YWNrX3NpemUgPD0gMTI4KQotICAgIGJ5dGVfY291bnQgKz0gMzsKLSAgZWxzZSBpZiAoZW50cnktPnN0YWNrX3NpemUgPiAwICYmIGVudHJ5LT5zdGFja19zaXplIDwgMjU2KQotICAgIGJ5dGVfY291bnQgKz0gNDsKLQotICAvKiBJZiB1c2luZyAiY2FsbCIgd2lsbCByZXN1bHQgaW4gbGFyZ2VyIGNvZGUsIHRoZW4gdHVybiBhbGwKLSAgICAgdGhlIGFzc29jaWF0ZWQgImNhbGwiIGluc3RydWN0aW9ucyBpbnRvICJjYWxscyIgaW5zdHJ1dGlvbnMuICAqLwotICBpZiAoYnl0ZV9jb3VudCA8IGVudHJ5LT5kaXJlY3RfY2FsbHMpCi0gICAgZW50cnktPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOwotCi0gIC8qIFRoaXMgcm91dGluZSBuZXZlciBmYWlscy4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtbjEwMzAwLgotCi0gICBUaGVyZSdzIHF1aXRlIGEgZmV3IHJlbGF4aW5nIG9wcG9ydHVuaXRlcyBhdmFpbGFibGUgb24gdGhlIG1uMTAzMDA6Ci0KLQkqIGNhbGxzOjMyIC0+IGNhbGxzOjE2IAkJCQkJICAgMiBieXRlcwotCSogY2FsbDozMiAgLT4gY2FsbDoxNgkJCQkJICAgMiBieXRlcwotCi0JKiBjYWxsOjMyIC0+IGNhbGxzOjMyCQkJCQkgICAxIGJ5dGUKLQkqIGNhbGw6MTYgLT4gY2FsbHM6MTYJCQkJCSAgIDEgYnl0ZQotCQkqIFRoZXNlIGFyZSBkb25lIGFueXRpbWUgdXNpbmcgImNhbGxzIiB3b3VsZCByZXN1bHQKLQkJaW4gc21hbGxlciBjb2RlLCBvciB3aGVuIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSB0aGUKLQkJbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS4KLQotCSogY2FsbDozMgkJCQkJCSAgIHZhcmllcwotCSogY2FsbDoxNgotCQkqIEluIHNvbWUgY2lyY3Vtc3RhbmNlcyB3ZSBjYW4gbW92ZSBpbnN0cnVjdGlvbnMKLQkJZnJvbSBhIGZ1bmN0aW9uIHByb2xvZ3VlIGludG8gYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uCi0JCVRoaXMgaXMgb25seSBkb25lIGlmIHRoZSByZXN1bHRpbmcgY29kZSBpcyBubyBsYXJnZXIKLQkJdGhhbiB0aGUgb3JpZ2luYWwgY29kZS4KLQotCi0JKiBqbXA6MzIgLT4gam1wOjE2CQkJCQkgICAyIGJ5dGVzCi0JKiBqbXA6MTYgLT4gYnJhOjgJCQkJCSAgIDEgYnl0ZQotCi0JCSogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoCi0JCWFyb3VuZCB0aGUganVtcC9icmEsIHdlIG1heSBiZSBhYmxlIHRvIHJldmVyc2UgaXRzIGNvbmRpdGlvbgotCQlhbmQgY2hhbmdlIGl0cyB0YXJnZXQgdG8gdGhlIGp1bXAncyB0YXJnZXQuICBUaGUganVtcC9icmEKLQkJY2FuIHRoZW4gYmUgZGVsZXRlZC4JCQkJICAgMiBieXRlcwotCi0JKiBtb3YgYWJzMzIgLT4gbW92IGFiczE2CQkJCSAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgaW1tMzIgY2FuIHJlbGF4IHRvIGltbTE2ICAxIG9yIDIgYnl0ZXMKLQktIE1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFjY2VwdCBpbW0xNiBjYW4gcmVsYXggdG8gaW1tOCAgIDEgb3IgMiBieXRlcwotCi0JKiBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDMyIGNhbiByZWxheCB0byBkMTYJICAgMSBvciAyIGJ5dGVzCi0JLSBNb3N0IGluc3RydWN0aW9ucyB3aGljaCBhY2NlcHQgZDE2IGNhbiByZWxheCB0byBkOAkgICAxIG9yIDIgYnl0ZXMKLQotCVdlIGRvbid0IGhhbmRsZSBpbW0xNi0+aW1tOCBvciBkMTYtPmQ4IGFzIHRoZXkncmUgdmVyeSByYXJlCi0JYW5kIHNvbWV3aGF0IG1vcmUgZGlmZmljdWx0IHRvIHN1cHBvcnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzID0gTlVMTDsKLSAgYmZkX2J5dGUgKmZyZWVfY29udGVudHMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXMgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBBc3N1bWUgbm90aGluZyBjaGFuZ2VzLiAgKi8KLSAgKmFnYWluID0gZmFsc2U7Ci0KLSAgLyogV2UgbmVlZCBhIHBvaW50ZXIgdG8gdGhlIG1uMTAzMDAgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9tbjEwMzAwX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBmaWVsZHMgaW4gZWFjaCBoYXNoIHRhYmxlIGVudHJ5IHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICAqLwotICBpZiAoKGhhc2hfdGFibGUtPmZsYWdzICYgTU4xMDMwMF9IQVNIX0VOVFJJRVNfSU5JVElBTElaRUQpID09IDApCi0gICAgewotICAgICAgYmZkICppbnB1dF9iZmQ7Ci0KLSAgICAgIC8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGlucHV0IGJmZHMuICAqLwotICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0JICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0JICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCi0JICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0gICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLSAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLSAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQotICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgfQotCi0JICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KLQkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0JICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotCSAgICAgIGFzZWN0aW9uICpzeW1fc2VjOwotCSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCSAgICAgIGNoYXIgKm5ld19uYW1lOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgb2Ygc2VjdGlvbiBjb250ZW50cyBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICAgICAgZWxzZSBpZiAoc2VjdGlvbi0+X3Jhd19zaXplICE9IDApCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgY29udGVudHMgPSAoYmZkX2J5dGUgKiliZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpOwotCQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JCSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgc2VjdGlvbiwKLQkJCQkJCSBjb250ZW50cywgKGZpbGVfcHRyKSAwLAotCQkJCQkJIHNlY3Rpb24tPl9yYXdfc2l6ZSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnRlbnRzID0gTlVMTDsKLQkJICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlcmUgYXJlbid0IGFueSByZWxvY3MsIHRoZW4gdGhlcmUncyBub3RoaW5nIHRvIGRvLiAgKi8KLQkgICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JCSAgJiYgc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKLQkJewotCi0JCSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLQkJICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkJICAgICAoaW5wdXRfYmZkLCBzZWN0aW9uLCAoUFRSKSBOVUxMLAotCQkJCSAgICAgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkJCSAgICAgIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkJICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQkgICAgZnJlZV9yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0KLQkJICAvKiBOb3cgZXhhbWluZSBlYWNoIHJlbG9jYXRpb24uICAqLwotCQkgIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgaXJlbGVuZCA9IGlyZWwgKyBzZWN0aW9uLT5yZWxvY19jb3VudDsKLQkJICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQkJICAgIHsKLQkJICAgICAgbG9uZyByX3R5cGU7Ci0JCSAgICAgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKLQkJICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JCSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKLQkJICAgICAgcl9pbmRleCA9IEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pOwotCi0JCSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KVJfTU4xMDMwMF9NQVgpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBXZSBuZWVkIHRoZSBuYW1lIGFuZCBoYXNoIHRhYmxlIGVudHJ5IG9mIHRoZSB0YXJnZXQKLQkJCSBzeW1ib2whICAqLwotCQkgICAgICBoYXNoID0gTlVMTDsKLQkJICAgICAgc3ltID0gTlVMTDsKLQkJICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0KLQkJICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCQkJewotCQkJICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JCQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotCQkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwKLQkJCQkJCSAgICBleHRzeW1zICsgcl9pbmRleCwgJmlzeW0pOwotCi0JCQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJCSAgICBzeW1fc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAKLQkJCQkgICAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkJCSAgICBzeW1fc2VjCi0JCQkgICAgICA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIGlzeW0uc3Rfc2huZHgpOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkJCSAgICBzeW1fc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQotCQkJICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgIGlzeW0uc3RfbmFtZSk7Ci0KLQkJCSAgLyogSWYgaXQgaXNuJ3QgYSBmdW5jdGlvbiwgdGhlbiB3ZSBkb24ndCBjYXJlCi0JCQkgICAgIGFib3V0IGl0LiAgKi8KLQkJCSAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkgICAgICAmJiBFTEZfU1RfVFlQRSAoaXN5bS5zdF9pbmZvKSAhPSBTVFRfRlVOQykKLQkJCSAgICBjb250aW51ZTsKLQotCQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JCQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCQkJICBuZXdfbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc3ltX25hbWUpICsgMTApOwotCQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkJICBzcHJpbnRmIChuZXdfbmFtZSwgIiVzXyUwOHgiLCBzeW1fbmFtZSwgKGludClzeW1fc2VjKTsKLQkJCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCQkJICBoYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJCSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJCQkgICAgICAgICBzeW1fbmFtZSwgdHJ1ZSwKLQkJCQkJCSAgICAgICAgIHRydWUsIGZhbHNlKTsKLQkJCSAgZnJlZSAobmV3X25hbWUpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHJfaW5kZXggLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkJCSAgaGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCQkgICBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtyX2luZGV4XTsKLQkJCX0KLQotCQkgICAgICAvKiBJZiB0aGlzIGlzIG5vdCBhICJjYWxsIiBpbnN0cnVjdGlvbiwgdGhlbiB3ZQotCQkJIHNob3VsZCBjb252ZXJ0ICJjYWxsIiBpbnN0cnVjdGlvbnMgdG8gImNhbGxzIgotCQkJIGluc3RydWN0aW9ucy4gICovCi0JCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwKLQkJCQkJY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCQkgICAgICBpZiAoY29kZSAhPSAweGRkICYmIGNvZGUgIT0gMHhjZCkKLQkJCWhhc2gtPmZsYWdzIHw9IE1OMTAzMDBfQ09OVkVSVF9DQUxMX1RPX0NBTExTOwotCi0JCSAgICAgIC8qIElmIHRoaXMgaXMgYSBqdW1wL2NhbGwsIHRoZW4gYnVtcCB0aGUgZGlyZWN0X2NhbGxzCi0JCQkgY291bnRlci4gIEVsc2UgZm9yY2UgImNhbGwiIHRvICJjYWxscyIgY29udmVyc2lvbnMuICAqLwotCQkgICAgICBpZiAocl90eXBlID09IFJfTU4xMDMwMF9QQ1JFTDMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX01OMTAzMDBfUENSRUwxNikKLQkJCWhhc2gtPmRpcmVjdF9jYWxscysrOwotCQkgICAgICBlbHNlCi0JCQloYXNoLT5mbGFncyB8PSBNTjEwMzAwX0NPTlZFUlRfQ0FMTF9UT19DQUxMUzsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogTm93IGxvb2sgYXQgdGhlIGFjdHVhbCBjb250ZW50cyB0byBnZXQgdGhlIHN0YWNrIHNpemUsCi0JCSBhbmQgYSBsaXN0IG9mIHdoYXQgcmVnaXN0ZXJzIHdlcmUgc2F2ZWQgaW4gdGhlIHByb2xvZ3VlCi0JCSAoaWUgbW92bV9hcmdzKS4gICovCi0JICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCQl7Ci0KLQkJICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCQkgIGludCBpZHgsIHNobmR4OwotCi0JCSAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgIHNlY3Rpb24pOwotCi0KLQkJICAvKiBMb29rIGF0IGVhY2ggZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24gYW5kCi0JCSAgICAgdXBkYXRlIGluZm8gZm9yIHRoYXQgZnVuY3Rpb24uICAqLwotCQkgIGVzeW0gPSBleHRzeW1zOwotCQkgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLQkJICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKykKLQkJICAgIHsKLQkJICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0JCSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JCQkgICYmIEVMRl9TVF9UWVBFIChpc3ltLnN0X2luZm8pID09IFNUVF9GVU5DKQotCQkJewotCQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0JCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwCi0JCQkJICAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCQkgICAgc3ltX3NlYwotCQkJICAgICAgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICBpc3ltLnN0X3NobmR4KTsKLQkJCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkJICAgIHN5bV9zZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQkJICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQlpc3ltLnN0X25hbWUpOwotCi0JCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkJCSAgICAgbG9jYWwgc3ltYm9sIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0JCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkJICBzeW1fbmFtZSA9IG5ld19uYW1lOwotCi0JCQkgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkJICAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmaGFzaF90YWJsZS0+c3RhdGljX2hhc2hfdGFibGUtPnJvb3QsCi0JCQkJCQkgICAgICAgICAgc3ltX25hbWUsIHRydWUsCi0JCQkJCQkgICAgICAgICAgdHJ1ZSwgZmFsc2UpOwotCQkJICBmcmVlIChuZXdfbmFtZSk7Ci0JCQkgIGNvbXB1dGVfZnVuY3Rpb25faW5mbyAoaW5wdXRfYmZkLCBoYXNoLAotCQkJCQkgICAgICAgICBpc3ltLnN0X3ZhbHVlLCBjb250ZW50cyk7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZQotCQkJCSAgICAgICAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSk7Ci0JCSAgZm9yIChpZHggPSAwOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrLCBpZHgrKykKLQkJICAgIHsKLQkJICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0JCSAgICAgIGhhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCQkgICAgICAgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaWR4XTsKLQkJICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkJCSAgJiYgRUxGX1NUX1RZUEUgKGlzeW0uc3RfaW5mbykgPT0gU1RUX0ZVTkMKLQkJCSAgJiYgKGhhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWN0aW9uCi0JCQkgICYmICgoaGFzaCktPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICAgfHwgKGhhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCQkJY29tcHV0ZV9mdW5jdGlvbl9pbmZvIChpbnB1dF9iZmQsIGhhc2gsCi0JCQkJCSAgICAgICAoaGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwKLQkJCQkJICAgICAgIGNvbnRlbnRzKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHJlbG9jcy4gICovCi0JICAgICAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0JCXsKLQkJICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgY29udGVudHMuICAqLwotCSAgICAgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQkgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICB9Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgc3ltYm9scy4gICovCi0JICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQlmcmVlIChmcmVlX2V4dHN5bXMpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQkJfQotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE5vdyBpdGVyYXRlIG9uIGVhY2ggc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlIGFuZCBwZXJmb3JtCi0JIHRoZSBmaW5hbCBpbml0aWFsaXphdGlvbiBzdGVwcyBvbiBlYWNoLiAgKi8KLSAgICAgIGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlIChoYXNoX3RhYmxlLAotCQkJCQllbGYzMl9tbjEwMzAwX2ZpbmlzaF9oYXNoX3RhYmxlX2VudHJ5LAotCQkJCQlOVUxMKTsKLSAgICAgIGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RyYXZlcnNlIChoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZSwKLQkJCQkJZWxmMzJfbW4xMDMwMF9maW5pc2hfaGFzaF90YWJsZV9lbnRyeSwKLQkJCQkJTlVMTCk7Ci0KLSAgICAgIC8qIEFsbCBlbnRyaWVzIGluIHRoZSBoYXNoIHRhYmxlIGFyZSBmdWxseSBpbml0aWFsaXplZC4gICovCi0gICAgICBoYXNoX3RhYmxlLT5mbGFncyB8PSBNTjEwMzAwX0hBU0hfRU5UUklFU19JTklUSUFMSVpFRDsKLQotICAgICAgLyogTm93IHRoYXQgZXZlcnl0aGluZyBoYXMgYmVlbiBpbml0aWFsaXplZCwgZ28gdGhyb3VnaCBlYWNoCi0JIGNvZGUgc2VjdGlvbiBhbmQgZGVsZXRlIGFueSBwcm9sb2d1ZSBpbnNucyB3aGljaCB3aWxsIGJlCi0JIHJlZHVuZGFudCBiZWNhdXNlIHRoZWlyIG9wZXJhdGlvbnMgd2lsbCBiZSBwZXJmb3JtZWQgYnkKLQkgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZm9yIChpbnB1dF9iZmQgPSBsaW5rX2luZm8tPmlucHV0X2JmZHM7Ci0JICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0JICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLQkgIC8qIFdlJ3JlIGdvaW5nIHRvIG5lZWQgYWxsIHRoZSBzeW1ib2xzIGZvciBlYWNoIGJmZC4gICovCi0JICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICAgICAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotICAgICAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgICAgICAgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0gICAgICAgICAgICAgIGV4dHN5bXMgPSAoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLSAgICAgICAgICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLSAgICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICAgICAgICAgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgaW5wdXRfYmZkKQotICAgICAgICAgICAgICAgICAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgICAgICAgfQotCi0JICAvKiBXYWxrIG92ZXIgZWFjaCBzZWN0aW9uIGluIHRoaXMgYmZkLiAgKi8KLQkgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgIHNlY3Rpb24gIT0gTlVMTDsKLQkgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgc2huZHg7Ci0JICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQkgICAgICBpbnQgaWR4OwotCi0JICAgICAgLyogU2tpcCBub24tY29kZSBzZWN0aW9ucyBhbmQgZW1wdHkgc2VjdGlvbnMuICAqLwotCSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCB8fCBzZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKLQkJewotICAgICAgICAgICAgICAgICAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgICAgICAgICAgICAgIGludGVybmFsX3JlbG9jcyA9IChfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRfYmZkLCBzZWN0aW9uLCAoUFRSKSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICAgICAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgICAgICAgICAgICAgICAgIGZyZWVfcmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQl9Ci0KLQkgICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgb2Ygc2VjdGlvbiBjb250ZW50cyBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsIHNlY3Rpb24sCi0JCQkJCQkgY29udGVudHMsIChmaWxlX3B0cikgMCwKLQkJCQkJCSBzZWN0aW9uLT5fcmF3X3NpemUpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCi0JICAgICAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGlucHV0X2JmZCwgc2VjdGlvbik7Ci0KLQkgICAgICAvKiBOb3cgbG9vayBmb3IgYW55IGZ1bmN0aW9uIGluIHRoaXMgc2VjdGlvbiB3aGljaCBuZWVkcwotCQkgaW5zbnMgZGVsZXRlZCBmcm9tIGl0cyBwcm9sb2d1ZS4gICovCi0JICAgICAgZXN5bSA9IGV4dHN5bXM7Ci0JICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCQkgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0JCSAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0JCSAgY29uc3QgY2hhciAqc3ltX25hbWU7Ci0JCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQkJICBjaGFyICpuZXdfbmFtZTsKLQotCQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLQkJICBpZiAoaXN5bS5zdF9zaG5keCAhPSBzaG5keCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGKQotCQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA+IDAgJiYgaXN5bS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JCSAgICBzeW1fc2VjCi0JCSAgICAgID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGlucHV0X2JmZCwgaXN5bS5zdF9zaG5keCk7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQUJTKQotCQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCSAgZWxzZSBpZiAoaXN5bS5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotCQkgICAgc3ltX3NlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJICBzeW1fbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQlzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJCWlzeW0uc3RfbmFtZSk7Ci0KLQkJICAvKiBUYWNrIG9uIGFuIElEIHNvIHdlIGNhbiB1bmlxdWVseSBpZGVudGlmeSB0aGlzCi0JCSAgICAgbG9jYWwgc3ltYm9sIGluIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0JCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkJICBpZiAobmV3X25hbWUgPT0gMCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0KLQkJICBzeW1faGFzaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJCSAgICBlbGZfbGlua19oYXNoX2xvb2t1cCAoJmhhc2hfdGFibGUtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LAotCQkJCQkgICAgICAgICAgc3ltX25hbWUsIGZhbHNlLAotCQkJCQkgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLQotCQkgIGZyZWUgKG5ld19uYW1lKTsKLQkJICBpZiAoc3ltX2hhc2ggPT0gTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKCEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpCi0JCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTKSkKLQkJICAgIHsKLQkJICAgICAgaW50IGJ5dGVzID0gMDsKLQotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGluZ3MuICAqLwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopZXh0c3ltczsKLQkJICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgICAvKiBDb3VudCBob3cgbWFueSBieXRlcyB3ZSdyZSBnb2luZyB0byBkZWxldGUuICAqLwotCQkgICAgICBpZiAoc3ltX2hhc2gtPm1vdm1fYXJncykKLQkJCWJ5dGVzICs9IDI7Ci0KLQkJICAgICAgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDw9IDEyOCkKLQkJCWJ5dGVzICs9IDM7Ci0JCSAgICAgIGVsc2UgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplCi0JCQkgICAgICAgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPCAyNTYpCi0JCQlieXRlcyArPSA0OwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBkZWxldGVkIHByb2xvZ3VlIGJ5dGVzIGZvciB0aGlzCi0JCQkgZnVuY3Rpb24uICAqLwotCQkgICAgICBzeW1faGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTOwotCi0JCSAgICAgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotCQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoaW5wdXRfYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24sCi0JCQkJCQkJICAgaXN5bS5zdF92YWx1ZSwKLQkJCQkJCQkgICBieXRlcykpCi0JCQlnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgICAvKiBTb21ldGhpbmcgY2hhbmdlZC4gIE5vdCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dAotCQkJIG1heSBsZWFkIHRvIG1vcmUgcmVsYXhpbmcgb3Bwb3J0dW5pdGllcy4gICovCi0JCSAgICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIExvb2sgZm9yIGFueSBnbG9iYWwgZnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiB3aGljaAotCQkgbmVlZCBpbnNucyBkZWxldGVkIGZyb20gdGhlaXIgcHJvbG9ndWVzLiAgKi8KLQkgICAgICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICAgICAgZXN5bWVuZCA9IGV4dHN5bXMgKyAoc3ltdGFiX2hkci0+c2hfc2l6ZQotCQkJCSAgIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKTsKLQkgICAgICBmb3IgKGlkeCA9IDA7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyssIGlkeCsrKQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCQkgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqc3ltX2hhc2g7Ci0KLQkJICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgJmlzeW0pOwotCQkgIHN5bV9oYXNoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICAgIChlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKVtpZHhdKTsKLQkJICBpZiAoaXN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkgICAgICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWN0aW9uCi0JCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpCi0JCSAgICAgICYmICEgKChzeW1faGFzaCktPmZsYWdzICYgTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTKSkKLQkJICAgIHsKLQkJICAgICAgaW50IGJ5dGVzID0gMDsKLQotCQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGluZ3MuICAqLwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopZXh0c3ltczsKLQkJICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgICAvKiBDb3VudCBob3cgbWFueSBieXRlcyB3ZSdyZSBnb2luZyB0byBkZWxldGUuICAqLwotCQkgICAgICBpZiAoc3ltX2hhc2gtPm1vdm1fYXJncykKLQkJCWJ5dGVzICs9IDI7Ci0KLQkJICAgICAgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplICYmIHN5bV9oYXNoLT5zdGFja19zaXplIDw9IDEyOCkKLQkJCWJ5dGVzICs9IDM7Ci0JCSAgICAgIGVsc2UgaWYgKHN5bV9oYXNoLT5zdGFja19zaXplCi0JCQkgICAgICAgJiYgc3ltX2hhc2gtPnN0YWNrX3NpemUgPCAyNTYpCi0JCQlieXRlcyArPSA0OwotCi0JCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBkZWxldGVkIHByb2xvZ3VlIGJ5dGVzIGZvciB0aGlzCi0JCQkgZnVuY3Rpb24uICAqLwotCQkgICAgICBzeW1faGFzaC0+ZmxhZ3MgfD0gTU4xMDMwMF9ERUxFVEVEX1BST0xPR1VFX0JZVEVTOwotCi0JCSAgICAgIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotCQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoaW5wdXRfYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24sCi0JCQkJCQkJICAgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlLAotCQkJCQkJCSAgIGJ5dGVzKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAgIC8qIFNvbWV0aGluZyBjaGFuZ2VkLiAgTm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0Ci0JCQkgbWF5IGxlYWQgdG8gbW9yZSByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLQkJICAgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ2FjaGUgb3IgZnJlZSBhbnkgbWVtb3J5IHdlIGFsbG9jYXRlZCBmb3IgdGhlIHJlbG9jcy4gICovCi0JICAgICAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0JCXsKLQkJICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0JCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgY29udGVudHMuICAqLwotCSAgICAgIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQkgICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICB9Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBDYWNoZSBvciBmcmVlIGFueSBtZW1vcnkgd2UgYWxsb2NhdGVkIGZvciB0aGUgc3ltYm9scy4gICovCi0JICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCQlmcmVlIChmcmVlX2V4dHN5bXMpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQkJfQotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0KLSAgLyogKFJlKWluaXRpYWxpemUgZm9yIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzaG9ydGVuaW5nL3JlbGF4aW5nIHBhc3MuICAqLwotICBjb250ZW50cyA9IE5VTEw7Ci0gIGV4dHN5bXMgPSBOVUxMOwotICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gIGZyZWVfY29udGVudHMgPSBOVUxMOwotICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIFdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcgZm9yIGEgcmVsb2NhdGVhYmxlIGxpbmssIGlmCi0gICAgIHRoaXMgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHJlbG9jcywgb3IgaWYgdGhpcyBpcyBub3QgYQotICAgICBjb2RlIHNlY3Rpb24uICAqLwotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDAKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICAvKiBXYWxrIHRocm91Z2ggdGhlbSBsb29raW5nIGZvciByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqaCA9IE5VTEw7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgY2FuIGJlIHJlbGF4ZWQsIHRoZW4gaWdub3JlCi0JIHRoaXMgcmVsb2MuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfTk9ORQotCSAgfHwgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF84Ci0JICB8fCBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9NTjEwMzAwX01BWCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCSAgY2hhciAqbmV3X25hbWU7Ci0KLQkgIC8qIEEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwKLQkJCQkgICAgZXh0c3ltcyArIEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0KLQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgc3ltX3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID4gMCAmJiBpc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgc3ltX3NlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpc3ltLnN0X3NobmR4KTsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgc3ltX3NlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIHN5bV9zZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCi0JICBzeW12YWwgPSAoaXN5bS5zdF92YWx1ZQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLAotCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCSAgICAgIGlzeW0uc3RfbmFtZSk7Ci0KLQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLQkgICAgIGxvY2FsIHN5bWJvbCBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICAqLwotCSAgbmV3X25hbWUgPSBiZmRfbWFsbG9jIChzdHJsZW4gKHN5bV9uYW1lKSArIDEwKTsKLQkgIGlmIChuZXdfbmFtZSA9PSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCSAgc3ltX25hbWUgPSBuZXdfbmFtZTsKLQotCSAgaCA9IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikKLQkJZWxmX2xpbmtfaGFzaF9sb29rdXAgKCZoYXNoX3RhYmxlLT5zdGF0aWNfaGFzaF90YWJsZS0+cm9vdCwKLQkJCQkgICAgICBzeW1fbmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JICBmcmVlIChuZXdfbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQotCSAgLyogQW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgIGluZHggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkoZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdKTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBhcHBlYXJzIHRvIGJlIGEgcmVmZXJlbmNlIHRvIGFuIHVuZGVmaW5lZAotIAkJc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotIAkJcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgLyogVHJ5IHRvIHR1cm4gYSAzMmJpdCBwYy1yZWxhdGl2ZSBicmFuY2gvY2FsbCBpbnRvIGEgMTZiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoL2NhbGwsIGFsc28gZGVhbCB3aXRoICJjYWxsIiAtPiAiY2FsbHMiIGNvbnZlcnNpb25zIGFuZAotCSBpbnNlcnRpb24gb2YgcHJvbG9ndWUgZGF0YSBpbnRvICJjYWxsIiBpbnN0cnVjdGlvbnMuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUwzMikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBJZiB3ZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0dXJuZWQKLQkgICAgIGludG8gYSAiY2FsbHMiIGluc3RydWN0aW9uLCBkbyBzbyBub3cuICBJdCBzYXZlcyBhIGJ5dGUuICAqLwotCSAgaWYgKGggJiYgKGgtPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdyZSB3b3JraW5nIHdpdGggYSAiY2FsbCIgaW5zdHJ1Y3Rpb24hICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZGQpCi0JCXsKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLAotCQkgICAgIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCQkgIC8qIEZpeCBpcmVsLT5yX29mZnNldCBhbmQgaXJlbC0+cl9hZGRlbmQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDE7Ci0JCSAgaXJlbC0+cl9hZGRlbmQgKz0gMTsKLQotCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMywgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgpCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gd2hpY2ggbmVlZHMgc29tZSBkYXRhCi0JCSBmcm9tIHRhcmdldCBmdW5jdGlvbiBmaWxsZWQgaW4uICAqLwotCSAgICAgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgICAgIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkgICAgICAvKiBJbnNlcnQgZGF0YSBmcm9tIHRoZSB0YXJnZXQgZnVuY3Rpb24gaW50byB0aGUgImNhbGwiCi0JCSBpbnN0cnVjdGlvbiBpZiBuZWVkZWQuICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4ZGQpCi0JCXsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPm1vdm1fYXJncywgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgaC0+c3RhY2tfc2l6ZSArIGgtPm1vdm1fc3RhY2tfc2l6ZSwKLQkJCSAgICAgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDUpOwotCQl9Ci0JICAgIH0KLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBTZWUgaWYgdGhlIHZhbHVlIHdpbGwgZml0IGluIDE2IGJpdHMsIG5vdGUgdGhlIGhpZ2ggdmFsdWUgaXMKLQkgICAgIDB4N2ZmZiArIDIgYXMgdGhlIHRhcmdldCB3aWxsIGJlIHR3byBieXRlcyBjbG9zZXIgaWYgd2UgYXJlCi0JICAgICBhYmxlIHRvIHJlbGF4LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4ODAwMSAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhkYyAmJiBjb2RlICE9IDB4ZGQgJiYgY29kZSAhPSAweGZmKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY3MsIHNlY3Rpb24gY29udGVudHMsIGV0Yy4gICovCi0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkgICAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKGNvZGUgPT0gMHhkYykKLQkJYmZkX3B1dF84IChhYmZkLCAweGNjLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JICAgICAgZWxzZSBpZiAoY29kZSA9PSAweGRkKQotCQliZmRfcHV0XzggKGFiZmQsIDB4Y2QsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZmYpCi0JCWJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JICAgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9NTjEwMzAwX1BDUkVMMTYpOwotCi0JICAgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkgICAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgaXJlbC0+cl9vZmZzZXQgKyAxLCAyKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICAgICAqYWdhaW4gPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUcnkgdG8gdHVybiBhIDE2Yml0IHBjLXJlbGF0aXZlIGJyYW5jaCBpbnRvIGEgOGJpdCBwYy1yZWxhdGl2ZQotCSBicmFuY2guICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUwxNikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCi0JICAvKiBJZiB3ZSd2ZSBnb3QgYSAiY2FsbCIgaW5zdHJ1Y3Rpb24gdGhhdCBuZWVkcyB0byBiZSB0dXJuZWQKLQkgICAgIGludG8gYSAiY2FsbHMiIGluc3RydWN0aW9uLCBkbyBzbyBub3cuICBJdCBzYXZlcyBhIGJ5dGUuICAqLwotCSAgaWYgKGggJiYgKGgtPmZsYWdzICYgTU4xMDMwMF9DT05WRVJUX0NBTExfVE9fQ0FMTFMpKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgY2hhciBjb2RlOwotCi0JICAgICAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGNvZGUgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSdyZSB3b3JraW5nIHdpdGggYSAiY2FsbCIgaW5zdHJ1Y3Rpb24hICAqLwotCSAgICAgIGlmIChjb2RlID09IDB4Y2QpCi0JCXsKLQkJICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLAotCQkgICAgIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZmLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCQkgIC8qIEZpeCBpcmVsLT5yX29mZnNldCBhbmQgaXJlbC0+cl9hZGRlbmQuICAqLwotCQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDE7Ci0JCSAgaXJlbC0+cl9hZGRlbmQgKz0gMTsKLQotCQkgIC8qIERlbGV0ZSBvbmUgYnl0ZSBvZiBkYXRhLiAgKi8KLQkJICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAqYWdhaW4gPSB0cnVlOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogSW5zZXJ0IGRhdGEgZnJvbSB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGludG8gdGhlICJjYWxsIgotCQkgaW5zdHJ1Y3Rpb24gaWYgbmVlZGVkLiAgKi8KLQkgICAgICBpZiAoY29kZSA9PSAweGNkKQotCQl7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBoLT5tb3ZtX2FyZ3MsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAyKTsKLQkJICBiZmRfcHV0XzggKGFiZmQsIGgtPnN0YWNrX3NpemUgKyBoLT5tb3ZtX3N0YWNrX3NpemUsCi0JCQkgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyAzKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIERlYWwgd2l0aCBwYy1yZWxhdGl2ZSBndW5rLiAgKi8KLQkgIHZhbHVlIC09IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgLT0gaXJlbC0+cl9vZmZzZXQ7Ci0JICB2YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiA4IGJpdHMsIG5vdGUgdGhlIGhpZ2ggdmFsdWUgaXMKLQkgICAgIDB4N2YgKyAxIGFzIHRoZSB0YXJnZXQgd2lsbCBiZSBvbmUgYnl0ZXMgY2xvc2VyIGlmIHdlIGFyZQotCSAgICAgYWJsZSB0byByZWxheC4gICovCi0JICBpZiAoKGxvbmcpdmFsdWUgPCAweDgwICYmIChsb25nKXZhbHVlID4gLTB4ODApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBHZXQgdGhlIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKGNvZGUgIT0gMHhjYykKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICAgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhjYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JICAgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJICAgUl9NTjEwMzAwX1BDUkVMOCk7Ci0KLQkgICAgICAvKiBEZWxldGUgb25lIGJ5dGUgb2YgZGF0YS4gICovCi0JICAgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCSAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JICAgICAgKmFnYWluID0gdHJ1ZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogVHJ5IHRvIGVsaW1pbmF0ZSBhbiB1bmNvbmRpdGlvbmFsIDggYml0IHBjLXJlbGF0aXZlIGJyYW5jaAotCSB3aGljaCBpbW1lZGlhdGVseSBmb2xsb3dzIGEgY29uZGl0aW9uYWwgOCBiaXQgcGMtcmVsYXRpdmUKLQkgYnJhbmNoIGFyb3VuZCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2guCi0KLQkgICAgb3JpZ2luYWw6CQluZXc6Ci0JICAgIGJDQyBsYWIxCQliQ0MnIGxhYjIKLQkgICAgYnJhIGxhYjIKLQkgICBsYWIxOgkgICAgICAgbGFiMToKLQotCi0JIFRoaXMgaGFwcGVucyB3aGVuIHRoZSBiQ0MgY2FuJ3QgcmVhY2ggbGFiMiBhdCBhc3NlbWJseSB0aW1lLAotCSBidXQgZHVlIHRvIG90aGVyIHJlbGF4YXRpb25zIGl0IGNhbiByZWFjaCBhdCBsaW5rIHRpbWUuICAqLwotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX01OMTAzMDBfUENSRUw4KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICpucmVsOwotCSAgYmZkX3ZtYSB2YWx1ZSA9IHN5bXZhbDsKLQkgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgLyogRGVhbCB3aXRoIHBjLXJlbGF0aXZlIGd1bmsuICAqLwotCSAgdmFsdWUgLT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB2YWx1ZSAtPSBpcmVsLT5yX29mZnNldDsKLQkgIHZhbHVlICs9IGlyZWwtPnJfYWRkZW5kOwotCi0JICAvKiBEbyBub3RoaW5nIGlmIHRoaXMgcmVsb2MgaXMgdGhlIGxhc3QgYnl0ZSBpbiB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoaXJlbC0+cl9vZmZzZXQgPT0gc2VjLT5fY29va2VkX3NpemUpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBTZWUgaWYgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYW4gdW5jb25kaXRpb25hbCBwYy1yZWxhdGl2ZQotCSAgICAgYnJhbmNoLCBtb3JlIG9mdGVuIHRoYW4gbm90IHRoaXMgdGVzdCB3aWxsIGZhaWwsIHNvIHdlCi0JICAgICB0ZXN0IGl0IGZpcnN0IHRvIHNwZWVkIHRoaW5ncyB1cC4gICovCi0JICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0ICsgMSk7Ci0JICBpZiAoY29kZSAhPSAweGNhKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogQWxzbyBtYWtlIHN1cmUgdGhlIG5leHQgcmVsb2NhdGlvbiBhcHBsaWVzIHRvIHRoZSBuZXh0Ci0JICAgICBpbnN0cnVjdGlvbiBhbmQgdGhhdCBpdCdzIGEgcGMtcmVsYXRpdmUgOCBiaXQgYnJhbmNoLiAgKi8KLQkgIG5yZWwgPSBpcmVsICsgMTsKLQkgIGlmIChucmVsID09IGlyZWxlbmQKLQkgICAgICB8fCBpcmVsLT5yX29mZnNldCArIDIgIT0gbnJlbC0+cl9vZmZzZXQKLQkgICAgICB8fCBFTEYzMl9SX1RZUEUgKG5yZWwtPnJfaW5mbykgIT0gKGludCkgUl9NTjEwMzAwX1BDUkVMOCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE1ha2Ugc3VyZSBvdXIgZGVzdGluYXRpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUKLQkgICAgIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLQkgIGlmIChzeW12YWwgIT0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICsgaXJlbC0+cl9vZmZzZXQgKyAzKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE5vdyBtYWtlIHN1cmUgd2UgYXJlIGEgY29uZGl0aW9uYWwgYnJhbmNoLiAgVGhpcyBtYXkgbm90Ci0JICAgICBiZSBuZWNlc3NhcnksIGJ1dCB3aHkgdGFrZSB0aGUgY2hhbmNlLgotCi0JICAgICBOb3RlIHRoZXNlIGNoZWNrcyBhc3N1bWUgdGhhdCBSX01OMTAzMDBfUENSRUw4IHJlbG9jcwotCSAgICAgb25seSBvY2N1ciBvbiBiQ0MgYW5kIGJDQ3ggaW5zbnMuICBJZiB0aGV5IG9jY3VyZWQKLQkgICAgIGVsc2V3aGVyZSwgd2UnZCBuZWVkIHRvIGtub3cgdGhlIHN0YXJ0IG9mIHRoaXMgaW5zbgotCSAgICAgZm9yIHRoaXMgY2hlY2sgdG8gYmUgYWNjdXJhdGUuICAqLwotCSAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCSAgaWYgKGNvZGUgIT0gMHhjMCAmJiBjb2RlICE9IDB4YzEgJiYgY29kZSAhPSAweGMyCi0JICAgICAgJiYgY29kZSAhPSAweGMzICYmIGNvZGUgIT0gMHhjNCAmJiBjb2RlICE9IDB4YzUKLQkgICAgICAmJiBjb2RlICE9IDB4YzYgJiYgY29kZSAhPSAweGM3ICYmIGNvZGUgIT0gMHhjOAotCSAgICAgICYmIGNvZGUgIT0gMHhjOSAmJiBjb2RlICE9IDB4ZTggJiYgY29kZSAhPSAweGU5Ci0JICAgICAgJiYgY29kZSAhPSAweGVhICYmIGNvZGUgIT0gMHhlYikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFdlIGFsc28gaGF2ZSB0byBiZSBzdXJlIHRoZXJlIGlzIG5vIHN5bWJvbC9sYWJlbAotCSAgICAgYXQgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLQkgIGlmIChtbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsCi0JCQkJCSAgICBpcmVsLT5yX29mZnNldCArIDEpKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jcywgc2VjdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCSAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotCSAgc3dpdGNoIChjb2RlKQotCSAgICB7Ci0JICAgICAgY2FzZSAweGM4OgotCQljb2RlID0gMHhjOTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM5OgotCQljb2RlID0gMHhjODsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMwOgotCQljb2RlID0gMHhjMjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMyOgotCQljb2RlID0gMHhjMDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMzOgotCQljb2RlID0gMHhjMTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGMxOgotCQljb2RlID0gMHhjMzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM0OgotCQljb2RlID0gMHhjNjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM2OgotCQljb2RlID0gMHhjNDsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM3OgotCQljb2RlID0gMHhjNTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGM1OgotCQljb2RlID0gMHhjNzsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGU4OgotCQljb2RlID0gMHhlOTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweDlkOgotCQljb2RlID0gMHhlODsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGVhOgotCQljb2RlID0gMHhlYjsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSAweGViOgotCQljb2RlID0gMHhlYTsKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAvKiBTZXQgdGhlIHJlbG9jIHR5cGUgYW5kIHN5bWJvbCBmb3IgdGhlIGZpcnN0IGJyYW5jaAotCSAgICAgZnJvbSB0aGUgc2Vjb25kIGJyYW5jaC4gICovCi0JICBpcmVsLT5yX2luZm8gPSBucmVsLT5yX2luZm87Ci0KLQkgIC8qIE1ha2UgdGhlIHJlbG9jIGZvciB0aGUgc2Vjb25kIGJyYW5jaCBhIG51bGwgcmVsb2MuICAqLwotCSAgbnJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAobnJlbC0+cl9pbmZvKSwKLQkJCQkgICAgICAgUl9NTjEwMzAwX05PTkUpOwotCi0JICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJICAgICAgIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMikpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkgICphZ2FpbiA9IHRydWU7Ci0JfQotCi0KLSAgICAgIC8qIFRyeSB0byB0dXJuIGEgMzJiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcwotCSBpbnRvIGEgMTZiaXQgaW1tZWRpYXRlLCBkaXNwbGFjZW1lbnQgb3IgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTU4xMDMwMF8zMikKLQl7Ci0JICBiZmRfdm1hIHZhbHVlID0gc3ltdmFsOwotCSAgdmFsdWUgKz0gaXJlbC0+cl9hZGRlbmQ7Ci0KLQotCSAgLyogU2VlIGlmIHRoZSB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLgotCSAgICAgV2UgYWxsb3cgYW55IDE2Yml0IG1hdGNoIGhlcmUuICBXZSBwcnVuZSB0aG9zZSB3ZSBjYW4ndAotCSAgICAgaGFuZGxlIGJlbG93LiAgKi8KLQkgIGlmICgobG9uZyl2YWx1ZSA8IDB4N2ZmZiAmJiAobG9uZyl2YWx1ZSA+IC0weDgwMDApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBjaGFyIGNvZGU7Ci0KLQkgICAgICAvKiBNb3N0IGluc25zIHdoaWNoIGhhdmUgMzJiaXQgb3BlcmFuZHMgYXJlIDYgYnl0ZXMgbG9uZzsKLQkJIGV4Y2VwdGlvbnMgYXJlIHBjcmVsIGluc25zIGFuZCBiaXQgaW5zbnMuCi0KLQkJIFdlIGhhbmRsZSBwY3JlbCBpbnNucyBhYm92ZS4gIFdlIGRvbid0IGJvdGhlciB0cnlpbmcKLQkJIHRvIGhhbmRsZSB0aGUgYml0IGluc25zIGhlcmUuCi0KLQkJIFRoZSBmaXJzdCBieXRlIG9mIHRoZSByZW1haW5pbmcgaW5zbnMgd2lsbCBiZSAweGZjLiAgKi8KLQotCSAgICAgIC8qIEdldCB0aGUgZmlyc3Qgb3Bjb2RlLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0KLQkgICAgICBpZiAoY29kZSAhPSAweGZjKQotCQljb250aW51ZTsKLQotCSAgICAgIC8qIEdldCB0aGUgc2Vjb25kIG9wY29kZS4gICovCi0JICAgICAgY29kZSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JICAgICAgaWYgKChjb2RlICYgMHhmMCkgPCAweDgwKQotCQlzd2l0Y2ggKGNvZGUgJiAweGYwKQotCQkgIHsKLQkJICAvKiBtb3YgKGQzMixhbSksZG4gICAtPiBtb3YgKGQzMixhbSksZG4KLQkJICAgICBtb3YgZG0sKGQzMixhbSkgICAtPiBtb3YgZG4sKGQzMixhbSkKLQkJICAgICBtb3YgKGQzMixhbSksYW4gICAtPiBtb3YgKGQzMixhbSksYW4KLQkJICAgICBtb3YgZG0sKGQzMixhbSkgICAtPiBtb3YgZG4sKGQzMixhbSkKLQkJICAgICBtb3ZidSAoZDMyLGFtKSxkbiAtPiBtb3ZidSAoZDMyLGFtKSxkbgotCQkgICAgIG1vdmJ1IGRtLChkMzIsYW0pIC0+IG1vdmJ1IGRuLChkMzIsYW0pCi0JCSAgICAgbW92aHUgKGQzMixhbSksZG4gLT4gbW92aHUgKGQzMixhbSksZG4KLQkJICAgICBtb3ZodSBkbSwoZDMyLGFtKSAtPiBtb3ZodSBkbiwoZDMyLGFtKSAqLwotCQkgIGNhc2UgMHgwMDoKLQkJICBjYXNlIDB4MTA6Ci0JCSAgY2FzZSAweDIwOgotCQkgIGNhc2UgMHgzMDoKLQkJICBjYXNlIDB4NDA6Ci0JCSAgY2FzZSAweDUwOgotCQkgIGNhc2UgMHg2MDoKLQkJICBjYXNlIDB4NzA6Ci0JCSAgICAvKiBOb3Qgc2FmZSBpZiB0aGUgaGlnaCBiaXQgaXMgb24gYXMgcmVsYXhpbmcgbWF5Ci0JCSAgICAgICBtb3ZlIHRoZSB2YWx1ZSBvdXQgb2YgaGlnaCBtZW0gYW5kIHRodXMgbm90IGZpdAotCQkgICAgICAgaW4gYSBzaWduZWQgMTZiaXQgdmFsdWUuICAqLwotCQkgICAgaWYgKGNvZGUgPT0gMHhjYwotCQkJJiYgKHZhbHVlICYgMHg4MDAwKSkKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIC8qIE5vdGUgdGhhdCB3ZSd2ZSBjaGFuZ2VkIHRoZSByZWxvY2F0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCQkgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICAgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JCSAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIDB4ZmEsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDEpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogRGVsZXRlIHR3byBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMiwgMikpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYwKSA9PSAweDgwCi0JCSAgICAgICB8fCAoY29kZSAmIDB4ZjApID09IDB4OTApCi0JCXN3aXRjaCAoY29kZSAmIDB4ZjMpCi0JCSAgewotCQkgIC8qIG1vdiBkbiwoYWJzMzIpICAgLT4gbW92IGRuLChhYnMxNikKLQkJICAgICBtb3ZidSBkbiwoYWJzMzIpIC0+IG1vdmJ1IGRuLChhYnMxNikKLQkJICAgICBtb3ZodSBkbiwoYWJzMzIpIC0+IG1vdmh1IGRuLChhYnMxNikgICovCi0JCSAgY2FzZSAweDgxOgotCQkgIGNhc2UgMHg4MjoKLQkJICBjYXNlIDB4ODM6Ci0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgaWYgKChjb2RlICYgMHhmMykgPT0gMHg4MSkKLQkJICAgICAgY29kZSA9IDB4MDEgKyAoY29kZSAmIDB4MGMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGYzKSA9PSAweDgyKQotCQkgICAgICBjb2RlID0gMHgwMiArIChjb2RlICYgMHgwYyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZjMpID09IDB4ODMpCi0JCSAgICAgIGNvZGUgPSAweDAzICsgKGNvZGUgJiAweDBjKTsKLQkJICAgIGVsc2UKLQkJICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgY29kZSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCi0JCSAgICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCQkgUl9NTjEwMzAwXzE2KTsKLQotCQkgICAgLyogVGhlIG9wY29kZSBnb3Qgc2hvcnRlciB0b28sIHNvIHdlIGhhdmUgdG8gZml4IHRoZQotCQkgICAgICAgYWRkZW5kIGFuZCBvZmZzZXQgdG9vISAgKi8KLQkJICAgIGlyZWwtPnJfb2Zmc2V0IC09IDE7Ci0KLQkJICAgIC8qIERlbGV0ZSB0aHJlZSBieXRlcyBvZiBkYXRhLiAgKi8KLQkJICAgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkJIGlyZWwtPnJfb2Zmc2V0ICsgMSwgMykpCi0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28sIHdlIHNob3VsZCByZWxheCBhZ2Fpbi4KLQkJICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLQkJICAgICphZ2FpbiA9IHRydWU7Ci0JCSAgICBicmVhazsKLQotCQkgIC8qIG1vdiBhbSwoYWJzMzIpICAgIC0+IG1vdiBhbSwoYWJzMTYpCi0JCSAgICAgbW92IGFtLChkMzIsc3ApICAgLT4gbW92IGFtLChkMTYsc3ApCi0JCSAgICAgbW92IGRtLChkMzIsc3ApICAgLT4gbW92IGRtLChkMzIsc3ApCi0JCSAgICAgbW92YnUgZG0sKGQzMixzcCkgLT4gbW92YnUgZG0sKGQzMixzcCkKLQkJICAgICBtb3ZodSBkbSwoZDMyLHNwKSAtPiBtb3ZodSBkbSwoZDMyLHNwKSAqLwotCQkgIGNhc2UgMHg4MDoKLQkJICBjYXNlIDB4OTA6Ci0JCSAgY2FzZSAweDkxOgotCQkgIGNhc2UgMHg5MjoKLQkJICBjYXNlIDB4OTM6Ci0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgLyogRml4IHRoZSBvcGNvZGUuICAqLwotCQkgICAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAxKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIERlbGV0ZSB0d28gYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDIsIDIpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIGVsc2UgaWYgKChjb2RlICYgMHhmMCkgPCAweGYwKQotCQlzd2l0Y2ggKGNvZGUgJiAweGZjKQotCQkgIHsKLQkJICAvKiBtb3YgaW1tMzIsZG4gICAgIC0+IG1vdiBpbW0xNixkbgotCQkgICAgIG1vdiBpbW0zMixhbiAgICAgLT4gbW92IGltbTE2LGFuCi0JCSAgICAgbW92IChhYnMzMiksZG4gICAtPiBtb3YgKGFiczE2KSxkbgotCQkgICAgIG1vdmJ1IChhYnMzMiksZG4gLT4gbW92YnUgKGFiczE2KSxkbgotCQkgICAgIG1vdmh1IChhYnMzMiksZG4gLT4gbW92aHUgKGFiczE2KSxkbiAgKi8KLQkJICBjYXNlIDB4Y2M6Ci0JCSAgY2FzZSAweGRjOgotCQkgIGNhc2UgMHhhNDoKLQkJICBjYXNlIDB4YTg6Ci0JCSAgY2FzZSAweGFjOgotCQkgICAgLyogTm90IHNhZmUgaWYgdGhlIGhpZ2ggYml0IGlzIG9uIGFzIHJlbGF4aW5nIG1heQotCQkgICAgICAgbW92ZSB0aGUgdmFsdWUgb3V0IG9mIGhpZ2ggbWVtIGFuZCB0aHVzIG5vdCBmaXQKLQkJICAgICAgIGluIGEgc2lnbmVkIDE2Yml0IHZhbHVlLiAgKi8KLQkJICAgIGlmIChjb2RlID09IDB4Y2MKLQkJCSYmICh2YWx1ZSAmIDB4ODAwMCkpCi0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NhdGlvbiBjb250ZW50cywgZXRjLiAgKi8KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkJICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkJICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JCSAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotCQkgICAgaWYgKChjb2RlICYgMHhmYykgPT0gMHhjYykKLQkJICAgICAgY29kZSA9IDB4MmMgKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGRjKQotCQkgICAgICBjb2RlID0gMHgyNCArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlIGlmICgoY29kZSAmIDB4ZmMpID09IDB4YTQpCi0JCSAgICAgIGNvZGUgPSAweDMwICsgKGNvZGUgJiAweDAzKTsKLQkJICAgIGVsc2UgaWYgKChjb2RlICYgMHhmYykgPT0gMHhhOCkKLQkJICAgICAgY29kZSA9IDB4MzQgKyAoY29kZSAmIDB4MDMpOwotCQkgICAgZWxzZSBpZiAoKGNvZGUgJiAweGZjKSA9PSAweGFjKQotCQkgICAgICBjb2RlID0gMHgzOCArIChjb2RlICYgMHgwMyk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGFib3J0ICgpOwotCi0JCSAgICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgLSAyKTsKLQotCQkgICAgLyogRml4IHRoZSByZWxvY2F0aW9uJ3MgdHlwZS4gICovCi0JCSAgICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAgIC8qIFRoZSBvcGNvZGUgZ290IHNob3J0ZXIgdG9vLCBzbyB3ZSBoYXZlIHRvIGZpeCB0aGUKLQkJICAgICAgIGFkZGVuZCBhbmQgb2Zmc2V0IHRvbyEgICovCi0JCSAgICBpcmVsLT5yX29mZnNldCAtPSAxOwotCi0JCSAgICAvKiBEZWxldGUgdGhyZWUgYnl0ZXMgb2YgZGF0YS4gICovCi0JCSAgICBpZiAoIW1uMTAzMDBfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLAotCQkJCQkJCSBpcmVsLT5yX29mZnNldCArIDEsIDMpKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCQkgICAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyBub3QgcmVxdWlyZWQsIGFuZCBpdCBtYXkgYmUgc2xvdy4gICovCi0JCSAgICAqYWdhaW4gPSB0cnVlOwotCQkgICAgYnJlYWs7Ci0KLQkJICAvKiBtb3YgKGFiczMyKSxhbiAgICAtPiBtb3YgKGFiczE2KSxhbgotCQkgICAgIG1vdiAoZDMyLHNwKSxhbiAgIC0+IG1vdiAoZDMyLHNwKSxhbgotCQkgICAgIG1vdiAoZDMyLHNwKSxkbiAgIC0+IG1vdiAoZDMyLHNwKSxkbgotCQkgICAgIG1vdmJ1IChkMzIsc3ApLGRuIC0+IG1vdmJ1IChkMzIsc3ApLGRuCi0JCSAgICAgbW92aHUgKGQzMixzcCksZG4gLT4gbW92aHUgKGQzMixzcCksZG4KLQkJICAgICBhZGQgaW1tMzIsZG4gICAgICAtPiBhZGQgaW1tMTYsZG4KLQkJICAgICBjbXAgaW1tMzIsZG4gICAgICAtPiBjbXAgaW1tMTYsZG4KLQkJICAgICBhZGQgaW1tMzIsYW4gICAgICAtPiBhZGQgaW1tMTYsYW4KLQkJICAgICBjbXAgaW1tMzIsYW4gICAgICAtPiBjbXAgaW1tMTYsYW4KLQkJICAgICBhbmQgaW1tMzIsZG4gICAgICAtPiBhbmQgaW1tMzIsZG4KLQkJICAgICBvciBpbW0zMixkbiAgICAgICAtPiBvciBpbW0zMixkbgotCQkgICAgIHhvciBpbW0zMixkbiAgICAgIC0+IHhvciBpbW0zMixkbgotCQkgICAgIGJ0c3QgaW1tMzIsZG4gICAgIC0+IGJ0c3QgaW1tMzIsZG4gKi8KLQotCQkgIGNhc2UgMHhhMDoKLQkJICBjYXNlIDB4YjA6Ci0JCSAgY2FzZSAweGIxOgotCQkgIGNhc2UgMHhiMjoKLQkJICBjYXNlIDB4YjM6Ci0JCSAgY2FzZSAweGMwOgotCQkgIGNhc2UgMHhjODoKLQotCQkgIGNhc2UgMHhkMDoKLQkJICBjYXNlIDB4ZDg6Ci0JCSAgY2FzZSAweGUwOgotCQkgIGNhc2UgMHhlMToKLQkJICBjYXNlIDB4ZTI6Ci0JCSAgY2FzZSAweGUzOgotCQkgICAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JCSAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0KLQkJICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLQotCQkgICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgZXh0c3ltczsKLQkJICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAgIC8qIEZpeCB0aGUgb3Bjb2RlLiAgKi8KLQkJICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmYSwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCAtIDIpOwotCQkgICAgYmZkX3B1dF84IChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAgIC8qIEZpeCB0aGUgcmVsb2NhdGlvbidzIHR5cGUuICAqLwotCQkgICAgaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJCSBSX01OMTAzMDBfMTYpOwotCi0JCSAgICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgICAgaWYgKCFtbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJCQkgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywgd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCQkgICAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICAgKmFnYWluID0gdHJ1ZTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICBlbHNlIGlmIChjb2RlID09IDB4ZmUpCi0JCXsKLQkJICAvKiBhZGQgaW1tMzIsc3AgLT4gYWRkIGltbTE2LHNwICAqLwotCi0JCSAgLyogTm90ZSB0aGF0IHdlJ3ZlIGNoYW5nZWQgdGhlIHJlbG9jYXRpb24gY29udGVudHMsIGV0Yy4gICovCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkJICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCQkgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0KLQkJICAvKiBGaXggdGhlIG9wY29kZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZhLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMik7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweGZlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0IC0gMSk7Ci0KLQkJICAvKiBGaXggdGhlIHJlbG9jYXRpb24ncyB0eXBlLiAgKi8KLQkJICBpcmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkJIFJfTU4xMDMwMF8xNik7Ci0KLQkJICAvKiBEZWxldGUgdHdvIGJ5dGVzIG9mIGRhdGEuICAqLwotCQkgIGlmICghbW4xMDMwMF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsCi0JCQkJCQkgICAgICAgaXJlbC0+cl9vZmZzZXQgKyAyLCAyKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgLyogVGhhdCB3aWxsIGNoYW5nZSB0aGluZ3MsIHNvLCB3ZSBzaG91bGQgcmVsYXggYWdhaW4uCi0JCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCQkgICphZ2FpbiA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgICAgZnJlZV9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCX0KLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2V4dHN5bXMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzeW1ib2xzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgc3ltdGFiX2hkci0+Y29udGVudHMgPSBleHRzeW1zOwotCX0KLSAgICAgIGZyZWVfZXh0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIHN0YWNrIHNpemUgYW5kIG1vdm0gYXJndW1lbnRzIGZvciB0aGUgZnVuY3Rpb24KLSAgIHJlZmVycmVkIHRvIGJ5IEhBU0ggYXQgYWRkcmVzcyBBRERSIGluIHNlY3Rpb24gd2l0aAotICAgY29udGVudHMgQ09OVEVOVFMsIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgdm9pZAotY29tcHV0ZV9mdW5jdGlvbl9pbmZvIChhYmZkLCBoYXNoLCBhZGRyLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgdW5zaWduZWQgY2hhciAqY29udGVudHM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZTEsIGJ5dGUyOwotICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgYSB2ZXJ5IHNtYWxsIHN1YnNldCBvZiB0aGUgcG9zc2libGUgcHJvbG9ndWUKLSAgICAgc2VxdWVuY2VzIGhlcmUuICBCYXNpY2FsbHkgd2UgbG9vayBmb3I6Ci0KLSAgICAgbW92bSBbZDIsZDMsYTIsYTNdLHNwIChvcHRpb25hbCkKLSAgICAgYWRkIDxzaXplPixzcCAob3B0aW9uYWwsIGFuZCBvbmx5IGZvciBzaXplcyB3aGljaCBmaXQgaW4gYW4gdW5zaWduZWQKLQkJICAgIDggYml0IG51bWJlcikKLQotICAgICBJZiB3ZSBmaW5kIGFueXRoaW5nIGVsc2UsIHdlIHF1aXQuICAqLwotCi0gIC8qIExvb2sgZm9yIG1vdm0gW3JlZ3NdLHNwICovCi0gIGJ5dGUxID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIpOwotICBieXRlMiA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyICsgMSk7Ci0KLSAgaWYgKGJ5dGUxID09IDB4Y2YpCi0gICAgewotICAgICAgaGFzaC0+bW92bV9hcmdzID0gYnl0ZTI7Ci0gICAgICBhZGRyICs9IDI7Ci0gICAgICBieXRlMSA9IGJmZF9nZXRfOCAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgICAgIGJ5dGUyID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAxKTsKLSAgICB9Ci0KLSAgLyogTm93IGZpZ3VyZSBvdXQgaG93IG11Y2ggc3RhY2sgc3BhY2Ugd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhlIG1vdm0KLSAgICAgaW5zdHJ1Y3Rpb24uICBXZSBuZWVkIHRoaXMga2VwdCBzZXBhcmF0ZSBmcm9tIHRoZSBmdW50aW9uJ3Mgbm9ybWFsCi0gICAgIHN0YWNrIHNwYWNlLiAgKi8KLSAgaWYgKGhhc2gtPm1vdm1fYXJncykKLSAgICB7Ci0gICAgICAvKiBTcGFjZSBmb3IgZDIuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4ODApCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFNwYWNlIGZvciBkMy4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHg0MCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gNDsKLQotICAgICAgLyogU3BhY2UgZm9yIGEyLiAgKi8KLSAgICAgIGlmIChoYXNoLT5tb3ZtX2FyZ3MgJiAweDIwKQotCWhhc2gtPm1vdm1fc3RhY2tfc2l6ZSArPSA0OwotCi0gICAgICAvKiBTcGFjZSBmb3IgYTMuICAqLwotICAgICAgaWYgKGhhc2gtPm1vdm1fYXJncyAmIDB4MTApCi0JaGFzaC0+bW92bV9zdGFja19zaXplICs9IDQ7Ci0KLSAgICAgIC8qICJvdGhlciIgc3BhY2UuICBkMCwgZDEsIGEwLCBhMSwgbWRyLCBsaXIsIGxhciwgNCBieXRlIHBhZC4gICovCi0gICAgICBpZiAoaGFzaC0+bW92bV9hcmdzICYgMHgwOCkKLQloYXNoLT5tb3ZtX3N0YWNrX3NpemUgKz0gOCAqIDQ7Ci0KLSAgICB9Ci0KLSAgLyogTm93IGxvb2sgZm9yIHRoZSB0d28gc3RhY2sgYWRqdXN0bWVudCB2YXJpYW50cy4gICovCi0gIGlmIChieXRlMSA9PSAweGY4ICYmIGJ5dGUyID09IDB4ZmUpCi0gICAgewotICAgICAgaW50IHRlbXAgPSBiZmRfZ2V0XzggKGFiZmQsIGNvbnRlbnRzICsgYWRkciArIDIpOwotICAgICAgdGVtcCA9ICgodGVtcCAmIDB4ZmYpIF4gKH4weDdmKSkgKyAweDgwOwotCi0gICAgICBoYXNoLT5zdGFja19zaXplID0gLXRlbXA7Ci0gICAgfQotICBlbHNlIGlmIChieXRlMSA9PSAweGZhICYmIGJ5dGUyID09IDB4ZmUpCi0gICAgewotICAgICAgaW50IHRlbXAgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgICAgIHRlbXAgPSAoKHRlbXAgJiAweGZmZmYpIF4gKH4weDdmZmYpKSArIDB4ODAwMDsKLSAgICAgIHRlbXAgPSAtdGVtcDsKLQotICAgICAgaWYgKHRlbXAgPCAyNTUpCi0JaGFzaC0+c3RhY2tfc2l6ZSA9IHRlbXA7Ci0gICAgfQotCi0gIC8qIElmIHRoZSB0b3RhbCBzdGFjayB0byBiZSBhbGxvY2F0ZWQgYnkgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gaXMgbW9yZQotICAgICB0aGFuIDI1NSBieXRlcywgdGhlbiB3ZSBjYW4ndCByZW1vdmUgdGhlIHN0YWNrIGFkanVzdG1lbnQgYnkgdXNpbmcKLSAgICAgImNhbGwiICh3ZSBtaWdodCBzdGlsbCBiZSBhYmxlIHRvIHJlbW92ZSB0aGUgIm1vdm0iIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGhhc2gtPnN0YWNrX3NpemUgKyBoYXNoLT5tb3ZtX3N0YWNrX3NpemUgPiAyNTUpCi0gICAgaGFzaC0+c3RhY2tfc2l6ZSA9IDA7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWRkciwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dHN5bXM7Ci0gIGludCBzaG5keCwgaW5kZXg7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGFsaWduOwotICBiZmRfdm1hIHRvYWRkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLSAgc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCi0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikpCi0JaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgotCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotICAgICAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopCi0JCSAgIChlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdKTsKLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiAoKHN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2VjCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnJvb3QudS5kZWYudmFsdWUgPCB0b2FkZHIpCi0JewotCSAgKHN5bV9oYXNoKS0+cm9vdC5yb290LnUuZGVmLnZhbHVlIC09IGNvdW50OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGEgc3ltYm9sIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gYWRkcmVzcywgZWxzZSByZXR1cm4KLSAgIGZhbHNlLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tbjEwMzAwX2VsZl9zeW1ib2xfYWRkcmVzc19wIChhYmZkLCBzZWMsIGV4dHN5bXMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBpbnQgc2huZHg7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoLCAqKnN5bV9oYXNoX2VuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIC8qIEV4YW1pbmUgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLSAgZXN5bSA9IGV4dHN5bXM7Ci0gIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyBlc3ltKyspCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsIGVzeW0sICZpc3ltKTsKLQotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmIGlzeW0uc3RfdmFsdWUgPT0gYWRkcikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3ltX2hhc2ggPSAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICoqKShlbGZfc3ltX2hhc2hlcyAoYWJmZCkpOwotICBzeW1faGFzaF9lbmQgPSAoc3ltX2hhc2gKLQkJICArIChzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pCi0JCSAgICAgLSBzeW10YWJfaGRyLT5zaF9pbmZvKSk7Ci0gIGZvciAoOyBzeW1faGFzaCA8IHN5bV9oYXNoX2VuZDsgc3ltX2hhc2grKykKLSAgICB7Ci0gICAgICBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKCpzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgKCpzeW1faGFzaCktPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9PSBhZGRyKQotCXJldHVybiB0cnVlOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgIHdoaWNoIHVzZXMgbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1tbjEwMzAwX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIGRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBtbjEwMzAwX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGlucHV0X2JmZCwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgIGludGVybmFsX3N5bXMsIHNlY3Rpb25zKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0JZnJlZSAoc2VjdGlvbnMpOwotICAgICAgc2VjdGlvbnMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLQlmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgICAgIGludGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotCWZyZWUgKGV4dGVybmFsX3N5bXMpOwotICAgICAgZXh0ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0JZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBkYXRhOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoaW50ZXJuYWxfcmVsb2NzICE9IE5VTEwKLSAgICAgICYmIGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgaWYgKGludGVybmFsX3N5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChpbnRlcm5hbF9zeW1zKTsKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogQXNzb3J0ZWQgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICAqLwotCi0vKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gTU4xMDMwMCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX21uMTAzMDBfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldC0+ZGlyZWN0X2NhbGxzID0gMDsKLSAgICAgIHJldC0+c3RhY2tfc2l6ZSA9IDA7Ci0gICAgICByZXQtPm1vdm1fc3RhY2tfc2l6ZSA9IDA7Ci0gICAgICByZXQtPmZsYWdzID0gMDsKLSAgICAgIHJldC0+bW92bV9hcmdzID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYW4gbW4xMDMwMCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX21uMTAzMDBfbGlua19oYXNoX3RhYmxlICopCi0JIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXQtPmZsYWdzID0gMDsKLSAgcmV0LT5zdGF0aWNfaGFzaF90YWJsZQotICAgID0gKChzdHJ1Y3QgZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGUgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQtPnN0YXRpY19oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnN0YXRpY19oYXNoX3RhYmxlLT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGYzMl9tbjEwMzAwX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0LT5zdGF0aWNfaGFzaF90YWJsZSk7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotc3RhdGljIGludAotZWxmX21uMTAzMDBfbWFjaCAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTU4xMDMwMF9NQUNIKQotICAgIHsKLSAgICAgIGNhc2UgRV9NTjEwMzAwX01BQ0hfTU4xMDMwMDoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBiZmRfbWFjaF9tbjEwMzAwOwotCi0gICAgfQotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGEgTU4xMDMwMCBFTEYgb2JqZWN0Ci0gICBmaWxlLiAgVGhpcyBnZXRzIHRoZSBNTjEwMzAwIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZQotICAgbnVtYmVyLiAgKi8KLQotLypBUkdTVVNFRCovCi12b2lkCi1fYmZkX21uMTAzMDBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gIHVuc2lnbmVkIGludCBpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmhkcnBwOwotICBjb25zdCBjaGFyICpuYW1lOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBiZmRfbWFjaF9tbjEwMzAwOgotCXZhbCA9IEVfTU4xMDMwMF9NQUNIX01OMTAzMDA7Ci0JYnJlYWs7Ci0KLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfiAoRUZfTU4xMDMwMF9NQUNIKTsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi1ib29sZWFuCi1fYmZkX21uMTAzMDBfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX21uMTAzMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZl9tbjEwMzAwX21hY2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX21uMTAzMDBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotICAgICAgJiYgYmZkX2dldF9tYWNoIChvYmZkKSA8IGJmZF9nZXRfbWFjaCAoaWJmZCkpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX2dldF9tYWNoIChpYmZkKSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfbW4xMDMwMF92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGYzMi1tbjEwMzAwIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbW4xMDMwMAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19NTjEwMzAwCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCW1uMTAzMDBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCTAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCW1uMTAzMDBfZWxmX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJbW4xMDMwMF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JbW4xMDMwMF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JbW4xMDMwMF9lbGZfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0JCQkJbW4xMDMwMF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJZWxmMzJfbW4xMDMwMF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0KLSNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIgJ18nCi0KLS8qIFNvIHdlIGNhbiBzZXQgYml0cyBpbiBlX2ZsYWdzLiAgKi8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9vYmplY3RfcAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2JmZF9tbjEwMzAwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZi5jIGIvYmZkL2VsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzVhMjE1Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDUyNzcgKzAsMCBAQAotLyogRUxGIGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi1TRUNUSU9OCi0JRUxGIGJhY2tlbmRzCi0KLQlCRkQgc3VwcG9ydCBmb3IgRUxGIGZvcm1hdHMgaXMgYmVpbmcgd29ya2VkIG9uLgotCUN1cnJlbnRseSwgdGhlIGJlc3Qgc3VwcG9ydGVkIGJhY2sgZW5kcyBhcmUgZm9yIHNwYXJjIGFuZCBpMzg2Ci0JKHJ1bm5pbmcgc3ZyNCBvciBTb2xhcmlzIDIpLgotCi0JRG9jdW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWxzIG9mIHRoZSBzdXBwb3J0IGNvZGUgc3RpbGwgbmVlZHMKLQl0byBiZSB3cml0dGVuLiAgVGhlIGNvZGUgaXMgY2hhbmdpbmcgcXVpY2tseSBlbm91Z2ggdGhhdCB3ZQotCWhhdmVuJ3QgYm90aGVyZWQgeWV0LgotICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jZGVmaW5lIEFSQ0hfU0laRSAwCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgSU5MSU5FIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm1ha2VfbWFwcGluZwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBtYXBfc2VjdGlvbnNfdG9fc2VnbWVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgZWxmX3NvcnRfc2VjdGlvbnMgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcmVwX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHN3YXBfb3V0X3N5bXMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKiosIGludCkpOwotc3RhdGljIGJvb2xlYW4gY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGNoYXIgKmVsZl9yZWFkIFBBUkFNUyAoKGJmZCAqLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGVsZl9mYWtlX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGFzc2lnbl9zZWN0aW9uX251bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IHN5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX21hcF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBnZXRfcHJvZ3JhbV9oZWFkZXJfc2l6ZSBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBTd2FwIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gYW5kIG91dC4gIFRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGlzCi0gICBjdXJyZW50bHkgc2l6ZSBpbmRlcGVuZGVudC4gIElmIHRoYXQgZXZlciBjaGFuZ2VzLCB0aGlzIGNvZGUgd2lsbAotICAgbmVlZCB0byBtb3ZlIGludG8gZWxmY29kZS5oLiAgKi8KLQotLyogU3dhcCBpbiBhIFZlcmRlZiBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRlZiAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICpkc3Q7Ci17Ci0gIGRzdC0+dmRfdmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF92ZXJzaW9uKTsKLSAgZHN0LT52ZF9mbGFncyAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZkX2ZsYWdzKTsKLSAgZHN0LT52ZF9uZHggICAgID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZkX25keCk7Ci0gIGRzdC0+dmRfY250ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52ZF9jbnQpOwotICBkc3QtPnZkX2hhc2ggICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfaGFzaCk7Ci0gIGRzdC0+dmRfYXV4ICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZF9hdXgpOwotICBkc3QtPnZkX25leHQgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVyZGVmIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRlZiAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52ZF92ZXJzaW9uLCBkc3QtPnZkX3ZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfZmxhZ3MsIGRzdC0+dmRfZmxhZ3MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dmRfbmR4LCBkc3QtPnZkX25keCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52ZF9jbnQsIGRzdC0+dmRfY250KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkX2hhc2gsIGRzdC0+dmRfaGFzaCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52ZF9hdXgsIGRzdC0+dmRfYXV4KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkX25leHQsIGRzdC0+dmRfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJkYXV4IHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1ZlcmRhdXggKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggKmRzdDsKLXsKLSAgZHN0LT52ZGFfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52ZGFfbmFtZSk7Ci0gIGRzdC0+dmRhX25leHQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dmRhX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcmRhdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJkYXV4X291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcmRhdXggKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1ZlcmRhdXggKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkYV9uYW1lLCBkc3QtPnZkYV9uYW1lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZkYV9uZXh0LCBkc3QtPnZkYV9uZXh0KTsKLX0KLQotLyogU3dhcCBpbiBhIFZlcm5lZWQgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuZWVkX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVybmVlZCAqZHN0OwotewotICBkc3QtPnZuX3ZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dm5fdmVyc2lvbik7Ci0gIGRzdC0+dm5fY250ICAgICA9IGJmZF9oX2dldF8xNiAoYWJmZCwgc3JjLT52bl9jbnQpOwotICBkc3QtPnZuX2ZpbGUgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fZmlsZSk7Ci0gIGRzdC0+dm5fYXV4ICAgICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bl9hdXgpOwotICBkc3QtPnZuX25leHQgICAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5fbmV4dCk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVybmVlZCBzdHJ1Y3R1cmUuICAqLwotCi12b2lkCi1fYmZkX2VsZl9zd2FwX3Zlcm5lZWRfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfVmVybmVlZCAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqZHN0OwotewotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dm5fdmVyc2lvbiwgZHN0LT52bl92ZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuX2NudCwgZHN0LT52bl9jbnQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5fZmlsZSwgZHN0LT52bl9maWxlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuX2F1eCwgZHN0LT52bl9hdXgpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+dm5fbmV4dCwgZHN0LT52bl9uZXh0KTsKLX0KLQotLyogU3dhcCBpbiBhIFZlcm5hdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuYXV4X2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfVmVybmF1eCAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqZHN0OwotewotICBkc3QtPnZuYV9oYXNoICA9IGJmZF9oX2dldF8zMiAoYWJmZCwgc3JjLT52bmFfaGFzaCk7Ci0gIGRzdC0+dm5hX2ZsYWdzID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuYV9mbGFncyk7Ci0gIGRzdC0+dm5hX290aGVyID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzcmMtPnZuYV9vdGhlcik7Ci0gIGRzdC0+dm5hX25hbWUgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBzcmMtPnZuYV9uYW1lKTsKLSAgZHN0LT52bmFfbmV4dCAgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHNyYy0+dm5hX25leHQpOwotfQotCi0vKiBTd2FwIG91dCBhIFZlcm5hdXggc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJuYXV4X291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1Zlcm5hdXggKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1Zlcm5hdXggKmRzdDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnZuYV9oYXNoLCBkc3QtPnZuYV9oYXNoKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPnZuYV9mbGFncywgZHN0LT52bmFfZmxhZ3MpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+dm5hX290aGVyLCBkc3QtPnZuYV9vdGhlcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfbmFtZSwgZHN0LT52bmFfbmFtZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT52bmFfbmV4dCwgZHN0LT52bmFfbmV4dCk7Ci19Ci0KLS8qIFN3YXAgaW4gYSBWZXJzeW0gc3RydWN0dXJlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfc3dhcF92ZXJzeW1faW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9WZXJzeW0gKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1ZlcnN5bSAqZHN0OwotewotICBkc3QtPnZzX3ZlcnMgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIHNyYy0+dnNfdmVycyk7Ci19Ci0KLS8qIFN3YXAgb3V0IGEgVmVyc3ltIHN0cnVjdHVyZS4gICovCi0KLXZvaWQKLV9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1ZlcnN5bSAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfVmVyc3ltICpkc3Q7Ci17Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT52c192ZXJzLCBkc3QtPnZzX3ZlcnMpOwotfQotCi0vKiBTdGFuZGFyZCBFTEYgaGFzaCBmdW5jdGlvbi4gIERvIG5vdCBjaGFuZ2UgdGhpcyBmdW5jdGlvbjsgeW91IHdpbGwKLSAgIGNhdXNlIGludmFsaWQgaGFzaCB0YWJsZXMgdG8gYmUgZ2VuZXJhdGVkLiAgKi8KLXVuc2lnbmVkIGxvbmcKLWJmZF9lbGZfaGFzaCAobmFtZSkKLSAgICAgQ09OU1QgdW5zaWduZWQgY2hhciAqbmFtZTsKLXsKLSAgdW5zaWduZWQgbG9uZyBoID0gMDsKLSAgdW5zaWduZWQgbG9uZyBnOwotICBpbnQgY2g7Ci0KLSAgd2hpbGUgKChjaCA9ICpuYW1lKyspICE9ICdcMCcpCi0gICAgewotICAgICAgaCA9IChoIDw8IDQpICsgY2g7Ci0gICAgICBpZiAoKGcgPSAoaCAmIDB4ZjAwMDAwMDApKSAhPSAwKQotCXsKLQkgIGggXj0gZyA+PiAyNDsKLQkgIC8qIFRoZSBFTEYgQUJJIHNheXMgYGggJj0gfmcnLCBidXQgdGhpcyBpcyBlcXVpdmFsZW50IGluCi0JICAgICB0aGlzIGNhc2UgYW5kIG9uIHNvbWUgbWFjaGluZXMgb25lIGluc24gaW5zdGVhZCBvZiB0d28uICAqLwotCSAgaCBePSBnOwotCX0KLSAgICB9Ci0gIHJldHVybiBoOwotfQotCi0vKiBSZWFkIGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBhdCBhIHNwZWNpZmllZCBvZmZzZXQgaW4gYW4gRUxGCi0gICBmaWxlLCBpbnRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciwgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlCi0gICBidWZmZXIuICovCi0KLXN0YXRpYyBjaGFyICoKLWVsZl9yZWFkIChhYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgY2hhciAqYnVmOwotCi0gIGlmICgoYnVmID0gYmZkX2FsbG9jIChhYmZkLCBzaXplKSkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBidWYsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBidWY7Ci19Ci0KLWJvb2xlYW4KLWJmZF9lbGZfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIC8qIHRoaXMganVzdCBkb2VzIGluaXRpYWxpemF0aW9uICovCi0gIC8qIGNvZmZfbWtvYmplY3QgemFsbG9jJ3Mgc3BhY2UgZm9yIHRkYXRhLmNvZmZfb2JqX2RhdGEgLi4uICovCi0gIGVsZl90ZGF0YSAoYWJmZCkgPSAoc3RydWN0IGVsZl9vYmpfdGRhdGEgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChlbGZfdGRhdGEgKGFiZmQpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBzaW5jZSBldmVyeXRoaW5nIGlzIGRvbmUgYXQgY2xvc2UgdGltZSwgZG8gd2UgbmVlZCBhbnkKLSAgICAgaW5pdGlhbGl6YXRpb24/ICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2xlYW4KLWJmZF9lbGZfbWtjb3JlZmlsZSAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgLyogSSB0aGluayB0aGlzIGNhbiBiZSBkb25lIGp1c3QgbGlrZSBhbiBvYmplY3QgZmlsZS4gKi8KLSAgcmV0dXJuIGJmZF9lbGZfbWtvYmplY3QgKGFiZmQpOwotfQotCi1jaGFyICoKLWJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIChhYmZkLCBzaGluZGV4KQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwotICBjaGFyICpzaHN0cnRhYiA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBzaHN0cnRhYnNpemU7Ci0KLSAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0gIGlmIChpX3NoZHJwID09IDAgfHwgaV9zaGRycFtzaGluZGV4XSA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHNoc3RydGFiID0gKGNoYXIgKikgaV9zaGRycFtzaGluZGV4XS0+Y29udGVudHM7Ci0gIGlmIChzaHN0cnRhYiA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vIGNhY2hlZCBvbmUsIGF0dGVtcHQgdG8gcmVhZCwgYW5kIGNhY2hlIHdoYXQgd2UgcmVhZC4gKi8KLSAgICAgIG9mZnNldCA9IGlfc2hkcnBbc2hpbmRleF0tPnNoX29mZnNldDsKLSAgICAgIHNoc3RydGFic2l6ZSA9IGlfc2hkcnBbc2hpbmRleF0tPnNoX3NpemU7Ci0gICAgICBzaHN0cnRhYiA9IGVsZl9yZWFkIChhYmZkLCBvZmZzZXQsIHNoc3RydGFic2l6ZSk7Ci0gICAgICBpX3NoZHJwW3NoaW5kZXhdLT5jb250ZW50cyA9IChQVFIpIHNoc3RydGFiOwotICAgIH0KLSAgcmV0dXJuIHNoc3RydGFiOwotfQotCi1jaGFyICoKLWJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsIHNoaW5kZXgsIHN0cmluZGV4KQotICAgICBiZmQgKiBhYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2hpbmRleDsKLSAgICAgdW5zaWduZWQgaW50IHN0cmluZGV4OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0gIGlmIChzdHJpbmRleCA9PSAwKQotICAgIHJldHVybiAiIjsKLQotICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdOwotCi0gIGlmIChoZHItPmNvbnRlbnRzID09IE5VTEwKLSAgICAgICYmIGJmZF9lbGZfZ2V0X3N0cl9zZWN0aW9uIChhYmZkLCBzaGluZGV4KSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChzdHJpbmRleCA+PSBoZHItPnNoX3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBpbnZhbGlkIHN0cmluZyBvZmZzZXQgJXUgPj0gJWx1IGZvciBzZWN0aW9uIGAlcyciKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN0cmluZGV4LCAodW5zaWduZWQgbG9uZykgaGRyLT5zaF9zaXplLAotCSAoKHNoaW5kZXggPT0gZWxmX2VsZmhlYWRlcihhYmZkKS0+ZV9zaHN0cm5keAotCSAgICYmIHN0cmluZGV4ID09IGhkci0+c2hfbmFtZSkKLQkgID8gIi5zaHN0cnRhYiIKLQkgIDogZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIgKGFiZmQsIGhkci0+c2hfbmFtZSkpKTsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgcmV0dXJuICgoY2hhciAqKSBoZHItPmNvbnRlbnRzKSArIHN0cmluZGV4OwotfQotCi0vKiBNYWtlIGEgQkZEIHNlY3Rpb24gZnJvbSBhbiBFTEYgc2VjdGlvbi4gIFdlIHN0b3JlIGEgcG9pbnRlciB0byB0aGUKLSAgIEJGRCBzZWN0aW9uIGluIHRoZSBiZmRfc2VjdGlvbiBmaWVsZCBvZiB0aGUgaGVhZGVyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBmbGFnd29yZCBmbGFnczsKLQotICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKHN0cmNtcCAobmFtZSwKLQkJCSAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24pKSA9PSAwKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBuZXdzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAobmV3c2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuZXdzZWN0LT5maWxlcG9zID0gaGRyLT5zaF9vZmZzZXQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3ZtYSAoYWJmZCwgbmV3c2VjdCwgaGRyLT5zaF9hZGRyKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgbmV3c2VjdCwgaGRyLT5zaF9zaXplKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBuZXdzZWN0LAotCQkJCSAgICAgIGJmZF9sb2cyIChoZHItPnNoX2FkZHJhbGlnbikpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmbGFncyA9IFNFQ19OT19GTEFHUzsKLSAgaWYgKGhkci0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotICAgIGZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGlmICgoaGRyLT5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBmbGFncyB8PSBTRUNfQUxMT0M7Ci0gICAgICBpZiAoaGRyLT5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0gICAgfQotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfV1JJVEUpID09IDApCi0gICAgZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfRVhFQ0lOU1RSKSAhPSAwKQotICAgIGZsYWdzIHw9IFNFQ19DT0RFOwotICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICBmbGFncyB8PSBTRUNfREFUQTsKLQotICAvKiBUaGUgZGVidWdnaW5nIHNlY3Rpb25zIGFwcGVhciB0byBiZSByZWNvZ25pemVkIG9ubHkgYnkgbmFtZSwgbm90Ci0gICAgIGFueSBzb3J0IG9mIGZsYWcuICAqLwotICBpZiAoc3RybmNtcCAobmFtZSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIiAtIDEpID09IDAKLSAgICAgIHx8IHN0cm5jbXAgKG5hbWUsICIubGluZSIsIHNpemVvZiAiLmxpbmUiIC0gMSkgPT0gMAotICAgICAgfHwgc3RybmNtcCAobmFtZSwgIi5zdGFiIiwgc2l6ZW9mICIuc3RhYiIgLSAxKSA9PSAwKQotICAgIGZsYWdzIHw9IFNFQ19ERUJVR0dJTkc7Ci0KLSAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCAuZ251LmxpbmtvbmNlLCB3ZQotICAgICBvbmx5IGxpbmsgYSBzaW5nbGUgY29weSBvZiB0aGUgc2VjdGlvbi4gIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0Ci0gICAgIGcrKy4gIGcrKyB3aWxsIGVtaXQgZWFjaCB0ZW1wbGF0ZSBleHBhbnNpb24gaW4gaXRzIG93biBzZWN0aW9uLgotICAgICBUaGUgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgYXMgd2Vhaywgc28gdGhhdCBtdWx0aXBsZSBkZWZpbml0aW9ucwotICAgICBhcmUgcGVybWl0dGVkLiAgVGhlIEdOVSBsaW5rZXIgZXh0ZW5zaW9uIGlzIHRvIGFjdHVhbGx5IGRpc2NhcmQKLSAgICAgYWxsIGJ1dCBvbmUgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ251LmxpbmtvbmNlIiwgc2l6ZW9mICIuZ251LmxpbmtvbmNlIiAtIDEpID09IDApCi0gICAgZmxhZ3MgfD0gU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIG5ld3NlY3QsIGZsYWdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKChmbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIHBoZHJzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgbG1hLgotICAgICAgICAgSWYgYWxsIHRoZSBwX3BhZGRyIGZpZWxkcyBhcmUgemVybywgd2UgaWdub3JlIHRoZW0sIHNpbmNlCi0gICAgICAgICBzb21lIEVMRiBsaW5rZXJzIHByb2R1Y2Ugc3VjaCBvdXRwdXQuICAqLwotICAgICAgcGhkciA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07IGkrKywgcGhkcisrKQotCXsKLQkgIGlmIChwaGRyLT5wX3BhZGRyICE9IDApCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW0pCi0JewotCSAgcGhkciA9IGVsZl90ZGF0YSAoYWJmZCktPnBoZHI7Ci0JICBmb3IgKGkgPSAwOyBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhudW07IGkrKywgcGhkcisrKQotCSAgICB7Ci0JICAgICAgaWYgKHBoZHItPnBfdHlwZSA9PSBQVF9MT0FECi0JCSAgJiYgcGhkci0+cF92YWRkciAhPSBwaGRyLT5wX3BhZGRyCi0JCSAgJiYgcGhkci0+cF92YWRkciA8PSBoZHItPnNoX2FkZHIKLQkJICAmJiAocGhkci0+cF92YWRkciArIHBoZHItPnBfbWVtc3oKLQkJICAgICAgPj0gaGRyLT5zaF9hZGRyICsgaGRyLT5zaF9zaXplKQotCQkgICYmICgoZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotCQkgICAgICB8fCAocGhkci0+cF9vZmZzZXQgPD0gKGJmZF92bWEpIGhkci0+c2hfb2Zmc2V0Ci0JCQkgICYmIChwaGRyLT5wX29mZnNldCArIHBoZHItPnBfZmlsZXN6Ci0JCQkgICAgICA+PSBoZHItPnNoX29mZnNldCArIGhkci0+c2hfc2l6ZSkpKSkKLQkJewotCQkgIG5ld3NlY3QtPmxtYSArPSBwaGRyLT5wX3BhZGRyIC0gcGhkci0+cF92YWRkcjsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBoZHItPmJmZF9zZWN0aW9uID0gbmV3c2VjdDsKLSAgZWxmX3NlY3Rpb25fZGF0YSAobmV3c2VjdCktPnRoaXNfaGRyID0gKmhkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2VsZl9maW5kX3NlY3Rpb24KLQotU1lOT1BTSVMKLQlzdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKmJmZF9lbGZfZmluZF9zZWN0aW9uIChiZmQgKmFiZmQsIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCUhlbHBlciBmdW5jdGlvbnMgZm9yIEdEQiB0byBsb2NhdGUgdGhlIHN0cmluZyB0YWJsZXMuCi0JU2luY2UgQkZEIGhpZGVzIHN0cmluZyB0YWJsZXMgZnJvbSBjYWxsZXJzLCBHREIgbmVlZHMgdG8gdXNlIGFuCi0JaW50ZXJuYWwgaG9vayB0byBmaW5kIHRoZW0uICBTdW4ncyAuc3RhYnN0ciwgaW4gcGFydGljdWxhciwKLQlpc24ndCBldmVuIHBvaW50ZWQgdG8gYnkgdGhlIC5zdGFiIHNlY3Rpb24sIHNvIG9yZGluYXJ5Ci0JbWVjaGFuaXNtcyB3b3VsZG4ndCB3b3JrIHRvIGZpbmQgaXQsIGV2ZW4gaWYgd2UgaGFkIHNvbWUuCi0qLwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKgotYmZkX2VsZl9maW5kX3NlY3Rpb24gKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgY2hhciAqc2hzdHJ0YWI7Ci0gIHVuc2lnbmVkIGludCBtYXg7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpZiAoaV9zaGRycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNoc3RydGFiID0gYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24KLQkoYWJmZCwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgpOwotICAgICAgaWYgKHNoc3RydGFiICE9IE5VTEwpCi0JewotCSAgbWF4ID0gZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0JICBmb3IgKGkgPSAxOyBpIDwgbWF4OyBpKyspCi0JICAgIGlmICghc3RyY21wICgmc2hzdHJ0YWJbaV9zaGRycFtpXS0+c2hfbmFtZV0sIG5hbWUpKQotCSAgICAgIHJldHVybiBpX3NoZHJwW2ldOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1jb25zdCBjaGFyICpjb25zdCBiZmRfZWxmX3NlY3Rpb25fdHlwZV9uYW1lc1tdID0gewotICAiU0hUX05VTEwiLCAiU0hUX1BST0dCSVRTIiwgIlNIVF9TWU1UQUIiLCAiU0hUX1NUUlRBQiIsCi0gICJTSFRfUkVMQSIsICJTSFRfSEFTSCIsICJTSFRfRFlOQU1JQyIsICJTSFRfTk9URSIsCi0gICJTSFRfTk9CSVRTIiwgIlNIVF9SRUwiLCAiU0hUX1NITElCIiwgIlNIVF9EWU5TWU0iLAotfTsKLQotLyogRUxGIHJlbG9jcyBhcmUgYWdhaW5zdCBzeW1ib2xzLiAgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUKLSAgIG91dHB1dCwgYW5kIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIG5vdGhpbmcKLSAgIGhhcyBnaXZlbiB1cyBhbnkgYWRkaXRpb25hbCBhZGRlbmQsIHRoZSByZXN1bHRpbmcgcmVsb2Mgd2lsbCBhbHNvCi0gICBiZSBhZ2FpbnN0IHRoZSBzYW1lIHN5bWJvbC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCB3YW50IHRvCi0gICBjaGFuZ2UgYW55dGhpbmcgYWJvdXQgdGhlIHdheSB0aGUgcmVsb2MgaXMgaGFuZGxlZCwgc2luY2UgaXQgd2lsbAotICAgYWxsIGJlIGRvbmUgYXQgZmluYWwgbGluayB0aW1lLiAgUmF0aGVyIHRoYW4gcHV0IHNwZWNpYWwgY2FzZSBjb2RlCi0gICBpbnRvIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIGFsbCB0aGUgcmVsb2MgdHlwZXMgdXNlIHRoaXMgaG93dG8KLSAgIGZ1bmN0aW9uLiAgSXQganVzdCBzaG9ydCBjaXJjdWl0cyB0aGUgcmVsb2MgaWYgcHJvZHVjaW5nCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotDAotLyogUHJpbnQgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBmYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBmYXJnOwotewotICBGSUxFICpmID0gKEZJTEUgKikgZmFyZzsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnA7Ci0gIGFzZWN0aW9uICpzOwotICBiZmRfYnl0ZSAqZHluYnVmID0gTlVMTDsKLQotICBwID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaSwgYzsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5Qcm9ncmFtIEhlYWRlcjpcbiIpKTsKLSAgICAgIGMgPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyssIHArKykKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCSAgY2hhciBidWZbMjBdOwotCi0JICBzd2l0Y2ggKHAtPnBfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFBUX05VTEw6IHMgPSAiTlVMTCI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0xPQUQ6IHMgPSAiTE9BRCI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0RZTkFNSUM6IHMgPSAiRFlOQU1JQyI7IGJyZWFrOwotCSAgICBjYXNlIFBUX0lOVEVSUDogcyA9ICJJTlRFUlAiOyBicmVhazsKLQkgICAgY2FzZSBQVF9OT1RFOiBzID0gIk5PVEUiOyBicmVhazsKLQkgICAgY2FzZSBQVF9TSExJQjogcyA9ICJTSExJQiI7IGJyZWFrOwotCSAgICBjYXNlIFBUX1BIRFI6IHMgPSAiUEhEUiI7IGJyZWFrOwotCSAgICBkZWZhdWx0OiBzcHJpbnRmIChidWYsICIweCVseCIsIHAtPnBfdHlwZSk7IHMgPSBidWY7IGJyZWFrOwotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiJThzIG9mZiAgICAweCIsIHMpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfb2Zmc2V0KTsKLQkgIGZwcmludGYgKGYsICIgdmFkZHIgMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX3ZhZGRyKTsKLQkgIGZwcmludGYgKGYsICIgcGFkZHIgMHgiKTsKLQkgIGZwcmludGZfdm1hIChmLCBwLT5wX3BhZGRyKTsKLQkgIGZwcmludGYgKGYsICIgYWxpZ24gMioqJXVcbiIsIGJmZF9sb2cyIChwLT5wX2FsaWduKSk7Ci0JICBmcHJpbnRmIChmLCAiICAgICAgICAgZmlsZXN6IDB4Iik7Ci0JICBmcHJpbnRmX3ZtYSAoZiwgcC0+cF9maWxlc3opOwotCSAgZnByaW50ZiAoZiwgIiBtZW1zeiAweCIpOwotCSAgZnByaW50Zl92bWEgKGYsIHAtPnBfbWVtc3opOwotCSAgZnByaW50ZiAoZiwgIiBmbGFncyAlYyVjJWMiLAotCQkgICAocC0+cF9mbGFncyAmIFBGX1IpICE9IDAgPyAncicgOiAnLScsCi0JCSAgIChwLT5wX2ZsYWdzICYgUEZfVykgIT0gMCA/ICd3JyA6ICctJywKLQkJICAgKHAtPnBfZmxhZ3MgJiBQRl9YKSAhPSAwID8gJ3gnIDogJy0nKTsKLQkgIGlmICgocC0+cF9mbGFncyAmfiAoUEZfUiB8IFBGX1cgfCBQRl9YKSkgIT0gMCkKLQkgICAgZnByaW50ZiAoZiwgIiAlbHgiLCBwLT5wX2ZsYWdzICZ+IChQRl9SIHwgUEZfVyB8IFBGX1gpKTsKLQkgIGZwcmludGYgKGYsICJcbiIpOwotCX0KLSAgICB9Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgZWxmc2VjOwotICAgICAgdW5zaWduZWQgbG9uZyBsaW5rOwotICAgICAgYmZkX2J5dGUgKmV4dGR5biwgKmV4dGR5bmVuZDsKLSAgICAgIHNpemVfdCBleHRkeW5zaXplOwotICAgICAgdm9pZCAoKnN3YXBfZHluX2luKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgUFRSLCBFbGZfSW50ZXJuYWxfRHluICopKTsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5EeW5hbWljIFNlY3Rpb246XG4iKSk7Ci0KLSAgICAgIGR5bmJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKGR5bmJ1ZiA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCAoUFRSKSBkeW5idWYsIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBzLT5fcmF3X3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotICAgICAgaWYgKGVsZnNlYyA9PSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLSAgICAgIGV4dGR5bnNpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9keW47Ci0gICAgICBzd2FwX2R5bl9pbiA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c3dhcF9keW5faW47Ci0KLSAgICAgIGV4dGR5biA9IGR5bmJ1ZjsKLSAgICAgIGV4dGR5bmVuZCA9IGV4dGR5biArIHMtPl9yYXdfc2l6ZTsKLSAgICAgIGZvciAoOyBleHRkeW4gPCBleHRkeW5lbmQ7IGV4dGR5biArPSBleHRkeW5zaXplKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGNoYXIgYWJbMjBdOwotCSAgYm9vbGVhbiBzdHJpbmdwOwotCi0JICAoKnN3YXBfZHluX2luKSAoYWJmZCwgKFBUUikgZXh0ZHluLCAmZHluKTsKLQotCSAgaWYgKGR5bi5kX3RhZyA9PSBEVF9OVUxMKQotCSAgICBicmVhazsKLQotCSAgc3RyaW5ncCA9IGZhbHNlOwotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzcHJpbnRmIChhYiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIGR5bi5kX3RhZyk7Ci0JICAgICAgbmFtZSA9IGFiOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTkVFREVEOiBuYW1lID0gIk5FRURFRCI7IHN0cmluZ3AgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICJQTFRSRUxTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVEdPVDogbmFtZSA9ICJQTFRHT1QiOyBicmVhazsKLQkgICAgY2FzZSBEVF9IQVNIOiBuYW1lID0gIkhBU0giOyBicmVhazsKLQkgICAgY2FzZSBEVF9TVFJUQUI6IG5hbWUgPSAiU1RSVEFCIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfU1lNVEFCOiBuYW1lID0gIlNZTVRBQiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEE6IG5hbWUgPSAiUkVMQSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTEFTWjogbmFtZSA9ICJSRUxBU1oiOyBicmVhazsKLQkgICAgY2FzZSBEVF9SRUxBRU5UOiBuYW1lID0gIlJFTEFFTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TVFJTWjogbmFtZSA9ICJTVFJTWiI7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTUVOVDogbmFtZSA9ICJTWU1FTlQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9JTklUOiBuYW1lID0gIklOSVQiOyBicmVhazsKLQkgICAgY2FzZSBEVF9GSU5JOiBuYW1lID0gIkZJTkkiOyBicmVhazsKLQkgICAgY2FzZSBEVF9TT05BTUU6IG5hbWUgPSAiU09OQU1FIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1JQQVRIOiBuYW1lID0gIlJQQVRIIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX1NZTUJPTElDOiBuYW1lID0gIlNZTUJPTElDIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMOiBuYW1lID0gIlJFTCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1JFTFNaOiBuYW1lID0gIlJFTFNaIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMRU5UOiBuYW1lID0gIlJFTEVOVCI7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTDogbmFtZSA9ICJQTFRSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9ERUJVRzogbmFtZSA9ICJERUJVRyI7IGJyZWFrOwotCSAgICBjYXNlIERUX1RFWFRSRUw6IG5hbWUgPSAiVEVYVFJFTCI7IGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogbmFtZSA9ICJKTVBSRUwiOyBicmVhazsKLQkgICAgY2FzZSBEVF9BVVhJTElBUlk6IG5hbWUgPSAiQVVYSUxJQVJZIjsgc3RyaW5ncCA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX0ZJTFRFUjogbmFtZSA9ICJGSUxURVIiOyBzdHJpbmdwID0gdHJ1ZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSU1lNOiBuYW1lID0gIlZFUlNZTSI7IGJyZWFrOwotCSAgICBjYXNlIERUX1ZFUkRFRjogbmFtZSA9ICJWRVJERUYiOyBicmVhazsKLQkgICAgY2FzZSBEVF9WRVJERUZOVU06IG5hbWUgPSAiVkVSREVGTlVNIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSTkVFRDogbmFtZSA9ICJWRVJORUVEIjsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfVkVSTkVFRE5VTTogbmFtZSA9ICJWRVJORUVETlVNIjsgYnJlYWs7Ci0JICAgIH0KLQotCSAgZnByaW50ZiAoZiwgIiAgJS0xMXMgIiwgbmFtZSk7Ci0JICBpZiAoISBzdHJpbmdwKQotCSAgICBmcHJpbnRmIChmLCAiMHglbHgiLCAodW5zaWduZWQgbG9uZykgZHluLmRfdW4uZF92YWwpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotCi0JICAgICAgc3RyaW5nID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgbGluaywKLQkJCQkJCQlkeW4uZF91bi5kX3ZhbCk7Ci0JICAgICAgaWYgKHN0cmluZyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcHJpbnRmIChmLCAiJXMiLCBzdHJpbmcpOwotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiXG4iKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGR5bmJ1Zik7Ci0gICAgICBkeW5idWYgPSBOVUxMOwotICAgIH0KLQotICBpZiAoKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0gICAgICB8fCAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPT0gTlVMTCkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9lbGZfc2x1cnBfdmVyc2lvbl90YWJsZXMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAqdDsKLQotICAgICAgZnByaW50ZiAoZiwgXygiXG5WZXJzaW9uIGRlZmluaXRpb25zOlxuIikpOwotICAgICAgZm9yICh0ID0gZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmOyB0ICE9IE5VTEw7IHQgPSB0LT52ZF9uZXh0ZGVmKQotCXsKLQkgIGZwcmludGYgKGYsICIlZCAweCUyLjJ4IDB4JTguOGx4ICVzXG4iLCB0LT52ZF9uZHgsCi0JCSAgIHQtPnZkX2ZsYWdzLCB0LT52ZF9oYXNoLCB0LT52ZF9ub2RlbmFtZSk7Ci0JICBpZiAodC0+dmRfYXV4cHRyLT52ZGFfbmV4dHB0ciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggKmE7Ci0KLQkgICAgICBmcHJpbnRmIChmLCAiXHQiKTsKLQkgICAgICBmb3IgKGEgPSB0LT52ZF9hdXhwdHItPnZkYV9uZXh0cHRyOwotCQkgICBhICE9IE5VTEw7Ci0JCSAgIGEgPSBhLT52ZGFfbmV4dHB0cikKLQkJZnByaW50ZiAoZiwgIiVzICIsIGEtPnZkYV9ub2RlbmFtZSk7Ci0JICAgICAgZnByaW50ZiAoZiwgIlxuIik7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChlbGZfZHludmVycmVmIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICp0OwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJcblZlcnNpb24gUmVmZXJlbmNlczpcbiIpKTsKLSAgICAgIGZvciAodCA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcnJlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dm5fbmV4dHJlZikKLQl7Ci0JICBFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQotCSAgZnByaW50ZiAoZiwgXygiICByZXF1aXJlZCBmcm9tICVzOlxuIiksIHQtPnZuX2ZpbGVuYW1lKTsKLQkgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JICAgIGZwcmludGYgKGYsICIgICAgMHglOC44bHggMHglMi4yeCAlMi4yZCAlc1xuIiwgYS0+dm5hX2hhc2gsCi0JCSAgICAgYS0+dm5hX2ZsYWdzLCBhLT52bmFfb3RoZXIsIGEtPnZuYV9ub2RlbmFtZSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGlzcGxheSBFTEYtc3BlY2lmaWMgZmllbGRzIG9mIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotYmZkX2VsZl9wcmludF9zeW1ib2wgKGFiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZXA7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGZpbGVwOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiZWxmICIpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHN5bWJvbC0+dmFsdWUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlbHgiLCAobG9uZykgc3ltYm9sLT5mbGFncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZTsKLQlzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPyBzeW1ib2wtPnNlY3Rpb24tPm5hbWUgOiAiKCpub25lKikiOwotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0JZnByaW50ZiAoZmlsZSwgIiAlc1x0Iiwgc2VjdGlvbl9uYW1lKTsKLQkvKiBQcmludCB0aGUgIm90aGVyIiB2YWx1ZSBmb3IgYSBzeW1ib2wuICBGb3IgY29tbW9uIHN5bWJvbHMsCi0JICAgd2UndmUgYWxyZWFkeSBwcmludGVkIHRoZSBzaXplOyBub3cgcHJpbnQgdGhlIGFsaWdubWVudC4KLQkgICBGb3Igb3RoZXIgc3ltYm9scywgd2UgaGF2ZSBubyBzcGVjaWZpZWQgYWxpZ25tZW50LCBhbmQKLQkgICB3ZSd2ZSBwcmludGVkIHRoZSBhZGRyZXNzOyBub3cgcHJpbnQgdGhlIHNpemUuICAqLwotCWZwcmludGZfdm1hIChmaWxlLAotCQkgICAgIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLQkJICAgICAgPyAoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlCi0JCSAgICAgIDogKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplKSk7Ci0KLQkvKiBJZiB3ZSBoYXZlIHZlcnNpb24gaW5mb3JtYXRpb24sIHByaW50IGl0LiAgKi8KLQlpZiAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyc3ltX3NlY3Rpb24gIT0gMAotCSAgICAmJiAoZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX3NlY3Rpb24gIT0gMAotCQl8fCBlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfc2VjdGlvbiAhPSAwKSkKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHZlcm51bTsKLQkgICAgY29uc3QgY2hhciAqdmVyc2lvbl9zdHJpbmc7Ci0KLQkgICAgdmVybnVtID0gKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+dmVyc2lvbiAmIFZFUlNZTV9WRVJTSU9OOwotCi0JICAgIGlmICh2ZXJudW0gPT0gMCkKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9ICIiOwotCSAgICBlbHNlIGlmICh2ZXJudW0gPT0gMSkKLQkgICAgICB2ZXJzaW9uX3N0cmluZyA9ICJCYXNlIjsKLQkgICAgZWxzZSBpZiAodmVybnVtIDw9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzKQotCSAgICAgIHZlcnNpb25fc3RyaW5nID0KLQkJZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmW3Zlcm51bSAtIDFdLnZkX25vZGVuYW1lOwotCSAgICBlbHNlCi0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfVmVybmVlZCAqdDsKLQotCQl2ZXJzaW9uX3N0cmluZyA9ICIiOwotCQlmb3IgKHQgPSBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWY7Ci0JCSAgICAgdCAhPSBOVUxMOwotCQkgICAgIHQgPSB0LT52bl9uZXh0cmVmKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0JCSAgICBmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgICAgICB7Ci0JCQlpZiAoYS0+dm5hX290aGVyID09IHZlcm51bSkKLQkJCSAgewotCQkJICAgIHZlcnNpb25fc3RyaW5nID0gYS0+dm5hX25vZGVuYW1lOwotCQkJICAgIGJyZWFrOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIGlmICgoKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+dmVyc2lvbiAmIFZFUlNZTV9ISURERU4pID09IDApCi0JICAgICAgZnByaW50ZiAoZmlsZSwgIiAgJS0xMXMiLCB2ZXJzaW9uX3N0cmluZyk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBpOwotCi0JCWZwcmludGYgKGZpbGUsICIgKCVzKSIsIHZlcnNpb25fc3RyaW5nKTsKLQkJZm9yIChpID0gMTAgLSBzdHJsZW4gKHZlcnNpb25fc3RyaW5nKTsgaSA+IDA7IC0taSkKLQkJICBwdXRjICgnICcsIGZpbGUpOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIElmIHRoZSBzdF9vdGhlciBmaWVsZCBpcyBub3QgemVybywgcHJpbnQgaXQuICAqLwotCWlmICgoKGVsZl9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X290aGVyICE9IDApCi0JICBmcHJpbnRmIChmaWxlLCAiIDB4JTAyeCIsCi0JCSAgICgodW5zaWduZWQgaW50KQotCQkgICAgKChlbGZfc3ltYm9sX3R5cGUgKikgc3ltYm9sKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcikpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0MCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmR4ID0gLTE7Ci0gICAgICByZXQtPnNpemUgPSAwOwotICAgICAgcmV0LT5keW5pbmR4ID0gLTE7Ci0gICAgICByZXQtPmR5bnN0cl9pbmRleCA9IDA7Ci0gICAgICByZXQtPndlYWtkZWYgPSBOVUxMOwotICAgICAgcmV0LT5nb3Qub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0LT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotICAgICAgcmV0LT5saW5rZXJfc2VjdGlvbl9wb2ludGVyID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopMDsKLSAgICAgIHJldC0+dmVyaW5mby52ZXJkZWYgPSBOVUxMOwotICAgICAgcmV0LT52dGFibGVfZW50cmllc191c2VkID0gTlVMTDsKLSAgICAgIHJldC0+dnRhYmxlX2VudHJpZXNfc2l6ZSA9IDA7Ci0gICAgICByZXQtPnZ0YWJsZV9wYXJlbnQgPSBOVUxMOwotICAgICAgcmV0LT50eXBlID0gU1RUX05PVFlQRTsKLSAgICAgIHJldC0+b3RoZXIgPSAwOwotICAgICAgLyogQXNzdW1lIHRoYXQgd2UgaGF2ZSBiZWVuIGNhbGxlZCBieSBhIG5vbi1FTEYgc3ltYm9sIHJlYWRlci4KLSAgICAgICAgIFRoaXMgZmxhZyBpcyB0aGVuIHJlc2V0IGJ5IHRoZSBjb2RlIHdoaWNoIHJlYWRzIGFuIEVMRiBpbnB1dAotICAgICAgICAgZmlsZS4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgc3ltYm9sIGNyZWF0ZWQgYnkgYSBub24tRUxGIHN5bWJvbAotICAgICAgICAgcmVhZGVyIHdpbGwgaGF2ZSB0aGUgZmxhZyBzZXQgY29ycmVjdGx5LiAgKi8KLSAgICAgIHJldC0+ZWxmX2xpbmtfaGFzaF9mbGFncyA9IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIGFiZmQsIG5ld2Z1bmMpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkID0gZmFsc2U7Ci0gIHRhYmxlLT5keW5vYmogPSBOVUxMOwotICAvKiBUaGUgZmlyc3QgZHluYW1pYyBzeW1ib2wgaXMgYSBkdW1teS4gICovCi0gIHRhYmxlLT5keW5zeW1jb3VudCA9IDE7Ci0gIHRhYmxlLT5keW5zdHIgPSBOVUxMOwotICB0YWJsZS0+YnVja2V0Y291bnQgPSAwOwotICB0YWJsZS0+bmVlZGVkID0gTlVMTDsKLSAgdGFibGUtPmhnb3QgPSBOVUxMOwotICB0YWJsZS0+c3RhYl9pbmZvID0gTlVMTDsKLSAgcmV0dXJuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+cm9vdCwgYWJmZCwgbmV3ZnVuYyk7Ci19Ci0KLS8qIENyZWF0ZSBhbiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKHJldCwgYWJmZCwgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBUaGlzIGlzIGEgaG9vayBmb3IgdGhlIEVMRiBlbXVsYXRpb24gY29kZSBpbiB0aGUgZ2VuZXJpYyBsaW5rZXIgdG8KLSAgIHRlbGwgdGhlIGJhY2tlbmQgbGlua2VyIHdoYXQgZmlsZSBuYW1lIHRvIHVzZSBmb3IgdGhlIERUX05FRURFRAotICAgZW50cnkgZm9yIGEgZHluYW1pYyBvYmplY3QuICBUaGUgZ2VuZXJpYyBsaW5rZXIgcGFzc2VzIG5hbWUgYXMgYW4KLSAgIGVtcHR5IHN0cmluZyB0byBpbmRpY2F0ZSB0aGF0IG5vIERUX05FRURFRCBlbnRyeSBzaG91bGQgYmUgbWFkZS4gICovCi0KLXZvaWQKLWJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0KQotICAgIGVsZl9kdF9uYW1lIChhYmZkKSA9IG5hbWU7Ci19Ci0KLS8qIEdldCB0aGUgbGlzdCBvZiBEVF9ORUVERUQgZW50cmllcyBmb3IgYSBsaW5rLiAgVGhpcyBpcyBhIGhvb2sgZm9yCi0gICB0aGUgbGlua2VyIEVMRiBlbXVsYXRpb24gY29kZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqCi1iZmRfZWxmX2dldF9uZWVkZWRfbGlzdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+bmVlZGVkOwotfQotCi0vKiBHZXQgdGhlIG5hbWUgYWN0dWFsbHkgdXNlZCBmb3IgYSBkeW5hbWljIG9iamVjdCBmb3IgYSBsaW5rLiAgVGhpcwotICAgaXMgdGhlIFNPTkFNRSBlbnRyeSBpZiB0aGVyZSBpcyBvbmUuICBPdGhlcndpc2UsIGl0IGlzIHRoZSBzdHJpbmcKLSAgIHBhc3NlZCB0byBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSwgb3IgaXQgaXMgdGhlIGZpbGVuYW1lLiAgKi8KLQotY29uc3QgY2hhciAqCi1iZmRfZWxmX2dldF9kdF9zb25hbWUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIGVsZl9kdF9uYW1lIChhYmZkKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdldCB0aGUgbGlzdCBvZiBEVF9ORUVERUQgZW50cmllcyBmcm9tIGEgQkZELiAgVGhpcyBpcyBhIGhvb2sgZm9yCi0gICB0aGUgRUxGIGxpbmtlciBlbXVsYXRpb24gY29kZS4gICovCi0KLWJvb2xlYW4KLWJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCAoYWJmZCwgcG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKipwbmVlZGVkOwotewotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKmR5bmJ1ZiA9IE5VTEw7Ci0gIGludCBlbGZzZWM7Ci0gIHVuc2lnbmVkIGxvbmcgbGluazsKLSAgYmZkX2J5dGUgKmV4dGR5biwgKmV4dGR5bmVuZDsKLSAgc2l6ZV90IGV4dGR5bnNpemU7Ci0gIHZvaWQgKCpzd2FwX2R5bl9pbikgUEFSQU1TICgoYmZkICosIGNvbnN0IFBUUiwgRWxmX0ludGVybmFsX0R5biAqKSk7Ci0KLSAgKnBuZWVkZWQgPSBOVUxMOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGFiZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZm9ybWF0IChhYmZkKSAhPSBiZmRfb2JqZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwgfHwgcy0+X3Jhd19zaXplID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHluYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChkeW5idWYgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIChQVFIpIGR5bmJ1ZiwgKGZpbGVfcHRyKSAwLAotCQkJCSAgcy0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotICBpZiAoZWxmc2VjID09IC0xKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGxpbmsgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2VsZnNlY10tPnNoX2xpbms7Ci0KLSAgZXh0ZHluc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+cy0+c2l6ZW9mX2R5bjsKLSAgc3dhcF9keW5faW4gPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnN3YXBfZHluX2luOwotCi0gIGV4dGR5biA9IGR5bmJ1ZjsKLSAgZXh0ZHluZW5kID0gZXh0ZHluICsgcy0+X3Jhd19zaXplOwotICBmb3IgKDsgZXh0ZHluIDwgZXh0ZHluZW5kOyBleHRkeW4gKz0gZXh0ZHluc2l6ZSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQotICAgICAgKCpzd2FwX2R5bl9pbikgKGFiZmQsIChQVFIpIGV4dGR5biwgJmR5bik7Ci0KLSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfTlVMTCkKLQlicmVhazsKLQotICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9ORUVERUQpCi0JewotCSAgY29uc3QgY2hhciAqc3RyaW5nOwotCSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpsOwotCi0JICBzdHJpbmcgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAotCQkJCQkJICAgIGR5bi5kX3VuLmRfdmFsKTsKLQkgIGlmIChzdHJpbmcgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGwgPSAoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICpsKTsKLQkgIGlmIChsID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBsLT5ieSA9IGFiZmQ7Ci0JICBsLT5uYW1lID0gc3RyaW5nOwotCSAgbC0+bmV4dCA9ICpwbmVlZGVkOwotCSAgKnBuZWVkZWQgPSBsOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAoZHluYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQwKLS8qIEFsbG9jYXRlIGFuIEVMRiBzdHJpbmcgdGFibGUtLWZvcmNlIHRoZSBmaXJzdCBieXRlIHRvIGJlIHplcm8uICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfZWxmX3N0cmluZ3RhYl9pbml0ICgpCi17Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnJldDsKLQotICByZXQgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsb2M7Ci0KLSAgICAgIGxvYyA9IF9iZmRfc3RyaW5ndGFiX2FkZCAocmV0LCAiIiwgdHJ1ZSwgZmFsc2UpOwotICAgICAgQkZEX0FTU0VSVCAobG9jID09IDAgfHwgbG9jID09IChiZmRfc2l6ZV90eXBlKSAtMSk7Ci0gICAgICBpZiAobG9jID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQl7Ci0JICBfYmZkX3N0cmluZ3RhYl9mcmVlIChyZXQpOwotCSAgcmV0ID0gTlVMTDsKLQl9Ci0gICAgfQotICByZXR1cm4gcmV0OwotfQotDAotLyogRUxGIC5vL2V4ZWMgZmlsZSByZWFkaW5nICovCi0KLS8qIENyZWF0ZSBhIG5ldyBiZmQgc2VjdGlvbiBmcm9tIGFuIEVMRiBzZWN0aW9uIGhlYWRlci4gKi8KLQotYm9vbGVhbgotYmZkX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBzaGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaGluZGV4OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XTsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmVoZHIgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgY2hhciAqbmFtZTsKLQotICBuYW1lID0gZWxmX3N0cmluZ19mcm9tX2VsZl9zdHJ0YWIgKGFiZmQsIGhkci0+c2hfbmFtZSk7Ci0KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX05VTEw6Ci0gICAgICAvKiBJbmFjdGl2ZSBzZWN0aW9uLiBUaHJvdyBpdCBhd2F5LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSBTSFRfUFJPR0JJVFM6CS8qIE5vcm1hbCBzZWN0aW9uIHdpdGggY29udGVudHMuICAqLwotICAgIGNhc2UgU0hUX0RZTkFNSUM6CS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgY2FzZSBTSFRfTk9CSVRTOgkvKiAuYnNzIHNlY3Rpb24uICAqLwotICAgIGNhc2UgU0hUX0hBU0g6CS8qIC5oYXNoIHNlY3Rpb24uICAqLwotICAgIGNhc2UgU0hUX05PVEU6CS8qIC5ub3RlIHNlY3Rpb24uICAqLwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLSAgICBjYXNlIFNIVF9TWU1UQUI6CQkvKiBBIHN5bWJvbCB0YWJsZSAqLwotICAgICAgaWYgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IHNoaW5kZXgpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGhkci0+c2hfZW50c2l6ZSA9PSBiZWQtPnMtPnNpemVvZl9zeW0pOwotICAgICAgQkZEX0FTU0VSVCAoZWxmX29uZXN5bXRhYiAoYWJmZCkgPT0gMCk7Ci0gICAgICBlbGZfb25lc3ltdGFiIChhYmZkKSA9IHNoaW5kZXg7Ci0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyID0gKmhkcjsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gICAgICAvKiBTb21ldGltZXMgYSBzaGFyZWQgb2JqZWN0IHdpbGwgbWFwIGluIHRoZSBzeW1ib2wgdGFibGUuICBJZgotICAgICAgICAgU0hGX0FMTE9DIGlzIHNldCwgYW5kIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCB0aGVuIHdlIGFsc28KLSAgICAgICAgIHRyZWF0IHRoaXMgc2VjdGlvbiBhcyBhIEJGRCBzZWN0aW9uLiAgV2UgY2FuIG5vdCBiYXNlIHRoZQotICAgICAgICAgZGVjaXNpb24gcHVyZWx5IG9uIFNIRl9BTExPQywgYmVjYXVzZSB0aGF0IGZsYWcgaXMgc29tZXRpbWVzCi0gICAgICAgICBzZXQgaW4gYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdGhlCi0gICAgICAgICBsaW5rZXIuICAqLwotICAgICAgaWYgKChoZHItPnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JICAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JICAmJiAhIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgU0hUX0RZTlNZTToJCS8qIEEgZHluYW1pYyBzeW1ib2wgdGFibGUgKi8KLSAgICAgIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSBzaGluZGV4KQotCXJldHVybiB0cnVlOwotCi0gICAgICBCRkRfQVNTRVJUIChoZHItPnNoX2VudHNpemUgPT0gYmVkLT5zLT5zaXplb2Zfc3ltKTsKLSAgICAgIEJGRF9BU1NFUlQgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApOwotICAgICAgZWxmX2R5bnN5bXRhYiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkciA9ICpoZHI7Ci0gICAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0gaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICAgICAgLyogQmVzaWRlcyBiZWluZyBhIHN5bWJvbCB0YWJsZSwgd2UgYWxzbyB0cmVhdCB0aGlzIGFzIGEgcmVndWxhcgotCSBzZWN0aW9uLCBzbyB0aGF0IG9iamNvcHkgY2FuIGhhbmRsZSBpdC4gICovCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1NUUlRBQjoJCS8qIEEgc3RyaW5nIHRhYmxlICovCi0gICAgICBpZiAoaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotCXJldHVybiB0cnVlOwotICAgICAgaWYgKGVoZHItPmVfc2hzdHJuZHggPT0gc2hpbmRleCkKLQl7Ci0JICBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIgPSAqaGRyOwotCSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHI7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAxOyBpIDwgZWhkci0+ZV9zaG51bTsgaSsrKQotCSAgewotCSAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyMiA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaV07Ci0JICAgIGlmIChoZHIyLT5zaF9saW5rID09IHNoaW5kZXgpCi0JICAgICAgewotCQlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKGVsZl9vbmVzeW10YWIgKGFiZmQpID09IGkpCi0JCSAgewotCQkgICAgZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkciA9ICpoZHI7Ci0JCSAgICBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NoaW5kZXhdID0KLQkJICAgICAgJmVsZl90ZGF0YSAoYWJmZCktPnN0cnRhYl9oZHI7Ci0JCSAgICByZXR1cm4gdHJ1ZTsKLQkJICB9Ci0JCWlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSBpKQotCQkgIHsKLQkJICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnN0cnRhYl9oZHIgPSAqaGRyOwotCQkgICAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkciA9Ci0JCSAgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zdHJ0YWJfaGRyOwotCQkgICAgLyogV2UgYWxzbyB0cmVhdCB0aGlzIGFzIGEgcmVndWxhciBzZWN0aW9uLCBzbwotCQkgICAgICAgdGhhdCBvYmpjb3B5IGNhbiBoYW5kbGUgaXQuICAqLwotCQkgICAgYnJlYWs7Ci0JCSAgfQotI2lmIDAgLyogTm90IGhhbmRsaW5nIG90aGVyIHN0cmluZyB0YWJsZXMgc3BlY2lhbGx5IHJpZ2h0IG5vdy4gICovCi0JCWhkcjIgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW2ldOwkvKiBpbiBjYXNlIGl0IG1vdmVkICovCi0JCS8qIFdlIGhhdmUgYSBzdHJ0YWIgZm9yIHNvbWUgcmFuZG9tIG90aGVyIHNlY3Rpb24uICAqLwotCQluZXdzZWN0ID0gKGFzZWN0aW9uICopIGhkcjItPmJmZF9zZWN0aW9uOwotCQlpZiAoIW5ld3NlY3QpCi0JCSAgYnJlYWs7Ci0JCWhkci0+YmZkX3NlY3Rpb24gPSBuZXdzZWN0OwotCQloZHIyID0gJmVsZl9zZWN0aW9uX2RhdGEgKG5ld3NlY3QpLT5zdHJfaGRyOwotCQkqaGRyMiA9ICpoZHI7Ci0JCWVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBoZHIyOwotI2VuZGlmCi0JICAgICAgfQotCSAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLQotICAgIGNhc2UgU0hUX1JFTDoKLSAgICBjYXNlIFNIVF9SRUxBOgotICAgICAgLyogKlRoZXNlKiBkbyBhIGxvdCBvZiB3b3JrIC0tIGJ1dCBidWlsZCBubyBzZWN0aW9ucyEgICovCi0gICAgICB7Ci0JYXNlY3Rpb24gKnRhcmdldF9zZWN0OwotCUVsZl9JbnRlcm5hbF9TaGRyICpoZHIyOwotCi0JLyogQ2hlY2sgZm9yIGEgYm9ndXMgbGluayB0byBhdm9pZCBjcmFzaGluZy4gICovCi0JaWYgKGhkci0+c2hfbGluayA+PSBlaGRyLT5lX3NobnVtKQotCSAgewotCSAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAoXygiJXM6IGludmFsaWQgbGluayAlbHUgZm9yIHJlbG9jIHNlY3Rpb24gJXMgKGluZGV4ICV1KSIpLAotCSAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBoZHItPnNoX2xpbmssIG5hbWUsIHNoaW5kZXgpKTsKLQkgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0JICB9Ci0KLQkvKiBGb3Igc29tZSBpbmNvbXByZWhlbnNpYmxlIHJlYXNvbiBPcmFjbGUgZGlzdHJpYnV0ZXMKLQkgICBsaWJyYXJpZXMgZm9yIFNvbGFyaXMgaW4gd2hpY2ggc29tZSBvZiB0aGUgb2JqZWN0cyBoYXZlCi0JICAgYm9ndXMgc2hfbGluayBmaWVsZHMuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGNvdWxkIGp1c3QKLQkgICByZWplY3QgdGhlbSwgYnV0LCB1bmZvcnR1bmF0ZWx5LCBzb21lIHBlb3BsZSBuZWVkIHRvIHVzZQotCSAgIHRoZW0uICBXZSBzY2FuIHRocm91Z2ggdGhlIHNlY3Rpb24gaGVhZGVyczsgaWYgd2UgZmluZCBvbmx5Ci0JICAgb25lIHN1aXRhYmxlIHN5bWJvbCB0YWJsZSwgd2UgY2xvYmJlciB0aGUgc2hfbGluayB0byBwb2ludAotCSAgIHRvIGl0LiAgSSBob3BlIHRoaXMgZG9lc24ndCBicmVhayBhbnl0aGluZy4gICovCi0JaWYgKGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfU1lNVEFCCi0JICAgICYmIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaGRyLT5zaF9saW5rXS0+c2hfdHlwZSAhPSBTSFRfRFlOU1lNKQotCSAgewotCSAgICBpbnQgc2NhbjsKLQkgICAgaW50IGZvdW5kOwotCi0JICAgIGZvdW5kID0gMDsKLQkgICAgZm9yIChzY2FuID0gMTsgc2NhbiA8IGVoZHItPmVfc2hudW07IHNjYW4rKykKLQkgICAgICB7Ci0JCWlmIChlbGZfZWxmc2VjdGlvbnMgKGFiZmQpW3NjYW5dLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLQkJICAgIHx8IGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2Nhbl0tPnNoX3R5cGUgPT0gU0hUX0RZTlNZTSkKLQkJICB7Ci0JCSAgICBpZiAoZm91bmQgIT0gMCkKLQkJICAgICAgewotCQkJZm91bmQgPSAwOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIGZvdW5kID0gc2NhbjsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoZm91bmQgIT0gMCkKLQkgICAgICBoZHItPnNoX2xpbmsgPSBmb3VuZDsKLQkgIH0KLQotCS8qIEdldCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQlpZiAoZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtoZHItPnNoX2xpbmtdLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLQkgICAgJiYgISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfbGluaykpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBJZiB0aGlzIHJlbG9jIHNlY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBtYWluIHN5bWJvbCB0YWJsZSB3ZQotCSAgIGRvbid0IHRyZWF0IGl0IGFzIGEgcmVsb2Mgc2VjdGlvbi4gIEJGRCBjYW4ndCBhZGVxdWF0ZWx5Ci0JICAgcmVwcmVzZW50IHN1Y2ggYSBzZWN0aW9uLCBzbyBhdCBsZWFzdCBmb3Igbm93LCB3ZSBkb24ndAotCSAgIHRyeS4gIFdlIGp1c3QgcHJlc2VudCBpdCBhcyBhIG5vcm1hbCBzZWN0aW9uLiAgKi8KLQlpZiAoaGRyLT5zaF9saW5rICE9IGVsZl9vbmVzeW10YWIgKGFiZmQpKQotCSAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0KLQlpZiAoISBiZmRfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkci0+c2hfaW5mbykpCi0JICByZXR1cm4gZmFsc2U7Ci0JdGFyZ2V0X3NlY3QgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaGRyLT5zaF9pbmZvKTsKLQlpZiAodGFyZ2V0X3NlY3QgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQotCWlmICgodGFyZ2V0X3NlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0JICAgIHx8IHRhcmdldF9zZWN0LT5yZWxvY19jb3VudCA9PSAwKQotCSAgaGRyMiA9ICZlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHI7Ci0JZWxzZQotCSAgewotCSAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID09IE5VTEwpOwotCSAgICBoZHIyID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaGRyMikpOwotCSAgICBlbGZfc2VjdGlvbl9kYXRhICh0YXJnZXRfc2VjdCktPnJlbF9oZHIyID0gaGRyMjsKLQkgIH0KLQkqaGRyMiA9ICpoZHI7Ci0JZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtzaGluZGV4XSA9IGhkcjI7Ci0JdGFyZ2V0X3NlY3QtPnJlbG9jX2NvdW50ICs9IGhkci0+c2hfc2l6ZSAvIGhkci0+c2hfZW50c2l6ZTsKLQl0YXJnZXRfc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCXRhcmdldF9zZWN0LT5yZWxvY2F0aW9uID0gTlVMTDsKLQl0YXJnZXRfc2VjdC0+cmVsX2ZpbGVwb3MgPSBoZHItPnNoX29mZnNldDsKLQkvKiBJbiB0aGUgc2VjdGlvbiB0byB3aGljaCB0aGUgcmVsb2NhdGlvbnMgYXBwbHksIG1hcmsgd2hldGhlcgotCSAgIGl0cyByZWxvY2F0aW9ucyBhcmUgb2YgdGhlIFJFTCBvciBSRUxBIHZhcmlldHkuICAqLwotCWVsZl9zZWN0aW9uX2RhdGEgKHRhcmdldF9zZWN0KS0+dXNlX3JlbGFfcCAKLQkgID0gKGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMQSk7Ci0JYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotCXJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNIVF9HTlVfdmVyZGVmOgotICAgICAgZWxmX2R5bnZlcmRlZiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVyZGVmX2hkciA9ICpoZHI7Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfR05VX3ZlcnN5bToKLSAgICAgIGVsZl9keW52ZXJzeW0gKGFiZmQpID0gc2hpbmRleDsKLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9oZHIgPSAqaGRyOwotICAgICAgcmV0dXJuIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hUX0dOVV92ZXJuZWVkOgotICAgICAgZWxmX2R5bnZlcnJlZiAoYWJmZCkgPSBzaGluZGV4OwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+ZHludmVycmVmX2hkciA9ICpoZHI7Ci0gICAgICByZXR1cm4gX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSFRfU0hMSUI6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBDaGVjayBmb3IgYW55IHByb2Nlc3Nvci1zcGVjaWZpYyBzZWN0aW9uIHR5cGVzLiAgKi8KLSAgICAgIHsKLQlpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikKLQkgICgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcikgKGFiZmQsIGhkciwgbmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdpdmVuIGFuIEVMRiBzZWN0aW9uIG51bWJlciwgcmV0cmlldmUgdGhlIGNvcnJlc3BvbmRpbmcgQkZECi0gICBzZWN0aW9uLiAgKi8KLQotYXNlY3Rpb24gKgotYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBpbmRleDsKLXsKLSAgQkZEX0FTU0VSVCAoaW5kZXggPiAwICYmIGluZGV4IDwgU0hOX0xPUkVTRVJWRSk7Ci0gIGlmIChpbmRleCA+PSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbaW5kZXhdLT5iZmRfc2VjdGlvbjsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2RhdGE7Ci0KLSAgc2RhdGEgPSAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqc2RhdGEpKTsKLSAgaWYgKCFzZGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNlYy0+dXNlZF9ieV9iZmQgPSAoUFRSKSBzZGF0YTsKLSAgbWVtc2V0IChzZGF0YSwgMCwgc2l6ZW9mICgqc2RhdGEpKTsKLQotICAvKiBJbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIHNlY3Rpb24gc2hvdWxkIHVzZSBSRUxBIHJlbG9jYXRpb25zLiAgKi8KLSAgc2RhdGEtPnVzZV9yZWxhX3AgCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmRlZmF1bHRfdXNlX3JlbGFfcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IGJmZCBzZWN0aW9uIGZyb20gYW4gRUxGIHByb2dyYW0gaGVhZGVyLgotCi0gICBTaW5jZSBwcm9ncmFtIHNlZ21lbnRzIGhhdmUgbm8gbmFtZXMsIHdlIGdlbmVyYXRlIGEgc3ludGhldGljIG5hbWUKLSAgIG9mIHRoZSBmb3JtIHNlZ21lbnQ8TlVNPiwgd2hlcmUgTlVNIGlzIGdlbmVyYWxseSB0aGUgaW5kZXggaW4gdGhlCi0gICBwcm9ncmFtIGhlYWRlciB0YWJsZS4gIEZvciBzZWdtZW50cyB0aGF0IGFyZSBzcGxpdCAoc2VlIGJlbG93KSB3ZQotICAgZ2VuZXJhdGUgdGhlIG5hbWVzIHNlZ21lbnQ8TlVNPmEgYW5kIHNlZ21lbnQ8TlVNPmIuCi0KLSAgIE5vdGUgdGhhdCBzb21lIHByb2dyYW0gc2VnbWVudHMgbWF5IGhhdmUgYSBmaWxlIHNpemUgdGhhdCBpcyBkaWZmZXJlbnQgdGhhbgotICAgKGxlc3MgdGhhbikgdGhlIG1lbW9yeSBzaXplLiAgQWxsIHRoaXMgbWVhbnMgaXMgdGhhdCBhdCBleGVjdXRpb24gdGhlCi0gICBzeXN0ZW0gbXVzdCBhbGxvY2F0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSBzcGVjaWZpZWQgYnkgdGhlIG1lbW9yeSBzaXplLAotICAgYnV0IG9ubHkgaW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBmaXJzdCAiZmlsZSBzaXplIiBieXRlcyByZWFkIGZyb20gdGhlCi0gICBmaWxlLiAgVGhpcyB3b3VsZCBvY2N1ciBmb3IgZXhhbXBsZSwgd2l0aCBwcm9ncmFtIHNlZ21lbnRzIGNvbnNpc3RpbmcKLSAgIG9mIGNvbWJpbmVkIGRhdGErYnNzLgotCi0gICBUbyBoYW5kbGUgdGhlIGFib3ZlIHNpdHVhdGlvbiwgdGhpcyByb3V0aW5lIGdlbmVyYXRlcyBUV08gYmZkIHNlY3Rpb25zCi0gICBmb3IgdGhlIHNpbmdsZSBwcm9ncmFtIHNlZ21lbnQuICBUaGUgZmlyc3QgaGFzIHRoZSBsZW5ndGggc3BlY2lmaWVkIGJ5Ci0gICB0aGUgZmlsZSBzaXplIG9mIHRoZSBzZWdtZW50LCBhbmQgdGhlIHNlY29uZCBoYXMgdGhlIGxlbmd0aCBzcGVjaWZpZWQKLSAgIGJ5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byBzaXplcy4gIEluIGVmZmVjdCwgdGhlIHNlZ21lbnQgaXMgc3BsaXQKLSAgIGludG8gaXQncyBpbml0aWFsaXplZCBhbmQgdW5pbml0aWFsaXplZCBwYXJ0cy4KLQotICovCi0KLWJvb2xlYW4KLWJmZF9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgaGRyLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaGRyOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVidWZbNjRdOwotICBpbnQgc3BsaXQ7Ci0KLSAgc3BsaXQgPSAoKGhkci0+cF9tZW1zeiA+IDApCi0JICAgICYmIChoZHItPnBfZmlsZXN6ID4gMCkKLQkgICAgJiYgKGhkci0+cF9tZW1zeiA+IGhkci0+cF9maWxlc3opKTsKLSAgc3ByaW50ZiAobmFtZWJ1Ziwgc3BsaXQgPyAic2VnbWVudCVkYSIgOiAic2VnbWVudCVkIiwgaW5kZXgpOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWVidWYpICsgMSk7Ci0gIGlmICghbmFtZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0cmNweSAobmFtZSwgbmFtZWJ1Zik7Ci0gIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld3NlY3QtPnZtYSA9IGhkci0+cF92YWRkcjsKLSAgbmV3c2VjdC0+bG1hID0gaGRyLT5wX3BhZGRyOwotICBuZXdzZWN0LT5fcmF3X3NpemUgPSBoZHItPnBfZmlsZXN6OwotICBuZXdzZWN0LT5maWxlcG9zID0gaGRyLT5wX29mZnNldDsKLSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLSAgaWYgKGhkci0+cF90eXBlID09IFBUX0xPQUQpCi0gICAgewotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0gICAgICBpZiAoaGRyLT5wX2ZsYWdzICYgUEZfWCkKLQl7Ci0JICAvKiBGSVhNRTogYWxsIHdlIGtub3duIGlzIHRoYXQgaXQgaGFzIGV4ZWN1dGUgUEVSTUlTU0lPTiwKLQkgICAgIG1heSBiZSBkYXRhLiAqLwotCSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JfQotICAgIH0KLSAgaWYgKCEoaGRyLT5wX2ZsYWdzICYgUEZfVykpCi0gICAgewotICAgICAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotICAgIH0KLQotICBpZiAoc3BsaXQpCi0gICAgewotICAgICAgc3ByaW50ZiAobmFtZWJ1ZiwgInNlZ21lbnQlZGIiLCBpbmRleCk7Ci0gICAgICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWVidWYpICsgMSk7Ci0gICAgICBpZiAoIW5hbWUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3RyY3B5IChuYW1lLCBuYW1lYnVmKTsKLSAgICAgIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgICAgIGlmIChuZXdzZWN0ID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmV3c2VjdC0+dm1hID0gaGRyLT5wX3ZhZGRyICsgaGRyLT5wX2ZpbGVzejsKLSAgICAgIG5ld3NlY3QtPmxtYSA9IGhkci0+cF9wYWRkciArIGhkci0+cF9maWxlc3o7Ci0gICAgICBuZXdzZWN0LT5fcmF3X3NpemUgPSBoZHItPnBfbWVtc3ogLSBoZHItPnBfZmlsZXN6OwotICAgICAgaWYgKGhkci0+cF90eXBlID09IFBUX0xPQUQpCi0JewotCSAgbmV3c2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgaWYgKGhkci0+cF9mbGFncyAmIFBGX1gpCi0JICAgIG5ld3NlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCX0KLSAgICAgIGlmICghKGhkci0+cF9mbGFncyAmIFBGX1cpKQotCW5ld3NlY3QtPmZsYWdzIHw9IFNFQ19SRUFET05MWTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB1cCBhbiBFTEYgaW50ZXJuYWwgc2VjdGlvbiBoZWFkZXIgZm9yIGEgc2VjdGlvbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWVsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBhc2VjdCwgZmFpbGVkcHRyYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgUFRSIGZhaWxlZHB0cmFyZzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgYm9vbGVhbiAqZmFpbGVkcHRyID0gKGJvb2xlYW4gKikgZmFpbGVkcHRyYXJnOwotICBFbGZfSW50ZXJuYWxfU2hkciAqdGhpc19oZHI7Ci0KLSAgaWYgKCpmYWlsZWRwdHIpCi0gICAgewotICAgICAgLyogV2UgYWxyZWFkeSBmYWlsZWQ7IGp1c3QgZ2V0IG91dCBvZiB0aGUgYmZkX21hcF9vdmVyX3NlY3Rpb25zCi0gICAgICAgICBsb29wLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT50aGlzX2hkcjsKLQotICB0aGlzX2hkci0+c2hfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9zaHN0cnRhYiAoYWJmZCksCi0JCQkJCQkJICBhc2VjdC0+bmFtZSwKLQkJCQkJCQkgIHRydWUsIGZhbHNlKTsKLSAgaWYgKHRoaXNfaGRyLT5zaF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLSAgICB7Ci0gICAgICAqZmFpbGVkcHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19oZHItPnNoX2ZsYWdzID0gMDsKLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgfHwgYXNlY3QtPnVzZXJfc2V0X3ZtYSkKLSAgICB0aGlzX2hkci0+c2hfYWRkciA9IGFzZWN0LT52bWE7Ci0gIGVsc2UKLSAgICB0aGlzX2hkci0+c2hfYWRkciA9IDA7Ci0KLSAgdGhpc19oZHItPnNoX29mZnNldCA9IDA7Ci0gIHRoaXNfaGRyLT5zaF9zaXplID0gYXNlY3QtPl9yYXdfc2l6ZTsKLSAgdGhpc19oZHItPnNoX2xpbmsgPSAwOwotICB0aGlzX2hkci0+c2hfYWRkcmFsaWduID0gMSA8PCBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyOwotICAvKiBUaGUgc2hfZW50c2l6ZSBhbmQgc2hfaW5mbyBmaWVsZHMgbWF5IGhhdmUgYmVlbiBzZXQgYWxyZWFkeSBieQotICAgICBjb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhLiAgKi8KLQotICB0aGlzX2hkci0+YmZkX3NlY3Rpb24gPSBhc2VjdDsKLSAgdGhpc19oZHItPmNvbnRlbnRzID0gTlVMTDsKLQotICAvKiBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIGJhc2VkIG9uIHNlY3Rpb24gbmFtZXMuICAqLwotICBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5keW5zdHIiKSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5oYXNoIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9IQVNIOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPmFyY2hfc2l6ZSAvIDg7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bnN5bSIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfRFlOU1lNOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9zeW07Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmR5bmFtaWMiKSA9PSAwKQotICAgIHsKLSAgICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX0RZTkFNSUM7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX2R5bjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JICAgJiYgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5tYXlfdXNlX3JlbGFfcCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9SRUxBOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBiZWQtPnMtPnNpemVvZl9yZWxhOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoYXNlY3QtPm5hbWUsICIucmVsIiwgNCkgPT0gMAotCSAgICYmIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+bWF5X3VzZV9yZWxfcCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9SRUw7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3JlbDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLm5vdGUiLCA1KSA9PSAwKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX05PVEU7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGFzZWN0LT5uYW1lLCAiLnN0YWIiLCA1KSA9PSAwCi0JICAgJiYgc3RyY21wIChhc2VjdC0+bmFtZSArIHN0cmxlbiAoYXNlY3QtPm5hbWUpIC0gMywgInN0ciIpID09IDApCi0gICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBlbHNlIGlmIChzdHJjbXAgKGFzZWN0LT5uYW1lLCAiLmdudS52ZXJzaW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9HTlVfdmVyc3ltOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhc2VjdC0+bmFtZSwgIi5nbnUudmVyc2lvbl9kIikgPT0gMCkKLSAgICB7Ci0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9HTlVfdmVyZGVmOwotICAgICAgdGhpc19oZHItPnNoX2VudHNpemUgPSAwOwotICAgICAgLyogb2JqY29weSBvciBzdHJpcCB3aWxsIGNvcHkgb3ZlciBzaF9pbmZvLCBidXQgbWF5IG5vdCBzZXQKLSAgICAgICAgIGN2ZXJkZWZzLiAgVGhlIGxpbmtlciB3aWxsIHNldCBjdmVyZGVmcywgYnV0IHNoX2luZm8gd2lsbCBiZQotICAgICAgICAgemVyby4gICovCi0gICAgICBpZiAodGhpc19oZHItPnNoX2luZm8gPT0gMCkKLQl0aGlzX2hkci0+c2hfaW5mbyA9IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzOwotICAgICAgZWxzZQotCUJGRF9BU1NFUlQgKGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzID09IDAKLQkJICAgIHx8IHRoaXNfaGRyLT5zaF9pbmZvID09IGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXNlY3QtPm5hbWUsICIuZ251LnZlcnNpb25fciIpID09IDApCi0gICAgewotICAgICAgdGhpc19oZHItPnNoX3R5cGUgPSBTSFRfR05VX3Zlcm5lZWQ7Ci0gICAgICB0aGlzX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICAvKiBvYmpjb3B5IG9yIHN0cmlwIHdpbGwgY29weSBvdmVyIHNoX2luZm8sIGJ1dCBtYXkgbm90IHNldAotICAgICAgICAgY3ZlcnJlZnMuICBUaGUgbGlua2VyIHdpbGwgc2V0IGN2ZXJyZWZzLCBidXQgc2hfaW5mbyB3aWxsIGJlCi0gICAgICAgICB6ZXJvLiAgKi8KLSAgICAgIGlmICh0aGlzX2hkci0+c2hfaW5mbyA9PSAwKQotCXRoaXNfaGRyLT5zaF9pbmZvID0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnM7Ci0gICAgICBlbHNlCi0JQkZEX0FTU0VSVCAoZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnMgPT0gMAotCQkgICAgfHwgdGhpc19oZHItPnNoX2luZm8gPT0gZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnMpOwotICAgIH0KLSAgZWxzZSBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICYmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLSAgZWxzZSBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICYmICgoYXNlY3QtPmZsYWdzICYgU0VDX0xPQUQpID09IDApKQotICAgIHRoaXNfaGRyLT5zaF90eXBlID0gU0hUX05PQklUUzsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdobyBrbm93cz8gICovCi0gICAgICB0aGlzX2hkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLSAgICB9Ci0KLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgdGhpc19oZHItPnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0gICAgdGhpc19oZHItPnNoX2ZsYWdzIHw9IFNIRl9XUklURTsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLSAgICB0aGlzX2hkci0+c2hfZmxhZ3MgfD0gU0hGX0VYRUNJTlNUUjsKLQotICAvKiBDaGVjayBmb3IgcHJvY2Vzc29yLXNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zKQotICAgICgqYmVkLT5lbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zKSAoYWJmZCwgdGhpc19oZHIsIGFzZWN0KTsKLQotICAvKiBJZiB0aGUgc2VjdGlvbiBoYXMgcmVsb2NzLCBzZXQgdXAgYSBzZWN0aW9uIGhlYWRlciBmb3IgdGhlCi0gICAgIFNIVF9SRUxbQV0gc2VjdGlvbi4gICovCi0gIGlmICgoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxhX2hkcjsKLSAgICAgIGludCB1c2VfcmVsYV9wID0gZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT51c2VfcmVsYV9wOwotICAgICAgY2hhciAqbmFtZTsKLQotICAgICAgcmVsYV9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoYXNlY3QpLT5yZWxfaGRyOwotICAgICAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICIucmVsYSIgKyBzdHJsZW4gKGFzZWN0LT5uYW1lKSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXsKLQkgICpmYWlsZWRwdHIgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNwcmludGYgKG5hbWUsICIlcyVzIiwgdXNlX3JlbGFfcCA/ICIucmVsYSIgOiAiLnJlbCIsIGFzZWN0LT5uYW1lKTsKLSAgICAgIHJlbGFfaGRyLT5zaF9uYW1lID0KLQkodW5zaWduZWQgaW50KSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9zaHN0cnRhYiAoYWJmZCksIG5hbWUsCi0JCQkJCSAgIHRydWUsIGZhbHNlKTsKLSAgICAgIGlmIChyZWxhX2hkci0+c2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMSkKLQl7Ci0JICAqZmFpbGVkcHRyID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICByZWxhX2hkci0+c2hfdHlwZSA9IHVzZV9yZWxhX3AgPyBTSFRfUkVMQSA6IFNIVF9SRUw7Ci0gICAgICByZWxhX2hkci0+c2hfZW50c2l6ZSA9ICh1c2VfcmVsYV9wCi0JCQkgICAgICA/IGJlZC0+cy0+c2l6ZW9mX3JlbGEKLQkJCSAgICAgIDogYmVkLT5zLT5zaXplb2ZfcmVsKTsKLSAgICAgIHJlbGFfaGRyLT5zaF9hZGRyYWxpZ24gPSBiZWQtPnMtPmZpbGVfYWxpZ247Ci0gICAgICByZWxhX2hkci0+c2hfZmxhZ3MgPSAwOwotICAgICAgcmVsYV9oZHItPnNoX2FkZHIgPSAwOwotICAgICAgcmVsYV9oZHItPnNoX3NpemUgPSAwOwotICAgICAgcmVsYV9oZHItPnNoX29mZnNldCA9IDA7Ci0gICAgfQotfQotCi0vKiBBc3NpZ24gYWxsIEVMRiBzZWN0aW9uIG51bWJlcnMuICBUaGUgZHVtbXkgZmlyc3Qgc2VjdGlvbiBpcyBoYW5kbGVkIGhlcmUKLSAgIHRvby4gIFRoZSBsaW5rL2luZm8gcG9pbnRlcnMgZm9yIHRoZSBzdGFuZGFyZCBzZWN0aW9uIHR5cGVzIGFyZSBmaWxsZWQKLSAgIGluIGhlcmUgdG9vLCB3aGlsZSB3ZSdyZSBhdCBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hc3NpZ25fc2VjdGlvbl9udW1iZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICp0ID0gZWxmX3RkYXRhIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fbnVtYmVyOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgc2VjdGlvbl9udW1iZXIgPSAxOwotCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqZCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyk7Ci0KLSAgICAgIGQtPnRoaXNfaWR4ID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQlkLT5yZWxfaWR4ID0gMDsKLSAgICAgIGVsc2UKLQlkLT5yZWxfaWR4ID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICB9Ci0KLSAgdC0+c2hzdHJ0YWJfc2VjdGlvbiA9IHNlY3Rpb25fbnVtYmVyKys7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4ID0gdC0+c2hzdHJ0YWJfc2VjdGlvbjsKLSAgdC0+c2hzdHJ0YWJfaGRyLnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfc2hzdHJ0YWIgKGFiZmQpKTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIHQtPnN5bXRhYl9zZWN0aW9uID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICAgIHQtPnN0cnRhYl9zZWN0aW9uID0gc2VjdGlvbl9udW1iZXIrKzsKLSAgICB9Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW0gPSBzZWN0aW9uX251bWJlcjsKLQotICAvKiBTZXQgdXAgdGhlIGxpc3Qgb2Ygc2VjdGlvbiBoZWFkZXIgcG9pbnRlcnMsIGluIGFncmVlbWVudCB3aXRoIHRoZQotICAgICBpbmRpY2VzLiAgKi8KLSAgaV9zaGRycCA9ICgoRWxmX0ludGVybmFsX1NoZHIgKiopCi0JICAgICBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb25fbnVtYmVyICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkciAqKSkpOwotICBpZiAoaV9zaGRycCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpX3NoZHJwWzBdID0gKChFbGZfSW50ZXJuYWxfU2hkciAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoRWxmX0ludGVybmFsX1NoZHIpKSk7Ci0gIGlmIChpX3NoZHJwWzBdID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGlfc2hkcnApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgbWVtc2V0IChpX3NoZHJwWzBdLCAwLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0KLSAgZWxmX2VsZnNlY3Rpb25zIChhYmZkKSA9IGlfc2hkcnA7Ci0KLSAgaV9zaGRycFt0LT5zaHN0cnRhYl9zZWN0aW9uXSA9ICZ0LT5zaHN0cnRhYl9oZHI7Ci0gIGlmIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA+IDApCi0gICAgewotICAgICAgaV9zaGRycFt0LT5zeW10YWJfc2VjdGlvbl0gPSAmdC0+c3ltdGFiX2hkcjsKLSAgICAgIGlfc2hkcnBbdC0+c3RydGFiX3NlY3Rpb25dID0gJnQtPnN0cnRhYl9oZHI7Ci0gICAgICB0LT5zeW10YWJfaGRyLnNoX2xpbmsgPSB0LT5zdHJ0YWJfc2VjdGlvbjsKLSAgICB9Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYzsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqZCA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyk7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIGlfc2hkcnBbZC0+dGhpc19pZHhdID0gJmQtPnRoaXNfaGRyOwotICAgICAgaWYgKGQtPnJlbF9pZHggIT0gMCkKLQlpX3NoZHJwW2QtPnJlbF9pZHhdID0gJmQtPnJlbF9oZHI7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIHNoX2xpbmsgYW5kIHNoX2luZm8gZmllbGRzIHdoaWxlIHdlJ3JlIGF0IGl0LiAgKi8KLQotICAgICAgLyogc2hfbGluayBvZiBhIHJlbG9jIHNlY3Rpb24gaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHN5bWJvbAotCSB0YWJsZS4gIHNoX2luZm8gaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlIHNlY3Rpb24gdG8gd2hpY2gKLQkgdGhlIHJlbG9jYXRpb24gZW50cmllcyBhcHBseS4gICovCi0gICAgICBpZiAoZC0+cmVsX2lkeCAhPSAwKQotCXsKLQkgIGQtPnJlbF9oZHIuc2hfbGluayA9IHQtPnN5bXRhYl9zZWN0aW9uOwotCSAgZC0+cmVsX2hkci5zaF9pbmZvID0gZC0+dGhpc19pZHg7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGQtPnRoaXNfaGRyLnNoX3R5cGUpCi0JewotCWNhc2UgU0hUX1JFTDoKLQljYXNlIFNIVF9SRUxBOgotCSAgLyogQSByZWxvYyBzZWN0aW9uIHdoaWNoIHdlIGFyZSB0cmVhdGluZyBhcyBhIG5vcm1hbCBCRkQKLQkgICAgIHNlY3Rpb24uICBzaF9saW5rIGlzIHRoZSBzZWN0aW9uIGluZGV4IG9mIHRoZSBzeW1ib2wKLQkgICAgIHRhYmxlLiAgc2hfaW5mbyBpcyB0aGUgc2VjdGlvbiBpbmRleCBvZiB0aGUgc2VjdGlvbiB0bwotCSAgICAgd2hpY2ggdGhlIHJlbG9jYXRpb24gZW50cmllcyBhcHBseS4gIFdlIGFzc3VtZSB0aGF0IGFuCi0JICAgICBhbGxvY2F0ZWQgcmVsb2Mgc2VjdGlvbiB1c2VzIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLQkgICAgIEZJWE1FOiBIb3cgY2FuIHdlIGJlIHN1cmU/ICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN5bSIpOwotCSAgaWYgKHMgIT0gTlVMTCkKLQkgICAgZC0+dGhpc19oZHIuc2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2lkeDsKLQotCSAgLyogV2UgbG9vayB1cCB0aGUgc2VjdGlvbiB0aGUgcmVsb2NzIGFwcGx5IHRvIGJ5IG5hbWUuICAqLwotCSAgbmFtZSA9IHNlYy0+bmFtZTsKLQkgIGlmIChkLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUwpCi0JICAgIG5hbWUgKz0gNDsKLQkgIGVsc2UKLQkgICAgbmFtZSArPSA1OwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGQtPnRoaXNfaGRyLnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX1NUUlRBQjoKLQkgIC8qIFdlIGFzc3VtZSB0aGF0IGEgc2VjdGlvbiBuYW1lZCAuc3RhYipzdHIgaXMgYSBzdGFicwotCSAgICAgc3RyaW5nIHNlY3Rpb24uICBXZSBsb29rIGZvciBhIHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lCi0JICAgICBidXQgd2l0aG91dCB0aGUgdHJhaWxpbmcgYGBzdHInJywgYW5kIHNldCBpdHMgc2hfbGluawotCSAgICAgZmllbGQgdG8gcG9pbnQgdG8gdGhpcyBzZWN0aW9uLiAgKi8KLQkgIGlmIChzdHJuY21wIChzZWMtPm5hbWUsICIuc3RhYiIsIHNpemVvZiAiLnN0YWIiIC0gMSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoc2VjLT5uYW1lICsgc3RybGVuIChzZWMtPm5hbWUpIC0gMywgInN0ciIpID09IDApCi0JICAgIHsKLQkgICAgICBzaXplX3QgbGVuOwotCSAgICAgIGNoYXIgKmFsYzsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoc2VjLT5uYW1lKTsKLQkgICAgICBhbGMgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChsZW4gLSAyKTsKLQkgICAgICBpZiAoYWxjID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzdHJuY3B5IChhbGMsIHNlYy0+bmFtZSwgbGVuIC0gMyk7Ci0JICAgICAgYWxjW2xlbiAtIDNdID0gJ1wwJzsKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIGFsYyk7Ci0JICAgICAgZnJlZSAoYWxjKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPSBkLT50aGlzX2lkeDsKLQotCQkgIC8qIFRoaXMgaXMgYSAuc3RhYiBzZWN0aW9uLiAgKi8KLQkJICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JCSAgICA0ICsgMiAqIChiZWQtPnMtPmFyY2hfc2l6ZSAvIDgpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfRFlOQU1JQzoKLQljYXNlIFNIVF9EWU5TWU06Ci0JY2FzZSBTSFRfR05VX3Zlcm5lZWQ6Ci0JY2FzZSBTSFRfR05VX3ZlcmRlZjoKLQkgIC8qIHNoX2xpbmsgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIGluZGV4IG9mIHRoZSBzdHJpbmcgdGFibGUKLQkgICAgIHVzZWQgZm9yIHRoZSBkeW5hbWljIGVudHJpZXMsIG9yIHRoZSBzeW1ib2wgdGFibGUsIG9yIHRoZQotCSAgICAgdmVyc2lvbiBzdHJpbmdzLiAgKi8KLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zdHIiKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGQtPnRoaXNfaGRyLnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0hBU0g6Ci0JY2FzZSBTSFRfR05VX3ZlcnN5bToKLQkgIC8qIHNoX2xpbmsgaXMgdGhlIHNlY3Rpb24gaGVhZGVyIGluZGV4IG9mIHRoZSBzeW1ib2wgdGFibGUKLQkgICAgIHRoaXMgaGFzaCB0YWJsZSBvciB2ZXJzaW9uIHRhYmxlIGlzIGZvci4gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0JICBpZiAocyAhPSBOVUxMKQotCSAgICBkLT50aGlzX2hkci5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFwIHN5bWJvbCBmcm9tIGl0J3MgaW50ZXJuYWwgbnVtYmVyIHRvIHRoZSBleHRlcm5hbCBudW1iZXIsIG1vdmluZwotICAgYWxsIGxvY2FsIHN5bWJvbHMgdG8gYmUgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgLyogSWYgdGhlIGJhY2tlbmQgaGFzIGEgc3BlY2lhbCBtYXBwaW5nLCB1c2UgaXQuICAqLwotICBpZiAoZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsKQotICAgIHJldHVybiAoKCpnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwpCi0JICAgIChhYmZkLCBzeW0pKTsKLQotICByZXR1cm4gKChzeW0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpICE9IDAKLQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tYXBfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgYXN5bWJvbCAqKnN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICBhc3ltYm9sICoqc2VjdF9zeW1zOwotICBpbnQgbnVtX2xvY2FscyA9IDA7Ci0gIGludCBudW1fZ2xvYmFscyA9IDA7Ci0gIGludCBudW1fbG9jYWxzMiA9IDA7Ci0gIGludCBudW1fZ2xvYmFsczIgPSAwOwotICBpbnQgbWF4X2luZGV4ID0gMDsKLSAgaW50IG51bV9zZWN0aW9ucyA9IDA7Ci0gIGludCBpZHg7Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgYXN5bWJvbCAqKm5ld19zeW1zOwotICBhc3ltYm9sICpzeW07Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJlbGZfbWFwX3N5bWJvbHNcbiIpOwotICBmZmx1c2ggKHN0ZGVycik7Ci0jZW5kaWYKLQotICAvKiBBZGQgYSBzZWN0aW9uIHN5bWJvbCBmb3IgZWFjaCBCRkQgc2VjdGlvbi4gIEZJWE1FOiBJcyB0aGlzIHJlYWxseQotICAgICBuZWNlc3Nhcnk/ICAqLwotICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChtYXhfaW5kZXggPCBhc2VjdC0+aW5kZXgpCi0JbWF4X2luZGV4ID0gYXNlY3QtPmluZGV4OwotICAgIH0KLQotICBtYXhfaW5kZXgrKzsKLSAgc2VjdF9zeW1zID0gKGFzeW1ib2wgKiopIGJmZF96YWxsb2MgKGFiZmQsIG1heF9pbmRleCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIGlmIChzZWN0X3N5bXMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsZl9zZWN0aW9uX3N5bXMgKGFiZmQpID0gc2VjdF9zeW1zOwotCi0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc3ltY291bnQ7IGlkeCsrKQotICAgIHsKLSAgICAgIHN5bSA9IHN5bXNbaWR4XTsKLSAgICAgIAotICAgICAgaWYgKChzeW0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0JICAmJiBzeW0tPnZhbHVlID09IDApCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgc2VjID0gc3ltLT5zZWN0aW9uOwotCi0JICBpZiAoc2VjLT5vd25lciAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHNlYy0+b3duZXIgIT0gYWJmZCkKLQkJewotCQkgIGlmIChzZWMtPm91dHB1dF9vZmZzZXQgIT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCQkgIAotCQkgIHNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0KLQkJICAvKiBFbXB0eSBzZWN0aW9ucyBpbiB0aGUgaW5wdXQgZmlsZXMgbWF5IGhhdmUgaGFkIGEgc2VjdGlvbgotCQkgICAgIHN5bWJvbCBjcmVhdGVkIGZvciB0aGVtLiAgKFNlZSB0aGUgY29tbWVudCBuZWFyIHRoZSBlbmQgb2YKLQkJICAgICBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyBpbiBsaW5rZXIuYykuICBJZiB0aGUgbGlua2VyCi0JCSAgICAgc2NyaXB0IGRpc2NhcmRzIHN1Y2ggc2VjdGlvbnMgdGhlbiB3ZSB3aWxsIHJlYWNoIHRoaXMgcG9pbnQuCi0JCSAgICAgU2luY2Ugd2Uga25vdyB0aGF0IHdlIGNhbm5vdCBhdm9pZCB0aGlzIGNhc2UsIHdlIGRldGVjdCBpdAotCQkgICAgIGFuZCBza2lwIHRoZSBhYm9ydCBhbmQgdGhlIGFzc2lnbm1lbnQgdG8gdGhlIHNlY3Rfc3ltcyBhcnJheS4KLQkJICAgICBUbyByZXByb2R1Y2UgdGhpcyBwYXJ0aWN1bGFyIGNhc2UgdHJ5IHJ1bm5pbmcgdGhlIGxpbmtlcgotCQkgICAgIHRlc3RzdWl0ZSB0ZXN0IGxkLXNjcmlwdHMvd2Vhay5leHAgZm9yIGFuIEVMRiBwb3J0IHRoYXQgdXNlcwotCQkgICAgIHRoZSBnZW5lcmljIGxpbmtlci4gICovCi0JCSAgaWYgKHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgQkZEX0FTU0VSVCAoc2VjLT5vd25lciA9PSBhYmZkKTsKLQkJfQotCSAgICAgIHNlY3Rfc3ltc1tzZWMtPmluZGV4XSA9IHN5bXNbaWR4XTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yIChhc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBhc2VjdDsgYXNlY3QgPSBhc2VjdC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gIT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgc3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzeW0tPnRoZV9iZmQgPSBhYmZkOwotICAgICAgc3ltLT5uYW1lID0gYXNlY3QtPm5hbWU7Ci0gICAgICBzeW0tPnZhbHVlID0gMDsKLSAgICAgIC8qIFNldCB0aGUgZmxhZ3MgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgb25lIHdhcyBuZXdseSBhZGRlZC4gICovCi0gICAgICBzeW0tPmZsYWdzID0gMDsKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGFzZWN0OwotICAgICAgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0gPSBzeW07Ci0gICAgICBudW1fc2VjdGlvbnMrKzsKLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLAotIF8oImNyZWF0aW5nIHNlY3Rpb24gc3ltYm9sLCBuYW1lID0gJXMsIHZhbHVlID0gMHglLjhseCwgaW5kZXggPSAlZCwgc2VjdGlvbiA9IDB4JS44bHhcbiIpLAotCSAgICAgICBhc2VjdC0+bmFtZSwgKGxvbmcpIGFzZWN0LT52bWEsIGFzZWN0LT5pbmRleCwgKGxvbmcpIGFzZWN0KTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBDbGFzc2lmeSBhbGwgb2YgdGhlIHN5bWJvbHMuICAqLwotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHN5bWNvdW50OyBpZHgrKykKLSAgICB7Ci0gICAgICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bXNbaWR4XSkpCi0JbnVtX2xvY2FscysrOwotICAgICAgZWxzZQotCW51bV9nbG9iYWxzKys7Ci0gICAgfQotICBmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFzZWN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWN0X3N5bXNbYXNlY3QtPmluZGV4XSAhPSBOVUxMCi0JICAmJiBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPT0gMCkKLQl7Ci0JICBzZWN0X3N5bXNbYXNlY3QtPmluZGV4XS0+ZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdKSkKLQkgICAgbnVtX2xvY2FscysrOwotCSAgZWxzZQotCSAgICBudW1fZ2xvYmFscysrOwotCSAgc2VjdF9zeW1zW2FzZWN0LT5pbmRleF0tPmZsYWdzID0gMDsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBzb3J0IHRoZSBzeW1ib2xzIHNvIHRoZSBsb2NhbCBzeW1ib2xzIGFyZSBmaXJzdC4gICovCi0gIG5ld19zeW1zID0gKChhc3ltYm9sICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAobnVtX2xvY2FscyArIG51bV9nbG9iYWxzKSAqIHNpemVvZiAoYXN5bWJvbCAqKSkpOwotICBpZiAobmV3X3N5bXMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gc3ltc1tpZHhdOwotICAgICAgaW50IGk7Ci0KLSAgICAgIGlmICghc3ltX2lzX2dsb2JhbCAoYWJmZCwgc3ltKSkKLQlpID0gbnVtX2xvY2FsczIrKzsKLSAgICAgIGVsc2UKLQlpID0gbnVtX2xvY2FscyArIG51bV9nbG9iYWxzMisrOwotICAgICAgbmV3X3N5bXNbaV0gPSBzeW07Ci0gICAgICBzeW0tPnVkYXRhLmkgPSBpICsgMTsKLSAgICB9Ci0gIGZvciAoYXNlY3QgPSBhYmZkLT5zZWN0aW9uczsgYXNlY3Q7IGFzZWN0ID0gYXNlY3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdICE9IE5VTEwKLQkgICYmIHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdLT5mbGFncyA9PSAwKQotCXsKLQkgIGFzeW1ib2wgKnN5bSA9IHNlY3Rfc3ltc1thc2VjdC0+aW5kZXhdOwotCSAgaW50IGk7Ci0KLQkgIHN5bS0+ZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBpZiAoIXN5bV9pc19nbG9iYWwgKGFiZmQsIHN5bSkpCi0JICAgIGkgPSBudW1fbG9jYWxzMisrOwotCSAgZWxzZQotCSAgICBpID0gbnVtX2xvY2FscyArIG51bV9nbG9iYWxzMisrOwotCSAgbmV3X3N5bXNbaV0gPSBzeW07Ci0JICBzeW0tPnVkYXRhLmkgPSBpICsgMTsKLQl9Ci0gICAgfQotCi0gIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBuZXdfc3ltcywgbnVtX2xvY2FscyArIG51bV9nbG9iYWxzKTsKLQotICBlbGZfbnVtX2xvY2FscyAoYWJmZCkgPSBudW1fbG9jYWxzOwotICBlbGZfbnVtX2dsb2JhbHMgKGFiZmQpID0gbnVtX2dsb2JhbHM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbGlnbiB0byB0aGUgbWF4aW11bSBmaWxlIGFsaWdubWVudCB0aGF0IGNvdWxkIGJlIHJlcXVpcmVkIGZvciBhbnkKLSAgIEVMRiBkYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBJTkxJTkUgZmlsZV9wdHIgYWxpZ25fZmlsZV9wb3NpdGlvbiBQQVJBTVMgKChmaWxlX3B0ciwgaW50KSk7Ci1zdGF0aWMgSU5MSU5FIGZpbGVfcHRyCi1hbGlnbl9maWxlX3Bvc2l0aW9uIChvZmYsIGFsaWduKQotICAgICBmaWxlX3B0ciBvZmY7Ci0gICAgIGludCBhbGlnbjsKLXsKLSAgcmV0dXJuIChvZmYgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOwotfQotCi0vKiBBc3NpZ24gYSBmaWxlIHBvc2l0aW9uIHRvIGEgc2VjdGlvbiwgb3B0aW9uYWxseSBhbGlnbmluZyB0byB0aGUKLSAgIHJlcXVpcmVkIHNlY3Rpb24gYWxpZ25tZW50LiAgKi8KLQotSU5MSU5FIGZpbGVfcHRyCi1fYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoaV9zaGRycCwgb2Zmc2V0LCBhbGlnbikKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmlfc2hkcnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYm9vbGVhbiBhbGlnbjsKLXsKLSAgaWYgKGFsaWduKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBhbDsKLQotICAgICAgYWwgPSBpX3NoZHJwLT5zaF9hZGRyYWxpZ247Ci0gICAgICBpZiAoYWwgPiAxKQotCW9mZnNldCA9IEJGRF9BTElHTiAob2Zmc2V0LCBhbCk7Ci0gICAgfQotICBpX3NoZHJwLT5zaF9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGlmIChpX3NoZHJwLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotICAgIGlfc2hkcnAtPmJmZF9zZWN0aW9uLT5maWxlcG9zID0gb2Zmc2V0OwotICBpZiAoaV9zaGRycC0+c2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotICAgIG9mZnNldCArPSBpX3NoZHJwLT5zaF9zaXplOwotICByZXR1cm4gb2Zmc2V0OwotfQotCi0vKiBDb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyB3ZSBhcmUgZ29pbmcgdG8gcHV0IHRoZSBzZWN0aW9ucyBhdCwgYW5kCi0gICBvdGhlcndpc2UgcHJlcGFyZSB0byBiZWdpbiB3cml0aW5nIG91dCB0aGUgRUxGIGZpbGUuICBJZiBMSU5LX0lORk8KLSAgIGlzIG5vdCBOVUxMLCB0aGlzIGlzIGJlaW5nIGNhbGxlZCBieSB0aGUgRUxGIGJhY2tlbmQgbGlua2VyLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnNoc3RydGFiX2hkcjsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBEbyBhbnkgZWxmIGJhY2tlbmQgc3BlY2lmaWMgcHJvY2Vzc2luZyBmaXJzdC4gICovCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcpIChhYmZkLCBsaW5rX2luZm8pOwotCi0gIGlmICghIHByZXBfaGVhZGVycyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFBvc3QgcHJvY2VzcyB0aGUgaGVhZGVycyBpZiBuZWNlc3NhcnkuICAqLwotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycykKLSAgICAoKmJlZC0+ZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMpIChhYmZkLCBsaW5rX2luZm8pOwotCi0gIGZhaWxlZCA9IGZhbHNlOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIGVsZl9mYWtlX3NlY3Rpb25zLCAmZmFpbGVkKTsKLSAgaWYgKGZhaWxlZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFhc3NpZ25fc2VjdGlvbl9udW1iZXJzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGJhY2tlbmQgbGlua2VyIGJ1aWxkcyBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24gaXRzZWxmLiAgKi8KLSAgaWYgKGxpbmtfaW5mbyA9PSBOVUxMICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICAvKiBOb24temVybyBpZiBkb2luZyBhIHJlbG9jYXRhYmxlIGxpbmsuICAqLwotICAgICAgaW50IHJlbG9jYXRhYmxlX3AgPSAhIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSk7Ci0KLSAgICAgIGlmICghIHN3YXBfb3V0X3N5bXMgKGFiZmQsICZzdHJ0YWIsIHJlbG9jYXRhYmxlX3ApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc2hzdHJ0YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnNoc3RydGFiX2hkcjsKLSAgLyogc2hfbmFtZSB3YXMgc2V0IGluIHByZXBfaGVhZGVycy4gICovCi0gIHNoc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0gIHNoc3RydGFiX2hkci0+c2hfZmxhZ3MgPSAwOwotICBzaHN0cnRhYl9oZHItPnNoX2FkZHIgPSAwOwotICBzaHN0cnRhYl9oZHItPnNoX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfc2hzdHJ0YWIgKGFiZmQpKTsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9saW5rID0gMDsKLSAgc2hzdHJ0YWJfaGRyLT5zaF9pbmZvID0gMDsKLSAgLyogc2hfb2Zmc2V0IGlzIHNldCBpbiBhc3NpZ25fZmlsZV9wb3NpdGlvbnNfZXhjZXB0X3JlbG9jcy4gICovCi0gIHNoc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKLQotICBpZiAoIWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGxpbmtfaW5mbyA9PSBOVUxMICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID4gMCkKLSAgICB7Ci0gICAgICBmaWxlX3B0ciBvZmY7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0gICAgICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOwotCi0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIG9mZiA9IF9iZmRfZWxmX2Fzc2lnbl9maWxlX3Bvc2l0aW9uX2Zvcl9zZWN0aW9uIChoZHIsIG9mZiwgdHJ1ZSk7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyOwotICAgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICAgICAgLyogTm93IHRoYXQgd2Uga25vdyB3aGVyZSB0aGUgLnN0cnRhYiBzZWN0aW9uIGdvZXMsIHdyaXRlIGl0Ci0gICAgICAgICBvdXQuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgc3RydGFiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChzdHJ0YWIpOwotICAgIH0KLQotICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgbWFwcGluZyBmcm9tIGEgc2V0IG9mIHNlY3Rpb25zIHRvIGEgcHJvZ3JhbSBzZWdtZW50LiAgKi8KLQotc3RhdGljIElOTElORSBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICoKLW1ha2VfbWFwcGluZyAoYWJmZCwgc2VjdGlvbnMsIGZyb20sIHRvLCBwaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci0gICAgIHVuc2lnbmVkIGludCBmcm9tOwotICAgICB1bnNpZ25lZCBpbnQgdG87Ci0gICAgIGJvb2xlYW4gcGhkcjsKLXsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGFzZWN0aW9uICoqaGRycHA7Ci0KLSAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotICAgICAgIGJmZF96YWxsb2MgKGFiZmQsCi0JCSAgIChzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApCi0JCSAgICArICh0byAtIGZyb20gLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG0tPm5leHQgPSBOVUxMOwotICBtLT5wX3R5cGUgPSBQVF9MT0FEOwotICBmb3IgKGkgPSBmcm9tLCBoZHJwcCA9IHNlY3Rpb25zICsgZnJvbTsgaSA8IHRvOyBpKyssIGhkcnBwKyspCi0gICAgbS0+c2VjdGlvbnNbaSAtIGZyb21dID0gKmhkcnBwOwotICBtLT5jb3VudCA9IHRvIC0gZnJvbTsKLQotICBpZiAoZnJvbSA9PSAwICYmIHBoZHIpCi0gICAgewotICAgICAgLyogSW5jbHVkZSB0aGUgaGVhZGVycyBpbiB0aGUgZmlyc3QgUFRfTE9BRCBzZWdtZW50LiAgKi8KLSAgICAgIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSAxOwotICAgICAgbS0+aW5jbHVkZXNfcGhkcnMgPSAxOwotICAgIH0KLQotICByZXR1cm4gbTsKLX0KLQotLyogU2V0IHVwIGEgbWFwcGluZyBmcm9tIEJGRCBzZWN0aW9ucyB0byBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1hcF9zZWN0aW9uc190b19zZWdtZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqKnNlY3Rpb25zID0gTlVMTDsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm1maXJzdDsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKnBtOwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICptOwotICBhc2VjdGlvbiAqbGFzdF9oZHI7Ci0gIHVuc2lnbmVkIGludCBwaGRyX2luZGV4OwotICBiZmRfdm1hIG1heHBhZ2VzaXplOwotICBhc2VjdGlvbiAqKmhkcnBwOwotICBib29sZWFuIHBoZHJfaW5fc2VnbWVudCA9IHRydWU7Ci0gIGJvb2xlYW4gd3JpdGFibGU7Ci0gIGFzZWN0aW9uICpkeW5zZWM7Ci0KLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWxlY3QgdGhlIGFsbG9jYXRlZCBzZWN0aW9ucywgYW5kIHNvcnQgdGhlbS4gICovCi0KLSAgc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCkKLQkJCQkgICAgICAgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKHNlY3Rpb25zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaSA9IDA7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JewotCSAgc2VjdGlvbnNbaV0gPSBzOwotCSAgKytpOwotCX0KLSAgICB9Ci0gIEJGRF9BU1NFUlQgKGkgPD0gYmZkX2NvdW50X3NlY3Rpb25zIChhYmZkKSk7Ci0gIGNvdW50ID0gaTsKLQotICBxc29ydCAoc2VjdGlvbnMsIChzaXplX3QpIGNvdW50LCBzaXplb2YgKGFzZWN0aW9uICopLCBlbGZfc29ydF9zZWN0aW9ucyk7Ci0KLSAgLyogQnVpbGQgdGhlIG1hcHBpbmcuICAqLwotCi0gIG1maXJzdCA9IE5VTEw7Ci0gIHBtID0gJm1maXJzdDsKLQotICAvKiBJZiB3ZSBoYXZlIGEgLmludGVycCBzZWN0aW9uLCB0aGVuIGNyZWF0ZSBhIFBUX1BIRFIgc2VnbWVudCBmb3IKLSAgICAgdGhlIHByb2dyYW0gaGVhZGVycyBhbmQgYSBQVF9JTlRFUlAgc2VnbWVudCBmb3IgdGhlIC5pbnRlcnAKLSAgICAgc2VjdGlvbi4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5pbnRlcnAiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLSAgICB7Ci0gICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIG0tPm5leHQgPSBOVUxMOwotICAgICAgbS0+cF90eXBlID0gUFRfUEhEUjsKLSAgICAgIC8qIEZJWE1FOiBVbml4V2FyZSBhbmQgU29sYXJpcyBzZXQgUEZfWCwgSXJpeCA1IGRvZXMgbm90LiAgKi8KLSAgICAgIG0tPnBfZmxhZ3MgPSBQRl9SIHwgUEZfWDsKLSAgICAgIG0tPnBfZmxhZ3NfdmFsaWQgPSAxOwotICAgICAgbS0+aW5jbHVkZXNfcGhkcnMgPSAxOwotCi0gICAgICAqcG0gPSBtOwotICAgICAgcG0gPSAmbS0+bmV4dDsKLQotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtLT5uZXh0ID0gTlVMTDsKLSAgICAgIG0tPnBfdHlwZSA9IFBUX0lOVEVSUDsKLSAgICAgIG0tPmNvdW50ID0gMTsKLSAgICAgIG0tPnNlY3Rpb25zWzBdID0gczsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2VjdGlvbnMuICBXZSBwdXQgc2VjdGlvbnMgaW4gdGhlIHNhbWUgcHJvZ3JhbQotICAgICBzZWdtZW50IHdoZW4gdGhlIHN0YXJ0IG9mIHRoZSBzZWNvbmQgc2VjdGlvbiBjYW4gYmUgcGxhY2VkIHdpdGhpbgotICAgICBhIGZldyBieXRlcyBvZiB0aGUgZW5kIG9mIHRoZSBmaXJzdCBzZWN0aW9uLiAgKi8KLSAgbGFzdF9oZHIgPSBOVUxMOwotICBwaGRyX2luZGV4ID0gMDsKLSAgbWF4cGFnZXNpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPm1heHBhZ2VzaXplOwotICB3cml0YWJsZSA9IGZhbHNlOwotICBkeW5zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChkeW5zZWMgIT0gTlVMTAotICAgICAgJiYgKGR5bnNlYy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICBkeW5zZWMgPSBOVUxMOwotCi0gIC8qIERlYWwgd2l0aCAtVHRleHQgb3Igc29tZXRoaW5nIHNpbWlsYXIgc3VjaCB0aGF0IHRoZSBmaXJzdCBzZWN0aW9uCi0gICAgIGlzIG5vdCBhZGphY2VudCB0byB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgVGhpcyBpcyBhbgotICAgICBhcHByb3hpbWF0aW9uLCBzaW5jZSBhdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cgZXhhY3RseSBob3cgbWFueQotICAgICBwcm9ncmFtIGhlYWRlcnMgd2Ugd2lsbCBuZWVkLiAgKi8KLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHBoZHJfc2l6ZTsKLQotICAgICAgcGhkcl9zaXplID0gZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZTsKLSAgICAgIGlmIChwaGRyX3NpemUgPT0gMCkKLQlwaGRyX3NpemUgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9waGRyOwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpID09IDAKLQkgIHx8IHNlY3Rpb25zWzBdLT5sbWEgPCBwaGRyX3NpemUKLQkgIHx8IHNlY3Rpb25zWzBdLT5sbWEgJSBtYXhwYWdlc2l6ZSA8IHBoZHJfc2l6ZSAlIG1heHBhZ2VzaXplKQotCXBoZHJfaW5fc2VnbWVudCA9IGZhbHNlOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBoZHJwcCA9IHNlY3Rpb25zOyBpIDwgY291bnQ7IGkrKywgaGRycHArKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqaGRyOwotICAgICAgYm9vbGVhbiBuZXdfc2VnbWVudDsKLQotICAgICAgaGRyID0gKmhkcnBwOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBzZWN0aW9uIGFuZCB0aGUgbGFzdCBvbmUgd2lsbCBmaXQgaW4gdGhlIHNhbWUKLSAgICAgICAgIHNlZ21lbnQuICAqLwotCi0gICAgICBpZiAobGFzdF9oZHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgc2VnbWVudCB5ZXQsIHRoZW4gd2UgZG9uJ3QgbmVlZCBhIG5ldwotCSAgICAgb25lICh3ZSBidWlsZCB0aGUgbGFzdCBvbmUgYWZ0ZXIgdGhpcyBsb29wKS4gICovCi0JICBuZXdfc2VnbWVudCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKGxhc3RfaGRyLT5sbWEgLSBsYXN0X2hkci0+dm1hICE9IGhkci0+bG1hIC0gaGRyLT52bWEpCi0JewotCSAgLyogSWYgdGhpcyBzZWN0aW9uIGhhcyBhIGRpZmZlcmVudCByZWxhdGlvbiBiZXR3ZWVuIHRoZQotICAgICAgICAgICAgIHZpcnR1YWwgYWRkcmVzcyBhbmQgdGhlIGxvYWQgYWRkcmVzcywgdGhlbiB3ZSBuZWVkIGEgbmV3Ci0gICAgICAgICAgICAgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IHRydWU7Ci0JfQotICAgICAgZWxzZSBpZiAoQkZEX0FMSUdOIChsYXN0X2hkci0+bG1hICsgbGFzdF9oZHItPl9yYXdfc2l6ZSwgbWF4cGFnZXNpemUpCi0JICAgICAgIDwgQkZEX0FMSUdOIChoZHItPmxtYSwgbWF4cGFnZXNpemUpKQotCXsKLQkgIC8qIElmIHB1dHRpbmcgdGhpcyBzZWN0aW9uIGluIHRoaXMgc2VnbWVudCB3b3VsZCBmb3JjZSB1cyB0bwotICAgICAgICAgICAgIHNraXAgYSBwYWdlIGluIHRoZSBzZWdtZW50LCB0aGVuIHdlIG5lZWQgYSBuZXcgc2VnbWVudC4gICovCi0JICBuZXdfc2VnbWVudCA9IHRydWU7Ci0JfQotICAgICAgZWxzZSBpZiAoKGxhc3RfaGRyLT5mbGFncyAmIFNFQ19MT0FEKSA9PSAwCi0JICAgICAgICYmIChoZHItPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JewotCSAgLyogV2UgZG9uJ3Qgd2FudCB0byBwdXQgYSBsb2FkYWJsZSBzZWN0aW9uIGFmdGVyIGEKLSAgICAgICAgICAgICBub25sb2FkYWJsZSBzZWN0aW9uIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgbmV3X3NlZ21lbnQgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKChhYmZkLT5mbGFncyAmIERfUEFHRUQpID09IDApCi0JewotCSAgLyogSWYgdGhlIGZpbGUgaXMgbm90IGRlbWFuZCBwYWdlZCwgd2hpY2ggbWVhbnMgdGhhdCB3ZQotICAgICAgICAgICAgIGRvbid0IHJlcXVpcmUgdGhlIHNlY3Rpb25zIHRvIGJlIGNvcnJlY3RseSBhbGlnbmVkIGluIHRoZQotICAgICAgICAgICAgIGZpbGUsIHRoZW4gdGhlcmUgaXMgbm8gb3RoZXIgcmVhc29uIGZvciBhIG5ldyBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAoISB3cml0YWJsZQotCSAgICAgICAmJiAoaGRyLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICAgICAmJiAoQkZEX0FMSUdOIChsYXN0X2hkci0+bG1hICsgbGFzdF9oZHItPl9yYXdfc2l6ZSwgbWF4cGFnZXNpemUpCi0JCSAgID09IGhkci0+bG1hKSkKLQl7Ci0JICAvKiBXZSBkb24ndCB3YW50IHRvIHB1dCBhIHdyaXRhYmxlIHNlY3Rpb24gaW4gYSByZWFkIG9ubHkKLSAgICAgICAgICAgICBzZWdtZW50LCB1bmxlc3MgdGhleSBhcmUgb24gdGhlIHNhbWUgcGFnZSBpbiBtZW1vcnkKLSAgICAgICAgICAgICBhbnlob3cuICBXZSBhbHJlYWR5IGtub3cgdGhhdCB0aGUgbGFzdCBzZWN0aW9uIGRvZXMgbm90Ci0gICAgICAgICAgICAgYnJpbmcgdXMgcGFzdCB0aGUgY3VycmVudCBzZWN0aW9uIG9uIHRoZSBwYWdlLCBzbyB0aGUKLSAgICAgICAgICAgICBvbmx5IGNhc2UgaW4gd2hpY2ggdGhlIG5ldyBzZWN0aW9uIGlzIG5vdCBvbiB0aGUgc2FtZQotICAgICAgICAgICAgIHBhZ2UgYXMgdGhlIHByZXZpb3VzIHNlY3Rpb24gaXMgd2hlbiB0aGUgcHJldmlvdXMgc2VjdGlvbgotICAgICAgICAgICAgIGVuZHMgcHJlY2lzZWx5IG9uIGEgcGFnZSBib3VuZGFyeS4gICovCi0JICBuZXdfc2VnbWVudCA9IHRydWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE90aGVyd2lzZSwgd2UgY2FuIHVzZSB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLQkgIG5ld19zZWdtZW50ID0gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBuZXdfc2VnbWVudCkKLQl7Ci0JICBpZiAoKGhkci0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0JICAgIHdyaXRhYmxlID0gdHJ1ZTsKLQkgIGxhc3RfaGRyID0gaGRyOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBuZWVkIGEgbmV3IHByb2dyYW0gc2VnbWVudC4gIFdlIG11c3QgY3JlYXRlIGEgbmV3IHByb2dyYW0KLSAgICAgICAgIGhlYWRlciBob2xkaW5nIGFsbCB0aGUgc2VjdGlvbnMgZnJvbSBwaGRyX2luZGV4IHVudGlsIGhkci4gICovCi0KLSAgICAgIG0gPSBtYWtlX21hcHBpbmcgKGFiZmQsIHNlY3Rpb25zLCBwaGRyX2luZGV4LCBpLCBwaGRyX2luX3NlZ21lbnQpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0KLSAgICAgIGlmICgoaGRyLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQl3cml0YWJsZSA9IHRydWU7Ci0gICAgICBlbHNlCi0Jd3JpdGFibGUgPSBmYWxzZTsKLQotICAgICAgbGFzdF9oZHIgPSBoZHI7Ci0gICAgICBwaGRyX2luZGV4ID0gaTsKLSAgICAgIHBoZHJfaW5fc2VnbWVudCA9IGZhbHNlOwotICAgIH0KLQotICAvKiBDcmVhdGUgYSBmaW5hbCBQVF9MT0FEIHByb2dyYW0gc2VnbWVudC4gICovCi0gIGlmIChsYXN0X2hkciAhPSBOVUxMKQotICAgIHsKLSAgICAgIG0gPSBtYWtlX21hcHBpbmcgKGFiZmQsIHNlY3Rpb25zLCBwaGRyX2luZGV4LCBpLCBwaGRyX2luX3NlZ21lbnQpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgLmR5bmFtaWMgc2VjdGlvbiwgdGhyb3cgaW4gYSBQVF9EWU5BTUlDIHNlZ21lbnQuICAqLwotICBpZiAoZHluc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBtLT5uZXh0ID0gTlVMTDsKLSAgICAgIG0tPnBfdHlwZSA9IFBUX0RZTkFNSUM7Ci0gICAgICBtLT5jb3VudCA9IDE7Ci0gICAgICBtLT5zZWN0aW9uc1swXSA9IGR5bnNlYzsKLQotICAgICAgKnBtID0gbTsKLSAgICAgIHBtID0gJm0tPm5leHQ7Ci0gICAgfQotCi0gIC8qIEZvciBlYWNoIGxvYWRhYmxlIC5ub3RlIHNlY3Rpb24sIGFkZCBhIFBUX05PVEUgc2VnbWVudC4gIFdlIGRvbid0Ci0gICAgIHVzZSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSwgYmVjYXVzZSBpZiB3ZSBsaW5rIHRvZ2V0aGVyCi0gICAgIG5vbmxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zIGFuZCBsb2FkYWJsZSAubm90ZSBzZWN0aW9ucywgd2Ugd2lsbAotICAgICBnZW5lcmF0ZSB0d28gLm5vdGUgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlLiAgRklYTUU6IFVzaW5nCi0gICAgIG5hbWVzIGZvciBzZWN0aW9uIHR5cGVzIGlzIGJvZ3VzIGFueWhvdy4gICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCSAgJiYgc3RybmNtcCAocy0+bmFtZSwgIi5ub3RlIiwgNSkgPT0gMCkKLQl7Ci0JICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpKTsKLQkgIGlmIChtID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbS0+bmV4dCA9IE5VTEw7Ci0JICBtLT5wX3R5cGUgPSBQVF9OT1RFOwotCSAgbS0+Y291bnQgPSAxOwotCSAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCi0JICAqcG0gPSBtOwotCSAgcG0gPSAmbS0+bmV4dDsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHNlY3Rpb25zKTsKLSAgc2VjdGlvbnMgPSBOVUxMOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwID0gbWZpcnN0OwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHNlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc2VjdGlvbnMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNvcnQgc2VjdGlvbnMgYnkgYWRkcmVzcy4gICovCi0KLXN0YXRpYyBpbnQKLWVsZl9zb3J0X3NlY3Rpb25zIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci17Ci0gIGNvbnN0IGFzZWN0aW9uICpzZWMxID0gKihjb25zdCBhc2VjdGlvbiAqKikgYXJnMTsKLSAgY29uc3QgYXNlY3Rpb24gKnNlYzIgPSAqKGNvbnN0IGFzZWN0aW9uICoqKSBhcmcyOwotCi0gIC8qIFNvcnQgYnkgTE1BIGZpcnN0LCBzaW5jZSB0aGlzIGlzIHRoZSBhZGRyZXNzIHVzZWQgdG8KLSAgICAgcGxhY2UgdGhlIHNlY3Rpb24gaW50byBhIHNlZ21lbnQuICAqLwotICBpZiAoc2VjMS0+bG1hIDwgc2VjMi0+bG1hKQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoc2VjMS0+bG1hID4gc2VjMi0+bG1hKQotICAgIHJldHVybiAxOwotCi0gIC8qIFRoZW4gc29ydCBieSBWTUEuICBOb3JtYWxseSB0aGUgTE1BIGFuZCB0aGUgVk1BIHdpbGwgYmUKLSAgICAgdGhlIHNhbWUsIGFuZCB0aGlzIHdpbGwgZG8gbm90aGluZy4gICovCi0gIGlmIChzZWMxLT52bWEgPCBzZWMyLT52bWEpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChzZWMxLT52bWEgPiBzZWMyLT52bWEpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogUHV0ICFTRUNfTE9BRCBzZWN0aW9ucyBhZnRlciBTRUNfTE9BRCBvbmVzLiAgKi8KLQotI2RlZmluZSBUT0VORCh4KSAoKCh4KS0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLQotICBpZiAoVE9FTkQgKHNlYzEpKQotICAgIHsKLSAgICAgIGlmIChUT0VORCAoc2VjMikpCi0JcmV0dXJuIHNlYzEtPnRhcmdldF9pbmRleCAtIHNlYzItPnRhcmdldF9pbmRleDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKFRPRU5EIChzZWMyKSkKLSAgICByZXR1cm4gLTE7Ci0KLSN1bmRlZiBUT0VORAotCi0gIC8qIFNvcnQgYnkgc2l6ZSwgdG8gcHV0IHplcm8gc2l6ZWQgc2VjdGlvbnMgYmVmb3JlIG90aGVycyBhdCB0aGUKLSAgICAgc2FtZSBhZGRyZXNzLiAgKi8KLQotICBpZiAoc2VjMS0+X3Jhd19zaXplIDwgc2VjMi0+X3Jhd19zaXplKQotICAgIHJldHVybiAtMTsKLSAgaWYgKHNlYzEtPl9yYXdfc2l6ZSA+IHNlYzItPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gc2VjMS0+dGFyZ2V0X2luZGV4IC0gc2VjMi0+dGFyZ2V0X2luZGV4OwotfQotCi0vKiBBc3NpZ24gZmlsZSBwb3NpdGlvbnMgdG8gdGhlIHNlY3Rpb25zIGJhc2VkIG9uIHRoZSBtYXBwaW5nIGZyb20KLSAgIHNlY3Rpb25zIHRvIHNlZ21lbnRzLiAgVGhpcyBmdW5jdGlvbiBhbHNvIHNldHMgdXAgc29tZSBmaWVsZHMgaW4KLSAgIHRoZSBmaWxlIGhlYWRlciwgYW5kIHdyaXRlcyBvdXQgdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3NlZ21lbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbTsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotICBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcnM7Ci0gIGZpbGVfcHRyIG9mZiwgdm9mZjsKLSAgYmZkX3ZtYSBmaWxlaGRyX3ZhZGRyLCBmaWxlaGRyX3BhZGRyOwotICBiZmRfdm1hIHBoZHJzX3ZhZGRyLCBwaGRyc19wYWRkcjsKLSAgRWxmX0ludGVybmFsX1BoZHIgKnA7Ci0KLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbWFwX3NlY3Rpb25zX3RvX3NlZ21lbnRzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfbW9kaWZ5X3NlZ21lbnRfbWFwKSAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBjb3VudCA9IDA7Ci0gIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotICAgICsrY291bnQ7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfcGhvZmYgPSBiZWQtPnMtPnNpemVvZl9laGRyOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waGVudHNpemUgPSBiZWQtPnMtPnNpemVvZl9waGRyOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9waG51bSA9IGNvdW50OwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHdlIGFscmVhZHkgY291bnRlZCB0aGUgbnVtYmVyIG9mIHByb2dyYW0gc2VnbWVudHMsIG1ha2Ugc3VyZQotICAgICB0aGF0IHdlIGFsbG9jYXRlZCBlbm91Z2ggc3BhY2UuICBUaGlzIGhhcHBlbnMgd2hlbiBTSVpFT0ZfSEVBREVSUwotICAgICBpcyB1c2VkIGluIGEgbGlua2VyIHNjcmlwdC4gICovCi0gIGFsbG9jID0gZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSAvIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gIGlmIChhbGxvYyAhPSAwICYmIGNvdW50ID4gYWxsb2MpCi0gICAgewotICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgIChfKCIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMgKGFsbG9jYXRlZCAldSwgbmVlZCAldSkiKSwKLQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYWxsb2MsIGNvdW50KSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGFsbG9jID09IDApCi0gICAgYWxsb2MgPSBjb3VudDsKLQotICBwaGRycyA9ICgoRWxmX0ludGVybmFsX1BoZHIgKikKLQkgICBiZmRfYWxsb2MgKGFiZmQsIGFsbG9jICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUGhkcikpKTsKLSAgaWYgKHBoZHJzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG9mZiA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0gIG9mZiArPSBhbGxvYyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0KLSAgZmlsZWhkcl92YWRkciA9IDA7Ci0gIGZpbGVoZHJfcGFkZHIgPSAwOwotICBwaGRyc192YWRkciA9IDA7Ci0gIHBoZHJzX3BhZGRyID0gMDsKLQotICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCwgcCA9IHBoZHJzOwotICAgICAgIG0gIT0gTlVMTDsKLSAgICAgICBtID0gbS0+bmV4dCwgcCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgYXNlY3Rpb24gKipzZWNwcDsKLQotICAgICAgLyogSWYgZWxmX3NlZ21lbnRfbWFwIGlzIG5vdCBmcm9tIG1hcF9zZWN0aW9uc190b19zZWdtZW50cywgdGhlCi0gICAgICAgICBzZWN0aW9ucyBtYXkgbm90IGJlIGNvcnJlY3RseSBvcmRlcmVkLiAgKi8KLSAgICAgIGlmIChtLT5jb3VudCA+IDApCi0JcXNvcnQgKG0tPnNlY3Rpb25zLCAoc2l6ZV90KSBtLT5jb3VudCwgc2l6ZW9mIChhc2VjdGlvbiAqKSwKLQkgICAgICAgZWxmX3NvcnRfc2VjdGlvbnMpOwotCi0gICAgICBwLT5wX3R5cGUgPSBtLT5wX3R5cGU7Ci0KLSAgICAgIGlmIChtLT5wX2ZsYWdzX3ZhbGlkKQotCXAtPnBfZmxhZ3MgPSBtLT5wX2ZsYWdzOwotICAgICAgZWxzZQotCXAtPnBfZmxhZ3MgPSAwOwotCi0gICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQKLQkgICYmIG0tPmNvdW50ID4gMAotCSAgJiYgKG0tPnNlY3Rpb25zWzBdLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQl7Ci0JICBpZiAoKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQkgICAgb2ZmICs9IChtLT5zZWN0aW9uc1swXS0+dm1hIC0gb2ZmKSAlIGJlZC0+bWF4cGFnZXNpemU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGFsaWduOwotCi0JICAgICAgYWxpZ24gPSAwOwotCSAgICAgIGZvciAoaSA9IDAsIHNlY3BwID0gbS0+c2VjdGlvbnM7IGkgPCBtLT5jb3VudDsgaSsrLCBzZWNwcCsrKQotCQl7Ci0JCSAgYmZkX3NpemVfdHlwZSBzZWNhbGlnbjsKLQotCQkgIHNlY2FsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgKnNlY3BwKTsKLQkJICBpZiAoc2VjYWxpZ24gPiBhbGlnbikKLQkJICAgIGFsaWduID0gc2VjYWxpZ247Ci0JCX0KLQotCSAgICAgIG9mZiArPSAobS0+c2VjdGlvbnNbMF0tPnZtYSAtIG9mZikgJSAoMSA8PCBhbGlnbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChtLT5jb3VudCA9PSAwKQotCXAtPnBfdmFkZHIgPSAwOwotICAgICAgZWxzZQotCXAtPnBfdmFkZHIgPSBtLT5zZWN0aW9uc1swXS0+dm1hOwotCi0gICAgICBpZiAobS0+cF9wYWRkcl92YWxpZCkKLQlwLT5wX3BhZGRyID0gbS0+cF9wYWRkcjsKLSAgICAgIGVsc2UgaWYgKG0tPmNvdW50ID09IDApCi0JcC0+cF9wYWRkciA9IDA7Ci0gICAgICBlbHNlCi0JcC0+cF9wYWRkciA9IG0tPnNlY3Rpb25zWzBdLT5sbWE7Ci0KLSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRF9QQUdFRCkgIT0gMCkKLQlwLT5wX2FsaWduID0gYmVkLT5tYXhwYWdlc2l6ZTsKLSAgICAgIGVsc2UgaWYgKG0tPmNvdW50ID09IDApCi0JcC0+cF9hbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLSAgICAgIGVsc2UKLQlwLT5wX2FsaWduID0gMDsKLQotICAgICAgcC0+cF9vZmZzZXQgPSAwOwotICAgICAgcC0+cF9maWxlc3ogPSAwOwotICAgICAgcC0+cF9tZW1zeiA9IDA7Ci0KLSAgICAgIGlmIChtLT5pbmNsdWRlc19maWxlaGRyKQotCXsKLQkgIGlmICghIG0tPnBfZmxhZ3NfdmFsaWQpCi0JICAgIHAtPnBfZmxhZ3MgfD0gUEZfUjsKLQkgIHAtPnBfb2Zmc2V0ID0gMDsKLQkgIHAtPnBfZmlsZXN6ID0gYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkgIHAtPnBfbWVtc3ogPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCSAgaWYgKG0tPmNvdW50ID4gMCkKLQkgICAgewotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnBfdHlwZSA9PSBQVF9MT0FEKTsKLQotCSAgICAgIGlmIChwLT5wX3ZhZGRyIDwgKGJmZF92bWEpIG9mZikKLQkJewotCQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IE5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzLCB0cnkgbGlua2luZyB3aXRoIC1OIiksCi0JCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgcC0+cF92YWRkciAtPSBvZmY7Ci0JICAgICAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJcC0+cF9wYWRkciAtPSBvZmY7Ci0JICAgIH0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgewotCSAgICAgIGZpbGVoZHJfdmFkZHIgPSBwLT5wX3ZhZGRyOwotCSAgICAgIGZpbGVoZHJfcGFkZHIgPSBwLT5wX3BhZGRyOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobS0+aW5jbHVkZXNfcGhkcnMpCi0JewotCSAgaWYgKCEgbS0+cF9mbGFnc192YWxpZCkKLQkgICAgcC0+cF9mbGFncyB8PSBQRl9SOwotCi0JICBpZiAobS0+aW5jbHVkZXNfZmlsZWhkcikKLQkgICAgewotCSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkJewotCQkgIHBoZHJzX3ZhZGRyID0gcC0+cF92YWRkciArIGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0JCSAgcGhkcnNfcGFkZHIgPSBwLT5wX3BhZGRyICsgYmVkLT5zLT5zaXplb2ZfZWhkcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwLT5wX29mZnNldCA9IGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0KLQkgICAgICBpZiAobS0+Y291bnQgPiAwKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAocC0+cF90eXBlID09IFBUX0xPQUQpOwotCQkgIHAtPnBfdmFkZHIgLT0gb2ZmIC0gcC0+cF9vZmZzZXQ7Ci0JCSAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJICAgIHAtPnBfcGFkZHIgLT0gb2ZmIC0gcC0+cF9vZmZzZXQ7Ci0JCX0KLQotCSAgICAgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkJewotCQkgIHBoZHJzX3ZhZGRyID0gcC0+cF92YWRkcjsKLQkJICBwaGRyc19wYWRkciA9IHAtPnBfcGFkZHI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXBoZHJzX3ZhZGRyID0gYmVkLT5tYXhwYWdlc2l6ZSArIGJlZC0+cy0+c2l6ZW9mX2VoZHI7Ci0JICAgIH0KLQotCSAgcC0+cF9maWxlc3ogKz0gYWxsb2MgKiBiZWQtPnMtPnNpemVvZl9waGRyOwotCSAgcC0+cF9tZW1zeiArPSBhbGxvYyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0JfQotCi0gICAgICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQKLQkgIHx8IChwLT5wX3R5cGUgPT0gUFRfTk9URSAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpKQotCXsKLQkgIGlmICghIG0tPmluY2x1ZGVzX2ZpbGVoZHIgJiYgISBtLT5pbmNsdWRlc19waGRycykKLQkgICAgcC0+cF9vZmZzZXQgPSBvZmY7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlX3B0ciBhZGp1c3Q7Ci0KLQkgICAgICBhZGp1c3QgPSBvZmYgLSAocC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeik7Ci0JICAgICAgcC0+cF9maWxlc3ogKz0gYWRqdXN0OwotCSAgICAgIHAtPnBfbWVtc3ogKz0gYWRqdXN0OwotCSAgICB9Ci0JfQotCi0gICAgICB2b2ZmID0gb2ZmOwotCi0gICAgICBmb3IgKGkgPSAwLCBzZWNwcCA9IG0tPnNlY3Rpb25zOyBpIDwgbS0+Y291bnQ7IGkrKywgc2VjcHArKykKLQl7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgZmxhZ3dvcmQgZmxhZ3M7Ci0JICBiZmRfc2l6ZV90eXBlIGFsaWduOwotCi0JICBzZWMgPSAqc2VjcHA7Ci0JICBmbGFncyA9IHNlYy0+ZmxhZ3M7Ci0JICBhbGlnbiA9IDEgPDwgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjKTsKLQotCSAgLyogVGhlIHNlY3Rpb24gbWF5IGhhdmUgYXJ0aWZpY2lhbCBhbGlnbm1lbnQgZm9yY2VkIGJ5IGEKLQkgICAgIGxpbmsgc2NyaXB0LiAgTm90aWNlIHRoaXMgY2FzZSBieSB0aGUgZ2FwIGJldHdlZW4gdGhlCi0JICAgICBjdW11bGF0aXZlIHBoZHIgdm1hIGFuZCB0aGUgc2VjdGlvbidzIHZtYS4gICovCi0JICBpZiAocC0+cF92YWRkciArIHAtPnBfbWVtc3ogPCBzZWMtPnZtYSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgYWRqdXN0ID0gc2VjLT52bWEgLSAocC0+cF92YWRkciArIHAtPnBfbWVtc3opOwotCi0JICAgICAgcC0+cF9tZW1zeiArPSBhZGp1c3Q7Ci0JICAgICAgb2ZmICs9IGFkanVzdDsKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXAtPnBfZmlsZXN6ICs9IGFkanVzdDsKLQkgICAgfQotCi0JICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQpCi0JICAgIHsKLQkgICAgICBiZmRfc2lnbmVkX3ZtYSBhZGp1c3Q7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXsKLQkJICBhZGp1c3QgPSBzZWMtPmxtYSAtIChwLT5wX3BhZGRyICsgcC0+cF9tZW1zeik7Ci0JCSAgaWYgKGFkanVzdCA8IDApCi0JCSAgICBhZGp1c3QgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQl7Ci0JCSAgLyogVGhlIHNlY3Rpb24gVk1BIG11c3QgZXF1YWwgdGhlIGZpbGUgcG9zaXRpb24KLQkJICAgICBtb2R1bG8gdGhlIHBhZ2Ugc2l6ZS4gIEZJWE1FOiBJJ20gbm90IHN1cmUgaWYKLQkJICAgICB0aGlzIGFkanVzdG1lbnQgaXMgcmVhbGx5IG5lY2Vzc2FyeS4gIFdlIHVzZWQgdG8KLQkJICAgICBub3QgaGF2ZSB0aGUgU0VDX0xPQUQgY2FzZSBqdXN0IGFib3ZlLCBhbmQgdGhlbgotCQkgICAgIHRoaXMgd2FzIG5lY2Vzc2FyeSwgYnV0IG5vdyBJJ20gbm90IHN1cmUuICAqLwotCQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCQkgICAgYWRqdXN0ID0gKHNlYy0+dm1hIC0gdm9mZikgJSBiZWQtPm1heHBhZ2VzaXplOwotCQkgIGVsc2UKLQkJICAgIGFkanVzdCA9IChzZWMtPnZtYSAtIHZvZmYpICUgYWxpZ247Ci0JCX0KLQkgICAgICBlbHNlCi0JCWFkanVzdCA9IDA7Ci0KLQkgICAgICBpZiAoYWRqdXN0ICE9IDApCi0JCXsKLQkJICBpZiAoaSA9PSAwKQotCQkgICAgewotCQkgICAgICAoKiBfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiRXJyb3I6IEZpcnN0IHNlY3Rpb24gaW4gc2VnbWVudCAoJXMpIHN0YXJ0cyBhdCAweCV4IiksCi0JCQkgYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgc2VjLT5sbWEpOwotCQkgICAgICAoKiBfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkoXygiICAgICAgIHdoZXJlYXMgc2VnbWVudCBzdGFydHMgYXQgMHgleCIpLAotCQkJIHAtPnBfcGFkZHIpOwotCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBwLT5wX21lbXN6ICs9IGFkanVzdDsKLQkJICBvZmYgKz0gYWRqdXN0OwotCQkgIHZvZmYgKz0gYWRqdXN0OwotCQkgIGlmICgoZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJICAgIHAtPnBfZmlsZXN6ICs9IGFkanVzdDsKLQkJfQotCi0JICAgICAgc2VjLT5maWxlcG9zID0gb2ZmOwotCi0JICAgICAgLyogV2UgY2hlY2sgU0VDX0hBU19DT05URU5UUyBoZXJlIGJlY2F1c2UgaWYgTk9MT0FEIGlzCi0gICAgICAgICAgICAgICAgIHVzZWQgaW4gYSBsaW5rZXIgc2NyaXB0IHdlIG1heSBoYXZlIGEgc2VjdGlvbiB3aXRoCi0gICAgICAgICAgICAgICAgIFNFQ19MT0FEIGNsZWFyIGJ1dCB3aGljaCBpcyBzdXBwb3NlZCB0byBoYXZlCi0gICAgICAgICAgICAgICAgIGNvbnRlbnRzLiAgKi8KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkJICB8fCAoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCQlvZmYgKz0gc2VjLT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQl2b2ZmICs9IHNlYy0+X3Jhd19zaXplOwotCSAgICB9Ci0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTk9URSAmJiBiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkgPT0gYmZkX2NvcmUpCi0JICAgIHsKLQkgICAgICBpZiAoaSA9PSAwKQkvKiB0aGUgYWN0dWFsICJub3RlIiBzZWdtZW50ICovCi0JCXsJCS8qIHRoaXMgb25lIGFjdHVhbGx5IGNvbnRhaW5zIGV2ZXJ5dGhpbmcuICovCi0JCSAgc2VjLT5maWxlcG9zID0gb2ZmOwotCQkgIHAtPnBfZmlsZXN6ID0gc2VjLT5fcmF3X3NpemU7Ci0JCSAgb2ZmICs9IHNlYy0+X3Jhd19zaXplOwotCQkgIHZvZmYgPSBvZmY7Ci0JCX0KLQkgICAgICBlbHNlCS8qIGZha2Ugc2VjdGlvbnMgLS0gZG9uJ3QgbmVlZCB0byBiZSB3cml0dGVuICovCi0JCXsKLQkJICBzZWMtPmZpbGVwb3MgPSAwOwotCQkgIHNlYy0+X3Jhd19zaXplID0gMDsKLQkJICBmbGFncyA9IHNlYy0+ZmxhZ3MgPSAwOwkvKiBubyBjb250ZW50cyAqLwotCQl9Ci0JICAgICAgcC0+cF9tZW1zeiA9IDA7Ci0JICAgICAgcC0+cF9hbGlnbiA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHAtPnBfbWVtc3ogKz0gc2VjLT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0JCXAtPnBfZmlsZXN6ICs9IHNlYy0+X3Jhd19zaXplOwotCi0JICAgICAgaWYgKGFsaWduID4gcC0+cF9hbGlnbgotCQkgICYmIChwLT5wX3R5cGUgIT0gUFRfTE9BRCB8fCAoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSA9PSAwKSkKLQkJcC0+cF9hbGlnbiA9IGFsaWduOwotCSAgICB9Ci0KLQkgIGlmICghIG0tPnBfZmxhZ3NfdmFsaWQpCi0JICAgIHsKLQkgICAgICBwLT5wX2ZsYWdzIHw9IFBGX1I7Ci0JICAgICAgaWYgKChmbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotCQlwLT5wX2ZsYWdzIHw9IFBGX1g7Ci0JICAgICAgaWYgKChmbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMCkKLQkJcC0+cF9mbGFncyB8PSBQRl9XOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHNldCB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucywgd2UgY2FuIHNldCB1cAotICAgICB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBub24gUFRfTE9BRCBzZWdtZW50cy4gICovCi0gIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwLCBwID0gcGhkcnM7Ci0gICAgICAgbSAhPSBOVUxMOwotICAgICAgIG0gPSBtLT5uZXh0LCBwKyspCi0gICAgewotICAgICAgaWYgKHAtPnBfdHlwZSAhPSBQVF9MT0FEICYmIG0tPmNvdW50ID4gMCkKLQl7Ci0JICBCRkRfQVNTRVJUICghIG0tPmluY2x1ZGVzX2ZpbGVoZHIgJiYgISBtLT5pbmNsdWRlc19waGRycyk7Ci0JICBwLT5wX29mZnNldCA9IG0tPnNlY3Rpb25zWzBdLT5maWxlcG9zOwotCX0KLSAgICAgIGlmIChtLT5jb3VudCA9PSAwKQotCXsKLQkgIGlmIChtLT5pbmNsdWRlc19maWxlaGRyKQotCSAgICB7Ci0JICAgICAgcC0+cF92YWRkciA9IGZpbGVoZHJfdmFkZHI7Ci0JICAgICAgaWYgKCEgbS0+cF9wYWRkcl92YWxpZCkKLQkJcC0+cF9wYWRkciA9IGZpbGVoZHJfcGFkZHI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG0tPmluY2x1ZGVzX3BoZHJzKQotCSAgICB7Ci0JICAgICAgcC0+cF92YWRkciA9IHBoZHJzX3ZhZGRyOwotCSAgICAgIGlmICghIG0tPnBfcGFkZHJfdmFsaWQpCi0JCXAtPnBfcGFkZHIgPSBwaGRyc19wYWRkcjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQ2xlYXIgb3V0IGFueSBwcm9ncmFtIGhlYWRlcnMgd2UgYWxsb2NhdGVkIGJ1dCBkaWQgbm90IHVzZS4gICovCi0gIGZvciAoOyBjb3VudCA8IGFsbG9jOyBjb3VudCsrLCBwKyspCi0gICAgewotICAgICAgbWVtc2V0IChwLCAwLCBzaXplb2YgKnApOwotICAgICAgcC0+cF90eXBlID0gUFRfTlVMTDsKLSAgICB9Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IHBoZHJzOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPm5leHRfZmlsZV9wb3MgPSBvZmY7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGJlZC0+cy0+c2l6ZW9mX2VoZHIsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZWQtPnMtPndyaXRlX291dF9waGRycyAoYWJmZCwgcGhkcnMsIGFsbG9jKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBwcm9ncmFtIGhlYWRlci4KLQotICAgSWYgdGhpcyBpcyBjYWxsZWQgYnkgdGhlIGxpbmtlciBiZWZvcmUgYW55IG9mIHRoZSBzZWN0aW9uIFZNQSdzIGFyZSBzZXQsIGl0Ci0gICBjYW4ndCBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIGEgc3RyYW5nZSBtZW1vcnkgbGF5b3V0LiAgVGhpcyBvbmx5Ci0gICBoYXBwZW5zIHdoZW4gU0laRU9GX0hFQURFUlMgaXMgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQuICBJbiB0aGlzIGNhc2UsCi0gICBTT1JURURfSERSUyBpcyBOVUxMIGFuZCB3ZSBhc3N1bWUgdGhlIG5vcm1hbCBzY2VuYXJpbyBvZiBvbmUgdGV4dCBhbmQgb25lCi0gICBkYXRhIHNlZ21lbnQgKGV4Y2x1c2l2ZSBvZiAuaW50ZXJwIGFuZCAuZHluYW1pYykuCi0KLSAgID8/PyBVc2VyIHdyaXR0ZW4gc2NyaXB0cyBtdXN0IGVpdGhlciBub3QgdXNlIFNJWkVPRl9IRUFERVJTLCBvciBhc3N1bWUgdGhlcmUKLSAgIHdpbGwgYmUgdHdvIHNlZ21lbnRzLiAgKi8KLQotc3RhdGljIGJmZF9zaXplX3R5cGUKLWdldF9wcm9ncmFtX2hlYWRlcl9zaXplIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNpemVfdCBzZWdzOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICAvKiBXZSBjYW4ndCByZXR1cm4gYSBkaWZmZXJlbnQgcmVzdWx0IGVhY2ggdGltZSB3ZSdyZSBjYWxsZWQuICAqLwotICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSAhPSAwKQotICAgIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOwotCi0gIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0KLSAgICAgIHNlZ3MgPSAwOwotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JKytzZWdzOwotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+cHJvZ3JhbV9oZWFkZXJfc2l6ZSA9IHNlZ3MgKiBiZWQtPnMtPnNpemVvZl9waGRyOwotICAgICAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPnByb2dyYW1faGVhZGVyX3NpemU7Ci0gICAgfQotCi0gIC8qIEFzc3VtZSB3ZSB3aWxsIG5lZWQgZXhhY3RseSB0d28gUFRfTE9BRCBzZWdtZW50czogb25lIGZvciB0ZXh0Ci0gICAgIGFuZCBvbmUgZm9yIGRhdGEuICAqLwotICBzZWdzID0gMjsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBhIGxvYWRhYmxlIGludGVycHJldGVyIHNlY3Rpb24sIHdlIG5lZWQgYQotCSBQVF9JTlRFUlAgc2VnbWVudC4gIEluIHRoaXMgY2FzZSwgYXNzdW1lIHdlIGFsc28gbmVlZCBhCi0JIFBUX1BIRFIgc2VnbWVudCwgYWx0aG91Z2ggdGhhdCBtYXkgbm90IGJlIHRydWUgZm9yIGFsbAotCSB0YXJnZXRzLiAgKi8KLSAgICAgIHNlZ3MgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgYSBQVF9EWU5BTUlDIHNlZ21lbnQuICAqLwotICAgICAgKytzZWdzOwotICAgIH0KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAKLQkgICYmIHN0cm5jbXAgKHMtPm5hbWUsICIubm90ZSIsIDUpID09IDApCi0JewotCSAgLyogV2UgbmVlZCBhIFBUX05PVEUgc2VnbWVudC4gICovCi0JICArK3NlZ3M7Ci0JfQotICAgIH0KLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgY291bnQgdXAgYW55IHByb2dyYW0gaGVhZGVycyBpdCBtaWdodCBuZWVkLiAgKi8KLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpCi0gICAgewotICAgICAgaW50IGE7Ci0KLSAgICAgIGEgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMpIChhYmZkKTsKLSAgICAgIGlmIChhID09IC0xKQotCWFib3J0ICgpOwotICAgICAgc2VncyArPSBhOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplID0gc2VncyAqIGJlZC0+cy0+c2l6ZW9mX3BoZHI7Ci0gIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5wcm9ncmFtX2hlYWRlcl9zaXplOwotfQotCi0vKiBXb3JrIG91dCB0aGUgZmlsZSBwb3NpdGlvbnMgb2YgYWxsIHRoZSBzZWN0aW9ucy4gIFRoaXMgaXMgY2FsbGVkIGJ5Ci0gICBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMuICBBbGwgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kCi0gICBWTUFzIG11c3QgYmUga25vd24gYmVmb3JlIHRoaXMgaXMgY2FsbGVkLgotCi0gICBXZSBkbyBub3QgY29uc2lkZXIgcmVsb2Mgc2VjdGlvbnMgYXQgdGhpcyBwb2ludCwgdW5sZXNzIHRoZXkgZm9ybQotICAgcGFydCBvZiB0aGUgbG9hZGFibGUgaW1hZ2UuICBSZWxvYyBzZWN0aW9ucyBhcmUgYXNzaWduZWQgZmlsZQotICAgcG9zaXRpb25zIGluIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3JfcmVsb2NzLCB3aGljaCBpcyBjYWxsZWQgYnkKLSAgIHdyaXRlX29iamVjdF9jb250ZW50cyBhbmQgZmluYWxfbGluay4KLQotICAgV2UgYWxzbyBkb24ndCBzZXQgdGhlIHBvc2l0aW9ucyBvZiB0aGUgLnN5bXRhYiBhbmQgLnN0cnRhYiBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFzc2lnbl9maWxlX3Bvc2l0aW9uc19leGNlcHRfcmVsb2NzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICogY29uc3QgdGRhdGEgPSBlbGZfdGRhdGEgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfRWhkciAqIGNvbnN0IGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiogY29uc3QgaV9zaGRycHAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBmaWxlX3B0ciBvZmY7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMAotICAgICAgJiYgYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9jb3JlKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgLyogU3RhcnQgYWZ0ZXIgdGhlIEVMRiBoZWFkZXIuICAqLwotICAgICAgb2ZmID0gaV9laGRycC0+ZV9laHNpemU7Ci0KLSAgICAgIC8qIFdlIGFyZSBub3QgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBhcmUKLQkgbm90IGNyZWF0aW5nIGEgcHJvZ3JhbSBoZWFkZXIsIGFuZCB0aGF0IHRoZSBhY3R1YWwgb3JkZXIgb2YKLQkgdGhlIHNlY3Rpb25zIGluIHRoZSBmaWxlIGlzIHVuaW1wb3J0YW50LiAgKi8KLSAgICAgIGZvciAoaSA9IDEsIGhkcnBwID0gaV9zaGRycHAgKyAxOyBpIDwgaV9laGRycC0+ZV9zaG51bTsgaSsrLCBoZHJwcCsrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkgIGhkciA9ICpoZHJwcDsKLQkgIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBoZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0JICAgIHsKLQkgICAgICBoZHItPnNoX29mZnNldCA9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAoaSA9PSB0ZGF0YS0+c3ltdGFiX3NlY3Rpb24KLQkgICAgICB8fCBpID09IHRkYXRhLT5zdHJ0YWJfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGhkci0+c2hfb2Zmc2V0ID0gLTE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqKmhkcnBwOwotCi0gICAgICAvKiBBc3NpZ24gZmlsZSBwb3NpdGlvbnMgZm9yIHRoZSBsb2FkZWQgc2VjdGlvbnMgYmFzZWQgb24gdGhlCi0gICAgICAgICBhc3NpZ25tZW50IG9mIHNlY3Rpb25zIHRvIHNlZ21lbnRzLiAgKi8KLSAgICAgIGlmICghIGFzc2lnbl9maWxlX3Bvc2l0aW9uc19mb3Jfc2VnbWVudHMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQXNzaWduIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgb3RoZXIgc2VjdGlvbnMuICAqLwotCi0gICAgICBvZmYgPSBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zOwotICAgICAgZm9yIChpID0gMSwgaGRycHAgPSBpX3NoZHJwcCArIDE7IGkgPCBpX2VoZHJwLT5lX3NobnVtOyBpKyssIGhkcnBwKyspCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLQotCSAgaGRyID0gKmhkcnBwOwotCSAgaWYgKGhkci0+YmZkX3NlY3Rpb24gIT0gTlVMTAotCSAgICAgICYmIGhkci0+YmZkX3NlY3Rpb24tPmZpbGVwb3MgIT0gMCkKLQkgICAgaGRyLT5zaF9vZmZzZXQgPSBoZHItPmJmZF9zZWN0aW9uLT5maWxlcG9zOwotCSAgZWxzZSBpZiAoKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogd2FybmluZzogYWxsb2NhdGVkIHNlY3Rpb24gYCVzJyBub3QgaW4gc2VnbWVudCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJKGhkci0+YmZkX3NlY3Rpb24gPT0gTlVMTAotCQkgPyAiKnVua25vd24qIgotCQkgOiBoZHItPmJmZF9zZWN0aW9uLT5uYW1lKSkpOwotCSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEX1BBR0VEKSAhPSAwKQotCQlvZmYgKz0gKGhkci0+c2hfYWRkciAtIG9mZikgJSBiZWQtPm1heHBhZ2VzaXplOwotCSAgICAgIGVsc2UKLQkJb2ZmICs9IChoZHItPnNoX2FkZHIgLSBvZmYpICUgaGRyLT5zaF9hZGRyYWxpZ247Ci0JICAgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLAotCQkJCQkJCSAgICAgICBmYWxzZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMCi0JCSAgIHx8IGhkci0+c2hfdHlwZSA9PSBTSFRfUkVMQQotCQkgICB8fCBoZHIgPT0gaV9zaGRycHBbdGRhdGEtPnN5bXRhYl9zZWN0aW9uXQotCQkgICB8fCBoZHIgPT0gaV9zaGRycHBbdGRhdGEtPnN0cnRhYl9zZWN0aW9uXSkKLQkgICAgaGRyLT5zaF9vZmZzZXQgPSAtMTsKLQkgIGVsc2UKLQkgICAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKGhkciwgb2ZmLCB0cnVlKTsKLQl9Ci0gICAgfQotCi0gIC8qIFBsYWNlIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotICBvZmYgPSBhbGlnbl9maWxlX3Bvc2l0aW9uIChvZmYsIGJlZC0+cy0+ZmlsZV9hbGlnbik7Ci0gIGlfZWhkcnAtPmVfc2hvZmYgPSBvZmY7Ci0gIG9mZiArPSBpX2VoZHJwLT5lX3NobnVtICogaV9laGRycC0+ZV9zaGVudHNpemU7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXByZXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9QaGRyICppX3BoZHJwID0gMDsgLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1NoZHIgKippX3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgaW50ZXJuYWwgZm9ybSAqLwotICBpbnQgY291bnQ7Ci0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnNoc3RydGFiOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotCi0gIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChhYmZkKTsKLSAgaV9zaGRycCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCk7Ci0KLSAgc2hzdHJ0YWIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKHNoc3RydGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9zaHN0cnRhYiAoYWJmZCkgPSBzaHN0cnRhYjsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzBdID0gRUxGTUFHMDsKLSAgaV9laGRycC0+ZV9pZGVudFtFSV9NQUcxXSA9IEVMRk1BRzE7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMl0gPSBFTEZNQUcyOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX01BRzNdID0gRUxGTUFHMzsKLQotICBpX2VoZHJwLT5lX2lkZW50W0VJX0NMQVNTXSA9IGJlZC0+cy0+ZWxmY2xhc3M7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfREFUQV0gPQotICAgIGJmZF9iaWdfZW5kaWFuIChhYmZkKSA/IEVMRkRBVEEyTVNCIDogRUxGREFUQTJMU0I7Ci0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfVkVSU0lPTl0gPSBiZWQtPnMtPmV2X2N1cnJlbnQ7Ci0KLSAgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZPU0FCSV9TWVNWOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX0FCSVZFUlNJT05dID0gMDsKLQotICBmb3IgKGNvdW50ID0gRUlfUEFEOyBjb3VudCA8IEVJX05JREVOVDsgY291bnQrKykKLSAgICBpX2VoZHJwLT5lX2lkZW50W2NvdW50XSA9IDA7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfRFlOOwotICBlbHNlIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDApCi0gICAgaV9laGRycC0+ZV90eXBlID0gRVRfRVhFQzsKLSAgZWxzZSBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpID09IGJmZF9jb3JlKQotICAgIGlfZWhkcnAtPmVfdHlwZSA9IEVUX0NPUkU7Ci0gIGVsc2UKLSAgICBpX2VoZHJwLT5lX3R5cGUgPSBFVF9SRUw7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3Vua25vd246Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9OT05FOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGlmIChiZWQtPnMtPmFyY2hfc2l6ZSA9PSA2NCkKLQlpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TUEFSQ1Y5OwotICAgICAgZWxzZQotCWlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1NQQVJDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fMzg2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fNjhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tODhrOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODhLOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pODYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fODYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fOTYwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9taXBzOgkvKiBNSVBTIFJ4eHh4ICovCi0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NSVBTOwkvKiBvbmx5IE1JUFMgUjMwMDAgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaHBwYToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BBUklTQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX1BQQzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9BTFBIQTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9TSDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfZDEwdjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19EMTBWOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9kMzB2OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX0QzMFY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX2ZyMzA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfRlIzMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbWNvcmU6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9NQ09SRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfdjg1MDoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIDA6ICAgICAgICAgICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX1Y4NTA7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgY2FzZSBiZmRfYXJjaF9hcmM6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfQVJDOwotICAgICAgYnJlYWs7Ci0gICBjYXNlIGJmZF9hcmNoX2FybToKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0FSTTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfbTMycjoKLSAgICAgIGlfZWhkcnAtPmVfbWFjaGluZSA9IEVNX0NZR05VU19NMzJSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfYXJjaF9tbjEwMjAwOgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fQ1lHTlVTX01OMTAyMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAzMDA6Ci0gICAgICBpX2VoZHJwLT5lX21hY2hpbmUgPSBFTV9DWUdOVVNfTU4xMDMwMDsKLSAgICAgIGJyZWFrOwotICAgICAgLyogYWxzbyBub3RlIHRoYXQgRU1fTTMyLCBBVCZUIFdFMzIxMDAgaXMgdW5rbm93biB0byBiZmQgKi8KLSAgICBkZWZhdWx0OgotICAgICAgaV9laGRycC0+ZV9tYWNoaW5lID0gRU1fTk9ORTsKLSAgICB9Ci0gIGlfZWhkcnAtPmVfdmVyc2lvbiA9IGJlZC0+cy0+ZXZfY3VycmVudDsKLSAgaV9laGRycC0+ZV9laHNpemUgPSBiZWQtPnMtPnNpemVvZl9laGRyOwotCi0gIC8qIG5vIHByb2dyYW0gaGVhZGVyLCBmb3Igbm93LiAqLwotICBpX2VoZHJwLT5lX3Bob2ZmID0gMDsKLSAgaV9laGRycC0+ZV9waGVudHNpemUgPSAwOwotICBpX2VoZHJwLT5lX3BobnVtID0gMDsKLQotICAvKiBlYWNoIGJmZCBzZWN0aW9uIGlzIHNlY3Rpb24gaGVhZGVyIGVudHJ5ICovCi0gIGlfZWhkcnAtPmVfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwotICBpX2VoZHJwLT5lX3NoZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3NoZHI7Ci0KLSAgLyogaWYgd2UncmUgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgd2UnbGwgbmVlZCBhIHByb2dyYW0gaGVhZGVyIHRhYmxlICovCi0gIGlmIChhYmZkLT5mbGFncyAmIEVYRUNfUCkKLSAgICB7Ci0gICAgICAvKiBpdCBhbGwgaGFwcGVucyBsYXRlciAqLwotI2lmIDAKLSAgICAgIGlfZWhkcnAtPmVfcGhlbnRzaXplID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcik7Ci0KLSAgICAgIC8qIGVsZl9idWlsZF9waGRycygpIHJldHVybnMgYSAoTlVMTC10ZXJtaW5hdGVkKSBhcnJheSBvZgotCSBFbGZfSW50ZXJuYWxfUGhkcnMgKi8KLSAgICAgIGlfcGhkcnAgPSBlbGZfYnVpbGRfcGhkcnMgKGFiZmQsIGlfZWhkcnAsIGlfc2hkcnAsICZpX2VoZHJwLT5lX3BobnVtKTsKLSAgICAgIGlfZWhkcnAtPmVfcGhvZmYgPSBvdXRiYXNlOwotICAgICAgb3V0YmFzZSArPSBpX2VoZHJwLT5lX3BoZW50c2l6ZSAqIGlfZWhkcnAtPmVfcGhudW07Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpX2VoZHJwLT5lX3BoZW50c2l6ZSA9IDA7Ci0gICAgICBpX3BoZHJwID0gMDsKLSAgICAgIGlfZWhkcnAtPmVfcGhvZmYgPSAwOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2hzdHJ0YWIsICIuc3ltdGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5zdHJ0YWJfaGRyLnNoX25hbWUgPQotICAgICh1bnNpZ25lZCBpbnQpIF9iZmRfc3RyaW5ndGFiX2FkZCAoc2hzdHJ0YWIsICIuc3RydGFiIiwgdHJ1ZSwgZmFsc2UpOwotICBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfbmFtZSA9Ci0gICAgKHVuc2lnbmVkIGludCkgX2JmZF9zdHJpbmd0YWJfYWRkIChzaHN0cnRhYiwgIi5zaHN0cnRhYiIsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMQotICAgICAgfHwgZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9uYW1lID09ICh1bnNpZ25lZCBpbnQpIC0xCi0gICAgICB8fCBlbGZfdGRhdGEgKGFiZmQpLT5zaHN0cnRhYl9oZHIuc2hfbmFtZSA9PSAodW5zaWduZWQgaW50KSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFzc2lnbiBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSByZWxvYyBzZWN0aW9ucyB3aGljaCBhcmUgbm90IHBhcnQKLSAgIG9mIHRoZSBsb2FkYWJsZSBmaWxlIGltYWdlLiAgKi8KLQotdm9pZAotX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25zX2Zvcl9yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgb2ZmOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKipzaGRycHA7Ci0KLSAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKLQotICBmb3IgKGkgPSAxLCBzaGRycHAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpICsgMTsKLSAgICAgICBpIDwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hudW07Ci0gICAgICAgaSsrLCBzaGRycHArKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc2hkcnA7Ci0KLSAgICAgIHNoZHJwID0gKnNoZHJwcDsKLSAgICAgIGlmICgoc2hkcnAtPnNoX3R5cGUgPT0gU0hUX1JFTCB8fCBzaGRycC0+c2hfdHlwZSA9PSBTSFRfUkVMQSkKLQkgICYmIHNoZHJwLT5zaF9vZmZzZXQgPT0gLTEpCi0Jb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHNoZHJwLCBvZmYsIHRydWUpOwotICAgIH0KLQotICBlbGZfdGRhdGEgKGFiZmQpLT5uZXh0X2ZpbGVfcG9zID0gb2ZmOwotfQotCi1ib29sZWFuCi1fYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaV9zaGRycDsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpZiAoISBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuCi0gICAgICAmJiAhIF9iZmRfZWxmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICAgICAgICAgICAgIChhYmZkLCAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0KLSAgZmFpbGVkID0gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgYmVkLT5zLT53cml0ZV9yZWxvY3MsICZmYWlsZWQpOwotICBpZiAoZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCk7Ci0KLSAgLyogQWZ0ZXIgd3JpdGluZyB0aGUgaGVhZGVycywgd2UgbmVlZCB0byB3cml0ZSB0aGUgc2VjdGlvbnMgdG9vLi4uICovCi0gIGZvciAoY291bnQgPSAxOyBjb3VudCA8IGlfZWhkcnAtPmVfc2hudW07IGNvdW50KyspCi0gICAgewotICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nKQotCSgqYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcpIChhYmZkLCBpX3NoZHJwW2NvdW50XSk7Ci0gICAgICBpZiAoaV9zaGRycFtjb3VudF0tPmNvbnRlbnRzKQotCXsKLQkgIGlmIChiZmRfc2VlayAoYWJmZCwgaV9zaGRycFtjb3VudF0tPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3dyaXRlIChpX3NoZHJwW2NvdW50XS0+Y29udGVudHMsIGlfc2hkcnBbY291bnRdLT5zaF9zaXplLAotCQkJICAgICAxLCBhYmZkKQotCQkgICE9IGlfc2hkcnBbY291bnRdLT5zaF9zaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzZWN0aW9uIGhlYWRlciBuYW1lcy4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfaGRyLnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8ICEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZWxmX3Noc3RydGFiIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpCi0gICAgKCpiZWQtPmVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcpIChhYmZkLAotCQkJCQkJZWxmX3RkYXRhIChhYmZkKS0+bGlua2VyKTsKLQotICByZXR1cm4gYmVkLT5zLT53cml0ZV9zaGRyc19hbmRfZWhkciAoYWJmZCk7Ci19Ci0KLWJvb2xlYW4KLV9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIEhvcGVmdWxseSB0aGlzIGNhbiBiZSBkb25lIGp1c3QgbGlrZSBhbiBvYmplY3QgZmlsZS4gKi8KLSAgcmV0dXJuIF9iZmRfZWxmX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCk7Ci19Ci0vKiBnaXZlbiBhIHNlY3Rpb24sIHNlYXJjaCB0aGUgaGVhZGVyIHRvIGZpbmQgdGhlbS4uLiAqLwotaW50Ci1fYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzZWMgKmFzZWN0OwotewotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotICBpbnQgaW5kZXg7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gIGludCBtYXhpbmRleCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1heGluZGV4OyBpbmRleCsrKQotICAgIHsKLSAgICAgIGhkciA9IGlfc2hkcnBbaW5kZXhdOwotICAgICAgaWYgKGhkci0+YmZkX3NlY3Rpb24gPT0gYXNlY3QpCi0JcmV0dXJuIGluZGV4OwotICAgIH0KLQotICBpZiAoYmVkLT5lbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24pCi0gICAgewotICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbWF4aW5kZXg7IGluZGV4KyspCi0JewotCSAgaW50IHJldHZhbDsKLQotCSAgaGRyID0gaV9zaGRycFtpbmRleF07Ci0JICByZXR2YWwgPSBpbmRleDsKLQkgIGlmICgoKmJlZC0+ZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uKQotCSAgICAgIChhYmZkLCBoZHIsIGFzZWN0LCAmcmV0dmFsKSkKLQkgICAgcmV0dXJuIHJldHZhbDsKLQl9Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGFzZWN0KSkKLSAgICByZXR1cm4gU0hOX0FCUzsKLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoYXNlY3QpKQotICAgIHJldHVybiBTSE5fQ09NTU9OOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChhc2VjdCkpCi0gICAgcmV0dXJuIFNITl9VTkRFRjsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qIEdpdmVuIGEgQkZEIHN5bWJvbCwgcmV0dXJuIHRoZSBpbmRleCBpbiB0aGUgRUxGIHN5bWJvbCB0YWJsZSwgb3IgLTEKLSAgIG9uIGVycm9yLiAgKi8KLQotaW50Ci1fYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCBhc3ltX3B0cl9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmFzeW1fcHRyX3B0cjsKLXsKLSAgYXN5bWJvbCAqYXN5bV9wdHIgPSAqYXN5bV9wdHJfcHRyOwotICBpbnQgaWR4OwotICBmbGFnd29yZCBmbGFncyA9IGFzeW1fcHRyLT5mbGFnczsKLQotICAvKiBXaGVuIGdhcyBjcmVhdGVzIHJlbG9jYXRpb25zIGFnYWluc3QgbG9jYWwgbGFiZWxzLCBpdCBjcmVhdGVzIGl0cwotICAgICBvd24gc3ltYm9sIGZvciB0aGUgc2VjdGlvbiwgYnV0IGRvZXMgcHV0IHRoZSBzeW1ib2wgaW50byB0aGUKLSAgICAgc3ltYm9sIGNoYWluLCBzbyB1ZGF0YSBpcyAwLiAgV2hlbiB0aGUgbGlua2VyIGlzIGdlbmVyYXRpbmcKLSAgICAgcmVsb2NhdGFibGUgb3V0cHV0LCB0aGlzIHNlY3Rpb24gc3ltYm9sIG1heSBiZSBmb3Igb25lIG9mIHRoZQotICAgICBpbnB1dCBzZWN0aW9ucyByYXRoZXIgdGhhbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotICBpZiAoYXN5bV9wdHItPnVkYXRhLmkgPT0gMAotICAgICAgJiYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgICAgJiYgYXN5bV9wdHItPnNlY3Rpb24pCi0gICAgewotICAgICAgaW50IGluZHg7Ci0KLSAgICAgIGlmIChhc3ltX3B0ci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQlpbmR4ID0gYXN5bV9wdHItPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5pbmRleDsKLSAgICAgIGVsc2UKLQlpbmR4ID0gYXN5bV9wdHItPnNlY3Rpb24tPmluZGV4OwotICAgICAgaWYgKGVsZl9zZWN0aW9uX3N5bXMgKGFiZmQpW2luZHhdKQotCWFzeW1fcHRyLT51ZGF0YS5pID0gZWxmX3NlY3Rpb25fc3ltcyAoYWJmZClbaW5keF0tPnVkYXRhLmk7Ci0gICAgfQotCi0gIGlkeCA9IGFzeW1fcHRyLT51ZGF0YS5pOwotCi0gIGlmIChpZHggPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIHdoZW4gdXNpbmcgLS1zdHJpcC1zeW1ib2wgb24gYSBzeW1ib2wKLSAgICAgICAgIHdoaWNoIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uIGVudHJ5LiAgKi8KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChhc3ltX3B0cikpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotI2lmIERFQlVHICYgNAotICB7Ci0gICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgXygiZWxmX3N5bWJvbF9mcm9tX2JmZF9zeW1ib2wgMHglLjhseCwgbmFtZSA9ICVzLCBzeW0gbnVtID0gJWQsIGZsYWdzID0gMHglLjhseCVzXG4iKSwKLQkgICAgIChsb25nKSBhc3ltX3B0ciwgYXN5bV9wdHItPm5hbWUsIGlkeCwgZmxhZ3MsCi0JICAgICBlbGZfc3ltYm9sX2ZsYWdzIChmbGFncykpOwotICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogQ29weSBwcml2YXRlIEJGRCBkYXRhLiAgVGhpcyBjb3BpZXMgYW55IHByb2dyYW0gaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICppZWhkcjsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbWZpcnN0OwotICBzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICoqcG07Ci0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm07Ci0gIEVsZl9JbnRlcm5hbF9QaGRyICpwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IG51bV9zZWdtZW50czsKLSAgYm9vbGVhbiBwaGRyX2luY2x1ZGVkID0gZmFsc2U7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChlbGZfdGRhdGEgKGliZmQpLT5waGRyID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWVoZHIgPSBlbGZfZWxmaGVhZGVyIChpYmZkKTsKLQotICBtZmlyc3QgPSBOVUxMOwotICBwbSA9ICZtZmlyc3Q7Ci0KLSAgbnVtX3NlZ21lbnRzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfcGhudW07Ci0KLSNkZWZpbmUgSVNfQ09OVEFJTkVEX0JZKGFkZHIsIGxlbiwgYm90dG9tLCBwaGRyKQkJIAlcCi0JICAoKGFkZHIpID49IChib3R0b20pCQkJCSAJICAJXAotCSAgICYmICggICAoKGFkZHIpICsgKGxlbikpIDw9ICgoYm90dG9tKSArIChwaGRyKS0+cF9tZW1zeikJXAotCSAgICAgICB8fCAoKGFkZHIpICsgKGxlbikpIDw9ICgoYm90dG9tKSArIChwaGRyKS0+cF9maWxlc3opKSkKLQotICAvKiBTcGVjaWFsIGNhc2U6IGNvcmVmaWxlICJOT1RFIiBzZWN0aW9uIGNvbnRhaW5pbmcgcmVncywgcHJwc2luZm8gZXRjLiAqLwotCi0jZGVmaW5lIElTX0NPUkVGSUxFX05PVEUocCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgIChwLT5wX3R5cGUgPT0gUFRfTk9URSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIGJmZF9nZXRfZm9ybWF0IChpYmZkKSA9PSBiZmRfY29yZSAgICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgJiYgcy0+dm1hID09IDAgJiYgcy0+bG1hID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JICAgICAmJiAoYmZkX3ZtYSkgcy0+ZmlsZXBvcyA+PSBwLT5wX29mZnNldCAgICAgICAgICAgICAgICAgICAgIFwKLQkgICAgICYmIChiZmRfdm1hKSBzLT5maWxlcG9zICsgcy0+X3Jhd19zaXplICAgICAgICAgICAgICAgICAgICAgXAotCSAgICAgPD0gcC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeikKLQotICAvKiBUaGUgY29tcGxpY2F0ZWQgY2FzZSB3aGVuIHBfdmFkZHIgaXMgMCBpcyB0byBoYW5kbGUgdGhlIFNvbGFyaXMKLSAgICAgbGlua2VyLCB3aGljaCBnZW5lcmF0ZXMgYSBQVF9JTlRFUlAgc2VjdGlvbiB3aXRoIHBfdmFkZHIgYW5kCi0gICAgIHBfbWVtc3ogc2V0IHRvIDAuICAqLwotCi0jZGVmaW5lIElTX1NPTEFSSVNfUFRfSU5URVJQKHAsIHMpCQkJCQlcCi0JICAgIChwLT5wX3ZhZGRyID09IDAJCQkJCQlcCi0JICAgICAmJiBwLT5wX2ZpbGVzeiA+IDAJCQkJCQlcCi0JICAgICAmJiAocy0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCQkJXAotCSAgICAgJiYgcy0+X3Jhd19zaXplID4gMAkJCQkJXAotCSAgICAgJiYgKGJmZF92bWEpIHMtPmZpbGVwb3MgPj0gcC0+cF9vZmZzZXQJCQlcCi0JICAgICAmJiAoKGJmZF92bWEpIHMtPmZpbGVwb3MgKyBzLT5fcmF3X3NpemUJCQlcCi0JCSAgICAgPD0gcC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzeikpCi0KLSAgLyogU2NhbiB0aHJvdWdoIHRoZSBzZWdtZW50cyBzcGVjaWZpZWQgaW4gdGhlIHByb2dyYW0gaGVhZGVyCi0gICAgIG9mIHRoZSBpbnB1dCBCRkQuICAqLwotICBmb3IgKGkgPSAwLCBwID0gZWxmX3RkYXRhIChpYmZkKS0+cGhkcjsgaSA8IG51bV9zZWdtZW50czsgaSsrLCBwKyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGNzZWNzOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zOwotICAgICAgYXNlY3Rpb24gKm9zOwotICAgICAgdW5zaWduZWQgaW50IGlzZWM7Ci0gICAgICBiZmRfdm1hIG1hdGNoaW5nX2xtYTsKLSAgICAgIGJmZF92bWEgc3VnZ2VzdGVkX2xtYTsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICAvKiBGb3IgZWFjaCBzZWN0aW9uIGluIHRoZSBpbnB1dCBCRkQsIGRlY2lkZSBpZiBpdCBzaG91bGQgYmUKLQkgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgc2VnbWVudC4gIEEgc2VjdGlvbiB3aWxsIGJlIGluY2x1ZGVkCi0JIGlmIGl0IGlzIHdpdGhpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgc2VnbWVudCwgYW5kIGl0IGlzCi0JIGFuIGFsbG9jYXRlZCBzZWdtZW50LCBhbmQgdGhlcmUgaXMgYW4gb3V0cHV0IHNlY3Rpb24KLQkgYXNzb2NpYXRlZCB3aXRoIGl0LiAgKi8KLSAgICAgIGNzZWNzID0gMDsKLSAgICAgIGZvciAocyA9IGliZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgewotCSAgICBpZiAoKElTX0NPTlRBSU5FRF9CWSAocy0+dm1hLCBzLT5fcmF3X3NpemUsIHAtPnBfdmFkZHIsIHApCi0JCSB8fCBJU19TT0xBUklTX1BUX0lOVEVSUCAocCwgcykpCi0JCSYmIChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgICArK2NzZWNzOwotCSAgICBlbHNlIGlmIChJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkgICAgICArK2NzZWNzOwotCSAgfQotCi0gICAgICAvKiBBbGxvY2F0ZSBhIHNlZ21lbnQgbWFwIGJpZyBlbm91Z2ggdG8gY29udGFpbiBhbGwgb2YgdGhlCi0JIHNlY3Rpb25zIHdlIGhhdmUgc2VsZWN0ZWQuICAqLwotICAgICAgbSA9ICgoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKQotCSAgIGJmZF9hbGxvYyAob2JmZCwKLQkJICAgICAgKHNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkKLQkJICAgICAgICsgKChzaXplX3QpIGNzZWNzIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSkpOwotICAgICAgaWYgKG0gPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpZWxkcyBvZiB0aGUgc2VnbWVudCBtYXAuICBEZWZhdWx0IHRvCi0JIHVzaW5nIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IGluIHRoZSBpbnB1dCBCRkQuICAqLwotICAgICAgbS0+bmV4dCAgICAgICAgICA9IE5VTEw7Ci0gICAgICBtLT5wX3R5cGUgICAgICAgID0gcC0+cF90eXBlOwotICAgICAgbS0+cF9mbGFncyAgICAgICA9IHAtPnBfZmxhZ3M7Ci0gICAgICBtLT5wX2ZsYWdzX3ZhbGlkID0gMTsKLSAgICAgIG0tPnBfcGFkZHIgICAgICAgPSBwLT5wX3BhZGRyOwotICAgICAgbS0+cF9wYWRkcl92YWxpZCA9IDE7Ci0KLSAgICAgIC8qIERldGVybWluZSBpZiB0aGlzIHNlZ21lbnQgY29udGFpbnMgdGhlIEVMRiBmaWxlIGhlYWRlcgotCSBhbmQgaWYgaXQgY29udGFpbnMgdGhlIHByb2dyYW0gaGVhZGVycyB0aGVtc2VsdmVzLiAgKi8KLSAgICAgIG0tPmluY2x1ZGVzX2ZpbGVoZHIgPSAocC0+cF9vZmZzZXQgPT0gMAotCQkJICAgICAmJiBwLT5wX2ZpbGVzeiA+PSBpZWhkci0+ZV9laHNpemUpOwotCi0gICAgICBtLT5pbmNsdWRlc19waGRycyA9IDA7Ci0KLSAgICAgIGlmICghIHBoZHJfaW5jbHVkZWQgfHwgcC0+cF90eXBlICE9IFBUX0xPQUQpCi0JewotCSAgbS0+aW5jbHVkZXNfcGhkcnMgPQotCSAgICAocC0+cF9vZmZzZXQgPD0gKGJmZF92bWEpIGllaGRyLT5lX3Bob2ZmCi0JICAgICAmJiAocC0+cF9vZmZzZXQgKyBwLT5wX2ZpbGVzegotCQkgPj0gKChiZmRfdm1hKSBpZWhkci0+ZV9waG9mZgotCQkgICAgICsgaWVoZHItPmVfcGhudW0gKiBpZWhkci0+ZV9waGVudHNpemUpKSk7Ci0JICBpZiAocC0+cF90eXBlID09IFBUX0xPQUQgJiYgbS0+aW5jbHVkZXNfcGhkcnMpCi0JICAgIHBoZHJfaW5jbHVkZWQgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKGNzZWNzID09IDApCi0JewotCSAgLyogU3BlY2lhbCBzZWdtZW50cywgc3VjaCBhcyB0aGUgUFRfUEhEUiBzZWdtZW50LCBtYXkgY29udGFpbgotCSAgICAgbm8gc2VjdGlvbnMsIGJ1dCBvcmRpbmFyeSwgbG9hZGFibGUgc2VnbWVudHMgc2hvdWxkIGNvbnRhaW4KLQkgICAgIHNvbWV0aGluZy4gICovCi0KLQkgIGlmIChwLT5wX3R5cGUgPT0gUFRfTE9BRCkKLQkgICAgICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkJKF8oIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotCSAgbS0+Y291bnQgPSAwOwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTm93IHNjYW4gdGhlIHNlY3Rpb25zIGluIHRoZSBpbnB1dCBCRkQgYWdhaW4gYW5kIGF0dGVtcHQKLQkgdG8gYWRkIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHNlY3Rpb25zIHRvIHRoZSBzZWdtZW50IG1hcC4KLQkgVGhlIHByb2JsZW0gaGVyZSBpcyBob3cgdG8gaGFuZGxlIGFuIG91dHB1dCBzZWN0aW9uIHdoaWNoIGhhcwotCSBiZWVuIG1vdmVkIChpZSBoYWQgaXRzIExNQSBjaGFuZ2VkKS4gIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmlsaXRpZXM6Ci0KLQkgMS4gTm9uZSBvZiB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkLgotCSAgICBJbiB0aGlzIGNhc2Ugd2UgY2FuIGNvbnRpbnVlIHRvIHVzZSB0aGUgc2VnbWVudCBMTUEgZnJvbSB0aGUKLQkgICAgaW5wdXQgQkZELgotCi0JIDIuIEFsbCBvZiB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkIGJ5IHRoZSBzYW1lIGFtb3VudC4KLQkgICAgSW4gdGhpcyBjYXNlIHdlIGNhbiBjaGFuZ2UgdGhlIHNlZ21lbnQncyBMTUEgdG8gbWF0Y2ggdGhlIExNQQotCSAgICBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQotCSAzLiBTb21lIG9mIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gbW92ZWQsIG90aGVycyBoYXZlIG5vdC4KLQkgICAgSW4gdGhpcyBjYXNlIHRob3NlIHNlY3Rpb25zIHdoaWNoIGhhdmUgbm90IGJlZW4gbW92ZWQgY2FuIGJlCi0JICAgIHBsYWNlZCBpbiB0aGUgY3VycmVudCBzZWdtZW50IHdoaWNoIHdpbGwgaGF2ZSB0byBoYXZlIGl0cyBzaXplLAotCSAgICBhbmQgcG9zc2libHkgaXRzIExNQSBjaGFuZ2VkLCBhbmQgYSBuZXcgc2VnbWVudCBvciBzZWdtZW50cyB3aWxsCi0JICAgIGhhdmUgdG8gYmUgY3JlYXRlZCB0byBjb250YWluIHRoZSBvdGhlciBzZWN0aW9ucy4KLQotCSA0LiBUaGUgc2VjdGlvbnMgaGF2ZSBiZWVuIG1vdmVkLCBidXQgbm90IGJlIHRoZSBzYW1lIGFtb3VudC4KLQkgICAgSW4gdGhpcyBjYXNlIHdlIGNhbiBjaGFuZ2UgdGhlIHNlZ21lbnQncyBMTUEgdG8gbWF0Y2ggdGhlIExNQQotCSAgICBvZiB0aGUgZmlyc3Qgc2VjdGlvbiBhbmQgd2Ugd2lsbCBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBzZWdtZW50Ci0JICAgIG9yIHNlZ21lbnRzIHRvIGNvbnRhaW4gdGhlIG90aGVyIHNlY3Rpb25zLgotCi0JIEluIG9yZGVyIHRvIHNhdmUgdGltZSwgd2UgYWxsb2NhdGUgYW4gYXJyYXkgdG8gaG9sZCB0aGUgc2VjdGlvbgotCSBwb2ludGVycyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgQXMgdGhlc2Ugc2VjdGlvbnMgZ2V0IGFzc2lnbmVkCi0JIHRvIGEgc2VnbWVudCwgdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoaXMgYXJyYXkuICAqLwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChhc2VjdGlvbiAqKSAqIGNzZWNzKTsKLSAgICAgIGlmIChzZWN0aW9ucyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU3RlcCBPbmU6IFNjYW4gZm9yIHNlZ21lbnQgdnMgc2VjdGlvbiBMTUEgY29uZmxpY3RzLgotCSBBbHNvIGFkZCB0aGUgc2VjdGlvbnMgdG8gdGhlIHNlY3Rpb24gYXJyYXkgYWxsb2NhdGVkIGFib3ZlLgotCSBBbHNvIGFkZCB0aGUgc2VjdGlvbnMgdG8gdGhlIGN1cnJlbnQgc2VnbWVudC4gIEluIHRoZSBjb21tb24KLQkgY2FzZSwgd2hlcmUgdGhlIHNlY3Rpb25zIGhhdmUgbm90IGJlZW4gbW92ZWQsIHRoaXMgbWVhbnMgdGhhdAotCSB3ZSBoYXZlIGNvbXBsZXRlbHkgZmlsbGVkIHRoZSBzZWdtZW50LCBhbmQgdGhlcmUgaXMgbm90aGluZwotCSBtb3JlIHRvIGRvLiAgKi8KLQotICAgICAgaXNlYyA9IDA7Ci0gICAgICBtYXRjaGluZ19sbWEgPSBmYWxzZTsKLSAgICAgIHN1Z2dlc3RlZF9sbWEgPSAwOwotCi0gICAgICBmb3IgKGogPSAwLCBzID0gaWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgb3MgPSBzLT5vdXRwdXRfc2VjdGlvbjsKLQotCSAgaWYgKCgoKElTX0NPTlRBSU5FRF9CWSAocy0+dm1hLCBzLT5fcmF3X3NpemUsIHAtPnBfdmFkZHIsIHApCi0JCSB8fCBJU19TT0xBUklTX1BUX0lOVEVSUCAocCwgcykpCi0JCSYmIChzLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkgICAgICAgfHwgSVNfQ09SRUZJTEVfTk9URSAocCwgcykpCi0JICAgICAgJiYgb3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNlY3Rpb25zW2orK10gPSBzOwotCi0JICAgICAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGxpbmtlciBhbHdheXMgc2V0cyBwX3BhZGRyIHRvIDAuCi0JCSBXZSB0cnkgdG8gY2F0Y2ggdGhhdCBjYXNlIGhlcmUsIGFuZCBzZXQgaXQgdG8gdGhlCi0JCSBjb3JyZWN0IHZhbHVlLiAgKi8KLQkgICAgICBpZiAocC0+cF9wYWRkciA9PSAwCi0JCSAgJiYgcC0+cF92YWRkciAhPSAwCi0JCSAgJiYgaXNlYyA9PSAwCi0JCSAgJiYgb3MtPmxtYSAhPSAwCi0JCSAgJiYgKG9zLT52bWEgPT0gKHAtPnBfdmFkZHIKLQkJCQkgICsgKG0tPmluY2x1ZGVzX2ZpbGVoZHIKLQkJCQkgICAgID8gaWVoZHItPmVfZWhzaXplCi0JCQkJICAgICA6IDApCi0JCQkJICArIChtLT5pbmNsdWRlc19waGRycwotCQkJCSAgICAgPyBpZWhkci0+ZV9waG51bSAqIGllaGRyLT5lX3BoZW50c2l6ZQotCQkJCSAgICAgOiAwKSkpKQotCQltLT5wX3BhZGRyID0gcC0+cF92YWRkcjsKLQotCSAgICAgIC8qIE1hdGNoIHVwIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzZWdtZW50IHdpdGggdGhlCi0JCSBMTUEgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChJU19DT05UQUlORURfQlkgKG9zLT5sbWEsIG9zLT5fcmF3X3NpemUsIG0tPnBfcGFkZHIsIHApCi0JCSAgfHwgSVNfQ09SRUZJTEVfTk9URSAocCwgcykpCi0JCXsKLQkJICBpZiAobWF0Y2hpbmdfbG1hID09IDApCi0JCSAgICBtYXRjaGluZ19sbWEgPSBvcy0+bG1hOwotCi0JCSAgLyogV2UgYXNzdW1lIHRoYXQgaWYgdGhlIHNlY3Rpb24gZml0cyB3aXRoaW4gdGhlIHNlZ21lbnQKLQkJICAgICB0aGF0IGl0IGRvZXMgbm90IG92ZXJsYXAgYW55IG90aGVyIHNlY3Rpb24gd2l0aGluIHRoYXQKLQkJICAgICBzZWdtZW50LiAgKi8KLQkJICBtLT5zZWN0aW9uc1tpc2VjKytdID0gb3M7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdWdnZXN0ZWRfbG1hID09IDApCi0JCXN1Z2dlc3RlZF9sbWEgPSBvcy0+bG1hOwotCSAgICB9Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChqID09IGNzZWNzKTsKLQotICAgICAgLyogU3RlcCBUd286IEFkanVzdCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBzZWdtZW50LAotCSBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGlzZWMgPT0gY3NlY3MpCi0JewotCSAgLyogQWxsIG9mIHRoZSBzZWN0aW9ucyBmaXR0ZWQgd2l0aGluIHRoZSBzZWdtZW50IGFzIGN1cnJlbnRseQotCSAgICAgc3BlY2lmaWVkLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBjYXNlLiAgQWRkIHRoZSBzZWdtZW50IHRvCi0JICAgICB0aGUgbGlzdCBvZiBidWlsdCBzZWdtZW50cyBhbmQgY2Fycnkgb24gdG8gcHJvY2VzcyB0aGUgbmV4dAotCSAgICAgcHJvZ3JhbSBoZWFkZXIgaW4gdGhlIGlucHV0IEJGRC4gICovCi0JICBtLT5jb3VudCA9IGNzZWNzOwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGZyZWUgKHNlY3Rpb25zKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKG1hdGNoaW5nX2xtYSAhPSAwKQotCXsKLQkgIC8qIEF0IGxlYXN0IG9uZSBzZWN0aW9uIGZpdHMgaW5zaWRlIHRoZSBjdXJyZW50IHNlZ21lbnQuCi0JICAgICBLZWVwIGl0LCBidXQgbW9kaWZ5IGl0cyBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hdGNoIHRoZQotCSAgICAgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uIHRoYXQgZml0dGVkLiAgKi8KLQotCSAgbS0+cF9wYWRkciA9IG1hdGNoaW5nX2xtYTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm9uZSBvZiB0aGUgc2VjdGlvbnMgZml0dGVkIGluc2lkZSB0aGUgY3VycmVudCBzZWdtZW50LgotCSAgICAgQ2hhbmdlIHRoZSBjdXJyZW50IHNlZ21lbnQncyBwaHlzaWNhbCBhZGRyZXNzIHRvIG1hdGNoCi0JICAgICB0aGUgTE1BIG9mIHRoZSBmaXJzdCBzZWN0aW9uLiAgKi8KLQotCSAgbS0+cF9wYWRkciA9IHN1Z2dlc3RlZF9sbWE7Ci0JfQotCi0gICAgICAvKiBTdGVwIFRocmVlOiBMb29wIG92ZXIgdGhlIHNlY3Rpb25zIGFnYWluLCB0aGlzIHRpbWUgYXNzaWduaW5nCi0JIHRob3NlIHRoYXQgZml0IHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgYW5kIHJlbXZvaW5nIHRoZW0gZnJvbSB0aGUKLQkgc2VjdGlvbnMgYXJyYXk7IGJ1dCBtYWtpbmcgc3VyZSBub3QgdG8gbGVhdmUgbGFyZ2UgZ2Fwcy4gIE9uY2UgYWxsCi0JIHBvc3NpYmxlIHNlY3Rpb25zIGhhdmUgYmVlbiBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBzZWdtZW50IGl0IGlzCi0JIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGJ1aWx0IHNlZ21lbnRzIGFuZCBpZiBzZWN0aW9ucyBzdGlsbCByZW1haW4KLQkgdG8gYmUgYXNzaWduZWQsIGEgbmV3IHNlZ21lbnQgaXMgY29uc3RydWN0ZWQgYmVmb3JlIHJlcGVhdGluZwotCSB0aGUgbG9vcC4gICovCi0gICAgICBpc2VjID0gMDsKLSAgICAgIGRvCi0JewotCSAgbS0+Y291bnQgPSAwOwotCSAgc3VnZ2VzdGVkX2xtYSA9IDA7Ci0KLQkgIC8qIEZpbGwgdGhlIGN1cnJlbnQgc2VnbWVudCB3aXRoIHNlY3Rpb25zIHRoYXQgZml0LiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBjc2VjczsgaisrKQotCSAgICB7Ci0JICAgICAgcyA9IHNlY3Rpb25zW2pdOwotCi0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotCi0JICAgICAgaWYgKElTX0NPTlRBSU5FRF9CWSAob3MtPmxtYSwgb3MtPl9yYXdfc2l6ZSwgbS0+cF9wYWRkciwgcCkKLQkJICB8fCBJU19DT1JFRklMRV9OT1RFIChwLCBzKSkKLQkJewotCQkgIGlmIChtLT5jb3VudCA9PSAwKQotCQkgICAgewotCQkgICAgICAvKiBJZiB0aGUgZmlyc3Qgc2VjdGlvbiBpbiBhIHNlZ21lbnQgZG9lcyBub3Qgc3RhcnQgYXQKLQkJCSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWdtZW50LCB0aGVuIHNvbWV0aGluZyBpcyB3cm9uZy4gICovCi0JCSAgICAgIGlmIChvcy0+bG1hICE9IG0tPnBfcGFkZHIpCi0JCQlhYm9ydCAoKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICogcHJldl9zZWM7Ci0JCSAgICAgIGJmZF92bWEgbWF4cGFnZXNpemU7Ci0KLQkJICAgICAgcHJldl9zZWMgPSBtLT5zZWN0aW9uc1ttLT5jb3VudCAtIDFdOwotCQkgICAgICBtYXhwYWdlc2l6ZSA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChvYmZkKS0+bWF4cGFnZXNpemU7Ci0KLQkJICAgICAgLyogSWYgdGhlIGdhcCBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHNlY3Rpb24KLQkJCSBhbmQgdGhlIHN0YXJ0IG9mIHRoaXMgc2VjdGlvbiBpcyBtb3JlIHRoYW4gbWF4cGFnZXNpemUKLQkJCSB0aGVuIHdlIG5lZWQgdG8gc3RhcnQgYSBuZXcgc2VnbWVudC4gICovCi0JCSAgICAgIGlmIChCRkRfQUxJR04gKHByZXZfc2VjLT5sbWEgKyBwcmV2X3NlYy0+X3Jhd19zaXplLCBtYXhwYWdlc2l6ZSkKLQkJCSAgPCBCRkRfQUxJR04gKG9zLT5sbWEsIG1heHBhZ2VzaXplKSkKLQkJCXsKLQkJCSAgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKLQkJCSAgICBzdWdnZXN0ZWRfbG1hID0gb3MtPmxtYTsKLQotCQkJICBjb250aW51ZTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIG0tPnNlY3Rpb25zW20tPmNvdW50KytdID0gb3M7Ci0JCSAgKytpc2VjOwotCQkgIHNlY3Rpb25zW2pdID0gTlVMTDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN1Z2dlc3RlZF9sbWEgPT0gMCkKLQkJc3VnZ2VzdGVkX2xtYSA9IG9zLT5sbWE7Ci0JICAgIH0KLQotCSAgQkZEX0FTU0VSVCAobS0+Y291bnQgPiAwKTsKLQotCSAgLyogQWRkIHRoZSBjdXJyZW50IHNlZ21lbnQgdG8gdGhlIGxpc3Qgb2YgYnVpbHQgc2VnbWVudHMuICAqLwotCSAgKnBtID0gbTsKLQkgIHBtID0gJm0tPm5leHQ7Ci0KLQkgIGlmIChpc2VjIDwgY3NlY3MpCi0JICAgIHsKLQkgICAgICAvKiBXZSBzdGlsbCBoYXZlIG5vdCBhbGxvY2F0ZWQgYWxsIG9mIHRoZSBzZWN0aW9ucyB0bwotCQkgc2VnbWVudHMuICBDcmVhdGUgYSBuZXcgc2VnbWVudCBoZXJlLCBpbml0aWFsaXNlIGl0Ci0JCSBhbmQgY2Fycnkgb24gbG9vcGluZy4gICovCi0KLQkgICAgICBtID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JCSAgIGJmZF9hbGxvYyAob2JmZCwKLQkJCSAgICAgIChzaXplb2YgKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApCi0JCQkgICAgICAgKyAoKHNpemVfdCkgY3NlY3MgLSAxKSAqIHNpemVvZiAoYXNlY3Rpb24gKikpKSk7Ci0JICAgICAgaWYgKG0gPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmllbGRzIG9mIHRoZSBzZWdtZW50IG1hcC4gIFNldCB0aGUgcGh5c2ljYWwKLQkJIHBoeXNpY2FsIGFkZHJlc3MgdG8gdGhlIExNQSBvZiB0aGUgZmlyc3Qgc2VjdGlvbiB0aGF0IGhhcwotCQkgbm90IHlldCBiZWVuIGFzc2lnbmVkLiAgKi8KLQotCSAgICAgIG0tPm5leHQgICAgICAgICAgICAgPSBOVUxMOwotCSAgICAgIG0tPnBfdHlwZSAgICAgICAgICAgPSBwLT5wX3R5cGU7Ci0JICAgICAgbS0+cF9mbGFncyAgICAgICAgICA9IHAtPnBfZmxhZ3M7Ci0JICAgICAgbS0+cF9mbGFnc192YWxpZCAgICA9IDE7Ci0JICAgICAgbS0+cF9wYWRkciAgICAgICAgICA9IHN1Z2dlc3RlZF9sbWE7Ci0JICAgICAgbS0+cF9wYWRkcl92YWxpZCAgICA9IDE7Ci0JICAgICAgbS0+aW5jbHVkZXNfZmlsZWhkciA9IDA7Ci0JICAgICAgbS0+aW5jbHVkZXNfcGhkcnMgICA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAoaXNlYyA8IGNzZWNzKTsKLQotICAgICAgZnJlZSAoc2VjdGlvbnMpOwotICAgIH0KLQotICAvKiBUaGUgU29sYXJpcyBsaW5rZXIgY3JlYXRlcyBwcm9ncmFtIGhlYWRlcnMgaW4gd2hpY2ggYWxsIHRoZQotICAgICBwX3BhZGRyIGZpZWxkcyBhcmUgemVyby4gIFdoZW4gd2UgdHJ5IHRvIG9iamNvcHkgb3Igc3RyaXAgc3VjaCBhCi0gICAgIGZpbGUsIHdlIGdldCBjb25mdXNlZC4gIENoZWNrIGZvciB0aGlzIGNhc2UsIGFuZCBpZiB3ZSBmaW5kIGl0Ci0gICAgIHJlc2V0IHRoZSBwX3BhZGRyX3ZhbGlkIGZpZWxkcy4gICovCi0gIGZvciAobSA9IG1maXJzdDsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkKLSAgICBpZiAobS0+cF9wYWRkciAhPSAwKQotICAgICAgYnJlYWs7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChtID0gbWZpcnN0OyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotCW0tPnBfcGFkZHJfdmFsaWQgPSAwOwotICAgIH0KLQotICBlbGZfdGRhdGEgKG9iZmQpLT5zZWdtZW50X21hcCA9IG1maXJzdDsKLQotI2lmIDAKLSAgLyogRmluYWwgU3RlcDogU29ydCB0aGUgc2VnbWVudHMgaW50byBhc2NlbmRpbmcgb3JkZXIgb2YgcGh5c2ljYWwgYWRkcmVzcy4gKi8KLSAgaWYgKG1maXJzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAqIHByZXY7Ci0KLSAgICAgIHByZXYgPSBtZmlyc3Q7Ci0gICAgICBmb3IgKG0gPSBtZmlyc3QtPm5leHQ7IG0gIT0gTlVMTDsgcHJldiA9IG0sIG0gPSBtLT5uZXh0KQotCXsKLQkgIC8qIFllcyBJIGtub3cgLSBpdHMgYSBidWJibGUgc29ydC4uLi4qLwotCSAgaWYgKG0tPm5leHQgIT0gTlVMTCAmJiAobS0+bmV4dC0+cF9wYWRkciA8IG0tPnBfcGFkZHIpKQotCSAgICB7Ci0JICAgICAgLyogc3dhcCBtIGFuZCBtLT5uZXh0ICovCi0JICAgICAgcHJldi0+bmV4dCA9IG0tPm5leHQ7Ci0JICAgICAgbS0+bmV4dCA9IG0tPm5leHQtPm5leHQ7Ci0JICAgICAgcHJldi0+bmV4dC0+bmV4dCA9IG07Ci0KLQkgICAgICAvKiByZXN0YXJ0IGxvb3AuICovCi0JICAgICAgbSA9IG1maXJzdDsKLQkgICAgfQotCX0KLSAgICB9Ci0jZW5kaWYKLQotI3VuZGVmIElTX0NPTlRBSU5FRF9CWQotI3VuZGVmIElTX1NPTEFSSVNfUFRfSU5URVJQCi0jdW5kZWYgSVNfQ09SRUZJTEVfTk9URQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24uICBUaGlzIGNvcGllcyBvdmVyIHRoZSBlbnRzaXplCi0gICBmaWVsZCwgYW5kIHNvbWV0aW1lcyB0aGUgaW5mbyBmaWVsZC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMsIG9iZmQsIG9zZWMpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgYXNlY3Rpb24gKm9zZWM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICppaGRyLCAqb2hkcjsKLQotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQ29weSBvdmVyIHByaXZhdGUgQkZEIGRhdGEgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY29waWVkLgotICAgICBUaGlzIG11c3QgYmUgZG9uZSBoZXJlLCByYXRoZXIgdGhhbiBpbiB0aGUgY29weV9wcml2YXRlX2JmZF9kYXRhCi0gICAgIGVudHJ5IHBvaW50LCBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9uCi0gICAgIGNvbnRlbnRzIGhhdmUgYmVlbiBzZXQsIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHByb2dyYW0gaGVhZGVycyBoYXZlCi0gICAgIGFscmVhZHkgYmVlbiB3b3JrZWQgb3V0LiAgKi8KLSAgaWYgKGVsZl90ZGF0YSAob2JmZCktPnNlZ21lbnRfbWFwID09IE5VTEwKLSAgICAgICYmIGVsZl90ZGF0YSAoaWJmZCktPnBoZHIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgLyogT25seSBzZXQgdXAgdGhlIHNlZ21lbnRzIGlmIHRoZXJlIGFyZSBubyBtb3JlIFNFQ19BTExPQwotICAgICAgICAgc2VjdGlvbnMuICBGSVhNRTogVGhpcyB3b24ndCBkbyB0aGUgcmlnaHQgdGhpbmcgaWYgb2JqY29weSBpcwotICAgICAgICAgdXNlZCB0byByZW1vdmUgdGhlIGxhc3QgU0VDX0FMTE9DIHNlY3Rpb24sIHNpbmNlIG9iamNvcHkKLSAgICAgICAgIHdvbid0IGNhbGwgdGhpcyByb3V0aW5lIGluIHRoYXQgY2FzZS4gICovCi0gICAgICBmb3IgKHMgPSBpc2VjLT5uZXh0OyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICBicmVhazsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JewotCSAgaWYgKCEgY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWhkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHI7Ci0gIG9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPnRoaXNfaGRyOwotCi0gIG9oZHItPnNoX2VudHNpemUgPSBpaGRyLT5zaF9lbnRzaXplOwotCi0gIGlmIChpaGRyLT5zaF90eXBlID09IFNIVF9TWU1UQUIKLSAgICAgIHx8IGloZHItPnNoX3R5cGUgPT0gU0hUX0RZTlNZTQotICAgICAgfHwgaWhkci0+c2hfdHlwZSA9PSBTSFRfR05VX3Zlcm5lZWQKLSAgICAgIHx8IGloZHItPnNoX3R5cGUgPT0gU0hUX0dOVV92ZXJkZWYpCi0gICAgb2hkci0+c2hfaW5mbyA9IGloZHItPnNoX2luZm87Ci0KLSAgZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPnVzZV9yZWxhX3AKLSAgICA9IGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT51c2VfcmVsYV9wOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IHByaXZhdGUgc3ltYm9sIGluZm9ybWF0aW9uLiAgSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBzZWN0aW9uCi0gICB3aGljaCB3ZSBkaWQgbm90IG1hcCBpbnRvIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBtYXAgdGhlIHNlY3Rpb24KLSAgIGluZGV4IGNvcnJlY3RseS4gIFdlIHVzZSBzcGVjaWFsIG1hY3JvIGRlZmluaXRpb25zIGZvciB0aGUgbWFwcGVkCi0gICBzZWN0aW9uIGluZGljZXM7IHRoZXNlIGRlZmluaXRpb25zIGFyZSBpbnRlcnByZXRlZCBieSB0aGUKLSAgIHN3YXBfb3V0X3N5bXMgZnVuY3Rpb24uICAqLwotCi0jZGVmaW5lIE1BUF9PTkVTWU1UQUIgKFNITl9MT1JFU0VSVkUgLSAxKQotI2RlZmluZSBNQVBfRFlOU1lNVEFCIChTSE5fTE9SRVNFUlZFIC0gMikKLSNkZWZpbmUgTUFQX1NUUlRBQiAoU0hOX0xPUkVTRVJWRSAtIDMpCi0jZGVmaW5lIE1BUF9TSFNUUlRBQiAoU0hOX0xPUkVTRVJWRSAtIDQpCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bWFyZywgb2JmZCwgb3N5bWFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBhc3ltYm9sICppc3ltYXJnOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKm9zeW1hcmc7Ci17Ci0gIGVsZl9zeW1ib2xfdHlwZSAqaXN5bSwgKm9zeW07Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlzeW0gPSBlbGZfc3ltYm9sX2Zyb20gKGliZmQsIGlzeW1hcmcpOwotICBvc3ltID0gZWxmX3N5bWJvbF9mcm9tIChvYmZkLCBvc3ltYXJnKTsKLQotICBpZiAoaXN5bSAhPSBOVUxMCi0gICAgICAmJiBvc3ltICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaXN5bS0+c3ltYm9sLnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaG5keDsKLQotICAgICAgc2huZHggPSBpc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotICAgICAgaWYgKHNobmR4ID09IGVsZl9vbmVzeW10YWIgKGliZmQpKQotCXNobmR4ID0gTUFQX09ORVNZTVRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl9keW5zeW10YWIgKGliZmQpKQotCXNobmR4ID0gTUFQX0RZTlNZTVRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl90ZGF0YSAoaWJmZCktPnN0cnRhYl9zZWN0aW9uKQotCXNobmR4ID0gTUFQX1NUUlRBQjsKLSAgICAgIGVsc2UgaWYgKHNobmR4ID09IGVsZl90ZGF0YSAoaWJmZCktPnNoc3RydGFiX3NlY3Rpb24pCi0Jc2huZHggPSBNQVBfU0hTVFJUQUI7Ci0gICAgICBvc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4ID0gc2huZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zd2FwX291dF9zeW1zIChhYmZkLCBzdHRwLCByZWxvY2F0YWJsZV9wKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKipzdHRwOwotICAgICBpbnQgcmVsb2NhdGFibGVfcDsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICBpZiAoIWVsZl9tYXBfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIER1bXAgb3V0IHRoZSBzeW10YWJzLiAqLwotICB7Ci0gICAgaW50IHN5bWNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgYXN5bWJvbCAqKnN5bXMgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0dDsKLSAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltc3RydGFiX2hkcjsKLSAgICBjaGFyICpvdXRib3VuZF9zeW1zOwotICAgIGludCBpZHg7Ci0KLSAgICBzdHQgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgICBpZiAoc3R0ID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gICAgc3ltdGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TWU1UQUI7Ci0gICAgc3ltdGFiX2hkci0+c2hfZW50c2l6ZSA9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICBzeW10YWJfaGRyLT5zaF9zaXplID0gc3ltdGFiX2hkci0+c2hfZW50c2l6ZSAqIChzeW1jb3VudCArIDEpOwotICAgIHN5bXRhYl9oZHItPnNoX2luZm8gPSBlbGZfbnVtX2xvY2FscyAoYWJmZCkgKyAxOwotICAgIHN5bXRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IGJlZC0+cy0+ZmlsZV9hbGlnbjsKLQotICAgIHN5bXN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF90eXBlID0gU0hUX1NUUlRBQjsKLQotICAgIG91dGJvdW5kX3N5bXMgPSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgICAgICAgKDEgKyBzeW1jb3VudCkgKiBiZWQtPnMtPnNpemVvZl9zeW0pOwotICAgIGlmIChvdXRib3VuZF9zeW1zID09IE5VTEwpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgc3ltdGFiX2hkci0+Y29udGVudHMgPSAoUFRSKSBvdXRib3VuZF9zeW1zOwotCi0gICAgLyogbm93IGdlbmVyYXRlIHRoZSBkYXRhIChmb3IgImNvbnRlbnRzIikgKi8KLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHplcm90aCBzeW1ib2wgYW5kIHN3YXAgaXQgb3V0LiAgKi8KLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgc3ltLnN0X25hbWUgPSAwOwotICAgICAgc3ltLnN0X3ZhbHVlID0gMDsKLSAgICAgIHN5bS5zdF9zaXplID0gMDsKLSAgICAgIHN5bS5zdF9pbmZvID0gMDsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBiZWQtPnMtPnN3YXBfc3ltYm9sX291dCAoYWJmZCwgJnN5bSwgKFBUUikgb3V0Ym91bmRfc3ltcyk7Ci0gICAgICBvdXRib3VuZF9zeW1zICs9IGJlZC0+cy0+c2l6ZW9mX3N5bTsKLSAgICB9Ci0gICAgZm9yIChpZHggPSAwOyBpZHggPCBzeW1jb3VudDsgaWR4KyspCi0gICAgICB7Ci0JRWxmX0ludGVybmFsX1N5bSBzeW07Ci0JYmZkX3ZtYSB2YWx1ZSA9IHN5bXNbaWR4XS0+dmFsdWU7Ci0JZWxmX3N5bWJvbF90eXBlICp0eXBlX3B0cjsKLQlmbGFnd29yZCBmbGFncyA9IHN5bXNbaWR4XS0+ZmxhZ3M7Ci0JaW50IHR5cGU7Ci0KLQlpZiAoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JICAvKiBTZWN0aW9uIHN5bWJvbHMgaGF2ZSBubyBuYW1lcy4gICovCi0JICBzeW0uc3RfbmFtZSA9IDA7Ci0JZWxzZQotCSAgewotCSAgICBzeW0uc3RfbmFtZSA9ICh1bnNpZ25lZCBsb25nKSBfYmZkX3N0cmluZ3RhYl9hZGQgKHN0dCwKLQkJCQkJCQkgICAgICBzeW1zW2lkeF0tPm5hbWUsCi0JCQkJCQkJICAgICAgdHJ1ZSwgZmFsc2UpOwotCSAgICBpZiAoc3ltLnN0X25hbWUgPT0gKHVuc2lnbmVkIGxvbmcpIC0xKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCXR5cGVfcHRyID0gZWxmX3N5bWJvbF9mcm9tIChhYmZkLCBzeW1zW2lkeF0pOwotCi0JaWYgKChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotCSAgICAmJiBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNbaWR4XS0+c2VjdGlvbikpCi0JICB7Ci0JICAgIC8qIEVMRiBjb21tb24gc3ltYm9scyBwdXQgdGhlIGFsaWdubWVudCBpbnRvIHRoZSBgdmFsdWUnIGZpZWxkLAotCSAgICAgICBhbmQgdGhlIHNpemUgaW50byB0aGUgYHNpemUnIGZpZWxkLiAgVGhpcyBpcyBiYWNrd2FyZHMgZnJvbQotCSAgICAgICBob3cgQkZEIGhhbmRsZXMgaXQsIHNvIHJldmVyc2UgaXQgaGVyZS4gICovCi0JICAgIHN5bS5zdF9zaXplID0gdmFsdWU7Ci0JICAgIGlmICh0eXBlX3B0ciA9PSBOVUxMCi0JCXx8IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlID09IDApCi0JICAgICAgc3ltLnN0X3ZhbHVlID0gdmFsdWUgPj0gMTYgPyAxNiA6ICgxIDw8IGJmZF9sb2cyICh2YWx1ZSkpOwotCSAgICBlbHNlCi0JICAgICAgc3ltLnN0X3ZhbHVlID0gdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3RfdmFsdWU7Ci0JICAgIHN5bS5zdF9zaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotCSAgICAgIChhYmZkLCBzeW1zW2lkeF0tPnNlY3Rpb24pOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYXNlY3Rpb24gKnNlYyA9IHN5bXNbaWR4XS0+c2VjdGlvbjsKLQkgICAgaW50IHNobmR4OwotCi0JICAgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uKQotCSAgICAgIHsKLQkJdmFsdWUgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotCQlzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCSAgICAgIH0KLQkgICAgLyogRG9uJ3QgYWRkIGluIHRoZSBzZWN0aW9uIHZtYSBmb3IgcmVsb2NhdGFibGUgb3V0cHV0LiAgKi8KLQkgICAgaWYgKCEgcmVsb2NhdGFibGVfcCkKLQkgICAgICB2YWx1ZSArPSBzZWMtPnZtYTsKLQkgICAgc3ltLnN0X3ZhbHVlID0gdmFsdWU7Ci0JICAgIHN5bS5zdF9zaXplID0gdHlwZV9wdHIgPyB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplIDogMDsKLQotCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0JCSYmIHR5cGVfcHRyICE9IE5VTEwKLQkJJiYgdHlwZV9wdHItPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHggIT0gMCkKLQkgICAgICB7Ci0JCS8qIFRoaXMgc3ltYm9sIGlzIGluIGEgcmVhbCBFTEYgc2VjdGlvbiB3aGljaCB3ZSBkaWQKLSAgICAgICAgICAgICAgICAgICBub3QgY3JlYXRlIGFzIGEgQkZEIHNlY3Rpb24uICBVbmRvIHRoZSBtYXBwaW5nIGRvbmUKLSAgICAgICAgICAgICAgICAgICBieSBjb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEuICAqLwotCQlzaG5keCA9IHR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotCQlzd2l0Y2ggKHNobmR4KQotCQkgIHsKLQkJICBjYXNlIE1BUF9PTkVTWU1UQUI6Ci0JCSAgICBzaG5keCA9IGVsZl9vbmVzeW10YWIgKGFiZmQpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBNQVBfRFlOU1lNVEFCOgotCQkgICAgc2huZHggPSBlbGZfZHluc3ltdGFiIChhYmZkKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgTUFQX1NUUlRBQjoKLQkJICAgIHNobmR4ID0gZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX3NlY3Rpb247Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIE1BUF9TSFNUUlRBQjoKLQkJICAgIHNobmR4ID0gZWxmX3RkYXRhIChhYmZkKS0+c2hzdHJ0YWJfc2VjdGlvbjsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotCQlpZiAoc2huZHggPT0gLTEpCi0JCSAgewotCQkgICAgYXNlY3Rpb24gKnNlYzI7Ci0KLQkJICAgIC8qIFdyaXRpbmcgdGhpcyB3b3VsZCBiZSBhIGhlbGwgb2YgYSBsb3QgZWFzaWVyIGlmCi0JCSAgICAgICB3ZSBoYWQgc29tZSBkZWNlbnQgZG9jdW1lbnRhdGlvbiBvbiBiZmQsIGFuZAotCQkgICAgICAga25ldyB3aGF0IHRvIGV4cGVjdCBvZiB0aGUgbGlicmFyeSwgYW5kIHdoYXQgdG8KLQkJICAgICAgIGRlbWFuZCBvZiBhcHBsaWNhdGlvbnMuICBGb3IgZXhhbXBsZSwgaXQKLQkJICAgICAgIGFwcGVhcnMgdGhhdCBgb2JqY29weScgbWlnaHQgbm90IHNldCB0aGUKLQkJICAgICAgIHNlY3Rpb24gb2YgYSBzeW1ib2wgdG8gYmUgYSBzZWN0aW9uIHRoYXQgaXMKLQkJICAgICAgIGFjdHVhbGx5IGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCSAgICBzZWMyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlYy0+bmFtZSk7Ci0JCSAgICBCRkRfQVNTRVJUIChzZWMyICE9IDApOwotCQkgICAgc2huZHggPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHNlYzIpOwotCQkgICAgQkZEX0FTU0VSVCAoc2huZHggIT0gLTEpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgc3ltLnN0X3NobmR4ID0gc2huZHg7Ci0JICB9Ci0KLQlpZiAoKGZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCSAgdHlwZSA9IFNUVF9GVU5DOwotCWVsc2UgaWYgKChmbGFncyAmIEJTRl9PQkpFQ1QpICE9IDApCi0JICB0eXBlID0gU1RUX09CSkVDVDsKLQllbHNlCi0JICB0eXBlID0gU1RUX05PVFlQRTsKLQotICAgICAgICAvKiBQcm9jZXNzb3Itc3BlY2lmaWMgdHlwZXMgKi8KLSAgICAgICAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKQotICAgICAgICAgIHR5cGUgPSAoKmJlZC0+ZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlKSAoJnR5cGVfcHRyLT5pbnRlcm5hbF9lbGZfc3ltLCB0eXBlKTsKLQotCWlmIChmbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotCWVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9HTE9CQUwsIHR5cGUpOwotCWVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc1tpZHhdLT5zZWN0aW9uKSkKLQkgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKCgoZmxhZ3MgJiBCU0ZfV0VBSykKLQkJCQkgICAgICA/IFNUQl9XRUFLCi0JCQkJICAgICAgOiBTVEJfR0xPQkFMKSwKLQkJCQkgICAgIHR5cGUpOwotCWVsc2UgaWYgKGZsYWdzICYgQlNGX0ZJTEUpCi0JICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9GSUxFKTsKLQllbHNlCi0JICB7Ci0JICAgIGludCBiaW5kID0gU1RCX0xPQ0FMOwotCi0JICAgIGlmIChmbGFncyAmIEJTRl9MT0NBTCkKLQkgICAgICBiaW5kID0gU1RCX0xPQ0FMOwotCSAgICBlbHNlIGlmIChmbGFncyAmIEJTRl9XRUFLKQotCSAgICAgIGJpbmQgPSBTVEJfV0VBSzsKLQkgICAgZWxzZSBpZiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCSAgICAgIGJpbmQgPSBTVEJfR0xPQkFMOwotCi0JICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKGJpbmQsIHR5cGUpOwotCSAgfQotCi0JaWYgKHR5cGVfcHRyICE9IE5VTEwpCi0JICBzeW0uc3Rfb3RoZXIgPSB0eXBlX3B0ci0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlcjsKLQllbHNlCi0JICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0JYmVkLT5zLT5zd2FwX3N5bWJvbF9vdXQgKGFiZmQsICZzeW0sIChQVFIpIG91dGJvdW5kX3N5bXMpOwotCW91dGJvdW5kX3N5bXMgKz0gYmVkLT5zLT5zaXplb2Zfc3ltOwotICAgICAgfQotCi0gICAgKnN0dHAgPSBzdHQ7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKHN0dCk7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfdHlwZSA9IFNIVF9TVFJUQUI7Ci0KLSAgICBzeW1zdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfYWRkciA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfbGluayA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfaW5mbyA9IDA7Ci0gICAgc3ltc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLgotCi0gICBOb3RlIHRoYXQgd2UgYmFzZSBpdCBvbiB0aGUgY291bnQgcGx1cyAxLCBzaW5jZSB3ZSB3aWxsIG51bGwgdGVybWluYXRlCi0gICB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZCBvbiB0aGlzIHNpemUuICBIb3dldmVyLCB0aGUgRUxGIHN5bWJvbCB0YWJsZQotICAgYWx3YXlzIGhhcyBhIGR1bW15IGVudHJ5IGFzIHN5bWJvbCAjMCwgc28gaXQgZW5kcyB1cCBldmVuLiAgKi8KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplOwotICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgc3ltY291bnQgPSBoZHItPnNoX3NpemUgLyBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNpemVvZl9zeW07Ci0gIHN5bXRhYl9zaXplID0gKHN5bWNvdW50IC0gMSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0KLSAgcmV0dXJuIHN5bXRhYl9zaXplOwotfQotCi1sb25nCi1fYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyBzeW1jb3VudDsKLSAgbG9uZyBzeW10YWJfc2l6ZTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW5zeW10YWJfaGRyOwotCi0gIGlmIChlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gaGRyLT5zaF9zaXplIC8gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2Zfc3ltOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCAtIDEgKyAxKSAqIChzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIHJldHVybiBzeW10YWJfc2l6ZTsKLX0KLQotbG9uZwotX2JmZF9lbGZfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0vKiBDYW5vbmljYWxpemUgdGhlIHJlbG9jcy4gICovCi0KLWxvbmcKLV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0cjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKCEgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9yZWxvY190YWJsZSAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLAotCQkJCQkJCSAgIHN5bWJvbHMsCi0JCQkJCQkJICAgZmFsc2UpKQotICAgIHJldHVybiAtMTsKLQotICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICBmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGkrKykKLSAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQotICAqcmVscHRyID0gTlVMTDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLWxvbmcKLV9iZmRfZWxmX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICBsb25nIHN5bWNvdW50ID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9zeW1ib2xfdGFibGUKLSAgICAoYWJmZCwgYWxvY2F0aW9uLCBmYWxzZSk7Ci0KLSAgaWYgKHN5bWNvdW50ID49IDApCi0gICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgcmV0dXJuIHN5bWNvdW50OwotfQotCi1sb25nCi1fYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICByZXR1cm4gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zbHVycF9zeW1ib2xfdGFibGUKLSAgICAoYWJmZCwgYWxvY2F0aW9uLCB0cnVlKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzaXplIHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYyByZWxvYyBlbnRyaWVzLiAgQW55Ci0gICBzZWN0aW9uIHRoYXQgd2FzIGFjdHVhbGx5IGluc3RhbGxlZCBpbiB0aGUgQkZELCBhbmQgaGFzIHR5cGUKLSAgIFNIVF9SRUwgb3IgU0hUX1JFTEEsIGFuZCB1c2VzIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgaXMKLSAgIGNvbnNpZGVyZWQgdG8gYmUgYSBkeW5hbWljIHJlbG9jIHNlY3Rpb24uICAqLwotCi1sb25nCi1fYmZkX2VsZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHJldDsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGVsZl9keW5zeW10YWIgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0ID0gc2l6ZW9mIChhcmVsZW50ICopOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPT0gZWxmX2R5bnN5bXRhYiAoYWJmZCkKLQkmJiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAotCSAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMQSkpCi0gICAgICByZXQgKz0gKChzLT5fcmF3X3NpemUgLyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfZW50c2l6ZSkKLQkgICAgICAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogQ2Fub25pY2FsaXplIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcy4gIE5vdGUgdGhhdCB3ZSByZXR1cm4KLSAgIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGFzIGEgc2luZ2xlIGJsb2NrLCBhbHRob3VnaCB0aGV5IGFyZQotICAgYWN0dWFsbHkgYXNzb2NpYXRlZCB3aXRoIHBhcnRpY3VsYXIgc2VjdGlvbnM7IHRoZSBpbnRlcmZhY2UsIHdoaWNoCi0gICB3YXMgZGVzaWduZWQgZm9yIFN1bk9TIHN0eWxlIHNoYXJlZCBsaWJyYXJpZXMsIGV4cGVjdHMgdGhhdCB0aGVyZQotICAgaXMgb25seSBvbmUgc2V0IG9mIGR5bmFtaWMgcmVsb2NzLiAgQW55IHNlY3Rpb24gdGhhdCB3YXMgYWN0dWFsbHkKLSAgIGluc3RhbGxlZCBpbiB0aGUgQkZELCBhbmQgaGFzIHR5cGUgU0hUX1JFTCBvciBTSFRfUkVMQSwgYW5kIHVzZXMKLSAgIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgaXMgY29uc2lkZXJlZCB0byBiZSBhIGR5bmFtaWMgcmVsb2MKLSAgIHNlY3Rpb24uICAqLwotCi1sb25nCi1fYmZkX2VsZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyAoYWJmZCwgc3RvcmFnZSwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICoqc3RvcmFnZTsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci17Ci0gIGJvb2xlYW4gKCpzbHVycF9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0gIGFzZWN0aW9uICpzOwotICBsb25nIHJldDsKLQotICBpZiAoZWxmX2R5bnN5bXRhYiAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzbHVycF9yZWxvY3MgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPnMtPnNsdXJwX3JlbG9jX3RhYmxlOwotICByZXQgPSAwOwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2xpbmsgPT0gZWxmX2R5bnN5bXRhYiAoYWJmZCkKLQkgICYmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19oZHIuc2hfdHlwZSA9PSBTSFRfUkVMCi0JICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTEEpKQotCXsKLQkgIGFyZWxlbnQgKnA7Ci0JICBsb25nIGNvdW50LCBpOwotCi0JICBpZiAoISAoKnNsdXJwX3JlbG9jcykgKGFiZmQsIHMsIHN5bXMsIHRydWUpKQotCSAgICByZXR1cm4gLTE7Ci0JICBjb3VudCA9IHMtPl9yYXdfc2l6ZSAvIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9lbnRzaXplOwotCSAgcCA9IHMtPnJlbG9jYXRpb247Ci0JICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkgICAgKnN0b3JhZ2UrKyA9IHArKzsKLQkgIHJldCArPSBjb3VudDsKLQl9Ci0gICAgfQotCi0gICpzdG9yYWdlID0gTlVMTDsKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogUmVhZCBpbiB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0KLSAgaWYgKGVsZl9keW52ZXJkZWYgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkZWYgKmV2ZXJkZWY7Ci0gICAgICBFbGZfSW50ZXJuYWxfVmVyZGVmICppdmVyZGVmOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJkZWZfaGRyOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPQotCSgoRWxmX0ludGVybmFsX1ZlcmRlZiAqKQotCSBiZmRfemFsbG9jIChhYmZkLCBoZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJkZWYpKSk7Ci0gICAgICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPmN2ZXJkZWZzID0gaGRyLT5zaF9pbmZvOwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3JlYWQgKChQVFIpIGNvbnRlbnRzLCAxLCBoZHItPnNoX3NpemUsIGFiZmQpICE9IGhkci0+c2hfc2l6ZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZXZlcmRlZiA9IChFbGZfRXh0ZXJuYWxfVmVyZGVmICopIGNvbnRlbnRzOwotICAgICAgaXZlcmRlZiA9IGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBoZHItPnNoX2luZm87IGkrKywgaXZlcmRlZisrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICpldmVyZGF1eDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJkYXV4ICppdmVyZGF1eDsKLQkgIHVuc2lnbmVkIGludCBqOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9pbiAoYWJmZCwgZXZlcmRlZiwgaXZlcmRlZik7Ci0KLQkgIGl2ZXJkZWYtPnZkX2JmZCA9IGFiZmQ7Ci0KLQkgIGl2ZXJkZWYtPnZkX2F1eHB0ciA9ICgoRWxmX0ludGVybmFsX1ZlcmRhdXggKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChpdmVyZGVmLT52ZF9jbnQKLQkJCQkJICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVyZGF1eCkpKSk7Ci0JICBpZiAoaXZlcmRlZi0+dmRfYXV4cHRyID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBldmVyZGF1eCA9ICgoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikKLQkJICAgICAgKChiZmRfYnl0ZSAqKSBldmVyZGVmICsgaXZlcmRlZi0+dmRfYXV4KSk7Ci0JICBpdmVyZGF1eCA9IGl2ZXJkZWYtPnZkX2F1eHB0cjsKLQkgIGZvciAoaiA9IDA7IGogPCBpdmVyZGVmLT52ZF9jbnQ7IGorKywgaXZlcmRhdXgrKykKLQkgICAgewotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGF1eF9pbiAoYWJmZCwgZXZlcmRhdXgsIGl2ZXJkYXV4KTsKLQotCSAgICAgIGl2ZXJkYXV4LT52ZGFfbm9kZW5hbWUgPQotCQliZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssCi0JCQkJCQkgaXZlcmRhdXgtPnZkYV9uYW1lKTsKLQkgICAgICBpZiAoaXZlcmRhdXgtPnZkYV9ub2RlbmFtZSA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIGlmIChqICsgMSA8IGl2ZXJkZWYtPnZkX2NudCkKLQkJaXZlcmRhdXgtPnZkYV9uZXh0cHRyID0gaXZlcmRhdXggKyAxOwotCSAgICAgIGVsc2UKLQkJaXZlcmRhdXgtPnZkYV9uZXh0cHRyID0gTlVMTDsKLQotCSAgICAgIGV2ZXJkYXV4ID0gKChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKQotCQkJICAoKGJmZF9ieXRlICopIGV2ZXJkYXV4ICsgaXZlcmRhdXgtPnZkYV9uZXh0KSk7Ci0JICAgIH0KLQotCSAgaXZlcmRlZi0+dmRfbm9kZW5hbWUgPSBpdmVyZGVmLT52ZF9hdXhwdHItPnZkYV9ub2RlbmFtZTsKLQotCSAgaWYgKGkgKyAxIDwgaGRyLT5zaF9pbmZvKQotCSAgICBpdmVyZGVmLT52ZF9uZXh0ZGVmID0gaXZlcmRlZiArIDE7Ci0JICBlbHNlCi0JICAgIGl2ZXJkZWYtPnZkX25leHRkZWYgPSBOVUxMOwotCi0JICBldmVyZGVmID0gKChFbGZfRXh0ZXJuYWxfVmVyZGVmICopCi0JCSAgICAgKChiZmRfYnl0ZSAqKSBldmVyZGVmICsgaXZlcmRlZi0+dmRfbmV4dCkpOwotCX0KLQotICAgICAgZnJlZSAoY29udGVudHMpOwotICAgICAgY29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZWxmX2R5bnZlcnJlZiAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICAgRWxmX0V4dGVybmFsX1Zlcm5lZWQgKmV2ZXJuZWVkOwotICAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKml2ZXJuZWVkOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfaGRyOwotCi0gICAgICBlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPQotCSgoRWxmX0ludGVybmFsX1Zlcm5lZWQgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfVmVybmVlZCkpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT52ZXJyZWYgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZWxmX3RkYXRhIChhYmZkKS0+Y3ZlcnJlZnMgPSBoZHItPnNoX2luZm87Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCBiZmRfcmVhZCAoKFBUUikgY29udGVudHMsIDEsIGhkci0+c2hfc2l6ZSwgYWJmZCkgIT0gaGRyLT5zaF9zaXplKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBldmVybmVlZCA9IChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSBjb250ZW50czsKLSAgICAgIGl2ZXJuZWVkID0gZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmOwotICAgICAgZm9yIChpID0gMDsgaSA8IGhkci0+c2hfaW5mbzsgaSsrLCBpdmVybmVlZCsrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICpldmVybmF1eDsKLQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICppdmVybmF1eDsKLQkgIHVuc2lnbmVkIGludCBqOwotCi0JICBfYmZkX2VsZl9zd2FwX3Zlcm5lZWRfaW4gKGFiZmQsIGV2ZXJuZWVkLCBpdmVybmVlZCk7Ci0KLQkgIGl2ZXJuZWVkLT52bl9iZmQgPSBhYmZkOwotCi0JICBpdmVybmVlZC0+dm5fZmlsZW5hbWUgPQotCSAgICBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssCi0JCQkJCSAgICAgaXZlcm5lZWQtPnZuX2ZpbGUpOwotCSAgaWYgKGl2ZXJuZWVkLT52bl9maWxlbmFtZSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaXZlcm5lZWQtPnZuX2F1eHB0ciA9Ci0JICAgICgoRWxmX0ludGVybmFsX1Zlcm5hdXggKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCWl2ZXJuZWVkLT52bl9jbnQgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9WZXJuYXV4KSkpOwotCi0JICBldmVybmF1eCA9ICgoRWxmX0V4dGVybmFsX1Zlcm5hdXggKikKLQkJICAgICAgKChiZmRfYnl0ZSAqKSBldmVybmVlZCArIGl2ZXJuZWVkLT52bl9hdXgpKTsKLQkgIGl2ZXJuYXV4ID0gaXZlcm5lZWQtPnZuX2F1eHB0cjsKLQkgIGZvciAoaiA9IDA7IGogPCBpdmVybmVlZC0+dm5fY250OyBqKyssIGl2ZXJuYXV4KyspCi0JICAgIHsKLQkgICAgICBfYmZkX2VsZl9zd2FwX3Zlcm5hdXhfaW4gKGFiZmQsIGV2ZXJuYXV4LCBpdmVybmF1eCk7Ci0KLQkgICAgICBpdmVybmF1eC0+dm5hX25vZGVuYW1lID0KLQkJYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoYWJmZCwgaGRyLT5zaF9saW5rLAotCQkJCQkJIGl2ZXJuYXV4LT52bmFfbmFtZSk7Ci0JICAgICAgaWYgKGl2ZXJuYXV4LT52bmFfbm9kZW5hbWUgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBpZiAoaiArIDEgPCBpdmVybmVlZC0+dm5fY250KQotCQlpdmVybmF1eC0+dm5hX25leHRwdHIgPSBpdmVybmF1eCArIDE7Ci0JICAgICAgZWxzZQotCQlpdmVybmF1eC0+dm5hX25leHRwdHIgPSBOVUxMOwotCi0JICAgICAgZXZlcm5hdXggPSAoKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopCi0JCQkgICgoYmZkX2J5dGUgKikgZXZlcm5hdXggKyBpdmVybmF1eC0+dm5hX25leHQpKTsKLQkgICAgfQotCi0JICBpZiAoaSArIDEgPCBoZHItPnNoX2luZm8pCi0JICAgIGl2ZXJuZWVkLT52bl9uZXh0cmVmID0gaXZlcm5lZWQgKyAxOwotCSAgZWxzZQotCSAgICBpdmVybmVlZC0+dm5fbmV4dHJlZiA9IE5VTEw7Ci0KLQkgIGV2ZXJuZWVkID0gKChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKQotCQkgICAgICAoKGJmZF9ieXRlICopIGV2ZXJuZWVkICsgaXZlcm5lZWQtPnZuX25leHQpKTsKLQl9Ci0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICAgIGNvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChjb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotYXN5bWJvbCAqCi1fYmZkX2VsZl9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBlbGZfc3ltYm9sX3R5cGUgKm5ld3N5bTsKLQotICBuZXdzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoZWxmX3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3c3ltKQotICAgIHJldHVybiBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgbmV3c3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gICAgICByZXR1cm4gJm5ld3N5bS0+c3ltYm9sOwotICAgIH0KLX0KLQotdm9pZAotX2JmZF9lbGZfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIHN5bWJvbC4gIE1vc3QgdGFyZ2V0cwotICAgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBpc19sb2NhbF9sYWJlbF9uYW1lIGVudHJ5IHBvaW50LCBidXQgc29tZQotICAgb3ZlcnJpZGUgaXQuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIE5vcm1hbCBsb2NhbCBzeW1ib2xzIHN0YXJ0IHdpdGggYGAuTCcnLiAgKi8KLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ0wnKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEF0IGxlYXN0IHNvbWUgU1ZSNCBjb21waWxlcnMgKGUuZy4sIFVuaXhXYXJlIDIuMSBjYykgZ2VuZXJhdGUKLSAgICAgRFdBUkYgZGVidWdnaW5nIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBgYC4uJycuICAqLwotICBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogZ2NjIHdpbGwgc29tZXRpbWVzIGdlbmVyYXRlIHN5bWJvbHMgYmVnaW5uaW5nIHdpdGggYGBfLkxfJycgd2hlbgotICAgICBlbWl0dGluZyBEV0FSRiBkZWJ1Z2dpbmcgb3V0cHV0LiAgSSBzdXNwZWN0IHRoaXMgaXMgYWN0dWFsbHkgYQotICAgICBzbWFsbCBidWcgaW4gZ2NjIChpdCBjYWxscyBBU01fT1VUUFVUX0xBQkVMIHdoZW4gaXQgc2hvdWxkIGNhbGwKLSAgICAgQVNNX0dFTkVSQVRFX0lOVEVSTkFMX0xBQkVMLCBhbmQgdGhpcyBjYXVzZXMgdGhlIGxlYWRpbmcKLSAgICAgdW5kZXJzY29yZSB0byBiZSBlbWl0dGVkIG9uIHNvbWUgRUxGIHRhcmdldHMpLiAgRm9yIGVhc2Ugb2YgdXNlLAotICAgICB3ZSB0cmVhdCBzdWNoIHN5bWJvbHMgYXMgbG9jYWwuICAqLwotICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnLicgJiYgbmFtZVsyXSA9PSAnTCcgJiYgbmFtZVszXSA9PSAnXycpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1hbGVudCAqCi1fYmZkX2VsZl9nZXRfbGluZW5vIChpZ25vcmVfYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICAvKiBJZiB0aGlzIGlzbid0IHRoZSByaWdodCBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgYmFja2VuZCwgYW5kIHRoaXMKLSAgICAgaXNuJ3QgdGhlIGdlbmVyaWMgYmFja2VuZCwgZmFpbC4gICovCi0gIGlmIChhcmNoICE9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+YXJjaAotICAgICAgJiYgYXJjaCAhPSBiZmRfYXJjaF91bmtub3duCi0gICAgICAmJiBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24gYW5kIG9mZnNldCwgZm9yIGVycm9yCi0gICByZXBvcnRpbmcuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwKLQkJCSAgICBzZWN0aW9uLAotCQkJICAgIHN5bWJvbHMsCi0JCQkgICAgb2Zmc2V0LAotCQkJICAgIGZpbGVuYW1lX3B0ciwKLQkJCSAgICBmdW5jdGlvbm5hbWVfcHRyLAotCQkJICAgIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBib29sZWFuIGZvdW5kOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgYXN5bWJvbCAqZnVuYzsKLSAgYmZkX3ZtYSBsb3dfZnVuYzsKLSAgYXN5bWJvbCAqKnA7Ci0KLSAgaWYgKF9iZmRfZHdhcmYxX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIAotCQkJCSAgICAgbGluZV9wdHIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChfYmZkX2R3YXJmMl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsCi0JCQkJCSAgICAgJmZvdW5kLCBmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgZnVuY3Rpb25uYW1lX3B0ciwgbGluZV9wdHIsCi0JCQkJCSAgICAgJmVsZl90ZGF0YSAoYWJmZCktPmxpbmVfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKHN5bWJvbHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBOVUxMOwotICBmdW5jID0gTlVMTDsKLSAgbG93X2Z1bmMgPSAwOwotCi0gIGZvciAocCA9IHN5bWJvbHM7ICpwICE9IE5VTEw7IHArKykKLSAgICB7Ci0gICAgICBlbGZfc3ltYm9sX3R5cGUgKnE7Ci0KLSAgICAgIHEgPSAoZWxmX3N5bWJvbF90eXBlICopICpwOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uICgmcS0+c3ltYm9sKSAhPSBzZWN0aW9uKQotCWNvbnRpbnVlOwotCi0gICAgICBzd2l0Y2ggKEVMRl9TVF9UWVBFIChxLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfRklMRToKLQkgIGZpbGVuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoJnEtPnN5bWJvbCk7Ci0JICBicmVhazsKLQljYXNlIFNUVF9OT1RZUEU6Ci0JY2FzZSBTVFRfRlVOQzoKLQkgIGlmIChxLT5zeW1ib2wuc2VjdGlvbiA9PSBzZWN0aW9uCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlID49IGxvd19mdW5jCi0JICAgICAgJiYgcS0+c3ltYm9sLnZhbHVlIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgIGZ1bmMgPSAoYXN5bWJvbCAqKSBxOwotCSAgICAgIGxvd19mdW5jID0gcS0+c3ltYm9sLnZhbHVlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpmaWxlbmFtZV9wdHIgPSBmaWxlbmFtZTsKLSAgKmZ1bmN0aW9ubmFtZV9wdHIgPSBiZmRfYXN5bWJvbF9uYW1lIChmdW5jKTsKLSAgKmxpbmVfcHRyID0gMDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludAotX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0gIGludCByZXQ7Ci0KLSAgcmV0ID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5zLT5zaXplb2ZfZWhkcjsKLSAgaWYgKCEgcmVsb2MpCi0gICAgcmV0ICs9IGdldF9wcm9ncmFtX2hlYWRlcl9zaXplIChhYmZkKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bgotICAgICAgJiYgISBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMKLSAgICAgIChhYmZkLCAoc3RydWN0IGJmZF9saW5rX2luZm8gKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGhkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGhpc19oZHI7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCArIG9mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQKLV9iZmRfZWxmX25vX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLSNpZiAwCi12b2lkCi1fYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLS8qIFRyeSB0byBjb252ZXJ0IGEgbm9uLUVMRiByZWxvYyBpbnRvIGFuIEVMRiBvbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgYXJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmFyZWxvYzsKLXsKLSAgLyogQ2hlY2sgd2hldGhlciB3ZSByZWFsbHkgaGF2ZSBhbiBFTEYgaG93dG8uICovCi0KLSAgaWYgKCgqYXJlbG9jLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotCi0gICAgICAvKiBBbGllbiByZWxvYzogVHJ5IHRvIGRldGVybWluZSBpdHMgdHlwZSB0byByZXBsYWNlIGl0IHdpdGggYW4KLQkgZXF1aXZhbGVudCBFTEYgcmVsb2MuICovCi0KLSAgICAgIGlmIChhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQl7Ci0JICBzd2l0Y2ggKGFyZWxvYy0+aG93dG8tPmJpdHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA4OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzEyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjQ6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18yNF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDY0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfNjRfUENSRUw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0KLQkgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKTsKLQotCSAgaWYgKGFyZWxvYy0+aG93dG8tPnBjcmVsX29mZnNldCAhPSBob3d0by0+cGNyZWxfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JCWFyZWxvYy0+YWRkZW5kICs9IGFyZWxvYy0+YWRkcmVzczsKLQkgICAgICBlbHNlCi0JCWFyZWxvYy0+YWRkZW5kIC09IGFyZWxvYy0+YWRkcmVzczsgLyogYWRkZW5kIGlzIHVuc2lnbmVkISEgKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGFyZWxvYy0+aG93dG8tPmJpdHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA4OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxNDoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzE0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE2OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjY6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18yNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzMjoKLQkgICAgICBjb2RlID0gQkZEX1JFTE9DXzMyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDY0OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfNjQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0KLQkgIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKTsKLQl9Ci0KLSAgICAgIGlmIChob3d0bykKLQlhcmVsb2MtPmhvd3RvID0gaG93dG87Ci0gICAgICBlbHNlCi0JZ290byBmYWlsOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGZhaWw6Ci0gICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgIChfKCIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlICVzIiksCi0gICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBhcmVsb2MtPmhvd3RvLT5uYW1lKTsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbGVhbgotX2JmZF9lbGZfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChhYmZkKSA9PSBiZmRfb2JqZWN0KQotICAgIHsKLSAgICAgIGlmIChlbGZfc2hzdHJ0YWIgKGFiZmQpICE9IE5VTEwpCi0JX2JmZF9zdHJpbmd0YWJfZnJlZSAoZWxmX3Noc3RydGFiIChhYmZkKSk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAgKGFiZmQpOwotfQotCi0vKiBGb3IgUmVsIHRhcmdldHMsIHdlIGVuY29kZSBtZWFuaW5nZnVsIGRhdGEgZm9yIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgIGluIHRoZSByZWxvY2F0aW9uJ3Mgb2Zmc2V0LiAgVGh1cyB3ZSBjYW5ub3QgYWxsb3cgYW55IHNvcnQgb2Ygc2FuaXR5Ci0gICByYW5nZS1jaGVja2luZyB0byBpbnRlcmZlcmUuICBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gZG8gaW4gcHJvY2Vzc2luZwotICAgdGhpcyByZWxvYy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiAoYWJmZCwgcmUsIHN5bWJvbCwgZGF0YSwgaXMsIG9iZmQsIGVycm1zZykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZTsKLSAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlzOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qIEVsZiBjb3JlIGZpbGUgc3VwcG9ydC4gIE11Y2ggb2YgdGhpcyBvbmx5IHdvcmtzIG9uIG5hdGl2ZQotICAgdG9vbGNoYWlucywgc2luY2Ugd2UgcmVseSBvbiBrbm93aW5nIHRoZQotICAgbWFjaGluZS1kZXBlbmRlbnQgcHJvY2ZzIHN0cnVjdHVyZSBpbiBvcmRlciB0byBwaWNrCi0gICBvdXQgZGV0YWlscyBhYm91dCB0aGUgY29yZWZpbGUuICovCi0KLSNpZmRlZiBIQVZFX1NZU19QUk9DRlNfSAotIyBpbmNsdWRlIDxzeXMvcHJvY2ZzLmg+Ci0jZW5kaWYKLQotCi0vKiBEZWZpbmUgb2Zmc2V0b2YgZm9yIHRob3NlIHN5c3RlbXMgd2hpY2ggbGFjayBpdC4gKi8KLQotI2lmbmRlZiBvZmZzZXRvZgotIyBkZWZpbmUgb2Zmc2V0b2YoVFlQRSwgTUVNQkVSKSAoKHVuc2lnbmVkIGxvbmcpICYoKFRZUEUgKikwKS0+TUVNQkVSKQotI2VuZGlmCi0KLQotLyogRklYTUU6IHRoaXMgaXMga2luZGEgd3JvbmcsIGJ1dCBpdCdzIHdoYXQgZ2RiIHdhbnRzLiAqLwotCi1zdGF0aWMgaW50Ci1lbGZjb3JlX21ha2VfcGlkIChhYmZkKQotICAgICBiZmQqIGFiZmQ7Ci17Ci0gIHJldHVybiAoKGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfbHdwaWQgPDwgMTYpCi0JICArIChlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3BpZCkpOwotfQotCi0KLS8qIElmIHRoZXJlIGlzbid0IGEgc2VjdGlvbiBjYWxsZWQgTkFNRSwgbWFrZSBvbmUsIHVzaW5nCi0gICBkYXRhIGZyb20gU0VDVC4gIE5vdGUsIHRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSBhCi0gICByZWZlcmVuY2UgdG8gTkFNRSwgc28geW91IHNob3VsZG4ndCBkZWFsbG9jYXRlIG9yCi0gICBvdmVyd3JpdGUgaXQuICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgbmFtZSwgc2VjdCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBuYW1lOwotICAgICBhc2VjdGlvbiogc2VjdDsKLXsKLSAgYXNlY3Rpb24qIHNlY3QyOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0MiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdDIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc2VjdDItPl9yYXdfc2l6ZSA9IHNlY3QtPl9yYXdfc2l6ZTsKLSAgc2VjdDItPmZpbGVwb3MgPSBzZWN0LT5maWxlcG9zOwotICBzZWN0Mi0+ZmxhZ3MgPSBzZWN0LT5mbGFnczsKLSAgc2VjdDItPmFsaWdubWVudF9wb3dlciA9IHNlY3QtPmFsaWdubWVudF9wb3dlcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogcHJzdGF0dXNfdCBleGlzdHMgb246Ci0gICAgIHNvbGFyaXMgMi5bNTY3XQotICAgICBsaW51eCAyLlswMV0gKyBnbGliYwotICAgICB1bml4d2FyZSA0LjIKLSovCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3Byc3RhdHVzIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBwcnN0YXR1c190IHByc3RhdDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciogbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKHByc3RhdCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWVtY3B5ICgmcHJzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChwcnN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbCA9IHByc3RhdC5wcl9jdXJzaWc7Ci0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHJzdGF0LnByX3BpZDsKLQotICAvKiBwcl93aG8gZXhpc3RzIG9uOgotICAgICAgIHNvbGFyaXMgMi5bNTY3XQotICAgICAgIHVuaXh3YXJlIDQuMgotICAgICBwcl93aG8gZG9lc24ndCBleGlzdCBvbjoKLSAgICAgICBsaW51eCAyLlswMV0KLSAgKi8KLSNpZiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1RfUFJfV0hPKQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkID0gcHJzdGF0LnByX3dobzsKLSNlbmRpZgotCi0gIC8qIE1ha2UgYSAiLnJlZy85OTkiIHNlY3Rpb24uICovCi0KLSAgc3ByaW50ZiAoYnVmLCAiLnJlZy8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChwcnN0YXQucHJfcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAocHJzdGF0dXNfdCwgcHJfcmVnKTsKLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZyIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX1BSU1RBVFVTX1QpICovCi0KLQotLyogVGhlcmUgaXNuJ3QgYSBjb25zaXN0ZW50IHByZnByZWdzZXRfdCBhY3Jvc3MgcGxhdGZvcm1zLAotICAgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyLCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgdG8gcGljayB0aGlzCi0gICBkYXRhIHN0cnVjdHVyZSBhcGFydC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wcmZwcmVnIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBjaGFyIGJ1ZlsxMDBdOwotICBjaGFyKiBuYW1lOwotICBhc2VjdGlvbiogc2VjdDsKLQotICAvKiBNYWtlIGEgIi5yZWcyLzk5OSIgc2VjdGlvbi4gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnMi8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc2VjdC0+X3Jhd19zaXplID0gbm90ZS0+ZGVzY3N6OwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvczsKLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghIGVsZmNvcmVfbWF5YmVfbWFrZV9zZWN0IChhYmZkLCAiLnJlZzIiLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpCi0jIGRlZmluZSBlbGZjb3JlX3BzaW5mb190IHBycHNpbmZvX3QKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkKLSMgZGVmaW5lIGVsZmNvcmVfcHNpbmZvX3QgcHNpbmZvX3QKLSNlbmRpZgotCi0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0KLS8qIHJldHVybiBhIG1hbGxvYydlZCBjb3B5IG9mIGEgc3RyaW5nIGF0IFNUQVJUIHdoaWNoIGlzIGF0Ci0gICBtb3N0IE1BWCBieXRlcyBsb25nLCBwb3NzaWJseSB3aXRob3V0IGEgdGVybWluYXRpbmcgJ1wwJy4KLSAgIHRoZSBjb3B5IHdpbGwgYWx3YXlzIGhhdmUgYSB0ZXJtaW5hdGluZyAnXDAnLiAqLwotCi1zdGF0aWMgY2hhcioKLWVsZmNvcmVfc3RybmR1cCAoYWJmZCwgc3RhcnQsIG1heCkKLSAgICAgYmZkKiBhYmZkOwotICAgICBjaGFyKiBzdGFydDsKLSAgICAgaW50IG1heDsKLXsKLSAgY2hhciogZHVwOwotICBjaGFyKiBlbmQgPSBtZW1jaHIgKHN0YXJ0LCAnXDAnLCBtYXgpOwotICBpbnQgbGVuOwotCi0gIGlmIChlbmQgPT0gTlVMTCkKLSAgICBsZW4gPSBtYXg7Ci0gIGVsc2UKLSAgICBsZW4gPSBlbmQgLSBzdGFydDsKLQotICBkdXAgPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOwotICBpZiAoZHVwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbWVtY3B5IChkdXAsIHN0YXJ0LCBsZW4pOwotICBkdXBbbGVuXSA9ICdcMCc7Ci0KLSAgcmV0dXJuIGR1cDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19wc2luZm8gKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIGVsZmNvcmVfcHNpbmZvX3QgcHNpbmZvOwotCi0gIGlmIChub3RlLT5kZXNjc3ogIT0gc2l6ZW9mIChlbGZjb3JlX3BzaW5mb190KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtZW1jcHkgKCZwc2luZm8sIG5vdGUtPmRlc2NkYXRhLCBub3RlLT5kZXNjc3opOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcHJvZ3JhbQotICAgID0gZWxmY29yZV9zdHJuZHVwIChhYmZkLCBwc2luZm8ucHJfZm5hbWUsIHNpemVvZiAocHNpbmZvLnByX2ZuYW1lKSk7Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9jb21tYW5kCi0gICAgPSBlbGZjb3JlX3N0cm5kdXAgKGFiZmQsIHBzaW5mby5wcl9wc2FyZ3MsIHNpemVvZiAocHNpbmZvLnByX3BzYXJncykpOwotCi0gIC8qIE5vdGUgdGhhdCBmb3Igc29tZSByZWFzb24sIGEgc3B1cmlvdXMgc3BhY2UgaXMgdGFja2VkCi0gICAgIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJncyBpbiBzb21lIChhdCBsZWFzdCBvbmUgYW55d2F5KQotICAgICBpbXBsZW1lbnRhdGlvbnMsIHNvIHN0cmlwIGl0IG9mZiBpZiBpdCBleGlzdHMuICovCi0KLSAgewotICAgIGNoYXIqIGNvbW1hbmQgPSBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2NvbW1hbmQ7Ci0gICAgaW50IG4gPSBzdHJsZW4gKGNvbW1hbmQpOwotCi0gICAgaWYgKDAgPCBuICYmIGNvbW1hbmRbbiAtIDFdID09ICcgJykKLSAgICAgIGNvbW1hbmRbbiAtIDFdID0gJ1wwJzsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmIC8qIGRlZmluZWQgKEhBVkVfUFJQU0lORk9fVCkgfHwgZGVmaW5lZCAoSEFWRV9QU0lORk9fVCkgKi8KLQotCi0jaWYgZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX3BzdGF0dXMgKGFiZmQsIG5vdGUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX05vdGUqIG5vdGU7Ci17Ci0gIHBzdGF0dXNfdCBwc3RhdDsKLQotICBpZiAobm90ZS0+ZGVzY3N6ICE9IHNpemVvZiAocHN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJnBzdGF0LCBub3RlLT5kZXNjZGF0YSwgc2l6ZW9mIChwc3RhdCkpOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfcGlkID0gcHN0YXQucHJfcGlkOwotCi0gIC8qIENvdWxkIGdyYWIgc29tZSBtb3JlIGRldGFpbHMgZnJvbSB0aGUgInJlcHJlc2VudGF0aXZlIgotICAgICBsd3BzdGF0dXNfdCBpbiBwc3RhdC5wcl9sd3AsIGJ1dCB3ZSdsbCBjYXRjaCBpdCBhbGwgaW4gYW4KLSAgICAgTlRfTFdQU1RBVFVTIG5vdGUsIHByZXN1bWFibHkuICovCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgLyogZGVmaW5lZCAoSEFWRV9QU1RBVFVTX1QpICovCi0KLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9ncm9rX2x3cHN0YXR1cyAoYWJmZCwgbm90ZSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfTm90ZSogbm90ZTsKLXsKLSAgbHdwc3RhdHVzX3QgbHdwc3RhdDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciogbmFtZTsKLSAgYXNlY3Rpb24qIHNlY3Q7Ci0KLSAgaWYgKG5vdGUtPmRlc2NzeiAhPSBzaXplb2YgKGx3cHN0YXQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIG1lbWNweSAoJmx3cHN0YXQsIG5vdGUtPmRlc2NkYXRhLCBzaXplb2YgKGx3cHN0YXQpKTsKLQotICBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX2x3cGlkID0gbHdwc3RhdC5wcl9sd3BpZDsKLSAgZWxmX3RkYXRhIChhYmZkKS0+Y29yZV9zaWduYWwgPSBsd3BzdGF0LnByX2N1cnNpZzsKLQotICAvKiBNYWtlIGEgIi5yZWcvOTk5IiBzZWN0aW9uLiAqLwotCi0gIHNwcmludGYgKGJ1ZiwgIi5yZWcvJWQiLCBlbGZjb3JlX21ha2VfcGlkIChhYmZkKSk7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoYnVmKSArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RyY3B5IChuYW1lLCBidWYpOwotCi0gIHNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKHNlY3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0NPTlRFWFQpCi0gIHNlY3QtPl9yYXdfc2l6ZSA9IHNpemVvZiAobHdwc3RhdC5wcl9jb250ZXh0LnVjX21jb250ZXh0LmdyZWdzKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MKLSAgICArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfY29udGV4dC51Y19tY29udGV4dC5ncmVncyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfUkVHKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfcmVnKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MgKyBvZmZzZXRvZiAobHdwc3RhdHVzX3QsIHByX3JlZyk7Ci0jZW5kaWYKLQotICBzZWN0LT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgaWYgKCFlbGZjb3JlX21heWJlX21ha2Vfc2VjdCAoYWJmZCwgIi5yZWciLCBzZWN0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTWFrZSBhICIucmVnMi85OTkiIHNlY3Rpb24gKi8KLQotICBzcHJpbnRmIChidWYsICIucmVnMi8lZCIsIGVsZmNvcmVfbWFrZV9waWQgKGFiZmQpKTsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChidWYpICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdHJjcHkgKG5hbWUsIGJ1Zik7Ci0KLSAgc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjdCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1RfUFJfQ09OVEVYVCkKLSAgc2VjdC0+X3Jhd19zaXplID0gc2l6ZW9mIChsd3BzdGF0LnByX2NvbnRleHQudWNfbWNvbnRleHQuZnByZWdzKTsKLSAgc2VjdC0+ZmlsZXBvcyA9IG5vdGUtPmRlc2Nwb3MKLSAgICArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfY29udGV4dC51Y19tY29udGV4dC5mcHJlZ3MpOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UX1BSX0ZQUkVHKQotICBzZWN0LT5fcmF3X3NpemUgPSBzaXplb2YgKGx3cHN0YXQucHJfZnByZWcpOwotICBzZWN0LT5maWxlcG9zID0gbm90ZS0+ZGVzY3BvcyArIG9mZnNldG9mIChsd3BzdGF0dXNfdCwgcHJfZnByZWcpOwotI2VuZGlmCi0KLSAgc2VjdC0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotICBzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGlmICghZWxmY29yZV9tYXliZV9tYWtlX3NlY3QgKGFiZmQsICIucmVnMiIsIHNlY3QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNlbmRpZiAvKiBkZWZpbmVkIChIQVZFX0xXUFNUQVRVU19UKSAqLwotCi0KLQotc3RhdGljIGJvb2xlYW4KLWVsZmNvcmVfZ3Jva19ub3RlIChhYmZkLCBub3RlKQotICAgICBiZmQqIGFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9Ob3RlKiBub3RlOwotewotICBzd2l0Y2ggKG5vdGUtPnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfUFJTVEFUVVNfVCkKLSAgICBjYXNlIE5UX1BSU1RBVFVTOgotICAgICAgcmV0dXJuIGVsZmNvcmVfZ3Jva19wcnN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfUFNUQVRVU19UKQotICAgIGNhc2UgTlRfUFNUQVRVUzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKEhBVkVfTFdQU1RBVFVTX1QpCi0gICAgY2FzZSBOVF9MV1BTVEFUVVM6Ci0gICAgICByZXR1cm4gZWxmY29yZV9ncm9rX2x3cHN0YXR1cyAoYWJmZCwgbm90ZSk7Ci0jZW5kaWYKLQotICAgIGNhc2UgTlRfRlBSRUdTRVQ6CQkvKiBGSVhNRTogcmVuYW1lIHRvIE5UX1BSRlBSRUcgKi8KLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHJmcHJlZyAoYWJmZCwgbm90ZSk7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1BSUFNJTkZPX1QpIHx8IGRlZmluZWQgKEhBVkVfUFNJTkZPX1QpCi0gICAgY2FzZSBOVF9QUlBTSU5GTzoKLSAgICBjYXNlIE5UX1BTSU5GTzoKLSAgICAgIHJldHVybiBlbGZjb3JlX2dyb2tfcHNpbmZvIChhYmZkLCBub3RlKTsKLSNlbmRpZgotICAgIH0KLX0KLQotCi1zdGF0aWMgYm9vbGVhbgotZWxmY29yZV9yZWFkX25vdGVzIChhYmZkLCBvZmZzZXQsIHNpemUpCi0gICAgIGJmZCogYWJmZDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgc2l6ZTsKLXsKLSAgY2hhciogYnVmOwotICBjaGFyKiBwOwotCi0gIGlmIChzaXplIDw9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYnVmID0gYmZkX21hbGxvYyAoKHNpemVfdCkgc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9yZWFkIChidWYsIHNpemUsIDEsIGFiZmQpICE9IHNpemUpCi0gICAgewotICAgIGVycm9yOgotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcCA9IGJ1ZjsKLSAgd2hpbGUgKHAgPCBidWYgKyBzaXplKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBiYWQgYWxpZ25tZW50IGFzc3VtcHRpb24uICovCi0gICAgICBFbGZfRXh0ZXJuYWxfTm90ZSogeG5wID0gKEVsZl9FeHRlcm5hbF9Ob3RlKikgcDsKLSAgICAgIEVsZl9JbnRlcm5hbF9Ob3RlIGluOwotCi0gICAgICBpbi50eXBlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT50eXBlKTsKLQotICAgICAgaW4ubmFtZXN6ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgeG5wLT5uYW1lc3opOwotICAgICAgaW4ubmFtZWRhdGEgPSB4bnAtPm5hbWU7Ci0KLSAgICAgIGluLmRlc2NzeiA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHhucC0+ZGVzY3N6KTsKLSAgICAgIGluLmRlc2NkYXRhID0gaW4ubmFtZWRhdGEgKyBCRkRfQUxJR04gKGluLm5hbWVzeiwgNCk7Ci0gICAgICBpbi5kZXNjcG9zID0gb2Zmc2V0ICsgKGluLmRlc2NkYXRhIC0gYnVmKTsKLQotICAgICAgaWYgKCEgZWxmY29yZV9ncm9rX25vdGUgKGFiZmQsICZpbikpCi0JZ290byBlcnJvcjsKLQotICAgICAgcCA9IGluLmRlc2NkYXRhICsgQkZEX0FMSUdOIChpbi5kZXNjc3osIDQpOwotICAgIH0KLQotICBmcmVlIChidWYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLWJvb2xlYW4KLV9iZmRfZWxmY29yZV9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgcGhkciwgc2VjX251bSkKLSAgICAgYmZkKiBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfUGhkciogcGhkcjsKLSAgICAgaW50IHNlY19udW07Ci17Ci0gIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fcGhkciAoYWJmZCwgcGhkciwgc2VjX251bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwaGRyLT5wX3R5cGUgPT0gUFRfTk9URQotICAgICAgJiYgISBlbGZjb3JlX3JlYWRfbm90ZXMgKGFiZmQsIHBoZHItPnBfb2Zmc2V0LCBwaGRyLT5wX2ZpbGVzeikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItYXJjLmMgYi9iZmQvZWxmMzItYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTBhMjQuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qIEFSQy1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBEb3VnIEV2YW5zIChkamVAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgYXJjX2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBhcmNfZWxmX29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBhcmNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogVHJ5IHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2Ygc3BhY2Ugb2NjdXBpZWQgYnkgcmVsb2NhdGlvbiB0YWJsZXMKLSAgIG9uIHRoZSBST00gKG5vdCB0aGF0IHRoZSBST00gd29uJ3QgYmUgc3dhbXBlZCBieSBvdGhlciBFTEYgb3ZlcmhlYWQpLiAgKi8KLSNkZWZpbmUgVVNFX1JFTAotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfYXJjX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0FSQ19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSQ19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfQVJDXzMyLAkJLyogdHlwZSAqLwotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjYgYml0IGFic29sdXRlIGJyYW5jaCwgcmlnaHQgc2hpZnRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfQVJDX0IyNiwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUkNfQjI2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyMiBiaXQgYnJhbmNoOyBiaXRzIDIxLTIgYXJlIHN0b3JlZCBpbiBiaXRzIDI2LTcuICAqLwotICBIT1dUTyAoUl9BUkNfQjIyX1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNywJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJDX0IyMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZmZmODAsCQkvKiBzcmNfbWFzayAqLwotCSAweDA3ZmZmZjgwLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLS8qIE1hcCBCRkQgcmVsb2MgdHlwZXMgdG8gQVJDIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBhcmNfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFyY19yZWxvY19tYXAgYXJjX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9BUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfQVJDXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0FSQ19CMjYsIFJfQVJDX0IyNiB9LAotICB7IEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMLCBSX0FSQ19CMjJfUENSRUwgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAoYXJjX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBhcmNfcmVsb2NfbWFwKTsKLSAgICAgICBpKyspCi0gICAgewotICAgICAgaWYgKGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX2FyY19ob3d0b190YWJsZVthcmNfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogU2V0IHRoZSBob3d0byBwb2ludGVyIGZvciBhbiBBUkMgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9BUkNfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfYXJjX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGFuIEFSQyBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1hcmNfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBtYWNoOwotICB1bnNpZ25lZCBsb25nIGFyY2ggPSBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FSQ19NQUNIOwotCi0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0gICAgY2FzZSBFX0FSQ19NQUNIX0JBU0U6Ci0gICAgICBtYWNoID0gYmZkX21hY2hfYXJjX2Jhc2U7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogVW5rbm93biBjcHUgdHlwZS4gID8/PyBXaGF0IHRvIGRvPyAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKHZvaWQpIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FyYywgbWFjaCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGFuIEFSQyBFTEYgb2JqZWN0IGZpbGUuCi0gICBUaGlzIGdldHMgdGhlIEFSQyBhcmNoaXRlY3R1cmUgcmlnaHQgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyOwotewotICBpbnQgbWFjaDsKLSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0KLSAgc3dpdGNoIChtYWNoID0gYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfbWFjaF9hcmNfYmFzZToKLSAgICAgIHZhbCA9IEVfQVJDX01BQ0hfQkFTRTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9BUkNfTUFDSDsKLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gdmFsOwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9saXR0bGVhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItbGl0dGxlYXJjIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2JpZ2FyY192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItYmlnYXJjIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfYXJjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0FSQwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCTAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWFyY19pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAlhcmNfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCWFyY19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItYXJtLmggYi9iZmQvZWxmMzItYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWY5MjYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWFybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzE1MCArMCwwIEBACi0vKiAzMi1iaXQgRUxGIHN1cHBvcnQgZm9yIEFSTQotICAgQ29weXJpZ2h0IDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IGluc24zMjsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGluc24xNjsKLQotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX2FybV9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotc3RhdGljIGludCBlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlCi0gIFBBUkFNUyAoKCBFbGZfSW50ZXJuYWxfU3ltICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICplbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfdm1hLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgY2hhciwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotCi1zdGF0aWMgaW5zbjMyIGluc2VydF90aHVtYl9icmFuY2gKLSAgUEFSQU1TICgoaW5zbjMyLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZmluZF90aHVtYl9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIENPTlNUIGNoYXIgKiwgYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqZmluZF9hcm1fZ2x1ZQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBDT05TVCBjaGFyICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCByZWNvcmRfYXJtX3RvX3RodW1iX2dsdWUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgcmVjb3JkX3RodW1iX3RvX2FybV9nbHVlCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyB2b2lkIGVsZjMyX2FybV9wb3N0X3Byb2Nlc3NfaGVhZGVycwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBUaGUgbGlua2VyIHNjcmlwdCBrbm93cyB0aGUgc2VjdGlvbiBuYW1lcyBmb3IgcGxhY2VtZW50LgotICAgVGhlIGVudHJ5X25hbWVzIGFyZSB1c2VkIHRvIGRvIHNpbXBsZSBuYW1lIG1hbmdsaW5nIG9uIHRoZSBzdHVicy4KLSAgIEdpdmVuIGEgZnVuY3Rpb24gbmFtZSwgYW5kIGl0cyB0eXBlLCB0aGUgc3R1YiBjYW4gYmUgZm91bmQuIFRoZQotICAgbmFtZSBjYW4gYmUgY2hhbmdlZC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhlICVzIGJlIHByZXNlbnQuCi0gKi8KLQotI2RlZmluZSBJTlRFUldPUktfRkxBRyggYWJmZCApICAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfSU5URVJXT1JLKQotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfN3QiCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX0VOVFJZX05BTUUgICAiX18lc19mcm9tX3RodW1iIgotCi0jZGVmaW5lIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSAiLmdsdWVfNyIKLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfRU5UUllfTkFNRSAgICJfXyVzX2Zyb21fYXJtIgotCi0vKiBUaGUgbmFtZSBvZiB0aGUgZHluYW1pYyBpbnRlcnByZXRlci4gIFRoaXMgaXMgcHV0IGluIHRoZSAuaW50ZXJwCi0gICBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIgICAgICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDE2Ci0KLS8qIFRoZSBmaXJzdCBlbnRyeSBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UKLSAgIHRoaXMuICBJdCBpcyBzZXQgdXAgc28gdGhhdCBhbnkgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBpcwotICAgY2FsbGVkIGJlZm9yZSB0aGUgcmVsb2NhdGlvbiBoYXMgYmVlbiBzZXQgdXAgY2FsbGVzIHRoZSBkeW5hbWljCi0gICBsaW5rZXIgZmlyc3QgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHQwX2VudHJ5IFtQTFRfRU5UUllfU0laRV0gPQotewotICAweDA0LCAweGUwLCAweDJkLCAweGU1LAkvKiBzdHIgICBsciwgW3NwLCAjLTRdISAgICAgKi8KLSAgMHgxMCwgMHhlMCwgMHg5ZiwgMHhlNSwJLyogbGRyICAgbHIsIFtwYywgIzE2XSAgICAgICovCi0gIDB4MGUsIDB4ZTAsIDB4OGYsIDB4ZTAsCS8qIGFkciAgIGxyLCBwYywgbHIgICAgICAgICAqLwotICAweDA4LCAweGYwLCAweGJlLCAweGU1CS8qIGxkciAgIHBjLCBbbHIsICMtNF0gICAgICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlCi0gICB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZjMyX2FybV9wbHRfZW50cnkgW1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MDQsIDB4YzAsIDB4OWYsIDB4ZTUsCS8qIGxkciAgIGlwLCBbcGMsICM0XSAgICAgICAqLwotICAweDBjLCAweGMwLCAweDhmLCAweGUwLAkvKiBhZGQgICBpcCwgcGMsIGlwICAgICAgICAgKi8KLSAgMHgwMCwgMHhmMCwgMHg5YywgMHhlNSwJLyogbGRyICAgcGMsIFtpcF0gICAgICAgICAgICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgICAgICAgIC8qIG9mZnNldCB0byBzeW1ib2wgaW4gZ290ICAqLwotfTsKLQotCi0vKiBUaGUgQVJNIGxpbmtlciBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgcmVsb2NzIHRoYXQgaXQKLSAgIGRlY2lkZXMgdG8gY29weSBpbiBjaGVja19yZWxvY3MgZm9yIGVhY2ggc3ltYm9sLiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBpdCBjYW4gZGlzY2FyZCBQQyByZWxhdGl2ZSByZWxvY3MgaWYgaXQgZG9lc24ndCBuZWVkIHRoZW0gd2hlbgotICAgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMuICBXZSBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaW4gYSBmaWVsZAotICAgZXh0ZW5kaW5nIHRoZSByZWd1bGFyIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIHdlCi0gICBoYXZlIGNvcGllZCBmb3IgYSBnaXZlbiBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQKLXsKLSAgLyogTmV4dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogbmV4dDsKLSAgLyogQSBzZWN0aW9uIGluIGR5bm9iai4gICovCi0gIGFzZWN0aW9uICogc2VjdGlvbjsKLSAgLyogTnVtYmVyIG9mIHJlbG9jcyBjb3BpZWQgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLX07Ci0KLS8qIEFybSBFTEYgbGlua2VyIGhhc2ggZW50cnkuICAqLwotCi1zdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIE51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3MgY29waWVkIGZvciB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqIHBjcmVsX3JlbG9jc19jb3BpZWQ7Ci19OwotCi0vKiBEZWNsYXJlIHRoaXMgbm93IHRoYXQgdGhlIGFib3ZlIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIFRyYXZlcnNlIGFuIGFybSBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBBUk0gZWxmIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgZWxmMzJfYXJtX2hhc2hfdGFibGUoaW5mbykgXAotICAoKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICopICgoaW5mbyktPmhhc2gpKQotCi0vKiBBUk0gRUxGIGxpbmtlciBoYXNoIHRhYmxlICovCi1zdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZQotICB7Ci0gICAgLyogVGhlIG1haW4gaGFzaCB0YWJsZS4gICovCi0gICAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAgIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5nIHRoZSBUaHVtYi10by1BUk0gZ2x1ZS4gICovCi0gICAgbG9uZyBpbnQgdGh1bWJfZ2x1ZV9zaXplOwotCi0gICAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHNlY3Rpb24gY29udGFpbmcgdGhlIEFSTS10by1UaHVtYiBnbHVlLiAgKi8KLSAgICBsb25nIGludCBhcm1fZ2x1ZV9zaXplOwotCi0gICAgLyogQW4gYXJiaXRhcnkgaW5wdXQgQkZEIGNob3NlbiB0byBob2xkIHRoZSBnbHVlIHNlY3Rpb25zLiAgKi8KLSAgICBiZmQgKiBiZmRfb2ZfZ2x1ZV9vd25lcjsKLQotICAgIC8qIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIga25vd2xlZGdlIG9mIHRoZSBBUk0ncyBwaXBlbGluZQotICAgICAgIGxlbmd0aCBzaG91bGQgYmUgYXBwbGllZCBieSB0aGUgbGlua2VyLiAgKi8KLSAgICBpbnQgbm9fcGlwZWxpbmVfa25vd2xlZGdlOwotICB9OwotCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhbiBBUk0gRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGYzMl9hcm1fbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiBlbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICogdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKiBzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICogcmV0ID0KLSAgICAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0LT5wY3JlbF9yZWxvY3NfY29waWVkID0gTlVMTDsKLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBBUk0gZWxmIGxpbmtlciBoYXNoIHRhYmxlICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICByZXQtPnRodW1iX2dsdWVfc2l6ZSA9IDA7Ci0gIHJldC0+YXJtX2dsdWVfc2l6ZSA9IDA7Ci0gIHJldC0+YmZkX29mX2dsdWVfb3duZXIgPSBOVUxMOwotICByZXQtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSA9IDA7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotc3RhdGljIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoKLWZpbmRfdGh1bWJfZ2x1ZSAobGlua19pbmZvLCBuYW1lLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotewotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhhc2g7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpoYXNoX3RhYmxlOwotCi0gIC8qIFdlIG5lZWQgYSBwb2ludGVyIHRvIHRoZSBhcm1lbGYgc3BlY2lmaWMgaGFzaCB0YWJsZS4gICovCi0gIGhhc2hfdGFibGUgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotCi0gIHRtcF9uYW1lID0gKChjaGFyICopCi0gICAgICAgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSkgKyAxKSk7Ci0KLSAgQkZEX0FTU0VSVCAodG1wX25hbWUpOwotCi0gIHNwcmludGYgKHRtcF9uYW1lLCBUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FLCBuYW1lKTsKLQotICBoYXNoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihoYXNoX3RhYmxlKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKGhhc2ggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIiVzOiB1bmFibGUgdG8gZmluZCBUSFVNQiBnbHVlICclcycgZm9yIGAlcyciKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIHRtcF9uYW1lLCBuYW1lKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqCi1maW5kX2FybV9nbHVlIChsaW5rX2luZm8sIG5hbWUsIGlucHV0X2JmZCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGNoYXIgKnRtcF9uYW1lOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqaGFzaF90YWJsZTsKLQotICAvKiBXZSBuZWVkIGEgcG9pbnRlciB0byB0aGUgZWxmYXJtIHNwZWNpZmljIGhhc2ggdGFibGUuICAqLwotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLSAgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoaGFzaF90YWJsZSktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggPT0gTlVMTCkKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIiVzOiB1bmFibGUgdG8gZmluZCBBUk0gZ2x1ZSAnJXMnIGZvciBgJXMnIiksCi0JCQliZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCB0bXBfbmFtZSwgbmFtZSk7Ci0KLSAgZnJlZSAodG1wX25hbWUpOwotCi0gIHJldHVybiBteWg7Ci19Ci0KLS8qCi0gICBBUk0tPlRodW1iIGdsdWU6Ci0KLSAgIC5hcm0KLSAgIF9fZnVuY19mcm9tX2FybToKLSAgIGxkciByMTIsIF9fZnVuY19hZGRyCi0gICBieCAgcjEyCi0gICBfX2Z1bmNfYWRkcjoKLSAgIC53b3JkIGZ1bmMgICAgQCBiZWhhdmUgYXMgaWYgeW91IHNhdyBhIEFSTV8zMiByZWxvYwotICovCi0KLSNkZWZpbmUgQVJNMlRIVU1CX0dMVUVfU0laRSAxMgotc3RhdGljIGNvbnN0IGluc24zMiBhMnQxX2xkcl9pbnNuID0gMHhlNTlmYzAwMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgYTJ0Ml9ieF9yMTJfaW5zbiA9IDB4ZTEyZmZmMWM7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIGEydDNfZnVuY19hZGRyX2luc24gPSAweDAwMDAwMDAxOwotCi0vKgotICAgVGh1bWItPkFSTTogICAgICAgICAgICAgICAgICAgICAgICAgIFRodW1iLT4obm9uLWludGVyd29ya2luZyBhd2FyZSkgQVJNCi0KLSAgIC50aHVtYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGh1bWIKLSAgIC5hbGlnbiAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWxpZ24gMgotICAgX19mdW5jX2Zyb21fdGh1bWI6ICAgICAgICAgICAgICBfX2Z1bmNfZnJvbV90aHVtYjoKLSAgIGJ4IHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIHtyNiwgbHJ9Ci0gICBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGRyICByNiwgX19mdW5jX2FkZHIKLSAgIC5hcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdiAgbHIsIHBjCi0gICBfX2Z1bmNfY2hhbmdlX3RvX2FybTogICAgICAgICAgICAgICAgICAgICAgICBieCAgIHI2Ci0gICBiIGZ1bmMgICAgICAgICAgICAgICAgICAgICAgIC5hcm0KLSAgIF9fZnVuY19iYWNrX3RvX3RodW1iOgotICAgbGRtaWEgcjEzISB7cjYsIGxyfQotICAgYnggICAgbHIKLSAgIF9fZnVuY19hZGRyOgotICAgLndvcmQgICAgICAgIGZ1bmMKLSAqLwotCi0jZGVmaW5lIFRIVU1CMkFSTV9HTFVFX1NJWkUgOAotc3RhdGljIGNvbnN0IGluc24xNiB0MmExX2J4X3BjX2luc24gPSAweDQ3Nzg7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTJfbm9vcF9pbnNuID0gMHg0NmMwOwotc3RhdGljIGNvbnN0IGluc24zMiB0MmEzX2JfaW5zbiA9IDB4ZWEwMDAwMDA7Ci0KLXN0YXRpYyBjb25zdCBpbnNuMTYgdDJhMV9wdXNoX2luc24gPSAweGI1NDA7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTJfbGRyX2luc24gPSAweDRlMDM7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTNfbW92X2luc24gPSAweDQ2ZmU7Ci1zdGF0aWMgY29uc3QgaW5zbjE2IHQyYTRfYnhfaW5zbiA9IDB4NDczMDsKLXN0YXRpYyBjb25zdCBpbnNuMzIgdDJhNV9wb3BfaW5zbiA9IDB4ZThiZDQwNDA7Ci1zdGF0aWMgY29uc3QgaW5zbjMyIHQyYTZfYnhfaW5zbiA9IDB4ZTEyZmZmMWU7Ci0KLWJvb2xlYW4KLWJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGFzZWN0aW9uICogczsKLSAgYmZkX2J5dGUgKiBmb287Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICogZ2xvYmFsczsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0KLSAgaWYgKGdsb2JhbHMtPmFybV9nbHVlX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBmb28gPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jCi0JKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLCBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gZm9vOwotICAgIH0KLQotICBpZiAoZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplICE9IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgZm9vID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYwotCShnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLQotICAgICAgcy0+X3Jhd19zaXplID0gcy0+X2Nvb2tlZF9zaXplID0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplOwotICAgICAgcy0+Y29udGVudHMgPSBmb287Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChsaW5rX2luZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogbGlua19pbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKiBzOwotICBjaGFyICogdG1wX25hbWU7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChsaW5rX2luZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZQotICAgIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgQVJNMlRIVU1CX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoKGNoYXIgKikKLSAgICAgICBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChBUk0yVEhVTUJfR0xVRV9FTlRSWV9OQU1FKSArIDEpKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIEFSTTJUSFVNQl9HTFVFX0VOVFJZX05BTUUsIG5hbWUpOwotCi0gIG15aCA9IGVsZl9saW5rX2hhc2hfbG9va3VwCi0gICAgKCYoZ2xvYmFscyktPnJvb3QsIHRtcF9uYW1lLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChteWggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlICh0bXBfbmFtZSk7Ci0gICAgICByZXR1cm47CQkJLyogd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZ3V5ICovCi0gICAgfQotCi0gIC8qIFRoZSBvbmx5IHRyaWNrIGhlcmUgaXMgdXNpbmcgaGFzaF90YWJsZS0+YXJtX2dsdWVfc2l6ZSBhcyB0aGUgdmFsdWUuIEV2ZW4KLSAgICAgdGhvdWdoIHRoZSBzZWN0aW9uIGlzbid0IGFsbG9jYXRlZCB5ZXQsIHRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBiZSBwdXR0aW5nCi0gICAgIGl0LiAgKi8KLQotICBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAobGlua19pbmZvLCBnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciwgdG1wX25hbWUsCi0JCQkJICAgIEJTRl9HTE9CQUwsCi0JCQkJICAgIHMsIGdsb2JhbHMtPmFybV9nbHVlX3NpemUgKyAxLAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgZ2xvYmFscy0+YXJtX2dsdWVfc2l6ZSArPSBBUk0yVEhVTUJfR0xVRV9TSVpFOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXJlY29yZF90aHVtYl90b19hcm1fZ2x1ZSAobGlua19pbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgY29uc3QgY2hhciAqbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBjaGFyICp0bXBfbmFtZTsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKm15aDsKLSAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfdGFibGUgKmhhc2hfdGFibGU7Ci0gIGNoYXIgYmluZDsKLQotICBoYXNoX3RhYmxlID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGxpbmtfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoaGFzaF90YWJsZSAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lCi0gICAgKGhhc2hfdGFibGUtPmJmZF9vZl9nbHVlX293bmVyLCBUSFVNQjJBUk1fR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgdG1wX25hbWUgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChUSFVNQjJBUk1fR0xVRV9FTlRSWV9OQU1FKSArIDEpOwotCi0gIEJGRF9BU1NFUlQgKHRtcF9uYW1lKTsKLQotICBzcHJpbnRmICh0bXBfbmFtZSwgVEhVTUIyQVJNX0dMVUVfRU5UUllfTkFNRSwgbmFtZSk7Ci0KLSAgbXloID0gZWxmX2xpbmtfaGFzaF9sb29rdXAKLSAgICAoJihoYXNoX3RhYmxlKS0+cm9vdCwgdG1wX25hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgaWYgKG15aCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHRtcF9uYW1lKTsKLSAgICAgIHJldHVybjsJCQkvKiB3ZSd2ZSBhbHJlYWR5IHNlZW4gdGhpcyBndXkgKi8KLSAgICB9Ci0KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGxpbmtfaW5mbywgaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJICAgICBCU0ZfR0xPQkFMLCBzLCBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKyAxLAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICAvKiBJZiB3ZSBtYXJrIGl0ICd0aHVtYicsIHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBkbyBhIGJldHRlciBqb2IuICAqLwotICBiaW5kID0gRUxGX1NUX0JJTkQgKG15aC0+dHlwZSk7Ci0gIG15aC0+dHlwZSA9IEVMRl9TVF9JTkZPIChiaW5kLCBTVFRfQVJNX1RGVU5DKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgLyogQWxsb2NhdGUgYW5vdGhlciBzeW1ib2wgdG8gbWFyayB3aGVyZSB3ZSBzd2l0Y2ggdG8gYXJtIG1vZGUuICAqLwotCi0jZGVmaW5lIENIQU5HRV9UT19BUk0gIl9fJXNfY2hhbmdlX3RvX2FybSIKLSNkZWZpbmUgQkFDS19GUk9NX0FSTSAiX18lc19iYWNrX2Zyb21fYXJtIgotCi0gIHRtcF9uYW1lID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAoQ0hBTkdFX1RPX0FSTSkgKyAxKTsKLQotICBCRkRfQVNTRVJUICh0bXBfbmFtZSk7Ci0KLSAgc3ByaW50ZiAodG1wX25hbWUsIENIQU5HRV9UT19BUk0sIG5hbWUpOwotCi0gIG15aCA9IE5VTEw7Ci0KLSAgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGxpbmtfaW5mbywgaGFzaF90YWJsZS0+YmZkX29mX2dsdWVfb3duZXIsIHRtcF9uYW1lLAotCQkJICAgICAgQlNGX0xPQ0FMLCBzLCBoYXNoX3RhYmxlLT50aHVtYl9nbHVlX3NpemUgKyA0LAotCQkJCSAgICBOVUxMLCB0cnVlLCBmYWxzZSwKLQkJCQkgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmbXloKTsKLQotICBmcmVlICh0bXBfbmFtZSk7Ci0KLSAgaGFzaF90YWJsZS0+dGh1bWJfZ2x1ZV9zaXplICs9IFRIVU1CMkFSTV9HTFVFX1NJWkU7Ci0KLSAgcmV0dXJuOwotfQotCi0vKiBTZWxlY3QgYSBCRkQgdG8gYmUgdXNlZCB0byBob2xkIHRoZSBzZWN0aW9ucyB1c2VkIGJ5IHRoZSBnbHVlIGNvZGUuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiBsZC9lbXVsdGVtcGwvCi0gICB7YXJtZWxmL3BlfS5lbSAgKi8KLWJvb2xlYW4KLWJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgLyogSWYgd2UgYXJlIG9ubHkgcGVyZm9ybWluZyBhIHBhcnRpYWwgbGluayBkbyBub3QgYm90aGVyCi0gICAgIGdldHRpbmcgYSBiZmQgdG8gaG9sZCB0aGUgZ2x1ZS4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotCi0gIGlmIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBBUk0yVEhVTUJfR0xVRV9TRUNUSU9OX05BTUUpOwotCi0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlk7Ci0KLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgICAgIGlmIChzZWMgPT0gTlVMTAotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncykKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzZWMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWTsKLQotICAgICAgc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgVEhVTUIyQVJNX0dMVUVfU0VDVElPTl9OQU1FKTsKLQotICAgICAgaWYgKHNlYyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHNlYywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTYXZlIHRoZSBiZmQgZm9yIGxhdGVyIHVzZS4gICovCi0gIGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyID0gYWJmZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbGVhbgotYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChhYmZkLCBsaW5rX2luZm8sIG5vX3BpcGVsaW5lX2tub3dsZWRnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBpbnQgbm9fcGlwZWxpbmVfa25vd2xlZGdlOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLQotICAvKiBJZiB3ZSBhcmUgb25seSBwZXJmb3JtaW5nIGEgcGFydGlhbCBsaW5rIGRvIG5vdCBib3RoZXIKLSAgICAgdG8gY29uc3RydWN0IGFueSBnbHVlLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEhlcmUgd2UgaGF2ZSBhIGJmZCB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIG9uIHRoZSBsaW5rLiAgV2UgaGF2ZSBhIGhvb2sKLSAgICAgdG8gZG8gcmVsb2MgcnVtbWFnaW5nLCBiZWZvcmUgc2VjdGlvbiBzaXplcyBhcmUgbmFpbGVkIGRvd24uICAqLwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAobGlua19pbmZvKTsKLQotICBCRkRfQVNTRVJUIChnbG9iYWxzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChnbG9iYWxzLT5iZmRfb2ZfZ2x1ZV9vd25lciAhPSBOVUxMKTsKLQotICBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UgPSBub19waXBlbGluZV9rbm93bGVkZ2U7Ci0KLSAgLyogUnVtbWFnZSBhcm91bmQgYWxsIHRoZSByZWxvY3MgYW5kIG1hcCB0aGUgZ2x1ZSB2ZWN0b3JzLiAgKi8KLSAgc2VjID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAoOyBzZWMgIT0gTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIC8qIExvYWQgdGhlIHJlbG9jcy4gICovCi0KLSAgICAgIGlyZWwgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsCi0JCQkJCShFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotCi0gICAgICBCRkRfQVNTRVJUIChpcmVsICE9IDApOwotCi0gICAgICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKDsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLQl7Ci0JICBsb25nIHJfdHlwZTsKLQkgIHVuc2lnbmVkIGxvbmcgcl9pbmRleDsKLQkgIHVuc2lnbmVkIGNoYXIgY29kZTsKLQotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKLQkgIHJfaW5kZXggPSBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKTsKLQotCSAgLyogVGhlc2UgYXJlIHRoZSBvbmx5IHJlbG9jYXRpb24gdHlwZXMgd2UgY2FyZSBhYm91dCAqLwotCSAgaWYgKCAgIHJfdHlwZSAhPSBSX0FSTV9QQzI0Ci0JICAgICAgJiYgcl90eXBlICE9IFJfQVJNX1RITV9QQzIyKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLQkgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogR2V0IGNhY2hlZCBjb3B5IGlmIGl0IGV4aXN0cy4gICovCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCWNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogR28gZ2V0IHRoZW0gb2ZmIGRpc2suICAqLwotCQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkJICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCQkgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotCSAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgICAgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCQlleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JCSAgZXh0c3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkJICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkJICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICAgICAgfHwgKGJmZF9yZWFkIChleHRzeW1zLCAxLCBzeW10YWJfaGRyLT5zaF9zaXplLCBhYmZkKQotCQkJICAhPSBzeW10YWJfaGRyLT5zaF9zaXplKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgbm90IGFnYWluc3QgYSBzeW1ib2wgaXQgY2Fubm90IGNvbmNlcm4gdXMuICovCi0KLQkgIGggPSBOVUxMOwotCi0JICAvKiBXZSBkb24ndCBjYXJlIGFib3V0IGxvY2FsIHN5bWJvbHMgKi8KLQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sICovCi0JICByX2luZGV4IC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGVsZl9zeW1faGFzaGVzIChhYmZkKVtyX2luZGV4XTsKLQotCSAgLyogSWYgdGhlIHJlbG9jYXRpb24gaXMgYWdhaW5zdCBhIHN0YXRpYyBzeW1ib2wgaXQgbXVzdCBiZSB3aXRoaW4KLQkgICAgIHRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHNvIGNhbm5vdCBiZSBhIGNyb3NzIEFSTS9UaHVtYiByZWxvY2F0aW9uLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gYXJtIGNvZGUuICBXZSBuZWVkIHRvIGxvb2sgdXAKLQkgICAgICAgICB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBhIHRodW1iIHRhcmdldCwgd2UKLQkgICAgICAgICBpbnNlcnQgZ2x1ZS4gICovCi0KLQkgICAgICBpZiAoRUxGX1NUX1RZUEUoaC0+dHlwZSkgPT0gU1RUX0FSTV9URlVOQykKLQkJcmVjb3JkX2FybV90b190aHVtYl9nbHVlIChsaW5rX2luZm8sIGgpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9BUk1fVEhNX1BDMjI6Ci0JICAgICAgLyogVGhpcyBvbmUgaXMgYSBjYWxsIGZyb20gdGh1bWIgY29kZS4gIFdlIGxvb2sKLQkgICAgICAgICB1cCB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsLiBJZiBpdCBpcyBub3QgYSB0aHVtYgotICAgICAgICAgICAgICAgICB0YXJnZXQsIHdlIGluc2VydCBnbHVlLiAqLwotCi0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChoLT50eXBlKSAhPSBTVFRfQVJNX1RGVU5DKQotCQlyZWNvcmRfdGh1bWJfdG9fYXJtX2dsdWUgKGxpbmtfaW5mbywgaCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci1lcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLQotfQotCi0vKiBUaGUgdGh1bWIgZm9ybSBvZiBhIGxvbmcgYnJhbmNoIGlzIGEgYml0IGZpbmlja3ksIGJlY2F1c2UgdGhlIG9mZnNldAotICAgZW5jb2RpbmcgaXMgc3BsaXQgb3ZlciB0d28gZmllbGRzLCBlYWNoIGluIGl0J3Mgb3duIGluc3RydWN0aW9uLiBUaGV5Ci0gICBjYW4gb2NjdXIgaW4gYW55IG9yZGVyLiBTbyBnaXZlbiBhIHRodW1iIGZvcm0gb2YgbG9uZyBicmFuY2gsIGFuZCBhbgotICAgb2Zmc2V0LCBpbnNlcnQgdGhlIG9mZnNldCBpbnRvIHRoZSB0aHVtYiBicmFuY2ggYW5kIHJldHVybiBmaW5pc2hlZAotICAgaW5zdHJ1Y3Rpb24uCi0KLSAgIEl0IHRha2VzIHR3byB0aHVtYiBpbnN0cnVjdGlvbnMgdG8gZW5jb2RlIHRoZSB0YXJnZXQgYWRkcmVzcy4gRWFjaCBoYXMKLSAgIDExIGJpdHMgdG8gaW52ZXN0LiBUaGUgdXBwZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIG9uZSAoaWRlbnRpZmVkIGJ5Ci0gICBILTAuLiBzZWUgYmVsb3cpLCB0aGUgbG93ZXIgMTEgYml0cyBhcmUgc3RvcmVkIGluIHRoZSBvdGhlciAoaWRlbnRpZmllZAotICAgYnkgSC0xKS4KLQotICAgQ29tYmluZSB0b2dldGhlciBhbmQgc2hpZnRlZCBsZWZ0IGJ5IDEgKGl0J3MgYSBoYWxmIHdvcmQgYWRkcmVzcykgYW5kCi0gICB0aGVyZSB5b3UgaGF2ZSBpdC4KLQotICAgT3A6IDExMTEgPSBGLAotICAgSC0wLCB1cHBlciBhZGRyZXNzLTAgPSAwMDAKLSAgIE9wOiAxMTExID0gRiwKLSAgIEgtMSwgbG93ZXIgYWRkcmVzcy0wID0gODAwCi0KLSAgIFRoZXkgY2FuIGJlIG9yZGVyZWQgZWl0aGVyIHdheSwgYnV0IHRoZSBhcm0gdG9vbHMgSSd2ZSBzZWVuIGFsd2F5cyBwdXQKLSAgIHRoZSBsb3dlciBvbmUgZmlyc3QuIEl0IHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLiBrcmtAY3lnbnVzLmNvbQotCi0gICBYWFg6ICBBY3R1YWxseSB0aGUgb3JkZXIgZG9lcyBtYXR0ZXIuICBUaGUgc2Vjb25kIGluc3RydWN0aW9uIChILTEpCi0gICBtb3ZlcyB0aGUgY29tcHV0ZWQgYWRkcmVzcyBpbnRvIHRoZSBQQywgc28gaXQgbXVzdCBiZSB0aGUgc2Vjb25kIG9uZQotICAgaW4gdGhlIHNlcXVlbmNlLiAgVGhlIHByb2JsZW0sIGhvd2V2ZXIgaXMgdGhhdCB3aGlsc3QgbGl0dGxlIGVuZGlhbiBjb2RlCi0gICBzdG9yZXMgdGhlIGluc3RydWN0aW9ucyBpbiBISSB0aGVuIExPVyBvcmRlciwgYmlnIGVuZGlhbiBjb2RlIGRvZXMgdGhlCi0gICByZXZlcnNlLiAgbmlja2NAY3lnbnVzLmNvbSAgKi8KLQotI2RlZmluZSBMT1dfSElfT1JERVIgMHhGODAwRjAwMAotI2RlZmluZSBISV9MT1dfT1JERVIgMHhGMDAwRjgwMAotCi1zdGF0aWMgaW5zbjMyCi1pbnNlcnRfdGh1bWJfYnJhbmNoIChicl9pbnNuLCByZWxfb2ZmKQotICAgICBpbnNuMzIgYnJfaW5zbjsKLSAgICAgaW50IHJlbF9vZmY7Ci17Ci0gIHVuc2lnbmVkIGludCBsb3dfYml0czsKLSAgdW5zaWduZWQgaW50IGhpZ2hfYml0czsKLQotCi0gIEJGRF9BU1NFUlQgKChyZWxfb2ZmICYgMSkgIT0gMSk7Ci0KLSAgcmVsX29mZiA+Pj0gMTsJCS8qIGhhbGYgd29yZCBhbGlnbmVkIGFkZHJlc3MgKi8KLSAgbG93X2JpdHMgPSByZWxfb2ZmICYgMHgwMDAwMDdGRjsJLyogdGhlIGJvdHRvbSAxMSBiaXRzICovCi0gIGhpZ2hfYml0cyA9IChyZWxfb2ZmID4+IDExKSAmIDB4MDAwMDA3RkY7CS8qIHRoZSB0b3AgMTEgYml0cyAqLwotCi0gIGlmICgoYnJfaW5zbiAmIExPV19ISV9PUkRFUikgPT0gTE9XX0hJX09SREVSKQotICAgIGJyX2luc24gPSBMT1dfSElfT1JERVIgfCAobG93X2JpdHMgPDwgMTYpIHwgaGlnaF9iaXRzOwotICBlbHNlIGlmICgoYnJfaW5zbiAmIEhJX0xPV19PUkRFUikgPT0gSElfTE9XX09SREVSKQotICAgIGJyX2luc24gPSBISV9MT1dfT1JERVIgfCAoaGlnaF9iaXRzIDw8IDE2KSB8IGxvd19iaXRzOwotICBlbHNlCi0gICAgYWJvcnQgKCk7CQkJLyogZXJyb3IgLSBub3QgYSB2YWxpZCBicmFuY2ggaW5zdHJ1Y3Rpb24gZm9ybSAqLwotCi0gIC8qIEZJWE1FOiBhYm9ydCBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IGNhbGwuIGtya0BjeWdudXMuY29tICovCi0KLSAgcmV0dXJuIGJyX2luc247Ci19Ci0KLS8qIFRodW1iIGNvZGUgY2FsbGluZyBhbiBBUk0gZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQKLWVsZjMyX3RodW1iX3RvX2FybV9zdHViIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgaGl0X2RhdGEsIHN5bV9zZWMsIG9mZnNldCwgYWRkZW5kLCB2YWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjaGFyICpuYW1lOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmhpdF9kYXRhOwotICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGFkZGVuZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIGFzZWN0aW9uICpzID0gMDsKLSAgbG9uZyBpbnQgbXlfb2Zmc2V0OwotICB1bnNpZ25lZCBsb25nIGludCB0bXA7Ci0gIGxvbmcgaW50IHJldF9vZmZzZXQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpteWg7Ci0gIHN0cnVjdCBlbGYzMl9hcm1fbGlua19oYXNoX3RhYmxlICpnbG9iYWxzOwotCi0gIG15aCA9IGZpbmRfdGh1bWJfZ2x1ZSAoaW5mbywgbmFtZSwgaW5wdXRfYmZkKTsKLSAgaWYgKG15aCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBnbG9iYWxzID0gZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pOwotCi0gIEJGRF9BU1NFUlQgKGdsb2JhbHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyICE9IE5VTEwpOwotCi0gIG15X29mZnNldCA9IG15aC0+cm9vdC51LmRlZi52YWx1ZTsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLAotCQkJICAgICAgIFRIVU1CMkFSTV9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0KLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAocy0+Y29udGVudHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpOwotCi0gIGlmICgobXlfb2Zmc2V0ICYgMHgwMSkgPT0gMHgwMSkKLSAgICB7Ci0gICAgICBpZiAoc3ltX3NlYyAhPSBOVUxMCi0JICAmJiBzeW1fc2VjLT5vd25lciAhPSBOVUxMCi0JICAmJiAhSU5URVJXT1JLX0ZMQUcgKHN5bV9zZWMtPm93bmVyKSkKLQl7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIlcyglcyk6IHdhcm5pbmc6IGludGVyd29ya2luZyBub3QgZW5hYmxlZC4iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKHN5bV9zZWMtPm93bmVyKSwgbmFtZSk7Ci0JICBfYmZkX2Vycm9yX2hhbmRsZXIKLQkgICAgKF8gKCIgIGZpcnN0IG9jY3VycmVuY2U6ICVzOiB0aHVtYiBjYWxsIHRvIGFybSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC0tbXlfb2Zmc2V0OwotICAgICAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0gICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmExX2J4X3BjX2luc24sCi0JCSAgcy0+Y29udGVudHMgKyBteV9vZmZzZXQpOwotCi0gICAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB0MmEyX25vb3BfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDIpOwotCi0gICAgICByZXRfb2Zmc2V0ID0KLQkoKGJmZF9zaWduZWRfdm1hKSB2YWwpCS8qIEFkZHJlc3Mgb2YgZGVzdGluYXRpb24gb2YgdGhlIHN0dWIgKi8KLQktICgoYmZkX3NpZ25lZF92bWEpCi0JICAgKHMtPm91dHB1dF9vZmZzZXQJLyogT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHVicy4gICovCi0JICAgICsgbXlfb2Zmc2V0CQkvKiBPZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoaXMgc3R1YiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc3R1YnMuICAqLwotCSAgICArIHMtPm91dHB1dF9zZWN0aW9uLT52bWEpCS8qIEFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotCSAgICsgNAkJCS8qIFRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24gaXMgNCBieXRlcyBpbnRvIHRoZSBzdHViLiAgKi8KLQkgICArIDgpOwkJLyogQVJNIGJyYW5jaGVzIHdvcmsgZnJvbSB0aGUgcGMgb2YgdGhlIGluc3RydWN0aW9uICsgOC4gICovCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgdDJhM19iX2luc24gfCAoKHJldF9vZmZzZXQgPj4gMikgJiAweDAwRkZGRkZGKSwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDQpOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChteV9vZmZzZXQgPD0gZ2xvYmFscy0+dGh1bWJfZ2x1ZV9zaXplKTsKLQotICAvKiBOb3cgZ28gYmFjayBhbmQgZml4IHVwIHRoZSBvcmlnaW5hbCBCTCBpbnNuIHRvIHBvaW50Ci0gICAgIHRvIGhlcmUuICAqLwotICByZXRfb2Zmc2V0ID0KLSAgICBzLT5vdXRwdXRfb2Zmc2V0Ci0gICAgKyBteV9vZmZzZXQKLSAgICAtIChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgKyBvZmZzZXQgKyBhZGRlbmQpCi0gICAgLSA0OwotCi0gIHRtcCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEKLQkJICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCSAgICAgIGluc2VydF90aHVtYl9icmFuY2ggKHRtcCwgcmV0X29mZnNldCksCi0JICAgICAgaGl0X2RhdGEgLSBpbnB1dF9zZWN0aW9uLT52bWEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBcm0gY29kZSBjYWxsaW5nIGEgVGh1bWIgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQKLWVsZjMyX2FybV90b190aHVtYl9zdHViIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgaGl0X2RhdGEsIHN5bV9zZWMsIG9mZnNldCwgYWRkZW5kLCB2YWwpCi0KLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqaGl0X2RhdGE7Ci0gICAgIGFzZWN0aW9uICpzeW1fc2VjOwotICAgICBpbnQgb2Zmc2V0OwotICAgICBpbnQgYWRkZW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnQgdG1wOwotICBsb25nIGludCBteV9vZmZzZXQ7Ci0gIGFzZWN0aW9uICpzOwotICBsb25nIGludCByZXRfb2Zmc2V0OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqbXloOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqZ2xvYmFsczsKLQotICBteWggPSBmaW5kX2FybV9nbHVlIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQpOwotICBpZiAobXloID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdsb2JhbHMgPSBlbGYzMl9hcm1faGFzaF90YWJsZSAoaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAoZ2xvYmFscyAhPSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoZ2xvYmFscy0+YmZkX29mX2dsdWVfb3duZXIgIT0gTlVMTCk7Ci0KLSAgbXlfb2Zmc2V0ID0gbXloLT5yb290LnUuZGVmLnZhbHVlOwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGdsb2JhbHMtPmJmZF9vZl9nbHVlX293bmVyLAotCQkJICAgICAgIEFSTTJUSFVNQl9HTFVFX1NFQ1RJT05fTkFNRSk7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPmNvbnRlbnRzICE9IE5VTEwpOwotICBCRkRfQVNTRVJUIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKTsKLQotICBpZiAoKG15X29mZnNldCAmIDB4MDEpID09IDB4MDEpCi0gICAgewotICAgICAgaWYgKHN5bV9zZWMgIT0gTlVMTAotCSAgJiYgc3ltX3NlYy0+b3duZXIgIT0gTlVMTAotCSAgJiYgIUlOVEVSV09SS19GTEFHIChzeW1fc2VjLT5vd25lcikpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JICAgIChfICgiJXMoJXMpOiB3YXJuaW5nOiBpbnRlcndvcmtpbmcgbm90IGVuYWJsZWQuIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChzeW1fc2VjLT5vd25lciksIG5hbWUpOwotCSAgX2JmZF9lcnJvcl9oYW5kbGVyCi0JICAgIChfICgiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCkpOwotCX0KLSAgICAgIC0tbXlfb2Zmc2V0OwotICAgICAgbXloLT5yb290LnUuZGVmLnZhbHVlID0gbXlfb2Zmc2V0OwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhMnQxX2xkcl9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0KTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgYTJ0Ml9ieF9yMTJfaW5zbiwKLQkJICBzLT5jb250ZW50cyArIG15X29mZnNldCArIDQpOwotCi0gICAgICAvKiBJdCdzIGEgdGh1bWIgYWRkcmVzcy4gIEFkZCB0aGUgbG93IG9yZGVyIGJpdC4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWwgfCBhMnQzX2Z1bmNfYWRkcl9pbnNuLAotCQkgIHMtPmNvbnRlbnRzICsgbXlfb2Zmc2V0ICsgOCk7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKG15X29mZnNldCA8PSBnbG9iYWxzLT5hcm1fZ2x1ZV9zaXplKTsKLQotICB0bXAgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGhpdF9kYXRhKTsKLSAgdG1wID0gdG1wICYgMHhGRjAwMDAwMDsKLQotICAvKiBTb21laG93IHRoZXNlIGFyZSBib3RoIDQgdG9vIGZhciwgc28gc3VidHJhY3QgOC4gKi8KLSAgcmV0X29mZnNldCA9IHMtPm91dHB1dF9vZmZzZXQKLSAgICArIG15X29mZnNldAotICAgICsgcy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLSAgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAgICArIG9mZnNldCArIGFkZGVuZCkKLSAgICAtIDg7Ci0KLSAgdG1wID0gdG1wIHwgKChyZXRfb2Zmc2V0ID4+IDIpICYgMHgwMEZGRkZGRik7Ci0KLSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdG1wLCBoaXRfZGF0YQotCSAgICAgIC0gaW5wdXRfc2VjdGlvbi0+dm1hKTsKLQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGYzMl9hcm1fZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgcmVsLCB2YWx1ZSwKLQkJCSAgICAgICBpbmZvLCBzeW1fc2VjLCBzeW1fbmFtZSwgc3ltX2ZsYWdzLCBoKQotICAgICByZWxvY19ob3d0b190eXBlICogICAgIGhvd3RvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgcmVsOwotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgIHZhbHVlOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgc3ltX3NlYzsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICBzeW1fbmFtZTsKLSAgICAgdW5zaWduZWQgY2hhciAgICAgICAgICBzeW1fZmxhZ3M7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLXsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICAgcl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICBiZmRfYnl0ZSAqICAgICAgICAgICAgICAgICAgICBoaXRfZGF0YSA9IGNvbnRlbnRzICsgcmVsLT5yX29mZnNldDsKLSAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICAgZHlub2JqID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqICAgICAgICAgICAgICAgICAgICAgbG9jYWxfZ290X29mZnNldHM7Ci0gIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgIHNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgICBzcGx0ID0gTlVMTDsKLSAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICAgc3JlbG9jID0gTlVMTDsKLSAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICAgYWRkZW5kOwotICBiZmRfc2lnbmVkX3ZtYSAgICAgICAgICAgICAgICBzaWduZWRfYWRkZW5kOwotICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZSAqIGdsb2JhbHM7Ci0KLSAgZ2xvYmFscyA9IGVsZjMyX2FybV9oYXNoX3RhYmxlIChpbmZvKTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaikKLSAgICB7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgIH0KLSAgc3ltdGFiX2hkciA9ICYgZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChpbnB1dF9iZmQpOwotICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSNpZmRlZiBVU0VfUkVMCi0gIGFkZGVuZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgaG93dG8tPnNyY19tYXNrOwotCi0gIGlmIChhZGRlbmQgJiAoKGhvd3RvLT5zcmNfbWFzayArIDEpID4+IDEpKQotICAgIHsKLSAgICAgIHNpZ25lZF9hZGRlbmQgPSAtMTsKLSAgICAgIHNpZ25lZF9hZGRlbmQgJj0gfiBob3d0by0+c3JjX21hc2s7Ci0gICAgICBzaWduZWRfYWRkZW5kIHw9IGFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzaWduZWRfYWRkZW5kID0gYWRkZW5kOwotI2Vsc2UKLSAgYWRkZW5kID0gc2lnbmVkX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0FSTV9OT05FOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fUEMyNDoKLSAgICBjYXNlIFJfQVJNX0FCUzMyOgotICAgIGNhc2UgUl9BUk1fUkVMMzI6Ci0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgY29waWVkCi0JIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1biB0aW1lLiAqLwotCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAocl90eXBlICE9IFJfQVJNX1BDMjQKLSAJICAgICAgfHwgKGggIT0gTlVMTAotCSAgICAgICAgICAmJiBoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKCEgaW5mby0+c3ltYm9saWMKLQkJICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9SZWwgb3V0cmVsOwotCSAgYm9vbGVhbiBza2lwLCByZWxvY2F0ZTsKLQotCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqIG5hbWU7Ci0KLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwKLQkJICAgICAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCSAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkJCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgIGlucHV0X3NlY3Rpb24pLAotCQkJCSAgICAgbmFtZSArIDQpID09IDApOwotCi0JICAgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHNraXAgPSBmYWxzZTsKLQotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkgICAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICYgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJICAgICAgcmVsLT5yX29mZnNldCkpOwotCSAgICAgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQlza2lwID0gdHJ1ZTsKLQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JICAgIH0KLQotCSAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JICBpZiAoc2tpcCkKLQkgICAgewotCSAgICAgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JICAgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkgICAgfQotCSAgZWxzZSBpZiAocl90eXBlID09IFJfQVJNX1BDMjQpCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChoICE9IE5VTEwgJiYgaC0+ZHluaW5keCAhPSAtMSk7Ci0JICAgICAgaWYgKChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJcmVsb2NhdGUgPSBmYWxzZTsKLQkgICAgICBlbHNlCi0JCXJlbG9jYXRlID0gdHJ1ZTsKLQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9QQzI0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGggPT0gTlVMTAotCQkgIHx8ICgoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQkJewotCQkgIHJlbG9jYXRlID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICBlbHNlCi0JCSAgICByZWxvY2F0ZSA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9BUk1fQUJTMzIpOwotCQl9Ci0JICAgIH0KLQotCSAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAgICAoKChFbGYzMl9FeHRlcm5hbF9SZWwgKikKLQkJCQkgICAgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCSAgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0JICAKLQkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvIG5vdCB3YW50IHRvCi0JICAgICBmaWRkbGUgd2l0aCB0aGUgYWRkZW5kLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGluY2x1ZGUgdGhlIHN5bWJvbAotCSAgICAgdmFsdWUgc28gdGhhdCBpdCBiZWNvbWVzIGFuIGFkZGVuZCBmb3IgdGhlIGR5bmFtaWMgcmVsb2MuICovCi0JICBpZiAoISByZWxvY2F0ZSkKLQkgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotCSAgCi0JICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0JCQkJCSAgIChiZmRfdm1hKSAwKTsKLQl9Ci0gICAgICBlbHNlIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfQVJNX1BDMjQ6Ci0JICAvKiBBcm0gQi9CTCBpbnN0cnVjdGlvbiAqLwotCi0JICAvKiBDaGVjayBmb3IgYXJtIGNhbGxpbmcgdGh1bWIgZnVuY3Rpb24uICAqLwotCSAgaWYgKHN5bV9mbGFncyA9PSBTVFRfQVJNX1RGVU5DKQotCSAgICB7Ci0JICAgICAgZWxmMzJfYXJtX3RvX3RodW1iX3N0dWIgKGluZm8sIHN5bV9uYW1lLCBpbnB1dF9iZmQsIG91dHB1dF9iZmQsCi0JCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGhpdF9kYXRhLCBzeW1fc2VjLCByZWwtPnJfb2Zmc2V0LCBhZGRlbmQsIHZhbHVlKTsKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0KLQkgIGlmICggICBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItbGl0dGxlYXJtLW9hYmkiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3RhcmdldCAoaW5wdXRfYmZkKSwgImVsZjMyLWJpZ2FybS1vYWJpIikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBvbGQgd2F5IG9mIGRvaW5nIHRoaW5ncy4gIFRyZWFyaW5nIHRoZSBhZGRlbmQgYXMgYQotCQkgYnl0ZSBzaXplZCBmaWVsZCBhbmQgYWRkaW5nIGluIHRoZSBwaXBlbGluZSBvZmZzZXQuICAqLwotCi0JICAgICAgdmFsdWUgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgICAgdmFsdWUgLT0gcmVsLT5yX29mZnNldDsKLQkgICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXZhbHVlIC09IDg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoZSBBUk0gRUxGIEFCSSBzYXlzIHRoYXQgdGhpcyByZWxvYyBpcyBjb21wdXRlZCBhczogUyAtIFAgKyBBCi0JCSB3aGVyZToKLQkJICBTIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgaW4gdGhlIHJlbG9jYXRpb24uCi0JCSAgUCBpcyBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiBiZWluZyByZWxvY2F0ZWQuCi0JCSAgQSBpcyB0aGUgYWRkZW5kIChleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24pIGluIGJ5dGVzLgotCi0JCSBTIGlzIGhlbGQgaW4gJ3ZhbHVlJy4KLQkJIFAgaXMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBpbnN0cnVjdGlvbgotCQkgICBwbHVzIHRoZSBvZmZzZXQgb2YgdGhlIHJlbG9jIGludG8gdGhhdCBzZWN0aW9uLCBpZToKLQkJICAgICAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCQkgICAgICByZWwtPnJfb2Zmc2V0KS4KLQkJIEEgaXMgdGhlIGFkZGVuZCwgY29udmVydGVkIGludG8gYnl0ZXMsIGllOgotCQkgICAgIChzaWduZWRfYWRkZW5kICogNCkKLQotCQkgTm90ZTogTm9uZSBvZiB0aGVzZSBvcGVyYXRpb25zIGhhdmUga25vd2xlZGdlIG9mIHRoZSBwaXBlbGluZQotCQkgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yLCB0aHVzIGl0IGlzIHVwIHRvIHRoZSBhc3NlbWJsZXIgdG8gZW5jb2RlCi0JCSB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGFkZGVuZC4gICovCi0KLQkgICAgICB2YWx1ZSAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB2YWx1ZSAtPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIHZhbHVlICs9IChzaWduZWRfYWRkZW5kIDw8IGhvd3RvLT5zaXplKTsKLQotCSAgICAgIC8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSBhbHNvIHVzZWQgdG8gYWRkIGluIHRoZSBwaXBlbGluZQotCQkgb2Zmc2V0IGhlcmUuICBUaGlzIGlzIHdyb25nIGJlY2F1c2UgdGhlIGxpbmtlciBpcyBub3Qgc3VwcG9zZWQKLQkJIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIGFuZCBvbmUgZGF5IGl0IG1pZ2h0IGNoYW5nZS4gIEluIG9yZGVyCi0JCSB0byBzdXBwb3J0IG9sZCBiaW5hcmllcyB0aGF0IG5lZWQgdGhlIG9sZCBiZWhhdmlvdXIgaG93ZXZlciwgc28KLQkJIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHdoaWNoIEFCSSB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoISBnbG9iYWxzLT5ub19waXBlbGluZV9rbm93bGVkZ2UpCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfRWhkciAqIGlfZWhkcnA7IC8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotCi0JCSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCk7Ci0KLQkJICBpZiAoaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gMCkKLQkJICAgIHZhbHVlIC09IDg7Ci0JCX0KLQkgICAgfQotCSAgCi0JICB2YWx1ZSA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0JICB2YWx1ZSAmPSBob3d0by0+ZHN0X21hc2s7Ci0JICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAofiBob3d0by0+ZHN0X21hc2spKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9BQlMzMjoKLQkgIHZhbHVlICs9IGFkZGVuZDsKLQkgIGlmIChzeW1fZmxhZ3MgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgdmFsdWUgfD0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0FSTV9SRUwzMjoKLQkgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgdmFsdWUgKz0gYWRkZW5kOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlM4OgotICAgICAgdmFsdWUgKz0gYWRkZW5kOwotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2YgfHwgKGxvbmcpIHZhbHVlIDwgLTB4ODApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgYmZkX3B1dF84IChpbnB1dF9iZmQsIHZhbHVlLCBoaXRfZGF0YSk7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9BQlMxNjoKLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmZiB8fCAobG9uZykgdmFsdWUgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX0FCUzEyOgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbiBmb3IgdGhlIGFybSAqLwotICAgICAgLyogQWxzbyB0aHVtYiBiICh1bmNvbmRpdGlvbmFsIGJyYW5jaCkuICA/Pz8gUmVhbGx5PyAgKi8KLSAgICAgIHZhbHVlICs9IGFkZGVuZDsKLQotICAgICAgaWYgKChsb25nKSB2YWx1ZSA+IDB4N2ZmIHx8IChsb25nKSB2YWx1ZSA8IC0weDgwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICB2YWx1ZSB8PSAoYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBoaXRfZGF0YSkgJiAweGZmZmZmMDAwKTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsdWUsIGhpdF9kYXRhKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfQVJNX1RITV9BQlM1OgotICAgICAgLyogU3VwcG9ydCBsZHIgYW5kIHN0ciBpbnN0cnVjdGlvbnMgZm9yIHRoZSB0aHVtYi4gKi8KLSNpZmRlZiBVU0VfUkVMCi0gICAgICAvKiBOZWVkIHRvIHJlZmV0Y2ggYWRkZW5kLiAgKi8KLSAgICAgIGFkZGVuZCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgaG93dG8tPnNyY19tYXNrOwotICAgICAgLyogPz8/IE5lZWQgdG8gZGV0ZXJtaW5lIHNoaWZ0IGFtb3VudCBmcm9tIG9wZXJhbmQgc2l6ZS4gICovCi0gICAgICBhZGRlbmQgPj49IGhvd3RvLT5yaWdodHNoaWZ0OwotI2VuZGlmCi0gICAgICB2YWx1ZSArPSBhZGRlbmQ7Ci0KLSAgICAgIC8qID8/PyBJc24ndCB2YWx1ZSB1bnNpZ25lZD8gICovCi0gICAgICBpZiAoKGxvbmcpIHZhbHVlID4gMHgxZiB8fCAobG9uZykgdmFsdWUgPCAtMHgxMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gICAgICAvKiA/Pz8gVmFsdWUgbmVlZHMgdG8gYmUgcHJvcGVybHkgc2hpZnRlZCBpbnRvIHBsYWNlIGZpcnN0LiAgKi8KLSAgICAgIHZhbHVlIHw9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEpICYgMHhmODNmOwotICAgICAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCB2YWx1ZSwgaGl0X2RhdGEpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGNhc2UgUl9BUk1fVEhNX1BDMjI6Ci0gICAgICAvKiBUaHVtYiBCTCAoYnJhbmNoIGxvbmcgaW5zdHJ1Y3Rpb24pLiAqLwotICAgICAgewotCWJmZF92bWEgICAgICAgIHJlbG9jYXRpb247Ci0JYm9vbGVhbiAgICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLQliZmRfdm1hICAgICAgICB1cHBlcl9pbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBoaXRfZGF0YSk7Ci0JYmZkX3ZtYSAgICAgICAgbG93ZXJfaW5zbiA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyAyKTsKLQliZmRfdm1hICAgICAgICBzcmNfbWFzayA9IDB4MDA3RkZGRkU7Ci0JYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSAtIDEpKSAtIDE7Ci0JYmZkX3NpZ25lZF92bWEgcmVsb2Nfc2lnbmVkX21pbiA9IH4gcmVsb2Nfc2lnbmVkX21heDsKLQliZmRfdm1hICAgICAgICBjaGVjazsKLQliZmRfc2lnbmVkX3ZtYSBzaWduZWRfY2hlY2s7Ci0KLSNpZmRlZiBVU0VfUkVMCi0JLyogTmVlZCB0byByZWZldGNoIHRoZSBhZGRlbmQgYW5kIHNxdWlzaCB0aGUgdHdvIDExIGJpdCBwaWVjZXMKLQkgICB0b2dldGhlci4gICovCi0JewotCSAgYmZkX3ZtYSB1cHBlciA9IHVwcGVyX2luc24gJiAweDdmZjsKLQkgIGJmZF92bWEgbG93ZXIgPSBsb3dlcl9pbnNuICYgMHg3ZmY7Ci0JICB1cHBlciA9ICh1cHBlciBeIDB4NDAwKSAtIDB4NDAwOyAvKiBzaWduIGV4dGVuZCAqLwotCSAgYWRkZW5kID0gKHVwcGVyIDw8IDEyKSB8IChsb3dlciA8PCAxKTsKLQkgIHNpZ25lZF9hZGRlbmQgPSBhZGRlbmQ7Ci0JfQotI2VuZGlmCi0KLSAgICAgICAgLyogSWYgaXQncyBub3QgYSBjYWxsIHRvIHRodW1iLCBhc3N1bWUgY2FsbCB0byBhcm0gKi8KLQlpZiAoc3ltX2ZsYWdzICE9IFNUVF9BUk1fVEZVTkMpCi0JICB7Ci0JICAgIGlmIChlbGYzMl90aHVtYl90b19hcm1fc3R1YgotCQkoaW5mbywgc3ltX25hbWUsIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJIGhpdF9kYXRhLCBzeW1fc2VjLCByZWwtPnJfb2Zmc2V0LCBhZGRlbmQsIHZhbHVlKSkKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCSAgICBlbHNlCi0JICAgICAgcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0JICB9Ci0KLQlyZWxvY2F0aW9uID0gdmFsdWUgKyBzaWduZWRfYWRkZW5kOwotCi0JcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIHJlbC0+cl9vZmZzZXQpOwotCQotCWlmICghIGdsb2JhbHMtPm5vX3BpcGVsaW5lX2tub3dsZWRnZSkKLQkgIHsKLQkgICAgRWxmX0ludGVybmFsX0VoZHIgKiBpX2VoZHJwOyAvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLQkgICAgCi0JICAgIGlfZWhkcnAgPSBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpOwotCi0JICAgIC8qIFByZXZpb3VzIHZlcnNpb25zIG9mIHRoaXMgY29kZSBhbHNvIHVzZWQgdG8gYWRkIGluIHRoZSBwaXBsaW5lCi0JICAgICAgIG9mZnNldCBoZXJlLiAgVGhpcyBpcyB3cm9uZyBiZWNhdXNlIHRoZSBsaW5rZXIgaXMgbm90IHN1cHBvc2VkCi0JICAgICAgIHRvIGtub3cgYWJvdXQgc3VjaCB0aGluZ3MsIGFuZCBvbmUgZGF5IGl0IG1pZ2h0IGNoYW5nZS4gIEluIG9yZGVyCi0JICAgICAgIHRvIHN1cHBvcnQgb2xkIGJpbmFyaWVzIHRoYXQgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciBob3dldmVyLCBzbwotCSAgICAgICB3ZSBhdHRlbXB0IHRvIGRldGVjdCB3aGljaCBBQkkgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSByZWxvYy4gICovCi0JICAgIGlmICggICBzdHJjbXAgKGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCAiZWxmMzItbGl0dGxlYXJtLW9hYmkiKSA9PSAwCi0JCXx8IHN0cmNtcCAoYmZkX2dldF90YXJnZXQgKGlucHV0X2JmZCksICJlbGYzMi1iaWdhcm0tb2FiaSIpID09IDAKLQkJfHwgaV9laGRycC0+ZV9pZGVudFtFSV9PU0FCSV0gPT0gMCkKLQkgICAgICByZWxvY2F0aW9uICs9IDQ7Ci0JICB9Ci0KLQljaGVjayA9IHJlbG9jYXRpb24gPj4gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLQkvKiBJZiB0aGlzIGlzIGEgc2lnbmVkIHZhbHVlLCB0aGUgcmlnaHRzaGlmdCBqdXN0IGRyb3BwZWQKLQkgICBsZWFkaW5nIDEgYml0cyAoYXNzdW1pbmcgdHdvcyBjb21wbGVtZW50KS4gICovCi0JaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+PSAwKQotCSAgc2lnbmVkX2NoZWNrID0gY2hlY2s7Ci0JZWxzZQotCSAgc2lnbmVkX2NoZWNrID0gY2hlY2sgfCB+KChiZmRfdm1hKSAtMSA+PiBob3d0by0+cmlnaHRzaGlmdCk7Ci0KLQkvKiBBc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQuICAqLwotCWlmIChzaWduZWRfY2hlY2sgPiByZWxvY19zaWduZWRfbWF4IHx8IHNpZ25lZF9jaGVjayA8IHJlbG9jX3NpZ25lZF9taW4pCi0JICBvdmVyZmxvdyA9IHRydWU7Ci0KLQkvKiBQdXQgUkVMT0NBVElPTiBiYWNrIGludG8gdGhlIGluc24uICAqLwotCXVwcGVyX2luc24gPSAodXBwZXJfaW5zbiAmIH4oYmZkX3ZtYSkgMHg3ZmYpIHwgKChyZWxvY2F0aW9uID4+IDEyKSAmIDB4N2ZmKTsKLQlsb3dlcl9pbnNuID0gKGxvd2VyX2luc24gJiB+KGJmZF92bWEpIDB4N2ZmKSB8ICgocmVsb2NhdGlvbiA+PiAxKSAmIDB4N2ZmKTsKLQotCS8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlOiAgKi8KLQliZmRfcHV0XzE2IChpbnB1dF9iZmQsIHVwcGVyX2luc24sIGhpdF9kYXRhKTsKLQliZmRfcHV0XzE2IChpbnB1dF9iZmQsIGxvd2VyX2luc24sIGhpdF9kYXRhICsgMik7Ci0KLQlyZXR1cm4gKG92ZXJmbG93ID8gYmZkX3JlbG9jX292ZXJmbG93IDogYmZkX3JlbG9jX29rKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0FSTV9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgY2FzZSBSX0FSTV9DT1BZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX0dMT0JfREFUOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX0pVTVBfU0xPVDoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SRUxBVElWRToKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9HT1RPRkY6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICAgIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgICAKLSAgICAgIC8qIE5vdGUgdGhhdCBzZ290LT5vdXRwdXRfb2Zmc2V0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGlzCi0gICAgICAgICBjYWxjdWxhdGlvbi4gIFdlIGFsd2F5cyB3YW50IHRoZSBzdGFydCBvZiAuZ290LiAgSWYgd2UKLSAgICAgICAgIGRlZmluZSBfR0xPQkFMX09GRlNFVF9UQUJMRSBpbiBhIGRpZmZlcmVudCB3YXksIGFzIGlzCi0gICAgICAgICBwZXJtaXR0ZWQgYnkgdGhlIEFCSSwgd2UgbWlnaHQgaGF2ZSB0byBjaGFuZ2UgdGhpcwotICAgICAgICAgY2FsY3VsYXRpb24uICovCi0KLSAgICAgIHZhbHVlIC09IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fR09UUEM6Ci0gICAgICAvKiBVc2UgZ2xvYmFsIG9mZnNldCB0YWJsZSBhcyBzeW1ib2wgdmFsdWUuICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0KLSAgICAgIGlmIChzZ290ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fR09UMzI6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAqLwotICAgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQlyZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQl7Ci0JICBiZmRfdm1hIG9mZjsKLQotCSAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICBpZiAoIWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkIHx8Ci0JICAgICAgKGluZm8tPnNoYXJlZCAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYyBsaW5rCi0JCSBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGxvY2FsbHkuICBXZSBtdXN0IGluaXRpYWxpemUgdGhpcwotCQkgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QKLQkJIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0Ci0JCSB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlIGluaXRpYWxpemVkIGl0IGFscmVhZHkuCi0KLQkJIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290IHJlbG9jYXRpb24KLQkJIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcyBpcyBkb25lIGluIHRoZQotCQkgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICovCi0KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWx1ZSwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCQkgIGgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJfQotCSAgICB9Ci0KLQkgIHZhbHVlID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSBvZmY7Ci0KLQkgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwgJiYKLQkJICAgICAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQotCSAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UgdGhlCi0JICAgICBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5Ci0JICAgICBnZW5lcmF0ZWQgdGhlIG5lY2Vzc2FyeSByZWxvYy4gKi8KLQkgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkgICAgb2ZmICY9IH4xOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgdmFsdWUsIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICBhc2VjdGlvbiAqIHNyZWxnb3Q7Ci0JCSAgRWxmX0ludGVybmFsX1JlbCBvdXRyZWw7Ci0KLQkJICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICsgb2ZmKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0JCSAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCSAgICAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkgICAgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQl9Ci0KLQkgICAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkgICAgfQotCi0JICB2YWx1ZSA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JfQotICAgICAgCi0gICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgCQkJCSAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0gICAgICAJCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fUExUMzI6Ci0gICAgICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSAgICAgIC8qIFJlc29sdmUgYSBQTFQzMiByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAotICAgICAgICAgd2l0aG91dCB1c2luZyB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotICAgICAgICAJCQkJIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLSAgICAgICAgCQkJCSAoYmZkX3ZtYSkgMCk7Ci0KLSAgICAgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLSAgICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotICAgICAgICAgICBoYXBwZW5zIHdoZW4gc3RhdGljYWxseSBsaW5raW5nIFBJQyBjb2RlLCBvciB3aGVuCi0gICAgICAgICAgIHVzaW5nIC1Cc3ltYm9saWMuICAqLwotCXJldHVybiBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSBjb250ZW50cywgcmVsLT5yX29mZnNldCwgdmFsdWUsCi0JCQkJCSAoYmZkX3ZtYSkgMCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQoc3BsdCAhPSBOVUxMKTsKLSAgICAgIGlmIChzcGx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICB2YWx1ZSA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCSAgICAgICArIGgtPnBsdC5vZmZzZXQpOwotICAgICAgcmV0dXJuIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLSAgICAgICAgCQkJICAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCB2YWx1ZSwKLSAgICAgICAgCQkJICAgICAgIChiZmRfdm1hKSAwKTsKLQotICAgIGNhc2UgUl9BUk1fU0JSRUwzMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9BTVBfVkNBTEw5OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JTQlJFTDMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1RITV9SUEMyMjoKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgY2FzZSBSX0FSTV9SUkVMMzI6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQotICAgIGNhc2UgUl9BUk1fUkFCUzMyOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JQQzI0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBjYXNlIFJfQVJNX1JCQVNFOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci0gICAgfQotfQotCi0KLS8qIFJlbG9jYXRlIGFuIEFSTSBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqICAgICAgICAgICAgbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kOwotICBjb25zdCBjaGFyICogICAgICAgICAgICAgICAgICBuYW1lOwotCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOwotICAgICAgYXJlbGVudCAgICAgICAgICAgICAgICAgICAgICBiZmRfcmVsb2M7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIHJfdHlwZSAgID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmICggICByX3R5cGUgPT0gUl9BUk1fR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9BUk1fR05VX1ZUSU5IRVJJVCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGVsZjMyX2FybV9pbmZvX3RvX2hvd3RvIChpbnB1dF9iZmQsICYgYmZkX3JlbG9jLCByZWwpOwotICAgICAgaG93dG8gPSBiZmRfcmVsb2MuaG93dG87Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotI2lmZGVmIFVTRV9SRUwKLQkJICB7Ci0JCSAgICBiZmRfdm1hIHZhbDsKLQkJICAgIGJmZF92bWEgaW5zbjsKLQotCQkgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJICAgIHZhbCA9IGluc24gKyAoKHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWUpCi0JCQkJICA+PiBob3d0by0+cmlnaHRzaGlmdCk7Ci0JCSAgICB2YWwgJj0gaG93dG8tPmRzdF9tYXNrOwotCQkgICAgdmFsIHw9IGluc24gJiB+KGhvd3RvLT5kc3RfbWFzayk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIH0KLSNlbHNlCi0JCSAgcmVsLT5yX2FkZGVuZCArPSAoc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZSkKLQkJICAgID4+IGhvd3RvLT5yaWdodHNoaWZ0OwotI2VuZGlmCi0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgaW50IHJlbG9jYXRpb25fbmVlZGVkID0gMTsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICAgIC8qIEluIHRoZXNlIGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRoZSByZWxvY2F0aW9uIHZhbHVlLgotCSAgICAgICAgIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUgb2JzY3VyZSBjYXNlcwotCSAgICAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAqLwotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JICAgICAgICBjYXNlIFJfQVJNX1BDMjQ6Ci0JICAgICAgICBjYXNlIFJfQVJNX0FCUzMyOgotCSAgICAgICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgICAgICAgICAmJiAoCi0JICAgICAgICAgICAgICAJICAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JICAgICAgICAgICAgICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0JCQkgICkKLQkgICAgICAgICAgICAgICYmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCSAgICAgICkKLQkgICAgICAgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkgICAgICAgIGNhc2UgUl9BUk1fR09UUEM6Ci0JICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgY2FzZSBSX0FSTV9HT1QzMjoKLQkgICAgICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgICAgICAgICAgICAgICYmICghaW5mby0+c2hhcmVkCi0JICAgICAgICAgICAgICAgICAgfHwgKCFpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCSAgICAgICAgICAgICAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCQkJICApCi0JCSAgICAgICkKLQkgICAgICAgICAgICByZWxvY2F0aW9uX25lZWRlZCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkgICAgICAgIGNhc2UgUl9BUk1fUExUMzI6Ci0JICAgICAgICAgIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKS0xKQotCSAgICAgICAgICAgIHJlbG9jYXRpb25fbmVlZGVkID0gMDsKLQkJICBicmVhazsKLQotCSAgICAgICAgZGVmYXVsdDoKLQkJICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pKTsKLQkJICAgICAgcmVsb2NhdGlvbl9uZWVkZWQgPSAwOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAocmVsb2NhdGlvbl9uZWVkZWQpCi0JCXJlbG9jYXRpb24gPSBoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHNlYy0+b3V0cHV0X29mZnNldDsKLQkgICAgICBlbHNlCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaCAhPSBOVUxMKQotCW5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSkpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCSAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCX0KLQotICAgICAgciA9IGVsZjMyX2FybV9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIHJlbCwKLQkJCQkJIHJlbG9jYXRpb24sIGluZm8sIHNlYywgbmFtZSwKLQkJCQkJIChoID8gRUxGX1NUX1RZUEUgKGgtPnR5cGUpIDoKLQkJCQkJICBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSksIGgpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIDA7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBBUk0gc3BlY2lmaWMgZmxhZ3MgaW4gdGhlIEVMRiBoZWFkZXIuICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgaWYgKGVsZl9mbGFnc19pbml0IChhYmZkKQotICAgICAgJiYgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgIT0gZmxhZ3MpCi0gICAgewotICAgICAgaWYgKGZsYWdzICYgRUZfSU5URVJXT1JLKQotCV9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLVdhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29yayBmbGFnIG9mICVzIHNpbmNlIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIGFzIG5vbi1pbnRlcndvcmtpbmciKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29yayBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiKSwKLQkJCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgICAgIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb3V0X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKGVsZl9mbGFnc19pbml0IChvYmZkKSAmJiBpbl9mbGFncyAhPSBvdXRfZmxhZ3MpCi0gICAgewotICAgICAgLyogQ2Fubm90IG1peCBQSUMgYW5kIG5vbi1QSUMgY29kZS4gICovCi0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfUElDKSAhPSAob3V0X2ZsYWdzICYgRUZfUElDKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIENhbm5vdCBtaXggQVBDUzI2IGFuZCBBUENTMzIgY29kZS4gICovCi0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfQVBDU18yNikgIT0gKG91dF9mbGFncyAmIEVGX0FQQ1NfMjYpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQ2Fubm90IG1peCBmbG9hdCBBUENTIGFuZCBub24tZmxvYXQgQVBDUyBjb2RlLiAgKi8KLSAgICAgIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU19GTE9BVCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGUgc3JjIGFuZCBkZXN0IGhhdmUgZGlmZmVyZW50IGludGVyd29ya2luZyBmbGFncwotICAgICAgICAgdGhlbiB0dXJuIG9mZiB0aGUgaW50ZXJ3b3JraW5nIGJpdC4gICovCi0gICAgICBpZiAoKGluX2ZsYWdzICYgRUZfSU5URVJXT1JLKSAhPSAob3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLKSkKLQl7Ci0JICBpZiAob3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLKQotCSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1XYXJuaW5nOiBDbGVhcmluZyB0aGUgaW50ZXJ3b3JrIGZsYWcgaW4gJXMgYmVjYXVzZSBub24taW50ZXJ3b3JraW5nIGNvZGUgaW4gJXMgaGFzIGJlZW4gbGlua2VkIHdpdGggaXQiKSwKLQkJCSAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotCSAgaW5fZmxhZ3MgJj0gfkVGX0lOVEVSV09SSzsKLQl9Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gaW5fZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoICAgaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTgotICAgICAgJiYgaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0JIGJmZF9iaWdfZW5kaWFuIChvYmZkKSA/ICJiaWciIDogImxpdHRsZSIpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGlucHV0IEJGRCBtdXN0IGhhdmUgaGFkIGl0cyBmbGFncyBpbml0aWFsaXNlZC4gICovCi0gIC8qIFRoZSBmb2xsb3dpbmcgc2VlbXMgYm9ndXMgdG8gbWUgLS0gVGhlIGZsYWdzIGFyZSBpbml0aWFsaXplZCBpbgotICAgICB0aGUgYXNzZW1ibGVyIGJ1dCBJIGRvbid0IHRoaW5rIGFuIGVsZl9mbGFnc19pbml0IGZpZWxkIGlzCi0gICAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0ICovCi0gIC8qIEJGRF9BU1NFUlQgKGVsZl9mbGFnc19pbml0IChpYmZkKSk7ICovCi0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIC8qIElmIHRoZSBpbnB1dCBpcyB0aGUgZGVmYXVsdCBhcmNoaXRlY3R1cmUgdGhlbiBkbyBub3QKLSAgICAgICAgIGJvdGhlciBzZXR0aW5nIHRoZSBmbGFncyBmb3IgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUsCi0gICAgICAgICBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotICAgICAgICAgbWVyZ2VzIGV2ZXIgc2V0IHRoZXNlIGZsYWdzIHRoZW4gdGhleSB3aWxsIHJldGFpbiB0aGVpcgotICAgICAgICAgdW5pdGlhbGlzZWQgdmFsdWVzLCB3aGljaCBzdXJwcmlzZSBzdXJwcmlzZSwgY29ycmVzcG9uZAotICAgICAgICAgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQlyZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLSAgaWYgKGluX2ZsYWdzID09IG91dF9mbGFncykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBDb21wbGFpbiBhYm91dCB2YXJpb3VzIGZsYWcgbWlzbWF0Y2hlcy4gICovCi0KLSAgaWYgKChpbl9mbGFncyAmIEVGX0FQQ1NfMjYpICE9IChvdXRfZmxhZ3MgJiBFRl9BUENTXzI2KSkKLSAgICBfYmZkX2Vycm9yX2hhbmRsZXIgKF8gKCJcCi1FcnJvcjogJXMgY29tcGlsZWQgZm9yIEFQQ1MtJWQsIHdoZXJlYXMgJXMgaXMgY29tcGlsZWQgZm9yIEFQQ1MtJWQiKSwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCQkJaW5fZmxhZ3MgJiBFRl9BUENTXzI2ID8gMjYgOiAzMiwKLQkJCWJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkJb3V0X2ZsYWdzICYgRUZfQVBDU18yNiA/IDI2IDogMzIpOwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKSAhPSAob3V0X2ZsYWdzICYgRUZfQVBDU19GTE9BVCkpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotRXJyb3I6ICVzIHBhc3NlcyBmbG9hdHMgaW4gJXMgcmVnaXN0ZXJzLCB3aGVyZWFzICVzIHBhc3NlcyB0aGVtIGluICVzIHJlZ2lzdGVycyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCSAgICAgaW5fZmxhZ3MgJiBFRl9BUENTX0ZMT0FUID8gXyAoImZsb2F0IikgOiBfICgiaW50ZWdlciIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgIG91dF9mbGFncyAmIEVGX0FQQ1NfMjYgPyBfICgiZmxvYXQiKSA6IF8gKCJpbnRlZ2VyIikpOwotCi0gIGlmICgoaW5fZmxhZ3MgJiBFRl9QSUMpICE9IChvdXRfZmxhZ3MgJiBFRl9QSUMpKQotICAgIF9iZmRfZXJyb3JfaGFuZGxlciAoXyAoIlwKLUVycm9yOiAlcyBpcyBjb21waWxlZCBhcyBwb3NpdGlvbiAlcyBjb2RlLCB3aGVyZWFzICVzIGlzIG5vdCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JCSAgICBpbl9mbGFncyAmIEVGX1BJQyA/IF8gKCJpbmRlcGVuZGVudCIpIDogXyAoImRlcGVuZGVudCIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIC8qIEludGVyd29ya2luZyBtaXNtYXRjaCBpcyBvbmx5IGEgd2FybmluZy4gKi8KLSAgaWYgKChpbl9mbGFncyAmIEVGX0lOVEVSV09SSykgIT0gKG91dF9mbGFncyAmIEVGX0lOVEVSV09SSykpCi0gICAgewotICAgICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfICgiXAotV2FybmluZzogJXMgJXMgaW50ZXJ3b3JraW5nLCB3aGVyZWFzICVzICVzIiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgaW5fZmxhZ3MgJiBFRl9JTlRFUldPUksgPyBfICgic3VwcG9ydHMiKSA6IF8gKCJkb2VzIG5vdCBzdXBwb3J0IiksCi0JCQkgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLAotCQkgICAgb3V0X2ZsYWdzICYgRUZfSU5URVJXT1JLID8gXyAoImRvZXMgbm90IikgOiBfICgiZG9lcyIpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIERpc3BsYXkgdGhlIGZsYWdzIGZpZWxkICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgcHRyOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0KLSAgLyogUHJpbnQgbm9ybWFsIEVMRiBwcml2YXRlIGRhdGEuICAqLwotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotCi0gIC8qIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLiAgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0lOVEVSV09SSykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtpbnRlcndvcmtpbmcgZW5hYmxlZF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtpbnRlcndvcmtpbmcgbm90IGVuYWJsZWRdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0FQQ1NfMjYpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbQVBDUy0yNl0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtBUENTLTMyXSIpKTsKLQotICBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9BUENTX0ZMT0FUKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2Zsb2F0cyBwYXNzZWQgaW4gZmxvYXQgcmVnaXN0ZXJzXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2Zsb2F0cyBwYXNzZWQgaW4gaW50ZWdlciByZWdpc3RlcnNdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1BJQykKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtwb3NpdGlvbiBpbmRlcGVuZGVudF0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYnNvbHV0ZSBwb3NpdGlvbl0iKSk7Ci0KLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50Ci1lbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlIChlbGZfc3ltLCB0eXBlKQotICAgICBFbGZfSW50ZXJuYWxfU3ltICogZWxmX3N5bTsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGlmIChFTEZfU1RfVFlQRSAoZWxmX3N5bS0+c3RfaW5mbykgPT0gU1RUX0FSTV9URlVOQykKLSAgICByZXR1cm4gRUxGX1NUX1RZUEUgKGVsZl9zeW0tPnN0X2luZm8pOwotICBlbHNlCi0gICAgcmV0dXJuIHR5cGU7Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9hcm1fZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9BUk1fR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9BUk1fR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qIFdlIGRvbid0IHN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIEdPVCBhbmQgUExUIHJlbG9jcyB5ZXQuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICBpbmZvOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogIHJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiAgICAgICAgICAgc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiogc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsX2VuZDsKLSAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICAgZHlub2JqOwotICBhc2VjdGlvbiAqIHNnb3QsICpzcmVsZ290LCAqc3JlbG9jOwotICBiZmRfdm1hICogbG9jYWxfZ290X29mZnNldHM7Ci0gIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotICAKLSAgc2dvdCA9IHNyZWxnb3QgPSBzcmVsb2MgPSBOVUxMOwotICAKLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gICAgICAKLSAgICAgIC8qIFNvbWUgcmVsb2NzIHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQl7Ci0JICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgUl9BUk1fR09UMzI6Ci0JICAgIGNhc2UgUl9BUk1fR09UT0ZGOgotCSAgICBjYXNlIFJfQVJNX0dPVFBDOgotCSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0JICBjYXNlIFJfQVJNX0dPVDMyOgotCSAgICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCSAgICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICAgIHsKLQkgICAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgICB9Ci0KLQkgICAgLyogR2V0IHRoZSBnb3QgcmVsb2NhdGlvbiBzZWN0aW9uIGlmIG5lY2Vzc2FyeS4gICovCi0JICAgIGlmIChzcmVsZ290ID09IE5VTEwKLQkgICAgICAgICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgICB7Ci0JICAgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCQotCSAgICAgICAgLyogSWYgbm8gZ290IHJlbG9jYXRpb24gc2VjdGlvbiwgbWFrZSBvbmUgYW5kIGluaXRpYWxpemUuICAqLwotCSAgICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJICAgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkgIAkJCQkgICAgKFNFQ19BTExPQwotCQkJCQkJICAgICB8IFNFQ19MT0FECi0JCQkJCQkgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKGggIT0gTlVMTCkKLQkgICAgICB7Ci0JICAgICAgICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0KLQkgICAgICAgIGgtPmdvdC5vZmZzZXQgPSBzZ290LT5fcmF3X3NpemU7Ci0KLQkgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLSAgICAgCSAgICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCSAgewotCQkgICAgc2l6ZV90IHNpemU7Ci0JCSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLQotCQkgICAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgICAgbG9jYWxfZ290X29mZnNldHMgPSAoYmZkX3ZtYSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCkgPSBsb2NhbF9nb3Rfb2Zmc2V0czsKLQkJICAgIGZvciAoaSA9IDA7IGkgPCBzeW10YWJfaGRyLT5zaF9pbmZvOyBpKyspCi0JCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQkgIH0KLQotCSAgICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0KLQkgICAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLQkJICAgICBvdXRwdXQgYSBSX0FSTV9SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZSBkeW5hbWljCi0JCSAgICAgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgICAgfQotCi0JICAgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCSAgICBicmVhazsKLQotICAJICBjYXNlIFJfQVJNX1BMVDMyOgotCSAgICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2hpY2ggaXMKLSAgICAgICAgICAgICAgIG5ldmVyIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgaW4gd2hpY2ggY2FzZSB3ZQotICAgICAgICAgICAgICAgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5Ci0gICAgICAgICAgICAgICBhZnRlciBhbGwuICAqLwotCi0JICAgIC8qIElmIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wsIHdlIHJlc29sdmUgaXQgZGlyZWN0bHkgd2l0aG91dAotICAgICAgICAgICAgICAgY3JlYXRpbmcgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0JICAgIGlmIChoID09IE5VTEwpCi0JICAgICAgY29udGludWU7Ci0KLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgUl9BUk1fQUJTMzI6Ci0JICBjYXNlIFJfQVJNX1JFTDMyOgotCSAgY2FzZSBSX0FSTV9QQzI0OgotCSAgICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgaXMgYSByZWxvYwotICAgICAgICAgICAgICAgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIG9yIGEgbm9uIFBDIHJlbGF0aXZlIHJlbG9jCi0gICAgICAgICAgICAgICBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sLCB0aGVuIHdlIG5lZWQgdG8gY29weSB0aGUgcmVsb2MKLSAgICAgICAgICAgICAgIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgSG93ZXZlciwgaWYgd2UgYXJlIGxpbmtpbmcgd2l0aAotICAgICAgICAgICAgICAgLUJzeW1ib2xpYywgd2UgZG8gbm90IG5lZWQgdG8gY29weSBhIHJlbG9jIGFnYWluc3QgYQotICAgICAgICAgICAgICAgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkIGluIGFuIG9iamVjdCB3ZSBhcmUKLSAgICAgICAgICAgICAgIGluY2x1ZGluZyBpbiB0aGUgbGluayAoaS5lLiwgREVGX1JFR1VMQVIgaXMgc2V0KS4gIEF0Ci0gICAgICAgICAgICAgICB0aGlzIHBvaW50IHdlIGhhdmUgbm90IHNlZW4gYWxsIHRoZSBpbnB1dCBmaWxlcywgc28gaXQgaXMKLSAgICAgICAgICAgICAgIHBvc3NpYmxlIHRoYXQgREVGX1JFR1VMQVIgaXMgbm90IHNldCBub3cgYnV0IHdpbGwgYmUgc2V0Ci0gICAgICAgICAgICAgICBsYXRlciAoaXQgaXMgbmV2ZXIgY2xlYXJlZCkuICBXZSBhY2NvdW50IGZvciB0aGF0Ci0gICAgICAgICAgICAgICBwb3NzaWJpbGl0eSBiZWxvdyBieSBzdG9yaW5nIGluZm9ybWF0aW9uIGluIHRoZQotICAgICAgICAgICAgICAgcGNyZWxfcmVsb2NzX2NvcGllZCBmaWVsZCBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0JICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgIT0gUl9BUk1fUEMyNAotCSAgICAgICAgfHwgKGggIT0gTlVMTAotCQkgICYmICghIGluZm8tPnN5bWJvbGljCi0JCSAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JICAgICAgewotCSAgICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotICAgICAgICAgICAgICAgICAgIHJlbG9jIHR5cGVzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGluIGR5bm9iaiBhbmQgbWFrZSByb29tIGZvciB0aGlzIHJlbG9jLiAgKi8KLQkgICAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICogbmFtZTsKLQotCQkgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgICAgKGFiZmQsCi0JCQkgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwCi0JCSAJICAgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLAotCQkJCQkgICBuYW1lICsgNCkgPT0gMCk7Ci0KLQkJICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQkgICAgICB7Ci0JCSAgICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIG5hbWUpOwotCQkgICAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgICAgaWYgKChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkJICBmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkJICAgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsIGZsYWdzKQotCQkJICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQotCQkJICByZXR1cm4gZmFsc2U7Ci0JCSAgICAgIH0KLQkJICB9Ci0KLQkgICAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICAgICAgIC8qIElmIHdlIGFyZSBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgYW5kIHRoaXMgaXMgYQotICAgICAgICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgUEMgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9ucyB3ZSBoYXZlIGVudGVyZWQgZm9yIHRoaXMgc3ltYm9sLCBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgd2UgY2FuIGRpc2NhcmQgdGhlbSBhZ2FpbiBpZiB0aGUgc3ltYm9sIGlzIGxhdGVyCi0gICAgICAgICAgICAgICAgICAgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24KLSAgICAgICAgICAgICAgICAgICBpcyBvbmx5IGNhbGxlZCBpZiB3ZSBhcmUgdXNpbmcgYW4gZWxmX2kzODYgbGlua2VyCi0gICAgICAgICAgICAgICAgICAgaGFzaCB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8KLSAgICAgICAgICAgICAgICAgICBhbiBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkuICAqLwotCSAgICAgICAgaWYgKGggIT0gTlVMTCAmJiBpbmZvLT5zeW1ib2xpYwotCQkgICAgJiYgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl9BUk1fUEMyNCkKLQkJICB7Ci0JCSAgICBzdHJ1Y3QgZWxmMzJfYXJtX2xpbmtfaGFzaF9lbnRyeSAqIGVoOwotCQkgICAgc3RydWN0IGVsZjMyX2FybV9wY3JlbF9yZWxvY3NfY29waWVkICogcDsKLQotCQkgICAgZWggPSAoc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCQkgICAgZm9yIChwID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JCSAgICAgIGlmIChwLT5zZWN0aW9uID09IHNyZWxvYykKLQkJICAgICAgICBicmVhazsKLQotCQkgICAgaWYgKHAgPT0gTlVMTCkKLQkJICAgICAgewotCQkgICAgICAgIHAgPSAoKHN0cnVjdCBlbGYzMl9hcm1fcGNyZWxfcmVsb2NzX2NvcGllZCAqKQotCQkJICAgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICogcCkpOwotCi0JCSAgICAgICAgaWYgKHAgPT0gTlVMTCkKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkgICAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKLQkJICAgICAgICBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IHA7Ci0JCSAgICAgICAgcC0+c2VjdGlvbiA9IHNyZWxvYzsKLQkJICAgICAgICBwLT5jb3VudCA9IDA7Ci0JCSAgICAgIH0KLQotCQkgICAgKytwLT5jb3VudDsKLQkJICB9Ci0JICAgICAgfQotCSAgICBicmVhazsKLQotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0gICAgICAgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0FSTV9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCSAgCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX0FSTV9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHRvIGEgcGFydGljdWxhciBzZWN0aW9uIGFuZCBvZmZzZXQsIGZvciBlcnJvcgotICAgcmVwb3J0aW5nLiAgIFRoaXMgY29kZSBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgY29kZSBpbiBlbGYuYywgZXhjZXB0Ci0gICB0aGF0IGl0IGFsc28gYWNjZXB0cyBTVFRfQVJNX1RGVU5DIGFzIGEgc3ltYm9sIHRoYXQgbmFtZXMgYSBmdW5jdGlvbi4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZQotICAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKiAgICAgICAgICBhYmZkOwotICAgICBhc2VjdGlvbiAqICAgICBzZWN0aW9uOwotICAgICBhc3ltYm9sICoqICAgICBzeW1ib2xzOwotICAgICBiZmRfdm1hICAgICAgICBvZmZzZXQ7Ci0gICAgIENPTlNUIGNoYXIgKiogIGZpbGVuYW1lX3B0cjsKLSAgICAgQ09OU1QgY2hhciAqKiAgZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICogbGluZV9wdHI7Ci17Ci0gIGJvb2xlYW4gICAgICBmb3VuZDsKLSAgY29uc3QgY2hhciAqIGZpbGVuYW1lOwotICBhc3ltYm9sICogICAgZnVuYzsKLSAgYmZkX3ZtYSAgICAgIGxvd19mdW5jOwotICBhc3ltYm9sICoqICAgcDsKLQotICBpZiAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoISBfYmZkX3N0YWJfc2VjdGlvbl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc3ltYm9scywgc2VjdGlvbiwgb2Zmc2V0LAotCQkJCQkgICAgICZmb3VuZCwgZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyLAotCQkJCQkgICAgICZlbGZfdGRhdGEgKGFiZmQpLT5saW5lX2luZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKHN5bWJvbHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBOVUxMOwotICBmdW5jID0gTlVMTDsKLSAgbG93X2Z1bmMgPSAwOwotCi0gIGZvciAocCA9IHN5bWJvbHM7ICpwICE9IE5VTEw7IHArKykKLSAgICB7Ci0gICAgICBlbGZfc3ltYm9sX3R5cGUgKnE7Ci0KLSAgICAgIHEgPSAoZWxmX3N5bWJvbF90eXBlICopICpwOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uICgmcS0+c3ltYm9sKSAhPSBzZWN0aW9uKQotCWNvbnRpbnVlOwotCi0gICAgICBzd2l0Y2ggKEVMRl9TVF9UWVBFIChxLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JY2FzZSBTVFRfRklMRToKLQkgIGZpbGVuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoJnEtPnN5bWJvbCk7Ci0JICBicmVhazsKLQljYXNlIFNUVF9OT1RZUEU6Ci0JY2FzZSBTVFRfRlVOQzoKLQljYXNlIFNUVF9BUk1fVEZVTkM6Ci0JICBpZiAocS0+c3ltYm9sLnNlY3Rpb24gPT0gc2VjdGlvbgotCSAgICAgICYmIHEtPnN5bWJvbC52YWx1ZSA+PSBsb3dfZnVuYwotCSAgICAgICYmIHEtPnN5bWJvbC52YWx1ZSA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICBmdW5jID0gKGFzeW1ib2wgKikgcTsKLQkgICAgICBsb3dfZnVuYyA9IHEtPnN5bWJvbC52YWx1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZnVuYyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqZmlsZW5hbWVfcHRyID0gZmlsZW5hbWU7Ci0gICpmdW5jdGlvbm5hbWVfcHRyID0gYmZkX2FzeW1ib2xfbmFtZSAoZnVuYyk7Ci0gICpsaW5lX3B0ciA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2FybV9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotewotICBiZmQgKiBkeW5vYmo7Ci0gIGFzZWN0aW9uICogczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIsCi0gICAgIHdoZW4gd2Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgPT0gMCkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVDMyIHJlbG9jIGluIGFuIGlucHV0Ci0gICAgICAgICAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYwotICAgICAgICAgICAgIG9iamVjdC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkCi0gICAgICAgICAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEMzMgotICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKLQkgZmlyc3QgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAuZ290LnBsdCBzZWN0aW9uLCB3aGljaAotCSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgLmdvdCBzZWN0aW9uIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSA0OwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl9BUk1fQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGJmZCAqIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGVudHJpZXMgaW4gdGhlIC5yZWwuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsLmdvdCwKLSAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIHNoYXJlZCBsaW5rLCB0aGVuIHdlIG5lZWQgdG8gZGlzY2FyZCBhbGwKLSAgICAgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyBkZWZpbmVkIGluIGEgcmVndWxhciBvYmplY3QuCi0gICAgIFdlIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlbSBpbiB0aGUgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZQotICAgICB3aWxsIG5vdCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQgJiYgaW5mby0+c3ltYm9saWMpCi0gICAgZWxmMzJfYXJtX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmMzJfYXJtX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgZWxmMzJfYXJtX2Rpc2NhcmRfY29waWVzLAotCQkJCSAgKFBUUikgTlVMTCk7Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICBwbHQgPSBmYWxzZTsKLSAgcmVsb2NzID0gZmFsc2U7Ci0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogU3RyaXAgdGhpcyBzZWN0aW9uIGlmIHdlIGRvbid0IG5lZWQgaXQ7IHNlZSB0aGUKLSAgICAgICAgICAgICAgICAgY29tbWVudCBiZWxvdy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGlzIGEgUExULiAgKi8KLQkgICAgICBwbHQgPSB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbC5ic3MgYW5kCi0JCSAucmVsLnBsdC4gIFdlIG11c3QgY3JlYXRlIGJvdGggc2VjdGlvbnMgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIHRoZXkgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKiB0YXJnZXQ7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKLSAgICAgICAgICAgICAgICAgdGhhbiAucmVsLnBsdC4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWwucGx0IikgIT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkJICByZWxvY3MgPSB0cnVlOwotCi0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKLQkJICAgICBlbnRyeS4gIFRoZSBlbnRyaWVzIGluIHRoZSAucmVsLnBsdCBzZWN0aW9uCi0JCSAgICAgcmVhbGx5IGFwcGx5IHRvIHRoZSAuZ290IHNlY3Rpb24sIHdoaWNoIHdlCi0JCSAgICAgY3JlYXRlZCBvdXJzZWx2ZXMgYW5kIHNvIGtub3cgaXMgbm90IHJlYWRvbmx5LiAgKi8KLQkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDQpOwotCQkgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgIHJlbHRleHQgPSB0cnVlOwotCQl9Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIGFzZWN0aW9uICoqIHNwcDsKLQotCSAgZm9yIChzcHAgPSAmcy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLT5zZWN0aW9uczsKLQkgICAgICAgKnNwcCAhPSBzLT5vdXRwdXRfc2VjdGlvbjsKLQkgICAgICAgc3BwID0gJigqc3BwKS0+bmV4dCkKLQkgICAgOwotCSAgKnNwcCA9IHMtPm91dHB1dF9zZWN0aW9uLT5uZXh0OwotCSAgLS1zLT5vdXRwdXRfc2VjdGlvbi0+b3duZXItPnNlY3Rpb25fY291bnQ7Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfREVCVUcsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocGx0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUR09ULCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMLCBEVF9SRUwpCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxvY3MpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUwsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxFTlQsCi0JCQkJCQlzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZjMyX2FybV9saW5rX2hhc2hfdHJhdmVyc2UgaWYgd2UgYXJlCi0gICBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3Qgd2l0aCAtQnN5bWJvbGljLiAgSXQgZGlzY2FyZHMgdGhlIHNwYWNlCi0gICBhbGxvY2F0ZWQgdG8gY29weSBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBzeW1ib2xzIHdoaWNoIGFyZQotICAgZGVmaW5lZCBpbiByZWd1bGFyIG9iamVjdHMuICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlCi0gICBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdvbid0IGZpbGwgdGhlbSBpbiBpbiB0aGUKLSAgIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZGlzY2FyZF9jb3BpZXMgKGgsIGlnbm9yZSkKLSAgICAgc3RydWN0IGVsZjMyX2FybV9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBQVFIgaWdub3JlOwotewotICBzdHJ1Y3QgZWxmMzJfYXJtX3BjcmVsX3JlbG9jc19jb3BpZWQgKiBzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogc3ltOwotewotICBiZmQgKiBkeW5vYmo7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogc3BsdDsKLSAgICAgIGFzZWN0aW9uICogc2dvdDsKLSAgICAgIGFzZWN0aW9uICogc3JlbDsKLSAgICAgIGJmZF92bWEgcGx0X2luZGV4OwotICAgICAgYmZkX3ZtYSBnb3Rfb2Zmc2V0OwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLQkgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEdldCB0aGUgaW5kZXggaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHdoaWNoCi0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgc3ltYm9sLiAgVGhpcyBpcyB0aGUgaW5kZXggb2YgdGhpcyBzeW1ib2wKLQkgaW4gYWxsIHRoZSBzeW1ib2xzIGZvciB3aGljaCB3ZSBhcmUgbWFraW5nIHBsdCBlbnRyaWVzLiAgVGhlCi0JIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBpcyByZXNlcnZlZC4gICovCi0gICAgICBwbHRfaW5kZXggPSBoLT5wbHQub2Zmc2V0IC8gUExUX0VOVFJZX1NJWkUgLSAxOwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCBpbnRvIHRoZSAuZ290IHRhYmxlIG9mIHRoZSBlbnRyeSB0aGF0Ci0JIGNvcnJlc3BvbmRzIHRvIHRoaXMgZnVuY3Rpb24uICBFYWNoIC5nb3QgZW50cnkgaXMgNCBieXRlcy4KLQkgVGhlIGZpcnN0IHRocmVlIGFyZSByZXNlcnZlZC4gICovCi0gICAgICBnb3Rfb2Zmc2V0ID0gKHBsdF9pbmRleCArIDMpICogNDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LAotICAgICAgICAgICAgICBlbGYzMl9hcm1fcGx0X2VudHJ5LAotCSAgICAgIFBMVF9FTlRSWV9TSVpFKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldAotCQkgICAgICAgLSBzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAtIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgIC0gaC0+cGx0Lm9mZnNldCAtIDEyKSwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMTIpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldCksCi0JCSAgc2dvdC0+Y29udGVudHMgKyBnb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWwucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICsgZ290X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9KVU1QX1NMT1QpOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHNyZWwtPmNvbnRlbnRzCi0JCQkJICsgcGx0X2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogc2dvdDsKLSAgICAgIGFzZWN0aW9uICogc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLQkgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIFRoZSBlbnRyeSBpbgotCSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGluaXRpYWxpemVkIGluCi0JIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX0FSTV9SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9HTE9CX0RBVCk7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKLQkJCQkgKyBzcmVsLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICogczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWwgcmVsOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWwuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWwucl9vZmZzZXQgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FSTV9DT1BZKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzLT5jb250ZW50cwotCQkJCSArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci17Ci0gIGJmZCAqIGR5bm9iajsKLSAgYXNlY3Rpb24gKiBzZ290OwotICBhc2VjdGlvbiAqIHNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKiBuYW1lOwotCSAgYXNlY3Rpb24gKiBzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsLnBsdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgICAvKiBNeSByZWFkaW5nIG9mIHRoZSBTVlI0IEFCSSBpbmRpY2F0ZXMgdGhhdCB0aGUKLQkJIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHJlbG9jcyAoRFRfSk1QUkVMKSBzaG91bGQgYmUKLQkJIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMKS4gIFRoaXMgaXMKLQkJIHdoYXQgU29sYXJpcyBkb2VzLiAgSG93ZXZlciwgVW5peFdhcmUgY2FuIG5vdCBoYW5kbGUKLQkJIHRoYXQgY2FzZS4gIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTFNaIGVudHJ5Ci0JCSBoZXJlIHRvIG1ha2UgaXQgbm90IGluY2x1ZGUgdGhlIEpNUFJFTCByZWxvY3MuICBTaW5jZQotCQkgdGhlIGxpbmtlciBzY3JpcHQgYXJyYW5nZXMgZm9yIC5yZWwucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUwgZW50cnkuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWwucGx0Iik7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fcmF3X3NpemU7Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmMzJfYXJtX3BsdDBfZW50cnksIFBMVF9FTlRSWV9TSVpFKTsKLQotICAgICAgLyogVW5peFdhcmUgc2V0cyB0aGUgZW50c2l6ZSBvZiAucGx0IHRvIDQsIGFsdGhvdWdoIHRoYXQgZG9lc24ndAotCSByZWFsbHkgc2VlbSBsaWtlIHRoZSByaWdodCB2YWx1ZS4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBmaXJzdCB0aHJlZSBlbnRyaWVzIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgOCk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1fcG9zdF9wcm9jZXNzX2hlYWRlcnMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICogYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBsaW5rX2luZm87Ci17Ci0gIEVsZl9JbnRlcm5hbF9FaGRyICogaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotCi0gIGlfZWhkcnAtPmVfaWRlbnRbRUlfT1NBQkldICAgICAgPSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OOwotICBpX2VoZHJwLT5lX2lkZW50W0VJX0FCSVZFUlNJT05dID0gQVJNX0VMRl9BQklfVkVSU0lPTjsKLX0KLQotCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfYXJtCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNX0FSTQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDgwMDAKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAllbGYzMl9hcm1fY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJZWxmMzJfYXJtX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJZWxmMzJfYXJtX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQllbGYzMl9hcm1fcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgICAgZWxmMzJfYXJtX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAJZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9maW5kX25lYXJlc3RfbGluZQkgICAgICAgIGVsZjMyX2FybV9maW5kX25lYXJlc3RfbGluZQotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dldF9zeW1ib2xfdHlwZSAgICAgICAgICAgICBlbGYzMl9hcm1fZ2V0X3N5bWJvbF90eXBlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBlbGYzMl9hcm1fZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgZWxmMzJfYXJtX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uICAgIAllbGYzMl9hcm1fcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJZWxmMzJfYXJtX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucwllbGYzMl9hcm1fZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCWVsZjMyX2FybV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMJZWxmMzJfYXJtX3Bvc3RfcHJvY2Vzc19oZWFkZXJzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5ICAgIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0ICAgIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltICAgIDAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWQxMHYuYyBiL2JmZC9lbGYzMi1kMTB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODBiYWUuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNCArMCwwIEBACi0vKiBEMTBWLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0vKiAjaW5jbHVkZSAiZWxmL2QxMHYuaCIgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZDEwdl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotCi0KLS8qIFVzZSBSRUwgaW5zdGVhZCBvZiBSRUxBIHRvIHNhdmUgc3BhY2UgKi8KLSNkZWZpbmUgVVNFX1JFTAotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUl9EMTBWX05PTkUgPSAwLAotICBSX0QxMFZfMTBfUENSRUxfUiwKLSAgUl9EMTBWXzEwX1BDUkVMX0wsCi0gIFJfRDEwVl8xNiwKLSAgUl9EMTBWXzE4LAotICBSX0QxMFZfMThfUENSRUwsCi0gIFJfRDEwVl8zMiwKLSAgUl9EMTBWX0dOVV9WVElOSEVSSVQsCi0gIFJfRDEwVl9HTlVfVlRFTlRSWSwKLSAgUl9EMTBWX21heAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2QxMHZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRDEwVl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMiAgKi8KLSAgLyogcmlnaHQgY29udGFpbmVyICovCi0gIEhPV1RPIChSX0QxMFZfMTBfUENSRUxfUiwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMTBfUENSRUxfUiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCSAgICAgICAgLyogc3JjX21hc2sgKi8KLQkgMHhmZiwgICAJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIFBDIFJlbGF0aXZlIDEwLWJpdCByZWxvY2F0aW9uLCBzaGlmdGVkIGJ5IDIgICovCi0gIC8qIGxlZnQgY29udGFpbmVyICovCi0gIEhPV1RPIChSX0QxMFZfMTBfUENSRUxfTCwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMTUsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzEwX1BDUkVMX0wiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmODAwMCwJCSAgICAgICAgLyogc3JjX21hc2sgKi8KLQkgMHgwN2Y4MDAwLCAgIAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMTBWXzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8xNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiAxOCBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCAyICovCi0gIEhPV1RPIChSX0QxMFZfMTgsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMTBWXzE4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTggYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMiAgKi8KLSAgSE9XVE8gKFJfRDEwVl8xOF9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QxMFZfMThfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QxMFZfMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDEwVl8zMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0QxMFZfR05VX1ZUSU5IRVJJVCwgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRDEwVl9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfRDEwVl9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfRDEwVl9HTlVfVlRFTlRSWSIsICAgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gCi19OwotCi0vKiBNYXAgQkZEIHJlbG9jIHR5cGVzIHRvIEQxMFYgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGQxMHZfcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2NfdmFsOwotICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci19OwotCi0gc3RhdGljIGNvbnN0IHN0cnVjdCBkMTB2X3JlbG9jX21hcCBkMTB2X3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9EMTBWX05PTkUsIH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiwgUl9EMTBWXzEwX1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MLCBSX0QxMFZfMTBfUENSRUxfTCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9EMTBWXzE2IH0sCi0gIHsgQkZEX1JFTE9DX0QxMFZfMTgsIFJfRDEwVl8xOCB9LAotICB7IEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMLCBSX0QxMFZfMThfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfRDEwVl8zMiB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl9EMTBWX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX0QxMFZfR05VX1ZURU5UUlkgfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7Ci0gICAgICAgaSA8IHNpemVvZiAoZDEwdl9yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZDEwdl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAoZDEwdl9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCXJldHVybiAmZWxmX2QxMHZfaG93dG9fdGFibGVbZDEwdl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEQxMFYgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWQxMHZfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfRDEwVl9tYXgpOwotICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9kMTB2X2hvd3RvX3RhYmxlW3JfdHlwZV07Ci19Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1lbGYzMl9kMTB2X2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfRDEwVl9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX0QxMFZfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2QxMHZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBkMTB2ICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1lbGYzMl9kMTB2X2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfRDEwVl9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9EMTBWX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgRDEwViBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfZDEwdl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCk7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKHJfdHlwZSA9PSBSX0QxMFZfR05VX1ZURU5UUlkKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9EMTBWX0dOVV9WVElOSEVSSVQgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSBlbGZfZDEwdl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQluYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpKTsKLQkgIGlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLQkgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQl9Ci0gICAgICAKLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopIDA7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIG5hbWUsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIG1zZyA9IF8gKCJpbnRlcm5hbCBlcnJvcjogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkgICAgICBtc2cgPSBfICgiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyBlcnJvciIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXyAoImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIG1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2QxMHYKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV9DWUdOVVNfRDEwVgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCTB4MTAwMAotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgICAgIGJmZF9lbGYzMl9kMTB2X3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1kMTB2IgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCSAgICAgICAgICAgICAwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkgICAgICAgICAgICAgZDEwdl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkgICAgICAgICAgICAgMAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nICAgMAotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgZWxmMzJfZDEwdl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vayAgICAgICAgICAgIGVsZjMyX2QxMHZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgZWxmMzJfZDEwdl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAgICAgIGVsZjMyX2QxMHZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgICAgICAgICAgMQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItZDMwdi5jIGIvYmZkL2VsZjMyLWQzMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIwZTllOS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZDMwdi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qIEQzMFYtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGJmZF9lbGZfZDMwdl9yZWxvYyBQQVJBTVMgKCgKLSAgICAgYmZkICphYmZkLAotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLSAgICAgYXN5bWJvbCAqc3ltYm9sLAotICAgICBQVFIgZGF0YSwKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2UpKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgYmZkX2VsZl9kMzB2X3JlbG9jXzIxIFBBUkFNUyAoKAotICAgICBiZmQgKmFiZmQsCi0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICBhc3ltYm9sICpzeW1ib2wsCi0gICAgIFBUUiBkYXRhLAotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgYmZkICpvdXRwdXRfYmZkLAotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotCi1lbnVtIHJlbG9jX3R5cGUKLXsKLSAgUl9EMzBWX05PTkUgPSAwLAotICBSX0QzMFZfNiwKLSAgUl9EMzBWXzlfUENSRUwsCi0gIFJfRDMwVl85X1BDUkVMX1IsCi0gIFJfRDMwVl8xNSwKLSAgUl9EMzBWXzE1X1BDUkVMLAotICBSX0QzMFZfMTVfUENSRUxfUiwKLSAgUl9EMzBWXzIxLAotICBSX0QzMFZfMjFfUENSRUwsCi0gIFJfRDMwVl8yMV9QQ1JFTF9SLAotICBSX0QzMFZfMzIsCi0gIFJfRDMwVl8zMl9QQ1JFTCwKLSAgUl9EMzBWXzMyX05PUk1BTCwKLSAgUl9EMzBWX21heAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2QzMHZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfRDMwVl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl85X1BDUkVMLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzlfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2YsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSA5IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl85X1BDUkVMX1IsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfOV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNSwJCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTCwJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9kMzB2X3JlbG9jXzIxLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMTVfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE1IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMgKi8KLSAgSE9XVE8gKFJfRDMwVl8xNV9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8xNV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMjEgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMyAqLwotICBIT1dUTyAoUl9EMzBWXzIxLAkJLyogdHlwZSAqLwotCSAzLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyMSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAzICovCi0gIEhPV1RPIChSX0QzMFZfMjFfUENSRUwsCS8qIHR5cGUgKi8KLQkgMywJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvY18yMSwJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzIxX1BDUkVMIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDIxIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDMsIGluIHRoZSBSaWdodCBjb250YWluZXIgKi8KLSAgSE9XVE8gKFJfRDMwVl8yMV9QQ1JFTF9SLAkvKiB0eXBlICovCi0JIDMsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2NfMjEsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8yMV9QQ1JFTF9SIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIEQzMFYgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfRDMwVl8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZDMwdl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9EMzBWXzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAzMiBiaXQgcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9EMzBWXzMyX1BDUkVMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2QzMHZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRDMwVl8zMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWd1bGFyIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX0QzMFZfMzJfTk9STUFMLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0QzMFZfMzJfTk9STUFMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLX07Ci0KLSNkZWZpbmUgTUlOMzIgKGxvbmcgbG9uZykweGZmZmZmZmZmODAwMDAwMDBMTAotI2RlZmluZSBNQVgzMiAweDdmZmZmZmZmTEwKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2VsZl9kMzB2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgbG9uZyBsb25nIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW4xLCBpbjIsIG51bTsKLSAgYmZkX3ZtYSB0bXBfYWRkciA9IDA7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgaW50IG1ha2VfYWJzb2x1dGUgPSAwOwotCi0gIHIgPSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotICBpZiAociAhPSBiZmRfcmVsb2NfY29udGludWUpCi0gICAgcmV0dXJuIHI7IAotCi0gIC8qIGEgaGFja2VkLXVwIHZlcnNpb24gb2YgYmZkX3BlcmZvcm1fcmVsb2MoKSBmb2xsb3dzICovCi0gaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIHRtcF9hZGRyID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgCi0JKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICAgIHJlbG9jYXRpb24gLT0gdG1wX2FkZHI7Ci0gICAgfQotICAKLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGZsYWc7Ci0gICAgfQotICBlbHNlCi0gICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0gIAotICBpbjEgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBpbjIgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIgKyA0KTsKLQotICAvKiBleHRyYWN0IHRoZSBhZGRlbmQgKi8KLSAgbnVtID0gKChpbjIgJiAweDNGRkZGKQotCSB8ICgoaW4yICYgMHhGRjAwMDAwKSA+PiAyKQotCSB8ICgoaW4xICYgMHgzRikgPDwgMjYpKTsKLSAgaW4xICY9IDB4RkZGRkZGQzA7Ci0gIGluMiA9IDB4ODAwMDAwMDA7Ci0gIAotICByZWxvY2F0aW9uICs9IG51bTsKLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUgJiYgaG93dG8tPmJpdHNpemUgPT0gMzIpCi0gICAgewotICAgICAgLyogdGhlIEQzMFYgaGFzIGEgUEMgdGhhdCBkb2Vzbid0IHdyYXAgYW5kIFBDLXJlbGF0aXZlIGp1bXBzICovCi0gICAgICAvKiBhcmUgc2lnbmVkLCBzbyBhIFBDLXJlbGF0aXZlIGp1bXAgY2FuJ3RiZSBtb3JlIHRoYW4gKy8tIDJeMzEgYnlydGVzICovCi0gICAgICAvKiBpZiBvbmUgZXhjZWVkcyB0aGlzLCBjaGFuZ2UgaXQgdG8gYW4gYWJzb2x1dGUganVtcCAqLwotICAgICAgaWYgKHJlbG9jYXRpb24gPiBNQVgzMikKLQl7Ci0JICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gKyB0bXBfYWRkcikgJiAweGZmZmZmZmZmOwotCSAgbWFrZV9hYnNvbHV0ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAocmVsb2NhdGlvbiA8IE1JTjMyKQotCXsKLQkgIHJlbG9jYXRpb24gPSAocmVsb2NhdGlvbiArIHRtcF9hZGRyKSAmIDB4ZmZmZmZmZmY7Ci0JICBtYWtlX2Fic29sdXRlID0gMTsKLQl9Ci0gICAgfQotICAKLSAgaW4xIHw9IChyZWxvY2F0aW9uID4+IDI2KSAmIDB4M0Y7CS8qIHRvcCA2IGJpdHMgKi8KLSAgaW4yIHw9ICgocmVsb2NhdGlvbiAmIDB4MDNGQzAwMDApIDw8IDIpOyAgLyogbmV4dCA4IGJpdHMgKi8gCi0gIGluMiB8PSByZWxvY2F0aW9uICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0gIAotICAvKiBjaGFuZ2UgYSBQQy1yZWxhdGl2ZSBpbnN0cnVjdGlvbiB0byBpdHMgYWJzb2x1dGUgZXF1aXZhbGVudCAqLwotICAvKiB3aXRoIHRoaXMgc2ltcGxlIGhhY2sgKi8KLSAgaWYgKG1ha2VfYWJzb2x1dGUpCi0gICAgaW4xIHw9IDB4MDAxMDAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW4xLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotICBiZmRfcHV0XzMyIChhYmZkLCBpbjIsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkciArIDQpOwotICAKLSAgcmV0dXJuIGZsYWc7Ci19ICAgCi0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2VsZl9kMzB2X3JlbG9jXzIxIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfdm1hIGluMSwgbnVtOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hIG91dHB1dF9iYXNlID0gMDsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8gPSByZWxvY19lbnRyeS0+aG93dG87Ci0gIGludCBtYXNrLCBtYXg7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsgCi0KLSAgLyogYSBoYWNrZWQtdXAgdmVyc2lvbiBvZiBiZmRfcGVyZm9ybV9yZWxvYygpIGZvbGxvd3MgKi8KLSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwCi0gICAgICAmJiBvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBmbGFnID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbiByZWFsbHkgd2l0aGluIHRoZSBzZWN0aW9uPyAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBXb3JrIG91dCB3aGljaCBzZWN0aW9uIHRoZSByZWxvY2F0aW9uIGlzIHRhcmdldHRlZCBhdCBhbmQgdGhlCi0gICAgIGluaXRpYWwgcmVsb2NhdGlvbiBjb21tYW5kIHZhbHVlLiAgKi8KLQotICAvKiBHZXQgc3ltYm9sIHZhbHVlLiAgKENvbW1vbiBzeW1ib2xzIGFyZSBzcGVjaWFsLikgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24gPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIC8qIENvbnZlcnQgaW5wdXQtc2VjdGlvbi1yZWxhdGl2ZSBzeW1ib2wgdmFsdWUgdG8gYWJzb2x1dGUuICAqLwotICBpZiAob3V0cHV0X2JmZCkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIGlmIChob3d0by0+cGNyZWxfb2Zmc2V0ID09IHRydWUpCi0JcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGFuZCB3ZSB3YW50IHRvIGFwcGx5IHRoZSByZWxvY2F0aW9uCi0JIHRvIHRoZSByZWxvYyBlbnRyeSByYXRoZXIgdGhhbiB0aGUgcmF3IGRhdGEuIE1vZGlmeSB0aGUgcmVsb2MKLQkgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGZsYWc7Ci0gICAgfQotICBlbHNlCi0gICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0gIAotICBpbjEgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIG1hc2sgPSAgKDEgPDwgaG93dG8tPmJpdHNpemUpIC0gMTsKLSAgaWYgKGhvd3RvLT5iaXRzaXplID09IDYpCi0gICAgbWFzayA8PD0gMTI7Ci0gIG1heCA9ICgxIDw8IChob3d0by0+Yml0c2l6ZSArIDIpKSAtIDE7Ci0KLSAgLyogZXh0cmFjdCB0aGUgYWRkZW5kICovCi0gIG51bSA9IGluMSAmIG1hc2s7ICAvKiAxOCBiaXRzICovCi0gIGlmIChob3d0by0+Yml0c2l6ZSA9PSA2KQotICAgIG51bSA+Pj0gMTI7Ci0gIG51bSA8PD0gMzsgLyogc2hpZnQgbGVmdCAzICovCi0gIGluMSAmPSB+bWFzazsgIC8qIG1hc2sgb3V0IGFkZGVuZCAqLwotCi0gIHJlbG9jYXRpb24gKz0gbnVtOwotICBpZiAoaG93dG8tPnR5cGUgPT0gUl9EMzBWXzIxX1BDUkVMX1IgfHwgaG93dG8tPnR5cGUgPT0gUl9EMzBWXzE1X1BDUkVMX1IgfHwKLSAgICAgIGhvd3RvLT50eXBlID09IFJfRDMwVl85X1BDUkVMX1IgKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gKz0gNDsKLSAgICB9Ci0KLSAgaWYgKChpbnQpcmVsb2NhdGlvbiA8IDAgKQotICAgIHsKLSAgICAgIGlmICh+KGludClyZWxvY2F0aW9uID4gbWF4KQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChpbnQpcmVsb2NhdGlvbiA+IG1heCkKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgIH0KLSAgcmVsb2NhdGlvbiA+Pj0gMzsgCi0gIGlmIChob3d0by0+Yml0c2l6ZSA9PSA2KQotICAgIGluMSB8PSAoKHJlbG9jYXRpb24gJiAobWFzayA+PiAxMikpIDw8IDEyKTsKLSAgZWxzZQotICAgIGluMSB8PSByZWxvY2F0aW9uICYgbWFzazsKLQotICBiZmRfcHV0XzMyIChhYmZkLCBpbjEsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIAotICByZXR1cm4gZmxhZzsKLX0gICAKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBEMzBWIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBkMzB2X3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGQzMHZfcmVsb2NfbWFwIGQzMHZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLCBSX0QzMFZfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl82LCBSX0QzMFZfNiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzlfUENSRUwsIFJfRDMwVl85X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTF9SLCBSX0QzMFZfOV9QQ1JFTF9SIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMTUsIFJfRDMwVl8xNSB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMLCBSX0QzMFZfMTVfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SLCBSX0QzMFZfMTVfUENSRUxfUiB9LAotICB7IEJGRF9SRUxPQ19EMzBWXzIxLCBSX0QzMFZfMjEgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCwgUl9EMzBWXzIxX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMjFfUENSRUxfUiwgUl9EMzBWXzIxX1BDUkVMX1IgfSwKLSAgeyBCRkRfUkVMT0NfRDMwVl8zMiwgUl9EMzBWXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwsIFJfRDMwVl8zMl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9EMzBWXzMyX05PUk1BTCB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChkMzB2X3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBkMzB2X3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChkMzB2X3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfZDMwdl9ob3d0b190YWJsZVtkMzB2X3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gRDMwViBFTEYgcmVsb2MgKHR5cGUgUkVMKS4gICovCi0KLXN0YXRpYyB2b2lkCi1kMzB2X2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX0QzMFZfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfZDMwdl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEQzMFYgRUxGIHJlbG9jICh0eXBlIFJFTEEpLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9EMzBWX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2QzMHZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfZDMwdgotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNX0NZR05VU19EMzBWCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgYmZkX2VsZjMyX2QzMHZfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWQzMHYiCi0KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JZDMwdl9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCWQzMHZfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJMAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5hbF93cml0ZV9wcm9jZXNzaW5nCTAKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLWZyMzAuYyBiL2JmZC9lbGYzMi1mcjMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjODcyNWYuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLWZyMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi0vKiBGUjMwLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvZnIzMC5oIgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZyMzBfZWxmX2kyMF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZnIzMF9lbGZfaTMyX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKiBmcjMwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIGZyMzBfaW5mb190b19ob3d0b19yZWxhIAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIGZyMzBfZWxmX3JlbG9jYXRlX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gZnIzMF9lbGZfZ2Nfc3dlZXBfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGFzZWN0aW9uICogZnIzMF9lbGZfZ2NfbWFya19ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZnIzMF9lbGZfaG93dG9fdGFibGUgW10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX0ZSMzBfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDggYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzgiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIwIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF8yMCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGZyMzBfZWxmX2kyMF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzIwIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF8zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBpbnRvIDQ4IGJpdHMgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX0ZSMzBfNDgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBmcjMwX2VsZl9pMzJfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF80OCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF82X0lOXzQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzZfSU5fNCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBBbiA4IGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF84X0lOXzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzhfSU5fOCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwZmYwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBBIDkgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzlfSU5fOCwJCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDksCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA0LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0ZSMzBfOV9JTl84IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDBmZjAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEEgMTAgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9GUjMwXzEwX0lOXzgsCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzEwX0lOXzgiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MGZmMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgOSBiaXQgcmVsb2NhdGlvbiwgcmlnaHQgc2hpZnRlZCBieSAxLiAgKi8KLSAgSE9XVE8gKFJfRlIzMF85X1BDUkVMLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA5LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9GUjMwXzlfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIFBDIHJlbGF0aXZlIDEyIGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDEuICAqLwotICBIT1dUTyAoUl9GUjMwXzEyX1BDUkVMLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfRlIzMF8xMl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9GUjMwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0ZSMzBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0ZSMzBfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0ZSMzBfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQwKLS8qIFV0aWxpdHkgdG8gYWN0dWFsbHkgcGVyZm9ybSBhbiBSX0ZSMzBfMjAgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2VsZl9pMjBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiAgc3ltYm9sOwotICAgICBQVFIgICAgICAgIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogICAgICBvdXRwdXRfYmZkOwotICAgICBjaGFyICoqICAgIGVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgICAgICAgcmVsb2NhdGlvbjsKLSAgdW5zaWduZWQgbG9uZyB4OwotICAKLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICByZWxvY2F0aW9uID0KLSAgICBzeW1ib2wtPnZhbHVlCi0gICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBpZiAocmVsb2NhdGlvbiA+ICgoMVUgPDwgMjApIC0gMSkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICB4ID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgeCA9ICh4ICYgMHhmZjBmMDAwMCkgfCAocmVsb2NhdGlvbiAmIDB4MDAwMGZmZmYpIHwgKChyZWxvY2F0aW9uICYgMHgwMDBmMDAwMCkgPDwgNCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHgsIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotDAotLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGEgUl9GUjMwXzQ4IHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZnIzMF9lbGZfaTMyX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICogICAgICBhYmZkOwotICAgICBhcmVsZW50ICogIHJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICogIHN5bWJvbDsKLSAgICAgUFRSICAgICAgICBkYXRhOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqICAgICAgb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKiAgICBlcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hICAgICAgIHJlbG9jYXRpb247Ci0KLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICByZWxvY2F0aW9uID0KLSAgICBzeW1ib2wtPnZhbHVlCi0gICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICsgcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBiZmRfcHV0XzMyIChhYmZkLCByZWxvY2F0aW9uLCBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgKyAyKTsKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBGUjMwIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBmcjMwX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgaW50IGZyMzBfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmcjMwX3JlbG9jX21hcCBmcjMwX3JlbG9jX21hcCBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsICAgICAgICAgICBSX0ZSMzBfTk9ORSB9LAotICB7IEJGRF9SRUxPQ184LCAgICAgICAgICAgICAgUl9GUjMwXzggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF8yMCwgICAgICAgIFJfRlIzMF8yMCB9LAotICB7IEJGRF9SRUxPQ18zMiwgICAgICAgICAgICAgUl9GUjMwXzMyIH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfNDgsICAgICAgICBSX0ZSMzBfNDggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF82X0lOXzQsICAgIFJfRlIzMF82X0lOXzQgfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF84X0lOXzgsICAgIFJfRlIzMF84X0lOXzggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF85X0lOXzgsICAgIFJfRlIzMF85X0lOXzggfSwKLSAgeyBCRkRfUkVMT0NfRlIzMF8xMF9JTl84LCAgIFJfRlIzMF8xMF9JTl84IH0sCi0gIHsgQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTCwgICBSX0ZSMzBfOV9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19GUjMwXzEyX1BDUkVMLCAgUl9GUjMwXzEyX1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX0ZSMzBfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksICAgUl9GUjMwX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1mcjMwX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gc2l6ZW9mIChmcjMwX3JlbG9jX21hcCkgLyBzaXplb2YgKGZyMzBfcmVsb2NfbWFwWzBdKTsKLSAgICAgICAtLWk7KQotICAgIGlmIChmcjMwX3JlbG9jX21hcCBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotICAgICAgcmV0dXJuICYgZnIzMF9lbGZfaG93dG9fdGFibGUgW2ZyMzBfcmVsb2NfbWFwW2ldLmZyMzBfcmVsb2NfdmFsXTsKLSAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIEZSMzAgRUxGIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyMzBfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgYXJlbGVudCAqIGNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqIGRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9GUjMwX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmIGZyMzBfZWxmX2hvd3RvX3RhYmxlIFtyX3R5cGVdOwotfQotDAotLyogUGVyZm9ybSBhIHNpbmdsZSByZWxvY2F0aW9uLiAgQnkgZGVmYXVsdCB3ZSB1c2UgdGhlIHN0YW5kYXJkIEJGRAotICAgcm91dGluZXMsIGJ1dCBhIGZldyByZWxvY3MsIHdlIGhhdmUgdG8gZG8gdGhlbSBvdXJzZWx2ZXMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1mcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWwsIHJlbG9jYXRpb24pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgaG93dG87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqICAgICAgICAgIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICogICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogcmVsOwotICAgICBiZmRfdm1hICAgICAgICAgICAgIHJlbG9jYXRpb247Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByID0gYmZkX3JlbG9jX29rOwotICBiZmRfdm1hICAgICAgICAgICAgICAgeDsKLSAgYmZkX3NpZ25lZF92bWEJc3JlbDsKLSAgCi0gIHN3aXRjaCAoaG93dG8tPnR5cGUpCi0gICAgewotICAgIGNhc2UgUl9GUjMwXzIwOgotICAgICAgY29udGVudHMgICArPSByZWwtPnJfb2Zmc2V0OwotICAgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCi0gICAgICBpZiAocmVsb2NhdGlvbiA+ICgoMSA8PCAyMCkgLSAxKSkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyk7Ci0gICAgICB4ID0gKHggJiAweGZmMGYwMDAwKSB8IChyZWxvY2F0aW9uICYgMHgwMDAwZmZmZikgfCAoKHJlbG9jYXRpb24gJiAweDAwMGYwMDAwKSA8PCA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfRlIzMF80ODoKLSAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldCArIDI7Ci0gICAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHJlbG9jYXRpb24sIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0ZSMzBfOV9QQ1JFTDoKLSAgICAgIGNvbnRlbnRzICAgKz0gcmVsLT5yX29mZnNldCArIDE7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotICAgICAgc3JlbCArPSByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCAtPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCAtPSAyOyAgLyogQnJhbmNoIGluc3RydWN0aW9ucyBhZGQgMiB0byB0aGUgUEMuLi4gKi8KLSAgICAgIHNyZWwgLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKwotCQkgICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgCi0gICAgICBpZiAoc3JlbCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICAgICAgaWYgKHNyZWwgPiAoKDEgPDwgOCkgLSAxKSB8fCAoc3JlbCA8IC0gKDEgPDwgOCkpKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCBzcmVsID4+IDEsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0ZSMzBfMTJfUENSRUw6Ci0gICAgICBjb250ZW50cyAgICs9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBzcmVsID0gKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uOwotICAgICAgc3JlbCArPSByZWwtPnJfYWRkZW5kOwotICAgICAgc3JlbCAtPSByZWwtPnJfb2Zmc2V0OwotICAgICAgc3JlbCAtPSAyOyAvKiBCcmFuY2ggaW5zdHJ1Y3Rpb25zIGFkZCAyIHRvIHRoZSBQQy4uLiAqLwotICAgICAgc3JlbCAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArCi0JCSAgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIGlmIChzcmVsICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0gICAgICBpZiAoc3JlbCA+ICgoMSA8PCAxMSkgLSAxKSB8fCAoc3JlbCA8IC0gKDEgPDwgMTEpKSkKLQkgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIHggPSBiZmRfZ2V0XzE2IChpbnB1dF9iZmQsIGNvbnRlbnRzKTsKLSAgICAgIHggPSAoeCAmIDB4ZjgwMCkgfCAoKHNyZWwgPj4gMSkgJiAweDdmZik7Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLQwKLS8qIFJlbG9jYXRlIGFuIEZSMzAgRUxGIHNlY3Rpb24uCi0gICBUaGVyZSBpcyBzb21lIGF0dGVtcHQgdG8gbWFrZSB0aGlzIGZ1bmN0aW9uIHVzYWJsZSBmb3IgbWFueSBhcmNoaXRlY3R1cmVzLAotICAgYm90aCBVU0VfUkVMIGFuZCBVU0VfUkVMQSBbJ3R3b3VsZCBiZSBuaWNlIGlmIHN1Y2ggYSBjcml0dGVyIGV4aXN0ZWRdLAotICAgaWYgb25seSB0byBzZXJ2ZSBhcyBhIGxlYXJuaW5nIHRvb2wuCi0KLSAgIFRoZSBSRUxPQ0FURV9TRUNUSU9OIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgbmV3IEVMRiBiYWNrZW5kIGxpbmtlcgotICAgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uLgotCi0gICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgemVyby4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUKLSAgIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlIHJlbG9jIGFkZGVuZCBhcyBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIG91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogIGluZm87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICAgbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICogICAgICAgICAgIHN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsZW5kOwotCi0gIHN5bXRhYl9oZHIgPSAmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICByZWxlbmQgICAgID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsICsrKQotICAgIHsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci0gICAgICBhc2VjdGlvbiAqICAgICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgIGJmZF92bWEgICAgICAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSAgICAgICAgcjsKLSAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIHJfdHlwZTsKLSAgICAgIAotICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmICggICByX3R5cGUgPT0gUl9GUjMwX0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSX0ZSMzBfR05VX1ZURU5UUlkpCi0JY29udGludWU7Ci0gICAgICAKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotICAgICAgICAgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLSAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICAKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9ucyBbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaG93dG8gID0gZnIzMF9lbGZfaG93dG9fdGFibGUgKyBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGggICAgICA9IE5VTEw7Ci0gICAgICBzeW0gICAgPSBOVUxMOwotICAgICAgc2VjICAgID0gTlVMTDsKLSAgICAgIAotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9ucyBbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotCSAgCi0JICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCSAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotCSAgbmFtZSA9IChuYW1lID09IE5VTEwpID8gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpIDogbmFtZTsKLSNpZiAwCi0JICBmcHJpbnRmIChzdGRlcnIsICJsb2NhbDogc2VjOiAlcywgc3ltOiAlcyAoJWQpLCB2YWx1ZTogJXggKyAleCArICV4IGFkZGVuZCAleFxuIiwKLQkJICAgc2VjLT5uYW1lLCBuYW1lLCBzeW0tPnN0X25hbWUsCi0JCSAgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LAotCQkgICBzeW0tPnN0X3ZhbHVlLCByZWwtPnJfYWRkZW5kKTsKLSNlbmRpZgotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlcyBbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIAotCSAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0jaWYgMAotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgICJkZWZpbmVkOiBzZWM6ICVzLCBuYW1lOiAlcywgdmFsdWU6ICV4ICsgJXggKyAleCBnaXZlczogJXhcbiIsCi0JCSAgICAgICBzZWMtPm5hbWUsIG5hbWUsIGgtPnJvb3QudS5kZWYudmFsdWUsCi0JCSAgICAgICBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEsIHNlYy0+b3V0cHV0X29mZnNldCwgcmVsb2NhdGlvbik7Ci0jZW5kaWYKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICB7Ci0jaWYgMAotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInVuZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXNcbiIsCi0JCSAgICAgICBzZWMtPm5hbWUsIG5hbWUpOwotI2VuZGlmCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAidW5rbm93bjogbmFtZTogJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIHIgPSBmcjMwX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICBjb250ZW50cywgcmVsLCByZWxvY2F0aW9uKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBtc2cgPSAoY29uc3QgY2hhciAqKSBOVUxMOwotCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICAgICAgciA9IGluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cKLQkJKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgYmZkX3JlbG9jX3VuZGVmaW5lZDoKLQkgICAgICByID0gaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sCi0JCShpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyByZWxvY2F0aW9uIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogdW5rbm93biBlcnJvciIpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChtc2cpCi0JICAgIHIgPSBpbmZvLT5jYWxsYmFja3MtPndhcm5pbmcKLQkgICAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpOwotCi0JICBpZiAoISByKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1mcjMwX2VsZl9nY19tYXJrX2hvb2sgKGFiZmQsIGluZm8sIHJlbCwgaCwgc3ltKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgICAgaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICByZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICogaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICAgICAgICBzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX0ZSMzBfR05VX1ZUSU5IRVJJVDoKLQljYXNlIFJfRlIzMF9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1mcjMwX2VsZl9nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jczsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLWZyMzBfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfRlIzMF9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9GUjMwX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9mcjMwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX0ZSMzAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfZnIzMF92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItZnIzMCIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCQlOVUxMCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkJZnIzMF9pbmZvX3RvX2hvd3RvX3JlbGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJZnIzMF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJCWZyMzBfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCQlmcjMwX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBmcjMwX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJCTEKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCQlmcjMwX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1nZW4uYyBiL2JmZC9lbGYzMi1nZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkMzVhZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiBHZW5lcmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IHNob3VsZCBiZQotICAgZ29vZCBlbm91Z2ggZm9yIEdEQiBvciBvYmpkdW1wIHRvIHJlYWQgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBkdW1teSA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlVOS05PV04iLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGYzMi1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItYmlnIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX3Vua25vd24KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTk9ORQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1ocHBhLmMgYi9iZmQvZWxmMzItaHBwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTJkZDQ3Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1ocHBhLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzgwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgSFAgUEEtUklTQyBFTEYgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5Ci0KLQlDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLQlEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UKLQlVbml2ZXJzaXR5IG9mIFV0YWgKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9ocHBhLmgiCi0jaW5jbHVkZSAibGliaHBwYS5oIgotI2luY2x1ZGUgImVsZjMyLWhwcGEuaCIKLSNkZWZpbmUgQVJDSF9TSVpFCQkzMgotI2luY2x1ZGUgImVsZi1ocHBhLmgiCi0KLQotLyogV2UgdXNlIHRocmVlIGRpZmZlcmVudCBoYXNoIHRhYmxlcyB0byBob2xkIGluZm9ybWF0aW9uIGZvcgotICAgbGlua2luZyBQQSBFTEYgb2JqZWN0cy4KLQotICAgVGhlIGZpcnN0IGlzIHRoZSBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSB3aGljaCBpcyBkZXJpdmVkCi0gICBmcm9tIHRoZSBzdGFuZGFyZCBFTEYgbGlua2VyIGhhc2ggdGFibGUuICBXZSB1c2UgdGhpcyBhcyBhIHBsYWNlIHRvCi0gICBhdHRhY2ggb3RoZXIgaGFzaCB0YWJsZXMgYW5kIHN0YXRpYyBpbmZvcm1hdGlvbi4KLQotICAgVGhlIHNlY29uZCBpcyB0aGUgc3R1YiBoYXNoIHRhYmxlIHdoaWNoIGlzIGRlcml2ZWQgZnJvbSB0aGUKLSAgIGJhc2UgQkZEIGhhc2ggdGFibGUuICBUaGUgc3R1YiBoYXNoIHRhYmxlIGhvbGRzIHRoZSBpbmZvcm1hdGlvbgotICAgbmVjZXNzYXJ5IHRvIGJ1aWxkIHRoZSBsaW5rZXIgc3R1YnMgZHVyaW5nIGEgbGluay4gICovCi0KLS8qIEhhc2ggdGFibGUgZm9yIGxpbmtlciBzdHVicy4gICovCi0KLXN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeQotewotICAvKiBCYXNlIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCB3ZSBjYW4gZ2V0IHRoZSBuYW1lIG9mIHRoZSBzdHViCi0gICAgIChhbmQgdGh1cyBrbm93IGV4YWN0bHkgd2hhdCBhY3Rpb25zIGl0IHBlcmZvcm1zKSBmcm9tIHRoZSBiYXNlCi0gICAgIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBPZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHN0dWIuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLQotICAvKiBHaXZlbiB0aGUgc3ltYm9sJ3MgdmFsdWUgYW5kIGl0cyBzZWN0aW9uIHdlIGNhbiBkZXRlcm1pbmUgaXRzIGZpbmFsCi0gICAgIHZhbHVlIHdoZW4gYnVpbGRpbmcgdGhlIHN0dWJzIChzbyB0aGUgc3R1YiBrbm93cyB3aGVyZSB0byBqdW1wLiAgKi8KLSAgc3ltdmFsdWUgdGFyZ2V0X3ZhbHVlOwotICBhc2VjdGlvbiAqdGFyZ2V0X3NlY3Rpb247Ci19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUKLXsKLSAgLyogVGhlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogVGhlIHN0dWIgQkZELiAgKi8KLSAgYmZkICpzdHViX2JmZDsKLQotICAvKiBXaGVyZSB0byBwbGFjZSB0aGUgbmV4dCBzdHViLiAgKi8KLSAgYmZkX2J5dGUgKmxvY2F0aW9uOwotCi0gIC8qIEN1cnJlbnQgb2Zmc2V0IGluIHRoZSBzdHViIHNlY3Rpb24uICAqLwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCi19OwotCi1zdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLX07Ci0KLXN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZQotewotICAvKiBUaGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICpzdHViX2hhc2hfdGFibGU7Ci0KLSAgLyogQSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIG91dHB1dCBzeW1ib2xzLiAgKi8KLSAgdW5zaWduZWQgaW50IG91dHB1dF9zeW1ib2xfY291bnQ7Ci0KLSAgLyogU3R1ZmYgc28gd2UgY2FuIGhhbmRsZSBEUCByZWxhdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gIGxvbmcgZ2xvYmFsX3ZhbHVlOwotICBpbnQgZ2xvYmFsX3N5bV9kZWZpbmVkOwotfTsKLQotLyogRUxGMzIvSFBQQSByZWxvY2F0aW9uIHN1cHBvcnQKLQotCVRoaXMgZmlsZSBjb250YWlucyBFTEYzMi9IUFBBIHJlbG9jYXRpb24gc3VwcG9ydCBhcyBzcGVjaWZpZWQKLQlpbiB0aGUgU3RyYXR1cyBGVFgvR29sZiBPYmplY3QgRmlsZSBGb3JtYXQgKFNFRC0xNzYyKSBkYXRlZAotCUZlYnJ1YXJ5IDE5OTQuICAqLwotCi0jaW5jbHVkZSAiZWxmMzItaHBwYS5oIgotI2luY2x1ZGUgImhwcGFfc3R1YnMuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBocHBhX2VsZl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBwYV9lbGZfcmVsb2NhdGVfaW5zbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgbG9uZywKLQkgICBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgaHBwYV9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCosIGNoYXIgKiopKTsKLQotc3RhdGljIGJvb2xlYW4gaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjMyX2hwcGFfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBhc2VjdGlvbiAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX2hwcGFfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9ocHBhX2J1aWxkX29uZV9zdHViIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlbGYzMl9ocHBhX3NpemVfb2Zfc3R1YgotICBQQVJBTVMgKChiZmRfdm1hLCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX3ZtYSwgY2hhciAqKSk7Ci0KLS8qIEZvciBsaW5rZXIgc3R1YiBoYXNoIHRhYmxlcy4gICovCi0jZGVmaW5lIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0jZGVmaW5lIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKSBcCi0gIChiZmRfaGFzaF90cmF2ZXJzZSBcCi0gICAoJih0YWJsZSktPnJvb3QsIFwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksIFwKLSAgICAoaW5mbykpKQotCi0vKiBGb3IgSFBQQSBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KVwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfZW50cnkgKikJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIFBBIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLQotLyogQXNzb3J0ZWQgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICAqLwotCi0vKiBJbml0aWFsaXplIGFuIGVudHJ5IGluIHRoZSBzdHViIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZjMyX2hwcGFfc3R1Yl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+b2Zmc2V0ID0gMDsKLSAgICAgIHJldC0+dGFyZ2V0X3ZhbHVlID0gMDsKLSAgICAgIHJldC0+dGFyZ2V0X3NlY3Rpb24gPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYSBzdHViIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdCAodGFibGUsIHN0dWJfYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBiZmQgKnN0dWJfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICB0YWJsZS0+b2Zmc2V0ID0gMDsKLSAgdGFibGUtPmxvY2F0aW9uID0gMDsKLSAgdGFibGUtPnN0dWJfYmZkID0gc3R1Yl9iZmQ7Ci0gIHJldHVybiAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJnRhYmxlLT5yb290LCBuZXdmdW5jKSk7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgZGVyaXZlZCBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZSBQQSBFTEYgcG9ydCB1c2VzIHRoZSBkZXJpdmVkCi0gICBoYXNoIHRhYmxlIHRvIGtlZXAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIFBBIEVMRiBsaW5rZXIgKHdpdGhvdXQKLSAgIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMpLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZWxmMzJfaHBwYV9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZjMyX2hwcGFfbGlua19oYXNoX3RhYmxlKSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGlmICghX2JmZF9lbGZfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsCi0JCQkJICAgICAgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZXQtPnN0dWJfaGFzaF90YWJsZSA9IE5VTEw7Ci0gIHJldC0+b3V0cHV0X3N5bWJvbF9jb3VudCA9IDA7Ci0gIHJldC0+Z2xvYmFsX3ZhbHVlID0gMDsKLSAgcmV0LT5nbG9iYWxfc3ltX2RlZmluZWQgPSAwOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIFJlbG9jYXRlIHRoZSBnaXZlbiBJTlNOIGdpdmVuIHRoZSB2YXJpb3VzIGlucHV0IHBhcmFtZXRlcnMuCi0KLSAgIEZJWE1FOiBlbmRpYW5uZXNzIGFuZCBzaXplb2YgKGxvbmcpIGlzc3VlcyBhYm91bmQgaGVyZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1ocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChhYmZkLCBpbnB1dF9zZWN0LCBpbnNuLCBhZGRyZXNzLCBzeW1fdmFsdWUsCi0JCQlyX2FkZGVuZCwgcl9mb3JtYXQsIHJfZmllbGQsIHBjcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0OwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgICAgbG9uZyBzeW1fdmFsdWU7Ci0gICAgIGxvbmcgcl9hZGRlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9maWVsZDsKLSAgICAgdW5zaWduZWQgbG9uZyBwY3JlbDsKLXsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGUgPSBnZXRfb3Bjb2RlIChpbnNuKTsKLSAgbG9uZyBjb25zdGFudF92YWx1ZTsKLQotICBzd2l0Y2ggKG9wY29kZSkKLSAgICB7Ci0gICAgY2FzZSBMRE86Ci0gICAgY2FzZSBMREI6Ci0gICAgY2FzZSBMREg6Ci0gICAgY2FzZSBMRFc6Ci0gICAgY2FzZSBMRFdNOgotICAgIGNhc2UgU1RCOgotICAgIGNhc2UgU1RIOgotICAgIGNhc2UgU1RXOgotICAgIGNhc2UgU1RXTToKLSAgICBjYXNlIENPTUlDTFI6Ci0gICAgY2FzZSBTVUJJOgotICAgIGNhc2UgQURESVQ6Ci0gICAgY2FzZSBBRERJOgotICAgIGNhc2UgTERJTDoKLSAgICBjYXNlIEFERElMOgotICAgICAgY29uc3RhbnRfdmFsdWUgPSBIUFBBX1JfQ09OU1RBTlQgKHJfYWRkZW5kKTsKLQotICAgICAgaWYgKHBjcmVsKQotCXN5bV92YWx1ZSAtPSBhZGRyZXNzOwotCi0gICAgICBzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCk7Ci0gICAgICByZXR1cm4gaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHN5bV92YWx1ZSwgcl9mb3JtYXQpOwotCi0gICAgY2FzZSBCTDoKLSAgICBjYXNlIEJFOgotICAgIGNhc2UgQkxFOgotICAgICAgLyogWFhYIGNvbXB1dGluZyBjb25zdGFudF92YWx1ZSBpcyBub3QgbmVlZGVkPz8/ICovCi0gICAgICBjb25zdGFudF92YWx1ZSA9IGFzc2VtYmxlXzE3ICgoaW5zbiAmIDB4MDAxZjAwMDApID4+IDE2LAotCQkJCSAgICAoaW5zbiAmIDB4MDAwMDFmZmMpID4+IDIsCi0JCQkJICAgIGluc24gJiAxKTsKLQotICAgICAgY29uc3RhbnRfdmFsdWUgPSAoY29uc3RhbnRfdmFsdWUgPDwgMTUpID4+IDE1OwotICAgICAgaWYgKHBjcmVsKQotCXsKLQkgIHN5bV92YWx1ZSAtPQotCSAgICBhZGRyZXNzICsgaW5wdXRfc2VjdC0+b3V0cHV0X29mZnNldAotCSAgICArIGlucHV0X3NlY3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBzeW1fdmFsdWUgPSBocHBhX2ZpZWxkX2FkanVzdCAoc3ltX3ZhbHVlLCAtOCwgcl9maWVsZCk7Ci0JfQotICAgICAgZWxzZQotCXN5bV92YWx1ZSA9IGhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIGNvbnN0YW50X3ZhbHVlLCByX2ZpZWxkKTsKLQotICAgICAgcmV0dXJuIGhwcGFfcmVidWlsZF9pbnNuIChhYmZkLCBpbnNuLCBzeW1fdmFsdWUgPj4gMiwgcl9mb3JtYXQpOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChvcGNvZGUgPT0gMCkKLQl7Ci0JICBjb25zdGFudF92YWx1ZSA9IEhQUEFfUl9DT05TVEFOVCAocl9hZGRlbmQpOwotCi0JICBpZiAocGNyZWwpCi0JICAgIHN5bV92YWx1ZSAtPSBhZGRyZXNzOwotCi0JICByZXR1cm4gaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgY29uc3RhbnRfdmFsdWUsIHJfZmllbGQpOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLS8qIFJlbG9jYXRlIGFuIEhQUEEgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1BBUklTQ19VTklNUExFTUVOVEVEKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmX2hwcGFfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzeW1fc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc3ltX3NlYy0+b3V0cHV0X29mZnNldDsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc3ltX3NlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHN5bV9zZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgPyAwIDogc3ltLT5zdF92YWx1ZSkKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCSArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGluZHg7Ci0KLQkgIGluZHggPSByX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHN5bV9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGggIT0gTlVMTCkKLQlzeW1fbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBlbHNlCi0JewotCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKLQkgIGlmIChzeW1fbmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoKnN5bV9uYW1lID09ICdcMCcpCi0JICAgIHN5bV9uYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzeW1fc2VjKTsKLQl9Ci0KLSAgICAgIHIgPSBlbGYzMl9ocHBhX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkJICAgICAgcmVsLT5yX29mZnNldCwgcmVsb2NhdGlvbiwKLQkJCQkJICAgICAgcmVsLT5yX2FkZGVuZCwgaW5mbywgc3ltX3NlYywKLQkJCQkJICAgICAgc3ltX25hbWUsIGggPT0gTlVMTCk7Ci0KLSAgICAgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQl7Ci0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgLyogVGhpcyBjYW4gaGFwcGVuIGZvciBEUCByZWxhdGl2ZSByZWxvY3MgaWYgJGdsb2JhbCQgaXMKLQkgICAgICAgdW5kZWZpbmVkLiAgVGhpcyBpcyBhIHBhbmljIHNpdHVhdGlvbiBzbyB3ZSBkb24ndCB0cnkKLQkgICAgICAgdG8gY29udGludWUuICAqLwotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX25vdHN1cHBvcnRlZDoKLQkgICAgICBpZiAoISgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgIChpbmZvLCAiJGdsb2JhbCQiLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgewotCQkvKiBXZSB1c2UgdGhpcyByZXR1cm4gdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBwZXJmb3JtZWQKLQkJICAgYSAiZGFuZ2Vyb3VzIiByZWxvY2F0aW9uLiAgVGhpcyBkb2Vzbid0IG1lYW4gd2UgZGlkCi0JCSAgIHRoZSB3cm9uZyB0aGluZywgaXQganVzdCBtZWFucyB0aGVyZSBtYXkgYmUgc29tZSBjbGVhbnVwCi0JCSAgIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBoZXJlLgotCi0JCSAgIEluIHBhcnRpY3VsYXIgd2UgaGFkIHRvIHN3YXAgdGhlIGxhc3QgY2FsbCBpbnNuIGFuZCBpdHMKLQkJICAgZGVsYXkgc2xvdC4gIElmIHRoZSBkZWxheSBzbG90IGluc24gbmVlZGVkIGEgcmVsb2NhdGlvbiwKLQkJICAgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkanVzdCB0aGUgbmV4dCByZWxvY2F0aW9uIGVudHJ5J3MKLQkJICAgb2Zmc2V0IHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgdGhlIGluc24gbW92ZWQuCi0KLQkJICAgVGhpcyBoYWlyIHdvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZiB3ZSBpbnNlcnRlZCBzdHVicwotCQkgICBiZXR3ZWVuIHByb2NlZHVyZXMgYW5kIHVzZWQgYSAiYmwiIHRvIGdldCB0byB0aGUgc3R1Yi4gICovCi0JCWlmIChyZWwgIT0gcmVsZW5kKQotCQkgIHsKLQkJICAgIEVsZl9JbnRlcm5hbF9SZWxhICpuZXh0X3JlbCA9IHJlbCArIDE7Ci0KLQkJICAgIGlmIChyZWwtPnJfb2Zmc2V0ICsgNCA9PSBuZXh0X3JlbC0+cl9vZmZzZXQpCi0JCSAgICAgIG5leHRfcmVsLT5yX29mZnNldCAtPSA0OwotCQkgIH0KLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgKGluZm8sIHN5bV9uYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWN0dWFsbHkgcGVyZm9ybSBhIHJlbG9jYXRpb24uICBOT1RFIHRoaXMgaXMgKG1vc3RseSkgc3VwZXJjZWVkZWQKLSAgIGJ5IGVsZjMyX2hwcGFfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgd2hpY2ggaXMgY2FsbGVkIGJ5IHRoZSBuZXcKLSAgIGZhc3QgbGlua2VyLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaHBwYV9lbGZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCWVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBJdCBpcyBubyBsb25nZXIgdmFsaWQgdG8gY2FsbCBocHBhX2VsZl9yZWxvYyB3aGVuIGNyZWF0aW5nCi0gICAgIGEgZmluYWwgZXhlY3V0YWJsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgICAgIC8qIFdvcmsgYXJvdW5kIGxvc3NhZ2UgaW4gZ2VuZXJpYyBlbGYgY29kZSB0byB3cml0ZSByZWxvY2F0aW9ucy4KLQkgKG1hcHMgZGlmZmVyZW50IHNlY3Rpb24gc3ltYm9scyBpbnRvIHRoZSBzYW1lIHN5bWJvbCBpbmRleCkuICAqLwotICAgICAgaWYgKChzeW1ib2xfaW4tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCSAgJiYgc3ltYm9sX2luLT5zZWN0aW9uKQotCXJlbG9jX2VudHJ5LT5hZGRlbmQgKz0gc3ltYm9sX2luLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIF8oIlVuc3VwcG9ydGVkIGNhbGwgdG8gaHBwYV9lbGZfcmVsb2MiKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgIH0KLX0KLQotLyogQWN0dWFsbHkgcGVyZm9ybSBhIHJlbG9jYXRpb24gYXMgcGFydCBvZiBhIGZpbmFsIGxpbmsuICBUaGlzIGNhbiBnZXQKLSAgIHJhdGhlciBoYWlyeSB3aGVuIGxpbmtlciBzdHVicyBhcmUgbmVlZGVkLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmMzJfaHBwYV9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgdmFsdWUsCi0JCQkJICAgIGFkZGVuZCwgaW5mbywgc3ltX3NlYywgc3ltX25hbWUsIGlzX2xvY2FsKQotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnN5bV9zZWM7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICBpbnQgaXNfbG9jYWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgdW5zaWduZWQgbG9uZyByX3R5cGUgPSBob3d0by0+dHlwZTsKLSAgdW5zaWduZWQgbG9uZyByX2Zvcm1hdCA9IGhvd3RvLT5iaXRzaXplOwotICB1bnNpZ25lZCBsb25nIHJfZmllbGQgPSBlX2ZzZWw7Ci0gIGJmZF9ieXRlICpoaXRfZGF0YSA9IGNvbnRlbnRzICsgb2Zmc2V0OwotICBib29sZWFuIHJfcGNyZWwgPSBob3d0by0+cGNfcmVsYXRpdmU7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEpOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsdWUgZm9yICRnbG9iYWwkLiAgRklYTUUgaXNuJ3QgdGhpcyBlZmZlY3RpdmVseQotICAgICBqdXN0IGxpa2UgdGhlIGdwIHBvaW50ZXIgb24gTUlQUz8gIENhbiB3ZSB1c2UgdGhvc2Ugcm91dGluZXMgZm9yIHRoaXMKLSAgICAgcHVycG9zZT8gICovCi0gIGlmICghZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3N5bV9kZWZpbmVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksICIkZ2xvYmFsJCIsIGZhbHNlLAotCQkJCSBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpc24ndCBhICRnbG9iYWwkLCB0aGVuIHdlJ3JlIGluIGRlZXAgdHJvdWJsZS4gICovCi0gICAgICBpZiAoaCA9PSBOVUxMKQotCXJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotCi0gICAgICAvKiBJZiAkZ2xvYmFsJCBpc24ndCBhIGRlZmluZWQgc3ltYm9sLCB0aGVuIHdlJ3JlIHN0aWxsIGluIGRlZXAKLQkgdHJvdWJsZS4gICovCi0gICAgICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQlyZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF9zeW1fZGVmaW5lZCA9IDE7Ci0gICAgfQotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfUEFSSVNDX05PTkU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9QQVJJU0NfRElSMzI6Ci0gICAgY2FzZSBSX1BBUklTQ19ESVIxN0Y6Ci0gICAgY2FzZSBSX1BBUklTQ19QQ1JFTDE3QzoKLSAgICAgIHJfZmllbGQgPSBlX2ZzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMjFMOgotICAgICAgcl9maWVsZCA9IGVfbHJzZWw7Ci0gICAgICBnb3RvIGRvX2Jhc2ljX3R5cGVfMTsKLSAgICBjYXNlIFJfUEFSSVNDX0RJUjE3UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdSOgotICAgIGNhc2UgUl9QQVJJU0NfRElSMTRSOgotICAgIGNhc2UgUl9QQVJJU0NfUENSRUwxNFI6Ci0gICAgICByX2ZpZWxkID0gZV9ycnNlbDsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotCi0gICAgLyogRm9yIGFsbCB0aGUgRFAgcmVsYXRpdmUgcmVsb2NhdGlvbnMsIHdlIG5lZWQgdG8gZXhhbWluZSB0aGUgc3ltYm9sJ3MKLSAgICAgICBzZWN0aW9uLiAgSWYgaXQncyBhIGNvZGUgc2VjdGlvbiwgdGhlbiAiZGF0YSBwb2ludGVyIHJlbGF0aXZlIiBtYWtlcwotICAgICAgIG5vIHNlbnNlLiAgSW4gdGhhdCBjYXNlIHdlIGRvbid0IGFkanVzdCB0aGUgInZhbHVlIiwgYW5kIGZvciAyMSBiaXQKLSAgICAgICBhZGRpbCBpbnN0cnVjdGlvbnMsIHdlIGNoYW5nZSB0aGUgc291cmNlIGFkZGVuZCByZWdpc3RlciBmcm9tICVkcCB0bwotICAgICAgICVyMC4gICovCi0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDIxTDoKLSAgICAgIHJfZmllbGQgPSBlX2xyc2VsOwotICAgICAgaWYgKHN5bV9zZWMtPmZsYWdzICYgU0VDX0NPREUpCi0JewotCSAgaWYgKChpbnNuICYgMHhmYzAwMDAwMCkgPj4gMjYgPT0gMHhhCi0JICAgICAgICYmIChpbnNuICYgMHgwM2UwMDAwMCkgPj4gMjEgPT0gMHgxYikKLQkgICAgaW5zbiAmPSB+MHgwM2UwMDAwMDsKLQl9Ci0gICAgICBlbHNlCi0JdmFsdWUgLT0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlIChpbmZvKS0+Z2xvYmFsX3ZhbHVlOwotICAgICAgZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgY2FzZSBSX1BBUklTQ19EUFJFTDE0UjoKLSAgICAgIHJfZmllbGQgPSBlX3Jyc2VsOwotICAgICAgaWYgKChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotICAgIGNhc2UgUl9QQVJJU0NfRFBSRUwxNEY6Ci0gICAgICByX2ZpZWxkID0gZV9mc2VsOwotICAgICAgaWYgKChzeW1fc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXZhbHVlIC09IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPmdsb2JhbF92YWx1ZTsKLSAgICAgIGdvdG8gZG9fYmFzaWNfdHlwZV8xOwotCi0gICAgLyogVGhlc2UgY2FzZXMgYXJlIHNlcGFyYXRlIGFzIHRoZXkgbWF5IGludm9sdmUgYSBsb3QgbW9yZSB3b3JrCi0gICAgICAgdG8gZGVhbCB3aXRoIGxpbmtlciBzdHVicy4gICovCi0gICAgY2FzZSBSX1BBUklTQ19QTEFCRUwzMjoKLSAgICBjYXNlIFJfUEFSSVNDX1BMQUJFTDIxTDoKLSAgICBjYXNlIFJfUEFSSVNDX1BMQUJFTDE0UjoKLSAgICBjYXNlIFJfUEFSSVNDX1BDUkVMMTdGOgotICAgICAgewotCWJmZF92bWEgbG9jYXRpb247Ci0JdW5zaWduZWQgaW50IGxlbiwgY2FsbGVyX2FyZ3MsIGNhbGxlZV9hcmdzOwotCWNoYXIgKm5ld19uYW1lLCAqc3R1Yl9uYW1lOwotCi0JLyogR2V0IHRoZSBmaWVsZCBzZWxlY3RvciByaWdodC4gIFdlJ2xsIG5lZWQgaXQgaW4gYSBtaW51dGUuICAqLwotCWlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUENSRUwxN0YKLQkgICAgfHwgcl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDMyKQotCSAgcl9maWVsZCA9IGVfZnNlbDsKLQllbHNlIGlmIChyX3R5cGUgPT0gUl9QQVJJU0NfUExBQkVMMjFMKQotCSAgcl9maWVsZCA9IGVfbHJzZWw7Ci0JZWxzZSBpZiAocl90eXBlID09IFJfUEFSSVNDX1BMQUJFTDE0UikKLQkgIHJfZmllbGQgPSBlX3Jyc2VsOwotCi0JLyogRmluZCBvdXQgd2hlcmUgd2UgYXJlIGFuZCB3aGVyZSB3ZSdyZSBnb2luZy4gICovCi0JbG9jYXRpb24gPSAob2Zmc2V0ICsKLQkJICAgIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCQkgICAgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQlsZW4gPSBzdHJsZW4gKHN5bV9uYW1lKSArIDE7Ci0JaWYgKGlzX2xvY2FsKQotCSAgbGVuICs9IDk7Ci0JbmV3X25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotCWlmICghbmV3X25hbWUpCi0JICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQlzdHJjcHkgKG5ld19uYW1lLCBzeW1fbmFtZSk7Ci0KLQkvKiBMb2NhbCBzeW1ib2xzIGhhdmUgdW5pcXVlIElEcy4gICovCi0JaWYgKGlzX2xvY2FsKQotCSAgc3ByaW50ZiAobmV3X25hbWUgKyBsZW4gLSAxMCwgIl8lMDh4IiwgKGludClzeW1fc2VjKTsKLQotCS8qIEFueSBraW5kIG9mIGxpbmtlciBzdHViIG5lZWRlZD8gICovCi0JaWYgKCgoaW50KSh2YWx1ZSAtIGxvY2F0aW9uKSA+IDB4M2ZmZmYpCi0JICAgIHx8ICgoaW50KSh2YWx1ZSAtIGxvY2F0aW9uKSA8IChpbnQpMHhmZmZjMDAwMCkpCi0JICB7Ci0JICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotCSAgICBzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfZW50cnkgKnN0dWJfaGFzaDsKLQkgICAgYXNlY3Rpb24gKnN0dWJfc2VjdGlvbjsKLQotCSAgICAvKiBCdWlsZCBhIG5hbWUgZm9yIHRoZSBzdHViLiAgKi8KLQotCSAgICBsZW4gPSBzdHJsZW4gKG5ld19uYW1lKTsKLQkgICAgbGVuICs9IDIzOwotCSAgICBzdHViX25hbWUgPSBiZmRfbWFsbG9jIChsZW4pOwotCSAgICBpZiAoIXN0dWJfbmFtZSkKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgICAgZWxmMzJfaHBwYV9uYW1lX29mX3N0dWIgKGxvY2F0aW9uLCB2YWx1ZSwgc3R1Yl9uYW1lKTsKLQkgICAgc3RyY2F0IChzdHViX25hbWUsIG5ld19uYW1lKTsKLQkgICAgZnJlZSAobmV3X25hbWUpOwotCi0JICAgIHN0dWJfaGFzaF90YWJsZSA9IGVsZjMyX2hwcGFfaGFzaF90YWJsZSAoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLQotCSAgICBzdHViX2hhc2gKLQkgICAgICA9IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCAoc3R1Yl9oYXNoX3RhYmxlLCBzdHViX25hbWUsCi0JCQkJCSAgICAgZmFsc2UsIGZhbHNlKTsKLQotCSAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhhdCBuYW1lLiAgKi8KLQkgICAgZnJlZSAoc3R1Yl9uYW1lKTsKLQotCSAgICAvKiBUaGUgc3R1YiBCRkQgb25seSBoYXMgb25lIHNlY3Rpb24uICAqLwotCSAgICBzdHViX3NlY3Rpb24gPSBzdHViX2hhc2hfdGFibGUtPnN0dWJfYmZkLT5zZWN0aW9uczsKLQotCSAgICBpZiAoc3R1Yl9oYXNoICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAocl90eXBlID09IFJfUEFSSVNDX1BDUkVMMTdGKQotCQkgIHsKLQkJICAgIHVuc2lnbmVkIGxvbmcgZGVsYXlfaW5zbjsKLQkJICAgIHVuc2lnbmVkIGludCBvcGNvZGUsIHJ0bl9yZWcsIGxkb190YXJnZXRfcmVnLCBsZG9fc3JjX3JlZzsKLQotCQkgICAgLyogV2UnbGwgbmVlZCB0byBwZWVrIGF0IHRoZSBuZXh0IGluc24uICAqLwotCQkgICAgZGVsYXlfaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgaGl0X2RhdGEgKyA0KTsKLQkJICAgIG9wY29kZSA9IGdldF9vcGNvZGUgKGRlbGF5X2luc24pOwotCi0JCSAgICAvKiBXZSBhbHNvIG5lZWQgdG8ga25vdyB0aGUgcmV0dXJuIHJlZ2lzdGVyIGZvciB0aGlzCi0JCSAgICAgICBjYWxsLiAgKi8KLQkJICAgIHJ0bl9yZWcgPSAoaW5zbiAmIDB4MDNlMDAwMDApID4+IDIxOwotCi0JCSAgICBsZG9fc3JjX3JlZyA9IChkZWxheV9pbnNuICYgMHgwM2UwMDAwMCkgPj4gMjE7Ci0JCSAgICBsZG9fdGFyZ2V0X3JlZyA9IChkZWxheV9pbnNuICYgMHgwMDFmMDAwMCkgPj4gMTY7Ci0KLQkJICAgIC8qIE11bmdlIHVwIHRoZSB2YWx1ZSBhbmQgb3RoZXIgcGFyYW1ldGVycyBmb3IKLQkJICAgICAgIGhwcGFfZWxmX3JlbG9jYXRlX2luc24uICAqLwotCi0JCSAgICB2YWx1ZSA9IChzdHViX2hhc2gtPm9mZnNldAotCQkJICAgICArIHN0dWJfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICArIHN0dWJfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0KLQkJICAgIHJfZm9ybWF0ID0gMTc7Ci0JCSAgICByX2ZpZWxkID0gZV9mc2VsOwotCQkgICAgcl9wY3JlbCA9IDA7Ci0JCSAgICBhZGRlbmQgPSAwOwotCi0JCSAgICAvKiBXZSBuZWVkIHRvIHBlZWsgYXQgdGhlIGRlbGF5IGluc24gYW5kIGRldGVybWluZSBpZgotCQkgICAgICAgd2UnbGwgbmVlZCB0byBzd2FwIHRoZSBicmFuY2ggYW5kIGl0cyBkZWxheSBpbnNuLiAgKi8KLQkJICAgIGlmICgoaW5zbiAmIDIpCi0JCQl8fCAob3Bjb2RlID09IExETwotCQkJICAgICYmIGxkb190YXJnZXRfcmVnID09IHJ0bl9yZWcpCi0JCQl8fCAoZGVsYXlfaW5zbiA9PSAweDA4MDAwMjQwKSkKLQkJICAgICAgewotCQkJLyogTm8gbmVlZCB0byBzd2FwIHRoZSBicmFuY2ggYW5kIGl0cyBkZWxheSBzbG90LCBidXQKLQkJCSAgIHdlIGRvIG5lZWQgdG8gbWFrZSBzdXJlIHRvIGp1bXAgcGFzdCB0aGUgcmV0dXJuCi0JCQkgICBwb2ludGVyIHVwZGF0ZSBpbiB0aGUgc3R1Yi4gICovCi0JCQl2YWx1ZSArPSA0OwotCi0JCQkvKiBJZiB0aGUgZGVsYXkgaW5zbiBkb2VzIGEgcmV0dXJuIHBvaW50ZXIgYWRqdXN0bWVudCwKLQkJCSAgIHRoZW4gd2UgaGF2ZSB0byBtYWtlIHN1cmUgaXQgc3RheXMgdmFsaWQuICAqLwotCQkJaWYgKG9wY29kZSA9PSBMRE8KLQkJCSAgICAmJiBsZG9fdGFyZ2V0X3JlZyA9PSBydG5fcmVnKQotCQkJICB7Ci0JCQkgICAgZGVsYXlfaW5zbiAmPSAweGZjMDBmZmZmOwotCQkJICAgIGRlbGF5X2luc24gfD0gKCgzMSA8PCAyMSkgfCAoMzEgPDwgMTYpKTsKLQkJCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGRlbGF5X2luc24sIGhpdF9kYXRhICsgNCk7Ci0JCQkgIH0KLQkJCS8qIFVzZSBhIEJMRSB0byByZWFjaCB0aGUgc3R1Yi4gICovCi0JCQlpbnNuID0gQkxFX1NSNF9SMDsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBXb25kZXJmdWwsIHdlIGhhdmUgdG8gc3dhcCB0aGUgY2FsbCBpbnNuIGFuZCBpdHMKLQkJCSAgIGRlbGF5IHNsb3QuICAqLwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBkZWxheV9pbnNuLCBoaXRfZGF0YSk7Ci0JCQkvKiBVc2UgYSBCTEUsbiB0byByZWFjaCB0aGUgc3R1Yi4gICovCi0JCQlpbnNuID0gKEJMRV9TUjRfUjAgfCAweDIpOwotCQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSArIDQpOwotCQkJaW5zbiA9IGhwcGFfZWxmX3JlbG9jYXRlX2luc24gKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJICAgICAgIGluc24sIG9mZnNldCArIDQsCi0JCQkJCQkgICAgICAgdmFsdWUsIGFkZGVuZCwKLQkJCQkJCSAgICAgICByX2Zvcm1hdCwgcl9maWVsZCwKLQkJCQkJCSAgICAgICByX3BjcmVsKTsKLQkJCS8qIFVwZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gd29yZC4gICovCi0JCQliZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGhpdF9kYXRhICsgNCk7Ci0JCQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICAgIGVsc2UKLQkJICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLQkgICAgICB9Ci0JICB9Ci0JZ290byBkb19iYXNpY190eXBlXzE7Ci0gICAgICB9Ci0KLWRvX2Jhc2ljX3R5cGVfMToKLSAgICAgIGluc24gPSBocHBhX2VsZl9yZWxvY2F0ZV9pbnNuIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGluc24sCi0JCQkJICAgICBvZmZzZXQsIHZhbHVlLCBhZGRlbmQsIHJfZm9ybWF0LAotCQkJCSAgICAgcl9maWVsZCwgcl9wY3JlbCk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNvbWV0aGluZyB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUuICAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIHRoZSBpbnN0cnVjdGlvbiB3b3JkLiAgKi8KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gIHJldHVybiAoYmZkX3JlbG9jX29rKTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgU1lNIHJlcHJlc2VudHMgYSBsb2NhbCBsYWJlbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaHBwYV9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICByZXR1cm4gKG5hbWVbMF0gPT0gJ0wnICYmIG5hbWVbMV0gPT0gJyQnKTsKLX0KLQotLyogVW5kbyB0aGUgZ2VuZXJpYyBFTEYgY29kZSdzIHN1YnRyYWN0aW9uIG9mIHNlY3Rpb24tPnZtYSBmcm9tIHRoZQotICAgdmFsdWUgb2YgZWFjaCBleHRlcm5hbCBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3A7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgKnZhbHAgKz0gKCpzZWNwKS0+dm1hOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBzdHViIG5lZWRlZCB0byBwZXJmb3JtIGEgY2FsbCBhc3N1bWluZyB0aGUKLSAgIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBmb3IgY2FsbGVyIGFuZCBjYWxsZWUgYXJlIGluIENBTExFUiBhbmQgQ0FMTEVFCi0gICBmb3IgYSBjYWxsIGZyb20gTE9DQVRJT04gdG8gREVTVElOQVRJT04uICBDb3B5IHRoZSBuYW1lIGludG8gU1RVQl9OQU1FLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChsb2NhdGlvbiwgZGVzdGluYXRpb24sIHN0dWJfbmFtZSkKLSAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247Ci0gICAgIGNoYXIgKnN0dWJfbmFtZTsKLXsKLSAgc3RyY3B5IChzdHViX25hbWUsICJfX19fX2xvbmdfYnJhbmNoX3N0dWJfIik7Ci19Ci0KLS8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHN0dWIgbmVlZGVkIHRvIGNhbGwgZnJvbSBMT0NBVElPTiB0byBERVNUSU5BVElPTgotICAgKGEgZnVuY3Rpb24gbmFtZWQgU1lNX05BTUUpLCB3aXRoIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBDQUxMRVIgYW5kCi0gICBDQUxMRUUuICBSZXR1cm4gemVybyBpZiBubyBzdHViIGlzIG5lZWRlZCB0byBwZXJmb3JtIHN1Y2ggYSBjYWxsLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZWxmMzJfaHBwYV9zaXplX29mX3N0dWIgKGxvY2F0aW9uLCBkZXN0aW5hdGlvbiwgc3ltX25hbWUpCi0gICAgIGJmZF92bWEgbG9jYXRpb24sIGRlc3RpbmF0aW9uOwotICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLXsKLSAgLyogRGV0ZXJtaW5lIGlmIGEgbG9uZyBicmFuY2ggc3R1YiBpcyBuZWVkZWQuICAqLwotICBpZiAoISgoKGludCkobG9jYXRpb24gLSBkZXN0aW5hdGlvbikgPiAweDNmZmZmKQotCXx8ICgoaW50KShsb2NhdGlvbiAtIGRlc3RpbmF0aW9uKSA8IChpbnQpMHhmZmZjMDAwMCkpKQotICAgIHJldHVybiAwOwotCi0gIGlmICghc3RybmNtcCAoIiQkIiwgc3ltX25hbWUsIDIpCi0gICAgICAmJiBzdHJjbXAgKCIkJGR5bmNhbGwiLCBzeW1fbmFtZSkpCi0gICAgcmV0dXJuIDEyOwotICBlbHNlCi0gICAgcmV0dXJuIDE2OwotfQotCi0vKiBCdWlsZCBvbmUgbGlua2VyIHN0dWIgYXMgZGVmaW5lZCBieSB0aGUgc3R1YiBoYXNoIHRhYmxlIGVudHJ5IEdFTl9FTlRSWS4KLSAgIElOX0FSR1MgY29udGFpbnMgdGhlIHN0dWIgQkZEIGFuZCBsaW5rIGluZm8gcG9pbnRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiAoZ2VuX2VudHJ5LCBpbl9hcmdzKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmdlbl9lbnRyeTsKLSAgICAgUFRSIGluX2FyZ3M7Ci17Ci0gIHZvaWQgKiphcmdzID0gKHZvaWQgKiopaW5fYXJnczsKLSAgYmZkICpzdHViX2JmZCA9IChiZmQgKilhcmdzWzBdOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKWFyZ3NbMV07Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlOwotICBiZmRfYnl0ZSAqbG9jOwotICBzeW12YWx1ZSBzeW1fdmFsdWU7Ci0gIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0gIC8qIEluaXRpYWxpemUgcG9pbnRlcnMgdG8gdGhlIHN0dWIgaGFzaCB0YWJsZSwgdGhlIHBhcnRpY3VsYXIgZW50cnkgd2UKLSAgICAgYXJlIGJ1aWxkaW5nIGEgc3R1YiBmb3IsIGFuZCB3aGVyZSAoaW4gbWVtb3J5KSB3ZSBzaG91bGQgcGxhY2UgdGhlIHN0dWIKLSAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgZW50cnkgPSAoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2VudHJ5ICopZ2VuX2VudHJ5OwotICBzdHViX2hhc2hfdGFibGUgPSBlbGYzMl9ocHBhX2hhc2hfdGFibGUoaW5mbyktPnN0dWJfaGFzaF90YWJsZTsKLSAgbG9jID0gc3R1Yl9oYXNoX3RhYmxlLT5sb2NhdGlvbjsKLQotICAvKiBNYWtlIGEgbm90ZSBvZiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgc3R1YnMgZm9yIHRoaXMgZW50cnkuICAqLwotICBlbnRyeS0+b2Zmc2V0ID0gc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQ7Ci0KLSAgLyogVGhlIHN5bWJvbCdzIG5hbWUgc3RhcnRzIGF0IG9mZnNldCAyMi4gICovCi0gIHN5bV9uYW1lID0gZW50cnktPnJvb3Quc3RyaW5nICsgMjI7Ci0KLSAgc3ltX3ZhbHVlID0gKGVudHJ5LT50YXJnZXRfdmFsdWUKLQkgICAgICAgKyBlbnRyeS0+dGFyZ2V0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkgICAgICAgKyBlbnRyeS0+dGFyZ2V0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCi0gIGlmICgxKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBvbmUgb2YgdHdvIHZhcmlhbnQgbG9uZyBicmFuY2ggc3R1YnMuICBPbmUgZm9yICQkZHluY2FsbCBhbmQKLQkgbm9ybWFsIGNhbGxzLCB0aGUgb3RoZXIgZm9yIGNhbGxzIHRvIG1pbGxpY29kZS4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgICBpbnQgbWlsbGljb2RlX2NhbGwgPSAwOwotCi0gICAgICBpZiAoIXN0cm5jbXAgKCIkJCIsIHN5bV9uYW1lLCAyKSAmJiBzdHJjbXAgKCIkJGR5bmNhbGwiLCBzeW1fbmFtZSkpCi0JbWlsbGljb2RlX2NhbGwgPSAxOwotCi0gICAgICAvKiBGaXJzdCB0aGUgcmV0dXJuIHBvaW50ZXIgYWRqdXN0bWVudC4gIERlcGVuZGluZyBvbiBleGFjdCBjYWxsaW5nCi0JIHNlcXVlbmNlIHRoaXMgaW5zdHJ1Y3Rpb24gbWF5IGJlIHNraXBwZWQuICAqLwotICAgICAgYmZkX3B1dF8zMiAoc3R1Yl9iZmQsIExET19NNF9SMzFfUjMxLCBsb2MpOwotCi0gICAgICAvKiBUaGUgbmV4dCB0d28gaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgbG9uZyBicmFuY2ggaXRzZWxmLiAgQSBsb25nIGJyYW5jaAotCSBpcyBmb3JtZWQgd2l0aCAibGRpbCIgbG9hZGluZyB0aGUgdXBwZXIgYml0cyBvZiB0aGUgdGFyZ2V0IGFkZHJlc3MKLQkgaW50byBhIHJlZ2lzdGVyLCB0aGVuIGJyYW5jaGluZyB3aXRoICJiZSIgd2hpY2ggYWRkcyBpbiB0aGUgbG93ZXIgYml0cy4KLQkgTG9uZyBicmFuY2hlcyB0byBtaWxsaWNvZGUgbnVsbGlmeSB0aGUgZGVsYXkgc2xvdCBvZiB0aGUgImJlIi4gICovCi0gICAgICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLCBMRElMX1IxLAotCQkJCWhwcGFfZmllbGRfYWRqdXN0IChzeW1fdmFsdWUsIDAsIGVfbHJzZWwpLCAyMSk7Ci0gICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jICsgNCk7Ci0gICAgICBpbnNuID0gaHBwYV9yZWJ1aWxkX2luc24gKHN0dWJfYmZkLCBCRV9TUjRfUjEgfCAobWlsbGljb2RlX2NhbGwgPyAyIDogMCksCi0JCQkJaHBwYV9maWVsZF9hZGp1c3QgKHN5bV92YWx1ZSwgMCwgZV9ycnNlbCkgPj4gMiwKLQkJCQkxNyk7Ci0gICAgICBiZmRfcHV0XzMyIChzdHViX2JmZCwgaW5zbiwgbG9jICsgOCk7Ci0KLSAgICAgIGlmICghbWlsbGljb2RlX2NhbGwpCi0JewotCSAgLyogVGhlIHNlcXVlbmNlIHRvIGNhbGwgdGhpcyBzdHViIHBsYWNlcyB0aGUgcmV0dXJuIHBvaW50ZXIgaW50byAlcjMxLAotCSAgICAgdGhlIGZpbmFsIHRhcmdldCBleHBlY3RzIHRoZSByZXR1cm4gcG9pbnRlciBpbiAlcjIsIHNvIGNvcHkgdGhlCi0JICAgICAgcmV0dXJuIHBvaW50ZXIgaW50byB0aGUgcHJvcGVyIHJlZ2lzdGVyLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0dWJfYmZkLCBDT1BZX1IzMV9SMiwgbG9jICsgMTIpOwotCi0JICAvKiBVcGRhdGUgdGhlIGxvY2F0aW9uIGFuZCBvZmZzZXRzLiAgKi8KLQkgIHN0dWJfaGFzaF90YWJsZS0+bG9jYXRpb24gKz0gMTY7Ci0JICBzdHViX2hhc2hfdGFibGUtPm9mZnNldCArPSAxNjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXBkYXRlIHRoZSBsb2NhdGlvbiBhbmQgb2Zmc2V0cy4gICovCi0JICBzdHViX2hhc2hfdGFibGUtPmxvY2F0aW9uICs9IDEyOwotCSAgc3R1Yl9oYXNoX3RhYmxlLT5vZmZzZXQgKz0gMTI7Ci0JfQotCi0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRXh0ZXJuYWwgZW50cnkgcG9pbnRzIGZvciBzaXppbmcgYW5kIGJ1aWxkaW5nIGxpbmtlciBzdHVicy4gICovCi0KLS8qIEJ1aWxkIGFsbCB0aGUgc3R1YnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG91dHB1dCBmaWxlLiAgVGhlCi0gICBzdHVicyBhcmUga2VwdCBpbiBhIGhhc2ggdGFibGUgYXR0YWNoZWQgdG8gdGhlIG1haW4gbGlua2VyIGhhc2gKLSAgIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgdmlhIGhwcGFlbGZfZmluaXNoIGluIHRoZSBsaW5rZXIuICAqLwotCi1ib29sZWFuCi1lbGYzMl9ocHBhX2J1aWxkX3N0dWJzIChzdHViX2JmZCwgaW5mbykKLSAgICAgYmZkICpzdHViX2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIC8qIFRoZSBzdHViIEJGRCBvbmx5IGhhcyBvbmUgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpzdHViX3NlYyA9IHN0dWJfYmZkLT5zZWN0aW9uczsKLSAgc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICp0YWJsZTsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHZvaWQgKmFyZ3NbMl07Ci0KLSAgLyogU28gd2UgY2FuIHBhc3MgYm90aCB0aGUgQkZEIGZvciB0aGUgc3R1YnMgYW5kIHRoZSBsaW5rIGluZm8KLSAgICAgc3RydWN0dXJlIHRvIHRoZSByb3V0aW5lIHdoaWNoIGFjdHVhbGx5IGJ1aWxkcyBzdHVicy4gICovCi0gIGFyZ3NbMF0gPSBzdHViX2JmZDsKLSAgYXJnc1sxXSA9IGluZm87Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIGxpbmtlciBzdHVicy4gICovCi0gIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMpOwotICBzdHViX3NlYy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChzdHViX2JmZCwgc2l6ZSk7Ci0gIGlmIChzdHViX3NlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHRhYmxlID0gZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGluZm8pLT5zdHViX2hhc2hfdGFibGU7Ci0gIHRhYmxlLT5sb2NhdGlvbiA9IHN0dWJfc2VjLT5jb250ZW50czsKLQotICAvKiBCdWlsZCB0aGUgc3R1YnMgYXMgZGlyZWN0ZWQgYnkgdGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0gIGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RyYXZlcnNlICh0YWJsZSwgZWxmMzJfaHBwYV9idWlsZF9vbmVfc3R1YiwgYXJncyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERldGVybWluZSBhbmQgc2V0IHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gZm9yIGEgZmluYWwgbGluay4KLQotICAgVGhlIGJhc2ljIGlkZWEgaGVyZSBpcyB0byBleGFtaW5lIGFsbCB0aGUgcmVsb2NhdGlvbnMgbG9va2luZyBmb3IKLSAgIFBDLXJlbGF0aXZlIGNhbGxzIHRvIGEgdGFyZ2V0IHRoYXQgaXMgdW5yZWFjaGFibGUgd2l0aCBhICJibCIKLSAgIGluc3RydWN0aW9uIG9yIGNhbGxzIHdoZXJlIHRoZSBjYWxsZXIgYW5kIGNhbGxlZSBkaXNhZ3JlZSBvbiB0aGUKLSAgIGxvY2F0aW9uIG9mIHRoZWlyIGFyZ3VtZW50cyBvciByZXR1cm4gdmFsdWUuICAqLwotCi1ib29sZWFuCi1lbGYzMl9ocHBhX3NpemVfc3R1YnMgKHN0dWJfYmZkLCBvdXRwdXRfYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqc3R1Yl9iZmQ7Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgYmZkICppbnB1dF9iZmQ7Ci0gIGFzZWN0aW9uICpzZWN0aW9uLCAqc3R1Yl9zZWMgPSAwOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltcywgKmlzeW0sICoqYWxsX2xvY2FsX3N5bXM7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0X3N5bXMsICplc3ltOwotICB1bnNpZ25lZCBpbnQgaSwgaW5kZXgsIGJmZF9jb3VudCA9IDA7Ci0gIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF90YWJsZSAqc3R1Yl9oYXNoX3RhYmxlID0gMDsKLQotICAvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIHN0dWIgaGFzaCB0YWJsZS4gICovCi0gIHN0dWJfaGFzaF90YWJsZSA9ICgoc3RydWN0IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX3RhYmxlICopCi0JCSAgICAgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGUpKSk7Ci0gIGlmICghc3R1Yl9oYXNoX3RhYmxlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmICghZWxmMzJfaHBwYV9zdHViX2hhc2hfdGFibGVfaW5pdCAoc3R1Yl9oYXNoX3RhYmxlLCBzdHViX2JmZCwKLQkJCQkJZWxmMzJfaHBwYV9zdHViX2hhc2hfbmV3ZnVuYykpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogQXR0YWNoIHRoZSBoYXNoIHRhYmxlcyB0byB0aGUgbWFpbiBoYXNoIHRhYmxlLiAgKi8KLSAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPnN0dWJfaGFzaF90YWJsZSA9IHN0dWJfaGFzaF90YWJsZTsKLQotICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGlucHV0IEJGRHMuICAqLwotICBmb3IgKGlucHV0X2JmZCA9IGxpbmtfaW5mby0+aW5wdXRfYmZkczsKLSAgICAgICBpbnB1dF9iZmQgIT0gTlVMTDsKLSAgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9iZmQtPmxpbmtfbmV4dCkKLSAgICAgYmZkX2NvdW50Kys7Ci0KLSAgLyogTWFnaWMgYXMgd2Uga25vdyB0aGUgc3R1YiBiZmQgb25seSBoYXMgb25lIHNlY3Rpb24uICAqLwotICBzdHViX3NlYyA9IHN0dWJfYmZkLT5zZWN0aW9uczsKLQotICAvKiBJZiBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlLCB0aGVuIHdlIGRvbid0Ci0gICAgIGhhdmUgdG8gZXhhbWluZSB0aGUgcmVsb2NzLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0gICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSBhcmd1bWVudCBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYWxsIHRoZSBnbG9iYWwKLSAgICAgZnVuY3Rpb25zIHdlIGNhbiBzdGFydCBsb29raW5nIGZvciBzdHVicy4gICovCi0gIGZvciAoaW5wdXRfYmZkID0gbGlua19pbmZvLT5pbnB1dF9iZmRzLCBpbmRleCA9IDA7Ci0gICAgICAgaW5wdXRfYmZkICE9IE5VTEw7Ci0gICAgICAgaW5wdXRfYmZkID0gaW5wdXRfYmZkLT5saW5rX25leHQsIGluZGV4KyspCi0gICAgewotICAgICAgLyogV2UnbGwgbmVlZCB0aGUgc3ltYm9sIHRhYmxlIGluIGEgc2Vjb25kLiAgKi8KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICAgICAgaWYgKHN5bXRhYl9oZHItPnNoX2luZm8gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgbG9jYWxfc3ltcyA9IGFsbF9sb2NhbF9zeW1zW2luZGV4XTsKLQotICAgICAgLyogV2FsayBvdmVyIGVhY2ggc2VjdGlvbiBhdHRhY2hlZCB0byB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgICAgIGZvciAoc2VjdGlvbiA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgc2VjdGlvbiAhPSBOVUxMOwotCSAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICppbnB1dF9yZWxfaGRyOwotCSAgRWxmMzJfRXh0ZXJuYWxfUmVsYSAqZXh0ZXJuYWxfcmVsb2NzLCAqZXJlbGFlbmQsICplcmVsYTsKLQkgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MsICppcmVsYWVuZCwgKmlyZWxhOwotCi0JICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcywgdGhlbiB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uICAqLwotCSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgICAgIHx8IHNlY3Rpb24tPnJlbG9jX2NvdW50ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGV4dGVybmFsIHJlbG9jYXRpb25zLiAgKi8KLQkgIGV4dGVybmFsX3JlbG9jcwotCSAgICA9ICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCSAgICAgICBiZmRfbWFsbG9jIChzZWN0aW9uLT5yZWxvY19jb3VudAotCQkJICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpKSk7Ci0JICBpZiAoZXh0ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0JCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICBmcmVlIChhbGxfbG9jYWxfc3ltc1tpXSk7Ci0JICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIExpa2V3aXNlIGZvciB0aGUgaW50ZXJuYWwgcmVsb2NhdGlvbnMuICAqLwotCSAgaW50ZXJuYWxfcmVsb2NzCi0JICAgID0gKChFbGZfSW50ZXJuYWxfUmVsYSAqKQotCSAgICAgICBiZmRfbWFsbG9jIChzZWN0aW9uLT5yZWxvY19jb3VudCAqIHNpemVvZiAoRWxmX0ludGVybmFsX1JlbGEpKSk7Ci0JICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgcmVsb2NzLiAgKi8KLQkgIGlucHV0X3JlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbF9oZHI7Ci0JICBpZiAoYmZkX3NlZWsgKGlucHV0X2JmZCwgaW5wdXRfcmVsX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IGJmZF9yZWFkIChleHRlcm5hbF9yZWxvY3MsIDEsIGlucHV0X3JlbF9oZHItPnNoX3NpemUsCi0JCQkgICBpbnB1dF9iZmQpICE9IGlucHV0X3JlbF9oZHItPnNoX3NpemUpCi0JICAgIHsKLQkgICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQlpZiAoYWxsX2xvY2FsX3N5bXNbaV0pCi0JCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICAvKiBTd2FwIGluIHRoZSByZWxvY3MuICAqLwotCSAgZXJlbGEgPSBleHRlcm5hbF9yZWxvY3M7Ci0JICBlcmVsYWVuZCA9IGVyZWxhICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLQkgIGZvciAoOyBlcmVsYSA8IGVyZWxhZW5kOyBlcmVsYSsrLCBpcmVsYSsrKQotCSAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2FfaW4gKGlucHV0X2JmZCwgZXJlbGEsIGlyZWxhKTsKLQotCSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBleHRlcm5hbCByZWxvY3MsIGZyZWUgdGhlbS4gICovCi0JICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotCi0JICAvKiBOb3cgZXhhbWluZSBlYWNoIHJlbG9jYXRpb24uICAqLwotCSAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBpcmVsYWVuZCA9IGlyZWxhICsgc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKykKLQkgICAgewotCSAgICAgIGxvbmcgcl90eXBlLCBzaXplX29mX3N0dWI7Ci0JICAgICAgdW5zaWduZWQgbG9uZyByX2luZGV4OwotCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoYXNoOwotCSAgICAgIHN0cnVjdCBlbGYzMl9ocHBhX3N0dWJfaGFzaF9lbnRyeSAqc3R1Yl9oYXNoOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQkgICAgICBjb25zdCBjaGFyICpzeW1fbmFtZTsKLQkgICAgICBzeW12YWx1ZSBzeW1fdmFsdWU7Ci0JICAgICAgYmZkX3ZtYSBsb2NhdGlvbiwgZGVzdGluYXRpb247Ci0JICAgICAgY2hhciAqbmV3X25hbWUgPSBOVUxMOwotCi0JICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpcmVsYS0+cl9pbmZvKTsKLQkgICAgICByX2luZGV4ID0gRUxGMzJfUl9TWU0gKGlyZWxhLT5yX2luZm8pOwotCi0JICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfUEFSSVNDX1VOSU1QTEVNRU5URUQpCi0JCXsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCQkgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgIGZyZWUgKGFsbF9sb2NhbF9zeW1zKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogT25seSBsb29rIGZvciBzdHVicyBvbiBjYWxsIGluc3RydWN0aW9ucyBvciBwbGFiZWwKLQkJIHJlZmVyZW5jZXMuICAqLwotCSAgICAgIGlmIChyX3R5cGUgIT0gUl9QQVJJU0NfUENSRUwxN0YKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMzIKLQkJICAmJiByX3R5cGUgIT0gUl9QQVJJU0NfUExBQkVMMjFMCi0JCSAgJiYgcl90eXBlICE9IFJfUEFSSVNDX1BMQUJFTDE0UikKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBOb3cgZGV0ZXJtaW5lIHRoZSBjYWxsIHRhcmdldCwgaXRzIG5hbWUsIHZhbHVlLCBzZWN0aW9uCi0JCSBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbiBiaXRzLiAgKi8KLQkgICAgICBoYXNoID0gTlVMTDsKLQkgICAgICBzeW0gPSBOVUxMOwotCSAgICAgIHN5bV9zZWMgPSBOVUxMOwotCSAgICAgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJewotCQkgIC8qIEl0J3MgYSBsb2NhbCBzeW1ib2wuICAqLwotCQkgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0KLQkJICBzeW0gPSBsb2NhbF9zeW1zICsgcl9pbmRleDsKLQkJICBoZHIgPSBlbGZfZWxmc2VjdGlvbnMgKGlucHV0X2JmZClbc3ltLT5zdF9zaG5keF07Ci0JCSAgc3ltX3NlYyA9IGhkci0+YmZkX3NlY3Rpb247Ci0JCSAgc3ltX25hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgICBzeW0tPnN0X25hbWUpOwotCQkgIHN5bV92YWx1ZSA9IChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTgotCQkJICAgICAgID8gMCA6IHN5bS0+c3RfdmFsdWUpOwotCQkgIGRlc3RpbmF0aW9uID0gKHN5bV92YWx1ZQotCQkJCSArIHN5bV9zZWMtPm91dHB1dF9vZmZzZXQKLQkJCQkgKyBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQotCQkgIC8qIFRhY2sgb24gYW4gSUQgc28gd2UgY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgbG9jYWwKLQkJICAgICBzeW1ib2wgaW4gdGhlIHN0dWIgb3IgYXJnIGluZm8gaGFzaCB0YWJsZXMuICAqLwotCQkgIG5ld19uYW1lID0gYmZkX21hbGxvYyAoc3RybGVuIChzeW1fbmFtZSkgKyAxMCk7Ci0JCSAgaWYgKG5ld19uYW1lID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIHNwcmludGYgKG5ld19uYW1lLCAiJXNfJTA4eCIsIHN5bV9uYW1lLCAoaW50KXN5bV9zZWMpOwotCQkgIHN5bV9uYW1lID0gbmV3X25hbWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBJdCdzIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JCSAgbG9uZyBpbmRleDsKLQotCQkgIGluZGV4ID0gcl9pbmRleCAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JCSAgaGFzaCA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZGV4XTsKLQkJICBpZiAoaGFzaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoYXNoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICAgewotCQkgICAgICBzeW1fc2VjID0gaGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgICBzeW1fbmFtZSA9IGhhc2gtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCSAgICAgIHN5bV92YWx1ZSA9IGhhc2gtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICAgIGRlc3RpbmF0aW9uID0gKHN5bV92YWx1ZQotCQkJCSAgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICArIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICAvKiBOb3cgZGV0ZXJtaW5lIHdoZXJlIHRoZSBjYWxsIHBvaW50IGlzLiAgKi8KLQkgICAgICBsb2NhdGlvbiA9IChzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICsgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICArIGlyZWxhLT5yX29mZnNldCk7Ci0KLQkgICAgICAvKiBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGRlc3RpbmF0aW9uIGZvciBQQ1JFTCBmdW5jdGlvbgotCQkgY2FsbHMgKGVnLiB3ZSBkb24ndCBjYXJlIGZvciBQTEFCRUxTKS4gICovCi0JICAgICAgaWYgKHJfdHlwZSAhPSBSX1BBUklTQ19QQ1JFTDE3RikKLQkJbG9jYXRpb24gPSBkZXN0aW5hdGlvbjsKLQotCSAgICAgIC8qIERldGVybWluZSB3aGF0IChpZiBhbnkpIGxpbmtlciBzdHViIGlzIG5lZWRlZCBhbmQgaXRzCi0JCSBzaXplIChpbiBieXRlcykuICAqLwotCSAgICAgIHNpemVfb2Zfc3R1YiA9IGVsZjMyX2hwcGFfc2l6ZV9vZl9zdHViIChsb2NhdGlvbiwKLQkJCQkJCSAgICAgIGRlc3RpbmF0aW9uLAotCQkJCQkJICAgICAgc3ltX25hbWUpOwotCSAgICAgIGlmIChzaXplX29mX3N0dWIgIT0gMCkKLQkJewotCQkgIGNoYXIgKnN0dWJfbmFtZTsKLQkJICB1bnNpZ25lZCBpbnQgbGVuOwotCi0JCSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoaXMgc3R1Yi4gICovCi0JCSAgbGVuID0gc3RybGVuIChzeW1fbmFtZSk7Ci0JCSAgbGVuICs9IDIzOwotCi0JCSAgc3R1Yl9uYW1lID0gYmZkX21hbGxvYyAobGVuKTsKLQkJICBpZiAoIXN0dWJfbmFtZSkKLQkJICAgIHsKLQkJICAgICAgLyogQmVjYXVzZSBzeW1fbmFtZSB3YXMgbWFsbG9jZCBhYm92ZSBmb3IgbG9jYWwKLQkJCSBzeW1ib2xzLiAgKi8KLQkJICAgICAgaWYgKHJfaW5kZXggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCQkJZnJlZSAobmV3X25hbWUpOwotCi0JCSAgICAgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JCSAgICAgIGZvciAoaSA9IDA7IGkgPCBiZmRfY291bnQ7IGkrKykKLQkJCWlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotCQkgICAgICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0JCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgfQotCQkgIGVsZjMyX2hwcGFfbmFtZV9vZl9zdHViIChsb2NhdGlvbiwgZGVzdGluYXRpb24sIHN0dWJfbmFtZSk7Ci0JCSAgc3RyY2F0IChzdHViX25hbWUgKyAyMiwgc3ltX25hbWUpOwotCi0JCSAgLyogQmVjYXVzZSBzeW1fbmFtZSB3YXMgbWFsbG9jZWQgYWJvdmUgZm9yIGxvY2FsIHN5bWJvbHMuICAqLwotCQkgIGlmIChyX2luZGV4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkJICAgIGZyZWUgKG5ld19uYW1lKTsKLQotCQkgIHN0dWJfaGFzaAotCQkgICAgPSBlbGYzMl9ocHBhX3N0dWJfaGFzaF9sb29rdXAgKHN0dWJfaGFzaF90YWJsZSwgc3R1Yl9uYW1lLAotCQkJCQkJICAgZmFsc2UsIGZhbHNlKTsKLQkJICBpZiAoc3R1Yl9oYXNoICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBwcm9wZXIgc3R1YiBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIG5vdGhpbmcKLQkJCSBlbHNlIHRvIGRvLiAgKi8KLQkJICAgICAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChzdHViX2JmZCwgc3R1Yl9zZWMsCi0JCQkJCSAgICAoYmZkX3NlY3Rpb25fc2l6ZSAoc3R1Yl9iZmQsCi0JCQkJCQkJICAgICAgIHN0dWJfc2VjKQotCQkJCQkgICAgICsgc2l6ZV9vZl9zdHViKSk7Ci0KLQkJICAgICAgLyogRW50ZXIgdGhpcyBlbnRyeSBpbnRvIHRoZSBsaW5rZXIgc3R1YiBoYXNoIHRhYmxlLiAgKi8KLQkJICAgICAgc3R1Yl9oYXNoCi0JCQk9IGVsZjMyX2hwcGFfc3R1Yl9oYXNoX2xvb2t1cCAoc3R1Yl9oYXNoX3RhYmxlLAotCQkJCQkJICAgICAgIHN0dWJfbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCSAgICAgIGlmIChzdHViX2hhc2ggPT0gTlVMTCkKLQkJCXsKLQkJCSAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJCSAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQkJCSAgZm9yIChpID0gMDsgaSA8IGJmZF9jb3VudDsgaSsrKQotCQkJICAgIGlmIChhbGxfbG9jYWxfc3ltc1tpXSkKLQkJCSAgICAgIGZyZWUgKGFsbF9sb2NhbF9zeW1zW2ldKTsKLQkJCSAgZnJlZSAoYWxsX2xvY2FsX3N5bXMpOwotCQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJCX0KLQotCQkgICAgICAvKiBXZSdsbCBuZWVkIHRoZXNlIHRvIGRldGVybWluZSB0aGUgYWRkcmVzcyB0aGF0IHRoZQotCQkJIHN0dWIgd2lsbCBicmFuY2ggdG8uICAqLwotCQkgICAgICBzdHViX2hhc2gtPnRhcmdldF92YWx1ZSA9IHN5bV92YWx1ZTsKLQkJICAgICAgc3R1Yl9oYXNoLT50YXJnZXRfc2VjdGlvbiA9IHN5bV9zZWM7Ci0JCSAgICB9Ci0JCSAgZnJlZSAoc3R1Yl9uYW1lKTsKLQkJfQotCSAgICB9Ci0JICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIGludGVybmFsIHJlbG9jcywgZnJlZSB0aGVtLiAgKi8KLQkgIGZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0JfQotICAgIH0KLSAgLyogV2UncmUgZG9uZSB3aXRoIHRoZSBsb2NhbCBzeW1ib2xzLCBmcmVlIHRoZW0uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgYmZkX2NvdW50OyBpKyspCi0gICAgaWYgKGFsbF9sb2NhbF9zeW1zW2ldKQotICAgICAgZnJlZSAoYWxsX2xvY2FsX3N5bXNbaV0pOwotICBmcmVlIChhbGxfbG9jYWxfc3ltcyk7Ci0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIC8qIFJldHVybiBncmFjZWZ1bGx5LCBhdm9pZGluZyBkYW5nbGluZyByZWZlcmVuY2VzIHRvIHRoZSBoYXNoIHRhYmxlcy4gICovCi0gIGlmIChzdHViX2hhc2hfdGFibGUpCi0gICAgewotICAgICAgZWxmMzJfaHBwYV9oYXNoX3RhYmxlKGxpbmtfaW5mbyktPnN0dWJfaGFzaF90YWJsZSA9IE5VTEw7Ci0gICAgICBmcmVlIChzdHViX2hhc2hfdGFibGUpOwotICAgIH0KLSAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gdG8gemVybyBzaW5jZSB3ZSdyZSBuZXZlciBnb2luZwotICAgICB0byBjcmVhdGUgdGhlbS4gICBBdm9pZHMgbG9zaW5nIHdoZW4gd2UgdHJ5IHRvIGdldCBpdHMgY29udGVudHMKLSAgICAgdG9vLiAgKi8KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0dWJfYmZkLCBzdHViX3NlYywgMCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTWlzYyBCRkQgc3VwcG9ydCBjb2RlLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJZWxmX2hwcGFfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCWhwcGFfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8gICAgICAgICAgICAgICAJZWxmX2hwcGFfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgICAgICAgICAgIAllbGZfaHBwYV9pbmZvX3RvX2hvd3RvX3JlbAotCi0vKiBTdHVmZiBmb3IgdGhlIEJGRCBsaW5rZXIuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQllbGYzMl9ocHBhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQllbGYzMl9ocHBhX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotICBlbGYzMl9ocHBhX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX2hwcGFfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLWhwcGEiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9ocHBhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUEFSSVNDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1ocHBhLmggYi9iZmQvZWxmMzItaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDk5YWE4Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiBFTEYzMi9IUFBBIHN1cHBvcnQKLQotICAgVGhpcyBmaWxlIGNvbnRhaW5zIEVMRjMyL0hQUEEgcmVsb2NhdGlvbiBzdXBwb3J0IGFzIHNwZWNpZmllZAotICAgaW4gdGhlIFN0cmF0dXMgRlRYL0dvbGYgT2JqZWN0IEZpbGUgRm9ybWF0IChTRUQtMTc2MikgZGF0ZWQKLSAgIEZlYnJ1YXJ5IDE5OTQuCi0KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnk6Ci0KLSAgIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZQotICAgRGVwYXJ0bWVudCBvZiBDb21wdXRlciBTY2llbmNlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWgKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEYzMl9IUFBBX0gKLSNkZWZpbmUgX0VMRjMyX0hQUEFfSAotCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImxpYmhwcGEuaCIKLSNpbmNsdWRlICJlbGYvaHBwYS5oIgotCi1ib29sZWFuIGVsZjMyX2hwcGFfc2l6ZV9zdHVicwotICBQQVJBTVMgKChiZmQgKiwgYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotYm9vbGVhbiBlbGYzMl9ocHBhX2J1aWxkX3N0dWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIERlZmluZSBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAotICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAotICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KLQotICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgotICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2NhdGlvbgotICAgYXMgYXBwcm9wcmlhdGUuICBUaGlzIGFsbG93cyBHQVMgdG8gc2hhcmUgbXVjaCBtb3JlIGNvZGUKLSAgIGJldHdlZW4gdGhlIHR3byB0YXJnZXQgb2JqZWN0IGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIFJfSFBQQV9OT05FCQkJUl9QQVJJU0NfTk9ORQotI2RlZmluZSBSX0hQUEEJCQkJUl9QQVJJU0NfRElSMzIKLSNkZWZpbmUgUl9IUFBBX0dPVE9GRgkJCVJfUEFSSVNDX0RQUkVMMjFMCi0jZGVmaW5lIFJfSFBQQV9QQ1JFTF9DQUxMCQlSX1BBUklTQ19QQ1JFTDIxTAotI2RlZmluZSBSX0hQUEFfQUJTX0NBTEwJCQlSX1BBUklTQ19ESVIxN0YKLSNkZWZpbmUgUl9IUFBBX0NPTVBMRVgJCQlSX1BBUklTQ19VTklNUExFTUVOVEVECi0KLSNlbmRpZiAvKiBfRUxGMzJfSFBQQV9IICovCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTM4Ni5jIGIvYmZkL2VsZjMyLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0OTZiMS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0MyArMCwwIEBACi0vKiBJbnRlbCA4MDM4Ni84MDQ4Ni1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5My0xOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmX2kzODZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmX2kzODZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIGVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9pc19sb2NhbF9sYWJlbF9uYW1lIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9pMzg2X2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogMzg2IHVzZXMgUkVMIHJlbG9jYXRpb25zIGluc3RlYWQgb2YgUkVMQSAqLwotCi0jaW5jbHVkZSAiZWxmL2kzODYuaCIKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hvd3RvX3RhYmxlW109Ci17Ci0gIEhPV1RPKFJfMzg2X05PTkUsCSAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9OT05FIiwJICAgIHRydWUsMHgwMDAwMDAwMCwweDAwMDAwMDAwLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfMzIsCSAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl8zMiIsCSAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDMzIsCSAwLDIsMzIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzMyIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSXzM4Nl9HT1QzMiwJIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVDMyIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzM4Nl9QTFQzMiwJIDAsMiwzMix0cnVlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfUExUMzIiLCAgICB0cnVlLDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfQ09QWSwgICAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9DT1BZIiwJICAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR0xPQl9EQVQsICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HTE9CX0RBVCIsIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfSlVNUF9TTE9ULCAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9KVU1QX1NMT1QiLHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfUkVMQVRJVkUsICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9SRUxBVElWRSIsIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR09UT0ZGLCAgICAwLDIsMzIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9HT1RPRkYiLCAgIHRydWUsMHhmZmZmZmZmZiwweGZmZmZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl8zODZfR09UUEMsICAgICAwLDIsMzIsdHJ1ZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X0dPVFBDIiwgICAgdHJ1ZSwweGZmZmZmZmZmLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIHsgMTEgfSwKLSAgeyAxMiB9LAotICB7IDEzIH0sCi0gIHsgMTQgfSwKLSAgeyAxNSB9LAotICB7IDE2IH0sCi0gIHsgMTcgfSwKLSAgeyAxOCB9LAotICB7IDE5IH0sCi0gIC8qIFRoZSByZW1haW5pbmcgcmVsb2NzIGFyZSBhIEdOVSBleHRlbnNpb24uICAqLwotICBIT1dUTyhSXzM4Nl8xNiwJIDAsMSwxNixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2XzE2IiwJICAgIHRydWUsMHhmZmZmLDB4ZmZmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDMTYsCSAwLDEsMTYsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCJSXzM4Nl9QQzE2IiwJICAgIHRydWUsMHhmZmZmLDB4ZmZmZix0cnVlKSwKLSAgSE9XVE8oUl8zODZfOCwJIDAsMCw4LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywiUl8zODZfOCIsCSAgICB0cnVlLDB4ZmYsMHhmZixmYWxzZSksCi0gIEhPV1RPKFJfMzg2X1BDOCwJIDAsMCw4LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIlJfMzg2X1BDOCIsCSAgICB0cnVlLDB4ZmYsMHhmZix0cnVlKSwKLX07Ci0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5LiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2kzODZfdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfMzg2X0dOVV9WVElOSEVSSVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfMzg2X0dOVV9WVElOSEVSSVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZS4gICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9pMzg2X3Z0ZW50cnlfaG93dG8gPQotICBIT1dUTyAoUl8zODZfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSXzM4Nl9HTlVfVlRFTlRSWSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7Ci0KLSNpZmRlZiBERUJVR19HRU5fUkVMT0MKLSNkZWZpbmUgVFJBQ0Uoc3RyKSBmcHJpbnRmIChzdGRlcnIsICJpMzg2IGJmZCByZWxvYyBsb29rdXAgJWQgKCVzKVxuIiwgY29kZSwgc3RyKQotI2Vsc2UKLSNkZWZpbmUgVFJBQ0Uoc3RyKQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX05PTkU6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19OT05FIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9OT05FIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzMyIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl8zMiBdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX0NUT1IiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2XzMyIF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DX1BDMzIiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X1BDMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1QzMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HT1QzMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9QTFQzMiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfUExUMzIgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9DT1BZOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfMzg2X0NPUFkiKTsKLSAgICAgIHJldHVybiAmZWxmX2hvd3RvX3RhYmxlWyAoaW50KVJfMzg2X0NPUFkgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVDoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR0xPQl9EQVQgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9KVU1QX1NMT1Q6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfSlVNUF9TTE9UIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9KVU1QX1NMT1QgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRToKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9SRUxBVElWRSIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfUkVMQVRJVkUgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RPRkY6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18zODZfR09UT0ZGIik7Ci0gICAgICByZXR1cm4gJmVsZl9ob3d0b190YWJsZVsgKGludClSXzM4Nl9HT1RPRkYgXTsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RQQzoKLSAgICAgIFRSQUNFICgiQkZEX1JFTE9DXzM4Nl9HT1RQQyIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbIChpbnQpUl8zODZfR09UUEMgXTsKLQotICAgICAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbi4gICovCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18xNiIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfMTZdOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ18xNl9QQ1JFTCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfUEMxNl07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfOCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfOF07Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfOF9QQ1JFTCIpOwotICAgICAgcmV0dXJuICZlbGZfaG93dG9fdGFibGVbKGludCkgUl8zODZfUEM4XTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgVFJBQ0UgKCJCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQiKTsKLSAgICAgIHJldHVybiAmZWxmMzJfaTM4Nl92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBUUkFDRSAoIkJGRF9SRUxPQ19WVEFCTEVfRU5UUlkiKTsKLSAgICAgIHJldHVybiAmZWxmMzJfaTM4Nl92dGVudHJ5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBUUkFDRSAoIlVua25vd24iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfaTM4Nl9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkCQkqYWJmZDsKLSAgICAgYXJlbGVudAkJKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9pMzg2X2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICBlbnVtIGVsZl9pMzg2X3JlbG9jX3R5cGUgdHlwZTsKLQotICB0eXBlID0gKGVudW0gZWxmX2kzODZfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIGlmICh0eXBlID09IFJfMzg2X0dOVV9WVElOSEVSSVQpCi0gICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGYzMl9pMzg2X3Z0aW5oZXJpdF9ob3d0bzsKLSAgZWxzZSBpZiAodHlwZSA9PSBSXzM4Nl9HTlVfVlRFTlRSWSkKLSAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX2kzODZfdnRlbnRyeV9ob3d0bzsKLSAgZWxzZQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKHR5cGUgPCBSXzM4Nl9tYXgpOwotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IEZJUlNUX0lOVkFMSURfUkVMT0MgfHwgdHlwZSA+IExBU1RfSU5WQUxJRF9SRUxPQyk7Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZl9ob3d0b190YWJsZVsoaW50KSB0eXBlXTsKLSAgICB9Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIG5hbWUgaW1wbGllcyBhIGxvY2FsIGxhYmVsLiAgVGhlIFVuaXhXYXJlCi0gICAyLjEgY2MgZ2VuZXJhdGVzIHRlbXBvcmFyeSBzeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCAuWCwgc28gd2UKLSAgIHJlY29nbml6ZSB0aGVtIGhlcmUuICBGSVhNRTogZG8gb3RoZXIgU1ZSNCBjb21waWxlcnMgYWxzbyB1c2UgLlg/LgotICAgSWYgc28sIHdlIHNob3VsZCBtb3ZlIHRoZSAuWCByZWNvZ25pdGlvbiBpbnRvCi0gICBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ1gnKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBfYmZkX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIGkzODYgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9saWJjLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTYKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGFuIGFic29sdXRlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2tzIGxpa2UKLSAgIHRoaXMuICBTZWUgdGhlIFNWUjQgQUJJIGkzODYgc3VwcGxlbWVudCB0byBzZWUgaG93IHRoaXMgd29ya3MuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGx0MF9lbnRyeVtQTFRfRU5UUllfU0laRV0gPQotewotICAweGZmLCAweDM1LAkvKiBwdXNobCBjb250ZW50cyBvZiBhZGRyZXNzICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiAuZ290ICsgNC4gICovCi0gIDB4ZmYsIDB4MjUsCS8qIGptcCBpbmRpcmVjdCAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIGFkZHJlc3Mgb2YgLmdvdCArIDguICAqLwotICAwLCAwLCAwLCAwCS8qIHBhZCBvdXQgdG8gMTYgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGFuIGFic29sdXRlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZQotICAgdGhpcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfaTM4Nl9wbHRfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHgyNSwJLyogam1wIGluZGlyZWN0ICovCi0gIDAsIDAsIDAsIDAsCS8qIHJlcGxhY2VkIHdpdGggYWRkcmVzcyBvZiB0aGlzIHN5bWJvbCBpbiAuZ290LiAgKi8KLSAgMHg2OCwJCS8qIHB1c2hsIGltbWVkaWF0ZSAqLwotICAwLCAwLCAwLCAwLAkvKiByZXBsYWNlZCB3aXRoIG9mZnNldCBpbnRvIHJlbG9jYXRpb24gdGFibGUuICAqLwotICAweGU5LAkJLyogam1wIHJlbGF0aXZlICovCi0gIDAsIDAsIDAsIDAJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gc3RhcnQgb2YgLnBsdC4gICovCi19OwotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSBQSUMgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2kzODZfcGljX3BsdDBfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHhiMywgNCwgMCwgMCwgMCwJLyogcHVzaGwgNCglZWJ4KSAqLwotICAweGZmLCAweGEzLCA4LCAwLCAwLCAwLAkvKiBqbXAgKjgoJWVieCkgKi8KLSAgMCwgMCwgMCwgMAkJCS8qIHBhZCBvdXQgdG8gMTYgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgUElDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxvb2sgbGlrZSB0aGlzLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9pMzg2X3BpY19wbHRfZW50cnlbUExUX0VOVFJZX1NJWkVdID0KLXsKLSAgMHhmZiwgMHhhMywJLyogam1wICpvZmZzZXQoJWVieCkgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgb2YgdGhpcyBzeW1ib2wgaW4gLmdvdC4gICovCi0gIDB4NjgsCQkvKiBwdXNobCBpbW1lZGlhdGUgKi8KLSAgMCwgMCwgMCwgMCwJLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgaW50byByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLSAgMHhlOSwJCS8qIGptcCByZWxhdGl2ZSAqLwotICAwLCAwLCAwLCAwCS8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IHRvIHN0YXJ0IG9mIC5wbHQuICAqLwotfTsKLQotLyogVGhlIGkzODYgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQKLSAgIGl0IGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuCi0gICBsaW5raW5nIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkCi0gICBleHRlbmRpbmcgdGhlIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UKLSAgIGhhdmUgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBpMzg2IEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX2kzODZfZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfaTM4Nl9oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYW4gaTM4NiBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWVsZl9pMzg2X2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIGkzODYgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIF9iZmRfZWxmX2xpbmtfaGFzaF90YWJsZV9pbml0ICgmcmV0LT5yb290LCBhYmZkLAotCQkJCSAgICAgICBlbGZfaTM4Nl9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJldCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsb2M7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgLyogU29tZSByZWxvY3MgcmVxdWlyZSBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCXsKLQkgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JICAgIHsKLQkgICAgY2FzZSBSXzM4Nl9HT1QzMjoKLQkgICAgY2FzZSBSXzM4Nl9HT1RPRkY6Ci0JICAgIGNhc2UgUl8zODZfR09UUEM6Ci0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl8zODZfR09UMzI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbC5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSBhbHJlYWR5IGFsbG9jYXRlZCBzcGFjZSBpbiB0aGUgLmdvdC4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gc2dvdC0+X3Jhd19zaXplOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJewotCQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotICAgICAJICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfMzg2X1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlIGR5bmFtaWMKLSAgICAgICAgICAgICAgICAgICAgIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9QTFQzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotICAgICAgICAgICAgIGFjdHVhbGx5IGJ1aWxkIHRoZSBlbnRyeSBpbiBhZGp1c3RfZHluYW1pY19zeW1ib2wsCi0gICAgICAgICAgICAgYmVjYXVzZSB0aGlzIG1pZ2h0IGJlIGEgY2FzZSBvZiBsaW5raW5nIFBJQyBjb2RlIHdoaWNoIGlzCi0gICAgICAgICAgICAgbmV2ZXIgcmVmZXJlbmNlZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBpbiB3aGljaCBjYXNlIHdlCi0gICAgICAgICAgICAgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5Ci0gICAgICAgICAgICAgYWZ0ZXIgYWxsLiAgKi8KLQotCSAgLyogSWYgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgcmVzb2x2ZSBpdCBkaXJlY3RseSB3aXRob3V0Ci0gICAgICAgICAgICAgY3JlYXRpbmcgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2XzMyOgotCWNhc2UgUl8zODZfUEMzMjoKLQkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgdGhpcyBpcyBhIHJlbG9jCi0gICAgICAgICAgICAgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wsIG9yIGEgbm9uIFBDIHJlbGF0aXZlIHJlbG9jCi0gICAgICAgICAgICAgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbCwgdGhlbiB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jCi0gICAgICAgICAgICAgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICBIb3dldmVyLCBpZiB3ZSBhcmUgbGlua2luZyB3aXRoCi0gICAgICAgICAgICAgLUJzeW1ib2xpYywgd2UgZG8gbm90IG5lZWQgdG8gY29weSBhIHJlbG9jIGFnYWluc3QgYQotICAgICAgICAgICAgIGdsb2JhbCBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlCi0gICAgICAgICAgICAgaW5jbHVkaW5nIGluIHRoZSBsaW5rIChpLmUuLCBERUZfUkVHVUxBUiBpcyBzZXQpLiAgQXQKLSAgICAgICAgICAgICB0aGlzIHBvaW50IHdlIGhhdmUgbm90IHNlZW4gYWxsIHRoZSBpbnB1dCBmaWxlcywgc28gaXQgaXMKLSAgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IERFRl9SRUdVTEFSIGlzIG5vdCBzZXQgbm93IGJ1dCB3aWxsIGJlIHNldAotICAgICAgICAgICAgIGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLSAgICAgICAgICAgICBwb3NzaWJpbGl0eSBiZWxvdyBieSBzdG9yaW5nIGluZm9ybWF0aW9uIGluIHRoZQotICAgICAgICAgICAgIHBjcmVsX3JlbG9jc19jb3BpZWQgZmllbGQgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgICAgJiYgKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pICE9IFJfMzg2X1BDMzIKLQkJICB8fCAoaCAhPSBOVUxMCi0JCSAgICAgICYmICghIGluZm8tPnN5bWJvbGljCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JICAgIHsKLQkgICAgICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0gICAgICAgICAgICAgICAgIHJlbG9jIHR5cGVzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA0KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotCSAgICAgIC8qIElmIHdlIGFyZSBsaW5raW5nIHdpdGggLUJzeW1ib2xpYywgYW5kIHRoaXMgaXMgYQotICAgICAgICAgICAgICAgICBnbG9iYWwgc3ltYm9sLCB3ZSBjb3VudCB0aGUgbnVtYmVyIG9mIFBDIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgd2UgY2FuIGRpc2NhcmQgdGhlbSBhZ2FpbiBpZiB0aGUgc3ltYm9sIGlzIGxhdGVyCi0gICAgICAgICAgICAgICAgIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgIGlzIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBlbGZfaTM4NiBsaW5rZXIKLSAgICAgICAgICAgICAgICAgaGFzaCB0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8KLSAgICAgICAgICAgICAgICAgYW4gZWxmX2kzODZfbGlua19oYXNoX2VudHJ5LiAgKi8KLQkgICAgICBpZiAoaCAhPSBOVUxMICYmIGluZm8tPnN5bWJvbGljCi0JCSAgJiYgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgPT0gUl8zODZfUEMzMikKLQkJewotCQkgIHN0cnVjdCBlbGZfaTM4Nl9saW5rX2hhc2hfZW50cnkgKmVoOwotCQkgIHN0cnVjdCBlbGZfaTM4Nl9wY3JlbF9yZWxvY3NfY29waWVkICpwOwotCi0JCSAgZWggPSAoc3RydWN0IGVsZl9pMzg2X2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JCSAgZm9yIChwID0gZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JCSAgICBpZiAocC0+c2VjdGlvbiA9PSBzcmVsb2MpCi0JCSAgICAgIGJyZWFrOwotCi0JCSAgaWYgKHAgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgcCA9ICgoc3RydWN0IGVsZl9pMzg2X3BjcmVsX3JlbG9jc19jb3BpZWQgKikKLQkJCSAgIGJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKnApKTsKLQkJICAgICAgaWYgKHAgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgcC0+bmV4dCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOwotCQkgICAgICBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZCA9IHA7Ci0JCSAgICAgIHAtPnNlY3Rpb24gPSBzcmVsb2M7Ci0JCSAgICAgIHAtPmNvdW50ID0gMDsKLQkJICAgIH0KLQotCQkgICsrcC0+Y291bnQ7Ci0JCX0KLQkgICAgfQotCi0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl8zODZfR05VX1ZUSU5IRVJJVDoKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB3aGljaCBDKysgdnRhYmxlIGVudHJpZXMgYXJlIGFjdHVhbGx5Ci0JICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfMzg2X0dOVV9WVEVOVFJZOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIHNlY3Rpb24gdGhhdCBzaG91bGQgYmUgbWFya2VkIGFnYWluc3QgR0MgZm9yIGEgZ2l2ZW4KLSAgIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmX2kzODZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfMzg2X0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzM4Nl9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICAvKiA/Pz8gSXQgd291bGQgc2VlbSB0aGF0IHRoZSBleGlzdGluZyBpMzg2IGNvZGUgZG9lcyBubyBzb3J0Ci0gICAgIG9mIHJlZmVyZW5jZSBjb3VudGluZyBvciB3aGF0bm90IG9uIGl0cyBHT1QgYW5kIFBMVCBlbnRyaWVzLAotICAgICBzbyBpdCBpcyBub3QgcG9zc2libGUgdG8gZ2FyYmFnZSBjb2xsZWN0IHRoZW0gYXQgdGhpcyB0aW1lLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRqdXN0IGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCBhbmQgcmVmZXJlbmNlZCBieSBhCi0gICByZWd1bGFyIG9iamVjdC4gIFRoZSBjdXJyZW50IGRlZmluaXRpb24gaXMgaW4gc29tZSBzZWN0aW9uIG9mIHRoZQotICAgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSdyZSBub3QgaW5jbHVkaW5nIHRob3NlIHNlY3Rpb25zLiAgV2UgaGF2ZSB0bwotICAgY2hhbmdlIHRoZSBkZWZpbml0aW9uIHRvIHNvbWV0aGluZyB0aGUgcmVzdCBvZiB0aGUgbGluayBjYW4KLSAgIHVuZGVyc3RhbmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBwdXQgaXQgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgV2UKLSAgICAgd2lsbCBmaWxsIGluIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbGF0ZXIsCi0gICAgIHdoZW4gd2Uga25vdyB0aGUgYWRkcmVzcyBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgPT0gMCkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFBMVDMyIHJlbG9jIGluIGFuIGlucHV0Ci0gICAgICAgICAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYwotICAgICAgICAgICAgIG9iamVjdC4gIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkCi0gICAgICAgICAgICAgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgUEMzMgotICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IC5wbHQgZW50cnksIG1ha2Ugcm9vbSBmb3IgdGhlIHNwZWNpYWwKLQkgZmlyc3QgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLSAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBlbnRyeS4gICovCi0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFdlIGFsc28gbmVlZCB0byBtYWtlIGFuIGVudHJ5IGluIHRoZSAuZ290LnBsdCBzZWN0aW9uLCB3aGljaAotCSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgLmdvdCBzZWN0aW9uIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSArPSA0OwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLnJlbC5wbHQgc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl8zODZfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzcmVsLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIHBvd2VyX29mX3R3bykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBhcyBiZWluZyBhdCB0aGlzIHBvaW50IGluIHRoZSBzZWN0aW9uLiAgKi8KLSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQotICAvKiBJbmNyZW1lbnQgdGhlIHNlY3Rpb24gc2l6ZSB0byBtYWtlIHJvb20gZm9yIHRoZSBzeW1ib2wuICAqLwotICBzLT5fcmF3X3NpemUgKz0gaC0+c2l6ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsLmdvdCBzZWN0aW9uLgotICAgICAgICAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbAotICAgICAgICAgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbC5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsCi0gICAgIFBDIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LgotICAgICBXZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIGNoZWNrX3JlbG9jcyByb3V0aW5lLCBidXQgd2UKLSAgICAgd2lsbCBub3QgZmlsbCB0aGVtIGluIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotICBpZiAoaW5mby0+c2hhcmVkICYmIGluZm8tPnN5bWJvbGljKQotICAgIGVsZl9pMzg2X2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2kzODZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJIGVsZl9pMzg2X2Rpc2NhcmRfY29waWVzLAotCQkJCSAoUFRSKSBOVUxMKTsKLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBtb3N0bHkgdG8gaGFuZGxlIC5yZWwuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0KLQkgICAgICAvKiBSZW1lbWJlciB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVsb2Mgc2VjdGlvbnMgb3RoZXIKLSAgICAgICAgICAgICAgICAgdGhhbiAucmVsLnBsdC4gICovCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWwucGx0IikgIT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkJICByZWxvY3MgPSB0cnVlOwotCi0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKLQkJICAgICBlbnRyeS4gIFRoZSBlbnRyaWVzIGluIHRoZSAucmVsLnBsdCBzZWN0aW9uCi0JCSAgICAgcmVhbGx5IGFwcGx5IHRvIHRoZSAuZ290IHNlY3Rpb24sIHdoaWNoIHdlCi0JCSAgICAgY3JlYXRlZCBvdXJzZWx2ZXMgYW5kIHNvIGtub3cgaXMgbm90IHJlYWRvbmx5LiAgKi8KLQkJICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkJICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDQpOwotCQkgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICAgIHJlbHRleHQgPSB0cnVlOwotCQl9Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX2kzODZfbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUKLSAgIGRlZmluZWQgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZQotICAgY2hlY2tfcmVsb2NzIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlCi0gICByZWxvY2F0ZV9zZWN0aW9uIHJvdXRpbmUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9kaXNjYXJkX2NvcGllcyAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgZWxmX2kzODZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWdub3JlOwotewotICBzdHJ1Y3QgZWxmX2kzODZfcGNyZWxfcmVsb2NzX2NvcGllZCAqczsKLQotICAvKiBXZSBvbmx5IGRpc2NhcmQgcmVsb2NzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKHMgPSBoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHMtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtPSBzLT5jb3VudCAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYW4gaTM4NiBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPT0gUl8zODZfR05VX1ZUSU5IRVJJVAotCSAgfHwgcl90eXBlID09IFJfMzg2X0dOVV9WVEVOVFJZKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHJfdHlwZSA8IDAKLQkgIHx8IHJfdHlwZSA+PSAoaW50KSBSXzM4Nl9tYXgKLQkgIHx8IChyX3R5cGUgPj0gKGludCkgRklSU1RfSU5WQUxJRF9SRUxPQwotCSAgICAgICYmIHJfdHlwZSA8PSAoaW50KSBMQVNUX0lOVkFMSURfUkVMT0MpKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gZWxmX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgYmZkX3ZtYSB2YWw7Ci0KLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgdmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIHZhbCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgdmFsLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAocl90eXBlID09IFJfMzg2X0dPVFBDCi0JCSAgfHwgKHJfdHlwZSA9PSBSXzM4Nl9QTFQzMgotCQkgICAgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAocl90eXBlID09IFJfMzg2X0dPVDMyCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAocl90eXBlID09IFJfMzg2XzMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSXzM4Nl9QQzMyKQotCQkgICAgICAmJiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCQkgIC8qIERXQVJGIHdpbGwgZW1pdCBSXzM4Nl8zMiByZWxvY2F0aW9ucyBpbiBpdHMKLQkJCSAgICAgc2VjdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgZXh0ZXJuYWxseQotCQkJICAgICBpbiBzaGFyZWQgbGlicmFyaWVzLiAgV2UgY2FuJ3QgZG8gYW55dGhpbmcKLQkJCSAgICAgd2l0aCB0aGVtIGhlcmUuICAqLwotCQkJICB8fCAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiB3YXJuaW5nOiB1bnJlc29sdmFibGUgcmVsb2NhdGlvbiBhZ2FpbnN0IHN5bWJvbCBgJXMnIGZyb20gJXMgc2VjdGlvbiIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpOwotCQkgIHJlbG9jYXRpb24gPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSXzM4Nl9HT1QzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0JICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkJICAgICAtQnN5bWJvbGljIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCQkgICAgIGxvY2FsbHksIG9yIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbAotCQkgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZSBtdXN0IGluaXRpYWxpemUKLQkJICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UgdGhlCi0JCSAgICAgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNCwgd2UgdXNlIHRoZQotCQkgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSAgICAgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWwuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMCi0JCQkgICYmIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2ZmID0gbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdOwotCi0JICAgICAgLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLSAgICAgICAgICAgICAgICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgIGFscmVhZHkgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQotCQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkJICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0KLQkJICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJfQotCi0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmY7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X0dPVE9GRjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwgb2Zmc2V0Ci0JICAgICB0YWJsZS4gICovCi0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIE5vdGUgdGhhdCBzZ290LT5vdXRwdXRfb2Zmc2V0IGlzIG5vdCBpbnZvbHZlZCBpbiB0aGlzCi0JICAgICBjYWxjdWxhdGlvbi4gIFdlIGFsd2F5cyB3YW50IHRoZSBzdGFydCBvZiAuZ290LiAgSWYgd2UKLQkgICAgIGRlZmluZWQgX0dMT0JBTF9PRkZTRVRfVEFCTEUgaW4gYSBkaWZmZXJlbnQgd2F5LCBhcyBpcwotCSAgICAgcGVybWl0dGVkIGJ5IHRoZSBBQkksIHdlIG1pZ2h0IGhhdmUgdG8gY2hhbmdlIHRoaXMKLQkgICAgIGNhbGN1bGF0aW9uLiAgKi8KLQkgIHJlbG9jYXRpb24gLT0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfMzg2X0dPVFBDOgotCSAgLyogVXNlIGdsb2JhbCBvZmZzZXQgdGFibGUgYXMgc3ltYm9sIHZhbHVlLiAgKi8KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl9QTFQzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLQkgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogUmVzb2x2ZSBhIFBMVDMyIHJlbG9jIGFnYWluIGEgbG9jYWwgc3ltYm9sIGRpcmVjdGx5LAotICAgICAgICAgICAgIHdpdGhvdXQgdXNpbmcgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0gICAgICAgICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLSAgICAgICAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzM4Nl8zMjoKLQljYXNlIFJfMzg2X1BDMzI6Ci0JICBpZiAoaW5mby0+c2hhcmVkCi0JICAgICAgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JICAgICAgJiYgKHJfdHlwZSAhPSBSXzM4Nl9QQzMyCi0JCSAgfHwgKGggIT0gTlVMTAotCQkgICAgICAmJiBoLT5keW5pbmR4ICE9IC0xCi0JCSAgICAgICYmICghIGluZm8tPnN5bWJvbGljCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSkpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQkgICAgICBib29sZWFuIHNraXAsIHJlbG9jYXRlOwotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLQkJIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0JCSB0aW1lLiAgKi8KLQotCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgKGlucHV0X2JmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGlucHV0X2JmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsIiwgNCkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA0KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJewotCQkgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSXzM4Nl9QQzMyKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMICYmIGgtPmR5bmluZHggIT0gLTEpOwotCQkgIHJlbG9jYXRlID0gZmFsc2U7Ci0JCSAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfUEMzMik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCQkgIGlmIChoID09IE5VTEwKLQkJICAgICAgfHwgKChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQkJICAgIHsKLQkJICAgICAgcmVsb2NhdGUgPSB0cnVlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICAgICAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfMzIpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSgoKEVsZjMyX0V4dGVybmFsX1JlbCAqKQotCQkJCQkgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkbwotCQkgbm90IHdhbnQgdG8gZmlkZGxlIHdpdGggdGhlIGFkZGVuZC4gIE90aGVyd2lzZSwgd2UKLQkJIG5lZWQgdG8gaW5jbHVkZSB0aGUgc3ltYm9sIHZhbHVlIHNvIHRoYXQgaXQgYmVjb21lcwotCQkgYW4gYWRkZW5kIGZvciB0aGUgZHluYW1pYyByZWxvYy4gICovCi0JICAgICAgaWYgKCEgcmVsb2NhdGUpCi0JCWNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJICAgIHJlbG9jYXRpb24sIChiZmRfdm1hKSAwKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9pMzg2X2ZpbmlzaF9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaCwgc3ltKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBiZmQgKmR5bm9iajsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsIHJlbDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFNldAotCSBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotICAgICAgLyogR2V0IHRoZSBpbmRleCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgd2hpY2gKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBzeW1ib2wuICBUaGlzIGlzIHRoZSBpbmRleCBvZiB0aGlzIHN5bWJvbAotCSBpbiBhbGwgdGhlIHN5bWJvbHMgZm9yIHdoaWNoIHdlIGFyZSBtYWtpbmcgcGx0IGVudHJpZXMuICBUaGUKLQkgZmlyc3QgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIHBsdF9pbmRleCA9IGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDE7Ci0KLSAgICAgIC8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIC5nb3QgdGFibGUgb2YgdGhlIGVudHJ5IHRoYXQKLQkgY29ycmVzcG9uZHMgdG8gdGhpcyBmdW5jdGlvbi4gIEVhY2ggLmdvdCBlbnRyeSBpcyA0IGJ5dGVzLgotCSBUaGUgZmlyc3QgdGhyZWUgYXJlIHJlc2VydmVkLiAgKi8KLSAgICAgIGdvdF9vZmZzZXQgPSAocGx0X2luZGV4ICsgMykgKiA0OwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfaTM4Nl9wbHRfZW50cnksCi0JCSAgUExUX0VOVFJZX1NJWkUpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBnb3Rfb2Zmc2V0KSwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfaTM4Nl9waWNfcGx0X2VudHJ5LAotCQkgIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGdvdF9vZmZzZXQsCi0JCSAgICAgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDIpOwotCX0KLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcGx0X2luZGV4ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDcpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgLSAoaC0+cGx0Lm9mZnNldCArIFBMVF9FTlRSWV9TSVpFKSwKLQkJICBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyAxMik7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICsgaC0+cGx0Lm9mZnNldAotCQkgICArIDYpLAotCQkgIHNnb3QtPmNvbnRlbnRzICsgZ290X29mZnNldCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIGdvdF9vZmZzZXQpOwotICAgICAgcmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl8zODZfSlVNUF9TTE9UKTsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJnJlbCwKLQkJCQkoKEVsZjMyX0V4dGVybmFsX1JlbCAqKSBzcmVsLT5jb250ZW50cwotCQkJCSArIHBsdF9pbmRleCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gIFNldCBpdAotCSB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgTGlrZXdpc2UgaWYKLQkgdGhlIHN5bWJvbCB3YXMgZm9yY2VkIHRvIGJlIGxvY2FsIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuCi0JIFRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCi0JIGluaXRpYWxpemVkIGluIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQKLQkgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQlyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzM4Nl9SRUxBVElWRSk7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgaC0+Z290Lm9mZnNldCk7Ci0JICByZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSXzM4Nl9HTE9CX0RBVCk7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZyZWwsCi0JCQkJKChFbGYzMl9FeHRlcm5hbF9SZWwgKikgc3JlbC0+Y29udGVudHMKLQkJCQkgKyBzcmVsLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzcmVsLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEKLQkJICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAiLnJlbC5ic3MiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbC5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfMzg2X0NPUFkpOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2Nfb3V0IChvdXRwdXRfYmZkLCAmcmVsLAotCQkJCSgoRWxmMzJfRXh0ZXJuYWxfUmVsICopIHMtPmNvbnRlbnRzCi0JCQkJICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIC8qIE1hcmsgX0RZTkFNSUMgYW5kIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfaTM4Nl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc2R5bjsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsLnBsdCI7Ci0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9QTFRSRUxTWjoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgICAgICBlbHNlCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgICAvKiBNeSByZWFkaW5nIG9mIHRoZSBTVlI0IEFCSSBpbmRpY2F0ZXMgdGhhdCB0aGUKLQkJIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHJlbG9jcyAoRFRfSk1QUkVMKSBzaG91bGQgYmUKLQkJIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMKS4gIFRoaXMgaXMKLQkJIHdoYXQgU29sYXJpcyBkb2VzLiAgSG93ZXZlciwgVW5peFdhcmUgY2FuIG5vdCBoYW5kbGUKLQkJIHRoYXQgY2FzZS4gIFRoZXJlZm9yZSwgd2Ugb3ZlcnJpZGUgdGhlIERUX1JFTFNaIGVudHJ5Ci0JCSBoZXJlIHRvIG1ha2UgaXQgbm90IGluY2x1ZGUgdGhlIEpNUFJFTCByZWxvY3MuICBTaW5jZQotCQkgdGhlIGxpbmtlciBzY3JpcHQgYXJyYW5nZXMgZm9yIC5yZWwucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUwgZW50cnkuICAqLwotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWwucGx0Iik7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCkKLQkJewotCQkgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9jb29rZWRfc2l6ZTsKLQkJICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCAtPSBzLT5fcmF3X3NpemU7Ci0JCX0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaWxsIGluIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBpZiAoc3BsdCAmJiBzcGx0LT5fcmF3X3NpemUgPiAwKQotCXsKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMsIGVsZl9pMzg2X3BpY19wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfaTM4Nl9wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJCSAgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0LAotCQkJICBzcGx0LT5jb250ZW50cyArIDIpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCQkgIHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgOCwKLQkJCSAgc3BsdC0+Y29udGVudHMgKyA4KTsKLQkgICAgfQotCi0JICAvKiBVbml4V2FyZSBzZXRzIHRoZSBlbnRzaXplIG9mIC5wbHQgdG8gNCwgYWx0aG91Z2ggdGhhdCBkb2Vzbid0Ci0JICAgICByZWFsbHkgc2VlbSBsaWtlIHRoZSByaWdodCB2YWx1ZS4gICovCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCX0KLSAgICB9Ci0KLSAgLyogRmlsbCBpbiB0aGUgZmlyc3QgdGhyZWUgZW50cmllcyBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGlmIChzZ290LT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQsCi0JCSAgICBzZ290LT5jb250ZW50cyk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDgpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmMzJfaTM4Nl92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmMzItaTM4NiIKLSNkZWZpbmUgRUxGX0FSQ0gJCQliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCUVNXzM4NgotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEwMDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZl9pMzg2X2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQllbGZfaTM4Nl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZl9pMzg2X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0JCQkJCWVsZl9pMzg2X2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQllbGZfaTM4Nl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwllbGZfaTM4Nl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX2kzODZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9pMzg2X3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCWVsZl9pMzg2X3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJZWxmX2kzODZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rCWVsZl9pMzg2X2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCWVsZl9pMzg2X2djX3N3ZWVwX2hvb2sKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMJMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQJMQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkJMQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0JMAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUJMTIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCVBMVF9FTlRSWV9TSVpFCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1pODYwLmMgYi9iZmQvZWxmMzItaTg2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJkMmQ5Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1pODYwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBJbnRlbCA4NjAgc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQlfYmZkX2VsZl9ub19pbmZvX3RvX2hvd3RvCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JIGJmZF9lbGYzMl9pODYwX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICJlbGYzMi1pODYwIgotI2RlZmluZSBFTEZfQVJDSAkgYmZkX2FyY2hfaTg2MAotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNXzg2MAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgIDEgLyogRklYTUU6IFRoaXMgbnVtYmVyIGlzIHdyb25nLCAgSXQgc2hvdWxkIGJlIHRoZSBwYWdlIHNpemUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItaTk2MC5jIGIvYmZkL2VsZjMyLWk5NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3ZjA5OC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qIEludGVsIDg2MCBzcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9pOTYwLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmMzJfaTk2MF9yZWxvY2F0ZQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICplbGYzMl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLQotI2RlZmluZSBVU0VfUkVMIDEKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCWVsZjMyX2k5NjBfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZjMyX2k5NjBfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZjMyX2k5NjBfaW5mb190b19ob3d0b19yZWwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX2hvd3RvX3RhYmxlW109Ci17Ci0gIEhPV1RPKFJfOTYwX05PTkUsIDAsIDAsIDAsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQllbGYzMl9pOTYwX3JlbG9jYXRlLCAiUl85NjBfTk9ORSIsIHRydWUsCi0JMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgZmFsc2UpLAotICB7IDEgfSwKLSAgSE9XVE8gKFJfOTYwXzMyLCAwLCAyLCAzMiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAotCWVsZjMyX2k5NjBfcmVsb2NhdGUsICJSXzk2MF8zMiIsIHRydWUsCi0JMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl85NjBfSVAyNCwgMCwgMiwgMjQsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQllbGYzMl9pOTYwX3JlbG9jYXRlLCAiUl85NjBfSVAyNCAiLCB0cnVlLAotCTB4MDBmZmZmZmYsIDB4MDBmZmZmZmYsIGZhbHNlKSwKLSAgeyA0IH0sCi0gIHsgNSB9LAotICB7IDYgfSwKLSAgeyA3IH0KLX07Ci0KLXN0YXRpYyBlbnVtIGVsZl9pOTYwX3JlbG9jX3R5cGUKLWVsZjMyX2k5NjBfYmZkX3RvX3JlbG9jX3R5cGUgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKQotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gUl85NjBfTk9ORTsKLSAgICBjYXNlIEJGRF9SRUxPQ19JOTYwX0NBTExKOgotICAgICAgcmV0dXJuIFJfOTYwX09QVENBTEw7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoKLSAgICAgIHJldHVybiBSXzk2MF8zMjsKLSAgICBjYXNlIEJGRF9SRUxPQ18yNF9QQ1JFTDoKLSAgICAgIHJldHVybiBSXzk2MF9JUDI0OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWVsZjMyX2k5NjBfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZAkJKmFiZmQ7Ci0gICAgIGFyZWxlbnQJCSpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9pOTYwX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqZHN0OwotewotICBlbnVtIGVsZl9pOTYwX3JlbG9jX3R5cGUgdHlwZTsKLQotICB0eXBlID0gKGVudW0gZWxmX2k5NjBfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHR5cGUgPCBSXzk2MF9tYXgpOwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHR5cGVdOwotfQotCi0vKiBFTEYgcmVsb2NzIGFyZSBhZ2FpbnN0IHN5bWJvbHMuICBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZQotICAgb3V0cHV0LCBhbmQgdGhlIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWwgc3ltYm9sLCBhbmQgbm90aGluZwotICAgaGFzIGdpdmVuIHVzIGFueSBhZGRpdGlvbmFsIGFkZGVuZCwgdGhlIHJlc3VsdGluZyByZWxvYyB3aWxsIGFsc28KLSAgIGJlIGFnYWluc3QgdGhlIHNhbWUgc3ltYm9sLiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8KLSAgIGNoYW5nZSBhbnl0aGluZyBhYm91dCB0aGUgd2F5IHRoZSByZWxvYyBpcyBoYW5kbGVkLCBzaW5jZSBpdCB3aWxsCi0gICBhbGwgYmUgZG9uZSBhdCBmaW5hbCBsaW5rIHRpbWUuICBSYXRoZXIgdGhhbiBwdXQgc3BlY2lhbCBjYXNlIGNvZGUKLSAgIGludG8gYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiwgYWxsIHRoZSByZWxvYyB0eXBlcyB1c2UgdGhpcyBob3d0bwotICAgZnVuY3Rpb24uICBJdCBqdXN0IHNob3J0IGNpcmN1aXRzIHRoZSByZWxvYyBpZiBwcm9kdWNpbmcKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmMzJfaTk2MF9yZWxvY2F0ZSAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIEhBQ0s6IEkgdGhpbmsgdGhpcyBmaXJzdCBjb25kaXRpb24gaXMgbmVjZXNzYXJ5IHdoZW4gcHJvZHVjaW5nCi0gICAgIHJlbG9jYXRhYmxlIG91dHB1dC4gIEFmdGVyIHRoZSBlbmQgb2YgSEFDSywgdGhlIGNvZGUgaXMgaWRlbnRpY2FsCi0gICAgIHRvIGJmZF9lbGZfZ2VuZXJpY19yZWxvYygpLiAgSSB3b3VsZCBfZ3Vlc3NfIHRoZSBmaXJzdCBjaGFuZ2UKLSAgICAgYmVsb25ncyB0aGVyZSByYXRoZXIgdGhhbiBoZXJlLiAgbWFydGluZG8gMTk5OC0xMC0yMy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgcmVsb2NfZW50cnktPmhvd3RvLT5wY19yZWxhdGl2ZQotICAgICAgJiYgIXJlbG9jX2VudHJ5LT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgLT0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0gIC8qIFRoaXMgaXMgbW9yZSBkdWJpb3VzLiAqLwotICBlbHNlIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotCSAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgLT0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGVuZCBvZiBIQUNLICovCi0gICAgICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLQkgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0JICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgICAgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0JewotCSAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1lbGYzMl9pOTYwX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICByZXR1cm4gZWxmX2hvd3RvX3RhYmxlICsgZWxmMzJfaTk2MF9iZmRfdG9fcmVsb2NfdHlwZSAoY29kZSk7Ci19Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JYmZkX2VsZjMyX2k5NjBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItaTk2MCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2k5NjAKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQlFTV85NjAKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFICAJMSAvKiBGSVhNRTogVGhpcyBudW1iZXIgaXMgd3JvbmcsICBJdCBzaG91bGQgYmUgdGhlIHBhZ2Ugc2l6ZSBpbiBieXRlcy4gICovCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tMzJyLmMgYi9iZmQvZWxmMzItbTMyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY4NTIzLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tMzJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDgyICswLDAgQEAKLS8qIE0zMlItc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tMzJyLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfMTBfcGNyZWxfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICosIGFzZWN0aW9uICosCi0JICAgYmZkX2J5dGUgKiwgYmZkX3ZtYSwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9oaTE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgbTMycl9lbGZfcmVsb2NhdGVfaGkxNgotICBQQVJBTVMgKChiZmQgKiwgaW50LCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCSAgIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLWJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9sbzE2X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtMzJyX2VsZl9zZGExNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG0zMnJfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLWJvb2xlYW4gX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKiwgYXNlY3Rpb24gKiwgaW50ICopKTsKLXZvaWQgX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci0jaWYgMCAvKiBub3QgeWV0ICovCi1zdGF0aWMgYm9vbGVhbiBtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotI2VuZGlmCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfb2JqZWN0X3AKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIG0zMnJfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0jZGVmaW5lIE5PUF9JTlNOCQkweDcwMDAKLSNkZWZpbmUgTUFLRV9QQVJBTExFTChpbnNuKQkoKGluc24pIHwgMHg4MDAwKQotCi0vKiBVc2UgUkVMIGluc3RlYWQgb2YgUkVMQSB0byBzYXZlIHNwYWNlLgotICAgVGhpcyBvbmx5IHNhdmVzIHNwYWNlIGluIGxpYnJhcmllcyBhbmQgb2JqZWN0IGZpbGVzLCBidXQgcGVyaGFwcwotICAgcmVsb2NzIHdpbGwgYmUgcHV0IGluIFJPTT8gIEFsbCBpbiBhbGwgdGhvdWdoLCBSRUwgcmVsb2NzIGFyZSBhIHBhaW4KLSAgIHRvIHdvcmsgd2l0aC4gICovCi0jZGVmaW5lIFVTRV9SRUwKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbTMycl9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl9OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAxNiBiaXQgYWJzb2x1dGUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX00zMlJfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IGFic29sdXRlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NMzJSXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjQgYml0IGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSXzI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gUEMgUmVsYXRpdmUgMTAtYml0IHJlbG9jYXRpb24sIHNoaWZ0ZWQgYnkgMi4KLSAgICAgVGhpcyByZWxvYyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIHJlbG9jYXRpb25zIGFyZSByZWxhdGl2ZSB0byBwYyAmIC00LgotICAgICBpLmUuIGJyYW5jaGVzIGluIHRoZSByaWdodCBpbnNuIHNsb3QgdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBsZWZ0IGluc24KLSAgICAgc2xvdCBmb3IgcGMuICAqLwotICAvKiA/Pz8gSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGlzIHNob3VsZCBoYXZlIHBhcnRpYWxfaW5wbGFjZSBzZXQgb3Igbm90LgotICAgICBCcmFuY2ggcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBjYW4gc3RvcmUgdGhlIGFkZGVuZCBpbiB0aGUgaW5zbiwKLSAgICAgYW5kIGlmIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gZ2V0cyBjYWxsZWQgdGhlIGFkZGVuZCBtYXkgZ2V0IGFkZGVkCi0gICAgIGFnYWluLiAgKi8KLSAgSE9XVE8gKFJfTTMyUl8xMF9QQ1JFTCwJLyogdHlwZSAqLwotCSAyLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotCSAxLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDEwLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmXzEwX3BjcmVsX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfMTBfUENSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmYsCQkgICAgICAgIC8qIHNyY19tYXNrICovCi0JIDB4ZmYsICAgCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE4IGJpdCByZWxvY2F0aW9uLCByaWdodCBzaGlmdGVkIGJ5IDIuICAqLwotICBIT1dUTyAoUl9NMzJSXzE4X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8xOF9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMjYgYml0IHJlbG9jYXRpb24sIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0gIC8qID8/PyBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIHRoaXMgc2hvdWxkIGhhdmUgcGFydGlhbF9pbnBsYWNlIHNldCBvciBub3QuCi0gICAgIEJyYW5jaCByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGNhbiBzdG9yZSB0aGUgYWRkZW5kIGluIHRoZSBpbnNuLAotICAgICBhbmQgaWYgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBnZXRzIGNhbGxlZCB0aGUgYWRkZW5kIG1heSBnZXQgYWRkZWQKLSAgICAgYWdhaW4uICAqLwotICBIT1dUTyAoUl9NMzJSXzI2X1BDUkVMLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl8yNl9QQ1JFTCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgYWRkcmVzcyB3aGVuIGxvd2VyIDE2IGlzIG9yJ2QgaW4uICAqLwotICBIT1dUTyAoUl9NMzJSX0hJMTZfVUxPLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtMzJyX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfSEkxNl9VTE8iLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGFkZHJlc3Mgd2hlbiBsb3dlciAxNiBpcyBhZGRlZCBpbi4gICovCi0gIEhPV1RPIChSX00zMlJfSEkxNl9TTE8sCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9ISTE2X1NMTyIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3dlciAxNiBiaXRzIG9mIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NMzJSX0xPMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTTMyUl9MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTbWFsbCBkYXRhIGFyZWEgMTYgYml0cyBvZmZzZXQuICAqLwotICBIT1dUTyAoUl9NMzJSX1NEQTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG0zMnJfZWxmX3NkYTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX00zMlJfU0RBMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovICAvKiBGSVhNRTogY29ycmVjdD8gKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NMzJSX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX00zMlJfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX00zMlJfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotDAotLyogSGFuZGxlIHRoZSBSX00zMlJfMTBfUENSRUwgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl8xMF9wY3JlbF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBhcmVsZW50ICogcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKiBzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqIGlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqIG91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiogZXJyb3JfbWVzc2FnZTsKLXsKLSAgLyogVGhpcyBwYXJ0IGlzIGZyb20gYmZkX2VsZl9nZW5lcmljX3JlbG9jLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgKCEgcmVsb2NfZW50cnktPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgIHx8IHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRklYTUU6IFNlZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgSXMgdGhpcyByaWdodD8gICovCi0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLQotICByZXR1cm4gbTMycl9lbGZfZG9fMTBfcGNyZWxfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LT5ob3d0bywKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICBkYXRhLCByZWxvY19lbnRyeS0+YWRkcmVzcywKLQkJCQkgICAgIHN5bWJvbC0+c2VjdGlvbiwKLQkJCQkgICAgIChzeW1ib2wtPnZhbHVlCi0JCQkJICAgICAgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICArIHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCQkJICAgICByZWxvY19lbnRyeS0+YWRkZW5kKTsKLX0KLQotLyogVXRpbGl0eSB0byBhY3R1YWxseSBwZXJmb3JtIGFuIFJfTTMyUl8xMF9QQ1JFTCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2RvXzEwX3BjcmVsX3JlbG9jIChhYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwgZGF0YSwgb2Zmc2V0LAotCQkJICAgIHN5bWJvbF9zZWN0aW9uLCBzeW1ib2xfdmFsdWUsIGFkZGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYXNlY3Rpb24gKnN5bWJvbF9zZWN0aW9uOwotICAgICBiZmRfdm1hIHN5bWJvbF92YWx1ZTsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGJmZF9zaWduZWRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgeDsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICAvKiBTYW5pdHkgY2hlY2sgdGhlIGFkZHJlc3MgKG9mZnNldCBpbiBzZWN0aW9uKS4gICovCi0gIGlmIChvZmZzZXQgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIHJlbG9jYXRpb24gPSBzeW1ib2xfdmFsdWUgKyBhZGRlbmQ7Ci0gIC8qIE1ha2UgaXQgcGMgcmVsYXRpdmUuICAqLwotICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAvKiBUaGVzZSBqdW1wcyBtYXNrIG9mZiB0aGUgbG93ZXIgdHdvIGJpdHMgb2YgdGhlIGN1cnJlbnQgYWRkcmVzcwotICAgICBiZWZvcmUgZG9pbmcgcGNyZWwgY2FsY3VsYXRpb25zLiAgKi8KLSAgcmVsb2NhdGlvbiAtPSAob2Zmc2V0ICYgLTRMKTsKLQotICBpZiAocmVsb2NhdGlvbiA8IC0weDIwMCB8fCByZWxvY2F0aW9uID4gMHgxZmYpCi0gICAgc3RhdHVzID0gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgc3RhdHVzID0gYmZkX3JlbG9jX29rOwotCi0gIHggPSBiZmRfZ2V0XzE2IChhYmZkLCBkYXRhICsgb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiA+Pj0gaG93dG8tPnJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IGhvd3RvLT5iaXRwb3M7Ci0gIHggPSAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzayk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIHgsIGRhdGEgKyBvZmZzZXQpOwotCi0gIHJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jcy4KLSAgIEhJMTZfU0xPIGlzIGZvciB0aGUgYWRkMyBhbmQgbG9hZC9zdG9yZSB3aXRoIGRpc3BsYWNlbWVudCBpbnN0cnVjdGlvbnMuCi0gICBISTE2X1VMTyBpcyBmb3IgdGhlIG9yMyBpbnN0cnVjdGlvbi4KLSAgIEZvciBSX00zMlJfSEkxNl9TTE8sIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBzaWduIGV4dGVuZGVkIHdoZW4gYWRkZWQgdG8KLSAgIHRoZSBoaWdoIDE2IGJ5dGVzIHNvIGlmIHRoZSBsb3dlciAxNiBiaXRzIGFyZSBuZWdhdGl2ZSAoYml0IDE1ID09IDEpIHRoZW4KLSAgIHdlIG11c3QgYWRkIG9uZSB0byB0aGUgaGlnaCAxNiBieXRlcyAod2hpY2ggd2lsbCBnZXQgc3VidHJhY3RlZCBvZmYgd2hlbgotICAgdGhlIGxvdyAxNiBiaXRzIGFyZSBhZGRlZCkuCi0gICBUaGVzZSByZWxvY3MgaGF2ZSB0byBiZSBkb25lIGluIGNvbWJpbmF0aW9uIHdpdGggYW4gUl9NMzJSX0xPMTYgcmVsb2MKLSAgIGJlY2F1c2UgdGhlcmUgaXMgYSBjYXJyeSBmcm9tIHRoZSBMTzE2IHRvIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUKLSAgIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkOyB3ZSBkbyB0aGUgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuCi0gICBUaGlzIGNvZGUgaXMgY29waWVkIGZyb20gdGhlIGVsZjMyLW1pcHMuYy4gIFdlIGFsc28gc3VwcG9ydCBhbiBhcmJpdHJhcnkKLSAgIG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNiByZWxvYy4gIFRoZQotICAgYXNzZW1ibGVyIHNvcnRzIHRoZSByZWxvY3MgdG8gZW5zdXJlIGVhY2ggSEkxNiBpbW1lZGlhdGVseSBwcmVjZWRlcyBpdHMKLSAgIExPMTYuICBIb3dldmVyIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb3BpZXMsIHRoZSBhc3NlbWJsZXIgbWF5IG5vdCBmaW5kCi0gICB0aGUgcmVhbCBMTzE2IHNvIGl0IHBpY2tzIHRoZSBmaXJzdCBvbmUgaXQgZmluZHMuICAqLwotCi1zdHJ1Y3QgbTMycl9oaTE2Ci17Ci0gIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7Ci0gIGJmZF9ieXRlICphZGRyOwotICBiZmRfdm1hIGFkZGVuZDsKLX07Ci0KLS8qIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgYmUgYSBzdGF0aWMgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG0zMnJfaGkxNiAqbTMycl9oaTE2X2xpc3Q7Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2hpMTZfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgc3RydWN0IG0zMnJfaGkxNiAqbjsKLQotICAvKiBUaGlzIHBhcnQgaXMgZnJvbSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MuCi0gICAgIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGFuIGV4dGVybmFsIHN5bWJvbCwgd2UgZG9uJ3Qgd2FudAotICAgICB0byBjaGFuZ2UgYW55dGhpbmcuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcyAob2Zmc2V0IGluIHNlY3Rpb24pLiAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICByZXQgPSBiZmRfcmVsb2Nfb2s7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIG91dHB1dF9iZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIHJldCA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIFNhdmUgdGhlIGluZm9ybWF0aW9uLCBhbmQgbGV0IExPMTYgZG8gdGhlIGFjdHVhbCByZWxvY2F0aW9uLiAgKi8KLSAgbiA9IChzdHJ1Y3QgbTMycl9oaTE2ICopIGJmZF9tYWxsb2MgKHNpemVvZiAqbik7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotICBuLT5hZGRyID0gKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgbi0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgbi0+bmV4dCA9IG0zMnJfaGkxNl9saXN0OwotICBtMzJyX2hpMTZfbGlzdCA9IG47Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogSGFuZGxlIGFuIE0zMlIgRUxGIEhJMTYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCB0eXBlLCByZWxoaSwgcmVsbG8sIGNvbnRlbnRzLCBhZGRlbmQpCi0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBpbnQgdHlwZTsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBhZGRsbzsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Ci0KLSAgYWRkbG8gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsbG8tPnJfb2Zmc2V0KTsKLSAgaWYgKHR5cGUgPT0gUl9NMzJSX0hJMTZfU0xPKQotICAgIGFkZGxvID0gKChhZGRsbyAmIDB4ZmZmZikgXiAweDgwMDApIC0gMHg4MDAwOwotICBlbHNlCi0gICAgYWRkbG8gJj0gMHhmZmZmOwotCi0gIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIGFkZGxvOwotCi0gIC8qIFJlYWNjb3VudCBmb3Igc2lnbiBleHRlbnNpb24gb2YgbG93IHBhcnQuICAqLwotICBpZiAodHlwZSA9PSBSX00zMlJfSEkxNl9TTE8KLSAgICAgICYmIChhZGRlbmQgJiAweDgwMDApICE9IDApCi0gICAgYWRkZW5kICs9IDB4MTAwMDA7Ci0KLSAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLAotCSAgICAgIChpbnNuICYgMHhmZmZmMDAwMCkgfCAoKGFkZGVuZCA+PiAxNikgJiAweGZmZmYpLAotCSAgICAgIGNvbnRlbnRzICsgcmVsaGktPnJfb2Zmc2V0KTsKLX0KLQotLyogRG8gYW4gUl9NMzJSX0xPMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0Ci0gICBpbnBsYWNlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZQotICAgUl9NMzJSX0hJMTZfW1NVXUxPIHJlbG9jYXRpb24gZGVzY3JpYmVkIGFib3ZlLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9sbzE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAobTMycl9oaTE2X2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbTMycl9oaTE2ICpsOwotCi0gICAgICBsID0gbTMycl9oaTE2X2xpc3Q7Ci0gICAgICB3aGlsZSAobCAhPSBOVUxMKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgdW5zaWduZWQgbG9uZyB2YWxsbzsKLQkgIHN0cnVjdCBtMzJyX2hpMTYgKm5leHQ7Ci0KLQkgIC8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QgbmVlZAotCSAgICAgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZSB0bwotCSAgICAgZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLwotCSAgaW5zbiA9IGJmZF9nZXRfMzIgKGFiZmQsIGwtPmFkZHIpOwotCSAgdmFsbG8gPSAoKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKSBeIDB4ODAwMCkgLSAweDgwMDA7Ci0JICB2YWwgPSAoKGluc24gJiAweGZmZmYpIDw8IDE2KSArIHZhbGxvOwotCSAgdmFsICs9IGwtPmFkZGVuZDsKLQotCSAgLyogUmVhY2NvdW50IGZvciBzaWduIGV4dGVuc2lvbiBvZiBsb3cgcGFydC4gICovCi0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtMzJyX2hpMTZfbGlzdCA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyB0aGUgTE8xNiByZWxvYyBpbiB0aGUgdXN1YWwgd2F5LiAgKi8KLSAgcmV0dXJuIGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQlpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKTsKLX0KLQotLyogSGFuZGxlIHRoZSBSX00zMlJfU0RBMTYgcmVsb2MuCi0gICBUaGlzIHJlbG9jIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiBvYmplY3RzIGluIHRoZSBzbWFsbCBkYXRhIGFyZWEKLSAgIGFuZCB0byBwZXJmb3JtIGxvYWRzIGFuZCBzdG9yZXMgZnJvbSB0aGF0IGFyZWEuCi0gICBUaGUgbG93ZXIgMTYgYml0cyBhcmUgc2lnbiBleHRlbmRlZCBhbmQgYWRkZWQgdG8gdGhlIHJlZ2lzdGVyIHNwZWNpZmllZAotICAgaW4gdGhlIGluc3RydWN0aW9uLCB3aGljaCBpcyBhc3N1bWVkIHRvIHBvaW50IHRvIF9TREFfQkFTRV8uICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1tMzJyX2VsZl9zZGExNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJICAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIC8qIFRoaXMgcGFydCBpcyBmcm9tIGJmZF9lbGZfZ2VuZXJpY19yZWxvYy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jX2VudHJ5LT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICBpZiAob3V0cHV0X2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBTZWUgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gIElzIHRoaXMgcmlnaHQ/ICAqLwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLSAgICB9Ci0KLSAgLyogRklYTUU6IG5vdCBzdXJlIHdoYXQgdG8gZG8gaGVyZSB5ZXQuICBCdXQgdGhlbiBhZ2FpbiwgdGhlIGxpbmtlcgotICAgICBtYXkgbmV2ZXIgY2FsbCB1cy4gICovCi0gIGFib3J0ICgpOwotfQotDAotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBNMzJSIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCBtMzJyX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtMzJyX3JlbG9jX21hcCBtMzJyX3JlbG9jX21hcFtdID0KLXsKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl9NMzJSX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfTTMyUl8xNiB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9NMzJSXzMyIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjQsIFJfTTMyUl8yNCB9LAotICB7IEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMLCBSX00zMlJfMTBfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl8xOF9QQ1JFTCwgUl9NMzJSXzE4X1BDUkVMIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwsIFJfTTMyUl8yNl9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPLCBSX00zMlJfSEkxNl9VTE8gfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywgUl9NMzJSX0hJMTZfU0xPIH0sCi0gIHsgQkZEX1JFTE9DX00zMlJfTE8xNiwgUl9NMzJSX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTTMyUl9TREExNiwgUl9NMzJSX1NEQTE2IH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX00zMlJfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfTTMyUl9HTlVfVlRFTlRSWSB9LAotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsKLSAgICAgICBpIDwgc2l6ZW9mIChtMzJyX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBtMzJyX3JlbG9jX21hcCk7Ci0gICAgICAgaSsrKQotICAgIHsKLSAgICAgIGlmIChtMzJyX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZtMzJyX2VsZl9ob3d0b190YWJsZVttMzJyX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYW4gTTMyUiBFTEYgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotbTMycl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLQotICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKTsKLSAgQkZEX0FTU0VSVCAocl90eXBlIDwgKHVuc2lnbmVkIGludCkgUl9NMzJSX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSAmbTMycl9lbGZfaG93dG9fdGFibGVbcl90eXBlXTsKLX0KLQwKLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgKi8KLQotYm9vbGVhbgotX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIGhkciwgc2VjLCByZXR2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgKnJldHZhbDsKLXsKLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NMzJSX1NDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogTTMyUiBFTEYgdXNlcyB0d28gY29tbW9uIHNlY3Rpb25zLiAgT25lIGlzIHRoZSB1c3VhbCBvbmUsIGFuZCB0aGUgb3RoZXIKLSAgIGlzIGZvciBzbWFsbCBvYmplY3RzLiAgQWxsIHRoZSBzbWFsbCBvYmplY3RzIGFyZSBrZXB0IHRvZ2V0aGVyLCBhbmQgdGhlbgotICAgcmVmZXJlbmNlZCB2aWEgb25lIHJlZ2lzdGVyLCB3aGljaCB5aWVsZHMgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgSXQgaXMKLSAgIHVwIHRvIHRoZSBjb21waWxlciB0byBlbWl0IGFuIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIHJlZ2lzdGVyIHdpdGgKLSAgIF9TREFfQkFTRS4gIFRoaXMgaXMgd2hhdCB3ZSB1c2UgZm9yIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gIFRoaXMKLSAgIGFwcHJvYWNoIGlzIGNvcGllZCBmcm9tIGVsZjMyLW1pcHMuYy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbTMycl9lbGZfc2NvbV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLiAgKi8KLQotdm9pZAotX2JmZF9tMzJyX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0KLSAgc3dpdGNoIChlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgIGlmIChtMzJyX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5mbGFncyA9IFNFQ19JU19DT01NT047Ci0JICBtMzJyX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgbTMycl9lbGZfc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbDsKLQkgIG0zMnJfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbC5uYW1lID0gIi5zY29tbW9uIjsKLQkgIG0zMnJfZWxmX3Njb21fc3ltYm9sLmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgbTMycl9lbGZfc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0JICBtMzJyX2VsZl9zY29tX3N5bWJvbF9wdHIgPSAmbTMycl9lbGZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICZtMzJyX2VsZl9zY29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgTTMyUiBzZWN0aW9uIG51bWJlcnMgaGVyZS4KLSAgIFdlIGFsc28ga2VlcCB3YXRjaGluZyBmb3Igd2hldGhlciB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc2RhdGEgc3BlY2lhbAotICAgbGlua2VyIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKmZsYWdzcDsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBiZmRfdm1hICp2YWxwOwotewotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICgqbmFtZXApWzBdID09ICdfJyAmJiAoKm5hbWVwKVsxXSA9PSAnUycKLSAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX1NEQV9CQVNFXyIpID09IDApCi0gICAgewotICAgICAgLyogVGhpcyBpcyBzaW1wbGVyIHRoYW4gdXNpbmcgX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uCi0JIChvdXIgbmVlZHMgYXJlIHNpbXBsZXIgdGhhbiBwcGMncyBuZWVkcykuICBBbHNvCi0JIF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiBjdXJyZW50bHkgaGFzIGEgYnVnIHdoZXJlIGlmIGEgLnNkYXRhCi0JIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMgYSBuZXcgb25lIGlzIGNyZWF0ZWQgdGhhdCBmb2xsb3dzIGl0IHdoaWNoCi0JIHNjcmV3cyBvZiBfU0RBX0JBU0VfIGFkZHJlc3MgY2FsY3MgYmVjYXVzZSBvdXRwdXRfb2Zmc2V0ICE9IDAuICAqLwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgY29iYmxlZCBmcm9tIGVsZjMyLXBwYy5jIGFuZCBlbGZsaW5rLmMuICAqLwotCi0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGludCBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLQkgIHMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zZGF0YSIpOwotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKTsKLQl9Ci0KLSAgICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikKLQliZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgaWYgKChoID09IE5VTEwgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSBhYmZkLAotCQkJCQkJICJfU0RBX0JBU0VfIiwKLQkJCQkJCSBCU0ZfR0xPQkFMLAotCQkJCQkJIHMsCi0JCQkJCQkgMzI3NjgsCi0JCQkJCQkgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSBmYWxzZSwKLQkJCQkJCSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotICAgIH0KLQotICBzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpCi0gICAgewotICAgIGNhc2UgU0hOX00zMlJfU0NPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnNjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgaGF2ZSB0byBmaWd1cmUgb3V0IHRoZSBTREFfQkFTRSB2YWx1ZSwgc28gdGhhdCB3ZSBjYW4gYWRqdXN0IHRoZQotICAgc3ltYm9sIHZhbHVlIGNvcnJlY3RseS4gIFdlIGxvb2sgdXAgdGhlIHN5bWJvbCBfU0RBX0JBU0VfIGluIHRoZSBvdXRwdXQKLSAgIEJGRC4gIElmIHdlIGNhbid0IGZpbmQgaXQsIHdlJ3JlIHN0dWNrLiAgV2UgY2FjaGUgaXQgaW4gdGhlIEVMRgotICAgdGFyZ2V0IGRhdGEuICBXZSBkb24ndCBuZWVkIHRvIGFkanVzdCB0aGUgc3ltYm9sIHZhbHVlIGZvciBhbgotICAgZXh0ZXJuYWwgc3ltYm9sIGlmIHdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW0zMnJfZWxmX2ZpbmFsX3NkYV9iYXNlIChvdXRwdXRfYmZkLCBpbmZvLCBlcnJvcl9tZXNzYWdlLCBwc2IpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJvcl9tZXNzYWdlOwotICAgICBiZmRfdm1hICpwc2I7Ci17Ci0gIGlmIChlbGZfZ3AgKG91dHB1dF9iZmQpID09IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9TREFfQkFTRV8iLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCWVsZl9ncCAob3V0cHV0X2JmZCkgPSAoaC0+dS5kZWYudmFsdWUKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIE9ubHkgZ2V0IHRoZSBlcnJvciBvbmNlLiAgKi8KLQkgICpwc2IgPSBlbGZfZ3AgKG91dHB1dF9iZmQpID0gNDsKLQkgICplcnJvcl9tZXNzYWdlID0KLQkgICAgKGNvbnN0IGNoYXIgKikgXygiU0RBIHJlbG9jYXRpb24gd2hlbiBfU0RBX0JBU0VfIG5vdCBkZWZpbmVkIik7Ci0JICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQl9Ci0gICAgfQotICAqcHNiID0gZWxmX2dwIChvdXRwdXRfYmZkKTsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQwKLS8qIFJlbG9jYXRlIGFuIE0zMlIvRCBFTEYgc2VjdGlvbi4KLSAgIFRoZXJlIGlzIHNvbWUgYXR0ZW1wdCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gdXNhYmxlIGZvciBtYW55IGFyY2hpdGVjdHVyZXMsCi0gICBib3RoIFVTRV9SRUwgYW5kIFVTRV9SRUxBIFsndHdvdWxkIGJlIG5pY2UgaWYgc3VjaCBhIGNyaXR0ZXIgZXhpc3RlZF0sCi0gICBpZiBvbmx5IHRvIHNlcnZlIGFzIGEgbGVhcm5pbmcgdG9vbC4KLQotICAgVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBuZXcgRUxGIGJhY2tlbmQgbGlua2VyCi0gICB0byBoYW5kbGUgdGhlIHJlbG9jYXRpb25zIGZvciBhIHNlY3Rpb24uCi0KLSAgIFRoZSByZWxvY3MgYXJlIGFsd2F5cyBwYXNzZWQgYXMgUmVsYSBzdHJ1Y3R1cmVzOyBpZiB0aGUgc2VjdGlvbgotICAgYWN0dWFsbHkgdXNlcyBSZWwgc3RydWN0dXJlcywgdGhlIHJfYWRkZW5kIGZpZWxkIHdpbGwgYWx3YXlzIGJlCi0gICB6ZXJvLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3QgdGhlIHNlY3Rpb24gY29udGVudHMgYXMKLSAgIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcyBhbmQgZ2VuZXJhdGluZyBhCi0gICByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUgcmVsb2MgYWRkZW5kIGFzCi0gICBuZWNlc3NhcnkuCi0KLSAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHRoZSByZWxvYwotICAgYWRkcmVzcyBvciB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4LgotCi0gICBMT0NBTF9TWU1TIGlzIGEgcG9pbnRlciB0byB0aGUgc3dhcHBlZCBpbiBsb2NhbCBzeW1ib2xzLgotCi0gICBMT0NBTF9TRUNUSU9OUyBpcyBhbiBhcnJheSBnaXZpbmcgdGhlIHNlY3Rpb24gaW4gdGhlIGlucHV0IGZpbGUKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0X3NobmR4IGZpZWxkIG9mIGVhY2ggbG9jYWwgc3ltYm9sLgotCi0gICBUaGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkgZm9yIHRoZSBnbG9iYWwgc3ltYm9scyBjYW4gYmUgZm91bmQKLSAgIHZpYSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKS4KLQotICAgV2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoaXMgZnVuY3Rpb24gbXVzdCBoYW5kbGUKLSAgIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZSBvdXRwdXQgc3ltYm9sIGlzCi0gICBnb2luZyB0byBiZSB0aGUgc2VjdGlvbiBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0Ci0gICBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IHRoZSBhZGRlbmQgbXVzdCBiZSBhZGp1c3RlZAotICAgYWNjb3JkaW5nbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICAvKiBBc3N1bWUgc3VjY2Vzcy4gICovCi0gIGJvb2xlYW4gcmV0ID0gdHJ1ZTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgLyogV2UgY2FuJ3QgbW9kaWZ5IHJfYWRkZW5kIGhlcmUgYXMgZWxmX2xpbmtfaW5wdXRfYmZkIGhhcyBhbiBhc3NlcnQgdG8KLQkgZW5zdXJlIGl0J3MgemVybyAod2UgdXNlIFJFTCByZWxvY3MsIG5vdCBSRUxBKS4gIFRoZXJlZm9yZSB0aGlzCi0JIHNob3VsZCBiZSBhc3NpZ25pbmcgemVybyB0byBgYWRkZW5kJywgYnV0IGZvciBjbGFyaXR5IHdlIHVzZQotCSBgcl9hZGRlbmQnLiAgKi8KLSAgICAgIGJmZF92bWEgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF92bWEgb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfTTMyUl9tYXgpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogdW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWQiKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgKGludCkgcl90eXBlKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NMzJSX0dOVV9WVEVOVFJZCi0gICAgICAgICAgfHwgcl90eXBlID09IFJfTTMyUl9HTlVfVlRJTkhFUklUKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaG93dG8gPSBtMzJyX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc2VjID0gTlVMTDsKLQkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgLyogRXh0ZXJuYWwgc3ltYm9sLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBMb2NhbCBzeW1ib2wuICAqLwotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCSAgLyogU1RUX1NFQ1RJT046IHN5bWJvbCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgKi8KLQkgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKLQkgICAgewotCSAgICAgIC8qIFN5bWJvbCBpc24ndCBhc3NvY2lhdGVkIHdpdGggYSBzZWN0aW9uLiAgTm90aGluZyB0byBkby4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0jaWZuZGVmIFVTRV9SRUwKLQkgIC8qIFRoaXMgY2FuJ3QgYmUgZG9uZSBmb3IgVVNFX1JFTCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWVhbiBhbnl0aGluZwotCSAgICAgYW5kIGVsZl9saW5rX2lucHV0X2JmZCBhc3NlcnRzIHRoaXMgc3RheXMgemVyby4gICovCi0JICByZWwtPnJfYWRkZW5kID0gYWRkZW5kOwotI2VuZGlmCi0KLSNpZm5kZWYgVVNFX1JFTAotCSAgLyogQWRkZW5kcyBhcmUgc3RvcmVkIHdpdGggcmVsb2NzLiAgV2UncmUgZG9uZS4gICovCi0JICBjb250aW51ZTsKLSNlbHNlIC8qIFVTRV9SRUwgKi8KLQkgIC8qIElmIHBhcnRpYWxfaW5wbGFjZSwgd2UgbmVlZCB0byBzdG9yZSBhbnkgYWRkaXRpb25hbCBhZGRlbmQKLQkgICAgIGJhY2sgaW4gdGhlIHNlY3Rpb24uICAqLwotCSAgaWYgKCEgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSkKLQkgICAgY29udGludWU7Ci0JICAvKiA/Pz8gSGVyZSBpcyBhIG5pY2UgcGxhY2UgdG8gY2FsbCBhIHNwZWNpYWxfZnVuY3Rpb24KLQkgICAgIGxpa2UgaGFuZGxlci4gICovCi0JICBpZiAocl90eXBlICE9IFJfTTMyUl9ISTE2X1NMTyAmJiByX3R5cGUgIT0gUl9NMzJSX0hJMTZfVUxPKQotCSAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJYWRkZW5kLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqbG9yZWw7Ci0KLQkgICAgICAvKiBXZSBhbGxvdyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIEhJMTYgcmVsb2NzIGJlZm9yZSB0aGUKLQkJIExPMTYgcmVsb2MuICBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLQkJIGl0c2VsZi4gICovCi0JICAgICAgZm9yIChsb3JlbCA9IHJlbCArIDE7Ci0JCSAgIChsb3JlbCA8IHJlbGVuZAotCQkgICAgJiYgKEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0hJMTZfU0xPCi0JCQl8fCBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9ISTE2X1VMTykpOwotCQkgICBsb3JlbCsrKQotCQljb250aW51ZTsKLQkgICAgICBpZiAobG9yZWwgPCByZWxlbmQKLQkJICAmJiBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTTMyUl9MTzE2KQotCQl7Ci0JCSAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCi0JCQkJCSAgY29udGVudHMsIGFkZGVuZCk7Ci0JCSAgciA9IGJmZF9yZWxvY19vazsKLQkJfQotCSAgICAgIGVsc2UKLQkJciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCi0JCQkJCSAgICBhZGRlbmQsIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgICAgfQotI2VuZGlmIC8qIFVTRV9SRUwgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0JICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0JICBzeW0gPSBOVUxMOwotCSAgc2VjID0gTlVMTDsKLQotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIC8qIExvY2FsIHN5bWJvbC4gICovCi0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgICAgICBzeW1fbmFtZSA9ICI8bG9jYWwgc3ltYm9sPiI7Ci0JICAgICAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJICAgICsgc3ltLT5zdF92YWx1ZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEV4dGVybmFsIHN5bWJvbC4gICovCi0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAgICAgc3ltX25hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCi0JICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQl7Ci0JCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIGlmIChzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgICByZWxvY2F0aW9uID0gMDsKLQkJICBlbHNlCi0JCSAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCQkgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCXJlbG9jYXRpb24gPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLCBvZmZzZXQpKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIFNhbml0eSBjaGVjayB0aGUgYWRkcmVzcy4gICovCi0JICBpZiAob2Zmc2V0ID4gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICB7Ci0JICAgICAgciA9IGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCSAgICAgIGdvdG8gY2hlY2tfcmVsb2M7Ci0JICAgIH0KLQotCSAgc3dpdGNoICgoaW50KSByX3R5cGUpCi0JICAgIHsKLQkgICAgY2FzZSAoaW50KSBSX00zMlJfMTBfUENSRUwgOgotCSAgICAgIHIgPSBtMzJyX2VsZl9kb18xMF9wY3JlbF9yZWxvYyAoaW5wdXRfYmZkLCBob3d0bywgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgY29udGVudHMsIG9mZnNldCwKLQkJCQkJICAgICAgc2VjLCByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgKGludCkgUl9NMzJSX0hJMTZfU0xPIDoKLQkgICAgY2FzZSAoaW50KSBSX00zMlJfSEkxNl9VTE8gOgotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JCS8qIFdlIGFsbG93IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgSEkxNiByZWxvY3MgYmVmb3JlIHRoZQotCQkgICBMTzE2IHJlbG9jLiAgVGhpcyBwZXJtaXRzIGdjYyB0byBlbWl0IHRoZSBISSBhbmQgTE8gcmVsb2NzCi0JCSAgIGl0c2VsZi4gICovCi0JCWZvciAobG9yZWwgPSByZWwgKyAxOwotCQkgICAgIChsb3JlbCA8IHJlbGVuZAotCQkgICAgICAmJiAoRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9TTE8KLQkJCSAgfHwgRUxGMzJfUl9UWVBFIChsb3JlbC0+cl9pbmZvKSA9PSBSX00zMlJfSEkxNl9VTE8pKTsKLQkJICAgICBsb3JlbCsrKQotCQkgIGNvbnRpbnVlOwotCQlpZiAobG9yZWwgPCByZWxlbmQKLQkJICAgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NMzJSX0xPMTYpCi0JCSAgewotCQkgICAgbTMycl9lbGZfcmVsb2NhdGVfaGkxNiAoaW5wdXRfYmZkLCByX3R5cGUsIHJlbCwgbG9yZWwsCi0JCQkJCSAgICBjb250ZW50cywgcmVsb2NhdGlvbiArIGFkZGVuZCk7Ci0JCSAgICByID0gYmZkX3JlbG9jX29rOwotCQkgIH0KLQkJZWxzZQotCQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCQljb250ZW50cywgb2Zmc2V0LAotCQkJCQkJcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAoaW50KSBSX00zMlJfU0RBMTYgOgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JCW5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotCQlpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCi0JCSAgewotCQkgICAgYmZkX3ZtYSBzZGFfYmFzZTsKLQkJICAgIGJmZCAqb3V0X2JmZCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotCi0JCSAgICByID0gbTMycl9lbGZfZmluYWxfc2RhX2Jhc2UgKG91dF9iZmQsIGluZm8sCi0JCQkJCQkgJmVycm1zZywKLQkJCQkJCSAmc2RhX2Jhc2UpOwotCQkgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCQkgICAgICB7Ci0JCQlyZXQgPSBmYWxzZTsKLQkJCWdvdG8gY2hlY2tfcmVsb2M7Ci0JCSAgICAgIH0KLQotCQkgICAgLyogQXQgdGhpcyBwb2ludCBgcmVsb2NhdGlvbicgY29udGFpbnMgdGhlIG9iamVjdCdzCi0JCSAgICAgICBhZGRyZXNzLiAgKi8KLQkJICAgIHJlbG9jYXRpb24gLT0gc2RhX2Jhc2U7Ci0JCSAgICAvKiBOb3cgaXQgY29udGFpbnMgdGhlIG9mZnNldCBmcm9tIF9TREFfQkFTRV8uICAqLwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFRoZSB0YXJnZXQgKCVzKSBvZiBhbiAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBzZWN0aW9uICglcykiKSwKLQkJCQkJICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkJICAgc3ltX25hbWUsCi0JCQkJCSAgIG0zMnJfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHJfdHlwZV0ubmFtZSwKLQkJCQkJICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYykpOwotCQkgICAgLypiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsgPz8/IHdoeT8gKi8KLQkJICAgIHJldCA9IGZhbHNlOwotCQkgICAgY29udGludWU7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBkZWZhdWx0IDoKLQkgICAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgY29udGVudHMsIG9mZnNldCwKLQkJCQkJICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICBjaGVja19yZWxvYzoKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBnZW5lcmljIGVub3VnaCB0byBnbyBpbiBhIHV0aWxpdHkuICAqLwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIGlmIChlcnJtc2cgIT0gTlVMTCkKLQkgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG9mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3V0b2ZyYW5nZToKLQkgICAgICBlcnJtc2cgPSBfKCJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bnN1cHBvcnRlZCByZWxvY2F0aW9uIGVycm9yIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfZGFuZ2Vyb3VzOgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiBkYW5nZXJvdXMgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGVycm1zZyA9IF8oImludGVybmFsIGVycm9yOiB1bmtub3duIGVycm9yIik7Ci0JICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0KLQkgICAgY29tbW9uX2Vycm9yOgotCSAgICAgIGlmICghKCgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKQotCQkgICAgKGluZm8sIGVycm1zZywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG9mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0jaWYgMCAvKiByZWxheGluZyBub3Qgc3VwcG9ydGVkIHlldCAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcmVsYXhpbmcgZm9yIHRoZSBtMzJyLgotICAgUmVsYXhpbmcgb24gdGhlIG0zMnIgaXMgdHJpY2t5IGJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb24gYWxpZ25tZW50Ci0gICByZXF1aXJlbWVudHMgKDQgYnl0ZSBpbnN0cnVjdGlvbnMgbXVzdCBiZSBhbGlnbmVkIG9uIDQgYnl0ZSBib3VuZGFyaWVzKS4KLQotICAgVGhlIGZvbGxvd2luZyByZWxheGluZyBvcHBvcnR1bml0aWVzIGFyZSBoYW5kbGVkOgotCi0gICBzZXRoL2FkZDMvamwgLT4gYmwyNCBvciBibDgKLSAgIHNldGgvYWRkMyAtPiBsZDI0Ci0KLSAgIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIGJsMjQgLT4gYmw4IGJ1dCBnaXZlbjoKLQotICAgLSA0IGJ5dGUgaW5zbnMgbXVzdCBiZSBvbiA0IGJ5dGUgYm91bmRhcmllcwotICAgLSBicmFuY2ggaW5zdHJ1Y3Rpb25zIG9ubHkgYnJhbmNoIHRvIGluc25zIG9uIDQgYnl0ZSBib3VuZGFyaWVzCi0KLSAgIHRoaXMgaXNuJ3QgbXVjaCBvZiBhIHdpbiBiZWNhdXNlIHRoZSBpbnNuIGluIHRoZSAyICJkZWxldGVkIiBieXRlcwotICAgbXVzdCBiZWNvbWUgYSBub3AuICBXaXRoIHNvbWUgY29tcGxleGl0eSBzb21lIHJlYWwgcmVsYXhhdGlvbiBjb3VsZCBiZQotICAgZG9uZSBidXQgdGhlIGZyZXF1ZW5jeSBqdXN0IHdvdWxkbid0IG1ha2UgaXQgd29ydGggaXQ7IGl0J3MgYmV0dGVyIHRvCi0gICB0cnkgdG8gZG8gYWxsIHRoZSBjb2RlIGNvbXBhY3Rpb24gb25lIGNhbiBlbHNld2hlcmUuCi0gICBXaGVuIHRoZSBjaGlwIHN1cHBvcnRzIHBhcmFsbGVsIDE2IGJpdCBpbnNucywgdGhpbmdzIG1heSBjaGFuZ2UuCi0qLwotCi1zdGF0aWMgYm9vbGVhbiAKLW0zMnJfZWxmX3JlbGF4X3NlY3Rpb24gKGFiZmQsIHNlYywgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIC8qIFRoZSBSZWxhIHN0cnVjdHVyZXMgYXJlIHVzZWQgaGVyZSBiZWNhdXNlIHRoYXQncyB3aGF0Ci0gICAgIF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcyB1c2VzIFtmb3IgY29udmVuaWVuY2UgLSBpdCBzZXRzIHRoZSBhZGRlbmQKLSAgICAgZmllbGQgdG8gMF0uICAqLwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci0gIGJmZF9ieXRlICpjb250ZW50cyA9IE5VTEw7Ci0gIGJmZF9ieXRlICpmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0gIC8qIEFzc3VtZSBub3RoaW5nIGNoYW5nZXMuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciBhIHJlbG9jYXRlYWJsZSBsaW5rLCBpZgotICAgICB0aGlzIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSByZWxvY3MsIG9yIGlmIHRoaXMgaXMgbm90IGEKLSAgICAgY29kZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGxpbmtfaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgc2VjLT5yZWxvY19jb3VudCA9PSAwCi0gICAgICB8fCAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0gICAgICB8fCAwIC8qIEZJWE1FOiBjaGVjayBTSEZfTTMyUl9DQU5fUkVMQVggKi8pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICAvKiBXYWxrIHRocm91Z2ggdGhlbSBsb29raW5nIGZvciByZWxheGluZyBvcHBvcnR1bml0aWVzLiAgKi8KLSAgaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bXZhbDsKLQotICAgICAgLyogSWYgdGhpcyBpc24ndCBzb21ldGhpbmcgdGhhdCBjYW4gYmUgcmVsYXhlZCwgdGhlbiBpZ25vcmUKLQkgdGhpcyByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfTTMyUl9ISTE2X1NMTykKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGlmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LiAgKi8KLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIC8qIEdldCBjYWNoZWQgY29weSBpZiBpdCBleGlzdHMuICAqLwotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBHbyBnZXQgdGhlbSBvZmYgZGlzay4gICovCi0JICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotCSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2NvbnRlbnRzID0gY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgY29udGVudHMsCi0JCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQkgIGFzZWN0aW9uICpzeW1fc2VjOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgJmlzeW0pOwotCi0JICBzeW1fc2VjID0gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIGlzeW0uc3Rfc2huZHgpOwotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBzeW1fc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBpbmR4OwotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIEFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGVsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSByZWZlcmVuY2UgdG8gYW4gdW5kZWZpbmVkCi0gICAgICAgICAgICAgICAgIHN5bWJvbC4gIEp1c3QgaWdub3JlIGl0LS1pdCB3aWxsIGJlIGNhdWdodCBieSB0aGUKLSAgICAgICAgICAgICAgICAgcmVndWxhciByZWxvYyBwcm9jZXNzaW5nLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBzeW12YWwgPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIEZvciBzaW1wbGljaXR5IG9mIGNvZGluZywgd2UgYXJlIGdvaW5nIHRvIG1vZGlmeSB0aGUgc2VjdGlvbgotCSBjb250ZW50cywgdGhlIHNlY3Rpb24gcmVsb2NzLCBhbmQgdGhlIEJGRCBzeW1ib2wgdGFibGUuICBXZQotCSBtdXN0IHRlbGwgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbm90IHRvIGZyZWUgdXAgdGhpcwotCSBpbmZvcm1hdGlvbi4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGluc3RlYWQgY3JlYXRlIGEgdGFibGUKLQkgb2YgY2hhbmdlcyB3aGljaCBoYXZlIHRvIGJlIG1hZGUsIGFzIGlzIGRvbmUgaW4gY29mZi1taXBzLmM7Ci0JIHRoYXQgd291bGQgYmUgbW9yZSB3b3JrLCBidXQgd291bGQgcmVxdWlyZSBsZXNzIG1lbW9yeSB3aGVuCi0JIHRoZSBsaW5rZXIgaXMgcnVuLiAgKi8KLQotICAgICAgLyogVHJ5IHRvIGNoYW5nZSBhIHNldGgvYWRkMy9qbCBzdWJyb3V0aW5lIGNhbGwgdG8gYmwyNCBvciBibDguCi0JIFRoaXMgc2VxdWVuY2UgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciB3aGVuIGNvbXBpbGluZyBpbgotCSAzMiBiaXQgbW9kZS4gIEFsc28gbG9vayBmb3Igc2V0aC9hZGQzIC0+IGxkMjQuICAqLwotCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfTTMyUl9ISTE2X1NMTykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSAqbnJlbDsKLQkgIGJmZF92bWEgcGMgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGJmZF9zaWduZWRfdm1hIHBjcmVsX3ZhbHVlID0gc3ltdmFsIC0gcGM7Ci0JICB1bnNpZ25lZCBpbnQgY29kZSxyZWc7Ci0JICBpbnQgYWRkZW5kLG5vcF9wLGJsOF9wLHRvX2RlbGV0ZTsKLQotCSAgLyogVGhlIHRlc3RzIGFyZSBvcmRlcmVkIHNvIHRoYXQgd2UgZ2V0IG91dCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlCi0JICAgICBpZiB0aGlzIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gcmVsYXgsIHRha2luZyBpbnRvIGFjY291bnQgdGhhdAotCSAgICAgd2UgYXJlIGxvb2tpbmcgZm9yIHR3byBzZXBhcmF0ZSBwb3NzaWJpbGl0aWVzIChqbC9sZDI0KS4gICovCi0KLQkgIC8qIERvIG5vdGhpbmcgaWYgbm8gcm9vbSBpbiB0aGUgc2VjdGlvbiBmb3IgdGhpcyB0byBiZSB3aGF0IHdlJ3JlCi0JICAgICBsb29raW5nIGZvci4gICovCi0JICBpZiAoaXJlbC0+cl9vZmZzZXQgPiBzZWMtPl9jb29rZWRfc2l6ZSAtIDgpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBNYWtlIHN1cmUgdGhlIG5leHQgcmVsb2NhdGlvbiBhcHBsaWVzIHRvIHRoZSBuZXh0Ci0JICAgICBpbnN0cnVjdGlvbiBhbmQgdGhhdCBpdCdzIHRoZSBhZGQzJ3MgcmVsb2MuICAqLwotCSAgbnJlbCA9IGlyZWwgKyAxOwotCSAgaWYgKG5yZWwgPT0gaXJlbGVuZAotCSAgICAgIHx8IGlyZWwtPnJfb2Zmc2V0ICsgNCAhPSBucmVsLT5yX29mZnNldAotCSAgICAgIHx8IEVMRjMyX1JfVFlQRSAobnJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX00zMlJfTE8xNikKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBzZXRoL2FkZDMuICAqLwotCSAgLyogRklYTUU6IFRoaXMgaXMgd2hlcmUgbWFjcm9zIGZyb20gY2dlbiBjYW4gY29tZSBpbi4gICovCi0JICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDApOwotCSAgaWYgKChjb2RlICYgMHhmMGZmKSAhPSAweGQwYzApCi0JICAgIGNvbnRpbnVlOyAvKiBub3Qgc2V0aCByTixmb28gKi8KLQkgIHJlZyA9IChjb2RlICYgMHgwZjAwKSA+PiA4OwotCSAgY29kZSA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQgKyA0KTsKLQkgIGlmIChjb2RlICE9ICgweDgwYTAgfCByZWcgfCAocmVnIDw8IDgpKSkKLQkgICAgY29udGludWU7IC8qIG5vdCBhZGQzIHJOLHJOLGZvbyAqLwotCi0JICAvKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGNvbmZpcm1lZCB3ZSBoYXZlIHNldGgvYWRkMy4gIE5vdyBjaGVjawotCSAgICAgd2hldGhlciB0aGUgbmV4dCBpbnNuIGlzIGEgamwsIGluIHdoaWNoIGNhc2UgdHJ5IHRvIGNoYW5nZSB0aGlzCi0JICAgICB0byBibDI0IG9yIGJsOC4gICovCi0KLQkgIC8qIEVuc3VyZSB0aGUgYnJhbmNoIHRhcmdldCBpcyBpbiByYW5nZS4KLQkgICAgIFRoZSBibDI0IGluc3RydWN0aW9uIGhhcyBhIDI0IGJpdCBvcGVyYW5kIHdoaWNoIGlzIHRoZSB0YXJnZXQKLQkgICAgIGFkZHJlc3MgcmlnaHQgc2hpZnRlZCBieSAyLCBnaXZpbmcgYSBzaWduZWQgcmFuZ2Ugb2YgMjYgYml0cy4KLQkgICAgIE5vdGUgdGhhdCA0IGJ5dGVzIGFyZSBhZGRlZCB0byB0aGUgaGlnaCB2YWx1ZSBiZWNhdXNlIHRoZSB0YXJnZXQKLQkgICAgIHdpbGwgYmUgYXQgbGVhc3QgNCBieXRlcyBjbG9zZXIgaWYgd2UgY2FuIHJlbGF4LiAgSXQnbGwgYWN0dWFsbHkKLQkgICAgIGJlIDQgb3IgOCBieXRlcyBjbG9zZXIsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoIGp1c3QgeWV0IGFuZAotCSAgICAgdGhlIGRpZmZlcmVuY2UgaXNuJ3Qgc2lnbmlmaWNhbnQgZW5vdWdoIHRvIHdvcnJ5IGFib3V0LiAgKi8KLSNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCi0JICBwY3JlbF92YWx1ZSArPSBpcmVsLT5yX2FkZGVuZDsKLSNlbHNlCi0JICBhZGRlbmQgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDIpOwotCSAgcGNyZWxfdmFsdWUgKz0gYWRkZW5kOwotI2VuZGlmCi0KLQkgIGlmIChwY3JlbF92YWx1ZSA+PSAtKDEgPDwgMjUpICYmIHBjcmVsX3ZhbHVlIDwgKDEgPDwgMjUpICsgNAotCSAgICAgIC8qIERvIG5vdGhpbmcgaWYgbm8gcm9vbSBpbiB0aGUgc2VjdGlvbiBmb3IgdGhpcyB0byBiZSB3aGF0IHdlJ3JlCi0JCSBsb29raW5nIGZvci4gICovCi0JICAgICAgJiYgKGlyZWwtPnJfb2Zmc2V0IDw9IHNlYy0+X2Nvb2tlZF9zaXplIC0gMTIpCi0JICAgICAgLyogRW5zdXJlIHRoZSBuZXh0IGluc24gaXMgImpsIHJOIi4gICovCi0JICAgICAgJiYgKChjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDgpKSwKLQkJICBjb2RlICE9ICgweDFlYzAgfCByZWcpKSkKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiByZWxheCB0byBibDI0L2JsOC4gICovCi0KLQkgICAgICAvKiBTZWUgaWYgdGhlcmUncyBhIG5vcCBmb2xsb3dpbmcgdGhlIGpsLgotCQkgQWxzbyBzZWUgaWYgd2UgY2FuIHVzZSBhIGJsOCBpbnNuLiAgKi8KLQkgICAgICBjb2RlID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDEwKTsKLQkgICAgICBub3BfcCA9IChjb2RlICYgMHg3ZmZmKSA9PSBOT1BfSU5TTjsKLQkgICAgICBibDhfcCA9IHBjcmVsX3ZhbHVlID49IC0weDIwMCAmJiBwY3JlbF92YWx1ZSA8IDB4MjAwOwotCi0JICAgICAgaWYgKGJsOF9wKQotCQl7Ci0JCSAgLyogQ2hhbmdlICJzZXRoIHJOLGZvbyIgdG8gImJsOCBmb28gfHwgbm9wIi4KLQkJICAgICBXZSBPUiBpbiBDT0RFIGp1c3QgaW4gY2FzZSBpdCdzIG5vdCBhIG5vcCAodGVjaG5pY2FsbHksCi0JCSAgICAgQ09ERSBjdXJyZW50bHkgbXVzdCBiZSBhIG5vcCwgYnV0IGZvciBjbGVhbm5lc3Mgd2UKLQkJICAgICBhbGxvdyBpdCB0byBiZSBhbnl0aGluZykuICAqLwotI2lmbmRlZiBVU0VfUkVMIC8qIHB1dCBpbiBmb3IgbGVhcm5pbmcgcHVycG9zZXMgKi8KLQkJICBjb2RlID0gMHg3ZTAwMDAwMCB8IE1BS0VfUEFSQUxMRUwgKGNvZGUpOwotI2Vsc2UKLQkJICBjb2RlID0gKDB4N2UwMDAwMDAgKyAoKChhZGRlbmQgPj4gMikgJiAweGZmKSA8PCAxNikpIHwgTUFLRV9QQVJBTExFTCAoY29kZSk7Ci0jZW5kaWYKLQkJICB0b19kZWxldGUgPSA4OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogQ2hhbmdlIHRoZSBzZXRoIHJOLGZvbyB0byBhIGJsMjQgZm9vLiAgKi8KLSNpZm5kZWYgVVNFX1JFTCAvKiBwdXQgaW4gZm9yIGxlYXJuaW5nIHB1cnBvc2VzICovCi0JCSAgY29kZSA9IDB4ZmUwMDAwMDA7Ci0jZWxzZQotCQkgIGNvZGUgPSAweGZlMDAwMDAwICsgKChhZGRlbmQgPj4gMikgJiAweGZmZmZmZik7Ci0jZW5kaWYKLQkJICB0b19kZWxldGUgPSBub3BfcCA/IDggOiA0OwotCQl9Ci0KLQkgICAgICBiZmRfcHV0XzMyIChhYmZkLCBjb2RlLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQotCSAgICAgIC8qIFNldCB0aGUgbmV3IHJlbG9jIHR5cGUuICAqLwotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKG5yZWwtPnJfaW5mbyksCi0JCQkJCSAgIGJsOF9wID8gUl9NMzJSXzEwX1BDUkVMIDogUl9NMzJSXzI2X1BDUkVMKTsKLQotCSAgICAgIC8qIERlbGV0ZSB0aGUgYWRkMyByZWxvYyBieSBtYWtpbmcgaXQgYSBudWxsIHJlbG9jLiAgKi8KLQkgICAgICBucmVsLT5yX2luZm8gPSBFTEYzMl9SX0lORk8gKEVMRjMyX1JfU1lNIChucmVsLT5yX2luZm8pLAotCQkJCQkgICBSX00zMlJfTk9ORSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkZGVuZCA+PSAwCi0JCSAgICYmIHN5bXZhbCArIGFkZGVuZCA8PSAweGZmZmZmZikKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiByZWxheCB0byBsZDI0LiAgKi8KLQotCSAgICAgIGNvZGUgPSAweGUwMDAwMDAwIHwgKHJlZyA8PCAyNCkgfCAoYWRkZW5kICYgMHhmZmZmZmYpOwotCSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGNvZGUsIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCSAgICAgIHRvX2RlbGV0ZSA9IDQ7Ci0JICAgICAgLyogVGVsbCB0aGUgZm9sbG93aW5nIGNvZGUgYSBub3AgZmlsbGVyIGlzbid0IG5lZWRlZC4gICovCi0JICAgICAgbm9wX3AgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBDYW4ndCBkbyBhbnl0aGluZyBoZXJlLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBOb3RlIHRoYXQgd2UndmUgY2hhbmdlZCB0aGUgcmVsb2NzLCBzZWN0aW9uIGNvbnRlbnRzLCBldGMuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dHN5bXM7Ci0JICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotCi0JICAvKiBEZWxldGUgVE9fREVMRVRFIGJ5dGVzIG9mIGRhdGEuICAqLwotCSAgaWYgKCFtMzJyX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywKLQkJCQkJICAgIGlyZWwtPnJfb2Zmc2V0ICsgNCwgdG9fZGVsZXRlKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIE5vdyB0aGF0IHRoZSBmb2xsb3dpbmcgYnl0ZXMgaGF2ZSBiZWVuIG1vdmVkIGludG8gcGxhY2UsIHNlZSBpZgotCSAgICAgd2UgbmVlZCB0byByZXBsYWNlIHRoZSBqbCB3aXRoIGEgbm9wLiAgVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGFkCi0JICAgICB0byB1c2UgYSBibDI0IGluc24gYW5kIHRoZSBpbnNuIGZvbGxvd2luZyB0aGUgamwgaXNuJ3QgYSBub3AuCi0JICAgICBUZWNobmljYWxseSwgdGhpcyBzaXR1YXRpb24gY2FuJ3QgaGFwcGVuIChzaW5jZSB0aGUgaW5zbiBjYW4KLQkgICAgIG5ldmVyIGJlIGV4ZWN1dGVkKSBidXQgdG8gYmUgY2xlYW4gd2UgZG8gdGhpcy4gIFdoZW4gdGhlIGNoaXAKLQkgICAgIHN1cHBvcnRzIHBhcmFsbGVsIDE2IGJpdCBpbnNucyB0aGluZ3MgbWF5IGNoYW5nZS4KLQkgICAgIFdlIGRvbid0IG5lZWQgdG8gZG8gdGhpcyBpbiB0aGUgY2FzZSBvZiByZWxheGluZyB0byBsZDI0LAotCSAgICAgYW5kIHRoZSBhYm92ZSBjb2RlIHNldHMgbm9wX3Agc28gdGhpcyBpc24ndCBkb25lLiAgKi8KLQkgIGlmICghIG5vcF9wICYmIHRvX2RlbGV0ZSA9PSA0KQotCSAgICBiZmRfcHV0XzE2IChhYmZkLCBOT1BfSU5TTiwgY29udGVudHMgKyBpcmVsLT5yX29mZnNldCArIDQpOwotCi0JICAvKiBUaGF0IHdpbGwgY2hhbmdlIHRoaW5ncywgc28gd2Ugc2hvdWxkIHJlbGF4IGFnYWluLgotCSAgICAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHJlcXVpcmVkLCBhbmQgaXQgbWF5IGJlIHNsb3cuICAqLwotCSAgKmFnYWluID0gdHJ1ZTsKLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBsb29wIHRvIHRyeSB0aGUgbmV4dCByZWxvYyAqLwotICAgIH0KLQotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gICAgICBmcmVlX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLQlmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ2FjaGUgdGhlIHN5bWJvbHMgZm9yIGVsZl9saW5rX2lucHV0X2JmZC4gICovCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IGV4dHN5bXM7Ci0JfQotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2NvbnRlbnRzKTsKLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfZXh0c3ltcyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogRGVsZXRlIHNvbWUgYnl0ZXMgZnJvbSBhIHNlY3Rpb24gd2hpbGUgcmVsYXhpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICBpbnQgc2huZHgsIGluZGV4OwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGV4dHN5bXMgPSAoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotCi0gIHNobmR4ID0gX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChhYmZkLCBzZWMpOwotCi0gIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0KLSAgLyogVGhlIGRlbGV0aW9uIG11c3Qgc3RvcCBhdCB0aGUgbmV4dCBBTElHTiByZWxvYyBmb3IgYW4gYWxpZ21lbnQKLSAgICAgcG93ZXIgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgZGVsZXRpbmcuICAqLwotCi0gIGlyZWxhbGlnbiA9IE5VTEw7Ci0gIHRvYWRkciA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gIGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7Ci0gIGlyZWxlbmQgPSBpcmVsICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBBY3R1YWxseSBkZWxldGUgdGhlIGJ5dGVzLiAgKi8KLSAgbWVtbW92ZSAoY29udGVudHMgKyBhZGRyLCBjb250ZW50cyArIGFkZHIgKyBjb3VudCwgdG9hZGRyIC0gYWRkciAtIGNvdW50KTsKLSAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0KLSAgLyogQWRqdXN0IGFsbCB0aGUgcmVsb2NzLiAgKi8KLSAgZm9yIChpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIC8qIEdldCB0aGUgbmV3IHJlbG9jIGFkZHJlc3MuICAqLwotICAgICAgaWYgKChpcmVsLT5yX29mZnNldCA+IGFkZHIKLQkgICAmJiBpcmVsLT5yX29mZnNldCA8IHRvYWRkcikpCi0JaXJlbC0+cl9vZmZzZXQgLT0gY291bnQ7Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgotCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotICAgICAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdOwotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmICgoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBhIHZlcnNpb24gb2YgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gICB3aGljaCB1c2VzIG0zMnJfZWxmX3JlbG9jYXRlX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotbTMycl9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCSBkYXRhLCByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICoqc2VjdGlvbnMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1N5bSAqaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0KLSAgLyogV2Ugb25seSBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiByZWxheGluZywgb3Igb2YgaGF2aW5nIGEKLSAgICAgcGFydGljdWxhciBzZXQgb2Ygc2VjdGlvbiBjb250ZW50cywgc3BlY2lhbGx5LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZQotICAgICAgfHwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgbGlua19pbmZvLAotCQkJCQkJICAgICAgIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCQkgICAgICAgcmVsb2NhdGVhYmxlLAotCQkJCQkJICAgICAgIHN5bWJvbHMpOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotCi0gIG1lbWNweSAoZGF0YSwgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnRoaXNfaGRyLmNvbnRlbnRzLAotCSAgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0gICAgICAmJiBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1N5bSAqaXN5bXA7Ci0gICAgICBhc2VjdGlvbiAqKnNlY3BwOwotICAgICAgRWxmMzJfRXh0ZXJuYWxfU3ltICplc3ltLCAqZXN5bWVuZDsKLQotICAgICAgaWYgKHN5bXRhYl9oZHItPmNvbnRlbnRzICE9IE5VTEwpCi0JZXh0ZXJuYWxfc3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0gICAgICBlbHNlCi0JewotCSAgZXh0ZXJuYWxfc3ltcyA9ICgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgICAgICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSk7Ci0JICBpZiAoZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChleHRlcm5hbF9zeW1zLCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSksCi0JCQkgICAgc3ltdGFiX2hkci0+c2hfaW5mbywgaW5wdXRfYmZkKQotCQkgICE9IChzeW10YWJfaGRyLT5zaF9pbmZvICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pKSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIChQVFIpIE5VTEwsCi0JCQkgIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLCBmYWxzZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCi0JCSAgICAgICBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyA9PSBOVUxMICYmIHN5bXRhYl9oZHItPnNoX2luZm8gPiAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzZWN0aW9ucyA9IChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoc3ltdGFiX2hkci0+c2hfaW5mbwotCQkJCQkgICAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICAgICAgaWYgKHNlY3Rpb25zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlzeW1wID0gaW50ZXJuYWxfc3ltczsKLSAgICAgIHNlY3BwID0gc2VjdGlvbnM7Ci0gICAgICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgICAgIGVzeW1lbmQgPSBlc3ltICsgc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICAgIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgKytlc3ltLCArK2lzeW1wLCArK3NlY3BwKQotCXsKLQkgIGFzZWN0aW9uICppc2VjOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bXApOwotCi0JICBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaXNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPiAwICYmIGlzeW1wLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUpCi0JICAgIGlzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltcC0+c3Rfc2huZHgpOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGlzZWMgPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoaXN5bXAtPnN0X3NobmR4ID09IFNITl9NMzJSX1NDT01NT04pCi0JICAgIGlzZWMgPSAmbTMycl9lbGZfc2NvbV9zZWN0aW9uOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2hvIGtub3dzPyAgKi8KLQkgICAgICBpc2VjID0gTlVMTDsKLQkgICAgfQotCi0JICAqc2VjcHAgPSBpc2VjOwotCX0KLQotICAgICAgaWYgKCEgbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICAgIGlucHV0X3NlY3Rpb24sIGRhdGEsIGludGVybmFsX3JlbG9jcywKLQkJCQkgICAgICAgaW50ZXJuYWxfc3ltcywgc2VjdGlvbnMpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLQlmcmVlIChzZWN0aW9ucyk7Ci0gICAgICBzZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotCWZyZWUgKGludGVybmFsX3N5bXMpOwotICAgICAgaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0JZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gICAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLQlmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRhdGE7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgIT0gTlVMTAotICAgICAgJiYgaW50ZXJuYWxfcmVsb2NzICE9IGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxvY3MpCi0gICAgZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLSAgaWYgKGV4dGVybmFsX3N5bXMgIT0gTlVMTCAmJiBzeW10YWJfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIGZyZWUgKGV4dGVybmFsX3N5bXMpOwotICBpZiAoaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGludGVybmFsX3N5bXMpOwotICBpZiAoc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChzZWN0aW9ucyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZW5kaWYgLyogI2lmIDAgKi8KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIuICAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NMzJSX0FSQ0gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBFX00zMlJfQVJDSDogICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfbTMyciwgYmZkX21hY2hfbTMycik7ICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KLXN0YXRpYyB2b2lkCi1tMzJyX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIGJmZF9tYWNoX20zMnI6ICB2YWwgPSBFX00zMlJfQVJDSDsgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9NMzJSX0FSQ0g7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLX0KLQotLyogRnVuY3Rpb24gdG8ga2VlcCBNMzJSIHNwZWNpZmljIGZpbGUgZmxhZ3MuICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKiAgICBhYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChvYmZkKQotCSAgICAgIHx8IChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncwotCQkgID09IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzKSk7Ci0KLSAgZWxmX2dwIChvYmZkKSA9IGVsZl9ncCAoaWJmZCk7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcuICAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG91dF9mbGFnczsKLSAgZmxhZ3dvcmQgaW5fZmxhZ3M7Ci0KLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIGluX2ZsYWdzICA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0JIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLQkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX00zMlJfQVJDSCkpCi0gICAgewotICAgICAgaWYgKChpbl9mbGFncyAmIEVGX00zMlJfQVJDSCkgIT0gRV9NMzJSX0FSQ0gpCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogSW5zdHJ1Y3Rpb24gc2V0IG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEaXNwbGF5IHRoZSBmbGFncyBmaWVsZCAqLwotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpCi0gIAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotICAKLSAgZnByaW50ZiAoZmlsZSwgXygicHJpdmF0ZSBmbGFncyA9ICVseCIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0gIAotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTTMyUl9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9NMzJSX0FSQ0g6ICBmcHJpbnRmIChmaWxlLCBfKCI6IG0zMnIgaW5zdHJ1Y3Rpb25zIikpOyAgYnJlYWs7Ci0gICAgfQotICAKLSAgZnB1dGMgKCdcbicsIGZpbGUpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWFzZWN0aW9uICoKLW0zMnJfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgY2FzZSBSX00zMlJfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotIAotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotbTMycl9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qIHdlIGRvbid0IHVzZSBnb3QgYW5kIHBsdCBlbnRyaWVzIGZvciBtMzJyICovCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZS4KLSAgIFNpbmNlIHdlIGRvbid0IGRvIC5nb3RzIG9yIC5wbHRzLCB3ZSBqdXN0IG5lZWQgdG8gY29uc2lkZXIgdGhlCi0gICB2aXJ0dWFsIHRhYmxlIHJlbG9jcyBmb3IgZ2MuICAqLwotIAotc3RhdGljIGJvb2xlYW4KLW0zMnJfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXMsICoqc3ltX2hhc2hlc19lbmQ7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLSAgICAgICAgaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0gICAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTTMyUl9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NMzJSX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotDAotCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9tMzJyCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fQ1lHTlVTX00zMlIKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICBiZmRfZWxmMzJfbTMycl92ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkiZWxmMzItbTMyciIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJCTAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsCQkJbTMycl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24JX2JmZF9tMzJyX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCV9iZmRfbTMycl9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCQltMzJyX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgkJbTMycl9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgbTMycl9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICBtMzJyX2VsZl9nY19zd2VlcF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcyAgICAgICAgICAgICAgICBtMzJyX2VsZl9jaGVja19yZWxvY3MKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgICAgICAgICAgICAgMQotI2lmIDAgLyogbm90IHlldCAqLwotLyogcmVsYXggc3VwcG9ydCAqLwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24JCW0zMnJfZWxmX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCQltMzJyX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkJbTMycl9lbGZfb2JqZWN0X3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAJbTMycl9lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSAJbTMycl9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltMzJyX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEJbTMycl9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotCQkJCQkKLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tNjhrLmMgYi9iZmQvZWxmMzItbTY4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2VjZjM2Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAxICswLDAgQEAKLS8qIE1vdG9yb2xhIDY4ayBzZXJpZXMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICpyZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCBydHlwZV90b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVsZl9tNjhrX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2NoZWNrX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYXNlY3Rpb24gKmVsZl9tNjhrX2djX21hcmtfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2djX3N3ZWVwX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZl9tNjhrX2FkanVzdF9keW5pbmR4Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbTY4a19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfbTY4a19jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0gewotICBIT1dUTyhSXzY4S19OT05FLCAgICAgICAwLCAwLCAwLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfTk9ORSIsICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwMDAsZmFsc2UpLAotICBIT1dUTyhSXzY4S18zMiwgICAgICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfMzIiLCAgICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S18xNiwgICAgICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfMTYiLCAgICAgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S184LCAgICAgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfOCIsICAgICAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QQzMyLCAgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUEMzMiIsICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BDMTYsICAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QQzE2IiwgICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUEM4LCAgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BDOCIsICAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QzMiwgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMzIiLCAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX0dPVDE2LCAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19HT1QxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfR09UOCwgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX0dPVDgiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19HT1QzMk8sICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMzJPIiwgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HT1QxNk8sICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UMTZPIiwgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HT1Q4TywgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR09UOE8iLCAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQzMiwgICAgICAwLCAyLDMyLCB0cnVlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMzIiLCAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfNjhLX1BMVDE2LCAgICAgIDAsIDEsMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICJSXzY4S19QTFQxNiIsICAgICBmYWxzZSwgMCwgMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl82OEtfUExUOCwgICAgICAgMCwgMCwgOCwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgIlJfNjhLX1BMVDgiLCAgICAgIGZhbHNlLCAwLCAweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSXzY4S19QTFQzMk8sICAgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMzJPIiwgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQxNk8sICAgICAwLCAxLDE2LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUMTZPIiwgICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19QTFQ4TywgICAgICAwLCAwLCA4LCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUExUOE8iLCAgICAgZmFsc2UsIDAsIDB4MDAwMDAwZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19DT1BZLCAgICAgICAwLCAwLCAwLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfQ09QWSIsICAgICAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19HTE9CX0RBVCwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfR0xPQl9EQVQiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19KTVBfU0xPVCwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfSk1QX1NMT1QiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICBIT1dUTyhSXzY4S19SRUxBVElWRSwgICAwLCAyLDMyLCBmYWxzZSwwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAiUl82OEtfUkVMQVRJVkUiLCAgZmFsc2UsIDAsIDB4ZmZmZmZmZmYsZmFsc2UpLAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl82OEtfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl82OEtfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSXzY4S19HTlVfVlRFTlRSWSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfNjhLX0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1ydHlwZV90b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl82OEtfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZob3d0b190YWJsZVtFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pXTsKLX0KLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBydHlwZV90b19ob3d0bwotCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfdmFsOwotICBpbnQgZWxmX3ZhbDsKLX0gcmVsb2NfbWFwW10gPSB7Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfNjhLX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfNjhLXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LCBSXzY4S18xNiB9LAotICB7IEJGRF9SRUxPQ184LCBSXzY4S184IH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSXzY4S19QQzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X1BDUkVMLCBSXzY4S19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DXzhfUENSRUwsIFJfNjhLX1BDOCB9LAotICB7IEJGRF9SRUxPQ18zMl9HT1RfUENSRUwsIFJfNjhLX0dPVDMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCwgUl82OEtfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfOF9HT1RfUENSRUwsIFJfNjhLX0dPVDggfSwKLSAgeyBCRkRfUkVMT0NfMzJfR09UT0ZGLCBSXzY4S19HT1QzMk8gfSwKLSAgeyBCRkRfUkVMT0NfMTZfR09UT0ZGLCBSXzY4S19HT1QxNk8gfSwKLSAgeyBCRkRfUkVMT0NfOF9HT1RPRkYsIFJfNjhLX0dPVDhPIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCwgUl82OEtfUExUMzIgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUExUX1BDUkVMLCBSXzY4S19QTFQxNiB9LAotICB7IEJGRF9SRUxPQ184X1BMVF9QQ1JFTCwgUl82OEtfUExUOCB9LAotICB7IEJGRF9SRUxPQ18zMl9QTFRPRkYsIFJfNjhLX1BMVDMyTyB9LAotICB7IEJGRF9SRUxPQ18xNl9QTFRPRkYsIFJfNjhLX1BMVDE2TyB9LAotICB7IEJGRF9SRUxPQ184X1BMVE9GRiwgUl82OEtfUExUOE8gfSwKLSAgeyBCRkRfUkVMT0NfTk9ORSwgUl82OEtfQ09QWSB9LAotICB7IEJGRF9SRUxPQ182OEtfR0xPQl9EQVQsIFJfNjhLX0dMT0JfREFUIH0sCi0gIHsgQkZEX1JFTE9DXzY4S19KTVBfU0xPVCwgUl82OEtfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfNjhLX1JFTEFUSVZFLCBSXzY4S19SRUxBVElWRSB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSXzY4S18zMiB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCwgUl82OEtfR05VX1ZUSU5IRVJJVCB9LAotICB7IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlksIFJfNjhLX0dOVV9WVEVOVFJZIH0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHJlbG9jX21hcCkgLyBzaXplb2YgKHJlbG9jX21hcFswXSk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAocmVsb2NfbWFwW2ldLmJmZF92YWwgPT0gY29kZSkKLQlyZXR1cm4gJmhvd3RvX3RhYmxlW3JlbG9jX21hcFtpXS5lbGZfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgRUxGX0FSQ0ggYmZkX2FyY2hfbTY4awotLyogZW5kIGNvZGUgZ2VuZXJhdGVkIGJ5IGVsZi5lbCAqLwotCi0jZGVmaW5lIFVTRV9SRUxBCi0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIG02OGsgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9saWJjLnNvLjEiCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMjAKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9va3MgbGlrZSB0aGlzLiAgU2VlCi0gICB0aGUgU1ZSNCBBQkkgbTY4ayBzdXBwbGVtZW50IHRvIHNlZSBob3cgdGhpcyB3b3Jrcy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfYnl0ZSBlbGZfbTY4a19wbHQwX2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MmYsIDB4M2IsIDB4MDEsIDB4NzAsIC8qIG1vdmUubCAoJXBjLGFkZHIpLC0oJXNwKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxhZGRyXSkgKi8KLSAgMCwgMCwgMCwgMCwJCSAgLyogcmVwbGFjZWQgd2l0aCBvZmZzZXQgdG8gLmdvdCArIDguICAqLwotICAwLCAwLCAwLCAwCQkgIC8qIHBhZCBvdXQgdG8gMjAgYnl0ZXMuICAqLwotfTsKLQotLyogU3Vic2VxdWVudCBlbnRyaWVzIGluIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgbG9vayBsaWtlIHRoaXMuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX202OGtfcGx0X2VudHJ5W1BMVF9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4NGUsIDB4ZmIsIDB4MDEsIDB4NzEsIC8qIGptcCAoWyVwYyxzeW1ib2xAR09UUENdKSAqLwotICAwLCAwLCAwLCAwLAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHgyZiwgMHgzYywJCSAgLyogbW92ZS5sICNvZmZzZXQsLSglc3ApICovCi0gIDAsIDAsIDAsIDAsCQkgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsCQkgIC8qIGJyYS5sIC5wbHQgKi8KLSAgMCwgMCwgMCwgMAkJICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLX07Ci0KLSNkZWZpbmUgQ1BVMzJfRkxBRyhhYmZkKSAgKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfQ1BVMzIpCi0KLSNkZWZpbmUgUExUX0NQVTMyX0VOVFJZX1NJWkUgMjQKLS8qIFByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJpZXMgZm9yIHRoZSBjcHUzMiAqLwotc3RhdGljIGNvbnN0IGJmZF9ieXRlIGVsZl9jcHUzMl9wbHQwX2VudHJ5W1BMVF9DUFUzMl9FTlRSWV9TSVpFXSA9Ci17Ci0gIDB4MjAsIDB4N2IsIDB4MDEsIDB4NzAsIC8qIG1vdmVhbCAlcGNAKDB4YyksICVhMCAqLwotICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byAuZ290ICsgNC4gICovCi0gIDB4NGUsIDB4ZDAsICAgICAgICAgICAgIC8qIGptcCAlYTBAICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCBvZmZzZXQgdG8gLmdvdCArOC4gKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgLyogcGFkIG91dCB0byAyNCBieXRlcy4gICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgIC8qIHBhZCBvdXQgdG8gMjQgYnl0ZXMuICAqLwotICAwLCAwCi19OwotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgZWxmX2NwdTMyX3BsdF9lbnRyeVtQTFRfQ1BVMzJfRU5UUllfU0laRV0gPQotewotICAweDIwLCAweDdiLCAweDAxLCAweDcwLCAgLyogbW92ZWFsICVwY0AoMHhjKSwgJWEwICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzeW1ib2wncyAuZ290IGVudHJ5LiAgKi8KLSAgMHg0ZSwgMHhkMCwgICAgICAgICAgICAgIC8qIGptcCAlYTBAICovCi0gIDB4MmYsIDB4M2MsICAgICAgICAgICAgICAvKiBtb3ZlLmwgI29mZnNldCwtKCVzcCkgKi8KLSAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIC8qIHJlcGxhY2VkIHdpdGggb2Zmc2V0IGludG8gcmVsb2NhdGlvbiB0YWJsZS4gICovCi0gIDB4NjAsIDB4ZmYsICAgICAgICAgICAgICAvKiBicmEubCAucGx0ICovCi0gIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAvKiByZXBsYWNlZCB3aXRoIG9mZnNldCB0byBzdGFydCBvZiAucGx0LiAgKi8KLSAgMCwgMAotfTsKLQotLyogVGhlIG02OGsgbGlua2VyIG5lZWRzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiByZWxvY3MgdGhhdCBpdAotICAgZGVjaWRlcyB0byBjb3B5IGluIGNoZWNrX3JlbG9jcyBmb3IgZWFjaCBzeW1ib2wuICBUaGlzIGlzIHNvIHRoYXQgaXQKLSAgIGNhbiBkaXNjYXJkIFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBpdCBkb2Vzbid0IG5lZWQgdGhlbSB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLUJzeW1ib2xpYy4gIFdlIHN0b3JlIHRoZSBpbmZvcm1hdGlvbiBpbiBhIGZpZWxkIGV4dGVuZGluZyB0aGUKLSAgIHJlZ3VsYXIgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBQQyByZWxhdGl2ZSByZWxvY3Mgd2UgaGF2ZQotICAgY29waWVkIGZvciBhIGdpdmVuIHN5bWJvbC4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkCi17Ci0gIC8qIE5leHQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpuZXh0OwotICAvKiBBIHNlY3Rpb24gaW4gZHlub2JqLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIE51bWJlciBvZiByZWxvY3MgY29waWVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgY291bnQ7Ci19OwotCi0vKiBtNjhrIEVMRiBsaW5rZXIgaGFzaCBlbnRyeS4gICovCi0KLXN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBOdW1iZXIgb2YgUEMgcmVsYXRpdmUgcmVsb2NzIGNvcGllZCBmb3IgdGhpcyBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcGNyZWxfcmVsb2NzX2NvcGllZDsKLX07Ci0KLS8qIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogRGVjbGFyZSB0aGlzIG5vdyB0aGF0IHRoZSBhYm92ZSBzdHJ1Y3R1cmVzIGFyZSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX202OGtfZGlzY2FyZF9jb3BpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogVHJhdmVyc2UgYW4gbTY4ayBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGVsZl9tNjhrX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChlbGZfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBlbGZfbTY4a19oYXNoX3RhYmxlKHApIFwKLSAgKChzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX3RhYmxlICopIChwKS0+aGFzaCkKLQotLyogQ3JlYXRlIGFuIGVudHJ5IGluIGFuIG02OGsgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1lbGZfbTY4a19saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwKLQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2VsZl9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZXQtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhbiBtNjhrIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGZfbTY4a19saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmX202OGtfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEtlZXAgbTY4ay1zcGVjaWZpYyBmbGFncyBpbiB0aGUgRUxGIGhlYWRlciAqLwotc3RhdGljIGJvb2xlYW4KLWVsZjMyX202OGtfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBtNjhrLXNwZWNpZmljIGRhdGEgZnJvbSBvbmUgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLSAKLSAgaW5fZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAKLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfbTY4a19tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb3V0X2ZsYWdzOwotICBmbGFnd29yZCBpbl9mbGFnczsKLQotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW5fZmxhZ3MgID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIG91dF9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzOwotCi0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGluX2ZsYWdzOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9tNjhrX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgcHRyOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0KLSAgLyogUHJpbnQgbm9ybWFsIEVMRiBwcml2YXRlIGRhdGEuICAqLwotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotCi0gIC8qIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLiAgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfICgicHJpdmF0ZSBmbGFncyA9ICVseDoiKSwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX0NQVTMyKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2NwdTMyXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgc2dvdCA9IE5VTEw7Ci0gIHNyZWxnb3QgPSBOVUxMOwotICBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbF9lbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsX2VuZDsgcmVsKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HT1Q4OgotCWNhc2UgUl82OEtfR09UMTY6Ci0JY2FzZSBSXzY4S19HT1QzMjoKLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJIChTRUNfQUxMT0MKLQkJCQkJCSAgfCBTRUNfTE9BRAotCQkJCQkJICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPmdvdC5yZWZjb3VudCA9PSAtMSkKLQkJewotCQkgIGgtPmdvdC5yZWZjb3VudCA9IDE7Ci0KLQkJICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCQkgICAgewotCQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICAvKiBBbGxvY2F0ZSBzcGFjZSBpbiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkJICBzZ290LT5fcmF3X3NpemUgKz0gNDsKLQkJICAvKiBBbGxvY2F0ZSByZWxvY2F0aW9uIHNwYWNlLiAgKi8KLQkJICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF9zaWduZWRfdm1hKTsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkJCQkgYmZkX2FsbG9jIChhYmZkLCBzaXplKSk7Ci0JCSAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCkgPSBsb2NhbF9nb3RfcmVmY291bnRzOwotCQkgIG1lbXNldCAobG9jYWxfZ290X3JlZmNvdW50cywgLTEsIHNpemUpOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdID09IC0xKQotCQl7Ci0JCSAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPSAxOwotCi0JCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHsKLQkJICAgICAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JCQkgb3V0cHV0IGEgUl82OEtfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUgZHluYW1pYwotCQkJIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkJICAgICAgc3JlbGdvdC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCWxvY2FsX2dvdF9yZWZjb3VudHNbcl9zeW1uZHhdKys7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICBXZQotCSAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2hpY2ggaXMKLSAgICAgICAgICAgICBuZXZlciByZWZlcmVuY2VkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGluIHdoaWNoIGNhc2Ugd2UKLSAgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkKLSAgICAgICAgICAgICBhZnRlciBhbGwuICAqLwotCi0JICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB3ZSByZXNvbHZlIGl0IGRpcmVjdGx5IHdpdGhvdXQKLQkgICAgIGNyZWF0aW5nIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgZWxzZQotCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4TzoKLQljYXNlIFJfNjhLX1BMVDE2TzoKLQljYXNlIFJfNjhLX1BMVDMyTzoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIHRoaXMgcmVsb2NhdGlvbiBmb3IgYQotCQkgbG9jYWwgc3ltYm9sLiAgRklYTUU6IGRvZXMgaXQ/ICBIb3cgdG8gaGFuZGxlIGl0IGlmCi0JCSBpdCBkb2VzIG1ha2Ugc2Vuc2U/ICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoIWJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgaWYgKGgtPnBsdC5yZWZjb3VudCA9PSAtMSkKLQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkgIGVsc2UKLQkgICAgaC0+cGx0LnJlZmNvdW50Kys7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUEM4OgotCWNhc2UgUl82OEtfUEMxNjoKLQljYXNlIFJfNjhLX1BDMzI6Ci0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSBhbmQgdGhpcyBpcyBub3QgYSBsb2NhbAotCSAgICAgc3ltYm9sLCB3ZSBuZWVkIHRvIGNvcHkgdGhlIHJlbG9jIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgSG93ZXZlciB3aGVuIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljIGFuZCB0aGlzIGlzIGEgZ2xvYmFsCi0JICAgICBzeW1ib2wgd2hpY2ggaXMgZGVmaW5lZCBpbiBhbiBvYmplY3Qgd2UgYXJlIGluY2x1ZGluZyBpbiB0aGUKLQkgICAgIGxpbmsgKGkuZS4sIERFRl9SRUdVTEFSIGlzIHNldCksIHRoZW4gd2UgY2FuIHJlc29sdmUgdGhlCi0JICAgICByZWxvYyBkaXJlY3RseS4gIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBub3Qgc2VlbiBhbGwgdGhlIGlucHV0Ci0JICAgICBmaWxlcywgc28gaXQgaXMgcG9zc2libGUgdGhhdCBERUZfUkVHVUxBUiBpcyBub3Qgc2V0IG5vdyBidXQKLQkgICAgIHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcyBuZXZlciBjbGVhcmVkKS4gIFdlIGFjY291bnQgZm9yIHRoYXQKLQkgICAgIHBvc3NpYmlsaXR5IGJlbG93IGJ5IHN0b3JpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi0JICAgICBwY3JlbF9yZWxvY3NfY29waWVkIGZpZWxkIG9mIHRoZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQkgIGlmICghKGluZm8tPnNoYXJlZAotCQkmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkmJiBoICE9IE5VTEwKLQkJJiYgKCFpbmZvLT5zeW1ib2xpYwotCQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgaWYgKGggIT0gTlVMTCkKLQkJewotCQkgIC8qIE1ha2Ugc3VyZSBhIHBsdCBlbnRyeSBpcyBjcmVhdGVkIGZvciB0aGlzIHN5bWJvbCBpZgotCQkgICAgIGl0IHR1cm5zIG91dCB0byBiZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBkeW5hbWljCi0JCSAgICAgb2JqZWN0LiAgKi8KLQkJICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCQkgICAgaC0+cGx0LnJlZmNvdW50ID0gMTsKLQkJICBlbHNlCi0JCSAgICBoLT5wbHQucmVmY291bnQrKzsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl82OEtfODoKLQljYXNlIFJfNjhLXzE2OgotCWNhc2UgUl82OEtfMzI6Ci0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogTWFrZSBzdXJlIGEgcGx0IGVudHJ5IGlzIGNyZWF0ZWQgZm9yIHRoaXMgc3ltYm9sIGlmIGl0Ci0JCSB0dXJucyBvdXQgdG8gYmUgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotCSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPT0gLTEpCi0JCWgtPnBsdC5yZWZjb3VudCA9IDE7Ci0JICAgICAgZWxzZQotCQloLT5wbHQucmVmY291bnQrKzsKLQkgICAgfQotCi0JICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbmVlZCB0byBjb3B5IHRoZQotCSAgICAgcmVsb2MgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCQkgcmVsb2MgdHlwZXMgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotCQkgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYy4gICovCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywKLQkJCQkJCSAgICAgKFNFQ19BTExPQwotCQkJCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgICB8IFNFQ19SRUFET05MWSkpCi0JCQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgbGlua2luZyB3aXRoIC1Cc3ltYm9saWMsIHdlIGNvdW50IHRoZSBudW1iZXIgb2YKLQkJIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdlIGhhdmUgZW50ZXJlZCBmb3IgdGhpcyBzeW1ib2wsCi0JCSBzbyB0aGF0IHdlIGNhbiBkaXNjYXJkIHRoZW0gYWdhaW4gaWYgdGhlIHN5bWJvbCBpcyBsYXRlcgotCQkgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMKLQkJIG9ubHkgY2FsbGVkIGlmIHdlIGFyZSB1c2luZyBhbiBtNjhrZWxmIGxpbmtlciBoYXNoIHRhYmxlLAotCQkgd2hpY2ggbWVhbnMgdGhhdCBoIGlzIHJlYWxseSBhIHBvaW50ZXIgdG8gYW4KLQkJIGVsZl9tNjhrX2xpbmtfaGFzaF9lbnRyeS4gICovCi0JICAgICAgaWYgKChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSBSXzY4S19QQzgKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMTYKLSAJCSAgIHx8IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pID09IFJfNjhLX1BDMzIpCi0JCSAgJiYgaW5mby0+c3ltYm9saWMpCi0JCXsKLQkJICBzdHJ1Y3QgZWxmX202OGtfbGlua19oYXNoX2VudHJ5ICplaDsKLQkJICBzdHJ1Y3QgZWxmX202OGtfcGNyZWxfcmVsb2NzX2NvcGllZCAqcDsKLQotCQkgIGVoID0gKHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKikgaDsKLQotCQkgIGZvciAocCA9IGVoLT5wY3JlbF9yZWxvY3NfY29waWVkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCQkgICAgaWYgKHAtPnNlY3Rpb24gPT0gc3JlbG9jKQotCQkgICAgICBicmVhazsKLQotCQkgIGlmIChwID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHAgPSAoKHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICopCi0JCQkgICBiZmRfYWxsb2MgKGR5bm9iaiwgc2l6ZW9mICpwKSk7Ci0JCSAgICAgIGlmIChwID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHAtPm5leHQgPSBlaC0+cGNyZWxfcmVsb2NzX2NvcGllZDsKLQkJICAgICAgZWgtPnBjcmVsX3JlbG9jc19jb3BpZWQgPSBwOwotCQkgICAgICBwLT5zZWN0aW9uID0gc3JlbG9jOwotCQkgICAgICBwLT5jb3VudCA9IDA7Ci0JCSAgICB9Ci0KLQkJICArK3AtPmNvdW50OwotCQl9Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLQkgICAgIFJlY29uc3RydWN0IGl0IGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWVsZl9tNjhrX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSXzY4S19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl82OEtfR05VX1ZURU5UUlk6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0JICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotCQkmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotCXsKLQkgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVXBkYXRlIHRoZSBnb3QgZW50cnkgcmVmZXJlbmNlIGNvdW50cyBmb3IgdGhlIHNlY3Rpb24gYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcmVsZ290OwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X3JlZmNvdW50cyA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChhYmZkKTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaikKLSAgICB7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgfQotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl82OEtfR09UODoKLQljYXNlIFJfNjhLX0dPVDE2OgotCWNhc2UgUl82OEtfR09UMzI6Ci0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQkgIGlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLQkJewotCQkgIC0taC0+Z290LnJlZmNvdW50OwotCQkgIGlmIChoLT5nb3QucmVmY291bnQgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgLmdvdCBlbnRyeSBhbnkgbW9yZS4gICovCi0JCSAgICAgIHNnb3QtPl9yYXdfc2l6ZSAtPSA0OwotCQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgLT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPiAwKQotCQl7Ci0JCSAgLS1sb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XTsKLQkJICBpZiAobG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgLmdvdCBlbnRyeSBhbnkgbW9yZS4gICovCi0JCSAgICAgIHNnb3QtPl9yYXdfc2l6ZSAtPSA0OwotCQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkJc3JlbGdvdC0+X3Jhd19zaXplIC09IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX1BMVDg6Ci0JY2FzZSBSXzY4S19QTFQxNjoKLQljYXNlIFJfNjhLX1BMVDMyOgotCWNhc2UgUl82OEtfUExUOE86Ci0JY2FzZSBSXzY4S19QTFQxNk86Ci0JY2FzZSBSXzY4S19QTFQzMk86Ci0JY2FzZSBSXzY4S19QQzg6Ci0JY2FzZSBSXzY4S19QQzE2OgotCWNhc2UgUl82OEtfUEMzMjoKLQljYXNlIFJfNjhLXzg6Ci0JY2FzZSBSXzY4S18xNjoKLQljYXNlIFJfNjhLXzMyOgotCSAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICAgIGlmIChoLT5wbHQucmVmY291bnQgPiAwKQotCQktLWgtPnBsdC5yZWZjb3VudDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSA9PSAwCi0JICAvKiBXZSBtdXN0IGFsd2F5cyBjcmVhdGUgdGhlIHBsdCBlbnRyeSBpZiBpdCB3YXMgcmVmZXJlbmNlZAotCSAgICAgYnkgYSBQTFR4eE8gcmVsb2NhdGlvbi4gIEluIHRoaXMgY2FzZSB3ZSBhbHJlYWR5IHJlY29yZGVkCi0JICAgICBpdCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgICYmIGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgLyogVGhpcyBjYXNlIGNhbiBvY2N1ciBpZiB3ZSBzYXcgYSBQTFR4eCByZWxvYyBpbiBhbiBpbnB1dAotCSAgICAgZmlsZSwgYnV0IHRoZSBzeW1ib2wgd2FzIG5ldmVyIHJlZmVycmVkIHRvIGJ5IGEgZHluYW1pYwotCSAgICAgb2JqZWN0LiAgSW4gc3VjaCBhIGNhc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gYnVpbGQKLQkgICAgIGEgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGFuZCB3ZSBjYW4ganVzdCBkbyBhIFBDeHgKLQkgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBHQyBtYXkgaGF2ZSByZW5kZXJlZCB0aGlzIGVudHJ5IHVudXNlZC4gICovCi0gICAgICBpZiAoaC0+cGx0LnJlZmNvdW50IDw9IDApCi0JewotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPSB+RUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICBoLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQl7Ci0JICBpZiAoQ1BVMzJfRkxBRyAoZHlub2JqKSkKLQkgICAgcy0+X3Jhd19zaXplICs9IFBMVF9DUFUzMl9FTlRSWV9TSVpFOwotCSAgZWxzZQotCSAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JfQotCi0gICAgICBoLT5wbHQub2Zmc2V0ID0gcy0+X3Jhd19zaXplOwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICAqLwotICAgICAgaWYgKENQVTMyX0ZMQUcgKGR5bm9iaikpCi0gICAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfQ1BVMzJfRU5UUllfU0laRTsKLSAgICAgIGVsc2UKLSAgICAgICAgcy0+X3Jhd19zaXplICs9IFBMVF9FTlRSWV9TSVpFOwotCi0gICAgICAvKiBXZSBhbHNvIG5lZWQgdG8gbWFrZSBhbiBlbnRyeSBpbiB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgd2hpY2gKLQkgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIC5nb3Qgc2VjdGlvbiBieSB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdC5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gNDsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFJlaW5pdGlhbGl6ZSB0aGUgcGx0IG9mZnNldCBub3cgdGhhdCBpdCBpcyBub3QgdXNlZCBhcyBhIHJlZmVyZW5jZQotICAgICBjb3VudCBhbnkgbW9yZS4gICovCi0gIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIHdlYWsgc3ltYm9sLCBhbmQgdGhlcmUgaXMgYSByZWFsIGRlZmluaXRpb24sIHRoZQotICAgICBwcm9jZXNzb3IgaW5kZXBlbmRlbnQgY29kZSB3aWxsIGhhdmUgYXJyYW5nZWQgZm9yIHVzIHRvIHNlZSB0aGUKLSAgICAgcmVhbCBkZWZpbml0aW9uIGZpcnN0LCBhbmQgd2UgY2FuIGp1c3QgdXNlIHRoZSBzYW1lIHZhbHVlLiAgKi8KLSAgaWYgKGgtPndlYWtkZWYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBoLT5yb290LnUuZGVmLnZhbHVlID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi52YWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCB3aGljaAotICAgICBpcyBub3QgYSBmdW5jdGlvbi4gICovCi0KLSAgLyogSWYgd2UgYXJlIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIG11c3QgcHJlc3VtZSB0aGF0IHRoZQotICAgICBvbmx5IHJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBhcmUgdmlhIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLgotICAgICBGb3Igc3VjaCBjYXNlcyB3ZSBuZWVkIG5vdCBkbyBhbnl0aGluZyBoZXJlOyB0aGUgcmVsb2NhdGlvbnMgd2lsbAotICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseSBieSByZWxvY2F0ZV9zZWN0aW9uLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBzeW1ib2wgaW4gb3VyIC5keW5ic3Mgc2VjdGlvbiwgd2hpY2ggd2lsbAotICAgICBiZWNvbWUgcGFydCBvZiB0aGUgLmJzcyBzZWN0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiAgVGhlcmUgd2lsbCBiZQotICAgICBhbiBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbi4gIFRoZSBkeW5hbWljCi0gICAgIG9iamVjdCB3aWxsIGNvbnRhaW4gcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSwgc28gYWxsIHJlZmVyZW5jZXMKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgdG8gdGhpcyBzeW1ib2wgd2lsbCBnbyB0aHJvdWdoIHRoZSBnbG9iYWwKLSAgICAgb2Zmc2V0IHRhYmxlLiAgVGhlIGR5bmFtaWMgbGlua2VyIHdpbGwgdXNlIHRoZSAuZHluc3ltIGVudHJ5IHRvCi0gICAgIGRldGVybWluZSB0aGUgYWRkcmVzcyBpdCBtdXN0IHB1dCBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSwgc28KLSAgICAgYm90aCB0aGUgZHluYW1pYyBvYmplY3QgYW5kIHRoZSByZWd1bGFyIG9iamVjdCB3aWxsIHJlZmVyIHRvIHRoZQotICAgICBzYW1lIG1lbW9yeSBsb2NhdGlvbiBmb3IgdGhlIHZhcmlhYmxlLiAgKi8KLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5ic3MiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAvKiBXZSBtdXN0IGdlbmVyYXRlIGEgUl82OEtfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlciB0bwotICAgICBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsYS5ic3Mgc2VjdGlvbiB3ZSBhcmUgZ29pbmcgdG8gdXNlLiAgKi8KLSAgaWYgKChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLSAgICAgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX0NPUFk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciB0aGlzIHN5bWJvbC4gIEkKLSAgICAgaGF2ZSBubyBpZGVhIGhvdyBFTEYgbGlua2VycyBoYW5kbGUgdGhpcy4gICovCi0gIHBvd2VyX29mX3R3byA9IGJmZF9sb2cyIChoLT5zaXplKTsKLSAgaWYgKHBvd2VyX29mX3R3byA+IDMpCi0gICAgcG93ZXJfb2ZfdHdvID0gMzsKLQotICAvKiBBcHBseSB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLSAgcy0+X3Jhd19zaXplID0gQkZEX0FMSUdOIChzLT5fcmF3X3NpemUsCi0JCQkgICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzKSkKLSAgICB7Ci0gICAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHBsdDsKLSAgYm9vbGVhbiByZWxvY3M7Ci0gIGJvb2xlYW4gcmVsdGV4dDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0JIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLQkgbm90IGFjdHVhbGx5IHVzZSB0aGVzZSBlbnRyaWVzLiAgUmVzZXQgdGhlIHNpemUgb2YgLnJlbGEuZ290LAotCSB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotCSBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBzaGFyZWQgbGluaywgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgYWxsIFBDCi0gICAgIHJlbGF0aXZlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgV2UKLSAgICAgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3Mgcm91dGluZSwgYnV0IHdlIHdpbGwgbm90Ci0gICAgIGZpbGwgdGhlbSBpbiBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCAmJiBpbmZvLT5zeW1ib2xpYykKLSAgICBlbGZfbTY4a19saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9tNjhrX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSBlbGZfbTY4a19kaXNjYXJkX2NvcGllcywKLQkJCQkgKFBUUikgTlVMTCk7Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICBwbHQgPSBmYWxzZTsKLSAgcmVsb2NzID0gZmFsc2U7Ci0gIHJlbHRleHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogSXQncyBPSyB0byBiYXNlIGRlY2lzaW9ucyBvbiB0aGUgc2VjdGlvbiBuYW1lLCBiZWNhdXNlIG5vbmUKLQkgb2YgdGhlIGR5bm9iaiBzZWN0aW9uIG5hbWVzIGRlcGVuZCB1cG9uIHRoZSBpbnB1dCBmaWxlcy4gICovCi0gICAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGR5bm9iaiwgcyk7Ci0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucGx0IikgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBTdHJpcCB0aGlzIHNlY3Rpb24gaWYgd2UgZG9uJ3QgbmVlZCBpdDsgc2VlIHRoZQotICAgICAgICAgICAgICAgICBjb21tZW50IGJlbG93LiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgaXMgYSBQTFQuICAqLwotCSAgICAgIHBsdCA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIElmIHdlIGRvbid0IG5lZWQgdGhpcyBzZWN0aW9uLCBzdHJpcCBpdCBmcm9tIHRoZQotCQkgb3V0cHV0IGZpbGUuICBUaGlzIGlzIG1vc3RseSB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbGEucGx0LiAgV2UgbXVzdCBjcmVhdGUgYm90aCBzZWN0aW9ucyBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgdGhleSBtdXN0IGJlIGNyZWF0ZWQKLQkJIGJlZm9yZSB0aGUgbGlua2VyIG1hcHMgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0Ci0JCSBzZWN0aW9ucy4gIFRoZSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZQotCQkgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGlzIGNhbGxlZCwgYW5kIGl0IGlzIHRoYXQKLQkJIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgd2hldGhlciBhbnl0aGluZyBuZWVkcyB0byBnbwotCQkgaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0JICAgICAgc3RyaXAgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbG9jIHNlY3Rpb25zIG90aGVyCi0gICAgICAgICAgICAgICAgIHRoYW4gLnJlbGEucGx0LiAgKi8KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlbGEucGx0IikgIT0gMCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0KLQkJICByZWxvY3MgPSB0cnVlOwotCi0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgICAgIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwKLQkJICAgICBlbnRyeS4gIC5yZWxhLnBsdCBpcyBhY3R1YWxseSBhc3NvY2lhdGVkIHdpdGgKLQkJICAgICAuZ290LnBsdCwgd2hpY2ggaXMgbmV2ZXIgcmVhZG9ubHkuICAqLwotCQkgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCQkgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JCSAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgICAgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQkgICAgcmVsdGV4dCA9IHRydWU7Ci0JCX0KLQotCSAgICAgIC8qIFdlIHVzZSB0aGUgcmVsb2NfY291bnQgZmllbGQgYXMgYSBjb3VudGVyIGlmIHdlIG5lZWQKLQkJIHRvIGNvcHkgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgICAgICBzLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChuYW1lLCAiLmdvdCIsIDQpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGR5bm9iaiwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMICYmIHMtPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIEFkZCBzb21lIGVudHJpZXMgdG8gdGhlIC5keW5hbWljIHNlY3Rpb24uICBXZSBmaWxsIGluIHRoZQotCSB2YWx1ZXMgbGF0ZXIsIGluIGVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghaW5mby0+c2hhcmVkKQotCXsKLQkgIGlmICghYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwbHQpCi0JewotCSAgaWYgKCFiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUxTWiwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgICAgICB8fCAhYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICAgICAgfHwgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgotICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1pZ2h0IG5lZWQgdG8gY29weQotICAgICByZWxvY3MuICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZQotICAgICBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50Ci0gICAgIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeSBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAotCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7Ci0KLQkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQotCSAgKytjOwotCX0KLQotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgZWxmX202OGtfYWRqdXN0X2R5bmluZHgsCi0JCQkgICAgICAoUFRSKSAmYyk7Ci0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBjcGFyZzsKLXsKLSAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB2aWEgZWxmX202OGtfbGlua19oYXNoX3RyYXZlcnNlIGlmIHdlIGFyZQotICAgY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0IHdpdGggLUJzeW1ib2xpYy4gIEl0IGRpc2NhcmRzIHRoZSBzcGFjZQotICAgYWxsb2NhdGVkIHRvIGNvcHkgUEMgcmVsYXRpdmUgcmVsb2NzIGFnYWluc3Qgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZAotICAgaW4gcmVndWxhciBvYmplY3RzLiAgV2UgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGVtIGluIHRoZSBjaGVja19yZWxvY3MKLSAgIHJvdXRpbmUsIGJ1dCB3ZSB3b24ndCBmaWxsIHRoZW0gaW4gaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gcm91dGluZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWVsZl9tNjhrX2Rpc2NhcmRfY29waWVzIChoLCBpZ25vcmUpCi0gICAgIHN0cnVjdCBlbGZfbTY4a19saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZ25vcmU7Ci17Ci0gIHN0cnVjdCBlbGZfbTY4a19wY3JlbF9yZWxvY3NfY29waWVkICpzOwotCi0gIC8qIFdlIG9ubHkgZGlzY2FyZCByZWxvY3MgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZvciAocyA9IGgtPnBjcmVsX3JlbG9jc19jb3BpZWQ7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgcy0+c2VjdGlvbi0+X3Jhd19zaXplIC09IHMtPmNvdW50ICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVsb2NhdGUgYW4gTTY4SyBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzcGx0OwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBsb2NhbF9nb3Rfb2Zmc2V0cyA9IGVsZl9sb2NhbF9nb3Rfb2Zmc2V0cyAoaW5wdXRfYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3BsdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSXzY4S19tYXgpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGlmICgoKHJfdHlwZSA9PSBSXzY4S19QTFQ4Ci0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMTYKLQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19QTFQzMgotCQkgICAgfHwgcl90eXBlID09IFJfNjhLX1BMVDhPCi0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMTZPCi0JCSAgICB8fCByX3R5cGUgPT0gUl82OEtfUExUMzJPKQotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMQotCQkgICAmJiBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLQkJICB8fCAoKHJfdHlwZSA9PSBSXzY4S19HT1Q4TwotCQkgICAgICAgfHwgcl90eXBlID09IFJfNjhLX0dPVDE2TwotCQkgICAgICAgfHwgcl90eXBlID09IFJfNjhLX0dPVDMyTwotCQkgICAgICAgfHwgKChyX3R5cGUgPT0gUl82OEtfR09UOAotCQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNgotCQkJICAgIHx8IHJfdHlwZSA9PSBSXzY4S19HT1QzMikKLQkJCSAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkgICAgICAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgIT0gMCkpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSXzY4S184Ci0JCQkgIHx8IHJfdHlwZSA9PSBSXzY4S18xNgotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfMzIKLQkJCSAgfHwgcl90eXBlID09IFJfNjhLX1BDOAotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfUEMxNgotCQkJICB8fCByX3R5cGUgPT0gUl82OEtfUEMzMikpKQotCQl7Ci0JCSAgLyogSW4gdGhlc2UgY2FzZXMsIHdlIGRvbid0IG5lZWQgdGhlIHJlbG9jYXRpb24KLQkJICAgICB2YWx1ZS4gIFdlIGNoZWNrIHNwZWNpYWxseSBiZWNhdXNlIGluIHNvbWUKLQkJICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghKGluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbAotCQkgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwKLQkJICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl82OEtfR09UODoKLQljYXNlIFJfNjhLX0dPVDE2OgotCWNhc2UgUl82OEtfR09UMzI6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wKLQkgICAgIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQkgIGlmIChoICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSXzY4S19HT1Q4TzoKLQljYXNlIFJfNjhLX0dPVDE2TzoKLQljYXNlIFJfNjhLX0dPVDMyTzoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdGhlIG9mZnNldCBvZiB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluCi0JICAgICB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLQkgIHsKLQkgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgICB7Ci0JCXNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCQlCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIHsKLQkJb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkJQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkJaWYgKCFlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgfHwgKGluZm8tPnNoYXJlZAotCQkJJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JCQkmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJICB7Ci0JCSAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLQkJICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JCSAgICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKLQkJICAgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuLiAgV2UgbXVzdCBpbml0aWFsaXplCi0JCSAgICAgICB0aGlzIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2luY2UKLQkJICAgICAgIHRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LCB3ZQotCQkgICAgICAgdXNlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gcmVjb3JkIHdoZXRoZXIKLQkJICAgICAgIHdlIGhhdmUgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgICByZWxvY2F0aW9uIGVudHJ5IHRvIGluaXRpYWxpemUgdGhlIHZhbHVlLiAgVGhpcwotCQkgICAgICAgaXMgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCQkgICAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgICBvZmYgJj0gfjE7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sCi0JCQkJICAgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJCWgtPmdvdC5vZmZzZXQgfD0gMTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCUJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQotCQlvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkJLyogVGhlIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQuICBXZSB1c2UKLQkJICAgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSAgIGFscmVhZHkgZ2VuZXJhdGVkIHRoZSBuZWNlc3NhcnkgcmVsb2MuICAqLwotCQlpZiAoKG9mZiAmIDEpICE9IDApCi0JCSAgb2ZmICY9IH4xOwotCQllbHNlCi0JCSAgewotCQkgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwgc2dvdC0+Y29udGVudHMgKyBvZmYpOwotCi0JCSAgICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgICB7Ci0JCQlhc2VjdGlvbiAqc3JlbGdvdDsKLQkJCUVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQotCQkJc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJCUJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJCW91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgICArIG9mZik7Ci0JCQlvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSXzY4S19SRUxBVElWRSk7Ci0JCQlvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uOwotCQkJYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAgICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkJKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgICAgfQotCi0JCSAgICBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gfD0gMTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmOwotCSAgICBpZiAocl90eXBlID09IFJfNjhLX0dPVDhPCi0JCXx8IHJfdHlwZSA9PSBSXzY4S19HT1QxNk8KLQkJfHwgcl90eXBlID09IFJfNjhLX0dPVDMyTykKLQkgICAgICB7Ci0JCS8qIFRoaXMgcmVsb2NhdGlvbiBkb2VzIG5vdCB1c2UgdGhlIGFkZGVuZC4gICovCi0JCXJlbC0+cl9hZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHJlbG9jYXRpb24gKz0gc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QTFQ4OgotCWNhc2UgUl82OEtfUExUMTY6Ci0JY2FzZSBSXzY4S19QTFQzMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLQkgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogUmVzb2x2ZSBhIFBMVHh4IHJlbG9jIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wgZGlyZWN0bHksCi0JICAgICB3aXRob3V0IHVzaW5nIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICBicmVhazsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xCi0JICAgICAgfHwgIWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotCQkgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotCQkgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHNwbHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0JICBicmVhazsKLQotCWNhc2UgUl82OEtfUExUOE86Ci0JY2FzZSBSXzY4S19QTFQxNk86Ci0JY2FzZSBSXzY4S19QTFQzMk86Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbgotCSAgICAgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSBoLT5wbHQub2Zmc2V0OwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZG9lcyBub3QgdXNlIHRoZSBhZGRlbmQuICAqLwotCSAgcmVsLT5yX2FkZGVuZCA9IDA7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSXzY4S19QQzg6Ci0JY2FzZSBSXzY4S19QQzE2OgotCWNhc2UgUl82OEtfUEMzMjoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfNjhLXzg6Ci0JY2FzZSBSXzY4S18xNjoKLQljYXNlIFJfNjhLXzMyOgotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCSAgICAgICYmICgocl90eXBlICE9IFJfNjhLX1BDOAotCQkgICAmJiByX3R5cGUgIT0gUl82OEtfUEMxNgotCQkgICAmJiByX3R5cGUgIT0gUl82OEtfUEMzMikKLQkJICB8fCAoIWluZm8tPnN5bWJvbGljCi0JCSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCSAgICAgIGJvb2xlYW4gc2tpcCwgcmVsb2NhdGU7Ci0KLQkgICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucwotCQkgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLQkJIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJewotCQkgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0JCSAgcmVsb2NhdGUgPSBmYWxzZTsKLQkJfQotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAotCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIHJfdHlwZSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocl90eXBlID09IFJfNjhLXzMyKQotCQkgICAgewotCQkgICAgICByZWxvY2F0ZSA9IHRydWU7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfNjhLX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBsb25nIGluZHg7Ci0KLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkJICAgICAgfHwgKGgtPnJvb3QudHlwZQotCQkJCQkgID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQl9Ci0JCSAgICAgIGlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQlpbmR4ID0gMDsKLQkJICAgICAgZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJewotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAob3NlYyktPmR5bmluZHg7Ci0JCQkgIEJGRF9BU1NFUlQgKGluZHggPiAwKTsKLQkJCX0KLQotCQkgICAgICByZWxvY2F0ZSA9IGZhbHNlOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCByX3R5cGUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJICgoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgc3JlbG9jLT5jb250ZW50cykKLQkJCQkJICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICAvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotICAgICAgICAgICAgICAgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgZXhjZXB0IGZvciBSXzY4S18zMgotICAgICAgICAgICAgICAgICByZWxvY2F0aW9ucyB0aGF0IGhhdmUgYmVlbiB0dXJuZWQgaW50bwotICAgICAgICAgICAgICAgICBSXzY4S19SRUxBVElWRS4gICovCi0JICAgICAgaWYgKCFyZWxvY2F0ZSkKLQkJY29udGludWU7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfNjhLX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSXzY4S19HTlVfVlRFTlRSWToKLQkgIC8qIFRoZXNlIGFyZSBuby1vcHMgaW4gdGhlIGVuZC4gICovCi0JICBjb250aW51ZTsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghKGluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cKLQkJICAgICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbTY4a19maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGludCBwbHRfb2ZmMSwgcGx0X29mZjIsIHBsdF9vZmYzOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBiZmRfdm1hIGdvdF9vZmZzZXQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgU2V0Ci0JIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290LnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICAvKiBHZXQgdGhlIGluZGV4IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSB3aGljaAotCSBjb3JyZXNwb25kcyB0byB0aGlzIHN5bWJvbC4gIFRoaXMgaXMgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sCi0JIGluIGFsbCB0aGUgc3ltYm9scyBmb3Igd2hpY2ggd2UgYXJlIG1ha2luZyBwbHQgZW50cmllcy4gIFRoZQotCSBmaXJzdCBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKCBDUFUzMl9GTEFHIChvdXRwdXRfYmZkKSkKLSAgICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9DUFUzMl9FTlRSWV9TSVpFIC0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcGx0X2luZGV4ID0gaC0+cGx0Lm9mZnNldCAvIFBMVF9FTlRSWV9TSVpFIC0gMTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgaW50byB0aGUgLmdvdCB0YWJsZSBvZiB0aGUgZW50cnkgdGhhdAotCSBjb3JyZXNwb25kcyB0byB0aGlzIGZ1bmN0aW9uLiAgRWFjaCAuZ290IGVudHJ5IGlzIDQgYnl0ZXMuCi0JIFRoZSBmaXJzdCB0aHJlZSBhcmUgcmVzZXJ2ZWQuICAqLwotICAgICAgZ290X29mZnNldCA9IChwbHRfaW5kZXggKyAzKSAqIDQ7Ci0KLSAgICAgIGlmICggQ1BVMzJfRkxBRyAob3V0cHV0X2JmZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotICAgICAgICAgIG1lbWNweSAoc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBlbGZfY3B1MzJfcGx0X2VudHJ5LAotCSAgICAgICAgICBQTFRfQ1BVMzJfRU5UUllfU0laRSk7Ci0gICAgICAgICAgcGx0X29mZjEgPSA0OwotICAgICAgICAgIHBsdF9vZmYyID0gMTI7Ci0gICAgICAgICAgcGx0X29mZjMgPSAxODsKLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgICAgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCwgZWxmX202OGtfcGx0X2VudHJ5LAotCSAgICAgICAgICBQTFRfRU5UUllfU0laRSk7Ci0gICAgICAgICAgcGx0X29mZjEgPSA0OwotICAgICAgICAgIHBsdF9vZmYyID0gMTA7Ci0gICAgICAgICAgcGx0X29mZjMgPSAxNjsKLSAgICAgICAgfQotCi0gICAgICAvKiBUaGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBleHRlbnNpb24gd29yZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICArIGdvdF9vZmZzZXQKLQkJICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIGgtPnBsdC5vZmZzZXQgKyAyKSksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgcGx0X29mZjEpOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBwbHRfaW5kZXggKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIHBsdF9vZmYyKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIC0gKGgtPnBsdC5vZmZzZXQgKyBwbHRfb2ZmMyksCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgcGx0X29mZjMpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICArIGgtPnBsdC5vZmZzZXQKLQkJICAgKyA4KSwKLQkJICBzZ290LT5jb250ZW50cyArIGdvdF9vZmZzZXQpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgZ290X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl82OEtfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBwbHRfaW5kZXgpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLQkgdXAuICAqLwotCi0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIHNyZWxhID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMICYmIHNyZWxhICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyAoaC0+Z290Lm9mZnNldCAmfiAxKSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSAtQnN5bWJvbGljIGxpbmssIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgbG9jYWxseSwgd2UganVzdCB3YW50IHRvIGVtaXQgYSBSRUxBVElWRSByZWxvYy4gIExpa2V3aXNlIGlmCi0JIHRoZSBzeW1ib2wgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLgotCSBUaGUgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbgotCSBpbml0aWFsaXplZCBpbiB0aGUgcmVsb2NhdGVfc2VjdGlvbiBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JewotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfNjhLX1JFTEFUSVZFKTsKLQkgIHJlbGEucl9hZGRlbmQgPSBiZmRfZ2V0X3NpZ25lZF8zMiAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAoc2dvdC0+Y29udGVudHMKLQkJCQkJICAgICAgKyAoaC0+Z290Lm9mZnNldCAmIH4xKSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwKLQkJICAgICAgc2dvdC0+Y29udGVudHMgKyAoaC0+Z290Lm9mZnNldCAmIH4xKSk7Ci0JICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl82OEtfR0xPQl9EQVQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBuZWVkcyBhIGNvcHkgcmVsb2MuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xCi0JCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfNjhLX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICAvKiBNYXJrIF9EWU5BTUlDIGFuZCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX202OGtfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGludCBwbHRfZW50cnkwX3NpemUsIHBsdF9vZmYxLCBwbHRfb2ZmMjsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QucGx0Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9KTVBSRUw6Ci0JICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnJlbGEucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemU7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTEFTWjoKLQkgICAgICAvKiBUaGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgcmVsb2NzIChEVF9KTVBSRUwpIHNob3VsZAotCQkgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdmVyYWxsIHJlbG9jcyAoRFRfUkVMQSkuCi0JCSBUaGVyZWZvcmUsIHdlIG92ZXJyaWRlIHRoZSBEVF9SRUxBU1ogZW50cnkgaGVyZSB0bwotCQkgbWFrZSBpdCBub3QgaW5jbHVkZSB0aGUgSk1QUkVMIHJlbG9jcy4gIFNpbmNlIHRoZQotCQkgbGlua2VyIHNjcmlwdCBhcnJhbmdlcyBmb3IgLnJlbGEucGx0IHRvIGZvbGxvdyBhbGwKLQkJIG90aGVyIHJlbG9jYXRpb24gc2VjdGlvbnMsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkJIGFib3V0IGNoYW5naW5nIHRoZSBEVF9SRUxBIGVudHJ5LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKLQkgICAgICBpZiAocyAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkgICAgZHluLmRfdW4uZF92YWwgLT0gcy0+X2Nvb2tlZF9zaXplOwotCQkgIGVsc2UKLQkJICAgIGR5bi5kX3VuLmRfdmFsIC09IHMtPl9yYXdfc2l6ZTsKLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0gICAgICAgICAgaWYgKCFDUFUzMl9GTEFHIChvdXRwdXRfYmZkKSkKLSAgICAgICAgICAgIHsKLQkgICAgICBtZW1jcHkgKHNwbHQtPmNvbnRlbnRzLCBlbGZfbTY4a19wbHQwX2VudHJ5LCBQTFRfRU5UUllfU0laRSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgNAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAyKSksCi0JCSAgICAgICAgICBzcGx0LT5jb250ZW50cyArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICAgICAgICAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldCArIDgKLQkJICAgICAgICAgICAtIChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMTApKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgMTIpOwotICAgICAgICAgICAgICBlbGZfc2VjdGlvbl9kYXRhIChzcGx0LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgCi0gICAgICAgICAgICAgICA9IFBMVF9FTlRSWV9TSVpFOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgLyogY3B1MzIgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWVtY3B5IChzcGx0LT5jb250ZW50cywgZWxmX2NwdTMyX3BsdDBfZW50cnksIFBMVF9DUFUzMl9FTlRSWV9TSVpFKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgICAgICAgICAgKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQgKyA0Ci0JCSAgICAgICAgICAgLSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIDIpKSwKLQkJICAgICAgICAgIHNwbHQtPmNvbnRlbnRzICsgNCk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgICAgICAgIChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgOAotCQkgICAgICAgICAgIC0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyAxMCkpLAotCQkgICAgICAgICAgc3BsdC0+Y29udGVudHMgKyAxMCk7Ci0gICAgICAgICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSAKLSAgICAgICAgICAgICAgID0gUExUX0NQVTMyX0VOVFJZX1NJWkU7Ci0gICAgICAgICAgICB9Ci0JfQotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBmaXJzdCB0aHJlZSBlbnRyaWVzIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgaWYgKHNkeW4gPT0gTlVMTCkKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIHNnb3QtPmNvbnRlbnRzKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIHNnb3QtPmNvbnRlbnRzICsgOCk7Ci0gICAgfQotCi0gIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9IDQ7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2R5bnN5bTsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBzeW07Ci0gICAgICBpbnQgYzsKLQotICAgICAgLyogU2V0IHVwIHRoZSBzZWN0aW9uIHN5bWJvbHMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCi0gICAgICBzZHluc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNkeW5zeW0gIT0gTlVMTCk7Ci0KLSAgICAgIHN5bS5zdF9zaXplID0gMDsKLSAgICAgIHN5bS5zdF9uYW1lID0gMDsKLSAgICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotICAgICAgc3ltLnN0X290aGVyID0gMDsKLQotICAgICAgYyA9IDA7Ci0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpbnQgaW5keDsKLQotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7Ci0KLQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JICBCRkRfQVNTRVJUIChpbmR4ID4gMCk7Ci0JICBzeW0uc3Rfc2huZHggPSBpbmR4OwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAotCQkJCSAgICAgKFBUUikgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkJCSAgICAgc2R5bnN5bS0+Y29udGVudHMpCi0JCQkJCSAgICArIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4KSk7Ci0KLQkgICsrYzsKLQl9Ci0KLSAgICAgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgb3V0cHV0IC5keW5zeW0gc2VjdGlvbiB0byB0aGUKLSAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNkeW5zeW0tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9IGMgKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCWJmZF9lbGYzMl9tNjhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmMzItbTY4ayIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fNjhLCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MjAwMAotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0JCQkJCWVsZl9tNjhrX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmX202OGtfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGZfbTY4a19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGZfbTY4a19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZl9tNjhrX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawllbGZfbTY4a19nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawllbGZfbTY4a19nY19zd2VlcF9ob29rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZjMyX202OGtfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGYzMl9tNjhrX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxmMzJfbTY4a19wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1tODhrLmMgYi9iZmQvZWxmMzItbTg4ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGRlMjJhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBNb3Rvcm9sYSA4OGstc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotLyogVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGFueSByZWxvY2F0aW9ucywgYnV0IHNob3VsZCBiZSBnb29kIGVub3VnaAotICAgZm9yIEdEQi4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCWJmZF9lbGYzMl9tODhrX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tODhrIgotI2RlZmluZSBFTEZfQVJDSAkJYmZkX2FyY2hfbTg4awotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCUVNXzg4SwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgIAkxIC8qIEZJWE1FOiBUaGlzIG51bWJlciBpcyB3cm9uZywgIEl0IHNob3VsZCBiZSB0aGUgcGFnZSBzaXplIGluIGJ5dGVzLiAgKi8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJX2JmZF9lbGZfbm9faW5mb190b19ob3d0bwotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbWNvcmUuYyBiL2JmZC9lbGYzMi1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBkZGM1Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGYzMi1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qIE1vdG9yb2xhIE1Db3JlIHNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBhIHByZWxpbWluYXJ5IFJDRSBFTEYgQUJJLiAgVGhlCi0gICBpbmZvcm1hdGlvbiBtYXkgbm90IG1hdGNoIHRoZSBmaW5hbCBSQ0UgRUxGIEFCSS4gICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2RlZmluZQlVU0VfUkVMQQkvKiBPbmx5IFVTRV9SRUwgaXMgYWN0dWFsbHkgc2lnbmlmaWNhbnQsIGJ1dCB0aGlzIGlzCi0JCQkgICBoZXJlIGFyZSBhIHJlbWluZGVyLi4uICovCi0KLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9ob3d0b19pbml0Ci0gIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZjMyX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0gIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotc3RhdGljIGJvb2xlYW4gbWNvcmVfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG1jb3JlX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtY29yZV9lbGZfdW5zdXBwb3J0ZWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtY29yZV9lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbKGludCkgUl9NQ09SRV9tYXhdOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtY29yZV9lbGZfaG93dG9fcmF3W10gPQotewotICAvKiBUaGlzIHJlbG9jIGRvZXMgbm90aGluZy4gICovCi0gIEhPV1RPIChSX01DT1JFX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX05PTkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzdGFuZGFyZCAzMiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01DT1JFX0FERFIzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJBRERSMzIiLAkJLyogbmFtZSAqLy8qIEZvciBjb21wYXRhYmlsaXR5IHdpdGggY29mZi9wZSBwb3J0LiAgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXRzICsgMiB6ZXJvIGJpdHM7IGptcGkvanNyaS9scncgaW5zdHJ1Y3Rpb25zLgotICAgICBTaG91bGQgbm90IGFwcGVhciBpbiBvYmplY3QgZmlsZXMuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NOEJZNCwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTElNTThCWTQiLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBic3IvYnQvYmYvYnIgaW5zdHJ1Y3Rpb25zOyAxMSBiaXRzICsgMSB6ZXJvIGJpdCAKLSAgICAgU3BhbiAyayBpbnN0cnVjdGlvbnMgPT0gNGsgYnl0ZXMuCi0gICAgIE9ubHkgdXNlZnVsIHBpZWNlcyBhdCB0aGUgcmVsb2NhdGVkIGFkZHJlc3MgYXJlIHRoZSBvcGNvZGUgKDUgYml0cykgKi8KLSAgSE9XVE8gKFJfTUNPUkVfUENSRUxJTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxJTU0xMUJZMiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4N2ZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDQgYml0cyArIDEgemVybyBiaXQ7ICdsb29wdCcgaW5zdHJ1Y3Rpb24gb25seTsgdW5zdXBwb3J0ZWQuICovCi0gIEhPV1RPIChSX01DT1JFX1BDUkVMSU1NNEJZMiwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIG1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYywvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1BDUkVMSU1NNEJZMiIsLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBwYy1yZWxhdGl2ZS4gRXZlbnR1YWxseSB0aGlzIHdpbGwgaGVscCBzdXBwb3J0IFBJQyBjb2RlLiAqLwotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NQ09SRV9QQ1JFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFBDUkVMSU1NMTFCWTIsIHRoaXMgcmVsb2NhdGlvbiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhCi0gICAgICdqc3JpJyBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuIFRoZXJlIGlzIGEgc2VwYXJhdGUgcmVsb2NhdGlvbgotICAgICBlbnRyeSBmb3IgdGhlIGxpdGVyYWwgcG9vbCBlbnRyeSB0aGF0IGl0IHJlZmVyZW5jZXMsIGJ1dCB3ZSAKLSAgICAgbWlnaHQgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGpzcmkgdG8gYSBic3IgaWYgdGhlIHRhcmdldCB0dXJucyBvdXQKLSAgICAgdG8gYmUgY2xvc2UgZW5vdWdoIFtldmVuIHRob3VnaCB3ZSB3b24ndCByZWNsYWltIHRoZSBsaXRlcmFsIHBvb2wKLSAgICAgZW50cnksIHdlJ2xsIGdldCBzb21lIHJ1bnRpbWUgZWZmaWNpZW5jeSBiYWNrXS4gTm90ZSB0aGF0IHRoaXMKLSAgICAgaXMgYSByZWxvY2F0aW9uIHRoYXQgd2UgYXJlIGFsbG93ZWQgdG8gc2FmZWx5IGlnbm9yZS4gICovIAotICBIT1dUTyAoUl9NQ09SRV9QQ1JFTEpTUl9JTU0xMUJZMiwvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTIiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHg3ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9NQ09SRV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9NQ09SRV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLSAgSE9XVE8gKFJfTUNPUkVfR05VX1ZURU5UUlksICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX01DT1JFX0dOVV9WVEVOVFJZIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICBIT1dUTyAoUl9NQ09SRV9SRUxBVElWRSwgICAgICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01DT1JFX1JFTEFUSVZFIiwgICAgLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQwKLS8qIEluaXRpYWxpemUgdGhlIG1jb3JlX2VsZl9ob3d0b190YWJsZSwgc28gdGhhdCBsaW5lYXIgYWNjZXNzZXMgY2FuIGJlIGRvbmUuICAqLwotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9ob3d0b19pbml0ICgpCi17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fcmF3KTsgaS0tOykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgICAgIAotICAgICAgdHlwZSA9IG1jb3JlX2VsZl9ob3d0b19yYXdbaV0udHlwZTsKLSAgICAgIAotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IE5VTV9FTEVNIChtY29yZV9lbGZfaG93dG9fdGFibGUpKTsKLSAgICAgIAotICAgICAgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFt0eXBlXSA9ICYgbWNvcmVfZWxmX2hvd3RvX3JhdyBbaV07Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1tY29yZV9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBlbnVtIGVsZl9tY29yZV9yZWxvY190eXBlIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9OT05FOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTk9ORToJCSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX05PTkU7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgkJCSAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0FERFIzMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNDoJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxJTU04Qlk0OyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU0xMUJZMjogICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTTExQlkyOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyOgkgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9QQ1JFTElNTTRCWTI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgkJICAgICBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUwzMjsgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyOiBtY29yZV9yZWxvYyA9IFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTI7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOiAgICAgICAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0dOVV9WVElOSEVSSVQ7IGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWTogICAgICAgICAgICAgbWNvcmVfcmVsb2MgPSBSX01DT1JFX0dOVV9WVEVOVFJZOyBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6ICAgICAgICAgICAgICAgICAgICAgIG1jb3JlX3JlbG9jID0gUl9NQ09SRV9SRUxBVElWRTsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0gICAgfQotCi0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIHJldHVybiBtY29yZV9lbGZfaG93dG9fdGFibGUgWyhpbnQpIG1jb3JlX3JlbG9jXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBSQ0UgRUxGIHJlbG9jLiAgKi8KLXN0YXRpYyB2b2lkCi1tY29yZV9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgKiBkc3Q7Ci17Ci0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIEJGRF9BU1NFUlQgKEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9NQ09SRV9tYXgpOwotICAKLSAgY2FjaGVfcHRyLT5ob3d0byA9IG1jb3JlX2VsZl9ob3d0b190YWJsZSBbRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyldOwotfQotCi0vKiBGdW5jdGlvbiB0byBzZXQgd2hldGhlciBhIG1vZHVsZSBuZWVkcyB0aGUgLW1yZWxvY2F0YWJsZSBiaXQgc2V0LiAqLwotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyAoYWJmZCwgZmxhZ3MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghIGVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyLiAgKi8KLXN0YXRpYyBib29sZWFuCi1tY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBpZiAoICAgYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQkZEX0FTU0VSVCAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1lcmdlIGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIGFuIG9iamVjdCBmaWxlIHRvIHRoZSBvdXRwdXQKLSAgIG9iamVjdCBmaWxlIHdoZW4gbGlua2luZy4gICovCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqIGliZmQ7Ci0gICAgIGJmZCAqIG9iZmQ7Ci17Ci0gIGZsYWd3b3JkIG9sZF9mbGFnczsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzOwotICBib29sZWFuIGVycm9yOwotCi0gIC8qIENoZWNrIGlmIHdlIGhhdmUgdGhlIHNhbWUgZW5kaWFuZXNzICovCi0gIGlmICggICBpYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyCi0gICAgICAmJiBvYmZkLT54dmVjLT5ieXRlb3JkZXIgIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgJXMgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzICVzIGVuZGlhbi5cbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLSAgICAgICAgIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0gICAgICAgICBiZmRfYmlnX2VuZGlhbiAob2JmZCkgPyAiYmlnIiA6ICJsaXR0bGUiKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIAotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCS8qIEZpcnN0IGNhbGwsIG5vIGZsYWdzIHNldCAqLwotICAgIHsKLSAgICAgIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IG5ld19mbGFnczsKLSAgICB9Ci0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIERvbid0IHByZXRlbmQgd2UgY2FuIGRlYWwgd2l0aCB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1jb3JlX2VsZl91bnN1cHBvcnRlZF9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiByZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqIHN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICogaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICogb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKiBlcnJvcl9tZXNzYWdlOwotewotICBCRkRfQVNTRVJUIChyZWxvY19lbnRyeS0+aG93dG8gIT0gKHJlbG9jX2hvd3RvX3R5cGUgKikwKTsKLSAgCi0gIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJICAgICAgcmVsb2NfZW50cnktPmhvd3RvLT5uYW1lLAotCQkgICAgICByZWxvY19lbnRyeS0+aG93dG8tPnR5cGUpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotfQotCi0MCi0vKiBUaGUgUkVMT0NBVEVfU0VDVElPTiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIEVMRiBiYWNrZW5kIGxpbmtlcgotICAgdG8gaGFuZGxlIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uLgotCi0gICBUaGUgcmVsb2NzIGFyZSBhbHdheXMgcGFzc2VkIGFzIFJlbGEgc3RydWN0dXJlczsgaWYgdGhlIHNlY3Rpb24KLSAgIGFjdHVhbGx5IHVzZXMgUmVsIHN0cnVjdHVyZXMsIHRoZSByX2FkZGVuZCBmaWVsZCB3aWxsIGFsd2F5cyBiZQotICAgemVyby4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgYWRqdXN0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGFzCi0gICBuZWNlc3NhcnksIGFuZCAoaWYgdXNpbmcgUmVsYSByZWxvY3MgYW5kIGdlbmVyYXRpbmcgYQotICAgcmVsb2NhdGVhYmxlIG91dHB1dCBmaWxlKSBhZGp1c3RpbmcgdGhlIHJlbG9jIGFkZGVuZCBhcwotICAgbmVjZXNzYXJ5LgotCi0gICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0aGUgcmVsb2MKLSAgIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotICAgTE9DQUxfU1lNUyBpcyBhIHBvaW50ZXIgdG8gdGhlIHN3YXBwZWQgaW4gbG9jYWwgc3ltYm9scy4KLQotICAgTE9DQUxfU0VDVElPTlMgaXMgYW4gYXJyYXkgZ2l2aW5nIHRoZSBzZWN0aW9uIGluIHRoZSBpbnB1dCBmaWxlCi0gICBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdF9zaG5keCBmaWVsZCBvZiBlYWNoIGxvY2FsIHN5bWJvbC4KLQotICAgVGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5IGZvciB0aGUgZ2xvYmFsIHN5bWJvbHMgY2FuIGJlIGZvdW5kCi0gICB2aWEgZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZCkuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGlzIGZ1bmN0aW9uIG11c3QgaGFuZGxlCi0gICBTVEJfTE9DQUwvU1RUX1NFQ1RJT04gc3ltYm9scyBzcGVjaWFsbHkuICBUaGUgb3V0cHV0IHN5bWJvbCBpcwotICAgZ29pbmcgdG8gYmUgdGhlIHNlY3Rpb24gc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG91dHB1dAotICAgc2VjdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYWRkZW5kIG11c3QgYmUgYWRqdXN0ZWQKLSAgIGFjY29yZGluZ2x5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKiBvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqIGluZm87Ci0gICAgIGJmZCAqIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIGxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgICAgICAgcmVsID0gcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYm9vbGVhbiByZXQgPSB0cnVlOwotICBsb25nIGluc247Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgIm1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50LAotCSAgIChpbmZvLT5yZWxvY2F0ZWFibGUpID8gIiAocmVsb2NhdGFibGUpIiA6ICIiKTsKLSNlbmRpZgotCi0gIGlmICghIG1jb3JlX2VsZl9ob3d0b190YWJsZSBbUl9NQ09SRV9QQ1JFTElNTThCWTRdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG1jb3JlX2VsZl9ob3d0b19pbml0ICgpOwotCi0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUgICAgcl90eXBlID0gKGVudW0gZWxmX21jb3JlX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByID0gYmZkX3JlbG9jX290aGVyOwotICAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICAgICBzZWMgPSAoYXNlY3Rpb24gKikgMDsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiAgICAgICAgICAgaG93dG87Ci0gICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgICAgIHJlbG9jYXRpb247Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bSA9IChFbGZfSW50ZXJuYWxfU3ltICopIDA7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIDA7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgICAgICAgICAgICAgIG9sZGluc3Q7Ci0gICAgICAKLSAgICAgIC8qIFVua25vd24gcmVsb2NhdGlvbiBoYW5kbGluZyAqLwotICAgICAgaWYgKCh1bnNpZ25lZCkgcl90eXBlID49ICh1bnNpZ25lZCkgUl9NQ09SRV9tYXgKLQkgIHx8ICEgbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KXJfdHlwZV0pCi0JewotCSAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogVW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWRcbiIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgIChpbnQpIHJfdHlwZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAKLSAgICAgIGhvd3RvID0gbWNvcmVfZWxmX2hvd3RvX3RhYmxlIFsoaW50KSByX3R5cGVdOwotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIAotCSAgICAgIGlmICgodW5zaWduZWQpRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBzeW1ib2wgaW5kZXggPSAlbGQsIG9mZnNldCA9ICVsZCwgYWRkZW5kID0gJWxkXG4iLAotCQkgICBob3d0by0+bmFtZSwgKGludCkgcl90eXBlLCByX3N5bW5keCwgKGxvbmcpIG9mZnNldCwgKGxvbmcpIGFkZGVuZCk7Ci0jZW5kaWYKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotCi0gICAgICAvKiBDb21wbGFpbiBhYm91dCBrbm93biByZWxvY2F0aW9uIHRoYXQgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkICovCi0gICAgICBpZiAoaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24gPT0gbWNvcmVfZWxmX3Vuc3VwcG9ydGVkX3JlbG9jKQotCXsKLQkgIF9iZmRfZXJyb3JfaGFuZGxlciAoXygiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIpLAotCQkJICAgICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCSAgICAgIGhvd3RvLT5uYW1lLAotCQkJICAgICAgKGludClyX3R5cGUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldCA9IGZhbHNlOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zIFtyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzIFtyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgaWYgKCAgIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAJIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgcmV0ID0gZmFsc2U7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIFJfTUNPUkVfUENSRUxKU1JfSU1NMTFCWTI6Ci0JICBvbGRpbnN0ID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0jZGVmaW5lCU1DT1JFX0lOU1RfQlNSCTB4RjgwMAotCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBNQ09SRV9JTlNUX0JTUiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgYnJlYWs7Ci0JfQotCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkgICAgICAgaG93dG8tPm5hbWUsIHJfdHlwZSwgcl9zeW1uZHgsIChsb25nKSBvZmZzZXQsIChsb25nKSBhZGRlbmQpOwotI2VuZGlmCi0KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLQkoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgY29udGVudHMsIG9mZnNldCwgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rICYmIHJfdHlwZSA9PSBSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyKQotCXsKLQkgIC8qIFdhc24ndCBvaywgYmFjayBpdCBvdXQgYW5kIGdpdmUgdXAuICAqLwotCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLCBvbGRpbnN0LCBjb250ZW50cyArIG9mZnNldCk7Ci0JICByID0gYmZkX3JlbG9jX29rOwotCX0KLSAgICAgIAotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHJldCA9IGZhbHNlOwotCSAgCi0JICBzd2l0Y2ggKHIpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKiBuYW1lOwotCi0JCWlmIChoICE9IE5VTEwpCi0JCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkgICAgICAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9saW5rLCBzeW0tPnN0X25hbWUpOwotCQkgICAgCi0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICBicmVhazsKLQotCQkgICAgaWYgKCogbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQotCQkoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICBvZmZzZXQpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIHJldDsKLX0KLQwKLS8qIFJldHVybiB0aGUgc2VjdGlvbiB0aGF0IHNob3VsZCBiZSBtYXJrZWQgYWdhaW5zdCBHQyBmb3IgYSBnaXZlbgotICAgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tY29yZV9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqICAgICAgIGluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgcmVsOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICAgICAgICAgc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0JewotCWNhc2UgUl9NQ09SRV9HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIAotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgICBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLgotICAgU2luY2Ugd2UgZG9uJ3QgZG8gLmdvdHMgb3IgLnBsdHMsIHdlIGp1c3QgbmVlZCB0byBjb25zaWRlciB0aGUKLSAgIHZpcnR1YWwgdGFibGUgcmVsb2NzIGZvciBnYy4gICovCi0gCi1zdGF0aWMgYm9vbGVhbgotbWNvcmVfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgYXNlY3Rpb24gKiBzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICogcmVsb2NzOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgICAgcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICByZWxfZW5kOwotIAotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotIAotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotICBpZiAoIWVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLSAgICBzeW1faGFzaGVzX2VuZCAtPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotIAotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgCi0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotIAotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXMgW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0gCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgICB7Ci0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfTUNPUkVfR05VX1ZUSU5IRVJJVDoKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQkgIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9NQ09SRV9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfbWNvcmVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCSJlbGYzMi1tY29yZS1iaWciCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgIGJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICAgICJlbGYzMi1tY29yZS1saXR0bGUiCi0KLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX21jb3JlCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fTUNPUkUKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEwMDAJCS8qIDRrLCBpZiB3ZSBldmVyIGhhdmUgJ2VtICovCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCW1jb3JlX2VsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAlOVUxMCi0KLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQltY29yZV9lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQltY29yZV9lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3NldF9wcml2YXRlX2ZsYWdzCQltY29yZV9lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxvY190eXBlX2xvb2t1cAkJbWNvcmVfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JCW1jb3JlX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawkJbWNvcmVfZWxmX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rCQltY29yZV9lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgICAgICAgICAgICAgICAgbWNvcmVfZWxmX2NoZWNrX3JlbG9jcwotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwkJMQotCi0jaW5jbHVkZSAiZWxmMzItdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmMzItbWlwcy5jIGIvYmZkL2VsZjMyLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1MmU4YS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODA2NyArMCwwIEBACi0vKiBNSVBTLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE1vc3Qgb2YgdGhlIGluZm9ybWF0aW9uIGFkZGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LAotICAgPGlhbkBjeWdudXMuY29tPi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaGFuZGxlcyBNSVBTIEVMRiB0YXJnZXRzLiAgU0dJIElyaXggNSB1c2VzIGEgc2xpZ2h0bHkKLSAgIGRpZmZlcmVudCBNSVBTIEVMRiBmcm9tIG90aGVyIHRhcmdldHMuICBUaGlzIG1hdHRlcnMgd2hlbiBsaW5raW5nLgotICAgVGhpcyBmaWxlIHN1cHBvcnRzIGJvdGgsIHN3aXRjaGluZyBhdCBydW50aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICAqLwotI2luY2x1ZGUgImNvZmYvc3ltLmgiCi0jaW5jbHVkZSAiY29mZi9zeW1jb25zdC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jaW5jbHVkZSAiY29mZi9taXBzLmgiCi0jZGVmaW5lIEVDT0ZGXzMyCi0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwczMyXzY0Yml0X3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKmJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWwgKikpOwotc3RhdGljIHZvaWQgbWlwc19pbmZvX3RvX2hvd3RvX3JlbGEKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqLCBFbGYzMl9ncHRhYiAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfZ3B0YWIgKiwgRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikpOwotc3RhdGljIHZvaWQgYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9pbiAKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX01zeW0gKiwgRWxmMzJfSW50ZXJuYWxfTXN5bSAqKSk7Ci1zdGF0aWMgdm9pZCBiZmRfbWlwc19lbGZfc3dhcF9tc3ltX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmMzJfSW50ZXJuYWxfTXN5bSAqLCBFbGYzMl9FeHRlcm5hbF9Nc3ltICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX3N5bV9pc19nbG9iYWwgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGYzMl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZQotICBQQVJBTVMgKChQVFIsIGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICopKTsKLXN0YXRpYyBpbnQgbWlwc19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIElOTElORSBpbnQgZWxmX21pcHNfaXNhIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci1zdGF0aWMgSU5MSU5FIGludCBlbGZfbWlwc19tYWNoIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci1zdGF0aWMgSU5MSU5FIGNoYXIqIGVsZl9taXBzX2FiaV9uYW1lIFBBUkFNUyAoKGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGYzMl9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIEVsZjMyX0ludGVybmFsX1NoZHIgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICptaXBzX2VsZl9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICptaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGdwdGFiX2NvbXBhcmUgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYKLSAgUEFSQU1TICgoYmZkICosIEVsZl9JbnRlcm5hbF9SZWxhICosIEVsZl9JbnRlcm5hbF9SZWxhICosIGJmZF9ieXRlICosCi0JICAgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfcmVsb2NhdGVfZ290X2xvY2FsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZl9yZWxvY2F0ZV9nbG9iYWxfZ290Ci0gICBQQVJBTVMgKChiZmQgKiwgRWxmX0ludGVybmFsX1JlbGEgKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBtaXBzMTZfanVtcF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgbWlwczE2X2dwcmVsX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZl9hZGRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBjb25zdCBjaGFyICoqLCBmbGFnd29yZCAqLCBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIG1pcHNfZWxmX2ZpbmFsX2dwCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJmZF9ieXRlICplbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0JICAgYmZkX2J5dGUgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uIAotICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBUaGUgbGV2ZWwgb2YgSVJJWCBjb21wYXRpYmlsaXR5IHdlJ3JlIHN0cml2aW5nIGZvci4gICovCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGljdF9ub25lLAotICBpY3RfaXJpeDUsCi0gIGljdF9pcml4NgotfSBpcml4X2NvbXBhdF90OwotCi0vKiBOb256ZXJvIGlmIEFCRkQgaXMgdXNpbmcgdGhlIE4zMiBBQkkuICAqLwotCi0jZGVmaW5lIEFCSV9OMzJfUChhYmZkKSBcCi0gICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSTIpICE9IDApCi0KLS8qIFdoYXQgdmVyc2lvbiBvZiBJcml4IHdlIGFyZSB0cnlpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoLiAgRklYTUU6Ci0gICBBdCB0aGUgbW9tZW50LCB3ZSBuZXZlciBnZW5lcmF0ZSAibm9ybWFsIiBNSVBTIEVMRiBBQkkgZXhlY3V0YWJsZXM7Ci0gICB3ZSBhbHdheXMgdXNlIHNvbWUgdmVyc2lvbiBvZiBJcml4LiAgKi8KLQotI2RlZmluZSBJUklYX0NPTVBBVChhYmZkKSBcCi0gIChBQklfTjMyX1AgKGFiZmQpID8gaWN0X2lyaXg2IDogaWN0X2lyaXg1KQotCi0vKiBXaGV0aGVyIHdlIGFyZSB0cnlpbmcgdG8gYmUgY29tcGF0aWJsZSB3aXRoIElSSVggYXQgYWxsLiAgKi8KLQotI2RlZmluZSBTR0lfQ09NUEFUKGFiZmQpIFwKLSAgKElSSVhfQ09NUEFUIChhYmZkKSAhPSBpY3Rfbm9uZSkKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIC5nb3QgaW5mb3JtYXRpb24gd2hlbiBsaW5raW5nLiAgSXQKLSAgIGlzIHN0b3JlZCBpbiB0aGUgdGRhdGEgZmllbGQgb2YgdGhlIGJmZF9lbGZfc2VjdGlvbl9kYXRhIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBtaXBzX2dvdF9pbmZvCi17Ci0gIC8qIFRoZSBzeW1ib2wgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCAuZ290IHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZ2xvYmFsX2dvdHN5bTsKLSAgLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxfZ290bm87Ci0gIC8qIFRoZSBudW1iZXIgb2YgbG9jYWwgLmdvdCBlbnRyaWVzIHdlIGhhdmUgdXNlZC4gICovCi0gIHVuc2lnbmVkIGludCBhc3NpZ25lZF9nb3RubzsKLX07Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSBtc3ltIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRShhYmZkKSAiLm1zeW0iCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBzcmRhdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1NSREFUQV9TRUNUSU9OX05BTUUoYWJmZCkgIi5zcmRhdGEiCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBvcHRpb25zIHNlY3Rpb24uICAqLwotI2RlZmluZSBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRShhYmZkKSBcCi0gIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2ID8gIi5NSVBTLm9wdGlvbnMiIDogIi5vcHRpb25zIikKLQotLyogVGhlIG5hbWUgb2YgdGhlIHN0dWIgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FKGFiZmQpIFwKLSAgKElSSVhfQ09NUEFUIChhYmZkKSA9PSBpY3RfaXJpeDYgPyAiLk1JUFMuc3R1YnMiIDogIi5zdHViIikKLQotLyogVGhlIG51bWJlciBvZiBsb2NhbCAuZ290IGVudHJpZXMgd2UgcmVzZXJ2ZS4gICovCi0jZGVmaW5lIE1JUFNfUkVTRVJWRURfR09UTk8gKDIpCi0KLS8qIEluc3RydWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gYSBzdHViLiAgRm9yIHNvbWUgcmVhc29uIHRoZSBzdHViIGlzCi0gICBzbGlnaHRseSBkaWZmZXJlbnQgb24gYW4gU0dJIHN5c3RlbS4gICovCi0jZGVmaW5lIEVMRl9NSVBTX0dQX09GRlNFVChhYmZkKSAoU0dJX0NPTVBBVCAoYWJmZCkgPyAweDdmZjAgOiAweDgwMDApCi0jZGVmaW5lIFNUVUJfTFcoYWJmZCkJCQkJCVwKLSAgKFNHSV9DT01QQVQgKGFiZmQpCQkJCQlcCi0gICA/IDB4OGY5OTgwMTAJCQkvKiBsdyB0OSwweDgwMTAoZ3ApICovCVwKLSAgIDogMHg4Zjk5ODAwMCkJCS8qIGx3IHQ5LDB4ODAwMChncCkgKi8KLSNkZWZpbmUgU1RVQl9NT1ZFIDB4MDNlMDc4MjUJLyogbW92ZSB0NyxyYSAqLwotI2RlZmluZSBTVFVCX0pBTFIgMHgwMzIwZjgwOQkvKiBqYWwgdDkgKi8KLSNkZWZpbmUgU1RVQl9MSTE2IDB4MzQxODAwMDAJLyogb3JpIHQ4LHplcm8sMCAqLwotI2RlZmluZSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSAoMTYpCi0KLSNpZiAwCi0vKiBXZSBubyBsb25nZXIgdHJ5IHRvIGlkZW50aWZ5IHBhcnRpY3VsYXIgc2VjdGlvbnMgZm9yIHRoZSAuZHluc3ltCi0gICBzZWN0aW9uLiAgV2hlbiB3ZSBkbywgd2Ugd2luZCB1cCBjcmFzaGluZyBpZiB0aGVyZSBhcmUgb3RoZXIgcmFuZG9tCi0gICBzZWN0aW9ucyB3aXRoIHJlbG9jYXRpb25zLiAgKi8KLQotLyogTmFtZXMgb2Ygc2VjdGlvbnMgd2hpY2ggYXBwZWFyIGluIHRoZSAuZHluc3ltIHNlY3Rpb24gaW4gYW4gSXJpeCA1Ci0gICBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzW10gPQotewotICAiLnRleHQiLAotICAiLmluaXQiLAotICAiLmZpbmkiLAotICAiLmRhdGEiLAotICAiLnJvZGF0YSIsCi0gICIuc2RhdGEiLAotICAiLnNic3MiLAotICAiLmJzcyIsCi0gIE5VTEwKLX07Ci0KLSNkZWZpbmUgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTIFwKLSAgKHNpemVvZiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIC8gc2l6ZW9mIG1pcHNfZWxmX2R5bnN5bV9zZWNfbmFtZXNbMF0pCi0KLS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzIHdoaWNoIGdvIGluIHRoZQotICAgdGV4dCBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBNSVBTX1RFWFRfRFlOU1lNX1NFQ05PICgzKQotCi0jZW5kaWYgLyogMCAqLwotCi0vKiBUaGUgbmFtZXMgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIHN5bWJvbHMgdXNlZCBvbiBJcml4IDUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbXSA9Ci17Ci0gICJfcHJvY2VkdXJlX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfc3RyaW5nX3RhYmxlIiwKLSAgIl9wcm9jZWR1cmVfdGFibGVfc2l6ZSIsCi0gIE5VTEwKLX07Ci0KLS8qIFRoZXNlIHN0cnVjdHVyZXMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIC5jb21wYWN0X3JlbCBzZWN0aW9uIG9uCi0gICBJcml4IDUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nIGlkMTsJCS8qIEFsd2F5cyBvbmU/ICAqLwotICB1bnNpZ25lZCBsb25nIG51bTsJCS8qIE51bWJlciBvZiBjb21wYWN0IHJlbG9jYXRpb24gZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgaWQyOwkJLyogQWx3YXlzIHR3bz8gICovCi0gIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkJLyogVGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByZXNlcnZlZDA7CS8qIFplcm8/ICAqLwotICB1bnNpZ25lZCBsb25nIHJlc2VydmVkMTsJLyogWmVybz8gICovCi19IEVsZjMyX2NvbXBhY3RfcmVsOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpZDFbNF07Ci0gIGJmZF9ieXRlIG51bVs0XTsKLSAgYmZkX2J5dGUgaWQyWzRdOwotICBiZmRfYnl0ZSBvZmZzZXRbNF07Ci0gIGJmZF9ieXRlIHJlc2VydmVkMFs0XTsKLSAgYmZkX2J5dGUgcmVzZXJ2ZWQxWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgaW50IGN0eXBlIDogMTsJLyogMTogbG9uZyAwOiBzaG9ydCBmb3JtYXQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGludCBydHlwZSA6IDQ7CS8qIFJlbG9jYXRpb24gdHlwZXMuIFNlZSBiZWxvdy4gKi8KLSAgdW5zaWduZWQgaW50IGRpc3QydG8gOiA4OwotICB1bnNpZ25lZCBpbnQgcmVsdmFkZHIgOiAxOTsJLyogKFZBRERSIC0gdmFkZHIgb2YgdGhlIHByZXZpb3VzIGVudHJ5KS8gNCAqLwotICB1bnNpZ25lZCBsb25nIGtvbnN0OwkJLyogS09OU1QgZmllbGQuIFNlZSBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdmFkZHI7CQkvKiBWQUREUiB0byBiZSByZWxvY2F0ZWQuICAqLwotfSBFbGYzMl9jcmluZm87Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGludCBjdHlwZSA6IDE7CS8qIDE6IGxvbmcgMDogc2hvcnQgZm9ybWF0LiBTZWUgYmVsb3cuICAqLwotICB1bnNpZ25lZCBpbnQgcnR5cGUgOiA0OwkvKiBSZWxvY2F0aW9uIHR5cGVzLiBTZWUgYmVsb3cuICovCi0gIHVuc2lnbmVkIGludCBkaXN0MnRvIDogODsKLSAgdW5zaWduZWQgaW50IHJlbHZhZGRyIDogMTk7CS8qIChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkvIDQgKi8KLSAgdW5zaWduZWQgbG9uZyBrb25zdDsJCS8qIEtPTlNUIGZpZWxkLiBTZWUgYmVsb3cuICAqLwotfSBFbGYzMl9jcmluZm8yOwotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfYnl0ZSBpbmZvWzRdOwotICBiZmRfYnl0ZSBrb25zdFs0XTsKLSAgYmZkX2J5dGUgdmFkZHJbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYmZkX2J5dGUgaW5mb1s0XTsKLSAgYmZkX2J5dGUga29uc3RbNF07Ci19IEVsZjMyX0V4dGVybmFsX2NyaW5mbzI7Ci0KLS8qIFRoZXNlIGFyZSB0aGUgY29uc3RhbnRzIHVzZWQgdG8gc3dhcCB0aGUgYml0ZmllbGRzIGluIGEgY3JpbmZvLiAgKi8KLQotI2RlZmluZSBDUklORk9fQ1RZUEUgKDB4MSkKLSNkZWZpbmUgQ1JJTkZPX0NUWVBFX1NIICgzMSkKLSNkZWZpbmUgQ1JJTkZPX1JUWVBFICgweGYpCi0jZGVmaW5lIENSSU5GT19SVFlQRV9TSCAoMjcpCi0jZGVmaW5lIENSSU5GT19ESVNUMlRPICgweGZmKQotI2RlZmluZSBDUklORk9fRElTVDJUT19TSCAoMTkpCi0jZGVmaW5lIENSSU5GT19SRUxWQUREUiAoMHg3ZmZmZikKLSNkZWZpbmUgQ1JJTkZPX1JFTFZBRERSX1NIICgwKQotCi0vKiBBIGNvbXBhY3QgcmVsb2NhdGlvbiBpbmZvIGhhcyBsb25nICgzIHdvcmRzKSBvciBzaG9ydCAoMiB3b3JkcykKLSAgIGZvcm1hdHMuICBBIHNob3J0IGZvcm1hdCBkb2Vzbid0IGhhdmUgVkFERFIgZmllbGQgYW5kIHJlbHZhZGRyCi0gICBmaWVsZHMgY29udGFpbnMgKChWQUREUiAtIHZhZGRyIG9mIHRoZSBwcmV2aW91cyBlbnRyeSkgPj4gMikuICAqLwotI2RlZmluZSBDUkZfTUlQU19MT05HCQkJMQotI2RlZmluZSBDUkZfTUlQU19TSE9SVAkJCTAKLQotLyogVGhlcmUgYXJlIDQgdHlwZXMgb2YgY29tcGFjdCByZWxvY2F0aW9uIGF0IGxlYXN0LiBUaGUgdmFsdWUgS09OU1QKLSAgIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgZWFjaCB0eXBlOgotCi0gICAodHlwZSkJCShrb25zdCkKLSAgIENUX01JUFNfUkVMMzIJQWRkcmVzcyBpbiBkYXRhCi0gICBDVF9NSVBTX1dPUkQJCUFkZHJlc3MgaW4gd29yZCAoWFhYKQotICAgQ1RfTUlQU19HUEhJX0xPCUdQIC0gdmFkZHIKLSAgIENUX01JUFNfSk1QQUQJQWRkcmVzcyB0byBqdW1wCi0gICAqLwotCi0jZGVmaW5lIENSVF9NSVBTX1JFTDMyCQkJMHhhCi0jZGVmaW5lIENSVF9NSVBTX1dPUkQJCQkweGIKLSNkZWZpbmUgQ1JUX01JUFNfR1BISV9MTwkJMHhjCi0jZGVmaW5lIENSVF9NSVBTX0pNUEFECQkJMHhkCi0KLSNkZWZpbmUgbWlwc19lbGZfc2V0X2NyX2Zvcm1hdCh4LGZvcm1hdCkJKCh4KS5jdHlwZSA9IChmb3JtYXQpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfdHlwZSh4LHR5cGUpCQkoKHgpLnJ0eXBlID0gKHR5cGUpKQotI2RlZmluZSBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byh4LHYpCQkoKHgpLmRpc3QydG8gPSAodikpCi0jZGVmaW5lIG1pcHNfZWxmX3NldF9jcl9yZWx2YWRkcih4LGQpCQkoKHgpLnJlbHZhZGRyID0gKGQpPDwyKQotCi1zdGF0aWMgdm9pZCBiZmRfZWxmMzJfc3dhcF9jb21wYWN0X3JlbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NvbXBhY3RfcmVsICosIEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsICopKTsKLXN0YXRpYyB2b2lkIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX2NyaW5mbyAqLCBFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikpOwotCi0jZGVmaW5lIFVTRV9SRUwJMQkJLyogTUlQUyB1c2VzIFJFTCByZWxvY2F0aW9ucyBpbnN0ZWFkIG9mIFJFTEEgKi8KLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19OT05FLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBzeW1ib2wgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAyNiBiaXQgYnJhbmNoIGFkZHJlc3MuICAqLwotICBIT1dUTyAoUl9NSVBTXzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMjYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIaWdoIDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISTE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISTE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2xvMTZfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDE2X3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUmVmZXJlbmNlIHRvIGxpdGVyYWwgc2VjdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0xJVEVSQUwiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dvdDE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1BDMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QQzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IGNhbGwgdGhyb3VnaCBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgR1AgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMzJfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDMyIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGRlZmluZWQgb24gSXJpeCA1LCBhbHRob3VnaCB0aGV5IGFyZQotICAgICAgIG5vdCBkZWZpbmVkIGJ5IHRoZSBBQkkuICAqLwotICAgIHsgMTMgfSwKLSAgICB7IDE0IH0sCi0gICAgeyAxNSB9LAotCi0gIC8qIEEgNSBiaXQgc2hpZnQgZmllbGQuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ1IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2MwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNiBiaXQgc2hpZnQgZmllbGQuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHk7IGEgc3BlY2lhbCBmdW5jdGlvbiBpcwotICAgICBuZWVkZWQgdG8gcHV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiB0aGUgcmlnaHQgcGxhY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2M0LAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgaW4gMzIgYml0IEVMRiB3aGVuIGFkZHJlc3NlcwotICAgICBhcmUgNjQgYml0cyBsb25nOyB0aGUgdXBwZXIgMzIgYml0cyBhcmUgc2ltcGx5IGEgc2lnbiBleHRlbnNpb24uCi0gICAgIFRoZSBmaWVsZHMgb2YgdGhlIGhvd3RvIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBmb3IgUl9NSVBTXzMyLAotICAgICBvdGhlciB0aGFuIHRoZSB0eXBlLCBuYW1lLCBhbmQgc3BlY2lhbF9mdW5jdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfNjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCB0byBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfUEFHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX1BBR0UiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogT2Zmc2V0IGZyb20gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX09GU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9PRlNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHN1YnRyYWN0aW9uLiAgVXNlZCBpbiB0aGUgTjMyIEFCSS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX1NVQiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NVQiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgdG8gY2F1c2UgdGhlIGxpbmtlciB0byBpbnNlcnQgYW5kIGRlbGV0ZSBpbnN0cnVjdGlvbnM/ICAqLwotICB7IFJfTUlQU19JTlNFUlRfQSB9LAotICB7IFJfTUlQU19JTlNFUlRfQiB9LAotICB7IFJfTUlQU19ERUxFVEUgfSwKLQotICAvKiBHZXQgdGhlIGhpZ2hlciB2YWx1ZXMgb2YgYSA2NCBiaXQgYWRkZW5kLiAgUHJlc3VtYWJseSBub3QgdXNlZCBpbgotICAgICAzMiBiaXQgRUxGLiAgKi8KLSAgeyBSX01JUFNfSElHSEVSIH0sCi0gIHsgUl9NSVBTX0hJR0hFU1QgfSwKLQotICAvKiBIaWdoIDE2IGJpdHMgb2YgZGlzcGxhY2VtZW50IGluIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19DQUxMX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfQ0FMTF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICB7IFJfTUlQU19TQ05fRElTUCB9LAotICB7IFJfTUlQU19SRUwxNiB9LAotICB7IFJfTUlQU19BRERfSU1NRURJQVRFIH0sCi0gIHsgUl9NSVBTX1BKVU1QIH0sCi0gIHsgUl9NSVBTX1JFTEdPVCB9LAotCi0gIC8qIFByb3RlY3RlZCBqdW1wIGNvbnZlcnNpb24uICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiBoaW50LiAgTm8gCi0gICAgIHJlbG9jYXRpb24gaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19KQUxSLAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19KQUxSIiwJICAgICAgICAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMDAwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogVGhlIHJlbG9jIHVzZWQgZm9yIEJGRF9SRUxPQ19DVE9SIHdoZW4gZG9pbmcgYSA2NCBiaXQgbGluay4gIFRoaXMKLSAgIGlzIGEgaGFjayB0byBtYWtlIHRoZSBsaW5rZXIgdGhpbmsgdGhhdCB3ZSBuZWVkIDY0IGJpdCB2YWx1ZXMuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfY3RvcjY0X2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMzJfNjRiaXRfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU182NCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHMxNl9qdW1wX2hvd3RvID0KLSAgSE9XVE8gKFJfTUlQUzE2XzI2LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAJCQkvKiBUaGlzIG5lZWRzIGNvbXBsZXggb3ZlcmZsb3cKLQkJCQkgICBkZXRlY3Rpb24sIGJlY2F1c2UgdGhlIHVwcGVyIGZvdXIKLQkJCQkgICBiaXRzIG11c3QgbWF0Y2ggdGhlIFBDLiAgKi8KLQkgbWlwczE2X2p1bXBfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2XzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFRoZSByZWxvYyB1c2VkIGZvciB0aGUgbWlwczE2IGdwcmVsIGluc3RydWN0aW9uLiAgVGhlIHNyY19tYXNrIGFuZAotICAgZHNrX21hc2sgZm9yIHRoaXMgaG93dG8gZG8gbm90IHJlZmxlY3QgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiwgaW4KLSAgIHdoaWNoIHRoZSB2YWx1ZSBpcyBub3QgY29udGlndW91czsgdGhlIG1hc2tzIGFyZSBmb3IgdGhlCi0gICBjb252ZW5pZW5jZSBvZiB0aGUgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLiAgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZl9taXBzMTZfZ3ByZWxfaG93dG8gPQotICBIT1dUTyAoUl9NSVBTMTZfR1BSRUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBtaXBzMTZfZ3ByZWxfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQUzE2X0dQUkVMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotCi0vKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0byA9Ci0gIEhPV1RPIChSX01JUFNfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR05VX1ZURU5UUlkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpOwkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIERvIGEgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbi4gIFRoaXMgaGFzIHRvIGJlIGRvbmUgaW4gY29tYmluYXRpb24KLSAgIHdpdGggYSBSX01JUFNfTE8xNiByZWxvYywgYmVjYXVzZSB0aGVyZSBpcyBhIGNhcnJ5IGZyb20gdGhlIExPMTYgdG8KLSAgIHRoZSBISTE2LiAgSGVyZSB3ZSBqdXN0IHNhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQ7IHdlIGRvIHRoZQotICAgYWN0dWFsIHJlbG9jYXRpb24gd2hlbiB3ZSBzZWUgdGhlIExPMTYuICBNSVBTIEVMRiByZXF1aXJlcyB0aGF0IHRoZQotICAgTE8xNiBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEhJMTYuICBBcyBhIEdOVSBleHRlbnNpb24sIHdlIHBlcm1pdCBhbgotICAgYXJiaXRyYXJ5IG51bWJlciBvZiBISTE2IHJlbG9jcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgTE8xNgotICAgcmVsb2MuICBUaGlzIGV4dGVuc2lvbiBwZXJtaXRzIGdjYyB0byBvdXRwdXQgdGhlIEhJIGFuZCBMTyByZWxvY3MKLSAgIGl0c2VsZi4gICovCi0KLXN0cnVjdCBtaXBzX2hpMTYKLXsKLSAgc3RydWN0IG1pcHNfaGkxNiAqbmV4dDsKLSAgYmZkX2J5dGUgKmFkZHI7Ci0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBiZSBhIHN0YXRpYyB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaTE2ICptaXBzX2hpMTZfbGlzdDsKLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX21pcHNfZWxmX2hpMTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgcmVsb2NfZW50cnksCi0JCSAgICAgc3ltYm9sLAotCQkgICAgIGRhdGEsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwKLQkJICAgICBvdXRwdXRfYmZkLAotCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHN0cnVjdCBtaXBzX2hpMTYgKm47Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSBkb24ndCB3YW50Ci0gICAgIHRvIGNoYW5nZSBhbnl0aGluZy4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgcmV0ID0gYmZkX3JlbG9jX29rOwotCi0gIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0gICAgewotICAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgICBiZmRfdm1hIGdwOwotCi0gICAgICBpZiAocmV0ID09IGJmZF9yZWxvY191bmRlZmluZWQpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0JcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLQkgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLQl9Ci0KLSAgICAgIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwKLQkJCSAgICAgICBlcnJvcl9tZXNzYWdlLCAmZ3ApOwotICAgICAgaWYgKHJldCAhPSBiZmRfcmVsb2Nfb2spCi0JcmV0dXJuIHJldDsKLQotICAgICAgcmVsb2NhdGlvbiA9IGdwIC0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotCSAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0JcmV0ID0gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLQlyZWxvY2F0aW9uID0gMDsKLSAgICAgIGVsc2UKLQlyZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLSAgICB9Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBTYXZlIHRoZSBpbmZvcm1hdGlvbiwgYW5kIGxldCBMTzE2IGRvIHRoZSBhY3R1YWwgcmVsb2NhdGlvbi4gICovCi0gIG4gPSAoc3RydWN0IG1pcHNfaGkxNiAqKSBiZmRfbWFsbG9jIChzaXplb2YgKm4pOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgbi0+YWRkciA9IChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIG4tPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0gIG4tPm5leHQgPSBtaXBzX2hpMTZfbGlzdDsKLSAgbWlwc19oaTE2X2xpc3QgPSBuOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIERvIGEgUl9NSVBTX0xPMTYgcmVsb2NhdGlvbi4gIFRoaXMgaXMgYSBzdHJhaWdodGZvcndhcmQgMTYgYml0Ci0gICBpbnBsYWNlIHJlbG9jYXRpb247IHRoaXMgZnVuY3Rpb24gZXhpc3RzIGluIG9yZGVyIHRvIGRvIHRoZQotICAgUl9NSVBTX0hJMTYgcmVsb2NhdGlvbiBkZXNjcmliZWQgYWJvdmUuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfbG8xNl9yZWxvYyAoYWJmZCwKLQkJICAgICByZWxvY19lbnRyeSwKLQkJICAgICBzeW1ib2wsCi0JCSAgICAgZGF0YSwKLQkJICAgICBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGFyZWxlbnQgZ3BfZGlzcF9yZWxlbnQ7Ci0KLSAgaWYgKG1pcHNfaGkxNl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG1pcHNfaGkxNiAqbDsKLQotICAgICAgbCA9IG1pcHNfaGkxNl9saXN0OwotICAgICAgd2hpbGUgKGwgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBsb25nIGluc247Ci0JICB1bnNpZ25lZCBsb25nIHZhbDsKLQkgIHVuc2lnbmVkIGxvbmcgdmFsbG87Ci0JICBzdHJ1Y3QgbWlwc19oaTE2ICpuZXh0OwotCi0JICAvKiBEbyB0aGUgSEkxNiByZWxvY2F0aW9uLiAgTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGRvbid0IG5lZWQKLQkgICAgIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIExPMTYgaXRzZWxmLCBleGNlcHQgd2hlcmUgdG8KLQkgICAgIGZpbmQgdGhlIGxvdyAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbmVlZGVkIGJ5IHRoZSBMTzE2LiAgKi8KLQkgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBsLT5hZGRyKTsKLQkgIHZhbGxvID0gKGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpCi0JCSAgICYgMHhmZmZmKTsKLQkgIHZhbCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpICsgdmFsbG87Ci0JICB2YWwgKz0gbC0+YWRkZW5kOwotCi0JICAvKiBUaGUgbG93IG9yZGVyIDE2IGJpdHMgYXJlIGFsd2F5cyB0cmVhdGVkIGFzIGEgc2lnbmVkCi0JICAgICB2YWx1ZS4gIFRoZXJlZm9yZSwgYSBuZWdhdGl2ZSB2YWx1ZSBpbiB0aGUgbG93IG9yZGVyIGJpdHMKLQkgICAgIHJlcXVpcmVzIGFuIGFkanVzdG1lbnQgaW4gdGhlIGhpZ2ggb3JkZXIgYml0cy4gIFdlIG5lZWQKLQkgICAgIHRvIG1ha2UgdGhpcyBhZGp1c3RtZW50IGluIHR3byB3YXlzOiBvbmNlIGZvciB0aGUgYml0cyB3ZQotCSAgICAgdG9vayBmcm9tIHRoZSBkYXRhLCBhbmQgb25jZSBmb3IgdGhlIGJpdHMgd2UgYXJlIHB1dHRpbmcKLQkgICAgIGJhY2sgaW4gdG8gdGhlIGRhdGEuICAqLwotCSAgaWYgKCh2YWxsbyAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsIC09IDB4MTAwMDA7Ci0JICBpZiAoKHZhbCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgdmFsICs9IDB4MTAwMDA7Ci0KLQkgIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKCh2YWwgPj4gMTYpICYgMHhmZmZmKTsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGwtPmFkZHIpOwotCi0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLCAiX2dwX2Rpc3AiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZ3BfZGlzcF9yZWxlbnQgPSAqcmVsb2NfZW50cnk7Ci0JICAgICAgcmVsb2NfZW50cnkgPSAmZ3BfZGlzcF9yZWxlbnQ7Ci0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IGwtPmFkZGVuZDsKLQkgICAgfQotCi0JICBuZXh0ID0gbC0+bmV4dDsKLQkgIGZyZWUgKGwpOwotCSAgbCA9IG5leHQ7Ci0JfQotCi0gICAgICBtaXBzX2hpMTZfbGlzdCA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksICJfZ3BfZGlzcCIpID09IDApCi0gICAgewotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldDsKLSAgICAgIGJmZF92bWEgZ3AsIHJlbG9jYXRpb247Ci0KLSAgICAgIC8qIEZJWE1FOiBEb2VzIHRoaXMgY2FzZSBldmVyIG9jY3VyPyAgKi8KLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgdHJ1ZSwgZXJyb3JfbWVzc2FnZSwgJmdwKTsKLSAgICAgIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotCXJldHVybiByZXQ7Ci0KLSAgICAgIHJlbG9jYXRpb24gPSBncCAtIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICAgICAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gICAgICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAgICAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotCXJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAgICAgZ3BfZGlzcF9yZWxlbnQgPSAqcmVsb2NfZW50cnk7Ci0gICAgICByZWxvY19lbnRyeSA9ICZncF9kaXNwX3JlbGVudDsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uIC0gNDsKLSAgICB9Ci0KLSAgLyogTm93IGRvIHRoZSBMTzE2IHJlbG9jIGluIHRoZSB1c3VhbCB3YXkuICAqLwotICByZXR1cm4gYmZkX2VsZl9nZW5lcmljX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCWlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotfQotCi0vKiBEbyBhIFJfTUlQU19HT1QxNiByZWxvYy4gIFRoaXMgaXMgYSByZWxvYyBhZ2FpbnN0IHRoZSBnbG9iYWwgb2Zmc2V0Ci0gICB0YWJsZSB1c2VkIGZvciBQSUMgY29kZS4gIElmIHRoZSBzeW1ib2wgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLCB0aGUKLSAgIGluc3RydWN0aW9uIGlzIG1vZGlmaWVkIHRvIGNvbnRhaW4gdGhlIG9mZnNldCBvZiB0aGUgYXBwcm9wcmlhdGUKLSAgIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgSWYgdGhlIHN5bWJvbCBpcyBhIHNlY3Rpb24KLSAgIHN5bWJvbCwgdGhlIG5leHQgcmVsb2MgaXMgYSBSX01JUFNfTE8xNiByZWxvYy4gIFRoZSB0d28gMTYgYml0Ci0gICBhZGRlbmRzIGFyZSBjb21iaW5lZCB0byBmb3JtIHRoZSByZWFsIGFkZGVuZCBhZ2FpbnN0IHRoZSBzZWN0aW9uCi0gICBzeW1ib2w7IHRoZSBHT1QxNiBpcyBtb2RpZmllZCB0byBjb250YWluIHRoZSBvZmZzZXQgb2YgYW4gZW50cnkgaW4KLSAgIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBhbmQgdGhlIExPMTYgaXMgbW9kaWZpZWQgdG8gb2Zmc2V0IGl0Ci0gICBhcHByb3ByaWF0ZWx5LiAgVGh1cyBhbiBvZmZzZXQgbGFyZ2VyIHRoYW4gMTYgYml0cyByZXF1aXJlcyBhCi0gICBtb2RpZmllZCB2YWx1ZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLQotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBzdWZmaWNlcyBmb3IgdGhlIGFzc2VtYmxlciwgYnV0IHRoZSBsaW5rZXIgZG9lcwotICAgbm90IHlldCBrbm93IGhvdyB0byBjcmVhdGUgZ2xvYmFsIG9mZnNldCB0YWJsZXMuICAqLwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfZ290MTZfcmVsb2MgKGFiZmQsCi0JCSAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICBzeW1ib2wsCi0JCSAgICAgIGRhdGEsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgIG91dHB1dF9iZmQsCi0JCSAgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIGRvbid0IHdhbnQKLSAgICAgdG8gY2hhbmdlIGFueXRoaW5nLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotICAgICAgJiYgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSByZWxvY2F0aW5nLCBhbmQgdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCwgd2UgY2FuIGhhbmRsZSBpdAotICAgICBqdXN0IGxpa2UgSEkxNi4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDApCi0gICAgcmV0dXJuIF9iZmRfbWlwc19lbGZfaGkxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCQkgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpOwotCi0gIGFib3J0ICgpOwotfQotCi0vKiBXZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIGdwIHZhbHVlLCBzbyB0aGF0IHdlIGNhbiBhZGp1c3QgdGhlCi0gICBzeW1ib2wgdmFsdWUgY29ycmVjdGx5LiAgV2UgbG9vayB1cCB0aGUgc3ltYm9sIF9ncCBpbiB0aGUgb3V0cHV0Ci0gICBCRkQuICBJZiB3ZSBjYW4ndCBmaW5kIGl0LCB3ZSdyZSBzdHVjay4gIFdlIGNhY2hlIGl0IGluIHRoZSBFTEYKLSAgIHRhcmdldCBkYXRhLiAgV2UgZG9uJ3QgbmVlZCB0byBhZGp1c3QgdGhlIHN5bWJvbCB2YWx1ZSBmb3IgYW4KLSAgIGV4dGVybmFsIHN5bWJvbCBpZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsIHBncCkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLSAgICAgYmZkX3ZtYSAqcGdwOwotewotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiAhIHJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICAqcGdwID0gMDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotICAgIH0KLQotICAqcGdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQpOwotICBpZiAoKnBncCA9PSAwCi0gICAgICAmJiAoISByZWxvY2F0ZWFibGUKLQkgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKSkKLSAgICB7Ci0gICAgICBpZiAocmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIE1ha2UgdXAgYSB2YWx1ZS4gICovCi0JICAqcGdwID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgMHg0MDAwOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JICBhc3ltYm9sICoqc3ltOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGNvdW50ID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0JICBzeW0gPSBiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpOwotCi0JICBpZiAoc3ltID09IChhc3ltYm9sICoqKSBOVUxMKQotCSAgICBpID0gY291bnQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltKyspCi0JCXsKLQkJICByZWdpc3RlciBDT05TVCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpzeW0pOwotCQkgIGlmICgqbmFtZSA9PSAnXycgJiYgc3RyY21wIChuYW1lLCAiX2dwIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgKnBncCA9IGJmZF9hc3ltYm9sX3ZhbHVlICgqc3ltKTsKLQkJICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsICpwZ3ApOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpID49IGNvdW50KQotCSAgICB7Ci0JICAgICAgLyogT25seSBnZXQgdGhlIGVycm9yIG9uY2UuICAqLwotCSAgICAgICpwZ3AgPSA0OwotCSAgICAgIF9iZmRfc2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkLCAqcGdwKTsKLQkgICAgICAqZXJyb3JfbWVzc2FnZSA9Ci0JCShjaGFyICopIF8oIkdQIHJlbGF0aXZlIHJlbG9jYXRpb24gd2hlbiBfZ3Agbm90IGRlZmluZWQiKTsKLQkgICAgICByZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogRG8gYSBSX01JUFNfR1BSRUwxNiByZWxvY2F0aW9uLiAgVGhpcyBpcyBhIDE2IGJpdCB2YWx1ZSB3aGljaCBtdXN0Ci0gICBiZWNvbWUgdGhlIG9mZnNldCBmcm9tIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgZnVuY3Rpb24gYWxzbyBoYW5kbGVzCi0gICBSX01JUFNfTElURVJBTCByZWxvY2F0aW9ucywgYWx0aG91Z2ggdGhvc2UgY2FuIGJlIGhhbmRsZWQgbW9yZQotICAgY2xldmVybHkgYmVjYXVzZSB0aGUgZW50cmllcyBpbiB0aGUgLmxpdDggYW5kIC5saXQ0IHNlY3Rpb25zIGNhbiBiZQotICAgbWVyZ2VkLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBncHJlbDE2X3dpdGhfZ3AgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJCSAgICAgIGFyZWxlbnQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgICAgIGJvb2xlYW4sIFBUUiwgYmZkX3ZtYSkpOwotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLV9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotCi0gIC8qIElmIHdlJ3JlIHJlbG9jYXRpbmcsIGFuZCB0aGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbCB3aXRoIG5vCi0gICAgIGFkZGVuZCwgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgYW55dGhpbmcuICBXZSB3aWxsIG9ubHkgaGF2ZSBhbgotICAgICBhZGRlbmQgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQgcmVsb2MsIG5vdCByZWFkIGZyb20gYW4gRUxGCi0gICAgIGZpbGUuICAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICByZWxvY2F0ZWFibGUgPSB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgcmVsb2NhdGVhYmxlID0gZmFsc2U7Ci0gICAgICBvdXRwdXRfYmZkID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+b3duZXI7Ci0gICAgfQotCi0gIHJldCA9IG1pcHNfZWxmX2ZpbmFsX2dwIChvdXRwdXRfYmZkLCBzeW1ib2wsIHJlbG9jYXRlYWJsZSwgZXJyb3JfbWVzc2FnZSwKLQkJCSAgICZncCk7Ci0gIGlmIChyZXQgIT0gYmZkX3JlbG9jX29rKQotICAgIHJldHVybiByZXQ7Ci0KLSAgcmV0dXJuIGdwcmVsMTZfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgcmVsb2NhdGVhYmxlLCBkYXRhLCBncCk7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWdwcmVsMTZfd2l0aF9ncCAoYWJmZCwgc3ltYm9sLCByZWxvY19lbnRyeSwgaW5wdXRfc2VjdGlvbiwgcmVsb2NhdGVhYmxlLCBkYXRhLAotCQkgZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBncDsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgLyogU2V0IHZhbCB0byB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb3Igc3ltYm9sLiAgKi8KLSAgaWYgKHJlbG9jX2VudHJ5LT5ob3d0by0+c3JjX21hc2sgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNhc2Ugb2NjdXJzIHdpdGggdGhlIDY0LWJpdCBNSVBTIEVMRiBBQkkuICAqLwotICAgICAgdmFsID0gcmVsb2NfZW50cnktPmFkZGVuZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAoKGluc24gJiAweGZmZmYpICsgcmVsb2NfZW50cnktPmFkZGVuZCkgJiAweGZmZmY7Ci0gICAgICBpZiAodmFsICYgMHg4MDAwKQotCXZhbCAtPSAweDEwMDAwOwotICAgIH0KLQotICAvKiBBZGp1c3QgdmFsIGZvciB0aGUgZmluYWwgc2VjdGlvbiBsb2NhdGlvbiBhbmQgR1AgdmFsdWUuICBJZiB3ZQotICAgICBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IKLSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLSAgaWYgKCEgcmVsb2NhdGVhYmxlCi0gICAgICB8fCAoc3ltYm9sLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMCkKLSAgICB2YWwgKz0gcmVsb2NhdGlvbiAtIGdwOwotCi0gIGluc24gPSAoaW5zbiAmfiAweGZmZmYpIHwgKHZhbCAmIDB4ZmZmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIGlmIChyZWxvY2F0ZWFibGUpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAvKiBNYWtlIHN1cmUgaXQgZml0IGluIDE2IGJpdHMuICAqLwotICBpZiAodmFsID49IDB4ODAwMCAmJiB2YWwgPCAweGZmZmY4MDAwKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogRG8gYSBSX01JUFNfR1BSRUwzMiByZWxvY2F0aW9uLiAgSXMgdGhpcyAzMiBiaXQgdmFsdWUgdGhlIG9mZnNldAotICAgZnJvbSB0aGUgZ3AgcmVnaXN0ZXI/IFhYWCAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGdwcmVsMzJfd2l0aF9ncCBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLAotCQkJCQkJICAgICAgYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJICAgICAgYm9vbGVhbiwgUFRSLCBiZmRfdm1hKSk7Ci0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jIChhYmZkLAotCQkJcmVsb2NfZW50cnksCi0JCQlzeW1ib2wsCi0JCQlkYXRhLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIHJlbG9jX2VudHJ5LT5hZGRlbmQgPT0gMCkKLSAgICB7Ci0gICAgICAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopCi0JXygiMzJiaXRzIGdwIHJlbGF0aXZlIHJlbG9jYXRpb24gb2NjdXJzIGZvciBhbiBleHRlcm5hbCBzeW1ib2wiKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IHRydWU7Ci0gICAgICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxvY2F0ZWFibGUgPSBmYWxzZTsKLSAgICAgIG91dHB1dF9iZmQgPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcjsKLQotICAgICAgcmV0ID0gbWlwc19lbGZfZmluYWxfZ3AgKG91dHB1dF9iZmQsIHN5bWJvbCwgcmVsb2NhdGVhYmxlLAotCQkJICAgICAgIGVycm9yX21lc3NhZ2UsICZncCk7Ci0gICAgICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLQlyZXR1cm4gcmV0OwotICAgIH0KLQotICByZXR1cm4gZ3ByZWwzMl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJICByZWxvY2F0ZWFibGUsIGRhdGEsIGdwKTsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZ3ByZWwzMl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLCByZWxvY2F0ZWFibGUsIGRhdGEsCi0JCSBncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIGdwOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgaWYgKHJlbG9jX2VudHJ5LT5hZGRyZXNzID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICBpZiAocmVsb2NfZW50cnktPmhvd3RvLT5zcmNfbWFzayA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FzZSBhcmlzZXMgd2l0aCB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4gICovCi0gICAgICB2YWwgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIC8qIFNldCB2YWwgdG8gdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9yIHN5bWJvbC4gICovCi0gIHZhbCArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIC8qIEFkanVzdCB2YWwgZm9yIHRoZSBmaW5hbCBzZWN0aW9uIGxvY2F0aW9uIGFuZCBHUCB2YWx1ZS4gIElmIHdlCi0gICAgIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIGZvcgotICAgICBhbiBleHRlcm5hbCBzeW1ib2wuICAqLwotICBpZiAoISByZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotICAgIHZhbCArPSByZWxvY2F0aW9uIC0gZ3A7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAocmVsb2NhdGVhYmxlKQotICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIGEgNjQgYml0IHJlbG9jIGluIGEgMzIgYml0IE1JUFMgRUxGIGZpbGUuICBUaGVzZSBhcmUKLSAgIGdlbmVyYXRlZCB3aGVuIGFkZHJlc2VzIGFyZSA2NCBiaXRzLiAgVGhlIHVwcGVyIDMyIGJpdHMgYXJlIGEgc2ltbGUKLSAgIHNpZ24gZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczMyXzY0Yml0X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotICBhcmVsZW50IHJlbG9jMzI7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotICBiZmRfc2l6ZV90eXBlIGFkZHI7Ci0KLSAgciA9IGJmZF9lbGZfZ2VuZXJpY19yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0gIGlmIChyICE9IGJmZF9yZWxvY19jb250aW51ZSkKLSAgICByZXR1cm4gcjsKLQotICAvKiBEbyBhIG5vcm1hbCAzMiBiaXQgcmVsb2NhdGlvbiBvbiB0aGUgbG93ZXIgMzIgYml0cy4gICovCi0gIHJlbG9jMzIgPSAqcmVsb2NfZW50cnk7Ci0gIGlmIChiZmRfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgcmVsb2MzMi5hZGRyZXNzICs9IDQ7Ci0gIHJlbG9jMzIuaG93dG8gPSAmZWxmX21pcHNfaG93dG9fdGFibGVbUl9NSVBTXzMyXTsKLSAgciA9IGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsICZyZWxvYzMyLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSk7Ci0KLSAgLyogU2lnbiBleHRlbmQgaW50byB0aGUgdXBwZXIgMzIgYml0cy4gICovCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2MzMi5hZGRyZXNzKTsKLSAgaWYgKCh2YWwgJiAweDgwMDAwMDAwKSAhPSAwKQotICAgIHZhbCA9IDB4ZmZmZmZmZmY7Ci0gIGVsc2UKLSAgICB2YWwgPSAwOwotICBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgYWRkciArPSA0OwotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIEhhbmRsZSBhIG1pcHMxNiBqdW1wLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczE2X2p1bXBfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIEZJWE1FLiAgKi8KLSAgewotICAgIHN0YXRpYyBib29sZWFuIHdhcm5lZDsKLQotICAgIGlmICghIHdhcm5lZCkKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCJMaW5raW5nIG1pcHMxNiBvYmplY3RzIGludG8gJXMgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQiKSwKLQkgYmZkX2dldF90YXJnZXQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5vd25lcikpOwotICAgIHdhcm5lZCA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLX0KLQotLyogSGFuZGxlIGEgbWlwczE2IEdQIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotbWlwczE2X2dwcmVsX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcmV0OwotICBiZmRfdm1hIGdwOwotICB1bnNpZ25lZCBzaG9ydCBleHRlbmQsIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgZmluYWw7Ci0KLSAgLyogSWYgd2UncmUgcmVsb2NhdGluZywgYW5kIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8KLSAgICAgYWRkZW5kLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSBhbnl0aGluZy4gIFdlIHdpbGwgb25seSBoYXZlIGFuCi0gICAgIGFkZGVuZCBpZiB0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCByZWxvYywgbm90IHJlYWQgZnJvbSBhbiBFTEYKLSAgICAgZmlsZS4gICovCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiByZWxvY19lbnRyeS0+YWRkZW5kID09IDApCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NhdGVhYmxlID0gdHJ1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICAgICAgb3V0cHV0X2JmZCA9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPm93bmVyOwotICAgIH0KLQotICByZXQgPSBtaXBzX2VsZl9maW5hbF9ncCAob3V0cHV0X2JmZCwgc3ltYm9sLCByZWxvY2F0ZWFibGUsIGVycm9yX21lc3NhZ2UsCi0JCQkgICAmZ3ApOwotICBpZiAocmV0ICE9IGJmZF9yZWxvY19vaykKLSAgICByZXR1cm4gcmV0OwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogUGljayB1cCB0aGUgbWlwczE2IGV4dGVuZCBpbnN0cnVjdGlvbiBhbmQgdGhlIHJlYWwgaW5zdHJ1Y3Rpb24uICAqLwotICBleHRlbmQgPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MgKyAyKTsKLQotICAvKiBTdHVmZiB0aGUgY3VycmVudCBhZGRlbmQgYmFjayBhcyBhIDMyIGJpdCB2YWx1ZSwgZG8gdGhlIHVzdWFsCi0gICAgIHJlbG9jYXRpb24sIGFuZCB0aGVuIGNsZWFuIHVwLiAgKi8KLSAgYmZkX3B1dF8zMiAoYWJmZCwKLQkgICAgICAoKChleHRlbmQgJiAweDFmKSA8PCAxMSkKLQkgICAgICAgfCAoZXh0ZW5kICYgMHg3ZTApCi0JICAgICAgIHwgKGluc24gJiAweDFmKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgcmV0ID0gZ3ByZWwxNl93aXRoX2dwIChhYmZkLCBzeW1ib2wsIHJlbG9jX2VudHJ5LCBpbnB1dF9zZWN0aW9uLAotCQkJIHJlbG9jYXRlYWJsZSwgZGF0YSwgZ3ApOwotCi0gIGZpbmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsCi0JICAgICAgKChleHRlbmQgJiAweGY4MDApCi0JICAgICAgIHwgKChmaW5hbCA+PiAxMSkgJiAweDFmKQotCSAgICAgICB8IChmaW5hbCAmIDB4N2UwKSksCi0JICAgICAgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsCi0JICAgICAgKChpbnNuICYgMHhmZmUwKQotCSAgICAgICB8IChmaW5hbCAmIDB4MWYpKSwKLQkgICAgICAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzICsgMik7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmV0dXJuIHRoZSBJU0EgZm9yIGEgTUlQUyBlX2ZsYWdzIHZhbHVlLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWVsZl9taXBzX2lzYSAoZmxhZ3MpCi0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBzd2l0Y2ggKGZsYWdzICYgRUZfTUlQU19BUkNIKQotICAgIHsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzE6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzI6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzM6Ci0gICAgICByZXR1cm4gMzsKLSAgICBjYXNlIEVfTUlQU19BUkNIXzQ6Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0gIHJldHVybiA0OwotfQotCi0vKiBSZXR1cm4gdGhlIE1BQ0ggZm9yIGEgTUlQUyBlX2ZsYWdzIHZhbHVlLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWVsZl9taXBzX21hY2ggKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfTUFDSCkKLSAgICB7Ci0gICAgY2FzZSBFX01JUFNfTUFDSF8zOTAwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHMzOTAwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MDEwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MDEwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MTAwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MTAwOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80MTExOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0MTExOwotCi0gICAgY2FzZSBFX01JUFNfTUFDSF80NjUwOgotICAgICAgcmV0dXJuIGJmZF9tYWNoX21pcHM0NjUwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHN3aXRjaCAoZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBFX01JUFNfQVJDSF8xOgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHMzMDAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfTUlQU19BUkNIXzI6Ci0JICByZXR1cm4gYmZkX21hY2hfbWlwczYwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgRV9NSVBTX0FSQ0hfMzoKLQkgIHJldHVybiBiZmRfbWFjaF9taXBzNDAwMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01JUFNfQVJDSF80OgotCSAgcmV0dXJuIGJmZF9tYWNoX21pcHM4MDAwOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHByaW50YWJsZSBuYW1lIGZvciBBQkkgZnJvbSBmbGFnd29yZC4gKi8KLQotc3RhdGljIElOTElORSBjaGFyKgotZWxmX21pcHNfYWJpX25hbWUgKGZsYWdzKQotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgc3dpdGNoIChmbGFncyAmIEVGX01JUFNfQUJJKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gIm5vbmUiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9PMzI6Ci0gICAgICByZXR1cm4gIk8zMiI7Ci0gICAgY2FzZSBFX01JUFNfQUJJX082NDoKLSAgICAgIHJldHVybiAiTzY0IjsKLSAgICBjYXNlIEVfTUlQU19BQklfRUFCSTMyOgotICAgICAgcmV0dXJuICJFQUJJMzIiOwotICAgIGNhc2UgRV9NSVBTX0FCSV9FQUJJNjQ6Ci0gICAgICByZXR1cm4gIkVBQkk2NCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAidW5rbm93biBhYmkiOwotICAgIH0KLX0KLQotLyogQSBtYXBwaW5nIGZyb20gQkZEIHJlbG9jIHR5cGVzIHRvIE1JUFMgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGVsZl9yZWxvY19tYXAgewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgbWlwc19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfTUlQU19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9NSVBTXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01JUFNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfNjQsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0pNUCwgUl9NSVBTXzI2IH0sCi0gIHsgQkZEX1JFTE9DX0hJMTZfUywgUl9NSVBTX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTE8xNiwgUl9NSVBTX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTCwgUl9NSVBTX0dQUkVMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBSX01JUFNfTElURVJBTCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBSX01JUFNfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUENSRUwsIFJfTUlQU19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBSX01JUFNfQ0FMTDE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR1BSRUwzMiwgUl9NSVBTX0dQUkVMMzIgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiwgUl9NSVBTX0dPVF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIFJfTUlQU19HT1RfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwgUl9NSVBTX0NBTExfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwgUl9NSVBTX0NBTExfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX1NVQiwgUl9NSVBTX1NVQiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFLCBSX01JUFNfR09UX1BBR0UgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfT0ZTVCwgUl9NSVBTX0dPVF9PRlNUIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0RJU1AsIFJfTUlQU19HT1RfRElTUCB9Ci19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyB0eXBlLCByZXR1cm4gYSBob3d0byBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChtaXBzX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtaXBzX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGZfbWlwc19ob3d0b190YWJsZVsoaW50KSBtaXBzX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICAvKiBXZSBuZWVkIHRvIGhhbmRsZSBCRkRfUkVMT0NfQ1RPUiBzcGVjaWFsbHkuCi0JIFNlbGVjdCB0aGUgcmlnaHQgcmVsb2NhdGlvbiAoUl9NSVBTXzMyIG9yIFJfTUlQU182NCkgYmFzZWQgb24gdGhlCi0JIHNpemUgb2YgYWRkcmVzc2VzIG9uIHRoaXMgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgICAgIGlmIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKSA9PSAzMikKLQlyZXR1cm4gJmVsZl9taXBzX2hvd3RvX3RhYmxlWyhpbnQpIFJfTUlQU18zMl07Ci0gICAgICBlbHNlCi0JcmV0dXJuICZlbGZfbWlwc19jdG9yNjRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfSk1QOgotICAgICAgcmV0dXJuICZlbGZfbWlwczE2X2p1bXBfaG93dG87Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMOgotICAgICAgcmV0dXJuICZlbGZfbWlwczE2X2dwcmVsX2hvd3RvOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgICAgcmV0dXJuICZlbGZfbWlwc19nbnVfdnRpbmhlcml0X2hvd3RvOwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIHJldHVybiAmZWxmX21pcHNfZ251X3Z0ZW50cnlfaG93dG87Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhIE1JUFMgRWxmMzJfSW50ZXJuYWxfUmVsLCBmaWxsIGluIGFuIGFyZWxlbnQgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfaW5mb190b19ob3d0b19yZWwgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsICpkc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfTUlQUzE2XzI2OgotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwczE2X2p1bXBfaG93dG87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfTUlQUzE2X0dQUkVMOgotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwczE2X2dwcmVsX2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01JUFNfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmX21pcHNfZ251X3Z0aW5oZXJpdF9ob3d0bzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwc19nbnVfdnRlbnRyeV9ob3d0bzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19tYXgpOwotICAgICAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGZfbWlwc19ob3d0b190YWJsZVtyX3R5cGVdOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFRoZSBhZGRlbmQgZm9yIGEgR1BSRUwxNiBvciBMSVRFUkFMIHJlbG9jYXRpb24gY29tZXMgZnJvbSB0aGUgR1AKLSAgICAgdmFsdWUgZm9yIHRoZSBvYmplY3QgZmlsZS4gIFdlIGdldCB0aGUgYWRkZW5kIG5vdywgcmF0aGVyIHRoYW4KLSAgICAgd2hlbiB3ZSBkbyB0aGUgcmVsb2NhdGlvbiwgYmVjYXVzZSB0aGUgc3ltYm9sIG1hbmlwdWxhdGlvbnMgZG9uZQotICAgICBieSB0aGUgbGlua2VyIG1heSBjYXVzZSB1cyB0byBsb3NlIHRyYWNrIG9mIHRoZSBpbnB1dCBCRkQuICAqLwotICBpZiAoKCgqY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0gICAgICAmJiAocl90eXBlID09ICh1bnNpZ25lZCBpbnQpIFJfTUlQU19HUFJFTDE2Ci0JICB8fCByX3R5cGUgPT0gKHVuc2lnbmVkIGludCkgUl9NSVBTX0xJVEVSQUwpKQotICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gZWxmX2dwIChhYmZkKTsKLX0KLQotLyogR2l2ZW4gYSBNSVBTIEVsZjMyX0ludGVybmFsX1JlbGEsIGZpbGwgaW4gYW4gYXJlbGVudCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pbmZvX3RvX2hvd3RvX3JlbGEgKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICAvKiBTaW5jZSBhbiBFbGYzMl9JbnRlcm5hbF9SZWwgaXMgYW4gaW5pdGlhbCBwcmVmaXggb2YgYW4KLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSwgd2UgY2FuIGp1c3QgdXNlIG1pcHNfaW5mb190b19ob3d0b19yZWwKLSAgICAgYWJvdmUuICAqLwotICBtaXBzX2luZm9fdG9faG93dG9fcmVsIChhYmZkLCBjYWNoZV9wdHIsIChFbGYzMl9JbnRlcm5hbF9SZWwgKikgZHN0KTsKLQotICAvKiBJZiB3ZSBldmVyIG5lZWQgdG8gZG8gYW55IGV4dHJhIHByb2Nlc3Npbmcgd2l0aCBkc3QtPnJfYWRkZW5kCi0gICAgICh0aGUgZmllbGQgb21pdHRlZCBpbiBhbiBFbGYzMl9JbnRlcm5hbF9SZWwpIHdlIGNhbiBkbyBpdCBoZXJlLiAgKi8KLX0KLQwKLS8qIEEgLnJlZ2luZm8gc2VjdGlvbiBob2xkcyBhIHNpbmdsZSBFbGYzMl9SZWdJbmZvIHN0cnVjdHVyZS4gIFRoZXNlCi0gICByb3V0aW5lcyBzd2FwIHRoaXMgc3RydWN0dXJlIGluIGFuZCBvdXQuICBUaGV5IGFyZSB1c2VkIG91dHNpZGUgb2YKLSAgIEJGRCwgc28gdGhleSBhcmUgZ2xvYmFsbHkgdmlzaWJsZS4gICovCi0KLXZvaWQKLWJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmV4OwotICAgICBFbGYzMl9SZWdJbmZvICppbjsKLXsKLSAgaW4tPnJpX2dwcm1hc2sgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7Ci0gIGluLT5yaV9jcHJtYXNrWzBdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMF0pOwotICBpbi0+cmlfY3BybWFza1sxXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzFdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMl0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1syXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzNdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbM10pOwotICBpbi0+cmlfZ3BfdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BfdmFsdWUpOwotfQotCi12b2lkCi1iZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfUmVnSW5mbyAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmV4OwotewotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfZ3BybWFzaywKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9ncHJtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMF0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzFdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1syXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbM10sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncF92YWx1ZSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLS8qIEluIHRoZSA2NCBiaXQgQUJJLCB0aGUgLk1JUFMub3B0aW9ucyBzZWN0aW9uIGhvbGRzIHJlZ2lzdGVyCi0gICBpbmZvcm1hdGlvbiBpbiBhbiBFbGY2NF9SZWdpbmZvIHN0cnVjdHVyZS4gIFRoZXNlIHJvdXRpbmVzIHN3YXAKLSAgIHRoZW0gaW4gYW5kIG91dC4gIFRoZXkgYXJlIGdsb2JhbGx5IHZpc2libGUgYmVjYXVzZSB0aGV5IGFyZSB1c2VkCi0gICBvdXRzaWRlIG9mIEJGRC4gIFRoZXNlIHJvdXRpbmVzIGFyZSBoZXJlIHNvIHRoYXQgZ2FzIGNhbiBjYWxsIHRoZW0KLSAgIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgd2hldGhlciB0aGUgNjQgYml0IEFCSSBoYXMgYmVlbiBpbmNsdWRlZC4gICovCi0KLXZvaWQKLWJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKmV4OwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICppbjsKLXsKLSAgaW4tPnJpX2dwcm1hc2sgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfZ3BybWFzayk7Ci0gIGluLT5yaV9wYWQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfcGFkKTsKLSAgaW4tPnJpX2Nwcm1hc2tbMF0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1swXSk7Ci0gIGluLT5yaV9jcHJtYXNrWzFdID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMV0pOwotICBpbi0+cmlfY3BybWFza1syXSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzJdKTsKLSAgaW4tPnJpX2Nwcm1hc2tbM10gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1szXSk7Ci0gIGluLT5yaV9ncF92YWx1ZSA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIGV4LT5yaV9ncF92YWx1ZSk7Ci19Ci0KLXZvaWQKLWJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvICppbjsKLSAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9ncHJtYXNrLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2dwcm1hc2spOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfcGFkLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX3BhZCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzBdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbMF0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfY3BybWFza1sxXSwKLQkJKGJmZF9ieXRlICopIGV4LT5yaV9jcHJtYXNrWzFdKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJpX2Nwcm1hc2tbMl0sCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfY3BybWFza1syXSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5yaV9jcHJtYXNrWzNdLAotCQkoYmZkX2J5dGUgKikgZXgtPnJpX2Nwcm1hc2tbM10pOwotICBiZmRfaF9wdXRfNjQgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmlfZ3BfdmFsdWUsCi0JCShiZmRfYnl0ZSAqKSBleC0+cmlfZ3BfdmFsdWUpOwotfQotCi0vKiBTd2FwIGFuIGVudHJ5IGluIGEgLmdwdGFiIHNlY3Rpb24uICBOb3RlIHRoYXQgdGhlc2Ugcm91dGluZXMgcmVseQotICAgb24gdGhlIGVxdWl2YWxlbmNlIG9mIHRoZSB0d28gZWxlbWVudHMgb2YgdGhlIHVuaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfaW4gKGFiZmQsIGV4LCBpbikKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9FeHRlcm5hbF9ncHRhYiAqZXg7Ci0gICAgIEVsZjMyX2dwdGFiICppbjsKLXsKLSAgaW4tPmd0X2VudHJ5Lmd0X2dfdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5ndF9lbnRyeS5ndF9nX3ZhbHVlKTsKLSAgaW4tPmd0X2VudHJ5Lmd0X2J5dGVzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleC0+Z3RfZW50cnkuZ3RfYnl0ZXMpOwotfQotCi1zdGF0aWMgdm9pZAotYmZkX21pcHNfZWxmMzJfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIGluLCBleCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGYzMl9ncHRhYiAqaW47Ci0gICAgIEVsZjMyX0V4dGVybmFsX2dwdGFiICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmd0X2VudHJ5Lmd0X2dfdmFsdWUsCi0JCWV4LT5ndF9lbnRyeS5ndF9nX3ZhbHVlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmd0X2VudHJ5Lmd0X2J5dGVzLAotCQlleC0+Z3RfZW50cnkuZ3RfYnl0ZXMpOwotfQotCi1zdGF0aWMgdm9pZAotYmZkX2VsZjMyX3N3YXBfY29tcGFjdF9yZWxfb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfY29tcGFjdF9yZWwgKmluOwotICAgICBFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCAqZXg7Ci17Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5pZDEsIGV4LT5pZDEpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+bnVtLCBleC0+bnVtKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPmlkMiwgZXgtPmlkMik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5vZmZzZXQsIGV4LT5vZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBpbi0+cmVzZXJ2ZWQwLCBleC0+cmVzZXJ2ZWQwKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnJlc2VydmVkMSwgZXgtPnJlc2VydmVkMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZWxmMzJfc3dhcF9jcmluZm9fb3V0IChhYmZkLCBpbiwgZXgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmMzJfY3JpbmZvICppbjsKLSAgICAgRWxmMzJfRXh0ZXJuYWxfY3JpbmZvICpleDsKLXsKLSAgdW5zaWduZWQgbG9uZyBsOwotCi0gIGwgPSAoKChpbi0+Y3R5cGUgJiBDUklORk9fQ1RZUEUpIDw8IENSSU5GT19DVFlQRV9TSCkKLSAgICAgICB8ICgoaW4tPnJ0eXBlICYgQ1JJTkZPX1JUWVBFKSA8PCBDUklORk9fUlRZUEVfU0gpCi0gICAgICAgfCAoKGluLT5kaXN0MnRvICYgQ1JJTkZPX0RJU1QyVE8pIDw8IENSSU5GT19ESVNUMlRPX1NIKQotICAgICAgIHwgKChpbi0+cmVsdmFkZHIgJiBDUklORk9fUkVMVkFERFIpIDw8IENSSU5GT19SRUxWQUREUl9TSCkpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBsLCBleC0+aW5mbyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGluLT5rb25zdCwgZXgtPmtvbnN0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgaW4tPnZhZGRyLCBleC0+dmFkZHIpOwotfQotCi0vKiBTd2FwIGluIGFuIG9wdGlvbnMgaGVhZGVyLiAgKi8KLQotdm9pZAotYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9PcHRpb25zICpleDsKLSAgICAgRWxmX0ludGVybmFsX09wdGlvbnMgKmluOwotewotICBpbi0+a2luZCA9IGJmZF9oX2dldF84IChhYmZkLCBleC0+a2luZCk7Ci0gIGluLT5zaXplID0gYmZkX2hfZ2V0XzggKGFiZmQsIGV4LT5zaXplKTsKLSAgaW4tPnNlY3Rpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGV4LT5zZWN0aW9uKTsKLSAgaW4tPmluZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5pbmZvKTsKLX0KLQotLyogU3dhcCBvdXQgYW4gb3B0aW9ucyBoZWFkZXIuICAqLwotCi12b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9PcHRpb25zICppbjsKLSAgICAgRWxmX0V4dGVybmFsX09wdGlvbnMgKmV4OwotewotICBiZmRfaF9wdXRfOCAoYWJmZCwgaW4tPmtpbmQsIGV4LT5raW5kKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIGluLT5zaXplLCBleC0+c2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnNlY3Rpb24sIGV4LT5zZWN0aW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+aW5mbywgZXgtPmluZm8pOwotfQotCi0vKiBTd2FwIGluIGFuIE1TWU0gZW50cnkuICAqLwotCi1zdGF0aWMgdm9pZAotYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9pbiAoYWJmZCwgZXgsIGluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX0V4dGVybmFsX01zeW0gKmV4OwotICAgICBFbGYzMl9JbnRlcm5hbF9Nc3ltICppbjsKLXsKLSAgaW4tPm1zX2hhc2hfdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5tc19oYXNoX3ZhbHVlKTsKLSAgaW4tPm1zX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGV4LT5tc19pbmZvKTsKLX0KLQotLyogU3dhcCBvdXQgYW4gTVNZTSBlbnRyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1iZmRfbWlwc19lbGZfc3dhcF9tc3ltX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZjMyX0ludGVybmFsX01zeW0gKmluOwotICAgICBFbGYzMl9FeHRlcm5hbF9Nc3ltICpleDsKLXsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+bXNfaGFzaF92YWx1ZSwgZXgtPm1zX2hhc2hfdmFsdWUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT5tc19pbmZvLCBleC0+bXNfaW5mbyk7Ci19Ci0KLQwKLS8qIERldGVybWluZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGdsb2JhbCBmb3IgdGhlIHB1cnBvc2VzIG9mIHNwbGl0dGluZwotICAgdGhlIHN5bWJvbCB0YWJsZSBpbnRvIGdsb2JhbCBzeW1ib2xzIGFuZCBsb2NhbCBzeW1ib2xzLiAgQXQgbGVhc3QKLSAgIG9uIElyaXggNSwgdGhpcyBzcGxpdCBtdXN0IGJlIGJldHdlZW4gc2VjdGlvbiBzeW1ib2xzIGFuZCBhbGwgb3RoZXIKLSAgIHN5bWJvbHMuICBPbiBtb3N0IEVMRiB0YXJnZXRzIHRoZSBzcGxpdCBpcyBiZXR3ZWVuIHN0YXRpYyBzeW1ib2xzCi0gICBhbmQgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9zeW1faXNfZ2xvYmFsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICByZXR1cm4gKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAgPyB0cnVlIDogZmFsc2U7Ci19Ci0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhIE1JUFMgRUxGIGZpbGUuICBUaGlzIGlzIHVzZWQgZm9yCi0gICBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9taXBzLAotCQkJICAgICBlbGZfbWlwc19tYWNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlciBmb3IgYSAzMi1iaXQgTUlQUyBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZjMyX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIElyaXggNSBpcyBicm9rZW4uICBPYmplY3QgZmlsZSBzeW1ib2wgdGFibGVzIGFyZSBub3QgYWx3YXlzCi0gICAgIHNvcnRlZCBjb3JyZWN0bHkgc3VjaCB0aGF0IGxvY2FsIHN5bWJvbHMgcHJlY2VkZSBnbG9iYWwgc3ltYm9scywKLSAgICAgYW5kIHRoZSBzaF9pbmZvIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgaXMgbm90IGFsd2F5cyByaWdodC4gICovCi0gIGVsZl9iYWRfc3ltdGFiIChhYmZkKSA9IHRydWU7Ci0KLSAgcmV0dXJuIF9iZmRfbWlwc19lbGZfb2JqZWN0X3AgKGFiZmQpOwotfQotCi0vKiBUaGUgZmluYWwgcHJvY2Vzc2luZyBkb25lIGp1c3QgYmVmb3JlIHdyaXRpbmcgb3V0IGEgTUlQUyBFTEYgb2JqZWN0Ci0gICBmaWxlLiAgVGhpcyBnZXRzIHRoZSBNSVBTIGFyY2hpdGVjdHVyZSByaWdodCBiYXNlZCBvbiB0aGUgbWFjaGluZQotICAgbnVtYmVyLiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLV9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyAoYWJmZCwgbGlua2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gbGlua2VyOwotewotICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICoqaGRycHA7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGFzZWN0aW9uICpzZWM7Ci0KLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbWlwczMwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8xOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHMzOTAwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMSB8IEVfTUlQU19NQUNIXzM5MDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczYwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDEwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczQxMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF8zIHwgRV9NSVBTX01BQ0hfNDEwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF9taXBzNDExMToKLSAgICAgIHZhbCA9IEVfTUlQU19BUkNIXzMgfCBFX01JUFNfTUFDSF80MTExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjUwOgotICAgICAgdmFsID0gRV9NSVBTX0FSQ0hfMyB8IEVfTUlQU19NQUNIXzQ2NTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0gICAgICB2YWwgPSBFX01JUFNfQVJDSF80OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IHZhbDsKLQotICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgZm9yIC5ncHRhYiBzZWN0aW9ucyBhbmQgb3RoZXIgYXBwcm9wcmlhdGUKLSAgICAgaW5mbyBmb3IgZWFjaCBzcGVjaWFsIHNlY3Rpb24uICAqLwotICBmb3IgKGkgPSAxLCBoZHJwcCA9IGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgKyAxOwotICAgICAgIGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsKLSAgICAgICBpKyssIGhkcnBwKyspCi0gICAgewotICAgICAgc3dpdGNoICgoKmhkcnBwKS0+c2hfdHlwZSkKLQl7Ci0JY2FzZSBTSFRfTUlQU19NU1lNOgotCWNhc2UgU0hUX01JUFNfTElCTElTVDoKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOwotCSAgaWYgKHNlYyAhPSBOVUxMKQotCSAgICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX0dQVEFCOgotCSAgQkZEX0FTU0VSVCAoKCpoZHJwcCktPmJmZF9zZWN0aW9uICE9IE5VTEwpOwotCSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCAoKmhkcnBwKS0+YmZkX3NlY3Rpb24pOwotCSAgQkZEX0FTU0VSVCAobmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApOwotCSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxKTsKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9pbmZvID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX01JUFNfQ09OVEVOVDoKLQkgIEJGRF9BU1NFUlQgKCgqaGRycHApLT5iZmRfc2VjdGlvbiAhPSBOVUxMKTsKLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgKCpoZHJwcCktPmJmZF9zZWN0aW9uKTsKLQkgIEJGRF9BU1NFUlQgKG5hbWUgIT0gTlVMTAotCQkgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLk1JUFMuY29udGVudCIsCi0JCQkJICBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSkgPT0gMCk7Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJIG5hbWUgKyBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSk7Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gTlVMTCk7Ci0JICAoKmhkcnBwKS0+c2hfbGluayA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaWR4OwotCSAgYnJlYWs7Ci0KLQljYXNlIFNIVF9NSVBTX1NZTUJPTF9MSUI6Ci0JICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5zeW0iKTsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgKCpoZHJwcCktPnNoX2xpbmsgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpYmxpc3QiKTsKLQkgIGlmIChzZWMgIT0gTlVMTCkKLQkgICAgKCpoZHJwcCktPnNoX2luZm8gPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2lkeDsKLQkgIGJyZWFrOwotCi0JY2FzZSBTSFRfTUlQU19FVkVOVFM6Ci0JICBCRkRfQVNTRVJUICgoKmhkcnBwKS0+YmZkX3NlY3Rpb24gIT0gTlVMTCk7Ci0JICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsICgqaGRycHApLT5iZmRfc2VjdGlvbik7Ci0JICBCRkRfQVNTRVJUIChuYW1lICE9IE5VTEwpOwotCSAgaWYgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5ldmVudHMiLCBzaXplb2YgIi5NSVBTLmV2ZW50cyIgLSAxKSA9PSAwKQotCSAgICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJICAgbmFtZSArIHNpemVvZiAiLk1JUFMuZXZlbnRzIiAtIDEpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5NSVBTLnBvc3RfcmVsIiwKLQkJCQkgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpID09IDApOwotCSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLAotCQkJCQkgICAgIChuYW1lCi0JCQkJCSAgICAgICsgc2l6ZW9mICIuTUlQUy5wb3N0X3JlbCIgLSAxKSk7Ci0JICAgIH0KLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSBOVUxMKTsKLQkgICgqaGRycHApLT5zaF9saW5rID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19pZHg7Ci0JICBicmVhazsKLQotCX0KLSAgICB9Ci19Ci0MCi0vKiBGdW5jdGlvbiB0byBrZWVwIE1JUFMgc3BlY2lmaWMgZmlsZSBmbGFncyBsaWtlIGFzIEVGX01JUFNfUElDLiAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSAgQkZEX0FTU0VSVCAoIWVsZl9mbGFnc19pbml0IChhYmZkKQotCSAgICAgIHx8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID09IGZsYWdzKTsKLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9IGZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBvbmUgb2JqZWN0IG1vZHVsZSB0byBhbm90aGVyICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKLQkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOwotCi0gIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSAgZmxhZ3dvcmQgb2xkX2ZsYWdzOwotICBmbGFnd29yZCBuZXdfZmxhZ3M7Ci0gIGJvb2xlYW4gb2s7Ci0KLSAgLyogQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgc2FtZSBlbmRpYW5lc3MgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBvYmZkLT54dmVjLT5ieXRlb3JkZXIKLSAgICAgICYmIG9iZmQtPnh2ZWMtPmJ5dGVvcmRlciAhPSBCRkRfRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbXNnOwotCi0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGliZmQpKQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4iKTsKLSAgICAgIGVsc2UKLQltc2cgPSBfKCIlczogY29tcGlsZWQgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBiaWcgZW5kaWFuIik7Ci0KLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAobXNnLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0gICAgICB8fCBiZmRfZ2V0X2ZsYXZvdXIgKG9iZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmV3X2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IG5ld19mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSOwotICBvbGRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotCi0gICAgICBpZiAoYmZkX2dldF9hcmNoIChvYmZkKSA9PSBiZmRfZ2V0X2FyY2ggKGliZmQpCi0JICAmJiBiZmRfZ2V0X2FyY2hfaW5mbyAob2JmZCktPnRoZV9kZWZhdWx0KQotCXsKLQkgIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJCSAgIGJmZF9nZXRfbWFjaCAoaWJmZCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgZmxhZyBjb21wYXRpYmlsaXR5LiAgKi8KLQotICBuZXdfZmxhZ3MgJj0gfkVGX01JUFNfTk9SRU9SREVSOwotICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfTk9SRU9SREVSOwotCi0gIGlmIChuZXdfZmxhZ3MgPT0gb2xkX2ZsYWdzKQotICAgIHJldHVybiB0cnVlOwotCi0gIG9rID0gdHJ1ZTsKLQotICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfUElDKSAhPSAob2xkX2ZsYWdzICYgRUZfTUlQU19QSUMpKQotICAgIHsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19QSUM7Ci0gICAgICBvbGRfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIFBJQyBmaWxlcyB3aXRoIG5vbi1QSUMgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpICE9IChvbGRfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpKQotICAgIHsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfTUlQU19DUElDOwotICAgICAgb2xkX2ZsYWdzICY9IH5FRl9NSVBTX0NQSUM7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGxpbmtpbmcgYWJpY2FsbHMgZmlsZXMgd2l0aCBub24tYWJpY2FsbHMgZmlsZXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgICAgb2sgPSBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQ29tcGFyZSB0aGUgSVNBJ3MuICovCi0gIGlmICgobmV3X2ZsYWdzICYgKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCkpCi0gICAgICAhPSAob2xkX2ZsYWdzICYgKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCkpKQotICAgIHsKLSAgICAgIGludCBuZXdfbWFjaCA9IG5ld19mbGFncyAmIEVGX01JUFNfTUFDSDsKLSAgICAgIGludCBvbGRfbWFjaCA9IG9sZF9mbGFncyAmIEVGX01JUFNfTUFDSDsKLSAgICAgIGludCBuZXdfaXNhID0gZWxmX21pcHNfaXNhIChuZXdfZmxhZ3MpOwotICAgICAgaW50IG9sZF9pc2EgPSBlbGZfbWlwc19pc2EgKG9sZF9mbGFncyk7Ci0KLSAgICAgIC8qIElmIGVpdGhlciBoYXMgbm8gbWFjaGluZSBzcGVjaWZpZWQsIGp1c3QgY29tcGFyZSB0aGUgZ2VuZXJhbCBpc2Ency4KLQkgU29tZSBjb21iaW5hdGlvbnMgb2YgbWFjaGluZXMgYXJlIG9rLCBpZiB0aGUgaXNhJ3MgbWF0Y2guICovCi0gICAgICBpZiAoISBuZXdfbWFjaCAKLQkgIHx8ICEgb2xkX21hY2gKLQkgIHx8IG5ld19tYWNoID09IG9sZF9tYWNoCi0JICApCi0JewotCSAgLyogRG9uJ3Qgd2FybiBhYm91dCBtaXhpbmcgLW1pcHMxIGFuZCAtbWlwczIgY29kZSwgb3IgbWl4aW5nIC1taXBzMwotCSAgICAgYW5kIC1taXBzNCBjb2RlLiAgVGhleSB3aWxsIG5vcm1hbGx5IHVzZSB0aGUgc2FtZSBkYXRhIHNpemVzIGFuZAotCSAgICAgY2FsbGluZyBjb252ZW50aW9ucy4gICovCi0KLQkgIGlmICgobmV3X2lzYSA9PSAxIHx8IG5ld19pc2EgPT0gMikKLQkgICAgICA/IChvbGRfaXNhICE9IDEgJiYgb2xkX2lzYSAhPSAyKQotCSAgICAgIDogKG9sZF9pc2EgPT0gMSB8fCBvbGRfaXNhID09IDIpKQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgIChfKCIlczogSVNBIG1pc21hdGNoICgtbWlwcyVkKSB3aXRoIHByZXZpb3VzIG1vZHVsZXMgKC1taXBzJWQpIiksCi0JCWJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCBuZXdfaXNhLCBvbGRfaXNhKTsKLQkgICAgICBvayA9IGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogSVNBIG1pc21hdGNoICglZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICglZCkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLAotCSAgICAgZWxmX21pcHNfbWFjaCAobmV3X2ZsYWdzKSwKLQkgICAgIGVsZl9taXBzX21hY2ggKG9sZF9mbGFncykpOwotCSAgb2sgPSBmYWxzZTsKLQl9Ci0KLSAgICAgIG5ld19mbGFncyAmPSB+IChFRl9NSVBTX0FSQ0ggfCBFRl9NSVBTX01BQ0gpOwotICAgICAgb2xkX2ZsYWdzICY9IH4gKEVGX01JUFNfQVJDSCB8IEVGX01JUFNfTUFDSCk7Ci0gICAgfQotCi0gIC8qIENvbXBhcmUgQUJJJ3MgKi8KLSAgaWYgKChuZXdfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgIT0gKG9sZF9mbGFncyAmIEVGX01JUFNfQUJJKSkKLSAgICB7Ci0gICAgICAvKiBPbmx5IGVycm9yIGlmIGJvdGggYXJlIHNldCAodG8gZGlmZmVyZW50IHZhbHVlcykuICovCi0gICAgICBpZiAoKG5ld19mbGFncyAmIEVGX01JUFNfQUJJKQotCSAgJiYgKG9sZF9mbGFncyAmIEVGX01JUFNfQUJJKSkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBBQkkgbWlzbWF0Y2g6IGxpbmtpbmcgJXMgbW9kdWxlIHdpdGggcHJldmlvdXMgJXMgbW9kdWxlcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JICAgICBlbGZfbWlwc19hYmlfbmFtZSAobmV3X2ZsYWdzKSwKLQkgICAgIGVsZl9taXBzX2FiaV9uYW1lIChvbGRfZmxhZ3MpKTsKLQkgIG9rID0gZmFsc2U7Ci0JfQotICAgICAgbmV3X2ZsYWdzICY9IH5FRl9NSVBTX0FCSTsKLSAgICAgIG9sZF9mbGFncyAmPSB+RUZfTUlQU19BQkk7Ci0gICAgfQotCi0gIC8qIFdhcm4gYWJvdXQgYW55IG90aGVyIG1pc21hdGNoZXMgKi8KLSAgaWYgKG5ld19mbGFncyAhPSBvbGRfZmxhZ3MpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAodW5zaWduZWQgbG9uZykgbmV3X2ZsYWdzLAotCSAodW5zaWduZWQgbG9uZykgb2xkX2ZsYWdzKTsKLSAgICAgIG9rID0gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIG9rKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1fYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgcHRyOwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgcHRyOwotCi0gIEJGRF9BU1NFUlQgKGFiZmQgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCk7Ci0KLSAgLyogUHJpbnQgbm9ybWFsIEVMRiBwcml2YXRlIGRhdGEuICAqLwotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBwdHIpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8gKCJwcml2YXRlIGZsYWdzID0gJWx4OiIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0KLSAgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX08zMikKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9TzMyXSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpID09IEVfTUlQU19BQklfTzY0KQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaT1PNjRdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FCSSkgPT0gRV9NSVBTX0FCSV9FQUJJMzIpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbYWJpPUVBQkkzMl0iKSk7Ci0gIGVsc2UgaWYgKChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfQUJJKSA9PSBFX01JUFNfQUJJX0VBQkk2NCkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9RUFCSTY0XSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkpKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW2FiaSB1bmtub3duXSIpKTsKLSAgZWxzZSBpZiAoKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19BQkkyKSkKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFthYmk9TjMyXSIpKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgW25vIGFiaSBzZXRdIikpOwotCi0gIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzEpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbWlwczFdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzIpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbWlwczJdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzMpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbWlwczNdIikpOwotICBlbHNlIGlmICgoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzQpCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbbWlwczRdIikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZmlsZSwgXyAoIiBbdW5rbm93biBJU0FdIikpOwotCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX01JUFNfMzJCSVRNT0RFKQotICAgIGZwcmludGYgKGZpbGUsIF8gKCIgWzMyYml0bW9kZV0iKSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChmaWxlLCBfICgiIFtub3QgMzJiaXRtb2RlXSIpKTsKLQotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBIYW5kbGUgYSBNSVBTIHNwZWNpZmljIHNlY3Rpb24gd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgVGhpcwotICAgaXMgY2FsbGVkIHdoZW4gZWxmY29kZS5oIGZpbmRzIGEgc2VjdGlvbiB3aXRoIGFuIHVua25vd24gdHlwZS4KLSAgIFRoaXMgcm91dGluZSBzdXBwb3J0cyBib3RoIHRoZSAzMi1iaXQgYW5kIDY0LWJpdCBFTEYgQUJJLgotCi0gICBGSVhNRTogV2UgbmVlZCB0byBoYW5kbGUgdGhlIFNIRl9NSVBTX0dQUkVMIGZsYWcsIGJ1dCBJJ20gbm90IHN1cmUKLSAgIGhvdyB0by4gICovCi0KLWJvb2xlYW4KLV9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBmbGFnd29yZCBmbGFncyA9IDA7Ci0KLSAgLyogVGhlcmUgb3VnaHQgdG8gYmUgYSBwbGFjZSB0byBrZWVwIEVMRiBiYWNrZW5kIHNwZWNpZmljIGZsYWdzLCBidXQKLSAgICAgYXQgdGhlIG1vbWVudCB0aGVyZSBpc24ndCBvbmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIHNlY3Rpb25zIGJ5IHRoZWlyIG5hbWUsIGluc3RlYWQuICBGb3J0dW5hdGVseSwgdGhlIEFCSSBnaXZlcwotICAgICBzdWdnZXN0ZWQgbmFtZXMgZm9yIGFsbCB0aGUgTUlQUyBzcGVjaWZpYyBzZWN0aW9ucywgc28gd2Ugd2lsbAotICAgICBwcm9iYWJseSBnZXQgYXdheSB3aXRoIHRoaXMuICAqLwotICBzd2l0Y2ggKGhkci0+c2hfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTSFRfTUlQU19MSUJMSVNUOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5saWJsaXN0IikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX01TWU06Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19DT05GTElDVDoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuY29uZmxpY3QiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfR1BUQUI6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5ncHRhYi4iLCBzaXplb2YgIi5ncHRhYi4iIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX1VDT0RFOgotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi51Y29kZSIpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUJVRzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IFNFQ19ERUJVR0dJTkc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX1JFR0lORk86Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSAhPSAwCi0JICB8fCBoZHItPnNoX3NpemUgIT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IChTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19JRkFDRToKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5pbnRlcmZhY2VzIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX0NPTlRFTlQ6Ci0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5NSVBTLmNvbnRlbnQiLCBzaXplb2YgIi5NSVBTLmNvbnRlbnQiIC0gMSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNIVF9NSVBTX09QVElPTlM6Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSFRfTUlQU19EV0FSRjoKLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIHNpemVvZiAiLmRlYnVnXyIgLSAxKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfU1lNQk9MX0xJQjoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5zeW1saWIiKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hUX01JUFNfRVZFTlRTOgotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5ldmVudHMiLCBzaXplb2YgIi5NSVBTLmV2ZW50cyIgLSAxKSAhPSAwCi0JICAmJiBzdHJuY21wIChuYW1lLCAiLk1JUFMucG9zdF9yZWwiLAotCQkgICAgICBzaXplb2YgIi5NSVBTLnBvc3RfcmVsIiAtIDEpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGZsYWdzKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgaGRyLT5iZmRfc2VjdGlvbiwKLQkJCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCQkJCSAgIGhkci0+YmZkX3NlY3Rpb24pCi0JCQkJICAgIHwgZmxhZ3MpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYSAzMi1iaXQgTUlQUyBFTEYgc3BlY2lmaWMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZjMyX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKCEgX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRklYTUU6IFdlIHNob3VsZCByZWNvcmQgc2hfaW5mbyBmb3IgYSAuZ3B0YWIgc2VjdGlvbi4gICovCi0KLSAgLyogRm9yIGEgLnJlZ2luZm8gc2VjdGlvbiwgc2V0IHRoZSBncCB2YWx1ZSBpbiB0aGUgdGRhdGEgaW5mb3JtYXRpb24KLSAgICAgZnJvbSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgV2UgbmVlZCB0aGUgZ3AgdmFsdWUgd2hpbGUKLSAgICAgcHJvY2Vzc2luZyByZWxvY3MsIHNvIHdlIGp1c3QgZ2V0IGl0IG5vdy4gIFRoZSAucmVnaW5mbyBzZWN0aW9uCi0gICAgIGlzIG5vdCB1c2VkIGluIHRoZSA2NC1iaXQgTUlQUyBFTEYgQUJJLiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19SRUdJTkZPKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gZXh0OwotICAgICAgRWxmMzJfUmVnSW5mbyBzOwotCi0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sIChQVFIpICZleHQsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZXh0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4gKGFiZmQsICZleHQsICZzKTsKLSAgICAgIGVsZl9ncCAoYWJmZCkgPSBzLnJpX2dwX3ZhbHVlOwotICAgIH0KLQotICAvKiBGb3IgYSBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb24sIGxvb2sgZm9yIGEgT0RLX1JFR0lORk8gZW50cnksIGFuZAotICAgICBzZXQgdGhlIGdwIHZhbHVlIGJhc2VkIG9uIHdoYXQgd2UgZmluZC4gIFdlIG1heSBzZWUgYm90aAotICAgICBTSFRfTUlQU19SRUdJTkZPIGFuZCBTSFRfTUlQU19PUFRJT05TL09ES19SRUdJTkZPOyBpbiB0aGF0IGNhc2UsCi0gICAgIHRoZXkgc2hvdWxkIGFncmVlLiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChoZHItPnNoX3NpemUpOwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLCBjb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIGhkci0+c2hfc2l6ZSkpCi0JewotCSAgZnJlZSAoY29udGVudHMpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChpbnRvcHQua2luZCA9PSBPREtfUkVHSU5GTykKLQkgICAgewotCSAgICAgIEVsZjMyX1JlZ0luZm8gaW50cmVnOwotCi0JICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX2luCi0JCShhYmZkLAotCQkgKChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopCi0JCSAgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSkpLAotCQkgJmludHJlZyk7Ci0JICAgICAgZWxmX2dwIChhYmZkKSA9IGludHJlZy5yaV9ncF92YWx1ZTsKLQkgICAgfQotCSAgbCArPSBpbnRvcHQuc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChjb250ZW50cyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvcnJlY3QgdHlwZSBmb3IgYSBNSVBTIEVMRiBzZWN0aW9uLiAgV2UgZG8gdGhpcyBieSB0aGUKLSAgIHNlY3Rpb24gbmFtZSwgd2hpY2ggaXMgYSBoYWNrLCBidXQgb3VnaHQgdG8gd29yay4gIFRoaXMgcm91dGluZSBpcwotICAgdXNlZCBieSBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9mYWtlX3NlY3Rpb25zIChhYmZkLCBoZHIsIHNlYykKLSAgICAgYmZkICphYmZkOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIubGlibGlzdCIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfTElCTElTVDsKLSAgICAgIGhkci0+c2hfaW5mbyA9IHNlYy0+X3Jhd19zaXplIC8gc2l6ZW9mIChFbGYzMl9MaWIpOwotICAgICAgLyogVGhlIHNoX2xpbmsgZmllbGQgaXMgc2V0IGluIGZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcuICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfTVNZTTsKLSAgICAgIGhkci0+c2hfZW50c2l6ZSA9IDg7Ci0gICAgICAvKiBGSVhNRTogU2V0IHRoZSBzaF9pbmZvIGZpZWxkLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5jb25mbGljdCIpID09IDApCi0gICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfQ09ORkxJQ1Q7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfR1BUQUI7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKTsKLSAgICAgIC8qIFRoZSBzaF9pbmZvIGZpZWxkIGlzIHNldCBpbiBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi51Y29kZSIpID09IDApCi0gICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfVUNPREU7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5tZGVidWciKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0RFQlVHOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAwLiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKFNHSV9DT01QQVQgKGFiZmQpICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnJlZ2luZm8iKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX1JFR0lORk87Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAucmVnaW5mbyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAweDE4LiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKFNHSV9DT01QQVQgKGFiZmQpICYmIChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKTsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKLQkgICAmJiAoc3RyY21wIChuYW1lLCAiLmhhc2giKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5keW5hbWljIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKG5hbWUsICIuZHluc3RyIikgPT0gMCkpCi0gICAgewotICAgICAgaGRyLT5zaF9lbnRzaXplID0gMDsKLSNpZiAwCi0gICAgICAvKiBUaGlzIGlzbid0IGhvdyB0aGUgSXJpeCA2IGxpbmtlciBiZWhhdmVzLiAgKi8KLSAgICAgIGhkci0+c2hfaW5mbyA9IFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUzsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmdvdCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX1NSREFUQV9TRUNUSU9OX05BTUUgKGFiZmQpKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5zYnNzIikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ0IikgPT0gMAotCSAgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMCkKLSAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX0dQUkVMOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuTUlQUy5pbnRlcmZhY2VzIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19JRkFDRTsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfTk9TVFJJUDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5jb250ZW50Iiwgc3RybGVuICgiLk1JUFMuY29udGVudCIpKSA9PSAwKQotICAgIHsKLSAgICAgIGhkci0+c2hfdHlwZSA9IFNIVF9NSVBTX0NPTlRFTlQ7Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7Ci0gICAgICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19PUFRJT05TOwotICAgICAgaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICAgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX01JUFNfTk9TVFJJUDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZGVidWdfIiwgc2l6ZW9mICIuZGVidWdfIiAtIDEpID09IDApCi0gICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfRFdBUkY7Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5NSVBTLnN5bWxpYiIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX01JUFNfU1lNQk9MX0xJQjsKLSAgICAgIC8qIFRoZSBzaF9saW5rIGFuZCBzaF9pbmZvIGZpZWxkcyBhcmUgc2V0IGluCi0gICAgICAgICBmaW5hbF93cml0ZV9wcm9jZXNzaW5nLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuTUlQUy5ldmVudHMiLCBzaXplb2YgIi5NSVBTLmV2ZW50cyIgLSAxKSA9PSAwCi0JICAgfHwgc3RybmNtcCAobmFtZSwgIi5NSVBTLnBvc3RfcmVsIiwKLQkJICAgICAgIHNpemVvZiAiLk1JUFMucG9zdF9yZWwiIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19FVkVOVFM7Ci0gICAgICBoZHItPnNoX2ZsYWdzIHw9IFNIRl9NSVBTX05PU1RSSVA7Ci0gICAgICAvKiBUaGUgc2hfbGluayBmaWVsZCBpcyBzZXQgaW4gZmluYWxfd3JpdGVfcHJvY2Vzc2luZy4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfTUlQU19NU1lNOwotICAgICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0M7Ci0gICAgICBoZHItPnNoX2VudHNpemUgPSA4OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2l2ZW4gYSBCRkQgc2VjdGlvbiwgdHJ5IHRvIGxvY2F0ZSB0aGUgY29ycmVzcG9uZGluZyBFTEYgc2VjdGlvbgotICAgaW5kZXguICBUaGlzIGlzIHVzZWQgYnkgYm90aCB0aGUgMzItYml0IGFuZCB0aGUgNjQtYml0IEFCSS4KLSAgIEFjdHVhbGx5LCBpdCdzIG5vdCBjbGVhciB0byBtZSB0aGF0IHRoZSA2NC1iaXQgQUJJIHN1cHBvcnRzIHRoZXNlLAotICAgYnV0IGZvciBub24tUElDIG9iamVjdHMgd2Ugd2lsbCBjZXJ0YWlubHkgd2FudCBzdXBwb3J0IGZvciBhdCBsZWFzdAotICAgdGhlIC5zY29tbW9uIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKLSAgICAgYmZkICphYmZkOwotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGludCAqcmV0dmFsOwotewotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5zY29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICAqcmV0dmFsID0gU0hOX01JUFNfU0NPTU1PTjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgaWYgKHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuYWNvbW1vbiIpID09IDApCi0gICAgewotICAgICAgKnJldHZhbCA9IFNITl9NSVBTX0FDT01NT047Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV2hlbiBhcmUgd3JpdGluZyBvdXQgdGhlIC5vcHRpb25zIG9yIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiwKLSAgIHJlbWVtYmVyIHRoZSBieXRlcyB3ZSBhcmUgd3JpdGluZyBvdXQsIHNvIHRoYXQgd2UgY2FuIGluc3RhbGwgdGhlCi0gICBHUCB2YWx1ZSBpbiB0aGUgc2VjdGlvbl9wcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoc3RyY21wIChzZWN0aW9uLT5uYW1lLCBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgKmM7Ci0KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2VsZl9zZWN0aW9uX2RhdGEpKTsKLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBpZiAoYyA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotCSAgaWYgKHNlY3Rpb24tPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICBzaXplID0gc2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgZWxzZQotCSAgICBzaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgYyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT50ZGF0YSA9IChQVFIpIGM7Ci0JfQotCi0gICAgICBtZW1jcHkgKGMgKyBvZmZzZXQsIGxvY2F0aW9uLCBjb3VudCk7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwKLQkJCQkJY291bnQpOwotfQotCi0vKiBXb3JrIG92ZXIgYSBzZWN0aW9uIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgVGhpcyByb3V0aW5lIGlzCi0gICB1c2VkIGJ5IGJvdGggdGhlIDMyLWJpdCBhbmQgdGhlIDY0LWJpdCBBQkkuICBGSVhNRTogV2UgcmVjb2duaXplCi0gICBzZWN0aW9ucyB0aGF0IG5lZWQgdGhlIFNIRl9NSVBTX0dQUkVMIGZsYWcgYnkgbmFtZTsgdGhlcmUgaGFzIHRvIGJlCi0gICBhIGJldHRlciB3YXkuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGlmIChoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uKTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgIHx8IHN0cmNtcCAobmFtZSwgIi5saXQ4IikgPT0gMAotCSAgfHwgc3RyY21wIChuYW1lLCAiLmxpdDQiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgfD0gU0hGX0FMTE9DIHwgU0hGX1dSSVRFIHwgU0hGX01JUFNfR1BSRUw7Ci0JICBoZHItPnNoX3R5cGUgPSBTSFRfTk9CSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgTUlQU19FTEZfU1JEQVRBX1NFQ1RJT05fTkFNRSAoYWJmZCkpID09IDApCi0JewotCSAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxMT0MgfCBTSEZfTUlQU19HUFJFTDsKLQkgIGhkci0+c2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuY29tcGFjdF9yZWwiKSA9PSAwKQotCXsKLQkgIGhkci0+c2hfZmxhZ3MgPSAwOwotCSAgaGRyLT5zaF90eXBlID0gU0hUX1BST0dCSVRTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ydHByb2MiKSA9PSAwKQotCXsKLQkgIGlmIChoZHItPnNoX2FkZHJhbGlnbiAhPSAwICYmIGhkci0+c2hfZW50c2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFkanVzdDsKLQotCSAgICAgIGFkanVzdCA9IGhkci0+c2hfc2l6ZSAlIGhkci0+c2hfYWRkcmFsaWduOwotCSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQkJaGRyLT5zaF9zaXplICs9IGhkci0+c2hfYWRkcmFsaWduIC0gYWRqdXN0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV29yayBvdmVyIGEgc2VjdGlvbiBqdXN0IGJlZm9yZSB3cml0aW5nIGl0IG91dC4gIFdlIHVwZGF0ZSB0aGUgR1AKLSAgIHZhbHVlIGluIHRoZSBTSFRfTUlQU19SRUdJTkZPIGFuZCBTSFRfTUlQU19PUFRJT05TIHNlY3Rpb25zIGJhc2VkCi0gICBvbiB0aGUgdmFsdWUgd2UgYXJlIHVzaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nIChhYmZkLCBoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqaGRyOwotewotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX1JFR0lORk8KLSAgICAgICYmIGhkci0+c2hfc2l6ZSA+IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgYnVmWzRdOwotCi0gICAgICBCRkRfQVNTRVJUIChoZHItPnNoX3NpemUgPT0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0gICAgICBCRkRfQVNTRVJUIChoZHItPmNvbnRlbnRzID09IE5VTEwpOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICBoZHItPnNoX29mZnNldCArIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykgLSA0LAotCQkgICAgU0VFS19TRVQpID09IC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIGVsZl9ncCAoYWJmZCksIGJ1Zik7Ci0gICAgICBpZiAoYmZkX3dyaXRlIChidWYsIChiZmRfc2l6ZV90eXBlKSAxLCAoYmZkX3NpemVfdHlwZSkgNCwgYWJmZCkgIT0gNCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX01JUFNfT1BUSU9OUwotICAgICAgJiYgaGRyLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKSAhPSBOVUxMCi0gICAgICAmJiBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKS0+dGRhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHMsICpsLCAqbGVuZDsKLQotICAgICAgLyogV2Ugc3RvcmVkIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGluIHRoZSBlbGZfc2VjdGlvbl9kYXRhIHRkYXRhCi0JIGZpZWxkIGluIHRoZSBzZXRfc2VjdGlvbl9jb250ZW50cyByb3V0aW5lLiAgV2Ugc2F2ZSB0aGUKLQkgc2VjdGlvbiBjb250ZW50cyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmVhZCB0aGVtIGFnYWluLgotCSBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBlbGZfZ3AgaXMgc2V0LCBzbyB3ZSBjYW4gbG9vawotCSB0aHJvdWdoIHRoZSBzZWN0aW9uIGNvbnRlbnRzIHRvIHNlZSBpZiB0aGVyZSBpcyBhbgotCSBPREtfUkVHSU5GTyBzdHJ1Y3R1cmUuICAqLwotCi0gICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBlbGZfc2VjdGlvbl9kYXRhIChoZHItPmJmZF9zZWN0aW9uKS0+dGRhdGE7Ci0gICAgICBsID0gY29udGVudHM7Ci0gICAgICBsZW5kID0gY29udGVudHMgKyBoZHItPnNoX3NpemU7Ci0gICAgICB3aGlsZSAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpIDw9IGxlbmQpCi0JewotCSAgRWxmX0ludGVybmFsX09wdGlvbnMgaW50b3B0OwotCi0JICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX2luIChhYmZkLCAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgbCwKLQkJCQkJJmludG9wdCk7Ci0JICBpZiAoaW50b3B0LmtpbmQgPT0gT0RLX1JFR0lORk8pCi0JICAgIHsKLQkgICAgICBiZmRfYnl0ZSBidWZbNF07Ci0KLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCQkgICAgKGhkci0+c2hfb2Zmc2V0Ci0JCQkgICAgICsgKGwgLSBjb250ZW50cykKLQkJCSAgICAgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKQotCQkJICAgICArIChzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pIC0gNCkpLAotCQkJICAgICBTRUVLX1NFVCkgPT0gLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGVsZl9ncCAoYWJmZCksIGJ1Zik7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoYnVmLCAxLCA0LCBhYmZkKSAhPSA0KQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGwgKz0gaW50b3B0LnNpemU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gX2JmZF9taXBzX2VsZl9zZWN0aW9uX3Byb2Nlc3NpbmcgKGFiZmQsIGhkcik7Ci19Ci0MCi0vKiBNSVBTIEVMRiB1c2VzIHR3byBjb21tb24gc2VjdGlvbnMuICBPbmUgaXMgdGhlIHVzdWFsIG9uZSwgYW5kIHRoZQotICAgb3RoZXIgaXMgZm9yIHNtYWxsIG9iamVjdHMuICBBbGwgdGhlIHNtYWxsIG9iamVjdHMgYXJlIGtlcHQKLSAgIHRvZ2V0aGVyLCBhbmQgdGhlbiByZWZlcmVuY2VkIHZpYSB0aGUgZ3AgcG9pbnRlciwgd2hpY2ggeWllbGRzCi0gICBmYXN0ZXIgYXNzZW1ibGVyIGNvZGUuICBUaGlzIGlzIHdoYXQgd2UgdXNlIGZvciB0aGUgc21hbGwgY29tbW9uCi0gICBzZWN0aW9uLiAgVGhpcyBhcHByb2FjaCBpcyBjb3BpZWQgZnJvbSBlY29mZi5jLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiBtaXBzX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCBtaXBzX2VsZl9zY29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICptaXBzX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci0KLS8qIE1JUFMgRUxGIGFsc28gdXNlcyBhbiBhY29tbW9uIHNlY3Rpb24sIHdoaWNoIHJlcHJlc2VudHMgYW4KLSAgIGFsbG9jYXRlZCBjb21tb24gc3ltYm9sIHdoaWNoIG1heSBiZSBvdmVycmlkZGVuIGJ5IGEKLSAgIGRlZmluaXRpb24gaW4gYSBzaGFyZWQgbGlicmFyeS4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCi0vKiBUaGUgSXJpeCA1IHN1cHBvcnQgdXNlcyB0d28gdmlydHVhbCBzZWN0aW9ucywgd2hpY2ggcmVwcmVzZW50Ci0gICB0ZXh0L2RhdGEgc3ltYm9scyBkZWZpbmVkIGluIGR5bmFtaWMgb2JqZWN0cy4gICovCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl90ZXh0X3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfdGV4dF9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfdGV4dF9zeW1ib2xfcHRyOwotCi1zdGF0aWMgYXNlY3Rpb24gbWlwc19lbGZfZGF0YV9zZWN0aW9uOwotc3RhdGljIGFzZWN0aW9uICptaXBzX2VsZl9kYXRhX3NlY3Rpb25fcHRyOwotc3RhdGljIGFzeW1ib2wgbWlwc19lbGZfZGF0YV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqbWlwc19lbGZfZGF0YV9zeW1ib2xfcHRyOwotCi0vKiBIYW5kbGUgdGhlIHNwZWNpYWwgTUlQUyBzZWN0aW9uIG51bWJlcnMgdGhhdCBhIHN5bWJvbCBtYXkgdXNlLgotICAgVGhpcyBpcyB1c2VkIGZvciBib3RoIHRoZSAzMi1iaXQgYW5kIHRoZSA2NC1iaXQgQUJJLiAgKi8KLQotdm9pZAotX2JmZF9taXBzX2VsZl9zeW1ib2xfcHJvY2Vzc2luZyAoYWJmZCwgYXN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICphc3ltOwotewotICBlbGZfc3ltYm9sX3R5cGUgKmVsZnN5bTsKLQotICBlbGZzeW0gPSAoZWxmX3N5bWJvbF90eXBlICopIGFzeW07Ci0gIHN3aXRjaCAoZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9NSVBTX0FDT01NT046Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlIGZpbGUuCi0JIEl0IGlzIGFuIGFsbG9jYXRlZCBjb21tb24gc2VjdGlvbi4gIFRoZSBkeW5hbWljIGxpbmtlciBjYW4KLQkgZWl0aGVyIHJlc29sdmUgdGhlc2Ugc3ltYm9scyB0byBzb21ldGhpbmcgaW4gYSBzaGFyZWQKLQkgbGlicmFyeSwgb3IgaXQgY2FuIGp1c3QgbGVhdmUgdGhlbSBoZXJlLiAgRm9yIG91ciBwdXJwb3NlcywKLQkgd2UgY2FuIGNvbnNpZGVyIHRoZXNlIHN5bWJvbHMgdG8gYmUgaW4gYSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBhY29tbW9uIHNlY3Rpb24uICAqLwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm5hbWUgPSAiLmFjb21tb24iOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLmZsYWdzID0gU0VDX0FMTE9DOwotCSAgbWlwc19lbGZfYWNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX2Fjb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX2Fjb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9hY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2wubmFtZSA9ICIuYWNvbW1vbiI7Ci0JICBtaXBzX2VsZl9hY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX2Fjb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfYWNvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX2Fjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfYWNvbV9zZWN0aW9uOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGFzeW0tPnZhbHVlID4gZWxmX2dwX3NpemUgKGFiZmQpKQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIFNITl9NSVBTX1NDT01NT046Ci0gICAgICBpZiAobWlwc19lbGZfc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzbWFsbCBjb21tb24gc2VjdGlvbi4gICovCi0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgPSBTRUNfSVNfQ09NTU9OOwotCSAgbWlwc19lbGZfc2NvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJm1pcHNfZWxmX3Njb21fc2VjdGlvbjsKLQkgIG1pcHNfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2w7Ci0JICBtaXBzX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2wubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBtaXBzX2VsZl9zY29tX3N5bWJvbC5mbGFncyA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIG1pcHNfZWxmX3Njb21fc3ltYm9sLnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotCSAgbWlwc19lbGZfc2NvbV9zeW1ib2xfcHRyID0gJm1pcHNfZWxmX3Njb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmbWlwc19lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19TVU5ERUZJTkVEOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotI2lmIDAgLyogZm9yIFNHSV9DT01QQVQgKi8KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gbWlwc19lbGZfdGV4dF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE5fTUlQU19EQVRBOgotICAgICAgYXN5bS0+c2VjdGlvbiA9IG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0KLX0KLQwKLS8qIFdoZW4gY3JlYXRpbmcgYW4gSXJpeCA1IGV4ZWN1dGFibGUsIHdlIG5lZWQgUkVHSU5GTyBhbmQgUlRQUk9DCi0gICBzZWdtZW50cy4gICovCi0KLXN0YXRpYyBpbnQKLW1pcHNfZWxmX2FkZGl0aW9uYWxfcHJvZ3JhbV9oZWFkZXJzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBpbnQgcmV0ID0gMDsKLQotICBpZiAoIVNHSV9DT01QQVQgKGFiZmQpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIGEgUFRfTUlQU19SRUdJTkZPIHNlZ21lbnQuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVnaW5mbyIpOwotICBpZiAocyAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkpCi0gICAgKytyZXQ7Ci0KLSAgLyogU2VlIGlmIHdlIG5lZWQgYSBQVF9NSVBTX09QVElPTlMgc2VnbWVudC4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2Ci0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgCi0JCQkJICBNSVBTX0VMRl9PUFRJT05TX1NFQ1RJT05fTkFNRSAoYWJmZCkpKQotICAgICsrcmV0OwotCi0gIC8qIFNlZSBpZiB3ZSBuZWVkIGEgUFRfTUlQU19SVFBST0Mgc2VnbWVudC4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1Ci0gICAgICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIikKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLm1kZWJ1ZyIpKQotICAgICsrcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIE1vZGlmeSB0aGUgc2VnbWVudCBtYXAgZm9yIGFuIElyaXggNSBleGVjdXRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX21vZGlmeV9zZWdtZW50X21hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbSwgKipwbTsKLQotICBpZiAoISBTR0lfQ09NUEFUIChhYmZkKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGVyZSBpcyBhIC5yZWdpbmZvIHNlY3Rpb24sIHdlIG5lZWQgYSBQVF9NSVBTX1JFR0lORk8KLSAgICAgc2VnbWVudC4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDApCi0gICAgewotICAgICAgZm9yIChtID0gZWxmX3RkYXRhIChhYmZkKS0+c2VnbWVudF9tYXA7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCi0JaWYgKG0tPnBfdHlwZSA9PSBQVF9NSVBTX1JFR0lORk8pCi0JICBicmVhazsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JewotCSAgbSA9IChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbSk7Ci0JICBpZiAobSA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIG0tPnBfdHlwZSA9IFBUX01JUFNfUkVHSU5GTzsKLQkgIG0tPmNvdW50ID0gMTsKLQkgIG0tPnNlY3Rpb25zWzBdID0gczsKLQotCSAgLyogV2Ugd2FudCB0byBwdXQgaXQgYWZ0ZXIgdGhlIFBIRFIgYW5kIElOVEVSUCBzZWdtZW50cy4gICovCi0JICBwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsKLQkgIHdoaWxlICgqcG0gIT0gTlVMTAotCQkgJiYgKCgqcG0pLT5wX3R5cGUgPT0gUFRfUEhEUgotCQkgICAgIHx8ICgqcG0pLT5wX3R5cGUgPT0gUFRfSU5URVJQKSkKLQkgICAgcG0gPSAmKCpwbSktPm5leHQ7Ci0KLQkgIG0tPm5leHQgPSAqcG07Ci0JICAqcG0gPSBtOwotCX0KLSAgICB9Ci0KLSAgLyogRm9yIElSSVggNiwgd2UgZG9uJ3QgaGF2ZSAubWRlYnVnIHNlY3Rpb25zLCBub3IgZG9lcyBhbnl0aGluZyBidXQKLSAgICAgLmR5bmFtaWMgZW5kIHVwIGluIFBUX0RZTkFNSUMuICBIb3dldmVyLCB3ZSBkbyBoYXZlIHRvIGluc2VydCBhCi0gICAgIFBUX09QVElPTlMgc2VnZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBwcm9ncmFtIGhlYWRlcgotICAgICB0YWJsZS4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg2KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0JaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMpCi0JICBicmVhazsKLQotICAgICAgaWYgKHMpCi0JewotCSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqb3B0aW9uc19zZWdtZW50OwotCi0JICBmb3IgKG0gPSBlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgbTsgbSA9IG0tPm5leHQpCi0JICAgIGlmIChtLT5wX3R5cGUgPT0gUFRfUEhEUikKLQkgICAgICBicmVhazsKLQotCSAgLyogVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIHByb2dyYW0gaGVhZGVyIHRhYmxlLiAgKi8KLQkgIGlmIChtID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb3B0aW9uc19zZWdtZW50ID0gYmZkX3phbGxvYyAoYWJmZCwgCi0JCQkJCXNpemVvZiAoc3RydWN0IGVsZl9zZWdtZW50X21hcCkpOwotCSAgb3B0aW9uc19zZWdtZW50LT5uZXh0ID0gbS0+bmV4dDsKLQkgIG9wdGlvbnNfc2VnbWVudC0+cF90eXBlID0gUFRfTUlQU19PUFRJT05TOwotCSAgb3B0aW9uc19zZWdtZW50LT5wX2ZsYWdzID0gUEZfUjsKLQkgIG9wdGlvbnNfc2VnbWVudC0+cF9mbGFnc192YWxpZCA9IHRydWU7Ci0JICBvcHRpb25zX3NlZ21lbnQtPmNvdW50ID0gMTsKLQkgIG9wdGlvbnNfc2VnbWVudC0+c2VjdGlvbnNbMF0gPSBzOwotCSAgbS0+bmV4dCA9IG9wdGlvbnNfc2VnbWVudDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhlcmUgYXJlIC5keW5hbWljIGFuZCAubWRlYnVnIHNlY3Rpb25zLCB3ZSBtYWtlIGEgcm9vbQotCSBmb3IgdGhlIFJUUFJPQyBoZWFkZXIuICBGSVhNRTogUmV3cml0ZSB3aXRob3V0IHNlY3Rpb24gbmFtZXMuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmludGVycCIpID09IE5VTEwKLQkgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKSAhPSBOVUxMCi0JICAmJiBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5tZGVidWciKSAhPSBOVUxMKQotCXsKLQkgIGZvciAobSA9IGVsZl90ZGF0YSAoYWJmZCktPnNlZ21lbnRfbWFwOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotCSAgICBpZiAobS0+cF90eXBlID09IFBUX01JUFNfUlRQUk9DKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKG0gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIG0gPSAoc3RydWN0IGVsZl9zZWdtZW50X21hcCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKm0pOwotCSAgICAgIGlmIChtID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIG0tPnBfdHlwZSA9IFBUX01JUFNfUlRQUk9DOwotCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJ0cHJvYyIpOwotCSAgICAgIGlmIChzID09IE5VTEwpCi0JCXsKLQkJICBtLT5jb3VudCA9IDA7Ci0JCSAgbS0+cF9mbGFncyA9IDA7Ci0JCSAgbS0+cF9mbGFnc192YWxpZCA9IDE7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBtLT5jb3VudCA9IDE7Ci0JCSAgbS0+c2VjdGlvbnNbMF0gPSBzOwotCQl9Ci0KLQkgICAgICAvKiBXZSB3YW50IHRvIHB1dCBpdCBhZnRlciB0aGUgRFlOQU1JQyBzZWdtZW50LiAgKi8KLQkgICAgICBwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsKLQkgICAgICB3aGlsZSAoKnBtICE9IE5VTEwgJiYgKCpwbSktPnBfdHlwZSAhPSBQVF9EWU5BTUlDKQotCQlwbSA9ICYoKnBtKS0+bmV4dDsKLQkgICAgICBpZiAoKnBtICE9IE5VTEwpCi0JCXBtID0gJigqcG0pLT5uZXh0OwotCi0JICAgICAgbS0+bmV4dCA9ICpwbTsKLQkgICAgICAqcG0gPSBtOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBPbiBJcml4IDUsIHRoZSBQVF9EWU5BTUlDIHNlZ21lbnQgaW5jbHVkZXMgdGhlIC5keW5hbWljLAotCSAuZHluc3RyLCAuZHluc3ltLCBhbmQgLmhhc2ggc2VjdGlvbnMsIGFuZCBldmVyeXRoaW5nIGluCi0JIGJldHdlZW4uICAqLwotICAgICAgZm9yIChwbSA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zZWdtZW50X21hcDsgKnBtICE9IE5VTEw7IHBtID0gJigqcG0pLT5uZXh0KQotCWlmICgoKnBtKS0+cF90eXBlID09IFBUX0RZTkFNSUMpCi0JICBicmVhazsKLSAgICAgIG0gPSAqcG07Ci0gICAgICBpZiAobSAhPSBOVUxMCi0JICAmJiBtLT5jb3VudCA9PSAxCi0JICAmJiBzdHJjbXAgKG0tPnNlY3Rpb25zWzBdLT5uYW1lLCAiLmR5bmFtaWMiKSA9PSAwKQotCXsKLQkgIHN0YXRpYyBjb25zdCBjaGFyICpzZWNfbmFtZXNbXSA9Ci0JICB7ICIuZHluYW1pYyIsICIuZHluc3RyIiwgIi5keW5zeW0iLCAiLmhhc2giIH07Ci0JICBiZmRfdm1hIGxvdywgaGlnaDsKLQkgIHVuc2lnbmVkIGludCBpLCBjOwotCSAgc3RydWN0IGVsZl9zZWdtZW50X21hcCAqbjsKLQotCSAgbG93ID0gMHhmZmZmZmZmZjsKLQkgIGhpZ2ggPSAwOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBzZWNfbmFtZXMgLyBzaXplb2Ygc2VjX25hbWVzWzBdOyBpKyspCi0JICAgIHsKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNlY19uYW1lc1tpXSk7Ci0JICAgICAgaWYgKHMgIT0gTlVMTCAmJiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJewotCQkgIGJmZF9zaXplX3R5cGUgc3o7Ci0KLQkJICBpZiAobG93ID4gcy0+dm1hKQotCQkgICAgbG93ID0gcy0+dm1hOwotCQkgIHN6ID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgIGlmIChzeiA9PSAwKQotCQkgICAgc3ogPSBzLT5fcmF3X3NpemU7Ci0JCSAgaWYgKGhpZ2ggPCBzLT52bWEgKyBzeikKLQkJICAgIGhpZ2ggPSBzLT52bWEgKyBzejsKLQkJfQotCSAgICB9Ci0KLQkgIGMgPSAwOwotCSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMAotCQkmJiBzLT52bWEgPj0gbG93Ci0JCSYmICgocy0+dm1hCi0JCSAgICAgKyAocy0+X2Nvb2tlZF9zaXplICE9IDAgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpKQotCQkgICAgPD0gaGlnaCkpCi0JICAgICAgKytjOwotCi0JICBuID0gKChzdHJ1Y3QgZWxmX3NlZ21lbnRfbWFwICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAqbiArIChjIC0gMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAqbiA9ICptOwotCSAgbi0+Y291bnQgPSBjOwotCi0JICBpID0gMDsKLQkgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0JCSAgJiYgcy0+dm1hID49IGxvdwotCQkgICYmICgocy0+dm1hCi0JCSAgICAgICArIChzLT5fY29va2VkX3NpemUgIT0gMCA/Ci0JCQkgIHMtPl9jb29rZWRfc2l6ZSA6IHMtPl9yYXdfc2l6ZSkpCi0JCSAgICAgIDw9IGhpZ2gpKQotCQl7Ci0JCSAgbi0+c2VjdGlvbnNbaV0gPSBzOwotCQkgICsraTsKLQkJfQotCSAgICB9Ci0KLQkgICpwbSA9IG47Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgY3JlYXRlZCBieSB0aGUKLSAgIGxvYWRlciBmb3IgdXNlIGJ5IHRoZSBzdGF0aWMgZXhjZXB0aW9uIHN5c3RlbS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHJ1bnRpbWVfcGRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIHN0YXJ0IG9mIHByb2NlZHVyZSAqLwotCWxvbmcJcmVnbWFzazsJLyogc2F2ZSByZWdpc3RlciBtYXNrICovCi0JbG9uZwlyZWdvZmZzZXQ7CS8qIHNhdmUgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmVnbWFzazsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBtYXNrICovCi0JbG9uZwlmcmVnb2Zmc2V0OwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9mZnNldCAqLwotCWxvbmcJZnJhbWVvZmZzZXQ7CS8qIGZyYW1lIHNpemUgKi8KLQlzaG9ydAlmcmFtZXJlZzsJLyogZnJhbWUgcG9pbnRlciByZWdpc3RlciAqLwotCXNob3J0CXBjcmVnOwkJLyogb2Zmc2V0IG9yIHJlZyBvZiByZXR1cm4gcGMgKi8KLQlsb25nCWlycHNzOwkJLyogaW5kZXggaW50byB0aGUgcnVudGltZSBzdHJpbmcgdGFibGUgKi8KLQlsb25nCXJlc2VydmVkOwotCXN0cnVjdCBleGNlcHRpb25faW5mbyAqZXhjZXB0aW9uX2luZm87LyogcG9pbnRlciB0byBleGNlcHRpb24gYXJyYXkgKi8KLX0gUlBEUiwgKnBSUERSOwotI2RlZmluZSBjYlJQRFIgc2l6ZW9mKFJQRFIpCi0jZGVmaW5lIHJwZE5pbCAoKHBSUERSKSAwKQotCi0vKiBTd2FwIFJQRFIgKHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIGVudHJ5KSBmb3Igb3V0cHV0LiAgKi8KLQotc3RhdGljIHZvaWQgZWNvZmZfc3dhcF9ycGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgUlBEUiAqLCBzdHJ1Y3QgcnBkcl9leHQgKikpOwotCi1zdGF0aWMgdm9pZAotZWNvZmZfc3dhcF9ycGRyX291dCAoYWJmZCwgaW4sIGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IFJQRFIgKmluOwotICAgICBzdHJ1Y3QgcnBkcl9leHQgKmV4OwotewotICAvKiBlY29mZl9wdXRfb2ZmIHdhcyBkZWZpbmVkIGluIGVjb2Zmc3dhcC5oLiAgKi8KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW4tPmFkciwgKGJmZF9ieXRlICopIGV4LT5wX2Fkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnJlZ21hc2ssIChiZmRfYnl0ZSAqKSBleC0+cF9yZWdtYXNrKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+cmVnb2Zmc2V0LCAoYmZkX2J5dGUgKikgZXgtPnBfcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+ZnJlZ21hc2ssIChiZmRfYnl0ZSAqKSBleC0+cF9mcmVnbWFzayk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmZyZWdvZmZzZXQsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmVnb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBpbi0+ZnJhbWVvZmZzZXQsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmFtZW9mZnNldCk7Ci0KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+ZnJhbWVyZWcsIChiZmRfYnl0ZSAqKSBleC0+cF9mcmFtZXJlZyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW4tPnBjcmVnLCAoYmZkX2J5dGUgKikgZXgtPnBfcGNyZWcpOwotCi0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPmlycHNzLCAoYmZkX2J5dGUgKikgZXgtPnBfaXJwc3MpOwotI2lmIDAgLyogRklYTUUgKi8KLSAgZWNvZmZfcHV0X29mZiAoYWJmZCwgaW4tPmV4Y2VwdGlvbl9pbmZvLCAoYmZkX2J5dGUgKikgZXgtPnBfZXhjZXB0aW9uX2luZm8pOwotI2VuZGlmCi19Ci0MCi0vKiBSZWFkIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgLm1kZWJ1ZyBzZWN0aW9uIGludG8gYQotICAgZWNvZmZfZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi1ib29sZWFuCi1fYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgc2VjdGlvbiwgZGVidWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgY2hhciAqZXh0X2hkciA9IE5VTEw7Ci0KLSAgc3dhcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgbWVtc2V0IChkZWJ1ZywgMCwgc2l6ZW9mKCpkZWJ1ZykpOwotCi0gIGV4dF9oZHIgPSAoY2hhciAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChleHRfaGRyID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBleHRfaGRyLCAoZmlsZV9wdHIpIDAsCi0JCQkJc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgICA9PSBmYWxzZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgKCpzd2FwLT5zd2FwX2hkcl9pbikgKGFiZmQsIGV4dF9oZHIsIHN5bWhkcik7Ci0KLSAgLyogVGhlIHN5bWJvbGljIGhlYWRlciBjb250YWlucyBhYnNvbHV0ZSBmaWxlIG9mZnNldHMgYW5kIHNpemVzIHRvCi0gICAgIHJlYWQuICAqLwotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgc3ltaGRyLT5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWFiZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgIH0KLQotICBSRUFEIChsaW5lLCBjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgdW5zaWduZWQgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3N5bSwgY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQl1bmlvbiBhdXhfZXh0ICopOwotICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChzc2V4dCwgY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3JmZCwgY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9leHQsIGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgUFRSKTsKLSN1bmRlZiBSRUFECi0KLSAgZGVidWctPmZkciA9IE5VTEw7Ci0gIGRlYnVnLT5hZGp1c3QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXh0X2hkciAhPSBOVUxMKQotICAgIGZyZWUgKGV4dF9oZHIpOwotICBpZiAoZGVidWctPmxpbmUgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+bGluZSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3N5bSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gIGlmIChkZWJ1Zy0+c3MgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3MpOwotICBpZiAoZGVidWctPnNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzZXh0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9mZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogTUlQUyBFTEYgbG9jYWwgbGFiZWxzIHN0YXJ0IHdpdGggJyQnLCBub3QgJ0wnLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAobmFtZVswXSA9PSAnJCcpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogT24gSXJpeCA2LCB0aGUgbGFiZWxzIGdvIGJhY2sgdG8gc3RhcnRpbmcgd2l0aCAnLicsIHNvIHdlIGFjY2VwdAotICAgICB0aGUgZ2VuZXJpYyBFTEYgbG9jYWwgbGFiZWwgc3ludGF4IGFzIHdlbGwuICAqLwotICByZXR1cm4gX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSk7Ci19Ci0KLS8qIE1JUFMgRUxGIHVzZXMgYSBzcGVjaWFsIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUgaW4gb3JkZXIgdGhlCi0gICBoYW5kbGUgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUKLXsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZDsKLSAgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSBpOwotfTsKLQotYm9vbGVhbgotX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQkJIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBhc2VjdGlvbiAqbXNlYzsKLQotICBpZiAoX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwKLQkJCQkgICAgIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgICAgIGxpbmVfcHRyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIik7Ci0gIGlmIChtc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb3JpZ2ZsYWdzOwotICAgICAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmk7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotCWdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLQotICAgICAgLyogSWYgd2UgYXJlIGNhbGxlZCBkdXJpbmcgYSBsaW5rLCBtaXBzX2VsZl9maW5hbF9saW5rIG1heSBoYXZlCi0JIGNsZWFyZWQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmllbGQuICBXZSBmb3JjZSBpdCBiYWNrIG9uIGhlcmUKLQkgaWYgYXBwcm9wcmlhdGUgKHdoaWNoIGl0IG5vcm1hbGx5IHdpbGwgYmUpLiAgKi8KLSAgICAgIG9yaWdmbGFncyA9IG1zZWMtPmZsYWdzOwotICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKG1zZWMpLT50aGlzX2hkci5zaF90eXBlICE9IFNIVF9OT0JJVFMpCi0JbXNlYy0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgZmkgPSBlbGZfdGRhdGEgKGFiZmQpLT5maW5kX2xpbmVfaW5mbzsKLSAgICAgIGlmIChmaSA9PSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBjaGFyICpmcmF3X3NyYzsKLQkgIGNoYXIgKmZyYXdfZW5kOwotCSAgc3RydWN0IGZkciAqZmRyX3B0cjsKLQotCSAgZmkgPSAoKHN0cnVjdCBtaXBzX2VsZl9maW5kX2xpbmUgKikKLQkJYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lKSkpOwotCSAgaWYgKGZpID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKCEgX2JmZF9taXBzX2VsZl9yZWFkX2Vjb2ZmX2luZm8gKGFiZmQsIG1zZWMsICZmaS0+ZCkpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogU3dhcCBpbiB0aGUgRkRSIGluZm9ybWF0aW9uLiAgKi8KLQkgIGZpLT5kLmZkciA9ICgoc3RydWN0IGZkciAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgKGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKgotCQkJCSAgIHNpemVvZiAoc3RydWN0IGZkcikpKSk7Ci0JICBpZiAoZmktPmQuZmRyID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGV4dGVybmFsX2Zkcl9zaXplID0gc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0JICBmZHJfcHRyID0gZmktPmQuZmRyOwotCSAgZnJhd19zcmMgPSAoY2hhciAqKSBmaS0+ZC5leHRlcm5hbF9mZHI7Ci0JICBmcmF3X2VuZCA9IChmcmF3X3NyYwotCQkgICAgICArIGZpLT5kLnN5bWJvbGljX2hlYWRlci5pZmRNYXggKiBleHRlcm5hbF9mZHJfc2l6ZSk7Ci0JICBmb3IgKDsgZnJhd19zcmMgPCBmcmF3X2VuZDsgZnJhd19zcmMgKz0gZXh0ZXJuYWxfZmRyX3NpemUsIGZkcl9wdHIrKykKLQkgICAgKCpzd2FwLT5zd2FwX2Zkcl9pbikgKGFiZmQsIChQVFIpIGZyYXdfc3JjLCBmZHJfcHRyKTsKLQotCSAgZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm8gPSBmaTsKLQotCSAgLyogTm90ZSB0aGF0IHdlIGRvbid0IGJvdGhlciB0byBldmVyIGZyZWUgdGhpcyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICBmaW5kX25lYXJlc3RfbGluZSBpcyBlaXRoZXIgY2FsbGVkIGFsbCB0aGUgdGltZSwgYXMgaW4KLSAgICAgICAgICAgICBvYmpkdW1wIC1sLCBzbyB0aGUgaW5mb3JtYXRpb24gc2hvdWxkIGJlIHNhdmVkLCBvciBpdCBpcwotICAgICAgICAgICAgIHJhcmVseSBjYWxsZWQsIGFzIGluIGxkIGVycm9yIG1lc3NhZ2VzLCBzbyB0aGUgbWVtb3J5Ci0gICAgICAgICAgICAgd2FzdGVkIGlzIHVuaW1wb3J0YW50LiAgU3RpbGwsIGl0IHdvdWxkIHByb2JhYmx5IGJlIGEKLSAgICAgICAgICAgICBnb29kIGlkZWEgZm9yIGZyZWVfY2FjaGVkX2luZm8gdG8gdGhyb3cgaXQgYXdheS4gICovCi0JfQotCi0gICAgICBpZiAoX2JmZF9lY29mZl9sb2NhdGVfbGluZSAoYWJmZCwgc2VjdGlvbiwgb2Zmc2V0LCAmZmktPmQsIHN3YXAsCi0JCQkJICAmZmktPmksIGZpbGVuYW1lX3B0ciwgZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkgIGxpbmVfcHRyKSkKLQl7Ci0JICBtc2VjLT5mbGFncyA9IG9yaWdmbGFnczsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0gICAgfQotCi0gIC8qIEZhbGwgYmFjayBvbiB0aGUgZ2VuZXJpYyBFTEYgZmluZF9uZWFyZXN0X2xpbmUgcm91dGluZS4gICovCi0KLSAgcmV0dXJuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsCi0JCQkJICAgICBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICAgICBsaW5lX3B0cik7Ci19Ci0MCi0gIC8qIFRoZSBtaXBzMTYgY29tcGlsZXIgdXNlcyBhIGNvdXBsZSBvZiBzcGVjaWFsIHNlY3Rpb25zIHRvIGhhbmRsZQotICAgICBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMuCi0KLSAgICAgU2VjdGlvbiBuYW1lcyB0aGF0IGxvb2sgbGlrZSAubWlwczE2LmZuLkZOTkFNRSBjb250YWluIHN0dWJzIHRoYXQKLSAgICAgY29weSBmbG9hdGluZyBwb2ludCBhcmd1bWVudHMgZnJvbSB0aGUgZnAgcmVncyB0byB0aGUgZ3AgcmVncyBhbmQKLSAgICAgdGhlbiBqdW1wIHRvIEZOTkFNRS4gIElmIGFueSAzMiBiaXQgZnVuY3Rpb24gY2FsbHMgRk5OQU1FLCB0aGUKLSAgICAgY2FsbCBzaG91bGQgYmUgcmVkaXJlY3RlZCB0byB0aGUgc3R1YiBpbnN0ZWFkLiAgSWYgbm8gMzIgYml0Ci0gICAgIGZ1bmN0aW9uIGNhbGxzIEZOTkFNRSwgdGhlIHN0dWIgc2hvdWxkIGJlIGRpc2NhcmRlZC4gIFdlIG5lZWQgdG8KLSAgICAgY29uc2lkZXIgYW55IHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24sIG5vdCBqdXN0IGEgY2FsbCwgYmVjYXVzZQotICAgICBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gaXMgdGFrZW4gd2Ugd2lsbCBuZWVkIHRoZSBzdHViLAotICAgICBzaW5jZSB0aGUgYWRkcmVzcyBtaWdodCBiZSBwYXNzZWQgdG8gYSAzMiBiaXQgZnVuY3Rpb24uCi0KLSAgICAgU2VjdGlvbiBuYW1lcyB0aGF0IGxvb2sgbGlrZSAubWlwczE2LmNhbGwuRk5OQU1FIGNvbnRhaW4gc3R1YnMKLSAgICAgdGhhdCBjb3B5IGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBmcm9tIHRoZSBncCByZWdzIHRvIHRoZSBmcAotICAgICByZWdzIGFuZCB0aGVuIGp1bXAgdG8gRk5OQU1FLiAgSWYgRk5OQU1FIGlzIGEgMzIgYml0IGZ1bmN0aW9uLAotICAgICB0aGVuIGFueSAxNiBiaXQgZnVuY3Rpb24gdGhhdCBjYWxscyBGTk5BTUUgc2hvdWxkIGJlIHJlZGlyZWN0ZWQKLSAgICAgdG8gdGhlIHN0dWIgaW5zdGVhZC4gIElmIEZOTkFNRSBpcyBub3QgYSAzMiBiaXQgZnVuY3Rpb24sIHRoZQotICAgICBzdHViIHNob3VsZCBiZSBkaXNjYXJkZWQuCi0KLSAgICAgLm1pcHMxNi5jYWxsLmZwLkZOTkFNRSBzZWN0aW9ucyBhcmUgc2ltaWxhciwgYnV0IGNvbnRhaW4gc3R1YnMKLSAgICAgd2hpY2ggY2FsbCBGTk5BTUUgYW5kIHRoZW4gY29weSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZwIHJlZ3MKLSAgICAgdG8gdGhlIGdwIHJlZ3MuICBUaGVzZSBzdHVicyBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGluICQxOCB3aGlsZQotICAgICBjYWxsaW5nIEZOTkFNRTsgYW55IGZ1bmN0aW9uIHdoaWNoIG1pZ2h0IGNhbGwgb25lIG9mIHRoZXNlIHN0dWJzCi0gICAgIG11c3QgYXJyYW5nZSB0byBzYXZlICQxOCBhcm91bmQgdGhlIGNhbGwuICAoVGhpcyBjYXNlIGlzIG5vdAotICAgICBuZWVkZWQgZm9yIDMyIGJpdCBmdW5jdGlvbnMgdGhhdCBjYWxsIDE2IGJpdCBmdW5jdGlvbnMsIGJlY2F1c2UKLSAgICAgMTYgYml0IGZ1bmN0aW9ucyBhbHdheXMgcmV0dXJuIGZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiBib3RoCi0gICAgICRmMC8kZjEgYW5kICQyLyQzLikKLQotICAgICBOb3RlIHRoYXQgaW4gYWxsIGNhc2VzIEZOTkFNRSBtaWdodCBiZSBkZWZpbmVkIHN0YXRpY2FsbHkuCi0gICAgIFRoZXJlZm9yZSwgRk5OQU1FIGlzIG5vdCB1c2VkIGxpdGVyYWxseS4gIEluc3RlYWQsIHRoZSByZWxvY2F0aW9uCi0gICAgIGluZm9ybWF0aW9uIHdpbGwgaW5kaWNhdGUgd2hpY2ggc3ltYm9sIHRoZSBzZWN0aW9uIGlzIGZvci4KLQotICAgICBXZSByZWNvcmQgYW55IHN0dWJzIHRoYXQgd2UgZmluZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotI2RlZmluZSBGTl9TVFVCICIubWlwczE2LmZuLiIKLSNkZWZpbmUgQ0FMTF9TVFVCICIubWlwczE2LmNhbGwuIgotI2RlZmluZSBDQUxMX0ZQX1NUVUIgIi5taXBzMTYuY2FsbC5mcC4iCi0KLS8qIFRoZSBNSVBTIEVMRiBsaW5rZXIgbmVlZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBzeW1ib2wgaW4KLSAgIHRoZSBnbG9iYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBFeHRlcm5hbCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBFWFRSIGVzeW07Ci0KLSAgLyogTnVtYmVyIG9mIE1JUFNfMzIgb3IgTUlQU19SRUwzMiByZWxvY3MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGludCBtaXBzXzMyX3JlbG9jczsKLQotICAvKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGR5bmFtaWMgcmVsb2NhdGlvbiAoaW4gdGhlIC5yZWwuZHluCi0gICAgIHNlY3Rpb24pIGFnYWluc3QgdGhpcyBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBpbnQgbWluX2R5bl9yZWxvY19pbmRleDsKLQotICAvKiBJZiB0aGVyZSBpcyBhIHN0dWIgdGhhdCAzMiBiaXQgZnVuY3Rpb25zIHNob3VsZCB1c2UgdG8gY2FsbCB0aGlzCi0gICAgIDE2IGJpdCBmdW5jdGlvbiwgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgc3R1Yi4gICovCi0gIGFzZWN0aW9uICpmbl9zdHViOwotCi0gIC8qIFdoZXRoZXIgd2UgbmVlZCB0aGUgZm5fc3R1YjsgdGhpcyBpcyBzZXQgaWYgdGhpcyBzeW1ib2wgYXBwZWFycwotICAgICBpbiBhbnkgcmVsb2NzIG90aGVyIHRoYW4gYSAxNiBiaXQgY2FsbC4gICovCi0gIGJvb2xlYW4gbmVlZF9mbl9zdHViOwotCi0gIC8qIElmIHRoZXJlIGlzIGEgc3R1YiB0aGF0IDE2IGJpdCBmdW5jdGlvbnMgc2hvdWxkIHVzZSB0byBjYWxsIHRoaXMKLSAgICAgMzIgYml0IGZ1bmN0aW9uLCB0aGlzIHBvaW50cyB0byB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBzdHViLiAgKi8KLSAgYXNlY3Rpb24gKmNhbGxfc3R1YjsKLQotICAvKiBUaGlzIGlzIGxpa2UgdGhlIGNhbGxfc3R1YiBmaWVsZCwgYnV0IGl0IGlzIHVzZWQgaWYgdGhlIGZ1bmN0aW9uCi0gICAgIGJlaW5nIGNhbGxlZCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuICAqLwotICBhc2VjdGlvbiAqY2FsbF9mcF9zdHViOwotfTsKLQotLyogTUlQUyBFTEYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0jaWYgMAotICAvKiBXZSBubyBsb25nZXIgdXNlIHRoaXMuICAqLwotICAvKiBTdHJpbmcgc2VjdGlvbiBpbmRpY2VzIGZvciB0aGUgZHluYW1pYyBzZWN0aW9uIHN5bWJvbHMuICAqLwotICBiZmRfc2l6ZV90eXBlIGR5bnN5bV9zZWNfc3RyaW5kZXhbU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTXTsKLSNlbmRpZgotICAvKiBUaGUgbnVtYmVyIG9mIC5ydHByb2MgZW50cmllcy4gICovCi0gIGJmZF9zaXplX3R5cGUgcHJvY2VkdXJlX2NvdW50OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24gKGlmIFNHSV9DT01QQVQpLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBjb21wYWN0X3JlbF9zaXplOwotICAvKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIERUX01JUFNfUkxEX01BUCBkeW5hbWljCi0gICAgIGVudHJ5IGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiBfX3JsZF9vYmpfaGVhZCBhcyBpbiBJcml4IDUuICovCi0gIGJvb2xlYW4gdXNlX3JsZF9vYmpfaGVhZDsKLSAgLyogVGhpcyBpcyB0aGUgdmFsdWUgb2YgdGhlIF9fcmxkX21hcCBvciBfX3JsZF9vYmpfaGVhZCBzeW1ib2wuICAqLwotICBiZmRfdm1hIHJsZF92YWx1ZTsKLSAgLyogVGhpcyBpcyBzZXQgaWYgd2Ugc2VlIGFueSBtaXBzMTYgc3R1YiBzZWN0aW9ucy4gKi8KLSAgYm9vbGVhbiBtaXBzMTZfc3R1YnNfc2VlbjsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGVsZl9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLAkJXAotCQkJIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIE1JUFMgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoZWxmX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZSBmcm9tIGEgbGlua19pbmZvIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgbWlwc19lbGZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotc3RhdGljIGJvb2xlYW4gbWlwc19lbGZfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotbWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsCi0JCQkgICAgICBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9lbGZfbGlua19oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICBtZW1zZXQgKCZyZXQtPmVzeW0sIDAsIHNpemVvZiAoRVhUUikpOwotICAgICAgLyogV2UgdXNlIC0yIGFzIGEgbWFya2VyIHRvIGluZGljYXRlIHRoYXQgdGhlIGluZm9ybWF0aW9uIGhhcwotCSBub3QgYmVlbiBzZXQuICAtMSBtZWFucyB0aGVyZSBpcyBubyBhc3NvY2lhdGVkIGlmZC4gICovCi0gICAgICByZXQtPmVzeW0uaWZkID0gLTI7Ci0gICAgICByZXQtPm1pcHNfMzJfcmVsb2NzID0gMDsKLSAgICAgIHJldC0+bWluX2R5bl9yZWxvY19pbmRleCA9IDA7Ci0gICAgICByZXQtPmZuX3N0dWIgPSBOVUxMOwotICAgICAgcmV0LT5uZWVkX2ZuX3N0dWIgPSBmYWxzZTsKLSAgICAgIHJldC0+Y2FsbF9zdHViID0gTlVMTDsKLSAgICAgIHJldC0+Y2FsbF9mcF9zdHViID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBNSVBTIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1taXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgbWlwc19lbGZfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWYgMAotICAvKiBXZSBubyBsb25nZXIgdXNlIHRoaXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgU0laRU9GX01JUFNfRFlOU1lNX1NFQ05BTUVTOyBpKyspCi0gICAgcmV0LT5keW5zeW1fc2VjX3N0cmluZGV4W2ldID0gKGJmZF9zaXplX3R5cGUpIC0xOwotI2VuZGlmCi0gIHJldC0+cHJvY2VkdXJlX2NvdW50ID0gMDsKLSAgcmV0LT5jb21wYWN0X3JlbF9zaXplID0gMDsKLSAgcmV0LT51c2VfcmxkX29ial9oZWFkID0gZmFsc2U7Ci0gIHJldC0+cmxkX3ZhbHVlID0gMDsKLSAgcmV0LT5taXBzMTZfc3R1YnNfc2VlbiA9IGZhbHNlOwotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSBtdXN0IGhhbmRsZSB0aGUgc3BlY2lhbCBNSVBTIHNlY3Rpb24gbnVtYmVycyBoZXJlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChTR0lfQ09NUEFUIChhYmZkKQotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgc3RyY21wICgqbmFtZXAsICJfcmxkX25ld19pbnRlcmZhY2UiKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFNraXAgSXJpeCA1IHJsZCBlbnRyeSBuYW1lLiAgKi8KLSAgICAgICpuYW1lcCA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgc3dpdGNoIChzeW0tPnN0X3NobmR4KQotICAgIHsKLSAgICBjYXNlIFNITl9DT01NT046Ci0gICAgICAvKiBDb21tb24gc3ltYm9scyBsZXNzIHRoYW4gdGhlIEdQIHNpemUgYXJlIGF1dG9tYXRpY2FsbHkKLQkgdHJlYXRlZCBhcyBTSE5fTUlQU19TQ09NTU9OIHN5bWJvbHMuICAqLwotICAgICAgaWYgKHN5bS0+c3Rfc2l6ZSA+IGVsZl9ncF9zaXplIChhYmZkKSkKLQlicmVhazsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBTSE5fTUlQU19TQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFNITl9NSVBTX1RFWFQ6Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgaWYgKG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzZWN0aW9uLiAgKi8KLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5uYW1lID0gIi50ZXh0IjsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9IE5VTEw7Ci0JICBtaXBzX2VsZl90ZXh0X3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sOwotCSAgbWlwc19lbGZfdGV4dF9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX3RleHRfc3ltYm9sX3B0cjsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sLm5hbWUgPSAiLnRleHQiOwotCSAgbWlwc19lbGZfdGV4dF9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBtaXBzX2VsZl90ZXh0X3N5bWJvbC5zZWN0aW9uID0gJm1pcHNfZWxmX3RleHRfc2VjdGlvbjsKLQkgIG1pcHNfZWxmX3RleHRfc3ltYm9sX3B0ciA9ICZtaXBzX2VsZl90ZXh0X3N5bWJvbDsKLQkgIG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHIgPSAmbWlwc19lbGZfdGV4dF9zZWN0aW9uOwotCX0KLSAgICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGRvICpzZWNwID0gYmZkX3VuZF9zZWN0aW9uX3B0ciBpZgotICAgICAgICAgaW5mby0+c2hhcmVkLiAgSSBkb24ndCBrbm93IHdoeSwgYW5kIHRoYXQgZG9lc24ndCBtYWtlIHNlbnNlLAotICAgICAgICAgc28gSSB0b29rIGl0IG91dC4gICovCi0gICAgICAqc2VjcCA9IG1pcHNfZWxmX3RleHRfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX01JUFNfQUNPTU1PTjoKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gWFhYIENhbiB3ZSB0cmVhdCB0aGlzIGFzIGFsbG9jYXRlZCBkYXRhPyAgKi8KLSAgICBjYXNlIFNITl9NSVBTX0RBVEE6Ci0gICAgICAvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCBpbiBhIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgaWYgKG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBJbml0aWFsaXplIHRoZSBzZWN0aW9uLiAgKi8KLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5uYW1lID0gIi5kYXRhIjsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9IE5VTEw7Ci0JICBtaXBzX2VsZl9kYXRhX3NlY3Rpb24uc3ltYm9sID0gJm1pcHNfZWxmX2RhdGFfc3ltYm9sOwotCSAgbWlwc19lbGZfZGF0YV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJm1pcHNfZWxmX2RhdGFfc3ltYm9sX3B0cjsKLQkgIG1pcHNfZWxmX2RhdGFfc3ltYm9sLm5hbWUgPSAiLmRhdGEiOwotCSAgbWlwc19lbGZfZGF0YV9zeW1ib2wuZmxhZ3MgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICBtaXBzX2VsZl9kYXRhX3N5bWJvbC5zZWN0aW9uID0gJm1pcHNfZWxmX2RhdGFfc2VjdGlvbjsKLQkgIG1pcHNfZWxmX2RhdGFfc3ltYm9sX3B0ciA9ICZtaXBzX2VsZl9kYXRhX3N5bWJvbDsKLQkgIG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHIgPSAmbWlwc19lbGZfZGF0YV9zZWN0aW9uOwotCX0KLSAgICAgIC8qIFRoaXMgY29kZSB1c2VkIHRvIGRvICpzZWNwID0gYmZkX3VuZF9zZWN0aW9uX3B0ciBpZgotICAgICAgICAgaW5mby0+c2hhcmVkLiAgSSBkb24ndCBrbm93IHdoeSwgYW5kIHRoYXQgZG9lc24ndCBtYWtlIHNlbnNlLAotICAgICAgICAgc28gSSB0b29rIGl0IG91dC4gICovCi0gICAgICAqc2VjcCA9IG1pcHNfZWxmX2RhdGFfc2VjdGlvbl9wdHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX01JUFNfU1VOREVGSU5FRDoKLSAgICAgICpzZWNwID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKLSAgICAgICYmICEgaW5mby0+c2hhcmVkCi0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMKLSAgICAgICYmIHN0cmNtcCAoKm5hbWVwLCAiX19ybGRfb2JqX2hlYWQiKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBNYXJrIF9fcmxkX29ial9oZWFkIGFzIGR5bmFtaWMuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgICAgIChpbmZvLCBhYmZkLCAqbmFtZXAsIEJTRl9HTE9CQUwsICpzZWNwLAotCSAgICAgIChiZmRfdm1hKSAqdmFscCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSOwotICAgICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZCA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBtaXBzMTYgdGV4dCBzeW1ib2wsIGFkZCAxIHRvIHRoZSB2YWx1ZSB0byBtYWtlIGl0Ci0gICAgIG9kZC4gIFRoaXMgd2lsbCBjYXVzZSBzb21ldGhpbmcgbGlrZSAud29yZCBTWU0gdG8gY29tZSB1cCB3aXRoCi0gICAgIHRoZSByaWdodCB2YWx1ZSB3aGVuIGl0IGlzIGxvYWRlZCBpbnRvIHRoZSBQQy4gICovCi0gIGlmIChzeW0tPnN0X290aGVyID09IFNUT19NSVBTMTYpCi0gICAgKysqdmFscDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBtaXBzX2VsZl9vdXRwdXRfZXh0c3ltLiAgKi8KLQotc3RydWN0IGV4dHN5bV9pbmZvCi17Ci0gIGJmZCAqYWJmZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKnN3YXA7Ci0gIGJvb2xlYW4gZmFpbGVkOwotfTsKLQotLyogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gd3JpdGUgb3V0IEVDT0ZGIGRlYnVnZ2luZyBleHRlcm5hbCBzeW1ib2wKLSAgIGluZm9ybWF0aW9uLiAgSXQgaXMgY2FsbGVkIHZpYSBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UuICBUaGUKLSAgIEVDT0ZGIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiBtdXN0IG1hdGNoIHRoZSBFTEYgZXh0ZXJuYWwKLSAgIHN5bWJvbCBpbmZvcm1hdGlvbi4gIFVuZm9ydHVuYXRlbHksIGF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdwotICAgd2hldGhlciBhIHN5bWJvbCBpcyByZXF1aXJlZCBieSByZWxvYyBpbmZvcm1hdGlvbiwgc28gdGhlIHR3bwotICAgdGFibGVzIG1heSB3aW5kIHVwIGJlaW5nIGRpZmZlcmVudC4gIFdlIG11c3Qgc29ydCBvdXQgdGhlIGV4dGVybmFsCi0gICBzeW1ib2wgaW5mb3JtYXRpb24gYmVmb3JlIHdlIGNhbiBzZXQgdGhlIGZpbmFsIHNpemUgb2YgdGhlIC5tZGVidWcKLSAgIHNlY3Rpb24sIGFuZCB3ZSBtdXN0IHNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGJlZm9yZSB3ZQotICAgY2FuIHJlbG9jYXRlIGFueSBzZWN0aW9ucywgYW5kIHdlIGNhbid0IGtub3cgd2hpY2ggc3ltYm9scyBhcmUKLSAgIHJlcXVpcmVkIGJ5IHJlbG9jYXRpb24gdW50aWwgd2UgcmVsb2NhdGUgdGhlIHNlY3Rpb25zLgotICAgRm9ydHVuYXRlbHksIGl0IGlzIHJlbGF0aXZlbHkgdW5saWtlbHkgdGhhdCBhbnkgc3ltYm9sIHdpbGwgYmUKLSAgIHN0cmlwcGVkIGJ1dCByZXF1aXJlZCBieSBhIHJlbG9jLiAgSW4gcGFydGljdWxhciwgaXQgY2FuIG5vdCBoYXBwZW4KLSAgIHdoZW4gZ2VuZXJhdGluZyBhIGZpbmFsIGV4ZWN1dGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfb3V0cHV0X2V4dHN5bSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBleHRzeW1faW5mbyAqZWluZm8gPSAoc3RydWN0IGV4dHN5bV9pbmZvICopIGRhdGE7Ci0gIGJvb2xlYW4gc3RyaXA7Ci0gIGFzZWN0aW9uICpzZWMsICpvdXRwdXRfc2VjdGlvbjsKLQotICBpZiAoaC0+cm9vdC5pbmR4ID09IC0yKQotICAgIHN0cmlwID0gZmFsc2U7Ci0gIGVsc2UgaWYgKCgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCSAgICB8fCAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMCkKLQkgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgICYmIChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0JCQkJICAgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICBpZiAoc3RyaXApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmVzeW0uaWZkID09IC0yKQotICAgIHsKLSAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKLSAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7Ci0gICAgICBoLT5lc3ltLndlYWtleHQgPSAwOwotICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKLSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKLQotICAgICAgaWYgKFNHSV9DT01QQVQgKGVpbmZvLT5hYmZkKQotCSAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIC8qIFVzZSB1bmRlZmluZWQgY2xhc3MuICBBbHNvLCBzZXQgY2xhc3MgYW5kIHR5cGUgZm9yIHNvbWUKLSAgICAgICAgICAgICBzcGVjaWFsIHN5bWJvbHMuICAqLwotCSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLQkgIGlmIChzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMF0pID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMV0pID09IDApCi0JICAgIHsKLQkgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0RhdGE7Ci0JICAgICAgaC0+ZXN5bS5hc3ltLnN0ID0gc3RMYWJlbDsKLQkgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIG1pcHNfZWxmX2R5bnN5bV9ydHByb2NfbmFtZXNbMl0pID09IDApCi0JICAgIHsKLQkgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLQkgICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdExhYmVsOwotCSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9Ci0JCW1pcHNfZWxmX2hhc2hfdGFibGUgKGVpbmZvLT5pbmZvKS0+cHJvY2VkdXJlX2NvdW50OwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZ3BfZGlzcCIpID09IDApCi0JICAgIHsKLQkgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLQkgICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdExhYmVsOwotCSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGVsZl9ncCAoZWluZm8tPmFiZmQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjVW5kZWZpbmVkOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCWgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0JICAvKiBXaGVuIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBzeW1ib2wgaCBpcyB0aGUgb25lIGZyb20KLQkgICAgIHRoZSBhbm90aGVyIHNoYXJlZCBsaWJyYXJ5LCBPVVRQVVRfU0VDVElPTiBtYXkgYmUgbnVsbC4gICovCi0JICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NVbmRlZmluZWQ7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X3NlY3Rpb24tPm93bmVyLCBvdXRwdXRfc2VjdGlvbik7Ci0KLQkgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1RleHQ7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmRhdGEiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY0RhdGE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NTRGF0YTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucm9kYXRhIikgPT0gMAotCQkgICAgICAgfHwgc3RyY21wIChuYW1lLCAiLnJkYXRhIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NSRGF0YTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuYnNzIikgPT0gMCkKLQkJaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY1NCc3M7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmluaXQiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY0luaXQ7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmZpbmkiKSA9PSAwKQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY0Zpbmk7Ci0JICAgICAgZWxzZQotCQloLT5lc3ltLmFzeW0uc2MgPSBzY0FiczsKLQkgICAgfQotCX0KLQotICAgICAgaC0+ZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLSAgICAgIGgtPmVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotICAgIH0KLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0gICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gaC0+cm9vdC5yb290LnUuYy5zaXplOwotICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgewotICAgICAgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY0NvbW1vbikKLQloLT5lc3ltLmFzeW0uc2MgPSBzY0JzczsKLSAgICAgIGVsc2UgaWYgKGgtPmVzeW0uYXN5bS5zYyA9PSBzY1NDb21tb24pCi0JaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotCi0gICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgICAgIGlmIChvdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCWgtPmVzeW0uYXN5bS52YWx1ZSA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICAgICArIG91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgZWxzZQotCWgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmICgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgLyogU2V0IHR5cGUgYW5kIHZhbHVlIGZvciBhIHN5bWJvbCB3aXRoIGEgZnVuY3Rpb24gc3R1Yi4gICovCi0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdFByb2M7Ci0gICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkgIGlmIChvdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5wbHQub2Zmc2V0Ci0JCQkJICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJCSAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLQl9Ci0jaWYgMCAvKiBGSVhNRT8gICovCi0gICAgICBoLT5lc3ltLmlmZCA9IDA7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoZWluZm8tPmFiZmQsIGVpbmZvLT5kZWJ1ZywgZWluZm8tPnN3YXAsCi0JCQkJICAgICAgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgICAgICZoLT5lc3ltKSkKLSAgICB7Ci0gICAgICBlaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIHJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlIGZyb20gdGhlIC5tZGVidWcgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfcHJvY2VkdXJlX3RhYmxlIChoYW5kbGUsIGFiZmQsIGluZm8sIHMsIGRlYnVnKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqczsKLSAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKmRlYnVnOwotewotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgSERSUiAqaGRyID0gJmRlYnVnLT5zeW1ib2xpY19oZWFkZXI7Ci0gIFJQRFIgKnJwZHIsICpycDsKLSAgc3RydWN0IHJwZHJfZXh0ICplcnA7Ci0gIFBUUiBydHByb2M7Ci0gIHN0cnVjdCBwZHJfZXh0ICplcGRyOwotICBzdHJ1Y3Qgc3ltX2V4dCAqZXN5bTsKLSAgY2hhciAqc3MsICoqc3Y7Ci0gIGNoYXIgKnN0cjsKLSAgdW5zaWduZWQgbG9uZyBzaXplLCBjb3VudDsKLSAgdW5zaWduZWQgbG9uZyBzaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLSAgUERSIHBkcjsKLSAgU1lNUiBzeW07Ci0gIGNvbnN0IGNoYXIgKm5vX25hbWVfZnVuYyA9IF8oInN0YXRpYyBwcm9jZWR1cmUgKG5vIG5hbWUpIik7Ci0KLSAgZXBkciA9IE5VTEw7Ci0gIHJwZHIgPSBOVUxMOwotICBlc3ltID0gTlVMTDsKLSAgc3MgPSBOVUxMOwotICBzdiA9IE5VTEw7Ci0KLSAgc3dhcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLQotICBzaW5kZXggPSBzdHJsZW4gKG5vX25hbWVfZnVuYykgKyAxOwotICBjb3VudCA9IGhkci0+aXBkTWF4OwotICBpZiAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIHNpemUgPSBzd2FwLT5leHRlcm5hbF9wZHJfc2l6ZTsKLQotICAgICAgZXBkciA9IChzdHJ1Y3QgcGRyX2V4dCAqKSBiZmRfbWFsbG9jIChzaXplICogY291bnQpOwotICAgICAgaWYgKGVwZHIgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaWYgKCEgX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIChoYW5kbGUsIChQVFIpIGVwZHIpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzaXplID0gc2l6ZW9mIChSUERSKTsKLSAgICAgIHJwID0gcnBkciA9IChSUERSICopIGJmZF9tYWxsb2MgKHNpemUgKiBjb3VudCk7Ci0gICAgICBpZiAocnBkciA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzdiA9IChjaGFyICoqKSBiZmRfbWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiBjb3VudCk7Ci0gICAgICBpZiAoc3YgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY291bnQgPSBoZHItPmlzeW1NYXg7Ci0gICAgICBzaXplID0gc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0gICAgICBlc3ltID0gKHN0cnVjdCBzeW1fZXh0ICopIGJmZF9tYWxsb2MgKHNpemUgKiBjb3VudCk7Ci0gICAgICBpZiAoZXN5bSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoISBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0gKGhhbmRsZSwgKFBUUikgZXN5bSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGNvdW50ID0gaGRyLT5pc3NNYXg7Ci0gICAgICBzcyA9IChjaGFyICopIGJmZF9tYWxsb2MgKGNvdW50KTsKLSAgICAgIGlmIChzcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgKGhhbmRsZSwgKFBUUikgc3MpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBjb3VudCA9IGhkci0+aXBkTWF4OwotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHJwKyspCi0JewotCSAgKCpzd2FwLT5zd2FwX3Bkcl9pbikgKGFiZmQsIChQVFIpIChlcGRyICsgaSksICZwZHIpOwotCSAgKCpzd2FwLT5zd2FwX3N5bV9pbikgKGFiZmQsIChQVFIpICZlc3ltW3Bkci5pc3ltXSwgJnN5bSk7Ci0JICBycC0+YWRyID0gc3ltLnZhbHVlOwotCSAgcnAtPnJlZ21hc2sgPSBwZHIucmVnbWFzazsKLQkgIHJwLT5yZWdvZmZzZXQgPSBwZHIucmVnb2Zmc2V0OwotCSAgcnAtPmZyZWdtYXNrID0gcGRyLmZyZWdtYXNrOwotCSAgcnAtPmZyZWdvZmZzZXQgPSBwZHIuZnJlZ29mZnNldDsKLQkgIHJwLT5mcmFtZW9mZnNldCA9IHBkci5mcmFtZW9mZnNldDsKLQkgIHJwLT5mcmFtZXJlZyA9IHBkci5mcmFtZXJlZzsKLQkgIHJwLT5wY3JlZyA9IHBkci5wY3JlZzsKLQkgIHJwLT5pcnBzcyA9IHNpbmRleDsKLQkgIHN2W2ldID0gc3MgKyBzeW0uaXNzOwotCSAgc2luZGV4ICs9IHN0cmxlbiAoc3ZbaV0pICsgMTsKLQl9Ci0gICAgfQotCi0gIHNpemUgPSBzaXplb2YgKHN0cnVjdCBycGRyX2V4dCkgKiAoY291bnQgKyAyKSArIHNpbmRleDsKLSAgc2l6ZSA9IEJGRF9BTElHTiAoc2l6ZSwgMTYpOwotICBydHByb2MgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAocnRwcm9jID09IE5VTEwpCi0gICAgewotICAgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnByb2NlZHVyZV9jb3VudCA9IDA7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnByb2NlZHVyZV9jb3VudCA9IGNvdW50ICsgMjsKLQotICBlcnAgPSAoc3RydWN0IHJwZHJfZXh0ICopIHJ0cHJvYzsKLSAgbWVtc2V0IChlcnAsIDAsIHNpemVvZiAoc3RydWN0IHJwZHJfZXh0KSk7Ci0gIGVycCsrOwotICBzdHIgPSAoY2hhciAqKSBydHByb2MgKyBzaXplb2YgKHN0cnVjdCBycGRyX2V4dCkgKiAoY291bnQgKyAyKTsKLSAgc3RyY3B5IChzdHIsIG5vX25hbWVfZnVuYyk7Ci0gIHN0ciArPSBzdHJsZW4gKG5vX25hbWVfZnVuYykgKyAxOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBlY29mZl9zd2FwX3JwZHJfb3V0IChhYmZkLCBycGRyICsgaSwgZXJwICsgaSk7Ci0gICAgICBzdHJjcHkgKHN0ciwgc3ZbaV0pOwotICAgICAgc3RyICs9IHN0cmxlbiAoc3ZbaV0pICsgMTsKLSAgICB9Ci0gIGVjb2ZmX3B1dF9vZmYgKGFiZmQsIChiZmRfdm1hKSAtMSwgKGJmZF9ieXRlICopIChlcnAgKyBjb3VudCktPnBfYWRyKTsKLQotICAvKiBTZXQgdGhlIHNpemUgYW5kIGNvbnRlbnRzIG9mIC5ydHByb2Mgc2VjdGlvbi4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IHNpemU7Ci0gIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIHJ0cHJvYzsKLQotICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotICBzLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLSAgaWYgKGVwZHIgIT0gTlVMTCkKLSAgICBmcmVlIChlcGRyKTsKLSAgaWYgKHJwZHIgIT0gTlVMTCkKLSAgICBmcmVlIChycGRyKTsKLSAgaWYgKGVzeW0gIT0gTlVMTCkKLSAgICBmcmVlIChlc3ltKTsKLSAgaWYgKHNzICE9IE5VTEwpCi0gICAgZnJlZSAoc3MpOwotICBpZiAoc3YgIT0gTlVMTCkKLSAgICBmcmVlIChzdik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChlcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZXBkcik7Ci0gIGlmIChycGRyICE9IE5VTEwpCi0gICAgZnJlZSAocnBkcik7Ci0gIGlmIChlc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXN5bSk7Ci0gIGlmIChzcyAhPSBOVUxMKQotICAgIGZyZWUgKHNzKTsKLSAgaWYgKHN2ICE9IE5VTEwpCi0gICAgZnJlZSAoc3YpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEEgY29tcGFyaXNvbiByb3V0aW5lIHVzZWQgdG8gc29ydCAuZ3B0YWIgZW50cmllcy4gICovCi0KLXN0YXRpYyBpbnQKLWdwdGFiX2NvbXBhcmUgKHAxLCBwMikKLSAgICAgY29uc3QgUFRSIHAxOwotICAgICBjb25zdCBQVFIgcDI7Ci17Ci0gIGNvbnN0IEVsZjMyX2dwdGFiICphMSA9IChjb25zdCBFbGYzMl9ncHRhYiAqKSBwMTsKLSAgY29uc3QgRWxmMzJfZ3B0YWIgKmEyID0gKGNvbnN0IEVsZjMyX2dwdGFiICopIHAyOwotCi0gIHJldHVybiBhMS0+Z3RfZW50cnkuZ3RfZ192YWx1ZSAtIGEyLT5ndF9lbnRyeS5ndF9nX3ZhbHVlOwotfQotCi0vKiBXZSBuZWVkIHRvIHVzZSBhIHNwZWNpYWwgbGluayByb3V0aW5lIHRvIGhhbmRsZSB0aGUgLnJlZ2luZm8gYW5kCi0gICB0aGUgLm1kZWJ1ZyBzZWN0aW9ucy4gIFdlIG5lZWQgdG8gbWVyZ2UgYWxsIGluc3RhbmNlcyBvZiB0aGVzZQotICAgc2VjdGlvbnMgdG9nZXRoZXIsIG5vdCB3cml0ZSB0aGVtIGFsbCBvdXQgc2VxdWVudGlhbGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICoqc2VjcHA7Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIGFzZWN0aW9uICpyZWdpbmZvX3NlYywgKm1kZWJ1Z19zZWMsICpncHRhYl9kYXRhX3NlYywgKmdwdGFiX2Jzc19zZWM7Ci0gIGFzZWN0aW9uICpydHByb2Nfc2VjOwotICBFbGYzMl9SZWdJbmZvIHJlZ2luZm87Ci0gIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvIGRlYnVnOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcAotICAgID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwOwotICBIRFJSICpzeW1oZHIgPSAmZGVidWcuc3ltYm9saWNfaGVhZGVyOwotICBQVFIgbWRlYnVnX2hhbmRsZSA9IE5VTEw7Ci0KLSAgLyogSWYgYWxsIHRoZSB0aGluZ3Mgd2UgbGlua2VkIHRvZ2V0aGVyIHdlcmUgUElDLCBidXQgd2UncmUKLSAgICAgcHJvZHVjaW5nIGFuIGV4ZWN1dGFibGUgKHJhdGhlciB0aGFuIGEgc2hhcmVkIG9iamVjdCksIHRoZW4gdGhlCi0gICAgIHJlc3VsdGluZyBmaWxlIGlzIENQSUMgKGkuZS4sIGl0IGNhbGxzIFBJQyBjb2RlLikgICovCi0gIGlmICghaW5mby0+c2hhcmVkICYmIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfTUlQU19QSUMpCi0gICAgewotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj0gfkVGX01JUFNfUElDOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfTUlQU19DUElDOwotICAgICAgCi0gICAgfQotCi0gIC8qIE9uIElSSVg1LCB3ZSBvbWl0IHRoZSAub3B0aW9ucyBzZWN0aW9uLiAgT24gSVJJWDYsIGhvd2V2ZXIsIHdlCi0gICAgIGluY2x1ZGUgaXQsIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHByb2Nlc3MgaXQgcXVpdGUgcmlnaHQuICAoU29tZQotICAgICBlbnRyaWVzIGFyZSBzdXBwb3NlZCB0byBiZSBtZXJnZWQuKSAgRW1waXJpY2FsbHksIHdlIHNlZW0gdG8gYmUKLSAgICAgYmV0dGVyIG9mZiBpbmNsdWRpbmcgaXQgdGhlbiBub3QuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NSkKLSAgICBmb3IgKHNlY3BwID0gJmFiZmQtPnNlY3Rpb25zOyAqc2VjcHAgIT0gTlVMTDsgc2VjcHAgPSAmKCpzZWNwcCktPm5leHQpCi0gICAgICB7Ci0JaWYgKHN0cmNtcCAoKCpzZWNwcCktPm5hbWUsIE1JUFNfRUxGX09QVElPTlNfU0VDVElPTl9OQU1FIChhYmZkKSkgPT0gMCkKLQkgIHsKLQkgICAgZm9yIChwID0gKCpzZWNwcCktPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQkgICAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkgICAgKCpzZWNwcCktPmxpbmtfb3JkZXJfaGVhZCA9IE5VTEw7Ci0JICAgICpzZWNwcCA9ICgqc2VjcHApLT5uZXh0OwotCSAgICAtLWFiZmQtPnNlY3Rpb25fY291bnQ7Ci0JICAgIAotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0KLQotICAvKiBHZXQgYSB2YWx1ZSBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgaWYgKGVsZl9ncCAoYWJmZCkgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX2dwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQllbGZfZ3AgKGFiZmQpID0gKGgtPnUuZGVmLnZhbHVlCi0JCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGVsc2UgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICBiZmRfdm1hIGxvOwotCi0JICAvKiBGaW5kIHRoZSBHUC1yZWxhdGl2ZSBzZWN0aW9uIHdpdGggdGhlIGxvd2VzdCBvZmZzZXQuICAqLwotCSAgbG8gPSAoYmZkX3ZtYSkgLTE7Ci0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIGlmIChvLT52bWEgPCBsbyAKLQkJJiYgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5zaF9mbGFncyAmIFNIRl9NSVBTX0dQUkVMKSkKLQkgICAgICBsbyA9IG8tPnZtYTsKLQotCSAgLyogQW5kIGNhbGN1bGF0ZSBHUCByZWxhdGl2ZSB0byB0aGF0LiAgKi8KLQkgIGVsZl9ncCAoYWJmZCkgPSBsbyArIEVMRl9NSVBTX0dQX09GRlNFVCAoYWJmZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uIG5lZWRzIHRvIGRvIGEgcmVsb2MKLQkgICAgIGludm9sdmluZyB0aGUgR1AgdmFsdWUsIGl0IHNob3VsZCBtYWtlIGEgcmVsb2NfZGFuZ2Vyb3VzCi0JICAgICBjYWxsYmFjayB0byB3YXJuIHRoYXQgR1AgaXMgbm90IGRlZmluZWQuICAqLwotCX0KLSAgICB9Ci0KLSAgLyogR28gdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNvbGxlY3QgdGhlIC5yZWdpbmZvIGFuZCAubWRlYnVnCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVnaW5mb19zZWMgPSBOVUxMOwotICBtZGVidWdfc2VjID0gTlVMTDsKLSAgZ3B0YWJfZGF0YV9zZWMgPSBOVUxMOwotICBncHRhYl9ic3Nfc2VjID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIucmVnaW5mbyIpID09IDApCi0JewotCSAgbWVtc2V0ICgmcmVnaW5mbywgMCwgc2l6ZW9mIHJlZ2luZm8pOwotCi0JICAvKiBXZSBoYXZlIGZvdW5kIHRoZSAucmVnaW5mbyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLQkgICAgICBFbGYzMl9SZWdJbmZvIHN1YjsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgLyogVGhlIGxpbmtlciBlbXVsYXRpb24gY29kZSBoYXMgcHJvYmFibHkgY2xvYmJlcmVkIHRoZQotICAgICAgICAgICAgICAgICBzaXplIHRvIGJlIHplcm8gYnl0ZXMuICAqLwotCSAgICAgIGlmIChpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUgPT0gMCkKLQkJaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgICAgICAoUFRSKSAmZXh0LAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCSAgICAgIHNpemVvZiBleHQpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4gKGlucHV0X2JmZCwgJmV4dCwgJnN1Yik7Ci0KLQkgICAgICByZWdpbmZvLnJpX2dwcm1hc2sgfD0gc3ViLnJpX2dwcm1hc2s7Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzBdIHw9IHN1Yi5yaV9jcHJtYXNrWzBdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1sxXSB8PSBzdWIucmlfY3BybWFza1sxXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0gfD0gc3ViLnJpX2Nwcm1hc2tbMl07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzNdIHw9IHN1Yi5yaV9jcHJtYXNrWzNdOwotCi0JICAgICAgLyogcmlfZ3BfdmFsdWUgaXMgc2V0IGJ5IHRoZSBmdW5jdGlvbgotCQkgbWlwc19lbGYzMl9zZWN0aW9uX3Byb2Nlc3Npbmcgd2hlbiB0aGUgc2VjdGlvbiBpcwotCQkgZmluYWxseSB3cml0dGVuIG91dC4gICovCi0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogU2l6ZSBoYXMgYmVlbiBzZXQgaW4gbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMgICovCi0JICBCRkRfQVNTRVJUKG8tPl9yYXdfc2l6ZSA9PSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlZ0luZm8pKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIHJlZ2luZm9fc2VjID0gbzsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIubWRlYnVnIikgPT0gMCkKLQl7Ci0JICBzdHJ1Y3QgZXh0c3ltX2luZm8gZWluZm87Ci0KLQkgIC8qIFdlIGhhdmUgZm91bmQgdGhlIC5tZGVidWcgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JICAgICBMb29rIHRocm91Z2ggYWxsIHRoZSBsaW5rX29yZGVycyBjb21wcmlzaW5nIGl0IGFuZCBtZXJnZQotCSAgICAgdGhlIGluZm9ybWF0aW9uIHRvZ2V0aGVyLiAgKi8KLQkgIHN5bWhkci0+bWFnaWMgPSBzd2FwLT5zeW1fbWFnaWM7Ci0JICAvKiBGSVhNRTogV2hhdCBzaG91bGQgdGhlIHZlcnNpb24gc3RhbXAgYmU/ICAqLwotCSAgc3ltaGRyLT52c3RhbXAgPSAwOwotCSAgc3ltaGRyLT5pbGluZU1heCA9IDA7Ci0JICBzeW1oZHItPmNiTGluZSA9IDA7Ci0JICBzeW1oZHItPmlkbk1heCA9IDA7Ci0JICBzeW1oZHItPmlwZE1heCA9IDA7Ci0JICBzeW1oZHItPmlzeW1NYXggPSAwOwotCSAgc3ltaGRyLT5pb3B0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWF1eE1heCA9IDA7Ci0JICBzeW1oZHItPmlzc01heCA9IDA7Ci0JICBzeW1oZHItPmlzc0V4dE1heCA9IDA7Ci0JICBzeW1oZHItPmlmZE1heCA9IDA7Ci0JICBzeW1oZHItPmNyZmQgPSAwOwotCSAgc3ltaGRyLT5pZXh0TWF4ID0gMDsKLQotCSAgLyogV2UgYWNjdW11bGF0ZSB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGl0c2VsZiBpbiB0aGUKLQkgICAgIGRlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQkgIGRlYnVnLmxpbmUgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZG5yID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3BkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9zeW0gPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfb3B0ID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2F1eCA9IE5VTEw7Ci0JICBkZWJ1Zy5zcyA9IE5VTEw7Ci0JICBkZWJ1Zy5zc2V4dCA9IGRlYnVnLnNzZXh0X2VuZCA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9mZHIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcmZkID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2V4dCA9IGRlYnVnLmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotCi0JICBtZGVidWdfaGFuZGxlID0gYmZkX2Vjb2ZmX2RlYnVnX2luaXQgKGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7Ci0JICBpZiAobWRlYnVnX2hhbmRsZSA9PSAoUFRSKSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCSAgICAgIEVYVFIgZXN5bTsKLQkgICAgICBiZmRfdm1hIGxhc3Q7Ci0JICAgICAgdW5zaWduZWQgaW50IGk7Ci0JICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lW10gPQotCQl7ICIudGV4dCIsICIuaW5pdCIsICIuZmluaSIsICIuZGF0YSIsCi0JCSAgICAiLnJvZGF0YSIsICIuc2RhdGEiLCAiLnNic3MiLCAiLmJzcyIgfTsKLQkgICAgICBzdGF0aWMgY29uc3QgaW50IHNjW10gPSB7IHNjVGV4dCwgc2NJbml0LCBzY0ZpbmksIHNjRGF0YSwKLQkJCQkJICBzY1JEYXRhLCBzY1NEYXRhLCBzY1NCc3MsIHNjQnNzIH07Ci0KLQkgICAgICBlc3ltLmptcHRibCA9IDA7Ci0JICAgICAgZXN5bS5jb2JvbF9tYWluID0gMDsKLQkgICAgICBlc3ltLndlYWtleHQgPSAwOwotCSAgICAgIGVzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uaWZkID0gaWZkTmlsOwotCSAgICAgIGVzeW0uYXN5bS5pc3MgPSBpc3NOaWw7Ci0JICAgICAgZXN5bS5hc3ltLnN0ID0gc3RMb2NhbDsKLQkgICAgICBlc3ltLmFzeW0ucmVzZXJ2ZWQgPSAwOwotCSAgICAgIGVzeW0uYXN5bS5pbmRleCA9IGluZGV4TmlsOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXsKLQkJICBlc3ltLmFzeW0uc2MgPSBzY1tpXTsKLQkJICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVbaV0pOwotCQkgIGlmIChzICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGVzeW0uYXN5bS52YWx1ZSA9IHMtPnZtYTsKLQkJICAgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBlc3ltLmFzeW0udmFsdWUgPSBsYXN0OwotCi0JCSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoYWJmZCwgJmRlYnVnLCBzd2FwLAotCQkJCQkJICAgICAgbmFtZVtpXSwgJmVzeW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgICAgICBwICE9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQkgICAgICAgcCA9IHAtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLQkgICAgICBiZmQgKmlucHV0X2JmZDsKLQkgICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqaW5wdXRfc3dhcDsKLQkgICAgICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBpbnB1dF9kZWJ1ZzsKLQkgICAgICBjaGFyICplcmF3X3NyYzsKLQkgICAgICBjaGFyICplcmF3X2VuZDsKLQotCSAgICAgIGlmIChwLT50eXBlICE9IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2ZpbGxfbGlua19vcmRlcikKLQkJICAgIGNvbnRpbnVlOwotCQkgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCSAgICAgIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0JICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoaW5wdXRfYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JCSAgfHwgKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCSAgICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCkgPT0gTlVMTCkKLQkJewotCQkgIC8qIEkgZG9uJ3Qga25vdyB3aGF0IGEgbm9uIE1JUFMgRUxGIGJmZCB3b3VsZCBiZQotCQkgICAgIGRvaW5nIHdpdGggYSAubWRlYnVnIHNlY3Rpb24sIGJ1dCBJIGRvbid0IHJlYWxseQotCQkgICAgIHdhbnQgdG8gZGVhbCB3aXRoIGl0LiAgKi8KLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaW5wdXRfc3dhcCA9IChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKQotCQkJICAgIC0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCk7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChwLT5zaXplID09IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgICAgICAvKiBUaGUgRUNPRkYgbGlua2luZyBjb2RlIGV4cGVjdHMgdGhhdCB3ZSBoYXZlIGFscmVhZHkKLQkJIHJlYWQgaW4gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBhbmQgc2V0IHVwIGFuCi0JCSBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZSwgc28gd2UgZG8gdGhhdCBub3cuICAqLwotCSAgICAgIGlmICghIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICAmaW5wdXRfZGVidWcpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAoISAoYmZkX2Vjb2ZmX2RlYnVnX2FjY3VtdWxhdGUKLQkJICAgICAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLCBzd2FwLCBpbnB1dF9iZmQsCi0JCSAgICAgICZpbnB1dF9kZWJ1ZywgaW5wdXRfc3dhcCwgaW5mbykpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICAvKiBMb29wIHRocm91Z2ggdGhlIGV4dGVybmFsIHN5bWJvbHMuICBGb3IgZWFjaCBvbmUgd2l0aAotCQkgaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24sIHRyeSB0byBmaW5kIHRoZSBzeW1ib2wgaW4KLQkJIHRoZSBsaW5rZXIgZ2xvYmFsIGhhc2ggdGFibGUgYW5kIHNhdmUgdGhlIGluZm9ybWF0aW9uCi0JCSBmb3IgdGhlIG91dHB1dCBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLQkgICAgICBlcmF3X3NyYyA9IGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dDsKLQkgICAgICBlcmF3X2VuZCA9IChlcmF3X3NyYwotCQkJICArIChpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWV4dE1heAotCQkJICAgICAqIGlucHV0X3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKSk7Ci0JICAgICAgZm9yICg7Ci0JCSAgIGVyYXdfc3JjIDwgZXJhd19lbmQ7Ci0JCSAgIGVyYXdfc3JjICs9IGlucHV0X3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKQotCQl7Ci0JCSAgRVhUUiBleHQ7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgKCppbnB1dF9zd2FwLT5zd2FwX2V4dF9pbikgKGlucHV0X2JmZCwgKFBUUikgZXJhd19zcmMsICZleHQpOwotCQkgIGlmIChleHQuYXN5bS5zYyA9PSBzY05pbAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIG5hbWUgPSBpbnB1dF9kZWJ1Zy5zc2V4dCArIGV4dC5hc3ltLmlzczsKLQkJICBoID0gbWlwc19lbGZfbGlua19oYXNoX2xvb2t1cCAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCQkgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMIHx8IGgtPmVzeW0uaWZkICE9IC0yKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoZXh0LmlmZCAhPSAtMSkKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoZXh0LmlmZAotCQkJCSAgPCBpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLQkJICAgICAgZXh0LmlmZCA9IGlucHV0X2RlYnVnLmlmZG1hcFtleHQuaWZkXTsKLQkJICAgIH0KLQotCQkgIGgtPmVzeW0gPSBleHQ7Ci0JCX0KLQotCSAgICAgIC8qIEZyZWUgdXAgdGhlIGluZm9ybWF0aW9uIHdlIGp1c3QgcmVhZC4gICovCi0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcubGluZSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZG5yKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9wZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3N5bSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfb3B0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9hdXgpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5zc2V4dCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZmRyKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9yZmQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dCk7Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpICYmIGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSAucnRwcm9jIHNlY3Rpb24uICAqLwotCSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLQkgICAgICBpZiAocnRwcm9jX3NlYyA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQgfCBTRUNfUkVBRE9OTFkpOwotCi0JCSAgcnRwcm9jX3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucnRwcm9jIik7Ci0JCSAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcnRwcm9jX3NlYywgZmxhZ3MpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcnRwcm9jX3NlYywgNCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsCi0JCQkJCQkgICAgIGluZm8sIHJ0cHJvY19zZWMsICZkZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBCdWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLQkgIGVpbmZvLmFiZmQgPSBhYmZkOwotCSAgZWluZm8uaW5mbyA9IGluZm87Ci0JICBlaW5mby5kZWJ1ZyA9ICZkZWJ1ZzsKLQkgIGVpbmZvLnN3YXAgPSBzd2FwOwotCSAgZWluZm8uZmFpbGVkID0gZmFsc2U7Ci0JICBtaXBzX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICAgICBtaXBzX2VsZl9vdXRwdXRfZXh0c3ltLAotCQkJCSAgICAgICAoUFRSKSAmZWluZm8pOwotCSAgaWYgKGVpbmZvLmZhaWxlZCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5tZGVidWcgc2VjdGlvbi4gICovCi0JICBvLT5fcmF3X3NpemUgPSBiZmRfZWNvZmZfZGVidWdfc2l6ZSAoYWJmZCwgJmRlYnVnLCBzd2FwKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIG1kZWJ1Z19zZWMgPSBvOwotCX0KLQotICAgICAgaWYgKHN0cm5jbXAgKG8tPm5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0JewotCSAgY29uc3QgY2hhciAqc3VibmFtZTsKLQkgIHVuc2lnbmVkIGludCBjOwotCSAgRWxmMzJfZ3B0YWIgKnRhYjsKLQkgIEVsZjMyX0V4dGVybmFsX2dwdGFiICpleHRfdGFiOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIC8qIFRoZSAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzIHNlY3Rpb25zIGhvbGQKLQkgICAgIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBzbWFsbCBkYXRhIGFyZWEgd291bGQKLQkgICAgIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiB0aGUgLUcgc3dpdGNoLiAgVGhlc2Ugc2VjdGlvbnMKLQkgICAgIG5vdCB1c2VkIGluIGV4ZWN1dGFibGVzIGZpbGVzLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLQkgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCQkgICBwID0gcC0+bmV4dCkKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCi0JCSAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCQljb250aW51ZTsKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JCSAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSAgICAgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkJfQotCi0JICAgICAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcwotCQkgY3VycmVudGx5IG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICAgICAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICAgICAgLyogUmVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZm9yIChzZWNwcCA9ICZhYmZkLT5zZWN0aW9uczsKLQkJICAgKnNlY3BwICE9IG87Ci0JCSAgIHNlY3BwID0gJigqc2VjcHApLT5uZXh0KQotCQk7Ci0JICAgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgICAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgaXMgb25lIGdwdGFiIGZvciBpbml0aWFsaXplZCBkYXRhLCBhbmQgb25lIGZvcgotCSAgICAgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2RhdGEiKSA9PSAwKQotCSAgICBncHRhYl9kYXRhX3NlYyA9IG87Ci0JICBlbHNlIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2JzcyIpID09IDApCi0JICAgIGdwdGFiX2Jzc19zZWMgPSBvOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogaWxsZWdhbCBzZWN0aW9uIG5hbWUgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBUaGUgbGlua2VyIHNjcmlwdCBhbHdheXMgY29tYmluZXMgLmdwdGFiLmRhdGEgYW5kCi0JICAgICAuZ3B0YWIuc2RhdGEgaW50byAuZ3B0YWIuc2RhdGEsIGFuZCBsaWtld2lzZSBmb3IKLQkgICAgIC5ncHRhYi5ic3MgYW5kIC5ncHRhYi5zYnNzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcwotCSAgICAgbm8gLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBpbiB3aGljaAotCSAgICAgY2FzZSB3ZSBtdXN0IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3VibmFtZSA9IG8tPm5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdWJuYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKG8gPT0gZ3B0YWJfZGF0YV9zZWMpCi0JCW8tPm5hbWUgPSAiLmdwdGFiLmRhdGEiOwotCSAgICAgIGVsc2UKLQkJby0+bmFtZSA9ICIuZ3B0YWIuYnNzIjsKLQkgICAgICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICAgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIFNldCB1cCB0aGUgZmlyc3QgZW50cnkuICAqLwotCSAgYyA9IDE7Ci0JICB0YWIgPSAoRWxmMzJfZ3B0YWIgKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoRWxmMzJfZ3B0YWIpKTsKLQkgIGlmICh0YWIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGFiWzBdLmd0X2hlYWRlci5ndF9jdXJyZW50X2dfdmFsdWUgPSBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X3VudXNlZCA9IDA7Ci0KLQkgIC8qIENvbWJpbmUgdGhlIGlucHV0IHNlY3Rpb25zLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGdwZW50cnk7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIENvbWJpbmUgdGhlIGdwdGFiIGVudHJpZXMgZm9yIHRoaXMgaW5wdXQgc2VjdGlvbiBvbmUKLQkJIGJ5IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgaW5wdXQgZ3B0YWIgZW50cmllcyBhcmUKLQkJIHNvcnRlZCBieSBhc2NlbmRpbmcgLUcgdmFsdWUuICAqLwotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoZ3BlbnRyeSA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIpOwotCQkgICBncGVudHJ5IDwgc2l6ZTsKLQkJICAgZ3BlbnRyeSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkKLQkJewotCQkgIEVsZjMyX0V4dGVybmFsX2dwdGFiIGV4dF9ncHRhYjsKLQkJICBFbGYzMl9ncHRhYiBpbnRfZ3B0YWI7Ci0JCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JCSAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0JCSAgYm9vbGVhbiBleGFjdDsKLQkJICB1bnNpZ25lZCBpbnQgbG9vazsKLQotCQkgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSAmZXh0X2dwdGFiLAotCQkJICBncGVudHJ5LCBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkpKQotCQkgICAgewotCQkgICAgICBmcmVlICh0YWIpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBiZmRfbWlwc19lbGYzMl9zd2FwX2dwdGFiX2luIChpbnB1dF9iZmQsICZleHRfZ3B0YWIsCi0JCQkJCQkmaW50X2dwdGFiKTsKLQkJICB2YWwgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfZ192YWx1ZTsKLQkJICBhZGQgPSBpbnRfZ3B0YWIuZ3RfZW50cnkuZ3RfYnl0ZXMgLSBsYXN0OwotCi0JCSAgZXhhY3QgPSBmYWxzZTsKLQkJICBmb3IgKGxvb2sgPSAxOyBsb29rIDwgYzsgbG9vaysrKQotCQkgICAgewotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPj0gdmFsKQotCQkJdGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2J5dGVzICs9IGFkZDsKLQotCQkgICAgICBpZiAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPT0gdmFsKQotCQkJZXhhY3QgPSB0cnVlOwotCQkgICAgfQotCi0JCSAgaWYgKCEgZXhhY3QpCi0JCSAgICB7Ci0JCSAgICAgIEVsZjMyX2dwdGFiICpuZXdfdGFiOwotCQkgICAgICB1bnNpZ25lZCBpbnQgbWF4OwotCi0JCSAgICAgIC8qIFdlIG5lZWQgYSBuZXcgdGFibGUgZW50cnkuICAqLwotCQkgICAgICBuZXdfdGFiID0gKChFbGYzMl9ncHRhYiAqKQotCQkJCSBiZmRfcmVhbGxvYyAoKFBUUikgdGFiLAotCQkJCQkgICAgICAoYyArIDEpICogc2l6ZW9mIChFbGYzMl9ncHRhYikpKTsKLQkJICAgICAgaWYgKG5ld190YWIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgZnJlZSAodGFiKTsKLQkJCSAgcmV0dXJuIGZhbHNlOwotCQkJfQotCQkgICAgICB0YWIgPSBuZXdfdGFiOwotCQkgICAgICB0YWJbY10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA9IHZhbDsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2J5dGVzID0gYWRkOwotCi0JCSAgICAgIC8qIE1lcmdlIGluIHRoZSBzaXplIGZvciB0aGUgbmV4dCBzbWFsbGVzdCAtRwotCQkJIHZhbHVlLCBzaW5jZSB0aGF0IHdpbGwgYmUgaW1wbGllZCBieSB0aGlzIG5ldwotCQkJIHZhbHVlLiAgKi8KLQkJICAgICAgbWF4ID0gMDsKLQkJICAgICAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJCXsKLQkJCSAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlIDwgdmFsCi0JCQkgICAgICAmJiAobWF4ID09IDAKLQkJCQkgIHx8ICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZQotCQkJCSAgICAgID4gdGFiW21heF0uZ3RfZW50cnkuZ3RfZ192YWx1ZSkpKQotCQkJICAgIG1heCA9IGxvb2s7Ci0JCQl9Ci0JCSAgICAgIGlmIChtYXggIT0gMCkKLQkJCXRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyArPQotCQkJICB0YWJbbWF4XS5ndF9lbnRyeS5ndF9ieXRlczsKLQotCQkgICAgICArK2M7Ci0JCSAgICB9Ci0KLQkJICBsYXN0ID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzOwotCQl9Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotCSAgLyogVGhlIHRhYmxlIG11c3QgYmUgc29ydGVkIGJ5IC1HIHZhbHVlLiAgKi8KLQkgIGlmIChjID4gMikKLQkgICAgcXNvcnQgKHRhYiArIDEsIGMgLSAxLCBzaXplb2YgKHRhYlswXSksIGdwdGFiX2NvbXBhcmUpOwotCi0JICAvKiBTd2FwIG91dCB0aGUgdGFibGUuICAqLwotCSAgZXh0X3RhYiA9ICgoRWxmMzJfRXh0ZXJuYWxfZ3B0YWIgKikKLQkJICAgICBiZmRfYWxsb2MgKGFiZmQsIGMgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2dwdGFiKSkpOwotCSAgaWYgKGV4dF90YWIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZyZWUgKHRhYik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0JICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfZ3B0YWJfb3V0IChhYmZkLCB0YWIgKyBpLCBleHRfdGFiICsgaSk7Ci0JICBmcmVlICh0YWIpOwotCi0JICBvLT5fcmF3X3NpemUgPSBjICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9ncHRhYik7Ci0JICBvLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRfdGFiOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgaWYgKCEgYmZkX2VsZjMyX2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgY29tcHV0ZWQgc2VjdGlvbnMuICAqLwotCi0gIGlmIChyZWdpbmZvX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLQotICAgICAgYmZkX21pcHNfZWxmMzJfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgJnJlZ2luZm8sICZleHQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCByZWdpbmZvX3NlYywgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG1kZWJ1Z19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYWJmZC0+b3V0cHV0X2hhc19iZWd1bik7Ci0gICAgICBpZiAoISBiZmRfZWNvZmZfd3JpdGVfYWNjdW11bGF0ZWRfZGVidWcgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1ZywKLQkJCQkJICAgICAgIHN3YXAsIGluZm8sCi0JCQkJCSAgICAgICBtZGVidWdfc2VjLT5maWxlcG9zKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJmZF9lY29mZl9kZWJ1Z19mcmVlIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGluZm8pOwotICAgIH0KLQotICBpZiAoZ3B0YWJfZGF0YV9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBncHRhYl9kYXRhX3NlYywKLQkJCQkgICAgICBncHRhYl9kYXRhX3NlYy0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGdwdGFiX2Jzc19zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBncHRhYl9ic3Nfc2VjLAotCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBncHRhYl9ic3Nfc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQotICAgIHsKLSAgICAgIHJ0cHJvY19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5ydHByb2MiKTsKLSAgICAgIGlmIChydHByb2Nfc2VjICE9IE5VTEwpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBydHByb2Nfc2VjLAotCQkJCQkgIHJ0cHJvY19zZWMtPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwKLQkJCQkJICBydHByb2Nfc2VjLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgTUlQUyBFTEYgSEkxNiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJlbGhpLCByZWxsbywgY29udGVudHMsIGFkZGVuZCkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxoaTsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGxvOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBiZmRfdm1hIGluc247Ci0gIGJmZF92bWEgYWRkbG87Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotCi0gIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGxvLT5yX29mZnNldCk7Ci0gIGFkZGxvICY9IDB4ZmZmZjsKLQotICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBhZGRsbzsKLQotICBpZiAoKGFkZGxvICYgMHg4MDAwKSAhPSAwKQotICAgIGFkZGVuZCAtPSAweDEwMDAwOwotICBpZiAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCkKLSAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgKGluc24gJiAweGZmZmYwMDAwKSB8ICgoYWRkZW5kID4+IDE2KSAmIDB4ZmZmZiksCi0JICAgICAgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotfQotCi0vKiBIYW5kbGUgYSBNSVBTIEVMRiBsb2NhbCBHT1QxNiByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9yZWxvY2F0ZV9nb3RfbG9jYWwgKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgc2dvdCwgcmVsaGksIHJlbGxvLAotCQkJICAgICBjb250ZW50cywgYWRkZW5kKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGhpOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsbG87Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBhc3NpZ25lZF9nb3RubzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3ZtYSBhZGRsbzsKLSAgYmZkX3ZtYSBhZGRyZXNzOwotICBiZmRfdm1hIGhpcGFnZTsKLSAgYmZkX2J5dGUgKmdvdF9jb250ZW50czsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0KLSAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWxoaS0+cl9vZmZzZXQpOwotCi0gIGFkZGxvID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbGxvLT5yX29mZnNldCk7Ci0gIGFkZGxvICY9IDB4ZmZmZjsKLQotICBhZGRlbmQgKz0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgKyBhZGRsbzsKLQotICBpZiAoKGFkZGxvICYgMHg4MDAwKSAhPSAwKQotICAgIGFkZGVuZCAtPSAweDEwMDAwOwotICBpZiAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCkKLSAgICBhZGRlbmQgKz0gMHgxMDAwMDsKLQotICAvKiBHZXQgYSBnb3QgZW50cnkgcmVwcmVzZW50aW5nIHJlcXVlc3RlZCBoaXBhZ2UuICAqLwotICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0gIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLSAgYXNzaWduZWRfZ290bm8gPSBnLT5hc3NpZ25lZF9nb3RubzsKLSAgZ290X2NvbnRlbnRzID0gc2dvdC0+Y29udGVudHM7Ci0gIGhpcGFnZSA9IGFkZGVuZCAmIDB4ZmZmZjAwMDA7Ci0KLSAgZm9yIChpID0gTUlQU19SRVNFUlZFRF9HT1ROTzsgaSA8IGFzc2lnbmVkX2dvdG5vOyBpKyspCi0gICAgewotICAgICAgYWRkcmVzcyA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgZ290X2NvbnRlbnRzICsgaSAqIDQpOwotICAgICAgaWYgKGhpcGFnZSA9PSAoYWRkcmVzcyAmIDB4ZmZmZjAwMDApKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoaSA9PSBhc3NpZ25lZF9nb3RubykKLSAgICB7Ci0gICAgICBpZiAoYXNzaWduZWRfZ290bm8gPj0gZy0+bG9jYWxfZ290bm8pCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJtb3JlIGdvdCBlbnRyaWVzIGFyZSBuZWVkZWQgZm9yIGhpcGFnZSByZWxvY2F0aW9ucyIpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBoaXBhZ2UsIGdvdF9jb250ZW50cyArIGFzc2lnbmVkX2dvdG5vICogNCk7Ci0gICAgICArK2ctPmFzc2lnbmVkX2dvdG5vOwotICAgIH0KLQotICBpID0gLSBFTEZfTUlQU19HUF9PRkZTRVQgKG91dHB1dF9iZmQpICsgaSAqIDQ7Ci0gIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgKGluc24gJiAweGZmZmYwMDAwKSB8IChpICYgMHhmZmZmKSwKLQkgICAgICBjb250ZW50cyArIHJlbGhpLT5yX29mZnNldCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBNSVBTIEVMRiBDQUxMMTYgcmVsb2MgYW5kIGdsb2JhbCBHT1QxNiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZl9yZWxvY2F0ZV9nbG9iYWxfZ290IChpbnB1dF9iZmQsIHJlbCwgY29udGVudHMsIG9mZnNldCkKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIGJmZF92bWEgaW5zbjsKLQotICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JICAgICAgKGluc24gJiAweGZmZmYwMDAwKSB8IChvZmZzZXQgJiAweGZmZmYpLAotCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgTUlQUyBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzaXplX3QgbG9jc3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIGFzZWN0aW9uICpzZ290LCAqc3JlbG9jLCAqc2NwdDsKLSAgYmZkICpkeW5vYmo7Ci0gIGJmZF92bWEgZ3A7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQ7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLSAgaWYgKGR5bm9iaiA9PSBOVUxMIHx8ICEgU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkpCi0gICAgc2NwdCA9IE5VTEw7Ci0gIGVsc2UKLSAgICBzY3B0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb21wYWN0X3JlbCIpOwotICBnID0gTlVMTDsKLQotICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotICAgICAgZXh0c3ltb2ZmID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBleHRzeW1vZmYgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgIH0KLQotICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChvdXRwdXRfYmZkKTsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICptaDsKLSAgICAgIGludCBvdGhlcjsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByOwotCi0gICAgICByX3R5cGUgPSBFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPT0gUl9NSVBTX0dOVV9WVElOSEVSSVQKLQkgIHx8IHJfdHlwZSA9PSBSX01JUFNfR05VX1ZURU5UUlkpCi0JY29udGludWU7Ci0gICAgICBpZiAoKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpIFJfTUlQU19tYXgpCi0JICAmJiByX3R5cGUgIT0gUl9NSVBTMTZfMjYKLQkgICYmIHJfdHlwZSAhPSBSX01JUFMxNl9HUFJFTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAocl90eXBlID09IFJfTUlQUzE2XzI2KQotCWhvd3RvID0gJmVsZl9taXBzMTZfanVtcF9ob3d0bzsKLSAgICAgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl9HUFJFTCkKLQlob3d0byA9ICZlbGZfbWlwczE2X2dwcmVsX2hvd3RvOwotICAgICAgZWxzZQotCWhvd3RvID0gZWxmX21pcHNfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChkeW5vYmogIT0gTlVMTAotCSAgJiYgKHJfdHlwZSA9PSBSX01JUFNfQ0FMTDE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HT1QxNgotCSAgICAgIHx8IHJfdHlwZSA9PSBSX01JUFNfQ0FMTF9ISTE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19DQUxMX0xPMTYKLQkgICAgICB8fCByX3R5cGUgPT0gUl9NSVBTX0dPVF9ISTE2Ci0JICAgICAgfHwgcl90eXBlID09IFJfTUlQU19HT1RfTE8xNikpCi0JewotCSAgLyogV2UgbmVlZCB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICAgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotCSAgICAgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotCSAgICAgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgLyogTWl4IGluIHRoZSBjaGFuZ2UgaW4gR1AgYWRkcmVzcyBmb3IgYSBHUCByZWxhdGl2ZSByZWxvYy4gICovCi0gICAgICBpZiAocl90eXBlICE9IFJfTUlQU19HUFJFTDE2Ci0JICAmJiByX3R5cGUgIT0gUl9NSVBTX0xJVEVSQUwKLQkgICYmIHJfdHlwZSAhPSBSX01JUFNfR1BSRUwzMgotCSAgJiYgcl90eXBlICE9IFJfTUlQUzE2X0dQUkVMKQotCWFkZGVuZCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGdwID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJICAgICAoaW5mbywKLQkJICAgICAgXygiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB3aGVuIEdQIG5vdCBkZWZpbmVkIiksCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT25seSBnaXZlIHRoZSBlcnJvciBvbmNlIHBlciBsaW5rLiAgKi8KLQkgICAgICBncCA9IDQ7Ci0JICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkgICAgfQotCi0JICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgICAgICB8fCAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkKLQkJICAmJiBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0gIT0gTlVMTCkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGEgc2VjdGlvbi4gIFRoZSBjdXJyZW50Ci0JCSBhZGRlbmQgaW4gdGhlIGluc3RydWN0aW9uIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJIElOUFVUX1NFQ1RJT04tPnZtYSBhbmQgdGhlIEdQIHZhbHVlIG9mIElOUFVUX0JGRC4gIFdlCi0JCSBtdXN0IGNoYW5nZSB0aGlzIHRvIGJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCi0JCSBmaW5hbCBkZWZpbml0aW9uICh3aGljaCB3aWxsIGVuZCB1cCBpbiBSRUxPQ0FUSU9OKQotCQkgYW5kIHRoZSBHUCB2YWx1ZSBvZiBPVVRQVVRfQkZEICh3aGljaCBpcyBpbiBHUCkuICAqLwotCSAgICAgIGFkZGVuZCA9IGVsZl9ncCAoaW5wdXRfYmZkKSAtIGdwOwotCSAgICB9Ci0JICBlbHNlIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBkb2luZyBhIGZpbmFsIGxpbmsuICBUaGUgY3VycmVudCBhZGRlbmQgaW4gdGhlCi0JCSBpbnN0cnVjdGlvbiBpcyBzaW1wbHkgdGhlIGRlc2lyZWQgb2Zmc2V0IGludG8gdGhlCi0JCSBzeW1ib2wgKG5vcm1hbGx5IHplcm8pLiAgV2Ugd2FudCB0aGUgaW5zdHJ1Y3Rpb24gdG8KLQkJIGhvbGQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmluYWwgZGVmaW5pdGlvbiBvZgotCQkgdGhlIHN5bWJvbCAod2hpY2ggd2lsbCBlbmQgdXAgaW4gUkVMT0NBVElPTikgYW5kIHRoZQotCQkgR1AgdmFsdWUgb2YgT1VUUFVUX0JGRCAod2hpY2ggaXMgaW4gR1ApLiAgKi8KLQkgICAgICBhZGRlbmQgPSAtIGdwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBhcmUgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCBhbmQgd2UgYXJlbid0Ci0JCSBnb2luZyB0byBkZWZpbmUgdGhpcyBzeW1ib2wsIHNvIHdlIGp1c3QgbGVhdmUgdGhlCi0JCSBpbnN0cnVjdGlvbiBhbG9uZS4gICovCi0JICAgICAgYWRkZW5kID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLQkgICAgIGFueXRoaW5nLCB1bmxlc3MgdGhlIHJlbG9jIGlzIGFnYWluc3QgYSBzZWN0aW9uIHN5bWJvbCwKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotCSAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA+PSBsb2NzeW1jb3VudAotCSAgICAgIHx8IChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKQotCQkgICYmIGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XSA9PSBOVUxMKSkKLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX1NFQ1RJT04pCi0JCXIgPSBiZmRfcmVsb2Nfb2s7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCi0JCSAgLyogSXQgd291bGQgYmUgbG9naWNhbCB0byBhZGQgc3ltLT5zdF92YWx1ZSBoZXJlLAotCQkgICAgIGJ1dCBJcml4IDUgc29tZXRpbWVzIGdlbmVyYXRlcyBhIGdhcmJhZ2Ugc3ltYm9sCi0JCSAgICAgdmFsdWUuICAqLwotCQkgIGFkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQ7Ci0KLQkJICAvKiBJZiB0aGlzIGlzIEhJMTYgb3IgR09UMTYgd2l0aCBhbiBhc3NvY2lhdGVkIExPMTYsCi0JCSAgICAgYWRqdXN0IHRoZSBhZGRlbmQgYWNjb3JkaW5nbHkuICBPdGhlcndpc2UsIGp1c3QKLQkJICAgICByZWxvY2F0ZS4gICovCi0JCSAgaWYgKHJfdHlwZSA9PSBSX01JUFNfNjQgJiYgYmZkX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JCSAgICByID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIGlucHV0X2JmZCwKLQkJCQkJCWFkZGVuZCwKLQkJCQkJCWNvbnRlbnRzICsgcmVsLT5yX29mZnNldCArIDQpOwotCQkgIGVsc2UgaWYgKHJfdHlwZSAhPSBSX01JUFNfSEkxNiAmJiByX3R5cGUgIT0gUl9NSVBTX0dPVDE2KQotCQkgICAgciA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKGhvd3RvLCBpbnB1dF9iZmQsCi0JCQkJCQlhZGRlbmQsCi0JCQkJCQljb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JCSAgICAgIC8qIEFzIGEgR05VIGV4dGVuc2lvbiwgcGVybWl0IGFuIGFyYml0cmFyeQotCQkJIG51bWJlciBvZiBSX01JUFNfSEkxNiByZWxvY3MgYmVmb3JlIHRoZQotCQkJIFJfTUlQU19MTzE2IHJlbG9jLiAgVGhpcyBwZXJtaXRzIGdjYyB0byBlbWl0Ci0JCQkgdGhlIEhJIGFuZCBMTyByZWxvY3MgaXRzZWxmLiAgKi8KLQkJICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfR09UMTYpCi0JCQlsb3JlbCA9IHJlbCArIDE7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZm9yIChsb3JlbCA9IHJlbCArIDE7Ci0JCQkgICAgICAgKGxvcmVsIDwgcmVsZW5kCi0JCQkJJiYgKEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykKLQkJCQkgICAgPT0gUl9NSVBTX0hJMTYpKTsKLQkJCSAgICAgICBsb3JlbCsrKQotCQkJICAgIDsKLQkJCX0KLQkJICAgICAgaWYgKGxvcmVsIDwgcmVsZW5kCi0JCQkgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NSVBTX0xPMTYpCi0JCQl7Ci0JCQkgIG1pcHNfZWxmX3JlbG9jYXRlX2hpMTYgKGlucHV0X2JmZCwgcmVsLCBsb3JlbCwKLQkJCQkJCSAgY29udGVudHMsIGFkZGVuZCk7Ci0JCQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXIgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkJICAgIGFkZGVuZCwKLQkJCQkJCSAgICBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCSAgYm9vbGVhbiBsb2NhbDsKLQkgIGJvb2xlYW4gdW5kZWZpbmVkX2Vycm9yOwotCi0JICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0JICB1bmRlZmluZWRfZXJyb3IgPSBmYWxzZTsKLQkgIHN5bSA9IE5VTEw7Ci0JICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgICAgICB8fCAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkKLQkJICAmJiBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF0gIT0gTlVMTCkpCi0JICAgIHsKLQkgICAgICBsb2NhbCA9IHRydWU7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgICAgICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIC8qIEl0IHdvdWxkIGJlIGxvZ2ljYWwgdG8gYWx3YXlzIGFkZCBzeW0tPnN0X3ZhbHVlIGhlcmUsCi0JCSBidXQgSXJpeCA1IHNvbWV0aW1lcyBnZW5lcmF0ZXMgYSBnYXJiYWdlIHN5bWJvbAotCQkgdmFsdWUuICAqLwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSAhPSBTVFRfU0VDVElPTikKLQkJcmVsb2NhdGlvbiArPSBzeW0tPnN0X3ZhbHVlOwotCi0JICAgICAgLyogbWlwczE2IHRleHQgbGFiZWxzIHNob3VsZCBiZSB0cmVhdGVkIGFzIG9kZC4gICovCi0JICAgICAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNikKLQkJKytyZWxvY2F0aW9uOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsb25nIGluZHg7Ci0KLQkgICAgICBsb2NhbCA9IGZhbHNlOwotCSAgICAgIGluZHggPSByX3N5bW5keCAtIGV4dHN5bW9mZjsKLQkgICAgICBoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkJaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgICAgIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfZ3BfZGlzcCIpID09IDApCi0JCXsKLQkJICBpZiAoZ3AgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19kYW5nZXJvdXMpCi0JCQkgICAgIChpbmZvLAotCQkJICAgICAgXygiX2dwX2Rpc3AgdXNlZCB3aGVuIEdQIG5vdCBkZWZpbmVkIiksCi0JCQkgICAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIC8qIE9ubHkgZ2l2ZSB0aGUgZXJyb3Igb25jZSBwZXIgbGluay4gICovCi0JCSAgICAgIGdwID0gNDsKLQkJICAgICAgX2JmZF9zZXRfZ3BfdmFsdWUgKG91dHB1dF9iZmQsIGdwKTsKLQkJICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzZWMgPSBpbnB1dF9zZWN0aW9uOwotCQkgICAgICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCQkJcmVsb2NhdGlvbiA9IChncAotCQkJCSAgICAgIC0gKHJlbC0+cl9vZmZzZXQKLQkJCQkJICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIHNlYy0+b3V0cHV0X29mZnNldCkpOwotCQkgICAgICBlbHNlCi0JCQlyZWxvY2F0aW9uID0gZ3AgLSByZWwtPnJfb2Zmc2V0OwotCQkgICAgICBpZiAocl90eXBlID09IFJfTUlQU19MTzE2KQotCQkJcmVsb2NhdGlvbiArPSA0OwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCXsKLQkJICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgaWYgKHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgIHJlbG9jYXRpb24gPSAwOwotCQkgIGVsc2UKLQkJICAgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJcmVsb2NhdGlvbiA9IDA7Ci0JICAgICAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCQlyZWxvY2F0aW9uID0gMDsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQ19MSU5LIikgPT0gMCkKLQkJewotCQkgIC8qIElmIHRoaXMgaXMgYSBkeW5hbWljIGxpbmssIHdlIHNob3VsZCBoYXZlIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgIGEgX0RZTkFNSUNfTElOSyBzeW1ib2wgaW4KLSAgICAgICAgICAgICAgICAgICAgIG1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLiAgT3RoZXJ3aXNlLCB3ZQotICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGRlZmluZSB0aGUgc3ltYm9sIHdpdGggYSB2YWx1ZSBvZiAwLgotICAgICAgICAgICAgICAgICAgICAgRklYTUU6IEl0IHNob3VsZCBwcm9iYWJseSBnZXQgaW50byB0aGUgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgICB0YWJsZSBzb21laG93IGFzIHdlbGwuICAqLwotCQkgIEJGRF9BU1NFUlQgKCEgaW5mby0+c2hhcmVkKTsKLQkJICBCRkRfQVNTRVJUIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJCSAgICAgICAiLmR5bmFtaWMiKSA9PSBOVUxMKTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCSAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkJICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgdW5kZWZpbmVkX2Vycm9yID0gdHJ1ZTsKLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICB9Ci0KLQkgIG1oID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIG90aGVyID0gaC0+b3RoZXI7Ci0JICBlbHNlIGlmIChzeW0gIT0gTlVMTCkKLQkgICAgb3RoZXIgPSBzeW0tPnN0X290aGVyOwotCSAgZWxzZQotCSAgICBvdGhlciA9IDA7Ci0KLQkgIC8qIElmIHRoaXMgZnVuY3Rpb24gaGFzIGFuIGZuX3N0dWIsIHRoZW4gaXQgaXMgYSBtaXBzMTYKLQkgICAgIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIGEgc3R1YiBpZiBpdCBpcyBjYWxsZWQgYnkgYSAzMiBiaXQKLQkgICAgIGZ1bmN0aW9uLiAgSWYgdGhpcyByZWxvYyBpcyBhbnl0aGluZyBvdGhlciB0aGFuIGEgMTYgYml0Ci0JICAgICBjYWxsLCByZWRpcmVjdCB0aGUgcmVsb2MgdG8gdGhlIHN0dWIuICBXZSBkb24ndCByZWRpcmVjdAotCSAgICAgcmVsb2NzIGZyb20gb3RoZXIgc3R1YiBmdW5jdGlvbnMuICAqLwotCSAgaWYgKHJfdHlwZSAhPSBSX01JUFMxNl8yNgotCSAgICAgICYmICgobWggIT0gTlVMTAotCQkgICAmJiBtaC0+Zm5fc3R1YiAhPSBOVUxMKQotCQkgIHx8IChtaCA9PSBOVUxMCi0JCSAgICAgICYmIGVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfc3R1YnMgIT0gTlVMTAotCQkgICAgICAmJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPmxvY2FsX3N0dWJzW3Jfc3ltbmR4XSAhPSBOVUxMKSkKLQkgICAgICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJCSAgRk5fU1RVQiwgc2l6ZW9mIEZOX1NUVUIgLSAxKSAhPSAwCi0JICAgICAgJiYgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JCQkgIENBTExfU1RVQiwgc2l6ZW9mIENBTExfU1RVQiAtIDEpICE9IDAKLQkgICAgICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSwKLQkJCSAgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChtaCAhPSBOVUxMKQotCQl7Ci0JCSAgQkZEX0FTU0VSVCAobWgtPm5lZWRfZm5fc3R1Yik7Ci0JCSAgcmVsb2NhdGlvbiA9IChtaC0+Zm5fc3R1Yi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgbWgtPmZuX3N0dWItPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNlY3Rpb24gKmZuX3N0dWI7Ci0KLQkJICBmbl9zdHViID0gZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5sb2NhbF9zdHVic1tyX3N5bW5keF07Ci0JCSAgcmVsb2NhdGlvbiA9IChmbl9zdHViLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBmbl9zdHViLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCi0JICAgICAgLyogUkVMT0NBVElPTiBub3cgcG9pbnRzIHRvIDMyIGJpdCBjb2RlLiAgKi8KLQkgICAgICBvdGhlciA9IDA7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhpcyBmdW5jdGlvbiBoYXMgYSBjYWxsX3N0dWIsIHRoZW4gaXQgaXMgY2FsbGVkIGJ5IGEKLSAgICAgICAgICAgICBtaXBzMTYgZnVuY3Rpb247IHRoZSBjYWxsIG5lZWRzIHRvIGdvIHRocm91Z2ggYSBzdHViIGlmCi0gICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBpcyBhIDMyIGJpdCBmdW5jdGlvbi4gIElmIHRoaXMgcmVsb2MgaXMgYQotICAgICAgICAgICAgIDE2IGJpdCBjYWxsLCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgYSAxNiBiaXQgZnVuY3Rpb24sCi0gICAgICAgICAgICAgdGhlbiByZWRpcmVjdCB0aGUgcmVsb2MgdG8gdGhlIHN0dWIuICBOb3RlIHRoYXQgd2UgZG9uJ3QKLSAgICAgICAgICAgICBuZWVkIHRvIHdvcnJ5IGFib3V0IGNhbGxpbmcgdGhlIGZ1bmN0aW9uIHRocm91Z2ggYQotICAgICAgICAgICAgIGZ1bmN0aW9uIHBvaW50ZXI7IHN1Y2ggY2FsbHMgYXJlIGhhbmRsZWQgYnkgcm91dGluZwotICAgICAgICAgICAgIHRocm91Z2ggYSBzcGVjaWFsIG1pcHMxNiByb3V0aW5lLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGVjawotICAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBjYWxsIGlzIGZyb20gYSBzdHViOyBpdCBjYW4ndCBiZSwgYmVjYXVzZSBhCi0gICAgICAgICAgICAgc3R1YiBjb250YWlucyAzMiBiaXQgY29kZSwgYW5kIGhlbmNlIGNhbiBub3QgaGF2ZSBhIDE2Ci0gICAgICAgICAgICAgYml0IHJlbG9jLiAgKi8KLQkgIGlmIChyX3R5cGUgPT0gUl9NSVBTMTZfMjYKLQkgICAgICAmJiBtaCAhPSBOVUxMCi0JICAgICAgJiYgKG1oLT5jYWxsX3N0dWIgIT0gTlVMTCB8fCBtaC0+Y2FsbF9mcF9zdHViICE9IE5VTEwpCi0JICAgICAgJiYgb3RoZXIgIT0gU1RPX01JUFMxNikKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzdHViOwotCi0JICAgICAgLyogSWYgYm90aCBjYWxsX3N0dWIgYW5kIGNhbGxfZnBfc3R1YiBhcmUgZGVmaW5lZCwgd2UKLSAgICAgICAgICAgICAgICAgY2FuIGZpZ3VyZSBvdXQgd2hpY2ggb25lIHRvIHVzZSBieSBzZWVpbmcgd2hpY2ggb25lCi0gICAgICAgICAgICAgICAgIGFwcGVhcnMgaW4gdGhlIGlucHV0IGZpbGUuICAqLwotCSAgICAgIGlmIChtaC0+Y2FsbF9zdHViICE9IE5VTEwgJiYgbWgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMKQotCQl7Ci0JCSAgYXNlY3Rpb24gKm87Ci0KLQkJICBzdHViID0gTlVMTDsKLQkJICBmb3IgKG8gPSBpbnB1dF9iZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgbyksCi0JCQkJICAgQ0FMTF9GUF9TVFVCLCBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLQkJCXsKLQkJCSAgc3R1YiA9IG1oLT5jYWxsX2ZwX3N0dWI7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQkgIGlmIChzdHViID09IE5VTEwpCi0JCSAgICBzdHViID0gbWgtPmNhbGxfc3R1YjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG1oLT5jYWxsX3N0dWIgIT0gTlVMTCkKLQkJc3R1YiA9IG1oLT5jYWxsX3N0dWI7Ci0JICAgICAgZWxzZQotCQlzdHViID0gbWgtPmNhbGxfZnBfc3R1YjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHN0dWItPl9yYXdfc2l6ZSA+IDApOwotCSAgICAgIHJlbG9jYXRpb24gPSBzdHViLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc3R1Yi0+b3V0cHV0X29mZnNldDsKLQkgICAgfQotCi0JICBpZiAocl90eXBlID09IFJfTUlQU19ISTE2KQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmxvcmVsOwotCi0JICAgICAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCBwZXJtaXQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgotCQkgUl9NSVBTX0hJMTYgcmVsb2NzIGJlZm9yZSB0aGUgUl9NSVBTX0xPMTYgcmVsb2MuCi0JCSBUaGlzIHBlcm1pdHMgZ2NjIHRvIGVtaXQgdGhlIEhJIGFuZCBMTyByZWxvY3MgaXRzZWxmLiAgKi8KLQkgICAgICBmb3IgKGxvcmVsID0gcmVsICsgMTsKLQkJICAgKGxvcmVsIDwgcmVsZW5kCi0JCSAgICAmJiBFTEYzMl9SX1RZUEUgKGxvcmVsLT5yX2luZm8pID09IFJfTUlQU19ISTE2KTsKLQkJICAgbG9yZWwrKykKLQkJOwotCSAgICAgIGlmIChsb3JlbCA8IHJlbGVuZAotCQkgICYmIEVMRjMyX1JfVFlQRSAobG9yZWwtPnJfaW5mbykgPT0gUl9NSVBTX0xPMTYpCi0JCXsKLQkJICBtaXBzX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJlbCwgbG9yZWwsCi0JCQkJCSAgY29udGVudHMsIHJlbG9jYXRpb24gKyBhZGRlbmQpOwotCQkgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTX0dPVDE2ICYmIGxvY2FsKQotCSAgICB7Ci0JICAgICAgLyogR09UMTYgbXVzdCBhbHNvIGhhdmUgYW4gYXNzb2NpYXRlZCBMTzE2IGluIHRoZSBsb2NhbAotCQkgY2FzZS4gIEluIHRoaXMgY2FzZSwgdGhlIGFkZGVuZCBpcyBleHRyYWN0ZWQgYW5kIHRoZQotCQkgc2VjdGlvbiBpbiB3aGljaCB0aGUgcmVmZXJlbmNlZCBvYmplY3QgaXMgZGV0ZXJtaW5lZC4KLQkJIFRoZW4gdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlIG9iamVjdCBpcyBjb21wdXRlZCBhbmQKLQkJIHRoZSBHT1QgZW50cnkgZm9yIHRoZSBoaXBhZ2UgKGFuIGFsaWduZWQgNjRrYiBjaHVuaykKLQkJIGlzIGFkZGVkIHRvIC5nb3Qgc2VjdGlvbiBpZiBuZWVkZWQuICBUaGUgb2Zmc2V0IGZpZWxkCi0JCSBvZiB0aGUgR09UMTYtcmVsb2NhdGVkIGluc3RydWN0aW9uIGlzIHJlcGxhY2VkIGJ5IHRoZQotCQkgaW5kZXggb2YgdGhpcyBHT1QgZW50cnkgZm9yIHRoZSBoaXBhZ2UuICAqLwotCSAgICAgIGlmICgocmVsICsgMSkgPCByZWxlbmQKLQkJICAmJiBFTEYzMl9SX1RZUEUgKChyZWwgKyAxKS0+cl9pbmZvKSA9PSBSX01JUFNfTE8xNikKLQkJewotCQkgIGlmICghIG1pcHNfZWxmX3JlbG9jYXRlX2dvdF9sb2NhbCAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLAotCQkJCQkJICAgICBzZ290LCByZWwsIHJlbCArIDEsCi0JCQkJCQkgICAgIGNvbnRlbnRzLAotCQkJCQkJICAgICByZWxvY2F0aW9uICsgYWRkZW5kKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICByID0gYmZkX3JlbG9jX29rOwotCQl9Ci0JICAgICAgZWxzZQotCQlyID0gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfQ0FMTDE2Ci0JCSAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR09UMTYKLQkJICAgfHwgcl90eXBlID09IFJfTUlQU19DQUxMX0xPMTYKLQkJICAgfHwgcl90eXBlID09IFJfTUlQU19HT1RfTE8xNikKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2Zmc2V0OwotCi0JICAgICAgLyogVGhpcyBzeW1ib2wgbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIHN5bWJvbAotCQkgaGF2aW5nIHRoZSBjb3JyZXNwb25kaW5nIGdvdCBlbnRyeS4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgb2Zmc2V0ID0gKGgtPmR5bmluZHggLSBnLT5nbG9iYWxfZ290c3ltICsgZy0+bG9jYWxfZ290bm8pICogNDsKLQkgICAgICBCRkRfQVNTRVJUIChnLT5sb2NhbF9nb3RubyA8PSBvZmZzZXQKLQkJCSAgJiYgb2Zmc2V0IDwgc2dvdC0+X3Jhd19zaXplKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgYWRkZW5kLAotCQkJICBzZ290LT5jb250ZW50cyArIG9mZnNldCk7Ci0JICAgICAgb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIG9mZnNldCAtIGdwKTsKLQkgICAgICBtaXBzX2VsZl9yZWxvY2F0ZV9nbG9iYWxfZ290IChpbnB1dF9iZmQsIHJlbCwgY29udGVudHMsCi0JCQkJCSAgICBvZmZzZXQpOwotCSAgICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfQ0FMTF9ISTE2Ci0JCSAgIHx8IHJfdHlwZSA9PSBSX01JUFNfR09UX0hJMTYpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZnNldDsKLQotCSAgICAgIC8qIFRoaXMgbXVzdCBiZSBhIGdsb2JhbCBzeW1ib2wgd2l0aCBhIGdvdCBlbnRyeS4gIFRoZQotICAgICAgICAgICAgICAgICBuZXh0IHJlbG9jIG11c3QgYmUgdGhlIGNvcnJlc3BvbmRpbmcgTE8xNiByZWxvYy4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMICYmIGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKTsKLQkgICAgICBCRkRfQVNTRVJUICgocmVsICsgMSkgPCByZWxlbmQpOwotCSAgICAgIEJGRF9BU1NFUlQgKChpbnQpIEVMRjMyX1JfVFlQRSAoKHJlbCArIDEpLT5yX2luZm8pCi0JCQkgID09IChyX3R5cGUgPT0gUl9NSVBTX0NBTExfSEkxNgotCQkJICAgICAgPyAoaW50KSBSX01JUFNfQ0FMTF9MTzE2Ci0JCQkgICAgICA6IChpbnQpIFJfTUlQU19HT1RfTE8xNikpOwotCi0JICAgICAgb2Zmc2V0ID0gKGgtPmR5bmluZHggLSBnLT5nbG9iYWxfZ290c3ltICsgZy0+bG9jYWxfZ290bm8pICogNDsKLQkgICAgICBCRkRfQVNTRVJUIChnLT5sb2NhbF9nb3RubyA8PSBvZmZzZXQKLQkJCSAgJiYgb2Zmc2V0IDwgc2dvdC0+X3Jhd19zaXplKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgYWRkZW5kLAotCQkJICBzZ290LT5jb250ZW50cyArIG9mZnNldCk7Ci0JICAgICAgb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIG9mZnNldCAtIGdwKTsKLQkgICAgICBtaXBzX2VsZl9yZWxvY2F0ZV9oaTE2IChpbnB1dF9iZmQsIHJlbCwgcmVsICsgMSwgY29udGVudHMsCi0JCQkJICAgICAgb2Zmc2V0KTsKLQkgICAgICByID0gYmZkX3JlbG9jX29rOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTX1JFTDMyCi0JCSAgIHx8IHJfdHlwZSA9PSBSX01JUFNfMzIpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIG91dHJlbDsKLQkgICAgICBFbGYzMl9jcmluZm8gY3B0cmVsOwotCSAgICAgIGJmZF9ieXRlICpjcjsKLQotCSAgICAgIGlmICgoaW5mby0+c2hhcmVkCi0JCSAgIHx8IChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAgJiYgaCAhPSBOVUxMCi0JCSAgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKQotCQkJICAgPT0gMCkpKQotCQkgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJewotCQkgIGJvb2xlYW4gc2tpcDsKLQotCQkgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlCi0JCSAgICAgcmVsb2NhdGlvbnMgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZQotCQkgICAgIHJlc29sdmVkIGF0IHJ1biB0aW1lLiAgKi8KLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOwotCQkgICAgICBCRkRfQVNTRVJUIChzcmVsb2MgIT0gTlVMTCk7Ci0JCSAgICB9Ci0KLQkJICBza2lwID0gZmFsc2U7Ci0KLQkJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JCSAgICAgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAgICAgKG91dHB1dF9iZmQsICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPnN0YWJfaW5mbywKLQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgICAgIHJlbC0+cl9vZmZzZXQpKTsKLQkJICAgICAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCQlza2lwID0gdHJ1ZTsKLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQkgICAgfQotCi0JCSAgb3V0cmVsLnJfb2Zmc2V0ICs9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCQkgIGFkZGVuZCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCQkgIGlmIChza2lwKQotCQkgICAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkJICBlbHNlIGlmIChoICE9IE5VTEwKLQkJCSAgICYmICghIGluZm8tPnN5bWJvbGljCi0JCQkgICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgICAgewotCQkgICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9NSVBTX1JFTDMyKTsKLQkJICAgICAgc2VjID0gaW5wdXRfc2VjdGlvbjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCX0KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCWluZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQkJCSAgaWYgKGluZHggPT0gMCkKLQkJCSAgICBhYm9ydCAoKTsKLQkJCX0KLQotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChpbmR4LCBSX01JUFNfUkVMMzIpOwotCQkgICAgICBhZGRlbmQgKz0gcmVsb2NhdGlvbjsKLQkJICAgIH0KLQotCQkgIGlmICghIHNraXApCi0JCSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBhZGRlbmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkJICBiZmRfZWxmMzJfc3dhcF9yZWxvY19vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICAgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsICopCi0JCQkJCSAgICAgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICAgICArIHNyZWxvYy0+cmVsb2NfY291bnQpKTsKLQkJICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0KLQkJICBpZiAoISBza2lwICYmIFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotCQkgICAgewotCQkgICAgICBpZiAoc2NwdCA9PSBOVUxMKQotCQkJY29udGludWU7Ci0KLQkJICAgICAgLyogTWFrZSBhbiBlbnRyeSBvZiBjb21wYWN0IHJlbG9jYXRpb24gaW5mby4gICovCi0JCSAgICAgIG1pcHNfZWxmX3NldF9jcl9mb3JtYXQgKGNwdHJlbCwgQ1JGX01JUFNfTE9ORyk7Ci0JCSAgICAgIGNwdHJlbC52YWRkciA9IChyZWwtPnJfb2Zmc2V0Ci0JCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkJICAgICAgaWYgKHJfdHlwZSA9PSBSX01JUFNfUkVMMzIpCi0JCQltaXBzX2VsZl9zZXRfY3JfdHlwZSAoY3B0cmVsLCBDUlRfTUlQU19SRUwzMik7Ci0JCSAgICAgIGVsc2UKLQkJCW1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX1dPUkQpOwotCQkgICAgICBtaXBzX2VsZl9zZXRfY3JfZGlzdDJ0byAoY3B0cmVsLCAwKTsKLQkJICAgICAgY3B0cmVsLmtvbnN0ID0gYWRkZW5kOwotCi0JCSAgICAgIGNyID0gKHNjcHQtPmNvbnRlbnRzCi0JCQkgICAgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKSk7Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX2NyaW5mb19vdXQgKG91dHB1dF9iZmQsICZjcHRyZWwsCi0JCQkJCQkgKChFbGYzMl9FeHRlcm5hbF9jcmluZm8gKikgY3IKLQkJCQkJCSAgKyBzY3B0LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NjcHQtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvCi0JCSAgICAgdGhlcmUncyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdy4gICovCi0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChyX3R5cGUgPT0gUl9NSVBTXzY0KQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBhZGRyOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0JICAgICAgLyogRG8gYSAzMiBiaXQgcmVsb2NhdGlvbiwgYW5kIHNpZ24gZXh0ZW5kIHRvIDY0IGJpdHMuICAqLwotCSAgICAgIGFkZHIgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJYWRkciArPSA0OwotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywgYWRkciwgcmVsb2NhdGlvbiwKLQkJCQkJICAgIGFkZGVuZCk7Ci0JICAgICAgdmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIGFkZHIpOwotCSAgICAgIGlmICgodmFsICYgMHg4MDAwMDAwMCkgIT0gMCkKLQkJdmFsID0gMHhmZmZmZmZmZjsKLQkgICAgICBlbHNlCi0JCXZhbCA9IDA7Ci0JICAgICAgYWRkciA9IHJlbC0+cl9vZmZzZXQ7Ci0JICAgICAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChpbnB1dF9iZmQpKQotCQlhZGRyICs9IDQ7Ci0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB2YWwsIGNvbnRlbnRzICsgYWRkcik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFNfMjYgJiYgb3RoZXIgPT0gU1RPX01JUFMxNikKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQotCSAgICAgIC8qIFRoaXMgaXMgYSBqdW1wIHRvIGEgbWlwczE2IHJvdXRpbmUgZnJvbSBhIG1pcHMzMgotICAgICAgICAgICAgICAgICByb3V0aW5lLiAgV2UgbmVlZCB0byBjaGFuZ2UgamFsIGludG8gamFseC4gICovCi0JICAgICAgaW5zbiA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBpZiAoKChpbnNuID4+IDI2KSAmIDB4M2YpICE9IDB4MwotCQkgICYmICgoaW5zbiA+PiAyNikgJiAweDNmKSAhPSAweDFkKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6ICVzKzB4JWx4OiBqdW1wIHRvIG1pcHMxNiByb3V0aW5lIHdoaWNoIGlzIG5vdCBqYWwiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkgICAgIGlucHV0X3NlY3Rpb24tPm5hbWUsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIHJlbC0+cl9vZmZzZXQpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGluc24gPSAoaW5zbiAmIDB4M2ZmZmZmZikgfCAoMHgxZCA8PCAyNik7Ci0JICAgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCBpbnNuLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCSAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkJICAgIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNikKLQkgICAgewotCSAgICAgIC8qIEl0J3MgZWFzaWVzdCB0byBkbyB0aGUgbm9ybWFsIHJlbG9jYXRpb24sIGFuZCB0aGVuCi0gICAgICAgICAgICAgICAgIGRpZyBvdXQgdGhlIGluc3RydWN0aW9uIGFuZCBzd2FwIHRoZSBmaXJzdCB3b3JkIHRoZQotICAgICAgICAgICAgICAgICB3YXkgdGhlIG1pcHMxNiBleHBlY3RzIGl0LiAgSWYgdGhpcyBpcyBsaXR0bGUgZW5kaWFuLAotICAgICAgICAgICAgICAgICB0aG91Z2gsIHdlIG5lZWQgdG8gc3dhcCB0aGUgdHdvIHdvcmRzIGZpcnN0LCBhbmQgdGhlbgotICAgICAgICAgICAgICAgICBzd2FwIHRoZW0gYmFjayBhZ2FpbiBsYXRlciwgc28gdGhhdCB0aGUgYWRkcmVzcyBsb29rcwotICAgICAgICAgICAgICAgICByaWdodC4gICovCi0KLQkgICAgICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGlucHV0X2JmZCkpCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkJICBpbnNuID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIGluc24gPSAoKGluc24gPj4gMTYpICYgMHhmZmZmKSB8ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpOwotCQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJfQotCi0JICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgICAgcmVsb2NhdGlvbiwgYWRkZW5kKTsKLQkgICAgICBpZiAociA9PSBiZmRfcmVsb2Nfb2spCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGluc247Ci0KLQkJICBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKGlucHV0X2JmZCkpCi0JCSAgICB7Ci0JCSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgICAgIGluc24gPSAoKGluc24gPj4gMTYpICYgMHhmZmZmKSB8ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpOwotCQkgICAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgICB9Ci0KLQkJICBpbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCQkgIGluc24gPSAoKGluc24gJiAweGZjMDApCi0JCQkgIHwgKChpbnNuICYgMHgxZikgPDwgNSkKLQkJCSAgfCAoKGluc24gJiAweDNlMCkgPj4gNSkpOwotCQkgIC8qIElmIHRoaXMgaXMgYSBqdW1wIHRvIGEgMzIgYml0IHJvdXRpbmUsIHRoZW4gbWFrZQotCQkgICAgIGl0IGphbHguICAqLwotCQkgIGlmIChvdGhlciAhPSBTVE9fTUlQUzE2KQotCQkgICAgaW5zbiB8PSAweDQwMDsKLQkJICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocl90eXBlID09IFJfTUlQUzE2X0dQUkVMKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgc2hvcnQgZXh0ZW5kLCBpbnNuOwotCSAgICAgIGJmZF9ieXRlIGJ1Zls0XTsKLQkgICAgICB1bnNpZ25lZCBsb25nIGZpbmFsOwotCi0JICAgICAgLyogRXh0cmFjdCB0aGUgYWRkZW5kIGludG8gYnVmLCBydW4gdGhlIHJlZ3VsYXIgcmVsb2MsCi0gICAgICAgICAgICAgICAgIGFuZCBzdHVmZiB0aGUgcmVzdWx0aW5nIHZhbHVlIGJhY2sgaW50byB0aGUKLSAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgICBpZiAocmVsLT5yX29mZnNldCA+IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkKLQkJciA9IGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGV4dGVuZCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkJICBpbnNuID0gYmZkX2dldF8xNiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQgKyAyKTsKLQkJICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsCi0JCQkgICAgICAoKChleHRlbmQgJiAweDFmKSA8PCAxMSkKLQkJCSAgICAgICB8IChleHRlbmQgJiAweDdlMCkKLQkJCSAgICAgICB8IChpbnNuICYgMHgxZikpLAotCQkJICAgICAgYnVmKTsKLQkJICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLAotCQkJCQkJaW5wdXRfc2VjdGlvbiwgYnVmLAotCQkJCQkJKGJmZF92bWEpIDAsIHJlbG9jYXRpb24sCi0JCQkJCQlhZGRlbmQpOwotCQkgIGZpbmFsID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBidWYpOwotCQkgIGJmZF9wdXRfMTYgKGlucHV0X2JmZCwKLQkJCSAgICAgICgoZXh0ZW5kICYgMHhmODAwKQotCQkJICAgICAgIHwgKChmaW5hbCA+PiAxMSkgJiAweDFmKQotCQkJICAgICAgIHwgKGZpbmFsICYgMHg3ZTApKSwKLQkJCSAgICAgIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JCSAgYmZkX3B1dF8xNiAoaW5wdXRfYmZkLAotCQkJICAgICAgKChpbnNuICYgMHhmZmUwKQotCQkJICAgICAgIHwgKGZpbmFsICYgMHgxZikpLAotCQkJICAgICAgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0ICsgMik7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICByID0gX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCQkgIHJlbG9jYXRpb24sIGFkZGVuZCk7Ci0KLQkgIC8qIFRoZSBqYWwgaW5zdHJ1Y3Rpb24gY2FuIG9ubHkganVtcCB0byBhbiBhZGRyZXNzIHdoaWNoIGlzCi0gICAgICAgICAgICAgZGl2aXNpYmxlIGJ5IDQsIGFuZCBpdCBjYW4gb25seSBqdW1wIHRvIGFuIGFkZHJlc3Mgd2l0aAotICAgICAgICAgICAgIHRoZSBzYW1lIHVwcGVyIDQgYml0cyBhcyB0aGUgUEMuICAqLwotCSAgaWYgKHIgPT0gYmZkX3JlbG9jX29rCi0JICAgICAgJiYgKHJfdHlwZSA9PSBSX01JUFMxNl8yNiB8fCByX3R5cGUgPT0gUl9NSVBTXzI2KSkKLQkgICAgewotCSAgICAgIGJmZF92bWEgYWRkcjsKLSAgICAgICAgICAgICAgYmZkX3ZtYSBwYzsKLSAgICAgICAgICAgICAgYmZkX3ZtYSB0YXJnZXQ7Ci0KLSAgICAgICAgICAgICAgcGMgPSAoKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLSAgICAgICAgICAgICAgICAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotICAgICAgICAgICAgICAgICAgICAgKyByZWwtPnJfb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAmIDB4ZjAwMDAwMDApOwotICAgICAgICAgICAgICB0YXJnZXQgPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCkKLQkJCSYgKGhvd3RvLT5kc3RfbWFzayk7Ci0gICAgICAgICAgICAgIGFkZHIgPSAodGFyZ2V0IDw8IDIpICsgcGM7Ci0JICAgICAgaWYgKG90aGVyID09IFNUT19NSVBTMTYpCi0JCWFkZHIgJj0gfiAoYmZkX3ZtYSkgMTsKLQkgICAgICBpZiAoKGFkZHIgJiAzKSAhPSAwCi0JCSAgfHwgKChhZGRyICYgMHhmMDAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAhPSBwYykpCi0JCXIgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgYm90aGVyIHRvIHJlcG9ydCBhIHJlbG9jYXRpb24gb3ZlcmZsb3cgZm9yIGEgY2FsbAotICAgICAgICAgICAgIHRvIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sIHdpdGggYSB2YWx1ZSBvZiB6ZXJvLiAgVGhpcwotICAgICAgICAgICAgIHBlcm1pdHMgdXMgdG8gdXNlCi0JICAgICAgICAgaWYgKCFmKSBmKCk7Ci0JICAgICBldmVuIGlmIHdlIGFyZW4ndCBpbiByYW5nZSB0byBjYWxsIGFkZHJlc3MgemVyby4gICovCi0JICBpZiAociA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cKLQkgICAgICAmJiAocl90eXBlID09IFJfTUlQUzE2XzI2IHx8IHJfdHlwZSA9PSBSX01JUFNfMjYpCi0JICAgICAgJiYgcmVsb2NhdGlvbiArIGFkZGVuZCA9PSAwCi0JICAgICAgJiYgaCAhPSBOVUxMCi0JICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCi0JICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGlzc3VlZCBhbiBlcnJvciBmb3IgYW4gdW5kZWZpbmVkIHN5bWJvbCwKLSAgICAgICAgICAgICBkb24ndCBpc3N1ZSBhbm90aGVyIHVzZWxlc3MgZXJyb3IuICAqLwotCSAgaWYgKHVuZGVmaW5lZF9lcnJvcgotCSAgICAgICYmIChyID09IGJmZF9yZWxvY191bmRlZmluZWQgfHwgciA9PSBiZmRfcmVsb2Nfb3ZlcmZsb3cpKQotCSAgICByID0gYmZkX3JlbG9jX29rOwotCi0JICBpZiAoU0dJX0NPTVBBVCAob3V0cHV0X2JmZCkKLQkgICAgICAmJiBzY3B0ICE9IE5VTEwKLQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIHsKLQkgICAgICBFbGYzMl9jcmluZm8gY3B0cmVsOwotCSAgICAgIGJmZF9ieXRlICpjcjsKLQotCSAgICAgIC8qIE1ha2UgYW4gZW50cnkgb2YgY29tcGFjdCByZWxvY2F0aW9uIGluZm8uICAqLwotCSAgICAgIG1pcHNfZWxmX3NldF9jcl9mb3JtYXQgKGNwdHJlbCwgQ1JGX01JUFNfTE9ORyk7Ci0JICAgICAgY3B0cmVsLnZhZGRyID0gKHJlbC0+cl9vZmZzZXQKLQkJCSAgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgUl9NSVBTXzI2OgotCQkgIG1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX0pNUEFEKTsKLQkJICAvKiBYWFggSG93IHNob3VsZCB3ZSBzZXQgZGlzdDJ0byBpbiB0aGlzIGNhc2UuICovCi0JCSAgbWlwc19lbGZfc2V0X2NyX2Rpc3QydG8gKGNwdHJlbCwgOCk7Ci0JCSAgY3B0cmVsLmtvbnN0ID0gYWRkZW5kICsgcmVsb2NhdGlvbjsKLQkJICBjciA9IHNjcHQtPmNvbnRlbnRzICsgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCk7Ci0JCSAgYmZkX2VsZjMyX3N3YXBfY3JpbmZvX291dCAob3V0cHV0X2JmZCwgJmNwdHJlbCwKLQkJCQkJICAgICAoKEVsZjMyX0V4dGVybmFsX2NyaW5mbyAqKSBjcgotCQkJCQkgICAgICArIHNjcHQtPnJlbG9jX2NvdW50KSk7Ci0JCSAgKytzY3B0LT5yZWxvY19jb3VudDsKLQkJICBicmVhazsKLQotCQljYXNlIFJfTUlQU19HUFJFTDE2OgotCQljYXNlIFJfTUlQU19MSVRFUkFMOgotCQljYXNlIFJfTUlQU19HUFJFTDMyOgotCQkgIG1pcHNfZWxmX3NldF9jcl90eXBlIChjcHRyZWwsIENSVF9NSVBTX0dQSElfTE8pOwotCQkgIGNwdHJlbC5rb25zdCA9IGdwIC0gY3B0cmVsLnZhZGRyOwotCQkgIG1pcHNfZWxmX3NldF9jcl9kaXN0MnRvIChjcHRyZWwsIDQpOwotCQkgIGNyID0gc2NwdC0+Y29udGVudHMgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKTsKLQkJICBiZmRfZWxmMzJfc3dhcF9jcmluZm9fb3V0IChvdXRwdXRfYmZkLCAmY3B0cmVsLAotCQkJCQkgICAgICgoRWxmMzJfRXh0ZXJuYWxfY3JpbmZvICopIGNyCi0JCQkJCSAgICAgICsgc2NwdC0+cmVsb2NfY291bnQpKTsKLQkJICArK3NjcHQtPnJlbG9jX2NvdW50OwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKGggIT0gTlVMTCkKLQkJICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkJZWxzZQotCQkgIHsKLQkJICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgIHN5bXRhYl9oZHItPnNoX2xpbmssCi0JCQkJCQkJICAgIHN5bS0+c3RfbmFtZSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaG9vayBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBsaW5rZXIgd3JpdGVzIG91dCBhIGdsb2JhbAotICAgc3ltYm9sLiAgV2UgbWFyayBzeW1ib2xzIGFzIHNtYWxsIGNvbW1vbiBpZiBhcHByb3ByaWF0ZS4gIFRoaXMgaXMKLSAgIGFsc28gd2hlcmUgd2UgdW5kbyB0aGUgaW5jcmVtZW50IG9mIHRoZSB2YWx1ZSBmb3IgYSBtaXBzMTYgc3ltYm9sLiAgKi8KLQotLypBUkdTSUdOT1JFRCovCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgaW5wdXRfc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWM7Ci17Ci0gIC8qIElmIHdlIHNlZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGltcGxpZXMgYSByZWxvY2F0YWJsZSBsaW5rLCB0aGVuCi0gICAgIGlmIGEgc3ltYm9sIHdhcyBzbWFsbCBjb21tb24gaW4gYW4gaW5wdXQgZmlsZSwgbWFyayBpdCBhcyBzbWFsbAotICAgICBjb21tb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTgotICAgICAgJiYgc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuc2NvbW1vbiIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1NDT01NT047Ci0KLSAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNgotICAgICAgJiYgKHN5bS0+c3RfdmFsdWUgJiAxKSAhPSAwKQotICAgIC0tc3ltLT5zdF92YWx1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBmb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQotLyogVGhlIG5hbWUgb2YgdGhlIGR5bmFtaWMgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIHB1dCBpbiB0aGUgLmludGVycAotICAgc2VjdGlvbi4gICovCi0KLSNkZWZpbmUgRUxGX0RZTkFNSUNfSU5URVJQUkVURVIoYWJmZCkgXAotICAgKEFCSV9OMzJfUCAoYWJmZCkgPyAiL3Vzci9saWIzMi9saWJjLnNvLjEiIDogIi91c3IvbGliL2xpYmMuc28uMSIpCi0KLS8qIENyZWF0ZSBkeW5hbWljIHNlY3Rpb25zIHdoZW4gbGlua2luZyBhZ2FpbnN0IGEgZHluYW1pYyBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIGNvbnN0IGNoYXIgKiBjb25zdCAqbmFtZXA7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEIHwgU0VDX1JFQURPTkxZKTsKLQotICAvKiBNaXBzIEFCSSByZXF1ZXN0cyB0aGUgLmR5bmFtaWMgc2VjdGlvbiB0byBiZSByZWFkIG9ubHkuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBjcmVhdGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgaWYgKCEgbWlwc19lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIHRoZSAubXN5bSBzZWN0aW9uIG9uIElSSVg2LiAgSXQgaXMgdXNlZCBieSB0aGUgZHluYW1pYwotICAgICBsaW5rZXIgdG8gc3BlZWQgdXAgZHluYW1pYyByZWxvY2F0aW9ucywgYW5kIHRvIGF2b2lkIGNvbXB1dGluZwotICAgICB0aGUgRUxGIGhhc2ggZm9yIHN5bWJvbHMuICAqLwotICBpZiAoSVJJWF9DT01QQVQgKGFiZmQpID09IGljdF9pcml4NgotICAgICAgJiYgIW1pcHNfZWxmX2NyZWF0ZV9tc3ltX3NlY3Rpb24gKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIENyZWF0ZSAuc3R1YiBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0dWIiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnN0dWIiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoU0dJX0NPTVBBVCAoYWJmZCkKLSAgICAgICYmICFpbmZvLT5zaGFyZWQKLSAgICAgICYmIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJsZF9tYXAiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyAmIH5TRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogT24gSVJJWDUsIHdlIGFkanVzdCBhZGQgc29tZSBhZGRpdGlvbmFsIHN5bWJvbHMgYW5kIGNoYW5nZSB0aGUKLSAgICAgYWxpZ25tZW50cyBvZiBzZXZlcmFsIHNlY3Rpb25zLiAgVGhlcmUgaXMgbm8gQUJJIGRvY3VtZW50YXRpb24KLSAgICAgaW5kaWNhdGluZyB0aGF0IHRoaXMgaXMgbmVjZXNzYXJ5IG9uIElSSVg2LCBub3IgYW55IGV2aWRlbmNlIHRoYXQKLSAgICAgdGhlIGxpbmtlciB0YWtlcyBzdWNoIGFjdGlvbi4gICovCi0gIGlmIChJUklYX0NPTVBBVCAoYWJmZCkgPT0gaWN0X2lyaXg1KQotICAgIHsKLSAgICAgIGZvciAobmFtZXAgPSBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzOyAqbmFtZXAgIT0gTlVMTDsgbmFtZXArKykKLQl7Ci0JICBoID0gTlVMTDsKLQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkgKGluZm8sIGFiZmQsICpuYW1lcCwgQlNGX0dMT0JBTCwgYmZkX3VuZF9zZWN0aW9uX3B0ciwKLQkJICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCSAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfTk9OX0VMRjsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgIGgtPnR5cGUgPSBTVFRfU0VDVElPTjsKLQotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSAuY29tcGFjdF9yZWwgc2VjdGlvbi4gICovCi0gICAgICBpZiAoISBtaXBzX2VsZl9jcmVhdGVfY29tcGFjdF9yZWxfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBDaGFuZ2UgYWxpZ21lbnRzIG9mIHNvbWUgc2VjdGlvbnMuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmhhc2giKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuZHluc3ltIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bnN0ciIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCA0KTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWdpbmZvIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDQpOwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmR5bmFtaWMiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCk7Ci0gICAgfQotCi0gIGlmICghaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGggPSBOVUxMOwotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgYWJmZCwgIl9EWU5BTUlDX0xJTksiLCBCU0ZfR0xPQkFMLCBiZmRfYWJzX3NlY3Rpb25fcHRyLAotCSAgICAgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAgICAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX1NFQ1RJT047Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZCkKLQl7Ci0JICAvKiBfX3JsZF9tYXAgaXMgYSBmb3VyIGJ5dGUgd29yZCBsb2NhdGVkIGluIHRoZSAuZGF0YSBzZWN0aW9uCi0JICAgICBhbmQgaXMgZmlsbGVkIGluIGJ5IHRoZSBydGxkIHRvIGNvbnRhaW4gYSBwb2ludGVyIHRvCi0JICAgICB0aGUgX3JfZGVidWcgc3RydWN0dXJlLiBJdHMgc3ltYm9sIHZhbHVlIHdpbGwgYmUgc2V0IGluCi0JICAgICBtaXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wuICAqLwotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJsZF9tYXAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgIGggPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgIl9fcmxkX21hcCIsIEJTRl9HTE9CQUwsIHMsCi0JCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkJICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotCSAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgLmNvbXBhY3RfcmVsIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX2NvbXBhY3RfcmVsX3NlY3Rpb24gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuY29tcGFjdF9yZWwiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JICAgICAgIHwgU0VDX1JFQURPTkxZKTsKLQotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuY29tcGFjdF9yZWwiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uIHRvIGhvbGQgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5nb3QiKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgNCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXy4gIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlCi0gICAgIGxpbmtlciBzY3JpcHQgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgc3ltYm9sIGlmIHdlCi0gICAgIGFyZSBub3QgY3JlYXRpbmcgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgaCA9IE5VTEw7Ci0gIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGZpcnN0IHNldmVyYWwgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzIGFyZSByZXNlcnZlZC4gICovCi0gIHMtPl9yYXdfc2l6ZSA9IE1JUFNfUkVTRVJWRURfR09UTk8gKiA0OwotCi0gIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IG1pcHNfZ290X2luZm8pKTsKLSAgaWYgKGcgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGctPmdsb2JhbF9nb3RzeW0gPSAwOwotICBnLT5sb2NhbF9nb3RubyA9IE1JUFNfUkVTRVJWRURfR09UTk87Ci0gIGctPmFzc2lnbmVkX2dvdG5vID0gTUlQU19SRVNFUlZFRF9HT1ROTzsKLSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHMpID09IE5VTEwpCi0gICAgewotICAgICAgcy0+dXNlZF9ieV9iZmQgPQotCShQVFIpIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhKSk7Ci0gICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAocykgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGRhdGEgPSAoUFRSKSBnOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRoZSAubXN5bSBzZWN0aW9uIGZvciBBQkZELCBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdAotICAgYWxyZWFkeSBleGlzdC4gIFJldHVybnMgTlVMTCB0byBpbmRpY2F0ZSBlcnJvci4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1taXBzX2VsZl9jcmVhdGVfbXN5bV9zZWN0aW9uIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGFiZmQpKTsKLSAgaWYgKCFzKSAKLSAgICB7Ci0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGFiZmQpKTsKLSAgICAgIGlmICghcwotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgCi0JCQkJICAgICBTRUNfQUxMT0MKLQkJCQkgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQgCi0JCQkJICAgICB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIHM7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgcmVsb2NzIGZvciBhIHNlY3Rpb24gZHVyaW5nIHRoZSBmaXJzdCBwaGFzZSwgYW5kCi0gICBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jaGVja19yZWxvY3MgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICBjb25zdCBjaGFyICpuYW1lOwotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxfZW5kOwotICBhc2VjdGlvbiAqc2dvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGV4dHN5bW9mZiA9IChlbGZfYmFkX3N5bXRhYiAoYWJmZCkpID8gMCA6IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgLyogQ2hlY2sgZm9yIHRoZSBtaXBzMTYgc3R1YiBzZWN0aW9ucy4gICovCi0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotICBpZiAoc3RybmNtcCAobmFtZSwgRk5fU1RVQiwgc2l6ZW9mIEZOX1NUVUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0KLSAgICAgIC8qIExvb2sgYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB3aGljaCBzeW1ib2wKLSAgICAgICAgIHRoaXMgaXMgZm9yLiAgKi8KLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NzLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgIHx8IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKm87Ci0KLQkgIC8qIFRoaXMgc3R1YiBpcyBmb3IgYSBsb2NhbCBzeW1ib2wuICBUaGlzIHN0dWIgd2lsbCBvbmx5IGJlCi0gICAgICAgICAgICAgbmVlZGVkIGlmIHRoZXJlIGlzIHNvbWUgcmVsb2NhdGlvbiBpbiB0aGlzIEJGRCwgb3RoZXIKLSAgICAgICAgICAgICB0aGFuIGEgMTYgYml0IGZ1bmN0aW9uIGNhbGwsIHdoaWNoIHJlZmVycyB0byB0aGlzIHN5bWJvbC4gICovCi0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpzZWNfcmVsb2NzOwotCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyLCAqcmVuZDsKLQotCSAgICAgIC8qIFdlIGNhbiBpZ25vcmUgc3R1YiBzZWN0aW9ucyB3aGVuIGxvb2tpbmcgZm9yIHJlbG9jcy4gICovCi0JICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCQkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIEZOX1NUVUIsCi0JCQkgICAgICBzaXplb2YgRk5fU1RVQiAtIDEpID09IDAKLQkJICB8fCBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksIENBTExfU1RVQiwKLQkJCSAgICAgIHNpemVvZiBDQUxMX1NUVUIgLSAxKSA9PSAwCi0JCSAgfHwgc3RybmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCBDQUxMX0ZQX1NUVUIsCi0JCQkgICAgICBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzZWNfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJICAgIChhYmZkLCBvLCAoUFRSKSBOVUxMLAotCQkJICAgICAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSAgICAgaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgICAgICBpZiAoc2VjX3JlbG9jcyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICByZW5kID0gc2VjX3JlbG9jcyArIG8tPnJlbG9jX2NvdW50OwotCSAgICAgIGZvciAociA9IHNlY19yZWxvY3M7IHIgPCByZW5kOyByKyspCi0JCWlmIChFTEYzMl9SX1NZTSAoci0+cl9pbmZvKSA9PSByX3N5bW5keAotCQkgICAgJiYgRUxGMzJfUl9UWVBFIChyLT5yX2luZm8pICE9IFJfTUlQUzE2XzI2KQotCQkgIGJyZWFrOwotCi0JICAgICAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0JCWZyZWUgKHNlY19yZWxvY3MpOwotCi0JICAgICAgaWYgKHIgPCByZW5kKQotCQlicmVhazsKLQkgICAgfQotCi0JICBpZiAobyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgaXMgbm8gbm9uLWNhbGwgcmVsb2MgZm9yIHRoaXMgc3R1Yiwgc28gd2UgZG8KLSAgICAgICAgICAgICAgICAgbm90IG5lZWQgaXQuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUKLSAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucywgd2UKLSAgICAgICAgICAgICAgICAgY2FuIGVhc2lseSBkaXNjYXJkIGl0IGJ5IHNldHRpbmcgdGhlIFNFQ19FWENMVURFCi0gICAgICAgICAgICAgICAgIGZsYWcuICAqLwotCSAgICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogUmVjb3JkIHRoaXMgc3R1YiBpbiBhbiBhcnJheSBvZiBsb2NhbCBzeW1ib2wgc3R1YnMgZm9yCi0gICAgICAgICAgICAgdGhpcyBCRkQuICovCi0JICBpZiAoZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfc3R1YnMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgc3ltY291bnQ7Ci0JICAgICAgYXNlY3Rpb24gKipuOwotCi0JICAgICAgaWYgKGVsZl9iYWRfc3ltdGFiIChhYmZkKSkKLQkJc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCSAgICAgIGVsc2UKLQkJc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgICAgIG4gPSAoYXNlY3Rpb24gKiopIGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJCSAgICBzeW1jb3VudCAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotCSAgICAgIGlmIChuID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBlbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9zdHVicyA9IG47Ci0JICAgIH0KLQotCSAgZWxmX3RkYXRhIChhYmZkKS0+bG9jYWxfc3R1YnNbcl9zeW1uZHhdID0gc2VjOwotCi0JICAvKiBXZSBkb24ndCBuZWVkIHRvIHNldCBtaXBzMTZfc3R1YnNfc2VlbiBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAgVGhhdCBmbGFnIGlzIHVzZWQgdG8gc2VlIHdoZXRoZXIgd2UgbmVlZCB0byBsb29rIHRocm91Z2gKLSAgICAgICAgICAgICB0aGUgZ2xvYmFsIHN5bWJvbCB0YWJsZSBmb3Igc3R1YnMuICBXZSBkb24ndCBuZWVkIHRvIHNldAotICAgICAgICAgICAgIGl0IGhlcmUsIGJlY2F1c2Ugd2UganVzdCBoYXZlIGEgbG9jYWwgc3R1Yi4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSAoKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICAgICAgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0pOwotCi0JICAvKiBIIGlzIHRoZSBzeW1ib2wgdGhpcyBzdHViIGlzIGZvci4gICovCi0KLQkgIGgtPmZuX3N0dWIgPSBzZWM7Ci0JICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+bWlwczE2X3N0dWJzX3NlZW4gPSB0cnVlOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsIENBTExfU1RVQiwgc2l6ZW9mIENBTExfU1RVQiAtIDEpID09IDAKLQkgICB8fCBzdHJuY21wIChuYW1lLCBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYXNlY3Rpb24gKipsb2M7Ci0KLSAgICAgIC8qIExvb2sgYXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gZmlndXJlIG91dCB3aGljaCBzeW1ib2wKLSAgICAgICAgIHRoaXMgaXMgZm9yLiAgKi8KLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsb2NzLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYKLQkgIHx8IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdID09IE5VTEwpCi0JewotCSAgLyogVGhpcyBzdHViIHdhcyBhY3R1YWxseSBidWlsdCBmb3IgYSBzdGF0aWMgc3ltYm9sIGRlZmluZWQKLQkgICAgIGluIHRoZSBzYW1lIGZpbGUuICBXZSBhc3N1bWUgdGhhdCBhbGwgc3RhdGljIHN5bWJvbHMgaW4KLQkgICAgIG1pcHMxNiBjb2RlIGFyZSB0aGVtc2VsdmVzIG1pcHMxNiwgc28gd2UgY2FuIHNpbXBseQotCSAgICAgZGlzY2FyZCB0aGlzIHN0dWIuICBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUKLQkgICAgIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMsIHdlIGNhbgotCSAgICAgZWFzaWx5IGRpc2NhcmQgaXQgYnkgc2V0dGluZyB0aGUgU0VDX0VYQ0xVREUgZmxhZy4gICovCi0JICBzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBoID0gKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl0pOwotCi0gICAgICAvKiBIIGlzIHRoZSBzeW1ib2wgdGhpcyBzdHViIGlzIGZvci4gICovCi0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCBDQUxMX0ZQX1NUVUIsIHNpemVvZiBDQUxMX0ZQX1NUVUIgLSAxKSA9PSAwKQotCWxvYyA9ICZoLT5jYWxsX2ZwX3N0dWI7Ci0gICAgICBlbHNlCi0JbG9jID0gJmgtPmNhbGxfc3R1YjsKLQotICAgICAgLyogSWYgd2UgYWxyZWFkeSBoYXZlIGFuIGFwcHJvcHJpYXRlIHN0dWIgZm9yIHRoaXMgZnVuY3Rpb24sIHdlCi0JIGRvbid0IG5lZWQgYW5vdGhlciBvbmUsIHNvIHdlIGNhbiBkaXNjYXJkIHRoaXMgb25lLiAgU2luY2UKLQkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucwotCSB0byBvdXRwdXQgc2VjdGlvbnMsIHdlIGNhbiBlYXNpbHkgZGlzY2FyZCBpdCBieSBzZXR0aW5nIHRoZQotCSBTRUNfRVhDTFVERSBmbGFnLiAgV2UgY2FuIGFsc28gZGlzY2FyZCB0aGlzIHNlY3Rpb24gaWYgd2UKLQkgaGFwcGVuIHRvIGFscmVhZHkga25vdyB0aGF0IHRoaXMgaXMgYSBtaXBzMTYgZnVuY3Rpb247IGl0IGlzCi0JIG5vdCBuZWNlc3NhcnkgdG8gY2hlY2sgdGhpcyBoZXJlLCBhcyBpdCBpcyBjaGVja2VkIGxhdGVyLCBidXQKLQkgaXQgaXMgc2xpZ2h0bHkgZmFzdGVyIHRvIGNoZWNrIG5vdy4gICovCi0gICAgICBpZiAoKmxvYyAhPSBOVUxMIHx8IGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKLQl7Ci0JICBzZWMtPmZsYWdzIHw9IFNFQ19FWENMVURFOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICAqbG9jID0gc2VjOwotICAgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPm1pcHMxNl9zdHVic19zZWVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNnb3QgPSBOVUxMOwotICAgICAgZyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBpZiAoc2dvdCA9PSBOVUxMKQotCWcgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotCSAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0JICBCRkRfQVNTRVJUIChnICE9IE5VTEwpOwotCX0KLSAgICB9Ci0KLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBleHRzeW1vZmYpCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBleHRzeW1vZmZdOwotCi0JICAvKiBUaGlzIG1heSBiZSBhbiBpbmRpcmVjdCBzeW1ib2wgY3JlYXRlZCBiZWNhdXNlIG9mIGEgdmVyc2lvbi4gICovCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFNvbWUgcmVsb2NzIHJlcXVpcmUgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCB8fCBzZ290ID09IE5VTEwpCi0JewotCSAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQkgICAgewotCSAgICBjYXNlIFJfTUlQU19HT1QxNjoKLQkgICAgY2FzZSBSX01JUFNfQ0FMTDE2OgotCSAgICBjYXNlIFJfTUlQU19DQUxMX0hJMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLQkgICAgY2FzZSBSX01JUFNfR09UX0hJMTY6Ci0JICAgIGNhc2UgUl9NSVBTX0dPVF9MTzE2OgotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIG1pcHNfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgICAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCkgIT0gTlVMTCk7Ci0JICAgICAgZyA9IChzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqKSBlbGZfc2VjdGlvbl9kYXRhIChzZ290KS0+dGRhdGE7Ci0JICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfTUlQU18zMjoKLQkgICAgY2FzZSBSX01JUFNfUkVMMzI6Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMCi0JCSAgJiYgKGluZm8tPnNoYXJlZCB8fCBoICE9IE5VTEwpCi0JCSAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTUlQU19DQUxMMTY6Ci0JY2FzZSBSX01JUFNfQ0FMTF9ISTE2OgotCWNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBDQUxMMTYgcmVsb2MgYXQgMHglbHggbm90IGFnYWluc3QgZ2xvYmFsIHN5bWJvbCIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSByZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkgICAgewotCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIE5vdGUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgZ290IHN5bWJvbCBpbiAuZHluc3ltLiAgKi8KLQkgIGlmIChnLT5nbG9iYWxfZ290c3ltID09IDAKLQkgICAgICB8fCBnLT5nbG9iYWxfZ290c3ltID4gKHVuc2lnbmVkIGxvbmcpIGgtPmR5bmluZHgpCi0JICAgIGctPmdsb2JhbF9nb3RzeW0gPSBoLT5keW5pbmR4OwotCi0JICAvKiBNYWtlIHRoaXMgc3ltYm9sIHRvIGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcgZ290IGVudHJ5LiAgKi8KLQkgIGgtPmdvdC5vZmZzZXQgPSAwOwotCi0JICAvKiBXZSBuZWVkIGEgc3R1Yiwgbm90IGEgcGx0IGVudHJ5IGZvciB0aGUgdW5kZWZpbmVkCi0JICAgICBmdW5jdGlvbi4gIEJ1dCB3ZSByZWNvcmQgaXQgYXMgaWYgaXQgbmVlZHMgcGx0LiAgU2VlCi0JICAgICBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGluIGVsZmxpbmsuaC4gICovCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgaC0+dHlwZSA9IFNUVF9GVU5DOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9NSVBTX0dPVDE2OgotCWNhc2UgUl9NSVBTX0dPVF9ISTE2OgotCWNhc2UgUl9NSVBTX0dPVF9MTzE2OgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5LiAgKi8KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIE5vdGUgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgZ290IHN5bWJvbCBpbgotICAgICAgICAgICAgICAgICAuZHluc3ltLiAgKi8KLQkgICAgICBpZiAoZy0+Z2xvYmFsX2dvdHN5bSA9PSAwCi0JCSAgfHwgZy0+Z2xvYmFsX2dvdHN5bSA+ICh1bnNpZ25lZCBsb25nKSBoLT5keW5pbmR4KQotCQlnLT5nbG9iYWxfZ290c3ltID0gaC0+ZHluaW5keDsKLQotCSAgICAgIC8qIE1ha2UgdGhpcyBzeW1ib2wgdG8gYmUgdGhlIGdsb2JhbCBnb3Qgc3ltYm9sLiAgKi8KLQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gMDsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWNhc2UgUl9NSVBTXzMyOgotCWNhc2UgUl9NSVBTX1JFTDMyOgotCSAgaWYgKChpbmZvLT5zaGFyZWQgfHwgaCAhPSBOVUxMKQotCSAgICAgICYmIChzZWMtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZSA9ICIucmVsLmR5biI7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGlmIChzcmVsb2MgPT0gTlVMTAotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsb2MsCi0JCQkJCQkgICAgICAoU0VDX0FMTE9DCi0JCQkJCQkgICAgICAgfCBTRUNfTE9BRAotCQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCQkJICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbG9jLAotCQkJCQkJCSAgNCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoaW5mby0+c2hhcmVkKQotCQl7Ci0JCSAgLyogV2hlbiBjcmVhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG11c3QgY29weSB0aGVzZQotCQkgICAgIHJlbG9jIHR5cGVzIGludG8gdGhlIG91dHB1dCBmaWxlIGFzIFJfTUlQU19SRUwzMgotCQkgICAgIHJlbG9jcy4gIFdlIG1ha2Ugcm9vbSBmb3IgdGhpcyByZWxvYyBpbiB0aGUKLQkJICAgICAucmVsLmR5biByZWxvYyBzZWN0aW9uICovCi0JCSAgaWYgKHNyZWxvYy0+X3Jhd19zaXplID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIEFkZCBhIG51bGwgZWxlbWVudC4gKi8KLQkJICAgICAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCQkgICAgICArK3NyZWxvYy0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0JCSAgc3JlbG9jLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWwpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaG1pcHM7Ci0KLQkJICAvKiBXZSBvbmx5IG5lZWQgdG8gY29weSB0aGlzIHJlbG9jIGlmIHRoZSBzeW1ib2wgaXMKLSAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgaW4gYSBkeW5hbWljIG9iamVjdC4gICovCi0JCSAgaG1pcHMgPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCQkgICsraG1pcHMtPm1pcHNfMzJfcmVsb2NzOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKFNHSV9DT01QQVQgKGFiZmQpKQotCSAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+Y29tcGFjdF9yZWxfc2l6ZSArPQotCSAgICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfY3JpbmZvKTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfTUlQU18yNjoKLQljYXNlIFJfTUlQU19HUFJFTDE2OgotCWNhc2UgUl9NSVBTX0xJVEVSQUw6Ci0JY2FzZSBSX01JUFNfR1BSRUwzMjoKLQkgIGlmIChTR0lfQ09NUEFUIChhYmZkKSkKLQkgICAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmNvbXBhY3RfcmVsX3NpemUgKz0KLQkgICAgICBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NyaW5mbyk7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotCSAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9NSVBTX0dOVV9WVElOSEVSSVQ6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0aW5oZXJpdCAoYWJmZCwgc2VjLCBoLCByZWwtPnJfb2Zmc2V0KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotCSAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX01JUFNfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogSWYgdGhpcyByZWxvYyBpcyBub3QgYSAxNiBiaXQgY2FsbCwgYW5kIGl0IGhhcyBhIGdsb2JhbAotICAgICAgICAgc3ltYm9sLCB0aGVuIHdlIHdpbGwgbmVlZCB0aGUgZm5fc3R1YiBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICAgICBSZWZlcmVuY2VzIGZyb20gYSBzdHViIHNlY3Rpb24gZG8gbm90IGNvdW50LiAqLwotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykgIT0gUl9NSVBTMTZfMjYKLQkgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBGTl9TVFVCLAotCQkgICAgICBzaXplb2YgRk5fU1RVQiAtIDEpICE9IDAKLQkgICYmIHN0cm5jbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCBDQUxMX1NUVUIsCi0JCSAgICAgIHNpemVvZiBDQUxMX1NUVUIgLSAxKSAhPSAwCi0JICAmJiBzdHJuY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgQ0FMTF9GUF9TVFVCLAotCQkgICAgICBzaXplb2YgQ0FMTF9GUF9TVFVCIC0gMSkgIT0gMCkKLQl7Ci0JICBzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICptaDsKLQotCSAgbWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCSAgbWgtPm5lZWRfZm5fc3R1YiA9IHRydWU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1pcHNfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIC8qID8/PyBEbyBtaXBzMTYgc3R1YiBzZWN0aW9ucyBuZWVkIHRvIGJlIGhhbmRsZWQgc3BlY2lhbD8gICovCi0KLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfTUlQU19HTlVfVlRJTkhFUklUOgotCWNhc2UgUl9NSVBTX0dOVV9WVEVOVFJZOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCSAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmMucC0+c2VjdGlvbjsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotCSAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0JICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLQkJJiYgc3ltLT5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKSkKLQl7Ci0JICByZXR1cm4gYmZkX3NlY3Rpb25fZnJvbV9lbGZfaW5kZXggKGFiZmQsIHN5bS0+c3Rfc2huZHgpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudHMgZm9yIHRoZSBzZWN0aW9uIGJlaW5nIHJlbW92ZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0jaWYgMAotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfTUlQU19HT1QxNjoKLSAgICAgIGNhc2UgUl9NSVBTX0NBTEwxNjoKLSAgICAgIGNhc2UgUl9NSVBTX0NBTExfSEkxNjoKLSAgICAgIGNhc2UgUl9NSVBTX0NBTExfTE8xNjoKLSAgICAgIGNhc2UgUl9NSVBTX0dPVF9ISTE2OgotICAgICAgY2FzZSBSX01JUFNfR09UX0xPMTY6Ci0JLyogPz8/IEl0IHdvdWxkIHNlZW0gdGhhdCB0aGUgZXhpc3RpbmcgTUlQUyBjb2RlIGRvZXMgbm8gc29ydAotCSAgIG9mIHJlZmVyZW5jZSBjb3VudGluZyBvciB3aGF0bm90IG9uIGl0cyBHT1QgYW5kIFBMVCBlbnRyaWVzLAotCSAgIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBnYXJiYWdlIGNvbGxlY3QgdGhlbSBhdCB0aGlzIHRpbWUuICAqLwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaG1pcHM7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgZHluYW1pYyBvYmplY3QsIHdlIG5lZWQgdG8gY29weQotICAgICBhbnkgUl9NSVBTXzMyIG9yIFJfTUlQU19SRUwzMiByZWxvY3MgYWdhaW5zdCBpdCBpbnRvIHRoZSBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGhtaXBzID0gKHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKikgaDsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBobWlwcy0+bWlwc18zMl9yZWxvY3MgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbC5keW4iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQl7Ci0JICAvKiBNYWtlIHJvb20gZm9yIGEgbnVsbCBlbGVtZW50LiAqLwotCSAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICsrcy0+cmVsb2NfY291bnQ7Ci0JfQotICAgICAgcy0+X3Jhd19zaXplICs9IGhtaXBzLT5taXBzXzMyX3JlbG9jcyAqIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLSAgICB9Ci0KLSAgLyogRm9yIGEgZnVuY3Rpb24sIGNyZWF0ZSBhIHN0dWIsIGlmIG5lZWRlZC4gKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDApCi0gICAgewotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCB0aGVuIHNldAotCSB0aGUgc3ltYm9sIHRvIHRoZSBzdHViIGxvY2F0aW9uLiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlCi0JIGZ1bmN0aW9uIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsCi0JIGV4ZWN1dGFibGUgYW5kIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIFdlIG5lZWQgLnN0dWIgc2VjdGlvbi4gICovCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgICAgIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0JICAvKiBYWFggV3JpdGUgdGhpcyBzdHViIGFkZHJlc3Mgc29tZXdoZXJlLiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0KLQkgIC8qIE1ha2Ugcm9vbSBmb3IgdGhpcyBzdHViIGNvZGUuICAqLwotCSAgcy0+X3Jhd19zaXplICs9IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCi0JICAvKiBUaGUgbGFzdCBoYWxmIHdvcmQgb2YgdGhlIHN0dWIgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgaW5kZXgKLQkgICAgIG9mIHRoaXMgc3ltYm9sIGluIC5keW5zeW0gc2VjdGlvbi4gICovCi0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiByZWFkLAotICAgYW5kIHRoZSBpbnB1dCBzZWN0aW9ucyBoYXZlIGJlZW4gYXNzaWduZWQgdG8gb3V0cHV0IHNlY3Rpb25zLiAgV2UKLSAgIGNoZWNrIGZvciBhbnkgbWlwczE2IHN0dWIgc2VjdGlvbnMgdGhhdCB3ZSBjYW4gZGlzY2FyZC4gICovCi0KLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmX2NoZWNrX21pcHMxNl9zdHVicwotICBQQVJBTVMgKChzdHJ1Y3QgbWlwc19lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpyaTsKLQotICAvKiBUaGUgLnJlZ2luZm8gc2VjdGlvbiBoYXMgYSBmaXhlZCBzaXplLiAgKi8KLSAgcmkgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgIi5yZWdpbmZvIik7Ci0gIGlmIChyaSAhPSBOVUxMKQotICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCByaSwgc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvKSk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+bWlwczE2X3N0dWJzX3NlZW4pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbWlwc19lbGZfbGlua19oYXNoX3RyYXZlcnNlIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgICBtaXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMsCi0JCQkgICAgICAgKFBUUikgTlVMTCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIHRoZSBtaXBzMTYgc3R1YnMgZm9yIGEgcGFydGljdWxhciBzeW1ib2wsIGFuZCBzZWUgaWYgd2UgY2FuCi0gICBkaXNjYXJkIHRoZW0uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9jaGVja19taXBzMTZfc3R1YnMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBpZiAoaC0+Zm5fc3R1YiAhPSBOVUxMCi0gICAgICAmJiAhIGgtPm5lZWRfZm5fc3R1YikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBmbl9zdHViOyB0aGUgb25seSByZWZlcmVuY2VzIHRvIHRoaXMgc3ltYm9sCi0gICAgICAgICBhcmUgMTYgYml0IGNhbGxzLiAgQ2xvYmJlciB0aGUgc2l6ZSB0byAwIHRvIHByZXZlbnQgaXQgZnJvbQotICAgICAgICAgYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Zm5fc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPl9jb29rZWRfc2l6ZSA9IDA7Ci0gICAgICBoLT5mbl9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmZuX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmZuX3N0dWItPmZsYWdzIHw9IFNFQ19FWENMVURFOwotICAgIH0KLQotICBpZiAoaC0+Y2FsbF9zdHViICE9IE5VTEwKLSAgICAgICYmIGgtPnJvb3Qub3RoZXIgPT0gU1RPX01JUFMxNikKLSAgICB7Ci0gICAgICAvKiBXZSBkb24ndCBuZWVkIHRoZSBjYWxsX3N0dWI7IHRoaXMgaXMgYSAxNiBiaXQgZnVuY3Rpb24sIHNvCi0gICAgICAgICBjYWxscyBmcm9tIG90aGVyIDE2IGJpdCBmdW5jdGlvbnMgYXJlIE9LLiAgQ2xvYmJlciB0aGUgc2l6ZQotICAgICAgICAgdG8gMCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICAgICAgaC0+Y2FsbF9zdHViLT5fcmF3X3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5fY29va2VkX3NpemUgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5mbGFncyAmPSB+IFNFQ19SRUxPQzsKLSAgICAgIGgtPmNhbGxfc3R1Yi0+cmVsb2NfY291bnQgPSAwOwotICAgICAgaC0+Y2FsbF9zdHViLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgICB9Ci0KLSAgaWYgKGgtPmNhbGxfZnBfc3R1YiAhPSBOVUxMCi0gICAgICAmJiBoLT5yb290Lm90aGVyID09IFNUT19NSVBTMTYpCi0gICAgewotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0aGUgY2FsbF9zdHViOyB0aGlzIGlzIGEgMTYgYml0IGZ1bmN0aW9uLCBzbwotICAgICAgICAgY2FsbHMgZnJvbSBvdGhlciAxNiBiaXQgZnVuY3Rpb25zIGFyZSBPSy4gIENsb2JiZXIgdGhlIHNpemUKLSAgICAgICAgIHRvIDAgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgKi8KLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+X3Jhd19zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+X2Nvb2tlZF9zaXplID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+ZmxhZ3MgJj0gfiBTRUNfUkVMT0M7Ci0gICAgICBoLT5jYWxsX2ZwX3N0dWItPnJlbG9jX2NvdW50ID0gMDsKLSAgICAgIGgtPmNhbGxfZnBfc3R1Yi0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSAuaW50ZXJwIHNlY3Rpb24gdG8gdGhlIGludGVycHJldGVyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgCi0JICAgID0gc3RybGVuIChFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAob3V0cHV0X2JmZCkpICsgMTsKLQkgIHMtPmNvbnRlbnRzIAotCSAgICA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSIChvdXRwdXRfYmZkKTsKLQl9Ci0gICAgfQotCi0gIC8qIFJlY29tcHV0ZSB0aGUgc2l6ZSBvZiAuZ290IGZvciBsb2NhbCBlbnRpcmVzIChyZXNlcnZlZCBhbmQKLSAgICAgaGlwYWdlcykgaWYgbmVlZGVkLiAgVG8gZXN0aW1hdGUgaXQsIGdldCB0aGUgdXBwZXIgYm91bmQgb2YgdG90YWwKLSAgICAgc2l6ZSBvZiBsb2FkYWJsZSBzZWN0aW9ucy4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCi0gIGlmIChzZ290ICE9IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBsb2FkYWJsZV9zaXplID0gMDsKLSAgICAgIGJmZF9zaXplX3R5cGUgbG9jYWxfZ290bm87Ci0gICAgICBzdHJ1Y3QgX2JmZCAqc3ViOwotCi0gICAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgICAgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotICAgICAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWI7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotCWZvciAocyA9IHN1Yi0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICB7Ci0JICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgICAgY29udGludWU7Ci0JICAgIGxvYWRhYmxlX3NpemUgKz0gKHMtPl9yYXdfc2l6ZSArIDB4ZikgJiB+MHhmOwotCSAgfQotCi0gICAgICBsb2FkYWJsZV9zaXplICs9IE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCi0gICAgICAvKiBBc3N1bWUgdGhlcmUgYXJlIHR3byBsb2FkYWJsZSBzZWdtZW50cyBjb25zaXN0aW5nIG9mCi0JIGNvbnRpZ3VvdXMgc2VjdGlvbnMuICBJcyA1IGVub3VnaD8gKi8KLSAgICAgIGxvY2FsX2dvdG5vID0gKGxvYWRhYmxlX3NpemUgPj4gMTYpICsgNSArIE1JUFNfUkVTRVJWRURfR09UTk87Ci0gICAgICBnLT5sb2NhbF9nb3RubyA9IGxvY2FsX2dvdG5vOwotICAgICAgc2dvdC0+X3Jhd19zaXplICs9IGxvY2FsX2dvdG5vICogNDsKLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIG9ubHkgc3RyaXAgdGhlIHNlY3Rpb24gaWYgdGhlIG91dHB1dCBzZWN0aW9uIG5hbWUKLSAgICAgICAgICAgICAgICAgaGFzIHRoZSBzYW1lIG5hbWUuICBPdGhlcndpc2UsIHRoZXJlIG1pZ2h0IGJlIHNldmVyYWwKLSAgICAgICAgICAgICAgICAgaW5wdXQgc2VjdGlvbnMgZm9yIHRoaXMgb3V0cHV0IHNlY3Rpb24uICBGSVhNRTogVGhpcwotICAgICAgICAgICAgICAgICBjb2RlIGlzIHByb2JhYmx5IG5vdCBuZWVkZWQgdGhlc2UgZGF5cyBhbnlob3csIHNpbmNlCi0gICAgICAgICAgICAgICAgIHRoZSBsaW5rZXIgbm93IGRvZXMgbm90IGNyZWF0ZSBlbXB0eSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCSAgICAgIGlmIChzLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCSAgJiYgc3RyY21wIChuYW1lLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAocy0+b3V0cHV0X3NlY3Rpb24tPm93bmVyLAotCQkJCQkJICAgcy0+b3V0cHV0X3NlY3Rpb24pKSA9PSAwKQotCQlzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4KLSAgICAgICAgICAgICAgICAgSWYgdGhlIHJlbG9jYXRpb24gc2VjdGlvbiBpcyAucmVsLmR5biwgd2UgYWx3YXlzCi0gICAgICAgICAgICAgICAgIGFzc2VydCBhIERUX1RFWFRSRUwgZW50cnkgcmF0aGVyIHRoYW4gdGVzdGluZyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgIHRoZXJlIGV4aXN0cyBhIHJlbG9jYXRpb24gdG8gYSByZWFkIG9ubHkgc2VjdGlvbiBvcgotICAgICAgICAgICAgICAgICBub3QuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNCk7Ci0JICAgICAgaWYgKCh0YXJnZXQgIT0gTlVMTAotCQkgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJICB8fCBzdHJjbXAgKG91dG5hbWUsICIucmVsLmR5biIpID09IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsLmR5biIpICE9IDApCi0JCXMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuZ290IiwgNCkgPT0gMCkKLQl7Ci0JICBpbnQgaTsKLQotCSAgQkZEX0FTU0VSVCAoZWxmX3NlY3Rpb25fZGF0YSAocykgIT0gTlVMTCk7Ci0JICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50ZGF0YTsKLQkgIEJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLQkgIC8qIEZpeCB0aGUgc2l6ZSBvZiAuZ290IHNlY3Rpb24gZm9yIHRoZSBjb3JyZXNwb25kZW5jZSBvZgotCSAgICAgZ2xvYmFsIHN5bWJvbHMgYW5kIGdvdCBlbnRyaWVzLiBUaGlzIGFkZHMgc29tZSB1c2VsZXNzCi0JICAgICBnb3QgZW50cmllcy4gSXMgdGhpcyByZXF1aXJlZCBieSBBQkkgcmVhbGx5PyAgKi8KLQkgIGkgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50IC0gZy0+Z2xvYmFsX2dvdHN5bTsKLQkgIHMtPl9yYXdfc2l6ZSArPSBpICogNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChvdXRwdXRfYmZkKSkgPT0gMCkKLQl7Ci0JICAvKiBJcml4IHJsZCBhc3N1bWVzIHRoYXQgdGhlIGZ1bmN0aW9uIHN0dWIgaXNuJ3QgYXQgdGhlIGVuZAotCSAgICAgb2YgLnRleHQgc2VjdGlvbi4gU28gcHV0IGEgZHVtbXkuIFhYWCAgKi8KLQkgIHMtPl9yYXdfc2l6ZSArPSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRTsKLQl9Ci0gICAgICBlbHNlIGlmICghIGluZm8tPnNoYXJlZAotCSAgICAgICAmJiAhIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT51c2VfcmxkX29ial9oZWFkCi0JICAgICAgICYmIHN0cm5jbXAgKG5hbWUsICIucmxkX21hcCIsIDgpID09IDApCi0JewotCSAgLyogV2UgYWRkIGEgcm9vbSBmb3IgX19ybGRfbWFwLiBJdCB3aWxsIGJlIGZpbGxlZCBpbiBieSB0aGUKLQkgICAgIHJ0bGQgdG8gY29udGFpbiBhIHBvaW50ZXIgdG8gdGhlIF9yX2RlYnVnIHN0cnVjdHVyZS4gICovCi0JICBzLT5fcmF3X3NpemUgKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKQotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmNvbXBhY3RfcmVsIiwgMTIpID09IDApCi0Jcy0+X3Jhd19zaXplICs9IG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5jb21wYWN0X3JlbF9zaXplOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpCi0JICAgICAgID09IDApCi0Jcy0+X3Jhd19zaXplID0gKHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfTXN5bSkgCi0JCQkqIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50Ci0JCQkgICArIGJmZF9jb3VudF9zZWN0aW9ucyAob3V0cHV0X2JmZCkpKTsKLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIuaW5pdCIsIDUpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfbWlwc19maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotCSAgICB7Ci0JICAgICAgLyogU0dJIG9iamVjdCBoYXMgdGhlIGVxdWl2YWxlbmNlIG9mIERUX0RFQlVHIGluIHRoZQotCQkgRFRfTUlQU19STERfTUFQIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfUkxEX01BUCwgMCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZHluIikpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMU1osIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMRU5ULCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0NPTkZMSUNUTk8sIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0xJQkxJU1ROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5jb25mbGljdCIpICE9IE5VTEwpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0NPTkZMSUNULCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5saWJsaXN0Iik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfTElCTElTVCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19STERfVkVSU0lPTiwgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfRkxBR1MsIDApKQotCXJldHVybiBmYWxzZTsKLQotI2lmIDAKLSAgICAgIC8qIFRpbWUgc3RhbXBzIGluIGV4ZWN1dGFibGUgZmlsZXMgYXJlIGEgYmFkIGlkZWEuICAqLwotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX1RJTUVfU1RBTVAsIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0jaWYgMCAvKiBGSVhNRSAgKi8KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19JQ0hFQ0tTVU0sIDApKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotCi0jaWYgMCAvKiBGSVhNRSAgKi8KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19JVkVSU0lPTiwgMCkpCi0JcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19CQVNFX0FERFJFU1MsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9NSVBTX0xPQ0FMX0dPVE5PLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19TWU1UQUJOTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfVU5SRUZFWFROTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX01JUFNfR09UU1lNLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19ISVBBR0VOTywgMCkpCi0JcmV0dXJuIGZhbHNlOwotCi0jaWYgMCAvKiAoU0dJX0NPTVBBVCkgKi8KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW5pdCIpKQotCWlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSU5JVCwgMCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZmluaSIpKQotCWlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfRklOSSwgMCkpCi0JICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX01TWU1fU0VDVElPTl9OQU1FIChkeW5vYmopKQotCSAgJiYgIWJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTUlQU19NU1lNLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHdlIHVzZSBkeW5hbWljIGxpbmtpbmcsIHdlIGdlbmVyYXRlIGEgc2VjdGlvbiBzeW1ib2wgZm9yIGVhY2gKLSAgICAgb3V0cHV0IHNlY3Rpb24uICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5Ci0gICAgIG11c3QgY29tZSBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0gICAgIFRoYXQgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGV4IG9mIGV2ZXJ5Ci0gICAgIG90aGVyIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgewotICAgIHVuc2lnbmVkIGludCBjLCBpOwotICAgIHN0cnVjdCBtaXBzX2dvdF9pbmZvICpnOwotCi0gICAgYyA9IDA7Ci0gICAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgICAgewotI2lmIDAKLQkvKiBXZSBubyBsb25nZXIgdHJ5IHRvIHJlc3RyaWN0IHRoZSBzZXQgb2Ygc2VjdGlvbnMgd2hpY2ggZ2V0Ci0gICAgICAgICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJpZXMsIHNpbmNlIGl0IGZhaWxzIGlmIHdlIGhhdmUKLSAgICAgICAgICAgb3RoZXIgcmFuZG9tIHNlY3Rpb25zIHdoaWNoIG5lZWQgZHluYW1pYyByZWxvY2F0aW9ucy4gICovCi0JY29uc3QgY2hhciAqIGNvbnN0ICpuYW1lcDsKLQliZmRfc2l6ZV90eXBlIHN0cmluZGV4OwotCXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmR5bnN0cjsKLQotCWlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLQkgIHsKLQkgICAgYyA9IFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUyAtIDE7Ci0JICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAgbWlwc19lbGZfYWRqdXN0X2R5bmluZHgsCi0JCQkJICAgIChQVFIpICZjKTsKLQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjOwotCi0JICAgIGR5bnN0ciA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyOwotCSAgICBCRkRfQVNTRVJUIChkeW5zdHIgIT0gTlVMTCk7Ci0KLQkgICAgZm9yIChpID0gMSwgbmFtZXAgPSBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzOwotCQkgKm5hbWVwICE9IE5VTEw7Ci0JCSBpKyssIG5hbWVwKyspCi0JICAgICAgewotCQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICpuYW1lcCk7Ci0JCWlmIChzICE9IE5VTEwpCi0JCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSBpOwotCi0JCXN0cmluZGV4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsICpuYW1lcCwgdHJ1ZSwgZmFsc2UpOwotCQlpZiAoc3RyaW5kZXggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkgIHJldHVybiBmYWxzZTsKLQotCQltaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltX3NlY19zdHJpbmRleFtpXSA9IHN0cmluZGV4OwotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0jZW5kaWYgLyogMCAqLwotCSAgewotCSAgICBjID0gYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKTsKLQkgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICBfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4LAotCQkJCSAgICAoUFRSKSAmYyk7Ci0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgKz0gYzsKLQotCSAgICBmb3IgKGkgPSAxLCBzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQsIGkrKykKLQkgICAgICB7Ci0JCWVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gaTsKLQkJLyogVGhlc2Ugc3ltYm9scyB3aWxsIGhhdmUgbm8gbmFtZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLQkJICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0KLSAgICBpZiAoc2dvdCAhPSBOVUxMKQotICAgICAgewotCUJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotCWcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotCUJGRF9BU1NFUlQgKGcgIT0gTlVMTCk7Ci0KLQkvKiBJZiB0aGVyZSBhcmUgbm8gZ2xvYmFsIGdvdCBzeW1ib2xzLCBmYWtlIHRoZSBsYXN0IHN5bWJvbCBzbwotCSAgIGZvciBzYWZldHkuICAqLwotCWlmIChnLT5nbG9iYWxfZ290c3ltKQotCSAgZy0+Z2xvYmFsX2dvdHN5bSArPSBjOwotCWVsc2UKLQkgIGctPmdsb2JhbF9nb3RzeW0gPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50IC0gMTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgZHluYW1pYyBzeW1ib2wgaGFuZGxpbmcuICBXZSBzZXQgdGhlIGNvbnRlbnRzIG9mIHZhcmlvdXMKLSAgIGR5bmFtaWMgc2VjdGlvbnMgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1taXBzX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgKG91dHB1dF9iZmQsIGluZm8sIGgsIHN5bSkKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGJmZF92bWEgZ3ZhbDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGFzZWN0aW9uICpzbXN5bTsKLSAgc3RydWN0IG1pcHNfZ290X2luZm8gKmc7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBtaXBzX2VsZl9saW5rX2hhc2hfZW50cnkgKm1oOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBndmFsID0gc3ltLT5zdF92YWx1ZTsKLSAgbWggPSAoc3RydWN0IG1pcHNfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX2J5dGUgc3R1YltNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRV07Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIHN0dWIuICBTZXQgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgIE1JUFNfRUxGX1NUVUJfU0VDVElPTl9OQU1FIChkeW5vYmopKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgdGhlIHN0dWIuICAqLwotICAgICAgcCA9IHN0dWI7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0xXKG91dHB1dF9iZmQpLCBwKTsKLSAgICAgIHAgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNUVUJfTU9WRSwgcCk7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIEZJWE1FOiBDYW4gaC0+ZHluaW5kZXggYmUgbW9yZSB0aGFuIDY0Sz8gICovCi0gICAgICBpZiAoaC0+ZHluaW5keCAmIDB4ZmZmZjAwMDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBTVFVCX0pBTFIsIHApOwotICAgICAgcCArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1RVQl9MSTE2ICsgaC0+ZHluaW5keCwgcCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPnBsdC5vZmZzZXQgPD0gcy0+X3Jhd19zaXplKTsKLSAgICAgIG1lbWNweSAocy0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0LCBzdHViLCBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0KLSAgICAgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQuICBwbHQub2Zmc2V0ICE9IC0xIG9jY3VycwotCSBvbmx5IGZvciB0aGUgcmVmZXJlbmNlZCBzeW1ib2wuICAqLwotICAgICAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQotICAgICAgLyogVGhlIHJ1bi10aW1lIGxpbmtlciB1c2VzIHRoZSBzdF92YWx1ZSBmaWVsZCBvZiB0aGUgc3ltYm9sCi0JIHRvIHJlc2V0IHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciB0aGlzIGV4dGVybmFsCi0JIHRvIGl0cyBzdHViIGFkZHJlc3Mgd2hlbiB1bmxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgICAgIGd2YWwgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCArIGgtPnBsdC5vZmZzZXQ7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gZ3ZhbDsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpICE9IE5VTEwpOwotICBnID0gKHN0cnVjdCBtaXBzX2dvdF9pbmZvICopIGVsZl9zZWN0aW9uX2RhdGEgKHNnb3QpLT50ZGF0YTsKLSAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotICBpZiAoKHVuc2lnbmVkIGxvbmcpIGgtPmR5bmluZHggPj0gZy0+Z2xvYmFsX2dvdHN5bSkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIG9mZnNldDsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0cwotCSB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZyBnb3QgZW50cnksIGlmIG5lZWRlZC4gICovCi0gICAgICBpZiAoaC0+Z290Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEpCi0JewotCSAgb2Zmc2V0ID0gKGgtPmR5bmluZHggLSBnLT5nbG9iYWxfZ290c3ltICsgZy0+bG9jYWxfZ290bm8pICogNDsKLQkgIEJGRF9BU1NFUlQgKGctPmxvY2FsX2dvdG5vICogNCA8PSBvZmZzZXQKLQkJICAgICAgJiYgb2Zmc2V0IDwgc2dvdC0+X3Jhd19zaXplKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGd2YWwsIHNnb3QtPmNvbnRlbnRzICsgb2Zmc2V0KTsKLQl9Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIC5tc3ltIGVudHJ5LCBpZiBhcHByb3ByaWF0ZS4gICovCi0gIHNtc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgCi0JCQkJICAgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotICBpZiAoc21zeW0pCi0gICAgewotICAgICAgRWxmMzJfSW50ZXJuYWxfTXN5bSBtc3ltOwotCi0gICAgICBtc3ltLm1zX2hhc2hfdmFsdWUgPSBiZmRfZWxmX2hhc2ggKGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgLyogSXQgaXMgdW5kb2N1bWVudGVkIHdoYXQgdGhlIGAxJyBpbmRpY2F0ZXMsIGJ1dCBJUklYNiB1c2VzCi0JIHRoaXMgdmFsdWUuICAqLwotICAgICAgbXN5bS5tc19pbmZvID0gRUxGMzJfTVNfSU5GTyAobWgtPm1pbl9keW5fcmVsb2NfaW5kZXgsIDEpOwotICAgICAgYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9vdXQgCi0JKGR5bm9iaiwgJm1zeW0sCi0JICgoRWxmMzJfRXh0ZXJuYWxfTXN5bSAqKSBzbXN5bS0+Y29udGVudHMpICsgaC0+ZHluaW5keCk7Ci0gICAgfQotCi0gIC8qIE1hcmsgX0RZTkFNSUMgYW5kIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhcyBhYnNvbHV0ZS4gICovCi0gIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotICBpZiAoc3RyY21wIChuYW1lLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKG5hbWUsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfRFlOQU1JQ19MSU5LIikgPT0gMCkKLSAgICB7Ci0gICAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgICAgIHN5bS0+c3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfR0xPQkFMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0tPnN0X3ZhbHVlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICJfZ3BfZGlzcCIpID09IDApCi0JewotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF92YWx1ZSA9IGVsZl9ncCAob3V0cHV0X2JmZCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCBtaXBzX2VsZl9keW5zeW1fcnRwcm9jX25hbWVzWzBdKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1sxXSkgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF9vdGhlciA9IFNUT19QUk9URUNURUQ7Ci0JICBzeW0tPnN0X3ZhbHVlID0gMDsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgbWlwc19lbGZfZHluc3ltX3J0cHJvY19uYW1lc1syXSkgPT0gMCkKLQl7Ci0JICBzeW0tPnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgU1RUX1NFQ1RJT04pOwotCSAgc3ltLT5zdF9vdGhlciA9IFNUT19QUk9URUNURUQ7Ci0JICBzeW0tPnN0X3ZhbHVlID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnByb2NlZHVyZV9jb3VudDsKLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0FCUykKLQl7Ci0JICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQykKLQkgICAgc3ltLT5zdF9zaG5keCA9IFNITl9NSVBTX1RFWFQ7Ci0JICBlbHNlIGlmIChoLT50eXBlID09IFNUVF9PQkpFQ1QpCi0JICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fTUlQU19EQVRBOwotCX0KLSAgICB9Ci0KLSAgaWYgKFNHSV9DT01QQVQgKG91dHB1dF9iZmQpCi0gICAgICAmJiAhIGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBpZiAoISBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgJiYgc3RyY21wIChuYW1lLCAiX19ybGRfbWFwIikgPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmxkX21hcCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHN5bS0+c3RfdmFsdWUgPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzLT5jb250ZW50cyk7Ci0JICBpZiAobWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZSA9PSAwKQotCSAgICBtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+cmxkX3ZhbHVlID0gc3ltLT5zdF92YWx1ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX2VsZl9oYXNoX3RhYmxlIChpbmZvKS0+dXNlX3JsZF9vYmpfaGVhZAotCSAgICAgICAmJiBzdHJjbXAgKG5hbWUsICJfX3JsZF9vYmpfaGVhZCIpID09IDApCi0JewotCSAgLyogSVJJWDYgZG9lcyBub3QgdXNlIGEgLnJsZF9tYXAgc2VjdGlvbi4gICovCi0JICBpZiAoSVJJWF9DT01QQVQgKG91dHB1dF9iZmQpID09IGljdF9pcml4NSkKLQkgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ybGRfbWFwIikgCi0JCQkhPSBOVUxMKTsKLQkgIG1pcHNfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5ybGRfdmFsdWUgPSBzeW0tPnN0X3ZhbHVlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIG1pcHMxNiBzeW1ib2wsIGZvcmNlIHRoZSB2YWx1ZSB0byBiZSBldmVuLiAgKi8KLSAgaWYgKHN5bS0+c3Rfb3RoZXIgPT0gU1RPX01JUFMxNgotICAgICAgJiYgKHN5bS0+c3RfdmFsdWUgJiAxKSAhPSAwKQotICAgIC0tc3ltLT5zdF92YWx1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGFzZWN0aW9uICpzZ290OwotICBzdHJ1Y3QgbWlwc19nb3RfaW5mbyAqZzsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gIGlmIChzZ290ID09IE5VTEwpCi0gICAgZyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChlbGZfc2VjdGlvbl9kYXRhIChzZ290KSAhPSBOVUxMKTsKLSAgICAgIGcgPSAoc3RydWN0IG1pcHNfZ290X2luZm8gKikgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdCktPnRkYXRhOwotICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICBCRkRfQVNTRVJUIChzZHluICE9IE5VTEwpOwotICAgICAgQkZEX0FTU0VSVCAoZyAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIHNpemVfdCBlbGVtc2l6ZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmMzJfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1JFTEVOVDoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWwuZHluIik7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfU1RSU1o6Ci0JICAgICAgLyogUmV3cml0ZSBEVF9TVFJTWi4gICovCi0JICAgICAgZHluLmRfdW4uZF92YWwgPQotCQlfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX1BMVEdPVDoKLQkgICAgICBuYW1lID0gIi5nb3QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOgotCSAgICAgIG5hbWUgPSAiLmNvbmZsaWN0IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUOgotCSAgICAgIG5hbWUgPSAiLmxpYmxpc3QiOwotCSAgICBnZXRfdm1hOgotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19STERfVkVSU0lPTjoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IDE7IC8qIFhYWCAqLwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0ZMQUdTOgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gUkhGX05PVFBPVDsgLyogWFhYICovCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKLQkgICAgICBuYW1lID0gIi5jb25mbGljdCI7Ci0JICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0NvbmZsaWN0KTsKLQkgICAgICBnb3RvIHNldF9lbGVtbm87Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0xJQkxJU1ROTzoKLQkgICAgICBuYW1lID0gIi5saWJsaXN0IjsKLQkgICAgICBlbGVtc2l6ZSA9IHNpemVvZiAoRWxmMzJfTGliKTsKLQkgICAgc2V0X2VsZW1ubzoKLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG5hbWUpOwotCSAgICAgIGlmIChzICE9IE5VTEwpCi0JCXsKLQkJICBpZiAocy0+X2Nvb2tlZF9zaXplICE9IDApCi0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZSAvIGVsZW1zaXplOwotCQkgIGVsc2UKLQkJICAgIGR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplIC8gZWxlbXNpemU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IDA7Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19USU1FX1NUQU1QOgotCSAgICAgIHRpbWUgKCh0aW1lX3QgKikgJmR5bi5kX3VuLmRfdmFsKTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19JQ0hFQ0tTVU06Ci0JICAgICAgLyogWFhYIEZJWE1FOiAqLwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19JVkVSU0lPTjoKLQkgICAgICAvKiBYWFggRklYTUU6ICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX0JBU0VfQUREUkVTUzoKLQkgICAgICBzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYSAmIH4oMHhmZmZmKTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGctPmxvY2FsX2dvdG5vOwotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9NSVBTX1NZTVRBQk5POgotCSAgICAgIG5hbWUgPSAiLmR5bnN5bSI7Ci0JICAgICAgZWxlbXNpemUgPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0JICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9jb29rZWRfc2l6ZSAvIGVsZW1zaXplOwotCSAgICAgIGVsc2UKLQkJZHluLmRfdW4uZF92YWwgPSBzLT5fcmF3X3NpemUgLyBlbGVtc2l6ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19VTlJFRkVYVE5POgotI2lmIDAKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IFNJWkVPRl9NSVBTX0RZTlNZTV9TRUNOQU1FUzsKLSNlbHNlCi0JICAgICAgZHluLmRfdW4uZF92YWwgPSBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpOwotI2VuZGlmCi0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX01JUFNfR09UU1lNOgotCSAgICAgIGR5bi5kX3VuLmRfdmFsID0gZy0+Z2xvYmFsX2dvdHN5bTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19ISVBBR0VOTzoKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IGctPmxvY2FsX2dvdG5vIC0gTUlQU19SRVNFUlZFRF9HT1ROTzsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19STERfTUFQOgotCSAgICAgIGR5bi5kX3VuLmRfcHRyID0gbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPnJsZF92YWx1ZTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRFRfTUlQU19NU1lNOgotCSAgICAgIHMgPSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgCi0JCSAgIChvdXRwdXRfYmZkLCBNSVBTX0VMRl9NU1lNX1NFQ1RJT05fTkFNRSAob3V0cHV0X2JmZCkpKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9keW5fb3V0IChvdXRwdXRfYmZkLCAmZHluLCBkeW5jb24pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgd2lsbCBiZSBmaWxsZWQgYXQKLSAgICAgcnVudGltZS4gVGhlIHNlY29uZCBlbnRyeSB3aWxsIGJlIHVzZWQgYnkgc29tZSBydW50aW1lIGxvYWRlcnMuCi0gICAgIFRoaXMgaXNuJ3QgdGhlIGNhc2Ugb2YgSXJpeCBybGQuICovCi0gIGlmIChzZ290ICE9IE5VTEwgJiYgc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDB4ODAwMDAwMDAsIHNnb3QtPmNvbnRlbnRzICsgNCk7Ci0gICAgfQotCi0gIGlmIChzZ290ICE9IE5VTEwpCi0gICAgZWxmX3NlY3Rpb25fZGF0YSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9lbnRzaXplID0gNDsKLQotICB7Ci0gICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgYXNlY3Rpb24gKnNtc3ltOwotICAgIGFzZWN0aW9uICpzOwotICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgIEVsZjMyX2NvbXBhY3RfcmVsIGNwdDsKLQotICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiBTR0kgc2V0cwotICAgICAgIHRoZSBTVFRfTk9UWVBFIGF0dHJpYnV0ZSBmb3IgdGhlc2Ugc3ltYm9scy4gIFNob3VsZCB3ZSBkbyBzbz8gICovCi0KLSAgICBzZHluc3ltID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICBzbXN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCSAgICAgTUlQU19FTEZfTVNZTV9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotICAgIGlmIChzZHluc3ltICE9IE5VTEwpCi0gICAgICB7Ci0jaWYgMAotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqIGNvbnN0ICogbmFtZXAgPSBtaXBzX2VsZl9keW5zeW1fc2VjX25hbWVzOwotCXVuc2lnbmVkIGludCBpOwotCWJmZF92bWEgbGFzdDsKLQlsb25nIGRpbmR4OwotCi0JLyogV2Ugbm8gbG9uZ2VyIHRyeSB0byByZXN0cmljdCB0aGUgc2V0IG9mIHNlY3Rpb25zIHdoaWNoIGdldAotICAgICAgICAgICBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBzaW5jZSBpdCBmYWlscyBpZiB3ZSBoYXZlCi0gICAgICAgICAgIG90aGVyIHJhbmRvbSBzZWN0aW9ucyB3aGljaCBuZWVkIGR5bmFtaWMgcmVsb2NhdGlvbnMuICAqLwotCWlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLQkgIHsKLQkgICAgc3ltLnN0X3NpemUgPSAwOwotCSAgICBzeW0uc3RfbmFtZSA9IDA7Ci0JICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX05PVFlQRSk7Ci0JICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLQkgICAgaSA9IDA7Ci0JICAgIGxhc3QgPSAwOwotCSAgICBkaW5keCA9IDA7Ci0JICAgIHdoaWxlICgobmFtZSA9ICpuYW1lcCsrKSAhPSBOVUxMKQotCSAgICAgIHsKLQkJcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkJaWYgKHMgIT0gTlVMTCkKLQkJICB7Ci0JCSAgICBzeW0uc3RfdmFsdWUgPSBzLT52bWE7Ci0JCSAgICBkaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4OwotCQkgICAgbGFzdCA9IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBzeW0uc3RfdmFsdWUgPSBsYXN0OwotCQkgICAgZGluZHgrKzsKLQkJICB9Ci0KLQkJc3ltLnN0X3NobmR4ID0gKGkgPCBNSVBTX1RFWFRfRFlOU1lNX1NFQ05PCi0JCQkJPyBTSE5fTUlQU19URVhUCi0JCQkJOiBTSE5fTUlQU19EQVRBKTsKLQkJKytpOwotCQlzeW0uc3RfbmFtZSA9Ci0JCSAgbWlwc19lbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bV9zZWNfc3RyaW5kZXhbZGluZHhdOwotCi0JCWJmZF9lbGYzMl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZzeW0sCi0JCQkJCSAgICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBkaW5keCkpOwotCSAgICAgIH0KLQotCSAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8KLQkgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQkgICAgICBTSVpFT0ZfTUlQU19EWU5TWU1fU0VDTkFNRVM7Ci0JICB9Ci0JZWxzZQotI2VuZGlmIC8qIDAgKi8KLQkgIHsKLQkgICAgRWxmMzJfSW50ZXJuYWxfTXN5bSBtc3ltOwotCi0JICAgIHN5bS5zdF9zaXplID0gMDsKLQkgICAgc3ltLnN0X25hbWUgPSAwOwotCSAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLQkgICAgc3ltLnN0X290aGVyID0gMDsKLQotCSAgICBtc3ltLm1zX2hhc2hfdmFsdWUgPSAwOwotCSAgICBtc3ltLm1zX2luZm8gPSBFTEYzMl9NU19JTkZPICgwLCAxKTsKLQotCSAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkgICAgICB7Ci0JCWludCBpbmR4OwotCQlsb25nIGR5bmluZHg7Ci0KLQkJc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JCWluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+dGhpc19pZHg7Ci0JCUJGRF9BU1NFUlQgKGluZHggPiAwKTsKLQkJc3ltLnN0X3NobmR4ID0gaW5keDsKLQkJCi0JCWR5bmluZHggID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHg7Ci0KLQkJYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAKLQkJICAob3V0cHV0X2JmZCwgJnN5bSwKLQkJICAgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkgICAgKyBkeW5pbmR4KSk7Ci0JCQotCQlpZiAoc21zeW0pCi0JCSAgYmZkX21pcHNfZWxmX3N3YXBfbXN5bV9vdXQgCi0JCSAgICAob3V0cHV0X2JmZCwgJm1zeW0sCi0JCSAgICAgKCgoRWxmMzJfRXh0ZXJuYWxfTXN5bSAqKSBzbXN5bS0+Y29udGVudHMpCi0JCSAgICAgICsgZHluaW5keCkpOwotCSAgICAgIH0KLQotCSAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8KLQkgICAgICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLQkgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQkgICAgICBiZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpICsgMTsKLQkgIH0KLSAgICAgIH0KLQotICAgIGlmIChTR0lfQ09NUEFUIChvdXRwdXRfYmZkKSkKLSAgICAgIHsKLQkvKiBXcml0ZSAuY29tcGFjdF9yZWwgc2VjdGlvbiBvdXQuICAqLwotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmNvbXBhY3RfcmVsIik7Ci0JaWYgKHMgIT0gTlVMTCkKLQkgIHsKLQkgICAgY3B0LmlkMSA9IDE7Ci0JICAgIGNwdC5udW0gPSBzLT5yZWxvY19jb3VudDsKLQkgICAgY3B0LmlkMiA9IDI7Ci0JICAgIGNwdC5vZmZzZXQgPSAocy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MKLQkJCSAgKyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX2NvbXBhY3RfcmVsKSk7Ci0JICAgIGNwdC5yZXNlcnZlZDAgPSAwOwotCSAgICBjcHQucmVzZXJ2ZWQxID0gMDsKLQkgICAgYmZkX2VsZjMyX3N3YXBfY29tcGFjdF9yZWxfb3V0IChvdXRwdXRfYmZkLCAmY3B0LAotCQkJCQkgICAgKChFbGYzMl9FeHRlcm5hbF9jb21wYWN0X3JlbCAqKQotCQkJCQkgICAgIHMtPmNvbnRlbnRzKSk7Ci0KLQkgICAgLyogQ2xlYW4gdXAgYSBkdW1teSBzdHViIGZ1bmN0aW9uIGVudHJ5IGluIC50ZXh0LiAgKi8KLQkgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIAotCQkJCQkgTUlQU19FTEZfU1RVQl9TRUNUSU9OX05BTUUgKGR5bm9iaikpOwotCSAgICBpZiAocyAhPSBOVUxMKQotCSAgICAgIHsKLQkJZmlsZV9wdHIgZHVtbXlfb2Zmc2V0OwotCi0JCUJGRF9BU1NFUlQgKHMtPl9yYXdfc2l6ZSA+PSBNSVBTX0ZVTkNUSU9OX1NUVUJfU0laRSk7Ci0JCWR1bW15X29mZnNldCA9IHMtPl9yYXdfc2l6ZSAtIE1JUFNfRlVOQ1RJT05fU1RVQl9TSVpFOwotCQltZW1zZXQgKHMtPmNvbnRlbnRzICsgZHVtbXlfb2Zmc2V0LCAwLAotCQkJTUlQU19GVU5DVElPTl9TVFVCX1NJWkUpOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIENsZWFuIHVwIGEgZmlyc3QgcmVsb2NhdGlvbiBpbiAucmVsLmR5bi4gICovCi0gICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsLmR5biIpOwotICAgIGlmIChzICE9IE5VTEwgJiYgcy0+X3Jhd19zaXplID4gMCkKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRoaXMgaXMgYWxtb3N0IGlkZW50aWNhbCB0byBiZmRfZ2VuZXJpY19nZXRfLi4uIGV4Y2VwdCB0aGF0IHNvbWUKLSAgIE1JUFMgcmVsb2NhdGlvbnMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseS4gIFNpZ2guICAqLwotCi1zdGF0aWMgYmZkX2J5dGUgKgotZWxmMzJfbWlwc19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJICAgcmVsb2NhdGVhYmxlLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKHJlbG9jX3NpemUpOwotICBpZiAocmVsb2NfdmVjdG9yID09IE5VTEwgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIHJlYWQgaW4gdGhlIHNlY3Rpb24gKi8KLSAgaWYgKCFiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwKLQkJCQkgaW5wdXRfc2VjdGlvbiwKLQkJCQkgKFBUUikgZGF0YSwKLQkJCQkgMCwKLQkJCQkgaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXZSdyZSBub3QgcmVsYXhpbmcgdGhlIHNlY3Rpb24sIHNvIGp1c3QgY29weSB0aGUgc2l6ZSBpbmZvICovCi0gIGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSA9IGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaW5wdXRfc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcGFyZW50OwotICAgICAgLyogZm9yIG1pcHMgKi8KLSAgICAgIGludCBncF9mb3VuZDsKLSAgICAgIGJmZF92bWEgZ3AgPSAweDEyMzQ1Njc4OwkvKiBpbml0aWFsaXplIGp1c3QgdG8gc2h1dCBnY2MgdXAgKi8KLQotICAgICAgewotCXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqbGg7Ci0JLyogU2tpcCBhbGwgdGhpcyBzdHVmZiBpZiB3ZSBhcmVuJ3QgbWl4aW5nIGZvcm1hdHMuICAqLwotCWlmIChhYmZkICYmIGlucHV0X2JmZAotCSAgICAmJiBhYmZkLT54dmVjID09IGlucHV0X2JmZC0+eHZlYykKLQkgIGxoID0gMDsKLQllbHNlCi0JICB7Ci0JICAgIGggPSBiZmRfaGFzaF9sb29rdXAgKCZsaW5rX2luZm8tPmhhc2gtPnRhYmxlLCAiX2dwIiwgZmFsc2UsIGZhbHNlKTsKLQkgICAgbGggPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQkgIH0KLSAgICAgIGxvb2t1cDoKLQlpZiAobGgpCi0JICB7Ci0JICAgIHN3aXRjaCAobGgtPnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCQlncF9mb3VuZCA9IDA7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotCQlncF9mb3VuZCA9IDE7Ci0JCWdwID0gbGgtPnUuZGVmLnZhbHVlOwotCQlicmVhazsKLQkgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfaW5kaXJlY3Q6Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX3dhcm5pbmc6Ci0JCWxoID0gbGgtPnUuaS5saW5rOwotCQkvKiBAQEZJWE1FICBpZ25vcmluZyB3YXJuaW5nIGZvciBub3cgKi8KLQkJZ290byBsb29rdXA7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLQkgICAgICBkZWZhdWx0OgotCQlhYm9ydCAoKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgZ3BfZm91bmQgPSAwOwotICAgICAgfQotICAgICAgLyogZW5kIG1pcHMgKi8KLSAgICAgIGZvciAocGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50ICE9IChhcmVsZW50ICopIE5VTEw7Ci0JICAgcGFyZW50KyspCi0JewotCSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotCSAgLyogU3BlY2lmaWMgdG8gTUlQUzogRGVhbCB3aXRoIHJlbG9jYXRpb24gdHlwZXMgdGhhdCByZXF1aXJlCi0JICAgICBrbm93aW5nIHRoZSBncCBvZiB0aGUgb3V0cHV0IGJmZC4gICovCi0JICBhc3ltYm9sICpzeW0gPSAqKCpwYXJlbnQpLT5zeW1fcHRyX3B0cjsKLQkgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikgJiYgYWJmZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBzcGVjaWFsX2Z1bmN0aW9uIHdvdWxkbid0IGdldCBjYWxsZWQgYW55d2F5cy4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKCFncF9mb3VuZCkKLQkgICAgewotCSAgICAgIC8qIFRoZSBncCBpc24ndCB0aGVyZTsgbGV0IHRoZSBzcGVjaWFsIGZ1bmN0aW9uIGNvZGUKLQkJIGZhbGwgb3ZlciBvbiBpdHMgb3duLiAgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoKCpwYXJlbnQpLT5ob3d0by0+c3BlY2lhbF9mdW5jdGlvbgotCQkgICA9PSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MpCi0JICAgIHsKLQkgICAgICAvKiBieXBhc3Mgc3BlY2lhbF9mdW5jdGlvbiBjYWxsICovCi0JICAgICAgciA9IGdwcmVsMTZfd2l0aF9ncCAoaW5wdXRfYmZkLCBzeW0sICpwYXJlbnQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgcmVsb2NhdGVhYmxlLCAoUFRSKSBkYXRhLCBncCk7Ci0JICAgICAgZ290byBza2lwX2JmZF9wZXJmb3JtX3JlbG9jYXRpb247Ci0JICAgIH0KLQkgIC8qIGVuZCBtaXBzIHNwZWNpZmljIHN0dWZmICovCi0KLQkgIHIgPSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIChpbnB1dF9iZmQsCi0JCQkJICAgICAgKnBhcmVudCwKLQkJCQkgICAgICAoUFRSKSBkYXRhLAotCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgICAgcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTCwKLQkJCQkgICAgICAmZXJyb3JfbWVzc2FnZSk7Ci0Jc2tpcF9iZmRfcGVyZm9ybV9yZWxvY2F0aW9uOgotCi0JICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzICovCi0JICAgICAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSAqcGFyZW50OwotCSAgICAgIG9zLT5yZWxvY19jb3VudCsrOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkJICBCRkRfQVNTRVJUIChlcnJvcl9tZXNzYWdlICE9IChjaGFyICopIE5VTEwpOwotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJCShsaW5rX2luZm8sIGVycm9yX21lc3NhZ2UsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSAoKnBhcmVudCktPmhvd3RvLT5uYW1lLCAoKnBhcmVudCktPmFkZGVuZCwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBlbGYzMl9taXBzX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotDAotLyogRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUKLSAgIC5tZGVidWcgc2VjdGlvbiwgd2hpY2ggaXMgaW4gdGhlIEVDT0ZGIGRlYnVnZ2luZyBmb3JtYXQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwIG1pcHNfZWxmMzJfZWNvZmZfZGVidWdfc3dhcCA9Ci17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpY1N5bSwKLSAgLyogQWxpZ25tZW50IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEUuZy4sIDQuICAqLwotICA0LAotICAvKiBTaXplcyBvZiBleHRlcm5hbCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIHNpemVvZiAoc3RydWN0IGhkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBkbnJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgcGRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHN5bV9leHQpLAotICBzaXplb2YgKHN0cnVjdCBvcHRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZmRyX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHJmZF9leHQpLAotICBzaXplb2YgKHN0cnVjdCBleHRfZXh0KSwKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX2luLAotICBlY29mZl9zd2FwX2Rucl9pbiwKLSAgZWNvZmZfc3dhcF9wZHJfaW4sCi0gIGVjb2ZmX3N3YXBfc3ltX2luLAotICBlY29mZl9zd2FwX29wdF9pbiwKLSAgZWNvZmZfc3dhcF9mZHJfaW4sCi0gIGVjb2ZmX3N3YXBfcmZkX2luLAotICBlY29mZl9zd2FwX2V4dF9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3Rpcl9pbiwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfaW4sCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgZWNvZmZfc3dhcF9oZHJfb3V0LAotICBlY29mZl9zd2FwX2Rucl9vdXQsCi0gIGVjb2ZmX3N3YXBfcGRyX291dCwKLSAgZWNvZmZfc3dhcF9zeW1fb3V0LAotICBlY29mZl9zd2FwX29wdF9vdXQsCi0gIGVjb2ZmX3N3YXBfZmRyX291dCwKLSAgZWNvZmZfc3dhcF9yZmRfb3V0LAotICBlY29mZl9zd2FwX2V4dF9vdXQsCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfcm5keF9vdXQsCi0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgaW4gc3ltYm9saWMgZGF0YS4gICovCi0gIF9iZmRfbWlwc19lbGZfcmVhZF9lY29mZl9pbmZvCi19OwotDAotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjMyX2xpdHRsZW1pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJImVsZjMyLWxpdHRsZW1pcHMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjMyX2JpZ21pcHNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJlbGYzMi1iaWdtaXBzIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX21pcHMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTUlQUwotCi0vKiBUaGUgU1ZSNCBNSVBTIEFCSSBzYXlzIHRoYXQgdGhpcyBzaG91bGQgYmUgMHgxMDAwMCwgYnV0IElyaXggNSB1c2VzCi0gICBhIHZhbHVlIG9mIDB4MTAwMCwgYW5kIHdlIGFyZSBjb21wYXRpYmxlLiAgKi8KLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkJMHgxMDAwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY29sbGVjdAkJdHJ1ZQotI2RlZmluZSBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vawl0cnVlCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwl0cnVlCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQltaXBzX2luZm9fdG9faG93dG9fcmVsYQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCW1pcHNfaW5mb190b19ob3d0b19yZWwKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbAltaXBzX2VsZl9zeW1faXNfZ2xvYmFsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQltaXBzX2VsZjMyX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCW1pcHNfZWxmMzJfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwlfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCW1pcHNfZWxmMzJfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgXAotCQkJCQltaXBzX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJbWlwc19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQlfYmZkX21pcHNfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAkmbWlwc19lbGYzMl9lY29mZl9kZWJ1Z19zd2FwCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLQkJCQkJbWlwc19lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmMzJfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmMzJfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgXAotCQkJCQltaXBzX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfZmluYWxfbGluawltaXBzX2VsZl9maW5hbF9saW5rCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJX2JmZF9taXBzX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotCQkJCQlfYmZkX21pcHNfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCW1pcHNfZWxmX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCW1pcHNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwltaXBzX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLQkJCQkJbWlwc19lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zIFwKLQkJCQkJbWlwc19lbGZfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIFwKLQkJCQkJbWlwc19lbGZfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JbWlwc19lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayBcCi0JCQkJCW1pcHNfZWxmX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCW1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCW1pcHNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawltaXBzX2VsZl9nY19tYXJrX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawltaXBzX2VsZl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCSg0Kk1JUFNfUkVTRVJWRURfR09UTk8pCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1wcGMuYyBiL2JmZC9lbGYzMi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2MWE3Yy4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzItcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODUzICswLDAgQEAKLS8qIFBvd2VyUEMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gYSBwcmVsaW1pbmFyeSBQb3dlclBDIEVMRiBBQkkuICBUaGUKLSAgIGluZm9ybWF0aW9uIG1heSBub3QgbWF0Y2ggdGhlIGZpbmFsIFBvd2VyUEMgRUxGIEFCSS4gIEl0IGluY2x1ZGVzCi0gICBzdWdnZXN0aW9ucyBmcm9tIHRoZSBpbi1wcm9ncmVzcyBFbWJlZGRlZCBQb3dlclBDIEFCSSwgYW5kIHRoYXQKLSAgIGluZm9ybWF0aW9uIG1heSBhbHNvIG5vdCBtYXRjaC4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9wcGMuaCIKLQotI2RlZmluZSBVU0VfUkVMQQkJLyogd2Ugd2FudCBSRUxBIHJlbG9jYXRpb25zLCBub3QgUkVMICovCi0KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKnBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqY2FjaGVfcHRyLCBFbGYzMl9JbnRlcm5hbF9SZWxhICpkc3QpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfaG93dG9faW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncyBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1zdGF0aWMgaW50IHBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHBwY19lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkciBQQVJBTVMgKChiZmQgKiwKLQkJCQkJCSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqLAotCQkJCQkJICBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBwY19lbGZfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci0KLXN0YXRpYyBlbGZfbGlua2VyX3NlY3Rpb25fdCAqcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLAotCSAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCSAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0pKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9jaGVja19yZWxvY3MgUEFSQU1TICgoYmZkICosCi0JCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICBhc2VjdGlvbiAqLAotCQkJCQkgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLQotc3RhdGljIGFzZWN0aW9uICogcHBjX2VsZl9nY19tYXJrX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLAotCQkJCQkJc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCQlFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLAotCQkJCQkJc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsCi0JCQkJCQlFbGZfSW50ZXJuYWxfU3ltICpzeW0pKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9nY19zd2VlcF9ob29rIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkJICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgICAgIGFzZWN0aW9uICpzZWMsCi0JCQkJCSAgICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3MpKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGp1c3RfZHluaW5keCBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotCQkJCQkJIGJmZCAqLAotCQkJCQkJIGFzZWN0aW9uICosCi0JCQkJCQkgYmZkX2J5dGUgKiwKLQkJCQkJCSBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzLAotCQkJCQkJIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXMsCi0JCQkJCQkgYXNlY3Rpb24gKiopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sgIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkJIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCQkgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCQkJIGNvbnN0IGNoYXIgKiosCi0JCQkJCQkgZmxhZ3dvcmQgKiwKLQkJCQkJCSBhc2VjdGlvbiAqKiwKLQkJCQkJCSBiZmRfdm1hICopKTsKLQotc3RhdGljIGJvb2xlYW4gcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwKLQkJCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLSNkZWZpbmUgQlJBTkNIX1BSRURJQ1RfQklUIDB4MjAwMDAwCQkvKiBicmFuY2ggcHJlZGljdGlvbiBiaXQgZm9yIGJyYW5jaCB0YWtlbiByZWxvY3MgKi8KLSNkZWZpbmUgUkFfUkVHSVNURVJfTUFTSyAweDAwMWYwMDAwCQkvKiBtYXNrIHRvIHNldCBSQSBpbiBtZW1vcnkgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFJBX1JFR0lTVEVSX1NISUZUIDE2CQkJLyogdmFsdWUgdG8gc2hpZnQgcmVnaXN0ZXIgYnkgdG8gaW5zZXJ0IFJBICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotLyogVGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGx0IHJlc2VydmVkIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotI2RlZmluZSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFIDcyCi0vKiBUaGUgc2l6ZSBvZiB0aGUgZ2FwIGJldHdlZW4gZW50cmllcyBpbiB0aGUgUExULiAgKi8KLSNkZWZpbmUgUExUX1NMT1RfU0laRSA4Ci0vKiBUaGUgbnVtYmVyIG9mIHNpbmdsZS1zbG90IFBMVCBlbnRyaWVzICh0aGUgcmVzdCB1c2UgdHdvIHNsb3RzKS4gICovCi0jZGVmaW5lIFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMgODE5MgotCi0MCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClSX1BQQ19tYXggXTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcHBjX2VsZl9ob3d0b19yYXdbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfUFBDX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgc3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9QUENfQUREUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBbiBhYnNvbHV0ZSAyNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgotICAgICBGSVhNRTogd2UgZG9uJ3QgY2hlY2sgdGhhdCwgd2UganVzdCBjbGVhciB0aGVtLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjI0IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHN0YW5kYXJkIDE2IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDE2IGJpdCByZWxvY2F0aW9uIHdpdGhvdXQgb3ZlcmZsb3cuICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIG9yZGVyIDE2IGJpdHMgb2YgYW4gYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX1BQQ19BRERSMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIGFuIGFkZHJlc3MsIHBsdXMgMSBpZiB0aGUgY29udGVudHMgb2YKLSAgICAgdGhlIGxvdyAxNiBiaXRzLCB0cmVhdGVkIGFzIGEgc2lnbmVkIG51bWJlciwgaXMgbmVnYXRpdmUuCSovCi0gIEhPV1RPIChSX1BQQ19BRERSMTZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTZfSEEiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2g7IHRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlIHplcm8uCi0gICAgIEZJWE1FOiB3ZSBkb24ndCBjaGVjayB0aGF0LCB3ZSBqdXN0IGNsZWFyIHRoZW0uICAqLwotICBIT1dUTyAoUl9QUENfQUREUjE0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIGFic29sdXRlIDE2IGJpdCBicmFuY2gsIGZvciB3aGljaCBiaXQgMTAgc2hvdWxkIGJlIHNldCB0bwotICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBicmFuY2ggaXMgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uCVRoZSBsb3dlciB0d28KLSAgICAgYml0cyBtdXN0IGJlIHplcm8uCSAqLwotICBIT1dUTyAoUl9QUENfQUREUjE0X0JSVEFLRU4sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQUREUjE0X0JSVEFLRU4iLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQW4gYWJzb2x1dGUgMTYgYml0IGJyYW5jaCwgZm9yIHdoaWNoIGJpdCAxMCBzaG91bGQgYmUgc2V0IHRvCi0gICAgIGluZGljYXRlIHRoYXQgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIKLSAgICAgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0FERFIxNF9CUk5UQUtFTiwgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19BRERSMTRfQlJOVEFLRU4iLC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSByZWxhdGl2ZSAyNiBiaXQgYnJhbmNoOyB0aGUgbG93ZXIgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvLgkgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDI0LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgcmVsYXRpdmUgMTYgYml0IGJyYW5jaDsgdGhlIGxvd2VyIHR3byBiaXRzIG11c3QgYmUgemVyby4JICovCi0gIEhPV1RPIChSX1BQQ19SRUwxNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMMTQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2guCUJpdCAxMCBzaG91bGQgYmUgc2V0IHRvIGluZGljYXRlIHRoYXQKLSAgICAgdGhlIGJyYW5jaCBpcyBleHBlY3RlZCB0byBiZSB0YWtlbi4gIFRoZSBsb3dlciB0d28gYml0cyBtdXN0IGJlCi0gICAgIHplcm8uICAqLwotICBIT1dUTyAoUl9QUENfUkVMMTRfQlJUQUtFTiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwxNF9CUlRBS0VOIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmMsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHJlbGF0aXZlIDE2IGJpdCBicmFuY2guCUJpdCAxMCBzaG91bGQgYmUgc2V0IHRvIGluZGljYXRlIHRoYXQKLSAgICAgdGhlIGJyYW5jaCBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdGFrZW4uICBUaGUgbG93ZXIgdHdvIGJpdHMgbXVzdAotICAgICBiZSB6ZXJvLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1JFTDE0X0JSTlRBS0VOLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1JFTDE0X0JSTlRBS0VOIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2LCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yIHRoZQotICAgICBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0xPLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBHT1QgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfR09UMTZfTE8sCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19HT1QxNl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEksIGJ1dCByZWZlcnJpbmcgdG8gdGhlIEdPVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19HT1QxNl9ISSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR09UMTZfSEkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCSAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9IQSwgYnV0IHJlZmVycmluZyB0byB0aGUgR09UIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0dPVDE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcHBjX2VsZl9hZGRyMTZfaGFfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dPVDE2X0hBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX1JFTDI0LCBidXQgcmVmZXJyaW5nIHRvIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZQotICAgICBlbnRyeSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFRSRUwyNCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUUkVMMjQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZmZmYywJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgaXMgdXNlZCBvbmx5IGJ5IHRoZSBkeW5hbWljIGxpbmtlci4gIFRoZSBzeW1ib2wgc2hvdWxkIGV4aXN0Ci0gICAgIGJvdGggaW4gdGhlIG9iamVjdCBiZWluZyBydW4gYW5kIGluIHNvbWUgc2hhcmVkIGxpYnJhcnkuICBUaGUKLSAgICAgZHluYW1pYyBsaW5rZXIgY29waWVzIHRoZSBkYXRhIGFkZHJlc3NlZCBieSB0aGUgc3ltYm9sIGZyb20gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGludG8gdGhlIG9iamVjdCwgYmVjYXVzZSB0aGUgb2JqZWN0IGJlaW5nCi0gICAgIHJ1biBoYXMgdG8gaGF2ZSB0aGUgZGF0YSBhdCBzb21lIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX1BQQ19DT1BZLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfQ09QWSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMzIsIGJ1dCB1c2VkIHdoZW4gc2V0dGluZyBnbG9iYWwgb2Zmc2V0IHRhYmxlCi0gICAgIGVudHJpZXMuICAqLwotICBIT1dUTyAoUl9QUENfR0xPQl9EQVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dMT0JfREFUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTWFya3MgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeSBmb3IgYSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfSk1QX1NMT1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0pNUF9TTE9UIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgb25seSBieSB0aGUgZHluYW1pYyBsaW5rZXIuICBXaGVuIHRoZSBvYmplY3QgaXMgcnVuLCB0aGlzCi0gICAgIGxvbmd3b3JkIGlzIHNldCB0byB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBvYmplY3QsIHBsdXMgdGhlCi0gICAgIGFkZGVuZC4gICovCi0gIEhPV1RPIChSX1BQQ19SRUxBVElWRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUkVMQVRJVkUiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX1JFTDI0LCBidXQgdXNlcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCB3aXRoaW4gdGhlCi0gICAgIG9iamVjdCByYXRoZXIgdGhhbiB0aGUgZmluYWwgdmFsdWUuICBOb3JtYWxseSB1c2VkIGZvcgotICAgICBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICAqLwotICBIT1dUTyAoUl9QUENfTE9DQUwyNFBDLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0xPQ0FMMjRQQyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZjLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMzIsIGJ1dCBtYXkgYmUgdW5hbGlnbmVkLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1VBRERSMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1VBRERSMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNiwgYnV0IG1heSBiZSB1bmFsaWduZWQuICAqLwotICBIT1dUTyAoUl9QUENfVUFERFIxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfVUFERFIxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzItYml0IFBDIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX1BQQ19SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgcmVsb2NhdGlvbiB0byB0aGUgc3ltYm9sJ3MgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICAgIEZJWE1FOiBub3Qgc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9QUENfUExUMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMi1iaXQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB0byB0aGUgc3ltYm9sJ3MgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICAgIEZJWE1FOiBub3Qgc3VwcG9ydGVkLiAqLwotICBIT1dUTyAoUl9QUENfUExUUkVMMzIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFRSRUwzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMaWtlIFJfUFBDX0FERFIxNl9MTywgYnV0IHJlZmVycmluZyB0byB0aGUgUExUIHRhYmxlIGVudHJ5IGZvcgotICAgICB0aGUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKFJfUFBDX1BMVDE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfUExUMTZfTE8iLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExpa2UgUl9QUENfQUREUjE2X0hJLCBidXQgcmVmZXJyaW5nIHRvIHRoZSBQTFQgdGFibGUgZW50cnkgZm9yCi0gICAgIHRoZSBzeW1ib2wuICAqLwotICBIT1dUTyAoUl9QUENfUExUMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1BMVDE2X0hJIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTGlrZSBSX1BQQ19BRERSMTZfSEEsIGJ1dCByZWZlcnJpbmcgdG8gdGhlIFBMVCB0YWJsZSBlbnRyeSBmb3IKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX1BQQ19QTFQxNl9IQSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHBwY19lbGZfYWRkcjE2X2hhX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19QTFQxNl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBzaWduLWV4dGVuZGVkIDE2IGJpdCB2YWx1ZSByZWxhdGl2ZSB0byBfU0RBX0JBU0VfLCBmb3IgdXNlIHdpdGgKLSAgICAgc21hbGwgZGF0YSBpdGVtcy4gICovCi0gIEhPV1RPIChSX1BQQ19TREFSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0RBUkVMMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyLWJpdCBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gIEhPV1RPIChSX1BQQ19TRUNUT0ZGLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX1NFQ1RPRkYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYtYml0IGxvd2VyIGhhbGYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRl9MTywJICAvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9MTyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYtYml0IHVwcGVyIGhhbGYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICBIT1dUTyAoUl9QUENfU0VDVE9GRl9ISSwJLyogdHlwZSAqLwotCSAxNiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9ISSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2LWJpdCB1cHBlciBoYWxmIGFkanVzdGVkIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSAgSE9XVE8gKFJfUFBDX1NFQ1RPRkZfSEEsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfU0VDVE9GRl9IQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGZyb20gdGhlIEVtYmVkZGVkIEVMRiBBQkksIGFuZCBhcmUgbm90Ci0gICAgIGluIHRoZSBTVlI0IEVMRiBBQkkuICAqLwotCi0gIC8qIDMyIGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9OQUREUjMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IHZhbHVlIHJlc3VsdGluZyBmcm9tIHRoZSBhZGRlbmQgbWludXMgdGhlIHN5bWJvbCAqLwotICBIT1dUTyAoUl9QUENfRU1CX05BRERSMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSB0aGUgYWRkZW5kIG1pbnVzIHRoZSBzeW1ib2wgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0xPLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfQUREUjE2X0xPIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCBvcmRlciAxNiBiaXRzIG9mIHRoZSBhZGRlbmQgbWludXMgdGhlIHN5bWJvbCAqLwotICBIT1dUTyAoUl9QUENfRU1CX05BRERSMTZfSEksCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTZfSEkiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIG9yZGVyIDE2IGJpdHMgb2YgdGhlIHJlc3VsdCBvZiB0aGUgYWRkZW5kIG1pbnVzIHRoZSBhZGRyZXNzLAotICAgICBwbHVzIDEgaWYgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb3cgMTYgYml0cywgdHJlYXRlZCBhcyBhIHNpZ25lZCBudW1iZXIsCi0gICAgIGlzIG5lZ2F0aXZlLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9OQUREUjE2X0hBLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBwcGNfZWxmX2FkZHIxNl9oYV9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX05BRERSMTZfSEEiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhbGxvY2F0aW5nIGEgNCBieXRlIHdvcmQgdG8gaG9sZCBhbgotICAgICBhZGRyZXNzIGluIHRoZSAuc2RhdGEgc2VjdGlvbiwgYW5kIHJldHVybmluZyB0aGUgb2Zmc2V0IGZyb20KLSAgICAgX1NEQV9CQVNFXyBmb3IgdGhhdCByZWxvY2F0aW9uICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBSTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREFJMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCB2YWx1ZSByZXN1bHRpbmcgZnJvbSBhbGxvY2F0aW5nIGEgNCBieXRlIHdvcmQgdG8gaG9sZCBhbgotICAgICBhZGRyZXNzIGluIHRoZSAuc2RhdGEyIHNlY3Rpb24sIGFuZCByZXR1cm5pbmcgdGhlIG9mZnNldCBmcm9tCi0gICAgIF9TREEyX0JBU0VfIGZvciB0aGF0IHJlbG9jYXRpb24gKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9TREEySTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0VNQl9TREEySTE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIHNpZ24tZXh0ZW5kZWQgMTYgYml0IHZhbHVlIHJlbGF0aXZlIHRvIF9TREEyX0JBU0VfLCBmb3IgdXNlIHdpdGgKLSAgICAgc21hbGwgZGF0YSBpdGVtcy4JICovCi0gIEhPV1RPIChSX1BQQ19FTUJfU0RBMlJFTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1NEQTJSRUwiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlbG9jYXRlIGFnYWluc3QgZWl0aGVyIF9TREFfQkFTRV8gb3IgX1NEQTJfQkFTRV8sIGZpbGxpbmcgaW4gdGhlIDE2IGJpdAotICAgICBzaWduZWQgb2Zmc2V0IGZyb20gdGhlIGFwcHJvcHJpYXRlIGJhc2UsIGFuZCBmaWxsaW5nIGluIHRoZSByZWdpc3RlcgotICAgICBmaWVsZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSByZWdpc3RlciAoMCwgMiwgb3IgMTMpLiAgKi8KLSAgSE9XVE8gKFJfUFBDX0VNQl9TREEyMSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfRU1CX1NEQTIxIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfTVJLUkVGICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTRUMxNiAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfUkVMU1RfTE8gKi8KLSAgLyogUmVsb2NhdGlvbiBub3QgaGFuZGxlZDogUl9QUENfRU1CX1JFTFNUX0hJICovCi0gIC8qIFJlbG9jYXRpb24gbm90IGhhbmRsZWQ6IFJfUFBDX0VNQl9SRUxTVF9IQSAqLwotICAvKiBSZWxvY2F0aW9uIG5vdCBoYW5kbGVkOiBSX1BQQ19FTUJfQklUX0ZMRCAqLwotCi0gIC8qIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24gYWdhaW5zdCBlaXRoZXIgX1NEQV9CQVNFXyBvciBfU0RBMl9CQVNFXywgZmlsbGluZwotICAgICBpbiB0aGUgMTYgYml0IHNpZ25lZCBvZmZzZXQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgYmFzZSwgYW5kIGZpbGxpbmcgaW4gdGhlCi0gICAgIHJlZ2lzdGVyIGZpZWxkIHdpdGggdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyICgwLCAyLCBvciAxMykuICAqLwotICBIT1dUTyAoUl9QUENfRU1CX1JFTFNEQSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1BQQ19FTUJfUkVMU0RBIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9QUENfR05VX1ZUSU5IRVJJVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIE5VTEwsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfR05VX1ZUSU5IRVJJVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9QUENfR05VX1ZURU5UUlksCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfUFBDX0dOVV9WVEVOVFJZIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFBob255IHJlbG9jIHRvIGhhbmRsZSBBSVggc3R5bGUgVE9DIGVudHJpZXMgKi8KLSAgSE9XVE8gKFJfUFBDX1RPQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9QUENfVE9DMTYiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLX07Ci0KLQwKLS8qIEluaXRpYWxpemUgdGhlIHBwY19lbGZfaG93dG9fdGFibGUsIHNvIHRoYXQgbGluZWFyIGFjY2Vzc2VzIGNhbiBiZSBkb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lbGZfaG93dG9faW5pdCAoKQotewotICB1bnNpZ25lZCBpbnQgaSwgdHlwZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwcGNfZWxmX2hvd3RvX3JhdykgLyBzaXplb2YgKHBwY19lbGZfaG93dG9fcmF3WzBdKTsgaSsrKQotICAgIHsKLSAgICAgIHR5cGUgPSBwcGNfZWxmX2hvd3RvX3Jhd1tpXS50eXBlOwotICAgICAgQkZEX0FTU0VSVCAodHlwZSA8IHNpemVvZihwcGNfZWxmX2hvd3RvX3RhYmxlKSAvIHNpemVvZihwcGNfZWxmX2hvd3RvX3RhYmxlWzBdKSk7Ci0gICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlW3R5cGVdID0gJnBwY19lbGZfaG93dG9fcmF3W2ldOwotICAgIH0KLX0KLQotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciB0aGUgUFBDIHdpdGggb3B0aW9uIC0tbXBjODYwYzBbPTxuPl0uCi0KLSAgIFRoZSBNUEM4NjAsIHJldmlzaW9uIEMwIG9yIGVhcmxpZXIgY29udGFpbnMgYSBidWcgaW4gdGhlIGRpZS4KLSAgIElmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWUsIHRoZSBuZXh0IGluc3RydWN0aW9uCi0gICB0byBiZSBleGVjdXRlZCAqbWF5KiBiZSB0cmVhdGVkIGFzIGEgbm8tb3AuCi0gICAxLyBBIGZvcndhcmQgYnJhbmNoIGlzIGV4ZWN1dGVkLgotICAgMi8gVGhlIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90IHRha2VuLgotICAgMy8gVGhlIGJyYW5jaCBpcyB0YWtlbi4KLSAgIDQvIFRoZSBicmFuY2ggaXMgbG9jYXRlZCBpbiB0aGUgbGFzdCA1IHdvcmRzIG9mIGEgcGFnZS4KLSAgICAgIChUaGUgRU9QIGxpbWl0IGlzIDUgYnkgZGVmYXVsdCBidXQgbWF5IGJlIHNwZWNpZmllZCBhcyBhbnkgdmFsdWUgZnJvbSAxLTEwLikKLSAgIAotICAgT3VyIHNvZnR3YXJlIHNvbHV0aW9uIGlzIHRvIGRldGVjdCB0aGVzZSBwcm9ibGVtYXRpYyBicmFuY2hlcyBpbiBhCi0gICBsaW5rZXIgcGFzcyBhbmQgbW9kaWZ5IHRoZW0gYXMgZm9sbG93czoKLSAgIDEvIFVuY29uZGl0aW9uYWwgYnJhbmNoZXMgLSBTaW5jZSB0aGVzZSBhcmUgYWx3YXlzIHByZWRpY3RlZCB0YWtlbiwKLSAgICAgIHRoZXJlIGlzIG5vIHByb2JsZW0gYW5kIG5vIGFjdGlvbiBpcyByZXF1aXJlZC4KLSAgIDIvIENvbmRpdGlvbmFsIGJhY2t3YXJkIGJyYW5jaGVzIC0gTm8gcHJvYmxlbSwgbm8gYWN0aW9uIHJlcXVpcmVkLgotICAgMy8gQ29uZGl0aW9uYWwgZm9yd2FyZCBicmFuY2hlcyAtIEVuc3VyZSB0aGF0IHRoZSAiaW52ZXJzZSBwcmVkaWN0aW9uCi0gICAgICBiaXQiIGlzIHNldCAoZW5zdXJlIGl0IGlzIHByZWRpY3RlZCB0YWtlbikuCi0gICA0LyBDb25kaXRpb25hbCByZWdpc3RlciBicmFuY2hlcyAtIEVuc3VyZSB0aGF0IHRoZSAieSBiaXQiIGlzIHNldAotICAgICAgKGVuc3VyZSBpdCBpcyBwcmVkaWN0ZWQgdGFrZW4pLgotKi8KLQotLyogU29ydCBzZWN0aW9ucyBieSBhZGRyZXNzLiAgKi8KLQotc3RhdGljIGludAotcHBjX2VsZl9zb3J0X3JlbGEgKGFyZzEsIGFyZzIpCi0gICAgY29uc3Qgdm9pZCAqYXJnMTsKLSAgICBjb25zdCB2b2lkICphcmcyOwotewotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGExID0gKGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhKiopIGFyZzE7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICoqcmVsYTIgPSAoY29uc3QgRWxmX0ludGVybmFsX1JlbGEqKikgYXJnMjsKLQotICAvKiBTb3J0IGJ5IG9mZnNldC4gKi8KLSAgcmV0dXJuICgoKnJlbGExKS0+cl9vZmZzZXQgLSAoKnJlbGEyKS0+cl9vZmZzZXQpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBpc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgIGJmZCAqYWJmZDsKLSAgICBhc2VjdGlvbiAqaXNlYzsKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgIGJvb2xlYW4gKmFnYWluOwotewotI2RlZmluZSBQQUdFU0laRSAweDEwMDAKLQotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqKnJlbGFfY29tYiA9IE5VTEw7Ci0gIGludCBjb21iX2N1cnIsIGNvbWJfY291bnQ7Ci0KLSAgLyogV2UgbmV2ZXIgaGF2ZSB0byBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIHBlciBpbnB1dCBzZWN0aW9uLiAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICAvKiBJZiBuZWVkZWQsIGluaXRpYWxpemUgdGhpcyBzZWN0aW9uJ3MgY29va2VkIHNpemUuICAqLwotICBpZiAoaXNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgICBpc2VjLT5fY29va2VkX3NpemUgPSBpc2VjLT5fcmF3X3NpemU7Ci0KLSAgLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIHRleHQgc2VjdGlvbnMgd2hpY2ggb3ZlcmxhcCB0aGUKLSAgdHJvdWJsZXNvbWUgYXJlYSBhdCB0aGUgZW5kIG9mIGEgcGFnZS4gKi8KLSAgaWYgKGxpbmtfaW5mby0+bXBjODYwYzAgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0NPREUpICYmIGlzZWMtPl9jb29rZWRfc2l6ZSkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGRvdCwgZW5kX3BhZ2UsIGVuZF9zZWN0aW9uOwotICAgICAgYm9vbGVhbiBzZWN0aW9uX21vZGlmaWVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICovCi0gICAgICAvKiBHZXQgY2FjaGVkIGNvcHkgaWYgaXQgZXhpc3RzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChpc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEdvIGdldCB0aGVtIG9mZiBkaXNrLiAgKi8KLQkgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGlzZWMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpc2VjLCBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIGlzZWMtPl9yYXdfc2l6ZSkpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBjb21iX2N1cnIgPSAwOwotICAgICAgY29tYl9jb3VudCA9IDA7Ci0gICAgICBpZiAoaXNlYy0+cmVsb2NfY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBuOwotCi0gICAgICAgICAgLyogR2V0IGEgY29weSBvZiB0aGUgbmF0aXZlIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgICAgICBpbnRlcm5hbF9yZWxvY3MgPSBfYmZkX2VsZjMyX2xpbmtfcmVhZF9yZWxvY3MgKAotICAgIAkgICAgYWJmZCwgaXNlYywgKFBUUikgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIAotICAgIAkgICAgbGlua19pbmZvLT5rZWVwX21lbW9yeSk7Ci0gICAgICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIAkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotICAgIAkgICAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAKLSAgICAgICAgICAvKiBTZXR1cCBhIGZhc3RlciBhY2Nlc3MgbWV0aG9kIGZvciB0aGUgcmVsb2MgaW5mbyB3ZSBuZWVkLiAqLwotICAgICAgICAgIHJlbGFfY29tYiA9IChFbGZfSW50ZXJuYWxfUmVsYSoqKQotCSAgICBiZmRfbWFsbG9jIChpc2VjLT5yZWxvY19jb3VudCpzaXplb2YoRWxmX0ludGVybmFsX1JlbGEqKSk7Ci0gICAgICAgICAgaWYgKHJlbGFfY29tYiA9PSBOVUxMKQotICAgICAgICAgICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICAgICAgICBmb3IgKG49MDsgbjxpc2VjLT5yZWxvY19jb3VudDsgKytuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsb25nIHJfdHlwZTsKLSAgICAKLSAgICAgICAgICAgICAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChpbnRlcm5hbF9yZWxvY3Nbbl0ucl9pbmZvKTsKLSAgICAgICAgICAgICAgaWYgKHJfdHlwZSA8IDAgfHwgcl90eXBlID49IChpbnQpUl9QUENfbWF4KQotICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgCi0gICAgICAgICAgICAgIC8qIFByb2xvZ3VlIGNvbnN0YW50cyBhcmUgc29tZXRpbWVzIHByZXNlbnQgaW4gdGhlICIudGV4dCIKLSAgICAgICAgICAgICAgc2VjdGlvbnMgYW5kIHRoZXkgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgYXNzb2NpYXRlZCByZWxvY2F0aW9uLgotICAgICAgICAgICAgICBXZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgdGhvc2Ugd29yZHMgYW5kIHNvbWUgb3RoZXJzIHdoaWNoCi0gICAgICAgICAgICAgIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgdGhlaXIgcmVsb2NhdGlvbnMuICBIb3dldmVyLCBub3QgYWxsCi0gICAgICAgICAgICAgIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHdpbGwgaGF2ZSBhIHJlbG9jYXRpb24gc28gd2Ugd2lsbAotICAgICAgICAgICAgICBvbmx5IGlnbm9yZSB3b3JkcyB0aGF0IDEpIGhhdmUgYSByZWxvYywgYW5kIDIpIHRoZSByZWxvYwotICAgICAgICAgICAgICBpcyBub3QgYXBwbGljYWJsZSB0byBhIGNvbmRpdGlvbmFsIGJyYW5jaC4KLSAgICAgICAgICAgICAgVGhlIGFycmF5IHJlbGFfY29tYiBpcyBidWlsdCBoZXJlIGZvciB1c2UgaW4gdGhlIEVPUCBzY2FuIGxvb3AuICovCi0gICAgICAgICAgICAgIHN3aXRjaCAocl90eXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIFJfUFBDX0FERFIxNF9CUk5UQUtFTjogICAgIC8qIGFic29sdXRlLCBwcmVkaWN0ZWQgbm90IHRha2VuICovCi0gICAgICAgICAgICAgICAgY2FzZSBSX1BQQ19SRUwxNDogICAgICAgICAgICAgICAvKiByZWxhdGl2ZSBjb25kLiBici4gKi8KLSAgICAgICAgICAgICAgICBjYXNlIFJfUFBDX1JFTDE0X0JSTlRBS0VOOiAgICAgIC8qIHJlbC4gY29uZC4gYnIuLCBwcmVkaWN0ZWQgbm90IHRha2VuICovCi0gICAgICAgICAgICAgICAgICAvKiBXZSBzaG91bGQgY2hlY2sgdGhlIGluc3RydWN0aW9uLiAqLwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgIC8qIFRoZSB3b3JkIGlzIG5vdCBhIGNvbmRpdGlvbmFsIGJyYW5jaCAtIGlnbm9yZSBpdC4gKi8KLSAgICAgICAgICAgICAgICAgIHJlbGFfY29tYltjb21iX2NvdW50KytdID0gJmludGVybmFsX3JlbG9jc1tuXTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29tYl9jb3VudCA+IDEpCi0gICAgICAgICAgICAgIHFzb3J0IChyZWxhX2NvbWIsIChzaXplX3QpIGNvbWJfY291bnQsIHNpemVvZiAoaW50KSwgcHBjX2VsZl9zb3J0X3JlbGEpOwotICAgICAgICB9Ci0KLSAgICAgIC8qIEVudW1lcmF0ZSBlYWNoIEVPUCByZWdpb24gdGhhdCBvdmVybGFwcyB0aGlzIHNlY3Rpb24uICovCi0gICAgICBlbmRfc2VjdGlvbiA9IGlzZWMtPnZtYSArIGlzZWMtPl9jb29rZWRfc2l6ZTsKLSAgICAgIGRvdCA9IGVuZF9wYWdlID0gKGlzZWMtPnZtYSB8IChQQUdFU0laRSAtIDEpKSArIDE7Ci0gICAgICBkb3QgLT0gbGlua19pbmZvLT5tcGM4NjBjMDsKLSAgICAgIHNlY3Rpb25fbW9kaWZpZWQgPSBmYWxzZTsKLSAgICAgIGlmIChkb3QgPCBpc2VjLT52bWEpICAgICAgLyogSW5jcmVtZW50IHRoZSBzdGFydCBwb3NpdGlvbiBpZiB0aGlzIHNlY3Rpb24gKi8KLSAgICAgICAgICBkb3QgPSBpc2VjLT52bWE7ICAgICAgLyogYmVnaW5zIGluIHRoZSBtaWRkbGUgb2YgaXRzIGZpcnN0IEVPUCByZWdpb24uICovCi0gICAgICBmb3IgKDsKLSAgICAgICAgICAgZG90IDwgZW5kX3NlY3Rpb247Ci0gICAgICAgICAgIGRvdCArPSBQQUdFU0laRSwgZW5kX3BhZ2UgKz0gUEFHRVNJWkUpCi0gICAgICAgIHsKLQotICAgICAgICAgIC8qIENoZWNrIGVhY2ggd29yZCBpbiB0aGlzIEVPUCByZWdpb24uICovCi0gICAgICAgICAgZm9yICg7IGRvdCA8IGVuZF9wYWdlOyBkb3QgKz0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYmZkX3ZtYSBpc2VjX29mZnNldDsKLSAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICAgICAgICAgICBib29sZWFuIHNraXAsIG1vZGlmaWVkOwotCi0gICAgICAgICAgICAgIC8qIERvbid0IHByb2Nlc3MgdGhpcyB3b3JkIGlmIHRoZXJlIGlzIGEgcmVsb2NhdGlvbiBmb3IgaXQgYW5kCi0gICAgICAgICAgICAgIHRoZSByZWxvY2F0aW9uIGluZGljYXRlcyB0aGUgd29yZCBpcyBub3QgYSBjb25kaXRpb25hbCBicmFuY2guICovCi0gICAgICAgICAgICAgIHNraXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgaXNlY19vZmZzZXQgPSBkb3QgLSBpc2VjLT52bWE7Ci0gICAgICAgICAgICAgIGZvciAoOyBjb21iX2N1cnI8Y29tYl9jb3VudDsgKytjb21iX2N1cnIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmZkX3ZtYSByX29mZnNldDsKLQotICAgICAgICAgICAgICAgICAgcl9vZmZzZXQgPSByZWxhX2NvbWJbY29tYl9jdXJyXS0+cl9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICBpZiAocl9vZmZzZXQgPj0gaXNlY19vZmZzZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocl9vZmZzZXQgPT0gaXNlY19vZmZzZXQpIHNraXAgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc2tpcCkgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgLyogQ2hlY2sgdGhlIGN1cnJlbnQgd29yZCBmb3IgYSBwcm9ibGVtYXRpYyBjb25kaXRpb25hbCBicmFuY2guICovCi0jZGVmaW5lIEJPMChpbnNuKSAoKGluc24pICYgMHgwMjAwMDAwMCkKLSNkZWZpbmUgQk8yKGluc24pICgoaW5zbikgJiAweDAwODAwMDAwKQotI2RlZmluZSBCTzQoaW5zbikgKChpbnNuKSAmIDB4MDAyMDAwMDApCi0gICAgICAgICAgICAgIGluc24gPSAodW5zaWduZWQgbG9uZykgYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBpc2VjX29mZnNldCk7Ci0gICAgICAgICAgICAgIG1vZGlmaWVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGlmICgoaW5zbiAmIDB4RmMwMDAwMDApID09IDB4NDAwMDAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gaXMgQkN4ICovCi0gICAgICAgICAgICAgICAgICBpZiAoKCFCTzAoaW5zbikgfHwgIUJPMihpbnNuKSkgJiYgIUJPNChpbnNuKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGJmZF92bWEgdGFyZ2V0OwotICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyAibm9ybWFsIi4KLSAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gaW5zbiAmIDB4MDAwMEZmZmM7ICAgICAgICAgICAgICAgLypleHRyYWN0Ki8KLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAodGFyZ2V0IF4gMHg4MDAwKSAtIDB4ODAwMDsgICAgICAvKnNpZ24gZXh0ZW5kKi8KLSAgICAgICAgICAgICAgICAgICAgICBpZiAoKGluc24gJiAweDAwMDAwMDAyKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgKz0gZG90OyAgICAgICAgICAgICAgICAgICAgICAgIC8qY29udmVydCB0byBhYnMqLwotICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPiBkb3QpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZSBpZiAoKGluc24gJiAweEZjMDBGZmZlKSA9PSAweDRjMDAwNDIwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIEluc3RydWN0aW9uIGlzIEJDQ1RSeCAqLwotICAgICAgICAgICAgICAgICAgaWYgKCghQk8wKGluc24pIHx8ICFCTzIoaW5zbikpICYmICFCTzQoaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgYnJhbmNoIGlzIHByZWRpY3RlZCBhcyBub3QtdGFrZW4uCi0JCSAgICAgIElmIHRoaXMgaXMgYSBmb3J3YXJkIGJyYW5jaCwgaXQgaXMgcHJvYmxlbWF0aWMuCi0gICAgICAgICAgICAgICAgICAgICAgU2luY2Ugd2UgY2FuJ3QgdGVsbCBzdGF0aWNhbGx5IGlmIGl0IHdpbGwgYnJhbmNoIGZvcndhcmQsCi0gICAgICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGUgcHJlZGljdGlvbiBiaXQuICovCi0gICAgICAgICAgICAgICAgICAgICAgaW5zbiB8PSAweDAwMjAwMDAwOyAgIC8qIHNldCB0aGUgcHJlZGljdGlvbiBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHRydWU7Ci0JCSAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4RmMwMEZmZmUpID09IDB4NGMwMDAwMjApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogSW5zdHJ1Y3Rpb24gaXMgQkNMUnggKi8KLSAgICAgICAgICAgICAgICAgIGlmICgoIUJPMChpbnNuKSB8fCAhQk8yKGluc24pKSAmJiAhQk80KGluc24pKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGJyYW5jaCBpcyBwcmVkaWN0ZWQgYXMgbm90LXRha2VuLgotCQkgICAgICBJZiB0aGlzIGlzIGEgZm9yd2FyZCBicmFuY2gsIGl0IGlzIHByb2JsZW1hdGljLgotICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHdlIGNhbid0IHRlbGwgc3RhdGljYWxseSBpZiBpdCB3aWxsIGJyYW5jaCBmb3J3YXJkLAotICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBzZXQgdGhlIHByZWRpY3Rpb24gYml0LiAqLwotICAgICAgICAgICAgICAgICAgICAgIGluc24gfD0gMHgwMDIwMDAwMDsgICAvKiBzZXQgdGhlIHByZWRpY3Rpb24gYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOwotCQkgICAgfQotICAgICAgICAgICAgICAgIH0KLSN1bmRlZiBCTzAKLSN1bmRlZiBCTzIKLSN1bmRlZiBCTzQKLSAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkKQotCSAgICAgICAgewotICAgICAgICAgICAgICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBpc2VjX29mZnNldCk7Ci0JCSAgc2VjdGlvbl9tb2RpZmllZCA9IHRydWU7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIGlmIChzZWN0aW9uX21vZGlmaWVkKQotCXsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKGlzZWMpLT50aGlzX2hkci5jb250ZW50cyA9IGNvbnRlbnRzOwotCSAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBpZiAocmVsYV9jb21iICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocmVsYV9jb21iKTsKLSAgICAgIHJlbGFfY29tYiA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoaXNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gY29udGVudHM7Ci0JfQotICAgICAgZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxhX2NvbWIgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxhX2NvbWIpOwotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotDAotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotcHBjX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcHBjX3JlbG9jID0gUl9QUENfTk9ORTsKLQotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbUl9QUENfQUREUjMyXSkKLSAgICAvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBzd2l0Y2ggKChpbnQpY29kZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAocmVsb2NfaG93dG9fdHlwZSAqKU5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19OT05FOgkJcHBjX3JlbG9jID0gUl9QUENfTk9ORTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoJCQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMzI7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkEyNjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgkJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgkJcHBjX3JlbG9jID0gUl9QUENfQUREUjE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTY6CQlwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTQ7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19BRERSMTRfQlJUQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU46CXBwY19yZWxvYyA9IFJfUFBDX0FERFIxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IyNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDI0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1JFTDE0OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUlRBS0VOOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOOglwcGNfcmVsb2MgPSBSX1BQQ19SRUwxNF9CUk5UQUtFTjsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfR09UMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2X0dPVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0xPOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6CQlwcGNfcmVsb2MgPSBSX1BQQ19HT1QxNl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkY6CXBwY19yZWxvYyA9IFJfUFBDX0dPVDE2X0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMjRfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwyNDsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19DT1BZOgkJcHBjX3JlbG9jID0gUl9QUENfQ09QWTsJCQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfR0xPQl9EQVQ6CXBwY19yZWxvYyA9IFJfUFBDX0dMT0JfREFUOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoJcHBjX3JlbG9jID0gUl9QUENfTE9DQUwyNFBDOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlwcGNfcmVsb2MgPSBSX1BQQ19SRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDMyOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19QTFRSRUwzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfUExUT0ZGOgkJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1BMVE9GRjoJCXBwY19yZWxvYyA9IFJfUFBDX1BMVDE2X0hJOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRjoJcHBjX3JlbG9jID0gUl9QUENfUExUMTZfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgkJcHBjX3JlbG9jID0gUl9QUENfU0RBUkVMMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9CQVNFUkVMOgkJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9MTzsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTDoJcHBjX3JlbG9jID0gUl9QUENfU0VDVE9GRl9ISTsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOglwcGNfcmVsb2MgPSBSX1BQQ19TRUNUT0ZGX0hBOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQ1RPUjoJCXBwY19yZWxvYyA9IFJfUFBDX0FERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19UT0MxNjoJCXBwY19yZWxvYyA9IFJfUFBDX1RPQzE2OwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfTkFERFIzMjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX05BRERSMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0xPOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEk6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hJOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9OQUREUjE2X0hBOwlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQUkxNjsJCWJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNjoJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTJJMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9TREEyUkVMOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMToJcHBjX3JlbG9jID0gUl9QUENfRU1CX1NEQTIxOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUY6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9NUktSRUY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNFQzE2OglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU0VDMTY7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0xPOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfTE87CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEk7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hBOglwcGNfcmVsb2MgPSBSX1BQQ19FTUJfUkVMU1RfSEE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQ6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9CSVRfRkxEOwkJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6CXBwY19yZWxvYyA9IFJfUFBDX0VNQl9SRUxTREE7CQlicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoJcHBjX3JlbG9jID0gUl9QUENfR05VX1ZUSU5IRVJJVDsJYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOglwcGNfcmVsb2MgPSBSX1BQQ19HTlVfVlRFTlRSWTsJCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClwcGNfcmVsb2MgXTsKLX07Ci0KLS8qIFNldCB0aGUgaG93dG8gcG9pbnRlciBmb3IgYSBQb3dlclBDIEVMRiByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmMzJfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICBpZiAoIXBwY19lbGZfaG93dG9fdGFibGVbIFJfUFBDX0FERFIzMiBdKQkvKiBJbml0aWFsaXplIGhvd3RvIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIHBwY19lbGZfaG93dG9faW5pdCAoKTsKLQotICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUgKGRzdC0+cl9pbmZvKSA8ICh1bnNpZ25lZCBpbnQpIFJfUFBDX21heCk7Ci0gIGNhY2hlX3B0ci0+aG93dG8gPSBwcGNfZWxmX2hvd3RvX3RhYmxlW0VMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pXTsKLX0KLQotLyogSGFuZGxlIHRoZSBSX1BQQ19BRERSMTZfSEEgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1wcGNfZWxmX2FkZHIxNl9oYV9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotCi0gIHJlbG9jX2VudHJ5LT5hZGRlbmQgKz0gKHJlbG9jYXRpb24gJiAweDgwMDApIDw8IDE7Ci0KLSAgcmV0dXJuIGJmZF9yZWxvY19jb250aW51ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gc2V0IHdoZXRoZXIgYSBtb2R1bGUgbmVlZHMgdGhlIC1tcmVsb2NhdGFibGUgYml0IHNldC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKGFiZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPT0gZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzID0gZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChhYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3B5IGJhY2tlbmQgc3BlY2lmaWMgZGF0YSBmcm9tIG9uZSBvYmplY3QgbW9kdWxlIHRvIGFub3RoZXIgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICppYmZkOwotICAgICBiZmQgKm9iZmQ7Ci17Ci0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpCi0JICAgICAgfHwgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPT0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MpOwotCi0gIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3M7Ci0gIGVsZl9mbGFnc19pbml0IChvYmZkKSA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNZXJnZSBiYWNrZW5kIHNwZWNpZmljIGRhdGEgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgb3V0cHV0Ci0gICBvYmplY3QgZmlsZSB3aGVuIGxpbmtpbmcgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBmbGFnd29yZCBvbGRfZmxhZ3M7Ci0gIGZsYWd3b3JkIG5ld19mbGFnczsKLSAgYm9vbGVhbiBlcnJvcjsKLQotICAvKiBDaGVjayBpZiB3ZSBoYXZlIHRoZSBzYW1lIGVuZGlhbmVzcyAqLwotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICptc2c7Ci0KLSAgICAgIGlmIChiZmRfYmlnX2VuZGlhbiAoaWJmZCkpCi0JbXNnID0gXygiJXM6IGNvbXBpbGVkIGZvciBhIGJpZyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbiIpOwotICAgICAgZWxzZQotCW1zZyA9IF8oIiVzOiBjb21waWxlZCBmb3IgYSBsaXR0bGUgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGJpZyBlbmRpYW4iKTsKLQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChtc2csIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0gIGlmICghZWxmX2ZsYWdzX2luaXQgKG9iZmQpKQkvKiBGaXJzdCBjYWxsLCBubyBmbGFncyBzZXQgKi8KLSAgICB7Ci0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBuZXdfZmxhZ3M7Ci0gICAgfQotCi0gIGVsc2UgaWYgKG5ld19mbGFncyA9PSBvbGRfZmxhZ3MpCS8qIENvbXBhdGlibGUgZmxhZ3MgYXJlIG9rICovCi0gICAgOwotCi0gIGVsc2UJCQkJCS8qIEluY29tcGF0aWJsZSBmbGFncyAqLwotICAgIHsKLSAgICAgIC8qIFdhcm4gYWJvdXQgLW1yZWxvY2F0YWJsZSBtaXNtYXRjaC4gIEFsbG93IC1tcmVsb2NhdGFibGUtbGliIHRvIGJlIGxpbmtlZAotICAgICAgICAgd2l0aCBlaXRoZXIuICAqLwotICAgICAgZXJyb3IgPSBmYWxzZTsKLSAgICAgIGlmICgobmV3X2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKSAhPSAwCi0JICAmJiAob2xkX2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpKSA9PSAwKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCBub3JtYWxseSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCX0KLSAgICAgIGVsc2UgaWYgKChuZXdfZmxhZ3MgJiAoRUZfUFBDX1JFTE9DQVRBQkxFIHwgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpID09IDAKLQkgICAgICAgJiYgKG9sZF9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRSkgIT0gMCkKLQl7Ci0JICBlcnJvciA9IHRydWU7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBjb21waWxlZCBub3JtYWxseSBhbmQgbGlua2VkIHdpdGggbW9kdWxlcyBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBvdXRwdXQgaXMgLW1yZWxvY2F0YWJsZS1saWIgaWZmIGJvdGggdGhlIGlucHV0IGZpbGVzIGFyZS4gICovCi0gICAgICBpZiAoISAobmV3X2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFX0xJQikpCi0JZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgJj0gfkVGX1BQQ19SRUxPQ0FUQUJMRV9MSUI7Ci0KLSAgICAgIC8qIFRoZSBvdXRwdXQgaXMgLW1yZWxvY2F0YWJsZSBpZmYgaXQgY2FuJ3QgYmUgLW1yZWxvY2F0YWJsZS1saWIsCi0gICAgICAgICBidXQgZWFjaCBpbnB1dCBmaWxlIGlzIGVpdGhlciAtbXJlbG9jYXRhYmxlIG9yIC1tcmVsb2NhdGFibGUtbGliLiAgKi8KLSAgICAgIGlmICghIChlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyAmIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpCi0JICAmJiAobmV3X2ZsYWdzICYgKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfUkVMT0NBVEFCTEUpKQotCSAgJiYgKG9sZF9mbGFncyAmIChFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX1JFTE9DQVRBQkxFKSkpCi0JZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFOwotCi0gICAgICAvKiBEbyBub3Qgd2FybiBhYm91dCBlYWJpIHZzLiBWLjQgbWlzbWF0Y2gsIGp1c3Qgb3IgaW4gdGhlIGJpdCBpZiBhbnkgbW9kdWxlIHVzZXMgaXQgKi8KLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzIHw9IChuZXdfZmxhZ3MgJiBFRl9QUENfRU1CKTsKLQotICAgICAgbmV3X2ZsYWdzICY9IH4gKEVGX1BQQ19SRUxPQ0FUQUJMRSB8IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgfCBFRl9QUENfRU1CKTsKLSAgICAgIG9sZF9mbGFncyAmPSB+IChFRl9QUENfUkVMT0NBVEFCTEUgfCBFRl9QUENfUkVMT0NBVEFCTEVfTElCIHwgRUZfUFBDX0VNQik7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgYW55IG90aGVyIG1pc21hdGNoZXMgKi8KLSAgICAgIGlmIChuZXdfZmxhZ3MgIT0gb2xkX2ZsYWdzKQotCXsKLQkgIGVycm9yID0gdHJ1ZTsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVzZXMgZGlmZmVyZW50IGVfZmxhZ3MgKDB4JWx4KSBmaWVsZHMgdGhhbiBwcmV2aW91cyBtb2R1bGVzICgweCVseCkiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0JfQotCi0gICAgICBpZiAoZXJyb3IpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogSGFuZGxlIGEgUG93ZXJQQyBzcGVjaWZpYyBzZWN0aW9uIHdoZW4gcmVhZGluZyBhbiBvYmplY3QgZmlsZS4gIFRoaXMKLSAgIGlzIGNhbGxlZCB3aGVuIGVsZmNvZGUuaCBmaW5kcyBhIHNlY3Rpb24gd2l0aCBhbiB1bmtub3duIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmICghIF9iZmRfZWxmX21ha2Vfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG5ld3NlY3QgPSBoZHItPmJmZF9zZWN0aW9uOwotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCk7Ci0gIGlmIChoZHItPnNoX2ZsYWdzICYgU0hGX0VYQ0xVREUpCi0gICAgZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfT1JERVJFRCkKLSAgICBmbGFncyB8PSBTRUNfU09SVF9FTlRSSUVTOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwgZmxhZ3MpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogU2V0IHVwIGFueSBvdGhlciBzZWN0aW9uIGZsYWdzIGFuZCBzdWNoIHRoYXQgbWF5IGJlIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIHNoZHIsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKnNoZHI7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLXsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkgIT0gMCkKLSAgICBzaGRyLT5zaF9mbGFncyB8PSBTSEZfRVhDTFVERTsKLQotICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19TT1JUX0VOVFJJRVMpICE9IDApCi0gICAgc2hkci0+c2hfdHlwZSA9IFNIVF9PUkRFUkVEOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBDcmVhdGUgYSBzcGVjaWFsIGxpbmtlciBzZWN0aW9uICovCi1zdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIHdoaWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBlbnVtIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtIHdoaWNoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0KLSAgLyogUmVjb3JkIHRoZSBmaXJzdCBiZmQgc2VjdGlvbiB0aGF0IG5lZWRzIHRoZSBzcGVjaWFsIHNlY3Rpb24gKi8KLSAgaWYgKCFkeW5vYmopCi0gICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUsIGNyZWF0ZSB0aGUgc2VjdGlvbiAqLwotICBsc2VjdCA9IGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCk7Ci0gIGlmICghbHNlY3QpCi0gICAgewotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgZGVmYXVsdHM7Ci0gICAgICBzdGF0aWMgZWxmX2xpbmtlcl9zZWN0aW9uX3QgemVyb19zZWN0aW9uOwotCi0gICAgICBkZWZhdWx0cyA9IHplcm9fc2VjdGlvbjsKLSAgICAgIGRlZmF1bHRzLndoaWNoID0gd2hpY2g7Ci0gICAgICBkZWZhdWx0cy5ob2xlX3dyaXR0ZW5fcCA9IGZhbHNlOwotICAgICAgZGVmYXVsdHMuYWxpZ25tZW50ID0gMjsKLQotICAgICAgLyogQm90aCBvZiB0aGVzZSBzZWN0aW9ucyBhcmUgKHRlY2huaWNhbGx5KSBjcmVhdGVkIGJ5IHRoZSB1c2VyCi0JIHB1dHRpbmcgZGF0YSBpbiB0aGVtLCBzbyB0aGV5IHNob3VsZG4ndCBiZSBtYXJrZWQKLQkgU0VDX0xJTktFUl9DUkVBVEVELgotCi0JIFRoZSBsaW5rZXIgY3JlYXRlcyB0aGVtIHNvIGl0IGhhcyBzb21ld2hlcmUgdG8gYXR0YWNoIHRoZWlyCi0JIHJlc3BlY3RpdmUgc3ltYm9scy4gSW4gZmFjdCwgaWYgdGhleSB3ZXJlIGVtcHR5IGl0IHdvdWxkCi0JIGJlIE9LIHRvIGxlYXZlIHRoZSBzeW1ib2wgc2V0IHRvIDAgKG9yIGFueSByYW5kb20gbnVtYmVyKSwgYmVjYXVzZQotCSB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIgc2hvdWxkIG5ldmVyIGJlIHVzZWQuICAqLwotICAgICAgZGVmYXVsdHMuZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQl8IFNFQ19JTl9NRU1PUlkpOwotCi0gICAgICBzd2l0Y2ggKHdoaWNoKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogVW5rbm93biBzcGVjaWFsIGxpbmtlciB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAoaW50KXdoaWNoKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gKGVsZl9saW5rZXJfc2VjdGlvbl90ICopMDsKLQotCWNhc2UgTElOS0VSX1NFQ1RJT05fU0RBVEE6CS8qIC5zZGF0YS8uc2JzcyBzZWN0aW9uICovCi0JICBkZWZhdWx0cy5uYW1lCQkgID0gIi5zZGF0YSI7Ci0JICBkZWZhdWx0cy5yZWxfbmFtZQkgID0gIi5yZWxhLnNkYXRhIjsKLQkgIGRlZmF1bHRzLmJzc19uYW1lCSAgPSAiLnNic3MiOwotCSAgZGVmYXVsdHMuc3ltX25hbWUJICA9ICJfU0RBX0JBU0VfIjsKLQkgIGRlZmF1bHRzLnN5bV9vZmZzZXQJICA9IDMyNzY4OwotCSAgYnJlYWs7Ci0KLQljYXNlIExJTktFUl9TRUNUSU9OX1NEQVRBMjoJLyogLnNkYXRhMi8uc2JzczIgc2VjdGlvbiAqLwotCSAgZGVmYXVsdHMubmFtZQkJICA9ICIuc2RhdGEyIjsKLQkgIGRlZmF1bHRzLnJlbF9uYW1lCSAgPSAiLnJlbGEuc2RhdGEyIjsKLQkgIGRlZmF1bHRzLmJzc19uYW1lCSAgPSAiLnNic3MyIjsKLQkgIGRlZmF1bHRzLnN5bV9uYW1lCSAgPSAiX1NEQTJfQkFTRV8iOwotCSAgZGVmYXVsdHMuc3ltX29mZnNldAkgID0gMzI3Njg7Ci0JICBkZWZhdWx0cy5mbGFncwkgfD0gU0VDX1JFQURPTkxZOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBsc2VjdCA9IF9iZmRfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgd2hpY2gsICZkZWZhdWx0cyk7Ci0gICAgfQotCi0gIHJldHVybiBsc2VjdDsKLX0KLQotDAotLyogSWYgd2UgaGF2ZSBhIG5vbi16ZXJvIHNpemVkIC5zYnNzMiBvciAuUFBDLkVNQi5zYnNzMCBzZWN0aW9ucywgd2UgbmVlZCB0byBidW1wIHVwCi0gICB0aGUgbnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVycy4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19lbGZfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGludCByZXQ7Ci0KLSAgcmV0ID0gMDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaW50ZXJwIik7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgKytyZXQ7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNic3MyIik7Ci0gIGlmIChzICE9IE5VTEwgJiYgKHMtPmZsYWdzICYgU0VDX0xPQUQpICE9IDAgJiYgcy0+X3Jhd19zaXplID4gMCkKLSAgICArK3JldDsKLQotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuUFBDLkVNQi5zYnNzMCIpOwotICBpZiAocyAhPSBOVUxMICYmIChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwICYmIHMtPl9yYXdfc2l6ZSA+IDApCi0gICAgKytyZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogTW9kaWZ5IHRoZSBzZWdtZW50IG1hcCBpZiBuZWVkZWQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogV2UgaGF2ZSB0byBjcmVhdGUgLmR5bnNic3MgYW5kIC5yZWxhLnNic3MgaGVyZSBzbyB0aGF0IHRoZXkgZ2V0IG1hcHBlZAotICAgdG8gb3V0cHV0IHNlY3Rpb25zIChqdXN0IGxpa2UgX2JmZF9lbGZfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgaGFzCi0gICB0byBjcmVhdGUgLmR5bmJzcyBhbmQgLnJlbGEuYnNzKS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICByZWdpc3RlciBhc2VjdGlvbiAqczsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKCFfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucyhhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmxhZ3MgPSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0lOX01FTU9SWQotCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5zYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsYS5zYnNzIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLSAgYmZkX3ZtYSBwbHRfb2Zmc2V0OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICAvKiBNYWtlIHN1cmUgd2Uga25vdyB3aGF0IGlzIGdvaW5nIG9uIGhlcmUuICAqLwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTAotCSAgICAgICYmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKQotCQkgIHx8IGgtPndlYWtkZWYgIT0gTlVMTAotCQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKSk7Ci0KLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlciwKLSAgICAgd2hlbiB3ZSBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCSAgfHwgKCghaW5mby0+c2hhcmVkIHx8IGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JICB8fCAoaW5mby0+c2hhcmVkICYmIGgtPnBsdC5yZWZjb3VudCA8PSAwKSkKLQl7Ci0JICAvKiBBIFBMVCBlbnRyeSBpcyBub3QgcmVxdWlyZWQvYWxsb3dlZCB3aGVuOgotCi0JICAgICAxLiBXZSBhcmUgbm90IHVzaW5nIGxkLnNvOyBiZWNhdXNlIHRoZW4gdGhlIFBMVCBlbnRyeQotCSAgICAgY2FuJ3QgYmUgc2V0IHVwLCBzbyB3ZSBjYW4ndCB1c2Ugb25lLgotCi0JICAgICAyLiBXZSBrbm93IGZvciBjZXJ0YWluIHRoYXQgYSBzeW1ib2wgaXMgZGVmaW5lZCBpbgotCSAgICAgdGhpcyBvYmplY3QsIGJlY2F1c2UgdGhpcyBvYmplY3QgaXMgdGhlIGFwcGxpY2F0aW9uLAotCSAgICAgaXMgbGlua2VkIHdpdGggLUJzeW1ib2xpYywgb3IgYmVjYXVzZSB0aGUgc3ltYm9sIGlzIGxvY2FsLgotCi0JICAgICAzLiBHQyBoYXMgcmVuZGVyZWQgdGhlIGVudHJ5IHVudXNlZC4KLQkgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaW4gYW4gZXhlY3V0YWJsZSBhbGwgcmVmZXJlbmNlcyB0byB0aGUKLQkgICAgIHN5bWJvbCBnbyB0byB0aGUgUExULCBzbyB3ZSBjYW4ndCB0dXJuIGl0IG9mZiBpbiB0aGF0IGNhc2UuCi0JICAgICA/Pz8gVGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8gaGVyZSBpcyB0byByZWZlcmVuY2UgY291bnQKLQkgICAgIGFsbCB1c2VzIG9mIHRoZSBzeW1ib2wsIG5vdCBqdXN0IHRob3NlIHRvIHRoZSBHT1Qgb3IgUExULiAgKi8KLQkgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCAucGx0IGVudHJ5LCBtYWtlIHJvb20gZm9yIHRoZSBzcGVjaWFsCi0JIGZpcnN0IGVudHJ5LiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgKz0gUExUX0lOSVRJQUxfRU5UUllfU0laRTsKLQotICAgICAgLyogVGhlIFBvd2VyUEMgUExUIGlzIGFjdHVhbGx5IGNvbXBvc2VkIG9mIHR3byBwYXJ0cywgdGhlIGZpcnN0IHBhcnQKLQkgaXMgMiB3b3JkcyAoZm9yIGEgbG9hZCBhbmQgYSBqdW1wKSwgYW5kIHRoZW4gdGhlcmUgaXMgYSByZW1haW5pbmcKLQkgd29yZCBhdmFpbGFibGUgYXQgdGhlIGVuZC4gICovCi0gICAgICBwbHRfb2Zmc2V0ID0gKFBMVF9JTklUSUFMX0VOVFJZX1NJWkUKLQkJICAgICsgKFBMVF9TTE9UX1NJWkUKLQkJICAgICAgICogKChzLT5fcmF3X3NpemUgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKQotCQkJICAvIFBMVF9FTlRSWV9TSVpFKSkpOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBub3QgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgZmlsZSwgYW5kIHdlIGFyZQotCSBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLQkgbG9jYXRpb24gaW4gdGhlIC5wbHQuICBUaGlzIGlzIHJlcXVpcmVkIHRvIG1ha2UgZnVuY3Rpb24KLQkgcG9pbnRlcnMgY29tcGFyZSBhcyBlcXVhbCBiZXR3ZWVuIHRoZSBub3JtYWwgZXhlY3V0YWJsZSBhbmQKLQkgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZAotCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gcGx0X29mZnNldDsKLQl9Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBwbHRfb2Zmc2V0OwotCi0gICAgICAvKiBNYWtlIHJvb20gZm9yIHRoaXMgZW50cnkuICBBZnRlciB0aGUgODE5Mm5kIGVudHJ5LCByb29tCi0gICAgICAgICBmb3IgdHdvIGVudHJpZXMgaXMgYWxsb2NhdGVkLiAgKi8KLSAgICAgIGlmICgocy0+X3Jhd19zaXplIC0gUExUX0lOSVRJQUxfRU5UUllfU0laRSkgLyBQTFRfRU5UUllfU0laRQotCSAgPj0gUExUX05VTV9TSU5HTEVfRU5UUklFUykKLQlzLT5fcmF3X3NpemUgKz0gMiAqIFBMVF9FTlRSWV9TSVpFOwotICAgICAgZWxzZQotCXMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBzeW1ib2wsIGFuZCB0aGVyZSBpcyBhIHJlYWwgZGVmaW5pdGlvbiwgdGhlCi0gICAgIHByb2Nlc3NvciBpbmRlcGVuZGVudCBjb2RlIHdpbGwgaGF2ZSBhcnJhbmdlZCBmb3IgdXMgdG8gc2VlIHRoZQotICAgICByZWFsIGRlZmluaXRpb24gZmlyc3QsIGFuZCB3ZSBjYW4ganVzdCB1c2UgdGhlIHNhbWUgdmFsdWUuICAqLwotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT53ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT53ZWFrZGVmLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IHdoaWNoCi0gICAgIGlzIG5vdCBhIGZ1bmN0aW9uLiAgKi8KLQotICAvKiBJZiB3ZSBhcmUgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgbXVzdCBwcmVzdW1lIHRoYXQgdGhlCi0gICAgIG9ubHkgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIGFyZSB2aWEgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuCi0gICAgIEZvciBzdWNoIGNhc2VzIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIGhlcmU7IHRoZSByZWxvY2F0aW9ucyB3aWxsCi0gICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5IGJ5IHJlbG9jYXRlX3NlY3Rpb24uICAqLwotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFdlIG11c3QgYWxsb2NhdGUgdGhlIHN5bWJvbCBpbiBvdXIgLmR5bmJzcyBzZWN0aW9uLCB3aGljaCB3aWxsCi0gICAgIGJlY29tZSBwYXJ0IG9mIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBUaGVyZSB3aWxsIGJlCi0gICAgIGFuIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgVGhlIGR5bmFtaWMKLSAgICAgb2JqZWN0IHdpbGwgY29udGFpbiBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLCBzbyBhbGwgcmVmZXJlbmNlcwotICAgICBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCB0byB0aGlzIHN5bWJvbCB3aWxsIGdvIHRocm91Z2ggdGhlIGdsb2JhbAotICAgICBvZmZzZXQgdGFibGUuICBUaGUgZHluYW1pYyBsaW5rZXIgd2lsbCB1c2UgdGhlIC5keW5zeW0gZW50cnkgdG8KLSAgICAgZGV0ZXJtaW5lIHRoZSBhZGRyZXNzIGl0IG11c3QgcHV0IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLCBzbwotICAgICBib3RoIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgdGhlIHJlZ3VsYXIgb2JqZWN0IHdpbGwgcmVmZXIgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGZvciB0aGUgdmFyaWFibGUuCi0KLSAgICAgT2YgY291cnNlLCBpZiB0aGUgc3ltYm9sIGlzIHN1ZmZpY2llbnRseSBzbWFsbCwgd2UgbXVzdCBpbnN0ZWFkCi0gICAgIGFsbG9jYXRlIGl0IGluIC5zYnNzLiAgRklYTUU6IEl0IHdvdWxkIGJlIGJldHRlciB0byBkbyB0aGlzIGlmIGFuZAotICAgICBvbmx5IGlmIHRoZXJlIHdlcmUgYWN0dWFsbHkgU0RBUkVMIHJlbG9jcyBmb3IgdGhhdCBzeW1ib2wuICAqLwotCi0gIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnNic3MiKTsKLSAgZWxzZQotICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmJzcyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gIC8qIFdlIG11c3QgZ2VuZXJhdGUgYSBSX1BQQ19DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGNvcHkgdGhlIGluaXRpYWwgdmFsdWUgb3V0IG9mIHRoZSBkeW5hbWljIG9iamVjdCBhbmQgaW50byB0aGUKLSAgICAgcnVudGltZSBwcm9jZXNzIGltYWdlLiAgV2UgbmVlZCB0byByZW1lbWJlciB0aGUgb2Zmc2V0IGludG8gdGhlCi0gICAgIC5yZWxhLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuc2JzcyIpOwotICAgICAgZWxzZQotCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKLSAgICBwb3dlcl9vZl90d28gPSA0OwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfYWRqdXN0X2R5bmluZHggKGgsIGNwYXJnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGNwYXJnOwotewotICBpbnQgKmNwID0gKGludCAqKSBjcGFyZzsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfYWRqdXN0X2R5bmluZHggY2FsbGVkLCBoLT5keW5pbmR4ID0gJWQsICpjcCA9ICVkXG4iLCBoLT5keW5pbmR4LCAqY3ApOwotI2VuZGlmCi0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiBwbHQ7Ci0gIGJvb2xlYW4gcmVsb2NzOwotICBib29sZWFuIHJlbHRleHQ7Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaW50ZXJwIik7Ci0JICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCSAgcy0+X3Jhd19zaXplID0gc2l6ZW9mIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCSAgcy0+Y29udGVudHMgPSAodW5zaWduZWQgY2hhciAqKSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3QsIC5yZWxhLnNkYXRhLCBhbmQKLQkgLnJlbGEuc2RhdGEyIHNlY3Rpb25zLiAgSG93ZXZlciwgaWYgd2UgYXJlIG5vdCBjcmVhdGluZyB0aGUKLQkgZHluYW1pYyBzZWN0aW9ucywgd2Ugd2lsbCBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldAotCSB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsIGV0IGFsLCB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldAotCSBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZSBiZWxvdy4gICovCi0gICAgICBzdGF0aWMgY2hhciAqcmVsYV9zZWN0aW9uc1tdID0geyAiLnJlbGEuZ290IiwgIi5yZWxhLnNkYXRhIiwKLQkJCQkgICAgICAgIi5yZWxhLnNkYXRhMiIsICIucmVsYS5zYnNzIiwKLQkJCQkgICAgICAgKGNoYXIgKikwIH07Ci0gICAgICBjaGFyICoqcDsKLQotICAgICAgZm9yIChwID0gcmVsYV9zZWN0aW9uczsgKnAgIT0gKGNoYXIgKikwOyBwKyspCi0JewotCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICpwKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHBsdCA9IGZhbHNlOwotICByZWxvY3MgPSBmYWxzZTsKLSAgcmVsdGV4dCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSA9PSAwKQotCXsKLQkgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFN0cmlwIHRoaXMgc2VjdGlvbiBpZiB3ZSBkb24ndCBuZWVkIGl0OyBzZWUgdGhlCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgYmVsb3cuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogUmVtZW1iZXIgd2hldGhlciB0aGVyZSBpcyBhIFBMVC4gICovCi0JICAgICAgcGx0ID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbW9zdGx5IHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kCi0JCSAucmVsYS5wbHQuICBXZSBtdXN0IGNyZWF0ZSBib3RoIHNlY3Rpb25zIGluCi0JCSBjcmVhdGVfZHluYW1pY19zZWN0aW9ucywgYmVjYXVzZSB0aGV5IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICp0YXJnZXQ7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQotCSAgICAgIC8qIFJlbWVtYmVyIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9uIHNlY3Rpb25zLiAqLwotCSAgICAgIHJlbG9jcyA9IHRydWU7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIGEgcmVhZCBvbmx5Ci0JCSBzZWN0aW9uLCB0aGVuIHdlIHByb2JhYmx5IG5lZWQgYSBEVF9URVhUUkVMIGVudHJ5LiAgKi8KLQkgICAgICBvdXRuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgIHMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgICB0YXJnZXQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0bmFtZSArIDUpOwotCSAgICAgIGlmICh0YXJnZXQgIT0gTlVMTAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5nb3QiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpICE9IDAKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpICE9IDApCi0JewotCSAgLyogSXQncyBub3Qgb25lIG9mIG91ciBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JewotCSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBwcGNfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zLCBidXQgd2UKLQkgbXVzdCBhZGQgdGhlIGVudHJpZXMgbm93IHNvIHRoYXQgd2UgZ2V0IHRoZSBjb3JyZWN0IHNpemUgZm9yCi0JIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgVGhlIERUX0RFQlVHIGVudHJ5IGlzIGZpbGxlZCBpbiBieSB0aGUKLQkgZHluYW1pYyBsaW5rZXIgYW5kIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLiAgKi8KLSAgICAgIGlmICghIGluZm8tPnNoYXJlZCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVEdPVCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUExUUkVMU1osIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTCwgRFRfUkVMQSkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfSk1QUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHJlbG9jcykKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFTWiwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJCXNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBnZW5lcmF0ZSBhIHNlY3Rpb24KLSAgICAgc3ltYm9sIGZvciBlYWNoIG91dHB1dCBzZWN0aW9uLiAgVGhlc2UgYXJlIGxvY2FsIHN5bWJvbHMsIHdoaWNoCi0gICAgIG1lYW5zIHRoYXQgdGhleSBtdXN0IGNvbWUgZmlyc3QgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLgotICAgICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50IHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeQotICAgICBvdGhlciBkeW5hbWljIHN5bWJvbC4KLQotICAgICBGSVhNRTogV2UgYXNzdW1lIHRoYXQgdGhlcmUgd2lsbCBuZXZlciBiZSByZWxvY2F0aW9ucyB0bwotICAgICBsb2NhdGlvbnMgaW4gbGlua2VyLWNyZWF0ZWQgc2VjdGlvbnMgdGhhdCBkbyBub3QgaGF2ZQotICAgICBleHRlcm5hbGx5LXZpc2libGUgbmFtZXMuIEluc3RlYWQsIHdlIHNob3VsZCB3b3JrIG91dCBwcmVjaXNlbHkKLSAgICAgd2hpY2ggc2VjdGlvbnMgcmVsb2NhdGlvbnMgYXJlIHRhcmdldHRlZCBhdC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGZvciAoYyA9IDAsIHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwCi0JICAgICAgfHwgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSAwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0JICAgICBmaWRkbGUgd2l0aCBkeW5zdHJfaW5kZXguICAqLwotCi0JICBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9IGMgKyAxOwotCi0JICBjKys7Ci0JfQotCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBwcGNfZWxmX2FkanVzdF9keW5pbmR4LAotCQkJICAgICAgKFBUUikgJmMpOwotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbiBkdXJpbmcgdGhlIGZpcnN0IHBoYXNlLCBhbmQKLSAgIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIG9yIHByb2NlZHVyZSBsaW5rYWdlCi0gICB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzLCAqKnN5bV9oYXNoZXNfZW5kOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdF9yZWZjb3VudHM7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YTsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhMjsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgYXNlY3Rpb24gKnNnb3QgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbGdvdCA9IE5VTEw7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfY2hlY2tfcmVsb2NzIGNhbGxlZCBmb3Igc2VjdGlvbiAlcyBpbiAlc1xuIiwKLQkgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0jZW5kaWYKLQotICAvKiBDcmVhdGUgdGhlIGxpbmtlciBnZW5lcmF0ZWQgc2VjdGlvbnMgYWxsIHRoZSB0aW1lIHNvIHRoYXQgdGhlCi0gICAgIHNwZWNpYWwgc3ltYm9scyBhcmUgY3JlYXRlZC4gICovCi0KLSAgaWYgKChzZGF0YSA9IGVsZl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgTElOS0VSX1NFQ1RJT05fU0RBVEEpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNkYXRhID0gcHBjX2VsZl9jcmVhdGVfbGlua2VyX3NlY3Rpb24gKGFiZmQsIGluZm8sIExJTktFUl9TRUNUSU9OX1NEQVRBKTsKLSAgICAgIGlmICghc2RhdGEpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIGlmICgoc2RhdGEyID0gZWxmX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBMSU5LRVJfU0VDVElPTl9TREFUQTIpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNkYXRhMiA9IHBwY19lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBMSU5LRVJfU0VDVElPTl9TREFUQTIpOwotICAgICAgaWYgKCFzZGF0YTIpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIHN5bV9oYXNoZXNfZW5kID0gc3ltX2hhc2hlcyArIHN5bXRhYl9oZHItPnNoX3NpemUvc2l6ZW9mKEVsZjMyX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHN5bV9oYXNoZXNfZW5kIC09IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICAvKiBJZiBhIHJlbG9jYXRpb24gcmVmZXJzIHRvIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgY3JlYXRlIHRoZSAuZ290LgotCSBUaGlzIHNob3dzIHVwIGluIHBhcnRpY3VsYXIgaW4gYW4gUl9QUENfQUREUjMyIGluIHRoZSBlYWJpCi0JIHN0YXJ0dXAgY29kZS4gICovCi0gICAgICBpZiAoaCAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCXsKLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JCWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQkgICAgICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGR5bm9iaiwgaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0JfQotCi0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQkvKiBHT1QxNiByZWxvY2F0aW9ucyAqLwotCWNhc2UgUl9QUENfR09UMTY6Ci0JY2FzZSBSX1BQQ19HT1QxNl9MTzoKLQljYXNlIFJfUFBDX0dPVDE2X0hJOgotCWNhc2UgUl9QUENfR09UMTZfSEE6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoc2dvdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCQllbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JICAgICAgJiYgKGggIT0gTlVMTCB8fCBpbmZvLT5zaGFyZWQpKQotCSAgICB7Ci0JICAgICAgc3JlbGdvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkgICAgICBpZiAoc3JlbGdvdCA9PSBOVUxMKQotCQl7Ci0JCSAgc3JlbGdvdCA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbGdvdCwKLQkJCQkJCSAgKFNFQ19BTExPQwotCQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCQkgICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsZ290LCAyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290LnJlZmNvdW50ID09IC0xKQotCQl7Ci0JCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgIGlmICghYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgLyogQWxsb2NhdGUgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCQkgIC8qIEFsbG9jYXRlIHJlbG9jYXRpb24gc3BhY2UuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JCSAgaC0+Z290LnJlZmNvdW50ID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJaC0+Z290LnJlZmNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgYSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGVudHJ5IGZvciBhIGxvY2FsIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGxvY2FsX2dvdF9yZWZjb3VudHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF9zaWduZWRfdm1hKTsKLQkJICBsb2NhbF9nb3RfcmVmY291bnRzID0gKGJmZF9zaWduZWRfdm1hICopCi0JCSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotCQkgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpID0gbG9jYWxfZ290X3JlZmNvdW50czsKLQkJICBtZW1zZXQgKGxvY2FsX2dvdF9yZWZjb3VudHMsIC0xLCBzaXplKTsKLQkJfQotCSAgICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA9PSAtMSkKLQkJewotCQkgIHNnb3QtPl9yYXdfc2l6ZSArPSA0OwotCi0JCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYSBSX1BQQ19SRUxBVElWRSByZWxvYyBzbyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAgZHluYW1pYyBsaW5rZXIgY2FuIGFkanVzdCB0aGlzIEdPVCBlbnRyeS4gICovCi0JCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkJICAgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JCSAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0gPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQlsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSsrOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIEluZGlyZWN0IC5zZGF0YSByZWxvY2F0aW9uICovCi0JY2FzZSBSX1BQQ19FTUJfU0RBSTE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgIlJfUFBDX0VNQl9TREFJMTYiKSk7Ci0JICAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoIWJmZF9lbGYzMl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgc2RhdGEsIGgsIHJlbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgYnJlYWs7Ci0KLQkvKiBJbmRpcmVjdCAuc2RhdGEyIHJlbG9jYXRpb24gKi8KLQljYXNlIFJfUFBDX0VNQl9TREEySTE2OgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgIlJfUFBDX0VNQl9TREEySTE2IikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoc3JlbGdvdCA9PSBOVUxMICYmIChoICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKSkKLQkgICAgewotCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICAgICAgaWYgKHNyZWxnb3QgPT0gTlVMTCkKLQkJewotCQkgIHNyZWxnb3QgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICBpZiAoc3JlbGdvdCA9PSBOVUxMCi0JCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxnb3QsCi0JCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJCSAgIHwgU0VDX0xPQUQKLQkJCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgc3JlbGdvdCwgMikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoIWJmZF9lbGYzMl9jcmVhdGVfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgc2RhdGEyLCBoLCByZWwpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BQQ19TREFSRUwxNjoKLQljYXNlIFJfUFBDX0VNQl9TREEyUkVMOgotCWNhc2UgUl9QUENfRU1CX1NEQTIxOgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiByZWxvY2F0aW9uICVzIGNhbm5vdCBiZSB1c2VkIHdoZW4gbWFraW5nIGEgc2hhcmVkIG9iamVjdCIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJcHBjX2VsZl9ob3d0b190YWJsZVsoaW50KUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pXS0+bmFtZSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfUFBDX1BMVDMyOgotCWNhc2UgUl9QUENfUExUUkVMMjQ6Ci0JY2FzZSBSX1BQQ19QTFQxNl9MTzoKLQljYXNlIFJfUFBDX1BMVDE2X0hJOgotCWNhc2UgUl9QUENfUExUMTZfSEE6Ci0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIlJlbG9jIHJlcXVpcmVzIGEgUExUIGVudHJ5XG4iKTsKLSNlbmRpZgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogSXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0byBoYXZlIGEgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgICAgICAgICAgICAgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwgc3ltYm9sLiAgKi8KLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHRoaXMgc3ltYm9sIGlzIG91dHB1dCBhcyBhIGR5bmFtaWMgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX2VsZjMyX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBpZiAoaC0+cGx0LnJlZmNvdW50ID09IC0xKQotCSAgICB7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgICAgICBoLT5wbHQucmVmY291bnQgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGgtPnBsdC5yZWZjb3VudCsrOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoZSBmb2xsb3dpbmcgcmVsb2NhdGlvbnMgZG9uJ3QgbmVlZCB0byBwcm9wYWdhdGUgdGhlCi0JICAgICByZWxvY2F0aW9uIGlmIGxpbmtpbmcgYSBzaGFyZWQgb2JqZWN0IHNpbmNlIHRoZXkgYXJlCi0JICAgICBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQljYXNlIFJfUFBDX1NFQ1RPRkY6Ci0JY2FzZSBSX1BQQ19TRUNUT0ZGX0xPOgotCWNhc2UgUl9QUENfU0VDVE9GRl9ISToKLQljYXNlIFJfUFBDX1NFQ1RPRkZfSEE6Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyByZWZlcnMgb25seSB0byBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgc2hhcmVkIGxpYnJhcnkgKi8KLQljYXNlIFJfUFBDX0xPQ0FMMjRQQzoKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHRoZSBDKysgb2JqZWN0IHZ0YWJsZSBoaWVyYXJjaHkuCi0JICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0JY2FzZSBSX1BQQ19HTlVfVlRJTkhFUklUOgotCSAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLQkgICAgIHVzZWQuICBSZWNvcmQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotCWNhc2UgUl9QUENfR05VX1ZURU5UUlk6Ci0JICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlCi0JICAgICByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYwotCSAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAgKi8KLQljYXNlIFJfUFBDX1JFTDI0OgotCWNhc2UgUl9QUENfUkVMMTQ6Ci0JY2FzZSBSX1BQQ19SRUwxNF9CUlRBS0VOOgotCWNhc2UgUl9QUENfUkVMMTRfQlJOVEFLRU46Ci0JY2FzZSBSX1BQQ19SRUwzMjoKLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0JZGVmYXVsdDoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLSNpZmRlZiBERUJVRwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfY2hlY2tfcmVsb2NzIG5lZWQgdG8gY3JlYXRlIHJlbG9jYXRpb24gZm9yICVzXG4iLAotCQkgICAgICAgKGggJiYgaC0+cm9vdC5yb290LnN0cmluZykgPyBoLT5yb290LnJvb3Quc3RyaW5nIDogIjx1bmtub3duPiIpOwotI2VuZGlmCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoYWJmZCwKLQkJCSAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIEJGRF9BU1NFUlQgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgICAgICYmIHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JCQkJCSBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICBzcmVsb2MgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCi0JCSAgICAgIHNyZWxvYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbmFtZSk7Ci0JCSAgICAgIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkKLQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCQkgICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JCQlmbGFncyB8PSBTRUNfQUxMT0MgfCBTRUNfTE9BRDsKLQkJICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHNyZWxvYywgZmxhZ3MpCi0JCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzcmVsb2MsIDIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzcmVsb2MtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCi0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCBoZXJlIGRvIHdoYXQgdGhlIG02OGsgYW5kIGkzODYKLQkJIGJhY2tlbmRzIGRvOiBpZiB0aGUgcmVsb2MgaXMgcGMtcmVsYXRpdmUsIHJlY29yZCBpdAotCQkgaW4gY2FzZSBpdCB0dXJucyBvdXQgdGhhdCB0aGUgcmVsb2MgaXMgdW5uZWNlc3NhcnkKLQkJIGJlY2F1c2UgdGhlIHN5bWJvbCBpcyBmb3JjZWQgbG9jYWwgYnkgdmVyc2lvbmluZyBvcgotCQkgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQmR5bmFtaWMuICBGb3J0dW5hdGVseSB0aGlzCi0JCSBjYXNlIGlzIG5vdCBmcmVxdWVudC4gICovCi0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgc2hvdWxkIGJlIG1hcmtlZCBhZ2FpbnN0IEdDIGZvciBhIGdpdmVuCi0gICByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLXBwY19lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLXsKLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfUFBDX0dOVV9WVElOSEVSSVQ6Ci0JY2FzZSBSX1BQQ19HTlVfVlRFTlRSWToKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLQkgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0JICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIShlbGZfYmFkX3N5bXRhYiAoYWJmZCkKLQkgICAgJiYgRUxGX1NUX0JJTkQgKHN5bS0+c3RfaW5mbykgIT0gU1RCX0xPQ0FMKQotCSAgJiYgISAoKHN5bS0+c3Rfc2huZHggPD0gMCB8fCBzeW0tPnN0X3NobmR4ID49IFNITl9MT1JFU0VSVkUpCi0JCSYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0JewotCSAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGJmZF9zaWduZWRfdm1hICpsb2NhbF9nb3RfcmVmY291bnRzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsLCAqcmVsZW5kOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9yZWZjb3VudHMgPSBlbGZfbG9jYWxfZ290X3JlZmNvdW50cyAoYWJmZCk7Ci0KLSAgcmVsZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9QUENfR09UMTY6Ci0gICAgICBjYXNlIFJfUFBDX0dPVDE2X0xPOgotICAgICAgY2FzZSBSX1BQQ19HT1QxNl9ISToKLSAgICAgIGNhc2UgUl9QUENfR09UMTZfSEE6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5nb3QucmVmY291bnQtLTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JICAgICAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0tLTsKLQkgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUl9QUENfUExUMzI6Ci0gICAgICBjYXNlIFJfUFBDX1BMVFJFTDI0OgotICAgICAgY2FzZSBSX1BQQ19QTFQxNl9MTzoKLSAgICAgIGNhc2UgUl9QUENfUExUMTZfSEk6Ci0gICAgICBjYXNlIFJfUFBDX1BMVDE2X0hBOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+cGx0LnJlZmNvdW50LS07Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgdXNlIGl0IHRvIHB1dCAuY29tbSBpdGVtcyBpbiAuc2JzcywgYW5kIG5vdCAuYnNzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9hZGRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIHN5bSwgbmFtZXAsIGZsYWdzcCwgc2VjcCwgdmFscCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICBjb25zdCBjaGFyICoqbmFtZXA7Ci0gICAgIGZsYWd3b3JkICpmbGFnc3A7Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYmZkX3ZtYSAqdmFscDsKLXsKLSAgaWYgKHN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTgotICAgICAgJiYgIWluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3ltLT5zdF9zaXplIDw9IChiZmRfdm1hKSBiZmRfZ2V0X2dwX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtRyBubiBieXRlcyBhcmUgYXV0b21hdGljYWxseQotCSBwdXQgaW50byAuc2RhdGEuICAqLwotICAgICAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKnNkYXRhCi0JPSBwcGNfZWxmX2NyZWF0ZV9saW5rZXJfc2VjdGlvbiAoYWJmZCwgaW5mbywgTElOS0VSX1NFQ1RJT05fU0RBVEEpOwotCi0gICAgICBpZiAoIXNkYXRhLT5ic3Nfc2VjdGlvbikKLQl7Ci0JICAvKiBXZSBkb24ndCBnbyB0aHJvdWdoIGJmZF9tYWtlX3NlY3Rpb24sIGJlY2F1c2Ugd2UgZG9uJ3QKLSAgICAgICAgICAgICB3YW50IHRvIGF0dGFjaCB0aGlzIGNvbW1vbiBzZWN0aW9uIHRvIERZTk9CSi4gIFRoZSBsaW5rZXIKLSAgICAgICAgICAgICB3aWxsIG1vdmUgdGhlIHN5bWJvbHMgdG8gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBzZWN0aW9uCi0gICAgICAgICAgICAgd2hlbiBpdCBkZWZpbmVzIGNvbW1vbiBzeW1ib2xzLiAgKi8KLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbiA9ICgoYXNlY3Rpb24gKikKLQkJCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSkpOwotCSAgaWYgKHNkYXRhLT5ic3Nfc2VjdGlvbiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPm5hbWUgPSBzZGF0YS0+YnNzX25hbWU7Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPmZsYWdzID0gU0VDX0lTX0NPTU1PTjsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0JICBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbCA9Ci0JICAgIChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2xfcHRyX3B0ciA9Ci0JICAgIChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wgKikpOwotCSAgaWYgKHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sID09IE5VTEwKLQkgICAgICB8fCBzZGF0YS0+YnNzX3NlY3Rpb24tPnN5bWJvbF9wdHJfcHRyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sLT5uYW1lID0gc2RhdGEtPmJzc19uYW1lOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wtPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2wtPnNlY3Rpb24gPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0JICAqc2RhdGEtPmJzc19zZWN0aW9uLT5zeW1ib2xfcHRyX3B0ciA9IHNkYXRhLT5ic3Nfc2VjdGlvbi0+c3ltYm9sOwotCX0KLQotICAgICAgKnNlY3AgPSBzZGF0YS0+YnNzX3NlY3Rpb247Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIEZpbmlzaCB1cCBkeW5hbWljIHN5bWJvbCBoYW5kbGluZy4gIFdlIHNldCB0aGUgY29udGVudHMgb2YgdmFyaW91cwotICAgZHluYW1pYyBzZWN0aW9ucyBoZXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY19lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wgY2FsbGVkIGZvciAlcyIsCi0JICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwpOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0gICAgICBiZmRfdm1hIHJlbG9jX2luZGV4OwotCi0jaWZkZWYgREVCVUcKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiwgcGx0X29mZnNldCA9ICVkIiwgaC0+cGx0Lm9mZnNldCk7Ci0jZW5kaWYKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFNldAotICAgICAgICAgaXQgdXAuICAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBmaWxsIGluIHRoZSAucGx0LiAgVGhlIHBwYyBkeW5hbWljIGxpbmtlcgotCSB3aWxsIGZpbGwgaXQgaW4uICAqLwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9QUENfSk1QX1NMT1QpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0KLSAgICAgIHJlbG9jX2luZGV4ID0gKGgtPnBsdC5vZmZzZXQgLSBQTFRfSU5JVElBTF9FTlRSWV9TSVpFKSAvIFBMVF9TTE9UX1NJWkU7Ci0gICAgICBpZiAocmVsb2NfaW5kZXggPiBQTFRfTlVNX1NJTkdMRV9FTlRSSUVTKQotCXJlbG9jX2luZGV4IC09IChyZWxvY19pbmRleCAtIFBMVF9OVU1fU0lOR0xFX0VOVFJJRVMpIC8gMjsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIHJlbG9jX2luZGV4KSk7Ci0KLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogTWFyayB0aGUgc3ltYm9sIGFzIHVuZGVmaW5lZCwgcmF0aGVyIHRoYW4gYXMgZGVmaW5lZCBpbgotCSAgICAgdGhlIC5wbHQgc2VjdGlvbi4gIExlYXZlIHRoZSB2YWx1ZSBhbG9uZS4gICovCi0JICBzeW0tPnN0X3NobmR4ID0gU0hOX1VOREVGOwotCX0KLSAgICB9Ci0KLSAgaWYgKGgtPmdvdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZ290OwotICAgICAgYXNlY3Rpb24gKnNyZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgU2V0IGl0Ci0gICAgICAgICB1cC4gICovCi0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIHJlbGEucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgICArIChoLT5nb3Qub2Zmc2V0ICZ+IDEpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIC1Cc3ltYm9saWMgbGluaywgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZAotCSBsb2NhbGx5LCB3ZSBqdXN0IHdhbnQgdG8gZW1pdCBhIFJFTEFUSVZFIHJlbG9jLiAgVGhlIGVudHJ5IGluCi0JIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgaW4KLQkgdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1BQQ19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEJGRF9BU1NFUlQoKGgtPmdvdC5vZmZzZXQgJiAxKSA9PSAwKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfUFBDX0dMT0JfREFUKTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLQotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLCBjb3B5Iik7Ci0jZW5kaWYKLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIGlmIChoLT5zaXplIDw9IGVsZl9ncF9zaXplIChkeW5vYmopKQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAgICIucmVsYS5zYnNzIik7Ci0gICAgICBlbHNlCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkJCSAgICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfUFBDX0NPUFkpOwotICAgICAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0gICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGYzMl9FeHRlcm5hbF9SZWxhICopIHMtPmNvbnRlbnRzCi0JCQkJICArIHMtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3MtPnJlbG9jX2NvdW50OwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICAvKiBNYXJrIHNvbWUgc3BlY2lhbGx5IGRlZmluZWQgc3ltYm9scyBhcyBhYnNvbHV0ZS4gICovCi0gIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfRFlOQU1JQyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9QUk9DRURVUkVfTElOS0FHRV9UQUJMRV8iKSA9PSAwKQotICAgIHN5bS0+c3Rfc2huZHggPSBTSE5fQUJTOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGFzZWN0aW9uICpzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInBwY19lbGZfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgY2FsbGVkXG4iKTsKLSNlbmRpZgotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjMyX0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGJvb2xlYW4gc2l6ZTsKLQotCSAgYmZkX2VsZjMyX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOiAgIG5hbWUgPSAiLnBsdCI7CSAgc2l6ZSA9IGZhbHNlOyBicmVhazsKLQkgICAgY2FzZSBEVF9QTFRSRUxTWjogbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gdHJ1ZTsgIGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogICBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CSAgICAgIG5hbWUgPSBOVUxMOwkgIHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG5hbWUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzOwotCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBpZiAocyA9PSBOVUxMKQotCQlkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKCEgc2l6ZSkKLQkJICAgIGR5bi5kX3VuLmRfcHRyID0gcy0+dm1hOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCQkJZHluLmRfdW4uZF92YWwgPSBzLT5fY29va2VkX3NpemU7Ci0JCSAgICAgIGVsc2UKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X3Jhd19zaXplOwotCQkgICAgfQotCQl9Ci0JICAgICAgYmZkX2VsZjMyX3N3YXBfZHluX291dCAob3V0cHV0X2JmZCwgJmR5biwgZHluY29uKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQWRkIGEgYmxybCBpbnN0cnVjdGlvbiBhdCBfR0xPQkFMX09GRlNFVF9UQUJMRV8tNCBzbyB0aGF0IGEgZnVuY3Rpb24gY2FuCi0gICAgIGVhc2lseSBmaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBfR0xPQkFMX09GRlNFVF9UQUJMRV8uICAqLwotICBpZiAoc2dvdCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpjb250ZW50cyA9IHNnb3QtPmNvbnRlbnRzOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0ZTgwMDAyMSAvKiBibHJsICovLCBjb250ZW50cyk7Ci0KLSAgICAgIGlmIChzZHluID09IE5VTEwpCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIGNvbnRlbnRzKzQpOwotICAgICAgZWxzZQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgICBzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2R5bi0+b3V0cHV0X29mZnNldCwKLQkJICAgIGNvbnRlbnRzKzQpOwotCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotICAgIH0KLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZHluc3ltOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgICAgIGludCBtYXhkaW5keCA9IDA7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQotICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOwotCi0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLSAgICAgIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGludCBpbmR4LCBkaW5keDsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgZGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keDsKLQkgIGlmIChkaW5keCA+IDApCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUKGluZHggPiAwKTsKLQkgICAgICBCRkRfQVNTRVJUKGRpbmR4ID4gMCk7Ci0KLQkgICAgICBpZiAoZGluZHggPiBtYXhkaW5keCkKLQkJbWF4ZGluZHggPSBkaW5keDsKLQotCSAgICAgIHN5bS5zdF9zaG5keCA9IGluZHg7Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfb3V0IChvdXRwdXRfYmZkLCAmc3ltLAotCQkJCQkgKFBUUikgKCgoRWxmMzJfRXh0ZXJuYWxfU3ltICopCi0JCQkJCQkgc2R5bnN5bS0+Y29udGVudHMpCi0JCQkJCQkrIGRpbmR4KSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFNldCB0aGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgb3V0cHV0IC5keW5zeW0gc2VjdGlvbiB0byB0aGUKLSAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgKi8KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNkeW5zeW0tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfaW5mbyA9Ci0JbWF4ZGluZHggKyAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogVGhlIFJFTE9DQVRFX1NFQ1RJT04gZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFTEYgYmFja2VuZCBsaW5rZXIKLSAgIHRvIGhhbmRsZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGEgc2VjdGlvbi4KLQotICAgVGhlIHJlbG9jcyBhcmUgYWx3YXlzIHBhc3NlZCBhcyBSZWxhIHN0cnVjdHVyZXM7IGlmIHRoZSBzZWN0aW9uCi0gICBhY3R1YWxseSB1c2VzIFJlbCBzdHJ1Y3R1cmVzLCB0aGUgcl9hZGRlbmQgZmllbGQgd2lsbCBhbHdheXMgYmUKLSAgIHplcm8uCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGFkanVzdCB0aGUgc2VjdGlvbiBjb250ZW50cyBhcwotICAgbmVjZXNzYXJ5LCBhbmQgKGlmIHVzaW5nIFJlbGEgcmVsb2NzIGFuZCBnZW5lcmF0aW5nIGEKLSAgIHJlbG9jYXRlYWJsZSBvdXRwdXQgZmlsZSkgYWRqdXN0aW5nIHRoZSByZWxvYyBhZGRlbmQgYXMKLSAgIG5lY2Vzc2FyeS4KLQotICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IHNldHRpbmcgdGhlIHJlbG9jCi0gICBhZGRyZXNzIG9yIHRoZSByZWxvYyBzeW1ib2wgaW5kZXguCi0KLSAgIExPQ0FMX1NZTVMgaXMgYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluIGxvY2FsIHN5bWJvbHMuCi0KLSAgIExPQ0FMX1NFQ1RJT05TIGlzIGFuIGFycmF5IGdpdmluZyB0aGUgc2VjdGlvbiBpbiB0aGUgaW5wdXQgZmlsZQotICAgY29ycmVzcG9uZGluZyB0byB0aGUgc3Rfc2huZHggZmllbGQgb2YgZWFjaCBsb2NhbCBzeW1ib2wuCi0KLSAgIFRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIGdsb2JhbCBzeW1ib2xzIGNhbiBiZSBmb3VuZAotICAgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhpcyBmdW5jdGlvbiBtdXN0IGhhbmRsZQotICAgU1RCX0xPQ0FML1NUVF9TRUNUSU9OIHN5bWJvbHMgc3BlY2lhbGx5LiAgVGhlIG91dHB1dCBzeW1ib2wgaXMKLSAgIGdvaW5nIHRvIGJlIHRoZSBzZWN0aW9uIHN5bWJvbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQKLSAgIHNlY3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGFkZGVuZCBtdXN0IGJlIGFkanVzdGVkCi0gICBhY2NvcmRpbmdseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gKG91dHB1dF9iZmQsIGluZm8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcgkJICA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotICBiZmQgKmR5bm9iagkJCQkgID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIGVsZl9saW5rZXJfc2VjdGlvbl90ICpzZGF0YQkJICA9IChkeW5vYmopID8gZWxmX2xpbmtlcl9zZWN0aW9uIChkeW5vYmosIExJTktFUl9TRUNUSU9OX1NEQVRBKSAgOiBOVUxMOwotICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqc2RhdGEyCQkgID0gKGR5bm9iaikgPyBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgTElOS0VSX1NFQ1RJT05fU0RBVEEyKSA6IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWwJCSAgPSByZWxvY3M7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxlbmQJCSAgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgYXNlY3Rpb24gKnNyZWxvYwkJCSAgPSBOVUxMOwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNnb3Q7Ci0gIGJmZF92bWEgKmxvY2FsX2dvdF9vZmZzZXRzOwotICBib29sZWFuIHJldAkJCQkgID0gdHJ1ZTsKLSAgbG9uZyBpbnNuOwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAicHBjX2VsZl9yZWxvY2F0ZV9zZWN0aW9uIGNhbGxlZCBmb3IgJXMgc2VjdGlvbiAlcywgJWxkIHJlbG9jYXRpb25zJXNcbiIsCi0JICAgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkgICBiZmRfc2VjdGlvbl9uYW1lKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiksCi0JICAgKGxvbmcpaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQsCi0JICAgKGluZm8tPnJlbG9jYXRlYWJsZSkgPyAiIChyZWxvY2F0YWJsZSkiIDogIiIpOwotI2VuZGlmCi0KLSAgaWYgKCFwcGNfZWxmX2hvd3RvX3RhYmxlWyBSX1BQQ19BRERSMzIgXSkJLyogSW5pdGlhbGl6ZSBob3d0byB0YWJsZSBpZiBuZWVkZWQgKi8KLSAgICBwcGNfZWxmX2hvd3RvX2luaXQgKCk7Ci0KLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgc3BsdCA9IHNnb3QgPSBOVUxMOwotICBpZiAoZHlub2JqICE9IE5VTEwpCi0gICAgewotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICB9Ci0KLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfcHBjX3JlbG9jX3R5cGUgcl90eXBlCT0gKGVudW0gZWxmX3BwY19yZWxvY190eXBlKUVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgYmZkX3ZtYSBvZmZzZXQJCQk9IHJlbC0+cl9vZmZzZXQ7Ci0gICAgICBiZmRfdm1hIGFkZGVuZAkJCT0gcmVsLT5yX2FkZGVuZDsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByCQk9IGJmZF9yZWxvY19vdGhlcjsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bQkJPSAoRWxmX0ludGVybmFsX1N5bSAqKTA7Ci0gICAgICBhc2VjdGlvbiAqc2VjCQkJPSAoYXNlY3Rpb24gKikwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgJPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikwOwotICAgICAgY29uc3QgY2hhciAqc3ltX25hbWUJCT0gKGNvbnN0IGNoYXIgKikwOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotCi0gICAgICAvKiBVbmtub3duIHJlbG9jYXRpb24gaGFuZGxpbmcgKi8KLSAgICAgIGlmICgodW5zaWduZWQpcl90eXBlID49ICh1bnNpZ25lZClSX1BQQ19tYXggfHwgIXBwY19lbGZfaG93dG9fdGFibGVbKGludClyX3R5cGVdKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlKTsKLQotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXQgPSBmYWxzZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaG93dG8gPSBwcGNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpcl90eXBlXTsKLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoKHVuc2lnbmVkKUVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIGFkZGVuZCA9IHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiXHR0eXBlID0gJXMgKCVkKSwgc3ltYm9sIGluZGV4ID0gJWxkLCBvZmZzZXQgPSAlbGQsIGFkZGVuZCA9ICVsZFxuIiwKLQkJICAgaG93dG8tPm5hbWUsCi0JCSAgIChpbnQpcl90eXBlLAotCQkgICByX3N5bW5keCwKLQkJICAgKGxvbmcpb2Zmc2V0LAotCQkgICAobG9uZylhZGRlbmQpOwotI2VuZGlmCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgc3ltX25hbWUgPSAiPGxvY2FsIHN5bWJvbD4iOwotCi0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIHN5bV9uYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX1BQQ19QTFQzMgotCQkgICAmJiBoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJICB8fCAocl90eXBlID09IFJfUFBDX0xPQ0FMMjRQQwotCQkgICAgICAmJiBzZWMtPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JCSAgfHwgKChyX3R5cGUgPT0gUl9QUENfR09UMTYKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19HT1QxNl9MTwotCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX0dPVDE2X0hJCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9QUENfR09UMTZfSEEpCi0JCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgICAgICYmICghIGluZm8tPnNoYXJlZAotCQkJICB8fCAoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCQkgICAgICAmJiAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIyNAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfTE8KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfQUREUjE2X0hBCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTQKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0FERFIxNF9CUlRBS0VOCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19BRERSMTRfQlJOVEFLRU4KLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1BMVFJFTDI0Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19DT1BZCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19HTE9CX0RBVAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfSk1QX1NMT1QKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMzIKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1VBRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX1NEQVJFTDE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIzMgotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9OQUREUjE2X0xPCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTkFERFIxNl9ISQotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX05BRERSMTZfSEEKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREFJMTYKLQkJCSAgfHwgcl90eXBlID09IFJfUFBDX0VNQl9TREEySTE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfU0RBMlJFTAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1NEQTIxCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfTVJLUkVGCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1BQQ19FTUJfQklUX0ZMRAotCQkJICB8fCByX3R5cGUgPT0gUl9QUENfRU1CX1JFTFNEQQotCQkJICB8fCAoKHJfdHlwZSA9PSBSX1BQQ19SRUwyNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwzMgotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNAotCQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1BQQ19SRUwxNF9CUlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTDE0X0JSTlRBS0VOCi0JCQkgICAgICAgfHwgcl90eXBlID09IFJfUFBDX1JFTEFUSVZFKQotCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKShpbmZvLAotCQkJCQkJCSBoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkJCSBpbnB1dF9iZmQsCi0JCQkJCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkJIHJlbC0+cl9vZmZzZXQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZSAlZCBmb3Igc3ltYm9sICVzIiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJIChpbnQpcl90eXBlLCBzeW1fbmFtZSk7Ci0KLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgbmVlZCBubyBzcGVjaWFsIHByb2Nlc3NpbmcuICAqLwotCWNhc2UgKGludClSX1BQQ19MT0NBTDI0UEM6Ci0JICAvKiBJdCBtYWtlcyBubyBzZW5zZSB0byBwb2ludCBhIGxvY2FsIHJlbG9jYXRpb24KLQkgICAgIGF0IGEgc3ltYm9sIG5vdCBpbiB0aGlzIG9iamVjdC4gICovCi0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICAgICYmIHNlYy0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKSAoaW5mbywKLQkJCQkJCQkgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCQkJICBpbnB1dF9iZmQsCi0JCQkJCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJCQkJCSAgcmVsLT5yX29mZnNldCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBSZWxvY2F0aW9ucyB0aGF0IG1heSBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgaWYgdGhpcyBpcyBhIHNoYXJlZAotICAgICAgICAgICBvYmplY3QuICAqLwotCWNhc2UgKGludClSX1BQQ19SRUwyNDoKLQljYXNlIChpbnQpUl9QUENfUkVMMzI6Ci0JY2FzZSAoaW50KVJfUFBDX1JFTDE0OgotCSAgLyogSWYgdGhlc2UgcmVsb2NhdGlvbnMgYXJlIG5vdCB0byBhIG5hbWVkIHN5bWJvbCwgdGhleSBjYW4gYmUKLQkgICAgIGhhbmRsZWQgcmlnaHQgaGVyZSwgbm8gbmVlZCB0byBib3RoZXIgdGhlIGR5bmFtaWMgbGlua2VyLiAgKi8KLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCSAgICBicmVhazsKLQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCS8qIFJlbG9jYXRpb25zIHRoYXQgYWx3YXlzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCBpZiB0aGlzIGlzIGEgc2hhcmVkCi0gICAgICAgICAgIG9iamVjdC4gICovCi0JY2FzZSAoaW50KVJfUFBDX05PTkU6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIzMjoKLQljYXNlIChpbnQpUl9QUENfQUREUjI0OgotCWNhc2UgKGludClSX1BQQ19BRERSMTY6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNl9MTzoKLQljYXNlIChpbnQpUl9QUENfQUREUjE2X0hJOgotCWNhc2UgKGludClSX1BQQ19BRERSMTZfSEE6Ci0JY2FzZSAoaW50KVJfUFBDX0FERFIxNDoKLQljYXNlIChpbnQpUl9QUENfVUFERFIzMjoKLQljYXNlIChpbnQpUl9QUENfVUFERFIxNjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0jaWZkZWYgREVCVUcKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24gbmVlZCB0byBjcmVhdGUgcmVsb2NhdGlvbiBmb3IgJXNcbiIsCi0JCSAgICAgICAoaCAmJiBoLT5yb290LnJvb3Quc3RyaW5nKSA/IGgtPnJvb3Qucm9vdC5zdHJpbmcgOiAiPHVua25vd24+Iik7Ci0jZW5kaWYKLQotCSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHRoZXNlIHJlbG9jYXRpb25zCi0gICAgICAgICAgICAgICAgIGFyZSBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgcmVzb2x2ZWQgYXQgcnVuCi0gICAgICAgICAgICAgICAgIHRpbWUuICAqLwotCi0JICAgICAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQotCQkgIG5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJICAoaW5wdXRfYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSAgIGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLAotCQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIEJGRF9BU1NFUlQgKHNyZWxvYyAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc2tpcCA9IGZhbHNlOwotCi0JICAgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gcmVsLT5yX29mZnNldDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfdm1hIG9mZjsKLQotCQkgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJICBpbnB1dF9zZWN0aW9uLAotCQkJICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgcmVsLT5yX29mZnNldCkpOwotCQkgIGlmIChvZmYgPT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcCA9IHRydWU7Ci0JCSAgb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCQl9Ci0KLQkgICAgICBvdXRyZWwucl9vZmZzZXQgKz0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLQkgICAgICBpZiAoc2tpcCkKLQkJbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkgICAgICAvKiBoLT5keW5pbmR4IG1heSBiZSAtMSBpZiB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0gICAgICAgICAgICAgICAgIGJlY29tZSBsb2NhbC4gICovCi0JICAgICAgZWxzZSBpZiAoaCAhPSBOVUxMCi0JCSAgICAgICAmJiAoKCEgaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkJewotCQkgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIHJfdHlwZSk7Ci0JCSAgb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChyX3R5cGUgPT0gUl9QUENfQUREUjMyKQotCQkgICAgewotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1BQQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbG9uZyBpbmR4OwotCi0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCSAgICAgIHx8IChoLT5yb290LnR5cGUKLQkJCQkJICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkJfQotCQkgICAgICBpZiAoc2VjICE9IE5VTEwgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpKQotCQkJaW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkJCSAgaW5keCA9IGVsZl9zZWN0aW9uX2RhdGEgKG9zZWMpLT5keW5pbmR4OwotCQkJICBCRkRfQVNTRVJUKGluZHggPiAwKTsKLSNpZmRlZiBERUJVRwotCQkJICBpZiAoaW5keCA8PSAwKQotCQkJICAgIHsKLQkJCSAgICAgIHByaW50ZigiaW5keD0lZCBzZWN0aW9uPSVzIGZsYWdzPSUwOHggbmFtZT0lc1xuIiwKLQkJCQkgICAgIGluZHgsIG9zZWMtPm5hbWUsIG9zZWMtPmZsYWdzLAotCQkJCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JCQkgICAgfQotI2VuZGlmCi0JCQl9Ci0KLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgIHNyZWxvYy0+Y29udGVudHMpCi0JCQkJCSAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JICAgICAgKytzcmVsb2MtPnJlbG9jX2NvdW50OwotCi0JICAgICAgLyogVGhpcyByZWxvYyB3aWxsIGJlIGNvbXB1dGVkIGF0IHJ1bnRpbWUsIHNvIHRoZXJlJ3Mgbm8KLSAgICAgICAgICAgICAgICAgbmVlZCB0byBkbyBhbnl0aGluZyBub3csIHVubGVzcyB0aGlzIGlzIGEgUkVMQVRJVkUKLSAgICAgICAgICAgICAgICAgcmVsb2MgaW4gYW4gdW5hbGxvY2F0ZWQgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKHNraXAKLQkJICB8fCAoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkJICB8fCBFTEYzMl9SX1RZUEUgKG91dHJlbC5yX2luZm8pICE9IFJfUFBDX1JFTEFUSVZFKQotCQljb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBBcml0aG1ldGljIGFkanVzdCByZWxvY2F0aW9ucyB0aGF0IGFyZW4ndCBnb2luZyBpbnRvIGEKLQkgICAgIHNoYXJlZCBvYmplY3QuICAqLwotCSAgaWYgKHJfdHlwZSA9PSBSX1BQQ19BRERSMTZfSEEKLQkgICAgICAvKiBJdCdzIGp1c3QgcG9zc2libGUgdGhhdCB0aGlzIHN5bWJvbCBpcyBhIHdlYWsgc3ltYm9sCi0JCSB0aGF0J3Mgbm90IGFjdHVhbGx5IGRlZmluZWQgYW55d2hlcmUuIEluIHRoYXQgY2FzZSwKLQkJICdzZWMnIHdvdWxkIGJlIE5VTEwsIGFuZCB3ZSBzaG91bGQgbGVhdmUgdGhlIHN5bWJvbAotCQkgYWxvbmUgKGl0IHdpbGwgYmUgc2V0IHRvIHplcm8gZWxzZXdoZXJlIGluIHRoZSBsaW5rKS4gICovCi0JICAgICAgJiYgc2VjICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhZGRlbmQgKz0gKChyZWxvY2F0aW9uICsgYWRkZW5kKSAmIDB4ODAwMCkgPDwgMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkvKiBicmFuY2ggdGFrZW4gcHJlZGljdGlvbiByZWxvY2F0aW9ucyAqLwotCWNhc2UgKGludClSX1BQQ19BRERSMTRfQlJUQUtFTjoKLQljYXNlIChpbnQpUl9QUENfUkVMMTRfQlJUQUtFTjoKLQkgIGluc24gPSBiZmRfZ2V0XzMyIChvdXRwdXRfYmZkLCBjb250ZW50cyArIG9mZnNldCk7Ci0JICBpZiAoKHJlbG9jYXRpb24gLSBvZmZzZXQpICYgMHg4MDAwKQotCSAgICBpbnNuICY9IH5CUkFOQ0hfUFJFRElDVF9CSVQ7Ci0JICBlbHNlCi0JICAgIGluc24gfD0gQlJBTkNIX1BSRURJQ1RfQklUOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgYnJlYWs7Ci0KLQkvKiBicmFuY2ggbm90IHRha2VuIHByZWRpY2l0aW9uIHJlbG9jYXRpb25zICovCi0JY2FzZSAoaW50KVJfUFBDX0FERFIxNF9CUk5UQUtFTjoKLQljYXNlIChpbnQpUl9QUENfUkVMMTRfQlJOVEFLRU46Ci0JICBpbnNuID0gYmZkX2dldF8zMiAob3V0cHV0X2JmZCwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgaWYgKChyZWxvY2F0aW9uIC0gb2Zmc2V0KSAmIDB4ODAwMCkKLQkgICAgaW5zbiB8PSBCUkFOQ0hfUFJFRElDVF9CSVQ7Ci0JICBlbHNlCi0JICAgIGluc24gJj0gfkJSQU5DSF9QUkVESUNUX0JJVDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24sIGNvbnRlbnRzICsgb2Zmc2V0KTsKLQkgIGJyZWFrOwotCi0JLyogR09UMTYgcmVsb2NhdGlvbnMgKi8KLQljYXNlIChpbnQpUl9QUENfR09UMTY6Ci0JY2FzZSAoaW50KVJfUFBDX0dPVDE2X0xPOgotCWNhc2UgKGludClSX1BQQ19HT1QxNl9ISToKLQljYXNlIChpbnQpUl9QUENfR09UMTZfSEE6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlIGdsb2JhbAotICAgICAgICAgICAgIG9mZnNldCB0YWJsZS4gICovCi0JICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCi0JICBpZiAoaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBvZmYgPSBoLT5nb3Qub2Zmc2V0OwotCSAgICAgIEJGRF9BU1NFUlQgKG9mZiAhPSAoYmZkX3ZtYSkgLTEpOwotCi0JICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICB8fCAoaW5mby0+c2hhcmVkCi0JCSAgICAgICYmIChpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSBzdGF0aWMgbGluaywgb3IgaXQgaXMgYQotICAgICAgICAgICAgICAgICAgICAgLUJzeW1ib2xpYyBsaW5rIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgIGxvY2FsbHkuICBXZSBtdXN0IGluaXRpYWxpemUgdGhpcyBlbnRyeSBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QKLSAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUgbGVhc3QKLSAgICAgICAgICAgICAgICAgICAgIHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIDQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgQkZEX0FTU0VSVCAobG9jYWxfZ290X29mZnNldHMgIT0gTlVMTAotCQkJICAmJiBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF0gIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIG9mZiA9IGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XTsKLQotCSAgICAgIC8qIFRoZSBvZmZzZXQgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiA0LiAgV2UgdXNlCi0JCSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHJlY29yZCB3aGV0aGVyIHdlIGhhdmUKLQkJIGFscmVhZHkgcHJvY2Vzc2VkIHRoaXMgZW50cnkuICAqLwotCSAgICAgIGlmICgob2ZmICYgMSkgIT0gMCkKLQkJb2ZmICY9IH4xOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHJlbG9jYXRpb24sIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQotCQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzZWN0aW9uICpzcmVsZ290OwotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIFJfUFBDX1JFTEFUSVZFIHJlbG9jCi0JCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1BQQ19SRUxBVElWRSk7Ci0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb247Ci0JCSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkJICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCQkgICsgc3JlbGdvdC0+cmVsb2NfY291bnQpKTsKLQkJICAgICAgKytzcmVsZ290LT5yZWxvY19jb3VudDsKLQkJICAgIH0KLQotCQkgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSB8PSAxOwotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIDQ7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JLyogSW5kaXJlY3QgLnNkYXRhIHJlbG9jYXRpb24gKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX1NEQUkxNjoKLQkgIEJGRF9BU1NFUlQgKHNkYXRhICE9IE5VTEwpOwotCSAgcmVsb2NhdGlvbiA9IGJmZF9lbGYzMl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLAotCQkJCQkJCQlzZGF0YSwgaCwgcmVsb2NhdGlvbiwgcmVsLAotCQkJCQkJCQlSX1BQQ19SRUxBVElWRSk7Ci0JICBicmVhazsKLQotCS8qIEluZGlyZWN0IC5zZGF0YTIgcmVsb2NhdGlvbiAqLwotCWNhc2UgKGludClSX1BQQ19FTUJfU0RBMkkxNjoKLQkgIEJGRF9BU1NFUlQgKHNkYXRhMiAhPSBOVUxMKTsKLQkgIHJlbG9jYXRpb24gPSBiZmRfZWxmMzJfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gKG91dHB1dF9iZmQsIGlucHV0X2JmZCwgaW5mbywKLQkJCQkJCQkJc2RhdGEyLCBoLCByZWxvY2F0aW9uLCByZWwsCi0JCQkJCQkJCVJfUFBDX1JFTEFUSVZFKTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIHRoZSBUT0MxNiByZWxvYy4gIFdlIHdhbnQgdG8gdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoZSAuZ290Ci0JICAgc2VjdGlvbiwgbm90IHRoZSBhY3R1YWwgVk1BLiAgVGhpcyBpcyBhcHByb3ByaWF0ZSB3aGVuIGdlbmVyYXRpbmcKLQkgICBhbiBlbWJlZGRlZCBFTEYgb2JqZWN0LCBmb3Igd2hpY2ggdGhlIC5nb3Qgc2VjdGlvbiBhY3RzIGxpa2UgdGhlCi0JICAgQUlYIC50b2Mgc2VjdGlvbi4gICovCi0JY2FzZSAoaW50KVJfUFBDX1RPQzE2OgkJCS8qIHBob255IEdPVDE2IHJlbG9jYXRpb25zICovCi0JICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICBCRkRfQVNTRVJUIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykKLQkJICAgICAgfHwgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwgIi5nb3QiKSA9PSAwCi0JCSAgICAgIHx8IHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksICIuY2dvdCIpID09IDApCi0KLQkgIGFkZGVuZCAtPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZWMtPm91dHB1dF9vZmZzZXQgKyAweDgwMDA7Ci0JICBicmVhazsKLQotCWNhc2UgKGludClSX1BQQ19QTFRSRUwyNDoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0JICBCRkRfQVNTRVJUIChoICE9IE5VTEwpOwotCi0JICBpZiAoaC0+cGx0Lm9mZnNldCA9PSAoYmZkX3ZtYSkgLTEKLQkgICAgICB8fCBzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBXZSBkaWRuJ3QgbWFrZSBhIFBMVCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICBUaGlzCi0gICAgICAgICAgICAgICAgIGhhcHBlbnMgd2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgUElDIGNvZGUsIG9yIHdoZW4KLSAgICAgICAgICAgICAgICAgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgcmVsb2NhdGlvbiA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJCSsgaC0+cGx0Lm9mZnNldCk7Ci0gCSAgYnJlYWs7Ci0KLQkvKiByZWxvY2F0ZSBhZ2FpbnN0IF9TREFfQkFTRV8gKi8KLQljYXNlIChpbnQpUl9QUENfU0RBUkVMMTY6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgICAgQkZEX0FTU0VSVCAoc2VjICE9IChhc2VjdGlvbiAqKTApOwotCSAgICBuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhIikgIT0gMAotCQkmJiBzdHJjbXAgKG5hbWUsICIuc2JzcyIpICE9IDApCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIiksCi0JCQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJICAgICAgIHN5bV9uYW1lLAotCQkJCSAgICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAotCQkJCSAgICAgICBuYW1lKTsKLQkgICAgICB9Ci0JICAgIGFkZGVuZCAtPSAoc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgIH0KLQkgIGJyZWFrOwotCi0KLQkvKiByZWxvY2F0ZSBhZ2FpbnN0IF9TREEyX0JBU0VfICovCi0JY2FzZSAoaW50KVJfUFBDX0VNQl9TREEyUkVMOgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YTIiKSAhPSAwICYmIHN0cmNtcCAobmFtZSwgIi5zYnNzMiIpICE9IDApCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIiksCi0JCQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJICAgICAgIHN5bV9uYW1lLAotCQkJCSAgICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAotCQkJCSAgICAgICBuYW1lKTsKLQkJCi0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlyZXQgPSBmYWxzZTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICBhZGRlbmQgLT0gKHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNkYXRhMi0+c3ltX2hhc2gtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICB9Ci0JICBicmVhazsKLQotCi0JLyogcmVsb2NhdGUgYWdhaW5zdCBlaXRoZXIgX1NEQV9CQVNFXywgX1NEQTJfQkFTRV8sIG9yIDAgKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX1NEQTIxOgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU0RBOgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICBpbnQgcmVnOwotCi0JICAgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMtPm91dHB1dF9zZWN0aW9uKTsKLQkgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotCSAgICAgIHsKLQkJcmVnID0gMTM7Ci0JCWFkZGVuZCAtPSAoc2RhdGEtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICArIHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHNkYXRhLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNkYXRhMiIpID09IDAgfHwgc3RyY21wIChuYW1lLCAiLnNic3MyIikgPT0gMCkKLQkgICAgICB7Ci0JCXJlZyA9IDI7Ci0JCWFkZGVuZCAtPSAoc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJICAgKyBzZGF0YTItPnN5bV9oYXNoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgc2RhdGEyLT5zeW1faGFzaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgICB9Ci0KLQkgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLlBQQy5FTUIuc2RhdGEwIikgPT0gMCB8fCBzdHJjbXAgKG5hbWUsICIuUFBDLkVNQi5zYnNzMCIpID09IDApCi0JICAgICAgewotCQlyZWcgPSAwOwotCSAgICAgIH0KLQotCSAgICBlbHNlCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIiksCi0JCQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkJICAgICAgIHN5bV9uYW1lLAotCQkJCSAgICAgICBwcGNfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLT5uYW1lLAotCQkJCSAgICAgICBuYW1lKTsKLQotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJcmV0ID0gZmFsc2U7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICBpZiAocl90eXBlID09IFJfUFBDX0VNQl9TREEyMSkKLQkgICAgICB7CQkJLyogZmlsbCBpbiByZWdpc3RlciBmaWVsZCAqLwotCQlpbnNuID0gYmZkX2dldF8zMiAob3V0cHV0X2JmZCwgY29udGVudHMgKyBvZmZzZXQpOwotCQlpbnNuID0gKGluc24gJiB+UkFfUkVHSVNURVJfTUFTSykgfCAocmVnIDw8IFJBX1JFR0lTVEVSX1NISUZUKTsKLQkJYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgaW5zbiwgY29udGVudHMgKyBvZmZzZXQpOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JLyogUmVsb2NhdGUgYWdhaW5zdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWN0aW9uICovCi0JY2FzZSAoaW50KVJfUFBDX1NFQ1RPRkY6Ci0JY2FzZSAoaW50KVJfUFBDX1NFQ1RPRkZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX1NFQ1RPRkZfSEk6Ci0JICBCRkRfQVNTRVJUIChzZWMgIT0gKGFzZWN0aW9uICopMCk7Ci0JICBhZGRlbmQgLT0gc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCSAgYnJlYWs7Ci0KLQljYXNlIChpbnQpUl9QUENfU0VDVE9GRl9IQToKLQkgIEJGRF9BU1NFUlQgKHNlYyAhPSAoYXNlY3Rpb24gKikwKTsKLQkgIGFkZGVuZCAtPSBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0JICBhZGRlbmQgKz0gKChyZWxvY2F0aW9uICsgYWRkZW5kKSAmIDB4ODAwMCkgPDwgMTsKLQkgIGJyZWFrOwotCi0JLyogTmVnYXRpdmUgcmVsb2NhdGlvbnMgKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMzI6Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9OQUREUjE2OgotCWNhc2UgKGludClSX1BQQ19FTUJfTkFERFIxNl9MTzoKLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTZfSEk6Ci0JICBhZGRlbmQgLT0gMipyZWxvY2F0aW9uOwotCSAgYnJlYWs7Ci0KLQljYXNlIChpbnQpUl9QUENfRU1CX05BRERSMTZfSEE6Ci0JICBhZGRlbmQgLT0gMipyZWxvY2F0aW9uOwotCSAgYWRkZW5kICs9ICgocmVsb2NhdGlvbiArIGFkZGVuZCkgJiAweDgwMDApIDw8IDE7Ci0JICBicmVhazsKLQotCS8qIE5PUCByZWxvY2F0aW9uIHRoYXQgcHJldmVudHMgZ2FyYmFnZSBjb2xsZWN0aW5nIGxpbmtlcnMgZnJvbSBvbWl0dGluZyBhCi0JICAgcmVmZXJlbmNlLiAgKi8KLQljYXNlIChpbnQpUl9QUENfRU1CX01SS1JFRjoKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAoaW50KVJfUFBDX0NPUFk6Ci0JY2FzZSAoaW50KVJfUFBDX0dMT0JfREFUOgotCWNhc2UgKGludClSX1BQQ19KTVBfU0xPVDoKLQljYXNlIChpbnQpUl9QUENfUkVMQVRJVkU6Ci0JY2FzZSAoaW50KVJfUFBDX1BMVDMyOgotCWNhc2UgKGludClSX1BQQ19QTFRSRUwzMjoKLQljYXNlIChpbnQpUl9QUENfUExUMTZfTE86Ci0JY2FzZSAoaW50KVJfUFBDX1BMVDE2X0hJOgotCWNhc2UgKGludClSX1BQQ19QTFQxNl9IQToKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNFQzE2OgotCWNhc2UgKGludClSX1BQQ19FTUJfUkVMU1RfTE86Ci0JY2FzZSAoaW50KVJfUFBDX0VNQl9SRUxTVF9ISToKLQljYXNlIChpbnQpUl9QUENfRU1CX1JFTFNUX0hBOgotCWNhc2UgKGludClSX1BQQ19FTUJfQklUX0ZMRDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IFJlbG9jYXRpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHN5bWJvbCAlcy4iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSwKLQkJCQkgcHBjX2VsZl9ob3d0b190YWJsZVsgKGludClyX3R5cGUgXS0+bmFtZSwKLQkJCQkgc3ltX25hbWUpOwotCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0ID0gZmFsc2U7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgKGludClSX1BQQ19HTlVfVlRJTkhFUklUOgotCWNhc2UgKGludClSX1BQQ19HTlVfVlRFTlRSWToKLQkgIC8qIFRoZXNlIGFyZSBuby1vcHMgaW4gdGhlIGVuZC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLQotI2lmZGVmIERFQlVHCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcdHR5cGUgPSAlcyAoJWQpLCBuYW1lID0gJXMsIHN5bWJvbCBpbmRleCA9ICVsZCwgb2Zmc2V0ID0gJWxkLCBhZGRlbmQgPSAlbGRcbiIsCi0JICAgICAgIGhvd3RvLT5uYW1lLAotCSAgICAgICAoaW50KXJfdHlwZSwKLQkgICAgICAgc3ltX25hbWUsCi0JICAgICAgIHJfc3ltbmR4LAotCSAgICAgICAobG9uZylvZmZzZXQsCi0JICAgICAgIChsb25nKWFkZGVuZCk7Ci0jZW5kaWYKLQotICAgICAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sCi0JCQkJICAgIGlucHV0X2JmZCwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgY29udGVudHMsCi0JCQkJICAgIG9mZnNldCwKLQkJCQkgICAgcmVsb2NhdGlvbiwKLQkJCQkgICAgYWRkZW5kKTsKLQotICAgICAgaWYgKHIgPT0gYmZkX3JlbG9jX29rKQotCTsKLSAgICAgIGVsc2UgaWYgKHIgPT0gYmZkX3JlbG9jX292ZXJmbG93KQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIGlmIChoICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JCSAgJiYgaG93dG8tPnBjX3JlbGF0aXZlKQotCQl7Ci0JCSAgLyogQXNzdW1lIHRoaXMgaXMgYSBjYWxsIHByb3RlY3RlZCBieSBvdGhlciBjb2RlIHRoYXQKLQkJICAgICBkZXRlY3QgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBJZiB0aGlzIGlzIHRoZSBjYXNlLAotCQkgICAgIHdlIGNhbiBzYWZlbHkgaWdub3JlIHRoZSBvdmVyZmxvdy4gIElmIG5vdCwgdGhlCi0JCSAgICAgcHJvZ3JhbSBpcyBob3NlZCBhbnl3YXksIGFuZCBhIGxpdHRsZSB3YXJuaW5nIGlzbid0Ci0JCSAgICAgZ29pbmcgdG8gaGVscC4gICovCi0KLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsCi0JCQkJCQkgICAgICBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJCQkJICAgICAgc3ltLT5zdF9uYW1lKTsKLQkgICAgICBpZiAobmFtZSA9PSBOVUxMKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgfQotCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpKGluZm8sCi0JCQkJCQkgICBuYW1lLAotCQkJCQkJICAgaG93dG8tPm5hbWUsCi0JCQkJCQkgICAoYmZkX3ZtYSkgMCwKLQkJCQkJCSAgIGlucHV0X2JmZCwKLQkJCQkJCSAgIGlucHV0X3NlY3Rpb24sCi0JCQkJCQkgICBvZmZzZXQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXJldCA9IGZhbHNlOwotICAgIH0KLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0OwotfQotCi0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkiZWxmMzItcG93ZXJwY2xlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJYmZkX2VsZjMyX3Bvd2VycGNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXBvd2VycGMiCi0jZGVmaW5lIEVMRl9BUkNICQliZmRfYXJjaF9wb3dlcnBjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fUFBDCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJMHgxMDAwMAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwlwcGNfZWxmX2luZm9fdG9faG93dG8KLQotI2lmZGVmICBFTV9DWUdOVVNfUE9XRVJQQwotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxCUVNX0NZR05VU19QT1dFUlBDCi0jZW5kaWYKLQotI2lmZGVmIEVNX1BQQ19PTEQKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMglFTV9QUENfT0xECi0jZW5kaWYKLQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZAkxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9zeW1ib2xfb2Zmc2V0CTQKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCTEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCTEyCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQlQTFRfSU5JVElBTF9FTlRSWV9TSVpFCi0KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEJcHBjX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCXBwY19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbGF4X3NlY3Rpb24gICAgICAgICAgICAgcHBjX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXBwY19lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwkJcHBjX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotI2RlZmluZSBiZmRfZWxmMzJfYmZkX2ZpbmFsX2xpbmsJCV9iZmRfZWxmMzJfZ2NfY29tbW9uX2ZpbmFsX2xpbmsKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJCXBwY19lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sJCXBwY19lbGZfZ2Nfc3dlZXBfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJcHBjX2VsZl9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCQlwcGNfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJCXBwY19lbGZfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbAlwcGNfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sJCXBwY19lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucwlwcGNfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJcHBjX2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMJcHBjX2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCQlwcGNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMJcHBjX2VsZl9hZGRpdGlvbmFsX3Byb2dyYW1faGVhZGVycwotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJCXBwY19lbGZfbW9kaWZ5X3NlZ21lbnRfbWFwCi0KLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1zaC5jIGIvYmZkL2VsZjMyLXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NzllOGEuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTExICswLDAgQEAKLS8qIEhpdGFjaGkgU0ggc3BlY2lmaWMgc3VwcG9ydCBmb3IgMzItYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvc2guaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzaF9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNoX2VsZl9pZ25vcmVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc2hfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHNoX2VsZl9pbmZvX3RvX2hvd3RvCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIGludCkpOwotc3RhdGljIGJvb2xlYW4gc2hfZWxmX2FsaWduX2xvYWRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLCBiZmRfYnl0ZSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9zd2FwX2luc25zCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHNoX2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKnNoX2VsZl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgc2hfZWxmX2hvd3RvX3RhYmxlW10gPQotewotICAvKiBObyByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfU0hfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSByZWxvY2F0aW9uLiAgU2V0dGluZyBwYXJ0aWFsX2lucGxhY2UgdG8gdHJ1ZSBhbmQKLSAgICAgc3JjX21hc2sgdG8gYSBub24temVybyB2YWx1ZSBpcyBzaW1pbGFyIHRvIHRoZSBDT0ZGIHRvb2xjaGFpbi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVIzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9TSF9SRUwzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgUEMgcmVsYXRpdmUgYnJhbmNoIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUE4sCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQTiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggZGl2aWRlZCBieSAyLiAgKi8KLSAgSE9XVE8gKFJfU0hfSU5EMTJXLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9JTkQxMlciLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCB1bnNpZ25lZCBQQyByZWxhdGl2ZSBkaXZpZGVkIGJ5IDQuICAqLwotICBIT1dUTyAoUl9TSF9ESVI4V1BMLAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOFdQTCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IHVuc2lnbmVkIFBDIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXUFosCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9ESVI4V1BaIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlLiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZiB3ZSBoYXZlIHNvbWUKLSAgICAgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQgaXMgbm90Ci0gICAgIGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOEJQLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhCUCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgR0JSIHJlbGF0aXZlIGRpdmlkZWQgYnkgMi4gIEZJWE1FOiBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgaWYKLSAgICAgd2UgaGF2ZSBzb21lIHNwZWNpYWwgc3ltYm9sIGZvciB0aGUgR0JSIHJlbGF0aXZlIGFyZWEsIGFuZCB0aGF0Ci0gICAgIGlzIG5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX1NIX0RJUjhXLAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0RJUjhXIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZiwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBHQlIgcmVsYXRpdmUgZGl2aWRlZCBieSA0LiAgRklYTUU6IFRoaXMgb25seSBtYWtlcyBzZW5zZSBpZgotICAgICB3ZSBoYXZlIHNvbWUgc3BlY2lhbCBzeW1ib2wgZm9yIHRoZSBHQlIgcmVsYXRpdmUgYXJlYSwgYW5kIHRoYXQKLSAgICAgaXMgbm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfU0hfRElSOEwsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfRElSOEwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIHsgMTAgfSwKLSAgeyAxMSB9LAotICB7IDEyIH0sCi0gIHsgMTMgfSwKLSAgeyAxNCB9LAotICB7IDE1IH0sCi0gIHsgMTYgfSwKLSAgeyAxNyB9LAotICB7IDE4IH0sCi0gIHsgMTkgfSwKLSAgeyAyMCB9LAotICB7IDIxIH0sCi0gIHsgMjIgfSwKLSAgeyAyMyB9LAotICB7IDI0IH0sCi0KLSAgLyogVGhlIHJlbWFpbmluZyByZWxvY3MgYXJlIGEgR05VIGV4dGVuc2lvbiB1c2VkIGZvciByZWxheGluZy4gIFRoZQotICAgICBmaW5hbCBwYXNzIG9mIHRoZSBsaW5rZXIgbmV2ZXIgbmVlZHMgdG8gZG8gYW55dGhpbmcgd2l0aCBhbnkgb2YKLSAgICAgdGhlc2UgcmVsb2NzLiAgQW55IHJlcXVpcmVkIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYnkgdGhlCi0gICAgIHJlbGF4YXRpb24gY29kZS4gICovCi0KLSAgLyogQSAxNiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC53b3JkIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0gxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIMTYiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5LiAgVGhpcyBpcyBnZW5lcmF0ZWQgZm9yIGFuIGV4cHJlc3Npb24KLSAgICAgc3VjaCBhcyBgYC5sb25nIEwxIC0gTDInJy4gIFRoZSBvZmZzZXQgaG9sZHMgdGhlIGRpZmZlcmVuY2UKLSAgICAgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgTDIuICAqLwotICBIT1dUTyAoUl9TSF9TV0lUQ0gzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfU1dJVENIMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSW5kaWNhdGVzIGEgLnVzZXMgcHNldWRvLW9wLiAgVGhlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgLnVzZXMKLSAgICAgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBjYW4gYmUgcmVsYXhlZC4KLSAgICAgVGhlIG9mZnNldCBmaWVsZCBob2xkcyB0aGUgUEMgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbgotICAgICB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbiB0aGUgZnVuY3Rpb24gY2FsbC4gICovCi0gIEhPV1RPIChSX1NIX1VTRVMsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfVVNFUyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIHRoaXMgcmVsb2MgZm9yIGFkZHJlc3NlcyByZWZlcnJlZCB0bwotICAgICBieSB0aGUgcmVnaXN0ZXIgbG9hZHMgYXNzb2NpYXRlZCB3aXRoIFVTRVMgcmVsb2NzLiAgVGhlIG9mZnNldAotICAgICBmaWVsZCBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCi0gICAgIG9iamVjdCBmaWxlLiAgKi8KLSAgSE9XVE8gKFJfU0hfQ09VTlQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfQ09VTlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluZGljYXRlcyBhbiBhbGlnbm1lbnQgc3RhdGVtZW50LiAgVGhlIG9mZnNldCBmaWVsZCBpcyB0aGUgcG93ZXIKLSAgICAgb2YgMiB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZSBtdXN0IGJlCi0gICAgIGFsaWduZWQuICAqLwotICBIT1dUTyAoUl9TSF9BTElHTiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9BTElHTiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgYXNzZW1ibGVyIHdpbGwgZ2VuZXJhdGUgdGhpcyByZWxvYyBiZWZvcmUgYSBibG9jayBvZgotICAgICBpbnN0cnVjdGlvbnMuICBBIHNlY3Rpb24gc2hvdWxkIGJlIHByb2Nlc3NlZCBhcyBhc3N1bWluaW5nIGl0Ci0gICAgIGNvbnRhaW5zIGRhdGEsIHVubGVzcyB0aGlzIHJlbG9jIGlzIHNlZW4uICAqLwotICBIT1dUTyAoUl9TSF9DT0RFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBzaF9lbGZfaWdub3JlX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1NIX0NPREUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSB0aGlzIHJlbG9jIGFmdGVyIGEgYmxvY2sgb2YKLSAgICAgaW5zdHJ1Y3Rpb25zIHdoZW4gaXQgc2VlcyBkYXRhIHRoYXQgaXMgbm90IGluc3RydWN0aW9ucy4gICovCi0gIEhPV1RPIChSX1NIX0RBVEEsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfREFUQSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhpcyByZWxvYyBmb3IgZWFjaCBsYWJlbCB3aXRoaW4gYSBibG9jawotICAgICBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBhdm9pZCBzd2FwcGluZwotICAgICBpbnN0cnVjdGlvbnMgd2hpY2ggYXJlIHRoZSB0YXJnZXRzIG9mIGJyYW5jaGVzLiAgKi8KLSAgSE9XVE8gKFJfU0hfTEFCRUwsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHNoX2VsZl9pZ25vcmVfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfU0hfTEFCRUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFuIDggYml0IHN3aXRjaCB0YWJsZSBlbnRyeS4gIFRoaXMgaXMgZ2VuZXJhdGVkIGZvciBhbiBleHByZXNzaW9uCi0gICAgIHN1Y2ggYXMgYGAud29yZCBMMSAtIEwyJycuICBUaGUgb2Zmc2V0IGhvbGRzIHRoZSBkaWZmZXJlbmNlCi0gICAgIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIEwyLiAgKi8KLSAgSE9XVE8gKFJfU0hfU1dJVENIOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgc2hfZWxmX2lnbm9yZV9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9TSF9TV0lUQ0g4IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX1NIX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1NIX0dOVV9WVElOSEVSSVQiLCAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIG1lbWJlciB1c2FnZSAqLwotICBIT1dUTyAoUl9TSF9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfU0hfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG5vcm1hbCByZWxvY3MuICBUaGlzIGlzIGxpa2UgdGhlIENPRkYKLSAgIGZ1bmN0aW9uLCBhbmQgaXMgYWxtb3N0IGNlcnRhaW5seSBpbmNvcnJlY3QgZm9yIG90aGVyIEVMRiB0YXJnZXRzLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc2hfZWxmX3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sX2luLCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCSAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sX2luOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgYmZkX3ZtYSBzeW1fdmFsdWU7Ci0gIGVudW0gZWxmX3NoX3JlbG9jX3R5cGUgcl90eXBlOwotICBiZmRfdm1hIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX2J5dGUgKmhpdF9kYXRhID0gYWRkciArIChiZmRfYnl0ZSAqKSBkYXRhOwotCi0gIHJfdHlwZSA9IChlbnVtIGVsZl9zaF9yZWxvY190eXBlKSByZWxvY19lbnRyeS0+aG93dG8tPnR5cGU7Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQYXJ0aWFsIGxpbmtpbmctLWRvIG5vdGhpbmcuICAqLwotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIEFsbW9zdCBhbGwgcmVsb2NzIGhhdmUgdG8gZG8gd2l0aCByZWxheGluZy4gIElmIGFueSB3b3JrIG11c3QgYmUKLSAgICAgZG9uZSBmb3IgdGhlbSwgaXQgaGFzIGJlZW4gZG9uZSBpbiBzaF9yZWxheF9zZWN0aW9uLiAgKi8KLSAgaWYgKHJfdHlwZSAhPSBSX1NIX0RJUjMyCi0gICAgICAmJiAocl90eXBlICE9IFJfU0hfSU5EMTJXCi0JICB8fCAoc3ltYm9sX2luLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICBpZiAoc3ltYm9sX2luICE9IE5VTEwKLSAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sX2luLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2xfaW4tPnNlY3Rpb24pKQotICAgIHN5bV92YWx1ZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIGVsc2UgCi0gICAgc3ltX3ZhbHVlID0gKHN5bWJvbF9pbi0+dmFsdWUgKwotCQkgc3ltYm9sX2luLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsKLQkJIHN5bWJvbF9pbi0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0KLSAgc3dpdGNoIChyX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9TSF9ESVIzMjoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBoaXRfZGF0YSk7Ci0gICAgICBpbnNuICs9IHN5bV92YWx1ZSArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfU0hfSU5EMTJXOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGhpdF9kYXRhKTsKLSAgICAgIHN5bV92YWx1ZSArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICAgICAgc3ltX3ZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICsgYWRkcgotCQkgICAgKyA0KTsKLSAgICAgIHN5bV92YWx1ZSArPSAoaW5zbiAmIDB4ZmZmKSA8PCAxOwotICAgICAgaWYgKGluc24gJiAweDgwMCkKLQlzeW1fdmFsdWUgLT0gMHgxMDAwOwotICAgICAgaW5zbiA9IChpbnNuICYgMHhmMDAwKSB8IChzeW1fdmFsdWUgJiAweGZmZik7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBoaXRfZGF0YSk7Ci0gICAgICBpZiAoc3ltX3ZhbHVlIDwgKGJmZF92bWEpIC0weDEwMDAgfHwgc3ltX3ZhbHVlID49IDB4MTAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgcmVsb2NzIHdoaWNoIGFyZSBvbmx5IHVzZWQgZm9yIHJlbGF4aW5nLAotICAgd2hpY2ggdGhlIGxpbmtlciBzaG91bGQgb3RoZXJ3aXNlIGlnbm9yZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNoX2VsZl9pZ25vcmVfcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwpCi0gICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgQkZEIHJlbG9jIGNvZGVzIHRvIFNIIEVMRiByZWxvY3MuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotLyogQW4gYXJyYXkgbWFwcGluZyBCRkQgcmVsb2MgY29kZXMgdG8gU0ggRUxGIHJlbG9jcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzaF9yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU0hfTk9ORSB9LAotICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9ESVIzMiB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX1NIX0RJUjMyIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMLCBSX1NIX1JFTDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIsIFJfU0hfRElSOFdQTiB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMiwgUl9TSF9JTkQxMlcgfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyLCBSX1NIX0RJUjhXUFogfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0LCBSX1NIX0RJUjhXUEwgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TSF9TV0lUQ0g4IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDE2IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLCBSX1NIX1NXSVRDSDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1VTRVMsIFJfU0hfVVNFUyB9LAotICB7IEJGRF9SRUxPQ19TSF9DT1VOVCwgUl9TSF9DT1VOVCB9LAotICB7IEJGRF9SRUxPQ19TSF9BTElHTiwgUl9TSF9BTElHTiB9LAotICB7IEJGRF9SRUxPQ19TSF9DT0RFLCBSX1NIX0NPREUgfSwKLSAgeyBCRkRfUkVMT0NfU0hfREFUQSwgUl9TSF9EQVRBIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0xBQkVMLCBSX1NIX0xBQkVMIH0sCi0gIHsgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklULCBSX1NIX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NIX0dOVV9WVEVOVFJZIH0sCi19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyBjb2RlLCByZXR1cm4gdGhlIGhvd3RvIHN0cnVjdHVyZSBmb3IgdGhlCi0gICBjb3JyZXNwb25kaW5nIFNIIEVMZiByZWxvYy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoc2hfcmVsb2NfbWFwKSAvIHNpemVvZiAoc3RydWN0IGVsZl9yZWxvY19tYXApOyBpKyspCi0gICAgewotICAgICAgaWYgKHNoX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZzaF9lbGZfaG93dG9fdGFibGVbKGludCkgc2hfcmVsb2NfbWFwW2ldLmVsZl9yZWxvY192YWxdOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2l2ZW4gYW4gRUxGIHJlbG9jLCBmaWxsIGluIHRoZSBob3d0byBmaWVsZCBvZiBhIHJlbGVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zaF9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcjsKLQotICByID0gRUxGMzJfUl9UWVBFIChkc3QtPnJfaW5mbyk7Ci0KLSAgQkZEX0FTU0VSVCAociA8ICh1bnNpZ25lZCBpbnQpIFJfU0hfbWF4KTsKLSAgQkZEX0FTU0VSVCAociA8IFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQyB8fCByID4gUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MpOwotCi0gIGNhY2hlX3B0ci0+aG93dG8gPSAmc2hfZWxmX2hvd3RvX3RhYmxlW3JdOwotfQotDAotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHJlbGF4aW5nIGZvciBTSCBFTEYuICBTZWUgdGhlIGNvcnJlc3BvbmRpbmcKLSAgIGZ1bmN0aW9uIGluIGNvZmYtc2guYyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgZG9lcy4gIEZJWE1FOgotICAgVGhlcmUgaXMgYSBsb3Qgb2YgZHVwbGljYXRpb24gaGVyZSBiZXR3ZWVuIHRoaXMgY29kZSBhbmQgdGhlIENPRkYKLSAgIHNwZWNpZmljIGNvZGUuICBUaGUgZm9ybWF0IG9mIHJlbG9jcyBhbmQgc3ltYm9scyBpcyB3b3VuZCBkZWVwbHkKLSAgIGludG8gdGhpcyBjb2RlLCBidXQgaXQgd291bGQgc3RpbGwgYmUgYmV0dGVyIGlmIHRoZSBkdXBsaWNhdGlvbgotICAgY291bGQgYmUgZWxpbWluYXRlZCBzb21laG93LiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgYWx0aG91Z2ggYm90aAotICAgZnVuY3Rpb25zIHVzZSBzeW1ib2xzIGxpa2UgUl9TSF9DT0RFLCB0aG9zZSBzeW1ib2xzIGhhdmUgZGlmZmVyZW50Ci0gICB2YWx1ZXM7IGluIGNvZmYtc2guYyB0aGV5IGNvbWUgZnJvbSBpbmNsdWRlL2NvZmYvc2guaCwgd2hlcmVhcyBoZXJlCi0gICB0aGV5IGNvbWUgZnJvbSBlbnVtIGVsZl9zaF9yZWxvY190eXBlIGluIGluY2x1ZGUvZWxmL3NoLmguICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNoX2VsZl9yZWxheF9zZWN0aW9uIChhYmZkLCBzZWMsIGxpbmtfaW5mbywgYWdhaW4pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqZnJlZV9yZWxvY3MgPSBOVUxMOwotICBib29sZWFuIGhhdmVfY29kZTsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBoYXZlX2NvZGUgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChpcmVsID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGJmZF92bWEgbGFkZHIsIHBhZGRyLCBzeW12YWw7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBpbnNuOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxmbiwgKmlyZWxzY2FuLCAqaXJlbGNvdW50OwotICAgICAgYmZkX3NpZ25lZF92bWEgZm9mZjsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0NPREUpCi0JaGF2ZV9jb2RlID0gdHJ1ZTsKLQotICAgICAgaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSAhPSAoaW50KSBSX1NIX1VTRVMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT50aGlzX2hkci5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlYy0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGNvbnRlbnRzOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGNvbnRlbnRzLAotCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNlYy0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSByX2FkZGVuZCBmaWVsZCBvZiB0aGUgUl9TSF9VU0VTIHJlbG9jIHdpbGwgcG9pbnQgdXMgdG8KLSAgICAgICAgIHRoZSByZWdpc3RlciBsb2FkLiAgVGhlIDQgaXMgYmVjYXVzZSB0aGUgcl9hZGRlbmQgZmllbGQgaXMKLSAgICAgICAgIGNvbXB1dGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEganVtcCBvZmZzZXQsIHdoaWNoIGFyZSBiYXNlZAotICAgICAgICAgZnJvbSA0IGJ5dGVzIGFmdGVyIHRoZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGxhZGRyID0gaXJlbC0+cl9vZmZzZXQgKyA0ICsgaXJlbC0+cl9hZGRlbmQ7Ci0gICAgICBpZiAobGFkZHIgPj0gc2VjLT5fcmF3X3NpemUpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgb2Zmc2V0IiksCi0JCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAodW5zaWduZWQgbG9uZykgaXJlbC0+cl9vZmZzZXQpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGNvbnRlbnRzICsgbGFkZHIpOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IG1vdi5sIE5OLHJOLCB3ZSBkb24ndCBrbm93IHdoYXQgdG8KLSAgICAgICAgIGRvLiAgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZjAwMCkgIT0gMHhkMDAwKQotCXsKLQkgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBSX1NIX1VTRVMgcG9pbnRzIHRvIHVucmVjb2duaXplZCBpbnNuIDB4JXgiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCwgaW5zbikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0aGUgcmVnaXN0ZXIgaXMgYmVpbmcgbG9hZGVkLiAgVGhlCi0gICAgICAJIGRpc3BsYWNlbWVudCBpbiB0aGUgbW92LmwgaW5zdHJ1Y3Rpb24gaXMgcXVhZHJ1cGxlZC4gIEl0IGlzIGEKLSAgICAgIAkgZGlzcGxhY2VtZW50IGZyb20gZm91ciBieXRlcyBhZnRlciB0aGUgbW92bCBpbnN0cnVjdGlvbiwgYnV0LAotICAgICAgCSBiZWZvcmUgYWRkaW5nIGluIHRoZSBQQyBhZGRyZXNzLCB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYml0cwotICAgICAgCSBvZiB0aGUgUEMgYXJlIGNsZWFyZWQuICBXZSBhc3N1bWUgdGhhdCB0aGUgc2VjdGlvbiBpcyBhbGlnbmVkCi0gICAgICAJIG9uIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgIHBhZGRyID0gaW5zbiAmIDB4ZmY7Ci0gICAgICBwYWRkciAqPSA0OwotICAgICAgcGFkZHIgKz0gKGxhZGRyICsgNCkgJn4gMzsKLSAgICAgIGlmIChwYWRkciA+PSBzZWMtPl9yYXdfc2l6ZSkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogYmFkIFJfU0hfVVNFUyBsb2FkIG9mZnNldCIpLAotCSAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIGlyZWwtPnJfb2Zmc2V0KSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEdldCB0aGUgcmVsb2MgZm9yIHRoZSBhZGRyZXNzIGZyb20gd2hpY2ggdGhlIHJlZ2lzdGVyIGlzCi0gICAgICAgICBiZWluZyBsb2FkZWQuICBUaGlzIHJlbG9jIHdpbGwgdGVsbCB1cyB3aGljaCBmdW5jdGlvbiBpcwotICAgICAgICAgYWN0dWFsbHkgYmVpbmcgY2FsbGVkLiAgKi8KLSAgICAgIGZvciAoaXJlbGZuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsZm4gPCBpcmVsZW5kOyBpcmVsZm4rKykKLQlpZiAoaXJlbGZuLT5yX29mZnNldCA9PSBwYWRkcgotCSAgICAmJiBFTEYzMl9SX1RZUEUgKGlyZWxmbi0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0RJUjMyKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbGZuID49IGlyZWxlbmQpCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgIChfKCIlczogMHglbHg6IHdhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIGV4cGVjdGVkIHJlbG9jIiksCi0JICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCAodW5zaWduZWQgbG9uZykgcGFkZHIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogUmVhZCB0aGlzIEJGRCdzIHN5bWJvbHMgaWYgd2UgaGF2ZW4ndCBkb25lIHNvIGFscmVhZHkuICAqLwotICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQkgICAgZXh0c3ltcyA9IChFbGYzMl9FeHRlcm5hbF9TeW0gKikgc3ltdGFiX2hkci0+Y29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHRzeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9zaXplKSk7Ci0JICAgICAgaWYgKGV4dHN5bXMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9leHRzeW1zID0gZXh0c3ltczsKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkJICB8fCAoYmZkX3JlYWQgKGV4dHN5bXMsIDEsIHN5bXRhYl9oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgICAgICE9IHN5bXRhYl9oZHItPnNoX3NpemUpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IHRoZSByZWxvYy4gICovCi0gICAgICBpZiAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgRWxmX0ludGVybmFsX1N5bSBpc3ltOwotCi0JICAvKiBBIGxvY2FsIHN5bWJvbC4gICovCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbGZuLT5yX2luZm8pLAotCQkJCSAgICAmaXN5bSk7Ci0KLQkgIGlmIChpc3ltLnN0X3NobmR4ICE9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKSkKLQkgICAgewotCSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgICAgKF8oIiVzOiAweCVseDogd2FybmluZzogc3ltYm9sIGluIHVuZXhwZWN0ZWQgc2VjdGlvbiIpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgc3ltdmFsID0gKGlzeW0uc3RfdmFsdWUKLQkJICAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBpbmR4ID0gRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0JICBoID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpW2luZHhdOwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQkgIGlmIChoLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgJiYgaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHJlZmVyZW5jZSB0byBhbiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgSnVzdCBpZ25vcmUgaXQtLWl0IHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZQotICAgICAgICAgICAgICAgICByZWd1bGFyIHJlbG9jIHByb2Nlc3NpbmcuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXZhbCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCX0KLQotICAgICAgc3ltdmFsICs9IGJmZF9nZXRfMzIgKGFiZmQsIGNvbnRlbnRzICsgcGFkZHIpOwotCi0gICAgICAvKiBTZWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxsIGNhbiBiZSBzaG9ydGVuZWQuICAqLwotICAgICAgZm9mZiA9IChzeW12YWwKLQkgICAgICAtIChpcmVsLT5yX29mZnNldAotCQkgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCSArIDQpKTsKLSAgICAgIGlmIChmb2ZmIDwgLTB4MTAwMCB8fCBmb2ZmID49IDB4MTAwMCkKLQl7Ci0JICAvKiBBZnRlciBhbGwgdGhhdCB3b3JrLCB3ZSBjYW4ndCBzaG9ydGVuIHRoaXMgZnVuY3Rpb24gY2FsbC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFNob3J0ZW4gdGhlIGZ1bmN0aW9uIGNhbGwuICAqLwotCi0gICAgICAvKiBGb3Igc2ltcGxpY2l0eSBvZiBjb2RpbmcsIHdlIGFyZSBnb2luZyB0byBtb2RpZnkgdGhlIHNlY3Rpb24KLQkgY29udGVudHMsIHRoZSBzZWN0aW9uIHJlbG9jcywgYW5kIHRoZSBCRkQgc3ltYm9sIHRhYmxlLiAgV2UKLQkgbXVzdCB0ZWxsIHRoZSByZXN0IG9mIHRoZSBjb2RlIG5vdCB0byBmcmVlIHVwIHRoaXMKLQkgaW5mb3JtYXRpb24uICBJdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBpbnN0ZWFkIGNyZWF0ZSBhIHRhYmxlCi0JIG9mIGNoYW5nZXMgd2hpY2ggaGF2ZSB0byBiZSBtYWRlLCBhcyBpcyBkb25lIGluIGNvZmYtbWlwcy5jOwotCSB0aGF0IHdvdWxkIGJlIG1vcmUgd29yaywgYnV0IHdvdWxkIHJlcXVpcmUgbGVzcyBtZW1vcnkgd2hlbgotCSB0aGUgbGlua2VyIGlzIHJ1bi4gICovCi0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLSAgICAgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0gICAgICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotICAgICAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQotICAgICAgLyogUmVwbGFjZSB0aGUganNyIHdpdGggYSBic3IuICAqLwotCi0gICAgICAvKiBDaGFuZ2UgdGhlIFJfU0hfVVNFUyByZWxvYyBpbnRvIGFuIFJfU0hfSU5EMTJXIHJlbG9jLCBhbmQKLSAgICAgICAgIHJlcGxhY2UgdGhlIGpzciB3aXRoIGEgYnNyLiAgKi8KLSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoRUxGMzJfUl9TWU0gKGlyZWxmbi0+cl9pbmZvKSwgUl9TSF9JTkQxMlcpOwotICAgICAgaWYgKEVMRjMyX1JfU1lNIChpcmVsZm4tPnJfaW5mbykgPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIC8qIElmIHRoaXMgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZWNhdXNlIG9mIGZ1dHVyZSByZWxheGluZywKLSAgICAgICAgICAgICBpdCB3aWxsIGJlIGhhbmRsZWQgaGVyZSBsaWtlIG90aGVyIGludGVybmFsIElORDEyVwotICAgICAgICAgICAgIHJlbG9jcy4gICovCi0JICBiZmRfcHV0XzE2IChhYmZkLAotCQkgICAgICAweGIwMDAgfCAoKGZvZmYgPj4gMSkgJiAweGZmZiksCi0JCSAgICAgIGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBjYW4ndCBmdWxseSByZXNvbHZlIHRoaXMgeWV0LCBiZWNhdXNlIHRoZSBleHRlcm5hbAotICAgICAgICAgICAgIHN5bWJvbCB2YWx1ZSBtYXkgYmUgY2hhbmdlZCBieSBmdXR1cmUgcmVsYXhpbmcuICBXZSBsZXQKLSAgICAgICAgICAgICB0aGUgZmluYWwgbGluayBwaGFzZSBoYW5kbGUgaXQuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgMHhiMDAwLCBjb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQl9Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbm90aGVyIFJfU0hfVVNFUyByZWxvYyByZWZlcnJpbmcgdG8gdGhlIHNhbWUKLSAgICAgICAgIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgZm9yIChpcmVsc2NhbiA9IGludGVybmFsX3JlbG9jczsgaXJlbHNjYW4gPCBpcmVsZW5kOyBpcmVsc2NhbisrKQotCWlmIChFTEYzMl9SX1RZUEUgKGlyZWxzY2FuLT5yX2luZm8pID09IChpbnQpIFJfU0hfVVNFUwotCSAgICAmJiBsYWRkciA9PSBpcmVsc2Nhbi0+cl9vZmZzZXQgKyA0ICsgaXJlbHNjYW4tPnJfYWRkZW5kKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaXJlbHNjYW4gPCBpcmVsZW5kKQotCXsKLQkgIC8qIFNvbWUgb3RoZXIgZnVuY3Rpb24gY2FsbCBkZXBlbmRzIHVwb24gdGhpcyByZWdpc3RlciBsb2FkLAotCSAgICAgYW5kIHdlIGhhdmUgbm90IHlldCBjb252ZXJ0ZWQgdGhhdCBmdW5jdGlvbiBjYWxsLgotCSAgICAgSW5kZWVkLCB3ZSBtYXkgbmV2ZXIgYmUgYWJsZSB0byBjb252ZXJ0IGl0LiAgVGhlcmUgaXMKLQkgICAgIG5vdGhpbmcgZWxzZSB3ZSBjYW4gZG8gYXQgdGhpcyBwb2ludC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIGEgUl9TSF9DT1VOVCByZWxvYyBvbiB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCi0gICAgICAgICBmdW5jdGlvbiBhZGRyZXNzIGlzIHN0b3JlZC4gIERvIHRoaXMgYmVmb3JlIGRlbGV0aW5nIGFueQotICAgICAgICAgYnl0ZXMsIHRvIGF2b2lkIGNvbmZ1c2lvbiBhYm91dCB0aGUgYWRkcmVzcy4gICovCi0gICAgICBmb3IgKGlyZWxjb3VudCA9IGludGVybmFsX3JlbG9jczsgaXJlbGNvdW50IDwgaXJlbGVuZDsgaXJlbGNvdW50KyspCi0JaWYgKGlyZWxjb3VudC0+cl9vZmZzZXQgPT0gcGFkZHIKLQkgICAgJiYgRUxGMzJfUl9UWVBFIChpcmVsY291bnQtPnJfaW5mbykgPT0gKGludCkgUl9TSF9DT1VOVCkKLQkgIGJyZWFrOwotCi0gICAgICAvKiBEZWxldGUgdGhlIHJlZ2lzdGVyIGxvYWQuICAqLwotICAgICAgaWYgKCEgc2hfZWxmX3JlbGF4X2RlbGV0ZV9ieXRlcyAoYWJmZCwgc2VjLCBsYWRkciwgMikpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFRoYXQgd2lsbCBjaGFuZ2UgdGhpbmdzLCBzbywganVzdCBpbiBjYXNlIGl0IHBlcm1pdHMgc29tZQotICAgICAgICAgb3RoZXIgZnVuY3Rpb24gY2FsbCB0byBjb21lIHdpdGhpbiByYW5nZSwgd2Ugc2hvdWxkIHJlbGF4Ci0gICAgICAgICBhZ2Fpbi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgYW5kIGl0IG1heSBiZSBzbG93LiAgKi8KLSAgICAgICphZ2FpbiA9IHRydWU7Ci0KLSAgICAgIC8qIE5vdyBjaGVjayB3aGV0aGVyIHdlIGdvdCBhIENPVU5UIHJlbG9jLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQgPj0gaXJlbGVuZCkKLQl7Ci0JICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgKF8oIiVzOiAweCVseDogd2FybmluZzogY291bGQgbm90IGZpbmQgZXhwZWN0ZWQgQ09VTlQgcmVsb2MiKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBwYWRkcikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIHVzZXMgaXMgc3RvcmVkIGluIHRoZSByX2FkZGVuZCBmaWVsZC4gIFdlJ3ZlCi0gICAgICAgICBqdXN0IGRlbGV0ZWQgb25lLiAgKi8KLSAgICAgIGlmIChpcmVsY291bnQtPnJfYWRkZW5kID09IDApCi0JewotCSAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgY291bnQiKSwKLQkJCQkgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJCSAgKHVuc2lnbmVkIGxvbmcpIHBhZGRyKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC0taXJlbGNvdW50LT5yX2FkZGVuZDsKLQotICAgICAgLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlcywgd2UgY2FuIGRlbGV0ZSB0aGUgYWRkcmVzcy4gIFJlbG9hZAotICAgICAgICAgdGhlIGFkZHJlc3MgZnJvbSBpcmVsZm4sIGluIGNhc2UgaXQgd2FzIGNoYW5nZWQgYnkgdGhlCi0gICAgICAgICBwcmV2aW91cyBjYWxsIHRvIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMuICAqLwotICAgICAgaWYgKGlyZWxjb3VudC0+cl9hZGRlbmQgPT0gMCkKLQl7Ci0JICBpZiAoISBzaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGlyZWxmbi0+cl9vZmZzZXQsIDQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFdlJ3ZlIGRvbmUgYWxsIHdlIGNhbiB3aXRoIHRoYXQgZnVuY3Rpb24gY2FsbC4gICovCi0gICAgfQotCi0gIC8qIExvb2sgZm9yIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IHdlIGNhbiBhbGlnbiBvbiBmb3VyCi0gICAgIGJ5dGUgYm91bmRhcmllcy4gICovCi0gIGlmIChoYXZlX2NvZGUpCi0gICAgewotICAgICAgYm9vbGVhbiBzd2FwcGVkOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JICAgIGNvbnRlbnRzID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHM7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICAgIGZyZWVfY29udGVudHMgPSBjb250ZW50czsKLQotCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBjb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBzaF9lbGZfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywKLQkJCQkmc3dhcHBlZCkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzd2FwcGVkKQotCXsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQkgIGZyZWVfcmVsb2NzID0gTlVMTDsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQkgIGZyZWVfY29udGVudHMgPSBOVUxMOwotCi0JICBzeW10YWJfaGRyLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBleHRzeW1zOwotCSAgZnJlZV9leHRzeW1zID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLSAgICAgIGZyZWVfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBjb250ZW50czsKLQl9Ci0gICAgICBmcmVlX2NvbnRlbnRzID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgICBmcmVlX2V4dHN5bXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICBpZiAoZnJlZV9jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfY29udGVudHMpOwotICBpZiAoZnJlZV9leHRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBEZWxldGUgc29tZSBieXRlcyBmcm9tIGEgc2VjdGlvbiB3aGlsZSByZWxheGluZy4gIEZJWE1FOiBUaGVyZSBpcyBhCi0gICBsb3Qgb2YgZHVwbGljYXRpb24gYmV0d2VlbiB0aGlzIGZ1bmN0aW9uIGFuZCBzaF9yZWxheF9kZWxldGVfYnl0ZXMKLSAgIGluIGNvZmYtc2guYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfcmVsYXhfZGVsZXRlX2J5dGVzIChhYmZkLCBzZWMsIGFkZHIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgaW50IGNvdW50OwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmMzJfRXh0ZXJuYWxfU3ltICpleHRzeW1zOwotICBpbnQgc2huZHgsIGluZGV4OwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhbGlnbjsKLSAgYmZkX3ZtYSB0b2FkZHI7Ci0gIEVsZjMyX0V4dGVybmFsX1N5bSAqZXN5bSwgKmVzeW1lbmQ7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpzeW1faGFzaDsKLSAgYXNlY3Rpb24gKm87Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBleHRzeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQotICBzaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgc2VjKTsKLQotICBjb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCi0gIC8qIFRoZSBkZWxldGlvbiBtdXN0IHN0b3AgYXQgdGhlIG5leHQgQUxJR04gcmVsb2MgZm9yIGFuIGFsaWdtZW50Ci0gICAgIHBvd2VyIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgYXJlIGRlbGV0aW5nLiAgKi8KLQotICBpcmVsYWxpZ24gPSBOVUxMOwotICB0b2FkZHIgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotICBpcmVsID0gZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsb2NzOwotICBpcmVsZW5kID0gaXJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrKQotICAgIHsKLSAgICAgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9BTElHTgotCSAgJiYgaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAmJiBjb3VudCA8ICgxIDw8IGlyZWwtPnJfYWRkZW5kKSkKLQl7Ci0JICBpcmVsYWxpZ24gPSBpcmVsOwotCSAgdG9hZGRyID0gaXJlbC0+cl9vZmZzZXQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFjdHVhbGx5IGRlbGV0ZSB0aGUgYnl0ZXMuICAqLwotICBtZW1tb3ZlIChjb250ZW50cyArIGFkZHIsIGNvbnRlbnRzICsgYWRkciArIGNvdW50LCB0b2FkZHIgLSBhZGRyIC0gY291bnQpOwotICBpZiAoaXJlbGFsaWduID09IE5VTEwpCi0gICAgc2VjLT5fY29va2VkX3NpemUgLT0gY291bnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotI2RlZmluZSBOT1BfT1BDT0RFICgweDAwMDkpCi0KLSAgICAgIEJGRF9BU1NFUlQgKChjb3VudCAmIDEpID09IDApOwotICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDIpCi0JYmZkX3B1dF8xNiAoYWJmZCwgTk9QX09QQ09ERSwgY29udGVudHMgKyB0b2FkZHIgLSBjb3VudCArIGkpOwotICAgIH0KLQotICAvKiBBZGp1c3QgYWxsIHRoZSByZWxvY3MuICAqLwotICBmb3IgKGlyZWwgPSBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgYmZkX3ZtYSBucmFkZHIsIHN0b3A7Ci0gICAgICBiZmRfdm1hIHN0YXJ0ID0gMDsKLSAgICAgIGludCBpbnNuID0gMDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IG9mZiwgYWRqdXN0LCBvaW5zbjsKLSAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmYgPSAwOwotICAgICAgYm9vbGVhbiBvdmVyZmxvdzsKLQotICAgICAgLyogR2V0IHRoZSBuZXcgcmVsb2MgYWRkcmVzcy4gICovCi0gICAgICBucmFkZHIgPSBpcmVsLT5yX29mZnNldDsKLSAgICAgIGlmICgoaXJlbC0+cl9vZmZzZXQgPiBhZGRyCi0JICAgJiYgaXJlbC0+cl9vZmZzZXQgPCB0b2FkZHIpCi0JICB8fCAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfQUxJR04KLQkgICAgICAmJiBpcmVsLT5yX29mZnNldCA9PSB0b2FkZHIpKQotCW5yYWRkciAtPSBjb3VudDsKLQotICAgICAgLyogU2VlIGlmIHRoaXMgcmVsb2Mgd2FzIGZvciB0aGUgYnl0ZXMgd2UgaGF2ZSBkZWxldGVkLCBpbiB3aGljaAotCSBjYXNlIHdlIG5vIGxvbmdlciBjYXJlIGFib3V0IGl0LiAgRG9uJ3QgZGVsZXRlIHJlbG9jcyB3aGljaAotCSByZXByZXNlbnQgYWRkcmVzc2VzLCB0aG91Z2guICAqLwotICAgICAgaWYgKGlyZWwtPnJfb2Zmc2V0ID49IGFkZHIKLQkgICYmIGlyZWwtPnJfb2Zmc2V0IDwgYWRkciArIGNvdW50Ci0JICAmJiBFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9TSF9BTElHTgotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQ09ERQotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfREFUQQotCSAgJiYgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfTEFCRUwpCi0JaXJlbC0+cl9pbmZvID0gRUxGMzJfUl9JTkZPIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkgICAgIChpbnQpIFJfU0hfTk9ORSk7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvYywgc2VlIGlmIHRoZSByYW5nZSBpdCBjb3ZlcnMKLSAgICAgICAgIGluY2x1ZGVzIHRoZSBieXRlcyB3ZSBoYXZlIGRlbGV0ZWQuICAqLwotICAgICAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQotCXsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTjoKLQljYXNlIFJfU0hfSU5EMTJXOgotCWNhc2UgUl9TSF9ESVI4V1BaOgotCWNhc2UgUl9TSF9ESVI4V1BMOgotCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQkgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHN0YXJ0ID0gc3RvcCA9IGFkZHI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVIzMjoKLQkgIC8qIElmIHRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIGluIHRoaXMKLSAgICAgICAgICAgICBzZWN0aW9uLCBhbmQgdGhlIHN5bWJvbCB3aWxsIG5vdCBiZSBhZGp1c3RlZCBiZWxvdywgd2UKLSAgICAgICAgICAgICBtdXN0IGNoZWNrIHRoZSBhZGRlbmQgdG8gc2VlIGl0IHdpbGwgcHV0IHRoZSB2YWx1ZSBpbgotICAgICAgICAgICAgIHJhbmdlIHRvIGJlIGFkanVzdGVkLCBhbmQgaGVuY2UgbXVzdCBiZSBjaGFuZ2VkLiAgKi8KLQkgIGlmIChFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJCWV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbC0+cl9pbmZvKSwKLQkJCQkJJnN5bSk7Ci0JICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBzaG5keAotCQkgICYmIChzeW0uc3RfdmFsdWUgPD0gYWRkcgotCQkgICAgICB8fCBzeW0uc3RfdmFsdWUgPj0gdG9hZGRyKSkKLQkJewotCQkgIGJmZF92bWEgdmFsOwotCi0JCSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCQkgIHZhbCArPSBzeW0uc3RfdmFsdWU7Ci0JCSAgaWYgKHZhbCA+IGFkZHIgJiYgdmFsIDwgdG9hZGRyKQotCQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsIC0gY291bnQsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkJfQotCSAgICB9Ci0JICBzdGFydCA9IHN0b3AgPSBhZGRyOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQTjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgaWYgKG9mZiAmIDB4ODApCi0JICAgIG9mZiAtPSAweDEwMDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQgKyA0ICsgb2ZmICogMik7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9JTkQxMlc6Ci0JICBpZiAoRUxGMzJfUl9TWU0gKGlyZWwtPnJfaW5mbykgPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgc3RhcnQgPSBzdG9wID0gYWRkcjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9mZiA9IGluc24gJiAweGZmZjsKLQkgICAgICBpZiAob2ZmICYgMHg4MDApCi0JCW9mZiAtPSAweDEwMDA7Ci0JICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIDQgKyBvZmYgKiAyKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfRElSOFdQWjoKLQkgIG9mZiA9IGluc24gJiAweGZmOwotCSAgc3RvcCA9IHN0YXJ0ICsgNCArIG9mZiAqIDI7Ci0JICBicmVhazsKLQotCWNhc2UgUl9TSF9ESVI4V1BMOgotCSAgb2ZmID0gaW5zbiAmIDB4ZmY7Ci0JICBzdG9wID0gKHN0YXJ0ICZ+IChiZmRfdm1hKSAzKSArIDQgKyBvZmYgKiA0OwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU0hfU1dJVENIODoKLQljYXNlIFJfU0hfU1dJVENIMTY6Ci0JY2FzZSBSX1NIX1NXSVRDSDMyOgotCSAgLyogVGhlc2UgcmVsb2NzIHR5cGVzIHJlcHJlc2VudAotCSAgICAgICAud29yZCBMMi1MMQotCSAgICAgVGhlIHJfYWRkZW5kIGZpZWxkIGhvbGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jCi0JICAgICBhZGRyZXNzIGFuZCBMMS4gIFRoYXQgaXMgdGhlIHN0YXJ0IG9mIHRoZSByZWxvYywgYW5kCi0JICAgICBhZGRpbmcgaW4gdGhlIGNvbnRlbnRzIGdpdmVzIHVzIHRoZSB0b3AuICBXZSBtdXN0IGFkanVzdAotCSAgICAgYm90aCB0aGUgcl9vZmZzZXQgZmllbGQgYW5kIHRoZSBzZWN0aW9uIGNvbnRlbnRzLgotCSAgICAgTi5CLiBpbiBnYXMgLyBjb2ZmIGJmZCwgdGhlIGVsZiBiZmQgcl9hZGRlbmQgaXMgY2FsbGVkIHJfb2Zmc2V0LAotCSAgICAgYW5kIHRoZSBlbGYgYmZkIHJfb2Zmc2V0IGlzIGNhbGxlZCByX3ZhZGRyLiAgKi8KLQotCSAgc3RvcCA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgc3RhcnQgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RvcCAtIChsb25nKSBpcmVsLT5yX2FkZGVuZCk7Ci0KLQkgIGlmIChzdGFydCA+IGFkZHIKLQkgICAgICAmJiBzdGFydCA8IHRvYWRkcgotCSAgICAgICYmIChzdG9wIDw9IGFkZHIgfHwgc3RvcCA+PSB0b2FkZHIpKQotCSAgICBpcmVsLT5yX2FkZGVuZCArPSBjb3VudDsKLQkgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JCSAgICYmIHN0b3AgPCB0b2FkZHIKLQkJICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQkgICAgaXJlbC0+cl9hZGRlbmQgLT0gY291bnQ7Ci0KLQkgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0gxNikKLQkgICAgdm9mZiA9IGJmZF9nZXRfc2lnbmVkXzE2IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlIGlmIChFTEYzMl9SX1RZUEUgKGlyZWwtPnJfaW5mbykgPT0gKGludCkgUl9TSF9TV0lUQ0g4KQotCSAgICB2b2ZmID0gYmZkX2dldF84IChhYmZkLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICBlbHNlCi0JICAgIHZvZmYgPSBiZmRfZ2V0X3NpZ25lZF8zMiAoYWJmZCwgY29udGVudHMgKyBucmFkZHIpOwotCSAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIHZvZmYpOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TSF9VU0VTOgotCSAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQkgIHN0b3AgPSAoYmZkX3ZtYSkgKChiZmRfc2lnbmVkX3ZtYSkgc3RhcnQKLQkJCSAgICArIChsb25nKSBpcmVsLT5yX2FkZGVuZAotCQkJICAgICsgNCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChzdGFydCA+IGFkZHIKLQkgICYmIHN0YXJ0IDwgdG9hZGRyCi0JICAmJiAoc3RvcCA8PSBhZGRyIHx8IHN0b3AgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSBjb3VudDsKLSAgICAgIGVsc2UgaWYgKHN0b3AgPiBhZGRyCi0JICAgICAgICYmIHN0b3AgPCB0b2FkZHIKLQkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQlhZGp1c3QgPSAtIGNvdW50OwotICAgICAgZWxzZQotCWFkanVzdCA9IDA7Ci0KLSAgICAgIGlmIChhZGp1c3QgIT0gMCkKLQl7Ci0JICBvaW5zbiA9IGluc247Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoICgoZW51bSBlbGZfc2hfcmVsb2NfdHlwZSkgRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUE46Ci0JICAgIGNhc2UgUl9TSF9ESVI4V1BaOgotCSAgICAgIGluc24gKz0gYWRqdXN0IC8gMjsKLQkgICAgICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBpbnNuLCBjb250ZW50cyArIG5yYWRkcik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0lORDEyVzoKLQkgICAgICBpbnNuICs9IGFkanVzdCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9ESVI4V1BMOgotCSAgICAgIEJGRF9BU1NFUlQgKGFkanVzdCA9PSBjb3VudCB8fCBjb3VudCA+PSA0KTsKLQkgICAgICBpZiAoY291bnQgPj0gNCkKLQkJaW5zbiArPSBhZGp1c3QgLyA0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoaXJlbC0+cl9vZmZzZXQgJiAzKSA9PSAwKQotCQkgICAgKytpbnNuOwotCQl9Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgY29udGVudHMgKyBucmFkZHIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUl9TSF9TV0lUQ0gxNjoKLQkgICAgICB2b2ZmICs9IGFkanVzdDsKLQkgICAgICBpZiAodm9mZiA8IC0gMHg4MDAwIHx8IHZvZmYgPj0gMHg4MDAwKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMTYgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfU1dJVENIMzI6Ci0JICAgICAgdm9mZiArPSBhZGp1c3Q7Ci0JICAgICAgYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYsIGNvbnRlbnRzICsgbnJhZGRyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfVVNFUzoKLQkgICAgICBpcmVsLT5yX2FkZGVuZCArPSBhZGp1c3Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgaXJlbC0+cl9vZmZzZXQgPSBucmFkZHI7Ci0gICAgfQotCi0gIC8qIExvb2sgdGhyb3VnaCBhbGwgdGhlIG90aGVyIHNlY3Rpb25zLiAgSWYgdGhlcmUgY29udGFpbiBhbnkgSU1NMzIKLSAgICAgcmVsb2NzIGFnYWluc3QgaW50ZXJuYWwgc3ltYm9scyB3aGljaCB3ZSBhcmUgbm90IGdvaW5nIHRvIGFkanVzdAotICAgICBiZWxvdywgd2UgbWF5IG5lZWQgdG8gYWRqdXN0IHRoZSBhZGRlbmRzLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsc2NhbiwgKmlyZWxzY2FuZW5kOwotICAgICAgYmZkX2J5dGUgKm9jb250ZW50czsKLQotICAgICAgaWYgKG8gPT0gc2VjCi0JICB8fCAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgIHx8IG8tPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgcmVsb2NzLiAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMKLSAgICAgICAgIGZhbHNlLCB3ZSBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLCB3aGVuIHdlCi0gICAgICAgICBsZWF2ZSBzaF9jb2ZmX3JlbGF4X3NlY3Rpb24uICAqLwotICAgICAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmMzJfbGlua19yZWFkX3JlbG9jcwotCQkJIChhYmZkLCBvLCAoUFRSKSBOVUxMLCAoRWxmX0ludGVybmFsX1JlbGEgKikgTlVMTCwKLQkJCSAgdHJ1ZSkpOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2NvbnRlbnRzID0gTlVMTDsKLSAgICAgIGlyZWxzY2FuZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICBmb3IgKGlyZWxzY2FuID0gaW50ZXJuYWxfcmVsb2NzOyBpcmVsc2NhbiA8IGlyZWxzY2FuZW5kOyBpcmVsc2NhbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotCi0JICAvKiBEd2FyZiBsaW5lIG51bWJlcnMgdXNlIFJfU0hfU1dJVENIMzIgcmVsb2NzLiAgKi8KLQkgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWxzY2FuLT5yX2luZm8pID09IChpbnQpIFJfU0hfU1dJVENIMzIpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHN0YXJ0LCBzdG9wOwotCSAgICAgIGJmZF9zaWduZWRfdm1hIHZvZmY7Ci0KLQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCXsKLQkJICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzICE9IE5VTEwpCi0JCSAgICBvY29udGVudHMgPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHM7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBhbHdheXMgY2FjaGUgdGhlIHNlY3Rpb24gY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgUGVyaGFwcywgaWYgaW5mby0+a2VlcF9tZW1vcnkgaXMgZmFsc2UsIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGZyZWUgdGhlbSwgaWYgd2UgYXJlIHBlcm1pdHRlZCB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHdlIGxlYXZlIHNoX2NvZmZfcmVsYXhfc2VjdGlvbi4gICovCi0JCSAgICAgIG9jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChvLT5fcmF3X3NpemUpOwotCQkgICAgICBpZiAob2NvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbywgb2NvbnRlbnRzLAotCQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnRoaXNfaGRyLmNvbnRlbnRzID0gb2NvbnRlbnRzOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzdG9wID0gaXJlbHNjYW4tPnJfb2Zmc2V0OwotCSAgICAgIHN0YXJ0Ci0JCT0gKGJmZF92bWEpICgoYmZkX3NpZ25lZF92bWEpIHN0b3AgLSAobG9uZykgaXJlbHNjYW4tPnJfYWRkZW5kKTsKLQotCSAgICAgIC8qIFNUT1AgaXMgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiwgc28gaXQgd29uJ3QgY2hhbmdlLiAgKi8KLQkgICAgICBpZiAoc3RhcnQgPiBhZGRyICYmIHN0YXJ0IDwgdG9hZGRyKQotCQlpcmVsc2Nhbi0+cl9hZGRlbmQgKz0gY291bnQ7Ci0KLQkgICAgICB2b2ZmID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgICAgc3RvcCA9IChiZmRfdm1hKSAoKGJmZF9zaWduZWRfdm1hKSBzdGFydCArIHZvZmYpOwotCi0JICAgICAgaWYgKHN0YXJ0ID4gYWRkcgotCQkgICYmIHN0YXJ0IDwgdG9hZGRyCi0JCSAgJiYgKHN0b3AgPD0gYWRkciB8fCBzdG9wID49IHRvYWRkcikpCi0JCWJmZF9wdXRfc2lnbmVkXzMyIChhYmZkLCB2b2ZmICsgY291bnQsCi0JCQkJICAgb2NvbnRlbnRzICsgaXJlbHNjYW4tPnJfb2Zmc2V0KTsKLQkgICAgICBlbHNlIGlmIChzdG9wID4gYWRkcgotCQkgICAgICAgJiYgc3RvcCA8IHRvYWRkcgotCQkgICAgICAgJiYgKHN0YXJ0IDw9IGFkZHIgfHwgc3RhcnQgPj0gdG9hZGRyKSkKLQkJYmZkX3B1dF9zaWduZWRfMzIgKGFiZmQsIHZvZmYgLSBjb3VudCwKLQkJCQkgICBvY29udGVudHMgKyBpcmVsc2Nhbi0+cl9vZmZzZXQpOwotCSAgICB9Ci0KLQkgIGlmIChFTEYzMl9SX1RZUEUgKGlyZWxzY2FuLT5yX2luZm8pICE9IChpbnQpIFJfU0hfRElSMzIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoRUxGMzJfUl9TWU0gKGlyZWxzY2FuLT5yX2luZm8pID49IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIGNvbnRpbnVlOwotCi0JICBiZmRfZWxmMzJfc3dhcF9zeW1ib2xfaW4gKGFiZmQsCi0JCQkJICAgIGV4dHN5bXMgKyBFTEYzMl9SX1NZTSAoaXJlbHNjYW4tPnJfaW5mbyksCi0JCQkJICAgICZzeW0pOwotCi0JICBpZiAoc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAgICAgJiYgKHN5bS5zdF92YWx1ZSA8PSBhZGRyCi0JCSAgfHwgc3ltLnN0X3ZhbHVlID49IHRvYWRkcikpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHZhbDsKLQotCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJewotCQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkJICAgIG9jb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50czsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGFsd2F5cyBjYWNoZSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICBQZXJoYXBzLCBpZiBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgZnJlZSB0aGVtLCBpZiB3ZSBhcmUgcGVybWl0dGVkIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd2UgbGVhdmUgc2hfY29mZl9yZWxheF9zZWN0aW9uLiAgKi8KLQkJICAgICAgb2NvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG8tPl9yYXdfc2l6ZSk7Ci0JCSAgICAgIGlmIChvY29udGVudHMgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLCBvY29udGVudHMsCi0JCQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJCQkgICAgICBvLT5fcmF3X3NpemUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgPSBvY29udGVudHM7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgICAgdmFsICs9IHN5bS5zdF92YWx1ZTsKLQkgICAgICBpZiAodmFsID4gYWRkciAmJiB2YWwgPCB0b2FkZHIpCi0JCWJmZF9wdXRfMzIgKGFiZmQsIHZhbCAtIGNvdW50LAotCQkJICAgIG9jb250ZW50cyArIGlyZWxzY2FuLT5yX29mZnNldCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFkanVzdCB0aGUgbG9jYWwgc3ltYm9scyBkZWZpbmVkIGluIHRoaXMgc2VjdGlvbi4gICovCi0gIGVzeW0gPSBleHRzeW1zOwotICBlc3ltZW5kID0gZXN5bSArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGZvciAoOyBlc3ltIDwgZXN5bWVuZDsgZXN5bSsrKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX2luIChhYmZkLCBlc3ltLCAmaXN5bSk7Ci0KLSAgICAgIGlmIChpc3ltLnN0X3NobmR4ID09IHNobmR4Ci0JICAmJiBpc3ltLnN0X3ZhbHVlID4gYWRkcgotCSAgJiYgaXN5bS5zdF92YWx1ZSA8IHRvYWRkcikKLQl7Ci0JICBpc3ltLnN0X3ZhbHVlIC09IGNvdW50OwotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAoYWJmZCwgJmlzeW0sIGVzeW0pOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IGFkanVzdCB0aGUgZ2xvYmFsIHN5bWJvbHMgZGVmaW5lZCBpbiB0aGlzIHNlY3Rpb24uICAqLwotICBlc3ltID0gZXh0c3ltcyArIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gIGVzeW1lbmQgPSBleHRzeW1zICsgKHN5bXRhYl9oZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpOwotICBmb3IgKGluZGV4ID0gMDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaW5kZXgrKykKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltIGlzeW07Ci0KLSAgICAgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJmlzeW0pOwotICAgICAgc3ltX2hhc2ggPSBlbGZfc3ltX2hhc2hlcyAoYWJmZClbaW5kZXhdOwotICAgICAgaWYgKGlzeW0uc3Rfc2huZHggPT0gc2huZHgKLQkgICYmICgoc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgKHN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbiA9PSBzZWMKLQkgICYmIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgPiBhZGRyCi0JICAmJiAoc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlIDwgdG9hZGRyKQotCXsKLQkgIChzeW1faGFzaCktPnJvb3QudS5kZWYudmFsdWUgLT0gY291bnQ7Ci0JfQotICAgIH0KLQotICAvKiBTZWUgaWYgd2UgY2FuIG1vdmUgdGhlIEFMSUdOIHJlbG9jIGZvcndhcmQuICBXZSBoYXZlIGFkanVzdGVkCi0gICAgIHJfb2Zmc2V0IGZvciBpdCBhbHJlYWR5LiAgKi8KLSAgaWYgKGlyZWxhbGlnbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgYWxpZ250bywgYWxpZ25hZGRyOwotCi0gICAgICBhbGlnbnRvID0gQkZEX0FMSUdOICh0b2FkZHIsIDEgPDwgaXJlbGFsaWduLT5yX2FkZGVuZCk7Ci0gICAgICBhbGlnbmFkZHIgPSBCRkRfQUxJR04gKGlyZWxhbGlnbi0+cl9vZmZzZXQsCi0JCQkgICAgIDEgPDwgaXJlbGFsaWduLT5yX2FkZGVuZCk7Ci0gICAgICBpZiAoYWxpZ250byAhPSBhbGlnbmFkZHIpCi0JewotCSAgLyogVGFpbCByZWN1cnNpb24uICAqLwotCSAgcmV0dXJuIHNoX2VsZl9yZWxheF9kZWxldGVfYnl0ZXMgKGFiZmQsIHNlYywgYWxpZ25hZGRyLAotCQkJCQkgICAgYWxpZ250byAtIGFsaWduYWRkcik7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayBmb3IgbG9hZHMgYW5kIHN0b3JlcyB3aGljaCB3ZSBjYW4gYWxpZ24gdG8gZm91ciBieXRlCi0gICBib3VuZGFyaWVzLiAgVGhpcyBpcyBsaWtlIHNoX2FsaWduX2xvYWRzIGluIGNvZmYtc2guYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfYWxpZ25fbG9hZHMgKGFiZmQsIHNlYywgaW50ZXJuYWxfcmVsb2NzLCBjb250ZW50cywgcHN3YXBwZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICpwc3dhcHBlZDsKLXsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfdm1hICpsYWJlbHMgPSBOVUxMOwotICBiZmRfdm1hICpsYWJlbCwgKmxhYmVsX2VuZDsKLQotICAqcHN3YXBwZWQgPSBmYWxzZTsKLQotICBpcmVsZW5kID0gaW50ZXJuYWxfcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLQotICAvKiBHZXQgYWxsIHRoZSBhZGRyZXNzZXMgd2l0aCBsYWJlbHMgb24gdGhlbS4gICovCi0gIGxhYmVscyA9IChiZmRfdm1hICopIGJmZF9tYWxsb2MgKHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGJmZF92bWEpKTsKLSAgaWYgKGxhYmVscyA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBsYWJlbF9lbmQgPSBsYWJlbHM7Ci0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pID09IChpbnQpIFJfU0hfTEFCRUwpCi0JewotCSAgKmxhYmVsX2VuZCA9IGlyZWwtPnJfb2Zmc2V0OwotCSAgKytsYWJlbF9lbmQ7Ci0JfQotICAgIH0KLQotICAvKiBOb3RlIHRoYXQgdGhlIGFzc2VtYmxlciBjdXJyZW50bHkgYWx3YXlzIG91dHB1dHMgcmVsb2NzIGluCi0gICAgIGFkZHJlc3Mgb3JkZXIuICBJZiB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBzb3J0Ci0gICAgIHRoZSBsYWJlbCB2YWx1ZXMgYW5kIHRoZSByZWxvY3MuICAqLwotCi0gIGxhYmVsID0gbGFiZWxzOwotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN0YXJ0LCBzdG9wOwotCi0gICAgICBpZiAoRUxGMzJfUl9UWVBFIChpcmVsLT5yX2luZm8pICE9IChpbnQpIFJfU0hfQ09ERSkKLQljb250aW51ZTsKLQotICAgICAgc3RhcnQgPSBpcmVsLT5yX29mZnNldDsKLQotICAgICAgZm9yIChpcmVsKys7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0JaWYgKEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKSA9PSAoaW50KSBSX1NIX0RBVEEpCi0JICBicmVhazsKLSAgICAgIGlmIChpcmVsIDwgaXJlbGVuZCkKLQlzdG9wID0gaXJlbC0+cl9vZmZzZXQ7Ci0gICAgICBlbHNlCi0Jc3RvcCA9IHNlYy0+X2Nvb2tlZF9zaXplOwotCi0gICAgICBpZiAoISBfYmZkX3NoX2FsaWduX2xvYWRfc3BhbiAoYWJmZCwgc2VjLCBjb250ZW50cywgc2hfZWxmX3N3YXBfaW5zbnMsCi0JCQkJICAgICAoUFRSKSBpbnRlcm5hbF9yZWxvY3MsICZsYWJlbCwKLQkJCQkgICAgIGxhYmVsX2VuZCwgc3RhcnQsIHN0b3AsIHBzd2FwcGVkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZnJlZSAobGFiZWxzKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGxhYmVscyAhPSBOVUxMKQotICAgIGZyZWUgKGxhYmVscyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU3dhcCB0d28gU0ggaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyBsaWtlIHNoX3N3YXBfaW5zbnMgaW4gY29mZi1zaC5jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNoX2VsZl9zd2FwX2luc25zIChhYmZkLCBzZWMsIHJlbG9jcywgY29udGVudHMsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHJlbG9jczsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSAoRWxmX0ludGVybmFsX1JlbGEgKikgcmVsb2NzOwotICB1bnNpZ25lZCBzaG9ydCBpMSwgaTI7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCAqaXJlbGVuZDsKLQotICAvKiBTd2FwIHRoZSBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gICovCi0gIGkxID0gYmZkX2dldF8xNiAoYWJmZCwgY29udGVudHMgKyBhZGRyKTsKLSAgaTIgPSBiZmRfZ2V0XzE2IChhYmZkLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgaTIsIGNvbnRlbnRzICsgYWRkcik7Ci0gIGJmZF9wdXRfMTYgKGFiZmQsIGkxLCBjb250ZW50cyArIGFkZHIgKyAyKTsKLQotICAvKiBBZGp1c3QgYWxsIHJlbG9jIGFkZHJlc3Nlcy4gICovCi0gIGlyZWxlbmQgPSBpbnRlcm5hbF9yZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyspCi0gICAgewotICAgICAgZW51bSBlbGZfc2hfcmVsb2NfdHlwZSB0eXBlOwotICAgICAgaW50IGFkZDsKLQotICAgICAgLyogVGhlcmUgYXJlIGEgZmV3IHNwZWNpYWwgdHlwZXMgb2YgcmVsb2NzIHRoYXQgd2UgZG9uJ3Qgd2FudCB0bwotICAgICAgICAgYWRqdXN0LiAgVGhlc2UgcmVsb2NzIGRvIG5vdCBhcHBseSB0byB0aGUgaW5zdHJ1Y3Rpb24gaXRzZWxmLAotICAgICAgICAgYnV0IGFyZSBvbmx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWRkcmVzcy4gICovCi0gICAgICB0eXBlID0gKGVudW0gZWxmX3NoX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAoaXJlbC0+cl9pbmZvKTsKLSAgICAgIGlmICh0eXBlID09IFJfU0hfQUxJR04KLQkgIHx8IHR5cGUgPT0gUl9TSF9DT0RFCi0JICB8fCB0eXBlID09IFJfU0hfREFUQQotCSAgfHwgdHlwZSA9PSBSX1NIX0xBQkVMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiBhbiBSX1NIX1VTRVMgcmVsb2MgcG9pbnRzIHRvIG9uZSBvZiB0aGUgYWRkcmVzc2VzIGJlaW5nCi0gICAgICAgICBzd2FwcGVkLCB3ZSBtdXN0IGFkanVzdCBpdC4gIEl0IHdvdWxkIGJlIGluY29ycmVjdCB0byBkbyB0aGlzCi0gICAgICAgICBmb3IgYSBqdW1wLCB0aG91Z2gsIHNpbmNlIHdlIHdhbnQgdG8gZXhlY3V0ZSBib3RoCi0gICAgICAgICBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIGp1bXAuICAoV2UgaGF2ZSBhdm9pZGVkIHN3YXBwaW5nCi0gICAgICAgICBhcm91bmQgYSBsYWJlbCwgc28gdGhlIGp1bXAgd2lsbCBub3Qgd2luZCB1cCBleGVjdXRpbmcgYW4KLSAgICAgICAgIGluc3RydWN0aW9uIGl0IHNob3VsZG4ndCkuICAqLwotICAgICAgaWYgKHR5cGUgPT0gUl9TSF9VU0VTKQotCXsKLQkgIGJmZF92bWEgb2ZmOwotCi0JICBvZmYgPSBpcmVsLT5yX29mZnNldCArIDQgKyBpcmVsLT5yX2FkZGVuZDsKLQkgIGlmIChvZmYgPT0gYWRkcikKLQkgICAgaXJlbC0+cl9vZmZzZXQgKz0gMjsKLQkgIGVsc2UgaWYgKG9mZiA9PSBhZGRyICsgMikKLQkgICAgaXJlbC0+cl9vZmZzZXQgLT0gMjsKLQl9Ci0KLSAgICAgIGlmIChpcmVsLT5yX29mZnNldCA9PSBhZGRyKQotCXsKLQkgIGlyZWwtPnJfb2Zmc2V0ICs9IDI7Ci0JICBhZGQgPSAtMjsKLQl9Ci0gICAgICBlbHNlIGlmIChpcmVsLT5yX29mZnNldCA9PSBhZGRyICsgMikKLQl7Ci0JICBpcmVsLT5yX29mZnNldCAtPSAyOwotCSAgYWRkID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JYWRkID0gMDsKLQotICAgICAgaWYgKGFkZCAhPSAwKQotCXsKLQkgIGJmZF9ieXRlICpsb2M7Ci0JICB1bnNpZ25lZCBzaG9ydCBpbnNuLCBvaW5zbjsKLQkgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0KLQkgIGxvYyA9IGNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQ7Ci0JICBvdmVyZmxvdyA9IGZhbHNlOwotCSAgc3dpdGNoICh0eXBlKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSX1NIX0RJUjhXUE46Ci0JICAgIGNhc2UgUl9TSF9ESVI4V1BaOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZmYwMCkgIT0gKGluc24gJiAweGZmMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfSU5EMTJXOgotCSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBsb2MpOwotCSAgICAgIG9pbnNuID0gaW5zbjsKLQkgICAgICBpbnNuICs9IGFkZCAvIDI7Ci0JICAgICAgaWYgKChvaW5zbiAmIDB4ZjAwMCkgIT0gKGluc24gJiAweGYwMDApKQotCQlvdmVyZmxvdyA9IHRydWU7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFJfU0hfRElSOFdQTDoKLQkgICAgICAvKiBUaGlzIHJlbG9jIGlnbm9yZXMgdGhlIGxlYXN0IHNpZ25pZmljYW50IDMgYml0cyBvZgotICAgICAgICAgICAgICAgICB0aGUgcHJvZ3JhbSBjb3VudGVyIGJlZm9yZSBhZGRpbmcgaW4gdGhlIG9mZnNldC4KLSAgICAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IGlmIEFERFIgaXMgYXQgYW4gZXZlbiBhZGRyZXNzLCB0aGUKLSAgICAgICAgICAgICAgICAgc3dhcCB3aWxsIG5vdCBhZmZlY3QgdGhlIG9mZnNldC4gIElmIEFERFIgaXMgYW4gYXQgYW4KLSAgICAgICAgICAgICAgICAgb2RkIGFkZHJlc3MsIHRoZW4gdGhlIGluc3RydWN0aW9uIHdpbGwgYmUgY3Jvc3NpbmcgYQotICAgICAgICAgICAgICAgICBmb3VyIGJ5dGUgYm91bmRhcnksIGFuZCBtdXN0IGJlIGFkanVzdGVkLiAgKi8KLQkgICAgICBpZiAoKGFkZHIgJiAzKSAhPSAwKQotCQl7Ci0JCSAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGxvYyk7Ci0JCSAgb2luc24gPSBpbnNuOwotCQkgIGluc24gKz0gYWRkIC8gMjsKLQkJICBpZiAoKG9pbnNuICYgMHhmZjAwKSAhPSAoaW5zbiAmIDB4ZmYwMCkpCi0JCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgaW5zbiwgbG9jKTsKLQkJfQotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKG92ZXJmbG93KQotCSAgICB7Ci0JICAgICAgKCgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAgICAoXygiJXM6IDB4JWx4OiBmYXRhbDogcmVsb2Mgb3ZlcmZsb3cgd2hpbGUgcmVsYXhpbmciKSwKLQkJYmZkX2dldF9maWxlbmFtZSAoYWJmZCksICh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBSZWxvY2F0ZSBhbiBTSCBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJIGNvbnRlbnRzLCByZWxvY3MsIGxvY2FsX3N5bXMsIGxvY2FsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqbG9jYWxfc3ltczsKLSAgICAgYXNlY3Rpb24gKipsb2NhbF9zZWN0aW9uczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfdm1hIGFkZGVuZCA9IChiZmRfdm1hKTA7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0gICAgICAgICAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotICAgICAgICAgICAgIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBhZGp1c3QgYWNjb3JkaW5nIHRvIHdoZXJlIHRoZQotICAgICAgICAgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICAvKiBNYW55IG9mIHRoZSByZWxvY3MgYXJlIG9ubHkgdXNlZCBmb3IgcmVsYXhpbmcsIGFuZCBhcmUKLSAgICAgICAgIGhhbmRsZWQgZW50aXJlbHkgYnkgdGhlIHJlbGF4YXRpb24gY29kZS4gICovCi0gICAgICBpZiAocl90eXBlID4gKGludCkgUl9TSF9MQVNUX0lOVkFMSURfUkVMT0MpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgPCAwCi0JICB8fCByX3R5cGUgPj0gKGludCkgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgY2VydGFpbmx5IGluY29ycmVjdC4gIEhvd2V2ZXIsIGl0IGlzIGhvdyB0aGUKLSAgICAgICAgIENPRkYgbGlua2VyIHdvcmtzLiAgKi8KLSAgICAgIGlmIChyX3R5cGUgIT0gKGludCkgUl9TSF9ESVIzMgotCSAgJiYgcl90eXBlICE9IChpbnQpIFJfU0hfSU5EMTJXKQotCWNvbnRpbnVlOwotCi0gICAgICBob3d0byA9IHNoX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogVGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGZvciBhbiBpbnRlcm5hbCBJTkQxMlcKLSAgICAgICAgICAgICByZWxvY2F0aW9uLiAgRklYTUU6IFRoaXMgaXMgcHJvYmFibHkgd3JvbmcsIGJ1dCBpdCdzIGhvdwotICAgICAgICAgICAgIHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotCSAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQkgICAgY29udGludWU7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgICAgICByZWxvY2F0aW9uID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRklYTUU6IFRoaXMgaXMgaG93IHRoZSBDT0ZGIHJlbG9jYXRpb25zIHdvcmsuICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSAoaW50KSBSX1NIX0lORDEyVykKLQlyZWxvY2F0aW9uIC09IDQ7Ci0KLSAgICAgIHN3aXRjaCAoKGludClyX3R5cGUpCi0JewotCWNhc2UgKGludClSX1NIX0RJUjMyOgotCSAgYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ09GRiByZWxvY3MgZG9uJ3QgdXNlIHRoZSBhZGRlbmQuIFRoZSBhZGRlbmQgaXMgdXNlZCBmb3IgUl9TSF9ESVIzMiAKLQkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG90aGVyIGNvbXBpbGVycy4gKi8KLSAgICAgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJICAgIGNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LAotCQkJCSAgICByZWxvY2F0aW9uLCBhZGRlbmQpOwotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JCSAgICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICAgICAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkJICB9Ci0JCWlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgICAgICAoaW5mbywgbmFtZSwgaG93dG8tPm5hbWUsIChiZmRfdm1hKSAwLAotCQkJaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgYSB2ZXJzaW9uIG9mIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotICAgd2hpY2ggdXNlcyBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbi4gICovCi0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1zaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsCi0JCQkJCWRhdGEsIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbjsKLSAgYmZkICppbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKipzZWN0aW9ucyA9IE5VTEw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICBFbGYzMl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIHJlbGF4aW5nLCBvciBvZiBoYXZpbmcgYQotICAgICBwYXJ0aWN1bGFyIHNldCBvZiBzZWN0aW9uIGNvbnRlbnRzLCBzcGVjaWFsbHkuICAqLwotICBpZiAocmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJCSAgICAgICByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgbWVtY3B5IChkYXRhLCBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+dGhpc19oZHIuY29udGVudHMsCi0JICBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCi0gIGlmICgoaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAKLSAgICAgICYmIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICppc3ltcDsKLSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9TeW0gKmVzeW0sICplc3ltZW5kOwotCi0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMgIT0gTlVMTCkKLQlleHRlcm5hbF9zeW1zID0gKEVsZjMyX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBleHRlcm5hbF9zeW1zID0gKChFbGYzMl9FeHRlcm5hbF9TeW0gKikKLQkJCSAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAgICAgKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKTsKLQkgIGlmIChleHRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgICAgICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfU3ltKSwKLQkJCSAgICBzeW10YWJfaGRyLT5zaF9pbmZvLCBpbnB1dF9iZmQpCi0JCSAgIT0gKHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1N5bSkpKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSAoX2JmZF9lbGYzMl9saW5rX3JlYWRfcmVsb2NzCi0JCQkgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgKFBUUikgTlVMTCwKLQkJCSAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGludGVybmFsX3N5bXMgPSAoKEVsZl9JbnRlcm5hbF9TeW0gKikKLQkJICAgICAgIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCQkgICAqIHNpemVvZiAoRWxmX0ludGVybmFsX1N5bSkpKTsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgc3ltdGFiX2hkci0+c2hfaW5mbyA+IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNlY3Rpb25zID0gKGFzZWN0aW9uICoqKSBiZmRfbWFsbG9jIChzeW10YWJfaGRyLT5zaF9pbmZvCi0JCQkJCSAgICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0gICAgICBpZiAoc2VjdGlvbnMgPT0gTlVMTCAmJiBzeW10YWJfaGRyLT5zaF9pbmZvID4gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaXN5bXAgPSBpbnRlcm5hbF9zeW1zOwotICAgICAgc2VjcHAgPSBzZWN0aW9uczsKLSAgICAgIGVzeW0gPSBleHRlcm5hbF9zeW1zOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZm9yICg7IGVzeW0gPCBlc3ltZW5kOyArK2VzeW0sICsraXN5bXAsICsrc2VjcHApCi0JewotCSAgYXNlY3Rpb24gKmlzZWM7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCBlc3ltLCBpc3ltcCk7Ci0KLQkgIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCSAgICBpc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW1wLT5zdF9zaG5keCA+IDAgJiYgaXN5bXAtPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgaXNlYyA9IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChpbnB1dF9iZmQsIGlzeW1wLT5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0FCUykKLQkgICAgaXNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltcC0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgaXNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXaG8ga25vd3M/ICAqLwotCSAgICAgIGlzZWMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpzZWNwcCA9IGlzZWM7Ci0JfQotCi0gICAgICBpZiAoISBzaF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgbGlua19pbmZvLCBpbnB1dF9iZmQsCi0JCQkJICAgICBpbnB1dF9zZWN0aW9uLCBkYXRhLCBpbnRlcm5hbF9yZWxvY3MsCi0JCQkJICAgICBpbnRlcm5hbF9zeW1zLCBzZWN0aW9ucykpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotCWZyZWUgKHNlY3Rpb25zKTsKLSAgICAgIHNlY3Rpb25zID0gTlVMTDsKLSAgICAgIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0JZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gICAgICBpbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgICAgIGlmIChleHRlcm5hbF9zeW1zICE9IE5VTEwgJiYgc3ltdGFiX2hkci0+Y29udGVudHMgPT0gTlVMTCkKLQlmcmVlIChleHRlcm5hbF9zeW1zKTsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBOVUxMOwotICAgICAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+cmVsb2NzKQotCWZyZWUgKGludGVybmFsX3JlbG9jcyk7Ci0gICAgICBpbnRlcm5hbF9yZWxvY3MgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gZGF0YTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGludGVybmFsX3JlbG9jcyAhPSBOVUxMCi0gICAgICAmJiBpbnRlcm5hbF9yZWxvY3MgIT0gZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbG9jcykKLSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZXh0ZXJuYWxfc3ltcyAhPSBOVUxMICYmIHN5bXRhYl9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgZnJlZSAoZXh0ZXJuYWxfc3ltcyk7Ci0gIGlmIChpbnRlcm5hbF9zeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoaW50ZXJuYWxfc3ltcyk7Ci0gIGlmIChzZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHNlY3Rpb25zKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci1zdGF0aWMgYXNlY3Rpb24gKgotc2hfZWxmX2djX21hcmtfaG9vayAoYWJmZCwgaW5mbywgcmVsLCBoLCBzeW0pCi0gICAgICAgYmZkICphYmZkOwotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWw7Ci0gICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotewotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfU0hfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhc2UgUl9TSF9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc2hfZWxmX2djX3N3ZWVwX2hvb2sgKGFiZmQsIGluZm8sIHNlYywgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotewotICAvKiB3ZSBkb24ndCB1c2UgZ290IGFuZCBwbHQgZW50cmllcyBmb3Igc2guICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UuCi0gICBTaW5jZSB3ZSBkb24ndCBkbyAuZ290cyBvciAucGx0cywgd2UganVzdCBuZWVkIHRvIGNvbnNpZGVyIHRoZQotICAgdmlydHVhbCB0YWJsZSByZWxvY3MgZm9yIGdjLiAgKi8KLSAKLXN0YXRpYyBib29sZWFuCi1zaF9lbGZfY2hlY2tfcmVsb2NzIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0gCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3ltX2hhc2hlc19lbmQgPSBzeW1faGFzaGVzICsgc3ltdGFiX2hkci0+c2hfc2l6ZS9zaXplb2YoRWxmMzJfRXh0ZXJuYWxfU3ltKTsKLSAgaWYgKCFlbGZfYmFkX3N5bXRhYiAoYWJmZCkpCi0gICAgc3ltX2hhc2hlc19lbmQgLT0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAKLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotICAgICAgICBoID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLSAKLSAgICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICAgIHsKLSAgICAgICAgLyogVGhpcyByZWxvY2F0aW9uIGRlc2NyaWJlcyB0aGUgQysrIG9iamVjdCB2dGFibGUgaGllcmFyY2h5LgotICAgICAgICAgICBSZWNvbnN0cnVjdCBpdCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9TSF9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotIAotICAgICAgICAvKiBUaGlzIHJlbG9jYXRpb24gZGVzY3JpYmVzIHdoaWNoIEMrKyB2dGFibGUgZW50cmllcyBhcmUgYWN0dWFsbHkKLSAgICAgICAgICAgdXNlZC4gIFJlY29yZCBmb3IgbGF0ZXIgdXNlIGR1cmluZyBHQy4gICovCi0gICAgICAgIGNhc2UgUl9TSF9HTlVfVlRFTlRSWToKLSAgICAgICAgICBpZiAoIV9iZmRfZWxmMzJfZ2NfcmVjb3JkX3Z0ZW50cnkgKGFiZmQsIHNlYywgaCwgcmVsLT5yX2FkZGVuZCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQliZmRfZWxmMzJfc2hfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJImVsZjMyLXNoIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQliZmRfZWxmMzJfc2hsX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJImVsZjMyLXNobCIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX3NoCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJRU1fU0gKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFCQkweDEKLQotI2RlZmluZSBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciAnXycKLQotI2RlZmluZSBiZmRfZWxmMzJfYmZkX3JlbG9jX3R5cGVfbG9va3VwCXNoX2VsZl9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJc2hfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9yZWxheF9zZWN0aW9uCXNoX2VsZl9yZWxheF9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24Jc2hfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotCQkJCQlzaF9lbGZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rICAgICAgICBzaF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgc2hfZWxmX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzICAgICAgICBzaF9lbGZfY2hlY2tfcmVsb2NzCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLSNpbmNsdWRlICJlbGYzMi10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGYzMi1zcGFyYy5jIGIvYmZkL2VsZjMyLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjcwMmMuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcxICswLDAgQEAKLS8qIFNQQVJDLXNwZWNpZmljIHN1cHBvcnQgZm9yIDMyLWJpdCBFTEYKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmMzJfc3BhcmNfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX2FkanVzdF9keW5pbmR4Ci0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICAgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmMzJfc3BhcmNfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjMyX3NwYXJjX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBlbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0MCi0vKiBUaGUgcmVsb2NhdGlvbiAiaG93dG8iIHRhYmxlLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzcGFyY19lbGZfd2Rpc3AxNl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotcmVsb2NfaG93dG9fdHlwZSBfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QTFQzMiwgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QTFQzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVBMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19MT1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDMyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDMyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ1BMVDEwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18xMCwgICAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzEwIiwgICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTEsICAgICAgICAwLDIsMTEsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMSIsICAgICAgZmFsc2UsMCwweDAwMDAwN2ZmLHRydWUpLAotICAvKiBUaGVzZSBhcmUgZm9yIHNwYXJjNjQgaW4gYSA2NCBiaXQgZW52aXJvbm1lbnQuCi0gICAgIFZhbHVlcyBuZWVkIHRvIGJlIGhlcmUgYmVjYXVzZSB0aGUgdGFibGUgaXMgaW5kZXhlZCBieSByZWxvYyBudW1iZXIuICAqLwotICBIT1dUTyhSX1NQQVJDXzY0LCAgICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfT0xPMTAiLCAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISDIyLCAgICAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19ISDIyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hNMTAsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfTE0yMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ISDIyLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MsICAiUl9TUEFSQ19QQ19ISDIyIiwgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hNMTAsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cHBvcnRlZF9yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwcG9ydGVkX3JlbG9jLCAgIlJfU1BBUkNfUENfTE0yMiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgLyogRW5kIHNwYXJjNjQgaW4gNjQgYml0IGVudmlyb25tZW50IHZhbHVlcy4KLSAgICAgVGhlIGZvbGxvd2luZyBhcmUgZm9yIHNwYXJjNjQgaW4gYSAzMiBiaXQgZW52aXJvbm1lbnQuICAqLwotICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTk9ORSwgICAgICAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19OT05FIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgICAgMCwwLCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVWMzIsICAgICAgMCwyLDMyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUkVWMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLX07Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGluaGVyaXRfaG93dG8gPQotICBIT1dUTyAoUl9TUEFSQ19HTlVfVlRJTkhFUklULCAwLDIsMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsIE5VTEwsICJSX1NQQVJDX0dOVV9WVElOSEVSSVQiLCBmYWxzZSwwLCAwLCBmYWxzZSk7Ci1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9zcGFyY192dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfU1BBUkNfR05VX1ZURU5UUlksIDAsMiwwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwiUl9TUEFSQ19HTlVfVlRFTlRSWSIsIGZhbHNlLDAsMCwgZmFsc2UpOwotCi0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KLS8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLSAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAotICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAotICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKLSAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX1JFVjMyLCBSX1NQQVJDX1JFVjMyIH0sCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsIFJfU1BBUkNfR05VX1ZUSU5IRVJJVH0sCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCBSX1NQQVJDX0dOVV9WVEVOVFJZfSwKLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX3NwYXJjX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICByZXR1cm4gJmVsZjMyX3NwYXJjX3Z0aW5oZXJpdF9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIHJldHVybiAmZWxmMzJfc3BhcmNfdnRlbnRyeV9ob3d0bzsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChzcGFyY19yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgICByZXR1cm4gJl9iZmRfc3BhcmNfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogV2UgbmVlZCB0byB1c2UgRUxGMzJfUl9UWVBFIHNvIHdlIGhhdmUgb3VyIG93biBjb3B5IG9mIHRoaXMgZnVuY3Rpb24sCi0gICBhbmQgZWxmNjQtc3BhcmMuYyBoYXMgaXRzIG93biBjb3B5LiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8gKGFiZmQsIGNhY2hlX3B0ciwgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgc3dpdGNoIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pKQotICAgIHsKLSAgICBjYXNlIFJfU1BBUkNfR05VX1ZUSU5IRVJJVDoKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmZWxmMzJfc3BhcmNfdnRpbmhlcml0X2hvd3RvOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfU1BBUkNfR05VX1ZURU5UUlk6Ci0gICAgICBjYWNoZV9wdHItPmhvd3RvID0gJmVsZjMyX3NwYXJjX3Z0ZW50cnlfaG93dG87Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCRkRfQVNTRVJUIChFTEYzMl9SX1RZUEUoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXhfc3RkKTsKLSAgICAgIGNhY2hlX3B0ci0+aG93dG8gPSAmX2JmZF9zcGFyY19lbGZfaG93dG9fdGFibGVbRUxGMzJfUl9UWVBFKGRzdC0+cl9pbmZvKV07Ci0gICAgfQotfQotDAotLyogRm9yIHVuc3VwcG9ydGVkIHJlbG9jcy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9ub3RzdXBwb3J0ZWRfcmVsb2MgKGFiZmQsCi0JCQkgICAgIHJlbG9jX2VudHJ5LAotCQkJICAgICBzeW1ib2wsCi0JCQkgICAgIGRhdGEsCi0JCQkgICAgIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgIG91dHB1dF9iZmQsCi0JCQkgICAgIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotLyogSGFuZGxlIHRoZSBXRElTUDE2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MgKGFiZmQsCi0JCQkgcmVsb2NfZW50cnksCi0JCQkgc3ltYm9sLAotCQkJIGRhdGEsCi0JCQkgaW5wdXRfc2VjdGlvbiwKLQkJCSBvdXRwdXRfYmZkLAotCQkJIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgeDsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISByZWxvY19lbnRyeS0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZQotCSAgfHwgcmVsb2NfZW50cnktPmFkZGVuZCA9PSAwKSkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09CShpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICByZWxvY2F0aW9uIC09IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotCi0gIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQl8ICgocmVsb2NhdGlvbiA+PiAyKSAmIDB4M2ZmZikpOwotICBiZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBpZiAoKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uIDwgLSAweDQwMDAwCi0gICAgICB8fCAoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPiAweDNmZmZmKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gIGVsc2UKLSAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotDAotLyogRnVuY3Rpb25zIGZvciB0aGUgU1BBUkMgRUxGIGxpbmtlci4gICovCi0KLS8qIFRoZSBuYW1lIG9mIHRoZSBkeW5hbWljIGludGVycHJldGVyLiAgVGhpcyBpcyBwdXQgaW4gdGhlIC5pbnRlcnAKLSAgIHNlY3Rpb24uICAqLwotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9sZC5zby4xIgotCi0vKiBUaGUgbm9wIG9wY29kZSB3ZSB1c2UuICAqLwotCi0jZGVmaW5lIFNQQVJDX05PUCAweDAxMDAwMDAwCi0KLS8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0KLSNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTIKLQotLyogVGhlIGZpcnN0IGZvdXIgZW50cmllcyBpbiBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFyZSByZXNlcnZlZCwKLSAgIGFuZCB0aGUgaW5pdGlhbCBjb250ZW50cyBhcmUgdW5pbXBvcnRhbnQgKHdlIHplcm8gdGhlbSBvdXQpLgotICAgU3Vic2VxdWVudCBlbnRyaWVzIGxvb2sgbGlrZSB0aGlzLiAgU2VlIHRoZSBTVlI0IEFCSSBTUEFSQwotICAgc3VwcGxlbWVudCB0byBzZWUgaG93IHRoaXMgd29ya3MuICAqLwotCi0vKiBzZXRoaSAlaGkoLi0ucGx0MCksJWcxLiAgV2UgZmlsbCBpbiB0aGUgYWRkcmVzcyBsYXRlci4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMCAweDAzMDAwMDAwCi0vKiBiLGEgLnBsdDAuICBXZSBmaWxsIGluIHRoZSBvZmZzZXQgbGF0ZXIuICAqLwotI2RlZmluZSBQTFRfRU5UUllfV09SRDEgMHgzMDgwMDAwMAotLyogbm9wLiAgKi8KLSNkZWZpbmUgUExUX0VOVFJZX1dPUkQyIFNQQVJDX05PUAotCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gIGxvY2FsX2dvdF9vZmZzZXRzID0gZWxmX2xvY2FsX2dvdF9vZmZzZXRzIChhYmZkKTsKLQotICBzZ290ID0gTlVMTDsKLSAgc3JlbGdvdCA9IE5VTEw7Ci0gIHNyZWxvYyA9IE5VTEw7Ci0KLSAgcmVsX2VuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxfZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JaCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLQl7Ci0JY2FzZSBSX1NQQVJDX0dPVDEwOgotCWNhc2UgUl9TUEFSQ19HT1QxMzoKLQljYXNlIFJfU1BBUkNfR09UMjI6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkuICAqLwotCi0JICBpZiAoZHlub2JqID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBkeW5vYmogPSBhYmZkOwotCSAgICAgIGlmICghIF9iZmRfZWxmX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoZHlub2JqLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzZ290ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIGlmIChzcmVsZ290ID09IE5VTEwKLQkgICAgICAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDIpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmMzJfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbGEpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDQ7Ci0KLQkgIC8qIElmIHRoZSAuZ290IHNlY3Rpb24gaXMgbW9yZSB0aGFuIDB4MTAwMCBieXRlcywgd2UgYWRkCi0JICAgICAweDEwMDAgdG8gdGhlIHZhbHVlIG9mIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXywgc28gdGhhdCAxMwotCSAgICAgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPj0gMHgxMDAwCi0JICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlID09IDApCi0JICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCSAgLyogVGhpcyBzeW1ib2wgcmVxdWlyZXMgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBlbnRyeS4gIFdlCi0gICAgICAgICAgICAgYWN0dWFsbHkgYnVpbGQgdGhlIGVudHJ5IGluIGFkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgICAgICAgICAgICBiZWNhdXNlIHRoaXMgbWlnaHQgYmUgYSBjYXNlIG9mIGxpbmtpbmcgUElDIGNvZGUgd2l0aG91dAotICAgICAgICAgICAgIGxpbmtpbmcgaW4gYW55IGR5bmFtaWMgb2JqZWN0cywgaW4gd2hpY2ggY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgIG5lZWQgdG8gZ2VuZXJhdGUgYSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBhZnRlciBhbGwuICAqLwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgV1BMVDMwCi0gICAgICAgICAgICAgICAgIHJlbG9jIGZvciBhIGxvY2FsIHN5bWJvbCBpZiB5b3UgYXNzZW1ibGUgYSBjYWxsIGZyb20KLSAgICAgICAgICAgICAgICAgb25lIHNlY3Rpb24gdG8gYW5vdGhlciB3aGVuIHVzaW5nIC1LIHBpYy4gIFdlIHRyZWF0Ci0gICAgICAgICAgICAgICAgIGl0IGFzIFdESVNQMzAuICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9lbGYzMl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0JICBicmVhazsKLQotCWNhc2UgUl9TUEFSQ19QQzEwOgotCWNhc2UgUl9TUEFSQ19QQzIyOgotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JY2FzZSBSX1NQQVJDX0RJU1AxNjoKLQljYXNlIFJfU1BBUkNfRElTUDMyOgotCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCWNhc2UgUl9TUEFSQ19XRElTUDIyOgotCWNhc2UgUl9TUEFSQ19XRElTUDE5OgotCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCSAgLyogSWYgd2UgYXJlIGxpbmtpbmcgd2l0aCAtQnN5bWJvbGljLCB3ZSBkbyBub3QgbmVlZCB0byBjb3B5Ci0gICAgICAgICAgICAgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aGljaCBpcwotICAgICAgICAgICAgIGRlZmluZWQgaW4gYW4gb2JqZWN0IHdlIGFyZSBpbmNsdWRpbmcgaW4gdGhlIGxpbmsgKGkuZS4sCi0gICAgICAgICAgICAgREVGX1JFR1VMQVIgaXMgc2V0KS4gIEZJWE1FOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgbm90Ci0gICAgICAgICAgICAgc2VlbiBhbGwgdGhlIGlucHV0IGZpbGVzLCBzbyBpdCBpcyBwb3NzaWJsZSB0aGF0Ci0gICAgICAgICAgICAgREVGX1JFR1VMQVIgaXMgbm90IHNldCBub3cgYnV0IHdpbGwgYmUgc2V0IGxhdGVyIChpdCBpcwotICAgICAgICAgICAgIG5ldmVyIGNsZWFyZWQpLiAgVGhpcyBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGluCi0gICAgICAgICAgICAgZWxmMzItaTM4Ni5jLiAgKi8KLQkgIGlmIChoID09IE5VTEwKLQkgICAgICB8fCAoaW5mby0+c3ltYm9saWMKLQkJICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBSX1NQQVJDXzg6Ci0JY2FzZSBSX1NQQVJDXzE2OgotCWNhc2UgUl9TUEFSQ18zMjoKLQljYXNlIFJfU1BBUkNfSEkyMjoKLQljYXNlIFJfU1BBUkNfMjI6Ci0JY2FzZSBSX1NQQVJDXzEzOgotCWNhc2UgUl9TUEFSQ19MTzEwOgotCWNhc2UgUl9TUEFSQ19VQTMyOgotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIC8qIFdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBtdXN0IGNvcHkgdGhlc2UKLSAgICAgICAgICAgICAgICAgcmVsb2NzIGludG8gdGhlIG91dHB1dCBmaWxlLiAgV2UgY3JlYXRlIGEgcmVsb2MKLSAgICAgICAgICAgICAgICAgc2VjdGlvbiBpbiBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAgKi8KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQ6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGluaGVyaXQgKGFiZmQsIHNlYywgaCwgcmVsLT5yX29mZnNldCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVEVOVFJZOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRlbnRyeSAoYWJmZCwgc2VjLCBoLCByZWwtPnJfYWRkZW5kKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0KLSAgaWYgKGggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pKQotICAgICAgewotICAgICAgY2FzZSBSX1NQQVJDX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfU1BBUkNfR05VX1ZURU5UUlk6Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0gICAgICAgICAgICByZXR1cm4gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCi0gICAgICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLSAgIGVsc2UKLSAgICAgewotICAgICAgIGlmICghKGVsZl9iYWRfc3ltdGFiIChhYmZkKQotICAgICAgICAgICAmJiBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKSAhPSBTVEJfTE9DQUwpCi0gICAgICAgICAmJiAhICgoc3ltLT5zdF9zaG5keCA8PSAwIHx8IHN5bS0+c3Rfc2huZHggPj0gU0hOX0xPUkVTRVJWRSkKLSAgICAgICAgICAgICAgICAmJiBzeW0tPnN0X3NobmR4ICE9IFNITl9DT01NT04pKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgc3ltLT5zdF9zaG5keCk7Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBVcGRhdGUgdGhlIGdvdCBlbnRyeSByZWZlcmVuY2UgY291bnRzIGZvciB0aGUgc2VjdGlvbiBiZWluZyByZW1vdmVkLiAgKi8KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19nY19zd2VlcF9ob29rIChhYmZkLCBpbmZvLCBzZWMsIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jczsKLXsKLQotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfc2lnbmVkX3ZtYSAqbG9jYWxfZ290X3JlZmNvdW50czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBsb2NhbF9nb3RfcmVmY291bnRzID0gZWxmX2xvY2FsX2dvdF9yZWZjb3VudHMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHN3aXRjaCAoRUxGMzJfUl9UWVBFIChyZWwtPnJfaW5mbykpCi0gICAgICB7Ci0gICAgICBjYXNlIFJfU1BBUkNfR09UMTA6Ci0gICAgICBjYXNlIFJfU1BBUkNfR09UMTM6Ci0gICAgICBjYXNlIFJfU1BBUkNfR09UMjI6Ci0Jcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCWlmIChyX3N5bW5keCA+PSBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgewotCSAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCSAgICBpZiAoaC0+Z290LnJlZmNvdW50ID4gMCkKLQkgICAgICBoLT5nb3QucmVmY291bnQtLTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChsb2NhbF9nb3RfcmVmY291bnRzW3Jfc3ltbmR4XSA+IDApCi0JICAgICAgbG9jYWxfZ290X3JlZmNvdW50c1tyX3N5bW5keF0tLTsKLQkgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUl9TUEFSQ19QTFQzMjoKLSAgICAgIGNhc2UgUl9TUEFSQ19ISVBMVDIyOgotICAgICAgY2FzZSBSX1NQQVJDX0xPUExUMTA6Ci0gICAgICBjYXNlIFJfU1BBUkNfUENQTFQzMjoKLSAgICAgIGNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCXJfc3ltbmR4ID0gRUxGMzJfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQlpZiAocl9zeW1uZHggPj0gc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgIHsKLQkgICAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgICAgaWYgKGgtPnBsdC5yZWZjb3VudCA+IDApCi0JICAgICAgaC0+cGx0LnJlZmNvdW50LS07Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHVuc2lnbmVkIGludCBwb3dlcl9vZl90d287Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGtub3cgd2hhdCBpcyBnb2luZyBvbiBoZXJlLiAgKi8KLSAgQkZEX0FTU0VSVCAoZHlub2JqICE9IE5VTEwKLQkgICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkKLQkJICB8fCBoLT53ZWFrZGVmICE9IE5VTEwKLQkJICB8fCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKSkpOwotCi0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiwgcHV0IGl0IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFdlCi0gICAgIHdpbGwgZmlsbCBpbiB0aGUgY29udGVudHMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGxhdGVyCi0gICAgIChhbHRob3VnaCB3ZSBjb3VsZCBhY3R1YWxseSBkbyBpdCBoZXJlKS4gIFRoZSBTVFRfTk9UWVBFCi0gICAgIGNvbmRpdGlvbiBpcyBhIGhhY2sgc3BlY2lmaWNhbGx5IGZvciB0aGUgT3JhY2xlIGxpYnJhcmllcwotICAgICBkZWxpdmVyZWQgZm9yIFNvbGFyaXM7IGZvciBzb21lIGluZXhwbGljYWJsZSByZWFzb24sIHRoZXkgZGVmaW5lCi0gICAgIHNvbWUgb2YgdGhlaXIgZnVuY3Rpb25zIGFzIFNUVF9OT1RZUEUgd2hlbiB0aGV5IHJlYWxseSBzaG91bGQgYmUKLSAgICAgU1RUX0ZVTkMuICAqLwotICBpZiAoaC0+dHlwZSA9PSBTVFRfRlVOQwotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMAotICAgICAgfHwgKGgtPnR5cGUgPT0gU1RUX05PVFlQRQotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkpCi0gICAgewotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgIHx8ICgoIWluZm8tPnNoYXJlZCB8fCBpbmZvLT5zeW1ib2xpYyB8fCBoLT5keW5pbmR4ID09IC0xKQotCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQl7Ci0JICAvKiBUaGlzIGNhc2UgY2FuIG9jY3VyIGlmIHdlIHNhdyBhIFdQTFQzMCByZWxvYyBpbiBhbiBpbnB1dAotCSAgICAgZmlsZSwgYnV0IG5vbmUgb2YgdGhlIGlucHV0IGZpbGVzIHdlcmUgZHluYW1pYyBvYmplY3RzLgotCSAgICAgT3IsIHdoZW4gbGlua2luZyB0aGUgbWFpbiBhcHBsaWNhdGlvbiBvciBhIC1Cc3ltYm9saWMKLQkgICAgIHNoYXJlZCBsaWJyYXJ5IGFnYWluc3QgUElDIGNvZGUuICBPciB3aGVuIGEgZ2xvYmFsIHN5bWJvbAotCSAgICAgaGFzIGJlZW4gbWFkZSBwcml2YXRlLCBlLmcuIHZpYSB2ZXJzaW9uaW5nLgotCi0JICAgICBJbiB0aGVzZSBjYXNlcyB3ZSBrbm93IHdoYXQgdmFsdWUgdGhlIHN5bWJvbCB3aWxsIHJlc29sdmUKLQkgICAgIHRvLCBzbyB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkIGEgcHJvY2VkdXJlIGxpbmthZ2UKLQkgICAgIHRhYmxlLCBhbmQgd2UgY2FuIGp1c3QgZG8gYSBXRElTUDMwIHJlbG9jIGluc3RlYWQuICAqLwotCi0JICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH5FTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBUaGUgZmlyc3QgZm91ciBlbnRyaWVzIGluIC5wbHQgYXJlIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSA0ICogUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBoYXMgYSBtYXhpbXVtIHNpemUuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+PSAweDQwMDAwMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLSAgICAgICBub3QgZ2VuZXJhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIHNldCB0aGUgc3ltYm9sIHRvIHRoaXMKLSAgICAgICBsb2NhdGlvbiBpbiB0aGUgLnBsdC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZSBmdW5jdGlvbgotICAgICAgIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0gICAgICAgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLSAgICAgaWYgKCEgaW5mby0+c2hhcmVkCi0JJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgICAgewotCWgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IHM7Ci0JaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLSAgICAgIH0KLQotICAgICAgaC0+cGx0Lm9mZnNldCA9IHMtPl9yYXdfc2l6ZTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9SZWxhKTsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfU1BBUkNfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlcgotICAgICB0byBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gMykKLSAgICBwb3dlcl9vZl90d28gPSAzOwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGJvb2xlYW4gcmVscGx0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotCi0gICAgICAvKiBNYWtlIHNwYWNlIGZvciB0aGUgdHJhaWxpbmcgbm9wIGluIC5wbHQuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+IDApCi0Jcy0+X3Jhd19zaXplICs9IDQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbWF5IGhhdmUgY3JlYXRlZCBlbnRyaWVzIGluIHRoZSAucmVsYS5nb3Qgc2VjdGlvbi4KLSAgICAgICAgIEhvd2V2ZXIsIGlmIHdlIGFyZSBub3QgY3JlYXRpbmcgdGhlIGR5bmFtaWMgc2VjdGlvbnMsIHdlIHdpbGwKLSAgICAgICAgIG5vdCBhY3R1YWxseSB1c2UgdGhlc2UgZW50cmllcy4gIFJlc2V0IHRoZSBzaXplIG9mIC5yZWxhLmdvdCwKLSAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgaXQgdG8gZ2V0IHN0cmlwcGVkIGZyb20gdGhlIG91dHB1dCBmaWxlCi0gICAgICAgICBiZWxvdy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgICAgaWYgKHMgIT0gTlVMTCkKLQlzLT5fcmF3X3NpemUgPSAwOwotICAgIH0KLQotICAvKiBUaGUgY2hlY2tfcmVsb2NzIGFuZCBhZGp1c3RfZHluYW1pY19zeW1ib2wgZW50cnkgcG9pbnRzIGhhdmUKLSAgICAgZGV0ZXJtaW5lZCB0aGUgc2l6ZXMgb2YgdGhlIHZhcmlvdXMgZHluYW1pYyBzZWN0aW9ucy4gIEFsbG9jYXRlCi0gICAgIG1lbW9yeSBmb3IgdGhlbS4gICovCi0gIHJlbHRleHQgPSBmYWxzZTsKLSAgcmVscGx0ID0gZmFsc2U7Ci0gIGZvciAocyA9IGR5bm9iai0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RyaXA7Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEl0J3MgT0sgdG8gYmFzZSBkZWNpc2lvbnMgb24gdGhlIHNlY3Rpb24gbmFtZSwgYmVjYXVzZSBub25lCi0JIG9mIHRoZSBkeW5vYmogc2VjdGlvbiBuYW1lcyBkZXBlbmQgdXBvbiB0aGUgaW5wdXQgZmlsZXMuICAqLwotICAgICAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkeW5vYmosIHMpOwotCi0gICAgICBzdHJpcCA9IGZhbHNlOwotCi0gICAgICBpZiAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMCkKLQl7Ci0JICBpZiAocy0+X3Jhd19zaXplID09IDApCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBkb24ndCBuZWVkIHRoaXMgc2VjdGlvbiwgc3RyaXAgaXQgZnJvbSB0aGUKLQkJIG91dHB1dCBmaWxlLiAgVGhpcyBpcyB0byBoYW5kbGUgLnJlbGEuYnNzIGFuZAotCQkgLnJlbC5wbHQuICBXZSBtdXN0IGNyZWF0ZSBpdCBpbgotCQkgY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMsIGJlY2F1c2UgaXQgbXVzdCBiZSBjcmVhdGVkCi0JCSBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCQkgc2VjdGlvbnMuICBUaGUgbGlua2VyIGRvZXMgdGhhdCBiZWZvcmUKLQkJIGFkanVzdF9keW5hbWljX3N5bWJvbCBpcyBjYWxsZWQsIGFuZCBpdCBpcyB0aGF0Ci0JCSBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8gZ28KLQkJIGludG8gdGhlc2Ugc2VjdGlvbnMuICAqLwotCSAgICAgIHN0cmlwID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqb3V0bmFtZTsKLQkgICAgICBhc2VjdGlvbiAqdGFyZ2V0OwotCi0JICAgICAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byBhIHJlYWQgb25seQotCQkgc2VjdGlvbiwgdGhlbiB3ZSBwcm9iYWJseSBuZWVkIGEgRFRfVEVYVFJFTCBlbnRyeS4gICovCi0JICAgICAgb3V0bmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLAotCQkJCQkgICAgICBzLT5vdXRwdXRfc2VjdGlvbik7Ci0JICAgICAgdGFyZ2V0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dG5hbWUgKyA1KTsKLQkgICAgICBpZiAodGFyZ2V0ICE9IE5VTEwKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCQkgICYmICh0YXJnZXQtPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCQlyZWx0ZXh0ID0gdHJ1ZTsKLQotCSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVsYS5wbHQiKSA9PSAwKQotCQlyZWxwbHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSAhPSAwCi0JICAgICAgICYmIHN0cmNtcCAobmFtZSwgIi5nb3QiKSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmMzJfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgIHx8ICEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICB8fCAhIGJmZF9lbGYzMl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHRleHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjMyX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9URVhUUkVMLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgd2UgZ2VuZXJhdGUgYSBzZWN0aW9uCi0gICAgIHN5bWJvbCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbiBmb3Igd2hpY2ggd2UgbWlnaHQgbmVlZCB0byBjb3B5Ci0gICAgIHJlbG9jcy4gIFRoZXNlIGFyZSBsb2NhbCBzeW1ib2xzLCB3aGljaCBtZWFucyB0aGF0IHRoZXkgbXVzdCBjb21lCi0gICAgIGZpcnN0IGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4gIFRoYXQgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQKLSAgICAgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGV4IG9mIGV2ZXJ5IG90aGVyIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBpbnQgYzsKLQotICAgICAgYyA9IDA7Ci0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwCi0JICAgICAgfHwgKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHggPSBjICsgMTsKLQotCSAgLyogVGhlc2Ugc3ltYm9scyB3aWxsIGhhdmUgbm8gbmFtZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLSAgICAgICAgICAgICBmaWRkbGUgd2l0aCBkeW5zdHJfaW5kZXguICAqLwotCi0JICArK2M7Ci0JfQotCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBlbGYzMl9zcGFyY19hZGp1c3RfZHluaW5keCwKLQkJCSAgICAgIChQVFIpICZjKTsKLSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgKz0gYzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEluY3JlbWVudCB0aGUgaW5kZXggb2YgYSBkeW5hbWljIHN5bWJvbCBieSBhIGdpdmVuIGFtb3VudC4gIENhbGxlZAotICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfYWRqdXN0X2R5bmluZHggKGgsIGNwYXJnKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGNwYXJnOwotewotICBpbnQgKmNwID0gKGludCAqKSBjcGFyZzsKLQotICBpZiAoaC0+ZHluaW5keCAhPSAtMSkKLSAgICBoLT5keW5pbmR4ICs9ICpjcDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlbG9jYXRlIGEgU1BBUkMgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGJmZF92bWEgZ290X2Jhc2U7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9PSBOVUxMKQotICAgIGdvdF9iYXNlID0gMDsKLSAgZWxzZQotICAgIGdvdF9iYXNlID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5oZ290LT5yb290LnUuZGVmLnZhbHVlOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcGx0ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbG9jcyArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBpbnQgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4OwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHI7Ci0KLSAgICAgIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl90eXBlID09IFJfU1BBUkNfR05VX1ZUSU5IRVJJVCAKLSAgICAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19HTlVfVlRFTlRSWSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX1NQQVJDX21heF9zdGQpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaG93dG8gPSBfYmZkX3NwYXJjX2VsZl9ob3d0b190YWJsZSArIHJfdHlwZTsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCXsKLQkgIC8qIFRoaXMgaXMgYSByZWxvY2F0ZWFibGUgbGluay4gIFdlIGRvbid0IGhhdmUgdG8gY2hhbmdlCi0JICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0JICAgICBpbiB3aGljaCBjYXNlIHdlIGhhdmUgdG8gYWRqdXN0IGFjY29yZGluZyB0byB3aGVyZSB0aGUKLQkgICAgIHNlY3Rpb24gc3ltYm9sIHdpbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJewotCQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICByZWwtPnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCArIHN5bS0+c3RfdmFsdWU7Ci0JCX0KLQkgICAgfQotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBmaW5hbCBsaW5rLiAgKi8KLSAgICAgIGggPSBOVUxMOwotICAgICAgc3ltID0gTlVMTDsKLSAgICAgIHNlYyA9IE5VTEw7Ci0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9zeW1uZHggLSBzeW10YWJfaGRyLT5zaF9pbmZvXTsKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgICB7Ci0JICAgICAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgICAgIGlmICgocl90eXBlID09IFJfU1BBUkNfV1BMVDMwCi0JCSAgICYmIGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgIHx8ICgocl90eXBlID09IFJfU1BBUkNfR09UMTAKLQkJICAgICAgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0dPVDEzCi0JCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19HT1QyMikKLQkJICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkJICAgICAgJiYgKCEgaW5mby0+c2hhcmVkCi0JCQkgIHx8ICghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0JCSAgICAgICYmIChyX3R5cGUgPT0gUl9TUEFSQ184Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzE2Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzMyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0RJU1A4Ci0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0RJU1AxNgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ESVNQMzIKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AzMAotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19XRElTUDIyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX1dESVNQMTkKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfV0RJU1AxNgotCQkJICB8fCByX3R5cGUgPT0gUl9TUEFSQ19ISTIyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzIyCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDXzEzCi0JCQkgIHx8IHJfdHlwZSA9PSBSX1NQQVJDX0xPMTAKLQkJCSAgfHwgcl90eXBlID09IFJfU1BBUkNfVUEzMgotCQkJICB8fCAoKHJfdHlwZSA9PSBSX1NQQVJDX1BDMTAKLQkJCSAgICAgICB8fCByX3R5cGUgPT0gUl9TUEFSQ19QQzIyKQotCQkJICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCQkgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpICE9IDApKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkICYmICFpbmZvLT5zeW1ib2xpYyAmJiAhaW5mby0+bm9fdW5kZWZpbmVkKQotCSAgICByZWxvY2F0aW9uID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9TUEFSQ19HT1QxMDoKLQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JY2FzZSBSX1NQQVJDX0dPVDIyOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSBnbG9iYWwKLSAgICAgICAgICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmOwotCi0JICAgICAgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEKLSAgICAgICAgICAgICAgICAgICAgIC1Cc3ltYm9saWMgbGluayBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgICAgICAgICAgICAgICAgICBsb2NhbGx5LCBvciB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwKLSAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2Ugb2YgYSB2ZXJzaW9uIGZpbGUuICBXZSBtdXN0IGluaXRpYWxpemUKLSAgICAgICAgICAgICAgICAgICAgIHRoaXMgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTaW5jZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIG9mZnNldCBtdXN0IGFsd2F5cyBiZSBhIG11bHRpcGxlIG9mIDQsIHdlIHVzZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplZCBpdCBhbHJlYWR5LgotCi0JCSAgICAgV2hlbiBkb2luZyBhIGR5bmFtaWMgbGluaywgd2UgY3JlYXRlIGEgLnJlbGEuZ290Ci0JCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkJICAgICBpcyBkb25lIGluIHRoZSBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZS4gICovCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIG9mZjsKLQotCSAgICAgIEJGRF9BU1NFUlQgKGxvY2FsX2dvdF9vZmZzZXRzICE9IE5VTEwKLQkJCSAgJiYgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgNC4gIFdlIHVzZQotCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jCi0JCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKHNyZWxnb3QgIT0gTlVMTCk7Ci0KLQkJICAgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkJICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJCQkgKyBvZmYpOwotCQkgICAgICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJICAgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQkJICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkJCSAoKChFbGYzMl9FeHRlcm5hbF9SZWxhICopCi0JCQkJCQkgICBzcmVsZ290LT5jb250ZW50cykKLQkJCQkJCSAgKyBzcmVsZ290LT5yZWxvY19jb3VudCkpOwotCQkgICAgICArK3NyZWxnb3QtPnJlbG9jX2NvdW50OwotCQkgICAgfQotCi0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0JCX0KLQotCSAgICAgIHJlbG9jYXRpb24gPSBzZ290LT5vdXRwdXRfb2Zmc2V0ICsgb2ZmIC0gZ290X2Jhc2U7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCSAgLyogUmVsb2NhdGlvbiBpcyB0byB0aGUgZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZQotICAgICAgICAgICAgIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotCSAgLyogVGhlIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlciB3aWxsIGdlbmVyYXRlIGEgV1BMVDMwIHJlbG9jCi0JICAgICBmb3IgYSBsb2NhbCBzeW1ib2wgaWYgeW91IGFzc2VtYmxlIGEgY2FsbCBmcm9tIG9uZQotCSAgICAgc2VjdGlvbiB0byBhbm90aGVyIHdoZW4gdXNpbmcgLUsgcGljLiAgV2UgdHJlYXQgaXQgYXMKLQkgICAgIFdESVNQMzAuICAqLwotCSAgaWYgKGggPT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChoLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkgICAgewotCSAgICAgIC8qIFdlIGRpZG4ndCBtYWtlIGEgUExUIGVudHJ5IGZvciB0aGlzIHN5bWJvbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotICAgICAgICAgICAgICAgICB1c2luZyAtQnN5bWJvbGljLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoc3BsdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMKTsKLQkgICAgfQotCi0JICByZWxvY2F0aW9uID0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkJKyBoLT5wbHQub2Zmc2V0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMzA6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgKGluZm8tPnN5bWJvbGljCi0JCSAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ184OgotCWNhc2UgUl9TUEFSQ18xNjoKLQljYXNlIFJfU1BBUkNfMzI6Ci0JY2FzZSBSX1NQQVJDX0hJMjI6Ci0JY2FzZSBSX1NQQVJDXzIyOgotCWNhc2UgUl9TUEFSQ18xMzoKLQljYXNlIFJfU1BBUkNfTE8xMDoKLQljYXNlIFJfU1BBUkNfVUEzMjoKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JICAgICAgYm9vbGVhbiBza2lwOwotCi0JICAgICAgLyogV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwgdGhlc2UgcmVsb2NhdGlvbnMKLSAgICAgICAgICAgICAgICAgYXJlIGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZSB0byBiZSByZXNvbHZlZCBhdCBydW4KLSAgICAgICAgICAgICAgICAgdGltZS4gICovCi0KLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChpbnB1dF9iZmQsCi0JCQkgICBlbGZfZWxmaGVhZGVyIChpbnB1dF9iZmQpLT5lX3Noc3RybmR4LAotCQkJICAgZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnJlbF9oZHIuc2hfbmFtZSkpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkgICAgICAmJiBzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChpbnB1dF9iZmQsCi0JCQkJCQkJICAgICAgIGlucHV0X3NlY3Rpb24pLAotCQkJCQkgbmFtZSArIDUpID09IDApOwotCi0JCSAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbmFtZSk7Ci0JCSAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQl9Ci0KLQkgICAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbyA9PSBOVUxMKQotCQlvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJewotCQkgIGJmZF92bWEgb2ZmOwotCi0JCSAgb2ZmID0gKF9iZmRfc3RhYl9zZWN0aW9uX29mZnNldAotCQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgIGlucHV0X3NlY3Rpb24sCi0JCQkgICZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgaWYgKG9mZiA9PSAoYmZkX3ZtYSkgLTEpCi0JCSAgICBza2lwID0gdHJ1ZTsKLQkJICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCX0KLQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQotCSAgICAgIGlmIChza2lwKQotCQltZW1zZXQgKCZvdXRyZWwsIDAsIHNpemVvZiBvdXRyZWwpOwotCSAgICAgIC8qIGgtPmR5bmluZHggbWF5IGJlIC0xIGlmIHRoZSBzeW1ib2wgd2FzIG1hcmtlZCB0bwotICAgICAgICAgICAgICAgICBiZWNvbWUgbG9jYWwuICAqLwotCSAgICAgIGVsc2UgaWYgKGggIT0gTlVMTAotCQkgICAgICAgJiYgKCghIGluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpCi0JCXsKLQkJICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCByX3R5cGUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocl90eXBlID09IFJfU1BBUkNfMzIpCi0JCSAgICB7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEYzMl9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uICsgcmVsLT5yX2FkZGVuZDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQkJc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIEJGRF9BU1NFUlQgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJCQkgICAgICB8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSk7Ci0JCQkgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJCX0KLQkJICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKSkKLQkJCWluZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzZWMgPT0gTlVMTCB8fCBzZWMtPm93bmVyID09IE5VTEwpCi0JCQl7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXNlY3Rpb24gKm9zZWM7Ci0KLQkJCSAgb3NlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0JCQkgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQotCQkJICAvKiBGSVhNRTogd2UgcmVhbGx5IHNob3VsZCBiZSBhYmxlIHRvIGxpbmsgbm9uLXBpYwotCQkJICAgICBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLQkJCSAgaWYgKGluZHggPT0gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJCShfKCIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iKSwKLQkJCQkgYmZkX2dldF9maWxlbmFtZSAoaW5wdXRfYmZkKSk7Ci0JCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgICAgIHJldHVybiBmYWxzZTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQotCQkgICAgICAvKiBGb3Igbm9uLVJFTEFUSVZFIGR5bmFtaWMgcmVsb2NhdGlvbnMsIHdlIGtlZXAgdGhlCi0JCQkgc2FtZSBzeW1ib2wsIGFuZCBzbyBnZW5lcmFsbHkgdGhlIHNhbWUgYWRkZW5kLiAgQnV0Ci0JCQkgd2UgZG8gbmVlZCB0byBhZGp1c3QgdGhvc2UgcmVsb2NhdGlvbnMgcmVmZXJlbmNpbmcKLQkJCSBzZWN0aW9ucy4gICovCi0JCSAgICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgJiYgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCSAgICAgICAgb3V0cmVsLnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCtzeW0tPnN0X3ZhbHVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfZWxmMzJfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgKCgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICsgc3JlbG9jLT5yZWxvY19jb3VudCkpOwotCSAgICAgICsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCSAgICAgIC8qIFRoaXMgcmVsb2Mgd2lsbCBiZSBjb21wdXRlZCBhdCBydW50aW1lLCBzbyB0aGVyZSdzIG5vCi0gICAgICAgICAgICAgICAgIG5lZWQgdG8gZG8gYW55dGhpbmcgbm93LCB1bmxlc3MgdGhpcyBpcyBhIFJFTEFUSVZFCi0gICAgICAgICAgICAgICAgIHJlbG9jIGluIGFuIHVuYWxsb2NhdGVkIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChza2lwCi0JCSAgfHwgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwCi0JCSAgfHwgRUxGMzJfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQotCQljb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocl90eXBlID09IFJfU1BBUkNfV0RJU1AxNikKLQl7Ci0JICBiZmRfdm1hIHg7Ci0KLQkgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgcmVsb2NhdGlvbiAtPSByZWwtPnJfb2Zmc2V0OwotCi0JICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgeCB8PSAoKCgocmVsb2NhdGlvbiA+PiAyKSAmIDB4YzAwMCkgPDwgNikKLQkJfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLQkgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQotCSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAotCSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA+IDB4M2ZmZmYpCi0JICAgIHIgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0JICBlbHNlCi0JICAgIHIgPSBiZmRfcmVsb2Nfb2s7Ci0JfQotICAgICAgZWxzZSBpZiAocl90eXBlID09IFJfU1BBUkNfUkVWMzIpCi0JewotCSAgYmZkX3ZtYSB4OwotCi0JICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiArIHJlbC0+cl9hZGRlbmQ7Ci0KLQkgIHggPSBiZmRfZ2V0XzMyIChpbnB1dF9iZmQsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0JICB4ID0geCArIHJlbG9jYXRpb247Ci0JICBiZmRfcHV0bDMyICgvKmlucHV0X2JmZCwqLyB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgciA9IGJmZF9yZWxvY19vazsKLQl9Ci0gICAgICBlbHNlCi0JciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgcmVsLT5yX29mZnNldCwKLQkJCQkgICAgICByZWxvY2F0aW9uLCByZWwtPnJfYWRkZW5kKTsKLQotCi0gICAgICBpZiAociAhPSBiZmRfcmVsb2Nfb2spCi0JewotCSAgc3dpdGNoIChyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgIGNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQlpZiAoaCAhPSBOVUxMKQotCQkgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCQllbHNlCi0JCSAgewotCQkgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwKLQkJCQkJCQkgICAgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJCQkgICAgc3ltLT5zdF9uYW1lKTsKLQkJICAgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQkgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCQkgIH0KLQkJaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCQlpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmMzJfc3BhcmNfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBTZXQKLSAgICAgICAgIGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgc3JlbGEgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc3JlbGEgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkgIFBMVF9FTlRSWV9XT1JEMCArIGgtPnBsdC5vZmZzZXQsCi0JCSAgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsCi0JCSAgKFBMVF9FTlRSWV9XT1JEMQotCQkgICArICgoKC0gKGgtPnBsdC5vZmZzZXQgKyA0KSkgPj4gMikgJiAweDNmZmZmZikpLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDQpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0VOVFJZX1dPUkQyLAotCQkgIHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0Lm9mZnNldCArIDgpOwotCi0gICAgICAvKiBGaWxsIGluIHRoZSBlbnRyeSBpbiB0aGUgLnJlbGEucGx0IHNlY3Rpb24uICAqLwotICAgICAgcmVsYS5yX29mZnNldCA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cGx0Lm9mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjMyX1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19KTVBfU0xPVCk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgc3JlbGEtPmNvbnRlbnRzCi0JCQkJICArIGgtPnBsdC5vZmZzZXQgLyBQTFRfRU5UUllfU0laRSAtIDQpKTsKLQotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBhcyBkZWZpbmVkIGluCi0JICAgICB0aGUgLnBsdCBzZWN0aW9uLiAgTGVhdmUgdGhlIHZhbHVlIGFsb25lLiAgKi8KLQkgIHN5bS0+c3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0JfQotICAgIH0KLQotICBpZiAoaC0+Z290Lm9mZnNldCAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0gICAgICBhc2VjdGlvbiAqc3JlbGE7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbCBoYXMgYW4gZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBTZXQgaXQKLSAgICAgICAgIHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgc2dvdC0+Y29udGVudHMgKyBoLT5nb3Qub2Zmc2V0KTsKLQkgIHJlbGEucl9pbmZvID0gRUxGMzJfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0dMT0JfREFUKTsKLQl9Ci0KLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjMyX3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmMzJfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgc3JlbGEtPnJlbG9jX2NvdW50KSk7Ci0gICAgICArK3NyZWxhLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19DT1BZKSAhPSAwKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgcmVsYTsKLQotICAgICAgLyogVGhpcyBzeW1ib2xzIG5lZWRzIGEgY29weSByZWxvYy4gIFNldCBpdCB1cC4gICovCi0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkJICAgIi5yZWxhLmJzcyIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsYS5yX2luZm8gPSBFTEYzMl9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfQ09QWSk7Ci0gICAgICByZWxhLnJfYWRkZW5kID0gMDsKLSAgICAgIGJmZF9lbGYzMl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZyZWxhLAotCQkJCSAoKEVsZjMyX0V4dGVybmFsX1JlbGEgKikgcy0+Y29udGVudHMKLQkJCQkgICsgcy0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrcy0+cmVsb2NfY291bnQ7Ci0gICAgfQotCi0gIC8qIE1hcmsgc29tZSBzcGVjaWFsbHkgZGVmaW5lZCBzeW1ib2xzIGFzIGFic29sdXRlLiAgKi8KLSAgaWYgKHN0cmNtcCAoaC0+cm9vdC5yb290LnN0cmluZywgIl9EWU5BTUlDIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMAotICAgICAgfHwgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyIpID09IDApCi0gICAgc3ltLT5zdF9zaG5keCA9IFNITl9BQlM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGYzMl9zcGFyY19maW5pc2hfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzZHluOwotICBhc2VjdGlvbiAqc2dvdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzcGx0OwotICAgICAgRWxmMzJfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNkeW4gIT0gTlVMTCk7Ci0KLSAgICAgIGR5bmNvbiA9IChFbGYzMl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0gICAgICBkeW5jb25lbmQgPSAoRWxmMzJfRXh0ZXJuYWxfRHluICopIChzZHluLT5jb250ZW50cyArIHNkeW4tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBib29sZWFuIHNpemU7Ci0KLQkgIGJmZF9lbGYzMl9zd2FwX2R5bl9pbiAoZHlub2JqLCBkeW5jb24sICZkeW4pOwotCi0JICBzd2l0Y2ggKGR5bi5kX3RhZykKLQkgICAgewotCSAgICBjYXNlIERUX1BMVEdPVDogICBuYW1lID0gIi5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBjYXNlIERUX1BMVFJFTFNaOiBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSB0cnVlOyBicmVhazsKLQkgICAgY2FzZSBEVF9KTVBSRUw6ICAgbmFtZSA9ICIucmVsYS5wbHQiOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICBkZWZhdWx0OgkgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGYzMl9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIENsZWFyIHRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLAotCSBhbmQgcHV0IGEgbm9wIGluIHRoZSBsYXN0IGZvdXIgYnl0ZXMuICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgbWVtc2V0IChzcGx0LT5jb250ZW50cywgMCwgNCAqIFBMVF9FTlRSWV9TSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX05PUCwKLQkJICAgICAgc3BsdC0+Y29udGVudHMgKyBzcGx0LT5fcmF3X3NpemUgLSA0KTsKLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JUExUX0VOVFJZX1NJWkU7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA0OwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IGM7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQotICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOwotCi0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaW50IGluZHg7Ci0KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgYmZkX2VsZjMyX3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkgICAgIChQVFIpICgoKEVsZjMyX0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOwotCi0JICArK2M7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCi0gICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPSBjICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgZV9mbGFncyBmaWVsZC4KLQotICAgV2UgZG9uJ3QgZGVmaW5lIHNldF9wcml2YXRlX2ZsYWdzIG9yIGNvcHlfcHJpdmF0ZV9iZmRfZGF0YSBiZWNhdXNlCi0gICB0aGUgb25seSBjdXJyZW50bHkgZGVmaW5lZCB2YWx1ZXMgYXJlIGJhc2VkIG9uIHRoZSBiZmQgbWFjaCBudW1iZXIsCi0gICBzbyB3ZSB1c2UgdGhlIGxhdHRlciBpbnN0ZWFkIGFuZCBkZWZlciBzZXR0aW5nIGVfZmxhZ3MgdW50aWwgdGhlCi0gICBmaWxlIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBib29sZWFuIGVycm9yOwotICBzdGF0aWMgaW50IHByZXZpb3VzX2liZmRfZV9mbGFncyA9IC0xOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBlcnJvciA9IGZhbHNlOwotCi0jaWYgMAotICAvKiA/Pz8gVGhlIG5hdGl2ZSBsaW5rZXIgZG9lc24ndCBkbyB0aGlzIHNvIHdlIGNhbid0IChvdGhlcndpc2UgZ2NjIHdvdWxkCi0gICAgIGhhdmUgdG8ga25vdyB3aGljaCBsaW5rZXIgaXMgYmVpbmcgdXNlZCkuICBJbnN0ZWFkLCB0aGUgbmF0aXZlIGxpbmtlcgotICAgICBidW1wcyB1cCB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIHdoZW4gaXQgaGFzIHRvLiAgSG93ZXZlciwgSSBzdGlsbCB0aGluawotICAgICB3YXJuaW5ncyBsaWtlIHRoZXNlIGFyZSBnb29kLCBzbyBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgdGhlbSB0dXJuZWQgb24KLSAgICAgYnkgc29tZSBvcHRpb24uICAqLwotCi0gIC8qIElmIHRoZSBvdXRwdXQgbWFjaGluZSBpcyBub3JtYWwgc3BhcmMsIHdlIGNhbid0IGFsbG93IHY5IGlucHV0IGZpbGVzLiAgKi8KLSAgaWYgKGJmZF9nZXRfbWFjaCAob2JmZCkgPT0gYmZkX21hY2hfc3BhcmMKLSAgICAgICYmIChiZmRfZ2V0X21hY2ggKGliZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwotCSAgfHwgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKSkKLSAgICB7Ci0gICAgICBlcnJvciA9IHRydWU7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IGNvbXBpbGVkIGZvciBhIHY4cGx1cyBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotICAvKiBJZiB0aGUgb3V0cHV0IG1hY2hpbmUgaXMgdjksIHdlIGNhbid0IGFsbG93IHY5K3ZpcyBpbnB1dCBmaWxlcy4gICovCi0gIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpID09IGJmZF9tYWNoX3NwYXJjX3Y4cGx1cwotICAgICAgJiYgYmZkX2dldF9tYWNoIChpYmZkKSA9PSBiZmRfbWFjaF9zcGFyY192OHBsdXNhKQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzYSBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OHBsdXMiKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAgIH0KLSNlbHNlCi0gIGlmIChiZmRfZ2V0X21hY2ggKGliZmQpID49IGJmZF9tYWNoX3NwYXJjX3Y5KQotICAgIHsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogY29tcGlsZWQgZm9yIGEgNjQgYml0IHN5c3RlbSBhbmQgdGFyZ2V0IGlzIDMyIGJpdCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKG9iZmQpIDwgYmZkX2dldF9tYWNoIChpYmZkKSkKLSAgICBiZmRfc2V0X2FyY2hfbWFjaCAob2JmZCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotI2VuZGlmCi0KLSAgaWYgKCgoZWxmX2VsZmhlYWRlciAoaWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0gICAgICAgIT0gcHJldmlvdXNfaWJmZF9lX2ZsYWdzKQotICAgICAgJiYgcHJldmlvdXNfaWJmZF9lX2ZsYWdzID49IDApCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBsaW5raW5nIGxpdHRsZSBlbmRpYW4gZmlsZXMgd2l0aCBiaWcgZW5kaWFuIGZpbGVzIiksCi0JIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICB9Ci0gIHByZXZpb3VzX2liZmRfZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzICYgRUZfU1BBUkNfTEVEQVRBOwotCi0gIGlmIChlcnJvcikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjMyX3NwYXJjX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID09IEVNX1NQQVJDMzJQTFVTKQotICAgIHsKLSAgICAgIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0JcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotCQkJCQkgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EpOwotICAgICAgZWxzZSBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ18zMlBMVVMpCi0JcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotCQkJCQkgIGJmZF9tYWNoX3NwYXJjX3Y4cGx1cyk7Ci0gICAgICBlbHNlCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAoZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJiBFRl9TUEFSQ19MRURBVEEpCi0gICAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUpOwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyYyk7Ci19Ci0KLS8qIFRoZSBmaW5hbCBwcm9jZXNzaW5nIGRvbmUganVzdCBiZWZvcmUgd3JpdGluZyBvdXQgdGhlIG9iamVjdCBmaWxlLgotICAgV2UgbmVlZCB0byBzZXQgdGhlIGVfbWFjaGluZSBmaWVsZCBhcHByb3ByaWF0ZWx5LiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjMyX3NwYXJjX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgKGFiZmQsIGxpbmtlcikKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGxpbmtlcjsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjIDoKLSAgICAgIGJyZWFrOyAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgOgotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfbWFjaGluZSA9IEVNX1NQQVJDMzJQTFVTOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgJj1+IEVGX1NQQVJDXzMyUExVU19NQVNLOwotICAgICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNfMzJQTFVTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXNhIDoKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX21hY2hpbmUgPSBFTV9TUEFSQzMyUExVUzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICY9fiBFRl9TUEFSQ18zMlBMVVNfTUFTSzsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzIHw9IEVGX1NQQVJDXzMyUExVUyB8IEVGX1NQQVJDX1NVTl9VUzE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGl0ZV9sZSA6Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9tYWNoaW5lID0gRU1fU1BBUkM7Ci0gICAgICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSBFRl9TUEFSQ19MRURBVEE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmMzJfc3BhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmMzItc3BhcmMiCi0jZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgRU1fU1BBUkMKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMSBFTV9TUEFSQzMyUExVUwotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUgMHgxMDAwMAotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJZWxmMzJfc3BhcmNfcmVsb2NfdHlwZV9sb29rdXAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG8JCWVsZjMyX3NwYXJjX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQlfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJZWxmMzJfc3BhcmNfY2hlY2tfcmVsb2NzCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZjMyX3NwYXJjX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotCQkJCQllbGYzMl9zcGFyY19zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbgllbGYzMl9zcGFyY19yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbCBcCi0JCQkJCWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucyBcCi0JCQkJCWVsZjMyX3NwYXJjX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCWVsZjMyX3NwYXJjX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgZWxmX2JhY2tlbmRfb2JqZWN0X3AJCWVsZjMyX3NwYXJjX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgXAotCQkJCQllbGYzMl9zcGFyY19maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vayAgICAgICAgZWxmMzJfc3BhcmNfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgZWxmMzJfc3BhcmNfZ2Nfc3dlZXBfaG9vawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucyAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdCAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSAwCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bSAxCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSA0Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZSAoNCpQTFRfRU5UUllfU0laRSkKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLXY4NTAuYyBiL2JmZC9lbGYzMi12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYTYwZTguLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjMyLXY4NTAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMzQgKzAsMCBAQAotLyogVjg1MC1zcGVjaWZpYyBzdXBwb3J0IGZvciAzMi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0KLS8qIFhYWCBGSVhNRTogVGhpcyBjb2RlIGlzIGxpdHRlcmVkIHdpdGggMzJiaXQgaW50LCAxNmJpdCBzaG9ydCwgOGJpdCBjaGFyCi0gICBkZXBlbmRlbmNpZXMuICBBcyBpcyB0aGUgZ2FzICYgc2ltdWxhdG9yIGNvZGUgb3IgdGhlIHY4NTAuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi92ODUwLmgiCi0KLS8qIHNpZ24tZXh0ZW5kIGEgMjQtYml0IG51bWJlciAqLwotI2RlZmluZSBTRVhUMjQoeCkJKCgoKHgpICYgMHhmZmZmZmYpIF4gKH4gMHg3ZmZmZmYpKSArIDB4ODAwMDAwKQotICAgICAgCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqdjg1MF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgRWxmMzJfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyB2b2lkIHY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsYQotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGYzMl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgdjg1MF9lbGZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3JlbG9jYXRlX3NlY3Rpb24KLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX3BlcmZvcm1fcmVsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgaW50LCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIHJlbWVtYmVyX2hpMTZzX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYmZkX2J5dGUgKiBmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHY4NTBfZWxmX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosIGJmZF92bWEsCi0JICAgYmZkX3ZtYSwgYmZkX3ZtYSwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCB2ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9zZXRfcHJpdmF0ZV9mbGFncwotICBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBhc2VjdGlvbiAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBFbGZfSW50ZXJuYWxfU3ltICosCi0JICAgY29uc3QgY2hhciAqKiwgZmxhZ3dvcmQgKiwgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwKLQkgICBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHY4NTBfZWxmX3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLQotLyogTm90ZTogSXQgaXMgUkVRVUlSRUQgdGhhdCB0aGUgJ3R5cGUnIHZhbHVlIG9mIGVhY2ggZW50cnkgaW4gdGhpcyBhcnJheQotICAgbWF0Y2ggdGhlIGluZGV4IG9mIHRoZSBlbnRyeSBpbiB0aGUgYXJyYXkuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgdjg1MF9lbGZfaG93dG9fdGFibGVbXSA9Ci17Ci0gIC8qIFRoaXMgcmVsb2MgZG9lcyBub3RoaW5nLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9OT05FLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX05PTkUiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBQQyByZWxhdGl2ZSA5IGJpdCBicmFuY2guICovCi0gIEhPV1RPIChSX1Y4NTBfOV9QQ1JFTCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjYsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF85X1BDUkVMIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwZmZmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MDBmZmZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgUEMgcmVsYXRpdmUgMjIgYml0IGJyYW5jaC4gKi8KLSAgSE9XVE8gKFJfVjg1MF8yMl9QQ1JFTCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjIsCQkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNywJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfMjJfUENSRUwiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDdmZmZmODAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmZmY4MCwJCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX1Y4NTBfSEkxNl9TLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9ISTE2X1MiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0hJMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0hJMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBzeW1ib2wgdmFsdWUuICAqLwotICBIT1dUTyAoUl9WODUwX0xPMTYsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0xPMTYiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTaW1wbGUgMzJiaXQgcmVsb2MuICAqLwotICBIT1dUTyAoUl9WODUwXzMyLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF8zMiIsCQkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDE2Yml0IHJlbG9jLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF8xNiwJCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzE2IiwJCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2ltcGxlIDhiaXQgcmVsb2MuCSAqLwotICBIT1dUTyAoUl9WODUwXzgsCQkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwXzgiLAkJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTUgYml0IG9mZnNldCBmcm9tIHRoZSBzaG9ydCBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAxLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMSwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZSwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB6ZXJvIGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNSBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMSwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDEsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZSwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLiAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfNl84X09GRlNFVCwJCS8qIHR5cGUgKi8KLQkgMiwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMSwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX1REQV82XzhfT0ZGU0VUIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4N2UsCQkJCS8qIHNyY19tYXNrICovCi0JIDB4N2UsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzdfOF9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfN184X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiA3IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzdfN19PRkZTRVQsCQkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDcsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfN183X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDdmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDdmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyISAgKi8KLSAgSE9XVE8gKFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULAkvKiB0eXBlICovCi0JIDAsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmYsCQkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA1IGJpdCBvZmZzZXQgZnJvbSB0aGUgdGlueSBkYXRhIGFyZWEgcG9pbnRlci4gICovCi0gIEhPV1RPIChSX1Y4NTBfVERBXzRfNV9PRkZTRVQsCQkvKiB0eXBlICovCi0JIDEsCQkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9UREFfNF81X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDBmLAkJCQkvKiBzcmNfbWFzayAqLwotCSAweDBmLAkJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1REQV80XzRfT0ZGU0VULAkJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA0LAkJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgdjg1MF9lbGZfcmVsb2MsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX1Y4NTBfVERBXzRfNF9PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUwMDIwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSB2ODUwX2VsZl9yZWxvYywJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZlMDAyMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmUwMDIwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX0NBTExUXzZfN19PRkZTRVQsCS8qIHR5cGUgKi8KLQkgMCwJCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNywJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0NBTExUXzZfN19PRkZTRVQiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZiwJCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZiwJCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuICAqLwotICBIT1dUTyAoUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCwJLyogdHlwZSAqLwotCSAwLAkJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHY4NTBfZWxmX3JlbG9jLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHTlUgZXh0ZW5zaW9uIHRvIHJlY29yZCBDKysgdnRhYmxlIGhpZXJhcmNoeSAqLwotICBIT1dUTyAoUl9WODUwX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1Y4NTBfR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX1Y4NTBfR05VX1ZURU5UUlksICAgICAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgX2JmZF9lbGZfcmVsX3Z0YWJsZV9yZWxvY19mbiwgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX1Y4NTBfR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotIAotfTsKLQotLyogTWFwIEJGRCByZWxvYyB0eXBlcyB0byBWODUwIEVMRiByZWxvYyB0eXBlcy4gICovCi0KLXN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXAKLXsKLSAgLyogQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUIGlzIDI1OCwgd2hpY2ggd2lsbCBub3QgZml4IGluIGFuCi0gICAgIHVuc2lnbmVkIGNoYXIuICAqLwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgdW5zaWduZWQgY2hhciBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXAgdjg1MF9lbGZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ19OT05FLAkJUl9WODUwX05PTkUgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF85X1BDUkVMLAlSX1Y4NTBfOV9QQ1JFTCB9LAotICB7IEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMLAlSX1Y4NTBfMjJfUENSRUwgfSwKLSAgeyBCRkRfUkVMT0NfSEkxNl9TLAkJUl9WODUwX0hJMTZfUyB9LAotICB7IEJGRF9SRUxPQ19ISTE2LAkJUl9WODUwX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTE8xNiwJCVJfVjg1MF9MTzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLAkJUl9WODUwXzMyIH0sCi0gIHsgQkZEX1JFTE9DXzE2LAkJUl9WODUwXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzgsCQlSX1Y4NTBfOCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQsIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VULCBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQsIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQsICAgUl9WODUwX1REQV82XzhfT0ZGU0VUICAgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVCwgICBSX1Y4NTBfVERBXzdfOF9PRkZTRVQgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VULCAgIFJfVjg1MF9UREFfN183X09GRlNFVCAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfVERBXzE2XzE2X09GRlNFVCwgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVCwgICAgICAgICBSX1Y4NTBfVERBXzRfNV9PRkZTRVQgICAgICAgICB9LAotICB7IEJGRF9SRUxPQ19WODUwX1REQV80XzRfT0ZGU0VULCAgICAgICAgIFJfVjg1MF9UREFfNF80X09GRlNFVCAgICAgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCwgUl9WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQgfSwKLSAgeyBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VULCBSX1Y4NTBfWkRBXzE2XzE2X1NQTElUX09GRlNFVCB9LAotICB7IEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQsICAgICAgIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUICAgICAgIH0sCi0gIHsgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULCAgICAgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVCAgICAgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsICAgICAgICAgICAgICAgUl9WODUwX0dOVV9WVElOSEVSSVQgfSwKLSAgeyBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZLCAgICAgICAgICAgICAgICAgUl9WODUwX0dOVV9WVEVOVFJZIH0sCi0KLX07Ci0KLQwKLS8qIE1hcCBhIGJmZCByZWxvY2F0aW9uIGludG8gdGhlIGFwcHJvcHJpYXRlIGhvd3RvIHN0cnVjdHVyZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotdjg1MF9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOwotICAgICAgIGkgPCBzaXplb2YgKHY4NTBfZWxmX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCB2ODUwX2VsZl9yZWxvY19tYXApOwotICAgICAgIGkrKykKLSAgICB7Ci0gICAgICBpZiAodjg1MF9lbGZfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQl7Ci0JICBCRkRfQVNTRVJUICh2ODUwX2VsZl9ob3d0b190YWJsZVt2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF0udHlwZSA9PSB2ODUwX2VsZl9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbCk7Ci0JICAKLQkgIHJldHVybiAmIHY4NTBfZWxmX2hvd3RvX3RhYmxlW3Y4NTBfZWxmX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0MCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGFuIFY4NTAgRUxGIHJlbG9jLiAgKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICBhYmZkOwotICAgICBhcmVsZW50ICogICAgICAgICAgICAgY2FjaGVfcHRyOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWwgKiAgZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1Y4NTBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZ2ODUwX2VsZl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0vKiBTZXQgdGhlIGhvd3RvIHBvaW50ZXIgZm9yIGEgVjg1MCBFTEYgcmVsb2MgKHR5cGUgUkVMQSkuICovCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiAgICAgICAgICAgICBjYWNoZV9wdHI7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbGEgICAqZHN0OwotewotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZHN0LT5yX2luZm8pOwotICBCRkRfQVNTRVJUIChyX3R5cGUgPCAodW5zaWduZWQgaW50KSBSX1Y4NTBfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZ2ODUwX2VsZl9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotCi0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogICAgIGluZm87Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgIHNlYzsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKiAgcmVsb2NzOwotewotICBib29sZWFuIHJldCA9IHRydWU7Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsX2VuZDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgZW51bSB2ODUwX3JlbG9jX3R5cGUgcl90eXBlOwotICBpbnQgb3RoZXIgPSAwOwotICBjb25zdCBjaGFyICpjb21tb24gPSAoY29uc3QgY2hhciAqKTA7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgInY4NTBfZWxmX2NoZWNrX3JlbG9jcyBjYWxsZWQgZm9yIHNlY3Rpb24gJXMgaW4gJXNcbiIsCi0JICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksCi0JICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotI2VuZGlmCi0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEYzMl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICByX3R5cGUgPSAoZW51bSB2ODUwX3JlbG9jX3R5cGUpIEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBSX1Y4NTBfTk9ORToKLQljYXNlIFJfVjg1MF85X1BDUkVMOgotCWNhc2UgUl9WODUwXzIyX1BDUkVMOgotCWNhc2UgUl9WODUwX0hJMTZfUzoKLQljYXNlIFJfVjg1MF9ISTE2OgotCWNhc2UgUl9WODUwX0xPMTY6Ci0JY2FzZSBSX1Y4NTBfMzI6Ci0JY2FzZSBSX1Y4NTBfMTY6Ci0JY2FzZSBSX1Y4NTBfODoKLQljYXNlIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOgotCWNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKLQkgIGJyZWFrOwotCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgdGhlIEMrKyBvYmplY3QgdnRhYmxlIGhpZXJhcmNoeS4KLSAgICAgICAgICAgUmVjb25zdHJ1Y3QgaXQgZm9yIGxhdGVyIHVzZSBkdXJpbmcgR0MuICAqLwotICAgICAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgICAgICAgIGlmICghX2JmZF9lbGYzMl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9vZmZzZXQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBkZXNjcmliZXMgd2hpY2ggQysrIHZ0YWJsZSBlbnRyaWVzIGFyZSBhY3R1YWxseQotICAgICAgICAgICB1c2VkLiAgUmVjb3JkIGZvciBsYXRlciB1c2UgZHVyaW5nIEdDLiAgKi8KLSAgICAgICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICAgICAgaWYgKCFfYmZkX2VsZjMyX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIHJlbC0+cl9hZGRlbmQpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotCi0JY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLQljYXNlIFJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfU0RBOwotCSAgY29tbW9uID0gIi5zY29tbW9uIjsKLQkgIGdvdG8gc21hbGxfZGF0YV9jb21tb247Ci0JICAKLQljYXNlIFJfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0JY2FzZSBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDoKLQkgIG90aGVyID0gVjg1MF9PVEhFUl9aREE7Ci0JICBjb21tb24gPSAiLnpjb21tb24iOwotCSAgZ290byBzbWFsbF9kYXRhX2NvbW1vbjsKLQkgIAotCWNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV82XzhfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV83XzhfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV83XzdfT0ZGU0VUOgotCWNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6Ci0JICBvdGhlciA9IFY4NTBfT1RIRVJfVERBOwotCSAgY29tbW9uID0gIi50Y29tbW9uIjsKLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0jZGVmaW5lIFY4NTBfT1RIRVJfTUFTSyAoVjg1MF9PVEhFUl9UREEgfCBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBKQotCi0Jc21hbGxfZGF0YV9jb21tb246Ci0JICBpZiAoaCkKLQkgICAgewotCSAgICAgIGgtPm90aGVyIHw9IG90aGVyOwkvKiBmbGFnIHdoaWNoIHR5cGUgb2YgcmVsb2NhdGlvbiB3YXMgdXNlZCAqLwotCSAgICAgIGlmICgoaC0+b3RoZXIgJiBWODUwX09USEVSX01BU0spICE9IChvdGhlciAmIFY4NTBfT1RIRVJfTUFTSykKLQkJICAmJiAoaC0+b3RoZXIgJiBWODUwX09USEVSX0VSUk9SKSA9PSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqIG1zZzsKLQkJICBzdGF0aWMgY2hhciAgYnVmZlsyMDBdOyAvKiBYWFggKi8KLQotCQkgIHN3aXRjaCAoaC0+b3RoZXIgJiBWODUwX09USEVSX01BU0spCi0JCSAgICB7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBvY2N1cHkgaW4gbXVsdGlwbGUgc21hbGwgZGF0YSByZWdpb25zIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2FuIG9ubHkgYmUgaW4gb25lIG9mIHRoZSBzbWFsbCwgemVybywgYW5kIHRpbnkgZGF0YSByZWdpb25zIik7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBWODUwX09USEVSX1NEQSB8IFY4NTBfT1RIRVJfWkRBOgotCQkgICAgICBtc2cgPSBfKCJWYXJpYWJsZSBgJXMnIGNhbm5vdCBiZSBpbiBib3RoIHNtYWxsIGFuZCB6ZXJvIGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVjg1MF9PVEhFUl9TREEgfCBWODUwX09USEVSX1REQToKLQkJICAgICAgbXNnID0gXygiVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFY4NTBfT1RIRVJfWkRBIHwgVjg1MF9PVEhFUl9UREE6Ci0JCSAgICAgIG1zZyA9IF8oIlZhcmlhYmxlIGAlcycgY2Fubm90IGJlIGluIGJvdGggemVybyBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBzcHJpbnRmIChidWZmLCBtc2csIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCQkgIGluZm8tPmNhbGxiYWNrcy0+d2FybmluZyAoaW5mbywgYnVmZiwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCQkJICAgIGFiZmQsIGgtPnJvb3QudS5kZWYuc2VjdGlvbiwgMCk7Ci0KLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJICBoLT5vdGhlciB8PSBWODUwX09USEVSX0VSUk9SOwotCQkgIHJldCA9IGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgaC0+cm9vdC51LmMucAotCSAgICAgICYmICFzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBoLT5yb290LnUuYy5wLT5zZWN0aW9uKSwgIkNPTU1PTiIpKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlY3Rpb24gPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCBjb21tb24pOwotCSAgICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHCi0JICBmcHJpbnRmIChzdGRlcnIsICJ2ODUwX2VsZl9jaGVja19yZWxvY3MsIGZvdW5kICVzIHJlbG9jYXRpb24gZm9yICVzJXNcbiIsCi0JCSAgIHY4NTBfZWxmX2hvd3RvX3RhYmxlWyAoaW50KXJfdHlwZSBdLm5hbWUsCi0JCSAgIChoICYmIGgtPnJvb3Qucm9vdC5zdHJpbmcpID8gaC0+cm9vdC5yb290LnN0cmluZyA6ICI8dW5rbm93bj4iLAotCQkgICAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKSA/ICIsIHN5bWJvbCBpcyBjb21tb24iIDogIiIpOwotI2VuZGlmCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBJbiB0aGUgb2xkIHZlcnNpb24sIHdoZW4gYW4gZW50cnkgd2FzIGNoZWNrZWQgb3V0IGZyb20gdGhlIHRhYmxlLAotICogaXQgd2FzIGRlbGV0ZWQuICBUaGlzIHByb2R1Y2VkIGFuIGVycm9yIGlmIHRoZSBlbnRyeSB3YXMgbmVlZGVkCi0gKiBtb3JlIHRoYW4gb25jZSwgYXMgdGhlIHNlY29uZCBhdHRlbXB0ZWQgcmV0cnkgZmFpbGVkLgotICoKLSAqIEluIHRoZSBjdXJyZW50IHZlcnNpb24sIHRoZSBlbnRyeSBpcyBub3QgZGVsZXRlZCwgaW5zdGVhZCB3ZSBzZXQKLSAqIHRoZSBmaWVsZCAnZm91bmQnIHRvIHRydWUuICBJZiBhIHNlY29uZCBsb29rdXAgbWF0Y2hlcyB0aGUgc2FtZQotICogZW50cnksIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBoaTE2cyByZWxvYyBoYXMgYWxyZWFkeSBiZWVuIHVwZGF0ZWQKLSAqIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHVwZGF0ZWQgYSBzZWNvbmQgdGltZS4KLSAqCi0gKiBUT0RPIC0gVE9GSVg6IElmIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byByZXN0b3JlIDIgZGlmZmVyZW50Ci0gKiBhZGRyZXNzZXMgZnJvbSB0aGUgc2FtZSB0YWJsZSBlbnRyeSwgd2hlcmUgdGhlIGZpcnN0IGdlbmVyYXRlcyBhbgotICogb3ZlcmZsb3csIHdoaWxzdCB0aGUgc2Vjb25kIGRvIG5vdCwgdGhlbiB0aGlzIGNvZGUgd2lsbCBmYWlsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IGhpMTZzX2xvY2F0aW9uCi17Ci0gIGJmZF92bWEgICAgICAgYWRkZW5kOwotICBiZmRfYnl0ZSAqICAgIGFkZHJlc3M7Ci0gIHVuc2lnbmVkIGxvbmcgY291bnRlcjsKLSAgYm9vbGVhbiAgICAgICBmb3VuZDsKLSAgc3RydWN0IGhpMTZzX2xvY2F0aW9uICogbmV4dDsKLX0KLWhpMTZzX2xvY2F0aW9uOwotCi1zdGF0aWMgaGkxNnNfbG9jYXRpb24gKiAgcHJldmlvdXNfaGkxNnM7Ci1zdGF0aWMgaGkxNnNfbG9jYXRpb24gKiAgZnJlZV9oaTE2czsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICAgICBoaTE2c19jb3VudGVyOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfaGkxNnNfcmVsb2MgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcykKLSAgICAgYmZkICogICAgICBhYmZkOwotICAgICBiZmRfdm1hICAgIGFkZGVuZDsKLSAgICAgYmZkX2J5dGUgKiBhZGRyZXNzOwotewotICBoaTE2c19sb2NhdGlvbiAqIGVudHJ5ID0gTlVMTDsKLSAgCi0gIC8qIEZpbmQgYSBmcmVlIHN0cnVjdHVyZS4gICovCi0gIGlmIChmcmVlX2hpMTZzID09IE5VTEwpCi0gICAgZnJlZV9oaTE2cyA9IChoaTE2c19sb2NhdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKCogZnJlZV9oaTE2cykpOwotCi0gIGVudHJ5ICAgICAgPSBmcmVlX2hpMTZzOwotICBmcmVlX2hpMTZzID0gZnJlZV9oaTE2cy0+bmV4dDsKLSAgCi0gIGVudHJ5LT5hZGRlbmQgID0gYWRkZW5kOwotICBlbnRyeS0+YWRkcmVzcyA9IGFkZHJlc3M7Ci0gIGVudHJ5LT5jb3VudGVyID0gaGkxNnNfY291bnRlciArKzsKLSAgZW50cnktPmZvdW5kICAgPSBmYWxzZTsKLSAgZW50cnktPm5leHQgICAgPSBwcmV2aW91c19oaTE2czsKLSAgcHJldmlvdXNfaGkxNnMgPSBlbnRyeTsKLSAgCi0gIC8qIENvcGUgd2l0aCB3cmFwIGFyb3VuZCBvZiBvdXIgY291bnRlci4gICovCi0gIGlmIChoaTE2c19jb3VudGVyID09IDApCi0gICAgewotICAgICAgLyogWFhYIC0gQXNzdW1lIHRoYXQgYWxsIGNvdW50ZXIgZW50cmllcyBkaWZmZXIgb25seSBpbiB0aGVpciBsb3cgMTYgYml0cy4gICovCi0gICAgICBmb3IgKGVudHJ5ID0gcHJldmlvdXNfaGkxNnM7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JZW50cnktPmNvdW50ZXIgJj0gMHhmZmZmOwotCi0gICAgICBoaTE2c19jb3VudGVyID0gMHgxMDAwMDsKLSAgICB9Ci0gIAotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqCi1maW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MgKGFkZGVuZCwgYWxyZWFkeV9mb3VuZCkKLSAgICAgYmZkX3ZtYSAgIGFkZGVuZDsKLSAgICAgYm9vbGVhbiAqIGFscmVhZHlfZm91bmQ7Ci17Ci0gIGhpMTZzX2xvY2F0aW9uICogbWF0Y2ggPSBOVUxMOwotICBoaTE2c19sb2NhdGlvbiAqIGVudHJ5OwotICBoaTE2c19sb2NhdGlvbiAqIHByZXZpb3VzID0gTlVMTDsKLSAgaGkxNnNfbG9jYXRpb24gKiBwcmV2OwotICBpbnQgICAgICAgICAgICAgIGk7Ci0gIGJmZF9ieXRlICogICAgICAgYWRkcjsKLSAgCi0gIC8qIFNlYXJjaCB0aGUgdGFibGUuICBSZWNvcmQgdGhlIG1vc3QgcmVjZW50IGVudHJ5IHRoYXQgbWF0Y2hlcy4gICovCi0gIGZvciAoZW50cnkgPSBwcmV2aW91c19oaTE2czsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCi0gICAgewotICAgICAgaWYgKGVudHJ5LT5hZGRlbmQgPT0gYWRkZW5kCi0JICAmJiAobWF0Y2ggPT0gTlVMTCB8fCBtYXRjaC0+Y291bnRlciA8IGVudHJ5LT5jb3VudGVyKSkKLQl7Ci0JICBwcmV2aW91cyA9IHByZXY7Ci0JICBtYXRjaCAgICA9IGVudHJ5OwotCX0KLSAgICAgIAotICAgICAgcHJldiA9IGVudHJ5OwotICAgIH0KLQotICBpZiAobWF0Y2ggPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBFeHRyYWN0IHRoZSBhZGRyZXNzLiAgKi8KLSAgYWRkciA9IG1hdGNoLT5hZGRyZXNzOwotCi0gIC8qIFJlbWViZXIgaWYgdGhpcyBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYmVmb3JlLiAgKi8KLSAgaWYgKGFscmVhZHlfZm91bmQpCi0gICAgKiBhbHJlYWR5X2ZvdW5kID0gbWF0Y2gtPmZvdW5kOwotCi0gIC8qIE5vdGUgdGhhdCB0aGlzIGVudHJ5IGhhcyBub3cgYmVlbiB1c2VkLiAgKi8KLSAgbWF0Y2gtPmZvdW5kID0gdHJ1ZTsKLSAgCi0gIHJldHVybiBhZGRyOwotfSAgICAgCi0KLS8qIEZJWE1FOiAgVGhlIGNvZGUgaGVyZSBwcm9iYWJseSBvdWdodCB0byBiZSByZW1vdmVkIGFuZCB0aGUgY29kZSBpbiByZWxvYy5jCi0gICBhbGxvd2VkIHRvIGRvIGl0cyAgc3R1ZmYgaW5zdGVhZC4gIEF0IGxlYXN0IGZvciBtb3N0IG9mIHRoZSByZWxvY3MsIGFud3lheS4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsIHJfdHlwZSwgYWRkZW5kLCBhZGRyZXNzKQotICAgICBiZmQgKiAgICAgIGFiZmQ7Ci0gICAgIGludCAgICAgICAgcl90eXBlOwotICAgICBiZmRfdm1hICAgIGFkZGVuZDsKLSAgICAgYmZkX2J5dGUgKiBhZGRyZXNzOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGJmZF9zaWduZWRfdm1hIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgLyogZnByaW50ZiAoc3RkZXJyLCAicmVsb2MgdHlwZSAlZCBub3QgU1VQUE9SVEVEXG4iLCByX3R5cGUgKTsgKi8KLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfMzI6Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBhZGRlbmQsIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzIyX1BDUkVMOgotICAgICAgaWYgKHNhZGRlbmQgPiAweDFmZmZmZiB8fCBzYWRkZW5kIDwgLTB4MjAwMDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGlmICgoYWRkZW5kICUgMikgIT0gMCkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAgPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGluc24gJj0gfjB4ZmZmZTAwM2Y7Ci0gICAgICBpbnNuIHw9ICgoKGFkZGVuZCAmIDB4ZmZmZSkgPDwgMTYpIHwgKChhZGRlbmQgJiAweDNmMDAwMCkgPj4gMTYpKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIGFkZHJlc3MpOwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwXzlfUENSRUw6Ci0gICAgICBpZiAoc2FkZGVuZCA+IDB4ZmYgfHwgc2FkZGVuZCA8IC0weDEwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoKGFkZGVuZCAlIDIpICE9IDApCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBpbnNuICY9IH4gMHhmODcwOwotICAgICAgaW5zbiB8PSAoKGFkZGVuZCAmIDB4MWYwKSA8PCA3KSB8ICgoYWRkZW5kICYgMHgwZSkgPDwgMyk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0hJMTY6Ci0gICAgICBhZGRlbmQgKz0gKGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpIDw8IDE2KTsKLSAgICAgIGFkZGVuZCA9IChhZGRlbmQgPj4gMTYpOwotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfSEkxNl9TOgotICAgICAgLyogUmVtZW1iZXIgd2hlcmUgdGhpcyByZWxvY2F0aW9uIHRvb2sgcGxhY2UuICAqLwotICAgICAgcmVtZW1iZXJfaGkxNnNfcmVsb2MgKGFiZmQsIGFkZGVuZCwgYWRkcmVzcyk7Ci0KLSAgICAgIGFkZGVuZCArPSAoYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcykgPDwgMTYpOwotICAgICAgYWRkZW5kID0gKGFkZGVuZCA+PiAxNikgKyAoKGFkZGVuZCAmIDB4ODAwMCkgIT0gMCk7Ci0gICAgICAKLSAgICAgIC8qIFRoaXMgcmVsb2NhdGlvbiBjYW5ub3Qgb3ZlcmZsb3cuICovCi0gICAgICBpZiAoYWRkZW5kID4gMHg3ZmZmKQotCWFkZGVuZCA9IDA7Ci0gICAgICAKLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX0xPMTY6Ci0gICAgICAvKiBDYWxjdWxhdGUgdGhlIHN1bSBvZiB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbiBhbmQgdGhlCi0JIGFkZGVuZCBhbmQgY2hlY2sgZm9yIG92ZXJmbG93IGZyb20gdGhlIGxvdyAxNiBiaXRzIGludG8gdGhlIGhpZ2gKLQkgMTYgYml0cy4gIFRoZSBhc3NlbWJsZXIgaGFzIGFscmVhZHkgZG9uZSBzb21lIG9mIHRoaXM6ICBJZiB0aGUKLQkgdmFsdWUgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbiBoYXMgaXRzIDE1dGggYml0IHNldCwgKGNvdW50aW5nCi0JIGZyb20gemVybykgdGhlbiB0aGUgYXNzZW1ibGVyIHdpbGwgaGF2ZSBhZGRlZCAxIHRvIHRoZSB2YWx1ZQotCSBzdG9yZWQgaW4gdGhlIGFzc29jaWF0ZWQgSEkxNlMgcmVsb2MuICBTbyBmb3IgZXhhbXBsZSwgdGhlc2UKLQkgcmVsb2NhdGlvbnM6Ci0KLQkgICAgIG1vdmhpIGhpKCBmcmVkICksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKSwgcjEsIHIxCi0KLQkgd2lsbCBzdG9yZSAwIGluIHRoZSB2YWx1ZSBmaWVsZHMgZm9yIHRoZSBNT1ZISSBhbmQgTU9WRUEgaW5zdHJ1Y3Rpb25zCi0JIGFuZCBhZGRlbmQgd2lsbCBiZSB0aGUgYWRkcmVzcyBvZiBmcmVkLCBidXQgZm9yIHRoZXNlIGluc3RydWN0aW9uczoKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgKyAweDEyMzQ1NiksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEyMzQ1NiksIHIxLCByMQotCi0JIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIE1PVkhJIGluc3RydWN0aW9uIHdpbGwgYmUgMHgxMiBhbmQgdGhlIHZhbHVlCi0JIHN0b3JlZCBpbiB0aGUgTU9WRUEgaW5zdHJ1Y3Rpb24gd2lsbCBiZSAweDM0NTYuICBJZiBob3dldmVyIHRoZQotCSBpbnN0cnVjdGlvbnMgd2VyZToKLQotCSAgICAgbW92aGkgaGkoIGZyZWQgKyAweDEwZmZmZiksIHIwLCByMQotCSAgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEwZmZmZiksIHIxLCByMQotCi0JIHRoZW4gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTU9WSEkgaW5zdHJ1Y3Rpb24gd291bGQgYmUgMHgxMSAobm90Ci0JIDB4MTApIGFuZCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbiB3b3VsZCBiZSAweGZmZmYuCi0JIFRodXMgKGFzc3VtaW5nIGZvciB0aGUgbW9tZW50IHRoYXQgdGhlIGFkZGVuZCBpcyAwKSwgYXQgcnVuIHRpbWUgdGhlCi0JIE1PVkhJIGluc3RydWN0aW9uIGxvYWRzIDB4MTEwMDAwIGludG8gcjEsIHRoZW4gdGhlIE1PVkVBIGluc3RydWN0aW9uCi0JIGFkZHMgMHhmZmZmZmZmZiAoc2lnbiBleHRlbnNpb24hKSBwcm9kdWNpbmcgMHgxMGZmZmYuICBTaW1pbGFybHkgaWYKLQkgdGhlIGluc3RydWN0aW9ucyB3ZXJlOgotCi0JICAgICBtb3ZoaSBoaSggZnJlZCAtIDEpLCByMCwgcjEKLQkgICAgIG1vdmVhIGxvKCBmcmVkIC0gMSksIHIxLCByMQotCi0JIHRoZW4gMCBpcyBzdG9yZWQgaW4gdGhlIE1PVkhJIGluc3RydWN0aW9uIGFuZCAtMSBpcyBzdG9yZWQgaW4gdGhlCi0JIE1PVkVBIGluc3RydWN0aW9uLgotCi0JIE92ZXJmbG93IGNhbiBvY2N1ciBpZiB0aGUgYWRkaXRpb24gb2YgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUKLQkgaW5zdHJ1Y3Rpb24gcGx1cyB0aGUgYWRkZW5kIHNldHMgdGhlIDE1dGggYml0IHdoZW4gYmVmb3JlIGl0IHdhcyBjbGVhci4KLQkgVGhpcyBpcyBiZWNhdXNlIHRoZSAxNXRoIGJpdCB3aWxsIGJlIHNpZ24gZXh0ZW5kZWQgaW50byB0aGUgaGlnaCBwYXJ0LAotCSB0aHVzIHJlZHVjaW5nIGl0cyB2YWx1ZSBieSBvbmUsIGJ1dCBzaW5jZSB0aGUgMTV0aCBiaXQgd2FzIG9yaWdpbmFsbHkKLQkgY2xlYXIsIHRoZSBhc3NlbWJsZXIgd2lsbCBub3QgaGF2ZSBhZGRlZCAxIHRvIHRoZSBwcmV2aW91cyBISTE2UyByZWxvYwotCSB0byBjb21wZW5zYXRlIGZvciB0aGlzIGVmZmVjdC4gIEZvciBleGFtcGxlOgotCi0JICAgIG1vdmhpIGhpKCBmcmVkICsgMHgxMjM0NTYpLCByMCwgcjEKLQkgICAgbW92ZWEgbG8oIGZyZWQgKyAweDEyMzQ1NiksIHIxLCByMQotCi0JIFRoZSB2YWx1ZSBzdG9yZWQgaW4gSEkxNlMgcmVsb2MgaXMgMHgxMiwgdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTE8xNgotCSByZWxvYyBpcyAweDM0NTYuICBJZiB3ZSBhc3N1bWUgdGhhdCB0aGUgYWRkcmVzcyBvZiBmcmVkIGlzIDB4MDAwMDcwMDAKLQkgdGhlbiB0aGUgcmVsb2NhdGlvbnMgYmVjb21lOgotCi0JICAgSEkxNlM6IDB4MDAxMiArICgweDAwMDA3MDAwID4+IDE2KSAgICA9IDB4MTIKLQkgICBMTzE2OiAgMHgzNDU2ICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHhhNDU2Ci0KLQkgYnV0IHdoZW4gdGhlIGluc3RydWN0aW9ucyBhcmUgZXhlY3V0ZWQsIHRoZSBNT1ZFQSBpbnN0cnVjdGlvbidzIHZhbHVlCi0JIGlzIHNpZ25lZCBleHRlbmRlZCwgc28gdGhlIHN1bSBiZWNvbWVzOgotCi0JICAgICAgMHgwMDEyMDAwMAotCSAgICArIDB4ZmZmZmE0NTYKLQkgICAgLS0tLS0tLS0tLS0tCi0JICAgICAgMHgwMDExYTQ1NiAgICBidXQgJ2ZyZWQgKyAweDEyMzQ1NicgPSAweDAwMTJhNDU2Ci0KLQkgTm90ZSB0aGF0IGlmIHRoZSAxNXRoIGJpdCB3YXMgc2V0IGluIHRoZSB2YWx1ZSBzdG9yZWQgaW4gdGhlIExPMTYKLQkgcmVsb2MsIHRoZW4gd2UgZG8gbm90IGhhdmUgdG8gZG8gYW55dGhpbmc6Ci0KLQkgICAgbW92aGkgaGkoIGZyZWQgKyAweDEwZmZmZiksIHIwLCByMQotCSAgICBtb3ZlYSBsbyggZnJlZCArIDB4MTBmZmZmKSwgcjEsIHIxCi0KLQkgICAgSEkxNlM6ICAweDAwMTEgKyAoMHgwMDAwNzAwMCA+PiAxNikgICAgPSAweDExCi0JICAgIExPMTY6ICAgMHhmZmZmICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHg2ZmZmCi0KLQkgICAgICAweDAwMTEwMDAwCi0JICAgICsgMHgwMDAwNmZmZgotCSAgICAtLS0tLS0tLS0tLS0KLQkgICAgICAweDAwMTE2ZmZmICA9IGZyZWQgKyAweDEwZmZmZiA9IDB4NzAwMCArIDB4MTBmZmZmCi0KLQkgCi0JIE92ZXJmbG93IGNhbiBhbHNvIG9jY3VyIGlmIHRoZSBjb21wdXRhdGlvbiBjYXJyaWVzIGludG8gdGhlIDE2dGggYml0Ci0JIGFuZCBpdCBhbHNvIHJlc3VsdHMgaW4gdGhlIDE1dGggYml0IGhhdmluZyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgMTV0aAotCSBiaXQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlLiAgIFdoYXQgaGFwcGVucyBpcyB0aGF0IHRoZSBISTE2UyByZWxvYwotCSB3aWxsIGhhdmUgYWxyZWFkeSBleGFtaW5lZCB0aGUgMTV0aCBiaXQgb2YgdGhlIG9yaWdpbmFsIHZhbHVlIGFuZAotCSBhZGRlZCAxIHRvIHRoZSBoaWdoIHBhcnQgaWYgdGhlIGJpdCBpcyBzZXQuICBUaGlzIGNvbXBlbnNhdGVzIGZvciB0aGUKLQkgc2lnbiBleHRlbnNpb24gb2YgMTV0aCBiaXQgb2YgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uICBCdXQgbm93Ci0JIHRoZXJlIGlzIGEgY2FycnkgaW50byB0aGUgMTZ0aCBiaXQsIGFuZCB0aGlzIGhhcyBub3QgYmVlbiBhbGxvd2VkIGZvci4KLQotCSBTbywgZm9yIGV4YW1wbGUgaWYgZnJlZCBpcyBhdCBhZGRyZXNzIDB4ZjAwMDoKLQotCSAgIG1vdmhpIGhpKCBmcmVkICsgMHhmZmZmKSwgcjAsIHIxICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBzZXRdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweGZmZmYpLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDEgKyAoMHgwMDAwZjAwMCA+PiAxNikgICAgPSAweDAwMDEKLQkgICBMTzE2OiAgMHhmZmZmICsgKDB4MDAwMGYwMDAgJiAweGZmZmYpID0gMHhlZmZmICAgKGNhcnJ5IGludG8gYml0IDE2IGlzIGxvc3QpCi0KLQkgICAgIDB4MDAwMTAwMDAKLQkgICArIDB4ZmZmZmVmZmYKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMGVmZmYgICBidXQgJ2ZyZWQgKyAweGZmZmYnID0gMHgwMDAxZWZmZgotCi0JIFNpbWlsYXJseSwgaWYgdGhlIDE1dGggYml0IHJlbWFpbnMgY2xlYXIsIGJ1dCBvdmVyZmxvdyBvY2N1cnMgaW50bwotCSB0aGUgMTZ0aCBiaXQgdGhlbiAoYXNzdW1pbmcgdGhlIGFkZHJlc3Mgb2YgZnJlZCBpcyAweGYwMDApOgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweDcwMDApLCByMCwgcjEgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIGNsZWFyXQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHg3MDAwKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAwICsgKDB4MDAwMGYwMDAgPj4gMTYpICAgID0gMHgwMDAwCi0JICAgTE8xNjogIDB4NzAwMCArICgweDAwMDBmMDAwICYgMHhmZmZmKSA9IDB4NmZmZiAgKGNhcnJ5IGludG8gYml0IDE2IGlzIGxvc3QpCi0KLQkgICAgIDB4MDAwMDAwMDAKLQkgICArIDB4MDAwMDZmZmYKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMDZmZmYgICBidXQgJ2ZyZWQgKyAweDcwMDAnID0gMHgwMDAxNmZmZgotCSAgIAotCSBOb3RlIC0gdGhlcmUgaXMgbm8gbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaWYgYSBjYXJyeSBvY2N1cnMsIGFuZCB0aGUKLQkgMTV0aCBiaXQgY2hhbmdlcyBpdHMgdmFsdWUgZnJvbSBiZWluZyBzZXQgdG8gYmVpbmcgY2xlYXIsIGFzIHRoZSBISTE2UwotCSByZWxvYyB3aWxsIGhhdmUgYWxyZWFkeSBhZGRlZCBpbiAxIHRvIHRoZSBoaWdoIHBhcnQgZm9yIHVzOgotCi0JICAgbW92aGkgaGkoIGZyZWQgKyAweGZmZmYpLCByMCwgcjEgICAgIFtiaXQgMTUgb2YgdGhlIG9mZnNldCBpcyBzZXRdCi0JICAgbW92ZWEgbG8oIGZyZWQgKyAweGZmZmYpLCByMSwgcjEKLQotCSAgIEhJMTZTOiAweDAwMDEgKyAoMHgwMDAwNzAwMCA+PiAxNikKLQkgICBMTzE2OiAgMHhmZmZmICsgKDB4MDAwMDcwMDAgJiAweGZmZmYpID0gMHg2ZmZmICAoY2FycnkgaW50byBiaXQgMTYgaXMgbG9zdCkKLQotCSAgICAgMHgwMDAxMDAwMAotCSAgICsgMHgwMDAwNmZmZiAgIChiaXQgMTUgbm90IHNldCwgc28gdGhlIHRvcCBoYWxmIGlzIHplcm8pCi0JICAgLS0tLS0tLS0tLS0tCi0JICAgICAweDAwMDE2ZmZmICAgd2hpY2ggaXMgcmlnaHQgKGFzc3VtaW5nIHRoYXQgZnJlZCBpcyBhdCAweDcwMDApCi0KLQkgYnV0IGlmIHRoZSAxNXRoIGJpdCBnb2VzIGZyb20gYmVpbmcgY2xlYXIgdG8gYmVpbmcgc2V0LCB0aGVuIHdlIG11c3QKLQkgb25jZSBhZ2FpbiBoYW5kbGUgb3ZlcmZsb3c6Ci0KLQkgICBtb3ZoaSBoaSggZnJlZCArIDB4NzAwMCksIHIwLCByMSAgICAgW2JpdCAxNSBvZiB0aGUgb2Zmc2V0IGlzIGNsZWFyXQotCSAgIG1vdmVhIGxvKCBmcmVkICsgMHg3MDAwKSwgcjEsIHIxCi0KLQkgICBISTE2UzogMHgwMDAwICsgKDB4MDAwMGZmZmYgPj4gMTYpCi0JICAgTE8xNjogIDB4NzAwMCArICgweDAwMDBmZmZmICYgMHhmZmZmKSA9IDB4NmZmZiAgKGNhcnJ5IGludG8gYml0IDE2KQotCi0JICAgICAweDAwMDAwMDAwCi0JICAgKyAweDAwMDA2ZmZmICAgKGJpdCAxNSBub3Qgc2V0LCBzbyB0aGUgdG9wIGhhbGYgaXMgemVybykKLQkgICAtLS0tLS0tLS0tLS0KLQkgICAgIDB4MDAwMDZmZmYgICB3aGljaCBpcyB3cm9uZyAoYXNzdW1pbmcgdGhhdCBmcmVkIGlzIGF0IDB4ZmZmZikKLQkgKi8KLQotICAgICAgewotCWxvbmcgcmVzdWx0OwotCi0JaW5zbiAgID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0JcmVzdWx0ID0gaW5zbiArIGFkZGVuZDsKLQotI2RlZmluZSBCSVQxNV9TRVQoeCkgKCh4KSAmIDB4ODAwMCkKLSNkZWZpbmUgT1ZFUkZMT1dTKGEsaSkgKCgoKGEpICYgMHhmZmZmKSArIChpKSkgPiAweGZmZmYpCi0JCi0JaWYgKChCSVQxNV9TRVQgKHJlc3VsdCkgJiYgISBCSVQxNV9TRVQgKGFkZGVuZCkpCi0JICAgIHx8IChPVkVSRkxPV1MgKGFkZGVuZCwgaW5zbikKLQkJJiYgKCghIEJJVDE1X1NFVCAoaW5zbikpIHx8IChCSVQxNV9TRVQgKGFkZGVuZCkpKSkpCi0JICB7Ci0JICAgIGJvb2xlYW4gYWxyZWFkeV91cGRhdGVkOwotCSAgICBiZmRfYnl0ZSAqIGhpMTZzX2FkZHJlc3MgPSBmaW5kX3JlbWVtYmVyZWRfaGkxNnNfcmVsb2MKLQkgICAgICAoYWRkZW5kLCAmIGFscmVhZHlfdXBkYXRlZCk7Ci0JICAgIAotCSAgICAvKiBBbWVuZCB0aGUgbWF0Y2hpbmcgSEkxNl9TIHJlbG9jYXRpb24uICAqLwotCSAgICBpZiAoaGkxNnNfYWRkcmVzcyAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKCEgYWxyZWFkeV91cGRhdGVkKQotCQkgIHsKLQkJICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBoaTE2c19hZGRyZXNzKTsKLQkJICAgIGluc24gKz0gMTsKLQkJICAgIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGhpMTZzX2FkZHJlc3MpOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0ZGVyciwgXygiRkFJTEVEIHRvIGZpbmQgcHJldmlvdXMgSEkxNiByZWxvY1xuIikpOwotCQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotCSAgICAgIH0KLQkgIH0KLQkKLQkvKiBEbyBub3QgY29tcGxhaW4gaWYgdmFsdWUgaGFzIHRvcCBiaXQgc2V0LCBhcyB0aGlzIGhhcyBiZWVuIGFudGljaXBhdGVkLiAgKi8KLQlpbnNuID0gcmVzdWx0ICYgMHhmZmZmOwotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSBSX1Y4NTBfODoKLSAgICAgIGFkZGVuZCArPSAoY2hhcikgYmZkX2dldF84IChhYmZkLCBhZGRyZXNzKTsKLQotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2YgfHwgc2FkZGVuZCA8IC0weDgwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0KLSAgICBjYXNlIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ6Ci0gICAgICBhZGRlbmQgKz0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweGZmZmYgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAgICAgaW5zbiA9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfMTY6Ci0KLSAgICAgIC8qIGRyb3AgdGhyb3VnaCAqLyAgICAgICAgICAgIAotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDoKLSAgICBjYXNlIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VUOgotICAgICAgYWRkZW5kICs9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZmZmIHx8IHNhZGRlbmQgPCAtMHg4MDAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgICAgIGluc24gPSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1NEQV8xNV8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfWkRBXzE1XzE2X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoaW5zbiAmIDB4ZmZmZSk7Ci0gICAgICAKLSAgICAgIHNhZGRlbmQgPSAoYmZkX3NpZ25lZF92bWEpIGFkZGVuZDsKLSAgICAgIAotICAgICAgaWYgKHNhZGRlbmQgPiAweDdmZmUgfHwgc2FkZGVuZCA8IC0weDgwMDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0gICAgICAgIHJldHVybiBiZmRfcmVsb2NfZGFuZ2Vyb3VzOwotICAgICAgCi0gICAgICBpbnNuID0gKGFkZGVuZCAmIH4xKSB8IChpbnNuICYgMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV82XzhfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4N2UpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmYyB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMykKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODE7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV83XzhfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4N2YpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmZSB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1REQV83XzdfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9IGluc24gJiAweDdmOwotCQotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2YgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IGFkZGVuZDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfVERBXzRfNV9PRkZTRVQ6Ci0gICAgICBpbnNuID0gYmZkX2dldF8xNiAoYWJmZCwgYWRkcmVzcyk7Ci0gICAgICBhZGRlbmQgKz0gKChpbnNuICYgMHhmKSA8PCAxKTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4MWUgfHwgc2FkZGVuZCA8IDApCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgaWYgKGFkZGVuZCAmIDEpCi0JcmV0dXJuIGJmZF9yZWxvY19kYW5nZXJvdXM7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZmYwOwotICAgICAgaW5zbiB8PSAoYWRkZW5kID4+IDEpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9UREFfNF80X09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzE2IChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSBpbnNuICYgMHhmOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHhmIHx8IHNhZGRlbmQgPCAwKQotCXJldHVybiBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICAKLSAgICAgIGluc24gJj0gMHhmZmYwOwotICAgICAgaW5zbiB8PSBhZGRlbmQ7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChhYmZkLCBhZGRyZXNzKTsKLSAgICAgIGFkZGVuZCArPSAoKGluc24gJiAweGZmZmUwMDAwKSA+PiAxNikgKyAoKGluc24gJiAweDIwKSA+PiA1KTsKLSAgICAgIAotICAgICAgc2FkZGVuZCA9IChiZmRfc2lnbmVkX3ZtYSkgYWRkZW5kOwotICAgICAgCi0gICAgICBpZiAoc2FkZGVuZCA+IDB4N2ZmZiB8fCBzYWRkZW5kIDwgLTB4ODAwMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpbnNuICY9IDB4MDAwMWZmZGY7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgJiAxKSA8PCA1OwotICAgICAgaW5zbiB8PSAoYWRkZW5kICYgfjEpIDw8IDE2OwotICAgICAgCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBpbnNuLCBhZGRyZXNzKTsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgICAKLSAgICBjYXNlIFJfVjg1MF9DQUxMVF82XzdfT0ZGU0VUOgotICAgICAgaW5zbiA9IGJmZF9nZXRfMTYgKGFiZmQsIGFkZHJlc3MpOwotICAgICAgYWRkZW5kICs9ICgoaW5zbiAmIDB4M2YpIDw8IDEpOwotICAgICAgCi0gICAgICBzYWRkZW5kID0gKGJmZF9zaWduZWRfdm1hKSBhZGRlbmQ7Ci0gICAgICAKLSAgICAgIGlmIChzYWRkZW5kID4gMHg3ZSB8fCBzYWRkZW5kIDwgMCkKLQlyZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgCi0gICAgICBpZiAoYWRkZW5kICYgMSkKLQlyZXR1cm4gYmZkX3JlbG9jX2Rhbmdlcm91czsKLSAgICAgIAotICAgICAgaW5zbiAmPSAweGZmODA7Ci0gICAgICBpbnNuIHw9IChhZGRlbmQgPj4gMSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgY2FzZSBSX1Y4NTBfR05VX1ZURU5UUlk6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotCi0gICAgfQotCi0gIGJmZF9wdXRfMTYgKGFiZmQsIGluc24sIGFkZHJlc3MpOwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0MCi0vKiBJbnNlcnQgdGhlIGFkZGVuZCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9yZWxvYyAoYWJmZCwgcmVsb2MsIHN5bWJvbCwgZGF0YSwgaXNlY3Rpb24sIG9iZmQsIGVycikKLSAgICAgYmZkICogICAgICAgYWJmZDsKLSAgICAgYXJlbGVudCAqICAgcmVsb2M7Ci0gICAgIGFzeW1ib2wgKiAgIHN5bWJvbDsKLSAgICAgUFRSICAgICAgICAgZGF0YTsKLSAgICAgYXNlY3Rpb24gKiAgaXNlY3Rpb247Ci0gICAgIGJmZCAqICAgICAgIG9iZmQ7Ci0gICAgIGNoYXIgKiogICAgIGVycjsKLXsKLSAgbG9uZyByZWxvY2F0aW9uOwotICAKLSAgLyogSWYgdGhlcmUgaXMgYW4gb3V0cHV0IEJGRCwKLSAgICAgYW5kIHRoZSBzeW1ib2wgaXMgbm90IGEgc2VjdGlvbiBuYW1lICh3aGljaCBpcyBvbmx5IGRlZmluZWQgYXQgZmluYWwgbGluayB0aW1lKSwKLSAgICAgYW5kIGVpdGhlciB3ZSBhcmUgbm90IHB1dHRpbmcgdGhlIGFkZGVuZCBpbnRvIHRoZSBpbnN0cnVjdGlvbgotICAgICAgICAgb3IgdGhlIGFkZGVuZCBpcyB6ZXJvLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGFkZCBpbnRvIHRoZSBpbnN0cnVjdGlvbgotICAgICB0aGVuIGp1c3QgZml4dXAgdGhlIGFkZHJlc3MgYW5kIHJldHVybi4gICovCi0gIGlmIChvYmZkICE9IChiZmQgKikgTlVMTAotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmICghIHJlbG9jLT5ob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvYy0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRyZXNzICs9IGlzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0jaWYgMCAgCi0gIGVsc2UgaWYgKG9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAKLSAgLyogQ2F0Y2ggcmVsb2NzIGludm9sdmluZyB1bmRlZmluZWQgc3ltYm9scy4gICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDAKLSAgICAgICYmIG9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBXZSBoYW5kbGUgZmluYWwgbGlua2luZyBvZiBzb21lIHJlbG9jcyBvdXJzZWx2ZXMuICAqLwotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2MtPmFkZHJlc3MgPiBpc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLSAgCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotICAKLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0gIAotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlICsgYWRkZW5kLiAgKi8KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jLT5hZGRlbmQ7Ci0gIAotICBpZiAocmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIEhlcmUgdGhlIHZhcmlhYmxlIHJlbG9jYXRpb24gaG9sZHMgdGhlIGZpbmFsIGFkZHJlc3Mgb2YgdGhlCi0JIHN5bWJvbCB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0LCBwbHVzIGFueSBhZGRlbmQuICAqLwotICAgICAgcmVsb2NhdGlvbiAtPSBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgCi0gICAgICAvKiBEZWFsIHdpdGggcGNyZWxfb2Zmc2V0ICovCi0gICAgICByZWxvY2F0aW9uIC09IHJlbG9jLT5hZGRyZXNzOwotICAgIH0KLQotICByZWxvYy0+YWRkZW5kID0gcmVsb2NhdGlvbjsJCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLQwKLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqICAgICAgICAgYWJmZDsKLSAgICAgY29uc3QgY2hhciAqICBuYW1lOwotewotICByZXR1cm4gKCAgIChuYW1lWzBdID09ICcuJyAmJiAobmFtZVsxXSA9PSAnTCcgfHwgbmFtZVsxXSA9PSAnLicpKQotCSAgfHwgKG5hbWVbMF0gPT0gJ18nICYmICBuYW1lWzFdID09ICcuJyAmJiBuYW1lWzJdID09ICdMJyAmJiBuYW1lWzNdID09ICdfJykpOwotfQotCi0MCi0vKiBQZXJmb3JtIGEgcmVsb2NhdGlvbiBhcyBwYXJ0IG9mIGEgZmluYWwgbGluay4gICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi12ODUwX2VsZl9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBvdXRwdXRfYmZkLAotCQkJCSAgICBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgb2Zmc2V0LCB2YWx1ZSwKLQkJCQkgICAgYWRkZW5kLCBpbmZvLCBzeW1fc2VjLCBpc19sb2NhbCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgaG93dG87Ci0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYmZkICogICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKiAgICAgICAgICAgICAgY29udGVudHM7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIG9mZnNldDsKLSAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgdmFsdWU7Ci0gICAgIGJmZF92bWEgICAgICAgICAgICAgICAgIGFkZGVuZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgaW5mbzsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICAgc3ltX3NlYzsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaXNfbG9jYWw7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIHJfdHlwZSAgID0gaG93dG8tPnR5cGU7Ci0gIGJmZF9ieXRlICogICAgIGhpdF9kYXRhID0gY29udGVudHMgKyBvZmZzZXQ7Ci0KLSAgLyogQWRqdXN0IHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHJlbG9jYXRpb24uICAqLwotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1Y4NTBfOV9QQ1JFTDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICB2YWx1ZSAtPSBvZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICAKLSAgICBjYXNlIFJfVjg1MF8yMl9QQ1JFTDoKLSAgICAgIHZhbHVlIC09IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkrIG9mZnNldCk7Ci0KLSAgICAgIC8qIElmIHRoZSBzaWduIGV4dGVuc2lvbiB3aWxsIGNvcnJ1cHQgdGhlIHZhbHVlIHRoZW4gd2UgaGF2ZSBvdmVyZmxvd2VkLiAgKi8KLSAgICAgIGlmICgoKHZhbHVlICYgMHhmZjAwMDAwMCkgIT0gMHgwKSAmJiAoKHZhbHVlICYgMHhmZjAwMDAwMCkgIT0gMHhmZjAwMDAwMCkpCi0JcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICAgIAotICAgICAgdmFsdWUgPSBTRVhUMjQgKHZhbHVlKTsgIC8qIE9ubHkgdGhlIGJvdHRvbSAyNCBiaXRzIG9mIHRoZSBQQyBhcmUgdmFsaWQgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfSEkxNl9TOgotICAgIGNhc2UgUl9WODUwX0hJMTY6Ci0gICAgY2FzZSBSX1Y4NTBfTE8xNjoKLSAgICBjYXNlIFJfVjg1MF8xNjoKLSAgICBjYXNlIFJfVjg1MF8zMjoKLSAgICBjYXNlIFJfVjg1MF84OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOgkKLSAgICBjYXNlIFJfVjg1MF9aREFfMTZfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ6Ci0gICAgICBpZiAoc3ltX3NlYyA9PSBOVUxMKQotCXJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0gICAgICB2YWx1ZSAtPSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfVjg1MF9TREFfMTVfMTZfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1NEQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGdwOwotCXN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQotCWlmIChzeW1fc2VjID09IE5VTEwpCi0JICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQkgIAotCS8qIEdldCB0aGUgdmFsdWUgb2YgX19ncC4gICovCi0JaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCAiX19ncCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotCi0JZ3AgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl2YWx1ZSAtPSAoZ3AgLSBzeW1fc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hKTsKLSAgICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgUl9WODUwX1REQV80XzRfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV80XzVfT0ZGU0VUOgotICAgIGNhc2UgUl9WODUwX1REQV8xNl8xNl9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzdfN19PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzdfOF9PRkZTRVQ6Ci0gICAgY2FzZSBSX1Y4NTBfVERBXzZfOF9PRkZTRVQ6Ci0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyAgICAgICAgICAgICAgICBlcDsKLQlzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0JCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2VwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2VwIiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQlpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgICB8fCBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZCkKLQkgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7ICAvKiBBY3R1YWxseSB0aGlzIGluZGljYXRlcyB0aGF0IF9fZXAgY291bGQgbm90IGJlIGZvdW5kLiAqLwotCi0JZXAgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gZXA7Ci0gICAgICB9Ci0gICAgYnJlYWs7Ci0gICAgCi0gICAgY2FzZSBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGN0YnA7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCQotCS8qIEdldCB0aGUgdmFsdWUgb2YgX19jdGJwLiAgKi8KLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsICJfX2N0YnAiLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCWlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgIHx8IGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCSAgcmV0dXJuIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk7ICAvKiBBY3R1YWxseSB0aGlzIGluZGljYXRlcyB0aGF0IF9fY3RicCBjb3VsZCBub3QgYmUgZm91bmQuICovCi0KLQljdGJwID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQl2YWx1ZSAtPSBjdGJwOwotICAgICAgfQotICAgIGJyZWFrOwotICAgIAotICAgIGNhc2UgUl9WODUwX0NBTExUXzE2XzE2X09GRlNFVDoKLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgIGN0YnA7Ci0Jc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiBoOwotCi0JaWYgKHN5bV9zZWMgPT0gTlVMTCkKLQkgIHJldHVybiBiZmRfcmVsb2NfdW5kZWZpbmVkOwotCSAgCi0JLyogR2V0IHRoZSB2YWx1ZSBvZiBfX2N0YnAuICAqLwotCWggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgIl9fY3RicCIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICAgfHwgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JICByZXR1cm4gKGJmZF9yZWxvY19kYW5nZXJvdXMgKyAxKTsKLQotCWN0YnAgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkgICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JdmFsdWUgLT0gc3ltX3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQl2YWx1ZSAtPSAoY3RicCAtIHN5bV9zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEpOwotICAgICAgfQotICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSX1Y4NTBfTk9ORToKLSAgICBjYXNlIFJfVjg1MF9HTlVfVlRJTkhFUklUOgotICAgIGNhc2UgUl9WODUwX0dOVV9WVEVOVFJZOgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLSAgICB9Ci0KLSAgLyogUGVyZm9ybSB0aGUgcmVsb2NhdGlvbi4gICovCi0gIHJldHVybiB2ODUwX2VsZl9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwgcl90eXBlLCB2YWx1ZSArIGFkZGVuZCwgaGl0X2RhdGEpOyAKLX0KLQotDAotLyogUmVsb2NhdGUgYW4gVjg1MCBFTEYgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqICAgICAgICAgICAgICAgICAgb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiBpbmZvOwotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqICAgICAgICAgICAgIGNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgIHJlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqICAgICBsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKiAgICAgICAgICAgIGxvY2FsX3NlY3Rpb25zOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqICAgICAgICAgICBzeW10YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiBzeW1faGFzaGVzOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqICAgICAgICAgICByZWw7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogICAgICAgICAgIHJlbGVuZDsKLQotICBzeW10YWJfaGRyID0gJiBlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICBpZiAoc3ltX2hhc2hlcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluZm8tPmNhbGxiYWNrcy0+d2FybmluZwotCShpbmZvLCAibm8gaGFzaCB0YWJsZSBhdmFpbGFibGUiLCBOVUxMLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIDApOwotCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAKLSAgLyogUmVzZXQgdGhlIGxpc3Qgb2YgcmVtZW1iZXJlZCBISTE2UyByZWxvY3MgdG8gZW1wdHkuICAqLwotICBmcmVlX2hpMTZzICAgICA9IHByZXZpb3VzX2hpMTZzOwotICBwcmV2aW91c19oaTE2cyA9IE5VTEw7Ci0gIGhpMTZzX2NvdW50ZXIgID0gMDsKLSAgCi0gIHJlbCAgICA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgcl90eXBlOwotICAgICAgcmVsb2NfaG93dG9fdHlwZSAqICAgICAgICAgICBob3d0bzsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgcl9zeW1uZHg7Ci0gICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgICAgICAgIHN5bTsKLSAgICAgIGFzZWN0aW9uICogICAgICAgICAgICAgICAgICAgc2VjOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiBoOwotICAgICAgYmZkX3ZtYSAgICAgICAgICAgICAgICAgICAgICByZWxvY2F0aW9uOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlICAgICAgICByOwotCi0gICAgICByX3N5bW5keCA9IEVMRjMyX1JfU1lNIChyZWwtPnJfaW5mbyk7Ci0gICAgICByX3R5cGUgICA9IEVMRjMyX1JfVFlQRSAocmVsLT5yX2luZm8pOwotCi0gICAgICBpZiAocl90eXBlID09IFJfVjg1MF9HTlVfVlRFTlRSWQotICAgICAgICAgIHx8IHJfdHlwZSA9PSBSX1Y4NTBfR05VX1ZUSU5IRVJJVCkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGhvd3RvID0gdjg1MF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgV2UgZG9uJ3QgaGF2ZSB0byBjaGFuZ2UKLSAgICAgICAgICAgICBhbnl0aGluZywgdW5sZXNzIHRoZSByZWxvYyBpcyBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsCi0gICAgICAgICAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBzeW1ib2wgd2luZHMgdXAgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLQkgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JICAgIHsKLQkgICAgICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICAgICAgaWYgKEVMRl9TVF9UWVBFIChzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotICAgICAgaCA9IE5VTEw7Ci0gICAgICBzeW0gPSBOVUxMOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIGlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCSAgcmVsb2NhdGlvbiA9IChzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHN5bS0+c3RfdmFsdWUpOwotI2lmIDAKLQkgIHsKLQkgICAgY2hhciAqIG5hbWU7Ci0JICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChpbnB1dF9iZmQsIHN5bXRhYl9oZHItPnNoX2xpbmssIHN5bS0+c3RfbmFtZSk7Ci0JICAgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/ICI8bm9uZT4iIDogbmFtZTsKLWZwcmludGYgKHN0ZGVyciwgImxvY2FsOiBzZWM6ICVzLCBzeW06ICVzICglZCksIHZhbHVlOiAleCArICV4ICsgJXggYWRkZW5kICV4XG4iLAotCSBzZWMtPm5hbWUsIG5hbWUsIHN5bS0+c3RfbmFtZSwKLQkgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hLCBzZWMtPm91dHB1dF9vZmZzZXQsIHN5bS0+c3RfdmFsdWUsIHJlbC0+cl9hZGRlbmQpOwotCSAgfQotI2VuZGlmCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICAKLQkgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCSAgCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgcmVsb2NhdGlvbiA9IChoLT5yb290LnUuZGVmLnZhbHVlCi0JCQkgICAgKyBzZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0jaWYgMAotZnByaW50ZiAoc3RkZXJyLCAiZGVmaW5lZDogc2VjOiAlcywgbmFtZTogJXMsIHZhbHVlOiAleCArICV4ICsgJXggZ2l2ZXM6ICV4XG4iLAotCSBzZWMtPm5hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGgtPnJvb3QudS5kZWYudmFsdWUsIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSwgc2VjLT5vdXRwdXRfb2Zmc2V0LCByZWxvY2F0aW9uKTsKLSNlbmRpZgotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JICAgIHsKLSNpZiAwCi1mcHJpbnRmIChzdGRlcnIsICJ1bmRlZmluZWQ6IHNlYzogJXMsIG5hbWU6ICVzXG4iLAotCSBzZWMtPm5hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotI2VuZGlmCi0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgaW5wdXRfYmZkLAotCQkgICAgICBpbnB1dF9zZWN0aW9uLCByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLSNpZiAwCi1mcHJpbnRmIChzdGRlcnIsICJ1bmtub3duOiBuYW1lOiAlc1xuIiwgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0jZW5kaWYKLQkgICAgICByZWxvY2F0aW9uID0gMDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRklYTUU6IFdlIHNob3VsZCB1c2UgdGhlIGFkZGVuZCwgYnV0IHRoZSBDT0ZGIHJlbG9jYXRpb25zCi0gICAgICAgICBkb24ndC4gICovCi0gICAgICByID0gdjg1MF9lbGZfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgb3V0cHV0X2JmZCwKLQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCXJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQsCi0JCQkJCWluZm8sIHNlYywgaCA9PSBOVUxMKTsKLQotICAgICAgaWYgKHIgIT0gYmZkX3JlbG9jX29rKQotCXsKLQkgIGNvbnN0IGNoYXIgKiBuYW1lOwotCSAgY29uc3QgY2hhciAqIG1zZyA9IChjb25zdCBjaGFyICopMDsKLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBuYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJICAgICAgKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCAqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocikKLQkgICAgewotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnJlbG9jX292ZXJmbG93KQotCQkgICAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2NfdW5kZWZpbmVkOgotCSAgICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJICAgICAoaW5mbywgbmFtZSwgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgICByZWwtPnJfb2Zmc2V0KSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgICAgIG1zZyA9IF8oImludGVybmFsIGVycm9yOiBvdXQgb2YgcmFuZ2UgZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIGJmZF9yZWxvY19kYW5nZXJvdXM6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IGRhbmdlcm91cyByZWxvY2F0aW9uIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0KLQkgICAgY2FzZSBiZmRfcmVsb2Nfb3RoZXI6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19ncCIpOwotCSAgICAgIGdvdG8gY29tbW9uX2Vycm9yOwotCi0JICAgIGNhc2UgYmZkX3JlbG9jX2NvbnRpbnVlOgotCSAgICAgIG1zZyA9IF8oImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZXAiKTsKLQkgICAgICBnb3RvIGNvbW1vbl9lcnJvcjsKLQotCSAgICBjYXNlIChiZmRfcmVsb2NfZGFuZ2Vyb3VzICsgMSk6Ci0JICAgICAgbXNnID0gXygiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19jdGJwIik7Ci0JICAgICAgZ290byBjb21tb25fZXJyb3I7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgbXNnID0gXygiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiKTsKLQkgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotCSAgICBjb21tb25fZXJyb3I6Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgbXNnLCBuYW1lLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfZ2Nfc3dlZXBfaG9vayAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIC8qIE5vIGdvdCBhbmQgcGx0IGVudHJpZXMgZm9yIHY4NTAtZWxmICovCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotdjg1MF9lbGZfZ2NfbWFya19ob29rIChhYmZkLCBpbmZvLCByZWwsIGgsIHN5bSkKLSAgICAgICBiZmQgKmFiZmQ7Ci0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGlmIChoICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChFTEYzMl9SX1RZUEUgKHJlbC0+cl9pbmZvKSkKLSAgICAgIHsKLSAgICAgIGNhc2UgUl9WODUwX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBjYXNlIFJfVjg1MF9HTlVfVlRFTlRSWToKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoaC0+cm9vdC50eXBlKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgICAgICAgIHJldHVybiBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0KLSAgICAgICAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgICAgICAgcmV0dXJuIGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgZWxzZQotICAgICB7Ci0gICAgICAgaWYgKCEoZWxmX2JhZF9zeW10YWIgKGFiZmQpCi0gICAgICAgICAgICYmIEVMRl9TVF9CSU5EIChzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLSAgICAgICAgICYmICEgKChzeW0tPnN0X3NobmR4IDw9IDAgfHwgc3ltLT5zdF9zaG5keCA+PSBTSE5fTE9SRVNFUlZFKQotICAgICAgICAgICAgICAgICYmIHN5bS0+c3Rfc2huZHggIT0gU0hOX0NPTU1PTikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0tPnN0X3NobmR4KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotLyogU2V0IHRoZSByaWdodCBtYWNoaW5lIG51bWJlci4gICovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVfVjg1MF9BUkNIOiAgICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCAwKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFX0FSQ0g6ICAodm9pZCkgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfdjg1MCwgYmZkX21hY2hfdjg1MGUpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVBX0FSQ0g6ICh2b2lkKSBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF92ODUwLCBiZmRfbWFjaF92ODUwZWEpOyBicmVhazsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdG9yZSB0aGUgbWFjaGluZSBudW1iZXIgaW4gdGhlIGZsYWdzIGZpZWxkLiAgKi8KLXN0YXRpYyB2b2lkCi12ODUwX2VsZl9maW5hbF93cml0ZV9wcm9jZXNzaW5nIChhYmZkLCBsaW5rZXIpCi0gICAgIGJmZCAqICAgYWJmZDsKLSAgICAgYm9vbGVhbiBsaW5rZXI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdmFsOwotCi0gIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6IHZhbCA9IEVfVjg1MF9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlOiAgdmFsID0gRV9WODUwRV9BUkNIOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogdmFsID0gRV9WODUwRUFfQVJDSDsgIGJyZWFrOwotICAgIH0KLQotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmPX4gRUZfVjg1MF9BUkNIOwotICBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyB8PSB2YWw7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGtlZXAgVjg1MCBzcGVjaWZpYyBmaWxlIGZsYWdzLiAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBmbGFncykKLSAgICAgYmZkICogICAgYWJmZDsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAoYWJmZCkKLQkgICAgICB8fCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyA9PSBmbGFncyk7Ci0KLSAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfZmxhZ3MgPSBmbGFnczsKLSAgZWxmX2ZsYWdzX2luaXQgKGFiZmQpID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gb25lIG9iamVjdCBtb2R1bGUgdG8gYW5vdGhlciAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkKLSAgICAgYmZkICogaWJmZDsKLSAgICAgYmZkICogb2JmZDsKLXsKLSAgaWYgKCAgIGJmZF9nZXRfZmxhdm91ciAoaWJmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIEJGRF9BU1NFUlQgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkKLQkgICAgICB8fCAoZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MKLQkJICA9PSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFncykpOwotCi0gIGVsZl9ncCAob2JmZCkgPSBlbGZfZ3AgKGliZmQpOwotICBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLXN0YXRpYyBib29sZWFuCi12ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKiBpYmZkOwotICAgICBiZmQgKiBvYmZkOwotewotICBmbGFnd29yZCBvdXRfZmxhZ3M7Ci0gIGZsYWd3b3JkIGluX2ZsYWdzOwotCi0gIGlmICggICBiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbl9mbGFncyA9IGVsZl9lbGZoZWFkZXIgKGliZmQpLT5lX2ZsYWdzOwotICBvdXRfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChvYmZkKS0+ZV9mbGFnczsKLQotICBpZiAoISBlbGZfZmxhZ3NfaW5pdCAob2JmZCkpCi0gICAgewotICAgICAgLyogSWYgdGhlIGlucHV0IGlzIHRoZSBkZWZhdWx0IGFyY2hpdGVjdHVyZSB0aGVuIGRvIG5vdAotCSBib3RoZXIgc2V0dGluZyB0aGUgZmxhZ3MgZm9yIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLAotCSBpbnN0ZWFkIGFsbG93IGZ1dHVyZSBtZXJnZXMgdG8gZG8gdGhpcy4gIElmIG5vIGZ1dHVyZQotCSBtZXJnZXMgZXZlciBzZXQgdGhlc2UgZmxhZ3MgdGhlbiB0aGV5IHdpbGwgcmV0YWluIHRoZWlyCi0JIHVuaXRpYWxpc2VkIHZhbHVlcywgd2hpY2ggc3VycHJpc2Ugc3VycHJpc2UsIGNvcnJlc3BvbmQKLQkgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2FyY2hfaW5mbyAoaWJmZCktPnRoZV9kZWZhdWx0KQotCXJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBlbGZfZmxhZ3NfaW5pdCAob2JmZCkgPSB0cnVlOwotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBpbl9mbGFnczsKLQotICAgICAgaWYgKGJmZF9nZXRfYXJjaCAob2JmZCkgPT0gYmZkX2dldF9hcmNoIChpYmZkKQotCSAgJiYgYmZkX2dldF9hcmNoX2luZm8gKG9iZmQpLT50aGVfZGVmYXVsdCkKLQl7Ci0JICByZXR1cm4gYmZkX3NldF9hcmNoX21hY2ggKG9iZmQsIGJmZF9nZXRfYXJjaCAoaWJmZCksIGJmZF9nZXRfbWFjaCAoaWJmZCkpOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGZsYWcgY29tcGF0aWJpbGl0eS4gICovCi0gIGlmIChpbl9mbGFncyA9PSBvdXRfZmxhZ3MpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gKG91dF9mbGFncyAmIEVGX1Y4NTBfQVJDSCkKLSAgICAgICYmIChpbl9mbGFncyAmIEVGX1Y4NTBfQVJDSCkgIT0gRV9WODUwX0FSQ0gpCi0gICAgX2JmZF9lcnJvcl9oYW5kbGVyIChfKCIlczogQXJjaGl0ZWN0dXJlIG1pc21hdGNoIHdpdGggcHJldmlvdXMgbW9kdWxlcyIpLAotCQkJYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotLyogRGlzcGxheSB0aGUgZmxhZ3MgZmllbGQgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHB0cikKLSAgICAgYmZkICogICBhYmZkOwotICAgICBQVFIgICAgIHB0cjsKLXsKLSAgRklMRSAqIGZpbGUgPSAoRklMRSAqKSBwdHI7Ci0gIAotICBCRkRfQVNTRVJUIChhYmZkICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpOwotICAKLSAgX2JmZF9lbGZfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgcHRyKTsKLSAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oInByaXZhdGUgZmxhZ3MgPSAlbHg6ICIpLCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyk7Ci0gIAotICBzd2l0Y2ggKGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX2ZsYWdzICYgRUZfVjg1MF9BUkNIKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgRV9WODUwX0FSQ0g6IGZwcmludGYgKGZpbGUsIF8oInY4NTAgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICBjYXNlIEVfVjg1MEVfQVJDSDogIGZwcmludGYgKGZpbGUsIF8oInY4NTBlIGFyY2hpdGVjdHVyZSIpKTsgYnJlYWs7Ci0gICAgY2FzZSBFX1Y4NTBFQV9BUkNIOiBmcHJpbnRmIChmaWxlLCBfKCJ2ODUwZWEgYXJjaGl0ZWN0dXJlIikpOyBicmVhazsKLSAgICB9Ci0gIAotICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVjg1MCBFTEYgdXNlcyBmb3VyIGNvbW1vbiBzZWN0aW9ucy4gIE9uZSBpcyB0aGUgdXN1YWwgb25lLCBhbmQgdGhlCi0gICBvdGhlcnMgYXJlIGZvciAoc21hbGwpIG9iamVjdHMgaW4gb25lIG9mIHRoZSBzcGVjaWFsIGRhdGEgYXJlYXM6Ci0gICBzbWFsbCwgdGlueSBhbmQgemVyby4gIEFsbCB0aGUgb2JqZWN0cyBhcmUga2VwdCB0b2dldGhlciwgYW5kIHRoZW4KLSAgIHJlZmVyZW5jZWQgdmlhIHRoZSBncCByZWdpc3RlciwgdGhlIGVwIHJlZ2lzdGVyIG9yIHRoZSByMCByZWdpc3RlcgotICAgcmVzcGVjdGl2ZWx5LCB3aGljaCB5aWVsZHMgc21hbGxlciwgZmFzdGVyIGFzc2VtYmxlciBjb2RlLiAgVGhpcwotICAgYXBwcm9hY2ggaXMgY29waWVkIGZyb20gZWxmMzItbWlwcy5jLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICB2ODUwX2VsZl9zY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgIHY4NTBfZWxmX3Njb21fc3ltYm9sOwotc3RhdGljIGFzeW1ib2wgKiB2ODUwX2VsZl9zY29tX3N5bWJvbF9wdHI7Ci1zdGF0aWMgYXNlY3Rpb24gIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLXN0YXRpYyBhc3ltYm9sICAgdjg1MF9lbGZfdGNvbV9zeW1ib2w7Ci1zdGF0aWMgYXN5bWJvbCAqIHY4NTBfZWxmX3Rjb21fc3ltYm9sX3B0cjsKLXN0YXRpYyBhc2VjdGlvbiAgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotc3RhdGljIGFzeW1ib2wgICB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLXN0YXRpYyBhc3ltYm9sICogdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOwotCi0KLS8qIEdpdmVuIGEgQkZEIHNlY3Rpb24sIHRyeSB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRUxGIHNlY3Rpb24KLSAgIGluZGV4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAoYWJmZCwgaGRyLCBzZWMsIHJldHZhbCkKLSAgICAgYmZkICogICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBoZHI7Ci0gICAgIGFzZWN0aW9uICogICAgICAgICAgICBzZWM7Ci0gICAgIGludCAqICAgICAgICAgICAgICAgICByZXR2YWw7Ci17Ci0gIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnNjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9TQ09NTU9OOwotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnRjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9UQ09NTU9OOwotICBlbHNlIGlmIChzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpLCAiLnpjb21tb24iKSA9PSAwKQotICAgICpyZXR2YWwgPSBTSE5fVjg1MF9aQ09NTU9OOwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgc3BlY2lhbCBWODUwIHNlY3Rpb24gbnVtYmVycyB0aGF0IGEgc3ltYm9sIG1heSB1c2UuICAqLwotCi1zdGF0aWMgdm9pZAotdjg1MF9lbGZfc3ltYm9sX3Byb2Nlc3NpbmcgKGFiZmQsIGFzeW0pCi0gICAgIGJmZCAqICAgICBhYmZkOwotICAgICBhc3ltYm9sICogYXN5bTsKLXsKLSAgZWxmX3N5bWJvbF90eXBlICogZWxmc3ltID0gKGVsZl9zeW1ib2xfdHlwZSAqKSBhc3ltOwotICB1bnNpZ25lZCBzaG9ydCBpbmRleDsKLSAgCi0gIGluZGV4ID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NobmR4OwotCi0gIC8qIElmIHRoZSBzZWN0aW9uIGluZGV4IGlzIGFuICJvcmRpbmFyeSIgaW5kZXgsIHRoZW4gaXQgbWF5Ci0gICAgIHJlZmVyIHRvIGEgdjg1MCBzcGVjaWZpYyBzZWN0aW9uIGNyZWF0ZWQgYnkgdGhlIGFzc2VtYmxlci4KLSAgICAgQ2hlY2sgdGhlIHNlY3Rpb24ncyB0eXBlIGFuZCBjaGFuZ2UgdGhlIGluZGV4IGl0IG1hdGNoZXMuCi0gICAgIAotICAgICBGSVhNRTogU2hvdWxkIHdlIGFsdGVyIHRoZSBzdF9zaG5keCBmaWVsZCBhcyB3ZWxsID8gICovCi0gIAotICBpZiAoaW5kZXggPCBlbGZfZWxmaGVhZGVyKGFiZmQpWzBdLmVfc2hudW0pCi0gICAgc3dpdGNoIChlbGZfZWxmc2VjdGlvbnMoYWJmZClbaW5kZXhdLT5zaF90eXBlKQotICAgICAgewotICAgICAgY2FzZSBTSFRfVjg1MF9TQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfVENPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1RDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBjYXNlIFNIVF9WODUwX1pDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9aQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLSAgCi0gIHN3aXRjaCAoaW5kZXgpCi0gICAgewotICAgIGNhc2UgU0hOX1Y4NTBfU0NPTU1PTjoKLSAgICAgIGlmICh2ODUwX2VsZl9zY29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHNtYWxsIGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OIHwgU0VDX0FMTE9DIHwgU0VDX0RBVEE7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Njb21fc2VjdGlvbi5zeW1ib2wgICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2w7Ci0JICB2ODUwX2VsZl9zY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0cjsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sLm5hbWUgICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbC5mbGFncyAgICAgICAgICAgPSBCU0ZfU0VDVElPTl9TWU07Ci0JICB2ODUwX2VsZl9zY29tX3N5bWJvbC5zZWN0aW9uICAgICAgICAgPSAmIHY4NTBfZWxmX3Njb21fc2VjdGlvbjsKLQkgIHY4NTBfZWxmX3Njb21fc3ltYm9sX3B0ciAgICAgICAgICAgICA9ICYgdjg1MF9lbGZfc2NvbV9zeW1ib2w7Ci0JfQotICAgICAgYXN5bS0+c2VjdGlvbiA9ICYgdjg1MF9lbGZfc2NvbV9zZWN0aW9uOwotICAgICAgYXN5bS0+dmFsdWUgPSBlbGZzeW0tPmludGVybmFsX2VsZl9zeW0uc3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBTSE5fVjg1MF9UQ09NTU9OOgotICAgICAgaWYgKHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5uYW1lID09IE5VTEwpCi0JewotCSAgLyogSW5pdGlhbGl6ZSB0aGUgdGNvbW1vbiBzZWN0aW9uLiAgKi8KLQkgIHY4NTBfZWxmX3Rjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIudGNvbW1vbiI7Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uZmxhZ3MgICAgICAgICAgPSBTRUNfSVNfQ09NTU9OOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLm91dHB1dF9zZWN0aW9uID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl90Y29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sOwotCSAgdjg1MF9lbGZfdGNvbV9zZWN0aW9uLnN5bWJvbF9wdHJfcHRyID0gJiB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHI7Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbC5uYW1lICAgICAgICAgICAgPSAiLnRjb21tb24iOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wuZmxhZ3MgICAgICAgICAgID0gQlNGX1NFQ1RJT05fU1lNOwotCSAgdjg1MF9lbGZfdGNvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiB2ODUwX2VsZl90Y29tX3NlY3Rpb247Ci0JICB2ODUwX2VsZl90Y29tX3N5bWJvbF9wdHIgICAgICAgICAgICAgPSAmIHY4NTBfZWxmX3Rjb21fc3ltYm9sOwotCX0KLSAgICAgIGFzeW0tPnNlY3Rpb24gPSAmIHY4NTBfZWxmX3Rjb21fc2VjdGlvbjsKLSAgICAgIGFzeW0tPnZhbHVlID0gZWxmc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU0hOX1Y4NTBfWkNPTU1PTjoKLSAgICAgIGlmICh2ODUwX2VsZl96Y29tX3NlY3Rpb24ubmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIEluaXRpYWxpemUgdGhlIHpjb21tb24gc2VjdGlvbi4gICovCi0JICB2ODUwX2VsZl96Y29tX3NlY3Rpb24ubmFtZSAgICAgICAgICAgPSAiLnpjb21tb24iOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLmZsYWdzICAgICAgICAgID0gU0VDX0lTX0NPTU1PTjsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfemNvbV9zZWN0aW9uLnN5bWJvbCAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLQkgIHY4NTBfZWxmX3pjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICYgdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi56Y29tbW9uIjsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLmZsYWdzICAgICAgICAgICA9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHY4NTBfZWxmX3pjb21fc3ltYm9sLnNlY3Rpb24gICAgICAgICA9ICYgdjg1MF9lbGZfemNvbV9zZWN0aW9uOwotCSAgdjg1MF9lbGZfemNvbV9zeW1ib2xfcHRyICAgICAgICAgICAgID0gJiB2ODUwX2VsZl96Y29tX3N5bWJvbDsKLQl9Ci0gICAgICBhc3ltLT5zZWN0aW9uID0gJiB2ODUwX2VsZl96Y29tX3NlY3Rpb247Ci0gICAgICBhc3ltLT52YWx1ZSA9IGVsZnN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBIb29rIGNhbGxlZCBieSB0aGUgbGlua2VyIHJvdXRpbmUgd2hpY2ggYWRkcyBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0gICBmaWxlLiAgV2UgbXVzdCBoYW5kbGUgdGhlIHNwZWNpYWwgdjg1MCBzZWN0aW9uIG51bWJlcnMgaGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2FkZF9zeW1ib2xfaG9vayAoYWJmZCwgaW5mbywgc3ltLCBuYW1lcCwgZmxhZ3NwLCBzZWNwLCB2YWxwKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiAgIGluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKiBzeW07Ci0gICAgIGNvbnN0IGNoYXIgKiogICAgICAgICAgICBuYW1lcDsKLSAgICAgZmxhZ3dvcmQgKiAgICAgICAgICAgICAgIGZsYWdzcDsKLSAgICAgYXNlY3Rpb24gKiogICAgICAgICAgICAgIHNlY3A7Ci0gICAgIGJmZF92bWEgKiAgICAgICAgICAgICAgICB2YWxwOwotewotICBpbnQgaW5kZXggPSBzeW0tPnN0X3NobmR4OwotICAKLSAgLyogSWYgdGhlIHNlY3Rpb24gaW5kZXggaXMgYW4gIm9yZGluYXJ5IiBpbmRleCwgdGhlbiBpdCBtYXkKLSAgICAgcmVmZXIgdG8gYSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gY3JlYXRlZCBieSB0aGUgYXNzZW1ibGVyLgotICAgICBDaGVjayB0aGUgc2VjdGlvbidzIHR5cGUgYW5kIGNoYW5nZSB0aGUgaW5kZXggaXQgbWF0Y2hlcy4KLSAgICAgCi0gICAgIEZJWE1FOiBTaG91bGQgd2UgYWx0ZXIgdGhlIHN0X3NobmR4IGZpZWxkIGFzIHdlbGwgPyAgKi8KLSAgCi0gIGlmIChpbmRleCA8IGVsZl9lbGZoZWFkZXIoYWJmZClbMF0uZV9zaG51bSkKLSAgICBzd2l0Y2ggKGVsZl9lbGZzZWN0aW9ucyhhYmZkKVtpbmRleF0tPnNoX3R5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIFNIVF9WODUwX1NDT01NT046Ci0JaW5kZXggPSBTSE5fVjg1MF9TQ09NTU9OOwotCWJyZWFrOwotCQotICAgICAgY2FzZSBTSFRfVjg1MF9UQ09NTU9OOgotCWluZGV4ID0gU0hOX1Y4NTBfVENPTU1PTjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgU0hUX1Y4NTBfWkNPTU1PTjoKLQlpbmRleCA9IFNITl9WODUwX1pDT01NT047Ci0JYnJlYWs7Ci0JCi0gICAgICBkZWZhdWx0OgotCWJyZWFrOwotICAgICAgfQotICAKLSAgc3dpdGNoIChpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBTSE5fVjg1MF9TQ09NTU9OOgotICAgICAgKnNlY3AgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICIuc2NvbW1vbiIpOwotICAgICAgKCpzZWNwKS0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLSAgICAgICp2YWxwID0gc3ltLT5zdF9zaXplOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNITl9WODUwX1RDT01NT046Ci0gICAgICAqc2VjcCA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgIi50Y29tbW9uIik7Ci0gICAgICAoKnNlY3ApLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgU0hOX1Y4NTBfWkNPTU1PTjoKLSAgICAgICpzZWNwID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChhYmZkLCAiLnpjb21tb24iKTsKLSAgICAgICgqc2VjcCktPmZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0gICAgICAqdmFscCA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLypBUkdTSUdOT1JFRCovCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfbGlua19vdXRwdXRfc3ltYm9sX2hvb2sgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgaW5wdXRfc2VjKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgIGFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICogaW5mbzsKLSAgICAgY29uc3QgY2hhciAqICAgICAgICAgICBuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgIHN5bTsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgICBpbnB1dF9zZWM7Ci17Ci0gIC8qIElmIHdlIHNlZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGltcGxpZXMgYSByZWxvY2F0YWJsZSBsaW5rLCB0aGVuCi0gICAgIGlmIGEgc3ltYm9sIHdhcyBpbiBhIHNwZWNpYWwgY29tbW9uIHNlY3Rpb24gaW4gYW4gaW5wdXQgZmlsZSwgbWFyawotICAgICBpdCBhcyBhIHNwZWNpYWwgY29tbW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIAotICBpZiAoc3ltLT5zdF9zaG5keCA9PSBTSE5fQ09NTU9OKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGlucHV0X3NlYy0+bmFtZSwgIi5zY29tbW9uIikgPT0gMCkKLQlzeW0tPnN0X3NobmR4ID0gU0hOX1Y4NTBfU0NPTU1PTjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoaW5wdXRfc2VjLT5uYW1lLCAiLnRjb21tb24iKSA9PSAwKQotCXN5bS0+c3Rfc2huZHggPSBTSE5fVjg1MF9UQ09NTU9OOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChpbnB1dF9zZWMtPm5hbWUsICIuemNvbW1vbiIpID09IDApCi0Jc3ltLT5zdF9zaG5keCA9IFNITl9WODUwX1pDT01NT047Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkKLSAgICAgYmZkICogICAgICAgICAgICAgICBhYmZkOwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgICAgY2hhciAqICAgICAgICAgICAgICBuYW1lOwotewotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gICovCi0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3dpdGNoIChoZHItPnNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX1Y4NTBfU0NPTU1PTjoKLSAgICBjYXNlIFNIVF9WODUwX1RDT01NT046Ci0gICAgY2FzZSBTSFRfVjg1MF9aQ09NTU9OOgotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBoZHItPmJmZF9zZWN0aW9uLAotCQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsCi0JCQkJCQkJICAgaGRyLT5iZmRfc2VjdGlvbikKLQkJCQkgICAgfCBTRUNfSVNfQ09NTU9OKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBjb3JyZWN0IHR5cGUgZm9yIGEgVjg1MCBFTEYgc2VjdGlvbi4gIFdlIGRvIHRoaXMgYnkgdGhlCi0gICBzZWN0aW9uIG5hbWUsIHdoaWNoIGlzIGEgaGFjaywgYnV0IG91Z2h0IHRvIHdvcmsuICAqLwotc3RhdGljIGJvb2xlYW4KLXY4NTBfZWxmX2Zha2Vfc2VjdGlvbnMgKGFiZmQsIGhkciwgc2VjKQotICAgICBiZmQgKiAgICAgICAgICAgICAgICAgYWJmZDsKLSAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIGhkcjsKLSAgICAgYXNlY3Rpb24gKiAgICAgICAgICAgIHNlYzsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqIG5hbWU7Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuc2NvbW1vbiIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX1Y4NTBfU0NPTU1PTjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi50Y29tbW9uIikgPT0gMCkKLSAgICB7Ci0gICAgICBoZHItPnNoX3R5cGUgPSBTSFRfVjg1MF9UQ09NTU9OOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnpjb21tb24iKSA9PSAwKQotICAgIGhkci0+c2hfdHlwZSA9IFNIVF9WODUwX1pDT01NT047Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQkJYmZkX2VsZjMyX3Y4NTBfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJCSJlbGYzMi12ODUwIgotI2RlZmluZSBFTEZfQVJDSAkJCQliZmRfYXJjaF92ODUwCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUJCQlFTV9DWUdOVVNfVjg1MAotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkJMHgxMDAwCi0JCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvCQkJdjg1MF9lbGZfaW5mb190b19ob3d0b19yZWxhCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAkJCXY4NTBfZWxmX2luZm9fdG9faG93dG9fcmVsCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2hlY2tfcmVsb2NzCQl2ODUwX2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiAgICAJdjg1MF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcAkJCXY4NTBfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcgCXY4NTBfZWxmX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIAl2ODUwX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJCXY4NTBfZWxmX3N5bWJvbF9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vawkJdjg1MF9lbGZfYWRkX3N5bWJvbF9ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2xpbmtfb3V0cHV0X3N5bWJvbF9ob29rIAl2ODUwX2VsZl9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkJdjg1MF9lbGZfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwkJdjg1MF9lbGZfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sgICAgICAgICAgICAgICAgdjg1MF9lbGZfZ2NfbWFya19ob29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sgICAgICAgICAgICAgICB2ODUwX2VsZl9nY19zd2VlcF9ob29rCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zIDEKLQotCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQl2ODUwX2VsZl9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcmVsb2NfdHlwZV9sb29rdXAJCXY4NTBfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgYmZkX2VsZjMyX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIAl2ODUwX2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MJCXY4NTBfZWxmX3NldF9wcml2YXRlX2ZsYWdzCi0jZGVmaW5lIGJmZF9lbGYzMl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQl2ODUwX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgZWxmX3N5bWJvbF9sZWFkaW5nX2NoYXIJCQknXycKLQotI2luY2x1ZGUgImVsZjMyLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjMyLmMgYi9iZmQvZWxmMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyMjk2OS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIEVMRiAzMi1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEFSQ0hfU0laRQkJMzIKLQotCi0jaW5jbHVkZSAiZWxmY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL2VsZjY0LWFscGhhLmMgYi9iZmQvZWxmNjQtYWxwaGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhN2M0MC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NzQgKzAsMCBAQAotLyogQWxwaGEgc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdlIG5lZWQgYSBwdWJsaXNoZWQgQUJJIHNwZWMgZm9yIHRoaXMuICBVbnRpbCBvbmUgY29tZXMgb3V0LCBkb24ndAotICAgYXNzdW1lIHRoaXMnbGwgcmVtYWluIHVuY2hhbmdlZCBmb3JldmVyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2luY2x1ZGUgImVsZi9hbHBoYS5oIgotCi0jZGVmaW5lIEFMUEhBRUNPRkYKLQotI2RlZmluZSBOT19DT0ZGX1JFTE9DUwotI2RlZmluZSBOT19DT0ZGX1NZTUJPTFMKLSNkZWZpbmUgTk9fQ09GRl9MSU5FTk9TCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBOZWVkZWQgZm9yIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gKi8KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9lY29mZi5oIgotI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotI2luY2x1ZGUgImxpYmVjb2ZmLmgiCi0jZGVmaW5lIEVDT0ZGXzY0Ci0jaW5jbHVkZSAiZWNvZmZzd2FwLmgiCi0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICogZWxmNjRfYWxwaGFfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TKChiZmQgKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGVsZjY0X2FscGhhX3JlbG9jX25pbAotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBlbGY2NF9hbHBoYV9yZWxvY19iYWQKLSAgUEFSQU1TKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwCi0gIFBBUkFNUygoYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICosIGJmZF9ieXRlICopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZWxmNjRfYWxwaGFfcmVsb2NfZ3BkaXNwCi0gIFBBUkFNUygoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogZWxmNjRfYWxwaGFfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUygoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfaW5mb190b19ob3d0bwotICBQQVJBTVMoKGJmZCAqLCBhcmVsZW50ICosIEVsZjY0X0ludGVybmFsX1JlbGEgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9vYmplY3RfcAotICBQQVJBTVMoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkcgotICBQQVJBTVMoKGJmZCAqLCBFbGY2NF9JbnRlcm5hbF9TaGRyICosIGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBFbGY2NF9JbnRlcm5hbF9TaGRyICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbwotICBQQVJBTVMoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9pc19sb2NhbF9sYWJlbF9uYW1lCi0gIFBBUkFNUygoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cwotICBQQVJBTVMoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfbWVyZ2VfZ290cwotICBQQVJBTVMoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIHZvaWQgZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0cyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9zaXplX2dvdF9zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWx3YXlzX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzCi0gIFBBUkFNUyAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosIGFzZWN0aW9uICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqc2VjLAotCSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2FkanVzdF9keW5pbmR4Ci0gIFBBUkFNUygoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgRWxmX0ludGVybmFsX1JlbGEgKiwgRWxmX0ludGVybmFsX1N5bSAqLCBhc2VjdGlvbiAqKikpOwotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosCi0JICBFbGZfSW50ZXJuYWxfU3ltICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUygoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGVsZjY0X2FscGhhX2ZpbmFsX2xpbmsKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0MCi1zdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIEV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVYVFIgZXN5bTsKLQotICAvKiBDdW11bGF0aXZlIGZsYWdzIGZvciBhbGwgdGhlIC5nb3QgZW50cmllcy4gICovCi0gIGludCBmbGFnczsKLQotICAvKiBDb250ZXh0cyAoTElUVVNFKSBpbiB3aGljaCBhIGxpdGVyYWwgd2FzIHJlZmVyZW5jZWQuICAqLwotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0FERFIgMHgwMQotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX01FTSAgMHgwMgotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0JZVEUgMHgwNAotI2RlZmluZSBBTFBIQV9FTEZfTElOS19IQVNIX0xVX0ZVTkMgMHgwOAotCi0gIC8qIFVzZWQgdG8gaW1wbGVtZW50IG11bHRpcGxlIC5nb3Qgc3Vic2VjdGlvbnMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeQotICB7Ci0gICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKm5leHQ7Ci0KLSAgICAvKiB3aGljaCAuZ290IHN1YnNlY3Rpb24/ICAqLwotICAgIGJmZCAqZ290b2JqOwotCi0gICAgLyogdGhlIGFkZGVuZCBpbiBlZmZlY3QgZm9yIHRoaXMgZW50cnkuICAqLwotICAgIGJmZF92bWEgYWRkZW5kOwotCi0gICAgLyogdGhlIC5nb3Qgb2Zmc2V0IGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICBpbnQgZ290X29mZnNldDsKLQotICAgIGludCBmbGFnczsKLQotICAgIC8qIEFuIGFkZGl0aW9uYWwgZmxhZy4gICovCi0jZGVmaW5lIEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkUgMHgxMAotCi0gICAgaW50IHVzZV9jb3VudDsKLSAgfSAqZ290X2VudHJpZXM7Ci0KLSAgLyogdXNlZCB0byBjb3VudCBub24tZ290LCBub24tcGx0IHJlbG9jYXRpb25zIGZvciBkZWxheWVkIHNpemluZwotICAgICBvZiByZWxvY2F0aW9uIHNlY3Rpb25zLiAgKi8KLSAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeQotICB7Ci0gICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqbmV4dDsKLQotICAgIC8qIHdoaWNoIC5yZWxvYyBzZWN0aW9uPyAqLwotICAgIGFzZWN0aW9uICpzcmVsOwotCi0gICAgLyogd2hhdCBraW5kIG9mIHJlbG9jYXRpb24/ICovCi0gICAgdW5zaWduZWQgbG9uZyBydHlwZTsKLQotICAgIC8qIGhvdyBtYW55IGRpZCB3ZSBmaW5kPyAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGNvdW50OwotICB9ICpyZWxvY19lbnRyaWVzOwotfTsKLQotLyogQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgaGVhZCBvZiBhIGxpc3Qgb2YgLmdvdCBzdWJzZWN0aW9ucyBsaW5rZWQgdGhyb3VnaAotICAgICBhbHBoYV9lbGZfdGRhdGEoYWJmZCktPmdvdF9saW5rX25leHQuICAqLwotICBiZmQgKmdvdF9saXN0OwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgYWxwaGFfZWxmX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCVwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgZWxmX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGVsZl9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgQWxwaGEgRUxGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEdldCB0aGUgb2JqZWN0J3Mgc3ltYm9scyBhcyBvdXIgb3duIGVudHJ5IHR5cGUuICAqLwotCi0jZGVmaW5lIGFscGhhX2VsZl9zeW1faGFzaGVzKGFiZmQpIFwKLSAgKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKillbGZfc3ltX2hhc2hlcyhhYmZkKSkKLQotLyogU2hvdWxkIHdlIGRvIGR5bmFtaWMgdGhpbmdzIHRvIHRoaXMgc3ltYm9sPyAgKi8KLQotI2RlZmluZSBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcChoLCBpbmZvKSAJCQkJXAotICAoKCgoaW5mbyktPnNoYXJlZCAmJiAhKGluZm8pLT5zeW1ib2xpYykJCQkJXAotICAgIHx8ICgoKGgpLT5lbGZfbGlua19oYXNoX2ZsYWdzCQkJCQlcCi0JICYgKEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkJXAotICAgICAgICA9PSAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQyB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKQlcCi0gICAgfHwgKGgpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsJCQlcCi0gICAgfHwgKGgpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQkJCQlcCi0gICAmJiAoaCktPmR5bmluZHggIT0gLTEpCi0KLS8qIENyZWF0ZSBhbiBlbnRyeSBpbiBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopCi0JIF9iZmRfZWxmX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgIHRhYmxlLCBzdHJpbmcpKTsKLSAgaWYgKHJldCAhPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIG1lbXNldCAoJnJldC0+ZXN5bSwgMCwgc2l6ZW9mIChFWFRSKSk7Ci0gICAgICAvKiBXZSB1c2UgLTIgYXMgYSBtYXJrZXIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5mb3JtYXRpb24gaGFzCi0JIG5vdCBiZWVuIHNldC4gIC0xIG1lYW5zIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgaWZkLiAgKi8KLSAgICAgIHJldC0+ZXN5bS5pZmQgPSAtMjsKLSAgICAgIHJldC0+ZmxhZ3MgPSAwOwotICAgICAgcmV0LT5nb3RfZW50cmllcyA9IE5VTEw7Ci0gICAgICByZXQtPnJlbG9jX2VudHJpZXMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIENyZWF0ZSBhIEFscGhhIEVMRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1lbGY2NF9hbHBoYV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoISBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICAgICAgZWxmNjRfYWxwaGFfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAmcmV0LT5yb290LnJvb3Q7Ci19Ci0MCi0vKiBXZSBoYXZlIHNvbWUgcHJpdmF0ZSBmaWVsZHMgaGFuZ2luZyBvZmYgb2YgdGhlIGVsZl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YQotewotICBzdHJ1Y3QgZWxmX29ial90ZGF0YSByb290OwotCi0gIC8qIEZvciBldmVyeSBpbnB1dCBmaWxlLCB0aGVzZSBhcmUgdGhlIGdvdCBlbnRyaWVzIGZvciB0aGF0IG9iamVjdCdzCi0gICAgIGxvY2FsIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKiBsb2NhbF9nb3RfZW50cmllczsKLQotICAvKiBGb3IgZXZlcnkgaW5wdXQgZmlsZSwgdGhpcyBpcyB0aGUgb2JqZWN0IHRoYXQgb3ducyB0aGUgZ290IHRoYXQKLSAgICAgdGhpcyBpbnB1dCBmaWxlIHVzZXMuICAqLwotICBiZmQgKmdvdG9iajsKLQotICAvKiBGb3IgZXZlcnkgZ290LCB0aGlzIGlzIGEgbGlua2VkIGxpc3QgdGhyb3VnaCB0aGUgb2JqZWN0cyB1c2luZyB0aGlzIGdvdCAqLwotICBiZmQgKmluX2dvdF9saW5rX25leHQ7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyBhIGxpbmsgdG8gdGhlIG5leHQgZ290IHN1YnNlZ21lbnQuICAqLwotICBiZmQgKmdvdF9saW5rX25leHQ7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyB0aGUgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpnb3Q7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyBpdCdzIHRvdGFsIG51bWJlciBvZiAqZW50cmllcyouICAqLwotICBpbnQgdG90YWxfZ290X2VudHJpZXM7Ci0KLSAgLyogRm9yIGV2ZXJ5IGdvdCwgdGhpcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXIgb2YgKmVudHJpZXMqIHJlcXVpcmVkCi0gICAgIHRvIGhvbGQgYWxsIG9mIHRoZSBtZW1iZXIgb2JqZWN0J3MgbG9jYWwgZ290LiAgKi8KLSAgaW50IG5fbG9jYWxfZ290X2VudHJpZXM7Ci19OwotCi0jZGVmaW5lIGFscGhhX2VsZl90ZGF0YShhYmZkKSBcCi0gICgoc3RydWN0IGFscGhhX2VsZl9vYmpfdGRhdGEgKikgKGFiZmQpLT50ZGF0YS5hbnkpCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5hbnkgPSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChhYmZkLT50ZGF0YS5hbnkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQWxsb2NhdGUgb3VyIHNwZWNpYWwgdGFyZ2V0IGRhdGEuICAqLwotICBzdHJ1Y3QgYWxwaGFfZWxmX29ial90ZGF0YSAqbmV3X3RkYXRhOwotICBuZXdfdGRhdGEgPSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld190ZGF0YS0+cm9vdCA9ICphYmZkLT50ZGF0YS5lbGZfb2JqX2RhdGE7Ci0gIGFiZmQtPnRkYXRhLmFueSA9IG5ld190ZGF0YTsKLQotICAvKiBTZXQgdGhlIHJpZ2h0IG1hY2hpbmUgbnVtYmVyIGZvciBhbiBBbHBoYSBFTEYgZmlsZS4gICovCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9hbHBoYSwgMCk7Ci19Ci0MCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmNjRfYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChSX0FMUEhBX05PTkUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19uaWwsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1JFRkxPTkcsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGUVVBRCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDMyIGJpdCBHUCByZWxhdGl2ZSBvZmZzZXQuICBUaGlzIGlzIGp1c3QgbGlrZSBSRUZMT05HIGV4Y2VwdAotICAgICB0aGF0IHdoZW4gdGhlIHZhbHVlIGlzIHVzZWQgdGhlIHZhbHVlIG9mIHRoZSBncCByZWdpc3RlciB3aWxsIGJlCi0gICAgIGFkZGVkIGluLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFJFTDMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVXNlZCBmb3IgYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWZlcnMgdG8gbWVtb3J5IG9mZiB0aGUgR1AgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9MSVRFUkFMLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJFTEZfTElURVJBTCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGlzIHJlbG9jIG9ubHkgYXBwZWFycyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gRUxGX0xJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBUaGUgc3ltYm9sIGluZGV4IGlzIHNwZWNpYWw6Ci0gICAgIDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZSByZWdpc3RlciBvZiBhIG1lbW9yeQotICAgICBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZQotICAgICBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbiBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUKLSAgICAgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uCi0gICAgIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgZG8gYW55IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9BTFBIQV9MSVRVU0UsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfbmlsLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJMSVRVU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvYWQgdGhlIGdwIHJlZ2lzdGVyLiAgVGhpcyBpcyBhbHdheXMgdXNlZCBmb3IgYSBsZGFoIGluc3RydWN0aW9uCi0gICAgIHdoaWNoIGxvYWRzIHRoZSB1cHBlciAxNiBiaXRzIG9mIHRoZSBncCByZWdpc3Rlci4gIFRoZSBzeW1ib2wKLSAgICAgaW5kZXggb2YgdGhlIEdQRElTUCBpbnN0cnVjdGlvbiBpcyBhbiBvZmZzZXQgaW4gYnl0ZXMgdG8gdGhlIGxkYQotICAgICBpbnN0cnVjdGlvbiB0aGF0IGxvYWRzIHRoZSBsb3dlciAxNiBiaXRzLiAgVGhlIHZhbHVlIHRvIHVzZSBmb3IKLSAgICAgdGhlIHJlbG9jYXRpb24gaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgR1AgdmFsdWUgYW5kIHRoZQotICAgICBjdXJyZW50IGxvY2F0aW9uOyB0aGUgbG9hZCB3aWxsIGFsd2F5cyBiZSBkb25lIGFnYWluc3QgYSByZWdpc3RlcgotICAgICBob2xkaW5nIHRoZSBjdXJyZW50IGFkZHJlc3MuCi0KLSAgICAgTk9URTogVW5saWtlIEVDT0ZGLCBwYXJ0aWFsIGluLXBsYWNlIHJlbG9jYXRpb24gaXMgbm90IGRvbmUuICBJZgotICAgICBhbnkgb2Zmc2V0IGlzIHByZXNlbnQgaW4gdGhlIGluc3RydWN0aW9ucywgaXQgaXMgYW4gb2Zmc2V0IGZyb20KLSAgICAgdGhlIHJlZ2lzdGVyIHRvIHRoZSBsZGFoIGluc3RydWN0aW9uLiAgVGhpcyBsZXRzIHVzIGF2b2lkIGFueQotICAgICBzdHVwaWQgaGFja2VyeSBsaWtlIGludmVudGluZyBhIGdwIHZhbHVlIHRvIGRvIHBhcnRpYWwgcmVsb2NhdGlvbgotICAgICBhZ2FpbnN0LiAgQWxzbyB1bmxpa2UgRUNPRkYsIHdlIGRvIHRoZSB3aG9sZSByZWxvY2F0aW9uIG9mZiBvZgotICAgICB0aGUgR1BESVNQIHJhdGhlciB0aGFuIGEgR1BESVNQX0hJMTYvR1BESVNQX0xPMTYgcGFpci4gIEFuIG9kZCwKLSAgICAgc3BhY2UgY29uc3VtaW5nIGJpdCwgdGhhdCwgc2luY2UgYWxsIHRoZSBpbmZvcm1hdGlvbiB3YXMgcHJlc2VudAotICAgICBpbiB0aGUgR1BESVNQX0hJMTYgcmVsb2MuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HUERJU1AsCS8qIHR5cGUgKi8KLQkgMTYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2dwZGlzcCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BESVNQIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMjEgYml0IGJyYW5jaC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJCUkFERFIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSElOVCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwxNiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlNSRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMNjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BVU0gsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1NUT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX09QX1BTVUIsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIC8qIE5vdCBpbXBsZW1lbnRlZCAtLSBpdCdzIGR1bWIuICAqLwotICBIT1dUTyAoUl9BTFBIQV9PUF9QUlNISUZULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIEdQIHVzZWQgYnkgK3JfYWRkZW5kIHVudGlsIHRoZSBuZXh0IEdQVkFMVUUgb3IgdGhlCi0gICAgIGVuZCBvZiB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgLyogTm90IGltcGxlbWVudGVkIC0tIGl0J3MgZHVtYi4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQVkFMVUUsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJHUFZBTFVFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgaGlnaCAxNiBiaXRzIG9mIHRoZSBkaXNwbGFjZW1lbnQgZnJvbSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfR1BSRUxISUdILAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGVsZjY0X2FscGhhX3JlbG9jX2JhZCwgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BSRUxISUdIIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBsb3cgMTYgYml0cyBvZiB0aGUgZGlzcGxhY2VtZW50IGZyb20gR1AgdG8gdGhlIHRhcmdldC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0dQUkVMTE9XLAotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMTE9XIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMTYtYml0IGRpc3BsYWNlbWVudCBmcm9tIHRoZSBHUCB0byB0aGUgdGFyZ2V0LiAgKi8KLSAgLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICBIT1dUTyAoUl9BTFBIQV9JTU1FRF9HUF8xNiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0dQXzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIGJpdHMgb2YgYSAzMi1iaXQgZGlzcGxhY2VtZW50IGZyb20gdGhlIEdQIHRvIHRoZSB0YXJnZXQ7IHRoZQotICAgICBsb3cgYml0cyBhcmUgc3VwcGxpZWQgaW4gdGhlIHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfR1BfSEkzMiwKLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBlbGY2NF9hbHBoYV9yZWxvY19iYWQsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIklNTUVEX0dQX0hJMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoZSBoaWdoIGJpdHMgb2YgYSAzMi1iaXQgZGlzcGxhY2VtZW50IHRvIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZQotICAgICBjdXJyZW50IHNlY3Rpb24gKHRoZSByZWxvY2F0aW9uIHRhcmdldCBpcyBpZ25vcmVkKTsgdGhlIGxvdyBiaXRzIGFyZSAKLSAgICAgc3VwcGxpZWQgaW4gdGhlIHN1YnNlcXVlbnQgUl9BTFBIQV9JTU1FRF9MTzMyIHJlbG9jcy4gICovCi0gIC8qIFhYWDogTm90IGltcGxlbWVudGVkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfSU1NRURfU0NOX0hJMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9TQ05fSEkzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlIGhpZ2ggYml0cyBvZiBhIDMyLWJpdCBkaXNwbGFjZW1lbnQgZnJvbSB0aGUgcHJldmlvdXMgYnIsIGJzciwganNyCi0gICAgIG9yIGptcCBpbnNuIChhcyB0YWdnZWQgYnkgYSBCUkFERFIgb3IgSElOVCByZWxvYykgdG8gdGhlIHRhcmdldDsgdGhlCi0gICAgIGxvdyBiaXRzIGFyZSBzdXBwbGllZCBieSBzdWJzZXF1ZW50IFJfQUxQSEFfSU1NRURfTE8zMiByZWxvY3MuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0JSX0hJMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9CUl9ISTMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBUaGUgbG93IDE2IGJpdHMgb2YgYSBkaXNwbGFjZW1lbnQgY2FsY3VsYXRlZCBpbiBhIHByZXZpb3VzIEhJMzIgcmVsb2MuICAqLwotICAvKiBYWFg6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gIEhPV1RPIChSX0FMUEhBX0lNTUVEX0xPMzIsCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgZWxmNjRfYWxwaGFfcmVsb2NfYmFkLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJTU1FRF9MTzMyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBNaXNjIEVMRiByZWxvY2F0aW9ucy4gKi8KLQotICAvKiBBIGR5bmFtaWMgcmVsb2NhdGlvbiB0byBjb3B5IHRoZSB0YXJnZXQgaW50byBvdXIgLmR5bmJzcyBzZWN0aW9uLiAgKi8KLSAgLyogTm90IGdlbmVyYXRlZCwgYXMgYWxsIEFscGhhIG9iamVjdHMgdXNlIFBJQywgc28gaXQgaXMgbm90IG5lZWRlZC4gIEl0Ci0gICAgIGlzIHByZXNlbnQgYmVjYXVzZSBldmVyeSBvdGhlciBFTEYgaGFzIG9uZSwgYnV0IHNob3VsZCBub3QgYmUgdXNlZAotICAgICBiZWNhdXNlIC5keW5ic3MgaXMgYW4gdWdseSB0aGluZy4gICovCi0gIEhPV1RPIChSX0FMUEhBX0NPUFksCi0JIDAsCi0JIDAsCi0JIDAsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJDT1BZIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIGZvciBhIC5nb3QgZW50cnkuICAqLwotICBIT1dUTyAoUl9BTFBIQV9HTE9CX0RBVCwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkdMT0JfREFUIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIGZvciBhIC5wbHQgZW50cnkuICAqLwotICBIT1dUTyAoUl9BTFBIQV9KTVBfU0xPVCwKLQkgMCwKLQkgMCwKLQkgMCwKLQkgZmFsc2UsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywKLQkgIkpNUF9TTE9UIiwKLQkgZmFsc2UsCi0JIDAsCi0JIDAsCi0JIHRydWUpLAotCi0gIC8qIEEgZHluYW1pYyByZWxvY2F0aW9uIHRvIGFkZCB0aGUgYmFzZSBvZiB0aGUgRFNPIHRvIGEgNjQtYml0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfQUxQSEFfUkVMQVRJVkUsCi0JIDAsCi0JIDAsCi0JIDAsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCi0JICJSRUxBVElWRSIsCi0JIGZhbHNlLAotCSAwLAotCSAwLAotCSB0cnVlKQotfTsKLQotLyogQSByZWxvY2F0aW9uIGZ1bmN0aW9uIHdoaWNoIGRvZXNuJ3QgZG8gYW55dGhpbmcuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgcmVsb2MtPmFkZHJlc3MgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBBIHJlbG9jYXRpb24gZnVuY3Rpb24gdXNlZCBmb3IgYW4gdW5zdXBwb3J0ZWQgcmVsb2MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1lbGY2NF9hbHBoYV9yZWxvY19iYWQgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgcmVsb2MtPmFkZHJlc3MgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0OwotICByZXR1cm4gYmZkX3JlbG9jX25vdHN1cHBvcnRlZDsKLX0KLQotLyogRG8gdGhlIHdvcmsgb2YgdGhlIEdQRElTUCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwIChhYmZkLCBncGRpc3AsIHBfbGRhaCwgcF9sZGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3ZtYSBncGRpc3A7Ci0gICAgIGJmZF9ieXRlICpwX2xkYWg7Ci0gICAgIGJmZF9ieXRlICpwX2xkYTsKLXsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJldCA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3ZtYSBhZGRlbmQ7Ci0gIHVuc2lnbmVkIGxvbmcgaV9sZGFoLCBpX2xkYTsKLQotICBpX2xkYWggPSBiZmRfZ2V0XzMyIChhYmZkLCBwX2xkYWgpOwotICBpX2xkYSA9IGJmZF9nZXRfMzIgKGFiZmQsIHBfbGRhKTsKLQotICAvKiBDb21wbGFpbiBpZiB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBub3QgY29ycmVjdC4gICovCi0gIGlmICgoKGlfbGRhaCA+PiAyNikgJiAweDNmKSAhPSAweDA5Ci0gICAgICB8fCAoKGlfbGRhID4+IDI2KSAmIDB4M2YpICE9IDB4MDgpCi0gICAgcmV0ID0gYmZkX3JlbG9jX2Rhbmdlcm91czsKLQotICAvKiBFeHRyYWN0IHRoZSB1c2VyLXN1cHBsaWVkIG9mZnNldCwgbWlycm9yaW5nIHRoZSBzaWduIGV4dGVuc2lvbnMKLSAgICAgdGhhdCB0aGUgaW5zdHJ1Y3Rpb25zIHBlcmZvcm0uICAqLwotICBhZGRlbmQgPSAoKGlfbGRhaCAmIDB4ZmZmZikgPDwgMTYpIHwgKGlfbGRhICYgMHhmZmZmKTsKLSAgYWRkZW5kID0gKGFkZGVuZCBeIDB4ODAwMDgwMDApIC0gMHg4MDAwODAwMDsKLQotICBncGRpc3AgKz0gYWRkZW5kOwotCi0gIGlmICgoYmZkX3NpZ25lZF92bWEpIGdwZGlzcCA8IC0oYmZkX3NpZ25lZF92bWEpIDB4ODAwMDAwMDAKLSAgICAgIHx8IChiZmRfc2lnbmVkX3ZtYSkgZ3BkaXNwID49IChiZmRfc2lnbmVkX3ZtYSkgMHg3ZmZmODAwMCkKLSAgICByZXQgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0KLSAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uIGFnYWluLiAgKi8KLSAgaV9sZGFoID0gKChpX2xkYWggJiAweGZmZmYwMDAwKQotCSAgICB8ICgoKGdwZGlzcCA+PiAxNikgKyAoKGdwZGlzcCA+PiAxNSkgJiAxKSkgJiAweGZmZmYpKTsKLSAgaV9sZGEgPSAoaV9sZGEgJiAweGZmZmYwMDAwKSB8IChncGRpc3AgJiAweGZmZmYpOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGlfbGRhaCwgcF9sZGFoKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaV9sZGEsIHBfbGRhKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgc3BlY2lhbCBmdW5jdGlvbiBmb3IgdGhlIEdQRElTUCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWVsZjY0X2FscGhhX3JlbG9jX2dwZGlzcCAoYWJmZCwgcmVsb2NfZW50cnksIHN5bSwgZGF0YSwgaW5wdXRfc2VjdGlvbiwKLQkJCSAgb3V0cHV0X2JmZCwgZXJyX21zZykKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycl9tc2c7Ci17Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZXQ7Ci0gIGJmZF92bWEgZ3AsIHJlbG9jYXRpb247Ci0gIGJmZF9ieXRlICpwX2xkYWgsICpwX2xkYTsKLQotICAvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSBub3QgZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSB8fAotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKyByZWxvY19lbnRyeS0+YWRkZW5kID4gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKQotICAgIHJldHVybiBiZmRfcmVsb2Nfb3V0b2ZyYW5nZTsKLQotICAvKiBUaGUgZ3AgdXNlZCBpbiB0aGUgcG9ydGlvbiBvZiB0aGUgb3V0cHV0IG9iamVjdCB0byB3aGljaCB0aGlzCi0gICAgIGlucHV0IG9iamVjdCBiZWxvbmdzIGlzIGNhY2hlZCBvbiB0aGUgaW5wdXQgYmZkLiAgKi8KLSAgZ3AgPSBfYmZkX2dldF9ncF92YWx1ZSAoYWJmZCk7Ci0KLSAgcmVsb2NhdGlvbiA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkrIHJlbG9jX2VudHJ5LT5hZGRyZXNzKTsKLQotICBwX2xkYWggPSAoYmZkX2J5dGUgKikgZGF0YSArIHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBwX2xkYSA9IHBfbGRhaCArIHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgcmV0ID0gZWxmNjRfYWxwaGFfZG9fcmVsb2NfZ3BkaXNwIChhYmZkLCBncCAtIHJlbG9jYXRpb24sIHBfbGRhaCwgcF9sZGEpOwotCi0gIC8qIENvbXBsYWluIGlmIHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBjb3JyZWN0LiAgKi8KLSAgaWYgKHJldCA9PSBiZmRfcmVsb2NfZGFuZ2Vyb3VzKQotICAgICplcnJfbXNnID0gXygiR1BESVNQIHJlbG9jYXRpb24gZGlkIG5vdCBmaW5kIGxkYWggYW5kIGxkYSBpbnN0cnVjdGlvbnMiKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gQWxwaGEgRUxGIHJlbG9jIHR5cGVzLiAgKi8KLQotc3RydWN0IGVsZl9yZWxvY19tYXAKLXsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIGludCBlbGZfcmVsb2NfdmFsOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlbGZfcmVsb2NfbWFwIGVsZjY0X2FscGhhX3JlbG9jX21hcFtdID0KLXsKLSAge0JGRF9SRUxPQ19OT05FLAkJUl9BTFBIQV9OT05FfSwKLSAge0JGRF9SRUxPQ18zMiwJCVJfQUxQSEFfUkVGTE9OR30sCi0gIHtCRkRfUkVMT0NfNjQsCQlSX0FMUEhBX1JFRlFVQUR9LAotICB7QkZEX1JFTE9DX0NUT1IsCQlSX0FMUEhBX1JFRlFVQUR9LAotICB7QkZEX1JFTE9DX0dQUkVMMzIsCQlSX0FMUEhBX0dQUkVMMzJ9LAotICB7QkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMLAlSX0FMUEhBX0xJVEVSQUx9LAotICB7QkZEX1JFTE9DX0FMUEhBX0xJVFVTRSwJUl9BTFBIQV9MSVRVU0V9LAotICB7QkZEX1JFTE9DX0FMUEhBX0dQRElTUCwJUl9BTFBIQV9HUERJU1B9LAotICB7QkZEX1JFTE9DXzIzX1BDUkVMX1MyLAlSX0FMUEhBX0JSQUREUn0sCi0gIHtCRkRfUkVMT0NfQUxQSEFfSElOVCwJUl9BTFBIQV9ISU5UfSwKLSAge0JGRF9SRUxPQ18xNl9QQ1JFTCwJCVJfQUxQSEFfU1JFTDE2fSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwJCVJfQUxQSEFfU1JFTDMyfSwKLSAge0JGRF9SRUxPQ182NF9QQ1JFTCwJCVJfQUxQSEFfU1JFTDY0fSwKLX07Ci0KLS8qIEdpdmVuIGEgQkZEIHJlbG9jIHR5cGUsIHJldHVybiBhIEhPV1RPIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgY29uc3Qgc3RydWN0IGVsZl9yZWxvY19tYXAgKmksICplOwotICBpID0gZSA9IGVsZjY0X2FscGhhX3JlbG9jX21hcDsKLSAgZSArPSBzaXplb2YgKGVsZjY0X2FscGhhX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsKLSAgZm9yICg7IGkgIT0gZTsgKytpKQotICAgIHsKLSAgICAgIGlmIChpLT5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JcmV0dXJuICZlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtpLT5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBHaXZlbiBhbiBBbHBoYSBFTEYgcmVsb2MgdHlwZSwgZmlsbCBpbiBhbiBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGY2NF9hbHBoYV9pbmZvX3RvX2hvd3RvIChhYmZkLCBjYWNoZV9wdHIsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIEVsZjY0X0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgdW5zaWduZWQgcl90eXBlOwotCi0gIHJfdHlwZSA9IEVMRjY0X1JfVFlQRShkc3QtPnJfaW5mbyk7Ci0gIEJGRF9BU1NFUlQgKHJfdHlwZSA8ICh1bnNpZ25lZCBpbnQpIFJfQUxQSEFfbWF4KTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZlbGY2NF9hbHBoYV9ob3d0b190YWJsZVtyX3R5cGVdOwotfQotDAotLyogVGhlc2UgZnVuY3Rpb25zIGRvIHJlbGF4YXRpb24gZm9yIEFscGhhIEVMRi4gCi0KLSAgIEN1cnJlbnRseSBJJ20gb25seSBoYW5kbGluZyB3aGF0IEkgY2FuIGRvIHdpdGggZXhpc3RpbmcgY29tcGlsZXIKLSAgIGFuZCBhc3NlbWJsZXIgc3VwcG9ydCwgd2hpY2ggbWVhbnMgbm8gaW5zdHJ1Y3Rpb25zIGFyZSByZW1vdmVkLAotICAgdGhvdWdoIHNvbWUgbWF5IGJlIG5vcHBlZC4gIEF0IHRoaXMgdGltZSBHQ0MgZG9lcyBub3QgZW1pdCBlbm91Z2gKLSAgIGluZm9ybWF0aW9uIHRvIGRvIGFsbCBvZiB0aGUgcmVsYXhpbmcgdGhhdCBpcyBwb3NzaWJsZS4gIEl0IHdpbGwKLSAgIHRha2Ugc29tZSBub3Qgc21hbGwgYW1vdW50IG9mIHdvcmsgZm9yIHRoYXQgdG8gaGFwcGVuLgotCi0gICBUaGVyZSBhcmUgYSBjb3VwbGUgb2YgaW50ZXJlc3RpbmcgcGFwZXJzIHRoYXQgSSBvbmNlIHJlYWQgb24gdGhpcwotICAgc3ViamVjdCwgdGhhdCBJIGNhbm5vdCBmaW5kIHJlZmVyZW5jZXMgdG8gYXQgdGhlIG1vbWVudCwgdGhhdAotICAgcmVsYXRlZCB0byBBbHBoYSBpbiBwYXJ0aWN1bGFyLiAgVGhleSBhcmUgYnkgRGF2aWQgV2FsbCwgdGhlbiBvZgotICAgREVDIFdSTC4gICovCi0KLSNkZWZpbmUgT1BfTERBCQkweDA4Ci0jZGVmaW5lIE9QX0xEQUgJCTB4MDkKLSNkZWZpbmUgSU5TTl9KU1IJMHg2ODAwNDAwMAotI2RlZmluZSBJTlNOX0pTUl9NQVNLCTB4ZmMwMGMwMDAKLSNkZWZpbmUgT1BfTERRCQkweDI5Ci0jZGVmaW5lIE9QX0JSCQkweDMwCi0jZGVmaW5lIE9QX0JTUgkJMHgzNAotI2RlZmluZSBJTlNOX1VOT1AJMHgyZmUwMDAwMAotCi1zdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcywgKnJlbGVuZDsKLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgYm9vbGVhbiBjaGFuZ2VkX2NvbnRlbnRzOwotICBib29sZWFuIGNoYW5nZWRfcmVsb2NzOwotICBiZmRfdm1hIGdwOwotICBiZmQgKmdvdG9iajsKLSAgYXNlY3Rpb24gKnRzZWM7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotICB1bnNpZ25lZCBjaGFyIG90aGVyOwotfTsKLQotc3RhdGljIEVsZl9JbnRlcm5hbF9SZWxhICogZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UKLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbywgYmZkX3ZtYSBzeW12YWwsIAotICAgICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsLCBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGVuZCkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGY2NF9hbHBoYV9yZWxheF93aXRob3V0X2xpdHVzZQotICBQQVJBTVMoKHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvLCBiZmRfdm1hIHN5bXZhbCwgCi0gICAgICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwpKTsKLQotc3RhdGljIGJmZF92bWEgZWxmNjRfYWxwaGFfcmVsYXhfb3B0X2NhbGwKLSAgUEFSQU1TKChzdHJ1Y3QgYWxwaGFfcmVsYXhfaW5mbyAqaW5mbywgYmZkX3ZtYSBzeW12YWwpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgIGJvb2xlYW4gKmFnYWluKSk7Ci0KLXN0YXRpYyBFbGZfSW50ZXJuYWxfUmVsYSAqCi1lbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcyAocmVsLCByZWxlbmQsIG9mZnNldCwgdHlwZSkKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbCwgKnJlbGVuZDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGludCB0eXBlOwotewotICB3aGlsZSAocmVsIDwgcmVsZW5kKQotICAgIHsKLSAgICAgIGlmIChyZWwtPnJfb2Zmc2V0ID09IG9mZnNldCAmJiBFTEY2NF9SX1RZUEUgKHJlbC0+cl9pbmZvKSA9PSB0eXBlKQotCXJldHVybiByZWw7Ci0gICAgICArK3JlbDsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgRWxmX0ludGVybmFsX1JlbGEgKgotZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UgKGluZm8sIHN5bXZhbCwgaXJlbCwgaXJlbGVuZCkKLSAgICAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgc3ltdmFsOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbCwgKmlyZWxlbmQ7Ci17Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICp1cmVsOwotICBpbnQgZmxhZ3MsIGNvdW50LCBpOwotICBiZmRfc2lnbmVkX3ZtYSBkaXNwOwotICBib29sZWFuIGZpdHMxNjsKLSAgYm9vbGVhbiBmaXRzMzI7Ci0gIGJvb2xlYW4gbGl0X3JldXNlZCA9IGZhbHNlOwotICBib29sZWFuIGFsbF9vcHRpbWl6ZWQgPSB0cnVlOwotICB1bnNpZ25lZCBpbnQgbGl0X2luc247Ci0KLSAgbGl0X2luc24gPSBiZmRfZ2V0XzMyIChpbmZvLT5hYmZkLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLSAgaWYgKGxpdF9pbnNuID4+IDI2ICE9IE9QX0xEUSkKLSAgICB7Ci0gICAgICAoKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0gICAgICAgKCIlczogJXMrMHglbHg6IHdhcm5pbmc6IExJVEVSQUwgcmVsb2NhdGlvbiBhZ2FpbnN0IHVuZXhwZWN0ZWQgaW5zbiIsCi0JYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIGluZm8tPnNlYy0+bmFtZSwKLQkodW5zaWduZWQgbG9uZylpcmVsLT5yX29mZnNldCkpOwotICAgICAgcmV0dXJuIGlyZWw7Ci0gICAgfQotCi0gIC8qIFN1bW1hcml6ZSBob3cgdGhpcyBwYXJ0aWN1bGFyIExJVEVSQUwgaXMgdXNlZC4gICovCi0gIGZvciAodXJlbCA9IGlyZWwrMSwgZmxhZ3MgPSBjb3VudCA9IDA7IHVyZWwgPCBpcmVsZW5kOyArK3VyZWwsICsrY291bnQpCi0gICAgewotICAgICAgaWYgKEVMRjY0X1JfVFlQRSAodXJlbC0+cl9pbmZvKSAhPSBSX0FMUEhBX0xJVFVTRSkKLQlicmVhazsKLSAgICAgIGlmICh1cmVsLT5yX2FkZGVuZCA+PSAwICYmIHVyZWwtPnJfYWRkZW5kIDw9IDMpCi0JZmxhZ3MgfD0gMSA8PCB1cmVsLT5yX2FkZGVuZDsKLSAgICB9Ci0KLSAgLyogQSBsaXR0bGUgcHJlcGFyYXRpb24gZm9yIHRoZSBsb29wLi4uICovCi0gIGRpc3AgPSBzeW12YWwgLSBpbmZvLT5ncDsKLSAgZml0czE2ID0gKGRpc3AgPj0gLShiZmRfc2lnbmVkX3ZtYSkweDgwMDAgJiYgZGlzcCA8IDB4ODAwMCk7Ci0gIGZpdHMzMiA9IChkaXNwID49IC0oYmZkX3NpZ25lZF92bWEpMHg4MDAwMDAwMCAmJiBkaXNwIDwgMHg3ZmZmODAwMCk7Ci0KLSAgZm9yICh1cmVsID0gaXJlbCsxLCBpID0gMDsgaSA8IGNvdW50OyArK2ksICsrdXJlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLSAgICAgIGluc24gPSBiZmRfZ2V0XzMyIChpbmZvLT5hYmZkLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQotICAgICAgc3dpdGNoICh1cmVsLT5yX2FkZGVuZCkKLQl7Ci0JZGVmYXVsdDogLyogMCA9IEFERFJFU1MgRk9STUFUICovCi0JICAvKiBUaGlzIHR5cGUgaXMgcmVhbGx5IGp1c3QgYSBwbGFjZWhvbGRlciB0byBub3RlIHRoYXQgYWxsCi0JICAgICB1c2VzIGNhbm5vdCBiZSBvcHRpbWl6ZWQsIGJ1dCB0byBzdGlsbCBhbGxvdyBzb21lLiAgKi8KLQkgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAxOiAvKiBNRU0gRk9STUFUICovCi0JICAvKiBXZSBjYW4gYWx3YXlzIG9wdGltaXplIDE2LWJpdCBkaXNwbGFjZW1lbnRzLiAgKi8KLQkgIGlmIChmaXRzMTYpCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogc2FuaXR5IGNoZWNrIHRoZSBpbnNuIGZvciBtZW0gZm9ybWF0IHdpdGgKLQkJIHplcm8gYWRkZW5kLiAgKi8KLQotCSAgICAgIC8qIFRha2UgdGhlIG9wIGNvZGUgYW5kIGRlc3QgZnJvbSB0aGlzIGluc24sIHRha2UgdGhlIGJhc2UgCi0JCSByZWdpc3RlciBmcm9tIHRoZSBsaXRlcmFsIGluc24uICBMZWF2ZSB0aGUgb2Zmc2V0IGFsb25lLiAgKi8KLQkgICAgICBpbnNuID0gKGluc24gJiAweGZmZTAwMDAwKSB8IChsaXRfaW5zbiAmIDB4MDAxZjAwMDApOwotCSAgICAgIHVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxMT1cpOwotCSAgICAgIHVyZWwtPnJfYWRkZW5kID0gaXJlbC0+cl9hZGRlbmQ7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0JICAgICAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgaW5zbiwgaW5mby0+Y29udGVudHMgKyB1cmVsLT5yX29mZnNldCk7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9jb250ZW50cyA9IHRydWU7Ci0JICAgIH0KLQotCSAgLyogSWYgYWxsIG1lbStieXRlLCB3ZSBjYW4gb3B0aW1pemUgMzItYml0IG1lbSBkaXNwbGFjZW1lbnRzLiAgKi8KLQkgIGVsc2UgaWYgKGZpdHMzMiAmJiAhKGZsYWdzICYgfjYpKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IHNhbml0eSBjaGVjayB0aGF0IGxpdCBpbnNuIFJhIGlzIG1lbSBpbnNuIFJiLCBhbmQKLQkJIHRoYXQgbWVtX2luc24gZGlzcCBpcyB6ZXJvLiAgKi8KLQotCSAgICAgIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxISUdIKTsKLQkgICAgICBsaXRfaW5zbiA9IChPUF9MREFIIDw8IDI2KSB8IChsaXRfaW5zbiAmIDB4MDNmZjAwMDApOwotCSAgICAgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGxpdF9pbnNuLAotCQkJICBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQkgICAgICBsaXRfcmV1c2VkID0gdHJ1ZTsKLQkgICAgICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQotCSAgICAgIHVyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJCSAgIFJfQUxQSEFfR1BSRUxMT1cpOwotCSAgICAgIHVyZWwtPnJfYWRkZW5kID0gaXJlbC0+cl9hZGRlbmQ7Ci0JICAgICAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAyOiAvKiBCWVRFIE9GRlNFVCBGT1JNQVQgKi8KLQkgIC8qIFdlIGNhbiBhbHdheXMgb3B0aW1pemUgYnl0ZSBpbnN0cnVjdGlvbnMuICAqLwotCi0JICAvKiBGSVhNRTogc2FuaXR5IGNoZWNrIHRoZSBpbnNuIGZvciBieXRlIG9wLiAgQ2hlY2sgdGhhdCB0aGUKLQkgICAgIGxpdGVyYWwgZGVzdCByZWcgaXMgaW5kZWVkIFJiIGluIHRoZSBieXRlIGluc24uICAqLwotCi0JICBpbnNuID0gKGluc24gJiB+MHgwMDFmZjAwMCkgfCAoKHN5bXZhbCAmIDcpIDw8IDEzKSB8IDB4MTAwMDsKLQotCSAgdXJlbC0+cl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX0FMUEhBX05PTkUpOwotCSAgdXJlbC0+cl9hZGRlbmQgPSAwOwotCSAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0JICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBpbnNuLCBpbmZvLT5jb250ZW50cyArIHVyZWwtPnJfb2Zmc2V0KTsKLQkgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6IC8qIENBTEwgRk9STUFUICovCi0JICB7Ci0JICAgIC8qIElmIG5vdCB6ZXJvLCBwbGFjZSB0byBqdW1wIHdpdGhvdXQgbmVlZGluZyBwdi4gICovCi0JICAgIGJmZF92bWEgb3B0ZGVzdCA9IGVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsIChpbmZvLCBzeW12YWwpOwotCSAgICBiZmRfdm1hIG9yZyA9IChpbmZvLT5zZWMtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5mby0+c2VjLT5vdXRwdXRfb2Zmc2V0Ci0JCQkgICArIHVyZWwtPnJfb2Zmc2V0ICsgNCk7Ci0JICAgIGJmZF9zaWduZWRfdm1hIG9kaXNwOwotCi0JICAgIG9kaXNwID0gKG9wdGRlc3QgPyBvcHRkZXN0IDogc3ltdmFsKSAtIG9yZzsKLQkgICAgaWYgKG9kaXNwID49IC0weDQwMDAwMCAmJiBvZGlzcCA8IDB4NDAwMDAwKQotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1JlbGEgKnhyZWw7Ci0KLQkJLyogUHJlc2VydmUgYnJhbmNoIHByZWRpY3Rpb24gY2FsbCBzdGFjayB3aGVuIHBvc3NpYmxlLiAqLwotCQlpZiAoKGluc24gJiBJTlNOX0pTUl9NQVNLKSA9PSBJTlNOX0pTUikKLQkJICBpbnNuID0gKE9QX0JTUiA8PCAyNikgfCAoaW5zbiAmIDB4MDNlMDAwMDApOwotCQllbHNlCi0JCSAgaW5zbiA9IChPUF9CUiA8PCAyNikgfCAoaW5zbiAmIDB4MDNlMDAwMDApOwotCQkgIAotCQl1cmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLAotCQkJCQkgICAgIFJfQUxQSEFfQlJBRERSKTsKLQkJdXJlbC0+cl9hZGRlbmQgPSBpcmVsLT5yX2FkZGVuZDsKLQotCQlpZiAob3B0ZGVzdCkKLQkJICB1cmVsLT5yX2FkZGVuZCArPSBvcHRkZXN0IC0gc3ltdmFsOwotCQllbHNlCi0JCSAgYWxsX29wdGltaXplZCA9IGZhbHNlOwotCi0JCWJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgdXJlbC0+cl9vZmZzZXQpOwotCi0JCS8qIEtpbGwgYW55IEhJTlQgcmVsb2MgdGhhdCBtaWdodCBleGlzdCBmb3IgdGhpcyBpbnNuLiAgKi8KLQkJeHJlbCA9IChlbGY2NF9hbHBoYV9maW5kX3JlbG9jX2F0X29mcwotCQkJKGluZm8tPnJlbG9jcywgaW5mby0+cmVsZW5kLCB1cmVsLT5yX29mZnNldCwgCi0JCQkgUl9BTFBIQV9ISU5UKSk7Ci0JCWlmICh4cmVsKQotCQkgIHhyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9BTFBIQV9OT05FKTsKLQotCQlpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQkJaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIGFsbF9vcHRpbWl6ZWQgPSBmYWxzZTsKLQotCSAgICAvKiA/Pz8gSWYgdGFyZ2V0IGdwID09IGN1cnJlbnQgZ3Agd2UgY2FuIGVsaW1pbmF0ZSB0aGUgZ3AgcmVsb2FkLgotCSAgICAgICBUaGlzIGRvZXMgZGVwZW5kIG9uIGV2ZXJ5IHBsYWNlIGEgZ3AgY291bGQgYmUgcmVsb2FkZWQgd2lsbAotCSAgICAgICBiZSwgd2hpY2ggY3VycmVudGx5IGhhcHBlbnMgZm9yIGFsbCBjb2RlIHByb2R1Y2VkIGJ5IGdjYywgYnV0Ci0JICAgICAgIG5vdCBuZWNlc3NhcmlseSBieSBoYW5kLWNvZGVkIGFzc2VtYmx5LCBvciBpZiBzaWJsaW5nIGNhbGxzCi0JICAgICAgIGFyZSBlbmFibGVkIGluIGdjYy4gCi0KLQkgICAgICAgUGVyaGFwcyBjb25kaXRpb25hbGl6ZSB0aGlzIG9uIGEgZmxhZyBiZWluZyBzZXQgaW4gdGhlIHRhcmdldAotCSAgICAgICBvYmplY3QgZmlsZSdzIGhlYWRlciwgYW5kIGhhdmUgZ2NjIHNldCBpdD8gICovCi0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIGFsbCBjYXNlcyB3ZXJlIG9wdGltaXplZCwgd2UgY2FuIHJlZHVjZSB0aGUgdXNlIGNvdW50IG9uIHRoaXMKLSAgICAgZ290IGVudHJ5IGJ5IG9uZSwgcG9zc2libHkgZWxpbWluYXRpbmcgaXQuICAqLwotICBpZiAoYWxsX29wdGltaXplZCkKLSAgICB7Ci0gICAgICBpbmZvLT5nb3RlbnQtPnVzZV9jb3VudCAtPSAxOwotICAgICAgYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPnRvdGFsX2dvdF9lbnRyaWVzIC09IDE7Ci0gICAgICBpZiAoIWluZm8tPmgpCi0JYWxwaGFfZWxmX3RkYXRhIChpbmZvLT5nb3RlbnQtPmdvdG9iaiktPm5fbG9jYWxfZ290X2VudHJpZXMgLT0gMTsKLQotICAgICAgLyogSWYgdGhlIGxpdGVyYWwgaW5zdHJ1Y3Rpb24gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoaXQgbWF5IGhhdmUgYmVlbgotCSByZXVzZWQuICBXZSBjYW4gZWxpbWluYXRlIGl0LgotCSA/Pz8gRm9yIG5vdywgSSBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBjb21wYWN0aW5nIHRoZSBzZWN0aW9uLAotCSBzbyBqdXN0IG5vcCBpdCBvdXQuICAqLwotICAgICAgaWYgKCFsaXRfcmV1c2VkKQotCXsKLQkgIGlyZWwtPnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9BTFBIQV9OT05FKTsKLQkgIGluZm8tPmNoYW5nZWRfcmVsb2NzID0gdHJ1ZTsKLQotCSAgYmZkX3B1dF8zMiAoaW5mby0+YWJmZCwgSU5TTl9VTk9QLCBpbmZvLT5jb250ZW50cyArIGlyZWwtPnJfb2Zmc2V0KTsKLQkgIGluZm8tPmNoYW5nZWRfY29udGVudHMgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGlyZWwgKyBjb3VudDsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZjY0X2FscGhhX3JlbGF4X29wdF9jYWxsIChpbmZvLCBzeW12YWwpCi0gICAgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHN5bXZhbDsKLXsKLSAgLyogSWYgdGhlIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBncCwgYW5kIHdlIGNhbiBpZGVudGlmeSB0aGF0IHRoZQotICAgICBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgaXRzIGZ1bmN0aW9uIHBvaW50ZXIsIHdlIGNhbiBlbGltaW5hdGUgdGhlCi0gICAgIGFkZHJlc3MgbG9hZC4gICovCi0KLSAgLyogSWYgdGhlIHN5bWJvbCBpcyBtYXJrZWQgTk9QViwgd2UgYXJlIGJlaW5nIHRvbGQgdGhlIGZ1bmN0aW9uIG5ldmVyCi0gICAgIG5lZWRzIGl0cyBwcm9jZWR1cmUgdmFsdWUuICAqLwotICBpZiAoaW5mby0+b3RoZXIgPT0gU1RPX0FMUEhBX05PUFYpCi0gICAgcmV0dXJuIHN5bXZhbDsKLQotICAvKiBJZiB0aGUgc3ltYm9sIGlzIG1hcmtlZCBTVERfR1AsIHdlIGFyZSBiZWluZyB0b2xkIHRoZSBmdW5jdGlvbiBkb2VzCi0gICAgIGEgbm9ybWFsIGxkZ3AgaW4gdGhlIGZpcnN0IHR3byB3b3Jkcy4gICovIAotICBlbHNlIGlmIChpbmZvLT5vdGhlciA9PSBTVE9fQUxQSEFfU1REX0dQTE9BRCkKLSAgICA7Ci0KLSAgLyogT3RoZXJ3aXNlLCB3ZSBtYXkgYmUgYWJsZSB0byBpZGVudGlmeSBhIEdQIGxvYWQgaW4gdGhlIGZpcnN0IHR3bwotICAgICB3b3Jkcywgd2hpY2ggd2UgY2FuIHRoZW4gc2tpcC4gICovCi0gIGVsc2UgCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnRzZWNfcmVsb2NzLCAqdHNlY19yZWxlbmQsICp0c2VjX2ZyZWUsICpncGRpc3A7Ci0gICAgICBiZmRfdm1hIG9mczsKLQotICAgICAgLyogTG9hZCB0aGUgcmVsb2NhdGlvbnMgZnJvbSB0aGUgc2VjdGlvbiB0aGF0IHRoZSB0YXJnZXQgc3ltYm9sIGlzIGluLiAqLwotICAgICAgaWYgKGluZm8tPnNlYyA9PSBpbmZvLT50c2VjKQotCXsKLQkgIHRzZWNfcmVsb2NzID0gaW5mby0+cmVsb2NzOwotCSAgdHNlY19yZWxlbmQgPSBpbmZvLT5yZWxlbmQ7Ci0JICB0c2VjX2ZyZWUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0c2VjX3JlbG9jcyA9IChfYmZkX2VsZjY0X2xpbmtfcmVhZF9yZWxvY3MKLQkJICAgICAgICAgKGluZm8tPmFiZmQsIGluZm8tPnRzZWMsIChQVFIpIE5VTEwsCi0JCQkgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgaW5mby0+bGlua19pbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgaWYgKHRzZWNfcmVsb2NzID09IE5VTEwpCi0JICAgIHJldHVybiAwOwotCSAgdHNlY19yZWxlbmQgPSB0c2VjX3JlbG9jcyArIGluZm8tPnRzZWMtPnJlbG9jX2NvdW50OwotCSAgdHNlY19mcmVlID0gKGluZm8tPmxpbmtfaW5mby0+a2VlcF9tZW1vcnkgPyBOVUxMIDogdHNlY19yZWxvY3MpOwotCX0KLQotICAgICAgLyogUmVjb3ZlciB0aGUgc3ltYm9sJ3Mgb2Zmc2V0IHdpdGhpbiB0aGUgc2VjdGlvbi4gICovCi0gICAgICBvZnMgPSAoc3ltdmFsIC0gaW5mby0+dHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCSAgICAgLSBpbmZvLT50c2VjLT5vdXRwdXRfb2Zmc2V0KTsKLSAgCi0gICAgICAvKiBMb29rIGZvciBhIEdQRElTUCByZWxvYy4gICovCi0gICAgICBncGRpc3AgPSAoZWxmNjRfYWxwaGFfZmluZF9yZWxvY19hdF9vZnMKLQkJKHRzZWNfcmVsb2NzLCB0c2VjX3JlbGVuZCwgb2ZzLCBSX0FMUEhBX0dQRElTUCkpOwotCi0gICAgICBpZiAoIWdwZGlzcCB8fCBncGRpc3AtPnJfYWRkZW5kICE9IDQpCi0JewotCSAgaWYgKHRzZWNfZnJlZSkKLQkgICAgZnJlZSAodHNlY19mcmVlKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGlmICh0c2VjX2ZyZWUpCi0gICAgICAgIGZyZWUgKHRzZWNfZnJlZSk7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIG5vdyBkZXRlcm1pbmVkIHRoYXQgd2UgY2FuIHNraXAgYW4gaW5pdGlhbCBncCBsb2FkLiAgVmVyaWZ5IAotICAgICB0aGF0IHRoZSBjYWxsIGFuZCB0aGUgdGFyZ2V0IHVzZSB0aGUgc2FtZSBncC4gICAqLwotICBpZiAoaW5mby0+bGlua19pbmZvLT5oYXNoLT5jcmVhdG9yICE9IGluZm8tPnRzZWMtPm93bmVyLT54dmVjCi0gICAgICB8fCBpbmZvLT5nb3RvYmogIT0gYWxwaGFfZWxmX3RkYXRhIChpbmZvLT50c2VjLT5vd25lciktPmdvdG9iaikKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gc3ltdmFsICsgODsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlbGF4X3dpdGhvdXRfbGl0dXNlIChpbmZvLCBzeW12YWwsIGlyZWwpCi0gICAgIHN0cnVjdCBhbHBoYV9yZWxheF9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWw7Ci17Ci0gIHVuc2lnbmVkIGludCBpbnNuOwotICBiZmRfc2lnbmVkX3ZtYSBkaXNwOwotCi0gIC8qIEdldCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnNuID0gYmZkX2dldF8zMiAoaW5mby0+YWJmZCwgaW5mby0+Y29udGVudHMgKyBpcmVsLT5yX29mZnNldCk7Ci0KLSAgaWYgKGluc24gPj4gMjYgIT0gT1BfTERRKQotICAgIHsKLSAgICAgICgoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAoIiVzOiAlcysweCVseDogd2FybmluZzogTElURVJBTCByZWxvY2F0aW9uIGFnYWluc3QgdW5leHBlY3RlZCBpbnNuIiwKLQliZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKSwgaW5mby0+c2VjLT5uYW1lLAotCSh1bnNpZ25lZCBsb25nKSBpcmVsLT5yX29mZnNldCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFNvIHdlIGFyZW4ndCB0b2xkIG11Y2guICBEbyB3aGF0IHdlIGNhbiB3aXRoIHRoZSBhZGRyZXNzIGxvYWQgYW5kCi0gICAgIGZha2UgdGhlIHJlc3QuICBBbGwgb2YgdGhlIG9wdGltaXphdGlvbnMgaGVyZSByZXF1aXJlIHRoYXQgdGhlCi0gICAgIG9mZnNldCBmcm9tIHRoZSBHUCBmaXQgaW4gMTYgYml0cy4gICovCi0KLSAgZGlzcCA9IHN5bXZhbCAtIGluZm8tPmdwOwotICBpZiAoZGlzcCA8IC0weDgwMDAgfHwgZGlzcCA+PSAweDgwMDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogT24gdGhlIExJVEVSQUwgaW5zdHJ1Y3Rpb24gaXRzZWxmLCBjb25zaWRlciBleGNoYW5naW5nCi0gICAgIGBsZHEgUixYKGdwKScgZm9yIGBsZGEgUixZKGdwKScuICAqLwotCi0gIGluc24gPSAoT1BfTERBIDw8IDI2KSB8IChpbnNuICYgMHgwM2ZmMDAwMCk7Ci0gIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGluc24sIGluZm8tPmNvbnRlbnRzICsgaXJlbC0+cl9vZmZzZXQpOwotICBpbmZvLT5jaGFuZ2VkX2NvbnRlbnRzID0gdHJ1ZTsKLQotICBpcmVsLT5yX2luZm8gPSBFTEY2NF9SX0lORk8gKEVMRjY0X1JfU1lNIChpcmVsLT5yX2luZm8pLCBSX0FMUEhBX0dQUkVMTE9XKTsKLSAgaW5mby0+Y2hhbmdlZF9yZWxvY3MgPSB0cnVlOwotCi0gIC8qIFJlZHVjZSB0aGUgdXNlIGNvdW50IG9uIHRoaXMgZ290IGVudHJ5IGJ5IG9uZSwgcG9zc2libHkKLSAgICAgZWxpbWluYXRpbmcgaXQuICAqLwotICBpbmZvLT5nb3RlbnQtPnVzZV9jb3VudCAtPSAxOwotICBhbHBoYV9lbGZfdGRhdGEgKGluZm8tPmdvdGVudC0+Z290b2JqKS0+dG90YWxfZ290X2VudHJpZXMgLT0gMTsKLSAgaWYgKCFpbmZvLT5oKQotICAgIGFscGhhX2VsZl90ZGF0YSAoaW5mby0+Z290ZW50LT5nb3RvYmopLT5uX2xvY2FsX2dvdF9lbnRyaWVzIC09IDE7Ci0KLSAgLyogPz8/IFNlYXJjaCBmb3J3YXJkIHRocm91Z2ggdGhpcyBiYXNpYyBibG9jayBsb29raW5nIGZvciBpbnNucwotICAgICB0aGF0IHVzZSB0aGUgdGFyZ2V0IHJlZ2lzdGVyLiAgU3RvcCBhZnRlciBhbiBpbnNuIG1vZGlmeWluZyB0aGUKLSAgICAgcmVnaXN0ZXIgaXMgc2Vlbiwgb3IgYWZ0ZXIgYSBicmFuY2ggb3IgY2FsbC4KLQotICAgICBBbnkgc3VjaCBtZW1vcnkgbG9hZCBpbnNuIG1heSBiZSBzdWJzdGl0dXRlZCBieSBhIGxvYWQgZGlyZWN0bHkKLSAgICAgb2ZmIHRoZSBHUC4gIFRoaXMgYWxsb3dzIHRoZSBtZW1vcnkgbG9hZCBpbnNuIHRvIGJlIGlzc3VlZCBiZWZvcmUKLSAgICAgdGhlIGNhbGN1bGF0ZWQgR1AgcmVnaXN0ZXIgd291bGQgb3RoZXJ3aXNlIGJlIHJlYWR5LiAKLQotICAgICBBbnkgc3VjaCBqc3IgaW5zbiBjYW4gYmUgcmVwbGFjZWQgYnkgYSBic3IgaWYgaXQgaXMgaW4gcmFuZ2UuCi0KLSAgICAgVGhpcyB3b3VsZCBtZWFuIHRoYXQgd2UnZCBoYXZlIHRvIF9hZGRfIHJlbG9jYXRpb25zLCB0aGUgcGFpbiBvZgotICAgICB3aGljaCBnaXZlcyBvbmUgcGF1c2UuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0gICAgIGJvb2xlYW4gKmFnYWluOwotewotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmZyZWVfcmVsb2NzID0gTlVMTDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWwsICppcmVsZW5kOwotICBiZmRfYnl0ZSAqZnJlZV9jb250ZW50cyA9IE5VTEw7Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqZXh0c3ltcyA9IE5VTEw7Ci0gIEVsZjY0X0V4dGVybmFsX1N5bSAqZnJlZV9leHRzeW1zID0gTlVMTDsKLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKipsb2NhbF9nb3RfZW50cmllczsKLSAgc3RydWN0IGFscGhhX3JlbGF4X2luZm8gaW5mbzsKLQotICAvKiBXZSBhcmUgbm90IGN1cnJlbnRseSBjaGFuZ2luZyBhbnkgc2l6ZXMsIHNvIG9ubHkgb25lIHBhc3MuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAobGlua19pbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwCi0gICAgICB8fCBzZWMtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIGJlZW4gY2FsbGVkIGZvciB0aGlzIHNlY3Rpb24sCi0gICAgIGluaXRpYWxpemUgdGhlIGNvb2tlZCBzaXplLiAgKi8KLSAgaWYgKHNlYy0+X2Nvb2tlZF9zaXplID09IDApCi0gICAgc2VjLT5fY29va2VkX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIGxvY2FsX2dvdF9lbnRyaWVzID0gYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5sb2NhbF9nb3RfZW50cmllczsKLQotICAvKiBMb2FkIHRoZSByZWxvY2F0aW9ucyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaW50ZXJuYWxfcmVsb2NzID0gKF9iZmRfZWxmNjRfbGlua19yZWFkX3JlbG9jcwotCQkgICAgIChhYmZkLCBzZWMsIChQVFIpIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICAgICBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KSk7Ci0gIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKCEgbGlua19pbmZvLT5rZWVwX21lbW9yeSkKLSAgICBmcmVlX3JlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0gIGluZm8uYWJmZCA9IGFiZmQ7Ci0gIGluZm8uc2VjID0gc2VjOwotICBpbmZvLmxpbmtfaW5mbyA9IGxpbmtfaW5mbzsKLSAgaW5mby5yZWxvY3MgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIGluZm8ucmVsZW5kID0gaXJlbGVuZCA9IGludGVybmFsX3JlbG9jcyArIHNlYy0+cmVsb2NfY291bnQ7Ci0KLSAgLyogRmluZCB0aGUgR1AgZm9yIHRoaXMgb2JqZWN0LiAgKi8KLSAgaW5mby5nb3RvYmogPSBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT5nb3RvYmo7Ci0gIGlmIChpbmZvLmdvdG9iaikKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoaW5mby5nb3RvYmopLT5nb3Q7Ci0gICAgICBpbmZvLmdwID0gX2JmZF9nZXRfZ3BfdmFsdWUgKGluZm8uZ290b2JqKTsKLSAgICAgIGlmIChpbmZvLmdwID09IDApCi0JewotCSAgaW5mby5ncCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgICAgKyAweDgwMDApOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKGluZm8uZ290b2JqLCBpbmZvLmdwKTsKLQl9Ci0gICAgfQotCi0gIGZvciAoaXJlbCA9IGludGVybmFsX3JlbG9jczsgaXJlbCA8IGlyZWxlbmQ7IGlyZWwrKykKLSAgICB7Ci0gICAgICBiZmRfdm1hIHN5bXZhbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgICAgIGlmIChFTEY2NF9SX1RZUEUgKGlyZWwtPnJfaW5mbykgIT0gKGludCkgUl9BTFBIQV9MSVRFUkFMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBHZXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKGluZm8uY29udGVudHMgPT0gTlVMTCkKLQl7Ci0JICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQkgICAgaW5mby5jb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChzZWMtPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKGluZm8uY29udGVudHMgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgZnJlZV9jb250ZW50cyA9IGluZm8uY29udGVudHM7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgaW5mby5jb250ZW50cywKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLCBzZWMtPl9yYXdfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBSZWFkIHRoaXMgQkZEJ3Mgc3ltYm9scyBpZiB3ZSBoYXZlbid0IGRvbmUgc28gYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCXsKLQkgIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotCSAgICBleHRzeW1zID0gKEVsZjY0X0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4dHN5bXMgPSAoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKHN5bXRhYl9oZHItPnNoX3NpemUpKTsKLQkgICAgICBpZiAoZXh0c3ltcyA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBmcmVlX2V4dHN5bXMgPSBleHRzeW1zOwotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltdGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCQkgIHx8IChiZmRfcmVhZCAoZXh0c3ltcywgMSwgc3ltdGFiX2hkci0+c2hfc2l6ZSwgYWJmZCkKLQkJICAgICAgIT0gc3ltdGFiX2hkci0+c2hfc2l6ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgdGhlIHJlbG9jLiAgKi8KLSAgICAgIGlmIChFTEY2NF9SX1NZTSAoaXJlbC0+cl9pbmZvKSA8IHN5bXRhYl9oZHItPnNoX2luZm8pCi0JewotCSAgLyogQSBsb2NhbCBzeW1ib2wuICAqLwotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX2luIChhYmZkLAotCQkJCSAgICBleHRzeW1zICsgRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbyksCi0JCQkJICAgICZpc3ltKTsKLQkgIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgaW5mby50c2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UgaWYgKGlzeW0uc3Rfc2huZHggPiAwICYmIGlzeW0uc3Rfc2huZHggPCBTSE5fTE9SRVNFUlZFKQotCSAgICBpbmZvLnRzZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgaXN5bS5zdF9zaG5keCk7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIGluZm8udHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBlbHNlIGlmIChpc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JICAgIGluZm8udHNlYyA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBlbHNlIAotCSAgICBjb250aW51ZTsJLyogd2hvIGtub3dzLiAqLwotCi0JICBpbmZvLmggPSBOVUxMOwotCSAgaW5mby5vdGhlciA9IGlzeW0uc3Rfb3RoZXI7Ci0JICBnb3RlbnQgPSBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShpcmVsLT5yX2luZm8pXTsKLQkgIHN5bXZhbCA9IGlzeW0uc3RfdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgaW5keDsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBpbmR4ID0gRUxGNjRfUl9TWU0gKGlyZWwtPnJfaW5mbykgLSBzeW10YWJfaGRyLT5zaF9pbmZvOwotCSAgaCA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChhYmZkKVtpbmR4XTsKLQkgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0KLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIC8qIFdlIGNhbid0IGRvIGFudGhpbmcgd2l0aCB1bmRlZmluZWQgb3IgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JICAgICAgfHwgYWxwaGFfZWxmX2R5bmFtaWNfc3ltYm9sX3AgKCZoLT5yb290LCBsaW5rX2luZm8pKQotCSAgICBjb250aW51ZTsKLQotCSAgaW5mby5oID0gaDsKLQkgIGluZm8uZ290ZW50ID0gZ290ZW50OwotCSAgaW5mby50c2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0JICBpbmZvLm90aGVyID0gaC0+cm9vdC5vdGhlcjsKLQkgIGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOwotCSAgc3ltdmFsID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlOwotCX0KLQotICAgICAgLyogU2VhcmNoIGZvciB0aGUgZ290IGVudHJ5IHRvIGJlIHVzZWQgYnkgdGhpcyByZWxvY2F0aW9uLiAgKi8KLSAgICAgIHdoaWxlIChnb3RlbnQtPmdvdG9iaiAhPSBpbmZvLmdvdG9iaiB8fCBnb3RlbnQtPmFkZGVuZCAhPSBpcmVsLT5yX2FkZGVuZCkKLQlnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0gICAgICBpbmZvLmdvdGVudCA9IGdvdGVudDsKLQotICAgICAgc3ltdmFsICs9IGluZm8udHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGluZm8udHNlYy0+b3V0cHV0X29mZnNldDsKLSAgICAgIHN5bXZhbCArPSBpcmVsLT5yX2FkZGVuZDsKLQotICAgICAgQkZEX0FTU0VSVChpbmZvLmdvdGVudCAhPSBOVUxMKTsKLQotICAgICAgLyogSWYgdGhlcmUgZXhpc3QgTElUVVNFIHJlbG9jYXRpb25zIGltbWVkaWF0ZWx5IGZvbGxvd2luZywgdGhpcwotCSBvcGVucyB1cCBhbGwgc29ydHMgb2YgaW50ZXJlc3Rpbmcgb3B0aW1pemF0aW9ucywgYmVjYXVzZSB3ZQotCSBub3cga25vdyBldmVyeSBsb2NhdGlvbiB0aGF0IHRoaXMgYWRkcmVzcyBsb2FkIGlzIHVzZWQuICAqLwotCi0gICAgICBpZiAoaXJlbCsxIDwgaXJlbGVuZCAmJiBFTEY2NF9SX1RZUEUgKGlyZWxbMV0ucl9pbmZvKSA9PSBSX0FMUEhBX0xJVFVTRSkKLQl7Ci0JICBpcmVsID0gZWxmNjRfYWxwaGFfcmVsYXhfd2l0aF9saXR1c2UgKCZpbmZvLCBzeW12YWwsIGlyZWwsIGlyZWxlbmQpOwotCSAgaWYgKGlyZWwgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghZWxmNjRfYWxwaGFfcmVsYXhfd2l0aG91dF9saXR1c2UgKCZpbmZvLCBzeW12YWwsIGlyZWwpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmICghZWxmNjRfYWxwaGFfc2l6ZV9nb3Rfc2VjdGlvbnMgKGFiZmQsIGxpbmtfaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLmNoYW5nZWRfcmVsb2NzKQotICAgIHsKLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICAgIH0KLQotICBpZiAoaW5mby5jaGFuZ2VkX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnRoaXNfaGRyLmNvbnRlbnRzID0gaW5mby5jb250ZW50czsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyZWVfY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBsaW5rX2luZm8tPmtlZXBfbWVtb3J5KQotCWZyZWUgKGZyZWVfY29udGVudHMpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENhY2hlIHRoZSBzZWN0aW9uIGNvbnRlbnRzIGZvciBlbGZfbGlua19pbnB1dF9iZmQuICAqLwotCSAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+dGhpc19oZHIuY29udGVudHMgPSBpbmZvLmNvbnRlbnRzOwotCX0KLSAgICB9Ci0KLSAgaWYgKGZyZWVfZXh0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGxpbmtfaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAoZnJlZV9leHRzeW1zKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYWNoZSB0aGUgc3ltYm9scyBmb3IgZWxmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQkgIHN5bXRhYl9oZHItPmNvbnRlbnRzID0gZXh0c3ltczsKLQl9Ci0gICAgfQotCi0gICphZ2FpbiA9IGluZm8uY2hhbmdlZF9jb250ZW50cyB8fCBpbmZvLmNoYW5nZWRfcmVsb2NzOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZnJlZV9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX3JlbG9jcyk7Ci0gIGlmIChmcmVlX2NvbnRlbnRzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9jb250ZW50cyk7Ci0gIGlmIChmcmVlX2V4dHN5bXMgIT0gTlVMTCkKLSAgICBmcmVlIChmcmVlX2V4dHN5bXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0MCi0vKiBQTFQvR09UIFN0dWZmICovCi0jZGVmaW5lIFBMVF9IRUFERVJfU0laRSAzMgotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQxCTB4YzM2MDAwMDAJLyogYnIgICAkMjcsLis0ICAgICAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQyCTB4YTc3YjAwMGMJLyogbGRxICAkMjcsMTIoJDI3KSAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQzCTB4NDdmZjA0MWYJLyogbm9wICAgICAgICAgICAgICAqLwotI2RlZmluZSBQTFRfSEVBREVSX1dPUkQ0CTB4NmI3YjAwMDAJLyogam1wICAkMjcsKCQyNykgICAqLwotCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDEyCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMQkJMHhjMzgwMDAwMAkvKiBiciAgICQyOCwgcGx0MCAgICovCi0jZGVmaW5lIFBMVF9FTlRSWV9XT1JEMgkJMAotI2RlZmluZSBQTFRfRU5UUllfV09SRDMJCTAKLQotI2RlZmluZSBNQVhfR09UX0VOVFJJRVMJCSg2NCoxMDI0IC8gOCkKLQotI2RlZmluZSBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUiAiL3Vzci9saWIvbGQuc28iCi0MCi0vKiBIYW5kbGUgYW4gQWxwaGEgc3BlY2lmaWMgc2VjdGlvbiB3aGVuIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUuICBUaGlzCi0gICBpcyBjYWxsZWQgd2hlbiBlbGZjb2RlLmggZmluZHMgYSBzZWN0aW9uIHdpdGggYW4gdW5rbm93biB0eXBlLgotICAgRklYTUU6IFdlIG5lZWQgdG8gaGFuZGxlIHRoZSBTSEZfQUxQSEFfR1BSRUwgZmxhZywgYnV0IEknbSBub3Qgc3VyZQotICAgaG93IHRvLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3NlY3Rpb25fZnJvbV9zaGRyIChhYmZkLCBoZHIsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmNjRfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqbmV3c2VjdDsKLQotICAvKiBUaGVyZSBvdWdodCB0byBiZSBhIHBsYWNlIHRvIGtlZXAgRUxGIGJhY2tlbmQgc3BlY2lmaWMgZmxhZ3MsIGJ1dAotICAgICBhdCB0aGUgbW9tZW50IHRoZXJlIGlzbid0IG9uZS4gIFdlIGp1c3Qga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgc2VjdGlvbnMgYnkgdGhlaXIgbmFtZSwgaW5zdGVhZC4gIEZvcnR1bmF0ZWx5LCB0aGUgQUJJIGdpdmVzCi0gICAgIHN1Z2dlc3RlZCBuYW1lcyBmb3IgYWxsIHRoZSBNSVBTIHNwZWNpZmljIHNlY3Rpb25zLCBzbyB3ZSB3aWxsCi0gICAgIHByb2JhYmx5IGdldCBhd2F5IHdpdGggdGhpcy4gICovCi0gIHN3aXRjaCAoaGRyLT5zaF90eXBlKQotICAgIHsKLSAgICBjYXNlIFNIVF9BTFBIQV9ERUJVRzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIubWRlYnVnIikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgY2FzZSBTSFRfQUxQSEFfUkVHSU5GTzoKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpICE9IDAKLQkgIHx8IGhkci0+c2hfc2l6ZSAhPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgX2JmZF9lbGZfbWFrZV9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5ld3NlY3QgPSBoZHItPmJmZF9zZWN0aW9uOwotCi0gIGlmIChoZHItPnNoX3R5cGUgPT0gU0hUX0FMUEhBX0RFQlVHKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgbmV3c2VjdCwKLQkJCQkgICAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBuZXdzZWN0KQotCQkJCSAgICB8IFNFQ19ERUJVR0dJTkcpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICAvKiBGb3IgYSAucmVnaW5mbyBzZWN0aW9uLCBzZXQgdGhlIGdwIHZhbHVlIGluIHRoZSB0ZGF0YSBpbmZvcm1hdGlvbgotICAgICBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGlzIHNlY3Rpb24uICBXZSBuZWVkIHRoZSBncCB2YWx1ZSB3aGlsZQotICAgICBwcm9jZXNzaW5nIHJlbG9jcywgc28gd2UganVzdCBnZXQgaXQgbm93LiAgKi8KLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfQUxQSEFfUkVHSU5GTykKLSAgICB7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvIGV4dDsKLSAgICAgIEVsZjY0X1JlZ0luZm8gczsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBuZXdzZWN0LCAoUFRSKSAmZXh0LAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2l6ZW9mIGV4dCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2FscGhhX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoYWJmZCwgJmV4dCwgJnMpOwotICAgICAgZWxmX2dwIChhYmZkKSA9IHMucmlfZ3BfdmFsdWU7Ci0gICAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgY29ycmVjdCB0eXBlIGZvciBhbiBBbHBoYSBFTEYgc2VjdGlvbi4gIFdlIGRvIHRoaXMgYnkgdGhlCi0gICBzZWN0aW9uIG5hbWUsIHdoaWNoIGlzIGEgaGFjaywgYnV0IG91Z2h0IHRvIHdvcmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucyAoYWJmZCwgaGRyLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmNjRfSW50ZXJuYWxfU2hkciAqaGRyOwotICAgICBhc2VjdGlvbiAqc2VjOwotewotICByZWdpc3RlciBjb25zdCBjaGFyICpuYW1lOwotCi0gIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKTsKLQotICBpZiAoc3RyY21wIChuYW1lLCAiLm1kZWJ1ZyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0FMUEhBX0RFQlVHOwotICAgICAgLyogSW4gYSBzaGFyZWQgb2JqZWN0IG9uIElyaXggNS4zLCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAwLiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAgKQotCWhkci0+c2hfZW50c2l6ZSA9IDA7Ci0gICAgICBlbHNlCi0JaGRyLT5zaF9lbnRzaXplID0gMTsKLSAgICB9Ci0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucmVnaW5mbyIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF90eXBlID0gU0hUX0FMUEhBX1JFR0lORk87Ci0gICAgICAvKiBJbiBhIHNoYXJlZCBvYmplY3Qgb24gSXJpeCA1LjMsIHRoZSAucmVnaW5mbyBzZWN0aW9uIGhhcyBhbgotICAgICAgICAgZW50c2l6ZSBvZiAweDE4LiAgRklYTUU6IERvZXMgdGhpcyBtYXR0ZXI/ICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JaGRyLT5zaF9lbnRzaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLSAgICAgIGVsc2UKLQloZHItPnNoX2VudHNpemUgPSAxOwotCi0gICAgICAvKiBGb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIHRoZSBjb3JyZWN0IHZhbHVlLCBldmVuIGlmIHRoZQotCSBsaW5rZXIgdGhpbmtzIGl0IGlzIGxhcmdlci4gIFRoZSBsaW5rIHJvdXRpbmUgYmVsb3cgd2lsbCBvbmx5Ci0JIHdyaXRlIG91dCB0aGlzIG11Y2ggZGF0YSBmb3IgLnJlZ2luZm8uICAqLwotICAgICAgaGRyLT5zaF9zaXplID0gc2VjLT5fcmF3X3NpemUgPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmhhc2giKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bmFtaWMiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApCi0gICAgewotICAgICAgaGRyLT5zaF9lbnRzaXplID0gMDsKLSAgICAgIGhkci0+c2hfaW5mbyA9IFNJWkVPRl9BTFBIQV9EWU5TWU1fU0VDTkFNRVM7Ci0gICAgfQotI2VuZGlmCi0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5zZGF0YSIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIuc2JzcyIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0NCIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICIubGl0OCIpID09IDApCi0gICAgaGRyLT5zaF9mbGFncyB8PSBTSEZfQUxQSEFfR1BSRUw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhvb2sgY2FsbGVkIGJ5IHRoZSBsaW5rZXIgcm91dGluZSB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QKLSAgIGZpbGUuICBXZSB1c2UgaXQgdG8gcHV0IC5jb21tIGl0ZW1zIGluIC5zYnNzLCBhbmQgbm90IC5ic3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfYWRkX3N5bWJvbF9ob29rIChhYmZkLCBpbmZvLCBzeW0sIG5hbWVwLCBmbGFnc3AsIHNlY3AsIHZhbHApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVwOwotICAgICBmbGFnd29yZCAqZmxhZ3NwOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGJmZF92bWEgKnZhbHA7Ci17Ci0gIGlmIChzeW0tPnN0X3NobmR4ID09IFNITl9DT01NT04KLSAgICAgICYmICFpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIHN5bS0+c3Rfc2l6ZSA8PSBiZmRfZ2V0X2dwX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIENvbW1vbiBzeW1ib2xzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAtRyBubiBieXRlcyBhcmUKLQkgYXV0b21hdGljYWxseSBwdXQgaW50byAuc2Jzcy4gICovCi0KLSAgICAgIGFzZWN0aW9uICpzY29tbSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNjb21tb24iKTsKLQotICAgICAgaWYgKHNjb21tID09IE5VTEwpCi0JewotCSAgc2NvbW0gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnNjb21tb24iKTsKLQkgIGlmIChzY29tbSA9PSBOVUxMCi0JICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2NvbW0sIChTRUNfQUxMT0MKLQkJCQkJCSAgICAgICB8IFNFQ19JU19DT01NT04KLQkJCQkJCSAgICAgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAqc2VjcCA9IHNjb21tOwotICAgICAgKnZhbHAgPSBzeW0tPnN0X3NpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jcmVhdGVfZ290X3NlY3Rpb24oYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmdvdCIpKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCkpCi0gICAgICB8fCAhYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFscGhhX2VsZl90ZGF0YSAoYWJmZCktPmdvdCA9IHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhbGwgdGhlIGR5bmFtaWMgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSAucGx0LCAucmVsYS5wbHQsIC5nb3QsIGFuZCAucmVsYS5nb3Qgc2VjdGlvbnMuICAqLwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJICAgIHwgU0VDX0NPREUpKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRGVmaW5lIHRoZSBzeW1ib2wgX1BST0NFRFVSRV9MSU5LQUdFX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5wbHQgc2VjdGlvbi4gICovCi0gIGggPSBOVUxMOwotICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkgKGluZm8sIGFiZmQsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmYWxzZSwKLQkgIGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Y29sbGVjdCwKLQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJlbGEucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJCSAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFdlIG1heSBvciBtYXkgbm90IGhhdmUgY3JlYXRlZCBhIC5nb3Qgc2VjdGlvbiBmb3IgdGhpcyBvYmplY3QsIGJ1dAotICAgICB3ZSBkZWZpbml0ZWx5IGhhdm4ndCBkb25lIHRoZSByZXN0IG9mIHRoZSB3b3JrLiAgKi8KLQotICBpZiAoIWVsZjY0X2FscGhhX2NyZWF0ZV9nb3Rfc2VjdGlvbiAoYWJmZCwgaW5mbykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uKGFiZmQsICIucmVsYS5nb3QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJICAgfCBTRUNfUkVBRE9OTFkpKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfR0xPQkFMX09GRlNFVF9UQUJMRV8gYXQgdGhlIHN0YXJ0IG9mIHRoZQotICAgICBkeW5vYmoncyAuZ290IHNlY3Rpb24uICBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBsaW5rZXIgc2NyaXB0Ci0gICAgIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgdGhlIHN5bWJvbCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nCi0gICAgIGEgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIGggPSBOVUxMOwotICBpZiAoIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCShpbmZvLCBhYmZkLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIiwgQlNGX0dMT0JBTCwKLQkgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5nb3QsIChiZmRfdm1hKSAwLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCSBmYWxzZSwgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QgPSBoOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVhZCBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIC5tZGVidWcgc2VjdGlvbiBpbnRvIGEKLSAgIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3JlYWRfZWNvZmZfaW5mbyAoYWJmZCwgc2VjdGlvbiwgZGVidWcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLXsKLSAgSERSUiAqc3ltaGRyOwotICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqc3dhcDsKLSAgY2hhciAqZXh0X2hkciA9IE5VTEw7Ci0KLSAgc3dhcCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgbWVtc2V0IChkZWJ1ZywgMCwgc2l6ZW9mKCpkZWJ1ZykpOwotCi0gIGV4dF9oZHIgPSAoY2hhciAqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzd2FwLT5leHRlcm5hbF9oZHJfc2l6ZSk7Ci0gIGlmIChleHRfaGRyID09IE5VTEwgJiYgc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBleHRfaGRyLCAoZmlsZV9wdHIpIDAsCi0JCQkJc3dhcC0+ZXh0ZXJuYWxfaGRyX3NpemUpCi0gICAgICA9PSBmYWxzZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzeW1oZHIgPSAmZGVidWctPnN5bWJvbGljX2hlYWRlcjsKLSAgKCpzd2FwLT5zd2FwX2hkcl9pbikgKGFiZmQsIGV4dF9oZHIsIHN5bWhkcik7Ci0KLSAgLyogVGhlIHN5bWJvbGljIGhlYWRlciBjb250YWlucyBhYnNvbHV0ZSBmaWxlIG9mZnNldHMgYW5kIHNpemVzIHRvCi0gICAgIHJlYWQuICAqLwotI2RlZmluZSBSRUFEKHB0ciwgb2Zmc2V0LCBjb3VudCwgc2l6ZSwgdHlwZSkJCQkJXAotICBpZiAoc3ltaGRyLT5jb3VudCA9PSAwKQkJCQkJCVwKLSAgICBkZWJ1Zy0+cHRyID0gTlVMTDsJCQkJCQkJXAotICBlbHNlCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBkZWJ1Zy0+cHRyID0gKHR5cGUpIGJmZF9tYWxsb2MgKChzaXplX3QpIChzaXplICogc3ltaGRyLT5jb3VudCkpOwlcCi0gICAgICBpZiAoZGVidWctPnB0ciA9PSBOVUxMKQkJCQkJCVwKLQlnb3RvIGVycm9yX3JldHVybjsJCQkJCQlcCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgc3ltaGRyLT5vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCVwKLQkgIHx8IChiZmRfcmVhZCAoZGVidWctPnB0ciwgc2l6ZSwgc3ltaGRyLT5jb3VudCwJCVwKLQkJCWFiZmQpICE9IHNpemUgKiBzeW1oZHItPmNvdW50KSkJCQlcCi0JZ290byBlcnJvcl9yZXR1cm47CQkJCQkJXAotICAgIH0KLQotICBSRUFEIChsaW5lLCBjYkxpbmVPZmZzZXQsIGNiTGluZSwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSwgdW5zaWduZWQgY2hhciAqKTsKLSAgUkVBRCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBpZG5NYXgsIHN3YXAtPmV4dGVybmFsX2Rucl9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIGlwZE1heCwgc3dhcC0+ZXh0ZXJuYWxfcGRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3N5bSwgY2JTeW1PZmZzZXQsIGlzeW1NYXgsIHN3YXAtPmV4dGVybmFsX3N5bV9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9vcHQsIGNiT3B0T2Zmc2V0LCBpb3B0TWF4LCBzd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSwgUFRSKTsKLSAgUkVBRCAoZXh0ZXJuYWxfYXV4LCBjYkF1eE9mZnNldCwgaWF1eE1heCwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQl1bmlvbiBhdXhfZXh0ICopOwotICBSRUFEIChzcywgY2JTc09mZnNldCwgaXNzTWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChzc2V4dCwgY2JTc0V4dE9mZnNldCwgaXNzRXh0TWF4LCBzaXplb2YgKGNoYXIpLCBjaGFyICopOwotICBSRUFEIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIGlmZE1heCwgc3dhcC0+ZXh0ZXJuYWxfZmRyX3NpemUsIFBUUik7Ci0gIFJFQUQgKGV4dGVybmFsX3JmZCwgY2JSZmRPZmZzZXQsIGNyZmQsIHN3YXAtPmV4dGVybmFsX3JmZF9zaXplLCBQVFIpOwotICBSRUFEIChleHRlcm5hbF9leHQsIGNiRXh0T2Zmc2V0LCBpZXh0TWF4LCBzd2FwLT5leHRlcm5hbF9leHRfc2l6ZSwgUFRSKTsKLSN1bmRlZiBSRUFECi0KLSAgZGVidWctPmZkciA9IE5VTEw7Ci0gIGRlYnVnLT5hZGp1c3QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoZXh0X2hkciAhPSBOVUxMKQotICAgIGZyZWUgKGV4dF9oZHIpOwotICBpZiAoZGVidWctPmxpbmUgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+bGluZSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfZG5yICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2Rucik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfcGRyICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3Bkcik7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX3N5bSk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfb3B0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX29wdCk7Ci0gIGlmIChkZWJ1Zy0+ZXh0ZXJuYWxfYXV4ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPmV4dGVybmFsX2F1eCk7Ci0gIGlmIChkZWJ1Zy0+c3MgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+c3MpOwotICBpZiAoZGVidWctPnNzZXh0ICE9IE5VTEwpCi0gICAgZnJlZSAoZGVidWctPnNzZXh0KTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9mZHIgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZmRyKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9yZmQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfcmZkKTsKLSAgaWYgKGRlYnVnLT5leHRlcm5hbF9leHQgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Zy0+ZXh0ZXJuYWxfZXh0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBbHBoYSBFTEYgbG9jYWwgbGFiZWxzIHN0YXJ0IHdpdGggJyQnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIG5hbWVbMF0gPT0gJyQnOwotfQotCi0vKiBBbHBoYSBFTEYgZm9sbG93cyBNSVBTIEVMRiBpbiB1c2luZyBhIHNwZWNpYWwgZmluZF9uZWFyZXN0X2xpbmUKLSAgIHJvdXRpbmUgaW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBXZQotICAgc3RpbGwgY2FsbCB0aGlzIG1pcHNfZWxmX2ZpbmRfbGluZSBiZWNhdXNlIG9mIHRoZSBzbG90Ci0gICBmaW5kX2xpbmVfaW5mbyBpbiBlbGZfb2JqX3RkYXRhIGlzIGRlY2xhcmVkIHRoYXQgd2F5LiAgKi8KLQotc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZQotewotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkOwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lIGk7Ci19OwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIG9mZnNldCwgZmlsZW5hbWVfcHRyLAotCQkJICAgICAgIGZ1bmN0aW9ubmFtZV9wdHIsIGxpbmVfcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKipmaWxlbmFtZV9wdHI7Ci0gICAgIGNvbnN0IGNoYXIgKipmdW5jdGlvbm5hbWVfcHRyOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyOwotewotICBhc2VjdGlvbiAqbXNlYzsKLQotICBtc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubWRlYnVnIik7Ci0gIGlmIChtc2VjICE9IE5VTEwpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb3JpZ2ZsYWdzOwotICAgICAgc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSAqZmk7Ci0gICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqIGNvbnN0IHN3YXAgPQotCWdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLQotICAgICAgLyogSWYgd2UgYXJlIGNhbGxlZCBkdXJpbmcgYSBsaW5rLCBhbHBoYV9lbGZfZmluYWxfbGluayBtYXkgaGF2ZQotCSBjbGVhcmVkIHRoZSBTRUNfSEFTX0NPTlRFTlRTIGZpZWxkLiAgV2UgZm9yY2UgaXQgYmFjayBvbiBoZXJlCi0JIGlmIGFwcHJvcHJpYXRlICh3aGljaCBpdCBub3JtYWxseSB3aWxsIGJlKS4gICovCi0gICAgICBvcmlnZmxhZ3MgPSBtc2VjLT5mbGFnczsKLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChtc2VjKS0+dGhpc19oZHIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQotCW1zZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIGZpID0gZWxmX3RkYXRhIChhYmZkKS0+ZmluZF9saW5lX2luZm87Ci0gICAgICBpZiAoZmkgPT0gTlVMTCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplOwotCSAgY2hhciAqZnJhd19zcmM7Ci0JICBjaGFyICpmcmF3X2VuZDsKLQkgIHN0cnVjdCBmZHIgKmZkcl9wdHI7Ci0KLQkgIGZpID0gKChzdHJ1Y3QgbWlwc19lbGZfZmluZF9saW5lICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG1pcHNfZWxmX2ZpbmRfbGluZSkpKTsKLQkgIGlmIChmaSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghZWxmNjRfYWxwaGFfcmVhZF9lY29mZl9pbmZvIChhYmZkLCBtc2VjLCAmZmktPmQpKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFN3YXAgaW4gdGhlIEZEUiBpbmZvcm1hdGlvbi4gICovCi0JICBmaS0+ZC5mZHIgPSAoKHN0cnVjdCBmZHIgKikKLQkJICAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgIChmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICoKLQkJCQkgICBzaXplb2YgKHN0cnVjdCBmZHIpKSkpOwotCSAgaWYgKGZpLT5kLmZkciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBleHRlcm5hbF9mZHJfc2l6ZSA9IHN3YXAtPmV4dGVybmFsX2Zkcl9zaXplOwotCSAgZmRyX3B0ciA9IGZpLT5kLmZkcjsKLQkgIGZyYXdfc3JjID0gKGNoYXIgKikgZmktPmQuZXh0ZXJuYWxfZmRyOwotCSAgZnJhd19lbmQgPSAoZnJhd19zcmMKLQkJICAgICAgKyBmaS0+ZC5zeW1ib2xpY19oZWFkZXIuaWZkTWF4ICogZXh0ZXJuYWxfZmRyX3NpemUpOwotCSAgZm9yICg7IGZyYXdfc3JjIDwgZnJhd19lbmQ7IGZyYXdfc3JjICs9IGV4dGVybmFsX2Zkcl9zaXplLCBmZHJfcHRyKyspCi0JICAgICgqc3dhcC0+c3dhcF9mZHJfaW4pIChhYmZkLCAoUFRSKSBmcmF3X3NyYywgZmRyX3B0cik7Ci0KLQkgIGVsZl90ZGF0YSAoYWJmZCktPmZpbmRfbGluZV9pbmZvID0gZmk7Ci0KLQkgIC8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgdG8gZXZlciBmcmVlIHRoaXMgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgZmluZF9uZWFyZXN0X2xpbmUgaXMgZWl0aGVyIGNhbGxlZCBhbGwgdGhlIHRpbWUsIGFzIGluCi0gICAgICAgICAgICAgb2JqZHVtcCAtbCwgc28gdGhlIGluZm9ybWF0aW9uIHNob3VsZCBiZSBzYXZlZCwgb3IgaXQgaXMKLSAgICAgICAgICAgICByYXJlbHkgY2FsbGVkLCBhcyBpbiBsZCBlcnJvciBtZXNzYWdlcywgc28gdGhlIG1lbW9yeQotICAgICAgICAgICAgIHdhc3RlZCBpcyB1bmltcG9ydGFudC4gIFN0aWxsLCBpdCB3b3VsZCBwcm9iYWJseSBiZSBhCi0gICAgICAgICAgICAgZ29vZCBpZGVhIGZvciBmcmVlX2NhY2hlZF9pbmZvIHRvIHRocm93IGl0IGF3YXkuICAqLwotCX0KLQotICAgICAgaWYgKF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZnNldCwgJmZpLT5kLCBzd2FwLAotCQkJCSAgJmZpLT5pLCBmaWxlbmFtZV9wdHIsIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJICBsaW5lX3B0cikpCi0JewotCSAgbXNlYy0+ZmxhZ3MgPSBvcmlnZmxhZ3M7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIG1zZWMtPmZsYWdzID0gb3JpZ2ZsYWdzOwotICAgIH0KLQotICAvKiBGYWxsIGJhY2sgb24gdGhlIGdlbmVyaWMgRUxGIGZpbmRfbmVhcmVzdF9saW5lIHJvdXRpbmUuICAqLwotCi0gIHJldHVybiBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LAotCQkJCSAgICAgZmlsZW5hbWVfcHRyLCBmdW5jdGlvbm5hbWVfcHRyLAotCQkJCSAgICAgbGluZV9wdHIpOwotfQotDAotLyogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0byBhbHBoYV9lbGZfb3V0cHV0X2V4dHN5bS4gICovCi0KLXN0cnVjdCBleHRzeW1faW5mbwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwOwotICBib29sZWFuIGZhaWxlZDsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9vdXRwdXRfZXh0c3ltIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBleHRzeW1faW5mbyAqZWluZm8gPSAoc3RydWN0IGV4dHN5bV9pbmZvICopIGRhdGE7Ci0gIGJvb2xlYW4gc3RyaXA7Ci0gIGFzZWN0aW9uICpzZWMsICpvdXRwdXRfc2VjdGlvbjsKLQotICBpZiAoaC0+cm9vdC5pbmR4ID09IC0yKQotICAgIHN0cmlwID0gZmFsc2U7Ci0gIGVsc2UgaWYgKCgoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgIT0gMAotICAgICAgICAgICB8fCAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfRFlOQU1JQykgIT0gMCkKLSAgICAgICAgICAmJiAoaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotICAgICAgICAgICYmIChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSA9PSAwKQotICAgIHN0cmlwID0gdHJ1ZTsKLSAgZWxzZSBpZiAoZWluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotICAgICAgICAgIHx8IChlaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotICAgICAgICAgICAgICAmJiBiZmRfaGFzaF9sb29rdXAgKGVpbmZvLT5pbmZvLT5rZWVwX2hhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgc3RyaXAgPSB0cnVlOwotICBlbHNlCi0gICAgc3RyaXAgPSBmYWxzZTsKLQotICBpZiAoc3RyaXApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPmVzeW0uaWZkID09IC0yKQotICAgIHsKLSAgICAgIGgtPmVzeW0uam1wdGJsID0gMDsKLSAgICAgIGgtPmVzeW0uY29ib2xfbWFpbiA9IDA7Ci0gICAgICBoLT5lc3ltLndlYWtleHQgPSAwOwotICAgICAgaC0+ZXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmlmZCA9IGlmZE5pbDsKLSAgICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uc3QgPSBzdEdsb2JhbDsKLQotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjQWJzOwotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgIHNlYyA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgICAgb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCi0gICAgICAgICAvKiBXaGVuIG1ha2luZyBhIHNoYXJlZCBsaWJyYXJ5IGFuZCBzeW1ib2wgaCBpcyB0aGUgb25lIGZyb20KLSAgICAgICAgICAgIHRoZSBhbm90aGVyIHNoYXJlZCBsaWJyYXJ5LCBPVVRQVVRfU0VDVElPTiBtYXkgYmUgbnVsbC4gICovCi0gICAgICAgICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLSAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NVbmRlZmluZWQ7Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X3NlY3Rpb24tPm93bmVyLCBvdXRwdXRfc2VjdGlvbik7Ci0KLSAgICAgICAgICAgICBpZiAoc3RyY21wIChuYW1lLCAiLnRleHQiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NUZXh0OwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjRGF0YTsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuc2RhdGEiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTRGF0YTsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIucm9kYXRhIikgPT0gMAotICAgICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcCAobmFtZSwgIi5yZGF0YSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY1JEYXRhOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5ic3MiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnNic3MiKSA9PSAwKQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NTQnNzOwotICAgICAgICAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pbml0IikgPT0gMCkKLSAgICAgICAgICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjSW5pdDsKLSAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZmluaSIpID09IDApCi0gICAgICAgICAgICAgICBoLT5lc3ltLmFzeW0uc2MgPSBzY0Zpbmk7Ci0gICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NBYnM7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgIGgtPmVzeW0uYXN5bS5yZXNlcnZlZCA9IDA7Ci0gICAgICBoLT5lc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLSAgICB9Ci0KLSAgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIGgtPmVzeW0uYXN5bS52YWx1ZSA9IGgtPnJvb3Qucm9vdC51LmMuc2l6ZTsKLSAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NDb21tb24pCi0gICAgICAgaC0+ZXN5bS5hc3ltLnNjID0gc2NCc3M7Ci0gICAgICBlbHNlIGlmIChoLT5lc3ltLmFzeW0uc2MgPT0gc2NTQ29tbW9uKQotICAgICAgIGgtPmVzeW0uYXN5bS5zYyA9IHNjU0JzczsKLQotICAgICAgc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvdXRwdXRfc2VjdGlvbiA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0gICAgICBpZiAob3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0cHV0X3NlY3Rpb24tPnZtYSk7Ci0gICAgICBlbHNlCi0gICAgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKChoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdHlwZSBhbmQgdmFsdWUgZm9yIGEgc3ltYm9sIHdpdGggYSBmdW5jdGlvbiBzdHViLiAgKi8KLSAgICAgIGgtPmVzeW0uYXN5bS5zdCA9IHN0UHJvYzsKLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChlaW5mby0+YWJmZCwgIi5wbHQiKTsKLSAgICAgIGlmIChzZWMgPT0gTlVMTCkKLQloLT5lc3ltLmFzeW0udmFsdWUgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG91dHB1dF9zZWN0aW9uID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLQkgIGlmIChvdXRwdXRfc2VjdGlvbiAhPSBOVUxMKQotCSAgICBoLT5lc3ltLmFzeW0udmFsdWUgPSAoaC0+cm9vdC5wbHQub2Zmc2V0Ci0JCQkJICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkJCSAgKyBvdXRwdXRfc2VjdGlvbi0+dm1hKTsKLQkgIGVsc2UKLQkgICAgaC0+ZXN5bS5hc3ltLnZhbHVlID0gMDsKLQl9Ci0jaWYgMCAvKiBGSVhNRT8gICovCi0gICAgICBoLT5lc3ltLmlmZCA9IDA7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX29uZV9leHRlcm5hbCAoZWluZm8tPmFiZmQsIGVpbmZvLT5kZWJ1ZywgZWluZm8tPnN3YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5lc3ltKSkKLSAgICB7Ci0gICAgICBlaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZJWE1FOiAgQ3JlYXRlIGEgcnVudGltZSBwcm9jZWR1cmUgdGFibGUgZnJvbSB0aGUgLm1kZWJ1ZyBzZWN0aW9uLgotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGZfY3JlYXRlX3Byb2NlZHVyZV90YWJsZSAoaGFuZGxlLCBhYmZkLCBpbmZvLCBzLCBkZWJ1ZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnM7Ci0gICAgIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICpkZWJ1ZzsKLSovCi0MCi0vKiBIYW5kbGUgZHluYW1pYyByZWxvY2F0aW9ucyB3aGVuIGRvaW5nIGFuIEFscGhhIEVMRiBsaW5rLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqc3JlbG9jOwotICBjb25zdCBjaGFyICpyZWxfc2VjX25hbWU7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXM7Ci0gIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWwsICpyZWxlbmQ7Ci0gIGludCBnb3RfY3JlYXRlZDsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHJldHVybiB0cnVlOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlKGluZm8pLT5keW5vYmo7Ci0gIGlmIChkeW5vYmogPT0gTlVMTCkKLSAgICBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqID0gZHlub2JqID0gYWJmZDsKLQotICBzcmVsb2MgPSBOVUxMOwotICByZWxfc2VjX25hbWUgPSBOVUxMOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YShhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGFscGhhX2VsZl9zeW1faGFzaGVzKGFiZmQpOwotICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YShhYmZkKS0+bG9jYWxfZ290X2VudHJpZXM7Ci0gIGdvdF9jcmVhdGVkID0gMDsKLQotICByZWxlbmQgPSByZWxvY3MgKyBzZWMtPnJlbG9jX2NvdW50OwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyArK3JlbCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4LCByX3R5cGU7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0JICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCQkgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUjsKLQl9Ci0gICAgICByX3R5cGUgPSBFTEY2NF9SX1RZUEUgKHJlbC0+cl9pbmZvKTsKLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgUl9BTFBIQV9MSVRFUkFMOgotCSAgewotCSAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCSAgICBpbnQgZmxhZ3MgPSAwOwotCi0JICAgIGlmIChoKQotCSAgICAgIHsKLQkJLyogU2VhcmNoIGZvciBhbmQgcG9zc2libHkgY3JlYXRlIGEgZ290IGVudHJ5LiAgKi8KLQkJZm9yIChnb3RlbnQgPSBoLT5nb3RfZW50cmllczsgZ290ZW50IDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCQkgIGlmIChnb3RlbnQtPmdvdG9iaiA9PSBhYmZkICYmCi0JCSAgICAgIGdvdGVudC0+YWRkZW5kID09IHJlbC0+cl9hZGRlbmQpCi0JCSAgICBicmVhazsKLQotCQlpZiAoIWdvdGVudCkKLQkJICB7Ci0JCSAgICBnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICopCi0JCQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5KSkpOwotCQkgICAgaWYgKCFnb3RlbnQpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgZ290ZW50LT5nb3RvYmogPSBhYmZkOwotCQkgICAgZ290ZW50LT5hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCQkgICAgZ290ZW50LT5nb3Rfb2Zmc2V0ID0gLTE7Ci0JCSAgICBnb3RlbnQtPmZsYWdzID0gMDsKLQkJICAgIGdvdGVudC0+dXNlX2NvdW50ID0gMTsKLQotCQkgICAgZ290ZW50LT5uZXh0ID0gaC0+Z290X2VudHJpZXM7Ci0JCSAgICBoLT5nb3RfZW50cmllcyA9IGdvdGVudDsKLQotCQkgICAgYWxwaGFfZWxmX3RkYXRhIChhYmZkKS0+dG90YWxfZ290X2VudHJpZXMrKzsKLQkJICB9Ci0JCWVsc2UKLQkJICBnb3RlbnQtPnVzZV9jb3VudCArPSAxOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogVGhpcyBpcyBhIGxvY2FsIC5nb3QgZW50cnkgLS0gcmVjb3JkIGZvciBtZXJnZS4gICovCi0JCWlmICghbG9jYWxfZ290X2VudHJpZXMpCi0JCSAgewotCQkgICAgc2l6ZV90IHNpemU7Ci0JCSAgICBzaXplID0gKHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgICAqIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKikpOwotCi0JCSAgICBsb2NhbF9nb3RfZW50cmllcyA9ICgoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKiopCi0JCQkJCSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpKTsKLQkJICAgIGlmICghbG9jYWxfZ290X2VudHJpZXMpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQotCQkgICAgbWVtc2V0IChsb2NhbF9nb3RfZW50cmllcywgMCwgc2l6ZSk7Ci0JCSAgICBhbHBoYV9lbGZfdGRhdGEgKGFiZmQpLT5sb2NhbF9nb3RfZW50cmllcyA9Ci0JCSAgICAgIGxvY2FsX2dvdF9lbnRyaWVzOwotCQkgIH0KLQotCQlmb3IgKGdvdGVudCA9IGxvY2FsX2dvdF9lbnRyaWVzW0VMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKV07Ci0JCSAgICAgZ290ZW50ICE9IE5VTEwgJiYgZ290ZW50LT5hZGRlbmQgIT0gcmVsLT5yX2FkZGVuZDsKLQkJICAgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JCSAgY29udGludWU7Ci0JCWlmICghZ290ZW50KQotCQkgIHsKLQkJICAgIGdvdGVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKikKLQkJCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJIHNpemVvZiAoc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkpKSk7Ci0JCSAgICBpZiAoIWdvdGVudCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBnb3RlbnQtPmdvdG9iaiA9IGFiZmQ7Ci0JCSAgICBnb3RlbnQtPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgICBnb3RlbnQtPmdvdF9vZmZzZXQgPSAtMTsKLQkJICAgIGdvdGVudC0+ZmxhZ3MgPSAwOwotCQkgICAgZ290ZW50LT51c2VfY291bnQgPSAxOwotCi0JCSAgICBnb3RlbnQtPm5leHQgPSBsb2NhbF9nb3RfZW50cmllc1tFTEY2NF9SX1NZTShyZWwtPnJfaW5mbyldOwotCQkgICAgbG9jYWxfZ290X2VudHJpZXNbRUxGNjRfUl9TWU0ocmVsLT5yX2luZm8pXSA9IGdvdGVudDsKLQotCQkgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT50b3RhbF9nb3RfZW50cmllcysrOwotCQkgICAgYWxwaGFfZWxmX3RkYXRhKGFiZmQpLT5uX2xvY2FsX2dvdF9lbnRyaWVzKys7Ci0JCSAgfQotCQllbHNlCi0JCSAgZ290ZW50LT51c2VfY291bnQgKz0gMTsKLQkgICAgICB9Ci0KLQkgICAgLyogUmVtZW1iZXIgaG93IHRoaXMgbGl0ZXJhbCBpcyB1c2VkIGZyb20gaXRzIExJVFVTRXMuCi0JICAgICAgIFRoaXMgd2lsbCBiZSBpbXBvcnRhbnQgd2hlbiBpdCBjb21lcyB0byBkZWNpZGUgaWYgd2UgY2FuCi0JICAgICAgIGNyZWF0ZSBhIC5wbHQgZW50cnkgZm9yIGEgZnVuY3Rpb24gc3ltYm9sLiAgKi8KLQkgICAgaWYgKHJlbCsxIDwgcmVsZW5kCi0JCSYmIEVMRjY0X1JfVFlQRSAocmVsWzFdLnJfaW5mbykgPT0gUl9BTFBIQV9MSVRVU0UpCi0JICAgICAgewotCQlkbwotCQkgIHsKLQkJICAgICsrcmVsOwotCQkgICAgaWYgKHJlbC0+cl9hZGRlbmQgPj0gMSAmJiByZWwtPnJfYWRkZW5kIDw9IDMpCi0JCSAgICAgIGZsYWdzIHw9IDEgPDwgcmVsLT5yX2FkZGVuZDsKLQkJICB9Ci0JCXdoaWxlIChyZWwrMSA8IHJlbGVuZCAmJgotCQkgICAgICAgRUxGNjRfUl9UWVBFIChyZWxbMV0ucl9pbmZvKSA9PSBSX0FMUEhBX0xJVFVTRSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKiBObyBMSVRVU0VzIC0tIHByZXN1bWFibHkgdGhlIGFkZHJlc3MgaXMgbm90IGJlaW5nCi0JCSAgIGxvYWRlZCBmb3Igbm90aGluZy4gICovCi0JCWZsYWdzID0gQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSOwotCSAgICAgIH0KLQotCSAgICBnb3RlbnQtPmZsYWdzIHw9IGZsYWdzOwotCSAgICBpZiAoaCkKLQkgICAgICB7Ci0JCS8qIE1ha2UgYSBndWVzcyBhcyB0byB3aGV0aGVyIGEgLnBsdCBlbnRyeSB3aWxsIGJlIG5lZWRlZC4gICovCi0JCWlmICgoaC0+ZmxhZ3MgfD0gZmxhZ3MpID09IEFMUEhBX0VMRl9MSU5LX0hBU0hfTFVfRlVOQykKLQkJICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JCWVsc2UKLQkJICBoLT5yb290LmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCSAgICAgIH0KLQkgIH0KLQkgIC8qIEZBTExUSFJVICovCi0KLQljYXNlIFJfQUxQSEFfR1BESVNQOgotCWNhc2UgUl9BTFBIQV9HUFJFTDMyOgotCWNhc2UgUl9BTFBIQV9HUFJFTEhJR0g6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMTE9XOgotCSAgLyogV2UgZG9uJ3QgYWN0dWFsbHkgdXNlIHRoZSAuZ290IGhlcmUsIGJ1dCB0aGUgc2VjdGlvbnMgbXVzdAotCSAgICAgYmUgY3JlYXRlZCBiZWZvcmUgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dAotCSAgICAgc2VjdGlvbnMuICAqLwotCSAgaWYgKCFnb3RfY3JlYXRlZCkKLQkgICAgewotCSAgICAgIGlmICghZWxmNjRfYWxwaGFfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHRoZSBvYmplY3QncyBnb3RvYmogaXMgc2V0IHRvIGl0c2VsZiBzbwotCQkgdGhhdCB3ZSBkZWZhdWx0IHRvIGV2ZXJ5IG9iamVjdCB3aXRoIGl0cyBvd24gLmdvdC4KLQkJIFdlJ2xsIG1lcmdlIC5nb3RzIGxhdGVyIG9uY2Ugd2UndmUgY29sbGVjdGVkIGVhY2gKLQkJIG9iamVjdCdzIGluZm8uICAqLwotCSAgICAgIGFscGhhX2VsZl90ZGF0YShhYmZkKS0+Z290b2JqID0gYWJmZDsKLQotCSAgICAgIGdvdF9jcmVhdGVkID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQUxQSEFfU1JFTDE2OgotCWNhc2UgUl9BTFBIQV9TUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX1NSRUw2NDoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRkFMTFRIUlUgKi8KLQotCWNhc2UgUl9BTFBIQV9SRUZMT05HOgotCWNhc2UgUl9BTFBIQV9SRUZRVUFEOgotCSAgaWYgKHJlbF9zZWNfbmFtZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcmVsX3NlY19uYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCSAgICAgIChhYmZkLCBlbGZfZWxmaGVhZGVyKGFiZmQpLT5lX3Noc3RybmR4LAotCQkJICAgICAgIGVsZl9zZWN0aW9uX2RhdGEoc2VjKS0+cmVsX2hkci5zaF9uYW1lKSk7Ci0JICAgICAgaWYgKHJlbF9zZWNfbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChzdHJuY21wIChyZWxfc2VjX25hbWUsICIucmVsYSIsIDUpID09IDAKLQkJCSAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkgICAgIHJlbF9zZWNfbmFtZSs1KSA9PSAwKTsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc2VjdGlvbiBoZXJlIG5vdyB3aGV0aGVyIHdlIGV2ZW50dWFsbHkKLQkgICAgIHVzZSBpdCBvciBub3Qgc28gdGhhdCBpdCBnZXRzIG1hcHBlZCB0byBhbiBvdXRwdXQgc2VjdGlvbiBieQotCSAgICAgdGhlIGxpbmtlci4gIElmIG5vdCB1c2VkLCB3ZSdsbCBraWxsIGl0IGluCi0JICAgICBzaXplX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCSAgaWYgKHNyZWxvYyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3JlbG9jID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgcmVsX3NlY19uYW1lKTsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBzcmVsb2MgPSBiZmRfbWFrZV9zZWN0aW9uIChkeW5vYmosIHJlbF9zZWNfbmFtZSk7Ci0JCSAgaWYgKHNyZWxvYyA9PSBOVUxMCi0JCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLAotCQkJCQkJIChTRUNfQUxMT0N8U0VDX0xPQUQKLQkJCQkJCSAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJCQkgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICB8IFNFQ19MSU5LRVJfQ1JFQVRFRAotCQkJCQkJICB8IFNFQ19SRUFET05MWSkpCi0JCSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMykpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaCkKLQkgICAgewotCSAgICAgIC8qIFNpbmNlIHdlIGhhdm4ndCBzZWVuIGFsbCBvZiB0aGUgaW5wdXQgc3ltYm9scyB5ZXQsIHdlCi0JCSBkb24ndCBrbm93IHdoZXRoZXIgd2UnbGwgYWN0dWFsbHkgbmVlZCBhIGR5bmFtaWMgcmVsb2NhdGlvbgotCQkgZW50cnkgZm9yIHRoaXMgcmVsb2MuICBTbyBtYWtlIGEgcmVjb3JkIG9mIGl0LiAgT25jZSB3ZQotCQkgZmluZCBvdXQgaWYgdGhpcyB0aGluZyBuZWVkcyBkeW5hbWljIHJlbG9jYXRpb24gd2UnbGwKLQkJIGV4cGFuZCB0aGUgcmVsb2NhdGlvbiBzZWN0aW9ucyBieSB0aGUgYXBwcm9wcmlhdGUgYW1vdW50LiAqLwotCi0JICAgICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqcmVudDsKLQotCSAgICAgIGZvciAocmVudCA9IGgtPnJlbG9jX2VudHJpZXM7IHJlbnQ7IHJlbnQgPSByZW50LT5uZXh0KQotCQlpZiAocmVudC0+cnR5cGUgPT0gcl90eXBlICYmIHJlbnQtPnNyZWwgPT0gc3JlbG9jKQotCQkgIGJyZWFrOwotCi0JICAgICAgaWYgKCFyZW50KQotCQl7Ci0JCSAgcmVudCA9ICgoc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqKQotCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICBzaXplb2YgKHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkpKSk7Ci0JCSAgaWYgKCFyZW50KQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgcmVudC0+c3JlbCA9IHNyZWxvYzsKLQkJICByZW50LT5ydHlwZSA9IHJfdHlwZTsKLQkJICByZW50LT5jb3VudCA9IDE7Ci0KLQkJICByZW50LT5uZXh0ID0gaC0+cmVsb2NfZW50cmllczsKLQkJICBoLT5yZWxvY19lbnRyaWVzID0gcmVudDsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVudC0+Y291bnQrKzsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgLyogSWYgdGhpcyBpcyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBuZWVkIGEgUkVMQVRJVkUgcmVsb2MuICAqLwotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkanVzdCBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgcmVndWxhciBvYmplY3QuICBUaGUgY3VycmVudCBkZWZpbml0aW9uIGlzIGluIHNvbWUgc2VjdGlvbiBvZiB0aGUKLSAgIGR5bmFtaWMgb2JqZWN0LCBidXQgd2UncmUgbm90IGluY2x1ZGluZyB0aG9zZSBzZWN0aW9ucy4gIFdlIGhhdmUgdG8KLSAgIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiB0byBzb21ldGhpbmcgdGhlIHJlc3Qgb2YgdGhlIGxpbmsgY2FuCi0gICB1bmRlcnN0YW5kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICphaDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICBhaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWg7Ci0KLSAgLyogTm93IHRoYXQgd2UndmUgc2VlbiBhbGwgb2YgdGhlIGlucHV0IHN5bWJvbHMsIGZpbmFsaXplIG91ciBkZWNpc2lvbgotICAgICBhYm91dCB3aGV0aGVyIHRoaXMgc3ltYm9sIHNob3VsZCBnZXQgYSAucGx0IGVudHJ5LiAgKi8KLQotICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0gICAgICAmJiBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoaCwgaW5mbykKLSAgICAgICYmICgoaC0+dHlwZSA9PSBTVFRfRlVOQwotCSAgICYmICEoYWgtPmZsYWdzICYgQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9BRERSKSkKLQkgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKLQkgICAgICAmJiBhaC0+ZmxhZ3MgPT0gQUxQSEFfRUxGX0xJTktfSEFTSF9MVV9GVU5DKSkKLSAgICAgIC8qIERvbid0IHByZXZlbnQgb3RoZXJ3aXNlIHZhbGlkIHByb2dyYW1zIGZyb20gbGlua2luZyBieSBhdHRlbXB0aW5nCi0JIHRvIGNyZWF0ZSBhIG5ldyAuZ290IGVudHJ5IHNvbWV3aGVyZS4gIEEgQ29ycmVjdCBTb2x1dGlvbiB3b3VsZCBiZQotCSB0byBhZGQgYSBuZXcgLmdvdCBzZWN0aW9uIHRvIGEgbmV3IG9iamVjdCBmaWxlIGFuZCBsZXQgaXQgYmUgbWVyZ2VkCi0JIHNvbWV3aGVyZSBsYXRlci4gIEJ1dCBmb3Igbm93IGRvbid0IGJvdGhlci4gICovCi0gICAgICAmJiBhaC0+Z290X2VudHJpZXMpCi0gICAgewotICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIGlmICghcyAmJiAhZWxmNjRfYWxwaGFfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGR5bm9iaiwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgZmlyc3QgYml0IG9mIHRoZSAucGx0IGlzIHJlc2VydmVkLiAgKi8KLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSBQTFRfSEVBREVSX1NJWkU7Ci0KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIGEgcmVndWxhciBmaWxlLCBhbmQgd2UgYXJlIG5vdAotCSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gc2V0IHRoZSBzeW1ib2wgdG8gdGhlIGxvY2F0aW9uCi0JIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uIHBvaW50ZXJzIGNvbXBhcmUKLQkgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JewotCSAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gczsKLQkgIGgtPnJvb3QudS5kZWYudmFsdWUgPSBoLT5wbHQub2Zmc2V0OwotCX0KLQotICAgICAgLyogV2UgYWxzbyBuZWVkIGEgSk1QX1NMT1QgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj0gfkVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICBUaGUgQWxwaGEsIHNpbmNlIGl0IHVzZXMgLmdvdCBlbnRyaWVzIGZvciBhbGwKLSAgICAgc3ltYm9scyBldmVuIGluIHJlZ3VsYXIgb2JqZWN0cywgZG9lcyBub3QgbmVlZCB0aGUgaGFja2VyeSBvZiBhCi0gICAgIC5keW5ic3Mgc2VjdGlvbiBhbmQgQ09QWSBkeW5hbWljIHJlbG9jYXRpb25zLiAgKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3ltYm9sIHZlcnNpb25pbmcgY2FuIGNyZWF0ZSBuZXcgc3ltYm9scywgYW5kIG1ha2Ugb3VyIG9sZCBzeW1ib2xzCi0gICBpbmRpcmVjdCB0byB0aGUgbmV3IG9uZXMuICBDb25zb2xpZGF0ZSB0aGUgZ290IGFuZCByZWxvYyBpbmZvcm1hdGlvbgotICAgaW4gdGhlc2Ugc2l0dWF0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9tZXJnZV9pbmRfc3ltYm9scyAoaGksIGR1bW15KQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaGk7Ci0gICAgIFBUUiBkdW1teTsKLXsKLSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmhzOwotCi0gIGlmIChoaS0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaHMgPSBoaTsKLSAgZG8gewotICAgIGhzID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaHMtPnJvb3Qucm9vdC51LmkubGluazsKLSAgfSB3aGlsZSAoaHMtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpOwotCi0gIC8qIE1lcmdlIHRoZSBmbGFncy4gIFdoZWUuICAqLwotCi0gIGhzLT5mbGFncyB8PSBoaS0+ZmxhZ3M7Ci0KLSAgLyogTWVyZ2UgdGhlIC5nb3QgZW50cmllcy4gIENhbm5pYmFsaXplIHRoZSBvbGQgc3ltYm9sJ3MgbGlzdCBpbgotICAgICBkb2luZyBzbywgc2luY2Ugd2UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlLiAgKi8KLQotICBpZiAoaHMtPmdvdF9lbnRyaWVzID09IE5VTEwpCi0gICAgaHMtPmdvdF9lbnRyaWVzID0gaGktPmdvdF9lbnRyaWVzOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdpLCAqZ3MsICpnaW4sICpnc2g7Ci0KLSAgICAgIGdzaCA9IGhzLT5nb3RfZW50cmllczsKLSAgICAgIGZvciAoZ2kgPSBoaS0+Z290X2VudHJpZXM7IGdpIDsgZ2kgPSBnaW4pCi0JewotCSAgZ2luID0gZ2ktPm5leHQ7Ci0JICBmb3IgKGdzID0gZ3NoOyBncyA7IGdzID0gZ3MtPm5leHQpCi0JICAgIGlmIChnaS0+Z290b2JqID09IGdzLT5nb3RvYmogJiYgZ2ktPmFkZGVuZCA9PSBncy0+YWRkZW5kKQotCSAgICAgIGdvdG8gZ290X2ZvdW5kOwotCSAgZ2ktPm5leHQgPSBocy0+Z290X2VudHJpZXM7Ci0JICBocy0+Z290X2VudHJpZXMgPSBnaTsKLQlnb3RfZm91bmQ6OwotCX0KLSAgICB9Ci0gIGhpLT5nb3RfZW50cmllcyA9IE5VTEw7Ci0KLSAgLyogQW5kIHNpbWlsYXIgZm9yIHRoZSByZWxvYyBlbnRyaWVzLiAgKi8KLQotICBpZiAoaHMtPnJlbG9jX2VudHJpZXMgPT0gTlVMTCkKLSAgICBocy0+cmVsb2NfZW50cmllcyA9IGhpLT5yZWxvY19lbnRyaWVzOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9yZWxvY19lbnRyeSAqcmksICpycywgKnJpbiwgKnJzaDsKLQotICAgICAgcnNoID0gaHMtPnJlbG9jX2VudHJpZXM7Ci0gICAgICBmb3IgKHJpID0gaGktPnJlbG9jX2VudHJpZXM7IHJpIDsgcmkgPSByaW4pCi0JewotCSAgcmluID0gcmktPm5leHQ7Ci0JICBmb3IgKHJzID0gcnNoOyBycyA7IHJzID0gcnMtPm5leHQpCi0JICAgIGlmIChyaS0+cnR5cGUgPT0gcnMtPnJ0eXBlKQotCSAgICAgIHsKLQkJcnMtPmNvdW50ICs9IHJpLT5jb3VudDsKLQkJZ290byBmb3VuZF9yZWxvYzsKLQkgICAgICB9Ci0JICByaS0+bmV4dCA9IGhzLT5yZWxvY19lbnRyaWVzOwotCSAgaHMtPnJlbG9jX2VudHJpZXMgPSByaTsKLQlmb3VuZF9yZWxvYzo7Ci0JfQotICAgIH0KLSAgaGktPnJlbG9jX2VudHJpZXMgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJcyBpdCBwb3NzaWJsZSB0byBtZXJnZSB0d28gb2JqZWN0IGZpbGUncyAuZ290IHRhYmxlcz8gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9jYW5fbWVyZ2VfZ290cyAoYSwgYikKLSAgICAgYmZkICphLCAqYjsKLXsKLSAgaW50IHRvdGFsID0gYWxwaGFfZWxmX3RkYXRhIChhKS0+dG90YWxfZ290X2VudHJpZXM7Ci0gIGJmZCAqYnN1YjsKLQotICAvKiBUcml2aWFsIHF1aWNrIGZhbGxvdXQgdGVzdC4gICovCi0gIGlmICh0b3RhbCArIGFscGhhX2VsZl90ZGF0YSAoYiktPnRvdGFsX2dvdF9lbnRyaWVzIDw9IE1BWF9HT1RfRU5UUklFUykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBCeSB0aGVpciBuYXR1cmUsIGxvY2FsIC5nb3QgZW50cmllcyBjYW5ub3QgYmUgbWVyZ2VkLiAgKi8KLSAgaWYgKCh0b3RhbCArPSBhbHBoYV9lbGZfdGRhdGEgKGIpLT5uX2xvY2FsX2dvdF9lbnRyaWVzKSA+IE1BWF9HT1RfRU5UUklFUykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmFpbGluZyB0aGUgY29tbW9uIHRyaXZpYWwgY29tcGFyaXNvbiwgd2UgbXVzdCBlZmZlY3RpdmVseQotICAgICBwZXJmb3JtIHRoZSBtZXJnZS4gIE5vdCBhY3R1YWxseSBwZXJmb3JtaW5nIHRoZSBtZXJnZSBtZWFucyB0aGF0Ci0gICAgIHdlIGRvbid0IGhhdmUgdG8gc3RvcmUgdW5kbyBpbmZvcm1hdGlvbiBpbiBjYXNlIHdlIGZhaWwuICAqLwotICBmb3IgKGJzdWIgPSBiOyBic3ViIDsgYnN1YiA9IGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmluX2dvdF9saW5rX25leHQpCi0gICAgewotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKipoYXNoZXMgPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyAoYnN1Yik7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGJzdWIpLT5zeW10YWJfaGRyOwotICAgICAgaW50IGksIG47Ci0KLSAgICAgIG4gPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc3ltdGFiX2hkci0+c2hfZW50c2l6ZSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotCXsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICphZSwgKmJlOwotCSAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIGggPSBoYXNoZXNbaV07Ci0JICB3aGlsZSAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSAgICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQkgICAgaCA9IChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKWgtPnJvb3Qucm9vdC51LmkubGluazsKLQotCSAgZm9yIChiZSA9IGgtPmdvdF9lbnRyaWVzOyBiZSA7IGJlID0gYmUtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoYmUtPnVzZV9jb3VudCA9PSAwKQotCSAgICAgICAgY29udGludWU7Ci0JICAgICAgaWYgKGJlLT5nb3RvYmogIT0gYikKLQkgICAgICAgIGNvbnRpbnVlOwotCi0JICAgICAgZm9yIChhZSA9IGgtPmdvdF9lbnRyaWVzOyBhZSA7IGFlID0gYWUtPm5leHQpCi0JICAgICAgICBpZiAoYWUtPmdvdG9iaiA9PSBhICYmIGFlLT5hZGRlbmQgPT0gYmUtPmFkZGVuZCkKLQkJICBnb3RvIGdsb2JhbF9mb3VuZDsKLQotCSAgICAgIGlmICgrK3RvdGFsID4gTUFYX0dPVF9FTlRSSUVTKQotCSAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBnbG9iYWxfZm91bmQ6OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWN0dWFsbHkgbWVyZ2UgdHdvIC5nb3QgdGFibGVzLiAgKi8KLQotc3RhdGljIHZvaWQKLWVsZjY0X2FscGhhX21lcmdlX2dvdHMgKGEsIGIpCi0gICAgIGJmZCAqYSwgKmI7Ci17Ci0gIGludCB0b3RhbCA9IGFscGhhX2VsZl90ZGF0YSAoYSktPnRvdGFsX2dvdF9lbnRyaWVzOwotICBiZmQgKmJzdWI7Ci0KLSAgLyogUmVtZW1iZXIgbG9jYWwgZXhwYW5zaW9uLiAgKi8KLSAgewotICAgIGludCBlID0gYWxwaGFfZWxmX3RkYXRhIChiKS0+bl9sb2NhbF9nb3RfZW50cmllczsKLSAgICB0b3RhbCArPSBlOwotICAgIGFscGhhX2VsZl90ZGF0YSAoYSktPm5fbG9jYWxfZ290X2VudHJpZXMgKz0gZTsKLSAgfQotCi0gIGZvciAoYnN1YiA9IGI7IGJzdWIgOyBic3ViID0gYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+aW5fZ290X2xpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqKmxvY2FsX2dvdF9lbnRyaWVzOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKipoYXNoZXM7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgICAgIGludCBpLCBuOwotCi0gICAgICAvKiBMZXQgdGhlIGxvY2FsIC5nb3QgZW50cmllcyBrbm93IHRoZXkgYXJlIHBhcnQgb2YgYSBuZXcgc3Vic2VnbWVudC4gICovCi0gICAgICBsb2NhbF9nb3RfZW50cmllcyA9IGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmxvY2FsX2dvdF9lbnRyaWVzOwotICAgICAgaWYgKGxvY2FsX2dvdF9lbnRyaWVzKQotICAgICAgICB7Ci0JICBuID0gZWxmX3RkYXRhIChic3ViKS0+c3ltdGFiX2hkci5zaF9pbmZvOwotCSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKLQkgICAgewotCSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICplbnQ7Ci0JICAgICAgZm9yIChlbnQgPSBsb2NhbF9nb3RfZW50cmllc1tpXTsgZW50OyBlbnQgPSBlbnQtPm5leHQpCi0JICAgICAgICBlbnQtPmdvdG9iaiA9IGE7Ci0JICAgIH0KLSAgICAgICAgfQotCi0gICAgICAvKiBNZXJnZSB0aGUgZ2xvYmFsIC5nb3QgZW50cmllcy4gICovCi0gICAgICBoYXNoZXMgPSBhbHBoYV9lbGZfc3ltX2hhc2hlcyAoYnN1Yik7Ci0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYnN1YiktPnN5bXRhYl9oZHI7Ci0KLSAgICAgIG4gPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc3ltdGFiX2hkci0+c2hfZW50c2l6ZSAtIHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQotICAgICAgICB7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqYWUsICpiZSwgKipwYmUsICoqc3RhcnQ7Ci0JICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgaCA9IGhhc2hlc1tpXTsKLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCSAgICBoID0gKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopaC0+cm9vdC5yb290LnUuaS5saW5rOwotCi0JICBzdGFydCA9ICZoLT5nb3RfZW50cmllczsKLQkgIGZvciAocGJlID0gc3RhcnQsIGJlID0gKnN0YXJ0OyBiZSA7IHBiZSA9ICZiZS0+bmV4dCwgYmUgPSBiZS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChiZS0+dXNlX2NvdW50ID09IDApCi0JICAgICAgICB7Ci0JCSAgKnBiZSA9IGJlLT5uZXh0OwotCQkgIGNvbnRpbnVlOwotCSAgICAgICAgfQotCSAgICAgIGlmIChiZS0+Z290b2JqICE9IGIpCi0JICAgICAgICBjb250aW51ZTsKLQotCSAgICAgIGZvciAoYWUgPSAqc3RhcnQ7IGFlIDsgYWUgPSBhZS0+bmV4dCkKLQkgICAgICAgIGlmIChhZS0+Z290b2JqID09IGEgJiYgYWUtPmFkZGVuZCA9PSBiZS0+YWRkZW5kKQotCQkgIHsKLQkJICAgIGFlLT5mbGFncyB8PSBiZS0+ZmxhZ3M7Ci0JCSAgICBhZS0+dXNlX2NvdW50ICs9IGJlLT51c2VfY291bnQ7Ci0JCSAgICAqcGJlID0gYmUtPm5leHQ7Ci0JCSAgICBnb3RvIGdsb2JhbF9mb3VuZDsKLQkJICB9Ci0JICAgICAgYmUtPmdvdG9iaiA9IGE7Ci0JICAgICAgdG90YWwgKz0gMTsKLQotCSAgICBnbG9iYWxfZm91bmQ6OwotCSAgICB9Ci0gICAgICAgIH0KLQotICAgICAgYWxwaGFfZWxmX3RkYXRhIChic3ViKS0+Z290b2JqID0gYTsKLSAgICB9Ci0gIGFscGhhX2VsZl90ZGF0YSAoYSktPnRvdGFsX2dvdF9lbnRyaWVzID0gdG90YWw7Ci0KLSAgLyogTWVyZ2UgdGhlIHR3byBpbl9nb3QgY2hhaW5zLiAgKi8KLSAgewotICAgIGJmZCAqbmV4dDsKLQotICAgIGJzdWIgPSBhOwotICAgIHdoaWxlICgobmV4dCA9IGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmluX2dvdF9saW5rX25leHQpICE9IE5VTEwpCi0gICAgICBic3ViID0gbmV4dDsKLQotICAgIGFscGhhX2VsZl90ZGF0YSAoYnN1YiktPmluX2dvdF9saW5rX25leHQgPSBiOwotICB9Ci19Ci0KLS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0cyBmb3IgdGhlIGdvdCBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NhbGNfZ290X29mZnNldHNfZm9yX3N5bWJvbCAoaCwgYXJnKQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGFyZzsKLXsKLSAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLQotICBmb3IgKGdvdGVudCA9IGgtPmdvdF9lbnRyaWVzOyBnb3RlbnQ7IGdvdGVudCA9IGdvdGVudC0+bmV4dCkKLSAgICBpZiAoZ290ZW50LT51c2VfY291bnQgPiAwKQotICAgICAgewotCWJmZF9zaXplX3R5cGUgKnBsZ2UKLQkgID0gJmFscGhhX2VsZl90ZGF0YSAoZ290ZW50LT5nb3RvYmopLT5nb3QtPl9yYXdfc2l6ZTsKLQotCWdvdGVudC0+Z290X29mZnNldCA9ICpwbGdlOwotCSpwbGdlICs9IDg7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzIChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICppLCAqZ290X2xpc3QgPSBhbHBoYV9lbGZfaGFzaF90YWJsZShpbmZvKS0+Z290X2xpc3Q7Ci0KLSAgLyogRmlyc3QsIHplcm8gb3V0IHRoZSAuZ290IHNpemVzLCBhcyB3ZSBtYXkgYmUgcmVjYWxjdWxhdGluZyB0aGUKLSAgICAgLmdvdCBhZnRlciBvcHRpbWl6aW5nIGl0LiAgKi8KLSAgZm9yIChpID0gZ290X2xpc3Q7IGkgOyBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotICAgIGFscGhhX2VsZl90ZGF0YShpKS0+Z290LT5fcmF3X3NpemUgPSAwOwotCi0gIC8qIE5leHQsIGZpbGwgaW4gdGhlIG9mZnNldHMgZm9yIGFsbCB0aGUgZ2xvYmFsIGVudHJpZXMuICAqLwotICBhbHBoYV9lbGZfbGlua19oYXNoX3RyYXZlcnNlIChhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJZWxmNjRfYWxwaGFfY2FsY19nb3Rfb2Zmc2V0c19mb3Jfc3ltYm9sLAotCQkJCU5VTEwpOwotCi0gIC8qIEZpbmFsbHksIGZpbGwgaW4gdGhlIG9mZnNldHMgZm9yIHRoZSBsb2NhbCBlbnRyaWVzLiAgKi8KLSAgZm9yIChpID0gZ290X2xpc3Q7IGkgOyBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgZ290X29mZnNldCA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290LT5fcmF3X3NpemU7Ci0gICAgICBiZmQgKmo7Ci0KLSAgICAgIGZvciAoaiA9IGk7IGogOyBqID0gYWxwaGFfZWxmX3RkYXRhKGopLT5pbl9nb3RfbGlua19uZXh0KQotCXsKLQkgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICoqbG9jYWxfZ290X2VudHJpZXMsICpnb3RlbnQ7Ci0JICBpbnQgaywgbjsKLQotCSAgbG9jYWxfZ290X2VudHJpZXMgPSBhbHBoYV9lbGZfdGRhdGEoaiktPmxvY2FsX2dvdF9lbnRyaWVzOwotCSAgaWYgKCFsb2NhbF9nb3RfZW50cmllcykKLQkgICAgY29udGludWU7Ci0KLQkgIGZvciAoayA9IDAsIG4gPSBlbGZfdGRhdGEoaiktPnN5bXRhYl9oZHIuc2hfaW5mbzsgayA8IG47ICsraykKLQkgICAgZm9yIChnb3RlbnQgPSBsb2NhbF9nb3RfZW50cmllc1trXTsgZ290ZW50OyBnb3RlbnQgPSBnb3RlbnQtPm5leHQpCi0JICAgICAgaWYgKGdvdGVudC0+dXNlX2NvdW50ID4gMCkKLQkgICAgICAgIHsKLQkJICBnb3RlbnQtPmdvdF9vZmZzZXQgPSBnb3Rfb2Zmc2V0OwotCQkgIGdvdF9vZmZzZXQgKz0gODsKLQkgICAgICAgIH0KLQl9Ci0KLSAgICAgIGFscGhhX2VsZl90ZGF0YShpKS0+Z290LT5fcmF3X3NpemUgPSBnb3Rfb2Zmc2V0OwotICAgICAgYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3QtPl9jb29rZWRfc2l6ZSA9IGdvdF9vZmZzZXQ7Ci0gICAgfQotfQotCi0vKiBDb25zdHJ1Y3RzIHRoZSBnb3RzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmksICpnb3RfbGlzdCwgKmN1cl9nb3Rfb2JqOwotICBpbnQgc29tZXRoaW5nX2NoYW5nZWQgPSAwOwotCi0gIGdvdF9saXN0ID0gYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbGlzdDsKLQotICAvKiBPbiB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLCBwcmV0ZW5kIHdlIGhhdmUgYW4gZXhpc3RpbmcgZ290IGxpc3QKLSAgICAgY29uc2lzdGluZyBvZiBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgaWYgKGdvdF9saXN0ID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gaW5mby0+aW5wdXRfYmZkczsgaSA7IGkgPSBpLT5saW5rX25leHQpCi0JewotCSAgYmZkICp0aGlzX2dvdCA9IGFscGhhX2VsZl90ZGF0YSAoaSktPmdvdG9iajsKLQkgIGlmICh0aGlzX2dvdCA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogV2UgYXJlIGFzc3VtaW5nIG5vIG1lcmdpbmcgaGFzIHlldCBvY3VycmVkLiAgKi8KLQkgIEJGRF9BU1NFUlQgKHRoaXNfZ290ID09IGkpOwotCi0gICAgICAgICAgaWYgKGFscGhhX2VsZl90ZGF0YSAodGhpc19nb3QpLT50b3RhbF9nb3RfZW50cmllcyA+IE1BWF9HT1RfRU5UUklFUykKLQkgICAgewotCSAgICAgIC8qIFlpa2VzISBBIHNpbmdsZSBvYmplY3QgZmlsZSBoYXMgdG9vIG1hbnkgZW50cmllcy4gICovCi0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgICAgICAoXygiJXM6IC5nb3Qgc3Vic2VnbWVudCBleGNlZWRzIDY0SyAoc2l6ZSAlZCkiKSwKLQkgICAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpKSwKLQkgICAgICAgICBhbHBoYV9lbGZfdGRhdGEgKHRoaXNfZ290KS0+dG90YWxfZ290X2VudHJpZXMgKiA4KTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGdvdF9saXN0ID09IE5VTEwpCi0JICAgIGdvdF9saXN0ID0gdGhpc19nb3Q7Ci0JICBlbHNlCi0JICAgIGFscGhhX2VsZl90ZGF0YShjdXJfZ290X29iaiktPmdvdF9saW5rX25leHQgPSB0aGlzX2dvdDsKLQkgIGN1cl9nb3Rfb2JqID0gdGhpc19nb3Q7Ci0JfQotCi0gICAgICAvKiBTdHJhbmdlIGRlZ2VuZXJhdGUgY2FzZSBvZiBubyBnb3QgcmVmZXJlbmNlcy4gICovCi0gICAgICBpZiAoZ290X2xpc3QgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbGlzdCA9IGdvdF9saXN0OwotCi0gICAgICAvKiBGb3JjZSBnb3Qgb2Zmc2V0cyB0byBiZSByZWNhbGN1bGF0ZWQuICAqLwotICAgICAgc29tZXRoaW5nX2NoYW5nZWQgPSAxOwotICAgIH0KLQotICBjdXJfZ290X29iaiA9IGdvdF9saXN0OwotICBpID0gYWxwaGFfZWxmX3RkYXRhKGN1cl9nb3Rfb2JqKS0+Z290X2xpbmtfbmV4dDsKLSAgd2hpbGUgKGkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZWxmNjRfYWxwaGFfY2FuX21lcmdlX2dvdHMgKGN1cl9nb3Rfb2JqLCBpKSkKLQl7Ci0JICBlbGY2NF9hbHBoYV9tZXJnZV9nb3RzIChjdXJfZ290X29iaiwgaSk7Ci0JICBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0OwotCSAgYWxwaGFfZWxmX3RkYXRhKGN1cl9nb3Rfb2JqKS0+Z290X2xpbmtfbmV4dCA9IGk7Ci0JICBzb21ldGhpbmdfY2hhbmdlZCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1cl9nb3Rfb2JqID0gaTsKLQkgIGkgPSBhbHBoYV9lbGZfdGRhdGEoaSktPmdvdF9saW5rX25leHQ7Ci0JfQotICAgIH0KLQotICAvKiBPbmNlIHRoZSBnb3RzIGhhdmUgYmVlbiBtZXJnZWQsIGZpbGwgaW4gdGhlIGdvdCBvZmZzZXRzIGZvcgotICAgICBldmVyeXRoaW5nIHRoZXJlaW4uICAqLwotICBpZiAoMSB8fCBzb21ldGhpbmdfY2hhbmdlZCkKLSAgICBlbGY2NF9hbHBoYV9jYWxjX2dvdF9vZmZzZXRzIChpbmZvKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2Fsd2F5c19zaXplX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCwgdGFrZSBjYXJlIG9mIHRoZSBpbmRpcmVjdCBzeW1ib2xzIGNyZWF0ZWQgYnkgdmVyc2lvbmluZy4gICovCi0gIGFscGhhX2VsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQllbGY2NF9hbHBoYV9tZXJnZV9pbmRfc3ltYm9scywKLQkJCQlOVUxMKTsKLQotICBpZiAoIWVsZjY0X2FscGhhX3NpemVfZ290X3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGFsbCBvZiB0aGUgLmdvdCBzdWJzZWN0aW9ucy4gICovCi0gIGkgPSBhbHBoYV9lbGZfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9saXN0OwotICBmb3IgKCA7IGkgOyBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3Q7Ci0gICAgICBpZiAocy0+X3Jhd19zaXplID4gMCkKLQl7Ci0JICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChpLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXb3JrIG91dCB0aGUgc2l6ZXMgb2YgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2NhbGNfZHlucmVsX3NpemVzIChoLCBpbmZvKQotICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIC8qIElmIHRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYXMgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QKLSAgICAgZmlsZSwgYW5kIHRoZXJlIHdhcyBubyBkZWZpbml0aW9uIGluIGFueSBkeW5hbWljIG9iamVjdCwgdGhlbiB0aGUKLSAgICAgbGlua2VyIHdpbGwgaGF2ZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHRoZSBzeW1ib2wgaW4gYSBjb21tb24KLSAgICAgc2VjdGlvbiBidXQgdGhlIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIgZmxhZyB3aWxsIG5vdCBoYXZlIGJlZW4KLSAgICAgc2V0LiAgVGhpcyBpcyBkb25lIGZvciBkeW5hbWljIHN5bWJvbHMgaW4KLSAgICAgZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCBidXQgdGhpcyBpcyBub3QgZG9uZSBmb3Igbm9uLWR5bmFtaWMKLSAgICAgc3ltYm9scywgc29tZWhvdy4gICovCi0gIGlmICgoKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncwotICAgICAgICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIKLQkgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCSAgfCBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSkKLSAgICAgICA9PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKQotICAgICAgJiYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgIShoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykpCi0gICAgewotICAgICAgaC0+cm9vdC5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgZHluYW1pYywgd2UnbGwgbmVlZCBhbGwgdGhlIHJlbG9jYXRpb25zIGluIHRoZWlyCi0gICAgIG5hdHVyYWwgZm9ybS4gIElmIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCBhbmQgaXQgaGFzIGJlZW4gZm9yY2VkCi0gICAgIGxvY2FsLCB3ZSdsbCBuZWVkIHRoZSBzYW1lIG51bWJlciBvZiBSRUxBVElWRSByZWxvY2F0aW9ucy4gICovCi0KLSAgaWYgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgaW5mbykgfHwgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfcmVsb2NfZW50cnkgKnJlbGVudDsKLSAgICAgIGJmZCAqZHlub2JqOwotICAgICAgc3RydWN0IGFscGhhX2VsZl9nb3RfZW50cnkgKmdvdGVudDsKLSAgICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgICBhc2VjdGlvbiAqc3JlbDsKLQotICAgICAgZm9yIChyZWxlbnQgPSBoLT5yZWxvY19lbnRyaWVzOyByZWxlbnQ7IHJlbGVudCA9IHJlbGVudC0+bmV4dCkKLQlpZiAocmVsZW50LT5ydHlwZSA9PSBSX0FMUEhBX1JFRkxPTkcKLQkgICAgfHwgcmVsZW50LT5ydHlwZSA9PSBSX0FMUEhBX1JFRlFVQUQpCi0JICB7Ci0JICAgIHJlbGVudC0+c3JlbC0+X3Jhd19zaXplICs9Ci0JICAgICAgc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpICogcmVsZW50LT5jb3VudDsKLQkgIH0KLQotICAgICAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgICAgIGNvdW50ID0gMDsKLQotICAgICAgZm9yIChnb3RlbnQgPSBoLT5nb3RfZW50cmllczsgZ290ZW50IDsgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCWNvdW50Kys7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSB1c2luZyBhIC5wbHQgZW50cnksIHN1YnRyYWN0IG9uZSwgYXMgdGhlIGZpcnN0Ci0JIHJlZmVyZW5jZSB1c2VzIGEgLnJlbGEucGx0IGVudHJ5IGluc3RlYWQuICAqLwotICAgICAgaWYgKGgtPnJvb3QucGx0Lm9mZnNldCAhPSBNSU5VU19PTkUpCi0JY291bnQtLTsKLQotICAgICAgaWYgKGNvdW50ID4gMCkKLQl7Ci0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpICogY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBzaXplcyBvZiB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqczsKLSAgYm9vbGVhbiByZWx0ZXh0OwotICBib29sZWFuIHJlbHBsdDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZShpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUKGR5bm9iaiAhPSBOVUxMKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogU2V0IHRoZSBjb250ZW50cyBvZiB0aGUgLmludGVycCBzZWN0aW9uIHRvIHRoZSBpbnRlcnByZXRlci4gICovCi0gICAgICBpZiAoIWluZm8tPnNoYXJlZCkKLQl7Ci0JICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLQkgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0JICBzLT5fcmF3X3NpemUgPSBzaXplb2YgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JICBzLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSOwotCX0KLQotICAgICAgLyogTm93IHRoYXQgd2UndmUgc2VlbiBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCB3ZSBjYW4gZGVjaWRlIHdoaWNoCi0JIHN5bWJvbHMgbmVlZCBkeW5hbWljIHJlbG9jYXRpb24gZW50cmllcyBhbmQgd2hpY2ggZG9uJ3QuICBXZSd2ZQotCSBjb2xsZWN0ZWQgaW5mb3JtYXRpb24gaW4gY2hlY2tfcmVsb2NzIHRoYXQgd2UgY2FuIG5vdyBhcHBseSB0bwotCSBzaXplIHRoZSBkeW5hbWljIHJlbG9jYXRpb24gc2VjdGlvbnMuICAqLwotICAgICAgYWxwaGFfZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoYWxwaGFfZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICBlbGY2NF9hbHBoYV9jYWxjX2R5bnJlbF9zaXplcywKLQkJCQkgICAgaW5mbyk7Ci0KLSAgICAgIC8qIFdoZW4gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcywgZWFjaCBsb2NhbCAuZ290IGVudHJ5IG5lZWRzIGEKLQkgUkVMQVRJVkUgcmVsb2MuICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQl7Ci0JICBiZmQgKmk7Ci0JICBhc2VjdGlvbiAqc3JlbDsKLQkgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0KLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0JICBmb3IgKGkgPSBhbHBoYV9lbGZfaGFzaF90YWJsZShpbmZvKS0+Z290X2xpc3QsIGNvdW50ID0gMDsKLQkgICAgICAgaSAhPSBOVUxMOwotCSAgICAgICBpID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3RfbGlua19uZXh0KQotCSAgICBjb3VudCArPSBhbHBoYV9lbGZfdGRhdGEoaSktPm5fbG9jYWxfZ290X2VudHJpZXM7Ci0KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBjb3VudCAqIHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQl9Ci0gICAgfQotICAvKiBlbHNlIHdlJ3JlIG5vdCBkeW5hbWljIGFuZCBieSBkZWZpbml0aW9uIHdlIGRvbid0IG5lZWQgc3VjaCB0aGluZ3MuICAqLwotCi0gIC8qIFRoZSBjaGVja19yZWxvY3MgYW5kIGFkanVzdF9keW5hbWljX3N5bWJvbCBlbnRyeSBwb2ludHMgaGF2ZQotICAgICBkZXRlcm1pbmVkIHRoZSBzaXplcyBvZiB0aGUgdmFyaW91cyBkeW5hbWljIHNlY3Rpb25zLiAgQWxsb2NhdGUKLSAgICAgbWVtb3J5IGZvciB0aGVtLiAgKi8KLSAgcmVsdGV4dCA9IGZhbHNlOwotICByZWxwbHQgPSBmYWxzZTsKLSAgZm9yIChzID0gZHlub2JqLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYm9vbGVhbiBzdHJpcDsKLQotICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlIG91dHB1dCBmaWxlLgotCSBUaGlzIGlzIHRvIGhhbmRsZSAucmVsYS5ic3MgYW5kIC5yZWxhLnBsdC4gIFdlIG11c3QgY3JlYXRlIGl0Ci0JIGluIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZCBiZWZvcmUKLQkgdGhlIGxpbmtlciBtYXBzIGlucHV0IHNlY3Rpb25zIHRvIG91dHB1dCBzZWN0aW9ucy4gIFRoZQotCSBsaW5rZXIgZG9lcyB0aGF0IGJlZm9yZSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQKLQkgaXQgaXMgdGhhdCBmdW5jdGlvbiB3aGljaCBkZWNpZGVzIHdoZXRoZXIgYW55dGhpbmcgbmVlZHMgdG8KLQkgZ28gaW50byB0aGVzZSBzZWN0aW9ucy4gICovCi0KLSAgICAgIHN0cmlwID0gZmFsc2U7Ci0KLSAgICAgIGlmIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwKQotCXsKLQkgIHN0cmlwID0gKHMtPl9yYXdfc2l6ZSA9PSAwKTsKLQotCSAgaWYgKCFzdHJpcCkKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkJICAmJiAodGFyZ2V0LT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJcmVsdGV4dCA9IHRydWU7Ci0KLQkgICAgICBpZiAoc3RyY21wKG5hbWUsICIucmVsYS5wbHQiKSA9PSAwKQotCQlyZWxwbHQgPSB0cnVlOwotCi0JICAgICAgLyogV2UgdXNlIHRoZSByZWxvY19jb3VudCBmaWVsZCBhcyBhIGNvdW50ZXIgaWYgd2UgbmVlZAotCQkgdG8gY29weSByZWxvY3MgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCSAgICAgIHMtPnJlbG9jX2NvdW50ID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5wbHQiKSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgZHluYW1pYyBzZWN0aW9ucywgc28gZG9uJ3QgYWxsb2NhdGUgc3BhY2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoc3RyaXApCi0JX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLQkgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF96YWxsb2MoZHlub2JqLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgotICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24uICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2gKLSAgICAgbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZSBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0gICAgIFRoYXQgbWVhbnMgd2UgbXVzdCBpbmNyZW1lbnQgdGhlIGR5bmFtaWMgc3ltYm9sIGluZGV4IG9mIGV2ZXJ5Ci0gICAgIG90aGVyIGR5bmFtaWMgc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnNoYXJlZCkKLSAgICB7Ci0gICAgICBsb25nIGNbMl0sIGk7Ci0gICAgICBhc2VjdGlvbiAqcDsKLQotICAgICAgY1swXSA9IDA7Ci0gICAgICBjWzFdID0gYmZkX2NvdW50X3NlY3Rpb25zIChvdXRwdXRfYmZkKTsKLQotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCArPSBjWzFdOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUoaW5mbyksCi0JCQkgICAgICBlbGY2NF9hbHBoYV9hZGp1c3RfZHluaW5keCwKLQkJCSAgICAgIChQVFIpIGMpOwotCi0gICAgICBmb3IgKGkgPSAxLCBwID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgcCAhPSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0LCBpKyspCi0JewotCSAgZWxmX3NlY3Rpb25fZGF0YSAocCktPmR5bmluZHggPSBpOwotCSAgLyogVGhlc2Ugc3ltYm9scyB3aWxsIGhhdmUgbm8gbmFtZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KLQkgICAgIGZpZGRsZSB3aXRoIGR5bnN0cl9pbmRleC4gICovCi0JfQotICAgIH0KLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gdGhlCi0JIHZhbHVlcyBsYXRlciwgaW4gZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMsIGJ1dCB3ZQotCSBtdXN0IGFkZCB0aGUgZW50cmllcyBub3cgc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3Qgc2l6ZSBmb3IKLQkgdGhlIC5keW5hbWljIHNlY3Rpb24uICBUaGUgRFRfREVCVUcgZW50cnkgaXMgZmlsbGVkIGluIGJ5IHRoZQotCSBkeW5hbWljIGxpbmtlciBhbmQgdXNlZCBieSB0aGUgZGVidWdnZXIuICAqLwotICAgICAgaWYgKCFpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCFiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0RFQlVHLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHJlbHBsdCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQSwgMCkKLQkgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9SRUxBU1osIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQUVOVCwKLQkJCQkJICAgIHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocmVsdGV4dCkKLQl7Ci0JICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1RFWFRSRUwsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5jcmVtZW50IHRoZSBpbmRleCBvZiBhIGR5bmFtaWMgc3ltYm9sIGJ5IGEgZ2l2ZW4gYW1vdW50LiAgQ2FsbGVkCi0gICB2aWEgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9hZGp1c3RfZHluaW5keCAoaCwgY3BhcmcpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgY3Bhcmc7Ci17Ci0gIGxvbmcgKmNwID0gKGxvbmcgKiljcGFyZzsKLQotICBpZiAoaC0+ZHluaW5keCA+PSBjcFswXSkKLSAgICBoLT5keW5pbmR4ICs9IGNwWzFdOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWxvY2F0ZSBhbiBBbHBoYSBFTEYgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGY2NF9hbHBoYV9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkgICAgICBjb250ZW50cywgcmVsb2NzLCBsb2NhbF9zeW1zLCBsb2NhbF9zZWN0aW9ucykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmxvY2FsX3N5bXM7Ci0gICAgIGFzZWN0aW9uICoqbG9jYWxfc2VjdGlvbnM7Ci17Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW10YWJfaGRyOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsZW5kOwotICBhc2VjdGlvbiAqc2VjLCAqc2dvdCwgKnNyZWwsICpzcmVsZ290OwotICBiZmQgKmR5bm9iaiwgKmdvdG9iajsKLSAgYmZkX3ZtYSBncDsKLQotICBzcmVsZ290ID0gc3JlbCA9IE5VTEw7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgaWYgKGR5bm9iaikKLSAgICB7Ci0gICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotICAgIH0KLQotICAvKiBGaW5kIHRoZSBncCB2YWx1ZSBmb3IgdGhpcyBpbnB1dCBiZmQuICAqLwotICBzZ290ID0gTlVMTDsKLSAgZ3AgPSAwOwotICBnb3RvYmogPSBhbHBoYV9lbGZfdGRhdGEgKGlucHV0X2JmZCktPmdvdG9iajsKLSAgaWYgKGdvdG9iaikKLSAgICB7Ci0gICAgICBzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChnb3RvYmopLT5nb3Q7Ci0gICAgICBncCA9IF9iZmRfZ2V0X2dwX3ZhbHVlIChnb3RvYmopOwotICAgICAgaWYgKGdwID09IDApCi0JewotCSAgZ3AgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkrIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJKyAweDgwMDApOwotCSAgX2JmZF9zZXRfZ3BfdmFsdWUgKGdvdG9iaiwgZ3ApOwotCX0KLSAgICB9Ci0KLSAgcmVsID0gcmVsb2NzOwotICByZWxlbmQgPSByZWxvY3MgKyBpbnB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbCA8IHJlbGVuZDsgcmVsKyspCi0gICAgewotICAgICAgaW50IHJfdHlwZTsKLSAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keDsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgRWxmX0ludGVybmFsX1N5bSAqc3ltOwotICAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGNjRfUl9UWVBFKHJlbC0+cl9pbmZvKTsKLSAgICAgIGlmIChyX3R5cGUgPCAwIHx8IHJfdHlwZSA+PSAoaW50KSBSX0FMUEhBX21heCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBob3d0byA9IGVsZjY0X2FscGhhX2hvd3RvX3RhYmxlICsgcl90eXBlOwotCi0gICAgICByX3N5bW5keCA9IEVMRjY0X1JfU1lNKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCi0JICAvKiBUaGUgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBHUERJU1AgYW5kIExJVFVTRSBpcyAKLQkgICAgIGltbWF0ZXJpYWwuICBPbmx5IHRoZSBhZGRlbmQgaXMgc2lnbmlmaWNhbnQuICAqLwotCSAgaWYgKHJfdHlwZSA9PSBSX0FMUEhBX0dQRElTUCB8fCByX3R5cGUgPT0gUl9BTFBIQV9MSVRVU0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCSAgICB7Ci0JICAgICAgc3ltID0gbG9jYWxfc3ltcyArIHJfc3ltbmR4OwotCSAgICAgIGlmIChFTEZfU1RfVFlQRShzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQl7Ci0JCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkgIHJlbC0+cl9hZGRlbmQgKz0gc2VjLT5vdXRwdXRfb2Zmc2V0ICsgc3ltLT5zdF92YWx1ZTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIGZpbmFsIGxpbmsuICAqLwotCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotCi0gICAgICBpZiAocl9zeW1uZHggPCBzeW10YWJfaGRyLT5zaF9pbmZvKQotCXsKLQkgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgIHNlYyA9IGxvY2FsX3NlY3Rpb25zW3Jfc3ltbmR4XTsKLQkgIHJlbG9jYXRpb24gPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrIHNlYy0+b3V0cHV0X29mZnNldAotCQkJKyBzeW0tPnN0X3ZhbHVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGFscGhhX2VsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0KLQkgIHdoaWxlIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCSB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGFscGhhX2VsZl9saW5rX2hhc2hfZW50cnkgKiloLT5yb290LnJvb3QudS5pLmxpbms7Ci0KLQkgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICBzZWMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQotI2lmIHJ0aF9ub3RkZWYKLQkgICAgICBpZiAoKHJfdHlwZSA9PSBSX0FMUEhBX0xJVEVSQUwKLQkJICAgJiYgZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAmJiAoIWluZm8tPnNoYXJlZAotCQkgICAgICAgfHwgIWluZm8tPnN5bWJvbGljCi0JCSAgICAgICB8fCAhKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQkgIHx8IChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCFpbmZvLT5zeW1ib2xpYwotCQkJICB8fCAhKGgtPnJvb3QuZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCSAgICAgICYmIChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykKLQkJICAgICAgJiYgKHJfdHlwZSA9PSBSX0FMUEhBX1JFRkxPTkcKLQkJCSAgfHwgcl90eXBlID09IFJfQUxQSEFfUkVGUVVBRAotCQkJICB8fCByX3R5cGUgPT0gUl9BTFBIQV9MSVRFUkFMKSkpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbiB2YWx1ZS4KLQkJICAgICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lIG9ic2N1cmUgY2FzZXMKLQkJICAgICBzZWMtPm91dHB1dF9zZWN0aW9uIHdpbGwgYmUgTlVMTC4gICovCi0JCSAgcmVsb2NhdGlvbiA9IDA7Ci0JCX0KLSNlbHNlCi0JICAgICAgLyogRklYTUU6IEFyZSBub3QgdGhlc2Ugb2JzY3VyZSBjYXNlcyBzaW1wbHkgYnVncz8gIExldCdzCi0JCSBnZXQgc29tZXRoaW5nIHdvcmtpbmcgYW5kIGNvbWUgYmFjayB0byB0aGlzLiAgKi8KLQkgICAgICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBOVUxMKQotCQlyZWxvY2F0aW9uID0gMDsKLSNlbmRpZiAvKiBydGhfbm90ZGVmICovCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgcmVsb2NhdGlvbiA9IChoLT5yb290LnJvb3QudS5kZWYudmFsdWUKLQkJCQkrIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAoaW5mbywgaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBhZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotCi0gICAgICBzd2l0Y2ggKHJfdHlwZSkKLQl7Ci0JY2FzZSBSX0FMUEhBX0dQRElTUDoKLQkgIHsKLQkgICAgYmZkX2J5dGUgKnBfbGRhaCwgKnBfbGRhOwotCi0JICAgIEJGRF9BU1NFUlQoZ3AgIT0gMCk7Ci0KLQkgICAgcmVsb2NhdGlvbiA9IChpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHBfbGRhaCA9IGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCAtIGlucHV0X3NlY3Rpb24tPnZtYTsKLQkgICAgcF9sZGEgPSBwX2xkYWggKyByZWwtPnJfYWRkZW5kOwotCi0JICAgIHIgPSBlbGY2NF9hbHBoYV9kb19yZWxvY19ncGRpc3AgKGlucHV0X2JmZCwgZ3AgLSByZWxvY2F0aW9uLAotCQkJCQkgICAgIHBfbGRhaCwgcF9sZGEpOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfQUxQSEFfT1BfUFVTSDoKLQljYXNlIFJfQUxQSEFfT1BfU1RPUkU6Ci0JY2FzZSBSX0FMUEhBX09QX1BTVUI6Ci0JY2FzZSBSX0FMUEhBX09QX1BSU0hJRlQ6Ci0JICAvKiBXZSBoYXRlIHRoZXNlIHNpbGx5IGJlYXN0cy4gICovCi0JICBhYm9ydCgpOwotCi0JY2FzZSBSX0FMUEhBX0xJVEVSQUw6Ci0JICB7Ci0JICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0JICAgIGJvb2xlYW4gZHluYW1pY19zeW1ib2w7Ci0KLQkgICAgQkZEX0FTU0VSVChzZ290ICE9IE5VTEwpOwotCSAgICBCRkRfQVNTRVJUKGdwICE9IDApOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCQlnb3RlbnQgPSBoLT5nb3RfZW50cmllczsKLQkJZHluYW1pY19zeW1ib2wgPSBhbHBoYV9lbGZfZHluYW1pY19zeW1ib2xfcCAoJmgtPnJvb3QsIGluZm8pOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJZ290ZW50ID0gKGFscGhhX2VsZl90ZGF0YShpbnB1dF9iZmQpLT4KLQkJCSAgbG9jYWxfZ290X2VudHJpZXNbcl9zeW1uZHhdKTsKLQkJZHluYW1pY19zeW1ib2wgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgQkZEX0FTU0VSVChnb3RlbnQgIT0gTlVMTCk7Ci0KLQkgICAgd2hpbGUgKGdvdGVudC0+Z290b2JqICE9IGdvdG9iaiB8fCBnb3RlbnQtPmFkZGVuZCAhPSBhZGRlbmQpCi0JICAgICAgZ290ZW50ID0gZ290ZW50LT5uZXh0OwotCi0JICAgIEJGRF9BU1NFUlQoZ290ZW50LT51c2VfY291bnQgPj0gMSk7Ci0KLQkgICAgLyogSW5pdGlhbGl6ZSB0aGUgLmdvdCBlbnRyeSdzIHZhbHVlLiAgKi8KLQkgICAgaWYgKCEoZ290ZW50LT5mbGFncyAmIEFMUEhBX0VMRl9HT1RfRU5UUllfUkVMT0NTX0RPTkUpKQotCSAgICAgIHsKLQkJYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbithZGRlbmQsCi0JCQkgICAgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0JCS8qIElmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZm9yY2VkIGxvY2FsLCBvdXRwdXQgYQotCQkgICBSRUxBVElWRSByZWxvYywgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgaGFuZGxlZCBpbgotCQkgICBmaW5pc2hfZHluYW1pY19zeW1ib2wuICAqLwotCQlpZiAoaW5mby0+c2hhcmVkICYmICFkeW5hbWljX3N5bWJvbCkKLQkJICB7Ci0JCSAgICBFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0KLQkJICAgIEJGRF9BU1NFUlQoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgb3V0cmVsLnJfb2Zmc2V0ID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgICAgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkJICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oMCwgUl9BTFBIQV9SRUxBVElWRSk7Ci0JCSAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0JCSAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCSAgICAgICAgc3JlbGdvdC0+Y29udGVudHMpCi0JCQkJCSAgICAgICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KyspOwotCQkgICAgQkZEX0FTU0VSVCAoc2l6ZW9mKEVsZjY0X0V4dGVybmFsX1JlbGEpCi0JCQkJKiBzcmVsZ290LT5yZWxvY19jb3VudAotCQkJCTw9IHNyZWxnb3QtPl9jb29rZWRfc2l6ZSk7Ci0JCSAgfQotCi0JCWdvdGVudC0+ZmxhZ3MgfD0gQUxQSEFfRUxGX0dPVF9FTlRSWV9SRUxPQ1NfRE9ORTsKLQkgICAgICB9Ci0KLQkgICAgLyogRmlndXJlIHRoZSBncHJlbCByZWxvY2F0aW9uLiAgKi8KLQkgICAgYWRkZW5kID0gMDsKLQkgICAgcmVsb2NhdGlvbiA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JICAgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICB9Ci0JICAvKiBvdmVyZmxvdyBoYW5kbGVkIGJ5IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAqLwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX0dQUkVMMzI6Ci0JY2FzZSBSX0FMUEhBX0dQUkVMTE9XOgotCSAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQkgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfR1BSRUxISUdIOgotCSAgQkZEX0FTU0VSVChncCAhPSAwKTsKLQkgIHJlbG9jYXRpb24gLT0gZ3A7Ci0JICByZWxvY2F0aW9uICs9IGFkZGVuZDsKLQkgIGFkZGVuZCA9IDA7Ci0JICByZWxvY2F0aW9uID0gKCgoYmZkX3NpZ25lZF92bWEpIHJlbG9jYXRpb24gPj4gMTYpCi0JCQkrICgocmVsb2NhdGlvbiA+PiAxNSkgJiAxKSk7Ci0JICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQljYXNlIFJfQUxQSEFfQlJBRERSOgotCWNhc2UgUl9BTFBIQV9ISU5UOgotCSAgLyogVGhlIHJlZ3VsYXIgUEMtcmVsYXRpdmUgc3R1ZmYgbWVhc3VyZXMgZnJvbSB0aGUgc3RhcnQgb2YKLQkgICAgIHRoZSBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB0aGUgZW5kLiAgKi8KLQkgIGFkZGVuZCAtPSA0OwotCSAgZ290byBkZWZhdWx0X3JlbG9jOwotCi0JY2FzZSBSX0FMUEhBX1JFRkxPTkc6Ci0JY2FzZSBSX0FMUEhBX1JFRlFVQUQ6Ci0JICB7Ci0JICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLQkgICAgYm9vbGVhbiBza2lwOwotCi0JICAgIC8qIENhcmVmdWwgaGVyZSB0byByZW1lbWJlciBSRUxBVElWRSByZWxvY2F0aW9ucyBmb3IgZ2xvYmFsCi0JICAgICAgIHZhcmlhYmxlcyBmb3Igc3ltYm9saWMgc2hhcmVkIG9iamVjdHMuICAqLwotCi0JICAgIGlmIChoICYmIGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wICgmaC0+cm9vdCwgaW5mbykpCi0JICAgICAgewotCQlCRkRfQVNTRVJUKGgtPnJvb3QuZHluaW5keCAhPSAtMSk7Ci0JCW91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oaC0+cm9vdC5keW5pbmR4LCByX3R5cGUpOwotCQlvdXRyZWwucl9hZGRlbmQgPSBhZGRlbmQ7Ci0JCWFkZGVuZCA9IDAsIHJlbG9jYXRpb24gPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoaW5mby0+c2hhcmVkKQotCSAgICAgIHsKLQkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTygwLCBSX0FMUEhBX1JFTEFUSVZFKTsKLQkJb3V0cmVsLnJfYWRkZW5kID0gMDsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICBnb3RvIGRlZmF1bHRfcmVsb2M7Ci0KLQkgICAgaWYgKCFzcmVsKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQotCQluYW1lID0gKGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24KLQkJCShpbnB1dF9iZmQsIGVsZl9lbGZoZWFkZXIoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCSBlbGZfc2VjdGlvbl9kYXRhKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJQkZEX0FTU0VSVChuYW1lICE9IE5VTEwpOwotCi0JCXNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCBuYW1lKTsKLQkJQkZEX0FTU0VSVChzcmVsICE9IE5VTEwpOwotCSAgICAgIH0KLQotCSAgICBza2lwID0gZmFsc2U7Ci0KLQkgICAgaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfdm1hIG9mZjsKLQotCQlvZmYgPSAoX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0JCSAgICAgICAob3V0cHV0X2JmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCSZlbGZfc2VjdGlvbl9kYXRhIChpbnB1dF9zZWN0aW9uKS0+c3RhYl9pbmZvLAotCQkJcmVsLT5yX29mZnNldCkpOwotCQlpZiAob2ZmID09IChiZmRfdm1hKSAtMSkKLQkJICBza2lwID0gdHJ1ZTsKLQkJb3V0cmVsLnJfb2Zmc2V0ID0gb2ZmOwotCSAgICAgIH0KLQotCSAgICBpZiAoISBza2lwKQotCSAgICAgIG91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgZWxzZQotCSAgICAgIG1lbXNldCAoJm91dHJlbCwgMCwgc2l6ZW9mIG91dHJlbCk7Ci0KLQkgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAgICAgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopCi0JCQkJCXNyZWwtPmNvbnRlbnRzKQotCQkJCSAgICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspOwotCSAgICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCQkJPD0gc3JlbC0+X2Nvb2tlZF9zaXplKTsKLQkgIH0KLQkgIGdvdG8gZGVmYXVsdF9yZWxvYzsKLQotCWRlZmF1bHQ6Ci0JZGVmYXVsdF9yZWxvYzoKLQkgIHIgPSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUgKGhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLCByZWwtPnJfb2Zmc2V0LCByZWxvY2F0aW9uLAotCQkJCQlhZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHIpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Qucm9vdC5zdHJpbmc7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywgc3ltLT5zdF9uYW1lKSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpZiAoKm5hbWUgPT0gJ1wwJykKLQkJICBuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5wdXRfYmZkLCBzZWMpOwotCSAgICAgIH0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJICAgKGluZm8sIG5hbWUsIGhvd3RvLT5uYW1lLCAoYmZkX3ZtYSkgMCwKLQkJICAgIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX29mZnNldCkpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLQotICBpZiAoaC0+cGx0Lm9mZnNldCAhPSBNSU5VU19PTkUpCi0gICAgewotICAgICAgLyogRmlsbCBpbiB0aGUgLnBsdCBlbnRyeSBmb3IgdGhpcyBzeW1ib2wuICAqLwotICAgICAgYXNlY3Rpb24gKnNwbHQsICpzZ290LCAqc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLSAgICAgIGJmZF92bWEgZ290X2FkZHIsIHBsdF9hZGRyOwotICAgICAgYmZkX3ZtYSBwbHRfaW5kZXg7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZWxmX2dvdF9lbnRyeSAqZ290ZW50OwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgLyogVGhlIGZpcnN0IC5nb3QgZW50cnkgd2lsbCBiZSB1cGRhdGVkIGJ5IHRoZSAucGx0IHdpdGggdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBmdW5jdGlvbi4gICovCi0gICAgICBnb3RlbnQgPSAoKHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5nb3RfZW50cmllczsKLSAgICAgIEJGRF9BU1NFUlQgKGdvdGVudCAmJiBnb3RlbnQtPmFkZGVuZCA9PSAwKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNyZWwgIT0gTlVMTCk7Ci0gICAgICBzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdDsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0KLSAgICAgIGdvdF9hZGRyID0gKHNnb3QtPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0gICAgICBwbHRfYWRkciA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCSAgKyBoLT5wbHQub2Zmc2V0KTsKLQotICAgICAgcGx0X2luZGV4ID0gKGgtPnBsdC5vZmZzZXQgLSBQTFRfSEVBREVSX1NJWkUpIC8gUExUX0VOVFJZX1NJWkU7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgaW5zbjEsIGluc24yLCBpbnNuMzsKLQotCWluc24xID0gUExUX0VOVFJZX1dPUkQxIHwgKCgtKGgtPnBsdC5vZmZzZXQgKyA0KSA+PiAyKSAmIDB4MWZmZmZmKTsKLQlpbnNuMiA9IFBMVF9FTlRSWV9XT1JEMjsKLQlpbnNuMyA9IFBMVF9FTlRSWV9XT1JEMzsKLQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24xLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQpOwotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGluc24yLCBzcGx0LT5jb250ZW50cyArIGgtPnBsdC5vZmZzZXQgKyA0KTsKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBpbnNuMywgc3BsdC0+Y29udGVudHMgKyBoLT5wbHQub2Zmc2V0ICsgOCk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJ5IGluIHRoZSAucmVsYS5wbHQgc2VjdGlvbi4gICovCi0gICAgICBvdXRyZWwucl9vZmZzZXQgPSBnb3RfYWRkcjsKLSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8oaC0+ZHluaW5keCwgUl9BTFBIQV9KTVBfU0xPVCk7Ci0gICAgICBvdXRyZWwucl9hZGRlbmQgPSAwOwotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAoKEVsZjY0X0V4dGVybmFsX1JlbGEgKilzcmVsLT5jb250ZW50cwotCQkJCSAgKyBwbHRfaW5kZXgpKTsKLQotICAgICAgaWYgKCEoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4gdGhlCi0JICAgICAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGVudHJpZXMgaW4gdGhlIC5nb3QuICAqLwotICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcGx0X2FkZHIsIHNnb3QtPmNvbnRlbnRzICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQotICAgICAgLyogU3Vic2VxdWVudCAuZ290IGVudHJpZXMgd2lsbCBjb250aW51ZSB0byBib3VuY2UgdGhyb3VnaCB0aGUgLnBsdC4gICovCi0gICAgICBpZiAoZ290ZW50LT5uZXh0KQotCXsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JICBCRkRfQVNTRVJUICghIGluZm8tPnNoYXJlZCB8fCBzcmVsICE9IE5VTEwpOwotCi0JICBnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgc2dvdCA9IGFscGhhX2VsZl90ZGF0YShnb3RlbnQtPmdvdG9iaiktPmdvdDsKLQkgICAgICBCRkRfQVNTRVJUKHNnb3QgIT0gTlVMTCk7Ci0JICAgICAgQkZEX0FTU0VSVChnb3RlbnQtPmFkZGVuZCA9PSAwKTsKLQotCSAgICAgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIHBsdF9hZGRyLAotCQkgICAgICAgICAgc2dvdC0+Y29udGVudHMgKyBnb3RlbnQtPmdvdF9vZmZzZXQpOwotCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCkKLQkJewotCQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICsgZ290ZW50LT5nb3Rfb2Zmc2V0KTsKLQkJICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPKDAsIFJfQUxQSEFfUkVMQVRJVkUpOwotCQkgIG91dHJlbC5yX2FkZGVuZCA9IDA7Ci0KLQkJICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKQotCQkJCQkgICAgICBzcmVsLT5jb250ZW50cykKLQkJCQkJICAgICArIHNyZWwtPnJlbG9jX2NvdW50KyspOwotCQkgIEJGRF9BU1NFUlQgKHNpemVvZihFbGY2NF9FeHRlcm5hbF9SZWxhKSAqIHNyZWwtPnJlbG9jX2NvdW50Ci0JCQkgICAgICA8PSBzcmVsLT5fY29va2VkX3NpemUpOwotCQl9Ci0KLQkgICAgICBnb3RlbnQgPSBnb3RlbnQtPm5leHQ7Ci0JICAgIH0KLSAgICAgICAgICB3aGlsZSAoZ290ZW50ICE9IE5VTEwpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGFscGhhX2VsZl9keW5hbWljX3N5bWJvbF9wIChoLCBpbmZvKSkKLSAgICB7Ci0gICAgICAvKiBGaWxsIGluIHRoZSBkeW5hbWljIHJlbG9jYXRpb25zIGZvciB0aGlzIHN5bWJvbCdzIC5nb3QgZW50cmllcy4gICovCi0gICAgICBhc2VjdGlvbiAqc3JlbDsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIG91dHJlbDsKLSAgICAgIHN0cnVjdCBhbHBoYV9lbGZfZ290X2VudHJ5ICpnb3RlbnQ7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotCi0gICAgICBvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX0FMUEhBX0dMT0JfREFUKTsKLSAgICAgIGZvciAoZ290ZW50ID0gKChzdHJ1Y3QgYWxwaGFfZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSBoKS0+Z290X2VudHJpZXM7Ci0JICAgZ290ZW50ICE9IE5VTEw7Ci0JICAgZ290ZW50ID0gZ290ZW50LT5uZXh0KQotCXsKLQkgIGFzZWN0aW9uICpzZ290ID0gYWxwaGFfZWxmX3RkYXRhIChnb3RlbnQtPmdvdG9iaiktPmdvdDsKLQkgIG91dHJlbC5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X29mZnNldAotCQkJICAgICArIGdvdGVudC0+Z290X29mZnNldCk7Ci0JICBvdXRyZWwucl9hZGRlbmQgPSBnb3RlbnQtPmFkZGVuZDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJm91dHJlbCwKLQkJCQkgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKXNyZWwtPmNvbnRlbnRzCi0JCQkJICAgICAgKyBzcmVsLT5yZWxvY19jb3VudCsrKSk7Ci0JICBCRkRfQVNTRVJUIChzaXplb2YoRWxmNjRfRXh0ZXJuYWxfUmVsYSkgKiBzcmVsLT5yZWxvY19jb3VudAotCQkgICAgICA8PSBzcmVsLT5fY29va2VkX3NpemUpOwotCX0KLSAgICB9Ci0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZjY0X2FscGhhX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzOwotCi0JICBiZmRfZWxmNjRfc3dhcF9keW5faW4gKGR5bm9iaiwgZHluY29uLCAmZHluKTsKLQotCSAgc3dpdGNoIChkeW4uZF90YWcpCi0JICAgIHsKLQkgICAgY2FzZSBEVF9QTFRHT1Q6Ci0JICAgICAgbmFtZSA9ICIucGx0IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6Ci0JICAgICAgbmFtZSA9ICIucmVsYS5wbHQiOwotCSAgICAgIGdvdG8gZ2V0X3NpemU7Ci0JICAgIGNhc2UgRFRfSk1QUkVMOgotCSAgICAgIG5hbWUgPSAiLnJlbGEucGx0IjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0KLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgLyogTXkgaW50ZXJwcmV0YXRpb24gb2YgdGhlIFRJUyB2MS4xIEVMRiBkb2N1bWVudCBpbmRpY2F0ZXMKLQkJIHRoYXQgUkVMQVNaIHNob3VsZCBub3QgaW5jbHVkZSBKTVBSRUwuICBUaGlzIGlzIG5vdCB3aGF0Ci0JCSB0aGUgcmVzdCBvZiB0aGUgQkZEIGRvZXMuICBJdCBpcywgaG93ZXZlciwgd2hhdCB0aGUKLQkJIGdsaWJjIGxkLnNvIHdhbnRzLiAgRG8gdGhpcyBmaXh1cCBoZXJlIHVudGlsIHdlIGZvdW5kCi0JCSBvdXQgd2hvIGlzIHJpZ2h0LiAgKi8KLQkgICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIucmVsYS5wbHQiKTsKLQkgICAgICBpZiAocykKLQkJewotCQkgIGR5bi5kX3VuLmRfdmFsIC09Ci0JCSAgICAocy0+X2Nvb2tlZF9zaXplID8gcy0+X2Nvb2tlZF9zaXplIDogcy0+X3Jhd19zaXplKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGdldF92bWE6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IChzID8gcy0+dm1hIDogMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZ2V0X3NpemU6Ci0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuYW1lKTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9Ci0JCShzLT5fY29va2VkX3NpemUgPyBzLT5fY29va2VkX3NpemUgOiBzLT5fcmF3X3NpemUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JfQotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSBQTFQwIGVudHJ5ICovCi0gICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID4gMCkKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQxLCBzcGx0LT5jb250ZW50cyk7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBQTFRfSEVBREVSX1dPUkQyLCBzcGx0LT5jb250ZW50cyArIDQpOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgUExUX0hFQURFUl9XT1JEMywgc3BsdC0+Y29udGVudHMgKyA4KTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFBMVF9IRUFERVJfV09SRDQsIHNwbHQtPmNvbnRlbnRzICsgMTIpOwotCi0JICAvKiBUaGUgbmV4dCB0d28gd29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gYnkgbGQuc28gKi8KLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIDAsIHNwbHQtPmNvbnRlbnRzICsgMTYpOwotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgMCwgc3BsdC0+Y29udGVudHMgKyAyNCk7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JICAgIFBMVF9IRUFERVJfU0laRTsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhlIG91dHB1dCBzZWN0aW9ucy4gICovCi0KLSAgICAgIHNkeW5zeW0gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAoc2R5bnN5bSAhPSBOVUxMKTsKLQotICAgICAgc3ltLnN0X3NpemUgPSAwOwotICAgICAgc3ltLnN0X25hbWUgPSAwOwotICAgICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0xPQ0FMLCBTVFRfU0VDVElPTik7Ci0gICAgICBzeW0uc3Rfb3RoZXIgPSAwOwotCi0gICAgICBmb3IgKHMgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpbnQgaW5keDsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkgICAgIChQVFIpICgoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOwotCX0KLQotICAgICAgLyogU2V0IHRoZSBzaF9pbmZvIGZpZWxkIG9mIHRoZSBvdXRwdXQgLmR5bnN5bSBzZWN0aW9uIHRvIHRoZQotICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGdsb2JhbCBzeW1ib2wuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2R5bnN5bS0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9pbmZvID0KLQliZmRfY291bnRfc2VjdGlvbnMgKG91dHB1dF9iZmQpICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIGEgc3BlY2lhbCBsaW5rIHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAucmVnaW5mbyBhbmQKLSAgIHRoZSAubWRlYnVnIHNlY3Rpb25zLiAgV2UgbmVlZCB0byBtZXJnZSBhbGwgaW5zdGFuY2VzIG9mIHRoZXNlCi0gICBzZWN0aW9ucyB0b2dldGhlciwgbm90IHdyaXRlIHRoZW0gYWxsIG91dCBzZXF1ZW50aWFsbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmNjRfYWxwaGFfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKm87Ci0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgYXNlY3Rpb24gKnJlZ2luZm9fc2VjLCAqbWRlYnVnX3NlYywgKmdwdGFiX2RhdGFfc2VjLCAqZ3B0YWJfYnNzX3NlYzsKLSAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpzd2FwCi0gICAgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXA7Ci0gIEhEUlIgKnN5bWhkciA9ICZkZWJ1Zy5zeW1ib2xpY19oZWFkZXI7Ci0gIFBUUiBtZGVidWdfaGFuZGxlID0gTlVMTDsKLQotI2lmIDAKLQkgICAgICBpZiAoKytuZ290cyA9PSAyKQotCQl7Ci0JCSAgKCppbmZvLT5jYWxsYmFja3MtPndhcm5pbmcpCi0JCSAgICAoaW5mbywgXygidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIiksIChjaGFyICopIE5VTEwsCi0JCSAgICAgb3V0cHV0X2JmZCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKTsKLQkJfQotI2VuZGlmCi0KLSAgLyogR28gdGhyb3VnaCB0aGUgc2VjdGlvbnMgYW5kIGNvbGxlY3QgdGhlIC5yZWdpbmZvIGFuZCAubWRlYnVnCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgcmVnaW5mb19zZWMgPSBOVUxMOwotICBtZGVidWdfc2VjID0gTlVMTDsKLSAgZ3B0YWJfZGF0YV9zZWMgPSBOVUxMOwotICBncHRhYl9ic3Nfc2VjID0gTlVMTDsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSNpZmRlZiBFUklDX25ldmVyZGVmCi0gICAgICBpZiAoc3RyY21wIChvLT5uYW1lLCAiLnJlZ2luZm8iKSA9PSAwKQotCXsKLQkgIG1lbXNldCAoJnJlZ2luZm8sIDAsIHNpemVvZiByZWdpbmZvKTsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLnJlZ2luZm8gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0JICAgICBMb29rIHRocm91Z2ggYWxsIHRoZSBsaW5rX29yZGVycyBjb21wcmlzaW5nIGl0IGFuZCBtZXJnZQotCSAgICAgdGhlIGluZm9ybWF0aW9uIHRvZ2V0aGVyLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyBleHQ7Ci0JICAgICAgRWxmNjRfUmVnSW5mbyBzdWI7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIFRoZSBsaW5rZXIgZW11bGF0aW9uIGNvZGUgaGFzIHByb2JhYmx5IGNsb2JiZXJlZCB0aGUKLSAgICAgICAgICAgICAgICAgc2l6ZSB0byBiZSB6ZXJvIGJ5dGVzLiAgKi8KLQkgICAgICBpZiAoaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0JCWlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyk7Ci0KLQkgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJICAgICAgKFBUUikgJmV4dCwKLQkJCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCQkgICAgICBzaXplb2YgZXh0KSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgYmZkX2FscGhhX2VsZjY0X3N3YXBfcmVnaW5mb19pbiAoaW5wdXRfYmZkLCAmZXh0LCAmc3ViKTsKLQotCSAgICAgIHJlZ2luZm8ucmlfZ3BybWFzayB8PSBzdWIucmlfZ3BybWFzazsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gfD0gc3ViLnJpX2Nwcm1hc2tbMF07Ci0JICAgICAgcmVnaW5mby5yaV9jcHJtYXNrWzFdIHw9IHN1Yi5yaV9jcHJtYXNrWzFdOwotCSAgICAgIHJlZ2luZm8ucmlfY3BybWFza1syXSB8PSBzdWIucmlfY3BybWFza1syXTsKLQkgICAgICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gfD0gc3ViLnJpX2Nwcm1hc2tbM107Ci0KLQkgICAgICAvKiByaV9ncF92YWx1ZSBpcyBzZXQgYnkgdGhlIGZ1bmN0aW9uCi0JCSBhbHBoYV9lbGZfc2VjdGlvbl9wcm9jZXNzaW5nIHdoZW4gdGhlIHNlY3Rpb24gaXMKLQkJIGZpbmFsbHkgd3JpdHRlbiBvdXQuICAqLwotCi0JICAgICAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICB9Ci0KLQkgIC8qIEZvcmNlIHRoZSBzZWN0aW9uIHNpemUgdG8gdGhlIHZhbHVlIHdlIHdhbnQuICAqLwotCSAgby0+X3Jhd19zaXplID0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWdJbmZvKTsKLQotCSAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcyBjdXJyZW50bHkKLQkgICAgIG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICBvLT5saW5rX29yZGVyX2hlYWQgPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0KLQkgIHJlZ2luZm9fc2VjID0gbzsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKHN0cmNtcCAoby0+bmFtZSwgIi5tZGVidWciKSA9PSAwKQotCXsKLQkgIHN0cnVjdCBleHRzeW1faW5mbyBlaW5mbzsKLQotCSAgLyogV2UgaGF2ZSBmb3VuZCB0aGUgLm1kZWJ1ZyBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4KLQkgICAgIExvb2sgdGhyb3VnaCBhbGwgdGhlIGxpbmtfb3JkZXJzIGNvbXByaXNpbmcgaXQgYW5kIG1lcmdlCi0JICAgICB0aGUgaW5mb3JtYXRpb24gdG9nZXRoZXIuICAqLwotCSAgc3ltaGRyLT5tYWdpYyA9IHN3YXAtPnN5bV9tYWdpYzsKLQkgIC8qIEZJWE1FOiBXaGF0IHNob3VsZCB0aGUgdmVyc2lvbiBzdGFtcCBiZT8gICovCi0JICBzeW1oZHItPnZzdGFtcCA9IDA7Ci0JICBzeW1oZHItPmlsaW5lTWF4ID0gMDsKLQkgIHN5bWhkci0+Y2JMaW5lID0gMDsKLQkgIHN5bWhkci0+aWRuTWF4ID0gMDsKLQkgIHN5bWhkci0+aXBkTWF4ID0gMDsKLQkgIHN5bWhkci0+aXN5bU1heCA9IDA7Ci0JICBzeW1oZHItPmlvcHRNYXggPSAwOwotCSAgc3ltaGRyLT5pYXV4TWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzTWF4ID0gMDsKLQkgIHN5bWhkci0+aXNzRXh0TWF4ID0gMDsKLQkgIHN5bWhkci0+aWZkTWF4ID0gMDsKLQkgIHN5bWhkci0+Y3JmZCA9IDA7Ci0JICBzeW1oZHItPmlleHRNYXggPSAwOwotCi0JICAvKiBXZSBhY2N1bXVsYXRlIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXRzZWxmIGluIHRoZQotCSAgICAgZGVidWdfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCSAgZGVidWcubGluZSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9kbnIgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfcGRyID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX3N5bSA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9vcHQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfYXV4ID0gTlVMTDsKLQkgIGRlYnVnLnNzID0gTlVMTDsKLQkgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLQkgIGRlYnVnLmV4dGVybmFsX2ZkciA9IE5VTEw7Ci0JICBkZWJ1Zy5leHRlcm5hbF9yZmQgPSBOVUxMOwotCSAgZGVidWcuZXh0ZXJuYWxfZXh0ID0gZGVidWcuZXh0ZXJuYWxfZXh0X2VuZCA9IE5VTEw7Ci0KLQkgIG1kZWJ1Z19oYW5kbGUgPSBiZmRfZWNvZmZfZGVidWdfaW5pdCAoYWJmZCwgJmRlYnVnLCBzd2FwLCBpbmZvKTsKLQkgIGlmIChtZGVidWdfaGFuZGxlID09IChQVFIpIE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKDEpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQkgICAgICBFWFRSIGVzeW07Ci0JICAgICAgYmZkX3ZtYSBsYXN0OwotCSAgICAgIHVuc2lnbmVkIGludCBpOwotCSAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZVtdID0KLQkJewotCQkgICIudGV4dCIsICIuaW5pdCIsICIuZmluaSIsICIuZGF0YSIsCi0JCSAgIi5yb2RhdGEiLCAiLnNkYXRhIiwgIi5zYnNzIiwgIi5ic3MiCi0JCX07Ci0JICAgICAgc3RhdGljIGNvbnN0IGludCBzY1tdID0geyBzY1RleHQsIHNjSW5pdCwgc2NGaW5pLCBzY0RhdGEsCi0JCQkJCSAgc2NSRGF0YSwgc2NTRGF0YSwgc2NTQnNzLCBzY0JzcyB9OwotCi0JICAgICAgZXN5bS5qbXB0YmwgPSAwOwotCSAgICAgIGVzeW0uY29ib2xfbWFpbiA9IDA7Ci0JICAgICAgZXN5bS53ZWFrZXh0ID0gMDsKLQkgICAgICBlc3ltLnJlc2VydmVkID0gMDsKLQkgICAgICBlc3ltLmlmZCA9IGlmZE5pbDsKLQkgICAgICBlc3ltLmFzeW0uaXNzID0gaXNzTmlsOwotCSAgICAgIGVzeW0uYXN5bS5zdCA9IHN0TG9jYWw7Ci0JICAgICAgZXN5bS5hc3ltLnJlc2VydmVkID0gMDsKLQkgICAgICBlc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQl7Ci0JCSAgZXN5bS5hc3ltLnNjID0gc2NbaV07Ci0JCSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lW2ldKTsKLQkJICBpZiAocyAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBlc3ltLmFzeW0udmFsdWUgPSBzLT52bWE7Ci0JCSAgICAgIGxhc3QgPSBzLT52bWEgKyBzLT5fcmF3X3NpemU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgZXN5bS5hc3ltLnZhbHVlID0gbGFzdDsKLQotCQkgIGlmICghIGJmZF9lY29mZl9kZWJ1Z19vbmVfZXh0ZXJuYWwgKGFiZmQsICZkZWJ1Zywgc3dhcCwKLQkJCQkJCSAgICAgIG5hbWVbaV0sICZlc3ltKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmlucHV0X3N3YXA7Ci0JICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gaW5wdXRfZGVidWc7Ci0JICAgICAgY2hhciAqZXJhd19zcmM7Ci0JICAgICAgY2hhciAqZXJhd19lbmQ7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGlucHV0X2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkgIHx8IChnZXRfZWxmX2JhY2tlbmRfZGF0YSAoaW5wdXRfYmZkKQotCQkgICAgICAtPmVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXApID09IE5VTEwpCi0JCXsKLQkJICAvKiBJIGRvbid0IGtub3cgd2hhdCBhIG5vbiBBTFBIQSBFTEYgYmZkIHdvdWxkIGJlCi0JCSAgICAgZG9pbmcgd2l0aCBhIC5tZGVidWcgc2VjdGlvbiwgYnV0IEkgZG9uJ3QgcmVhbGx5Ci0JCSAgICAgd2FudCB0byBkZWFsIHdpdGggaXQuICAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBpbnB1dF9zd2FwID0gKGdldF9lbGZfYmFja2VuZF9kYXRhIChpbnB1dF9iZmQpCi0JCQkgICAgLT5lbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwKTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHAtPnNpemUgPT0gaW5wdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIC8qIFRoZSBFQ09GRiBsaW5raW5nIGNvZGUgZXhwZWN0cyB0aGF0IHdlIGhhdmUgYWxyZWFkeQotCQkgcmVhZCBpbiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBzZXQgdXAgYW4KLQkJIGVjb2ZmX2RlYnVnX2luZm8gc3RydWN0dXJlLCBzbyB3ZSBkbyB0aGF0IG5vdy4gICovCi0JICAgICAgaWYgKCFlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8gKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJCSZpbnB1dF9kZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIChiZmRfZWNvZmZfZGVidWdfYWNjdW11bGF0ZQotCQkgICAgIChtZGVidWdfaGFuZGxlLCBhYmZkLCAmZGVidWcsIHN3YXAsIGlucHV0X2JmZCwKLQkJICAgICAgJmlucHV0X2RlYnVnLCBpbnB1dF9zd2FwLCBpbmZvKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgZXh0ZXJuYWwgc3ltYm9scy4gIEZvciBlYWNoIG9uZSB3aXRoCi0JCSBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiwgdHJ5IHRvIGZpbmQgdGhlIHN5bWJvbCBpbgotCQkgdGhlIGxpbmtlciBnbG9iYWwgaGFzaCB0YWJsZSBhbmQgc2F2ZSB0aGUgaW5mb3JtYXRpb24KLQkJIGZvciB0aGUgb3V0cHV0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotCSAgICAgIGVyYXdfc3JjID0gaW5wdXRfZGVidWcuZXh0ZXJuYWxfZXh0OwotCSAgICAgIGVyYXdfZW5kID0gKGVyYXdfc3JjCi0JCQkgICsgKGlucHV0X2RlYnVnLnN5bWJvbGljX2hlYWRlci5pZXh0TWF4Ci0JCQkgICAgICogaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpKTsKLQkgICAgICBmb3IgKDsKLQkJICAgZXJhd19zcmMgPCBlcmF3X2VuZDsKLQkJICAgZXJhd19zcmMgKz0gaW5wdXRfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpCi0JCXsKLQkJICBFWFRSIGV4dDsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkgIHN0cnVjdCBhbHBoYV9lbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgKCppbnB1dF9zd2FwLT5zd2FwX2V4dF9pbikgKGlucHV0X2JmZCwgKFBUUikgZXJhd19zcmMsICZleHQpOwotCQkgIGlmIChleHQuYXN5bS5zYyA9PSBzY05pbAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1VuZGVmaW5lZAotCQkgICAgICB8fCBleHQuYXN5bS5zYyA9PSBzY1NVbmRlZmluZWQpCi0JCSAgICBjb250aW51ZTsKLQotCQkgIG5hbWUgPSBpbnB1dF9kZWJ1Zy5zc2V4dCArIGV4dC5hc3ltLmlzczsKLQkJICBoID0gYWxwaGFfZWxmX2xpbmtfaGFzaF9sb29rdXAgKGFscGhhX2VsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJICBpZiAoaCA9PSBOVUxMIHx8IGgtPmVzeW0uaWZkICE9IC0yKQotCQkgICAgY29udGludWU7Ci0KLQkJICBpZiAoZXh0LmlmZCAhPSAtMSkKLQkJICAgIHsKLQkJICAgICAgQkZEX0FTU0VSVCAoZXh0LmlmZAotCQkJCSAgPCBpbnB1dF9kZWJ1Zy5zeW1ib2xpY19oZWFkZXIuaWZkTWF4KTsKLQkJICAgICAgZXh0LmlmZCA9IGlucHV0X2RlYnVnLmlmZG1hcFtleHQuaWZkXTsKLQkJICAgIH0KLQotCQkgIGgtPmVzeW0gPSBleHQ7Ci0JCX0KLQotCSAgICAgIC8qIEZyZWUgdXAgdGhlIGluZm9ybWF0aW9uIHdlIGp1c3QgcmVhZC4gICovCi0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcubGluZSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZG5yKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9wZHIpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX3N5bSk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfb3B0KTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9hdXgpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLnNzKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5zc2V4dCk7Ci0JICAgICAgZnJlZSAoaW5wdXRfZGVidWcuZXh0ZXJuYWxfZmRyKTsKLQkgICAgICBmcmVlIChpbnB1dF9kZWJ1Zy5leHRlcm5hbF9yZmQpOwotCSAgICAgIGZyZWUgKGlucHV0X2RlYnVnLmV4dGVybmFsX2V4dCk7Ci0KLQkgICAgICAvKiBIYWNrOiByZXNldCB0aGUgU0VDX0hBU19DT05URU5UUyBmbGFnIHNvIHRoYXQKLQkJIGVsZl9saW5rX2lucHV0X2JmZCBpZ25vcmVzIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgaW5wdXRfc2VjdGlvbi0+ZmxhZ3MgJj1+IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLQkgIGlmIChpbmZvLT5zaGFyZWQpCi0JICAgIHsKLQkgICAgICAvKiBDcmVhdGUgLnJ0cHJvYyBzZWN0aW9uLiAgKi8KLQkgICAgICBydHByb2Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnRwcm9jIik7Ci0JICAgICAgaWYgKHJ0cHJvY19zZWMgPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkIGZsYWdzID0gKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgfCBTRUNfSU5fTUVNT1JZCi0JCQkJICAgIHwgU0VDX0xJTktFUl9DUkVBVEVECi0JCQkJICAgIHwgU0VDX1JFQURPTkxZKTsKLQotCQkgIHJ0cHJvY19zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJ0cHJvYyIpOwotCQkgIGlmIChydHByb2Nfc2VjID09IE5VTEwKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHJ0cHJvY19zZWMsIGZsYWdzKQotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHJ0cHJvY19zZWMsIDEyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCi0JICAgICAgaWYgKCEgYWxwaGFfZWxmX2NyZWF0ZV9wcm9jZWR1cmVfdGFibGUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsCi0JCQkJCQkgICAgIGluZm8sIHJ0cHJvY19zZWMsICZkZWJ1ZykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotI2VuZGlmCi0KLQotCSAgLyogQnVpbGQgdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0JICBlaW5mby5hYmZkID0gYWJmZDsKLQkgIGVpbmZvLmluZm8gPSBpbmZvOwotCSAgZWluZm8uZGVidWcgPSAmZGVidWc7Ci0JICBlaW5mby5zd2FwID0gc3dhcDsKLQkgIGVpbmZvLmZhaWxlZCA9IGZhbHNlOwotCSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgZWxmNjRfYWxwaGFfb3V0cHV0X2V4dHN5bSwKLQkJCQkgIChQVFIpICZlaW5mbyk7Ci0JICBpZiAoZWluZm8uZmFpbGVkKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgLm1kZWJ1ZyBzZWN0aW9uLiAgKi8KLQkgIG8tPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChhYmZkLCAmZGVidWcsIHN3YXApOwotCi0JICAvKiBTa2lwIHRoaXMgc2VjdGlvbiBsYXRlciBvbiAoSSBkb24ndCB0aGluayB0aGlzIGN1cnJlbnRseQotCSAgICAgbWF0dGVycywgYnV0IHNvbWVkYXkgaXQgbWlnaHQpLiAgKi8KLQkgIG8tPmxpbmtfb3JkZXJfaGVhZCA9IChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikgTlVMTDsKLQotCSAgbWRlYnVnX3NlYyA9IG87Ci0JfQotCi0jaWZkZWYgRVJJQ19uZXZlcmRlZgotICAgICAgaWYgKHN0cm5jbXAgKG8tPm5hbWUsICIuZ3B0YWIuIiwgc2l6ZW9mICIuZ3B0YWIuIiAtIDEpID09IDApCi0JewotCSAgY29uc3QgY2hhciAqc3VibmFtZTsKLQkgIHVuc2lnbmVkIGludCBjOwotCSAgRWxmNjRfZ3B0YWIgKnRhYjsKLQkgIEVsZjY0X0V4dGVybmFsX2dwdGFiICpleHRfdGFiOwotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIC8qIFRoZSAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzIHNlY3Rpb25zIGhvbGQKLQkgICAgIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgaG93IHRoZSBzbWFsbCBkYXRhIGFyZWEgd291bGQKLQkgICAgIGNoYW5nZSBkZXBlbmRpbmcgdXBvbiB0aGUgLUcgc3dpdGNoLiAgVGhlc2Ugc2VjdGlvbnMKLQkgICAgIG5vdCB1c2VkIGluIGV4ZWN1dGFibGVzIGZpbGVzLiAgKi8KLQkgIGlmICghIGluZm8tPnJlbG9jYXRlYWJsZSkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICoqc2VjcHA7Ci0KLQkgICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCQkgICBwID0gcC0+bmV4dCkKLQkJewotCQkgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotCi0JCSAgaWYgKHAtPnR5cGUgIT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCQljb250aW51ZTsKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0KLQkJICBpbnB1dF9zZWN0aW9uID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uOwotCi0JCSAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSAgICAgZWxmX2xpbmtfaW5wdXRfYmZkIGlnbm9yZXMgdGhpcyBzZWN0aW9uLiAgKi8KLQkJICBpbnB1dF9zZWN0aW9uLT5mbGFncyAmPX4gU0VDX0hBU19DT05URU5UUzsKLQkJfQotCi0JICAgICAgLyogU2tpcCB0aGlzIHNlY3Rpb24gbGF0ZXIgb24gKEkgZG9uJ3QgdGhpbmsgdGhpcwotCQkgY3VycmVudGx5IG1hdHRlcnMsIGJ1dCBzb21lZGF5IGl0IG1pZ2h0KS4gICovCi0JICAgICAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0JICAgICAgLyogUmVhbGx5IHJlbW92ZSB0aGUgc2VjdGlvbi4gICovCi0JICAgICAgZm9yIChzZWNwcCA9ICZhYmZkLT5zZWN0aW9uczsKLQkJICAgKnNlY3BwICE9IG87Ci0JCSAgIHNlY3BwID0gJigqc2VjcHApLT5uZXh0KQotCQk7Ci0JICAgICAgKnNlY3BwID0gKCpzZWNwcCktPm5leHQ7Ci0JICAgICAgLS1hYmZkLT5zZWN0aW9uX2NvdW50OwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogVGhlcmUgaXMgb25lIGdwdGFiIGZvciBpbml0aWFsaXplZCBkYXRhLCBhbmQgb25lIGZvcgotCSAgICAgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2RhdGEiKSA9PSAwKQotCSAgICBncHRhYl9kYXRhX3NlYyA9IG87Ci0JICBlbHNlIGlmIChzdHJjbXAgKG8tPm5hbWUsICIuZ3B0YWIuc2JzcyIpID09IDApCi0JICAgIGdwdGFiX2Jzc19zZWMgPSBvOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczogaWxsZWdhbCBzZWN0aW9uIG5hbWUgYCVzJyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUpOwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBUaGUgbGlua2VyIHNjcmlwdCBhbHdheXMgY29tYmluZXMgLmdwdGFiLmRhdGEgYW5kCi0JICAgICAuZ3B0YWIuc2RhdGEgaW50byAuZ3B0YWIuc2RhdGEsIGFuZCBsaWtld2lzZSBmb3IKLQkgICAgIC5ncHRhYi5ic3MgYW5kIC5ncHRhYi5zYnNzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGVyZSBpcwotCSAgICAgbm8gLnNkYXRhIG9yIC5zYnNzIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBpbiB3aGljaAotCSAgICAgY2FzZSB3ZSBtdXN0IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3VibmFtZSA9IG8tPm5hbWUgKyBzaXplb2YgIi5ncHRhYiIgLSAxOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBzdWJuYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKG8gPT0gZ3B0YWJfZGF0YV9zZWMpCi0JCW8tPm5hbWUgPSAiLmdwdGFiLmRhdGEiOwotCSAgICAgIGVsc2UKLQkJby0+bmFtZSA9ICIuZ3B0YWIuYnNzIjsKLQkgICAgICBzdWJuYW1lID0gby0+bmFtZSArIHNpemVvZiAiLmdwdGFiIiAtIDE7Ci0JICAgICAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN1Ym5hbWUpICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIC8qIFNldCB1cCB0aGUgZmlyc3QgZW50cnkuICAqLwotCSAgYyA9IDE7Ci0JICB0YWIgPSAoRWxmNjRfZ3B0YWIgKikgYmZkX21hbGxvYyAoYyAqIHNpemVvZiAoRWxmNjRfZ3B0YWIpKTsKLQkgIGlmICh0YWIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgdGFiWzBdLmd0X2hlYWRlci5ndF9jdXJyZW50X2dfdmFsdWUgPSBlbGZfZ3Bfc2l6ZSAoYWJmZCk7Ci0JICB0YWJbMF0uZ3RfaGVhZGVyLmd0X3VudXNlZCA9IDA7Ci0KLQkgIC8qIENvbWJpbmUgdGhlIGlucHV0IHNlY3Rpb25zLiAgKi8KLQkgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsKLQkgICAgICAgcCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7Ci0JICAgICAgIHAgPSBwLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JICAgICAgYmZkICppbnB1dF9iZmQ7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCSAgICAgIHVuc2lnbmVkIGxvbmcgbGFzdDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGdwZW50cnk7Ci0KLQkgICAgICBpZiAocC0+dHlwZSAhPSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJewotCQkgIGlmIChwLT50eXBlID09IGJmZF9maWxsX2xpbmtfb3JkZXIpCi0JCSAgICBjb250aW51ZTsKLQkJICBhYm9ydCAoKTsKLQkJfQotCi0JICAgICAgaW5wdXRfc2VjdGlvbiA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQkgICAgICBpbnB1dF9iZmQgPSBpbnB1dF9zZWN0aW9uLT5vd25lcjsKLQotCSAgICAgIC8qIENvbWJpbmUgdGhlIGdwdGFiIGVudHJpZXMgZm9yIHRoaXMgaW5wdXQgc2VjdGlvbiBvbmUKLQkJIGJ5IG9uZS4gIFdlIGtub3cgdGhhdCB0aGUgaW5wdXQgZ3B0YWIgZW50cmllcyBhcmUKLQkJIHNvcnRlZCBieSBhc2NlbmRpbmcgLUcgdmFsdWUuICAqLwotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotCSAgICAgIGxhc3QgPSAwOwotCSAgICAgIGZvciAoZ3BlbnRyeSA9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfZ3B0YWIpOwotCQkgICBncGVudHJ5IDwgc2l6ZTsKLQkJICAgZ3BlbnRyeSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkKLQkJewotCQkgIEVsZjY0X0V4dGVybmFsX2dwdGFiIGV4dF9ncHRhYjsKLQkJICBFbGY2NF9ncHRhYiBpbnRfZ3B0YWI7Ci0JCSAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JCSAgdW5zaWduZWQgbG9uZyBhZGQ7Ci0JCSAgYm9vbGVhbiBleGFjdDsKLQkJICB1bnNpZ25lZCBpbnQgbG9vazsKLQotCQkgIGlmICghIChiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLQkJCSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCAoUFRSKSAmZXh0X2dwdGFiLAotCQkJICBncGVudHJ5LCBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKSkpKQotCQkgICAgewotCQkgICAgICBmcmVlICh0YWIpOwotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0KLQkJICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9ncHRhYl9pbiAoaW5wdXRfYmZkLCAmZXh0X2dwdGFiLAotCQkJCQkJJmludF9ncHRhYik7Ci0JCSAgdmFsID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2dfdmFsdWU7Ci0JCSAgYWRkID0gaW50X2dwdGFiLmd0X2VudHJ5Lmd0X2J5dGVzIC0gbGFzdDsKLQotCQkgIGV4YWN0ID0gZmFsc2U7Ci0JCSAgZm9yIChsb29rID0gMTsgbG9vayA8IGM7IGxvb2srKykKLQkJICAgIHsKLQkJICAgICAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID49IHZhbCkKLQkJCXRhYltsb29rXS5ndF9lbnRyeS5ndF9ieXRlcyArPSBhZGQ7Ci0KLQkJICAgICAgaWYgKHRhYltsb29rXS5ndF9lbnRyeS5ndF9nX3ZhbHVlID09IHZhbCkKLQkJCWV4YWN0ID0gdHJ1ZTsKLQkJICAgIH0KLQotCQkgIGlmICghIGV4YWN0KQotCQkgICAgewotCQkgICAgICBFbGY2NF9ncHRhYiAqbmV3X3RhYjsKLQkJICAgICAgdW5zaWduZWQgaW50IG1heDsKLQotCQkgICAgICAvKiBXZSBuZWVkIGEgbmV3IHRhYmxlIGVudHJ5LiAgKi8KLQkJICAgICAgbmV3X3RhYiA9ICgoRWxmNjRfZ3B0YWIgKikKLQkJCQkgYmZkX3JlYWxsb2MgKChQVFIpIHRhYiwKLQkJCQkJICAgICAgKGMgKyAxKSAqIHNpemVvZiAoRWxmNjRfZ3B0YWIpKSk7Ci0JCSAgICAgIGlmIChuZXdfdGFiID09IE5VTEwpCi0JCQl7Ci0JCQkgIGZyZWUgKHRhYik7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgdGFiID0gbmV3X3RhYjsKLQkJICAgICAgdGFiW2NdLmd0X2VudHJ5Lmd0X2dfdmFsdWUgPSB2YWw7Ci0JCSAgICAgIHRhYltjXS5ndF9lbnRyeS5ndF9ieXRlcyA9IGFkZDsKLQotCQkgICAgICAvKiBNZXJnZSBpbiB0aGUgc2l6ZSBmb3IgdGhlIG5leHQgc21hbGxlc3QgLUcKLQkJCSB2YWx1ZSwgc2luY2UgdGhhdCB3aWxsIGJlIGltcGxpZWQgYnkgdGhpcyBuZXcKLQkJCSB2YWx1ZS4gICovCi0JCSAgICAgIG1heCA9IDA7Ci0JCSAgICAgIGZvciAobG9vayA9IDE7IGxvb2sgPCBjOyBsb29rKyspCi0JCQl7Ci0JCQkgIGlmICh0YWJbbG9va10uZ3RfZW50cnkuZ3RfZ192YWx1ZSA8IHZhbAotCQkJICAgICAgJiYgKG1heCA9PSAwCi0JCQkJICB8fCAodGFiW2xvb2tdLmd0X2VudHJ5Lmd0X2dfdmFsdWUKLQkJCQkgICAgICA+IHRhYlttYXhdLmd0X2VudHJ5Lmd0X2dfdmFsdWUpKSkKLQkJCSAgICBtYXggPSBsb29rOwotCQkJfQotCQkgICAgICBpZiAobWF4ICE9IDApCi0JCQl0YWJbY10uZ3RfZW50cnkuZ3RfYnl0ZXMgKz0KLQkJCSAgdGFiW21heF0uZ3RfZW50cnkuZ3RfYnl0ZXM7Ci0KLQkJICAgICAgKytjOwotCQkgICAgfQotCi0JCSAgbGFzdCA9IGludF9ncHRhYi5ndF9lbnRyeS5ndF9ieXRlczsKLQkJfQotCi0JICAgICAgLyogSGFjazogcmVzZXQgdGhlIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBzbyB0aGF0Ci0JCSBlbGZfbGlua19pbnB1dF9iZmQgaWdub3JlcyB0aGlzIHNlY3Rpb24uICAqLwotCSAgICAgIGlucHV0X3NlY3Rpb24tPmZsYWdzICY9fiBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB0YWJsZSBtdXN0IGJlIHNvcnRlZCBieSAtRyB2YWx1ZS4gICovCi0JICBpZiAoYyA+IDIpCi0JICAgIHFzb3J0ICh0YWIgKyAxLCBjIC0gMSwgc2l6ZW9mICh0YWJbMF0pLCBncHRhYl9jb21wYXJlKTsKLQotCSAgLyogU3dhcCBvdXQgdGhlIHRhYmxlLiAgKi8KLQkgIGV4dF90YWIgPSAoKEVsZjY0X0V4dGVybmFsX2dwdGFiICopCi0JCSAgICAgYmZkX2FsbG9jIChhYmZkLCBjICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9ncHRhYikpKTsKLQkgIGlmIChleHRfdGFiID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcmVlICh0YWIpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotCSAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9ncHRhYl9vdXQgKGFiZmQsIHRhYiArIGksIGV4dF90YWIgKyBpKTsKLQkgIGZyZWUgKHRhYik7Ci0KLQkgIG8tPl9yYXdfc2l6ZSA9IGMgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX2dwdGFiKTsKLQkgIG8tPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGV4dF90YWI7Ci0KLQkgIC8qIFNraXAgdGhpcyBzZWN0aW9uIGxhdGVyIG9uIChJIGRvbid0IHRoaW5rIHRoaXMgY3VycmVudGx5Ci0JICAgICBtYXR0ZXJzLCBidXQgc29tZWRheSBpdCBtaWdodCkuICAqLwotCSAgby0+bGlua19vcmRlcl9oZWFkID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCX0KLSNlbmRpZgotCi0gICAgfQotCi0gIC8qIEludm9rZSB0aGUgcmVndWxhciBFTEYgYmFja2VuZCBsaW5rZXIgdG8gZG8gYWxsIHRoZSB3b3JrLiAgKi8KLSAgaWYgKCEgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIChhYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IHdyaXRlIG91dCB0aGUgY29tcHV0ZWQgc2VjdGlvbnMuICAqLwotCi0gIC8qIFRoZSAuZ290IHN1YnNlY3Rpb25zLi4uICAqLwotICB7Ci0gICAgYmZkICppLCAqZHlub2JqID0gZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bm9iajsKLSAgICBmb3IgKGkgPSBhbHBoYV9lbGZfaGFzaF90YWJsZShpbmZvKS0+Z290X2xpc3Q7Ci0JIGkgIT0gTlVMTDsKLQkgaSA9IGFscGhhX2VsZl90ZGF0YShpKS0+Z290X2xpbmtfbmV4dCkKLSAgICAgIHsKLQlhc2VjdGlvbiAqc2dvdDsKLQotCS8qIGVsZl9iZmRfZmluYWxfbGluayBhbHJlYWR5IGRpZCBldmVyeXRoaW5nIGluIGR5bm9iai4gICovCi0JaWYgKGkgPT0gZHlub2JqKQotCSAgY29udGludWU7Ci0KLQlzZ290ID0gYWxwaGFfZWxmX3RkYXRhKGkpLT5nb3Q7Ci0JaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZ290LT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJc2dvdC0+Y29udGVudHMsIHNnb3QtPm91dHB1dF9vZmZzZXQsCi0JCQkJCXNnb3QtPl9yYXdfc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gIH0KLQotI2lmZGVmIEVSSUNfbmV2ZXJkZWYKLSAgaWYgKHJlZ2luZm9fc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gZXh0OwotCi0gICAgICBiZmRfYWxwaGFfZWxmNjRfc3dhcF9yZWdpbmZvX291dCAoYWJmZCwgJnJlZ2luZm8sICZleHQpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCByZWdpbmZvX3NlYywgKFBUUikgJmV4dCwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemVvZiBleHQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAobWRlYnVnX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKTsKLSAgICAgIGlmICghIGJmZF9lY29mZl93cml0ZV9hY2N1bXVsYXRlZF9kZWJ1ZyAobWRlYnVnX2hhbmRsZSwgYWJmZCwgJmRlYnVnLAotCQkJCQkgICAgICAgc3dhcCwgaW5mbywKLQkJCQkJICAgICAgIG1kZWJ1Z19zZWMtPmZpbGVwb3MpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgYmZkX2Vjb2ZmX2RlYnVnX2ZyZWUgKG1kZWJ1Z19oYW5kbGUsIGFiZmQsICZkZWJ1Zywgc3dhcCwgaW5mbyk7Ci0gICAgfQotCi0gIGlmIChncHRhYl9kYXRhX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2RhdGFfc2VjLAotCQkJCSAgICAgIGdwdGFiX2RhdGFfc2VjLT5jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgZ3B0YWJfZGF0YV9zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZ3B0YWJfYnNzX3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGdwdGFiX2Jzc19zZWMsCi0JCQkJICAgICAgZ3B0YWJfYnNzX3NlYy0+Y29udGVudHMsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgIGdwdGFiX2Jzc19zZWMtPl9yYXdfc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEVDT0ZGIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggdGhlCi0gICAubWRlYnVnIHNlY3Rpb24sIHdoaWNoIGlzIGluIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgZm9ybWF0LiAgQ29waWVkCi0gICBmcm9tIGVsZjMyLW1pcHMuYy4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcAotZWxmNjRfYWxwaGFfZWNvZmZfZGVidWdfc3dhcCA9Ci17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpY1N5bTIsCi0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgOCwKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gIGVjb2ZmX3N3YXBfcGRyX2luLAotICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gIGVjb2ZmX3N3YXBfZmRyX2luLAotICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgZWNvZmZfc3dhcF9leHRfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgZWNvZmZfc3dhcF9leHRfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICBlbGY2NF9hbHBoYV9yZWFkX2Vjb2ZmX2luZm8KLX07Ci0MCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCWJmZF9lbGY2NF9hbHBoYV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCSJlbGY2NC1hbHBoYSIKLSNkZWZpbmUgRUxGX0FSQ0gJCWJmZF9hcmNoX2FscGhhCi0jZGVmaW5lIEVMRl9NQUNISU5FX0NPREUgCUVNX0FMUEhBCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAJMHgxMDAwMAotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIGVsZjY0X2FscGhhX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIGVsZjY0X2FscGhhX2JmZF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBcCi0gIGVsZjY0X2FscGhhX2luZm9fdG9faG93dG8KLQotI2RlZmluZSBiZmRfZWxmNjRfbWtvYmplY3QgXAotICBlbGY2NF9hbHBoYV9ta29iamVjdAotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCBcCi0gIGVsZjY0X2FscGhhX29iamVjdF9wCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX3NoZHIgXAotICBlbGY2NF9hbHBoYV9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zIFwKLSAgZWxmNjRfYWxwaGFfZmFrZV9zZWN0aW9ucwotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIGVsZjY0X2FscGhhX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgYmZkX2VsZjY0X2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgZWxmNjRfYWxwaGFfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxheF9zZWN0aW9uIFwKLSAgZWxmNjRfYWxwaGFfcmVsYXhfc2VjdGlvbgotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vayBcCi0gIGVsZjY0X2FscGhhX2FkZF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgXAotICBlbGY2NF9hbHBoYV9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgXAotICBlbGY2NF9hbHBoYV9hZGp1c3RfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9hbHdheXNfc2l6ZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMgXAotICBlbGY2NF9hbHBoYV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiBcCi0gIGVsZjY0X2FscGhhX3JlbG9jYXRlX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sIFwKLSAgZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIFwKLSAgZWxmNjRfYWxwaGFfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9maW5hbF9saW5rIFwKLSAgZWxmNjRfYWxwaGFfZmluYWxfbGluawotCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAgXAotICAmZWxmNjRfYWxwaGFfZWNvZmZfZGVidWdfc3dhcAotCi0vKgotICogQSBmZXcgY29uc3RhbnRzIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgLnBsdCBzZWN0aW9uIGlzIHNldCB1cC4KLSAqLwotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgMAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgUExUX0hFQURFUl9TSVpFCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1nZW4uYyBiL2JmZC9lbGY2NC1nZW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkYzA5ZC4uMDAwMDAwMAotLS0gYS9iZmQvZWxmNjQtZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKiBHZW5lcmljIHN1cHBvcnQgZm9yIDY0LWJpdCBFTEYKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBhbnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwgYnV0IHNob3VsZCBiZQotICAgZ29vZCBlbm91Z2ggZm9yIEdEQiBvciBvYmpkdW1wIHRvIHJlYWQgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBkdW1teSA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBOVUxMLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlVOS05PV04iLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotZWxmX2dlbmVyaWNfaW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIGJmZF9yZWxvYy0+aG93dG8gPSAmZHVtbXk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZ2VuZXJpY19pbmZvX3RvX2hvd3RvX3JlbCAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWwgKmVsZl9yZWxvYzsKLXsKLSAgYmZkX3JlbG9jLT5ob3d0byA9ICZkdW1teTsKLX0KLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUJCSJlbGY2NC1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQkJYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUJCQkiZWxmNjQtYmlnIgotI2RlZmluZSBFTEZfQVJDSAkJCWJmZF9hcmNoX3Vua25vd24KLSNkZWZpbmUgRUxGX01BQ0hJTkVfQ09ERQkJRU1fTk9ORQotI2RlZmluZSBFTEZfTUFYUEFHRVNJWkUJCQkweDEKLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBiZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0bwkJZWxmX2dlbmVyaWNfaW5mb190b19ob3d0bwotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwJCWVsZl9nZW5lcmljX2luZm9fdG9faG93dG9fcmVsCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC1taXBzLmMgYi9iZmQvZWxmNjQtbWlwcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmU2MDc1Li4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1taXBzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYzICswLDAgQEAKLS8qIE1JUFMtc3BlY2lmaWMgc3VwcG9ydCBmb3IgNjQtYml0IEVMRgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBzdXBwb3J0cyB0aGUgNjQtYml0IE1JUFMgRUxGIEFCSS4KLQotICAgVGhlIE1JUFMgNjQtYml0IEVMRiBBQkkgdXNlcyBhbiB1bnVzdWFsIHJlbG9jIGZvcm1hdC4gIFRoaXMgZmlsZQotICAgb3ZlcnJpZGVzIHRoZSB1c3VhbCBFTEYgcmVsb2MgaGFuZGxpbmcsIGFuZCBoYW5kbGVzIHJlYWRpbmcgYW5kCi0gICB3cml0aW5nIHRoZSByZWxvY2F0aW9ucyBoZXJlLgotCi0gICBUaGUgTUlQUyA2NC1iaXQgRUxGIEFCSSBhbHNvIHVzZXMgYW4gdW51c3VhbCBhcmNoaXZlIG1hcCBmb3JtYXQuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZW5saW5rLmgiCi0jaW5jbHVkZSAiZWxmLWJmZC5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0KLS8qIEdldCB0aGUgRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGUgNjQtYml0IEFCSSBpcyBub3Qgc3VwcG9zZWQgdG8KLSAgIHVzZSBFQ09GRi4gIEhvd2V2ZXIsIHdlIHN1cHBvcnQgaXQgYW55aG93IGZvciBhbiBlYXNpZXIgY2hhbmdlb3Zlci4gICovCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL3N5bWNvbnN0LmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLS8qIFRoZSA2NCBiaXQgdmVyc2lvbnMgb2YgdGhlIG1kZWJ1ZyBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGFscGhhLmguICAqLwotI2luY2x1ZGUgImNvZmYvYWxwaGEuaCIKLSNkZWZpbmUgRUNPRkZfNjQKLSNpbmNsdWRlICJlY29mZnN3YXAuaCIKLQotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqLAotCSAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsICopKTsKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2FfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqLAotCSAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSAqKSk7Ci0jaWYgMAotc3RhdGljIHZvaWQgbWlwc19lbGY2NF9zd2FwX3JlbG9jX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKiwKLQkgICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIG1pcHNfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbGEgKiwKLQkgICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikpOwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKm1pcHNfZWxmNjRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIGxvbmcgbWlwc19lbGY2NF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2VsZjY0X3dyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NlY3Rpb25fZnJvbV9zaGRyCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIG1pcHNfZWxmNjRfc2VjdGlvbl9wcm9jZXNzaW5nCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtaXBzX2VsZjY0X3dyaXRlX2FybWFwCi0gIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKTsKLQotLyogSW4gY2FzZSB3ZSdyZSBvbiBhIDMyLWJpdCBtYWNoaW5lLCBjb25zdHJ1Y3QgYSA2NC1iaXQgIi0xIiB2YWx1ZQotICAgZnJvbSBzbWFsbGVyIHZhbHVlcy4gIFN0YXJ0IHdpdGggemVybywgd2lkZW4sICp0aGVuKiBkZWNyZW1lbnQuICAqLwotI2RlZmluZSBNSU5VU19PTkUJKCgoYmZkX3ZtYSkwKSAtIDEpCi0KLS8qIFRoZSByZWxvY2F0aW9uIHRhYmxlIHVzZWQgZm9yIFNIVF9SRUwgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbFtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18zMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzMyIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgc3ltYm9sIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX1JFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMjYgYml0IGJyYW5jaCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKFJfTUlQU18yNiwJCS8qIHR5cGUgKi8KLQkgMiwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDI2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgCQkJLyogVGhpcyBuZWVkcyBjb21wbGV4IG92ZXJmbG93Ci0JCQkJICAgZGV0ZWN0aW9uLCBiZWNhdXNlIHRoZSB1cHBlciBmb3VyCi0JCQkJICAgYml0cyBtdXN0IG1hdGNoIHRoZSBQQy4gICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzI2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgzZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfSEkxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9oaTE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSEkxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfTE8xNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9sbzE2X3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfTE8xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIF9iZmRfbWlwc19lbGZfZ3ByZWwxNl9yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dQUkVMMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBsaXRlcmFsIHNlY3Rpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MSVRFUkFMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWZlcmVuY2UgdG8gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9nb3QxNl9yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19QQzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUEMxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBjYWxsIHRocm91Z2ggZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTEwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAgIHsgMTMgfSwKLSAgICB7IDE0IH0sCi0gICAgeyAxNSB9LAotCi0gIC8qIEEgNSBiaXQgc2hpZnQgZmllbGQuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDUsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ1IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2MwLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjMCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNiBiaXQgc2hpZnQgZmllbGQuICAqLwotICAvKiBGSVhNRTogVGhpcyBpcyBub3QgaGFuZGxlZCBjb3JyZWN0bHk7IGEgc3BlY2lhbCBmdW5jdGlvbiBpcwotICAgICBuZWVkZWQgdG8gcHV0IHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpbiB0aGUgcmlnaHQgcGxhY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX1NISUZUNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSA2LAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfU0hJRlQ2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwN2M0LAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGlzcGxhY2VtZW50IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ESVNQIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCB0byBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfUEFHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX1BBR0UiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogT2Zmc2V0IGZyb20gcGFnZSBwb2ludGVyIGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX09GU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9PRlNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0dPVF9ISTE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDBmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogNjQgYml0IHN1YnN0cmFjdGlvbi4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX1NVQiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NVQiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIE1JTlVTX09ORSwJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSU5TRVJUX0EsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19JTlNFUlRfQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbiwgYW5kIGNoYW5nZSBhbGwgcmVsb2NhdGlvbnMKLSAgICAgdG8gcmVmZXIgdG8gdGhlIG9sZCBpbnN0cnVjdGlvbiBhdCB0aGUgYWRkcmVzcy4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9CLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGVsZXRlIGEgMzIgYml0IGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfREVMRVRFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0RFTEVURSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlciB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFUiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR2V0IHRoZSBoaWdoZXN0IHZhbHVlIG9mIGEgNjQgYml0IGFkZGVuZC4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0hJR0hFU1QsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSElHSEVTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9ISTE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfSEkxNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb3cgMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfTE8xNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhlIHJlbWFpbmluZyByZWxvY3MgYXJlLCBidXQgdGhleSBhcmUgZGVmaW5lZAotICAgICBvbiBJcml4IDYuICAqLwotCi0gIEhPV1RPIChSX01JUFNfU0NOX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TQ05fRElTUCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1JFTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfQUREX0lNTUVESUFURSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0FERF9JTU1FRElBVEUiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19QSlVNUCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QSlVNUCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1JFTEdPVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUxHT1QiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHJvdGVjdGVkIGp1bXAgY29udmVyc2lvbi4gIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGhpbnQuICBObyAKLSAgICAgcmVsb2NhdGlvbiBpcyByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3MuICAqLwotICBIT1dUTyAoUl9NSVBTX0pBTFIsCSAgICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0pBTFIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBUaGUgcmVsb2NhdGlvbiB0YWJsZSB1c2VkIGZvciBTSFRfUkVMQSBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsYVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19OT05FIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgcmVsb2NhdGlvbi4gICovCi0gIEhPV1RPIChSX01JUFNfMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18xNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTXzMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgc3ltYm9sIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX1JFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfUkVMMzIiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDI2IGJpdCBicmFuY2ggYWRkcmVzcy4gICovCi0gIEhPV1RPIChSX01JUFNfMjYsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIAkJCS8qIFRoaXMgbmVlZHMgY29tcGxleCBvdmVyZmxvdwotCQkJCSAgIGRldGVjdGlvbiwgYmVjYXVzZSB0aGUgdXBwZXIgZm91cgotCQkJCSAgIGJpdHMgbXVzdCBtYXRjaCB0aGUgUEMuICAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU18yNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgzZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIHN5bWJvbCB2YWx1ZS4gICovCi0gIEhPV1RPIChSX01JUFNfSEkxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSEkxNiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogTG93IDE2IGJpdHMgb2Ygc3ltYm9sIHZhbHVlLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19MTzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MTzE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHUCByZWxhdGl2ZSByZWZlcmVuY2UuICAqLwotICBIT1dUTyAoUl9NSVBTX0dQUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HUFJFTDE2IiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBsaXRlcmFsIHNlY3Rpb24uICAqLwotICBIT1dUTyAoUl9NSVBTX0xJVEVSQUwsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBfYmZkX21pcHNfZWxmX2dwcmVsMTZfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19MSVRFUkFMIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFJlZmVyZW5jZSB0byBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IFRoaXMgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1QxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1QxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTYgYml0IFBDIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfUEMxNiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1BDMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBjYWxsIHRocm91Z2ggZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTEwxNiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IEdQIHJlbGF0aXZlIHJlZmVyZW5jZS4gICovCi0gIEhPV1RPIChSX01JUFNfR1BSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgX2JmZF9taXBzX2VsZl9ncHJlbDMyX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR1BSRUwzMiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgICB7IDEzIH0sCi0gICAgeyAxNCB9LAotICAgIHsgMTUgfSwKLQotICAvKiBBIDUgYml0IHNoaWZ0IGZpZWxkLiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TSElGVDUsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgNiwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1NISUZUNSIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2MwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2IGJpdCBzaGlmdCBmaWVsZC4gICovCi0gIC8qIEZJWE1FOiBUaGlzIGlzIG5vdCBoYW5kbGVkIGNvcnJlY3RseTsgYSBzcGVjaWFsIGZ1bmN0aW9uIGlzCi0gICAgIG5lZWRlZCB0byBwdXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSByaWdodCBwbGFjZS4gICovCi0gIEhPV1RPIChSX01JUFNfU0hJRlQ2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDYsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TSElGVDYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDdjNCwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKFJfTUlQU182NCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTXzY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBEaXNwbGFjZW1lbnQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfRElTUCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0RJU1AiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIERpc3BsYWNlbWVudCB0byBwYWdlIHBvaW50ZXIgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19HT1RfUEFHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX1BBR0UiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIE9mZnNldCBmcm9tIHBhZ2UgcG9pbnRlciBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0dPVF9PRlNULAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19HT1RfT0ZTVCIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSGlnaCAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0hJMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfR09UX0xPMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfR09UX0xPMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDY0IGJpdCBzdWJzdHJhY3Rpb24uICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19TVUIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TVUIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIE1JTlVTX09ORSwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEluc2VydCB0aGUgYWRkZW5kIGFzIGFuIGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSU5TRVJUX0EsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19JTlNFUlRfQSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBJbnNlcnQgdGhlIGFkZGVuZCBhcyBhbiBpbnN0cnVjdGlvbiwgYW5kIGNoYW5nZSBhbGwgcmVsb2NhdGlvbnMKLSAgICAgdG8gcmVmZXIgdG8gdGhlIG9sZCBpbnN0cnVjdGlvbiBhdCB0aGUgYWRkcmVzcy4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0lOU0VSVF9CLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX01JUFNfSU5TRVJUX0IiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogRGVsZXRlIGEgMzIgYml0IGluc3RydWN0aW9uLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfREVMRVRFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0RFTEVURSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlciB2YWx1ZSBvZiBhIDY0IGJpdCBhZGRlbmQuICAqLwotICAvKiBGSVhNRTogTm90IGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLSAgSE9XVE8gKFJfTUlQU19ISUdIRVIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0hJR0hFUiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBHZXQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgYSA2NCBiaXQgYWRkZW5kLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfSElHSEVTVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19ISUdIRVNUIiwJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEhpZ2ggMTYgYml0cyBvZiBkaXNwbGFjZW1lbnQgaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4gICovCi0gIC8qIEZJWE1FOiBOb3QgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICBIT1dUTyAoUl9NSVBTX0NBTExfSEkxNiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19DQUxMX0hJMTYiLAkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIExvdyAxNiBiaXRzIG9mIGRpc3BsYWNlbWVudCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgLyogRklYTUU6IE5vdCBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0gIEhPV1RPIChSX01JUFNfQ0FMTF9MTzE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0NBTExfTE8xNiIsCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDBmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhlIHJlbWFpbmluZyByZWxvY3MgYXJlLCBidXQgdGhleSBhcmUgZGVmaW5lZAotICAgICBvbiBJcml4IDYuICAqLwotCi0gIEhPV1RPIChSX01JUFNfU0NOX0RJU1AsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19TQ05fRElTUCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1JFTDE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX1JFTDE2IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX01JUFNfQUREX0lNTUVESUFURSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0FERF9JTU1FRElBVEUiLCAvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfTUlQU19QSlVNUCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19QSlVNUCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9NSVBTX1JFTEdPVCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfTUlQU19SRUxHT1QiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHJvdGVjdGVkIGp1bXAgY29udmVyc2lvbi4gIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIGhpbnQuICBObyAKLSAgICAgcmVsb2NhdGlvbiBpcyByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3MuICAqLwotICBIT1dUTyAoUl9NSVBTX0pBTFIsCSAgICAgICAgLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9NSVBTX0pBTFIiLAkgICAgICAgIC8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi19OwotCi0vKiBTd2FwIGluIGEgTUlQUyA2NC1iaXQgUmVsIHJlbG9jLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHNfZWxmNjRfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKnNyYzsKLSAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGJmZF9oX2dldF82NCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9vZmZzZXQpOwotICBkc3QtPnJfc3ltID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3N5bSk7Ci0gIGRzdC0+cl9zc3ltID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfc3N5bSk7Ci0gIGRzdC0+cl90eXBlMyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUzKTsKLSAgZHN0LT5yX3R5cGUyID0gYmZkX2hfZ2V0XzggKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfdHlwZTIpOwotICBkc3QtPnJfdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUpOwotfQotCi0vKiBTd2FwIGluIGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2NhX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIGRzdC0+cl9vZmZzZXQgPSBiZmRfaF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX3N5bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9zeW0pOwotICBkc3QtPnJfc3N5bSA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3NzeW0pOwotICBkc3QtPnJfdHlwZTMgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlMyk7Ci0gIGRzdC0+cl90eXBlMiA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX3R5cGUyKTsKLSAgZHN0LT5yX3R5cGUgPSBiZmRfaF9nZXRfOCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl90eXBlKTsKLSAgZHN0LT5yX2FkZGVuZCA9IGJmZF9oX2dldF9zaWduZWRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfYWRkZW5kKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi0vKiBTd2FwIG91dCBhIE1JUFMgNjQtYml0IFJlbCByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGY2NF9NaXBzX0ludGVybmFsX1JlbCAqc3JjOwotICAgICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCAqZHN0OwotewotICBiZmRfaF9wdXRfNjQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIChiZmRfYnl0ZSAqKSBkc3QtPnJfb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnJfc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3N5bSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfc3N5bSwgKGJmZF9ieXRlICopIGRzdC0+cl9zc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMywgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMyk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZTIsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZTIpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZSk7Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFN3YXAgb3V0IGEgTUlQUyA2NC1iaXQgUmVsYSByZWxvYy4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX2VsZjY0X3N3YXBfcmVsb2NhX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSAqZHN0OwotewotICBiZmRfaF9wdXRfNjQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIChiZmRfYnl0ZSAqKSBkc3QtPnJfb2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnJfc3ltLCAoYmZkX2J5dGUgKikgZHN0LT5yX3N5bSk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfc3N5bSwgKGJmZF9ieXRlICopIGRzdC0+cl9zc3ltKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+cl90eXBlMywgKGJmZF9ieXRlICopIGRzdC0+cl90eXBlMyk7Ci0gIGJmZF9oX3B1dF84IChhYmZkLCBzcmMtPnJfdHlwZTIsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZTIpOwotICBiZmRfaF9wdXRfOCAoYWJmZCwgc3JjLT5yX3R5cGUsIChiZmRfYnl0ZSAqKSBkc3QtPnJfdHlwZSk7Ci0gIGJmZF9oX3B1dF82NCAoYWJmZCwgc3JjLT5yX2FkZGVuZCwgKGJmZF9ieXRlICopIGRzdC0+cl9hZGRlbmQpOwotfQotCi0vKiBBIG1hcHBpbmcgZnJvbSBCRkQgcmVsb2MgdHlwZXMgdG8gTUlQUyBFTEYgcmVsb2MgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZWxmX3JlbG9jX21hcAotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgZW51bSBlbGZfbWlwc19yZWxvY190eXBlIGVsZl9yZWxvY192YWw7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9yZWxvY19tYXAgbWlwc19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfTUlQU19OT05FLCB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9NSVBTXzE2IH0sCi0gIHsgQkZEX1JFTE9DXzMyLCBSX01JUFNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfNjQsIFJfTUlQU182NCB9LAotICB7IEJGRF9SRUxPQ19DVE9SLCBSX01JUFNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfTUlQU19SRUwzMiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0pNUCwgUl9NSVBTXzI2IH0sCi0gIHsgQkZEX1JFTE9DX0hJMTZfUywgUl9NSVBTX0hJMTYgfSwKLSAgeyBCRkRfUkVMT0NfTE8xNiwgUl9NSVBTX0xPMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HUFJFTCwgUl9NSVBTX0dQUkVMMTYgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBSX01JUFNfTElURVJBTCB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBSX01JUFNfR09UMTYgfSwKLSAgeyBCRkRfUkVMT0NfMTZfUENSRUwsIFJfTUlQU19QQzE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfQ0FMTDE2LCBSX01JUFNfQ0FMTDE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR1BSRUwzMiwgUl9NSVBTX0dQUkVMMzIgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiwgUl9NSVBTX0dPVF9ISTE2IH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIFJfTUlQU19HT1RfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNiwgUl9NSVBTX0NBTExfSEkxNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNiwgUl9NSVBTX0NBTExfTE8xNiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX1NVQiwgUl9NSVBTX1NVQiB9LAotICB7IEJGRF9SRUxPQ19NSVBTX0dPVF9QQUdFLCBSX01JUFNfR09UX1BBR0UgfSwKLSAgeyBCRkRfUkVMT0NfTUlQU19HT1RfT0ZTVCwgUl9NSVBTX0dPVF9PRlNUIH0sCi0gIHsgQkZEX1JFTE9DX01JUFNfR09UX0RJU1AsIFJfTUlQU19HT1RfRElTUCB9Ci19OwotCi0vKiBHaXZlbiBhIEJGRCByZWxvYyB0eXBlLCByZXR1cm4gYSBob3d0byBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1taXBzX2VsZjY0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChtaXBzX3JlbG9jX21hcCkgLyBzaXplb2YgKHN0cnVjdCBlbGZfcmVsb2NfbWFwKTsgaSsrKQotICAgIHsKLSAgICAgIGlmIChtaXBzX3JlbG9jX21hcFtpXS5iZmRfcmVsb2NfdmFsID09IGNvZGUpCi0JewotCSAgaW50IHY7Ci0KLQkgIHYgPSAoaW50KSBtaXBzX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsOwotCSAgcmV0dXJuICZtaXBzX2VsZjY0X2hvd3RvX3RhYmxlX3JlbFt2XTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBTaW5jZSBlYWNoIGVudHJ5IGluIGFuIFNIVF9SRUwgb3IgU0hUX1JFTEEgc2VjdGlvbiBjYW4gcmVwcmVzZW50IHVwCi0gICB0byB0aHJlZSByZWxvY3MsIHdlIG11c3QgdGVsbCB0aGUgdXNlciB0byBhbGxvY2F0ZSBtb3JlIHNwYWNlLiAgKi8KLQotc3RhdGljIGxvbmcKLW1pcHNfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIChzZWMtPnJlbG9jX2NvdW50ICogMyArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0vKiBSZWFkIHRoZSByZWxvY2F0aW9ucyBmcm9tIG9uZSByZWxvYyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywgcmVsX2hkcikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLXsKLSAgUFRSIGFsbG9jYXRlZCA9IE5VTEw7Ci0gIGJmZF9ieXRlICpuYXRpdmVfcmVsb2NzOwotICBhcmVsZW50ICpyZWxlbnRzOwotICBhcmVsZW50ICpyZWxlbnQ7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGludCBlbnRzaXplOwotICByZWxvY19ob3d0b190eXBlICpob3d0b190YWJsZTsKLQotICBhbGxvY2F0ZWQgPSAoUFRSKSBiZmRfbWFsbG9jIChyZWxfaGRyLT5zaF9zaXplKTsKLSAgaWYgKGFsbG9jYXRlZCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgcmVsX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkIChhbGxvY2F0ZWQsIDEsIHJlbF9oZHItPnNoX3NpemUsIGFiZmQpICE9IHJlbF9oZHItPnNoX3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIG5hdGl2ZV9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYWxsb2NhdGVkOwotCi0gIHJlbGVudHMgPSBhc2VjdC0+cmVsb2NhdGlvbiArIGFzZWN0LT5yZWxvY19jb3VudDsKLQotICBlbnRzaXplID0gcmVsX2hkci0+c2hfZW50c2l6ZTsKLSAgQkZEX0FTU0VSVCAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsKQotCSAgICAgIHx8IGVudHNpemUgPT0gc2l6ZW9mIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEpKTsKLQotICBjb3VudCA9IHJlbF9oZHItPnNoX3NpemUgLyBlbnRzaXplOwotCi0gIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpKQotICAgIGhvd3RvX3RhYmxlID0gbWlwc19lbGY2NF9ob3d0b190YWJsZV9yZWw7Ci0gIGVsc2UKLSAgICBob3d0b190YWJsZSA9IG1pcHNfZWxmNjRfaG93dG9fdGFibGVfcmVsYTsKLQotICByZWxlbnQgPSByZWxlbnRzOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgbmF0aXZlX3JlbG9jcyArPSBlbnRzaXplKQotICAgIHsKLSAgICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSByZWxhOwotICAgICAgYm9vbGVhbiB1c2VkX3N5bSwgdXNlZF9zc3ltOwotICAgICAgaW50IGlyOwotCi0gICAgICBpZiAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSkpCi0JbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9pbiAoYWJmZCwKLQkJCQkgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhICopIG5hdGl2ZV9yZWxvY3MsCi0JCQkJICAgJnJlbGEpOwotICAgICAgZWxzZQotCXsKLQkgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsIHJlbDsKLQotCSAgbWlwc19lbGY2NF9zd2FwX3JlbG9jX2luIChhYmZkLAotCQkJCSAgICAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwgKikgbmF0aXZlX3JlbG9jcywKLQkJCQkgICAgJnJlbCk7Ci0JICByZWxhLnJfb2Zmc2V0ID0gcmVsLnJfb2Zmc2V0OwotCSAgcmVsYS5yX3N5bSA9IHJlbC5yX3N5bTsKLQkgIHJlbGEucl9zc3ltID0gcmVsLnJfc3N5bTsKLQkgIHJlbGEucl90eXBlMyA9IHJlbC5yX3R5cGUzOwotCSAgcmVsYS5yX3R5cGUyID0gcmVsLnJfdHlwZTI7Ci0JICByZWxhLnJfdHlwZSA9IHJlbC5yX3R5cGU7Ci0JICByZWxhLnJfYWRkZW5kID0gMDsKLQl9Ci0KLSAgICAgIC8qIEVhY2ggZW50cnkgcmVwcmVzZW50cyB1cCB0byB0aHJlZSBhY3R1YWwgcmVsb2NhdGlvbnMuICAqLwotCi0gICAgICB1c2VkX3N5bSA9IGZhbHNlOwotICAgICAgdXNlZF9zc3ltID0gZmFsc2U7Ci0gICAgICBmb3IgKGlyID0gMDsgaXIgPCAzOyBpcisrKQotCXsKLQkgIGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSB0eXBlOwotCi0JICBzd2l0Y2ggKGlyKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIGNhc2UgMDoKLQkgICAgICB0eXBlID0gKGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSkgcmVsYS5yX3R5cGU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICB0eXBlID0gKGVudW0gZWxmX21pcHNfcmVsb2NfdHlwZSkgcmVsYS5yX3R5cGUyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI6Ci0JICAgICAgdHlwZSA9IChlbnVtIGVsZl9taXBzX3JlbG9jX3R5cGUpIHJlbGEucl90eXBlMzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAodHlwZSA9PSBSX01JUFNfTk9ORSkKLQkgICAgewotCSAgICAgIC8qIFRoZXJlIGFyZSBubyBtb3JlIHJlbG9jYXRpb25zIGluIHRoaXMgZW50cnkuICBJZiB0aGlzCi0gICAgICAgICAgICAgICAgIGlzIHRoZSBmaXJzdCBlbnRyeSwgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIGR1bW15Ci0gICAgICAgICAgICAgICAgIHJlbG9jYXRpb24gc28gdGhhdCB0aGUgZ2VuZXJpYyBsaW5rZXIga25vd3MgdGhhdAotICAgICAgICAgICAgICAgICB0aGVyZSBoYXMgYmVlbiBhIGJyZWFrIGluIHRoZSBzZXF1ZW5jZSBvZiByZWxvY2F0aW9ucwotICAgICAgICAgICAgICAgICBhcHBseWluZyB0byBhIHBhcnRpY3VsYXIgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKGlyID09IDApCi0JCXsKLQkJICByZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkJICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQ7Ci0JCSAgZWxzZQotCQkgICAgcmVsZW50LT5hZGRyZXNzID0gcmVsYS5yX29mZnNldCAtIGFzZWN0LT52bWE7Ci0JCSAgcmVsZW50LT5hZGRlbmQgPSAwOwotCQkgIHJlbGVudC0+aG93dG8gPSAmaG93dG9fdGFibGVbKGludCkgUl9NSVBTX05PTkVdOwotCQkgICsrcmVsZW50OwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogU29tZSB0eXBlcyByZXF1aXJlIHN5bWJvbHMsIHdoZXJlYXMgc29tZSBkbyBub3QuICAqLwotCSAgc3dpdGNoICh0eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgUl9NSVBTX05PTkU6Ci0JICAgIGNhc2UgUl9NSVBTX0xJVEVSQUw6Ci0JICAgIGNhc2UgUl9NSVBTX0lOU0VSVF9BOgotCSAgICBjYXNlIFJfTUlQU19JTlNFUlRfQjoKLQkgICAgY2FzZSBSX01JUFNfREVMRVRFOgotCSAgICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghIHVzZWRfc3ltKQotCQl7Ci0JCSAgaWYgKHJlbGEucl9zeW0gPT0gMCkKLQkJICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGFzeW1ib2wgKipwcywgKnM7Ci0KLQkJICAgICAgcHMgPSBzeW1ib2xzICsgcmVsYS5yX3N5bSAtIDE7Ci0JCSAgICAgIHMgPSAqcHM7Ci0JCSAgICAgIGlmICgocy0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JCQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gcHM7Ci0JCSAgICAgIGVsc2UKLQkJCXJlbGVudC0+c3ltX3B0cl9wdHIgPSBzLT5zZWN0aW9uLT5zeW1ib2xfcHRyX3B0cjsKLQkJICAgIH0KLQotCQkgIHVzZWRfc3ltID0gdHJ1ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKCEgdXNlZF9zc3ltKQotCQl7Ci0JCSAgc3dpdGNoIChyZWxhLnJfc3N5bSkKLQkJICAgIHsKLQkJICAgIGNhc2UgUlNTX1VOREVGOgotCQkgICAgICByZWxlbnQtPnN5bV9wdHJfcHRyID0KLQkJCWJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSBSU1NfR1A6Ci0JCSAgICBjYXNlIFJTU19HUDA6Ci0JCSAgICBjYXNlIFJTU19MT0M6Ci0JCSAgICAgIC8qIEZJWE1FOiBJIHRoaW5rIHRoZXNlIG5lZWQgdG8gYmUgaGFuZGxlZCB1c2luZwotICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWwgaG93dG8gc3RydWN0dXJlcy4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKDApOwotCQkgICAgICBicmVhazsKLQotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgQkZEX0FTU0VSVCAoMCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgdXNlZF9zc3ltID0gdHJ1ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJcmVsZW50LT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuCi0JICAgICBvYmplY3QgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3IKLQkgICAgIHNoYXJlZCBsaWJyYXJ5LiAgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzCi0JICAgICBzZWN0aW9uIHJlbGF0aXZlLiAgKi8KLQkgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDApCi0JICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQ7Ci0JICBlbHNlCi0JICAgIHJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQgLSBhc2VjdC0+dm1hOwotCi0JICByZWxlbnQtPmFkZGVuZCA9IHJlbGEucl9hZGRlbmQ7Ci0KLQkgIHJlbGVudC0+aG93dG8gPSAmaG93dG9fdGFibGVbKGludCkgdHlwZV07Ci0KLQkgICsrcmVsZW50OwotCX0KLSAgICB9Ci0KLSAgYXNlY3QtPnJlbG9jX2NvdW50ICs9IHJlbGVudCAtIHJlbGVudHM7Ci0KLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgdGhlIHJlbG9jYXRpb25zLiAgT24gSXJpeCA2LCB0aGVyZSBjYW4gYmUgdHdvIHJlbG9jIHNlY3Rpb25zCi0gICBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICogY29uc3QgZCA9IGVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KTsKLQotICBpZiAoZHluYW1pYykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYXNlY3QtPnJlbG9jYXRpb24gIT0gTlVMTAotICAgICAgfHwgKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotICAgICAgfHwgYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIDMgYXJlbGVudCBzdHJ1Y3R1cmVzIGZvciBlYWNoIFJlbCBzdHJ1Y3R1cmUuICAqLwotICBhc2VjdC0+cmVsb2NhdGlvbiA9ICgoYXJlbGVudCAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLAotCQkJCSAgYXNlY3QtPnJlbG9jX2NvdW50ICogMyAqIHNpemVvZiAoYXJlbGVudCkpKTsKLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBzbHVycF9vbmVfcmVsb2NfdGFibGUgcm91dGluZSBpbmNyZW1lbnRzIHJlbG9jX2NvdW50LiAgKi8KLSAgYXNlY3QtPnJlbG9jX2NvdW50ID0gMDsKLQotICBpZiAoISBtaXBzX2VsZjY0X3NsdXJwX29uZV9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIHN5bWJvbHMsICZkLT5yZWxfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChkLT5yZWxfaGRyMiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG1pcHNfZWxmNjRfc2x1cnBfb25lX3JlbG9jX3RhYmxlIChhYmZkLCBhc2VjdCwgc3ltYm9scywKLQkJCQkJICAgICAgZC0+cmVsX2hkcjIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcmVsb2NhdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbGY2NF93cml0ZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgYm9vbGVhbiAqZmFpbGVkcCA9IChib29sZWFuICopIGRhdGE7Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbGFfaGRyOwotICBFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKmV4dF9yZWxhOwotICB1bnNpZ25lZCBpbnQgaWR4OwotICBhc3ltYm9sICpsYXN0X3N5bSA9IDA7Ci0gIGludCBsYXN0X3N5bV9pZHggPSAwOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKCpmYWlsZWRwKQotICAgIHJldHVybjsKLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFRoZSBsaW5rZXIgYmFja2VuZCB3cml0ZXMgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLCBhbmQgc2V0cyB0aGUKLSAgICAgcmVsb2NfY291bnQgZmllbGQgdG8gemVybyB0byBpbmhpYml0IHdyaXRpbmcgdGhlbSBoZXJlLiAgQWxzbywKLSAgICAgc29tZXRpbWVzIHRoZSBTRUNfUkVMT0MgZmxhZyBnZXRzIHNldCBldmVuIHdoZW4gdGhlcmUgYXJlbid0IGFueQotICAgICByZWxvY3MuICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICAvKiBXZSBjYW4gY29tYmluZSB1cCB0byB0aHJlZSByZWxvY3MgdGhhdCByZWZlciB0byB0aGUgc2FtZSBhZGRyZXNzCi0gICAgIGlmIHRoZSBsYXR0ZXIgcmVsb2NzIGhhdmUgbm8gYXNzb2NpYXRlZCBzeW1ib2wuICAqLwotICBjb3VudCA9IDA7Ci0gIGZvciAoaWR4ID0gMDsgaWR4IDwgc2VjLT5yZWxvY19jb3VudDsgaWR4KyspCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgICsrY291bnQ7Ci0KLSAgICAgIGFkZHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF0tPmFkZHJlc3M7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnI7Ci0KLQkgIGlmIChpZHggKyAxID49IHNlYy0+cmVsb2NfY291bnQpCi0JICAgIGJyZWFrOwotCSAgciA9IHNlYy0+b3JlbG9jYXRpb25baWR4ICsgMV07Ci0JICBpZiAoci0+YWRkcmVzcyAhPSBhZGRyCi0JICAgICAgfHwgISBiZmRfaXNfYWJzX3NlY3Rpb24gKCgqci0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKQotCSAgICAgIHx8ICgqci0+c3ltX3B0cl9wdHIpLT52YWx1ZSAhPSAwKQotCSAgICBicmVhazsKLQotCSAgLyogV2UgY2FuIG1lcmdlIHRoZSByZWxvYyBhdCBJRFggKyAxIHdpdGggdGhlIHJlbG9jIGF0IElEWC4gICovCi0KLQkgICsraWR4OwotCX0KLSAgICB9Ci0KLSAgcmVsYV9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoc2VjKS0+cmVsX2hkcjsKLQotICByZWxhX2hkci0+c2hfc2l6ZSA9IHJlbGFfaGRyLT5zaF9lbnRzaXplICogY291bnQ7Ci0gIHJlbGFfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsYV9oZHItPnNoX3NpemUpOwotICBpZiAocmVsYV9oZHItPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgKmZhaWxlZHAgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBleHRfcmVsYSA9IChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgcmVsYV9oZHItPmNvbnRlbnRzOwotICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNlYy0+cmVsb2NfY291bnQ7IGlkeCsrLCBleHRfcmVsYSsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnB0cjsKLSAgICAgIEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsYSBpbnRfcmVsYTsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGludCBuOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLQotICAgICAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSBmaWxlLCBhbmQgYWJzb2x1dGUgZm9yIGFuIGV4ZWN1dGFibGUgZmlsZSBvciBzaGFyZWQgbGlicmFyeS4KLQkgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQlpbnRfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzczsKLSAgICAgIGVsc2UKLQlpbnRfcmVsYS5yX29mZnNldCA9IHB0ci0+YWRkcmVzcyArIHNlYy0+dm1hOwotCi0gICAgICBzeW0gPSAqcHRyLT5zeW1fcHRyX3B0cjsKLSAgICAgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JbiA9IGxhc3Rfc3ltX2lkeDsKLSAgICAgIGVsc2UKLQl7Ci0JICBsYXN0X3N5bSA9IHN5bTsKLQkgIG4gPSBfYmZkX2VsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIChhYmZkLCAmc3ltKTsKLQkgIGlmIChuIDwgMCkKLQkgICAgewotCSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JfQotCi0gICAgICBpbnRfcmVsYS5yX3N5bSA9IG47Ci0KLSAgICAgIGludF9yZWxhLnJfYWRkZW5kID0gcHRyLT5hZGRlbmQ7Ci0KLSAgICAgIGludF9yZWxhLnJfc3N5bSA9IFJTU19VTkRFRjsKLQotICAgICAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgJiYgISBfYmZkX2VsZl92YWxpZGF0ZV9yZWxvYyAoYWJmZCwgcHRyKSkKLQl7Ci0JICAqZmFpbGVkcCA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpbnRfcmVsYS5yX3R5cGUgPSBwdHItPmhvd3RvLT50eXBlOwotICAgICAgaW50X3JlbGEucl90eXBlMiA9IChpbnQpIFJfTUlQU19OT05FOwotICAgICAgaW50X3JlbGEucl90eXBlMyA9IChpbnQpIFJfTUlQU19OT05FOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnI7Ci0KLQkgIGlmIChpZHggKyAxID49IHNlYy0+cmVsb2NfY291bnQpCi0JICAgIGJyZWFrOwotCSAgciA9IHNlYy0+b3JlbG9jYXRpb25baWR4ICsgMV07Ci0JICBpZiAoci0+YWRkcmVzcyAhPSBwdHItPmFkZHJlc3MKLQkgICAgICB8fCAhIGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pCi0JICAgICAgfHwgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlICE9IDApCi0JICAgIGJyZWFrOwotCi0JICAvKiBXZSBjYW4gbWVyZ2UgdGhlIHJlbG9jIGF0IElEWCArIDEgd2l0aCB0aGUgcmVsb2MgYXQgSURYLiAgKi8KLQotCSAgaWYgKGkgPT0gMCkKLQkgICAgaW50X3JlbGEucl90eXBlMiA9IHItPmhvd3RvLT50eXBlOwotCSAgZWxzZQotCSAgICBpbnRfcmVsYS5yX3R5cGUzID0gci0+aG93dG8tPnR5cGU7Ci0KLQkgICsraWR4OwotCX0KLQotICAgICAgbWlwc19lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsICZpbnRfcmVsYSwgZXh0X3JlbGEpOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChleHRfcmVsYSAtIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbGEgKikgcmVsYV9oZHItPmNvbnRlbnRzCi0JICAgICAgPT0gY291bnQpOwotfQotDAotLyogSGFuZGxlIGEgNjQtYml0IE1JUFMgRUxGIHNwZWNpZmljIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaGRyLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmICghIF9iZmRfbWlwc19lbGZfc2VjdGlvbl9mcm9tX3NoZHIgKGFiZmQsIGhkciwgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZvciBhIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbiwgbG9vayBmb3IgYSBPREtfUkVHSU5GTyBlbnRyeSwgYW5kCi0gICAgIHNldCB0aGUgZ3AgdmFsdWUgYmFzZWQgb24gd2hhdCB3ZSBmaW5kLiAgV2UgbWF5IHNlZSBib3RoCi0gICAgIFNIVF9NSVBTX1JFR0lORk8gYW5kIFNIVF9NSVBTX09QVElPTlMvT0RLX1JFR0lORk87IGluIHRoYXQgY2FzZSwKLSAgICAgdGhleSBzaG91bGQgYWdyZWUuICAqLwotICBpZiAoaGRyLT5zaF90eXBlID09IFNIVF9NSVBTX09QVElPTlMpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLCAqbCwgKmxlbmQ7Ci0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGhkci0+c2hfc2l6ZSk7Ci0gICAgICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGhkci0+YmZkX3NlY3Rpb24sIGNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgaGRyLT5zaF9zaXplKSkKLQl7Ci0JICBmcmVlIChjb250ZW50cyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbCA9IGNvbnRlbnRzOwotICAgICAgbGVuZCA9IGNvbnRlbnRzICsgaGRyLT5zaF9zaXplOwotICAgICAgd2hpbGUgKGwgKyBzaXplb2YgKEVsZl9FeHRlcm5hbF9PcHRpb25zKSA8PSBsZW5kKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9PcHRpb25zIGludG9wdDsKLQotCSAgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9PcHRpb25zICopIGwsCi0JCQkJCSZpbnRvcHQpOwotCSAgaWYgKGludG9wdC5raW5kID09IE9ES19SRUdJTkZPKQotCSAgICB7Ci0JICAgICAgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyBpbnRyZWc7Ci0KLQkgICAgICBiZmRfbWlwc19lbGY2NF9zd2FwX3JlZ2luZm9faW4KLQkJKGFiZmQsCi0JCSAoKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikKLQkJICAobCArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKSksCi0JCSAmaW50cmVnKTsKLQkgICAgICBlbGZfZ3AgKGFiZmQpID0gaW50cmVnLnJpX2dwX3ZhbHVlOwotCSAgICB9Ci0JICBsICs9IGludG9wdC5zaXplOwotCX0KLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdvcmsgb3ZlciBhIHNlY3Rpb24ganVzdCBiZWZvcmUgd3JpdGluZyBpdCBvdXQuICBXZSB1cGRhdGUgdGhlIEdQCi0gICB2YWx1ZSBpbiB0aGUgU0hUX01JUFNfT1BUSU9OUyBzZWN0aW9uIGJhc2VkIG9uIHRoZSB2YWx1ZSB3ZSBhcmUKLSAgIHVzaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW1pcHNfZWxmNjRfc2VjdGlvbl9wcm9jZXNzaW5nIChhYmZkLCBoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLXsKLSAgaWYgKGhkci0+c2hfdHlwZSA9PSBTSFRfTUlQU19PUFRJT05TCi0gICAgICAmJiBoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pICE9IE5VTEwKLSAgICAgICYmIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpjb250ZW50cywgKmwsICpsZW5kOwotCi0gICAgICAvKiBXZSBzdG9yZWQgdGhlIHNlY3Rpb24gY29udGVudHMgaW4gdGhlIGVsZl9zZWN0aW9uX2RhdGEgdGRhdGEKLQkgZmllbGQgaW4gdGhlIHNldF9zZWN0aW9uX2NvbnRlbnRzIHJvdXRpbmUuICBXZSBzYXZlIHRoZQotCSBzZWN0aW9uIGNvbnRlbnRzIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byByZWFkIHRoZW0gYWdhaW4uCi0JIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IGVsZl9ncCBpcyBzZXQsIHNvIHdlIGNhbiBsb29rCi0JIHRocm91Z2ggdGhlIHNlY3Rpb24gY29udGVudHMgdG8gc2VlIGlmIHRoZXJlIGlzIGFuCi0JIE9ES19SRUdJTkZPIHN0cnVjdHVyZS4gICovCi0KLSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGVsZl9zZWN0aW9uX2RhdGEgKGhkci0+YmZkX3NlY3Rpb24pLT50ZGF0YTsKLSAgICAgIGwgPSBjb250ZW50czsKLSAgICAgIGxlbmQgPSBjb250ZW50cyArIGhkci0+c2hfc2l6ZTsKLSAgICAgIHdoaWxlIChsICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykgPD0gbGVuZCkKLQl7Ci0JICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBpbnRvcHQ7Ci0KLQkgIGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfaW4gKGFiZmQsIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBsLAotCQkJCQkmaW50b3B0KTsKLQkgIGlmIChpbnRvcHQua2luZCA9PSBPREtfUkVHSU5GTykKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIGJ1Zls4XTsKLQotCSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJCSAgICAoaGRyLT5zaF9vZmZzZXQKLQkJCSAgICAgKyAobCAtIGNvbnRlbnRzKQotCQkJICAgICArIHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpCi0JCQkgICAgICsgKHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbykgLSA4KSksCi0JCQkgICAgIFNFRUtfU0VUKSA9PSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJmZF9oX3B1dF82NCAoYWJmZCwgZWxmX2dwIChhYmZkKSwgYnVmKTsKLQkgICAgICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDgsIGFiZmQpICE9IDgpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgbCArPSBpbnRvcHQuc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX21pcHNfZWxmX3NlY3Rpb25fcHJvY2Vzc2luZyAoYWJmZCwgaGRyKTsKLX0KLQwKLS8qIElyaXggNiBkZWZpbmVzIGEgYnJhbmQgbmV3IGFyY2hpdmUgbWFwIGZvcm1hdCwgc28gdGhhdCB0aGV5IGNhbgotICAgaGF2ZSBhcmNoaXZlcyBtb3JlIHRoYW4gNCBHQiBpbiBzaXplLiAgKi8KLQotLyogUmVhZCBhbiBJcml4IDYgYXJtYXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF9zbHVycF9hcm1hcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgYXJ0ZGF0YSAqYXJkYXRhID0gYmZkX2FyZGF0YSAoYWJmZCk7Ci0gIGNoYXIgbmV4dG5hbWVbMTddOwotICBmaWxlX3B0ciBhcmhkcnBvczsKLSAgYmZkX3NpemVfdHlwZSBpLCBwYXJzZWRfc2l6ZSwgbnN5bXosIHN0cmluZ3NpemUsIGNhcnN5bV9zaXplLCBwdHJzaXplOwotICBzdHJ1Y3QgYXJlbHRkYXRhICptYXBkYXRhOwotICBiZmRfYnl0ZSBpbnRfYnVmWzhdOwotICBjaGFyICpzdHJpbmdiYXNlOwotICBiZmRfYnl0ZSAqcmF3X2FybWFwID0gTlVMTDsKLSAgY2Fyc3ltICpjYXJzeW1zOwotCi0gIGFyZGF0YS0+c3ltZGVmcyA9IE5VTEw7Ci0KLSAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBlbGVtZW50LiAgKi8KLSAgYXJoZHJwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGkgPSBiZmRfcmVhZCAoKFBUUikgbmV4dG5hbWUsIDEsIDE2LCBhYmZkKTsKLSAgaWYgKGkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGkgIT0gMTYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAtIDE2LCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQXJjaGl2ZXMgd2l0aCB0cmFkaXRpb25hbCBhcm1hcHMgYXJlIHN0aWxsIHBlcm1pdHRlZC4gICovCi0gIGlmIChzdHJuY21wIChuZXh0bmFtZSwgIi8gICAgICAgICAgICAgICAiLCAxNikgPT0gMCkKLSAgICByZXR1cm4gYmZkX3NsdXJwX2FybWFwIChhYmZkKTsKLQotICBpZiAoc3RybmNtcCAobmV4dG5hbWUsICIvU1lNNjQvICAgICAgICAgIiwgMTYpICE9IDApCi0gICAgewotICAgICAgYmZkX2hhc19tYXAgKGFiZmQpID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbWFwZGF0YSA9IChzdHJ1Y3QgYXJlbHRkYXRhICopIF9iZmRfcmVhZF9hcl9oZHIgKGFiZmQpOwotICBpZiAobWFwZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcGFyc2VkX3NpemUgPSBtYXBkYXRhLT5wYXJzZWRfc2l6ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIChQVFIpIG1hcGRhdGEpOwotCi0gIGlmIChiZmRfcmVhZCAoaW50X2J1ZiwgMSwgOCwgYWJmZCkgIT0gOCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbnN5bXogPSBiZmRfZ2V0YjY0IChpbnRfYnVmKTsKLSAgc3RyaW5nc2l6ZSA9IHBhcnNlZF9zaXplIC0gOCAqIG5zeW16IC0gODsKLQotICBjYXJzeW1fc2l6ZSA9IG5zeW16ICogc2l6ZW9mIChjYXJzeW0pOwotICBwdHJzaXplID0gOCAqIG5zeW16OwotCi0gIGFyZGF0YS0+c3ltZGVmcyA9IChjYXJzeW0gKikgYmZkX3phbGxvYyAoYWJmZCwgY2Fyc3ltX3NpemUgKyBzdHJpbmdzaXplICsgMSk7Ci0gIGlmIChhcmRhdGEtPnN5bWRlZnMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNhcnN5bXMgPSBhcmRhdGEtPnN5bWRlZnM7Ci0gIHN0cmluZ2Jhc2UgPSAoKGNoYXIgKikgYXJkYXRhLT5zeW1kZWZzKSArIGNhcnN5bV9zaXplOwotCi0gIHJhd19hcm1hcCA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHB0cnNpemUpOwotICBpZiAocmF3X2FybWFwID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGJmZF9yZWFkIChyYXdfYXJtYXAsIDEsIHB0cnNpemUsIGFiZmQpICE9IHB0cnNpemUKLSAgICAgIHx8IGJmZF9yZWFkIChzdHJpbmdiYXNlLCAxLCBzdHJpbmdzaXplLCBhYmZkKSAhPSBzdHJpbmdzaXplKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBuc3ltejsgaSsrKQotICAgIHsKLSAgICAgIGNhcnN5bXMtPmZpbGVfb2Zmc2V0ID0gYmZkX2dldGI2NCAocmF3X2FybWFwICsgaSAqIDgpOwotICAgICAgY2Fyc3ltcy0+bmFtZSA9IHN0cmluZ2Jhc2U7Ci0gICAgICBzdHJpbmdiYXNlICs9IHN0cmxlbiAoc3RyaW5nYmFzZSkgKyAxOwotICAgICAgKytjYXJzeW1zOwotICAgIH0KLSAgKnN0cmluZ2Jhc2UgPSAnXDAnOwotCi0gIGFyZGF0YS0+c3ltZGVmX2NvdW50ID0gbnN5bXo7Ci0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYXJoZHJwb3MgKyBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgcGFyc2VkX3NpemU7Ci0KLSAgYmZkX2hhc19tYXAgKGFiZmQpID0gdHJ1ZTsKLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJhd19hcm1hcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChyYXdfYXJtYXAgIT0gTlVMTCkKLSAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmF3X2FybWFwKTsKLSAgaWYgKGFyZGF0YS0+c3ltZGVmcyAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBhcmRhdGEtPnN5bWRlZnMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBJcml4IDYgYXJtYXAuICBUaGUgSXJpeCA2IHRvb2xzIGFyZSBzdXBwb3NlZCB0byBiZQotICAgYWJsZSB0byBoYW5kbGUgb3JkaW5hcnkgRUxGIGFybWFwcywgYnV0IGF0IGxlYXN0IG9uIElyaXggNi4yIHRoZQotICAgbGlua2VyIGNyYXNoZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWlwc19lbGY2NF93cml0ZV9hcm1hcCAoYXJjaCwgZWxlbmd0aCwgbWFwLCBzeW1ib2xfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphcmNoOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICB1bnNpZ25lZCBpbnQgcmFubGlic2l6ZSA9IChzeW1ib2xfY291bnQgKiA4KSArIDg7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzaXplID0gc3RyaWR4OwotICB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IHN0cmluZ3NpemUgKyByYW5saWJzaXplOwotICBmaWxlX3B0ciBhcmNoaXZlX21lbWJlcl9maWxlX3B0cjsKLSAgYmZkICpjdXJyZW50ID0gYXJjaC0+YXJjaGl2ZV9oZWFkOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIHN0cnVjdCBhcl9oZHIgaGRyOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IHBhZGRpbmc7Ci0gIGJmZF9ieXRlIGJ1Zls4XTsKLQotICBwYWRkaW5nID0gQkZEX0FMSUdOIChtYXBzaXplLCA4KSAtIG1hcHNpemU7Ci0gIG1hcHNpemUgKz0gcGFkZGluZzsKLQotICAvKiB3b3JrIG91dCB3aGVyZSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgd2lsbCBnbyBpbiB0aGUgYXJjaGl2ZSAqLwotICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciA9IChtYXBzaXplCi0JCQkgICAgICsgZWxlbmd0aAotCQkJICAgICArIHNpemVvZiAoc3RydWN0IGFyX2hkcikKLQkJCSAgICAgKyBTQVJNQUcpOwotCi0gIG1lbXNldCAoKGNoYXIgKikgKCZoZHIpLCAwLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKTsKLSAgc3RyY3B5IChoZHIuYXJfbmFtZSwgIi9TWU02NC8iKTsKLSAgc3ByaW50ZiAoaGRyLmFyX3NpemUsICIlLTEwZCIsIChpbnQpIG1hcHNpemUpOwotICBzcHJpbnRmIChoZHIuYXJfZGF0ZSwgIiVsZCIsIChsb25nKSB0aW1lIChOVUxMKSk7Ci0gIC8qIFRoaXMsIGF0IGxlYXN0LCBpcyB3aGF0IEludGVsIGNvZmYgc2V0cyB0aGUgdmFsdWVzIHRvLjogKi8KLSAgc3ByaW50ZiAoKGhkci5hcl91aWQpLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoKGhkci5hcl9naWQpLCAiJWQiLCAwKTsKLSAgc3ByaW50ZiAoKGhkci5hcl9tb2RlKSwgIiUtN28iLCAodW5zaWduZWQpIDApOwotICBzdHJuY3B5IChoZHIuYXJfZm1hZywgQVJGTUFHLCAyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLQotICAvKiBXcml0ZSB0aGUgYXIgaGVhZGVyIGZvciB0aGlzIGl0ZW0gYW5kIHRoZSBudW1iZXIgb2Ygc3ltYm9scyAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFyY2gpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfcHV0YjY0IChzeW1ib2xfY291bnQsIGJ1Zik7Ci0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOCwgYXJjaCkgIT0gOCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVHdvIHBhc3NlcywgZmlyc3Qgd3JpdGUgdGhlIGZpbGUgb2Zmc2V0cyBmb3IgZWFjaCBzeW1ib2wgLQotICAgICByZW1lbWJlcmluZyB0aGF0IGVhY2ggb2Zmc2V0IGlzIG9uIGEgdHdvIGJ5dGUgYm91bmRhcnkuICAqLwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZmlsZSBvZmZzZXQgZm9yIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBlYWNoCi0gICAgIHN5bWJvbCwgYW5kIHJlbWVtYmVyIHRvIGtlZXAgdGhlIG9mZnNldHMgcGFkZGVkIG91dC4gICovCi0KLSAgY3VycmVudCA9IGFyY2gtPmFyY2hpdmVfaGVhZDsKLSAgY291bnQgPSAwOwotICB3aGlsZSAoY3VycmVudCAhPSAoYmZkICopIE5VTEwgJiYgY291bnQgPCBzeW1ib2xfY291bnQpCi0gICAgewotICAgICAgLyogRm9yIGVhY2ggc3ltYm9sIHdoaWNoIGlzIHVzZWQgZGVmaW5lZCBpbiB0aGlzIG9iamVjdCwgd3JpdGUgb3V0Ci0JIHRoZSBvYmplY3QgZmlsZSdzIGFkZHJlc3MgaW4gdGhlIGFyY2hpdmUgKi8KLQotICAgICAgd2hpbGUgKCgoYmZkICopIChtYXBbY291bnRdKS5wb3MpID09IGN1cnJlbnQpCi0JewotCSAgYmZkX3B1dGI2NCAoYXJjaGl2ZV9tZW1iZXJfZmlsZV9wdHIsIGJ1Zik7Ci0JICBpZiAoYmZkX3dyaXRlIChidWYsIDEsIDgsIGFyY2gpICE9IDgpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGNvdW50Kys7Ci0JfQotICAgICAgLyogQWRkIHNpemUgb2YgdGhpcyBhcmNoaXZlIGVudHJ5ICovCi0gICAgICBhcmNoaXZlX21lbWJlcl9maWxlX3B0ciArPSAoYXJlbHRfc2l6ZSAoY3VycmVudCkKLQkJCQkgICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSk7Ci0gICAgICAvKiByZW1lbWJlciBhYm91dCB0aGUgZXZlbiBhbGlnbm1lbnQgKi8KLSAgICAgIGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICs9IGFyY2hpdmVfbWVtYmVyX2ZpbGVfcHRyICUgMjsKLSAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OwotICAgIH0KLQotICAvKiBub3cgd3JpdGUgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcyAqLwotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzeW1ib2xfY291bnQ7IGNvdW50KyspCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoKm1hcFtjb3VudF0ubmFtZSkgKyAxOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgqbWFwW2NvdW50XS5uYW1lLCAxLCBsZW4sIGFyY2gpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzcGVjIHNheXMgdGhhdCB0aGlzIHNob3VsZCBiZSBwYWRkZWQgdG8gYW4gOCBieXRlIGJvdW5kYXJ5LgotICAgICBIb3dldmVyLCB0aGUgSXJpeCA2LjIgdG9vbHMgZG8gbm90IGFwcGVhciB0byBkbyB0aGlzLiAgKi8KLSAgd2hpbGUgKHBhZGRpbmcgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgiIiwgMSwgMSwgYXJjaCkgIT0gMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAtLXBhZGRpbmc7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRUNPRkYgc3dhcHBpbmcgcm91dGluZXMuICBUaGVzZSBhcmUgdXNlZCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUKLSAgIC5tZGVidWcgc2VjdGlvbiwgd2hpY2ggaXMgaW4gdGhlIEVDT0ZGIGRlYnVnZ2luZyBmb3JtYXQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwIG1pcHNfZWxmNjRfZWNvZmZfZGVidWdfc3dhcCA9Ci17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBtYWdpY1N5bTIsCi0gIC8qIEFsaWdubWVudCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBFLmcuLCA0LiAgKi8KLSAgOCwKLSAgLyogU2l6ZXMgb2YgZXh0ZXJuYWwgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBzaXplb2YgKHN0cnVjdCBoZHJfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZG5yX2V4dCksCi0gIHNpemVvZiAoc3RydWN0IHBkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCBzeW1fZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3Qgb3B0X2V4dCksCi0gIHNpemVvZiAoc3RydWN0IGZkcl9leHQpLAotICBzaXplb2YgKHN0cnVjdCByZmRfZXh0KSwKLSAgc2l6ZW9mIChzdHJ1Y3QgZXh0X2V4dCksCi0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIGluIGV4dGVybmFsIHN5bWJvbGljIGRhdGEuICAqLwotICBlY29mZl9zd2FwX2hkcl9pbiwKLSAgZWNvZmZfc3dhcF9kbnJfaW4sCi0gIGVjb2ZmX3N3YXBfcGRyX2luLAotICBlY29mZl9zd2FwX3N5bV9pbiwKLSAgZWNvZmZfc3dhcF9vcHRfaW4sCi0gIGVjb2ZmX3N3YXBfZmRyX2luLAotICBlY29mZl9zd2FwX3JmZF9pbiwKLSAgZWNvZmZfc3dhcF9leHRfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF90aXJfaW4sCi0gIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luLAotICAvKiBGdW5jdGlvbnMgdG8gc3dhcCBvdXQgZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIGVjb2ZmX3N3YXBfaGRyX291dCwKLSAgZWNvZmZfc3dhcF9kbnJfb3V0LAotICBlY29mZl9zd2FwX3Bkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfc3ltX291dCwKLSAgZWNvZmZfc3dhcF9vcHRfb3V0LAotICBlY29mZl9zd2FwX2Zkcl9vdXQsCi0gIGVjb2ZmX3N3YXBfcmZkX291dCwKLSAgZWNvZmZfc3dhcF9leHRfb3V0LAotICBfYmZkX2Vjb2ZmX3N3YXBfdGlyX291dCwKLSAgX2JmZF9lY29mZl9zd2FwX3JuZHhfb3V0LAotICAvKiBGdW5jdGlvbiB0byByZWFkIGluIHN5bWJvbGljIGRhdGEuICAqLwotICBfYmZkX21pcHNfZWxmX3JlYWRfZWNvZmZfaW5mbwotfTsKLQwKLS8qIFJlbG9jYXRpb25zIGluIHRoZSA2NCBiaXQgTUlQUyBFTEYgQUJJIGFyZSBtb3JlIGNvbXBsZXggdGhhbiBpbgotICAgc3RhbmRhcmQgRUxGLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byByZWRpcmVjdCB0aGUgcmVsb2NhdGlvbgotICAgaGFuZGxpbmcgcm91dGluZXMuICAqLwotCi1jb25zdCBzdHJ1Y3QgZWxmX3NpemVfaW5mbyBtaXBzX2VsZjY0X3NpemVfaW5mbyA9Ci17Ci0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfRWhkciksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUGhkciksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU2hkciksCi0gIHNpemVvZiAoRWxmNjRfTWlwc19FeHRlcm5hbF9SZWwpLAotICBzaXplb2YgKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSksCi0gIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfU3ltKSwKLSAgc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9EeW4pLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9Ob3RlKSwKLSAgNjQsCQkvKiBhcmNoX3NpemUgKi8KLSAgOCwJCS8qIGZpbGVfYWxpZ24gKi8KLSAgRUxGQ0xBU1M2NCwKLSAgRVZfQ1VSUkVOVCwKLSAgYmZkX2VsZjY0X3dyaXRlX291dF9waGRycywKLSAgYmZkX2VsZjY0X3dyaXRlX3NoZHJzX2FuZF9laGRyLAotICBtaXBzX2VsZjY0X3dyaXRlX3JlbG9jcywKLSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCwKLSAgbWlwc19lbGY2NF9zbHVycF9yZWxvY190YWJsZSwKLSAgYmZkX2VsZjY0X3NsdXJwX3N5bWJvbF90YWJsZSwKLSAgYmZkX2VsZjY0X3N3YXBfZHluX2luCi19OwotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNCQliZmRfZWxmNjRfbGl0dGxlbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkiZWxmNjQtbGl0dGxlbWlwcyIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0JCQliZmRfZWxmNjRfYmlnbWlwc192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkJImVsZjY0LWJpZ21pcHMiCi0jZGVmaW5lIEVMRl9BUkNICQkJYmZkX2FyY2hfbWlwcwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFCQlFTV9NSVBTCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRQkJCTB4MTAwMAotI2RlZmluZSBlbGZfYmFja2VuZF9zaXplX2luZm8JCW1pcHNfZWxmNjRfc2l6ZV9pbmZvCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQlfYmZkX21pcHNfZWxmX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyCW1pcHNfZWxmNjRfc2VjdGlvbl9mcm9tX3NoZHIKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwlfYmZkX21pcHNfZWxmX2Zha2Vfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIFwKLQkJCQkJX2JmZF9taXBzX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCW1pcHNfZWxmNjRfc2VjdGlvbl9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nCV9iZmRfbWlwc19lbGZfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZyBcCi0JCQkJCV9iZmRfbWlwc19lbGZfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwotI2RlZmluZSBlbGZfYmFja2VuZF9lY29mZl9kZWJ1Z19zd2FwCSZtaXBzX2VsZjY0X2Vjb2ZmX2RlYnVnX3N3YXAKLQotI2RlZmluZSBiZmRfZWxmNjRfZmluZF9uZWFyZXN0X2xpbmUJX2JmZF9taXBzX2VsZl9maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBiZmRfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIG1pcHNfZWxmNjRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfcmVsb2NfdHlwZV9sb29rdXAJbWlwc19lbGY2NF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBiZmRfZWxmNjRfc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9taXBzX2VsZl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmNjRfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfY29weV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0JCQkJCV9iZmRfbWlwc19lbGZfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmNjRfYmZkX3NldF9wcml2YXRlX2ZsYWdzCV9iZmRfbWlwc19lbGZfc2V0X3ByaXZhdGVfZmxhZ3MKLQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9mdW5jdGlvbnMKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfc2x1cnBfYXJtYXAJbWlwc19lbGY2NF9zbHVycF9hcm1hcAotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIGJmZF9lbGY2NF9hcmNoaXZlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLQkJCQlfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV90cnVuY2F0ZV9hcm5hbWUgXAotCQkJCQlfYmZkX2FyY2hpdmVfY29mZl90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfd3JpdGVfYXJtYXAJbWlwc19lbGY2NF93cml0ZV9hcm1hcAotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9yZWFkX2FyX2hkcglfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkcgotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotCQkJCV9iZmRfYXJjaGl2ZV9jb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4IFwKLQkJCQkJX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBiZmRfZWxmNjRfYXJjaGl2ZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotCQkJCQlfYmZkX2FyY2hpdmVfY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgYmZkX2VsZjY0X2FyY2hpdmVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBcCi0JCQkJX2JmZF9hcmNoaXZlX2NvZmZfdXBkYXRlX2FybWFwX3RpbWVzdGFtcAotCi0jaW5jbHVkZSAiZWxmNjQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmNjQtc3BhcmMuYyBiL2JmZC9lbGY2NC1zcGFyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY2YmNlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGY2NC1zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI3NSArMCwwIEBACi0vKiBTUEFSQy1zcGVjaWZpYyBzdXBwb3J0IGZvciA2NC1iaXQgRUxGCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFRoaXMgaXMgZGVmaW5lZCBpZiBvbmUgd2FudHMgdG8gYnVpbGQgdXB3YXJkIGNvbXBhdGlibGUgYmluYXJpZXMKLSAgIHdpdGggdGhlIG9yaWdpbmFsIHNwYXJjNjQtZWxmIHRvb2xjaGFpbi4gIFRoZSBzdXBwb3J0IGlzIGtlcHQgaW4gZm9yCi0gICBub3cgYnV0IGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gIGRqZSA5NzA5MzAgICovCi0vKiNkZWZpbmUgU1BBUkM2NF9PTERfUkVMT0NTKi8KLQotI2luY2x1ZGUgImVsZi9zcGFyYy5oIgotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlLiAgKi8KLSNkZWZpbmUgTUlOVVNfT05FICh+IChiZmRfdm1hKSAwKQotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpOwotc3RhdGljIHZvaWQgc3BhcmM2NF9lbGZfaW5mb190b19ob3d0bwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0KLXN0YXRpYyB2b2lkIHNwYXJjNjRfZWxmX2J1aWxkX3BsdAotICBQQVJBTVMoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldAotICBQQVJBTVMoKGludCkpOwotc3RhdGljIGJmZF92bWEgc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQKLSAgUEFSQU1TKChpbnQsIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MKLSAgUEFSQU1TKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKnNlYywKLQkgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9hZGp1c3RfZHluaW5keAotICBQQVJBTVMoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBFbGZfSW50ZXJuYWxfUmVsYSAqLCBFbGZfSW50ZXJuYWxfU3ltICosIGFzZWN0aW9uICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcGFyYzY0X2VsZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotDAotLyogVGhlIHJlbG9jYXRpb24gImhvd3RvIiB0YWJsZS4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX25vdHN1cF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIHNwYXJjX2VsZl9oaXgyMl9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3BhcmNfZWxmX2xveDEwX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLCBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtdID0KLXsKLSAgSE9XVE8oUl9TUEFSQ19OT05FLCAgICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX05PTkUiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfOCwgICAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ184IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzE2LCAgICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTYiLCAgICAgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18zMiwgICAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzMyIiwgICAgICBmYWxzZSwwLDB4ZmZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDgsICAgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19ESVNQOCIsICAgZmFsc2UsMCwweDAwMDAwMGZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AxNiwgICAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfRElTUDE2IiwgIGZhbHNlLDAsMHgwMDAwZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQMzIsICAgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1AzMiIsICBmYWxzZSwwLDB4MDBmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AzMCwgICAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19XRElTUDMwIiwgZmFsc2UsMCwweDNmZmZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMjIsICAgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfV0RJU1AyMiIsIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISTIyLCAgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hJMjIiLCAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMjIsICAgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18yMiIsICAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzEzLCAgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTMiLCAgICAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MTzEwLCAgICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0xPMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTAsICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19HT1QxMCIsICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDEzLCAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR09UMTMiLCAgIGZhbHNlLDAsMHgwMDAwMWZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QyMiwgICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0dPVDIyIiwgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMxMCwgICAgICAwLDIsMTAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQzEwIiwgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDMjIsICAgICAxMCwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUEMyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XUExUMzAsICAgIDIsMiwzMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dQTFQzMCIsICBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfQ09QWSwgICAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19DT1BZIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dMT0JfREFULCAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfR0xPQl9EQVQiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19KTVBfU0xPVCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0pNUF9TTE9UIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVMQVRJVkUsICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19SRUxBVElWRSIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMzIsICAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUEzMiIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSNpZm5kZWYgU1BBUkM2NF9PTERfUkVMT0NTCi0gIC8qIFRoZXNlIGFyZW4ndCBpbXBsZW1lbnRlZCB5ZXQuICAqLwotICBIT1dUTyhSX1NQQVJDX1BMVDMyLCAgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUExUMzIiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfSElQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19ISVBMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19MT1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX0xPUExUMTAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDUExUMzIsICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX25vdHN1cF9yZWxvYywgIlJfU1BBUkNfUENQTFQzMiIsICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENQTFQyMiwgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QQ1BMVDIyIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ1BMVDEwLCAgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIHNwYXJjX2VsZl9ub3RzdXBfcmVsb2MsICJSX1NQQVJDX1BDUExUMTAiLCAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotI2VuZGlmCi0gIEhPV1RPKFJfU1BBUkNfMTAsICAgICAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ18xMCIsICAgICAgZmFsc2UsMCwweDAwMDAwM2ZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzExLCAgICAgICAgMCwyLDExLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfMTEiLCAgICAgIGZhbHNlLDAsMHgwMDAwMDdmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ182NCwgICAgICAgIDAsNCw2NCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzY0IiwgICAgICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfT0xPMTAsICAgICAwLDIsMTMsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICBzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19PTE8xMCIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hIMjIsICAgICA0MiwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ITTEwLCAgICAgMzIsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfTE0yMiwgICAgIDEwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19MTTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1BDX0hIMjIsICA0MiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfUENfSEgyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQ19ITTEwLCAgMzIsMiwxMCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1BDX0hNMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUENfTE0yMiwgIDEwLDIsMjIsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19QQ19MTTIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dESVNQMTYsICAgMiwyLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgc3BhcmNfZWxmX3dkaXNwMTZfcmVsb2MsIlJfU1BBUkNfV0RJU1AxNiIsIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDE5LCAgIDIsMiwxOSx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX1dESVNQMTkiLCBmYWxzZSwwLDB4MDAwN2ZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVU5VU0VEXzQyLCAwLDAsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VTlVTRURfNDIiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ183LCAgICAgICAgIDAsMiwgNyxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDXzciLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwN2YsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfNSwgICAgICAgICAwLDIsIDUsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ181IiwgICAgICAgZmFsc2UsMCwweDAwMDAwMDFmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzYsICAgICAgICAgMCwyLCA2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfNiIsICAgICAgIGZhbHNlLDAsMHgwMDAwMDAzZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQNjQsICAgIDAsNCw2NCx0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX0RJU1A2NCIsICBmYWxzZSwwLE1JTlVTX09ORSwgdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUExUNjQsICAgICAwLDQsNjQsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19QTFQ2NCIsICAgZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19ISVgyMiwgICAgIDAsNCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLHNwYXJjX2VsZl9oaXgyMl9yZWxvYywgICJSX1NQQVJDX0hJWDIyIiwgICBmYWxzZSwwLE1JTlVTX09ORSwgZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0xPWDEwLCAgICAgMCw0LCAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgc3BhcmNfZWxmX2xveDEwX3JlbG9jLCAgIlJfU1BBUkNfTE9YMTAiLCAgIGZhbHNlLDAsTUlOVVNfT05FLCBmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfSDQ0LCAgICAgIDIyLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19INDQiLCAgICAgZmFsc2UsMCwweDAwM2ZmZmZmLGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19NNDQsICAgICAgMTIsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgICJSX1NQQVJDX000NCIsICAgICBmYWxzZSwwLDB4MDAwMDAzZmYsZmFsc2UpLAotICBIT1dUTyhSX1NQQVJDX0w0NCwgICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfTDQ0IiwgICAgIGZhbHNlLDAsMHgwMDAwMGZmZixmYWxzZSksCi0gIEhPV1RPKFJfU1BBUkNfUkVHSVNURVIsICAwLDQsIDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxzcGFyY19lbGZfbm90c3VwX3JlbG9jLCAiUl9TUEFSQ19SRUdJU1RFUiIsZmFsc2UsMCxNSU5VU19PTkUsIGZhbHNlKSwKLSAgSE9XVE8oUl9TUEFSQ19VQTY0LCAgICAgICAgMCw0LDY0LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAgIlJfU1BBUkNfVUE2NCIsICAgICAgZmFsc2UsMCxNSU5VU19PTkUsIHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1VBMTYsICAgICAgICAwLDEsMTYsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCxiZmRfZWxmX2dlbmVyaWNfcmVsb2MsICAiUl9TUEFSQ19VQTE2IiwgICAgICBmYWxzZSwwLDB4MDAwMGZmZmYsdHJ1ZSkKLX07Ci0KLXN0cnVjdCBlbGZfcmVsb2NfbWFwIHsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGJmZF9yZWxvY192YWw7Ci0gIHVuc2lnbmVkIGNoYXIgZWxmX3JlbG9jX3ZhbDsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgZWxmX3JlbG9jX21hcCBzcGFyY19yZWxvY19tYXBbXSA9Ci17Ci0gIHsgQkZEX1JFTE9DX05PTkUsIFJfU1BBUkNfTk9ORSwgfSwKLSAgeyBCRkRfUkVMT0NfMTYsIFJfU1BBUkNfMTYsIH0sCi0gIHsgQkZEX1JFTE9DXzgsIFJfU1BBUkNfOCB9LAotICB7IEJGRF9SRUxPQ184X1BDUkVMLCBSX1NQQVJDX0RJU1A4IH0sCi0gIHsgQkZEX1JFTE9DX0NUT1IsIFJfU1BBUkNfNjQgfSwKLSAgeyBCRkRfUkVMT0NfMzIsIFJfU1BBUkNfMzIgfSwKLSAgeyBCRkRfUkVMT0NfMzJfUENSRUwsIFJfU1BBUkNfRElTUDMyIH0sCi0gIHsgQkZEX1JFTE9DX0hJMjIsIFJfU1BBUkNfSEkyMiB9LAotICB7IEJGRF9SRUxPQ19MTzEwLCBSX1NQQVJDX0xPMTAsIH0sCi0gIHsgQkZEX1JFTE9DXzMyX1BDUkVMX1MyLCBSX1NQQVJDX1dESVNQMzAgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkMyMiwgUl9TUEFSQ18yMiB9LAotICB7IEJGRF9SRUxPQ19TUEFSQzEzLCBSX1NQQVJDXzEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEwLCBSX1NQQVJDX0dPVDEwIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDEzLCBSX1NQQVJDX0dPVDEzIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX0dPVDIyLCBSX1NQQVJDX0dPVDIyIH0sCi0gIHsgQkZEX1JFTE9DX1NQQVJDX1BDMTAsIFJfU1BBUkNfUEMxMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19QQzIyLCBSX1NQQVJDX1BDMjIgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwLCBSX1NQQVJDX1dQTFQzMCB9LAotICB7IEJGRF9SRUxPQ19TUEFSQ19DT1BZLCBSX1NQQVJDX0NPUFkgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQsIFJfU1BBUkNfR0xPQl9EQVQgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QsIFJfU1BBUkNfSk1QX1NMT1QgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfUkVMQVRJVkUsIFJfU1BBUkNfUkVMQVRJVkUgfSwKLSAgeyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMiwgUl9TUEFSQ19XRElTUDIyIH0sCi0gIC8qID8/PyBEb2Vzbid0IGR3YXJmIHVzZSB0aGlzPyAgKi8KLS8qeyBCRkRfUkVMT0NfU1BBUkNfVUEzMiwgUl9TUEFSQ19VQTMyIH0sIG5vdCB1c2VkPz8gKi8KLSAge0JGRF9SRUxPQ19TUEFSQ18xMCwgUl9TUEFSQ18xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfMTEsIFJfU1BBUkNfMTF9LAotICB7QkZEX1JFTE9DX1NQQVJDXzY0LCBSX1NQQVJDXzY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19PTE8xMCwgUl9TUEFSQ19PTE8xMH0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfSEgyMiwgUl9TUEFSQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ITTEwLCBSX1NQQVJDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0xNMjIsIFJfU1BBUkNfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfUENfSEgyMiwgUl9TUEFSQ19QQ19ISDIyfSwKLSAge0JGRF9SRUxPQ19TUEFSQ19QQ19ITTEwLCBSX1NQQVJDX1BDX0hNMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIsIFJfU1BBUkNfUENfTE0yMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNiwgUl9TUEFSQ19XRElTUDE2fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19XRElTUDE5LCBSX1NQQVJDX1dESVNQMTl9LAotICB7QkZEX1JFTE9DX1NQQVJDXzcsIFJfU1BBUkNfN30sCi0gIHtCRkRfUkVMT0NfU1BBUkNfNSwgUl9TUEFSQ181fSwKLSAge0JGRF9SRUxPQ19TUEFSQ182LCBSX1NQQVJDXzZ9LAotICB7QkZEX1JFTE9DX1NQQVJDX0RJU1A2NCwgUl9TUEFSQ19ESVNQNjR9LAotICB7QkZEX1JFTE9DX1NQQVJDX1BMVDY0LCBSX1NQQVJDX1BMVDY0fSwKLSAge0JGRF9SRUxPQ19TUEFSQ19ISVgyMiwgUl9TUEFSQ19ISVgyMn0sCi0gIHtCRkRfUkVMT0NfU1BBUkNfTE9YMTAsIFJfU1BBUkNfTE9YMTB9LAotICB7QkZEX1JFTE9DX1NQQVJDX0g0NCwgUl9TUEFSQ19INDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX000NCwgUl9TUEFSQ19NNDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX0w0NCwgUl9TUEFSQ19MNDR9LAotICB7QkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSLCBSX1NQQVJDX1JFR0lTVEVSfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotc3BhcmM2NF9lbGZfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzcGFyY19yZWxvY19tYXApIC8gc2l6ZW9mIChzdHJ1Y3QgZWxmX3JlbG9jX21hcCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3BhcmNfcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLQlyZXR1cm4gJnNwYXJjNjRfZWxmX2hvd3RvX3RhYmxlWyhpbnQpIHNwYXJjX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotc3BhcmM2NF9lbGZfaW5mb190b19ob3d0byAoYWJmZCwgY2FjaGVfcHRyLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBFbGY2NF9JbnRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIEJGRF9BU1NFUlQgKEVMRjY0X1JfVFlQRSAoZHN0LT5yX2luZm8pIDwgKHVuc2lnbmVkIGludCkgUl9TUEFSQ19tYXhfc3RkKTsKLSAgY2FjaGVfcHRyLT5ob3d0byA9ICZzcGFyYzY0X2VsZl9ob3d0b190YWJsZVtFTEY2NF9SX1RZUEUgKGRzdC0+cl9pbmZvKV07Ci19Ci0MCi0vKiBVdGlsaXR5IGZvciBwZXJmb3JtaW5nIHRoZSBzdGFuZGFyZCBpbml0aWFsIHdvcmsgb2YgYW4gaW5zdHJ1Y3Rpb24KLSAgIHJlbG9jYXRpb24uCi0gICAqUFJFTE9DQVRJT04gd2lsbCBjb250YWluIHRoZSByZWxvY2F0ZWQgaXRlbS4KLSAgICpQSU5TTiB3aWxsIGNvbnRhaW4gdGhlIGluc3RydWN0aW9uIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgIElmIHRoZSByZXN1bHQgaXMgYGJmZF9yZWxvY19vdGhlcicgdGhlIGNhbGxlciBjYW4gY29udGludWUgd2l0aAotICAgcGVyZm9ybWluZyB0aGUgcmVsb2NhdGlvbi4gIE90aGVyd2lzZSBpdCBtdXN0IHN0b3AgYW5kIHJldHVybiB0aGUKLSAgIHZhbHVlIHRvIGl0cyBjYWxsZXIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1pbml0X2luc25fcmVsb2MgKGFiZmQsCi0JCSByZWxvY19lbnRyeSwKLQkJIHN5bWJvbCwKLQkJIGRhdGEsCi0JCSBpbnB1dF9zZWN0aW9uLAotCQkgb3V0cHV0X2JmZCwKLQkJIHByZWxvY2F0aW9uLAotCQkgcGluc24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGJmZF92bWEgKnByZWxvY2F0aW9uOwotICAgICBiZmRfdm1hICpwaW5zbjsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLQotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopIE5VTEwKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwCi0gICAgICAmJiAoISBob3d0by0+cGFydGlhbF9pbnBsYWNlCi0JICB8fCByZWxvY19lbnRyeS0+YWRkZW5kID09IDApKQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX29rOwotICAgIH0KLQotICAvKiBUaGlzIHdvcmtzIGJlY2F1c2UgcGFydGlhbF9pbnBsYWNlID09IGZhbHNlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgcmVsb2NhdGlvbiA9IChzeW1ib2wtPnZhbHVlCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlKQotICAgIHsKLSAgICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgKnByZWxvY2F0aW9uID0gcmVsb2NhdGlvbjsKLSAgKnBpbnNuID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0gIHJldHVybiBiZmRfcmVsb2Nfb3RoZXI7Ci19Ci0KLS8qIEZvciB1bnN1cHBvcnRlZCByZWxvY3MuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1zcGFyY19lbGZfbm90c3VwX3JlbG9jIChhYmZkLAotCQkJcmVsb2NfZW50cnksCi0JCQlzeW1ib2wsCi0JCQlkYXRhLAotCQkJaW5wdXRfc2VjdGlvbiwKLQkJCW91dHB1dF9iZmQsCi0JCQllcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgcmV0dXJuIGJmZF9yZWxvY19ub3RzdXBwb3J0ZWQ7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgV0RJU1AxNiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl93ZGlzcDE2X3JlbG9jIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkJIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF92bWEgaW5zbjsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHN0YXR1czsKLQotICBzdGF0dXMgPSBpbml0X2luc25fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwgb3V0cHV0X2JmZCwgJnJlbG9jYXRpb24sICZpbnNuKTsKLSAgaWYgKHN0YXR1cyAhPSBiZmRfcmVsb2Nfb3RoZXIpCi0gICAgcmV0dXJuIHN0YXR1czsKLQotICBpbnNuID0gKGluc24gJiB+MHgzMDNmZmYpIHwgKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCi0JCQkgICAgICAgfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgcmVsb2NhdGlvbiA8IC0gMHg0MDAwMAotICAgICAgfHwgKGJmZF9zaWduZWRfdm1hKSByZWxvY2F0aW9uID4gMHgzZmZmZikKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIHRoZSBISVgyMiByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9oaXgyMl9yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIHJlbG9jYXRpb24gXj0gTUlOVVNfT05FOwotICBpbnNuID0gKGluc24gJiB+MHgzZmZmZmYpIHwgKChyZWxvY2F0aW9uID4+IDEwKSAmIDB4M2ZmZmZmKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5zbiwgKGJmZF9ieXRlICopIGRhdGEgKyByZWxvY19lbnRyeS0+YWRkcmVzcyk7Ci0KLSAgaWYgKChyZWxvY2F0aW9uICYgfiAoYmZkX3ZtYSkgMHhmZmZmZmZmZikgIT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX292ZXJmbG93OwotICBlbHNlCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLX0KLQotLyogSGFuZGxlIHRoZSBMT1gxMCByZWxvYy4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLXNwYXJjX2VsZl9sb3gxMF9yZWxvYyAoYWJmZCwKLQkJICAgICAgIHJlbG9jX2VudHJ5LAotCQkgICAgICAgc3ltYm9sLAotCQkgICAgICAgZGF0YSwKLQkJICAgICAgIGlucHV0X3NlY3Rpb24sCi0JCSAgICAgICBvdXRwdXRfYmZkLAotCQkgICAgICAgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgY2hhciAqKmVycm9yX21lc3NhZ2U7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgYmZkX3ZtYSBpbnNuOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgc3RhdHVzOwotCi0gIHN0YXR1cyA9IGluaXRfaW5zbl9yZWxvYyAoYWJmZCwgcmVsb2NfZW50cnksIHN5bWJvbCwgZGF0YSwKLQkJCSAgICBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLCAmcmVsb2NhdGlvbiwgJmluc24pOwotICBpZiAoc3RhdHVzICE9IGJmZF9yZWxvY19vdGhlcikKLSAgICByZXR1cm4gc3RhdHVzOwotCi0gIGluc24gPSAoaW5zbiAmIH4weDFmZmYpIHwgMHgxYzAwIHwgKHJlbG9jYXRpb24gJiAweDNmZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGluc24sIChiZmRfYnl0ZSAqKSBkYXRhICsgcmVsb2NfZW50cnktPmFkZHJlc3MpOwotCi0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0MCi0vKiBQTFQvR09UIHN0dWZmICovCi0KLS8qIEJvdGggdGhlIGhlYWRlcnMgYW5kIHRoZSBlbnRyaWVzIGFyZSBpY2FjaGUgYWxpZ25lZC4gICovCi0jZGVmaW5lIFBMVF9FTlRSWV9TSVpFCQkzMgotI2RlZmluZSBQTFRfSEVBREVSX1NJWkUJCSg0ICogUExUX0VOVFJZX1NJWkUpCi0jZGVmaW5lIExBUkdFX1BMVF9USFJFU0hPTEQJMzI3NjgKLSNkZWZpbmUgR09UX1JFU0VSVkVEX0VOVFJJRVMJMQotCi0jZGVmaW5lIEVMRl9EWU5BTUlDX0lOVEVSUFJFVEVSICIvdXNyL2xpYi9zcGFyY3Y5L2xkLnNvLjEiCi0KLQotLyogRmlsbCBpbiB0aGUgLnBsdCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNwYXJjNjRfZWxmX2J1aWxkX3BsdCAob3V0cHV0X2JmZCwgY29udGVudHMsIG5lbnRyaWVzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICAgICBpbnQgbmVudHJpZXM7Ci17Ci0gIGNvbnN0IHVuc2lnbmVkIGludCBub3AgPSAweDAxMDAwMDAwOwotICBpbnQgaSwgajsKLSAgCi0gIC8qIFRoZSBmaXJzdCBmb3VyIGVudHJpZXMgYXJlIHJlc2VydmVkLCBhbmQgYXJlIGluaXRpYWxseSB1bmRlZmluZWQuCi0gICAgIFdlIGZpbGwgdGhlbSB3aXRoIGBpbGx0cmFwIDAnIHRvIGZvcmNlIGxkLnNvIHRvIGRvIHNvbWV0aGluZy4gICovCi0KLSAgZm9yIChpID0gMDsgaSA8IFBMVF9IRUFERVJfU0laRS80OyArK2kpCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgY29udGVudHMraSo0KTsKLQotICAvKiBUaGUgZmlyc3QgMzI3NjggZW50cmllcyBhcmUgY2xvc2UgZW5vdWdoIHRvIHBsdDEgdG8gZ2V0IHRoZXJlIHZpYQotICAgICBhIHN0cmFpZ2h0IGJyYW5jaC4gICovCi0KLSAgZm9yIChpID0gNDsgaSA8IExBUkdFX1BMVF9USFJFU0hPTEQgJiYgaSA8IG5lbnRyaWVzOyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqZW50cnkgPSBjb250ZW50cyArIGkgKiBQTFRfRU5UUllfU0laRTsKLSAgICAgIHVuc2lnbmVkIGludCBzZXRoaSwgYmE7Ci0KLSAgICAgIC8qIHNldGhpICguIC0gcGx0MCksICVnMSAqLwotICAgICAgc2V0aGkgPSAweDAzMDAwMDAwIHwgKGkgKiBQTFRfRU5UUllfU0laRSk7Ci0KLSAgICAgIC8qIGJhLGEscHQgJWljYywgcGx0MSAqLwotICAgICAgYmEgPSAweDMwNDgwMDAwIHwgKCgoY29udGVudHMrUExUX0VOVFJZX1NJWkUpIC0gKGVudHJ5KzQpKSAvIDQgJiAweDdmZmZmKTsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgc2V0aGksIGVudHJ5KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGJhLCBlbnRyeSs0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrOCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzEyKTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMTYpOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSsyMCk7Ci0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBub3AsIGVudHJ5KzI0KTsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5vcCwgZW50cnkrMjgpOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRyaWNreSBiaXQuICBFbnRyaWVzIDMyNzY4IGFuZCBoaWdoZXIgYXJlIGdyb3VwZWQgaW4gYmxvY2tzIG9mCi0gICAgIDE2MDogMTYwIGVudHJpZXMgYW5kIDE2MCBwb2ludGVycy4gIFRoaXMgaXMgdG8gc2VwYXJhdGUgY29kZSBmcm9tIGRhdGEsCi0gICAgIHdoaWNoIGlzIG11Y2ggZnJpZW5kbGllciBvbiB0aGUgY2FjaGUuICAqLwotICAKLSAgZm9yICg7IGkgPCBuZW50cmllczsgaSArPSAxNjApCi0gICAgewotICAgICAgaW50IGJsb2NrID0gKGkgKyAxNjAgPD0gbmVudHJpZXMgPyAxNjAgOiBuZW50cmllcyAtIGkpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGJsb2NrOyArK2opCi0JewotCSAgdW5zaWduZWQgY2hhciAqZW50cnksICpwdHI7Ci0JICB1bnNpZ25lZCBpbnQgbGR4OwotCi0JICBlbnRyeSA9IGNvbnRlbnRzICsgaSpQTFRfRU5UUllfU0laRSArIGoqNCo2OwotCSAgcHRyID0gY29udGVudHMgKyBpKlBMVF9FTlRSWV9TSVpFICsgYmxvY2sqNCo2ICsgaio4OwotCi0JICAvKiBsZHggWyVvNyArIHB0ciAtIGVudHJ5KzRdLCAlZzEgKi8KLQkgIGxkeCA9IDB4YzI1YmUwMDAgfCAoKHB0ciAtIGVudHJ5KzQpICYgMHgxZmZmKTsKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg4YTEwMDAwZiwgZW50cnkpOyAgICAvKiBtb3YgJW83LCVnNSAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMHg0MDAwMDAwMiwgZW50cnkrNCk7ICAvKiBjYWxsIC4rOCAqLwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbm9wLCBlbnRyeSs4KTsgICAgICAgICAvKiBub3AgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxkeCwgZW50cnkrMTIpOyAgICAgICAgLyogbGR4IFslbzcrUF0sJWcxICovCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAweDgzYzNjMDAxLCBlbnRyeSsxNik7IC8qIGptcGwgJW83KyVnMSwlZzEgKi8KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDB4OWUxMDAwMDUsIGVudHJ5KzIwKTsgLyogbW92ICVnNSwlbzcgKi8KLQotCSAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgY29udGVudHMgLSBlbnRyeSs0LCBwdHIpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJldHVybiB0aGUgb2Zmc2V0IG9mIGEgcGFydGljdWxhciBwbHQgZW50cnkgd2l0aGluIHRoZSAucGx0IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotc3BhcmM2NF9lbGZfcGx0X2VudHJ5X29mZnNldCAoaW5kZXgpCi0gICAgIGludCBpbmRleDsKLXsKLSAgaW50IGJsb2NrLCBvZnM7Ci0KLSAgaWYgKGluZGV4IDwgTEFSR0VfUExUX1RIUkVTSE9MRCkKLSAgICByZXR1cm4gaW5kZXggKiBQTFRfRU5UUllfU0laRTsKLQotICAvKiBTZWUgYWJvdmUgZm9yIGRldGFpbHMuICAqLwotCi0gIGJsb2NrID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgLyAxNjA7Ci0gIG9mcyA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOwotCi0gIHJldHVybiAoKGJmZF92bWEpKExBUkdFX1BMVF9USFJFU0hPTEQgKyBibG9jayoxNjApICogUExUX0VOVFJZX1NJWkUKLQkgICsgb2ZzICogNio0KTsKLX0KLQotc3RhdGljIGJmZF92bWEKLXNwYXJjNjRfZWxmX3BsdF9wdHJfb2Zmc2V0IChpbmRleCwgbWF4KQotICAgICBpbnQgaW5kZXgsIG1heDsKLXsKLSAgaW50IGJsb2NrLCBvZnMsIGxhc3Q7Ci0KLSAgQkZEX0FTU0VSVChpbmRleCA+PSBMQVJHRV9QTFRfVEhSRVNIT0xEKTsKLQotICAvKiBTZWUgYWJvdmUgZm9yIGRldGFpbHMuICAqLwotCi0gIGJsb2NrID0gKGluZGV4IC0gTEFSR0VfUExUX1RIUkVTSE9MRCkgLyAxNjA7Ci0gIG9mcyA9IChpbmRleCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOwotICBsYXN0ID0gKG1heCAtIExBUkdFX1BMVF9USFJFU0hPTEQpICUgMTYwOwotCi0gIHJldHVybiAoKExBUkdFX1BMVF9USFJFU0hPTEQgKyBibG9jayoxNjApICogUExUX0VOVFJZX1NJWkUKLQkgICsgbGFzdCAqIDYqNAotCSAgKyBvZnMgKiA4KTsKLX0KLQotCi0MCi0vKiBMb29rIHRocm91Z2ggdGhlIHJlbG9jcyBmb3IgYSBzZWN0aW9uIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UsIGFuZAotICAgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgb3IgcHJvY2VkdXJlIGxpbmthZ2UKLSAgIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2NoZWNrX3JlbG9jcyAoYWJmZCwgaW5mbywgc2VjLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpyZWxvY3M7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBiZmRfdm1hICpsb2NhbF9nb3Rfb2Zmc2V0czsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbF9lbmQ7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3JlbGdvdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLQotICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8ICEoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkcjsKLSAgc3ltX2hhc2hlcyA9IGVsZl9zeW1faGFzaGVzIChhYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpOwotCi0gIHNnb3QgPSBOVUxMOwotICBzcmVsZ290ID0gTlVMTDsKLSAgc3JlbG9jID0gTlVMTDsKLQotICByZWxfZW5kID0gcmVsb2NzICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yIChyZWwgPSByZWxvY3M7IHJlbCA8IHJlbF9lbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcl9zeW1uZHggPSBFTEY2NF9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQloID0gTlVMTDsKLSAgICAgIGVsc2UKLQloID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIHN5bXRhYl9oZHItPnNoX2luZm9dOwotCi0gICAgICBzd2l0Y2ggKEVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFRoaXMgc3ltYm9sIHJlcXVpcmVzIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyeS4gICovCi0KLQkgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIENyZWF0ZSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLQkgICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9IGR5bm9iaiA9IGFiZmQ7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChkeW5vYmosIGluZm8pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKHNyZWxnb3QgPT0gTlVMTCAmJiAoaCAhPSBOVUxMIHx8IGluZm8tPnNoYXJlZCkpCi0JICAgIHsKLQkgICAgICBzcmVsZ290ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5yZWxhLmdvdCIpOwotCSAgICAgIGlmIChzcmVsZ290ID09IE5VTEwpCi0JCXsKLQkJICBzcmVsZ290ID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLnJlbGEuZ290Iik7Ci0JCSAgaWYgKHNyZWxnb3QgPT0gTlVMTAotCQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzcmVsZ290LAotCQkJCQkJICAoU0VDX0FMTE9DCi0JCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJCSAgIHwgU0VDX0lOX01FTU9SWQotCQkJCQkJICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkJCSAgIHwgU0VDX1JFQURPTkxZKSkKLQkJICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxnb3QsIDMpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLQkJewotCQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgc3BhY2UgaW4gdGhlIC5nb3QuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaC0+Z290Lm9mZnNldCA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIE1ha2Ugc3VyZSB0aGlzIHN5bWJvbCBpcyBvdXRwdXQgYXMgYSBkeW5hbWljIHN5bWJvbC4gICovCi0JICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBzcmVsZ290LT5fcmF3X3NpemUgKz0gc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9SZWxhKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cnkgZm9yIGEgbG9jYWwKLSAgICAgICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIHNpemVfdCBzaXplOwotCQkgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotCi0JCSAgc2l6ZSA9IHN5bXRhYl9oZHItPnNoX2luZm8gKiBzaXplb2YgKGJmZF92bWEpOwotCQkgIGxvY2FsX2dvdF9vZmZzZXRzID0gKGJmZF92bWEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLQkJICBpZiAobG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBlbGZfbG9jYWxfZ290X29mZnNldHMgKGFiZmQpID0gbG9jYWxfZ290X29mZnNldHM7Ci0JCSAgZm9yIChpID0gMDsgaSA8IHN5bXRhYl9oZHItPnNoX2luZm87IGkrKykKLQkJICAgIGxvY2FsX2dvdF9vZmZzZXRzW2ldID0gKGJmZF92bWEpIC0xOwotCQl9Ci0JICAgICAgaWYgKGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSAhPSAoYmZkX3ZtYSkgLTEpCi0JCXsKLQkJICAvKiBXZSBoYXZlIGFscmVhZHkgYWxsb2NhdGVkIHNwYWNlIGluIHRoZSAuZ290LiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICAgIGxvY2FsX2dvdF9vZmZzZXRzW3Jfc3ltbmR4XSA9IHNnb3QtPl9yYXdfc2l6ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JCXsKLQkJICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIHNoYXJlZCBvYmplY3QsIHdlIG5lZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBhIFJfU1BBUkNfUkVMQVRJVkUgcmVsb2Mgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIGNhbiBhZGp1c3QgdGhpcyBHT1QgZW50cnkuICAqLwotCQkgIHNyZWxnb3QtPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpOwotCQl9Ci0JICAgIH0KLQotCSAgc2dvdC0+X3Jhd19zaXplICs9IDg7Ci0KLSNpZiAwCi0JICAvKiBEb2Vzbid0IHdvcmsgZm9yIDY0LWJpdCAtZlBJQywgc2luY2Ugc2V0aGkvb3IgYnVpbGRzCi0JICAgICB1bnNpZ25lZCBudW1iZXJzLiAgSWYgd2UgcGVybWl0IG91cnNlbHZlcyB0byBtb2RpZnkKLQkgICAgIGNvZGUgc28gd2UgZ2V0IHNldGhpL3hvciwgdGhpcyBjb3VsZCB3b3JrLgotCSAgICAgUXVlc3Rpb246IGRvIHdlIGNvbnNpZGVyIGNvbmRpdGlvbmFsbHkgcmUtZW5hYmxpbmcKLSAgICAgICAgICAgICB0aGlzIGZvciAtZnBpYywgb25jZSB3ZSBrbm93IGFib3V0IG9iamVjdCBjb2RlIG1vZGVscz8gICovCi0JICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIGFkZAotCSAgICAgMHgxMDAwIHRvIHRoZSB2YWx1ZSBvZiBfR0xPQkFMX09GRlNFVF9UQUJMRV8sIHNvIHRoYXQgMTMKLQkgICAgIGJpdCByZWxvY2F0aW9ucyBoYXZlIGEgZ3JlYXRlciBjaGFuY2Ugb2Ygd29ya2luZy4gICovCi0JICBpZiAoc2dvdC0+X3Jhd19zaXplID49IDB4MTAwMAotCSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdC0+cm9vdC51LmRlZi52YWx1ZSA9PSAwKQotCSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWUgPSAweDEwMDA7Ci0jZW5kaWYKLQotCSAgYnJlYWs7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQljYXNlIFJfU1BBUkNfSElQTFQyMjoKLQljYXNlIFJfU1BBUkNfTE9QTFQxMDoKLQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQljYXNlIFJfU1BBUkNfUENQTFQyMjoKLQljYXNlIFJfU1BBUkNfUENQTFQxMDoKLQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JICAvKiBUaGlzIHN5bWJvbCByZXF1aXJlcyBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5LiAgV2UKLSAgICAgICAgICAgICBhY3R1YWxseSBidWlsZCB0aGUgZW50cnkgaW4gYWRqdXN0X2R5bmFtaWNfc3ltYm9sLAotICAgICAgICAgICAgIGJlY2F1c2UgdGhpcyBtaWdodCBiZSBhIGNhc2Ugb2YgbGlua2luZyBQSUMgY29kZSB3aXRob3V0Ci0gICAgICAgICAgICAgbGlua2luZyBpbiBhbnkgZHluYW1pYyBvYmplY3RzLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0Ci0gICAgICAgICAgICAgbmVlZCB0byBnZW5lcmF0ZSBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGFmdGVyIGFsbC4gICovCi0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBJdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBwcm9jZWR1cmUgbGlua2FnZQotICAgICAgICAgICAgICAgICB0YWJsZSBlbnRyeSBmb3IgYSBsb2NhbCBzeW1ib2wuICAqLwotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotCSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfZWxmNjRfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1BDMTA6Ci0JY2FzZSBSX1NQQVJDX1BDMjI6Ci0JY2FzZSBSX1NQQVJDX1BDX0hIMjI6Ci0JY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JICBpZiAoaCAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgUl9TUEFSQ19ESVNQODoKLQljYXNlIFJfU1BBUkNfRElTUDE2OgotCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JY2FzZSBSX1NQQVJDX0RJU1A2NDoKLQljYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQljYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQljYXNlIFJfU1BBUkNfV0RJU1AxOToKLQljYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIFJfU1BBUkNfODoKLQljYXNlIFJfU1BBUkNfMTY6Ci0JY2FzZSBSX1NQQVJDXzMyOgotCWNhc2UgUl9TUEFSQ19ISTIyOgotCWNhc2UgUl9TUEFSQ18yMjoKLQljYXNlIFJfU1BBUkNfMTM6Ci0JY2FzZSBSX1NQQVJDX0xPMTA6Ci0JY2FzZSBSX1NQQVJDX1VBMzI6Ci0JY2FzZSBSX1NQQVJDXzEwOgotCWNhc2UgUl9TUEFSQ18xMToKLQljYXNlIFJfU1BBUkNfNjQ6Ci0JY2FzZSBSX1NQQVJDX09MTzEwOgotCWNhc2UgUl9TUEFSQ19ISDIyOgotCWNhc2UgUl9TUEFSQ19ITTEwOgotCWNhc2UgUl9TUEFSQ19MTTIyOgotCWNhc2UgUl9TUEFSQ183OgotCWNhc2UgUl9TUEFSQ181OgotCWNhc2UgUl9TUEFSQ182OgotCWNhc2UgUl9TUEFSQ19ISVgyMjoKLQljYXNlIFJfU1BBUkNfTE9YMTA6Ci0JY2FzZSBSX1NQQVJDX0g0NDoKLQljYXNlIFJfU1BBUkNfTTQ0OgotCWNhc2UgUl9TUEFSQ19MNDQ6Ci0JY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JY2FzZSBSX1NQQVJDX1VBMTY6Ci0JICAvKiBXaGVuIGNyZWF0aW5nIGEgc2hhcmVkIG9iamVjdCwgd2UgbXVzdCBjb3B5IHRoZXNlIHJlbG9jcwotCSAgICAgaW50byB0aGUgb3V0cHV0IGZpbGUuICBXZSBjcmVhdGUgYSByZWxvYyBzZWN0aW9uIGluCi0JICAgICBkeW5vYmogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIHJlbG9jLiAKLQotCSAgICAgQnV0IGRvbid0IGRvIHRoaXMgZm9yIGRlYnVnZ2luZyBzZWN0aW9ucyAtLSB0aGlzIHNob3dzIHVwCi0JICAgICB3aXRoIERXQVJGMiAtLSBmaXJzdCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBsb2FkZWQsIGFuZAotCSAgICAgc2Vjb25kIGJlY2F1c2UgRFdBUkYgc2V6IHRoZSBkZWJ1ZyBpbmZvIGlzIG5vdCB0byBiZQotCSAgICAgYmlhc2VkIGJ5IHRoZSBsb2FkIGFkZHJlc3MuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZCAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykpCi0JICAgIHsKLQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwpCi0JCXsKLQkJICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgbmFtZSA9IChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCQkgIChhYmZkLAotCQkJICAgZWxmX2VsZmhlYWRlciAoYWJmZCktPmVfc2hzdHJuZHgsCi0JCQkgICBlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyLnNoX25hbWUpKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgQkZEX0FTU0VSVCAoc3RybmNtcCAobmFtZSwgIi5yZWxhIiwgNSkgPT0gMAotCQkJICAgICAgJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSwKLQkJCQkJIG5hbWUgKyA1KSA9PSAwKTsKLQotCQkgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgIGlmIChzcmVsb2MgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLQkJICAgICAgc3JlbG9jID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCBuYW1lKTsKLQkJICAgICAgZmxhZ3MgPSAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWQotCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0JCSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMCkKLQkJCWZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCQkgICAgICBpZiAoc3JlbG9jID09IE5VTEwKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgc3JlbG9jLCBmbGFncykKLQkJCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHNyZWxvYywgMykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHNyZWxvYy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1JFR0lTVEVSOgotCSAgLyogTm90aGluZyB0byBkby4gICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikoXygiJXM6IGNoZWNrX3JlbG9jczogdW5oYW5kbGVkIHJlbG9jIHR5cGUgJWQiKSwKLQkJCQliZmRfZ2V0X2ZpbGVuYW1lKGFiZmQpLAotCQkJCUVMRjY0X1JfVFlQRSAocmVsLT5yX2luZm8pKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYSBzeW1ib2wgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0IGFuZCByZWZlcmVuY2VkIGJ5IGEKLSAgIHJlZ3VsYXIgb2JqZWN0LiAgVGhlIGN1cnJlbnQgZGVmaW5pdGlvbiBpcyBpbiBzb21lIHNlY3Rpb24gb2YgdGhlCi0gICBkeW5hbWljIG9iamVjdCwgYnV0IHdlJ3JlIG5vdCBpbmNsdWRpbmcgdGhvc2Ugc2VjdGlvbnMuICBXZSBoYXZlIHRvCi0gICBjaGFuZ2UgdGhlIGRlZmluaXRpb24gdG8gc29tZXRoaW5nIHRoZSByZXN0IG9mIHRoZSBsaW5rIGNhbgotICAgdW5kZXJzdGFuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgcG93ZXJfb2ZfdHdvOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHdoYXQgaXMgZ29pbmcgb24gaGVyZS4gICovCi0gIEJGRF9BU1NFUlQgKGR5bm9iaiAhPSBOVUxMCi0JICAgICAgJiYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpCi0JCSAgfHwgaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgfHwgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwCi0JCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkpKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZnVuY3Rpb24sIHB1dCBpdCBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICBXZQotICAgICB3aWxsIGZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBsYXRlcgotICAgICAoYWx0aG91Z2ggd2UgY291bGQgYWN0dWFsbHkgZG8gaXQgaGVyZSkuICBUaGUgU1RUX05PVFlQRQotICAgICBjb25kaXRpb24gaXMgYSBoYWNrIHNwZWNpZmljYWxseSBmb3IgdGhlIE9yYWNsZSBsaWJyYXJpZXMKLSAgICAgZGVsaXZlcmVkIGZvciBTb2xhcmlzOyBmb3Igc29tZSBpbmV4cGxpY2FibGUgcmVhc29uLCB0aGV5IGRlZmluZQotICAgICBzb21lIG9mIHRoZWlyIGZ1bmN0aW9ucyBhcyBTVFRfTk9UWVBFIHdoZW4gdGhleSByZWFsbHkgc2hvdWxkIGJlCi0gICAgIFNUVF9GVU5DLiAgKi8KLSAgaWYgKGgtPnR5cGUgPT0gU1RUX0ZVTkMKLSAgICAgIHx8IChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ORUVEU19QTFQpICE9IDAKLSAgICAgIHx8IChoLT50eXBlID09IFNUVF9OT1RZUEUKLQkgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQotICAgIHsKLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotCXsKLQkgIC8qIFRoaXMgY2FzZSBjYW4gb2NjdXIgaWYgd2Ugc2F3IGEgV1BMVDMwIHJlbG9jIGluIGFuIGlucHV0Ci0gICAgICAgICAgICAgZmlsZSwgYnV0IG5vbmUgb2YgdGhlIGlucHV0IGZpbGVzIHdlcmUgZHluYW1pYyBvYmplY3RzLgotICAgICAgICAgICAgIEluIHN1Y2ggYSBjYXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIGJ1aWxkIGEKLSAgICAgICAgICAgICBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHdlIGNhbiBqdXN0IGRvIGEgV0RJU1AzMAotICAgICAgICAgICAgIHJlbG9jIGluc3RlYWQuICAqLwotCSAgQkZEX0FTU0VSVCAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgIT0gMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICAgICAgLyogVGhlIGZpcnN0IGZvdXIgYml0IGluIC5wbHQgaXMgcmVzZXJ2ZWQuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSA9IFBMVF9IRUFERVJfU0laRTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIGZpbGUsIGFuZCB3ZSBhcmUKLQkgbm90IGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBzZXQgdGhlIHN5bWJvbCB0byB0aGlzCi0JIGxvY2F0aW9uIGluIHRoZSAucGx0LiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlIGZ1bmN0aW9uCi0JIHBvaW50ZXJzIGNvbXBhcmUgYXMgZXF1YWwgYmV0d2VlbiB0aGUgbm9ybWFsIGV4ZWN1dGFibGUgYW5kCi0JIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMCkKLQl7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotCSAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHMtPl9yYXdfc2l6ZTsKLQl9Ci0KLSAgICAgIC8qIFRvIHNpbXBsaWZ5IG1hdHRlcnMgbGF0ZXIsIGp1c3Qgc3RvcmUgdGhlIHBsdCBpbmRleCBoZXJlLiAgKi8KLSAgICAgIGgtPnBsdC5vZmZzZXQgPSBzLT5fcmF3X3NpemUgLyBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogTWFrZSByb29tIGZvciB0aGlzIGVudHJ5LiAgKi8KLSAgICAgIHMtPl9yYXdfc2l6ZSArPSBQTFRfRU5UUllfU0laRTsKLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBwbHQgZW50cmllcyBhcmUgcmVzZXJ2ZWQsIGFuZCB0aGUgcmVsb2NhdGlvbnMgbXVzdAotCSBwYWlyIHVwIGV4YWN0bHkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCXMtPl9yYXdfc2l6ZSArPSAoUExUX0hFQURFUl9TSVpFL1BMVF9FTlRSWV9TSVpFCi0JCQkgKiBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKTsKLQotICAgICAgcy0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0KLSAgICAgIC8qIFRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSBzaXplIGlzIGJvdW5kZWQgYnkgdGhlIG1hZ25pdHVkZQotCSBvZiB0aGUgb2Zmc2V0IHdlIGNhbiBkZXNjcmliZSBpbiB0aGUgZW50cnkuICAqLwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSA+PSAoYmZkX3ZtYSkxIDw8IDMyKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB3ZWFrIHN5bWJvbCwgYW5kIHRoZXJlIGlzIGEgcmVhbCBkZWZpbml0aW9uLCB0aGUKLSAgICAgcHJvY2Vzc29yIGluZGVwZW5kZW50IGNvZGUgd2lsbCBoYXZlIGFycmFuZ2VkIGZvciB1cyB0byBzZWUgdGhlCi0gICAgIHJlYWwgZGVmaW5pdGlvbiBmaXJzdCwgYW5kIHdlIGNhbiBqdXN0IHVzZSB0aGUgc2FtZSB2YWx1ZS4gICovCi0gIGlmIChoLT53ZWFrZGVmICE9IE5VTEwpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoaC0+d2Vha2RlZi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPndlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gaC0+d2Vha2RlZi0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IGgtPndlYWtkZWYtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3Qgd2hpY2gKLSAgICAgaXMgbm90IGEgZnVuY3Rpb24uICAqLwotCi0gIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBtdXN0IHByZXN1bWUgdGhhdCB0aGUKLSAgICAgb25seSByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wgYXJlIHZpYSB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLSAgICAgRm9yIHN1Y2ggY2FzZXMgd2UgbmVlZCBub3QgZG8gYW55dGhpbmcgaGVyZTsgdGhlIHJlbG9jYXRpb25zIHdpbGwKLSAgICAgYmUgaGFuZGxlZCBjb3JyZWN0bHkgYnkgcmVsb2NhdGVfc2VjdGlvbi4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgc3ltYm9sIGluIG91ciAuZHluYnNzIHNlY3Rpb24sIHdoaWNoIHdpbGwKLSAgICAgYmVjb21lIHBhcnQgb2YgdGhlIC5ic3Mgc2VjdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gIFRoZXJlIHdpbGwgYmUKLSAgICAgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uICBUaGUgZHluYW1pYwotICAgICBvYmplY3Qgd2lsbCBjb250YWluIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHNvIGFsbCByZWZlcmVuY2VzCi0gICAgIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IHRvIHRoaXMgc3ltYm9sIHdpbGwgZ28gdGhyb3VnaCB0aGUgZ2xvYmFsCi0gICAgIG9mZnNldCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHVzZSB0aGUgLmR5bnN5bSBlbnRyeSB0bwotICAgICBkZXRlcm1pbmUgdGhlIGFkZHJlc3MgaXQgbXVzdCBwdXQgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIHNvCi0gICAgIGJvdGggdGhlIGR5bmFtaWMgb2JqZWN0IGFuZCB0aGUgcmVndWxhciBvYmplY3Qgd2lsbCByZWZlciB0byB0aGUKLSAgICAgc2FtZSBtZW1vcnkgbG9jYXRpb24gZm9yIHRoZSB2YXJpYWJsZS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluYnNzIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgLyogV2UgbXVzdCBnZW5lcmF0ZSBhIFJfU1BBUkNfQ09QWSByZWxvYyB0byB0ZWxsIHRoZSBkeW5hbWljIGxpbmtlcgotICAgICB0byBjb3B5IHRoZSBpbml0aWFsIHZhbHVlIG91dCBvZiB0aGUgZHluYW1pYyBvYmplY3QgYW5kIGludG8gdGhlCi0gICAgIHJ1bnRpbWUgcHJvY2VzcyBpbWFnZS4gIFdlIG5lZWQgdG8gcmVtZW1iZXIgdGhlIG9mZnNldCBpbnRvIHRoZQotICAgICAucmVsLmJzcyBzZWN0aW9uIHdlIGFyZSBnb2luZyB0byB1c2UuICAqLwotICBpZiAoKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzcmVsICE9IE5VTEwpOwotICAgICAgc3JlbC0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfTkVFRFNfQ09QWTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIHRoaXMgc3ltYm9sLiAgSQotICAgICBoYXZlIG5vIGlkZWEgaG93IEVMRiBsaW5rZXJzIGhhbmRsZSB0aGlzLiAgMTYtYnl0ZXMgaXMgdGhlIHNpemUKLSAgICAgb2YgdGhlIGxhcmdlc3QgdHlwZSB0aGF0IHJlcXVpcmVzIGhhcmQgYWxpZ25tZW50IC0tIGxvbmcgZG91YmxlLiAgKi8KLSAgcG93ZXJfb2ZfdHdvID0gYmZkX2xvZzIgKGgtPnNpemUpOwotICBpZiAocG93ZXJfb2ZfdHdvID4gNCkKLSAgICBwb3dlcl9vZl90d28gPSA0OwotCi0gIC8qIEFwcGx5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQuICAqLwotICBzLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHMtPl9yYXdfc2l6ZSwKLQkJCSAgICAoYmZkX3NpemVfdHlwZSkgKDEgPDwgcG93ZXJfb2ZfdHdvKSk7Ci0gIGlmIChwb3dlcl9vZl90d28gPiBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgcG93ZXJfb2ZfdHdvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIGFzIGJlaW5nIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHNlY3Rpb24uICAqLwotICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzOwotICBoLT5yb290LnUuZGVmLnZhbHVlID0gcy0+X3Jhd19zaXplOwotCi0gIC8qIEluY3JlbWVudCB0aGUgc2VjdGlvbiBzaXplIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIHN5bWJvbC4gICovCi0gIHMtPl9yYXdfc2l6ZSArPSBoLT5zaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIHNpemVzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBib29sZWFuIHJlbHRleHQ7Ci0gIGJvb2xlYW4gcmVscGx0OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotICBCRkRfQVNTRVJUIChkeW5vYmogIT0gTlVMTCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIC8qIFNldCB0aGUgY29udGVudHMgb2YgdGhlIC5pbnRlcnAgc2VjdGlvbiB0byB0aGUgaW50ZXJwcmV0ZXIuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmludGVycCIpOwotCSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgIHMtPl9yYXdfc2l6ZSA9IHNpemVvZiBFTEZfRFlOQU1JQ19JTlRFUlBSRVRFUjsKLQkgIHMtPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgRUxGX0RZTkFNSUNfSU5URVJQUkVURVI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG1heSBoYXZlIGNyZWF0ZWQgZW50cmllcyBpbiB0aGUgLnJlbGEuZ290IHNlY3Rpb24uCi0gICAgICAgICBIb3dldmVyLCBpZiB3ZSBhcmUgbm90IGNyZWF0aW5nIHRoZSBkeW5hbWljIHNlY3Rpb25zLCB3ZSB3aWxsCi0gICAgICAgICBub3QgYWN0dWFsbHkgdXNlIHRoZXNlIGVudHJpZXMuICBSZXNldCB0aGUgc2l6ZSBvZiAucmVsYS5nb3QsCi0gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGl0IHRvIGdldCBzdHJpcHBlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZQotICAgICAgICAgYmVsb3cuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICB9Ci0KLSAgLyogVGhlIGNoZWNrX3JlbG9jcyBhbmQgYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGVudHJ5IHBvaW50cyBoYXZlCi0gICAgIGRldGVybWluZWQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGR5bmFtaWMgc2VjdGlvbnMuICBBbGxvY2F0ZQotICAgICBtZW1vcnkgZm9yIHRoZW0uICAqLwotICByZWx0ZXh0ID0gZmFsc2U7Ci0gIHJlbHBsdCA9IGZhbHNlOwotICBmb3IgKHMgPSBkeW5vYmotPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIHN0cmlwOwotCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJdCdzIE9LIHRvIGJhc2UgZGVjaXNpb25zIG9uIHRoZSBzZWN0aW9uIG5hbWUsIGJlY2F1c2Ugbm9uZQotCSBvZiB0aGUgZHlub2JqIHNlY3Rpb24gbmFtZXMgZGVwZW5kIHVwb24gdGhlIGlucHV0IGZpbGVzLiAgKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZHlub2JqLCBzKTsKLQotICAgICAgc3RyaXAgPSBmYWxzZTsKLQotICAgICAgaWYgKHN0cm5jbXAgKG5hbWUsICIucmVsYSIsIDUpID09IDApCi0JewotCSAgaWYgKHMtPl9yYXdfc2l6ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgd2UgZG9uJ3QgbmVlZCB0aGlzIHNlY3Rpb24sIHN0cmlwIGl0IGZyb20gdGhlCi0JCSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdG8gaGFuZGxlIC5yZWxhLmJzcyBhbmQKLQkJIC5yZWwucGx0LiAgV2UgbXVzdCBjcmVhdGUgaXQgaW4KLQkJIGNyZWF0ZV9keW5hbWljX3NlY3Rpb25zLCBiZWNhdXNlIGl0IG11c3QgYmUgY3JlYXRlZAotCQkgYmVmb3JlIHRoZSBsaW5rZXIgbWFwcyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQKLQkJIHNlY3Rpb25zLiAgVGhlIGxpbmtlciBkb2VzIHRoYXQgYmVmb3JlCi0JCSBhZGp1c3RfZHluYW1pY19zeW1ib2wgaXMgY2FsbGVkLCBhbmQgaXQgaXMgdGhhdAotCQkgZnVuY3Rpb24gd2hpY2ggZGVjaWRlcyB3aGV0aGVyIGFueXRoaW5nIG5lZWRzIHRvIGdvCi0JCSBpbnRvIHRoZXNlIHNlY3Rpb25zLiAgKi8KLQkgICAgICBzdHJpcCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm91dG5hbWU7Ci0JICAgICAgYXNlY3Rpb24gKnRhcmdldDsKLQotCSAgICAgIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBzZWN0aW9uIGFwcGxpZXMgdG8gYSByZWFkIG9ubHkKLQkJIHNlY3Rpb24sIHRoZW4gd2UgcHJvYmFibHkgbmVlZCBhIERUX1RFWFRSRUwgZW50cnkuICAqLwotCSAgICAgIG91dG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkJICAgICAgcy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICAgIHRhcmdldCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBvdXRuYW1lICsgNSk7Ci0JICAgICAgaWYgKHRhcmdldCAhPSBOVUxMCi0JCSAgJiYgKHRhcmdldC0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDApCi0JCXJlbHRleHQgPSB0cnVlOwotCi0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIi5yZWxhLnBsdCIpID09IDApCi0JCXJlbHBsdCA9IHRydWU7Ci0KLQkgICAgICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGEgY291bnRlciBpZiB3ZSBuZWVkCi0JCSB0byBjb3B5IHJlbG9jcyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JICAgICAgcy0+cmVsb2NfY291bnQgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLnBsdCIpICE9IDAKLQkgICAgICAgJiYgc3RybmNtcCAobmFtZSwgIi5nb3QiLCA0KSAhPSAwKQotCXsKLQkgIC8qIEl0J3Mgbm90IG9uZSBvZiBvdXIgc2VjdGlvbnMsIHNvIGRvbid0IGFsbG9jYXRlIHNwYWNlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmlwKQotCXsKLQkgIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dCAocyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNlY3Rpb24gY29udGVudHMuICBaZXJvIHRoZSBtZW1vcnkKLQkgZm9yIHRoZSBiZW5lZml0IG9mIC5yZWxhLnBsdCwgd2hpY2ggaGFzIDQgdW51c2VkIGVudHJpZXMKLQkgYXQgdGhlIGJlZ2lubmluZywgYW5kIHdlIGRvbid0IHdhbnQgZ2FyYmFnZS4gICovCi0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICAvKiBBZGQgc29tZSBlbnRyaWVzIHRvIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgV2UgZmlsbCBpbiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucywgYnV0IHdlCi0JIG11c3QgYWRkIHRoZSBlbnRyaWVzIG5vdyBzbyB0aGF0IHdlIGdldCB0aGUgY29ycmVjdCBzaXplIGZvcgotCSB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFRoZSBEVF9ERUJVRyBlbnRyeSBpcyBmaWxsZWQgaW4gYnkgdGhlCi0JIGR5bmFtaWMgbGlua2VyIGFuZCB1c2VkIGJ5IHRoZSBkZWJ1Z2dlci4gICovCi0gICAgICBpZiAoISBpbmZvLT5zaGFyZWQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9ERUJVRywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChyZWxwbHQpCi0JewotCSAgaWYgKCEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRHT1QsIDApCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1BMVFJFTFNaLCAwKQotCSAgICAgIHx8ICEgYmZkX2VsZjY0X2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9QTFRSRUwsIERUX1JFTEEpCi0JICAgICAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0pNUFJFTCwgMCkKLQkgICAgICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1BBUkNfUExURk1ULAotCQkJCQkJKGluZm8tPnNoYXJlZCAhPSAwKSArIDEpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEEsIDApCi0JICB8fCAhIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUkVMQVNaLCAwKQotCSAgfHwgISBiZmRfZWxmNjRfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1JFTEFFTlQsCi0JCQkJCSAgICBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbGEpKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChyZWx0ZXh0KQotCXsKLQkgIGlmICghIGJmZF9lbGY2NF9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVEVYVFJFTCwgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIHdlIGdlbmVyYXRlIGEgc2VjdGlvbgotICAgICBzeW1ib2wgZm9yIGVhY2ggb3V0cHV0IHNlY3Rpb24gZm9yIHdoaWNoIHdlIG1pZ2h0IG5lZWQgdG8gY29weQotICAgICByZWxvY3MuICBUaGVzZSBhcmUgbG9jYWwgc3ltYm9scywgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IG11c3QgY29tZQotICAgICBmaXJzdCBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBUaGF0IG1lYW5zIHdlIG11c3QgaW5jcmVtZW50Ci0gICAgIHRoZSBkeW5hbWljIHN5bWJvbCBpbmRleCBvZiBldmVyeSBvdGhlciBkeW5hbWljIHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaWYgKChzLT5mbGFncyAmIFNFQ19MSU5LRVJfQ1JFQVRFRCkgIT0gMAotCSAgICAgIHx8IChzLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4ID0gYyArIDE7Ci0KLQkgIC8qIFRoZXNlIHN5bWJvbHMgd2lsbCBoYXZlIG5vIG5hbWVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICAgICAgZmlkZGxlIHdpdGggZHluc3RyX2luZGV4LiAgKi8KLQotCSAgKytjOwotCX0KLQotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmluZHgsCi0JCQkgICAgICAoUFRSKSAmYyk7Ci0gICAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ICs9IGM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZW1lbnQgdGhlIGluZGV4IG9mIGEgZHluYW1pYyBzeW1ib2wgYnkgYSBnaXZlbiBhbW91bnQuICBDYWxsZWQKLSAgIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2FkanVzdF9keW5pbmR4IChoLCBjcGFyZykKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBjcGFyZzsKLXsKLSAgaW50ICpjcCA9IChpbnQgKikgY3Bhcmc7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEpCi0gICAgaC0+ZHluaW5keCArPSAqY3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0MCi0vKiBSZWxvY2F0ZSBhIFNQQVJDNjQgRUxGIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5mbywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLAotCQkJICAgICAgY29udGVudHMsIHJlbG9jcywgbG9jYWxfc3ltcywgbG9jYWxfc2VjdGlvbnMpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpsb2NhbF9zeW1zOwotICAgICBhc2VjdGlvbiAqKmxvY2FsX3NlY3Rpb25zOwotewotICBiZmQgKmR5bm9iajsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci0gIGJmZF92bWEgZ290X2Jhc2U7Ci0gIGFzZWN0aW9uICpzZ290OwotICBhc2VjdGlvbiAqc3BsdDsKLSAgYXNlY3Rpb24gKnNyZWxvYzsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgRWxmX0ludGVybmFsX1JlbGEgKnJlbGVuZDsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgc3ltdGFiX2hkciA9ICZlbGZfdGRhdGEgKGlucHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0gIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgbG9jYWxfZ290X29mZnNldHMgPSBlbGZfbG9jYWxfZ290X29mZnNldHMgKGlucHV0X2JmZCk7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlKGluZm8pLT5oZ290ID09IE5VTEwpCi0gICAgZ290X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgZ290X2Jhc2UgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmhnb3QtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgc2dvdCA9IHNwbHQgPSBzcmVsb2MgPSBOVUxMOwotCi0gIHJlbCA9IHJlbG9jczsKLSAgcmVsZW5kID0gcmVsb2NzICsgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGZvciAoOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGxvbmcgcl9zeW1uZHg7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKnN5bTsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcjsKLQotICAgICAgcl90eXBlID0gRUxGNjRfUl9UWVBFIChyZWwtPnJfaW5mbyk7Ci0gICAgICBpZiAocl90eXBlIDwgMCB8fCByX3R5cGUgPj0gKGludCkgUl9TUEFSQ19tYXhfc3RkKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGhvd3RvID0gc3BhcmM2NF9lbGZfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0KLSAgICAgIHJfc3ltbmR4ID0gRUxGNjRfUl9TWU0gKHJlbC0+cl9pbmZvKTsKLQotICAgICAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkb24ndCBoYXZlIHRvIGNoYW5nZQotCSAgICAgYW55dGhpbmcsIHVubGVzcyB0aGUgcmVsb2MgaXMgYWdhaW5zdCBhIHNlY3Rpb24gc3ltYm9sLAotCSAgICAgaW4gd2hpY2ggY2FzZSB3ZSBoYXZlIHRvIGFkanVzdCBhY2NvcmRpbmcgdG8gd2hlcmUgdGhlCi0JICAgICBzZWN0aW9uIHN5bWJvbCB3aW5kcyB1cCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQkgICAgewotCSAgICAgIHN5bSA9IGxvY2FsX3N5bXMgKyByX3N5bW5keDsKLQkgICAgICBpZiAoRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JCXsKLQkJICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JCSAgcmVsLT5yX2FkZGVuZCArPSBzZWMtPm91dHB1dF9vZmZzZXQgKyBzeW0tPnN0X3ZhbHVlOwotCQl9Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBUaGlzIGlzIGEgZmluYWwgbGluay4gICovCi0gICAgICBoID0gTlVMTDsKLSAgICAgIHN5bSA9IE5VTEw7Ci0gICAgICBzZWMgPSBOVUxMOwotICAgICAgaWYgKHJfc3ltbmR4IDwgc3ltdGFiX2hkci0+c2hfaW5mbykKLQl7Ci0JICBzeW0gPSBsb2NhbF9zeW1zICsgcl9zeW1uZHg7Ci0JICBzZWMgPSBsb2NhbF9zZWN0aW9uc1tyX3N5bW5keF07Ci0JICByZWxvY2F0aW9uID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSsgc3ltLT5zdF92YWx1ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gc3ltdGFiX2hkci0+c2hfaW5mb107Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGJvb2xlYW4gc2tpcF9pdCA9IGZhbHNlOwotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQotCSAgICAgIHN3aXRjaCAocl90eXBlKQotCQl7Ci0JCWNhc2UgUl9TUEFSQ19XUExUMzA6Ci0JCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQkJY2FzZSBSX1NQQVJDX0hJUExUMjI6Ci0JCWNhc2UgUl9TUEFSQ19MT1BMVDEwOgotCQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQkJY2FzZSBSX1NQQVJDX1BDUExUMjI6Ci0JCWNhc2UgUl9TUEFSQ19QQ1BMVDEwOgotCQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JCSAgaWYgKGgtPnBsdC5vZmZzZXQgIT0gKGJmZF92bWEpIC0xKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX0dPVDEwOgotCQljYXNlIFJfU1BBUkNfR09UMTM6Ci0JCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkJICBpZiAoZWxmX2hhc2hfdGFibGUoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZAotCQkgICAgICAmJiAoIWluZm8tPnNoYXJlZAotCQkJICB8fCAoIWluZm8tPnN5bWJvbGljICYmIGgtPmR5bmluZHggIT0gLTEpCi0JCQkgIHx8ICEoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCQkgICAgc2tpcF9pdCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX1NQQVJDX1BDMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQzIyOgotCQljYXNlIFJfU1BBUkNfUENfSEgyMjoKLQkJY2FzZSBSX1NQQVJDX1BDX0hNMTA6Ci0JCWNhc2UgUl9TUEFSQ19QQ19MTTIyOgotCQkgIGlmICghc3RyY21wKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSkKLQkJICAgIGJyZWFrOwotCQkgIC8qIEZBTExUSFJVICovCi0KLQkJY2FzZSBSX1NQQVJDXzg6Ci0JCWNhc2UgUl9TUEFSQ18xNjoKLQkJY2FzZSBSX1NQQVJDXzMyOgotCQljYXNlIFJfU1BBUkNfRElTUDg6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQMTY6Ci0JCWNhc2UgUl9TUEFSQ19ESVNQMzI6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDMwOgotCQljYXNlIFJfU1BBUkNfV0RJU1AyMjoKLQkJY2FzZSBSX1NQQVJDX0hJMjI6Ci0JCWNhc2UgUl9TUEFSQ18yMjoKLQkJY2FzZSBSX1NQQVJDXzEzOgotCQljYXNlIFJfU1BBUkNfTE8xMDoKLQkJY2FzZSBSX1NQQVJDX1VBMzI6Ci0JCWNhc2UgUl9TUEFSQ18xMDoKLQkJY2FzZSBSX1NQQVJDXzExOgotCQljYXNlIFJfU1BBUkNfNjQ6Ci0JCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQkJY2FzZSBSX1NQQVJDX0hIMjI6Ci0JCWNhc2UgUl9TUEFSQ19ITTEwOgotCQljYXNlIFJfU1BBUkNfTE0yMjoKLQkJY2FzZSBSX1NQQVJDX1dESVNQMTk6Ci0JCWNhc2UgUl9TUEFSQ19XRElTUDE2OgotCQljYXNlIFJfU1BBUkNfNzoKLQkJY2FzZSBSX1NQQVJDXzU6Ci0JCWNhc2UgUl9TUEFSQ182OgotCQljYXNlIFJfU1BBUkNfRElTUDY0OgotCQljYXNlIFJfU1BBUkNfSElYMjI6Ci0JCWNhc2UgUl9TUEFSQ19MT1gxMDoKLQkJY2FzZSBSX1NQQVJDX0g0NDoKLQkJY2FzZSBSX1NQQVJDX000NDoKLQkJY2FzZSBSX1NQQVJDX0w0NDoKLQkJY2FzZSBSX1NQQVJDX1VBNjQ6Ci0JCWNhc2UgUl9TUEFSQ19VQTE2OgotCQkgIGlmIChpbmZvLT5zaGFyZWQKLQkJICAgICAgJiYgKCghaW5mby0+c3ltYm9saWMgJiYgaC0+ZHluaW5keCAhPSAtMSkKLQkJCSAgfHwgIShoLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCSAgICBza2lwX2l0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgaWYgKHNraXBfaXQpCi0JCXsKLQkJICAvKiBJbiB0aGVzZSBjYXNlcywgd2UgZG9uJ3QgbmVlZCB0aGUgcmVsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgdmFsdWUuICBXZSBjaGVjayBzcGVjaWFsbHkgYmVjYXVzZSBpbiBzb21lCi0gICAgICAgICAgICAgICAgICAgICBvYnNjdXJlIGNhc2VzIHNlYy0+b3V0cHV0X3NlY3Rpb24gd2lsbCBiZSBOVUxMLiAgKi8KLQkJICByZWxvY2F0aW9uID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHJlbG9jYXRpb24gPSAoaC0+cm9vdC51LmRlZi52YWx1ZQotCQkJCSsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJKyBzZWMtPm91dHB1dF9vZmZzZXQpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkgICAgcmVsb2NhdGlvbiA9IDA7Ci0JICBlbHNlIGlmIChpbmZvLT5zaGFyZWQgJiYgIWluZm8tPnN5bWJvbGljICYmICFpbmZvLT5ub191bmRlZmluZWQpCi0JICAgIHJlbG9jYXRpb24gPSAwOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCQkgICAgIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBpbnB1dF9iZmQsCi0JCSAgICAgIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHJlbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXaGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB0aGVzZSByZWxvY2F0aW9ucyBhcmUgY29waWVkCi0JIGludG8gdGhlIG91dHB1dCBmaWxlIHRvIGJlIHJlc29sdmVkIGF0IHJ1biB0aW1lLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQgJiYgKGlucHV0X3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSkKLQl7Ci0JICBzd2l0Y2ggKHJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIFJfU1BBUkNfUEMxMDoKLQkgICAgY2FzZSBSX1NQQVJDX1BDMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19QQ19ISDIyOgotCSAgICBjYXNlIFJfU1BBUkNfUENfSE0xMDoKLQkgICAgY2FzZSBSX1NQQVJDX1BDX0xNMjI6Ci0JICAgICAgaWYgKGggIT0gTlVMTAotCQkgICYmICFzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSkKLQkJYnJlYWs7Ci0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBSX1NQQVJDX0RJU1A4OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDE2OgotCSAgICBjYXNlIFJfU1BBUkNfRElTUDMyOgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AzMDoKLQkgICAgY2FzZSBSX1NQQVJDX1dESVNQMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ19XRElTUDE5OgotCSAgICBjYXNlIFJfU1BBUkNfV0RJU1AxNjoKLQkgICAgY2FzZSBSX1NQQVJDX0RJU1A2NDoKLQkgICAgICBpZiAoaCA9PSBOVUxMKQotCQlicmVhazsKLQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICBjYXNlIFJfU1BBUkNfODoKLQkgICAgY2FzZSBSX1NQQVJDXzE2OgotCSAgICBjYXNlIFJfU1BBUkNfMzI6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISTIyOgotCSAgICBjYXNlIFJfU1BBUkNfMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMzoKLQkgICAgY2FzZSBSX1NQQVJDX0xPMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19VQTMyOgotCSAgICBjYXNlIFJfU1BBUkNfMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ18xMToKLQkgICAgY2FzZSBSX1NQQVJDXzY0OgotCSAgICBjYXNlIFJfU1BBUkNfT0xPMTA6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISDIyOgotCSAgICBjYXNlIFJfU1BBUkNfSE0xMDoKLQkgICAgY2FzZSBSX1NQQVJDX0xNMjI6Ci0JICAgIGNhc2UgUl9TUEFSQ183OgotCSAgICBjYXNlIFJfU1BBUkNfNToKLQkgICAgY2FzZSBSX1NQQVJDXzY6Ci0JICAgIGNhc2UgUl9TUEFSQ19ISVgyMjoKLQkgICAgY2FzZSBSX1NQQVJDX0xPWDEwOgotCSAgICBjYXNlIFJfU1BBUkNfSDQ0OgotCSAgICBjYXNlIFJfU1BBUkNfTTQ0OgotCSAgICBjYXNlIFJfU1BBUkNfTDQ0OgotCSAgICBjYXNlIFJfU1BBUkNfVUE2NDoKLQkgICAgY2FzZSBSX1NQQVJDX1VBMTY6Ci0JICAgICAgewotCQlFbGZfSW50ZXJuYWxfUmVsYSBvdXRyZWw7Ci0JCWJvb2xlYW4gc2tpcDsKLQotCQlpZiAoc3JlbG9jID09IE5VTEwpCi0JCSAgewotCQkgICAgY29uc3QgY2hhciAqbmFtZSA9Ci0JCSAgICAgIChiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uCi0JCSAgICAgICAoaW5wdXRfYmZkLAotCQkJZWxmX2VsZmhlYWRlciAoaW5wdXRfYmZkKS0+ZV9zaHN0cm5keCwKLQkJCWVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5yZWxfaGRyLnNoX25hbWUpKTsKLQotCQkgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCi0JCSAgICBCRkRfQVNTRVJUIChzdHJuY21wIChuYW1lLCAiLnJlbGEiLCA1KSA9PSAwCi0JCQkJJiYgc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZShpbnB1dF9iZmQsCi0JCQkJCQkJCWlucHV0X3NlY3Rpb24pLAotCQkJCQkgICBuYW1lICsgNSkgPT0gMCk7Ci0KLQkJICAgIHNyZWxvYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIG5hbWUpOwotCQkgICAgQkZEX0FTU0VSVCAoc3JlbG9jICE9IE5VTEwpOwotCQkgIH0KLQotCQlza2lwID0gZmFsc2U7Ci0KLQkJaWYgKGVsZl9zZWN0aW9uX2RhdGEgKGlucHV0X3NlY3Rpb24pLT5zdGFiX2luZm8gPT0gTlVMTCkKLQkJICBvdXRyZWwucl9vZmZzZXQgPSByZWwtPnJfb2Zmc2V0OwotCQllbHNlCi0JCSAgewotCQkgICAgYmZkX3ZtYSBvZmY7Ci0KLQkJICAgIG9mZiA9IChfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLQkJCSAgIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCSAgICAmZWxmX3NlY3Rpb25fZGF0YSAoaW5wdXRfc2VjdGlvbiktPnN0YWJfaW5mbywKLQkJCSAgICByZWwtPnJfb2Zmc2V0KSk7Ci0JCSAgICBpZiAob2ZmID09IE1JTlVTX09ORSkKLQkJICAgICAgc2tpcCA9IHRydWU7Ci0JCSAgICBvdXRyZWwucl9vZmZzZXQgPSBvZmY7Ci0JCSAgfQotCi0JCW91dHJlbC5yX29mZnNldCArPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSAgICArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCi0JCS8qIE9wdGltaXplIHVuYWxpZ25lZCByZWxvYyB1c2FnZSBub3cgdGhhdCB3ZSBrbm93IHdoZXJlCi0JCSAgIGl0IGZpbmFsbHkgcmVzaWRlcy4gICovCi0JCXN3aXRjaCAocl90eXBlKQotCQkgIHsKLQkJICBjYXNlIFJfU1BBUkNfMTY6Ci0JCSAgICBpZiAob3V0cmVsLnJfb2Zmc2V0ICYgMSkgcl90eXBlID0gUl9TUEFSQ19VQTE2OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDX1VBMTY6Ci0JCSAgICBpZiAoIShvdXRyZWwucl9vZmZzZXQgJiAxKSkgcl90eXBlID0gUl9TUEFSQ18xNjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ18zMjoKLQkJICAgIGlmIChvdXRyZWwucl9vZmZzZXQgJiAzKSByX3R5cGUgPSBSX1NQQVJDX1VBMzI7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIFJfU1BBUkNfVUEzMjoKLQkJICAgIGlmICghKG91dHJlbC5yX29mZnNldCAmIDMpKSByX3R5cGUgPSBSX1NQQVJDXzMyOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBSX1NQQVJDXzY0OgotCQkgICAgaWYgKG91dHJlbC5yX29mZnNldCAmIDcpIHJfdHlwZSA9IFJfU1BBUkNfVUE2NDsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgUl9TUEFSQ19VQTY0OgotCQkgICAgaWYgKCEob3V0cmVsLnJfb2Zmc2V0ICYgNykpIHJfdHlwZSA9IFJfU1BBUkNfNjQ7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0KLQkJaWYgKHNraXApCi0JCSAgbWVtc2V0ICgmb3V0cmVsLCAwLCBzaXplb2Ygb3V0cmVsKTsKLQkJLyogaC0+ZHluaW5keCBtYXkgYmUgLTEgaWYgdGhlIHN5bWJvbCB3YXMgbWFya2VkIHRvCi0JCSAgIGJlY29tZSBsb2NhbC4gICovCi0JCWVsc2UgaWYgKGggIT0gTlVMTAotCQkJICYmICgoISBpbmZvLT5zeW1ib2xpYyAmJiBoLT5keW5pbmR4ICE9IC0xKQotCQkJICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApKQotCQkgIHsKLQkJICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggIT0gLTEpOwotCQkgICAgb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgcl90eXBlKTsKLQkJICAgIG91dHJlbC5yX2FkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKHJfdHlwZSA9PSBSX1NQQVJDXzY0KQotCQkgICAgICB7Ci0JCQlvdXRyZWwucl9pbmZvID0gRUxGNjRfUl9JTkZPICgwLCBSX1NQQVJDX1JFTEFUSVZFKTsKLQkJCW91dHJlbC5yX2FkZGVuZCA9IHJlbG9jYXRpb24gKyByZWwtPnJfYWRkZW5kOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWxvbmcgaW5keDsKLQotCQkJaWYgKGggPT0gTlVMTCkKLQkJCSAgc2VjID0gbG9jYWxfc2VjdGlvbnNbcl9zeW1uZHhdOwotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgQkZEX0FTU0VSVCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCQl8fCAoaC0+cm9vdC50eXBlCi0JCQkJCSAgICA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKTsKLQkJCSAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCQkgIH0KLQkJCWlmIChzZWMgIT0gTlVMTCAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0JCQkgIGluZHggPSAwOwotCQkJZWxzZSBpZiAoc2VjID09IE5VTEwgfHwgc2VjLT5vd25lciA9PSBOVUxMKQotCQkJICB7Ci0JCQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBhc2VjdGlvbiAqb3NlYzsKLQotCQkJICAgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICAgIGluZHggPSBlbGZfc2VjdGlvbl9kYXRhIChvc2VjKS0+ZHluaW5keDsKLQotCQkJICAgIC8qIEZJWE1FOiB3ZSByZWFsbHkgc2hvdWxkIGJlIGFibGUgdG8gbGluayBub24tcGljCi0JCQkgICAgICAgc2hhcmVkIGxpYnJhcmllcy4gICovCi0JCQkgICAgaWYgKGluZHggPT0gMCkKLQkJCSAgICAgIHsKLQkJCQlCRkRfRkFJTCAoKTsKLQkJCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCQkgIChfKCIlczogcHJvYmFibHkgY29tcGlsZWQgd2l0aG91dCAtZlBJQz8iKSwKLQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpKTsKLQkJCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQotCQkJb3V0cmVsLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaW5keCwgcl90eXBlKTsKLQotCQkJLyogRm9yIG5vbi1SRUxBVElWRSBkeW5hbWljIHJlbG9jYXRpb25zLCB3ZSBrZWVwIHRoZQotCQkJICAgc2FtZSBzeW1ib2wsIGFuZCBzbyBnZW5lcmFsbHkgdGhlIHNhbWUgYWRkZW5kLiAgQnV0Ci0JCQkgICB3ZSBkbyBuZWVkIHRvIGFkanVzdCB0aG9zZSByZWxvY2F0aW9ucyByZWZlcmVuY2luZwotCQkJICAgc2VjdGlvbnMuICAqLwotCQkJb3V0cmVsLnJfYWRkZW5kID0gcmVsLT5yX2FkZGVuZDsKLQkJCWlmIChyX3N5bW5keCA8IHN5bXRhYl9oZHItPnNoX2luZm8KLQkJCSAgICAmJiBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfU0VDVElPTikKLQkJCSAgb3V0cmVsLnJfYWRkZW5kICs9IHNlYy0+b3V0cHV0X29mZnNldCtzeW0tPnN0X3ZhbHVlOwotCQkgICAgICB9Ci0JCSAgfQotCi0JCWJmZF9lbGY2NF9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZvdXRyZWwsCi0JCQkJCSAgICgoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJICAgICBzcmVsb2MtPmNvbnRlbnRzKQotCQkJCQkgICAgKyBzcmVsb2MtPnJlbG9jX2NvdW50KSk7Ci0JCSsrc3JlbG9jLT5yZWxvY19jb3VudDsKLQotCQkvKiBUaGlzIHJlbG9jIHdpbGwgYmUgY29tcHV0ZWQgYXQgcnVudGltZSwgc28gdGhlcmUncyBubwotCQkgICBuZWVkIHRvIGRvIGFueXRoaW5nIG5vdywgdW5sZXNzIHRoaXMgaXMgYSBSRUxBVElWRQotCQkgICByZWxvYyBpbiBhbiB1bmFsbG9jYXRlZCBzZWN0aW9uLiAgKi8KLQkJaWYgKHNraXAKLQkJICAgIHx8IChpbnB1dF9zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotCQkgICAgfHwgRUxGNjRfUl9UWVBFIChvdXRyZWwucl9pbmZvKSAhPSBSX1NQQVJDX1JFTEFUSVZFKQotCQkgIGNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN3aXRjaCAocl90eXBlKQotCXsKLQljYXNlIFJfU1BBUkNfR09UMTA6Ci0JY2FzZSBSX1NQQVJDX0dPVDEzOgotCWNhc2UgUl9TUEFSQ19HT1QyMjoKLQkgIC8qIFJlbG9jYXRpb24gaXMgdG8gdGhlIGVudHJ5IGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgZ2xvYmFsCi0JICAgICBvZmZzZXQgdGFibGUuICAqLwotCSAgaWYgKHNnb3QgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCk7Ci0JICAgIH0KLQotCSAgaWYgKGggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF92bWEgb2ZmID0gaC0+Z290Lm9mZnNldDsKLQkgICAgICBCRkRfQVNTRVJUIChvZmYgIT0gKGJmZF92bWEpIC0xKTsKLQotCSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JCSAgfHwgKGluZm8tPnNoYXJlZAotCQkgICAgICAmJiAoaW5mby0+c3ltYm9saWMgfHwgaC0+ZHluaW5keCA9PSAtMSkKLQkJICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkpCi0JCXsKLQkJICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgc3RhdGljIGxpbmssIG9yIGl0IGlzIGEgLUJzeW1ib2xpYwotCQkgICAgIGxpbmsgYW5kIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBsb2NhbGx5LCBvciB0aGUgc3ltYm9sCi0JCSAgICAgd2FzIGZvcmNlZCB0byBiZSBsb2NhbCBiZWNhdXNlIG9mIGEgdmVyc2lvbiBmaWxlLiAgV2UKLQkJICAgICBtdXN0IGluaXRpYWxpemUgdGhpcyBlbnRyeSBpbiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZS4KLQkJICAgICBTaW5jZSB0aGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgOCwgd2UKLQkJICAgICB1c2UgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZQotCQkgICAgIGhhdmUgaW5pdGlhbGl6ZWQgaXQgYWxyZWFkeS4KLQotCQkgICAgIFdoZW4gZG9pbmcgYSBkeW5hbWljIGxpbmssIHdlIGNyZWF0ZSBhIC5yZWxhLmdvdAotCQkgICAgIHJlbG9jYXRpb24gZW50cnkgdG8gaW5pdGlhbGl6ZSB0aGUgdmFsdWUuICBUaGlzIGlzCi0JCSAgICAgZG9uZSBpbiB0aGUgZmluaXNoX2R5bmFtaWNfc3ltYm9sIHJvdXRpbmUuICAqLwotCi0JCSAgaWYgKChvZmYgJiAxKSAhPSAwKQotCQkgICAgb2ZmICY9IH4xOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiwKLQkJCQkgIHNnb3QtPmNvbnRlbnRzICsgb2ZmKTsKLQkJICAgICAgaC0+Z290Lm9mZnNldCB8PSAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgcmVsb2NhdGlvbiA9IHNnb3QtPm91dHB1dF9vZmZzZXQgKyBvZmYgLSBnb3RfYmFzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBvZmY7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChsb2NhbF9nb3Rfb2Zmc2V0cyAhPSBOVUxMKTsKLQkgICAgICBvZmYgPSBsb2NhbF9nb3Rfb2Zmc2V0c1tyX3N5bW5keF07Ci0JICAgICAgQkZEX0FTU0VSVCAob2ZmICE9IChiZmRfdm1hKSAtMSk7Ci0KLQkgICAgICAvKiBUaGUgb2Zmc2V0IG11c3QgYWx3YXlzIGJlIGEgbXVsdGlwbGUgb2YgOC4gIFdlIHVzZQotCQkgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byByZWNvcmQgd2hldGhlciB3ZSBoYXZlCi0JCSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKG9mZiAmIDEpICE9IDApCi0JCW9mZiAmPSB+MTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmRfcHV0XzY0IChvdXRwdXRfYmZkLCByZWxvY2F0aW9uLCBzZ290LT5jb250ZW50cyArIG9mZik7Ci0JCSAgbG9jYWxfZ290X29mZnNldHNbcl9zeW1uZHhdIHw9IDE7Ci0KLQkJICBpZiAoaW5mby0+c2hhcmVkKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3JlbGdvdDsKLQkJICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBSX1NQQVJDX1JFTEFUSVZFIHJlbG9jCi0JCQkgZm9yIHRoZSBkeW5hbWljIGxpbmtlci4gICovCi0JCSAgICAgIHNyZWxnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZShkeW5vYmosICIucmVsYS5nb3QiKTsKLQkJICAgICAgQkZEX0FTU0VSVCAoc3JlbGdvdCAhPSBOVUxMKTsKLQotCQkgICAgICBvdXRyZWwucl9vZmZzZXQgPSAoc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCQkgKyBzZ290LT5vdXRwdXRfb2Zmc2V0Ci0JCQkJCSArIG9mZik7Ci0JCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEY2NF9SX0lORk8gKDAsIFJfU1BBUkNfUkVMQVRJVkUpOwotCQkgICAgICBvdXRyZWwucl9hZGRlbmQgPSByZWxvY2F0aW9uOwotCQkgICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCQkJICgoKEVsZjY0X0V4dGVybmFsX1JlbGEgKikKLQkJCQkJCSAgIHNyZWxnb3QtPmNvbnRlbnRzKQotCQkJCQkJICArIHNyZWxnb3QtPnJlbG9jX2NvdW50KSk7Ci0JCSAgICAgICsrc3JlbGdvdC0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICByZWxvY2F0aW9uID0gc2dvdC0+b3V0cHV0X29mZnNldCArIG9mZiAtIGdvdF9iYXNlOwotCSAgICB9Ci0JICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLQljYXNlIFJfU1BBUkNfV1BMVDMwOgotCWNhc2UgUl9TUEFSQ19QTFQzMjoKLQljYXNlIFJfU1BBUkNfSElQTFQyMjoKLQljYXNlIFJfU1BBUkNfTE9QTFQxMDoKLQljYXNlIFJfU1BBUkNfUENQTFQzMjoKLQljYXNlIFJfU1BBUkNfUENQTFQyMjoKLQljYXNlIFJfU1BBUkNfUENQTFQxMDoKLQljYXNlIFJfU1BBUkNfUExUNjQ6Ci0JICAvKiBSZWxvY2F0aW9uIGlzIHRvIHRoZSBlbnRyeSBmb3IgdGhpcyBzeW1ib2wgaW4gdGhlCi0gICAgICAgICAgICAgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICAqLwotCSAgQkZEX0FTU0VSVCAoaCAhPSBOVUxMKTsKLQotCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkbid0IG1ha2UgYSBQTFQgZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgVGhpcwotCQkgaGFwcGVucyB3aGVuIHN0YXRpY2FsbHkgbGlua2luZyBQSUMgY29kZSwgb3Igd2hlbgotCQkgdXNpbmcgLUJzeW1ib2xpYy4gICovCi0JICAgICAgZ290byBkb19kZWZhdWx0OwotCSAgICB9Ci0KLQkgIGlmIChzcGx0ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwpOwotCSAgICB9Ci0KLQkgIHJlbG9jYXRpb24gPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyBzcGx0LT5vdXRwdXRfb2Zmc2V0Ci0JCQkrIHNwYXJjNjRfZWxmX3BsdF9lbnRyeV9vZmZzZXQgKGgtPnBsdC5vZmZzZXQpKTsKLQkgIGdvdG8gZG9fZGVmYXVsdDsKLQotCWNhc2UgUl9TUEFSQ19PTE8xMDoKLQkgIHsKLQkgICAgYmZkX3ZtYSB4OwotCi0JICAgIHJlbG9jYXRpb24gKz0gcmVsLT5yX2FkZGVuZDsKLQkgICAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uICYgMHgzZmYpICsgRUxGNjRfUl9UWVBFX0RBVEEgKHJlbC0+cl9pbmZvKTsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgxZmZmKSB8IChyZWxvY2F0aW9uICYgMHgxZmZmKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX1dESVNQMTY6Ci0JICB7Ci0JICAgIGJmZF92bWEgeDsKLQotCSAgICByZWxvY2F0aW9uICs9IHJlbC0+cl9hZGRlbmQ7Ci0JICAgIC8qIEFkanVzdCBmb3IgcGMtcmVsYXRpdmUtbmVzcy4gICovCi0JICAgIHJlbG9jYXRpb24gLT0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0JICAgIHJlbG9jYXRpb24gLT0gcmVsLT5yX29mZnNldDsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgzMDNmZmYpIHwgKCgoKHJlbG9jYXRpb24gPj4gMikgJiAweGMwMDApIDw8IDYpCi0JCQkJICAgfCAoKHJlbG9jYXRpb24gPj4gMikgJiAweDNmZmYpKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX0hJWDIyOgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICByZWxvY2F0aW9uID0gcmVsb2NhdGlvbiBeIE1JTlVTX09ORTsKLQotCSAgICB4ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCSAgICB4ID0gKHggJiB+MHgzZmZmZmYpIHwgKChyZWxvY2F0aW9uID4+IDEwKSAmIDB4M2ZmZmZmKTsKLQkgICAgYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCB4LCBjb250ZW50cyArIHJlbC0+cl9vZmZzZXQpOwotCi0JICAgIHIgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCQkgICAgaG93dG8tPmJpdHNpemUsIGhvd3RvLT5yaWdodHNoaWZ0LAotCQkJCSAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChpbnB1dF9iZmQpLAotCQkJCSAgICByZWxvY2F0aW9uKTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBSX1NQQVJDX0xPWDEwOgotCSAgewotCSAgICBiZmRfdm1hIHg7Ci0KLQkgICAgcmVsb2NhdGlvbiArPSByZWwtPnJfYWRkZW5kOwotCSAgICByZWxvY2F0aW9uID0gKHJlbG9jYXRpb24gJiAweDNmZikgfCAweDFjMDA7Ci0KLQkgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgY29udGVudHMgKyByZWwtPnJfb2Zmc2V0KTsKLQkgICAgeCA9ICh4ICYgfjB4MWZmZikgfCByZWxvY2F0aW9uOwotCSAgICBiZmRfcHV0XzMyIChpbnB1dF9iZmQsIHgsIGNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7Ci0KLQkgICAgciA9IGJmZF9yZWxvY19vazsKLQkgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQlkb19kZWZhdWx0OgotCSAgciA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoaG93dG8sIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCQkJY29udGVudHMsIHJlbC0+cl9vZmZzZXQsCi0JCQkJCXJlbG9jYXRpb24sIHJlbC0+cl9hZGRlbmQpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHIpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgYmZkX3JlbG9jX292ZXJmbG93OgotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JICAgIGlmIChoICE9IE5VTEwpCi0JICAgICAgewotCQlpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrCi0JCSAgICAmJiBob3d0by0+cGNfcmVsYXRpdmUpCi0JCSAgewotCQkgICAgLyogQXNzdW1lIHRoaXMgaXMgYSBjYWxsIHByb3RlY3RlZCBieSBvdGhlciBjb2RlIHRoYXQKLQkJICAgICAgIGRldGVjdCB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIElmIHRoaXMgaXMgdGhlIGNhc2UsCi0JCSAgICAgICB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgb3ZlcmZsb3cuICBJZiBub3QsIHRoZSAKLQkJICAgICAgIHByb2dyYW0gaXMgaG9zZWQgYW55d2F5LCBhbmQgYSBsaXR0bGUgd2FybmluZyBpc24ndAotCQkgICAgICAgZ29pbmcgdG8gaGVscC4gICovCi0JCSAgICBicmVhazsKLQkJICB9Ci0JCSAgCi0JICAgICAgICBuYW1lID0gaC0+cm9vdC5yb290LnN0cmluZzsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCW5hbWUgPSAoYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbgotCQkJKGlucHV0X2JmZCwKLQkJCSBzeW10YWJfaGRyLT5zaF9saW5rLAotCQkJIHN5bS0+c3RfbmFtZSkpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkJaWYgKCpuYW1lID09ICdcMCcpCi0JCSAgbmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGlucHV0X2JmZCwgc2VjKTsKLQkgICAgICB9Ci0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0by0+bmFtZSwgKGJmZF92bWEpIDAsCi0JCSAgICBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbC0+cl9vZmZzZXQpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIGR5bmFtaWMgc3ltYm9sIGhhbmRsaW5nLiAgV2Ugc2V0IHRoZSBjb250ZW50cyBvZiB2YXJpb3VzCi0gICBkeW5hbWljIHNlY3Rpb25zIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmM2NF9lbGZfZmluaXNoX2R5bmFtaWNfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci17Ci0gIGJmZCAqZHlub2JqOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIGlmIChoLT5wbHQub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgUExULiAgU2V0IGl0IHVwLiAqLwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5keW5pbmR4ICE9IC0xKTsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZW50cnkgaW4gdGhlIC5yZWxhLnBsdCBzZWN0aW9uLiAgKi8KLQotICAgICAgaWYgKGgtPnBsdC5vZmZzZXQgPCBMQVJHRV9QTFRfVEhSRVNIT0xEKQotCXsKLQkgIHJlbGEucl9vZmZzZXQgPSBzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChoLT5wbHQub2Zmc2V0KTsKLQkgIHJlbGEucl9hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgbWF4ID0gc3BsdC0+X3Jhd19zaXplIC8gUExUX0VOVFJZX1NJWkU7Ci0JICByZWxhLnJfb2Zmc2V0ID0gc3BhcmM2NF9lbGZfcGx0X3B0cl9vZmZzZXQgKGgtPnBsdC5vZmZzZXQsIG1heCk7Ci0JICByZWxhLnJfYWRkZW5kID0gLShzcGFyYzY0X2VsZl9wbHRfZW50cnlfb2Zmc2V0IChoLT5wbHQub2Zmc2V0KSArIDQpOwotCX0KLSAgICAgIHJlbGEucl9vZmZzZXQgKz0gKHNwbHQtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzcGx0LT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIHJlbGEucl9pbmZvID0gRUxGNjRfUl9JTkZPIChoLT5keW5pbmR4LCBSX1NQQVJDX0pNUF9TTE9UKTsKLQotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzcmVsYS0+Y29udGVudHMKLQkJCQkgICsgaC0+cGx0Lm9mZnNldCkpOwotCi0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCXsKLQkgIC8qIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIGFzIGRlZmluZWQgaW4KLQkgICAgIHRoZSAucGx0IHNlY3Rpb24uICBMZWF2ZSB0aGUgdmFsdWUgYWxvbmUuICAqLwotCSAgc3ltLT5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT5nb3Qub2Zmc2V0ICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2dvdDsKLSAgICAgIGFzZWN0aW9uICpzcmVsYTsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIHJlbGE7Ci0KLSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhbiBlbnRyeSBpbiB0aGUgR09ULiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0gICAgICBzcmVsYSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucmVsYS5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHNnb3QgIT0gTlVMTCAmJiBzcmVsYSAhPSBOVUxMKTsKLQotICAgICAgcmVsYS5yX29mZnNldCA9IChzZ290LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgKGgtPmdvdC5vZmZzZXQgJn4gMSkpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgLUJzeW1ib2xpYyBsaW5rLCBhbmQgdGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0JIGxvY2FsbHksIHdlIGp1c3Qgd2FudCB0byBlbWl0IGEgUkVMQVRJVkUgcmVsb2MuICBMaWtld2lzZSBpZgotCSB0aGUgc3ltYm9sIHdhcyBmb3JjZWQgdG8gYmUgbG9jYWwgYmVjYXVzZSBvZiBhIHZlcnNpb24gZmlsZS4KLQkgVGhlIGVudHJ5IGluIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4KLQkgaW5pdGlhbGl6ZWQgaW4gdGhlIHJlbG9jYXRlX3NlY3Rpb24gZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgKGluZm8tPnN5bWJvbGljIHx8IGgtPmR5bmluZHggPT0gLTEpCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpKQotCXsKLQkgIGFzZWN0aW9uICpzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoMCwgUl9TUEFSQ19SRUxBVElWRSk7Ci0JICByZWxhLnJfYWRkZW5kID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJCSAgICsgc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyArIGgtPmdvdC5vZmZzZXQpOwotCSAgcmVsYS5yX2luZm8gPSBFTEY2NF9SX0lORk8gKGgtPmR5bmluZHgsIFJfU1BBUkNfR0xPQl9EQVQpOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICBiZmRfZWxmNjRfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmcmVsYSwKLQkJCQkgKChFbGY2NF9FeHRlcm5hbF9SZWxhICopIHNyZWxhLT5jb250ZW50cwotCQkJCSAgKyBzcmVsYS0+cmVsb2NfY291bnQpKTsKLSAgICAgICsrc3JlbGEtPnJlbG9jX2NvdW50OwotICAgIH0KLQotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX0NPUFkpICE9IDApCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotCi0gICAgICAvKiBUaGlzIHN5bWJvbHMgbmVlZHMgYSBjb3B5IHJlbG9jLiAgU2V0IGl0IHVwLiAgKi8KLQotICAgICAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCAhPSAtMSk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciwKLQkJCQkgICAiLnJlbGEuYnNzIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICByZWxhLnJfb2Zmc2V0ID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICByZWxhLnJfaW5mbyA9IEVMRjY0X1JfSU5GTyAoaC0+ZHluaW5keCwgUl9TUEFSQ19DT1BZKTsKLSAgICAgIHJlbGEucl9hZGRlbmQgPSAwOwotICAgICAgYmZkX2VsZjY0X3N3YXBfcmVsb2NhX291dCAob3V0cHV0X2JmZCwgJnJlbGEsCi0JCQkJICgoRWxmNjRfRXh0ZXJuYWxfUmVsYSAqKSBzLT5jb250ZW50cwotCQkJCSAgKyBzLT5yZWxvY19jb3VudCkpOwotICAgICAgKytzLT5yZWxvY19jb3VudDsKLSAgICB9Ci0KLSAgLyogTWFyayBzb21lIHNwZWNpYWxseSBkZWZpbmVkIHN5bWJvbHMgYXMgYWJzb2x1dGUuICAqLwotICBpZiAoc3RyY21wIChoLT5yb290LnJvb3Quc3RyaW5nLCAiX0RZTkFNSUMiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIikgPT0gMCkKLSAgICBzeW0tPnN0X3NobmR4ID0gU0hOX0FCUzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHVwIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNkeW47Ci0gIGFzZWN0aW9uICpzZ290OwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0gICAgICBFbGY2NF9FeHRlcm5hbF9EeW4gKmR5bmNvbiwgKmR5bmNvbmVuZDsKLQotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICBCRkRfQVNTRVJUIChzcGx0ICE9IE5VTEwgJiYgc2R5biAhPSBOVUxMKTsKLQotICAgICAgZHluY29uID0gKEVsZjY0X0V4dGVybmFsX0R5biAqKSBzZHluLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGY2NF9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsgc2R5bi0+X3Jhd19zaXplKTsKLSAgICAgIGZvciAoOyBkeW5jb24gPCBkeW5jb25lbmQ7IGR5bmNvbisrKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9EeW4gZHluOwotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGJvb2xlYW4gc2l6ZTsKLQotCSAgYmZkX2VsZjY0X3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGNhc2UgRFRfUExUR09UOiAgIG5hbWUgPSAiLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUExUUkVMU1o6IG5hbWUgPSAiLnJlbGEucGx0Ijsgc2l6ZSA9IHRydWU7IGJyZWFrOwotCSAgICBjYXNlIERUX0pNUFJFTDogICBuYW1lID0gIi5yZWxhLnBsdCI7IHNpemUgPSBmYWxzZTsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6CSAgICAgIG5hbWUgPSBOVUxMOyBzaXplID0gZmFsc2U7IGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChuYW1lICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqczsKLQotCSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgbmFtZSk7Ci0JICAgICAgaWYgKHMgPT0gTlVMTCkKLQkJZHluLmRfdW4uZF92YWwgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIHNpemUpCi0JCSAgICBkeW4uZF91bi5kX3B0ciA9IHMtPnZtYTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmIChzLT5fY29va2VkX3NpemUgIT0gMCkKLQkJCWR5bi5kX3VuLmRfdmFsID0gcy0+X2Nvb2tlZF9zaXplOwotCQkgICAgICBlbHNlCi0JCQlkeW4uZF91bi5kX3ZhbCA9IHMtPl9yYXdfc2l6ZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGJmZF9lbGY2NF9zd2FwX2R5bl9vdXQgKG91dHB1dF9iZmQsICZkeW4sIGR5bmNvbik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGNvbnRlbnRzIG9mIHRoZSAucGx0IHNlY3Rpb24uICAqLwotICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA+IDApCi0JewotCSAgc3BhcmM2NF9lbGZfYnVpbGRfcGx0KG91dHB1dF9iZmQsIHNwbHQtPmNvbnRlbnRzLAotCQkJCXNwbHQtPl9yYXdfc2l6ZSAvIFBMVF9FTlRSWV9TSVpFKTsKLQl9Ci0KLSAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKHNwbHQtPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfZW50c2l6ZSA9Ci0JUExUX0VOVFJZX1NJWkU7Ci0gICAgfQotCi0gIC8qIFNldCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdG8gdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbi4gICovCi0gIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzZ290ICE9IE5VTEwpOwotICBpZiAoc2dvdC0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBpZiAoc2R5biA9PSBOVUxMKQotCWJmZF9wdXRfNjQgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBzZ290LT5jb250ZW50cyk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dF82NCAob3V0cHV0X2JmZCwKLQkJICAgIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCQkgICAgc2dvdC0+Y29udGVudHMpOwotICAgIH0KLQotICBlbGZfc2VjdGlvbl9kYXRhIChzZ290LT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2VudHNpemUgPSA4OwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNkeW5zeW07Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IGM7Ci0KLSAgICAgIC8qIFNldCB1cCB0aGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgKi8KLQotICAgICAgc2R5bnN5bSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBCRkRfQVNTRVJUIChzZHluc3ltICE9IE5VTEwpOwotCi0gICAgICBzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9TRUNUSU9OKTsKLSAgICAgIHN5bS5zdF9vdGhlciA9IDA7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yIChzID0gb3V0cHV0X2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgaW50IGluZHg7Ci0KLQkgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCA9PSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3ltLnN0X3ZhbHVlID0gcy0+dm1hOwotCi0JICBpbmR4ID0gZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaWR4OwotCSAgQkZEX0FTU0VSVCAoaW5keCA+IDApOwotCSAgc3ltLnN0X3NobmR4ID0gaW5keDsKLQotCSAgYmZkX2VsZjY0X3N3YXBfc3ltYm9sX291dCAob3V0cHV0X2JmZCwgJnN5bSwKLQkJCQkgICAgIChQVFIpICgoKEVsZjY0X0V4dGVybmFsX1N5bSAqKQotCQkJCQkgICAgIHNkeW5zeW0tPmNvbnRlbnRzKQotCQkJCQkgICAgKyBlbGZfc2VjdGlvbl9kYXRhIChzKS0+ZHluaW5keCkpOwotCi0JICArK2M7Ci0JfQotCi0gICAgICAvKiBTZXQgdGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIG91dHB1dCAuZHluc3ltIHNlY3Rpb24gdG8gdGhlCi0gICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgZ2xvYmFsIHN5bWJvbC4gICovCi0gICAgICBlbGZfc2VjdGlvbl9kYXRhIChzZHluc3ltLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPSBjICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgZV9mbGFncyBmaWVsZC4gKi8KLQotLyogTWVyZ2UgYmFja2VuZCBzcGVjaWZpYyBkYXRhIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIG91dHB1dAotICAgb2JqZWN0IGZpbGUgd2hlbiBsaW5raW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBib29sZWFuIGVycm9yOwotICBmbGFnd29yZCBuZXdfZmxhZ3MsIG9sZF9mbGFnczsKLSAgaW50IG5ld19tbSwgb2xkX21tOwotCi0gIGlmIChiZmRfZ2V0X2ZsYXZvdXIgKGliZmQpICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuZXdfZmxhZ3MgPSBlbGZfZWxmaGVhZGVyIChpYmZkKS0+ZV9mbGFnczsKLSAgb2xkX2ZsYWdzID0gZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3M7Ci0KLSAgaWYgKCFlbGZfZmxhZ3NfaW5pdCAob2JmZCkpICAgLyogRmlyc3QgY2FsbCwgbm8gZmxhZ3Mgc2V0ICovCi0gICAgewotICAgICAgZWxmX2ZsYWdzX2luaXQgKG9iZmQpID0gdHJ1ZTsKLSAgICAgIGVsZl9lbGZoZWFkZXIgKG9iZmQpLT5lX2ZsYWdzID0gbmV3X2ZsYWdzOwotICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSBpZiAobmV3X2ZsYWdzID09IG9sZF9mbGFncykgICAgICAvKiBDb21wYXRpYmxlIGZsYWdzIGFyZSBvayAqLwotICAgIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvbXBhdGlibGUgZmxhZ3MgKi8KLSAgICB7Ci0gICAgICBlcnJvciA9IGZhbHNlOwotICAKLSAgICAgIG9sZF9mbGFncyB8PSAobmV3X2ZsYWdzICYgKEVGX1NQQVJDX1NVTl9VUzF8RUZfU1BBUkNfSEFMX1IxKSk7Ci0gICAgICBuZXdfZmxhZ3MgfD0gKG9sZF9mbGFncyAmIChFRl9TUEFSQ19TVU5fVVMxfEVGX1NQQVJDX0hBTF9SMSkpOwotICAgICAgaWYgKChvbGRfZmxhZ3MgJiAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKSA9PQotICAgICAgICAgICAoRUZfU1BBUkNfU1VOX1VTMXxFRl9TUEFSQ19IQUxfUjEpKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAgKF8oIiVzOiBsaW5raW5nIFVsdHJhU1BBUkMgc3BlY2lmaWMgd2l0aCBIQUwgc3BlY2lmaWMgY29kZSIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIC8qIENob29zZSB0aGUgbW9zdCByZXN0cmljdGl2ZSBtZW1vcnkgb3JkZXJpbmcgKi8KLSAgICAgIG9sZF9tbSA9IChvbGRfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKTsKLSAgICAgIG5ld19tbSA9IChuZXdfZmxhZ3MgJiBFRl9TUEFSQ1Y5X01NKTsKLSAgICAgIG9sZF9mbGFncyAmPSB+RUZfU1BBUkNWOV9NTTsKLSAgICAgIG5ld19mbGFncyAmPSB+RUZfU1BBUkNWOV9NTTsKLSAgICAgIGlmIChuZXdfbW0gPCBvbGRfbW0pIG9sZF9tbSA9IG5ld19tbTsKLSAgICAgIG9sZF9mbGFncyB8PSBvbGRfbW07Ci0gICAgICBuZXdfZmxhZ3MgfD0gb2xkX21tOwotCi0gICAgICAvKiBXYXJuIGFib3V0IGFueSBvdGhlciBtaXNtYXRjaGVzICovCi0gICAgICBpZiAobmV3X2ZsYWdzICE9IG9sZF9mbGFncykKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gdHJ1ZTsKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgIChfKCIlczogdXNlcyBkaWZmZXJlbnQgZV9mbGFncyAoMHglbHgpIGZpZWxkcyB0aGFuIHByZXZpb3VzIG1vZHVsZXMgKDB4JWx4KSIpLAotICAgICAgICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpLCAobG9uZyluZXdfZmxhZ3MsIChsb25nKW9sZF9mbGFncyk7Ci0gICAgICAgIH0KLQotICAgICAgZWxmX2VsZmhlYWRlciAob2JmZCktPmVfZmxhZ3MgPSBvbGRfZmxhZ3M7Ci0KLSAgICAgIGlmIChlcnJvcikKLSAgICAgICAgewotICAgICAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgcmlnaHQgbWFjaGluZSBudW1iZXIgZm9yIGEgU1BBUkM2NCBFTEYgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcGFyYzY0X2VsZl9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIG1hY2ggPSBiZmRfbWFjaF9zcGFyY192OTsKLSAgCi0gIGlmIChlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9mbGFncyAmIEVGX1NQQVJDX1NVTl9VUzEpCi0gICAgbWFjaCA9IGJmZF9tYWNoX3NwYXJjX3Y5YTsKLSAgcmV0dXJuIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3NwYXJjLCBtYWNoKTsKLX0KLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTQliZmRfZWxmNjRfc3BhcmNfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkiZWxmNjQtc3BhcmMiCi0jZGVmaW5lIEVMRl9BUkNICWJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIEVMRl9NQVhQQUdFU0laRSAweDEwMDAwMAotCi0vKiBUaGlzIGlzIHRoZSBvZmZpY2lhbCBBQkkgdmFsdWUuICAqLwotI2RlZmluZSBFTEZfTUFDSElORV9DT0RFIEVNX1NQQVJDVjkKLQotLyogVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3ZSB1c2VkIGJlZm9yZSB0aGUgQUJJIHdhcyByZWxlYXNlZC4gICovCi0jZGVmaW5lIEVMRl9NQUNISU5FX0FMVDEgRU1fT0xEX1NQQVJDVjkKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byBcCi0gIHNwYXJjNjRfZWxmX2luZm9fdG9faG93dG8KLSNkZWZpbmUgYmZkX2VsZjY0X2JmZF9yZWxvY190eXBlX2xvb2t1cCBcCi0gIHNwYXJjNjRfZWxmX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgXAotICBfYmZkX2VsZl9jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MgXAotICBzcGFyYzY0X2VsZl9jaGVja19yZWxvY3MKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sIFwKLSAgc3BhcmM2NF9lbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucyBcCi0gIHNwYXJjNjRfZWxmX3NpemVfZHluYW1pY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uIFwKLSAgc3BhcmM2NF9lbGZfcmVsb2NhdGVfc2VjdGlvbgotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wgXAotICBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zeW1ib2wKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMgXAotICBzcGFyYzY0X2VsZl9maW5pc2hfZHluYW1pY19zZWN0aW9ucwotCi0jZGVmaW5lIGJmZF9lbGY2NF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gIHNwYXJjNjRfZWxmX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBlbGZfYmFja2VuZF9vYmplY3RfcCBcCi0gIHNwYXJjNjRfZWxmX29iamVjdF9wCi0KLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9nb3RfcGx0IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcGx0X3JlYWRvbmx5IDAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltIDEKLQotLyogU2VjdGlvbiA1LjIuNCBvZiB0aGUgQUJJIHNwZWNpZmllcyBhIDI1Ni1ieXRlIGJvdW5kYXJ5IGZvciB0aGUgdGFibGUuICAqLwotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50IDgKLQotI2RlZmluZSBlbGZfYmFja2VuZF9nb3RfaGVhZGVyX3NpemUgOAotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfaGVhZGVyX3NpemUgUExUX0hFQURFUl9TSVpFCi0KLSNpbmNsdWRlICJlbGY2NC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGY2NC5jIGIvYmZkL2VsZjY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmI1YjUuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZjY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBFTEYgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUJCTY0Ci0KLSNpbmNsdWRlICJlbGZjb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW5hYmkuYyBiL2JmZC9lbGZhcm0tbmFiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NmYWRhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tbmFiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcyICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG5ldyBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLSNpZm5kZWYgTlVNX0VMRU0KLSNkZWZpbmUgTlVNX0VMRU0oYSkgIChzaXplb2YgKGEpIC8gKHNpemVvZiAoYSlbMF0pKQotI2VuZGlmCi0KLSNkZWZpbmUgVVNFX1JFTAotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICAgICAgICAgICAgICAiZWxmMzItbGl0dGxlYXJtIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICAgICAgICAgICAgIGJmZF9lbGYzMl9iaWdhcm1fdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybSIKLQotI2RlZmluZSBlbGZfaW5mb190b19ob3d0byAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICBlbGYzMl9hcm1faW5mb190b19ob3d0bwotCi0jZGVmaW5lIEFSTV9FTEZfQUJJX1ZFUlNJT04JCTAKLSNkZWZpbmUgQVJNX0VMRl9PU19BQklfVkVSU0lPTgkJRUxGT1NBQklfQVJNCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwCi0gIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fTk9ORSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1BDMjQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyNCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMGZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SRUwzMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDggYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9QQzEzLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUEMxMyIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gICAvKiAxNiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzE2LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzEyIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA4ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwOGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9BQlM1LAkvKiB0eXBlICovCi0JIDYsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA1LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fQUJTNSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2UwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogOCBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzgsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1NCUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1NCUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzIyLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMywJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fUEM4LAkgICAgICAgIC8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzgiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BTVBfVkNBTEw5IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fU1dJMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fU1dJMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDAwMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDAwMDAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1NXSTgsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TV0k4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogVGhlc2UgbmV4dCB0d28gcmVsb2NzIGFyZSBkZWZpbmVkLCBidXQgSSBkbyBub3Qga25vdyB3aGF0IHRoZXkgZG8uICAqLwotICAKLSAgSE9XVE8gKFJfQVJNX1hQQzI1LAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1hQQzI1IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1RITV9YUEMyMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9YUEMyMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwMDAsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMDAwLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBUaGVzZSBuZXh0IHRocmVlIHJlbG9jcyBhcmUgbm90IGRlZmluZWQsIGJ1dCB3ZSBuZWVkIHRvIGZpbGwgdGhlIHNwYWNlLiAgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xNyIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xOCIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fdW5rbm93bl8xOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBSZWxvY3MgdXNlZCBpbiBBUk0gTGludXggKi8KLSAgCi0gIEhPV1RPIChSX0FSTV9DT1BZLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0NPUFkiLAkJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9HTE9CX0RBVCwJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dMT0JfREFUIiwJLyogbmFtZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAgICAgICAgCi0gIEhPV1RPIChSX0FSTV9KVU1QX1NMT1QsCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9KVU1QX1NMT1QiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX1JFTEFUSVZFLAkvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgYmZkX2VsZl9nZW5lcmljX3JlbG9jLCAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fUkVMQVRJVkUiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVE9GRiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HT1RPRkYiLAkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVFBDLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dPVFBDIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gICAgICAgICAKLSAgSE9XVE8gKFJfQVJNX0dPVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HT1QzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotICAgICAgICAgCi0gIEhPV1RPIChSX0FSTV9QTFQzMiwJCS8qIHR5cGUgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDI2LCAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9QTFQzMiIsCQkvKiBuYW1lICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMHgwMGZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLSAgICAgICAgIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogRW5kIG9mIHJlbG9jcyB1c2VkIGluIEFSTSBMaW51eCAqLyAKLQotICBIT1dUTyAoUl9BUk1fUlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkFCUzMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SUEMyNCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUlBDMjQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9SQkFTRSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX0dOVV9WVElOSEVSSVQsIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLSAgICAgICAgICJSX0FSTV9HTlVfVlRJTkhFUklUIiwgLyogbmFtZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogZHN0X21hc2sgKi8KLSAgICAgICAgIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogR05VIGV4dGVuc2lvbiB0byByZWNvcmQgQysrIHZ0YWJsZSBtZW1iZXIgdXNhZ2UgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV92dGVudHJ5X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX0dOVV9WVEVOVFJZLCAgICAgLyogdHlwZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIF9iZmRfZWxmX3JlbF92dGFibGVfcmVsb2NfZm4sICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZURU5UUlkiLCAgIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSk7ICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDEyIGJpdCBwYyByZWxhdGl2ZSAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzExLAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzExIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKTsJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgcGMgcmVsYXRpdmUgKi8KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvID0KLSAgSE9XVE8gKFJfQVJNX1RITV9QQzksCQkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAKLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGFyZWxlbnQgKiBiZmRfcmVsb2M7Ci0gICAgIEVsZjMyX0ludGVybmFsX1JlbCAqIGVsZl9yZWxvYzsKLXsKLSAgdW5zaWduZWQgaW50IHJfdHlwZTsKLSAgCi0gIHJfdHlwZSA9IEVMRjMyX1JfVFlQRSAoZWxmX3JlbG9jLT5yX2luZm8pOwotCi0gIHN3aXRjaCAocl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJfQVJNX0dOVV9WVElOSEVSSVQ6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdnRpbmhlcml0X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFJfQVJNX0dOVV9WVEVOVFJZOgotICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX3Z0ZW50cnlfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fVEhNX1BDMTE6Ci0gICAgICBiZmRfcmVsb2MtPmhvd3RvID0gJiBlbGYzMl9hcm1fdGhtX3BjMTFfaG93dG87Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgUl9BUk1fVEhNX1BDOToKLSAgICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHJfdHlwZSA+PSBOVU1fRUxFTSAoZWxmMzJfYXJtX2hvd3RvX3RhYmxlKSkKLQliZmRfcmVsb2MtPmhvd3RvID0gTlVMTDsKLSAgICAgIGVsc2UKLSAgICAgICAgYmZkX3JlbG9jLT5ob3d0byA9ICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW3JfdHlwZV07Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0gIAotc3RydWN0IGVsZjMyX2FybV9yZWxvY19tYXAKLSAgewotICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAgYmZkX3JlbG9jX3ZhbDsKLSAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgICAgIGVsZl9yZWxvY192YWw7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCBlbGYzMl9hcm1fcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9OT05FfSwKLSAge0JGRF9SRUxPQ19BUk1fUENSRUxfQlJBTkNILCAgICAgUl9BUk1fUEMyNH0sCi0gIHtCRkRfUkVMT0NfMzIsICAgICAgICAgICAgICAgICAgIFJfQVJNX0FCUzMyfSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgUl9BUk1fUkVMMzJ9LAotICB7QkZEX1JFTE9DXzgsICAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlM4fSwKLSAge0JGRF9SRUxPQ18xNiwgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTMTZ9LAotICB7QkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLCAgICAgICBSX0FSTV9BQlMxMn0sCi0gIHtCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCwgICAgIFJfQVJNX1RITV9BQlM1fSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMywgUl9BUk1fVEhNX1BDMjJ9LAotICB7QkZEX1JFTE9DX0FSTV9DT1BZLCAgICAgICAgICAgICBSX0FSTV9DT1BZfSwKLSAge0JGRF9SRUxPQ19BUk1fR0xPQl9EQVQsICAgICAgICAgUl9BUk1fR0xPQl9EQVR9LAotICB7QkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QsICAgICAgICBSX0FSTV9KVU1QX1NMT1R9LAotICB7QkZEX1JFTE9DX0FSTV9SRUxBVElWRSwgICAgICAgICBSX0FSTV9SRUxBVElWRX0sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVE9GRiwgICAgICAgICAgIFJfQVJNX0dPVE9GRn0sCi0gIHtCRkRfUkVMT0NfQVJNX0dPVFBDLCAgICAgICAgICAgIFJfQVJNX0dPVFBDfSwKLSAge0JGRF9SRUxPQ19BUk1fR09UMzIsICAgICAgICAgICAgUl9BUk1fR09UMzJ9LAotICB7QkZEX1JFTE9DX0FSTV9QTFQzMiwgICAgICAgICAgICBSX0FSTV9QTFQzMn0KLX07Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlICoKLWVsZjMyX2FybV9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgY29kZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV92dGluaGVyaXRfaG93dG87Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gJiBlbGYzMl9hcm1fdnRlbnRyeV9ob3d0bzsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyOgotICAgICAgcmV0dXJuICYgZWxmMzJfYXJtX3RobV9wYzExX2hvd3RvOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV90aG1fcGM5X2hvd3RvOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRUxFTSAoZWxmMzJfYXJtX3JlbG9jX21hcCk7IGkgKyspCi0JaWYgKGVsZjMyX2FybV9yZWxvY19tYXBbaV0uYmZkX3JlbG9jX3ZhbCA9PSBjb2RlKQotCSAgcmV0dXJuICYgZWxmMzJfYXJtX2hvd3RvX3RhYmxlW2VsZjMyX2FybV9yZWxvY19tYXBbaV0uZWxmX3JlbG9jX3ZhbF07Ci0gICAgICAKLSAgICAgIHJldHVybiBOVUxMOwotICAgfQotfQotCi0jaW5jbHVkZSAiZWxmMzItYXJtLmgiCmRpZmYgLS1naXQgYS9iZmQvZWxmYXJtLW9hYmkuYyBiL2JmZC9lbGZhcm0tb2FiaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFkODNlLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZhcm0tb2FiaS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qIDMyLWJpdCBFTEYgc3VwcG9ydCBmb3IgQVJNIG9sZCBhYmkgb3B0aW9uLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImVsZi9hcm0tb2FiaS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotI2lmbmRlZiBOVU1fRUxFTQotI2RlZmluZSBOVU1fRUxFTShhKSAoc2l6ZW9mIChhKSAvIHNpemVvZiAoYSlbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBVU0VfUkVMQQotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgICAgICAgICAgICAgYmZkX2VsZjMyX2xpdHRsZWFybV9vYWJpX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAgICAgICAgICAgICJlbGYzMi1saXR0bGVhcm0tb2FiaSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgICAgICAgICAgICBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICAgICAgICAgICAgImVsZjMyLWJpZ2FybS1vYWJpIgotCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvICAgICAgICAgICAgICAgZWxmMzJfYXJtX2luZm9fdG9faG93dG8KLSNkZWZpbmUgZWxmX2luZm9fdG9faG93dG9fcmVsICAgICAgICAgICAwCi0KLSNkZWZpbmUgQVJNX0VMRl9BQklfVkVSU0lPTgkJMAotI2RlZmluZSBBUk1fRUxGX09TX0FCSV9WRVJTSU9OCQkwCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGVsZjMyX2FybV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogTm8gcmVsb2NhdGlvbiAqLwotICBIT1dUTyAoUl9BUk1fTk9ORSwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX05PTkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9QQzI0LAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9QQzI0IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDBmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IGFic29sdXRlICovCi0gIEhPV1RPIChSX0FSTV9BQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQUJTMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBzdGFuZGFyZCAzMmJpdCBwYy1yZWxhdGl2ZSByZWxvYyAqLwotICBIT1dUTyAoUl9BUk1fUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkVMMzIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSB0cnVlKSwJCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiA4IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTOCwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDgsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlM4IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgIC8qIDE2IGJpdCBhYnNvbHV0ZSAqLwotICBIT1dUTyAoUl9BUk1fQUJTMTYsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX0FCUzE2IiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxMiBiaXQgYWJzb2x1dGUgKi8KLSAgSE9XVE8gKFJfQVJNX0FCUzEyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9BQlMxMiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwOGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDhmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9USE1fQUJTNSwJLyogdHlwZSAqLwotCSA2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNSwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9BQlM1IiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgwMDAwMDdlMCwJCS8qIHNyY19tYXNrICovCi0JIDB4MDAwMDA3ZTAsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fVEhNX1BDMjIsCS8qIHR5cGUgKi8KLQkgMSwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDIzLAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fVEhNX1BDMjIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDA3ZmYwN2ZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwN2ZmMDdmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9TQlJFTDMyLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9TQlJFTDMyIiwJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIEhPV1RPIChSX0FSTV9BTVBfVkNBTEw5LAkvKiB0eXBlICovCi0JIDEsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fQU1QX1ZDQUxMOSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDAwZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwMGZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEMxMSwJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9USE1fUEMxMSIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4MDAwMDA3ZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDAwMDAwN2ZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMTIgYml0IHBjIHJlbGF0aXZlICovCi0gIEhPV1RPIChSX0FSTV9USE1fUEM5LAkJLyogdHlwZSAqLwotCSAxLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1RITV9QQzkiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDAwMDAwMGZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHgwMDAwMDBmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgaGllcmFyY2h5ICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRJTkhFUklULCAvKiB0eXBlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8KLSAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0cG9zICovCi0gICAgICAgICBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0gICAgICAgICAiUl9BUk1fR05VX1ZUSU5IRVJJVCIsIC8qIG5hbWUgKi8KLSAgICAgICAgIGZhbHNlLCAgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIHNyY19tYXNrICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGRzdF9tYXNrICovCi0gICAgICAgICBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEdOVSBleHRlbnNpb24gdG8gcmVjb3JkIEMrKyB2dGFibGUgbWVtYmVyIHVzYWdlICovCi0gIEhPV1RPIChSX0FSTV9HTlVfVlRFTlRSWSwgICAgIC8qIHR5cGUgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLSAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLwotICAgICAgICAgZmFsc2UsICAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8KLSAgICAgICAgIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0gICAgICAgICBfYmZkX2VsZl9yZWxfdnRhYmxlX3JlbG9jX2ZuLCAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX0dOVV9WVEVOVFJZIiwgICAvKiBuYW1lICovCi0gICAgICAgICBmYWxzZSwgICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBzcmNfbWFzayAqLwotICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBkc3RfbWFzayAqLwotICAgICAgICAgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotICAKLSAgSE9XVE8gKFJfQVJNX1BMVDMyLAkJLyogdHlwZSAqLwotICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovCi0gICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotICAgICAgICAgMjYsICAgICAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovCi0gICAgICAgICB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0gICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLwotICAgICAgICAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLSAgICAgICAgIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywgLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotICAgICAgICAgIlJfQVJNX1BMVDMyIiwJCS8qIG5hbWUgKi8KLSAgICAgICAgIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0gICAgICAgICAweDAwZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLSAgICAgICAgIDB4MDBmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotICAgICAgICAgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBYWFggLSBnYXAgaW4gaW5kZXggbnVtYmVyaW5nIGhlcmUuICAqLwotCi0gIEhPV1RPIChSX0FSTV9SUkVMMzIsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUkVMMzIiLAkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JBQlMzMiwJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LAkvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSBiZmRfZWxmX2dlbmVyaWNfcmVsb2MsCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJfQVJNX1JBQlMzMiIsCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICBIT1dUTyAoUl9BUk1fUlBDMjQsCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAwLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwJLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgYmZkX2VsZl9nZW5lcmljX3JlbG9jLAkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSX0FSTV9SUEMyNCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgSE9XVE8gKFJfQVJNX1JCQVNFLAkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsCS8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIGJmZF9lbGZfZ2VuZXJpY19yZWxvYywJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUl9BUk1fUkJBU0UiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotLyogTG9jYXRlIGEgcmVsb2MgaW4gdGhlIGhvd3RvIHRhYmxlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQKLSAgIHdoZW4gdGhlIGVudHJ5IG51bWJlciBpcyBpcyA+IFJfQVJNX0dOVV9WVElOSEVSSVQuICAqLwotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZmluZF9ob3d0byAocl90eXBlKQotICAgICB1bnNpZ25lZCBpbnQgcl90eXBlOwotewotICBpbnQgaTsKLSAgCi0gIGZvciAoaSA9IE5VTV9FTEVNIChlbGYzMl9hcm1faG93dG9fdGFibGUpOyBpLS07KQotICAgIGlmIChlbGYzMl9hcm1faG93dG9fdGFibGUgW2ldLnR5cGUgPT0gcl90eXBlKQotICAgICAgcmV0dXJuIGVsZjMyX2FybV9ob3d0b190YWJsZSArIGk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGYzMl9hcm1faW5mb190b19ob3d0byAoYWJmZCwgYmZkX3JlbG9jLCBlbGZfcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqYmZkX3JlbG9jOwotICAgICBFbGYzMl9JbnRlcm5hbF9SZWxhICplbGZfcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCByX3R5cGU7Ci0KLSAgcl90eXBlID0gRUxGMzJfUl9UWVBFIChlbGZfcmVsb2MtPnJfaW5mbyk7Ci0KLSAgaWYgKHJfdHlwZSA8PSBSX0FSTV9HTlVfVlRJTkhFUklUKQotICAgIGJmZF9yZWxvYy0+aG93dG8gPSAmIGVsZjMyX2FybV9ob3d0b190YWJsZVtyX3R5cGVdOwotICBlbHNlCi0gICAgYmZkX3JlbG9jLT5ob3d0byA9IGZpbmRfaG93dG8gKHJfdHlwZSk7Ci19Ci0KLXN0cnVjdCBlbGYzMl9hcm1fcmVsb2NfbWFwCi0gIHsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgYmZkX3JlbG9jX3ZhbDsKLSAgICB1bnNpZ25lZCBjaGFyIGVsZl9yZWxvY192YWw7Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZWxmMzJfYXJtX3JlbG9jX21hcCBlbGYzMl9hcm1fcmVsb2NfbWFwW10gPQotewotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9OT05FIH0sCi0gIHtCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCwgICAgIFJfQVJNX1BDMjQgfSwKLSAge0JGRF9SRUxPQ18zMiwgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTMzIgfSwKLSAge0JGRF9SRUxPQ18zMl9QQ1JFTCwgICAgICAgICAgICAgUl9BUk1fUkVMMzIgfSwKLSAge0JGRF9SRUxPQ184LCAgICAgICAgICAgICAgICAgICAgUl9BUk1fQUJTOCB9LAotICB7QkZEX1JFTE9DXzE2LCAgICAgICAgICAgICAgICAgICBSX0FSTV9BQlMxNiB9LAotICB7QkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NLCAgICAgICBSX0FSTV9BQlMxMiB9LAotICB7QkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQsICAgICBSX0FSTV9USE1fQUJTNSB9LAotICB7QkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDIzLCBSX0FSTV9USE1fUEMyMiB9LAotICB7QkZEX1JFTE9DX05PTkUsICAgICAgICAgICAgICAgICBSX0FSTV9TQlJFTDMyIH0sCi0gIHtCRkRfUkVMT0NfTk9ORSwgICAgICAgICAgICAgICAgIFJfQVJNX0FNUF9WQ0FMTDkgfSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiwgUl9BUk1fVEhNX1BDMTEgfSwKLSAge0JGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5LCAgUl9BUk1fVEhNX1BDOSB9LCAgCi0gIHtCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQsICAgICAgIFJfQVJNX0dOVV9WVElOSEVSSVQgfSwKLSAge0JGRF9SRUxPQ19WVEFCTEVfRU5UUlksICAgICAgICAgUl9BUk1fR05VX1ZURU5UUlkgfQotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgKgotZWxmMzJfYXJtX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKiBhYmZkOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gTlVNX0VMRU0gKGVsZjMyX2FybV9yZWxvY19tYXApOyBpLS07KQotICAgIGlmIChlbGYzMl9hcm1fcmVsb2NfbWFwW2ldLmJmZF9yZWxvY192YWwgPT0gY29kZSkKLSAgICAgIHJldHVybiAmIGVsZjMyX2FybV9ob3d0b190YWJsZSBbZWxmMzJfYXJtX3JlbG9jX21hcFtpXS5lbGZfcmVsb2NfdmFsXTsKLQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQVJNX1BMVDMyKQotICAgIHJldHVybiBmaW5kX2hvd3RvIChSX0FSTV9QTFQzMik7Ci0gIAotICByZXR1cm4gTlVMTDsKLX0KLQotI2RlZmluZSBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9lbGYzMl9hcm1fb2FiaV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJlbGYzMi1hcm0uaCIKZGlmZiAtLWdpdCBhL2JmZC9lbGZjb2RlLmggYi9iZmQvZWxmY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWExOTQzLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEzICswLDAgQEAKLS8qIEVMRiBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4gIFN1ZmZpY2llbnQgc3VwcG9ydCBmb3IgZ2RiLgotCi0gICBSZXdyaXR0ZW4gYnkgTWFyayBFaWNoaW4gQCBDeWdudXMgU3VwcG9ydCwgZnJvbSBpbmZvcm1hdGlvbgotICAgcHVibGlzaGVkIGluICJTeXN0ZW0gViBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlIiwgY2hhcHRlcnMgNAotICAgYW5kIDUsIGFzIHdlbGwgYXMgdGhlIHZhcmlvdXMgIlByb2Nlc3NvciBTdXBwbGVtZW50IiBkb2N1bWVudHMKLSAgIGRlcml2ZWQgZnJvbSBpdC4gQWRkZWQgc3VwcG9ydCBmb3IgYXNzZW1ibGVyIGFuZCBvdGhlciBvYmplY3QgZmlsZQotICAgdXRpbGl0aWVzLiAgRnVydGhlciB3b3JrIGRvbmUgYnkgS2VuIFJhZWJ1cm4gKEN5Z251cyBTdXBwb3J0KSwgTWljaGFlbAotICAgTWVpc3NuZXIgKE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiksIGFuZCBQZXRlciBIb29nZW5ib29tIChVbml2ZXJzaXR5Ci0gICBvZiBVdGFoKSB0byBmaW5pc2ggYW5kIGV4dGVuZCB0aGlzLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFByb2JsZW1zIGFuZCBvdGhlciBpc3N1ZXMgdG8gcmVzb2x2ZS4KLQotICAgKDEpCUJGRCBleHBlY3RzIHRoZXJlIHRvIGJlIHNvbWUgZml4ZWQgbnVtYmVyIG9mICJzZWN0aW9ucyIgaW4KLSAgICAgICAgdGhlIG9iamVjdCBmaWxlLiAgSS5FLiB0aGVyZSBpcyBhICJzZWN0aW9uX2NvdW50IiB2YXJpYWJsZSBpbiB0aGUKLQliZmQgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMuICBIb3dldmVyLCBFTEYKLQlzdXBwb3J0cyBtdWx0aXBsZSAidmlld3MiIG9mIGEgZmlsZS4gIEluIHBhcnRpY3VsYXIsIHdpdGggY3VycmVudAotCWltcGxlbWVudGF0aW9ucywgZXhlY3V0YWJsZSBmaWxlcyB0eXBpY2FsbHkgaGF2ZSB0d28gdGFibGVzLCBhCi0JcHJvZ3JhbSBoZWFkZXIgdGFibGUgYW5kIGEgc2VjdGlvbiBoZWFkZXIgdGFibGUsIGJvdGggb2Ygd2hpY2gKLQlwYXJ0aXRpb24gdGhlIGV4ZWN1dGFibGUuCi0KLQlJbiBFTEYtc3BlYWssIHRoZSAibGlua2luZyB2aWV3IiBvZiB0aGUgZmlsZSB1c2VzIHRoZSBzZWN0aW9uIGhlYWRlcgotCXRhYmxlIHRvIGFjY2VzcyAic2VjdGlvbnMiIHdpdGhpbiB0aGUgZmlsZSwgYW5kIHRoZSAiZXhlY3V0aW9uIHZpZXciCi0JdXNlcyB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUgdG8gYWNjZXNzICJzZWdtZW50cyIgd2l0aGluIHRoZSBmaWxlLgotCSJTZWdtZW50cyIgdHlwaWNhbGx5IG1heSBjb250YWluIGFsbCB0aGUgZGF0YSBmcm9tIG9uZSBvciBtb3JlCi0JInNlY3Rpb25zIi4KLQotCU5vdGUgdGhhdCB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUgaXMgb3B0aW9uYWwgaW4gRUxGIGV4ZWN1dGFibGVzLAotCWJ1dCBpdCBpcyB0aGlzIGluZm9ybWF0aW9uIHRoYXQgaXMgbW9zdCB1c2VmdWwgdG8gZ2RiLiAgSWYgdGhlCi0Jc2VjdGlvbiBoZWFkZXIgdGFibGUgaXMgbWlzc2luZywgdGhlbiBnZGIgc2hvdWxkIHByb2JhYmx5IHRyeQotCXRvIG1ha2UgZG8gd2l0aCB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUuICAoRklYTUUpCi0KLSAgICgyKSAgVGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGNvbXBpbGVkIHR3aWNlLCBvbmNlIGluIDMyLWJpdCBtb2RlIGFuZAotCW9uY2UgaW4gNjQtYml0IG1vZGUuICBNb3JlIG9mIGl0IHNob3VsZCBiZSBtYWRlIHNpemUtaW5kZXBlbmRlbnQKLQlhbmQgbW92ZWQgaW50byBlbGYuYy4KLQotICAgKDMpCUVMRiBzZWN0aW9uIHN5bWJvbHMgYXJlIGhhbmRsZWQgcmF0aGVyIHNsb3BwaWx5IG5vdy4gIFRoaXMgc2hvdWxkCi0JYmUgY2xlYW5lZCB1cCwgYW5kIEVMRiBzZWN0aW9uIHN5bWJvbHMgcmVjb25jaWxlZCB3aXRoIEJGRCBzZWN0aW9uCi0Jc3ltYm9scy4KLQotICAgKDQpICBXZSBuZWVkIGEgcHVibGlzaGVkIHNwZWMgZm9yIDY0LWJpdCBFTEYuICBXZSd2ZSBnb3Qgc29tZSBzdHVmZiBoZXJlCi0JdGhhdCB3ZSdyZSB1c2luZyBmb3IgU1BBUkMgVjkgNjQtYml0IGNoaXBzLCBidXQgZG9uJ3QgYXNzdW1lIHRoYXQKLQlpdCdzIGNhc3QgaW4gc3RvbmUuCi0gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0KLS8qIFJlbmFtaW5nIHN0cnVjdHVyZXMsIHR5cGVkZWZzLCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyB0byBiZSBzaXplLXNwZWNpZmljLiAgKi8KLSNkZWZpbmUgRWxmX0V4dGVybmFsX0VoZHIJTkFNRShFbGYsRXh0ZXJuYWxfRWhkcikKLSNkZWZpbmUgRWxmX0V4dGVybmFsX1N5bQlOQU1FKEVsZixFeHRlcm5hbF9TeW0pCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9TaGRyCU5BTUUoRWxmLEV4dGVybmFsX1NoZHIpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9QaGRyCU5BTUUoRWxmLEV4dGVybmFsX1BoZHIpCi0jZGVmaW5lIEVsZl9FeHRlcm5hbF9SZWwJTkFNRShFbGYsRXh0ZXJuYWxfUmVsKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfUmVsYQlOQU1FKEVsZixFeHRlcm5hbF9SZWxhKQotI2RlZmluZSBFbGZfRXh0ZXJuYWxfRHluCU5BTUUoRWxmLEV4dGVybmFsX0R5bikKLQotI2RlZmluZSBlbGZfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAlOQU1FKGJmZF9lbGYsY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkKLSNkZWZpbmUgZWxmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbAlOQU1FKGJmZF9lbGYsY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKQotI2RlZmluZSBlbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFwKLSAgTkFNRShiZmRfZWxmLGNvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkKLSNkZWZpbmUgZWxmX29iamVjdF9wCQkJTkFNRShiZmRfZWxmLG9iamVjdF9wKQotI2RlZmluZSBlbGZfY29yZV9maWxlX3AJCQlOQU1FKGJmZF9lbGYsY29yZV9maWxlX3ApCi0jZGVmaW5lIGVsZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCU5BTUUoYmZkX2VsZixnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotI2RlZmluZSBlbGZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFwKLSAgTkFNRShiZmRfZWxmLGdldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2NfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3JlbG9jX2luKQotI2RlZmluZSBlbGZfc3dhcF9yZWxvY2FfaW4JCU5BTUUoYmZkX2VsZixzd2FwX3JlbG9jYV9pbikKLSNkZWZpbmUgZWxmX3N3YXBfcmVsb2Nfb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9yZWxvY19vdXQpCi0jZGVmaW5lIGVsZl9zd2FwX3JlbG9jYV9vdXQJCU5BTUUoYmZkX2VsZixzd2FwX3JlbG9jYV9vdXQpCi0jZGVmaW5lIGVsZl9zd2FwX3N5bWJvbF9pbgkJTkFNRShiZmRfZWxmLHN3YXBfc3ltYm9sX2luKQotI2RlZmluZSBlbGZfc3dhcF9zeW1ib2xfb3V0CQlOQU1FKGJmZF9lbGYsc3dhcF9zeW1ib2xfb3V0KQotI2RlZmluZSBlbGZfc3dhcF9waGRyX2luCQlOQU1FKGJmZF9lbGYsc3dhcF9waGRyX2luKQotI2RlZmluZSBlbGZfc3dhcF9waGRyX291dAkJTkFNRShiZmRfZWxmLHN3YXBfcGhkcl9vdXQpCi0jZGVmaW5lIGVsZl9zd2FwX2R5bl9pbgkJCU5BTUUoYmZkX2VsZixzd2FwX2R5bl9pbikKLSNkZWZpbmUgZWxmX3N3YXBfZHluX291dAkJTkFNRShiZmRfZWxmLHN3YXBfZHluX291dCkKLSNkZWZpbmUgZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZAlOQU1FKGJmZF9lbGYsZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotI2RlZmluZSBlbGZfY2Fub25pY2FsaXplX3JlbG9jCQlOQU1FKGJmZF9lbGYsY2Fub25pY2FsaXplX3JlbG9jKQotI2RlZmluZSBlbGZfc2x1cnBfc3ltYm9sX3RhYmxlCQlOQU1FKGJmZF9lbGYsc2x1cnBfc3ltYm9sX3RhYmxlKQotI2RlZmluZSBlbGZfZ2V0X3N5bXRhYgkJCU5BTUUoYmZkX2VsZixnZXRfc3ltdGFiKQotI2RlZmluZSBlbGZfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgTkFNRShiZmRfZWxmLGNhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYikKLSNkZWZpbmUgZWxmX21ha2VfZW1wdHlfc3ltYm9sCQlOQU1FKGJmZF9lbGYsbWFrZV9lbXB0eV9zeW1ib2wpCi0jZGVmaW5lIGVsZl9nZXRfc3ltYm9sX2luZm8JCU5BTUUoYmZkX2VsZixnZXRfc3ltYm9sX2luZm8pCi0jZGVmaW5lIGVsZl9nZXRfbGluZW5vCQkJTkFNRShiZmRfZWxmLGdldF9saW5lbm8pCi0jZGVmaW5lIGVsZl9zZXRfYXJjaF9tYWNoCQlOQU1FKGJmZF9lbGYsc2V0X2FyY2hfbWFjaCkKLSNkZWZpbmUgZWxmX2ZpbmRfbmVhcmVzdF9saW5lCQlOQU1FKGJmZF9lbGYsZmluZF9uZWFyZXN0X2xpbmUpCi0jZGVmaW5lIGVsZl9zaXplb2ZfaGVhZGVycwkJTkFNRShiZmRfZWxmLHNpemVvZl9oZWFkZXJzKQotI2RlZmluZSBlbGZfc2V0X3NlY3Rpb25fY29udGVudHMJTkFNRShiZmRfZWxmLHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2RlZmluZSBlbGZfbm9faW5mb190b19ob3d0bwkJTkFNRShiZmRfZWxmLG5vX2luZm9fdG9faG93dG8pCi0jZGVmaW5lIGVsZl9ub19pbmZvX3RvX2hvd3RvX3JlbAlOQU1FKGJmZF9lbGYsbm9faW5mb190b19ob3d0b19yZWwpCi0jZGVmaW5lIGVsZl9maW5kX3NlY3Rpb24JCU5BTUUoYmZkX2VsZixmaW5kX3NlY3Rpb24pCi0jZGVmaW5lIGVsZl9iZmRfbGlua19hZGRfc3ltYm9scwlOQU1FKGJmZF9lbGYsYmZkX2xpbmtfYWRkX3N5bWJvbHMpCi0jZGVmaW5lIGVsZl9hZGRfZHluYW1pY19lbnRyeQkJTkFNRShiZmRfZWxmLGFkZF9keW5hbWljX2VudHJ5KQotI2RlZmluZSBlbGZfd3JpdGVfc2hkcnNfYW5kX2VoZHIJTkFNRShiZmRfZWxmLHdyaXRlX3NoZHJzX2FuZF9laGRyKQotI2RlZmluZSBlbGZfd3JpdGVfb3V0X3BoZHJzCQlOQU1FKGJmZF9lbGYsd3JpdGVfb3V0X3BoZHJzKQotI2RlZmluZSBlbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyBcCi0gIE5BTUUoYmZkX2VsZixsaW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zKQotI2RlZmluZSBlbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIGVsZl9iZmRfZmluYWxfbGluawkJTkFNRShiZmRfZWxmLGJmZF9maW5hbF9saW5rKQotI2RlZmluZSBlbGZfY3JlYXRlX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gTkFNRShiZmRfZWxmLGNyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKQotI2RlZmluZSBlbGZfZmluaXNoX3BvaW50ZXJfbGlua2VyX3NlY3Rpb24gTkFNRShiZmRfZWxmLGZpbmlzaF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uKQotI2RlZmluZSBlbGZfZ2Nfc2VjdGlvbnMJCQlOQU1FKF9iZmRfZWxmLGdjX3NlY3Rpb25zKQotI2RlZmluZSBlbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzIFwKLSAgTkFNRShfYmZkX2VsZixnY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMpCi0jZGVmaW5lIGVsZl9nY19jb21tb25fZmluYWxfbGluawlOQU1FKF9iZmRfZWxmLGdjX2NvbW1vbl9maW5hbF9saW5rKQotI2RlZmluZSBlbGZfZ2NfcmVjb3JkX3Z0aW5oZXJpdAkJTkFNRShfYmZkX2VsZixnY19yZWNvcmRfdnRpbmhlcml0KQotI2RlZmluZSBlbGZfZ2NfcmVjb3JkX3Z0ZW50cnkJCU5BTUUoX2JmZF9lbGYsZ2NfcmVjb3JkX3Z0ZW50cnkpCi0KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgRUxGX1JfSU5GTyhYLFkpCUVMRjY0X1JfSU5GTyhYLFkpCi0jZGVmaW5lIEVMRl9SX1NZTShYKQlFTEY2NF9SX1NZTShYKQotI2RlZmluZSBFTEZfUl9UWVBFKFgpCUVMRjY0X1JfVFlQRShYKQotI2RlZmluZSBFTEZDTEFTUwlFTEZDTEFTUzY0Ci0jZGVmaW5lIEZJTEVfQUxJR04JOAotI2RlZmluZSBMT0dfRklMRV9BTElHTgkzCi0jZW5kaWYKLSNpZiBBUkNIX1NJWkUgPT0gMzIKLSNkZWZpbmUgRUxGX1JfSU5GTyhYLFkpCUVMRjMyX1JfSU5GTyhYLFkpCi0jZGVmaW5lIEVMRl9SX1NZTShYKQlFTEYzMl9SX1NZTShYKQotI2RlZmluZSBFTEZfUl9UWVBFKFgpCUVMRjMyX1JfVFlQRShYKQotI2RlZmluZSBFTEZDTEFTUwlFTEZDTEFTUzMyCi0jZGVmaW5lIEZJTEVfQUxJR04JNAotI2RlZmluZSBMT0dfRklMRV9BTElHTgkyCi0jZW5kaWYKLQotLyogU3RhdGljIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCBlbGZfc3dhcF9laGRyX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGZfRXh0ZXJuYWxfRWhkciAqLCBFbGZfSW50ZXJuYWxfRWhkciAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc3dhcF9laGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0ludGVybmFsX0VoZHIgKiwgRWxmX0V4dGVybmFsX0VoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX3N3YXBfc2hkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX1NoZHIgKiwgRWxmX0ludGVybmFsX1NoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX3N3YXBfc2hkcl9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9TaGRyICosIEVsZl9FeHRlcm5hbF9TaGRyICopKTsKLQotI2RlZmluZSBlbGZfc3RyaW5ndGFiX2luaXQgX2JmZF9lbGZfc3RyaW5ndGFiX2luaXQKLQotI2RlZmluZSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IGJmZF9zZWN0aW9uX2Zyb21fZWxmX2luZGV4Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9zbHVycF9yZWxvY190YWJsZV9mcm9tX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBiZmRfc2l6ZV90eXBlLAotCSAgIGFyZWxlbnQgKiwgYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gZWxmX3NsdXJwX3JlbG9jX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9maWxlX3AgUEFSQU1TICgoRWxmX0V4dGVybmFsX0VoZHIgKikpOwotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkIGVsZl9kZWJ1Z19zZWN0aW9uIFBBUkFNUyAoKGludCwgRWxmX0ludGVybmFsX1NoZHIgKikpOwotc3RhdGljIHZvaWQgZWxmX2RlYnVnX2ZpbGUgUEFSQU1TICgoRWxmX0ludGVybmFsX0VoZHIgKikpOwotc3RhdGljIGNoYXIgKmVsZl9zeW1ib2xfZmxhZ3MgUEFSQU1TICgoZmxhZ3dvcmQpKTsKLSNlbmRpZgotDAotLyogU3RydWN0dXJlIHN3YXBwaW5nIHJvdXRpbmVzICovCi0KLS8qIFNob3VsZCBwZXJoYXBzIHVzZSBwdXRfb2Zmc2V0LCBwdXRfd29yZCwgZXRjLiAgRm9yIG5vdywgdGhlIHR3byB2ZXJzaW9ucwotICAgY2FuIGJlIGhhbmRsZWQgYnkgZXhwbGljaXRseSBzcGVjaWZ5aW5nIDMyIGJpdHMgb3IgInRoZSBsb25nIHR5cGUiLiAgKi8KLSNpZiBBUkNIX1NJWkUgPT0gNjQKLSNkZWZpbmUgcHV0X3dvcmQJYmZkX2hfcHV0XzY0Ci0jZGVmaW5lIHB1dF9zaWduZWRfd29yZAliZmRfaF9wdXRfc2lnbmVkXzY0Ci0jZGVmaW5lIGdldF93b3JkCWJmZF9oX2dldF82NAotI2RlZmluZSBnZXRfc2lnbmVkX3dvcmQJYmZkX2hfZ2V0X3NpZ25lZF82NAotI2VuZGlmCi0jaWYgQVJDSF9TSVpFID09IDMyCi0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF8zMgotI2RlZmluZSBwdXRfc2lnbmVkX3dvcmQJYmZkX2hfcHV0X3NpZ25lZF8zMgotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfMzIKLSNkZWZpbmUgZ2V0X3NpZ25lZF93b3JkCWJmZF9oX2dldF9zaWduZWRfMzIKLSNlbmRpZgotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbiBFTEYgc3ltYm9sIGluIGludGVybmFsCi0gICBmb3JtYXQuICovCi0KLXZvaWQKLWVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1N5bSAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpkc3Q7Ci17Ci0gIGRzdC0+c3RfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfbmFtZSk7Ci0gIGRzdC0+c3RfdmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3RfdmFsdWUpOwotICBkc3QtPnN0X3NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c3Rfc2l6ZSk7Ci0gIGRzdC0+c3RfaW5mbyA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9pbmZvKTsKLSAgZHN0LT5zdF9vdGhlciA9IGJmZF9oX2dldF84IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zdF9vdGhlcik7Ci0gIGRzdC0+c3Rfc2huZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnN0X3NobmR4KTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzeW1ib2wgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIHN5bWJvbCBpbiBleHRlcm5hbAotICAgZm9ybWF0LiAqLwotCi12b2lkCi1lbGZfc3dhcF9zeW1ib2xfb3V0IChhYmZkLCBzcmMsIGNkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqc3JjOwotICAgICBQVFIgY2RzdDsKLXsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZHN0ID0gKEVsZl9FeHRlcm5hbF9TeW0gKikgY2RzdDsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnN0X25hbWUsIGRzdC0+c3RfbmFtZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnN0X3ZhbHVlLCBkc3QtPnN0X3ZhbHVlKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c3Rfc2l6ZSwgZHN0LT5zdF9zaXplKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3RfaW5mbywgZHN0LT5zdF9pbmZvKTsKLSAgYmZkX2hfcHV0XzggKGFiZmQsIHNyYy0+c3Rfb3RoZXIsIGRzdC0+c3Rfb3RoZXIpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+c3Rfc2huZHgsIGRzdC0+c3Rfc2huZHgpOwotfQotCi0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgZmlsZSBoZWFkZXIgaW4gZXh0ZXJuYWwgZm9ybWF0IGludG8gYW4gRUxGIGZpbGUgaGVhZGVyIGluCi0gICBpbnRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9laGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfRXh0ZXJuYWxfRWhkciAqc3JjOwotICAgICBFbGZfSW50ZXJuYWxfRWhkciAqZHN0OwotewotICBtZW1jcHkgKGRzdC0+ZV9pZGVudCwgc3JjLT5lX2lkZW50LCBFSV9OSURFTlQpOwotICBkc3QtPmVfdHlwZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV90eXBlKTsKLSAgZHN0LT5lX21hY2hpbmUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfbWFjaGluZSk7Ci0gIGRzdC0+ZV92ZXJzaW9uID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3ZlcnNpb24pOwotICBkc3QtPmVfZW50cnkgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9lbnRyeSk7Ci0gIGRzdC0+ZV9waG9mZiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3Bob2ZmKTsKLSAgZHN0LT5lX3Nob2ZmID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hvZmYpOwotICBkc3QtPmVfZmxhZ3MgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfZmxhZ3MpOwotICBkc3QtPmVfZWhzaXplID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX2Voc2l6ZSk7Ci0gIGRzdC0+ZV9waGVudHNpemUgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfcGhlbnRzaXplKTsKLSAgZHN0LT5lX3BobnVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5lX3BobnVtKTsKLSAgZHN0LT5lX3NoZW50c2l6ZSA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZV9zaGVudHNpemUpOwotICBkc3QtPmVfc2hudW0gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hudW0pOwotICBkc3QtPmVfc2hzdHJuZHggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmVfc2hzdHJuZHgpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gRUxGIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdCBpbnRvIGFuIEVMRiBmaWxlIGhlYWRlciBpbgotICAgZXh0ZXJuYWwgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotZWxmX3N3YXBfZWhkcl9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9FaGRyICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9FaGRyICpkc3Q7Ci17Ci0gIG1lbWNweSAoZHN0LT5lX2lkZW50LCBzcmMtPmVfaWRlbnQsIEVJX05JREVOVCk7Ci0gIC8qIG5vdGUgdGhhdCBhbGwgZWxlbWVudHMgb2YgZHN0IGFyZSAqYXJyYXlzIG9mIHVuc2lnbmVkIGNoYXIqIGFscmVhZHkuLi4gKi8KLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfdHlwZSwgZHN0LT5lX3R5cGUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9tYWNoaW5lLCBkc3QtPmVfbWFjaGluZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5lX3ZlcnNpb24sIGRzdC0+ZV92ZXJzaW9uKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9lbnRyeSwgZHN0LT5lX2VudHJ5KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9waG9mZiwgZHN0LT5lX3Bob2ZmKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZV9zaG9mZiwgZHN0LT5lX3Nob2ZmKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPmVfZmxhZ3MsIGRzdC0+ZV9mbGFncyk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX2Voc2l6ZSwgZHN0LT5lX2Voc2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BoZW50c2l6ZSwgZHN0LT5lX3BoZW50c2l6ZSk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgc3JjLT5lX3BobnVtLCBkc3QtPmVfcGhudW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaGVudHNpemUsIGRzdC0+ZV9zaGVudHNpemUpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIHNyYy0+ZV9zaG51bSwgZHN0LT5lX3NobnVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBzcmMtPmVfc2hzdHJuZHgsIGRzdC0+ZV9zaHN0cm5keCk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLWVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9TaGRyICpzcmM7Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpkc3Q7Ci17Ci0gIGRzdC0+c2hfbmFtZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfbmFtZSk7Ci0gIGRzdC0+c2hfdHlwZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfdHlwZSk7Ci0gIGRzdC0+c2hfZmxhZ3MgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfZmxhZ3MpOwotICBkc3QtPnNoX2FkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcik7Ci0gIGRzdC0+c2hfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX29mZnNldCk7Ci0gIGRzdC0+c2hfc2l6ZSA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9zaXplKTsKLSAgZHN0LT5zaF9saW5rID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9saW5rKTsKLSAgZHN0LT5zaF9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5zaF9pbmZvKTsKLSAgZHN0LT5zaF9hZGRyYWxpZ24gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+c2hfYWRkcmFsaWduKTsKLSAgZHN0LT5zaF9lbnRzaXplID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnNoX2VudHNpemUpOwotICBkc3QtPmJmZF9zZWN0aW9uID0gTlVMTDsKLSAgZHN0LT5jb250ZW50cyA9IE5VTEw7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBhbiBFTEYgc2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgaW4gaW50ZXJuYWwgZm9ybWF0IGludG8gYW4KLSAgIEVMRiBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQuICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfc3dhcF9zaGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1NoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1NoZHIgKmRzdDsKLXsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfbmFtZSwgZHN0LT5zaF9uYW1lKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBzcmMtPnNoX3R5cGUsIGRzdC0+c2hfdHlwZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2ZsYWdzLCBkc3QtPnNoX2ZsYWdzKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkciwgZHN0LT5zaF9hZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfb2Zmc2V0LCBkc3QtPnNoX29mZnNldCk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX3NpemUsIGRzdC0+c2hfc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgc3JjLT5zaF9saW5rLCBkc3QtPnNoX2xpbmspOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+c2hfaW5mbywgZHN0LT5zaF9pbmZvKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+c2hfYWRkcmFsaWduLCBkc3QtPnNoX2FkZHJhbGlnbik7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnNoX2VudHNpemUsIGRzdC0+c2hfZW50c2l6ZSk7Ci19Ci0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiBwcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbgotICAgRUxGIHByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotdm9pZAotZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1BoZHIgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKmRzdDsKLXsKLSAgZHN0LT5wX3R5cGUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfdHlwZSk7Ci0gIGRzdC0+cF9mbGFncyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9mbGFncyk7Ci0gIGRzdC0+cF9vZmZzZXQgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF9vZmZzZXQpOwotICBkc3QtPnBfdmFkZHIgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cF92YWRkcik7Ci0gIGRzdC0+cF9wYWRkciA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX3BhZGRyKTsKLSAgZHN0LT5wX2ZpbGVzeiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX2ZpbGVzeik7Ci0gIGRzdC0+cF9tZW1zeiA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5wX21lbXN6KTsKLSAgZHN0LT5wX2FsaWduID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnBfYWxpZ24pOwotfQotCi12b2lkCi1lbGZfc3dhcF9waGRyX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1BoZHIgKnNyYzsKLSAgICAgRWxmX0V4dGVybmFsX1BoZHIgKmRzdDsKLXsKLSAgLyogbm90ZSB0aGF0IGFsbCBlbGVtZW50cyBvZiBkc3QgYXJlICphcnJheXMgb2YgdW5zaWduZWQgY2hhciogYWxyZWFkeS4uLiAqLwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cF90eXBlLCBkc3QtPnBfdHlwZSk7Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnBfb2Zmc2V0LCBkc3QtPnBfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF92YWRkciwgZHN0LT5wX3ZhZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9wYWRkciwgZHN0LT5wX3BhZGRyKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9maWxlc3osIGRzdC0+cF9maWxlc3opOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5wX21lbXN6LCBkc3QtPnBfbWVtc3opOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIHNyYy0+cF9mbGFncywgZHN0LT5wX2ZsYWdzKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cF9hbGlnbiwgZHN0LT5wX2FsaWduKTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiByZWxvYyBmcm9tIGV4dGVybmFsIGZvcm1hdCB0byBpbnRlcm5hbCBmb3JtYXQuICovCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2NfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9FeHRlcm5hbF9SZWwgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbCAqZHN0OwotewotICBkc3QtPnJfb2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfb2Zmc2V0KTsKLSAgZHN0LT5yX2luZm8gPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cl9pbmZvKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0V4dGVybmFsX1JlbGEgKnNyYzsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmRzdDsKLXsKLSAgZHN0LT5yX29mZnNldCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5yX29mZnNldCk7Ci0gIGRzdC0+cl9pbmZvID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfaW5mbyk7Ci0gIGRzdC0+cl9hZGRlbmQgPSBnZXRfc2lnbmVkX3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJfYWRkZW5kKTsKLX0KLQotLyogVHJhbnNsYXRlIGFuIEVMRiByZWxvYyBmcm9tIGludGVybmFsIGZvcm1hdCB0byBleHRlcm5hbCBmb3JtYXQuICovCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9SZWwgKmRzdDsKLXsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9vZmZzZXQsIGRzdC0+cl9vZmZzZXQpOwotICBwdXRfd29yZCAoYWJmZCwgc3JjLT5yX2luZm8sIGRzdC0+cl9pbmZvKTsKLX0KLQotSU5MSU5FIHZvaWQKLWVsZl9zd2FwX3JlbG9jYV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IEVsZl9JbnRlcm5hbF9SZWxhICpzcmM7Ci0gICAgIEVsZl9FeHRlcm5hbF9SZWxhICpkc3Q7Ci17Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPnJfb2Zmc2V0LCBkc3QtPnJfb2Zmc2V0KTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+cl9pbmZvLCBkc3QtPnJfaW5mbyk7Ci0gIHB1dF9zaWduZWRfd29yZCAoYWJmZCwgc3JjLT5yX2FkZGVuZCwgZHN0LT5yX2FkZGVuZCk7Ci19Ci0KLUlOTElORSB2b2lkCi1lbGZfc3dhcF9keW5faW4gKGFiZmQsIHAsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBQVFIgcDsKLSAgICAgRWxmX0ludGVybmFsX0R5biAqZHN0OwotewotICBjb25zdCBFbGZfRXh0ZXJuYWxfRHluICpzcmMgPSAoY29uc3QgRWxmX0V4dGVybmFsX0R5biAqKSBwOwotCi0gIGRzdC0+ZF90YWcgPSBnZXRfd29yZCAoYWJmZCwgc3JjLT5kX3RhZyk7Ci0gIGRzdC0+ZF91bi5kX3ZhbCA9IGdldF93b3JkIChhYmZkLCBzcmMtPmRfdW4uZF92YWwpOwotfQotCi1JTkxJTkUgdm9pZAotZWxmX3N3YXBfZHluX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX0R5biAqc3JjOwotICAgICBFbGZfRXh0ZXJuYWxfRHluICpkc3Q7Ci17Ci0gIHB1dF93b3JkIChhYmZkLCBzcmMtPmRfdGFnLCBkc3QtPmRfdGFnKTsKLSAgcHV0X3dvcmQgKGFiZmQsIHNyYy0+ZF91bi5kX3ZhbCwgZHN0LT5kX3VuLmRfdmFsKTsKLX0KLQwKLS8qIEVMRiAuby9leGVjIGZpbGUgcmVhZGluZyAqLwotCi0KLS8qIEJlZ2luIHByb2Nlc3NpbmcgYSBnaXZlbiBvYmplY3QuCi0KLSAgIEZpcnN0IHdlIHZhbGlkYXRlIHRoZSBmaWxlIGJ5IHJlYWRpbmcgaW4gdGhlIEVMRiBoZWFkZXIgYW5kIGNoZWNraW5nCi0gICB0aGUgbWFnaWMgbnVtYmVyLiAgKi8KLQotc3RhdGljIElOTElORSBib29sZWFuCi1lbGZfZmlsZV9wICh4X2VoZHJwKQotICAgICBFbGZfRXh0ZXJuYWxfRWhkciAqeF9laGRycDsKLXsKLSAgcmV0dXJuICgoeF9laGRycC0+ZV9pZGVudFtFSV9NQUcwXSA9PSBFTEZNQUcwKQotCSAgJiYgKHhfZWhkcnAtPmVfaWRlbnRbRUlfTUFHMV0gPT0gRUxGTUFHMSkKLQkgICYmICh4X2VoZHJwLT5lX2lkZW50W0VJX01BRzJdID09IEVMRk1BRzIpCi0JICAmJiAoeF9laGRycC0+ZV9pZGVudFtFSV9NQUczXSA9PSBFTEZNQUczKSk7Ci19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggQUJGRCBtYXRjaGVzIHRoZSB0YXJnZXQgdmVjdG9yCi0gICB0aGF0IEFCRkQgcG9pbnRzIHRvLgotCi0gICBOb3RlIHRoYXQgd2UgbWF5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIHdpdGggdGhlIHNhbWUgQUJGRCwgYnV0IGRpZmZlcmVudAotICAgdGFyZ2V0IHZlY3RvcnMsIG1vc3Qgb2Ygd2hpY2ggd2lsbCBub3QgbWF0Y2guICBXZSBoYXZlIHRvIGF2b2lkIGxlYXZpbmcKLSAgIGFueSBzaWRlIGVmZmVjdHMgaW4gQUJGRCwgb3IgYW55IGRhdGEgaXQgcG9pbnRzIHRvIChsaWtlIHRkYXRhKSwgaWYgdGhlCi0gICBmaWxlIGRvZXMgbm90IG1hdGNoIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1lbGZfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgRWxmX0V4dGVybmFsX0VoZHIgeF9laGRyOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGV4dGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX0VoZHIgKmlfZWhkcnA7CS8qIEVsZiBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBFbGZfRXh0ZXJuYWxfU2hkciB4X3NoZHI7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5LCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9TaGRyICppX3NoZHJwID0gTlVMTDsgLyogU2VjdGlvbiBoZWFkZXIgdGFibGUsIGludGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgaW50IHNoaW5kZXg7Ci0gIGNoYXIgKnNoc3RydGFiOwkJLyogSW50ZXJuYWwgY29weSBvZiBzZWN0aW9uIGhlYWRlciBzdHJpbmd0YWIgKi8KLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZDsKLSAgc3RydWN0IGVsZl9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IGVsZl90ZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBlbGZfb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOwotICBhc2VjdGlvbiAqczsKLQotICAvKiBSZWFkIGluIHRoZSBFTEYgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHhfZWhkcikpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogTm93IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgdmFsaWQgRUxGIGZpbGUsIGFuZCBvbmUgdGhhdCBCRkQgY2FuCi0gICAgIG1ha2UgdXNlIG9mLiAgVGhlIG1hZ2ljIG51bWJlciBtdXN0IG1hdGNoLCB0aGUgYWRkcmVzcyBzaXplICgnY2xhc3MnKQotICAgICBhbmQgYnl0ZS1zd2FwcGluZyBtdXN0IG1hdGNoIG91ciBYVkVDIGVudHJ5LCBhbmQgaXQgbXVzdCBoYXZlIGEKLSAgICAgc2VjdGlvbiBoZWFkZXIgdGFibGUgKEZJWE1FOiBTZWUgY29tbWVudHMgcmUgc2VjdGlvbnMgYXQgdG9wIG9mIHRoaXMKLSAgICAgZmlsZSkuICovCi0KLSAgaWYgKChlbGZfZmlsZV9wICgmeF9laGRyKSA9PSBmYWxzZSkgfHwKLSAgICAgICh4X2VoZHIuZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UKSB8fAotICAgICAgKHhfZWhkci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUykpCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIENoZWNrIHRoYXQgZmlsZSdzIGJ5dGUgb3JkZXIgbWF0Y2hlcyB4dmVjJ3MgKi8KLSAgc3dpdGNoICh4X2VoZHIuZV9pZGVudFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBMk1TQjoJCS8qIEJpZy1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBMkxTQjoJCS8qIExpdHRsZS1lbmRpYW4gKi8KLSAgICAgIGlmICghIGJmZF9oZWFkZXJfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFTEZEQVRBTk9ORToJCS8qIE5vIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCi0gICAgZGVmYXVsdDoJCQkvKiBVbmtub3duIGRhdGEgZW5jb2Rpbmcgc3BlY2lmaWVkICovCi0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBlbGZfb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bwotICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KLQotICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBlbGZfb2JqX3RkYXRhICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGVsZl9vYmpfdGRhdGEpKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLSAgZWxmX3RkYXRhIChhYmZkKSA9IG5ld190ZGF0YTsKLQotICAvKiBOb3cgdGhhdCB3ZSBrbm93IHRoZSBieXRlIG9yZGVyLCBzd2FwIGluIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgKi8KLSAgaV9laGRycCA9IGVsZl9lbGZoZWFkZXIgKGFiZmQpOwotICBlbGZfc3dhcF9laGRyX2luIChhYmZkLCAmeF9laGRyLCBpX2VoZHJwKTsKLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0KLSAgLyogUmVqZWN0IEVUX0NPUkUgKGhlYWRlciBpbmRpY2F0ZXMgY29yZSBmaWxlLCBub3Qgb2JqZWN0IGZpbGUpICovCi0gIGlmIChpX2VoZHJwLT5lX3R5cGUgPT0gRVRfQ09SRSkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgLyogSWYgdGhlcmUgaXMgbm8gc2VjdGlvbiBoZWFkZXIgdGFibGUsIHdlJ3JlIGhvc2VkLiAqLwotICBpZiAoaV9laGRycC0+ZV9zaG9mZiA9PSAwKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBBcyBhIHNpbXBsZSBzYW5pdHkgY2hlY2ssIHZlcmlmeSB0aGF0IHRoZSB3aGF0IEJGRCB0aGlua3MgaXMgdGhlCi0gICAgIHNpemUgb2YgZWFjaCBzZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBhY3R1YWxseSBtYXRjaGVzIHRoZSBzaXplCi0gICAgIHJlY29yZGVkIGluIHRoZSBmaWxlLiAqLwotICBpZiAoaV9laGRycC0+ZV9zaGVudHNpemUgIT0gc2l6ZW9mICh4X3NoZHIpKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgRUxGIGVfbWFjaGluZSBmaWVsZCBtYXRjaGVzIHdoYXQgdGhpcyBwYXJ0aWN1bGFyCi0gICAgIEJGRCBmb3JtYXQgZXhwZWN0cy4gICovCi0gIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gaV9laGRycC0+ZV9tYWNoaW5lCi0gICAgICAmJiAoZWJkLT5lbGZfbWFjaGluZV9hbHQxID09IDAgfHwgaV9laGRycC0+ZV9tYWNoaW5lICE9IGViZC0+ZWxmX21hY2hpbmVfYWx0MSkKLSAgICAgICYmIChlYmQtPmVsZl9tYWNoaW5lX2FsdDIgPT0gMCB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQyKSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldF9wdHI7Ci0KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0KLSAgICAgIC8qIFRoaXMgaXMgdGhlIGdlbmVyaWMgRUxGIHRhcmdldC4gIExldCBpdCBtYXRjaCBhbnkgRUxGIHRhcmdldAotCSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyBiYWNrZW5kLiAgKi8KLSAgICAgIGZvciAodGFyZ2V0X3B0ciA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0X3B0ciAhPSBOVUxMOyB0YXJnZXRfcHRyKyspCi0JewotCSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJhY2s7Ci0KLQkgIGlmICgoKnRhcmdldF9wdHIpLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIGNvbnRpbnVlOwotCSAgYmFjayA9IChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoKnRhcmdldF9wdHIpLT5iYWNrZW5kX2RhdGE7Ci0JICBpZiAoYmFjay0+ZWxmX21hY2hpbmVfY29kZSA9PSBpX2VoZHJwLT5lX21hY2hpbmUKLQkgICAgICB8fCAoYmFjay0+ZWxmX21hY2hpbmVfYWx0MSAhPSAwCi0JCSAgJiYgYmFjay0+ZWxmX21hY2hpbmVfYWx0MSA9PSBpX2VoZHJwLT5lX21hY2hpbmUpCi0JICAgICAgfHwgKGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgIT0gMAotCQkgICYmIGJhY2stPmVsZl9tYWNoaW5lX2FsdDIgPT0gaV9laGRycC0+ZV9tYWNoaW5lKSkKLQkgICAgewotCSAgICAgIC8qIHRhcmdldF9wdHIgaXMgYW4gRUxGIGJhY2tlbmQgd2hpY2ggbWF0Y2hlcyB0aGlzCi0JCSBvYmplY3QgZmlsZSwgc28gcmVqZWN0IHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICAqLwotCSAgICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGlfZWhkcnAtPmVfdHlwZSA9PSBFVF9FWEVDKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSAgZWxzZSBpZiAoaV9laGRycC0+ZV90eXBlID09IEVUX0RZTikKLSAgICBhYmZkLT5mbGFncyB8PSBEWU5BTUlDOwotCi0gIGlmIChpX2VoZHJwLT5lX3BobnVtID4gMCkKLSAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEOwotCi0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGViZC0+YXJjaCwgMCkpCi0gICAgewotICAgICAgLyogSXQncyBPSyBpZiB0aGlzIGZhaWxzIGZvciB0aGUgZ2VuZXJpYyB0YXJnZXQuICAqLwotICAgICAgaWYgKGViZC0+ZWxmX21hY2hpbmVfY29kZSAhPSBFTV9OT05FKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgIH0KLQotICAvKiBSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3BlY2lmaWVkIGluIHRoZSBFTEYgZmlsZSBoZWFkZXIuICovCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIGNvcHkgb2YgdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluCi0gICAgIGludGVybmFsIGZvcm0sIHNlZWsgdG8gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlIGluIHRoZSBmaWxlLAotICAgICByZWFkIGl0IGluLCBhbmQgY29udmVydCBpdCB0byBpbnRlcm5hbCBmb3JtLiAgKi8KLSAgaV9zaGRycCA9ICgoRWxmX0ludGVybmFsX1NoZHIgKikKLQkgICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaV9zaGRycCkgKiBpX2VoZHJwLT5lX3NobnVtKSk7Ci0gIGVsZl9lbGZzZWN0aW9ucyAoYWJmZCkgPSAoKEVsZl9JbnRlcm5hbF9TaGRyICoqKQotCQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgICAgc2l6ZW9mIChpX3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKTsKLSAgaWYgKCFpX3NoZHJwIHx8ICFlbGZfZWxmc2VjdGlvbnMgKGFiZmQpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfc2hvZmYsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotICBmb3IgKHNoaW5kZXggPSAwOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X3NoZHIsIHNpemVvZiB4X3NoZHIsIDEsIGFiZmQpICE9IHNpemVvZiAoeF9zaGRyKSkKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICAgIGVsZl9zd2FwX3NoZHJfaW4gKGFiZmQsICZ4X3NoZHIsIGlfc2hkcnAgKyBzaGluZGV4KTsKLSAgICAgIGVsZl9lbGZzZWN0aW9ucyAoYWJmZClbc2hpbmRleF0gPSBpX3NoZHJwICsgc2hpbmRleDsKLQotICAgICAgLyogSWYgdGhlIHNlY3Rpb24gaXMgbG9hZGVkLCBidXQgbm90IHBhZ2UgYWxpZ25lZCwgY2xlYXIKLSAgICAgICAgIERfUEFHRUQuICAqLwotICAgICAgaWYgKChpX3NoZHJwW3NoaW5kZXhdLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSAhPSAwCi0JICAmJiBpX3NoZHJwW3NoaW5kZXhdLnNoX3R5cGUgIT0gU0hUX05PQklUUwotCSAgJiYgKCgoaV9zaGRycFtzaGluZGV4XS5zaF9hZGRyIC0gaV9zaGRycFtzaGluZGV4XS5zaF9vZmZzZXQpCi0JICAgICAgICUgZWJkLT5tYXhwYWdlc2l6ZSkKLQkgICAgICAhPSAwKSkKLQlhYmZkLT5mbGFncyAmPSB+RF9QQUdFRDsKLSAgICB9Ci0gIGlmIChpX2VoZHJwLT5lX3Noc3RybmR4KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgaV9laGRycC0+ZV9zaHN0cm5keCkpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIHByb2dyYW0gaGVhZGVycy4gICovCi0gIGlmIChpX2VoZHJwLT5lX3BobnVtID09IDApCi0gICAgZWxmX3RkYXRhIChhYmZkKS0+cGhkciA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUGhkciAqaV9waGRyOwotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSAoKEVsZl9JbnRlcm5hbF9QaGRyICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaV9laGRycC0+ZV9waG51bQotCQkJCQkgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSkpKTsKLSAgICAgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT5waGRyID09IE5VTEwpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZWhkcnAtPmVfcGhvZmYsIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZ290X25vX21hdGNoOwotICAgICAgaV9waGRyID0gZWxmX3RkYXRhIChhYmZkKS0+cGhkcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpX2VoZHJwLT5lX3BobnVtOyBpKyssIGlfcGhkcisrKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9QaGRyIHhfcGhkcjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmeF9waGRyLCBzaXplb2YgeF9waGRyLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiB4X3BoZHIpCi0JICAgIGdvdG8gZ290X25vX21hdGNoOwotCSAgZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgJnhfcGhkciwgaV9waGRyKTsKLQl9Ci0gICAgfQotCi0gIC8qIFJlYWQgaW4gdGhlIHN0cmluZyB0YWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgc2VjdGlvbnMuICBXZQotICAgICB3aWxsIG5lZWQgdGhlIGJhc2UgcG9pbnRlciB0byB0aGlzIHRhYmxlIGxhdGVyLiAqLwotICAvKiBXZSByZWFkIHRoaXMgaW5saW5lIG5vdywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGdvIHRocm91Z2gKLSAgICAgYmZkX3NlY3Rpb25fZnJvbV9zaGRyIHdpdGggaXQgKHNpbmNlIHRoaXMgcGFydGljdWxhciBzdHJ0YWIgaXMKLSAgICAgdXNlZCB0byBmaW5kIGFsbCBvZiB0aGUgRUxGIHNlY3Rpb24gbmFtZXMuKSAqLwotCi0gIHNoc3RydGFiID0gYmZkX2VsZl9nZXRfc3RyX3NlY3Rpb24gKGFiZmQsIGlfZWhkcnAtPmVfc2hzdHJuZHgpOwotICBpZiAoIXNoc3RydGFiKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIC8qIE9uY2UgYWxsIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMgaGF2ZSBiZWVuIHJlYWQgYW5kIGNvbnZlcnRlZCwgd2UKLSAgICAgY2FuIHN0YXJ0IHByb2Nlc3NpbmcgdGhlbS4gIE5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VjdGlvbiBoZWFkZXIgaXMKLSAgICAgYSBkdW1teSBwbGFjZWhvbGRlciBlbnRyeSwgc28gd2UgaWdub3JlIGl0LiAgKi8KLQotICBmb3IgKHNoaW5kZXggPSAxOyBzaGluZGV4IDwgaV9laGRycC0+ZV9zaG51bTsgc2hpbmRleCsrKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZWN0aW9uX2Zyb21fc2hkciAoYWJmZCwgc2hpbmRleCkpCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIExldCB0aGUgYmFja2VuZCBkb3VibGUgY2hlY2sgdGhlIGZvcm1hdCBhbmQgb3ZlcnJpZGUgZ2xvYmFsCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfb2JqZWN0X3ApCi0gICAgewotICAgICAgaWYgKCgqZWJkLT5lbGZfYmFja2VuZF9vYmplY3RfcCkgKGFiZmQpID09IGZhbHNlKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGFueSByZWxvYyBzZWN0aW9ucyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgZGVidWdnaW5nIHNlY3Rpb25zLCBtYXJrIHRoZSByZWxvYyBzZWN0aW9ucyBhcyBkZWJ1Z2dpbmcgYXMgd2VsbC4gICovCi0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX3R5cGUgPT0gU0hUX1JFTAotCSAgIHx8IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF90eXBlID09IFNIVF9SRUxBKQotCSAgJiYgZWxmX3NlY3Rpb25fZGF0YSAocyktPnRoaXNfaGRyLnNoX2luZm8gPiAwKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGFyZ19pbmRleDsKLQkgIGFzZWN0aW9uICp0YXJnX3NlYzsKLQotCSAgdGFyZ19pbmRleCA9IGVsZl9zZWN0aW9uX2RhdGEgKHMpLT50aGlzX2hkci5zaF9pbmZvOwotCSAgdGFyZ19zZWMgPSBiZmRfc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoYWJmZCwgdGFyZ19pbmRleCk7Ci0JICBpZiAodGFyZ19zZWMgIT0gTlVMTAotCSAgICAgICYmICh0YXJnX3NlYy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgICBzLT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIChhYmZkLT54dmVjKTsKLQotIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I6Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotIGdvdF9ub19tYXRjaDoKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMCi0gICAgICAmJiBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0ciAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEtPmVsZl9zZWN0X3B0cik7Ci0gIGlmIChpX3NoZHJwICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIGlfc2hkcnApOwotICBpZiAobmV3X3RkYXRhICE9IE5VTEwpCi0gICAgYmZkX3JlbGVhc2UgKGFiZmQsIG5ld190ZGF0YSk7Ci0gIGVsZl90ZGF0YSAoYWJmZCkgPSBwcmVzZXJ2ZWRfdGRhdGE7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0MCi0vKiBFTEYgLm8vZXhlYyBmaWxlIHdyaXRpbmcgKi8KLQotLyogV3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJvb2xlYW4gKmZhaWxlZHAgPSAoYm9vbGVhbiAqKSBkYXRhOwotICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsYV9oZHI7Ci0gIEVsZl9FeHRlcm5hbF9SZWxhICpvdXRib3VuZF9yZWxvY2FzOwotICBFbGZfRXh0ZXJuYWxfUmVsICpvdXRib3VuZF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIGludCB1c2VfcmVsYV9wOwotICBhc3ltYm9sICpsYXN0X3N5bSA9IDA7Ci0gIGludCBsYXN0X3N5bV9pZHggPSAwOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQsIGRvbid0IGRvIGFueXRoaW5nLiAgKi8KLSAgaWYgKCpmYWlsZWRwKQotICAgIHJldHVybjsKLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIFRoZSBsaW5rZXIgYmFja2VuZCB3cml0ZXMgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLCBhbmQgc2V0cyB0aGUKLSAgICAgcmVsb2NfY291bnQgZmllbGQgdG8gemVybyB0byBpbmhpYml0IHdyaXRpbmcgdGhlbSBoZXJlLiAgQWxzbywKLSAgICAgc29tZXRpbWVzIHRoZSBTRUNfUkVMT0MgZmxhZyBnZXRzIHNldCBldmVuIHdoZW4gdGhlcmUgYXJlbid0IGFueQotICAgICByZWxvY3MuICAqLwotICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxhX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxfaGRyOwotCi0gIHJlbGFfaGRyLT5zaF9zaXplID0gcmVsYV9oZHItPnNoX2VudHNpemUgKiBzZWMtPnJlbG9jX2NvdW50OwotICByZWxhX2hkci0+Y29udGVudHMgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsIHJlbGFfaGRyLT5zaF9zaXplKTsKLSAgaWYgKHJlbGFfaGRyLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpmYWlsZWRwID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB3aGV0aGVyIHRoZSByZWxvY2F0aW9ucyBhcmUgUkVMQSBvciBSRUwgcmVsb2NhdGlvbnMuICAqLwotICBpZiAocmVsYV9oZHItPnNoX3R5cGUgPT0gU0hUX1JFTEEpCi0gICAgdXNlX3JlbGFfcCA9IHRydWU7Ci0gIGVsc2UgaWYgKHJlbGFfaGRyLT5zaF90eXBlID09IFNIVF9SRUwpCi0gICAgdXNlX3JlbGFfcCA9IGZhbHNlOwotICBlbHNlCi0gICAgLyogRXZlcnkgcmVsb2NhdGlvbiBzZWN0aW9uIHNob3VsZCBiZSBlaXRoZXIgYW4gU0hUX1JFTEEgb3IgYW4KLSAgICAgICBTSFRfUkVMIHNlY3Rpb24uICAqLwotICAgIGFib3J0ICgpOwotCi0gIC8qIG9yZWxvY2F0aW9uIGhhcyB0aGUgZGF0YSwgcmVsb2NfY291bnQgaGFzIHRoZSBjb3VudC4uLiAqLwotICBpZiAodXNlX3JlbGFfcCkKLSAgICB7Ci0gICAgICBvdXRib3VuZF9yZWxvY2FzID0gKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsYSBkc3RfcmVsYTsKLQkgIEVsZl9FeHRlcm5hbF9SZWxhICpzcmNfcmVsYTsKLQkgIGFyZWxlbnQgKnB0cjsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIGludCBuOwotCi0JICBwdHIgPSBzZWMtPm9yZWxvY2F0aW9uW2lkeF07Ci0JICBzcmNfcmVsYSA9IG91dGJvdW5kX3JlbG9jYXMgKyBpZHg7Ci0KLQkgIC8qIFRoZSBhZGRyZXNzIG9mIGFuIEVMRiByZWxvYyBpcyBzZWN0aW9uIHJlbGF0aXZlIGZvciBhbiBvYmplY3QKLQkgICAgIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSAgICAgVGhlIGFkZHJlc3Mgb2YgYSBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUuICAqLwotCSAgaWYgKChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkgPT0gMCkKLQkgICAgZHN0X3JlbGEucl9vZmZzZXQgPSBwdHItPmFkZHJlc3M7Ci0JICBlbHNlCi0JICAgIGRzdF9yZWxhLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLQkgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotCSAgaWYgKHN5bSA9PSBsYXN0X3N5bSkKLQkgICAgbiA9IGxhc3Rfc3ltX2lkeDsKLQkgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSAmJiBzeW0tPnZhbHVlID09IDApCi0JICAgIG4gPSBTVE5fVU5ERUY7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsYXN0X3N5bSA9IHN5bTsKLQkgICAgICBuID0gX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0JICAgICAgaWYgKG4gPCAwKQotCQl7Ci0JCSAgKmZhaWxlZHAgPSB0cnVlOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JICAgIH0KLQotCSAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmICgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgICAgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JICAgIHsKLQkgICAgICAqZmFpbGVkcCA9IHRydWU7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGRzdF9yZWxhLnJfaW5mbyA9IEVMRl9SX0lORk8gKG4sIHB0ci0+aG93dG8tPnR5cGUpOwotCi0JICBkc3RfcmVsYS5yX2FkZGVuZCA9IHB0ci0+YWRkZW5kOwotCSAgZWxmX3N3YXBfcmVsb2NhX291dCAoYWJmZCwgJmRzdF9yZWxhLCBzcmNfcmVsYSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIC8qIFJFTCByZWxvY2F0aW9ucyAqLwotICAgIHsKLSAgICAgIG91dGJvdW5kX3JlbG9jcyA9IChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbGFfaGRyLT5jb250ZW50czsKLQotICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBzZWMtPnJlbG9jX2NvdW50OyBpZHgrKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGRzdF9yZWw7Ci0JICBFbGZfRXh0ZXJuYWxfUmVsICpzcmNfcmVsOwotCSAgYXJlbGVudCAqcHRyOwotCSAgaW50IG47Ci0JICBhc3ltYm9sICpzeW07Ci0KLQkgIHB0ciA9IHNlYy0+b3JlbG9jYXRpb25baWR4XTsKLQkgIHN5bSA9ICpwdHItPnN5bV9wdHJfcHRyOwotCSAgc3JjX3JlbCA9IG91dGJvdW5kX3JlbG9jcyArIGlkeDsKLQotCSAgLyogVGhlIGFkZHJlc3Mgb2YgYW4gRUxGIHJlbG9jIGlzIHNlY3Rpb24gcmVsYXRpdmUgZm9yIGFuIG9iamVjdAotCSAgICAgZmlsZSwgYW5kIGFic29sdXRlIGZvciBhbiBleGVjdXRhYmxlIGZpbGUgb3Igc2hhcmVkIGxpYnJhcnkuCi0JICAgICBUaGUgYWRkcmVzcyBvZiBhIEJGRCByZWxvYyBpcyBhbHdheXMgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSA9PSAwKQotCSAgICBkc3RfcmVsLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzOwotCSAgZWxzZQotCSAgICBkc3RfcmVsLnJfb2Zmc2V0ID0gcHRyLT5hZGRyZXNzICsgc2VjLT52bWE7Ci0KLQkgIGlmIChzeW0gPT0gbGFzdF9zeW0pCi0JICAgIG4gPSBsYXN0X3N5bV9pZHg7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBsYXN0X3N5bSA9IHN5bTsKLQkgICAgICBuID0gX2JmZF9lbGZfc3ltYm9sX2Zyb21fYmZkX3N5bWJvbCAoYWJmZCwgJnN5bSk7Ci0JICAgICAgaWYgKG4gPCAwKQotCQl7Ci0JCSAgKmZhaWxlZHAgPSB0cnVlOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGxhc3Rfc3ltX2lkeCA9IG47Ci0JICAgIH0KLQotCSAgaWYgKCgqcHRyLT5zeW1fcHRyX3B0ciktPnRoZV9iZmQtPnh2ZWMgIT0gYWJmZC0+eHZlYwotCSAgICAgICYmICEgX2JmZF9lbGZfdmFsaWRhdGVfcmVsb2MgKGFiZmQsIHB0cikpCi0JICAgIHsKLQkgICAgICAqZmFpbGVkcCA9IHRydWU7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGRzdF9yZWwucl9pbmZvID0gRUxGX1JfSU5GTyAobiwgcHRyLT5ob3d0by0+dHlwZSk7Ci0KLQkgIGVsZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgJmRzdF9yZWwsIHNyY19yZWwpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcHJvZ3JhbSBoZWFkZXJzLiAgKi8KLQotaW50Ci1lbGZfd3JpdGVfb3V0X3BoZHJzIChhYmZkLCBwaGRyLCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUGhkciAqcGhkcjsKLSAgICAgaW50IGNvdW50OwotewotICB3aGlsZSAoY291bnQtLSkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUGhkciBleHRwaGRyOwotICAgICAgZWxmX3N3YXBfcGhkcl9vdXQgKGFiZmQsIHBoZHIsICZleHRwaGRyKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKCZleHRwaGRyLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9QaGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpKQotCXJldHVybiAtMTsKLSAgICAgIHBoZHIrKzsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHNlY3Rpb24gaGVhZGVycyBhbmQgdGhlIEVMRiBmaWxlIGhlYWRlci4gICovCi0KLWJvb2xlYW4KLWVsZl93cml0ZV9zaGRyc19hbmRfZWhkciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBFbGZfRXh0ZXJuYWxfRWhkciB4X2VoZHI7CS8qIEVsZiBmaWxlIGhlYWRlciwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfRWhkciAqaV9laGRycDsJLyogRWxmIGZpbGUgaGVhZGVyLCBpbnRlcm5hbCBmb3JtICovCi0gIEVsZl9FeHRlcm5hbF9TaGRyICp4X3NoZHJwOwkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSwgZXh0ZXJuYWwgZm9ybSAqLwotICBFbGZfSW50ZXJuYWxfU2hkciAqKmlfc2hkcnA7CS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlLCBpbnRlcm5hbCBmb3JtICovCi0gIHVuc2lnbmVkIGludCBjb3VudDsKLQotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIGlfc2hkcnAgPSBlbGZfZWxmc2VjdGlvbnMgKGFiZmQpOwotCi0gIC8qIHN3YXAgdGhlIGhlYWRlciBiZWZvcmUgc3BpdHRpbmcgaXQgb3V0Li4uICovCi0KLSNpZiBERUJVRyAmIDEKLSAgZWxmX2RlYnVnX2ZpbGUgKGlfZWhkcnApOwotI2VuZGlmCi0gIGVsZl9zd2FwX2VoZHJfb3V0IChhYmZkLCBpX2VoZHJwLCAmeF9laGRyKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIHhfZWhkciwgc2l6ZW9mICh4X2VoZHIpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mICh4X2VoZHIpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogYXQgdGhpcyBwb2ludCB3ZSd2ZSBjb25jb2N0ZWQgYWxsIHRoZSBFTEYgc2VjdGlvbnMuLi4gKi8KLSAgeF9zaGRycCA9IChFbGZfRXh0ZXJuYWxfU2hkciAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqeF9zaGRycCkgKiAoaV9laGRycC0+ZV9zaG51bSkpOwotICBpZiAoIXhfc2hkcnApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGlfZWhkcnAtPmVfc2hudW07IGNvdW50KyspCi0gICAgewotI2lmIERFQlVHICYgMgotICAgICAgZWxmX2RlYnVnX3NlY3Rpb24gKGNvdW50LCBpX3NoZHJwW2NvdW50XSk7Ci0jZW5kaWYKLSAgICAgIGVsZl9zd2FwX3NoZHJfb3V0IChhYmZkLCBpX3NoZHJwW2NvdW50XSwgeF9zaGRycCArIGNvdW50KTsKLSAgICB9Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBpX2VoZHJwLT5lX3Nob2ZmLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgKGJmZF93cml0ZSAoKFBUUikgeF9zaGRycCwgc2l6ZW9mICgqeF9zaGRycCksIGlfZWhkcnAtPmVfc2hudW0sIGFiZmQpCi0JICAhPSBzaXplb2YgKCp4X3NoZHJwKSAqIGlfZWhkcnAtPmVfc2hudW0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBuZWVkIHRvIGR1bXAgdGhlIHN0cmluZyB0YWJsZSB0b28uLi4gKi8KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotZWxmX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCwgc3ltcHRycywgZHluYW1pYykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltcHRyczsJCS8qIEJ1ZmZlciBmb3IgZ2VuZXJhdGVkIGJmZCBzeW1ib2xzICovCi0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnZlcmhkcjsKLSAgdW5zaWduZWQgbG9uZyBzeW1jb3VudDsJLyogTnVtYmVyIG9mIGV4dGVybmFsIEVMRiBzeW1ib2xzICovCi0gIGVsZl9zeW1ib2xfdHlwZSAqc3ltOwkJLyogUG9pbnRlciB0byBjdXJyZW50IGJmZCBzeW1ib2wgKi8KLSAgZWxmX3N5bWJvbF90eXBlICpzeW1iYXNlOwkvKiBCdWZmZXIgZm9yIGdlbmVyYXRlZCBiZmQgc3ltYm9scyAqLwotICBFbGZfSW50ZXJuYWxfU3ltIGlfc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICp4X3N5bXAgPSBOVUxMOwotICBFbGZfRXh0ZXJuYWxfVmVyc3ltICp4X3ZlcnN5bXAgPSBOVUxMOwotCi0gIC8qIFJlYWQgZWFjaCByYXcgRUxGIHN5bWJvbCwgY29udmVydGluZyBmcm9tIGV4dGVybmFsIEVMRiBmb3JtIHRvCi0gICAgIGludGVybmFsIEVMRiBmb3JtLCBhbmQgdGhlbiB1c2luZyB0aGUgaW5mb3JtYXRpb24gdG8gY3JlYXRlIGEKLSAgICAgY2Fub25pY2FsIGJmZCBzeW1ib2wgdGFibGUgZW50cnkuCi0KLSAgICAgTm90ZSB0aGF0IHdlIGFsbG9jYXRlIHRoZSBpbml0aWFsIGJmZCBjYW5vbmljYWwgc3ltYm9sIGJ1ZmZlcgotICAgICBiYXNlZCBvbiBhIG9uZS10by1vbmUgbWFwcGluZyBvZiB0aGUgRUxGIHN5bWJvbHMgdG8gY2Fub25pY2FsCi0gICAgIHN5bWJvbHMuICBXZSBhY3R1YWxseSB1c2UgYWxsIHRoZSBFTEYgc3ltYm9scywgc28gdGhlcmUgd2lsbCBiZSBubwotICAgICBzcGFjZSBsZWZ0IG92ZXIgYXQgdGhlIGVuZC4gIFdoZW4gd2UgaGF2ZSBhbGwgdGhlIHN5bWJvbHMsIHdlCi0gICAgIGJ1aWxkIHRoZSBjYWxsZXIncyBwb2ludGVyIHZlY3Rvci4gKi8KLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICAgICAgdmVyaGRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+ZHluc3ltdGFiX2hkcjsKLSAgICAgIGlmIChlbGZfZHludmVyc3ltIChhYmZkKSA9PSAwKQotCXZlcmhkciA9IE5VTEw7Ci0gICAgICBlbHNlCi0JdmVyaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcnN5bV9oZHI7Ci0gICAgICBpZiAoKGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9zZWN0aW9uICE9IDAKLQkgICAmJiBlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgPT0gTlVMTCkKLQkgIHx8IChlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJyZWZfc2VjdGlvbiAhPSAwCi0JICAgICAgJiYgZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmID09IE5VTEwpKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBoZHItPnNoX29mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiAtMTsKLQotICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0KLSAgaWYgKHN5bWNvdW50ID09IDApCi0gICAgc3ltID0gc3ltYmFzZSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIHN5bWJhc2UgPSAoKGVsZl9zeW1ib2xfdHlwZSAqKQotCQkgYmZkX3phbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGVsZl9zeW1ib2xfdHlwZSkpKTsKLSAgICAgIGlmIChzeW1iYXNlID09IChlbGZfc3ltYm9sX3R5cGUgKikgTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgICBzeW0gPSBzeW1iYXNlOwotCi0gICAgICAvKiBUZW1wb3JhcmlseSBhbGxvY2F0ZSByb29tIGZvciB0aGUgcmF3IEVMRiBzeW1ib2xzLiAgKi8KLSAgICAgIHhfc3ltcCA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQliZmRfbWFsbG9jIChzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgICAgIGlmICh4X3N5bXAgPT0gTlVMTCAmJiBzeW1jb3VudCAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHhfc3ltcCwgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgc3ltY291bnQsIGFiZmQpCi0JICAhPSBzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFJlYWQgdGhlIHJhdyBFTEYgdmVyc2lvbiBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi0gICAgICBpZiAodmVyaGRyICE9IE5VTEwKLQkgICYmIHZlcmhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcnN5bSkgIT0gc3ltY291bnQpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdmVyc2lvbiBjb3VudCAoJWxkKSBkb2VzIG5vdCBtYXRjaCBzeW1ib2wgY291bnQgKCVsZCkiKSwKLQkgICAgIGFiZmQtPmZpbGVuYW1lLAotCSAgICAgKGxvbmcpICh2ZXJoZHItPnNoX3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pKSwKLQkgICAgIHN5bWNvdW50KTsKLQotCSAgLyogU2x1cnAgaW4gdGhlIHN5bWJvbHMgd2l0aG91dCB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICBzaW5jZSB0aGF0IGlzIG1vcmUgaGVscGZ1bCB0aGFuIGp1c3QgcXVpdHRpbmcuICAqLwotCSAgdmVyaGRyID0gTlVMTDsKLQl9Ci0KLSAgICAgIGlmICh2ZXJoZHIgIT0gTlVMTCkKLQl7Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHZlcmhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIHhfdmVyc3ltcCA9IChFbGZfRXh0ZXJuYWxfVmVyc3ltICopIGJmZF9tYWxsb2MgKHZlcmhkci0+c2hfc2l6ZSk7Ci0JICBpZiAoeF92ZXJzeW1wID09IE5VTEwgJiYgdmVyaGRyLT5zaF9zaXplICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpIHhfdmVyc3ltcCwgMSwgdmVyaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgICAgICE9IHZlcmhkci0+c2hfc2l6ZSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBTa2lwIGZpcnN0IHN5bWJvbCwgd2hpY2ggaXMgYSBudWxsIGR1bW15LiAgKi8KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBzeW1jb3VudDsgaSsrKQotCXsKLQkgIGVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgeF9zeW1wICsgaSwgJmlfc3ltKTsKLQkgIG1lbWNweSAoJnN5bS0+aW50ZXJuYWxfZWxmX3N5bSwgJmlfc3ltLCBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKTsKLSNpZmRlZiBFTEZfS0VFUF9FWFRTWU0KLQkgIG1lbWNweSAoJnN5bS0+bmF0aXZlX2VsZl9zeW0sIHhfc3ltcCArIGksIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpOwotI2VuZGlmCi0JICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLQotCSAgc3ltLT5zeW1ib2wubmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGFiZmQsCi0JCQkJCQkJICAgICAgaGRyLT5zaF9saW5rLAotCQkJCQkJCSAgICAgIGlfc3ltLnN0X25hbWUpOwotCi0JICBzeW0tPnN5bWJvbC52YWx1ZSA9IGlfc3ltLnN0X3ZhbHVlOwotCi0JICBpZiAoaV9zeW0uc3Rfc2huZHggPiAwICYmIGlfc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLAotCQkJCQkJCSAgICBpX3N5bS5zdF9zaG5keCk7Ci0JICAgICAgaWYgKHN5bS0+c3ltYm9sLnNlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIGEgc2VjdGlvbiBmb3Igd2hpY2ggd2UgZGlkIG5vdAotCQkgICAgIGNyZWF0ZSBhIEJGRCBzZWN0aW9uLiAgSnVzdCB1c2UgYmZkX2Fic19zZWN0aW9uLAotCQkgICAgIGFsdGhvdWdoIGl0IGlzIHdyb25nLiAgRklYTUUuICAqLwotCQkgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9BQlMpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgICAgfQotCSAgZWxzZSBpZiAoaV9zeW0uc3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb25fcHRyOwotCSAgICAgIC8qIEVsZiBwdXRzIHRoZSBhbGlnbm1lbnQgaW50byB0aGUgYHZhbHVlJyBmaWVsZCwgYW5kCi0JCSB0aGUgc2l6ZSBpbnRvIHRoZSBgc2l6ZScgZmllbGQuICBCRkQgd2FudHMgdG8gc2VlIHRoZQotCQkgc2l6ZSBpbiB0aGUgdmFsdWUgZmllbGQsIGFuZCBkb2Vzbid0IGNhcmUgKGF0IHRoZQotCQkgbW9tZW50KSBhYm91dCB0aGUgYWxpZ25tZW50LiAgKi8KLQkgICAgICBzeW0tPnN5bWJvbC52YWx1ZSA9IGlfc3ltLnN0X3NpemU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlfc3ltLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIGZpbGUsIHRoZW4gdGhlIHN5bWJvbCB2YWx1ZSBpcwotICAgICAgICAgICAgIGFscmVhZHkgc2VjdGlvbiByZWxhdGl2ZS4gICovCi0JICBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSAhPSAwKQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0KLQkgIHN3aXRjaCAoRUxGX1NUX0JJTkQgKGlfc3ltLnN0X2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgU1RCX0xPQ0FMOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9MT0NBTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVEJfR0xPQkFMOgotCSAgICAgIGlmIChpX3N5bS5zdF9zaG5keCAhPSBTSE5fVU5ERUYKLQkJICAmJiBpX3N5bS5zdF9zaG5keCAhPSBTSE5fQ09NTU9OKQotCQlzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUQl9XRUFLOgotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9XRUFLOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoRUxGX1NUX1RZUEUgKGlfc3ltLnN0X2luZm8pKQotCSAgICB7Ci0JICAgIGNhc2UgU1RUX1NFQ1RJT046Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX1NFQ1RJT05fU1lNIHwgQlNGX0RFQlVHR0lORzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTVFRfRklMRToKLQkgICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRklMRSB8IEJTRl9ERUJVR0dJTkc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1RUX0ZVTkM6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNUVF9PQkpFQ1Q6Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX09CSkVDVDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoZHluYW1pYykKLQkgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0RZTkFNSUM7Ci0KLQkgIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJzeW0gaXZlcnN5bTsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX2luIChhYmZkLCB4X3ZlcnN5bXAgKyBpLCAmaXZlcnN5bSk7Ci0JICAgICAgc3ltLT52ZXJzaW9uID0gaXZlcnN5bS52c192ZXJzOwotCSAgICB9Ci0KLQkgIC8qIERvIHNvbWUgYmFja2VuZC1zcGVjaWZpYyBwcm9jZXNzaW5nIG9uIHRoaXMgc3ltYm9sLiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQkgICAgaWYgKGViZC0+ZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcpCi0JICAgICAgKCplYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nKSAoYWJmZCwgJnN5bS0+c3ltYm9sKTsKLQkgIH0KLQotCSAgc3ltKys7Ci0JfQotICAgIH0KLQotICAvKiBEbyBzb21lIGJhY2tlbmQtc3BlY2lmaWMgcHJvY2Vzc2luZyBvbiB0aGlzIHN5bWJvbCB0YWJsZS4gICovCi0gIHsKLSAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqZWJkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICAgIGlmIChlYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKQotICAgICAgKCplYmQtPmVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nKSAoYWJmZCwgc3ltYmFzZSwgc3ltY291bnQpOwotICB9Ci0KLSAgLyogV2UgcmVseSBvbiB0aGUgemFsbG9jIHRvIGNsZWFyIG91dCB0aGUgZmluYWwgc3ltYm9sIGVudHJ5LiAgKi8KLQotICBzeW1jb3VudCA9IHN5bSAtIHN5bWJhc2U7Ci0KLSAgLyogRmlsbCBpbiB0aGUgdXNlcidzIHN5bWJvbCBwb2ludGVyIHZlY3RvciBpZiBuZWVkZWQuICAqLwotICBpZiAoc3ltcHRycykKLSAgICB7Ci0gICAgICBsb25nIGwgPSBzeW1jb3VudDsKLQotICAgICAgc3ltID0gc3ltYmFzZTsKLSAgICAgIHdoaWxlIChsLS0gPiAwKQotCXsKLQkgICpzeW1wdHJzKysgPSAmc3ltLT5zeW1ib2w7Ci0JICBzeW0rKzsKLQl9Ci0gICAgICAqc3ltcHRycyA9IDA7CQkvKiBGaW5hbCBudWxsIHBvaW50ZXIgKi8KLSAgICB9Ci0KLSAgaWYgKHhfdmVyc3ltcCAhPSBOVUxMKQotICAgIGZyZWUgKHhfdmVyc3ltcCk7Ci0gIGlmICh4X3N5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3N5bXApOwotICByZXR1cm4gc3ltY291bnQ7Ci1lcnJvcl9yZXR1cm46Ci0gIGlmICh4X3ZlcnN5bXAgIT0gTlVMTCkKLSAgICBmcmVlICh4X3ZlcnN5bXApOwotICBpZiAoeF9zeW1wICE9IE5VTEwpCi0gICAgZnJlZSAoeF9zeW1wKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiBSZWFkICByZWxvY2F0aW9ucyBmb3IgQVNFQ1QgZnJvbSBSRUxfSERSLiAgVGhlcmUgYXJlIFJFTE9DX0NPVU5UIG9mIAotICAgdGhlbS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfc2x1cnBfcmVsb2NfdGFibGVfZnJvbV9zZWN0aW9uIChhYmZkLCBhc2VjdCwgcmVsX2hkciwgcmVsb2NfY291bnQsCi0JCQkJICAgIHJlbGVudHMsIHN5bWJvbHMsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKmFzZWN0OwotICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLSAgICAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgICAgYXJlbGVudCAqcmVsZW50czsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKiBjb25zdCBlYmQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIFBUUiBhbGxvY2F0ZWQgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmF0aXZlX3JlbG9jczsKLSAgYXJlbGVudCAqcmVsZW50OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgaW50IGVudHNpemU7Ci0KLSAgYWxsb2NhdGVkID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX2hkci0+c2hfc2l6ZSk7Ci0gIGlmIChhbGxvY2F0ZWQgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHJlbF9oZHItPnNoX29mZnNldCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoYWxsb2NhdGVkLCAxLCByZWxfaGRyLT5zaF9zaXplLCBhYmZkKQotCSAgIT0gcmVsX2hkci0+c2hfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgbmF0aXZlX3JlbG9jcyA9IChiZmRfYnl0ZSAqKSBhbGxvY2F0ZWQ7Ci0KLSAgZW50c2l6ZSA9IHJlbF9oZHItPnNoX2VudHNpemU7Ci0gIEJGRF9BU1NFUlQgKGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKQotCSAgICAgIHx8IGVudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotCi0gIGZvciAoaSA9IDAsIHJlbGVudCA9IHJlbGVudHM7Ci0gICAgICAgaSA8IHJlbG9jX2NvdW50OwotICAgICAgIGkrKywgcmVsZW50KyssIG5hdGl2ZV9yZWxvY3MgKz0gZW50c2l6ZSkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSByZWxhOwotICAgICAgRWxmX0ludGVybmFsX1JlbCByZWw7Ci0KLSAgICAgIGlmIChlbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKQotCWVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9SZWxhICopIG5hdGl2ZV9yZWxvY3MsICZyZWxhKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgKEVsZl9FeHRlcm5hbF9SZWwgKikgbmF0aXZlX3JlbG9jcywgJnJlbCk7Ci0JICByZWxhLnJfb2Zmc2V0ID0gcmVsLnJfb2Zmc2V0OwotCSAgcmVsYS5yX2luZm8gPSByZWwucl9pbmZvOwotCSAgcmVsYS5yX2FkZGVuZCA9IDA7Ci0JfQotCi0gICAgICAvKiBUaGUgYWRkcmVzcyBvZiBhbiBFTEYgcmVsb2MgaXMgc2VjdGlvbiByZWxhdGl2ZSBmb3IgYW4gb2JqZWN0Ci0JIGZpbGUsIGFuZCBhYnNvbHV0ZSBmb3IgYW4gZXhlY3V0YWJsZSBmaWxlIG9yIHNoYXJlZCBsaWJyYXJ5LgotCSBUaGUgYWRkcmVzcyBvZiBhIG5vcm1hbCBCRkQgcmVsb2MgaXMgYWx3YXlzIHNlY3Rpb24gcmVsYXRpdmUsCi0JIGFuZCB0aGUgYWRkcmVzcyBvZiBhIGR5bmFtaWMgcmVsb2MgaXMgYWJzb2x1dGUuLiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAgfHwgZHluYW1pYykKLQlyZWxlbnQtPmFkZHJlc3MgPSByZWxhLnJfb2Zmc2V0OwotICAgICAgZWxzZQotCXJlbGVudC0+YWRkcmVzcyA9IHJlbGEucl9vZmZzZXQgLSBhc2VjdC0+dm1hOwotCi0gICAgICBpZiAoRUxGX1JfU1lNIChyZWxhLnJfaW5mbykgPT0gMCkKLQlyZWxlbnQtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICBlbHNlCi0JewotCSAgYXN5bWJvbCAqKnBzLCAqczsKLQotCSAgcHMgPSBzeW1ib2xzICsgRUxGX1JfU1lNIChyZWxhLnJfaW5mbykgLSAxOwotCSAgcyA9ICpwczsKLQotCSAgLyogQ2Fub25pY2FsaXplIEVMRiBzZWN0aW9uIHN5bWJvbHMuICBGSVhNRTogV2h5PyAgKi8KLQkgIGlmICgocy0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JICAgIHJlbGVudC0+c3ltX3B0cl9wdHIgPSBwczsKLQkgIGVsc2UKLQkgICAgcmVsZW50LT5zeW1fcHRyX3B0ciA9IHMtPnNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgcmVsZW50LT5hZGRlbmQgPSByZWxhLnJfYWRkZW5kOwotCi0gICAgICBpZiAoZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKSkKLQkoKmViZC0+ZWxmX2luZm9fdG9faG93dG8pIChhYmZkLCByZWxlbnQsICZyZWxhKTsKLSAgICAgIGVsc2UKLQkoKmViZC0+ZWxmX2luZm9fdG9faG93dG9fcmVsKSAoYWJmZCwgcmVsZW50LCAmcmVsKTsKLSAgICB9Ci0KLSAgaWYgKGFsbG9jYXRlZCAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jYXRlZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChhbGxvY2F0ZWQgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvY2F0ZWQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgaW4gYW5kIHN3YXAgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIGFzZWN0LCBzeW1ib2xzLCBkeW5hbWljKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICphc2VjdDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLXsKLSAgc3RydWN0IGJmZF9lbGZfc2VjdGlvbl9kYXRhICogY29uc3QgZCA9IGVsZl9zZWN0aW9uX2RhdGEgKGFzZWN0KTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyMjsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDsKLSAgYmZkX3NpemVfdHlwZSByZWxvY19jb3VudDI7Ci0gIGFyZWxlbnQgKnJlbGVudHM7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoKGFzZWN0LT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMAotCSAgfHwgYXNlY3QtPnJlbG9jX2NvdW50ID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJlbF9oZHIgPSAmZC0+cmVsX2hkcjsKLSAgICAgIHJlbG9jX2NvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemU7Ci0gICAgICByZWxfaGRyMiA9IGQtPnJlbF9oZHIyOwotICAgICAgcmVsb2NfY291bnQyID0gKHJlbF9oZHIyIAotCQkgICAgICA/IChyZWxfaGRyMi0+c2hfc2l6ZSAvIHJlbF9oZHIyLT5zaF9lbnRzaXplKQotCQkgICAgICA6IDApOwotCi0gICAgICBCRkRfQVNTRVJUIChhc2VjdC0+cmVsb2NfY291bnQgPT0gcmVsb2NfY291bnQgKyByZWxvY19jb3VudDIpOwotICAgICAgQkZEX0FTU0VSVCAoYXNlY3QtPnJlbF9maWxlcG9zID09IHJlbF9oZHItPnNoX29mZnNldAotCQkgIHx8IChyZWxfaGRyMiAmJiBhc2VjdC0+cmVsX2ZpbGVwb3MgPT0gcmVsX2hkcjItPnNoX29mZnNldCkpOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTm90ZSB0aGF0IEFTRUNULT5SRUxPQ19DT1VOVCB0ZW5kcyBub3QgdG8gYmUgYWNjdXJhdGUgaW4gdGhpcwotCSBjYXNlIGJlY2F1c2UgcmVsb2NhdGlvbnMgYWdhaW5zdCB0aGlzIHNlY3Rpb24gbWF5IHVzZSB0aGUKLQkgZHluYW1pYyBzeW1ib2wgdGFibGUsIGFuZCBpbiB0aGF0IGNhc2UgYmZkX3NlY3Rpb25fZnJvbV9zaGRyCi0JIGluIGVsZi5jIGRvZXMgbm90IHVwZGF0ZSB0aGUgUkVMT0NfQ09VTlQuICAqLwotICAgICAgaWYgKGFzZWN0LT5fcmF3X3NpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgcmVsX2hkciA9ICZkLT50aGlzX2hkcjsKLSAgICAgIHJlbG9jX2NvdW50ID0gcmVsX2hkci0+c2hfc2l6ZSAvIHJlbF9oZHItPnNoX2VudHNpemU7Ci0gICAgICByZWxfaGRyMiA9IE5VTEw7Ci0gICAgICByZWxvY19jb3VudDIgPSAwOwotICAgIH0KLQotICByZWxlbnRzID0gKChhcmVsZW50ICopIAotCSAgICAgYmZkX2FsbG9jIChhYmZkLCAKLQkJCShyZWxvY19jb3VudCArIHJlbG9jX2NvdW50MikgKiBzaXplb2YgKGFyZWxlbnQpKSk7Ci0gIGlmIChyZWxlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbiAoYWJmZCwgYXNlY3QsCi0JCQkJCSAgIHJlbF9oZHIsIHJlbG9jX2NvdW50LAotCQkJCQkgICByZWxlbnRzLAotCQkJCQkgICBzeW1ib2xzLCBkeW5hbWljKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIAotICBpZiAocmVsX2hkcjIgCi0gICAgICAmJiAhZWxmX3NsdXJwX3JlbG9jX3RhYmxlX2Zyb21fc2VjdGlvbiAoYWJmZCwgYXNlY3QsCi0JCQkJCSAgICAgIHJlbF9oZHIyLCByZWxvY19jb3VudDIsCi0JCQkJCSAgICAgIHJlbGVudHMgKyByZWxvY19jb3VudCwKLQkJCQkJICAgICAgc3ltYm9scywgZHluYW1pYykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIAotICBhc2VjdC0+cmVsb2NhdGlvbiA9IHJlbGVudHM7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jaWZkZWYgREVCVUcKLXN0YXRpYyB2b2lkCi1lbGZfZGVidWdfc2VjdGlvbiAobnVtLCBoZHIpCi0gICAgIGludCBudW07Ci0gICAgIEVsZl9JbnRlcm5hbF9TaGRyICpoZHI7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuU2VjdGlvbiMlZCAnJXMnIDB4JS44bHhcbiIsIG51bSwKLQkgICBoZHItPmJmZF9zZWN0aW9uICE9IE5VTEwgPyBoZHItPmJmZF9zZWN0aW9uLT5uYW1lIDogIiIsCi0JICAgKGxvbmcpIGhkcik7Ci0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAic2hfbmFtZSAgICAgID0gJWxkXHRzaF90eXBlICAgICAgPSAlbGRcdHNoX2ZsYWdzICAgICA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9uYW1lLAotCSAgIChsb25nKSBoZHItPnNoX3R5cGUsCi0JICAgKGxvbmcpIGhkci0+c2hfZmxhZ3MpOwotICBmcHJpbnRmIChzdGRlcnIsCi0JICAgInNoX2FkZHIgICAgICA9ICVsZFx0c2hfb2Zmc2V0ICAgID0gJWxkXHRzaF9zaXplICAgICAgPSAlbGRcbiIsCi0JICAgKGxvbmcpIGhkci0+c2hfYWRkciwKLQkgICAobG9uZykgaGRyLT5zaF9vZmZzZXQsCi0JICAgKGxvbmcpIGhkci0+c2hfc2l6ZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwKLQkgICAic2hfbGluayAgICAgID0gJWxkXHRzaF9pbmZvICAgICAgPSAlbGRcdHNoX2FkZHJhbGlnbiA9ICVsZFxuIiwKLQkgICAobG9uZykgaGRyLT5zaF9saW5rLAotCSAgIChsb25nKSBoZHItPnNoX2luZm8sCi0JICAgKGxvbmcpIGhkci0+c2hfYWRkcmFsaWduKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAic2hfZW50c2l6ZSAgID0gJWxkXG4iLAotCSAgIChsb25nKSBoZHItPnNoX2VudHNpemUpOwotICBmZmx1c2ggKHN0ZGVycik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfZGVidWdfZmlsZSAoZWhkcnApCi0gICAgIEVsZl9JbnRlcm5hbF9FaGRyICplaGRycDsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9lbnRyeSAgICAgID0gMHglLjhseFxuIiwgKGxvbmcpIGVoZHJwLT5lX2VudHJ5KTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9waG9mZiAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfcGhvZmYpOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3BobnVtICAgICAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9waG51bSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfcGhlbnRzaXplICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3BoZW50c2l6ZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVfc2hvZmYgICAgICA9ICVsZFxuIiwgKGxvbmcpIGVoZHJwLT5lX3Nob2ZmKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZV9zaG51bSAgICAgID0gJWxkXG4iLCAobG9uZykgZWhkcnAtPmVfc2hudW0pOwotICBmcHJpbnRmIChzdGRlcnIsICJlX3NoZW50c2l6ZSAgPSAlbGRcbiIsIChsb25nKSBlaGRycC0+ZV9zaGVudHNpemUpOwotfQotCi1zdGF0aWMgY2hhciAqCi1lbGZfc3ltYm9sX2ZsYWdzIChmbGFncykKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmZlclsxMDI0XTsKLQotICBidWZmZXJbMF0gPSAnXDAnOwotICBpZiAoZmxhZ3MgJiBCU0ZfTE9DQUwpCi0gICAgc3RyY2F0IChidWZmZXIsICIgbG9jYWwiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGdsb2JhbCIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9ERUJVR0dJTkcpCi0gICAgc3RyY2F0IChidWZmZXIsICIgZGVidWciKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCi0gICAgc3RyY2F0IChidWZmZXIsICIgZnVuY3Rpb24iKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfS0VFUCkKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBrZWVwIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0tFRVBfRykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiBrZWVwX2ciKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfV0VBSykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiB3ZWFrIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIHNlY3Rpb24tc3ltIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX09MRF9DT01NT04pCi0gICAgc3RyY2F0IChidWZmZXIsICIgb2xkLWNvbW1vbiIpOwotCi0gIGlmIChmbGFncyAmIEJTRl9OT1RfQVRfRU5EKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIG5vdC1hdC1lbmQiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpCi0gICAgc3RyY2F0IChidWZmZXIsICIgY29uc3RydWN0b3IiKTsKLQotICBpZiAoZmxhZ3MgJiBCU0ZfV0FSTklORykKLSAgICBzdHJjYXQgKGJ1ZmZlciwgIiB3YXJuaW5nIik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0lORElSRUNUKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIGluZGlyZWN0Iik7Ci0KLSAgaWYgKGZsYWdzICYgQlNGX0ZJTEUpCi0gICAgc3RyY2F0IChidWZmZXIsICIgZmlsZSIpOwotCi0gIGlmIChmbGFncyAmIERZTkFNSUMpCi0gICAgc3RyY2F0IChidWZmZXIsICIgZHluYW1pYyIpOwotCi0gIGlmIChmbGFncyAmIH4oQlNGX0xPQ0FMCi0JCXwgQlNGX0dMT0JBTAotCQl8IEJTRl9ERUJVR0dJTkcKLQkJfCBCU0ZfRlVOQ1RJT04KLQkJfCBCU0ZfS0VFUAotCQl8IEJTRl9LRUVQX0cKLQkJfCBCU0ZfV0VBSwotCQl8IEJTRl9TRUNUSU9OX1NZTQotCQl8IEJTRl9PTERfQ09NTU9OCi0JCXwgQlNGX05PVF9BVF9FTkQKLQkJfCBCU0ZfQ09OU1RSVUNUT1IKLQkJfCBCU0ZfV0FSTklORwotCQl8IEJTRl9JTkRJUkVDVAotCQl8IEJTRl9GSUxFCi0JCXwgQlNGX0RZTkFNSUMpKQotICAgIHN0cmNhdCAoYnVmZmVyLCAiIHVua25vd24tYml0cyIpOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0jZW5kaWYKLQwKLSNpbmNsdWRlICJlbGZjb3JlLmgiCi0jaW5jbHVkZSAiZWxmbGluay5oIgotDAotLyogU2l6ZS1kZXBlbmRlbnQgZGF0YSBhbmQgZnVuY3Rpb25zLiAgKi8KLWNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIE5BTUUoX2JmZF9lbGYsc2l6ZV9pbmZvKSA9IHsKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRWhkciksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1BoZHIpLAotICBzaXplb2YgKEVsZl9FeHRlcm5hbF9TaGRyKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSwKLSAgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX0R5biksCi0gIHNpemVvZiAoRWxmX0V4dGVybmFsX05vdGUpLAotCi0gIEFSQ0hfU0laRSwgRklMRV9BTElHTiwKLSAgRUxGQ0xBU1MsIEVWX0NVUlJFTlQsCi0gIGVsZl93cml0ZV9vdXRfcGhkcnMsCi0gIGVsZl93cml0ZV9zaGRyc19hbmRfZWhkciwKLSAgd3JpdGVfcmVsb2NzLAotICBlbGZfc3dhcF9zeW1ib2xfb3V0LAotICBlbGZfc2x1cnBfcmVsb2NfdGFibGUsCi0gIGVsZl9zbHVycF9zeW1ib2xfdGFibGUsCi0gIGVsZl9zd2FwX2R5bl9pbgotfTsKZGlmZiAtLWdpdCBhL2JmZC9lbGZjb3JlLmggYi9iZmQvZWxmY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ1NGFhLi4wMDAwMDAwCi0tLSBhL2JmZC9lbGZjb3JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogRUxGIGNvcmUgZmlsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi1jaGFyKgotZWxmX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGVsZl90ZGF0YSAoYWJmZCktPmNvcmVfY29tbWFuZDsKLX0KLQotaW50Ci1lbGZfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBlbGZfdGRhdGEgKGFiZmQpLT5jb3JlX3NpZ25hbDsKLX0KLQotCi1ib29sZWFuCi1lbGZfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQ7Ci0gICAgIGJmZCAqZXhlY19iZmQ7Ci17Ci0gIGNoYXIqIGNvcmVuYW1lOwotCi0gIC8qIHh2ZWNzIG11c3QgbWF0Y2ggaWYgYm90aCBhcmUgRUxGIGZpbGVzIGZvciB0aGUgc2FtZSB0YXJnZXQuICovCi0KLSAgaWYgKGNvcmVfYmZkLT54dmVjICE9IGV4ZWNfYmZkLT54dmVjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiB0aGUgbmFtZSBpbiB0aGUgY29yZWZpbGUgbWF0Y2hlcyB0aGUgZXhlY3V0YWJsZSBuYW1lLiAqLwotCi0gIGNvcmVuYW1lID0gZWxmX3RkYXRhIChjb3JlX2JmZCktPmNvcmVfcHJvZ3JhbTsKLSAgaWYgKGNvcmVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciogZXhlY25hbWUgPSBzdHJyY2hyIChleGVjX2JmZC0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBleGVjbmFtZSA9IGV4ZWNuYW1lID8gZXhlY25hbWUgKyAxIDogZXhlY19iZmQtPmZpbGVuYW1lOwotCi0gICAgICBpZiAoc3RyY21wKGV4ZWNuYW1lLCBjb3JlbmFtZSkgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qICBDb3JlIGZpbGVzIGFyZSBzaW1wbHkgc3RhbmRhcmQgRUxGIGZvcm1hdHRlZCBmaWxlcyB0aGF0IHBhcnRpdGlvbgotICAgIHRoZSBmaWxlIHVzaW5nIHRoZSBleGVjdXRpb24gdmlldyBvZiB0aGUgZmlsZSAocHJvZ3JhbSBoZWFkZXIgdGFibGUpCi0gICAgcmF0aGVyIHRoYW4gdGhlIGxpbmtpbmcgdmlldy4gIEluIGZhY3QsIHRoZXJlIGlzIG5vIHNlY3Rpb24gaGVhZGVyCi0gICAgdGFibGUgaW4gYSBjb3JlIGZpbGUuCi0KLSAgICBUaGUgcHJvY2VzcyBzdGF0dXMgaW5mb3JtYXRpb24gKGluY2x1ZGluZyB0aGUgY29udGVudHMgb2YgdGhlIGdlbmVyYWwKLSAgICByZWdpc3RlciBzZXQpIGFuZCB0aGUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgc2V0IGFyZSBzdG9yZWQgaW4gYQotICAgIHNlZ21lbnQgb2YgdHlwZSBQVF9OT1RFLiAgV2UgaGFuZGNyYWZ0IGEgY291cGxlIG9mIGV4dHJhIGJmZCBzZWN0aW9ucwotICAgIHRoYXQgYWxsb3cgc3RhbmRhcmQgYmZkIGFjY2VzcyB0byB0aGUgZ2VuZXJhbCByZWdpc3RlcnMgKC5yZWcpIGFuZCB0aGUKLSAgICBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKC5yZWcyKS4KLQotICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKgotZWxmX2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEVsZl9FeHRlcm5hbF9FaGRyIHhfZWhkcjsJLyogRWxmIGZpbGUgaGVhZGVyLCBleHRlcm5hbCBmb3JtICovCi0gIEVsZl9JbnRlcm5hbF9FaGRyICppX2VoZHJwOwkvKiBFbGYgZmlsZSBoZWFkZXIsIGludGVybmFsIGZvcm0gKi8KLSAgRWxmX0ludGVybmFsX1BoZHIgKmlfcGhkcnA7CS8qIEVsZiBwcm9ncmFtIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICB1bnNpZ25lZCBpbnQgcGhpbmRleDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmViZDsKLQotICAvKiBSZWFkIGluIHRoZSBFTEYgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gICovCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiB4X2VoZHIsIHNpemVvZiAoeF9laGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh4X2VoZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBDaGVjayB0aGUgbWFnaWMgbnVtYmVyLiAqLwotICBpZiAoZWxmX2ZpbGVfcCAoJnhfZWhkcikgPT0gZmFsc2UpCi0gICAgewotICAgIHdyb25nOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogRklYTUU6IENoZWNrIEVJX1ZFUlNJT04gaGVyZSAhICovCi0KLSAgLyogQ2hlY2sgdGhlIGFkZHJlc3Mgc2l6ZSAoImNsYXNzIikuICovCi0gIGlmICh4X2VoZHIuZV9pZGVudFtFSV9DTEFTU10gIT0gRUxGQ0xBU1MpCi0gICAgZ290byB3cm9uZzsKLQotICAvKiBDaGVjayB0aGUgYnl0ZW9yZGVyLiAqLwotICBzd2l0Y2ggKHhfZWhkci5lX2lkZW50W0VJX0RBVEFdKQotICAgIHsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOgkJLyogQmlnLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWdvdG8gd3Jvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOgkJLyogTGl0dGxlLWVuZGlhbiAqLwotICAgICAgaWYgKCEgYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKQotCWdvdG8gd3Jvbmc7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZ290byB3cm9uZzsKLSAgICB9Ci0KLSAgLyogR2l2ZSBhYmZkIGFuIGVsZl9vYmpfdGRhdGEuICovCi0gIGVsZl90ZGF0YSAoYWJmZCkgPQotICAgIChzdHJ1Y3QgZWxmX29ial90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBlbGZfb2JqX3RkYXRhKSk7Ci0gIGlmIChlbGZfdGRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogRklYTUU6IGZyb20gaGVyZSBvbiBkb3duLCAiZ290byB3cm9uZyIgd2lsbCBsZWFrIG1lbW9yeS4gICovCi0KLSAgLyogU3dhcCBpbiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLCBub3cgdGhhdCB3ZSBoYXZlIHRoZSBieXRlIG9yZGVyLiAqLwotICBpX2VoZHJwID0gZWxmX2VsZmhlYWRlciAoYWJmZCk7Ci0gIGVsZl9zd2FwX2VoZHJfaW4gKGFiZmQsICZ4X2VoZHIsIGlfZWhkcnApOwotCi0jaWYgREVCVUcgJiAxCi0gIGVsZl9kZWJ1Z19maWxlIChpX2VoZHJwKTsKLSNlbmRpZgotCi0gIGViZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKTsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBFTEYgZV9tYWNoaW5lIGZpZWxkIG1hdGNoZXMgd2hhdCB0aGlzIHBhcnRpY3VsYXIKLSAgICAgQkZEIGZvcm1hdCBleHBlY3RzLiAgKi8KLQotICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IGlfZWhkcnAtPmVfbWFjaGluZQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MSA9PSAwCi0JICB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQxKQotICAgICAgJiYgKGViZC0+ZWxmX21hY2hpbmVfYWx0MiA9PSAwCi0JICB8fCBpX2VoZHJwLT5lX21hY2hpbmUgIT0gZWJkLT5lbGZfbWFjaGluZV9hbHQyKSkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgKnRhcmdldF9wdHI7Ci0KLSAgICAgIGlmIChlYmQtPmVsZl9tYWNoaW5lX2NvZGUgIT0gRU1fTk9ORSkKLQlnb3RvIHdyb25nOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBnZW5lcmljIEVMRiB0YXJnZXQuICBMZXQgaXQgbWF0Y2ggYW55IEVMRiB0YXJnZXQKLQkgZm9yIHdoaWNoIHdlIGRvIG5vdCBoYXZlIGEgc3BlY2lmaWMgYmFja2VuZC4gICovCi0KLSAgICAgIGZvciAodGFyZ2V0X3B0ciA9IGJmZF90YXJnZXRfdmVjdG9yOyAqdGFyZ2V0X3B0ciAhPSBOVUxMOyB0YXJnZXRfcHRyKyspCi0JewotCSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJhY2s7Ci0KLQkgIGlmICgoKnRhcmdldF9wdHIpLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIGNvbnRpbnVlOwotCSAgYmFjayA9IChzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqKSAoKnRhcmdldF9wdHIpLT5iYWNrZW5kX2RhdGE7Ci0JICBpZiAoYmFjay0+ZWxmX21hY2hpbmVfY29kZSA9PSBpX2VoZHJwLT5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgICAvKiB0YXJnZXRfcHRyIGlzIGFuIEVMRiBiYWNrZW5kIHdoaWNoIG1hdGNoZXMgdGhpcwotCQkgb2JqZWN0IGZpbGUsIHNvIHJlamVjdCB0aGUgZ2VuZXJpYyBFTEYgdGFyZ2V0LiAgKi8KLQkgICAgICBnb3RvIHdyb25nOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBubyBwcm9ncmFtIGhlYWRlciwgb3IgdGhlIHR5cGUgaXMgbm90IGEgY29yZSBmaWxlLCB0aGVuCi0gICAgIHdlIGFyZSBob3NlZC4gKi8KLSAgaWYgKGlfZWhkcnAtPmVfcGhvZmYgPT0gMCB8fCBpX2VoZHJwLT5lX3R5cGUgIT0gRVRfQ09SRSkKLSAgICBnb3RvIHdyb25nOwotCi0gIC8qIERvZXMgQkZEJ3MgaWRlYSBvZiB0aGUgcGhkciBzaXplIG1hdGNoIHRoZSBzaXplCi0gICAgIHJlY29yZGVkIGluIHRoZSBmaWxlPyAqLwotICBpZiAoaV9laGRycC0+ZV9waGVudHNpemUgIT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUGhkcikpCi0gICAgZ290byB3cm9uZzsKLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHByb2dyYW0gaGVhZGVycy4gKi8KLSAgaV9waGRycCA9IChFbGZfSW50ZXJuYWxfUGhkciAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICgqaV9waGRycCkgKiBpX2VoZHJwLT5lX3BobnVtKTsKLSAgaWYgKCFpX3BoZHJwKQotICAgIHJldHVybiBOVUxMOwotCi0gIGVsZl90ZGF0YSAoYWJmZCktPnBoZHIgPSBpX3BoZHJwOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdG8gaW50ZXJuYWwgZm9ybS4gKi8KLSAgZm9yIChwaGluZGV4ID0gMDsgcGhpbmRleCA8IGlfZWhkcnAtPmVfcGhudW07ICsrcGhpbmRleCkKLSAgICB7Ci0gICAgICBFbGZfRXh0ZXJuYWxfUGhkciB4X3BoZHI7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpICZ4X3BoZHIsIHNpemVvZiAoeF9waGRyKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoeF9waGRyKSkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgZWxmX3N3YXBfcGhkcl9pbiAoYWJmZCwgJnhfcGhkciwgaV9waGRycCArIHBoaW5kZXgpOwotICAgIH0KLQotICAvKiBQcm9jZXNzIGVhY2ggcHJvZ3JhbSBoZWFkZXIuICovCi0gIGZvciAocGhpbmRleCA9IDA7IHBoaW5kZXggPCBpX2VoZHJwLT5lX3BobnVtOyArK3BoaW5kZXgpCi0gICAgewotICAgICAgaWYgKCFfYmZkX2VsZmNvcmVfc2VjdGlvbl9mcm9tX3BoZHIgKGFiZmQsIGlfcGhkcnAgKyBwaGluZGV4LCBwaGluZGV4KSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZSBtYWNoaW5lIGFyY2hpdGVjdHVyZS4gKi8KLSAgaWYgKCEgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgZWJkLT5hcmNoLCAwKSkKLSAgICB7Ci0gICAgICAvKiBJdCdzIE9LIGlmIHRoaXMgZmFpbHMgZm9yIHRoZSBnZW5lcmljIHRhcmdldC4gICovCi0gICAgICBpZiAoZWJkLT5lbGZfbWFjaGluZV9jb2RlICE9IEVNX05PTkUpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFNhdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gdGhlIEVMRiBoZWFkZXIuICovCi0gIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgPSBpX2VoZHJwLT5lX2VudHJ5OwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuYyBiL2JmZC9lbGZsaW5rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDRlMWIuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi0vKiBFTEYgbGlua2luZyBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2RlZmluZSBBUkNIX1NJWkUgMAotI2luY2x1ZGUgImVsZi1iZmQuaCIKLQotYm9vbGVhbgotX2JmZF9lbGZfY3JlYXRlX2dvdF9zZWN0aW9uIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpbnQgcHRyYWxpZ247Ci0KLSAgLyogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmdvdCIpICE9IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKLSAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gICAgfQotCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19JTl9NRU1PUlkKLQkgICB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZ290Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJlZC0+d2FudF9nb3RfcGx0KQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdvdC5wbHQiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICFiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgIWJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIERlZmluZSB0aGUgc3ltYm9sIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXyBhdCB0aGUgc3RhcnQgb2YgdGhlIC5nb3QKLSAgICAgKG9yIC5nb3QucGx0KSBzZWN0aW9uLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgbGlua2VyIHNjcmlwdAotICAgICBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBzeW1ib2wgaWYgd2UgYXJlIG5vdCBjcmVhdGluZwotICAgICBhIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkoaW5mbywgYWJmZCwgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIsIEJTRl9HTE9CQUwsIHMsCi0JIGJlZC0+Z290X3N5bWJvbF9vZmZzZXQsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCSBiZWQtPmNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKGluZm8tPnNoYXJlZAotICAgICAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+aGdvdCA9IGg7Ci0KLSAgLyogVGhlIGZpcnN0IGJpdCBvZiB0aGUgZ2xvYmFsIG9mZnNldCB0YWJsZSBpcyB0aGUgaGVhZGVyLiAgKi8KLSAgcy0+X3Jhd19zaXplICs9IGJlZC0+Z290X2hlYWRlcl9zaXplICsgYmVkLT5nb3Rfc3ltYm9sX29mZnNldDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLQotLyogQ3JlYXRlIGR5bmFtaWMgc2VjdGlvbnMgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFncywgcGx0ZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBpbnQgcHRyYWxpZ247Ci0KLSAgc3dpdGNoIChiZWQtPnMtPmFyY2hfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAzMjogcHRyYWxpZ24gPSAyOyBicmVhazsKLSAgICBjYXNlIDY0OiBwdHJhbGlnbiA9IDM7IGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIC5wbHQsIC5yZWxbYV0ucGx0LCAuZ290LCAuZ290LnBsdCwgLmR5bmJzcywgYW5kCi0gICAgIC5yZWxbYV0uYnNzIHNlY3Rpb25zLiAgKi8KLQotICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgfCBTRUNfTElOS0VSX0NSRUFURUQpOwotCi0gIHBsdGZsYWdzID0gZmxhZ3M7Ci0gIHBsdGZsYWdzIHw9IFNFQ19DT0RFOwotICBpZiAoYmVkLT5wbHRfbm90X2xvYWRlZCkKLSAgICBwbHRmbGFncyAmPSB+IChTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotICBpZiAoYmVkLT5wbHRfcmVhZG9ubHkpCi0gICAgcGx0ZmxhZ3MgfD0gU0VDX1JFQURPTkxZOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgcGx0ZmxhZ3MpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIGJlZC0+cGx0X2FsaWdubWVudCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZWQtPndhbnRfcGx0X3N5bSkKLSAgICB7Ci0gICAgICAvKiBEZWZpbmUgdGhlIHN5bWJvbCBfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIGF0IHRoZSBzdGFydCBvZiB0aGUKLQkgLnBsdCBzZWN0aW9uLiAgKi8KLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGFiZmQsICJfUFJPQ0VEVVJFX0xJTktBR0VfVEFCTEVfIiwgQlNGX0dMT0JBTCwgcywKLQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JICAgICAgZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT5jb2xsZWN0LAotCSAgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQotICAgICAgaWYgKGluZm8tPnNoYXJlZAotCSAgJiYgISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgCi0JCQliZWQtPmRlZmF1bHRfdXNlX3JlbGFfcCA/ICIucmVsYS5wbHQiIDogIi5yZWwucGx0Iik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgcHRyYWxpZ24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBfYmZkX2VsZl9jcmVhdGVfZ290X3NlY3Rpb24gKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgLmR5bmJzcyBzZWN0aW9uIGlzIGEgcGxhY2UgdG8gcHV0IHN5bWJvbHMgd2hpY2ggYXJlIGRlZmluZWQKLSAgICAgYnkgZHluYW1pYyBvYmplY3RzLCBhcmUgcmVmZXJlbmNlZCBieSByZWd1bGFyIG9iamVjdHMsIGFuZCBhcmUKLSAgICAgbm90IGZ1bmN0aW9ucy4gIFdlIG11c3QgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZW0gaW4gdGhlIHByb2Nlc3MKLSAgICAgaW1hZ2UgYW5kIHVzZSBhIFJfKl9DT1BZIHJlbG9jIHRvIHRlbGwgdGhlIGR5bmFtaWMgbGlua2VyIHRvCi0gICAgIGluaXRpYWxpemUgdGhlbSBhdCBydW4gdGltZS4gIFRoZSBsaW5rZXIgc2NyaXB0IHB1dHMgdGhlIC5keW5ic3MKLSAgICAgc2VjdGlvbiBpbnRvIHRoZSAuYnNzIHNlY3Rpb24gb2YgdGhlIGZpbmFsIGltYWdlLiAgKi8KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluYnNzIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBTRUNfQUxMT0MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgLnJlbFthXS5ic3Mgc2VjdGlvbiBob2xkcyBjb3B5IHJlbG9jcy4gIFRoaXMgc2VjdGlvbiBpcyBub3QKLSAgICAgbm9ybWFsbHkgbmVlZGVkLiAgV2UgbmVlZCB0byBjcmVhdGUgaXQgaGVyZSwgdGhvdWdoLCBzbyB0aGF0IHRoZQotICAgICBsaW5rZXIgd2lsbCBtYXAgaXQgdG8gYW4gb3V0cHV0IHNlY3Rpb24uICBXZSBjYW4ndCBqdXN0IGNyZWF0ZSBpdAotICAgICBvbmx5IGlmIHdlIG5lZWQgaXQsIGJlY2F1c2Ugd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHdlIG5lZWQgaXQKLSAgICAgdW50aWwgd2UgaGF2ZSBzZWVuIGFsbCB0aGUgaW5wdXQgZmlsZXMsIGFuZCB0aGUgZmlyc3QgdGltZSB0aGUKLSAgICAgbWFpbiBsaW5rZXIgY29kZSBjYWxscyBCRkQgYWZ0ZXIgZXhhbWluaW5nIGFsbCB0aGUgaW5wdXQgZmlsZXMKLSAgICAgKHNpemVfZHluYW1pY19zZWN0aW9ucykgdGhlIGlucHV0IHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuCi0gICAgIG1hcHBlZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgSWYgdGhlIHNlY3Rpb24gdHVybnMgb3V0IG5vdCB0bwotICAgICBiZSBuZWVkZWQsIHdlIGNhbiBkaXNjYXJkIGl0IGxhdGVyLiAgV2Ugd2lsbCBuZXZlciBuZWVkIHRoaXMKLSAgICAgc2VjdGlvbiB3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCBzaW5jZSB0aGV5IGRvIG5vdCB1c2UKLSAgICAgY29weSByZWxvY3MuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIAotCQkJICAgIChiZWQtPmRlZmF1bHRfdXNlX3JlbGFfcCAKLQkJCSAgICAgPyAiLnJlbGEuYnNzIiA6ICIucmVsLmJzcyIpKTsgCi0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIHB0cmFsaWduKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotCi0vKiBSZWNvcmQgYSBuZXcgZHluYW1pYyBzeW1ib2wuICBXZSByZWNvcmQgdGhlIGR5bmFtaWMgc3ltYm9scyBhcyB3ZQotICAgcmVhZCB0aGUgaW5wdXQgZmlsZXMsIHNpbmNlIHdlIG5lZWQgdG8gaGF2ZSBhIGxpc3Qgb2YgYWxsIG9mIHRoZW0KLSAgIGJlZm9yZSB3ZSBjYW4gZGV0ZXJtaW5lIHRoZSBmaW5hbCBzaXplcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb25zLgotICAgTm90ZSB0aGF0IHdlIG1heSBhY3R1YWxseSBjYWxsIHRoaXMgZnVuY3Rpb24gZXZlbiB0aG91Z2ggd2UgYXJlIG5vdAotICAgZ29pbmcgdG8gb3V0cHV0IGFueSBkeW5hbWljIHN5bWJvbHM7IGluIHNvbWUgY2FzZXMgd2Uga25vdyB0aGF0IGEKLSAgIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLCBidXQgb25seSBpZiB0aGVyZSBpcwotICAgb25lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZHluc3RyOwotICAgICAgY2hhciAqcCwgKmFsYzsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBib29sZWFuIGNvcHk7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIGgtPmR5bmluZHggPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCi0gICAgICBkeW5zdHIgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cjsKLSAgICAgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQl7Ci0JICAvKiBDcmVhdGUgYSBzdHJ0YWIgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2wgbmFtZXMuICAqLwotCSAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIgPSBkeW5zdHIgPSBfYmZkX2VsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLQkgIGlmIChkeW5zdHIgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgZG9uJ3QgcHV0IGFueSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIHRoZSBkeW5hbWljIHN0cmluZwotICAgICAgICAgdGFibGUuICAqLwotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGFsYyA9IE5VTEw7Ci0JICBjb3B5ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFsYyA9IGJmZF9tYWxsb2MgKHAgLSBuYW1lICsgMSk7Ci0JICBpZiAoYWxjID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN0cm5jcHkgKGFsYywgbmFtZSwgcCAtIG5hbWUpOwotCSAgYWxjW3AgLSBuYW1lXSA9ICdcMCc7Ci0JICBuYW1lID0gYWxjOwotCSAgY29weSA9IHRydWU7Ci0JfQotCi0gICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkeW5zdHIsIG5hbWUsIHRydWUsIGNvcHkpOwotCi0gICAgICBpZiAoYWxjICE9IE5VTEwpCi0JZnJlZSAoYWxjKTsKLQotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IGluZHg7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbmNyZWFzZSB0aGUgaW5kZXggYXQgd2hpY2ggSCB3aWxsIGFwcGVhciBpbiB0aGUgZHluYW1pYyBzeW1ib2wKLSAgIHRhYmxlIGJ5IElOQ1JFTUVOVCAod2hpY2ggaXMgcmVhbGx5IGFuIGBpbnQgKicpLiAgQ2FsbGVkIHZpYQotICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfZWxmX2xpbmtfYWRqdXN0X2R5bmluZHggKGgsIGluY3JlbWVudCkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpbmNyZW1lbnQ7Ci17Ci0gIGlmIChoLT5keW5pbmR4ICE9IC0xKQotICAgIGgtPmR5bmluZHggKz0gKigoaW50ICopIGluY3JlbWVudCk7Ci0gICAgCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogQ3JlYXRlIGEgc3BlY2lhbCBsaW5rZXIgc2VjdGlvbiwgb3IgcmV0dXJuIGEgcG9pbnRlciB0byBhIGxpbmtlciBzZWN0aW9uIGFscmVhZHkgY3JlYXRlZCAgKi8KLQotZWxmX2xpbmtlcl9zZWN0aW9uX3QgKgotX2JmZF9lbGZfY3JlYXRlX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCB3aGljaCwgZGVmYXVsdHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVudW0gZWxmX2xpbmtlcl9zZWN0aW9uX2VudW0gd2hpY2g7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpkZWZhdWx0czsKLXsKLSAgYmZkICpkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZWxmX2xpbmtlcl9zZWN0aW9uX3QgKmxzZWN0OwotCi0gIC8qIFJlY29yZCB0aGUgZmlyc3QgYmZkIHNlY3Rpb24gdGhhdCBuZWVkcyB0aGUgc3BlY2lhbCBzZWN0aW9uICovCi0gIGlmICghZHlub2JqKQotICAgIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lLCBjcmVhdGUgdGhlIHNlY3Rpb24gKi8KLSAgbHNlY3QgPSBlbGZfbGlua2VyX3NlY3Rpb24gKGR5bm9iaiwgd2hpY2gpOwotICBpZiAoIWxzZWN0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICBsc2VjdCA9IChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKQotCWJmZF9hbGxvYyAoZHlub2JqLCBzaXplb2YgKGVsZl9saW5rZXJfc2VjdGlvbl90KSk7Ci0KLSAgICAgICpsc2VjdCA9ICpkZWZhdWx0czsKLSAgICAgIGVsZl9saW5rZXJfc2VjdGlvbiAoZHlub2JqLCB3aGljaCkgPSBsc2VjdDsKLSAgICAgIGxzZWN0LT53aGljaCA9IHdoaWNoOwotICAgICAgbHNlY3QtPmhvbGVfd3JpdHRlbl9wID0gZmFsc2U7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGUgc2VjdGlvbnMgYWxyZWFkeSBleGlzdCAqLwotICAgICAgbHNlY3QtPnNlY3Rpb24gPSBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPm5hbWUpOwotICAgICAgaWYgKCFzIHx8IChzLT5mbGFncyAmIGRlZmF1bHRzLT5mbGFncykgIT0gZGVmYXVsdHMtPmZsYWdzKQotCXsKLQkgIGxzZWN0LT5zZWN0aW9uID0gcyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChkeW5vYmosIGxzZWN0LT5uYW1lKTsKLQotCSAgaWYgKHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZHlub2JqLCBzLCBkZWZhdWx0cy0+ZmxhZ3MpOwotCSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoZHlub2JqLCBzLCBsc2VjdC0+YWxpZ25tZW50KTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMpIDwgbHNlY3QtPmFsaWdubWVudCkKLQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIGxzZWN0LT5hbGlnbm1lbnQpOwotCi0gICAgICBzLT5fcmF3X3NpemUgPSBhbGlnbl9wb3dlciAocy0+X3Jhd19zaXplLCBsc2VjdC0+YWxpZ25tZW50KTsKLQotICAgICAgLyogSXMgdGhlcmUgYSBob2xlIHdlIGhhdmUgdG8gcHJvdmlkZT8gIElmIHNvIGNoZWNrIHdoZXRoZXIgdGhlIHNlZ21lbnQgaXMKLQkgdG9vIGJpZyBhbHJlYWR5ICovCi0gICAgICBpZiAobHNlY3QtPmhvbGVfc2l6ZSkKLQl7Ci0JICBsc2VjdC0+aG9sZV9vZmZzZXQgPSBzLT5fcmF3X3NpemU7Ci0JICBzLT5fcmF3X3NpemUgKz0gbHNlY3QtPmhvbGVfc2l6ZTsKLQkgIGlmIChsc2VjdC0+aG9sZV9vZmZzZXQgPiBsc2VjdC0+bWF4X2hvbGVfb2Zmc2V0KQotCSAgICB7Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogU2VjdGlvbiAlcyBpcyBhbHJlYWR5IHRvIGxhcmdlIHRvIHB1dCBob2xlIG9mICVsZCBieXRlcyBpbiIpLAotCQkJCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JCQkJICAgICBsc2VjdC0+bmFtZSwKLQkJCQkgICAgIChsb25nKWxzZWN0LT5ob2xlX3NpemUpOwotCi0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JICAgIH0KLQl9Ci0KLSNpZmRlZiBERUJVRwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiQ3JlYXRpbmcgc2VjdGlvbiAlcywgY3VycmVudCBzaXplID0gJWxkXG4iLAotCSAgICAgICBsc2VjdC0+bmFtZSwgKGxvbmcpcy0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAobHNlY3QtPnN5bV9uYW1lKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLSNpZmRlZiBERUJVRwotCSAgZnByaW50ZiAoc3RkZXJyLCAiQWRkaW5nICVzIHRvIHNlY3Rpb24gJXNcbiIsCi0JCSAgIGxzZWN0LT5zeW1fbmFtZSwKLQkJICAgbHNlY3QtPm5hbWUpOwotI2VuZGlmCi0JICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgIGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLCBsc2VjdC0+c3ltX25hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoKGggPT0gTlVMTCB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgICAgJiYgIShfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCAoaW5mbywKLQkJCQkJCSAgICAgYWJmZCwKLQkJCQkJCSAgICAgbHNlY3QtPnN5bV9uYW1lLAotCQkJCQkJICAgICBCU0ZfR0xPQkFMLAotCQkJCQkJICAgICBzLAotCQkJCQkJICAgICAoKGxzZWN0LT5ob2xlX3NpemUpCi0JCQkJCQkgICAgICA/IHMtPl9yYXdfc2l6ZSAtIGxzZWN0LT5ob2xlX3NpemUgKyBsc2VjdC0+c3ltX29mZnNldAotCQkJCQkJICAgICAgOiBsc2VjdC0+c3ltX29mZnNldCksCi0JCQkJCQkgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgIGZhbHNlLAotCQkJCQkJICAgICBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JCQkJCQkgICAgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmgpKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0KLQkgIGlmICgoZGVmYXVsdHMtPndoaWNoICE9IExJTktFUl9TRUNUSU9OX1NEQVRBKQotCSAgICAgICYmIChkZWZhdWx0cy0+d2hpY2ggIT0gTElOS0VSX1NFQ1RJT05fU0RBVEEyKSkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCi0JICBoLT50eXBlID0gU1RUX09CSkVDVDsKLQkgIGxzZWN0LT5zeW1faGFzaCA9IGg7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiAhIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fdCAqKTA7Ci0JfQotICAgIH0KLQotI2lmIDAKLSAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlLiAgVGhlIHNlY3Rpb25zIHdoaWNoIG1heSBleGlzdCBpbiB0aGUKLSAgICAgb2JqZWN0IGZpbGUgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHNlY3Rpb25zIHdlIHdhbnQgdG8KLSAgICAgY3JlYXRlLiAgKi8KLQotICAvKiBGaW5kIHRoZSByZWxhdGVkIHNlY3Rpb25zIGlmIHRoZXkgaGF2ZSBiZWVuIGNyZWF0ZWQgKi8KLSAgaWYgKGxzZWN0LT5ic3NfbmFtZSAmJiAhbHNlY3QtPmJzc19zZWN0aW9uKQotICAgIGxzZWN0LT5ic3Nfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5ic3NfbmFtZSk7Ci0KLSAgaWYgKGxzZWN0LT5yZWxfbmFtZSAmJiAhbHNlY3QtPnJlbF9zZWN0aW9uKQotICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosIGxzZWN0LT5yZWxfbmFtZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gbHNlY3Q7Ci19Ci0KLQwKLS8qIEZpbmQgYSBsaW5rZXIgZ2VuZXJhdGVkIHBvaW50ZXIgd2l0aCBhIGdpdmVuIGFkZGVuZCBhbmQgdHlwZS4gICovCi0KLWVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoKLV9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAobGlua2VyX3BvaW50ZXJzLCBhZGRlbmQsIHdoaWNoKQotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3BvaW50ZXJzOwotICAgICBiZmRfc2lnbmVkX3ZtYSBhZGRlbmQ7Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl9lbnVtX3Qgd2hpY2g7Ci17Ci0gIGZvciAoIDsgbGlua2VyX3BvaW50ZXJzICE9IE5VTEw7IGxpbmtlcl9wb2ludGVycyA9IGxpbmtlcl9wb2ludGVycy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAod2hpY2ggPT0gbGlua2VyX3BvaW50ZXJzLT53aGljaCAmJiBhZGRlbmQgPT0gbGlua2VyX3BvaW50ZXJzLT5hZGRlbmQpCi0JcmV0dXJuIGxpbmtlcl9wb2ludGVyczsKLSAgICB9Ci0KLSAgcmV0dXJuIChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKTA7Ci19Ci0KLQwKLS8qIE1ha2UgdGhlIC5yZWxhIHNlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZ2VuZXJhdGVkIGxpbmtlciBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotX2JmZF9lbGZfbWFrZV9saW5rZXJfc2VjdGlvbl9yZWxhIChkeW5vYmosIGxzZWN0LCBhbGlnbm1lbnQpCi0gICAgIGJmZCAqZHlub2JqOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci17Ci0gIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbHNlY3QtPnJlbF9zZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxzZWN0LT5yZWxfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgbHNlY3QtPnJlbF9uYW1lKTsKLSAgICAgIGlmIChsc2VjdC0+cmVsX3NlY3Rpb24gPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwKLQkJCQkgICAgICBsc2VjdC0+cmVsX3NlY3Rpb24sCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfTElOS0VSX0NSRUFURUQKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIGxzZWN0LT5yZWxfc2VjdGlvbiwgYWxpZ25tZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2VsZmxpbmsuaCBiL2JmZC9lbGZsaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDJiMDkuLjAwMDAwMDAKLS0tIGEvYmZkL2VsZmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyMDggKzAsMCBAQAotLyogRUxGIGxpbmtlciBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRUxGIGxpbmtlciBjb2RlLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIHJvdXRpbmVzIGNhbGxlZCB2aWEKLSAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2Ugd2hpY2ggbXVzdCByZXR1cm4gZmFpbHVyZS4gICovCi0KLXN0cnVjdCBlbGZfaW5mb19mYWlsZWQKLXsKLSAgYm9vbGVhbiBmYWlsZWQ7Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotfTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbWVyZ2Vfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkgICBhc2VjdGlvbiAqKiwgYmZkX3ZtYSAqLCBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKiwKLQkgICBib29sZWFuICosIGJvb2xlYW4gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfZXhwb3J0X3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9maXhfc3ltYm9sX2ZsYWdzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcwotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9jb2xsZWN0X2hhc2hfY29kZXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gCi0gIFBBUkFNUyAoKGJmZCAqLCBFbGZfSW50ZXJuYWxfU2hkciAqLCBQVFIsIEVsZl9JbnRlcm5hbF9SZWxhICopKTsKLXN0YXRpYyB2b2lkIGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKikpOwotCi0vKiBHaXZlbiBhbiBFTEYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotZWxmX2JmZF9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0dXJuIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0gICAgY2FzZSBiZmRfYXJjaGl2ZToKLSAgICAgIHJldHVybiBlbGZfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvKTsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotDAotCi0vKiBBZGQgc3ltYm9scyBmcm9tIGFuIEVMRiBhcmNoaXZlIGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgV2UKLSAgIGRvbid0IHVzZSBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGJlY2F1c2Ugb2YgYQotICAgcHJvYmxlbSB3aGljaCBhcmlzZXMgb24gVW5peFdhcmUuICBUaGUgVW5peFdhcmUgbGliYy5zbyBpcyBhbgotICAgYXJjaGl2ZSB3aGljaCBpbmNsdWRlcyBhbiBlbnRyeSBsaWJjLnNvLjEgd2hpY2ggZGVmaW5lcyBhIGJ1bmNoIG9mCi0gICBzeW1ib2xzLiAgVGhlIGxpYmMuc28gYXJjaGl2ZSBhbHNvIGluY2x1ZGVzIGEgbnVtYmVyIG9mIG90aGVyCi0gICBvYmplY3QgZmlsZXMsIHdoaWNoIGFsc28gZGVmaW5lIHN5bWJvbHMsIHNvbWUgb2Ygd2hpY2ggYXJlIHRoZSBzYW1lCi0gICBhcyB0aG9zZSBkZWZpbmVkIGluIGxpYmMuc28uMS4gIENvcnJlY3QgbGlua2luZyByZXF1aXJlcyB0aGF0IHdlCi0gICBjb25zaWRlciBlYWNoIG9iamVjdCBmaWxlIGluIHR1cm4sIGFuZCBpbmNsdWRlIGl0IGlmIGl0IGRlZmluZXMgYW55Ci0gICBzeW1ib2xzIHdlIG5lZWQuICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIGRvZXMgbm90IGRvCi0gICB0aGlzOyBpdCBsb29rcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzLCBhbmQgaW5jbHVkZXMKLSAgIGFueSBvYmplY3QgZmlsZSB3aGljaCBkZWZpbmVzIHRoZW0uICBXaGVuIHRoaXMgYWxnb3JpdGhtIGlzIHVzZWQgb24KLSAgIFVuaXhXYXJlLCBpdCB3aW5kcyB1cCBwdWxsaW5nIGluIGxpYmMuc28uMSBlYXJseSBhbmQgZGVmaW5pbmcgYQotICAgYnVuY2ggb2Ygc3ltYm9scy4gIFRoaXMgbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBvdGhlciBvYmplY3RzIGluIHRoZQotICAgYXJjaGl2ZSBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBsaW5rLCB3aGljaCBpcyBpbmNvcnJlY3Qgc2luY2UgdGhleQotICAgcHJlY2VkZSBsaWJjLnNvLjEgaW4gdGhlIGFyY2hpdmUuCi0KLSAgIEZvcnR1bmF0ZWx5LCBFTEYgYXJjaGl2ZSBoYW5kbGluZyBpcyBzaW1wbGVyIHRoYW4gdGhhdCBkb25lIGJ5Ci0gICBfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzLCB3aGljaCBoYXMgdG8gYWxsb3cgZm9yIGEub3V0Ci0gICBvZGRpdGllcy4gIEluIEVMRiwgaWYgd2UgZmluZCBhIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBtYXAsIGFuZCB0aGUKLSAgIHN5bWJvbCBpcyBjdXJyZW50bHkgdW5kZWZpbmVkLCB3ZSBrbm93IHRoYXQgd2UgbXVzdCBwdWxsIGluIHRoYXQKLSAgIG9iamVjdCBmaWxlLgotCi0gICBVbmZvcnR1bmF0ZWx5LCB3ZSBkbyBoYXZlIHRvIG1ha2UgbXVsdGlwbGUgcGFzc2VzIG92ZXIgdGhlIHN5bWJvbAotICAgdGFibGUgdW50aWwgbm90aGluZyBmdXJ0aGVyIGlzIHJlc29sdmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHN5bWluZGV4IGM7Ci0gIGJvb2xlYW4gKmRlZmluZWQgPSBOVUxMOwotICBib29sZWFuICppbmNsdWRlZCA9IE5VTEw7Ci0gIGNhcnN5bSAqc3ltZGVmczsKLSAgYm9vbGVhbiBsb29wOwotCi0gIGlmICghIGJmZF9oYXNfbWFwIChhYmZkKSkKLSAgICB7Ci0gICAgICAvKiBBbiBlbXB0eSBhcmNoaXZlIGlzIGEgc3BlY2lhbCBjYXNlLiAgKi8KLSAgICAgIGlmIChiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fYXJtYXApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBLZWVwIHRyYWNrIG9mIGFsbCBzeW1ib2xzIHdlIGtub3cgdG8gYmUgYWxyZWFkeSBkZWZpbmVkLCBhbmQgYWxsCi0gICAgIGZpbGVzIHdlIGtub3cgdG8gYmUgYWxyZWFkeSBpbmNsdWRlZC4gIFRoaXMgaXMgdG8gc3BlZWQgdXAgdGhlCi0gICAgIHNlY29uZCBhbmQgc3Vic2VxdWVudCBwYXNzZXMuICAqLwotICBjID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZl9jb3VudDsKLSAgaWYgKGMgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZGVmaW5lZCA9IChib29sZWFuICopIGJmZF9tYWxsb2MgKGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLSAgaW5jbHVkZWQgPSAoYm9vbGVhbiAqKSBiZmRfbWFsbG9jIChjICogc2l6ZW9mIChib29sZWFuKSk7Ci0gIGlmIChkZWZpbmVkID09IChib29sZWFuICopIE5VTEwgfHwgaW5jbHVkZWQgPT0gKGJvb2xlYW4gKikgTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0IChkZWZpbmVkLCAwLCBjICogc2l6ZW9mIChib29sZWFuKSk7Ci0gIG1lbXNldCAoaW5jbHVkZWQsIDAsIGMgKiBzaXplb2YgKGJvb2xlYW4pKTsKLQotICBzeW1kZWZzID0gYmZkX2FyZGF0YSAoYWJmZCktPnN5bWRlZnM7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBmaWxlX3B0ciBsYXN0OwotICAgICAgc3ltaW5kZXggaTsKLSAgICAgIGNhcnN5bSAqc3ltZGVmOwotICAgICAgY2Fyc3ltICpzeW1kZWZlbmQ7Ci0KLSAgICAgIGxvb3AgPSBmYWxzZTsKLSAgICAgIGxhc3QgPSAtMTsKLQotICAgICAgc3ltZGVmID0gc3ltZGVmczsKLSAgICAgIHN5bWRlZmVuZCA9IHN5bWRlZiArIGM7Ci0gICAgICBmb3IgKGkgPSAwOyBzeW1kZWYgPCBzeW1kZWZlbmQ7IHN5bWRlZisrLCBpKyspCi0JewotCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0JICBiZmQgKmVsZW1lbnQ7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWZzX3RhaWw7Ci0JICBzeW1pbmRleCBtYXJrOwotCi0JICBpZiAoZGVmaW5lZFtpXSB8fCBpbmNsdWRlZFtpXSkKLQkgICAgY29udGludWU7Ci0JICBpZiAoc3ltZGVmLT5maWxlX29mZnNldCA9PSBsYXN0KQotCSAgICB7Ci0JICAgICAgaW5jbHVkZWRbaV0gPSB0cnVlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIGggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBzeW1kZWYtPm5hbWUsCi0JCQkJICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqcCwgKmNvcHk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgZGVmYXVsdCB2ZXJzaW9uICh0aGUgbmFtZSBjb250YWlucyBAQCksCi0JCSBsb29rIHVwIHRoZSBzeW1ib2wgYWdhaW4gd2l0aG91dCB0aGUgdmVyc2lvbi4gIFRoZQotCQkgZWZmZWN0IGlzIHRoYXQgcmVmZXJlbmNlcyB0byB0aGUgc3ltYm9sIHdpdGhvdXQgdGhlCi0JCSB2ZXJzaW9uIHdpbGwgYmUgbWF0Y2hlZCBieSB0aGUgZGVmYXVsdCBzeW1ib2wgaW4gdGhlCi0JCSBhcmNoaXZlLiAgKi8KLQotCSAgICAgIHAgPSBzdHJjaHIgKHN5bWRlZi0+bmFtZSwgRUxGX1ZFUl9DSFIpOwotCSAgICAgIGlmIChwID09IE5VTEwgfHwgcFsxXSAhPSBFTEZfVkVSX0NIUikKLQkJY29udGludWU7Ci0KLQkgICAgICBjb3B5ID0gYmZkX2FsbG9jIChhYmZkLCBwIC0gc3ltZGVmLT5uYW1lICsgMSk7Ci0JICAgICAgaWYgKGNvcHkgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgbWVtY3B5IChjb3B5LCBzeW1kZWYtPm5hbWUsIHAgLSBzeW1kZWYtPm5hbWUpOwotCSAgICAgIGNvcHlbcCAtIHN5bWRlZi0+bmFtZV0gPSAnXDAnOwotCi0JICAgICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIGNvcHksCi0JCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGNvcHkpOwotCSAgICB9Ci0KLQkgIGlmIChoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQkJZGVmaW5lZFtpXSA9IHRydWU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2UgbmVlZCB0byBpbmNsdWRlIHRoaXMgYXJjaGl2ZSBtZW1iZXIuICAqLwotCi0JICBlbGVtZW50ID0gX2JmZF9nZXRfZWx0X2F0X2ZpbGVwb3MgKGFiZmQsIHN5bWRlZi0+ZmlsZV9vZmZzZXQpOwotCSAgaWYgKGVsZW1lbnQgPT0gKGJmZCAqKSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoZWxlbWVudCwgYmZkX29iamVjdCkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBEb3VibGVjaGVjayB0aGF0IHdlIGhhdmUgbm90IGluY2x1ZGVkIHRoaXMgb2JqZWN0Ci0JICAgICBhbHJlYWR5LS1pdCBzaG91bGQgYmUgaW1wb3NzaWJsZSwgYnV0IHRoZXJlIG1heSBiZQotCSAgICAgc29tZXRoaW5nIHdyb25nIHdpdGggdGhlIGFyY2hpdmUuICAqLwotCSAgaWYgKGVsZW1lbnQtPmFyY2hpdmVfcGFzcyAhPSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IDE7Ci0KLQkgIHVuZGVmc190YWlsID0gaW5mby0+aGFzaC0+dW5kZWZzX3RhaWw7Ci0KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgZWxlbWVudCwKLQkJCQkJCQkgc3ltZGVmLT5uYW1lKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoISBlbGZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGVsZW1lbnQsIGluZm8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogSWYgdGhlcmUgYXJlIGFueSBuZXcgdW5kZWZpbmVkIHN5bWJvbHMsIHdlIG5lZWQgdG8gbWFrZQotCSAgICAgYW5vdGhlciBwYXNzIHRocm91Z2ggdGhlIGFyY2hpdmUgaW4gb3JkZXIgdG8gc2VlIHdoZXRoZXIKLQkgICAgIHRoZXkgY2FuIGJlIGRlZmluZWQuICBGSVhNRTogVGhpcyBpc24ndCBwZXJmZWN0LCBiZWNhdXNlCi0JICAgICBjb21tb24gc3ltYm9scyB3aW5kIHVwIG9uIHVuZGVmc190YWlsIGFuZCBiZWNhdXNlIGFuCi0JICAgICB1bmRlZmluZWQgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgbGF0ZXIgb24gaW4gdGhpcyBwYXNzCi0JICAgICBkb2VzIG5vdCByZXF1aXJlIGFub3RoZXIgcGFzcy4gIFRoaXMgaXNuJ3QgYSBidWcsIGJ1dCBpdAotCSAgICAgZG9lcyBtYWtlIHRoZSBjb2RlIGxlc3MgZWZmaWNpZW50IHRoYW4gaXQgY291bGQgYmUuICAqLwotCSAgaWYgKHVuZGVmc190YWlsICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQotCSAgICBsb29wID0gdHJ1ZTsKLQotCSAgLyogTG9vayBiYWNrd2FyZCB0byBtYXJrIGFsbCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZQotCSAgICAgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHNlZW4gaW4gdGhpcyBwYXNzLiAgKi8KLQkgIG1hcmsgPSBpOwotCSAgZG8KLQkgICAgewotCSAgICAgIGluY2x1ZGVkW21hcmtdID0gdHJ1ZTsKLQkgICAgICBpZiAobWFyayA9PSAwKQotCQlicmVhazsKLQkgICAgICAtLW1hcms7Ci0JICAgIH0KLQkgIHdoaWxlIChzeW1kZWZzW21hcmtdLmZpbGVfb2Zmc2V0ID09IHN5bWRlZi0+ZmlsZV9vZmZzZXQpOwotCi0JICAvKiBXZSBtYXJrIHN1YnNlcXVlbnQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgYXMgd2UgZ28KLQkgICAgIG9uIHRocm91Z2ggdGhlIGxvb3AuICAqLwotCSAgbGFzdCA9IHN5bWRlZi0+ZmlsZV9vZmZzZXQ7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGxvb3ApOwotCi0gIGZyZWUgKGRlZmluZWQpOwotICBmcmVlIChpbmNsdWRlZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChkZWZpbmVkICE9IChib29sZWFuICopIE5VTEwpCi0gICAgZnJlZSAoZGVmaW5lZCk7Ci0gIGlmIChpbmNsdWRlZCAhPSAoYm9vbGVhbiAqKSBOVUxMKQotICAgIGZyZWUgKGluY2x1ZGVkKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHdhbnQgdG8gZGVmaW5lIGEgbmV3IHN5bWJvbC4gIEl0Ci0gICBoYW5kbGVzIHRoZSB2YXJpb3VzIGNhc2VzIHdoaWNoIGFyaXNlIHdoZW4gd2UgZmluZCBhIGRlZmluaXRpb24gaW4KLSAgIGEgZHluYW1pYyBvYmplY3QsIG9yIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhIGRlZmluaXRpb24gaW4gYQotICAgZHluYW1pYyBvYmplY3QuICBUaGUgbmV3IHN5bWJvbCBpcyBkZXNjcmliZWQgYnkgTkFNRSwgU1lNLCBQU0VDLAotICAgYW5kIFBWQUxVRS4gIFdlIHNldCBTWU1fSEFTSCB0byB0aGUgaGFzaCB0YWJsZSBlbnRyeS4gIFdlIHNldAotICAgT1ZFUlJJREUgaWYgdGhlIG9sZCBzeW1ib2wgaXMgb3ZlcnJpZGluZyBhIG5ldyBkZWZpbml0aW9uLiAgV2Ugc2V0Ci0gICBUWVBFX0NIQU5HRV9PSyBpZiBpdCBpcyBPSyBmb3IgdGhlIHR5cGUgdG8gY2hhbmdlLiAgV2Ugc2V0Ci0gICBTSVpFX0NIQU5HRV9PSyBpZiBpdCBpcyBPSyBmb3IgdGhlIHNpemUgdG8gY2hhbmdlLiAgQnkgT0sgdG8KLSAgIGNoYW5nZSwgd2UgbWVhbiB0aGF0IHdlIHNob3VsZG4ndCB3YXJuIGlmIHRoZSB0eXBlIG9yIHNpemUgZG9lcwotICAgY2hhbmdlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIG5hbWUsIHN5bSwgcHNlYywgcHZhbHVlLCBzeW1faGFzaCwKLQkJICBvdmVycmlkZSwgdHlwZV9jaGFuZ2Vfb2ssIHNpemVfY2hhbmdlX29rKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBFbGZfSW50ZXJuYWxfU3ltICpzeW07Ci0gICAgIGFzZWN0aW9uICoqcHNlYzsKLSAgICAgYmZkX3ZtYSAqcHZhbHVlOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICAgICBib29sZWFuICpvdmVycmlkZTsKLSAgICAgYm9vbGVhbiAqdHlwZV9jaGFuZ2Vfb2s7Ci0gICAgIGJvb2xlYW4gKnNpemVfY2hhbmdlX29rOwotewotICBhc2VjdGlvbiAqc2VjOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgaW50IGJpbmQ7Ci0gIGJmZCAqb2xkYmZkOwotICBib29sZWFuIG5ld2R5biwgb2xkZHluLCBvbGRkZWYsIG5ld2RlZiwgbmV3ZHluY29tbW9uLCBvbGRkeW5jb21tb247Ci0KLSAgKm92ZXJyaWRlID0gZmFsc2U7Ci0KLSAgc2VjID0gKnBzZWM7Ci0gIGJpbmQgPSBFTEZfU1RfQklORCAoc3ltLT5zdF9pbmZvKTsKLQotICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gIGVsc2UKLSAgICBoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLCB0cnVlLCBmYWxzZSwgZmFsc2UpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpzeW1faGFzaCA9IGg7Ci0KLSAgLyogVGhpcyBjb2RlIGlzIGZvciBjb3Bpbmcgd2l0aCBkeW5hbWljIG9iamVjdHMsIGFuZCBpcyBvbmx5IHVzZWZ1bAotICAgICBpZiB3ZSBhcmUgZG9pbmcgYW4gRUxGIGxpbmsuICAqLwotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSBhYmZkLT54dmVjKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZvciBtZXJnaW5nLCB3ZSBvbmx5IGNhcmUgYWJvdXQgcmVhbCBzeW1ib2xzLiAgKi8KLQotICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLSAgICBoID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0KLSAgLyogSWYgd2UganVzdCBjcmVhdGVkIHRoZSBzeW1ib2wsIG1hcmsgaXQgYXMgYmVpbmcgYW4gRUxGIHN5bWJvbC4KLSAgICAgT3RoZXIgdGhhbiB0aGF0LCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLS10aGVyZSBpcyBubyBtZXJnZSBpc3N1ZQotICAgICB3aXRoIGEgbmV3bHkgZGVmaW5lZCBzeW1ib2wtLXNvIHdlIGp1c3QgcmV0dXJuLiAgKi8KLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX05PTl9FTEY7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogT0xEQkZEIGlzIGEgQkZEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhpc3Rpbmcgc3ltYm9sLiAgKi8KLQotICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9sZGJmZCA9IE5VTEw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS51bmRlZi5hYmZkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIG9sZGJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9jb21tb246Ci0gICAgICBvbGRiZmQgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBORVdEWU4gYW5kIE9MRERZTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKLSAgICAgcmVzcGVjdGl2ZWx5LCBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIG5ld2R5biA9IHRydWU7Ci0gIGVsc2UKLSAgICBuZXdkeW4gPSBmYWxzZTsKLQotICBpZiAob2xkYmZkID09IE5VTEwgfHwgKG9sZGJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKQotICAgIG9sZGR5biA9IGZhbHNlOwotICBlbHNlCi0gICAgb2xkZHluID0gdHJ1ZTsKLQotICAvKiBORVdERUYgYW5kIE9MRERFRiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkIHN5bWJvbCwKLSAgICAgcmVzcGVjdGl2ZWx5LCBhcHBlYXIgdG8gYmUgYSBkZWZpbml0aW9uIHJhdGhlciB0aGFuIHJlZmVyZW5jZS4gICovCi0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgbmV3ZGVmID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBuZXdkZWYgPSB0cnVlOwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIG9sZGRlZiA9IGZhbHNlOwotICBlbHNlCi0gICAgb2xkZGVmID0gdHJ1ZTsKLQotICAvKiBORVdEWU5DT01NT04gYW5kIE9MRERZTkNPTU1PTiBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBuZXcgb3Igb2xkCi0gICAgIHN5bWJvbCwgcmVzcGVjdGl2ZWx5LCBhcHBlYXJzIHRvIGJlIGEgY29tbW9uIHN5bWJvbCBpbiBhIGR5bmFtaWMKLSAgICAgb2JqZWN0LiAgSWYgYSBzeW1ib2wgYXBwZWFycyBpbiBhbiB1bmluaXRpYWxpemVkIHNlY3Rpb24sIGFuZCBpcwotICAgICBub3Qgd2VhaywgYW5kIGlzIG5vdCBhIGZ1bmN0aW9uLCB0aGVuIGl0IG1heSBiZSBhIGNvbW1vbiBzeW1ib2wKLSAgICAgd2hpY2ggd2FzIHJlc29sdmVkIHdoZW4gdGhlIGR5bmFtaWMgb2JqZWN0IHdhcyBjcmVhdGVkLiAgV2Ugd2FudAotICAgICB0byB0cmVhdCBzdWNoIHN5bWJvbHMgc3BlY2lhbGx5LCBiZWNhdXNlIHRoZXkgcmFpc2Ugc3BlY2lhbAotICAgICBjb25zaWRlcmF0aW9ucyB3aGVuIHNldHRpbmcgdGhlIHN5bWJvbCBzaXplOiBpZiB0aGUgc3ltYm9sCi0gICAgIGFwcGVhcnMgYXMgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QsIGFuZCB0aGUgc2l6ZSBpbgotICAgICB0aGUgcmVndWxhciBvYmplY3QgaXMgbGFyZ2VyLCB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIHVzZSB0aGUKLSAgICAgbGFyZ2VyIHNpemUuICBUaGlzIHByb2JsZW1hdGljIGNhc2UgY2FuIGFsd2F5cyBiZSBhdm9pZGVkIGluIEMsCi0gICAgIGJ1dCBpdCBtdXN0IGJlIGhhbmRsZWQgY29ycmVjdGx5IHdoZW4gdXNpbmcgRm9ydHJhbiBzaGFyZWQKLSAgICAgbGlicmFyaWVzLgotCi0gICAgIE5vdGUgdGhhdCBpZiBORVdEWU5DT01NT04gaXMgc2V0LCBORVdERUYgd2lsbCBiZSBzZXQsIGFuZAotICAgICBsaWtld2lzZSBmb3IgT0xERFlOQ09NTU9OIGFuZCBPTERERUYuCi0KLSAgICAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBqdXN0IGEgaGV1cmlzdGljLCBhbmQgdGhhdCBpdCBpcyBxdWl0ZQotICAgICBwb3NzaWJsZSB0byBoYXZlIGFuIHVuaW5pdGlhbGl6ZWQgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdCB3aGljaAotICAgICBpcyByZWFsbHkgYSBkZWZpbml0aW9uLCByYXRoZXIgdGhhbiBhIGNvbW1vbiBzeW1ib2wuICBUaGlzIGNvdWxkCi0gICAgIGxlYWQgdG8gc29tZSBtaW5vciBjb25mdXNpb24gd2hlbiB0aGUgc3ltYm9sIHJlYWxseSBpcyBhIGNvbW1vbgotICAgICBzeW1ib2wgaW4gc29tZSByZWd1bGFyIG9iamVjdC4gIEhvd2V2ZXIsIEkgdGhpbmsgaXQgd2lsbCBiZQotICAgICBoYXJtbGVzcy4gICovCi0KLSAgaWYgKG5ld2R5bgotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiAoc2VjLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotICAgICAgJiYgc3ltLT5zdF9zaXplID4gMAotICAgICAgJiYgYmluZCAhPSBTVEJfV0VBSwotICAgICAgJiYgRUxGX1NUX1RZUEUgKHN5bS0+c3RfaW5mbykgIT0gU1RUX0ZVTkMpCi0gICAgbmV3ZHluY29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotCi0gIGlmIChvbGRkeW4KLSAgICAgICYmIG9sZGRlZgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgIT0gMAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMAotICAgICAgJiYgaC0+c2l6ZSA+IDAKLSAgICAgICYmIGgtPnR5cGUgIT0gU1RUX0ZVTkMpCi0gICAgb2xkZHluY29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIG9sZGR5bmNvbW1vbiA9IGZhbHNlOwotCi0gIC8qIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSB0eXBlIGlmIGVpdGhlciB0aGUgZXhpc3Rpbmcgc3ltYm9sIG9yIHRoZQotICAgICBuZXcgc3ltYm9sIGlzIHdlYWsuICAqLwotCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWsKLSAgICAgIHx8IGJpbmQgPT0gU1RCX1dFQUspCi0gICAgKnR5cGVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAvKiBJdCdzIE9LIHRvIGNoYW5nZSB0aGUgc2l6ZSBpZiBlaXRoZXIgdGhlIGV4aXN0aW5nIHN5bWJvbCBvciB0aGUKLSAgICAgbmV3IHN5bWJvbCBpcyB3ZWFrLCBvciBpZiB0aGUgb2xkIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLwotCi0gIGlmICgqdHlwZV9jaGFuZ2Vfb2sKLSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gIC8qIElmIGJvdGggdGhlIG9sZCBhbmQgdGhlIG5ldyBzeW1ib2xzIGxvb2sgbGlrZSBjb21tb24gc3ltYm9scyBpbiBhCi0gICAgIGR5bmFtaWMgb2JqZWN0LCBzZXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCB0byB0aGUgbGFyZ2VyIG9mIHRoZQotICAgICB0d28uICAqLwotCi0gIGlmIChvbGRkeW5jb21tb24KLSAgICAgICYmIG5ld2R5bmNvbW1vbgotICAgICAgJiYgc3ltLT5zdF9zaXplICE9IGgtPnNpemUpCi0gICAgewotICAgICAgLyogU2luY2Ugd2UgdGhpbmsgd2UgaGF2ZSB0d28gY29tbW9uIHN5bWJvbHMsIGlzc3VlIGEgbXVsdGlwbGUKLSAgICAgICAgIGNvbW1vbiB3YXJuaW5nIGlmIGRlc2lyZWQuICBOb3RlIHRoYXQgd2Ugb25seSB3YXJuIGlmIHRoZQotICAgICAgICAgc2l6ZSBpcyBkaWZmZXJlbnQuICBJZiB0aGUgc2l6ZSBpcyB0aGUgc2FtZSwgd2Ugc2ltcGx5IGxldAotICAgICAgICAgdGhlIG9sZCBzeW1ib2wgb3ZlcnJpZGUgdGhlIG5ldyBvbmUgYXMgbm9ybWFsbHkgaGFwcGVucyB3aXRoCi0gICAgICAgICBzeW1ib2xzIGRlZmluZWQgaW4gZHluYW1pYyBvYmplY3RzLiAgKi8KLQotICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgb2xkYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwKLQkgICAgICBoLT5zaXplLCBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc3ltLT5zdF9zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc3ltLT5zdF9zaXplID4gaC0+c2l6ZSkKLQloLT5zaXplID0gc3ltLT5zdF9zaXplOwotCi0gICAgICAqc2l6ZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgbG9va2luZyBhdCBhIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2UgaGF2ZSBmb3VuZCBhCi0gICAgIGRlZmluaXRpb24sIHdlIG5lZWQgdG8gc2VlIGlmIHRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZCBieQotICAgICBzb21lIG90aGVyIG9iamVjdC4gIElmIHNvLCB3ZSB3YW50IHRvIHVzZSB0aGUgZXhpc3RpbmcKLSAgICAgZGVmaW5pdGlvbiwgYW5kIHdlIGRvIG5vdCB3YW50IHRvIHJlcG9ydCBhIG11bHRpcGxlIHN5bWJvbAotICAgICBkZWZpbml0aW9uIGVycm9yOyB3ZSBkbyB0aGlzIGJ5IGNsb2JiZXJpbmcgKlBTRUMgdG8gYmUKLSAgICAgYmZkX3VuZF9zZWN0aW9uX3B0ci4KLQotICAgICBXZSB0cmVhdCBhIGNvbW1vbiBzeW1ib2wgYXMgYSBkZWZpbml0aW9uIGlmIHRoZSBzeW1ib2wgaW4gdGhlCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGlzIGEgZnVuY3Rpb24sIHNpbmNlIGNvbW1vbiBzeW1ib2xzIGFsd2F5cwotICAgICByZXByZXNlbnQgdmFyaWFibGVzOyB0aGlzIGNhbiBjYXVzZSBjb25mdXNpb24gaW4gcHJpbmNpcGxlLCBidXQKLSAgICAgYW55IHN1Y2ggY29uZnVzaW9uIHdvdWxkIHNlZW0gdG8gaW5kaWNhdGUgYW4gZXJyb25lb3VzIHByb2dyYW0gb3IKLSAgICAgc2hhcmVkIGxpYnJhcnkuICBXZSBhbHNvIHBlcm1pdCBhIGNvbW1vbiBzeW1ib2wgaW4gYSByZWd1bGFyCi0gICAgIG9iamVjdCB0byBvdmVycmlkZSBhIHdlYWsgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0KLSAgaWYgKG5ld2R5bgotICAgICAgJiYgbmV3ZGVmCi0gICAgICAmJiAob2xkZGVmCi0JICB8fCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgJiYgKGJpbmQgPT0gU1RCX1dFQUsKLQkJICB8fCBFTEZfU1RfVFlQRSAoc3ltLT5zdF9pbmZvKSA9PSBTVFRfRlVOQykpKSkKLSAgICB7Ci0gICAgICAqb3ZlcnJpZGUgPSB0cnVlOwotICAgICAgbmV3ZGVmID0gZmFsc2U7Ci0gICAgICBuZXdkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgKnBzZWMgPSBzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgKnNpemVfY2hhbmdlX29rID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUgd2hlbiB0aGUgb2xkIHN5bWJvbCBpcyBhIGNvbW1vbiBzeW1ib2wsIHRoZW4KLSAgICAgICAgIHdlIGFyZSBleHBsaWNpdGx5IGxldHRpbmcgaXQgb3ZlcnJpZGUgYSB3ZWFrIHN5bWJvbCBvcgotICAgICAgICAgZnVuY3Rpb24gaW4gYSBkeW5hbWljIG9iamVjdCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gd2FybiBhYm91dAotICAgICAgICAgYSB0eXBlIGNoYW5nZS4gIElmIHRoZSBvbGQgc3ltYm9sIGlzIGEgZGVmaW5lZCBzeW1ib2wsIGEgdHlwZQotICAgICAgICAgY2hhbmdlIHdhcm5pbmcgbWF5IHN0aWxsIGJlIGFwcHJvcHJpYXRlLiAgKi8KLQotICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIHNwZWNpYWwgY2FzZSBvZiBhbiBvbGQgY29tbW9uIHN5bWJvbCBtZXJnaW5nIHdpdGggYQotICAgICBuZXcgc3ltYm9sIHdoaWNoIGxvb2tzIGxpa2UgYSBjb21tb24gc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdC4KLSAgICAgV2UgY2hhbmdlICpQU0VDIGFuZCAqUFZBTFVFIHRvIG1ha2UgdGhlIG5ldyBzeW1ib2wgbG9vayBsaWtlIGEKLSAgICAgY29tbW9uIHN5bWJvbCwgYW5kIGxldCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aWxsIGRvCi0gICAgIHRoZSByaWdodCB0aGluZy4gICovCi0KLSAgaWYgKG5ld2R5bmNvbW1vbgotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHsKLSAgICAgICpvdmVycmlkZSA9IHRydWU7Ci0gICAgICBuZXdkZWYgPSBmYWxzZTsKLSAgICAgIG5ld2R5bmNvbW1vbiA9IGZhbHNlOwotICAgICAgKnB2YWx1ZSA9IHN5bS0+c3Rfc2l6ZTsKLSAgICAgICpwc2VjID0gc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZSBvbGQgc3ltYm9sIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoZSBuZXcgc3ltYm9sIGlzCi0gICAgIGEgZGVmaW5pdGlvbiB3aGljaCBpcyBub3QgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBuZXcKLSAgICAgc3ltYm9sIG92ZXJyaWRlcyB0aGUgb2xkIHN5bWJvbC4gIFN5bWJvbHMgZnJvbSByZWd1bGFyIGZpbGVzCi0gICAgIGFsd2F5cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBzeW1ib2xzIGZyb20gZHluYW1pYyBvYmplY3RzLCBldmVuIGlmCi0gICAgIHRoZXkgYXJlIGRlZmluZWQgYWZ0ZXIgdGhlIGR5bmFtaWMgb2JqZWN0IGluIHRoZSBsaW5rLgotCi0gICAgIEFzIGFib3ZlLCB3ZSBhZ2FpbiBwZXJtaXQgYSBjb21tb24gc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QgdG8KLSAgICAgb3ZlcnJpZGUgYSBkZWZpbml0aW9uIGluIGEgc2hhcmVkIG9iamVjdCBpZiB0aGUgc2hhcmVkIG9iamVjdAotICAgICBzeW1ib2wgaXMgYSBmdW5jdGlvbiBvciBpcyB3ZWFrLiAgKi8KLQotICBpZiAoISBuZXdkeW4KLSAgICAgICYmIChuZXdkZWYKLQkgIHx8IChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgIHx8IGgtPnR5cGUgPT0gU1RUX0ZVTkMpKSkKLSAgICAgICYmIG9sZGR5bgotICAgICAgJiYgb2xkZGVmCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgLyogQ2hhbmdlIHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIHVuZGVmaW5lZCwgYW5kIGxldAotCSBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCBkbyB0aGUgcmlnaHQgdGhpbmcgd2l0aCB0aGUKLQkgbmV3IGRlZmluaXRpb24uICAqLwotCi0gICAgICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0KLSAgICAgIG9sZGRlZiA9IGZhbHNlOwotICAgICAgb2xkZHluY29tbW9uID0gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIGFnYWluIHBlcm1pdCBhIHR5cGUgY2hhbmdlIHdoZW4gYSBjb21tb24gc3ltYm9sIG1heSBiZQotICAgICAgICAgb3ZlcnJpZGluZyBhIGZ1bmN0aW9uLiAgKi8KLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQkqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gICAgICAvKiBUaGlzIHVuaW9uIG1heSBoYXZlIGJlZW4gc2V0IHRvIGJlIG5vbi1OVUxMIHdoZW4gdGhpcyBzeW1ib2wKLQkgd2FzIHNlZW4gaW4gYSBkeW5hbWljIG9iamVjdC4gIFdlIG11c3QgZm9yY2UgdGhlIHVuaW9uIHRvIGJlCi0JIE5VTEwsIHNvIHRoYXQgaXQgaXMgY29ycmVjdCBmb3IgYSByZWd1bGFyIHN5bWJvbC4gICovCi0KLSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IE5VTEw7Ci0KLSAgICAgIC8qIEluIHRoaXMgc3BlY2lhbCBjYXNlLCBpZiBIIGlzIHRoZSB0YXJnZXQgb2YgYW4gaW5kaXJlY3Rpb24sCi0gICAgICAgICB3ZSB3YW50IHRoZSBjYWxsZXIgdG8gZnJvYiB3aXRoIEggcmF0aGVyIHRoYW4gd2l0aCB0aGUKLSAgICAgICAgIGluZGlyZWN0IHN5bWJvbC4gIFRoYXQgd2lsbCBwZXJtaXQgdGhlIGNhbGxlciB0byByZWRlZmluZSB0aGUKLSAgICAgICAgIHRhcmdldCBvZiB0aGUgaW5kaXJlY3Rpb24sIHJhdGhlciB0aGFuIHRoZSBpbmRpcmVjdCBzeW1ib2wKLSAgICAgICAgIGl0c2VsZi4gIEZJWE1FOiBUaGlzIHdpbGwgYnJlYWsgdGhlIC15IG9wdGlvbiBpZiB3ZSBzdG9yZSBhCi0gICAgICAgICBzeW1ib2wgd2l0aCBhIGRpZmZlcmVudCBuYW1lLiAgKi8KLSAgICAgICpzeW1faGFzaCA9IGg7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgbmV3IGNvbW1vbiBzeW1ib2wgbWVyZ2luZyB3aXRoIGFuCi0gICAgIG9sZCBzeW1ib2wgdGhhdCBsb29rcyBsaWtlIGl0IG1pZ2h0IGJlIGEgY29tbW9uIHN5bWJvbCBkZWZpbmVkIGluCi0gICAgIGEgc2hhcmVkIG9iamVjdC4gIE5vdGUgdGhhdCB3ZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGUgY2FzZSBpbgotICAgICB3aGljaCBhIG5ldyBjb21tb24gc3ltYm9sIHNob3VsZCBzaW1wbHkgb3ZlcnJpZGUgdGhlIGRlZmluaXRpb24KLSAgICAgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotICBpZiAoISBuZXdkeW4KLSAgICAgICYmIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKQotICAgICAgJiYgb2xkZHluY29tbW9uKQotICAgIHsKLSAgICAgIC8qIEl0IHdvdWxkIGJlIGJlc3QgaWYgd2UgY291bGQgc2V0IHRoZSBoYXNoIHRhYmxlIGVudHJ5IHRvIGEKLQkgY29tbW9uIHN5bWJvbCwgYnV0IHdlIGRvbid0IGtub3cgd2hhdCB0byB1c2UgZm9yIHRoZSBzZWN0aW9uCi0JIG9yIHRoZSBhbGlnbm1lbnQuICAqLwotICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JICAgICAoaW5mbywgaC0+cm9vdC5yb290LnN0cmluZywgb2xkYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwKLQkgICAgICBoLT5zaXplLCBhYmZkLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgc3ltLT5zdF9zaXplKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGUgcHJlZHVtZWQgY29tbW9uIHN5bWJvbCBpbiB0aGUgZHluYW1pYyBvYmplY3QgaXMKLSAgICAgICAgIGxhcmdlciwgcHJldGVuZCB0aGF0IHRoZSBuZXcgc3ltYm9sIGhhcyBpdHMgc2l6ZS4gICovCi0KLSAgICAgIGlmIChoLT5zaXplID4gKnB2YWx1ZSkKLQkqcHZhbHVlID0gaC0+c2l6ZTsKLQotICAgICAgLyogRklYTUU6IFdlIG5vIGxvbmdlciBrbm93IHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkgdGhlIHN5bWJvbAotCSBpbiB0aGUgZHluYW1pYyBvYmplY3QsIHNvIHdlIGp1c3Qgd2luZCB1cCB1c2luZyB0aGUgb25lIGZyb20KLQkgdGhlIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLQotICAgICAgb2xkZGVmID0gZmFsc2U7Ci0gICAgICBvbGRkeW5jb21tb24gPSBmYWxzZTsKLQotICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0gICAgICBoLT5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXI7Ci0KLSAgICAgICpzaXplX2NoYW5nZV9vayA9IHRydWU7Ci0gICAgICAqdHlwZV9jaGFuZ2Vfb2sgPSB0cnVlOwotCi0gICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBFTEYgb2JqZWN0IGZpbGUgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiAoKmFkZF9zeW1ib2xfaG9vaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgY29uc3QgRWxmX0ludGVybmFsX1N5bSAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKiosIGZsYWd3b3JkICosCi0JCQkJICAgICAgYXNlY3Rpb24gKiosIGJmZF92bWEgKikpOwotICBib29sZWFuICgqY2hlY2tfcmVsb2NzKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICBhc2VjdGlvbiAqLCBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqKSk7Ci0gIGJvb2xlYW4gY29sbGVjdDsKLSAgRWxmX0ludGVybmFsX1NoZHIgKmhkcjsKLSAgc2l6ZV90IHN5bWNvdW50OwotICBzaXplX3QgZXh0c3ltY291bnQ7Ci0gIHNpemVfdCBleHRzeW1vZmY7Ci0gIEVsZl9FeHRlcm5hbF9TeW0gKmJ1ZiA9IE5VTEw7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2g7Ci0gIGJvb2xlYW4gZHluYW1pYzsKLSAgYmZkX2J5dGUgKmR5bnZlciA9IE5VTEw7Ci0gIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmV4dHZlcnN5bSA9IE5VTEw7Ci0gIEVsZl9FeHRlcm5hbF9WZXJzeW0gKmV2ZXI7Ci0gIEVsZl9FeHRlcm5hbF9EeW4gKmR5bmJ1ZiA9IE5VTEw7Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrczsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bTsKLSAgRWxmX0V4dGVybmFsX1N5bSAqZXN5bWVuZDsKLQotICBhZGRfc3ltYm9sX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmVsZl9hZGRfc3ltYm9sX2hvb2s7Ci0gIGNvbGxlY3QgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3Q7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgZHluYW1pYyA9IGZhbHNlOwotICBlbHNlCi0gICAgewotICAgICAgZHluYW1pYyA9IHRydWU7Ci0KLSAgICAgIC8qIFlvdSBjYW4ndCB1c2UgLXIgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LiAgQWxzbywgdGhlcmUncyBubwotCSBob3BlIG9mIHVzaW5nIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggZG9lcyBub3QgZXhhY3RseSBtYXRjaAotCSB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlIHx8IGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBBcyBhIEdOVSBleHRlbnNpb24sIGFueSBpbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgbmFtZWQKLSAgICAgLmdudS53YXJuaW5nLlNZTUJPTCBhcmUgdHJlYXRlZCBhcyB3YXJuaW5nIHN5bWJvbHMgZm9yIHRoZSBnaXZlbgotICAgICBzeW1ib2wuICBUaGlzIGRpZmZlcnMgZnJvbSAuZ251Lndhcm5pbmcgc2VjdGlvbnMsIHdoaWNoIGdlbmVyYXRlCi0gICAgIHdhcm5pbmdzIHdoZW4gdGhleSBhcmUgaW5jbHVkZWQgaW4gYW4gb3V0cHV0IGZpbGUuICAqLwotICBpZiAoISBpbmZvLT5zaGFyZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgcyk7Ci0JICBpZiAoc3RybmNtcCAobmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMCkKLQkgICAgewotCSAgICAgIGNoYXIgKm1zZzsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHN6OwotCi0JICAgICAgbmFtZSArPSBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMTsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSBzaGFyZWQgb2JqZWN0LCB0aGVuIGxvb2sgdXAgdGhlIHN5bWJvbAotCQkgaW4gdGhlIGhhc2ggdGFibGUuICBJZiBpdCBpcyB0aGVyZSwgYW5kIGl0IGlzIGFscmVhZHkKLQkJIGJlZW4gZGVmaW5lZCwgdGhlbiB3ZSB3aWxsIG5vdCBiZSB1c2luZyB0aGUgZW50cnkKLQkJIGZyb20gdGhpcyBzaGFyZWQgb2JqZWN0LCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhcm4uCi0JCSBGSVhNRTogSWYgd2Ugc2VlIHRoZSBkZWZpbml0aW9uIGluIGEgcmVndWxhciBvYmplY3QKLQkJIGxhdGVyIG9uLCB3ZSB3aWxsIHdhcm4sIGJ1dCB3ZSBzaG91bGRuJ3QuICBUaGUgb25seQotCQkgZml4IGlzIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB3YXJuaW5ncyB3ZSBhcmUgc3VwcG9zZWQKLQkJIHRvIGVtaXQsIGFuZCB0aGVuIGhhbmRsZSB0aGVtIGFsbCBhdCB0aGUgZW5kIG9mIHRoZQotCQkgbGluay4gICovCi0JICAgICAgaWYgKGR5bmFtaWMgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotCQl7Ci0JCSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkJICBoID0gZWxmX2xpbmtfaGFzaF9sb29rdXAgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgbmFtZSwKLQkJCQkJICAgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLQkJICAvKiBGSVhNRTogV2hhdCBhYm91dCBiZmRfbGlua19oYXNoX2NvbW1vbj8gICovCi0JCSAgaWYgKGggIT0gTlVMTAotCQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpc3N1ZSB0aGlzIHdhcm5pbmcuICBDbG9iYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlY3Rpb24gc2l6ZSBzbyB0aGF0IHRoZSB3YXJuaW5nIGRvZXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0JCSAgICAgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHMpOwotCSAgICAgIG1zZyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3ogKyAxKTsKLQkgICAgICBpZiAobXNnID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIG1zZ1tzel0gPSAnXDAnOwotCi0JICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAgICAgKGluZm8sIGFiZmQsIG5hbWUsIEJTRl9XQVJOSU5HLCBzLCAoYmZkX3ZtYSkgMCwgbXNnLAotCQkgICAgICBmYWxzZSwgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBOVUxMKSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotCQl7Ci0JCSAgLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplIHNvIHRoYXQgdGhlIHdhcm5pbmcgZG9lcwotICAgICAgICAgICAgICAgICAgICAgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCQkgIHMtPl9yYXdfc2l6ZSA9IDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgb2JqZWN0LCB3ZSBhbHdheXMgbGluayBhZ2FpbnN0IHRoZSAuZHluc3ltCi0gICAgIHN5bWJvbCB0YWJsZSwgbm90IHRoZSAuc3ltdGFiIHN5bWJvbCB0YWJsZS4gIFRoZSBkeW5hbWljIGxpbmtlcgotICAgICB3aWxsIG9ubHkgc2VlIHRoZSAuZHluc3ltIHN5bWJvbCB0YWJsZSwgc28gdGhlcmUgaXMgbm8gcmVhc29uIHRvCi0gICAgIGxvb2sgYXQgLnN5bXRhYiBmb3IgYSBkeW5hbWljIG9iamVjdC4gICovCi0KLSAgaWYgKCEgZHluYW1pYyB8fCBlbGZfZHluc3ltdGFiIChhYmZkKSA9PSAwKQotICAgIGhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyOwotICBlbHNlCi0gICAgaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPmR5bnN5bXRhYl9oZHI7Ci0KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgLyogUmVhZCBpbiBhbnkgdmVyc2lvbiBkZWZpbml0aW9ucy4gICovCi0KLSAgICAgIGlmICghIF9iZmRfZWxmX3NsdXJwX3ZlcnNpb25fdGFibGVzIChhYmZkKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogUmVhZCBpbiB0aGUgc3ltYm9sIHZlcnNpb25zLCBidXQgZG9uJ3QgYm90aGVyIHRvIGNvbnZlcnQgdGhlbQotICAgICAgICAgdG8gaW50ZXJuYWwgZm9ybWF0LiAgKi8KLSAgICAgIGlmIChlbGZfZHludmVyc3ltIChhYmZkKSAhPSAwKQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TaGRyICp2ZXJzeW1oZHI7Ci0KLQkgIHZlcnN5bWhkciA9ICZlbGZfdGRhdGEgKGFiZmQpLT5keW52ZXJzeW1faGRyOwotCSAgZXh0dmVyc3ltID0gKEVsZl9FeHRlcm5hbF9WZXJzeW0gKikgYmZkX21hbGxvYyAoaGRyLT5zaF9zaXplKTsKLQkgIGlmIChleHR2ZXJzeW0gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIHZlcnN5bWhkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgICAgIHx8IChiZmRfcmVhZCAoKFBUUikgZXh0dmVyc3ltLCAxLCB2ZXJzeW1oZHItPnNoX3NpemUsIGFiZmQpCi0JCSAgIT0gdmVyc3ltaGRyLT5zaF9zaXplKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICBzeW1jb3VudCA9IGhkci0+c2hfc2l6ZSAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0KLSAgLyogVGhlIHNoX2luZm8gZmllbGQgb2YgdGhlIHN5bXRhYiBoZWFkZXIgdGVsbHMgdXMgd2hlcmUgdGhlCi0gICAgIGV4dGVybmFsIHN5bWJvbHMgc3RhcnQuICBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBsb2NhbCBzeW1ib2xzIGF0Ci0gICAgIHRoaXMgcG9pbnQuICAqLwotICBpZiAoZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIHsKLSAgICAgIGV4dHN5bWNvdW50ID0gc3ltY291bnQ7Ci0gICAgICBleHRzeW1vZmYgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dHN5bWNvdW50ID0gc3ltY291bnQgLSBoZHItPnNoX2luZm87Ci0gICAgICBleHRzeW1vZmYgPSBoZHItPnNoX2luZm87Ci0gICAgfQotCi0gIGJ1ZiA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQotCSBiZmRfbWFsbG9jIChleHRzeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgaWYgKGJ1ZiA9PSBOVUxMICYmIGV4dHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2Ugc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBoYXNoIHRhYmxlIGVudHJ5IGZvciBlYWNoIGV4dGVybmFsCi0gICAgIHN5bWJvbC4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgZXh0c3ltY291bnQgKiBzaXplb2YgKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBlbGZfc3ltX2hhc2hlcyAoYWJmZCkgPSBzeW1faGFzaDsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCBjcmVhdGUgYWxsIHRoZSBkeW5hbWljCi0gICAgICAgICBzZWN0aW9ucyBpbW1lZGlhdGVseS4gIFdlIG5lZWQgdG8gYXR0YWNoIHRoZW0gdG8gc29tZXRoaW5nLAotICAgICAgICAgc28gd2UgYXR0YWNoIHRoZW0gdG8gdGhpcyBCRkQsIHByb3ZpZGVkIGl0IGlzIHRoZSByaWdodAotICAgICAgICAgZm9ybWF0LiAgRklYTUU6IElmIHRoZXJlIGFyZSBubyBpbnB1dCBCRkQncyBvZiB0aGUgc2FtZQotICAgICAgICAgZm9ybWF0IGFzIHRoZSBvdXRwdXQsIHdlIGNhbid0IG1ha2UgYSBzaGFyZWQgbGlicmFyeS4gICovCi0gICAgICBpZiAoaW5mby0+c2hhcmVkCi0JICAmJiAhIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkCi0JICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0JewotCSAgaWYgKCEgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBib29sZWFuIGFkZF9uZWVkZWQ7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgYmZkX3NpemVfdHlwZSBvbGRzaXplOwotICAgICAgYmZkX3NpemVfdHlwZSBzdHJpbmRleDsKLQotICAgICAgLyogRmluZCB0aGUgbmFtZSB0byB1c2UgaW4gYSBEVF9ORUVERUQgZW50cnkgdGhhdCByZWZlcnMgdG8gdGhpcwotCSBvYmplY3QuICBJZiB0aGUgb2JqZWN0IGhhcyBhIERUX1NPTkFNRSBlbnRyeSwgd2UgdXNlIGl0LgotCSBPdGhlcndpc2UsIGlmIHRoZSBnZW5lcmljIGxpbmtlciBzdHVjayBzb21ldGhpbmcgaW4KLQkgZWxmX2R0X25hbWUsIHdlIHVzZSB0aGF0LiAgT3RoZXJ3aXNlLCB3ZSBqdXN0IHVzZSB0aGUgZmlsZQotCSBuYW1lLiAgSWYgdGhlIGdlbmVyaWMgbGlua2VyIHB1dCBhIG51bGwgc3RyaW5nIGludG8KLQkgZWxmX2R0X25hbWUsIHdlIGRvbid0IG1ha2UgYSBEVF9ORUVERUQgZW50cnkgYXQgYWxsLCBldmVuIGlmCi0JIHRoZXJlIGlzIGEgRFRfU09OQU1FIGVudHJ5LiAgKi8KLSAgICAgIGFkZF9uZWVkZWQgPSB0cnVlOwotICAgICAgbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgaWYgKGVsZl9kdF9uYW1lIChhYmZkKSAhPSBOVUxMKQotCXsKLQkgIG5hbWUgPSBlbGZfZHRfbmFtZSAoYWJmZCk7Ci0JICBpZiAoKm5hbWUgPT0gJ1wwJykKLQkgICAgYWRkX25lZWRlZCA9IGZhbHNlOwotCX0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5keW5hbWljIik7Ci0gICAgICBpZiAocyAhPSBOVUxMKQotCXsKLQkgIEVsZl9FeHRlcm5hbF9EeW4gKmV4dGR5bjsKLQkgIEVsZl9FeHRlcm5hbF9EeW4gKmV4dGR5bmVuZDsKLQkgIGludCBlbGZzZWM7Ci0JICB1bnNpZ25lZCBsb25nIGxpbms7Ci0KLQkgIGR5bmJ1ZiA9IChFbGZfRXh0ZXJuYWxfRHluICopIGJmZF9tYWxsb2MgKChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0JICBpZiAoZHluYnVmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIChQVFIpIGR5bmJ1ZiwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIHMtPl9yYXdfc2l6ZSkpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBlbGZzZWMgPSBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGFiZmQsIHMpOwotCSAgaWYgKGVsZnNlYyA9PSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBsaW5rID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtlbGZzZWNdLT5zaF9saW5rOwotCi0JICBleHRkeW4gPSBkeW5idWY7Ci0JICBleHRkeW5lbmQgPSBleHRkeW4gKyBzLT5fcmF3X3NpemUgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9EeW4pOwotCSAgZm9yICg7IGV4dGR5biA8IGV4dGR5bmVuZDsgZXh0ZHluKyspCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQotCSAgICAgIGVsZl9zd2FwX2R5bl9pbiAoYWJmZCwgZXh0ZHluLCAmZHluKTsKLQkgICAgICBpZiAoZHluLmRfdGFnID09IERUX1NPTkFNRSkKLQkJewotCQkgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAotCQkJCQkJCSAgZHluLmRfdW4uZF92YWwpOwotCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfTkVFREVEKQotCQl7Ci0JCSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuLCAqKnBuOwotCQkgIGNoYXIgKmZubSwgKmFubTsKLQotCQkgIG4gPSAoKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqKQotCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCkpKTsKLQkJICBmbm0gPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBsaW5rLAotCQkJCQkJCSBkeW4uZF91bi5kX3ZhbCk7Ci0JCSAgaWYgKG4gPT0gTlVMTCB8fCBmbm0gPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGFubSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChmbm0pICsgMSk7Ci0JCSAgaWYgKGFubSA9PSBOVUxMKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3RyY3B5IChhbm0sIGZubSk7Ci0JCSAgbi0+bmFtZSA9IGFubTsKLQkJICBuLT5ieSA9IGFiZmQ7Ci0JCSAgbi0+bmV4dCA9IE5VTEw7Ci0JCSAgZm9yIChwbiA9ICZlbGZfaGFzaF90YWJsZSAoaW5mbyktPm5lZWRlZDsKLQkJICAgICAgICpwbiAhPSBOVUxMOwotCQkgICAgICAgcG4gPSAmKCpwbiktPm5leHQpCi0JCSAgICA7Ci0JCSAgKnBuID0gbjsKLQkJfQotCSAgICB9Ci0KLQkgIGZyZWUgKGR5bmJ1Zik7Ci0JICBkeW5idWYgPSBOVUxMOwotCX0KLQotICAgICAgLyogV2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSBhbnkgb2YgdGhlIHNlY3Rpb25zIGluIGEgZHluYW1pYwotCSBvYmplY3QgaW4gdGhlIG91dHB1dCBmaWxlLiAgV2UgaGFjayBieSBzaW1wbHkgY2xvYmJlcmluZyB0aGUKLQkgbGlzdCBvZiBzZWN0aW9ucyBpbiB0aGUgQkZELiAgVGhpcyBjb3VsZCBiZSBoYW5kbGVkIG1vcmUKLQkgY2xlYW5seSBieSwgc2F5LCBhIG5ldyBzZWN0aW9uIGZsYWc7IHRoZSBleGlzdGluZwotCSBTRUNfTkVWRVJfTE9BRCBmbGFnIGlzIG5vdCB0aGUgb25lIHdlIHdhbnQsIGJlY2F1c2UgdGhhdCBvbmUKLQkgc3RpbGwgaW1wbGllcyB0aGF0IHRoZSBzZWN0aW9uIHRha2VzIHVwIHNwYWNlIGluIHRoZSBvdXRwdXQKLQkgZmlsZS4gICovCi0gICAgICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0gICAgICBhYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLQotICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgZHluYW1pYyBvYmplY3QgZm91bmQgaW4gdGhlIGxpbmssIGNyZWF0ZQotCSB0aGUgc3BlY2lhbCBzZWN0aW9ucyByZXF1aXJlZCBmb3IgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgICAgIGlmICghIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotCXsKLQkgIGlmICghIGVsZl9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpZiAoYWRkX25lZWRlZCkKLQl7Ci0JICAvKiBBZGQgYSBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZHluYW1pYyBvYmplY3QuICAqLwotCSAgb2xkc2l6ZSA9IF9iZmRfc3RyaW5ndGFiX3NpemUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyKTsKLQkgIHN0cmluZGV4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwgbmFtZSwKLQkJCQkJIHRydWUsIGZhbHNlKTsKLQkgIGlmIChzdHJpbmRleCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAob2xkc2l6ZSA9PSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cikpCi0JICAgIHsKLQkgICAgICBhc2VjdGlvbiAqc2R5bjsKLQkgICAgICBFbGZfRXh0ZXJuYWxfRHluICpkeW5jb24sICpkeW5jb25lbmQ7Ci0KLQkgICAgICAvKiBUaGUgaGFzaCB0YWJsZSBzaXplIGRpZCBub3QgY2hhbmdlLCB3aGljaCBtZWFucyB0aGF0Ci0JCSB0aGUgZHluYW1pYyBvYmplY3QgbmFtZSB3YXMgYWxyZWFkeSBlbnRlcmVkLiAgSWYgd2UKLQkJIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCB0aGlzIGR5bmFtaWMgb2JqZWN0IGluIHRoZQotCQkgbGluaywganVzdCBpZ25vcmUgaXQuICBUaGVyZSBpcyBubyByZWFzb24gdG8gaW5jbHVkZQotCQkgYSBwYXJ0aWN1bGFyIGR5bmFtaWMgb2JqZWN0IG1vcmUgdGhhbiBvbmNlLiAgKi8KLQkgICAgICBzZHluID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJCQkgICAgICAiLmR5bmFtaWMiKTsKLQkgICAgICBCRkRfQVNTRVJUIChzZHluICE9IE5VTEwpOwotCi0JICAgICAgZHluY29uID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgc2R5bi0+Y29udGVudHM7Ci0JICAgICAgZHluY29uZW5kID0gKEVsZl9FeHRlcm5hbF9EeW4gKikgKHNkeW4tPmNvbnRlbnRzICsKLQkJCQkJCXNkeW4tPl9yYXdfc2l6ZSk7Ci0JICAgICAgZm9yICg7IGR5bmNvbiA8IGR5bmNvbmVuZDsgZHluY29uKyspCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQotCQkgIGVsZl9zd2FwX2R5bl9pbiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIGR5bmNvbiwKLQkJCQkgICAmZHluKTsKLQkJICBpZiAoZHluLmRfdGFnID09IERUX05FRURFRAotCQkgICAgICAmJiBkeW4uZF91bi5kX3ZhbCA9PSBzdHJpbmRleCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGJ1ZiAhPSBOVUxMKQotCQkJZnJlZSAoYnVmKTsKLQkJICAgICAgaWYgKGV4dHZlcnN5bSAhPSBOVUxMKQotCQkJZnJlZSAoZXh0dmVyc3ltKTsKLQkJICAgICAgcmV0dXJuIHRydWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX05FRURFRCwgc3RyaW5kZXgpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0KLSAgICAgIC8qIFNhdmUgdGhlIFNPTkFNRSwgaWYgdGhlcmUgaXMgb25lLCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUKLSAgICAgICAgIGxpbmtlciBlbXVsYXRpb24gY29kZSB3aWxsIG5lZWQgdG8ga25vdyBpdC4gICovCi0gICAgICBpZiAoKm5hbWUgPT0gJ1wwJykKLQluYW1lID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gICAgICBlbGZfZHRfbmFtZSAoYWJmZCkgPSBuYW1lOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCWhkci0+c2hfb2Zmc2V0ICsgZXh0c3ltb2ZmICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwKLQkJU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoKFBUUikgYnVmLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLCBleHRzeW1jb3VudCwgYWJmZCkKLQkgICE9IGV4dHN5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgd2Vha3MgPSBOVUxMOwotCi0gIGV2ZXIgPSBleHR2ZXJzeW0gIT0gTlVMTCA/IGV4dHZlcnN5bSArIGV4dHN5bW9mZiA6IE5VTEw7Ci0gIGVzeW1lbmQgPSBidWYgKyBleHRzeW1jb3VudDsKLSAgZm9yIChlc3ltID0gYnVmOwotICAgICAgIGVzeW0gPCBlc3ltZW5kOwotICAgICAgIGVzeW0rKywgc3ltX2hhc2grKywgZXZlciA9IChldmVyICE9IE5VTEwgPyBldmVyICsgMSA6IE5VTEwpKQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gc3ltOwotICAgICAgaW50IGJpbmQ7Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYm9vbGVhbiBkZWZpbml0aW9uOwotICAgICAgYm9vbGVhbiBzaXplX2NoYW5nZV9vaywgdHlwZV9jaGFuZ2Vfb2s7Ci0gICAgICBib29sZWFuIG5ld193ZWFrZGVmOwotICAgICAgdW5zaWduZWQgaW50IG9sZF9hbGlnbm1lbnQ7Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoYWJmZCwgZXN5bSwgJnN5bSk7Ci0KLSAgICAgIGZsYWdzID0gQlNGX05PX0ZMQUdTOwotICAgICAgc2VjID0gTlVMTDsKLSAgICAgIHZhbHVlID0gc3ltLnN0X3ZhbHVlOwotICAgICAgKnN5bV9oYXNoID0gTlVMTDsKLQotICAgICAgYmluZCA9IEVMRl9TVF9CSU5EIChzeW0uc3RfaW5mbyk7Ci0gICAgICBpZiAoYmluZCA9PSBTVEJfTE9DQUwpCi0JewotCSAgLyogVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZSwgc2luY2UgRUxGIHJlcXVpcmVzIHRoYXQgYWxsCi0JICAgICBnbG9iYWwgc3ltYm9scyBmb2xsb3cgYWxsIGxvY2FsIHN5bWJvbHMsIGFuZCB0aGF0IHNoX2luZm8KLQkgICAgIHBvaW50IHRvIHRoZSBmaXJzdCBnbG9iYWwgc3ltYm9sLiAgVW5mb3J0dW5hdGVhbHksIElyaXggNQotCSAgICAgc2NyZXdzIHRoaXMgdXAuICAqLwotCSAgY29udGludWU7Ci0JfQotICAgICAgZWxzZSBpZiAoYmluZCA9PSBTVEJfR0xPQkFMKQotCXsKLQkgIGlmIChzeW0uc3Rfc2huZHggIT0gU0hOX1VOREVGCi0JICAgICAgJiYgc3ltLnN0X3NobmR4ICE9IFNITl9DT01NT04pCi0JICAgIGZsYWdzID0gQlNGX0dMT0JBTDsKLQkgIGVsc2UKLQkgICAgZmxhZ3MgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGJpbmQgPT0gU1RCX1dFQUspCi0JZmxhZ3MgPSBCU0ZfV0VBSzsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBMZWF2ZSBpdCB1cCB0byB0aGUgcHJvY2Vzc29yIGJhY2tlbmQuICAqLwotCX0KLQotICAgICAgaWYgKHN5bS5zdF9zaG5keCA9PSBTSE5fVU5ERUYpCi0Jc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UgaWYgKHN5bS5zdF9zaG5keCA+IDAgJiYgc3ltLnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQl7Ci0JICBzZWMgPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBzeW0uc3Rfc2huZHgpOwotCSAgaWYgKHNlYyA9PSBOVUxMKQotCSAgICBzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgZWxzZSBpZiAoKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKSAhPSAwKQotCSAgICB2YWx1ZSAtPSBzZWMtPnZtYTsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX0FCUykKLQlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04pCi0JewotCSAgc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIC8qIFdoYXQgRUxGIGNhbGxzIHRoZSBzaXplIHdlIGNhbGwgdGhlIHZhbHVlLiAgV2hhdCBFTEYKLQkgICAgIGNhbGxzIHRoZSB2YWx1ZSB3ZSBjYWxsIHRoZSBhbGlnbm1lbnQuICAqLwotCSAgdmFsdWUgPSBzeW0uc3Rfc2l6ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTGVhdmUgaXQgdXAgdG8gdGhlIHByb2Nlc3NvciBiYWNrZW5kLiAgKi8KLQl9Ci0KLSAgICAgIG5hbWUgPSBiZmRfZWxmX3N0cmluZ19mcm9tX2VsZl9zZWN0aW9uIChhYmZkLCBoZHItPnNoX2xpbmssIHN5bS5zdF9uYW1lKTsKLSAgICAgIGlmIChuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sX2hvb2spCi0JewotCSAgaWYgKCEgKCphZGRfc3ltYm9sX2hvb2spIChhYmZkLCBpbmZvLCAmc3ltLCAmbmFtZSwgJmZsYWdzLCAmc2VjLAotCQkJCSAgICAmdmFsdWUpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogVGhlIGhvb2sgZnVuY3Rpb24gc2V0cyB0aGUgbmFtZSB0byBOVUxMIGlmIHRoaXMgc3ltYm9sCi0JICAgICBzaG91bGQgYmUgc2tpcHBlZCBmb3Igc29tZSByZWFzb24uICAqLwotCSAgaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBTYW5pdHkgY2hlY2sgdGhhdCBhbGwgcG9zc2liaWxpdGllcyB3ZXJlIGhhbmRsZWQuICAqLwotICAgICAgaWYgKHNlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjKQotCSAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWMpKQotCWRlZmluaXRpb24gPSBmYWxzZTsKLSAgICAgIGVsc2UKLQlkZWZpbml0aW9uID0gdHJ1ZTsKLQotICAgICAgc2l6ZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLSAgICAgIHR5cGVfY2hhbmdlX29rID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpLT50eXBlX2NoYW5nZV9vazsKLSAgICAgIG9sZF9hbGlnbm1lbnQgPSAwOwotICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBFbGZfSW50ZXJuYWxfVmVyc3ltIGl2ZXI7Ci0JICB1bnNpZ25lZCBpbnQgdmVybnVtID0gMDsKLQkgIGJvb2xlYW4gb3ZlcnJpZGU7Ci0KLQkgIGlmIChldmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcnN5bV9pbiAoYWJmZCwgZXZlciwgJml2ZXIpOwotCSAgICAgIHZlcm51bSA9IGl2ZXIudnNfdmVycyAmIFZFUlNZTV9WRVJTSU9OOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIGhpZGRlbiBzeW1ib2wsIG9yIGlmIGl0IGlzIG5vdCB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgIDEsIHdlIGFwcGVuZCB0aGUgdmVyc2lvbiBuYW1lIHRvIHRoZSBzeW1ib2wgbmFtZS4KLSAgICAgICAgICAgICAgICAgSG93ZXZlciwgd2UgZG8gbm90IG1vZGlmeSBhIG5vbi1oaWRkZW4gYWJzb2x1dGUKLSAgICAgICAgICAgICAgICAgc3ltYm9sLCBiZWNhdXNlIGl0IG1pZ2h0IGJlIHRoZSB2ZXJzaW9uIHN5bWJvbAotICAgICAgICAgICAgICAgICBpdHNlbGYuICBGSVhNRTogV2hhdCBpZiBpdCBpc24ndD8gICovCi0JICAgICAgaWYgKChpdmVyLnZzX3ZlcnMgJiBWRVJTWU1fSElEREVOKSAhPSAwCi0JCSAgfHwgKHZlcm51bSA+IDEgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqdmVyc3RyOwotCQkgIGludCBuYW1lbGVuLCBuZXdsZW47Ci0JCSAgY2hhciAqbmV3bmFtZSwgKnA7Ci0KLQkJICBpZiAoc3ltLnN0X3NobmR4ICE9IFNITl9VTkRFRikKLQkJICAgIHsKLQkJICAgICAgaWYgKHZlcm51bSA+IGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9oZHIuc2hfaW5mbykKLQkJCXsKLQkJCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgICAgKF8oIiVzOiAlczogaW52YWxpZCB2ZXJzaW9uICV1IChtYXggJWQpIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCB2ZXJudW0sCi0JCQkgICAgIGVsZl90ZGF0YSAoYWJmZCktPmR5bnZlcmRlZl9oZHIuc2hfaW5mbyk7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAodmVybnVtID4gMSkKLQkJCXZlcnN0ciA9Ci0JCQkgIGVsZl90ZGF0YSAoYWJmZCktPnZlcmRlZlt2ZXJudW0gLSAxXS52ZF9ub2RlbmFtZTsKLQkJICAgICAgZWxzZQotCQkJdmVyc3RyID0gIiI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBXZSBjYW5ub3Qgc2ltcGx5IHRlc3QgZm9yIHRoZSBudW1iZXIgb2YKLQkJCSBlbnRyaWVzIGluIHRoZSBWRVJORUVEIHNlY3Rpb24gc2luY2UgdGhlCi0JCQkgbnVtYmVycyBmb3IgdGhlIG5lZWRlZCB2ZXJzaW9ucyBkbyBub3Qgc3RhcnQKLQkJCSBhdCAwLiAgKi8KLQkJICAgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7Ci0KLQkJICAgICAgdmVyc3RyID0gTlVMTDsKLQkJICAgICAgZm9yICh0ID0gZWxmX3RkYXRhIChhYmZkKS0+dmVycmVmOwotCQkJICAgdCAhPSBOVUxMOwotCQkJICAgdCA9IHQtPnZuX25leHRyZWYpCi0JCQl7Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0JCQkgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JCQkgICAgewotCQkJICAgICAgaWYgKGEtPnZuYV9vdGhlciA9PSB2ZXJudW0pCi0JCQkJewotCQkJCSAgdmVyc3RyID0gYS0+dm5hX25vZGVuYW1lOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCQkJICAgIH0KLQkJCSAgaWYgKGEgIT0gTlVMTCkKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgICAgaWYgKHZlcnN0ciA9PSBOVUxMKQotCQkJewotCQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgICAoXygiJXM6ICVzOiBpbnZhbGlkIG5lZWRlZCB2ZXJzaW9uICVkIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCB2ZXJudW0pOwotCQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBuYW1lbGVuID0gc3RybGVuIChuYW1lKTsKLQkJICBuZXdsZW4gPSBuYW1lbGVuICsgc3RybGVuICh2ZXJzdHIpICsgMjsKLQkJICBpZiAoKGl2ZXIudnNfdmVycyAmIFZFUlNZTV9ISURERU4pID09IDApCi0JCSAgICArK25ld2xlbjsKLQotCQkgIG5ld25hbWUgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIG5ld2xlbik7Ci0JCSAgaWYgKG5ld25hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cmNweSAobmV3bmFtZSwgbmFtZSk7Ci0JCSAgcCA9IG5ld25hbWUgKyBuYW1lbGVuOwotCQkgICpwKysgPSBFTEZfVkVSX0NIUjsKLQkJICBpZiAoKGl2ZXIudnNfdmVycyAmIFZFUlNZTV9ISURERU4pID09IDApCi0JCSAgICAqcCsrID0gRUxGX1ZFUl9DSFI7Ci0JCSAgc3RyY3B5IChwLCB2ZXJzdHIpOwotCi0JCSAgbmFtZSA9IG5ld25hbWU7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoISBlbGZfbWVyZ2Vfc3ltYm9sIChhYmZkLCBpbmZvLCBuYW1lLCAmc3ltLCAmc2VjLCAmdmFsdWUsCi0JCQkJICBzeW1faGFzaCwgJm92ZXJyaWRlLCAmdHlwZV9jaGFuZ2Vfb2ssCi0JCQkJICAmc2l6ZV9jaGFuZ2Vfb2spKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG92ZXJyaWRlKQotCSAgICBkZWZpbml0aW9uID0gZmFsc2U7Ci0KLQkgIGggPSAqc3ltX2hhc2g7Ci0JICB3aGlsZSAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JICAgIGggPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaC0+cm9vdC51LmkubGluazsKLQotCSAgLyogUmVtZW1iZXIgdGhlIG9sZCBhbGlnbm1lbnQgaWYgdGhpcyBpcyBhIGNvbW1vbiBzeW1ib2wsIHNvCi0gICAgICAgICAgICAgdGhhdCB3ZSBkb24ndCByZWR1Y2UgdGhlIGFsaWdubWVudCBsYXRlciBvbi4gIFdlIGNhbid0Ci0gICAgICAgICAgICAgY2hlY2sgbGF0ZXIsIGJlY2F1c2UgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLSAgICAgICAgICAgICB3aWxsIHNldCBhIGRlZmF1bHQgZm9yIHRoZSBhbGlnbm1lbnQgd2hpY2ggd2Ugd2FudCB0bwotICAgICAgICAgICAgIG92ZXJyaWRlLiAgKi8KLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JICAgIG9sZF9hbGlnbm1lbnQgPSBoLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLQkgIGlmIChlbGZfdGRhdGEgKGFiZmQpLT52ZXJkZWYgIT0gTlVMTAotCSAgICAgICYmICEgb3ZlcnJpZGUKLQkgICAgICAmJiB2ZXJudW0gPiAxCi0JICAgICAgJiYgZGVmaW5pdGlvbikKLQkgICAgaC0+dmVyaW5mby52ZXJkZWYgPSAmZWxmX3RkYXRhIChhYmZkKS0+dmVyZGVmW3Zlcm51bSAtIDFdOwotCX0KLQotICAgICAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JICAgICAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlYywgdmFsdWUsIChjb25zdCBjaGFyICopIE5VTEwsCi0JICAgICAgZmFsc2UsIGNvbGxlY3QsIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgc3ltX2hhc2gpKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgaCA9ICpzeW1faGFzaDsKLSAgICAgIHdoaWxlIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdAotCSAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfd2FybmluZykKLQloID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbms7Ci0gICAgICAqc3ltX2hhc2ggPSBoOwotCi0gICAgICBuZXdfd2Vha2RlZiA9IGZhbHNlOwotICAgICAgaWYgKGR5bmFtaWMKLQkgICYmIGRlZmluaXRpb24KLQkgICYmIChmbGFncyAmIEJTRl9XRUFLKSAhPSAwCi0JICAmJiBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pICE9IFNUVF9GVU5DCi0JICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkgICYmIGgtPndlYWtkZWYgPT0gTlVMTCkKLQl7Ci0JICAvKiBLZWVwIGEgbGlzdCBvZiBhbGwgd2VhayBkZWZpbmVkIG5vbiBmdW5jdGlvbiBzeW1ib2xzIGZyb20KLQkgICAgIGEgZHluYW1pYyBvYmplY3QsIHVzaW5nIHRoZSB3ZWFrZGVmIGZpZWxkLiAgTGF0ZXIgaW4gdGhpcwotCSAgICAgZnVuY3Rpb24gd2Ugd2lsbCBzZXQgdGhlIHdlYWtkZWYgZmllbGQgdG8gdGhlIGNvcnJlY3QKLQkgICAgIHZhbHVlLiAgV2Ugb25seSBwdXQgbm9uLWZ1bmN0aW9uIHN5bWJvbHMgZnJvbSBkeW5hbWljCi0JICAgICBvYmplY3RzIG9uIHRoaXMgbGlzdCwgYmVjYXVzZSB0aGF0IGhhcHBlbnMgdG8gYmUgdGhlIG9ubHkKLQkgICAgIHRpbWUgd2UgbmVlZCB0byBrbm93IHRoZSBub3JtYWwgc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gYQotCSAgICAgd2VhayBzeW1ib2wsIGFuZCB0aGUgaW5mb3JtYXRpb24gaXMgdGltZSBjb25zdW1pbmcgdG8KLQkgICAgIGZpZ3VyZSBvdXQuICBJZiB0aGUgd2Vha2RlZiBmaWVsZCBpcyBub3QgYWxyZWFkeSBOVUxMLAotCSAgICAgdGhlbiB0aGlzIHN5bWJvbCB3YXMgYWxyZWFkeSBkZWZpbmVkIGJ5IHNvbWUgcHJldmlvdXMKLQkgICAgIGR5bmFtaWMgb2JqZWN0LCBhbmQgd2Ugd2lsbCBiZSB1c2luZyB0aGF0IHByZXZpb3VzCi0JICAgICBkZWZpbml0aW9uIGFueWhvdy4gICovCi0KLQkgIGgtPndlYWtkZWYgPSB3ZWFrczsKLQkgIHdlYWtzID0gaDsKLQkgIG5ld193ZWFrZGVmID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFNldCB0aGUgYWxpZ25tZW50IG9mIGEgY29tbW9uIHN5bWJvbC4gICovCi0gICAgICBpZiAoc3ltLnN0X3NobmR4ID09IFNITl9DT01NT04KLQkgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQl7Ci0JICB1bnNpZ25lZCBpbnQgYWxpZ247Ci0KLQkgIGFsaWduID0gYmZkX2xvZzIgKHN5bS5zdF92YWx1ZSk7Ci0JICBpZiAoYWxpZ24gPiBvbGRfYWxpZ25tZW50KQotCSAgICBoLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBhbGlnbjsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgaW50IG9sZF9mbGFnczsKLQkgIGJvb2xlYW4gZHluc3ltOwotCSAgaW50IG5ld19mbGFnOwotCi0JICAvKiBSZW1lbWJlciB0aGUgc3ltYm9sIHNpemUgYW5kIHR5cGUuICAqLwotCSAgaWYgKHN5bS5zdF9zaXplICE9IDAKLQkgICAgICAmJiAoZGVmaW5pdGlvbiB8fCBoLT5zaXplID09IDApKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnNpemUgIT0gMCAmJiBoLT5zaXplICE9IHN5bS5zdF9zaXplICYmICEgc2l6ZV9jaGFuZ2Vfb2spCi0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCJXYXJuaW5nOiBzaXplIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlbHUgdG8gJWx1IGluICVzIiksCi0JCSAgIG5hbWUsICh1bnNpZ25lZCBsb25nKSBoLT5zaXplLCAodW5zaWduZWQgbG9uZykgc3ltLnN0X3NpemUsCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotCSAgICAgIGgtPnNpemUgPSBzeW0uc3Rfc2l6ZTsKLQkgICAgfQotCi0JICAvKiBJZiB0aGlzIGlzIGEgY29tbW9uIHN5bWJvbCwgdGhlbiB3ZSBhbHdheXMgd2FudCBILT5TSVpFCi0gICAgICAgICAgICAgdG8gYmUgdGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuICBUaGUgY29kZSBqdXN0IGFib3ZlCi0gICAgICAgICAgICAgd29uJ3QgZml4IHRoZSBzaXplIGlmIGEgY29tbW9uIHN5bWJvbCBiZWNvbWVzIGxhcmdlci4gIFdlCi0gICAgICAgICAgICAgZG9uJ3Qgd2FybiBhYm91dCBhIHNpemUgY2hhbmdlIGhlcmUsIGJlY2F1c2UgdGhhdCBpcwotICAgICAgICAgICAgIGNvdmVyZWQgYnkgLS13YXJuLWNvbW1vbi4gICovCi0JICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICBoLT5zaXplID0gaC0+cm9vdC51LmMuc2l6ZTsKLQotCSAgaWYgKEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbykgIT0gU1RUX05PVFlQRQotCSAgICAgICYmIChkZWZpbml0aW9uIHx8IGgtPnR5cGUgPT0gU1RUX05PVFlQRSkpCi0JICAgIHsKLQkgICAgICBpZiAoaC0+dHlwZSAhPSBTVFRfTk9UWVBFCi0JCSAgJiYgaC0+dHlwZSAhPSBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pCi0JCSAgJiYgISB0eXBlX2NoYW5nZV9vaykKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIldhcm5pbmc6IHR5cGUgb2Ygc3ltYm9sIGAlcycgY2hhbmdlZCBmcm9tICVkIHRvICVkIGluICVzIiksCi0JCSAgIG5hbWUsIGgtPnR5cGUsIEVMRl9TVF9UWVBFIChzeW0uc3RfaW5mbyksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotCSAgICAgIGgtPnR5cGUgPSBFTEZfU1RfVFlQRSAoc3ltLnN0X2luZm8pOwotCSAgICB9Ci0KLQkgIGlmIChzeW0uc3Rfb3RoZXIgIT0gMAotCSAgICAgICYmIChkZWZpbml0aW9uIHx8IGgtPm90aGVyID09IDApKQotCSAgICBoLT5vdGhlciA9IHN5bS5zdF9vdGhlcjsKLQotCSAgLyogU2V0IGEgZmxhZyBpbiB0aGUgaGFzaCB0YWJsZSBlbnRyeSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mCi0JICAgICByZWZlcmVuY2Ugb3IgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLiAgS2VlcCBhIGNvdW50IG9mCi0JICAgICB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyB3ZSBmaW5kLiAgQSBkeW5hbWljIHN5bWJvbAotCSAgICAgaXMgb25lIHdoaWNoIGlzIHJlZmVyZW5jZWQgb3IgZGVmaW5lZCBieSBib3RoIGEgcmVndWxhcgotCSAgICAgb2JqZWN0IGFuZCBhIHNoYXJlZCBvYmplY3QuICAqLwotCSAgb2xkX2ZsYWdzID0gaC0+ZWxmX2xpbmtfaGFzaF9mbGFnczsKLQkgIGR5bnN5bSA9IGZhbHNlOwotCSAgaWYgKCEgZHluYW1pYykKLQkgICAgewotCSAgICAgIGlmICghIGRlZmluaXRpb24pCi0JCXsKLQkJICBuZXdfZmxhZyA9IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVI7Ci0JCSAgaWYgKGJpbmQgIT0gU1RCX1dFQUspCi0JCSAgICBuZXdfZmxhZyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCW5ld19mbGFnID0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQkgICAgICBpZiAoaW5mby0+c2hhcmVkCi0JCSAgfHwgKG9sZF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICAgfCBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSkgIT0gMCkKLQkJZHluc3ltID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVmaW5pdGlvbikKLQkJbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOwotCSAgICAgIGVsc2UKLQkJbmV3X2ZsYWcgPSBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCSAgICAgIGlmICgob2xkX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIKLQkJCQl8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpKSAhPSAwCi0JCSAgfHwgKGgtPndlYWtkZWYgIT0gTlVMTAotCQkgICAgICAmJiAhIG5ld193ZWFrZGVmCi0JCSAgICAgICYmIGgtPndlYWtkZWYtPmR5bmluZHggIT0gLTEpKQotCQlkeW5zeW0gPSB0cnVlOwotCSAgICB9Ci0KLQkgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gbmV3X2ZsYWc7Ci0KLQkgIC8qIElmIHRoaXMgc3ltYm9sIGhhcyBhIHZlcnNpb24sIGFuZCBpdCBpcyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIHZlcnNpb24sIHdlIGNyZWF0ZSBhbiBpbmRpcmVjdCBzeW1ib2wgZnJvbSB0aGUgZGVmYXVsdAotICAgICAgICAgICAgIG5hbWUgdG8gdGhlIGZ1bGx5IGRlY29yYXRlZCBuYW1lLiAgVGhpcyB3aWxsIGNhdXNlCi0gICAgICAgICAgICAgZXh0ZXJuYWwgcmVmZXJlbmNlcyB3aGljaCBkbyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gdG8gYmUKLSAgICAgICAgICAgICBib3VuZCB0byB0aGlzIHZlcnNpb24gb2YgdGhlIHN5bWJvbC4gICovCi0JICBpZiAoZGVmaW5pdGlvbikKLQkgICAgewotCSAgICAgIGNoYXIgKnA7Ci0KLQkgICAgICBwID0gc3RyY2hyIChuYW1lLCBFTEZfVkVSX0NIUik7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCAmJiBwWzFdID09IEVMRl9WRVJfQ0hSKQotCQl7Ci0JCSAgY2hhciAqc2hvcnRuYW1lOwotCQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoaTsKLQkJICBib29sZWFuIG92ZXJyaWRlOwotCi0JCSAgc2hvcnRuYW1lID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJCSBwIC0gbmFtZSArIDEpOwotCQkgIGlmIChzaG9ydG5hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cm5jcHkgKHNob3J0bmFtZSwgbmFtZSwgcCAtIG5hbWUpOwotCQkgIHNob3J0bmFtZVtwIC0gbmFtZV0gPSAnXDAnOwotCi0JCSAgLyogV2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuICBNZXJnZSBpdAotICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbnkgZXhpc3Rpbmcgc3ltYm9sIHdpdGggdGhpcyBuYW1lLiAgRm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgcHVycG9zZXMgb2YgdGhlIG1lcmdlLCBhY3QgYXMgdGhvdWdoIHdlIHdlcmUKLSAgICAgICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBzeW1ib2wgd2UganVzdCBkZWZpbmVkLCBhbHRob3VnaCB3ZQotICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHkgZ29pbmcgdG8gZGVmaW5lIGFuIGluZGlyZWN0IHN5bWJvbC4gICovCi0JCSAgdHlwZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLQkJICBzaXplX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIGlmICghIGVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIHNob3J0bmFtZSwgJnN5bSwgJnNlYywKLQkJCQkJICAmdmFsdWUsICZoaSwgJm92ZXJyaWRlLAotCQkJCQkgICZ0eXBlX2NoYW5nZV9vaywgJnNpemVfY2hhbmdlX29rKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgaWYgKCEgb3ZlcnJpZGUpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkJICAgICAoaW5mbywgYWJmZCwgc2hvcnRuYW1lLCBCU0ZfSU5ESVJFQ1QsCi0JCQkgICAgICBiZmRfaW5kX3NlY3Rpb25fcHRyLCAoYmZkX3ZtYSkgMCwgbmFtZSwgZmFsc2UsCi0JCQkgICAgICBjb2xsZWN0LCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoaSkpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBJbiB0aGlzIGNhc2UgdGhlIHN5bWJvbCBuYW1lZCBTSE9SVE5BTUUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkaW5nIHRoZSBpbmRpcmVjdCBzeW1ib2wgd2Ugd2FudCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgIGFkZC4gIFdlIHdlcmUgcGxhbm5pbmcgb24gbWFraW5nIFNIT1JUTkFNRSBhbgotICAgICAgICAgICAgICAgICAgICAgICAgIGluZGlyZWN0IHN5bWJvbCByZWZlcnJpbmcgdG8gTkFNRS4gIFNIT1JUTkFNRQotICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSBuYW1lIHdpdGhvdXQgYSB2ZXJzaW9uLiAgTkFNRSBpcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBmdWxseSB2ZXJzaW9uZWQgbmFtZSwgYW5kIGl0IGlzIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbi4KLQotCQkJIE92ZXJyaWRpbmcgbWVhbnMgdGhhdCB3ZSBhbHJlYWR5IHNhdyBhCi0JCQkgZGVmaW5pdGlvbiBmb3IgdGhlIHN5bWJvbCBTSE9SVE5BTUUgaW4gYQotCQkJIHJlZ3VsYXIgb2JqZWN0LCBhbmQgaXQgaXMgb3ZlcnJpZGluZyB0aGUKLQkJCSBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgZHluYW1pYyBvYmplY3QuCi0KLQkJCSBXaGVuIHRoaXMgaGFwcGVucywgd2UgYWN0dWFsbHkgd2FudCB0byBjaGFuZ2UKLQkJCSBOQU1FLCB0aGUgc3ltYm9sIHdlIGp1c3QgYWRkZWQsIHRvIHJlZmVyIHRvCi0JCQkgU0hPUlROQU1FLiAgVGhpcyB3aWxsIGNhdXNlIHJlZmVyZW5jZXMgdG8KLQkJCSBOQU1FIGluIHRoZSBzaGFyZWQgb2JqZWN0IHRvIGJlY29tZQotCQkJIHJlZmVyZW5jZXMgdG8gU0hPUlROQU1FIGluIHRoZSByZWd1bGFyCi0JCQkgb2JqZWN0LiAgVGhpcyBpcyB3aGF0IHdlIGV4cGVjdCB3aGVuIHdlCi0JCQkgb3ZlcnJpZGUgYSBmdW5jdGlvbiBpbiBhIHNoYXJlZCBvYmplY3Q6IHRoYXQKLQkJCSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc2hhcmVkIG9iamVjdCB3aWxsIGJlCi0JCQkgbWFwcGVkIHRvIHRoZSBkZWZpbml0aW9uIGluIHRoZSByZWd1bGFyCi0JCQkgb2JqZWN0LiAgKi8KLQotCQkgICAgICB3aGlsZSAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0Ci0JCQkgICAgIHx8IGhpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotCQkJaGkgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgaGktPnJvb3QudS5pLmxpbms7Ci0KLQkJICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDsKLQkJICAgICAgaC0+cm9vdC51LmkubGluayA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoaTsKLQkJICAgICAgaWYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKQotCQkJewotCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDOwotCQkJICBoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDOwotCQkJICBpZiAoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAgICAgICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywKLQkJCQkJCQkJCSBoaSkpCi0JCQkJZ290byBlcnJvcl9yZXR1cm47Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIC8qIE5vdyBzZXQgSEkgdG8gSCwgc28gdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHNldCB0aGUgb3RoZXIgZmllbGRzIGNvcnJlY3RseS4gICovCi0JCSAgICAgIGhpID0gaDsKLQkJICAgIH0KLQotCQkgIC8qIElmIHRoZXJlIGlzIGEgZHVwbGljYXRlIGRlZmluaXRpb24gc29tZXdoZXJlLAotCQkgICAgIHRoZW4gSEkgbWF5IG5vdCBwb2ludCB0byBhbiBpbmRpcmVjdCBzeW1ib2wuICBXZQotCQkgICAgIHdpbGwgaGF2ZSByZXBvcnRlZCBhbiBlcnJvciB0byB0aGUgdXNlciBpbiB0aGF0Ci0JCSAgICAgY2FzZS4gICovCi0KLQkJICBpZiAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaHQ7Ci0KLQkJICAgICAgLyogSWYgdGhlIHN5bWJvbCBiZWNhbWUgaW5kaXJlY3QsIHRoZW4gd2UgYXNzdW1lCi0JCQkgdGhhdCB3ZSBoYXZlIG5vdCBzZWVuIGEgZGVmaW5pdGlvbiBiZWZvcmUuICAqLwotCQkgICAgICBCRkRfQVNTRVJUICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICAgICAgfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkKLQkJCQkgID09IDApOwotCi0JCSAgICAgIGh0ID0gKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGhpLT5yb290LnUuaS5saW5rOwotCi0JCSAgICAgIC8qIENvcHkgZG93biBhbnkgcmVmZXJlbmNlcyB0aGF0IHdlIG1heSBoYXZlCi0JCQkgYWxyZWFkeSBzZWVuIHRvIHRoZSBzeW1ib2wgd2hpY2gganVzdCBiZWNhbWUKLQkJCSBpbmRpcmVjdC4gICovCi0JCSAgICAgIGh0LT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9Ci0JCQkoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCSAmIChFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDCi0JCQkgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSCi0JCQkgICAgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspKTsKLQotCQkgICAgICAvKiBDb3B5IG92ZXIgdGhlIGdsb2JhbCBhbmQgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUKLQkJCSBvZmZzZXQgZW50cmllcy4gIFRoZXNlIG1heSBoYXZlIGJlZW4gYWxyZWFkeSBzZXQKLQkJCSB1cCBieSBhIGNoZWNrX3JlbG9jcyByb3V0aW5lLiAgKi8KLQkJICAgICAgaWYgKGh0LT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkJCXsKLQkJCSAgaHQtPmdvdC5vZmZzZXQgPSBoaS0+Z290Lm9mZnNldDsKLQkJCSAgaGktPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JCQl9Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGhpLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7Ci0KLQkJICAgICAgaWYgKGh0LT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkJCXsKLQkJCSAgaHQtPnBsdC5vZmZzZXQgPSBoaS0+cGx0Lm9mZnNldDsKLQkJCSAgaGktPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JCQl9Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGhpLT5wbHQub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7Ci0KLQkJICAgICAgaWYgKGh0LT5keW5pbmR4ID09IC0xKQotCQkJewotCQkJICBodC0+ZHluaW5keCA9IGhpLT5keW5pbmR4OwotCQkJICBodC0+ZHluc3RyX2luZGV4ID0gaGktPmR5bnN0cl9pbmRleDsKLQkJCSAgaGktPmR5bmluZHggPSAtMTsKLQkJCSAgaGktPmR5bnN0cl9pbmRleCA9IDA7Ci0JCQl9Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGhpLT5keW5pbmR4ID09IC0xKTsKLQotCQkgICAgICAvKiBGSVhNRTogVGhlcmUgbWF5IGJlIG90aGVyIGluZm9ybWF0aW9uIHRvIGNvcHkKLQkJCSBvdmVyIGZvciBwYXJ0aWN1bGFyIHRhcmdldHMuICAqLwotCi0JCSAgICAgIC8qIFNlZSBpZiB0aGUgbmV3IGZsYWdzIGxlYWQgdXMgdG8gcmVhbGl6ZSB0aGF0Ci0JCQkgdGhlIHN5bWJvbCBtdXN0IGJlIGR5bmFtaWMuICAqLwotCQkgICAgICBpZiAoISBkeW5zeW0pCi0JCQl7Ci0JCQkgIGlmICghIGR5bmFtaWMpCi0JCQkgICAgewotCQkJICAgICAgaWYgKGluZm8tPnNoYXJlZAotCQkJCSAgfHwgKChoaS0+ZWxmX2xpbmtfaGFzaF9mbGFncwotCQkJCSAgICAgICAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpCi0JCQkJICAgICAgIT0gMCkpCi0JCQkJZHluc3ltID0gdHJ1ZTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSAhPSAwKQotCQkJCWR5bnN5bSA9IHRydWU7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCi0JCSAgLyogV2UgYWxzbyBuZWVkIHRvIGRlZmluZSBhbiBpbmRpcmVjdGlvbiBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAgbm9uZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICAqLwotCi0JCSAgc2hvcnRuYW1lID0gYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQkJCSBzdHJsZW4gKG5hbWUpKTsKLQkJICBpZiAoc2hvcnRuYW1lID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzdHJuY3B5IChzaG9ydG5hbWUsIG5hbWUsIHAgLSBuYW1lKTsKLQkJICBzdHJjcHkgKHNob3J0bmFtZSArIChwIC0gbmFtZSksIHAgKyAxKTsKLQotCQkgIC8qIE9uY2UgYWdhaW4sIG1lcmdlIHdpdGggYW55IGV4aXN0aW5nIHN5bWJvbC4gICovCi0JCSAgdHlwZV9jaGFuZ2Vfb2sgPSBmYWxzZTsKLQkJICBzaXplX2NoYW5nZV9vayA9IGZhbHNlOwotCQkgIGlmICghIGVsZl9tZXJnZV9zeW1ib2wgKGFiZmQsIGluZm8sIHNob3J0bmFtZSwgJnN5bSwgJnNlYywKLQkJCQkJICAmdmFsdWUsICZoaSwgJm92ZXJyaWRlLAotCQkJCQkgICZ0eXBlX2NoYW5nZV9vaywgJnNpemVfY2hhbmdlX29rKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgaWYgKG92ZXJyaWRlKQotCQkgICAgewotCQkgICAgICAvKiBIZXJlIFNIT1JUTkFNRSBpcyBhIHZlcnNpb25lZCBuYW1lLCBzbyB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGV4cGVjdCB0byBzZWUgdGhlIHR5cGUgb2Ygb3ZlcnJpZGUgd2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBkbyBpbiB0aGUgY2FzZSBhYm92ZS4gICovCi0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiB3YXJuaW5nOiB1bmV4cGVjdGVkIHJlZGVmaW5pdGlvbiBvZiBgJXMnIiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHNob3J0bmFtZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJCSAgICAgKGluZm8sIGFiZmQsIHNob3J0bmFtZSwgQlNGX0lORElSRUNULAotCQkJICAgICAgYmZkX2luZF9zZWN0aW9uX3B0ciwgKGJmZF92bWEpIDAsIG5hbWUsIGZhbHNlLAotCQkJICAgICAgY29sbGVjdCwgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaGkpKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCSAgICAgIC8qIElmIHRoZXJlIGlzIGEgZHVwbGljYXRlIGRlZmluaXRpb24gc29tZXdoZXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gSEkgbWF5IG5vdCBwb2ludCB0byBhbiBpbmRpcmVjdCBzeW1ib2wuCi0gICAgICAgICAgICAgICAgICAgICAgICAgV2Ugd2lsbCBoYXZlIHJlcG9ydGVkIGFuIGVycm9yIHRvIHRoZSB1c2VyIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBjYXNlLiAgKi8KLQotCQkgICAgICBpZiAoaGktPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotCQkJewotCQkJICAvKiBJZiB0aGUgc3ltYm9sIGJlY2FtZSBpbmRpcmVjdCwgdGhlbiB3ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3N1bWUgdGhhdCB3ZSBoYXZlIG5vdCBzZWVuIGEgZGVmaW5pdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUuICAqLwotCQkJICBCRkRfQVNTRVJUICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkgICAgICAgJiAoRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQwotCQkJCQkgIHwgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpCi0JCQkJICAgICAgPT0gMCk7Ci0KLQkJCSAgLyogQ29weSBkb3duIGFueSByZWZlcmVuY2VzIHRoYXQgd2UgbWF5IGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBzZWVuIHRvIHRoZSBzeW1ib2wgd2hpY2gganVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhbWUgaW5kaXJlY3QuICAqLwotCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9Ci0JCQkgICAgKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkgICAgICYgKEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMKLQkJCQl8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQl8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSykpOwotCi0JCQkgIC8qIENvcHkgb3ZlciB0aGUgZ2xvYmFsIGFuZCBwcm9jZWR1cmUgbGlua2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSBvZmZzZXQgZW50cmllcy4gIFRoZXNlIG1heSBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBzZXQgdXAgYnkgYSBjaGVja19yZWxvY3Mgcm91dGluZS4gICovCi0JCQkgIGlmIChoLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5nb3Qub2Zmc2V0ID0gaGktPmdvdC5vZmZzZXQ7Ci0JCQkgICAgICBoaS0+Z290Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCSAgICB9Ci0JCQkgIEJGRF9BU1NFUlQgKGhpLT5nb3Qub2Zmc2V0ID09IChiZmRfdm1hKSAtMSk7Ci0KLQkJCSAgaWYgKGgtPnBsdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKQotCQkJICAgIHsKLQkJCSAgICAgIGgtPnBsdC5vZmZzZXQgPSBoaS0+cGx0Lm9mZnNldDsKLQkJCSAgICAgIGhpLT5wbHQub2Zmc2V0ID0gKGJmZF92bWEpIC0xOwotCQkJICAgIH0KLQkJCSAgQkZEX0FTU0VSVCAoaGktPmdvdC5vZmZzZXQgPT0gKGJmZF92bWEpIC0xKTsKLQotCQkJICBpZiAoaC0+ZHluaW5keCA9PSAtMSkKLQkJCSAgICB7Ci0JCQkgICAgICBoLT5keW5pbmR4ID0gaGktPmR5bmluZHg7Ci0JCQkgICAgICBoLT5keW5zdHJfaW5kZXggPSBoaS0+ZHluc3RyX2luZGV4OwotCQkJICAgICAgaGktPmR5bmluZHggPSAtMTsKLQkJCSAgICAgIGhpLT5keW5zdHJfaW5kZXggPSAwOwotCQkJICAgIH0KLQkJCSAgQkZEX0FTU0VSVCAoaGktPmR5bmluZHggPT0gLTEpOwotCi0JCQkgIC8qIEZJWE1FOiBUaGVyZSBtYXkgYmUgb3RoZXIgaW5mb3JtYXRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSBvdmVyIGZvciBwYXJ0aWN1bGFyIHRhcmdldHMuICAqLwotCi0JCQkgIC8qIFNlZSBpZiB0aGUgbmV3IGZsYWdzIGxlYWQgdXMgdG8gcmVhbGl6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBzeW1ib2wgbXVzdCBiZSBkeW5hbWljLiAgKi8KLQkJCSAgaWYgKCEgZHluc3ltKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICghIGR5bmFtaWMpCi0JCQkJewotCQkJCSAgaWYgKGluZm8tPnNoYXJlZAotCQkJCSAgICAgIHx8ICgoaGktPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJCQkJICAgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKQotCQkJCQkgICE9IDApKQotCQkJCSAgICBkeW5zeW0gPSB0cnVlOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBpZiAoKGhpLT5lbGZfbGlua19oYXNoX2ZsYWdzCi0JCQkJICAgICAgICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMCkKLQkJCQkgICAgZHluc3ltID0gdHJ1ZTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGR5bnN5bSAmJiBoLT5keW5pbmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JCSAgJiYgISBuZXdfd2Vha2RlZgotCQkgICYmIGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywKLQkJCQkJCQkgICAgIGgtPndlYWtkZWYpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTm93IHNldCB0aGUgd2Vha2RlZnMgZmllbGQgY29ycmVjdGx5IGZvciBhbGwgdGhlIHdlYWsgZGVmaW5lZAotICAgICBzeW1ib2xzIHdlIGZvdW5kLiAgVGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gc2VhcmNoIGFsbCB0aGUKLSAgICAgc3ltYm9scy4gIFNpbmNlIHdlIG9ubHkgbmVlZCB0aGUgaW5mb3JtYXRpb24gZm9yIG5vbiBmdW5jdGlvbnMgaW4KLSAgICAgZHluYW1pYyBvYmplY3RzLCB0aGF0J3MgdGhlIG9ubHkgdGltZSB3ZSBhY3R1YWxseSBwdXQgYW55dGhpbmcgb24KLSAgICAgdGhlIGxpc3QgV0VBS1MuICBXZSBuZWVkIHRoaXMgaW5mb3JtYXRpb24gc28gdGhhdCBpZiBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0IHJlZmVycyB0byBhIHN5bWJvbCBkZWZpbmVkIHdlYWtseSBpbiBhIGR5bmFtaWMgb2JqZWN0LCB0aGUKLSAgICAgcmVhbCBzeW1ib2wgaW4gdGhlIGR5bmFtaWMgb2JqZWN0IGlzIGFsc28gcHV0IGluIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbHM7IHdlIGFsc28gbXVzdCBhcnJhbmdlIGZvciBib3RoIHN5bWJvbHMgdG8gcG9pbnQgdG8gdGhlCi0gICAgIHNhbWUgbWVtb3J5IGxvY2F0aW9uLiAgV2UgY291bGQgaGFuZGxlIHRoZSBnZW5lcmFsIGNhc2Ugb2Ygc3ltYm9sCi0gICAgIGFsaWFzaW5nLCBidXQgYSBnZW5lcmFsIHN5bWJvbCBhbGlhcyBjYW4gb25seSBiZSBnZW5lcmF0ZWQgaW4KLSAgICAgYXNzZW1ibGVyIGNvZGUsIGhhbmRsaW5nIGl0IGNvcnJlY3RseSB3b3VsZCBiZSB2ZXJ5IHRpbWUKLSAgICAgY29uc3VtaW5nLCBhbmQgb3RoZXIgRUxGIGxpbmtlcnMgZG9uJ3QgaGFuZGxlIGdlbmVyYWwgYWxpYXNpbmcKLSAgICAgZWl0aGVyLiAgKi8KLSAgd2hpbGUgKHdlYWtzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmhsb29rOwotICAgICAgYXNlY3Rpb24gKnNsb29rOwotICAgICAgYmZkX3ZtYSB2bG9vazsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqaHBwOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipocHBlbmQ7Ci0KLSAgICAgIGhsb29rID0gd2Vha3M7Ci0gICAgICB3ZWFrcyA9IGhsb29rLT53ZWFrZGVmOwotICAgICAgaGxvb2stPndlYWtkZWYgPSBOVUxMOwotCi0gICAgICBCRkRfQVNTRVJUIChobG9vay0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCSAgfHwgaGxvb2stPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbgotCQkgIHx8IGhsb29rLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCk7Ci0gICAgICBzbG9vayA9IGhsb29rLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICB2bG9vayA9IGhsb29rLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICBocHAgPSBlbGZfc3ltX2hhc2hlcyAoYWJmZCk7Ci0gICAgICBocHBlbmQgPSBocHAgKyBleHRzeW1jb3VudDsKLSAgICAgIGZvciAoOyBocHAgPCBocHBlbmQ7IGhwcCsrKQotCXsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKmhwcDsKLQkgIGlmIChoICE9IE5VTEwgJiYgaCAhPSBobG9vawotCSAgICAgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24gPT0gc2xvb2sKLQkgICAgICAmJiBoLT5yb290LnUuZGVmLnZhbHVlID09IHZsb29rKQotCSAgICB7Ci0JICAgICAgaGxvb2stPndlYWtkZWYgPSBoOwotCi0JICAgICAgLyogSWYgdGhlIHdlYWsgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCi0JCSBzeW1ib2xzLCBtYWtlIHN1cmUgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBwdXQgdGhlcmUKLQkJIGFzIHdlbGwuICAqLwotCSAgICAgIGlmIChobG9vay0+ZHluaW5keCAhPSAtMQotCQkgICYmIGgtPmR5bmluZHggPT0gLTEpCi0JCXsKLQkJICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgLyogSWYgdGhlIHJlYWwgZGVmaW5pdGlvbiBpcyBpbiB0aGUgbGlzdCBvZiBkeW5hbWljCi0gICAgICAgICAgICAgICAgIHN5bWJvbHMsIG1ha2Ugc3VyZSB0aGUgd2VhayBkZWZpbml0aW9uIGlzIHB1dCB0aGVyZQotICAgICAgICAgICAgICAgICBhcyB3ZWxsLiAgSWYgd2UgZG9uJ3QgZG8gdGhpcywgdGhlbiB0aGUgZHluYW1pYwotICAgICAgICAgICAgICAgICBsb2FkZXIgbWlnaHQgbm90IG1lcmdlIHRoZSBlbnRyaWVzIGZvciB0aGUgcmVhbAotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uIGFuZCB0aGUgd2VhayBkZWZpbml0aW9uLiAgKi8KLQkgICAgICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkgICYmIGhsb29rLT5keW5pbmR4ID09IC0xKQotCQl7Ci0JCSAgaWYgKCEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGhsb29rKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBidWYgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZXh0dmVyc3ltKTsKLSAgICAgIGV4dHZlcnN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgb2JqZWN0IGlzIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3V0cHV0IG9iamVjdCwgYW5kIGl0IGlzCi0gICAgIG5vdCBhIHNoYXJlZCBsaWJyYXJ5LCB0aGVuIGxldCB0aGUgYmFja2VuZCBsb29rIHRocm91Z2ggdGhlCi0gICAgIHJlbG9jcy4KLQotICAgICBUaGlzIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcyBhbmQgdG8KLSAgICAgYXJyYW5nZSBmb3IgZHluYW1pYyByZWxvY3MuICBJdCBpcyBub3QgcmVxdWlyZWQgZm9yIHRoZQotICAgICBwYXJ0aWN1bGFyIGNvbW1vbiBjYXNlIG9mIGxpbmtpbmcgbm9uIFBJQyBjb2RlLCBldmVuIHdoZW4gbGlua2luZwotICAgICBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzIG5vIHdheSBvZgotICAgICBrbm93aW5nIHdoZXRoZXIgYW4gb2JqZWN0IGZpbGUgaGFzIGJlZW4gY29tcGlsZWQgUElDIG9yIG5vdC4KLSAgICAgTG9va2luZyB0aHJvdWdoIHRoZSByZWxvY3MgaXMgbm90IHBhcnRpY3VsYXJseSB0aW1lIGNvbnN1bWluZy4KLSAgICAgVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBtdXN0IGVpdGhlciAoMSkga2VlcCB0aGUgcmVsb2NzIGluIG1lbW9yeSwKLSAgICAgd2hpY2ggY2F1c2VzIHRoZSBsaW5rZXIgdG8gcmVxdWlyZSBhZGRpdGlvbmFsIHJ1bnRpbWUgbWVtb3J5IG9yCi0gICAgICgyKSByZWFkIHRoZSByZWxvY3MgdHdpY2UgZnJvbSB0aGUgaW5wdXQgZmlsZSwgd2hpY2ggd2FzdGVzIHRpbWUuCi0gICAgIFRoaXMgd291bGQgYmUgYSBnb29kIGNhc2UgZm9yIHVzaW5nIG1tYXAuCi0KLSAgICAgSSBoYXZlIG5vIGlkZWEgaG93IHRvIGhhbmRsZSBsaW5raW5nIFBJQyBjb2RlIGludG8gYSBmaWxlIG9mIGEKLSAgICAgZGlmZmVyZW50IGZvcm1hdC4gIEl0IHByb2JhYmx5IGNhbid0IGJlIGRvbmUuICAqLwotICBjaGVja19yZWxvY3MgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNoZWNrX3JlbG9jczsKLSAgaWYgKCEgZHluYW1pYwotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiBjaGVja19yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLQotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQkgIGJvb2xlYW4gb2s7Ci0KLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDAKLQkgICAgICB8fCBvLT5yZWxvY19jb3VudCA9PSAwCi0JICAgICAgfHwgKChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIpCi0JCSAgJiYgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLQkgICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG8tPm91dHB1dF9zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkgICAgIChhYmZkLCBvLCAoUFRSKSBOVUxMLAotCQkJICAgICAgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsCi0JCQkgICAgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgb2sgPSAoKmNoZWNrX3JlbG9jcykgKGFiZmQsIGluZm8sIG8sIGludGVybmFsX3JlbG9jcyk7Ci0KLQkgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotCSAgICBmcmVlIChpbnRlcm5hbF9yZWxvY3MpOwotCi0JICBpZiAoISBvaykKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgbm9uLXRyYWRpdGlvbmFsLCBub24tcmVsb2NhdGVhYmxlIGxpbmssIHRyeSB0bwotICAgICBvcHRpbWl6ZSB0aGUgaGFuZGxpbmcgb2YgdGhlIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLSAgaWYgKCEgZHluYW1pYwotICAgICAgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmICEgaW5mby0+dHJhZGl0aW9uYWxfZm9ybWF0Ci0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgJiYgaW5mby0+c3RyaXAgIT0gc3RyaXBfZGVidWdnZXIpKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdGFiLCAqc3RhYnN0cjsKLQotICAgICAgc3RhYiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGlmIChzdGFiICE9IE5VTEwpCi0JewotCSAgc3RhYnN0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotCSAgaWYgKHN0YWJzdHIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3NlY3Rpb25fZGF0YSAqc2VjZGF0YTsKLQotCSAgICAgIHNlY2RhdGEgPSBlbGZfc2VjdGlvbl9kYXRhIChzdGFiKTsKLQkgICAgICBpZiAoISBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicyAoYWJmZCwKLQkJCQkJICAgICAmZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8sCi0JCQkJCSAgICAgc3RhYiwgc3RhYnN0ciwKLQkJCQkJICAgICAmc2VjZGF0YS0+c3RhYl9pbmZvKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgaWYgKGR5bmJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGR5bmJ1Zik7Ci0gIGlmIChkeW52ZXIgIT0gTlVMTCkKLSAgICBmcmVlIChkeW52ZXIpOwotICBpZiAoZXh0dmVyc3ltICE9IE5VTEwpCi0gICAgZnJlZSAoZXh0dmVyc3ltKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBDcmVhdGUgc29tZSBzZWN0aW9ucyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIGR5bmFtaWMgbGlua2luZwotICAgaW5mb3JtYXRpb24uICBBQkZEIGlzIGFuIGlucHV0IGZpbGUgd2hpY2ggcmVxdWlyZXMgZHluYW1pYyBzZWN0aW9ucwotICAgdG8gYmUgY3JlYXRlZC4gIFRoZSBkeW5hbWljIHNlY3Rpb25zIHRha2UgdXAgdmlydHVhbCBtZW1vcnkgc3BhY2UKLSAgIHdoZW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUgaXMgcnVuLCBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGVtIGJlZm9yZQotICAgYWRkcmVzc2VzIGFyZSBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb25zLiAgV2Ugd29yayBvdXQgdGhlCi0gICBhY3R1YWwgY29udGVudHMgYW5kIHNpemUgb2YgdGhlc2Ugc2VjdGlvbnMgbGF0ZXIuICAqLwotCi1ib29sZWFuCi1lbGZfbGlua19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgYWxsIGR5bmFtaWMgc2VjdGlvbnMgdXNlIHRoZSBzYW1lIGlucHV0IEJGRC4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgZWxzZQotICAgIGFiZmQgPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBOb3RlIHRoYXQgd2Ugc2V0IHRoZSBTRUNfSU5fTUVNT1JZIGZsYWcgZm9yIGFsbCBvZiB0aGVzZQotICAgICBzZWN0aW9ucy4gICovCi0gIGZsYWdzID0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCSAgIHwgU0VDX0lOX01FTU9SWSB8IFNFQ19MSU5LRVJfQ1JFQVRFRCk7Ci0KLSAgLyogQSBkeW5hbWljYWxseSBsaW5rZWQgZXhlY3V0YWJsZSBoYXMgYSAuaW50ZXJwIHNlY3Rpb24sIGJ1dCBhCi0gICAgIHNoYXJlZCBsaWJyYXJ5IGRvZXMgbm90LiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmludGVycCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBzZWN0aW9ucyB0byBob2xkIHZlcnNpb24gaW5mb3JtYXRpb25zLiAgVGhlc2UgYXJlIHJlbW92ZWQKLSAgICAgaWYgdGhleSBhcmUgbm90IG5lZWRlZC4gICovCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX2QiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmdudS52ZXJzaW9uX3IiKTsKLSAgaWYgKHMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX1JFQURPTkxZKQotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCBMT0dfRklMRV9BTElHTikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmR5bnN5bSIpOwotICBpZiAocyA9PSBOVUxMCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIExPR19GSUxFX0FMSUdOKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3RyIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENyZWF0ZSBhIHN0cnRhYiB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbCBuYW1lcy4gICovCi0gIGlmIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID0gZWxmX3N0cmluZ3RhYl9pbml0ICgpOwotICAgICAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgc3BlY2lhbCBzeW1ib2wgX0RZTkFNSUMgaXMgYWx3YXlzIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIC5keW5hbWljIHNlY3Rpb24uICBUaGlzIGNhbGwgb2NjdXJzIGJlZm9yZSB3ZSBoYXZlIHByb2Nlc3NlZCB0aGUKLSAgICAgc3ltYm9scyBmb3IgYW55IGR5bmFtaWMgb2JqZWN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0Ci0gICAgIG92ZXJyaWRpbmcgYSBkeW5hbWljIGRlZmluaXRpb24uICBXZSBjb3VsZCBzZXQgX0RZTkFNSUMgaW4gYQotICAgICBsaW5rZXIgc2NyaXB0LCBidXQgd2Ugb25seSB3YW50IHRvIGRlZmluZSBpdCBpZiB3ZSBhcmUsIGluIGZhY3QsCi0gICAgIGNyZWF0aW5nIGEgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIGl0IGlmIHRoZXJlCi0gICAgIGlzIG5vIC5keW5hbWljIHNlY3Rpb24sIHNpbmNlIG9uIHNvbWUgRUxGIHBsYXRmb3JtcyB0aGUgc3RhcnQgdXAKLSAgICAgY29kZSBleGFtaW5lcyBpdCB0byBkZWNpZGUgaG93IHRvIGluaXRpYWxpemUgdGhlIHByb2Nlc3MuICAqLwotICBoID0gTlVMTDsKLSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JIChpbmZvLCBhYmZkLCAiX0RZTkFNSUMiLCBCU0ZfR0xPQkFMLCBzLCAoYmZkX3ZtYSkgMCwKLQkgIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNvbGxlY3QsCi0JICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gIGgtPnR5cGUgPSBTVFRfT0JKRUNUOwotCi0gIGlmIChpbmZvLT5zaGFyZWQKLSAgICAgICYmICEgX2JmZF9lbGZfbGlua19yZWNvcmRfZHluYW1pY19zeW1ib2wgKGluZm8sIGgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5oYXNoIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgTE9HX0ZJTEVfQUxJR04pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgY3JlYXRlIHRoZSByZXN0IG9mIHRoZSBzZWN0aW9ucy4gIFRoaXMgbGV0cyB0aGUKLSAgICAgYmFja2VuZCBzZXQgdGhlIHJpZ2h0IGZsYWdzLiAgVGhlIGJhY2tlbmQgd2lsbCBub3JtYWxseSBjcmVhdGUKLSAgICAgdGhlIC5nb3QgYW5kIC5wbHQgc2VjdGlvbnMuICAqLwotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGlmICghICgqYmVkLT5lbGZfYmFja2VuZF9jcmVhdGVfZHluYW1pY19zZWN0aW9ucykgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbiBlbnRyeSB0byB0aGUgLmR5bmFtaWMgdGFibGUuICAqLwotCi1ib29sZWFuCi1lbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIHRhZywgdmFsKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSB0YWc7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLSAgYmZkICpkeW5vYmo7Ci0gIGFzZWN0aW9uICpzOwotICBzaXplX3QgbmV3c2l6ZTsKLSAgYmZkX2J5dGUgKm5ld2NvbnRlbnRzOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQotICBuZXdzaXplID0gcy0+X3Jhd19zaXplICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfRHluKTsKLSAgbmV3Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKHMtPmNvbnRlbnRzLCBuZXdzaXplKTsKLSAgaWYgKG5ld2NvbnRlbnRzID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGR5bi5kX3RhZyA9IHRhZzsKLSAgZHluLmRfdW4uZF92YWwgPSB2YWw7Ci0gIGVsZl9zd2FwX2R5bl9vdXQgKGR5bm9iaiwgJmR5biwKLQkJICAgIChFbGZfRXh0ZXJuYWxfRHluICopIChuZXdjb250ZW50cyArIHMtPl9yYXdfc2l6ZSkpOwotCi0gIHMtPl9yYXdfc2l6ZSA9IG5ld3NpemU7Ci0gIHMtPmNvbnRlbnRzID0gbmV3Y29udGVudHM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0KLS8qIFJlYWQgYW5kIHN3YXAgdGhlIHJlbG9jcyBmcm9tIHRoZSBzZWN0aW9uIGluZGljYXRlZCBieSBTSERSLiAgVGhpcwotICAgbWF5IGJlIGVpdGhlciBhIFJFTCBvciBhIFJFTEEgc2VjdGlvbi4gIFRoZSByZWxvY2F0aW9ucyBhcmUKLSAgIHRyYW5zbGF0ZWQgaW50byBSRUxBIHJlbG9jYXRpb25zIGFuZCBzdG9yZWQgaW4gSU5URVJOQUxfUkVMT0NTLAotICAgd2hpY2ggc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCB0byBjb250YWluIGVub3VnaCBzcGFjZS4KLSAgIFRoZSBFWFRFUk5BTF9SRUxPQ1MgYXJlIGEgYnVmZmVyIHdoZXJlIHRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZQotICAgcmVsb2NhdGlvbnMgc2hvdWxkIGJlIHN0b3JlZC4KLQotICAgUmV0dXJucyBmYWxzZSBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gKGFiZmQsIHNoZHIsIGV4dGVybmFsX3JlbG9jcywKLQkJCQkgICBpbnRlcm5hbF9yZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgRWxmX0ludGVybmFsX1NoZHIgKnNoZHI7Ci0gICAgIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0gICAgIEVsZl9JbnRlcm5hbF9SZWxhICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIC8qIElmIHRoZXJlIGFyZW4ndCBhbnkgcmVsb2NhdGlvbnMsIHRoYXQncyBPSy4gICovCi0gIGlmICghc2hkcikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBQb3NpdGlvbiBvdXJzZWx2ZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWFkIHRoZSByZWxvY2F0aW9ucy4gICovCi0gIGlmIChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBzaGRyLT5zaF9zaXplLCBhYmZkKQotICAgICAgIT0gc2hkci0+c2hfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ29udmVydCB0aGUgZXh0ZXJuYWwgcmVsb2NhdGlvbnMgdG8gdGhlIGludGVybmFsIGZvcm1hdC4gICovCi0gIGlmIChzaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbCkpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbCAqZXJlbDsKLSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWxlbmQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaXJlbGE7Ci0KLSAgICAgIGVyZWwgPSAoRWxmX0V4dGVybmFsX1JlbCAqKSBleHRlcm5hbF9yZWxvY3M7Ci0gICAgICBlcmVsZW5kID0gZXJlbCArIHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBmb3IgKDsgZXJlbCA8IGVyZWxlbmQ7IGVyZWwrKywgaXJlbGErKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0KLQkgIGVsZl9zd2FwX3JlbG9jX2luIChhYmZkLCBlcmVsLCAmaXJlbCk7Ci0JICBpcmVsYS0+cl9vZmZzZXQgPSBpcmVsLnJfb2Zmc2V0OwotCSAgaXJlbGEtPnJfaW5mbyA9IGlyZWwucl9pbmZvOwotCSAgaXJlbGEtPnJfYWRkZW5kID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhZW5kOwotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotCi0gICAgICBCRkRfQVNTRVJUIChzaGRyLT5zaF9lbnRzaXplID09IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpKTsKLQotICAgICAgZXJlbGEgPSAoRWxmX0V4dGVybmFsX1JlbGEgKikgZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZXJlbGFlbmQgPSBlcmVsYSArIHNoZHItPnNoX3NpemUgLyBzaGRyLT5zaF9lbnRzaXplOwotICAgICAgaXJlbGEgPSBpbnRlcm5hbF9yZWxvY3M7Ci0gICAgICBmb3IgKDsgZXJlbGEgPCBlcmVsYWVuZDsgZXJlbGErKywgaXJlbGErKykKLQllbGZfc3dhcF9yZWxvY2FfaW4gKGFiZmQsIGVyZWxhLCBpcmVsYSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGFuZCBzd2FwIHRoZSByZWxvY3MgZm9yIGEgc2VjdGlvbi4gIFRoZXkgbWF5IGhhdmUgYmVlbiBjYWNoZWQuCi0gICBJZiB0aGUgRVhURVJOQUxfUkVMT0NTIGFuZCBJTlRFUk5BTF9SRUxPQ1MgYXJndW1lbnRzIGFyZSBub3QgTlVMTCwKLSAgIHRoZXkgYXJlIHVzZWQgYXMgYnVmZmVycyB0byByZWFkIGludG8uICBUaGV5IGFyZSBrbm93biB0byBiZSBsYXJnZQotICAgZW5vdWdoLiAgSWYgdGhlIElOVEVSTkFMX1JFTE9DUyByZWxvY3MgYXJndW1lbnQgaXMgTlVMTCwgdGhlIHJldHVybgotICAgdmFsdWUgaXMgYWxsb2NhdGVkIHVzaW5nIGVpdGhlciBtYWxsb2Mgb3IgYmZkX2FsbG9jLCBhY2NvcmRpbmcgdG8KLSAgIHRoZSBLRUVQX01FTU9SWSBhcmd1bWVudC4gICovCi0KLUVsZl9JbnRlcm5hbF9SZWxhICoKLU5BTUUoX2JmZF9lbGYsbGlua19yZWFkX3JlbG9jcykgKGFiZmQsIG8sIGV4dGVybmFsX3JlbG9jcywgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSBrZWVwX21lbW9yeSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqbzsKLSAgICAgUFRSIGV4dGVybmFsX3JlbG9jczsKLSAgICAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgICAgYm9vbGVhbiBrZWVwX21lbW9yeTsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0gIFBUUiBhbGxvYzEgPSBOVUxMOwotICBFbGZfSW50ZXJuYWxfUmVsYSAqYWxsb2MyID0gTlVMTDsKLQotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jcyAhPSBOVUxMKQotICAgIHJldHVybiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsb2NzOwotCi0gIGlmIChvLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHI7Ci0KLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNpemVfdCBzaXplOwotCi0gICAgICBzaXplID0gby0+cmVsb2NfY291bnQgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKTsKLSAgICAgIGlmIChrZWVwX21lbW9yeSkKLQlpbnRlcm5hbF9yZWxvY3MgPSAoRWxmX0ludGVybmFsX1JlbGEgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplKTsKLSAgICAgIGVsc2UKLQlpbnRlcm5hbF9yZWxvY3MgPSBhbGxvYzIgPSAoRWxmX0ludGVybmFsX1JlbGEgKikgYmZkX21hbGxvYyAoc2l6ZSk7Ci0gICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChleHRlcm5hbF9yZWxvY3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpIHJlbF9oZHItPnNoX3NpemU7Ci0KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjIpCi0Jc2l6ZSArPSAoc2l6ZV90KSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjItPnNoX3NpemU7Ci0gICAgICBhbGxvYzEgPSAoUFRSKSBiZmRfbWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChhbGxvYzEgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGV4dGVybmFsX3JlbG9jcyA9IGFsbG9jMTsKLSAgICB9Ci0KLSAgaWYgKCFlbGZfbGlua19yZWFkX3JlbG9jc19mcm9tX3NlY3Rpb24gKGFiZmQsIHJlbF9oZHIsCi0JCQkJCSAgZXh0ZXJuYWxfcmVsb2NzLAotCQkJCQkgIGludGVybmFsX3JlbG9jcykpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghZWxmX2xpbmtfcmVhZF9yZWxvY3NfZnJvbV9zZWN0aW9uIAotICAgICAgKGFiZmQsIAotICAgICAgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGRyMiwKLSAgICAgICAoKGJmZF9ieXRlICopIGV4dGVybmFsX3JlbG9jcykgKyByZWxfaGRyLT5zaF9zaXplLAotICAgICAgIGludGVybmFsX3JlbG9jcyArIHJlbF9oZHItPnNoX3NpemUgLyByZWxfaGRyLT5zaF9lbnRzaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBDYWNoZSB0aGUgcmVzdWx0cyBmb3IgbmV4dCB0aW1lLCBpZiB3ZSBjYW4uICAqLwotICBpZiAoa2VlcF9tZW1vcnkpCi0gICAgZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jcyA9IGludGVybmFsX3JlbG9jczsKLQotICBpZiAoYWxsb2MxICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MxKTsKLQotICAvKiBEb24ndCBmcmVlIGFsbG9jMiwgc2luY2UgaWYgaXQgd2FzIGFsbG9jYXRlZCB3ZSBhcmUgcGFzc2luZyBpdAotICAgICBiYWNrICh1bmRlciB0aGUgbmFtZSBvZiBpbnRlcm5hbF9yZWxvY3MpLiAgKi8KLQotICByZXR1cm4gaW50ZXJuYWxfcmVsb2NzOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYWxsb2MxICE9IE5VTEwpCi0gICAgZnJlZSAoYWxsb2MxKTsKLSAgaWYgKGFsbG9jMiAhPSBOVUxMKQotICAgIGZyZWUgKGFsbG9jMik7Ci0gIHJldHVybiBOVUxMOwotfQotDAotCi0vKiBSZWNvcmQgYW4gYXNzaWdubWVudCB0byBhIHN5bWJvbCBtYWRlIGJ5IGEgbGlua2VyIHNjcmlwdC4gIFdlIG5lZWQKLSAgIHRoaXMgaW4gY2FzZSBzb21lIGR5bmFtaWMgb2JqZWN0IHJlZmVycyB0byB0aGlzIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotTkFNRShiZmRfZWxmLHJlY29yZF9saW5rX2Fzc2lnbm1lbnQpIChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lLCBwcm92aWRlKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIHByb3ZpZGU7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaCA9IGVsZl9saW5rX2hhc2hfbG9va3VwIChlbGZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIHRydWUsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9fiBFTEZfTElOS19OT05fRUxGOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCBhbmQgaXQgaXMKLSAgICAgY3VycmVudGx5IGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYnV0IG5vdCBieSBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0LCB0aGVuIG1hcmsgaXQgYXMgdW5kZWZpbmVkIHNvIHRoYXQgdGhlIGdlbmVyaWMgbGlua2VyIHdpbGwKLSAgICAgZm9yY2UgdGhlIGNvcnJlY3QgdmFsdWUuICAqLwotICBpZiAocHJvdmlkZQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbm90IGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LCBhbmQgaXQgaXMKLSAgICAgY3VycmVudGx5IGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgYnV0IG5vdCBieSBhIHJlZ3VsYXIgb2JqZWN0LAotICAgICB0aGVuIGNsZWFyIG91dCBhbnkgdmVyc2lvbiBpbmZvcm1hdGlvbiBiZWNhdXNlIHRoZSBzeW1ib2wgd2lsbCBub3QgYmUKLSAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBkeW5hbWljIG9iamVjdCBhbnkgbW9yZS4gICovCi0gIGlmICghcHJvdmlkZQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDApCi0gICAgaC0+dmVyaW5mby52ZXJkZWYgPSBOVUxMOwotCi0gIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLSAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0KLSAgaWYgKCgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIChFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDCi0JCQkJICB8IEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpKSAhPSAwCi0gICAgICAgfHwgaW5mby0+c2hhcmVkKQotICAgICAgJiYgaC0+ZHluaW5keCA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoaW5mbywgaCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbmVkIHN5bWJvbCwgYW5kIHdlIGtub3cgYSBjb3JyZXNwb25kaW5nCi0JIHJlYWwgc3ltYm9sIGZyb20gdGhlIHNhbWUgZHluYW1pYyBvYmplY3QsIG1ha2Ugc3VyZSB0aGUgcmVhbAotCSBzeW1ib2wgaXMgYWxzbyBtYWRlIGludG8gYSBkeW5hbWljIHN5bWJvbC4gICovCi0gICAgICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMCi0JICAmJiBoLT53ZWFrZGVmLT5keW5pbmR4ID09IC0xKQotCXsKLQkgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoLT53ZWFrZGVmKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIGVsZl9saW5rX2Fzc2lnbl9zeW1fdmVyc2lvbi4gICovCi0KLXN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8KLXsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIFZlcnNpb24gdHJlZS4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyZGVmczsKLSAgLyogV2hldGhlciB3ZSBhcmUgZXhwb3J0aW5nIGFsbCBkeW5hbWljIHN5bWJvbHMuICAqLwotICBib29sZWFuIGV4cG9ydF9keW5hbWljOwotICAvKiBXaGV0aGVyIHdlIHJlbW92ZWQgYW55IHN5bWJvbHMgZnJvbSB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotICBib29sZWFuIHJlbW92ZWRfZHluYW1pYzsKLSAgLyogV2hldGhlciB3ZSBoYWQgYSBmYWlsdXJlLiAgKi8KLSAgYm9vbGVhbiBmYWlsZWQ7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIGVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMuICAqLwotCi1zdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8KLXsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIFRoZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHZlcnM7Ci0gIC8qIFdoZXRoZXIgd2UgaGFkIGEgZmFpbHVyZS4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotfTsKLQotLyogQXJyYXkgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBoYXNoIHRhYmxlIGJ1Y2tldHMgdG8gdXNlCi0gICBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdGhlcmUgYXJlLiAgSWYgdGhlcmUgYXJlIGZld2VyIHRoYW4KLSAgIDMgc3ltYm9scyB3ZSB1c2UgMSBidWNrZXQsIGZld2VyIHRoYW4gMTcgc3ltYm9scyB3ZSB1c2UgMyBidWNrZXRzLAotICAgZmV3ZXIgdGhhbiAzNyB3ZSB1c2UgMTcgYnVja2V0cywgYW5kIHNvIGZvcnRoLiAgV2UgbmV2ZXIgdXNlIG1vcmUKLSAgIHRoYW4gMzI3NzEgYnVja2V0cy4gICovCi0KLXN0YXRpYyBjb25zdCBzaXplX3QgZWxmX2J1Y2tldHNbXSA9Ci17Ci0gIDEsIDMsIDE3LCAzNywgNjcsIDk3LCAxMzEsIDE5NywgMjYzLCA1MjEsIDEwMzEsIDIwNTMsIDQwOTksIDgyMDksCi0gIDE2NDExLCAzMjc3MSwgMAotfTsKLQotLyogQ29tcHV0ZSBidWNrZXQgY291bnQgZm9yIGhhc2hpbmcgdGFibGUuICBXZSBkbyBub3QgdXNlIGEgc3RhdGljIHNldAotICAgb2YgcG9zc2libGUgdGFibGVzIHNpemVzIGFueW1vcmUuICBJbnN0ZWFkIHdlIGRldGVybWluZSBmb3IgYWxsCi0gICBwb3NzaWJsZSByZWFzb25hYmxlIHNpemVzIG9mIHRoZSB0YWJsZSB0aGUgb3V0Y29tZSAoaS5lLiwgdGhlCi0gICBudW1iZXIgb2YgY29sbGlzaW9ucyBldGMpIGFuZCBjaG9vc2UgdGhlIGJlc3Qgc29sdXRpb24uICBUaGUKLSAgIHdlaWdodGluZyBmdW5jdGlvbnMgYXJlIG5vdCB0b28gc2ltcGxlIHRvIGFsbG93IHRoZSB0YWJsZSB0byBncm93Ci0gICB3aXRob3V0IGJvdW5kcy4gIEluc3RlYWQgb25lIG9mIHRoZSB3ZWlnaHRpbmcgZmFjdG9ycyBpcyB0aGUgc2l6ZS4KLSAgIFRoZXJlZm9yZSB0aGUgcmVzdWx0IGlzIGFsd2F5cyBhIGdvb2QgcGF5b2ZmIGJldHdlZW4gZmV3IGNvbGxpc2lvbnMKLSAgICg9IHNob3J0IGNoYWluIGxlbmd0aHMpIGFuZCB0YWJsZSBzaXplLiAgKi8KLXN0YXRpYyBzaXplX3QKLWNvbXB1dGVfYnVja2V0X2NvdW50IChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc2l6ZV90IGR5bnN5bWNvdW50ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgc2l6ZV90IGJlc3Rfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2RlczsKLSAgdW5zaWduZWQgbG9uZyBpbnQgKmhhc2hjb2Rlc3A7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGk7Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIGFsbCBleHBvcnRlZCBzeW1ib2xzLiAgQXQgdGhlIHNhbWUKLSAgICAgdGltZSBzdG9yZSB0aGUgdmFsdWVzIGluIGFuIGFycmF5IHNvIHRoYXQgd2UgY291bGQgdXNlIHRoZW0gZm9yCi0gICAgIG9wdGltaXphdGlvbnMuICAqLwotICBoYXNoY29kZXMgPSAodW5zaWduZWQgbG9uZyBpbnQgKikgYmZkX21hbGxvYyAoZHluc3ltY291bnQKLQkJCQkJCSogc2l6ZW9mICh1bnNpZ25lZCBsb25nIGludCkpOwotICBpZiAoaGFzaGNvZGVzID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIGhhc2hjb2Rlc3AgPSBoYXNoY29kZXM7Ci0KLSAgLyogUHV0IGFsbCBoYXNoIHZhbHVlcyBpbiBIQVNIQ09ERVMuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9jb2xsZWN0X2hhc2hfY29kZXMsICZoYXNoY29kZXNwKTsKLQotLyogV2UgaGF2ZSBhIHByb2JsZW0gaGVyZS4gIFRoZSBmb2xsb3dpbmcgY29kZSB0byBvcHRpbWl6ZSB0aGUgdGFibGUKLSAgIHNpemUgcmVxdWlyZXMgYW4gaW50ZWdlciB0eXBlIHdpdGggbW9yZSB0aGUgMzIgYml0cy4gIElmCi0gICBCRkRfSE9TVF9VXzY0X0JJVCBpcyBzZXQgd2Uga25vdyBhYm91dCBzdWNoIGEgdHlwZS4gICovCi0jaWZkZWYgQkZEX0hPU1RfVV82NF9CSVQKLSAgaWYgKGluZm8tPm9wdGltaXplID09IHRydWUpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBpbnQgbnN5bXMgPSBoYXNoY29kZXNwIC0gaGFzaGNvZGVzOwotICAgICAgc2l6ZV90IG1pbnNpemU7Ci0gICAgICBzaXplX3QgbWF4c2l6ZTsKLSAgICAgIEJGRF9IT1NUX1VfNjRfQklUIGJlc3RfY2hsZW4gPSB+KChCRkRfSE9TVF9VXzY0X0JJVCkgMCk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCAqY291bnRzIDsKLQotICAgICAgLyogUG9zc2libGUgb3B0aW1pemF0aW9uIHBhcmFtZXRlcnM6IGlmIHdlIGhhdmUgTlNZTVMgc3ltYm9scyB3ZSBzYXkKLQkgdGhhdCB0aGUgaGFzaGluZyB0YWJsZSBtdXN0IGF0IGxlYXN0IGhhdmUgTlNZTVMvNCBhbmQgYXQgbW9zdAotCSAyKk5TWU1TIGJ1Y2tldHMuICAqLwotICAgICAgbWluc2l6ZSA9IG5zeW1zIC8gNDsKLSAgICAgIGlmIChtaW5zaXplID09IDApCi0JbWluc2l6ZSA9IDE7Ci0gICAgICBiZXN0X3NpemUgPSBtYXhzaXplID0gbnN5bXMgKiAyOwotCi0gICAgICAvKiBDcmVhdGUgYXJyYXkgd2hlcmUgd2UgY291bnQgdGhlIGNvbGxpc2lvbnMgaW4uICBXZSBtdXN0IHVzZSBiZmRfbWFsbG9jCi0JIHNpbmNlIHRoZSBzaXplIGNvdWxkIGJlIGxhcmdlLiAgKi8KLSAgICAgIGNvdW50cyA9ICh1bnNpZ25lZCBsb25nIGludCAqKSBiZmRfbWFsbG9jIChtYXhzaXplCi0JCQkJCQkgKiBzaXplb2YgKHVuc2lnbmVkIGxvbmcgaW50KSk7Ci0gICAgICBpZiAoY291bnRzID09IE5VTEwpCi0JewotCSAgZnJlZSAoaGFzaGNvZGVzKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogQ29tcHV0ZSB0aGUgIm9wdGltYWwiIHNpemUgZm9yIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGNyaXRlcmlhIGlzIGEKLQkgbWluaW1hbCBjaGFpbiBsZW5ndGguICBUaGUgbWlub3IgY3JpdGVyaWEgaXMgKG9mIGNvdXJzZSkgdGhlIHNpemUKLQkgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGZvciAoaSA9IG1pbnNpemU7IGkgPCBtYXhzaXplOyArK2kpCi0JewotCSAgLyogV2FsayB0aHJvdWdoIHRoZSBhcnJheSBvZiBoYXNoY29kZXMgYW5kIGNvdW50IHRoZSBjb2xsaXNpb25zLiAgKi8KLQkgIEJGRF9IT1NUX1VfNjRfQklUIG1heDsKLQkgIHVuc2lnbmVkIGxvbmcgaW50IGo7Ci0JICB1bnNpZ25lZCBsb25nIGludCBmYWN0OwotCi0JICBtZW1zZXQgKGNvdW50cywgJ1wwJywgaSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyBpbnQpKTsKLQotCSAgLyogRGV0ZXJtaW5lIGhvdyBvZnRlbiBlYWNoIGhhc2ggYnVja2V0IGlzIHVzZWQuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IG5zeW1zOyArK2opCi0JICAgICsrY291bnRzW2hhc2hjb2Rlc1tqXSAlIGldOwotCi0JICAvKiBGb3IgdGhlIHdlaWdodCBmdW5jdGlvbiB3ZSBuZWVkIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JICAgICBwYWdlc2l6ZSBvbiB0aGUgdGFyZ2V0LiAgVGhpcyBpcyBpbmZvcm1hdGlvbiBuZWVkIG5vdCBiZSAxMDAlCi0JICAgICBhY2N1cmF0ZS4gIFNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSAoc28gZmFyKSB3ZQotCSAgICAgZGVmaW5lIGl0IGhlcmUgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWUuICBJZiBpdCBpcyBjcnVjaWFsCi0JICAgICB0byBoYXZlIGEgYmV0dGVyIHZhbHVlIHNvbWUgZGF5IHNpbXBseSBkZWZpbmUgdGhpcyB2YWx1ZS4gICovCi0jIGlmbmRlZiBCRkRfVEFSR0VUX1BBR0VTSVpFCi0jICBkZWZpbmUgQkZEX1RBUkdFVF9QQUdFU0laRQkoNDA5NikKLSMgZW5kaWYKLQotCSAgLyogV2UgaW4gYW55IGNhc2UgbmVlZCAyICsgTlNZTVMgZW50cmllcyBmb3IgdGhlIHNpemUgdmFsdWVzIGFuZAotCSAgICAgdGhlIGNoYWlucy4gICovCi0JICBtYXggPSAoMiArIG5zeW1zKSAqIChBUkNIX1NJWkUgLyA4KTsKLQotIyBpZiAxCi0JICAvKiBWYXJpYW50IDE6IG9wdGltaXplIGZvciBzaG9ydCBjaGFpbnMuICBXZSBhZGQgdGhlIHNxdWFyZXMKLQkgICAgIG9mIGFsbCB0aGUgY2hhaW4gbGVuZ3RocyAod2hpY2ggZmF2b3VzIG1hbnkgc21hbGwgY2hhaW4KLQkgICAgIG92ZXIgYSBmZXcgbG9uZyBjaGFpbnMpLiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBpOyArK2opCi0JICAgIG1heCArPSBjb3VudHNbal0gKiBjb3VudHNbal07Ci0KLQkgIC8qIFRoaXMgYWRkcyBwZW5hbHRpZXMgZm9yIHRoZSBvdmVyYWxsIHNpemUgb2YgdGhlIHRhYmxlLiAgKi8KLQkgIGZhY3QgPSBpIC8gKEJGRF9UQVJHRVRfUEFHRVNJWkUgLyAoQVJDSF9TSVpFIC8gOCkpICsgMTsKLQkgIG1heCAqPSBmYWN0ICogZmFjdDsKLSMgZWxzZQotCSAgLyogVmFyaWFudCAyOiBPcHRpbWl6ZSBhIGxvdCBtb3JlIGZvciBzbWFsbCB0YWJsZS4gIEhlcmUgd2UKLQkgICAgIGFsc28gYWRkIHNxdWFyZXMgb2YgdGhlIHNpemUgYnV0IHdlIGFsc28gYWRkIHBlbmFsdGllcyBmb3IKLQkgICAgIGVtcHR5IHNsb3RzICh0aGUgKzEgdGVybSkuICAqLwotCSAgZm9yIChqID0gMDsgaiA8IGk7ICsraikKLQkgICAgbWF4ICs9ICgxICsgY291bnRzW2pdKSAqICgxICsgY291bnRzW2pdKTsKLQotCSAgLyogVGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgdGFibGUgaXMgY29uc2lkZXJlZCwgYnV0IG5vdCBhcwotCSAgICAgc3Ryb25nIGFzIGluIHZhcmlhbnQgMSwgd2hlcmUgaXQgaXMgc3F1YXJlZC4gICovCi0JICBmYWN0ID0gaSAvIChCRkRfVEFSR0VUX1BBR0VTSVpFIC8gKEFSQ0hfU0laRSAvIDgpKSArIDE7Ci0JICBtYXggKj0gZmFjdDsKLSMgZW5kaWYKLQotCSAgLyogQ29tcGFyZSB3aXRoIGN1cnJlbnQgYmVzdCByZXN1bHRzLiAgKi8KLQkgIGlmIChtYXggPCBiZXN0X2NobGVuKQotCSAgICB7Ci0JICAgICAgYmVzdF9jaGxlbiA9IG1heDsKLQkgICAgICBiZXN0X3NpemUgPSBpOwotCSAgICB9Ci0JfQotCi0gICAgICBmcmVlIChjb3VudHMpOwotICAgIH0KLSAgZWxzZQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9IT1NUX1VfNjRfQklUKSAqLwotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgdGhlIGZhbGxiYWNrIHNvbHV0aW9uIGlmIG5vIDY0Yml0IHR5cGUgaXMgYXZhaWxhYmxlIG9yIGlmIHdlCi0JIGFyZSBub3Qgc3VwcG9zZWQgdG8gc3BlbmQgbXVjaCB0aW1lIG9uIG9wdGltaXphdGlvbnMuICBXZSBzZWxlY3QgdGhlCi0JIGJ1Y2tldCBjb3VudCB1c2luZyBhIGZpeGVkIHNldCBvZiBudW1iZXJzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGVsZl9idWNrZXRzW2ldICE9IDA7IGkrKykKLQl7Ci0JICBiZXN0X3NpemUgPSBlbGZfYnVja2V0c1tpXTsKLQkgIGlmIChkeW5zeW1jb3VudCA8IGVsZl9idWNrZXRzW2kgKyAxXSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBGcmVlIHRoZSBhcnJheXMgd2UgbmVlZGVkLiAgKi8KLSAgZnJlZSAoaGFzaGNvZGVzKTsKLQotICByZXR1cm4gYmVzdF9zaXplOwotfQotCi0vKiBSZW1vdmUgU0VDVElPTiBmcm9tIHRoZSBCRkQuICBJZiBhIHN5bWJvbCBmb3IgU0VDVElPTiB3YXMgZ29pbmcgdG8KLSAgIGJlIHB1dCBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgcmVtb3ZlIGl0LCBhbmQgcmVudW1iZXIKLSAgIHN1YnNlcXVlbnQgZW50cmllcy4gICovCi0KLXN0YXRpYyB2b2lkCi1lbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMgKGluZm8sIHNlY3Rpb24pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgLyogUmVtb3ZlIHRoZSBzZWN0aW9uIGZyb20gdGhlIG91dHB1dCBsaXN0LiAgKi8KLSAgX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzZWN0aW9uKTsKLQotICBpZiAoZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pLT5keW5pbmR4KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgaW50IGluY3JlbWVudCA9IC0xOwotCi0gICAgICAvKiBXZSB3ZXJlIGdvaW5nIHRvIG91dHB1dCBhbiBlbnRyeSBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUKLQkgZm9yIHRoZSBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGlzIHNlY3Rpb24uICBOb3csIHRoZQotCSBzZWN0aW9uIGlzIGdvbmUuICBTbywgd2UgbXVzdCByZW51bWJlciB0aGUgZHluYW1pYyBpbmRpY2VzIG9mCi0JIGFsbCBzdWJzZXF1ZW50IHNlY3Rpb25zIGFuZCBhbGwgb3RoZXIgZW50cmllcyBpbiB0aGUgZHluYW1pYwotCSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgZWxmX3NlY3Rpb25fZGF0YSAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pLT5keW5pbmR4ID0gMDsKLSAgICAgIGZvciAocyA9IHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5uZXh0OyBzOyBzID0gcy0+bmV4dCkKLQlpZiAoZWxmX3NlY3Rpb25fZGF0YSAocyktPmR5bmluZHgpCi0JICAtLWVsZl9zZWN0aW9uX2RhdGEgKHMpLT5keW5pbmR4OwotICAgICAgCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBfYmZkX2VsZl9saW5rX2FkanVzdF9keW5pbmR4LAotCQkJICAgICAgJmluY3JlbWVudCk7Ci0KLSAgICAgIC8qIFRoZXJlIGlzIG9uZSBsZXNzIGR5bmFtaWMgc3ltYm9sIHRoYW4gdGhlcmUgd2FzIGJlZm9yZS4gICovCi0gICAgICAtLWVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0gICAgfQotfQotCi0vKiBTZXQgdXAgdGhlIHNpemVzIGFuZCBjb250ZW50cyBvZiB0aGUgRUxGIGR5bmFtaWMgc2VjdGlvbnMuICBUaGlzIGlzCi0gICBjYWxsZWQgYnkgdGhlIEVMRiBsaW5rZXIgZW11bGF0aW9uIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUuICBXZQotICAgbXVzdCBzZXQgdGhlIHNpemVzIG9mIHRoZSBzZWN0aW9ucyBiZWZvcmUgdGhlIGxpbmtlciBzZXRzIHRoZQotICAgYWRkcmVzc2VzIG9mIHRoZSB2YXJpb3VzIHNlY3Rpb25zLiAgKi8KLQotYm9vbGVhbgotTkFNRShiZmRfZWxmLHNpemVfZHluYW1pY19zZWN0aW9ucykgKG91dHB1dF9iZmQsIHNvbmFtZSwgcnBhdGgsCi0JCQkJICAgICBleHBvcnRfZHluYW1pYywgZmlsdGVyX3NobGliLAotCQkJCSAgICAgYXV4aWxpYXJ5X2ZpbHRlcnMsIGluZm8sIHNpbnRlcnBwdHIsCi0JCQkJICAgICB2ZXJkZWZzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcnBhdGg7Ci0gICAgIGJvb2xlYW4gZXhwb3J0X2R5bmFtaWM7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9zaGxpYjsKLSAgICAgY29uc3QgY2hhciAqIGNvbnN0ICphdXhpbGlhcnlfZmlsdGVyczsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICoqc2ludGVycHB0cjsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJkZWZzOwotewotICBiZmRfc2l6ZV90eXBlIHNvbmFtZV9pbmR4OwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLSAgYmZkX3NpemVfdHlwZSBvbGRfZHluc3ltY291bnQ7Ci0gIHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8gYXN2aW5mbzsKLQotICAqc2ludGVycHB0ciA9IE5VTEw7Ci0KLSAgc29uYW1lX2luZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3ItPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBUaGUgYmFja2VuZCBtYXkgaGF2ZSB0byBjcmVhdGUgc29tZSBzZWN0aW9ucyByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLSAgICAgd2UncmUgZHluYW1pYyBvciBub3QuICAqLwotICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAob3V0cHV0X2JmZCk7Ci0gIGlmIChiZWQtPmVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0gICAgICAmJiAhICgqYmVkLT5lbGZfYmFja2VuZF9hbHdheXNfc2l6ZV9zZWN0aW9ucykgKG91dHB1dF9iZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBJZiB0aGVyZSB3ZXJlIG5vIGR5bmFtaWMgb2JqZWN0cyBpbiB0aGUgbGluaywgdGhlcmUgaXMgbm90aGluZyB0bwotICAgICBkbyBoZXJlLiAgKi8KLSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHdlIGFyZSBzdXBwb3NlZCB0byBleHBvcnQgYWxsIHN5bWJvbHMgaW50byB0aGUgZHluYW1pYyBzeW1ib2wKLSAgICAgdGFibGUgKHRoaXMgaXMgbm90IHRoZSBub3JtYWwgY2FzZSksIHRoZW4gZG8gc28uICAqLwotICBpZiAoZXhwb3J0X2R5bmFtaWMpCi0gICAgewotICAgICAgc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCBlaWY7Ci0KLSAgICAgIGVpZi5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGVpZi5pbmZvID0gaW5mbzsKLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgZWxmX2V4cG9ydF9zeW1ib2wsCi0JCQkgICAgICAoUFRSKSAmZWlmKTsKLSAgICAgIGlmIChlaWYuZmFpbGVkKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgZWlmOwotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN0cnNpemU7Ci0KLSAgICAgICpzaW50ZXJwcHRyID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5pbnRlcnAiKTsKLSAgICAgIEJGRF9BU1NFUlQgKCpzaW50ZXJwcHRyICE9IE5VTEwgfHwgaW5mby0+c2hhcmVkKTsKLQotICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMKQotCXsKLQkgIHNvbmFtZV9pbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgIHNvbmFtZSwgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoc29uYW1lX2luZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCi0JICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NPTkFNRSwgc29uYW1lX2luZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+c3ltYm9saWMpCi0JewotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1CT0xJQywgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChycGF0aCAhPSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsIHJwYXRoLAotCQkJCSAgICAgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfUlBBVEgsIGluZHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoZmlsdGVyX3NobGliICE9IE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkgICAgIGZpbHRlcl9zaGxpYiwgdHJ1ZSwgdHJ1ZSk7Ci0JICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEKLQkgICAgICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfRklMVEVSLCBpbmR4KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGF1eGlsaWFyeV9maWx0ZXJzICE9IE5VTEwpCi0JewotCSAgY29uc3QgY2hhciAqIGNvbnN0ICpwOwotCi0JICBmb3IgKHAgPSBhdXhpbGlhcnlfZmlsdGVyczsgKnAgIT0gTlVMTDsgcCsrKQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAqcCwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xCi0JCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0FVWElMSUFSWSwgaW5keCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogQXR0YWNoIGFsbCB0aGUgc3ltYm9scyB0byB0aGVpciB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGFzdmluZm8ub3V0cHV0X2JmZCA9IG91dHB1dF9iZmQ7Ci0gICAgICBhc3ZpbmZvLmluZm8gPSBpbmZvOwotICAgICAgYXN2aW5mby52ZXJkZWZzID0gdmVyZGVmczsKLSAgICAgIGFzdmluZm8uZXhwb3J0X2R5bmFtaWMgPSBleHBvcnRfZHluYW1pYzsKLSAgICAgIGFzdmluZm8ucmVtb3ZlZF9keW5hbWljID0gZmFsc2U7Ci0gICAgICBhc3ZpbmZvLmZhaWxlZCA9IGZhbHNlOwotCi0gICAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgICBlbGZfbGlua19hc3NpZ25fc3ltX3ZlcnNpb24sCi0JCQkgICAgICAoUFRSKSAmYXN2aW5mbyk7Ci0gICAgICBpZiAoYXN2aW5mby5mYWlsZWQpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGaW5kIGFsbCBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGFuZCBtYWtlCi0JIHRoZSBiYWNrZW5kIHBpY2sgYSByZWFzb25hYmxlIHZhbHVlIGZvciB0aGVtLiAgKi8KLSAgICAgIGVpZi5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGVpZi5pbmZvID0gaW5mbzsKLSAgICAgIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICAgIGVsZl9hZGp1c3RfZHluYW1pY19zeW1ib2wsCi0JCQkgICAgICAoUFRSKSAmZWlmKTsKLSAgICAgIGlmIChlaWYuZmFpbGVkKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWRkIHNvbWUgZW50cmllcyB0byB0aGUgLmR5bmFtaWMgc2VjdGlvbi4gIFdlIGZpbGwgaW4gc29tZSBvZiB0aGUKLQkgdmFsdWVzIGxhdGVyLCBpbiBlbGZfYmZkX2ZpbmFsX2xpbmssIGJ1dCB3ZSBtdXN0IGFkZCB0aGUgZW50cmllcwotCSBub3cgc28gdGhhdCB3ZSBrbm93IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAuZHluYW1pYyBzZWN0aW9uLiAgKi8KLQotICAgICAgLyogSWYgdGhlcmUgYXJlIGluaXRpYWxpemF0aW9uIGFuZC9vciBmaW5hbGl6YXRpb24gZnVuY3Rpb25zIHRvCi0JIGNhbGwgdGhlbiBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgRFRfSU5JVC9EVF9GSU5JIGVudHJpZXMuICAqLwotICAgICAgaCA9IChpbmZvLT5pbml0X2Z1bmN0aW9uCi0JICAgPyBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICBpbmZvLT5pbml0X2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JICAgOiBOVUxMKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0lOSVQsIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaCA9IChpbmZvLT5maW5pX2Z1bmN0aW9uCi0JICAgPyBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCAKLQkJCQkgICBpbmZvLT5maW5pX2Z1bmN0aW9uLCBmYWxzZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UpCi0JICAgOiBOVUxMKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgKEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIKLQkJCQkJfCBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSkgIT0gMCkKLQl7Ci0JICBpZiAoISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX0ZJTkksIDApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBzdHJzaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpOwotICAgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9IQVNILCAwKQotCSAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1NUUlRBQiwgMCkKLQkgIHx8ICEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9TWU1UQUIsIDApCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1RSU1osIHN0cnNpemUpCi0JICB8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfU1lNRU5ULAotCQkJCSAgICAgIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIGJhY2tlbmQgbXVzdCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYWxsIHRoZSBvdGhlciBkeW5hbWljCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgb2xkX2R5bnN5bWNvdW50ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLSAgaWYgKGJlZC0+ZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gICAgICAmJiAhICgqYmVkLT5lbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMpIChvdXRwdXRfYmZkLCBpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBkeW5zeW1jb3VudDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgc2l6ZV90IGJ1Y2tldGNvdW50ID0gMDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gaXN5bTsKLQotICAgICAgLyogU2V0IHVwIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nbnUudmVyc2lvbl9kIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICAvKiBXZSBtYXkgaGF2ZSBjcmVhdGVkIGFkZGl0aW9uYWwgdmVyc2lvbiBkZWZpbml0aW9ucyBpZiB3ZSBhcmUKLSAgICAgICAgIGp1c3QgbGlua2luZyBhIHJlZ3VsYXIgYXBwbGljYXRpb24uICAqLwotICAgICAgdmVyZGVmcyA9IGFzdmluZm8udmVyZGVmczsKLQotICAgICAgaWYgKHZlcmRlZnMgPT0gTlVMTCkKLQllbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMgKGluZm8sIHMpOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBjZGVmczsKLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLQkgIGJmZF9ieXRlICpwOwotCSAgRWxmX0ludGVybmFsX1ZlcmRlZiBkZWY7Ci0JICBFbGZfSW50ZXJuYWxfVmVyZGF1eCBkZWZhdXg7Ci0KLQkgIGlmIChhc3ZpbmZvLnJlbW92ZWRfZHluYW1pYykKLQkgICAgewotCSAgICAgIC8qIFNvbWUgZHluYW1pYyBzeW1ib2xzIHdlcmUgY2hhbmdlZCB0byBiZSBsb2NhbAotCQkgc3ltYm9scy4gIEluIHRoaXMgY2FzZSwgd2UgcmVudW1iZXIgYWxsIG9mIHRoZQotCQkgZHluYW1pYyBzeW1ib2xzLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgYSBob2xlLiAgSWYKLQkJIHRoZSBiYWNrZW5kIGNoYW5nZWQgZHluc3ltY291bnQsIHRoZW4gYXNzdW1lIHRoYXQgdGhlCi0JCSBuZXcgc3ltYm9scyBhcmUgYXQgdGhlIHN0YXJ0LiAgVGhpcyBpcyB0aGUgY2FzZSBvbgotCQkgdGhlIE1JUFMuICBGSVhNRTogVGhlIG5hbWVzIG9mIHRoZSByZW1vdmVkIHN5bWJvbHMKLQkJIHdpbGwgc3RpbGwgYmUgaW4gdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlLCB3YXN0aW5nCi0JCSBzcGFjZS4gICovCi0JICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCA9Ci0JCTEgKyAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudCAtIG9sZF9keW5zeW1jb3VudCk7Ci0JICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCSAgICAgIGVsZl9saW5rX3JlbnVtYmVyX2R5bnN5bXMsCi0JCQkJICAgICAgKFBUUikgaW5mbyk7Ci0JICAgIH0KLQotCSAgY2RlZnMgPSAwOwotCSAgc2l6ZSA9IDA7Ci0KLQkgIC8qIE1ha2Ugc3BhY2UgZm9yIHRoZSBiYXNlIHZlcnNpb24uICAqLwotCSAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICsrY2RlZnM7Ci0KLQkgIGZvciAodCA9IHZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm47Ci0KLQkgICAgICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICAgICAgc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgICArK2NkZWZzOwotCi0JICAgICAgZm9yIChuID0gdC0+ZGVwczsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgfQotCi0JICBzLT5fcmF3X3NpemUgPSBzaXplOwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotCSAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgLyogRmlsbCBpbiB0aGUgdmVyc2lvbiBkZWZpbml0aW9uIHNlY3Rpb24uICAqLwotCi0JICBwID0gcy0+Y29udGVudHM7Ci0KLQkgIGRlZi52ZF92ZXJzaW9uID0gVkVSX0RFRl9DVVJSRU5UOwotCSAgZGVmLnZkX2ZsYWdzID0gVkVSX0ZMR19CQVNFOwotCSAgZGVmLnZkX25keCA9IDE7Ci0JICBkZWYudmRfY250ID0gMTsKLQkgIGRlZi52ZF9hdXggPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCSAgZGVmLnZkX25leHQgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKQotCQkJICsgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCkpOwotCi0JICBpZiAoc29uYW1lX2luZHggIT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCSAgICB7Ci0JICAgICAgZGVmLnZkX2hhc2ggPSBiZmRfZWxmX2hhc2ggKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHNvbmFtZSk7Ci0JICAgICAgZGVmYXV4LnZkYV9uYW1lID0gc29uYW1lX2luZHg7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JICAgICAgbmFtZSA9IG91dHB1dF9iZmQtPmZpbGVuYW1lOwotCSAgICAgIGRlZi52ZF9oYXNoID0gYmZkX2VsZl9oYXNoICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSBuYW1lKTsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0ciwKLQkJCQkJICAgIG5hbWUsIHRydWUsIGZhbHNlKTsKLQkgICAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkZWZhdXgudmRhX25hbWUgPSBpbmR4OwotCSAgICB9Ci0JICBkZWZhdXgudmRhX25leHQgPSAwOwotCi0JICBfYmZkX2VsZl9zd2FwX3ZlcmRlZl9vdXQgKG91dHB1dF9iZmQsICZkZWYsCi0JCQkJICAgIChFbGZfRXh0ZXJuYWxfVmVyZGVmICopcCk7Ci0JICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRlZik7Ci0JICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCSAgICAgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCSAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQotCSAgZm9yICh0ID0gdmVyZGVmczsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBjZGVwczsKLQkgICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKm47Ci0JICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBjZGVwcyA9IDA7Ci0JICAgICAgZm9yIChuID0gdC0+ZGVwczsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJKytjZGVwczsKLQotCSAgICAgIC8qIEFkZCBhIHN5bWJvbCByZXByZXNlbnRpbmcgdGhpcyB2ZXJzaW9uLiAgKi8KLQkgICAgICBoID0gTlVMTDsKLQkgICAgICBpZiAoISAoX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQkJICAgICAoaW5mbywgZHlub2JqLCB0LT5uYW1lLCBCU0ZfR0xPQkFMLCBiZmRfYWJzX3NlY3Rpb25fcHRyLAotCQkgICAgICAoYmZkX3ZtYSkgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZmFsc2UsCi0JCSAgICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopLT5jb2xsZWN0LAotCQkgICAgICAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopICZoKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzICY9IH4gRUxGX0xJTktfTk9OX0VMRjsKLQkgICAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0JICAgICAgaC0+dHlwZSA9IFNUVF9PQkpFQ1Q7Ci0JICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQotCSAgICAgIGlmICghIF9iZmRfZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZGVmLnZkX3ZlcnNpb24gPSBWRVJfREVGX0NVUlJFTlQ7Ci0JICAgICAgZGVmLnZkX2ZsYWdzID0gMDsKLQkgICAgICBpZiAodC0+Z2xvYmFscyA9PSBOVUxMICYmIHQtPmxvY2FscyA9PSBOVUxMICYmICEgdC0+dXNlZCkKLQkJZGVmLnZkX2ZsYWdzIHw9IFZFUl9GTEdfV0VBSzsKLQkgICAgICBkZWYudmRfbmR4ID0gdC0+dmVybnVtICsgMTsKLQkgICAgICBkZWYudmRfY250ID0gY2RlcHMgKyAxOwotCSAgICAgIGRlZi52ZF9oYXNoID0gYmZkX2VsZl9oYXNoICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSB0LT5uYW1lKTsKLQkgICAgICBkZWYudmRfYXV4ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGVmKTsKLQkgICAgICBpZiAodC0+bmV4dCAhPSBOVUxMKQotCQlkZWYudmRfbmV4dCA9IChzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpCi0JCQkgICAgICAgKyAoY2RlcHMgKyAxKSAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpKTsKLQkgICAgICBlbHNlCi0JCWRlZi52ZF9uZXh0ID0gMDsKLQotCSAgICAgIF9iZmRfZWxmX3N3YXBfdmVyZGVmX291dCAob3V0cHV0X2JmZCwgJmRlZiwKLQkJCQkJKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgcCk7Ci0JICAgICAgcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkZWYpOwotCi0JICAgICAgZGVmYXV4LnZkYV9uYW1lID0gaC0+ZHluc3RyX2luZGV4OwotCSAgICAgIGlmICh0LT5kZXBzID09IE5VTEwpCi0JCWRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0JICAgICAgZWxzZQotCQlkZWZhdXgudmRhX25leHQgPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJkYXV4KTsKLQkgICAgICB0LT5uYW1lX2luZHggPSBkZWZhdXgudmRhX25hbWU7Ci0KLQkgICAgICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCQkgKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHApOwotCSAgICAgIHAgKz0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0KLQkgICAgICBmb3IgKG4gPSB0LT5kZXBzOyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQl7Ci0JCSAgaWYgKG4tPnZlcnNpb25fbmVlZGVkID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlCi0JCQkgdmVyc2lvbiBzY3JpcHQuICAqLwotCQkgICAgICBkZWZhdXgudmRhX25hbWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGRlZmF1eC52ZGFfbmFtZSA9IG4tPnZlcnNpb25fbmVlZGVkLT5uYW1lX2luZHg7Ci0JCSAgaWYgKG4tPm5leHQgPT0gTlVMTCkKLQkJICAgIGRlZmF1eC52ZGFfbmV4dCA9IDA7Ci0JCSAgZWxzZQotCQkgICAgZGVmYXV4LnZkYV9uZXh0ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCk7Ci0KLQkJICBfYmZkX2VsZl9zd2FwX3ZlcmRhdXhfb3V0IChvdXRwdXRfYmZkLCAmZGVmYXV4LAotCQkJCQkgICAgIChFbGZfRXh0ZXJuYWxfVmVyZGF1eCAqKSBwKTsKLQkJICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1ZlcmRhdXgpOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJERUYsIDApCi0JICAgICAgfHwgISBlbGZfYWRkX2R5bmFtaWNfZW50cnkgKGluZm8sIERUX1ZFUkRFRk5VTSwgY2RlZnMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJkZWZzID0gY2RlZnM7Ci0JfQotCi0gICAgICAvKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgdmVyc2lvbiByZWZlcmVuY2Ugc2VjdGlvbi4gICovCi0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uX3IiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICB7Ci0Jc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvIHNpbmZvOwotCi0Jc2luZm8ub3V0cHV0X2JmZCA9IG91dHB1dF9iZmQ7Ci0Jc2luZm8uaW5mbyA9IGluZm87Ci0Jc2luZm8udmVycyA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPmN2ZXJkZWZzOwotCWlmIChzaW5mby52ZXJzID09IDApCi0JICBzaW5mby52ZXJzID0gMTsKLQlzaW5mby5mYWlsZWQgPSBmYWxzZTsKLQotCWVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQllbGZfbGlua19maW5kX3ZlcnNpb25fZGVwZW5kZW5jaWVzLAotCQkJCShQVFIpICZzaW5mbyk7Ci0KLQlpZiAoZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmID09IE5VTEwpCi0JICBlbGZfbGlua19yZW1vdmVfc2VjdGlvbl9hbmRfYWRqdXN0X2R5bmluZGljZXMgKGluZm8sIHMpOwotCWVsc2UKLQkgIHsKLQkgICAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7Ci0JICAgIHVuc2lnbmVkIGludCBzaXplOwotCSAgICB1bnNpZ25lZCBpbnQgY3JlZnM7Ci0JICAgIGJmZF9ieXRlICpwOwotCi0JICAgIC8qIEJ1aWxkIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbi4gICovCi0JICAgIHNpemUgPSAwOwotCSAgICBjcmVmcyA9IDA7Ci0JICAgIGZvciAodCA9IGVsZl90ZGF0YSAob3V0cHV0X2JmZCktPnZlcnJlZjsKLQkJIHQgIT0gTlVMTDsKLQkJIHQgPSB0LT52bl9uZXh0cmVmKQotCSAgICAgIHsKLQkJRWxmX0ludGVybmFsX1Zlcm5hdXggKmE7Ci0KLQkJc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKLQkJKytjcmVmczsKLQkJZm9yIChhID0gdC0+dm5fYXV4cHRyOyBhICE9IE5VTEw7IGEgPSBhLT52bmFfbmV4dHB0cikKLQkJICBzaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5hdXgpOwotCSAgICAgIH0KLQotCSAgICBzLT5fcmF3X3NpemUgPSBzaXplOwotCSAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHNpemUpOwotCSAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgcCA9IHMtPmNvbnRlbnRzOwotCSAgICBmb3IgKHQgPSBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT52ZXJyZWY7Ci0JCSB0ICE9IE5VTEw7Ci0JCSB0ID0gdC0+dm5fbmV4dHJlZikKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBjYXV4OwotCQlFbGZfSW50ZXJuYWxfVmVybmF1eCAqYTsKLQkJYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JCWNhdXggPSAwOwotCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgICsrY2F1eDsKLQotCQl0LT52bl92ZXJzaW9uID0gVkVSX05FRURfQ1VSUkVOVDsKLQkJdC0+dm5fY250ID0gY2F1eDsKLQkJaWYgKGVsZl9kdF9uYW1lICh0LT52bl9iZmQpICE9IE5VTEwpCi0JCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAgICAgZWxmX2R0X25hbWUgKHQtPnZuX2JmZCksCi0JCQkJCSAgICAgdHJ1ZSwgZmFsc2UpOwotCQllbHNlCi0JCSAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIsCi0JCQkJCSAgICAgdC0+dm5fYmZkLT5maWxlbmFtZSwgdHJ1ZSwgZmFsc2UpOwotCQlpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQl0LT52bl9maWxlID0gaW5keDsKLQkJdC0+dm5fYXV4ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmVlZCk7Ci0JCWlmICh0LT52bl9uZXh0cmVmID09IE5VTEwpCi0JCSAgdC0+dm5fbmV4dCA9IDA7Ci0JCWVsc2UKLQkJICB0LT52bl9uZXh0ID0gKHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5lZWQpCi0JCQkJKyBjYXV4ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCkpOwotCi0JCV9iZmRfZWxmX3N3YXBfdmVybmVlZF9vdXQgKG91dHB1dF9iZmQsIHQsCi0JCQkJCSAgIChFbGZfRXh0ZXJuYWxfVmVybmVlZCAqKSBwKTsKLQkJcCArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJuZWVkKTsKLQotCQlmb3IgKGEgPSB0LT52bl9hdXhwdHI7IGEgIT0gTlVMTDsgYSA9IGEtPnZuYV9uZXh0cHRyKQotCQkgIHsKLQkJICAgIGEtPnZuYV9oYXNoID0gYmZkX2VsZl9oYXNoICgoY29uc3QgdW5zaWduZWQgY2hhciAqKQotCQkJCQkJYS0+dm5hX25vZGVuYW1lKTsKLQkJICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3RyLAotCQkJCQkgICAgICAgYS0+dm5hX25vZGVuYW1lLCB0cnVlLCBmYWxzZSk7Ci0JCSAgICBpZiAoaW5keCA9PSAoYmZkX3NpemVfdHlwZSkgLTEpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGEtPnZuYV9uYW1lID0gaW5keDsKLQkJICAgIGlmIChhLT52bmFfbmV4dHB0ciA9PSBOVUxMKQotCQkgICAgICBhLT52bmFfbmV4dCA9IDA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGEtPnZuYV9uZXh0ID0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfVmVybmF1eCk7Ci0KLQkJICAgIF9iZmRfZWxmX3N3YXBfdmVybmF1eF9vdXQgKG91dHB1dF9iZmQsIGEsCi0JCQkJCSAgICAgICAoRWxmX0V4dGVybmFsX1Zlcm5hdXggKikgcCk7Ci0JCSAgICBwICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1Zlcm5hdXgpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgaWYgKCEgZWxmX2FkZF9keW5hbWljX2VudHJ5IChpbmZvLCBEVF9WRVJORUVELCAwKQotCQl8fCAhIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSTkVFRE5VTSwgY3JlZnMpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBlbGZfdGRhdGEgKG91dHB1dF9iZmQpLT5jdmVycmVmcyA9IGNyZWZzOwotCSAgfQotICAgICAgfQotCi0gICAgICBkeW5zeW1jb3VudCA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0KLSAgICAgIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdmVyc2lvbiBzZWN0aW9uLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdudS52ZXJzaW9uIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgaWYgKGR5bnN5bWNvdW50ID09IDAKLQkgIHx8ICh2ZXJkZWZzID09IE5VTEwgJiYgZWxmX3RkYXRhIChvdXRwdXRfYmZkKS0+dmVycmVmID09IE5VTEwpKQotCXsKLQkgIGVsZl9saW5rX3JlbW92ZV9zZWN0aW9uX2FuZF9hZGp1c3RfZHluaW5kaWNlcyAoaW5mbywgcyk7Ci0JICAvKiBUaGUgRFlOU1lNQ09VTlQgbWlnaHQgaGF2ZSBjaGFuZ2VkIGlmIHdlIHdlcmUgZ29pbmcgdG8KLQkgICAgIG91dHB1dCBhIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJ5IGZvciBTLiAgKi8KLQkgIGR5bnN5bWNvdW50ID0gZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zeW1jb3VudDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcy0+X3Jhd19zaXplID0gZHluc3ltY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9WZXJzeW0pOwotCSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLQkgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfVkVSU1lNLCAwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogU2V0IHRoZSBzaXplIG9mIHRoZSAuZHluc3ltIGFuZCAuaGFzaCBzZWN0aW9ucy4gIFdlIGNvdW50ZWQKLQkgdGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMgaW4gZWxmX2xpbmtfYWRkX29iamVjdF9zeW1ib2xzLgotCSBXZSB3aWxsIGJ1aWxkIHRoZSBjb250ZW50cyBvZiAuZHluc3ltIGFuZCAuaGFzaCB3aGVuIHdlIGJ1aWxkCi0JIHRoZSBmaW5hbCBzeW1ib2wgdGFibGUsIGJlY2F1c2UgdW50aWwgdGhlbiB3ZSBkbyBub3Qga25vdyB0aGUKLQkgY29ycmVjdCB2YWx1ZSB0byBnaXZlIHRoZSBzeW1ib2xzLiAgV2UgYnVpbHQgdGhlIC5keW5zdHIKLQkgc2VjdGlvbiBhcyB3ZSB3ZW50IGFsb25nIGluIGVsZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scy4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zeW0iKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBkeW5zeW1jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gICAgICBzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKG91dHB1dF9iZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBlbnRyeSBpbiAuZHluc3ltIGlzIGEgZHVtbXkgc3ltYm9sLiAgKi8KLSAgICAgIGlzeW0uc3RfdmFsdWUgPSAwOwotICAgICAgaXN5bS5zdF9zaXplID0gMDsKLSAgICAgIGlzeW0uc3RfbmFtZSA9IDA7Ci0gICAgICBpc3ltLnN0X2luZm8gPSAwOwotICAgICAgaXN5bS5zdF9vdGhlciA9IDA7Ci0gICAgICBpc3ltLnN0X3NobmR4ID0gMDsKLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKG91dHB1dF9iZmQsICZpc3ltLAotCQkJICAgKFBUUikgKEVsZl9FeHRlcm5hbF9TeW0gKikgcy0+Y29udGVudHMpOwotCi0gICAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBoYXNoaW5nIHRhYmxlLiAgQXMgYSBzaWRlIGVmZmVjdCB0aGlzCi0JIGNvbXB1dGVzIHRoZSBoYXNoIHZhbHVlcyBmb3IgYWxsIHRoZSBuYW1lcyB3ZSBleHBvcnQuICAqLwotICAgICAgYnVja2V0Y291bnQgPSBjb21wdXRlX2J1Y2tldF9jb3VudCAoaW5mbyk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSAoMiArIGJ1Y2tldGNvdW50ICsgZHluc3ltY291bnQpICogKEFSQ0hfU0laRSAvIDgpOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLQotICAgICAgcHV0X3dvcmQgKG91dHB1dF9iZmQsIGJ1Y2tldGNvdW50LCBzLT5jb250ZW50cyk7Ci0gICAgICBwdXRfd29yZCAob3V0cHV0X2JmZCwgZHluc3ltY291bnQsIHMtPmNvbnRlbnRzICsgKEFSQ0hfU0laRSAvIDgpKTsKLQotICAgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudCA9IGJ1Y2tldGNvdW50OwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN0cik7Ci0KLSAgICAgIGlmICghIGVsZl9hZGRfZHluYW1pY19lbnRyeSAoaW5mbywgRFRfTlVMTCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZpeCB1cCB0aGUgZmxhZ3MgZm9yIGEgc3ltYm9sLiAgVGhpcyBoYW5kbGVzIHZhcmlvdXMgY2FzZXMgd2hpY2gKLSAgIGNhbiBvbmx5IGJlIGZpeGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgYXJlIHNlZW4uICBUaGlzIGlzCi0gICBjdXJyZW50bHkgY2FsbGVkIGJ5IGJvdGggYWRqdXN0X2R5bmFtaWNfc3ltYm9sIGFuZAotICAgYXNzaWduX3N5bV92ZXJzaW9uLCB3aGljaCBpcyB1bm5lY2Vzc2FyeSBidXQgcGVyaGFwcyBtb3JlIHJvYnVzdCBpbgotICAgdGhlIGZhY2Ugb2YgZnV0dXJlIGNoYW5nZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2ZpeF9zeW1ib2xfZmxhZ3MgKGgsIGVpZikKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZjsKLXsKLSAgLyogSWYgdGhpcyBzeW1ib2wgd2FzIG1lbnRpb25lZCBpbiBhIG5vbi1FTEYgZmlsZSwgdHJ5IHRvIHNldAotICAgICBERUZfUkVHVUxBUiBhbmQgUkVGX1JFR1VMQVIgY29ycmVjdGx5LiAgVGhpcyBpcyB0aGUgb25seSB3YXkgdG8KLSAgICAgcGVybWl0IGEgbm9uLUVMRiBmaWxlIHRvIGNvcnJlY3RseSByZWZlciB0byBhIHN5bWJvbCBkZWZpbmVkIGluCi0gICAgIGFuIEVMRiBkeW5hbWljIG9iamVjdC4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX05PTl9FTEYpICE9IDApCi0gICAgewotICAgICAgaWYgKGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCSAgIHwgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUl9OT05XRUFLKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgICAgJiYgKGJmZF9nZXRfZmxhdm91ciAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcikKLQkJICA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKSkKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSAoRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUgotCQkJCSAgICAgICB8IEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSyk7Ci0JICBlbHNlCi0JICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUjsKLQl9Ci0KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xCi0JICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKSAhPSAwCi0JICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKSkKLQl7Ci0JICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoZWlmLT5pbmZvLCBoKSkKLQkgICAgewotCSAgICAgIGVpZi0+ZmFpbGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVW5mb3J0dW5hdGVseSwgRUxGX0xJTktfTk9OX0VMRiBpcyBvbmx5IGNvcnJlY3QgaWYgdGhlIHN5bWJvbAotICAgICAgICAgd2FzIGZpcnN0IHNlZW4gaW4gYSBub24tRUxGIGZpbGUuICBGb3J0dW5hdGVseSwgaWYgdGhlIHN5bWJvbAotICAgICAgICAgd2FzIGZpcnN0IHNlZW4gaW4gYW4gRUxGIGZpbGUsIHdlJ3JlIHByb2JhYmx5IE9LIHVubGVzcyB0aGUKLSAgICAgICAgIHN5bWJvbCB3YXMgZGVmaW5lZCBpbiBhIG5vbi1FTEYgZmlsZS4gIENhdGNoIHRoYXQgY2FzZSBoZXJlLgotICAgICAgICAgRklYTUU6IFdlJ3JlIHN0aWxsIGluIHRyb3VibGUgaWYgdGhlIHN5bWJvbCB3YXMgZmlyc3Qgc2VlbiBpbgotICAgICAgICAgYSBkeW5hbWljIG9iamVjdCwgYW5kIHRoZW4gbGF0ZXIgaW4gYSBub24tRUxGIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpID09IDAKLQkgICYmIChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAgICA/IChiZmRfZ2V0X2ZsYXZvdXIgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIpCi0JCSAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICAgIDogKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKQotCQkgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkJICAgICAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDApKSkKLQloLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBmaW5hbCBsaW5rLCBhbmQgdGhlIHN5bWJvbCB3YXMgZGVmaW5lZCBhcyBhIGNvbW1vbgotICAgICBzeW1ib2wgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLCBhbmQgdGhlcmUgd2FzIG5vIGRlZmluaXRpb24gaW4KLSAgICAgYW55IGR5bmFtaWMgb2JqZWN0LCB0aGVuIHRoZSBsaW5rZXIgd2lsbCBoYXZlIGFsbG9jYXRlZCBzcGFjZSBmb3IKLSAgICAgdGhlIHN5bWJvbCBpbiBhIGNvbW1vbiBzZWN0aW9uIGJ1dCB0aGUgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUgotICAgICBmbGFnIHdpbGwgbm90IGhhdmUgYmVlbiBzZXQuICAqLwotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVI7Ci0KLSAgLyogSWYgLUJzeW1ib2xpYyB3YXMgdXNlZCAod2hpY2ggbWVhbnMgdG8gYmluZCByZWZlcmVuY2VzIHRvIGdsb2JhbAotICAgICBzeW1ib2xzIHRvIHRoZSBkZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIG9iamVjdCksIGFuZCB0aGlzCi0gICAgIHN5bWJvbCB3YXMgZGVmaW5lZCBpbiBhIHJlZ3VsYXIgb2JqZWN0LCB0aGVuIGl0IGFjdHVhbGx5IGRvZXNuJ3QKLSAgICAgbmVlZCBhIFBMVCBlbnRyeS4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSAhPSAwCi0gICAgICAmJiBlaWYtPmluZm8tPnNoYXJlZAotICAgICAgJiYgZWlmLT5pbmZvLT5zeW1ib2xpYwotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwKQotICAgIHsKLSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJj1+IEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUOwotICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgdGhlIGJhY2tlbmQgcGljayBhIGdvb2QgdmFsdWUgZm9yIGEgZHluYW1pYyBzeW1ib2wuICBUaGlzIGlzCi0gICBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UsIGFuZCBhbHNvIGNhbGxzIGl0c2VsZgotICAgcmVjdXJzaXZlbHkuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2FkanVzdF9keW5hbWljX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICplaWYgPSAoc3RydWN0IGVsZl9pbmZvX2ZhaWxlZCAqKSBkYXRhOwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgKmJlZDsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpeCB0aGUgc3ltYm9sIGZsYWdzLiAgKi8KLSAgaWYgKCEgZWxmX2ZpeF9zeW1ib2xfZmxhZ3MgKGgsIGVpZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBQTFQgZW50cnksIGFuZCBpdCBpcyBub3QKLSAgICAgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCBvciBpcyBub3QgcmVmZXJlbmNlZCBieSBhIHJlZ3VsYXIKLSAgICAgb2JqZWN0LCBpZ25vcmUgaXQuICBXZSBkbyBoYXZlIHRvIGhhbmRsZSBhIHdlYWsgZGVmaW5lZCBzeW1ib2wsCi0gICAgIGV2ZW4gaWYgbm8gcmVndWxhciBvYmplY3QgcmVmZXJzIHRvIGl0LCBpZiB3ZSBkZWNpZGVkIHRvIGFkZCBpdAotICAgICB0byB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuICBGSVhNRTogRG8gd2Ugbm9ybWFsbHkgbmVlZCB0byB3b3JyeQotICAgICBhYm91dCBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGJ5IG9uZSBkeW5hbWljIG9iamVjdCBhbmQKLSAgICAgcmVmZXJlbmNlZCBieSBhbm90aGVyIG9uZT8gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfTkVFRFNfUExUKSA9PSAwCi0gICAgICAmJiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwCi0JICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpID09IDAKLQkgIHx8ICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVIpID09IDAKLQkgICAgICAmJiAoaC0+d2Vha2RlZiA9PSBOVUxMIHx8IGgtPndlYWtkZWYtPmR5bmluZHggPT0gLTEpKSkpCi0gICAgewotICAgICAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGFkanVzdGVkIHRoaXMgc3ltYm9sLCBkb24ndCBkbyBpdCBhZ2Fpbi4gIFRoaXMKLSAgICAgY2FuIGhhcHBlbiB2aWEgYSByZWN1cnNpdmUgY2FsbC4gICovCi0gIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfRFlOQU1JQ19BREpVU1RFRCkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBEb24ndCBsb29rIGF0IHRoaXMgc3ltYm9sIGFnYWluLiAgTm90ZSB0aGF0IHdlIG11c3Qgc2V0IHRoaXMKLSAgICAgYWZ0ZXIgY2hlY2tpbmcgdGhlIGFib3ZlIGNvbmRpdGlvbnMsIGJlY2F1c2Ugd2UgbWF5IGxvb2sgYXQgYQotICAgICBzeW1ib2wgb25jZSwgZGVjaWRlIG5vdCB0byBkbyBhbnl0aGluZywgYW5kIHRoZW4gZ2V0IGNhbGxlZAotICAgICByZWN1cnNpdmVseSBsYXRlciBhZnRlciBSRUZfUkVHVUxBUiBpcyBzZXQgYmVsb3cuICAqLwotICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0hBU0hfRFlOQU1JQ19BREpVU1RFRDsKLQotICAvKiBJZiB0aGlzIGlzIGEgd2VhayBkZWZpbml0aW9uLCBhbmQgd2Uga25vdyBhIHJlYWwgZGVmaW5pdGlvbiwgYW5kCi0gICAgIHRoZSByZWFsIHN5bWJvbCBpcyBub3QgaXRzZWxmIGRlZmluZWQgYnkgYSByZWd1bGFyIG9iamVjdCBmaWxlLAotICAgICB0aGVuIGdldCBhIGdvb2QgdmFsdWUgZm9yIHRoZSByZWFsIGRlZmluaXRpb24uICBXZSBoYW5kbGUgdGhlCi0gICAgIHJlYWwgc3ltYm9sIGZpcnN0LCBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZSBiYWNrZW5kIHJvdXRpbmUuCi0KLSAgICAgTm90ZSB0aGF0IHRoZXJlIGlzIGEgY29uZnVzaW5nIGNhc2UgaGVyZS4gIElmIHRoZSByZWFsIGRlZmluaXRpb24KLSAgICAgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIHdlIGRvbid0IGdldCB0aGUgcmVhbCBzeW1ib2wKLSAgICAgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QsIGJ1dCB3ZSBkbyBnZXQgdGhlIHdlYWsgc3ltYm9sLiAgSWYgdGhlCi0gICAgIHByb2Nlc3NvciBiYWNrZW5kIHVzZXMgYSBDT1BZIHJlbG9jLCB0aGVuIGlmIHNvbWUgcm91dGluZSBpbiB0aGUKLSAgICAgZHluYW1pYyBvYmplY3QgY2hhbmdlcyB0aGUgcmVhbCBzeW1ib2wsIHdlIHdpbGwgbm90IHNlZSB0aGF0Ci0gICAgIGNoYW5nZSBpbiB0aGUgY29ycmVzcG9uZGluZyB3ZWFrIHN5bWJvbC4gIFRoaXMgaXMgdGhlIHdheSBvdGhlcgotICAgICBFTEYgbGlua2VycyB3b3JrIGFzIHdlbGwsIGFuZCBzZWVtcyB0byBiZSBhIHJlc3VsdCBvZiB0aGUgc2hhcmVkCi0gICAgIGxpYnJhcnkgbW9kZWwuCi0KLSAgICAgSSB3aWxsIGNsYXJpZnkgdGhpcyBpc3N1ZS4gIE1vc3QgU1ZSNCBzaGFyZWQgbGlicmFyaWVzIGRlZmluZSB0aGUKLSAgICAgdmFyaWFibGUgX3RpbWV6b25lIGFuZCBkZWZpbmUgdGltZXpvbmUgYXMgYSB3ZWFrIHN5bm9ueW0uICBUaGUKLSAgICAgdHpzZXQgY2FsbCBjaGFuZ2VzIF90aW1lem9uZS4gIElmIHlvdSB3cml0ZQotICAgICAgIGV4dGVybiBpbnQgdGltZXpvbmU7Ci0gICAgICAgaW50IF90aW1lem9uZSA9IDU7Ci0gICAgICAgaW50IG1haW4gKCkgeyB0enNldCAoKTsgcHJpbnRmICgiJWQgJWRcbiIsIHRpbWV6b25lLCBfdGltZXpvbmUpOyB9Ci0gICAgIHlvdSBtaWdodCBleHBlY3QgdGhhdCwgc2luY2UgdGltZXpvbmUgaXMgYSBzeW5vbnltIGZvciBfdGltZXpvbmUsCi0gICAgIHRoZSBzYW1lIG51bWJlciB3aWxsIHByaW50IGJvdGggdGltZXMuICBIb3dldmVyLCBpZiB0aGUgcHJvY2Vzc29yCi0gICAgIGJhY2tlbmQgdXNlcyBhIENPUFkgcmVsb2MsIHRoZW4gYWN0dWFsbHkgdGltZXpvbmUgd2lsbCBiZSBjb3BpZWQKLSAgICAgaW50byB5b3VyIHByb2Nlc3MgaW1hZ2UsIGFuZCwgc2luY2UgeW91IGRlZmluZSBfdGltZXpvbmUKLSAgICAgeW91cnNlbGYsIF90aW1lem9uZSB3aWxsIG5vdC4gIFRodXMgdGltZXpvbmUgYW5kIF90aW1lem9uZSB3aWxsCi0gICAgIHdpbmQgdXAgYXQgZGlmZmVyZW50IG1lbW9yeSBsb2NhdGlvbnMuICBUaGUgdHpzZXQgY2FsbCB3aWxsIHNldAotICAgICBfdGltZXpvbmUsIGxlYXZpbmcgdGltZXpvbmUgdW5jaGFuZ2VkLiAgKi8KLQotICBpZiAoaC0+d2Vha2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICp3ZWFrZGVmOwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0gICAgICB3ZWFrZGVmID0gaC0+d2Vha2RlZjsKLSAgICAgIEJGRF9BU1NFUlQgKHdlYWtkZWYtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICB8fCB3ZWFrZGVmLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLSAgICAgIEJGRF9BU1NFUlQgKHdlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9EWU5BTUlDKTsKLSAgICAgIGlmICgod2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIpICE9IDApCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUsIHNvIHdlCi0JICAgICB3aWxsIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsLiAgQ2xlYXIgd2Vha2RlZiBmb3IgdGhlCi0JICAgICBjb252ZW5pZW5jZSBvZiB0aGUgcHJvY2Vzc29yIGJhY2tlbmQuICAqLwotCSAgaC0+d2Vha2RlZiA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZXJlIGlzIGFuIGltcGxpY2l0IHJlZmVyZW5jZSBieSBhIHJlZ3VsYXIgb2JqZWN0IGZpbGUKLQkgICAgIHZpYSB0aGUgd2VhayBzeW1ib2wuICAqLwotCSAgd2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSOwotCSAgaWYgKGgtPndlYWtkZWYtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkgICAgICAmIEVMRl9MSU5LX0hBU0hfUkVGX1JFR1VMQVJfTk9OV0VBSykKLQkgICAgd2Vha2RlZi0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUs7Ci0JICBpZiAoISBlbGZfYWRqdXN0X2R5bmFtaWNfc3ltYm9sICh3ZWFrZGVmLCAoUFRSKSBlaWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiBJZiBhIHN5bWJvbCBoYXMgbm8gdHlwZSBhbmQgbm8gc2l6ZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIFBMVAotICAgICBlbnRyeSwgdGhlbiB3ZSBhcmUgcHJvYmFibHkgYWJvdXQgdG8gZG8gdGhlIHdyb25nIHRoaW5nIGhlcmU6IHdlCi0gICAgIGFyZSBwcm9iYWJseSBnb2luZyB0byBjcmVhdGUgYSBDT1BZIHJlbG9jIGZvciBhbiBlbXB0eSBvYmplY3QuCi0gICAgIFRoaXMgY2FzZSBjYW4gYXJpc2Ugd2hlbiBhIHNoYXJlZCBvYmplY3QgaXMgYnVpbHQgd2l0aCBhc3NlbWJseQotICAgICBjb2RlLCBhbmQgdGhlIGFzc2VtYmx5IGNvZGUgZmFpbHMgdG8gc2V0IHRoZSBzeW1ib2wgdHlwZS4gICovCi0gIGlmIChoLT5zaXplID09IDAKLSAgICAgICYmIGgtPnR5cGUgPT0gU1RUX05PVFlQRQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX05FRURTX1BMVCkgPT0gMCkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgIChfKCJ3YXJuaW5nOiB0eXBlIGFuZCBzaXplIG9mIGR5bmFtaWMgc3ltYm9sIGAlcycgYXJlIG5vdCBkZWZpbmVkIiksCi0JIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGR5bm9iaiA9IGVsZl9oYXNoX3RhYmxlIChlaWYtPmluZm8pLT5keW5vYmo7Ci0gIGJlZCA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChkeW5vYmopOwotICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfYWRqdXN0X2R5bmFtaWNfc3ltYm9sKSAoZWlmLT5pbmZvLCBoKSkKLSAgICB7Ci0gICAgICBlaWYtPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gZXhwb3J0IGFsbCBkZWZpbmVkIHN5bWJvbHMgaW50byB0aGUgZHluYW1pYwotICAgc3ltYm9sIHRhYmxlLiAgSXQgaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9leHBvcnRfc3ltYm9sIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfaW5mb19mYWlsZWQgKmVpZiA9IChzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkICopIGRhdGE7Ci0KLSAgLyogSWdub3JlIGluZGlyZWN0IHN5bWJvbHMuICBUaGVzZSBhcmUgYWRkZWQgYnkgdGhlIHZlcnNpb25pbmcgY29kZS4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoaC0+ZHluaW5keCA9PSAtMQotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MKLQkgICYgKEVMRl9MSU5LX0hBU0hfREVGX1JFR1VMQVIgfCBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSKSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCAoZWlmLT5pbmZvLCBoKSkKLQl7Ci0JICBlaWYtPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyB3aGljaCBhcmUgZGVmaW5lZCBpbiBvdGhlciBzaGFyZWQKLSAgIGxpYnJhcmllcyBhbmQgcmVmZXJlbmNlZCBoZXJlLiAgVXBkYXRlIHRoZSBsaXN0IG9mIHZlcnNpb24KLSAgIGRlcGVuZGVuY2llcy4gIFRoaXMgd2lsbCBiZSBwdXQgaW50byB0aGUgLmdudS52ZXJzaW9uX3Igc2VjdGlvbi4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9saW5rX2ZpbmRfdmVyc2lvbl9kZXBlbmRlbmNpZXMgKGgsIGRhdGEpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGVsZl9maW5kX3ZlcmRlcF9pbmZvICpyaW5mbyA9IChzdHJ1Y3QgZWxmX2ZpbmRfdmVyZGVwX2luZm8gKikgZGF0YTsKLSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgKnQ7Ci0gIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICphOwotCi0gIC8qIFdlIG9ubHkgY2FyZSBhYm91dCBzeW1ib2xzIGRlZmluZWQgaW4gc2hhcmVkIG9iamVjdHMgd2l0aCB2ZXJzaW9uCi0gICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfRFlOQU1JQykgPT0gMAotICAgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSAhPSAwCi0gICAgICB8fCBoLT5keW5pbmR4ID09IC0xCi0gICAgICB8fCBoLT52ZXJpbmZvLnZlcmRlZiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFNlZSBpZiB3ZSBhbHJlYWR5IGtub3cgYWJvdXQgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgZm9yICh0ID0gZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZjsgdCAhPSBOVUxMOyB0ID0gdC0+dm5fbmV4dHJlZikKLSAgICB7Ci0gICAgICBpZiAodC0+dm5fYmZkICE9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9iZmQpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAoYSA9IHQtPnZuX2F1eHB0cjsgYSAhPSBOVUxMOyBhID0gYS0+dm5hX25leHRwdHIpCi0JaWYgKGEtPnZuYV9ub2RlbmFtZSA9PSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfbm9kZW5hbWUpCi0JICByZXR1cm4gdHJ1ZTsKLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFRoaXMgaXMgYSBuZXcgdmVyc2lvbi4gIEFkZCBpdCB0byB0cmVlIHdlIGFyZSBidWlsZGluZy4gICovCi0KLSAgaWYgKHQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB0ID0gKEVsZl9JbnRlcm5hbF9WZXJuZWVkICopIGJmZF96YWxsb2MgKHJpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKnQpOwotICAgICAgaWYgKHQgPT0gTlVMTCkKLQl7Ci0JICByaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHQtPnZuX2JmZCA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9iZmQ7Ci0gICAgICB0LT52bl9uZXh0cmVmID0gZWxmX3RkYXRhIChyaW5mby0+b3V0cHV0X2JmZCktPnZlcnJlZjsKLSAgICAgIGVsZl90ZGF0YSAocmluZm8tPm91dHB1dF9iZmQpLT52ZXJyZWYgPSB0OwotICAgIH0KLQotICBhID0gKEVsZl9JbnRlcm5hbF9WZXJuYXV4ICopIGJmZF96YWxsb2MgKHJpbmZvLT5vdXRwdXRfYmZkLCBzaXplb2YgKmEpOwotCi0gIC8qIE5vdGUgdGhhdCB3ZSBhcmUgY29weWluZyBhIHN0cmluZyBwb2ludGVyIGhlcmUsIGFuZCB0ZXN0aW5nIGl0Ci0gICAgIGFib3ZlLiAgSWYgYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiBpcyBldmVyIGNoYW5nZWQgdG8KLSAgICAgZGlzY2FyZCB0aGUgc3RyaW5nIGRhdGEgd2hlbiBsb3cgaW4gbWVtb3J5LCB0aGlzIHdpbGwgaGF2ZSB0byBiZQotICAgICBmaXhlZC4gICovCi0gIGEtPnZuYV9ub2RlbmFtZSA9IGgtPnZlcmluZm8udmVyZGVmLT52ZF9ub2RlbmFtZTsKLQotICBhLT52bmFfZmxhZ3MgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZmxhZ3M7Ci0gIGEtPnZuYV9uZXh0cHRyID0gdC0+dm5fYXV4cHRyOwotCi0gIGgtPnZlcmluZm8udmVyZGVmLT52ZF9leHBfcmVmbm8gPSByaW5mby0+dmVyczsKLSAgKytyaW5mby0+dmVyczsKLQotICBhLT52bmFfb3RoZXIgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vICsgMTsKLQotICB0LT52bl9hdXhwdHIgPSBhOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaWd1cmUgb3V0IGFwcHJvcHJpYXRlIHZlcnNpb25zIGZvciBhbGwgdGhlIHN5bWJvbHMuICBXZSBtYXkgbm90Ci0gICBoYXZlIHRoZSB2ZXJzaW9uIG51bWJlciBzY3JpcHQgdW50aWwgd2UgaGF2ZSByZWFkIGFsbCBvZiB0aGUgaW5wdXQKLSAgIGZpbGVzLCBzbyB1bnRpbCB0aGF0IHBvaW50IHdlIGRvbid0IGtub3cgd2hpY2ggc3ltYm9scyBzaG91bGQgYmUKLSAgIGxvY2FsLiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfYXNzaWduX3N5bV92ZXJzaW9uIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBlbGZfYXNzaWduX3N5bV92ZXJzaW9uX2luZm8gKnNpbmZvID0KLSAgICAoc3RydWN0IGVsZl9hc3NpZ25fc3ltX3ZlcnNpb25faW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IHNpbmZvLT5pbmZvOwotICBzdHJ1Y3QgZWxmX2luZm9fZmFpbGVkIGVpZjsKLSAgY2hhciAqcDsKLQotICAvKiBGaXggdGhlIHN5bWJvbCBmbGFncy4gICovCi0gIGVpZi5mYWlsZWQgPSBmYWxzZTsKLSAgZWlmLmluZm8gPSBpbmZvOwotICBpZiAoISBlbGZfZml4X3N5bWJvbF9mbGFncyAoaCwgJmVpZikpCi0gICAgewotICAgICAgaWYgKGVpZi5mYWlsZWQpCi0Jc2luZm8tPmZhaWxlZCA9IHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIG9ubHkgbmVlZCB2ZXJzaW9uIG51bWJlcnMgZm9yIHN5bWJvbHMgZGVmaW5lZCBpbiByZWd1bGFyCi0gICAgIG9iamVjdHMuICAqLwotICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHAgPSBzdHJjaHIgKGgtPnJvb3Qucm9vdC5zdHJpbmcsIEVMRl9WRVJfQ0hSKTsKLSAgaWYgKHAgIT0gTlVMTCAmJiBoLT52ZXJpbmZvLnZlcnRyZWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0gICAgICBib29sZWFuIGhpZGRlbjsKLQotICAgICAgaGlkZGVuID0gdHJ1ZTsKLQotICAgICAgLyogVGhlcmUgYXJlIHR3byBjb25zZWN1dGl2ZSBFTEZfVkVSX0NIUiBjaGFyYWN0ZXJzIGlmIHRoaXMgaXMKLSAgICAgICAgIG5vdCBhIGhpZGRlbiBzeW1ib2wuICAqLwotICAgICAgKytwOwotICAgICAgaWYgKCpwID09IEVMRl9WRVJfQ0hSKQotCXsKLQkgIGhpZGRlbiA9IGZhbHNlOwotCSAgKytwOwotCX0KLQotICAgICAgLyogSWYgdGhlcmUgaXMgbm8gdmVyc2lvbiBzdHJpbmcsIHdlIGNhbiBqdXN0IHJldHVybiBvdXQuICAqLwotICAgICAgaWYgKCpwID09ICdcMCcpCi0JewotCSAgaWYgKGhpZGRlbikKLQkgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19ISURERU47Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgZm9yIHRoZSB2ZXJzaW9uLiAgSWYgd2UgZmluZCBpdCwgaXQgaXMgbm8gbG9uZ2VyIHdlYWsuICAqLwotICAgICAgZm9yICh0ID0gc2luZm8tPnZlcmRlZnM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgaWYgKHN0cmNtcCAodC0+bmFtZSwgcCkgPT0gMCkKLQkgICAgewotCSAgICAgIGludCBsZW47Ci0JICAgICAgY2hhciAqYWxjOwotCSAgICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZDsKLQotCSAgICAgIGxlbiA9IHAgLSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICAgIGFsYyA9IGJmZF9hbGxvYyAoc2luZm8tPm91dHB1dF9iZmQsIGxlbik7Ci0JICAgICAgaWYgKGFsYyA9PSBOVUxMKQotCSAgICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAgIHN0cm5jcHkgKGFsYywgaC0+cm9vdC5yb290LnN0cmluZywgbGVuIC0gMSk7Ci0JICAgICAgYWxjW2xlbiAtIDFdID0gJ1wwJzsKLQkgICAgICBpZiAoYWxjW2xlbiAtIDJdID09IEVMRl9WRVJfQ0hSKQotCSAgICAgICAgYWxjW2xlbiAtIDJdID0gJ1wwJzsKLQotCSAgICAgIGgtPnZlcmluZm8udmVydHJlZSA9IHQ7Ci0JICAgICAgdC0+dXNlZCA9IHRydWU7Ci0JICAgICAgZCA9IE5VTEw7Ci0KLQkgICAgICBpZiAodC0+Z2xvYmFscyAhPSBOVUxMKQotCQl7Ci0JCSAgZm9yIChkID0gdC0+Z2xvYmFsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJICAgIGlmICgoKmQtPm1hdGNoKSAoZCwgYWxjKSkKLQkJICAgICAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFNlZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBmb3JjZSB0aGlzIHN5bWJvbCB0bwotICAgICAgICAgICAgICAgICBsb2NhbCBzY29wZS4gICovCi0JICAgICAgaWYgKGQgPT0gTlVMTCAmJiB0LT5sb2NhbHMgIT0gTlVMTCkKLQkJewotCQkgIGZvciAoZCA9IHQtPmxvY2FsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCgqZC0+bWF0Y2gpIChkLCBhbGMpKQotCQkJewotCQkJICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkJICAgICAgJiYgaW5mby0+c2hhcmVkCi0JCQkgICAgICAmJiAhIHNpbmZvLT5leHBvcnRfZHluYW1pYykKLQkJCSAgICB7Ci0JCQkgICAgICBzaW5mby0+cmVtb3ZlZF9keW5hbWljID0gdHJ1ZTsKLQkJCSAgICAgIGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfRk9SQ0VEX0xPQ0FMOwotCQkJICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4KLQkJCQlFTEZfTElOS19IQVNIX05FRURTX1BMVDsKLQkJCSAgICAgIGgtPmR5bmluZHggPSAtMTsKLQkJCSAgICAgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JCQkgICAgICAvKiBGSVhNRTogVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBoYXMKLQkJCQkgYWxyZWFkeSBiZWVuIHJlY29yZGVkIGluIHRoZSBkeW5hbWljCi0JCQkJIHN0cmluZyB0YWJsZSBzZWN0aW9uLiAgKi8KLQkJCSAgICB9Ci0KLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJmZF9yZWxlYXNlIChzaW5mby0+b3V0cHV0X2JmZCwgYWxjKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UgYXJlIGJ1aWxkaW5nIGFuIGFwcGxpY2F0aW9uLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhCi0gICAgICAgICB2ZXJzaW9uIG5vZGUgZm9yIHRoaXMgdmVyc2lvbi4gICovCi0gICAgICBpZiAodCA9PSBOVUxMICYmICEgaW5mby0+c2hhcmVkKQotCXsKLQkgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqKnBwOwotCSAgaW50IHZlcnNpb25faW5kZXg7Ci0KLQkgIC8qIElmIHdlIGFyZW4ndCBnb2luZyB0byBleHBvcnQgdGhpcyBzeW1ib2wsIHdlIGRvbid0IG5lZWQKLSAgICAgICAgICAgICB0byB3b3JyeSBhYm91dCBpdC4gKi8KLQkgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCSAgICByZXR1cm4gdHJ1ZTsKLQotCSAgdCA9ICgoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopCi0JICAgICAgIGJmZF9hbGxvYyAoc2luZm8tPm91dHB1dF9iZmQsIHNpemVvZiAqdCkpOwotCSAgaWYgKHQgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHNpbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICB0LT5uZXh0ID0gTlVMTDsKLQkgIHQtPm5hbWUgPSBwOwotCSAgdC0+Z2xvYmFscyA9IE5VTEw7Ci0JICB0LT5sb2NhbHMgPSBOVUxMOwotCSAgdC0+ZGVwcyA9IE5VTEw7Ci0JICB0LT5uYW1lX2luZHggPSAodW5zaWduZWQgaW50KSAtMTsKLQkgIHQtPnVzZWQgPSB0cnVlOwotCi0JICB2ZXJzaW9uX2luZGV4ID0gMTsKLQkgIGZvciAocHAgPSAmc2luZm8tPnZlcmRlZnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkgICAgKyt2ZXJzaW9uX2luZGV4OwotCSAgdC0+dmVybnVtID0gdmVyc2lvbl9pbmRleDsKLQotCSAgKnBwID0gdDsKLQotCSAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQl9Ci0gICAgICBlbHNlIGlmICh0ID09IE5VTEwpCi0JewotCSAgLyogV2UgY291bGQgbm90IGZpbmQgdGhlIHZlcnNpb24gZm9yIGEgc3ltYm9sIHdoZW4KLSAgICAgICAgICAgICBnZW5lcmF0aW5nIGEgc2hhcmVkIGFyY2hpdmUuICBSZXR1cm4gYW4gZXJyb3IuICAqLwotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5kZWZpbmVkIHZlcnNpb25lZCBzeW1ib2wgbmFtZSAlcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoc2luZm8tPm91dHB1dF9iZmQpLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgc2luZm8tPmZhaWxlZCA9IHRydWU7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaGlkZGVuKQotCWgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgfD0gRUxGX0xJTktfSElEREVOOwotICAgIH0KLQotICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmVyc2lvbiBmb3IgdGhpcyBzeW1ib2wsIHNlZSBpZiB3ZSBjYW4gZmluZAotICAgICBzb21ldGhpbmcuICAqLwotICBpZiAoaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwgJiYgc2luZm8tPnZlcmRlZnMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnQ7Ci0gICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmRlZmx0OwotICAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpkOwotCi0gICAgICAvKiBTZWUgaWYgY2FuIGZpbmQgd2hhdCB2ZXJzaW9uIHRoaXMgc3ltYm9sIGlzIGluLiAgSWYgdGhlCi0gICAgICAgICBzeW1ib2wgaXMgc3VwcG9zZWQgdG8gYmUgbG9jYWwsIHRoZW4gZG9uJ3QgYWN0dWFsbHkgcmVnaXN0ZXIKLSAgICAgICAgIGl0LiAgKi8KLSAgICAgIGRlZmx0ID0gTlVMTDsKLSAgICAgIGZvciAodCA9IHNpbmZvLT52ZXJkZWZzOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotCXsKLQkgIGlmICh0LT5nbG9iYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKGQgPSB0LT5nbG9iYWxzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCQl7Ci0JCSAgaWYgKCgqZC0+bWF0Y2gpIChkLCBoLT5yb290LnJvb3Quc3RyaW5nKSkKLQkJICAgIHsKLQkJICAgICAgaC0+dmVyaW5mby52ZXJ0cmVlID0gdDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChkICE9IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICh0LT5sb2NhbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoZCA9IHQtPmxvY2FsczsgZCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLQkJewotCQkgIGlmIChkLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBkLT5wYXR0ZXJuWzFdID09ICdcMCcpCi0JCSAgICBkZWZsdCA9IHQ7Ci0JCSAgZWxzZSBpZiAoKCpkLT5tYXRjaCkgKGQsIGgtPnJvb3Qucm9vdC5zdHJpbmcpKQotCQkgICAgewotCQkgICAgICBoLT52ZXJpbmZvLnZlcnRyZWUgPSB0OwotCQkgICAgICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCQkJICAmJiBpbmZvLT5zaGFyZWQKLQkJCSAgJiYgISBzaW5mby0+ZXhwb3J0X2R5bmFtaWMpCi0JCQl7Ci0JCQkgIHNpbmZvLT5yZW1vdmVkX2R5bmFtaWMgPSB0cnVlOwotCQkJICBoLT5lbGZfbGlua19oYXNoX2ZsYWdzIHw9IEVMRl9MSU5LX0ZPUkNFRF9MT0NBTDsKLQkJCSAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JCQkgIGgtPmR5bmluZHggPSAtMTsKLQkJCSAgaC0+cGx0Lm9mZnNldCA9IChiZmRfdm1hKSAtMTsKLQkJCSAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkKLQkJCSAgICAgYmVlbiByZWNvcmRlZCBpbiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGUKLQkJCSAgICAgc2VjdGlvbi4gICovCi0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoZCAhPSBOVUxMKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGRlZmx0ICE9IE5VTEwgJiYgaC0+dmVyaW5mby52ZXJ0cmVlID09IE5VTEwpCi0JewotCSAgaC0+dmVyaW5mby52ZXJ0cmVlID0gZGVmbHQ7Ci0JICBpZiAoaC0+ZHluaW5keCAhPSAtMQotCSAgICAgICYmIGluZm8tPnNoYXJlZAotCSAgICAgICYmICEgc2luZm8tPmV4cG9ydF9keW5hbWljKQotCSAgICB7Ci0JICAgICAgc2luZm8tPnJlbW92ZWRfZHluYW1pYyA9IHRydWU7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyB8PSBFTEZfTElOS19GT1JDRURfTE9DQUw7Ci0JICAgICAgaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmPX4gRUxGX0xJTktfSEFTSF9ORUVEU19QTFQ7Ci0JICAgICAgaC0+ZHluaW5keCA9IC0xOwotCSAgICAgIGgtPnBsdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0JICAgICAgLyogRklYTUU6IFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbgotCQkgcmVjb3JkZWQgaW4gdGhlIGR5bmFtaWMgc3RyaW5nIHRhYmxlIHNlY3Rpb24uICAqLwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlbnVtYmVyIHRoZSBkeW5hbWljIHN5bWJvbHMsIGlmIHNvbWUgb2YKLSAgIHRoZW0gYXJlIHJlbW92ZWQgYmVjYXVzZSB0aGV5IGFyZSBtYXJrZWQgYXMgbG9jYWwuICBUaGlzIGlzIGNhbGxlZAotICAgdmlhIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfcmVudW1iZXJfZHluc3ltcyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSBkYXRhOwotCi0gIGlmIChoLT5keW5pbmR4ICE9IC0xKQotICAgIHsKLSAgICAgIGgtPmR5bmluZHggPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEZpbmFsIHBoYXNlIG9mIEVMRiBsaW5rZXIuICAqLwotCi0vKiBBIHN0cnVjdHVyZSB3ZSB1c2UgdG8gYXZvaWQgcGFzc2luZyBsYXJnZSBudW1iZXJzIG9mIGFyZ3VtZW50cy4gICovCi0KLXN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBTeW1ib2wgc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3ltc3RydGFiOwotICAvKiAuZHluc3ltIHNlY3Rpb24uICAqLwotICBhc2VjdGlvbiAqZHluc3ltX3NlYzsKLSAgLyogLmhhc2ggc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpoYXNoX3NlYzsKLSAgLyogc3ltYm9sIHZlcnNpb24gc2VjdGlvbiAoLmdudS52ZXJzaW9uKS4gICovCi0gIGFzZWN0aW9uICpzeW12ZXJfc2VjOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgY29udGVudHMgb2YgYW55IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IHNlY3Rpb24uICAqLwotICBQVFIgZXh0ZXJuYWxfcmVsb2NzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgaW50ZXJuYWwgcmVsb2NzIG9mIGFueSBzZWN0aW9uLiAgKi8KLSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxvY2FsIHN5bWJvbHMgb2YgYW55IGlucHV0Ci0gICAgIEJGRC4gICovCi0gIEVsZl9FeHRlcm5hbF9TeW0gKmV4dGVybmFsX3N5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBpbnRlcm5hbCBsb2NhbCBzeW1ib2xzIG9mIGFueSBpbnB1dAotICAgICBCRkQuICAqLwotICBFbGZfSW50ZXJuYWxfU3ltICppbnRlcm5hbF9zeW1zOwotICAvKiBBcnJheSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhIHN5bWJvbCBpbmRleCBmb3IgZWFjaCBsb2NhbCBzeW1ib2wKLSAgICAgb2YgYW55IGlucHV0IEJGRC4gICovCi0gIGxvbmcgKmluZGljZXM7Ci0gIC8qIEFycmF5IGxhcmdlIGVub3VnaCB0byBob2xkIGEgc2VjdGlvbiBwb2ludGVyIGZvciBlYWNoIGxvY2FsCi0gICAgIHN5bWJvbCBvZiBhbnkgaW5wdXQgQkZELiAgKi8KLSAgYXNlY3Rpb24gKipzZWN0aW9uczsKLSAgLyogQnVmZmVyIHRvIGhvbGQgc3dhcHBlZCBvdXQgc3ltYm9scy4gICovCi0gIEVsZl9FeHRlcm5hbF9TeW0gKnN5bWJ1ZjsKLSAgLyogTnVtYmVyIG9mIHN3YXBwZWQgb3V0IHN5bWJvbHMgaW4gYnVmZmVyLiAgKi8KLSAgc2l6ZV90IHN5bWJ1Zl9jb3VudDsKLSAgLyogTnVtYmVyIG9mIHN5bWJvbHMgd2hpY2ggZml0IGluIHN5bWJ1Zi4gICovCi0gIHNpemVfdCBzeW1idWZfc2l6ZTsKLX07Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX291dHB1dF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCSAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX2xpbmtfb3V0cHV0X2V4dHN5bQotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGVsZl9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gZWxmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRvIGVsZl9saW5rX291dHB1dF9leHRzeW0uICAqLwotCi1zdHJ1Y3QgZWxmX291dGV4dF9pbmZvCi17Ci0gIGJvb2xlYW4gZmFpbGVkOwotICBib29sZWFuIGxvY2Fsc3ltczsKLSAgc3RydWN0IGVsZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotfTsKLQotLyogRG8gdGhlIGZpbmFsIHN0ZXAgb2YgYW4gRUxGIGxpbmsuICAqLwotCi1ib29sZWFuCi1lbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJvb2xlYW4gZHluYW1pYzsKLSAgYmZkICpkeW5vYmo7Ci0gIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvIGZpbmZvOwotICByZWdpc3RlciBhc2VjdGlvbiAqbzsKLSAgcmVnaXN0ZXIgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICByZWdpc3RlciBiZmQgKnN1YjsKLSAgc2l6ZV90IG1heF9jb250ZW50c19zaXplOwotICBzaXplX3QgbWF4X2V4dGVybmFsX3JlbG9jX3NpemU7Ci0gIHNpemVfdCBtYXhfaW50ZXJuYWxfcmVsb2NfY291bnQ7Ci0gIHNpemVfdCBtYXhfc3ltX2NvdW50OwotICBmaWxlX3B0ciBvZmY7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gZWxmc3ltOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpzeW1zdHJ0YWJfaGRyOwotICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkID0gZ2V0X2VsZl9iYWNrZW5kX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvIGVvaW5mbzsKLQotICBpZiAoaW5mby0+c2hhcmVkKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLSAgZHluYW1pYyA9IGVsZl9oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkOwotICBkeW5vYmogPSBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICBmaW5mby5pbmZvID0gaW5mbzsKLSAgZmluZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIGZpbmZvLnN5bXN0cnRhYiA9IGVsZl9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBkeW5hbWljKQotICAgIHsKLSAgICAgIGZpbmZvLmR5bnN5bV9zZWMgPSBOVUxMOwotICAgICAgZmluZm8uaGFzaF9zZWMgPSBOVUxMOwotICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZmluZm8uZHluc3ltX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3ltIik7Ci0gICAgICBmaW5mby5oYXNoX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuaGFzaCIpOwotICAgICAgQkZEX0FTU0VSVCAoZmluZm8uZHluc3ltX3NlYyAhPSBOVUxMICYmIGZpbmZvLmhhc2hfc2VjICE9IE5VTEwpOwotICAgICAgZmluZm8uc3ltdmVyX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ251LnZlcnNpb24iKTsKLSAgICAgIC8qIE5vdGUgdGhhdCBpdCBpcyBPSyBpZiBzeW12ZXJfc2VjIGlzIE5VTEwuICAqLwotICAgIH0KLQotICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmludGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGZpbmZvLmV4dGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZmluZm8uaW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLnNlY3Rpb25zID0gTlVMTDsKLSAgZmluZm8uc3ltYnVmID0gTlVMTDsKLSAgZmluZm8uc3ltYnVmX2NvdW50ID0gMDsKLQotICAvKiBDb3VudCB1cCB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHdlIHdpbGwgb3V0cHV0IGZvciBlYWNoIG91dHB1dAotICAgICBzZWN0aW9uLCBzbyB0aGF0IHdlIGtub3cgdGhlIHNpemVzIG9mIHRoZSByZWxvYyBzZWN0aW9ucy4gIFdlCi0gICAgIGFsc28gZmlndXJlIG91dCBzb21lIG1heGltdW0gc2l6ZXMuICAqLwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9leHRlcm5hbF9yZWxvY19zaXplID0gMDsKLSAgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50ID0gMDsKLSAgbWF4X3N5bV9jb3VudCA9IDA7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IChhc2VjdGlvbiAqKSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0KLSAgICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLQl7Ci0JICBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JICAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCW8tPnJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0KLQkgICAgICBpZiAoc2VjLT5fcmF3X3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9yYXdfc2l6ZTsKLQkgICAgICBpZiAoc2VjLT5fY29va2VkX3NpemUgPiBtYXhfY29udGVudHNfc2l6ZSkKLQkJbWF4X2NvbnRlbnRzX3NpemUgPSBzZWMtPl9jb29rZWRfc2l6ZTsKLQotCSAgICAgIC8qIFdlIGFyZSBpbnRlcmVzdGVkIGluIGp1c3QgbG9jYWwgc3ltYm9scywgbm90IGFsbAotCQkgc3ltYm9scy4gICovCi0JICAgICAgaWYgKGJmZF9nZXRfZmxhdm91ciAoc2VjLT5vd25lcikgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCQkgICYmIChzZWMtPm93bmVyLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JCXsKLQkJICBzaXplX3Qgc3ltX2NvdW50OwotCi0JCSAgaWYgKGVsZl9iYWRfc3ltdGFiIChzZWMtPm93bmVyKSkKLQkJICAgIHN5bV9jb3VudCA9IChlbGZfdGRhdGEgKHNlYy0+b3duZXIpLT5zeW10YWJfaGRyLnNoX3NpemUKLQkJCQkgLyBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKTsKLQkJICBlbHNlCi0JCSAgICBzeW1fY291bnQgPSBlbGZfdGRhdGEgKHNlYy0+b3duZXIpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0KLQkJICBpZiAoc3ltX2NvdW50ID4gbWF4X3N5bV9jb3VudCkKLQkJICAgIG1heF9zeW1fY291bnQgPSBzeW1fY291bnQ7Ci0KLQkJICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIHNpemVfdCBleHRfc2l6ZTsKLQotCQkgICAgICBleHRfc2l6ZSA9IGVsZl9zZWN0aW9uX2RhdGEgKHNlYyktPnJlbF9oZHIuc2hfc2l6ZTsKLQkJICAgICAgaWYgKGV4dF9zaXplID4gbWF4X2V4dGVybmFsX3JlbG9jX3NpemUpCi0JCQltYXhfZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IGV4dF9zaXplOwotCQkgICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA+IG1heF9pbnRlcm5hbF9yZWxvY19jb3VudCkKLQkJCW1heF9pbnRlcm5hbF9yZWxvY19jb3VudCA9IHNlYy0+cmVsb2NfY291bnQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKG8tPnJlbG9jX2NvdW50ID4gMCkKLQlvLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0gICAgICBlbHNlCi0JewotCSAgLyogRXhwbGljaXRseSBjbGVhciB0aGUgU0VDX1JFTE9DIGZsYWcuICBUaGUgbGlua2VyIHRlbmRzIHRvCi0JICAgICBzZXQgaXQgKHRoaXMgaXMgcHJvYmFibHkgYSBidWcpIGFuZCBpZiBpdCBpcyBzZXQKLQkgICAgIGFzc2lnbl9zZWN0aW9uX251bWJlcnMgd2lsbCBjcmVhdGUgYSByZWxvYyBzZWN0aW9uLiAgKi8KLQkgIG8tPmZsYWdzICY9fiBTRUNfUkVMT0M7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgU0VDX0FMTE9DIGZsYWcgaXMgbm90IHNldCwgZm9yY2UgdGhlIHNlY3Rpb24gVk1BIHRvCi0JIHplcm8uICBUaGlzIGlzIGRvbmUgaW4gZWxmX2Zha2Vfc2VjdGlvbnMgYXMgd2VsbCwgYnV0IGZvcmNpbmcKLQkgdGhlIFZNQSB0byAwIGhlcmUgd2lsbCBlbnN1cmUgdGhhdCByZWxvY3MgYWdhaW5zdCB0aGVzZQotCSBzZWN0aW9ucyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuICAqLwotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMAotCSAgJiYgISBvLT51c2VyX3NldF92bWEpCi0Jby0+dm1hID0gMDsKLSAgICB9Ci0KLSAgLyogRmlndXJlIG91dCB0aGUgZmlsZSBwb3NpdGlvbnMgZm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBzeW1ib2wgdGFibGUKLSAgICAgYW5kIHRoZSByZWxvY3MuICBXZSBzZXQgc3ltY291bnQgdG8gZm9yY2UgYXNzaWduX3NlY3Rpb25fbnVtYmVycwotICAgICB0byBjcmVhdGUgYSBzeW1ib2wgdGFibGUuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCA/IDAgOiAxOwotICBCRkRfQVNTRVJUICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pOwotICBpZiAoISBfYmZkX2VsZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQsIGluZm8pKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoYXQgY3JlYXRlZCB0aGUgcmVsb2Mgc2VjdGlvbnMuICBTZXQgdGhlaXIgc2l6ZXMsIGFuZCBhc3NpZ24KLSAgICAgdGhlbSBmaWxlIHBvc2l0aW9ucywgYW5kIGFsbG9jYXRlIHNvbWUgYnVmZmVycy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgRWxmX0ludGVybmFsX1NoZHIgKnJlbF9oZHI7Ci0JICByZWdpc3RlciBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnAsICoqcGVuZDsKLQotCSAgcmVsX2hkciA9ICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hkcjsKLQotCSAgcmVsX2hkci0+c2hfc2l6ZSA9IHJlbF9oZHItPnNoX2VudHNpemUgKiBvLT5yZWxvY19jb3VudDsKLQotCSAgLyogVGhlIGNvbnRlbnRzIGZpZWxkIG11c3QgbGFzdCBpbnRvIHdyaXRlX29iamVjdF9jb250ZW50cywKLQkgICAgIHNvIHdlIGFsbG9jYXRlIGl0IHdpdGggYmZkX2FsbG9jIHJhdGhlciB0aGFuIG1hbGxvYy4gICovCi0JICByZWxfaGRyLT5jb250ZW50cyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsX2hkci0+c2hfc2l6ZSk7Ci0JICBpZiAocmVsX2hkci0+Y29udGVudHMgPT0gTlVMTCAmJiByZWxfaGRyLT5zaF9zaXplICE9IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBwID0gKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKikKLQkgICAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKLQkJCSAgICogc2l6ZW9mIChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotCSAgaWYgKHAgPT0gTlVMTCAmJiBvLT5yZWxvY19jb3VudCAhPSAwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzID0gcDsKLQkgIHBlbmQgPSBwICsgby0+cmVsb2NfY291bnQ7Ci0JICBmb3IgKDsgcCA8IHBlbmQ7IHArKykKLQkgICAgKnAgPSBOVUxMOwotCi0JICAvKiBVc2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGFzIGFuIGluZGV4IHdoZW4gb3V0cHV0dGluZyB0aGUKLQkgICAgIHJlbG9jcy4gICovCi0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JfQotICAgIH0KLQotICBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbnNfZm9yX3JlbG9jcyAoYWJmZCk7Ci0KLSAgLyogV2UgaGF2ZSBub3cgYXNzaWduZWQgZmlsZSBwb3NpdGlvbnMgZm9yIGFsbCB0aGUgc2VjdGlvbnMgZXhjZXB0Ci0gICAgIC5zeW10YWIgYW5kIC5zdHJ0YWIuICBXZSBzdGFydCB0aGUgLnN5bXRhYiBzZWN0aW9uIGF0IHRoZSBjdXJyZW50Ci0gICAgIGZpbGUgcG9zaXRpb24sIGFuZCB3cml0ZSBkaXJlY3RseSB0byBpdC4gIFdlIGJ1aWxkIHRoZSAuc3RydGFiCi0gICAgIHNlY3Rpb24gaW4gbWVtb3J5LiAgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSAwOwotICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHI7Ci0gIC8qIHNoX25hbWUgaXMgc2V0IGluIHByZXBfaGVhZGVycy4gICovCi0gIHN5bXRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1lNVEFCOwotICBzeW10YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHN5bXRhYl9oZHItPnNoX2FkZHIgPSAwOwotICBzeW10YWJfaGRyLT5zaF9zaXplID0gMDsKLSAgc3ltdGFiX2hkci0+c2hfZW50c2l6ZSA9IHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gIC8qIHNoX2xpbmsgaXMgc2V0IGluIGFzc2lnbl9zZWN0aW9uX251bWJlcnMuICAqLwotICAvKiBzaF9pbmZvIGlzIHNldCBiZWxvdy4gICovCi0gIC8qIHNoX29mZnNldCBpcyBzZXQganVzdCBiZWxvdy4gICovCi0gIHN5bXRhYl9oZHItPnNoX2FkZHJhbGlnbiA9IDQ7ICAvKiBGSVhNRTogc3lzdGVtIGRlcGVuZGVudD8gICovCi0KLSAgb2ZmID0gZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvczsKLSAgb2ZmID0gX2JmZF9lbGZfYXNzaWduX2ZpbGVfcG9zaXRpb25fZm9yX3NlY3Rpb24gKHN5bXRhYl9oZHIsIG9mZiwgdHJ1ZSk7Ci0KLSAgLyogTm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyBpcwotICAgICBpbmNvcnJlY3QuICBXZSBkbyBub3QgeWV0IGtub3cgdGhlIHNpemUgb2YgdGhlIC5zeW10YWIgc2VjdGlvbi4KLSAgICAgV2UgY29ycmVjdCBuZXh0X2ZpbGVfcG9zIGJlbG93LCBhZnRlciB3ZSBkbyBrbm93IHRoZSBzaXplLiAgKi8KLQotICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBob2xkIHN3YXBwZWQgb3V0IHN5bWJvbHMuICBUaGlzIGlzIHRvIGF2b2lkCi0gICAgIGNvbnRpbnVvdXNseSBzZWVraW5nIHRvIHRoZSByaWdodCBwb3NpdGlvbiBpbiB0aGUgZmlsZS4gICovCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8IG1heF9zeW1fY291bnQgPCAyMCkKLSAgICBmaW5mby5zeW1idWZfc2l6ZSA9IDIwOwotICBlbHNlCi0gICAgZmluZm8uc3ltYnVmX3NpemUgPSBtYXhfc3ltX2NvdW50OwotICBmaW5mby5zeW1idWYgPSAoKEVsZl9FeHRlcm5hbF9TeW0gKikKLQkJICBiZmRfbWFsbG9jIChmaW5mby5zeW1idWZfc2l6ZSAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKTsKLSAgaWYgKGZpbmZvLnN5bWJ1ZiA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IHRoZSBzeW1ib2wgdGFibGUuICBUaGUgZmlyc3Qgc3ltYm9sIGlzIGFsd2F5cyBhCi0gICAgIGR1bW15IHN5bWJvbC4gICovCi0gIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgfHwgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGVsZnN5bS5zdF92YWx1ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3Rfc2l6ZSA9IDA7Ci0gICAgICBlbGZzeW0uc3RfaW5mbyA9IDA7Ci0gICAgICBlbGZzeW0uc3Rfb3RoZXIgPSAwOwotICAgICAgZWxmc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotICAgICAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAmZWxmc3ltLCBiZmRfdW5kX3NlY3Rpb25fcHRyKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSNpZiAwCi0gIC8qIFNvbWUgc3RhbmRhcmQgRUxGIGxpbmtlcnMgZG8gdGhpcywgYnV0IHdlIGRvbid0IGJlY2F1c2UgaXQgY2F1c2VzCi0gICAgIGJvb3RzdHJhcCBjb21wYXJpc29uIGZhaWx1cmVzLiAgKi8KLSAgLyogT3V0cHV0IGEgZmlsZSBzeW1ib2wgZm9yIHRoZSBvdXRwdXQgZmlsZSBhcyB0aGUgc2Vjb25kIHN5bWJvbC4KLSAgICAgV2Ugb3V0cHV0IHRoaXMgZXZlbiBpZiB3ZSBhcmUgZGlzY2FyZGluZyBsb2NhbCBzeW1ib2xzLCBhbHRob3VnaAotICAgICBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBjb3JyZWN0LiAgKi8KLSAgZWxmc3ltLnN0X3ZhbHVlID0gMDsKLSAgZWxmc3ltLnN0X3NpemUgPSAwOwotICBlbGZzeW0uc3RfaW5mbyA9IEVMRl9TVF9JTkZPIChTVEJfTE9DQUwsIFNUVF9GSUxFKTsKLSAgZWxmc3ltLnN0X290aGVyID0gMDsKLSAgZWxmc3ltLnN0X3NobmR4ID0gU0hOX0FCUzsKLSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoJmZpbmZvLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwKLQkJCSAgICAgJmVsZnN5bSwgYmZkX2Fic19zZWN0aW9uX3B0cikpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0jZW5kaWYKLQotICAvKiBPdXRwdXQgYSBzeW1ib2wgZm9yIGVhY2ggc2VjdGlvbi4gIFdlIG91dHB1dCB0aGVzZSBldmVuIGlmIHdlIGFyZQotICAgICBkaXNjYXJkaW5nIGxvY2FsIHN5bWJvbHMsIHNpbmNlIHRoZXkgYXJlIHVzZWQgZm9yIHJlbG9jcy4gIFRoZXNlCi0gICAgIHN5bWJvbHMgaGF2ZSBubyBuYW1lcy4gIFdlIHN0b3JlIHRoZSBpbmRleCBvZiBlYWNoIG9uZSBpbiB0aGUKLSAgICAgaW5kZXggZmllbGQgb2YgdGhlIHNlY3Rpb24sIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQgYWdhaW4gd2hlbgotICAgICBvdXRwdXR0aW5nIHJlbG9jcy4gICovCi0gIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgfHwgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIHsKLSAgICAgIGVsZnN5bS5zdF9zaXplID0gMDsKLSAgICAgIGVsZnN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgU1RUX1NFQ1RJT04pOwotICAgICAgZWxmc3ltLnN0X290aGVyID0gMDsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCBlbGZfZWxmaGVhZGVyIChhYmZkKS0+ZV9zaG51bTsgaSsrKQotCXsKLQkgIG8gPSBzZWN0aW9uX2Zyb21fZWxmX2luZGV4IChhYmZkLCBpKTsKLQkgIGlmIChvICE9IE5VTEwpCi0JICAgIG8tPnRhcmdldF9pbmRleCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCSAgZWxmc3ltLnN0X3NobmR4ID0gaTsKLQkgIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUgfHwgbyA9PSBOVUxMKQotCSAgICBlbGZzeW0uc3RfdmFsdWUgPSAwOwotCSAgZWxzZQotCSAgICBlbGZzeW0uc3RfdmFsdWUgPSBvLT52bWE7Ci0JICBpZiAoISBlbGZfbGlua19vdXRwdXRfc3ltICgmZmluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgICAmZWxmc3ltLCBvKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSB0byBob2xkIGluZm9ybWF0aW9uIHJlYWQgaW4gZnJvbSB0aGUgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBmaW5mby5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfY29udGVudHNfc2l6ZSk7Ci0gIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IChQVFIpIGJmZF9tYWxsb2MgKG1heF9leHRlcm5hbF9yZWxvY19zaXplKTsKLSAgZmluZm8uaW50ZXJuYWxfcmVsb2NzID0gKChFbGZfSW50ZXJuYWxfUmVsYSAqKQotCQkJICAgYmZkX21hbGxvYyAobWF4X2ludGVybmFsX3JlbG9jX2NvdW50Ci0JCQkJICAgICAgICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsYSkpKTsKLSAgZmluZm8uZXh0ZXJuYWxfc3ltcyA9ICgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQkJIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQKLQkJCQkgICAgICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpOwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gKChFbGZfSW50ZXJuYWxfU3ltICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TeW0pKSk7Ci0gIGZpbmZvLmluZGljZXMgPSAobG9uZyAqKSBiZmRfbWFsbG9jIChtYXhfc3ltX2NvdW50ICogc2l6ZW9mIChsb25nKSk7Ci0gIGZpbmZvLnNlY3Rpb25zID0gKChhc2VjdGlvbiAqKikKLQkJICAgIGJmZF9tYWxsb2MgKG1heF9zeW1fY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gIGlmICgoZmluZm8uY29udGVudHMgPT0gTlVMTCAmJiBtYXhfY29udGVudHNfc2l6ZSAhPSAwKQotICAgICAgfHwgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9leHRlcm5hbF9yZWxvY19zaXplICE9IDApCi0gICAgICB8fCAoZmluZm8uaW50ZXJuYWxfcmVsb2NzID09IE5VTEwgJiYgbWF4X2ludGVybmFsX3JlbG9jX2NvdW50ICE9IDApCi0gICAgICB8fCAoZmluZm8uZXh0ZXJuYWxfc3ltcyA9PSBOVUxMICYmIG1heF9zeW1fY291bnQgIT0gMCkKLSAgICAgIHx8IChmaW5mby5pbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCAhPSAwKQotICAgICAgfHwgKGZpbmZvLmluZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApCi0gICAgICB8fCAoZmluZm8uc2VjdGlvbnMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ICE9IDApKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFNpbmNlIEVMRiBwZXJtaXRzIHJlbG9jYXRpb25zIHRvIGJlIGFnYWluc3QgbG9jYWwgc3ltYm9scywgd2UKLSAgICAgbXVzdCBoYXZlIHRoZSBsb2NhbCBzeW1ib2xzIGF2YWlsYWJsZSB3aGVuIHdlIGRvIHRoZSByZWxvY2F0aW9ucy4KLSAgICAgU2luY2Ugd2Ugd291bGQgcmF0aGVyIG9ubHkgcmVhZCB0aGUgbG9jYWwgc3ltYm9scyBvbmNlLCBhbmQgd2UKLSAgICAgd291bGQgcmF0aGVyIG5vdCBrZWVwIHRoZW0gaW4gbWVtb3J5LCB3ZSBoYW5kbGUgYWxsIHRoZQotICAgICByZWxvY2F0aW9ucyBmb3IgYSBzaW5nbGUgaW5wdXQgZmlsZSBhdCB0aGUgc2FtZSB0aW1lLgotCi0gICAgIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHRoZSB0b3RhbCBudW1iZXIgb2YgbG9jYWwKLSAgICAgc3ltYm9scyB1bnRpbCB3ZSBoYXZlIHNlZW4gYWxsIG9mIHRoZW0sIGFuZCB0aGUgbG9jYWwgc3ltYm9sCi0gICAgIGluZGljZXMgcHJlY2VkZSB0aGUgZ2xvYmFsIHN5bWJvbCBpbmRpY2VzLiAgVGhpcyBtZWFucyB0aGF0IHdoZW4KLSAgICAgd2UgYXJlIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgYW5kIHdlIHNlZSBhIHJlbG9jIGFnYWluc3QKLSAgICAgYSBnbG9iYWwgc3ltYm9sLCB3ZSBjYW4gbm90IGtub3cgdGhlIHN5bWJvbCBpbmRleCB1bnRpbCB3ZSBoYXZlCi0gICAgIGZpbmlzaGVkIGV4YW1pbmluZyBhbGwgdGhlIGxvY2FsIHN5bWJvbHMgdG8gc2VlIHdoaWNoIG9uZXMgd2UgYXJlCi0gICAgIGdvaW5nIHRvIG91dHB1dC4gIFRvIGRlYWwgd2l0aCB0aGlzLCB3ZSBrZWVwIHRoZSByZWxvY2F0aW9ucyBpbgotICAgICBtZW1vcnksIGFuZCBkb24ndCBvdXRwdXQgdGhlbSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBsaW5rLiAgVGhpcyBpcwotICAgICBhbiB1bmZvcnR1bmF0ZSB3YXN0ZSBvZiBtZW1vcnksIGJ1dCBJIGRvbid0IHNlZSBhIGdvb2Qgd2F5IGFyb3VuZAotICAgICBpdC4gIEZvcnR1bmF0ZWx5LCBpdCBvbmx5IGhhcHBlbnMgd2hlbiBwZXJmb3JtaW5nIGEgcmVsb2NhdGVhYmxlCi0gICAgIGxpbmssIHdoaWNoIGlzIG5vdCB0aGUgY29tbW9uIGNhc2UuICBGSVhNRTogSWYga2VlcF9tZW1vcnkgaXMgc2V0Ci0gICAgIHdlIGNvdWxkIHdyaXRlIHRoZSByZWxvY3Mgb3V0IGFuZCB0aGVuIHJlYWQgdGhlbSBhZ2FpbjsgSSBkb24ndAotICAgICBrbm93IGhvdyBiYWQgdGhlIG1lbW9yeSBsb3NzIHdpbGwgYmUuICAqLwotCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaWYgKHAtPnR5cGUgPT0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXIKLQkgICAgICAmJiAoYmZkX2dldF9mbGF2b3VyIChwLT51LmluZGlyZWN0LnNlY3Rpb24tPm93bmVyKQotCQkgID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpKQotCSAgICB7Ci0JICAgICAgc3ViID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBzdWItPm91dHB1dF9oYXNfYmVndW4pCi0JCXsKLQkJICBpZiAoISBlbGZfbGlua19pbnB1dF9iZmQgKCZmaW5mbywgc3ViKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN1Yi0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAocC0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgIHx8IHAtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZWxmX3JlbG9jX2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogVGhhdCB3cm90ZSBvdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLiAgRmluaXNoIHVwIHRoZSBzeW1ib2wgdGFibGUKLSAgICAgd2l0aCB0aGUgZ2xvYmFsIHN5bWJvbHMuICAqLwotCi0gIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwgJiYgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIC8qIE91dHB1dCBhbnkgZ2xvYmFsIHN5bWJvbHMgdGhhdCBnb3QgY29udmVydGVkIHRvIGxvY2FsIGluIGEKLSAgICAgICAgIHZlcnNpb24gc2NyaXB0LiAgV2UgZG8gdGhpcyBpbiBhIHNlcGFyYXRlIHN0ZXAgc2luY2UgRUxGCi0gICAgICAgICByZXF1aXJlcyBhbGwgbG9jYWwgc3ltYm9scyB0byBhcHBlYXIgcHJpb3IgdG8gYW55IGdsb2JhbAotICAgICAgICAgc3ltYm9scy4gIEZJWE1FOiBXZSBzaG91bGQgb25seSBkbyB0aGlzIGlmIHNvbWUgZ2xvYmFsCi0gICAgICAgICBzeW1ib2xzIHdlcmUsIGluIGZhY3QsIGNvbnZlcnRlZCB0byBiZWNvbWUgbG9jYWwuICBGSVhNRToKLSAgICAgICAgIFdpbGwgdGhpcyB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBJcml4IDUgbGlua2VyPyAgKi8KLSAgICAgIGVvaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgICAgIGVvaW5mby5maW5mbyA9ICZmaW5mbzsKLSAgICAgIGVvaW5mby5sb2NhbHN5bXMgPSB0cnVlOwotICAgICAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBlbGZfbGlua19vdXRwdXRfZXh0c3ltLAotCQkJICAgICAgKFBUUikgJmVvaW5mbyk7Ci0gICAgICBpZiAoZW9pbmZvLmZhaWxlZCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBzaF9pbmZvIGZpZWxkIHJlY29yZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24gbG9jYWwKLSAgICAgc3ltYm9sLiAgKi8KLSAgc3ltdGFiX2hkci0+c2hfaW5mbyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBpZiAoZHluYW1pYykKLSAgICBlbGZfc2VjdGlvbl9kYXRhIChmaW5mby5keW5zeW1fc2VjLT5vdXRwdXRfc2VjdGlvbiktPnRoaXNfaGRyLnNoX2luZm8gPSAxOwotCi0gIC8qIFdlIGdldCB0aGUgZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGVvaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgZW9pbmZvLmxvY2Fsc3ltcyA9IGZhbHNlOwotICBlb2luZm8uZmluZm8gPSAmZmluZm87Ci0gIGVsZl9saW5rX2hhc2hfdHJhdmVyc2UgKGVsZl9oYXNoX3RhYmxlIChpbmZvKSwgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSwKLQkJCSAgKFBUUikgJmVvaW5mbyk7Ci0gIGlmIChlb2luZm8uZmFpbGVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBGbHVzaCBhbGwgc3ltYm9scyB0byB0aGUgZmlsZS4gICovCi0gIGlmICghIGVsZl9saW5rX2ZsdXNoX291dHB1dF9zeW1zICgmZmluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd2Uga25vdyB0aGUgc2l6ZSBvZiB0aGUgc3ltdGFiIHNlY3Rpb24uICAqLwotICBvZmYgKz0gc3ltdGFiX2hkci0+c2hfc2l6ZTsKLQotICAvKiBGaW5pc2ggdXAgYW5kIHdyaXRlIG91dCB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZSAoLnN0cnRhYikKLSAgICAgc2VjdGlvbi4gICovCi0gIHN5bXN0cnRhYl9oZHIgPSAmZWxmX3RkYXRhIChhYmZkKS0+c3RydGFiX2hkcjsKLSAgLyogc2hfbmFtZSB3YXMgc2V0IGluIHByZXBfaGVhZGVycy4gICovCi0gIHN5bXN0cnRhYl9oZHItPnNoX3R5cGUgPSBTSFRfU1RSVEFCOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9mbGFncyA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2FkZHIgPSAwOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9zaXplID0gX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3ltc3RydGFiKTsKLSAgc3ltc3RydGFiX2hkci0+c2hfZW50c2l6ZSA9IDA7Ci0gIHN5bXN0cnRhYl9oZHItPnNoX2xpbmsgPSAwOwotICBzeW1zdHJ0YWJfaGRyLT5zaF9pbmZvID0gMDsKLSAgLyogc2hfb2Zmc2V0IGlzIHNldCBqdXN0IGJlbG93LiAgKi8KLSAgc3ltc3RydGFiX2hkci0+c2hfYWRkcmFsaWduID0gMTsKLQotICBvZmYgPSBfYmZkX2VsZl9hc3NpZ25fZmlsZV9wb3NpdGlvbl9mb3Jfc2VjdGlvbiAoc3ltc3RydGFiX2hkciwgb2ZmLCB0cnVlKTsKLSAgZWxmX3RkYXRhIChhYmZkKS0+bmV4dF9maWxlX3BvcyA9IG9mZjsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPiAwKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc3ltc3RydGFiX2hkci0+c2hfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLCBmaW5mby5zeW1zdHJ0YWIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogQWRqdXN0IHRoZSByZWxvY3MgdG8gaGF2ZSB0aGUgY29ycmVjdCBzeW1ib2wgaW5kaWNlcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqcmVsX2hkcjsKLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsX2hhc2ggPSBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlczsKLSAgICAgIHJlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgby0+cmVsb2NfY291bnQ7IGkrKywgcmVsX2hhc2grKykKLQl7Ci0JICBpZiAoKnJlbF9oYXNoID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBCRkRfQVNTRVJUICgoKnJlbF9oYXNoKS0+aW5keCA+PSAwKTsKLQotCSAgaWYgKHJlbF9oZHItPnNoX2VudHNpemUgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsKSkKLQkgICAgewotCSAgICAgIEVsZl9FeHRlcm5hbF9SZWwgKmVyZWw7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotCi0JICAgICAgZXJlbCA9IChFbGZfRXh0ZXJuYWxfUmVsICopIHJlbF9oZHItPmNvbnRlbnRzICsgaTsKLQkgICAgICBlbGZfc3dhcF9yZWxvY19pbiAoYWJmZCwgZXJlbCwgJmlyZWwpOwotCSAgICAgIGlyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCi0JCQkJCUVMRl9SX1RZUEUgKGlyZWwucl9pbmZvKSk7Ci0JICAgICAgZWxmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmaXJlbCwgZXJlbCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZl9FeHRlcm5hbF9SZWxhICplcmVsYTsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSBpcmVsYTsKLQotCSAgICAgIEJGRF9BU1NFUlQgKHJlbF9oZHItPnNoX2VudHNpemUKLQkJCSAgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotCi0JICAgICAgZXJlbGEgPSAoRWxmX0V4dGVybmFsX1JlbGEgKikgcmVsX2hkci0+Y29udGVudHMgKyBpOwotCSAgICAgIGVsZl9zd2FwX3JlbG9jYV9pbiAoYWJmZCwgZXJlbGEsICZpcmVsYSk7Ci0JICAgICAgaXJlbGEucl9pbmZvID0gRUxGX1JfSU5GTyAoKCpyZWxfaGFzaCktPmluZHgsCi0JCQkJCSBFTEZfUl9UWVBFIChpcmVsYS5yX2luZm8pKTsKLQkgICAgICBlbGZfc3dhcF9yZWxvY2Ffb3V0IChhYmZkLCAmaXJlbGEsIGVyZWxhKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogU2V0IHRoZSByZWxvY19jb3VudCBmaWVsZCB0byAwIHRvIHByZXZlbnQgd3JpdGVfcmVsb2NzIGZyb20KLQkgdHJ5aW5nIHRvIHN3YXAgdGhlIHJlbG9jcyBvdXQgaXRzZWxmLiAgKi8KLSAgICAgIG8tPnJlbG9jX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIGxpbmtpbmcgYWdhaW5zdCBhIGR5bmFtaWMgb2JqZWN0LCBvciBnZW5lcmF0aW5nIGEKLSAgICAgc2hhcmVkIGxpYnJhcnksIGZpbmlzaCB1cCB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgRWxmX0V4dGVybmFsX0R5biAqZHluY29uLCAqZHluY29uZW5kOwotCi0gICAgICAvKiBGaXggdXAgLmR5bmFtaWMgZW50cmllcy4gICovCi0gICAgICBvID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5hbWljIik7Ci0gICAgICBCRkRfQVNTRVJUIChvICE9IE5VTEwpOwotCi0gICAgICBkeW5jb24gPSAoRWxmX0V4dGVybmFsX0R5biAqKSBvLT5jb250ZW50czsKLSAgICAgIGR5bmNvbmVuZCA9IChFbGZfRXh0ZXJuYWxfRHluICopIChvLT5jb250ZW50cyArIG8tPl9yYXdfc2l6ZSk7Ci0gICAgICBmb3IgKDsgZHluY29uIDwgZHluY29uZW5kOyBkeW5jb24rKykKLQl7Ci0JICBFbGZfSW50ZXJuYWxfRHluIGR5bjsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotCSAgZWxmX3N3YXBfZHluX2luIChkeW5vYmosIGR5bmNvbiwgJmR5bik7Ci0KLQkgIHN3aXRjaCAoZHluLmRfdGFnKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRfSU5JVDoKLQkgICAgICBuYW1lID0gaW5mby0+aW5pdF9mdW5jdGlvbjsKLQkgICAgICBnb3RvIGdldF9zeW07Ci0JICAgIGNhc2UgRFRfRklOSToKLQkgICAgICBuYW1lID0gaW5mby0+ZmluaV9mdW5jdGlvbjsKLQkgICAgZ2V0X3N5bToKLQkgICAgICB7Ci0JCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCWggPSBlbGZfbGlua19oYXNoX2xvb2t1cCAoZWxmX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLAotCQkJCQkgIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWlmIChoICE9IE5VTEwKLQkJICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQl8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkJICB7Ci0JCSAgICBkeW4uZF91bi5kX3ZhbCA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgICBvID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgICAgaWYgKG8tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JCSAgICAgIGR5bi5kX3VuLmRfdmFsICs9IChvLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkJCSArIG8tPm91dHB1dF9vZmZzZXQpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkvKiBUaGUgc3ltYm9sIGlzIGltcG9ydGVkIGZyb20gYW5vdGhlciBzaGFyZWQKLQkJCSAgIGxpYnJhcnkgYW5kIGRvZXMgbm90IGFwcGx5IHRvIHRoaXMgb25lLiAgKi8KLQkJCWR5bi5kX3VuLmRfdmFsID0gMDsKLQkJICAgICAgfQotCi0JCSAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIERUX0hBU0g6Ci0JICAgICAgbmFtZSA9ICIuaGFzaCI7Ci0JICAgICAgZ290byBnZXRfdm1hOwotCSAgICBjYXNlIERUX1NUUlRBQjoKLQkgICAgICBuYW1lID0gIi5keW5zdHIiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9TWU1UQUI6Ci0JICAgICAgbmFtZSA9ICIuZHluc3ltIjsKLQkgICAgICBnb3RvIGdldF92bWE7Ci0JICAgIGNhc2UgRFRfVkVSREVGOgotCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uX2QiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9WRVJORUVEOgotCSAgICAgIG5hbWUgPSAiLmdudS52ZXJzaW9uX3IiOwotCSAgICAgIGdvdG8gZ2V0X3ZtYTsKLQkgICAgY2FzZSBEVF9WRVJTWU06Ci0JICAgICAgbmFtZSA9ICIuZ251LnZlcnNpb24iOwotCSAgICBnZXRfdm1hOgotCSAgICAgIG8gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSk7Ci0JICAgICAgQkZEX0FTU0VSVCAobyAhPSBOVUxMKTsKLQkgICAgICBkeW4uZF91bi5kX3B0ciA9IG8tPnZtYTsKLQkgICAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBEVF9SRUw6Ci0JICAgIGNhc2UgRFRfUkVMQToKLQkgICAgY2FzZSBEVF9SRUxTWjoKLQkgICAgY2FzZSBEVF9SRUxBU1o6Ci0JICAgICAgaWYgKGR5bi5kX3RhZyA9PSBEVF9SRUwgfHwgZHluLmRfdGFnID09IERUX1JFTFNaKQotCQl0eXBlID0gU0hUX1JFTDsKLQkgICAgICBlbHNlCi0JCXR5cGUgPSBTSFRfUkVMQTsKLQkgICAgICBkeW4uZF91bi5kX3ZhbCA9IDA7Ci0JICAgICAgZm9yIChpID0gMTsgaSA8IGVsZl9lbGZoZWFkZXIgKGFiZmQpLT5lX3NobnVtOyBpKyspCi0JCXsKLQkJICBFbGZfSW50ZXJuYWxfU2hkciAqaGRyOwotCi0JCSAgaGRyID0gZWxmX2VsZnNlY3Rpb25zIChhYmZkKVtpXTsKLQkJICBpZiAoaGRyLT5zaF90eXBlID09IHR5cGUKLQkJICAgICAgJiYgKGhkci0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChkeW4uZF90YWcgPT0gRFRfUkVMU1ogfHwgZHluLmRfdGFnID09IERUX1JFTEFTWikKLQkJCWR5bi5kX3VuLmRfdmFsICs9IGhkci0+c2hfc2l6ZTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAoZHluLmRfdW4uZF92YWwgPT0gMAotCQkJICAgICAgfHwgaGRyLT5zaF9hZGRyIDwgZHluLmRfdW4uZF92YWwpCi0JCQkgICAgZHluLmRfdW4uZF92YWwgPSBoZHItPnNoX2FkZHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbGZfc3dhcF9keW5fb3V0IChkeW5vYmosICZkeW4sIGR5bmNvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmUgY3JlYXRlZCBhbnkgZHluYW1pYyBzZWN0aW9ucywgdGhlbiBvdXRwdXQgdGhlbS4gICovCi0gIGlmIChkeW5vYmogIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKmJlZC0+ZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc2VjdGlvbnMpIChhYmZkLCBpbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgZm9yIChvID0gZHlub2JqLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAoKG8tPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCSAgICAgIHx8IG8tPl9yYXdfc2l6ZSA9PSAwKQotCSAgICBjb250aW51ZTsKLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpID09IDApCi0JICAgIHsKLQkgICAgICAvKiBBdCB0aGlzIHBvaW50LCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHNlY3Rpb25zCi0gICAgICAgICAgICAgICAgIGNyZWF0ZWQgYnkgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAoKGVsZl9zZWN0aW9uX2RhdGEgKG8tPm91dHB1dF9zZWN0aW9uKS0+dGhpc19oZHIuc2hfdHlwZQotCSAgICAgICAhPSBTSFRfU1RSVEFCKQotCSAgICAgIHx8IHN0cmNtcCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIG8pLCAiLmR5bnN0ciIpICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgICAgICBvLT5jb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICAgICAgby0+X3Jhd19zaXplKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpbGVfcHRyIG9mZjsKLQotCSAgICAgIC8qIFRoZSBjb250ZW50cyBvZiB0aGUgLmR5bnN0ciBzZWN0aW9uIGFyZSBhY3R1YWxseSBpbiBhCi0gICAgICAgICAgICAgICAgIHN0cmluZ3RhYi4gICovCi0JICAgICAgb2ZmID0gZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT50aGlzX2hkci5zaF9vZmZzZXQ7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmYsIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgISBfYmZkX3N0cmluZ3RhYl9lbWl0IChhYmZkLAotCQkJCQkgICAgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5zdHIpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgaGF2ZSBvcHRpbWl6ZWQgc3RhYnMgc3RyaW5ncywgb3V0cHV0IHRoZW0uICAqLwotICBpZiAoZWxmX2hhc2hfdGFibGUgKGluZm8pLT5zdGFiX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAoYWJmZCwgJmVsZl9oYXNoX3RhYmxlIChpbmZvKS0+c3RhYl9pbmZvKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN5bXN0cnRhYik7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW5kaWNlcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmluZGljZXMpOwotICBpZiAoZmluZm8uc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zZWN0aW9ucyk7Ci0gIGlmIChmaW5mby5zeW1idWYgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1idWYpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAhPSBOVUxMKQotCWZyZWUgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKLSAgICB9Ci0KLSAgZWxmX3RkYXRhIChhYmZkKS0+bGlua2VyID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZpbmZvLnN5bXN0cnRhYiAhPSBOVUxMKQotICAgIF9iZmRfc3RyaW5ndGFiX2ZyZWUgKGZpbmZvLnN5bXN0cnRhYik7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChmaW5mby5pbnRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5pbnRlcm5hbF9yZWxvY3MpOwotICBpZiAoZmluZm8uZXh0ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uaW5kaWNlcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmluZGljZXMpOwotICBpZiAoZmluZm8uc2VjdGlvbnMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zZWN0aW9ucyk7Ci0gIGlmIChmaW5mby5zeW1idWYgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1idWYpOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwCi0JICAmJiBlbGZfc2VjdGlvbl9kYXRhIChvKS0+cmVsX2hhc2hlcyAhPSBOVUxMKQotCWZyZWUgKGVsZl9zZWN0aW9uX2RhdGEgKG8pLT5yZWxfaGFzaGVzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsIGVsZnN5bSwgaW5wdXRfc2VjKQotICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIEVsZl9JbnRlcm5hbF9TeW0gKmVsZnN5bTsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlYzsKLXsKLSAgYm9vbGVhbiAoKm91dHB1dF9zeW1ib2xfaG9vaykgUEFSQU1TICgoYmZkICosCi0JCQkJCSBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLQkJCQkJIGNvbnN0IGNoYXIgKiwKLQkJCQkJIEVsZl9JbnRlcm5hbF9TeW0gKiwKLQkJCQkJIGFzZWN0aW9uICopKTsKLQotICBvdXRwdXRfc3ltYm9sX2hvb2sgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpLT4KLSAgICBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vazsKLSAgaWYgKG91dHB1dF9zeW1ib2xfaG9vayAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgoKm91dHB1dF9zeW1ib2xfaG9vaykKLQkgICAgIChmaW5mby0+b3V0cHV0X2JmZCwgZmluZm8tPmluZm8sIG5hbWUsIGVsZnN5bSwgaW5wdXRfc2VjKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAobmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMIHx8ICpuYW1lID09ICdcMCcpCi0gICAgZWxmc3ltLT5zdF9uYW1lID0gMDsKLSAgZWxzZSBpZiAoaW5wdXRfc2VjLT5mbGFncyAmIFNFQ19FWENMVURFKQotICAgIGVsZnN5bS0+c3RfbmFtZSA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbGZzeW0tPnN0X25hbWUgPSAodW5zaWduZWQgbG9uZykgX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3ltc3RydGFiLAotCQkJCQkJCSAgICBuYW1lLCB0cnVlLAotCQkJCQkJCSAgICBmYWxzZSk7Ci0gICAgICBpZiAoZWxmc3ltLT5zdF9uYW1lID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChmaW5mby0+c3ltYnVmX2NvdW50ID49IGZpbmZvLT5zeW1idWZfc2l6ZSkKLSAgICB7Ci0gICAgICBpZiAoISBlbGZfbGlua19mbHVzaF9vdXRwdXRfc3ltcyAoZmluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZWxmX3N3YXBfc3ltYm9sX291dCAoZmluZm8tPm91dHB1dF9iZmQsIGVsZnN5bSwKLQkJICAgICAgIChQVFIpIChmaW5mby0+c3ltYnVmICsgZmluZm8tPnN5bWJ1Zl9jb3VudCkpOwotICArK2ZpbmZvLT5zeW1idWZfY291bnQ7Ci0KLSAgKysgYmZkX2dldF9zeW1jb3VudCAoZmluZm8tPm91dHB1dF9iZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGbHVzaCB0aGUgb3V0cHV0IHN5bWJvbHMgdG8gdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfZmx1c2hfb3V0cHV0X3N5bXMgKGZpbmZvKQotICAgICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm87Ci17Ci0gIGlmIChmaW5mby0+c3ltYnVmX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiOwotCi0gICAgICBzeW10YWIgPSAmZWxmX3RkYXRhIChmaW5mby0+b3V0cHV0X2JmZCktPnN5bXRhYl9oZHI7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoZmluZm8tPm91dHB1dF9iZmQsIHN5bXRhYi0+c2hfb2Zmc2V0ICsgc3ltdGFiLT5zaF9zaXplLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfd3JpdGUgKChQVFIpIGZpbmZvLT5zeW1idWYsIGZpbmZvLT5zeW1idWZfY291bnQsCi0JCQkgc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSwgZmluZm8tPm91dHB1dF9iZmQpCi0JICAgICAgIT0gZmluZm8tPnN5bWJ1Zl9jb3VudCAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3ltdGFiLT5zaF9zaXplICs9IGZpbmZvLT5zeW1idWZfY291bnQgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pOwotCi0gICAgICBmaW5mby0+c3ltYnVmX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhbiBleHRlcm5hbCBzeW1ib2wgdG8gdGhlIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgY2FsbGVkIGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlIHRyYXZlcnNhbCByb3V0aW5lLiAgV2hlbiBnZW5lcmF0aW5nIGEgc2hhcmVkIG9iamVjdCwKLSAgIHdlIGdvIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lIHdlIG91dHB1dAotICAgYW55dGhpbmcgdGhhdCBtaWdodCBoYXZlIGJlZW4gZm9yY2VkIHRvIGxvY2FsIHNjb3BlIGluIGEgdmVyc2lvbgotICAgc2NyaXB0LiAgVGhlIHNlY29uZCB0aW1lIHdlIG91dHB1dCB0aGUgc3ltYm9scyB0aGF0IGFyZSBzdGlsbAotICAgZ2xvYmFsIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBkYXRhOwotewotICBzdHJ1Y3QgZWxmX291dGV4dF9pbmZvICplb2luZm8gPSAoc3RydWN0IGVsZl9vdXRleHRfaW5mbyAqKSBkYXRhOwotICBzdHJ1Y3QgZWxmX2ZpbmFsX2xpbmtfaW5mbyAqZmluZm8gPSBlb2luZm8tPmZpbmZvOwotICBib29sZWFuIHN0cmlwOwotICBFbGZfSW50ZXJuYWxfU3ltIHN5bTsKLSAgYXNlY3Rpb24gKmlucHV0X3NlYzsKLQotICAvKiBEZWNpZGUgd2hldGhlciB0byBvdXRwdXQgdGhpcyBzeW1ib2wgaW4gdGhpcyBwYXNzLiAgKi8KLSAgaWYgKGVvaW5mby0+bG9jYWxzeW1zKQotICAgIHsKLSAgICAgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19GT1JDRURfTE9DQUwpICE9IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBub3QgY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYW5kIHRoaXMgc3ltYm9sIGlzCi0gICAgIHJlZmVyZW5jZWQgYnkgYSBzaGFyZWQgbGlicmFyeSBidXQgaXMgbm90IGRlZmluZWQgYW55d2hlcmUsIHRoZW4KLSAgICAgd2FybiB0aGF0IGl0IGlzIHVuZGVmaW5lZC4gIElmIHdlIGRvIG5vdCBkbyB0aGlzLCB0aGUgcnVudGltZQotICAgICBsaW5rZXIgd2lsbCBjb21wbGFpbiB0aGF0IHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIHdoZW4gdGhlCi0gICAgIHByb2dyYW0gaXMgcnVuLiAgV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzeW1ib2xzIHRoYXQgYXJlCi0gICAgIHJlZmVyZW5jZWQgYnkgcmVndWxhciBmaWxlcywgYmVjYXVzZSB3ZSB3aWxsIGFscmVhZHkgaGF2ZSBpc3N1ZWQKLSAgICAgd2FybmluZ3MgZm9yIHRoZW0uICAqLwotICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiAhIChmaW5mby0+aW5mby0+c2hhcmVkCi0JICAgICYmICFmaW5mby0+aW5mby0+bm9fdW5kZWZpbmVkKQotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfUkVGX0RZTkFNSUMpICE9IDAKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmRlZmluZWRfc3ltYm9sKQotCSAgICAgKGZpbmZvLT5pbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoLT5yb290LnUudW5kZWYuYWJmZCwKLQkgICAgICAoYXNlY3Rpb24gKikgTlVMTCwgMCkpKQotCXsKLQkgIGVvaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IHdhbnQgdG8gb3V0cHV0IHN5bWJvbHMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gbWVudGlvbmVkIGJ5Ci0gICAgIGEgcmVndWxhciBmaWxlLCBvciB0aGF0IHdlIGhhdmUgYmVlbiB0b2xkIHRvIHN0cmlwLiAgSG93ZXZlciwgaWYKLSAgICAgaC0+aW5keCBpcyBzZXQgdG8gLTIsIHRoZSBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jIGFuZCB3ZSBtdXN0Ci0gICAgIG91dHB1dCBpdC4gICovCi0gIGlmIChoLT5pbmR4ID09IC0yKQotICAgIHN0cmlwID0gZmFsc2U7Ci0gIGVsc2UgaWYgKCgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hBU0hfREVGX0RZTkFNSUMpICE9IDAKLQkgICAgfHwgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9EWU5BTUlDKSAhPSAwKQotCSAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikgPT0gMAotCSAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgPT0gMCkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgICB8fCAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX3NvbWUKLQkgICAgICAgJiYgYmZkX2hhc2hfbG9va3VwIChmaW5mby0+aW5mby0+a2VlcF9oYXNoLAotCQkJCSAgIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJICAgZmFsc2UsIGZhbHNlKSA9PSBOVUxMKSkKLSAgICBzdHJpcCA9IHRydWU7Ci0gIGVsc2UKLSAgICBzdHJpcCA9IGZhbHNlOwotCi0gIC8qIElmIHdlJ3JlIHN0cmlwcGluZyBpdCwgYW5kIGl0J3Mgbm90IGEgZHluYW1pYyBzeW1ib2wsIHRoZXJlJ3MKLSAgICAgbm90aGluZyBlbHNlIHRvIGRvLiAgKi8KLSAgaWYgKHN0cmlwICYmIGgtPmR5bmluZHggPT0gLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc3ltLnN0X3ZhbHVlID0gMDsKLSAgc3ltLnN0X3NpemUgPSBoLT5zaXplOwotICBzeW0uc3Rfb3RoZXIgPSBoLT5vdGhlcjsKLSAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfRk9SQ0VEX0xPQ0FMKSAhPSAwKQotICAgIHN5bS5zdF9pbmZvID0gRUxGX1NUX0lORk8gKFNUQl9MT0NBTCwgaC0+dHlwZSk7Ci0gIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhawotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX1dFQUssIGgtPnR5cGUpOwotICBlbHNlCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgaC0+dHlwZSk7Ci0KLSAgc3dpdGNoIChoLT5yb290LnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX25ldzoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICAgIGlucHV0X3NlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fVU5ERUY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0gICAgICBpbnB1dF9zZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgc3ltLnN0X3NobmR4ID0gU0hOX1VOREVGOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHsKLQlpbnB1dF9zZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JaWYgKGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQkgIHsKLQkgICAgc3ltLnN0X3NobmR4ID0KLQkgICAgICBfYmZkX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24gKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkJIGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24pOwotCSAgICBpZiAoc3ltLnN0X3NobmR4ID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IGNvdWxkIG5vdCBmaW5kIG91dHB1dCBzZWN0aW9uICVzIGZvciBpbnB1dCBzZWN0aW9uICVzIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGZpbmZvLT5vdXRwdXRfYmZkKSwKLQkJICAgaW5wdXRfc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwKLQkJICAgaW5wdXRfc2VjLT5uYW1lKTsKLQkJZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCi0JICAgIC8qIEVMRiBzeW1ib2xzIGluIHJlbG9jYXRlYWJsZSBmaWxlcyBhcmUgc2VjdGlvbiByZWxhdGl2ZSwKLQkgICAgICAgYnV0IGluIG5vbnJlbG9jYXRlYWJsZSBmaWxlcyB0aGV5IGFyZSB2aXJ0dWFsCi0JICAgICAgIGFkZHJlc3Nlcy4gICovCi0JICAgIHN5bS5zdF92YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWUgKyBpbnB1dF9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgIGlmICghIGZpbmZvLT5pbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgICAgc3ltLnN0X3ZhbHVlICs9IGlucHV0X3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIEJGRF9BU1NFUlQgKGlucHV0X3NlYy0+b3duZXIgPT0gTlVMTAotCQkJfHwgKGlucHV0X3NlYy0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCk7Ci0JICAgIHN5bS5zdF9zaG5keCA9IFNITl9VTkRFRjsKLQkgICAgaW5wdXRfc2VjID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbGlua19oYXNoX2NvbW1vbjoKLSAgICAgIGlucHV0X3NlYyA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0gICAgICBzeW0uc3Rfc2huZHggPSBTSE5fQ09NTU9OOwotICAgICAgc3ltLnN0X3ZhbHVlID0gMSA8PCBoLT5yb290LnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICAgIC8qIFRoZXNlIHN5bWJvbHMgYXJlIGNyZWF0ZWQgYnkgc3ltYm9sIHZlcnNpb25pbmcuICBUaGV5IHBvaW50Ci0gICAgICAgICB0byB0aGUgZGVjb3JhdGVkIHZlcnNpb24gb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgaWYgdGhlCi0gICAgICAgICBzeW1ib2wgZm9vQEBHTlVfMS4yIGlzIHRoZSBkZWZhdWx0LCB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICAgICBmb28gaXMgdXNlZCB3aXRoIG5vIHZlcnNpb24sIHRoZW4gd2UgYWRkIGFuIGluZGlyZWN0IHN5bWJvbAotICAgICAgICAgZm9vIHdoaWNoIHBvaW50cyB0byBmb29AQEdOVV8xLjIuICBXZSBpZ25vcmUgdGhlc2Ugc3ltYm9scywKLSAgICAgICAgIHNpbmNlIHRoZSBpbmRpcmVjdGVkIHN5bWJvbCBpcyBhbHJlYWR5IGluIHRoZSBoYXNoIHRhYmxlLiAgSWYKLSAgICAgICAgIHRoZSBpbmRpcmVjdCBzeW1ib2wgaXMgbm9uLUVMRiwgZmFsbCB0aHJvdWdoIGFuZCBvdXRwdXQgaXQuICAqLwotICAgICAgaWYgKChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfTk9OX0VMRikgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIFdlIGNhbid0IHJlcHJlc2VudCB0aGVzZSBzeW1ib2xzIGluIEVMRiwgYWx0aG91Z2ggYSB3YXJuaW5nCi0gICAgICAgICBzeW1ib2wgbWF5IGhhdmUgY29tZSBmcm9tIGEgLmdudS53YXJuaW5nLlNZTUJPTCBzZWN0aW9uLiAgV2UKLSAgICAgICAgIGp1c3QgcHV0IHRoZSB0YXJnZXQgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgSWYgdGhlIHRhcmdldAotICAgICAgICAgc3ltYm9sIGRvZXMgbm90IHJlYWxseSBleGlzdCwgZG9uJ3QgZG8gYW55dGhpbmcuICAqLwotICAgICAgaWYgKGgtPnJvb3QudS5pLmxpbmstPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gKGVsZl9saW5rX291dHB1dF9leHRzeW0KLQkgICAgICAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopIGgtPnJvb3QudS5pLmxpbmssIGRhdGEpKTsKLSAgICB9Ci0KLSAgLyogR2l2ZSB0aGUgcHJvY2Vzc29yIGJhY2tlbmQgYSBjaGFuY2UgdG8gdHdlYWsgdGhlIHN5bWJvbCB2YWx1ZSwKLSAgICAgYW5kIGFsc28gdG8gZmluaXNoIHVwIGFueXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgdGhpcwotICAgICBzeW1ib2wuICAqLwotICBpZiAoKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICB8fCAoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0ZPUkNFRF9MT0NBTCkgIT0gMCkKLSAgICAgICYmIGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZWxmX2JhY2tlbmRfZGF0YSAqYmVkOwotCi0gICAgICBiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoZmluZm8tPm91dHB1dF9iZmQpOwotICAgICAgaWYgKCEgKCgqYmVkLT5lbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wpCi0JICAgICAoZmluZm8tPm91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLCBoLCAmc3ltKSkpCi0JewotCSAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG1hcmtpbmcgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQsIGFuZCB0aGVyZSBhcmUgbm8KLSAgICAgbm9uLXdlYWsgcmVmZXJlbmNlcyB0byB0aGlzIHN5bWJvbCBmcm9tIGEgcmVndWxhciBvYmplY3QsIHRoZW4KLSAgICAgbWFyayB0aGUgc3ltYm9sIGFzIHdlYWsgdW5kZWZpbmVkLiAgV2UgY2FuJ3QgZG8gdGhpcyBlYXJsaWVyLAotICAgICBiZWNhdXNlIGl0IG1pZ2h0IG5vdCBiZSBtYXJrZWQgYXMgdW5kZWZpbmVkIHVudGlsIHRoZQotICAgICBmaW5pc2hfZHluYW1pY19zeW1ib2wgcm91dGluZSBnZXRzIHRocm91Z2ggd2l0aCBpdC4gICovCi0gIGlmIChzeW0uc3Rfc2huZHggPT0gU0hOX1VOREVGCi0gICAgICAmJiBzeW0uc3RfaW5mbyA9PSBFTEZfU1RfSU5GTyAoU1RCX0dMT0JBTCwgaC0+dHlwZSkKLSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9SRUZfUkVHVUxBUikgIT0gMAotICAgICAgJiYgKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX1JFRl9SRUdVTEFSX05PTldFQUspID09IDApCi0gICAgc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoU1RCX1dFQUssIGgtPnR5cGUpOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIHNob3VsZCBiZSBwdXQgaW4gdGhlIC5keW5zeW0gc2VjdGlvbiwgdGhlbiBwdXQgaXQKLSAgICAgdGhlcmUgbm93LiAgV2UgaGF2ZSBhbHJlYWR5IGtub3cgdGhlIHN5bWJvbCBpbmRleC4gIFdlIGFsc28gZmlsbAotICAgICBpbiB0aGUgZW50cnkgaW4gdGhlIC5oYXNoIHNlY3Rpb24uICAqLwotICBpZiAoaC0+ZHluaW5keCAhPSAtMQotICAgICAgJiYgZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+ZHluYW1pY19zZWN0aW9uc19jcmVhdGVkKQotICAgIHsKLSAgICAgIHNpemVfdCBidWNrZXRjb3VudDsKLSAgICAgIHNpemVfdCBidWNrZXQ7Ci0gICAgICBiZmRfYnl0ZSAqYnVja2V0cG9zOwotICAgICAgYmZkX3ZtYSBjaGFpbjsKLQotICAgICAgc3ltLnN0X25hbWUgPSBoLT5keW5zdHJfaW5kZXg7Ci0KLSAgICAgIGVsZl9zd2FwX3N5bWJvbF9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCAmc3ltLAotCQkJICAgKFBUUikgKCgoRWxmX0V4dGVybmFsX1N5bSAqKQotCQkJCSAgIGZpbmZvLT5keW5zeW1fc2VjLT5jb250ZW50cykKLQkJCQkgICsgaC0+ZHluaW5keCkpOwotCi0gICAgICBidWNrZXRjb3VudCA9IGVsZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmJ1Y2tldGNvdW50OwotICAgICAgYnVja2V0ID0gaC0+ZWxmX2hhc2hfdmFsdWUgJSBidWNrZXRjb3VudDsKLSAgICAgIGJ1Y2tldHBvcyA9ICgoYmZkX2J5dGUgKikgZmluZm8tPmhhc2hfc2VjLT5jb250ZW50cwotCQkgICArIChidWNrZXQgKyAyKSAqIChBUkNIX1NJWkUgLyA4KSk7Ci0gICAgICBjaGFpbiA9IGdldF93b3JkIChmaW5mby0+b3V0cHV0X2JmZCwgYnVja2V0cG9zKTsKLSAgICAgIHB1dF93b3JkIChmaW5mby0+b3V0cHV0X2JmZCwgaC0+ZHluaW5keCwgYnVja2V0cG9zKTsKLSAgICAgIHB1dF93b3JkIChmaW5mby0+b3V0cHV0X2JmZCwgY2hhaW4sCi0JCSgoYmZkX2J5dGUgKikgZmluZm8tPmhhc2hfc2VjLT5jb250ZW50cwotCQkgKyAoYnVja2V0Y291bnQgKyAyICsgaC0+ZHluaW5keCkgKiAoQVJDSF9TSVpFIC8gOCkpKTsKLQotICAgICAgaWYgKGZpbmZvLT5zeW12ZXJfc2VjICE9IE5VTEwgJiYgZmluZm8tPnN5bXZlcl9zZWMtPmNvbnRlbnRzICE9IE5VTEwpCi0JewotCSAgRWxmX0ludGVybmFsX1ZlcnN5bSBpdmVyc3ltOwotCi0JICBpZiAoKGgtPmVsZl9saW5rX2hhc2hfZmxhZ3MgJiBFTEZfTElOS19IQVNIX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnZlcmluZm8udmVyZGVmID09IE5VTEwpCi0JCWl2ZXJzeW0udnNfdmVycyA9IDA7Ci0JICAgICAgZWxzZQotCQlpdmVyc3ltLnZzX3ZlcnMgPSBoLT52ZXJpbmZvLnZlcmRlZi0+dmRfZXhwX3JlZm5vICsgMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnZlcmluZm8udmVydHJlZSA9PSBOVUxMKQotCQlpdmVyc3ltLnZzX3ZlcnMgPSAxOwotCSAgICAgIGVsc2UKLQkJaXZlcnN5bS52c192ZXJzID0gaC0+dmVyaW5mby52ZXJ0cmVlLT52ZXJudW0gKyAxOwotCSAgICB9Ci0KLQkgIGlmICgoaC0+ZWxmX2xpbmtfaGFzaF9mbGFncyAmIEVMRl9MSU5LX0hJRERFTikgIT0gMCkKLQkgICAgaXZlcnN5bS52c192ZXJzIHw9IFZFUlNZTV9ISURERU47Ci0KLQkgIF9iZmRfZWxmX3N3YXBfdmVyc3ltX291dCAoZmluZm8tPm91dHB1dF9iZmQsICZpdmVyc3ltLAotCQkJCSAgICAoKChFbGZfRXh0ZXJuYWxfVmVyc3ltICopCi0JCQkJICAgICAgZmluZm8tPnN5bXZlcl9zZWMtPmNvbnRlbnRzKQotCQkJCSAgICAgKyBoLT5keW5pbmR4KSk7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBzdHJpcHBpbmcgaXQsIHRoZW4gaXQgd2FzIGp1c3QgYSBkeW5hbWljIHN5bWJvbCwgYW5kCi0gICAgIHRoZXJlJ3Mgbm90aGluZyBlbHNlIHRvIGRvLiAgKi8KLSAgaWYgKHN0cmlwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmluZHggPSBiZmRfZ2V0X3N5bWNvdW50IChmaW5mby0+b3V0cHV0X2JmZCk7Ci0KLSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsICZzeW0sIGlucHV0X3NlYykpCi0gICAgewotICAgICAgZW9pbmZvLT5mYWlsZWQgPSB0cnVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTGluayBhbiBpbnB1dCBmaWxlIGludG8gdGhlIGxpbmtlciBvdXRwdXQgZmlsZS4gIFRoaXMgZnVuY3Rpb24KLSAgIGhhbmRsZXMgYWxsIHRoZSBzZWN0aW9ucyBhbmQgcmVsb2NhdGlvbnMgb2YgdGhlIGlucHV0IGZpbGUgYXQgb25jZS4KLSAgIFRoaXMgaXMgc28gdGhhdCB3ZSBvbmx5IGhhdmUgdG8gcmVhZCB0aGUgbG9jYWwgc3ltYm9scyBvbmNlLCBhbmQKLSAgIGRvbid0IGhhdmUgdG8ga2VlcCB0aGVtIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCBlbGZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci17Ci0gIGJvb2xlYW4gKCpyZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JCQkJICAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCQkJICAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiwgYXNlY3Rpb24gKiopKTsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLSAgc2l6ZV90IGxvY3N5bWNvdW50OwotICBzaXplX3QgZXh0c3ltb2ZmOwotICBFbGZfRXh0ZXJuYWxfU3ltICpleHRlcm5hbF9zeW1zOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltOwotICBFbGZfRXh0ZXJuYWxfU3ltICplc3ltZW5kOwotICBFbGZfSW50ZXJuYWxfU3ltICppc3ltOwotICBsb25nICpwaW5kZXg7Ci0gIGFzZWN0aW9uICoqcHBzZWN0aW9uOwotICBhc2VjdGlvbiAqbzsKLQotICBvdXRwdXRfYmZkID0gZmluZm8tPm91dHB1dF9iZmQ7Ci0gIHJlbG9jYXRlX3NlY3Rpb24gPQotICAgIGdldF9lbGZfYmFja2VuZF9kYXRhIChvdXRwdXRfYmZkKS0+ZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbjsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvYmplY3QsIHdlIGRvbid0IHdhbnQgdG8gZG8gYW55dGhpbmcgaGVyZToKLSAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgbG9jYWwgc3ltYm9scywgYW5kIHdlIGRvbid0IHdhbnQgdGhlIHNlY3Rpb24KLSAgICAgY29udGVudHMuICAqLwotICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpbnB1dF9iZmQpLT5zeW10YWJfaGRyOwotICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIGV4dHN5bW9mZiA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9pbmZvOwotICAgICAgZXh0c3ltb2ZmID0gc3ltdGFiX2hkci0+c2hfaW5mbzsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gIGlmIChzeW10YWJfaGRyLT5jb250ZW50cyAhPSBOVUxMKQotICAgIGV4dGVybmFsX3N5bXMgPSAoRWxmX0V4dGVybmFsX1N5bSAqKSBzeW10YWJfaGRyLT5jb250ZW50czsKLSAgZWxzZSBpZiAobG9jc3ltY291bnQgPT0gMCkKLSAgICBleHRlcm5hbF9zeW1zID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVybmFsX3N5bXMgPSBmaW5mby0+ZXh0ZXJuYWxfc3ltczsKLSAgICAgIGlmIChiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKGV4dGVybmFsX3N5bXMsIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSksCi0JCQlsb2NzeW1jb3VudCwgaW5wdXRfYmZkKQotCSAgICAgICE9IGxvY3N5bWNvdW50ICogc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBTd2FwIGluIHRoZSBsb2NhbCBzeW1ib2xzIGFuZCB3cml0ZSBvdXQgdGhlIG9uZXMgd2hpY2ggd2Uga25vdwotICAgICBhcmUgZ29pbmcgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotICBlc3ltID0gZXh0ZXJuYWxfc3ltczsKLSAgZXN5bWVuZCA9IGVzeW0gKyBsb2NzeW1jb3VudDsKLSAgaXN5bSA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBwaW5kZXggPSBmaW5mby0+aW5kaWNlczsKLSAgcHBzZWN0aW9uID0gZmluZm8tPnNlY3Rpb25zOwotICBmb3IgKDsgZXN5bSA8IGVzeW1lbmQ7IGVzeW0rKywgaXN5bSsrLCBwaW5kZXgrKywgcHBzZWN0aW9uKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKmlzZWM7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgRWxmX0ludGVybmFsX1N5bSBvc3ltOwotCi0gICAgICBlbGZfc3dhcF9zeW1ib2xfaW4gKGlucHV0X2JmZCwgZXN5bSwgaXN5bSk7Ci0gICAgICAqcGluZGV4ID0gLTE7Ci0KLSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKSkKLQl7Ci0JICBpZiAoRUxGX1NUX0JJTkQgKGlzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKLQkgICAgewotCSAgICAgICpwcHNlY3Rpb24gPSBOVUxMOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoaXN5bS0+c3Rfc2huZHggPT0gU0hOX1VOREVGKQotCWlzZWMgPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoaXN5bS0+c3Rfc2huZHggPiAwICYmIGlzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRSkKLQlpc2VjID0gc2VjdGlvbl9mcm9tX2VsZl9pbmRleCAoaW5wdXRfYmZkLCBpc3ltLT5zdF9zaG5keCk7Ci0gICAgICBlbHNlIGlmIChpc3ltLT5zdF9zaG5keCA9PSBTSE5fQUJTKQotCWlzZWMgPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgZWxzZSBpZiAoaXN5bS0+c3Rfc2huZHggPT0gU0hOX0NPTU1PTikKLQlpc2VjID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXaG8ga25vd3M/ICAqLwotCSAgaXNlYyA9IE5VTEw7Ci0JfQotCi0gICAgICAqcHBzZWN0aW9uID0gaXNlYzsKLQotICAgICAgLyogRG9uJ3Qgb3V0cHV0IHRoZSBmaXJzdCwgdW5kZWZpbmVkLCBzeW1ib2wuICAqLwotICAgICAgaWYgKGVzeW0gPT0gZXh0ZXJuYWxfc3ltcykKLQljb250aW51ZTsKLQotICAgICAgLyogSWYgd2UgYXJlIHN0cmlwcGluZyBhbGwgc3ltYm9scywgd2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgdGhpcwotCSBvbmUuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5ldmVyIG91dHB1dCBzZWN0aW9uIHN5bWJvbHMuICBJbnN0ZWFkLCB3ZSB1c2UgdGhlIHNlY3Rpb24KLQkgc3ltYm9sIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIGlmIChFTEZfU1RfVFlQRSAoaXN5bS0+c3RfaW5mbykgPT0gU1RUX1NFQ1RJT04pCi0JY29udGludWU7Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBkaXNjYXJkaW5nIGFsbCBsb2NhbCBzeW1ib2xzLCB3ZSBkb24ndCB3YW50IHRvCi0JIG91dHB1dCB0aGlzIG9uZS4gIElmIHdlIGFyZSBnZW5lcmF0aW5nIGEgcmVsb2NhdGVhYmxlIG91dHB1dAotCSBmaWxlLCB0aGVuIHNvbWUgb2YgdGhlIGxvY2FsIHN5bWJvbHMgbWF5IGJlIHJlcXVpcmVkIGJ5Ci0JIHJlbG9jczsgd2Ugb3V0cHV0IHRoZW0gYmVsb3cgYXMgd2UgZGlzY292ZXIgdGhhdCB0aGV5IGFyZQotCSBuZWVkZWQuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfYWxsKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIGEgc2VjdGlvbiB3aGljaCB3ZSBhcmUKLSAgICAgICAgIGRpc2NhcmRpbmcsIHdlIGRvbid0IG5lZWQgdG8ga2VlcCBpdCwgYnV0IG5vdGUgdGhhdAotICAgICAgICAgbGlua2VyX21hcmsgaXMgb25seSByZWxpYWJsZSBmb3Igc2VjdGlvbnMgdGhhdCBoYXZlIGNvbnRlbnRzLgotICAgICAgICAgRm9yIHRoZSBiZW5lZml0IG9mIHRoZSBNSVBTIEVMRiBsaW5rZXIsIHdlIGNoZWNrIFNFQ19FWENMVURFCi0gICAgICAgICBhcyB3ZWxsIGFzIGxpbmtlcl9tYXJrLiAgKi8KLSAgICAgIGlmIChpc3ltLT5zdF9zaG5keCA+IDAKLQkgICYmIGlzeW0tPnN0X3NobmR4IDwgU0hOX0xPUkVTRVJWRQotCSAgJiYgaXNlYyAhPSBOVUxMCi0JICAmJiAoKCEgaXNlYy0+bGlua2VyX21hcmsgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCkKLQkgICAgICB8fCAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JCSAgJiYgKGlzZWMtPmZsYWdzICYgU0VDX0VYQ0xVREUpICE9IDApKSkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuICAqLwotICAgICAgbmFtZSA9IGJmZF9lbGZfc3RyaW5nX2Zyb21fZWxmX3NlY3Rpb24gKGlucHV0X2JmZCwgc3ltdGFiX2hkci0+c2hfbGluaywKLQkJCQkJICAgICAgaXN5bS0+c3RfbmFtZSk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2VlIGlmIHdlIGFyZSBkaXNjYXJkaW5nIHN5bWJvbHMgd2l0aCB0aGlzIG5hbWUuICAqLwotICAgICAgaWYgKChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICAgPT0gTlVMTCkpCi0JICB8fCAoZmluZm8tPmluZm8tPmRpc2NhcmQgPT0gZGlzY2FyZF9sCi0JICAgICAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBnZXQgaGVyZSwgd2UgYXJlIGdvaW5nIHRvIG91dHB1dCB0aGlzIHN5bWJvbC4gICovCi0KLSAgICAgIG9zeW0gPSAqaXN5bTsKLQotICAgICAgLyogQWRqdXN0IHRoZSBzZWN0aW9uIGluZGV4IGZvciB0aGUgb3V0cHV0IGZpbGUuICAqLwotICAgICAgb3N5bS5zdF9zaG5keCA9IF9iZmRfZWxmX3NlY3Rpb25fZnJvbV9iZmRfc2VjdGlvbiAob3V0cHV0X2JmZCwKLQkJCQkJCQkgaXNlYy0+b3V0cHV0X3NlY3Rpb24pOwotICAgICAgaWYgKG9zeW0uc3Rfc2huZHggPT0gKHVuc2lnbmVkIHNob3J0KSAtMSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICpwaW5kZXggPSBiZmRfZ2V0X3N5bWNvdW50IChvdXRwdXRfYmZkKTsKLQotICAgICAgLyogRUxGIHN5bWJvbHMgaW4gcmVsb2NhdGVhYmxlIGZpbGVzIGFyZSBzZWN0aW9uIHJlbGF0aXZlLCBidXQKLQkgaW4gZXhlY3V0YWJsZSBmaWxlcyB0aGV5IGFyZSB2aXJ0dWFsIGFkZHJlc3Nlcy4gIE5vdGUgdGhhdAotCSB0aGlzIGNvZGUgYXNzdW1lcyB0aGF0IGFsbCBFTEYgc2VjdGlvbnMgaGF2ZSBhbiBhc3NvY2lhdGVkCi0JIEJGRCBzZWN0aW9uIHdpdGggYSByZWFzb25hYmxlIHZhbHVlIGZvciBvdXRwdXRfb2Zmc2V0OyBiZWxvdwotCSB3ZSBhc3N1bWUgdGhhdCB0aGV5IGFsc28gaGF2ZSBhIHJlYXNvbmFibGUgdmFsdWUgZm9yCi0JIG91dHB1dF9zZWN0aW9uLiAgQW55IHNwZWNpYWwgc2VjdGlvbnMgbXVzdCBiZSBzZXQgdXAgdG8gbWVldAotCSB0aGVzZSByZXF1aXJlbWVudHMuICAqLwotICAgICAgb3N5bS5zdF92YWx1ZSArPSBpc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQlvc3ltLnN0X3ZhbHVlICs9IGlzZWMtPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0KLSAgICAgIGlmICghIGVsZl9saW5rX291dHB1dF9zeW0gKGZpbmZvLCBuYW1lLCAmb3N5bSwgaXNlYykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZWxvY2F0ZSB0aGUgY29udGVudHMgb2YgZWFjaCBzZWN0aW9uLiAgKi8KLSAgZm9yIChvID0gaW5wdXRfYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLSAgICAgIGlmICghIG8tPmxpbmtlcl9tYXJrKQotCXsKLQkgIC8qIFRoaXMgc2VjdGlvbiB3YXMgb21pdHRlZCBmcm9tIHRoZSBsaW5rLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKChvLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgIHx8IChvLT5fcmF3X3NpemUgPT0gMCAmJiAoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpID09IDApKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSAhPSAwKQotCXsKLQkgIC8qIFNlY3Rpb24gd2FzIGNyZWF0ZWQgYnkgZWxmX2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLQkgICAgIG9yIHNvbWVzdWNoLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbi4gIFRoZXkgaGF2ZSBiZWVuIGNhY2hlZCBieSBhCi0gICAgICAgICByZWxheGF0aW9uIHJvdXRpbmUuICBOb3RlIHRoYXQgbyBpcyBhIHNlY3Rpb24gaW4gYW4gaW5wdXQKLSAgICAgICAgIGZpbGUsIHNvIHRoZSBjb250ZW50cyBmaWVsZCB3aWxsIG5vdCBoYXZlIGJlZW4gc2V0IGJ5IGFueSBvZgotICAgICAgICAgdGhlIHJvdXRpbmVzIHdoaWNoIHdvcmsgb24gb3V0cHV0IGZpbGVzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+dGhpc19oZHIuY29udGVudHMgIT0gTlVMTCkKLQljb250ZW50cyA9IGVsZl9zZWN0aW9uX2RhdGEgKG8pLT50aGlzX2hkci5jb250ZW50czsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb250ZW50cyA9IGZpbmZvLT5jb250ZW50czsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBvLCBjb250ZW50cywKLQkJCQkJICAoZmlsZV9wdHIpIDAsIG8tPl9yYXdfc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgRWxmX0ludGVybmFsX1JlbGEgKmludGVybmFsX3JlbG9jczsKLQotCSAgLyogR2V0IHRoZSBzd2FwcGVkIHJlbG9jcy4gICovCi0JICBpbnRlcm5hbF9yZWxvY3MgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkJICAgICAoaW5wdXRfYmZkLCBvLCBmaW5mby0+ZXh0ZXJuYWxfcmVsb2NzLAotCQkJICAgICAgZmluZm8tPmludGVybmFsX3JlbG9jcywgZmFsc2UpKTsKLQkgIGlmIChpbnRlcm5hbF9yZWxvY3MgPT0gTlVMTAotCSAgICAgICYmIG8tPnJlbG9jX2NvdW50ID4gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBSZWxvY2F0ZSB0aGUgc2VjdGlvbiBieSBpbnZva2luZyBhIGJhY2sgZW5kIHJvdXRpbmUuCi0KLQkgICAgIFRoZSBiYWNrIGVuZCByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBhZGp1c3RpbmcgdGhlCi0JICAgICBzZWN0aW9uIGNvbnRlbnRzIGFzIG5lY2Vzc2FyeSwgYW5kIChpZiB1c2luZyBSZWxhIHJlbG9jcwotCSAgICAgYW5kIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb3V0cHV0IGZpbGUpIGFkanVzdGluZyB0aGUKLQkgICAgIHJlbG9jIGFkZGVuZCBhcyBuZWNlc3NhcnkuCi0KLQkgICAgIFRoZSBiYWNrIGVuZCByb3V0aW5lIGRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgc2V0dGluZwotCSAgICAgdGhlIHJlbG9jIGFkZHJlc3Mgb3IgdGhlIHJlbG9jIHN5bWJvbCBpbmRleC4KLQotCSAgICAgVGhlIGJhY2sgZW5kIHJvdXRpbmUgaXMgZ2l2ZW4gYSBwb2ludGVyIHRvIHRoZSBzd2FwcGVkIGluCi0JICAgICBpbnRlcm5hbCBzeW1ib2xzLCBhbmQgY2FuIGFjY2VzcyB0aGUgaGFzaCB0YWJsZSBlbnRyaWVzCi0JICAgICBmb3IgdGhlIGV4dGVybmFsIHN5bWJvbHMgdmlhIGVsZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpLgotCi0JICAgICBXaGVuIGdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgdGhlIGJhY2sgZW5kIHJvdXRpbmUKLQkgICAgIG11c3QgaGFuZGxlIFNUQl9MT0NBTC9TVFRfU0VDVElPTiBzeW1ib2xzIHNwZWNpYWxseS4gIFRoZQotCSAgICAgb3V0cHV0IHN5bWJvbCBpcyBnb2luZyB0byBiZSBhIHNlY3Rpb24gc3ltYm9sCi0JICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiwgd2hpY2ggd2lsbCByZXF1aXJlCi0JICAgICB0aGUgYWRkZW5kIHRvIGJlIGFkanVzdGVkLiAgKi8KLQotCSAgaWYgKCEgKCpyZWxvY2F0ZV9zZWN0aW9uKSAob3V0cHV0X2JmZCwgZmluZm8tPmluZm8sCi0JCQkJICAgICBpbnB1dF9iZmQsIG8sIGNvbnRlbnRzLAotCQkJCSAgICAgaW50ZXJuYWxfcmVsb2NzLAotCQkJCSAgICAgZmluZm8tPmludGVybmFsX3N5bXMsCi0JCQkJICAgICBmaW5mby0+c2VjdGlvbnMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGlmIChmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgKmlyZWxhOwotCSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhICppcmVsYWVuZDsKLQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICppbnB1dF9yZWxfaGRyOwotCSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICpvdXRwdXRfcmVsX2hkcjsKLQotCSAgICAgIC8qIEFkanVzdCB0aGUgcmVsb2MgYWRkcmVzc2VzIGFuZCBzeW1ib2wgaW5kaWNlcy4gICovCi0KLQkgICAgICBpcmVsYSA9IGludGVybmFsX3JlbG9jczsKLQkgICAgICBpcmVsYWVuZCA9IGlyZWxhICsgby0+cmVsb2NfY291bnQ7Ci0JICAgICAgcmVsX2hhc2ggPSAoZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfaGFzaGVzCi0JCQkgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkgICAgICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKywgcmVsX2hhc2grKykKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSAqaXN5bTsKLQkJICBhc2VjdGlvbiAqc2VjOwotCi0JCSAgaXJlbGEtPnJfb2Zmc2V0ICs9IG8tPm91dHB1dF9vZmZzZXQ7Ci0KLQkJICByX3N5bW5keCA9IEVMRl9SX1NZTSAoaXJlbGEtPnJfaW5mbyk7Ci0KLQkJICBpZiAocl9zeW1uZHggPT0gMCkKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgaWYgKHJfc3ltbmR4ID49IGxvY3N5bWNvdW50Ci0JCSAgICAgIHx8IChlbGZfYmFkX3N5bXRhYiAoaW5wdXRfYmZkKQotCQkJICAmJiBmaW5mby0+c2VjdGlvbnNbcl9zeW1uZHhdID09IE5VTEwpKQotCQkgICAgewotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqcmg7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wuICBXZQotCQkJIGhhdmUgbm90IHlldCBvdXRwdXQgYWxsIHRoZSBsb2NhbCBzeW1ib2xzLCBzbwotCQkJIHdlIGRvIG5vdCBrbm93IHRoZSBzeW1ib2wgaW5kZXggb2YgYW55IGdsb2JhbAotCQkJIHN5bWJvbC4gIFdlIHNldCB0aGUgcmVsX2hhc2ggZW50cnkgZm9yIHRoaXMKLQkJCSByZWxvYyB0byBwb2ludCB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkKLQkJCSBmb3IgdGhpcyBzeW1ib2wuICBUaGUgc3ltYm9sIGluZGV4IGlzIHRoZW4KLQkJCSBzZXQgYXQgdGhlIGVuZCBvZiBlbGZfYmZkX2ZpbmFsX2xpbmsuICAqLwotCQkgICAgICBpbmR4ID0gcl9zeW1uZHggLSBleHRzeW1vZmY7Ci0JCSAgICAgIHJoID0gZWxmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbaW5keF07Ci0JCSAgICAgIHdoaWxlIChyaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkJCSAgICAgfHwgcmgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JCQlyaCA9IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSByaC0+cm9vdC51LmkubGluazsKLQotCQkgICAgICAvKiBTZXR0aW5nIHRoZSBpbmRleCB0byAtMiB0ZWxscwotCQkJIGVsZl9saW5rX291dHB1dF9leHRzeW0gdGhhdCB0aGlzIHN5bWJvbCBpcwotCQkJIHVzZWQgYnkgYSByZWxvYy4gICovCi0JCSAgICAgIEJGRF9BU1NFUlQgKHJoLT5pbmR4IDwgMCk7Ci0JCSAgICAgIHJoLT5pbmR4ID0gLTI7Ci0KLQkJICAgICAgKnJlbF9oYXNoID0gcmg7Ci0KLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0KLQkJICAvKiBUaGlzIGlzIGEgcmVsb2MgYWdhaW5zdCBhIGxvY2FsIHN5bWJvbC4gKi8KLQotCQkgICpyZWxfaGFzaCA9IE5VTEw7Ci0JCSAgaXN5bSA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zICsgcl9zeW1uZHg7Ci0JCSAgc2VjID0gZmluZm8tPnNlY3Rpb25zW3Jfc3ltbmR4XTsKLQkJICBpZiAoRUxGX1NUX1RZUEUgKGlzeW0tPnN0X2luZm8pID09IFNUVF9TRUNUSU9OKQotCQkgICAgewotCQkgICAgICAvKiBJIHN1cHBvc2UgdGhlIGJhY2tlbmQgb3VnaHQgdG8gZmlsbCBpbiB0aGUKLQkJCSBzZWN0aW9uIG9mIGFueSBTVFRfU0VDVElPTiBzeW1ib2wgYWdhaW5zdCBhCi0JCQkgcHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24uICBJZiB3ZSBoYXZlCi0JCQkgZGlzY2FyZGVkIGEgc2VjdGlvbiwgdGhlIG91dHB1dF9zZWN0aW9uIHdpbGwKLQkJCSBiZSB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gICovCi0JCSAgICAgIGlmIChzZWMgIT0gTlVMTAotCQkJICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChzZWMpCi0JCQkgICAgICB8fCAoc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JCQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYy0+b3V0cHV0X3NlY3Rpb24pKSkpCi0JCQlyX3N5bW5keCA9IDA7Ci0JCSAgICAgIGVsc2UgaWYgKHNlYyA9PSBOVUxMIHx8IHNlYy0+b3duZXIgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICByX3N5bW5keCA9IHNlYy0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJCSAgQkZEX0FTU0VSVCAocl9zeW1uZHggIT0gMCk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoZmluZm8tPmluZGljZXNbcl9zeW1uZHhdID09IC0xKQotCQkJewotCQkJICB1bnNpZ25lZCBsb25nIGxpbms7Ci0JCQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JCQkgIGFzZWN0aW9uICpvc2VjOwotCi0JCQkgIGlmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFlvdSBjYW4ndCBkbyBsZCAtciAtcy4gICovCi0JCQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkJICAgIH0KLQotCQkJICAvKiBUaGlzIHN5bWJvbCB3YXMgc2tpcHBlZCBlYXJsaWVyLCBidXQKLQkJCSAgICAgc2luY2UgaXQgaXMgbmVlZGVkIGJ5IGEgcmVsb2MsIHdlCi0JCQkgICAgIG11c3Qgb3V0cHV0IGl0IG5vdy4gICovCi0JCQkgIGxpbmsgPSBzeW10YWJfaGRyLT5zaF9saW5rOwotCQkJICBuYW1lID0gYmZkX2VsZl9zdHJpbmdfZnJvbV9lbGZfc2VjdGlvbiAoaW5wdXRfYmZkLAotCQkJCQkJCQkgIGxpbmssCi0JCQkJCQkJCSAgaXN5bS0+c3RfbmFtZSk7Ci0JCQkgIGlmIChuYW1lID09IE5VTEwpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIG9zZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCQkJICBpc3ltLT5zdF9zaG5keCA9Ci0JCQkgICAgX2JmZF9lbGZfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uIChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAgICBvc2VjKTsKLQkJCSAgaWYgKGlzeW0tPnN0X3NobmR4ID09ICh1bnNpZ25lZCBzaG9ydCkgLTEpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIGlzeW0tPnN0X3ZhbHVlICs9IHNlYy0+b3V0cHV0X29mZnNldDsKLQkJCSAgaWYgKCEgZmluZm8tPmluZm8tPnJlbG9jYXRlYWJsZSkKLQkJCSAgICBpc3ltLT5zdF92YWx1ZSArPSBvc2VjLT52bWE7Ci0KLQkJCSAgZmluZm8tPmluZGljZXNbcl9zeW1uZHhdID0gYmZkX2dldF9zeW1jb3VudCAob3V0cHV0X2JmZCk7Ci0KLQkJCSAgaWYgKCEgZWxmX2xpbmtfb3V0cHV0X3N5bSAoZmluZm8sIG5hbWUsIGlzeW0sIHNlYykpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCSAgICAgIHJfc3ltbmR4ID0gZmluZm8tPmluZGljZXNbcl9zeW1uZHhdOwotCQkgICAgfQotCi0JCSAgaXJlbGEtPnJfaW5mbyA9IEVMRl9SX0lORk8gKHJfc3ltbmR4LAotCQkJCQkgICAgICBFTEZfUl9UWVBFIChpcmVsYS0+cl9pbmZvKSk7Ci0JCX0KLQotCSAgICAgIC8qIFN3YXAgb3V0IHRoZSByZWxvY3MuICAqLwotCSAgICAgIGlucHV0X3JlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAobyktPnJlbF9oZHI7Ci0JICAgICAgb3V0cHV0X3JlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAoby0+b3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyOwotCSAgICAgIEJGRF9BU1NFUlQgKG91dHB1dF9yZWxfaGRyLT5zaF9lbnRzaXplCi0JCQkgID09IGlucHV0X3JlbF9oZHItPnNoX2VudHNpemUpOwotCSAgICAgIGlyZWxhID0gaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGlyZWxhZW5kID0gaXJlbGEgKyBvLT5yZWxvY19jb3VudDsKLQkgICAgICBpZiAoaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZSA9PSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWwpKQotCQl7Ci0JCSAgRWxmX0V4dGVybmFsX1JlbCAqZXJlbDsKLQotCQkgIGVyZWwgPSAoKEVsZl9FeHRlcm5hbF9SZWwgKikgb3V0cHV0X3JlbF9oZHItPmNvbnRlbnRzCi0JCQkgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkJICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKywgZXJlbCsrKQotCQkgICAgewotCQkgICAgICBFbGZfSW50ZXJuYWxfUmVsIGlyZWw7Ci0KLQkJICAgICAgaXJlbC5yX29mZnNldCA9IGlyZWxhLT5yX29mZnNldDsKLQkJICAgICAgaXJlbC5yX2luZm8gPSBpcmVsYS0+cl9pbmZvOwotCQkgICAgICBCRkRfQVNTRVJUIChpcmVsYS0+cl9hZGRlbmQgPT0gMCk7Ci0JCSAgICAgIGVsZl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJmlyZWwsIGVyZWwpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotCi0JCSAgQkZEX0FTU0VSVCAoaW5wdXRfcmVsX2hkci0+c2hfZW50c2l6ZQotCQkJICAgICAgPT0gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfUmVsYSkpOwotCQkgIGVyZWxhID0gKChFbGZfRXh0ZXJuYWxfUmVsYSAqKSBvdXRwdXRfcmVsX2hkci0+Y29udGVudHMKLQkJCSAgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkJICBmb3IgKDsgaXJlbGEgPCBpcmVsYWVuZDsgaXJlbGErKywgZXJlbGErKykKLQkJICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsIGlyZWxhLCBlcmVsYSk7Ci0JCX0KLQotCSAgICAgIG8tPm91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCArPSBvLT5yZWxvY19jb3VudDsKLQkgICAgfQotCX0KLQotICAgICAgLyogV3JpdGUgb3V0IHRoZSBtb2RpZmllZCBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgICAgIGlmIChlbGZfc2VjdGlvbl9kYXRhIChvKS0+c3RhYl9pbmZvID09IE5VTEwpCi0JewotCSAgaWYgKCEgKG8tPmZsYWdzICYgU0VDX0VYQ0xVREUpICYmCi0JICAgICAgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG8tPm91dHB1dF9zZWN0aW9uLAotCQkJCQkgIGNvbnRlbnRzLCBvLT5vdXRwdXRfb2Zmc2V0LAotCQkJCQkgIChvLT5fY29va2VkX3NpemUgIT0gMAotCQkJCQkgICA/IG8tPl9jb29rZWRfc2l6ZQotCQkJCQkgICA6IG8tPl9yYXdfc2l6ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIChfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLQkJIChvdXRwdXRfYmZkLCAmZWxmX2hhc2hfdGFibGUgKGZpbmZvLT5pbmZvKS0+c3RhYl9pbmZvLAotCQkgIG8sICZlbGZfc2VjdGlvbl9kYXRhIChvKS0+c3RhYl9pbmZvLCBjb250ZW50cykpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2VuZXJhdGUgYSByZWxvYyB3aGVuIGxpbmtpbmcgYW4gRUxGIGZpbGUuICBUaGlzIGlzIGEgcmVsb2MKLSAgIHJlcXVlc3RlZCBieSB0aGUgbGlua2VyLCBhbmQgZG9lcyBjb21lIGZyb20gYW55IGlucHV0IGZpbGUuICBUaGlzCi0gICBpcyB1c2VkIHRvIGJ1aWxkIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyB3aGVuIGxpbmtpbmcKLSAgIHdpdGggLVVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9yZWxvY19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBsb25nIGluZHg7Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBiZmRfdm1hIGFkZGVuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaF9wdHI7Ci0gIEVsZl9JbnRlcm5hbF9TaGRyICpyZWxfaGRyOwotCi0gIGhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChvdXRwdXRfYmZkLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jKTsKLSAgaWYgKGhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFkZGVuZCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kOwotCi0gIC8qIEZpZ3VyZSBvdXQgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gIHJlbF9oYXNoX3B0ciA9IChlbGZfc2VjdGlvbl9kYXRhIChvdXRwdXRfc2VjdGlvbiktPnJlbF9oYXNoZXMKLQkJICArIG91dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudCk7Ci0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgewotICAgICAgaW5keCA9IGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBCRkRfQVNTRVJUIChpbmR4ICE9IDApOwotICAgICAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIC8qIFRyZWF0IGEgcmVsb2MgYWdhaW5zdCBhIGRlZmluZWQgc3ltYm9sIGFzIHRob3VnaCBpdCB3ZXJlCi0gICAgICAgICBhY3R1YWxseSBhZ2FpbnN0IHRoZSBzZWN0aW9uLiAgKi8KLSAgICAgIGggPSAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkJCQkgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCi0JICBzZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgaW5keCA9IHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAqcmVsX2hhc2hfcHRyID0gTlVMTDsKLQkgIC8qIEl0IHNlZW1zIHRoYXQgd2Ugb3VnaHQgdG8gYWRkIHRoZSBzeW1ib2wgdmFsdWUgdG8gdGhlCi0gICAgICAgICAgICAgYWRkZW5kIGhlcmUsIGJ1dCBpbiBwcmFjdGljZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkCi0gICAgICAgICAgICAgYmVjYXVzZSBpdCB3YXMgcGFzc2VkIHRvIGNvbnN0cnVjdG9yX2NhbGxiYWNrLiAgKi8KLQkgIGFkZGVuZCArPSBzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQl9Ci0gICAgICBlbHNlIGlmIChoICE9IE5VTEwpCi0JewotCSAgLyogU2V0dGluZyB0aGUgaW5kZXggdG8gLTIgdGVsbHMgZWxmX2xpbmtfb3V0cHV0X2V4dHN5bSB0aGF0Ci0JICAgICB0aGlzIHN5bWJvbCBpcyB1c2VkIGJ5IGEgcmVsb2MuICAqLwotCSAgaC0+aW5keCA9IC0yOwotCSAgKnJlbF9oYXNoX3B0ciA9IGg7Ci0JICBpbmR4ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLCAoYmZkICopIE5VTEwsCi0JCSAgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGluZHggPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiBpbnBsYWNlIHJlbG9jLCB3ZSBtdXN0IHdyaXRlIHRoZSBhZGRlbmQgaW50byB0aGUKLSAgICAgb2JqZWN0IGZpbGUuICAqLwotICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSAmJiBhZGRlbmQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgcnN0YXQ7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcnN0YXQgPSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgb3V0cHV0X2JmZCwgYWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywKLQkJICAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgID8gYmZkX3NlY3Rpb25fbmFtZSAob3V0cHV0X2JmZCwKLQkJCQkgICAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24pCi0JCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAotCQkgIGhvd3RvLT5uYW1lLCBhZGRlbmQsIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCSAgKGJmZF92bWEpIDApKSkKLQkgICAgewotCSAgICAgIGZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBvayA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24sIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIGEgcmVsb2MgaXMgcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24gaW4gYQotICAgICByZWxvY2F0ZWFibGUgZmlsZSwgYW5kIGlzIGEgdmlydHVhbCBhZGRyZXNzIGluIGFuIGV4ZWN1dGFibGUKLSAgICAgZmlsZS4gICovCi0gIG9mZnNldCA9IGxpbmtfb3JkZXItPm9mZnNldDsKLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIG9mZnNldCArPSBvdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbF9oZHIgPSAmZWxmX3NlY3Rpb25fZGF0YSAob3V0cHV0X3NlY3Rpb24pLT5yZWxfaGRyOwotCi0gIGlmIChyZWxfaGRyLT5zaF90eXBlID09IFNIVF9SRUwpCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbCBpcmVsOwotICAgICAgRWxmX0V4dGVybmFsX1JlbCAqZXJlbDsKLQotICAgICAgaXJlbC5yX29mZnNldCA9IG9mZnNldDsKLSAgICAgIGlyZWwucl9pbmZvID0gRUxGX1JfSU5GTyAoaW5keCwgaG93dG8tPnR5cGUpOwotICAgICAgZXJlbCA9ICgoRWxmX0V4dGVybmFsX1JlbCAqKSByZWxfaGRyLT5jb250ZW50cwotCSAgICAgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLSAgICAgIGVsZl9zd2FwX3JlbG9jX291dCAob3V0cHV0X2JmZCwgJmlyZWwsIGVyZWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZl9JbnRlcm5hbF9SZWxhIGlyZWxhOwotICAgICAgRWxmX0V4dGVybmFsX1JlbGEgKmVyZWxhOwotCi0gICAgICBpcmVsYS5yX29mZnNldCA9IG9mZnNldDsKLSAgICAgIGlyZWxhLnJfaW5mbyA9IEVMRl9SX0lORk8gKGluZHgsIGhvd3RvLT50eXBlKTsKLSAgICAgIGlyZWxhLnJfYWRkZW5kID0gYWRkZW5kOwotICAgICAgZXJlbGEgPSAoKEVsZl9FeHRlcm5hbF9SZWxhICopIHJlbF9oZHItPmNvbnRlbnRzCi0JICAgICAgICsgb3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLSAgICAgIGVsZl9zd2FwX3JlbG9jYV9vdXQgKG91dHB1dF9iZmQsICZpcmVsYSwgZXJlbGEpOwotICAgIH0KLQotICArK291dHB1dF9zZWN0aW9uLT5yZWxvY19jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotLyogQWxsb2NhdGUgYSBwb2ludGVyIHRvIGxpdmUgaW4gYSBsaW5rZXIgY3JlYXRlZCBzZWN0aW9uLiAgKi8KLQotYm9vbGVhbgotZWxmX2NyZWF0ZV9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChhYmZkLCBpbmZvLCBsc2VjdCwgaCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBlbGZfbGlua2VyX3NlY3Rpb25fdCAqbHNlY3Q7Ci0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBjb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsOwotewotICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKnB0cl9saW5rZXJfc2VjdGlvbl9wdHIgPSBOVUxMOwotICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3NlY3Rpb25fcHRyOwotICB1bnNpZ25lZCBsb25nIHJfc3ltbmR4ID0gRUxGX1JfU1lNIChyZWwtPnJfaW5mbyk7OwotCi0gIEJGRF9BU1NFUlQgKGxzZWN0ICE9IE5VTEwpOwotCi0gIC8qIElzIHRoaXMgYSBnbG9iYWwgc3ltYm9sPyAqLwotICBpZiAoaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEhhcyB0aGlzIHN5bWJvbCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCBpZiBzbywgb3VyIHdvcmsgaXMgZG9uZSAqLwotICAgICAgaWYgKF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoaC0+bGlua2VyX3NlY3Rpb25fcG9pbnRlciwKLQkJCQkJCXJlbC0+cl9hZGRlbmQsCi0JCQkJCQlsc2VjdC0+d2hpY2gpKQotCXJldHVybiB0cnVlOwotCi0gICAgICBwdHJfbGlua2VyX3NlY3Rpb25fcHRyID0gJmgtPmxpbmtlcl9zZWN0aW9uX3BvaW50ZXI7Ci0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyBzeW1ib2wgaXMgb3V0cHV0IGFzIGEgZHluYW1pYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0JewotCSAgaWYgKCEgZWxmX2xpbmtfcmVjb3JkX2R5bmFtaWNfc3ltYm9sIChpbmZvLCBoKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGxzZWN0LT5yZWxfc2VjdGlvbikKLQlsc2VjdC0+cmVsX3NlY3Rpb24tPl9yYXdfc2l6ZSArPSBzaXplb2YgKEVsZl9FeHRlcm5hbF9SZWxhKTsKLSAgICB9Ci0KLSAgZWxzZSAgLyogQWxsb2NhdGlvbiBvZiBhIHBvaW50ZXIgdG8gYSBsb2NhbCBzeW1ib2wgKi8KLSAgICB7Ci0gICAgICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKnB0ciA9IGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyAoYWJmZCk7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIGEgdGFibGUgdG8gaG9sZCB0aGUgbG9jYWwgc3ltYm9scyBpZiBmaXJzdCB0aW1lICovCi0gICAgICBpZiAoIXB0cikKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbnVtX3N5bWJvbHMgPSBlbGZfdGRhdGEgKGFiZmQpLT5zeW10YWJfaGRyLnNoX2luZm87Ci0JICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaTsKLQotCSAgcHRyID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICoqKQotCSAgICBiZmRfYWxsb2MgKGFiZmQsIG51bV9zeW1ib2xzICogc2l6ZW9mIChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKSk7Ci0KLQkgIGlmICghcHRyKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIGVsZl9sb2NhbF9wdHJfb2Zmc2V0cyAoYWJmZCkgPSBwdHI7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7IGkrKykKLQkgICAgcHRyW2ldID0gKGVsZl9saW5rZXJfc2VjdGlvbl9wb2ludGVyc190ICopMDsKLQl9Ci0KLSAgICAgIC8qIEhhcyB0aGlzIHN5bWJvbCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCBpZiBzbywgb3VyIHdvcmsgaXMgZG9uZSAqLwotICAgICAgaWYgKF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAocHRyW3Jfc3ltbmR4XSwKLQkJCQkJCXJlbC0+cl9hZGRlbmQsCi0JCQkJCQlsc2VjdC0+d2hpY2gpKQotCXJldHVybiB0cnVlOwotCi0gICAgICBwdHJfbGlua2VyX3NlY3Rpb25fcHRyID0gJnB0cltyX3N5bW5keF07Ci0KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQpCi0JewotCSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LCB3ZSBuZWVkIHRvCi0JICAgICBvdXRwdXQgYSBSXzx4eHg+X1JFTEFUSVZFIHJlbG9jIHNvIHRoYXQgdGhlCi0JICAgICBkeW5hbWljIGxpbmtlciBjYW4gYWRqdXN0IHRoaXMgR09UIGVudHJ5LiAgKi8KLQkgIEJGRF9BU1NFUlQgKGxzZWN0LT5yZWxfc2VjdGlvbiAhPSBOVUxMKTsKLQkgIGxzZWN0LT5yZWxfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemVvZiAoRWxmX0V4dGVybmFsX1JlbGEpOwotCX0KLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIGEgcG9pbnRlciBpbiB0aGUgbGlua2VyIHNlY3Rpb24sIGFuZCBhbGxvY2F0ZSBhIG5ldyBwb2ludGVyIHJlY29yZAotICAgICBmcm9tIGludGVybmFsIG1lbW9yeS4gICovCi0gIEJGRF9BU1NFUlQgKHB0cl9saW5rZXJfc2VjdGlvbl9wdHIgIT0gTlVMTCk7Ci0gIGxpbmtlcl9zZWN0aW9uX3B0ciA9IChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqKQotICAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCkpOwotCi0gIGlmICghbGlua2VyX3NlY3Rpb25fcHRyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBsaW5rZXJfc2VjdGlvbl9wdHItPm5leHQgPSAqcHRyX2xpbmtlcl9zZWN0aW9uX3B0cjsKLSAgbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQgPSByZWwtPnJfYWRkZW5kOwotICBsaW5rZXJfc2VjdGlvbl9wdHItPndoaWNoID0gbHNlY3QtPndoaWNoOwotICBsaW5rZXJfc2VjdGlvbl9wdHItPndyaXR0ZW5fYWRkcmVzc19wID0gZmFsc2U7Ci0gICpwdHJfbGlua2VyX3NlY3Rpb25fcHRyID0gbGlua2VyX3NlY3Rpb25fcHRyOwotCi0jaWYgMAotICBpZiAobHNlY3QtPmhvbGVfc2l6ZSAmJiBsc2VjdC0+aG9sZV9vZmZzZXQgPCBsc2VjdC0+bWF4X2hvbGVfb2Zmc2V0KQotICAgIHsKLSAgICAgIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0ID0gbHNlY3QtPnNlY3Rpb24tPl9yYXdfc2l6ZSAtIGxzZWN0LT5ob2xlX3NpemUgKyAoQVJDSF9TSVpFIC8gOCk7Ci0gICAgICBsc2VjdC0+aG9sZV9vZmZzZXQgKz0gQVJDSF9TSVpFIC8gODsKLSAgICAgIGxzZWN0LT5zeW1fb2Zmc2V0ICArPSBBUkNIX1NJWkUgLyA4OwotICAgICAgaWYgKGxzZWN0LT5zeW1faGFzaCkJLyogQnVtcCB1cCBzeW1ib2wgdmFsdWUgaWYgbmVlZGVkICovCi0JewotCSAgbHNlY3QtPnN5bV9oYXNoLT5yb290LnUuZGVmLnZhbHVlICs9IEFSQ0hfU0laRSAvIDg7Ci0jaWZkZWYgREVCVUcKLQkgIGZwcmludGYgKHN0ZGVyciwgIkJ1bXAgdXAgJXMgYnkgJWxkLCBjdXJyZW50IHZhbHVlID0gJWxkXG4iLAotCQkgICBsc2VjdC0+c3ltX2hhc2gtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgIChsb25nKUFSQ0hfU0laRSAvIDgsCi0JCSAgIChsb25nKWxzZWN0LT5zeW1faGFzaC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotICBlbHNlCi0jZW5kaWYKLSAgICBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCA9IGxzZWN0LT5zZWN0aW9uLT5fcmF3X3NpemU7Ci0KLSAgbHNlY3QtPnNlY3Rpb24tPl9yYXdfc2l6ZSArPSBBUkNIX1NJWkUgLyA4OwotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiQ3JlYXRlIHBvaW50ZXIgaW4gbGlua2VyIHNlY3Rpb24gJXMsIG9mZnNldCA9ICVsZCwgc2VjdGlvbiBzaXplID0gJWxkXG4iLAotCSAgIGxzZWN0LT5uYW1lLCAobG9uZylsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldCwgKGxvbmcpbHNlY3QtPnNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotDAotI2lmIEFSQ0hfU0laRT09NjQKLSNkZWZpbmUgYmZkX3B1dF9wdHIoQkZELFZBTCxBRERSKSBiZmRfcHV0XzY0IChCRkQsIFZBTCwgQUREUikKLSNlbmRpZgotI2lmIEFSQ0hfU0laRT09MzIKLSNkZWZpbmUgYmZkX3B1dF9wdHIoQkZELFZBTCxBRERSKSBiZmRfcHV0XzMyIChCRkQsIFZBTCwgQUREUikKLSNlbmRpZgotCi0vKiBGaWxsIGluIHRoZSBhZGRyZXNzIGZvciBhIHBvaW50ZXIgZ2VuZXJhdGVkIGluIGFsaW5rZXIgc2VjdGlvbi4gICovCi0KLWJmZF92bWEKLWVsZl9maW5pc2hfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAob3V0cHV0X2JmZCwgaW5wdXRfYmZkLCBpbmZvLCBsc2VjdCwgaCwgcmVsb2NhdGlvbiwgcmVsLCByZWxhdGl2ZV9yZWxvYykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGVsZl9saW5rZXJfc2VjdGlvbl90ICpsc2VjdDsKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIGJmZF92bWEgcmVsb2NhdGlvbjsKLSAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbDsKLSAgICAgaW50IHJlbGF0aXZlX3JlbG9jOwotewotICBlbGZfbGlua2VyX3NlY3Rpb25fcG9pbnRlcnNfdCAqbGlua2VyX3NlY3Rpb25fcHRyOwotCi0gIEJGRF9BU1NFUlQgKGxzZWN0ICE9IE5VTEwpOwotCi0gIGlmIChoICE9IE5VTEwpCQkvKiBnbG9iYWwgc3ltYm9sICovCi0gICAgewotICAgICAgbGlua2VyX3NlY3Rpb25fcHRyID0gX2JmZF9lbGZfZmluZF9wb2ludGVyX2xpbmtlcl9zZWN0aW9uIChoLT5saW5rZXJfc2VjdGlvbl9wb2ludGVyLAotCQkJCQkJCQkgcmVsLT5yX2FkZGVuZCwKLQkJCQkJCQkJIGxzZWN0LT53aGljaCk7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGxpbmtlcl9zZWN0aW9uX3B0ciAhPSBOVUxMKTsKLQotICAgICAgaWYgKCEgZWxmX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQKLQkgIHx8IChpbmZvLT5zaGFyZWQKLQkgICAgICAmJiBpbmZvLT5zeW1ib2xpYwotCSAgICAgICYmIChoLT5lbGZfbGlua19oYXNoX2ZsYWdzICYgRUxGX0xJTktfSEFTSF9ERUZfUkVHVUxBUikpKQotCXsKLQkgIC8qIFRoaXMgaXMgYWN0dWFsbHkgYSBzdGF0aWMgbGluaywgb3IgaXQgaXMgYQotCSAgICAgLUJzeW1ib2xpYyBsaW5rIGFuZCB0aGUgc3ltYm9sIGlzIGRlZmluZWQKLQkgICAgIGxvY2FsbHkuICBXZSBtdXN0IGluaXRpYWxpemUgdGhpcyBlbnRyeSBpbiB0aGUKLQkgICAgIGdsb2JhbCBzZWN0aW9uLgotCi0JICAgICBXaGVuIGRvaW5nIGEgZHluYW1pYyBsaW5rLCB3ZSBjcmVhdGUgYSAucmVsYS48eHh4PgotCSAgICAgcmVsb2NhdGlvbiBlbnRyeSB0byBpbml0aWFsaXplIHRoZSB2YWx1ZS4gIFRoaXMKLQkgICAgIGlzIGRvbmUgaW4gdGhlIGZpbmlzaF9keW5hbWljX3N5bWJvbCByb3V0aW5lLiAgKi8KLQkgIGlmICghbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCkKLQkgICAgewotCSAgICAgIGxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3AgPSB0cnVlOwotCSAgICAgIGJmZF9wdXRfcHRyIChvdXRwdXRfYmZkLCByZWxvY2F0aW9uICsgbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQsCi0JCQkgIGxzZWN0LT5zZWN0aW9uLT5jb250ZW50cyArIGxpbmtlcl9zZWN0aW9uX3B0ci0+b2Zmc2V0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UJCQkJLyogbG9jYWwgc3ltYm9sICovCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyByX3N5bW5keCA9IEVMRl9SX1NZTSAocmVsLT5yX2luZm8pOwotICAgICAgQkZEX0FTU0VSVCAoZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChpbnB1dF9iZmQpICE9IE5VTEwpOwotICAgICAgQkZEX0FTU0VSVCAoZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChpbnB1dF9iZmQpW3Jfc3ltbmR4XSAhPSBOVUxMKTsKLSAgICAgIGxpbmtlcl9zZWN0aW9uX3B0ciA9IF9iZmRfZWxmX2ZpbmRfcG9pbnRlcl9saW5rZXJfc2VjdGlvbiAoZWxmX2xvY2FsX3B0cl9vZmZzZXRzIChpbnB1dF9iZmQpW3Jfc3ltbmR4XSwKLQkJCQkJCQkJIHJlbC0+cl9hZGRlbmQsCi0JCQkJCQkJCSBsc2VjdC0+d2hpY2gpOwotCi0gICAgICBCRkRfQVNTRVJUIChsaW5rZXJfc2VjdGlvbl9wdHIgIT0gTlVMTCk7Ci0KLSAgICAgIC8qIFdyaXRlIG91dCBwb2ludGVyIGlmIGl0IGhhc24ndCBiZWVuIHJld3JpdHRlbiBvdXQgYmVmb3JlICovCi0gICAgICBpZiAoIWxpbmtlcl9zZWN0aW9uX3B0ci0+d3JpdHRlbl9hZGRyZXNzX3ApCi0JewotCSAgbGlua2VyX3NlY3Rpb25fcHRyLT53cml0dGVuX2FkZHJlc3NfcCA9IHRydWU7Ci0JICBiZmRfcHV0X3B0ciAob3V0cHV0X2JmZCwgcmVsb2NhdGlvbiArIGxpbmtlcl9zZWN0aW9uX3B0ci0+YWRkZW5kLAotCQkgICAgICAgbHNlY3QtPnNlY3Rpb24tPmNvbnRlbnRzICsgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQpOwotCi0JICBpZiAoaW5mby0+c2hhcmVkKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNyZWwgPSBsc2VjdC0+cmVsX3NlY3Rpb247Ci0JICAgICAgRWxmX0ludGVybmFsX1JlbGEgb3V0cmVsOwotCi0JICAgICAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIHJlbGF0aXZlIHJlbG9jIGZvciB0aGUgZHluYW1pYyBsaW5rZXIuICAqLwotCSAgICAgIGlmICghc3JlbCkKLQkJbHNlY3QtPnJlbF9zZWN0aW9uID0gc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkJCQkJICAgICBsc2VjdC0+cmVsX25hbWUpOwotCi0JICAgICAgQkZEX0FTU0VSVCAoc3JlbCAhPSBOVUxMKTsKLQotCSAgICAgIG91dHJlbC5yX29mZnNldCA9IChsc2VjdC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSArIGxzZWN0LT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICsgbGlua2VyX3NlY3Rpb25fcHRyLT5vZmZzZXQpOwotCSAgICAgIG91dHJlbC5yX2luZm8gPSBFTEZfUl9JTkZPICgwLCByZWxhdGl2ZV9yZWxvYyk7Ci0JICAgICAgb3V0cmVsLnJfYWRkZW5kID0gMDsKLQkgICAgICBlbGZfc3dhcF9yZWxvY2Ffb3V0IChvdXRwdXRfYmZkLCAmb3V0cmVsLAotCQkJCSAgICgoKEVsZl9FeHRlcm5hbF9SZWxhICopCi0JCQkJICAgICBsc2VjdC0+c2VjdGlvbi0+Y29udGVudHMpCi0JCQkJICAgICsgbHNlY3QtPnNlY3Rpb24tPnJlbG9jX2NvdW50KSk7Ci0JICAgICAgKytsc2VjdC0+c2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJlbG9jYXRpb24gPSAobHNlY3QtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJKyBsaW5rZXJfc2VjdGlvbl9wdHItPm9mZnNldAotCQktIGxzZWN0LT5ob2xlX29mZnNldAotCQktIGxzZWN0LT5zeW1fb2Zmc2V0KTsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIkZpbmlzaCBwb2ludGVyIGluIGxpbmtlciBzZWN0aW9uICVzLCBvZmZzZXQgPSAlbGQgKDB4JWx4KVxuIiwKLQkgICBsc2VjdC0+bmFtZSwgKGxvbmcpcmVsb2NhdGlvbiwgKGxvbmcpcmVsb2NhdGlvbik7Ci0jZW5kaWYKLQotICAvKiBTdWJ0cmFjdCBvdXQgdGhlIGFkZGVuZCwgYmVjYXVzZSBpdCB3aWxsIGdldCBhZGRlZCBiYWNrIGluIGJ5IHRoZSBub3JtYWwKLSAgICAgcHJvY2Vzc2luZy4gICovCi0gIHJldHVybiByZWxvY2F0aW9uIC0gbGlua2VyX3NlY3Rpb25fcHRyLT5hZGRlbmQ7Ci19Ci0MCi0vKiBHYXJiYWdlIGNvbGxlY3QgdW51c2VkIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX21hcmsKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpzZWMsCi0JICAgYXNlY3Rpb24gKiAoKmdjX21hcmtfaG9vaykKLQkgICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBFbGZfSW50ZXJuYWxfUmVsYSAqLAotCQkgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqLCBFbGZfSW50ZXJuYWxfU3ltICopKSkpOwotCi1zdGF0aWMgYm9vbGVhbiBlbGZfZ2Nfc3dlZXAKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JICAgYm9vbGVhbiAoKmdjX3N3ZWVwX2hvb2spCi0JICAgICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLCBhc2VjdGlvbiAqbywKLQkJICAgICAgY29uc3QgRWxmX0ludGVybmFsX1JlbGEgKnJlbG9jcykpKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zd2VlcF9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBpZHhwdHIpKTsKLQotc3RhdGljIGJvb2xlYW4gZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzCi0gIFBBUkFNUyAoKHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoLCBQVFIgb2ZmYXJnKSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZAotICBQQVJBTVMgKChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgUFRSIGR1bW15KSk7Ci0KLXN0YXRpYyBib29sZWFuIGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmgsIFBUUiBkdW1teSkpOwotCi0vKiBUaGUgbWFyayBwaGFzZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uICBGb3IgYSBnaXZlbiBzZWN0aW9uLCBtYXJrCi0gICBpdCwgYW5kIGFsbCB0aGUgc2VjdGlvbnMgd2hpY2ggZGVmaW5lIHN5bWJvbHMgdG8gd2hpY2ggaXQgcmVmZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19tYXJrIChpbmZvLCBzZWMsIGdjX21hcmtfaG9vaykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFzZWN0aW9uICogKCpnY19tYXJrX2hvb2spCi0gICAgICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIEVsZl9JbnRlcm5hbF9SZWxhICosCi0JCXN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICosIEVsZl9JbnRlcm5hbF9TeW0gKikpOwotewotICBib29sZWFuIHJldCA9IHRydWU7Ci0KLSAgc2VjLT5nY19tYXJrID0gMTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNlY3Rpb24gcmVsb2NzLiAgKi8KLQotICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDAgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgRWxmX0ludGVybmFsX1JlbGEgKnJlbHN0YXJ0LCAqcmVsLCAqcmVsZW5kOwotICAgICAgRWxmX0ludGVybmFsX1NoZHIgKnN5bXRhYl9oZHI7Ci0gICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gICAgICBzaXplX3QgbmxvY3N5bXM7Ci0gICAgICBzaXplX3QgZXh0c3ltb2ZmOwotICAgICAgRWxmX0V4dGVybmFsX1N5bSAqbG9jc3ltcywgKmZyZWVzeW1zID0gTlVMTDsKLSAgICAgIGJmZCAqaW5wdXRfYmZkID0gc2VjLT5vd25lcjsKLQotICAgICAgLyogR0NGSVhNRTogaG93IHRvIGFycmFuZ2Ugc28gdGhhdCByZWxvY3MgYW5kIHN5bWJvbHMgYXJlIG5vdAotCSByZXJlYWQgY29udGludWFsbHk/ICAqLwotCi0gICAgICBzeW10YWJfaGRyID0gJmVsZl90ZGF0YSAoaW5wdXRfYmZkKS0+c3ltdGFiX2hkcjsKLSAgICAgIHN5bV9oYXNoZXMgPSBlbGZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLQotICAgICAgLyogUmVhZCB0aGUgbG9jYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoZWxmX2JhZF9zeW10YWIgKGlucHV0X2JmZCkpCi0JewotCSAgbmxvY3N5bXMgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgICAgICBleHRzeW1vZmYgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlleHRzeW1vZmYgPSBubG9jc3ltcyA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0gICAgICBpZiAoc3ltdGFiX2hkci0+Y29udGVudHMpCi0JbG9jc3ltcyA9IChFbGZfRXh0ZXJuYWxfU3ltICopIHN5bXRhYl9oZHItPmNvbnRlbnRzOwotICAgICAgZWxzZSBpZiAobmxvY3N5bXMgPT0gMCkKLQlsb2NzeW1zID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBsb2NzeW1zID0gZnJlZXN5bXMgPQotCSAgICBiZmRfbWFsbG9jIChubG9jc3ltcyAqIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bSkpOwotCSAgaWYgKGZyZWVzeW1zID09IE5VTEwKLQkgICAgICB8fCBiZmRfc2VlayAoaW5wdXRfYmZkLCBzeW10YWJfaGRyLT5zaF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChsb2NzeW1zLCBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pLAotCQkJICAgIG5sb2NzeW1zLCBpbnB1dF9iZmQpCi0JCSAgIT0gbmxvY3N5bXMgKiBzaXplb2YgKEVsZl9FeHRlcm5hbF9TeW0pKSkKLQkgICAgewotCSAgICAgIHJldCA9IGZhbHNlOwotCSAgICAgIGdvdG8gb3V0MTsKLQkgICAgfQotCX0KLQotICAgICAgLyogUmVhZCB0aGUgcmVsb2NhdGlvbnMuICAqLwotICAgICAgcmVsc3RhcnQgPSAoTkFNRShfYmZkX2VsZixsaW5rX3JlYWRfcmVsb2NzKQotCQkgIChzZWMtPm93bmVyLCBzZWMsIE5VTEwsIChFbGZfSW50ZXJuYWxfUmVsYSAqKSBOVUxMLAotCQkgICBpbmZvLT5rZWVwX21lbW9yeSkpOwotICAgICAgaWYgKHJlbHN0YXJ0ID09IE5VTEwpCi0JewotCSAgcmV0ID0gZmFsc2U7Ci0JICBnb3RvIG91dDE7Ci0JfQotICAgICAgcmVsZW5kID0gcmVsc3RhcnQgKyBzZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBmb3IgKHJlbCA9IHJlbHN0YXJ0OyByZWwgPCByZWxlbmQ7IHJlbCsrKQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgcl9zeW1uZHg7Ci0JICBhc2VjdGlvbiAqcnNlYzsKLQkgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgRWxmX0ludGVybmFsX1N5bSBzOwotCi0JICByX3N5bW5keCA9IEVMRl9SX1NZTSAocmVsLT5yX2luZm8pOwotCSAgaWYgKHJfc3ltbmR4ID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoZWxmX2JhZF9zeW10YWIgKHNlYy0+b3duZXIpKQotCSAgICB7Ci0JICAgICAgZWxmX3N3YXBfc3ltYm9sX2luIChpbnB1dF9iZmQsICZsb2NzeW1zW3Jfc3ltbmR4XSwgJnMpOwotCSAgICAgIGlmIChFTEZfU1RfQklORCAocy5zdF9pbmZvKSA9PSBTVEJfTE9DQUwpCi0JICAgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgTlVMTCwgJnMpOwotCSAgICAgIGVsc2UKLQkJewotCSAgICAgICAgICBoID0gc3ltX2hhc2hlc1tyX3N5bW5keCAtIGV4dHN5bW9mZl07Ci0JICAgICAgICAgIHJzZWMgPSAoKmdjX21hcmtfaG9vaykoc2VjLT5vd25lciwgaW5mbywgcmVsLCBoLCBOVUxMKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyX3N5bW5keCA+PSBubG9jc3ltcykKLQkgICAgewotCSAgICAgIGggPSBzeW1faGFzaGVzW3Jfc3ltbmR4IC0gZXh0c3ltb2ZmXTsKLQkgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgaCwgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVsZl9zd2FwX3N5bWJvbF9pbiAoaW5wdXRfYmZkLCAmbG9jc3ltc1tyX3N5bW5keF0sICZzKTsKLQkgICAgICByc2VjID0gKCpnY19tYXJrX2hvb2spKHNlYy0+b3duZXIsIGluZm8sIHJlbCwgTlVMTCwgJnMpOwotCSAgICB9Ci0KLQkgIGlmIChyc2VjICYmICFyc2VjLT5nY19tYXJrKQotCSAgICBpZiAoIWVsZl9nY19tYXJrIChpbmZvLCByc2VjLCBnY19tYXJrX2hvb2spKQotCSAgICAgIHsKLQkJcmV0ID0gZmFsc2U7Ci0JCWdvdG8gb3V0MjsKLQkgICAgICB9Ci0JfQotCi0gICAgb3V0MjoKLSAgICAgIGlmICghaW5mby0+a2VlcF9tZW1vcnkpCi0JZnJlZSAocmVsc3RhcnQpOwotICAgIG91dDE6Ci0gICAgICBpZiAoZnJlZXN5bXMpCi0JZnJlZSAoZnJlZXN5bXMpOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgc3dlZXAgcGhhc2Ugb2YgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgUmVtb3ZlIGFsbCBnYXJiYWdlIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zd2VlcCAoaW5mbywgZ2Nfc3dlZXBfaG9vaykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKCpnY19zd2VlcF9ob29rKQotICAgICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sIGFzZWN0aW9uICpvLAotCQljb25zdCBFbGZfSW50ZXJuYWxfUmVsYSAqcmVsb2NzKSk7Ci17Ci0gIGJmZCAqc3ViOwotCi0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpvOwotCi0gICAgICBmb3IgKG8gPSBzdWItPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotCXsKLQkgIC8qIEtlZXAgc3BlY2lhbCBzZWN0aW9ucy4gIEtlZXAgLmRlYnVnIHNlY3Rpb25zLiAgKi8KLQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfTElOS0VSX0NSRUFURUQpCi0JICAgICAgfHwgKG8tPmZsYWdzICYgU0VDX0RFQlVHR0lORykpCi0JICAgIG8tPmdjX21hcmsgPSAxOwotCi0JICBpZiAoby0+Z2NfbWFyaykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNraXAgc3dlZXBpbmcgc2VjdGlvbnMgYWxyZWFkeSBleGNsdWRlZC4gICovCi0JICBpZiAoby0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNpbmNlIHRoaXMgaXMgZWFybHkgaW4gdGhlIGxpbmsgcHJvY2VzcywgaXQgaXMgc2ltcGxlCi0JICAgICB0byByZW1vdmUgYSBzZWN0aW9uIGZyb20gdGhlIG91dHB1dC4gICovCi0JICBvLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLQotCSAgLyogQnV0IHdlIGFsc28gaGF2ZSB0byB1cGRhdGUgc29tZSBvZiB0aGUgcmVsb2NhdGlvbgotCSAgICAgaW5mbyB3ZSBjb2xsZWN0ZWQgYmVmb3JlLiAgKi8KLQkgIGlmIChnY19zd2VlcF9ob29rCi0JICAgICAgJiYgKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAmJiBvLT5yZWxvY19jb3VudCA+IDApCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfUmVsYSAqaW50ZXJuYWxfcmVsb2NzOwotCSAgICAgIGJvb2xlYW4gcjsKLQotCSAgICAgIGludGVybmFsX3JlbG9jcyA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JCQkJIChvLT5vd25lciwgbywgTlVMTCwgTlVMTCwgaW5mby0+a2VlcF9tZW1vcnkpKTsKLQkgICAgICBpZiAoaW50ZXJuYWxfcmVsb2NzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIHIgPSAoKmdjX3N3ZWVwX2hvb2spKG8tPm93bmVyLCBpbmZvLCBvLCBpbnRlcm5hbF9yZWxvY3MpOwotCi0JICAgICAgaWYgKCFpbmZvLT5rZWVwX21lbW9yeSkKLQkJZnJlZSAoaW50ZXJuYWxfcmVsb2NzKTsKLQotCSAgICAgIGlmICghcikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBSZW1vdmUgdGhlIHN5bWJvbHMgdGhhdCB3ZXJlIGluIHRoZSBzd2VwdCBzZWN0aW9ucyBmcm9tIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZS4gIEdDRklYTUU6IEFueW9uZSBrbm93IGhvdyB0byBnZXQgdGhlbSBvdXQgb2YgdGhlCi0gICAgIHN0YXRpYyBzeW1ib2wgdGFibGUgYXMgd2VsbD8gICovCi0gIHsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgICAgZWxmX2djX3N3ZWVwX3N5bWJvbCwKLQkJCSAgICAoUFRSKSAmaSk7Ci0KLSAgICBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID0gaTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTd2VlcCBzeW1ib2xzIGluIHN3ZXB0IHNlY3Rpb25zLiAgQ2FsbGVkIHZpYSBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19zd2VlcF9zeW1ib2wgKGgsIGlkeHB0cikKLSAgICAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBpZHhwdHI7Ci17Ci0gIGludCAqaWR4ID0gKGludCAqKSBpZHhwdHI7Ci0KLSAgaWYgKGgtPmR5bmluZHggIT0gLTEKLSAgICAgICYmICgoaC0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICYmIGgtPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICB8fCBoLT5yb290LnUuZGVmLnNlY3Rpb24tPmdjX21hcmspKQotICAgIGgtPmR5bmluZHggPSAoKmlkeCkrKzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJvcG9nYXRlIGNvbGxlY3RlZCB2dGFibGUgaW5mb3JtYXRpb24uICBUaGlzIGlzIGNhbGxlZCB0aHJvdWdoCi0gICBlbGZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCAoaCwgb2twKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9rcDsKLXsKLSAgLyogVGhvc2UgdGhhdCBhcmUgbm90IHZ0YWJsZXMuICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhvc2UgdnRhYmxlcyB0aGF0IGRvIG5vdCBoYXZlIHBhcmVudHMsIHdlIGNhbm5vdCBtZXJnZS4gICovCi0gIGlmIChoLT52dGFibGVfcGFyZW50ID09IChzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqKSAtMSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGJlZW4gZG9uZSwgZXhpdC4gICovCi0gIGlmIChoLT52dGFibGVfZW50cmllc191c2VkICYmIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbLTFdKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgcGFyZW50J3MgdGFibGUgaXMgdXAgdG8gZGF0ZS4gICovCi0gIGVsZl9nY19wcm9wYWdhdGVfdnRhYmxlX2VudHJpZXNfdXNlZCAoaC0+dnRhYmxlX3BhcmVudCwgb2twKTsKLQotICBpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIE5vbmUgb2YgdGhpcyB0YWJsZSdzIGVudHJpZXMgd2VyZSByZWZlcmVuY2VkLiAgUmUtdXNlIHRoZQotCSBwYXJlbnQncyB0YWJsZS4gICovCi0gICAgICBoLT52dGFibGVfZW50cmllc191c2VkID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGgtPnZ0YWJsZV9lbnRyaWVzX3NpemUgPSBoLT52dGFibGVfcGFyZW50LT52dGFibGVfZW50cmllc19zaXplOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNpemVfdCBuOwotICAgICAgYm9vbGVhbiAqY3UsICpwdTsKLQotICAgICAgLyogT3IgdGhlIHBhcmVudCdzIGVudHJpZXMgaW50byBvdXJzLiAgKi8KLSAgICAgIGN1ID0gaC0+dnRhYmxlX2VudHJpZXNfdXNlZDsKLSAgICAgIGN1Wy0xXSA9IHRydWU7Ci0gICAgICBwdSA9IGgtPnZ0YWJsZV9wYXJlbnQtPnZ0YWJsZV9lbnRyaWVzX3VzZWQ7Ci0gICAgICBpZiAocHUgIT0gTlVMTCkKLQl7Ci0JICBuID0gaC0+dnRhYmxlX3BhcmVudC0+dnRhYmxlX2VudHJpZXNfc2l6ZSAvIEZJTEVfQUxJR047Ci0JICB3aGlsZSAoLS1uICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoKnB1KSAqY3UgPSB0cnVlOwotCSAgICAgIHB1KyssIGN1Kys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX3NtYXNoX3VudXNlZF92dGVudHJ5X3JlbG9jcyAoaCwgb2twKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIG9rcDsKLXsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSBoc3RhcnQsIGhlbmQ7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICpyZWxzdGFydCwgKnJlbGVuZCwgKnJlbDsKLQotICAvKiBUYWtlIGNhcmUgb2YgYm90aCB0aG9zZSBzeW1ib2xzIHRoYXQgZG8gbm90IGRlc2NyaWJlIHZ0YWJsZXMgYXMKLSAgICAgd2VsbCBhcyB0aG9zZSB0aGF0IGFyZSBub3QgbG9hZGVkLiAgKi8KLSAgaWYgKGgtPnZ0YWJsZV9wYXJlbnQgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2Vhayk7Ci0KLSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICBoc3RhcnQgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICBoZW5kID0gaHN0YXJ0ICsgaC0+c2l6ZTsKLQotICByZWxzdGFydCA9IChOQU1FKF9iZmRfZWxmLGxpbmtfcmVhZF9yZWxvY3MpCi0JICAgICAgKHNlYy0+b3duZXIsIHNlYywgTlVMTCwgKEVsZl9JbnRlcm5hbF9SZWxhICopIE5VTEwsIHRydWUpKTsKLSAgaWYgKCFyZWxzdGFydCkKLSAgICByZXR1cm4gKihib29sZWFuICopb2twID0gZmFsc2U7Ci0gIHJlbGVuZCA9IHJlbHN0YXJ0ICsgc2VjLT5yZWxvY19jb3VudDsKLQotICBmb3IgKHJlbCA9IHJlbHN0YXJ0OyByZWwgPCByZWxlbmQ7ICsrcmVsKQotICAgIGlmIChyZWwtPnJfb2Zmc2V0ID49IGhzdGFydCAmJiByZWwtPnJfb2Zmc2V0IDwgaGVuZCkKLSAgICAgIHsKLQkvKiBJZiB0aGUgZW50cnkgaXMgaW4gdXNlLCBkbyBub3RoaW5nLiAgKi8KLQlpZiAoaC0+dnRhYmxlX2VudHJpZXNfdXNlZAotCSAgICAmJiAocmVsLT5yX29mZnNldCAtIGhzdGFydCkgPCBoLT52dGFibGVfZW50cmllc19zaXplKQotCSAgewotCSAgICBiZmRfdm1hIGVudHJ5ID0gKHJlbC0+cl9vZmZzZXQgLSBoc3RhcnQpIC8gRklMRV9BTElHTjsKLQkgICAgaWYgKGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbZW50cnldKQotCSAgICAgIGNvbnRpbnVlOwotCSAgfQotCS8qIE90aGVyd2lzZSwga2lsbCBpdC4gICovCi0JcmVsLT5yX29mZnNldCA9IHJlbC0+cl9pbmZvID0gcmVsLT5yX2FkZGVuZCA9IDA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERvIG1hcmsgYW5kIHN3ZWVwIG9mIHVudXNlZCBzZWN0aW9ucy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYm9vbGVhbiBvayA9IHRydWU7Ci0gIGJmZCAqc3ViOwotICBhc2VjdGlvbiAqICgqZ2NfbWFya19ob29rKQotICAgIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgRWxmX0ludGVybmFsX1JlbGEgKiwKLSAgICAgICAgICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaCwgRWxmX0ludGVybmFsX1N5bSAqKSk7Ci0KLSAgaWYgKCFnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmNhbl9nY19zZWN0aW9ucwotICAgICAgfHwgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICB8fCBlbGZfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBcHBseSB0cmFuc2l0aXZlIGNsb3N1cmUgdG8gdGhlIHZ0YWJsZSBlbnRyeSB1c2FnZSBpbmZvLiAgKi8KLSAgZWxmX2xpbmtfaGFzaF90cmF2ZXJzZSAoZWxmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICBlbGZfZ2NfcHJvcGFnYXRlX3Z0YWJsZV9lbnRyaWVzX3VzZWQsCi0JCQkgIChQVFIpICZvayk7Ci0gIGlmICghb2spCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEtpbGwgdGhlIHZ0YWJsZSByZWxvY2F0aW9ucyB0aGF0IHdlcmUgbm90IHVzZWQuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9nY19zbWFzaF91bnVzZWRfdnRlbnRyeV9yZWxvY3MsCi0JCQkgIChQVFIpICZvayk7Ci0gIGlmICghb2spCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdyb3ZlbCB0aHJvdWdoIHJlbG9jcyB0byBmaW5kIG91dCB3aG8gc3RheXMgLi4uICAqLwotCi0gIGdjX21hcmtfaG9vayA9IGdldF9lbGZfYmFja2VuZF9kYXRhIChhYmZkKS0+Z2NfbWFya19ob29rOwotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqbzsKLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKG8tPmZsYWdzICYgU0VDX0tFRVApCi0gIAkgICAgaWYgKCFlbGZfZ2NfbWFyayAoaW5mbywgbywgZ2NfbWFya19ob29rKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICAvKiAuLi4gYW5kIG1hcmsgU0VDX0VYQ0xVREUgZm9yIHRob3NlIHRoYXQgZ28uICAqLwotICBpZiAoIWVsZl9nY19zd2VlcChpbmZvLCBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCktPmdjX3N3ZWVwX2hvb2spKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIENhbGxlZCBmcm9tIGNoZWNrX3JlbG9jcyB0byByZWNvcmQgdGhlIGV4aXN0YW5jZSBvZiBhIFZUSU5IRVJJVCByZWxvYy4gICovCi0KLWJvb2xlYW4KLWVsZl9nY19yZWNvcmRfdnRpbmhlcml0IChhYmZkLCBzZWMsIGgsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci17Ci0gIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlcywgKipzeW1faGFzaGVzX2VuZDsKLSAgc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKipzZWFyY2gsICpjaGlsZDsKLSAgYmZkX3NpemVfdHlwZSBleHRzeW1jb3VudDsKLQotICAvKiBUaGUgc2hfaW5mbyBmaWVsZCBvZiB0aGUgc3ltdGFiIGhlYWRlciB0ZWxscyB1cyB3aGVyZSB0aGUKLSAgICAgZXh0ZXJuYWwgc3ltYm9scyBzdGFydC4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGxvY2FsIHN5bWJvbHMgYXQKLSAgICAgdGhpcyBwb2ludC4gICovCi0gIGV4dHN5bWNvdW50ID0gZWxmX3RkYXRhIChhYmZkKS0+c3ltdGFiX2hkci5zaF9zaXplL3NpemVvZiAoRWxmX0V4dGVybmFsX1N5bSk7Ci0gIGlmICghZWxmX2JhZF9zeW10YWIgKGFiZmQpKQotICAgIGV4dHN5bWNvdW50IC09IGVsZl90ZGF0YSAoYWJmZCktPnN5bXRhYl9oZHIuc2hfaW5mbzsKLQotICBzeW1faGFzaGVzID0gZWxmX3N5bV9oYXNoZXMgKGFiZmQpOwotICBzeW1faGFzaGVzX2VuZCA9IHN5bV9oYXNoZXMgKyBleHRzeW1jb3VudDsKLQotICAvKiBIdW50IGRvd24gdGhlIGNoaWxkIHN5bWJvbCwgd2hpY2ggaXMgaW4gdGhpcyBzZWN0aW9uIGF0IHRoZSBzYW1lCi0gICAgIG9mZnNldCBhcyB0aGUgcmVsb2NhdGlvbi4gICovCi0gIGZvciAoc2VhcmNoID0gc3ltX2hhc2hlczsgc2VhcmNoICE9IHN5bV9oYXNoZXNfZW5kOyArK3NlYXJjaCkKLSAgICB7Ci0gICAgICBpZiAoKGNoaWxkID0gKnNlYXJjaCkgIT0gTlVMTAotCSAgJiYgKGNoaWxkLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgY2hpbGQtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBjaGlsZC0+cm9vdC51LmRlZi5zZWN0aW9uID09IHNlYwotCSAgJiYgY2hpbGQtPnJvb3QudS5kZWYudmFsdWUgPT0gb2Zmc2V0KQotCWdvdG8gd2luOwotICAgIH0KLQotICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCIlczogJXMrJWx1OiBObyBzeW1ib2wgZm91bmQgZm9yIElOSEVSSVQiLAotCQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzZWMtPm5hbWUsCi0JCQkgKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KTsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi13aW46Ci0gIGlmICghaCkKLSAgICB7Ci0gICAgICAvKiBUaGlzICpzaG91bGQqIG9ubHkgYmUgdGhlIGFic29sdXRlIHNlY3Rpb24uICBJdCBjb3VsZCBwb3RlbnRpYWxseQotCSBiZSB0aGF0IHNvbWVvbmUgaGFzIGRlZmluZWQgYSBub24tZ2xvYmFsIHZ0YWJsZSB0aG91Z2gsIHdoaWNoCi0JIHdvdWxkIGJlIGJhZC4gIEl0IGlzbid0IHdvcnRoIHBhZ2luZyBpbiB0aGUgbG9jYWwgc3ltYm9scyB0byBiZQotCSBzdXJlIHRob3VnaDsgdGhhdCBjYXNlIHNob3VsZCBzaW1wbHkgYmUgaGFuZGxlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotICAgICAgY2hpbGQtPnZ0YWJsZV9wYXJlbnQgPSAoc3RydWN0IGVsZl9saW5rX2hhc2hfZW50cnkgKikgLTE7Ci0gICAgfQotICBlbHNlCi0gICAgY2hpbGQtPnZ0YWJsZV9wYXJlbnQgPSBoOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsZWQgZnJvbSBjaGVja19yZWxvY3MgdG8gcmVjb3JkIHRoZSBleGlzdGFuY2Ugb2YgYSBWVEVOVFJZIHJlbG9jLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX3JlY29yZF92dGVudHJ5IChhYmZkLCBzZWMsIGgsIGFkZGVuZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci17Ci0gIGlmIChhZGRlbmQgPj0gaC0+dnRhYmxlX2VudHJpZXNfc2l6ZSkKLSAgICB7Ci0gICAgICBzaXplX3Qgc2l6ZSwgYnl0ZXM7Ci0gICAgICBib29sZWFuICpwdHIgPSBoLT52dGFibGVfZW50cmllc191c2VkOwotCi0gICAgICAvKiBXaGlsZSB0aGUgc3ltYm9sIGlzIHVuZGVmaW5lZCwgd2UgaGF2ZSB0byBiZSBwcmVwYXJlZCB0byBoYW5kbGUKLQkgYSB6ZXJvIHNpemUuICAqLwotICAgICAgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQlzaXplID0gYWRkZW5kOwotICAgICAgZWxzZQotCXsKLQkgIHNpemUgPSBoLT5zaXplOwotCSAgaWYgKHNpemUgPCBhZGRlbmQpCi0JICAgIHsKLQkgICAgICAvKiBPb3BzISAgV2UndmUgZ290IGEgcmVmZXJlbmNlIHBhc3QgdGhlIGRlZmluZWQgZW5kIG9mCi0JCSB0aGUgdGFibGUuICBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIC0tIHNoYWxsIHdlIHdhcm4/ICAqLwotCSAgICAgIHNpemUgPSBhZGRlbmQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFsbG9jYXRlIG9uZSBleHRyYSBlbnRyeSBmb3IgdXNlIGFzIGEgImRvbmUiIGZsYWcgZm9yIHRoZQotCSBjb25zb2xpZGF0aW9uIHBhc3MuICAqLwotICAgICAgYnl0ZXMgPSAoc2l6ZSAvIEZJTEVfQUxJR04gKyAxKSAqIHNpemVvZihib29sZWFuKTsKLQotICAgICAgaWYgKHB0cikKLQl7Ci0JICBzaXplX3Qgb2xkYnl0ZXM7Ci0KLQkgIHB0ciA9IHJlYWxsb2MgKHB0ci0xLCBieXRlcyk7Ci0JICBpZiAocHRyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgb2xkYnl0ZXMgPSAoaC0+dnRhYmxlX2VudHJpZXNfc2l6ZS9GSUxFX0FMSUdOICsgMSkgKiBzaXplb2YoYm9vbGVhbik7Ci0JICBtZW1zZXQgKHB0ciArIG9sZGJ5dGVzLCAwLCBieXRlcyAtIG9sZGJ5dGVzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHRyID0gY2FsbG9jICgxLCBieXRlcyk7Ci0JICBpZiAocHRyID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEFuZCBhcnJhbmdlIGZvciB0aGF0IGRvbmUgZmxhZyB0byBiZSBhdCBpbmRleCAtMS4gICovCi0gICAgICBoLT52dGFibGVfZW50cmllc191c2VkID0gcHRyKzE7Ci0gICAgICBoLT52dGFibGVfZW50cmllc19zaXplID0gc2l6ZTsKLSAgICB9Ci0gIGgtPnZ0YWJsZV9lbnRyaWVzX3VzZWRbYWRkZW5kIC8gRklMRV9BTElHTl0gPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBbmQgYW4gYWNjb21wYW55aW5nIGJpdCB0byB3b3JrIG91dCBmaW5hbCBnb3QgZW50cnkgb2Zmc2V0cyBvbmNlCi0gICB3ZSdyZSBkb25lLiAgU2hvdWxkIGJlIGNhbGxlZCBmcm9tIGZpbmFsX2xpbmsuICAqLwotCi1ib29sZWFuCi1lbGZfZ2NfY29tbW9uX2ZpbmFsaXplX2dvdF9vZmZzZXRzIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBiZmQgKmk7Ci0gIHN0cnVjdCBlbGZfYmFja2VuZF9kYXRhICpiZWQgPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoYWJmZCk7Ci0gIGJmZF92bWEgZ290b2ZmOwotCi0gIC8qIFRoZSBHT1Qgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSAuZ290IHNlY3Rpb24sIGJ1dCB0aGUgR09UIGhlYWRlciBpcwotICAgICBwdXQgaW50byB0aGUgLmdvdC5wbHQgc2VjdGlvbiwgaWYgdGhlIGJhY2tlbmQgdXNlcyBpdC4gICovCi0gIGlmIChiZWQtPndhbnRfZ290X3BsdCkKLSAgICBnb3RvZmYgPSAwOwotICBlbHNlCi0gICAgZ290b2ZmID0gYmVkLT5nb3RfaGVhZGVyX3NpemU7Ci0KLSAgLyogRG8gdGhlIGxvY2FsIC5nb3QgZW50cmllcyBmaXJzdC4gICovCi0gIGZvciAoaSA9IGluZm8tPmlucHV0X2JmZHM7IGk7IGkgPSBpLT5saW5rX25leHQpCi0gICAgewotICAgICAgYmZkX3NpZ25lZF92bWEgKmxvY2FsX2dvdCA9IGVsZl9sb2NhbF9nb3RfcmVmY291bnRzIChpKTsKLSAgICAgIGJmZF9zaXplX3R5cGUgaiwgbG9jc3ltY291bnQ7Ci0gICAgICBFbGZfSW50ZXJuYWxfU2hkciAqc3ltdGFiX2hkcjsKLQotICAgICAgaWYgKCFsb2NhbF9nb3QpCi0JY29udGludWU7Ci0KLSAgICAgIHN5bXRhYl9oZHIgPSAmZWxmX3RkYXRhIChpKS0+c3ltdGFiX2hkcjsKLSAgICAgIGlmIChlbGZfYmFkX3N5bXRhYiAoaSkpCi0JbG9jc3ltY291bnQgPSBzeW10YWJfaGRyLT5zaF9zaXplIC8gc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltKTsKLSAgICAgIGVsc2UKLQlsb2NzeW1jb3VudCA9IHN5bXRhYl9oZHItPnNoX2luZm87Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBsb2NzeW1jb3VudDsgKytqKQotCXsKLQkgIGlmIChsb2NhbF9nb3Rbal0gPiAwKQotCSAgICB7Ci0JICAgICAgbG9jYWxfZ290W2pdID0gZ290b2ZmOwotCSAgICAgIGdvdG9mZiArPSBBUkNIX1NJWkUgLyA4OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGxvY2FsX2dvdFtqXSA9IChiZmRfdm1hKSAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZW4gdGhlIGdsb2JhbCAuZ290IGFuZCAucGx0IGVudHJpZXMuICAqLwotICBlbGZfbGlua19oYXNoX3RyYXZlcnNlIChlbGZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkgIGVsZl9nY19hbGxvY2F0ZV9nb3Rfb2Zmc2V0cywKLQkJCSAgKFBUUikgJmdvdG9mZik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBuZWVkIGEgc3BlY2lhbCB0b3AtbGV2ZWwgbGluayByb3V0aW5lIHRvIGNvbnZlcnQgZ290IHJlZmVyZW5jZSBjb3VudHMKLSAgIHRvIHJlYWwgZ290IG9mZnNldHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZWxmX2djX2FsbG9jYXRlX2dvdF9vZmZzZXRzIChoLCBvZmZhcmcpCi0gICAgIHN0cnVjdCBlbGZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgb2ZmYXJnOwotewotICBiZmRfdm1hICpvZmYgPSAoYmZkX3ZtYSAqKSBvZmZhcmc7Ci0KLSAgaWYgKGgtPmdvdC5yZWZjb3VudCA+IDApCi0gICAgewotICAgICAgaC0+Z290Lm9mZnNldCA9IG9mZlswXTsKLSAgICAgIG9mZlswXSArPSBBUkNIX1NJWkUgLyA4OwotICAgIH0KLSAgZWxzZQotICAgIGgtPmdvdC5vZmZzZXQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1hbnkgZm9sayBuZWVkIG5vIG1vcmUgaW4gdGhlIHdheSBvZiBmaW5hbCBsaW5rIHRoYW4gdGhpcywgb25jZQotICAgZ290IGVudHJ5IHJlZmVyZW5jZSBjb3VudGluZyBpcyBlbmFibGVkLiAgKi8KLQotYm9vbGVhbgotZWxmX2djX2NvbW1vbl9maW5hbF9saW5rIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoIWVsZl9nY19jb21tb25fZmluYWxpemVfZ290X29mZnNldHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnZva2UgdGhlIHJlZ3VsYXIgRUxGIGJhY2tlbmQgbGlua2VyIHRvIGRvIGFsbCB0aGUgd29yay4gICovCi0gIHJldHVybiBlbGZfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHRob3VnaCBlbGZfbGlua19oYXNoX3RyYXZlcnNlIHRvIHN0b3JlCi0gICBhbGwgaGFzaCB2YWx1ZSBvZiB0aGUgZXhwb3J0ZWQgc3ltYm9scyBpbiBhbiBhcnJheS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfY29sbGVjdF9oYXNoX2NvZGVzIChoLCBkYXRhKQotICAgICBzdHJ1Y3QgZWxmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgKip2YWx1ZXAgPSAodW5zaWduZWQgbG9uZyAqKikgZGF0YTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciAqcDsKLSAgdW5zaWduZWQgbG9uZyBoYTsKLSAgY2hhciAqYWxjID0gTlVMTDsKLQotICAvKiBJZ25vcmUgaW5kaXJlY3Qgc3ltYm9scy4gIFRoZXNlIGFyZSBhZGRlZCBieSB0aGUgdmVyc2lvbmluZyBjb2RlLiAgKi8KLSAgaWYgKGgtPmR5bmluZHggPT0gLTEpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gIHAgPSBzdHJjaHIgKG5hbWUsIEVMRl9WRVJfQ0hSKTsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhbGMgPSBiZmRfbWFsbG9jIChwIC0gbmFtZSArIDEpOwotICAgICAgbWVtY3B5IChhbGMsIG5hbWUsIHAgLSBuYW1lKTsKLSAgICAgIGFsY1twIC0gbmFtZV0gPSAnXDAnOwotICAgICAgbmFtZSA9IGFsYzsKLSAgICB9Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZS4gICovCi0gIGhhID0gYmZkX2VsZl9oYXNoIChuYW1lKTsKLQotICAvKiBTdG9yZSB0aGUgZm91bmQgaGFzaCB2YWx1ZSBpbiB0aGUgYXJyYXkgZ2l2ZW4gYXMgdGhlIGFyZ3VtZW50LiAgKi8KLSAgKigqdmFsdWVwKSsrID0gaGE7Ci0KLSAgLyogQW5kIHN0b3JlIGl0IGluIHRoZSBzdHJ1Y3Qgc28gdGhhdCB3ZSBjYW4gcHV0IGl0IGluIHRoZSBoYXNoIHRhYmxlCi0gICAgIGxhdGVyLiAgKi8KLSAgaC0+ZWxmX2hhc2hfdmFsdWUgPSBoYTsKLQotICBpZiAoYWxjICE9IE5VTEwpCi0gICAgZnJlZSAoYWxjKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9lbGZ4eC10YXJnZXQuaCBiL2JmZC9lbGZ4eC10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM1ZDk1ZS4uMDAwMDAwMAotLS0gYS9iZmQvZWxmeHgtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NjEgKzAsMCBAQAotLyogVGFyZ2V0IGRlZmluaXRpb25zIGZvciBOTi1iaXQgRUxGCi0gICBDb3B5cmlnaHQgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBldmVyeXRoaW5nIHRoYXQgQkZEIGtub3dzIGFib3V0IGEgdGFyZ2V0LgotICAgSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIHdoYXQgcm91dGluZXMgdG8gY2FsbAotICAgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLCBldGMuICBFdmVyeSBCRkQgcG9pbnRzIHRvIGEgdGFyZ2V0IHN0cnVjdHVyZQotICAgd2l0aCBpdHMgInh2ZWMiIG1lbWJlci4KLQotICAgVGhlcmUgYXJlIHR3byBzdWNoIHN0cnVjdHVyZXMgaGVyZTogIG9uZSBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcyBhbmQKLSAgIG9uZSBmb3IgbGl0dGxlLWVuZGlhbiBtYWNoaW5lcy4gICAqLwotCi0jZGVmaW5lCWJmZF9lbGZOTl9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2VsZl9jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jaWZuZGVmIGJmZF9lbGZOTl9nZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3NlY3Rpb25fY29udGVudHMgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotI2RlZmluZSBiZmRfZWxmTk5fY2Fub25pY2FsaXplX3JlbG9jCV9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2lmbmRlZiBiZmRfZWxmTk5fZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgYmZkX2VsZk5OX2ZpbmRfbmVhcmVzdF9saW5lCV9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lCi0jZW5kaWYKLSNkZWZpbmUgYmZkX2VsZk5OX3JlYWRfbWluaXN5bWJvbHMJX2JmZF9lbGZfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBiZmRfZWxmTk5fbWluaXN5bWJvbF90b19zeW1ib2wJX2JmZF9lbGZfbWluaXN5bWJvbF90b19zeW1ib2wKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX2VsZl9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9saW5lbm8JCV9iZmRfZWxmX2dldF9saW5lbm8KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBiZmRfZWxmTk5fZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltYm9sX2luZm8JX2JmZF9lbGZfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltdGFiCQlfYmZkX2VsZl9nZXRfc3ltdGFiCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfZWxmX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNpZiAwIC8qIGRvbmUgaW4gZWxmLWJmZC5oICovCi0jZGVmaW5lIGJmZF9lbGZOTl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbCBfYmZkX2VsZl9saW5rX3JlY29yZF9keW5hbWljX3N5bWJvbAotI2VuZGlmCi0jZGVmaW5lIGJmZF9lbGZOTl9tYWtlX2VtcHR5X3N5bWJvbAlfYmZkX2VsZl9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBiZmRfZWxmTk5fbmV3X3NlY3Rpb25faG9vawlfYmZkX2VsZl9uZXdfc2VjdGlvbl9ob29rCi0jZGVmaW5lIGJmZF9lbGZOTl9zZXRfYXJjaF9tYWNoCQlfYmZkX2VsZl9zZXRfYXJjaF9tYWNoCi0jaWZuZGVmIGJmZF9lbGZOTl9zZXRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fc2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9lbGZfc2V0X3NlY3Rpb25fY29udGVudHMKLSNlbmRpZgotI2RlZmluZSBiZmRfZWxmTk5fc2l6ZW9mX2hlYWRlcnMJX2JmZF9lbGZfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX29iamVjdF9jb250ZW50cyBfYmZkX2VsZl93cml0ZV9vYmplY3RfY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzIF9iZmRfZWxmX3dyaXRlX2NvcmVmaWxlX2NvbnRlbnRzCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldAotI2RlZmluZSBlbGZfYmFja2VuZF9nb3Rfc3ltYm9sX29mZnNldCAoYmZkX3ZtYSkgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfZ290X3BsdAotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seQotI2RlZmluZSBlbGZfYmFja2VuZF9wbHRfcmVhZG9ubHkgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3dhbnRfcGx0X3N5bQotI2RlZmluZSBlbGZfYmFja2VuZF93YW50X3BsdF9zeW0gMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9ub3RfbG9hZGVkIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9wbHRfYWxpZ25tZW50Ci0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9hbGlnbm1lbnQgMgotI2VuZGlmCi0KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9kZWJ1Z19pbmZvX3N0YXJ0CWJmZF92b2lkCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfZGVidWdfaW5mb19lbmQJYmZkX3ZvaWQKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9kZWJ1Z19pbmZvX2FjY3VtdWxhdGUJKFBST1RPKHZvaWQsKCopLChiZmQqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX3ZvaWQKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Nhbl9nY19zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9jYW5fZ2Nfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2djX21hcmtfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9nY19tYXJrX2hvb2sJTlVMTAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2djX3N3ZWVwX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2Nfc3dlZXBfaG9vawlOVUxMCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9nY19zZWN0aW9ucwotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2djX3NlY3Rpb25zIF9iZmRfZWxmTk5fZ2Nfc2VjdGlvbnMKLSNlbmRpZgotCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgdm9pZCAqLCB1bnNpZ25lZCBsb25nKSkpIGJmZF9udWxsdm9pZHB0cikKLQotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gIF9iZmRfZWxmX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNlbmRpZgotI2lmbmRlZiBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2VsZl9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSkpIGJmZF90cnVlKQotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9lbGZfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGJmZF9lbGZOTl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBcCi0gIF9iZmRfZWxmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZGVmaW5lIGJmZF9lbGZOTl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYyBcCi0gIF9iZmRfZWxmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0jZW5kaWYKLQotI2lmZGVmIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2VsZl9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNlbHNlIC8qICEgZGVmaW5lZCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikgKi8KLS8qIElmIG5vIGJhY2tlbmQgcmVsb2NhdGVfc2VjdGlvbiByb3V0aW5lLCB1c2UgdGhlIGdlbmVyaWMgbGlua2VyLiAgKi8KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZW5kaWYKLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGJmZF9lbGZOTl9iZmRfbGlua19hZGRfc3ltYm9scwlfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2VuZGlmCi0jaWZuZGVmIGJmZF9lbGZOTl9iZmRfZmluYWxfbGluawotI2RlZmluZSBiZmRfZWxmTk5fYmZkX2ZpbmFsX2xpbmsJX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNlbmRpZgotI2VuZGlmIC8qICEgZGVmaW5lZCAoZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbikgKi8KLSNpZm5kZWYgYmZkX2VsZk5OX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSNkZWZpbmUgYmZkX2VsZk5OX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX2FyY2hpdmVfcAotI2RlZmluZSBiZmRfZWxmTk5fYXJjaGl2ZV9wIGJmZF9nZW5lcmljX2FyY2hpdmVfcAotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMKLSNkZWZpbmUgYmZkX2VsZk5OX3dyaXRlX2FyY2hpdmVfY29udGVudHMgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzCi0jZW5kaWYKLQotI2lmbmRlZiBiZmRfZWxmTk5fbWtvYmplY3QKLSNkZWZpbmUgYmZkX2VsZk5OX21rb2JqZWN0IGJmZF9lbGZfbWtvYmplY3QKLSNlbmRpZgotCi0jaWZuZGVmIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0jZGVmaW5lIGJmZF9lbGZOTl9ta2NvcmVmaWxlIGJmZF9lbGZfbWtjb3JlZmlsZQotI2VuZGlmCi0KLSNpZm5kZWYgYmZkX2VsZk5OX21rYXJjaGl2ZQotI2RlZmluZSBiZmRfZWxmTk5fbWthcmNoaXZlIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyCi0jZGVmaW5lIGVsZl9zeW1ib2xfbGVhZGluZ19jaGFyIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9pbmZvX3RvX2hvd3RvCi0jZGVmaW5lIGVsZl9pbmZvX3RvX2hvd3RvIDAKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9pbmZvX3RvX2hvd3RvX3JlbAotI2RlZmluZSBlbGZfaW5mb190b19ob3d0b19yZWwgMAotI2VuZGlmCi0KLSNpZm5kZWYgRUxGX01BWFBBR0VTSVpFCi0gICNlcnJvciBFTEZfTUFYUEFHRVNJWkUgaXMgbm90IGRlZmluZWQKLSNkZWZpbmUgRUxGX01BWFBBR0VTSVpFIDEKLSNlbmRpZgotCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2NvbGxlY3QKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY29sbGVjdCBmYWxzZQotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3R5cGVfY2hhbmdlX29rIGZhbHNlCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9zeW1faXNfZ2xvYmFsCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bV9pc19nbG9iYWwJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX29iamVjdF9wCi0jZGVmaW5lIGVsZl9iYWNrZW5kX29iamVjdF9wCQkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc3ltYm9sX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3N5bWJvbF90YWJsZV9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9nZXRfc3ltYm9sX3R5cGUKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9wcm9jZXNzaW5nCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgotI2RlZmluZSBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fc2hkcgkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZmFrZV9zZWN0aW9ucwotI2RlZmluZSBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2VjdGlvbl9mcm9tX2JmZF9zZWN0aW9uCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9hZGRfc3ltYm9sX2hvb2sKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkX3N5bWJvbF9ob29rCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vawotI2RlZmluZSBlbGZfYmFja2VuZF9saW5rX291dHB1dF9zeW1ib2xfaG9vayAwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2NoZWNrX3JlbG9jcwotI2RlZmluZSBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9hZGp1c3RfZHluYW1pY19zeW1ib2wgMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2Fsd2F5c19zaXplX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9keW5hbWljX3NlY3Rpb25zIDAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9yZWxvY2F0ZV9zZWN0aW9uCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3JlbG9jYXRlX3NlY3Rpb24JMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3N5bWJvbAotI2RlZmluZSBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zeW1ib2wJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2ZpbmlzaF9keW5hbWljX3NlY3Rpb25zCTAKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9iZWdpbl93cml0ZV9wcm9jZXNzaW5nCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2JlZ2luX3dyaXRlX3Byb2Nlc3NpbmcJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2ZpbmFsX3dyaXRlX3Byb2Nlc3NpbmcKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZwkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcAotI2RlZmluZSBlbGZfYmFja2VuZF9tb2RpZnlfc2VnbWVudF9tYXAJMAotI2VuZGlmCi0jaWZuZGVmIGVsZl9iYWNrZW5kX2Vjb2ZmX2RlYnVnX3N3YXAKLSNkZWZpbmUgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcAkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfZ290X2hlYWRlcl9zaXplCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZQkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplCi0jZGVmaW5lIGVsZl9iYWNrZW5kX3BsdF9oZWFkZXJfc2l6ZQkwCi0jZW5kaWYKLSNpZm5kZWYgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMKLSNkZWZpbmUgZWxmX2JhY2tlbmRfcG9zdF9wcm9jZXNzX2hlYWRlcnMJTlVMTAotI2VuZGlmCi0KLS8qIFByZXZpb3VzbHksIGJhY2tlbmRzIGNvdWxkIG9ubHkgdXNlIFNIVF9SRUwgb3IgU0hUX1JFTEEgcmVsb2NhdGlvbgotICAgc2VjdGlvbnMsIGJ1dCBub3QgYm90aC4gIFRoZXkgZGVmaW5lZCBVU0VfUkVMIHRvIGluZGljYXRlIFNIVF9SRUwKLSAgIHNlY3Rpb25zLCBhbmQgbGVmdCBpdCB1bmRlZmluZWQgdG8gaW5kaWNhdGVkIFNIVF9SRUxBIHNlY3Rpb25zLgotICAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB3ZSBzdGlsbCBzdXBwb3J0IHRoaXMgdXNhZ2UuICAqLwotI2lmbmRlZiBVU0VfUkVMCi0jZGVmaW5lIFVTRV9SRUwgMAotI2Vsc2UKLSN1bmRlZiBVU0VfUkVMCi0jZGVmaW5lIFVTRV9SRUwgMQotI2VuZGlmIAotCi0vKiBVc2UgdGhlc2UgaW4gbmV3IGNvZGUuICAqLwotI2lmbmRlZiBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbF9wIAotI2RlZmluZSBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbF9wIFVTRV9SRUwKLSNlbmRpZiAKLSNpZm5kZWYgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3AKLSNkZWZpbmUgZWxmX2JhY2tlbmRfbWF5X3VzZV9yZWxhX3AgIVVTRV9SRUwKLSNlbmRpZgotI2lmbmRlZiBlbGZfYmFja2VuZF9kZWZhdWx0X3VzZV9yZWxhX3AgCi0jZGVmaW5lIGVsZl9iYWNrZW5kX2RlZmF1bHRfdXNlX3JlbGFfcCAhVVNFX1JFTAotI2VuZGlmCi0KLSNpZm5kZWYgRUxGX01BQ0hJTkVfQUxUMQotI2RlZmluZSBFTEZfTUFDSElORV9BTFQxIDAKLSNlbmRpZgotCi0jaWZuZGVmIEVMRl9NQUNISU5FX0FMVDIKLSNkZWZpbmUgRUxGX01BQ0hJTkVfQUxUMiAwCi0jZW5kaWYKLQotI2lmbmRlZiBlbGZfYmFja2VuZF9zaXplX2luZm8KLSNkZWZpbmUgZWxmX2JhY2tlbmRfc2l6ZV9pbmZvIF9iZmRfZWxmTk5fc2l6ZV9pbmZvCi0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBlbGZfc2l6ZV9pbmZvIF9iZmRfZWxmTk5fc2l6ZV9pbmZvOwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGVsZl9iYWNrZW5kX2RhdGEgZWxmTk5fYmVkID0KLXsKLSAgRUxGX0FSQ0gsCQkJLyogYXJjaCAqLwotICBFTEZfTUFDSElORV9DT0RFLAkJLyogZWxmX21hY2hpbmVfY29kZSAqLwotICBFTEZfTUFYUEFHRVNJWkUsCQkvKiBtYXhwYWdlc2l6ZSAqLwotICBlbGZfYmFja2VuZF9jb2xsZWN0LAotICBlbGZfYmFja2VuZF90eXBlX2NoYW5nZV9vaywKLSAgZWxmX2luZm9fdG9faG93dG8sCi0gIGVsZl9pbmZvX3RvX2hvd3RvX3JlbCwKLSAgZWxmX2JhY2tlbmRfc3ltX2lzX2dsb2JhbCwKLSAgZWxmX2JhY2tlbmRfb2JqZWN0X3AsCi0gIGVsZl9iYWNrZW5kX3N5bWJvbF9wcm9jZXNzaW5nLAotICBlbGZfYmFja2VuZF9zeW1ib2xfdGFibGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZ2V0X3N5bWJvbF90eXBlLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX3Byb2Nlc3NpbmcsCi0gIGVsZl9iYWNrZW5kX3NlY3Rpb25fZnJvbV9zaGRyLAotICBlbGZfYmFja2VuZF9mYWtlX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24sCi0gIGVsZl9iYWNrZW5kX2FkZF9zeW1ib2xfaG9vaywKLSAgZWxmX2JhY2tlbmRfbGlua19vdXRwdXRfc3ltYm9sX2hvb2ssCi0gIGVsZl9iYWNrZW5kX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zLAotICBlbGZfYmFja2VuZF9jaGVja19yZWxvY3MsCi0gIGVsZl9iYWNrZW5kX2FkanVzdF9keW5hbWljX3N5bWJvbCwKLSAgZWxmX2JhY2tlbmRfYWx3YXlzX3NpemVfc2VjdGlvbnMsCi0gIGVsZl9iYWNrZW5kX3NpemVfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfcmVsb2NhdGVfc2VjdGlvbiwKLSAgZWxmX2JhY2tlbmRfZmluaXNoX2R5bmFtaWNfc3ltYm9sLAotICBlbGZfYmFja2VuZF9maW5pc2hfZHluYW1pY19zZWN0aW9ucywKLSAgZWxmX2JhY2tlbmRfYmVnaW5fd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfZmluYWxfd3JpdGVfcHJvY2Vzc2luZywKLSAgZWxmX2JhY2tlbmRfYWRkaXRpb25hbF9wcm9ncmFtX2hlYWRlcnMsCi0gIGVsZl9iYWNrZW5kX21vZGlmeV9zZWdtZW50X21hcCwKLSAgZWxmX2JhY2tlbmRfZ2NfbWFya19ob29rLAotICBlbGZfYmFja2VuZF9nY19zd2VlcF9ob29rLAotICBlbGZfYmFja2VuZF9wb3N0X3Byb2Nlc3NfaGVhZGVycywKLSAgZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcCwKLSAgRUxGX01BQ0hJTkVfQUxUMSwKLSAgRUxGX01BQ0hJTkVfQUxUMiwKLSAgJmVsZl9iYWNrZW5kX3NpemVfaW5mbywKLSAgZWxmX2JhY2tlbmRfZ290X3N5bWJvbF9vZmZzZXQsCi0gIGVsZl9iYWNrZW5kX2dvdF9oZWFkZXJfc2l6ZSwKLSAgZWxmX2JhY2tlbmRfcGx0X2hlYWRlcl9zaXplLAotICBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbF9wLAotICBlbGZfYmFja2VuZF9tYXlfdXNlX3JlbGFfcCwKLSAgZWxmX2JhY2tlbmRfZGVmYXVsdF91c2VfcmVsYV9wLAotICBlbGZfYmFja2VuZF93YW50X2dvdF9wbHQsCi0gIGVsZl9iYWNrZW5kX3BsdF9yZWFkb25seSwKLSAgZWxmX2JhY2tlbmRfd2FudF9wbHRfc3ltLAotICBlbGZfYmFja2VuZF9wbHRfbm90X2xvYWRlZCwKLSAgZWxmX2JhY2tlbmRfcGx0X2FsaWdubWVudCwKLSAgZWxmX2JhY2tlbmRfY2FuX2djX3NlY3Rpb25zCi19OwotCi0jaWZkZWYgVEFSR0VUX0JJR19TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0JJR19TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfQklHX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBiaWcgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fQklHLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8Ci0gICBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0RFQlVHR0lORyB8IFNFQ19FWENMVURFIHwgU0VDX1NPUlRfRU5UUklFUyksCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNCwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIGJmZF9lbGZOTl9vYmplY3RfcCwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZWxmTk5fYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgYmZkX2VsZk5OX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl9ta29iamVjdCwKLSAgICBiZmRfZWxmTk5fbWthcmNoaXZlLAotICAgIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLSAgfSwKLQotICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChiZmRfZWxmTk4pLAotI2lmZGVmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucwotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYmZkX2VsZk5OX2FyY2hpdmUpLAotI2Vsc2UKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSNlbmRpZgotICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKGJmZF9lbGZOTiksCi0KLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSAmZWxmTk5fYmVkLAotfTsKLSNlbmRpZgotCi0jaWZkZWYgVEFSR0VUX0xJVFRMRV9TWU0KLWNvbnN0IGJmZF90YXJnZXQgVEFSR0VUX0xJVFRMRV9TWU0gPQotewotICAvKiBuYW1lOiBpZGVudGlmeSBraW5kIG9mIHRhcmdldCAqLwotICBUQVJHRVRfTElUVExFX05BTUUsCi0KLSAgLyogZmxhdm91cjogZ2VuZXJhbCBpbmRpY2F0aW9uIGFib3V0IGZpbGUgKi8KLSAgYmZkX3RhcmdldF9lbGZfZmxhdm91ciwKLQotICAvKiBieXRlb3JkZXI6IGRhdGEgaXMgbGl0dGxlIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwKLQotICAvKiBoZWFkZXJfYnl0ZW9yZGVyOiBoZWFkZXIgaXMgYWxzbyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIG9iamVjdF9mbGFnczogbWFzayBvZiBhbGwgZmlsZSBmbGFncyAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8Ci0gICBEWU5BTUlDIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotCi0gIC8qIHNlY3Rpb25fZmxhZ3M6IG1hc2sgb2YgYWxsIHNlY3Rpb24gZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19SRUFET05MWSB8Ci0gICBTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX0RFQlVHR0lORyB8IFNFQ19FWENMVURFIHwgU0VDX1NPUlRfRU5UUklFUyksCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICBlbGZfc3ltYm9sX2xlYWRpbmdfY2hhciwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggRUxGLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIEVMRiwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNCwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIGJmZF9lbGZOTl9vYmplY3RfcCwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZWxmTk5fYXJjaGl2ZV9wLAkvKiBhbiBhcmNoaXZlICovCi0gICAgYmZkX2VsZk5OX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIGJmZF9lbGZOTl9ta29iamVjdCwKLSAgICBiZmRfZWxmTk5fbWthcmNoaXZlLAotICAgIGJmZF9lbGZOTl9ta2NvcmVmaWxlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBiZmRfZWxmTk5fd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9lbGZOTl93cml0ZV9jb3JlZmlsZV9jb250ZW50cywKLSAgfSwKLQotICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKGJmZF9lbGZOTiksCi0gICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChiZmRfZWxmTk4pLAotI2lmZGVmIGJmZF9lbGZOTl9hcmNoaXZlX2Z1bmN0aW9ucwotICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoYmZkX2VsZk5OX2FyY2hpdmUpLAotI2Vsc2UKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9jb2ZmKSwKLSNlbmRpZgotICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChiZmRfZWxmTk4pLAotICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoYmZkX2VsZk5OKSwKLSAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKGJmZF9lbGZOTiksCi0KLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSAmZWxmTk5fYmVkLAotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGUtYXJtLmMgYi9iZmQvZXBvYy1wZS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhMjc3YS4uMDAwMDAwMAotLS0gYS9iZmQvZXBvYy1wZS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9VTkRFUlNDT1JFICAgIDAKLSNkZWZpbmUgVVNFUl9MQUJFTF9QUkVGSVggICAgIiIKLQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBhcm1fZXBvY19wZV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlLWFybS1saXR0bGUiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIGFybV9lcG9jX3BlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgImVwb2MtcGUtYXJtLWJpZyIKLQotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9lcG9jX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9lcG9jX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9hcm1fZXBvY19wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJwZS1hcm0uYyIKLQpkaWZmIC0tZ2l0IGEvYmZkL2Vwb2MtcGVpLWFybS5jIGIvYmZkL2Vwb2MtcGVpLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM0ZDhiLi4wMDAwMDAwCi0tLSBhL2JmZC9lcG9jLXBlaS1hcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgQVJNIEVQT0MgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX1VOREVSU0NPUkUgICAgMAotI2RlZmluZSBVU0VSX0xBQkVMX1BSRUZJWCAgICAiIgotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfU1lNICAgIGFybV9lcG9jX3BlaV9saXR0bGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRSAgICJlcG9jLXBlaS1hcm0tbGl0dGxlIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgICBhcm1fZXBvY19wZWlfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAiZXBvYy1wZWktYXJtLWJpZyIKLQotI2RlZmluZSBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyBcCi0JYmZkX2FybV9lcG9jX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9lcG9jX3BlX2dldF9iZmRfZm9yX2ludGVyd29ya2luZwotI2RlZmluZSBiZmRfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gXAotCWJmZF9hcm1fZXBvY19wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0KLSNpbmNsdWRlICJwZWktYXJtLmMiCi0KZGlmZiAtLWdpdCBhL2JmZC9mb3JtYXQuYyBiL2JmZC9mb3JtYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMWY5Yy4uMDAwMDAwMAotLS0gYS9iZmQvZm9ybWF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyogR2VuZXJpYyBCRkQgc3VwcG9ydCBmb3IgZmlsZSBmb3JtYXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JRmlsZSBmb3JtYXRzCi0KLQlBIGZvcm1hdCBpcyBhIEJGRCBjb25jZXB0IG9mIGhpZ2ggbGV2ZWwgZmlsZSBjb250ZW50cyB0eXBlLiBUaGUKLQlmb3JtYXRzIHN1cHBvcnRlZCBieSBCRkQgYXJlOiAKLQotCW8gPDxiZmRfb2JqZWN0Pj4KLQotCVRoZSBCRkQgbWF5IGNvbnRhaW4gZGF0YSwgc3ltYm9scywgcmVsb2NhdGlvbnMgYW5kIGRlYnVnIGluZm8uCi0KLQlvIDw8YmZkX2FyY2hpdmU+PgotCi0JVGhlIEJGRCBjb250YWlucyBvdGhlciBCRkRzIGFuZCBhbiBvcHRpb25hbCBpbmRleC4KLQotCW8gPDxiZmRfY29yZT4+Ci0KLQlUaGUgQkZEIGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgYW4gZXhlY3V0YWJsZSBjb3JlIGR1bXAuCi0KLQotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBJTVBPUlQgZnJvbSB0YXJnZXRzLmMuICAqLwotZXh0ZXJuIGNvbnN0IHNpemVfdCBfYmZkX3RhcmdldF92ZWN0b3JfZW50cmllczsKLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NoZWNrX2Zvcm1hdAotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NoZWNrX2Zvcm1hdChiZmQgKmFiZmQsIGJmZF9mb3JtYXQgZm9ybWF0KTsKLQotREVTQ1JJUFRJT04KLQlWZXJpZnkgaWYgdGhlIGZpbGUgYXR0YWNoZWQgdG8gdGhlIEJGRCBAdmFye2FiZmR9IGlzIGNvbXBhdGlibGUKLQl3aXRoIHRoZSBmb3JtYXQgQHZhcntmb3JtYXR9IChpLmUuLCBvbmUgb2YgPDxiZmRfb2JqZWN0Pj4sCi0JPDxiZmRfYXJjaGl2ZT4+IG9yIDw8YmZkX2NvcmU+PikuCi0KLQlJZiB0aGUgQkZEIGhhcyBiZWVuIHNldCB0byBhIHNwZWNpZmljIHRhcmdldCBiZWZvcmUgdGhlCi0JY2FsbCwgb25seSB0aGUgbmFtZWQgdGFyZ2V0IGFuZCBmb3JtYXQgY29tYmluYXRpb24gaXMKLQljaGVja2VkLiBJZiB0aGUgdGFyZ2V0IGhhcyBub3QgYmVlbiBzZXQsIG9yIGhhcyBiZWVuIHNldCB0bwotCTw8ZGVmYXVsdD4+LCB0aGVuIGFsbCB0aGUga25vd24gdGFyZ2V0IGJhY2tlbmRzIGlzCi0JaW50ZXJyb2dhdGVkIHRvIGRldGVybWluZSBhIG1hdGNoLiAgSWYgdGhlIGRlZmF1bHQgdGFyZ2V0Ci0JbWF0Y2hlcywgaXQgaXMgdXNlZC4gIElmIG5vdCwgZXhhY3RseSBvbmUgdGFyZ2V0IG11c3QgcmVjb2duaXplCi0JdGhlIGZpbGUsIG9yIGFuIGVycm9yIHJlc3VsdHMuCi0KLQlUaGUgZnVuY3Rpb24gcmV0dXJucyA8PHRydWU+PiBvbiBzdWNjZXNzLCBvdGhlcndpc2UgPDxmYWxzZT4+Ci0Jd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBlcnJvciBjb2RlczogIAotCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlpZiA8PGZvcm1hdD4+IGlzIG5vdCBvbmUgb2YgPDxiZmRfb2JqZWN0Pj4sIDw8YmZkX2FyY2hpdmU+PiBvcgotCTw8YmZkX2NvcmU+Pi4KLQotCW8gPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+PiAtCi0JaWYgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgYSByZWFkIC0gZXZlbiBzb21lIGZpbGUgbWlzbWF0Y2hlcwotCWNhbiBjYXVzZSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGxzLgotCi0JbyA8PGZpbGVfbm90X3JlY29nbmlzZWQ+PiAtCi0Jbm9uZSBvZiB0aGUgYmFja2VuZHMgcmVjb2duaXNlZCB0aGUgZmlsZSBmb3JtYXQuCi0KLQlvIDw8YmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZD4+IC0KLQltb3JlIHRoYW4gb25lIGJhY2tlbmQgcmVjb2duaXNlZCB0aGUgZmlsZSBmb3JtYXQuCi0qLwotCi1ib29sZWFuCi1iZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBmb3JtYXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0gIHJldHVybiBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGZvcm1hdCwgTlVMTCk7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQsIGNoYXIgKioqbWF0Y2hpbmcpOwotCi1ERVNDUklQVElPTgotCUxpa2UgPDxiZmRfY2hlY2tfZm9ybWF0Pj4sIGV4Y2VwdCB3aGVuIGl0IHJldHVybnMgZmFsc2Ugd2l0aAotCTw8YmZkX2Vycm5vPj4gc2V0IHRvIDw8YmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZD4+LiAgSW4gdGhhdAotCWNhc2UsIGlmIEB2YXJ7bWF0Y2hpbmd9IGlzIG5vdCBOVUxMLCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0JYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIGZvcm1hdHMgdGhhdCBtYXRjaGVkLAotCWFsbG9jYXRlZCB3aXRoIDw8bWFsbG9jPj4uCi0JVGhlbiB0aGUgdXNlciBtYXkgY2hvb3NlIGEgZm9ybWF0IGFuZCB0cnkgYWdhaW4uCi0KLQlXaGVuIGRvbmUgd2l0aCB0aGUgbGlzdCB0aGF0IEB2YXJ7bWF0Y2hpbmd9IHBvaW50cyB0bywgdGhlIGNhbGxlcgotCXNob3VsZCBmcmVlIGl0LiAgCi0qLwotCi1ib29sZWFuCi1iZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGZvcm1hdCwgbWF0Y2hpbmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci0gICAgIGNoYXIgKioqbWF0Y2hpbmc7Ci17Ci0gIGV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWM7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0LCAqc2F2ZV90YXJnLCAqcmlnaHRfdGFyZzsKLSAgY2hhciAqKm1hdGNoaW5nX3ZlY3RvciA9IE5VTEw7Ci0gIGludCBtYXRjaF9jb3VudDsKLQotICBpZiAoIWJmZF9yZWFkX3AgKGFiZmQpIHx8Ci0gICAgICAoKGludCkoYWJmZC0+Zm9ybWF0KSA8IChpbnQpYmZkX3Vua25vd24pIHx8Ci0gICAgICAoKGludCkoYWJmZC0+Zm9ybWF0KSA+PSAoaW50KWJmZF90eXBlX2VuZCkpIHsKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX3Vua25vd24pCi0gICAgcmV0dXJuIChhYmZkLT5mb3JtYXQgPT0gZm9ybWF0KT8gdHJ1ZTogZmFsc2U7Ci0KLQotICAvKiBTaW5jZSB0aGUgdGFyZ2V0IHR5cGUgd2FzIGRlZmF1bHRlZCwgY2hlY2sgdGhlbSAKLSAgICAgYWxsIGluIHRoZSBob3BlIHRoYXQgb25lIHdpbGwgYmUgdW5pcXVlbHkgcmVjb2duaXplZC4gICovCi0KLSAgc2F2ZV90YXJnID0gYWJmZC0+eHZlYzsKLSAgbWF0Y2hfY291bnQgPSAwOwotICBpZiAobWF0Y2hpbmcpCi0gICAgewotICAgICAgbWF0Y2hpbmdfdmVjdG9yID0KLQkoY2hhciAqKikgYmZkX21hbGxvYyAoc2l6ZW9mIChjaGFyICopICoKLQkJCSAgICAgIChfYmZkX3RhcmdldF92ZWN0b3JfZW50cmllcyArIDEpKTsKLSAgICAgIGlmICghbWF0Y2hpbmdfdmVjdG9yKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG1hdGNoaW5nX3ZlY3RvclswXSA9IE5VTEw7Ci0gICAgICAqbWF0Y2hpbmcgPSBtYXRjaGluZ192ZWN0b3I7Ci0gICAgfQotICByaWdodF90YXJnID0gMDsKLQotCi0gIC8qIHByZXN1bWUgdGhlIGFuc3dlciBpcyB5ZXMgKi8KLSAgYWJmZC0+Zm9ybWF0ID0gZm9ybWF0OwotCi0gIC8qIElmIHRoZSB0YXJnZXQgdHlwZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIGp1c3QgY2hlY2sgdGhhdCB0YXJnZXQuICAqLwotCi0gIGlmICghYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkgewotICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKTAsIFNFRUtfU0VUKSAhPSAwKQkvKiByZXdpbmQhICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmlnaHRfdGFyZyA9IEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9jaGVja19mb3JtYXQsIChhYmZkKSk7Ci0gICAgaWYgKHJpZ2h0X3RhcmcpIHsKLSAgICAgIGFiZmQtPnh2ZWMgPSByaWdodF90YXJnOwkJLyogU2V0IHRoZSB0YXJnZXQgYXMgcmV0dXJuZWQgKi8KLSAgICAgIGlmIChtYXRjaGluZykKLQlmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotICAgICAgcmV0dXJuIHRydWU7CQkJLyogRmlsZSBwb3NpdGlvbiBoYXMgbW92ZWQsIEJUVyAqLwotICAgIH0KLQotICAgIC8qIEZvciBhIGxvbmcgdGltZSB0aGUgY29kZSBoYXMgZHJvcHBlZCB0aHJvdWdoIHRvIGNoZWNrIGFsbAotICAgICAgIHRhcmdldHMgaWYgdGhlIHNwZWNpZmllZCB0YXJnZXQgd2FzIHdyb25nLiAgSSBkb24ndCBrbm93IHdoeSwKLSAgICAgICBhbmQgSSdtIHJlbHVjdGFudCB0byBjaGFuZ2UgaXQuICBIb3dldmVyLCBpbiB0aGUgY2FzZSBvZiBhbgotICAgICAgIGFyY2hpdmUsIGl0IGNhbiBjYXVzZSBwcm9ibGVtcy4gIElmIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGRvZXMKLSAgICAgICBub3QgcGVybWl0IGFyY2hpdmVzIChlLmcuLCB0aGUgYmluYXJ5IHRhcmdldCksIHRoZW4gd2Ugc2hvdWxkCi0gICAgICAgbm90IGFsbG93IHNvbWUgb3RoZXIgdGFyZ2V0IHRvIHJlY29nbml6ZSBpdCBhcyBhbiBhcmNoaXZlLCBidXQKLSAgICAgICBzaG91bGQgaW5zdGVhZCBhbGxvdyB0aGUgc3BlY2lmaWVkIHRhcmdldCB0byByZWNvZ25pemUgaXQgYXMgYW4KLSAgICAgICBvYmplY3QuICBXaGVuIEkgZmlyc3QgbWFkZSB0aGlzIGNoYW5nZSwgaXQgYnJva2UgdGhlIFBFIHRhcmdldCwKLSAgICAgICBiZWNhdXNlIHRoZSBzcGVjaWZpZWQgcGVpLWkzODYgdGFyZ2V0IGRpZCBub3QgcmVjb2duaXplIHRoZQotICAgICAgIGFjdHVhbCBwZS1pMzg2IGFyY2hpdmUuICBTaW5jZSB0aGVyZSBtYXkgYmUgb3RoZXIgcHJvYmxlbXMgb2YKLSAgICAgICB0aGlzIHNvcnQsIEkgY2hhbmdlZCB0aGlzIHRlc3QgdG8gY2hlY2sgb25seSBmb3IgdGhlIGJpbmFyeQotICAgICAgIHRhcmdldC4gICovCi0KLSAgICBpZiAoZm9ybWF0ID09IGJmZF9hcmNoaXZlICYmIHNhdmVfdGFyZyA9PSAmYmluYXJ5X3ZlYykKLSAgICAgIHsKLQlhYmZkLT54dmVjID0gc2F2ZV90YXJnOwotCWFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotCWlmIChtYXRjaGluZykKLQkgIGZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgfQotCi0gIGZvciAodGFyZ2V0ID0gYmZkX3RhcmdldF92ZWN0b3I7ICp0YXJnZXQgIT0gTlVMTDsgdGFyZ2V0KyspIHsKLSAgICBjb25zdCBiZmRfdGFyZ2V0ICp0ZW1wOwotCi0gICAgaWYgKCp0YXJnZXQgPT0gJmJpbmFyeV92ZWMpCi0gICAgICBjb250aW51ZTsKLQotICAgIGFiZmQtPnh2ZWMgPSAqdGFyZ2V0OwkvKiBDaGFuZ2UgQkZEJ3MgdGFyZ2V0IHRlbXBvcmFyaWx5ICovCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpMCwgU0VFS19TRVQpICE9IDApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgLyogSWYgX2JmZF9jaGVja19mb3JtYXQgbmVnbGVjdHMgdG8gc2V0IGJmZF9lcnJvciwgYXNzdW1lIGJmZF9lcnJvcl93cm9uZ19mb3JtYXQuCi0gICAgICAgV2UgZGlkbid0IHVzZWQgdG8gZXZlbiBwYXkgYW55IGF0dGVudGlvbiB0byBiZmRfZXJyb3IsIHNvIEkgc3VzcGVjdAotICAgICAgIHRoYXQgc29tZSBfYmZkX2NoZWNrX2Zvcm1hdCBtaWdodCBoYXZlIHRoaXMgcHJvYmxlbS4gICovCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgdGVtcCA9IEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9jaGVja19mb3JtYXQsIChhYmZkKSk7Ci0gICAgaWYgKHRlbXApIHsJCQkJLyogVGhpcyBmb3JtYXQgY2hlY2tzIG91dCBhcyBvayEgKi8KLSAgICAgIHJpZ2h0X3RhcmcgPSB0ZW1wOwotICAgICAgaWYgKG1hdGNoaW5nKQotCXsKLQkgIG1hdGNoaW5nX3ZlY3RvclttYXRjaF9jb3VudF0gPSB0ZW1wLT5uYW1lOwotCSAgbWF0Y2hpbmdfdmVjdG9yW21hdGNoX2NvdW50ICsgMV0gPSBOVUxMOwotCX0KLSAgICAgIG1hdGNoX2NvdW50Kys7Ci0gICAgICAvKiBJZiB0aGlzIGlzIHRoZSBkZWZhdWx0IHRhcmdldCwgYWNjZXB0IGl0LCBldmVuIGlmIG90aGVyIHRhcmdldHMKLQkgbWlnaHQgbWF0Y2guICBQZW9wbGUgd2hvIHdhbnQgdGhvc2Ugb3RoZXIgdGFyZ2V0cyBoYXZlIHRvIHNldCAKLQkgdGhlIEdOVVRBUkdFVCB2YXJpYWJsZS4gICovCi0gICAgICBpZiAodGVtcCA9PSBiZmRfZGVmYXVsdF92ZWN0b3JbMF0pCi0JewotCSAgaWYgKG1hdGNoaW5nKQotCSAgICB7Ci0JICAgICAgbWF0Y2hpbmdfdmVjdG9yWzBdID0gdGVtcC0+bmFtZTsKLQkgICAgICBtYXRjaGluZ192ZWN0b3JbMV0gPSBOVUxMOwotCSAgICB9Ci0JICBtYXRjaF9jb3VudCA9IDE7Ci0JICBicmVhazsKLQl9Ci0jaWZkZWYgR05VOTYwCi0gICAgICAvKiBCaWctIGFuZCBsaXR0bGUtZW5kaWFuIGIub3V0IGFyY2hpdmVzIGxvb2sgdGhlIHNhbWUsIGJ1dCBpdCBkb2Vzbid0Ci0gICAgICAgKiBtYXR0ZXI6IHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlaXIgaGVhZGVycywgYW5kIG1lbWJlciBmaWxlIGJ5dGUKLSAgICAgICAqIG9yZGVycyB3aWxsIChJIGhvcGUpIGJlIGhhbmRsZWQgYXBwcm9wcmlhdGVseSBieSBiZmQuICBEaXR0byBmb3IgYmlnCi0gICAgICAgKiBhbmQgbGl0dGxlIGNvZmYgYXJjaGl2ZXMuICBBbmQgdGhlIDQgY29mZi9iLm91dCBvYmplY3QgZm9ybWF0cyBhcmUKLSAgICAgICAqIHVuYW1iaWd1b3VzLiAgU28gYWNjZXB0IHRoZSBmaXJzdCBtYXRjaCB3ZSBmaW5kLgotICAgICAgICovCi0gICAgICBicmVhazsKLSNlbmRpZgotICAgIH0gZWxzZSBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KSB7Ci0gICAgICBhYmZkLT54dmVjID0gc2F2ZV90YXJnOwotICAgICAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gICAgICBpZiAobWF0Y2hpbmcgJiYgYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1hdGNoX2NvdW50ID09IDEpIHsKLSAgICBhYmZkLT54dmVjID0gcmlnaHRfdGFyZzsJCS8qIENoYW5nZSBCRkQncyB0YXJnZXQgcGVybWFuZW50bHkgKi8KLSAgICBpZiAobWF0Y2hpbmcpCi0gICAgICBmcmVlIChtYXRjaGluZ192ZWN0b3IpOwotICAgIHJldHVybiB0cnVlOwkJCS8qIEZpbGUgcG9zaXRpb24gaGFzIG1vdmVkLCBCVFcgKi8KLSAgfQotCi0gIGFiZmQtPnh2ZWMgPSBzYXZlX3Rhcmc7CQkvKiBSZXN0b3JlIG9yaWdpbmFsIHRhcmdldCB0eXBlICovCi0gIGFiZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwkJLyogUmVzdG9yZSBvcmlnaW5hbCBmb3JtYXQgKi8KLSAgaWYgKG1hdGNoX2NvdW50ID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfbm90X3JlY29nbml6ZWQpOwotICAgICAgaWYgKG1hdGNoaW5nKQotCWZyZWUgKG1hdGNoaW5nX3ZlY3Rvcik7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9mb3JtYXQKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfZm9ybWF0KGJmZCAqYWJmZCwgYmZkX2Zvcm1hdCBmb3JtYXQpOwotCi1ERVNDUklQVElPTgotCVRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgZmlsZSBmb3JtYXQgb2YgdGhlIEJGRCBAdmFye2FiZmR9IHRvIHRoZQotCWZvcm1hdCBAdmFye2Zvcm1hdH0uIElmIHRoZSB0YXJnZXQgc2V0IGluIHRoZSBCRkQgZG9lcyBub3QKLQlzdXBwb3J0IHRoZSBmb3JtYXQgcmVxdWVzdGVkLCB0aGUgZm9ybWF0IGlzIGludmFsaWQsIG9yIHRoZSBCRkQKLQlpcyBub3Qgb3BlbiBmb3Igd3JpdGluZywgdGhlbiBhbiBlcnJvciBvY2N1cnMuCi0KLSovCi0KLWJvb2xlYW4KLWJmZF9zZXRfZm9ybWF0IChhYmZkLCBmb3JtYXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX2Zvcm1hdCBmb3JtYXQ7Ci17Ci0KLSAgaWYgKGJmZF9yZWFkX3AgKGFiZmQpIHx8Ci0gICAgICAoKGludClhYmZkLT5mb3JtYXQgPCAoaW50KWJmZF91bmtub3duKSB8fAotICAgICAgKChpbnQpYWJmZC0+Zm9ybWF0ID49IChpbnQpYmZkX3R5cGVfZW5kKSkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGFiZmQtPmZvcm1hdCAhPSBiZmRfdW5rbm93bikKLSAgICByZXR1cm4gKGFiZmQtPmZvcm1hdCA9PSBmb3JtYXQpID8gdHJ1ZTpmYWxzZTsKLQotICAvKiBwcmVzdW1lIHRoZSBhbnN3ZXIgaXMgeWVzICovCi0gIGFiZmQtPmZvcm1hdCA9IGZvcm1hdDsKLQotICBpZiAoIUJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF9zZXRfZm9ybWF0LCAoYWJmZCkpKSB7Ci0gICAgYWJmZC0+Zm9ybWF0ID0gYmZkX3Vua25vd247Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Zvcm1hdF9zdHJpbmcKLQotU1lOT1BTSVMKLQlDT05TVCBjaGFyICpiZmRfZm9ybWF0X3N0cmluZyhiZmRfZm9ybWF0IGZvcm1hdCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byBhIGNvbnN0IHN0cmluZwotCTw8aW52YWxpZD4+LCA8PG9iamVjdD4+LCA8PGFyY2hpdmU+PiwgPDxjb3JlPj4sIG9yIDw8dW5rbm93bj4+LAotCWRlcGVuZGluZyB1cG9uIHRoZSB2YWx1ZSBvZiBAdmFye2Zvcm1hdH0uCi0qLwotCi1DT05TVCBjaGFyICoKLWJmZF9mb3JtYXRfc3RyaW5nIChmb3JtYXQpCi0gICAgIGJmZF9mb3JtYXQgZm9ybWF0OwotewotICBpZiAoKChpbnQpZm9ybWF0IDwoaW50KSBiZmRfdW5rbm93bikgCi0gICAgICB8fCAoKGludClmb3JtYXQgPj0oaW50KSBiZmRfdHlwZV9lbmQpKSAKLSAgICByZXR1cm4gImludmFsaWQiOwotICAKLSAgc3dpdGNoIChmb3JtYXQpIHsKLSAgY2FzZSBiZmRfb2JqZWN0OgotICAgIHJldHVybiAib2JqZWN0IjsJCS8qIGxpbmtlci9hc3NlbWJlci9jb21waWxlciBvdXRwdXQgKi8KLSAgY2FzZSBiZmRfYXJjaGl2ZTogCi0gICAgcmV0dXJuICJhcmNoaXZlIjsJCS8qIG9iamVjdCBhcmNoaXZlIGZpbGUgKi8KLSAgY2FzZSBiZmRfY29yZTogCi0gICAgcmV0dXJuICJjb3JlIjsJCS8qIGNvcmUgZHVtcCAqLwotICBkZWZhdWx0OiAKLSAgICByZXR1cm4gInVua25vd24iOwotICB9Ci19CmRpZmYgLS1naXQgYS9iZmQvZnJlZWJzZC5oIGIvYmZkL2ZyZWVic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJiMTlhYy4uMDAwMDAwMAotLS0gYS9iZmQvZnJlZWJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBkZWZpbml0aW9ucyB1c2VkIGJ5IGFsbCBGcmVlQlNEIHRhcmdldHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotKi8KLQotLyogRnJlZUJTRCBaTUFHSUMgZmlsZXMgbmV2ZXIgaGF2ZSB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAqLwotI2RlZmluZQlOX0hFQURFUl9JTl9URVhUKHgpCTAKLQotLyogWk1BR0lDIGZpbGVzIHN0YXJ0IGF0IG9mZnNldCAwLiAgRG9lcyBub3QgYXBwbHkgdG8gUU1BR0lDIGZpbGVzLiAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJCTAKLQotI2RlZmluZSBOX0dFVE1BR0lDX05FVChleGVjKSBcCi0JKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZGVmaW5lIE5fR0VUTUlEX05FVChleGVjKSBcCi0JKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4M2ZmKQotI2RlZmluZSBOX0dFVEZMQUdfTkVUKGV4KSBcCi0JKCgoZXhlYykuYV9pbmZvID4+IDI2KSAmIDB4M2YpCi0KLSNkZWZpbmUgTl9NQUNIVFlQRShleGVjKSBcCi0JKChlbnVtIG1hY2hpbmVfdHlwZSkgXAotCSAoKE5fR0VUTUFHSUNfTkVUIChleGVjKSA9PSBaTUFHSUMpID8gTl9HRVRNSURfTkVUIChleGVjKSA6IFwKLQkgICgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4M2ZmKSkKLSNkZWZpbmUgTl9GTEFHUyhleGVjKSBcCi0JKChOX0dFVE1BR0lDX05FVCAoZXhlYykgPT0gWk1BR0lDKSA/IE5fR0VURkxBR19ORVQgKGV4ZWMpIDogXAotCSAoKGV4ZWMpLmFfaW5mbyA+PiAyNikgJiAweDNmKQotCi0jZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0JKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotCSB8ICgoKGludCkodHlwZSkgJiAweDNmZikgPDwgMTYpIFwKLQkgfCAoKChmbGFncykgJiAweDNmKSA8PCAyNikpCi0jZGVmaW5lIE5fU0VUX01BQ0hUWVBFKGV4ZWMsIG1hY2h0eXBlKSBcCi0JKChleGVjKS5hX2luZm8gPSBcCi0gICAgICAgICAoKGV4ZWMpLmFfaW5mbyAmIDB4ZmIwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweDNmZikgPDwgMTYpKQotI2RlZmluZSBOX1NFVF9GTEFHUyhleGVjLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gXAotCSAoKGV4ZWMpLmFfaW5mbyAmIDB4MDNmZmZmZmYpIHwgKChmbGFncyAmIDB4MDNmKSA8PCAyNikpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIE9uIEZyZWVCU0QsIHRoZSBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGluIGkzODYgKGxpdHRsZS1lbmRpYW4pCi0gICBmb3JtYXQuICBJIHRoaW5rLiAgKi8KLSNkZWZpbmUgU1dBUF9NQUdJQyhleHQpIGJmZF9nZXRsMzIgKGV4dCkKLQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpCi1zdGF0aWMgYm9vbGVhbiBNWSh3cml0ZV9vYmplY3RfY29udGVudHMpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKLQotLyogV3JpdGUgYW4gb2JqZWN0IGZpbGUuCi0gICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgIGZpbGUgaGVhZGVyLCBzeW1ib2xzLCBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1NWSh3cml0ZV9vYmplY3RfY29udGVudHMpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFKGFiZmQpOwotI2Vsc2UKLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0jZW5kaWYKLQotICAvKiBNYWdpYyBudW1iZXIsIG1hZXN0cm8sIHBsZWFzZSEgICovCi0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICBpZiAoc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiYS5vdXQtbTY4azRrLW5ldGJzZCIpID09IDApCi0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjhLNEtfTkVUQlNEKTsKLSAgICBlbHNlCi0gICAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fNjhLX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1NQQVJDX05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMzg2X05FVEJTRCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfbnMzMms6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzUzMl9ORVRCU0QpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9VTktOT1dOKTsKLSAgICBicmVhazsKLSAgfQotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2dlbi1hb3V0LmMgYi9iZmQvZ2VuLWFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlZDkxYS4uMDAwMDAwMAotLS0gYS9iZmQvZ2VuLWFvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKiBHZW5lcmF0ZSBwYXJhbWV0ZXJzIGZvciBhbiBhLm91dCBzeXN0ZW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiL3Vzci9pbmNsdWRlL2Eub3V0LmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsgY2hhcioqIGFyZ3Y7Ci17Ci0gIHN0cnVjdCBleGVjIG15X2V4ZWM7Ci0gIGludCBwYWdlX3NpemU7Ci0gIGNoYXIgKnRhcmdldCA9ICJ1bmtub3duIiwgKmFyY2ggPSAidW5rbm93biI7Ci0gIEZJTEUgKmZpbGUgPSBmb3BlbigiZ2VuLWFvdXQiLCAiciIpOwotCi0gIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gZ2VuLWFvdXQhXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoZnJlYWQoJm15X2V4ZWMsIHNpemVvZihzdHJ1Y3QgZXhlYyksIDEsIGZpbGUpICE9IDEpIHsKLSAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IHJlYWQgZ2VuLWFvdXQhXG4iKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHRhcmdldCA9IGFyZ3ZbMV07Ci0gIGlmICh0YXJnZXQgPT0gTlVMTCkgewotICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogZ2VuLWFvdXQgdGFyZ2V0X25hbWVcbiIpOwotICAgICAgZXhpdCAoMSk7Ci0gIH0KLQotI2lmZGVmIE5fVFhUT0ZGCi0gIHBhZ2Vfc2l6ZSA9IE5fVFhUT0ZGKG15X2V4ZWMpOwotICBpZiAocGFnZV9zaXplID09IDApCi0gICAgcHJpbnRmKCIjZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMVxuIik7Ci0gIGVsc2UKLSAgICBwcmludGYoIiNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwXG4iKTsKLSNlbmRpZgotCi0gIHByaW50ZigiI2RlZmluZSBCWVRFU19JTl9XT1JEICVkXG4iLCBzaXplb2YgKGludCkpOwotICBpZiAobXlfZXhlYy5hX2VudHJ5ID09IDApIHsKLSAgICAgIHByaW50ZigiI2RlZmluZSBFTlRSWV9DQU5fQkVfWkVST1xuIik7Ci0gICAgICBwcmludGYoIiNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgKi9cbiIpOwotICB9Ci0gIGVsc2UgewotICAgICAgcHJpbnRmKCIvKiNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8qL1xuIik7Ci0gICAgICBwcmludGYoIi8qI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMCovXG4iKTsKLSAgfQotCi0gIHByaW50ZigiI2RlZmluZSBURVhUX1NUQVJUX0FERFIgJWRcbiIsIG15X2V4ZWMuYV9lbnRyeSk7Ci0KLSNpZmRlZiBQQUdTSVoKLSAgaWYgKHBhZ2Vfc2l6ZSA9PSAwKQotICAgIHBhZ2Vfc2l6ZSA9IFBBR1NJWjsKLSNlbmRpZgotICBpZiAocGFnZV9zaXplICE9IDApCi0gICAgcHJpbnRmKCIjZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgJWRcbiIsIHBhZ2Vfc2l6ZSk7Ci0gIGVsc2UKLSAgICBwcmludGYoIi8qICNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSA/Pz8gKi9cbiIpOwotICBwcmludGYoIiNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkVcbiIpOwotCi0jaWZkZWYgdmF4Ci0gIGFyY2ggPSAidmF4IjsKLSNlbmRpZgotI2lmZGVmIG02OGsKLSAgYXJjaCA9ICJtNjhrIjsKLSNlbmRpZgotICBpZiAoYXJjaFswXSA9PSAnMScpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ3YXJuaW5nOiBwcmVwcm9jZXNzb3Igc3Vic3RpdHV0ZWQgYXJjaGl0ZWN0dXJlIG5hbWUgaW5zaWRlIHN0cmluZzsiKSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiAgICAgICAgIGZpeCBERUZBVUxUX0FSQ0ggaW4gdGhlIG91dHB1dCBmaWxlIHlvdXJzZWxmXG4iKSk7Ci0gICAgICBhcmNoID0gInVua25vd24iOwotICAgIH0KLSAgcHJpbnRmKCIjZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF8lc1xuIiwgYXJjaCk7Ci0KLSAgcHJpbnRmKCJcbiNkZWZpbmUgTVkoT1ApIENBVCglc18sT1ApXG4iLCB0YXJnZXQpOwotICBwcmludGYoIiNkZWZpbmUgVEFSR0VUTkFNRSBcImEub3V0LSVzXCJcblxuIiwgdGFyZ2V0KTsKLQotICBwcmludGYoIiNpbmNsdWRlIFwiYmZkLmhcIlxuIik7Ci0gIHByaW50ZigiI2luY2x1ZGUgXCJzeXNkZXAuaFwiXG4iKTsKLSAgcHJpbnRmKCIjaW5jbHVkZSBcImxpYmJmZC5oXCJcbiIpOwotICBwcmludGYoIiNpbmNsdWRlIFwibGliYW91dC5oXCJcbiIpOwotICBwcmludGYoIlxuI2luY2x1ZGUgXCJhb3V0LXRhcmdldC5oXCJcbiIpOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmZkL2dlbmxpbmsuaCBiL2JmZC9nZW5saW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGE4ZGUuLjAwMDAwMDAKLS0tIGEvYmZkL2dlbmxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBnZW5saW5rLmggLS0gaW50ZXJmYWNlIHRvIHRoZSBCRkQgZ2VuZXJpYyBsaW5rZXIKLSAgIENvcHlyaWdodCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEdFTkxJTktfSAotI2RlZmluZSBHRU5MSU5LX0gKLQotLyogVGhpcyBoZWFkZXIgZmlsZSBpcyBpbnRlcm5hbCB0byBCRkQuICBJdCBkZXNjcmliZXMgdGhlIGludGVybmFsCi0gICBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgdXNlZCBieSB0aGUgQkZEIGdlbmVyaWMgbGlua2VyLCBpbiBjYXNlCi0gICBhbnkgb2YgdGhlIG1vcmUgc3BlY2lmaWMgbGlua2VycyB3YW50IHRvIHVzZSBvciBjYWxsIHRoZW0uICBOb3RlCi0gICB0aGF0IHNvbWUgZnVuY3Rpb25zLCBzdWNoIGFzIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlLAotICAgYXJlIGRlY2xhcmVkIGluIGxpYmJmZC5oLCBiZWNhdXNlIHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIHdpZGVseQotICAgdXNlZC4gIFRoZSBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIHdpbGwgcHJvYmFibHkgb25seQotICAgYmUgdXNlZCBieSBhIGZldyBmaWxlcyBiZXNpZGVzIGxpbmtlci5jIGl0c2VsZi4gIEluIGZhY3QsIHRoaXMgZmlsZQotICAgaXMgbm90IHBhcnRpY3VsYXJseSBjb21wbGV0ZTsgSSBoYXZlIG9ubHkgcHV0IGluIHRoZSBpbnRlcmZhY2VzIEkKLSAgIGFjdHVhbGx5IG5lZWRlZC4gICovCi0KLS8qIFRoZSBnZW5lcmljIGxpbmtlciB1c2VzIGEgaGFzaCB0YWJsZSB3aGljaCBpcyBhIGRlcml2ZWQgY2xhc3Mgb2YKLSAgIHRoZSBzdGFuZGFyZCBsaW5rZXIgaGFzaCB0YWJsZSwganVzdCBhcyB0aGUgb3RoZXIgYmFja2VuZCBzcGVjaWZpYwotICAgbGlua2VycyBkby4gIERvIG5vdCBjb25mdXNlIHRoZSBnZW5lcmljIGxpbmtlciBoYXNoIHRhYmxlIHdpdGggdGhlCi0gICBzdGFuZGFyZCBCRkQgbGlua2VyIGhhc2ggdGFibGUgaXQgaXMgYnVpbHQgdXBvbi4gICovCi0KLS8qIEdlbmVyaWMgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgYm9vbGVhbiB3cml0dGVuOwotICAvKiBTeW1ib2wgZnJvbSBpbnB1dCBCRkQuICAqLwotICBhc3ltYm9sICpzeW07Ci19OwotCi0vKiBHZW5lcmljIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfaGFzaF90YWJsZShwKSBcCi0gICgoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBUaGUgZ2VuZXJpYyBsaW5rZXIgcmVhZHMgaW4gdGhlIGFzeW1ib2wgc3RydWN0dXJlcyBmb3IgYW4gaW5wdXQgQkZECi0gICBhbmQga2VlcHMgdGhlbSBpbiB0aGUgb3V0c3ltYm9sIGFuZCBzeW1jb3VudCBmaWVsZHMuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzKGFiZmQpICgoYWJmZCktPm91dHN5bWJvbHMpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudChhYmZkKSAoKGFiZmQpLT5zeW1jb3VudCkKLQotLyogQWRkIHRoZSBzeW1ib2xzIG9mIGlucHV0X2JmZCB0byB0aGUgc3ltYm9scyBiZWluZyBidWlsdCBmb3IKLSAgIG91dHB1dF9iZmQuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICpvdXRwdXRfYmZkLCBiZmQgKmlucHV0X2JmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBzaXplX3QgKnBzeW1hbGxvYykpOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdG8KLSAgIF9iZmRfZ2VuZXJpY19saW5rX3dyaXRlX2dsb2JhbF9zeW1ib2wsIHdoaWNoIG1heSBiZSBjYWxsZWQgdmlhCi0gICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvCi17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIHNpemVfdCAqcHN5bWFsbG9jOwotfTsKLQotLyogV3JpdGUgb3V0IGEgc2luZ2xlIGdsb2JhbCBzeW1ib2wuICBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZAotICAgdmlhIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UuICBUaGUgc2Vjb25kIGFyZ3VtZW50IG11c3QKLSAgIGFjdHVhbGx5IGJlIGEgc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvICouICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci0KLS8qIEdlbmVyaWMgbGluayBoYXNoIHRhYmxlIGVudHJ5IGNyZWF0aW9uIHJvdXRpbmUuICAqLwotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotICAgICAgICAgICBjb25zdCBjaGFyICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9iZmQvZ28zMnN0dWIuaCBiL2JmZC9nbzMyc3R1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQzODhjLi4wMDAwMDAwCi0tLSBhL2JmZC9nbzMyc3R1Yi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLTB4NGQsMHg1YSwweDAwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDIwLDB4MDAsMHgyNywweDAwLDB4ZmYsMHhmZiwweDAwLDB4MDAsCi0weDYwLDB4MDcsMHgwMCwweDAwLDB4NTQsMHgwMCwweDAwLDB4MDAsMHgwZCwweDBhLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDY4LAotMHgyMCwweDY3LDB4NjUsMHg2ZSwweDY1LDB4NzIsMHg2MSwweDc0LDB4NjUsMHg2NCwweDIwLDB4NjYsMHg3MiwweDZmLDB4NmQsMHgyMCwKLTB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsMHg2ZCwweDIwLDB4NjIsMHg3OSwweDIwLDB4NjQsMHg2YSwweDYxLDB4NzMsCi0weDZkLDB4MmMsMHgyMCwweDZmLDB4NmUsMHgyMCwweDU3LDB4NjUsMHg2NCwweDIwLDB4NGEsMHg3NSwweDZlLDB4MjAsMHgzMSwweDMxLAotMHgyMCwweDMxLDB4MzYsMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDMxLDB4MzksMHgzOSwweDM3LDB4MGQsMHgwYSwKLTB4NTQsMHg2OCwweDY1LDB4MjAsMHg1MywweDU0LDB4NTUsMHg0MiwweDJlLDB4NDUsMHg1OCwweDQ1LDB4MjAsMHg3MywweDc0LDB4NzUsCi0weDYyLDB4MjAsMHg2YywweDZmLDB4NjEsMHg2NCwweDY1LDB4NzIsMHgyMCwweDY5LDB4NzMsMHgyMCwweDQzLDB4NmYsMHg3MCwweDc5LAotMHg3MiwweDY5LDB4NjcsMHg2OCwweDc0LDB4MjAsMHgyOCwweDQzLDB4MjksMHgyMCwweDMxLDB4MzksMHgzOSwweDMzLDB4MmQsMHgzMSwKLTB4MzksMHgzOSwweDM1LDB4MjAsMHg0NCwweDRhLDB4MjAsMHg0NCwweDY1LDB4NmMsMHg2ZiwweDcyLDB4NjksMHg2NSwweDJlLDB4MjAsCi0weDBkLDB4MGEsMHg1MCwweDY1LDB4NzIsMHg2ZCwweDY5LDB4NzMsMHg3MywweDY5LDB4NmYsMHg2ZSwweDIwLDB4NjcsMHg3MiwweDYxLAotMHg2ZSwweDc0LDB4NjUsMHg2NCwweDIwLDB4NzQsMHg2ZiwweDIwLDB4NzUsMHg3MywweDY1LDB4MjAsMHg2NiwweDZmLDB4NzIsMHgyMCwKLTB4NjEsMHg2ZSwweDc5LDB4MjAsMHg3MCwweDc1LDB4NzIsMHg3MCwweDZmLDB4NzMsMHg2NSwweDIwLDB4NzAsMHg3MiwweDZmLDB4NzYsCi0weDY5LDB4NjQsMHg2NSwweDY0LDB4MjAsMHg3NCwweDY4LDB4NjksMHg3MywweDIwLDB4NjMsMHg2ZiwweDcwLDB4NzksMHg3MiwweDY5LAotMHg2NywweDY4LDB4NzQsMHgyMCwweDBkLDB4MGEsMHg3MiwweDY1LDB4NmQsMHg2MSwweDY5LDB4NmUsMHg3MywweDIwLDB4NzAsMHg3MiwKLTB4NjUsMHg3MywweDY1LDB4NmUsMHg3NCwweDIwLDB4NjEsMHg2ZSwweDY0LDB4MjAsMHg3NSwweDZlLDB4NmQsMHg2ZiwweDY0LDB4NjksCi0weDY2LDB4NjksMHg2NSwweDY0LDB4MmUsMHgyMCwweDBkLDB4MGEsMHg1NCwweDY4LDB4NjksMHg3MywweDIwLDB4NmYsMHg2ZSwweDZjLAotMHg3OSwweDIwLDB4NjEsMHg3MCwweDcwLDB4NmMsMHg2OSwweDY1LDB4NzMsMHgyMCwweDc0LDB4NmYsMHgyMCwweDc0LDB4NjgsMHg2NSwKLTB4MjAsMHg3MywweDc0LDB4NzUsMHg2MiwweDJjLDB4MjAsMHg2MSwweDZlLDB4NjQsMHgyMCwweDZlLDB4NmYsMHg3NCwweDIwLDB4NmUsCi0weDY1LDB4NjMsMHg2MywweDY1LDB4NzMsMHg3MywweDYxLDB4NzIsMHg2OSwweDZjLDB4NzksMHgyMCwweDc0LDB4NjgsMHg2NSwweDIwLAotMHg3NywweDY4LDB4NmYsMHg2YywweDY1LDB4MjAsMHg3MCwweDcyLDB4NmYsMHg2NywweDcyLDB4NjEsMHg2ZCwweDJlLDB4MGEsMHgwZCwKLTB4MGEsMHgyNCwweDQ5LDB4NjQsMHgzYSwweDIwLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsMHg2ZCwweDIwLDB4NjIsCi0weDc1LDB4NjksMHg2YywweDc0LDB4MjAsMHgzMCwweDM2LDB4MmYsMHgzMSwweDMxLDB4MmYsMHgzOSwweDM3LDB4MjAsMHgzMSwweDM2LAotMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDYyLDB4NzksMHgyMCwweDY0LDB4NmEsMHg2MSwweDczLDB4NmQsMHgyMCwKLTB4MjQsMHgwYSwweDBkLDB4MGEsMHg0MCwweDI4LDB4MjMsMHgyOSwweDIwLDB4NzMsMHg3NCwweDc1LDB4NjIsMHgyZSwweDYxLDB4NzMsCi0weDZkLDB4MjAsMHg2MiwweDc1LDB4NjksMHg2YywweDc0LDB4MjAsMHgzMCwweDM2LDB4MmYsMHgzMSwweDMxLDB4MmYsMHgzOSwweDM3LAotMHgyMCwweDMxLDB4MzYsMHgzYSwweDMwLDB4MzksMHgzYSwweDMxLDB4MzUsMHgyMCwweDYyLDB4NzksMHgyMCwweDY0LDB4NmEsMHg2MSwKLTB4NzMsMHg2ZCwweDBhLDB4MGQsMHgwYSwweDFhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHg2NywweDZmLDB4MzMsMHgzMiwweDczLDB4NzQsMHg3NSwweDYyLDB4MmMsMHgyMCwweDc2LDB4MjAsMHgzMiwweDJlLDB4MzAsMHgzMCwKLTB4NTQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCi0weDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAotMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKLTB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDU3LDB4NTMsMHg0NCwweDUwLDB4NGQsMHg0OSwweDJlLDB4NDUsMHg1OCwweDQ1LDB4MDAsCi0weDAwLDB4MDAsMHgwMCwweDAwLDB4MGUsMHgxZiwweDhjLDB4MWUsMHgyNCwweDAwLDB4OGMsMHgwNiwweDYwLDB4MDcsMHhmYywweGI0LAotMHgzMCwweGNkLDB4MjEsMHgzYywweDAzLDB4NzMsMHgwNiwweGJhLDB4ODYsMHgwNSwweGU5LDB4YjIsMHgwMywweGEyLDB4NjksMHgwOCwKLTB4YmIsMHg3MCwweDA4LDB4YTEsMHgyMCwweDAwLDB4MzksMHhjMywweDczLDB4MDIsMHg4OSwweGMzLDB4ODksMHgxZSwweDIwLDB4MDAsCi0weGZlLDB4YzcsMHhiOSwweDA0LDB4ZmYsMHhkMywweGViLDB4YjQsMHg0YSwweGNkLDB4MjEsMHg3MywweDBhLDB4ZDMsMHhlMywweGZlLAotMHhjZiwweDg5LDB4MWUsMHgyMCwweDAwLDB4ZWIsMHhkOSwweDI2LDB4OGUsMHgwNiwweDJjLDB4MDAsMHgzMSwweGZmLDB4MzAsMHhjMCwKLTB4YTksMHhmMiwweGFlLDB4MjYsMHg4MSwweDNkLDB4NTAsMHg0MSwweDc1LDB4MTUsMHhhZiwweDI2LDB4ODEsMHgzZCwweDU0LDB4NDgsCi0weDc1LDB4MGQsMHhhZiwweDI2LDB4ODAsMHgzZCwweDNkLDB4NzUsMHgwNiwweDQ3LDB4ODksMHgzZSwweDY3LDB4MDQsMHg0ZiwweGFlLAotMHg3NSwweGRmLDB4YWYsMHgwNiwweDU3LDB4MzEsMHhjOSwweDc0LDB4MTAsMHhiYSwweDVkLDB4MDUsMHhlOSwweDUwLDB4MDMsMHgwOSwKLTB4YzksMHg3NSwweGY2LDB4NDEsMHhlOCwweDkyLDB4MDMsMHg3MiwweGYwLDB4YjgsMHg4NywweDE2LDB4Y2QsMHgyZiwweDA5LDB4YzAsCi0weDc1LDB4ZWQsMHg4MCwweGUzLDB4MDEsMHg3NCwweGU4LDB4ODksMHgzZSwweDAwLDB4MDYsMHg4YywweDA2LDB4MDIsMHgwNiwweDg5LAotMHgzNiwweDA0LDB4MDYsMHg1ZiwweDA3LDB4ZTgsMHhkNSwweDAyLDB4ODksMHgzZSwweDJhLDB4MDAsMHg4OSwweDM2LDB4NjIsMHgwNywKLTB4ODAsMHgzZSwweDJjLDB4MDAsMHgwMCwweDc0LDB4MjQsMHhiOSwweDA4LDB4MDAsMHhiZiwweDJjLDB4MDAsMHg4YSwweDA1LDB4NDcsCi0weDA4LDB4YzAsMHg3NCwweDA1LDB4ODgsMHgwNywweDQzLDB4ZTIsMHhmNCwweDY2LDB4YzcsMHgwNywweDJlLDB4NDUsMHg1OCwweDQ1LAotMHg4MSwweGMzLDB4MDQsMHgwMCwweGM2LDB4MDcsMHgwMCwweDg5LDB4MWUsMHg2MiwweDA3LDB4YjgsMHgwMCwweDNkLDB4YmEsMHg2NCwKLTB4MDcsMHhjZCwweDIxLDB4MGYsMHg4MiwweGI0LDB4MDIsMHhhMywweDA2LDB4MDYsMHg4OSwweGMzLDB4YjksMHgwNiwweDAwLDB4YmEsCi0weGI1LDB4MDcsMHhiNCwweDNmLDB4Y2QsMHgyMSwweDMxLDB4ZDIsMHgzMSwweGM5LDB4YTEsMHhiNSwweDA3LDB4M2QsMHg0YywweDAxLAotMHg3NCwweDFiLDB4M2QsMHg0ZCwweDVhLDB4MGYsMHg4NSwweDk3LDB4MDIsMHg4YiwweDE2LDB4YjksMHgwNywweGMxLDB4ZTIsMHgwOSwKLTB4OGIsMHgxZSwweGI3LDB4MDcsMHgwOSwweGRiLDB4NzQsMHgwNSwweDgwLDB4ZWUsMHgwMiwweDAxLDB4ZGEsMHg4OSwweDE2LDB4YmIsCi0weDA3LDB4ODksMHgwZSwweGJkLDB4MDcsMHhiOCwweDAwLDB4NDIsMHg4YiwweDFlLDB4MDYsMHgwNiwweGNkLDB4MjEsMHhiOSwweGE4LAotMHgwMCwweGJhLDB4YmYsMHgwNywweGI0LDB4M2YsMHhjZCwweDIxLDB4M2QsMHhhOCwweDAwLDB4NzUsMHgwNiwweDgxLDB4M2UsMHhiZiwKLTB4MDcsMHg0YywweDAxLDB4MGYsMHg4NSwweDVlLDB4MDIsMHg2NiwweGExLDB4ZTMsMHgwNywweDY2LDB4YTMsMHgxMCwweDA2LDB4NjYsCi0weDhiLDB4MGUsMHhiYiwweDA3LDB4NjYsMHhhMSwweDAzLDB4MDgsMHg2NiwweDAxLDB4YzgsMHg2NiwweGEzLDB4MDgsMHgwNiwweDY2LAotMHhhMSwweDJiLDB4MDgsMHg2NiwweDAxLDB4YzgsMHg2NiwweGEzLDB4MGMsMHgwNiwweDY2LDB4OGIsMHgxZSwweDRiLDB4MDgsMHg2NiwKLTB4YTEsMHg0ZiwweDA4LDB4NjYsMHgwMSwweGMzLDB4NjYsMHhiOCwweDAxLDB4MDAsMHgwMSwweDAwLDB4NjYsMHgzOSwweGMzLDB4NzMsCi0weDAzLDB4NjYsMHg4OSwweGMzLDB4NjYsMHg4MSwweGMzLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgzMSwweGRiLDB4NjYsMHg4OSwweDFlLAotMHgxYywweDAwLDB4ZTgsMHhlOCwweDAyLDB4OGIsMHgxZSwweDA0LDB4MDYsMHgwOSwweGRiLDB4NzQsMHgwYSwweGI0LDB4NDgsMHhjZCwKLTB4MjEsMHgwZiwweDgyLDB4MTAsMHgwMiwweDhlLDB4YzAsMHhlOCwweGZiLDB4MDIsMHhiOCwweDAxLDB4MDAsMHhmZiwweDFlLDB4MDAsCi0weDA2LDB4MGYsMHg4MiwweDA4LDB4MDIsMHg4YywweDA2LDB4MjYsMHgwMCwweDhjLDB4MGUsMHgyOCwweDAwLDB4OGMsMHhkOCwweGEzLAotMHgyMiwweDAwLDB4OGUsMHhjMCwweDMxLDB4YzAsMHhiOSwweDAxLDB4MDAsMHhjZCwweDMxLDB4NzIsMHgwNywweGEzLDB4MTQsMHgwNiwKLTB4MzEsMHhjMCwweGNkLDB4MzEsMHgwZiwweDgyLDB4ZWEsMHgwMSwweGEzLDB4MTYsMHgwNiwweDY2LDB4OGIsMHgwZSwweDFjLDB4MDAsCi0weGI4LDB4MDEsMHgwNSwweDhiLDB4MWUsMHgxZSwweDAwLDB4Y2QsMHgzMSwweDBmLDB4ODIsMHhkYSwweDAxLDB4ODksMHgxZSwweDFhLAotMHgwNiwweDg5LDB4MGUsMHgxOCwweDA2LDB4ODksMHgzNiwweDFhLDB4MDAsMHg4OSwweDNlLDB4MTgsMHgwMCwweGI4LDB4MDcsMHgwMCwKLTB4OGIsMHgxZSwweDE0LDB4MDYsMHg4YiwweDBlLDB4MWEsMHgwNiwweDhiLDB4MTYsMHgxOCwweDA2LDB4Y2QsMHgzMSwweGI4LDB4MDksCi0weDAwLDB4OGMsMHhjOSwweDgxLDB4ZTEsMHgwMywweDAwLDB4YzEsMHhlMSwweDA1LDB4NTEsMHg4MSwweGM5LDB4OWIsMHhjMCwweGNkLAotMHgzMSwweGI4LDB4MDgsMHgwMCwweDhiLDB4MGUsMHgxZSwweDAwLDB4NDksMHhiYSwweGZmLDB4ZmYsMHhjZCwweDMxLDB4YjgsMHgwNywKLTB4MDAsMHg4YiwweDFlLDB4MTYsMHgwNiwweDhiLDB4MGUsMHgxYSwweDA2LDB4OGIsMHgxNiwweDE4LDB4MDYsMHhjZCwweDMxLDB4YjgsCi0weDA5LDB4MDAsMHg1OSwweDgxLDB4YzksMHg5MywweGMwLDB4Y2QsMHgzMSwweGI4LDB4MDgsMHgwMCwweDhiLDB4MGUsMHgxZSwweDAwLAotMHg0OSwweGJhLDB4ZmYsMHhmZiwweGNkLDB4MzEsMHhiOCwweDAwLDB4MDEsMHhiYiwweDAwLDB4MGYsMHhjZCwweDMxLDB4NzMsMHgxMCwKLTB4M2QsMHgwOCwweDAwLDB4MGYsMHg4NSwweDY1LDB4MDEsMHhiOCwweDAwLDB4MDEsMHhjZCwweDMxLDB4MGYsMHg4MiwweDVjLDB4MDEsCi0weGEzLDB4MWMsMHgwNiwweDg5LDB4MTYsMHgxZSwweDA2LDB4YzEsMHhlMywweDA0LDB4ODksMHgxZSwweDIwLDB4MDYsMHg2NiwweDhiLAotMHgzNiwweDA4LDB4MDYsMHg2NiwweDhiLDB4M2UsMHhmYiwweDA3LDB4NjYsMHg4YiwweDBlLDB4ZmYsMHgwNywweGU4LDB4NDksMHgwMCwKLTB4NjYsMHg4YiwweDM2LDB4MGMsMHgwNiwweDY2LDB4OGIsMHgzZSwweDIzLDB4MDgsMHg2NiwweDhiLDB4MGUsMHgyNywweDA4LDB4ZTgsCi0weDM3LDB4MDAsMHg4ZSwweDA2LDB4MTYsMHgwNiwweDY2LDB4OGIsMHgzZSwweDRiLDB4MDgsMHg2NiwweDhiLDB4MGUsMHg0ZiwweDA4LAotMHg2NiwweDMxLDB4YzAsMHg2NiwweGMxLDB4ZTksMHgwMiwweDY3LDB4ZjMsMHg2NiwweGFiLDB4YjQsMHgzZSwweDhiLDB4MWUsMHgwNiwKLTB4MDYsMHhjZCwweDIxLDB4YjgsMHgwMSwweDAxLDB4OGIsMHgxNiwweDFlLDB4MDYsMHhjZCwweDMxLDB4MWUsMHgwZiwweGExLDB4OGUsCi0weDFlLDB4MTYsMHgwNiwweDY2LDB4NjQsMHhmZiwweDJlLDB4MTAsMHgwNiwweDY2LDB4ODksMHhmMCwweDY2LDB4MjUsMHhmZiwweDAxLAotMHgwMCwweDAwLDB4NjYsMHgwMSwweGMxLDB4MjksMHhjNiwweDY2LDB4MjksMHhjNywweDY2LDB4ODksMHgwZSwweDI2LDB4MDYsMHg2NiwKLTB4ODksMHgzZSwweDIyLDB4MDYsMHhlOCwweGZlLDB4MDAsMHg4OSwweDM2LDB4M2UsMHgwNiwweDY2LDB4YzEsMHhlZSwweDEwLDB4ODksCi0weDM2LDB4NDIsMHgwNiwweDhiLDB4MWUsMHgwNiwweDA2LDB4ODksMHgxZSwweDNhLDB4MDYsMHhjNywweDA2LDB4NDYsMHgwNiwweDAwLAotMHg0MiwweGU4LDB4ZjIsMHgwMCwweGExLDB4MWMsMHgwNiwweGEzLDB4NGUsMHgwNiwweGM3LDB4MDYsMHgzZSwweDA2LDB4MDAsMHgwMCwKLTB4YzYsMHgwNiwweDQ3LDB4MDYsMHgzZiwweGExLDB4MjgsMHgwNiwweDA5LDB4YzAsMHg3NSwweDA5LDB4YTEsMHgyNiwweDA2LDB4M2IsCi0weDA2LDB4MjAsMHgwNiwweDc2LDB4MDMsMHhhMSwweDIwLDB4MDYsMHhhMywweDQyLDB4MDYsMHhlOCwweGM4LDB4MDAsMHg2NiwweDMxLAotMHhjOSwweDhiLDB4MGUsMHg0NiwweDA2LDB4NjYsMHg4YiwweDNlLDB4MjIsMHgwNiwweDY2LDB4MDEsMHgwZSwweDIyLDB4MDYsMHg2NiwKLTB4MjksMHgwZSwweDI2LDB4MDYsMHg2NiwweDMxLDB4ZjYsMHhjMSwweGU5LDB4MDIsMHgxZSwweDA2LDB4OGUsMHgwNiwweDE2LDB4MDYsCi0weDhlLDB4MWUsMHgxZSwweDA2LDB4NjcsMHhmMywweDY2LDB4YTUsMHgwNywweDFmLDB4NjYsMHgwMywweDBlLDB4MjYsMHgwNiwweDc1LAotMHhhZiwweGMzLDB4M2MsMHgzYSwweDc0LDB4MDYsMHgzYywweDJmLDB4NzQsMHgwMiwweDNjLDB4NWMsMHhjMywweGJlLDB4NjQsMHgwNywKLTB4ODksMHhmMywweDI2LDB4OGEsMHgwNSwweDQ3LDB4ODgsMHgwNCwweDM4LDB4ZTAsMHg3NCwweDBlLDB4MDgsMHhjMCwweDc0LDB4MGEsCi0weDQ2LDB4ZTgsMHhkZSwweGZmLDB4NzUsMHhlYywweDg5LDB4ZjMsMHg3NCwweGU4LDB4YzMsMHhiYSwweDI2LDB4MDUsMHhlYiwweDA4LAotMHhiYSwweDM0LDB4MDUsMHhlYiwweDAzLDB4YmEsMHgzZSwweDA1LDB4NTIsMHg4YiwweDFlLDB4NjIsMHgwNywweGM2LDB4MDcsMHgyNCwKLTB4YmIsMHg2NCwweDA3LDB4ZWIsMHgxZSwweGU4LDB4ZWQsMHgwMCwweGJhLDB4NzgsMHgwNSwweGViLDB4MTIsMHhiYSwweDkxLDB4MDUsCi0weGViLDB4MGQsMHhiYSwweGEzLDB4MDUsMHhlYiwweDA4LDB4YmEsMHhiNSwweDA1LDB4ZWIsMHgwMywweGJhLDB4NzgsMHgwNSwweDUyLAotMHhiYiwweDE5LDB4MDUsMHhlOCwweDE0LDB4MDAsMHg1YiwweGU4LDB4MTAsMHgwMCwweGJiLDB4NDIsMHgwNCwweGU4LDB4MGEsMHgwMCwKLTB4YjgsMHhmZiwweDRjLDB4Y2QsMHgyMSwweDQzLDB4YjQsMHgwMiwweGNkLDB4MjEsMHg4YSwweDE3LDB4ODAsMHhmYSwweDI0LDB4NzUsCi0weGY0LDB4YzMsMHgwZCwweDBhLDB4MjQsMHg1MCwweDUxLDB4NTcsMHgzMSwweGMwLDB4YmYsMHgyYSwweDA2LDB4YjksMHgxOSwweDAwLAotMHhmMywweGFiLDB4NWYsMHg1OSwweDU4LDB4YzMsMHhiOCwweDAwLDB4MDMsMHhiYiwweDIxLDB4MDAsMHgzMSwweGM5LDB4NjYsMHhiZiwKLTB4MmEsMHgwNiwweDAwLDB4MDAsMHhjZCwweDMxLDB4YzMsMHgwMCwweDAwLDB4MzAsMHhlNCwweGU4LDB4NWYsMHhmZiwweDg5LDB4ZGUsCi0weDhiLDB4M2UsMHg2NywweDA0LDB4ZWIsMHgxOCwweGI0LDB4M2IsMHhlOCwweDUyLDB4ZmYsMHg4MSwweGZlLDB4NjQsMHgwNywweDc0LAotMHgxMywweDhhLDB4ODQsMHhmZiwweGZmLDB4ZTgsMHgzYSwweGZmLDB4NzQsMHgwNCwweGM2LDB4MDQsMHg1YywweDQ2LDB4ZTgsMHgwMywKLTB4MDAsMHg3MiwweGUzLDB4YzMsMHhlOCwweDM2LDB4MDAsMHhiYiwweDQ0LDB4MDAsMHg4YSwweDA3LDB4ODgsMHgwNCwweDQzLDB4NDYsCi0weDA4LDB4YzAsMHg3NSwweGY2LDB4MDYsMHg1NywweDFlLDB4MDcsMHhlOCwweDlhLDB4ZmYsMHhiYiwweDJhLDB4MDYsMHg4YywweDlmLAotMHgwNCwweDAwLDB4ODksMHg5ZiwweDAyLDB4MDAsMHhiYSwweDY0LDB4MDcsMHhiOCwweDAwLDB4NGIsMHhjZCwweDIxLDB4NWYsMHgwNywKLTB4NzIsMHgwOSwweGI0LDB4NGQsMHhjZCwweDIxLDB4MmQsMHgwMCwweDAzLDB4ZjcsMHhkOCwweGViLDB4MjgsMHg4MCwweDNlLDB4NjksCi0weDA4LDB4MDUsMHg3MiwweDIwLDB4YjgsMHgwMCwweDU4LDB4Y2QsMHgyMSwweGEyLDB4NjcsMHgwOCwweGI4LDB4MDIsMHg1OCwweGNkLAotMHgyMSwweGEyLDB4NjgsMHgwOCwweGI4LDB4MDEsMHg1OCwweGJiLDB4ODAsMHgwMCwweGNkLDB4MjEsMHhiOCwweDAzLDB4NTgsMHhiYiwKLTB4MDEsMHgwMCwweGNkLDB4MjEsMHhjMywweDljLDB4ODAsMHgzZSwweDY5LDB4MDgsMHgwNSwweDcyLDB4MWEsMHg1MCwweDUzLDB4YjgsCi0weDAzLDB4NTgsMHg4YSwweDFlLDB4NjgsMHgwOCwweDMwLDB4ZmYsMHhjZCwweDIxLDB4YjgsMHgwMSwweDU4LDB4OGEsMHgxZSwweDY3LAotMHgwOCwweDMwLDB4ZmYsMHhjZCwweDIxLDB4NWIsMHg1OCwweDlkLDB4YzMsMHg0YywweDZmLDB4NjEsMHg2NCwweDIwLDB4NjUsMHg3MiwKLTB4NzIsMHg2ZiwweDcyLDB4M2EsMHgyMCwweDI0LDB4M2EsMHgyMCwweDYzLDB4NjEsMHg2ZSwweDZlLDB4NmYsMHg3NCwweDIwLDB4NmYsCi0weDcwLDB4NjUsMHg2ZSwweDI0LDB4M2EsMHgyMCwweDZlLDB4NmYsMHg3NCwweDIwLDB4NDUsMHg1OCwweDQ1LDB4MjQsMHgzYSwweDIwLAotMHg2ZSwweDZmLDB4NzQsMHgyMCwweDQzLDB4NGYsMHg0NiwweDQ2LDB4MjAsMHgyOCwweDQzLDB4NjgsMHg2NSwweDYzLDB4NmIsMHgyMCwKLTB4NjYsMHg2ZiwweDcyLDB4MjAsMHg3NiwweDY5LDB4NzIsMHg3NSwweDczLDB4NjUsMHg3MywweDI5LDB4MjQsMHg2ZSwweDZmLDB4MjAsCi0weDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHgyZCwweDIwLDB4NDcsMHg2NSwweDc0LDB4MjAsMHg2MywweDczLDB4NjQsMHg3MCwweDZkLAotMHg2OSwweDJhLDB4NjIsMHgyZSwweDdhLDB4NjksMHg3MCwweDI0LDB4NmUsMHg2ZiwweDIwLDB4NDQsMHg0ZiwweDUzLDB4MjAsMHg2ZCwKLTB4NjUsMHg2ZCwweDZmLDB4NzIsMHg3OSwweDI0LDB4NmUsMHg2NSwweDY1LDB4NjQsMHgyMCwweDQ0LDB4NGYsMHg1MywweDIwLDB4MzMsCi0weDI0LDB4NjMsMHg2MSwweDZlLDB4MjcsMHg3NCwweDIwLDB4NzMsMHg3NywweDY5LDB4NzQsMHg2MywweDY4LDB4MjAsMHg2ZCwweDZmLAotMHg2NCwweDY1LDB4MjQsMHg2ZSwweDZmLDB4MjAsMHg0NCwweDUwLDB4NGQsMHg0OSwweDIwLDB4NzMsMHg2NSwweDZjLDB4NjUsMHg2MywKLTB4NzQsMHg2ZiwweDcyLDB4NzMsMHgyNCwweDZlLDB4NmYsMHgyMCwweDQ0LDB4NTAsMHg0ZCwweDQ5LDB4MjAsMHg2ZCwweDY1LDB4NmQsCi0weDZmLDB4NzIsMHg3OSwweDI0LDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLAotMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwKLTB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCi0weDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9iZmQvaGFzaC5jIGIvYmZkL2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3MzA0MC4uMDAwMDAwMAotLS0gYS9iZmQvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM0ICswLDAgQEAKLS8qIGhhc2guYyAtLSBoYXNoIHRhYmxlIHJvdXRpbmVzIGZvciBCRkQKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0KLS8qCi1TRUNUSU9OCi0JSGFzaCBUYWJsZXMKLQotQGNpbmRleCBIYXNoIHRhYmxlcwotCUJGRCBwcm92aWRlcyBhIHNpbXBsZSBzZXQgb2YgaGFzaCB0YWJsZSBmdW5jdGlvbnMuICBSb3V0aW5lcwotCWFyZSBwcm92aWRlZCB0byBpbml0aWFsaXplIGEgaGFzaCB0YWJsZSwgdG8gZnJlZSBhIGhhc2ggdGFibGUsCi0JdG8gbG9vayB1cCBhIHN0cmluZyBpbiBhIGhhc2ggdGFibGUgYW5kIG9wdGlvbmFsbHkgY3JlYXRlIGFuCi0JZW50cnkgZm9yIGl0LCBhbmQgdG8gdHJhdmVyc2UgYSBoYXNoIHRhYmxlLiAgVGhlcmUgaXMKLQljdXJyZW50bHkgbm8gcm91dGluZSB0byBkZWxldGUgYW4gc3RyaW5nIGZyb20gYSBoYXNoIHRhYmxlLgotCi0JVGhlIGJhc2ljIGhhc2ggdGFibGUgZG9lcyBub3QgcGVybWl0IGFueSBkYXRhIHRvIGJlIHN0b3JlZAotCXdpdGggYSBzdHJpbmcuICBIb3dldmVyLCBhIGhhc2ggdGFibGUgaXMgZGVzaWduZWQgdG8gcHJlc2VudCBhCi0JYmFzZSBjbGFzcyBmcm9tIHdoaWNoIG90aGVyIHR5cGVzIG9mIGhhc2ggdGFibGVzIG1heSBiZQotCWRlcml2ZWQuICBUaGVzZSBkZXJpdmVkIHR5cGVzIG1heSBzdG9yZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0Jd2l0aCB0aGUgc3RyaW5nLiAgSGFzaCB0YWJsZXMgd2VyZSBpbXBsZW1lbnRlZCBpbiB0aGlzIHdheSwKLQlyYXRoZXIgdGhhbiBzaW1wbHkgcHJvdmlkaW5nIGEgZGF0YSBwb2ludGVyIGluIGEgaGFzaCB0YWJsZQotCWVudHJ5LCBiZWNhdXNlIHRoZXkgd2VyZSBkZXNpZ25lZCBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIgYmFjawotCWVuZHMuICBUaGUgbGlua2VyIG1heSBjcmVhdGUgdGhvdXNhbmRzIG9mIGhhc2ggdGFibGUgZW50cmllcywKLQlhbmQgdGhlIG92ZXJoZWFkIG9mIGFsbG9jYXRpbmcgcHJpdmF0ZSBkYXRhIGFuZCBzdG9yaW5nIGFuZAotCWZvbGxvd2luZyBwb2ludGVycyBiZWNvbWVzIG5vdGljZWFibGUuCi0KLQlUaGUgYmFzaWMgaGFzaCB0YWJsZSBjb2RlIGlzIGluIDw8aGFzaC5jPj4uCi0KLUBtZW51Ci1AKiBDcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGU6OgotQCogTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZzo6Ci1AKiBUcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZTo6Ci1AKiBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGU6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1DcmVhdGluZyBhbmQgRnJlZWluZyBhIEhhc2ggVGFibGUsIExvb2tpbmcgVXAgb3IgRW50ZXJpbmcgYSBTdHJpbmcsIEhhc2ggVGFibGVzLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCUNyZWF0aW5nIGFuZCBmcmVlaW5nIGEgaGFzaCB0YWJsZQotCi1AZmluZGV4IGJmZF9oYXNoX3RhYmxlX2luaXQKLUBmaW5kZXggYmZkX2hhc2hfdGFibGVfaW5pdF9uCi0JVG8gY3JlYXRlIGEgaGFzaCB0YWJsZSwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGEgPDxzdHJ1Y3QKLQliZmRfaGFzaF90YWJsZT4+IChkZWZpbmVkIGluIDw8YmZkLmg+PikgYW5kIGNhbGwKLQk8PGJmZF9oYXNoX3RhYmxlX2luaXQ+PiAoaWYgeW91IGtub3cgYXBwcm94aW1hdGVseSBob3cgbWFueQotCWVudHJpZXMgeW91IHdpbGwgbmVlZCwgdGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfdGFibGVfaW5pdF9uPj4sCi0Jd2hpY2ggdGFrZXMgYSBAdmFye3NpemV9IGFyZ3VtZW50LCBtYXkgYmUgdXNlZCkuCi0JPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gcmV0dXJucyA8PGZhbHNlPj4gaWYgc29tZSBzb3J0IG9mCi0JZXJyb3Igb2NjdXJzLgotCi1AZmluZGV4IGJmZF9oYXNoX25ld2Z1bmMKLQlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90YWJsZV9pbml0Pj4gdGFrZSBhcyBhbiBhcmd1bWVudCBhCi0JZnVuY3Rpb24gdG8gdXNlIHRvIGNyZWF0ZSBuZXcgZW50cmllcy4gIEZvciBhIGJhc2ljIGhhc2gKLQl0YWJsZSwgdXNlIHRoZSBmdW5jdGlvbiA8PGJmZF9oYXNoX25ld2Z1bmM+Pi4gIEB4cmVme0Rlcml2aW5nCi0JYSBOZXcgSGFzaCBUYWJsZSBUeXBlfSwgZm9yIHdoeSB5b3Ugd291bGQgd2FudCB0byB1c2UgYQotCWRpZmZlcmVudCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudC4KLQotQGZpbmRleCBiZmRfaGFzaF9hbGxvY2F0ZQotCTw8YmZkX2hhc2hfdGFibGVfaW5pdD4+IHdpbGwgY3JlYXRlIGFuIG9iamFsbG9jIHdoaWNoIHdpbGwgYmUKLQl1c2VkIHRvIGFsbG9jYXRlIG5ldyBlbnRyaWVzLiAgWW91IG1heSBhbGxvY2F0ZSBtZW1vcnkgb24gdGhpcwotCW9iamFsbG9jIHVzaW5nIDw8YmZkX2hhc2hfYWxsb2NhdGU+Pi4KLQotQGZpbmRleCBiZmRfaGFzaF90YWJsZV9mcmVlCi0JVXNlIDw8YmZkX2hhc2hfdGFibGVfZnJlZT4+IHRvIGZyZWUgdXAgYWxsIHRoZSBtZW1vcnkgdGhhdCBoYXMKLQliZWVuIGFsbG9jYXRlZCBmb3IgYSBoYXNoIHRhYmxlLiAgVGhpcyB3aWxsIG5vdCBmcmVlIHVwIHRoZQotCTw8c3RydWN0IGJmZF9oYXNoX3RhYmxlPj4gaXRzZWxmLCB3aGljaCB5b3UgbXVzdCBwcm92aWRlLgotCi1JTk9ERQotTG9va2luZyBVcCBvciBFbnRlcmluZyBhIFN0cmluZywgVHJhdmVyc2luZyBhIEhhc2ggVGFibGUsIENyZWF0aW5nIGFuZCBGcmVlaW5nIGEgSGFzaCBUYWJsZSwgSGFzaCBUYWJsZXMKLVNVQlNFQ1RJT04KLQlMb29raW5nIHVwIG9yIGVudGVyaW5nIGEgc3RyaW5nCi0KLUBmaW5kZXggYmZkX2hhc2hfbG9va3VwCi0JVGhlIGZ1bmN0aW9uIDw8YmZkX2hhc2hfbG9va3VwPj4gaXMgdXNlZCBib3RoIHRvIGxvb2sgdXAgYQotCXN0cmluZyBpbiB0aGUgaGFzaCB0YWJsZSBhbmQgdG8gY3JlYXRlIGEgbmV3IGVudHJ5LgotCi0JSWYgdGhlIEB2YXJ7Y3JlYXRlfSBhcmd1bWVudCBpcyA8PGZhbHNlPj4sIDw8YmZkX2hhc2hfbG9va3VwPj4KLQl3aWxsIGxvb2sgdXAgYSBzdHJpbmcuICBJZiB0aGUgc3RyaW5nIGlzIGZvdW5kLCBpdCB3aWxsCi0JcmV0dXJucyBhIHBvaW50ZXIgdG8gYSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeT4+LiAgSWYgdGhlCi0Jc3RyaW5nIGlzIG5vdCBmb3VuZCBpbiB0aGUgdGFibGUgPDxiZmRfaGFzaF9sb29rdXA+PiB3aWxsCi0JcmV0dXJuIDw8TlVMTD4+LiAgWW91IHNob3VsZCBub3QgbW9kaWZ5IGFueSBvZiB0aGUgZmllbGRzIGluCi0JdGhlIHJldHVybnMgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Pi4KLQotCUlmIHRoZSBAdmFye2NyZWF0ZX0gYXJndW1lbnQgaXMgPDx0cnVlPj4sIHRoZSBzdHJpbmcgd2lsbCBiZQotCWVudGVyZWQgaW50byB0aGUgaGFzaCB0YWJsZSBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4KLQlFaXRoZXIgd2F5IGEgcG9pbnRlciB0byBhIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4gd2lsbCBiZQotCXJldHVybmVkLCBlaXRoZXIgdG8gdGhlIGV4aXN0aW5nIHN0cnVjdHVyZSBvciB0byBhIG5ld2x5Ci0JY3JlYXRlZCBvbmUuICBJbiB0aGlzIGNhc2UsIGEgPDxOVUxMPj4gcmV0dXJuIG1lYW5zIHRoYXQgYW4KLQllcnJvciBvY2N1cnJlZC4KLQotCUlmIHRoZSBAdmFye2NyZWF0ZX0gYXJndW1lbnQgaXMgPDx0cnVlPj4sIGFuZCBhIG5ldyBlbnRyeSBpcwotCWNyZWF0ZWQsIHRoZSBAdmFye2NvcHl9IGFyZ3VtZW50IGlzIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8KLQljb3B5IHRoZSBzdHJpbmcgb250byB0aGUgaGFzaCB0YWJsZSBvYmphbGxvYyBvciBub3QuICBJZgotCUB2YXJ7Y29weX0gaXMgcGFzc2VkIGFzIDw8ZmFsc2U+PiwgeW91IG11c3QgYmUgY2FyZWZ1bCBub3QgdG8KLQlkZWFsbG9jYXRlIG9yIG1vZGlmeSB0aGUgc3RyaW5nIGFzIGxvbmcgYXMgdGhlIGhhc2ggdGFibGUKLQlleGlzdHMuCi0KLUlOT0RFCi1UcmF2ZXJzaW5nIGEgSGFzaCBUYWJsZSwgRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlLCBMb29raW5nIFVwIG9yIEVudGVyaW5nIGEgU3RyaW5nLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCVRyYXZlcnNpbmcgYSBoYXNoIHRhYmxlCi0KLUBmaW5kZXggYmZkX2hhc2hfdHJhdmVyc2UKLQlUaGUgZnVuY3Rpb24gPDxiZmRfaGFzaF90cmF2ZXJzZT4+IG1heSBiZSB1c2VkIHRvIHRyYXZlcnNlIGEKLQloYXNoIHRhYmxlLCBjYWxsaW5nIGEgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LiAgVGhlIHRyYXZlcnNhbAotCWlzIGRvbmUgaW4gYSByYW5kb20gb3JkZXIuCi0KLQk8PGJmZF9oYXNoX3RyYXZlcnNlPj4gdGFrZXMgYXMgYXJndW1lbnRzIGEgZnVuY3Rpb24gYW5kIGEKLQlnZW5lcmljIDw8dm9pZCAqPj4gcG9pbnRlci4gIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBhCi0JaGFzaCB0YWJsZSBlbnRyeSAoYSA8PHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqPj4pIGFuZCB0aGUKLQlnZW5lcmljIHBvaW50ZXIgcGFzc2VkIHRvIDw8YmZkX2hhc2hfdHJhdmVyc2U+Pi4gIFRoZSBmdW5jdGlvbgotCW11c3QgcmV0dXJuIGEgPDxib29sZWFuPj4gdmFsdWUsIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRvCi0JY29udGludWUgdHJhdmVyc2luZyB0aGUgaGFzaCB0YWJsZS4gIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zCi0JPDxmYWxzZT4+LCA8PGJmZF9oYXNoX3RyYXZlcnNlPj4gd2lsbCBzdG9wIHRoZSB0cmF2ZXJzYWwgYW5kCi0JcmV0dXJuIGltbWVkaWF0ZWx5LgotCi1JTk9ERQotRGVyaXZpbmcgYSBOZXcgSGFzaCBUYWJsZSBUeXBlLCAsIFRyYXZlcnNpbmcgYSBIYXNoIFRhYmxlLCBIYXNoIFRhYmxlcwotU1VCU0VDVElPTgotCURlcml2aW5nIGEgbmV3IGhhc2ggdGFibGUgdHlwZQotCi0JTWFueSB1c2VzIG9mIGhhc2ggdGFibGVzIHdhbnQgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotCXdoaWNoIGVhY2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUuICBTb21lIGFsc28gZmluZCBpdAotCWNvbnZlbmllbnQgdG8gc3RvcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3aXRoIHRoZSBoYXNoIHRhYmxlCi0JaXRzZWxmLiAgVGhpcyBtYXkgYmUgZG9uZSB1c2luZyBhIGRlcml2ZWQgaGFzaCB0YWJsZS4KLQotCVNpbmNlIEMgaXMgbm90IGFuIG9iamVjdCBvcmllbnRlZCBsYW5ndWFnZSwgY3JlYXRpbmcgYSBkZXJpdmVkCi0JaGFzaCB0YWJsZSByZXF1aXJlcyBzdGlja2luZyB0b2dldGhlciBzb21lIGJvaWxlcnBsYXRlCi0Jcm91dGluZXMgd2l0aCBhIGZldyBkaWZmZXJlbmNlcyBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBoYXNoCi0JdGFibGUgeW91IHdhbnQgdG8gY3JlYXRlLgotCi0JQW4gZXhhbXBsZSBvZiBhIGRlcml2ZWQgaGFzaCB0YWJsZSBpcyB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0JVGhlIHN0cnVjdHVyZXMgZm9yIHRoaXMgYXJlIGRlZmluZWQgaW4gPDxiZmRsaW5rLmg+Pi4gIFRoZQotCWZ1bmN0aW9ucyBhcmUgaW4gPDxsaW5rZXIuYz4+LgotCi0JWW91IG1heSBhbHNvIGRlcml2ZSBhIGhhc2ggdGFibGUgZnJvbSBhbiBhbHJlYWR5IGRlcml2ZWQgaGFzaAotCXRhYmxlLiAgRm9yIGV4YW1wbGUsIHRoZSBhLm91dCBsaW5rZXIgYmFja2VuZCBjb2RlIHVzZXMgYSBoYXNoCi0JdGFibGUgZGVyaXZlZCBmcm9tIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLQotQG1lbnUKLUAqIERlZmluZSB0aGUgRGVyaXZlZCBTdHJ1Y3R1cmVzOjoKLUAqIFdyaXRlIHRoZSBEZXJpdmVkIENyZWF0aW9uIFJvdXRpbmU6OgotQCogV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lczo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLURlZmluZSB0aGUgRGVyaXZlZCBTdHJ1Y3R1cmVzLCBXcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZQotU1VCU1VCU0VDVElPTgotCURlZmluZSB0aGUgZGVyaXZlZCBzdHJ1Y3R1cmVzCi0KLQlZb3UgbXVzdCBkZWZpbmUgYSBzdHJ1Y3R1cmUgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLAotCWFuZCBhIHN0cnVjdHVyZSBmb3IgdGhlIGhhc2ggdGFibGUgaXRzZWxmLgotCi0JVGhlIGZpcnN0IGZpZWxkIGluIHRoZSBzdHJ1Y3R1cmUgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoCi0JdGFibGUgbXVzdCBiZSBvZiB0aGUgdHlwZSB1c2VkIGZvciBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZQotCXlvdSBhcmUgZGVyaXZpbmcgZnJvbS4gIElmIHlvdSBhcmUgZGVyaXZpbmcgZnJvbSBhIGJhc2ljIGhhc2gKLQl0YWJsZSB0aGlzIGlzIDw8c3RydWN0IGJmZF9oYXNoX2VudHJ5Pj4sIHdoaWNoIGlzIGRlZmluZWQgaW4KLQk8PGJmZC5oPj4uICBUaGUgZmlyc3QgZmllbGQgaW4gdGhlIHN0cnVjdHVyZSBmb3IgdGhlIGhhc2gKLQl0YWJsZSBpdHNlbGYgbXVzdCBiZSBvZiB0aGUgdHlwZSBvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlCi0JZGVyaXZpbmcgZnJvbSBpdHNlbGYuICBJZiB5b3UgYXJlIGRlcml2aW5nIGZyb20gYSBiYXNpYyBoYXNoCi0JdGFibGUsIHRoaXMgaXMgPDxzdHJ1Y3QgYmZkX2hhc2hfdGFibGU+Pi4KLQotCUZvciBleGFtcGxlLCB0aGUgbGlua2VyIGhhc2ggdGFibGUgZGVmaW5lcyA8PHN0cnVjdAotCWJmZF9saW5rX2hhc2hfZW50cnk+PiAoaW4gPDxiZmRsaW5rLmg+PikuICBUaGUgZmlyc3QgZmllbGQsCi0JPDxyb290Pj4sIGlzIG9mIHR5cGUgPDxzdHJ1Y3QgYmZkX2hhc2hfZW50cnk+Pi4gIFNpbWlsYXJseSwKLQl0aGUgZmlyc3QgZmllbGQgaW4gPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LCA8PHRhYmxlPj4sCi0JaXMgb2YgdHlwZSA8PHN0cnVjdCBiZmRfaGFzaF90YWJsZT4+LgotCi1JTk9ERQotV3JpdGUgdGhlIERlcml2ZWQgQ3JlYXRpb24gUm91dGluZSwgV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lcywgRGVmaW5lIHRoZSBEZXJpdmVkIFN0cnVjdHVyZXMsIERlcml2aW5nIGEgTmV3IEhhc2ggVGFibGUgVHlwZQotU1VCU1VCU0VDVElPTgotCVdyaXRlIHRoZSBkZXJpdmVkIGNyZWF0aW9uIHJvdXRpbmUKLQotCVlvdSBtdXN0IHdyaXRlIGEgcm91dGluZSB3aGljaCB3aWxsIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhbgotCWVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgVGhpcyByb3V0aW5lIGlzIHBhc3NlZCBhcyB0aGUKLQlmdW5jdGlvbiBhcmd1bWVudCB0byA8PGJmZF9oYXNoX3RhYmxlX2luaXQ+Pi4KLQotCUluIG9yZGVyIHRvIHBlcm1pdCBvdGhlciBoYXNoIHRhYmxlcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlCi0JaGFzaCB0YWJsZSB5b3UgYXJlIGNyZWF0aW5nLCB0aGlzIHJvdXRpbmUgbXVzdCBiZSB3cml0dGVuIGluIGEKLQlzdGFuZGFyZCB3YXkuCi0KLQlUaGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGNyZWF0aW9uIHJvdXRpbmUgaXMgYSBwb2ludGVyIHRvIGEKLQloYXNoIHRhYmxlIGVudHJ5LiAgVGhpcyBtYXkgYmUgPDxOVUxMPj4sIGluIHdoaWNoIGNhc2UgdGhlCi0Jcm91dGluZSBzaG91bGQgYWxsb2NhdGUgdGhlIHJpZ2h0IGFtb3VudCBvZiBzcGFjZS4gIE90aGVyd2lzZQotCXRoZSBzcGFjZSBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhIGhhc2ggdGFibGUgdHlwZQotCWRlcml2ZWQgZnJvbSB0aGlzIG9uZS4KLQotCUFmdGVyIGFsbG9jYXRpbmcgc3BhY2UsIHRoZSBjcmVhdGlvbiByb3V0aW5lIG11c3QgY2FsbCB0aGUKLQljcmVhdGlvbiByb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHR5cGUgaXQgaXMgZGVyaXZlZCBmcm9tLAotCXBhc3NpbmcgaW4gYSBwb2ludGVyIHRvIHRoZSBzcGFjZSBpdCBqdXN0IGFsbG9jYXRlZC4gIFRoaXMKLQl3aWxsIGluaXRpYWxpemUgYW55IGZpZWxkcyB1c2VkIGJ5IHRoZSBiYXNlIGhhc2ggdGFibGUuCi0KLQlGaW5hbGx5IHRoZSBjcmVhdGlvbiByb3V0aW5lIG11c3QgaW5pdGlhbGl6ZSBhbnkgbG9jYWwgZmllbGRzCi0JZm9yIHRoZSBuZXcgaGFzaCB0YWJsZSB0eXBlLgotCi0JSGVyZSBpcyBhIGJvaWxlcnBsYXRlIGV4YW1wbGUgb2YgYSBjcmVhdGlvbiByb3V0aW5lLgotCUB2YXJ7ZnVuY3Rpb25fbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIHJvdXRpbmUuCi0JQHZhcntlbnRyeV90eXBlfSBpcyB0aGUgdHlwZSBvZiBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSB5b3UKLQlhcmUgY3JlYXRpbmcuICBAdmFye2Jhc2VfbmV3ZnVuY30gaXMgdGhlIG5hbWUgb2YgdGhlIGNyZWF0aW9uCi0Jcm91dGluZSBvZiB0aGUgaGFzaCB0YWJsZSB0eXBlIHlvdXIgaGFzaCB0YWJsZSBpcyBkZXJpdmVkCi0JZnJvbS4KLQotRVhBTVBMRQotCi0uc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLS5AdmFye2Z1bmN0aW9uX25hbWV9IChlbnRyeSwgdGFibGUsIHN0cmluZykKLS4gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0uICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotLiAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotLnsKLS4gIHN0cnVjdCBAdmFye2VudHJ5X3R5cGV9ICpyZXQgPSAoQHZhcntlbnRyeV90eXBlfSAqKSBlbnRyeTsKLS4KLS4geyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotLiAgICBkZXJpdmVkIGNsYXNzLiAgKn0KLS4gIGlmIChyZXQgPT0gKEB2YXJ7ZW50cnlfdHlwZX0gKikgTlVMTCkKLS4gICAgewotLiAgICAgIHJldCA9ICgoQHZhcntlbnRyeV90eXBlfSAqKQotLgkgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoQHZhcntlbnRyeV90eXBlfSkpKTsKLS4gICAgICBpZiAocmV0ID09IChAdmFye2VudHJ5X3R5cGV9ICopIE5VTEwpCi0uICAgICAgICByZXR1cm4gTlVMTDsKLS4gICAgfQotLgotLiB7KiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgYmFzZSBjbGFzcy4gICp9Ci0uICByZXQgPSAoKEB2YXJ7ZW50cnlfdHlwZX0gKikKLS4JIEB2YXJ7YmFzZV9uZXdmdW5jfSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLS4KLS4geyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzIGhlcmUuICAqfQotLgotLiAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotLn0KLQotREVTQ1JJUFRJT04KLQlUaGUgY3JlYXRpb24gcm91dGluZSBmb3IgdGhlIGxpbmtlciBoYXNoIHRhYmxlLCB3aGljaCBpcyBpbgotCTw8bGlua2VyLmM+PiwgbG9va3MganVzdCBsaWtlIHRoaXMgZXhhbXBsZS4KLQlAdmFye2Z1bmN0aW9uX25hbWV9IGlzIDw8X2JmZF9saW5rX2hhc2hfbmV3ZnVuYz4+LgotCUB2YXJ7ZW50cnlfdHlwZX0gaXMgPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeT4+LgotCUB2YXJ7YmFzZV9uZXdmdW5jfSBpcyA8PGJmZF9oYXNoX25ld2Z1bmM+PiwgdGhlIGNyZWF0aW9uCi0Jcm91dGluZSBmb3IgYSBiYXNpYyBoYXNoIHRhYmxlLgotCi0JPDxfYmZkX2xpbmtfaGFzaF9uZXdmdW5jPj4gYWxzbyBpbml0aWFsaXplcyB0aGUgbG9jYWwgZmllbGRzCi0JaW4gYSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyeTogPDx0eXBlPj4sIDw8d3JpdHRlbj4+IGFuZAotCTw8bmV4dD4+LgotCi1JTk9ERQotV3JpdGUgT3RoZXIgRGVyaXZlZCBSb3V0aW5lcywgLCBXcml0ZSB0aGUgRGVyaXZlZCBDcmVhdGlvbiBSb3V0aW5lLCBEZXJpdmluZyBhIE5ldyBIYXNoIFRhYmxlIFR5cGUKLVNVQlNVQlNFQ1RJT04KLQlXcml0ZSBvdGhlciBkZXJpdmVkIHJvdXRpbmVzCi0KLQlZb3Ugd2lsbCB3YW50IHRvIHdyaXRlIG90aGVyIHJvdXRpbmVzIGZvciB5b3VyIG5ldyBoYXNoIHRhYmxlLAotCWFzIHdlbGwuICAKLQotCVlvdSB3aWxsIHdhbnQgYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZSB3aGljaCBjYWxscyB0aGUKLQlpbml0aWFsaXphdGlvbiByb3V0aW5lIG9mIHRoZSBoYXNoIHRhYmxlIHlvdSBhcmUgZGVyaXZpbmcgZnJvbQotCWFuZCBpbml0aWFsaXplcyBhbnkgb3RoZXIgbG9jYWwgZmllbGRzLiAgRm9yIHRoZSBsaW5rZXIgaGFzaAotCXRhYmxlLCB0aGlzIGlzIDw8X2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdD4+IGluIDw8bGlua2VyLmM+Pi4KLQotCVlvdSB3aWxsIHdhbnQgYSBsb29rdXAgcm91dGluZSB3aGljaCBjYWxscyB0aGUgbG9va3VwIHJvdXRpbmUKLQlvZiB0aGUgaGFzaCB0YWJsZSB5b3UgYXJlIGRlcml2aW5nIGZyb20gYW5kIGNhc3RzIHRoZSByZXN1bHQuCi0JVGhlIGxpbmtlciBoYXNoIHRhYmxlIHVzZXMgPDxiZmRfbGlua19oYXNoX2xvb2t1cD4+IGluCi0JPDxsaW5rZXIuYz4+ICh0aGlzIGFjdHVhbGx5IHRha2VzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hpY2gKLQlpdCB1c2VzIHRvIGRlY2lkZSBob3cgdG8gcmV0dXJuIHRoZSBsb29rZWQgdXAgdmFsdWUpLgotCi0JWW91IG1heSB3YW50IGEgdHJhdmVyc2FsIHJvdXRpbmUuICBUaGlzIHNob3VsZCBqdXN0IGNhbGwgdGhlCi0JdHJhdmVyc2FsIHJvdXRpbmUgb2YgdGhlIGhhc2ggdGFibGUgeW91IGFyZSBkZXJpdmluZyBmcm9tIHdpdGgKLQlhcHByb3ByaWF0ZSBjYXN0cy4gIFRoZSBsaW5rZXIgaGFzaCB0YWJsZSB1c2VzCi0JPDxiZmRfbGlua19oYXNoX3RyYXZlcnNlPj4gaW4gPDxsaW5rZXIuYz4+LgotCi0JVGhlc2Ugcm91dGluZXMgbWF5IHNpbXBseSBiZSBkZWZpbmVkIGFzIG1hY3Jvcy4gIEZvciBleGFtcGxlLAotCXRoZSBhLm91dCBiYWNrZW5kIGxpbmtlciBoYXNoIHRhYmxlLCB3aGljaCBpcyBkZXJpdmVkIGZyb20gdGhlCi0JbGlua2VyIGhhc2ggdGFibGUsIHVzZXMgbWFjcm9zIGZvciB0aGUgbG9va3VwIGFuZCB0cmF2ZXJzYWwKLQlyb3V0aW5lcy4gIFRoZXNlIGFyZSA8PGFvdXRfbGlua19oYXNoX2xvb2t1cD4+IGFuZAotCTw8YW91dF9saW5rX2hhc2hfdHJhdmVyc2U+PiBpbiBhb3V0eC5oLgotKi8KLQotLyogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGVudHJpZXMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSBoYXNoIHRhYmxlLiAgKi8KLSNkZWZpbmUgREVGQVVMVF9TSVpFICg0MDUxKQotCi0vKiBDcmVhdGUgYSBuZXcgaGFzaCB0YWJsZSwgZ2l2ZW4gYSBudW1iZXIgb2YgZW50cmllcy4gICovCi0KLWJvb2xlYW4KLWJmZF9oYXNoX3RhYmxlX2luaXRfbiAodGFibGUsIG5ld2Z1bmMsIHNpemUpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgYWxsb2MgPSBzaXplICogc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKik7Ci0KLSAgdGFibGUtPm1lbW9yeSA9IChQVFIpIG9iamFsbG9jX2NyZWF0ZSAoKTsKLSAgaWYgKHRhYmxlLT5tZW1vcnkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHRhYmxlLT50YWJsZSA9ICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoqKQotCQkgIG9iamFsbG9jX2FsbG9jICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnksIGFsbG9jKSk7Ci0gIGlmICh0YWJsZS0+dGFibGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbXNldCAoKFBUUikgdGFibGUtPnRhYmxlLCAwLCBhbGxvYyk7Ci0gIHRhYmxlLT5zaXplID0gc2l6ZTsKLSAgdGFibGUtPm5ld2Z1bmMgPSBuZXdmdW5jOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ3JlYXRlIGEgbmV3IGhhc2ggdGFibGUgd2l0aCB0aGUgZGVmYXVsdCBudW1iZXIgb2YgZW50cmllcy4gICovCi0KLWJvb2xlYW4KLWJmZF9oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqbmV3ZnVuYykgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCQlzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkJCWNvbnN0IGNoYXIgKikpOwotewotICByZXR1cm4gYmZkX2hhc2hfdGFibGVfaW5pdF9uICh0YWJsZSwgbmV3ZnVuYywgREVGQVVMVF9TSVpFKTsKLX0KLQotLyogRnJlZSBhIGhhc2ggdGFibGUuICAqLwotCi12b2lkCi1iZmRfaGFzaF90YWJsZV9mcmVlICh0YWJsZSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLXsKLSAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSB0YWJsZS0+bWVtb3J5KTsKLSAgdGFibGUtPm1lbW9yeSA9IE5VTEw7Ci19Ci0KLS8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWJmZF9oYXNoX2xvb2t1cCAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY3JlYXRlOwotICAgICBib29sZWFuIGNvcHk7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaGFzaHA7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgCi0gIGhhc2ggPSAwOwotICBsZW4gPSAwOwotICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyaW5nOwotICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggKz0gYyArIChjIDw8IDE3KTsKLSAgICAgIGhhc2ggXj0gaGFzaCA+PiAyOwotICAgICAgKytsZW47Ci0gICAgfQotICBoYXNoICs9IGxlbiArIChsZW4gPDwgMTcpOwotICBoYXNoIF49IGhhc2ggPj4gMjsKLQotICBpbmRleCA9IGhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgZm9yIChoYXNocCA9IHRhYmxlLT50YWJsZVtpbmRleF07Ci0gICAgICAgaGFzaHAgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIGhhc2hwID0gaGFzaHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKGhhc2hwLT5oYXNoID09IGhhc2gKLQkgICYmIHN0cmNtcCAoaGFzaHAtPnN0cmluZywgc3RyaW5nKSA9PSAwKQotCXJldHVybiBoYXNocDsKLSAgICB9Ci0KLSAgaWYgKCEgY3JlYXRlKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEw7Ci0KLSAgaGFzaHAgPSAoKnRhYmxlLT5uZXdmdW5jKSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMLCB0YWJsZSwgc3RyaW5nKTsKLSAgaWYgKGhhc2hwID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICBpZiAoY29weSkKLSAgICB7Ci0gICAgICBjaGFyICpuZXc7Ci0KLSAgICAgIG5ldyA9IChjaGFyICopIG9iamFsbG9jX2FsbG9jICgoc3RydWN0IG9iamFsbG9jICopIHRhYmxlLT5tZW1vcnksCi0JCQkJICAgICBsZW4gKyAxKTsKLSAgICAgIGlmICghbmV3KQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTDsKLQl9Ci0gICAgICBzdHJjcHkgKG5ldywgc3RyaW5nKTsKLSAgICAgIHN0cmluZyA9IG5ldzsKLSAgICB9Ci0gIGhhc2hwLT5zdHJpbmcgPSBzdHJpbmc7Ci0gIGhhc2hwLT5oYXNoID0gaGFzaDsKLSAgaGFzaHAtPm5leHQgPSB0YWJsZS0+dGFibGVbaW5kZXhdOwotICB0YWJsZS0+dGFibGVbaW5kZXhdID0gaGFzaHA7Ci0KLSAgcmV0dXJuIGhhc2hwOwotfQotCi0vKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWJmZF9oYXNoX3JlcGxhY2UgKHRhYmxlLCBvbGQsIG53KQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKm9sZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpudzsKLXsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKipwcGg7Ci0KLSAgaW5kZXggPSBvbGQtPmhhc2ggJSB0YWJsZS0+c2l6ZTsKLSAgZm9yIChwcGggPSAmdGFibGUtPnRhYmxlW2luZGV4XTsKLSAgICAgICAoKnBwaCkgIT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMOwotICAgICAgIHBwaCA9ICYoKnBwaCktPm5leHQpCi0gICAgewotICAgICAgaWYgKCpwcGggPT0gb2xkKQotCXsKLQkgICpwcGggPSBudzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGFib3J0ICgpOwotfQotCi0vKiBCYXNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSBuZXcgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWJmZF9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChlbnRyeSA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgZW50cnkgPSAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKQotCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSkpKTsKLSAgcmV0dXJuIGVudHJ5OwotfQotCi0vKiBBbGxvY2F0ZSBzcGFjZSBpbiBhIGhhc2ggdGFibGUuICAqLwotCi1QVFIKLWJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIFBUUiByZXQ7Ci0KLSAgcmV0ID0gb2JqYWxsb2NfYWxsb2MgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgdGFibGUtPm1lbW9yeSwgc2l6ZSk7Ci0gIGlmIChyZXQgPT0gTlVMTCAmJiBzaXplICE9IDApCi0gICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWJmZF9oYXNoX3RyYXZlcnNlICh0YWJsZSwgZnVuYywgaW5mbykKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYm9vbGVhbiAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLSAgICAgUFRSIGluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+c2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqcDsKLQotICAgICAgZm9yIChwID0gdGFibGUtPnRhYmxlW2ldOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmICghICgqZnVuYykgKHAsIGluZm8pKQotCSAgICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQwKLS8qIEEgZmV3IGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIChhLm91dCwgQ09GRiwgRUxGKSB1c2UgYSBzdHJpbmcKLSAgIHRhYmxlLiAgVGhlc2UgZnVuY3Rpb25zIHN1cHBvcnQgYWRkaW5nIHN0cmluZ3MgdG8gYSBzdHJpbmcgdGFibGUsCi0gICByZXR1cm5pbmcgdGhlIGJ5dGUgb2Zmc2V0LCBhbmQgd3JpdGluZyBvdXQgdGhlIHRhYmxlLgotCi0gICBQb3NzaWJsZSBpbXByb3ZlbWVudHM6Ci0gICArIGxvb2sgZm9yIHN0cmluZ3MgbWF0Y2hpbmcgdHJhaWxpbmcgc3Vic3RyaW5ncyBvZiBvdGhlciBzdHJpbmdzCi0gICArIGJldHRlciBkYXRhIHN0cnVjdHVyZXM/ICBiYWxhbmNlZCB0cmVlcz8KLSAgICsgbG9vayBhdCByZWR1Y2luZyBtZW1vcnkgdXNlIGVsc2V3aGVyZSAtLSBtYXliZSBpZiB3ZSBkaWRuJ3QgaGF2ZQotICAgICB0byBjb25zdHJ1Y3QgdGhlIGVudGlyZSBzeW1ib2wgdGFibGUgYXQgb25jZSwgd2UgY291bGQgZ2V0IGJ5Ci0gICAgIHdpdGggc21hbGxlciBhbW91bnRzIG9mIFZNPyAgKFdoYXQgZWZmZWN0IGRvZXMgdGhhdCBoYXZlIG9uIHRoZQotICAgICBzdHJpbmcgdGFibGUgcmVkdWN0aW9ucz8pICAqLwotCi0vKiBBbiBlbnRyeSBpbiB0aGUgc3RydGFiIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEluZGV4IGluIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgaW5kZXg7Ci0gIC8qIE5leHQgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqbmV4dDsKLX07Ci0KLS8qIFRoZSBzdHJ0YWIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2gKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHRhYmxlOwotICAvKiBTaXplIG9mIHN0cnRhYi0tYWxzbyBuZXh0IGF2YWlsYWJsZSBpbmRleC4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogRmlyc3Qgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqZmlyc3Q7Ci0gIC8qIExhc3Qgc3RyaW5nIGluIHN0cnRhYi4gICovCi0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqbGFzdDsKLSAgLyogV2hldGhlciB0byBwcmVjZWRlIHN0cmluZ3Mgd2l0aCBhIHR3byBieXRlIGxlbmd0aCwgYXMgaW4gdGhlCi0gICAgIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgYm9vbGVhbiB4Y29mZjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKnN0cnRhYl9oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYSBzdHJ0YWIuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0cnRhYl9oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RydGFiX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5pbmRleCA9IChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICAgIHJldC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBzdHJ0YWIuICAqLwotCi0jZGVmaW5lIHN0cnRhYl9oYXNoX2xvb2t1cCh0LCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodCktPnRhYmxlLCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIENyZWF0ZSBhIG5ldyBzdHJ0YWIuICAqLwotCi1zdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICoKLV9iZmRfc3RyaW5ndGFiX2luaXQgKCkKLXsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqdGFibGU7Ci0KLSAgdGFibGUgPSAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikKLQkgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBiZmRfc3RydGFiX2hhc2gpKSk7Ci0gIGlmICh0YWJsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIHN0cnRhYl9oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHRhYmxlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB0YWJsZS0+c2l6ZSA9IDA7Ci0gIHRhYmxlLT5maXJzdCA9IE5VTEw7Ci0gIHRhYmxlLT5sYXN0ID0gTlVMTDsKLSAgdGFibGUtPnhjb2ZmID0gZmFsc2U7Ci0KLSAgcmV0dXJuIHRhYmxlOwotfQotCi0vKiBDcmVhdGUgYSBuZXcgc3RydGFiIGluIHdoaWNoIHRoZSBzdHJpbmdzIGFyZSBvdXRwdXQgaW4gdGhlIGZvcm1hdAotICAgdXNlZCBpbiB0aGUgWENPRkYgLmRlYnVnIHNlY3Rpb246IGEgdHdvIGJ5dGUgbGVuZ3RoIHByZWNlZGVzIGVhY2gKLSAgIHN0cmluZy4gICovCi0KLXN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKgotX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCAoKQotewotICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpyZXQ7Ci0KLSAgcmV0ID0gX2JmZF9zdHJpbmd0YWJfaW5pdCAoKTsKLSAgaWYgKHJldCAhPSBOVUxMKQotICAgIHJldC0+eGNvZmYgPSB0cnVlOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBGcmVlIGEgc3RydGFiLiAgKi8KLQotdm9pZAotX2JmZF9zdHJpbmd0YWJfZnJlZSAodGFibGUpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYmxlOwotewotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmdGFibGUtPnRhYmxlKTsKLSAgZnJlZSAodGFibGUpOwotfQotCi0vKiBHZXQgdGhlIGluZGV4IG9mIGEgc3RyaW5nIGluIGEgc3RydGFiLCBhZGRpbmcgaXQgaWYgaXQgaXMgbm90Ci0gICBhbHJlYWR5IHByZXNlbnQuICBJZiBIQVNIIGlzIGZhbHNlLCB3ZSBkb24ndCByZWFsbHkgdXNlIHRoZSBoYXNoCi0gICB0YWJsZSwgYW5kIHdlIGRvbid0IGVsaW1pbmF0ZSBkdXBsaWNhdGUgc3RyaW5ncy4gICovCi0KLWJmZF9zaXplX3R5cGUKLV9iZmRfc3RyaW5ndGFiX2FkZCAodGFiLCBzdHIsIGhhc2gsIGNvcHkpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLSAgICAgY29uc3QgY2hhciAqc3RyOwotICAgICBib29sZWFuIGhhc2g7Ci0gICAgIGJvb2xlYW4gY29weTsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICplbnRyeTsKLQotICBpZiAoaGFzaCkKLSAgICB7Ci0gICAgICBlbnRyeSA9IHN0cnRhYl9oYXNoX2xvb2t1cCAodGFiLCBzdHIsIHRydWUsIGNvcHkpOwotICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBlbnRyeSA9ICgoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5ICopCi0JICAgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmdGFiLT50YWJsZSwKLQkJCQkgIHNpemVvZiAoc3RydWN0IHN0cnRhYl9oYXNoX2VudHJ5KSkpOwotICAgICAgaWYgKGVudHJ5ID09IE5VTEwpCi0JcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLSAgICAgIGlmICghIGNvcHkpCi0JZW50cnktPnJvb3Quc3RyaW5nID0gc3RyOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKm47Ci0KLQkgIG4gPSAoY2hhciAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJnRhYi0+dGFibGUsIHN0cmxlbiAoc3RyKSArIDEpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgcmV0dXJuIChiZmRfc2l6ZV90eXBlKSAtMTsKLQkgIGVudHJ5LT5yb290LnN0cmluZyA9IG47Ci0JfQotICAgICAgZW50cnktPmluZGV4ID0gKGJmZF9zaXplX3R5cGUpIC0xOwotICAgICAgZW50cnktPm5leHQgPSBOVUxMOwotICAgIH0KLQotICBpZiAoZW50cnktPmluZGV4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLSAgICB7Ci0gICAgICBlbnRyeS0+aW5kZXggPSB0YWItPnNpemU7Ci0gICAgICB0YWItPnNpemUgKz0gc3RybGVuIChzdHIpICsgMTsKLSAgICAgIGlmICh0YWItPnhjb2ZmKQotCXsKLQkgIGVudHJ5LT5pbmRleCArPSAyOwotCSAgdGFiLT5zaXplICs9IDI7Ci0JfQotICAgICAgaWYgKHRhYi0+Zmlyc3QgPT0gTlVMTCkKLQl0YWItPmZpcnN0ID0gZW50cnk7Ci0gICAgICBlbHNlCi0JdGFiLT5sYXN0LT5uZXh0ID0gZW50cnk7Ci0gICAgICB0YWItPmxhc3QgPSBlbnRyeTsKLSAgICB9Ci0KLSAgcmV0dXJuIGVudHJ5LT5pbmRleDsKLX0KLQotLyogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzdHJ0YWIuICAqLwotCi1iZmRfc2l6ZV90eXBlCi1fYmZkX3N0cmluZ3RhYl9zaXplICh0YWIpCi0gICAgIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnRhYjsKLXsKLSAgcmV0dXJuIHRhYi0+c2l6ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RydGFiLiAgQUJGRCBtdXN0IGFscmVhZHkgYmUgYXQgdGhlIHJpZ2h0IGxvY2F0aW9uIGluCi0gICB0aGUgZmlsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIHRhYikKLSAgICAgcmVnaXN0ZXIgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICp0YWI7Ci17Ci0gIHJlZ2lzdGVyIGJvb2xlYW4geGNvZmY7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzdHJ0YWJfaGFzaF9lbnRyeSAqZW50cnk7Ci0KLSAgeGNvZmYgPSB0YWItPnhjb2ZmOwotCi0gIGZvciAoZW50cnkgPSB0YWItPmZpcnN0OyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5uZXh0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnN0cjsKLSAgICAgIHJlZ2lzdGVyIHNpemVfdCBsZW47Ci0KLSAgICAgIHN0ciA9IGVudHJ5LT5yb290LnN0cmluZzsKLSAgICAgIGxlbiA9IHN0cmxlbiAoc3RyKSArIDE7Ci0KLSAgICAgIGlmICh4Y29mZikKLQl7Ci0JICBiZmRfYnl0ZSBidWZbMl07Ci0KLQkgIC8qIFRoZSBvdXRwdXQgbGVuZ3RoIGluY2x1ZGVzIHRoZSBudWxsIGJ5dGUuICAqLwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgbGVuLCBidWYpOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgYnVmLCAxLCAyLCBhYmZkKSAhPSAyKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzdHIsIDEsIGxlbiwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvaG9zdC1hb3V0LmMgYi9iZmQvaG9zdC1hb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NjQzZGMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3QtYW91dC5jCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyogQkZEIGJhY2tlbmQgZm9yIGxvY2FsIGhvc3QncyBhLm91dCBiaW5hcmllcwotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuICBQcm9iYWJseSBKb2huIEdpbG1vcmUncyBmYXVsdC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNkZWZpbmUJQVJDSF9TSVpFCTMyCi0KLS8qIFdoZW4gcG9ydGluZyB0byBhIG5ldyBzeXN0ZW0sIHlvdSBtdXN0IHN1cHBseToKLQotCUhPU1RfUEFHRV9TSVpFCQkob3B0aW9uYWwpCi0JSE9TVF9TRUdNRU5UX1NJWkUJKG9wdGlvbmFsIC0tIGRlZmF1bHRzIHRvIHBhZ2Ugc2l6ZSkKLQlIT1NUX01BQ0hJTkVfQVJDSAkob3B0aW9uYWwpCi0JSE9TVF9NQUNISU5FX01BQ0hJTkUJKG9wdGlvbmFsKQotCUhPU1RfVEVYVF9TVEFSVF9BRERSCShvcHRpb25hbCkKLQlIT1NUX1NUQUNLX0VORF9BRERSCShub3QgdXNlZCwgZXhjZXB0IGJ5IHRyYWQtY29yZSA/Pz8pCi0JSE9TVF9CSUdfRU5ESUFOX1AJKHJlcXVpcmVkIC0tIGRlZmluZSBpZiBiaWctZW5kaWFuKQotCi0gICBpbiB0aGUgLi9ob3N0cy9oLXN5c3RlbW5hbWUuaCBmaWxlLiAgKi8KLQotI2lmZGVmIFRSQURfSEVBREVSCi0jaW5jbHVkZSBUUkFEX0hFQURFUgotI2VuZGlmCi0KLSNpZmRlZgkJCUhPU1RfUEFHRV9TSVpFCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJSE9TVF9QQUdFX1NJWkUKLSNlbmRpZgotCi0jaWZkZWYJCQlIT1NUX1NFR01FTlRfU0laRQotI2RlZmluZQlTRUdNRU5UX1NJWkUJSE9TVF9TRUdNRU5UX1NJWkUKLSNlbHNlCi0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9URVhUX1NUQVJUX0FERFIKLSNkZWZpbmUJVEVYVF9TVEFSVF9BRERSCUhPU1RfVEVYVF9TVEFSVF9BRERSCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9TVEFDS19FTkRfQUREUgotI2RlZmluZQlTVEFDS19FTkRfQUREUglIT1NUX1NUQUNLX0VORF9BRERSCi0jZW5kaWYKLQotI2lmZGVmCQkJSE9TVF9CSUdfRU5ESUFOX1AKLSNkZWZpbmUJVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2Vsc2UKLSN1bmRlZiAgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIEhPU1RfTUFDSElORV9BUkNICi0jaWZkZWYgSE9TVF9NQUNISU5FX01BQ0hJTkUKLSNkZWZpbmUgU0VUX0FSQ0hfTUFDSChhYmZkLCBleGVjcCkgXAotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoKGFiZmQsIEhPU1RfTUFDSElORV9BUkNILCBIT1NUX01BQ0hJTkVfTUFDSElORSkKLSNlbHNlCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goYWJmZCwgZXhlY3ApIFwKLSAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaChhYmZkLCBIT1NUX01BQ0hJTkVfQVJDSCwgMCkKLSNlbmRpZgotI2VuZGlmIC8qIEhPU1RfTUFDSElORV9BUkNIICovCi0KLSNkZWZpbmUgTVkoT1ApIENBVChob3N0X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dCIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvYWxwaGFsaW51eC5oIGIvYmZkL2hvc3RzL2FscGhhbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDliOGQ2OS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvYWxwaGFsaW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vKiBMaW51eCBkdW1wcyAic3RydWN0IHRhc2tfc3RydWN0IiBhdCB0aGUgZW5kIG9mIHRoZSBjb3JlLWZpbGUuICBUaGlzCi0gICBzdHJ1Y3R1cmUgaXMgY3VycmVudGx5IDEwODAgYnl0ZXMgbG9uZywgYnV0IHdlIGFsbG93IHVwIHRvIDQwOTYKLSAgIGJ5dGVzIHRvIGFsbG93IGZvciBzb21lIGZ1dHVyZSBncm93dGguICAqLwotI2RlZmluZSBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECQk0MDk2Ci0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGFiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS5zaWduYWwpCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvYWxwaGF2bXMuaCBiL2JmZC9ob3N0cy9hbHBoYXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWUzOTFhLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9hbHBoYXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyogYWxwaGF2bXMuaCAtLSBCRkQgZGVmaW5pdGlvbnMgZm9yIGFuIG9wZW5WTVMgaG9zdAotICAgQ29weXJpZ2h0IDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkKLSAgIG9mIHByb0dJUyBTb2Z0d2FyZWVudHdpY2tsdW5nLCBBYWNoZW4sIEdlcm1hbnkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2luY2x1ZGUgPHVuaXhpby5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotCi0jaWZuZGVmIEJGRF9IT1NUXzY0X0JJVAotLyogTWFrZSB0aGUgYmFzaWMgdHlwZXMgNjQtYml0IHF1YW50aXRpZXMgb24gdGhlIGhvc3QuCi0gICBBbHNvIHByb3ZpZGUgdGhlIHN1cHBvcnQgbWFjcm9zIEJGRCBuZWVkcy4gICovCi0jIGlmZGVmIF9fR05VQ19fCi0jICBkZWZpbmUJQkZEX0hPU1RfNjRfQklUCWxvbmcgbG9uZwotIyBlbHNlCi0jICBkZWZpbmUJQkZEX0hPU1RfNjRfQklUCWxvbmcKLSMgZW5kaWYKLXR5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUIHVpbnQ2NF90eXBlOwotdHlwZWRlZiBCRkRfSE9TVF82NF9CSVQgaW50NjRfdHlwZTsKLQotIyBkZWZpbmUgc3ByaW50Zl92bWEocyx4KSBzcHJpbnRmIChzLCAiJTAxNmx4IiwgeCkgLyogQkZEX0hPU1RfNjRfQklUICovCi0jIGRlZmluZSBmcHJpbnRmX3ZtYShmLHgpIGZwcmludGYgKGYsICIlMDE2bHgiLCB4KSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotIyBkZWZpbmUgQllURVNfSU5fUFJJTlRGX0lOVCA0Ci0KLS8qIFRoZXNlIG11c3QgaGF2ZSB0eXBlIHVuc2lnbmVkIGxvbmcgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGFzCi0gICBhcmd1bWVudHMgaW4gcHJpbnRmIGZ1bmN0aW9ucy4gICovCi0jIGRlZmluZSB1aW50NjRfdHlwZUxPVyh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpICYgMHhmZmZmZmZmZikpKSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLSMgZGVmaW5lIHVpbnQ2NF90eXBlSElHSCh4KSAoKHVuc2lnbmVkIGxvbmcpICgoKHgpID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSAvKiBCRkRfSE9TVF82NF9CSVQgKi8KLQotI2VuZGlmIC8qIEJGRF9IT1NUXzY0X0JJVCAqLwotCi0jaW5jbHVkZSAiZm9wZW4tdm1zLmgiCi0KLSNkZWZpbmUgTk9fRkNOVEwgMQotCi0jaWZuZGVmIE9fQUNDTU9ERQotI2RlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZIHwgT19XUk9OTFkgfCBPX1JEV1IpCi0jZW5kaWYKLQotZXh0ZXJuIGludCBnZXRwYWdlc2l6ZSBQQVJBTVMgKCh2b2lkKSk7CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oIGIvYmZkL2hvc3RzL2RlY3N0YXRpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwYzE0My4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZGVjc3RhdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyogSG9wZWZ1bGx5IHRoaXMgc2hvdWxkIGluY2x1ZGUgZWl0aGVyIG1hY2hpbmUvcGFyYW0uaCAoVWx0cml4KSBvcgotICAgbWFjaGluZS9tYWNocGFyYW0uaCAoTWFjaCksIHdoaWNoZXZlciBpcyBpdHMgbmFtZSBvbiB0aGlzIHN5c3RlbS4gICovCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotLyogI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHIC0tIHdlIHVzZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9taXBzCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQlVU1JURVhUCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCQlVU1JEQVRBCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCVVTUlNUQUNLCi0KLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZGVsdGE2OC5oIGIvYmZkL2hvc3RzL2RlbHRhNjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE2YTZlNi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZGVsdGE2OC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGEgTW90b3JvbGEgRGVsdGEgMzMwMCBib3ggcnVubmluZyBTeXN0ZW0gViBSMy4wLgotICAgQ29udHJpYnV0ZWQgYnkgbWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGUuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLS8qIERlZmluaXRpb25zIHVzZWQgYnkgdHJhZC1jb3JlLmMuICAqLwotI2RlZmluZQlOQlBHCQkJTkJQQwotI2RlZmluZQlIT1NUX0RBVEFfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X2RhdG9yZwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgl1LnVfZXhkYXRhLnV4X3R4dG9yZwotI2lmIDAKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDQwMDAwMDAwCi0jZWxzZQotLyogVXNlcidzIHN0YWNrLCBjb3BpZWQgZnJvbSBzeXMvcGFyYW0uaCAgKi8KLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwotI2VuZGlmCi0jZGVmaW5lCVVQQUdFUwkJCVVTSVpFCi0jZGVmaW5lCVRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2Fib3J0CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvZHB4Mi5oIGIvYmZkL2hvc3RzL2RweDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2Mzk1Zi4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvZHB4Mi5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0vKiBEZWZpbml0aW9ucyB0aGF0IGFyZSBuZWVkZWQgZm9yIGNvcmUgZmlsZXMuICBDb3JlIHNlY3Rpb24gc2l6ZXMgZm9yCi0gICB0aGUgRFBYMiBhcmUgaW4gYnl0ZXMuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZGVmaW5lIE5CUEcgMQotI2RlZmluZSBVUEFHRVMgKFVTSVpFICogTkJQUCkKLSNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIgKHUudV9leGRhdGEudXhfZGF0b3JnKQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIChVU0VSU1RBQ0spCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaHAzMDBic2QuaCBiL2JmZC9ob3N0cy9ocDMwMGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODI4NzE3Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9ocDMwMGJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEJTRDRfNAotI2RlZmluZSBOT19DT1JFX0NPTU1BTkQKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcJLyogRGF0YSBzZWcgc3RhcnQgYWRkciByb3VuZHMgdG8gTkJQRyAqLwotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF9tNjhrCi0vKiAjZGVmaW5lCUhPU1RfTUFDSElORV9NQUNISU5FCSAqLwotCi0jZGVmaW5lCUhPU1RfVEVYVF9TVEFSVF9BRERSCQkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCTB4ZmZmMDAwMDAKLSNkZWZpbmUJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2YnNkLmggYi9iZmQvaG9zdHMvaTM4NmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWVlM2Q4Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pMzg2YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKiBJbnRlbCAzODYgcnVubmluZyBhbnkgQlNEIFVuaXggKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotLyogUmVjZW50IHZlcnNpb25zIG9mIEZyZWVCU0QgZG9uJ3QgZGVmaW5lIE5CUEcuICAqLwotI2lmbmRlZiBOQlBHCi0jaWZkZWYgUEFHRV9TSVpFCi0jZGVmaW5lIE5CUEcgUEFHRV9TSVpFCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLQotLyogSm9saXR6IHN1Z2dlc3RlZCBkZWZpbmluZyBIT1NUX1NUQUNLX0VORF9BRERSIHRvCi0gICAodS51X2twcm9jLmtwX2Vwcm9jLmVfdm0udm1fbWF4c2FkZHIgKyBNQVhTU0laKSwgd2hpY2ggc2hvdWxkIHdvcmsgb24KLSAgIGJvdGggQlNESSBhbmQgMzg2QlNELCBidXQgdGhhdCBpcyBiZWxpZXZlZCBub3QgdG8gd29yayBmb3IgQlNEIDQuNC4gICovCi0KLSNpZmRlZiBfX2JzZGlfXwotLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgcmlnaHQgdGhpbmcgZm9yIEJTREkuICAqLwotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCQlVU1JTVEFDSwotI2RlZmluZSBIT1NUX0RBVEFfU1RBUlRfQUREUiAoKGJmZF92bWEpdS51X2twcm9jLmtwX2Vwcm9jLmVfdm0udm1fZGFkZHIpCi0jZWxzZQotLyogVGhpcyBzZWVtcyB0byBiZSB0aGUgcmlnaHQgdGhpbmcgZm9yIDM4NkJTRCByZWxlYXNlIDAuMS4gICovCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJCShVU1JTVEFDSyAtIE1BWFNTSVopCi0jZW5kaWYKLQotI2RlZmluZSBUUkFEX1VOSVhfQ09SRV9GSUxFX0ZBSUxJTkdfU0lHTkFMKGNvcmVfYmZkKSBcCi0gICgoY29yZV9iZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X3NpZykKLSNkZWZpbmUgdV9jb21tIHVfa3Byb2Mua3BfcHJvYy5wX2NvbW0KZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9pMzg2bGludXguaCBiL2JmZC9ob3N0cy9pMzg2bGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhNTFmMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NmxpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLS8qIExpbnV4IHdyaXRlcyB0aGUgdGFzayBzdHJ1Y3R1cmUgYXQgdGhlIGVuZCBvZiB0aGUgY29yZSBmaWxlLiAgQ3VycmVudGx5IGl0Ci0gICBpcyAyOTEyIGJ5dGVzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIHNob3VsZCBiZSBhIHBpY2tpZXIgY2hlY2ssIGJ1dAotICAgd2Ugc2hvdWxkIHByb2JhYmx5IG5vdCBiZSB0b28gcGlja3kgKHRoZSBzaXplIG9mIHRoZSB0YXNrIHN0cnVjdHVyZSBtaWdodAotICAgdmFyeSwgYW5kIGlmIGl0J3Mgbm90IHRoZSBsZW5ndGggd2UgZXhwZWN0IGl0IHRvIGJlLCBpdCBkb2Vzbid0IGFmZmVjdAotICAgb3VyIGFiaWxpdHkgdG8gcHJvY2VzcyB0aGUgY29yZSBmaWxlKS4gIFNvIGFsbG93IDAtNDA5NiBleHRyYSBieXRlcyBhdAotICAgdGhlIGVuZC4gICovCi0KLSNkZWZpbmUgVFJBRF9DT1JFX0VYVFJBX1NJWkVfQUxMT1dFRCA0MDk2CmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4Nm1hY2gzLmggYi9iZmQvaG9zdHMvaTM4Nm1hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzYxZTMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL2kzODZtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi1GSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvaTM4NnNjby5oIGIvYmZkL2hvc3RzL2kzODZzY28uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NjA4Yy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvaTM4NnNjby5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogQ29yZSBmaWxlIHN0dWZmLiAgQXQgbGVhc3Qgc29tZSwgcGVyaGFwcyBhbGwsIG9mIHRoZSBmb2xsb3dpbmcKLSAgIGRlZmluZXMgd29yayBvbiBtYW55IG1vcmUgc3lzdGVtcyB0aGFuIGp1c3QgU0NPLiAgKi8KLQotI2RlZmluZSBOQlBHIE5CUEMKLSNkZWZpbmUgVVBBR0VTIFVTSVpFCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIHUudV9leGRhdGEudXhfZGF0b3JnCi0jZGVmaW5lIEhPU1RfU1RBQ0tfU1RBUlRfQUREUiB1LnVfc3ViCi0jZGVmaW5lIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoYWJmZCkgXAotICAoKGNvcmVfdXBhZ2UoYWJmZCktPnVfc3lzYWJvcnQgIT0gMCkgXAotICAgPyBjb3JlX3VwYWdlKGFiZmQpLT51X3N5c2Fib3J0IFwKLSAgIDogLTEpCi0KLS8qIEFjY29yZGluZyB0byB0aGUgbWFucGFnZSwgYSB2ZXJzaW9uIDIgU0NPIGNvcmVmaWxlIGNhbiBjb250YWluCi0gICB2YXJpb3VzIGFkZGl0aW9uYWwgc2VjdGlvbnMgKGl0IGlzIGNsZXZlcmx5IGFycmFuZ2VkIHNvIHRoZSB1IGFyZWEsCi0gICBkYXRhLCBhbmQgc3RhY2sgYXJlIGZpcnN0IHdoZXJlIHdlIGNhbiBmaW5kIHRoZW0pLiAgU28gd2l0aG91dAotICAgd3JpdGluZyBsb3RzIG9mIGNvZGUgdG8gcGFyc2UgYWxsIHRoZWlyIGhlYWRlcnMgYW5kIHN0dWZmLCB3ZSBjYW4ndAotICAga25vdyB3aGV0aGVyIGEgY29yZWZpbGUgaXMgYmlnZ2VyIHRoYW4gaXQgc2hvdWxkIGJlLiAgKi8KLQotI2RlZmluZSBUUkFEX0NPUkVfQUxMT1dfQU5ZX0VYVFJBX1NJWkUgMQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL2k4NjBtYWNoMy5oIGIvYmZkL2hvc3RzL2k4NjBtYWNoMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGQyYWExLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9pODYwbWFjaDMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSB3YXMgaGFja2VkIGZyb20gaTM4Nm1hY2gzLmggICBbZG9sYW5Ac3NkLmludGVsLmNvbV0gKi8KLQotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotCi0vKiBUaGlzIGlzIGFuIHVnbHkgd2F5IHRvIGhhY2sgYXJvdW5kIHRoZSBpbmNvcnJlY3QKLSAqIGRlZmluaXRpb24gb2YgVVBBR0VTIGluIGkzODYvbWFjaHBhcmFtLmguCi0gKgotICogVGhlIGRlZmluaXRpb24gc2hvdWxkIHNwZWNpZnkgdGhlIHNpemUgcmVzZXJ2ZWQKLSAqIGZvciAic3RydWN0IHVzZXIiIGluIGNvcmUgZmlsZXMgaW4gUEFHRVMsCi0gKiBidXQgaW5zdGVhZCBpdCBnaXZlcyBpdCBpbiA1MTItYnl0ZSBjb3JlLWNsaWNrcwotICogZm9yIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi1GSVhNRSEhIFVQQUdFUyBpcyBuZWl0aGVyIDIgbm9yIDE2Ci0jZW5kaWYKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJMQotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX2k4NjAKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbTY4a2F1eC5oIGIvYmZkL2hvc3RzL202OGthdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzNzc1NS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTY4a2F1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIGFuIEFwcGxlIE1hY2ludG9zaCBydW5uaW5nIEEvVVggMy54LiAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhZ2UuaD4KLQotLyogRGVmaW5pdGlvbnMgdXNlZCBieSB0cmFkLWNvcmUuYy4gICovCi0jZGVmaW5lCU5CUEcJCQlOQlBQCi0KLSNkZWZpbmUJSE9TVF9EQVRBX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF9kYXRvcmcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJdS51X2V4ZGF0YS51eF90eHRvcmcKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkweDEwMDAwMDAwMAotCi0jZGVmaW5lCVVQQUdFUwkJCVVTSVpFCi0KLSNkZWZpbmUJVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gIChhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+dS51X2FyZ1swXSkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tNjhrbGludXguaCBiL2JmZC9ob3N0cy9tNjhrbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2N2RmYS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTY4a2xpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qIExpbnV4IGR1bXBzICJzdHJ1Y3QgdGFza19zdHJ1Y3QiIGF0IHRoZSBlbmQgb2YgdGhlIGNvcmUtZmlsZS4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjdXJyZW50bHkgMjUxMiBieXRlcyBsb25nLCBidXQgd2UgYWxsb3cgdXAgdG8gNDA5NgotICAgYnl0ZXMgdG8gYWxsb3cgZm9yIHNvbWUgZnV0dXJlIGdyb3d0aC4gICovCi0jZGVmaW5lIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQJCTQwOTYKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChhYmZkKSBcCi0gICgoYWJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnNpZ25hbCkKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy9tODhrbWFjaDMuaCBiL2JmZC9ob3N0cy9tODhrbWFjaDMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxNTUzOC4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbTg4a21hY2gzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSN1bmRlZiBVUEFHRVMKLSNkZWZpbmUgVVBBR0VTIDMKLQotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJTkJQRwotI2RlZmluZQlIT1NUX1NFR01FTlRfU0laRQlOQlBHCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX204OGsKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc2JzZC5oIGIvYmZkL2hvc3RzL21pcHNic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYWQyMS4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvbWlwc2JzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSN1bmRlZiBBTElHTgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQlOQlBHCi0vKiAjZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcgLS0gd2UgdXNlIEhPU1RfREFUQV9TVEFSVF9BRERSICovCi0jZGVmaW5lCUhPU1RfTUFDSElORV9BUkNICWJmZF9hcmNoX21pcHMKLS8qICNkZWZpbmUJSE9TVF9NQUNISU5FX01BQ0hJTkUJICovCi0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJCVVTUlRFWFQKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUgkJVVNSU1RBQ0sKLSNkZWZpbmUgTk9fQ09SRV9DT01NQU5ECmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvbWlwc21hY2gzLmggYi9iZmQvaG9zdHMvbWlwc21hY2gzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzQ2OGQuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL21pcHNtYWNoMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvbWFjaHBhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLS8qICNkZWZpbmUJSE9TVF9TRUdNRU5UX1NJWkUJTkJQRyAgKi8KLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfbWlwcwotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfREFUQV9TVEFSVF9BRERSCVVTUkRBVEEKLSNkZWZpbmUJSE9TVF9TVEFDS19FTkRfQUREUglVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL25ld3MtbWlwcy5oIGIvYmZkL2hvc3RzL25ld3MtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc5OWJlLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9uZXdzLW1pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIFNvbnkgTmV3cyBydW5uaW5nIE5ld3NPUyAzLjIuICAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+Ci0KLSNkZWZpbmUgSE9TVF9QQUdFX1NJWkUgTkJQRwotCi0jZGVmaW5lIEhPU1RfTUFDSElORV9BUkNIIGJmZF9hcmNoX21pcHMKLQotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiBVU1JURVhUCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIFVTUkRBVEEKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiBVU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL25ld3MuaCBiL2JmZC9ob3N0cy9uZXdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzk0NmMuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL25ld3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyogU29ueSBOZXdzIHJ1bm5pbmcgTmV3c09TIDMuMi4gICovCi0KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBIT1NUX1BBR0VfU0laRSBOQlBHCi0jZGVmaW5lIEhPU1RfU0VHTUVOVF9TSVpFIE5CUEcKLSNkZWZpbmUgSE9TVF9NQUNISU5FX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIEhPU1RfU1RBQ0tfRU5EX0FERFIgKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3BjNTMybWFjaC5oIGIvYmZkL2hvc3RzL3BjNTMybWFjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjk2ZjU5Li4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy9wYzUzMm1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLQotLyogVGhpcyBpcyBhbiB1Z2x5IHdheSB0byBoYWNrIGFyb3VuZCB0aGUgaW5jb3JyZWN0Ci0gKiBkZWZpbml0aW9uIG9mIFVQQUdFUyBpbiBuczUzMi9tYWNocGFyYW0uaC4KLSAqCi0gKiBUaGUgZGVmaW5pdGlvbiBzaG91bGQgc3BlY2lmeSB0aGUgc2l6ZSByZXNlcnZlZAotICogZm9yICJzdHJ1Y3QgdXNlciIgaW4gY29yZSBmaWxlcyBpbiBQQUdFUywKLSAqIGJ1dCBpbnN0ZWFkIGl0IGdpdmVzIGl0IGluIDUxMi1ieXRlIGNvcmUtY2xpY2tzCi0gKiBmb3IgbnM1MzIsIGkzODYgYW5kIGk4NjAuIFVQQUdFUyBpcyB1c2VkIG9ubHkgaW4gdHJhZC1jb3JlLmMuCi0gKi8KLSNpZiBVUEFHRVMgPT0gMTYKLSN1bmRlZiAgVVBBR0VTCi0jZGVmaW5lIFVQQUdFUyAyCi0jZW5kaWYKLQotI2lmIFVQQUdFUyAhPSAyCi0jZXJyb3IgVVBBR0VTIGlzIG5laXRoZXIgMiBub3IgMTYKLSNlbmRpZgotCi0jZGVmaW5lCUhPU1RfUEFHRV9TSVpFCQkxCi0jZGVmaW5lCUhPU1RfU0VHTUVOVF9TSVpFCU5CUEcKLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvcmlzY29zLmggYi9iZmQvaG9zdHMvcmlzY29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmE4MjYuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3Jpc2Nvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyogUklTQy9vcyA0LjUyQywgYW5kIHByZXN1bWFibHkgb3RoZXIgdmVyc2lvbnMuICAqLwotCi0jaW5jbHVkZSA8YnNkNDMvbWFjaGluZS9tYWNocGFyYW0uaD4KLSNpbmNsdWRlIDxic2Q0My9tYWNoaW5lL3ZtcGFyYW0uaD4KLQotI2RlZmluZSBOQlBHIEJTRDQzX05CUEcKLSNkZWZpbmUgVVBBR0VTIEJTRDQzX1VQQUdFUwotI2RlZmluZSBIT1NUX1RFWFRfU1RBUlRfQUREUiBCU0Q0M19VU1JURVhUCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIEJTRDQzX1VTUkRBVEEKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiBCU0Q0M19VU1JTVEFDSwpkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3N5bW1ldHJ5LmggYi9iZmQvaG9zdHMvc3ltbWV0cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3MTdiMy4uMDAwMDAwMAotLS0gYS9iZmQvaG9zdHMvc3ltbWV0cnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qIFN5bW1ldHJ5IHJ1bm5pbmcgZWl0aGVyIGR5bml4IDMuMSAoYnNkKSBvciBwdHggKHN5c3YpLiAgKi8KLQotI2RlZmluZSBOQlBHIDQwOTYKLSNkZWZpbmUgVVBBR0VTIDEKLQotI2lmZGVmIF9TRVFVRU5UXwotLyogcHR4ICovCi0jZGVmaW5lIEhPU1RfVEVYVF9TVEFSVF9BRERSIDAKLSNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUiAweDNmZmZlMDAwCi0jZGVmaW5lIFRSQURfQ09SRV9VU0VSX09GRlNFVCAoKFVQQUdFUyAqIE5CUEcpIC0gc2l6ZW9mIChzdHJ1Y3QgdXNlcikpCi0jZWxzZQotLyogZHluaXggKi8KLSNkZWZpbmUgSE9TVF9URVhUX1NUQVJUX0FERFIgMHgxMDAwCi0jZGVmaW5lIEhPU1RfREFUQV9TVEFSVF9BRERSIChOQlBHICogdS51X3RzaXplKQotI2RlZmluZSBIT1NUX1NUQUNLX0VORF9BRERSIDB4M2ZmZmYwMDAKLSNkZWZpbmUgVFJBRF9VTklYX0NPUkVfRklMRV9GQUlMSU5HX1NJR05BTChjb3JlX2JmZCkgXAotICAoKGNvcmVfYmZkKS0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUudV9hcmdbMF0pCi0jZW5kaWYKLQotI2RlZmluZSBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKZGlmZiAtLWdpdCBhL2JmZC9ob3N0cy90YWhvZS5oIGIvYmZkL2hvc3RzL3RhaG9lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNmNlZTIuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3RhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jZGVmaW5lCU5PX0NPUkVfQ09NTUFORAotCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSN1bmRlZglBTElHTgkJCS8qIFRoZXkgdXNlIGl0LCB3ZSB1c2UgaXQgdG9vICovCi0KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCU5CUEcKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdGFob2UKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUgkwCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJKEtFUk5CQVNFIC0gKFVQQUdFUyAqIE5CUEcpKQotI2RlZmluZQlIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheGJzZC5oIGIvYmZkL2hvc3RzL3ZheGJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI5Y2NlLi4wMDAwMDAwCi0tLSBhL2JmZC9ob3N0cy92YXhic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNkZWZpbmUJTk9fQ09SRV9DT01NQU5ECQkvKiBObyBjb21tYW5kIG5hbWUgaW4gY29yZSBmaWxlICovCi0KLSNpZiAwCi0jdW5kZWYJQUxJR04JCQkvKiBUaGV5IHVzZSBpdCwgd2UgdXNlIGl0IHRvbyAqLwotLyogRG9lcyBub3QgZXhpc3Qgb24gQlNEIDQuMywgaXQgdXNlcyBtYWNoaW5lL21hY2hwYXJhbS5oLgotICAgV2hhdGV2ZXIgaXQgaXMsIGl0J3MgaW5jbHVkZWQgYnkgPHN5cy9wYXJhbS5oPiwgd2hpY2ggdHJhZC1jb3JlLmMsCi0gICB0aGUgb25seSBwbGFjZSB0aGF0IHVzZXMgdGhpcyAoSSB0aGluayksIGFscmVhZHkgaW5jbHVkZXMuICAqLwotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNlbmRpZgotI3VuZGVmCUFMSUdOCQkJLyogVGhleSB1c2UgaXQsIHdlIHVzZSBpdCB0b28gKi8KLQotLyogTm90ZSB0aGF0IEhPU1RfUEFHRV9TSVpFIC0tIHRoZSBwYWdlIHNpemUgYXMgZmFyIGFzIGV4ZWN1dGFibGUgZmlsZXMKLSAgIGFyZSBjb25jZXJuZWQgLS0gaXMgbm90IHRoZSBzYW1lIGFzIE5CUEcsIGJlY2F1c2Ugb2YgcGFnZSBjbHVzdGVyaW5nLiAgKi8KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCTEwMjQKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJMAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCSgweDgwMDAwMDAwIC0gKFVQQUdFUyAqIE5CUEcpKQotI3VuZGVmCUhPU1RfQklHX0VORElBTl9QCmRpZmYgLS1naXQgYS9iZmQvaG9zdHMvdmF4dWx0LmggYi9iZmQvaG9zdHMvdmF4dWx0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzMxYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheHVsdC5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaW5jbHVkZSA8bWFjaGluZS9wYXJhbS5oPgotI2luY2x1ZGUgPG1hY2hpbmUvdm1wYXJhbS5oPgotI2RlZmluZQlIT1NUX1BBR0VfU0laRQkJKE5CUEcqQ0xTSVpFKQotI2RlZmluZQlIT1NUX01BQ0hJTkVfQVJDSAliZmRfYXJjaF92YXgKLQotI2RlZmluZQlIT1NUX1RFWFRfU1RBUlRfQUREUglVU1JURVhUCi0jZGVmaW5lCUhPU1RfU1RBQ0tfRU5EX0FERFIJVVNSU1RBQ0sKLSN1bmRlZglIT1NUX0JJR19FTkRJQU5fUApkaWZmIC0tZ2l0IGEvYmZkL2hvc3RzL3ZheHVsdDIuaCBiL2JmZC9ob3N0cy92YXh1bHQyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzNzMxYjcuLjAwMDAwMDAKLS0tIGEvYmZkL2hvc3RzL3ZheHVsdDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI2luY2x1ZGUgPG1hY2hpbmUvcGFyYW0uaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3ZtcGFyYW0uaD4KLSNkZWZpbmUJSE9TVF9QQUdFX1NJWkUJCShOQlBHKkNMU0laRSkKLSNkZWZpbmUJSE9TVF9NQUNISU5FX0FSQ0gJYmZkX2FyY2hfdmF4Ci0KLSNkZWZpbmUJSE9TVF9URVhUX1NUQVJUX0FERFIJVVNSVEVYVAotI2RlZmluZQlIT1NUX1NUQUNLX0VORF9BRERSCVVTUlNUQUNLCi0jdW5kZWYJSE9TVF9CSUdfRU5ESUFOX1AKZGlmZiAtLWdpdCBhL2JmZC9ocDMwMGJzZC5jIGIvYmZkL2hwMzAwYnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NjdiMTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwMzAwYnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEhQIDkwMDAvMzAwICg2ODAwMC1iYXNlZCkgbWFjaGluZXMgcnVubmluZyBCU0QgVW5peC4KLSAgIENvcHlyaWdodCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDAKLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIEVOVFJZX0NBTl9CRV9aRVJPCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwIC8qIEF2b2lkcyB3YXJuaW5nICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaHAzMDBic2RfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1ocDMwMGJzZCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHAzMDBocHV4LmMgYi9iZmQvaHAzMDBocHV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTIzMTguLjAwMDAwMDAKLS0tIGEvYmZkL2hwMzAwaHB1eC5jCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBocC11eCA5MDAwLzMwMAotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBHbGVubiBFbmdlbC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi0gICAgaHB1eCBuYXRpdmUgIC0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhwMzAwaHB1eCBiZmQgfCAtLS0tLS0tLS0tPiBocHV4IHcvZ251IGV4dAotICAgIGhwdXggdy9nbnUgZXh0ZW5zaW9uIC0tLS0+IHwgICAgICAgICAgICAgICB8Ci0KLQotICAgIFN1cHBvcnQgZm9yIHRoZSA5MDAwL1szNF0wMCBoYXMgc2V2ZXJhbCBsaW1pdGF0aW9ucy4KLSAgICAgIDEuIFNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0gICAgICAyLiBUaGUgb3V0cHV0IGZvcm1hdCBmcm9tIHRoaXMgYmZkIGlzIG5vdCB1c2FibGUgYnkgbmF0aXZlIHRvb2xzLgotCi0gICAgVGhlIHByaW1hcnkgbW90aXZhdGlvbiBmb3Igd3JpdGluZyB0aGlzIGJmZCB3YXMgdG8gYWxsb3cgdXNlIG9mCi0gICAgZ2RiIGFuZCBnY2MgZm9yIGhvc3QgYmFzZWQgZGVidWdnaW5nIGFuZCBub3QgdG8gbWltaWMgdGhlIGhwLXV4IHRvb2xzCi0gICAgaW4gZXZlcnkgZGV0YWlsLiAgVGhpcyBsZWFkcyB0byBhIHNpZ25pZmljYW50IHNpbXBsaWZpY2F0aW9uIG9mIHRoZQotICAgIGNvZGUgYW5kIGEgbGVhcCBpbiBwZXJmb3JtYW5jZS4gIFRoZSBkZWNpc2lvbiB0byBub3Qgb3V0cHV0IGhwIG5hdGl2ZQotICAgIGNvbXBhdGlibGUgb2JqZWN0cyB3YXMgZnVydGhlciBzdHJlbmd0aGVuZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcmljaG5lc3MKLSAgICBvZiB0aGUgZ2NjIGNvbXBpbGVkIG9iamVjdHMgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIHdpdGhvdXQgbG9zcyBvZgotICAgIGluZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHdoaWxlIHRoZSBocCBmb3JtYXQgc3VwcG9ydHMgdGhlIGNvbmNlcHQgb2YKLSAgICBzZWNvbmRhcnkgc3ltYm9scywgaXQgZG9lcyBub3Qgc3VwcG9ydCBpbmRpcmVjdCBzeW1ib2xzLiAgQW5vdGhlcgotICAgIHJlYXNvbiBpcyB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGltcGxlbWVudGF0aW9ucwotICAgIG9mIGdjYyBvbiBocHV4IHdoaWNoIHVzZWQgJ2hweHQnIHRvIHRyYW5zbGF0ZSAuYSBhbmQgLm8gZmlsZXMgaW50byBhCi0gICAgZm9ybWF0IHdoaWNoIGNvdWxkIGJlIHJlYWRpbHkgdW5kZXJzdG9vZCBieSB0aGUgZ251IGxpbmtlciBhbmQgZ2RiLgotICAgIFRoaXMgYWxsb3dzIHJlYWRpbmcgaHAgc2Vjb25kYXJ5IHN5bWJvbHMgYW5kIGNvbnZlcnRpbmcgdGhlbSBpbnRvCi0gICAgaW5kaXJlY3Qgc3ltYm9scyBidXQgdGhlIHJldmVyc2UgaXQgbm90IGFsd2F5cyBwb3NzaWJsZS4KLQotICAgIEFub3RoZXIgZXhhbXBsZSBvZiBkaWZmZXJlbmNlcyBpcyB0aGF0IHRoZSBocCBmb3JtYXQgc3RvcmVzIHN5bWJvbCBvZmZzZXRzCi0gICAgaW4gdGhlIG9iamVjdCBjb2RlIHdoaWxlIHRoZSBnbnUgdXRpbGl0aWVzIHVzZSBhIGZpZWxkIGluIHRoZQotICAgIHJlbG9jYXRpb24gcmVjb3JkIGZvciB0aGlzLiAgVG8gc3VwcG9ydCB0aGUgaHAgbmF0aXZlIGZvcm1hdCwgdGhlIG9iamVjdAotICAgIGNvZGUgd291bGQgbmVlZCB0byBiZSBwYXRjaGVkIHdpdGggdGhlIG9mZnNldHMgd2hlbiBwcm9kdWNpbmcgLm8gZmlsZXMuCi0KLSAgICBUaGUgYmFzaWMgdGVjaG5pcXVlIHRha2VuIGluIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gI2luY2x1ZGUgdGhlIGNvZGUKLSAgICBmcm9tIGFvdXR4LmggYW5kIGFvdXQtdGFyZ2V0Lmggd2l0aCBhcHByb3ByaWF0ZSAjZGVmaW5lcyB0byBvdmVycmlkZQotICAgIGNvZGUgd2hlcmUgYSB1bmlxdWUgaW1wbGVtZW50YXRpb24gaXMgbmVlZGVkOgotCi0gICAgewotICAgICAgICAjZGVmaW5lIGEgYnVuY2ggb2Ygc3R1ZmYKLSAgICAgICAgI2luY2x1ZGUgPGFvdXR4Lmg+Ci0KLSAgICAgICAgaW1wbGVtZW50IGEgYnVuY2ggb2YgZnVuY3Rpb25zCi0KLSAgICAgICAgI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0gICAgfQotCi0gICAgVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgIG9mIGhhdmluZyBhbiBhcnJheSBvZiBubGlzdCBpdGVtcyBhbmQgYW4gYXJyYXkgb2Ygc3RyaW5ncywgaHAncyBmb3JtYXQKLSAgICBoYXMgdGhlbSBtaXhlZCB0b2dldGhlciBpbiBvbmUgc3RydWN0dXJlLiAgSW4gYWRkaXRpb24sIHRoZSBzdHJpbmdzIGFyZQotICAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICAgbmxpc3QgZWxlbWVudCAxCi0gICAgc3RyaW5nMQotICAgIG5saXN0IGVsZW1lbnQgMgotICAgIHN0cmluZzIKLSAgICAuLi4KLQotICAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgIGFuZCBjb252ZXJ0IGl0IHRvIGNhbm9uaWNhbCBmb3JtLiAgQXMgd2UgbWFyY2ggdGhydSB0aGUgdGFibGUsIHdlIGNvcHkKLSAgICB0aGUgbmxpc3QgZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBmb3JtIGFuZCB3ZSBjb21wYWN0IHRoZSBzdHJpbmdzIGFuZCBudWxsCi0gICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICAgc3RyaW5nMQotICAgIG51bGwKLSAgICBzdHJpbmcyCi0gICAgbnVsbAotICovCi0KLS8qIEBAIElzIHRoaXMgcmVhbGx5IHNvIGRpZmZlcmVudCBmcm9tIG5vcm1hbCBhLm91dCB0aGF0IGl0IG5lZWRzIHRvIGluY2x1ZGUKLSAgIGFvdXR4Lmg/ICBXZSBzaG91bGQgZ28gdGhyb3VnaCB0aGlzIGZpbGUgc29tZXRpbWUgYW5kIHNlZSB3aGF0IGNhbiBiZSBtYWRlCi0gICBtb3JlIGRlcGVuZGVudCBvbiBhb3V0MzIubyBhbmQgd2hhdCBtaWdodCBuZWVkIHRvIGJlIGJyb2tlbiBvZmYgYW5kIGFjY2Vzc2VkCi0gICB0aHJvdWdoIHRoZSBiYWNrZW5kX2RhdGEgZmllbGQuICBPciwgbWF5YmUgd2UgcmVhbGx5IGRvIG5lZWQgc3VjaCBhCi0gICBjb21wbGV0ZWx5IHNlcGFyYXRlIGltcGxlbWVudGF0aW9uLiAgSSBkb24ndCBoYXZlIHRpbWUgdG8gaW52ZXN0aWdhdGUgdGhpcwotICAgbXVjaCBmdXJ0aGVyIHJpZ2h0IG5vdy4gIFtyYWVidXJuOjE5OTMwNDI4LjIxMjRFU1RdICovCi0vKiBAQCBBbHNvLCBub3RlIHRoYXQgdGhlcmUgd2luZCB1cCBiZWluZyB0d28gdmVyc2lvbnMgb2Ygc29tZSByb3V0aW5lcywgd2l0aAotICAgZGlmZmVyZW50IG5hbWVzLCBvbmx5IG9uZSBvZiB3aGljaCBhY3R1YWxseSBnZXRzIHVzZWQuICBGb3IgZXhhbXBsZToKLQlzbHVycF9zeW1ib2xfdGFibGUKLQlzd2FwX3N0ZF9yZWxvY19pbgotCXNsdXJwX3JlbG9jX3RhYmxlCi0JZ2V0X3N5bXRhYgotCWdldF9zeW10YWJfdXBwZXJfYm91bmQKLQljYW5vbmljYWxpemVfcmVsb2MKLQlta29iamVjdAotICAgVGhpcyBzaG91bGQgYWxzbyBiZSBmaXhlZC4gICovCi0KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaHAzMDBocHV4IgotI2RlZmluZSBNWShPUCkgQ0FUKGhwMzAwaHB1eF8sT1ApCi0KLSNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBocDMwMGhwdXhfZXhlY19ieXRlcwotI2RlZmluZSBleHRlcm5hbF9ubGlzdCBocDMwMGhwdXhfbmxpc3RfYnl0ZXMKLQotI2luY2x1ZGUgImFvdXQvaHAzMDBocHV4LmgiCi0KLS8qIGRlZmluZSB0aGVzZSBzbyB3ZSBjYW4gY29tcGlsZSB1bnVzZWQgcm91dGluZXMgaW4gYW91dHguaCAqLwotI2RlZmluZSBlX3N0cnggIGVfc2hsaWIKLSNkZWZpbmUgZV9vdGhlciBlX2xlbmd0aAotI2RlZmluZSBlX2Rlc2MgIGVfYWxtb2QKLQotI2RlZmluZSBBUl9QQURfQ0hBUiAnLycKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgTVlfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcF9mMgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBwcm92aWRlIG92ZXJyaWRlcyBmb3Igcm91dGluZXMgaW4gdGhpcyBmaWxlICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiB0aGVzZSBkb24ndCB1c2UgTVkgYmVjYXVzZSB0aGF0IGNhdXNlcyBwcm9ibGVtcyB3aXRoaW4gSlVNUF9UQUJMRQotICAgKENBVCB3aW5kcyB1cCBiZWluZyBleHBhbmRlZCByZWN1cnNpdmVseSwgd2hpY2ggQU5TSSBDIGNvbXBpbGVycwotICAgd2lsbCBub3QgZG8pLiAgKi8KLSNkZWZpbmUgTVlfZ2V0X3N5bXRhYiBocDMwMGhwdXhfZ2V0X3N5bXRhYgotI2RlZmluZSBNWV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGhwMzAwaHB1eF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9yZWxvYyBocDMwMGhwdXhfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBocDMwMGhwdXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBNWV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0vKiBVbnRpbCBhbmQgdW5sZXNzIHdlIGNvbnZlcnQgdGhlIHNsdXJwX3JlbG9jIGFuZCBzbHVycF9zeW10YWIKLSAgIHJvdXRpbmVzIGluIHRoaXMgZmlsZSwgd2UgY2FuIG5vdCB1c2UgdGhlIGRlZmF1bHQgYW91dAotICAgZnJlZV9jYWNoZWRfaW5mbyByb3V0aW5lIHdoaWNoIGFzc3VtZXMgdGhhdCB0aGUgcmVsb2NzIGFuZCBzeW10YWJzCi0gICB3ZXJlIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MuICAqLwotI2RlZmluZSBNWV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotCi0jZGVmaW5lIGhwMzAwaHB1eF93cml0ZV9zeW1zIGFvdXRfMzJfd3JpdGVfc3ltcwotCi0jZGVmaW5lIE1ZX2NhbGxiYWNrIE1ZKGNhbGxiYWNrKQotCi0jZGVmaW5lIE1ZX2V4ZWNfaGRyX2ZsYWdzIDB4MgotCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGhwMzAwaHB1eF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLQotI2RlZmluZSBIUF9TWU1UWVBFX1VOREVGSU5FRAkweDAwCi0jZGVmaW5lIEhQX1NZTVRZUEVfQUJTT0xVVEUJMHgwMQotI2RlZmluZSBIUF9TWU1UWVBFX1RFWFQJCTB4MDIKLSNkZWZpbmUgSFBfU1lNVFlQRV9EQVRBCQkweDAzCi0jZGVmaW5lIEhQX1NZTVRZUEVfQlNTCQkweDA0Ci0jZGVmaW5lIEhQX1NZTVRZUEVfQ09NTU9OCTB4MDUKLQotI2RlZmluZSBIUF9TWU1UWVBFX1RZUEUJCTB4MEYKLSNkZWZpbmUgSFBfU1lNVFlQRV9GSUxFTkFNRQkweDFGCi0KLSNkZWZpbmUgSFBfU1lNVFlQRV9BTElHTgkweDEwCi0jZGVmaW5lIEhQX1NZTVRZUEVfRVhURVJOQUwJMHgyMAotI2RlZmluZSBIUF9TRUNPTkRBUllfU1lNQk9MICAgICAweDQwCi0KLS8qIFJFTE9DQVRJT04gREVGSU5JVElPTlMgKi8KLSNkZWZpbmUgSFBfUlNFR01FTlRfVEVYVAkweDAwCi0jZGVmaW5lIEhQX1JTRUdNRU5UX0RBVEEJMHgwMQotI2RlZmluZSBIUF9SU0VHTUVOVF9CU1MJCTB4MDIKLSNkZWZpbmUgSFBfUlNFR01FTlRfRVhURVJOQUwJMHgwMwotI2RlZmluZSBIUF9SU0VHTUVOVF9QQ1JFTCAgICAgICAweDA0Ci0jZGVmaW5lIEhQX1JTRUdNRU5UX1JETFQgICAgICAgIDB4MDUKLSNkZWZpbmUgSFBfUlNFR01FTlRfUlBMVCAgICAgICAgMHgwNgotI2RlZmluZSBIUF9SU0VHTUVOVF9OT09QCTB4M0YKLQotI2RlZmluZSBIUF9STEVOR1RIX0JZVEUJCTB4MDAKLSNkZWZpbmUgSFBfUkxFTkdUSF9XT1JECQkweDAxCi0jZGVmaW5lIEhQX1JMRU5HVEhfTE9ORwkJMHgwMgotI2RlZmluZSBIUF9STEVOR1RIX0FMSUdOCTB4MDMKLQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyhocDMwMGhwdXgsXzMyXyx5KQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLQotLyogYW91dHguaCByZXF1aXJlcyBkZWZpbml0aW9ucyBmb3IgQk1BR0lDIGFuZCBRTUFHSUMuICAqLwotI2RlZmluZSBCTUFHSUMgSFBVWF9ET1RfT19NQUdJQwotI2RlZmluZSBRTUFHSUMgMDMxNAotCi0jaW5jbHVkZSAiYW91dHguaCIKLQotLyogU2luY2UgdGhlIGhwdXggc3ltYm9sIHRhYmxlIGhhcyBubGlzdCBlbGVtZW50cyBpbnRlcnNwZXJzZWQgd2l0aAotICAgc3RyaW5ncyBhbmQgd2UgbmVlZCB0byBpbnNlcnQgc29tIHN0cmluZ3MgZm9yIHNlY29uZGFyeSBzeW1ib2xzLCB3ZQotICAgZ2l2ZSBvdXJzZWx2ZXMgYSBsaXR0bGUgZXh0cmEgcGFkZGluZyB1cCBmcm9udCB0byBhY2NvdW50IGZvcgotICAgdGhpcy4gIE5vdGUgdGhhdCBmb3IgZWFjaCBub24tc2Vjb25kYXJ5IHN5bWJvbCB3ZSBwcm9jZXNzLCB3ZSBnYWluCi0gICA5IGJ5dGVzIG9mIHNwYWNlIGZvciB0aGUgZGlzY2FyZGVkIG5saXN0IGVsZW1lbnQgKG9uZSBieXRlIHVzZWQgZm9yCi0gICBudWxsKS4gIFNZTV9FWFRSQV9CWVRFUyBpcyB0aGUgZXh0cmEgc3BhY2UuICAqLwotI2RlZmluZSBTWU1fRVhUUkFfQllURVMgICAxMDI0Ci0KLS8qIFNldCBwYXJhbWV0ZXJzIGFib3V0IHRoaXMgYS5vdXQgZmlsZSB0aGF0IGFyZSBtYWNoaW5lLWRlcGVuZGVudC4KLSAgIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBzb21lX2FvdXRfb2JqZWN0X3AganVzdCBiZWZvcmUgaXQgcmV0dXJucy4gICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1NWSAoY2FsbGJhY2spIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICAvKiBDYWxjdWxhdGUgdGhlIGZpbGUgcG9zaXRpb25zIG9mIHRoZSBwYXJ0cyBvZiBhIG5ld2x5IHJlYWQgYW91dCBoZWFkZXIgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBOX1RYVFNJWkUgKCpleGVjcCk7Ci0KLSAgLyogVGhlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3NlcyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBOX1RYVEFERFIgKCpleGVjcCk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+dm1hID0gTl9EQVRBRERSICgqZXhlY3ApOwotICBvYmpfYnNzc2VjIChhYmZkKS0+dm1hID0gTl9CU1NBRERSICgqZXhlY3ApOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+bG1hID0gb2JqX3RleHRzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+bG1hID0gb2JqX2RhdGFzZWMgKGFiZmQpLT52bWE7Ci0gIG9ial9ic3NzZWMgKGFiZmQpLT5sbWEgPSBvYmpfYnNzc2VjIChhYmZkKS0+dm1hOwotCi0gIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHNlY3Rpb25zICovCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5fVFhUT0ZGICgqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBOX0RBVE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSByZWxvY2F0aW9uIGluZm8gKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fVFJFTE9GRiAoKmV4ZWNwKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAvKiBUaGUgZmlsZSBvZmZzZXRzIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zeW1fZmlsZXBvcyAoYWJmZCkgPSBOX1NZTU9GRiAoKmV4ZWNwKTsKLSAgb2JqX3N0cl9maWxlcG9zIChhYmZkKSA9IE5fU1RST0ZGICgqZXhlY3ApOwotCi0gIC8qIERldGVybWluZSB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSNpZmRlZiBTRVRfQVJDSF9NQUNICi0gIFNFVF9BUkNIX01BQ0ggKGFiZmQsICpleGVjcCk7Ci0jZWxzZQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBERUZBVUxUX0FSQ0gsIDApOwotI2VuZGlmCi0KLQotICBpZiAob2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9PSBnbnVfZW5jYXBfZm9ybWF0KQotICAgIHsKLSAgICAgIC8qIFRoZSBmaWxlIG9mZnNldHMgb2YgdGhlIHJlbG9jYXRpb24gaW5mbyAqLwotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5yZWxfZmlsZXBvcyA9IE5fR05VX1RSRUxPRkYgKCpleGVjcCk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9HTlVfRFJFTE9GRiAoKmV4ZWNwKTsKLQotICAgICAgLyogVGhlIGZpbGUgb2Zmc2V0cyBvZiB0aGUgc3RyaW5nIHRhYmxlIGFuZCBzeW1ib2wgdGFibGUuICAqLwotICAgICAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IE5fR05VX1NZTU9GRiAoKmV4ZWNwKTsKLSAgICAgIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAob2JqX3N5bV9maWxlcG9zIChhYmZkKSArIGV4ZWNwLT5hX3N5bXMpOwotCi0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTOwotICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBleGVjcC0+YV9zeW1zIC8gMTI7Ci0gICAgICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gMTI7Ci0gICAgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWV4dGVybiBib29sZWFuIGFvdXRfMzJfd3JpdGVfc3ltcyBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1NWSAod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOwkvKiBkdW1teSB2YXJzICovCi0gIGZpbGVfcHRyIHRleHRfZW5kOwotCi0gIG1lbXNldCAoJmV4ZWNfYnl0ZXMsIDAsIHNpemVvZiAoZXhlY19ieXRlcykpOwotI2lmIENIT09TRV9SRUxPQ19TSVpFCi0gIENIT09TRV9SRUxPQ19TSVpFIChhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0KLSAgaWYgKGFkYXRhIChhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCi0gICAgTkFNRSAoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwotICBleGVjcC0+YV9zeW1zID0gMDsKLQotICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0KLSAgZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCSAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCAweGMpOwotICBOX1NFVF9GTEFHUyAoKmV4ZWNwLCBhb3V0X2JhY2tlbmRfaW5mbyAoYWJmZCktPmV4ZWNfaGRyX2ZsYWdzKTsKLQotICBOQU1FIChhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsKLQotICAvKiB1cGRhdGUgZmllbGRzIG5vdCBjb3ZlcmVkIGJ5IGRlZmF1bHQgc3dhcF9leGVjX2hlYWRlcl9vdXQgKi8KLQotICAvKiB0aGlzIGlzIHJlYWxseSB0aGUgc3ltIHRhYmxlIHNpemUgYnV0IHdlIHN0b3JlIGl0IGluIGRyZWxvY3MgKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIDEyLCBleGVjX2J5dGVzLmVfZHJlbG9jcyk7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwTCwgZmFsc2UpICE9IDAKLSAgICAgIHx8IChiZmRfd3JpdGUgKChQVFIpICYgZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQotCSAgIT0gRVhFQ19CWVRFU19TSVpFKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBzeW1ib2xzLCBhbmQgdGhlbiB0aGUgcmVsb2NzLiAgV2UgbXVzdCB3cml0ZSBvdXQKLSAgICAgICB0aGUgc3ltYm9scyBmaXJzdCBzbyB0aGF0IHdlIGtub3cgdGhlIHN5bWJvbCBpbmRpY2VzLiAgKi8KLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIHRoZSByZWxvY3MgdG8gd2hlcmUgd2Ugd2FudCB0byBwdXQgdGhlIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIE5fRFJFTE9GRiAoKmV4ZWNwKSArIGV4ZWNwLT5hX2Ryc2l6ZSwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCFNWSAod3JpdGVfc3ltcykgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9UUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChsb25nKSAoTl9EUkVMT0ZGICgqZXhlY3ApKSwgZmFsc2UpICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFOQU1FIChhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBjb252ZXJ0IHRoZSBocCBzeW1ib2wgdHlwZSB0byBiZSB0aGUgc2FtZSBhcyBhb3V0NjQuaCB1c2FnZSBzbyB3ZSAqLwotLyogY2FuIHBpZ2d5YmFjayByb3V0aW5lcyBpbiBhb3V0eC5oLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotc3RhdGljIHZvaWQKLWNvbnZlcnRfc3ltX3R5cGUgKHN5bV9wb2ludGVyLCBjYWNoZV9wdHIsIGFiZmQpCi0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7Ci0gICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0cjsKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbmFtZV90eXBlOwotICBpbnQgbmV3X3R5cGU7Ci0KLSAgbmFtZV90eXBlID0gKGNhY2hlX3B0ci0+dHlwZSk7Ci0gIG5ld190eXBlID0gMDsKLQotICBpZiAoKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfQUxJR04pICE9IDApCi0gICAgewotICAgICAgLyogaW91X2Vycm9yICgiYWxpZ25lZCBzeW1ib2wgZW5jb3VudGVyZWQ6ICVzIiwgbmFtZSk7Ki8KLSAgICAgIG5hbWVfdHlwZSA9IDA7Ci0gICAgfQotCi0gIGlmIChuYW1lX3R5cGUgPT0gSFBfU1lNVFlQRV9GSUxFTkFNRSkKLSAgICBuZXdfdHlwZSA9IE5fRk47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG5hbWVfdHlwZSAmIEhQX1NZTVRZUEVfVFlQRSkKLQl7Ci0JY2FzZSBIUF9TWU1UWVBFX1VOREVGSU5FRDoKLQkgIG5ld190eXBlID0gTl9VTkRGOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQUJTT0xVVEU6Ci0JICBuZXdfdHlwZSA9IE5fQUJTOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfVEVYVDoKLQkgIG5ld190eXBlID0gTl9URVhUOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfREFUQToKLQkgIG5ld190eXBlID0gTl9EQVRBOwotCSAgYnJlYWs7Ci0KLQljYXNlIEhQX1NZTVRZUEVfQlNTOgotCSAgbmV3X3R5cGUgPSBOX0JTUzsKLQkgIGJyZWFrOwotCi0JY2FzZSBIUF9TWU1UWVBFX0NPTU1PTjoKLQkgIG5ld190eXBlID0gTl9DT01NOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAobmFtZV90eXBlICYgSFBfU1lNVFlQRV9FWFRFUk5BTCkKLQluZXdfdHlwZSB8PSBOX0VYVDsKLQotICAgICAgaWYgKG5hbWVfdHlwZSAmIEhQX1NFQ09OREFSWV9TWU1CT0wpCi0JewotCSAgc3dpdGNoIChuZXdfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgICAgIC8qIElmIHRoZSB2YWx1ZSBpcyBub256ZXJvLCB0aGVuIGp1c3QgdHJlYXQgdGhpcyBhcyBhCi0gICAgICAgICAgICAgICAgIGNvbW1vbiBzeW1ib2wuICBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBjb3JyZWN0IGluCi0gICAgICAgICAgICAgICAgIGFsbCBjYXNlcywgYnV0IGl0IGlzIG1vcmUgY29ycmVjdCB0aGFuIHRyZWF0aW5nIGl0IGFzCi0gICAgICAgICAgICAgICAgIGEgd2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgICAgICBpZiAoY2FjaGVfcHRyLT5zeW1ib2wudmFsdWUgPT0gMCkKLQkJbmV3X3R5cGUgPSBOX1dFQUtVOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0JICAgICAgbmV3X3R5cGUgPSBOX1dFQUtBOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgotCSAgICAgIG5ld190eXBlID0gTl9XRUFLVDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0Q7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoKLQkgICAgICBuZXdfdHlwZSA9IE5fV0VBS0I7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBjYWNoZV9wdHItPnR5cGUgPSBuZXdfdHlwZTsKLQotfQotCi0KLS8qCi1ERVNDUklQVElPTgotICAgICAgICBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gZXhlY3V0YWJsZSBoZWFkZXIgdGFrZW4gZnJvbSBhIHJhdwotICAgICAgICBieXRlIHN0cmVhbSBtZW1vcnkgaW1hZ2UsIGludG8gdGhlIGludGVybmFsIGV4ZWNfaGVhZGVyCi0gICAgICAgIHN0cnVjdHVyZS4KLSovCi0KLXZvaWQKLU5BTUUgKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9pbikgKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKikgcmF3X2J5dGVzOwotCi0gIC8qIFRoZSBpbnRlcm5hbF9leGVjIHN0cnVjdHVyZSBoYXMgc29tZSBmaWVsZHMgdGhhdCBhcmUgdW51c2VkIGluIHRoaXMKLSAgICAgY29uZmlndXJhdGlvbiAoSUUgZm9yIGk5NjApLCBzbyBlbnN1cmUgdGhhdCBhbGwgc3VjaCB1bmluaXRpYWxpemVkCi0gICAgIGZpZWxkcyBhcmUgemVybydkIG91dC4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgdHdvIG9mIHRoZXNlIHN0cnVjdHMKLSAgICAgYXJlIG1lbWNtcCdkLCBhbmQgdGh1cyB0aGUgY29udGVudHMgZG8gbWF0dGVyLiAqLwotICBtZW1zZXQgKGV4ZWNwLCAwLCBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9leGVjKSk7Ci0gIC8qIE5vdyBmaWxsIGluIGZpZWxkcyBpbiB0aGUgZXhlY3AsIGZyb20gdGhlIGJ5dGVzIGluIHRoZSByYXcgZGF0YS4gICovCi0gIGV4ZWNwLT5hX2luZm8gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX2luZm8pOwotICBleGVjcC0+YV90ZXh0ID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2RhdGEpOwotICBleGVjcC0+YV9ic3MgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfYnNzKTsKLSAgZXhlY3AtPmFfc3ltcyA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9zeW1zKTsKLSAgZXhlY3AtPmFfZW50cnkgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZW50cnkpOwotICBleGVjcC0+YV90cnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfdHJzaXplKTsKLSAgZXhlY3AtPmFfZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX2Ryc2l6ZSk7Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogY2hlY2sgdGhlIGhlYWRlciB0byBzZWUgaWYgaXQgd2FzIGdlbmVyYXRlZCBieSBhIGJmZCBvdXRwdXQgKi8KLSAgLyogdGhpcyBpcyBkZXRlY3RlZCByYXRoZXIgYml6YXJlbHkgYnkgcmVxdWlyaW5nIGEgYnVuY2ggb2YgICAgKi8KLSAgLyogaGVhZGVyIGZpZWxkcyB0byBiZSB6ZXJvIGFuZCBhbiBvbGQgdW51c2VkIGZpZWxkIChub3cgdXNlZCkgKi8KLSAgLyogdG8gYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgZG8KLSAgICB7Ci0gICAgICBsb25nIHN5bXM7Ci0gICAgICBzdHJ1Y3QgYW91dF9kYXRhX3N0cnVjdCAqcmF3cHRyOwotICAgICAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPmVfcGFzc2l6ZSkgIT0gMCkKLQlicmVhazsKLSAgICAgIGlmIChiZmRfaF9nZXRfMzIgKGFiZmQsIGJ5dGVzLT5lX3N5bXMpICE9IDApCi0JYnJlYWs7Ci0gICAgICBpZiAoYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9zdXBzaXplKSAhPSAwKQotCWJyZWFrOwotCi0gICAgICBzeW1zID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9kcmVsb2NzKTsKLSAgICAgIGlmIChzeW1zID09IDApCi0JYnJlYWs7Ci0KLSAgICAgIC8qIE9LLCB3ZSd2ZSBwYXNzZWQgdGhlIHRlc3QgYXMgYmVzdCBhcyB3ZSBjYW4gZGV0ZXJtaW5lICovCi0gICAgICBleGVjcC0+YV9zeW1zID0gc3ltczsKLQotICAgICAgLyogYWxsb2NhdGUgc3RvcmFnZSBmb3Igd2hlcmUgd2Ugd2lsbCBzdG9yZSB0aGlzIHJlc3VsdCAqLwotICAgICAgcmF3cHRyID0gKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoKnJhd3B0cikpOwotCi0gICAgICBpZiAocmF3cHRyID09IE5VTEwpCi0JcmV0dXJuOwotICAgICAgYWJmZC0+dGRhdGEuYW91dF9kYXRhID0gcmF3cHRyOwotICAgICAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IGdudV9lbmNhcF9mb3JtYXQ7Ci0gICAgfQotICB3aGlsZSAoMCk7Ci19Ci0KLQotLyogVGhlIGhwIHN5bWJvbCB0YWJsZSBpcyBhIGJpdCBkaWZmZXJlbnQgdGhhbiBvdGhlciBhLm91dCB0YXJnZXRzLiAgSW5zdGVhZAotICAgb2YgaGF2aW5nIGFuIGFycmF5IG9mIG5saXN0IGl0ZW1zIGFuZCBhbiBhcnJheSBvZiBzdHJpbmdzLCBocCdzIGZvcm1hdAotICAgaGFzIHRoZW0gbWl4ZWQgdG9nZXRoZXIgaW4gb25lIHN0cnVjdHVyZS4gIEluIGFkZGl0aW9uLCB0aGUgc3RyaW5ncyBhcmUKLSAgIG5vdCBudWxsIHRlcm1pbmF0ZWQuICBJdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgotCi0gICBubGlzdCBlbGVtZW50IDEKLSAgIHN0cmluZzEKLSAgIG5saXN0IGVsZW1lbnQgMgotICAgc3RyaW5nMgotICAgLi4uCi0KLSAgIFRoZSB3aG9sZSBzeW1ib2wgdGFibGUgaXMgcmVhZCBhcyBvbmUgY2h1bmsgYW5kIHRoZW4gd2UgbWFyY2ggdGhydSBpdAotICAgYW5kIGNvbnZlcnQgaXQgdG8gY2Fub25pY2FsIGZvcm0uICBBcyB3ZSBtYXJjaCB0aHJ1IHRoZSB0YWJsZSwgd2UgY29weQotICAgdGhlIG5saXN0IGRhdGEgaW50byB0aGUgaW50ZXJuYWwgZm9ybSBhbmQgd2UgY29tcGFjdCB0aGUgc3RyaW5ncyBhbmQgbnVsbAotICAgdGVybWluYXRlIHRoZW0sIHVzaW5nIHN0b3JhZ2UgZnJvbSB0aGUgYWxyZWFkeSBhbGxvY2F0ZWQgc3ltYm9sIHRhYmxlOgotCi0gICBzdHJpbmcxCi0gICBudWxsCi0gICBzdHJpbmcyCi0gICBudWxsCi0gICAuLi4KLSovCi0KLWJvb2xlYW4KLU1ZIChzbHVycF9zeW1ib2xfdGFibGUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3ltYm9sX2J5dGVzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKnN5bXM7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX3BvaW50ZXI7Ci0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqc3ltX2VuZDsKLSAgY2hhciAqc3RyaW5nczsKLSAgYW91dF9zeW1ib2xfdHlwZSAqY2FjaGVkOwotICB1bnNpZ25lZCBudW1fc3ltcyA9IDA7Ci0KLSAgLyogSWYgdGhlcmUncyBubyB3b3JrIHRvIGJlIGRvbmUsIGRvbid0IGRvIGFueSAqLwotICBpZiAob2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgIT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgc3ltYm9sX2J5dGVzID0gZXhlY19oZHIgKGFiZmQpLT5hX3N5bXM7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQlzeW1ib2xfYnl0ZXMgKyBTWU1fRVhUUkFfQllURVMpOwotICBpZiAoIXN0cmluZ3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW1zID0gKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKSAoc3RyaW5ncyArIFNZTV9FWFRSQV9CWVRFUyk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3N5bV9maWxlcG9zIChhYmZkKSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkICgoUFRSKSBzeW1zLCBzeW1ib2xfYnl0ZXMsIDEsIGFiZmQpICE9IHN5bWJvbF9ieXRlcykKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgc3ltcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgc3ltX2VuZCA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1zKSArIHN5bWJvbF9ieXRlcyk7Ci0KLSAgLyogZmlyc3QsIG1hcmNoIHRocnUgdGhlIHRhYmxlIGFuZCBmaWd1cmUgb3V0IGhvdyBtYW55IHN5bWJvbHMgdGhlcmUgYXJlICovCi0gIGZvciAoc3ltX3BvaW50ZXIgPSBzeW1zOyBzeW1fcG9pbnRlciA8IHN5bV9lbmQ7IHN5bV9wb2ludGVyKyssIG51bV9zeW1zKyspCi0gICAgewotICAgICAgLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCi0gICAgICBzeW1fcG9pbnRlciA9IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgKCgoY2hhciAqKSBzeW1fcG9pbnRlcikgKwotCQkJCQkgICAgICAgc3ltX3BvaW50ZXItPmVfbGVuZ3RoWzBdKTsKLSAgICB9Ci0KLSAgLyogbm93IHRoYXQgd2Uga25vdyB0aGUgc3ltYm9sIGNvdW50LCB1cGRhdGUgdGhlIGJmZCBoZWFkZXIgKi8KLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBudW1fc3ltczsKLQotICBjYWNoZWQgPSAoKGFvdXRfc3ltYm9sX3R5cGUgKikKLQkgICAgYmZkX3phbGxvYyAoYWJmZCwKLQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlKSkpOwotICBpZiAoY2FjaGVkID09IE5VTEwgJiYgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogYXMgd2UgbWFyY2ggdGhydSB0aGUgaHAgc3ltYm9sIHRhYmxlLCBjb252ZXJ0IGl0IGludG8gYSBsaXN0IG9mCi0gICAgIG51bGwgdGVybWluYXRlZCBzdHJpbmdzIHRvIGhvbGQgdGhlIHN5bWJvbCBuYW1lcy4gIE1ha2Ugc3VyZSBhbnkKLSAgICAgYXNzaWdubWVudCB0byB0aGUgc3RyaW5ncyBwb2ludGVyIGlzIGRvbmUgYWZ0ZXIgd2UncmUgdGhydSB1c2luZwotICAgICB0aGUgbmxpc3Qgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGFueXRoaW5nIGltcG9ydGFudC4gKi8KLQotICAvKiBPSywgbm93IHdhbGsgdGhlIG5ldyBzeW10YWJsZSwgY2FjaGVpbmcgc3ltYm9sIHByb3BlcnRpZXMgKi8KLSAgewotICAgIGFvdXRfc3ltYm9sX3R5cGUgKmNhY2hlX3B0ciA9IGNhY2hlZDsKLSAgICBhb3V0X3N5bWJvbF90eXBlIGNhY2hlX3NhdmU7Ci0gICAgLyogUnVuIHRocm91Z2ggdGFibGUgYW5kIGNvcHkgdmFsdWVzICovCi0gICAgZm9yIChzeW1fcG9pbnRlciA9IHN5bXMsIGNhY2hlX3B0ciA9IGNhY2hlZDsKLQkgc3ltX3BvaW50ZXIgPCBzeW1fZW5kOyBzeW1fcG9pbnRlcisrLCBjYWNoZV9wdHIrKykKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCWNhY2hlX3B0ci0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCWNhY2hlX3B0ci0+c3ltYm9sLnZhbHVlID0gR0VUX1NXT1JEIChhYmZkLCBzeW1fcG9pbnRlci0+ZV92YWx1ZSk7Ci0JY2FjaGVfcHRyLT5kZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3ltX3BvaW50ZXItPmVfYWxtb2QpOwotCWNhY2hlX3B0ci0+dHlwZSA9IGJmZF9nZXRfOCAoYWJmZCwgc3ltX3BvaW50ZXItPmVfdHlwZSk7Ci0JY2FjaGVfcHRyLT5zeW1ib2wudWRhdGEucCA9IE5VTEw7Ci0JbGVuZ3RoID0gYmZkX2dldF84IChhYmZkLCBzeW1fcG9pbnRlci0+ZV9sZW5ndGgpOwotCWNhY2hlX3B0ci0+b3RoZXIgPSBsZW5ndGg7CS8qIG90aGVyIG5vdCB1c2VkLCBzYXZlIGxlbmd0aCBoZXJlICovCi0KLQljYWNoZV9zYXZlID0gKmNhY2hlX3B0cjsKLQljb252ZXJ0X3N5bV90eXBlIChzeW1fcG9pbnRlciwgY2FjaGVfcHRyLCBhYmZkKTsKLQlpZiAoIXRyYW5zbGF0ZV9mcm9tX25hdGl2ZV9zeW1fZmxhZ3MgKGFiZmQsIGNhY2hlX3B0cikpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JLyogZm9yIGhwdXgsIHRoZSAnbGVuZ2h0JyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxlbmd0aCBvZiAqLwotCS8qIHRoZSBzeW1ib2wgbmFtZSB3aGljaCBmb2xsb3dzIHRoZSBubGlzdCBlbnRyeS4gICAgICAgKi8KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JaWYgKGxlbmd0aCkKLQkgIHsKLQkgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCSAgICAvKiB0aGUgaHAgc3RyaW5nIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQgc28gd2UgY3JlYXRlIGEgbmV3IG9uZSovCi0JICAgIC8qIGJ5IGNvcHlpbmcgdGhlIHN0cmluZyB0byBvdmVybGFwIHRoZSBqdXN0IHZhY2F0ZWQgbmxpc3QgICAgKi8KLQkgICAgLyogc3RydWN0dXJlIGJlZm9yZSBpdCBpbiBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JICAgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSBzdHJpbmdzOwotCSAgICBtZW1jcHkgKHN0cmluZ3MsIHN5bV9wb2ludGVyICsgMSwgbGVuZ3RoKTsKLQkgICAgc3RyaW5nc1tsZW5ndGhdID0gJ1wwJzsKLQkgICAgc3RyaW5ncyArPSBsZW5ndGggKyAxOwotCSAgfQotCWVsc2UKLQkgIGNhY2hlX3B0ci0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSBOVUxMOwotCi0JLyogc2tpcCBvdmVyIHRoZSBlbWJlZGRlZCBzeW1ib2wuICovCi0Jc3ltX3BvaW50ZXIgPSAoc3RydWN0IGV4dGVybmFsX25saXN0ICopICgoKGNoYXIgKikgc3ltX3BvaW50ZXIpICsKLQkJCQkJCSBsZW5ndGgpOwotICAgICAgfQotICB9Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSBjYWNoZWQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi12b2lkCi1NWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBieXRlcywgY2FjaGVfcHRyLCBzeW1ib2xzLCBzeW1jb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpieXRlczsKLSAgICAgYXJlbGVudCAqY2FjaGVfcHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGludCByX2V4dGVybiA9IDA7Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWwgPSAwOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPnJfYWRkcmVzcyk7Ci0gIHJfaW5kZXggPSBiZmRfaF9nZXRfMTYgKGFiZmQsIGJ5dGVzLT5yX2luZGV4KTsKLQotICBzd2l0Y2ggKGJ5dGVzLT5yX3R5cGVbMF0pCi0gICAgewotICAgIGNhc2UgSFBfUlNFR01FTlRfVEVYVDoKLSAgICAgIHJfaW5kZXggPSBOX1RFWFQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0RBVEE6Ci0gICAgICByX2luZGV4ID0gTl9EQVRBOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9CU1M6Ci0gICAgICByX2luZGV4ID0gTl9CU1M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEhQX1JTRUdNRU5UX0VYVEVSTkFMOgotICAgICAgcl9leHRlcm4gPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9QQ1JFTDoKLSAgICAgIHJfZXh0ZXJuID0gMTsKLSAgICAgIHJfcGNyZWwgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9SRExUOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9SUExUOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9SU0VHTUVOVF9OT09QOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHN3aXRjaCAoYnl0ZXMtPnJfbGVuZ3RoWzBdKQotICAgIHsKLSAgICBjYXNlIEhQX1JMRU5HVEhfQllURToKLSAgICAgIHJfbGVuZ3RoID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSFBfUkxFTkdUSF9XT1JEOgotICAgICAgcl9sZW5ndGggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIUF9STEVOR1RIX0xPTkc6Ci0gICAgICByX2xlbmd0aCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgY2FjaGVfcHRyLT5ob3d0byA9IGhvd3RvX3RhYmxlX3N0ZCArIHJfbGVuZ3RoICsgNCAqIHJfcGNyZWw7Ci0gIC8qIEZJWE1FLXNvb246ICBSb2xsIGJhc2VyZWwsIGptcHRhYmxlLCByZWxhdGl2ZSBiaXRzIGludG8gaG93dG8gc2V0dGluZyAqLwotCi0gIC8qIFRoaXMgbWFjcm8gdXNlcyB0aGUgcl9pbmRleCB2YWx1ZSBjb21wdXRlZCBhYm92ZSAqLwotICBpZiAocl9wY3JlbCAmJiByX2V4dGVybikKLSAgICB7Ci0gICAgICAvKiBUaGUgR05VIGxpbmtlciBhc3N1bWVzIGFueSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2Ygc2VjdGlvbiAqLwotICAgICAgLyogaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgaW1hZ2Ugd2hpbGUgdGhlIEhQIGxpbmtlciAgKi8KLSAgICAgIC8qIGFkZHMgdGhpcyBpbiBsYXRlci4gIEFkZCBpdCBpbiBub3cuLi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBNT1ZFX0FERFJFU1MgKC1jYWNoZV9wdHItPmFkZHJlc3MpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIE1PVkVfQUREUkVTUyAoMCk7Ci0gICAgfQotfQotCi1ib29sZWFuCi1NWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBhc2VjdCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotICBiZmRfc2l6ZV90eXBlIHJlbG9jX3NpemU7Ci0gIFBUUiByZWxvY3M7Ci0gIGFyZWxlbnQgKnJlbG9jX2NhY2hlOwotICBzaXplX3QgZWFjaF9zaXplOwotICBzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICpycHRyOwotICB1bnNpZ25lZCBpbnQgY291bnRlcjsKLSAgYXJlbGVudCAqY2FjaGVfcHRyOwotCi0gIGlmIChhc2VjdC0+cmVsb2NhdGlvbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdCA9PSBvYmpfZGF0YXNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV9kcnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGlmIChhc2VjdCA9PSBvYmpfdGV4dHNlYyAoYWJmZCkpCi0gICAgewotICAgICAgcmVsb2Nfc2l6ZSA9IGV4ZWNfaGRyIChhYmZkKS0+YV90cnNpemU7Ci0gICAgICBnb3RvIGRvaXQ7Ci0gICAgfQotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLQotZG9pdDoKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhc2VjdC0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotCi0gIGNvdW50ID0gcmVsb2Nfc2l6ZSAvIGVhY2hfc2l6ZTsKLQotCi0gIHJlbG9jX2NhY2hlID0gKGFyZWxlbnQgKikgYmZkX3phbGxvYyAoYWJmZCwgKHNpemVfdCkgKGNvdW50ICogc2l6ZW9mCi0JCQkJCQkJKGFyZWxlbnQpKSk7Ci0gIGlmICghcmVsb2NfY2FjaGUgJiYgY291bnQgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmVsb2NzID0gKFBUUikgYmZkX2FsbG9jIChhYmZkLCByZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY3MgJiYgcmVsb2Nfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jX2NhY2hlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcnB0ciA9IChzdHJ1Y3QgaHAzMDBocHV4X3JlbG9jICopIHJlbG9jczsKLSAgY291bnRlciA9IDA7Ci0gIGNhY2hlX3B0ciA9IHJlbG9jX2NhY2hlOwotCi0gIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLSAgICB7Ci0gICAgICBNWSAoc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkgICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSk7Ci0gICAgfQotCi0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGlkZW50aWNhbCB0byBmdW5jdGlvbnMgaW4gYW91dHguaCBleGNlcHQgKi8KLS8qIHRoZXkgcmVmZXIgdG8gTVkoZnVuYykgcmF0aGVyIHRoYW4gTkFNRShhb3V0LGZ1bmMpIGFuZCB0aGV5IGFsc28gICAgICovCi0vKiBjYWxsIGFvdXRfMzIgdmVyc2lvbnMgaWYgdGhlIGlucHV0IGZpbGUgd2FzIGdlbmVyYXRlZCBieSBnY2MgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbG9uZyBhb3V0XzMyX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICogYWJmZCwgYXN5bWJvbCAqKiBsb2NhdGlvbikpOwotbG9uZyBhb3V0XzMyX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1sb25nIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIFBBUkFNUyAoKGJmZCAqIGFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkJIGFyZWxlbnQgKiogcmVscHRyLAotCQkJCQkgYXN5bWJvbCAqKiBzeW1ib2xzKSk7Ci0KLWxvbmcKLU1ZIChnZXRfc3ltdGFiKSAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gIGFvdXRfc3ltYm9sX3R5cGUgKnN5bWJhc2U7Ci0KLSAgaWYgKG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPT0gZ251X2VuY2FwX2Zvcm1hdCkKLSAgICByZXR1cm4gYW91dF8zMl9nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbik7Ci0KLSAgaWYgKCFNWSAoc2x1cnBfc3ltYm9sX3RhYmxlKSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoc3ltYmFzZSA9IG9ial9hb3V0X3N5bWJvbHMgKGFiZmQpOyBjb3VudGVyKysgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTspCi0gICAgKihsb2NhdGlvbisrKSA9IChhc3ltYm9sICopIChzeW1iYXNlKyspOwotICAqbG9jYXRpb24rKyA9IDA7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotbG9uZwotTVkgKGdldF9zeW10YWJfdXBwZXJfYm91bmQpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmICghTVkgKHNsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiAoc2l6ZW9mIChhb3V0X3N5bWJvbF90eXBlICopKTsKLX0KLQotCi0KLQotbG9uZwotTVkgKGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGlmIChvYmpfYW91dF9zdWJmb3JtYXQgKGFiZmQpID09IGdudV9lbmNhcF9mb3JtYXQpCi0gICAgcmV0dXJuIGFvdXRfMzJfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpOwotCi0gIGlmICghKHRibHB0ciB8fCBNWSAoc2x1cnBfcmVsb2NfdGFibGUpIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikKLSAgICB7Ci0gICAgICBhcmVsZW50X2NoYWluICpjaGFpbiA9IHNlY3Rpb24tPmNvbnN0cnVjdG9yX2NoYWluOwotICAgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGNvdW50KyspCi0JewotCSAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0JICBjaGFpbiA9IGNoYWluLT5uZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLQl7Ci0JICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLQl9Ci0gICAgfQotICAqcmVscHRyID0gMDsKLQotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaHBwYV9zdHVicy5oIGIvYmZkL2hwcGFfc3R1YnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OTNlOC4uMDAwMDAwMAotLS0gYS9iZmQvaHBwYV9zdHVicy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogSFBQQSBsaW5rZXIgc3R1YiBpbnN0cnVjdGlvbnMgICovCi0KLS8qIFRoZXNlIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIHdoaWNoIHRoZSBsaW5rZXIgbWF5IGluc2VydCBpbnRvIHRoZQotICAgY29kZSBzdHJlYW0gd2hlbiBidWlsZGluZyBmaW5hbCBleGVjdXRhYmxlcyB0byBoYW5kbGUgb3V0LW9mLXJhbmdlCi0gICBjYWxscyBhbmQgYXJndW1lbnQgcmVsb2NhdGlvbnMuICAqLwotCi0jZGVmaW5lIExET19NNF9SMzFfUjMxCQkweDM3ZmYzZmY5CS8qIGxkbyAtNCglcjMxKSwlcjMxCSAgKi8KLSNkZWZpbmUgTERJTF9SMQkJCTB4MjAyMDAwMDAJLyogbGRpbCBYWFgsJXIxCQkgICovCi0jZGVmaW5lIEJFX1NSNF9SMQkJMHhlMDIwMjAwMAkvKiBiZSBYWFgoJXNyNCwlcjEpCSAgKi8KLSNkZWZpbmUgQ09QWV9SMzFfUjIgICAgICAgICAgCTB4MDgxZjAyNDIJLyogY29weSAlcjMxLCVyMgkgICovCi0jZGVmaW5lIEJMRV9TUjRfUjAJCTB4ZTQwMDIwMDAJLyogYmxlIFhYWCglc3I0LCVyMCkJICAqLwotI2RlZmluZSBCTEVfU1I0X1IxCQkweGU0MjAyMDAwCS8qIGJsZSBYWFgoJXNyNCwlcjEpCSAgKi8KLSNkZWZpbmUgQlZfTl8wX1IzMQkJMHhlYmUwYzAwMgkvKiBidixuIDAoJXIzMSkJCSAgKi8KLSNkZWZpbmUgU1RXX1IzMV9NOFIzMAkJMHg2YmRmM2ZmMQkvKiBzdHcgJXIzMSwtOCglcjMwKQkgICovCi0jZGVmaW5lIExEV19NOFIzMF9SMzEJCTB4NGJkZjNmZjEJLyogbGR3IC04KCVyMzApLCVyMzEJICAqLwotI2RlZmluZSBTVFdfQVJHX00xNlIzMAkJMHg2YmMwM2ZlMQkvKiBzdHcgJWFyZ1gsLTE2KCVyMzApCSAgKi8KLSNkZWZpbmUgTERXX00xNlIzMF9BUkcJCTB4NGJjMDNmZTEJLyogbGR3IC0xMiglcjMwKSwlYXJnWAkgICovCi0jZGVmaW5lIFNUV19BUkdfTTEyUjMwCQkweDZiYzAzZmU5CS8qIHN0dyAlYXJnWCwtMTYoJXIzMCkJICAqLwotI2RlZmluZSBMRFdfTTEyUjMwX0FSRwkJMHg0YmMwM2ZlOQkvKiBsZHcgLTEyKCVyMzApLCVhcmdYCSAgKi8KLSNkZWZpbmUgRlNUV19GQVJHX00xNlIzMAkweDI3YzExMjAwCS8qIGZzdHdzICVmYXJnWCwtMTYoJXIzMCkgKi8KLSNkZWZpbmUgRkxEV19NMTZSMzBfRkFSRwkweDI3YzExMDAwCS8qIGZsZHdzIC0xNiglcjMwKSwlZmFyZ1ggKi8KLSNkZWZpbmUgRlNURF9GQVJHX00xNlIzMAkweDJmYzExMjAwCS8qIGZzdGRzICVmYXJnWCwtMTYoJXIzMCkgKi8KLSNkZWZpbmUgRkxERF9NMTZSMzBfRkFSRwkweDJmYzExMDAwCS8qIGZsZGRzIC0xNiglcjMwKSwlZmFyZ1ggKi8KZGlmZiAtLWdpdCBhL2JmZC9ocHBhYnNkLWNvcmUuYyBiL2JmZC9ocHBhYnNkLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjMjJmNS4uMDAwMDAwMAotLS0gYS9iZmQvaHBwYWJzZC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUFBBIEJTRCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0gICBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotICAgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LiAKLQotICAgVGhlIGNvcmUgZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBVdGFoIDQuM0JTRCBhbmQgT1NGMSBwb3J0cyBvbiB0aGUKLSAgIFBBIGlzIGEgbWl4IGJldHdlZW4gdHJhZGl0aW9uYWwgY29yZXMgYW5kIGhwdXggY29yZXMgLS0ganVzdAotICAgZGlmZmVyZW50IGVub3VnaCB0aGF0IHN1cHBvcnRpbmcgdGhpcyBmb3JtYXQgd291bGQgdGVuZCB0byBhZGQKLSAgIGdyb3NzIGhhY2tzIHRvIHRyYWQtY29yZS5jIG9yIGhwdXgtY29yZS5jLiAgU28gaW5zdGVhZCB3ZSBrZWVwIGFueQotICAgZ3Jvc3MgaGFja3MgaXNvbGF0ZWQgdG8gdGhpcyBmaWxlLiAgKi8KLSAgIAotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFBQQS1CU0Qgc3R5bGUKLSAgIGNvcmUgZmlsZXMuCi0KLSAgIEkgd291bGQgbm90IGV4cGVjdCB0aGlzIHRvIGJlIG9mIHVzZSB0byBhbnkgb3RoZXIgaG9zdC90YXJnZXQsIGJ1dAotICAgeW91IG5ldmVyIGtub3cuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFCU0QpCi0KLSNpbmNsdWRlICJtYWNoaW5lL3ZtcGFyYW0uaCIKLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN5cy9kaXIuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLXN0YXRpYyBhc2VjdGlvbiAqbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIENPTlNUIGNoYXIgKiwKLQkJCQkJICAgIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotCQkJCQkgICAgZmlsZV9wdHIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGFzeW1ib2wgKmhwcGFic2RfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKmhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGhwcGFic2RfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgYmZkJ3MgdGRhdGEuICAqLwotCi1zdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdAotICB7Ci0gICAgaW50IHNpZzsKLSAgICBjaGFyIGNtZFtNQVhDT01MRU4gKyAxXTsKLSAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuaHBwYWJzZF9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKGNvcmVfaGRyKGJmZCktPmRhdGFfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9zdGFja3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5zdGFja19zZWN0aW9uKQotI2RlZmluZSBjb3JlX3JlZ3NlYyhiZmQpIChjb3JlX2hkcihiZmQpLT5yZWdfc2VjdGlvbikKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCBvZmZzZXQsIGFsaWdubWVudF9wb3dlcikKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT5maWxlcG9zID0gb2Zmc2V0OwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gYWxpZ25tZW50X3Bvd2VyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotaHBwYWJzZF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWhwcGFic2RfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBzdHJ1Y3QgdXNlciB1OwotICBzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCAqY29yZWRhdGE7Ci0gIGludCBjbGlja3N6OwotCi0gIC8qIFRyeSB0byByZWFkIGluIHRoZSB1LWFyZWEuICBXZSB3aWxsIG5lZWQgaW5mb3JtYXRpb24gZnJvbSB0aGlzCi0gICAgIHRvIGtub3cgaG93IHRvIGdyb2sgdGhlIHJlc3Qgb2YgdGhlIGNvcmUgc3RydWN0dXJlcy4gICovCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmdSwgMSwgc2l6ZW9mIHUsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiB1KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBHZXQgdGhlIHBhZ2Ugc2l6ZSBvdXQgb2YgdGhlIHUgc3RydWN0dXJlLiAgVGhpcyB3aWxsIGJlIGRpZmZlcmVudAotICAgICBmb3IgUEEgMS4wIG1hY2hpbmVzIGFuZCBQQSAxLjEgbWFjaGluZXMuICAgWXVrISAgKi8KLSAgY2xpY2tzeiA9IHUudV9wY2IucGNiX3Bnc3o7Ci0KLSAgLyogY2xpY2tzeiBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvID49IDJrLiAgKi8KLSAgaWYgKGNsaWNrc3ogPCAweDgwMAotICAgICAgfHwgY2xpY2tzeiAhPSAoY2xpY2tzeiAmIC1jbGlja3N6KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gIC8qIFNhbml0eSBjaGVja3MuICBNYWtlIHN1cmUgdGhlIHNpemUgb2YgdGhlIGNvcmUgZmlsZSBtYXRjaGVzIHRoZQotICAgICB0aGUgc2l6ZSBjb21wdXRlZCBmcm9tIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgY29yZSBpdHNlbGYuICAqLwotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwgZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIGlmIChOQlBHICogKFVQQUdFUyArIHUudV9kc2l6ZSArIHUudV9zc2l6ZSkgPiBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICBpZiAoY2xpY2tzeiAqIChVUEFHRVMgKyB1LnVfZHNpemUgKyB1LnVfc3NpemUpIDwgc3RhdGJ1Zi5zdF9zaXplKQotICAgICAgewotCS8qIFRoZSBmaWxlIGlzIHRvbyBiaWcuICBNYXliZSBpdCdzIG5vdCBhIGNvcmUgZmlsZQotCSAgIG9yIHdlIG90aGVyd2lzZSBoYXZlIGJhZCB2YWx1ZXMgZm9yIHVfZHNpemUgYW5kIHVfc3NpemUpLiAgKi8KLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIGNvcmVkYXRhID0gKHN0cnVjdCBocHBhYnNkX2NvcmVfc3RydWN0ICopCi0gICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaHBwYWJzZF9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVkYXRhKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIE1ha2UgdGhlIGNvcmUgZGF0YSBhbmQgYXZhaWxhYmxlIHZpYSB0aGUgdGRhdGEgcGFydCBvZiB0aGUgQkZELiAgKi8KLSAgYWJmZC0+dGRhdGEuaHBwYWJzZF9jb3JlX2RhdGEgPSBjb3JlZGF0YTsKLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCkgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5zdGFjayIsCi0JCQkJCSAgIFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgIGNsaWNrc3ogKiB1LnVfc3NpemUsCi0JCQkJCSAgIE5CUEcgKiAoVVNJWkUgKyBLU1RBS1NJWkUpIAotCQkJCQkgICAgICsgY2xpY2tzeiAqIHUudV9kc2l6ZSwgMik7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBVU1JTVEFDSzsgCi0KLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCQkgIFNFQ19BTExPQyArIFNFQ19MT0FECi0JCQkJCSAgICArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJCSAgY2xpY2tzeiAqIHUudV9kc2l6ZSwKLQkJCQkJICBOQlBHICogKFVTSVpFICsgS1NUQUtTSVpFKSwgMik7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IFVEQVRBU0VHOwotCi0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkJCSBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCQkgS1NUQUtTSVpFICogTkJQRywKLQkJCQkJIE5CUEcgKiBVU0laRSwgMik7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+dm1hID0gMDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCB1LnVfY29tbSwgTUFYQ09NTEVOICsgMSk7Ci0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IHUudV9jb2RlOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIGNoYXIgKgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfY29tbWFuZCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgaW50Ci1ocHBhYnNkX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotaHBwYWJzZF9jb3JlX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIC8qIFRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cgdGhpcy4uLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgXAotICBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwcGFic2RfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHBhYnNkX2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHBwYWJzZF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHBhYnNkX2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQgKCkKLXsKLSAgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwLiAgKi8KLSAgYWJvcnQgKCk7CQotfQotCi0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGhwcGFic2RfY29yZV92ZWMgPQotICB7Ci0gICAgImhwcGFic2QtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBocHBhYnNkX2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChocHBhYnNkX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChocHBhYnNkX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9ocHV4LWNvcmUuYyBiL2JmZC9ocHV4LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlNzA5Zi4uMDAwMDAwMAotLS0gYS9iZmQvaHB1eC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBIUC9VWCBjb3JlIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4sIEN5Z251cyBTdXBwb3J0LgotICAgQ29udmVydGVkIHRvIGJhY2stZW5kIGZvcm0gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNVcHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gc3lzdGVtcyB3aGljaCB1c2UgSFAvVVggc3R5bGUKLSAgIGNvcmUgZmlsZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSB8fCBkZWZpbmVkIChIT1NUX0hQMzAwSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBTVBFSVgpCi0KLS8qIEZJWE1FOiBzeXMvY29yZS5oIGRvZXNuJ3QgZXhpc3QgZm9yIEhQVVggdmVyc2lvbiA3LiAgSFBVWCB2ZXJzaW9uCi0gICA1LCA2LCBhbmQgNyBjb3JlIGZpbGVzIHNlZW0gdG8gYmUgc3RhbmRhcmQgdHJhZC1jb3JlLmMgdHlwZSBjb3JlCi0gICBmaWxlczsgY2FuIHdlIGp1c3QgdXNlIHRyYWQtY29yZS5jIGluIGFkZGl0aW9uIHRvIHRoaXMgZmlsZT8gICovCi0KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0KLSNlbmRpZiAvKiBIT1NUX0hQUEFIUFVYICovCi0KLSNpZmRlZiBIT1NUX0hQUEFCU0QKLQotLyogTm90IGEgdmVyeSBzd2lmdCBwbGFjZSB0byBwdXQgaXQsIGJ1dCB0aGF0J3Mgd2hlcmUgdGhlIEJTRCBwb3J0Ci0gICBwdXRzIHRoZW0uICAqLwotI2luY2x1ZGUgIi9ocHV4L3Vzci9pbmNsdWRlL3N5cy9jb3JlLmgiCi0KLSNlbmRpZiAvKiBIT1NUX0hQUEFCU0QgKi8KLQotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2lmZGVmIEhBVkVfRElSRU5UX0gKLSMgaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX1NZU19ORElSX0gKLSMgIGluY2x1ZGUgPHN5cy9uZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfU1lTX0RJUl9ICi0jICBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGVuZGlmCi0jIGlmZGVmIEhBVkVfTkRJUl9ICi0jICBpbmNsdWRlIDxuZGlyLmg+Ci0jIGVuZGlmCi0jZW5kaWYKLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy91c2VyLmg+CQkvKiBBZnRlciBhLm91dC5oICAqLwotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0KLS8qIEtsdWRnZTogVGhlcmUncyBubyBleHBsaWNpdCBtZWNoYW5pc20gcHJvdmlkZWQgYnkgc3lzL2NvcmUuaCB0bwotICAgY29uZGl0aW9uYWxseSBrbm93IHdoZXRoZXIgYSBwcm9jX2luZm8gaGFzIHRocmVhZCBpZCBmaWVsZHMuCi0gICBIb3dldmVyLCBDT1JFX0FOT05fU0hNRU0gc2hvd3MgdXAgZmlyc3QgYXQgMTAuMzAsIHdoaWNoIGlzCi0gICBoYXBwaWx5IGFsc28gd2hlbiBtZWFuaW5nZnVsIHRocmVhZCBpZCdzIHNob3cgdXAgaW4gcHJvY19pbmZvLiAqLwotI2lmIGRlZmluZWQoQ09SRV9BTk9OX1NITUVNKQotI2RlZmluZSBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCAoMSkKLSNlbmRpZgotCi0vKiBUaGlzIHR5cGUgYXBwZWFycyBhdCBIUC1VWCAxMC4zMC4gIERlZmluaW5nIGl0IGlmIG5vdCBkZWZpbmVkCi0gICBieSBzeXMvY29yZS5oIGFsbG93cyB1cyB0byBidWlsZCBmb3Igb2xkZXIgSFAtVVgncywgYW5kIChzaW5jZQotICAgaXQgd29uJ3QgYmUgZW5jb3VudGVyZWQgaW4gY29yZS1kdW1wcyBmcm9tIG9sZGVyIEhQLVVYJ3MpIGlzCi0gICBoYXJtbGVzcy4gKi8KLSNpZiAhZGVmaW5lZChDT1JFX0FOT05fU0hNRU0pCi0jZGVmaW5lIENPUkVfQU5PTl9TSE1FTSAweDAwMDAwMjAwICAgICAgICAgLyogYW5vbnltb3VzIHNoYXJlZCBtZW1vcnkgKi8KLSNlbmRpZgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi0vKiAubHdwaWQgYW5kIC51c2VyX3RpZCBhcmUgb25seSB2YWxpZCBpZiBQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCwgZWxzZSB0aGV5Ci0gICBhcmUgc2V0IHRvIDAuICBBbHNvLCB1bnRpbCBIUC1VWCBpbXBsZW1lbnRzIE14TiB0aHJlYWRzLCAudXNlcl90aWQgYW5kCi0gICAubHdwaWQgYXJlIHN5bm9ueW1vdXMuICovCi1zdHJ1Y3QgaHB1eF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgaW50IGx3cGlkOyAgICAgICAgICAgICAgIC8qIEtlcm5lbCB0aHJlYWQgSUQuICovCi0gIHVuc2lnbmVkIGxvbmcgdXNlcl90aWQ7ICAvKiBVc2VyIHRocmVhZCBJRC4gKi8KLSAgY2hhciBjbWRbTUFYQ09NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5ocHV4X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotI2RlZmluZSBjb3JlX2tlcm5lbF90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+bHdwaWQpCi0jZGVmaW5lIGNvcmVfdXNlcl90aHJlYWRfaWQoYmZkKSAoY29yZV9oZHIoYmZkKS0+dXNlcl90aWQpCi0KLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgYWxpZ25tZW50X3Bvd2VyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnRfcG93ZXI7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKTsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGFsaWdubWVudF9wb3dlcjsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWhwdXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXcgPSAoYXN5bWJvbCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLSAgaWYgKG5ldykKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gYnVpbGRzIGEgYmZkIHRhcmdldCBpZiB0aGUgZmlsZSBpcyBhIGNvcmVmaWxlLgotICAgSXQgcmV0dXJucyBudWxsIG9yIDAgaWYgaXQgZmluZHMgb3V0IHRoYWF0IGl0IGlzIG5vdCBhIGNvcmUgZmlsZS4KLSAgIFRoZSB3YXkgaXQgY2hlY2tzIHRoaXMgaXMgYnkgbG9va2luZyBmb3IgYWxsb3dlZCAndHlwZScgZmllbGQgdmFsdWVzLgotICAgVGhlc2UgYXJlIGRlY2xhcmVkIGluIHN5cy9jb3JlLmgKLSAgIFRoZXJlIGFyZSBzb21lIHZhbHVlcyB3aGljaCBhcmUgJ3Jlc2VydmVkIGZvciBmdXR1cmUgdXNlJy4gSW4gcGFydGljdWxhcgotICAgQ09SRV9OT05FIGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgMC4gVGhpcyBtYXkgYmUgYSBjYXRjaC1hbGwgZm9yIGNhc2VzCi0gICBpbiB3aGljaCB0aGUgY29yZSBmaWxlIGlzIGdlbmVyYXRlZCBieSBzb21lIG5vbi1ocHV4IGFwcGxpY2F0aW9uLgotICAgKEkgYW0ganVzdCBndWVzc2luZyBoZXJlISkKLSovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1ocHV4X2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50ICBnb29kX3NlY3Rpb25zID0gMDsKLSAgaW50ICB1bmtub3duX3NlY3Rpb25zID0gMDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IGhwdXhfY29yZV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBocHV4X2NvcmVfc3RydWN0KSk7Ci0gIGlmICghY29yZV9oZHIgKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB2YWw7Ci0gICAgICBzdHJ1Y3QgY29yZWhlYWQgY29yZV9oZWFkZXI7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSAmY29yZV9oZWFkZXIsIDEsIHNpemVvZiBjb3JlX2hlYWRlciwgYWJmZCk7Ci0gICAgICBpZiAodmFsIDw9IDApCi0JYnJlYWs7Ci0gICAgICBzd2l0Y2ggKGNvcmVfaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgQ09SRV9LRVJORUw6Ci0JY2FzZSBDT1JFX0ZPUk1BVDoKLQkgIGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKTsJLyogSnVzdCBza2lwIHRoaXMgKi8KLSAgICAgICAgICBnb29kX3NlY3Rpb25zKys7Ci0JICBicmVhazsKLQljYXNlIENPUkVfRVhFQzoKLQkgIHsKLQkgICAgc3RydWN0IHByb2NfZXhlYyBwcm9jX2V4ZWM7Ci0JICAgIGlmIChiZmRfcmVhZCAoKHZvaWQgKikgJnByb2NfZXhlYywgMSwgY29yZV9oZWFkZXIubGVuLCBhYmZkKQotCQkhPSBjb3JlX2hlYWRlci5sZW4pCi0JICAgICAgYnJlYWs7Ci0JICAgIHN0cm5jcHkgKGNvcmVfY29tbWFuZCAoYWJmZCksIHByb2NfZXhlYy5jbWQsIE1BWENPTUxFTiArIDEpOwotICAgICAgICAgICAgZ29vZF9zZWN0aW9ucysrOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFX1BST0M6Ci0JICB7Ci0JICAgIHN0cnVjdCBwcm9jX2luZm8gcHJvY19pbmZvOwotCSAgICBjaGFyICBzZWNuYW1lWzEwMF07ICAvKiBPZiBhcmJpdHJhcnkgc2l6ZSwgYnV0IHBsZW50eSBsYXJnZS4gKi8KLQotICAgICAgICAgICAgLyogV2UgbmVlZCB0byByZWFkIHRoaXMgc2VjdGlvbiwgJ2NhdXNlIHdlIG5lZWQgdG8gZGV0ZXJtaW5lCi0gICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBjb3JlLWR1bXBlZCBhcHAgd2FzIHRocmVhZGVkIGJlZm9yZSB3ZSBjcmVhdGUKLSAgICAgICAgICAgICAgIGFueSAucmVnIHNlY3Rpb25zLiAqLwotCSAgICBpZiAoYmZkX3JlYWQgKCZwcm9jX2luZm8sIDEsIGNvcmVfaGVhZGVyLmxlbiwgYWJmZCkKLQkJIT0gY29yZV9oZWFkZXIubGVuKQotCSAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIC8qIEhvd2V2ZXIsIHdlIGFsc28gd2FudCB0byBjcmVhdGUgdGhvc2Ugc2VjdGlvbnMgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgZmlsZSBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVjb3JkLCBpdCBzZWVtcy4gKi8KLSAgICAgICAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgLWNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpICE9IDApCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0jaWYgZGVmaW5lZChQUk9DX0lORk9fSEFTX1RIUkVBRF9JRCkKLSAgICAgICAgICAgIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPSBwcm9jX2luZm8ubHdwaWQ7Ci0gICAgICAgICAgICBjb3JlX3VzZXJfdGhyZWFkX2lkIChhYmZkKSA9IHByb2NfaW5mby51c2VyX3RpZDsKLSNlbHNlCi0gICAgICAgICAgICBjb3JlX2tlcm5lbF90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSAgICAgICAgICAgIGNvcmVfdXNlcl90aHJlYWRfaWQgKGFiZmQpID0gMDsKLSNlbmRpZgotICAgICAgICAgICAgLyogSWYgdGhlIHByb2dyYW0gd2FzIHVudGhyZWFkZWQsIHRoZW4gd2UnbGwganVzdCBjcmVhdGUgYQotICAgICAgICAgICAgICAgLnJlZyBzZWN0aW9uLgotCi0gICAgICAgICAgICAgICBJZiB0aGUgcHJvZ3JhbSB3YXMgdGhyZWFkZWQsIHRoZW4gd2UnbGwgY3JlYXRlIC5yZWcvWFhYWFgKLSAgICAgICAgICAgICAgIHNlY3Rpb24gZm9yIGVhY2ggdGhyZWFkLCB3aGVyZSBYWFhYWCBpcyBhIHByaW50YWJsZQotICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIGtlcm5lbCB0aHJlYWQgaWQuICBXZSdsbCBhbHNvCi0gICAgICAgICAgICAgICBjcmVhdGUgYSAucmVnIHNlY3Rpb24gZm9yIHRoZSB0aHJlYWQgdGhhdCB3YXMgcnVubmluZwotICAgICAgICAgICAgICAgYW5kIHNpZ25hbGxlZCBhdCB0aGUgdGltZSBvZiB0aGUgY29yZS1kdW1wIChpLmUuLCB0aGlzCi0gICAgICAgICAgICAgICBpcyBlZmZlY3RpdmVseSBhbiBhbGlhcywgbmVlZGVkIHRvIGtlZXAgR0RCIGhhcHB5LikKLQotICAgICAgICAgICAgICAgTm90ZSB0aGF0IHdlIHVzZSBgLnJlZy9YWFhYWCcgYXMgb3Bwb3NlZCB0byAnLnJlZ1hYWFhYJwotICAgICAgICAgICAgICAgYmVjYXVzZSBHREIgZXhwZWN0cyB0aGF0IC5yZWcyIHdpbGwgYmUgdGhlIGZsb2F0aW5nLQotICAgICAgICAgICAgICAgcG9pbnQgcmVnaXN0ZXJzLiAqLwotICAgICAgICAgICAgaWYgKGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkgPT0gMCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVfaGVhZGVyLmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAmcHJvY19pbmZvIC0gKGludCkgJiBwcm9jX2luZm8uaHdfcmVncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGVyZSBhcmUgdGhyZWFkcy4gIElzIHRoaXMgdGhlIG9uZSB0aGF0IGNhdXNlZCB0aGUKLSAgICAgICAgICAgICAgICAgICBjb3JlLWR1bXA/ICBXZSdsbCBjbGFpbSBpdCB3YXMgdGhlIHJ1bm5pbmcgdGhyZWFkLiAqLwotICAgICAgICAgICAgICAgIGlmIChwcm9jX2luZm8uc2lnICE9IC0xKQotICAgICAgICAgICAgICAgICAgewotCQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkJCQkgICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkJICAgIGNvcmVfaGVhZGVyLmxlbiwKLQkJCQkJICAgIChpbnQpICZwcm9jX2luZm8gLSAoaW50KSAmIHByb2NfaW5mby5od19yZWdzLAotCQkJCQkgICAgMikpCi0JCSAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIFdlIGFsd2F5cyBtYWtlIG9uZSBvZiB0aGVzZSBzZWN0aW9ucywgZm9yIGV2ZXJ5IHRocmVhZC4gKi8KLSAgICAgICAgICAgICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIGNvcmVfa2VybmVsX3RocmVhZF9pZCAoYWJmZCkpOwotICAgICAgICAgICAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX0hBU19DT05URU5UUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlX2hlYWRlci5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgJnByb2NfaW5mbyAtIChpbnQpICYgcHJvY19pbmZvLmh3X3JlZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikpCi0gICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgfQotCSAgICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBwcm9jX2luZm8uc2lnOwotICAgICAgICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3JlX2hlYWRlci5sZW4sIFNFRUtfQ1VSKSAhPSAwKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX0RBVEE6Ci0JY2FzZSBDT1JFX1NUQUNLOgotCWNhc2UgQ09SRV9URVhUOgotCWNhc2UgQ09SRV9NTUY6Ci0JY2FzZSBDT1JFX1NITToKLQljYXNlIENPUkVfQU5PTl9TSE1FTToKLQkgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsCi0JCQkJICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkJICBjb3JlX2hlYWRlci5sZW4sIGNvcmVfaGVhZGVyLmFkZHIsIDIpKQotCSAgICByZXR1cm4gTlVMTDsKLQotCSAgYmZkX3NlZWsgKGFiZmQsIGNvcmVfaGVhZGVyLmxlbiwgU0VFS19DVVIpOwotICAgICAgICAgIGdvb2Rfc2VjdGlvbnMrKzsKLQkgIGJyZWFrOwotCi0JY2FzZSBDT1JFX05PTkU6Ci0gICAgICAgICAgLyogTGV0J3Mgbm90IHB1bnQgaWYgd2UgZW5jb3VudGVyIGEgc2VjdGlvbiBvZiB1bmtub3duCi0gICAgICAgICAgICAgdHlwZS4gIFJhdGhlciwgbGV0J3MgbWFrZSBhIG5vdGUgb2YgaXQuICBJZiB3ZSBsYXRlcgotICAgICAgICAgICAgIHNlZSB0aGF0IHRoZXJlIHdlcmUgYWxzbyAiZ29vZCIgc2VjdGlvbnMsIHRoZW4gd2UnbGwKLSAgICAgICAgICAgICBkZWNsYXJlIHRoYXQgdGhpcyBhIGNvcmUgZmlsZSwgYnV0IHdlJ2xsIGFsc28gd2FybiB0aGF0Ci0gICAgICAgICAgICAgaXQgbWF5IGJlIGluY29tcGF0aWJsZSB3aXRoIHRoaXMgZ2RiLgotICAgICAgICAgICAgICovCi0JICB1bmtub3duX3NlY3Rpb25zKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgCi0gICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsgLyp1bnJlY29nbml6ZWQgY29yZSBmaWxlIHR5cGUgKi8KLQl9Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIFdlcmUgdGhlcmUgc2VjdGlvbnMgb2YgdW5rbm93biB0eXBlPyAgSWYgc28sIHlldCB0aGVyZSB3ZXJlCi0gICAgIGF0IGxlYXN0IHNvbWUgY29tcGxldGUgc2VjdGlvbnMgb2Yga25vd24gdHlwZSwgdGhlbiwgaXNzdWUKLSAgICAgYSB3YXJuaW5nLiAgUG9zc2libHkgdGhlIGNvcmUgZmlsZSB3YXMgZ2VuZXJhdGVkIG9uIGEgdmVyc2lvbgotICAgICBvZiBIUC1VWCB0aGF0IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoYXQgZm9yIHdoaWNoIHRoaXMgZ2RiIHdhcwotICAgICBidWlsdC4KLSAgICAgKi8KLSAgaWYgKCh1bmtub3duX3NlY3Rpb25zID4gMCkgJiYgKGdvb2Rfc2VjdGlvbnMgPiAwKSkKLSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICgiJXMgYXBwZWFycyB0byBiZSBhIGNvcmUgZmlsZSxcbmJ1dCBjb250YWlucyB1bmtub3duIHNlY3Rpb25zLiAgSXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIG9uIGFuIGluY29tcGF0aWJsZVxudmVyc2lvbiBvZiBIUC1VWC4gIEFzIGEgcmVzdWx0LCBzb21lIGluZm9ybWF0aW9uIG1heSBiZSB1bmF2YWlsYWJsZS5cbiIsCi0gICAgICAgYWJmZC0+ZmlsZW5hbWUpOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1ocHV4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLWhwdXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1ocHV4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotI2RlZmluZSBocHV4X2NvcmVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIGhwdXhfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgaHB1eF9jb3JlX3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIFwKLSAgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaHB1eF9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBocHV4X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaHB1eF9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgaHB1eF9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBocHV4X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAiaHB1eC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIGhwdXhfY29yZV9jb3JlX2ZpbGVfcAkvKiBhIGNvcmUgZmlsZSAqLwotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGhwdXhfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YW91dC5jIGIvYmZkL2kzODZhb3V0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjJjZmYuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZhb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhlIG9ubHkgMzg2IGFvdXQgc3lzdGVtIHdlIGhhdmUgaGVyZSBpcyBHTzMyIGZyb20gREouIAotICAgVGhlc2UgbnVtYmVycyBtYWtlIEJGRCB3b3JrIHdpdGggdGhhdC4gSWYgeW91ciBhb3V0IDM4NiBzeXN0ZW0KLSAgIGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlLCB3ZSdsbCBoYXZlIHRvIHNwbGl0IHRoZW0gaW50byBkaWZmZXJlbnQKLSAgIGZpbGVzLiAgU2VuZCBtZSAoc2FjQGN5Z251cy5jb20pIHRoZSBydW5lcyB0byBtYWtlIGl0IHdvcmsgb24geW91cgotICAgc3lzdGVtLCBhbmQgSSdsbCBzdGljayBpdCBpbiBmb3IgdGhlIG5leHQgcmVsZWFzZS4gICovCi0KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE5fVFhUT0ZGKHgpIDB4MjAKLSNkZWZpbmUgTl9UWFRBRERSKHgpIChOX01BR0lDKHgpPT1aTUFHSUMgPyAweDEwMjAgOiAwKQotCi0jZGVmaW5lIE5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKLSNpZiAwCi0jZGVmaW5lIE5fREFUQUREUih4KSAoTl9NQUdJQyh4KT09T01BR0lDPyAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpIDogKFNFR01FTlRfU0laRSArICgoMHgxMDIwKyh4KS5hX3RleHQtMSkgJiB+KFNFR01FTlRfU0laRS0xKSkpKQotI2RlZmluZSBOT1NVQkVYRUNCCi0KLSNlbmRpZgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIDB4NDAwMDAwCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0KLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2YW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYiCi0jZGVmaW5lIE5PX1dSSVRFX0hFQURFUl9LTFVER0UgMQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pMzg2YW91dF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTIChhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIGkzODZhb3V0X3dyaXRlX29iamVjdF9jb250ZW50cwotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpKCk7Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVkoc2V0X3NpemVzKSwKLSAgMSwJCQkJLyogZXhlYyBoZWFkZXIgbm90IGNvdW50ZWQgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2YnNkLmMgYi9iZmQvaTM4NmJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI4ZmUzLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgQlNELgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZGF0YSBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGZvcm1hdCB1c2VkIHVuZGVyIGFsbCB0aGUgdmFyaW91cwotICAgQlNEIHBvcnRzIGZvciAzODYgbWFjaGluZXMuICAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotCi0vKiBaTUFHSUMgZmlsZXMgbmV2ZXIgaGF2ZSB0aGUgaGVhZGVyIGluIHRoZSB0ZXh0LiAgKi8KLSNkZWZpbmUJTl9IRUFERVJfSU5fVEVYVCh4KQkwCi0KLS8qIFpNQUdJQyBmaWxlcyBzdGFydCBhdCBhZGRyZXNzIDAuICBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIFFNQUdJQy4gICovCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lCVNFR01FTlRfU0laRQlUQVJHRVRfUEFHRV9TSVpFCi0KLSNkZWZpbmUJREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmJzZF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LWkzODYtYnNkIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2ZHluaXguYyBiL2JmZC9pMzg2ZHluaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1MGExNC4uMDAwMDAwMAotLS0gYS9iZmQvaTM4NmR5bml4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgZHluaXguCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBCRkQgaXMgY3VycmVudGx5IG9ubHkgdGVzdGVkIHdpdGggZ2RiLCB3cml0aW5nIG9iamVjdCBmaWxlcwotICAgbWF5IG5vdCB3b3JrLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2luY2x1ZGUgImFvdXQvZHluaXgzLmgiCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fMzg2IHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmR5bml4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1keW5peCIKLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMoaTM4NmR5bml4LF8zMl8seSkKLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0jZGVmaW5lIE5BTUVfc3dhcF9leGVjX2hlYWRlcl9pbiBOQU1FKGkzODZkeW5peF8zMl8sc3dhcF9leGVjX2hlYWRlcl9pbikKLSNkZWZpbmUgTVlfZ2V0X3NlY3Rpb25fY29udGVudHMgYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cwotCi0vKiBhb3V0eC5oIHJlcXVpcmVzIGRlZmluaXRpb25zIGZvciBOTUFHSUMsIEJNQUdJQyBhbmQgUU1BR0lDLiAgKi8KLSNkZWZpbmUgTk1BR0lDIDAKLSNkZWZpbmUgQk1BR0lDIE9NQUdJQwotI2RlZmluZSBRTUFHSUMgWE1BR0lDCi0KLSNpbmNsdWRlICJhb3V0eC5oIgotCi0vKiAoQWIpdXNlIHNvbWUgZmllbGRzIGluIHRoZSBpbnRlcm5hbCBleGVjIGhlYWRlciB0byBiZSBhYmxlIHRvIHJlYWQKLSAgIGV4ZWN1dGFibGVzIHRoYXQgY29udGFpbiBzaGFyZWQgZGF0YS4gICovCi0KLSNkZWZpbmUgYV9zaGRhdGEgYV90bG9hZAotI2RlZmluZSBhX3NoZHJzaXplIGFfZGxvYWQKLQotdm9pZAotaTM4NmR5bml4XzMyX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsIHJhd19ieXRlcywgZXhlY3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyAqYnl0ZXMgPSAoc3RydWN0IGV4dGVybmFsX2V4ZWMgKilyYXdfYnl0ZXM7Ci0KLSAgLyogVGhlIGludGVybmFsX2V4ZWMgc3RydWN0dXJlIGhhcyBzb21lIGZpZWxkcyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhpcwotICAgICBjb25maWd1cmF0aW9uIChJRSBmb3IgaTk2MCksIHNvIGVuc3VyZSB0aGF0IGFsbCBzdWNoIHVuaW5pdGlhbGl6ZWQKLSAgICAgZmllbGRzIGFyZSB6ZXJvJ2Qgb3V0LiAgVGhlcmUgYXJlIHBsYWNlcyB3aGVyZSB0d28gb2YgdGhlc2Ugc3RydWN0cwotICAgICBhcmUgbWVtY21wJ2QsIGFuZCB0aHVzIHRoZSBjb250ZW50cyBkbyBtYXR0ZXIuICovCi0gIG1lbXNldCAoKFBUUikgZXhlY3AsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpKTsKLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSBleGVjcCwgZnJvbSB0aGUgYnl0ZXMgaW4gdGhlIHJhdyBkYXRhLiAgKi8KLSAgZXhlY3AtPmFfaW5mbyAgID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+ZV9pbmZvKTsKLSAgZXhlY3AtPmFfdGV4dCAgID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3RleHQpOwotICBleGVjcC0+YV9kYXRhICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZGF0YSk7Ci0gIGV4ZWNwLT5hX2JzcyAgICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9ic3MpOwotICBleGVjcC0+YV9zeW1zICAgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfc3ltcyk7Ci0gIGV4ZWNwLT5hX2VudHJ5ICA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV9lbnRyeSk7Ci0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IEdFVF9XT1JEIChhYmZkLCBieXRlcy0+ZV90cnNpemUpOwotICBleGVjcC0+YV9kcnNpemUgPSBHRVRfV09SRCAoYWJmZCwgYnl0ZXMtPmVfZHJzaXplKTsKLSAgZXhlY3AtPmFfc2hkYXRhID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZGF0YSk7Ci0gIGV4ZWNwLT5hX3NoZHJzaXplID0gR0VUX1dPUkQgKGFiZmQsIGJ5dGVzLT5lX3NoZHJzaXplKTsKLX0KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4NmZyZWVic2QuYyBiL2JmZC9pMzg2ZnJlZWJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTYzNzFiLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2ZnJlZWJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBGcmVlQlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJNAotI3VuZGVmIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2RlZmluZQlUQVJHRVRfUEFHRV9TSVpFCTQwOTYKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCVRBUkdFVF9QQUdFX1NJWkUKLQotI2RlZmluZQlERUZBVUxUX0FSQ0gJYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV8zODZfTkVUQlNEIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoaTM4NmZyZWVic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1mcmVlYnNkIgotCi0jaW5jbHVkZSAiZnJlZWJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZsaW51eC5jIGIvYmZkL2kzODZsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDRiZGNkLi4wMDAwMDAwCi0tLSBhL2JmZC9pMzg2bGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIGkzODYgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQk0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzM4NiB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLSNkZWZpbmUgTVkoT1ApIENBVChpMzg2bGludXhfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWxpbnV4IgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOwotCi0vKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKLSAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgotICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIGkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICopKTsKLQotc3RhdGljIGJvb2xlYW4KLWkzODZsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OwotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBpMzg2bGludXhfYmZkX2ZpbmFsX2xpbmsKLQotLyogU2V0IHRoZSBtYWNoaW5lIHR5cGUgY29ycmVjdGx5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWkzODZsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgaTM4NmxpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotDAotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZQlHT1RfUkVGX1BSRUZJWAkiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAotI2RlZmluZQlQTFRfUkVGX1BSRUZJWAkiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+Zml4dXBfY291bnQgPSAwOwotICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKLSAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotCQkJCSAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIHN0cnVjdCBmaXh1cCAqZjsKLQotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0JICBpZiAoZiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotCSBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLQkgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotCQkgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotCQkJICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotCSAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotCSAgKnArKyA9ICdcMCc7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotCSAgICAgYWxsb2MsIHApOwotCSAgZnJlZSAoYWxsb2MpOwotCX0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdCBpdCAqLwotICBpc19wbHQgPSBJU19QTFRfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGlmIChpc19wbHQgfHwgSVNfR09UX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKSkKLSAgICB7Ci0gICAgICAvKiBMb29rIHVwIHRoaXMgc3ltYm9sIHR3aWNlLiAgT25jZSBqdXN0IGFzIGEgcmVndWxhciBsb29rdXAsCi0JIGFuZCB0aGVuIGFnYWluIGZvbGxvd2luZyBhbGwgb2YgdGhlIGluZGlyZWN0IGxpbmtzIHVudGlsIHdlCi0JIHJlYWNoIGEgcmVhbCBzeW1ib2wuICAqLwotICAgICAgaDEgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIC8qIGgyIGRvZXMgbm90IGZvbGxvdyBpbmRpcmVjdCBzeW1ib2xzLiAqLwotICAgICAgaDIgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotCSB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLQkgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0JIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotCSBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLQkgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLQkgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgxLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgICAgfHwgaDItPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpKQotCXsKLQkgIC8qIFNlZSBpZiB0aGVyZSBpcyBhICJidWlsdGluIiBmaXh1cCBhbHJlYWR5IHByZXNlbnQKLQkgICAgIGludm9sdmluZyB0aGlzIHN5bWJvbC4gIElmIHNvLCBjb252ZXJ0IGl0IHRvIGEgcmVndWxhcgotCSAgICAgZml4dXAuICBJbiB0aGUgZW5kLCB0aGlzIHJlbGF4ZXMgc29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzCi0JICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcGVyZm9ybWluZyBmaXh1cHMuICAqLwotCSAgZXhpc3RzID0gZmFsc2U7Ci0JICBmb3IgKGYxID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0JICAgICAgIGYxICE9IE5VTEw7Ci0JICAgICAgIGYxID0gZjEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKGYxLT5oICE9IGggJiYgZjEtPmggIT0gaDEpCi0JCSAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChmMS0+aCA9PSBoMSkKLQkJZXhpc3RzID0gdHJ1ZTsKLQkgICAgICBpZiAoISBleGlzdHMKLQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkJICBmLT5qdW1wID0gaXNfcGx0OwotCQl9Ci0JICAgICAgZjEtPmggPSBoMTsKLQkgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLQkgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0JICAgICAgZXhpc3RzID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKCEgZXhpc3RzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkgICAgICBpZiAoZiA9PSBOVUxMKQotCQl7Ci0JCSAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotCSBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfaTM4NmxpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCBmaW5kIHRoZSBmaXh1cHMuLi4gKi8KLSAgbGludXhfbGlua19oYXNoX3RyYXZlcnNlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBsaW51eF90YWxseV9zeW1ib2xzLAotCQkJICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQl7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGZpeHVwIHRhYmxlLiAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwgCi0JICBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JICBvcy0+dm1hICsgcy0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQotICBmaXh1cF90YWJsZSA9IHMtPmNvbnRlbnRzOwotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQsIGZpeHVwX3RhYmxlKTsKLSAgZml4dXBfdGFibGUgKz0gNDsKLQotICAvKiBGaWxsIGluIGZpeHVwIHRhYmxlLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiRml4dXAoJWQpICVzOiAleCAleFxuIixmLT5qdW1wLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCSAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGYtPmp1bXApCi0JewotCSAgLyogUmVsYXRpdmUgYWRkcmVzcyAqLwotCSAgbmV3X2FkZHIgPSBuZXdfYWRkciAtIChmLT52YWx1ZSArIDUpOyAKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUgKyAxLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCX0KLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIG1hcmtlciBzbyB3ZSBrbm93IHRvIHN3aXRjaCB0byB0aGUgb3RoZXIgdHlwZSBvZiBmaXh1cCAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JewotCSAgaWYgKCEgZi0+YnVpbHRpbikKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkJIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLQkgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLQkgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0JICBwcmludGYgKCJGaXh1cChCKSAlczogJXggJXhcbiIsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICE9IGZpeHVwc193cml0dGVuKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIpKTsKLSAgICAgIHdoaWxlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiBmaXh1cHNfd3JpdHRlbikKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCSAgZml4dXBfdGFibGUgKz0gNDsKLQkgICsrZml4dXBzX3dyaXR0ZW47Ci0JfQotICAgIH0KLQotICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIAotCQkJICAgICAgIl9fQlVJTFRJTl9GSVhVUFNfXyIsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGlzID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiQnVpbHRpbiBmaXh1cCB0YWJsZSBhdCAleFxuIiwgbmV3X2FkZHIpOwotI2VuZGlmCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL2kzODZseW54LmMgYi9iZmQvaTM4Nmx5bnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwMzQ0ZS4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nmx5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGkzODYgYS5vdXQgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2kzODYKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1pMzg2LWx5bngiCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmbmRlZiBXUklURV9IRUFERVJTCi0jZGVmaW5lIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApCQkJCQkgICAgICBcCi0gICAgICB7CQkJCQkJCQkJICAgICAgXAotCWJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJICAgICAgXAotCWZpbGVfcHRyIHRleHRfZW5kOwkJCQkJCSAgICAgIFwKLQlpZiAoYWRhdGEoYWJmZCkubWFnaWMgPT0gdW5kZWNpZGVkX21hZ2ljKQkJCSAgICAgIFwKLQkgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOyAgICAgXAotICAgIAkJCQkJCQkJCSAgICAgIFwKLQlleGVjcC0+YV9zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgKiBFWFRFUk5BTF9OTElTVF9TSVpFOwkgICAgICBcCi0JZXhlY3AtPmFfZW50cnkgPSBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpOwkJCSAgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfdHJzaXplID0gKChvYmpfdGV4dHNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCQkgICAgICBcCi0JCQkgICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwkJICAgICAgXAotCWV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlOQU1FKGFvdXQsc3dhcF9leGVjX2hlYWRlcl9vdXQpIChhYmZkLCBleGVjcCwgJmV4ZWNfYnl0ZXMpOwkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgICAgIFwKLQlpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkgICAgICBcCi0JICAgICE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgICAgIFwKLQkvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgICAgXAotICAJCQkJCQkJCQkgICAgICBcCi0JaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9TWU1PRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAgICAgXAotCQkgICE9IDApCQkJCQkJCSAgICAgIFwKLQkgICAgICAgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCEgTkFNRShhb3V0LHdyaXRlX3N5bXMpKGFiZmQpKSByZXR1cm4gZmFsc2U7CQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fVFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICAgIGlmICghTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkgICBcCi0JCXJldHVybiBmYWxzZTsJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fRFJFTE9GRigqZXhlY3ApKSwgU0VFS19TRVQpICAgIFwKLQkJICAhPSAwKQkJCQkJCQkgICAgICBcCi0JICAgICAgICByZXR1cm4gMDsJCQkJCQkgICAgICBcCi0JCQkJCQkJCQkgICAgICBcCi0JICAgICAgaWYgKCFOQU1FKGx5bngsc3F1aXJ0X291dF9yZWxvY3MpKGFiZmQsIG9ial9kYXRhc2VjIChhYmZkKSkpICAgIFwKLQkJcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIFwKLQkgICAgfQkJCQkJCQkJICAgICAgXAotICAgICAgfQotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotDAotCi0jZGVmaW5lIEtFRVBJVCB1ZGF0YS5pCi0KLWV4dGVybiByZWxvY19ob3d0b190eXBlIGFvdXRfMzJfZXh0X2hvd3RvX3RhYmxlW107Ci1leHRlcm4gcmVsb2NfaG93dG9fdHlwZSBhb3V0XzMyX3N0ZF9ob3d0b190YWJsZVtdOwotCi0vKiBTdGFuZGFyZCByZWxvYyBzdHVmZiAqLwotLyogT3V0cHV0IHN0YW5kYXJkIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gYSBmaWxlIGluIHRhcmdldCBieXRlIG9yZGVyLiAqLwotCi12b2lkCi1OQU1FKGx5bngsc3dhcF9zdGRfcmVsb2Nfb3V0KSAoYWJmZCwgZywgbmF0cHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKmc7Ci0gICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKm5hdHB0cjsKLXsKLSAgaW50IHJfaW5kZXg7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIHVuc2lnbmVkIGludCByX2FkZGVuZDsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uID0gc3ltLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICBQVVRfV09SRCAoYWJmZCwgZy0+YWRkcmVzcywgbmF0cHRyLT5yX2FkZHJlc3MpOwotCi0gIHJfbGVuZ3RoID0gZy0+aG93dG8tPnNpemU7CS8qIFNpemUgYXMgYSBwb3dlciBvZiB0d28gKi8KLSAgcl9wY3JlbCA9IChpbnQpIGctPmhvd3RvLT5wY19yZWxhdGl2ZTsJLyogUmVsYXRpdmUgdG8gUEM/ICovCi0gIC8qIHJfYmFzZXJlbCwgcl9qbXB0YWJsZSwgcl9yZWxhdGl2ZT8/PyAgRklYTUUtc29vbiAqLwotICByX2Jhc2VyZWwgPSAwOwotICByX2ptcHRhYmxlID0gMDsKLSAgcl9yZWxhdGl2ZSA9IDA7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIC8qIG5hbWUgd2FzIGNsb2JiZXJlZCBieSBhb3V0X3dyaXRlX3N5bXMgdG8gYmUgc3ltYm9sIGluZGV4ICovCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sID09IHN5bSkKLQl7Ci0JICAvKiBXaG9vcHMsIGxvb2tlZCBsaWtlIGFuIGFicyBzeW1ib2wsIGJ1dCBpcyByZWFsbHkgYW4gb2Zmc2V0Ci0JICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT5LRUVQSVQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEp1c3QgYW4gb3JkaW5hcnkgc2VjdGlvbiAqLwotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9pbmRleCA9IG91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgfQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCXwgKHJfcGNyZWwgPyBSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcgOiAwKQotCXwgKHJfYmFzZXJlbCA/IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHIDogMCkKLQl8IChyX2ptcHRhYmxlID8gUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfQklHIDogMCkKLQl8IChyX3JlbGF0aXZlID8gUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHIDogMCkKLQl8IChyX2xlbmd0aCA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4ID4+IDE2OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzFdID0gcl9pbmRleCA+PiA4OwotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleDsKLSAgICAgIG5hdHB0ci0+cl90eXBlWzBdID0KLQkocl9leHRlcm4gPyBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFIDogMCkKLQl8IChyX3BjcmVsID8gUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFIDogMCkKLQl8IChyX2Jhc2VyZWwgPyBSRUxPQ19TVERfQklUU19CQVNFUkVMX0xJVFRMRSA6IDApCi0JfCAocl9qbXB0YWJsZSA/IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRSA6IDApCi0JfCAocl9yZWxhdGl2ZSA/IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRSA6IDApCi0JfCAocl9sZW5ndGggPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRSk7Ci0gICAgfQotfQotCi0KLS8qIEV4dGVuZGVkIHN0dWZmICovCi0vKiBPdXRwdXQgZXh0ZW5kZWQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhIGZpbGUgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICovCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19vdXQpIChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICB1bnNpZ25lZCBpbnQgcl9hZGRlbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9ICooZy0+c3ltX3B0cl9wdHIpOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEIChhYmZkLCBnLT5hZGRyZXNzLCBuYXRwdHItPnJfYWRkcmVzcyk7Ci0KLSAgcl90eXBlID0gKHVuc2lnbmVkIGludCkgZy0+aG93dG8tPnR5cGU7Ci0KLSAgcl9hZGRlbmQgPSBnLT5hZGRlbmQgKyAoKihnLT5zeW1fcHRyX3B0cikpLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIGEgc3ltYm9sIHRoZW4gc2V0IHRoZQotICAgICByX2luZGV4IHRvIHRoZSBzeW1ib2xzIGluZGV4LCBhbmQgdGhlIHJfZXh0ZXJuIGJpdC4KLQotICAgICBBYnNvbHV0ZSBzeW1ib2xzIGNhbiBjb21lIGluIGluIHR3byB3YXlzLCBlaXRoZXIgYXMgYW4gb2Zmc2V0Ci0gICAgIGZyb20gdGhlIGFicyBzZWN0aW9uLCBvciBhcyBhIHN5bWJvbCB3aGljaCBoYXMgYW4gYWJzIHZhbHVlLgotICAgICBjaGVjayBmb3IgdGhhdCBoZXJlCi0gICAgICovCi0KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfYWJzX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChvdXRwdXRfc2VjdGlvbikpCi0gICAgewotICAgICAgaWYgKGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSBmcm9tIHRoZSBhYnMgc2VjdGlvbiAqLwotCSAgcl9pbmRleCA9IDA7Ci0JICByX2V4dGVybiA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfaW5kZXggPSAoKmctPnN5bV9wdHJfcHRyKS0+S0VFUElUOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgIH0KLQotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGFiZmQpKQotICAgIHsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXggPj4gMTY7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMV0gPSByX2luZGV4ID4+IDg7Ci0gICAgICBuYXRwdHItPnJfaW5kZXhbMl0gPSByX2luZGV4OwotICAgICAgbmF0cHRyLT5yX3R5cGVbMF0gPQotCShyX2V4dGVybiA/IFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcgOiAwKQotCXwgKHJfdHlwZSA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKHJfZXh0ZXJuID8gUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRSA6IDApCi0JfCAocl90eXBlIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLSAgICB9Ci0KLSAgUFVUX1dPUkQgKGFiZmQsIHJfYWRkZW5kLCBuYXRwdHItPnJfYWRkZW5kKTsKLX0KLQotLyogQkZEIGRlYWxzIGludGVybmFsbHkgd2l0aCBhbGwgdGhpbmdzIGJhc2VkIGZyb20gdGhlIHNlY3Rpb24gdGhleSdyZQotICAgaW4uIHNvLCBzb21ldGhpbmcgaW4gMTAgYnl0ZXMgaW50byBhIHRleHQgc2VjdGlvbiAgd2l0aCBhIGJhc2Ugb2YKLSAgIDUwIHdvdWxkIGhhdmUgYSBzeW1ib2wgKC50ZXh0KzEwKSBhbmQga25vdyAudGV4dCB2bWEgd2FzIDUwLgotCi0gICBBb3V0IGtlZXBzIGFsbCBpdCdzIHN5bWJvbHMgYmFzZWQgZnJvbSB6ZXJvLCBzbyB0aGUgc3ltYm9sIHdvdWxkCi0gICBjb250YWluIDYwLiBUaGlzIG1hY3JvIHN1YnMgdGhlIGJhc2Ugb2YgZWFjaCBzZWN0aW9uIGZyb20gdGhlIHZhbHVlCi0gICB0byBnaXZlIHRoZSB0cnVlIG9mZnNldCBmcm9tIHRoZSBzZWN0aW9uICovCi0KLQotI2RlZmluZSBNT1ZFX0FERFJFU1MoYWQpICAgICAgIAkJCQkJCVwKLSAgaWYgKHJfZXh0ZXJuKSB7CQkJCQkJCVwKLSAgIC8qIHVuZGVmaW5lZCBzeW1ib2wgKi8JCQkJCQlcCi0gICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgcl9pbmRleDsJCQlcCi0gICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICB9IGVsc2UgewkJCQkJCQkJXAotICAgIC8qIGRlZmluZWQsIHNlY3Rpb24gcmVsYXRpdmUuIHJlcGxhY2Ugc3ltYm9sIHdpdGggcG9pbnRlciB0byAgICAJXAotICAgICAgIHN5bWJvbCB3aGljaCBwb2ludHMgdG8gc2VjdGlvbiAgKi8JCQkJXAotICAgIHN3aXRjaCAocl9pbmRleCkgewkJCQkJCQlcCi0gICAgY2FzZSBOX1RFWFQ6CQkJCQkJCVwKLSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX3RleHRzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkICAtIHN1LT50ZXh0c2VjLT52bWE7CQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgY2FzZSBOX0RBVEE6CQkJCQkJCVwKLSAgICBjYXNlIE5fREFUQSB8IE5fRVhUOgkJCQkJCVwKLSAgICAgIGNhY2hlX3B0ci0+c3ltX3B0cl9wdHIgID0gb2JqX2RhdGFzZWMoYWJmZCktPnN5bWJvbF9wdHJfcHRyOwlcCi0gICAgICBjYWNoZV9wdHItPmFkZGVuZCA9IGFkIC0gc3UtPmRhdGFzZWMtPnZtYTsJCQlcCi0gICAgICBicmVhazsJCQkJCQkJCVwKLSAgICBjYXNlIE5fQlNTOgkJCQkJCQkJXAotICAgIGNhc2UgTl9CU1MgfCBOX0VYVDoJCQkJCQkJXAotICAgICAgY2FjaGVfcHRyLT5zeW1fcHRyX3B0ciAgPSBvYmpfYnNzc2VjKGFiZmQpLT5zeW1ib2xfcHRyX3B0cjsJXAotICAgICAgY2FjaGVfcHRyLT5hZGRlbmQgPSBhZCAtIHN1LT5ic3NzZWMtPnZtYTsJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgZGVmYXVsdDoJCQkJCQkJCVwKLSAgICBjYXNlIE5fQUJTOgkJCQkJCQkJXAotICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoJCQkJCQkJXAotICAgICBjYWNoZV9wdHItPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7CVwKLSAgICAgIGNhY2hlX3B0ci0+YWRkZW5kID0gYWQ7CQkJCQkJXAotICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgfQkJCQkJCQkJCVwKLSAgfSAgICAgCQkJCQkJCQlcCi0KLXZvaWQKLU5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIGJ5dGVzLCBjYWNoZV9wdHIsIHN5bWJvbHMsIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmJ5dGVzOwotICAgICBhcmVsZW50ICpjYWNoZV9wdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfc2l6ZV90eXBlIHN5bWNvdW50OwotewotICBpbnQgcl9pbmRleDsKLSAgaW50IHJfZXh0ZXJuOwotICB1bnNpZ25lZCBpbnQgcl90eXBlOwotICBzdHJ1Y3QgYW91dGRhdGEgKnN1ID0gJihhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEpOwotCi0gIGNhY2hlX3B0ci0+YWRkcmVzcyA9IChHRVRfU1dPUkQgKGFiZmQsIGJ5dGVzLT5yX2FkZHJlc3MpKTsKLQotICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07Ci0gIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotICByX3R5cGUgPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19FWFRfQklUU19UWVBFX0JJRykKLSAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRzsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9leHRfaG93dG9fdGFibGUgKyByX3R5cGU7Ci0gIE1PVkVfQUREUkVTUyAoR0VUX1NXT1JEIChhYmZkLCBieXRlcy0+cl9hZGRlbmQpKTsKLX0KLQotdm9pZAotTkFNRShseW54LHN3YXBfc3RkX3JlbG9jX2luKSAoYWJmZCwgYnl0ZXMsIGNhY2hlX3B0ciwgc3ltYm9scywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqYnl0ZXM7Ci0gICAgIGFyZWxlbnQgKmNhY2hlX3B0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci17Ci0gIGludCByX2luZGV4OwotICBpbnQgcl9leHRlcm47Ci0gIHVuc2lnbmVkIGludCByX2xlbmd0aDsKLSAgaW50IHJfcGNyZWw7Ci0gIGludCByX2Jhc2VyZWwsIHJfam1wdGFibGUsIHJfcmVsYXRpdmU7Ci0gIHN0cnVjdCBhb3V0ZGF0YSAqc3UgPSAmKGFiZmQtPnRkYXRhLmFvdXRfZGF0YS0+YSk7Ci0KLSAgY2FjaGVfcHRyLT5hZGRyZXNzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+cl9hZGRyZXNzKTsKLQotICByX2luZGV4ID0gYnl0ZXMtPnJfaW5kZXhbMV07Ci0gIHJfZXh0ZXJuID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRykpOwotICByX3BjcmVsID0gKDAgIT0gKGJ5dGVzLT5yX2luZGV4WzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0gIHJfYmFzZXJlbCA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHKSk7Ci0gIHJfam1wdGFibGUgPSAoMCAhPSAoYnl0ZXMtPnJfaW5kZXhbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcpKTsKLSAgcl9yZWxhdGl2ZSA9ICgwICE9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRykpOwotICByX2xlbmd0aCA9IChieXRlcy0+cl9pbmRleFswXSAmIFJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcpCi0gICAgPj4gUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLQotICBjYWNoZV9wdHItPmhvd3RvID0gYW91dF8zMl9zdGRfaG93dG9fdGFibGUgKyByX2xlbmd0aCArIDQgKiByX3BjcmVsOwotICAvKiBGSVhNRS1zb29uOiAgUm9sbCBiYXNlcmVsLCBqbXB0YWJsZSwgcmVsYXRpdmUgYml0cyBpbnRvIGhvd3RvIHNldHRpbmcgKi8KLQotICBNT1ZFX0FERFJFU1MgKDApOwotfQotCi0vKiBSZWxvYyBoYWNrZXJ5ICovCi0KLWJvb2xlYW4KLU5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIGFzZWN0LCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGJmZF9zaXplX3R5cGUgcmVsb2Nfc2l6ZTsKLSAgUFRSIHJlbG9jczsKLSAgYXJlbGVudCAqcmVsb2NfY2FjaGU7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0KLSAgaWYgKGFzZWN0LT5yZWxvY2F0aW9uKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChhc2VjdC0+ZmxhZ3MgJiBTRUNfQ09OU1RSVUNUT1IpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGFzZWN0ID09IG9ial9kYXRhc2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX2Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgaWYgKGFzZWN0ID09IG9ial90ZXh0c2VjIChhYmZkKSkKLSAgICB7Ci0gICAgICByZWxvY19zaXplID0gZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZTsKLSAgICAgIGdvdG8gZG9pdDsKLSAgICB9Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotCi1kb2l0OgotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFzZWN0LT5yZWxfZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBlYWNoX3NpemUgPSBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCk7Ci0KLSAgY291bnQgPSByZWxvY19zaXplIC8gZWFjaF9zaXplOwotCi0KLSAgcmVsb2NfY2FjaGUgPSAoYXJlbGVudCAqKSBiZmRfbWFsbG9jIChjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotICBpZiAoIXJlbG9jX2NhY2hlICYmIGNvdW50ICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHJlbG9jX2NhY2hlLCAwLCBjb3VudCAqIHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jcyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgcmVsb2Nfc2l6ZSk7Ci0gIGlmICghcmVsb2NzICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChyZWxvY19jYWNoZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxvY19zaXplLCBhYmZkKSAhPSByZWxvY19zaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCByZWxvY3MpOwotICAgICAgZnJlZSAocmVsb2NfY2FjaGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoZWFjaF9zaXplID09IFJFTE9DX0VYVF9TSVpFKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJwdHIgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvY3M7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0gICAgICBhcmVsZW50ICpjYWNoZV9wdHIgPSByZWxvY19jYWNoZTsKLQotICAgICAgZm9yICg7IGNvdW50ZXIgPCBjb3VudDsgY291bnRlcisrLCBycHRyKyssIGNhY2hlX3B0cisrKQotCXsKLQkgIE5BTUUobHlueCxzd2FwX2V4dF9yZWxvY19pbikgKGFiZmQsIHJwdHIsIGNhY2hlX3B0ciwgc3ltYm9scywKLQkJCQkJYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpycHRyID0gKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgcmVsb2NzOwotICAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIgPSAwOwotICAgICAgYXJlbGVudCAqY2FjaGVfcHRyID0gcmVsb2NfY2FjaGU7Ci0KLSAgICAgIGZvciAoOyBjb3VudGVyIDwgY291bnQ7IGNvdW50ZXIrKywgcnB0cisrLCBjYWNoZV9wdHIrKykKLQl7Ci0JICBOQU1FKGx5bngsc3dhcF9zdGRfcmVsb2NfaW4pIChhYmZkLCBycHRyLCBjYWNoZV9wdHIsIHN5bWJvbHMsCi0JCQkJCWJmZF9nZXRfc3ltY291bnQgKGFiZmQpKTsKLQl9Ci0KLSAgICB9Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIHJlbG9jcyk7Ci0gIGFzZWN0LT5yZWxvY2F0aW9uID0gcmVsb2NfY2FjaGU7Ci0gIGFzZWN0LT5yZWxvY19jb3VudCA9IGNvdW50OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0KLS8qIFdyaXRlIG91dCBhIHJlbG9jYXRpb24gc2VjdGlvbiBpbnRvIGFuIG9iamVjdCBmaWxlLiAgKi8KLQotYm9vbGVhbgotTkFNRShseW54LHNxdWlydF9vdXRfcmVsb2NzKSAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgYXJlbGVudCAqKmdlbmVyaWM7Ci0gIHVuc2lnbmVkIGNoYXIgKm5hdGl2ZSwgKm5hdHB0cjsKLSAgc2l6ZV90IGVhY2hfc2l6ZTsKLQotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc2l6ZV90IG5hdHNpemU7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZWFjaF9zaXplID0gb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpOwotICBuYXRzaXplID0gZWFjaF9zaXplICogY291bnQ7Ci0gIG5hdGl2ZSA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF96YWxsb2MgKGFiZmQsIG5hdHNpemUpOwotICBpZiAoIW5hdGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ2VuZXJpYyA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCi0gIGlmIChlYWNoX3NpemUgPT0gUkVMT0NfRVhUX1NJWkUpCi0gICAgewotICAgICAgZm9yIChuYXRwdHIgPSBuYXRpdmU7Ci0JICAgY291bnQgIT0gMDsKLQkgICAtLWNvdW50LCBuYXRwdHIgKz0gZWFjaF9zaXplLCArK2dlbmVyaWMpCi0JTkFNRShseW54LHN3YXBfZXh0X3JlbG9jX291dCkgKGFiZmQsICpnZW5lcmljLCAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBuYXRwdHIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAobmF0cHRyID0gbmF0aXZlOwotCSAgIGNvdW50ICE9IDA7Ci0JICAgLS1jb3VudCwgbmF0cHRyICs9IGVhY2hfc2l6ZSwgKytnZW5lcmljKQotCU5BTUUobHlueCxzd2FwX3N0ZF9yZWxvY19vdXQpIChhYmZkLCAqZ2VuZXJpYywgKHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKikgbmF0cHRyKTsKLSAgICB9Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmF0aXZlLCAxLCBuYXRzaXplLCBhYmZkKSAhPSBuYXRzaXplKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuYXRpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgc3R1cGlkLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgYSBib29sZWFuIHByZWRpY2F0ZSAqLwotbG9uZwotTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICp0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLSAgaWYgKCEodGJscHRyIHx8IE5BTUUobHlueCxzbHVycF9yZWxvY190YWJsZSkgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0gICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykKLQl7Ci0JICAqcmVscHRyKysgPSAmY2hhaW4tPnJlbGVudDsKLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotCXsKLQkgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCX0KLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotCi0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgTkFNRShseW54LGNhbm9uaWNhbGl6ZV9yZWxvYykKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvaTM4Nm1hY2gzLmMgYi9iZmQvaTM4Nm1hY2gzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjc1ODIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZtYWNoMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpMzg2IGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGZvciBNYWNoIDMsIHdoaWNoIHVzZXMgYS5vdXQsIG5vdCBNYWNoLU8uICAqLwotCi0vKiBUaGVyZSBpcyBubyBtYWdpYyBudW1iZXIgb3IgYW55dGhpbmcgd2hpY2ggbGV0cyB1cyBkaXN0aW5ndWlzaCB0aGlzIHRhcmdldAotICAgZnJvbSBpMzg2YW91dCBvciBpMzg2YnNkLiAgU28gdGhpcyB0YXJnZXQgaXMgb25seSB1c2VmdWwgaWYgaXQgaXMgdGhlCi0gICBkZWZhdWx0IHRhcmdldC4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRQkxCi0jZGVmaW5lCVNFR01FTlRfU0laRQkweDEwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTB4MTAwMDAKLSNkZWZpbmUgQVJDSCAzMgotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLS8qIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCB3aGVuIE5fTUFHSUMoeCkgPT0gWk1BR0lDLiAgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpCSgoeCkuYV90ZXh0KQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfaTM4NgotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZtYWNoM18sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW1hY2gzIgotCi1zdGF0aWMgYm9vbGVhbiBNWShzZXRfc2l6ZXMpKCk7Ci0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotc3RhdGljIENPTlNUIHN0cnVjdCBhb3V0X2JhY2tlbmRfZGF0YSBNWShiYWNrZW5kX2RhdGEpID0gewotICAwLAkJCQkvKiB6bWFnaWMgY29udGlndW91cyAqLwotICAxLAkJCQkvKiB0ZXh0IGluY2wgaGVhZGVyICovCi0gIDAsCQkJCS8qIGVudHJ5IGlzIHRleHQgYWRkcmVzcyAqLwotICAwLAkJCQkvKiBleGVjX2hkcl9mbGFncyAqLwotICAwLAkJCQkvKiB0ZXh0IHZtYT8gKi8KLSAgTVkoc2V0X3NpemVzKSwKLSAgMSwJCQkJLyogZXhlYyBoZWFkZXIgbm90IGNvdW50ZWQgKi8KLSAgMCwJCQkJLyogYWRkX2R5bmFtaWNfc3ltYm9scyAqLwotICAwLAkJCQkvKiBhZGRfb25lX3N5bWJvbCAqLwotICAwLAkJCQkvKiBsaW5rX2R5bmFtaWNfb2JqZWN0ICovCi0gIDAsCQkJCS8qIHdyaXRlX2R5bmFtaWNfc3ltYm9sICovCi0gIDAsCQkJCS8qIGNoZWNrX2R5bmFtaWNfcmVsb2MgKi8KLSAgMAkJCQkvKiBmaW5pc2hfZHluYW1pY19saW5rICovCi19OwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2bXNkb3MuYyBiL2JmZC9pMzg2bXNkb3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmMjRiMi4uMDAwMDAwMAotLS0gYS9iZmQvaTM4Nm1zZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNUy1ET1MgZXhlY3V0YWJsZXMuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQnJ5YW4gRm9yZCBvZiB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0jaWYgMAotc3RydWN0IGV4ZV9oZWFkZXIKLXsKLQl1bnNpZ25lZCBzaG9ydCBtYWdpYzsKLQl1bnNpZ25lZCBzaG9ydCBieXRlc19pbl9sYXN0X3BhZ2U7Ci0JdW5zaWduZWQgc2hvcnQgbnBhZ2VzOwkvKiBudW1iZXIgb2YgNTEyLWJ5dGUgInBhZ2VzIiBpbmNsdWRpbmcgdGhpcyBoZWFkZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBucmVsb2NzOwotCXVuc2lnbmVkIHNob3J0IGhlYWRlcl9wYXJhczsJLyogbnVtYmVyIG9mIDE2LWJ5dGUgcGFyYWdyYXBocyBpbiBoZWFkZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDsKLQl1bnNpZ25lZCBzaG9ydCBsb2FkX3N3aXRjaDsKLQl1bnNpZ25lZCBzaG9ydCBzc19vZnM7Ci0JdW5zaWduZWQgc2hvcnQgc3A7Ci0JdW5zaWduZWQgc2hvcnQgY2hlY2tzdW07Ci0JdW5zaWduZWQgc2hvcnQgaXA7Ci0JdW5zaWduZWQgc2hvcnQgY3Nfb2ZzOwotCXVuc2lnbmVkIHNob3J0IHJlbG9jX29mczsKLQl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZDI7Ci0JdW5zaWduZWQgc2hvcnQgc29tZXRoaW5nMTsKLQl1bnNpZ25lZCBzaG9ydCBzb21ldGhpbmcyOwotCXVuc2lnbmVkIHNob3J0IHNvbWV0aGluZzM7Ci19OwotI2VuZGlmCi0KLSNkZWZpbmUgRVhFX01BR0lDCTB4NWE0ZAotI2RlZmluZSBFWEVfTE9BRF9ISUdICTB4MDAwMAotI2RlZmluZSBFWEVfTE9BRF9MT1cJMHhmZmZmCi0jZGVmaW5lIEVYRV9QQUdFX1NJWkUJNTEyCi0KLQotc3RhdGljIGludAotbXNkb3Nfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdGF0aWMgY2hhciBoZHJbRVhFX1BBR0VfU0laRV07Ci0gIGZpbGVfcHRyIG91dGZpbGVfc2l6ZSA9IHNpemVvZihoZHIpOwotICBiZmRfdm1hIGhpZ2hfdm1hID0gMDsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICAvKiBGaW5kIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBwcm9ncmFtIG9uIGRpc2sgYW5kIGluIG1lbW9yeS4gICovCi0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykgPT0gMCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0FMTE9DKQotICAgICAgICB7Ci0JICBiZmRfdm1hIHNlY192bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JICAJCSAgICArIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLQkgIGlmIChzZWNfdm1hID4gaGlnaF92bWEpCi0JICAgIGhpZ2hfdm1hID0gc2VjX3ZtYTsKLQl9Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0xPQUQpCi0gICAgICAgIHsKLQkgIGZpbGVfcHRyIHNlY19lbmQgPSBzaXplb2YoaGRyKQotCSAgCQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkJICAgICArIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLQkgIGlmIChzZWNfZW5kID4gb3V0ZmlsZV9zaXplKQotCSAgICBvdXRmaWxlX3NpemUgPSBzZWNfZW5kOwotCX0KLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoZSBwcm9ncmFtIGlzbid0IHRvbyBiaWcuICAqLwotICBpZiAoaGlnaF92bWEgPiAoYmZkX3ZtYSkweGZmZmYpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvcihiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogY29uc3RhbnRzICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBFWEVfTUFHSUMsICZoZHJbMF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgRVhFX1BBR0VfU0laRSAvIDE2LCAmaGRyWzhdKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIEVYRV9MT0FEX0xPVywgJmhkclsxMl0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgzZSwgJmhkclsyNF0pOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgwMDAxLCAmaGRyWzI4XSk7IC8qIFhYWD8/PyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHgzMGZiLCAmaGRyWzMwXSk7IC8qIFhYWD8/PyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMHg3MjZhLCAmaGRyWzMyXSk7IC8qIFhYWD8/PyAqLwotCi0gIC8qIGJ5dGVzIGluIGxhc3QgcGFnZSAoMCA9IGZ1bGwgcGFnZSkgKi8KLSAgYmZkX2hfcHV0XzE2KGFiZmQsIG91dGZpbGVfc2l6ZSAmIChFWEVfUEFHRV9TSVpFIC0gMSksICZoZHJbMl0pOwotCi0gIC8qIG51bWJlciBvZiBwYWdlcyAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgKG91dGZpbGVfc2l6ZSArIEVYRV9QQUdFX1NJWkUgLSAxKSAvIEVYRV9QQUdFX1NJWkUsCi0gIAkgICAgICAgJmhkcls0XSk7Ci0KLSAgLyogU2V0IHRoZSBpbml0aWFsIHN0YWNrIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnNzLgotICAgICBUaGUgcHJvZ3JhbSdzIGNydDAgY29kZSBtdXN0IHJlbG9jYXRlIGl0IHRvIGEgcmVhbCBzdGFjay4gICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBoaWdoX3ZtYSwgJmhkclsxNl0pOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMAotICAgICAgfHwgYmZkX3dyaXRlIChoZHIsIDEsIHNpemVvZihoZHIpLCBhYmZkKSAhPSBzaXplb2YoaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1tc2Rvc19zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0aW9uLT5maWxlcG9zID0gRVhFX1BBR0VfU0laRSArIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0xPQUQpCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgICAgICB8fCBiZmRfd3JpdGUgKGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgIT0gY291bnQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0jZGVmaW5lIG1zZG9zX21rb2JqZWN0IGFvdXRfMzJfbWtvYmplY3QKLSNkZWZpbmUgbXNkb3NfbWFrZV9lbXB0eV9zeW1ib2wgYW91dF8zMl9tYWtlX2VtcHR5X3N5bWJvbAotI2RlZmluZSBtc2Rvc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgYW91dF8zMl9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lCW1zZG9zX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBtc2Rvc19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgbXNkb3NfbmV3X3NlY3Rpb25faG9vayBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vawotI2RlZmluZSBtc2Rvc19nZXRfc2VjdGlvbl9jb250ZW50cyBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbXNkb3NfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotI2RlZmluZSBtc2Rvc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIG1zZG9zX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgbXNkb3NfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG1zZG9zX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIG1zZG9zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBtc2Rvc19zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgbXNkb3NfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIG1zZG9zX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBtc2Rvc19wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIG1zZG9zX2dldF9zeW1ib2xfaW5mbyBfYmZkX25vc3ltYm9sc19nZXRfc3ltYm9sX2luZm8KLSNkZWZpbmUgbXNkb3NfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgbXNkb3NfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG1zZG9zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG1zZG9zX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgbXNkb3NfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIG1zZG9zX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgbXNkb3NfY2Fub25pY2FsaXplX3JlbG9jIF9iZmRfbm9yZWxvY3NfY2Fub25pY2FsaXplX3JlbG9jCi0jZGVmaW5lIG1zZG9zX2dldF9yZWxvY191cHBlcl9ib3VuZCBfYmZkX25vcmVsb2NzX2dldF9yZWxvY191cHBlcl9ib3VuZAotI2RlZmluZSBtc2Rvc18zMl9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgaTM4Nm1zZG9zX3ZlYyA9Ci17Ci0gICJtc2RvcyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fTElUVExFLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChFWEVDX1ApLAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgbXNkb3NfbWtvYmplY3QsCi0gICAgX2JmZF9nZW5lcmljX21rYXJjaGl2ZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIG1zZG9zX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChtc2RvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG1zZG9zKSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAKLX07Ci0KLQpkaWZmIC0tZ2l0IGEvYmZkL2kzODZuZXRic2QuYyBiL2JmZC9pMzg2bmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyN2I2ZjkuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZuZXRic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTmV0QlNELzM4NiBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9pMzg2Ci0jZGVmaW5lCURFRkFVTFRfTUlEIAlNXzM4Nl9ORVRCU0QKLQotI2RlZmluZSBNWShPUCkgQ0FUKGkzODZuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtaTM4Ni1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9pMzg2b3M5ay5jIGIvYmZkL2kzODZvczlrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDFmNWIuLjAwMDAwMDAKLS0tIGEvYmZkL2kzODZvczlrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBvczkwMDAgaTM4NiBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgkJLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotI2luY2x1ZGUgIm9zOWsuaCIKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKm9zOWtfY2FsbGJhY2sgUEFSQU1TICgoYmZkICopKTsKLQotLyogU3dhcHMgdGhlIGluZm9ybWF0aW9uIGluIGFuIGV4ZWN1dGFibGUgaGVhZGVyIHRha2VuIGZyb20gYSByYXcgYnl0ZQotICAgc3RyZWFtIG1lbW9yeSBpbWFnZSwgaW50byB0aGUgaW50ZXJuYWwgZXhlY19oZWFkZXIgc3RydWN0dXJlLiAgKi8KLWJvb2xlYW4KLW9zOWtfc3dhcF9leGVjX2hlYWRlcl9pbiAoYWJmZCwgcmF3X2J5dGVzLCBleGVjcCkKLSAgICAgYmZkICphYmZkOwotICAgICBtaF9jb20gKnJhd19ieXRlczsKLSAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0gIHVuc2lnbmVkIGludCBkbG9hZCwgZG1lbXNpemUsIGRtZW1zdGFydDsKLQotICAvKiBOb3cgZmlsbCBpbiBmaWVsZHMgaW4gdGhlIGV4ZWNwLCBmcm9tIHRoZSBieXRlcyBpbiB0aGUgcmF3IGRhdGEuICAqLwotICBleGVjcC0+YV9pbmZvID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBieXRlcy0+bV9zeW5jKTsKLSAgZXhlY3AtPmFfc3ltcyA9IDA7Ci0gIGV4ZWNwLT5hX2VudHJ5ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBieXRlcy0+bV9leGVjKTsKLSAgZXhlY3AtPmFfdGFsaWduID0gMjsKLSAgZXhlY3AtPmFfZGFsaWduID0gMjsKLSAgZXhlY3AtPmFfYmFsaWduID0gMjsKLQotICBkbG9hZCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1faWRhdGEpOwotICBleGVjcC0+YV9kYXRhID0gZGxvYWQgKyA4OwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSBkbG9hZCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IChiZmRfcmVhZCAoJmRtZW1zdGFydCwgc2l6ZW9mIChkbWVtc3RhcnQpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChkbWVtc3RhcnQpKQotICAgICAgfHwgKGJmZF9yZWFkICgmZG1lbXNpemUsIHNpemVvZiAoZG1lbXNpemUpLCAxLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChkbWVtc2l6ZSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjcC0+YV90bG9hZCA9IDA7Ci0gIGV4ZWNwLT5hX2Rsb2FkID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSAmZG1lbXN0YXJ0KTsKLSAgZXhlY3AtPmFfdGV4dCA9IGRsb2FkIC0gZXhlY3AtPmFfdGxvYWQ7Ci0gIGV4ZWNwLT5hX2RhdGEgPSBiZmRfaF9nZXRfMzIgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopICZkbWVtc2l6ZSk7Ci0gIGV4ZWNwLT5hX2JzcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgYnl0ZXMtPm1fZGF0YSkgLSBleGVjcC0+YV9kYXRhOwotCi0gIGV4ZWNwLT5hX3Ryc2l6ZSA9IDA7Ci0gIGV4ZWNwLT5hX2Ryc2l6ZSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZiAwCi0vKiBTd2FwcyB0aGUgaW5mb3JtYXRpb24gaW4gYW4gaW50ZXJuYWwgZXhlYyBoZWFkZXIgc3RydWN0dXJlIGludG8gdGhlCi0gICBzdXBwbGllZCBidWZmZXIgcmVhZHkgZm9yIHdyaXRpbmcgdG8gZGlzay4gICovCi0KLVBST1RPICh2b2lkLCBvczlrX3N3YXBfZXhlY19oZWFkZXJfb3V0LAotICAgICAgICAgKGJmZCAqIGFiZmQsCi0JICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqIGV4ZWNwLAotCSAgc3RydWN0IG1oX2NvbSAqIHJhd19ieXRlcykpOwotdm9pZAotb3M5a19zd2FwX2V4ZWNfaGVhZGVyX291dCAoYWJmZCwgZXhlY3AsIHJhd19ieXRlcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIG1oX2NvbSAqcmF3X2J5dGVzOwotewotICBtaF9jb20gKmJ5dGVzID0gKG1oX2NvbSAqKSByYXdfYnl0ZXM7Ci0KLSAgLyogTm93IGZpbGwgaW4gZmllbGRzIGluIHRoZSByYXcgZGF0YSwgZnJvbSB0aGUgZmllbGRzIGluIHRoZSBleGVjIHN0cnVjdC4gKi8KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9pbmZvLCBieXRlcy0+ZV9pbmZvKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90ZXh0LCBieXRlcy0+ZV90ZXh0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9kYXRhLCBieXRlcy0+ZV9kYXRhKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV9ic3MsIGJ5dGVzLT5lX2Jzcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfc3ltcywgYnl0ZXMtPmVfc3ltcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZW50cnksIGJ5dGVzLT5lX2VudHJ5KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleGVjcC0+YV90cnNpemUsIGJ5dGVzLT5lX3Ryc2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZHJzaXplLCBieXRlcy0+ZV9kcnNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4ZWNwLT5hX3Rsb2FkLCBieXRlcy0+ZV90bG9hZCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXhlY3AtPmFfZGxvYWQsIGJ5dGVzLT5lX2Rsb2FkKTsKLSAgYnl0ZXMtPmVfdGFsaWduWzBdID0gZXhlY3AtPmFfdGFsaWduOwotICBieXRlcy0+ZV9kYWxpZ25bMF0gPSBleGVjcC0+YV9kYWxpZ247Ci0gIGJ5dGVzLT5lX2JhbGlnblswXSA9IGV4ZWNwLT5hX2JhbGlnbjsKLSAgYnl0ZXMtPmVfcmVsYXhhYmxlWzBdID0gZXhlY3AtPmFfcmVsYXhhYmxlOwotfQotCi0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vczlrX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjIGFuZXhlYzsKLSAgbWhfY29tIGV4ZWNfYnl0ZXM7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGV4ZWNfYnl0ZXMsIE1IQ09NX0JZVEVTX1NJWkUsIDEsIGFiZmQpCi0gICAgICAhPSBNSENPTV9CWVRFU19TSVpFKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBhbmV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleGVjX2J5dGVzLm1fc3luYyk7Ci0gIGlmIChOX0JBRE1BRyAoYW5leGVjKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoISBvczlrX3N3YXBfZXhlY19oZWFkZXJfaW4gKGFiZmQsICZleGVjX2J5dGVzLCAmYW5leGVjKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBhb3V0XzMyX3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmFuZXhlYywgb3M5a19jYWxsYmFjayk7Ci19Ci0KLQotLyogRmluaXNoIHVwIHRoZSBvcGVuaW5nIG9mIGEgYi5vdXQgZmlsZSBmb3IgcmVhZGluZy4gIEZpbGwgaW4gYWxsIHRoZQotICAgZmllbGRzIHRoYXQgYXJlIG5vdCBoYW5kbGVkIGJ5IGNvbW1vbiBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3M5a19jYWxsYmFjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0gIHVuc2lnbmVkIGxvbmcgYnNzX3N0YXJ0OwotCi0gIC8qIEFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlICovCi0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9pMzg2LCAwKTsKLQotICAvKiBUaGUgcG9zaXRpb25zIG9mIHRoZSBzdHJpbmcgdGFibGUgYW5kIHN5bWJvbCB0YWJsZS4gICovCi0gIG9ial9zdHJfZmlsZXBvcyAoYWJmZCkgPSAwOwotICBvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpID0gMDsKLQotICAvKiBUaGUgYWxpZ25tZW50cyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSBleGVjcC0+YV90YWxpZ247Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfZGFsaWduOwotICBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gZXhlY3AtPmFfYmFsaWduOwotCi0gIC8qIFRoZSBzdGFydGluZyBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV90bG9hZDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBleGVjcC0+YV9kbG9hZDsKLQotICAvKiBBbmQgcmVsb2FkIHRoZSBzaXplcywgc2luY2UgdGhlIGFvdXQgbW9kdWxlIHphcHMgdGhlbSAqLwotICBvYmpfdGV4dHNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IGV4ZWNwLT5hX3RleHQ7Ci0KLSAgYnNzX3N0YXJ0ID0gZXhlY3AtPmFfZGxvYWQgKyBleGVjcC0+YV9kYXRhOwkvKiBCU1MgPSBlbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIG9ial9ic3NzZWMgKGFiZmQpLT52bWEgPSBhbGlnbl9wb3dlciAoYnNzX3N0YXJ0LCBleGVjcC0+YV9iYWxpZ24pOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgKi8KLSAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gZXhlY3AtPmFfZW50cnk7Ci0gIG9ial9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IGV4ZWNwLT5hX2Rsb2FkOwotCi0gIC8qIFRoZSBmaWxlIHBvc2l0aW9ucyBvZiB0aGUgcmVsb2NhdGlvbiBpbmZvICoqKgotICBvYmpfdGV4dHNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gTl9UUk9GRigqZXhlY3ApOwotICBvYmpfZGF0YXNlYyAoYWJmZCktPnJlbF9maWxlcG9zID0gIE5fRFJPRkYoKmV4ZWNwKTsKLSAgKi8KLQotICBhZGF0YSAoYWJmZCkucGFnZV9zaXplID0gMTsJLyogTm90IGFwcGxpY2FibGUuICovCi0gIGFkYXRhIChhYmZkKS5zZWdtZW50X3NpemUgPSAxOy8qIE5vdCBhcHBsaWNhYmxlLiAqLwotICBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplID0gTUhDT01fQllURVNfU0laRTsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2lmIDAKLXN0cnVjdCBib3V0X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBhb3V0ZGF0YSBhOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyBlOwotfTsKLQotc3RhdGljIGJvb2xlYW4KLW9zOWtfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0cjsKLQotICByYXdwdHIgPSAoc3RydWN0IGJvdXRfZGF0YV9zdHJ1Y3QgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYm91dF9kYXRhX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFiZmQtPnRkYXRhLmJvdXRfZGF0YSA9IHJhd3B0cjsKLSAgZXhlY19oZHIgKGFiZmQpID0gJnJhd3B0ci0+ZTsKLQotICBvYmpfdGV4dHNlYyAoYWJmZCkgPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG9ial9ic3NzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vczlrX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBzd2FwcGVkX2hkcjsKLQotICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBleGVjX2hkciAoYWJmZCktPmFfaW5mbyA9IEJNQUdJQzsKLQotICBleGVjX2hkciAoYWJmZCktPmFfdGV4dCA9IG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfZGF0YSA9IG9ial9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplOwotICBleGVjX2hkciAoYWJmZCktPmFfYnNzID0gb2JqX2Jzc3NlYyAoYWJmZCktPl9yYXdfc2l6ZTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIHNpemVvZiAoc3RydWN0IG5saXN0KTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsKLSAgZXhlY19oZHIgKGFiZmQpLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgotCQkJICAgICAgIHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbykpOwotICBleGVjX2hkciAoYWJmZCktPmFfZHJzaXplID0gKChvYmpfZGF0YXNlYyAoYWJmZCktPnJlbG9jX2NvdW50KSAqCi0JCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci0KLSAgZXhlY19oZHIgKGFiZmQpLT5hX3RhbGlnbiA9IG9ial90ZXh0c2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotICBleGVjX2hkciAoYWJmZCktPmFfZGFsaWduID0gb2JqX2RhdGFzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXI7Ci0gIGV4ZWNfaGRyIChhYmZkKS0+YV9iYWxpZ24gPSBvYmpfYnNzc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyOwotCi0gIGV4ZWNfaGRyIChhYmZkKS0+YV90bG9hZCA9IG9ial90ZXh0c2VjIChhYmZkKS0+dm1hOwotICBleGVjX2hkciAoYWJmZCktPmFfZGxvYWQgPSBvYmpfZGF0YXNlYyAoYWJmZCktPnZtYTsKLQotICBib3V0X3N3YXBfZXhlY19oZWFkZXJfb3V0IChhYmZkLCBleGVjX2hkciAoYWJmZCksICZzd2FwcGVkX2hkcik7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlICgoUFRSKSAmIHN3YXBwZWRfaGRyLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0JICAhPSBFWEVDX0JZVEVTX1NJWkUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8KLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChOX1NZTU9GRiAoKmV4ZWNfaGRyIChhYmZkKSkpLCBTRUVLX1NFVCkKLQkgICE9IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoIWFvdXRfMzJfd3JpdGVfc3ltcyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fVFJPRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX3RleHRzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgKE5fRFJPRkYgKCpleGVjX2hkciAoYWJmZCkpKSwgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCFiX291dF9zcXVpcnRfb3V0X3JlbG9jcyAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLXN0YXRpYyBib29sZWFuCi1vczlrX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7CQkJCS8qIHNldCBieSBiZmQuYyBoYW5kbGVyICovCi0gICAgICBpZiAoISBhb3V0XzMyX21ha2Vfc2VjdGlvbnMgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgb2JqX3RleHRzZWMgKGFiZmQpLT5maWxlcG9zID0gc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfZXhlYyk7Ci0gICAgICBvYmpfZGF0YXNlYyAoYWJmZCktPmZpbGVwb3MgPSBvYmpfdGV4dHNlYyAoYWJmZCktPmZpbGVwb3MKLQkrIG9ial90ZXh0c2VjIChhYmZkKS0+X3Jhd19zaXplOwotCi0gICAgfQotICAvKiByZWdhcmRsZXNzLCBvbmNlIHdlIGtub3cgd2hhdCB3ZSdyZSBkb2luZywgd2UgbWlnaHQgYXMgd2VsbCBnZXQgZ29pbmcgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGNvdW50ICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIChiZmRfd3JpdGUgKChQVFIpIGxvY2F0aW9uLCAxLCBjb3VudCwgYWJmZCkgPT0gY291bnQpID8gdHJ1ZSA6IGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYJLyogMCAqLwotCi1zdGF0aWMgaW50Ci1vczlrX3NpemVvZl9oZWFkZXJzIChpZ25vcmVfYWJmZCwgaWdub3JlKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBib29sZWFuIGlnbm9yZTsKLXsKLSAgcmV0dXJuIHNpemVvZiAoc3RydWN0IGludGVybmFsX2V4ZWMpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBhb3V0XzMyX2Nsb3NlX2FuZF9jbGVhbnVwIGFvdXRfMzJfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBhb3V0XzMyX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLQotI2RlZmluZSBhb3V0XzMyX2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0jZGVmaW5lIG9zOWtfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBvczlrX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgb3M5a19iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgb3M5a19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBvczlrX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG9zOWtfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgb3M5a19iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjID0KLXsKLSAgImkzODZvczlrIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb3M5a19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZHIgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IFdQX1RFWFQpLAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sIGxlYWRpbmcgY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsIG9zOWtfb2JqZWN0X3AsCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCBiZmRfZmFsc2UsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChhb3V0XzMyKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKGFvdXRfMzIpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChvczlrKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2llZWUuYyBiL2JmZC9pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNmIxMzYuLjAwMDAwMDAKLS0tIGEvYmZkL2llZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NzAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBpZWVlLTY5NSBvYmplY3RzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBLRUVQTUlOVVNQQ0lOSU5TVCAwCi0KLS8qIElFRUUgNjk1IGZvcm1hdCBpcyBhIHN0cmVhbSBvZiByZWNvcmRzLCB3aGljaCB3ZSBwYXJzZSB1c2luZyBhIHNpbXBsZSBvbmUtCi0gICB0b2tlbiAod2hpY2ggaXMgb25lIGJ5dGUgaW4gdGhpcyBsZXhpY29uKSBsb29rYWhlYWQgcmVjdXJzaXZlIGRlY2VudAotICAgcGFyc2VyLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImllZWUuaCIKLSNpbmNsdWRlICJsaWJpZWVlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2J5dGUgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV8yYnl0ZXMgUEFSQU1TICgoYmZkICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9pbnQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaWQgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hLCBhc3ltYm9sICosIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgaWVlZV93cml0ZV9pbnQ1IFBBUkFNUyAoKGJmZF9ieXRlICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfaW50NV9vdXQgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfc2VjdGlvbl9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRoX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gZG9fYXNfcmVwZWF0IFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkb193aXRob3V0X3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9leHRlcm5hbF9wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2RhdGFfcGFydCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV9kZWJ1Z19wYXJ0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX21lX3BhcnQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfcHJvY2Vzc29yIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfZGVidWcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc2x1cnBfc2VjdGlvbl9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEZ1bmN0aW9ucyBmb3Igd3JpdGluZyB0byBpZWVlIGZpbGVzIGluIHRoZSBzdHJhbmdlIHdheSB0aGF0IHRoZQotICAgc3RhbmRhcmQgcmVxdWlyZXMuICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGJhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJhcmc7Ci17Ci0gIGJmZF9ieXRlIGJ5dGU7Ci0KLSAgYnl0ZSA9IGJhcmc7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZieXRlLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgYnl0ZXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGJ5dGVzOwotewotICBiZmRfYnl0ZSBidWZmZXJbMl07Ci0KLSAgYnVmZmVyWzBdID0gYnl0ZXMgPj4gODsKLSAgYnVmZmVyWzFdID0gYnl0ZXMgJiAweGZmOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIDIsIGFiZmQpICE9IDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50IChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAodmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0KLSAgICAgIC8qIEhvdyBtYW55IHNpZ25pZmljYW50IGJ5dGVzID8gKi8KLSAgICAgIC8qIEZJWE1FIEZPUiBMT05HRVIgSU5UUyAqLwotICAgICAgaWYgKHZhbHVlICYgMHhmZjAwMDAwMCkKLQlsZW5ndGggPSA0OwotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwZmYwMDAwKQotCWxlbmd0aCA9IDM7Ci0gICAgICBlbHNlIGlmICh2YWx1ZSAmIDB4MDAwMGZmMDApCi0JbGVuZ3RoID0gMjsKLSAgICAgIGVsc2UKLQlsZW5ndGggPSAxOwotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgIChiZmRfYnl0ZSkgKChpbnQpIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtCi0JCQkJCSArIGxlbmd0aCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN3aXRjaCAobGVuZ3RoKQotCXsKLQljYXNlIDQ6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgKHZhbHVlID4+IDI0KSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAzOgotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAoYmZkX2J5dGUpICh2YWx1ZSA+PiAxNikpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMjoKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUgPj4gOCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgMToKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAodmFsdWUpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2lkIChhYmZkLCBpZCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICppZDsKLXsKLSAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbiAoaWQpOwotCi0gIGlmIChsZW5ndGggPD0gMTI3KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDI1NSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZW5zaW9uX2xlbmd0aF8xX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSBsZW5ndGgpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbmd0aCA8IDY1NTM1KQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGFiZmQsIChpbnQpIGxlbmd0aCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogc3RyaW5nIHRvbyBsb25nICglZCBjaGFycywgbWF4IDY1NTM1KSIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGVuZ3RoKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGlkLCAxLCBsZW5ndGgsIGFiZmQpICE9IGxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRnVuY3Rpb25zIGZvciByZWFkaW5nIGZyb20gaWVlZSBmaWxlcyBpbiB0aGUgc3RyYW5nZSB3YXkgdGhhdCB0aGUKLXN0YW5kYXJkIHJlcXVpcmVzOgotKi8KLQotI2RlZmluZSB0aGlzX2J5dGUoaWVlZSkgKigoaWVlZSktPmlucHV0X3ApCi0jZGVmaW5lIG5leHRfYnl0ZShpZWVlKSAoKGllZWUpLT5pbnB1dF9wKyspCi0jZGVmaW5lIHRoaXNfYnl0ZV9hbmRfbmV4dChpZWVlKSAoKigoaWVlZSktPmlucHV0X3ArKykpCi0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydAotcmVhZF8yYnl0ZXMgKGllZWUpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLXsKLSAgdW5zaWduZWQgY2hhciBjMSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gIHVuc2lnbmVkIGNoYXIgYzIgPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICByZXR1cm4gKGMxIDw8IDgpIHwgYzI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1iZmRfZ2V0X3N0cmluZyAoaWVlZSwgc3RyaW5nLCBsZW5ndGgpCi0gICAgIGNvbW1vbl9oZWFkZXJfdHlwZSAqaWVlZTsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmluZ1tpXSA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1yZWFkX2lkIChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIHNpemVfdCBsZW5ndGg7Ci0gIGNoYXIgKnN0cmluZzsKLSAgbGVuZ3RoID0gdGhpc19ieXRlX2FuZF9uZXh0IChpZWVlKTsKLSAgaWYgKGxlbmd0aCA8PSAweDdmKQotICAgIHsKLSAgICAgIC8qIFNpbXBsZSBzdHJpbmcgb2YgbGVuZ3RoIDAgdG8gMTI3ICovCi0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZSkKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCBieXRlLCBhbGxvd2luZyAwLi4yNTUgKi8KLSAgICAgIGxlbmd0aCA9IHRoaXNfYnl0ZV9hbmRfbmV4dCAoaWVlZSk7Ci0gICAgfQotICBlbHNlIGlmIChsZW5ndGggPT0gMHhkZikKLSAgICB7Ci0gICAgICAvKiBMZW5ndGggaXMgbmV4dCB0d28gYnl0ZXMsIGFsbG93aW5nIDAuLjY1NTM1ICovCi0gICAgICBsZW5ndGggPSB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgICAgbGVuZ3RoID0gKGxlbmd0aCAqIDI1NikgKyB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotICAgIH0KLSAgLyogQnV5IG1lbW9yeSBhbmQgcmVhZCBzdHJpbmcgKi8KLSAgc3RyaW5nID0gYmZkX2FsbG9jIChpZWVlLT5hYmZkLCBsZW5ndGggKyAxKTsKLSAgaWYgKCFzdHJpbmcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGJmZF9nZXRfc3RyaW5nIChpZWVlLCBzdHJpbmcsIGxlbmd0aCk7Ci0gIHN0cmluZ1tsZW5ndGhdID0gMDsKLSAgcmV0dXJuIHN0cmluZzsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiBwY3JlbDsKLSAgICAgdW5zaWduZWQgaW50IGluZGV4OwotewotICB1bnNpZ25lZCBpbnQgdGVybV9jb3VudCA9IDA7Ci0KLSAgaWYgKHZhbHVlICE9IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50Kys7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBEZWYgb2YgYSBjb21tb24gc3ltYm9sICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfWF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgdGVybV9jb3VudCsrOwotICAgIH0KLSAgZWxzZSBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgLyogUmVmIHRvIGRlZmluZWQgc3ltYm9sIC0gKi8KLQotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfR0xPQkFMKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9JX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChzeW1ib2wtPmZsYWdzICYgKEJTRl9MT0NBTCB8IEJTRl9TRUNUSU9OX1NZTSkpCi0JewotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgbG9jYWwgc3ltYm9sLiAgV2UgY2FuCi0JICAgICBlYXNpbHkgZG8gYSBsb2NhbCBhcyBhIHNlY3Rpb24rb2Zmc2V0LiAgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9SX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJICAgIChiZmRfYnl0ZSkgKHN5bWJvbC0+c2VjdGlvbi0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHRlcm1fY291bnQrKzsKLQkgIGlmIChzeW1ib2wtPnZhbHVlICE9IDApCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgc3ltYm9sLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICB0ZXJtX2NvdW50Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogdW5yZWNvZ25pemVkIHN5bWJvbCBgJXMnIGZsYWdzIDB4JXgiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBiZmRfYXN5bWJvbF9uYW1lIChzeW1ib2wpLAotCSAgICAgc3ltYm9sLT5mbGFncyk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIC8qIHN1YnRyYWN0IHRoZSBwYyBmcm9tIGhlcmUgYnkgYXNraW5nIGZvciBQQyBvZiB0aGlzIHNlY3Rpb24qLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3ZhcmlhYmxlX1BfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKGluZGV4ICsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgYSAwIGFkZHJlc3MuICAqLwotICBpZiAodGVybV9jb3VudCA9PSAwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHdoaWxlICh0ZXJtX2NvdW50ID4gMSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0ZXJtX2NvdW50LS07Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotd3JpdGVzIGFueSBpbnRlZ2VyIGludG8gdGhlIGJ1ZmZlciBzdXBwbGllZCBhbmQgYWx3YXlzIHRha2VzIDUgYnl0ZXMKLSovCi1zdGF0aWMgdm9pZAotaWVlZV93cml0ZV9pbnQ1IChidWZmZXIsIHZhbHVlKQotICAgICBiZmRfYnl0ZSAqYnVmZmVyOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBidWZmZXJbMF0gPSAoYmZkX2J5dGUpIGllZWVfbnVtYmVyX3JlcGVhdF80X2VudW07Ci0gIGJ1ZmZlclsxXSA9ICh2YWx1ZSA+PiAyNCkgJiAweGZmOwotICBidWZmZXJbMl0gPSAodmFsdWUgPj4gMTYpICYgMHhmZjsKLSAgYnVmZmVyWzNdID0gKHZhbHVlID4+IDgpICYgMHhmZjsKLSAgYnVmZmVyWzRdID0gKHZhbHVlID4+IDApICYgMHhmZjsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaW50NV9vdXQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci17Ci0gIGJmZF9ieXRlIGJbNV07Ci0KLSAgaWVlZV93cml0ZV9pbnQ1IChiLCB2YWx1ZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGIsIDEsIDUsIGFiZmQpICE9IDUpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2ludCAoaWVlZSwgdmFsdWVfcHRyKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJmZF92bWEgKnZhbHVlX3B0cjsKLXsKLSAgaW50IHZhbHVlID0gdGhpc19ieXRlIChpZWVlKTsKLSAgaW50IHJlc3VsdDsKLSAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPD0gMTI3KQotICAgIHsKLSAgICAgICp2YWx1ZV9wdHIgPSB2YWx1ZTsKLSAgICAgIG5leHRfYnl0ZSAoaWVlZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhbHVlID49IDB4ODAgJiYgdmFsdWUgPD0gMHg4OCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSB2YWx1ZSAmIDB4ZjsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICBuZXh0X2J5dGUgKGllZWUpOwotICAgICAgd2hpbGUgKGNvdW50KQotCXsKLQkgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCB0aGlzX2J5dGVfYW5kX25leHQgKGllZWUpOwotCSAgY291bnQtLTsKLQl9Ci0gICAgICAqdmFsdWVfcHRyID0gcmVzdWx0OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX2kgKGllZWUsIG9rKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci0gICAgIGJvb2xlYW4gKm9rOwotewotICBiZmRfdm1hIHg7Ci0gICpvayA9IHBhcnNlX2ludCAoaWVlZSwgJngpOwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIGJmZF92bWEKLW11c3RfcGFyc2VfaW50IChpZWVlKQotICAgICBjb21tb25faGVhZGVyX3R5cGUgKmllZWU7Ci17Ci0gIGJmZF92bWEgcmVzdWx0OwotICBCRkRfQVNTRVJUIChwYXJzZV9pbnQgKGllZWUsICZyZXN1bHQpID09IHRydWUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdAotewotICBiZmRfdm1hIHZhbHVlOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci19IGllZWVfdmFsdWVfdHlwZTsKLQotCi0jaWYgS0VFUE1JTlVTUENJTklOU1QKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIGFyZwotI2RlZmluZSBQQ1JFTF9PRkZTRVQgZmFsc2UKLQotI2Vsc2UKLQotI2RlZmluZSBTUkNfTUFTSyhhcmcpIDAKLSNkZWZpbmUgUENSRUxfT0ZGU0VUIHRydWUKLQotI2VuZGlmCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGFiczMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSBmYWxzZSwKLQkgMCwKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0JIDAsCi0JICJhYnMzMiIsCi0JIHRydWUsCi0JIDB4ZmZmZmZmZmYsCi0JIDB4ZmZmZmZmZmYsCi0JIGZhbHNlKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWJzMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczE2IiwKLQkgdHJ1ZSwKLQkgMHgwMDAwZmZmZiwKLQkgMHgwMDAwZmZmZiwKLQkgZmFsc2UpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBhYnM4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIGZhbHNlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwKLQkgMCwKLQkgImFiczgiLAotCSB0cnVlLAotCSAweDAwMDAwMGZmLAotCSAweDAwMDAwMGZmLAotCSBmYWxzZSk7Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIHJlbDMyX2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDIsCi0JIDMyLAotCSB0cnVlLAotCSAwLAotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0JIDAsCi0JICJyZWwzMiIsCi0JIHRydWUsCi0JIFNSQ19NQVNLICgweGZmZmZmZmZmKSwKLQkgMHhmZmZmZmZmZiwKLQkgUENSRUxfT0ZGU0VUKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmVsMTZfaG93dG8gPQotICBIT1dUTyAoMSwKLQkgMCwKLQkgMSwKLQkgMTYsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDE2IiwKLQkgdHJ1ZSwKLQkgU1JDX01BU0sgKDB4MDAwMGZmZmYpLAotCSAweDAwMDBmZmZmLAotCSBQQ1JFTF9PRkZTRVQpOwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSByZWw4X2hvd3RvID0KLSAgSE9XVE8gKDEsCi0JIDAsCi0JIDAsCi0JIDgsCi0JIHRydWUsCi0JIDAsCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwKLQkgMCwKLQkgInJlbDgiLAotCSB0cnVlLAotCSBTUkNfTUFTSyAoMHgwMDAwMDBmZiksCi0JIDB4MDAwMDAwZmYsCi0JIFBDUkVMX09GRlNFVCk7Ci0KLXN0YXRpYyBpZWVlX3N5bWJvbF9pbmRleF90eXBlIE5PU1lNQk9MID0gezAsIDB9OwotCi1zdGF0aWMgdm9pZAotcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwgdmFsdWUsIHN5bWJvbCwgcGNyZWwsIGV4dHJhLCBzZWN0aW9uKQotICAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLSAgICAgYmZkX3ZtYSAqdmFsdWU7Ci0gICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgKnN5bWJvbDsKLSAgICAgYm9vbGVhbiAqcGNyZWw7Ci0gICAgIHVuc2lnbmVkIGludCAqZXh0cmE7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbjsKLQotewotI2RlZmluZSBQT1Mgc3BbMV0KLSNkZWZpbmUgVE9TIHNwWzBdCi0jZGVmaW5lIE5PUyBzcFstMV0KLSNkZWZpbmUgSU5DIHNwKys7Ci0jZGVmaW5lIERFQyBzcC0tOwotCi0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGllZWVfdmFsdWVfdHlwZSBzdGFja1sxMF07Ci0KLSAgLyogVGhlIHN0YWNrIHBvaW50ZXIgYWx3YXlzIHBvaW50cyB0byB0aGUgbmV4dCB1bnVzZWQgbG9jYXRpb24gKi8KLSNkZWZpbmUgUFVTSCh4LHkseikgVE9TLnN5bWJvbD14O1RPUy5zZWN0aW9uPXk7VE9TLnZhbHVlPXo7SU5DOwotI2RlZmluZSBQT1AoeCx5LHopIERFQzt4PVRPUy5zeW1ib2w7eT1UT1Muc2VjdGlvbjt6PVRPUy52YWx1ZTsKLSAgaWVlZV92YWx1ZV90eXBlICpzcCA9IHN0YWNrOwotCi0gIHdoaWxlIChsb29wKQotICAgIHsKLSAgICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQl7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1BfZW51bToKLQkgIC8qIFAgdmFyaWFibGUsIGN1cnJlbnQgcHJvZ3JhbSBjb3VudGVyIGZvciBzZWN0aW9uIG4gKi8KLQkgIHsKLQkgICAgaW50IHNlY3Rpb25fbjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgKnBjcmVsID0gdHJ1ZTsKLQkgICAgc2VjdGlvbl9uID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICBQVVNIIChOT1NZTUJPTCwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgaWVlZV92YXJpYWJsZV9MX2VudW06Ci0JICAvKiBMIHZhcmlhYmxlICBhZGRyZXNzIG9mIHNlY3Rpb24gTiAqLwotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgIFBVU0ggKE5PU1lNQk9MLCBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV0sIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQkgIC8qIFIgdmFyaWFibGUsIGxvZ2ljYWwgYWRkcmVzcyBvZiBzZWN0aW9uIG1vZHVsZSAqLwotCSAgLyogRklYTUUsIHRoaXMgc2hvdWxkIGJlIGRpZmZlcmVudCB0byBMICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsIGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXSwgMCk7Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfU19lbnVtOgotCSAgLyogUyB2YXJpYWJsZSwgc2l6ZSBpbiBNQVVTIG9mIHNlY3Rpb24gbW9kdWxlICovCi0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgUFVTSCAoTk9TWU1CT0wsCi0JCTAsCi0JCWllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXS0+X3Jhd19zaXplKTsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV92YXJpYWJsZV9JX2VudW06Ci0JICAvKiBQdXNoIHRoZSBhZGRyZXNzIG9mIHZhcmlhYmxlIG4gKi8KLQkgIHsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgc3kuaW5kZXggPSAoaW50KSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmxldHRlciA9ICdJJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX2Fic19zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFyaWFibGVfWF9lbnVtOgotCSAgLyogUHVzaCB0aGUgYWRkcmVzcyBvZiBleHRlcm5hbCB2YXJpYWJsZSBuICovCi0JICB7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3k7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIHN5LmluZGV4ID0gKGludCkgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSk7Ci0JICAgIHN5LmxldHRlciA9ICdYJzsKLQotCSAgICBQVVNIIChzeSwgYmZkX3VuZF9zZWN0aW9uX3B0ciwgMCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfZnVuY3Rpb25fbWludXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xLCAqc2VjdGlvbl9kdW1teTsKLQkgICAgaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeTsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5LCBzZWN0aW9uMSwgdmFsdWUxKTsKLQkgICAgUE9QIChzeSwgc2VjdGlvbl9kdW1teSwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3ksIHNlY3Rpb24xID8gc2VjdGlvbjEgOiBzZWN0aW9uX2R1bW15LCB2YWx1ZTIgLSB2YWx1ZTEpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX3BsdXNfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSB2YWx1ZTEsIHZhbHVlMjsKLQkgICAgYXNlY3Rpb24gKnNlY3Rpb24xOwotCSAgICBhc2VjdGlvbiAqc2VjdGlvbjI7Ci0JICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5MjsKLQkgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgICBQT1AgKHN5MSwgc2VjdGlvbjEsIHZhbHVlMSk7Ci0JICAgIFBPUCAoc3kyLCBzZWN0aW9uMiwgdmFsdWUyKTsKLQkgICAgUFVTSCAoc3kxLmxldHRlciA/IHN5MSA6IHN5MiwKLQkJICBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24xKSA/IHNlY3Rpb24yIDogc2VjdGlvbjEsCi0JCSAgdmFsdWUxICsgdmFsdWUyKTsKLQkgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB7Ci0JICAgIGJmZF92bWEgdmE7Ci0JICAgIEJGRF9BU1NFUlQgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPCAoaW50KSBpZWVlX3ZhcmlhYmxlX0FfZW51bQotCQkgICAgfHwgdGhpc19ieXRlICgmKGllZWUtPmgpKSA+IChpbnQpIGllZWVfdmFyaWFibGVfWl9lbnVtKTsKLQkgICAgaWYgKHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhKSkKLQkgICAgICB7Ci0JCVBVU0ggKE5PU1lNQk9MLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB2YSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQkvKgotCQkgIFRoYXRzIGFsbCB0aGF0IHdlIGNhbiB1bmRlcnN0YW5kLiBBcyBmYXIgYXMgSSBjYW4gc2VlCi0JCSAgdGhlcmUgaXMgYSBidWcgaW4gdGhlIE1pY3JvdGVjIElFRUUgb3V0cHV0IHdoaWNoIEknbQotCQkgIHVzaW5nIHRvIHNjYW4sIHdoZXJlYnkgdGhlIGNvbW1hIG9wZXJhdG9yIGlzIG9taXR0ZWQKLQkJICBzb21ldGltZXMgaW4gYW4gZXhwcmVzc2lvbiwgZ2l2aW5nIGV4cHJlc3Npb25zIHdpdGggdG9vCi0JCSAgbWFueSB0ZXJtcy4gV2UgY2FuIHRlbGwgaWYgdGhhdCdzIHRoZSBjYXNlIGJ5IGVuc3VyaW5nCi0JCSAgdGhhdCBzcCA9PSBzdGFjayBoZXJlLiBJZiBub3QsIHRoZW4gd2UndmUgcHVzaGVkCi0JCSAgc29tZXRoaW5nIHRvbyBmYXIsIHNvIHdlIGtlZXAgYWRkaW5nLiAgKi8KLQotCQl3aGlsZSAoc3AgIT0gc3RhY2sgKyAxKQotCQkgIHsKLQkJICAgIGFzZWN0aW9uICpzZWN0aW9uMTsKLQkJICAgIGllZWVfc3ltYm9sX2luZGV4X3R5cGUgc3kxOwotCQkgICAgUE9QIChzeTEsIHNlY3Rpb24xLCAqZXh0cmEpOwotCQkgIH0KLQkJewotCQkgIGFzZWN0aW9uICpkdW1teTsKLQotCQkgIFBPUCAoKnN5bWJvbCwgZHVtbXksICp2YWx1ZSk7Ci0JCSAgaWYgKHNlY3Rpb24pCi0JCSAgICAqc2VjdGlvbiA9IGR1bW15OwotCQl9Ci0KLQkJbG9vcCA9IGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0gICAgfQotfQotCi0KLSNkZWZpbmUgaWVlZV9zZWVrKGFiZmQsIG9mZnNldCkgXAotICBJRUVFX0RBVEEoYWJmZCktPmguaW5wdXRfcCA9IElFRUVfREFUQShhYmZkKS0+aC5maXJzdF9ieXRlICsgb2Zmc2V0Ci0KLSNkZWZpbmUgaWVlZV9wb3MoYWJmZCkgXAotICAoSUVFRV9EQVRBKGFiZmQpLT5oLmlucHV0X3AgLSBJRUVFX0RBVEEoYWJmZCktPmguZmlyc3RfYnl0ZSkKLQotc3RhdGljIHVuc2lnbmVkIGludCBsYXN0X2luZGV4Owotc3RhdGljIGNoYXIgbGFzdF90eXBlOwkJLyogaXMgdGhlIGluZGV4IGZvciBhbiBYIG9yIGEgRCAqLwotCi1zdGF0aWMgaWVlZV9zeW1ib2xfdHlwZSAqCi1nZXRfc3ltYm9sIChhYmZkLAotCSAgICBpZWVlLAotCSAgICBsYXN0X3N5bWJvbCwKLQkgICAgc3ltYm9sX2NvdW50LAotCSAgICBwcHRyLAotCSAgICBtYXhfaW5kZXgsCi0JICAgIHRoaXNfdHlwZQotKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICBpZWVlX3N5bWJvbF90eXBlICpsYXN0X3N5bWJvbDsKLSAgICAgdW5zaWduZWQgaW50ICpzeW1ib2xfY291bnQ7Ci0gICAgIGllZWVfc3ltYm9sX3R5cGUgKioqcHB0cjsKLSAgICAgdW5zaWduZWQgaW50ICptYXhfaW5kZXg7Ci0gICAgIGNoYXIgdGhpc190eXBlCi0gICAgICA7Ci17Ci0gIC8qIE5lZWQgYSBuZXcgc3ltYm9sICovCi0gIHVuc2lnbmVkIGludCBuZXdfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gIGlmIChuZXdfaW5kZXggIT0gbGFzdF9pbmRleCB8fCB0aGlzX3R5cGUgIT0gbGFzdF90eXBlKQotICAgIHsKLSAgICAgIGllZWVfc3ltYm9sX3R5cGUgKm5ld19zeW1ib2wgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwKLQkJCQkJCSBzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUpKTsKLSAgICAgIGlmICghbmV3X3N5bWJvbCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbmV3X3N5bWJvbC0+aW5kZXggPSBuZXdfaW5kZXg7Ci0gICAgICBsYXN0X2luZGV4ID0gbmV3X2luZGV4OwotICAgICAgKCpzeW1ib2xfY291bnQpKys7Ci0gICAgICAqKnBwdHIgPSBuZXdfc3ltYm9sOwotICAgICAgKnBwdHIgPSAmbmV3X3N5bWJvbC0+bmV4dDsKLSAgICAgIGlmIChuZXdfaW5kZXggPiAqbWF4X2luZGV4KQotCXsKLQkgICptYXhfaW5kZXggPSBuZXdfaW5kZXg7Ci0JfQotICAgICAgbGFzdF90eXBlID0gdGhpc190eXBlOwotICAgICAgbmV3X3N5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICAgICAgcmV0dXJuIG5ld19zeW1ib2w7Ci0gICAgfQotICByZXR1cm4gbGFzdF9zeW1ib2w7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2V4dGVybmFsX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBmaWxlX3B0ciBvZmZzZXQgPSBpZWVlLT53LnIuZXh0ZXJuYWxfcGFydDsKLQotICBpZWVlX3N5bWJvbF90eXBlICoqcHJldl9zeW1ib2xzX3B0ciA9ICZpZWVlLT5leHRlcm5hbF9zeW1ib2xzOwotICBpZWVlX3N5bWJvbF90eXBlICoqcHJldl9yZWZlcmVuY2VfcHRyID0gJmllZWUtPmV4dGVybmFsX3JlZmVyZW5jZTsKLSAgaWVlZV9zeW1ib2xfdHlwZSAqc3ltYm9sID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudCA9IDA7Ci0gIGJvb2xlYW4gbG9vcCA9IHRydWU7Ci0gIGxhc3RfaW5kZXggPSAweGZmZmZmZjsKLSAgaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPSB0cnVlOwotCi0gIGllZWVfc2VlayAoYWJmZCwgb2Zmc2V0KTsKLQotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JewotCWNhc2UgaWVlZV9ubl9yZWNvcmQ6Ci0JICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0JICBzeW1ib2wgPSBnZXRfc3ltYm9sIChhYmZkLCBpZWVlLCBzeW1ib2wsICZzeW1ib2xfY291bnQsCi0JCQkgICAgICAgJnByZXZfc3ltYm9sc19wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXgsICdJJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX05PX0ZMQUdTOwotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3N5bWJvbHNfcHRyLAotCQkJICAgICAgICZpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4LCAnRCcpOwotCSAgaWYgKHN5bWJvbCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIEJGRF9BU1NFUlQgKHN5bWJvbC0+aW5kZXggPj0gaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21pbl9pbmRleCk7Ci0KLQkgIHN5bWJvbC0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCSAgc3ltYm9sLT5zeW1ib2wubmFtZSA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCSAgc3ltYm9sLT5zeW1ib2wudWRhdGEucCA9IChQVFIpIE5VTEw7Ci0JICBzeW1ib2wtPnN5bWJvbC5mbGFncyA9IEJTRl9OT19GTEFHUzsKLQkgIGJyZWFrOwotCWNhc2UgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0gPj4gODoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2luZGV4OwotCSAgICB1bnNpZ25lZCBpbnQgc3ltYm9sX3R5cGVfaW5kZXg7Ci0JICAgIHVuc2lnbmVkIGludCBzeW1ib2xfYXR0cmlidXRlX2RlZjsKLQkgICAgYmZkX3ZtYSB2YWx1ZTsKLQkgICAgc3dpdGNoIChyZWFkXzJieXRlcyAoaWVlZSkpCi0JICAgICAgewotCSAgICAgIGNhc2UgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW06Ci0JCXN5bWJvbF9uYW1lX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQlzeW1ib2xfdHlwZV9pbmRleCA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJc3ltYm9sX2F0dHJpYnV0ZV9kZWYgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCXN3aXRjaCAoc3ltYm9sX2F0dHJpYnV0ZV9kZWYpCi0JCSAgewotCQkgIGNhc2UgODoKLQkJICBjYXNlIDE5OgotCQkgICAgcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgICAgKF8oIiVzOiB1bmltcGxlbWVudGVkIEFUSSByZWNvcmQgICV1IGZvciBzeW1ib2wgJXUiKSwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzeW1ib2xfYXR0cmlidXRlX2RlZiwKLQkJICAgICAgIHN5bWJvbF9uYW1lX2luZGV4KTsKLQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICBjYXNlIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2luZm9fcmVjb3JkX2VudW06Ci0JCS8qIFNraXAgb3ZlciBBVFggcmVjb3JkLiAqLwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCXBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdmFsdWUpOwotCQlwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgaWVlZV9hdG5fcmVjb3JkX2VudW06Ci0JCS8qIFdlIG1heSBnZXQgY2FsbCBvcHRpbWl6YXRpb24gaW5mb3JtYXRpb24gaGVyZSwKLQkJICAgd2hpY2ggd2UganVzdCBpZ25vcmUuICBUaGUgZm9ybWF0IGlzCi0JCSAgIHskRjF9JHtDRX17aW5kZXh9eyQwMH17JDNGfXskM0Z9eyNfb2ZfQVNOc30gKi8KLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJaWYgKHZhbHVlICE9IDB4M2YpCi0JCSAgewotCQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAgIChfKCIlczogdW5leHBlY3RlZCBBVE4gdHlwZSAlZCBpbiBleHRlcm5hbCBwYXJ0IiksCi0JCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIChpbnQpIHZhbHVlKTsKLQkJICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJcGFyc2VfaW50ICgmaWVlZS0+aCwgJnZhbHVlKTsKLQkJd2hpbGUgKHZhbHVlID4gMCkKLQkJICB7Ci0JCSAgICBiZmRfdm1hIHZhbDE7Ci0KLQkJICAgIC0tdmFsdWU7Ci0KLQkJICAgIHN3aXRjaCAocmVhZF8yYnl0ZXMgKGllZWUpKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgaWVlZV9hc25fcmVjb3JkX2VudW06Ci0JCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsMSk7Ci0JCQlwYXJzZV9pbnQgKCZpZWVlLT5oLCAmdmFsMSk7Ci0JCQlicmVhazsKLQotCQkgICAgICBkZWZhdWx0OgotCQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCQkgIChfKCIlczogdW5leHBlY3RlZCB0eXBlIGFmdGVyIEFUTiIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfdmFsdWVfcmVjb3JkX2VudW0gPj4gODoKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHN5bWJvbF9uYW1lX2luZGV4OwotCSAgICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbF9pZ25vcmU7Ci0JICAgIGJvb2xlYW4gcGNyZWxfaWdub3JlOwotCSAgICB1bnNpZ25lZCBpbnQgZXh0cmE7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0KLQkgICAgc3ltYm9sX25hbWVfaW5kZXggPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHBhcnNlX2V4cHJlc3Npb24gKGllZWUsCi0JCQkgICAgICAmc3ltYm9sLT5zeW1ib2wudmFsdWUsCi0JCQkgICAgICAmc3ltYm9sX2lnbm9yZSwKLQkJCSAgICAgICZwY3JlbF9pZ25vcmUsCi0JCQkgICAgICAmZXh0cmEsCi0JCQkgICAgICAmc3ltYm9sLT5zeW1ib2wuc2VjdGlvbik7Ci0KLQkgICAgLyogRnVsbHkgbGlua2VkIElFRUUtNjk1IGZpbGVzIHRlbmQgdG8gZ2l2ZSBldmVyeSBzeW1ib2wKLSAgICAgICAgICAgICAgIGFuIGFic29sdXRlIHZhbHVlLiAgVHJ5IHRvIGNvbnZlcnQgdGhhdCBiYWNrIGludG8gYQotICAgICAgICAgICAgICAgc2VjdGlvbiByZWxhdGl2ZSB2YWx1ZS4gIEZJWE1FOiBUaGlzIHdvbid0IGFsd2F5cyB0bwotICAgICAgICAgICAgICAgdGhlIHJpZ2h0IHRoaW5nLiAgKi8KLQkgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltYm9sLT5zeW1ib2wuc2VjdGlvbikKLQkJJiYgKGFiZmQtPmZsYWdzICYgSEFTX1JFTE9DKSA9PSAwKQotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWw7Ci0JCWFzZWN0aW9uICpzOwotCi0JCXZhbCA9IHN5bWJvbC0+c3ltYm9sLnZhbHVlOwotCQlmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQkJICB7Ci0JCSAgICBpZiAodmFsID49IHMtPnZtYSAmJiB2YWwgPCBzLT52bWEgKyBzLT5fcmF3X3NpemUpCi0JCSAgICAgIHsKLQkJCXN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBzOwotCQkJc3ltYm9sLT5zeW1ib2wudmFsdWUgLT0gcy0+dm1hOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCi0JICAgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQ7Ci0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgaWVlZV93ZWFrX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIHNpemU7Ci0JICAgIGJmZF92bWEgdmFsdWU7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIC8qIFRocm93IGF3YXkgdGhlIGV4dGVybmFsIHJlZmVyZW5jZSBpbmRleCAqLwotCSAgICAodm9pZCkgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBGZXRjaCB0aGUgZGVmYXVsdCBzaXplIGlmIG5vdCByZXNvbHZlZCAqLwotCSAgICBzaXplID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAvKiBGZXRjaCB0aGUgZGVmYXV0bHQgdmFsdWUgaWYgYXZhaWxhYmxlICovCi0JICAgIGlmIChwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSkgPT0gZmFsc2UpCi0JICAgICAgewotCQl2YWx1ZSA9IDA7Ci0JICAgICAgfQotCSAgICAvKiBUaGlzIHR1cm5zIGludG8gYSBjb21tb24gKi8KLQkgICAgc3ltYm9sLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICAgIHN5bWJvbC0+c3ltYm9sLnZhbHVlID0gc2l6ZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtOgotCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotCSAgc3ltYm9sID0gZ2V0X3N5bWJvbCAoYWJmZCwgaWVlZSwgc3ltYm9sLCAmc3ltYm9sX2NvdW50LAotCQkJICAgICAgICZwcmV2X3JlZmVyZW5jZV9wdHIsCi0JCQkgICAgICAgJmllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXgsICdYJyk7Ci0JICBpZiAoc3ltYm9sID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgc3ltYm9sLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW1ib2wtPnN5bWJvbC5uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0JICBzeW1ib2wtPnN5bWJvbC51ZGF0YS5wID0gKFBUUikgTlVMTDsKLQkgIHN5bWJvbC0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgc3ltYm9sLT5zeW1ib2wudmFsdWUgPSAoYmZkX3ZtYSkgMDsKLQkgIHN5bWJvbC0+c3ltYm9sLmZsYWdzID0gMDsKLQotCSAgQkZEX0FTU0VSVCAoc3ltYm9sLT5pbmRleCA+PSBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4KTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4ICE9IDApCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2NvdW50ID0KLQlpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWF4X2luZGV4IC0KLQlpZWVlLT5leHRlcm5hbF9zeW1ib2xfbWluX2luZGV4ICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQgPSAwOwotICAgIH0KLQotICBpZiAoaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCA9Ci0JaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCAtCi0JaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21pbl9pbmRleCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgYWJmZC0+c3ltY291bnQgPQotICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9jb3VudCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9jb3VudDsKLQotICBpZiAoc3ltYm9sX2NvdW50ICE9IGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGFyZSBnYXBzIGluIHRoZSB0YWJsZSAtLSAqLwotICAgICAgaWVlZS0+c3ltYm9sX3RhYmxlX2Z1bGwgPSBmYWxzZTsKLSAgICB9Ci0KLSAgKnByZXZfc3ltYm9sc19wdHIgPSAoaWVlZV9zeW1ib2xfdHlwZSAqKSBOVUxMOwotICAqcHJldl9yZWZlcmVuY2VfcHRyID0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChJRUVFX0RBVEEgKGFiZmQpLT5yZWFkX3N5bWJvbHMgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9zbHVycF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBJRUVFX0RBVEEgKGFiZmQpLT5yZWFkX3N5bWJvbHMgPSB0cnVlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWxvbmcKLWllZWVfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoISBpZWVlX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAoYWJmZC0+c3ltY291bnQgIT0gMCkgPwotICAgIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAoaWVlZV9zeW1ib2xfdHlwZSAqKSkgOiAwOwotfQotCi0vKgotTW92ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0cyB0byB0aGUgY2Fub24gdGFibGUsIGFuZCBpbnNlcnQgaW4KLXN5bWJvbCBpbmRleCBvcmRlcgotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci0KLWxvbmcKLWllZWVfZ2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKmxvY2F0aW9uOwotewotICBpZWVlX3N5bWJvbF90eXBlICpzeW1wOwotICBzdGF0aWMgYmZkIGR1bW15X2JmZDsKLSAgc3RhdGljIGFzeW1ib2wgZW1wdHlfc3ltYm9sID0KLSAgLyogdGhlX2JmZCwgbmFtZSwgdmFsdWUsIGF0dHIsIHNlY3Rpb24gKi8KLSAgeyZkdW1teV9iZmQsICIgaWVlZSBlbXB0eSIsIChzeW12YWx1ZSkgMCwgQlNGX0RFQlVHR0lORywgYmZkX2Fic19zZWN0aW9uX3B0cn07Ci0KLSAgaWYgKGFiZmQtPnN5bWNvdW50KQotICAgIHsKLSAgICAgIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgICAgIGR1bW15X2JmZC54dmVjID0gJmllZWVfdmVjOwotICAgICAgaWYgKCEgaWVlZV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKGllZWUtPnN5bWJvbF90YWJsZV9mdWxsID09IGZhbHNlKQotCXsKLQkgIC8qIEFycmdoIC0gdGhlcmUgYXJlIGdhcHMgaW4gdGhlIHRhYmxlLCBydW4gdGhyb3VnaCBhbmQgZmlsbCB0aGVtICovCi0JICAvKiB1cCB3aXRoIHBvaW50ZXJzIHRvIGEgbnVsbCBwbGFjZSAqLwotCSAgdW5zaWduZWQgaW50IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYWJmZC0+c3ltY291bnQ7IGkrKykKLQkgICAgewotCSAgICAgIGxvY2F0aW9uW2ldID0gJmVtcHR5X3N5bWJvbDsKLQkgICAgfQotCX0KLQotICAgICAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0ID0gLWllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXg7Ci0gICAgICBmb3IgKHN5bXAgPSBJRUVFX0RBVEEgKGFiZmQpLT5leHRlcm5hbF9zeW1ib2xzOwotCSAgIHN5bXAgIT0gKGllZWVfc3ltYm9sX3R5cGUgKikgTlVMTDsKLQkgICBzeW1wID0gc3ltcC0+bmV4dCkKLQl7Ci0JICAvKiBQbGFjZSBpbnRvIHRhYmxlIGF0IGNvcnJlY3QgaW5kZXggbG9jYXRpb25zICovCi0JICBsb2NhdGlvbltzeW1wLT5pbmRleCArIGllZWUtPmV4dGVybmFsX3N5bWJvbF9iYXNlX29mZnNldF0gPSAmc3ltcC0+c3ltYm9sOwotCX0KLQotICAgICAgLyogVGhlIGV4dGVybmFsIHJlZnMgYXJlIGluZGV4ZWQgaW4gYSBiaXQgKi8KLSAgICAgIGllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9iYXNlX29mZnNldCA9Ci0JLWllZWUtPmV4dGVybmFsX3JlZmVyZW5jZV9taW5faW5kZXggKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfY291bnQ7Ci0KLSAgICAgIGZvciAoc3ltcCA9IElFRUVfREFUQSAoYWJmZCktPmV4dGVybmFsX3JlZmVyZW5jZTsKLQkgICBzeW1wICE9IChpZWVlX3N5bWJvbF90eXBlICopIE5VTEw7Ci0JICAgc3ltcCA9IHN5bXAtPm5leHQpCi0JewotCSAgbG9jYXRpb25bc3ltcC0+aW5kZXggKyBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfYmFzZV9vZmZzZXRdID0KLQkgICAgJnN5bXAtPnN5bWJvbDsKLQotCX0KLSAgICB9Ci0gIGlmIChhYmZkLT5zeW1jb3VudCkKLSAgICB7Ci0gICAgICBsb2NhdGlvblthYmZkLT5zeW1jb3VudF0gPSAoYXN5bWJvbCAqKSBOVUxMOwotICAgIH0KLSAgcmV0dXJuIGFiZmQtPnN5bWNvdW50OwotfQotCi1zdGF0aWMgYXNlY3Rpb24gKgotZ2V0X3NlY3Rpb25fZW50cnkgKGFiZmQsIGllZWUsIGluZGV4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA+PSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGMsIGk7Ci0gICAgICBhc2VjdGlvbiAqKm47Ci0KLSAgICAgIGMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemU7Ci0gICAgICBpZiAoYyA9PSAwKQotCWMgPSAyMDsKLSAgICAgIHdoaWxlIChjIDw9IGluZGV4KQotCWMgKj0gMjsKLQotICAgICAgbiA9ICgoYXNlY3Rpb24gKiopCi0JICAgYmZkX3JlYWxsb2MgKGllZWUtPnNlY3Rpb25fdGFibGUsIGMgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gICAgICBpZiAobiA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBmb3IgKGkgPSBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemU7IGkgPCBjOyBpKyspCi0JbltpXSA9IE5VTEw7Ci0KLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGUgPSBuOwotICAgICAgaWVlZS0+c2VjdGlvbl90YWJsZV9zaXplID0gYzsKLSAgICB9Ci0KLSAgaWYgKGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnRtcCA9IGJmZF9hbGxvYyAoYWJmZCwgMTEpOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgICAgIGlmICghdG1wKQotCXJldHVybiBOVUxMOwotICAgICAgc3ByaW50ZiAodG1wLCAiIGZzZWMlNGQiLCBpbmRleCk7Ci0gICAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgdG1wKTsKLSAgICAgIGllZWUtPnNlY3Rpb25fdGFibGVbaW5kZXhdID0gc2VjdGlvbjsKLSAgICAgIHNlY3Rpb24tPmZsYWdzID0gU0VDX05PX0ZMQUdTOwotICAgICAgc2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gaW5kZXg7Ci0gICAgICBpZWVlLT5zZWN0aW9uX3RhYmxlW2luZGV4XSA9IHNlY3Rpb247Ci0gICAgfQotICByZXR1cm4gaWVlZS0+c2VjdGlvbl90YWJsZVtpbmRleF07Ci19Ci0KLXN0YXRpYyB2b2lkCi1pZWVlX3NsdXJwX3NlY3Rpb25zIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgZmlsZV9wdHIgb2Zmc2V0ID0gaWVlZS0+dy5yLnNlY3Rpb25fcGFydDsKLSAgYXNlY3Rpb24gKnNlY3Rpb24gPSAoYXNlY3Rpb24gKikgTlVMTDsKLSAgY2hhciAqbmFtZTsKLQotICBpZiAob2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgYmZkX2J5dGUgc2VjdGlvbl90eXBlWzNdOwotICAgICAgaWVlZV9zZWVrIChhYmZkLCBvZmZzZXQpOwotICAgICAgd2hpbGUgKHRydWUpCi0JewotCSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotCSAgICB7Ci0JICAgIGNhc2UgaWVlZV9zZWN0aW9uX3R5cGVfZW51bToKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBzZWN0aW9uX2luZGV4OwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQlzZWN0aW9uX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0JCXNlY3Rpb24gPSBnZXRfc2VjdGlvbl9lbnRyeSAoYWJmZCwgaWVlZSwgc2VjdGlvbl9pbmRleCk7Ci0KLQkJc2VjdGlvbl90eXBlWzBdID0gdGhpc19ieXRlX2FuZF9uZXh0ICgmKGllZWUtPmgpKTsKLQotCQkvKiBTZXQgbWluaW1hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuIEF0dHJpYnV0ZXMgYXJlCi0JCSAgIGV4dGVuZGVkIGxhdGVyLCBiYXNlZCBvbiBzZWN0aW9uIGNvbnRlbnRzLiAqLwotCi0JCXN3aXRjaCAoc2VjdGlvbl90eXBlWzBdKQotCQkgIHsKLQkJICBjYXNlIDB4QzE6Ci0JCSAgICAvKiBOb3JtYWwgYXR0cmlidXRlcyBmb3IgYWJzb2x1dGUgc2VjdGlvbnMJKi8KLQkJICAgIHNlY3Rpb25fdHlwZVsxXSA9IHRoaXNfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCSAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkJICAgIHN3aXRjaCAoc2VjdGlvbl90eXBlWzFdKQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMHhEMzoJLyogQVMgQWJzb2x1dGUgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0JCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc2VjdGlvbl90eXBlWzJdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJCXN3aXRjaCAoc2VjdGlvbl90eXBlWzJdKQotCQkJICB7Ci0JCQkgIGNhc2UgMHhEMDoKLQkJCSAgICAvKiBOb3JtYWwgY29kZSAqLwotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0NPREU7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMHhDNDoKLQkJCSAgICAvKiBOb3JtYWwgZGF0YSAqLwotCQkJICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQkgICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgMHhEMjoKLQkJCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJICAgIC8qIE5vcm1hbCByb20gZGF0YSAqLwotCQkJICAgIHNlY3Rpb24tPmZsYWdzIHw9IFNFQ19ST00gfCBTRUNfREFUQTsKLQkJCSAgICBicmVhazsKLQkJCSAgZGVmYXVsdDoKLQkJCSAgICBicmVhazsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDB4QzM6CS8qIE5hbWVkIHJlbG9jYXRhYmxlIHNlY3Rpb25zICh0eXBlIEMpICovCi0JCSAgICBzZWN0aW9uX3R5cGVbMV0gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgc2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JCSAgICBzd2l0Y2ggKHNlY3Rpb25fdHlwZVsxXSkKLQkJICAgICAgewotCQkgICAgICBjYXNlIDB4RDA6CS8qIE5vcm1hbCBjb2RlIChDUCkgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfQ09ERTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDB4QzQ6CS8qIE5vcm1hbCBkYXRhIChDRCkgKi8KLQkJCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JCQlzZWN0aW9uLT5mbGFncyB8PSBTRUNfREFUQTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDB4RDI6CS8qIE5vcm1hbCByb20gZGF0YSAoQ1IpICovCi0JCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkJc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JPTSB8IFNFQ19EQVRBOwotCQkJYnJlYWs7Ci0JCSAgICAgIGRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBSZWFkIHNlY3Rpb24gbmFtZSwgdXNlIGl0IGlmIG5vbiBlbXB0eS4gKi8KLQkJbmFtZSA9IHJlYWRfaWQgKCZpZWVlLT5oKTsKLQkJaWYgKG5hbWVbMF0pCi0JCSAgc2VjdGlvbi0+bmFtZSA9IG5hbWU7Ci0KLQkJLyogU2tpcCB0aGVzZSBmaWVsZHMsIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQgKi8KLQkJewotCQkgIGJmZF92bWEgcGFyZW50LCBicm90aGVyLCBjb250ZXh0OwotCQkgIHBhcnNlX2ludCAoJihpZWVlLT5oKSwgJnBhcmVudCk7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmYnJvdGhlcik7Ci0JCSAgcGFyc2VfaW50ICgmKGllZWUtPmgpLCAmY29udGV4dCk7Ci0JCX0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtOgotCSAgICAgIHsKLQkJdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXg7Ci0JCWJmZF92bWEgdmFsdWU7Ci0JCWFzZWN0aW9uICpzZWN0aW9uOwotCQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQlzZWN0aW9uX2luZGV4ID0gbXVzdF9wYXJzZV9pbnQgKCZpZWVlLT5oKTsKLQkJc2VjdGlvbiA9IGdldF9zZWN0aW9uX2VudHJ5IChhYmZkLCBpZWVlLCBzZWN0aW9uX2luZGV4KTsKLQkJaWYgKHNlY3Rpb25faW5kZXggPiBpZWVlLT5zZWN0aW9uX2NvdW50KQotCQkgIHsKLQkJICAgIGllZWUtPnNlY3Rpb25fY291bnQgPSBzZWN0aW9uX2luZGV4OwotCQkgIH0KLQkJc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0KLQkJICBiZmRfbG9nMiAobXVzdF9wYXJzZV9pbnQgKCZpZWVlLT5oKSk7Ci0JCSh2b2lkKSBwYXJzZV9pbnQgKCYoaWVlZS0+aCksICZ2YWx1ZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGllZWVfZTJfZmlyc3RfYnl0ZV9lbnVtOgotCSAgICAgIHsKLQkJaWVlZV9yZWNvcmRfZW51bV90eXBlIHQgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAocmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpKTsKLQotCQlzd2l0Y2ggKHQpCi0JCSAgewotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX3NpemVfZW51bToKLQkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07Ci0JCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfcGh5c2ljYWxfcmVnaW9uX3NpemVfZW51bToKLQkJICAgIHNlY3Rpb24gPSBpZWVlLT5zZWN0aW9uX3RhYmxlW211c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKV07Ci0JCSAgICBzZWN0aW9uLT5fcmF3X3NpemUgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIGllZWVfcmVnaW9uX2Jhc2VfYWRkcmVzc19lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9tYXVfc2l6ZV9lbnVtOgotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBpZWVlX21fdmFsdWVfZW51bToKLQkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX2Jhc2VfYWRkcmVzc19lbnVtOgotCQkgICAgc2VjdGlvbiA9IGllZWUtPnNlY3Rpb25fdGFibGVbbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpXTsKLQkJICAgIHNlY3Rpb24tPnZtYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIHNlY3Rpb24tPmxtYSA9IHNlY3Rpb24tPnZtYTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgaWVlZV9zZWN0aW9uX29mZnNldF9lbnVtOgotCQkgICAgKHZvaWQpIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgICh2b2lkKSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogTWFrZSBhIHNlY3Rpb24gZm9yIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGlmIGFueS4gIFdlIGRvbid0IHRyeQotICAgdG8gaW50ZXJwcmV0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb247IHdlIGp1c3QgcG9pbnQgdGhlIHNlY3Rpb24KLSAgIGF0IHRoZSBhcmVhIGluIHRoZSBmaWxlIHNvIHRoYXQgcHJvZ3JhbSB3aGljaCB1bmRlcnN0YW5kIGNhbiBkaWcgaXQKLSAgIG91dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NsdXJwX2RlYnVnIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGllZWVfZGF0YV90eXBlICppZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRlYnVnIik7Ci0gIGlmIChzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHNlYy0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0gIHNlYy0+ZmlsZXBvcyA9IGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0OwotICBzZWMtPl9yYXdfc2l6ZSA9IGllZWUtPncuci5kYXRhX3BhcnQgLSBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgYXJjaGl2ZSBzdHVmZgotKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1pZWVlX2FyY2hpdmVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBjaGFyICpsaWJyYXJ5OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgY2hhciBidWZmZXJbNTEyXTsKLSAgZmlsZV9wdHIgYnVmZmVyX29mZnNldCA9IDA7Ci0gIGllZWVfYXJfZGF0YV90eXBlICpzYXZlID0gYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhOwotICBpZWVlX2FyX2RhdGFfdHlwZSAqaWVlZTsKLSAgdW5zaWduZWQgaW50IGFsY19lbHRzOwotICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqZWx0cyA9IE5VTEw7Ci0KLSAgYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhID0KLSAgICAoaWVlZV9hcl9kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGllZWVfYXJfZGF0YV90eXBlKSk7Ci0gIGlmICghYWJmZC0+dGRhdGEuaWVlZV9hcl9kYXRhKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBpZWVlID0gSUVFRV9BUl9EQVRBIChhYmZkKTsKLQotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCi0gIGllZWUtPmguZmlyc3RfYnl0ZSA9IGJ1ZmZlcjsKLSAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCi0gIGllZWUtPmguYWJmZCA9IGFiZmQ7Ci0KLSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgIT0gTW9kdWxlX0JlZ2lubmluZykKLSAgICB7Ci0gICAgICBhYmZkLT50ZGF0YS5pZWVlX2FyX2RhdGEgPSBzYXZlOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0gIGxpYnJhcnkgPSByZWFkX2lkICgmKGllZWUtPmgpKTsKLSAgaWYgKHN0cmNtcCAobGlicmFyeSwgIkxJQlJBUlkiKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpZWVlKTsKLSAgICAgIGFiZmQtPnRkYXRhLmllZWVfYXJfZGF0YSA9IHNhdmU7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIC8qIFRocm93IGF3YXkgdGhlIGZpbGVuYW1lICovCi0gIHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotCi0gIGllZWUtPmVsZW1lbnRfY291bnQgPSAwOwotICBpZWVlLT5lbGVtZW50X2luZGV4ID0gMDsKLQotICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIHRoZSBhZCBwYXJ0ICovCi0gIG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsJLyogQW5kIHRoZSB0d28gZHVtbXkgbnVtYmVycyAqLwotICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0KLSAgYWxjX2VsdHMgPSAxMDsKLSAgZWx0cyA9IChpZWVlX2FyX29ic3RhY2tfdHlwZSAqKSBiZmRfbWFsbG9jIChhbGNfZWx0cyAqIHNpemVvZiAqZWx0cyk7Ci0gIGlmIChlbHRzID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogUmVhZCB0aGUgaW5kZXggb2YgdGhlIEJCIHRhYmxlICovCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCByZWM7Ci0gICAgICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqdDsKLQotICAgICAgcmVjID0gcmVhZF8yYnl0ZXMgKCYoaWVlZS0+aCkpOwotICAgICAgaWYgKHJlYyAhPSAoaW50KSBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCWJyZWFrOwotCi0gICAgICBpZiAoaWVlZS0+ZWxlbWVudF9jb3VudCA+PSBhbGNfZWx0cykKLQl7Ci0JICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqbjsKLQotCSAgYWxjX2VsdHMgKj0gMjsKLQkgIG4gPSAoKGllZWVfYXJfb2JzdGFja190eXBlICopCi0JICAgICAgIGJmZF9yZWFsbG9jIChlbHRzLCBhbGNfZWx0cyAqIHNpemVvZiAqZWx0cykpOwotCSAgaWYgKG4gPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBlbHRzID0gbjsKLQl9Ci0KLSAgICAgIHQgPSAmZWx0c1tpZWVlLT5lbGVtZW50X2NvdW50XTsKLSAgICAgIGllZWUtPmVsZW1lbnRfY291bnQrKzsKLQotICAgICAgbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotICAgICAgdC0+ZmlsZV9vZmZzZXQgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0gICAgICB0LT5hYmZkID0gKGJmZCAqKSBOVUxMOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBkb24ndCBnbyBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCi0gICAgICBpZiAoKHNpemVfdCkgaWVlZV9wb3MgKGFiZmQpID4gc2l6ZW9mIChidWZmZXIpIC8gMikKLQl7Ci0JICAvKiBQYXN0IGhhbGYgd2F5LCByZXNlZWsgYW5kIHJlcHJpbWUgKi8KLQkgIGJ1ZmZlcl9vZmZzZXQgKz0gaWVlZV9wb3MgKGFiZmQpOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBidWZmZXJfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMKLQkgICAgIHRvIHJlYWQgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLQkgIGJmZF9yZWFkICgoUFRSKSBidWZmZXIsIDEsIHNpemVvZiAoYnVmZmVyKSwgYWJmZCk7Ci0JICBpZWVlLT5oLmZpcnN0X2J5dGUgPSBidWZmZXI7Ci0JICBpZWVlLT5oLmlucHV0X3AgPSBidWZmZXI7Ci0JfQotICAgIH0KLQotICBpZWVlLT5lbGVtZW50cyA9ICgoaWVlZV9hcl9vYnN0YWNrX3R5cGUgKikKLQkJICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAgICAgICBpZWVlLT5lbGVtZW50X2NvdW50ICogc2l6ZW9mICppZWVlLT5lbGVtZW50cykpOwotICBpZiAoaWVlZS0+ZWxlbWVudHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtY3B5IChpZWVlLT5lbGVtZW50cywgZWx0cywKLQkgIGllZWUtPmVsZW1lbnRfY291bnQgKiBzaXplb2YgKmllZWUtPmVsZW1lbnRzKTsKLSAgZnJlZSAoZWx0cyk7Ci0gIGVsdHMgPSBOVUxMOwotCi0gIC8qIE5vdyBzY2FuIHRoZSBhcmVhIGFnYWluLCBhbmQgcmVwbGFjZSBCQiBvZmZzZXRzIHdpdGggZmlsZSAqLwotICAvKiBvZmZzZXRzICovCi0KLSAgZm9yIChpID0gMjsgaSA8IGllZWUtPmVsZW1lbnRfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0bwotCSByZWFkIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gICAgICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotICAgICAgaWVlZS0+aC5maXJzdF9ieXRlID0gYnVmZmVyOwotICAgICAgaWVlZS0+aC5pbnB1dF9wID0gYnVmZmVyOwotCi0gICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIEY4ICovCi0gICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwkvKiBEcm9wIDE0ICovCi0gICAgICBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7CS8qIERyb3Agc2l6ZSBvZiBibG9jayAqLwotICAgICAgaWYgKG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKSAhPSAwKQotCXsKLQkgIC8qIFRoaXMgb2JqZWN0IGhhcyBiZWVuIGRlbGV0ZWQgKi8KLQkgIGllZWUtPmVsZW1lbnRzW2ldLmZpbGVfb2Zmc2V0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWVlZS0+ZWxlbWVudHNbaV0uZmlsZV9vZmZzZXQgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JfQotICAgIH0KLQotICAvKiAgYWJmZC0+aGFzX2FybWFwID0gOyovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChlbHRzICE9IE5VTEwpCi0gICAgZnJlZSAoZWx0cyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSAoaWVlZV9kYXRhX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChpZWVlX2RhdGFfdHlwZSkpOwotICByZXR1cm4gYWJmZC0+dGRhdGEuaWVlZV9kYXRhID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWllZWVfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqcHJvY2Vzc29yOwotICB1bnNpZ25lZCBpbnQgcGFydDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzMwMF07Ci0gIGllZWVfZGF0YV90eXBlICpzYXZlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBhYmZkLT50ZGF0YS5pZWVlX2RhdGEgPSAwOwotICBpZWVlX21rb2JqZWN0IChhYmZkKTsKLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZmFpbDsKLSAgLyogUmVhZCB0aGUgZmlyc3QgZmV3IGJ5dGVzIGluIHRvIHNlZSBpZiBpdCBtYWtlcyBzZW5zZSAqLwotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgYnVmZmVyLCAxLCBzaXplb2YgKGJ1ZmZlciksIGFiZmQpOwotCi0gIGllZWUtPmguaW5wdXRfcCA9IGJ1ZmZlcjsKLSAgaWYgKHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSkgIT0gTW9kdWxlX0JlZ2lubmluZykKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0KLSAgaWVlZS0+cmVhZF9zeW1ib2xzID0gZmFsc2U7Ci0gIGllZWUtPnJlYWRfZGF0YSA9IGZhbHNlOwotICBpZWVlLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgaWVlZS0+ZXh0ZXJuYWxfc3ltYm9sX21heF9pbmRleCA9IDA7Ci0gIGllZWUtPmV4dGVybmFsX3N5bWJvbF9taW5faW5kZXggPSBJRUVFX1BVQkxJQ19CQVNFOwotICBpZWVlLT5leHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4ID0gSUVFRV9SRUZFUkVOQ0VfQkFTRTsKLSAgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX21heF9pbmRleCA9IDA7Ci0gIGllZWUtPmguYWJmZCA9IGFiZmQ7Ci0gIGllZWUtPnNlY3Rpb25fdGFibGUgPSBOVUxMOwotICBpZWVlLT5zZWN0aW9uX3RhYmxlX3NpemUgPSAwOwotCi0gIHByb2Nlc3NvciA9IGllZWUtPm1iLnByb2Nlc3NvciA9IHJlYWRfaWQgKCYoaWVlZS0+aCkpOwotICBpZiAoc3RyY21wIChwcm9jZXNzb3IsICJMSUJSQVJZIikgPT0gMCkKLSAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0gIGllZWUtPm1iLm1vZHVsZV9uYW1lID0gcmVhZF9pZCAoJihpZWVlLT5oKSk7Ci0gIGlmIChhYmZkLT5maWxlbmFtZSA9PSAoQ09OU1QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFiZmQtPmZpbGVuYW1lID0gaWVlZS0+bWIubW9kdWxlX25hbWU7Ci0gICAgfQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4KLSAgICAgKi8KLSAgewotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaDsKLSAgICBjaGFyIGZhbWlseVsxMF07Ci0KLSAgICAvKiBJRUVFIGRvZXMgbm90IHNwZWNpZnkgdGhlIGZvcm1hdCBvZiB0aGUgcHJvY2Vzc29yIGlkZW50aWZpY2F0b24KLSAgICAgICBzdHJpbmcsIHNvIHRoZSBjb21waWxlciBpcyBmcmVlIHRvIHB1dCBpbiBpdCB3aGF0ZXZlciBpdCB3YW50cy4KLSAgICAgICBXZSB0cnkgaGVyZSB0byByZWNvZ25pemUgZGlmZmVyZW50IHByb2Nlc3NvcnMgYmVsb25naW5nIHRvIHRoZQotICAgICAgIG02OGsgZmFtaWx5LiAgQ29kZSBmb3Igb3RoZXIgcHJvY2Vzc29ycyBjYW4gYmUgYWRkZWQgaGVyZS4gICovCi0gICAgaWYgKChwcm9jZXNzb3JbMF0gPT0gJzYnKSAmJiAocHJvY2Vzc29yWzFdID09ICc4JykpCi0gICAgICB7Ci0JaWYgKHByb2Nlc3NvclsyXSA9PSAnMycpCSAgICAvKiA2ODN4eCBpbnRlZ3JhdGVkIHByb2Nlc3NvcnMgKi8KLQkgIHsKLQkgICAgc3dpdGNoIChwcm9jZXNzb3JbM10pCi0JICAgICAgewotCSAgICAgIGNhc2UgJzAnOgkJCSAgICAvKiA2ODMwMiwgNjgzMDYsIDY4MzA3ICovCi0JICAgICAgY2FzZSAnMic6CQkJICAgIC8qIDY4MzIyLCA2ODMyOCAqLwotCSAgICAgIGNhc2UgJzUnOgkJCSAgICAvKiA2ODM1NiAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MDAwIik7ICAgLyogTUM2ODAwMC1iYXNlZCBjb250cm9sbGVycyAqLwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgkJCSAgICAvKiA2ODMzMCwgNjgzMzEsIDY4MzMyLCA2ODMzMywKLQkJCQkJICAgICAgIDY4MzM0LCA2ODMzNSwgNjgzMzYsIDY4MzM4ICovCi0JICAgICAgY2FzZSAnNic6CQkJICAgIC8qIDY4MzYwICovCi0JICAgICAgY2FzZSAnNyc6CQkJICAgIC8qIDY4Mzc2ICovCi0JCXN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgICAvKiBDUFUzMiBhbmQgQ1BVMzIrICovCi0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNCc6Ci0JCWlmIChwcm9jZXNzb3JbNF0gPT0gJzknKSAgICAvKiA2ODM0OSAqLwotCQkgIHN0cmNweSAoZmFtaWx5LCAiNjgwMzAiKTsgLyogQ1BVMDMwICovCi0JCWVsc2UJCSAgICAgICAgICAgIC8qIDY4MzQwLCA2ODM0MSAqLwotCQkgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsgLyogQ1BVMzIgYW5kIENQVTMyKyAqLwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6CQkJICAgIC8qIERvZXMgbm90IGV4aXN0IHlldCAqLwotCQlzdHJjcHkgKGZhbWlseSwgIjY4MzMyIik7ICAgLyogR3Vlc3MgaXQgd2lsbCBiZSBDUFUzMiAqLwotCSAgICAgIH0KLQkgIH0KLQllbHNlIGlmICh0b3VwcGVyIChwcm9jZXNzb3JbM10pID09ICdGJykgICAvKiA2OEYzMzMgKi8KLQkgIHN0cmNweSAoZmFtaWx5LCAiNjgzMzIiKTsJICAgICAgICAgIC8qIENQVTMyICovCi0JZWxzZSBpZiAoKHRvdXBwZXIgKHByb2Nlc3NvclszXSkgPT0gJ0MnKSAgLyogRW1iZWRkZWQgY29udHJvbGxlcnMgKi8KLQkJICYmICgodG91cHBlciAocHJvY2Vzc29yWzJdKSA9PSAnRScpCi0JCSAgICAgfHwgKHRvdXBwZXIgKHByb2Nlc3NvclsyXSkgPT0gJ0gnKQotCQkgICAgIHx8ICh0b3VwcGVyIChwcm9jZXNzb3JbMl0pID09ICdMJykpKQotCSAgewotCSAgICBzdHJjcHkgKGZhbWlseSwgIjY4Iik7Ci0JICAgIHN0cm5jYXQgKGZhbWlseSwgcHJvY2Vzc29yICsgNCwgNyk7Ci0JICAgIGZhbWlseVs5XSA9ICdcMCc7Ci0JICB9Ci0JZWxzZQkJCQkgLyogIlJlZ3VsYXIiIHByb2Nlc3NvcnMgKi8KLQkgIHsKLQkgICAgc3RybmNweSAoZmFtaWx5LCBwcm9jZXNzb3IsIDkpOwotCSAgICBmYW1pbHlbOV0gPSAnXDAnOwotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKChzdHJuY21wIChwcm9jZXNzb3IsICJjcHUzMiIsIDUpID09IDApIC8qIENQVTMyIGFuZCBDUFUzMisgKi8KLQkgICAgIHx8IChzdHJuY21wIChwcm9jZXNzb3IsICJDUFUzMiIsIDUpID09IDApKQotICAgICAgc3RyY3B5IChmYW1pbHksICI2ODMzMiIpOwotICAgIGVsc2UKLSAgICAgIHsKLQlzdHJuY3B5IChmYW1pbHksIHByb2Nlc3NvciwgOSk7Ci0JZmFtaWx5WzldID0gJ1wwJzsKLSAgICAgIH0KLQotICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoIChmYW1pbHkpOwotICAgIGlmIChhcmNoID09IDApCi0gICAgICBnb3RvIGdvdF93cm9uZ19mb3JtYXQ7Ci0gICAgYWJmZC0+YXJjaF9pbmZvID0gYXJjaDsKLSAgfQotCi0gIGlmICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpICE9IChpbnQpIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX2VudW0pCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQotICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmaWVlZS0+YWQubnVtYmVyX29mX2JpdHNfbWF1KSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmaWVlZS0+YWQubnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcykgPT0gZmFsc2UpCi0gICAgewotICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIGJ5dGUgb3JkZXIgaW5mbywgdGFrZSBpdCAqLwotICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX3ZhcmlhYmxlX0xfZW51bSB8fAotICAgICAgdGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSAoaW50KSBpZWVlX3ZhcmlhYmxlX01fZW51bSkKLSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCi0gIGZvciAocGFydCA9IDA7IHBhcnQgPCBOX1dfVkFSSUFCTEVTOyBwYXJ0KyspCi0gICAgewotICAgICAgYm9vbGVhbiBvazsKLSAgICAgIGlmIChyZWFkXzJieXRlcyAoJihpZWVlLT5oKSkgIT0gKGludCkgaWVlZV9hc3NpZ25fdmFsdWVfdG9fdmFyaWFibGVfZW51bSkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotICAgICAgaWYgKHRoaXNfYnl0ZV9hbmRfbmV4dCAoJihpZWVlLT5oKSkgIT0gcGFydCkKLQl7Ci0JICBnb3RvIGZhaWw7Ci0JfQotCi0gICAgICBpZWVlLT53Lm9mZnNldFtwYXJ0XSA9IHBhcnNlX2kgKCYoaWVlZS0+aCksICZvayk7Ci0gICAgICBpZiAob2sgPT0gZmFsc2UpCi0JewotCSAgZ290byBmYWlsOwotCX0KLQotICAgIH0KLQotICBpZiAoaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQgIT0gMCkKLSAgICBhYmZkLT5mbGFncyA9IEhBU19TWU1TOwotCi0gIC8qIEJ5IG5vdyB3ZSBrbm93IHRoYXQgdGhpcyBpcyBhIHJlYWwgSUVFRSBmaWxlLCB3ZSdyZSBnb2luZyB0byByZWFkCi0gICAgIHRoZSB3aG9sZSB0aGluZyBpbnRvIG1lbW9yeSBzbyB0aGF0IHdlIGNhbiBydW4gdXAgYW5kIGRvd24gaXQKLSAgICAgcXVpY2tseS4gIFdlIGNhbiB3b3JrIG91dCBob3cgYmlnIHRoZSBmaWxlIGlzIGZyb20gdGhlIHRyYWlsZXIKLSAgICAgcmVjb3JkICovCi0KLSAgSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlID0KLSAgICAodW5zaWduZWQgY2hhciAqKSBiZmRfYWxsb2MgKGllZWUtPmguYWJmZCwgaWVlZS0+dy5yLm1lX3JlY29yZCArIDEpOwotICBpZiAoIUlFRUVfREFUQSAoYWJmZCktPmguZmlyc3RfYnl0ZSkKLSAgICBnb3RvIGZhaWw7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGZhaWw7Ci0gIC8qIEZJWE1FOiBDaGVjayByZXR1cm4gdmFsdWUuICBJJ20gbm90IHN1cmUgd2hldGhlciBpdCBuZWVkcyB0byByZWFkCi0gICAgIHRoZSBlbnRpcmUgYnVmZmVyIG9yIG5vdC4gICovCi0gIGJmZF9yZWFkICgoUFRSKSAoSUVFRV9EQVRBIChhYmZkKS0+aC5maXJzdF9ieXRlKSwgMSwKLQkgICAgaWVlZS0+dy5yLm1lX3JlY29yZCArIDEsIGFiZmQpOwotCi0gIGllZWVfc2x1cnBfc2VjdGlvbnMgKGFiZmQpOwotCi0gIGlmICghIGllZWVfc2x1cnBfZGVidWcgKGFiZmQpKQotICAgIGdvdG8gZmFpbDsKLQotICAvKiBQYXJzZSBzZWN0aW9uIGRhdGEgdG8gYWN0aXZhdGUgZmlsZSBhbmQgc2VjdGlvbiBmbGFncyBpbXBsaWVkIGJ5Ci0gICAgIHNlY3Rpb24gY29udGVudHMuICovCi0KLSAgaWYgKCEgaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpKQotICAgIGdvdG8gZmFpbDsKLSAgICAKLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci1nb3Rfd3JvbmdfZm9ybWF0OgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLWZhaWw6Ci0gICh2b2lkKSBiZmRfcmVsZWFzZSAoYWJmZCwgaWVlZSk7Ci0gIGFiZmQtPnRkYXRhLmllZWVfZGF0YSA9IHNhdmU7Ci0gIHJldHVybiAoY29uc3QgYmZkX3RhcmdldCAqKSBOVUxMOwotfQotCi12b2lkCi1pZWVlX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoc3ltYm9sLT5uYW1lWzBdID09ICcgJykKLSAgICByZXQtPm5hbWUgPSAiKiBlbXB0eSB0YWJsZSBlbnRyeSAiOwotICBpZiAoIXN5bWJvbC0+c2VjdGlvbikKLSAgICByZXQtPnR5cGUgPSAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkgPyAnYScgOiAnQSc7Ci19Ci0KLXZvaWQKLWllZWVfcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSNpZiAwCi0gICAgICBmcHJpbnRmIChmaWxlLCAiJTR4ICUyeCIsIGFvdXRfc3ltYm9sIChzeW1ib2wpLT5kZXNjICYgMHhmZmZmLAotCSAgICAgICBhb3V0X3N5bWJvbCAoc3ltYm9sKS0+b3RoZXIgJiAweGZmKTsKLSNlbmRpZgotICAgICAgQkZEX0ZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSA9Ci0JICAoc3ltYm9sLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMCi0JICAgPyAiKmFicyIKLQkgICA6IHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0JaWYgKHN5bWJvbC0+bmFtZVswXSA9PSAnICcpCi0JICB7Ci0JICAgIGZwcmludGYgKGZpbGUsICIqIGVtcHR5IHRhYmxlIGVudHJ5ICIpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCSAgICBmcHJpbnRmIChmaWxlLCAiICUtNXMgJTA0eCAlMDJ4ICVzIiwKLQkJICAgICBzZWN0aW9uX25hbWUsCi0JCSAgICAgKHVuc2lnbmVkKSBpZWVlX3N5bWJvbCAoc3ltYm9sKS0+aW5kZXgsCi0JCSAgICAgKHVuc2lnbmVkKSAwLAotCQkgICAgIHN5bWJvbC0+bmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1kb19vbmUgKGllZWUsIGN1cnJlbnRfbWFwLCBsb2NhdGlvbl9wdHIsIHMsIGl0ZXJhdGlvbnMpCi0gICAgIGllZWVfZGF0YV90eXBlICppZWVlOwotICAgICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKmN1cnJlbnRfbWFwOwotICAgICB1bnNpZ25lZCBjaGFyICpsb2NhdGlvbl9wdHI7Ci0gICAgIGFzZWN0aW9uICpzOwotICAgICBpbnQgaXRlcmF0aW9uczsKLXsKLSAgc3dpdGNoICh0aGlzX2J5dGUgKCYoaWVlZS0+aCkpKQotICAgIHsKLSAgICBjYXNlIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtOgotICAgICAgewotCXVuc2lnbmVkIGludCBudW1iZXJfb2ZfbWF1czsKLQl1bnNpZ25lZCBpbnQgaTsKLQluZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCW51bWJlcl9vZl9tYXVzID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bWJlcl9vZl9tYXVzOyBpKyspCi0JICB7Ci0JICAgIGxvY2F0aW9uX3B0cltjdXJyZW50X21hcC0+cGMrK10gPSB0aGlzX2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bToKLSAgICAgIHsKLQlib29sZWFuIGxvb3AgPSB0cnVlOwotCW5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0Jd2hpbGUgKGxvb3ApCi0JICB7Ci0JICAgIHN3aXRjaCAodGhpc19ieXRlICgmKGllZWUtPmgpKSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQotCSAgICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9zaWduZWRfb3Blbl9iX2VudW06Ci0JICAgICAgY2FzZSBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX29wZW5fYl9lbnVtOgotCSAgICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW06Ci0JCXsKLQkJICB1bnNpZ25lZCBpbnQgZXh0cmEgPSA0OwotCQkgIGJvb2xlYW4gcGNyZWwgPSBmYWxzZTsKLQkJICBhc2VjdGlvbiAqc2VjdGlvbjsKLQkJICBpZWVlX3JlbG9jX3R5cGUgKnIgPQotCQkgIChpZWVlX3JlbG9jX3R5cGUgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsCi0JCQkJCQkgc2l6ZW9mIChpZWVlX3JlbG9jX3R5cGUpKTsKLQkJICBpZiAoIXIpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICAqKGN1cnJlbnRfbWFwLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkgIGN1cnJlbnRfbWFwLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkgIHItPm5leHQgPSAoaWVlZV9yZWxvY190eXBlICopIE5VTEw7Ci0JCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLS8qCQkJICAgIGFib3J0KCk7Ki8KLQkJICByLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSAwOwotCQkgIHBhcnNlX2V4cHJlc3Npb24gKGllZWUsCi0JCQkJICAgICZyLT5yZWxlbnQuYWRkZW5kLAotCQkJCSAgICAmci0+c3ltYm9sLAotCQkJCSAgICAmcGNyZWwsICZleHRyYSwgJnNlY3Rpb24pOwotCQkgIHItPnJlbGVudC5hZGRyZXNzID0gY3VycmVudF9tYXAtPnBjOwotCQkgIHMtPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkJICBzLT5vd25lci0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotCQkgIHMtPnJlbG9jX2NvdW50Kys7Ci0JCSAgaWYgKHItPnJlbGVudC5zeW1fcHRyX3B0ciA9PSBOVUxMICYmIHNlY3Rpb24gIT0gTlVMTCkKLQkJICAgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IHNlY3Rpb24tPnN5bWJvbF9wdHJfcHRyOwotCi0JCSAgaWYgKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkgPT0gKGludCkgaWVlZV9jb21tYSkKLQkJICAgIHsKLQkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgICAgLyogRmV0Y2ggbnVtYmVyIG9mIGJ5dGVzIHRvIHBhZCAqLwotCQkgICAgICBleHRyYSA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkJICAgIH07Ci0KLQkJICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JCSAgICB7Ci0JCSAgICBjYXNlIGllZWVfZnVuY3Rpb25fc2lnbmVkX2Nsb3NlX2JfZW51bToKLQkJICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGllZWVfZnVuY3Rpb25fdW5zaWduZWRfY2xvc2VfYl9lbnVtOgotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtOgotCQkgICAgICBuZXh0X2J5dGUgKCYoaWVlZS0+aCkpOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qIEJ1aWxkIGEgcmVsb2NhdGlvbiBlbnRyeSBmb3IgdGhpcyB0eXBlICovCi0JCSAgLyogSWYgcGMgcmVsIHRoZW4gc3RpY2sgLXZlIHBjIGludG8gaW5zdHJ1Y3Rpb24KLQkJICAgICBhbmQgdGFrZSBvdXQgb2YgcmVsb2MgLi4KLQotCQkgICAgIEkndmUgY2hhbmdlZCB0aGlzLiBJdCdzIGFsbCB0b28gY29tcGxpY2F0ZWQuIEkKLQkJICAgICBrZWVwIDAgaW4gdGhlIGluc3RydWN0aW9uIG5vdy4gICovCi0KLQkJICBzd2l0Y2ggKGV4dHJhKQotCQkgICAgewotCQkgICAgY2FzZSAwOgotCQkgICAgY2FzZSA0OgotCi0JCSAgICAgIGlmIChwY3JlbCA9PSB0cnVlKQotCQkJewotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0JCQkgIGJmZF9wdXRfMzIgKGllZWUtPmguYWJmZCwgLWN1cnJlbnRfbWFwLT5wYywgbG9jYXRpb25fcHRyICsKLQkJCQkgICAgICBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMzJfaG93dG87Ci0JCQkgIHItPnJlbGVudC5hZGRlbmQgLT0KLQkJCSAgICBjdXJyZW50X21hcC0+cGM7Ci0jZWxzZQotCQkJICBiZmRfcHV0XzMyIChpZWVlLT5oLmFiZmQsIDAsIGxvY2F0aW9uX3B0ciArCi0JCQkJICAgICAgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJnJlbDMyX2hvd3RvOwotI2VuZGlmCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYmZkX3B1dF8zMiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKwotCQkJCSAgICAgIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZhYnMzMl9ob3d0bzsKLQkJCX0KLQkJICAgICAgY3VycmVudF9tYXAtPnBjICs9IDQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAyOgotCQkgICAgICBpZiAocGNyZWwgPT0gdHJ1ZSkKLQkJCXsKLSNpZiBLRUVQTUlOVVNQQ0lOSU5TVAotCQkJICBiZmRfcHV0XzE2IChpZWVlLT5oLmFiZmQsIChpbnQpICgtY3VycmVudF9tYXAtPnBjKSwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50LmFkZGVuZCAtPSBjdXJyZW50X21hcC0+cGM7Ci0JCQkgIHItPnJlbGVudC5ob3d0byA9ICZyZWwxNl9ob3d0bzsKLSNlbHNlCi0KLQkJCSAgYmZkX3B1dF8xNiAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsMTZfaG93dG87Ci0jZW5kaWYKLQkJCX0KLQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9wdXRfMTYgKGllZWUtPmguYWJmZCwgMCwgbG9jYXRpb25fcHRyICsgY3VycmVudF9tYXAtPnBjKTsKLQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmFiczE2X2hvd3RvOwotCQkJfQotCQkgICAgICBjdXJyZW50X21hcC0+cGMgKz0gMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIGlmIChwY3JlbCA9PSB0cnVlKQotCQkJewotI2lmIEtFRVBNSU5VU1BDSU5JTlNUCi0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAoaW50KSAoLWN1cnJlbnRfbWFwLT5wYyksIGxvY2F0aW9uX3B0ciArIGN1cnJlbnRfbWFwLT5wYyk7Ci0JCQkgIHItPnJlbGVudC5hZGRlbmQgLT0gY3VycmVudF9tYXAtPnBjOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsOF9ob3d0bzsKLSNlbHNlCi0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmcmVsOF9ob3d0bzsKLSNlbmRpZgotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9wdXRfOCAoaWVlZS0+aC5hYmZkLCAwLCBsb2NhdGlvbl9wdHIgKyBjdXJyZW50X21hcC0+cGMpOwotCQkJICByLT5yZWxlbnQuaG93dG8gPSAmYWJzOF9ob3d0bzsKLQkJCX0KLQkJICAgICAgY3VycmVudF9tYXAtPnBjICs9IDE7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JCWJyZWFrOwotCSAgICAgIGRlZmF1bHQ6Ci0JCXsKLQkJICBiZmRfdm1hIHRoaXNfc2l6ZTsKLQkJICBpZiAocGFyc2VfaW50ICgmKGllZWUtPmgpLCAmdGhpc19zaXplKSA9PSB0cnVlKQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkJICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXNfc2l6ZTsgaSsrKQotCQkJewotCQkJICBsb2NhdGlvbl9wdHJbY3VycmVudF9tYXAtPnBjKytdID0gdGhpc19ieXRlICgmKGllZWUtPmgpKTsKLQkJCSAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvb3AgPSBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIH0KLQotCSAgICAvKiBQcmV2ZW50IG1vcmUgdGhhbiB0aGUgZmlyc3QgbG9hZC1pdGVtIG9mIGFuIExSIHJlY29yZAotCSAgICAgICBmcm9tIGJlaW5nIHJlcGVhdGVkIChNUkkgY29udmVudGlvbikuICovCi0JICAgIGlmIChpdGVyYXRpb25zICE9IDEpCi0JICAgICAgbG9vcCA9IGZhbHNlOwotCSAgfQotICAgICAgfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgaW4gYWxsIHRoZSBzZWN0aW9uIGRhdGEgYW5kIHJlbG9jYXRpb24gc3R1ZmYgdG9vICovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uX3B0ciA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBzZWN0aW9uX251bWJlcjsKLQotICBpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKmN1cnJlbnRfbWFwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBOVUxMOwotICBhc2VjdGlvbiAqczsKLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgYXJlYSAqLwotICBpZiAoaWVlZS0+cmVhZF9kYXRhID09IHRydWUpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGllZWUtPnJlYWRfZGF0YSA9IHRydWU7Ci0gIGllZWVfc2VlayAoYWJmZCwgaWVlZS0+dy5yLmRhdGFfcGFydCk7Ci0KLSAgLyogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhbGwgdGhlIHNlY3Rpb24gY29udGVudHMgKi8KLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpwZXIgPSAoaWVlZV9wZXJfc2VjdGlvbl90eXBlICopIHMtPnVzZWRfYnlfYmZkOwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0JY29udGludWU7Ci0gICAgICBwZXItPmRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChpZWVlLT5oLmFiZmQsIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoIXBlci0+ZGF0YSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKlNVUFBSRVNTIDY4Ki8KLSAgICAgIHBlci0+cmVsb2NfdGFpbF9wdHIgPQotCShpZWVlX3JlbG9jX3R5cGUgKiopICYgKHMtPnJlbG9jYXRpb24pOwotICAgIH0KLQotICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JewotCSAgLyogSUYgd2Ugc2VlIGFueXRoaW5nIHN0cmFuZ2UgdGhlbiBxdWl0ICovCi0JZGVmYXVsdDoKLQkgIHJldHVybiB0cnVlOwotCi0JY2FzZSBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bToKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBzZWN0aW9uX251bWJlciA9IG11c3RfcGFyc2VfaW50ICgmKGllZWUtPmgpKTsKLQkgIHMgPSBpZWVlLT5zZWN0aW9uX3RhYmxlW3NlY3Rpb25fbnVtYmVyXTsKLQkgIHMtPmZsYWdzIHw9IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLQkgIGN1cnJlbnRfbWFwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzLT51c2VkX2J5X2JmZDsKLQkgIGxvY2F0aW9uX3B0ciA9IGN1cnJlbnRfbWFwLT5kYXRhIC0gcy0+dm1hOwotCSAgLyogVGhlIGRvY3VtZW50IEkgaGF2ZSBzYXlzIHRoYXQgTWljcm90ZWMncyBjb21waWxlcnMgcmVzZXQgKi8KLQkgIC8qIHRoaXMgYWZ0ZXIgYSBzZWMgc2VjdGlvbiwgZXZlbiB0aG91Z2ggdGhlIHN0YW5kYXJkIHNheXMgbm90ICovCi0JICAvKiB0by4gU08gLi4gKi8KLQkgIGN1cnJlbnRfbWFwLT5wYyA9IHMtPnZtYTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bToKLQkgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICBzd2l0Y2ggKHRoaXNfYnl0ZSAoJihpZWVlLT5oKSkpCi0JICAgIHsKLQkgICAgY2FzZSBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gJiAweGZmOgotCSAgICAgIHsKLQkJYmZkX3ZtYSB2YWx1ZTsKLQkJaWVlZV9zeW1ib2xfaW5kZXhfdHlwZSBzeW1ib2w7Ci0JCXVuc2lnbmVkIGludCBleHRyYTsKLQkJYm9vbGVhbiBwY3JlbDsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwkvKiBUaG93IGF3YXkgc2VjdGlvbiAjKi8KLQkJcGFyc2VfZXhwcmVzc2lvbiAoaWVlZSwgJnZhbHVlLAotCQkJCSAgJnN5bWJvbCwKLQkJCQkgICZwY3JlbCwgJmV4dHJhLAotCQkJCSAgMCk7Ci0JCWN1cnJlbnRfbWFwLT5wYyA9IHZhbHVlOwotCQlCRkRfQVNTRVJUICgodW5zaWduZWQpICh2YWx1ZSAtIHMtPnZtYSkgPD0gcy0+X3Jhd19zaXplKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSAmIDB4ZmY6Ci0JICAgICAgbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICBpZiAodGhpc19ieXRlICgmKGllZWUtPmgpKSA9PSBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gbXVzdF9wYXJzZV9pbnQgKCYoaWVlZS0+aCkpOwotCSAgICAgIC8qIFdlJ3ZlIGdvdCB0byB0aGUgZW5kIG9mIHRoZSBkYXRhIG5vdyAtICovCi0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgQkZEX0ZBSUwgKCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIGllZWVfcmVwZWF0X2RhdGFfZW51bToKLQkgIHsKLQkgICAgLyogUmVwZWF0IHRoZSBmb2xsb3dpbmcgTEQgb3IgTFIgbiB0aW1lcyAtIHdlIGRvIHRoaXMgYnkKLQkJIHJlbWVtYmVyaW5nIHRoZSBzdHJlYW0gcG9pbnRlciBiZWZvcmUgcnVubmluZyBpdCBhbmQKLQkJIHJlc2V0dGluZyBpdCBhbmQgcnVubmluZyBpdCBuIHRpbWVzLiBXZSBzcGVjaWFsIGNhc2UKLQkJIHRoZSByZXBldGl0aW9uIG9mIGEgcmVwZWF0X2RhdGEvbG9hZF9jb25zdGFudAotCQkgKi8KLQotCSAgICB1bnNpZ25lZCBpbnQgaXRlcmF0aW9uczsKLQkgICAgdW5zaWduZWQgY2hhciAqc3RhcnQ7Ci0JICAgIG5leHRfYnl0ZSAoJihpZWVlLT5oKSk7Ci0JICAgIGl0ZXJhdGlvbnMgPSBtdXN0X3BhcnNlX2ludCAoJihpZWVlLT5oKSk7Ci0JICAgIHN0YXJ0ID0gaWVlZS0+aC5pbnB1dF9wOwotCSAgICBpZiAoc3RhcnRbMF0gPT0gKGludCkgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0gJiYKLQkJc3RhcnRbMV0gPT0gMSkKLQkgICAgICB7Ci0JCXdoaWxlIChpdGVyYXRpb25zICE9IDApCi0JCSAgewotCQkgICAgbG9jYXRpb25fcHRyW2N1cnJlbnRfbWFwLT5wYysrXSA9IHN0YXJ0WzJdOwotCQkgICAgaXRlcmF0aW9ucy0tOwotCQkgIH0KLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkJbmV4dF9ieXRlICgmKGllZWUtPmgpKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXdoaWxlIChpdGVyYXRpb25zICE9IDApCi0JCSAgewotCQkgICAgaWVlZS0+aC5pbnB1dF9wID0gc3RhcnQ7Ci0JCSAgICBpZiAoIWRvX29uZSAoaWVlZSwgY3VycmVudF9tYXAsIGxvY2F0aW9uX3B0ciwgcywKLQkJCQkgaXRlcmF0aW9ucykpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGl0ZXJhdGlvbnMtLTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bToKLQljYXNlIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bToKLQkgIHsKLQkgICAgaWYgKCFkb19vbmUgKGllZWUsIGN1cnJlbnRfbWFwLCBsb2NhdGlvbl9wdHIsIHMsIDEpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl9Ci0gICAgfQotfQotCi1ib29sZWFuCi1pZWVlX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIG5ld3NlY3QtPnVzZWRfYnlfYmZkID0gKFBUUikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaWVlZV9wZXJfc2VjdGlvbl90eXBlKSk7Ci0gIGlmICghbmV3c2VjdC0+dXNlZF9ieV9iZmQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZWVlX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBpZWVlX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+c2VjdGlvbiA9IG5ld3NlY3Q7Ci0gIHJldHVybiB0cnVlOwotfQotCi1sb25nCi1pZWVlX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKChhc2VjdC0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHJldHVybiAwOwotICBpZiAoISBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCkpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWVlZV9wZXJfc2VjdGlvbl90eXBlICpwID0gKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZDsKLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpICE9IDApCi0gICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sCi0JCQkJCSAgICAgIG9mZnNldCwgY291bnQpOwotICBpZWVlX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCk7Ci0gICh2b2lkKSBtZW1jcHkgKChQVFIpIGxvY2F0aW9uLCAoUFRSKSAocC0+ZGF0YSArIG9mZnNldCksICh1bnNpZ25lZCkgY291bnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotbG9uZwotaWVlZV9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlY3Rpb24sIHJlbHB0ciwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotLyogIGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChpZWVlX3Blcl9zZWN0aW9uX3R5cGUgKikgc2VjdGlvbi0+dXNlZF9ieV9iZmQ7Ki8KLSAgaWVlZV9yZWxvY190eXBlICpzcmMgPSAoaWVlZV9yZWxvY190eXBlICopIChzZWN0aW9uLT5yZWxvY2F0aW9uKTsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChzcmMgIT0gKGllZWVfcmVsb2NfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdvcmsgb3V0IHdoaWNoIHN5bWJvbCB0byBhdHRhY2ggaXQgdGhpcyByZWxvYyB0byAqLwotICAgICAgc3dpdGNoIChzcmMtPnN5bWJvbC5sZXR0ZXIpCi0JewotCWNhc2UgJ0knOgotCSAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPQotCSAgICBzeW1ib2xzICsgc3JjLT5zeW1ib2wuaW5kZXggKyBpZWVlLT5leHRlcm5hbF9zeW1ib2xfYmFzZV9vZmZzZXQ7Ci0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgc3ltYm9scyArIHNyYy0+c3ltYm9sLmluZGV4ICsgaWVlZS0+ZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0OwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgaWYgKHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyICE9IE5VTEwpCi0JICAgIHNyYy0+cmVsZW50LnN5bV9wdHJfcHRyID0KLQkgICAgICBzcmMtPnJlbGVudC5zeW1fcHRyX3B0clswXS0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCi0JICBCRkRfRkFJTCAoKTsKLQl9Ci0gICAgICAqcmVscHRyKysgPSAmc3JjLT5yZWxlbnQ7Ci0gICAgICBzcmMgPSBzcmMtPm5leHQ7Ci0gICAgfQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi1zdGF0aWMgaW50Ci1jb21wIChhcCwgYnApCi0gICAgIENPTlNUIFBUUiBhcDsKLSAgICAgQ09OU1QgUFRSIGJwOwotewotICBhcmVsZW50ICphID0gKigoYXJlbGVudCAqKikgYXApOwotICBhcmVsZW50ICpiID0gKigoYXJlbGVudCAqKikgYnApOwotICByZXR1cm4gYS0+YWRkcmVzcyAtIGItPmFkZHJlc3M7Ci19Ci0KLS8qIFdyaXRlIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9zZWN0aW9uX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBhc2VjdGlvbiAqczsKLSAgaWVlZS0+dy5yLnNlY3Rpb25fcGFydCA9IGJmZF90ZWxsIChhYmZkKTsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAocykKLQkgICYmIChzLT5mbGFncyAmIFNFQ19ERUJVR0dJTkcpID09IDApCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NlY3Rpb25fdHlwZV9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGltYWdlIGlzIGV4ZWN1dGFibGUsIHNvIG91dHB1dCBhYnNvbHV0ZSBzZWN0aW9ucyAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9BX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfU19lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfQ19lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAocy0+ZmxhZ3MgJiAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00pKQotCSAgICB7Ci0JICAgIGNhc2UgU0VDX0NPREUgfCBTRUNfTE9BRDoKLQkgICAgY2FzZSBTRUNfQ09ERToKLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfdmFyaWFibGVfUF9lbnVtKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNFQ19EQVRBOgotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9EX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0VDX1JPTToKLQkgICAgY2FzZSBTRUNfUk9NIHwgU0VDX0RBVEE6Ci0JICAgIGNhc2UgU0VDX1JPTSB8IFNFQ19MT0FEOgotCSAgICBjYXNlIFNFQ19ST00gfCBTRUNfREFUQSB8IFNFQ19MT0FEOgotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV92YXJpYWJsZV9SX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCi0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCBzLT5uYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotI2lmIDAKLQkgIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKTsJLyogUGFyZW50ICovCi0JICBpZWVlX3dyaXRlX2ludCAoYWJmZCwgMCk7CS8qIEJyb3RoZXIgKi8KLQkgIGllZWVfd3JpdGVfaW50IChhYmZkLCAwKTsJLyogQ29udGV4dCAqLwotI2VuZGlmCi0JICAvKiBBbGlnbm1lbnQgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZWN0aW9uX2FsaWdubWVudF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCSAgICAoYmZkX2J5dGUpIChzLT5pbmRleAotCQkJCQkJKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIDEgPDwgcy0+YWxpZ25tZW50X3Bvd2VyKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTaXplICovCi0JICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9zZWN0aW9uX3NpemVfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXgKLQkJCQkJCSsgSUVFRV9TRUNUSU9OX05VTUJFUl9CQVNFKSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0JICAgIHsKLQkgICAgICAvKiBSZWxvY2F0ZWFibGUgc2VjdGlvbnMgZG9uJ3QgaGF2ZSBhc2wgcmVjb3JkcyAqLwotCSAgICAgIC8qIFZtYSAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3NlY3Rpb25fYmFzZV9hZGRyZXNzX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkJCSgoYmZkX2J5dGUpCi0JCQkJCSAocy0+aW5kZXgKLQkJCQkJICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPmxtYSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWRvX3dpdGhfcmVsb2NzIChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX21hdXNfaW5fYWRkcmVzcyA9Ci0gICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCkgLyBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IHJlbG9jc190b19nbyA9IHMtPnJlbG9jX2NvdW50OwotICBiZmRfYnl0ZSAqc3RyZWFtID0gaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGE7Ci0gIGFyZWxlbnQgKipwID0gcy0+b3JlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgY3VycmVudF9ieXRlX2luZGV4ID0gMDsKLQotICBxc29ydCAocy0+b3JlbG9jYXRpb24sCi0JIHJlbG9jc190b19nbywKLQkgc2l6ZW9mIChhcmVsZW50ICoqKSwKLQkgY29tcCk7Ci0KLSAgLyogT3V0cHV0IHRoZSBzZWN0aW9uIHByZWhlYWRlciAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfc2V0X2N1cnJlbnRfc2VjdGlvbl9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKQotICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsCi0JCQkgICAgKGJmZF9ieXRlKSAocy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApICE9IDAgJiYgcmVsb2NzX3RvX2dvID09IDApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHMtPmxtYSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgMCwgcy0+c3ltYm9sLCAwLCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChyZWxvY3NfdG9fZ28gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jYXRpb25zIHRoZW4gb3V0cHV0IHRoZSBsb2FkIGNvbnN0YW50Ci0JIGJ5dGUgb3Bjb2RlIHJhdGhlciB0aGFuIHRoZSBsb2FkIHdpdGggcmVsb2NhdGlvbiBvcGNvZGUgKi8KLQotICAgICAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9yYXdfc2l6ZSkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHJ1bjsKLQkgIHVuc2lnbmVkIGludCBNQVhSVU4gPSAxMjc7Ci0JICBydW4gPSBNQVhSVU47Ci0JICBpZiAocnVuID4gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4KQotCSAgICB7Ci0JICAgICAgcnVuID0gcy0+X3Jhd19zaXplIC0gY3VycmVudF9ieXRlX2luZGV4OwotCSAgICB9Ci0KLQkgIGlmIChydW4gIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9sb2FkX2NvbnN0YW50X2J5dGVzX2VudW0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogT3V0cHV0IGEgc3RyZWFtIG9mIGJ5dGVzICovCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJ1bikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAoc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KSwKLQkJCSAgICAgMSwKLQkJCSAgICAgcnVuLAotCQkJICAgICBhYmZkKQotCQkgICE9IHJ1bikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSBydW47Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2xvYWRfd2l0aF9yZWxvY2F0aW9uX2VudW0pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogT3V0cHV0IHRoZSBkYXRhIHN0cmVhbSBhcyB0aGUgbG9uZ2VzdCBzZXF1ZW5jZSBvZiBieXRlcwotCSBwb3NzaWJsZSwgYWxsb3dpbmcgZm9yIHRoZSBhIHJlYXNvbmFibGUgcGFja2V0IHNpemUgYW5kCi0JIHJlbG9jYXRpb24gc3R1ZmZzLiAgKi8KLQotICAgICAgaWYgKChQVFIpIHN0cmVhbSA9PSAoUFRSKSBOVUxMKQotCXsKLQkgIC8qIE91dHB1dHRpbmcgYSBzZWN0aW9uIHdpdGhvdXQgZGF0YSwgZmlsbCBpdCB1cCAqLwotCSAgc3RyZWFtID0gKHVuc2lnbmVkIGNoYXIgKikgKGJmZF9hbGxvYyAoYWJmZCwgcy0+X3Jhd19zaXplKSk7Ci0JICBpZiAoIXN0cmVhbSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbWVtc2V0ICgoUFRSKSBzdHJlYW0sIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0JfQotICAgICAgd2hpbGUgKGN1cnJlbnRfYnl0ZV9pbmRleCA8IHMtPl9yYXdfc2l6ZSkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIHJ1bjsKLQkgIHVuc2lnbmVkIGludCBNQVhSVU4gPSAxMjc7Ci0JICBpZiAocmVsb2NzX3RvX2dvKQotCSAgICB7Ci0JICAgICAgcnVuID0gKCpwKS0+YWRkcmVzcyAtIGN1cnJlbnRfYnl0ZV9pbmRleDsKLQkgICAgICBpZiAocnVuID4gTUFYUlVOKQotCQlydW4gPSBNQVhSVU47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJ1biA9IE1BWFJVTjsKLQkgICAgfQotCSAgaWYgKHJ1biA+IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkgICAgewotCSAgICAgIHJ1biA9IHMtPl9yYXdfc2l6ZSAtIGN1cnJlbnRfYnl0ZV9pbmRleDsKLQkgICAgfQotCi0JICBpZiAocnVuICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBPdXRwdXQgYSBzdHJlYW0gb2YgYnl0ZXMgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcnVuKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIChzdHJlYW0gKyBjdXJyZW50X2J5dGVfaW5kZXgpLAotCQkJICAgICAxLAotCQkJICAgICBydW4sCi0JCQkgICAgIGFiZmQpCi0JCSAgIT0gcnVuKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IHJ1bjsKLQkgICAgfQotCSAgLyogT3V0cHV0IGFueSByZWxvY2F0aW9ucyBoZXJlICovCi0JICBpZiAocmVsb2NzX3RvX2dvICYmICgqcCkgJiYgKCpwKS0+YWRkcmVzcyA9PSBjdXJyZW50X2J5dGVfaW5kZXgpCi0JICAgIHsKLQkgICAgICB3aGlsZSAocmVsb2NzX3RvX2dvCi0JCSAgICAgJiYgKCpwKSAmJiAoKnApLT5hZGRyZXNzID09IGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkJewotCQkgIGFyZWxlbnQgKnIgPSAqcDsKLQkJICBiZmRfc2lnbmVkX3ZtYSBvdjsKLQotI2lmIDAKLQkJICBpZiAoci0+aG93dG8tPnBjX3JlbGF0aXZlKQotCQkgICAgewotCQkgICAgICByLT5hZGRlbmQgKz0gY3VycmVudF9ieXRlX2luZGV4OwotCQkgICAgfQotI2VuZGlmCi0KLQkJICBzd2l0Y2ggKHItPmhvd3RvLT5zaXplKQotCQkgICAgewotCQkgICAgY2FzZSAyOgotCi0JCSAgICAgIG92ID0gYmZkX2dldF9zaWduZWRfMzIgKGFiZmQsCi0JCQkJCSAgICAgIHN0cmVhbSArIGN1cnJlbnRfYnl0ZV9pbmRleCk7Ci0JCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCArPSA0OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgb3YgPSBiZmRfZ2V0X3NpZ25lZF8xNiAoYWJmZCwKLQkJCQkJICAgICAgc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KTsKLQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4ICs9IDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAwOgotCQkgICAgICBvdiA9IGJmZF9nZXRfc2lnbmVkXzggKGFiZmQsCi0JCQkJCSAgICAgc3RyZWFtICsgY3VycmVudF9ieXRlX2luZGV4KTsKLQkJICAgICAgY3VycmVudF9ieXRlX2luZGV4Kys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgb3YgPSAwOwotCQkgICAgICBCRkRfRkFJTCAoKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgb3YgJj0gci0+aG93dG8tPnNyY19tYXNrOwotCi0JCSAgaWYgKHItPmhvd3RvLT5wY19yZWxhdGl2ZQotCQkgICAgICAmJiAhIHItPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JCSAgICBvdiArPSByLT5hZGRyZXNzOwotCi0JCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCQkgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0pKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCi0vKgkJICBhYm9ydCgpOyovCi0KLQkJICBpZiAoci0+c3ltX3B0cl9wdHIgIT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgci0+YWRkZW5kICsgb3YsCi0JCQkJCQkgICAqKHItPnN5bV9wdHJfcHRyKSwKLQkJCQkJCSAgIHItPmhvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCQkJCSAgIHMtPmluZGV4KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwgci0+YWRkZW5kICsgb3YsCi0JCQkJCQkgICAoYXN5bWJvbCAqKSBOVUxMLAotCQkJCQkJICAgci0+aG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCQkJICAgcy0+aW5kZXgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgaWYgKG51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3MKLQkJICAgICAgIT0gYmZkX2dldF9yZWxvY19zaXplIChyLT5ob3d0bykpCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGllZWVfd3JpdGVfaW50IChhYmZkLAotCQkJCQkgICAgYmZkX2dldF9yZWxvY19zaXplIChyLT5ob3d0bykpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJIGllZWVfZnVuY3Rpb25fZWl0aGVyX2Nsb3NlX2JfZW51bSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkJICByZWxvY3NfdG9fZ28tLTsKLQkJICBwKys7Ci0JCX0KLQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSWYgdGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB0aGVuIHdlIGNhbiBiZQotICAgY2xldmVyIGFib3V0IGhvdyB3ZSB3cml0ZS4gIFdlIGJsb2NrIGl0ZW1zIHVwIGludG8gYSBtYXggb2YgMTI3Ci0gICBieXRlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kb19hc19yZXBlYXQgKGFiZmQsIHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGlmIChzLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCSAgICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtID4+IDgpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9zZXRfY3VycmVudF9wY19lbnVtICYgMHhmZikKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLAotCQkJCShiZmRfYnl0ZSkgKHMtPmluZGV4Ci0JCQkJCSAgICArIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSkpCi0JICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBzLT5sbWEpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9yZXBlYXRfZGF0YV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcy0+X3Jhd19zaXplKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbG9hZF9jb25zdGFudF9ieXRlc19lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDEpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLWRvX3dpdGhvdXRfcmVsb2NzIChhYmZkLCBzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBiZmRfYnl0ZSAqc3RyZWFtID0gaWVlZV9wZXJfc2VjdGlvbiAocyktPmRhdGE7Ci0KLSAgaWYgKHN0cmVhbSA9PSAwIHx8ICgocy0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkpCi0gICAgewotICAgICAgaWYgKCEgZG9fYXNfcmVwZWF0IChhYmZkLCBzKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+X3Jhd19zaXplOyBpKyspCi0JewotCSAgaWYgKHN0cmVhbVtpXSAhPSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoISBkb19hc19yZXBlYXQgKGFiZmQsIHMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9wdHJfc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqb3V0cHV0X3B0cjsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpvdXRwdXRfcHRyX2VuZDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICppbnB1dF9wdHJfc3RhcnQ7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5wdXRfcHRyOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlucHV0X3B0cl9lbmQ7Ci1zdGF0aWMgYmZkICppbnB1dF9iZmQ7Ci1zdGF0aWMgYmZkICpvdXRwdXRfYmZkOwotc3RhdGljIGludCBvdXRwdXRfYnVmZmVyOwotCi1zdGF0aWMgdm9pZAotZmlsbCAoKQotewotICAvKiBGSVhNRTogQ2hlY2sgcmV0dXJuIHZhbHVlLiAgSSdtIG5vdCBzdXJlIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVhZAotICAgICB0aGUgZW50aXJlIGJ1ZmZlciBvciBub3QuICAqLwotICBiZmRfcmVhZCAoKFBUUikgaW5wdXRfcHRyX3N0YXJ0LCAxLCBpbnB1dF9wdHJfZW5kIC0gaW5wdXRfcHRyX3N0YXJ0LCBpbnB1dF9iZmQpOwotICBpbnB1dF9wdHIgPSBpbnB1dF9wdHJfc3RhcnQ7Ci19Ci1zdGF0aWMgdm9pZAotZmx1c2ggKCkKLXsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgKG91dHB1dF9wdHJfc3RhcnQpLCAxLCBvdXRwdXRfcHRyIC0gb3V0cHV0X3B0cl9zdGFydCwKLQkJIG91dHB1dF9iZmQpCi0gICAgICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHB1dF9wdHIgLSBvdXRwdXRfcHRyX3N0YXJ0KSkKLSAgICBhYm9ydCAoKTsKLSAgb3V0cHV0X3B0ciA9IG91dHB1dF9wdHJfc3RhcnQ7Ci0gIG91dHB1dF9idWZmZXIrKzsKLX0KLQotI2RlZmluZSBUSElTKCkgKCAqaW5wdXRfcHRyICkKLSNkZWZpbmUgTkVYVCgpIHsgaW5wdXRfcHRyKys7IGlmIChpbnB1dF9wdHIgPT0gaW5wdXRfcHRyX2VuZCkgZmlsbCgpOyB9Ci0jZGVmaW5lIE9VVCh4KSB7ICpvdXRwdXRfcHRyKysgPSAoeCk7IGlmKG91dHB1dF9wdHIgPT0gb3V0cHV0X3B0cl9lbmQpICBmbHVzaCgpOyB9Ci0KLXN0YXRpYyB2b2lkCi13cml0ZV9pbnQgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIGlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDw9IDEyNykKLSAgICB7Ci0gICAgICBPVVQgKHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotICAgICAgLyogSG93IG1hbnkgc2lnbmlmaWNhbnQgYnl0ZXMgPyAqLwotICAgICAgLyogRklYTUUgRk9SIExPTkdFUiBJTlRTICovCi0gICAgICBpZiAodmFsdWUgJiAweGZmMDAwMDAwKQotCXsKLQkgIGxlbmd0aCA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwZmYwMDAwKQotCXsKLQkgIGxlbmd0aCA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAodmFsdWUgJiAweDAwMDBmZjAwKQotCXsKLQkgIGxlbmd0aCA9IDI7Ci0JfQotICAgICAgZWxzZQotCWxlbmd0aCA9IDE7Ci0KLSAgICAgIE9VVCAoKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gKyBsZW5ndGgpOwotICAgICAgc3dpdGNoIChsZW5ndGgpCi0JewotCWNhc2UgNDoKLQkgIE9VVCAodmFsdWUgPj4gMjQpOwotCWNhc2UgMzoKLQkgIE9VVCAodmFsdWUgPj4gMTYpOwotCWNhc2UgMjoKLQkgIE9VVCAodmFsdWUgPj4gOCk7Ci0JY2FzZSAxOgotCSAgT1VUICh2YWx1ZSk7Ci0JfQotCi0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY29weV9pZCAoKQotewotICBpbnQgbGVuZ3RoID0gVEhJUyAoKTsKLSAgY2hhciBjaDsKLSAgT1VUIChsZW5ndGgpOwotICBORVhUICgpOwotICB3aGlsZSAobGVuZ3RoLS0pCi0gICAgewotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgT1VUIChjaCk7Ci0gICAgICBORVhUICgpOwotICAgIH0KLX0KLQotI2RlZmluZSBWQVIoeCkgKCh4IHwgMHg4MCkpCi1zdGF0aWMgdm9pZAotY29weV9leHByZXNzaW9uICgpCi17Ci0gIGludCBzdGFja1sxMF07Ci0gIGludCAqdG9zID0gc3RhY2s7Ci0gIGludCB2YWx1ZSA9IDA7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHN3aXRjaCAoVEhJUyAoKSkKLQl7Ci0JY2FzZSAweDg0OgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9ICh2YWx1ZSA8PCA4KSB8IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MzoKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gKHZhbHVlIDw8IDgpIHwgVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MjoKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgdmFsdWUgPSAodmFsdWUgPDwgOCkgfCBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgICp0b3MrKyA9IHZhbHVlOwotCSAgYnJlYWs7Ci0JY2FzZSAweDgxOgotCSAgTkVYVCAoKTsKLQkgIHZhbHVlID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSB2YWx1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMHg4MDoKLQkgIE5FWFQgKCk7Ci0JICAqdG9zKysgPSAwOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmIChUSElTICgpID4gMHg4NCkKLQkgICAgewotCSAgICAgIC8qIE5vdCBhIG51bWJlciwganVzdCBidWcgb3V0IHdpdGggdGhlIGFuc3dlciAqLwotCSAgICAgIHdyaXRlX2ludCAoKigtLXRvcykpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgKnRvcysrID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICB2YWx1ZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIDB4YTU6Ci0JICAvKiBQTFVTIGFueXRoaW5nICovCi0JICB7Ci0JICAgIGludCB2YWx1ZSA9ICooLS10b3MpOwotCSAgICB2YWx1ZSArPSAqKC0tdG9zKTsKLQkgICAgKnRvcysrID0gdmFsdWU7Ci0JICAgIE5FWFQgKCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIFZBUiAoJ1InKToKLQkgIHsKLQkgICAgaW50IHNlY3Rpb25fbnVtYmVyOwotCSAgICBpZWVlX2RhdGFfdHlwZSAqaWVlZTsKLQkgICAgYXNlY3Rpb24gKnM7Ci0JICAgIE5FWFQgKCk7Ci0JICAgIHNlY3Rpb25fbnVtYmVyID0gVEhJUyAoKTsKLQotCSAgICBORVhUICgpOwotCSAgICBpZWVlID0gSUVFRV9EQVRBIChpbnB1dF9iZmQpOwotCSAgICBzID0gaWVlZS0+c2VjdGlvbl90YWJsZVtzZWN0aW9uX251bWJlcl07Ci0JICAgIGlmIChzLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgICB7Ci0JCXZhbHVlID0gcy0+b3V0cHV0X3NlY3Rpb24tPmxtYTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXZhbHVlID0gMDsKLQkgICAgICB9Ci0JICAgIHZhbHVlICs9IHMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgICp0b3MrKyA9IHZhbHVlOwotCSAgICB2YWx1ZSA9IDA7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIDB4OTA6Ci0JICB7Ci0JICAgIE5FWFQgKCk7Ci0JICAgIHdyaXRlX2ludCAoKigtLXRvcykpOwotCSAgICBPVVQgKDB4OTApOwotCSAgICByZXR1cm47Ci0KLQkgIH0KLQl9Ci0gICAgfQotCi19Ci0KLS8qIERyb3AgdGhlIGludCBpbiB0aGUgYnVmZmVyLCBhbmQgY29weSBhIG51bGwgaW50byB0aGUgZ2FwLCB3aGljaCB3ZQotICAgd2lsbCBvdmVyd3JpdGUgbGF0ZXIgKi8KLQotc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKnB0cnA7Ci0gIGludCBidWZmZXI7Ci19OwotCi1zdGF0aWMgdm9pZAotZmlsbF9pbnQgKGJ1ZikKLSAgICAgc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0ICpidWY7Ci17Ci0gIGlmIChidWYtPmJ1ZmZlciA9PSBvdXRwdXRfYnVmZmVyKQotICAgIHsKLSAgICAgIC8qIFN0aWxsIGEgY2hhbmNlIHRvIG91dHB1dCB0aGUgc2l6ZSAqLwotICAgICAgaW50IHZhbHVlID0gb3V0cHV0X3B0ciAtIGJ1Zi0+cHRycCArIDM7Ci0gICAgICBidWYtPnB0cnBbMF0gPSB2YWx1ZSA+PiAyNDsKLSAgICAgIGJ1Zi0+cHRycFsxXSA9IHZhbHVlID4+IDE2OwotICAgICAgYnVmLT5wdHJwWzJdID0gdmFsdWUgPj4gODsKLSAgICAgIGJ1Zi0+cHRycFszXSA9IHZhbHVlID4+IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZHJvcF9pbnQgKGJ1ZikKLSAgICAgc3RydWN0IG91dHB1dF9idWZmZXJfc3RydWN0ICpidWY7Ci17Ci0gIGludCB0eXBlID0gVEhJUyAoKTsKLSAgaW50IGNoOwotICBpZiAodHlwZSA8PSAweDg0KQotICAgIHsKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMHg4NDoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgzOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQljYXNlIDB4ODI6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCWNhc2UgMHg4MToKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgwOgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgT1VUICgweDg0KTsKLSAgYnVmLT5wdHJwID0gb3V0cHV0X3B0cjsKLSAgYnVmLT5idWZmZXIgPSBvdXRwdXRfYnVmZmVyOwotICBPVVQgKDApOwotICBPVVQgKDApOwotICBPVVQgKDApOwotICBPVVQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotY29weV9pbnQgKCkKLXsKLSAgaW50IHR5cGUgPSBUSElTICgpOwotICBpbnQgY2g7Ci0gIGlmICh0eXBlIDw9IDB4ODQpCi0gICAgewotICAgICAgT1VUICh0eXBlKTsKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0JewotCWNhc2UgMHg4NDoKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODM6Ci0JICBjaCA9IFRISVMgKCk7Ci0JICBORVhUICgpOwotCSAgT1VUIChjaCk7Ci0JY2FzZSAweDgyOgotCSAgY2ggPSBUSElTICgpOwotCSAgTkVYVCAoKTsKLQkgIE9VVCAoY2gpOwotCWNhc2UgMHg4MToKLQkgIGNoID0gVEhJUyAoKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKGNoKTsKLQljYXNlIDB4ODA6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0jZGVmaW5lIElEIGNvcHlfaWQoKQotI2RlZmluZSBJTlQgY29weV9pbnQoKQotI2RlZmluZSBFWFAgY29weV9leHByZXNzaW9uKCkKLXN0YXRpYyB2b2lkIGNvcHlfdGlsbF9lbmQgKCk7Ci0jZGVmaW5lIElOVG4ocSkgY29weV9pbnQoKQotI2RlZmluZSBFWFBuKHEpIGNvcHlfZXhwcmVzc2lvbigpCi0KLXN0YXRpYyB2b2lkCi1mMV9yZWNvcmQgKCkKLXsKLSAgaW50IGNoOwotICAvKiBBVE4gcmVjb3JkICovCi0gIE5FWFQgKCk7Ci0gIGNoID0gVEhJUyAoKTsKLSAgc3dpdGNoIChjaCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE9VVCAoMHhmMSk7Ci0gICAgICBPVVQgKGNoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjOToKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGM5KTsKLSAgICAgIElOVDsKLSAgICAgIElOVDsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHgxNjoKLQkgIE5FWFQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4MDE6Ci0JICBORVhUICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAwOgotCSAgTkVYVCAoKTsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMzoKLQkgIE5FWFQgKCk7Ci0JICBJTlQ7Ci0JICBicmVhazsKLQljYXNlIDB4MTM6Ci0JICBFWFBuIChpbnN0cnVjdGlvbiBhZGRyZXNzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ZDg6Ci0gICAgICAvKiBFWHRlcm5hbCByZWYgKi8KLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGQ4KTsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIEVYUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhjZToKLSAgICAgIE5FWFQgKCk7Ci0gICAgICBPVVQgKDB4ZjEpOwotICAgICAgT1VUICgweGNlKTsKLSAgICAgIElOVDsKLSAgICAgIElOVDsKLSAgICAgIGNoID0gVEhJUyAoKTsKLSAgICAgIElOVDsKLSAgICAgIHN3aXRjaCAoY2gpCi0JewotCWNhc2UgMHgwMToKLQkgIElOVDsKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMjoKLQkgIElOVDsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNDoKLQkgIEVYUG4gKGV4dGVybmFsIGZ1bmN0aW9uKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwNToKLQkgIGJyZWFrOwotCWNhc2UgMHgwNzoKLQkgIElOVG4gKGxpbmUgbnVtYmVyKTsKLQkgIElOVDsKLQljYXNlIDB4MDg6Ci0JICBicmVhazsKLQljYXNlIDB4MGE6Ci0JICBJTlRuIChsb2NrZWQgcmVnaXN0ZXIpOwotCSAgSU5UOwotCSAgYnJlYWs7Ci0JY2FzZSAweDNmOgotCSAgY29weV90aWxsX2VuZCAoKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgzZToKLQkgIGNvcHlfdGlsbF9lbmQgKCk7Ci0JICBicmVhazsKLQljYXNlIDB4NDA6Ci0JICBjb3B5X3RpbGxfZW5kICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDQxOgotCSAgSUQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1mMF9yZWNvcmQgKCkKLXsKLSAgLyogQXR0cmlidXRlIHJlY29yZCAqLwotICBORVhUICgpOwotICBPVVQgKDB4ZjApOwotICBJTlRuIChTeW1ib2wgbmFtZSk7Ci0gIElEOwotfQotCi1zdGF0aWMgdm9pZAotY29weV90aWxsX2VuZCAoKQotewotICBpbnQgY2ggPSBUSElTICgpOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoY2ggPD0gMHg4MCkKLQl7Ci0JICBPVVQgKGNoKTsKLQkgIE5FWFQgKCk7Ci0JICBjaCA9IFRISVMgKCk7Ci0JfQotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweDg0OgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgzOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgyOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JY2FzZSAweDgxOgotCSAgT1VUIChUSElTICgpKTsKLQkgIE5FWFQgKCk7Ci0JICBPVVQgKFRISVMgKCkpOwotCSAgTkVYVCAoKTsKLQotCSAgY2ggPSBUSElTICgpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1mMl9yZWNvcmQgKCkKLXsKLSAgTkVYVCAoKTsKLSAgT1VUICgweGYyKTsKLSAgSU5UOwotICBORVhUICgpOwotICBPVVQgKDB4Y2UpOwotICBJTlQ7Ci0gIGNvcHlfdGlsbF9lbmQgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQgYmxvY2sgKCk7Ci1zdGF0aWMgdm9pZAotZjhfcmVjb3JkICgpCi17Ci0gIGludCBjaDsKLSAgTkVYVCAoKTsKLSAgY2ggPSBUSElTICgpOwotICBzd2l0Y2ggKGNoKQotICAgIHsKLSAgICBjYXNlIDB4MDE6Ci0gICAgY2FzZSAweDAyOgotICAgIGNhc2UgMHgwMzoKLSAgICAgIC8qIFVuaXF1ZSB0eXBlZGVmcyBmb3IgbW9kdWxlICovCi0gICAgICAvKiBHTG9iYWwgdHlwZWRlZnMgICovCi0gICAgICAvKiBIaWdoIGxldmVsIG1vZHVsZSBzY29wZSBiZWdpbm5pbmcgKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoY2gpOwotCWRyb3BfaW50ICgmb2IpOwotCUlEOwotCi0JYmxvY2sgKCk7Ci0KLQlORVhUICgpOwotCWZpbGxfaW50ICgmb2IpOwotCU9VVCAoMHhmOSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDQ6Ci0gICAgICAvKiBHbG9iYWwgZnVuY3Rpb24gKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNCk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoc3RhY2sgc2l6ZSk7Ci0JSU5UbiAocmV0IHZhbCk7Ci0JRVhQbiAob2Zmc2V0KTsKLQotCWJsb2NrICgpOwotCi0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCUVYUG4gKHNpemUgb2YgYmxvY2spOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MDU6Ci0gICAgICAvKiBGaWxlIG5hbWUgZm9yIHNvdXJjZSBsaW5lIG51bWJlcnMgKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNSk7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoeWVhcik7Ci0JSU5UbiAobW9udGgpOwotCUlOVG4gKGRheSk7Ci0JSU5UbiAoaG91cik7Ci0JSU5UbiAobW9udXRlKTsKLQlJTlRuIChzZWNvbmQpOwotCWJsb2NrICgpOwotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweDA2OgotICAgICAgLyogTG9jYWwgZnVuY3Rpb24gKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwNik7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UbiAoc3RhY2sgc2l6ZSk7Ci0JSU5UbiAodHlwZSByZXR1cm4pOwotCUVYUG4gKG9mZnNldCk7Ci0JYmxvY2sgKCk7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjkpOwotCUVYUG4gKHNpemUpOwotCWZpbGxfaW50ICgmb2IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MGE6Ci0gICAgICAvKiBBc3NlbWJsZXIgbW9kdWxlIHNjb3BlIGJlZ2lubmluZyAtKi8KLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0KLQlORVhUICgpOwotCU9VVCAoMHhmOCk7Ci0JT1VUICgweDBhKTsKLQlkcm9wX2ludCAoJm9iKTsKLQlJRDsKLQlJRDsKLQlJTlQ7Ci0JSUQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0JSU5UOwotCUlOVDsKLQlJTlQ7Ci0KLQlibG9jayAoKTsKLQotCU5FWFQgKCk7Ci0JT1VUICgweGY5KTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgwYjoKLSAgICAgIHsKLQlzdHJ1Y3Qgb3V0cHV0X2J1ZmZlcl9zdHJ1Y3Qgb2I7Ci0JTkVYVCAoKTsKLQlPVVQgKDB4ZjgpOwotCU9VVCAoMHgwYik7Ci0JZHJvcF9pbnQgKCZvYik7Ci0JSUQ7Ci0JSU5UOwotCUlOVG4gKHNlY3Rpb24gaW5kZXgpOwotCUVYUG4gKG9mZnNldCk7Ci0JSU5UbiAoc3R1ZmYpOwotCi0JYmxvY2sgKCk7Ci0KLQlPVVQgKDB4ZjkpOwotCU5FWFQgKCk7Ci0JRVhQbiAoU2l6ZSBpbiBNYXVzKTsKLQlmaWxsX2ludCAoJm9iKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWUyX3JlY29yZCAoKQotewotICBPVVQgKDB4ZTIpOwotICBORVhUICgpOwotICBPVVQgKDB4Y2UpOwotICBORVhUICgpOwotICBJTlQ7Ci0gIEVYUDsKLX0KLQotc3RhdGljIHZvaWQKLWJsb2NrICgpCi17Ci0gIGludCBjaDsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2ggPSBUSElTICgpOwotICAgICAgc3dpdGNoIChjaCkKLQl7Ci0JY2FzZSAweGUxOgotCWNhc2UgMHhlNToKLQkgIHJldHVybjsKLQljYXNlIDB4Zjk6Ci0JICByZXR1cm47Ci0JY2FzZSAweGYwOgotCSAgZjBfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYxOgotCSAgZjFfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGYyOgotCSAgZjJfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGY4OgotCSAgZjhfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgZTJfcmVjb3JkICgpOwotCSAgYnJlYWs7Ci0KLQl9Ci0gICAgfQotfQotCi0KLQotLyogcmVsb2NhdGVfZGVidWcsCi0gICBtb3ZlcyBhbGwgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGZyb20gdGhlIHNvdXJjZSBiZmQgdG8gdGhlIG91dHB1dAotICAgYmZkLCBhbmQgcmVsb2NhdGVzIGFueSBleHByZXNzaW9ucyBpdCBmaW5kcwotKi8KLQotc3RhdGljIHZvaWQKLXJlbG9jYXRlX2RlYnVnIChvdXRwdXQsIGlucHV0KQotICAgICBiZmQgKm91dHB1dDsKLSAgICAgYmZkICppbnB1dDsKLXsKLSNkZWZpbmUgSUJTIDQwMAotI2RlZmluZSBPQlMgNDAwCi0gIHVuc2lnbmVkIGNoYXIgaW5wdXRfYnVmZmVyW0lCU107Ci0KLSAgaW5wdXRfcHRyX3N0YXJ0ID0gaW5wdXRfcHRyID0gaW5wdXRfYnVmZmVyOwotICBpbnB1dF9wdHJfZW5kID0gaW5wdXRfYnVmZmVyICsgSUJTOwotICBpbnB1dF9iZmQgPSBpbnB1dDsKLSAgLyogRklYTUU6IENoZWNrIHJldHVybiB2YWx1ZS4gIEknbSBub3Qgc3VyZSB3aGV0aGVyIGl0IG5lZWRzIHRvIHJlYWQKLSAgICAgdGhlIGVudGlyZSBidWZmZXIgb3Igbm90LiAgKi8KLSAgYmZkX3JlYWQgKChQVFIpIGlucHV0X3B0cl9zdGFydCwgMSwgSUJTLCBpbnB1dCk7Ci0gIGJsb2NrICgpOwotfQotCi0vKgotICBEdXJpbmcgbGlua2luZywgd2Ugd2UgdG9sZCBhYm91dCB0aGUgYmZkcyB3aGljaCBtYWRlIHVwIG91cgotICBjb250ZW50cywgd2UgaGF2ZSBhIGxpc3Qgb2YgdGhlbS4gVGhleSB3aWxsIHN0aWxsIGJlIG9wZW4sIHNvIGdvIHRvCi0gIHRoZSBkZWJ1ZyBpbmZvIGluIGVhY2gsIGFuZCBjb3B5IGl0IG91dCwgcmVsb2NhdGluZyBpdCBhcyB3ZSBnby4KLSovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX2RlYnVnX3BhcnQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICBiZmRfY2hhaW5fdHlwZSAqY2hhaW4gPSBpZWVlLT5jaGFpbl9yb290OwotICB1bnNpZ25lZCBjaGFyIG91dHB1dF9idWZmZXJbT0JTXTsKLSAgYm9vbGVhbiBzb21lX2RlYnVnID0gZmFsc2U7Ci0gIGZpbGVfcHRyIGhlcmUgPSBiZmRfdGVsbCAoYWJmZCk7Ci0KLSAgb3V0cHV0X3B0cl9zdGFydCA9IG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmZmVyOwotICBvdXRwdXRfcHRyX2VuZCA9IG91dHB1dF9idWZmZXIgKyBPQlM7Ci0gIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmZmVyOwotICBvdXRwdXRfYmZkID0gYWJmZDsKLQotICBpZiAoY2hhaW4gPT0gKGJmZF9jaGFpbl90eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAocyA9PSBOVUxMKQotCXsKLQkgIGllZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0ID0gMDsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSBoZXJlOwotICAgICAgaWYgKGJmZF93cml0ZSAocy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgYWJmZCkgIT0gcy0+X3Jhd19zaXplKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoY2hhaW4gIT0gKGJmZF9jaGFpbl90eXBlICopIE5VTEwpCi0JewotCSAgYmZkICplbnRyeSA9IGNoYWluLT50aGlzOwotCSAgaWVlZV9kYXRhX3R5cGUgKmVudHJ5X2llZWUgPSBJRUVFX0RBVEEgKGVudHJ5KTsKLQkgIGlmIChlbnRyeV9pZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfc2VlayAoZW50cnksIGVudHJ5X2llZWUtPncuci5kZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0LAotCQkJICAgIFNFRUtfU0VUKQotCQkgICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZWxvY2F0ZV9kZWJ1ZyAoYWJmZCwgZW50cnkpOwotCSAgICB9Ci0KLQkgIGNoYWluID0gY2hhaW4tPm5leHQ7Ci0JfQotICAgICAgaWYgKHNvbWVfZGVidWcpCi0JewotCSAgaWVlZS0+dy5yLmRlYnVnX2luZm9ybWF0aW9uX3BhcnQgPSBoZXJlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9IDA7Ci0JfQotCi0gICAgICBmbHVzaCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIHRoZSBkYXRhIGluIGFuIGllZWUgd2F5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZGF0YV9wYXJ0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGllZWUtPncuci5kYXRhX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBTa2lwIHNlY3Rpb25zIHRoYXQgaGF2ZSBubyBsb2FkYWJsZSBjb250ZW50cyAoLmJzcywKLSAgICAgICAgIGRlYnVnZ2luZywgZXRjLikgICovCi0gICAgICBpZiAoKHMtPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jIHJlY29yZHMgc28gd2UgY2FuIGluc2VydCB0aGVtIGluIHRoZSBjb3JyZWN0Ci0JIHBsYWNlcyAqLwotICAgICAgaWYgKHMtPnJlbG9jX2NvdW50ICE9IDApCi0JewotCSAgaWYgKCEgZG9fd2l0aF9yZWxvY3MgKGFiZmQsIHMpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGRvX3dpdGhvdXRfcmVsb2NzIChhYmZkLCBzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGJvb2xlYW4KLWluaXRfZm9yX291dHB1dCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHMtPl9yYXdfc2l6ZSAhPSAwKQotCXsKLQkgIGllZWVfcGVyX3NlY3Rpb24gKHMpLT5kYXRhID0gKGJmZF9ieXRlICopIChiZmRfYWxsb2MgKGFiZmQsIHMtPl9yYXdfc2l6ZSkpOwotCSAgaWYgKCFpZWVlX3Blcl9zZWN0aW9uIChzKS0+ZGF0YSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyoqIGV4ZWMgYW5kIGNvcmUgZmlsZSBzZWN0aW9ucyAqLwotCi0vKiBzZXQgc2VjdGlvbiBjb250ZW50cyBpcyBjb21wbGljYXRlZCB3aXRoIElFRUUgc2luY2UgdGhlIGZvcm1hdCBpcwotKiBub3QgYSBieXRlIGltYWdlLCBidXQgYSByZWNvcmQgc3RyZWFtLgotKi8KLWJvb2xlYW4KLWllZWVfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREVCVUdHSU5HKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCXsKLQkgIHNlY3Rpb24tPmNvbnRlbnRzID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkgIGlmIChzZWN0aW9uLT5jb250ZW50cyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBldmVyeXRoaW5nCi0gICAgICAgICBpcyB3aXRoaW4gcmFuZ2UuICAqLwotICAgICAgbWVtY3B5IChzZWN0aW9uLT5jb250ZW50cyArIG9mZnNldCwgbG9jYXRpb24sIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaWVlZV9wZXJfc2VjdGlvbiAoc2VjdGlvbiktPmRhdGEgPT0gKGJmZF9ieXRlICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKCFpbml0X2Zvcl9vdXRwdXQgKGFiZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIG1lbWNweSAoKFBUUikgKGllZWVfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhICsgb2Zmc2V0KSwKLQkgIChQVFIpIGxvY2F0aW9uLAotCSAgKHVuc2lnbmVkIGludCkgY291bnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgdGhlIGV4dGVybmFsIHN5bWJvbHMgb2YgYSBmaWxlLiAgSUVFRSBjb25zaWRlcnMgdHdvIHNvcnRzIG9mCi0gICBleHRlcm5hbCBzeW1ib2xzLCBwdWJsaWMsIGFuZCByZWZlcmVuY2VkLiAgSXQgdXNlcyB0byBpbnRlcm5hbAotICAgZm9ybXMgdG8gaW5kZXggdGhlbSBhcyB3ZWxsLiAgV2hlbiB3ZSB3cml0ZSB0aGVtIG91dCB3ZSB0dXJuIHRoZWlyCi0gICBzeW1ib2wgdmFsdWVzIGludG8gaW5kZXhlcyBmcm9tIHRoZSByaWdodCBiYXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICoqcTsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotCi0gIHVuc2lnbmVkIGludCByZWZlcmVuY2VfaW5kZXggPSBJRUVFX1JFRkVSRU5DRV9CQVNFOwotICB1bnNpZ25lZCBpbnQgcHVibGljX2luZGV4ID0gSUVFRV9QVUJMSUNfQkFTRSArIDI7Ci0gIGZpbGVfcHRyIGhlcmUgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGJvb2xlYW4gaGFkb25lID0gZmFsc2U7Ci0gIGlmIChhYmZkLT5vdXRzeW1ib2xzICE9IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHsKLQotICAgICAgZm9yIChxID0gYWJmZC0+b3V0c3ltYm9sczsgKnEgIT0gKGFzeW1ib2wgKikgTlVMTDsgcSsrKQotCXsKLQkgIGFzeW1ib2wgKnAgPSAqcTsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBtdXN0IGJlIGEgc3ltYm9sIHJlZmVyZW5jZSAuLiAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9leHRlcm5hbF9yZWZlcmVuY2VfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCByZWZlcmVuY2VfaW5kZXgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChhYmZkLCBwLT5uYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIHAtPnZhbHVlID0gcmVmZXJlbmNlX2luZGV4OwotCSAgICAgIHJlZmVyZW5jZV9pbmRleCsrOwotCSAgICAgIGhhZG9uZSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgd2VhayByZWZlcmVuY2UgKi8KLQkgICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcmVmZXJlbmNlX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoYWJmZCwgcC0+bmFtZSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCQkJaWVlZV93ZWFrX2V4dGVybmFsX3JlZmVyZW5jZV9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHJlZmVyZW5jZV9pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCBwLT52YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBwLT52YWx1ZSA9IHJlZmVyZW5jZV9pbmRleDsKLQkgICAgICByZWZlcmVuY2VfaW5kZXgrKzsKLQkgICAgICBoYWRvbmUgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIG11c3QgYmUgYSBzeW1ib2wgZGVmaW5pdGlvbiAqLwotCi0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIHAtPm5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoYWJmZCwgaWVlZV9hdHRyaWJ1dGVfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgcHVibGljX2luZGV4KQotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxNSkgLyogaW5zdHJ1Y3Rpb24gYWRkcmVzcyAqLwotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxOSkgLyogc3RhdGljIHN5bWJvbCAqLwotCQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAxKSkgLyogb25lIG9mIHRoZW0gKi8KLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSB2YWx1ZSAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3ZhbHVlX3JlY29yZF9lbnVtKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHB1YmxpY19pbmRleCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKHAtPnNlY3Rpb24pKQotCQl7Ci0JCSAgaWYgKGFiZmQtPmZsYWdzICYgRVhFQ19QKQotCQkgICAgewotCQkgICAgICAvKiBJZiBmdWxseSBsaW5rZWQsIHRoZW4gb3V0cHV0IGFsbCBzeW1ib2xzCi0JCQkgcmVsb2NhdGVkICovCi0JCSAgICAgIGlmICghIChpZWVlX3dyaXRlX2ludAotCQkJICAgICAoYWJmZCwKLQkJCSAgICAgIChwLT52YWx1ZQotCQkJICAgICAgICsgcC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJICAgICAgICsgcC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIChpZWVlX3dyaXRlX2V4cHJlc3Npb24KLQkJCSAgICAgKGFiZmQsCi0JCQkgICAgICBwLT52YWx1ZSArIHAtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQsCi0JCQkgICAgICBwLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+c3ltYm9sLAotCQkJICAgICAgZmFsc2UsIDApKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghIGllZWVfd3JpdGVfZXhwcmVzc2lvbiAoYWJmZCwKLQkJCQkJICAgICAgIHAtPnZhbHVlLAotCQkJCQkgICAgICAgYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sLAotCQkJCQkgICAgICAgZmFsc2UsIDApKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgcC0+dmFsdWUgPSBwdWJsaWNfaW5kZXg7Ci0JICAgICAgcHVibGljX2luZGV4Kys7Ci0JICAgICAgaGFkb25lID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIC0gd2hlbiB0aGVyZSBhcmUgZ2FwcyBpbiB0aGUgc3ltYm9scyByZWFkICovCi0JICAgICAgLyogZnJvbSBhbiBpbnB1dCBpZWVlIGZpbGUgKi8KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChoYWRvbmUpCi0gICAgaWVlZS0+dy5yLmV4dGVybmFsX3BhcnQgPSBoZXJlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLXN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIGV4dGVuW10gPQotewotICAweGYwLCAweDIwLCAweDAwLAotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzNywgMywgMywJLyogU2V0IHZlcnNpb24gMyByZXYgMyAgIAkqLwotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzOSwgMiwvKiBrZWVwIHN5bWJvbCBpbiAgb3JpZ2luYWwgY2FzZSAqLwotICAweGYxLCAweGNlLCAweDIwLCAweDAwLCAzOAkvKiBzZXQgb2JqZWN0IHR5cGUgcmVsb2NhdGVhYmxlIHRvIHggKi8KLX07Ci0KLXN0YXRpYyBDT05TVCB1bnNpZ25lZCBjaGFyIGVudmlbXSA9Ci17Ci0gIDB4ZjAsIDB4MjEsIDB4MDAsCi0KLS8qICAgIDB4ZjEsIDB4Y2UsIDB4MjEsIDAwLCA1MCwgMHg4MiwgMHgwNywgMHhjNywgMHgwOSwgMHgxMSwgMHgxMSwKLSAgICAweDE5LCAweDJjLAotKi8KLSAgMHhmMSwgMHhjZSwgMHgyMSwgMDAsIDUyLCAweDAwLAkvKiBleGVjIG9rICovCi0KLSAgMHhmMSwgMHhjZSwgMHgyMSwgMCwgNTMsIDB4MDMsLyogaG9zdCB1bml4ICovCi0vKiAgICAweGYxLCAweGNlLCAweDIxLCAwLCA1NCwgMiwxLDEJdG9vbCAmIHZlcnNpb24gIyAqLwotfTsKLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfbWVfcGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIGllZWUtPncuci50cmFpbGVyX3BhcnQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX3ZhbHVlX3N0YXJ0aW5nX2FkZHJlc3NfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9vcGVuX2JfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIGFiZmQtPnN0YXJ0X2FkZHJlc3MpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgaWVlZV9mdW5jdGlvbl9laXRoZXJfY2xvc2VfYl9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZWVlLT53LnIubWVfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIGllZWVfbW9kdWxlX2VuZF9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIElFRUUgcHJvY2Vzc29yIElELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfcHJvY2Vzc29yIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaDsKLQotICBhcmNoID0gYmZkX2dldF9hcmNoX2luZm8gKGFiZmQpOwotICBzd2l0Y2ggKGFyY2gtPmFyY2gpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCBiZmRfcHJpbnRhYmxlX25hbWUgKGFiZmQpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICIyOTAwMCIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9oODMwMDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICJIOC8zMDAiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfaDg1MDA6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiSDgvNTAwIikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2k5NjA6Ci0gICAgICBzd2l0Y2ggKGFyY2gtPm1hY2gpCi0JewotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX2NvcmU6Ci0JY2FzZSBiZmRfbWFjaF9pOTYwX2thX3NhOgotCSAgaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgIjgwOTYwS0EiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9tYWNoX2k5NjBfa2Jfc2I6Ci0JICBpZiAoISBpZWVlX3dyaXRlX2lkIChhYmZkLCAiODA5NjBLQiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgYmZkX21hY2hfaTk2MF9jYToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2MENBIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBiZmRfbWFjaF9pOTYwX21jOgotCWNhc2UgYmZkX21hY2hfaTk2MF94YToKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGFiZmQsICI4MDk2ME1DIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgewotCWNvbnN0IGNoYXIgKmlkOwotCi0Jc3dpdGNoIChhcmNoLT5tYWNoKQotCSAgewotCSAgZGVmYXVsdDoJCWlkID0gIjY4MDIwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAwMDogaWQgPSAiNjgwMDAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDA4OiBpZCA9ICI2ODAwOCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwMTA6IGlkID0gIjY4MDEwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODAyMDogaWQgPSAiNjgwMjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfbTY4MDMwOiBpZCA9ICI2ODAzMCI7IGJyZWFrOwotCSAgY2FzZSBiZmRfbWFjaF9tNjgwNDA6IGlkID0gIjY4MDQwIjsgYnJlYWs7Ci0JICBjYXNlIGJmZF9tYWNoX202ODA2MDogaWQgPSAiNjgwNjAiOyBicmVhazsKLQkgIGNhc2UgYmZkX21hY2hfY3B1MzI6ICBpZCA9ICJjcHUzMiI7IGJyZWFrOwotCSAgfQotCi0JaWYgKCEgaWVlZV93cml0ZV9pZCAoYWJmZCwgaWQpKQotCSAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sZWFuCi1pZWVlX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoYWJmZCk7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaWxlX3B0ciBvbGQ7Ci0KLSAgLyogRmFzdCBmb3J3YXJkIG92ZXIgdGhlIGhlYWRlciBhcmVhICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX21vZHVsZV9iZWdpbm5pbmdfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9wcm9jZXNzb3IgKGFiZmQpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGFiZmQsIGFiZmQtPmZpbGVuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRmFzdCBmb3J3YXJkIG92ZXIgdGhlIHZhcmlhYmxlIGJpdHMgKi8KLSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCBpZWVlX2FkZHJlc3NfZGVzY3JpcHRvcl9lbnVtKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQml0cyBwZXIgTUFVICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgKGJmZF9ieXRlKSAoYmZkX2FyY2hfYml0c19wZXJfYnl0ZSAoYWJmZCkpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8qIE1BVSdzIHBlciBhZGRyZXNzICovCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwKLQkJCSAoYmZkX2J5dGUpIChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKQotCQkJCSAgICAgLyBiZmRfYXJjaF9iaXRzX3Blcl9ieXRlIChhYmZkKSkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvbGQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoOCAqIE5fV19WQVJJQUJMRVMpLCBTRUVLX0NVUikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWVlZS0+dy5yLmV4dGVuc2lvbl9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCk7Ci0gIGlmIChiZmRfd3JpdGUgKChjaGFyICopIGV4dGVuLCAxLCBzaXplb2YgKGV4dGVuKSwgYWJmZCkgIT0gc2l6ZW9mIChleHRlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChhYmZkLCAweDEpKSAvKiBBYnNvbHV0ZSAqLwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIDB4MikpIC8qIFJlbG9jYXRlYWJsZSAqLwotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWVlZS0+dy5yLmVudmlyb25tZW50YWxfcmVjb3JkID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAoYmZkX3dyaXRlICgoY2hhciAqKSBlbnZpLCAxLCBzaXplb2YgKGVudmkpLCBhYmZkKSAhPSBzaXplb2YgKGVudmkpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgSFAgZW11bGF0b3IgZGF0YWJhc2UgcmVxdWlyZXMgYSB0aW1lc3RhbXAgaW4gdGhlIGZpbGUuICAqLwotICB7Ci0gICAgdGltZV90IG5vdzsKLSAgICBjb25zdCBzdHJ1Y3QgdG0gKnQ7Ci0KLSAgICB0aW1lICgmbm93KTsKLSAgICB0ID0gKHN0cnVjdCB0bSAqKSBsb2NhbHRpbWUgKCZub3cpOwotICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCAoaW50KSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMHgyMSkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgMCkKLQl8fCAhIGllZWVfd3JpdGVfYnl0ZSAoYWJmZCwgNTApCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1feWVhciArIDE5MDApCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbW9uICsgMSkKLQl8fCAhIGllZWVfd3JpdGVfaW50IChhYmZkLCB0LT50bV9tZGF5KQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX2hvdXIpCi0JfHwgISBpZWVlX3dyaXRlX2ludCAoYWJmZCwgdC0+dG1fbWluKQotCXx8ICEgaWVlZV93cml0ZV9pbnQgKGFiZmQsIHQtPnRtX3NlYykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBvdXRwdXRfYmZkID0gYWJmZDsKLQotICBmbHVzaCAoKTsKLQotICBpZiAoISBpZWVlX3dyaXRlX3NlY3Rpb25fcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvKiBGaXJzdCB3cml0ZSB0aGUgc3ltYm9scy4gIFRoaXMgY2hhbmdlcyB0aGVpciB2YWx1ZXMgaW50byB0YWJsZQotICAgIGluZGVjZXMgc28gd2UgY2FudCB1c2UgaXQgYWZ0ZXIgdGhpcyBwb2ludC4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZXh0ZXJuYWxfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qICBpZWVlX3dyaXRlX2J5dGUoYWJmZCwgaWVlZV9yZWNvcmRfc2VwZXJhdG9yX2VudW0pOyovCi0KLSAgLyogIGllZWVfd3JpdGVfYnl0ZShhYmZkLCBpZWVlX3JlY29yZF9zZXBlcmF0b3JfZW51bSk7Ki8KLQotCi0gIC8qIFdyaXRlIGFueSBkZWJ1Z3Mgd2UgaGF2ZSBiZWVuIHRvbGQgYWJvdXQuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2RlYnVnX3BhcnQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBDYW4gb25seSB3cml0ZSB0aGUgZGF0YSBvbmNlIHRoZSBzeW1ib2xzIGhhdmUgYmVlbiB3cml0dGVuLCBzaW5jZQotICAgICB0aGUgZGF0YSBjb250YWlucyByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHdoaWNoIHBvaW50cyB0byB0aGUKLSAgICAgc3ltYm9scy4gICovCi0gIGlmICghIGllZWVfd3JpdGVfZGF0YV9wYXJ0IChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQXQgdGhlIGVuZCB3ZSBwdXQgdGhlIGVuZCEgICovCi0gIGlmICghIGllZWVfd3JpdGVfbWVfcGFydCAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdlbmVyYXRlIHRoZSBoZWFkZXIgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvbGQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTl9XX1ZBUklBQkxFUzsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfMmJ5dGVzIChhYmZkLCBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGFiZmQsIChiZmRfYnl0ZSkgaSkKLQkgIHx8ICEgaWVlZV93cml0ZV9pbnQ1X291dCAoYWJmZCwgaWVlZS0+dy5vZmZzZXRbaV0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBOYXRpdmUtbGV2ZWwgaW50ZXJmYWNlIHRvIHN5bWJvbHMuICovCi0KLS8qIFdlIHJlYWQgdGhlIHN5bWJvbHMgaW50byBhIGJ1ZmZlciwgd2hpY2ggaXMgZGlzY2FyZGVkIHdoZW4gdGhpcwotICAgZnVuY3Rpb24gZXhpdHMuICBXZSByZWFkIHRoZSBzdHJpbmdzIGludG8gYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvCi0gICBob2xkIHRoZW0gYWxsIHBsdXMgYWxsIHRoZSBjYWNoZWQgc3ltYm9sIGVudHJpZXMuICovCi0KLWFzeW1ib2wgKgotaWVlZV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZWVlX3N5bWJvbF90eXBlICpuZXcgPQotICAgIChpZWVlX3N5bWJvbF90eXBlICopIGJmZF96bWFsbG9jIChzaXplb2YgKGllZWVfc3ltYm9sX3R5cGUpKTsKLSAgaWYgKCFuZXcpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gJm5ldy0+c3ltYm9sOwotfQotCi1zdGF0aWMgYmZkICoKLWllZWVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBwcmV2KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgaWVlZV9hcl9kYXRhX3R5cGUgKmFyID0gSUVFRV9BUl9EQVRBIChhcmNoKTsKLSAgLyogdGFrZSB0aGUgbmV4dCBvbmUgZnJvbSB0aGUgYXJjaCBzdGF0ZSwgb3IgcmVzZXQgKi8KLSAgaWYgKHByZXYgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBpbmRleCAtIHRoZSBmaXJzdCB0d28gZW50cmllcyBhcmUgYm9ndXMqLwotICAgICAgYXItPmVsZW1lbnRfaW5kZXggPSAyOwotICAgIH0KLSAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgaWVlZV9hcl9vYnN0YWNrX3R5cGUgKnAgPSBhci0+ZWxlbWVudHMgKyBhci0+ZWxlbWVudF9pbmRleDsKLSAgICAgIGFyLT5lbGVtZW50X2luZGV4Kys7Ci0gICAgICBpZiAoYXItPmVsZW1lbnRfaW5kZXggPD0gYXItPmVsZW1lbnRfY291bnQpCi0JewotCSAgaWYgKHAtPmZpbGVfb2Zmc2V0ICE9IChmaWxlX3B0cikgMCkKLQkgICAgewotCSAgICAgIGlmIChwLT5hYmZkID09IChiZmQgKikgTlVMTCkKLQkJewotCQkgIHAtPmFiZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2gpOwotCQkgIHAtPmFiZmQtPm9yaWdpbiA9IHAtPmZpbGVfb2Zmc2V0OwotCQl9Ci0JICAgICAgcmV0dXJuIHAtPmFiZmQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpOwotCSAgcmV0dXJuIChiZmQgKikgTlVMTDsKLQl9Ci0KLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJc2VjdGlvbiwKLQkJCXN5bWJvbHMsCi0JCQlvZmZzZXQsCi0JCQlmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLAotCQkJbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY29uc3QgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY29uc3QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludAotaWVlZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBpZWVlX2FyX2RhdGFfdHlwZSAqYXIgPSAoaWVlZV9hcl9kYXRhX3R5cGUgKikgTlVMTDsKLSAgaWVlZV9kYXRhX3R5cGUgKmllZWU7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUgIT0gTlVMTCkKLSAgICBhciA9IGFiZmQtPm15X2FyY2hpdmUtPnRkYXRhLmllZWVfYXJfZGF0YTsKLSAgaWYgKGFyID09IChpZWVlX2FyX2RhdGFfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChJRUVFX0RBVEEgKGFiZmQpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGllZWVfb2JqZWN0X3AgKGFiZmQpID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICBpZWVlID0gSUVFRV9EQVRBIChhYmZkKTsKLQotICBidWYtPnN0X3NpemUgPSBpZWVlLT53LnIubWVfcmVjb3JkICsgMTsKLSAgYnVmLT5zdF9tb2RlID0gMDY0NDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWllZWVfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiB4OwotewotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgZGVidWcgaW5mbyByb3V0aW5lcyBhcmUgbmV2ZXIgdXNlZC4gICovCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19zdGFydCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi19Ci0KLXN0YXRpYyB2b2lkCi1pZWVlX2JmZF9kZWJ1Z19pbmZvX2VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotCi19Ci0KLQotLyogQWRkIHRoaXMgc2VjdGlvbiB0byB0aGUgbGlzdCBvZiBzZWN0aW9ucyB3ZSBoYXZlIGRlYnVnIGluZm8gZm9yLCB0bwotICAgYmUgcmVhZHkgdG8gb3V0cHV0IGl0IGF0IGNsb3NlIHRpbWUKLSAgICovCi1zdGF0aWMgdm9pZAotaWVlZV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBpZWVlX2RhdGFfdHlwZSAqaWVlZSA9IElFRUVfREFUQSAoc2VjdGlvbi0+b3duZXIpOwotICBpZWVlX2RhdGFfdHlwZSAqb3V0cHV0X2llZWUgPSBJRUVFX0RBVEEgKGFiZmQpOwotICAvKiBjYW4gb25seSBhY2N1bXVsYXRlIGRhdGEgZnJvbSBvdGhlciBpZWVlIGJmZHMgKi8KLSAgaWYgKHNlY3Rpb24tPm93bmVyLT54dmVjICE9IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuOwotICAvKiBPbmx5IGJvdGhlciBvbmNlIHBlciBiZmQgKi8KLSAgaWYgKGllZWUtPmRvbmVfZGVidWcgPT0gdHJ1ZSkKLSAgICByZXR1cm47Ci0gIGllZWUtPmRvbmVfZGVidWcgPSB0cnVlOwotCi0gIC8qIERvbid0IGJvdGhlciBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvICovCi0gIGlmIChpZWVlLT53LnIuZGVidWdfaW5mb3JtYXRpb25fcGFydCA9PSAwKQotICAgIHJldHVybjsKLQotCi0gIC8qIEFkZCB0byBjaGFpbiAqLwotICB7Ci0gICAgYmZkX2NoYWluX3R5cGUgKm4gPSAoYmZkX2NoYWluX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGJmZF9jaGFpbl90eXBlKSk7Ci0gICAgaWYgKCFuKQotICAgICAgYWJvcnQgKCk7CQkvKiBGSVhNRSAqLwotICAgIG4tPnRoaXMgPSBzZWN0aW9uLT5vd25lcjsKLSAgICBuLT5uZXh0ID0gKGJmZF9jaGFpbl90eXBlICopIE5VTEw7Ci0KLSAgICBpZiAob3V0cHV0X2llZWUtPmNoYWluX2hlYWQpCi0gICAgICB7Ci0Jb3V0cHV0X2llZWUtPmNoYWluX2hlYWQtPm5leHQgPSBuOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIHsKLQlvdXRwdXRfaWVlZS0+Y2hhaW5fcm9vdCA9IG47Ci0KLSAgICAgIH0KLSAgICBvdXRwdXRfaWVlZS0+Y2hhaW5faGVhZCA9IG47Ci0gIH0KLX0KLQotI2VuZGlmCi0KLSNkZWZpbmUJaWVlZV9jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgaWVlZV9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBpZWVlX3NsdXJwX2FybWFwIGJmZF90cnVlCi0jZGVmaW5lIGllZWVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBpZWVlX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgaWVlZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX3RydWUpCi0jZGVmaW5lIGllZWVfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIGllZWVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotI2RlZmluZSBpZWVlX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLQotI2RlZmluZSBpZWVlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgaWVlZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaWVlZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGllZWVfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBpZWVlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIGllZWVfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgaWVlZV9zZXRfYXJjaF9tYWNoIF9iZmRfZ2VuZXJpY19zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgaWVlZV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0jZGVmaW5lIGllZWVfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpZWVlX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWVlZV9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpZWVlX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGllZWVfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWVlZV9iZmRfbGlua19zcGxpdF9zZWN0aW9uICBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qU1VQUFJFU1MgNDYwICovCi1jb25zdCBiZmRfdGFyZ2V0IGllZWVfdmVjID0KLXsKLSAgImllZWUiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAnXycsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBpZWVlX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgaWVlZV9hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBpZWVlX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWVlZV93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChpZWVlKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoaWVlZSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL2loZXguYyBiL2JmZC9paGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTUzZDMuLjAwMDAwMDAKLS0tIGEvYmZkL2loZXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwNDEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCBIZXggb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIG9mIEN5Z251cyBTdXBwb3J0IDxpYW5AY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBpcyB3aGF0IEludGVsIEhleCBmaWxlcyBsb29rIGxpa2U6Ci0KLTEuIElOVEVMIEZPUk1BVFMKLQotQS4gSW50ZWwgMQotCi0gICAxNi1iaXQgYWRkcmVzcy1maWVsZCBmb3JtYXQsIGZvciBmaWxlcyA2NGsgYnl0ZXMgaW4gbGVuZ3RoIG9yIGxlc3MuCi0KLSAgIERBVEEgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24oOikKLSAgIDIuLjMJCVRoZSBudW1iZXIgb2YgZGF0YSBieXRlcyBpbiBoZXggbm90YXRpb24KLSAgIDQuLjUJCUhpZ2ggYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgNi4uNwkJTG93IGJ5dGUgb2YgdGhlIHJlY29yZCBsb2FkIGFkZHJlc3MKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMCIKLSAgIDEwLi54CURhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgotCXggPSAobnVtYmVyIG9mIGJ5dGVzIC0gMSkgKiAyICsgMTEKLSAgIHgrMS4ueCsyCUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgeCszLi54KzQJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgRU5EIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQsIG11c3QgYmUgIjAwIgotICAgNC4uNwkJVHJhbnNmZXItYWRkcmVzcyAodXN1YWxseSAiMDAwMCIpCi0JCXRoZSBqdW1wLXRvIGFkZHJlc3MsIGV4ZWN1dGlvbiBzdGFydCBhZGRyZXNzCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDEiCi0gICAxMC4uMTEJQ2hlY2tzdW0sIGluIGhleCBub3RhdGlvbgotICAgMTIuLjEzCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLUIuIElOVEVMIDIKLQotICAgTUNTLTg2IGZvcm1hdCwgdXNpbmcgYSAyMC1iaXQgYWRkcmVzcyBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNjRLIGJ5dGVzLgotCi0gICBEQVRBIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uICg6KQotICAgMi4uMwkJVGhlIGJ5dGUgY291bnQgb2YgdGhpcyByZWNvcmQsIGhleCBub3RhdGlvbgotICAgNC4uNQkJSGlnaCBieXRlIG9mIHRoZSByZWNvcmQgbG9hZCBhZGRyZXNzCi0gICA2Li43CQlMb3cgYnl0ZSBvZiB0aGUgcmVjb3JkIGxvYWQgYWRkcmVzcwotICAgOC4uOQkJUmVjb3JkIHR5cGUsIG11c3QgYmUgIjAwIgotICAgMTAuLngJVGhlIGRhdGEgYnl0ZXMgaW4gaGV4IG5vdGF0aW9uOgotCXggPSAobnVtYmVyIG9mIGRhdGEgYnl0ZXMgLSAxKSAqIDIgKyAxMQotICAgeCsxLi54KzIJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICB4KzMuLngrNAlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotCi0gICBFWFRFTkRFRCBBRERSRVNTIFJFQ09SRAotICAgQnl0ZSAxCUhlYWRlciA9IGNvbG9uKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDIiCi0gICAxMC4uMTEJSGlnaCBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcwotICAgMTIuLjEzCUxvdyBieXRlIG9mIHRoZSBvZmZzZXQgYWRkcmVzcwotICAgMTQuLjE1CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMTYuLjE3CUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLSAgIFRoZSBjaGVja3N1bXMgYXJlIHRoZSB0d28ncyBjb21wbGVtZW50IG9mIHRoZSA4LWJpdCBzdW0KLSAgIHdpdGhvdXQgY2Fycnkgb2YgdGhlIGJ5dGUgY291bnQsIG9mZnNldCBhZGRyZXNzLCBhbmQgdGhlCi0gICByZWNvcmQgdHlwZS4KLQotICAgU1RBUlQgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwMyIKLSAgIDEwLi4xMwk4MDg2IENTIHZhbHVlCi0gICAxNC4uMTcJODA4NiBJUCB2YWx1ZQotICAgMTguLjE5CUNoZWNrc3VtIGluIGhleCBub3RhdGlvbgotICAgMjAuLjIxCUNhcnJpYWdlIHJldHVybiwgbGluZSBmZWVkCi0KLUFub3RoZXIgZG9jdW1lbnQgcmVwb3J0cyB0aGVzZSBhZGRpdGlvbmFsIHR5cGVzOgotCi0gICBFWFRFTkRFRCBMSU5FQVIgQUREUkVTUyBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwMiIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNCIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIGFkZHJlc3Mgb2Ygc3Vic2VxdWVudCByZWNvcmRzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotICAgU1RBUlQgTElORUFSIEFERFJFU1MgUkVDT1JECi0gICBCeXRlIDEJSGVhZGVyID0gY29sb24gKDopCi0gICAyLi4zCQlUaGUgYnl0ZSBjb3VudCwgbXVzdCBiZSAiMDIiCi0gICA0Li43CQlMb2FkIGFkZHJlc3MsIG11c3QgYmUgIjAwMDAiCi0gICA4Li45CQlSZWNvcmQgdHlwZSwgbXVzdCBiZSAiMDUiCi0gICAxMC4uMTMJVXBwZXIgMTYgYml0cyBvZiBzdGFydCBhZGRyZXNzCi0gICAxNC4uMTUJQ2hlY2tzdW0gaW4gaGV4IG5vdGF0aW9uCi0gICAxNi4uMTcJQ2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQKLQotVGhlIE1SSSBjb21waWxlciB1c2VzIHRoaXMsIHdoaWNoIGlzIGEgcmVwZWF0IG9mIHR5cGUgNToKLQotICBFWFRFTkRFRCBTVEFSVCBSRUNPUkQKLSAgIEJ5dGUgMQlIZWFkZXIgPSBjb2xvbiAoOikKLSAgIDIuLjMJCVRoZSBieXRlIGNvdW50LCBtdXN0IGJlICIwNCIKLSAgIDQuLjcJCUxvYWQgYWRkcmVzcywgbXVzdCBiZSAiMDAwMCIKLSAgIDguLjkJCVJlY29yZCB0eXBlLCBtdXN0IGJlICIwNSIKLSAgIDEwLi4xMwlVcHBlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE0Li4xNwlMb3dlciAxNiBiaXRzIG9mIHN0YXJ0IGFkZHJlc3MKLSAgIDE4Li4xOQlDaGVja3N1bSBpbiBoZXggbm90YXRpb24KLSAgIDIwLi4yMQlDYXJyaWFnZSByZXR1cm4sIGxpbmUgZmVlZAotKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIHZvaWQgaWhleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGloZXhfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBJTkxJTkUgaW50IGloZXhfZ2V0X2J5dGUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgaWhleF9iYWRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2NhbiBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmloZXhfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX3JlY29yZAotICBQQVJBTVMgKChiZmQgKiwgYmZkX3NpemVfdHlwZSwgYmZkX3ZtYSwgdW5zaWduZWQgaW50LCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpaGV4X3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGFzeW1ib2wgKmloZXhfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGloZXhfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGloZXhfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLQotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBwdXQgb24gb25lIGxpbmUgZHVyaW5nIG91dHB1dC4gICovCi0KLSNkZWZpbmUgQ0hVTksgKDIxKQotCi0vKiBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBoZXggYW5kIGJpbmFyeS4gKi8KLQotI2RlZmluZSBOSUJCTEUoeCkgKGhleF92YWx1ZSAoeCkpCi0jZGVmaW5lIEhFWDIoYnVmZmVyKSAoKE5JQkJMRSAoKGJ1ZmZlcilbMF0pIDw8IDQpICsgTklCQkxFICgoYnVmZmVyKVsxXSkpCi0jZGVmaW5lIEhFWDQoYnVmZmVyKSAoKEhFWDIgKGJ1ZmZlcikgPDwgOCkgKyBIRVgyICgoYnVmZmVyKSArIDIpKQotI2RlZmluZSBJU0hFWCh4KSAoaGV4X3AgKHgpKQotCi0vKiBXaGVuIHdlIHdyaXRlIG91dCBhbiBpaGV4IHZhbHVlLCB0aGUgdmFsdWVzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgSW5zdGVhZCwgd2UgaG9sZCB0aGVtIGluIG1lbW9yeSBpbiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfbGlzdAotewotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKm5leHQ7Ci0gIGJmZF9ieXRlICpkYXRhOwotICBiZmRfdm1hIHdoZXJlOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci19OwotCi0vKiBUaGUgaWhleCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBpaGV4X2RhdGFfc3RydWN0Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqaGVhZDsKLSAgc3RydWN0IGloZXhfZGF0YV9saXN0ICp0YWlsOwotfTsKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gICovCi0KLXN0YXRpYyB2b2lkCi1paGV4X2luaXQgKCkKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGVkOwotCi0gIGlmICghIGluaXRlZCkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSB0cnVlOwotICAgICAgaGV4X2luaXQgKCk7Ci0gICAgfQotfQotCi0vKiBDcmVhdGUgYW4gaWhleCBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYWJmZC0+dGRhdGEuaWhleF9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKnRkYXRhOwotCi0gICAgICB0ZGF0YSA9ICgoc3RydWN0IGloZXhfZGF0YV9zdHJ1Y3QgKikKLQkgICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0KSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuaWhleF9kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgYnl0ZSBmcm9tIGEgQkZELiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvciBvY2N1cnJlZC4KLSAgIFJldHVybiBFT0Ygb24gZXJyb3Igb3IgZW5kIG9mIGZpbGUuICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaWhleF9nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Ci17Ci0gIGJmZF9ieXRlIGM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JKmVycm9ycHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotCi0gIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOwotfQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWloZXhfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgaW50IGM7Ci0gICAgIGJvb2xlYW4gZXJyb3I7Ci17Ci0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBpZiAoISBlcnJvcikKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKCEgaXNwcmludCAoYykpCi0Jc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYzsKLQkgIGJ1ZlsxXSA9ICdcMCc7Ci0JfQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiVkOiB1bmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIEludGVsIEhleCBmaWxlXG4iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubywgYnVmKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgIH0KLX0KLQotLyogUmVhZCBhbiBJbnRlbCBoZXggZmlsZSBhbmQgdHVybiBpdCBpbnRvIHNlY3Rpb25zLiAgV2UgY3JlYXRlIGEgbmV3Ci0gICBzZWN0aW9uIGZvciBlYWNoIGNvbnRpZ3VvdXMgc2V0IG9mIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfc2NhbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfdm1hIHNlZ2Jhc2U7Ci0gIGJmZF92bWEgZXh0YmFzZTsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgaW50IGxpbmVubzsKLSAgYm9vbGVhbiBlcnJvcjsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplOwotICBpbnQgYzsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgYWJmZC0+c3RhcnRfYWRkcmVzcyA9IDA7Ci0KLSAgc2VnYmFzZSA9IDA7Ci0gIGV4dGJhc2UgPSAwOwotICBzZWMgPSBOVUxMOwotICBsaW5lbm8gPSAxOwotICBlcnJvciA9IGZhbHNlOwotICBidWZzaXplID0gMDsKLSAgd2hpbGUgKChjID0gaWhleF9nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGlmIChjID09ICdccicpCi0JY29udGludWU7Ci0gICAgICBlbHNlIGlmIChjID09ICdcbicpCi0JewotCSAgKytsaW5lbm87Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBlbHNlIGlmIChjICE9ICc6JykKLQl7Ci0JICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxlX3B0ciBwb3M7Ci0JICBjaGFyIGhkcls4XTsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgdW5zaWduZWQgaW50IGxlbjsKLQkgIGJmZF92bWEgYWRkcjsKLQkgIHVuc2lnbmVkIGludCB0eXBlOwotCSAgdW5zaWduZWQgaW50IGNoYXJzOwotCSAgdW5zaWduZWQgaW50IGNoa3N1bTsKLQotCSAgLyogVGhpcyBpcyBhIGRhdGEgcmVjb3JkLiAgKi8KLQotCSAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKLQotCSAgLyogUmVhZCB0aGUgaGVhZGVyIGJ5dGVzLiAgKi8KLQotCSAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCEgSVNIRVggKGhkcltpXSkpCi0JCXsKLQkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgbGVuID0gSEVYMiAoaGRyKTsKLQkgIGFkZHIgPSBIRVg0IChoZHIgKyAyKTsKLQkgIHR5cGUgPSBIRVgyIChoZHIgKyA2KTsKLQotCSAgLyogUmVhZCB0aGUgZGF0YSBieXRlcy4gICovCi0KLQkgIGNoYXJzID0gbGVuICogMiArIDI7Ci0JICBpZiAoY2hhcnMgPj0gYnVmc2l6ZSkKLQkgICAgewotCSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAoYnVmLCBjaGFycyk7Ci0JICAgICAgaWYgKGJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBidWZzaXplID0gY2hhcnM7Ci0JICAgIH0KLQotCSAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGNoYXJzLCBhYmZkKSAhPSBjaGFycykKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBjaGFyczsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCEgSVNIRVggKGJ1ZltpXSkpCi0JCXsKLQkJICBpaGV4X2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGhkcltpXSwgZXJyb3IpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQotCSAgLyogQ2hlY2sgdGhlIGNoZWNrc3VtLiAgKi8KLQkgIGNoa3N1bSA9IGxlbiArIGFkZHIgKyAoYWRkciA+PiA4KSArIHR5cGU7Ci0JICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JICAgIGNoa3N1bSArPSBIRVgyIChidWYgKyAyICogaSk7Ci0JICBpZiAoKCgtIGNoa3N1bSkgJiAweGZmKSAhPSAodW5zaWduZWQgaW50KSBIRVgyIChidWYgKyAyICogaSkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiVkOiBiYWQgY2hlY2tzdW0gaW4gSW50ZWwgSGV4IGZpbGUgKGV4cGVjdGVkICV1LCBmb3VuZCAldSkiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8sCi0JCSAoLSBjaGtzdW0pICYgMHhmZiwgKHVuc2lnbmVkIGludCkgSEVYMiAoYnVmICsgMiAqIGkpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIC8qIFRoaXMgaXMgYSBkYXRhIHJlY29yZC4gICovCi0JICAgICAgaWYgKHNlYyAhPSBOVUxMCi0JCSAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBleHRiYXNlICsgc2VnYmFzZSArIGFkZHIpCi0JCXsKLQkJICAvKiBUaGlzIGRhdGEgZ29lcyBhdCB0aGUgZW5kIG9mIHRoZSBzZWN0aW9uIHdlIGFyZQotICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJ1aWxkaW5nLiAgKi8KLQkJICBzZWMtPl9yYXdfc2l6ZSArPSBsZW47Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsZW4gPiAwKQotCQl7Ci0JCSAgY2hhciBzZWNidWZbMjBdOwotCQkgIGNoYXIgKnNlY25hbWU7Ci0KLQkJICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7Ci0JCSAgc2VjbmFtZSA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChzZWNidWYpICsgMSk7Ci0JCSAgaWYgKHNlY25hbWUgPT0gTlVMTCkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKLQkJICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBzZWNuYW1lKTsKLQkJICBpZiAoc2VjID09IE5VTEwpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICBzZWMtPmZsYWdzID0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19MT0FEIHwgU0VDX0FMTE9DOwotCQkgIHNlYy0+dm1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOwotCQkgIHNlYy0+bG1hID0gZXh0YmFzZSArIHNlZ2Jhc2UgKyBhZGRyOwotCQkgIHNlYy0+X3Jhd19zaXplID0gbGVuOwotCQkgIHNlYy0+ZmlsZXBvcyA9IHBvczsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMToKLQkgICAgICAvKiBBbiBlbmQgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+c3RhcnRfYWRkcmVzcyA9PSAwKQotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcjsKLQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0KLQkgICAgY2FzZSAyOgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkLiAgKi8KLQkgICAgICBpZiAobGVuICE9IDIpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczolZDogYmFkIGV4dGVuZGVkIGFkZHJlc3MgcmVjb3JkIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBzZWdiYXNlID0gSEVYNCAoYnVmKSA8PCA0OwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMzoKLQkgICAgICAvKiBBbiBleHRlbmRlZCBzdGFydCBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSA0KQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBzdGFydCBhZGRyZXNzIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBsaW5lbm8pOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICBhYmZkLT5zdGFydF9hZGRyZXNzICs9IChIRVg0IChidWYpIDw8IDQpICsgSEVYNCAoYnVmICsgNCk7Ci0KLQkgICAgICBzZWMgPSBOVUxMOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSA0OgotCSAgICAgIC8qIEFuIGV4dGVuZGVkIGxpbmVhciBhZGRyZXNzIHJlY29yZC4gICovCi0JICAgICAgaWYgKGxlbiAhPSAyKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiJXM6JWQ6IGJhZCBleHRlbmRlZCBsaW5lYXIgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGV4dGJhc2UgPSBIRVg0IChidWYpIDw8IDE2OwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgNToKLQkgICAgICAvKiBBbiBleHRlbmRlZCBsaW5lYXIgc3RhcnQgYWRkcmVzcyByZWNvcmQuICAqLwotCSAgICAgIGlmIChsZW4gIT0gMiAmJiBsZW4gIT0gNCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGxpbmVubyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIGlmIChsZW4gPT0gMikKLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyArPSBIRVg0IChidWYpIDw8IDE2OwotCSAgICAgIGVsc2UKLQkJYWJmZC0+c3RhcnRfYWRkcmVzcyA9IChIRVg0IChidWYpIDw8IDE2KSArIEhFWDQgKGJ1ZiArIDQpOwotCi0JICAgICAgc2VjID0gTlVMTDsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCShfKCIlczolZDogdW5yZWNvZ25pemVkIGloZXggdHlwZSAldSBpbiBJbnRlbCBIZXggZmlsZVxuIiksCi0JCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCB0eXBlKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVycm9yKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBUcnkgdG8gcmVjb2duaXplIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotaWhleF9vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBiWzldOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgaWhleF9pbml0ICgpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgaWYgKGJmZF9yZWFkIChiLCAxLCA5LCBhYmZkKSAhPSA5KQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYlswXSAhPSAnOicpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IDk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBJU0hFWCAoYltpXSkpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHR5cGUgPSBIRVgyIChiICsgNyk7Ci0gIGlmICh0eXBlID4gNSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgaXQgbG9va3MgbGlrZSBpdCByZWFsbHkgaXMgYW4gSW50ZWwgSGV4IGZpbGUuICAqLwotCi0gIGlmICghIGloZXhfbWtvYmplY3QgKGFiZmQpCi0gICAgICB8fCAhIGloZXhfc2NhbiAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgY29udGVudHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLXsKLSAgaW50IGM7Ci0gIGJmZF9ieXRlICpwOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemU7Ci0gIGJvb2xlYW4gZXJyb3I7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzZWN0aW9uLT5maWxlcG9zLCBTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBwID0gY29udGVudHM7Ci0gIGJ1ZnNpemUgPSAwOwotICBlcnJvciA9IGZhbHNlOwotICB3aGlsZSAoKGMgPSBpaGV4X2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YpCi0gICAgewotICAgICAgY2hhciBoZHJbOF07Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgYmZkX3ZtYSBhZGRyOwotICAgICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGloZXhfc2NhbiBoYXMgc3VjY2VlZGVkLCBzbyB3ZSBvdWdodCB0bwotICAgICAgICAga25vdyB0aGUgZXhhY3QgZm9ybWF0LiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKGMgPT0gJzonKTsKLQotICAgICAgaWYgKGJmZF9yZWFkIChoZHIsIDEsIDgsIGFiZmQpICE9IDgpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGxlbiA9IEhFWDIgKGhkcik7Ci0gICAgICBhZGRyID0gSEVYNCAoaGRyICsgMik7Ci0gICAgICB0eXBlID0gSEVYMiAoaGRyICsgNik7Ci0KLSAgICAgIC8qIFdlIHNob3VsZCBvbmx5IHNlZSB0eXBlIDAgcmVjb3JkcyBoZXJlLiAgKi8KLSAgICAgIGlmICh0eXBlICE9IDApCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogaW50ZXJuYWwgZXJyb3IgaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICBpZiAobGVuICogMiA+IGJ1ZnNpemUpCi0JewotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9yZWFsbG9jIChidWYsIGxlbiAqIDIpOwotCSAgaWYgKGJ1ZiA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGJ1ZnNpemUgPSBsZW4gKiAyOwotCX0KLQotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIGxlbiAqIDIsIGFiZmQpICE9IGxlbiAqIDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkqcCsrID0gSEVYMiAoYnVmICsgMiAqIGkpOwotICAgICAgaWYgKChiZmRfc2l6ZV90eXBlKSAocCAtIGNvbnRlbnRzKSA+PSBzZWN0aW9uLT5fcmF3X3NpemUpCi0JewotCSAgLyogV2UndmUgcmVhZCBldmVyeXRoaW5nIGluIHRoZSBzZWN0aW9uLiAgKi8KLQkgIGlmIChidWYgIT0gTlVMTCkKLQkgICAgZnJlZSAoYnVmKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogU2tpcCB0aGUgY2hlY2tzdW0uICAqLwotICAgICAgaWYgKGJmZF9yZWFkIChidWYsIDEsIDIsIGFiZmQpICE9IDIpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmICgoYmZkX3NpemVfdHlwZSkgKHAgLSBjb250ZW50cykgPCBzZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiBiYWQgc2VjdGlvbiBsZW5ndGggaW4gaWhleF9yZWFkX3NlY3Rpb24iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIEdldCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uIGluIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwpCi0gICAgewotICAgICAgc2VjdGlvbi0+dXNlZF9ieV9iZmQgPSBiZmRfYWxsb2MgKGFiZmQsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjdGlvbi0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBpaGV4X3JlYWRfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgc2VjdGlvbi0+dXNlZF9ieV9iZmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgbWVtY3B5IChsb2NhdGlvbiwgKGJmZF9ieXRlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkICsgb2Zmc2V0LAotCSAgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBJbnRlbCBIZXggZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1paGV4X3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHN0cnVjdCBpaGV4X2RhdGFfbGlzdCAqbjsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIHN0cnVjdCBpaGV4X2RhdGFfc3RydWN0ICp0ZGF0YTsKLQotICBpZiAoY291bnQgPT0gMAotICAgICAgfHwgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwCi0gICAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBuID0gKChzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKikKLSAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGloZXhfZGF0YV9saXN0KSkpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQpOwotICBpZiAoZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtY3B5IChkYXRhLCBsb2NhdGlvbiwgKHNpemVfdCkgY291bnQpOwotCi0gIG4tPmRhdGEgPSBkYXRhOwotICBuLT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKLSAgbi0+c2l6ZSA9IGNvdW50OwotCi0gIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKLSAgICAgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuICAqLwotICB0ZGF0YSA9IGFiZmQtPnRkYXRhLmloZXhfZGF0YTsKLSAgaWYgKHRkYXRhLT50YWlsICE9IE5VTEwKLSAgICAgICYmIG4tPndoZXJlID49IHRkYXRhLT50YWlsLT53aGVyZSkKLSAgICB7Ci0gICAgICB0ZGF0YS0+dGFpbC0+bmV4dCA9IG47Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIHRkYXRhLT50YWlsID0gbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKipwcDsKLQotICAgICAgZm9yIChwcCA9ICZ0ZGF0YS0+aGVhZDsKLQkgICAqcHAgIT0gTlVMTCAmJiAoKnBwKS0+d2hlcmUgPCBuLT53aGVyZTsKLQkgICBwcCA9ICYoKnBwKS0+bmV4dCkKLQk7Ci0gICAgICBuLT5uZXh0ID0gKnBwOwotICAgICAgKnBwID0gbjsKLSAgICAgIGlmIChuLT5uZXh0ID09IE5VTEwpCi0JdGRhdGEtPnRhaWwgPSBuOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgYSByZWNvcmQgb3V0IHRvIGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBjb3VudCwgYWRkciwgdHlwZSwgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLXsKLSAgc3RhdGljIGNvbnN0IGNoYXIgZGlnc1tdID0gIjAxMjM0NTY3ODlBQkNERUYiOwotICBjaGFyIGJ1Zls5ICsgQ0hVTksgKiAyICsgNF07Ci0gIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBjaGtzdW07Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jZGVmaW5lIFRPSEVYKGJ1ZiwgdikgXAotICAoKGJ1ZilbMF0gPSBkaWdzWygodikgPj4gNCkgJiAweGZdLCAoYnVmKVsxXSA9IGRpZ3NbKHYpICYgMHhmXSkKLQotICBidWZbMF0gPSAnOic7Ci0gIFRPSEVYIChidWYgKyAxLCBjb3VudCk7Ci0gIFRPSEVYIChidWYgKyAzLCAoYWRkciA+PiA4KSAmIDB4ZmYpOwotICBUT0hFWCAoYnVmICsgNSwgYWRkciAmIDB4ZmYpOwotICBUT0hFWCAoYnVmICsgNywgdHlwZSk7Ci0KLSAgY2hrc3VtID0gY291bnQgKyBhZGRyICsgKGFkZHIgPj4gOCkgKyB0eXBlOwotCi0gIGZvciAoaSA9IDAsIHAgPSBidWYgKyA5OyBpIDwgY291bnQ7IGkrKywgcCArPSAyLCBkYXRhKyspCi0gICAgewotICAgICAgVE9IRVggKHAsICpkYXRhKTsKLSAgICAgIGNoa3N1bSArPSAqZGF0YTsKLSAgICB9Ci0KLSAgVE9IRVggKHAsICgtIGNoa3N1bSkgJiAweGZmKTsKLSAgcFsyXSA9ICdccic7Ci0gIHBbM10gPSAnXG4nOwotCi0gIGlmIChiZmRfd3JpdGUgKGJ1ZiwgMSwgOSArIGNvdW50ICogMiArIDQsIGFiZmQpICE9IDkgKyBjb3VudCAqIDIgKyA0KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEludGVsIEhleCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWloZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF92bWEgc2VnYmFzZTsKLSAgYmZkX3ZtYSBleHRiYXNlOwotICBzdHJ1Y3QgaWhleF9kYXRhX2xpc3QgKmw7Ci0KLSAgc2VnYmFzZSA9IDA7Ci0gIGV4dGJhc2UgPSAwOwotICBmb3IgKGwgPSBhYmZkLT50ZGF0YS5paGV4X2RhdGEtPmhlYWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYmZkX3ZtYSB3aGVyZTsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLQotICAgICAgd2hlcmUgPSBsLT53aGVyZTsKLSAgICAgIHAgPSBsLT5kYXRhOwotICAgICAgY291bnQgPSBsLT5zaXplOwotICAgICAgd2hpbGUgKGNvdW50ID4gMCkKLQl7Ci0JICBiZmRfc2l6ZV90eXBlIG5vdzsKLQotCSAgbm93ID0gY291bnQ7Ci0JICBpZiAobm93ID4gQ0hVTkspCi0JICAgIG5vdyA9IENIVU5LOwotCi0JICBpZiAod2hlcmUgPiBzZWdiYXNlICsgZXh0YmFzZSArIDB4ZmZmZikKLQkgICAgewotCSAgICAgIGJmZF9ieXRlIGFkZHJbMl07Ci0KLQkgICAgICAvKiBXZSBuZWVkIGEgbmV3IGJhc2UgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKHdoZXJlIDw9IDB4ZmZmZmYpCi0JCXsKLQkJICAvKiBUaGUgYWRkcmVzc2VzIHNob3VsZCBiZSBzb3J0ZWQuICAqLwotCQkgIEJGRF9BU1NFUlQgKGV4dGJhc2UgPT0gMCk7Ci0KLQkJICBzZWdiYXNlID0gd2hlcmUgJiAweGYwMDAwOwotCQkgIGFkZHJbMF0gPSAoYmZkX2J5dGUpKHNlZ2Jhc2UgPj4gMTIpICYgMHhmZjsKLQkJICBhZGRyWzFdID0gKGJmZF9ieXRlKShzZWdiYXNlID4+IDQpICYgMHhmZjsKLQkJICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBUaGUgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgYW5kIHRoZSBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGFyZSBjb21iaW5lZCwgYXQgbGVhc3QgYnkKLSAgICAgICAgICAgICAgICAgICAgIHNvbWUgcmVhZGVycy4gIFdlIG5lZWQgYW4gZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgIHJlY29yZCBoZXJlLCBzbyBpZiB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IGFuCi0gICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCBhZGRyZXNzIHJlY29yZCwgemVybyBpdCBvdXQgdG8gYXZvaWQKLSAgICAgICAgICAgICAgICAgICAgIGNvbmZ1c2lvbi4gICovCi0JCSAgaWYgKHNlZ2Jhc2UgIT0gMCkKLQkJICAgIHsKLQkJICAgICAgYWRkclswXSA9IDA7Ci0JCSAgICAgIGFkZHJbMV0gPSAwOwotCQkgICAgICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMiwgMCwgMiwgYWRkcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICAgIHNlZ2Jhc2UgPSAwOwotCQkgICAgfQotCi0JCSAgZXh0YmFzZSA9IHdoZXJlICYgMHhmZmZmMDAwMDsKLQkJICBpZiAod2hlcmUgPiBleHRiYXNlICsgMHhmZmZmKQotCQkgICAgewotCQkgICAgICBjaGFyIGJ1ZlsyMF07Ci0KLQkJICAgICAgc3ByaW50Zl92bWEgKGJ1Ziwgd2hlcmUpOwotCQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCShfKCIlczogYWRkcmVzcyAweCVzIG91dCBvZiByYW5nZSBmb3IgSW50ZXggSGV4IGZpbGUiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgYnVmKTsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBhZGRyWzBdID0gKGJmZF9ieXRlKShleHRiYXNlID4+IDI0KSAmIDB4ZmY7Ci0JCSAgYWRkclsxXSA9IChiZmRfYnl0ZSkoZXh0YmFzZSA+PiAxNikgJiAweGZmOwotCQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCAyLCAwLCA0LCBhZGRyKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCBub3csIHdoZXJlIC0gKGV4dGJhc2UgKyBzZWdiYXNlKSwKLQkJCQkgICAwLCBwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICB3aGVyZSArPSBub3c7Ci0JICBwICs9IG5vdzsKLQkgIGNvdW50IC09IG5vdzsKLQl9Ci0gICAgfQotCi0gIGlmIChhYmZkLT5zdGFydF9hZGRyZXNzICE9IDApCi0gICAgewotICAgICAgYmZkX3ZtYSBzdGFydDsKLSAgICAgIGJmZF9ieXRlIHN0YXJ0YnVmWzRdOwotCi0gICAgICBzdGFydCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3M7Ci0KLSAgICAgIGlmIChzdGFydCA8PSAweGZmZmZmKQotCXsKLQkgIHN0YXJ0YnVmWzBdID0gKGJmZF9ieXRlKSgoc3RhcnQgJiAweGYwMDAwKSA+PiAxMikgJiAweGZmOwotCSAgc3RhcnRidWZbMV0gPSAwOwotCSAgc3RhcnRidWZbMl0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDgpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzNdID0gKGJmZF9ieXRlKXN0YXJ0ICYgMHhmZjsKLQkgIGlmICghIGloZXhfd3JpdGVfcmVjb3JkIChhYmZkLCA0LCAwLCAzLCBzdGFydGJ1ZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3RhcnRidWZbMF0gPSAoYmZkX2J5dGUpKHN0YXJ0ID4+IDI0KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlsxXSA9IChiZmRfYnl0ZSkoc3RhcnQgPj4gMTYpICYgMHhmZjsKLQkgIHN0YXJ0YnVmWzJdID0gKGJmZF9ieXRlKShzdGFydCA+PiA4KSAmIDB4ZmY7Ci0JICBzdGFydGJ1ZlszXSA9IChiZmRfYnl0ZSlzdGFydCAmIDB4ZmY7Ci0JICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgNCwgMCwgNSwgc3RhcnRidWYpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoISBpaGV4X3dyaXRlX3JlY29yZCAoYWJmZCwgMCwgMCwgMSwgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGFuIGVtcHR5IHN5bWJvbC4gIFRoaXMgaXMgcmVxdWlyZWQgb25seSBiZWNhdXNlCi0gICBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSB3YW50cyB0byBjcmVhdGUgYSBzeW1ib2wgZm9yIHRoZSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotaWhleF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc3ltYm9sICpuZXc7Ci0KLSAgbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcgIT0gTlVMTCkKLSAgICBuZXctPnRoZV9iZmQgPSBhYmZkOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBmb3IgdGhlIG91dHB1dCBmaWxlLiAgVGhlIGFyY2hpdGVjdHVyZSBpcwotICAgaXJyZWxldmFudCwgc28gd2UgaWdub3JlIGVycm9ycyBhYm91dCB1bmtub3duIGFyY2hpdGVjdHVyZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWhleF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2g7Ci17Ci0gIGlmICghIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpKQotICAgIHsKLSAgICAgIGlmIChhcmNoICE9IGJmZF9hcmNoX3Vua25vd24pCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycywgZm9yIHRoZSBsaW5rZXIuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWloZXhfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotLyogU29tZSByYW5kb20gZGVmaW5pdGlvbnMgZm9yIHRoZSB0YXJnZXQgdmVjdG9yLiAgKi8KLQotI2RlZmluZQlpaGV4X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBpaGV4X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBpaGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLSNkZWZpbmUgaWhleF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgaWhleF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGJmZF8wbAotI2RlZmluZSBpaGV4X2dldF9zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgaWhleF9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGloZXhfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBpaGV4X2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGloZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIGloZXhfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgaWhleF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGloZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIGloZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBpaGV4X2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgYmZkXzBsKQotI2RlZmluZSBpaGV4X2JmZF9yZWxvY190eXBlX2xvb2t1cCBfYmZkX25vcmVsb2NzX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0jZGVmaW5lIGloZXhfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBpaGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgaWhleF9iZmRfZ2Nfc2VjdGlvbnMgYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLSNkZWZpbmUgaWhleF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBpaGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIGloZXhfYmZkX2ZpbmFsX2xpbmsgX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsKLSNkZWZpbmUgaWhleF9iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLyogVGhlIEludGVsIEhleCB0YXJnZXQgdmVjdG9yLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCBpaGV4X3ZlYyA9Ci17Ci0gICJpaGV4IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfaWhleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIDAsCQkJCS8qIG9iamVjdCBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIGloZXhfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgaWhleF93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChpaGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoaWhleCksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKGloZXgpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9pbml0LmMgYi9iZmQvaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmExZDUwLi4wMDAwMDAwCi0tLSBhL2JmZC9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBiZmQgaW5pdGlhbGl6YXRpb24gc3R1ZmYKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotLyoKLVNFQ1RJT04KLQlJbml0aWFsaXphdGlvbgotCi0JVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdGhhdCBoYW5kbGUgaW5pdGlhbGl6aW5nIGEgQkZELgotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2luaXQKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9pbml0KHZvaWQpOwotCi1ERVNDUklQVElPTgotCVRoaXMgcm91dGluZSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIEJGRCBmdW5jdGlvbiB0bwotCWluaXRpYWxpemUgbWFnaWNhbCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCi0qLwotCi0vKiBBY3R1YWxseSwgdGhlcmUgaXMgY3VycmVudGx5IG5vdGhpbmcgZm9yIHRoaXMgZnVuY3Rpb24gdG8gZG8uCi0gICBIb3dldmVyLCBzb21lZGF5IGl0IG1heSBiZSBuZWVkZWQsIHNvIGtlZXAgaXQgYXJvdW5kLiAgKi8KLQotdm9pZAotYmZkX2luaXQgKCkKLXsKLX0KZGlmZiAtLWdpdCBhL2JmZC9pcml4LWNvcmUuYyBiL2JmZC9pcml4LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0Y2EyMC4uMDAwMDAwMAotLS0gYS9iZmQvaXJpeC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJcml4IGNvcmUgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3R1IEdyb3NzbWFuLCBDeWdudXMgU3VwcG9ydC4KLSAgIENvbnZlcnRlZCB0byBiYWNrLWVuZCBmb3JtIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNhbiBvbmx5IGJlIGNvbXBpbGVkIG9uIHN5c3RlbXMgd2hpY2ggdXNlIElyaXggc3R5bGUgY29yZQotICAgZmlsZXMgKG5hbWVseSwgSXJpeCA0IGFuZCBJcml4IDUsIHNvIGZhcikuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZmRlZiBJUklYX0NPUkUKLQotI2luY2x1ZGUgPGNvcmUub3V0Lmg+Ci0KLXN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QgCi17Ci0gIGludCBzaWc7Ci0gIGNoYXIgY21kW0NPUkVfTkFNRVNJWkVdOwotfTsKLQotI2RlZmluZSBjb3JlX2hkcihiZmQpICgoYmZkKS0+dGRhdGEuc2dpX2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi1zdGF0aWMgYXNlY3Rpb24gKm1ha2VfYmZkX2FzZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKmlyaXhfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKmlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IGlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGlyaXhfY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIGFzeW1ib2wgKmlyaXhfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc3dhcF9hYm9ydCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gNDsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLWlyaXhfY29yZV9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgdmFsOwotICBpbnQgaTsKLSAgY2hhciAqc2VjbmFtZTsKLSAgc3RydWN0IGNvcmVvdXQgY29yZW91dDsKLSAgc3RydWN0IGlkZXNjICppZGcsICppZGYsICppZHM7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVvdXQsIDEsIHNpemVvZiBjb3Jlb3V0LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgY29yZW91dCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZm5kZWYgQ09SRV9NQUdJQ04zMgotI2RlZmluZSBDT1JFX01BR0lDTjMyIENPUkVfTUFHSUMKLSNlbmRpZgotICBpZiAoKGNvcmVvdXQuY19tYWdpYyAhPSBDT1JFX01BR0lDICYmIGNvcmVvdXQuY19tYWdpYyAhPSBDT1JFX01BR0lDTjMyKQotICAgICAgfHwgY29yZW91dC5jX3ZlcnNpb24gIT0gQ09SRV9WRVJTSU9OMSkKLSAgICByZXR1cm4gMDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IHNnaV9jb3JlX3N0cnVjdCAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzZ2lfY29yZV9zdHJ1Y3QpKTsKLSAgaWYgKCFjb3JlX2hkciAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgc3RybmNweSAoY29yZV9jb21tYW5kIChhYmZkKSwgY29yZW91dC5jX25hbWUsIENPUkVfTkFNRVNJWkUpOwotICBjb3JlX3NpZ25hbCAoYWJmZCkgPSBjb3Jlb3V0LmNfc2lnY2F1c2U7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBjb3Jlb3V0LmNfdm1hcG9mZnNldCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvcmVvdXQuY19udm1hcDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCB2bWFwIHZtYXA7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZ2bWFwLCAxLCBzaXplb2Ygdm1hcCwgYWJmZCk7Ci0gICAgICBpZiAodmFsICE9IHNpemVvZiB2bWFwKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKHZtYXAudl90eXBlKQotCXsKLQljYXNlIFZEQVRBOgotCSAgc2VjbmFtZSA9ICIuZGF0YSI7Ci0JICBicmVhazsKLQljYXNlIFZTVEFDSzoKLQkgIHNlY25hbWUgPSAiLnN0YWNrIjsKLQkgIGJyZWFrOwotI2lmZGVmIFZNQVBGSUxFCi0JY2FzZSBWTUFQRklMRToKLQkgIHNlY25hbWUgPSAiLm1hcGZpbGUiOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBIGZpbGUgb2Zmc2V0IG9mIHplcm8gbWVhbnMgdGhhdCB0aGUgc2VjdGlvbiBpcyBub3QgY29udGFpbmVkCi0JIGluIHRoZSBjb3JlZmlsZS4gICovCi0gICAgICBpZiAodm1hcC52X29mZnNldCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBzZWNuYW1lLAotCQkJICAgICAgU0VDX0FMTE9DK1NFQ19MT0FEK1NFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICB2bWFwLnZfbGVuLAotCQkJICAgICAgdm1hcC52X3ZhZGRyLAotCQkJICAgICAgdm1hcC52X29mZnNldCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZWdzIGFyZSBjb250aWd1b3VzIHdpdGhpbiB0aGUgY29yZSBmaWxlLiAqLwotCi0gIGlkZyA9ICZjb3Jlb3V0LmNfaWRlc2NbSV9HUFJFR1NdOwotICBpZGYgPSAmY29yZW91dC5jX2lkZXNjW0lfRlBSRUdTXTsKLSAgaWRzID0gJmNvcmVvdXQuY19pZGVzY1tJX1NQRUNSRUdTXTsKLQotICBpZiAoaWRnLT5pX29mZnNldCArIGlkZy0+aV9sZW4gIT0gaWRmLT5pX29mZnNldAotICAgICAgfHwgaWRmLT5pX29mZnNldCArIGlkZi0+aV9sZW4gIT0gaWRzLT5pX29mZnNldCkKLSAgICByZXR1cm4gMDsJCQkvKiBDYW4ndCBkZWFsIHdpdGggbm9uLWNvbnRpZyByZWdzICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBpZGctPmlfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWciLAotCQkgICAgIFNFQ19IQVNfQ09OVEVOVFMsCi0JCSAgICAgaWRnLT5pX2xlbiArIGlkZi0+aV9sZW4gKyBpZHMtPmlfbGVuLAotCQkgICAgIDAsCi0JCSAgICAgaWRnLT5pX29mZnNldCk7Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWlyaXhfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOwotfQotCi1zdGF0aWMgaW50Ci1pcml4X2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1pcml4X2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkJLyogWFhYIC0gRklYTUUgKi8KLX0KLQotc3RhdGljIGFzeW1ib2wgKgotaXJpeF9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLSNkZWZpbmUgaXJpeF9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBpcml4X2NvcmVfZ2V0X3N5bXRhYiBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiCi0jZGVmaW5lIGlyaXhfY29yZV9wcmludF9zeW1ib2wgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIGlyaXhfY29yZV9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGlyaXhfY29yZV9nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgaXJpeF9jb3JlX2ZpbmRfbmVhcmVzdF9saW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lCi0jZGVmaW5lIGlyaXhfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIGlyaXhfY29yZV9yZWFkX21pbmlzeW1ib2xzIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgaXJpeF9jb3JlX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLS8qIElmIHNvbWVib2R5IGNhbGxzIGFueSBieXRlLXN3YXBwaW5nIHJvdXRpbmVzLCBzaG9vdCB0aGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1zd2FwX2Fib3J0KCkKLXsKLSAgYWJvcnQoKTsgLyogVGhpcyB3YXkgZG9lc24ndCByZXF1aXJlIGFueSBkZWNsYXJhdGlvbiBmb3IgQU5TSSB0byBmdWNrIHVwICovCi19Ci0jZGVmaW5lCU5PX0dFVAkoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1BVVAkoKHZvaWQgICAgKCopIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lCU5PX1NJR05FRF9HRVQgXAotICAoKGJmZF9zaWduZWRfdm1hICgqKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotCi1jb25zdCBiZmRfdGFyZ2V0IGlyaXhfY29yZV92ZWMgPQotICB7Ci0gICAgImlyaXgtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLAkJCQkJCSAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsCQkJCQkJCSAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDY0IGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDMyIGJpdCBoZHJzICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsCS8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7CQkJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIG9iamVjdCBmaWxlICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogYXJjaGl2ZSAqLwotICAgICBpcml4X2NvcmVfY29yZV9maWxlX3AJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChpcml4X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChpcml4X2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07Ci0KLSNlbmRpZiAvKiBJUklYX0NPUkUgKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJhb3V0LmggYi9iZmQvbGliYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDAxZDNkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJhb3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgYS5vdXQgKGFuZCBzaW1pbGFyKSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTElCQU9VVF9ICi0jZGVmaW5lIExJQkFPVVRfSAotCi0vKiBXZSB0cnkgdG8gZW5jYXBzdWxhdGUgdGhlIGRpZmZlcmVuY2VzIGluIHRoZSB2YXJpb3VzIGEub3V0IGZpbGUKLSAgIHZhcmlhbnRzIGluIGEgZmV3IHJvdXRpbmVzLCBhbmQgb3RoZXJ3aXNlIHNoYXJlIGxhcmdlIG1hc3NlcyBvZiBjb2RlLgotICAgVGhpcyBtZWFucyB3ZSBvbmx5IGhhdmUgdG8gZml4IGJ1Z3MgaW4gb25lIHBsYWNlLCBtb3N0IG9mIHRoZSB0aW1lLiAgKi8KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyogUGFyYW1ldGVyaXplIHRoZSBhLm91dCBjb2RlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgYmVpbmcgYnVpbHQKLSAgIGZvciBhIDMyLWJpdCBhcmNoaXRlY3R1cmUgb3IgYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNpZiBBUkNIX1NJWkU9PTY0Ci0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF82NAotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF82NAotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfNjQKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF82NF8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfNjQpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgOAotI2Vsc2UgLyogQVJDSF9TSVpFID09IDMyICovCi0jZGVmaW5lIEdFVF9XT1JEIGJmZF9oX2dldF8zMgotI2RlZmluZSBHRVRfU1dPUkQgYmZkX2hfZ2V0X3NpZ25lZF8zMgotI2RlZmluZSBQVVRfV09SRCBiZmRfaF9wdXRfMzIKLSNpZm5kZWYgTkFNRQotI2RlZmluZSBOQU1FKHgseSkgQ0FUMyh4LF8zMl8seSkKLSNlbmRpZgotI2RlZmluZSBKTkFNRSh4KSBDQVQoeCxfMzIpCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2VuZGlmIC8qIEFSQ0hfU0laRT09MzIgKi8KLQotLyogRGVjbGFyZSBhdCBmaWxlIGxldmVsLCBzaW5jZSB1c2VkIGluIHBhcmFtZXRlciBsaXN0cywgd2hpY2ggaGF2ZQotICAgd2VpcmQgc2NvcGUuICAqLwotc3RydWN0IGV4dGVybmFsX2V4ZWM7Ci1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3Q7Ci1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsOwotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbDsKLQwKLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBXaGV0aGVyIHRoaXMgc3ltYm9sIGhhcyBiZWVuIHdyaXR0ZW4gb3V0LiAgKi8KLSAgYm9vbGVhbiB3cml0dGVuOwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBpbnQgaW5keDsKLX07Ci0KLS8qIGEub3V0IGJhY2tlbmQgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYW91dF9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYW4gYS5vdXQgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhb3V0X2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSwgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBhLm91dCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFvdXRfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGJmZF9saW5rX2hhc2hfdHJhdmVyc2UJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgYS5vdXQgbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGFvdXRfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIEJhY2stZW5kIGluZm9ybWF0aW9uIGZvciB2YXJpb3VzIGEub3V0IHRhcmdldHMuICAqLwotc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhCi17Ci0gIC8qIEFyZSBaTUFHSUMgZmlsZXMgbWFwcGVkIGNvbnRpZ3VvdXNseT8gIElmIHNvLCB0aGUgdGV4dCBzZWN0aW9uIG1heQotICAgICBuZWVkIG1vcmUgcGFkZGluZywgaWYgdGhlIHNlZ21lbnQgc2l6ZSAoZ3JhbnVsYXJpdHkgZm9yIG1lbW9yeSBhY2Nlc3MKLSAgICAgY29udHJvbCkgaXMgbGFyZ2VyIHRoYW4gdGhlIHBhZ2Ugc2l6ZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgem1hZ2ljX21hcHBlZF9jb250aWd1b3VzOwotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBaTUFHSUMvTk1BR0lDIGZpbGUgaGVhZGVycyBnZXQgbWFwcGVkIGluIHdpdGggdGhlCi0gICAgIHRleHQgc2VjdGlvbiwgd2hpY2ggc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaWxlIGhlYWRlci4KLSAgICAgSWYgbm90LCB0aGUgdGV4dCBzZWN0aW9uIHN0YXJ0cyBvbiB0aGUgbmV4dCBwYWdlLiAgKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X2luY2x1ZGVzX2hlYWRlcjsKLQotICAvKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIGlmIHRoZSBlbnRyeSBhZGRyZXNzIGlzIG5vdCBpbiB0aGUKLSAgICAgZmlyc3QgU0VHTUVOVF9TSVpFIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlY3Rpb24sIGl0IGlzIHRha2VuIHRvIGJlCi0gICAgIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBzZWN0aW9uLiAgVGhpcyBjYW4gYmUgdXNlZnVsCi0gICAgIGZvciBrZXJuZWxzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBlbnRyeV9pc190ZXh0X2FkZHJlc3M7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHBhc3MgdG8gTl9TRVRfRkxBR1MuICAqLwotICB1bnNpZ25lZCBjaGFyIGV4ZWNfaGRyX2ZsYWdzOwotCi0gIC8qIElmIHRoZSB0ZXh0IHNlY3Rpb24gVk1BIGlzbid0IHNwZWNpZmllZCwgYW5kIHdlIG5lZWQgYW4gYWJzb2x1dGUKLSAgICAgYWRkcmVzcywgdXNlIHRoaXMgYXMgdGhlIGRlZmF1bHQuICBJZiB3ZSdyZSBwcm9kdWNpbmcgYSByZWxvY2F0YWJsZQotICAgICBmaWxlLCB6ZXJvIGlzIGFsd2F5cyB1c2VkLiAgKi8KLSAgLyogPz8gUGVyaGFwcyBhIGNhbGxiYWNrIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZT8gIFdpbGwgdGhpcyBkbyBhbnl0aGluZwotICAgICByZWFzb25hYmxlIGZvciBhIGZvcm1hdCB0aGF0IGhhbmRsZXMgbXVsdGlwbGUgQ1BVcyB3aXRoIGRpZmZlcmVudAotICAgICBsb2FkIGFkZHJlc3NlcyBmb3IgZWFjaD8gICovCi0gIGJmZF92bWEgZGVmYXVsdF90ZXh0X3ZtYTsKLQotICAvKiBDYWxsYmFjayBmb3Igc2V0dGluZyB0aGUgcGFnZSBhbmQgc2VnbWVudCBzaXplcywgaWYgdGhleSBjYW4ndCBiZQotICAgICB0cml2aWFsbHkgZGV0ZXJtaW5lZCBmcm9tIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICBib29sZWFuICgqc2V0X3NpemVzKSBQQVJBTVMgKChiZmQgKikpOwotCi0gIC8qIHptYWdpYyBmaWxlcyBvbmx5LiBGb3IgZ28zMiwgdGhlIGxlbmd0aCBvZiB0aGUgZXhlYyBoZWFkZXIgY29udHJpYnV0ZXMKLSAgICAgdG8gdGhlIHNpemUgb2YgdGhlIHRleHQgc2VjdGlvbiBpbiB0aGUgZmlsZSBmb3IgYWxpZ25tZW50IHB1cnBvc2VzIGJ1dAotICAgICBkb2VzICpub3QqIGdldCBjb3VudGVkIGluIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KLSAgdW5zaWduZWQgY2hhciBleGVjX2hlYWRlcl9ub3RfY291bnRlZDsKLQotICAvKiBDYWxsYmFjayBmcm9tIHRoZSBhZGQgc3ltYm9scyBwaGFzZSBvZiB0aGUgbGlua2VyIGNvZGUgdG8gaGFuZGxlCi0gICAgIGEgZHluYW1pYyBvYmplY3QuICAqLwotICBib29sZWFuICgqYWRkX2R5bmFtaWNfc3ltYm9scykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAotCQkJCQkgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOwotCi0gIC8qIENhbGxiYWNrIGZyb20gdGhlIGFkZCBzeW1ib2xzIHBoYXNlIG9mIHRoZSBsaW5rZXIgY29kZSB0byBoYW5kbGUKLSAgICAgYWRkaW5nIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JCQkJICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sCi0JCQkJICAgICBib29sZWFuLAotCQkJCSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLQotICAvKiBDYWxsZWQgdG8gaGFuZGxlIGxpbmtpbmcgYSBkeW5hbWljIG9iamVjdC4gICovCi0gIGJvb2xlYW4gKCpsaW5rX2R5bmFtaWNfb2JqZWN0KSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotCi0gIC8qIENhbGxlZCBmb3IgZWFjaCBnbG9iYWwgc3ltYm9sIGJlaW5nIHdyaXR0ZW4gb3V0IGJ5IHRoZSBsaW5rZXIuCi0gICAgIFRoaXMgc2hvdWxkIHdyaXRlIG91dCB0aGUgZHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotICBib29sZWFuICgqd3JpdGVfZHluYW1pY19zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKikpOwotCi0gIC8qIElmIHRoaXMgY2FsbGJhY2sgaXMgbm90IE5VTEwsIHRoZSBsaW5rZXIgY2FsbHMgaXQgZm9yIGVhY2ggcmVsb2MuCi0gICAgIFJFTE9DIGlzIGEgcG9pbnRlciB0byB0aGUgdW5zd2FwcGVkIHJlbG9jLiAgSWYgKlNLSVAgaXMgc2V0IHRvCi0gICAgIHRydWUsIHRoZSByZWxvYyB3aWxsIGJlIHNraXBwZWQuICAqUkVMT0NBVElPTiBtYXkgYmUgY2hhbmdlZCB0bwotICAgICBjaGFuZ2UgdGhlIGVmZmVjdHMgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICBib29sZWFuICgqY2hlY2tfZHluYW1pY19yZWxvYykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8sCi0JCQkJCSAgYmZkICppbnB1dF9iZmQsCi0JCQkJCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0JCQkJCSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoLAotCQkJCQkgIFBUUiByZWxvYywgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCQkgIGJvb2xlYW4gKnNraXAsCi0JCQkJCSAgYmZkX3ZtYSAqcmVsb2NhdGlvbikpOwotCi0gIC8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgbGluayB0byBmaW5pc2ggdXAgYW55IGR5bmFtaWMgbGlua2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpmaW5pc2hfZHluYW1pY19saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotfTsKLSNkZWZpbmUgYW91dF9iYWNrZW5kX2luZm8oYWJmZCkgXAotCSgoQ09OU1Qgc3RydWN0IGFvdXRfYmFja2VuZF9kYXRhICopKChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKSkKLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IGluIG1lbW9yeSBvZiBhICJzdHJ1Y3QgZXhlYyIgd2hpbGUgd2UgcHJvY2VzcyBpdC4KLSAgIEFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0JYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLiAgKi8KLQotc3RydWN0IGludGVybmFsX2V4ZWMKLXsKLSAgICBsb25nIGFfaW5mbzsJCS8qIE1hZ2ljIG51bWJlciBhbmQgZmxhZ3MsIHBhY2tlZCAqLwotICAgIGJmZF92bWEgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICAqLwotICAgIGJmZF92bWEgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgaW4gbWVtICovCi0gICAgYmZkX3ZtYSBhX3N5bXM7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSAqLwotICAgIGJmZF92bWEgYV9lbnRyeTsJCS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgICBiZmRfdm1hIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHRleHQncyByZWxvY2F0aW9uIGluZm8sIGluIGJ5dGVzICovCi0gICAgYmZkX3ZtYSBhX2Ryc2l6ZTsJCS8qIGxlbmd0aCBvZiBkYXRhJ3MgcmVsb2NhdGlvbiBpbmZvLCBpbiBieXRlcyAqLwotICAgIC8qIEFkZGVkIGZvciBpOTYwICovCi0gICAgYmZkX3ZtYSBhX3Rsb2FkOwkJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotICAgIGJmZF92bWEgYV9kbG9hZDsJCS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfdGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgdGV4dCBzZWdtZW50ICovCi0gICAgdW5zaWduZWQgY2hhciBhX2RhbGlnbjsJLyogQWxpZ25tZW50IG9mIGRhdGEgc2VnbWVudCAqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudCAqLwotICAgIGNoYXIgYV9yZWxheGFibGU7ICAgICAgICAgICAvKiBFbm91Z2ggaW5mbyBmb3IgbGlua2VyIHJlbGF4ICovCi19OwotCi0vKiBNYWdpYyBudW1iZXIgaXMgd3JpdHRlbiAKLTwgTVNCICAgICAgICAgID4KLTMxMzAyOTI4MjcyNjI1MjQyMzIyMjEyMDE5MTgxNzE2MTUxNDEzMTIxMTEwMDkwODA3MDYwNTA0MDMwMjAxMDAKLTwgRkxBR1MgICAgICAgID48IE1BQ0hJTkUgVFlQRSA+PCAgTUFHSUMgTlVNQkVSICAgICAgICAgICAgICAgID4KLSovCi0vKiBNYWdpYyBudW1iZXIgZm9yIE5ldEJTRCBpcwotPE1TQiAgICAgICAgICAgPgotMzEzMDI5MjgyNzI2MjUyNDIzMjIyMTIwMTkxODE3MTYxNTE0MTMxMjExMTAwOTA4MDcwNjA1MDQwMzAyMDEwMAotPCBGTEFHUyAgICA+PCBNQUNISU5FIFRZUEUgICAgID48ICBNQUdJQyBOVU1CRVIgICAgICAgICAgICAgICAgPgotKi8KLQotZW51bSBtYWNoaW5lX3R5cGUgewotICBNX1VOS05PV04gPSAwLAotICBNXzY4MDEwID0gMSwKLSAgTV82ODAyMCA9IDIsCi0gIE1fU1BBUkMgPSAzLAotICAvKiBza2lwIGEgYnVuY2ggc28gd2UgZG9uJ3QgcnVuIGludG8gYW55IG9mIHN1bnMgbnVtYmVycyAqLwotICAvKiBtYWtlIHRoZXNlIHVwIGZvciB0aGUgbnMzMmsqLwotICBNX05TMzIwMzIgPSAoNjQpLAkJLyogbnMzMjAzMiBydW5uaW5nID8gKi8KLSAgTV9OUzMyNTMyID0gKDY0ICsgNSksCQkvKiBuczMyNTMyIHJ1bm5pbmcgbWFjaCAqLwotCi0gIE1fMzg2ID0gMTAwLAotICBNXzI5SyA9IDEwMSwgICAgICAgICAgLyogQU1EIDI5MDAwICovCi0gIE1fMzg2X0RZTklYID0gMTAyLAkvKiBTZXF1ZW50IHJ1bm5pbmcgZHluaXggKi8KLSAgTV9BUk0gPSAxMDMsCQkvKiBBZHZhbmNlZCBSaXNjIE1hY2hpbmVzIEFSTSAqLwotICBNX1NQQVJDTEVUID0gMTMxLAkvKiBTUEFSQ2xldCA9IE1fU1BBUkMgKyAxMjggKi8KLSAgTV8zODZfTkVUQlNEID0gMTM0LAkvKiBOZXRCU0QvaTM4NiBiaW5hcnkgKi8KLSAgTV82OEtfTkVUQlNEID0gMTM1LAkvKiBOZXRCU0QvbTY4ayBiaW5hcnkgKi8KLSAgTV82OEs0S19ORVRCU0QgPSAxMzYsCS8qIE5ldEJTRC9tNjhrNGsgYmluYXJ5ICovCi0gIE1fNTMyX05FVEJTRCA9IDEzNywJLyogTmV0QlNEL25zMzJrIGJpbmFyeSAqLwotICBNX1NQQVJDX05FVEJTRCA9IDEzOCwJLyogTmV0QlNEL3NwYXJjIGJpbmFyeSAqLwotICBNX1BNQVhfTkVUQlNEID0gMTM5LAkvKiBOZXRCU0QvcG1heCAoTUlQUyBsaXR0bGUtZW5kaWFuKSBiaW5hcnkgKi8KLSAgTV9WQVhfTkVUQlNEID0gMTQwLAkvKiBOZXRCU0QvdmF4IGJpbmFyeSAqLwotICBNX0FMUEhBX05FVEJTRCA9IDE0MSwJLyogTmV0QlNEL2FscGhhIGJpbmFyeSAqLwotICBNX0FSTTZfTkVUQlNEID0gMTQzLAkvKiBOZXRCU0QvYXJtMzIgYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfMSA9IDE0NywJLyogMHg5MywgcmVzZXJ2ZWQgKi8KLSAgTV9NSVBTMSA9IDE1MSwgICAgICAgIC8qIE1JUFMgUjIwMDAvUjMwMDAgYmluYXJ5ICovCi0gIE1fTUlQUzIgPSAxNTIsICAgICAgICAvKiBNSVBTIFI0MDAwL1I2MDAwIGJpbmFyeSAqLwotICBNX1NQQVJDTEVUXzIgPSAxNjMsCS8qIDB4YTMsIHJlc2VydmVkICovCi0gIE1fU1BBUkNMRVRfMyA9IDE3OSwJLyogMHhiMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF80ID0gMTk1LAkvKiAweGMzLCByZXNlcnZlZCAqLwotICBNX0hQMjAwID0gMjAwLAkvKiBIUCAyMDAgKDY4MDEwKSBCU0QgYmluYXJ5ICovCi0gIE1fSFAzMDAgPSAoMzAwICUgMjU2KSwgLyogSFAgMzAwICg2ODAyMCs2ODg4MSkgQlNEIGJpbmFyeSAqLwotICBNX0hQVVggPSAoMHgyMGMgJSAyNTYpLCAvKiBIUCAyMDAvMzAwIEhQVVggYmluYXJ5ICovCi0gIE1fU1BBUkNMRVRfNSA9IDIxMSwJLyogMHhkMywgcmVzZXJ2ZWQgKi8KLSAgTV9TUEFSQ0xFVF82ID0gMjI3LAkvKiAweGUzLCByZXNlcnZlZCAqLwotICAvKiAgTV9TUEFSQ0xFVF83ID0gMjQzCS8gKiAweGYzLCByZXNlcnZlZCAqLwotICBNX1NQQVJDTElURV9MRSA9IDI0MwotfTsKLQotI2RlZmluZSBOX0RZTkFNSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweDgwMDAwMDAwKQotCi0jaWZuZGVmIE5fTUFHSUMKLSMgZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZW5kaWYKLQotI2lmbmRlZiBOX01BQ0hUWVBFCi0jIGRlZmluZSBOX01BQ0hUWVBFKGV4ZWMpICgoZW51bSBtYWNoaW5lX3R5cGUpKCgoZXhlYykuYV9pbmZvID4+IDE2KSAmIDB4ZmYpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9GTEFHUwotIyBkZWZpbmUgTl9GTEFHUyhleGVjKSAoKChleGVjKS5hX2luZm8gPj4gMjQpICYgMHhmZikKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0lORk8KLSMgZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0oKGV4ZWMpLmFfaW5mbyA9ICgobWFnaWMpICYgMHhmZmZmKSBcCi0gfCAoKChpbnQpKHR5cGUpICYgMHhmZikgPDwgMTYpIFwKLSB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX0RZTkFNSUMKLSMgZGVmaW5lIE5fU0VUX0RZTkFNSUMoZXhlYywgZHluYW1pYykgXAotKChleGVjKS5hX2luZm8gPSAoZHluYW1pYykgPyAoKGV4ZWMpLmFfaW5mbyB8IDB4ODAwMDAwMDApIDogXAotKChleGVjKS5hX2luZm8gJiAweDdmZmZmZmZmKSkKLSNlbmRpZgotCi0jaWZuZGVmIE5fU0VUX01BR0lDCi0jIGRlZmluZSBOX1NFVF9NQUdJQyhleGVjLCBtYWdpYykgXAotKChleGVjKS5hX2luZm8gPSAoKChleGVjKS5hX2luZm8gJiAweGZmZmYwMDAwKSB8ICgobWFnaWMpICYgMHhmZmZmKSkpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9NQUNIVFlQRQotIyBkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4ZmYwMGZmZmYpIHwgKCgoKGludCkobWFjaHR5cGUpKSYweGZmKSA8PCAxNikpCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NFVF9GTEFHUwotIyBkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLSgoZXhlYykuYV9pbmZvID0gXAotICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IGFvdXRfc3ltYm9sIHsKLSAgYXN5bWJvbCBzeW1ib2w7Ci0gIHNob3J0IGRlc2M7Ci0gIGNoYXIgb3RoZXI7Ci0gIHVuc2lnbmVkIGNoYXIgdHlwZTsKLX0gYW91dF9zeW1ib2xfdHlwZTsKLQotLyogVGhlIGB0ZGF0YScgc3RydWN0IGZvciBhbGwgYS5vdXQtbGlrZSBvYmplY3QgZmlsZSBmb3JtYXRzLgotICAgVmFyaW91cyB0aGluZ3MgZGVwZW5kIG9uIHRoaXMgc3RydWN0IGJlaW5nIGFyb3VuZCBhbnkgdGltZSBhbiBhLm91dAotICAgZmlsZSBpcyBiZWluZyBoYW5kbGVkLiAgQW4gZXhhbXBsZSBpcyBkYnhyZWFkLmMgaW4gR0RCLiAgKi8KLQotc3RydWN0IGFvdXRkYXRhIHsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmhkcjsJCS8qIGV4ZWMgZmlsZSBoZWFkZXIgKi8KLSAgYW91dF9zeW1ib2xfdHlwZSAqc3ltYm9sczsJCS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIAotICAvKiBGb3IgZWFzZSwgd2UgZG8gdGhpcyAqLwotICBhc2VjdGlvbiAqdGV4dHNlYzsKLSAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0gIGFzZWN0aW9uICpic3NzZWM7Ci0KLSAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgcGFydGljdWxhciBmb3JtYXQgb2YgdGhlIGV4ZWNfaGRyLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0gIGZpbGVfcHRyIHN0cl9maWxlcG9zOwotCi0gIC8qIFNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgcmVsb2NfZW50cnlfc2l6ZTsKLQotICAvKiBTaXplIG9mIGEgc3ltYm9sIHRhYmxlIGVudHJ5IGluIGV4dGVybmFsIGZvcm0gKi8KLSAgdW5zaWduZWQgc3ltYm9sX2VudHJ5X3NpemU7Ci0KLSAgLyogUGFnZSBzaXplIC0gbmVlZGVkIGZvciBhbGlnbm1lbnQgb2YgZGVtYW5kIHBhZ2VkIGZpbGVzLiAqLwotICB1bnNpZ25lZCBsb25nIHBhZ2Vfc2l6ZTsKLQotICAvKiBTZWdtZW50IHNpemUgLSBuZWVkZWQgZm9yIGFsaWdubWVudCBvZiBkZW1hbmQgcGFnZWQgZmlsZXMuICovCi0gIHVuc2lnbmVkIGxvbmcgc2VnbWVudF9zaXplOwotCi0gIC8qIFptYWdpYyBkaXNrIGJsb2NrIHNpemUgLSBuZWVkIHRvIGFsaWduIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgICBzZWN0aW9uIGluIFpNQUdJQyBiaW5hcmllcy4gIE5vcm1hbGx5IHRoZSBzYW1lIGFzIHBhZ2Vfc2l6ZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgem1hZ2ljX2Rpc2tfYmxvY2tfc2l6ZTsKLQotICB1bnNpZ25lZCBleGVjX2J5dGVzX3NpemU7Ci0gIHVuc2lnbmVkIHZtYV9hZGp1c3RlZCA6IDE7Ci0KLSAgLyogdXNlZCB3aGVuIGEgYmZkIHN1cHBvcnRzIHNldmVyYWwgaGlnaGx5IHNpbWlsYXIgZm9ybWF0cyAqLwotICBlbnVtCi0gICAgewotICAgICAgZGVmYXVsdF9mb3JtYXQgPSAwLAotICAgICAgLyogVXNlZCBvbiBIUCA5MDAwLzMwMCBydW5uaW5nIEhQL1VYLiAgU2VlIGhwMzAwaHB1eC5jLiAgKi8KLSAgICAgIGdudV9lbmNhcF9mb3JtYXQsCi0gICAgICAvKiBVc2VkIG9uIExpbnV4LCAzODZCU0QsIGV0Yy4gIFNlZSBpbmNsdWRlL2FvdXQvYW91dDY0LmguICAqLwotICAgICAgcV9tYWdpY19mb3JtYXQKLSAgICB9IHN1YmZvcm1hdDsKLQotICBlbnVtCi0gICAgewotICAgICAgdW5kZWNpZGVkX21hZ2ljID0gMCwKLSAgICAgIHpfbWFnaWMsCi0gICAgICBvX21hZ2ljLAotICAgICAgbl9tYWdpYwotICAgIH0gbWFnaWM7Ci0KLSAgLyogQSBidWZmZXIgZm9yIGZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgY2hhciAqbGluZV9idWY7Ci0KLSAgLyogVGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqZXh0ZXJuYWxfc3ltczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fY291bnQ7Ci0gIGJmZF93aW5kb3cgc3ltX3dpbmRvdzsKLSAgY2hhciAqZXh0ZXJuYWxfc3RyaW5nczsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zdHJpbmdfc2l6ZTsKLSAgYmZkX3dpbmRvdyBzdHJpbmdfd2luZG93OwotICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIEEgcG9pbnRlciBmb3Igc2hhcmVkIGxpYnJhcnkgaW5mb3JtYXRpb24uICAqLwotICBQVFIgZHluYW1pY19pbmZvOwotCi0gIC8qIEEgbWFwcGluZyBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gb2Zmc2V0cyBpbnRvIHRoZSBnbG9iYWwgb2Zmc2V0Ci0gICAgIHRhYmxlLCB1c2VkIHdoZW4gbGlua2luZyBvbiBTdW5PUy4gIFRoaXMgaXMgaW5kZXhlZCBieSB0aGUgc3ltYm9sCi0gICAgIGluZGV4LiAgKi8KLSAgYmZkX3ZtYSAqbG9jYWxfZ290X29mZnNldHM7Ci19OwotCi1zdHJ1Y3QgIGFvdXRfZGF0YV9zdHJ1Y3QgewotICAgIHN0cnVjdCBhb3V0ZGF0YSBhOwotICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjIGU7Ci19OwotCi0jZGVmaW5lCWFkYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuYW91dF9kYXRhLT5hKQotI2RlZmluZQlleGVjX2hkcihiZmQpCQkoYWRhdGEoYmZkKS5oZHIpCi0jZGVmaW5lCW9ial9hb3V0X3N5bWJvbHMoYmZkKQkoYWRhdGEoYmZkKS5zeW1ib2xzKQotI2RlZmluZQlvYmpfdGV4dHNlYyhiZmQpCShhZGF0YShiZmQpLnRleHRzZWMpCi0jZGVmaW5lCW9ial9kYXRhc2VjKGJmZCkJKGFkYXRhKGJmZCkuZGF0YXNlYykKLSNkZWZpbmUJb2JqX2Jzc3NlYyhiZmQpCQkoYWRhdGEoYmZkKS5ic3NzZWMpCi0jZGVmaW5lCW9ial9zeW1fZmlsZXBvcyhiZmQpCShhZGF0YShiZmQpLnN5bV9maWxlcG9zKQotI2RlZmluZQlvYmpfc3RyX2ZpbGVwb3MoYmZkKQkoYWRhdGEoYmZkKS5zdHJfZmlsZXBvcykKLSNkZWZpbmUJb2JqX3JlbG9jX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5yZWxvY19lbnRyeV9zaXplKQotI2RlZmluZQlvYmpfc3ltYm9sX2VudHJ5X3NpemUoYmZkKSAoYWRhdGEoYmZkKS5zeW1ib2xfZW50cnlfc2l6ZSkKLSNkZWZpbmUgb2JqX2FvdXRfc3ViZm9ybWF0KGJmZCkJKGFkYXRhKGJmZCkuc3ViZm9ybWF0KQotI2RlZmluZSBvYmpfYW91dF9leHRlcm5hbF9zeW1zKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltcykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3ltX2NvdW50KGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3ltX2NvdW50KQotI2RlZmluZSBvYmpfYW91dF9zeW1fd2luZG93KGJmZCkgKGFkYXRhKGJmZCkuc3ltX3dpbmRvdykKLSNkZWZpbmUgb2JqX2FvdXRfZXh0ZXJuYWxfc3RyaW5ncyhiZmQpIChhZGF0YShiZmQpLmV4dGVybmFsX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ19zaXplKGJmZCkgKGFkYXRhKGJmZCkuZXh0ZXJuYWxfc3RyaW5nX3NpemUpCi0jZGVmaW5lIG9ial9hb3V0X3N0cmluZ193aW5kb3coYmZkKSAoYWRhdGEoYmZkKS5zdHJpbmdfd2luZG93KQotI2RlZmluZSBvYmpfYW91dF9zeW1faGFzaGVzKGJmZCkgKGFkYXRhKGJmZCkuc3ltX2hhc2hlcykKLSNkZWZpbmUgb2JqX2FvdXRfZHluYW1pY19pbmZvKGJmZCkgKGFkYXRhKGJmZCkuZHluYW1pY19pbmZvKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFzeW1ib2wgdG8gZW5zdXJlIHRoYXQgdGhlCi0gICBtYWNybyBpcyBvbmx5IGV2ZXIgYXBwbGllZCB0byBhbiBhc3ltYm9sICovCi0jZGVmaW5lIGFvdXRfc3ltYm9sKGFzeW1ib2wpICgoYW91dF9zeW1ib2xfdHlwZSAqKSgmKGFzeW1ib2wpLT50aGVfYmZkKSkKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZWFjaCBhLm91dCBzZWN0aW9uLiAgVGhpcyBpcyBjdXJyZW50bHkgb25seQotICAgdXNlZCBieSB0aGUgYS5vdXQgYmFja2VuZCBsaW5rZXIuICAqLwotCi1zdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0Ci17Ci0gIC8qIFRoZSB1bnN3YXBwZWQgcmVsb2NhdGlvbiBlbnRyaWVzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBQVFIgcmVsb2NzOwotfTsKLQotI2RlZmluZSBhb3V0X3NlY3Rpb25fZGF0YShzKSBcCi0gICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKSAocyktPnVzZWRfYnlfYmZkKQotCi0jZGVmaW5lIHNldF9hb3V0X3NlY3Rpb25fZGF0YShzLHYpIFwKLSAgKChzKS0+dXNlZF9ieV9iZmQgPSAoUFRSKSYodiktPnJlbG9jcykKLQotLyogUHJvdG90eXBlIGRlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgaW4gYW91dHguaCAgKi8KLQotYm9vbGVhbgotTkFNRShhb3V0LHNxdWlydF9vdXRfcmVsb2NzKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSBQQVJBTVMgKChiZmQgKikpOwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLU5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwLAotCQkJCSAgICAgICBjb25zdCBiZmRfdGFyZ2V0ICooKmNhbGxiYWNrKShiZmQgKikpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LG1rb2JqZWN0KSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZW51bSBtYWNoaW5lX3R5cGUKLU5BTUUoYW91dCxtYWNoaW5lX3R5cGUpIFBBUkFNUyAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotCQkJCSB1bnNpZ25lZCBsb25nIG1hY2hpbmUsCi0JCQkJIGJvb2xlYW4gKnVua25vd24pKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2gsCi0JCSAJCSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxuZXdfc2VjdGlvbl9ob29rKSBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpuZXdzZWN0KSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIHNlY3Rpb24sCi0JCQkgUFRSIGxvY2F0aW9uLCBmaWxlX3B0ciBvZmZzZXQsIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLQotYXN5bWJvbCAqCi1OQU1FKGFvdXQsbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsdHJhbnNsYXRlX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICosIGFvdXRfc3ltYm9sX3R5cGUgKiwKLQkJCQkJICAgc3RydWN0IGV4dGVybmFsX25saXN0ICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUsIGNoYXIgKiwKLQkJCQkJICAgYmZkX3NpemVfdHlwZSwKLQkJCQkJICAgYm9vbGVhbiBkeW5hbWljKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxzbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsd3JpdGVfc3ltcykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3N5bWJvbF90YWJsZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLWxvbmcKLU5BTUUoYW91dCxnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9zeW10YWIpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmxvY2F0aW9uKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4dF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLXZvaWQKLU5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwKLQkJCQkgICAgICBhcmVsZW50ICosIGFzeW1ib2wgKiosIGJmZF9zaXplX3R5cGUpKTsKLQotcmVsb2NfaG93dG9fdHlwZSAqCi1OQU1FKGFvdXQscmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLQkJCQkgICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgc2VjX3B0ciBhc2VjdCwKLQkJCQkgICAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1sb25nCi1OQU1FKGFvdXQsY2Fub25pY2FsaXplX3JlbG9jKSBQQVJBTVMgKChiZmQgKmFiZmQsIHNlY19wdHIgc2VjdGlvbiwKLQkJCQkgICAgICAgYXJlbGVudCAqKnJlbHB0ciwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLQotbG9uZwotTkFNRShhb3V0LGdldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICphYmZkLCBzZWNfcHRyIGFzZWN0KSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxyZWNsYWltX3JlbG9jKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBzZWNfcHRyIGlnbm9yZSkpOwotCi1hbGVudCAqCi1OQU1FKGFvdXQsZ2V0X2xpbmVubykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwgYXN5bWJvbCAqaWdub3JlX3N5bWJvbCkpOwotCi12b2lkCi1OQU1FKGFvdXQscHJpbnRfc3ltYm9sKSBQQVJBTVMgKChiZmQgKmlnbm9yZV9hYmZkLCBQVFIgZmlsZSwKLQkJCSAgICBhc3ltYm9sICpzeW1ib2wsIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLQotdm9pZAotTkFNRShhb3V0LGdldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICppZ25vcmVfYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW1ib2wgKnN5bWJvbCwgc3ltYm9sX2luZm8gKnJldCkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsZmluZF9uZWFyZXN0X2xpbmUpIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0gICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwgdW5zaWduZWQgaW50ICpsaW5lX3B0cikpOwotCi1sb25nCi1OQU1FKGFvdXQscmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOwotCi1hc3ltYm9sICoKLU5BTUUoYW91dCxtaW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLQkJCQkJIGFzeW1ib2wgKikpOwotCi1pbnQKLU5BTUUoYW91dCxzaXplb2ZfaGVhZGVycykgUEFSQU1TICgoYmZkICphYmZkLCBib29sZWFuIGV4ZWMpKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIGJmZF9zaXplX3R5cGUgKnRleHRfc2l6ZSwgZmlsZV9wdHIgKnRleHRfZW5kKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX2luKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgICAgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcywgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwKSk7Ci0KLXZvaWQKLU5BTUUoYW91dCxzd2FwX2V4ZWNfaGVhZGVyX291dCkgUEFSQU1TICgoYmZkICphYmZkLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCwgc3RydWN0IGV4dGVybmFsX2V4ZWMgKnJhd19ieXRlcykpOwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotTkFNRShhb3V0LGxpbmtfaGFzaF9uZXdmdW5jKQotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2luaXQpCi0gICAgIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSAqLCBiZmQgKiwKLQkgICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKigqKSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosCi0JCQkJCSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCSAgY29uc3QgY2hhciAqKSkpOwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1OQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLQotYm9vbGVhbgotTkFNRShhb3V0LGxpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWJvb2xlYW4KLU5BTUUoYW91dCxmaW5hbF9saW5rKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgICAgICB2b2lkICgqKSAoYmZkICosIGZpbGVfcHRyICosIGZpbGVfcHRyICosCi0JCQkJCSBmaWxlX3B0ciAqKSkpOwotCi1ib29sZWFuCi1OQU1FKGFvdXQsYmZkX2ZyZWVfY2FjaGVkX2luZm8pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEEub3V0IHVzZXMgdGhlIGdlbmVyaWMgdmVyc2lvbnMgb2YgdGhlc2Ugcm91dGluZXMuLi4gKi8KLQotI2RlZmluZQlhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cwotCi0jZGVmaW5lCWFvdXRfNjRfZ2V0X3NlY3Rpb25fY29udGVudHMJX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0jaWZuZGVmIE5PX1dSSVRFX0hFQURFUl9LTFVER0UKLSNkZWZpbmUgTk9fV1JJVEVfSEVBREVSX0tMVURHRSAwCi0jZW5kaWYKLQotI2lmbmRlZiBhb3V0XzMyX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIGFvdXRfMzJfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2VuZGlmCi0KLSNpZm5kZWYgV1JJVEVfSEVBREVSUwotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgICAgXAotICAgICAgewkJCQkJCQkJCSAgICAgIFwKLQliZmRfc2l6ZV90eXBlIHRleHRfc2l6ZTsgLyogZHVtbXkgdmFycyAqLwkJCSAgICAgIFwKLQlmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkgICAgICBcCi0JaWYgKGFkYXRhKGFiZmQpLm1hZ2ljID09IHVuZGVjaWRlZF9tYWdpYykJCQkgICAgICBcCi0JICBOQU1FKGFvdXQsYWRqdXN0X3NpemVzX2FuZF92bWFzKSAoYWJmZCwgJnRleHRfc2l6ZSwgJnRleHRfZW5kKTsgICAgIFwKLSAgICAJCQkJCQkJCQkgICAgICBcCi0JZXhlY3AtPmFfc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICogRVhURVJOQUxfTkxJU1RfU0laRTsJICAgICAgXAotCWV4ZWNwLT5hX2VudHJ5ID0gYmZkX2dldF9zdGFydF9hZGRyZXNzIChhYmZkKTsJCQkgICAgICBcCi0gICAgCQkJCQkJCQkJICAgICAgXAotCWV4ZWNwLT5hX3Ryc2l6ZSA9ICgob2JqX3RleHRzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgICAgXAotCQkJICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCSAgICAgIFwKLQlleGVjcC0+YV9kcnNpemUgPSAoKG9ial9kYXRhc2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgICAgIFwKLQkJCSAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkgICAgICBcCi0JTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBTRUVLX1NFVCkgIT0gMCkgcmV0dXJuIGZhbHNlOwkgICAgICBcCi0JaWYgKGJmZF93cml0ZSAoKFBUUikgJmV4ZWNfYnl0ZXMsIDEsIEVYRUNfQllURVNfU0laRSwgYWJmZCkJICAgICAgXAotCSAgICAhPSBFWEVDX0JZVEVTX1NJWkUpCQkJCQkJICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICAgICBcCi0JLyogTm93IHdyaXRlIG91dCByZWxvYyBpbmZvLCBmb2xsb3dlZCBieSBzeW1zIGFuZCBzdHJpbmdzICovCSAgICAgIFwKLSAgCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkgICAgICBcCi0JICAgICYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApIAkJCQkgICAgICBcCi0JICB7CQkJCQkJCQkgICAgICBcCi0JICAgIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1NZTU9GRigqZXhlY3ApKSwgU0VFS19TRVQpICE9IDApIFwKLQkgICAgICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCSAgICBpZiAoISBOQU1FKGFvdXQsd3JpdGVfc3ltcykoYWJmZCkpIHJldHVybiBmYWxzZTsJCSAgICAgIFwKLQkgIH0JCQkJCQkJCSAgICAgIFwKLQkJCQkJCQkJCSAgICAgIFwKLQlpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikoTl9UUkVMT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0JaWYgKCFOQU1FKGFvdXQsc3F1aXJ0X291dF9yZWxvY3MpIChhYmZkLCBvYmpfdGV4dHNlYyAoYWJmZCkpKSAgICAgICAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkgICAgICAJICAgICAgXAotCQkJCQkJCQkJICAgICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSAgICBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJICAgICAgCSAgICAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkgICAgICAgICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCSAgICAgIAkgICAgICBcCi0gICAgICB9CQkJCQkJCQkJICAgICAgCi0jZW5kaWYKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCQU9VVF9IKSAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC1pbi5oIGIvYmZkL2xpYmJmZC1pbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDZiNzJjLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQtaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0MiArMCwwIEBACi0vKiBsaWJiZmQuaCAtLSBEZWNsYXJhdGlvbnMgdXNlZCBieSBiZmQgbGlicmFyeSAqaW1wbGVtZW50YXRpb24qLgotICAgKFRoaXMgaW5jbHVkZSBmaWxlIGlzIG5vdCBmb3IgdXNlcnMgb2YgdGhlIGxpYnJhcnkuKQotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJiZmQuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmJmZC1pbi5oIG9yIHRoZSBvdGhlciBCRkQgc291cmNlIGZpbGVzIHByb2Nlc3NlZCB0bwotKiogZ2VuZXJhdGUgdGhpcyBmaWxlLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFsaWduIGFuIGFkZHJlc3MgdXB3YXJkIHRvIGEgYm91bmRhcnksIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAgIEUuZy4gYWxpZ24gdG8gYW4gOC1ieXRlIGJvdW5kYXJ5IHdpdGggYXJndW1lbnQgb2YgOC4gIFRha2UgY2FyZSBuZXZlcgotICAgdG8gd3JhcCBhcm91bmQgaWYgdGhlIGFkZHJlc3MgaXMgd2l0aGluIGJvdW5kYXJ5LTEgb2YgdGhlIGVuZCBvZiB0aGUKLSAgIGFkZHJlc3Mgc3BhY2UuICAqLwotI2RlZmluZSBCRkRfQUxJR04odGhpcywgYm91bmRhcnkpCQkJCQlcCi0gICgoKChiZmRfdm1hKSAodGhpcykgKyAoYm91bmRhcnkpIC0gMSkgPj0gKGJmZF92bWEpICh0aGlzKSkJCVwKLSAgID8gKCgoYmZkX3ZtYSkgKHRoaXMpICsgKChib3VuZGFyeSkgLSAxKSkgJiAofigoYm91bmRhcnkpLTEpKSkJXAotICAgOiB+IChiZmRfdm1hKSAwKQotCi0vKiBJZiB5b3Ugd2FudCB0byByZWFkIGFuZCB3cml0ZSBsYXJnZSBibG9ja3MsIHlvdSBtaWdodCB3YW50IHRvIGRvIGl0Ci0gICBpbiBxdWFudGEgb2YgdGhpcyBhbW91bnQgKi8KLSNkZWZpbmUgREVGQVVMVF9CVUZGRVJTSVpFIDgxOTIKLQotLyogU2V0IGEgdGRhdGEgZmllbGQuICBDYW4ndCB1c2UgdGhlIG90aGVyIG1hY3JvcyBmb3IgdGhpcywgc2luY2UgdGhleQotICAgZG8gY2FzdHMsIGFuZCBjYXN0aW5nIHRvIHRoZSBsZWZ0IG9mIGFzc2lnbm1lbnQgaXNuJ3QgcG9ydGFibGUuICAqLwotI2RlZmluZSBzZXRfdGRhdGEoYmZkLCB2KSAoKGJmZCktPnRkYXRhLmFueSA9IChQVFIpICh2KSkKLQotLyogSWYgQkZEX0lOX01FTU9SWSBpcyBzZXQgZm9yIGEgQkZELCB0aGVuIHRoZSBpb3N0cmVhbSBmaWVsZHMgcG9pbnRzCi0gICB0byBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBiZmRfaW5fbWVtb3J5Ci17Ci0gIC8qIFNpemUgb2YgYnVmZmVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICAvKiBCdWZmZXIgaG9sZGluZyBjb250ZW50cyBvZiBCRkQuICAqLwotICBiZmRfYnl0ZSAqYnVmZmVyOwotfTsKLQotLyogdGRhdGEgZm9yIGFuIGFyY2hpdmUuICBGb3IgYW4gaW5wdXQgYXJjaGl2ZSwgY2FjaGUKLSAgIG5lZWRzIHRvIGJlIGZyZWUoKSdkLiAgRm9yIGFuIG91dHB1dCBhcmNoaXZlLCBzeW1kZWZzIGRvLiAgKi8KLQotc3RydWN0IGFydGRhdGEgewotICBmaWxlX3B0ciBmaXJzdF9maWxlX2ZpbGVwb3M7Ci0gIC8qIFNwZWVkIHVwIHNlYXJjaGluZyB0aGUgYXJtYXAgKi8KLSAgc3RydWN0IGFyX2NhY2hlICpjYWNoZTsKLSAgYmZkICphcmNoaXZlX2hlYWQ7ICAgICAgICAgICAgLyogT25seSBpbnRlcmVzdGluZyBpbiBvdXRwdXQgcm91dGluZXMgKi8KLSAgY2Fyc3ltICpzeW1kZWZzOwkJLyogdGhlIHN5bWRlZiBlbnRyaWVzICovCi0gIHN5bWluZGV4IHN5bWRlZl9jb3VudDsgICAgICAgICAgICAgLyogaG93IG1hbnkgdGhlcmUgYXJlICovCi0gIGNoYXIgKmV4dGVuZGVkX25hbWVzOwkJLyogY2xldmVyIGludGVsIGV4dGVuc2lvbiAqLwotICAvKiB3aGVuIG1vcmUgY29tcGlsZXJzIGFyZSBzdGFuZGFyZCBDLCB0aGlzIGNhbiBiZSBhIHRpbWVfdCAqLwotICBsb25nICBhcm1hcF90aW1lc3RhbXA7CS8qIFRpbWVzdGFtcCB2YWx1ZSB3cml0dGVuIGludG8gYXJtYXAuCi0JCQkJICAgVGhpcyBpcyB1c2VkIGZvciBCU0QgYXJjaGl2ZXMgdG8gY2hlY2sKLQkJCQkgICB0aGF0IHRoZSB0aW1lc3RhbXAgaXMgcmVjZW50IGVub3VnaAotCQkJCSAgIGZvciB0aGUgQlNEIGxpbmtlciB0byBub3QgY29tcGxhaW4sCi0JCQkJICAganVzdCBiZWZvcmUgd2UgZmluaXNoIHdyaXRpbmcgYW4KLQkJCQkgICBhcmNoaXZlLiAgKi8KLSAgZmlsZV9wdHIgYXJtYXBfZGF0ZXBvczsJLyogUG9zaXRpb24gd2l0aGluIGFyY2hpdmUgdG8gc2VlayB0bwotCQkJCSAgIHJld3JpdGUgdGhlIGRhdGUgZmllbGQuICAqLwotICBQVFIgdGRhdGE7CQkJLyogQmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi19OwotCi0jZGVmaW5lIGJmZF9hcmRhdGEoYmZkKSAoKGJmZCktPnRkYXRhLmFvdXRfYXJfZGF0YSkKLQotLyogR29lcyBpbiBiZmQncyBhcmVsdF9kYXRhIHNsb3QgKi8KLXN0cnVjdCBhcmVsdGRhdGEgewotICBjaGFyICogYXJjaF9oZWFkZXI7CQkJICAgICAvKiBpdCdzIGFjdHVhbGx5IGEgc3RyaW5nICovCi0gIHVuc2lnbmVkIGludCBwYXJzZWRfc2l6ZTsgICAgIC8qIG9jdGV0cyBvZiBmaWxlc2l6ZSBub3QgaW5jbHVkaW5nIGFyX2hkciAqLwotICBjaGFyICpmaWxlbmFtZTsJCQkgICAgIC8qIG51bGwtdGVybWluYXRlZCAqLwotfTsKLQotI2RlZmluZSBhcmVsdF9zaXplKGJmZCkgKCgoc3RydWN0IGFyZWx0ZGF0YSAqKSgoYmZkKS0+YXJlbHRfZGF0YSkpLT5wYXJzZWRfc2l6ZSkKLQotZXh0ZXJuIFBUUiBiZmRfbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfcmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfem1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLQotZXh0ZXJuIGJmZF9lcnJvcl9oYW5kbGVyX3R5cGUgX2JmZF9lcnJvcl9oYW5kbGVyOwotCi0vKiBUaGVzZSByb3V0aW5lcyBhbGxvY2F0ZSBhbmQgZnJlZSB0aGluZ3Mgb24gdGhlIEJGRCdzIG9iamFsbG9jLiAgKi8KLQotZXh0ZXJuIFBUUiBiZmRfYWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotZXh0ZXJuIFBUUiBiZmRfemFsbG9jIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QpKTsKLWV4dGVybiB2b2lkIGJmZF9yZWxlYXNlIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotYmZkICoJX2JmZF9jcmVhdGVfZW1wdHlfYXJjaGl2ZV9lbGVtZW50X3NoZWxsIFBBUkFNUyAoKGJmZCAqb2JmZCkpOwotYmZkICoJX2JmZF9sb29rX2Zvcl9iZmRfaW5fY2FjaGUgUEFSQU1TICgoYmZkICphcmNoX2JmZCwgZmlsZV9wdHIgaW5kZXgpKTsKLWJvb2xlYW4gX2JmZF9hZGRfYmZkX3RvX2FyY2hpdmVfY2FjaGUgUEFSQU1TICgoYmZkICosIGZpbGVfcHRyLCBiZmQgKikpOwotYm9vbGVhbglfYmZkX2dlbmVyaWNfbWthcmNoaXZlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY29uc3QgYmZkX3RhcmdldCAqYmZkX2dlbmVyaWNfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbgliZmRfc2x1cnBfYXJtYXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIGJmZF9zbHVycF9ic2RfYXJtYXBfZjIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jZGVmaW5lIGJmZF9zbHVycF9ic2RfYXJtYXAgYmZkX3NsdXJwX2FybWFwCi0jZGVmaW5lIGJmZF9zbHVycF9jb2ZmX2FybWFwIGJmZF9zbHVycF9hcm1hcAotYm9vbGVhbglfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICopKTsKLWJvb2xlYW4JX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotYm9vbGVhbiBfYmZkX2NvbXB1dGVfYW5kX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQgZWxlbmd0aCkpOwotYmZkICpfYmZkX2dldF9lbHRfYXRfZmlsZXBvcyBQQVJBTVMgKChiZmQgKmFyY2hpdmUsIGZpbGVfcHRyIGZpbGVwb3MpKTsKLWV4dGVybiBiZmQgKl9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4IFBBUkFNUyAoKGJmZCAqLCBzeW1pbmRleCkpOwotYmZkICogX2JmZF9uZXdfYmZkIFBBUkFNUyAoKHZvaWQpKTsKLQotYm9vbGVhbgliZmRfZmFsc2UgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWJvb2xlYW4JYmZkX3RydWUgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLVBUUgliZmRfbnVsbHZvaWRwdHIgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWludAliZmRfMCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotdW5zaWduZWQgaW50CWJmZF8wdSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotbG9uZwliZmRfMGwgUEFSQU1TICgoYmZkICppZ25vcmUpKTsKLWxvbmcJX2JmZF9uMSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotdm9pZAliZmRfdm9pZCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotCi1iZmQgKl9iZmRfbmV3X2JmZF9jb250YWluZWRfaW4gUEFSQU1TICgoYmZkICopKTsKLWNvbnN0IGJmZF90YXJnZXQgKl9iZmRfZHVtbXlfdGFyZ2V0IFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi12b2lkCWJmZF9kb250X3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLXZvaWQJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci12b2lkCWJmZF9nbnVfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotCi1ib29sZWFuCWJzZF93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotCQkJCSAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci0KLWJvb2xlYW4JY29mZl93cml0ZV9hcm1hcCBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLAotCQkJCSAgIHN0cnVjdCBvcmwgKm1hcCwgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotCi1leHRlcm4gUFRSIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkciBQQVJBTVMgKChiZmQgKikpOwotCi1leHRlcm4gUFRSIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcl9tYWcgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi1iZmQgKgliZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgUEFSQU1TICgoYmZkICphcmNoaXZlLAotCQkJCQkJICAgICBiZmQgKmxhc3RfZmlsZSkpOwotCi1pbnQJYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotCi0jZGVmaW5lIF9iZmRfcmVhZF9hcl9oZHIoYWJmZCkgXAotICBCRkRfU0VORCAoYWJmZCwgX2JmZF9yZWFkX2FyX2hkcl9mbiwgKGFiZmQpKQotDAotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cCBiZmRfdHJ1ZQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gYmZkX3RydWUKLSNkZWZpbmUgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfd2luZG93ICosIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9DT1BZLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGZsYWd3b3JkKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqLCBhc3ltYm9sICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIFBUUikpKSBiZmRfdHJ1ZSkKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9DT1JFIHdoZW4gdGhlcmUgaXMgbm8gY29yZSBmaWxlCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKS4gICovCi0KLWV4dGVybiBjaGFyICpfYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gaW50IF9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9ub2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgd2hlbiB0aGVyZSBpcyBubyBhcmNoaXZlCi0gICBmaWxlIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9hcm1hcCBiZmRfZmFsc2UKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBiZmRfZmFsc2UKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV90cnVuY2F0ZV9hcm5hbWUgXAotICAoKHZvaWQgKCopIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNoYXIgKikpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfd3JpdGVfYXJtYXAgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LCBzdHJ1Y3Qgb3JsICosIHVuc2lnbmVkIGludCwgaW50KSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gICgoYmZkICooKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfZ2V0X2VsdF9hdF9pbmRleCBcCi0gICgoYmZkICooKikgUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IGJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfZmFsc2UKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBCU0Qgc3R5bGUKLSAgIGFyY2hpdmVzLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfYXJjaGl2ZV9ic2QpLiAgKi8KLQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2FybWFwIGJmZF9zbHVycF9ic2RfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF90cnVuY2F0ZV9hcm5hbWUgYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF93cml0ZV9hcm1hcCBic2Rfd3JpdGVfYXJtYXAKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZXRfZWx0X2F0X2luZGV4IF9iZmRfZ2VuZXJpY19nZXRfZWx0X2F0X2luZGV4Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2RfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLSAgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotZXh0ZXJuIGJvb2xlYW4gX2JmZF9hcmNoaXZlX2JzZF91cGRhdGVfYXJtYXBfdGltZXN0YW1wIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB0byBnZXQgQ09GRiBzdHlsZQotICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2NvZmYpLiAgKi8KLQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9hcm1hcCBiZmRfc2x1cnBfY29mZl9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfY29mZl9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfd3JpdGVfYXJtYXAgY29mZl93cml0ZV9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9yZWFkX2FyX2hkciBfYmZkX2dlbmVyaWNfcmVhZF9hcl9oZHIKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFwKLSAgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF90cnVlCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyB3aGVyZSB0aGVyZSBpcyBubyBzeW1ib2wKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYiBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWFrZV9lbXB0eV9zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbCBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKSkgYmZkX3ZvaWQpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbyBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICopKSkgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vIFwKLSAgKChhbGVudCAqKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZSBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLCBcCi0JICAgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHVuc2lnbmVkIGxvbmcpKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19yZWFkX21pbmlzeW1ib2xzIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX21pbmlzeW1ib2xfdG9fc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwgYXN5bWJvbCAqKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9SRUxPQ1Mgd2hlbiB0aGVyZSBpcyBubyByZWxvYwotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2dldF9yZWxvY191cHBlcl9ib3VuZCBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIFwKLSAgKChyZWxvY19ob3d0b190eXBlICooKikgUEFSQU1TICgoYmZkICosIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkpKSBcCi0gICBiZmRfbnVsbHZvaWRwdHIpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUgZm9yIHRhcmdldHMgd2hpY2ggbWF5IG5vdAotICAgYmUgd3JpdHRlbi4gIFVzZSBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9ub3dyaXRlKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub3dyaXRlX3NldF9hcmNoX21hY2ggXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X3NlY3Rpb25fY29udGVudHMgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSkpIFwKLSAgIGJmZF9mYWxzZSkKLQotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1dSSVRFLiAgVXNlCi0gICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX3NldF9hcmNoX21hY2ggYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaAotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfTElOSyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKLSAgIHN1cHBvcnQgbGlua2luZy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluaykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9saW5rX3NpemVvZl9oZWFkZXJzICgoaW50ICgqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbikpKSBiZmRfMCkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gICgoYmZkX2J5dGUgKigqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBcCi0JICAgICBiZmRfYnl0ZSAqLCBib29sZWFuLCBhc3ltYm9sICoqKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX3JlbGF4X3NlY3Rpb24gXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2djX3NlY3Rpb25zIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBcCi0gICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKigqKSBQQVJBTVMgKChiZmQgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2FkZF9zeW1ib2xzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9maW5hbF9saW5rIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKSkgYmZkX2ZhbHNlKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgZm9yIHRhcmdldHMgd2hpY2ggZG8gbm90Ci0gICBoYXZlIGR5bmFtaWMgc3ltYm9scyBvciByZWxvY3MuICBVc2UgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQwotICAgKF9iZmRfbm9keW5hbWljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBfYmZkX24xCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotDAotLyogR2VuZXJpYyByb3V0aW5lIHRvIGRldGVybWluZSBvZiB0aGUgZ2l2ZW4gc3ltYm9sIGlzIGEgbG9jYWwKLSAgIGxhYmVsLiAgKi8KLWV4dGVybiBib29sZWFuIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBHZW5lcmljIG1pbmlzeW1ib2wgcm91dGluZXMuICAqLwotZXh0ZXJuIGxvbmcgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKTsKLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHVzaW5nIC5zdGFiLy5zdGFic3RyIHNlY3Rpb25zLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBib29sZWFuICosIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICosIFBUUiAqKSk7Ci0KLS8qIEZpbmQgdGhlIG5lYWRlcnN0IGxpbmUgdXNpbmcgRFdBUkYgMSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjFfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotLyogRmluZCB0aGUgbmVhcmVzdCBsaW5lIHVzaW5nIERXQVJGIDIgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZHdhcmYyX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hLCBjb25zdCBjaGFyICoqLAotCSAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLS8qIEEgcm91dGluZSB0byBjcmVhdGUgZW50cmllcyBmb3IgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKl9iZmRfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeSwKLQkgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlLAotCSAgIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi0vKiBJbml0aWFsaXplIGEgYmZkX2xpbmtfaGFzaF90YWJsZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfaGFzaF90YWJsZV9pbml0Ci0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogR2VuZXJpYyBsaW5rIGhhc2ggdGFibGUgY3JlYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYWRkIHN5bWJvbCByb3V0aW5lLiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQgYnkgdGFyZ2V0cyBmb3IKLSAgIHdoaWNoIHRoZSBsaW5rZXIgbXVzdCBjb2xsZWN0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZSwKLSAgIGFzIHRoZSBjb2xsZWN0MiBwcm9ncmFtIGRvZXMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBHZW5lcmljIGFyY2hpdmUgYWRkIHN5bWJvbCByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JICAgYm9vbGVhbiAoKmNoZWNrZm4pIChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSkpOwotCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbiB0byBhdm9pZCBwcm90b3R5cGUgZXJyb3JzLiAgKi8KLXR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgX2JmZF9saW5rX2hhc2hfZW50cnk7Ci0KLS8qIEdlbmVyaWMgcm91dGluZSB0byBhZGQgYSBzaW5nbGUgc3ltYm9sLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBjb25zdCBjaGFyICpuYW1lLCBmbGFnd29yZCwKLQkgICBhc2VjdGlvbiAqLCBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4gY29weSwKLQkgICBib29sZWFuIGNvbnN0cnVjdG9yLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikpOwotCi0vKiBHZW5lcmljIGxpbmsgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLQotLyogR2VuZXJpYyByZWxvY19saW5rX29yZGVyIHByb2Nlc3Npbmcgcm91dGluZS4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBEZWZhdWx0IGxpbmsgb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZGVmYXVsdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2YgcmVsb2MgZW50cmllcyBpbiBhIGxpbmsgb3JkZXIgbGlzdC4gICovCi1leHRlcm4gdW5zaWduZWQgaW50IF9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogRmluYWwgbGluayByZWxvY2F0aW9uIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBiZmRfdm1hIGFkZHJlc3MsIGJmZF92bWEgdmFsdWUsIGJmZF92bWEgYWRkZW5kKSk7Ci0KLS8qIFJlbG9jYXRlIGEgcGFydGljdWxhciBsb2NhdGlvbiBieSBhIGhvd3RvIGFuZCBhIHZhbHVlLiAgKi8KLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9yZWxvY2F0ZV9jb250ZW50cwotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIExpbmsgc3RhYnMgaW4gc2VjdGlvbnMgaW4gdGhlIGZpcnN0IHBhc3MuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2xpbmtfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIGFzZWN0aW9uICosIFBUUiAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX2J5dGUgKikpOwotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHN0cmluZyB0YWJsZSB3aGVuIGxpbmtpbmcgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgUFRSICopKTsKLQotLyogRmluZCBhbiBvZmZzZXQgd2l0aGluIGEgLnN0YWIgc2VjdGlvbiB3aGVuIGxpbmtpbmcgc3RhYnMgaW4KLSAgIHNlY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgUFRSICosIGJmZF92bWEpKTsKLQotLyogQ3JlYXRlIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ3JlYXRlIGFuIFhDT0ZGIC5kZWJ1ZyBzZWN0aW9uIHN0eWxlIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqX2JmZF94Y29mZl9zdHJpbmd0YWJfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEZyZWUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHZvaWQgX2JmZF9zdHJpbmd0YWJfZnJlZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogR2V0IHRoZSBzaXplIG9mIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX3NpemUgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gYmZkX3NpemVfdHlwZSBfYmZkX3N0cmluZ3RhYl9hZGQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqLCBjb25zdCBjaGFyICosIGJvb2xlYW4gaGFzaCwKLQkgICBib29sZWFuIGNvcHkpKTsKLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfc3RyaW5ndGFiX2VtaXQgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBDaGVjayB0aGF0IGVuZGlhbm5lc3Mgb2YgaW5wdXQgYW5kIG91dHB1dCBmaWxlIG1hdGNoLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY192ZXJpZnlfZW5kaWFuX21hdGNoIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotDAotLyogTWFjcm9zIHRvIHRlbGwgaWYgYmZkcyBhcmUgcmVhZCBvciB3cml0ZSBlbmFibGVkLgotCi0gICBOb3RlIHRoYXQgYmZkcyBvcGVuIGZvciByZWFkIG1heSBiZSBzY3JpYmJsZWQgaW50byBpZiB0aGUgZmQgcGFzc2VkCi0gICB0byBiZmRfZmRvcGVuciBpcyBhY3R1YWxseSBvcGVuIGJvdGggZm9yIHJlYWQgYW5kIHdyaXRlCi0gICBzaW11bHRhbmVvdXNseS4gIEhvd2V2ZXIgYW4gb3V0cHV0IGJmZCB3aWxsIG5ldmVyIGJlIG9wZW4gZm9yCi0gICByZWFkLiAgVGhlcmVmb3JlIHNvbWV0aW1lcyB5b3Ugd2FudCB0byBjaGVjayBiZmRfcmVhZF9wIG9yCi0gICAhYmZkX3JlYWRfcCwgYW5kIG9ubHkgc29tZXRpbWVzIGJmZF93cml0ZV9wLgotKi8KLQotI2RlZmluZQliZmRfcmVhZF9wKGFiZmQpICgoYWJmZCktPmRpcmVjdGlvbiA9PSByZWFkX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLSNkZWZpbmUJYmZkX3dyaXRlX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbiB8fCAoYWJmZCktPmRpcmVjdGlvbiA9PSBib3RoX2RpcmVjdGlvbikKLQotdm9pZAliZmRfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIqLGludCkpOwotCi0jZGVmaW5lIEJGRF9BU1NFUlQoeCkgXAoteyBpZiAoISh4KSkgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotI2RlZmluZSBCRkRfRkFJTCgpIFwKLXsgYmZkX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0KLQotRklMRSAqCWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBiZmQgKmJmZF9sYXN0X2NhY2hlOwotCi0vKiBMaXN0IG9mIHN1cHBvcnRlZCB0YXJnZXQgdmVjdG9ycywgYW5kIHRoZSBkZWZhdWx0IHZlY3RvciAoaWYKLSAgIGJmZF9kZWZhdWx0X3ZlY3RvclswXSBpcyBOVUxMLCB0aGVyZSBpcyBubyBkZWZhdWx0KS4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0IGJmZF90YXJnZXRfdmVjdG9yW107Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqYmZkX2RlZmF1bHRfdmVjdG9yW107Ci0KLS8qIEZ1bmN0aW9ucyBzaGFyZWQgYnkgdGhlIEVDT0ZGIGFuZCBNSVBTIEVMRiBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSB8fCBkZWZpbmVkKEFMTU9TVF9TVERDKQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZTsKLSNlbmRpZgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2xvY2F0ZV9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqIGNvbnN0LAotCSAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICogY29uc3QsIHN0cnVjdCBlY29mZl9maW5kX2xpbmUgKiwKLQkgICBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfcGRyIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3ltIFBBUkFNUyAoKFBUUiwgYmZkX2J5dGUgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9nZXRfYWNjdW11bGF0ZWRfc3MgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci0KLWV4dGVybiBiZmRfdm1hIF9iZmRfZ2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3NldF9ncF92YWx1ZSBQQVJBTVMgKChiZmQgKiwgYmZkX3ZtYSkpOwotCi0vKiBGdW5jdGlvbiBzaGFyZWQgYnkgdGhlIENPRkYgYW5kIEVMRiBTSCBiYWNrZW5kcywgd2hpY2ggaGF2ZSBubwotICAgb3RoZXIgY29tbW9uIGhlYWRlciBmaWxlcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfc2hfYWxpZ25fbG9hZF9zcGFuCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJvb2xlYW4gKCopIChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfYnl0ZSAqLCBiZmRfdm1hKSwKLQkgICBQVFIsIGJmZF92bWEgKiosIGJmZF92bWEgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgYm9vbGVhbiAqKSk7Ci0KLS8qIEFuZCBtb3JlIGZvbGxvd3MgKi8KLQpkaWZmIC0tZ2l0IGEvYmZkL2xpYmJmZC5jIGIvYmZkL2xpYmJmZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGEzZGUwLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJiZmQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyODYgKzAsMCBAQAotLyogQXNzb3J0ZWQgQkZEIHN1cHBvcnQgcm91dGluZXMsIG9ubHkgdXNlZCBpbnRlcm5hbGx5LgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSNkZWZpbmUgZ2V0cGFnZXNpemUoKSAyMDQ4Ci0jZW5kaWYKLQotc3RhdGljIGludCByZWFsX3JlYWQgUEFSQU1TICgoUFRSLCBzaXplX3QsIHNpemVfdCwgRklMRSAqKSk7Ci0KLS8qCi1TRUNUSU9OCi0JSW50ZXJuYWwgZnVuY3Rpb25zCi0KLURFU0NSSVBUSU9OCi0JVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgd2l0aGluIEJGRC4KLQlUaGV5IGFyZSBub3QgaW50ZW5kZWQgZm9yIGV4cG9ydCwgYnV0IGFyZSBkb2N1bWVudGVkIGhlcmUgZm9yCi0JY29tcGxldGVuZXNzLgotKi8KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHVuc3VwcG9ydGVkCi0gICBvcGVyYXRpb25zLiAgKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZmFsc2UgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmU7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHN1cHBvcnRlZCBvcGVyYXRpb25zCi0gICB3aGljaCBkbyBub3QgYWN0dWFsbHkgZG8gYW55dGhpbmcuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF90cnVlIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQSByb3V0aW5lIHdoaWNoIGlzIHVzZWQgaW4gdGFyZ2V0IHZlY3RvcnMgZm9yIHVuc3VwcG9ydGVkCi0gICBvcGVyYXRpb25zIHdoaWNoIHJldHVybiBhIHBvaW50ZXIgdmFsdWUuICAqLwotCi0vKkFSR1NVU0VEKi8KLVBUUgotYmZkX251bGx2b2lkcHRyIChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICByZXR1cm4gTlVMTDsKLX0KLQotLypBUkdTVVNFRCovCi1pbnQgCi1iZmRfMCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdW5zaWduZWQgaW50IAotYmZkXzB1IChpZ25vcmUpCi0gICAgIGJmZCAqaWdub3JlOwotewotICAgcmV0dXJuIDA7Ci19Ci0KLS8qQVJHVVNFRCovCi1sb25nCi1iZmRfMGwgKGlnbm9yZSkKLSAgICAgYmZkICppZ25vcmU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBBIHJvdXRpbmUgd2hpY2ggaXMgdXNlZCBpbiB0YXJnZXQgdmVjdG9ycyBmb3IgdW5zdXBwb3J0ZWQKLSAgIG9wZXJhdGlvbnMgd2hpY2ggcmV0dXJuIC0xIG9uIGVycm9yLiAgKi8KLQotLypBUkdTVVNFRCovCi1sb25nCi1fYmZkX24xIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIC0xOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQgCi1iZmRfdm9pZCAoaWdub3JlKQotICAgICBiZmQgKmlnbm9yZTsKLXsKLX0KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1fYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgKGlnbm9yZV9jb3JlX2JmZCwgaWdub3JlX2V4ZWNfYmZkKQotICAgICBiZmQgKmlnbm9yZV9jb3JlX2JmZDsKLSAgICAgYmZkICppZ25vcmVfZXhlY19iZmQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUm91dGluZSB0byBoYW5kbGUgY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBlbnRyeSBwb2ludCBmb3IgdGFyZ2V0cwotICAgd2l0aG91dCBjb3JlIGZpbGUgc3VwcG9ydC4gICovCi0KLS8qQVJHU1VTRUQqLwotY2hhciAqCi1fYmZkX25vY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLXsKLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgcmV0dXJuIChjaGFyICopTlVMTDsKLX0KLQotLyogUm91dGluZSB0byBoYW5kbGUgY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGVudHJ5IHBvaW50IGZvciB0YXJnZXRzCi0gICB3aXRob3V0IGNvcmUgZmlsZSBzdXBwb3J0LiAgKi8KLQotLypBUkdTVVNFRCovCi1pbnQKLV9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoaWdub3JlX2FiZmQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci17Ci0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gIHJldHVybiAwOwotfQotCi0vKkFSR1NVU0VEKi8KLWNvbnN0IGJmZF90YXJnZXQgKgotX2JmZF9kdW1teV90YXJnZXQgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotewotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBtZW1vcnkgdXNpbmcgbWFsbG9jLiAgKi8KLQotUFRSCi1iZmRfbWFsbG9jIChzaXplKQotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHB0cjsKLQotICBwdHIgPSAoUFRSKSBtYWxsb2MgKHNpemUpOwotICBpZiAocHRyID09IE5VTEwgJiYgc2l6ZSAhPSAwKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBSZWFsbG9jYXRlIG1lbW9yeSB1c2luZyByZWFsbG9jLiAgKi8KLQotUFRSCi1iZmRfcmVhbGxvYyAocHRyLCBzaXplKQotICAgICBQVFIgcHRyOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJldDsKLQotICBpZiAocHRyID09IE5VTEwpCi0gICAgcmV0ID0gbWFsbG9jIChzaXplKTsKLSAgZWxzZQotICAgIHJldCA9IHJlYWxsb2MgKHB0ciwgc2l6ZSk7Ci0KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSB1c2luZyBtYWxsb2MgYW5kIGNsZWFyIGl0LiAgKi8KLQotUFRSCi1iZmRfem1hbGxvYyAoc2l6ZSkKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBwdHI7Ci0KLSAgcHRyID0gKFBUUikgbWFsbG9jIChzaXplKTsKLQotICBpZiAoc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChwdHIgPT0gTlVMTCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIGVsc2UKLQltZW1zZXQgKHB0ciwgMCwgc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBTb21lIElPIGNvZGUgKi8KLQotCi0vKiBOb3RlIHRoYXQgYXJjaGl2ZSBlbnRyaWVzIGRvbid0IGhhdmUgc3RyZWFtczsgdGhleSBzaGFyZSB0aGVpciBwYXJlbnQncy4KLSAgIFRoaXMgYWxsb3dzIHNvbWVvbmUgdG8gcGxheSB3aXRoIHRoZSBpb3N0cmVhbSBiZWhpbmQgQkZEJ3MgYmFjay4KLQotICAgQWxzbywgbm90ZSB0aGF0IHRoZSBvcmlnaW4gcG9pbnRlciBwb2ludHMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGZpbGUncwotICAgY29udGVudHMgKDAgZm9yIG5vbi1hcmNoaXZlIGVsZW1lbnRzKS4gIEZvciBhcmNoaXZlIGVudHJpZXMgdGhpcyBpcyB0aGUKLSAgIGZpcnN0IG9jdGV0IGluIHRoZSBmaWxlLCBOT1QgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIuICovCi0KLXN0YXRpYyBpbnQKLXJlYWxfcmVhZCAod2hlcmUsIGEsYiwgZmlsZSkKLSAgICAgUFRSIHdoZXJlOwotICAgICBzaXplX3QgYTsKLSAgICAgc2l6ZV90IGI7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIC8qIEZJWE1FIC0gdGhpcyBsb29rcyBsaWtlIGFuIG9wdGltaXphdGlvbiwgYnV0IGl0J3MgcmVhbGx5IHRvIGNvdmVyCi0gICAgIHVwIGZvciBhIGZlYXR1cmUgb2Ygc29tZSBPU3MgKG5vdCBzb2xhcmlzIC0gc2lnaCkgdGhhdAotICAgICBsZC9wZS1kbGwuYyB0YWtlcyBhZHZhbnRhZ2Ugb2YgKGFwcGFyZW50bHkpIHdoZW4gaXQgY3JlYXRlcyBCRkRzCi0gICAgIGludGVybmFsbHkgYW5kIHRyaWVzIHRvIGxpbmsgYWdhaW5zdCB0aGVtLiAgQkZEIHNlZW1zIHRvIGJlIHNtYXJ0Ci0gICAgIGVub3VnaCB0byByZWFsaXplIHRoZXJlIGFyZSBubyBzeW1ib2wgcmVjb3JkcyBpbiB0aGUgImZpbGUiIHRoYXQKLSAgICAgZG9lc24ndCBleGlzdCBidXQgYXR0ZW1wdHMgdG8gcmVhZCB0aGVtIGFueXdheS4gIE9uIFNvbGFyaXMsCi0gICAgIGF0dGVtcHRpbmcgdG8gcmVhZCB6ZXJvIGJ5dGVzIGZyb20gYSBOVUxMIGZpbGUgcmVzdWx0cyBpbiBhIGNvcmUKLSAgICAgZHVtcCwgYnV0IG9uIG90aGVyIHBsYXRmb3JtcyBpdCBqdXN0IHJldHVybnMgemVybyBieXRlcyByZWFkLgotICAgICBUaGlzIG1ha2VzIGl0IHRvIHNvbWV0aGluZyByZWFzb25hYmxlLiAtIERKICovCi0gIGlmIChhID09IDAgfHwgYiA9PSAwKQotICAgIHJldHVybiAwOwotCi0jaWYgZGVmaW5lZCAoX19WQVgpICYmIGRlZmluZWQgKFZNUykKLSAgLyogQXBwYXJlbnRseSBmcmVhZCBvbiBWYXggVk1TIGRvZXMgbm90IGtlZXAgdGhlIHJlY29yZCBsZW5ndGgKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICByZXR1cm4gcmVhZCAoZmlsZW5vIChmaWxlKSwgd2hlcmUsIGEgKiBiKTsKLSNlbHNlCi0gIHJldHVybiBmcmVhZCAod2hlcmUsIGEsIGIsIGZpbGUpOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybiB2YWx1ZSBpcyBhbW91bnQgcmVhZCAoRklYTUU6IGhvdyBhcmUgZXJyb3JzIGFuZCBlbmQgb2YgZmlsZSBkZWFsdAotICAgd2l0aD8gIFdlIG5ldmVyIGNhbGwgYmZkX3NldF9lcnJvciwgd2hpY2ggaXMgcHJvYmFibHkgYSBtaXN0YWtlKS4gICovCi0KLWJmZF9zaXplX3R5cGUKLWJmZF9yZWFkIChwdHIsIHNpemUsIG5pdGVtcywgYWJmZCkKLSAgICAgUFRSIHB0cjsKLSAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgICBiZmRfc2l6ZV90eXBlIG5pdGVtczsKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnJlYWQ7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbTsKLSAgICAgIGJmZF9zaXplX3R5cGUgZ2V0OwotCi0gICAgICBiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYWJmZC0+aW9zdHJlYW07Ci0gICAgICBnZXQgPSBzaXplICogbml0ZW1zOwotICAgICAgaWYgKGFiZmQtPndoZXJlICsgZ2V0ID4gYmltLT5zaXplKQotCXsKLQkgIGdldCA9IGJpbS0+c2l6ZSAtIGFiZmQtPndoZXJlOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQl9Ci0gICAgICBtZW1jcHkgKHB0ciwgYmltLT5idWZmZXIgKyBhYmZkLT53aGVyZSwgZ2V0KTsKLSAgICAgIGFiZmQtPndoZXJlICs9IGdldDsKLSAgICAgIHJldHVybiBnZXQ7Ci0gICAgfQotCi0gIG5yZWFkID0gcmVhbF9yZWFkIChwdHIsIDEsIChzaXplX3QpKHNpemUqbml0ZW1zKSwgYmZkX2NhY2hlX2xvb2t1cChhYmZkKSk7Ci0gIGlmIChucmVhZCA+IDApCi0gICAgYWJmZC0+d2hlcmUgKz0gbnJlYWQ7Ci0KLSAgLyogU2V0IGJmZF9lcnJvciBpZiB3ZSBkaWQgbm90IHJlYWQgYXMgbXVjaCBkYXRhIGFzIHdlIGV4cGVjdGVkLgotCi0gICAgIElmIHRoZSByZWFkIGZhaWxlZCBkdWUgdG8gYW4gZXJyb3Igc2V0IHRoZSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwsCi0gICAgIGVsc2Ugc2V0IGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZC4KLQotICAgICBBIEJGRCBiYWNrZW5kIG1heSB3aXNoIHRvIG92ZXJyaWRlIGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCB0bwotICAgICBwcm92aWRlIHNvbWV0aGluZyBtb3JlIHVzZWZ1bCAoZWcuIG5vX3N5bWJvbHMgb3Igd3JvbmdfZm9ybWF0KS4gICovCi0gIGlmIChucmVhZCA8IChpbnQpKHNpemUgKiBuaXRlbXMpKQotICAgIHsKLSAgICAgIGlmIChmZXJyb3IgKGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpKSkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZWxzZQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgfQotCi0gIHJldHVybiBucmVhZDsKLX0KLQotLyogVGhlIHdpbmRvdyBzdXBwb3J0IHN0dWZmIHNob3VsZCBwcm9iYWJseSBiZSBicm9rZW4gb3V0IGludG8KLSAgIGFub3RoZXIgZmlsZS4uLi4gICovCi0vKiBUaGUgaWRlYSBiZWhpbmQgdGhlIG5leHQgYW5kIHJlZmNvdW50IGZpZWxkcyBpcyB0aGF0IG9uZSBtYXBwZWQKLSAgIHJlZ2lvbiBjYW4gc3VmZmljZSBmb3IgbXVsdGlwbGUgcmVhZC1vbmx5IHdpbmRvd3Mgb3IgbXVsdGlwbGUKLSAgIG5vbi1vdmVybGFwcGluZyByZWFkLXdyaXRlIHdpbmRvd3MuICBJdCdzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKLSAgIHRob3VnaC4gICovCi1zdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgewotICBzdHJ1Y3QgX2JmZF93aW5kb3dfaW50ZXJuYWwgKm5leHQ7Ci0gIFBUUiBkYXRhOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGludCByZWZjb3VudCA6IDMxOwkJLyogc2hvdWxkIGJlIGVub3VnaC4uLiAqLwotICB1bnNpZ25lZCBtYXBwZWQgOiAxOwkJLyogMSA9IG1tYXAsIDAgPSBtYWxsb2MgKi8KLX07Ci0KLXZvaWQKLWJmZF9pbml0X3dpbmRvdyAod2luZG93cCkKLSAgICAgYmZkX3dpbmRvdyAqd2luZG93cDsKLXsKLSAgd2luZG93cC0+ZGF0YSA9IDA7Ci0gIHdpbmRvd3AtPmkgPSAwOwotICB3aW5kb3dwLT5zaXplID0gMDsKLX0KLQwKLS8qIEN1cnJlbnRseSwgaWYgVVNFX01NQVAgaXMgdW5kZWZpbmVkLCBub25lIGlmIHRoZSB3aW5kb3cgc3R1ZmYgaXMKLSAgIHVzZWQuICBPa2F5LCBzbyBpdCdzIG1pcy1uYW1lZC4gIEF0IGxlYXN0IHRoZSBjb21tYW5kLWxpbmUgb3B0aW9uCi0gICAiLS13aXRob3V0LW1tYXAiIGlzIG1vcmUgb2J2aW91cyB0aGFuICItLXdpdGhvdXQtd2luZG93cyIgb3Igc29tZQotICAgc3VjaC4gICovCi0jaWZkZWYgVVNFX01NQVAKLQotI3VuZGVmIEhBVkVfTVBST1RFQ1QgLyogY29kZSdzIG5vdCB0ZXN0ZWQgeWV0ICovCi0KLSNpZiBIQVZFX01NQVAgfHwgSEFWRV9NUFJPVEVDVCB8fCBIQVZFX01BRFZJU0UKLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2VuZGlmCi0KLSNpZm5kZWYgTUFQX0ZJTEUKLSNkZWZpbmUgTUFQX0ZJTEUgMAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZGVidWdfd2luZG93czsKLQotdm9pZAotYmZkX2ZyZWVfd2luZG93ICh3aW5kb3dwKQotICAgICBiZmRfd2luZG93ICp3aW5kb3dwOwotewotICBiZmRfd2luZG93X2ludGVybmFsICppID0gd2luZG93cC0+aTsKLSAgd2luZG93cC0+aSA9IDA7Ci0gIHdpbmRvd3AtPmRhdGEgPSAwOwotICBpZiAoaSA9PSAwKQotICAgIHJldHVybjsKLSAgaS0+cmVmY291bnQtLTsKLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiZnJlZWluZyB3aW5kb3cgQCVwPCVwLCVseCwlcD5cbiIsCi0JICAgICB3aW5kb3dwLCB3aW5kb3dwLT5kYXRhLCB3aW5kb3dwLT5zaXplLCB3aW5kb3dwLT5pKTsKLSAgaWYgKGktPnJlZmNvdW50ICE9IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChpLT5tYXBwZWQpCi0gICAgewotI2lmZGVmIEhBVkVfTU1BUAotICAgICAgbXVubWFwIChpLT5kYXRhLCBpLT5zaXplKTsKLSAgICAgIGdvdG8gbm9fZnJlZTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgIH0KLSNpZmRlZiBIQVZFX01QUk9URUNUCi0gIG1wcm90ZWN0IChpLT5kYXRhLCBpLT5zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKTsKLSNlbmRpZgotICBmcmVlIChpLT5kYXRhKTsKLSNpZmRlZiBIQVZFX01NQVAKLSBub19mcmVlOgotI2VuZGlmCi0gIGktPmRhdGEgPSAwOwotICAvKiBUaGVyZSBzaG91bGQgYmUgbm8gbW9yZSByZWZlcmVuY2VzIHRvIGkgYXQgdGhpcyBwb2ludC4gICovCi0gIGZyZWUgKGkpOwotfQotCi1zdGF0aWMgaW50IG9rX3RvX21hcCA9IDE7Ci0KLWJvb2xlYW4KLWJmZF9nZXRfZmlsZV93aW5kb3cgKGFiZmQsIG9mZnNldCwgc2l6ZSwgd2luZG93cCwgd3JpdGFibGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgIGJmZF93aW5kb3cgKndpbmRvd3A7Ci0gICAgIGJvb2xlYW4gd3JpdGFibGU7Ci17Ci0gIHN0YXRpYyBzaXplX3QgcGFnZXNpemU7Ci0gIGJmZF93aW5kb3dfaW50ZXJuYWwgKmkgPSB3aW5kb3dwLT5pOwotICBzaXplX3Qgc2l6ZV90b19hbGxvYyA9IHNpemU7Ci0KLSAgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiYmZkX2dldF9maWxlX3dpbmRvdyAoJXAsICU2bGQsICU2bGQsICVwPCVwLCVseCwlcD4sICVkKSIsCi0JICAgICBhYmZkLCAobG9uZykgb2Zmc2V0LCAobG9uZykgc2l6ZSwKLQkgICAgIHdpbmRvd3AsIHdpbmRvd3AtPmRhdGEsICh1bnNpZ25lZCBsb25nKSB3aW5kb3dwLT5zaXplLAotCSAgICAgd2luZG93cC0+aSwgd3JpdGFibGUpOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IHRoZSBwYWdlIHNpemUsIHNvIHdlIGNhbiBiZSBmcmllbmRseSB0byBtbWFwLiAgKi8KLSAgaWYgKHBhZ2VzaXplID09IDApCi0gICAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsKLSAgaWYgKHBhZ2VzaXplID09IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGkgPT0gMCkKLSAgICB7Ci0gICAgICB3aW5kb3dwLT5pID0gaSA9IChiZmRfd2luZG93X2ludGVybmFsICopIGJmZF96bWFsbG9jIChzaXplb2YgKGJmZF93aW5kb3dfaW50ZXJuYWwpKTsKLSAgICAgIGlmIChpID09IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaS0+ZGF0YSA9IDA7Ci0gICAgfQotI2lmZGVmIEhBVkVfTU1BUAotICBpZiAob2tfdG9fbWFwCi0gICAgICAmJiAoaS0+ZGF0YSA9PSAwIHx8IGktPm1hcHBlZCA9PSAxKQotICAgICAgJiYgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgPT0gMCkKLSAgICB7Ci0gICAgICBmaWxlX3B0ciBmaWxlX29mZnNldCwgb2Zmc2V0MjsKLSAgICAgIHNpemVfdCByZWFsX3NpemU7Ci0gICAgICBpbnQgZmQ7Ci0gICAgICBGSUxFICpmOwotCi0gICAgICAvKiBGaW5kIHRoZSByZWFsIGZpbGUgYW5kIHRoZSByZWFsIG9mZnNldCBpbnRvIGl0LiAgKi8KLSAgICAgIHdoaWxlIChhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0JewotCSAgb2Zmc2V0ICs9IGFiZmQtPm9yaWdpbjsKLQkgIGFiZmQgPSBhYmZkLT5teV9hcmNoaXZlOwotCX0KLSAgICAgIGYgPSBiZmRfY2FjaGVfbG9va3VwIChhYmZkKTsKLSAgICAgIGZkID0gZmlsZW5vIChmKTsKLQotICAgICAgLyogQ29tcHV0ZSBvZmZzZXRzIGFuZCBzaXplIGZvciBtbWFwIGFuZCBmb3IgdGhlIHVzZXIncyBkYXRhLiAgKi8KLSAgICAgIG9mZnNldDIgPSBvZmZzZXQgJSBwYWdlc2l6ZTsKLSAgICAgIGlmIChvZmZzZXQyIDwgMCkKLQlhYm9ydCAoKTsKLSAgICAgIGZpbGVfb2Zmc2V0ID0gb2Zmc2V0IC0gb2Zmc2V0MjsKLSAgICAgIHJlYWxfc2l6ZSA9IG9mZnNldCArIHNpemUgLSBmaWxlX29mZnNldDsKLSAgICAgIHJlYWxfc2l6ZSA9IHJlYWxfc2l6ZSArIHBhZ2VzaXplIC0gMTsKLSAgICAgIHJlYWxfc2l6ZSAtPSByZWFsX3NpemUgJSBwYWdlc2l6ZTsKLQotICAgICAgLyogSWYgd2UncmUgcmUtdXNpbmcgYSBtZW1vcnkgcmVnaW9uLCBtYWtlIHN1cmUgaXQncyBiaWcgZW5vdWdoLiAgKi8KLSAgICAgIGlmIChpLT5kYXRhICYmIGktPnNpemUgPCBzaXplKQotCXsKLQkgIG11bm1hcCAoaS0+ZGF0YSwgaS0+c2l6ZSk7Ci0JICBpLT5kYXRhID0gMDsKLQl9Ci0gICAgICBpLT5kYXRhID0gbW1hcCAoaS0+ZGF0YSwgcmVhbF9zaXplLAotCQkgICAgICB3cml0YWJsZSA/IFBST1RfV1JJVEUgfCBQUk9UX1JFQUQgOiBQUk9UX1JFQUQsCi0JCSAgICAgICh3cml0YWJsZQotCQkgICAgICAgPyBNQVBfRklMRSB8IE1BUF9QUklWQVRFCi0JCSAgICAgICA6IE1BUF9GSUxFIHwgTUFQX1NIQVJFRCksCi0JCSAgICAgIGZkLCBmaWxlX29mZnNldCk7Ci0gICAgICBpZiAoaS0+ZGF0YSA9PSAoUFRSKSAtMSkKLQl7Ci0JICAvKiBBbiBlcnJvciBoYXBwZW5lZC4gIFJlcG9ydCBpdCwgb3IgdHJ5IHVzaW5nIG1hbGxvYywgb3IKLQkgICAgIHNvbWV0aGluZy4gICovCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCSAgaS0+ZGF0YSA9IDA7Ci0JICB3aW5kb3dwLT5kYXRhID0gMDsKLQkgIGlmIChkZWJ1Z193aW5kb3dzKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICJcdFx0bW1hcCBmYWlsZWQhXG4iKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoZGVidWdfd2luZG93cykKLQlmcHJpbnRmIChzdGRlcnIsICJcblx0bWFwcGVkICVsZCBhdCAlcCwgb2Zmc2V0IGlzICVsZFxuIiwKLQkJIChsb25nKSByZWFsX3NpemUsIGktPmRhdGEsIChsb25nKSBvZmZzZXQyKTsKLSAgICAgIGktPnNpemUgPSByZWFsX3NpemU7Ci0gICAgICB3aW5kb3dwLT5kYXRhID0gKFBUUikgKChiZmRfYnl0ZSAqKSBpLT5kYXRhICsgb2Zmc2V0Mik7Ci0gICAgICB3aW5kb3dwLT5zaXplID0gc2l6ZTsKLSAgICAgIGktPm1hcHBlZCA9IDE7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGRlYnVnX3dpbmRvd3MpCi0gICAgewotICAgICAgaWYgKG9rX3RvX21hcCkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIm5vdCBtYXBwaW5nOiBkYXRhPSVseCBtYXBwZWQ9JWRcbiIpLAotCQkgKHVuc2lnbmVkIGxvbmcpIGktPmRhdGEsIChpbnQpIGktPm1hcHBlZCk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLCBfKCJub3QgbWFwcGluZzogZW52IHZhciBub3Qgc2V0XG4iKSk7Ci0gICAgfQotI2Vsc2UKLSAgb2tfdG9fbWFwID0gMDsKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9NUFJPVEVDVAotICBpZiAoIXdyaXRhYmxlKQotICAgIHsKLSAgICAgIHNpemVfdG9fYWxsb2MgKz0gcGFnZXNpemUgLSAxOwotICAgICAgc2l6ZV90b19hbGxvYyAtPSBzaXplX3RvX2FsbG9jICUgcGFnZXNpemU7Ci0gICAgfQotI2VuZGlmCi0gIGlmIChkZWJ1Z193aW5kb3dzKQotICAgIGZwcmludGYgKHN0ZGVyciwgIlxuXHQlcyglNmxkKSIsCi0JICAgICBpLT5kYXRhID8gInJlYWxsb2MiIDogIiBtYWxsb2MiLCAobG9uZykgc2l6ZV90b19hbGxvYyk7Ci0gIGktPmRhdGEgPSAoUFRSKSBiZmRfcmVhbGxvYyAoaS0+ZGF0YSwgc2l6ZV90b19hbGxvYyk7Ci0gIGlmIChkZWJ1Z193aW5kb3dzKQotICAgIGZwcmludGYgKHN0ZGVyciwgIlx0LT4gJXBcbiIsIGktPmRhdGEpOwotICBpLT5yZWZjb3VudCA9IDE7Ci0gIGlmIChpLT5kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKHNpemVfdG9fYWxsb2MgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaS0+c2l6ZSA9IGJmZF9yZWFkIChpLT5kYXRhLCBzaXplLCAxLCBhYmZkKTsKLSAgaWYgKGktPnNpemUgIT0gc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGktPm1hcHBlZCA9IDA7Ci0jaWZkZWYgSEFWRV9NUFJPVEVDVAotICBpZiAoIXdyaXRhYmxlKQotICAgIHsKLSAgICAgIGlmIChkZWJ1Z193aW5kb3dzKQotCWZwcmludGYgKHN0ZGVyciwgIlx0bXByb3RlY3QgKCVwLCAlbGQsIFBST1RfUkVBRClcbiIsIGktPmRhdGEsCi0JCSAobG9uZykgaS0+c2l6ZSk7Ci0gICAgICBtcHJvdGVjdCAoaS0+ZGF0YSwgaS0+c2l6ZSwgUFJPVF9SRUFEKTsKLSAgICB9Ci0jZW5kaWYKLSAgd2luZG93cC0+ZGF0YSA9IGktPmRhdGE7Ci0gIHdpbmRvd3AtPnNpemUgPSBpLT5zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2VuZGlmIC8qIFVTRV9NTUFQICovCi0MCi1iZmRfc2l6ZV90eXBlCi1iZmRfd3JpdGUgKHB0ciwgc2l6ZSwgbml0ZW1zLCBhYmZkKQotICAgICBDT05TVCBQVFIgcHRyOwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgIGJmZF9zaXplX3R5cGUgbml0ZW1zOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgbndyb3RlOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfaW5fbWVtb3J5ICpiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgKGFiZmQtPmlvc3RyZWFtKTsKLSAgICAgIHNpemUgKj0gbml0ZW1zOwotICAgICAgaWYgKGFiZmQtPndoZXJlICsgc2l6ZSA+IGJpbS0+c2l6ZSkKLQl7Ci0JICBsb25nIG5ld3NpemUsIG9sZHNpemUgPSAoYmltLT5zaXplICsgMTI3KSAmIH4xMjc7Ci0JICBiaW0tPnNpemUgPSBhYmZkLT53aGVyZSArIHNpemU7Ci0JICAvKiBSb3VuZCB1cCB0byBjdXQgZG93biBvbiBtZW1vcnkgZnJhZ21lbnRhdGlvbiAqLwotCSAgbmV3c2l6ZSA9IChiaW0tPnNpemUgKyAxMjcpICYgfjEyNzsKLQkgIGlmIChuZXdzaXplID4gb2xkc2l6ZSkKLQkgICAgewotCSAgICAgIGJpbS0+YnVmZmVyID0gYmZkX3JlYWxsb2MgKGJpbS0+YnVmZmVyLCBuZXdzaXplKTsKLQkgICAgICBpZiAoYmltLT5idWZmZXIgPT0gMCkKLQkJewotCQkgIGJpbS0+c2l6ZSA9IDA7Ci0JCSAgcmV0dXJuIDA7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIG1lbWNweSAoYmltLT5idWZmZXIgKyBhYmZkLT53aGVyZSwgcHRyLCBzaXplKTsKLSAgICAgIGFiZmQtPndoZXJlICs9IHNpemU7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgbndyb3RlID0gZndyaXRlIChwdHIsIDEsIChzaXplX3QpIChzaXplICogbml0ZW1zKSwKLQkJICAgYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCkpOwotICBpZiAobndyb3RlID4gMCkKLSAgICBhYmZkLT53aGVyZSArPSBud3JvdGU7Ci0gIGlmICgoYmZkX3NpemVfdHlwZSkgbndyb3RlICE9IHNpemUgKiBuaXRlbXMpCi0gICAgewotI2lmZGVmIEVOT1NQQwotICAgICAgaWYgKG53cm90ZSA+PSAwKQotCWVycm5vID0gRU5PU1BDOwotI2VuZGlmCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgIH0KLSAgcmV0dXJuIG53cm90ZTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50KGJmZCAqYWJmZCwgIGludCBpKTsKLQotREVTQ1JJUFRJT04KLQlXcml0ZSBhIDQgYnl0ZSBpbnRlZ2VyIEB2YXJ7aX0gdG8gdGhlIG91dHB1dCBCRkQgQHZhcnthYmZkfSwgaW4gYmlnCi0JZW5kaWFuIG9yZGVyIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBlbHNlIGlzIGdvaW5nIG9uLiAgVGhpcyBpcyB1c2VmdWwgaW4KLQlhcmNoaXZlcy4KLQotKi8KLXZvaWQKLWJmZF93cml0ZV9iaWdlbmRpYW5fNGJ5dGVfaW50IChhYmZkLCBpKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIGJmZF9wdXRiMzIoaSwgYnVmZmVyKTsKLSAgaWYgKGJmZF93cml0ZSgoUFRSKWJ1ZmZlciwgNCwgMSwgYWJmZCkgIT0gNCkKLSAgICBhYm9ydCAoKTsKLX0KLQotbG9uZwotYmZkX3RlbGwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgZmlsZV9wdHIgcHRyOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHJldHVybiBhYmZkLT53aGVyZTsKLQotICBwdHIgPSBmdGVsbCAoYmZkX2NhY2hlX2xvb2t1cChhYmZkKSk7Ci0KLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUpCi0gICAgcHRyIC09IGFiZmQtPm9yaWdpbjsKLSAgYWJmZC0+d2hlcmUgPSBwdHI7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLWludAotYmZkX2ZsdXNoIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBCRkRfSU5fTUVNT1JZKSAhPSAwKQotICAgIHJldHVybiAwOwotICByZXR1cm4gZmZsdXNoIChiZmRfY2FjaGVfbG9va3VwKGFiZmQpKTsKLX0KLQotLyogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBmb3IgZmFpbHVyZSAoaW4gd2hpY2ggY2FzZQotICAgYmZkX2dldF9lcnJvciBjYW4gcmV0cmlldmUgdGhlIGVycm9yIGNvZGUpLiAgKi8KLWludAotYmZkX3N0YXQgKGFiZmQsIHN0YXRidWYpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IHN0YXQgKnN0YXRidWY7Ci17Ci0gIEZJTEUgKmY7Ci0gIGludCByZXN1bHQ7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgZiA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICByZXN1bHQgPSBmc3RhdCAoZmlsZW5vIChmKSwgc3RhdGJ1Zik7Ci0gIGlmIChyZXN1bHQgPCAwKQotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uemVybyBmb3IgZmFpbHVyZSAoaW4gd2hpY2ggY2FzZSBiZmRfZ2V0X2Vycm9yCi0gICBjYW4gcmV0cmlldmUgdGhlIGVycm9yIGNvZGUpLiAgKi8KLQotaW50Ci1iZmRfc2VlayAoYWJmZCwgcG9zaXRpb24sIGRpcmVjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBmaWxlX3B0ciBwb3NpdGlvbjsKLSAgICAgaW50IGRpcmVjdGlvbjsKLXsKLSAgaW50IHJlc3VsdDsKLSAgRklMRSAqZjsKLSAgZmlsZV9wdHIgZmlsZV9wb3NpdGlvbjsKLSAgLyogRm9yIHRoZSB0aW1lIGJlaW5nLCBhIEJGRCBtYXkgbm90IHNlZWsgdG8gaXQncyBlbmQuICBUaGUgcHJvYmxlbQotICAgICBpcyB0aGF0IHdlIGRvbid0IGVhc2lseSBoYXZlIGEgd2F5IHRvIHJlY29nbml6ZSB0aGUgZW5kIG9mIGFuCi0gICAgIGVsZW1lbnQgaW4gYW4gYXJjaGl2ZS4gKi8KLQotICBCRkRfQVNTRVJUIChkaXJlY3Rpb24gPT0gU0VFS19TRVQgfHwgZGlyZWN0aW9uID09IFNFRUtfQ1VSKTsKLQotICBpZiAoZGlyZWN0aW9uID09IFNFRUtfQ1VSICYmIHBvc2l0aW9uID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgaWYgKGRpcmVjdGlvbiA9PSBTRUVLX1NFVCkKLQlhYmZkLT53aGVyZSA9IHBvc2l0aW9uOwotICAgICAgZWxzZQotCWFiZmQtPndoZXJlICs9IHBvc2l0aW9uOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChhYmZkLT5mb3JtYXQgIT0gYmZkX2FyY2hpdmUgJiYgYWJmZC0+bXlfYXJjaGl2ZSA9PSAwKQotICAgIHsKLSNpZiAwCi0gICAgICAvKiBFeHBsYW5hdGlvbiBmb3IgdGhpcyBjb2RlOiBJJ20gb25seSBhYm91dCA5NSslIHN1cmUgdGhhdCB0aGUgYWJvdmUKLQkgY29uZGl0aW9ucyBhcmUgc3VmZmljaWVudCBhbmQgdGhhdCBhbGwgaS9vIGNhbGxzIGFyZSBwcm9wZXJseQotCSBhZGp1c3RpbmcgdGhlIGB3aGVyZScgZmllbGQuICBTbyB0aGlzIGlzIHNvcnQgb2YgYW4gYGFzc2VydCcKLQkgdGhhdCB0aGUgYHdoZXJlJyBmaWVsZCBpcyBjb3JyZWN0LiAgSWYgd2UgY2FuIGdvIGEgd2hpbGUgd2l0aG91dAotCSB0cmlwcGluZyB0aGUgYWJvcnQsIHdlIGNhbiBwcm9iYWJseSBzYWZlbHkgZGlzYWJsZSB0aGlzIGNvZGUsCi0JIHNvIHRoYXQgdGhlIHJlYWwgb3B0aW1pemF0aW9ucyBoYXBwZW4uICAqLwotICAgICAgZmlsZV9wdHIgd2hlcmVfYW1faV9ub3c7Ci0gICAgICB3aGVyZV9hbV9pX25vdyA9IGZ0ZWxsIChiZmRfY2FjaGVfbG9va3VwIChhYmZkKSk7Ci0gICAgICBpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKLQl3aGVyZV9hbV9pX25vdyAtPSBhYmZkLT5vcmlnaW47Ci0gICAgICBpZiAod2hlcmVfYW1faV9ub3cgIT0gYWJmZC0+d2hlcmUpCi0JYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQgJiYgcG9zaXRpb24gPT0gYWJmZC0+d2hlcmUpCi0JcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbmVlZCBzb21ldGhpbmcgc21hcnRlciB0byBvcHRpbWl6ZSBhY2Nlc3MgdG8gYXJjaGl2ZXMuCi0JIEN1cnJlbnRseSwgYW55dGhpbmcgaW5zaWRlIGFuIGFyY2hpdmUgaXMgcmVhZCB2aWEgdGhlIGZpbGUKLQkgaGFuZGxlIGZvciB0aGUgYXJjaGl2ZS4gIFdoaWNoIG1lYW5zIHRoYXQgYSBiZmRfc2VlayBvbiBvbmUKLQkgY29tcG9uZW50IGFmZmVjdHMgdGhlIGBjdXJyZW50IHBvc2l0aW9uJyBpbiB0aGUgYXJjaGl2ZSwgYXMKLQkgd2VsbCBhcyBpbiBhbnkgb3RoZXIgY29tcG9uZW50LgotCi0JIEl0IG1pZ2h0IGJlIHN1ZmZpY2llbnQgdG8gcHV0IGEgc3Bpa2UgdGhyb3VnaCB0aGUgY2FjaGUKLQkgYWJzdHJhY3Rpb24sIGFuZCBsb29rIHRvIHRoZSBhcmNoaXZlIGZvciB0aGUgZmlsZSBwb3NpdGlvbiwKLQkgYnV0IEkgdGhpbmsgd2Ugc2hvdWxkIHRyeSBmb3Igc29tZXRoaW5nIGNsZWFuZXIuCi0KLQkgSW4gdGhlIG1lYW50aW1lLCBubyBvcHRpbWl6YXRpb24gZm9yIGFyY2hpdmVzLiAgKi8KLSAgICB9Ci0KLSAgZiA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICBmaWxlX3Bvc2l0aW9uID0gcG9zaXRpb247Ci0gIGlmIChkaXJlY3Rpb24gPT0gU0VFS19TRVQgJiYgYWJmZC0+bXlfYXJjaGl2ZSAhPSBOVUxMKQotICAgIGZpbGVfcG9zaXRpb24gKz0gYWJmZC0+b3JpZ2luOwotCi0gIHJlc3VsdCA9IGZzZWVrIChmLCBmaWxlX3Bvc2l0aW9uLCBkaXJlY3Rpb24pOwotCi0gIGlmIChyZXN1bHQgIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgaG9sZF9lcnJubyA9IGVycm5vOwotCi0gICAgICAvKiBGb3JjZSByZWRldGVybWluYXRpb24gb2YgYHdoZXJlJyBmaWVsZC4gICovCi0gICAgICBiZmRfdGVsbCAoYWJmZCk7Ci0KLSAgICAgIC8qIEFuIEVJTlZBTCBlcnJvciBwcm9iYWJseSBtZWFucyB0aGF0IHRoZSBmaWxlIG9mZnNldCB3YXMKLSAgICAgICAgIGFic3VyZC4gICovCi0gICAgICBpZiAoaG9sZF9lcnJubyA9PSBFSU5WQUwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotCSAgZXJybm8gPSBob2xkX2Vycm5vOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBBZGp1c3QgYHdoZXJlJyBmaWVsZC4gICovCi0gICAgICBpZiAoZGlyZWN0aW9uID09IFNFRUtfU0VUKQotCWFiZmQtPndoZXJlID0gcG9zaXRpb247Ci0gICAgICBlbHNlCi0JYWJmZC0+d2hlcmUgKz0gcG9zaXRpb247Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotDAotLyoqIFRoZSBkby1pdC15b3Vyc2VsZiAoYnl0ZSkgc2V4LWNoYW5nZSBraXQgKi8KLQotLyogVGhlIG1pZGRsZSBsZXR0ZXIgZS5nLiBnZXQ8Yj5zaG9ydCBpbmRpY2F0ZXMgQmlnIG9yIExpdHRsZSBlbmRpYW4KLSAgIHRhcmdldCBtYWNoaW5lLiAgSXQgZG9lc24ndCBtYXR0ZXIgd2hhdCB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgaG9zdAotICAgbWFjaGluZSBpczsgdGhlc2Ugcm91dGluZXMgd29yayBmb3IgZWl0aGVyLiAgKi8KLQotLyogRklYTUU6IFNob3VsZCB0aGVzZSB0YWtlIGEgY291bnQgYXJndW1lbnQ/Ci0gICBBbnN3ZXIgKGdudUBjeWdudXMuY29tKTogIE5vLCBidXQgcGVyaGFwcyB0aGV5IHNob3VsZCBiZSBpbmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zIGluIHN3YXAuaCAjaWZkZWYgX19HTlVDX18uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcHJvZiB0aGVtIGxhdGVyIGFuZCBmaW5kIG91dC4gICovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9wdXRfc2l6ZQotRlVOQ1RJT04KLQliZmRfZ2V0X3NpemUKLQotREVTQ1JJUFRJT04KLQlUaGVzZSBtYWNyb3MgYXMgdXNlZCBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyByYXcgZGF0YSBpbgotCXNlY3Rpb25zOyBlYWNoIGFjY2VzcyAoZXhjZXB0IGZvciBieXRlcykgaXMgdmVjdG9yZWQgdGhyb3VnaAotCXRoZSB0YXJnZXQgZm9ybWF0IG9mIHRoZSBCRkQgYW5kIG1hbmdsZWQgYWNjb3JkaW5nbHkuIFRoZQotCW1hbmdsaW5nIHBlcmZvcm1zIGFueSBuZWNlc3NhcnkgZW5kaWFuIHRyYW5zbGF0aW9ucyBhbmQKLQlyZW1vdmVzIGFsaWdubWVudCByZXN0cmljdGlvbnMuICBOb3RlIHRoYXQgdHlwZXMgYWNjZXB0ZWQgYW5kCi0JcmV0dXJuZWQgYnkgdGhlc2UgbWFjcm9zIGFyZSBpZGVudGljYWwgc28gdGhleSBjYW4gYmUgc3dhcHBlZAotCWFyb3VuZCBpbiBtYWNyb3MtLS1mb3IgZXhhbXBsZSwgQGZpbGV7bGliYW91dC5ofSBkZWZpbmVzIDw8R0VUX1dPUkQ+PgotCXRvIGVpdGhlciA8PGJmZF9nZXRfMzI+PiBvciA8PGJmZF9nZXRfNjQ+Pi4KLQotCUluIHRoZSBwdXQgcm91dGluZXMsIEB2YXJ7dmFsfSBtdXN0IGJlIGEgPDxiZmRfdm1hPj4uICBJZiB3ZSBhcmUgb24gYQotCXN5c3RlbSB3aXRob3V0IHByb3RvdHlwZXMsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZwotCXN1cmUgdGhhdCBpcyB0cnVlLCB3aXRoIGEgY2FzdCBpZiBuZWNlc3NhcnkuICBXZSBkb24ndCBjYXN0Ci0JdGhlbSBpbiB0aGUgbWFjcm8gZGVmaW5pdGlvbnMgYmVjYXVzZSB0aGF0IHdvdWxkIHByZXZlbnQgPDxsaW50Pj4KLQlvciA8PGdjYyAtV2FsbD4+IGZyb20gZGV0ZWN0aW5nIHNpbnMgc3VjaCBhcyBwYXNzaW5nIGEgcG9pbnRlci4KLQlUbyBkZXRlY3QgY2FsbGluZyB0aGVzZSB3aXRoIGxlc3MgdGhhbiBhIDw8YmZkX3ZtYT4+LCB1c2UKLQk8PGdjYyAtV2NvbnZlcnNpb24+PiBvbiBhIGhvc3Qgd2l0aCA2NCBiaXQgPDxiZmRfdm1hPj4ncy4KLQotLgotLnsqIEJ5dGUgc3dhcHBpbmcgbWFjcm9zIGZvciB1c2VyIHNlY3Rpb24gZGF0YS4gICp9Ci0uCi0uI2RlZmluZSBiZmRfcHV0XzgoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgKCooKHVuc2lnbmVkIGNoYXIgKikocHRyKSkgPSAodW5zaWduZWQgY2hhcikodmFsKSkKLS4jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzggXAotLgkJYmZkX3B1dF84Ci0uI2RlZmluZSBiZmRfZ2V0XzgoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgICgqKHVuc2lnbmVkIGNoYXIgKikocHRyKSkKLS4jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzgoYWJmZCwgcHRyKSBcCi0uCQkoKCoodW5zaWduZWQgY2hhciAqKShwdHIpIF4gMHg4MCkgLSAweDgwKQotLgotLiNkZWZpbmUgYmZkX3B1dF8xNihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfcHV0eDE2LCAoKHZhbCksKHB0cikpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfMTYgXAotLgkJIGJmZF9wdXRfMTYKLS4jZGVmaW5lIGJmZF9nZXRfMTYoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4MTYsIChwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfMTYoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgCSBCRkRfU0VORCAoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzE2LCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9wdXRfMzIoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX3B1dHgzMiwgKCh2YWwpLChwdHIpKSkKLS4jZGVmaW5lIGJmZF9wdXRfc2lnbmVkXzMyIFwKLS4JCSBiZmRfcHV0XzMyCi0uI2RlZmluZSBiZmRfZ2V0XzMyKGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfZ2V0eDMyLCAocHRyKSkKLS4jZGVmaW5lIGJmZF9nZXRfc2lnbmVkXzMyKGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4X3NpZ25lZF8zMiwgKHB0cikpCi0uCi0uI2RlZmluZSBiZmRfcHV0XzY0KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9wdXR4NjQsICgodmFsKSwgKHB0cikpKQotLiNkZWZpbmUgYmZkX3B1dF9zaWduZWRfNjQgXAotLgkJIGJmZF9wdXRfNjQKLS4jZGVmaW5lIGJmZF9nZXRfNjQoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9nZXR4NjQsIChwdHIpKQotLiNkZWZpbmUgYmZkX2dldF9zaWduZWRfNjQoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2dldHhfc2lnbmVkXzY0LCAocHRyKSkKLS4KLSovIAotCi0vKgotRlVOQ1RJT04KLQliZmRfaF9wdXRfc2l6ZQotCWJmZF9oX2dldF9zaXplCi0KLURFU0NSSVBUSU9OCi0JVGhlc2UgbWFjcm9zIGhhdmUgdGhlIHNhbWUgZnVuY3Rpb24gYXMgdGhlaXIgPDxiZmRfZ2V0X3g+PgotCWJyZXRoZXJlbiwgZXhjZXB0IHRoYXQgdGhleSBhcmUgdXNlZCBmb3IgcmVtb3ZpbmcgaW5mb3JtYXRpb24KLQlmb3IgdGhlIGhlYWRlciByZWNvcmRzIG9mIG9iamVjdCBmaWxlcy4gQmVsaWV2ZSBpdCBvciBub3QsCi0Jc29tZSBvYmplY3QgZmlsZXMga2VlcCB0aGVpciBoZWFkZXIgcmVjb3JkcyBpbiBiaWcgZW5kaWFuCi0Jb3JkZXIgYW5kIHRoZWlyIGRhdGEgaW4gbGl0dGxlIGVuZGlhbiBvcmRlci4KLS4KLS57KiBCeXRlIHN3YXBwaW5nIG1hY3JvcyBmb3IgZmlsZSBoZWFkZXIgZGF0YS4gICp9Ci0uCi0uI2RlZmluZSBiZmRfaF9wdXRfOChhYmZkLCB2YWwsIHB0cikgXAotLgkJYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfOChhYmZkLCB2YWwsIHB0cikgXAotLgkJYmZkX3B1dF84IChhYmZkLCB2YWwsIHB0cikKLS4jZGVmaW5lIGJmZF9oX2dldF84KGFiZmQsIHB0cikgXAotLgkJYmZkX2dldF84IChhYmZkLCBwdHIpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzgoYWJmZCwgcHRyKSBcCi0uCQliZmRfZ2V0X3NpZ25lZF84IChhYmZkLCBwdHIpCi0uCi0uI2RlZmluZSBiZmRfaF9wdXRfMTYoYWJmZCwgdmFsLCBwdHIpIFwKLS4gICAgICAgICAgICAgICAgQkZEX1NFTkQoYWJmZCwgYmZkX2hfcHV0eDE2LCh2YWwscHRyKSkKLS4jZGVmaW5lIGJmZF9oX3B1dF9zaWduZWRfMTYgXAotLgkJIGJmZF9oX3B1dF8xNgotLiNkZWZpbmUgYmZkX2hfZ2V0XzE2KGFiZmQsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9nZXR4MTYsKHB0cikpCi0uI2RlZmluZSBiZmRfaF9nZXRfc2lnbmVkXzE2KGFiZmQsIHB0cikgXAotLgkJIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHhfc2lnbmVkXzE2LCAocHRyKSkKLS4KLS4jZGVmaW5lIGJmZF9oX3B1dF8zMihhYmZkLCB2YWwsIHB0cikgXAotLiAgICAgICAgICAgICAgICBCRkRfU0VORChhYmZkLCBiZmRfaF9wdXR4MzIsKHZhbCxwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF8zMiBcCi0uCQkgYmZkX2hfcHV0XzMyCi0uI2RlZmluZSBiZmRfaF9nZXRfMzIoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHgzMiwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfMzIoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfMzIsIChwdHIpKQotLgotLiNkZWZpbmUgYmZkX2hfcHV0XzY0KGFiZmQsIHZhbCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX3B1dHg2NCwodmFsLCBwdHIpKQotLiNkZWZpbmUgYmZkX2hfcHV0X3NpZ25lZF82NCBcCi0uCQkgYmZkX2hfcHV0XzY0Ci0uI2RlZmluZSBiZmRfaF9nZXRfNjQoYWJmZCwgcHRyKSBcCi0uICAgICAgICAgICAgICAgIEJGRF9TRU5EKGFiZmQsIGJmZF9oX2dldHg2NCwocHRyKSkKLS4jZGVmaW5lIGJmZF9oX2dldF9zaWduZWRfNjQoYWJmZCwgcHRyKSBcCi0uCQkgQkZEX1NFTkQoYWJmZCwgYmZkX2hfZ2V0eF9zaWduZWRfNjQsIChwdHIpKQotLgotKi8gCi0KLS8qIFNpZ24gZXh0ZW5zaW9uIHRvIGJmZF9zaWduZWRfdm1hLiAgKi8KLSNkZWZpbmUgQ09FUkNFMTYoeCkgKCgoYmZkX3NpZ25lZF92bWEpICh4KSBeIDB4ODAwMCkgLSAweDgwMDApCi0jZGVmaW5lIENPRVJDRTMyKHgpIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSkgKGxvbmcpICgoKHVuc2lnbmVkIGxvbmcpICh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkpCi0jZGVmaW5lIEVJR0hUX0dBWklMTElPTiAoKChCRkRfSE9TVF82NF9CSVQpMHg4MDAwMDAwMCkgPDwgMzIpCi0jZGVmaW5lIENPRVJDRTY0KHgpIFwKLSAgKCgoYmZkX3NpZ25lZF92bWEpICh4KSBeIEVJR0hUX0dBWklMTElPTikgLSBFSUdIVF9HQVpJTExJT04pCi0KLWJmZF92bWEKLWJmZF9nZXRiMTYgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICByZXR1cm4gKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0bDE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIChhZGRyWzFdIDw8IDgpIHwgYWRkclswXTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF8xNiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHJldHVybiBDT0VSQ0UxNigoYWRkclswXSA8PCA4KSB8IGFkZHJbMV0pOwotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGxfc2lnbmVkXzE2IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgcmV0dXJuIENPRVJDRTE2KChhZGRyWzFdIDw8IDgpIHwgYWRkclswXSk7Ci19Ci0KLXZvaWQKLWJmZF9wdXRiMTYgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gOCk7Ci0gIGFkZHJbMV0gPSAoYmZkX2J5dGUgKWRhdGE7Ci19Ci0KLXZvaWQKLWJmZF9wdXRsMTYgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsgICAgICAgICAgICAgCi0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotICBhZGRyWzBdID0gKGJmZF9ieXRlIClkYXRhOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+IDgpOwotfQotCi1iZmRfdm1hCi1iZmRfZ2V0YjMyIChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgdW5zaWduZWQgbG9uZyB2OwotCi0gIHYgPSAodW5zaWduZWQgbG9uZykgYWRkclswXSA8PCAyNDsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsxXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCA4OwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzNdOwotICByZXR1cm4gKGJmZF92bWEpIHY7Ci19Ci0KLWJmZF92bWEKLWJmZF9nZXRsMzIgKGFkZHIpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGJmZF9ieXRlICphZGRyOwotewotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgdiA9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzBdOwotICB2IHw9ICh1bnNpZ25lZCBsb25nKSBhZGRyWzFdIDw8IDg7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbM10gPDwgMjQ7Ci0gIHJldHVybiAoYmZkX3ZtYSkgdjsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRiX3NpZ25lZF8zMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF0gPDwgMjQ7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgMTY7Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMl0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXTsKLSAgcmV0dXJuIENPRVJDRTMyICh2KTsKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF8zMiAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgdjsKLQotICB2ID0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMF07Ci0gIHYgfD0gKHVuc2lnbmVkIGxvbmcpIGFkZHJbMV0gPDwgODsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclsyXSA8PCAxNjsKLSAgdiB8PSAodW5zaWduZWQgbG9uZykgYWRkclszXSA8PCAyNDsKLSAgcmV0dXJuIENPRVJDRTMyICh2KTsKLX0KLQotYmZkX3ZtYQotYmZkX2dldGI2NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0KLSAgaGlnaD0gKCgoKCgoKChhZGRyWzBdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbMV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbMl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzNdKSApOwotCi0gIGxvdyA9ICgoKCgoKCgoKGJmZF92bWEpYWRkcls0XSkgPDwgOCkgfAotICAgICAgICAgICAgICBhZGRyWzVdKSA8PCA4KSB8Ci0gICAgICAgICAgICBhZGRyWzZdKSA8PCA4KSB8Ci0gICAgICAgICAgYWRkcls3XSkpOwotCi0gIHJldHVybiBoaWdoIDw8IDMyIHwgbG93OwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotYmZkX3ZtYQotYmZkX2dldGw2NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gIGhpZ2g9ICgoKCgoKChhZGRyWzddIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkcls2XSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkcls1XSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbNF0pKTsKLQotICBsb3cgPSAoKCgoKCgoKGJmZF92bWEpYWRkclszXSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbMl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbMV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzBdKSApOwotCi0gIHJldHVybiBoaWdoIDw8IDMyIHwgbG93OwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLQotfQotCi1iZmRfc2lnbmVkX3ZtYQotYmZkX2dldGJfc2lnbmVkXzY0IChhZGRyKQotICAgICByZWdpc3RlciBjb25zdCBiZmRfYnl0ZSAqYWRkcjsKLXsKLSNpZmRlZiBCRkQ2NAotICBiZmRfdm1hIGxvdywgaGlnaDsKLQotICBoaWdoPSAoKCgoKCgoKGFkZHJbMF0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkclsxXSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkclsyXSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbM10pICk7Ci0KLSAgbG93ID0gKCgoKCgoKCgoYmZkX3ZtYSlhZGRyWzRdKSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbNV0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbNl0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzddKSk7Ci0KLSAgcmV0dXJuIENPRVJDRTY0KGhpZ2ggPDwgMzIgfCBsb3cpOwotI2Vsc2UKLSAgQkZEX0ZBSUwoKTsKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotYmZkX3NpZ25lZF92bWEKLWJmZF9nZXRsX3NpZ25lZF82NCAoYWRkcikKLSAgICAgcmVnaXN0ZXIgY29uc3QgYmZkX2J5dGUgKmFkZHI7Ci17Ci0jaWZkZWYgQkZENjQKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gIGhpZ2g9ICgoKCgoKChhZGRyWzddIDw8IDgpIHwKLSAgICAgICAgICAgICAgYWRkcls2XSkgPDwgOCkgfAotICAgICAgICAgICAgYWRkcls1XSkgPDwgOCkgfAotICAgICAgICAgIGFkZHJbNF0pKTsKLQotICBsb3cgPSAoKCgoKCgoKGJmZF92bWEpYWRkclszXSA8PCA4KSB8Ci0gICAgICAgICAgICAgIGFkZHJbMl0pIDw8IDgpIHwKLSAgICAgICAgICAgIGFkZHJbMV0pIDw8IDgpIHwKLSAgICAgICAgICBhZGRyWzBdKSApOwotCi0gIHJldHVybiBDT0VSQ0U2NChoaWdoIDw8IDMyIHwgbG93KTsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLXZvaWQKLWJmZF9wdXRiMzIgKGRhdGEsIGFkZHIpCi0gICAgIGJmZF92bWEgZGF0YTsKLSAgICAgcmVnaXN0ZXIgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gICAgICAgIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMjQpOwotICAgICAgICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+IDE2KTsKLSAgICAgICAgYWRkclsyXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAgOCk7Ci0gICAgICAgIGFkZHJbM10gPSAoYmZkX2J5dGUpZGF0YTsKLX0KLQotdm9pZAotYmZkX3B1dGwzMiAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgICAgICAgYWRkclswXSA9IChiZmRfYnl0ZSlkYXRhOwotICAgICAgICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+ICA4KTsKLSAgICAgICAgYWRkclsyXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAxNik7Ci0gICAgICAgIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gMjQpOwotfQotCi12b2lkCi1iZmRfcHV0YjY0IChkYXRhLCBhZGRyKQotICAgICBiZmRfdm1hIGRhdGE7Ci0gICAgIHJlZ2lzdGVyIGJmZF9ieXRlICphZGRyOwotewotI2lmZGVmIEJGRDY0Ci0gIGFkZHJbMF0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDcqOCkpOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+ICg2KjgpKTsKLSAgYWRkclsyXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNSo4KSk7Ci0gIGFkZHJbM10gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDQqOCkpOwotICBhZGRyWzRdID0gKGJmZF9ieXRlKShkYXRhID4+ICgzKjgpKTsKLSAgYWRkcls1XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMio4KSk7Ci0gIGFkZHJbNl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDEqOCkpOwotICBhZGRyWzddID0gKGJmZF9ieXRlKShkYXRhID4+ICgwKjgpKTsKLSNlbHNlCi0gIEJGRF9GQUlMKCk7Ci0jZW5kaWYKLX0KLQotdm9pZAotYmZkX3B1dGw2NCAoZGF0YSwgYWRkcikKLSAgICAgYmZkX3ZtYSBkYXRhOwotICAgICByZWdpc3RlciBiZmRfYnl0ZSAqYWRkcjsKLXsKLSNpZmRlZiBCRkQ2NAotICBhZGRyWzddID0gKGJmZF9ieXRlKShkYXRhID4+ICg3KjgpKTsKLSAgYWRkcls2XSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoNio4KSk7Ci0gIGFkZHJbNV0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDUqOCkpOwotICBhZGRyWzRdID0gKGJmZF9ieXRlKShkYXRhID4+ICg0KjgpKTsKLSAgYWRkclszXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMyo4KSk7Ci0gIGFkZHJbMl0gPSAoYmZkX2J5dGUpKGRhdGEgPj4gKDIqOCkpOwotICBhZGRyWzFdID0gKGJmZF9ieXRlKShkYXRhID4+ICgxKjgpKTsKLSAgYWRkclswXSA9IChiZmRfYnl0ZSkoZGF0YSA+PiAoMCo4KSk7Ci0jZWxzZQotICBCRkRfRkFJTCgpOwotI2VuZGlmCi19Ci0MCi0vKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgICBpZiAoY291bnQgPT0gMCkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKChiZmRfc2l6ZV90eXBlKShvZmZzZXQrY291bnQpID4gc2VjdGlvbi0+X3Jhd19zaXplCi0gICAgICAgIHx8IGJmZF9zZWVrKGFiZmQsIChmaWxlX3B0cikoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSA9PSAtMQotICAgICAgICB8fCBiZmRfcmVhZChsb2NhdGlvbiwgKGJmZF9zaXplX3R5cGUpMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgICAgICByZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLSAgICByZXR1cm4gKHRydWUpOwotfQotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IChhYmZkLCBzZWN0aW9uLCB3LCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYmZkX3dpbmRvdyAqdzsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotI2lmZGVmIFVTRV9NTUFQCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoYWJmZC0+eHZlYy0+X2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAhPSBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMpCi0gICAgewotICAgICAgLyogV2UgZG9uJ3Qga25vdyB3aGF0IGNoYW5nZXMgdGhlIGJmZCdzIGdldF9zZWN0aW9uX2NvbnRlbnRzCi0JIG1ldGhvZCBtYXkgaGF2ZSB0byBtYWtlLiAgU28gcHVudCB0cnlpbmcgdG8gbWFwIHRoZSBmaWxlCi0JIHdpbmRvdywgYW5kIGxldCBnZXRfc2VjdGlvbl9jb250ZW50cyBkbyBpdHMgdGhpbmcuICAqLwotICAgICAgLyogQEAgRklYTUUgOiBJZiB0aGUgaW50ZXJuYWwgd2luZG93IGhhcyBhIHJlZmNvdW50IG9mIDEgYW5kIHdhcwotCSBhbGxvY2F0ZWQgd2l0aCBtYWxsb2MgaW5zdGVhZCBvZiBtbWFwLCBqdXN0IHJldXNlIGl0LiAgKi8KLSAgICAgIGJmZF9mcmVlX3dpbmRvdyAodyk7Ci0gICAgICB3LT5pID0gKGJmZF93aW5kb3dfaW50ZXJuYWwgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkX3dpbmRvd19pbnRlcm5hbCkpOwotICAgICAgaWYgKHctPmkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB3LT5pLT5kYXRhID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgY291bnQpOwotICAgICAgaWYgKHctPmktPmRhdGEgPT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3LT5pKTsKLQkgIHctPmkgPSBOVUxMOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHctPmktPm1hcHBlZCA9IDA7Ci0gICAgICB3LT5pLT5yZWZjb3VudCA9IDE7Ci0gICAgICB3LT5zaXplID0gdy0+aS0+c2l6ZSA9IGNvdW50OwotICAgICAgdy0+ZGF0YSA9IHctPmktPmRhdGE7Ci0gICAgICByZXR1cm4gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCB3LT5kYXRhLCBvZmZzZXQsIGNvdW50KTsKLSAgICB9Ci0gIGlmICgoYmZkX3NpemVfdHlwZSkgKG9mZnNldCtjb3VudCkgPiBzZWN0aW9uLT5fcmF3X3NpemUKLSAgICAgIHx8IChiZmRfZ2V0X2ZpbGVfd2luZG93IChhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0LCBjb3VudCwgdywgdHJ1ZSkKLQkgID09IGZhbHNlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgYWJvcnQgKCk7Ci0jZW5kaWYKLX0KLQotLyogVGhpcyBnZW5lcmljIGZ1bmN0aW9uIGNhbiBvbmx5IGJlIHVzZWQgaW4gaW1wbGVtZW50YXRpb25zIHdoZXJlIGNyZWF0aW5nCi0gICBORVcgc2VjdGlvbnMgaXMgZGlzYWxsb3dlZC4gIEl0IGlzIHVzZWZ1bCBpbiBwYXRjaGluZyBleGlzdGluZyBzZWN0aW9ucwotICAgaW4gcmVhZC13cml0ZSBmaWxlcywgdGhvdWdoLiAgU2VlIG90aGVyIHNldF9zZWN0aW9uX2NvbnRlbnRzIGZ1bmN0aW9ucwotICAgdG8gc2VlIHdoeSBpdCBkb2Vzbid0IHdvcmsgZm9yIG5ldyBzZWN0aW9ucy4gICovCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAoc2VjdGlvbi0+ZmlsZXBvcyArIG9mZnNldCksIFNFRUtfU0VUKSA9PSAtMQotICAgICAgfHwgYmZkX3dyaXRlIChsb2NhdGlvbiwgKGJmZF9zaXplX3R5cGUpIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9sb2cyCi0KLVNZTk9QU0lTCi0JdW5zaWduZWQgaW50IGJmZF9sb2cyKGJmZF92bWEgeCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRoZSBsb2cgYmFzZSAyIG9mIHRoZSB2YWx1ZSBzdXBwbGllZCwgcm91bmRlZCB1cC4gIEUuZy4sIGFuCi0JQHZhcnt4fSBvZiAxMDI1IHJldHVybnMgMTEuCi0qLwotCi11bnNpZ25lZCBpbnQKLWJmZF9sb2cyICh4KQotICAgICBiZmRfdm1hIHg7Ci17Ci0gIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOwotCi0gIHdoaWxlICgoKChiZmRfdm1hKSAxKSA8PCByZXN1bHQpIDwgeCkKLSAgICArK3Jlc3VsdDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbGVhbgotYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjaGFyIGxvY2Fsc19wcmVmaXggPSAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSA9PSAnXycpID8gJ0wnIDogJy4nOwotCi0gIHJldHVybiAobmFtZVswXSA9PSBsb2NhbHNfcHJlZml4KTsKLX0KLQotLyogIENhbiBiZSB1c2VkIGZyb20gLyBmb3IgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgdG8gY2hlY2sgdGhhdAotICAgIGVuZGlhbm5lc3MgbWF0Y2hlcyBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQgZmlsZS4gIFJldHVybnMKLSAgICB0cnVlIGZvciBhIG1hdGNoLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgZW1pdHMgYW4gZXJyb3IuICAqLwotYm9vbGVhbgotX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBpZiAoaWJmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IG9iZmQtPnh2ZWMtPmJ5dGVvcmRlcgotICAgICAgJiYgb2JmZC0+eHZlYy0+Ynl0ZW9yZGVyICE9IEJGRF9FTkRJQU5fVU5LTk9XTikKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoIiVzOiBjb21waWxlZCBmb3IgYSAlcyBlbmRpYW4gc3lzdGVtIGFuZCB0YXJnZXQgaXMgJXMgZW5kaWFuIiwKLQkgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksCi0JIGJmZF9iaWdfZW5kaWFuIChpYmZkKSA/ICJiaWciIDogImxpdHRsZSIsCi0JIGJmZF9iaWdfZW5kaWFuIChvYmZkKSA/ICJiaWciIDogImxpdHRsZSIpOwotCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvbGliYmZkLmggYi9iZmQvbGliYmZkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjBhMTUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmJmZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODk0ICswLDAgQEAKLS8qIGxpYmJmZC5oIC0tIERlY2xhcmF0aW9ucyB1c2VkIGJ5IGJmZCBsaWJyYXJ5ICppbXBsZW1lbnRhdGlvbiouCi0gICAoVGhpcyBpbmNsdWRlIGZpbGUgaXMgbm90IGZvciB1c2VycyBvZiB0aGUgbGlicmFyeS4pCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmJmZC5oIGlzIGEgR0VORVJBVEVEIGZpbGUuICBEb24ndCBjaGFuZ2UgaXQ7IGluc3RlYWQsCi0qKiBjaGFuZ2UgbGliYmZkLWluLmggb3IgdGhlIG90aGVyIEJGRCBzb3VyY2UgZmlsZXMgcHJvY2Vzc2VkIHRvCi0qKiBnZW5lcmF0ZSB0aGlzIGZpbGUuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQWxpZ24gYW4gYWRkcmVzcyB1cHdhcmQgdG8gYSBib3VuZGFyeSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICAgRS5nLiBhbGlnbiB0byBhbiA4LWJ5dGUgYm91bmRhcnkgd2l0aCBhcmd1bWVudCBvZiA4LiAgVGFrZSBjYXJlIG5ldmVyCi0gICB0byB3cmFwIGFyb3VuZCBpZiB0aGUgYWRkcmVzcyBpcyB3aXRoaW4gYm91bmRhcnktMSBvZiB0aGUgZW5kIG9mIHRoZQotICAgYWRkcmVzcyBzcGFjZS4gICovCi0jZGVmaW5lIEJGRF9BTElHTih0aGlzLCBib3VuZGFyeSkJCQkJCVwKLSAgKCgoKGJmZF92bWEpICh0aGlzKSArIChib3VuZGFyeSkgLSAxKSA+PSAoYmZkX3ZtYSkgKHRoaXMpKQkJXAotICAgPyAoKChiZmRfdm1hKSAodGhpcykgKyAoKGJvdW5kYXJ5KSAtIDEpKSAmICh+KChib3VuZGFyeSktMSkpKQlcCi0gICA6IH4gKGJmZF92bWEpIDApCi0KLS8qIElmIHlvdSB3YW50IHRvIHJlYWQgYW5kIHdyaXRlIGxhcmdlIGJsb2NrcywgeW91IG1pZ2h0IHdhbnQgdG8gZG8gaXQKLSAgIGluIHF1YW50YSBvZiB0aGlzIGFtb3VudCAqLwotI2RlZmluZSBERUZBVUxUX0JVRkZFUlNJWkUgODE5MgotCi0vKiBTZXQgYSB0ZGF0YSBmaWVsZC4gIENhbid0IHVzZSB0aGUgb3RoZXIgbWFjcm9zIGZvciB0aGlzLCBzaW5jZSB0aGV5Ci0gICBkbyBjYXN0cywgYW5kIGNhc3RpbmcgdG8gdGhlIGxlZnQgb2YgYXNzaWdubWVudCBpc24ndCBwb3J0YWJsZS4gICovCi0jZGVmaW5lIHNldF90ZGF0YShiZmQsIHYpICgoYmZkKS0+dGRhdGEuYW55ID0gKFBUUikgKHYpKQotCi0vKiBJZiBCRkRfSU5fTUVNT1JZIGlzIHNldCBmb3IgYSBCRkQsIHRoZW4gdGhlIGlvc3RyZWFtIGZpZWxkcyBwb2ludHMKLSAgIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGJmZF9pbl9tZW1vcnkKLXsKLSAgLyogU2l6ZSBvZiBidWZmZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIC8qIEJ1ZmZlciBob2xkaW5nIGNvbnRlbnRzIG9mIEJGRC4gICovCi0gIGJmZF9ieXRlICpidWZmZXI7Ci19OwotCi0vKiB0ZGF0YSBmb3IgYW4gYXJjaGl2ZS4gIEZvciBhbiBpbnB1dCBhcmNoaXZlLCBjYWNoZQotICAgbmVlZHMgdG8gYmUgZnJlZSgpJ2QuICBGb3IgYW4gb3V0cHV0IGFyY2hpdmUsIHN5bWRlZnMgZG8uICAqLwotCi1zdHJ1Y3QgYXJ0ZGF0YSB7Ci0gIGZpbGVfcHRyIGZpcnN0X2ZpbGVfZmlsZXBvczsKLSAgLyogU3BlZWQgdXAgc2VhcmNoaW5nIHRoZSBhcm1hcCAqLwotICBzdHJ1Y3QgYXJfY2FjaGUgKmNhY2hlOwotICBiZmQgKmFyY2hpdmVfaGVhZDsgICAgICAgICAgICAvKiBPbmx5IGludGVyZXN0aW5nIGluIG91dHB1dCByb3V0aW5lcyAqLwotICBjYXJzeW0gKnN5bWRlZnM7CQkvKiB0aGUgc3ltZGVmIGVudHJpZXMgKi8KLSAgc3ltaW5kZXggc3ltZGVmX2NvdW50OyAgICAgICAgICAgICAvKiBob3cgbWFueSB0aGVyZSBhcmUgKi8KLSAgY2hhciAqZXh0ZW5kZWRfbmFtZXM7CQkvKiBjbGV2ZXIgaW50ZWwgZXh0ZW5zaW9uICovCi0gIC8qIHdoZW4gbW9yZSBjb21waWxlcnMgYXJlIHN0YW5kYXJkIEMsIHRoaXMgY2FuIGJlIGEgdGltZV90ICovCi0gIGxvbmcgIGFybWFwX3RpbWVzdGFtcDsJLyogVGltZXN0YW1wIHZhbHVlIHdyaXR0ZW4gaW50byBhcm1hcC4KLQkJCQkgICBUaGlzIGlzIHVzZWQgZm9yIEJTRCBhcmNoaXZlcyB0byBjaGVjawotCQkJCSAgIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyByZWNlbnQgZW5vdWdoCi0JCQkJICAgZm9yIHRoZSBCU0QgbGlua2VyIHRvIG5vdCBjb21wbGFpbiwKLQkJCQkgICBqdXN0IGJlZm9yZSB3ZSBmaW5pc2ggd3JpdGluZyBhbgotCQkJCSAgIGFyY2hpdmUuICAqLwotICBmaWxlX3B0ciBhcm1hcF9kYXRlcG9zOwkvKiBQb3NpdGlvbiB3aXRoaW4gYXJjaGl2ZSB0byBzZWVrIHRvCi0JCQkJICAgcmV3cml0ZSB0aGUgZGF0ZSBmaWVsZC4gICovCi0gIFBUUiB0ZGF0YTsJCQkvKiBCYWNrZW5kIHNwZWNpZmljIGluZm9ybWF0aW9uLiAgKi8KLX07Ci0KLSNkZWZpbmUgYmZkX2FyZGF0YShiZmQpICgoYmZkKS0+dGRhdGEuYW91dF9hcl9kYXRhKQotCi0vKiBHb2VzIGluIGJmZCdzIGFyZWx0X2RhdGEgc2xvdCAqLwotc3RydWN0IGFyZWx0ZGF0YSB7Ci0gIGNoYXIgKiBhcmNoX2hlYWRlcjsJCQkgICAgIC8qIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcgKi8KLSAgdW5zaWduZWQgaW50IHBhcnNlZF9zaXplOyAgICAgLyogb2N0ZXRzIG9mIGZpbGVzaXplIG5vdCBpbmNsdWRpbmcgYXJfaGRyICovCi0gIGNoYXIgKmZpbGVuYW1lOwkJCSAgICAgLyogbnVsbC10ZXJtaW5hdGVkICovCi19OwotCi0jZGVmaW5lIGFyZWx0X3NpemUoYmZkKSAoKChzdHJ1Y3QgYXJlbHRkYXRhICopKChiZmQpLT5hcmVsdF9kYXRhKSktPnBhcnNlZF9zaXplKQotCi1leHRlcm4gUFRSIGJmZF9tYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF9yZWFsbG9jIFBBUkFNUyAoKFBUUiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1leHRlcm4gYmZkX2Vycm9yX2hhbmRsZXJfdHlwZSBfYmZkX2Vycm9yX2hhbmRsZXI7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFsbG9jYXRlIGFuZCBmcmVlIHRoaW5ncyBvbiB0aGUgQkZEJ3Mgb2JqYWxsb2MuICAqLwotCi1leHRlcm4gUFRSIGJmZF9hbGxvYyBQQVJBTVMgKChiZmQgKiwgc2l6ZV90KSk7Ci1leHRlcm4gUFRSIGJmZF96YWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgYmZkX3JlbGVhc2UgUEFSQU1TICgoYmZkICosIFBUUikpOwotCi1iZmQgKglfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgUEFSQU1TICgoYmZkICpvYmZkKSk7Ci1iZmQgKglfYmZkX2xvb2tfZm9yX2JmZF9pbl9jYWNoZSBQQVJBTVMgKChiZmQgKmFyY2hfYmZkLCBmaWxlX3B0ciBpbmRleCkpOwotYm9vbGVhbiBfYmZkX2FkZF9iZmRfdG9fYXJjaGl2ZV9jYWNoZSBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIsIGJmZCAqKSk7Ci1ib29sZWFuCV9iZmRfZ2VuZXJpY19ta2FyY2hpdmUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpiZmRfZ2VuZXJpY19hcmNoaXZlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuCWJmZF9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4gYmZkX3NsdXJwX2JzZF9hcm1hcF9mMiBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgYmZkX3NsdXJwX2JzZF9hcm1hcCBiZmRfc2x1cnBfYXJtYXAKLSNkZWZpbmUgYmZkX3NsdXJwX2NvZmZfYXJtYXAgYmZkX3NsdXJwX2FybWFwCi1ib29sZWFuCV9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKikpOwotYm9vbGVhbglfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIF9iZmRfY29tcHV0ZV9hbmRfd3JpdGVfYXJtYXAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCBlbGVuZ3RoKSk7Ci1iZmQgKl9iZmRfZ2V0X2VsdF9hdF9maWxlcG9zIFBBUkFNUyAoKGJmZCAqYXJjaGl2ZSwgZmlsZV9wdHIgZmlsZXBvcykpOwotZXh0ZXJuIGJmZCAqX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXggUEFSQU1TICgoYmZkICosIHN5bWluZGV4KSk7Ci1iZmQgKiBfYmZkX25ld19iZmQgUEFSQU1TICgodm9pZCkpOwotCi1ib29sZWFuCWJmZF9mYWxzZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotYm9vbGVhbgliZmRfdHJ1ZSBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotUFRSCWJmZF9udWxsdm9pZHB0ciBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotaW50CWJmZF8wIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci11bnNpZ25lZCBpbnQJYmZkXzB1IFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci1sb25nCWJmZF8wbCBQQVJBTVMgKChiZmQgKmlnbm9yZSkpOwotbG9uZwlfYmZkX24xIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci12b2lkCWJmZF92b2lkIFBBUkFNUyAoKGJmZCAqaWdub3JlKSk7Ci0KLWJmZCAqX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiBQQVJBTVMgKChiZmQgKikpOwotY29uc3QgYmZkX3RhcmdldCAqX2JmZF9kdW1teV90YXJnZXQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXZvaWQJYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lIFBBUkFNUyAoKGJmZCAqYWJmZCwgQ09OU1QgY2hhciAqZmlsZW5hbWUsCi0JCQkJCWNoYXIgKmhkcikpOwotdm9pZAliZmRfYnNkX3RydW5jYXRlX2FybmFtZSBQQVJBTVMgKChiZmQgKmFiZmQsIENPTlNUIGNoYXIgKmZpbGVuYW1lLAotCQkJCQljaGFyICpoZHIpKTsKLXZvaWQJYmZkX2dudV90cnVuY2F0ZV9hcm5hbWUgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpmaWxlbmFtZSwKLQkJCQkJY2hhciAqaGRyKSk7Ci0KLWJvb2xlYW4JYnNkX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICBzdHJ1Y3Qgb3JsICptYXAsIHVuc2lnbmVkIGludCBvcmxfY291bnQsIGludCBzdHJpZHgpKTsKLQotYm9vbGVhbgljb2ZmX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqYXJjaCwgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0JCQkJICAgc3RydWN0IG9ybCAqbWFwLCB1bnNpZ25lZCBpbnQgb3JsX2NvdW50LCBpbnQgc3RyaWR4KSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLWV4dGVybiBQVFIgX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyX21hZyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLWJmZCAqCWJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBQQVJBTVMgKChiZmQgKmFyY2hpdmUsCi0JCQkJCQkgICAgIGJmZCAqbGFzdF9maWxlKSk7Ci0KLWludAliZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0KLSNkZWZpbmUgX2JmZF9yZWFkX2FyX2hkcihhYmZkKSBcCi0gIEJGRF9TRU5EIChhYmZkLCBfYmZkX3JlYWRfYXJfaGRyX2ZuLCAoYWJmZCkpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfR0VORVJJQy4gIFVzZQotICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKS4gICovCi0KLSNkZWZpbmUgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwIGJmZF90cnVlCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbyBiZmRfdHJ1ZQotI2RlZmluZSBfYmZkX2dlbmVyaWNfbmV3X3NlY3Rpb25faG9vayBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKSkgYmZkX3RydWUpCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIgb2Zmc2V0LAotCSAgIGJmZF9zaXplX3R5cGUgY291bnQpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF93aW5kb3cgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogR2VuZXJpYyByb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUFkuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYykuICAqLwotCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGJmZCAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgZmxhZ3dvcmQpKSkgYmZkX3RydWUpCi0jZGVmaW5lIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF90cnVlKQotI2RlZmluZSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkICosIGFzeW1ib2wgKikpKSBiZmRfdHJ1ZSkKLSNkZWZpbmUgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSKSkpIGJmZF90cnVlKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0NPUkUgd2hlbiB0aGVyZSBpcyBubyBjb3JlIGZpbGUKLSAgIHN1cHBvcnQuICBVc2UgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLiAgKi8KLQotZXh0ZXJuIGNoYXIgKl9iZmRfbm9jb3JlX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBpbnQgX2JmZF9ub2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX25vY29yZV9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLSAgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSB3aGVuIHRoZXJlIGlzIG5vIGFyY2hpdmUKLSAgIGZpbGUgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSkuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3NsdXJwX2FybWFwIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF9mYWxzZQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9hcmNoaXZlX3RydW5jYXRlX2FybmFtZSBcCi0gICgodm9pZCAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV93cml0ZV9hcm1hcCBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwgdW5zaWduZWQgaW50LCBpbnQpKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9yZWFkX2FyX2hkciBiZmRfbnVsbHZvaWRwdHIKLSNkZWZpbmUgX2JmZF9ub2FyY2hpdmVfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkICopKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZXRfZWx0X2F0X2luZGV4IFwKLSAgKChiZmQgKigqKSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKSkgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX25vYXJjaGl2ZV91cGRhdGVfYXJtYXBfdGltZXN0YW1wIGJmZF9mYWxzZQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgdG8gZ2V0IEJTRCBzdHlsZQotICAgYXJjaGl2ZXMuICBVc2UgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9hcmNoaXZlX2JzZCkuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9ic2Rfc2x1cnBfYXJtYXAgYmZkX3NsdXJwX2JzZF9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9ic2RfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiosIGJmZF9zaXplX3R5cGUgKiwgY29uc3QgY2hhciAqKikpOwotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3RydW5jYXRlX2FybmFtZSBiZmRfYnNkX3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3dyaXRlX2FybWFwIGJzZF93cml0ZV9hcm1hcAotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfYnNkX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2JzZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2FyY2hpdmVfYnNkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgUEFSQU1TICgoYmZkICopKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIHRvIGdldCBDT0ZGIHN0eWxlCi0gICBhcmNoaXZlcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX2FyY2hpdmVfY29mZikuICAqLwotCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2FybWFwIGJmZF9zbHVycF9jb2ZmX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgXAotICBfYmZkX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUKLWV4dGVybiBib29sZWFuIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0gIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqLCBiZmRfc2l6ZV90eXBlICosIGNvbnN0IGNoYXIgKiopKTsKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfdHJ1bmNhdGVfYXJuYW1lIGJmZF9kb250X3RydW5jYXRlX2FybmFtZQotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl93cml0ZV9hcm1hcCBjb2ZmX3dyaXRlX2FybWFwCi0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgXAotICBiZmRfZ2VuZXJpY19vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUKLSNkZWZpbmUgX2JmZF9hcmNoaXZlX2NvZmZfZ2V0X2VsdF9hdF9pbmRleCBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBfYmZkX2FyY2hpdmVfY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgXAotICBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0Ci0jZGVmaW5lIF9iZmRfYXJjaGl2ZV9jb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIHdoZXJlIHRoZXJlIGlzIG5vIHN5bWJvbAotICAgc3VwcG9ydC4gIFVzZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19nZXRfc3ltdGFiIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19tYWtlX2VtcHR5X3N5bWJvbCBcCi0gICgoYXN5bWJvbCAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfcHJpbnRfc3ltYm9sIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpKSBiZmRfdm9pZCkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqLCBzeW1ib2xfaW5mbyAqKSkpIGJmZF92b2lkKQotI2RlZmluZSBfYmZkX25vc3ltYm9sc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpKSBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8gXAotICAoKGFsZW50ICooKikgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX2ZpbmRfbmVhcmVzdF9saW5lIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosIFwKLQkgICAgIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSkpIFwKLSAgIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sIFwKLSAgKChhc3ltYm9sICooKikgUEFSQU1TICgoYmZkICosIFBUUiwgdW5zaWduZWQgbG9uZykpKSBiZmRfbnVsbHZvaWRwdHIpCi0jZGVmaW5lIF9iZmRfbm9zeW1ib2xzX3JlYWRfbWluaXN5bWJvbHMgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIgKiwgdW5zaWduZWQgaW50ICopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wgXAotICAoKGFzeW1ib2wgKigqKSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgY29uc3QgUFRSLCBhc3ltYm9sICopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotCi0vKiBSb3V0aW5lcyB0byB1c2UgZm9yIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyB3aGVuIHRoZXJlIGlzIG5vIHJlbG9jCi0gICBzdXBwb3J0LiAgVXNlIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcykuICAqLwotCi0jZGVmaW5lIF9iZmRfbm9yZWxvY3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBfYmZkX24xKQotI2RlZmluZSBfYmZkX25vcmVsb2NzX2Nhbm9uaWNhbGl6ZV9yZWxvYyBcCi0gICgobG9uZyAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKSkgX2JmZF9uMSkKLSNkZWZpbmUgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgXAotICAoKHJlbG9jX2hvd3RvX3R5cGUgKigqKSBQQVJBTVMgKChiZmQgKiwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSkpIFwKLSAgIGJmZF9udWxsdm9pZHB0cikKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9XUklURSBmb3IgdGFyZ2V0cyB3aGljaCBtYXkgbm90Ci0gICBiZSB3cml0dGVuLiAgVXNlIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX25vd3JpdGUpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vd3JpdGVfc2V0X2FyY2hfbWFjaCBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm93cml0ZV9zZXRfc2VjdGlvbl9jb250ZW50cyBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKSkgXAotICAgYmZkX2ZhbHNlKQotCi0vKiBHZW5lcmljIHJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfV1JJVEUuICBVc2UKLSAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX2dlbmVyaWNfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotLyogUm91dGluZXMgdG8gdXNlIGZvciBCRkRfSlVNUF9UQUJMRV9MSU5LIGZvciB0YXJnZXRzIHdoaWNoIGRvIG5vdAotICAgc3VwcG9ydCBsaW5raW5nLiAgVXNlIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKS4gICovCi0KLSNkZWZpbmUgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMgKChpbnQgKCopIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSkpIGJmZF8wKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgKChiZmRfYnl0ZSAqKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosIFwKLQkgICAgIGJmZF9ieXRlICosIGJvb2xlYW4sIGFzeW1ib2wgKiopKSkgXAotICAgYmZkX251bGx2b2lkcHRyKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfcmVsYXhfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgXAotICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSkgXAotICAgYmZkX2ZhbHNlKQotI2RlZmluZSBfYmZkX25vbGlua19iZmRfZ2Nfc2VjdGlvbnMgXAotICAoKGJvb2xlYW4gKCopIFwKLSAgICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpKSBcCi0gICBiZmRfZmFsc2UpCi0jZGVmaW5lIF9iZmRfbm9saW5rX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIFwKLSAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKCopIFBBUkFNUyAoKGJmZCAqKSkpIGJmZF9udWxsdm9pZHB0cikKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfYWRkX3N5bWJvbHMgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2ZpbmFsX2xpbmsgXAotICAoKGJvb2xlYW4gKCopIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSkpIGJmZF9mYWxzZSkKLSNkZWZpbmUgX2JmZF9ub2xpbmtfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBcCi0gICgoYm9vbGVhbiAoKikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpKSBiZmRfZmFsc2UpCi0KLS8qIFJvdXRpbmVzIHRvIHVzZSBmb3IgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyBmb3IgdGFyZ2V0cyB3aGljaCBkbyBub3QKLSAgIGhhdmUgZHluYW1pYyBzeW1ib2xzIG9yIHJlbG9jcy4gIFVzZSBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDCi0gICAoX2JmZF9ub2R5bmFtaWMpLiAgKi8KLQotI2RlZmluZSBfYmZkX25vZHluYW1pY19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9uMQotI2RlZmluZSBfYmZkX25vZHluYW1pY19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0jZGVmaW5lIF9iZmRfbm9keW5hbWljX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIF9iZmRfbjEKLSNkZWZpbmUgX2JmZF9ub2R5bmFtaWNfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIF9iZmRfbjEpCi0MCi0vKiBHZW5lcmljIHJvdXRpbmUgdG8gZGV0ZXJtaW5lIG9mIHRoZSBnaXZlbiBzeW1ib2wgaXMgYSBsb2NhbAotICAgbGFiZWwuICAqLwotZXh0ZXJuIGJvb2xlYW4gYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEdlbmVyaWMgbWluaXN5bWJvbCByb3V0aW5lcy4gICovCi1leHRlcm4gbG9uZyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgUFRSICosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBjb25zdCBQVFIsIGFzeW1ib2wgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgLnN0YWIvLnN0YWJzdHIgc2VjdGlvbnMuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdGFiX3NlY3Rpb25fZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGFzZWN0aW9uICosIGJmZF92bWEsIGJvb2xlYW4gKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKiwgUFRSICopKTsKLQotLyogRmluZCB0aGUgbmVhZGVyc3QgbGluZSB1c2luZyBEV0FSRiAxIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2R3YXJmMV9maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqKiwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotCi0vKiBGaW5kIHRoZSBuZWFyZXN0IGxpbmUgdXNpbmcgRFdBUkYgMiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFzeW1ib2wgKiosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgY2hhciAqKiwgdW5zaWduZWQgaW50ICopKTsKLQotLyogQSByb3V0aW5lIHRvIGNyZWF0ZSBlbnRyaWVzIGZvciBhIGJmZF9saW5rX2hhc2hfdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5LAotCSAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci0KLS8qIEluaXRpYWxpemUgYSBiZmRfbGlua19oYXNoX3RhYmxlLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotCi0vKiBHZW5lcmljIGxpbmsgaGFzaCB0YWJsZSBjcmVhdGlvbiByb3V0aW5lLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLQotLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogR2VuZXJpYyBhZGQgc3ltYm9sIHJvdXRpbmUuICBUaGlzIHZlcnNpb24gaXMgdXNlZCBieSB0YXJnZXRzIGZvcgotICAgd2hpY2ggdGhlIGxpbmtlciBtdXN0IGNvbGxlY3QgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBieSBuYW1lLAotICAgYXMgdGhlIGNvbGxlY3QyIHByb2dyYW0gZG9lcy4gICovCi1leHRlcm4gYm9vbGVhbiBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9sc19jb2xsZWN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgYXJjaGl2ZSBhZGQgc3ltYm9sIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkgICBib29sZWFuICgqY2hlY2tmbikgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKSk7Ci0KLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIHRvIGF2b2lkIHByb3RvdHlwZSBlcnJvcnMuICAqLwotdHlwZWRlZiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSBfYmZkX2xpbmtfaGFzaF9lbnRyeTsKLQotLyogR2VuZXJpYyByb3V0aW5lIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKm5hbWUsIGZsYWd3b3JkLAotCSAgIGFzZWN0aW9uICosIGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjb3B5LAotCSAgIGJvb2xlYW4gY29uc3RydWN0b3IsIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci0KLS8qIEdlbmVyaWMgbGluayByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBzZWMgKikpOwotCi0vKiBHZW5lcmljIHJlbG9jX2xpbmtfb3JkZXIgcHJvY2Vzc2luZyByb3V0aW5lLiAgKi8KLWV4dGVybiBib29sZWFuIF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSk7Ci0KLS8qIERlZmF1bHQgbGluayBvcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotLyogQ291bnQgdGhlIG51bWJlciBvZiByZWxvYyBlbnRyaWVzIGluIGEgbGluayBvcmRlciBsaXN0LiAgKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgX2JmZF9jb3VudF9saW5rX29yZGVyX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0vKiBGaW5hbCBsaW5rIHJlbG9jYXRpb24gcm91dGluZS4gICovCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZQotICBQQVJBTVMgKChyZWxvY19ob3d0b190eXBlICosIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqLAotCSAgIGJmZF92bWEgYWRkcmVzcywgYmZkX3ZtYSB2YWx1ZSwgYmZkX3ZtYSBhZGRlbmQpKTsKLQotLyogUmVsb2NhdGUgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGJ5IGEgaG93dG8gYW5kIGEgdmFsdWUuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzCi0gIFBBUkFNUyAoKHJlbG9jX2hvd3RvX3R5cGUgKiwgYmZkICosIGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotLyogTGluayBzdGFicyBpbiBzZWN0aW9ucyBpbiB0aGUgZmlyc3QgcGFzcy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfbGlua19zZWN0aW9uX3N0YWJzCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIgKiwgYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwgUFRSICopKTsKLQotLyogV3JpdGUgb3V0IHRoZSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc2VjdGlvbl9zdGFicwotICBQQVJBTVMgKChiZmQgKiwgUFRSICosIGFzZWN0aW9uICosIFBUUiAqLCBiZmRfYnl0ZSAqKSk7Ci0KLS8qIFdyaXRlIG91dCB0aGUgLnN0YWJzdHIgc3RyaW5nIHRhYmxlIHdoZW4gbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfd3JpdGVfc3RhYl9zdHJpbmdzIFBBUkFNUyAoKGJmZCAqLCBQVFIgKikpOwotCi0vKiBGaW5kIGFuIG9mZnNldCB3aXRoaW4gYSAuc3RhYiBzZWN0aW9uIHdoZW4gbGlua2luZyBzdGFicyBpbgotICAgc2VjdGlvbnMuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBfYmZkX3N0YWJfc2VjdGlvbl9vZmZzZXQKLSAgUEFSQU1TICgoYmZkICosIFBUUiAqLCBhc2VjdGlvbiAqLCBQVFIgKiwgYmZkX3ZtYSkpOwotCi0vKiBDcmVhdGUgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKl9iZmRfc3RyaW5ndGFiX2luaXQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBDcmVhdGUgYW4gWENPRkYgLmRlYnVnIHNlY3Rpb24gc3R5bGUgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICpfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRnJlZSBhIHN0cmluZyB0YWJsZS4gICovCi1leHRlcm4gdm9pZCBfYmZkX3N0cmluZ3RhYl9mcmVlIFBBUkFNUyAoKHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKikpOwotCi0vKiBHZXQgdGhlIHNpemUgb2YgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJmZF9zaXplX3R5cGUgX2JmZF9zdHJpbmd0YWJfc2l6ZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICopKTsKLQotLyogQWRkIGEgc3RyaW5nIHRvIGEgc3RyaW5nIHRhYmxlLiAgKi8KLWV4dGVybiBiZmRfc2l6ZV90eXBlIF9iZmRfc3RyaW5ndGFiX2FkZAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX3N0cnRhYl9oYXNoICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBoYXNoLAotCSAgIGJvb2xlYW4gY29weSkpOwotCi0vKiBXcml0ZSBvdXQgYSBzdHJpbmcgdGFibGUuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zdHJpbmd0YWJfZW1pdCBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqKSk7Ci0KLS8qIENoZWNrIHRoYXQgZW5kaWFubmVzcyBvZiBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgbWF0Y2guICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9nZW5lcmljX3ZlcmlmeV9lbmRpYW5fbWF0Y2ggUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0MCi0vKiBNYWNyb3MgdG8gdGVsbCBpZiBiZmRzIGFyZSByZWFkIG9yIHdyaXRlIGVuYWJsZWQuCi0KLSAgIE5vdGUgdGhhdCBiZmRzIG9wZW4gZm9yIHJlYWQgbWF5IGJlIHNjcmliYmxlZCBpbnRvIGlmIHRoZSBmZCBwYXNzZWQKLSAgIHRvIGJmZF9mZG9wZW5yIGlzIGFjdHVhbGx5IG9wZW4gYm90aCBmb3IgcmVhZCBhbmQgd3JpdGUKLSAgIHNpbXVsdGFuZW91c2x5LiAgSG93ZXZlciBhbiBvdXRwdXQgYmZkIHdpbGwgbmV2ZXIgYmUgb3BlbiBmb3IKLSAgIHJlYWQuICBUaGVyZWZvcmUgc29tZXRpbWVzIHlvdSB3YW50IHRvIGNoZWNrIGJmZF9yZWFkX3Agb3IKLSAgICFiZmRfcmVhZF9wLCBhbmQgb25seSBzb21ldGltZXMgYmZkX3dyaXRlX3AuCi0qLwotCi0jZGVmaW5lCWJmZF9yZWFkX3AoYWJmZCkgKChhYmZkKS0+ZGlyZWN0aW9uID09IHJlYWRfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQotI2RlZmluZQliZmRfd3JpdGVfcChhYmZkKSAoKGFiZmQpLT5kaXJlY3Rpb24gPT0gd3JpdGVfZGlyZWN0aW9uIHx8IChhYmZkKS0+ZGlyZWN0aW9uID09IGJvdGhfZGlyZWN0aW9uKQotCi12b2lkCWJmZF9hc3NlcnQgUEFSQU1TICgoY29uc3QgY2hhciosaW50KSk7Ci0KLSNkZWZpbmUgQkZEX0FTU0VSVCh4KSBcCi17IGlmICghKHgpKSBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQotCi0jZGVmaW5lIEJGRF9GQUlMKCkgXAoteyBiZmRfYXNzZXJ0KF9fRklMRV9fLF9fTElORV9fKTsgfQotCi1GSUxFICoJYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIgUEFSQU1TICgoYmZkICopKTsKLQotZXh0ZXJuIGJmZCAqYmZkX2xhc3RfY2FjaGU7Ci0KLS8qIExpc3Qgb2Ygc3VwcG9ydGVkIHRhcmdldCB2ZWN0b3JzLCBhbmQgdGhlIGRlZmF1bHQgdmVjdG9yIChpZgotICAgYmZkX2RlZmF1bHRfdmVjdG9yWzBdIGlzIE5VTEwsIHRoZXJlIGlzIG5vIGRlZmF1bHQpLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICogY29uc3QgYmZkX3RhcmdldF92ZWN0b3JbXTsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0ICpiZmRfZGVmYXVsdF92ZWN0b3JbXTsKLQotLyogRnVuY3Rpb25zIHNoYXJlZCBieSB0aGUgRUNPRkYgYW5kIE1JUFMgRUxGIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCi0gICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi1zdHJ1Y3QgZWNvZmZfZmluZF9saW5lOwotI2VuZGlmCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfbG9jYXRlX2xpbmUKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsIHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvICogY29uc3QsCi0JICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCwgc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSAqLAotCSAgIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9wZHIgUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zeW0gUEFSQU1TICgoUFRSLCBiZmRfYnl0ZSAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2dldF9hY2N1bXVsYXRlZF9zcyBQQVJBTVMgKChQVFIsIGJmZF9ieXRlICopKTsKLQotZXh0ZXJuIGJmZF92bWEgX2JmZF9nZXRfZ3BfdmFsdWUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIF9iZmRfc2V0X2dwX3ZhbHVlIFBBUkFNUyAoKGJmZCAqLCBiZmRfdm1hKSk7Ci0KLS8qIEZ1bmN0aW9uIHNoYXJlZCBieSB0aGUgQ09GRiBhbmQgRUxGIFNIIGJhY2tlbmRzLCB3aGljaCBoYXZlIG5vCi0gICBvdGhlciBjb21tb24gaGVhZGVyIGZpbGVzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zaF9hbGlnbl9sb2FkX3NwYW4KLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgYm9vbGVhbiAoKikgKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGJmZF9ieXRlICosIGJmZF92bWEpLAotCSAgIFBUUiwgYmZkX3ZtYSAqKiwgYmZkX3ZtYSAqLCBiZmRfdm1hLCBiZmRfdm1hLCBib29sZWFuICopKTsKLQotLyogQW5kIG1vcmUgZm9sbG93cyAqLwotCi12b2lkIAotYmZkX3dyaXRlX2JpZ2VuZGlhbl80Ynl0ZV9pbnQgUEFSQU1TICgoYmZkICphYmZkLCAgaW50IGkpKTsKLQotdW5zaWduZWQgaW50IAotYmZkX2xvZzIgUEFSQU1TICgoYmZkX3ZtYSB4KSk7Ci0KLSNkZWZpbmUgQkZEX0NBQ0hFX01BWF9PUEVOIDEwCi1leHRlcm4gYmZkICpiZmRfbGFzdF9jYWNoZTsKLQotI2RlZmluZSBiZmRfY2FjaGVfbG9va3VwKHgpIFwKLSAgICAoKHgpPT1iZmRfbGFzdF9jYWNoZT8gXAotICAgICAgKEZJTEUqKShiZmRfbGFzdF9jYWNoZS0+aW9zdHJlYW0pOiBcCi0gICAgICAgYmZkX2NhY2hlX2xvb2t1cF93b3JrZXIoeCkpCi1ib29sZWFuIAotYmZkX2NhY2hlX2luaXQgIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1ib29sZWFuIAotYmZkX2NhY2hlX2Nsb3NlICBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotRklMRSogCi1iZmRfb3Blbl9maWxlIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1GSUxFICoKLWJmZF9jYWNoZV9sb29rdXBfd29ya2VyIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jaWZkZWYgX0JGRF9NQUtFX1RBQkxFX2JmZF9yZWxvY19jb2RlX3JlYWwKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXNbXSA9IHsgIkBAdW5pbml0aWFsaXplZEBAIiwKLQotICAiQkZEX1JFTE9DXzY0IiwKLSAgIkJGRF9SRUxPQ18zMiIsCi0gICJCRkRfUkVMT0NfMjYiLAotICAiQkZEX1JFTE9DXzI0IiwKLSAgIkJGRF9SRUxPQ18xNiIsCi0gICJCRkRfUkVMT0NfMTQiLAotICAiQkZEX1JFTE9DXzgiLAotICAiQkZEX1JFTE9DXzY0X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMjRfUENSRUwiLAotICAiQkZEX1JFTE9DXzE2X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18xMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfOF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfMzJfR09UX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18xNl9HT1RfUENSRUwiLAotICAiQkZEX1JFTE9DXzhfR09UX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18zMl9HT1RPRkYiLAotICAiQkZEX1JFTE9DXzE2X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfTE8xNl9HT1RPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ184X0dPVE9GRiIsCi0gICJCRkRfUkVMT0NfMzJfUExUX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ18yNF9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfOF9QTFRfUENSRUwiLAotICAiQkZEX1JFTE9DXzMyX1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfMTZfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ19MTzE2X1BMVE9GRiIsCi0gICJCRkRfUkVMT0NfSEkxNl9QTFRPRkYiLAotICAiQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYiLAotICAiQkZEX1JFTE9DXzhfUExUT0ZGIiwKLSAgIkJGRF9SRUxPQ182OEtfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DXzY4S19KTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfNjhLX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ18zMl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ18xNl9CQVNFUkVMIiwKLSAgIkJGRF9SRUxPQ19MTzE2X0JBU0VSRUwiLAotICAiQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfSEkxNl9TX0JBU0VSRUwiLAotICAiQkZEX1JFTE9DXzhfQkFTRVJFTCIsCi0gICJCRkRfUkVMT0NfUlZBIiwKLSAgIkJGRF9SRUxPQ184X0ZGbm4iLAotICAiQkZEX1JFTE9DXzMyX1BDUkVMX1MyIiwKLSAgIkJGRF9SRUxPQ18xNl9QQ1JFTF9TMiIsCi0gICJCRkRfUkVMT0NfMjNfUENSRUxfUzIiLAotICAiQkZEX1JFTE9DX0hJMjIiLAotICAiQkZEX1JFTE9DX0xPMTAiLAotICAiQkZEX1JFTE9DX0dQUkVMMTYiLAotICAiQkZEX1JFTE9DX0dQUkVMMzIiLAotICAiQkZEX1JFTE9DX0k5NjBfQ0FMTEoiLAotICAiQkZEX1JFTE9DX05PTkUiLAotICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDMTMiLAotICAiQkZEX1JFTE9DX1NQQVJDX0dPVDEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19HT1QxMyIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR09UMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1dQTFQzMCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfQ09QWSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DX1NQQVJDX0pNUF9TTE9UIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfVUEzMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfQkFTRTEzIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19CQVNFMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDXzEwIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ18xMSIsCi0gICJCRkRfUkVMT0NfU1BBUkNfT0xPMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0hIMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX0hNMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0xNMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDX0hNMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BDX0xNMjIiLAotICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYiLAotICAiQkZEX1JFTE9DX1NQQVJDX1dESVNQMTkiLAotICAiQkZEX1JFTE9DX1NQQVJDXzciLAotICAiQkZEX1JFTE9DX1NQQVJDXzYiLAotICAiQkZEX1JFTE9DX1NQQVJDXzUiLAotICAiQkZEX1JFTE9DX1NQQVJDX1BMVDY0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19ISVgyMiIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTE9YMTAiLAotICAiQkZEX1JFTE9DX1NQQVJDX0g0NCIsCi0gICJCRkRfUkVMT0NfU1BBUkNfTTQ0IiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19MNDQiLAotICAiQkZEX1JFTE9DX1NQQVJDX1JFR0lTVEVSIiwKLSAgIkJGRF9SRUxPQ19TUEFSQ19SRVYzMiIsCi0gICJCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYiLAotICAiQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2IiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9HUERJU1AiLAotICAiQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19BTFBIQV9MSVRVU0UiLAotICAiQkZEX1JFTE9DX0FMUEhBX0hJTlQiLAotICAiQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UiLAotICAiQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSIiwKLSAgIkJGRF9SRUxPQ19NSVBTX0pNUCIsCi0gICJCRkRfUkVMT0NfTUlQUzE2X0pNUCIsCi0gICJCRkRfUkVMT0NfTUlQUzE2X0dQUkVMIiwKLSAgIkJGRF9SRUxPQ19ISTE2IiwKLSAgIkJGRF9SRUxPQ19ISTE2X1MiLAotICAiQkZEX1JFTE9DX0xPMTYiLAotICAiQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyIsCi0gICJCRkRfUkVMT0NfUENSRUxfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19MSVRFUkFMIiwKLSAgIkJGRF9SRUxPQ19NSVBTX0dPVDE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX0NBTEwxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfSEkxNiIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiIsCi0gICJCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYiLAotICAiQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2IiwKLSAgIkJGRF9SRUxPQ19NSVBTX1NVQiIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfUEFHRSIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfT0ZTVCIsCi0gICJCRkRfUkVMT0NfTUlQU19HT1RfRElTUCIsCi0KLSAgIkJGRF9SRUxPQ18zODZfR09UMzIiLAotICAiQkZEX1JFTE9DXzM4Nl9QTFQzMiIsCi0gICJCRkRfUkVMT0NfMzg2X0NPUFkiLAotICAiQkZEX1JFTE9DXzM4Nl9HTE9CX0RBVCIsCi0gICJCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfMzg2X1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ18zODZfR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ18zODZfR09UUEMiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV84IiwKLSAgIkJGRF9SRUxPQ19OUzMyS19JTU1fMTYiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8zMiIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzhfUENSRUwiLAotICAiQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfSU1NXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19OUzMyS19ESVNQXzgiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfMzIiLAotICAiQkZEX1JFTE9DX05TMzJLX0RJU1BfOF9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfTlMzMktfRElTUF8zMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfUFBDX0IyNiIsCi0gICJCRkRfUkVMT0NfUFBDX0JBMjYiLAotICAiQkZEX1JFTE9DX1BQQ19UT0MxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0IxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOIiwKLSAgIkJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOIiwKLSAgIkJGRF9SRUxPQ19QUENfQkExNiIsCi0gICJCRkRfUkVMT0NfUFBDX0JBMTZfQlJUQUtFTiIsCi0gICJCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU4iLAotICAiQkZEX1JFTE9DX1BQQ19DT1BZIiwKLSAgIkJGRF9SRUxPQ19QUENfR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DX1BQQ19KTVBfU0xPVCIsCi0gICJCRkRfUkVMT0NfUFBDX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ19QUENfTE9DQUwyNFBDIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMzIiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0xPIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEkiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9TREFJMTYiLAotICAiQkZEX1JFTE9DX1BQQ19FTUJfU0RBMkkxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1NEQTIxIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX01SS1JFRiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNiIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTyIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9ISSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQSIsCi0gICJCRkRfUkVMT0NfUFBDX0VNQl9CSVRfRkxEIiwKLSAgIkJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQSIsCi0gICJCRkRfUkVMT0NfQ1RPUiIsCi0gICJCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCIsCi0gICJCRkRfUkVMT0NfQVJNX0lNTUVESUFURSIsCi0gICJCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9TSElGVF9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9TV0kiLAotICAiQkZEX1JFTE9DX0FSTV9NVUxUSSIsCi0gICJCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9BRFJfSU1NIiwKLSAgIkJGRF9SRUxPQ19BUk1fTERSX0lNTSIsCi0gICJCRkRfUkVMT0NfQVJNX0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FSTV9JTl9QT09MIiwKLSAgIkJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTgiLAotICAiQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwiLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9BREQiLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0iLAotICAiQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVCIsCi0gICJCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVCIsCi0gICJCRkRfUkVMT0NfQVJNX0dPVDEyIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UMzIiLAotICAiQkZEX1JFTE9DX0FSTV9KVU1QX1NMT1QiLAotICAiQkZEX1JFTE9DX0FSTV9DT1BZIiwKLSAgIkJGRF9SRUxPQ19BUk1fR0xPQl9EQVQiLAotICAiQkZEX1JFTE9DX0FSTV9QTFQzMiIsCi0gICJCRkRfUkVMT0NfQVJNX1JFTEFUSVZFIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UT0ZGIiwKLSAgIkJGRF9SRUxPQ19BUk1fR09UUEMiLAotICAiQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIiLAotICAiQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU00Qlk0IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04IiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04QlkyIiwKLSAgIkJGRF9SRUxPQ19TSF9JTU04Qlk0IiwKLSAgIkJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIiLAotICAiQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCIsCi0gICJCRkRfUkVMT0NfU0hfU1dJVENIMTYiLAotICAiQkZEX1JFTE9DX1NIX1NXSVRDSDMyIiwKLSAgIkJGRF9SRUxPQ19TSF9VU0VTIiwKLSAgIkJGRF9SRUxPQ19TSF9DT1VOVCIsCi0gICJCRkRfUkVMT0NfU0hfQUxJR04iLAotICAiQkZEX1JFTE9DX1NIX0NPREUiLAotICAiQkZEX1JFTE9DX1NIX0RBVEEiLAotICAiQkZEX1JFTE9DX1NIX0xBQkVMIiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5IiwKLSAgIkJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMiIsCi0gICJCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMiLAotICAiQkZEX1JFTE9DX0FSQ19CMjJfUENSRUwiLAotICAiQkZEX1JFTE9DX0FSQ19CMjYiLAotICAiQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MIiwKLSAgIkJGRF9SRUxPQ19EMTBWXzE4IiwKLSAgIkJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzYiLAotICAiQkZEX1JFTE9DX0QzMFZfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1IiLAotICAiQkZEX1JFTE9DX0QzMFZfMTUiLAotICAiQkZEX1JFTE9DX0QzMFZfMTVfUENSRUwiLAotICAiQkZEX1JFTE9DX0QzMFZfMTVfUENSRUxfUiIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMSIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzMyIiwKLSAgIkJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzI0IiwKLSAgIkJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzE4X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0hJMTZfVUxPIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0hJMTZfU0xPIiwKLSAgIkJGRF9SRUxPQ19NMzJSX0xPMTYiLAotICAiQkZEX1JFTE9DX00zMlJfU0RBMTYiLAotICAiQkZEX1JFTE9DX1Y4NTBfOV9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVjg1MF8yMl9QQ1JFTCIsCi0gICJCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1NEQV8xNV8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV83XzhfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzRfNV9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X1NQTElUX09GRlNFVCIsCi0gICJCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfU1BMSVRfT0ZGU0VUIiwKLSAgIkJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQiLAotICAiQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VUIiwKLQotICAiQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwiLAotICAiQkZEX1JFTE9DX01OMTAzMDBfMTZfUENSRUwiLAotICAiQkZEX1JFTE9DX1RJQzMwX0xEUCIsCi0gICJCRkRfUkVMT0NfRlIzMF80OCIsCi0gICJCRkRfUkVMT0NfRlIzMF8yMCIsCi0gICJCRkRfUkVMT0NfRlIzMF82X0lOXzQiLAotICAiQkZEX1JFTE9DX0ZSMzBfOF9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzlfSU5fOCIsCi0gICJCRkRfUkVMT0NfRlIzMF8xMF9JTl84IiwKLSAgIkJGRF9SRUxPQ19GUjMwXzlfUENSRUwiLAotICAiQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQiLAotICAiQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMiIsCi0gICJCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyIiwKLSAgIkJGRF9SRUxPQ19NQ09SRV9SVkEiLAotICAiQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUIiwKLSAgIkJGRF9SRUxPQ19WVEFCTEVfRU5UUlkiLAotICJAQG92ZXJmbG93OiBCRkRfUkVMT0NfVU5VU0VEQEAiLAotfTsKLSNlbmRpZgotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0gUEFSQU1TICgoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgIGNvZGUpKTsKLQotYm9vbGVhbiAKLWJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSBQQVJBTVMgKChiZmQgKmFiZmQsCi0gICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLSAgICBib29sZWFuICopKTsKLQotYm9vbGVhbiAKLWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0gUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotYmZkX2J5dGUgKgotCi1iZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgIFBBUkFNUyAoKGJmZCAqYWJmZCwKLSAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwKLSAgICBiZmRfYnl0ZSAqZGF0YSwKLSAgICBib29sZWFuIHJlbG9jYXRlYWJsZSwKLSAgICBhc3ltYm9sICoqc3ltYm9scykpOwotCi1leHRlcm4gY29uc3QgYmZkX2FyY2hfaW5mb190eXBlIGJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggUEFSQU1TICgoYmZkICphYmZkLAotICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLAotICAgIHVuc2lnbmVkIGxvbmcgbWFjaCkpOwotCi1jb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKgotYmZkX2RlZmF1bHRfY29tcGF0aWJsZQotIFBBUkFNUyAoKGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYSwKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmIpKTsKLQotYm9vbGVhbiAKLWJmZF9kZWZhdWx0X3NjYW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IGJmZF9hcmNoX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKnN0cmluZykpOwotCi1zdHJ1Y3QgZWxmX2ludGVybmFsX3NoZHIgKgotYmZkX2VsZl9maW5kX3NlY3Rpb24gIFBBUkFNUyAoKGJmZCAqYWJmZCwgY2hhciAqbmFtZSkpOwotCmRpZmYgLS1naXQgYS9iZmQvbGliY29mZi1pbi5oIGIvYmZkL2xpYmNvZmYtaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRjMjEyMS4uMDAwMDAwMAotLS0gYS9iZmQvbGliY29mZi1pbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTI5ICswLDAgQEAKLS8qIEJGRCBDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi0qKiBOT1RFOiBsaWJjb2ZmLmggaXMgYSBHRU5FUkFURUQgZmlsZS4gIERvbid0IGNoYW5nZSBpdDsgaW5zdGVhZCwKLSoqIGNoYW5nZSBsaWJjb2ZmLWluLmggb3IgY29mZmNvZGUuaC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKiBPYmplY3QgZmlsZSB0ZGF0YTsgYWNjZXNzIG1hY3JvcyAqLwotCi0jZGVmaW5lIGNvZmZfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLmNvZmZfb2JqX2RhdGEpCi0jZGVmaW5lIGV4ZWNfaGRyKGJmZCkJCShjb2ZmX2RhdGEoYmZkKS0+aGRyKQotI2RlZmluZSBvYmpfcGUoYmZkKSAgICAgICAgICAgICAoY29mZl9kYXRhKGJmZCktPnBlKQotI2RlZmluZSBvYmpfc3ltYm9scyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+c3ltYm9scykKLSNkZWZpbmUJb2JqX3N5bV9maWxlcG9zKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1fZmlsZXBvcykKLQotI2RlZmluZSBvYmpfcmVsb2NiYXNlKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yZWxvY2Jhc2UpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50cyhiZmQpCShjb2ZmX2RhdGEoYmZkKS0+cmF3X3N5bWVudHMpCi0jZGVmaW5lIG9ial9yYXdfc3ltZW50X2NvdW50KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50X2NvdW50KQotI2RlZmluZSBvYmpfY29udmVydChiZmQpCShjb2ZmX2RhdGEoYmZkKS0+Y29udmVyc2lvbl90YWJsZSkKLSNkZWZpbmUgb2JqX2NvbnZfdGFibGVfc2l6ZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+Y29udl90YWJsZV9zaXplKQotCi0jZGVmaW5lIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5leHRlcm5hbF9zeW1zKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N5bXMoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX3N0cmluZ3MoYmZkKQkoY29mZl9kYXRhIChiZmQpLT5zdHJpbmdzKQotI2RlZmluZSBvYmpfY29mZl9rZWVwX3N0cmluZ3MoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5rZWVwX3N0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX3N5bV9oYXNoZXMoYmZkKSAoY29mZl9kYXRhIChiZmQpLT5zeW1faGFzaGVzKQotCi0jZGVmaW5lIG9ial9jb2ZmX2xvY2FsX3RvY190YWJsZShiZmQpIChjb2ZmX2RhdGEoYmZkKS0+bG9jYWxfdG9jX3N5bV9tYXApCi0KLS8qIGBUZGF0YScgaW5mb3JtYXRpb24ga2VwdCBmb3IgQ09GRiBmaWxlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfdGRhdGEKLXsKLSAgc3RydWN0ICAgY29mZl9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwkvKiBzeW10YWIgZm9yIGlucHV0IGJmZCAqLwotICB1bnNpZ25lZCBpbnQgKmNvbnZlcnNpb25fdGFibGU7Ci0gIGludCBjb252X3RhYmxlX3NpemU7Ci0gIGZpbGVfcHRyIHN5bV9maWxlcG9zOwotCi0gIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKnJhd19zeW1lbnRzOwotICB1bnNpZ25lZCBpbnQgcmF3X3N5bWVudF9jb3VudDsKLQotICAvKiBUaGVzZSBhcmUgb25seSB2YWxpZCBvbmNlIHdyaXRpbmcgaGFzIGJlZ3VuICovCi0gIGxvbmcgaW50IHJlbG9jYmFzZTsKLQotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbCB0YWJsZQotICAgICB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycgdW5mb3J0dW5hdGVseSB2YXJ5Ci0gICAgIGZyb20gY29mZiBpbXBsZW1lbnRhdGlvbiB0byBpbXBsZW1lbnRhdGlvbi4uLiAgKi8KLSAgdW5zaWduZWQgbG9jYWxfbl9idG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fYnRzaGZ0OwotICB1bnNpZ25lZCBsb2NhbF9uX3RtYXNrOwotICB1bnNpZ25lZCBsb2NhbF9uX3RzaGlmdDsKLSAgdW5zaWduZWQgbG9jYWxfc3ltZXN6OwotICB1bnNpZ25lZCBsb2NhbF9hdXhlc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2xpbmVzejsKLQotICAvKiBUaGUgdW5zd2FwcGVkIGV4dGVybmFsIHN5bWJvbHMuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzLiAgKi8KLSAgUFRSIGV4dGVybmFsX3N5bXM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGV4dGVybmFsX3N5bXMgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9zeW1zOwotCi0gIC8qIFRoZSBzdHJpbmcgdGFibGUuICBNYXkgYmUgTlVMTC4gIFJlYWQgYnkKLSAgICAgX2JmZF9jb2ZmX3JlYWRfc3RyaW5nX3RhYmxlLiAgKi8KLSAgY2hhciAqc3RyaW5nczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgc3RyaW5ncyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N0cmluZ3M7Ci0KLSAgLyogaXMgdGhpcyBhIFBFIGZvcm1hdCBjb2ZmIGZpbGUgKi8KLSAgaW50IHBlOwotICAvKiBVc2VkIGJ5IHRoZSBDT0ZGIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiB1c2VkIGJ5IHRoZSBwZSBsaW5rZXIgZm9yIFBvd2VyUEMgKi8KLSAgaW50ICpsb2NhbF90b2Nfc3ltX21hcDsKLQotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotCi0gIC8qIFVzZWQgYnkgY29mZl9maW5kX25lYXJlc3RfbGluZS4gICovCi0gIFBUUiBsaW5lX2luZm87Ci0KLSAgLyogQ29weSBvZiBzb21lIG9mIHRoZSBmX2ZsYWdzIGJpdHMgaW4gdGhlIENPRkYgZmlsZWhkciBzdHJ1Y3R1cmUsCi0gICAgIHVzZWQgYnkgQVJNIGNvZGUuICAqLwotICBmbGFnd29yZCBmbGFnczsKLQotfSBjb2ZmX2RhdGFfdHlwZTsKLQotLyogVGRhdGEgZm9yIHBlIGltYWdlIGZpbGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgcGVfdGRhdGEKLXsKLSAgY29mZl9kYXRhX3R5cGUgY29mZjsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGVfb3B0aGRyOwotICBpbnQgZGxsOwotICBpbnQgaGFzX3JlbG9jX3NlY3Rpb247Ci0gIGJvb2xlYW4gKCppbl9yZWxvY19wKSBQQVJBTVMoKGJmZCAqLCByZWxvY19ob3d0b190eXBlICopKTsKLSAgZmxhZ3dvcmQgcmVhbF9mbGFnczsKLX0gcGVfZGF0YV90eXBlOwotCi0jZGVmaW5lIHBlX2RhdGEoYmZkKQkJKChiZmQpLT50ZGF0YS5wZV9vYmpfZGF0YSkKLQotLyogVGRhdGEgZm9yIFhDT0ZGIGZpbGVzLiAgKi8KLQotc3RydWN0IHhjb2ZmX3RkYXRhCi17Ci0gIC8qIEJhc2ljIENPRkYgaW5mb3JtYXRpb24uICAqLwotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotCi0gIC8qIFRydWUgaWYgYSBsYXJnZSBhLm91dCBoZWFkZXIgc2hvdWxkIGJlIGdlbmVyYXRlZC4gICovCi0gIGJvb2xlYW4gZnVsbF9hb3V0aGRyOwotCi0gIC8qIFRPQyB2YWx1ZS4gICovCi0gIGJmZF92bWEgdG9jOwotCi0gIC8qIEluZGV4IG9mIHNlY3Rpb24gaG9sZGluZyBUT0MuICAqLwotICBpbnQgc250b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIGVudHJ5IHBvaW50LiAgKi8KLSAgaW50IHNuZW50cnk7Ci0KLSAgLyogLnRleHQgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IHRleHRfYWxpZ25fcG93ZXI7Ci0KLSAgLyogLmRhdGEgYWxpZ25tZW50IGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgaW50IGRhdGFfYWxpZ25fcG93ZXI7Ci0KLSAgLyogbW9kdHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IG1vZHR5cGU7Ci0KLSAgLyogY3B1dHlwZSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIHNob3J0IGNwdXR5cGU7Ci0KLSAgLyogbWF4ZGF0YSBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4ZGF0YTsKLQotICAvKiBtYXhzdGFjayBmcm9tIG9wdGlvbmFsIGhlYWRlci4gICovCi0gIGJmZF9zaXplX3R5cGUgbWF4c3RhY2s7Ci0KLSAgLyogVXNlZCBieSB0aGUgWENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBhc2VjdGlvbiAqKmNzZWN0czsKLSAgdW5zaWduZWQgbG9uZyAqZGVidWdfaW5kaWNlczsKLSAgdW5zaWduZWQgaW50IGltcG9ydF9maWxlX2lkOwotfTsKLQotI2RlZmluZSB4Y29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLnhjb2ZmX29ial9kYXRhKQotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAqIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBjb2Zmc3ltYm9sKGFzeW1ib2wpICgoY29mZl9zeW1ib2xfdHlwZSAqKSgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBUaGUgdXNlZF9ieV9iZmQgZmllbGQgb2YgYSBzZWN0aW9uIG1heSBiZSBzZXQgdG8gYSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHJlbG9jcywgc3dhcHBlZCBpbnRvIENPRkYgaW50ZXJuYWwgZm9ybS4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgcmVsb2NzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfcmVsb2NzOwotICAvKiBUaGUgc2VjdGlvbiBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIElmIHRoaXMgaXMgdHJ1ZSwgdGhlIGNvbnRlbnRzIGVudHJ5IG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfY29udGVudHM7Ci0gIC8qIEluZm9ybWF0aW9uIGNhY2hlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBjb25zdCBjaGFyICpmdW5jdGlvbjsKLSAgaW50IGxpbmVfYmFzZTsKLSAgLyogQSBwb2ludGVyIHVzZWQgZm9yIC5zdGFiIGxpbmtpbmcgb3B0aW1pemF0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci0gIC8qIEF2YWlsYWJsZSBmb3IgaW5kaXZpZHVhbCBiYWNrZW5kcy4gICovCi0gIFBUUiB0ZGF0YTsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgY29mZl9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBUZGF0YSBmb3Igc2VjdGlvbnMgaW4gWENPRkYgZmlsZXMuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGxpbmtlci4gICovCi0KLXN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhCi17Ci0gIC8qIFVzZWQgZm9yIFhDT0ZGIGNzZWN0cyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXI7IHBvaW50cyB0byB0aGUgcmVhbAotICAgICBYQ09GRiBzZWN0aW9uIHdoaWNoIGNvbnRhaW5zIHRoaXMgY3NlY3QuICAqLwotICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotICAvKiBUaGUgbGluZW5vX2NvdW50IGZpZWxkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24sIGJlY2F1c2Ugd2UgYXJlCi0gICAgIGdvaW5nIHRvIGNsb2JiZXIgaXQgdGhlcmUuICAqLwotICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotICAvKiBUaGUgZmlyc3QgYW5kIG9uZSBwYXN0IHRoZSBsYXN0IHN5bWJvbCBpbmRpY2VzIGZvciBzeW1ib2xzIHVzZWQKLSAgICAgYnkgdGhpcyBjc2VjdC4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc3ltbmR4OwotICB1bnNpZ25lZCBsb25nIGxhc3Rfc3ltbmR4OwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gdGhlIHhjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgeGNvZmZfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCB4Y29mZl9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBQRUkgaW1hZ2UgZmlsZXMuICAqLwotCi1zdHJ1Y3QgcGVpX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHZpcnR1YWwgc2l6ZSBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgdmlydF9zaXplOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBwZWlfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBwZWlfc2VjdGlvbl9kYXRhKGFiZmQsIHNlYykgXAotICAoKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSAqKSBjb2ZmX3NlY3Rpb25fZGF0YSAoKGFiZmQpLCAoc2VjKSktPnRkYXRhKQotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICBTZXQgdG8gLTEgaW5pdGlhbGx5LiAgU2V0IHRvIC0yIGlmCi0gICAgIHRoZXJlIGlzIGEgcmVsb2MgYWdhaW5zdCB0aGlzIHN5bWJvbC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBTeW1ib2wgdHlwZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGNsYXNzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBjbGFzczsKLQotICAvKiBOdW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMuICAqLwotICBjaGFyIG51bWF1eDsKLQotICAvKiBCRkQgdG8gdGFrZSBhdXhpbGlhcnkgZW50cmllcyBmcm9tLiAgKi8KLSAgYmZkICphdXhiZmQ7Ci0KLSAgLyogUG9pbnRlciB0byBhcnJheSBvZiBhdXhpbGlhcnkgZW50cmllcywgaWYgYW55LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXg7Ci19OwotCi0vKiBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0gIC8qIEEgcG9pbnRlciB0byBpbmZvcm1hdGlvbiB1c2VkIHRvIGxpbmsgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBQVFIgc3RhYl9pbmZvOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykJXAotICAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQkJCQkJXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksCQlcCi0JCQkgKGNvcHkpLCAoZm9sbG93KSkpCi0KLS8qIFRyYXZlcnNlIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfdHJhdmVyc2UodGFibGUsIGZ1bmMsIGluZm8pCQkJXAotICAoYmZkX2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlIGZyb20gYSBsaW5rX2luZm8gc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIEZ1bmN0aW9ucyBpbiBjb2ZmZ2VuLmMuICAqLwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKmNvZmZfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3Qgc2VjICpjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggUEFSQU1TICgoYmZkICosIGludCkpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBpbnQgY29mZl9jb3VudF9saW5lbnVtYmVycyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKmNvZmZfc3ltYm9sX2Zyb20gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9yZW51bWJlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgY29mZl9tYW5nbGVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl93cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYWxlbnQgKmNvZmZfZ2V0X2xpbmVubyBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9zZWN0aW9uX3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9mcmVlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpjb2ZmX2dldF9ub3JtYWxpemVkX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgY29mZl9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX3ByaW50X3N5bWJvbCBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosCi0JCQkJICAgICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3cpKTsKLWV4dGVybiB2b2lkIGNvZmZfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCSAgc3ltYm9sX2luZm8gKnJldCkpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCQkgICAgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gY29mZl9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIGFzZWN0aW9uICosCi0JCQkJCSAgICAgICBhc3ltYm9sICoqLAotCQkJCQkgICAgICAgYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyLAotCQkJCQkgICAgICAgQ09OU1QgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmVfcHRyKSk7Ci1leHRlcm4gaW50IGNvZmZfc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4gcmVsb2MpKTsKLWV4dGVybiBib29sZWFuIGJmZF9jb2ZmX3JlbG9jMTZfcmVsYXhfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1leHRlcm4gYmZkX2J5dGUgKmJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKiwKLQkgICBiZmRfYnl0ZSAqLCBib29sZWFuIHJlbG9jYXRlYWJsZSwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGJmZF92bWEgYmZkX2NvZmZfcmVsb2MxNl9nZXRfdmFsdWUgUEFSQU1TICgoYXJlbGVudCAqLAotCQkJCQkJICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJCSAgIGFzZWN0aW9uICopKTsKLWV4dGVybiB2b2lkIGJmZF9wZXJmb3JtX3NsaXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgc2xpcCwKLQkJCQkgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICBiZmRfdm1hIHZhbCkpOwotCi0vKiBGdW5jdGlvbnMgYW5kIHR5cGVzIGluIGNvZmZsaW5rLmMuICAqLwotCi0jZGVmaW5lIFNUUklOR19TSVpFX1NJWkUgKDQpCi0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gbWVyZ2UgaWRlbnRpY2FsIGVudW0sIHN0cnVjdCwgYW5kIHVuaW9uCi0gICBkZWZpbml0aW9ucyBpbiB0aGUgbGlua2VyLiAgKi8KLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzaW5nbGUgZWxlbWVudCAoYW4gZW51bSB2YWx1ZSwgYQotICAgc3RydWN0dXJlIG9yIHVuaW9uIGZpZWxkKSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2VsZW1lbnQKLXsKLSAgLyogTmV4dCBlbGVtZW50LiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqbmV4dDsKLQotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUeXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0KLSAgLyogU3ltYm9sIGluZGV4IGZvciBjb21wbGV4IHR5cGUuICAqLwotICBsb25nIHRhZ25keDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgZGVidWcgbWVyZ2UgZW50cmllcyBmb3IgYSBnaXZlbiBuYW1lLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZQotewotICAvKiBOZXh0IHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqbmV4dDsKLQotICAvKiBDbGFzcyBvZiB0eXBlLiAgKi8KLSAgaW50IGNsYXNzOwotCi0gIC8qIFN5bWJvbCBpbmRleCB3aGVyZSB0aGlzIHR5cGUgaXMgZGVmaW5lZC4gICovCi0gIGxvbmcgaW5keDsKLQotICAvKiBMaXN0IG9mIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudCAqZWxlbWVudHM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBzdG9yZSBpbiB0aGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogQSBsaXN0IG9mIHR5cGVzIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfdHlwZSAqdHlwZXM7Ci19OwotCi0vKiBUaGUgZGVidWcgbWVyZ2UgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlIHJvb3Q7Ci19OwotCi0vKiBJbml0aWFsaXplIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfaW5pdCh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfaW5pdCAoJih0YWJsZSktPnJvb3QsIF9iZmRfY29mZl9kZWJ1Z19tZXJnZV9oYXNoX25ld2Z1bmMpKQotCi0vKiBGcmVlIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGVfZnJlZSh0YWJsZSkgXAotICAoYmZkX2hhc2hfdGFibGVfZnJlZSAoJih0YWJsZSktPnJvb3QpKQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSkgXAotICAoKHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdoZW4gZG9pbmcKLSAgIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbwotewotICAvKiBUaGUgcmVsb2NzIHRvIGJlIG91dHB1dC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBGb3IgZWFjaCByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCB3aG9zZSBpbmRleCB3YXMgbm90IGtub3duCi0gICAgIHdoZW4gdGhlIHJlbG9jIHdhcyBoYW5kbGVkLCB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipyZWxfaGFzaGVzOwotfTsKLQotLyogSW5mb3JtYXRpb24gdGhhdCB3ZSBwYXNzIGFyb3VuZCB3aGlsZSBkb2luZyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBVc2VkIHRvIGluZGljYXRlIGZhaWx1cmUgaW4gdHJhdmVyc2FsIHJvdXRpbmUuICAqLwotICBib29sZWFuIGZhaWxlZDsKLSAgLyogSWYgZG9pbmcgInRhc2sgbGlua2luZyIgc2V0IG9ubHkgZHVyaW5nIHRoZSB0aW1lIHdoZW4gd2Ugd2FudCB0aGUKLSAgICAgZ2xvYmFsIHN5bWJvbCB3cml0ZXIgdG8gY29udmVydCB0aGUgc3RvcmFnZSBjbGFzcyBvZiBkZWZpbmVkIGdsb2JhbAotICAgICBzeW1ib2xzIGZyb20gZ2xvYmFsIHRvIHN0YXRpYy4gKi8KLSAgYm9vbGVhbiBnbG9iYWxfdG9fc3RhdGljOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogV2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbiBhcnJheSBvZiBpbmZvcm1hdGlvbiBrZXB0IGZvcgotICAgICBlYWNoIG91dHB1dCBzZWN0aW9uLCBpbmRleGVkIGJ5IHRoZSB0YXJnZXRfaW5kZXggZmllbGQuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX3NlY3Rpb25faW5mbyAqc2VjdGlvbl9pbmZvOwotICAvKiBTeW1ib2wgaW5kZXggb2YgbGFzdCBDX0ZJTEUgc3ltYm9sICgtMSBpZiBub25lKS4gICovCi0gIGxvbmcgbGFzdF9maWxlX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0IENfRklMRSBzeW1ib2wuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGxhc3RfZmlsZTsKLSAgLyogU3ltYm9sIGluZGV4IG9mIGZpcnN0IGF1eCBlbnRyeSBvZiBsYXN0IC5iZiBzeW1ib2wgd2l0aCBhbiBlbXB0eQotICAgICBlbmRuZHggZmllbGQgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2JmX2luZGV4OwotICAvKiBDb250ZW50cyBvZiBsYXN0X2JmX2luZGV4IGF1eCBlbnRyeS4gICovCi0gIHVuaW9uIGludGVybmFsX2F1eGVudCBsYXN0X2JmOwotICAvKiBIYXNoIHRhYmxlIHVzZWQgdG8gbWVyZ2UgZGVidWcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9oYXNoX3RhYmxlIGRlYnVnX21lcmdlOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHNlY3Rpb25zIG9mIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBhc2VjdGlvbiAqKnNlY19wdHJzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IGluZGljZXMgb2Ygc3ltYm9scyBvZiBhbnkKLSAgICAgaW5wdXQgZmlsZS4gICovCi0gIGxvbmcgKnN5bV9pbmRpY2VzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgb3V0cHV0IHN5bWJvbHMgZm9yIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgYmZkX2J5dGUgKm91dHN5bXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCBsaW5lIG51bWJlcnMgZm9yIGFueSBpbnB1dAotICAgICBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHJlbG9jcyBvZiBhbnkgaW5wdXQgc2VjdGlvbi4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX3RhYmxlICosIGJmZCAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF9jb2ZmX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKl9iZmRfY29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2dlbmVyaWNfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX2dsb2JhbF9zeW0KLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX3dyaXRlX3Rhc2tfZ2xvYmFscwotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfbGlua19pbnB1dF9iZmQKLSAgUEFSQU1TICgoc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfcmVsb2NfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICosIGFzZWN0aW9uICosCi0JICAgc3RydWN0IGJmZF9saW5rX29yZGVyICopKTsKLQotCi0jZGVmaW5lIGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IFwKLSAgX2JmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdwotCi0vKiBGdW5jdGlvbnMgaW4geGNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqX2JmZF94Y29mZl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF94Y29mZl9iZmRfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGFzZWN0aW9uICosIGJmZF9ieXRlICosCi0JICAgc3RydWN0IGludGVybmFsX3JlbG9jICosIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgYXNlY3Rpb24gKiopKTsKLQotLyogRnVuY3Rpb25zIGluIGNvZmYtcHBjLmMuICBGSVhNRTogVGhlc2UgYXJlIGNhbGxlZCBiZSBwZS5lbSBpbiB0aGUKLSAgIGxpbmtlciwgYW5kIHNvIHNob3VsZCBzdGFydCB3aXRoIGJmZCBhbmQgYmUgZGVjbGFyZWQgaW4gYmZkLmguICAqLwotCi1leHRlcm4gYm9vbGVhbiBwcGNfYWxsb2NhdGVfdG9jX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gcHBjX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQW5kIG1vcmUgdGFrZW4gZnJvbSB0aGUgc291cmNlIC4uICovCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJjb2ZmLmggYi9iZmQvbGliY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE4YTRkLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ODggKzAsMCBAQAotLyogQkZEIENPRkYgb2JqZWN0IGZpbGUgcHJpdmF0ZSBzdHJ1Y3R1cmUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSoqIE5PVEU6IGxpYmNvZmYuaCBpcyBhIEdFTkVSQVRFRCBmaWxlLiAgRG9uJ3QgY2hhbmdlIGl0OyBpbnN0ZWFkLAotKiogY2hhbmdlIGxpYmNvZmYtaW4uaCBvciBjb2ZmY29kZS5oLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLS8qIE9iamVjdCBmaWxlIHRkYXRhOyBhY2Nlc3MgbWFjcm9zICovCi0KLSNkZWZpbmUgY29mZl9kYXRhKGJmZCkJCSgoYmZkKS0+dGRhdGEuY29mZl9vYmpfZGF0YSkKLSNkZWZpbmUgZXhlY19oZHIoYmZkKQkJKGNvZmZfZGF0YShiZmQpLT5oZHIpCi0jZGVmaW5lIG9ial9wZShiZmQpICAgICAgICAgICAgIChjb2ZmX2RhdGEoYmZkKS0+cGUpCi0jZGVmaW5lIG9ial9zeW1ib2xzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5zeW1ib2xzKQotI2RlZmluZQlvYmpfc3ltX2ZpbGVwb3MoYmZkKQkoY29mZl9kYXRhKGJmZCktPnN5bV9maWxlcG9zKQotCi0jZGVmaW5lIG9ial9yZWxvY2Jhc2UoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJlbG9jYmFzZSkKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRzKGJmZCkJKGNvZmZfZGF0YShiZmQpLT5yYXdfc3ltZW50cykKLSNkZWZpbmUgb2JqX3Jhd19zeW1lbnRfY291bnQoYmZkKQkoY29mZl9kYXRhKGJmZCktPnJhd19zeW1lbnRfY291bnQpCi0jZGVmaW5lIG9ial9jb252ZXJ0KGJmZCkJKGNvZmZfZGF0YShiZmQpLT5jb252ZXJzaW9uX3RhYmxlKQotI2RlZmluZSBvYmpfY29udl90YWJsZV9zaXplKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5jb252X3RhYmxlX3NpemUpCi0KLSNkZWZpbmUgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmV4dGVybmFsX3N5bXMpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3ltcyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3ltcykKLSNkZWZpbmUgb2JqX2NvZmZfc3RyaW5ncyhiZmQpCShjb2ZmX2RhdGEgKGJmZCktPnN0cmluZ3MpCi0jZGVmaW5lIG9ial9jb2ZmX2tlZXBfc3RyaW5ncyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPmtlZXBfc3RyaW5ncykKLSNkZWZpbmUgb2JqX2NvZmZfc3ltX2hhc2hlcyhiZmQpIChjb2ZmX2RhdGEgKGJmZCktPnN5bV9oYXNoZXMpCi0KLSNkZWZpbmUgb2JqX2NvZmZfbG9jYWxfdG9jX3RhYmxlKGJmZCkgKGNvZmZfZGF0YShiZmQpLT5sb2NhbF90b2Nfc3ltX21hcCkKLQotLyogYFRkYXRhJyBpbmZvcm1hdGlvbiBrZXB0IGZvciBDT0ZGIGZpbGVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl90ZGF0YQotewotICBzdHJ1Y3QgICBjb2ZmX3N5bWJvbF9zdHJ1Y3QgKnN5bWJvbHM7CS8qIHN5bXRhYiBmb3IgaW5wdXQgYmZkICovCi0gIHVuc2lnbmVkIGludCAqY29udmVyc2lvbl90YWJsZTsKLSAgaW50IGNvbnZfdGFibGVfc2l6ZTsKLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3X3N5bWVudHM7Ci0gIHVuc2lnbmVkIGludCByYXdfc3ltZW50X2NvdW50OwotCi0gIC8qIFRoZXNlIGFyZSBvbmx5IHZhbGlkIG9uY2Ugd3JpdGluZyBoYXMgYmVndW4gKi8KLSAgbG9uZyBpbnQgcmVsb2NiYXNlOwotCi0gIC8qIFRoZXNlIG1lbWJlcnMgY29tbXVuaWNhdGUgaW1wb3J0YW50IGNvbnN0YW50cyBhYm91dCB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIHRvIEdEQidzIHN5bWJvbC1yZWFkaW5nIGNvZGUuICBUaGVzZSBgY29uc3RhbnRzJyB1bmZvcnR1bmF0ZWx5IHZhcnkKLSAgICAgZnJvbSBjb2ZmIGltcGxlbWVudGF0aW9uIHRvIGltcGxlbWVudGF0aW9uLi4uICAqLwotICB1bnNpZ25lZCBsb2NhbF9uX2J0bWFzazsKLSAgdW5zaWduZWQgbG9jYWxfbl9idHNoZnQ7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdG1hc2s7Ci0gIHVuc2lnbmVkIGxvY2FsX25fdHNoaWZ0OwotICB1bnNpZ25lZCBsb2NhbF9zeW1lc3o7Ci0gIHVuc2lnbmVkIGxvY2FsX2F1eGVzejsKLSAgdW5zaWduZWQgbG9jYWxfbGluZXN6OwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgZXh0ZXJuYWwgc3ltYm9scy4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfZ2V0X2V4dGVybmFsX3N5bWJvbHMuICAqLwotICBQVFIgZXh0ZXJuYWxfc3ltczsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgZXh0ZXJuYWxfc3ltcyBtYXkgbm90IGJlIGZyZWVkLiAgKi8KLSAgYm9vbGVhbiBrZWVwX3N5bXM7Ci0KLSAgLyogVGhlIHN0cmluZyB0YWJsZS4gIE1heSBiZSBOVUxMLiAgUmVhZCBieQotICAgICBfYmZkX2NvZmZfcmVhZF9zdHJpbmdfdGFibGUuICAqLwotICBjaGFyICpzdHJpbmdzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSBzdHJpbmdzIG1heSBub3QgYmUgZnJlZWQuICAqLwotICBib29sZWFuIGtlZXBfc3RyaW5nczsKLQotICAvKiBpcyB0aGlzIGEgUEUgZm9ybWF0IGNvZmYgZmlsZSAqLwotICBpbnQgcGU7Ci0gIC8qIFVzZWQgYnkgdGhlIENPRkYgYmFja2VuZCBsaW5rZXIuICAqLwotICBzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotCi0gIC8qIHVzZWQgYnkgdGhlIHBlIGxpbmtlciBmb3IgUG93ZXJQQyAqLwotICBpbnQgKmxvY2FsX3RvY19zeW1fbWFwOwotCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci0KLSAgLyogVXNlZCBieSBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lLiAgKi8KLSAgUFRSIGxpbmVfaW5mbzsKLQotICAvKiBDb3B5IG9mIHNvbWUgb2YgdGhlIGZfZmxhZ3MgYml0cyBpbiB0aGUgQ09GRiBmaWxlaGRyIHN0cnVjdHVyZSwKLSAgICAgdXNlZCBieSBBUk0gY29kZS4gICovCi0gIGZsYWd3b3JkIGZsYWdzOwotCi19IGNvZmZfZGF0YV90eXBlOwotCi0vKiBUZGF0YSBmb3IgcGUgaW1hZ2UgZmlsZXMuICovCi10eXBlZGVmIHN0cnVjdCBwZV90ZGF0YQotewotICBjb2ZmX2RhdGFfdHlwZSBjb2ZmOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZV9vcHRoZHI7Ci0gIGludCBkbGw7Ci0gIGludCBoYXNfcmVsb2Nfc2VjdGlvbjsKLSAgYm9vbGVhbiAoKmluX3JlbG9jX3ApIFBBUkFNUygoYmZkICosIHJlbG9jX2hvd3RvX3R5cGUgKikpOwotICBmbGFnd29yZCByZWFsX2ZsYWdzOwotfSBwZV9kYXRhX3R5cGU7Ci0KLSNkZWZpbmUgcGVfZGF0YShiZmQpCQkoKGJmZCktPnRkYXRhLnBlX29ial9kYXRhKQotCi0vKiBUZGF0YSBmb3IgWENPRkYgZmlsZXMuICAqLwotCi1zdHJ1Y3QgeGNvZmZfdGRhdGEKLXsKLSAgLyogQmFzaWMgQ09GRiBpbmZvcm1hdGlvbi4gICovCi0gIGNvZmZfZGF0YV90eXBlIGNvZmY7Ci0KLSAgLyogVHJ1ZSBpZiBhIGxhcmdlIGEub3V0IGhlYWRlciBzaG91bGQgYmUgZ2VuZXJhdGVkLiAgKi8KLSAgYm9vbGVhbiBmdWxsX2FvdXRoZHI7Ci0KLSAgLyogVE9DIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSB0b2M7Ci0KLSAgLyogSW5kZXggb2Ygc2VjdGlvbiBob2xkaW5nIFRPQy4gICovCi0gIGludCBzbnRvYzsKLQotICAvKiBJbmRleCBvZiBzZWN0aW9uIGhvbGRpbmcgZW50cnkgcG9pbnQuICAqLwotICBpbnQgc25lbnRyeTsKLQotICAvKiAudGV4dCBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgdGV4dF9hbGlnbl9wb3dlcjsKLQotICAvKiAuZGF0YSBhbGlnbm1lbnQgZnJvbSBvcHRpb25hbCBoZWFkZXIuICAqLwotICBpbnQgZGF0YV9hbGlnbl9wb3dlcjsKLQotICAvKiBtb2R0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgbW9kdHlwZTsKLQotICAvKiBjcHV0eXBlIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgc2hvcnQgY3B1dHlwZTsKLQotICAvKiBtYXhkYXRhIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhkYXRhOwotCi0gIC8qIG1heHN0YWNrIGZyb20gb3B0aW9uYWwgaGVhZGVyLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBtYXhzdGFjazsKLQotICAvKiBVc2VkIGJ5IHRoZSBYQ09GRiBiYWNrZW5kIGxpbmtlci4gICovCi0gIGFzZWN0aW9uICoqY3NlY3RzOwotICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRpY2VzOwotICB1bnNpZ25lZCBpbnQgaW1wb3J0X2ZpbGVfaWQ7Ci19OwotCi0jZGVmaW5lIHhjb2ZmX2RhdGEoYWJmZCkgKChhYmZkKS0+dGRhdGEueGNvZmZfb2JqX2RhdGEpCi0KLS8qIFdlIHRha2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBhc3ltYm9sIHRvIGVuc3VyZSB0aGF0IHRoZQotICogbWFjcm8gaXMgb25seSBldmVyIGFwcGxpZWQgdG8gYW4gYXN5bWJvbC4gICovCi0jZGVmaW5lIGNvZmZzeW1ib2woYXN5bWJvbCkgKChjb2ZmX3N5bWJvbF90eXBlICopKCYoKGFzeW1ib2wpLT50aGVfYmZkKSkpCi0KLS8qIFRoZSB1c2VkX2J5X2JmZCBmaWVsZCBvZiBhIHNlY3Rpb24gbWF5IGJlIHNldCB0byBhIHBvaW50ZXIgdG8gdGhpcwotICAgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgcmVsb2NzLCBzd2FwcGVkIGludG8gQ09GRiBpbnRlcm5hbCBmb3JtLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAvKiBJZiB0aGlzIGlzIHRydWUsIHRoZSByZWxvY3MgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9yZWxvY3M7Ci0gIC8qIFRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgVGhpcyBtYXkgYmUgTlVMTC4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgLyogSWYgdGhpcyBpcyB0cnVlLCB0aGUgY29udGVudHMgZW50cnkgbWF5IG5vdCBiZSBmcmVlZC4gICovCi0gIGJvb2xlYW4ga2VlcF9jb250ZW50czsKLSAgLyogSW5mb3JtYXRpb24gY2FjaGVkIGJ5IGNvZmZfZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBiZmRfdm1hIG9mZnNldDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGNoYXIgKmZ1bmN0aW9uOwotICBpbnQgbGluZV9iYXNlOwotICAvKiBBIHBvaW50ZXIgdXNlZCBmb3IgLnN0YWIgbGlua2luZyBvcHRpbWl6YXRpb25zLiAgKi8KLSAgUFRSIHN0YWJfaW5mbzsKLSAgLyogQXZhaWxhYmxlIGZvciBpbmRpdmlkdWFsIGJhY2tlbmRzLiAgKi8KLSAgUFRSIHRkYXRhOwotfTsKLQotLyogQW4gYWNjZXNzb3IgbWFjcm8gZm9yIHRoZSBjb2ZmX3NlY3Rpb25fdGRhdGEgc3RydWN0dXJlLiAgKi8KLSNkZWZpbmUgY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGNvZmZfc2VjdGlvbl90ZGF0YSAqKSAoc2VjKS0+dXNlZF9ieV9iZmQpCi0KLS8qIFRkYXRhIGZvciBzZWN0aW9ucyBpbiBYQ09GRiBmaWxlcy4gIFRoaXMgaXMgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLQotc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVXNlZCBmb3IgWENPRkYgY3NlY3RzIGNyZWF0ZWQgYnkgdGhlIGxpbmtlcjsgcG9pbnRzIHRvIHRoZSByZWFsCi0gICAgIFhDT0ZGIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgdGhpcyBjc2VjdC4gICovCi0gIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0gIC8qIFRoZSBsaW5lbm9fY291bnQgZmllbGQgZm9yIHRoZSBlbmNsb3Npbmcgc2VjdGlvbiwgYmVjYXVzZSB3ZSBhcmUKLSAgICAgZ29pbmcgdG8gY2xvYmJlciBpdCB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCBsaW5lbm9fY291bnQ7Ci0gIC8qIFRoZSBmaXJzdCBhbmQgb25lIHBhc3QgdGhlIGxhc3Qgc3ltYm9sIGluZGljZXMgZm9yIHN5bWJvbHMgdXNlZAotICAgICBieSB0aGlzIGNzZWN0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaXJzdF9zeW1uZHg7Ci0gIHVuc2lnbmVkIGxvbmcgbGFzdF9zeW1uZHg7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyB0aGUgeGNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSB4Y29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEgKikgY29mZl9zZWN0aW9uX2RhdGEgKChhYmZkKSwgKHNlYykpLT50ZGF0YSkKLQotLyogVGRhdGEgZm9yIHNlY3Rpb25zIGluIFBFSSBpbWFnZSBmaWxlcy4gICovCi0KLXN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YQotewotICAvKiBUaGUgdmlydHVhbCBzaXplIG9mIHRoZSBzZWN0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSB2aXJ0X3NpemU7Ci19OwotCi0vKiBBbiBhY2Nlc3NvciBtYWNybyBmb3IgdGhlIHBlaV9zZWN0aW9uX3RkYXRhIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIHBlaV9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IHBlaV9zZWN0aW9uX3RkYXRhICopIGNvZmZfc2VjdGlvbl9kYXRhICgoYWJmZCksIChzZWMpKS0+dGRhdGEpCi0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZW50cmllcy4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIFN5bWJvbCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdHlwZTsKLQotICAvKiBTeW1ib2wgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIGNsYXNzOwotCi0gIC8qIE51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcy4gICovCi0gIGNoYXIgbnVtYXV4OwotCi0gIC8qIEJGRCB0byB0YWtlIGF1eGlsaWFyeSBlbnRyaWVzIGZyb20uICAqLwotICBiZmQgKmF1eGJmZDsKLQotICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGF1eGlsaWFyeSBlbnRyaWVzLCBpZiBhbnkuICAqLwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eDsKLX07Ci0KLS8qIENPRkYgbGlua2VyIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLSAgLyogQSBwb2ludGVyIHRvIGluZm9ybWF0aW9uIHVzZWQgdG8gbGluayBzdGFicyBpbiBzZWN0aW9ucy4gICovCi0gIFBUUiBzdGFiX2luZm87Ci19OwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY29mZl9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KQlcCi0gICgoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICopCQkJCQlcCi0gICBiZmRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwJCVwKLQkJCSAoY29weSksIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIENPRkYgbGlua2VyIGhhc2ggdGFibGUgZnJvbSBhIGxpbmtfaW5mbyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIGNvZmZfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQotLyogRnVuY3Rpb25zIGluIGNvZmZnZW4uYy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqY29mZl9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBzZWMgKmNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9zeW10YWJfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBsb25nIGNvZmZfZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGludCBjb2ZmX2NvdW50X2xpbmVudW1iZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdCAqY29mZl9zeW1ib2xfZnJvbSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3JlbnVtYmVyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX21hbmdsZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX3dyaXRlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIGNvZmZfd3JpdGVfbGluZW51bWJlcnMgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBhbGVudCAqY29mZl9nZXRfbGluZW5vIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICopKTsKLWV4dGVybiBhc3ltYm9sICpjb2ZmX3NlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKmNvZmZfZ2V0X25vcm1hbGl6ZWRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKiwgc2VjX3B0cikpOwotZXh0ZXJuIGFzeW1ib2wgKmNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiB2b2lkIGNvZmZfcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBQVFIgZmlsZXAsIGFzeW1ib2wgKiwKLQkJCQkgICAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdykpOwotZXh0ZXJuIHZvaWQgY29mZl9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfaXNfbG9jYWxfbGFiZWxfbmFtZSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYXN5bWJvbCAqY29mZl9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gYm9vbGVhbiBjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICAgICAgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgIGFzeW1ib2wgKiosCi0JCQkJCSAgICAgICBiZmRfdm1hIG9mZnNldCwKLQkJCQkJICAgICAgIENPTlNUIGNoYXIgKipmaWxlbmFtZV9wdHIsCi0JCQkJCSAgICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0ciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHIpKTsKLWV4dGVybiBpbnQgY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiByZWxvYykpOwotZXh0ZXJuIGJvb2xlYW4gYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLWV4dGVybiBiZmRfYnl0ZSAqYmZkX2NvZmZfcmVsb2MxNl9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLAotCSAgIGJmZF9ieXRlICosIGJvb2xlYW4gcmVsb2NhdGVhYmxlLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gYmZkX3ZtYSBiZmRfY29mZl9yZWxvYzE2X2dldF92YWx1ZSBQQVJBTVMgKChhcmVsZW50ICosCi0JCQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkJICAgYXNlY3Rpb24gKikpOwotZXh0ZXJuIHZvaWQgYmZkX3BlcmZvcm1fc2xpcCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCBzbGlwLAotCQkJCSAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotCQkJCSAgICAgIGJmZF92bWEgdmFsKSk7Ci0KLS8qIEZ1bmN0aW9ucyBhbmQgdHlwZXMgaW4gY29mZmxpbmsuYy4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogV2UgdXNlIGEgaGFzaCB0YWJsZSB0byBtZXJnZSBpZGVudGljYWwgZW51bSwgc3RydWN0LCBhbmQgdW5pb24KLSAgIGRlZmluaXRpb25zIGluIHRoZSBsaW5rZXIuICAqLwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIHNpbmdsZSBlbGVtZW50IChhbiBlbnVtIHZhbHVlLCBhCi0gICBzdHJ1Y3R1cmUgb3IgdW5pb24gZmllbGQpIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfZWxlbWVudAotewotICAvKiBOZXh0IGVsZW1lbnQuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICpuZXh0OwotCi0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLQotICAvKiBTeW1ib2wgaW5kZXggZm9yIGNvbXBsZXggdHlwZS4gICovCi0gIGxvbmcgdGFnbmR4OwotfTsKLQotLyogQSBsaW5rZWQgbGlzdCBvZiBkZWJ1ZyBtZXJnZSBlbnRyaWVzIGZvciBhIGdpdmVuIG5hbWUuICAqLwotCi1zdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlCi17Ci0gIC8qIE5leHQgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICpuZXh0OwotCi0gIC8qIENsYXNzIG9mIHR5cGUuICAqLwotICBpbnQgY2xhc3M7Ci0KLSAgLyogU3ltYm9sIGluZGV4IHdoZXJlIHRoaXMgdHlwZSBpcyBkZWZpbmVkLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIExpc3Qgb2YgZWxlbWVudHMuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV9lbGVtZW50ICplbGVtZW50czsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIHN0b3JlIGluIHRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLQotICAvKiBBIGxpc3Qgb2YgdHlwZXMgd2l0aCB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgY29mZl9kZWJ1Z19tZXJnZV90eXBlICp0eXBlczsKLX07Ci0KLS8qIFRoZSBkZWJ1ZyBtZXJnZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEluaXRpYWxpemUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9pbml0KHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9pbml0ICgmKHRhYmxlKS0+cm9vdCwgX2JmZF9jb2ZmX2RlYnVnX21lcmdlX2hhc2hfbmV3ZnVuYykpCi0KLS8qIEZyZWUgYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF90YWJsZV9mcmVlKHRhYmxlKSBcCi0gIChiZmRfaGFzaF90YWJsZV9mcmVlICgmKHRhYmxlKS0+cm9vdCkpCi0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBDT0ZGIGRlYnVnIG1lcmdlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGNvZmZfZGVidWdfbWVyZ2VfaGFzaF9lbnRyeSAqKSBcCi0gICBiZmRfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSkpCi0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGVhY2ggc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgd2hlbiBkb2luZwotICAgYSByZWxvY2F0ZWFibGUgbGluay4gICovCi0KLXN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoZSByZWxvY3MgdG8gYmUgb3V0cHV0LiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gIC8qIEZvciBlYWNoIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sIHdob3NlIGluZGV4IHdhcyBub3Qga25vd24KLSAgICAgd2hlbiB0aGUgcmVsb2Mgd2FzIGhhbmRsZWQsIHRoZSBnbG9iYWwgaGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8KLXsKLSAgLyogR2VuZXJhbCBsaW5rIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gIC8qIE91dHB1dCBCRkQuICAqLwotICBiZmQgKm91dHB1dF9iZmQ7Ci0gIC8qIFVzZWQgdG8gaW5kaWNhdGUgZmFpbHVyZSBpbiB0cmF2ZXJzYWwgcm91dGluZS4gICovCi0gIGJvb2xlYW4gZmFpbGVkOwotICAvKiBJZiBkb2luZyAidGFzayBsaW5raW5nIiBzZXQgb25seSBkdXJpbmcgdGhlIHRpbWUgd2hlbiB3ZSB3YW50IHRoZQotICAgICBnbG9iYWwgc3ltYm9sIHdyaXRlciB0byBjb252ZXJ0IHRoZSBzdG9yYWdlIGNsYXNzIG9mIGRlZmluZWQgZ2xvYmFsCi0gICAgIHN5bWJvbHMgZnJvbSBnbG9iYWwgdG8gc3RhdGljLiAqLwotICBib29sZWFuIGdsb2JhbF90b19zdGF0aWM7Ci0gIC8qIEhhc2ggdGFibGUgZm9yIGxvbmcgc3ltYm9sIG5hbWVzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RydGFiOwotICAvKiBXaGVuIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGtlcHQgZm9yCi0gICAgIGVhY2ggb3V0cHV0IHNlY3Rpb24sIGluZGV4ZWQgYnkgdGhlIHRhcmdldF9pbmRleCBmaWVsZC4gICovCi0gIHN0cnVjdCBjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgZmlyc3QgYXV4IGVudHJ5IG9mIGxhc3QgLmJmIHN5bWJvbCB3aXRoIGFuIGVtcHR5Ci0gICAgIGVuZG5keCBmaWVsZCAoLTEgaWYgbm9uZSkuICAqLwotICBsb25nIGxhc3RfYmZfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3RfYmZfaW5kZXggYXV4IGVudHJ5LiAgKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGxhc3RfYmY7Ci0gIC8qIEhhc2ggdGFibGUgdXNlZCB0byBtZXJnZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBjb2ZmX2RlYnVnX21lcmdlX2hhc2hfdGFibGUgZGVidWdfbWVyZ2U7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzd2FwcGVkIHN5bWJvbHMgb2YgYW55IGlucHV0IGZpbGUuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppbnRlcm5hbF9zeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc2VjdGlvbnMgb2Ygc3ltYm9scyBvZiBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGFzZWN0aW9uICoqc2VjX3B0cnM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgaW5kaWNlcyBvZiBzeW1ib2xzIG9mIGFueQotICAgICBpbnB1dCBmaWxlLiAgKi8KLSAgbG9uZyAqc3ltX2luZGljZXM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBvdXRwdXQgc3ltYm9scyBmb3IgYW55IGlucHV0IGZpbGUuICAqLwotICBiZmRfYnl0ZSAqb3V0c3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGV4dGVybmFsIGxpbmUgbnVtYmVycyBmb3IgYW55IGlucHV0Ci0gICAgIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIHN3YXBwZWQgcmVsb2NzIG9mIGFueSBpbnB1dCBzZWN0aW9uLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci19OwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2hhc2hfdGFibGVfaW5pdAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfdGFibGUgKiwgYmZkICosCi0JICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKikgKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCSAgICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqKSkpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX2NvZmZfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBjaGFyICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZmluYWxfbGluawotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBib29sZWFuLCBiZmRfYnl0ZSAqLCBib29sZWFuLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfZ2VuZXJpY19yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi1leHRlcm4gc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpfYmZkX2NvZmZfZGVidWdfbWVyZ2VfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfZ2xvYmFsX3N5bQotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2NvZmZfd3JpdGVfdGFza19nbG9iYWxzCi0gIFBBUkFNUyAoKHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9saW5rX2lucHV0X2JmZAotICBQQVJBTVMgKChzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfY29mZl9yZWxvY19saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotCi0KLSNkZWZpbmUgY29mZl9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLS8qIEZ1bmN0aW9ucyBpbiB4Y29mZmxpbmsuYy4gICovCi0KLWV4dGVybiBsb25nIF9iZmRfeGNvZmZfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gbG9uZyBfYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYgotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpfYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3hjb2ZmX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgc3RydWN0IGludGVybmFsX3N5bWVudCAqLCBhc2VjdGlvbiAqKikpOwotCi0vKiBGdW5jdGlvbnMgaW4gY29mZi1wcGMuYy4gIEZJWE1FOiBUaGVzZSBhcmUgY2FsbGVkIGJlIHBlLmVtIGluIHRoZQotICAgbGlua2VyLCBhbmQgc28gc2hvdWxkIHN0YXJ0IHdpdGggYmZkIGFuZCBiZSBkZWNsYXJlZCBpbiBiZmQuaC4gICovCi0KLWV4dGVybiBib29sZWFuIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1leHRlcm4gYm9vbGVhbiBwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKikpOwotCi0vKiBBbmQgbW9yZSB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgLi4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY29mZl9wdHJfc3RydWN0Ci17Ci0KLSAgICAgICAgLyogUmVtZW1iZXJzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZSBmaWxlIGZvcgotICAgICAgICAgIHRoaXMgc3ltYm9sLiBHZW5lcmF0ZWQgYnkgY29mZl9yZW51bWJlcl9zeW1ib2xzLiAqLwotdW5zaWduZWQgaW50IG9mZnNldDsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHZhbHVlIG9mIHRoaXMgc3ltYm9sIGJlIHJlbnVtYmVyZWQuICBVc2VkIGZvcgotICAgICAgICAgIFhDT0ZGIENfQlNUQVQgc3ltYm9scy4gIFNldCBieSBjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZS4gICovCi11bnNpZ25lZCBpbnQgZml4X3ZhbHVlIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHRhZyBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfdGFnIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIGVuZGlkeCBmaWVsZCBvZiB0aGlzIHN5bWJvbCBiZSByZW51bWJlcmVkLgotICAgICAgICAgIENyZWF0ZWQgYnkgY29mZl9wb2ludGVyaXplX2F1eC4gKi8KLXVuc2lnbmVkIGludCBmaXhfZW5kIDogMTsKLQotICAgICAgICAvKiBTaG91bGQgdGhlIHhfY3NlY3QueF9zY25sZW4gZmllbGQgYmUgcmVudW1iZXJlZC4KLSAgICAgICAgICBDcmVhdGVkIGJ5IGNvZmZfcG9pbnRlcml6ZV9hdXguICovCi11bnNpZ25lZCBpbnQgZml4X3NjbmxlbiA6IDE7Ci0KLSAgICAgICAgLyogRml4IHVwIGFuIFhDT0ZGIENfQklOQ0wvQ19FSU5DTCBzeW1ib2wuICBUaGUgdmFsdWUgaXMgdGhlCi0gICAgICAgICAgaW5kZXggaW50byB0aGUgbGluZSBudW1iZXIgZW50cmllcy4gIFNldCBieQotICAgICAgICAgIGNvZmZfc2x1cnBfc3ltYm9sX3RhYmxlLiAgKi8KLXVuc2lnbmVkIGludCBmaXhfbGluZSA6IDE7Ci0KLSAgICAgICAgLyogVGhlIGNvbnRhaW5lciBmb3IgdGhlIHN5bWJvbCBzdHJ1Y3R1cmUgYXMgcmVhZCBhbmQgdHJhbnNsYXRlZAotICAgICAgICAgICBmcm9tIHRoZSBmaWxlLiAqLwotCi11bmlvbiB7Ci0gICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4ZW50OwotICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0gfSB1OwotfSBjb21iaW5lZF9lbnRyeV90eXBlOwotCi0KLSAvKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXM6ICovCi0KLXR5cGVkZWYgc3RydWN0IGNvZmZfc3ltYm9sX3N0cnVjdAotewotICAgIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCi1hc3ltYm9sIHN5bWJvbDsKLQotICAgIC8qIEEgcG9pbnRlciB0byB0aGUgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqLwotY29tYmluZWRfZW50cnlfdHlwZSAqbmF0aXZlOwotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBsaW5lbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbCAqLwotc3RydWN0IGxpbmVub19jYWNoZV9lbnRyeSAqbGluZW5vOwotCi0gICAgLyogSGF2ZSB0aGUgbGluZSBudW1iZXJzIGJlZW4gcmVsb2NhdGVkIHlldCA/ICovCi1ib29sZWFuIGRvbmVfbGluZW5vOwotfSBjb2ZmX3N5bWJvbF90eXBlOwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdm9pZCAoKl9iZmRfY29mZl9zd2FwX2F1eF9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAgICAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICAgICAgICAgIGV4dCwKLSAgICAgICBpbnQgICAgICAgICAgICAgdHlwZSwKLSAgICAgICBpbnQgICAgICAgICAgICAgY2xhc3MsCi0gICAgICAgaW50ICAgICAgICAgICAgIGluZGF1eCwKLSAgICAgICBpbnQgICAgICAgICAgICAgbnVtYXV4LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9zeW1faW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkICwKLSAgICAgICBQVFIgICAgICAgICAgICAgZXh0LAotICAgICAgIFBUUiAgICAgICAgICAgICBpbikpOwotCi0gIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9faW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgICAgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgICAgICAgIGV4dCwKLSAgICAgICBQVFIgICAgICAgICAgICAgaW4pKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX2F1eF9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBpbnQgICAgIHR5cGUsCi0gICAgICAgaW50ICAgICBjbGFzcywKLSAgICAgICBpbnQgICAgIGluZGF1eCwKLSAgICAgICBpbnQgICAgIG51bWF1eCwKLSAgICAgICBQVFIgICAgIGV4dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc3ltX291dCkgUEFSQU1TICgoCi0gICAgICBiZmQgICAgICAqYWJmZCwKLSAgICAgIFBUUiAgICAgIGluLAotICAgICAgUFRSICAgICAgZXh0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgKCpfYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0KSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgaW4sCi0gICAgICAgUFRSICAgICBleHQpKTsKLQotIHVuc2lnbmVkIGludCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIHNyYywKLSAgICAgICBQVFIgICAgIGRzdCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbiwKLSAgICAgICBQVFIgICAgIG91dCkpOwotCi0gdW5zaWduZWQgaW50ICgqX2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGluLAotICAgICAgIFBUUiAgICAgb3V0KSk7Ci0KLSB1bnNpZ25lZCBpbnQgX2JmZF9maWxoc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfYW91dHN6OwotIHVuc2lnbmVkIGludCBfYmZkX3NjbmhzejsKLSB1bnNpZ25lZCBpbnQgX2JmZF9zeW1lc3o7Ci0gdW5zaWduZWQgaW50IF9iZmRfYXV4ZXN6OwotIHVuc2lnbmVkIGludCBfYmZkX3JlbHN6OwotIHVuc2lnbmVkIGludCBfYmZkX2xpbmVzejsKLSBib29sZWFuIF9iZmRfY29mZl9sb25nX2ZpbGVuYW1lczsKLSBib29sZWFuIF9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXM7Ci0gdW5zaWduZWQgaW50IF9iZmRfY29mZl9kZWZhdWx0X3NlY3Rpb25fYWxpZ25tZW50X3Bvd2VyOwotIHZvaWQgKCpfYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGV4dCwKLSAgICAgICBQVFIgICAgIGluKSk7Ci0gdm9pZCAoKl9iZmRfY29mZl9zd2FwX3JlbG9jX2luKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgICAgICphYmZkLAotICAgICAgIFBUUiAgICAgZXh0LAotICAgICAgIFBUUiAgICAgaW4pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIpKTsKLSBQVFIgKCpfYmZkX2NvZmZfbWtvYmplY3RfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBQVFIgICAgIGludGVybmFsX2ZpbGVoZHIsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9hb3V0aGRyKSk7Ci0gZmxhZ3dvcmQgKCpfYmZkX3N0eXBfdG9fc2VjX2ZsYWdzX2hvb2spIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgUFRSICAgICBpbnRlcm5hbF9zY25oZHIsCi0gICAgICAgY29uc3QgY2hhciAqbmFtZSkpOwotIHZvaWQgKCpfYmZkX3NldF9hbGlnbm1lbnRfaG9vaykgUEFSQU1TICgoCi0gICAgICAgYmZkICAgICAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIFBUUiAgICAgaW50ZXJuYWxfc2NuaGRyKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zbHVycF9zeW1ib2xfdGFibGUpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9wb2ludGVyaXplX2F1eF9ob29rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0gICAgICAgdW5zaWduZWQgaW50IGluZGF1eCwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICphdXgpKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3ByaW50X2F1eCkgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkLAotICAgICAgIEZJTEUgKmZpbGUsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqdGFibGVfYmFzZSwKLSAgICAgICBjb21iaW5lZF9lbnRyeV90eXBlICpzeW1ib2wsCi0gICAgICAgY29tYmluZWRfZW50cnlfdHlwZSAqYXV4LAotICAgICAgIHVuc2lnbmVkIGludCBpbmRhdXgpKTsKLSB2b2lkICgqX2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpIFBBUkFNUyAoKAotICAgICAgIGJmZCAgICAgKmFiZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0gICAgICAgYXJlbGVudCAqcmVsb2MsCi0gICAgICAgYmZkX2J5dGUgKmRhdGEsCi0gICAgICAgdW5zaWduZWQgaW50ICpzcmNfcHRyLAotICAgICAgIHVuc2lnbmVkIGludCAqZHN0X3B0cikpOwotIGludCAoKl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0gICAgICAgYXJlbGVudCAqciwKLSAgICAgICB1bnNpZ25lZCBpbnQgc2hyaW5rLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3N5bV9pc19nbG9iYWwpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucykgUEFSQU1TICgoCi0gICAgICAgYmZkICphYmZkKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9zdGFydF9maW5hbF9saW5rKSBQQVJBTVMgKCgKLSAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm8pKTsKLSBib29sZWFuICgqX2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmlucHV0X2JmZCwKLSAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLSAgICAgICBiZmRfYnl0ZSAqY29udGVudHMsCi0gICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3MsCi0gICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltcywKLSAgICAgICBhc2VjdGlvbiAqKnNlY3Rpb25zKSk7Ci0gcmVsb2NfaG93dG9fdHlwZSAqKCpfYmZkX2NvZmZfcnR5cGVfdG9faG93dG8pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqYWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsLAotICAgICAgIHN0cnVjdCBjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaCwKLSAgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0sCi0gICAgICAgYmZkX3ZtYSAqYWRkZW5kcCkpOwotIGJvb2xlYW4gKCpfYmZkX2NvZmZfYWRqdXN0X3N5bW5keCkgUEFSQU1TICgoCi0gICAgICAgYmZkICpvYmZkLAotICAgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvLAotICAgICAgIGJmZCAqaWJmZCwKLSAgICAgICBhc2VjdGlvbiAqc2VjLAotICAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2MsCi0gICAgICAgYm9vbGVhbiAqYWRqdXN0ZWRwKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKSBQQVJBTVMgKCgKLSAgICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbywKLSAgICAgICBiZmQgKmFiZmQsCi0gICAgICAgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICBmbGFnd29yZCBmbGFncywgCi0gICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sCi0gICAgICAgYmZkX3ZtYSB2YWx1ZSwKLSAgICAgICBjb25zdCBjaGFyICpzdHJpbmcsCi0gICAgICAgYm9vbGVhbiBjb3B5LAotICAgICAgIGJvb2xlYW4gY29sbGVjdCwgCi0gICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocCkpOwotCi0gYm9vbGVhbiAoKl9iZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4pIFBBUkFNUyAoKAotICAgICAgIGJmZCAqIGFiZmQsCi0gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0gYm9vbGVhbiAoKl9iZmRfY29mZl9maW5hbF9saW5rX3Bvc3RzY3JpcHQpIFBBUkFNUyAoKAotICAgICAgIGJmZCAqIGFiZmQsCi0gICAgICAgc3RydWN0IGNvZmZfZmluYWxfbGlua19pbmZvICogcGZpbmZvKSk7Ci0KLX0gYmZkX2NvZmZfYmFja2VuZF9kYXRhOwotCi0jZGVmaW5lIGNvZmZfYmFja2VuZF9pbmZvKGFiZmQpICgoYmZkX2NvZmZfYmFja2VuZF9kYXRhICopIChhYmZkKS0+eHZlYy0+YmFja2VuZF9kYXRhKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X2luKGEsZSx0LGMsaW5kLG51bSxpKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfc3dhcF9hdXhfaW4pIChhLGUsdCxjLGluZCxudW0saSkpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zeW1faW4oYSxlLGkpIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYSktPl9iZmRfY29mZl9zd2FwX3N5bV9pbikgKGEsZSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19pbihhLGUsaSkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvICggYSktPl9iZmRfY29mZl9zd2FwX2xpbmVub19pbikgKGEsZSxpKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3JlbG9jX291dChhYmZkLCBpLCBvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQpIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX2xpbmVub19vdXQoYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfbGluZW5vX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYXV4X291dChhLGksdCxjLGluZCxudW0sbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX3N3YXBfYXV4X291dCkgKGEsaSx0LGMsaW5kLG51bSxvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3N5bV9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9zeW1fb3V0KSAoYWJmZCwgaSwgbykpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0KGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfZmlsZWhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9vdXQoYWJmZCwgaSxvKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dCkgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2ZpbGhzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2ZpbGhzeikKLSNkZWZpbmUgYmZkX2NvZmZfYW91dHN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYW91dHN6KQotI2RlZmluZSBiZmRfY29mZl9zY25oc3ooYWJmZCkgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zY25oc3opCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bWVzeihhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX3N5bWVzeikKLSNkZWZpbmUgYmZkX2NvZmZfYXV4ZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfYXV4ZXN6KQotI2RlZmluZSBiZmRfY29mZl9yZWxzeihhYmZkKSAgKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9yZWxzeikKLSNkZWZpbmUgYmZkX2NvZmZfbGluZXN6KGFiZmQpIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfbGluZXN6KQotI2RlZmluZSBiZmRfY29mZl9sb25nX2ZpbGVuYW1lcyhhYmZkKSAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfbG9uZ19maWxlbmFtZXMpCi0jZGVmaW5lIGJmZF9jb2ZmX2xvbmdfc2VjdGlvbl9uYW1lcyhhYmZkKSBcCi0gICAgICAgIChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9sb25nX3NlY3Rpb25fbmFtZXMpCi0jZGVmaW5lIGJmZF9jb2ZmX2RlZmF1bHRfc2VjdGlvbl9hbGlnbm1lbnRfcG93ZXIoYWJmZCkgXAotICAgICAgICAoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfZGVmYXVsdF9zZWN0aW9uX2FsaWdubWVudF9wb3dlcikKLSNkZWZpbmUgYmZkX2NvZmZfc3dhcF9maWxlaGRyX2luKGFiZmQsIGksbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfZmlsZWhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfYW91dGhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX2FvdXRoZHJfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9zd2FwX3Njbmhkcl9pbihhYmZkLCBpLG8pIFwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zd2FwX3Njbmhkcl9pbikgKGFiZmQsIGksIG8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N3YXBfcmVsb2NfaW4oYWJmZCwgaSwgbykgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3N3YXBfcmVsb2NfaW4pIChhYmZkLCBpLCBvKSkKLQotI2RlZmluZSBiZmRfY29mZl9iYWRfZm9ybWF0X2hvb2soYWJmZCwgZmlsZWhkcikgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX2JhZF9mb3JtYXRfaG9vaykgKGFiZmQsIGZpbGVoZHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3NldF9hcmNoX21hY2hfaG9vayhhYmZkLCBmaWxlaGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zZXRfYXJjaF9tYWNoX2hvb2spIChhYmZkLCBmaWxlaGRyKSkKLSNkZWZpbmUgYmZkX2NvZmZfbWtvYmplY3RfaG9vayhhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9ta29iamVjdF9ob29rKSAoYWJmZCwgZmlsZWhkciwgYW91dGhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc3R5cF90b19zZWNfZmxhZ3NfaG9vayhhYmZkLCBzY25oZHIsIG5hbWUpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zdHlwX3RvX3NlY19mbGFnc19ob29rKSAoYWJmZCwgc2NuaGRyLCBuYW1lKSkKLQotI2RlZmluZSBiZmRfY29mZl9zZXRfYWxpZ25tZW50X2hvb2soYWJmZCwgc2VjLCBzY25oZHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9zZXRfYWxpZ25tZW50X2hvb2spIChhYmZkLCBzZWMsIHNjbmhkcikpCi0KLSNkZWZpbmUgYmZkX2NvZmZfc2x1cnBfc3ltYm9sX3RhYmxlKGFiZmQpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSkgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcoYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1uYW1lX2luX2RlYnVnKSAoYWJmZCwgc3ltKSkKLQotI2RlZmluZSBiZmRfY29mZl9wcmludF9hdXgoYWJmZCwgZmlsZSwgYmFzZSwgc3ltYm9sLCBhdXgsIGluZGF1eClcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGFiZmQpLT5fYmZkX2NvZmZfcHJpbnRfYXV4KVwKLSAgICAgICAgIChhYmZkLCBmaWxlLCBiYXNlLCBzeW1ib2wsIGF1eCwgaW5kYXV4KSkKLQotI2RlZmluZSBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3JlbG9jMTZfZXh0cmFfY2FzZXMpXAotICAgICAgICAgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgcmVsb2MsIGRhdGEsIHNyY19wdHIsIGRzdF9wdHIpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jMTZfZXN0aW1hdGUoYWJmZCwgc2VjdGlvbiwgcmVsb2MsIHNocmluaywgbGlua19pbmZvKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlKVwKLSAgICAgICAgIChhYmZkLCBzZWN0aW9uLCByZWxvYywgc2hyaW5rLCBsaW5rX2luZm8pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N5bV9pc19nbG9iYWwoYWJmZCwgc3ltKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9zeW1faXNfZ2xvYmFsKVwKLSAgICAgICAgIChhYmZkLCBzeW0pKQotCi0jZGVmaW5lIGJmZF9jb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyhhYmZkKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMpXAotICAgICAgICAgKGFiZmQpKQotCi0jZGVmaW5lIGJmZF9jb2ZmX3N0YXJ0X2ZpbmFsX2xpbmsob2JmZCwgaW5mbylcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKG9iZmQpLT5fYmZkX2NvZmZfc3RhcnRfZmluYWxfbGluaylcCi0gICAgICAgICAob2JmZCwgaW5mbykpCi0jZGVmaW5lIGJmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24ob2JmZCxpbmZvLGliZmQsbyxjb24scmVsLGlzeW1zLHNlY3MpXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChpYmZkKS0+X2JmZF9jb2ZmX3JlbG9jYXRlX3NlY3Rpb24pXAotICAgICAgICAgKG9iZmQsIGluZm8sIGliZmQsIG8sIGNvbiwgcmVsLCBpc3ltcywgc2VjcykpCi0jZGVmaW5lIGJmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKGFiZmQsIHNlYywgcmVsLCBoLCBzeW0sIGFkZGVuZHApXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhYmZkKS0+X2JmZF9jb2ZmX3J0eXBlX3RvX2hvd3RvKVwKLSAgICAgICAgIChhYmZkLCBzZWMsIHJlbCwgaCwgc3ltLCBhZGRlbmRwKSkKLSNkZWZpbmUgYmZkX2NvZmZfYWRqdXN0X3N5bW5keChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9hZGp1c3Rfc3ltbmR4KVwKLSAgICAgICAgIChvYmZkLCBpbmZvLCBpYmZkLCBzZWMsIHJlbCwgYWRqdXN0ZWRwKSkKLSNkZWZpbmUgYmZkX2NvZmZfbGlua19hZGRfb25lX3N5bWJvbChpbmZvLGFiZmQsbmFtZSxmbGFncyxzZWN0aW9uLHZhbHVlLHN0cmluZyxjcCxjb2xsLGhhc2hwKVwKLSAgICAgICAgKChjb2ZmX2JhY2tlbmRfaW5mbyAoYWJmZCktPl9iZmRfY29mZl9saW5rX2FkZF9vbmVfc3ltYm9sKVwKLSAgICAgICAgIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywgY3AsIGNvbGwsIGhhc2hwKSkKLQotI2RlZmluZSBiZmRfY29mZl9saW5rX291dHB1dF9oYXNfYmVndW4oYSxwKSBcCi0gICAgICAgICgoY29mZl9iYWNrZW5kX2luZm8gKGEpLT5fYmZkX2NvZmZfbGlua19vdXRwdXRfaGFzX2JlZ3VuKSAoYSxwKSkKLSNkZWZpbmUgYmZkX2NvZmZfZmluYWxfbGlua19wb3N0c2NyaXB0KGEscCkgXAotICAgICAgICAoKGNvZmZfYmFja2VuZF9pbmZvIChhKS0+X2JmZF9jb2ZmX2ZpbmFsX2xpbmtfcG9zdHNjcmlwdCkgKGEscCkpCi0KZGlmZiAtLWdpdCBhL2JmZC9saWJlY29mZi5oIGIvYmZkL2xpYmVjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjY5YTUuLjAwMDAwMDAKLS0tIGEvYmZkL2xpYmVjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyogQkZEIEVDT0ZGIG9iamVjdCBmaWxlIHByaXZhdGUgc3RydWN0dXJlLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaWZuZGVmIEVDT0ZGX0gKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jZW5kaWYKLQotLyogVGhpcyBpcyB0aGUgYmFja2VuZCBpbmZvcm1hdGlvbiBrZXB0IGZvciBFQ09GRiBmaWxlcy4gIFRoaXMKLSAgIHN0cnVjdHVyZSBpcyBjb25zdGFudCBmb3IgYSBwYXJ0aWN1bGFyIGJhY2tlbmQuICBUaGUgZmlyc3QgZWxlbWVudAotICAgaXMgdGhlIENPRkYgYmFja2VuZCBkYXRhIHN0cnVjdHVyZSwgc28gdGhhdCBFQ09GRiB0YXJnZXRzIGNhbiB1c2UKLSAgIHRoZSBnZW5lcmljIENPRkYgY29kZS4gICovCi0KLSNkZWZpbmUgZWNvZmZfYmFja2VuZChhYmZkKSBcCi0gICgoc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YSAqKSAoYWJmZCktPnh2ZWMtPmJhY2tlbmRfZGF0YSkKLQotc3RydWN0IGVjb2ZmX2JhY2tlbmRfZGF0YQotewotICAvKiBDT0ZGIGJhY2tlbmQgaW5mb3JtYXRpb24uICBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkLiAgKi8KLSAgYmZkX2NvZmZfYmFja2VuZF9kYXRhIGNvZmY7Ci0gIC8qIFN1cHBvcnRlZCBhcmNoaXRlY3R1cmUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogSW5pdGlhbCBwb3J0aW9uIG9mIGFybWFwIHN0cmluZy4gICovCi0gIGNvbnN0IGNoYXIgKmFybWFwX3N0YXJ0OwotICAvKiBUaGUgcGFnZSBib3VuZGFyeSB1c2VkIHRvIGFsaWduIHNlY3Rpb25zIGluIGEgZGVtYW5kLXBhZ2VkCi0gICAgIGV4ZWN1dGFibGUgZmlsZS4gIEUuZy4sIDB4MTAwMC4gICovCi0gIGJmZF92bWEgcm91bmQ7Ci0gIC8qIFRydWUgaWYgdGhlIC5yZGF0YSBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIHRleHQgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIEFscGhhLiAgRmFsc2UgaWYgLnJkYXRhIGlzIHBhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCwgYXMgb24gdGhlCi0gICAgIE1JUFMuICAqLwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0gIC8qIEJpdHNpemUgb2YgY29uc3RydWN0b3IgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGludCBjb25zdHJ1Y3Rvcl9iaXRzaXplOwotICAvKiBSZWxvYyB0byB1c2UgZm9yIGNvbnN0cnVjdG9yIGVudHJpZXMuICAqLwotICByZWxvY19ob3d0b190eXBlICpjb25zdHJ1Y3Rvcl9yZWxvYzsKLSAgLyogSG93IHRvIHN3YXAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgZGVidWdfc3dhcDsKLSAgLyogRXh0ZXJuYWwgcmVsb2Mgc2l6ZS4gICovCi0gIGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLSAgLyogUmVsb2Mgc3dhcHBpbmcgZnVuY3Rpb25zLiAgKi8KLSAgdm9pZCAoKnN3YXBfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JlbG9jX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBQVFIpKTsKLSAgLyogQmFja2VuZCByZWxvYyB0d2Vha2luZy4gICovCi0gIHZvaWQgKCphZGp1c3RfcmVsb2NfaW4pIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwKLQkJCQkgICBhcmVsZW50ICopKTsKLSAgdm9pZCAoKmFkanVzdF9yZWxvY19vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBhcmVsZW50ICosCi0JCQkJICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSk7Ci0gIC8qIFJlbG9jYXRlIHNlY3Rpb24gY29udGVudHMgd2hpbGUgbGlua2luZy4gICovCi0gIGJvb2xlYW4gKCpyZWxvY2F0ZV9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKm91dHB1dF9iZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGJmZCAqaW5wdXRfYmZkLCBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzLAotCQkJCSAgICAgICBQVFIgZXh0ZXJuYWxfcmVsb2NzKSk7Ci0gIC8qIERvIGZpbmFsIGFkanVzdG1lbnRzIHRvIGZpbGVoZHIgYW5kIGFvdXRoZHIuICAqLwotICBib29sZWFuICgqYWRqdXN0X2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqLAotCQkJCSAgICAgc3RydWN0IGludGVybmFsX2FvdXRoZHIgKikpOwotICAvKiBSZWFkIGFuIGVsZW1lbnQgZnJvbSBhbiBhcmNoaXZlIGF0IGEgZ2l2ZW4gZmlsZSBwb3NpdGlvbi4gIFRoaXMKLSAgICAgaXMgbmVlZGVkIGJlY2F1c2UgT1NGLzEgMy4yIHVzZXMgYSB3ZWlyZCBhcmNoaXZlIGZvcm1hdC4gICovCi0gIGJmZCAqKCpnZXRfZWx0X2F0X2ZpbGVwb3MpIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0cikpOwotfTsKLQotLyogVGhpcyBpcyB0aGUgdGFyZ2V0IHNwZWNpZmljIGluZm9ybWF0aW9uIGtlcHQgZm9yIEVDT0ZGIGZpbGVzLiAgKi8KLQotI2RlZmluZSBlY29mZl9kYXRhKGFiZmQpICgoYWJmZCktPnRkYXRhLmVjb2ZmX29ial9kYXRhKQotCi10eXBlZGVmIHN0cnVjdCBlY29mZl90ZGF0YQotewotICAvKiBUaGUgcmVsb2MgZmlsZSBwb3NpdGlvbiwgc2V0IGJ5Ci0gICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucy4gICovCi0gIGZpbGVfcHRyIHJlbG9jX2ZpbGVwb3M7Ci0KLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBmaWxlIHBvc2l0aW9uLCBzZXQgYnkgX2JmZF9lY29mZl9ta29iamVjdF9ob29rLiAgKi8KLSAgZmlsZV9wdHIgc3ltX2ZpbGVwb3M7Ci0KLSAgLyogVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHRleHQgc2VnbWVudC4gIE9ubHkgdmFsaWQgZm9yIGFuCi0gICAgIGV4aXN0aW5nIGZpbGUsIG5vdCBmb3Igb25lIHdlIGFyZSBjcmVhdGluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgdGV4dF9zdGFydDsKLSAgdW5zaWduZWQgbG9uZyB0ZXh0X2VuZDsKLQotICAvKiBUaGUgY2FjaGVkIGdwIHZhbHVlLiAgVGhpcyBpcyB1c2VkIHdoZW4gcmVsb2NhdGluZy4gICovCi0gIGJmZF92bWEgZ3A7Ci0KLSAgLyogVGhlIG1heGltdW0gc2l6ZSBvZiBvYmplY3RzIHRvIG9wdGltaXplIHVzaW5nIGdwLiAgVGhpcyBpcwotICAgICB0eXBpY2FsbHkgc2V0IGJ5IHRoZSAtRyBvcHRpb24gdG8gdGhlIGNvbXBpbGVyLCBhc3NlbWJsZXIgb3IKLSAgICAgbGlua2VyLiAgKi8KLSAgdW5zaWduZWQgaW50IGdwX3NpemU7Ci0KLSAgLyogVGhlIHJlZ2lzdGVyIG1hc2tzLiAgV2hlbiBsaW5raW5nLCBhbGwgdGhlIG1hc2tzIGZvdW5kIGluIHRoZQotICAgICBpbnB1dCBmaWxlcyBhcmUgY29tYmluZWQgaW50byB0aGUgbWFza3Mgb2YgdGhlIG91dHB1dCBmaWxlLgotICAgICBUaGVzZSBhcmUgbm90IGFsbCB1c2VkIGZvciBhbGwgdGFyZ2V0cywgYnV0IHRoYXQncyBPSywgYmVjYXVzZQotICAgICB0aGUgcmVsZXZhbnQgb25lcyBhcmUgdGhlIG9ubHkgb25lcyBzd2FwcGVkIGluIGFuZCBvdXQuICAqLwotICB1bnNpZ25lZCBsb25nIGdwcm1hc2s7Ci0gIHVuc2lnbmVkIGxvbmcgZnBybWFzazsKLSAgdW5zaWduZWQgbG9uZyBjcHJtYXNrWzRdOwotCi0gIC8qIFRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyBkZWJ1Z19pbmZvOwotCi0gIC8qIFRoZSB1bnN3YXBwZWQgRUNPRkYgc3ltYm9saWMgaW5mb3JtYXRpb24uICAqLwotICBQVFIgcmF3X3N5bWVudHM7Ci0KLSAgLyogVGhlIGNhbm9uaWNhbCBCRkQgc3ltYm9scy4gICovCi0gIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0ICpjYW5vbmljYWxfc3ltYm9sczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSBleHRlcm5hbCBzeW1ib2wgbnVtYmVycyB0byBlbnRyaWVzIGluIHRoZSBsaW5rZXIKLSAgICAgaGFzaCB0YWJsZSwgdXNlZCB3aGVuIGxpbmtpbmcuICAqLwotICBzdHJ1Y3QgZWNvZmZfbGlua19oYXNoX2VudHJ5ICoqc3ltX2hhc2hlczsKLQotICAvKiBBIG1hcHBpbmcgZnJvbSByZWxvYyBzeW1ib2wgaW5kaWNlcyB0byBzZWN0aW9ucywgdXNlZCB3aGVuCi0gICAgIGxpbmtpbmcuICAqLwotICBhc2VjdGlvbiAqKnN5bW5keF90b19zZWN0aW9uOwotCi0gIC8qIFRydWUgaWYgdGhpcyBCRkQgd2FzIHdyaXR0ZW4gYnkgdGhlIGJhY2tlbmQgbGlua2VyLiAgKi8KLSAgYm9vbGVhbiBsaW5rZXI7Ci0KLSAgLyogVHJ1ZSBpZiBhIHdhcm5pbmcgdGhhdCBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMgYXJlCi0gICAgIG5lZWRlZCBpbiB0aGUgb3V0cHV0IGJpbmFyeSB3YXMgaXNzdWVkIGFscmVhZHkuICAqLwotICBib29sZWFuIGlzc3VlZF9tdWx0aXBsZV9ncF93YXJuaW5nOwotCi0gIC8qIFVzZWQgYnkgZmluZF9uZWFyZXN0X2xpbmUgZW50cnkgcG9pbnQuICBUaGUgc3RydWN0dXJlIGNvdWxkIGJlCi0gICAgIGluY2x1ZGVkIGRpcmVjdGx5IGluIHRoaXMgb25lLCBidXQgdGhlcmUncyBubyBwb2ludCB0byB3YXN0aW5nCi0gICAgIHRoZSBtZW1vcnkganVzdCBmb3IgdGhlIGluZnJlcXVlbnRseSBjYWxsZWQgZmluZF9uZWFyZXN0X2xpbmUuICAqLwotICBzdHJ1Y3QgZWNvZmZfZmluZF9saW5lICpmaW5kX2xpbmVfaW5mbzsKLQotICAvKiBXaGV0aGVyIHRoZSAucmRhdGEgc2VjdGlvbiBpcyBpbiB0aGUgdGV4dCBzZWdtZW50IGZvciB0aGlzCi0gICAgIHBhcnRpY3VsYXIgRUNPRkYgZmlsZS4gIFRoaXMgaXMgbm90IHZhbGlkIHVudGlsCi0gICAgIGVjb2ZmX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyBpcyBjYWxsZWQuICAqLwotICBib29sZWFuIHJkYXRhX2luX3RleHQ7Ci0KLX0gZWNvZmZfZGF0YV90eXBlOwotCi0vKiBFYWNoIGNhbm9uaWNhbCBhc3ltYm9sIHJlYWxseSBsb29rcyBsaWtlIHRoaXMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlY29mZl9zeW1ib2xfc3RydWN0Ci17Ci0gIC8qIFRoZSBhY3R1YWwgc3ltYm9sIHdoaWNoIHRoZSByZXN0IG9mIEJGRCB3b3JrcyB3aXRoICovCi0gIGFzeW1ib2wgc3ltYm9sOwotCi0gIC8qIFRoZSBmZHIgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgRkRSICpmZHI7Ci0KLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sIHJhdGhlciB0aGFuIGFuIGV4dGVybmFsIG9uZS4gICovCi0gIGJvb2xlYW4gbG9jYWw7Ci0KLSAgLyogQSBwb2ludGVyIHRvIHRoZSB1bnN3YXBwZWQgaGlkZGVuIGluZm9ybWF0aW9uIGZvciB0aGlzIHN5bWJvbC4KLSAgICAgVGhpcyBpcyBlaXRoZXIgYSBzdHJ1Y3Qgc3ltX2V4dCBvciBhIHN0cnVjdCBleHRfZXh0LCBkZXBlbmRpbmcgb24KLSAgICAgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbCBmaWVsZCBhYm92ZS4gICovCi0gIFBUUiBuYXRpdmU7Ci19IGVjb2ZmX3N5bWJvbF90eXBlOwotCi0vKiBXZSB0YWtlIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIGEgYXN5bWJvbCB0byBlbnN1cmUgdGhhdCB0aGUKLSAgIG1hY3JvIGlzIG9ubHkgZXZlciBhcHBsaWVkIHRvIGFuIGFzeW1ib2wuICAqLwotI2RlZmluZSBlY29mZnN5bWJvbChhc3ltYm9sKSAoKGVjb2ZmX3N5bWJvbF90eXBlICopICgmKChhc3ltYm9sKS0+dGhlX2JmZCkpKQotCi0vKiBXZSBuZWVkIHRvIHNhdmUgdGhlIGluZGV4IG9mIGFuIGV4dGVybmFsIHN5bWJvbCB3aGVuIHdlIHdyaXRlIGl0Ci0gICBvdXQgc28gdGhhdCBjYW4gc2V0IHRoZSBzeW1ib2wgaW5kZXggY29ycmVjdGx5IHdoZW4gd2Ugd3JpdGUgb3V0Ci0gICB0aGUgcmVsb2NzLiAgKi8KLSNkZWZpbmUgZWNvZmZfZ2V0X3N5bV9pbmRleChzeW1ib2wpICgoc3ltYm9sKS0+dWRhdGEuaSkKLSNkZWZpbmUgZWNvZmZfc2V0X3N5bV9pbmRleChzeW1ib2wsIGlkeCkgKChzeW1ib2wpLT51ZGF0YS5pID0gKGlkeCkpCi0KLS8qIFdoZW4gZ2VuZXJhdGluZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLCB0aGUgbGlua2VyIHJlbGF4ZXMgdGhlIGNvZGUKLSAgIHRvIHR1cm4gUEMgcmVsYXRpdmUgYnJhbmNoZXMgaW50byBsb25nZXIgY29kZSBzZXF1ZW5jZXMgd2hlbiB0aGUgUEMKLSAgIHJlbGF0aXZlIGJyYW5jaCBpcyBvdXQgb2YgcmFuZ2UuICBUaGlzIGludm9sdmVzIHJlYWRpbmcgdGhlIHJlbG9jcwotICAgaW4gYmZkX3JlbGF4X3NlY3Rpb24gYXMgd2VsbCBhcyBpbiBiZmRfZmluYWxfbGluaywgYW5kIHJlcXVpcmVzIHRoZQotICAgY29kZSB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHJlbG9jcyBoYXZlIGJlZW4gZXhwYW5kZWQuICBBIHBvaW50ZXIKLSAgIHRvIHRoaXMgc3RydWN0dXJlIGlzIHB1dCBpbiB0aGUgdXNlZF9ieV9iZmQgcG9pbnRlciBvZiBhIHNlY3Rpb24gdG8KLSAgIGtlZXAgdHJhY2sgb2YgdGhpcyBpbmZvcm1hdGlvbi4gIFRoZSB1c2VyX2J5X2JmZCBwb2ludGVyIHdpbGwgYmUKLSAgIE5VTEwgaWYgdGhlIGluZm9ybWF0aW9uIHdhcyBub3QgbmVlZGVkLiAgKi8KLQotc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEKLXsKLSAgLyogVGhlIHVuc3dhcHBlZCByZWxvY3MgZm9yIHRoaXMgc2VjdGlvbi4gIFRoZXNlIGFyZSBzdG9yZWQgaW4KLSAgICAgbWVtb3J5IHNvIHRoZSBpbnB1dCBmaWxlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVhZCB0d2ljZS4gICovCi0gIFBUUiBleHRlcm5hbF9yZWxvY3M7Ci0KLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uLiAgVGhlc2UgYnl0ZXMgbWF5IG9yIG1heSBub3QgYmUgc2F2ZWQKLSAgICAgaW4gbWVtb3J5LCBidXQgaWYgaXQgaXMgdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlbS4gICovCi0gIGJmZF9ieXRlICpjb250ZW50czsKLQotICAvKiBPZmZzZXQgYWRqdXN0bWVudHMgZm9yIFBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgQSBudW1iZXIgb3RoZXIgdGhhbgotICAgICAxIGlzIGFuIGFkZGVuZCBmb3IgYSBQQyByZWxhdGl2ZSBicmFuY2gsIG9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5Ci0gICAgIHdoaWNoIGlzIHRoZSBkaWZmZXJlbmNlIG9mIHR3byAudGV4dCBsb2NhdGlvbnM7IHRoaXMgYWRkZW5kCi0gICAgIGFyaXNlcyBiZWNhdXNlIHRoZSBicmFuY2ggb3IgZGlmZmVyZW5jZSBjcm9zc2VzIG9uZSBvciBtb3JlCi0gICAgIGJyYW5jaGVzIHdoaWNoIHdlcmUgZXhwYW5kZWQgaW50byBhIGxhcmdlciBjb2RlIHNlcXVlbmNlLiAgQSAxCi0gICAgIG1lYW5zIHRoYXQgdGhpcyBicmFuY2ggd2FzIGl0c2VsZiBleHBhbmRlZCBpbnRvIGEgbGFyZ2VyIGNvZGUKLSAgICAgc2VxdWVuY2UuICAxIGlzIG5vdCBhIHBvc3NpYmxlIG9mZnNldCwgc2luY2UgYWxsIG9mZnNldHMgbXVzdCBiZQotICAgICBtdWx0aXBsZXMgb2YgdGhlIGluc3RydWN0aW9uIHNpemUsIHdoaWNoIGlzIDQ7IGFsc28sIHRoZSBvbmx5Ci0gICAgIHJlbG9jcyB3aXRoIG5vbi16ZXJvIG9mZnNldHMgd2lsbCBiZSBQQyByZWxhdGl2ZSBicmFuY2hlcyBvcgotICAgICBzd2l0Y2ggdGFibGUgZW50cmllcyB3aXRoaW4gdGhlIHNhbWUgb2JqZWN0IGZpbGUuICBJZiB0aGlzIGZpZWxkCi0gICAgIGlzIE5VTEwsIG5vIGJyYW5jaGVzIHdlcmUgZXhwYW5kZWQgYW5kIG5vIG9mZnNldHMgYXJlIHJlcXVpcmVkLgotICAgICBPdGhlcndpc2UgdGhlcmUgYXJlIGFzIG1hbnkgZW50cmllcyBhcyB0aGVyZSBhcmUgcmVsb2NzIGluIHRoZQotICAgICBzZWN0aW9uLCBhbmQgdGhlIGVudHJ5IGZvciBhbnkgcmVsb2MgdGhhdCBpcyBub3QgUEMgcmVsYXRpdmUgaXMKLSAgICAgemVyby4gICovCi0gIGxvbmcgKm9mZnNldHM7Ci0KLSAgLyogV2hlbiBwcm9kdWNpbmcgYW4gZXhlY3V0YWJsZSAoaS5lLiwgZmluYWwsIG5vbi1yZWxvY2F0YWJsZSBsaW5rKQotICAgICBvbiB0aGUgQWxwaGEsIHdlIG1heSBuZWVkIHRvIHVzZSBtdWx0aXBsZSBnbG9iYWwgcG9pbnRlciB2YWx1ZXMKLSAgICAgdG8gc3BhbiB0aGUgZW50aXJlIC5saXRhIHNlY3Rpb24uICBJbiBlc3NlbmNlLCB3ZSBhbGxvdyBlYWNoCi0gICAgIGlucHV0IC5saXRhIHNlY3Rpb24gdG8gaGF2ZSBpdHMgb3duIGdwIHZhbHVlLiAgVG8gc3VwcG9ydCB0aGlzLAotICAgICB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGdwIHZhbHVlcyB0aGF0IHdlIHBpY2tlZCBmb3IgZWFjaAotICAgICBpbnB1dCAubGl0YSBzZWN0aW9uIC4gKi8KLSAgYmZkX3ZtYSBncDsKLX07Ci0KLS8qIEFuIGFjY2Vzc29yIG1hY3JvIGZvciB0aGUgZWNvZmZfc2VjdGlvbl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZSBlY29mZl9zZWN0aW9uX2RhdGEoYWJmZCwgc2VjKSBcCi0gICgoc3RydWN0IGVjb2ZmX3NlY3Rpb25fdGRhdGEgKikgKHNlYyktPnVzZWRfYnlfYmZkKQotCi0vKiBFQ09GRiBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzLiAgKi8KLQotc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotICAvKiBTeW1ib2wgaW5kZXggaW4gb3V0cHV0IGZpbGUuICAqLwotICBsb25nIGluZHg7Ci0gIC8qIEJGRCB0aGF0IGV4dCBmaWVsZCB2YWx1ZSBjYW1lIGZyb20uICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIEVDT0ZGIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0gIEVYVFIgZXN5bTsKLSAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuIG91dC4gICovCi0gIGNoYXIgd3JpdHRlbjsKLSAgLyogTm9uemVybyBpZiB0aGlzIHN5bWJvbCB3YXMgcmVmZXJyZWQgdG8gYXMgc21hbGwgdW5kZWZpbmVkLiAgKi8KLSAgY2hhciBzbWFsbDsKLX07Ci0KLS8qIEVDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGVjb2ZmX2xpbmtfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSByb290OwotfTsKLQotLyogTWFrZSBhbiBFQ09GRiBvYmplY3QuICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9ta29iamVjdCBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBSZWFkIGluIHRoZSBFQ09GRiBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9zeW1ib2xpY19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBzdHJ1Y3QgZWNvZmZfZGVidWdfaW5mbyAqKSk7Ci0KLS8qIEdlbmVyaWMgRUNPRkYgQkZEIGJhY2tlbmQgdmVjdG9ycy4gICovCi0KLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgKl9iZmRfZWNvZmZfYXJjaGl2ZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi0jZGVmaW5lCV9iZmRfZWNvZmZfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX25ld19zZWN0aW9uX2hvb2sKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiBsb2NhdGlvbiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotCi0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgXAotICBfYmZkX2dlbmVyaWNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIFwKLSAgX2JmZF9nZW5lcmljX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgX2JmZF9lY29mZl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgX2JmZF9nZW5lcmljX2JmZF9zZXRfcHJpdmF0ZV9mbGFncwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLSNkZWZpbmUgX2JmZF9lY29mZl9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIF9iZmRfc2x1cnBfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgX2JmZF9hcmNoaXZlX2JzZF9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX3RydW5jYXRlX2FybmFtZSBiZmRfZG9udF90cnVuY2F0ZV9hcm5hbWUKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfd3JpdGVfYXJtYXAKLSAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpOwotI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfYXJfaGRyIF9iZmRfZ2VuZXJpY19yZWFkX2FyX2hkcgotI2RlZmluZSBfYmZkX2Vjb2ZmX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSBcCi0gIGJmZF9nZW5lcmljX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZQotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgX2JmZF9lY29mZl9nZW5lcmljX3N0YXRfYXJjaF9lbHQgYmZkX2dlbmVyaWNfc3RhdF9hcmNoX2VsdAotI2RlZmluZSBfYmZkX2Vjb2ZmX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgYmZkX3RydWUKLQotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKmFsb2NhdGlvbikpOwotZXh0ZXJuIGFzeW1ib2wgKl9iZmRfZWNvZmZfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3ByaW50X3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVwLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF9lY29mZl9nZXRfc3ltYm9sX2luZm8KLSAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZQotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX2ZpbmRfbmVhcmVzdF9saW5lCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhc3ltYm9sICoqLCBiZmRfdm1hIG9mZnNldCwKLQkgICBjb25zdCBjaGFyICoqZmlsZW5hbWVfcHRyLCBjb25zdCBjaGFyICoqZm5uYW1lX3B0ciwKLQkgICB1bnNpZ25lZCBpbnQgKnJldGxpbmVfcHRyKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSBfYmZkX2Vjb2ZmX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgX2JmZF9lY29mZl9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBfYmZkX2Vjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZCBjb2ZmX2dldF9yZWxvY191cHBlcl9ib3VuZAotZXh0ZXJuIGxvbmcgX2JmZF9lY29mZl9jYW5vbmljYWxpemVfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci0vKiBlY29mZl9iZmRfcmVsb2NfdHlwZV9sb29rdXAgZGVmaW5lZCBieSBiYWNrZW5kLiAqLwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZyBtYWNoaW5lKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLWV4dGVybiBpbnQgX2JmZF9lY29mZl9zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKLS8qIGVjb2ZmX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgZGVmaW5lZCBieSBiYWNrZW5kLiAgKi8KLS8qIGVjb2ZmX2JmZF9yZWxheF9zZWN0aW9uIGRlZmluZWQgYnkgYmFja2VuZC4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKl9iZmRfZWNvZmZfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLWV4dGVybiBib29sZWFuIF9iZmRfZWNvZmZfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogSG9vayBmdW5jdGlvbnMgZm9yIHRoZSBnZW5lcmljIENPRkYgc2VjdGlvbiByZWFkaW5nIGNvZGUuICAqLwotCi1leHRlcm4gUFRSIF9iZmRfZWNvZmZfbWtvYmplY3RfaG9vayBQQVJBTVMgKChiZmQgKiwgUFRSIGZpbGVoZHIsIFBUUiBhb3V0aGRyKSk7Ci0jZGVmaW5lIF9iZmRfZWNvZmZfc2V0X2FsaWdubWVudF9ob29rIFwKLSAgKCh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSkpIGJmZF92b2lkKQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9lY29mZl9zZXRfYXJjaF9tYWNoX2hvb2sgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZWhkcikpOwotZXh0ZXJuIGZsYWd3b3JkIF9iZmRfZWNvZmZfc3R5cF90b19zZWNfZmxhZ3MKLSAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgaGRyLCBjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gYm9vbGVhbiBfYmZkX2Vjb2ZmX3NsdXJwX3N5bWJvbF90YWJsZSBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogRUNPRkYgYXV4aWxpYXJ5IGluZm9ybWF0aW9uIHN3YXBwaW5nIHJvdXRpbmVzLiAgVGhlc2UgYXJlIHRoZSBzYW1lCi0gICBmb3IgYWxsIEVDT0ZGIHRhcmdldHMsIHNvIHRoZXkgYXJlIGRlZmluZWQgaW4gZWNvZmZsaW5rLmMuICAqLwotCi1leHRlcm4gdm9pZCBfYmZkX2Vjb2ZmX3N3YXBfdGlyX2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHRpcl9leHQgKiwgVElSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF90aXJfb3V0Ci0gIFBBUkFNUyAoKGludCwgY29uc3QgVElSICosIHN0cnVjdCB0aXJfZXh0ICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X2luCi0gIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IHJuZHhfZXh0ICosIFJORFhSICopKTsKLWV4dGVybiB2b2lkIF9iZmRfZWNvZmZfc3dhcF9ybmR4X291dAotICBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7CmRpZmYgLS1naXQgYS9iZmQvbGliaHBwYS5oIGIvYmZkL2xpYmhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUyNTZhMi4uMDAwMDAwMAotLS0gYS9iZmQvbGliaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjgxICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQgLCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0hQUEFfSAotI2RlZmluZSBfSFBQQV9ICi0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0jZGVmaW5lIFBBX1BBR0VTSVpFIDB4MTAwMAotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIElOTElORSBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmIC8qIEdOVSBDPyAqLwotI2VuZGlmIC8qIElOTElORSAqLwotCi0jaWYgX19HTlVDX18gPj0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3Ci0vKiBEZWNsYXJlIHRoZSBmdW5jdGlvbnMgd2l0aCB0aGUgdW51c2VkIGF0dHJpYnV0ZSB0byBhdm9pZCB3YXJuaW5ncy4gICovCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8zICh1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzMgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludCBhc3NlbWJsZV8xMiAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzEyICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBhc3NlbWJsZV8xNyAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JCQkJCSB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzE3ICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcgYXNzZW1ibGVfMjEgKHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGUgKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgZGlzX2Fzc2VtYmxlXzIxICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIHNpZ25fZXh0ZW5kICh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCkKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50IG9uZXMgKGludCkgX19hdHRyaWJ1dGUgKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgc2lnbl91bmV4dCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCAqKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nIGxvd19zaWduX2V4dGVuZCAodW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpCi0gICAgIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSk7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgbG93X3NpZ25fdW5leHQgKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQgKikKLSAgICAgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKTsKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZyBocHBhX2ZpZWxkX2FkanVzdCAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKLQkJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0KQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSBjaGFyIGJmZF9ocHBhX2luc24yZm10ICh1bnNpZ25lZCBsb25nKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotc3RhdGljIElOTElORSAgdW5zaWduZWQgbG9uZyBocHBhX3JlYnVpbGRfaW5zbiAoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQl1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKQotICAgICBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpOwotI2VuZGlmIC8qIGdjYyAyLjcgb3IgaGlnaGVyICovCi0KLQotLyogVGhlIFBBIGluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi1lbnVtIHBhX2FyY2gge3BhMTAgPSAxMCwgcGExMSA9IDExLCBwYTIwID0gMjB9OwotCi0vKiBIUCBQQS1SSVNDIHJlbG9jYXRpb24gdHlwZXMgKi8KLQotZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGUKLSAgewotICAgIFJfSFBQQV9GU0VMID0gMHgwLAotICAgIFJfSFBQQV9MU1NFTCA9IDB4MSwKLSAgICBSX0hQUEFfUlNTRUwgPSAweDIsCi0gICAgUl9IUFBBX0xTRUwgPSAweDMsCi0gICAgUl9IUFBBX1JTRUwgPSAweDQsCi0gICAgUl9IUFBBX0xEU0VMID0gMHg1LAotICAgIFJfSFBQQV9SRFNFTCA9IDB4NiwKLSAgICBSX0hQUEFfTFJTRUwgPSAweDcsCi0gICAgUl9IUFBBX1JSU0VMID0gMHg4LAotICAgIFJfSFBQQV9OU0VMICA9IDB4OSwKLSAgICBSX0hQUEFfTkxTRUwgID0gMHhhLAotICAgIFJfSFBQQV9OTFJTRUwgID0gMHhiLAotICAgIFJfSFBQQV9QU0VMID0gMHhjLAotICAgIFJfSFBQQV9MUFNFTCA9IDB4ZCwKLSAgICBSX0hQUEFfUlBTRUwgPSAweGUsCi0gICAgUl9IUFBBX1RTRUwgPSAweGYsCi0gICAgUl9IUFBBX0xUU0VMID0gMHgxMCwKLSAgICBSX0hQUEFfUlRTRUwgPSAweDExCi0gIH07Ci0KLS8qIC91c3IvaW5jbHVkZS9yZWxvYy5oIGRlZmluZXMgdGhlc2UgdG8gY29uc3RhbnRzLiAgV2Ugd2FudCB0byB1c2UKLSAgIHRoZW0gaW4gZW51bXMsIHNvICN1bmRlZiB0aGVtIGJlZm9yZSB3ZSBzdGFydCB1c2luZyB0aGVtLiAgV2UgbWlnaHQKLSAgIGJlIGFibGUgdG8gZml4IHRoaXMgYW5vdGhlciB3YXkgYnkgc2ltcGx5IG1hbmFnaW5nIG5vdCB0byBpbmNsdWRlCi0gICAvdXNyL2luY2x1ZGUvcmVsb2MuaCwgYnV0IGN1cnJlbnRseSBHREIgcGlja3MgdXAgdGhlc2UgZGVmaW5lcwotICAgc29tZXdoZXJlLiAgKi8KLSN1bmRlZiBlX2ZzZWwKLSN1bmRlZiBlX2xzc2VsCi0jdW5kZWYgZV9yc3NlbAotI3VuZGVmIGVfbHNlbAotI3VuZGVmIGVfcnNlbAotI3VuZGVmIGVfbGRzZWwKLSN1bmRlZiBlX3Jkc2VsCi0jdW5kZWYgZV9scnNlbAotI3VuZGVmIGVfcnJzZWwKLSN1bmRlZiBlX25zZWwKLSN1bmRlZiBlX25sc2VsCi0jdW5kZWYgZV9ubHJzZWwKLSN1bmRlZiBlX3BzZWwKLSN1bmRlZiBlX2xwc2VsCi0jdW5kZWYgZV9ycHNlbAotI3VuZGVmIGVfdHNlbAotI3VuZGVmIGVfbHRzZWwKLSN1bmRlZiBlX3J0c2VsCi0jdW5kZWYgZV9vbmUKLSN1bmRlZiBlX3R3bwotI3VuZGVmIGVfcGNyZWwKLSN1bmRlZiBlX2NvbgotI3VuZGVmIGVfcGxhYmVsCi0jdW5kZWYgZV9hYnMKLQotLyogZm9yIGNvbXBhdGliaWxpdHkgKi8KLWVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdAotICB7Ci0gICAgZV9mc2VsID0gUl9IUFBBX0ZTRUwsCi0gICAgZV9sc3NlbCA9IFJfSFBQQV9MU1NFTCwKLSAgICBlX3Jzc2VsID0gUl9IUFBBX1JTU0VMLAotICAgIGVfbHNlbCA9IFJfSFBQQV9MU0VMLAotICAgIGVfcnNlbCA9IFJfSFBQQV9SU0VMLAotICAgIGVfbGRzZWwgPSBSX0hQUEFfTERTRUwsCi0gICAgZV9yZHNlbCA9IFJfSFBQQV9SRFNFTCwKLSAgICBlX2xyc2VsID0gUl9IUFBBX0xSU0VMLAotICAgIGVfcnJzZWwgPSBSX0hQUEFfUlJTRUwsCi0gICAgZV9uc2VsID0gUl9IUFBBX05TRUwsCi0gICAgZV9ubHNlbCA9IFJfSFBQQV9OTFNFTCwKLSAgICBlX25scnNlbCA9IFJfSFBQQV9OTFJTRUwsCi0gICAgZV9wc2VsID0gUl9IUFBBX1BTRUwsCi0gICAgZV9scHNlbCA9IFJfSFBQQV9MUFNFTCwKLSAgICBlX3Jwc2VsID0gUl9IUFBBX1JQU0VMLAotICAgIGVfdHNlbCA9IFJfSFBQQV9UU0VMLAotICAgIGVfbHRzZWwgPSBSX0hQUEFfTFRTRUwsCi0gICAgZV9ydHNlbCA9IFJfSFBQQV9SVFNFTAotICB9OwotCi1lbnVtIGhwcGFfcmVsb2NfZXhwcl90eXBlCi0gIHsKLSAgICBSX0hQUEFfRV9PTkUgPSAwLAotICAgIFJfSFBQQV9FX1RXTyA9IDEsCi0gICAgUl9IUFBBX0VfUENSRUwgPSAyLAotICAgIFJfSFBQQV9FX0NPTiA9IDMsCi0gICAgUl9IUFBBX0VfUExBQkVMID0gNywKLSAgICBSX0hQUEFfRV9BQlMgPSAxOAotICB9OwotCi0vKiBmb3IgY29tcGF0aWJpbGl0eSAqLwotZW51bSBocHBhX3JlbG9jX2V4cHJfdHlwZV9hbHQKLSAgewotICAgIGVfb25lID0gUl9IUFBBX0VfT05FLAotICAgIGVfdHdvID0gUl9IUFBBX0VfVFdPLAotICAgIGVfcGNyZWwgPSBSX0hQUEFfRV9QQ1JFTCwKLSAgICBlX2NvbiA9IFJfSFBQQV9FX0NPTiwKLSAgICBlX3BsYWJlbCA9IFJfSFBQQV9FX1BMQUJFTCwKLSAgICBlX2FicyA9IFJfSFBQQV9FX0FCUwotICB9OwotCi0KLS8qIFJlbG9jYXRpb25zIGZvciBmdW5jdGlvbiBjYWxscyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlcgotICAgcmVsb2NhdGlvbiBiaXRzLiAgVGhlc2UgYml0cyBkZXNjcmliZSBleGFjdGx5IHdoZXJlIHRoZSBjYWxsZXIgaGFzCi0gICBwbGFjZWQgdGhlIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIGFuZCB3aGVyZSBpdCBleHBlY3RzIHRvIGZpbmQgYSByZXR1cm4KLSAgIHZhbHVlLgotCi0gICBCb3RoIEVMRiBhbmQgU09NIGVuY29kZSB0aGlzIGluZm9ybWF0aW9uIHdpdGhpbiB0aGUgYWRkZW5kIGZpZWxkCi0gICBvZiB0aGUgY2FsbCByZWxvY2F0aW9uLiAgKE5vdGUgdGhpcyBjb3VsZCBicmVhayB2ZXJ5IGJhZGx5IGlmIG9uZQotICAgd2FzIHRvIG1ha2UgYSBjYWxsIGxpa2UgYmwgZm9vICsgMHgxMjM0NTY3OCkuCi0KLSAgIFRoZSBoaWdoIG9yZGVyIDEwIGJpdHMgY29udGFpbiBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiwKLSAgIHRoZSBsb3cgb3JkZXIgMjIgYml0cyBjb250YWluIHRoZSBjb25zdGFudCBvZmZzZXQuICAqLwotICAgCi0jZGVmaW5lIEhQUEFfUl9BUkdfUkVMT0MoYSkJKCgoYSkgPj4gMjIpICYgMHgzRkYpCi0jZGVmaW5lIEhQUEFfUl9DT05TVEFOVChhKQkoKCgoaW50KShhKSkgPDwgMTApID4+IDEwKQotI2RlZmluZSBIUFBBX1JfQURERU5EKHIsYykJKCgocikgPDwgMjIpICsgKChjKSAmIDB4M0ZGRkZGKSkKLSNkZWZpbmUgSFBQQV9XSURFCSAgICAgICAoMCkgLyogUFNXIFctYml0LCBuZWVkIHRvIGNoZWNrISBGSVhNRSAqLwotCi0vKiBUaGVzZSBtYWNyb3MgZ2V0IGJpdCBmaWVsZHMgdXNpbmcgSFAncyBudW1iZXJpbmcgKE1TQiA9IDApLAotICogYnV0IG5vdGUgdGhhdCAiTUFTSyIgYXNzdW1lcyB0aGF0IHRoZSBMU0IgYml0cyBhcmUgd2hhdCdzCi0gKiB3YW50ZWQuCi0gKi8KLSNpZm5kZWYgR0VUX0ZJRUxECi0jZGVmaW5lIEdFVF9GSUVMRChYLCBGUk9NLCBUTykgXAotICAoKFgpID4+ICgzMSAtIChUTykpICYgKCgxIDw8ICgoVE8pIC0gKEZST00pICsgMSkpIC0gMSkpCi0jZW5kaWYgIAotI2RlZmluZSBHRVRfQklUKFgsIFdISUNIKSBcCi0gIEdFVF9GSUVMRCAoWCwgV0hJQ0gsIFdISUNIKQotCi0jZGVmaW5lIE1BU0soU0laRSkgXAotICAofigoLTEpIDw8IFNJWkUpKQotICAKLSNkZWZpbmUgQ0FURU5BVEUoWCwgWFNJWkUsIFksIFlTSVpFKSBcCi0gICgoKFggJiBNQVNLIChYU0laRSkpIDw8IFlTSVpFKSB8IChZICYgTUFTSyAoWVNJWkUpKSkKLQotI2RlZmluZSBFTEVWRU4oWCkgXAotICBDQVRFTkFURSAoR0VUX0JJVCAoWCwgMTApLCAxLCBHRVRfRklFTEQgKFgsIDAsIDkpLCAxMCkKLSAgCi0vKiBTb21lIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIFBBIGluc3RydWN0aW9ucy4gICovCi0KLS8qIE5PVEU6IHRoZXNlIHVzZSB0aGUgSFAgY29udmVudGlvbiB0aGF0IGZ7MX0gaXMgdGhlIF9sZWZ0XyBtb3N0Ci0gKiAgICAgICBiaXQgKE1TQikgb2YgZjsgdGhleSBzb21ldGltZXMgaGF2ZSB0byBpbXBvc2UgYW4gYXNzdW1wdGlvbgotICogICAgICAgYWJvdXQgdGhlIHNpemUgb2YgYSBmaWVsZDsgYW5kIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBtb3N0Ci0gKiAgICAgICBhcmVuJ3QgdXNlZC4KLSAqLwotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLXNpZ25fZXh0ZW5kICh4LCBsZW4pCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci17Ci0gIHJldHVybiAoaW50KSh4ID4+IChsZW4gLSAxKSA/ICgtMSA8PCBsZW4pIHwgeCA6IHgpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotYXNzZW1ibGVfMyAoeCkKLSAgICAgdW5zaWduZWQgaW50IHg7Ci17Ci0gIHJldHVybiBDQVRFTkFURSAoR0VUX0JJVCAoeCwgMiksIDEsIEdFVF9GSUVMRCAoeCwgMCwgMSksIDIpOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8zICh4LCByKQotICAgICB1bnNpZ25lZCBpbnQgeDsKLSAgICAgdW5zaWduZWQgaW50ICpyOwotewotICAqciA9ICgoKHggJiA0KSA+PiAyKSB8ICgoeCAmIDMpIDw8IDEpKSAmIDc7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1hc3NlbWJsZV82ICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgcmV0dXJuICgoKHggJiAweDEpIDw8IDUpICsgKDMyIC0gKHkgJiAweDFmKSkpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotYXNzZW1ibGVfMTIgKHgsIHkpCi0gICAgIHVuc2lnbmVkIGludCB4LCB5OwotewotICByZXR1cm4gQ0FURU5BVEUgKENBVEVOQVRFICh5LCAxLCBHRVRfQklUICh4LCAxMCksIDEpLCAyLAotIAkJICAgR0VUX0ZJRUxEICh4LCAwLCA5KSwgOSk7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdm9pZAotZGlzX2Fzc2VtYmxlXzEyIChhczEyLCB4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgYXMxMjsKLSAgICAgdW5zaWduZWQgaW50ICp4LCAqeTsKLXsKLSAgKnkgPSAoYXMxMiAmIDB4ODAwKSA+PiAxMTsKLSAgKnggPSAoKGFzMTIgJiAweDNmZikgPDwgMSkgfCAoKGFzMTIgJiAweDQwMCkgPj4gMTApOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzE2ICh4LCB5KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeTsKLXsKLSAgLyogRGVwZW5kcyBvbiBQU1cgVy1iaXQgISovCi0gIHVuc2lnbmVkIGludCB0ZW1wOwotCi0gIGlmIChIUFBBX1dJREUpCi0gICAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTMpLCAxLAotCQkJICAgICAgIChHRVRfQklUICh5LCAxMykgXiBHRVRfQklUICh4LCAwKSksIDEpLCAyLAotCQkgICAgIENBVEVOQVRFICgoR0VUX0JJVCAoeSwgMTMpIF4gR0VUX0JJVCAoeCwgMSkpLCAxLAotCQkJICAgICAgIEdFVF9GSUVMRCAoeSwgMCwgMTIpLCAxMyksIDE0KTsKLSAgZWxzZQotICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKEdFVF9CSVQgKHksIDEzKSwgMSwgR0VUX0JJVCAoeSwgMTMpLCAxKSwgMiwKLQkJICAgICBDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTMpLCAxLCBHRVRfRklFTEQgKHksIDAsIDEyKSwgMTMpLCAxNCk7Ci0KLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICh0ZW1wLCAxNik7Ci19Ci0KLQotc3RhdGljIElOTElORSB1bnNpZ25lZCBsb25nCi1hc3NlbWJsZV8xNmEgKHgsIHksIHopCi0gICAgIHVuc2lnbmVkIGludCB4LCB5LCB6OwotewotICAvKiBEZXBlbmRzIG9uIFBTVyBXLWJpdCAhKi8KLSAgdW5zaWduZWQgaW50IHRlbXA7Ci0KLSAgaWYgKEhQUEFfV0lERSkKLSAgICB0ZW1wID0gQ0FURU5BVEUgKENBVEVOQVRFICh6LCAxLCAoeiBeIEdFVF9CSVQgKHgsIDApKSwgMSksIDIsCi0JCSAgICAgQ0FURU5BVEUgKCh6IF4gR0VUX0JJVCAoeCwgMSkpLCAxLCB5LCAxMSksIDEyKTsKLSAgZWxzZSAKLSAgICAgIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsIHosIDEpLCAyLCBDQVRFTkFURSAoeiwgMSwgeSwgMTEpLCAxMik7Ci0KLSAgcmV0dXJuIHNpZ25fZXh0ZW5kICgodGVtcCA8PCAyKSwgMTYpOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzE3ICh4LCB5LCB6KQotICAgICB1bnNpZ25lZCBpbnQgeCwgeSwgejsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0gIHRlbXAgPSBDQVRFTkFURSAoQ0FURU5BVEUgKHosIDEsIHgsIDUpLCA2LAotCQkgICBDQVRFTkFURSAoR0VUX0JJVCAoeSwgMTApLCAxLCBHRVRfRklFTEQgKHksIDAsIDkpLCAxMCksIDExKTsKLSAgCi0gIHJldHVybiB0ZW1wOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLWRpc19hc3NlbWJsZV8xNyAoYXMxNywgeCwgeSwgeikKLSAgICAgdW5zaWduZWQgaW50IGFzMTc7Ci0gICAgIHVuc2lnbmVkIGludCAqeCwgKnksICp6OwotewotCi0gICp6ID0gKGFzMTcgJiAweDEwMDAwKSA+PiAxNjsKLSAgKnggPSAoYXMxNyAmIDB4MGY4MDApID4+IDExOwotICAqeSA9ICgoKGFzMTcgJiAweDAwNDAwKSA+PiAxMCkgfCAoKGFzMTcgJiAweDNmZikgPDwgMSkpICYgMHg3ZmY7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotYXNzZW1ibGVfMjEgKHgpCi0gICAgIHVuc2lnbmVkIGludCB4OwotewotICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0KLSAgdGVtcCA9ICgoeCAmIDEpIDw8IDIwKSB8Ci0gICAgKCh4ICYgMHhmZmUpIDw8IDgpIHwKLSAgICAoKHggJiAweGMwMDApID4+IDcpIHwKLSAgICAoKHggJiAweDFmMDAwMCkgPj4gMTQpIHwKLSAgICAoKHggJiAweDAwMzAwMCkgPj4gMTIpOwotICByZXR1cm4gdGVtcCAmIDB4MWZmZmZmOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWFzc2VtYmxlXzIyIChhLGIsYyxkKQotICAgICB1bnNpZ25lZCBpbnQgYSxiLGMsZDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotICAKLSAgdGVtcCA9IENBVEVOQVRFIChDQVRFTkFURSAoZCwgMSwgYSwgNSksIDYsCi0JCSAgIENBVEVOQVRFIChiLCA1LCBFTEVWRU4gKGMpLCAxMSksIDE2KTsKLQotICByZXR1cm4gc2lnbl9leHRlbmQgKHRlbXAsIDIyKTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1kaXNfYXNzZW1ibGVfMjEgKGFzMjEsIHgpCi0gICAgIHVuc2lnbmVkIGludCBhczIxLCAqeDsKLXsKLSAgdW5zaWduZWQgbG9uZyB0ZW1wOwotCi0KLSAgdGVtcCA9IChhczIxICYgMHgxMDAwMDApID4+IDIwOwotICB0ZW1wIHw9IChhczIxICYgMHgwZmZlMDApID4+IDg7Ci0gIHRlbXAgfD0gKGFzMjEgJiAweDAwMDE4MCkgPDwgNzsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMDdjKSA8PCAxNDsKLSAgdGVtcCB8PSAoYXMyMSAmIDB4MDAwMDAzKSA8PCAxMjsKLSAgKnggPSB0ZW1wOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGludAotb25lcyAobikKLSAgICAgaW50IG47Ci17Ci0gIHVuc2lnbmVkIGludCBsZW5fb25lczsKLSAgaW50IGk7Ci0KLSAgaSA9IDA7Ci0gIGxlbl9vbmVzID0gMDsKLSAgd2hpbGUgKGkgPCBuKQotICAgIHsKLSAgICAgIGxlbl9vbmVzID0gKGxlbl9vbmVzIDw8IDEpIHwgMTsKLSAgICAgIGkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIGxlbl9vbmVzOwotfQotCi1zdGF0aWMgSU5MSU5FIHZvaWQKLXNpZ25fdW5leHQgKHgsIGxlbiwgcmVzdWx0KQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotICAgICB1bnNpZ25lZCBpbnQgKnJlc3VsdDsKLXsKLSAgdW5zaWduZWQgaW50IGxlbl9vbmVzOwotCi0gIGxlbl9vbmVzID0gb25lcyAobGVuKTsKLQotICAqcmVzdWx0ID0geCAmIGxlbl9vbmVzOwotfQotCi1zdGF0aWMgSU5MSU5FIHVuc2lnbmVkIGxvbmcKLWxvd19zaWduX2V4dGVuZCAoeCwgbGVuKQotICAgICB1bnNpZ25lZCBpbnQgeCwgbGVuOwotewotICByZXR1cm4gKGludCkoKHggJiAweDEgPyAoLTEgPDwgKGxlbiAtIDEpKSA6IDApIHwgeCA+PiAxKTsKLX0KLQotc3RhdGljIElOTElORSB2b2lkCi1sb3dfc2lnbl91bmV4dCAoeCwgbGVuLCByZXN1bHQpCi0gICAgIHVuc2lnbmVkIGludCB4LCBsZW47Ci0gICAgIHVuc2lnbmVkIGludCAqcmVzdWx0OwotewotICB1bnNpZ25lZCBpbnQgdGVtcDsKLSAgdW5zaWduZWQgaW50IHNpZ247Ci0gIHVuc2lnbmVkIGludCByZXN0OwotICB1bnNpZ25lZCBpbnQgb25lX2JpdF9hdF9sZW47Ci0gIHVuc2lnbmVkIGludCBsZW5fb25lczsKLQotICBsZW5fb25lcyA9IG9uZXMgKGxlbik7Ci0gIG9uZV9iaXRfYXRfbGVuID0gMSA8PCAobGVuIC0gMSk7Ci0KLSAgc2lnbl91bmV4dCAoeCwgbGVuLCAmdGVtcCk7Ci0gIHNpZ24gPSB0ZW1wICYgb25lX2JpdF9hdF9sZW47Ci0gIHNpZ24gPj49IChsZW4gLSAxKTsKLQotICByZXN0ID0gdGVtcCAmIChsZW5fb25lcyBeIG9uZV9iaXRfYXRfbGVuKTsKLSAgcmVzdCA8PD0gMTsKLQotICAqcmVzdWx0ID0gcmVzdCB8IHNpZ247Ci19Ci0KLS8qIEhhbmRsZSBmaWVsZCBzZWxlY3RvcnMgZm9yIFBBIGluc3RydWN0aW9ucy4gICovCi0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotaHBwYV9maWVsZF9hZGp1c3QgKHZhbHVlLCBjb25zdGFudF92YWx1ZSwgcl9maWVsZCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBjb25zdGFudF92YWx1ZTsKLSAgICAgdW5zaWduZWQgc2hvcnQgcl9maWVsZDsKLXsKLSAgc3dpdGNoIChyX2ZpZWxkKQotICAgIHsKLSAgICBjYXNlIGVfZnNlbDoJCS8qIEYgIDogbm8gY2hhbmdlCQkgICAgICAqLwotICAgIGNhc2UgZV9uc2VsOgkJLyogTiAgOiBubyBjaGFuZ2UJCSAgICAgICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sc3NlbDoJCS8qIExTIDogaWYgKGJpdCAyMSkgdGhlbiBhZGQgMHg4MDAKLQkJCQkgICBhcml0aG1ldGljIHNoaWZ0IHJpZ2h0IDExIGJpdHMgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yc3NlbDoJCS8qIFJTIDogU2lnbiBleHRlbmQgZnJvbSBiaXQgMjEJKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgaWYgKHZhbHVlICYgMHgwMDAwMDQwMCkKLQl2YWx1ZSB8PSAweGZmZmZmODAwOwotICAgICAgZWxzZQotCXZhbHVlICY9IDB4N2ZmOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfbHNlbDoJCS8qIEwgIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCi0gICAgY2FzZSBlX25sc2VsOgkJLyogTkwgIDogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzICovCi0gICAgICB2YWx1ZSArPSBjb25zdGFudF92YWx1ZTsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yc2VsOgkJLyogUiAgOiBTZXQgYml0cyAwLTIwIHRvIHplcm8JICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSA9IHZhbHVlICYgMHg3ZmY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9sZHNlbDoJCS8qIExEIDogQWRkIDB4ODAwLCBhcml0aG1ldGljIHNoaWZ0Ci0JCQkJICAgcmlnaHQgMTEgYml0cwkJICAqLwotICAgICAgdmFsdWUgKz0gY29uc3RhbnRfdmFsdWU7Ci0gICAgICB2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZV9yZHNlbDoJCS8qIFJEIDogU2V0IGJpdHMgMC0yMCB0byBvbmUJICAgKi8KLSAgICAgIHZhbHVlICs9IGNvbnN0YW50X3ZhbHVlOwotICAgICAgdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xyc2VsOgkJLyogTFIgOiBMIHdpdGggInJvdW5kZWQiIGNvbnN0YW50ICAgICAgKi8KLSAgICBjYXNlIGVfbmxyc2VsOgkJLyogTkxSIDogTkwgd2l0aCAicm91bmRlZCIgY29uc3RhbnQgICAgICAqLwotICAgICAgdmFsdWUgPSB2YWx1ZSArICgoY29uc3RhbnRfdmFsdWUgKyAweDEwMDApICYgMHhmZmZmZTAwMCk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4ZmZmZmY4MDApID4+IDExOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGVfcnJzZWw6CQkvKiBSUiA6IFIgd2l0aCAicm91bmRlZCIgY29uc3RhbnQgICAgICAqLwotICAgICAgdmFsdWUgPSB2YWx1ZSArICgoY29uc3RhbnRfdmFsdWUgKyAweDEwMDApICYgMHhmZmZmZTAwMCk7Ci0gICAgICB2YWx1ZSA9ICh2YWx1ZSAmIDB4N2ZmKSArIGNvbnN0YW50X3ZhbHVlIC0gKChjb25zdGFudF92YWx1ZSArIDB4MTAwMCkgJiAweGZmZmZlMDAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgcmV0dXJuIHZhbHVlOwotCi19Ci0KLS8qIFBBLVJJU0MgT1BDT0RFUyAqLwotI2RlZmluZSBnZXRfb3Bjb2RlKGluc24pCSgoaW5zbikgJiAweGZjMDAwMDAwKSA+PiAyNgotCi0vKiBGSVhNRTogdGhpcyBsaXN0IGlzIGluY29tcGxldGUuICBJdCBzaG91bGQgYWxzbyBiZSBhbiBlbnVtZXJhdGVkCi0gICB0eXBlIHJhdGhlciB0aGFuICNkZWZpbmVzLiAgKi8KLQotI2RlZmluZSBMRE8JMHgwZAotI2RlZmluZSBMREIJMHgxMAotI2RlZmluZSBMREgJMHgxMQotI2RlZmluZSBMRFcJMHgxMgotI2RlZmluZSBMRFdNCTB4MTMKLSNkZWZpbmUgU1RCCTB4MTgKLSNkZWZpbmUgU1RICTB4MTkKLSNkZWZpbmUgU1RXCTB4MWEKLSNkZWZpbmUgU1RXTQkweDFiCi0jZGVmaW5lIENPTUlDTFIJMHgyNAotI2RlZmluZSBTVUJJCTB4MjUKLSNkZWZpbmUgU1VCSU8JMHgyNQotI2RlZmluZSBBRERJVAkweDJjCi0jZGVmaW5lIEFERElUTwkweDJjCi0jZGVmaW5lIEFEREkJMHgyZAotI2RlZmluZSBBRERJTwkweDJkCi0jZGVmaW5lIExESUwJMHgwOAotI2RlZmluZSBBRERJTAkweDBhCi0KLSNkZWZpbmUgTU9WQgkweDMyCi0jZGVmaW5lIE1PVklCCTB4MzMKLSNkZWZpbmUgQ09NQlQJMHgyMAotI2RlZmluZSBDT01CRgkweDIyCi0jZGVmaW5lIENPTUlCVAkweDIxCi0jZGVmaW5lIENPTUlCRgkweDIzCi0jZGVmaW5lIEFEREJUCTB4MjgKLSNkZWZpbmUgQUREQkYJMHgyYQotI2RlZmluZSBBRERJQlQJMHgyOQotI2RlZmluZSBBRERJQkYJMHgyYgotI2RlZmluZSBCVkIJMHgzMAotI2RlZmluZSBCQgkweDMxCi0KLSNkZWZpbmUgQkwJMHgzYQotI2RlZmluZSBCTEUJMHgzOQotI2RlZmluZSBCRQkweDM4Ci0KLSAgCi0vKiBHaXZlbiBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sIHJldHVybiBpdHMgZm9ybWF0LgotCi0gICBGSVhNRTogIG9wY29kZXMgd2hpY2ggZG8gbm90IG1hcCB0byBhIGtub3duIGZvcm1hdAotICAgc2hvdWxkIHJldHVybiBhbiBlcnJvciBvZiBzb21lIHNvcnQuICAqLwotCi1zdGF0aWMgSU5MSU5FIGNoYXIKLWJmZF9ocHBhX2luc24yZm10IChpbnNuKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci17Ci0gIGNoYXIgZm10ID0gLTE7Ci0gIHVuc2lnbmVkIGNoYXIgb3AgPSBnZXRfb3Bjb2RlIChpbnNuKTsKLSAgCi0gIHN3aXRjaCAob3ApCi0gICAgewotICAgIGNhc2UgQURESToKLSAgICBjYXNlIEFERElUOgotICAgIGNhc2UgU1VCSToKLSAgICAgIGZtdCA9IDExOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT1ZCOgotICAgIGNhc2UgTU9WSUI6Ci0gICAgY2FzZSBDT01CVDoKLSAgICBjYXNlIENPTUJGOgotICAgIGNhc2UgQ09NSUJUOgotICAgIGNhc2UgQ09NSUJGOgotICAgIGNhc2UgQUREQlQ6Ci0gICAgY2FzZSBBRERCRjoKLSAgICBjYXNlIEFERElCVDoKLSAgICBjYXNlIEFERElCRjoKLSAgICBjYXNlIEJWQjoKLSAgICBjYXNlIEJCOgotICAgICAgZm10ID0gMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExETzoKLSAgICBjYXNlIExEQjoKLSAgICBjYXNlIExESDoKLSAgICBjYXNlIExEVzoKLSAgICBjYXNlIExEV006Ci0gICAgY2FzZSBTVEI6Ci0gICAgY2FzZSBTVEg6Ci0gICAgY2FzZSBTVFc6Ci0gICAgY2FzZSBTVFdNOgotICAgICAgZm10ID0gMTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJMOgotICAgIGNhc2UgQkU6Ci0gICAgY2FzZSBCTEU6Ci0gICAgICBmbXQgPSAxNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTERJTDoKLSAgICBjYXNlIEFERElMOgotICAgICAgZm10ID0gMjE7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZm10ID0gMzI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmbXQ7Ci19Ci0KLQotLyogSW5zZXJ0IFZBTFVFIGludG8gSU5TTiB1c2luZyBSX0ZPUk1BVCB0byBkZXRlcm1pbmUgZXhhY3RseSB3aGF0Ci0gICBiaXRzIHRvIGNoYW5nZS4gICovCi0gICAKLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgbG9uZwotaHBwYV9yZWJ1aWxkX2luc24gKGFiZmQsIGluc24sIHZhbHVlLCByX2Zvcm1hdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgcl9mb3JtYXQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY29uc3RfcGFydDsKLSAgdW5zaWduZWQgbG9uZyByZWJ1aWx0X3BhcnQ7Ci0KLSAgc3dpdGNoIChyX2Zvcm1hdCkKLSAgICB7Ci0gICAgY2FzZSAxMToKLSAgICAgIHsKLQl1bnNpZ25lZCB3MSwgdzsKLQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmZTAwMjsKLQlkaXNfYXNzZW1ibGVfMTIgKHZhbHVlLCAmdzEsICZ3KTsKLQlyZWJ1aWx0X3BhcnQgPSAodzEgPDwgMikgfCB3OwotCXJldHVybiBjb25zdF9wYXJ0IHwgcmVidWlsdF9wYXJ0OwotICAgICAgfQotCi0gICAgY2FzZSAxMjoKLSAgICAgIHsKLQl1bnNpZ25lZCB3MSwgdzsKLQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmZTAwMjsKLQlkaXNfYXNzZW1ibGVfMTIgKHZhbHVlLCAmdzEsICZ3KTsKLQlyZWJ1aWx0X3BhcnQgPSAodzEgPDwgMikgfCB3OwotCXJldHVybiBjb25zdF9wYXJ0IHwgcmVidWlsdF9wYXJ0OwotICAgICAgfQotCi0gICAgY2FzZSAxNDoKLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgZXh0OwotCQotCWNvbnN0X3BhcnQgPSBpbnNuICYgMHhmZmZmYzAwMDsKLQlsb3dfc2lnbl91bmV4dCAodmFsdWUsIDE0LCAmZXh0KTsKLQlyZXR1cm4gY29uc3RfcGFydCB8IGV4dDsKLSAgICAgIH0KLQotICAgIGNhc2UgMTc6Ci0gICAgICB7Ci0JdW5zaWduZWQgdzEsIHcyLCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZTBlMDAyOwotCWRpc19hc3NlbWJsZV8xNyAodmFsdWUsICZ3MSwgJncyLCAmdyk7Ci0JcmVidWlsdF9wYXJ0ID0gKHcyIDw8IDIpIHwgKHcxIDw8IDE2KSB8IHc7Ci0JcmV0dXJuIGNvbnN0X3BhcnQgfCByZWJ1aWx0X3BhcnQ7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDIxOgotICAgICAgewotCXVuc2lnbmVkIGludCB3OwotCi0JY29uc3RfcGFydCA9IGluc24gJiAweGZmZTAwMDAwOwotCWRpc19hc3NlbWJsZV8yMSAodmFsdWUsICZ3KTsKLQlyZXR1cm4gY29uc3RfcGFydCB8IHc7Ci0gICAgICB9Ci0KLSAgICBjYXNlIDMyOgotICAgICAgY29uc3RfcGFydCA9IDA7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICByZXR1cm4gaW5zbjsKLX0KLQotI2VuZGlmIC8qIF9IUFBBX0ggKi8KZGlmZiAtLWdpdCBhL2JmZC9saWJpZWVlLmggYi9iZmQvbGliaWVlZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU4MDZlLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJpZWVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogSUVFRS02OTUgb2JqZWN0IGZpbGUgZm9ybWF0czogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4gIE1vc3RseSBTdGV2ZSBDaGFtYmVybGFpbidzIGZhdWx0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgaW50IGluZGV4OjI0OwotICBjaGFyIGxldHRlcjsKLX0gaWVlZV9zeW1ib2xfaW5kZXhfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgY3QgewotICBiZmQgKnRoaXM7Ci0gIHN0cnVjdCBjdCAqbmV4dDsKLX0gYmZkX2NoYWluX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfc3ltYm9sIAotewotICBhc3ltYm9sIHN5bWJvbDsKLSAgc3RydWN0IGllZWVfc3ltYm9sICpuZXh0OwotCi0gIHVuc2lnbmVkIGludCBpbmRleDsKLX0gaWVlZV9zeW1ib2xfdHlwZTsKLQotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3JlbG9jIHsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHN0cnVjdCBpZWVlX3JlbG9jICpuZXh0OwotICBpZWVlX3N5bWJvbF9pbmRleF90eXBlIHN5bWJvbDsKLQotfSBpZWVlX3JlbG9jX3R5cGU7Ci0KLSNkZWZpbmUgaWVlZV9zeW1ib2woeCkgKChpZWVlX3N5bWJvbF90eXBlICopKHgpKQotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3Blcl9zZWN0aW9uCi17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJmZF92bWEgcGM7Ci0gIC8qIEZvciBvdXRwdXQgKi8KLSAgZmlsZV9wdHIgY3VycmVudF9wb3M7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X2J5dGU7Ci0gIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0gIGllZWVfcmVsb2NfdHlwZSAqKnJlbG9jX3RhaWxfcHRyOwotfSBpZWVlX3Blcl9zZWN0aW9uX3R5cGU7Ci0KLSNkZWZpbmUgaWVlZV9wZXJfc2VjdGlvbih4KSAoKGllZWVfcGVyX3NlY3Rpb25fdHlwZSAqKSgoeCktPnVzZWRfYnlfYmZkKSkKLSAgCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkICBjaGFyICppbnB1dF9wOwotICB1bnNpZ25lZCBjaGFyICpmaXJzdF9ieXRlOwotICBiZmQgKmFiZmQ7Ci19IGNvbW1vbl9oZWFkZXJfdHlwZSA7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfZGF0YV9zdHJ1Y3QKLXsKLSAgY29tbW9uX2hlYWRlcl90eXBlIGg7Ci0gIGJvb2xlYW4gcmVhZF9zeW1ib2xzOwotICBib29sZWFuIHJlYWRfZGF0YTsJCi0gIGZpbGVfcHRyIG91dHB1dF9jdXJzb3I7Ci0gIC8qIE1hcCBvZiBzZWN0aW9uIGluZGV4ZXMgdG8gc2VjdGlvbiBwdHJzICovCi0gIGFzZWN0aW9uICoqc2VjdGlvbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fdGFibGVfc2l6ZTsKLSAgaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfdHlwZSBhZDsKLSAgaWVlZV9tb2R1bGVfYmVnaW5fdHlwZSBtYjsKLSAgaWVlZV93X3ZhcmlhYmxlX3R5cGUgdzsKLSAgCi0gIHVuc2lnbmVkIGludCBzZWN0aW9uX2NvdW50OwotICAKLSAgdW5zaWduZWQgaW50IG1hcF9pZHg7Ci0gIC8qIExpc3Qgb2YgR0xPQkFMIEVYUE9SVCBzeW1ib2xzICovCi0gIGllZWVfc3ltYm9sX3R5cGUgKmV4dGVybmFsX3N5bWJvbHM7Ci0gIC8qIExpc3Qgb2YgVU5ERUZJTkVEIHN5bWJvbHMgKi8KLSAgaWVlZV9zeW1ib2xfdHlwZSAqZXh0ZXJuYWxfcmVmZXJlbmNlOwotICAKLSAgLyogV2hlbiB0aGUgc3ltYm9scyBoYXZlIGJlZW4gY2Fub25pY2FsaXplZCwgdGhleSBhcmUgaW4gYQotICAgICogc3BlY2lhbCBvcmRlciwgd2UgcmVtZW1iZXIgdmFyaW91cyBiYXNlcyBoZXJlLi4gKi8KLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3N5bWJvbF9tYXhfaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9zeW1ib2xfbWluX2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfc3ltYm9sX2NvdW50OwotICBpbnQgZXh0ZXJuYWxfc3ltYm9sX2Jhc2Vfb2Zmc2V0OwotICAKLSAgdW5zaWduZWQgaW50IGV4dGVybmFsX3JlZmVyZW5jZV9tYXhfaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWZlcmVuY2VfbWluX2luZGV4OwotICB1bnNpZ25lZCBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX2NvdW50OwotICBpbnQgZXh0ZXJuYWxfcmVmZXJlbmNlX2Jhc2Vfb2Zmc2V0OwotICAKLQotICBib29sZWFuIHN5bWJvbF90YWJsZV9mdWxsOwotCi0gIAotYm9vbGVhbiBkb25lX2RlYnVnOwotCi0KLWJmZF9jaGFpbl90eXBlICpjaGFpbl9oZWFkOwotYmZkX2NoYWluX3R5cGUgKmNoYWluX3Jvb3Q7Ci0KLX0gaWVlZV9kYXRhX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7Ci0gIGJmZCAqYWJmZDsKLX0gaWVlZV9hcl9vYnN0YWNrX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGllZWVfYXJfZGF0YV9zdHJ1Y3QgCi17Ci0gIGNvbW1vbl9oZWFkZXJfdHlwZSBoOwotICBpZWVlX2FyX29ic3RhY2tfdHlwZSAqZWxlbWVudHM7Ci0gIAotICB1bnNpZ25lZCAgaW50IGVsZW1lbnRfaW5kZXggOwotICB1bnNpZ25lZCBpbnQgZWxlbWVudF9jb3VudDsKLQotfSBpZWVlX2FyX2RhdGFfdHlwZTsKLQotI2RlZmluZSBJRUVFX0RBVEEoYWJmZCkgKChhYmZkKS0+dGRhdGEuaWVlZV9kYXRhKQotI2RlZmluZSBJRUVFX0FSX0RBVEEoYWJmZCkgKChhYmZkKS0+dGRhdGEuaWVlZV9hcl9kYXRhKQotCi0jZGVmaW5lIHB0cihhYmZkKSAoaWVlZV9kYXRhKGFiZmQpLT5pbnB1dF9wKQpkaWZmIC0tZ2l0IGEvYmZkL2xpYm5sbS5oIGIvYmZkL2xpYm5sbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmQyZTRlLi4wMDAwMDAwCi0tLSBhL2JmZC9saWJubG0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZGF0YSBzdHJ1Y3R1cmVzIGZvciBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlcykgZmlsZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQk5MTV9IXwotI2RlZmluZSBfTElCTkxNX0hfIDEKLQotI2lmZGVmIEFSQ0hfU0laRQotIyAgZGVmaW5lIE5MTV9BUkNIX1NJWkUgQVJDSF9TSVpFCi0jZW5kaWYKLSNpbmNsdWRlICJubG0vY29tbW9uLmgiCi0jaW5jbHVkZSAibmxtL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibmxtL2V4dGVybmFsLmgiCi0KLS8qIEEgcmVsb2MgZm9yIGFuIGltcG9ydGVkIE5MTSBzeW1ib2wuICBOb3JtYWwgcmVsb2NzIGFyZSBhc3NvY2lhdGVkCi0gICB3aXRoIHNlY3Rpb25zLCBhbmQgaW5jbHVkZSBhIHN5bWJvbC4gIFRoZXNlIHJlbG9jcyBhcmUgYXNzb2NpYXRlZAotICAgd2l0aCAodW5kZWZpbmVkKSBzeW1ib2xzLCBhbmQgaW5jbHVkZSBhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgbmxtX3JlbGVudAotewotICAvKiBTZWN0aW9uIG9mIHJlbG9jLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIC8qIFJlbG9jIGluZm8gKHN5bV9wdHJfcHRyIGZpZWxkIHNldCBvbmx5IHdoZW4gY2Fub25pY2FsaXplZCkuICAqLwotICBhcmVsZW50IHJlbG9jOwotfTsKLQotLyogSW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYW4gTkxNIHN5bWJvbC4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEJGRCBzeW1ib2wuICAqLwotICBhc3ltYm9sIHN5bWJvbDsKLSAgLyogTnVtYmVyIG9mIHJlbG9jIGVudHJpZXMgZm9yIGltcG9ydGVkIHN5bWJvbC4gICovCi0gIGJmZF9zaXplX3R5cGUgcmNudDsKLSAgLyogQXJyYXkgb2YgcmVsb2MgaW5mb3JtYXRpb24gZm9yIGltcG9ydGVkIHN5bWJvbC4gICovCi0gIHN0cnVjdCBubG1fcmVsZW50ICpyZWxvY3M7Ci19IG5sbU5BTUUoc3ltYm9sX3R5cGUpOwotCi1leHRlcm4gYm9vbGVhbiBubG1fbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIG5sbV9zZXRfYXJjaF9tYWNoIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsCi0JCQkJCSAgdW5zaWduZWQgbG9uZykpOwotCi1leHRlcm4gdm9pZCBubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSAgICAgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfc3ltdGFiX3VwcGVyX2JvdW5kKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShnZXRfc3ltdGFiKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotZXh0ZXJuIGFzeW1ib2wgKm5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0gICAgIFBBUkFNUyAoKGJmZCAqKSk7Ci1leHRlcm4gdm9pZCBubG1OQU1FKHByaW50X3N5bWJvbCkKLSAgICAgUEFSQU1TICgoYmZkICosIFBUUiwgYXN5bWJvbCAqLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLWV4dGVybiBsb25nIG5sbU5BTUUoZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKQotICAgICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotZXh0ZXJuIGxvbmcgbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCAqbmxtTkFNRShvYmplY3RfcCkKLSAgICAgUEFSQU1TICgoYmZkICopKTsKLWV4dGVybiBib29sZWFuIG5sbU5BTUUoc2V0X2FyY2hfbWFjaCkKLSAgICAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIGJvb2xlYW4gbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLSAgICAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLWV4dGVybiBib29sZWFuIG5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICAgICBQQVJBTVMgKChiZmQgKikpOwotCi0vKiBTb21lIHByaXZhdGUgZGF0YSBpcyBzdGFzaGVkIGF3YXkgZm9yIGZ1dHVyZSB1c2UgdXNpbmcgdGhlIHRkYXRhIHBvaW50ZXIKLSAgIGluIHRoZSBiZmQgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG5sbV9vYmpfdGRhdGEKLXsKLSAgLyogQWN0dWFsIGRhdGEsIGJ1dCByZWYgbGlrZSBwdHIgKi8KLSAgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcglubG1fZml4ZWRfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyCW5sbV92YXJpYWJsZV9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcglubG1fdmVyc2lvbl9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCW5sbV9jb3B5cmlnaHRfaGRyWzFdOwotICBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyCW5sbV9leHRlbmRlZF9oZHJbMV07Ci0gIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCW5sbV9jdXN0b21faGRyWzFdOwotICBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgbmxtX2N5Z251c19leHRfaGRyWzFdOwotICAvKiBCRkQgTkxNIHN5bWJvbHMuICAqLwotICBubG1OQU1FKHN5bWJvbF90eXBlKQkJKm5sbV9zeW1ib2xzOwotICAvKiBMb3dlc3QgdGV4dCBhbmQgZGF0YSBWTUEgdmFsdWVzLiAgKi8KLSAgYmZkX3ZtYQkJCW5sbV90ZXh0X2xvdzsKLSAgYmZkX3ZtYQkJCW5sbV9kYXRhX2xvdzsKLSAgLyogQ2FjaGVzIGZvciBkYXRhIHJlYWQgZnJvbSBvYmplY3QgZmlsZS4gICovCi0gIGFyZWxlbnQgKgkJCW5sbV9yZWxvY19maXh1cHM7Ci0gIGFzZWN0aW9uICoqCQkJbmxtX3JlbG9jX2ZpeHVwX3NlY3M7Ci0gIC8qIEJhY2tlbmQgc3BlY2lmaWMgaW5mb3JtYXRpb24uICBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBhIHBvaW50ZXIsCi0gICAgIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgeWV0IGFub3RoZXIgZW50cnkgcG9pbnQgdG8gaW5pdGlhbGl6ZSB0aGUKLSAgICAgc3RydWN0dXJlLiAgKi8KLSAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QJLyogQWxwaGEgYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0JewotCSAgYmZkX3ZtYSBncDsJCQkvKiBHUCB2YWx1ZS4gICovCi0JICBiZmRfdm1hIGxpdGFfYWRkcmVzczsJCS8qIC5saXRhIHNlY3Rpb24gYWRkcmVzcy4gICovCi0JICBiZmRfc2l6ZV90eXBlIGxpdGFfc2l6ZTsJLyogLmxpdGEgc2VjdGlvbiBzaXplLiAgKi8KLQl9Ci0gICAgICBhbHBoYV9iYWNrZW5kX2RhdGE7Ci0gICAgfQotICBiYWNrZW5kX2RhdGE7Ci19OwotCi0jZGVmaW5lIG5sbV90ZGF0YShiZmQpCQkJKChiZmQpIC0+IHRkYXRhLm5sbV9vYmpfZGF0YSkKLSNkZWZpbmUgbmxtX2ZpeGVkX2hlYWRlcihiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2ZpeGVkX2hkcikKLSNkZWZpbmUgbmxtX3ZhcmlhYmxlX2hlYWRlcihiZmQpCShubG1fdGRhdGEoYmZkKSAtPiBubG1fdmFyaWFibGVfaGRyKQotI2RlZmluZSBubG1fdmVyc2lvbl9oZWFkZXIoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV92ZXJzaW9uX2hkcikKLSNkZWZpbmUgbmxtX2NvcHlyaWdodF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2NvcHlyaWdodF9oZHIpCi0jZGVmaW5lIG5sbV9leHRlbmRlZF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2V4dGVuZGVkX2hkcikKLSNkZWZpbmUgbmxtX2N1c3RvbV9oZWFkZXIoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9jdXN0b21faGRyKQotI2RlZmluZSBubG1fY3lnbnVzX2V4dF9oZWFkZXIoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2N5Z251c19leHRfaGRyKQotI2RlZmluZSBubG1fZ2V0X3N5bWJvbHMoYmZkKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9zeW1ib2xzKQotI2RlZmluZSBubG1fc2V0X3N5bWJvbHMoYmZkLCBwKQkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9zeW1ib2xzID0gKHApKQotI2RlZmluZSBubG1fc2V0X3RleHRfbG93KGJmZCwgaSkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV90ZXh0X2xvdyA9IChpKSkKLSNkZWZpbmUgbmxtX2dldF90ZXh0X2xvdyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3RleHRfbG93KQotI2RlZmluZSBubG1fc2V0X2RhdGFfbG93KGJmZCwgaSkJKG5sbV90ZGF0YShiZmQpIC0+IG5sbV9kYXRhX2xvdyA9IChpKSkKLSNkZWZpbmUgbmxtX2dldF9kYXRhX2xvdyhiZmQpCQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX2RhdGFfbG93KQotI2RlZmluZSBubG1fcmVsb2NhdGlvbl9maXh1cHMoYmZkKQkobmxtX3RkYXRhKGJmZCkgLT4gbmxtX3JlbG9jX2ZpeHVwcykKLSNkZWZpbmUgbmxtX3JlbG9jYXRpb25fZml4dXBfc2VjcyhiZmQpCShubG1fdGRhdGEoYmZkKS0+bmxtX3JlbG9jX2ZpeHVwX3NlY3MpCi0KLSNkZWZpbmUgbmxtX2FscGhhX2JhY2tlbmRfZGF0YShiZmQpIFwKLSAgKCZubG1fdGRhdGEgKGJmZCktPmJhY2tlbmRfZGF0YS5hbHBoYV9iYWNrZW5kX2RhdGEpCi0KLS8qIFRoaXMgaXMgdXNlZCB3aGVuIHdyaXRpbmcgb3V0IHRoZSBleHRlcm5hbCByZWxvY3MuICovCi0KLXN0cnVjdCByZWxvY19hbmRfc2VjCi17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYXNlY3Rpb24gKnNlYzsKLX07Ci0KLS8qIFdlIHN0b3JlIHNvbWUgZnVuY3Rpb24gcG9pbnRlciBpbiB0aGUgYmFja2VuZCBzdHJ1Y3R1cmUuICBUaGlzIGxldHMKLSAgIGRpZmZlcmVudCBOTE0gdGFyZ2V0cyBzaGFyZSBtb3N0IG9mIHRoZSBzYW1lIGNvZGUsIHdoaWxlIHByb3ZpZGluZwotICAgc2xpZ2h0bHkgZGlmZmVyZW50IGNvZGUgd2hlcmUgbmVjZXNzYXJ5LiAgKi8KLQotc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEKLXsKLSAgLyogU2lnbmF0dXJlIGZvciB0aGlzIGJhY2tlbmQuICAqLwotICBjaGFyIHNpZ25hdHVyZVtOTE1fU0lHTkFUVVJFX1NJWkVdOwotICAvKiBTaXplIG9mIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIGZpeGVkX2hlYWRlcl9zaXplOwotICAvKiBTaXplIG9mIG9wdGlvbmFsIHByZWZpeCBmb3IgdGhpcyBiYWNrZW5kLiAgU29tZSBiYWNrZW5kIG1heQotICAgICByZXF1aXJlIHRoaXMgdG8gYmUgYSBmdW5jdGlvbiwgYnV0IHNvIGZhciBhIGNvbnN0YW50IGlzIE9LLiAgVGhpcwotICAgICBpcyBmb3IgYSBwcmVmaXggd2hpY2ggcHJlY2VkZXMgdGhlIHN0YW5kYXJkIE5MTSBmaXhlZCBoZWFkZXIuICAqLwotICBiZmRfc2l6ZV90eXBlIG9wdGlvbmFsX3ByZWZpeF9zaXplOwotICAvKiBBcmNoaXRlY3R1cmUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogTWFjaGluZS4gICovCi0gIGxvbmcgbWFjaDsKLSAgLyogU29tZSBOTE0gZm9ybWF0cyBkbyBub3QgdXNlIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiwgc28KLSAgICAgYWxsIHVuaW5pdGlhbGl6ZWQgZGF0YSBtdXN0IGJlIHB1dCBpbnRvIHRoZSByZWd1bGFyIGRhdGEgc2VjdGlvbgotICAgICBpbnN0ZWFkLiAgKi8KLSAgYm9vbGVhbiBub191bmluaXRpYWxpemVkX2RhdGE7Ci0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgaGF2ZSBhIHByZWZpeCBvbiB0aGUgZmlsZS4gIElmIHRoaXMgZnVuY3Rpb24gaXMKLSAgICAgbm90IE5VTEwsIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IG5sbV9vYmplY3RfcC4gIEl0IHNob3VsZCByZXR1cm4KLSAgICAgdHJ1ZSBpZiB0aGlzIGZpbGUgY291bGQgbWF0Y2ggdGhpcyBmb3JtYXQsIGFuZCBpdCBzaG91bGQgbGVhdmUKLSAgICAgdGhlIEJGRCBzdWNoIHRoYXQgYSBiZmRfcmVhZCB3aWxsIHBpY2sgdXAgdGhlIGZpeGVkIGhlYWRlci4gICovCi0gIGJvb2xlYW4gKCpubG1fYmFja2VuZF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLSAgLyogV3JpdGUgb3V0IHRoZSBwcmVmaXguICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBOVUxMLiAgVGhpcyBtdXN0Ci0gICAgIHdyaXRlIG91dCB0aGUgc2FtZSBudW1iZXIgb2YgYnl0ZXMgYXMgaXMgaW4gdGhlIGZpZWxkCi0gICAgIG9wdGlvbmFsX3ByZWZpeF9zaXplLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV93cml0ZV9wcmVmaXgpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIC8qIFJlYWQgYSByZWxvY2F0aW9uIGZpeHVwIGZyb20gYWJmZC4gIFRoZSByZWxvYyBpbmZvcm1hdGlvbiBpcwotICAgICBtYWNoaW5lIHNwZWNpZmljLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgc3ltYm9sIGlmIHRoaXMgaXMKLSAgICAgYW4gaW1wb3J0LCBvciBOVUxMIGlmIHRoaXMgaXMgYSByZWxvYyBmaXh1cC4gIFRoaXMgZnVuY3Rpb24KLSAgICAgc2hvdWxkIHNldCB0aGUgdGhpcmQgYXJndW1lbnQgdG8gdGhlIHNlY3Rpb24gd2hpY2ggdGhlIHJlbG9jCi0gICAgIGJlbG9uZ3MgaW4sIGFuZCB0aGUgZm91cnRoIGFyZ3VtZW50IHRvIHRoZSByZWxvYyBpdHNlbGY7IGl0IGRvZXMKLSAgICAgbm90IG5lZWQgdG8gZmlsbCBpbiB0aGUgc3ltX3B0cl9wdHIgZmllbGQgZm9yIGEgcmVsb2MgYWdhaW5zdCBhbgotICAgICBpbXBvcnQgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiAoKm5sbV9yZWFkX3JlbG9jKSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwKLQkJCQkgICAgIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLSAgLyogVG8gbWFrZSBvYmpjb3B5IHRvIGFuIGkzODYgTkxNIHdvcmssIHRoZSBpMzg2IGJhY2tlbmQgbmVlZHMgYQotICAgICBjaGFuY2UgdG8gd29yayBvdmVyIHRoZSByZWxvY3MuICBUaGlzIGlzIGEgYml0IGlja3kuICAqLwotICBib29sZWFuICgqbmxtX21hbmdsZV9yZWxvY3MpIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIgZGF0YSwKLQkJCQkJYmZkX3ZtYSBvZmZzZXQsCi0JCQkJCWJmZF9zaXplX3R5cGUgY291bnQpKTsKLSAgLyogUmVhZCBhbiBpbXBvcnQgcmVjb3JkIGZyb20gYWJmZC4gIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhpcwotICAgICB3ZXJlIGluIGEgbWFjaGluZS1kZXBlbmRlbnQgZm9ybWF0LCBidXQgaXQgZG9lc24ndCBzZWVtIHRvIGJlLiAqLwotICBib29sZWFuICgqbmxtX3JlYWRfaW1wb3J0KSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotICAvKiBXcml0ZSBhbiBpbXBvcnQgcmVjb3JkIHRvIGFiZmQuICovCi0gIGJvb2xlYW4gKCpubG1fd3JpdGVfaW1wb3J0KSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci0gIC8qIFNldCB0aGUgc2VjdGlvbiBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgVGhpcyBtYXkgYmUgTlVMTCwgaW4gd2hpY2gKLSAgICAgY2FzZSBhIGRlZmF1bHQgbWV0aG9kIHdpbGwgYmUgdXNlZC4gICovCi0gIGJvb2xlYW4gKCpubG1fc2V0X3B1YmxpY19zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotICAvKiBHZXQgdGhlIG9mZnNldCB0byB3cml0ZSBvdXQgZm9yIGEgcHVibGljIHN5bWJvbC4gIFRoaXMgbWF5IGJlCi0gICAgIE5VTEwsIGluIHdoaWNoIGNhc2UgYSBkZWZhdWx0IG1ldGhvZCB3aWxsIGJlIHVzZWQuICAqLwotICBiZmRfdm1hICgqbmxtX2dldF9wdWJsaWNfb2Zmc2V0KSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0gIC8qIFN3YXAgdGhlIGZpeGVkIGhlYWRlciBpbiBhbmQgb3V0ICovCi0gIHZvaWQgKCpubG1fc3dhcF9maGRyX2luKSBQQVJBTVMgKChiZmQgKiwKLQkJCQkgICAgUFRSLAotCQkJCSAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICopKTsKLSAgdm9pZCAoKm5sbV9zd2FwX2ZoZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwKLQkJCQkgICAgIHN0cnVjdCBubG1faW50ZXJuYWxfZml4ZWRfaGVhZGVyICosCi0JCQkJICAgICBQVFIpKTsKLSAgLyogV3JpdGUgb3V0IGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0gIGJvb2xlYW4gKCpubG1fd3JpdGVfZXh0ZXJuYWwpIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLAotCQkJCQkgYXN5bWJvbCAqLAotCQkJCQkgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotICBib29sZWFuICgqbmxtX3dyaXRlX2V4cG9ydCkgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgYmZkX3ZtYSkpOwotfTsKLQotI2RlZmluZSBubG1fYmFja2VuZChiZmQpIFwKLSAgKChzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSAqKSgoYmZkKSAtPiB4dmVjIC0+IGJhY2tlbmRfZGF0YSkpCi0jZGVmaW5lIG5sbV9zaWduYXR1cmUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IHNpZ25hdHVyZSkKLSNkZWZpbmUgbmxtX2ZpeGVkX2hlYWRlcl9zaXplKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBmaXhlZF9oZWFkZXJfc2l6ZSkKLSNkZWZpbmUgbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBvcHRpb25hbF9wcmVmaXhfc2l6ZSkKLSNkZWZpbmUgbmxtX2FyY2hpdGVjdHVyZShiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gYXJjaCkKLSNkZWZpbmUgbmxtX21hY2hpbmUoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG1hY2gpCi0jZGVmaW5lIG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5vX3VuaW5pdGlhbGl6ZWRfZGF0YSkKLSNkZWZpbmUgbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX2JhY2tlbmRfb2JqZWN0X3ApCi0jZGVmaW5lIG5sbV93cml0ZV9wcmVmaXhfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX3ByZWZpeCkKLSNkZWZpbmUgbmxtX3JlYWRfcmVsb2NfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3JlYWRfcmVsb2MpCi0jZGVmaW5lIG5sbV9tYW5nbGVfcmVsb2NzX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9tYW5nbGVfcmVsb2NzKQotI2RlZmluZSBubG1fcmVhZF9pbXBvcnRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3JlYWRfaW1wb3J0KQotI2RlZmluZSBubG1fd3JpdGVfaW1wb3J0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV93cml0ZV9pbXBvcnQpCi0jZGVmaW5lIG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3NldF9wdWJsaWNfc2VjdGlvbikKLSNkZWZpbmUgbmxtX2dldF9wdWJsaWNfb2Zmc2V0X2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9nZXRfcHVibGljX29mZnNldCkKLSNkZWZpbmUgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luX2Z1bmMoYmZkKSBcCi0gIChubG1fYmFja2VuZChiZmQpIC0+IG5sbV9zd2FwX2ZoZHJfaW4pCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3N3YXBfZmhkcl9vdXQpCi0jZGVmaW5lIG5sbV93cml0ZV9leHRlcm5hbF9mdW5jKGJmZCkgXAotICAobmxtX2JhY2tlbmQoYmZkKSAtPiBubG1fd3JpdGVfZXh0ZXJuYWwpCi0jZGVmaW5lIG5sbV93cml0ZV9leHBvcnRfZnVuYyhiZmQpIFwKLSAgKG5sbV9iYWNrZW5kKGJmZCkgLT4gbmxtX3dyaXRlX2V4cG9ydCkKLQotLyogVGhlIE5MTSBjb2RlLCBkYXRhLCBhbmQgdW5pbml0aWFsaXplZCBzZWN0aW9ucyBoYXZlIG5vIG5hbWVzIGRlZmluZWQKLSAgIGluIHRoZSBOTE0sIGJ1dCBiZmQgd2FudHMgdG8gZ2l2ZSB0aGVtIG5hbWVzLCBzbyB1c2UgdGhlIHRyYWRpdGlvbmFsCi0gICBVTklYIG5hbWVzLiAgKi8KLQotI2RlZmluZSBOTE1fQ09ERV9OQU1FCQkJIi50ZXh0IgotI2RlZmluZSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FCSIuZGF0YSIKLSNkZWZpbmUgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FCSIuYnNzIgotCi0jZW5kaWYgLyogX0xJQk5MTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYmZkL2xpYm9hc3lzLmggYi9iZmQvbGlib2FzeXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZWE1OS4uMDAwMDAwMAotLS0gYS9iZmQvbGlib2FzeXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qIEJGRCBpbnRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIE9hc3lzIGZpbGUgZm9ybWF0IGhhbmRsaW5nLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBTY3Jhd2xlZCBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi10eXBlZGVmIHN0cnVjdCBfb2FzeXNfc3ltYm9sCi17Ci0gIGFzeW1ib2wgc3ltYm9sOwotfSBvYXN5c19zeW1ib2xfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3JlbG9jIHsKLSAgYXJlbGVudCByZWxlbnQ7Ci0gIHN0cnVjdCBfb2FzeXNfcmVsb2MgKm5leHQ7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2w7Ci19IG9hc3lzX3JlbG9jX3R5cGU7Ci0KLQotI2RlZmluZSBvYXN5c19zeW1ib2woeCkgKChvYXN5c19zeW1ib2xfdHlwZSAqKSh4KSkKLSNkZWZpbmUgb2FzeXNfcGVyX3NlY3Rpb24oeCkgKChvYXN5c19wZXJfc2VjdGlvbl90eXBlICopKHgtPnVzZWRfYnlfYmZkKSkKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX3Blcl9zZWN0aW9uCi17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIGJvb2xlYW4gaGFkX3ZtYTsKLSAgb2FzeXNfcmVsb2NfdHlwZSAqKnJlbG9jX3RhaWxfcHRyOwotICBiZmRfdm1hIHBjOwotCi0KLSAgZmlsZV9wdHIgY3VycmVudF9wb3M7Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X2J5dGU7Ci0gIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci19IG9hc3lzX3Blcl9zZWN0aW9uX3R5cGU7Ci0KLSNkZWZpbmUgTlNFQ1RJT05TIDEwCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19hcl9vYnN0YWNrIHsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7Ci0gIGJmZCAqYWJmZDsKLX0gb2FzeXNfYXJfb2JzdGFja190eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IF9vYXN5c19tb2R1bGVfaW5mbyB7Ci0gIGZpbGVfcHRyIHBvczsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqbmFtZTsKLX0gb2FzeXNfbW9kdWxlX2luZm9fdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX2FyX2RhdGEgewotICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2R1bGU7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBtb2R1bGVfaW5kZXg7Ci19IG9hc3lzX2FyX2RhdGFfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgX29hc3lzX2RhdGEgewotICBjaGFyICpzdHJpbmdzOwotICBhc3ltYm9sICpzeW1ib2xzOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3N0cmluZ19sZW5ndGg7Ci0gIGFzZWN0aW9uICpzZWN0aW9uc1tPQVNZU19NQVhfU0VDX0NPVU5UXTsKLSAgZmlsZV9wdHIgZmlyc3RfZGF0YV9yZWNvcmQ7Ci19IG9hc3lzX2RhdGFfdHlwZTsKLQotI2RlZmluZSBPQVNZU19EQVRBKGFiZmQpCSgoYWJmZCktPnRkYXRhLm9hc3lzX29ial9kYXRhKQotI2RlZmluZSBPQVNZU19BUl9EQVRBKGFiZmQpCSgoYWJmZCktPnRkYXRhLm9hc3lzX2FyX2RhdGEpCi0KZGlmZiAtLWdpdCBhL2JmZC9saW5rZXIuYyBiL2JmZC9saW5rZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmYjYyMS4uMDAwMDAwMAotLS0gYS9iZmQvbGlua2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODA0ICswLDAgQEAKLS8qIGxpbmtlci5jIC0tIEJGRCBsaW5rZXIgcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotCi0vKgotU0VDVElPTgotCUxpbmtlciBGdW5jdGlvbnMKLQotQGNpbmRleCBMaW5rZXIKLQlUaGUgbGlua2VyIHVzZXMgdGhyZWUgc3BlY2lhbCBlbnRyeSBwb2ludHMgaW4gdGhlIEJGRCB0YXJnZXQKLQl2ZWN0b3IuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHdyaXRlIHNwZWNpYWwgcm91dGluZXMgZm9yCi0JdGhlc2UgZW50cnkgcG9pbnRzIHdoZW4gY3JlYXRpbmcgYSBuZXcgQkZEIGJhY2sgZW5kLCBzaW5jZQotCWdlbmVyaWMgdmVyc2lvbnMgYXJlIHByb3ZpZGVkLiAgSG93ZXZlciwgd3JpdGluZyB0aGVtIGNhbgotCXNwZWVkIHVwIGxpbmtpbmcgYW5kIG1ha2UgaXQgdXNlIHNpZ25pZmljYW50bHkgbGVzcyBydW50aW1lCi0JbWVtb3J5LgotCi0JVGhlIGZpcnN0IHJvdXRpbmUgY3JlYXRlcyBhIGhhc2ggdGFibGUgdXNlZCBieSB0aGUgb3RoZXIKLQlyb3V0aW5lcy4gIFRoZSBzZWNvbmQgcm91dGluZSBhZGRzIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0Ci0JZmlsZSB0byB0aGUgaGFzaCB0YWJsZS4gIFRoZSB0aGlyZCByb3V0aW5lIHRha2VzIGFsbCB0aGUKLQlvYmplY3QgZmlsZXMgYW5kIGxpbmtzIHRoZW0gdG9nZXRoZXIgdG8gY3JlYXRlIHRoZSBvdXRwdXQKLQlmaWxlLiAgVGhlc2Ugcm91dGluZXMgYXJlIGRlc2lnbmVkIHNvIHRoYXQgdGhlIGxpbmtlciBwcm9wZXIKLQlkb2VzIG5vdCBuZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIHN5bWJvbHMgaW4gdGhlIG9iamVjdAotCWZpbGVzIHRoYXQgaXQgaXMgbGlua2luZy4gIFRoZSBsaW5rZXIgbWVyZWx5IGFycmFuZ2VzIHRoZQotCXNlY3Rpb25zIGFzIGRpcmVjdGVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0IGFuZCBsZXRzIEJGRCBoYW5kbGUKLQl0aGUgZGV0YWlscyBvZiBzeW1ib2xzIGFuZCByZWxvY3MuCi0KLQlUaGUgc2Vjb25kIHJvdXRpbmUgYW5kIHRoaXJkIHJvdXRpbmVzIGFyZSBwYXNzZWQgYSBwb2ludGVyIHRvCi0JYSA8PHN0cnVjdCBiZmRfbGlua19pbmZvPj4gc3RydWN0dXJlIChkZWZpbmVkIGluCi0JPDxiZmRsaW5rLmg+Pikgd2hpY2ggaG9sZHMgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIGxpbmssCi0JaW5jbHVkaW5nIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSAod2hpY2ggd2FzIGNyZWF0ZWQgYnkgdGhlCi0JZmlyc3Qgcm91dGluZSkgYW5kIGEgc2V0IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byB0aGUgbGlua2VyCi0JcHJvcGVyLgotCi0JVGhlIGdlbmVyaWMgbGlua2VyIHJvdXRpbmVzIGFyZSBpbiA8PGxpbmtlci5jPj4sIGFuZCB1c2UgdGhlCi0JaGVhZGVyIGZpbGUgPDxnZW5saW5rLmg+Pi4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhlIG9ubHkgYmFjawotCWVuZHMgd2hpY2ggaGF2ZSBpbXBsZW1lbnRlZCB2ZXJzaW9ucyBvZiB0aGVzZSByb3V0aW5lcyBhcmUKLQlhLm91dCAoaW4gPDxhb3V0eC5oPj4pIGFuZCBFQ09GRiAoaW4gPDxlY29mZi5jPj4pLiAgVGhlIGEub3V0Ci0Jcm91dGluZXMgYXJlIHVzZWQgYXMgZXhhbXBsZXMgdGhyb3VnaG91dCB0aGlzIHNlY3Rpb24uCi0KLUBtZW51CQotQCogQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZTo6Ci1AKiBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZTo6Ci1AKiBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rOjoKLUBlbmQgbWVudQotCi1JTk9ERQotQ3JlYXRpbmcgYSBMaW5rZXIgSGFzaCBUYWJsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlDcmVhdGluZyBhIGxpbmtlciBoYXNoIHRhYmxlCi0KLUBjaW5kZXggX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIGluIHRhcmdldCB2ZWN0b3IKLUBjaW5kZXggdGFyZ2V0IHZlY3RvciAoX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKQotCVRoZSBsaW5rZXIgcm91dGluZXMgbXVzdCBjcmVhdGUgYSBoYXNoIHRhYmxlLCB3aGljaCBtdXN0IGJlCi0JZGVyaXZlZCBmcm9tIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+PiBkZXNjcmliZWQgaW4KLQk8PGJmZGxpbmsuYz4+LiAgQHhyZWZ7SGFzaCBUYWJsZXN9LCBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvCi0JY3JlYXRlIGEgZGVyaXZlZCBoYXNoIHRhYmxlLiAgVGhpcyBlbnRyeSBwb2ludCBpcyBjYWxsZWQgdXNpbmcKLQl0aGUgdGFyZ2V0IHZlY3RvciBvZiB0aGUgbGlua2VyIG91dHB1dCBmaWxlLgotCi0JVGhlIDw8X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlPj4gZW50cnkgcG9pbnQgbXVzdCBhbGxvY2F0ZQotCWFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBkZXNpcmVkIGhhc2ggdGFibGUuICBJZiB0aGUKLQliYWNrIGVuZCBkb2VzIG5vdCByZXF1aXJlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIGJlCi0Jc3RvcmVkIHdpdGggdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIHRoZSBlbnRyeSBwb2ludCBtYXkKLQlzaW1wbHkgY3JlYXRlIGEgPDxzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZT4+LiAgTW9zdCBsaWtlbHksCi0JaG93ZXZlciwgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgbmVlZGVkLgotCi0JRm9yIGV4YW1wbGUsIHdpdGggZWFjaCBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSB0aGUgYS5vdXQKLQlsaW5rZXIga2VlcHMgdGhlIGluZGV4IHRoZSBzeW1ib2wgaGFzIGluIHRoZSBmaW5hbCBvdXRwdXQgZmlsZQotCSh0aGlzIGluZGV4IG51bWJlciBpcyB1c2VkIHNvIHRoYXQgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZQotCWxpbmsgdGhlIHN5bWJvbCBpbmRleCB1c2VkIGluIHRoZSBvdXRwdXQgZmlsZSBjYW4gYmUgcXVpY2tseQotCWZpbGxlZCBpbiB3aGVuIGNvcHlpbmcgb3ZlciBhIHJlbG9jKS4gIFRoZSBhLm91dCBsaW5rZXIgY29kZQotCWRlZmluZXMgdGhlIHJlcXVpcmVkIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyBmb3IgYSBoYXNoIHRhYmxlCi0JZGVyaXZlZCBmcm9tIDw8c3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGU+Pi4gIFRoZSBhLm91dCBsaW5rZXIKLQloYXNoIHRhYmxlIGlzIGNyZWF0ZWQgYnkgdGhlIGZ1bmN0aW9uCi0JPDxOQU1FKGFvdXQsbGlua19oYXNoX3RhYmxlX2NyZWF0ZSk+PjsgaXQgc2ltcGx5IGFsbG9jYXRlcwotCXNwYWNlIGZvciB0aGUgaGFzaCB0YWJsZSwgaW5pdGlhbGl6ZXMgaXQsIGFuZCByZXR1cm5zIGEKLQlwb2ludGVyIHRvIGl0LgotCi0JV2hlbiB3cml0aW5nIHRoZSBsaW5rZXIgcm91dGluZXMgZm9yIGEgbmV3IGJhY2sgZW5kLCB5b3Ugd2lsbAotCWdlbmVyYWxseSBub3Qga25vdyBleGFjdGx5IHdoaWNoIGZpZWxkcyB3aWxsIGJlIHJlcXVpcmVkIHVudGlsCi0JeW91IGhhdmUgZmluaXNoZWQuICBZb3Ugc2hvdWxkIHNpbXBseSBjcmVhdGUgYSBuZXcgaGFzaCB0YWJsZQotCXdoaWNoIGRlZmluZXMgbm8gYWRkaXRpb25hbCBmaWVsZHMsIGFuZCB0aGVuIHNpbXBseSBhZGQgZmllbGRzCi0JYXMgdGhleSBiZWNvbWUgbmVjZXNzYXJ5LgotCi1JTk9ERQotQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssIENyZWF0aW5nIGEgTGlua2VyIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlBZGRpbmcgc3ltYm9scyB0byB0aGUgaGFzaCB0YWJsZQotCi1AY2luZGV4IF9iZmRfbGlua19hZGRfc3ltYm9scyBpbiB0YXJnZXQgdmVjdG9yCi1AY2luZGV4IHRhcmdldCB2ZWN0b3IgKF9iZmRfbGlua19hZGRfc3ltYm9scykKLQlUaGUgbGlua2VyIHByb3BlciB3aWxsIGNhbGwgdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4KLQllbnRyeSBwb2ludCBmb3IgZWFjaCBvYmplY3QgZmlsZSBvciBhcmNoaXZlIHdoaWNoIGlzIHRvIGJlCi0JbGlua2VkICh0eXBpY2FsbHkgdGhlc2UgYXJlIHRoZSBmaWxlcyBuYW1lZCBvbiB0aGUgY29tbWFuZAotCWxpbmUsIGJ1dCBzb21lIG1heSBhbHNvIGNvbWUgZnJvbSB0aGUgbGlua2VyIHNjcmlwdCkuICBUaGUKLQllbnRyeSBwb2ludCBpcyByZXNwb25zaWJsZSBmb3IgZXhhbWluaW5nIHRoZSBmaWxlLiAgRm9yIGFuCi0Jb2JqZWN0IGZpbGUsIEJGRCBtdXN0IGFkZCBhbnkgcmVsZXZhbnQgc3ltYm9sIGluZm9ybWF0aW9uIHRvCi0JdGhlIGhhc2ggdGFibGUuICBGb3IgYW4gYXJjaGl2ZSwgQkZEIG11c3QgZGV0ZXJtaW5lIHdoaWNoCi0JZWxlbWVudHMgb2YgdGhlIGFyY2hpdmUgc2hvdWxkIGJlIHVzZWQgYW5kIGFkZGluZyB0aGVtIHRvIHRoZQotCWxpbmsuCi0KLQlUaGUgYS5vdXQgdmVyc2lvbiBvZiB0aGlzIGVudHJ5IHBvaW50IGlzCi0JPDxOQU1FKGFvdXQsbGlua19hZGRfc3ltYm9scyk+Pi4KLQotQG1lbnUKLUAqIERpZmZlcmluZyBmaWxlIGZvcm1hdHM6OgotQCogQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZTo6Ci1AKiBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmU6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1EaWZmZXJpbmcgZmlsZSBmb3JtYXRzLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgU3ltYm9scyB0byB0aGUgSGFzaCBUYWJsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKLVNVQlNVQlNFQ1RJT04KLQlEaWZmZXJpbmcgZmlsZSBmb3JtYXRzCi0KLQlOb3JtYWxseSBhbGwgdGhlIGZpbGVzIGludm9sdmVkIGluIGEgbGluayB3aWxsIGJlIG9mIHRoZSBzYW1lCi0JZm9ybWF0LCBidXQgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBsaW5rIHRvZ2V0aGVyIGRpZmZlcmVudAotCWZvcm1hdCBvYmplY3QgZmlsZXMsIGFuZCB0aGUgYmFjayBlbmQgbXVzdCBzdXBwb3J0IHRoYXQuICBUaGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGVudHJ5IHBvaW50IGlzIGNhbGxlZCB2aWEgdGhlIHRhcmdldAotCXZlY3RvciBvZiB0aGUgZmlsZSB0byBiZSBhZGRlZC4gIFRoaXMgaGFzIGFuIGltcG9ydGFudAotCWNvbnNlcXVlbmNlOiB0aGUgZnVuY3Rpb24gbWF5IG5vdCBhc3N1bWUgdGhhdCB0aGUgaGFzaCB0YWJsZQotCWlzIHRoZSB0eXBlIGNyZWF0ZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcKLQk8PF9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZT4+IHZlY3Rvci4gIEFsbCB0aGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IGZ1bmN0aW9uIGNhbiBhc3N1bWUgYWJvdXQgdGhlIGhhc2gKLQl0YWJsZSBpcyB0aGF0IGl0IGlzIGRlcml2ZWQgZnJvbSA8PHN0cnVjdAotCWJmZF9saW5rX2hhc2hfdGFibGU+Pi4KLQotCVNvbWV0aW1lcyB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbiBtdXN0IHN0b3JlCi0Jc29tZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGFzaCB0YWJsZSBlbnRyeSB0byBiZSB1c2VkIGJ5IHRoZQotCTw8X2JmZF9maW5hbF9saW5rPj4gZnVuY3Rpb24uICBJbiBzdWNoIGEgY2FzZSB0aGUgPDxjcmVhdG9yPj4KLQlmaWVsZCBvZiB0aGUgaGFzaCB0YWJsZSBtdXN0IGJlIGNoZWNrZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0JaGFzaCB0YWJsZSB3YXMgY3JlYXRlZCBieSBhbiBvYmplY3QgZmlsZSBvZiB0aGUgc2FtZSBmb3JtYXQuCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIG11c3QgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIGEKLQloYXNoIGVudHJ5IHdpdGhvdXQgYW55IGV4dHJhIGluZm9ybWF0aW9uIGFkZGVkIGJ5IHRoZQotCTw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24uICBBIGhhc2ggZW50cnkgd2l0aG91dAotCWV4dHJhIGluZm9ybWF0aW9uIHdpbGwgYWxzbyBvY2N1ciB3aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JZGlyZWN0cyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHN5bWJvbC4gIE5vdGUgdGhhdCwgcmVnYXJkbGVzcwotCW9mIGhvdyBhIGhhc2ggdGFibGUgZW50cnkgaXMgYWRkZWQsIGFsbCB0aGUgZmllbGRzIHdpbGwgYmUKLQlpbml0aWFsaXplZCB0byBzb21lIHNvcnQgb2YgbnVsbCB2YWx1ZSBieSB0aGUgaGFzaCB0YWJsZSBlbnRyeQotCWluaXRpYWxpemF0aW9uIGZ1bmN0aW9uLgotCi0JU2VlIDw8ZWNvZmZfbGlua19hZGRfZXh0ZXJuYWxzPj4gZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvCi0JY2hlY2sgdGhlIDw8Y3JlYXRvcj4+IGZpZWxkIGJlZm9yZSBzYXZpbmcgaW5mb3JtYXRpb24gKGluIHRoaXMKLQljYXNlLCB0aGUgRUNPRkYgZXh0ZXJuYWwgc3ltYm9sIGRlYnVnZ2luZyBpbmZvcm1hdGlvbikgaW4gYQotCWhhc2ggdGFibGUgZW50cnkuCi0KLUlOT0RFCi1BZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdCBmaWxlLCBBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUsIERpZmZlcmluZyBmaWxlIGZvcm1hdHMsIEFkZGluZyBTeW1ib2xzIHRvIHRoZSBIYXNoIFRhYmxlCi1TVUJTVUJTRUNUSU9OCi0JQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZQotCi0JV2hlbiB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIGlzIHBhc3NlZCBhbiBvYmplY3QKLQlmaWxlLCBpdCBtdXN0IGFkZCBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMgaW4gdGhhdAotCW9iamVjdCBmaWxlIHRvIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGFjdHVhbCB3b3JrIG9mIGFkZGluZyB0aGUKLQlzeW1ib2wgdG8gdGhlIGhhc2ggdGFibGUgaXMgbm9ybWFsbHkgaGFuZGxlZCBieSB0aGUgZnVuY3Rpb24KLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4uICBUaGUKLQk8PF9iZmRfbGlua19hZGRfc3ltYm9scz4+IHJvdXRpbmUgaXMgcmVzcG9uc2libGUgZm9yIHJlYWRpbmcKLQlhbGwgdGhlIHN5bWJvbHMgZnJvbSB0aGUgb2JqZWN0IGZpbGUgYW5kIHBhc3NpbmcgdGhlIGNvcnJlY3QKLQlpbmZvcm1hdGlvbiB0byA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4uCi0KLQlUaGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiByb3V0aW5lIHNob3VsZCBub3QgdXNlCi0JPDxiZmRfY2Fub25pY2FsaXplX3N5bXRhYj4+IHRvIHJlYWQgdGhlIHN5bWJvbHMuICBUaGUgcG9pbnQgb2YKLQlwcm92aWRpbmcgdGhpcyByb3V0aW5lIGlzIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nCi0JdGhlIHN5bWJvbHMgaW50byBnZW5lcmljIDw8YXN5bWJvbD4+IHN0cnVjdHVyZXMuCi0KLUBmaW5kZXggX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wKLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sPj4gaGFuZGxlcyB0aGUgZGV0YWlscyBvZgotCWNvbWJpbmluZyBjb21tb24gc3ltYm9scywgd2FybmluZyBhYm91dCBtdWx0aXBsZSBkZWZpbml0aW9ucywKLQlhbmQgc28gZm9ydGguICBJdCB0YWtlcyBhcmd1bWVudHMgd2hpY2ggZGVzY3JpYmUgdGhlIHN5bWJvbCB0bwotCWFkZCwgbm90YWJseSBzeW1ib2wgZmxhZ3MsIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldC4gIFRoZQotCXN5bWJvbCBmbGFncyBpbmNsdWRlIHN1Y2ggdGhpbmdzIGFzIDw8QlNGX1dFQUs+PiBvcgotCTw8QlNGX0lORElSRUNUPj4uICBUaGUgc2VjdGlvbiBpcyBhIHNlY3Rpb24gaW4gdGhlIG9iamVjdAotCWZpbGUsIG9yIHNvbWV0aGluZyBsaWtlIDw8YmZkX3VuZF9zZWN0aW9uX3B0cj4+IGZvciBhbiB1bmRlZmluZWQKLQlzeW1ib2wgb3IgPDxiZmRfY29tX3NlY3Rpb25fcHRyPj4gZm9yIGEgY29tbW9uIHN5bWJvbC4KLQotCUlmIHRoZSA8PF9iZmRfZmluYWxfbGluaz4+IHJvdXRpbmUgaXMgYWxzbyBnb2luZyB0byBuZWVkIHRvCi0JcmVhZCB0aGUgc3ltYm9sIGluZm9ybWF0aW9uLCB0aGUgPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PgotCXJvdXRpbmUgc2hvdWxkIHNhdmUgaXQgc29tZXdoZXJlIGF0dGFjaGVkIHRvIHRoZSBvYmplY3QgZmlsZQotCUJGRC4gIEhvd2V2ZXIsIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgb25seSBiZSBzYXZlZCBpZiB0aGUKLQk8PGtlZXBfbWVtb3J5Pj4gZmllbGQgb2YgdGhlIDw8aW5mbz4+IGFyZ3VtZW50IGlzIHRydWUsIHNvCi0JdGhhdCB0aGUgPDwtbm8ta2VlcC1tZW1vcnk+PiBsaW5rZXIgc3dpdGNoIGlzIGVmZmVjdGl2ZS4KLQotCVRoZSBhLm91dCBmdW5jdGlvbiB3aGljaCBhZGRzIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSBpcwotCTw8YW91dF9saW5rX2FkZF9vYmplY3Rfc3ltYm9scz4+LCBhbmQgbW9zdCBvZiB0aGUgaW50ZXJlc3RpbmcKLQl3b3JrIGlzIGluIDw8YW91dF9saW5rX2FkZF9zeW1ib2xzPj4uICBUaGUgbGF0dGVyIHNhdmVzCi0JcG9pbnRlcnMgdG8gdGhlIGhhc2ggdGFibGVzIGVudHJpZXMgY3JlYXRlZCBieQotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2w+PiBpbmRleGVkIGJ5IHN5bWJvbCBudW1iZXIsCi0Jc28gdGhhdCB0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiByb3V0aW5lIGRvZXMgbm90IGhhdmUgdG8gY2FsbAotCXRoZSBoYXNoIHRhYmxlIGxvb2t1cCByb3V0aW5lIHRvIGxvY2F0ZSB0aGUgZW50cnkuCi0KLUlOT0RFCi1BZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUsICwgQWRkaW5nIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUKLVNVQlNVQlNFQ1RJT04KLQlBZGRpbmcgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUKLQotCVdoZW4gdGhlIDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gcm91dGluZSBpcyBwYXNzZWQgYW4KLQlhcmNoaXZlLCBpdCBtdXN0IGxvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZQotCWFyY2hpdmUgYW5kIGRlY2lkZSB3aGljaCBlbGVtZW50cyBvZiB0aGUgYXJjaGl2ZSBzaG91bGQgYmUKLQlpbmNsdWRlZCBpbiB0aGUgbGluay4gIEZvciBlYWNoIHN1Y2ggZWxlbWVudCBpdCBtdXN0IGNhbGwgdGhlCi0JPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gbGlua2VyIGNhbGxiYWNrLCBhbmQgaXQgbXVzdCBhZGQgdGhlCi0Jc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZSB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuCi0KLUBmaW5kZXggX2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scwotCUluIG1vc3QgY2FzZXMgdGhlIHdvcmsgb2YgbG9va2luZyB0aHJvdWdoIHRoZSBzeW1ib2xzIGluIHRoZQotCWFyY2hpdmUgc2hvdWxkIGJlIGRvbmUgYnkgdGhlCi0JPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4gZnVuY3Rpb24uICBUaGlzCi0JZnVuY3Rpb24gYnVpbGRzIGEgaGFzaCB0YWJsZSBmcm9tIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBhbmQKLQlsb29rcyB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZCBzeW1ib2xzIHRvIHNlZSB3aGljaAotCWVsZW1lbnRzIHNob3VsZCBiZSBpbmNsdWRlZC4KLQk8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PiBpcyBwYXNzZWQgYSBmdW5jdGlvbgotCXRvIGNhbGwgdG8gbWFrZSB0aGUgZmluYWwgZGVjaXNpb24gYWJvdXQgYWRkaW5nIGFuIGFyY2hpdmUKLQllbGVtZW50IHRvIHRoZSBsaW5rIGFuZCB0byBkbyB0aGUgYWN0dWFsIHdvcmsgb2YgYWRkaW5nIHRoZQotCXN5bWJvbHMgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLgotCi0JVGhlIGZ1bmN0aW9uIHBhc3NlZCB0bwotCTw8X2JmZF9nZW5lcmljX2xpbmtfYWRkX2FyY2hpdmVfc3ltYm9scz4+IG11c3QgcmVhZCB0aGUKLQlzeW1ib2xzIG9mIHRoZSBhcmNoaXZlIGVsZW1lbnQgYW5kIGRlY2lkZSB3aGV0aGVyIHRoZSBhcmNoaXZlCi0JZWxlbWVudCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICBJZiB0aGUgZWxlbWVudCBpcyB0bwotCWJlIGluY2x1ZGVkLCB0aGUgPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gbGlua2VyIGNhbGxiYWNrCi0Jcm91dGluZSBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBlbGVtZW50IGFzIGFuIGFyZ3VtZW50LCBhbmQKLQl0aGUgZWxlbWVudHMgc3ltYm9scyBtdXN0IGJlIGFkZGVkIHRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZQotCWp1c3QgYXMgdGhvdWdoIHRoZSBlbGVtZW50IGhhZCBpdHNlbGYgYmVlbiBwYXNzZWQgdG8gdGhlCi0JPDxfYmZkX2xpbmtfYWRkX3N5bWJvbHM+PiBmdW5jdGlvbi4KLQotCVdoZW4gdGhlIGEub3V0IDw8X2JmZF9saW5rX2FkZF9zeW1ib2xzPj4gZnVuY3Rpb24gcmVjZWl2ZXMgYW4KLQlhcmNoaXZlLCBpdCBjYWxscyA8PF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHM+PgotCXBhc3NpbmcgPDxhb3V0X2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Pj4gYXMgdGhlIGZ1bmN0aW9uCi0JYXJndW1lbnQuIDw8YW91dF9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudD4+IGNhbGxzCi0JPDxhb3V0X2xpbmtfY2hlY2tfYXJfc3ltYm9scz4+LiAgSWYgdGhlIGxhdHRlciBkZWNpZGVzIHRvIGFkZAotCXRoZSBlbGVtZW50IChhbiBlbGVtZW50IGlzIG9ubHkgYWRkZWQgaWYgaXQgcHJvdmlkZXMgYSByZWFsLAotCW5vbi1jb21tb24sIGRlZmluaXRpb24gZm9yIGEgcHJldmlvdXNseSB1bmRlZmluZWQgb3IgY29tbW9uCi0Jc3ltYm9sKSBpdCBjYWxscyB0aGUgPDxhZGRfYXJjaGl2ZV9lbGVtZW50Pj4gY2FsbGJhY2sgYW5kIHRoZW4KLQk8PGFvdXRfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQ+PiBjYWxscwotCTw8YW91dF9saW5rX2FkZF9zeW1ib2xzPj4gdG8gYWN0dWFsbHkgYWRkIHRoZSBzeW1ib2xzIHRvIHRoZQotCWxpbmtlciBoYXNoIHRhYmxlLgotCi0JVGhlIEVDT0ZGIGJhY2sgZW5kIGlzIHVudXN1YWwgaW4gdGhhdCBpdCBkb2VzIG5vdCBub3JtYWxseQotCWNhbGwgPDxfYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzPj4sIGJlY2F1c2UgRUNPRkYKLQlhcmNoaXZlcyBhbHJlYWR5IGNvbnRhaW4gYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMuICBUaGUgRUNPRkYKLQliYWNrIGVuZCBzZWFyY2hlcyB0aGUgYXJjaGl2ZSBpdHNlbGYgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mCi0JY3JlYXRpbmcgYSBuZXcgaGFzaCB0YWJsZS4KLQotSU5PREUKLVBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssICwgQWRkaW5nIFN5bWJvbHMgdG8gdGhlIEhhc2ggVGFibGUsIExpbmtlciBGdW5jdGlvbnMKLVNVQlNFQ1RJT04KLQlQZXJmb3JtaW5nIHRoZSBmaW5hbCBsaW5rCi0KLUBjaW5kZXggX2JmZF9saW5rX2ZpbmFsX2xpbmsgaW4gdGFyZ2V0IHZlY3RvcgotQGNpbmRleCB0YXJnZXQgdmVjdG9yIChfYmZkX2ZpbmFsX2xpbmspCi0JV2hlbiBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIHRoZSBsaW5rZXIgY2FsbHMKLQl0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBlbnRyeSBwb2ludCBvZiB0aGUgb3V0cHV0IEJGRC4gIFRoaXMKLQlyb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9kdWNpbmcgdGhlIGZpbmFsIG91dHB1dCBmaWxlLAotCXdoaWNoIGhhcyBzZXZlcmFsIGFzcGVjdHMuICBJdCBtdXN0IHJlbG9jYXRlIHRoZSBjb250ZW50cyBvZgotCXRoZSBpbnB1dCBzZWN0aW9ucyBhbmQgY29weSB0aGUgZGF0YSBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0JSXQgbXVzdCBidWlsZCBhbiBvdXRwdXQgc3ltYm9sIHRhYmxlIGluY2x1ZGluZyBhbnkgbG9jYWwKLQlzeW1ib2xzIGZyb20gdGhlIGlucHV0IGZpbGVzIGFuZCB0aGUgZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUKLQloYXNoIHRhYmxlLiAgV2hlbiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgaXQgbXVzdAotCW1vZGlmeSB0aGUgaW5wdXQgcmVsb2NzIGFuZCB3cml0ZSB0aGVtIGludG8gdGhlIG91dHB1dCBmaWxlLgotCVRoZXJlIG1heSBhbHNvIGJlIG9iamVjdCBmb3JtYXQgZGVwZW5kZW50IHdvcmsgdG8gYmUgZG9uZS4KLQotCVRoZSBsaW5rZXIgd2lsbCBhbHNvIGNhbGwgdGhlIDw8d3JpdGVfb2JqZWN0X2NvbnRlbnRzPj4gZW50cnkKLQlwb2ludCB3aGVuIHRoZSBCRkQgaXMgY2xvc2VkLiAgVGhlIHR3byBlbnRyeSBwb2ludHMgbXVzdCB3b3JrCi0JdG9nZXRoZXIgaW4gb3JkZXIgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQgZmlsZS4KLQotCVRoZSBkZXRhaWxzIG9mIGhvdyB0aGlzIHdvcmtzIGFyZSBpbmV2aXRhYmx5IGRlcGVuZGVudCB1cG9uCi0JdGhlIHNwZWNpZmljIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZSBhLm91dAotCTw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBpcyA8PE5BTUUoYW91dCxmaW5hbF9saW5rKT4+LgotCi1AbWVudQotQCogSW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGxpbmtlcjo6Ci1AKiBSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzOjoKLUAqIFdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZTo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLUluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIsIFJlbG9jYXRpbmcgdGhlIHNlY3Rpb24gY29udGVudHMsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmssIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKLVNVQlNVQlNFQ1RJT04KLQlJbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgbGlua2VyCi0KLQlCZWZvcmUgdGhlIGxpbmtlciBjYWxscyB0aGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBlbnRyeSBwb2ludCwKLQlpdCBzZXRzIHVwIHNvbWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZnVuY3Rpb24gdG8gdXNlLgotCi0JVGhlIDw8aW5wdXRfYmZkcz4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQl3aWxsIHBvaW50IHRvIGEgbGlzdCBvZiBhbGwgdGhlIGlucHV0IGZpbGVzIGluY2x1ZGVkIGluIHRoZQotCWxpbmsuICBUaGVzZSBmaWxlcyBhcmUgbGlua2VkIHRocm91Z2ggdGhlIDw8bGlua19uZXh0Pj4gZmllbGQKLQlvZiB0aGUgPDxiZmQ+PiBzdHJ1Y3R1cmUuCi0KLQlFYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIHdpbGwgaGF2ZSBhIGxpc3Qgb2YKLQk8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmVzIGF0dGFjaGVkIHRvIHRoZSA8PGxpbmtfb3JkZXJfaGVhZD4+Ci0JZmllbGQgKHRoZSA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbgotCTw8YmZkbGluay5oPj4pLiAgVGhlc2Ugc3RydWN0dXJlcyBkZXNjcmliZSBob3cgdG8gY3JlYXRlIHRoZQotCWNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBpbiB0ZXJtcyBvZiB0aGUgY29udGVudHMgb2YKLQl2YXJpb3VzIGlucHV0IHNlY3Rpb25zLCBmaWxsIGNvbnN0YW50cywgYW5kLCBldmVudHVhbGx5LCBvdGhlcgotCXR5cGVzIG9mIGluZm9ybWF0aW9uLiAgVGhleSBhbHNvIGRlc2NyaWJlIHJlbG9jcyB0aGF0IG11c3QgYmUKLQljcmVhdGVkIGJ5IHRoZSBCRkQgYmFja2VuZCwgYnV0IGRvIG5vdCBjb3JyZXNwb25kIHRvIGFueSBpbnB1dAotCWZpbGU7IHRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IC1Vciwgd2hpY2ggYnVpbGRzIGNvbnN0cnVjdG9ycwotCXdoaWxlIGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUuCi0KLUlOT0RFCi1SZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBXcml0aW5nIHRoZSBzeW1ib2wgdGFibGUsIEluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBsaW5rZXIsIFBlcmZvcm1pbmcgdGhlIEZpbmFsIExpbmsKLVNVQlNVQlNFQ1RJT04KLQlSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbiBzaG91bGQgbG9vayB0aHJvdWdoIHRoZQotCTw8bGlua19vcmRlcj4+IHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaCBzZWN0aW9uIG9mIHRoZQotCW91dHB1dCBmaWxlLiAgRWFjaCA8PGxpbmtfb3JkZXI+PiBzdHJ1Y3R1cmUgc2hvdWxkIGVpdGhlciBiZQotCWhhbmRsZWQgc3BlY2lhbGx5LCBvciBpdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbgotCTw8X2JmZF9kZWZhdWx0X2xpbmtfb3JkZXI+PiB3aGljaCB3aWxsIGRvIHRoZSByaWdodCB0aGluZwotCSg8PF9iZmRfZGVmYXVsdF9saW5rX29yZGVyPj4gaXMgZGVmaW5lZCBpbiA8PGxpbmtlci5jPj4pLgotCi0JRm9yIGVmZmljaWVuY3ksIGEgPDxsaW5rX29yZGVyPj4gb2YgdHlwZQotCTw8YmZkX2luZGlyZWN0X2xpbmtfb3JkZXI+PiB3aG9zZSBhc3NvY2lhdGVkIHNlY3Rpb24gYmVsb25ncwotCXRvIGEgQkZEIG9mIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb3V0cHV0IEJGRCBtdXN0IGJlIGhhbmRsZWQKLQlzcGVjaWFsbHkuICBUaGlzIHR5cGUgb2YgPDxsaW5rX29yZGVyPj4gZGVzY3JpYmVzIHBhcnQgb2YgYW4KLQlvdXRwdXQgc2VjdGlvbiBpbiB0ZXJtcyBvZiBhIHNlY3Rpb24gYmVsb25naW5nIHRvIG9uZSBvZiB0aGUKLQlpbnB1dCBmaWxlcy4gIFRoZSA8PF9iZmRfZmluYWxfbGluaz4+IGZ1bmN0aW9uIHNob3VsZCByZWFkIHRoZQotCWNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFuZCBhbnkgYXNzb2NpYXRlZCByZWxvY3MsIGFwcGx5IHRoZQotCXJlbG9jcyB0byB0aGUgc2VjdGlvbiBjb250ZW50cywgYW5kIHdyaXRlIG91dCB0aGUgbW9kaWZpZWQKLQlzZWN0aW9uIGNvbnRlbnRzLiAgSWYgcGVyZm9ybWluZyBhIHJlbG9jYXRlYWJsZSBsaW5rLCB0aGUKLQlyZWxvY3MgdGhlbXNlbHZlcyBtdXN0IGFsc28gYmUgbW9kaWZpZWQgYW5kIHdyaXR0ZW4gb3V0LgotCi1AZmluZGV4IF9iZmRfcmVsb2NhdGVfY29udGVudHMKLUBmaW5kZXggX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlCi0JVGhlIGZ1bmN0aW9ucyA8PF9iZmRfcmVsb2NhdGVfY29udGVudHM+PiBhbmQKLQk8PF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZT4+IHByb3ZpZGUgc29tZSBnZW5lcmFsIHN1cHBvcnQgZm9yCi0JcGVyZm9ybWluZyB0aGUgYWN0dWFsIHJlbG9jYXRpb25zLCBub3RhYmx5IG92ZXJmbG93IGNoZWNraW5nLgotCVRoZWlyIGFyZ3VtZW50cyBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzeW1ib2wgdGhlCi0JcmVsb2NhdGlvbiBpcyBhZ2FpbnN0IGFuZCBhIDw8cmVsb2NfaG93dG9fdHlwZT4+IGFyZ3VtZW50Ci0Jd2hpY2ggZGVzY3JpYmVzIHRoZSByZWxvY2F0aW9uIHRvIHBlcmZvcm0uICBUaGVzZSBmdW5jdGlvbnMKLQlhcmUgZGVmaW5lZCBpbiA8PHJlbG9jLmM+Pi4KLQotCVRoZSBhLm91dCBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIHJlYWRpbmcsIHJlbG9jYXRpbmcsIGFuZAotCXdyaXRpbmcgc2VjdGlvbiBjb250ZW50cyBpcyA8PGFvdXRfbGlua19pbnB1dF9zZWN0aW9uPj4uICBUaGUKLQlhY3R1YWwgcmVsb2NhdGlvbiBpcyBkb25lIGluIDw8YW91dF9saW5rX2lucHV0X3NlY3Rpb25fc3RkPj4KLQlhbmQgPDxhb3V0X2xpbmtfaW5wdXRfc2VjdGlvbl9leHQ+Pi4KLQotSU5PREUKLVdyaXRpbmcgdGhlIHN5bWJvbCB0YWJsZSwgLCBSZWxvY2F0aW5nIHRoZSBzZWN0aW9uIGNvbnRlbnRzLCBQZXJmb3JtaW5nIHRoZSBGaW5hbCBMaW5rCi1TVUJTVUJTRUNUSU9OCi0JV3JpdGluZyB0aGUgc3ltYm9sIHRhYmxlCi0KLQlUaGUgPDxfYmZkX2ZpbmFsX2xpbms+PiBmdW5jdGlvbiBtdXN0IGdhdGhlciBhbGwgdGhlIHN5bWJvbHMKLQlpbiB0aGUgaW5wdXQgZmlsZXMgYW5kIHdyaXRlIHRoZW0gb3V0LiAgSXQgbXVzdCBhbHNvIHdyaXRlIG91dAotCWFsbCB0aGUgc3ltYm9scyBpbiB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBUaGlzIG11c3QgYmUKLQljb250cm9sbGVkIGJ5IHRoZSA8PHN0cmlwPj4gYW5kIDw8ZGlzY2FyZD4+IGZpZWxkcyBvZiB0aGUKLQk8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUuCi0KLQlUaGUgbG9jYWwgc3ltYm9scyBvZiB0aGUgaW5wdXQgZmlsZXMgd2lsbCBub3QgaGF2ZSBiZWVuCi0JZW50ZXJlZCBpbnRvIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4gIFRoZSA8PF9iZmRfZmluYWxfbGluaz4+Ci0Jcm91dGluZSBtdXN0IGNvbnNpZGVyIGVhY2ggaW5wdXQgZmlsZSBhbmQgaW5jbHVkZSB0aGUgc3ltYm9scwotCWluIHRoZSBvdXRwdXQgZmlsZS4gIEl0IG1heSBiZSBjb252ZW5pZW50IHRvIGRvIHRoaXMgd2hlbgotCWxvb2tpbmcgdGhyb3VnaCB0aGUgPDxsaW5rX29yZGVyPj4gc3RydWN0dXJlcywgb3IgaXQgbWF5IGJlCi0JZG9uZSBieSBzdGVwcGluZyB0aHJvdWdoIHRoZSA8PGlucHV0X2JmZHM+PiBsaXN0LgotCi0JVGhlIDw8X2JmZF9maW5hbF9saW5rPj4gcm91dGluZSBtdXN0IGFsc28gdHJhdmVyc2UgdGhlIGdsb2JhbAotCWhhc2ggdGFibGUgdG8gZ2F0aGVyIGFsbCB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICBJdAotCWlzIHBvc3NpYmxlIHRoYXQgbW9zdCBvZiB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMgbWF5IGJlCi0Jd3JpdHRlbiBvdXQgd2hlbiBjb25zaWRlcmluZyB0aGUgc3ltYm9scyBvZiBlYWNoIGlucHV0IGZpbGUsCi0JYnV0IGl0IGlzIHN0aWxsIG5lY2Vzc2FyeSB0byB0cmF2ZXJzZSB0aGUgaGFzaCB0YWJsZSBzaW5jZSB0aGUKLQlsaW5rZXIgc2NyaXB0IG1heSBoYXZlIGRlZmluZWQgc29tZSBzeW1ib2xzIHRoYXQgYXJlIG5vdCBpbgotCWFueSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0KLQlUaGUgPDxzdHJpcD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQljb250cm9scyB3aGljaCBzeW1ib2xzIGFyZSB3cml0dGVuIG91dC4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMKLQlhcmUgbGlzdGVkIGluIDw8YmZkbGluay5oPj4uICBJZiB0aGUgdmFsdWUgaXMgPDxzdHJpcF9zb21lPj4sCi0JdGhlbiB0aGUgPDxrZWVwX2hhc2g+PiBmaWVsZCBvZiB0aGUgPDxiZmRfbGlua19pbmZvPj4KLQlzdHJ1Y3R1cmUgaXMgYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8ga2VlcDsgZWFjaCBzeW1ib2wKLQlzaG91bGQgYmUgbG9va2VkIHVwIGluIHRoaXMgaGFzaCB0YWJsZSwgYW5kIG9ubHkgc3ltYm9scyB3aGljaAotCWFyZSBwcmVzZW50IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLQlJZiB0aGUgPDxzdHJpcD4+IGZpZWxkIG9mIHRoZSA8PGJmZF9saW5rX2luZm8+PiBzdHJ1Y3R1cmUKLQlwZXJtaXRzIGxvY2FsIHN5bWJvbHMgdG8gYmUgd3JpdHRlbiBvdXQsIHRoZSA8PGRpc2NhcmQ+PiBmaWVsZAotCWlzIHVzZWQgdG8gZnVydGhlciBjb250cm9scyB3aGljaCBsb2NhbCBzeW1ib2xzIGFyZSBpbmNsdWRlZAotCWluIHRoZSBvdXRwdXQgZmlsZS4gIElmIHRoZSB2YWx1ZSBpcyA8PGRpc2NhcmRfbD4+LCB0aGVuIGFsbAotCWxvY2FsIHN5bWJvbHMgd2hpY2ggYmVnaW4gd2l0aCBhIGNlcnRhaW4gcHJlZml4IGFyZSBkaXNjYXJkZWQ7Ci0JdGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSA8PGJmZF9pc19sb2NhbF9sYWJlbF9uYW1lPj4gZW50cnkgcG9pbnQuCi0KLQlUaGUgYS5vdXQgYmFja2VuZCBoYW5kbGVzIHN5bWJvbHMgYnkgY2FsbGluZwotCTw8YW91dF9saW5rX3dyaXRlX3N5bWJvbHM+PiBvbiBlYWNoIGlucHV0IEJGRCBhbmQgdGhlbgotCXRyYXZlcnNpbmcgdGhlIGdsb2JhbCBoYXNoIHRhYmxlIHdpdGggdGhlIGZ1bmN0aW9uCi0JPDxhb3V0X2xpbmtfd3JpdGVfb3RoZXJfc3ltYm9sPj4uICBJdCBidWlsZHMgYSBzdHJpbmcgdGFibGUKLQl3aGlsZSB3cml0aW5nIG91dCB0aGUgc3ltYm9scywgd2hpY2ggaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0Ci0JZmlsZSBhdCB0aGUgZW5kIG9mIDw8TkFNRShhb3V0LGZpbmFsX2xpbmspPj4uCi0qLwotCi1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50X25vX2NvbGxlY3QKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXN0YXRpYyBib29sZWFuIGdlbmVyaWNfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnRfY29sbGVjdAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCkpOwotc3RhdGljIGJvb2xlYW4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqcG5lZWRlZCwgYm9vbGVhbiBjb2xsZWN0KSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmRfc2l6ZV90eXBlIGNvdW50LCBhc3ltYm9sICoqLAotCSAgIGJvb2xlYW4gY29sbGVjdCkpOwotc3RhdGljIGJmZCAqaGFzaF9lbnRyeV9iZmQgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIHZvaWQgc2V0X3N5bWJvbF9mcm9tX2hhc2gKLSAgUEFSQU1TICgoYXN5bWJvbCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqLCBzaXplX3QgKnBzeW1hbGxvYywgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWZhdWx0X2ZpbGxfbGlua19vcmRlcgotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGVmYXVsdF9pbmRpcmVjdF9saW5rX29yZGVyCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqLCBib29sZWFuKSk7Ci0KLS8qIFRoZSBsaW5rIGhhc2ggdGFibGUgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gYmZkbGluay5oLiAgSXQgcHJvdmlkZXMKLSAgIGEgYmFzZSBoYXNoIHRhYmxlIHdoaWNoIHRoZSBiYWNrZW5kIHNwZWNpZmljIGhhc2ggdGFibGVzIGFyZSBidWlsdAotICAgdXBvbi4gICovCi0KLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnJldCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotCi0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfbmV3OwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBJbml0aWFsaXplIGEgbGluayBoYXNoIHRhYmxlLiAgVGhlIEJGRCBhcmd1bWVudCBpcyB0aGUgb25lCi0gICByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhpcyB0YWJsZS4gICovCi0KLWJvb2xlYW4KLV9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKHRhYmxlLCBhYmZkLCBuZXdmdW5jKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICooKm5ld2Z1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLAotCQkJCQkJc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJCQljb25zdCBjaGFyICopKTsKLXsKLSAgdGFibGUtPmNyZWF0b3IgPSBhYmZkLT54dmVjOwotICB0YWJsZS0+dW5kZWZzID0gTlVMTDsKLSAgdGFibGUtPnVuZGVmc190YWlsID0gTlVMTDsKLSAgcmV0dXJuIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZ0YWJsZS0+dGFibGUsIG5ld2Z1bmMpOwotfQotCi0vKiBMb29rIHVwIGEgc3ltYm9sIGluIGEgbGluayBoYXNoIHRhYmxlLiAgSWYgZm9sbG93IGlzIHRydWUsIHdlCi0gICBmb2xsb3cgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCBhbmQgYmZkX2xpbmtfaGFzaF93YXJuaW5nIGxpbmtzIHRvCi0gICB0aGUgcmVhbCBzeW1ib2wuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqCi1iZmRfbGlua19oYXNoX2xvb2t1cCAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNyZWF0ZTsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGZvbGxvdzsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX2xvb2t1cCAoJnRhYmxlLT50YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpKTsKLQotICBpZiAoZm9sbG93ICYmIHJldCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICB3aGlsZSAocmV0LT50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QKLQkgICAgIHx8IHJldC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3dhcm5pbmcpCi0JcmV0ID0gcmV0LT51LmkubGluazsKLSAgICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogTG9vayB1cCBhIHN5bWJvbCBpbiB0aGUgbWFpbiBsaW5rZXIgaGFzaCB0YWJsZSBpZiB0aGUgc3ltYm9sIG1pZ2h0Ci0gICBiZSB3cmFwcGVkLiAgVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciByZWZlcmVuY2VzIHRvIGFuCi0gICB1bmRlZmluZWQgc3ltYm9sLCBub3QgZm9yIGRlZmluaXRpb25zIG9mIGEgc3ltYm9sLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKgotYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNyZWF0ZTsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGZvbGxvdzsKLXsKLSAgaWYgKGluZm8tPndyYXBfaGFzaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmw7Ci0KLSAgICAgIGwgPSBzdHJpbmc7Ci0gICAgICBpZiAoKmwgPT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSkKLQkrK2w7Ci0KLSN1bmRlZiBXUkFQCi0jZGVmaW5lIFdSQVAgIl9fd3JhcF8iCi0KLSAgICAgIGlmIChiZmRfaGFzaF9sb29rdXAgKGluZm8tPndyYXBfaGFzaCwgbCwgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKm47Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBzeW1ib2wgaXMgYmVpbmcgd3JhcHBlZC4gIFdlIHdhbnQgdG8gcmVwbGFjZSBhbGwKLSAgICAgICAgICAgICByZWZlcmVuY2VzIHRvIFNZTSB3aXRoIHJlZmVyZW5jZXMgdG8gX193cmFwX1NZTS4gICovCi0KLQkgIG4gPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKGwpICsgc2l6ZW9mIFdSQVAgKyAxKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICAvKiBOb3RlIHRoYXQgc3ltYm9sX2xlYWRpbmdfY2hhciBtYXkgYmUgJ1wwJy4gICovCi0JICBuWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIG5bMV0gPSAnXDAnOwotCSAgc3RyY2F0IChuLCBXUkFQKTsKLQkgIHN0cmNhdCAobiwgbCk7Ci0JICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG4sIGNyZWF0ZSwgdHJ1ZSwgZm9sbG93KTsKLQkgIGZyZWUgKG4pOwotCSAgcmV0dXJuIGg7Ci0JfQotCi0jdW5kZWYgV1JBUAotCi0jdW5kZWYgUkVBTAotI2RlZmluZSBSRUFMICJfX3JlYWxfIgotCi0gICAgICBpZiAoKmwgPT0gJ18nCi0JICAmJiBzdHJuY21wIChsLCBSRUFMLCBzaXplb2YgUkVBTCAtIDEpID09IDAKLQkgICYmIGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+d3JhcF9oYXNoLCBsICsgc2l6ZW9mIFJFQUwgLSAxLAotCQkJICAgICAgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKm47Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBfX3JlYWxfU1lNLCB3aGVyZSBTWU0gaXMgYmVpbmcKLSAgICAgICAgICAgICB3cmFwcGVkLiAgV2Ugd2FudCB0byByZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIF9fcmVhbF9TWU0KLSAgICAgICAgICAgICB3aXRoIHJlZmVyZW5jZXMgdG8gU1lNLiAgKi8KLQotCSAgbiA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAobCArIHNpemVvZiBSRUFMIC0gMSkgKyAyKTsKLQkgIGlmIChuID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCi0JICAvKiBOb3RlIHRoYXQgc3ltYm9sX2xlYWRpbmdfY2hhciBtYXkgYmUgJ1wwJy4gICovCi0JICBuWzBdID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKTsKLQkgIG5bMV0gPSAnXDAnOwotCSAgc3RyY2F0IChuLCBsICsgc2l6ZW9mIFJFQUwgLSAxKTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbiwgY3JlYXRlLCB0cnVlLCBmb2xsb3cpOwotCSAgZnJlZSAobik7Ci0JICByZXR1cm4gaDsKLQl9Ci0KLSN1bmRlZiBSRUFMCi0gICAgfQotCi0gIHJldHVybiBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdyk7Ci19Ci0KLS8qIFRyYXZlcnNlIGEgZ2VuZXJpYyBsaW5rIGhhc2ggdGFibGUuICBUaGUgb25seSByZWFzb24gdGhpcyBpcyBub3QgYQotICAgbWFjcm8gaXMgdG8gZG8gYmV0dGVyIHR5cGUgY2hlY2tpbmcuICBUaGlzIGNvZGUgcHJlc3VtZXMgdGhhdCBhbgotICAgYXJndW1lbnQgcGFzc2VkIGFzIGEgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICogbWF5IGJlIGNhdWdodCBhcyBhCi0gICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIHdpdGggbm8gZXhwbGljaXQgY2FzdCByZXF1aXJlZCBvbiB0aGUKLSAgIGNhbGwuICAqLwotCi12b2lkIAotYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAodGFibGUsIGZ1bmMsIGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgYm9vbGVhbiAoKmZ1bmMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpOwotICAgICBQVFIgaW5mbzsKLXsKLSAgYmZkX2hhc2hfdHJhdmVyc2UgKCZ0YWJsZS0+dGFibGUsCi0JCSAgICAgKChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgUFRSKSkpCi0JCSAgICAgIGZ1bmMpLAotCQkgICAgIGluZm8pOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlIHVuZGVmcyBsaXN0LiAgKi8KLQotSU5MSU5FIHZvaWQKLWJmZF9saW5rX2FkZF91bmRlZiAodGFibGUsIGgpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIEJGRF9BU1NFUlQgKGgtPm5leHQgPT0gTlVMTCk7Ci0gIGlmICh0YWJsZS0+dW5kZWZzX3RhaWwgIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgdGFibGUtPnVuZGVmc190YWlsLT5uZXh0ID0gaDsKLSAgaWYgKHRhYmxlLT51bmRlZnMgPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgdGFibGUtPnVuZGVmcyA9IGg7Ci0gIHRhYmxlLT51bmRlZnNfdGFpbCA9IGg7Ci19Ci0MCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBnZW5lcmljIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1fYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0KLSAgICAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikKLQkgX2JmZF9saW5rX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsCi0JCQkJIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT53cml0dGVuID0gZmFsc2U7Ci0gICAgICByZXQtPnN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGFuIGdlbmVyaWMgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKgotX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX3RhYmxlICpyZXQ7Ci0KLSAgcmV0ID0gKChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgX2JmZF9saW5rX2hhc2hfdGFibGVfaW5pdCAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkgICBfYmZkX2dlbmVyaWNfbGlua19oYXNoX25ld2Z1bmMpKQotICAgIHsKLSAgICAgIGZyZWUgKHJldCk7Ci0gICAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gICAgfQotICByZXR1cm4gJnJldC0+cm9vdDsKLX0KLQotLyogR3JhYiB0aGUgc3ltYm9scyBmb3IgYW4gb2JqZWN0IGZpbGUgd2hlbiBkb2luZyBhIGdlbmVyaWMgbGluay4gIFdlCi0gICBzdG9yZSB0aGUgc3ltYm9scyBpbiB0aGUgb3V0c3ltYm9scyBmaWVsZC4gIFdlIG5lZWQgdG8ga2VlcCB0aGVtCi0gICBhcm91bmQgZm9yIHRoZSBlbnRpcmUgbGluayB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IHJlYWQgdGhlbSBvbmNlLgotICAgSWYgd2UgcmVhZCB0aGVtIG11bHRpcGxlIHRpbWVzLCB3ZSBtaWdodCB3aW5kIHVwIHdpdGggcmVsb2NzIGFuZAotICAgdGhlIGhhc2ggdGFibGUgcG9pbnRpbmcgdG8gZGlmZmVyZW50IGluc3RhbmNlcyBvZiB0aGUgc3ltYm9sCi0gICBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpZiAoYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9PSAoYXN5bWJvbCAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBsb25nIHN5bXNpemU7Ci0gICAgICBsb25nIHN5bWNvdW50OwotCi0gICAgICBzeW1zaXplID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICAgICAgaWYgKHN5bXNpemUgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSAoYXN5bWJvbCAqKikgYmZkX2FsbG9jIChhYmZkLCBzeW1zaXplKTsKLSAgICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpID09IE5VTEwgJiYgc3ltc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkpOwotICAgICAgaWYgKHN5bWNvdW50IDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bWNvdW50OwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEdlbmVyaWMgZnVuY3Rpb24gdG8gYWRkIHN5bWJvbHMgdG8gZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUKLSAgIGdsb2JhbCBoYXNoIHRhYmxlLiAgVGhpcyB2ZXJzaW9uIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY29sbGVjdAotICAgY29uc3RydWN0b3JzIGJ5IG5hbWUuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgZmFsc2UpOwotfQotCi0vKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbAotICAgaGFzaCB0YWJsZS4gIFRoaXMgdmVyc2lvbiBhdXRvbWF0aWNhbGx5IGNvbGxlY3RzIGNvbnN0cnVjdG9ycyBieQotICAgbmFtZSwgYXMgdGhlIGNvbGxlY3QyIHByb2dyYW0gZG9lcy4gIEl0IHNob3VsZCBiZSB1c2VkIGZvciBhbnkKLSAgIHRhcmdldCB3aGljaCBkb2VzIG5vdCBwcm92aWRlIHNvbWUgb3RoZXIgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHVwCi0gICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzOyB0aGVzZSBhcmUgYXBwcm94aW1hdGVseSB0aG9zZSB0YXJnZXRzCi0gICBmb3Igd2hpY2ggZ2NjIHVzZXMgY29sbGVjdDIgYW5kIGRvIG5vdCBzdXBwb3J0IHN0YWJzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHNfY29sbGVjdCAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgdHJ1ZSk7Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotewotICBib29sZWFuIHJldDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfZm9ybWF0IChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgcmV0ID0gZ2VuZXJpY19saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbywgY29sbGVjdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgcmV0ID0gKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkgICAgIChhYmZkLCBpbmZvLAotCSAgICAgIChjb2xsZWN0Ci0JICAgICAgID8gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0Ci0JICAgICAgIDogZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0KSkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0ID0gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFkZCBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGdsb2JhbCBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMgKGFiZmQsIGluZm8sIGNvbGxlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLXsKLSAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdCAoYWJmZCwgaW5mbywKLQkJCQkgICAgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKSwKLQkJCQkgICAgICAgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpLAotCQkJCSAgICAgICBjb2xsZWN0KTsKLX0KLQwKLS8qIFdlIGJ1aWxkIGEgaGFzaCB0YWJsZSBvZiBhbGwgc3ltYm9scyBkZWZpbmVkIGluIGFuIGFyY2hpdmUuICAqLwotCi0vKiBBbiBhcmNoaXZlIHN5bWJvbCBtYXkgYmUgZGVmaW5lZCBieSBtdWx0aXBsZSBhcmNoaXZlIGVsZW1lbnRzLgotICAgVGhpcyBsaW5rZWQgbGlzdCBpcyB1c2VkIHRvIGhvbGQgdGhlIGVsZW1lbnRzLiAgKi8KLQotc3RydWN0IGFyY2hpdmVfbGlzdAotewotICBzdHJ1Y3QgYXJjaGl2ZV9saXN0ICpuZXh0OwotICBpbnQgaW5keDsKLX07Ci0KLS8qIEFuIGVudHJ5IGluIGFuIGFyY2hpdmUgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFdoZXJlIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmRlZnM7Ci19OwotCi0vKiBBbiBhcmNoaXZlIGhhc2ggdGFibGUgaXRzZWxmLiAgKi8KLQotc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgdGFibGU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICphcmNoaXZlX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gYXJjaGl2ZV9oYXNoX3RhYmxlX2luaXQKLSAgUEFSQU1TICgoc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSAqLAotCSAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCopIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkgICAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKikpKTsKLQotLyogQ3JlYXRlIGEgbmV3IGVudHJ5IGZvciBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWFyY2hpdmVfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogQ2FsbCB0aGUgYWxsb2NhdGlvbiBtZXRob2Qgb2YgdGhlIHN1cGVyY2xhc3MuICAqLwotICByZXQgPSAoKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikKLQkgYmZkX2hhc2hfbmV3ZnVuYyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQsIHRhYmxlLCBzdHJpbmcpKTsKLQotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIEluaXRpYWxpemUgdGhlIGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmRlZnMgPSAoc3RydWN0IGFyY2hpdmVfbGlzdCAqKSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWFyY2hpdmVfaGFzaF90YWJsZV9pbml0ICh0YWJsZSwgbmV3ZnVuYykKLSAgICAgc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKCpuZXdmdW5jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwKLQkJCQkJCXN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLAotCQkJCQkJY29uc3QgY2hhciAqKSk7Ci17Ci0gIHJldHVybiBiZmRfaGFzaF90YWJsZV9pbml0ICgmdGFibGUtPnRhYmxlLCBuZXdmdW5jKTsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBhcmNoaXZlIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGFyY2hpdmVfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3QgYXJjaGl2ZV9oYXNoX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0KS0+dGFibGUsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogQWxsb2NhdGUgc3BhY2UgaW4gYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhcmNoaXZlX2hhc2hfYWxsb2NhdGUodCwgc2l6ZSkgYmZkX2hhc2hfYWxsb2NhdGUgKCYodCktPnRhYmxlLCAoc2l6ZSkpCi0KLS8qIEZyZWUgYW4gYXJjaGl2ZSBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBhcmNoaXZlX2hhc2hfdGFibGVfZnJlZSh0KSBiZmRfaGFzaF90YWJsZV9mcmVlICgmKHQpLT50YWJsZSkKLQotLyogR2VuZXJpYyBmdW5jdGlvbiB0byBhZGQgc3ltYm9scyBmcm9tIGFuIGFyY2hpdmUgZmlsZSB0byB0aGUgZ2xvYmFsCi0gICBoYXNoIGZpbGUuICBUaGlzIGZ1bmN0aW9uIHByZXN1bWVzIHRoYXQgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlCi0gICBoYXMgYWxyZWFkeSBiZWVuIHJlYWQgaW4gKHRoaXMgaXMgbm9ybWFsbHkgZG9uZSBieSB0aGUKLSAgIGJmZF9jaGVja19mb3JtYXQgZW50cnkgcG9pbnQpLiAgSXQgbG9va3MgdGhyb3VnaCB0aGUgdW5kZWZpbmVkIGFuZAotICAgY29tbW9uIHN5bWJvbHMgYW5kIHNlYXJjaGVzIHRoZSBhcmNoaXZlIHN5bWJvbCB0YWJsZSBmb3IgdGhlbS4gIElmCi0gICBpdCBmaW5kcyBhbiBlbnRyeSwgaXQgaW5jbHVkZXMgdGhlIGFzc29jaWF0ZWQgb2JqZWN0IGZpbGUgaW4gdGhlCi0gICBsaW5rLgotCi0gICBUaGUgb2xkIGxpbmtlciBsb29rZWQgdGhyb3VnaCB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgZm9yCi0gICB1bmRlZmluZWQgc3ltYm9scy4gIFdlIGRvIGl0IHRoZSBvdGhlciB3YXkgYXJvdW5kLCBsb29raW5nIHRocm91Z2gKLSAgIHVuZGVmaW5lZCBzeW1ib2xzIGZvciBzeW1ib2xzIGRlZmluZWQgaW4gdGhlIGFyY2hpdmUuICBUaGUKLSAgIGFkdmFudGFnZSBvZiB0aGUgbmV3ZXIgc2NoZW1lIGlzIHRoYXQgd2Ugb25seSBoYXZlIHRvIGxvb2sgdGhyb3VnaAotICAgdGhlIGxpc3Qgb2YgdW5kZWZpbmVkIHN5bWJvbHMgb25jZSwgd2hlcmVhcyB0aGUgb2xkIG1ldGhvZCBoYWQgdG8KLSAgIHJlLXNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIGVhY2ggdGltZSBhIG5ldyBvYmplY3QgZmlsZSB3YXMgYWRkZWQuCi0KLSAgIFRoZSBDSEVDS0ZOIGFyZ3VtZW50IGlzIHVzZWQgdG8gc2VlIGlmIGFuIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQuICBDSEVDS0ZOIHNob3VsZCBzZXQgKlBORUVERUQgdG8gdHJ1ZSBpZiB0aGUgb2JqZWN0IGZpbGUKLSAgIHNob3VsZCBiZSBpbmNsdWRlZCwgYW5kIG11c3QgYWxzbyBjYWxsIHRoZSBiZmRfbGlua19pbmZvCi0gICBhZGRfYXJjaGl2ZV9lbGVtZW50IGNhbGxiYWNrIGZ1bmN0aW9uIGFuZCBoYW5kbGUgYWRkaW5nIHRoZSBzeW1ib2xzCi0gICB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBDSEVDS0ZOIHNob3VsZCBvbmx5IHJldHVybiBmYWxzZSBpZiBzb21lCi0gICBzb3J0IG9mIGVycm9yIG9jY3Vycy4KLQotICAgRm9yIHNvbWUgZm9ybWF0cywgc3VjaCBhcyBhLm91dCwgaXQgaXMgcG9zc2libGUgdG8gbG9vayB0aHJvdWdoIGFuCi0gICBvYmplY3QgZmlsZSBidXQgbm90IGFjdHVhbGx5IGluY2x1ZGUgaXQgaW4gdGhlIGxpbmsuICBUaGUKLSAgIGFyY2hpdmVfcGFzcyBmaWVsZCBpbiBhIEJGRCBpcyB1c2VkIHRvIGF2b2lkIGNoZWNraW5nIHRoZSBzeW1ib2xzCi0gICBvZiBhbiBvYmplY3QgZmlsZXMgdG9vIG1hbnkgdGltZXMuICBXaGVuIGFuIG9iamVjdCBpcyBpbmNsdWRlZCBpbgotICAgdGhlIGxpbmssIGFyY2hpdmVfcGFzcyBpcyBzZXQgdG8gLTEuICBJZiBhbiBvYmplY3QgaXMgc2Nhbm5lZCBidXQKLSAgIG5vdCBpbmNsdWRlZCwgYXJjaGl2ZV9wYXNzIGlzIHNldCB0byB0aGUgcGFzcyBudW1iZXIuICBUaGUgcGFzcwotICAgbnVtYmVyIGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIG5ldyBvYmplY3QgZmlsZSBpcyBpbmNsdWRlZC4gIFRoZQotICAgcGFzcyBudW1iZXIgaXMgdXNlZCBiZWNhdXNlIHdoZW4gYSBuZXcgb2JqZWN0IGZpbGUgaXMgaW5jbHVkZWQgaXQKLSAgIG1heSBjcmVhdGUgbmV3IHVuZGVmaW5lZCBzeW1ib2xzIHdoaWNoIGNhdXNlIGEgcHJldmlvdXNseSBleGFtaW5lZAotICAgb2JqZWN0IGZpbGUgdG8gYmUgaW5jbHVkZWQuICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfbGlua19hZGRfYXJjaGl2ZV9zeW1ib2xzIChhYmZkLCBpbmZvLCBjaGVja2ZuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICgqY2hlY2tmbikgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJIGJvb2xlYW4gKnBuZWVkZWQpKTsKLXsKLSAgY2Fyc3ltICphcnN5bXM7Ci0gIGNhcnN5bSAqYXJzeW1fZW5kOwotICByZWdpc3RlciBjYXJzeW0gKmFyc3ltOwotICBpbnQgcGFzczsKLSAgc3RydWN0IGFyY2hpdmVfaGFzaF90YWJsZSBhcnN5bV9oYXNoOwotICBpbnQgaW5keDsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipwdW5kZWY7Ci0KLSAgaWYgKCEgYmZkX2hhc19tYXAgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIEFuIGVtcHR5IGFyY2hpdmUgaXMgYSBzcGVjaWFsIGNhc2UuICAqLwotICAgICAgaWYgKGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIChiZmQgKikgTlVMTCkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19hcm1hcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFyc3ltcyA9IGJmZF9hcmRhdGEgKGFiZmQpLT5zeW1kZWZzOwotICBhcnN5bV9lbmQgPSBhcnN5bXMgKyBiZmRfYXJkYXRhIChhYmZkKS0+c3ltZGVmX2NvdW50OwotCi0gIC8qIEluIG9yZGVyIHRvIHF1aWNrbHkgZGV0ZXJtaW5lIHdoZXRoZXIgYW4gc3ltYm9sIGlzIGRlZmluZWQgaW4KLSAgICAgdGhpcyBhcmNoaXZlLCB3ZSBidWlsZCBhIGhhc2ggdGFibGUgb2YgdGhlIHN5bWJvbHMuICAqLwotICBpZiAoISBhcmNoaXZlX2hhc2hfdGFibGVfaW5pdCAoJmFyc3ltX2hhc2gsIGFyY2hpdmVfaGFzaF9uZXdmdW5jKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoYXJzeW0gPSBhcnN5bXMsIGluZHggPSAwOyBhcnN5bSA8IGFyc3ltX2VuZDsgYXJzeW0rKywgaW5keCsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKmFyaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmwsICoqcHA7Ci0KLSAgICAgIGFyaCA9IGFyY2hpdmVfaGFzaF9sb29rdXAgKCZhcnN5bV9oYXNoLCBhcnN5bS0+bmFtZSwgdHJ1ZSwgZmFsc2UpOwotICAgICAgaWYgKGFyaCA9PSAoc3RydWN0IGFyY2hpdmVfaGFzaF9lbnRyeSAqKSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgbCA9ICgoc3RydWN0IGFyY2hpdmVfbGlzdCAqKQotCSAgIGFyY2hpdmVfaGFzaF9hbGxvY2F0ZSAoJmFyc3ltX2hhc2gsIHNpemVvZiAoc3RydWN0IGFyY2hpdmVfbGlzdCkpKTsKLSAgICAgIGlmIChsID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBsLT5pbmR4ID0gaW5keDsKLSAgICAgIGZvciAocHAgPSAmYXJoLT5kZWZzOwotCSAgICpwcCAhPSAoc3RydWN0IGFyY2hpdmVfbGlzdCAqKSBOVUxMOwotCSAgIHBwID0gJigqcHApLT5uZXh0KQotCTsKLSAgICAgICpwcCA9IGw7Ci0gICAgICBsLT5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogVGhlIGFyY2hpdmVfcGFzcyBmaWVsZCBpbiB0aGUgYXJjaGl2ZSBpdHNlbGYgaXMgdXNlZCB0bwotICAgICBpbml0aWFsaXplIFBBU1MsIHNpbmUgd2UgbWF5IHNlYXJjaCB0aGUgc2FtZSBhcmNoaXZlIG11bHRpcGxlCi0gICAgIHRpbWVzLiAgKi8KLSAgcGFzcyA9IGFiZmQtPmFyY2hpdmVfcGFzcyArIDE7Ci0KLSAgLyogTmV3IHVuZGVmaW5lZCBzeW1ib2xzIGFyZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBzbyB3ZQotICAgICBvbmx5IG5lZWQgdG8gbG9vayB0aHJvdWdoIGl0IG9uY2UuICAqLwotICBwdW5kZWYgPSAmaW5mby0+aGFzaC0+dW5kZWZzOwotICB3aGlsZSAoKnB1bmRlZiAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKmFyaDsKLSAgICAgIHN0cnVjdCBhcmNoaXZlX2xpc3QgKmw7Ci0KLSAgICAgIGggPSAqcHVuZGVmOwotCi0gICAgICAvKiBXaGVuIGEgc3ltYm9sIGlzIGRlZmluZWQsIGl0IGlzIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20KLQkgdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JewotCSAgLyogUmVtb3ZlIHRoaXMgZW50cnkgZnJvbSB0aGUgbGlzdCwgZm9yIGdlbmVyYWwgY2xlYW5saW5lc3MKLQkgICAgIGFuZCBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBsb29rIHRocm91Z2ggdGhlIGxpc3QgYWdhaW4KLQkgICAgIGlmIHdlIHNlYXJjaCBhbnkgbW9yZSBsaWJyYXJpZXMuICBXZSBjYW4ndCByZW1vdmUgdGhlCi0JICAgICBlbnRyeSBpZiBpdCBpcyB0aGUgdGFpbCwgYmVjYXVzZSB0aGF0IHdvdWxkIGxvc2UgYW55Ci0JICAgICBlbnRyaWVzIHdlIGFkZCB0byB0aGUgbGlzdCBsYXRlciBvbiAoaXQgd291bGQgYWxzbyBjYXVzZQotCSAgICAgdXMgdG8gbG9zZSB0cmFjayBvZiB3aGV0aGVyIHRoZSBzeW1ib2wgaGFzIGJlZW4KLQkgICAgIHJlZmVyZW5jZWQpLiAgKi8KLQkgIGlmICgqcHVuZGVmICE9IGluZm8tPmhhc2gtPnVuZGVmc190YWlsKQotCSAgICAqcHVuZGVmID0gKCpwdW5kZWYpLT5uZXh0OwotCSAgZWxzZQotCSAgICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGZvciB0aGlzIHN5bWJvbCBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgbWFwLiAgKi8KLSAgICAgIGFyaCA9IGFyY2hpdmVfaGFzaF9sb29rdXAgKCZhcnN5bV9oYXNoLCBoLT5yb290LnN0cmluZywgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChhcmggPT0gKHN0cnVjdCBhcmNoaXZlX2hhc2hfZW50cnkgKikgTlVMTCkKLQl7Ci0JICBwdW5kZWYgPSAmKCpwdW5kZWYpLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBMb29rIGF0IGFsbCB0aGUgb2JqZWN0cyB3aGljaCBkZWZpbmUgdGhpcyBzeW1ib2wuICAqLwotICAgICAgZm9yIChsID0gYXJoLT5kZWZzOyBsICE9IChzdHJ1Y3QgYXJjaGl2ZV9saXN0ICopIE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLQkgIGJmZCAqZWxlbWVudDsKLQkgIGJvb2xlYW4gbmVlZGVkOwotCi0JICAvKiBJZiB0aGUgc3ltYm9sIGhhcyBnb3R0ZW4gZGVmaW5lZCBhbG9uZyB0aGUgd2F5LCBxdWl0LiAgKi8KLQkgIGlmIChoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgICAgJiYgaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLQkgICAgYnJlYWs7Ci0KLQkgIGVsZW1lbnQgPSBiZmRfZ2V0X2VsdF9hdF9pbmRleCAoYWJmZCwgbC0+aW5keCk7Ci0JICBpZiAoZWxlbWVudCA9PSAoYmZkICopIE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBJZiB3ZSd2ZSBhbHJlYWR5IGluY2x1ZGVkIHRoaXMgZWxlbWVudCwgb3IgaWYgd2UndmUKLQkgICAgIGFscmVhZHkgY2hlY2tlZCBpdCBvbiB0aGlzIHBhc3MsIGNvbnRpbnVlLiAgKi8KLQkgIGlmIChlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPT0gLTEKLQkgICAgICB8fCBlbGVtZW50LT5hcmNoaXZlX3Bhc3MgPT0gcGFzcykKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHdlIGNhbid0IGZpZ3VyZSB0aGlzIGVsZW1lbnQgb3V0LCBqdXN0IGlnbm9yZSBpdC4gICovCi0JICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbGVtZW50LCBiZmRfb2JqZWN0KSkKLQkgICAgewotCSAgICAgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIENIRUNLRk4gd2lsbCBzZWUgaWYgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBpbmNsdWRlZCwgYW5kCi0JICAgICBnbyBhaGVhZCBhbmQgaW5jbHVkZSBpdCBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBpZiAoISAoKmNoZWNrZm4pIChlbGVtZW50LCBpbmZvLCAmbmVlZGVkKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmICghIG5lZWRlZCkKLQkgICAgZWxlbWVudC0+YXJjaGl2ZV9wYXNzID0gcGFzczsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVsZW1lbnQtPmFyY2hpdmVfcGFzcyA9IC0xOwotCi0JICAgICAgLyogSW5jcmVtZW50IHRoZSBwYXNzIGNvdW50IHRvIHNob3cgdGhhdCB3ZSBtYXkgbmVlZCB0bwotCQkgcmVjaGVjayBvYmplY3QgZmlsZXMgd2hpY2ggd2VyZSBhbHJlYWR5IGNoZWNrZWQuICAqLwotCSAgICAgICsrcGFzczsKLQkgICAgfQotCX0KLQotICAgICAgcHVuZGVmID0gJigqcHVuZGVmKS0+bmV4dDsKLSAgICB9Ci0KLSAgYXJjaGl2ZV9oYXNoX3RhYmxlX2ZyZWUgKCZhcnN5bV9oYXNoKTsKLQotICAvKiBTYXZlIFBBU1MgaW4gY2FzZSB3ZSBhcmUgY2FsbGVkIGFnYWluLiAgKi8KLSAgYWJmZC0+YXJjaGl2ZV9wYXNzID0gcGFzczsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgYXJjaGl2ZV9oYXNoX3RhYmxlX2ZyZWUgKCZhcnN5bV9oYXNoKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotDAotLyogU2VlIGlmIHdlIHNob3VsZCBpbmNsdWRlIGFuIGFyY2hpdmUgZWxlbWVudC4gIFRoaXMgdmVyc2lvbiBpcyB1c2VkCi0gICB3aGVuIHdlIGRvIG5vdCB3YW50IHRvIGF1dG9tYXRpY2FsbHkgY29sbGVjdCBjb25zdHJ1Y3RvcnMgYmFzZWQgb24KLSAgIHRoZSBzeW1ib2wgbmFtZSwgcHJlc3VtYWJseSBiZWNhdXNlIHdlIGhhdmUgc29tZSBvdGhlciBtZWNoYW5pc20KLSAgIGZvciBmaW5kaW5nIHRoZW0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9ub19jb2xsZWN0IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCwgZmFsc2UpOwotfQotCi0vKiBTZWUgaWYgd2Ugc2hvdWxkIGluY2x1ZGUgYW4gYXJjaGl2ZSBlbGVtZW50LiAgVGhpcyB2ZXJzaW9uIGlzIHVzZWQKLSAgIHdoZW4gd2Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IGNvbGxlY3QgY29uc3RydWN0b3JzIGJhc2VkIG9uIHRoZQotICAgc3ltYm9sIG5hbWUsIGFzIGNvbGxlY3QyIGRvZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudF9jb2xsZWN0IChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICByZXR1cm4gZ2VuZXJpY19saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAoYWJmZCwgaW5mbywgcG5lZWRlZCwgdHJ1ZSk7Ci19Ci0KLS8qIFNlZSBpZiB3ZSBzaG91bGQgaW5jbHVkZSBhbiBhcmNoaXZlIGVsZW1lbnQuICBPcHRpb25hbGx5IGNvbGxlY3QKLSAgIGNvbnN0cnVjdG9ycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nZW5lcmljX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50IChhYmZkLCBpbmZvLCBwbmVlZGVkLCBjb2xsZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGFzeW1ib2wgKipwcCwgKipwcGVuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICghIGdlbmVyaWNfbGlua19yZWFkX3N5bWJvbHMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwcCA9IF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgcHBlbmQgPSBwcCArIF9iZmRfZ2VuZXJpY19saW5rX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIGZvciAoOyBwcCA8IHBwZW5kOyBwcCsrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnA7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBnbG9iYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChwLT5zZWN0aW9uKQotCSAgJiYgKHAtPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfSU5ESVJFQ1QgfCBCU0ZfV0VBSykpID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaWYgd2Uga25vdyBzb21ldGhpbmcgYWJvdXQgdGhpcwotCSBzeW1ib2wsIGFuZCBpdCBpcyB1bmRlZmluZWQgb3IgY29tbW9uLiAgQW4gdW5kZWZpbmVkIHdlYWsKLQkgc3ltYm9sICh0eXBlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKSBpcyBub3QgY29uc2lkZXJlZCB0byBiZQotCSBhIHJlZmVyZW5jZSB3aGVuIHB1bGxpbmcgZmlsZXMgb3V0IG9mIGFuIGFyY2hpdmUuICBTZWUgdGhlCi0JIFNWUjQgQUJJLCBwLiA0LTI3LiAgKi8KLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgYmZkX2FzeW1ib2xfbmFtZSAocCksIGZhbHNlLAotCQkJCWZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICB8fCAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIGgtPnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBQIGlzIGEgc3ltYm9sIHdlIGFyZSBsb29raW5nIGZvci4gICovCi0KLSAgICAgIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JewotCSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLQkgIGFzeW1ib2wgKipzeW1ib2xzOwotCi0JICAvKiBUaGlzIG9iamVjdCBmaWxlIGRlZmluZXMgdGhpcyBzeW1ib2wsIHNvIHB1bGwgaXQgaW4uICAqLwotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLAotCQkJCQkJCSBiZmRfYXN5bWJvbF9uYW1lIChwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN5bWNvdW50ID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQkgIHN5bWJvbHMgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoYWJmZCk7Ci0JICBpZiAoISBnZW5lcmljX2xpbmtfYWRkX3N5bWJvbF9saXN0IChhYmZkLCBpbmZvLCBzeW1jb3VudCwKLQkJCQkJICAgICAgc3ltYm9scywgY29sbGVjdCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICpwbmVlZGVkID0gdHJ1ZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgLyogUCBpcyBhIGNvbW1vbiBzeW1ib2wuICAqLwotCi0gICAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBiZmQgKnN5bWJmZDsKLQkgIGJmZF92bWEgc2l6ZTsKLQkgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCSAgc3ltYmZkID0gaC0+dS51bmRlZi5hYmZkOwotCSAgaWYgKHN5bWJmZCA9PSAoYmZkICopIE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHN5bWJvbCB3YXMgY3JlYXRlZCBhcyB1bmRlZmluZWQgZnJvbSBvdXRzaWRlCi0JCSBCRkQuICBXZSBhc3N1bWUgdGhhdCB3ZSBzaG91bGQgbGluayBpbiB0aGUgb2JqZWN0Ci0JCSBmaWxlLiAgVGhpcyBpcyBmb3IgdGhlIC11IG9wdGlvbiBpbiB0aGUgbGlua2VyLiAgKi8KLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+YWRkX2FyY2hpdmVfZWxlbWVudCkKLQkJICAoaW5mbywgYWJmZCwgYmZkX2FzeW1ib2xfbmFtZSAocCkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgKnBuZWVkZWQgPSB0cnVlOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0KLQkgIC8qIFR1cm4gdGhlIHN5bWJvbCBpbnRvIGEgY29tbW9uIHN5bWJvbCBidXQgZG8gbm90IGxpbmsgaW4KLQkgICAgIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgaXMgaG93IGEub3V0IHdvcmtzLiAgT2JqZWN0Ci0JICAgICBmb3JtYXRzIHRoYXQgcmVxdWlyZSBkaWZmZXJlbnQgc2VtYW50aWNzIG11c3QgaW1wbGVtZW50Ci0JICAgICB0aGlzIGZ1bmN0aW9uIGRpZmZlcmVudGx5LiAgVGhpcyBzeW1ib2wgaXMgYWxyZWFkeSBvbiB0aGUKLQkgICAgIHVuZGVmcyBsaXN0LiAgV2UgYWRkIHRoZSBzZWN0aW9uIHRvIGEgY29tbW9uIHNlY3Rpb24KLQkgICAgIGF0dGFjaGVkIHRvIHN5bWJmZCB0byBlbnN1cmUgdGhhdCBpdCBpcyBpbiBhIEJGRCB3aGljaAotCSAgICAgd2lsbCBiZSBsaW5rZWQgaW4uICAqLwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfY29tbW9uOwotCSAgaC0+dS5jLnAgPQotCSAgICAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSAqKQotCSAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCQlzaXplb2YgKHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeSkpKTsKLQkgIGlmIChoLT51LmMucCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIHNpemUgPSBiZmRfYXN5bWJvbF92YWx1ZSAocCk7Ci0JICBoLT51LmMuc2l6ZSA9IHNpemU7Ci0KLQkgIHBvd2VyID0gYmZkX2xvZzIgKHNpemUpOwotCSAgaWYgKHBvd2VyID4gNCkKLQkgICAgcG93ZXIgPSA0OwotCSAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCi0JICBpZiAocC0+c2VjdGlvbiA9PSBiZmRfY29tX3NlY3Rpb25fcHRyKQotCSAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoc3ltYmZkLCAiQ09NTU9OIik7Ci0JICBlbHNlCi0JICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzeW1iZmQsCi0JCQkJCQkJICBwLT5zZWN0aW9uLT5uYW1lKTsKLQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjb21tb24gc3ltYm9sIGlmIG5lY2Vzc2FyeS4gIFRoaXMKLQkgICAgIGlzIGhvdyBhLm91dCB3b3Jrcy4gIE9iamVjdCBmb3JtYXRzIHRoYXQgcmVxdWlyZQotCSAgICAgZGlmZmVyZW50IHNlbWFudGljcyBtdXN0IGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uCi0JICAgICBkaWZmZXJlbnRseS4gICovCi0JICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHApID4gaC0+dS5jLnNpemUpCi0JICAgIGgtPnUuYy5zaXplID0gYmZkX2FzeW1ib2xfdmFsdWUgKHApOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBhcmNoaXZlIGVsZW1lbnQgaXMgbm90IG5lZWRlZC4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgdGhlIHN5bWJvbHMgZnJvbSBhbiBvYmplY3QgZmlsZSB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuICBBQkZECi0gICBpcyB0aGUgb2JqZWN0IGZpbGUuICBJTkZPIGlzIHRoZSBsaW5rZXIgaW5mb3JtYXRpb24uICBTWU1CT0xfQ09VTlQKLSAgIGlzIHRoZSBudW1iZXIgb2Ygc3ltYm9scy4gIFNZTUJPTFMgaXMgdGhlIGxpc3Qgb2Ygc3ltYm9scy4gIENPTExFQ1QKLSAgIGlzIHRydWUgaWYgY29uc3RydWN0b3JzIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNvbGxlY3RlZCBieSBuYW1lCi0gICBhcyBpcyBkb25lIGJ5IGNvbGxlY3QyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdlbmVyaWNfbGlua19hZGRfc3ltYm9sX2xpc3QgKGFiZmQsIGluZm8sIHN5bWJvbF9jb3VudCwgc3ltYm9scywgY29sbGVjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3NpemVfdHlwZSBzeW1ib2xfY291bnQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci17Ci0gIGFzeW1ib2wgKipwcCwgKipwcGVuZDsKLQotICBwcCA9IHN5bWJvbHM7Ci0gIHBwZW5kID0gc3ltYm9scyArIHN5bWJvbF9jb3VudDsKLSAgZm9yICg7IHBwIDwgcHBlbmQ7IHBwKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqcDsKLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgaWYgKChwLT5mbGFncyAmIChCU0ZfSU5ESVJFQ1QKLQkJICAgICAgIHwgQlNGX1dBUk5JTkcKLQkJICAgICAgIHwgQlNGX0dMT0JBTAotCQkgICAgICAgfCBCU0ZfQ09OU1RSVUNUT1IKLQkJICAgICAgIHwgQlNGX1dFQUspKSAhPSAwCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JICB8fCBiZmRfaXNfaW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjb25zdCBjaGFyICpzdHJpbmc7Ci0JICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChwKTsKLQkgIGlmICgoKHAtPmZsYWdzICYgQlNGX0lORElSRUNUKSAhPSAwCi0JICAgICAgIHx8IGJmZF9pc19pbmRfc2VjdGlvbiAocC0+c2VjdGlvbikpCi0JICAgICAgJiYgcHAgKyAxIDwgcHBlbmQpCi0JICAgIHsKLQkgICAgICBwcCsrOwotCSAgICAgIHN0cmluZyA9IGJmZF9hc3ltYm9sX25hbWUgKCpwcCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChwLT5mbGFncyAmIEJTRl9XQVJOSU5HKSAhPSAwCi0JCSAgICYmIHBwICsgMSA8IHBwZW5kKQotCSAgICB7Ci0JICAgICAgLyogVGhlIG5hbWUgb2YgUCBpcyBhY3R1YWxseSB0aGUgd2FybmluZyBzdHJpbmcsIGFuZCB0aGUKLQkJIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dC4gICovCi0JICAgICAgc3RyaW5nID0gbmFtZTsKLQkgICAgICBwcCsrOwotCSAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqcHApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHN0cmluZyA9IE5VTEw7Ci0KLQkgIGggPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgbmFtZSwgcC0+ZmxhZ3MsIGJmZF9nZXRfc2VjdGlvbiAocCksCi0JCSAgcC0+dmFsdWUsIHN0cmluZywgZmFsc2UsIGNvbGxlY3QsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSAmaCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSBjb25zdHJ1Y3RvciBzeW1ib2wsIGFuZCB0aGUgbGlua2VyIGRpZG4ndCBkbwotICAgICAgICAgICAgIGFueXRoaW5nIHdpdGggaXQsIHRoZW4gd2Ugd2FudCB0byBqdXN0IHBhc3MgdGhlIHN5bWJvbAotICAgICAgICAgICAgIHRocm91Z2ggdG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcyB3aWxsIGhhcHBlbiB3aGVuCi0gICAgICAgICAgICAgbGlua2luZyB3aXRoIC1yLiAgKi8KLQkgIGlmICgocC0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLQkgICAgICAmJiAoaCA9PSBOVUxMIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykpCi0JICAgIHsKLQkgICAgICBwLT51ZGF0YS5wID0gTlVMTDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICAvKiBTYXZlIHRoZSBCRkQgc3ltYm9sIHNvIHRoYXQgd2UgZG9uJ3QgbG9zZSBhbnkgYmFja2VuZAotCSAgICAgc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBtYXkgYmUgYXR0YWNoZWQgdG8gaXQuICBXZSBvbmx5Ci0JICAgICB3YW50IHRoaXMgb25lIGlmIGl0IGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiB0aGUKLQkgICAgIGV4aXN0aW5nIG9uZTsgd2UgZG9uJ3Qgd2FudCB0byByZXBsYWNlIGEgZGVmaW5lZCBzeW1ib2wKLQkgICAgIHdpdGggYW4gdW5kZWZpbmVkIG9uZS4gIFRoaXMgcm91dGluZSBtYXkgYmUgY2FsbGVkIHdpdGggYQotCSAgICAgaGFzaCB0YWJsZSBvdGhlciB0aGFuIHRoZSBnZW5lcmljIGhhc2ggdGFibGUsIHNvIHdlIG9ubHkKLQkgICAgIGRvIHRoaXMgaWYgd2UgYXJlIGNlcnRhaW4gdGhhdCB0aGUgaGFzaCB0YWJsZSBpcyBhCi0JICAgICBnZW5lcmljIG9uZS4gICovCi0JICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnN5bSA9PSAoYXN5bWJvbCAqKSBOVUxMCi0JCSAgfHwgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKQotCQkgICAgICAmJiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAocCkpCi0JCQkgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChoLT5zeW0pKSkpKQotCQl7Ci0JCSAgaC0+c3ltID0gcDsKLQkJICAvKiBCU0ZfT0xEX0NPTU1PTiBpcyBhIGhhY2sgdG8gc3VwcG9ydCBDT0ZGIHJlbG9jCi0JCSAgICAgcmVhZGluZywgYW5kIGl0IHNob3VsZCBnbyBhd2F5IHdoZW4gdGhlIENPRkYKLQkJICAgICBsaW5rZXIgaXMgc3dpdGNoZWQgdG8gdGhlIG5ldyB2ZXJzaW9uLiAgKi8KLQkJICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHApKSkKLQkJICAgIHAtPmZsYWdzIHw9IEJTRl9PTERfQ09NTU9OOwotCQl9Ci0JICAgIH0KLQotCSAgLyogU3RvcmUgYSBiYWNrIHBvaW50ZXIgZnJvbSB0aGUgc3ltYm9sIHRvIHRoZSBoYXNoCi0JICAgICB0YWJsZSBlbnRyeSBmb3IgdGhlIGJlbmVmaXQgb2YgcmVsYXhhdGlvbiBjb2RlIHVudGlsCi0JICAgICBpdCBnZXRzIHJld3JpdHRlbiB0byBub3QgdXNlIGFzeW1ib2wgc3RydWN0dXJlcy4KLQkgICAgIFNldHRpbmcgdGhpcyBpcyBhbHNvIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGVzZQotCSAgICAgc3ltYm9scyB3ZXJlIHNldCB1cCBieSB0aGUgZ2VuZXJpYyBsaW5rZXIuICAqLwotCSAgcC0+dWRhdGEucCA9IChQVFIpIGg7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFdlIHVzZSBhIHN0YXRlIHRhYmxlIHRvIGRlYWwgd2l0aCBhZGRpbmcgc3ltYm9scyBmcm9tIGFuIG9iamVjdAotICAgZmlsZS4gIFRoZSBmaXJzdCBpbmRleCBpbnRvIHRoZSBzdGF0ZSB0YWJsZSBkZXNjcmliZXMgdGhlIHN5bWJvbAotICAgZnJvbSB0aGUgb2JqZWN0IGZpbGUuICBUaGUgc2Vjb25kIGluZGV4IGludG8gdGhlIHN0YXRlIHRhYmxlIGlzIHRoZQotICAgdHlwZSBvZiB0aGUgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotLyogVGhlIHN5bWJvbCBmcm9tIHRoZSBvYmplY3QgZmlsZSBpcyB0dXJuZWQgaW50byBvbmUgb2YgdGhlc2Ugcm93Ci0gICB2YWx1ZXMuICAqLwotCi1lbnVtIGxpbmtfcm93Ci17Ci0gIFVOREVGX1JPVywJCS8qIFVuZGVmaW5lZC4gICovCi0gIFVOREVGV19ST1csCQkvKiBXZWFrIHVuZGVmaW5lZC4gICovCi0gIERFRl9ST1csCQkvKiBEZWZpbmVkLiAgKi8KLSAgREVGV19ST1csCQkvKiBXZWFrIGRlZmluZWQuICAqLwotICBDT01NT05fUk9XLAkJLyogQ29tbW9uLiAgKi8KLSAgSU5EUl9ST1csCQkvKiBJbmRpcmVjdC4gICovCi0gIFdBUk5fUk9XLAkJLyogV2FybmluZy4gICovCi0gIFNFVF9ST1cJCS8qIE1lbWJlciBvZiBzZXQuICAqLwotfTsKLQotLyogYXBwYXJlbnRseSBuZWVkZWQgZm9yIEhpdGFjaGkgMzA1MFIoSEktVVgvV0UyKT8gKi8KLSN1bmRlZiBGQUlMCi0KLS8qIFRoZSBhY3Rpb25zIHRvIHRha2UgaW4gdGhlIHN0YXRlIHRhYmxlLiAgKi8KLQotZW51bSBsaW5rX2FjdGlvbgotewotICBGQUlMLAkJLyogQWJvcnQuICovCi0gIFVORCwJCS8qIE1hcmsgc3ltYm9sIHVuZGVmaW5lZC4gICovCi0gIFdFQUssCQkvKiBNYXJrIHN5bWJvbCB3ZWFrIHVuZGVmaW5lZC4gICovCi0gIERFRiwJCS8qIE1hcmsgc3ltYm9sIGRlZmluZWQuICAqLwotICBERUZXLAkJLyogTWFyayBzeW1ib2wgd2VhayBkZWZpbmVkLiAgKi8KLSAgQ09NLAkJLyogTWFyayBzeW1ib2wgY29tbW9uLiAgKi8KLSAgUkVGLAkJLyogTWFyayBkZWZpbmVkIHN5bWJvbCByZWZlcmVuY2VkLiAgKi8KLSAgQ1JFRiwJCS8qIFBvc3NpYmx5IHdhcm4gYWJvdXQgY29tbW9uIHJlZmVyZW5jZSB0byBkZWZpbmVkIHN5bWJvbC4gICovCi0gIENERUYsCQkvKiBEZWZpbmUgZXhpc3RpbmcgY29tbW9uIHN5bWJvbC4gICovCi0gIE5PQUNULAkvKiBObyBhY3Rpb24uICAqLwotICBCSUcsCQkvKiBNYXJrIHN5bWJvbCBjb21tb24gdXNpbmcgbGFyZ2VzdCBzaXplLiAgKi8KLSAgTURFRiwJCS8qIE11bHRpcGxlIGRlZmluaXRpb24gZXJyb3IuICAqLwotICBNSU5ELAkJLyogTXVsdGlwbGUgaW5kaXJlY3Qgc3ltYm9scy4gICovCi0gIElORCwJCS8qIE1ha2UgaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLSAgQ0lORCwJCS8qIE1ha2UgaW5kaXJlY3Qgc3ltYm9sIGZyb20gZXhpc3RpbmcgY29tbW9uIHN5bWJvbC4gICovCi0gIFNFVCwJCS8qIEFkZCB2YWx1ZSB0byBzZXQuICAqLwotICBNV0FSTiwJLyogTWFrZSB3YXJuaW5nIHN5bWJvbC4gICovCi0gIFdBUk4sCQkvKiBJc3N1ZSB3YXJuaW5nLiAgKi8KLSAgQ1dBUk4sCS8qIFdhcm4gaWYgcmVmZXJlbmNlZCwgZWxzZSBNV0FSTi4gICovCi0gIENZQ0xFLAkvKiBSZXBlYXQgd2l0aCBzeW1ib2wgcG9pbnRlZCB0by4gICovCi0gIFJFRkMsCQkvKiBNYXJrIGluZGlyZWN0IHN5bWJvbCByZWZlcmVuY2VkIGFuZCB0aGVuIENZQ0xFLiAgKi8KLSAgV0FSTkMJCS8qIElzc3VlIHdhcm5pbmcgYW5kIHRoZW4gQ1lDTEUuICAqLwotfTsKLQotLyogVGhlIHN0YXRlIHRhYmxlIGl0c2VsZi4gIFRoZSBmaXJzdCBpbmRleCBpcyBhIGxpbmtfcm93IGFuZCB0aGUKLSAgIHNlY29uZCBpbmRleCBpcyBhIGJmZF9saW5rX2hhc2hfdHlwZS4gICovCi0KLXN0YXRpYyBjb25zdCBlbnVtIGxpbmtfYWN0aW9uIGxpbmtfYWN0aW9uWzhdWzhdID0KLXsKLSAgLyogY3VycmVudFxwcmV2ICAgIG5ldyAgICB1bmRlZiAgdW5kZWZ3IGRlZiAgICBkZWZ3ICAgY29tICAgIGluZHIgICB3YXJuICAqLwotICAvKiBVTkRFRl9ST1cgCSovICB7VU5ELCAgIE5PQUNULCBVTkQsICAgUkVGLCAgIFJFRiwgICBOT0FDVCwgUkVGQywgIFdBUk5DIH0sCi0gIC8qIFVOREVGV19ST1cJKi8gIHtXRUFLLCAgTk9BQ1QsIE5PQUNULCBSRUYsICAgUkVGLCAgIE5PQUNULCBSRUZDLCAgV0FSTkMgfSwKLSAgLyogREVGX1JPVyAJKi8gIHtERUYsICAgREVGLCAgIERFRiwgICBNREVGLCAgREVGLCAgIENERUYsICBNREVGLCAgQ1lDTEUgfSwKLSAgLyogREVGV19ST1cgCSovICB7REVGVywgIERFRlcsICBERUZXLCAgTk9BQ1QsIE5PQUNULCBOT0FDVCwgTk9BQ1QsIENZQ0xFIH0sCi0gIC8qIENPTU1PTl9ST1cJKi8gIHtDT00sICAgQ09NLCAgIENPTSwgICBDUkVGLCAgQ1JFRiwgIEJJRywgICBSRUZDLCAgV0FSTkMgfSwKLSAgLyogSU5EUl9ST1cJKi8gIHtJTkQsICAgSU5ELCAgIElORCwgICBNREVGLCAgSU5ELCAgIENJTkQsICBNSU5ELCAgQ1lDTEUgfSwKLSAgLyogV0FSTl9ST1cgICAqLyAge01XQVJOLCBXQVJOLCAgV0FSTiwgIENXQVJOLCBDV0FSTiwgV0FSTiwgIENXQVJOLCBNV0FSTiB9LAotICAvKiBTRVRfUk9XCSovICB7U0VULCAgIFNFVCwgICBTRVQsICAgU0VULCAgIFNFVCwgICBTRVQsICAgQ1lDTEUsIENZQ0xFIH0KLX07Ci0KLS8qIE1vc3Qgb2YgdGhlIGVudHJpZXMgaW4gdGhlIExJTktfQUNUSU9OIHRhYmxlIGFyZSBzdHJhaWdodGZvcndhcmQsCi0gICBidXQgYSBmZXcgYXJlIHNvbWV3aGF0IHN1YnRsZS4KLQotICAgQSByZWZlcmVuY2UgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sIChVTkRFRl9ST1cvaW5kciBvcgotICAgVU5ERUZXX1JPVy9pbmRyKSBpcyBjb3VudGVkIGFzIGEgcmVmZXJlbmNlIGJvdGggdG8gdGhlIGluZGlyZWN0Ci0gICBzeW1ib2wgYW5kIHRvIHRoZSBzeW1ib2wgdGhlIGluZGlyZWN0IHN5bWJvbCBwb2ludHMgdG8uCi0KLSAgIEEgcmVmZXJlbmNlIHRvIGEgd2FybmluZyBzeW1ib2wgKFVOREVGX1JPVy93YXJuIG9yIFVOREVGV19ST1cvd2FybikKLSAgIGNhdXNlcyB0aGUgd2FybmluZyB0byBiZSBpc3N1ZWQuCi0KLSAgIEEgY29tbW9uIGRlZmluaXRpb24gb2YgYW4gaW5kaXJlY3Qgc3ltYm9sIChDT01NT05fUk9XL2luZHIpIGlzCi0gICB0cmVhdGVkIGFzIGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIExpa2V3aXNlIGZvciBhbiBpbmRpcmVjdAotICAgZGVmaW5pdGlvbiBvZiBhIGNvbW1vbiBzeW1ib2wgKElORFJfUk9XL2NvbSkuCi0KLSAgIEFuIGluZGlyZWN0IGRlZmluaXRpb24gb2YgYSB3YXJuaW5nIChJTkRSX1JPVy93YXJuKSBkb2VzIG5vdCBjYXVzZQotICAgdGhlIHdhcm5pbmcgdG8gYmUgaXNzdWVkLgotCi0gICBJZiBhIHdhcm5pbmcgaXMgY3JlYXRlZCBmb3IgYW4gaW5kaXJlY3Qgc3ltYm9sIChXQVJOX1JPVy9pbmRyKSBubwotICAgd2FybmluZyBpcyBjcmVhdGVkIGZvciB0aGUgc3ltYm9sIHRoZSBpbmRpcmVjdCBzeW1ib2wgcG9pbnRzIHRvLgotCi0gICBBZGRpbmcgYW4gZW50cnkgdG8gYSBzZXQgZG9lcyBub3QgY291bnQgYXMgYSByZWZlcmVuY2UgdG8gYSBzZXQsCi0gICBhbmQgbm8gd2FybmluZyBpcyBpc3N1ZWQgKFNFVF9ST1cvd2FybikuICAqLwotCi0vKiBSZXR1cm4gdGhlIEJGRCBpbiB3aGljaCBhIGhhc2ggZW50cnkgaGFzIGJlZW4gZGVmaW5lZCwgaWYga25vd24uICAqLwotCi1zdGF0aWMgYmZkICoKLWhhc2hfZW50cnlfYmZkIChoKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgd2hpbGUgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF93YXJuaW5nKQotICAgIGggPSBoLT51LmkubGluazsKLSAgc3dpdGNoIChoLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgcmV0dXJuIGgtPnUudW5kZWYuYWJmZDsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmd2VhazoKLSAgICAgIHJldHVybiBoLT51LmRlZi5zZWN0aW9uLT5vd25lcjsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgcmV0dXJuIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lcjsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUuCi0gICBBQkZEIGlzIHRoZSBCRkQgdGhlIHN5bWJvbCBjb21lcyBmcm9tLgotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sLgotICAgRkxBR1MgaXMgdGhlIEJTRl8qIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wuCi0gICBTRUNUSU9OIGlzIHRoZSBzZWN0aW9uIGluIHdoaWNoIHRoZSBzeW1ib2wgaXMgZGVmaW5lZDsgdGhpcyBtYXkgYmUKLSAgICAgYmZkX3VuZF9zZWN0aW9uX3B0ciBvciBiZmRfY29tX3NlY3Rpb25fcHRyLgotICAgVkFMVUUgaXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIHJlbGF0aXZlIHRvIHRoZSBzZWN0aW9uLgotICAgU1RSSU5HIGlzIHVzZWQgZm9yIGVpdGhlciBhbiBpbmRpcmVjdCBzeW1ib2wsIGluIHdoaWNoIGNhc2UgaXQgaXMKLSAgICAgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBpbmRpcmVjdCB0bywgb3IgYSB3YXJuaW5nIHN5bWJvbCwgaW4KLSAgICAgd2hpY2ggY2FzZSBpdCBpcyB0aGUgd2FybmluZyBzdHJpbmcuCi0gICBDT1BZIGlzIHRydWUgaWYgTkFNRSBvciBTVFJJTkcgbXVzdCBiZSBjb3BpZWQgaW50byBsb2NhbGx5Ci0gICAgIGFsbG9jYXRlZCBtZW1vcnkgaWYgdGhleSBuZWVkIHRvIGJlIHNhdmVkLgotICAgQ09MTEVDVCBpcyB0cnVlIGlmIHdlIHNob3VsZCBhdXRvbWF0aWNhbGx5IGNvbGxlY3QgZ2NjIGNvbnN0cnVjdG9yCi0gICAgIG9yIGRlc3RydWN0b3IgbmFtZXMgYXMgY29sbGVjdDIgZG9lcy4KLSAgIEhBU0hQLCBpZiBub3QgTlVMTCwgaXMgYSBwbGFjZSB0byBzdG9yZSB0aGUgY3JlYXRlZCBoYXNoIHRhYmxlCi0gICAgIGVudHJ5OyBpZiAqSEFTSFAgaXMgbm90IE5VTEwsIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgbG9va2VkIHVwCi0gICAgIHRoZSBoYXNoIHRhYmxlIGVudHJ5LCBhbmQgc3RvcmVkIGl0IGluICpIQVNIUC4gKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLCB2YWx1ZSwKLQkJCQkgIHN0cmluZywgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgZW51bSBsaW5rX3JvdyByb3c7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGN5Y2xlOwotCi0gIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICB8fCAoZmxhZ3MgJiBCU0ZfSU5ESVJFQ1QpICE9IDApCi0gICAgcm93ID0gSU5EUl9ST1c7Ci0gIGVsc2UgaWYgKChmbGFncyAmIEJTRl9XQVJOSU5HKSAhPSAwKQotICAgIHJvdyA9IFdBUk5fUk9XOwotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApCi0gICAgcm93ID0gU0VUX1JPVzsKLSAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzICYgQlNGX1dFQUspICE9IDApCi0Jcm93ID0gVU5ERUZXX1JPVzsKLSAgICAgIGVsc2UKLQlyb3cgPSBVTkRFRl9ST1c7Ci0gICAgfQotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMCkKLSAgICByb3cgPSBERUZXX1JPVzsKLSAgZWxzZSBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByb3cgPSBDT01NT05fUk9XOwotICBlbHNlCi0gICAgcm93ID0gREVGX1JPVzsKLQotICBpZiAoaGFzaHAgIT0gTlVMTCAmJiAqaGFzaHAgIT0gTlVMTCkKLSAgICBoID0gKmhhc2hwOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKHJvdyA9PSBVTkRFRl9ST1cgfHwgcm93ID09IFVOREVGV19ST1cpCi0JaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLSAgICAgIGVsc2UKLQloID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+bm90aWNlX2FsbAotICAgICAgfHwgKGluZm8tPm5vdGljZV9oYXNoICE9IChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikgTlVMTAotCSAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+bm90aWNlX2hhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSkKLQkgICAgICAhPSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpKSkKLSAgICB7Ci0gICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+bm90aWNlKSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsIGFiZmQsIHNlY3Rpb24sCi0JCQkJCXZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChoYXNocCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopIE5VTEwpCi0gICAgKmhhc2hwID0gaDsKLQotICBkbwotICAgIHsKLSAgICAgIGVudW0gbGlua19hY3Rpb24gYWN0aW9uOwotCi0gICAgICBjeWNsZSA9IGZhbHNlOwotICAgICAgYWN0aW9uID0gbGlua19hY3Rpb25bKGludCkgcm93XVsoaW50KSBoLT50eXBlXTsKLSAgICAgIHN3aXRjaCAoYWN0aW9uKQotCXsKLQljYXNlIEZBSUw6Ci0JICBhYm9ydCAoKTsKLQotCWNhc2UgTk9BQ1Q6Ci0JICAvKiBEbyBub3RoaW5nLiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBVTkQ6Ci0JICAvKiBNYWtlIGEgbmV3IHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLQkgIGJmZF9saW5rX2FkZF91bmRlZiAoaW5mby0+aGFzaCwgaCk7Ci0JICBicmVhazsKLQotCWNhc2UgV0VBSzoKLQkgIC8qIE1ha2UgYSBuZXcgd2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazsKLQkgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0JICBicmVhazsKLQotCWNhc2UgQ0RFRjoKLQkgIC8qIFdlIGhhdmUgZm91bmQgYSBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaCB3YXMKLQkgICAgIHByZXZpb3VzbHkgY29tbW9uLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgaC0+dS5jLnNpemUsCi0JCSAgYWJmZCwgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLCAoYmZkX3ZtYSkgMCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgREVGOgotCWNhc2UgREVGVzoKLQkgIHsKLQkgICAgZW51bSBiZmRfbGlua19oYXNoX3R5cGUgb2xkdHlwZTsKLQotCSAgICAvKiBEZWZpbmUgYSBzeW1ib2wuICAqLwotCSAgICBvbGR0eXBlID0gaC0+dHlwZTsKLQkgICAgaWYgKGFjdGlvbiA9PSBERUZXKQotCSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZndlYWs7Ci0JICAgIGVsc2UKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKLQkgICAgaC0+dS5kZWYudmFsdWUgPSB2YWx1ZTsKLQotCSAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8sIHdlIGFjdCBsaWtlIGNvbGxlY3QyIGFuZAotCSAgICAgICBpZGVudGlmeSBhbGwgZnVuY3Rpb25zIHRoYXQgbWlnaHQgYmUgZ2xvYmFsCi0JICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kIHBhc3MgdGhlbSB1cCBpbiBhCi0JICAgICAgIGNhbGxiYWNrLiAgV2Ugb25seSBkbyB0aGlzIGZvciBjZXJ0YWluIG9iamVjdCBmaWxlCi0JICAgICAgIHR5cGVzLCBzaW5jZSBtYW55IG9iamVjdCBmaWxlIHR5cGVzIGNhbiBoYW5kbGUgdGhpcwotCSAgICAgICBhdXRvbWF0aWNhbGx5LiAgKi8KLQkgICAgaWYgKGNvbGxlY3QgJiYgbmFtZVswXSA9PSAnXycpCi0JICAgICAgewotCQljb25zdCBjaGFyICpzOwotCi0JCS8qIEEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lIHN0YXJ0cyBsaWtlIHRoaXM6Ci0JCSAgIF8rR0xPQkFMX1tfLiRdW0lEXVtfLiRdIHdoZXJlIHRoZSBmaXJzdCBbXy4kXSBhbmQKLQkJICAgdGhlIHNlY29uZCBhcmUgdGhlIHNhbWUgY2hhcmFjdGVyICh3ZSBhY2NlcHQgYW55Ci0JCSAgIGNoYXJhY3RlciB0aGVyZSwgaW4gY2FzZSBhIG5ldyBvYmplY3QgZmlsZSBmb3JtYXQKLQkJICAgY29tZXMgYWxvbmcgd2l0aCBldmVuIHdvcnNlIG5hbWluZyByZXN0cmljdGlvbnMpLiAgKi8KLQotI2RlZmluZSBDT05TX1BSRUZJWCAiR0xPQkFMXyIKLSNkZWZpbmUgQ09OU19QUkVGSVhfTEVOIChzaXplb2YgQ09OU19QUkVGSVggLSAxKQotCi0JCXMgPSBuYW1lICsgMTsKLQkJd2hpbGUgKCpzID09ICdfJykKLQkJICArK3M7Ci0JCWlmIChzWzBdID09ICdHJwotCQkgICAgJiYgc3RybmNtcCAocywgQ09OU19QUkVGSVgsIENPTlNfUFJFRklYX0xFTiAtIDEpID09IDApCi0JCSAgewotCQkgICAgY2hhciBjOwotCi0JCSAgICBjID0gc1tDT05TX1BSRUZJWF9MRU4gKyAxXTsKLQkJICAgIGlmICgoYyA9PSAnSScgfHwgYyA9PSAnRCcpCi0JCQkmJiBzW0NPTlNfUFJFRklYX0xFTl0gPT0gc1tDT05TX1BSRUZJWF9MRU4gKyAyXSkKLQkJICAgICAgewotCQkJLyogSWYgdGhpcyBpcyBhIGRlZmluaXRpb24gb2YgYSBzeW1ib2wgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBwcmV2aW91c2x5IHdlYWtseSBkZWZpbmVkLCB3ZSBhcmUgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyb3VibGUuICBXZSBoYXZlIGFscmVhZHkgYWRkZWQgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgZW50cnkgZm9yIHRoZSB3ZWFrIGRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwgYW5kIG5vdyB3ZSBhcmUgdHJ5aW5nIHRvIGFkZCBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgbmV3IHN5bWJvbC4gIEZvcnR1bmF0ZWx5LCB0aGlzIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBuZXZlciBhcmlzZSBpbiBwcmFjdGljZS4gICovCi0JCQlpZiAob2xkdHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCQkgIGFib3J0ICgpOwotCi0JCQlpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPmNvbnN0cnVjdG9yKQotCQkJICAgICAgIChpbmZvLAotCQkJCWMgPT0gJ0knID8gdHJ1ZSA6IGZhbHNlLAotCQkJCWgtPnJvb3Quc3RyaW5nLCBhYmZkLCBzZWN0aW9uLCB2YWx1ZSkpKQotCQkJICByZXR1cm4gZmFsc2U7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotCi0JICBicmVhazsKLQotCWNhc2UgQ09NOgotCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbC4gICovCi0JICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgYmZkX2xpbmtfYWRkX3VuZGVmIChpbmZvLT5oYXNoLCBoKTsKLQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2NvbW1vbjsKLQkgIGgtPnUuYy5wID0KLQkgICAgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkgKikKLQkgICAgIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9jb21tb25fZW50cnkpKSk7Ci0JICBpZiAoaC0+dS5jLnAgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBoLT51LmMuc2l6ZSA9IHZhbHVlOwotCi0JICAvKiBTZWxlY3QgYSBkZWZhdWx0IGFsaWdubWVudCBiYXNlZCBvbiB0aGUgc2l6ZS4gIFRoaXMgbWF5Ci0gICAgICAgICAgICAgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY2FsbGVyLiAgKi8KLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHBvd2VyOwotCi0JICAgIHBvd2VyID0gYmZkX2xvZzIgKHZhbHVlKTsKLQkgICAgaWYgKHBvd2VyID4gNCkKLQkgICAgICBwb3dlciA9IDQ7Ci0JICAgIGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLQkgIH0KLQotCSAgLyogVGhlIHNlY3Rpb24gb2YgYSBjb21tb24gc3ltYm9sIGlzIG9ubHkgdXNlZCBpZiB0aGUgY29tbW9uCi0gICAgICAgICAgICAgc3ltYm9sIGlzIGFjdHVhbGx5IGFsbG9jYXRlZC4gIEl0IGJhc2ljYWxseSBwcm92aWRlcyBhCi0gICAgICAgICAgICAgaG9vayBmb3IgdGhlIGxpbmtlciBzY3JpcHQgdG8gZGVjaWRlIHdoaWNoIG91dHB1dCBzZWN0aW9uCi0gICAgICAgICAgICAgdGhlIGNvbW1vbiBzeW1ib2xzIHNob3VsZCBiZSBwdXQgaW4uICBJbiBtb3N0IGNhc2VzLCB0aGUKLSAgICAgICAgICAgICBzZWN0aW9uIG9mIGEgY29tbW9uIHN5bWJvbCB3aWxsIGJlIGJmZF9jb21fc2VjdGlvbl9wdHIsCi0gICAgICAgICAgICAgdGhlIGNvZGUgaGVyZSB3aWxsIGNob29zZSBhIGNvbW1vbiBzeW1ib2wgc2VjdGlvbiBuYW1lZAotICAgICAgICAgICAgICJDT01NT04iLCBhbmQgdGhlIGxpbmtlciBzY3JpcHQgd2lsbCBjb250YWluICooQ09NTU9OKSBpbgotICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4gIEEgZmV3IHRhcmdldHMgdXNlIHNlcGFyYXRlIGNvbW1vbgotICAgICAgICAgICAgIHNlY3Rpb25zIGZvciBzbWFsbCBzeW1ib2xzLCBhbmQgdGhleSByZXF1aXJlIHNwZWNpYWwKLSAgICAgICAgICAgICBoYW5kbGluZy4gICovCi0JICBpZiAoc2VjdGlvbiA9PSBiZmRfY29tX3NlY3Rpb25fcHRyKQotCSAgICB7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsICJDT01NT04iKTsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbi0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNlY3Rpb24tPm93bmVyICE9IGFiZmQpCi0JICAgIHsKLQkgICAgICBoLT51LmMucC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwKLQkJCQkJCQkgICAgc2VjdGlvbi0+bmFtZSk7Ci0JICAgICAgaC0+dS5jLnAtPnNlY3Rpb24tPmZsYWdzID0gU0VDX0FMTE9DOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGgtPnUuYy5wLT5zZWN0aW9uID0gc2VjdGlvbjsKLQkgIGJyZWFrOwotCi0JY2FzZSBSRUY6Ci0JICAvKiBBIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5uZXh0ID09IE5VTEwgJiYgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgIT0gaCkKLQkgICAgaC0+bmV4dCA9IGg7Ci0JICBicmVhazsKLQotCWNhc2UgQklHOgotCSAgLyogV2UgaGF2ZSBmb3VuZCBhIGNvbW1vbiBkZWZpbml0aW9uIGZvciBhIHN5bWJvbCB3aGljaAotCSAgICAgYWxyZWFkeSBoYWQgYSBjb21tb24gZGVmaW5pdGlvbi4gIFVzZSB0aGUgbWF4aW11bSBvZiB0aGUKLQkgICAgIHR3byBzaXplcy4gICovCi0JICBCRkRfQVNTRVJUIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgKGluZm8sIGgtPnJvb3Quc3RyaW5nLAotCQkgIGgtPnUuYy5wLT5zZWN0aW9uLT5vd25lciwgYmZkX2xpbmtfaGFzaF9jb21tb24sIGgtPnUuYy5zaXplLAotCQkgIGFiZmQsIGJmZF9saW5rX2hhc2hfY29tbW9uLCB2YWx1ZSkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAodmFsdWUgPiBoLT51LmMuc2l6ZSkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCBwb3dlcjsKLQotCSAgICAgIGgtPnUuYy5zaXplID0gdmFsdWU7Ci0KLQkgICAgICAvKiBTZWxlY3QgYSBkZWZhdWx0IGFsaWdubWVudCBiYXNlZCBvbiB0aGUgc2l6ZS4gIFRoaXMgbWF5Ci0JCSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjYWxsZXIuICAqLwotCSAgICAgIHBvd2VyID0gYmZkX2xvZzIgKHZhbHVlKTsKLQkgICAgICBpZiAocG93ZXIgPiA0KQotCQlwb3dlciA9IDQ7Ci0JICAgICAgaC0+dS5jLnAtPmFsaWdubWVudF9wb3dlciA9IHBvd2VyOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ1JFRjoKLQkgIHsKLQkgICAgYmZkICpvYmZkOwotCi0JICAgIC8qIFdlIGhhdmUgZm91bmQgYSBjb21tb24gZGVmaW5pdGlvbiBmb3IgYSBzeW1ib2wgd2hpY2gKLQkgICAgICAgd2FzIGFscmVhZHkgZGVmaW5lZC4gIEZJWE1FOiBJdCB3b3VsZCBuaWNlIGlmIHdlIGNvdWxkCi0JICAgICAgIHJlcG9ydCB0aGUgQkZEIHdoaWNoIGRlZmluZWQgYW4gaW5kaXJlY3Qgc3ltYm9sLCBidXQgd2UKLQkgICAgICAgZG9uJ3QgaGF2ZSBhbnl3aGVyZSB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24uICAqLwotCSAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAgICAgb2JmZCA9IGgtPnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgICBlbHNlCi0JICAgICAgb2JmZCA9IE5VTEw7Ci0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfY29tbW9uKQotCQkgICAoaW5mbywgaC0+cm9vdC5zdHJpbmcsIG9iZmQsIGgtPnR5cGUsIChiZmRfdm1hKSAwLAotCQkgICAgYWJmZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIHZhbHVlKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIE1JTkQ6Ci0JICAvKiBNdWx0aXBsZSBpbmRpcmVjdCBzeW1ib2xzLiAgVGhpcyBpcyBPSyBpZiB0aGV5IGJvdGggcG9pbnQKLQkgICAgIHRvIHRoZSBzYW1lIHN5bWJvbC4gICovCi0JICBpZiAoc3RyY21wIChoLT51LmkubGluay0+cm9vdC5zdHJpbmcsIHN0cmluZykgPT0gMCkKLQkgICAgYnJlYWs7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgTURFRjoKLQkgIC8qIEhhbmRsZSBhIG11bHRpcGxlIGRlZmluaXRpb24uICAqLwotCSAgewotCSAgICBhc2VjdGlvbiAqbXNlYzsKLQkgICAgYmZkX3ZtYSBtdmFsOwotCi0JICAgIHN3aXRjaCAoaC0+dHlwZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZmluZWQ6Ci0JCW1zZWMgPSBoLT51LmRlZi5zZWN0aW9uOwotCQltdmFsID0gaC0+dS5kZWYudmFsdWU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLQkJbXNlYyA9IGJmZF9pbmRfc2VjdGlvbl9wdHI7Ci0JCW12YWwgPSAwOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlhYm9ydCAoKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSWdub3JlIGEgcmVkZWZpbml0aW9uIG9mIGFuIGFic29sdXRlIHN5bWJvbCB0byB0aGUgc2FtZQotICAgICAgICAgICAgICAgdmFsdWU7IGl0J3MgaGFybWxlc3MuICAqLwotCSAgICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJJiYgYmZkX2lzX2Fic19zZWN0aW9uIChtc2VjKQotCQkmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0JCSYmIHZhbHVlID09IG12YWwpCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQotCQkgICAoaW5mbywgaC0+cm9vdC5zdHJpbmcsIG1zZWMtPm93bmVyLCBtc2VjLCBtdmFsLCBhYmZkLAotCQkgICAgc2VjdGlvbiwgdmFsdWUpKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ0lORDoKLQkgIC8qIENyZWF0ZSBhbiBpbmRpcmVjdCBzeW1ib2wgZnJvbSBhbiBleGlzdGluZyBjb21tb24gc3ltYm9sLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9jb21tb24pCi0JCSAoaW5mbywgaC0+cm9vdC5zdHJpbmcsCi0JCSAgaC0+dS5jLnAtPnNlY3Rpb24tPm93bmVyLCBiZmRfbGlua19oYXNoX2NvbW1vbiwgaC0+dS5jLnNpemUsCi0JCSAgYWJmZCwgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCwgKGJmZF92bWEpIDApKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIElORDoKLQkgIC8qIENyZWF0ZSBhbiBpbmRpcmVjdCBzeW1ib2wuICAqLwotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaW5oOwotCi0JICAgIC8qIFNUUklORyBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHdlIHdhbnQgdG8gaW5kaXJlY3QKLQkgICAgICAgdG8uICAqLwotCSAgICBpbmggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBzdHJpbmcsIHRydWUsCi0JCQkJCQljb3B5LCBmYWxzZSk7Ci0JICAgIGlmIChpbmggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoaW5oLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICAgIHsKLQkJaW5oLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JCWluaC0+dS51bmRlZi5hYmZkID0gYWJmZDsKLQkJYmZkX2xpbmtfYWRkX3VuZGVmIChpbmZvLT5oYXNoLCBpbmgpOwotCSAgICAgIH0KLQotCSAgICAvKiBJZiB0aGUgaW5kaXJlY3Qgc3ltYm9sIGhhcyBiZWVuIHJlZmVyZW5jZWQsIHdlIG5lZWQgdG8KLQkgICAgICAgcHVzaCB0aGUgcmVmZXJlbmNlIGRvd24gdG8gdGhlIHN5bWJvbCB3ZSBhcmUKLQkgICAgICAgcmVmZXJlbmNpbmcuICAqLwotCSAgICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgICB7Ci0JCXJvdyA9IFVOREVGX1JPVzsKLQkJY3ljbGUgPSB0cnVlOwotCSAgICAgIH0KLQotCSAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDsKLQkgICAgaC0+dS5pLmxpbmsgPSBpbmg7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0VUOgotCSAgLyogQWRkIGFuIGVudHJ5IHRvIGEgc2V0LiAgKi8KLQkgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfdG9fc2V0KSAoaW5mbywgaCwgQkZEX1JFTE9DX0NUT1IsCi0JCQkJCQlhYmZkLCBzZWN0aW9uLCB2YWx1ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBXQVJOQzoKLQkgIC8qIElzc3VlIGEgd2FybmluZyBhbmQgY3ljbGUuICAqLwotCSAgaWYgKGgtPnUuaS53YXJuaW5nICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykgKGluZm8sIGgtPnUuaS53YXJuaW5nLAotCQkJCQkJIGgtPnJvb3Quc3RyaW5nLCBhYmZkLAotCQkJCQkJIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkJIChiZmRfdm1hKSAwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIC8qIE9ubHkgaXNzdWUgYSB3YXJuaW5nIG9uY2UuICAqLwotCSAgICAgIGgtPnUuaS53YXJuaW5nID0gTlVMTDsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIENZQ0xFOgotCSAgLyogVHJ5IGFnYWluIHdpdGggdGhlIHJlZmVyZW5jZWQgc3ltYm9sLiAgKi8KLQkgIGggPSBoLT51LmkubGluazsKLQkgIGN5Y2xlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSRUZDOgotCSAgLyogQSByZWZlcmVuY2UgdG8gYW4gaW5kaXJlY3Qgc3ltYm9sLiAgKi8KLQkgIGlmIChoLT5uZXh0ID09IE5VTEwgJiYgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgIT0gaCkKLQkgICAgaC0+bmV4dCA9IGg7Ci0JICBoID0gaC0+dS5pLmxpbms7Ci0JICBjeWNsZSA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgV0FSTjoKLQkgIC8qIElzc3VlIGEgd2FybmluZy4gICovCi0JICBpZiAoISAoKmluZm8tPmNhbGxiYWNrcy0+d2FybmluZykgKGluZm8sIHN0cmluZywgaC0+cm9vdC5zdHJpbmcsCi0JCQkJCSAgICAgaGFzaF9lbnRyeV9iZmQgKGgpLAotCQkJCQkgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBDV0FSTjoKLQkgIC8qIFdhcm4gaWYgdGhpcyBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZCBhbHJlYWR5LAotCSAgICAgb3RoZXJ3aXNlIGFkZCBhIHdhcm5pbmcuICBBIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkIGlmCi0JICAgICB0aGUgbmV4dCBmaWVsZCBpcyBub3QgTlVMTCwgb3IgaXQgaXMgdGhlIHRhaWwgb2YgdGhlCi0JICAgICB1bmRlZmluZWQgc3ltYm9sIGxpc3QuICBUaGUgUkVGIGNhc2UgYWJvdmUgaGVscHMgdG8KLQkgICAgIGVuc3VyZSB0aGlzLiAgKi8KLQkgIGlmIChoLT5uZXh0ICE9IE5VTEwgfHwgaW5mby0+aGFzaC0+dW5kZWZzX3RhaWwgPT0gaCkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT53YXJuaW5nKSAoaW5mbywgc3RyaW5nLCBoLT5yb290LnN0cmluZywKLQkJCQkJCSBoYXNoX2VudHJ5X2JmZCAoaCksCi0JCQkJCQkgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCQkgKGJmZF92bWEpIDApKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBNV0FSTjoKLQkgIC8qIE1ha2UgYSB3YXJuaW5nIHN5bWJvbC4gICovCi0JICB7Ci0JICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpzdWI7Ci0KLQkgICAgLyogU1RSSU5HIGlzIHRoZSB3YXJuaW5nIHRvIGdpdmUuICAqLwotCSAgICBzdWIgPSAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopCi0JCSAgICgoKmluZm8tPmhhc2gtPnRhYmxlLm5ld2Z1bmMpCi0JCSAgICAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMLCAmaW5mby0+aGFzaC0+dGFibGUsCi0JCSAgICAgaC0+cm9vdC5zdHJpbmcpKSk7Ci0JICAgIGlmIChzdWIgPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICpzdWIgPSAqaDsKLQkgICAgc3ViLT50eXBlID0gYmZkX2xpbmtfaGFzaF93YXJuaW5nOwotCSAgICBzdWItPnUuaS5saW5rID0gaDsKLQkgICAgaWYgKCEgY29weSkKLQkgICAgICBzdWItPnUuaS53YXJuaW5nID0gc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQljaGFyICp3OwotCi0JCXcgPSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCSAgICAgICBzdHJsZW4gKHN0cmluZykgKyAxKTsKLQkJaWYgKHcgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXN0cmNweSAodywgc3RyaW5nKTsKLQkJc3ViLT51Lmkud2FybmluZyA9IHc7Ci0JICAgICAgfQotCi0JICAgIGJmZF9oYXNoX3JlcGxhY2UgKCZpbmZvLT5oYXNoLT50YWJsZSwKLQkJCSAgICAgIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgaCwKLQkJCSAgICAgIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgc3ViKTsKLQkgICAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICAgKmhhc2hwID0gc3ViOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGN5Y2xlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEdlbmVyaWMgZmluYWwgbGluayByb3V0aW5lLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqc3ViOwotICBhc2VjdGlvbiAqbzsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwOwotICBzaXplX3Qgb3V0c3ltYWxsb2M7Ci0gIHN0cnVjdCBnZW5lcmljX3dyaXRlX2dsb2JhbF9zeW1ib2xfaW5mbyB3Z2luZm87Ci0KLSAgYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKSA9IChhc3ltYm9sICoqKSBOVUxMOwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0gIG91dHN5bWFsbG9jID0gMDsKLQotICAvKiBNYXJrIGFsbCBzZWN0aW9ucyB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIGZvciAocCA9IG8tPmxpbmtfb3JkZXJfaGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICAgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCXAtPnUuaW5kaXJlY3Quc2VjdGlvbi0+bGlua2VyX21hcmsgPSB0cnVlOwotCi0gIC8qIEJ1aWxkIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gKGJmZCAqKSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICBpZiAoISBfYmZkX2dlbmVyaWNfbGlua19vdXRwdXRfc3ltYm9scyAoYWJmZCwgc3ViLCBpbmZvLCAmb3V0c3ltYWxsb2MpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEFjY3VtdWxhdGUgdGhlIGdsb2JhbCBzeW1ib2xzLiAgKi8KLSAgd2dpbmZvLmluZm8gPSBpbmZvOwotICB3Z2luZm8ub3V0cHV0X2JmZCA9IGFiZmQ7Ci0gIHdnaW5mby5wc3ltYWxsb2MgPSAmb3V0c3ltYWxsb2M7Ci0gIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdHJhdmVyc2UgKF9iZmRfZ2VuZXJpY19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICBfYmZkX2dlbmVyaWNfbGlua193cml0ZV9nbG9iYWxfc3ltYm9sLAotCQkJCSAgIChQVFIpICZ3Z2luZm8pOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdHJhaWxpbmcgTlVMTCBwb2ludGVyIG9uIE9VVFNZTUJPTFMuICBXZQotICAgICBzaG91bGRuJ3QgcmVhbGx5IG5lZWQgb25lLCBzaW5jZSB3ZSBoYXZlIFNZTUNPVU5ULCBidXQgc29tZSBvbGQKLSAgICAgY29kZSBzdGlsbCBleHBlY3RzIG9uZS4gICovCi0gIGlmICghIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKGFiZmQsICZvdXRzeW1hbGxvYywgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBvdXRwdXQgcmVsb2NzIGZvciBlYWNoIHNlY3Rpb24uICAqLwotICAgICAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgbyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgICBvID0gby0+bmV4dCkKLQl7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICBmb3IgKHAgPSBvLT5saW5rX29yZGVyX2hlYWQ7Ci0JICAgICAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgICAgICBwID0gcC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICB8fCBwLT50eXBlID09IGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcikKLQkJKytvLT5yZWxvY19jb3VudDsKLQkgICAgICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCQl7Ci0JCSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0JCSAgYmZkICppbnB1dF9iZmQ7Ci0JCSAgbG9uZyByZWxzaXplOwotCQkgIGFyZWxlbnQgKipyZWxvY3M7Ci0JCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0JCSAgbG9uZyByZWxvY19jb3VudDsKLQotCQkgIGlucHV0X3NlY3Rpb24gPSBwLT51LmluZGlyZWN0LnNlY3Rpb247Ci0JCSAgaW5wdXRfYmZkID0gaW5wdXRfc2VjdGlvbi0+b3duZXI7Ci0JCSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGlucHV0X2JmZCwKLQkJCQkJCSAgICAgICBpbnB1dF9zZWN0aW9uKTsKLQkJICBpZiAocmVsc2l6ZSA8IDApCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbHNpemUpOwotCQkgIGlmICghcmVsb2NzICYmIHJlbHNpemUgIT0gMCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBzeW1ib2xzID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCk7Ci0JCSAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsCi0JCQkJCQkJaW5wdXRfc2VjdGlvbiwKLQkJCQkJCQlyZWxvY3MsCi0JCQkJCQkJc3ltYm9scyk7Ci0JCSAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBCRkRfQVNTRVJUICgodW5zaWduZWQgbG9uZykgcmVsb2NfY291bnQKLQkJCSAgICAgID09IGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KTsKLQkJICBvLT5yZWxvY19jb3VudCArPSByZWxvY19jb3VudDsKLQkJICBmcmVlIChyZWxvY3MpOwotCQl9Ci0JICAgIH0KLQkgIGlmIChvLT5yZWxvY19jb3VudCA+IDApCi0JICAgIHsKLQkgICAgICBvLT5vcmVsb2NhdGlvbiA9ICgoYXJlbGVudCAqKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChvLT5yZWxvY19jb3VudAotCQkJCQkgICAgKiBzaXplb2YgKGFyZWxlbnQgKikpKSk7Ci0JICAgICAgaWYgKCFvLT5vcmVsb2NhdGlvbikKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIG8tPmZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgICAvKiBSZXNldCB0aGUgY291bnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhbiBpbmRleAotCQkgd2hlbiBwdXR0aW5nIGluIHRoZSBvdXRwdXQgcmVsb2NzLiAgKi8KLQkgICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBhbGwgdGhlIGxpbmsgb3JkZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBzZWN0aW9ucy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIG8gIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOwotCSAgIHAgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCSAgIHAgPSBwLT5uZXh0KQotCXsKLQkgIHN3aXRjaCAocC0+dHlwZSkKLQkgICAgewotCSAgICBjYXNlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXI6Ci0JICAgIGNhc2UgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyOgotCSAgICAgIGlmICghIF9iZmRfZ2VuZXJpY19yZWxvY19saW5rX29yZGVyIChhYmZkLCBpbmZvLCBvLCBwKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyOgotCSAgICAgIGlmICghIGRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCwgdHJ1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpZiAoISBfYmZkX2RlZmF1bHRfbGlua19vcmRlciAoYWJmZCwgaW5mbywgbywgcCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGFuIG91dHB1dCBzeW1ib2wgdG8gdGhlIG91dHB1dCBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAob3V0cHV0X2JmZCwgcHN5bWFsbG9jLCBzeW0pCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc2l6ZV90ICpwc3ltYWxsb2M7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgaWYgKGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpID49ICpwc3ltYWxsb2MpCi0gICAgewotICAgICAgYXN5bWJvbCAqKm5ld3N5bXM7Ci0KLSAgICAgIGlmICgqcHN5bWFsbG9jID09IDApCi0JKnBzeW1hbGxvYyA9IDEyNDsKLSAgICAgIGVsc2UKLQkqcHN5bWFsbG9jICo9IDI7Ci0gICAgICBuZXdzeW1zID0gKGFzeW1ib2wgKiopIGJmZF9yZWFsbG9jIChiZmRfZ2V0X291dHN5bWJvbHMgKG91dHB1dF9iZmQpLAotCQkJCQkgICpwc3ltYWxsb2MgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgaWYgKG5ld3N5bXMgPT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYmZkX2dldF9vdXRzeW1ib2xzIChvdXRwdXRfYmZkKSA9IG5ld3N5bXM7Ci0gICAgfQotCi0gIGJmZF9nZXRfb3V0c3ltYm9scyAob3V0cHV0X2JmZCkgW2JmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpXSA9IHN5bTsKLSAgaWYgKHN5bSAhPSBOVUxMKQotICAgICsrIGJmZF9nZXRfc3ltY291bnQgKG91dHB1dF9iZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgdGhlIHN5bWJvbHMgZm9yIGFuIGlucHV0IEJGRC4gICovCi0KLWJvb2xlYW4KLV9iZmRfZ2VuZXJpY19saW5rX291dHB1dF9zeW1ib2xzIChvdXRwdXRfYmZkLCBpbnB1dF9iZmQsIGluZm8sIHBzeW1hbGxvYykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHNpemVfdCAqcHN5bWFsbG9jOwotewotICBhc3ltYm9sICoqc3ltX3B0cjsKLSAgYXN5bWJvbCAqKnN5bV9lbmQ7Ci0KLSAgaWYgKCEgZ2VuZXJpY19saW5rX3JlYWRfc3ltYm9scyAoaW5wdXRfYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIGEgZmlsZW5hbWUgc3ltYm9sIGlmIHdlIGFyZSBzdXBwb3NlZCB0by4gICovCi0gIGlmIChpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbiAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBmb3IgKHNlYyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7Ci0JICAgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOwotCSAgIHNlYyA9IHNlYy0+bmV4dCkKLQl7Ci0JICBpZiAoc2VjLT5vdXRwdXRfc2VjdGlvbiA9PSBpbmZvLT5jcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGFzeW1ib2wgKm5ld3N5bTsKLQotCSAgICAgIG5ld3N5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoaW5wdXRfYmZkKTsKLQkgICAgICBpZiAoIW5ld3N5bSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIG5ld3N5bS0+bmFtZSA9IGlucHV0X2JmZC0+ZmlsZW5hbWU7Ci0JICAgICAgbmV3c3ltLT52YWx1ZSA9IDA7Ci0JICAgICAgbmV3c3ltLT5mbGFncyA9IEJTRl9MT0NBTCB8IEJTRl9GSUxFOwotCSAgICAgIG5ld3N5bS0+c2VjdGlvbiA9IHNlYzsKLQotCSAgICAgIGlmICghIGdlbmVyaWNfYWRkX291dHB1dF9zeW1ib2wgKG91dHB1dF9iZmQsIHBzeW1hbGxvYywKLQkJCQkJICAgICAgIG5ld3N5bSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3QgdGhlIHZhbHVlcyBvZiB0aGUgZ2xvYmFsbHkgdmlzaWJsZSBzeW1ib2xzLCBhbmQgd3JpdGUgb3V0Ci0gICAgIGxvY2FsIHN5bWJvbHMuICAqLwotICBzeW1fcHRyID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGlucHV0X2JmZCk7Ci0gIHN5bV9lbmQgPSBzeW1fcHRyICsgX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWNvdW50IChpbnB1dF9iZmQpOwotICBmb3IgKDsgc3ltX3B0ciA8IHN5bV9lbmQ7IHN5bV9wdHIrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBib29sZWFuIG91dHB1dDsKLQotICAgICAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgTlVMTDsKLSAgICAgIHN5bSA9ICpzeW1fcHRyOwotICAgICAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9JTkRJUkVDVAotCQkJIHwgQlNGX1dBUk5JTkcKLQkJCSB8IEJTRl9HTE9CQUwKLQkJCSB8IEJTRl9DT05TVFJVQ1RPUgotCQkJIHwgQlNGX1dFQUspKSAhPSAwCi0JICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXsKLQkgIGlmIChzeW0tPnVkYXRhLnAgIT0gTlVMTCkKLQkgICAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgc3ltLT51ZGF0YS5wOwotCSAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGNhc2Ugbm9ybWFsbHkgbWVhbnMgdGhhdCB0aGUgbWFpbiBsaW5rZXIgY29kZQotICAgICAgICAgICAgICAgICBkZWxpYmVyYXRlbHkgaWdub3JlZCB0aGlzIGNvbnN0cnVjdG9yIHN5bWJvbC4gIFdlCi0gICAgICAgICAgICAgICAgIHNob3VsZCBqdXN0IHBhc3MgaXQgdGhyb3VnaC4gIFRoaXMgd2lsbCBzY3JldyB1cCBpZgotICAgICAgICAgICAgICAgICB0aGUgY29uc3RydWN0b3Igc3ltYm9sIGlzIGZyb20gYSBkaWZmZXJlbnQsCi0gICAgICAgICAgICAgICAgIG5vbi1nZW5lcmljLCBvYmplY3QgZmlsZSBmb3JtYXQsIGJ1dCB0aGUgY2FzZSB3aWxsCi0gICAgICAgICAgICAgICAgIG9ubHkgYXJpc2Ugd2hlbiBsaW5raW5nIHdpdGggLXIsIHdoaWNoIHdpbGwgcHJvYmFibHkKLSAgICAgICAgICAgICAgICAgZmFpbCBhbnlob3csIHNpbmNlIHRoZXJlIHdpbGwgYmUgbm8gd2F5IHRvIHJlcHJlc2VudAotICAgICAgICAgICAgICAgICB0aGUgcmVsb2NzIGluIHRoZSBvdXRwdXQgZm9ybWF0IGJlaW5nIHVzZWQuICAqLwotCSAgICAgIGggPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIGggPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgaW5mbywKLQkJCQkJICAgICAgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCSAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkgIGVsc2UKLQkgICAgaCA9IF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfbG9va3VwIChfYmZkX2dlbmVyaWNfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJCSAgICAgICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkgICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCSAgaWYgKGggIT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogRm9yY2UgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wgdG8gcG9pbnQgdG8KLQkJIHRoZSBzYW1lIGFyZWEgaW4gbWVtb3J5LiAgSXQgaXMgcG9zc2libGUgdGhhdAotCQkgdGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHdpdGggYSBoYXNoIHRhYmxlCi0JCSBvdGhlciB0aGFuIGEgZ2VuZXJpYyBoYXNoIHRhYmxlLCBzbyB3ZSBkb3VibGUKLQkJIGNoZWNrIHRoYXQuICAqLwotCSAgICAgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGlucHV0X2JmZC0+eHZlYykKLQkJewotCQkgIGlmIChoLT5zeW0gIT0gKGFzeW1ib2wgKikgTlVMTCkKLQkJICAgICpzeW1fcHRyID0gc3ltID0gaC0+c3ltOwotCQl9Ci0KLQkgICAgICBzd2l0Y2ggKGgtPnJvb3QudHlwZSkKLQkJewotCQlkZWZhdWx0OgotCQljYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotCQkgIGFib3J0ICgpOwotCQljYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotCQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLQkJICBoID0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBoLT5yb290LnUuaS5saW5rOwotCQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCQljYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkJICBzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0JCSAgc3ltLT5mbGFncyAmPX4gQlNGX0NPTlNUUlVDVE9SOwotCQkgIHN5bS0+dmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotCQkgIHN5bS0+c2VjdGlvbiA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbjsKLQkJICBicmVhazsKLQkJY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JCSAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLQkJICBzeW0tPmZsYWdzICY9fiBCU0ZfQ09OU1RSVUNUT1I7Ci0JCSAgc3ltLT52YWx1ZSA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0JCSAgc3ltLT5zZWN0aW9uID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCQkgIHN5bS0+dmFsdWUgPSBoLT5yb290LnUuYy5zaXplOwotCQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQkJICBpZiAoISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCSAgICB7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSk7Ci0JCSAgICAgIHN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JCSAgICB9Ci0JCSAgLyogV2UgZG8gbm90IHNldCB0aGUgc2VjdGlvbiBvZiB0aGUgc3ltYm9sIHRvCi0JCSAgICAgaC0+cm9vdC51LmMucC0+c2VjdGlvbi4gIFRoYXQgdmFsdWUgd2FzIHNhdmVkIHNvCi0JCSAgICAgdGhhdCB3ZSB3b3VsZCBrbm93IHdoZXJlIHRvIGFsbG9jYXRlIHRoZSBzeW1ib2wKLQkJICAgICBpZiBpdCB3YXMgZGVmaW5lZC4gIEluIHRoaXMgY2FzZSB0aGUgdHlwZSBpcwotCQkgICAgIHN0aWxsIGJmZF9saW5rX2hhc2hfY29tbW9uLCBzbyB3ZSBkaWQgbm90IGRlZmluZQotCQkgICAgIGl0LCBzbyB3ZSBkbyBub3Qgd2FudCB0byB1c2UgdGhhdCBzZWN0aW9uLiAgKi8KLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUaGlzIHN3aXRjaCBpcyBzdHJhaWdodCBmcm9tIHRoZSBvbGQgY29kZSBpbgotCSB3cml0ZV9maWxlX2xvY2FscyBpbiBsZHN5bS5jLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9hbGwKLQkgIHx8IChpbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoaW5mby0+a2VlcF9oYXNoLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCSAgIGZhbHNlLCBmYWxzZSkKLQkJICA9PSAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIE5VTEwpKSkKLQlvdXRwdXQgPSBmYWxzZTsKLSAgICAgIGVsc2UgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9HTE9CQUwgfCBCU0ZfV0VBSykpICE9IDApCi0JewotCSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgbWFya2VkIGFzIG9jY3VycmluZyBub3csIHJhdGhlcgotCSAgICAgdGhhbiBhdCB0aGUgZW5kLCBvdXRwdXQgaXQgbm93LiAgVGhpcyBpcyB1c2VkIGZvcgotCSAgICAgQ09GRiBDX0VYVCBGQ04gc3ltYm9scy4gIEZJWE1FOiBUaGVyZSBtdXN0IGJlIGEKLQkgICAgIGJldHRlciB3YXkuICAqLwotCSAgaWYgKGJmZF9hc3ltYm9sX2JmZCAoc3ltKSA9PSBpbnB1dF9iZmQKLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSAhPSAwKQotCSAgICBvdXRwdXQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBvdXRwdXQgPSBmYWxzZTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0Jb3V0cHV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0JewotCSAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUpCi0JICAgIG91dHB1dCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIG91dHB1dCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0Jb3V0cHV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICgoc3ltLT5mbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkKLQl7Ci0JICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfV0FSTklORykgIT0gMCkKLQkgICAgb3V0cHV0ID0gZmFsc2U7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGluZm8tPmRpc2NhcmQpCi0JCXsKLQkJZGVmYXVsdDoKLQkJY2FzZSBkaXNjYXJkX2FsbDoKLQkJICBvdXRwdXQgPSBmYWxzZTsKLQkJICBicmVhazsKLQkJY2FzZSBkaXNjYXJkX2w6Ci0JCSAgaWYgKGJmZF9pc19sb2NhbF9sYWJlbCAoaW5wdXRfYmZkLCBzeW0pKQotCQkgICAgb3V0cHV0ID0gZmFsc2U7Ci0JCSAgZWxzZQotCQkgICAgb3V0cHV0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSBkaXNjYXJkX25vbmU6Ci0JCSAgb3V0cHV0ID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpKQotCXsKLQkgIGlmIChpbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0JICAgIG91dHB1dCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIG91dHB1dCA9IGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBzZWN0aW9uIHdoaWNoIGlzIG5vdCBiZWluZyBpbmNsdWRlZAotCSBpbiB0aGUgb3V0cHV0IGZpbGUsIHRoZW4gd2UgZG9uJ3Qgd2FudCB0byBvdXRwdXQgdGhlIHN5bWJvbC4KLQotCSBHcm9zcy4gIC5ic3MgYW5kIHNpbWlsYXIgc2VjdGlvbnMgd29uJ3QgaGF2ZSB0aGUgbGlua2VyX21hcmsKLQkgZmllbGQgc2V0LiAgKi8KLSAgICAgIGlmICgoc3ltLT5zZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKLQkgICYmIHN5bS0+c2VjdGlvbi0+bGlua2VyX21hcmsgPT0gZmFsc2UpCi0Jb3V0cHV0ID0gZmFsc2U7Ci0KLSAgICAgIGlmIChvdXRwdXQpCi0JewotCSAgaWYgKCEgZ2VuZXJpY19hZGRfb3V0cHV0X3N5bWJvbCAob3V0cHV0X2JmZCwgcHN5bWFsbG9jLCBzeW0pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoaCAhPSAoc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JICAgIGgtPndyaXR0ZW4gPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB0aGUgc2VjdGlvbiBhbmQgdmFsdWUgb2YgYSBnZW5lcmljIEJGRCBzeW1ib2wgYmFzZWQgb24gYSBsaW5rZXIKLSAgIGhhc2ggdGFibGUgZW50cnkuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X3N5bWJvbF9mcm9tX2hhc2ggKHN5bSwgaCkKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLXsKLSAgc3dpdGNoIChoLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfbmV3OgotICAgICAgLyogVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb25zdHJ1Y3RvciBzeW1ib2wgaXMgc2VlbiBidXQgd2UgYXJlCi0gICAgICAgICBub3QgYnVpbGRpbmcgY29uc3RydWN0b3JzLiAgKi8KLSAgICAgIGlmIChzeW0tPnNlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBCRkRfQVNTRVJUICgoc3ltLT5mbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bS0+ZmxhZ3MgfD0gQlNGX0NPTlNUUlVDVE9SOwotCSAgc3ltLT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIHN5bS0+dmFsdWUgPSAwOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0gICAgICBzeW0tPnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgICAgc3ltLT52YWx1ZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrOgotICAgICAgc3ltLT5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgICAgIHN5bS0+dmFsdWUgPSAwOwotICAgICAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgICAgc3ltLT5zZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbjsKLSAgICAgIHN5bS0+dmFsdWUgPSBoLT51LmRlZi52YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLSAgICAgIHN5bS0+c2VjdGlvbiA9IGgtPnUuZGVmLnNlY3Rpb247Ci0gICAgICBzeW0tPnZhbHVlID0gaC0+dS5kZWYudmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgc3ltLT52YWx1ZSA9IGgtPnUuYy5zaXplOwotICAgICAgaWYgKHN5bS0+c2VjdGlvbiA9PSBOVUxMKQotCXN5bS0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQl7Ci0JICBCRkRfQVNTRVJUIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpOwotCSAgc3ltLT5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQl9Ci0gICAgICAvKiBEbyBub3Qgc2V0IHRoZSBzZWN0aW9uOyBzZWUgX2JmZF9nZW5lcmljX2xpbmtfb3V0cHV0X3N5bWJvbHMuICAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX2luZGlyZWN0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF93YXJuaW5nOgotICAgICAgLyogRklYTUU6IFdoYXQgc2hvdWxkIHdlIGRvIGhlcmU/ICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYSBnbG9iYWwgc3ltYm9sLCBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIHdyaXR0ZW4gb3V0LgotICAgVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfd3JpdGVfZ2xvYmFsX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IGdlbmVyaWNfd3JpdGVfZ2xvYmFsX3N5bWJvbF9pbmZvICp3Z2luZm8gPQotICAgIChzdHJ1Y3QgZ2VuZXJpY193cml0ZV9nbG9iYWxfc3ltYm9sX2luZm8gKikgZGF0YTsKLSAgYXN5bWJvbCAqc3ltOwotCi0gIGlmIChoLT53cml0dGVuKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPndyaXR0ZW4gPSB0cnVlOwotCi0gIGlmICh3Z2luZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotICAgICAgfHwgKHdnaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgJiYgYmZkX2hhc2hfbG9va3VwICh3Z2luZm8tPmluZm8tPmtlZXBfaGFzaCwgaC0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSkgPT0gTlVMTCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGgtPnN5bSAhPSAoYXN5bWJvbCAqKSBOVUxMKQotICAgIHN5bSA9IGgtPnN5bTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAod2dpbmZvLT5vdXRwdXRfYmZkKTsKLSAgICAgIGlmICghc3ltKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHN5bS0+bmFtZSA9IGgtPnJvb3Qucm9vdC5zdHJpbmc7Ci0gICAgICBzeW0tPmZsYWdzID0gMDsKLSAgICB9Ci0KLSAgc2V0X3N5bWJvbF9mcm9tX2hhc2ggKHN5bSwgJmgtPnJvb3QpOwotCi0gIHN5bS0+ZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQotICBpZiAoISBnZW5lcmljX2FkZF9vdXRwdXRfc3ltYm9sICh3Z2luZm8tPm91dHB1dF9iZmQsIHdnaW5mby0+cHN5bWFsbG9jLAotCQkJCSAgIHN5bSkpCi0gICAgewotICAgICAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZmFpbHVyZS4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENyZWF0ZSBhIHJlbG9jYXRpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX2dlbmVyaWNfcmVsb2NfbGlua19vcmRlciAoYWJmZCwgaW5mbywgc2VjLCBsaW5rX29yZGVyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIGFyZWxlbnQgKnI7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlKQotICAgIGFib3J0ICgpOwotICBpZiAoc2VjLT5vcmVsb2NhdGlvbiA9PSAoYXJlbGVudCAqKikgTlVMTCkKLSAgICBhYm9ydCAoKTsKLQotICByID0gKGFyZWxlbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFyZWxlbnQpKTsKLSAgaWYgKHIgPT0gKGFyZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAKLSAgci0+YWRkcmVzcyA9IGxpbmtfb3JkZXItPm9mZnNldDsKLSAgci0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAoci0+aG93dG8gPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBzeW1ib2wgdG8gdXNlIGZvciB0aGUgcmVsb2NhdGlvbi4gICovCi0gIGlmIChsaW5rX29yZGVyLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIpCi0gICAgci0+c3ltX3B0cl9wdHIgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUuc2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGggPSAoKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGFiZmQsIGluZm8sCi0JCQkJCSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwKLQkJCQkJIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotICAgICAgaWYgKGggPT0gKHN0cnVjdCBnZW5lcmljX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICB8fCAhIGgtPndyaXR0ZW4pCi0JewotCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgKGluZm8sIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5uYW1lLAotCQkgIChiZmQgKikgTlVMTCwgKGFzZWN0aW9uICopIE5VTEwsIChiZmRfdm1hKSAwKSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHItPnN5bV9wdHJfcHRyID0gJmgtPnN5bTsKLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiBpbnBsYWNlIHJlbG9jLCB3cml0ZSB0aGUgYWRkZW5kIHRvIHRoZSBvYmplY3QgZmlsZS4KLSAgICAgT3RoZXJ3aXNlLCBzdG9yZSBpdCBpbiB0aGUgcmVsb2MgYWRkZW5kLiAgKi8KLSAgaWYgKCEgci0+aG93dG8tPnBhcnRpYWxfaW5wbGFjZSkKLSAgICByLT5hZGRlbmQgPSBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBib29sZWFuIG9rOwotCi0gICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyLT5ob3d0byk7Ci0gICAgICBidWYgPSAoYmZkX2J5dGUgKikgYmZkX3ptYWxsb2MgKHNpemUpOwotICAgICAgaWYgKGJ1ZiA9PSAoYmZkX2J5dGUgKikgTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByc3RhdCA9IF9iZmRfcmVsb2NhdGVfY29udGVudHMgKHItPmhvd3RvLCBhYmZkLAotCQkJCSAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kLCBidWYpOwotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JY2FzZSBiZmRfcmVsb2Nfb2s6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JICBhYm9ydCAoKTsKLQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAoaW5mbywKLQkJICAobGlua19vcmRlci0+dHlwZSA9PSBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyCi0JCSAgID8gYmZkX3NlY3Rpb25fbmFtZSAoYWJmZCwgbGlua19vcmRlci0+dS5yZWxvYy5wLT51LnNlY3Rpb24pCi0JCSAgIDogbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUpLAotCQkgIHItPmhvd3RvLT5uYW1lLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCwKLQkJICAoYmZkICopIE5VTEwsIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIChQVFIpIGJ1ZiwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LCBzaXplKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICBpZiAoISBvaykKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHItPmFkZGVuZCA9IDA7Ci0gICAgfQotCi0gIHNlYy0+b3JlbG9jYXRpb25bc2VjLT5yZWxvY19jb3VudF0gPSByOwotICArK3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBhIG5ldyBsaW5rX29yZGVyIGZvciBhIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKgotYmZkX25ld19saW5rX29yZGVyIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKm5ldzsKLQotICBuZXcgPSAoKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGJmZF9saW5rX29yZGVyKSkpOwotICBpZiAoIW5ldykKLSAgICByZXR1cm4gTlVMTDsKLQotICBuZXctPnR5cGUgPSBiZmRfdW5kZWZpbmVkX2xpbmtfb3JkZXI7Ci0gIG5ldy0+b2Zmc2V0ID0gMDsKLSAgbmV3LT5zaXplID0gMDsKLSAgbmV3LT5uZXh0ID0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMOwotCi0gIGlmIChzZWN0aW9uLT5saW5rX29yZGVyX3RhaWwgIT0gKHN0cnVjdCBiZmRfbGlua19vcmRlciAqKSBOVUxMKQotICAgIHNlY3Rpb24tPmxpbmtfb3JkZXJfdGFpbC0+bmV4dCA9IG5ldzsKLSAgZWxzZQotICAgIHNlY3Rpb24tPmxpbmtfb3JkZXJfaGVhZCA9IG5ldzsKLSAgc2VjdGlvbi0+bGlua19vcmRlcl90YWlsID0gbmV3OwotCi0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIERlZmF1bHQgbGluayBvcmRlciBwcm9jZXNzaW5nIHJvdXRpbmUuICBOb3RlIHRoYXQgd2UgY2FuIG5vdCBoYW5kbGUKLSAgIHRoZSByZWxvY19saW5rX29yZGVyIHR5cGVzIGhlcmUsIHNpbmNlIHRoZXkgZGVwZW5kIHVwb24gdGhlIGRldGFpbHMKLSAgIG9mIGhvdyB0aGUgcGFydGljdWxhciBiYWNrZW5kcyBnZW5lcmF0ZXMgcmVsb2NzLiAgKi8KLQotYm9vbGVhbgotX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlcikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotewotICBzd2l0Y2ggKGxpbmtfb3JkZXItPnR5cGUpCi0gICAgewotICAgIGNhc2UgYmZkX3VuZGVmaW5lZF9saW5rX29yZGVyOgotICAgIGNhc2UgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjoKLSAgICBjYXNlIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlcjoKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcjoKLSAgICAgIHJldHVybiBkZWZhdWx0X2luZGlyZWN0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIHNlYywgbGlua19vcmRlciwKLQkJCQkJICBmYWxzZSk7Ci0gICAgY2FzZSBiZmRfZmlsbF9saW5rX29yZGVyOgotICAgICAgcmV0dXJuIGRlZmF1bHRfZmlsbF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpOwotICAgIGNhc2UgYmZkX2RhdGFfbGlua19vcmRlcjoKLSAgICAgIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkgICAgICAgKFBUUikgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzLAotCQkJCSAgICAgICAoZmlsZV9wdHIpIGxpbmtfb3JkZXItPm9mZnNldCwKLQkJCQkgICAgICAgbGlua19vcmRlci0+c2l6ZSk7Ci0gICAgfQotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gaGFuZGxlIGEgYmZkX2ZpbGxfbGlua19vcmRlci4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWRlZmF1bHRfZmlsbF9saW5rX29yZGVyIChhYmZkLCBpbmZvLCBzZWMsIGxpbmtfb3JkZXIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgc2l6ZV90IHNpemU7Ci0gIGNoYXIgKnNwYWNlOwotICBzaXplX3QgaTsKLSAgaW50IGZpbGw7Ci0gIGJvb2xlYW4gcmVzdWx0OwotCi0gIEJGRF9BU1NFUlQgKChzZWMtPmZsYWdzICYgU0VDX0hBU19DT05URU5UUykgIT0gMCk7Ci0KLSAgc2l6ZSA9IChzaXplX3QpIGxpbmtfb3JkZXItPnNpemU7Ci0gIHNwYWNlID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc2l6ZSk7Ci0gIGlmIChzcGFjZSA9PSBOVUxMICYmIHNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsbCA9IGxpbmtfb3JkZXItPnUuZmlsbC52YWx1ZTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gMikKLSAgICBzcGFjZVtpXSA9IGZpbGwgPj4gODsKLSAgZm9yIChpID0gMTsgaSA8IHNpemU7IGkgKz0gMikKLSAgICBzcGFjZVtpXSA9IGZpbGw7Ci0gIHJlc3VsdCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBzcGFjZSwKLQkJCQkgICAgIChmaWxlX3B0cikgbGlua19vcmRlci0+b2Zmc2V0LAotCQkJCSAgICAgbGlua19vcmRlci0+c2l6ZSk7Ci0gIGZyZWUgKHNwYWNlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIGhhbmRsZSBhIGJmZF9pbmRpcmVjdF9saW5rX29yZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlZmF1bHRfaW5kaXJlY3RfbGlua19vcmRlciAob3V0cHV0X2JmZCwgaW5mbywgb3V0cHV0X3NlY3Rpb24sIGxpbmtfb3JkZXIsCi0JCQkgICAgIGdlbmVyaWNfbGlua2VyKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLSAgICAgYm9vbGVhbiBnZW5lcmljX2xpbmtlcjsKLXsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gIGJmZCAqaW5wdXRfYmZkOwotICBiZmRfYnl0ZSAqY29udGVudHMgPSBOVUxMOwotICBiZmRfYnl0ZSAqbmV3X2NvbnRlbnRzOwotCi0gIEJGRF9BU1NFUlQgKChvdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKTsKLQotICBpZiAobGlua19vcmRlci0+c2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0gIGlucHV0X2JmZCA9IGlucHV0X3NlY3Rpb24tPm93bmVyOwotCi0gIEJGRF9BU1NFUlQgKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLSAgQkZEX0FTU0VSVCAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9PSBsaW5rX29yZGVyLT5vZmZzZXQpOwotICBCRkRfQVNTRVJUIChpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPT0gbGlua19vcmRlci0+c2l6ZSk7Ci0KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgJiYgaW5wdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgPiAwCi0gICAgICAmJiBvdXRwdXRfc2VjdGlvbi0+b3JlbG9jYXRpb24gPT0gKGFyZWxlbnQgKiopIE5VTEwpCi0gICAgewotICAgICAgLyogU3BhY2UgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCBmb3IgdGhlIG91dHB1dCByZWxvY2F0aW9ucy4KLQkgVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGNhbGxlZCBieSBhIHNwZWNpZmljIGJhY2tlbmQKLQkgYmVjYXVzZSBzb21lYm9keSBpcyBhdHRlbXB0aW5nIHRvIGxpbmsgdG9nZXRoZXIgZGlmZmVyZW50Ci0JIHR5cGVzIG9mIG9iamVjdCBmaWxlcy4gIEhhbmRsaW5nIHRoaXMgY2FzZSBjb3JyZWN0bHkgaXMKLQkgZGlmZmljdWx0LCBhbmQgc29tZXRpbWVzIGltcG9zc2libGUuICAqLwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIkF0dGVtcHQgdG8gZG8gcmVsb2NhdGVhYmxlIGxpbmsgd2l0aCAlcyBpbnB1dCBhbmQgJXMgb3V0cHV0IiksCi0JIGJmZF9nZXRfdGFyZ2V0IChpbnB1dF9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGdlbmVyaWNfbGlua2VyKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKipzeW1wcDsKLSAgICAgIGFzeW1ib2wgKipzeW1wcGVuZDsKLQotICAgICAgLyogR2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scy4gIFRoZSBnZW5lcmljIGxpbmtlciB3aWxsIGFsd2F5cwotCSBoYXZlIHJldHJpZXZlZCB0aGVtIGJ5IHRoaXMgcG9pbnQsIGJ1dCB3ZSBhcmUgYmVpbmcgY2FsbGVkIGJ5Ci0JIGEgc3BlY2lmaWMgbGlua2VyLCBwcmVzdW1hYmx5IGJlY2F1c2Ugd2UgYXJlIGxpbmtpbmcKLQkgZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdCBmaWxlcyB0b2dldGhlci4gICovCi0gICAgICBpZiAoISBnZW5lcmljX2xpbmtfcmVhZF9zeW1ib2xzIChpbnB1dF9iZmQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogU2luY2Ugd2UgaGF2ZSBiZWVuIGNhbGxlZCBieSBhIHNwZWNpZmljIGxpbmtlciwgcmF0aGVyIHRoYW4KLQkgdGhlIGdlbmVyaWMgbGlua2VyLCB0aGUgdmFsdWVzIG9mIHRoZSBzeW1ib2xzIHdpbGwgbm90IGJlCi0JIHJpZ2h0LiAgVGhleSB3aWxsIGJlIHRoZSB2YWx1ZXMgYXMgc2VlbiBpbiB0aGUgaW5wdXQgZmlsZSwKLQkgbm90IHRoZSB2YWx1ZXMgb2YgdGhlIGZpbmFsIGxpbmsuICBXZSBuZWVkIHRvIGZpeCB0aGVtIHVwCi0JIGJlZm9yZSB3ZSBjYW4gcmVsb2NhdGUgdGhlIHNlY3Rpb24uICAqLwotICAgICAgc3ltcHAgPSBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKTsKLSAgICAgIHN5bXBwZW5kID0gc3ltcHAgKyBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltY291bnQgKGlucHV0X2JmZCk7Ci0gICAgICBmb3IgKDsgc3ltcHAgPCBzeW1wcGVuZDsgc3ltcHArKykKLQl7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgc3ltID0gKnN5bXBwOwotCi0JICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0lORElSRUNUCi0JCQkgICAgIHwgQlNGX1dBUk5JTkcKLQkJCSAgICAgfCBCU0ZfR0xPQkFMCi0JCQkgICAgIHwgQlNGX0NPTlNUUlVDVE9SCi0JCQkgICAgIHwgQlNGX1dFQUspKSAhPSAwCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICAgfHwgYmZkX2lzX2luZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICB7Ci0JICAgICAgLyogc3ltLT51ZGF0YSBtYXkgaGF2ZSBiZWVuIHNldCBieQotCQkgZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xfbGlzdC4gICovCi0JICAgICAgaWYgKHN5bS0+dWRhdGEucCAhPSBOVUxMKQotCQloID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIHN5bS0+dWRhdGEucDsKLQkgICAgICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JCWggPSBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLAotCQkJCQkJICBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLAotCQkJCQkJICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICAgIGVsc2UKLQkJaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChpbmZvLT5oYXNoLAotCQkJCQkgIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksCi0JCQkJCSAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlzZXRfc3ltYm9sX2Zyb21faGFzaCAoc3ltLCBoKTsKLQkgICAgfQotCX0JICAKLSAgICB9Ci0KLSAgLyogR2V0IGFuZCByZWxvY2F0ZSB0aGUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGNvbnRlbnRzID0gKChiZmRfYnl0ZSAqKQotCSAgICAgIGJmZF9tYWxsb2MgKGJmZF9zZWN0aW9uX3NpemUgKGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbikpKTsKLSAgaWYgKGNvbnRlbnRzID09IE5VTEwgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBuZXdfY29udGVudHMgPSAoYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCQkgIChvdXRwdXRfYmZkLCBpbmZvLCBsaW5rX29yZGVyLCBjb250ZW50cywgaW5mby0+cmVsb2NhdGVhYmxlLAotCQkgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSkpOwotICBpZiAoIW5ld19jb250ZW50cykKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBPdXRwdXQgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIG91dHB1dF9zZWN0aW9uLAotCQkJCSAgKFBUUikgbmV3X2NvbnRlbnRzLAotCQkJCSAgbGlua19vcmRlci0+b2Zmc2V0LCBsaW5rX29yZGVyLT5zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChjb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQSBsaXR0bGUgcm91dGluZSB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHJlbG9jcyBpbiBhIGxpbmtfb3JkZXIKLSAgIGxpc3QuICAqLwotCi11bnNpZ25lZCBpbnQKLV9iZmRfY291bnRfbGlua19vcmRlcl9yZWxvY3MgKGxpbmtfb3JkZXIpCi0gICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbDsKLQotICBjID0gMDsKLSAgZm9yIChsID0gbGlua19vcmRlcjsgbCAhPSAoc3RydWN0IGJmZF9saW5rX29yZGVyICopIE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkgIHx8IGwtPnR5cGUgPT0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyKQotCSsrYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGM7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9saW5rX3NwbGl0X3NlY3Rpb24KLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfbGlua19zcGxpdF9zZWN0aW9uKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYyk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIG5vbnplcm8gaWYgQHZhcntzZWN9IHNob3VsZCBiZSBzcGxpdCBkdXJpbmcgYQotCXJlbG9jZWF0YWJsZSBvciBmaW5hbCBsaW5rLgotCi0uI2RlZmluZSBiZmRfbGlua19zcGxpdF9zZWN0aW9uKGFiZmQsIHNlYykgXAotLiAgICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24sIChhYmZkLCBzZWMpKQotLgotCi0qLwotCi0KLQotYm9vbGVhbgotX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbiAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9seW54LWNvcmUuYyBiL2JmZC9seW54LWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1ODE3Ny4uMDAwMDAwMAotLS0gYS9iZmQvbHlueC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyogQkZEIGJhY2sgZW5kIGZvciBMeW54IGNvcmUgZmlsZXMKLSAgIENvcHlyaWdodCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdHUgR3Jvc3NtYW4gb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLSNpbmNsdWRlIDxzeXMvY29uZi5oPgotI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KLS8qIHN5cy9rZXJuZWwuaCBzaG91bGQgZGVmaW5lIHRoaXMsIGJ1dCBkb2Vzbid0IGFsd2F5cywgc2lnaC4gKi8KLSNpZm5kZWYgX19MWU5YT1MKLSNkZWZpbmUgX19MWU5YT1MKLSNlbmRpZgotI2luY2x1ZGUgPHN5cy9tZW0uaD4KLSNpbmNsdWRlIDxzeXMvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNpbmNsdWRlIDxzeXMvaXRpbWVyLmg+Ci0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxzeXMvcHJvYy5oPgotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi1zdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAKLXsKLSAgaW50IHNpZzsKLSAgY2hhciBjbWRbUE5NTEVOICsgMV07Ci19OwotCi0jZGVmaW5lIGNvcmVfaGRyKGJmZCkgKChiZmQpLT50ZGF0YS5seW54X2NvcmVfZGF0YSkKLSNkZWZpbmUgY29yZV9zaWduYWwoYmZkKSAoY29yZV9oZHIoYmZkKS0+c2lnKQotI2RlZmluZSBjb3JlX2NvbW1hbmQoYmZkKSAoY29yZV9oZHIoYmZkKS0+Y21kKQotCi0vKiBIYW5kbGUgTHlueCBjb3JlIGR1bXAgZmlsZS4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLSAgY2hhciAqbmV3bmFtZTsKLQotICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIGlmICghbmV3bmFtZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld25hbWUsIG5hbWUpOwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmV3bmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgYXNlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIGFzZWN0LT5fcmF3X3NpemUgPSBfcmF3X3NpemU7Ci0gIGFzZWN0LT52bWEgPSB2bWE7Ci0gIGFzZWN0LT5maWxlcG9zID0gZmlsZXBvczsKLSAgYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0KLSAgcmV0dXJuIGFzZWN0OwotfQotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1seW54X2NvcmVfZmlsZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCB2YWw7Ci0gIGludCBzZWNudW07Ci0gIHN0cnVjdCBwc3NlbnRyeSBwc3M7Ci0gIHNpemVfdCB0Y29udGV4dF9zaXplOwotICBjb3JlX3N0X3QgKnRocmVhZHA7Ci0gIGludCBwYWdlc2l6ZTsKLSAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci0KLSAgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSAoKTsJLyogU2VyaW91cyBjcm9zcy10YXJnZXQgaXNzdWUgaGVyZS4uLiAgVGhpcwotCQkJCSAgIHJlYWxseSBuZWVkcyB0byBjb21lIGZyb20gYSBzeXN0ZW0tc3BlY2lmaWMKLQkJCQkgICBoZWFkZXIgZmlsZS4gICovCi0KLSAgLyogR2V0IHRoZSBwc3MgZW50cnkgZnJvbSB0aGUgY29yZSBmaWxlICovCi0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmcHNzLCAxLCBzaXplb2YgcHNzLCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgcHNzKQotICAgIHsKLSAgICAgIC8qIFRvbyBzbWFsbCB0byBiZSBhIGNvcmUgZmlsZSAqLwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGNvcmVfaGRyIChhYmZkKSA9IChzdHJ1Y3QgbHlueF9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGx5bnhfY29yZV9zdHJ1Y3QpKTsKLQotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBwc3MucG5hbWUsIFBOTUxFTiArIDEpOwotCi0gIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHRocmVhZCBjb250ZXh0cyAqLwotCi0gIHRjb250ZXh0X3NpemUgPSBwc3MudGhyZWFkY250ICogc2l6ZW9mIChjb3JlX3N0X3QpOwotCi0gIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdGhyZWFkIGNvbnRleHRzICovCi0KLSAgdGhyZWFkcCA9IChjb3JlX3N0X3QgKiliZmRfYWxsb2MgKGFiZmQsIHRjb250ZXh0X3NpemUpOwotICBpZiAoIXRocmVhZHApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2F2ZSB0aHJlYWQgY29udGV4dHMgKi8KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHBhZ2VzaXplLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKil0aHJlYWRwLCBwc3MudGhyZWFkY250LCBzaXplb2YgKGNvcmVfc3RfdCksIGFiZmQpOwotCi0gIGlmICh2YWwgIT0gdGNvbnRleHRfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSB0b28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIGNvcmVfc2lnbmFsIChhYmZkKSA9IHRocmVhZHAtPmN1cnJzaWc7Ci0KLSAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwKLQkJCSAgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgcHNzLnNzaXplLAotCQkJICAgICAgIHBzcy5zbGltaXQsCi0JCQkgICAgICAgcGFnZXNpemUgKyB0Y29udGV4dF9zaXplKTsKLSAgaWYgKCFuZXdzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIG5ld3NlY3QgPSBtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCSAgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgICAgICAgcHNzLmRhdGFfbGVuICsgcHNzLmJzc19sZW4sCi0JCQkgICAgICAgcHNzLmRhdGFfc3RhcnQsCi0JCQkgICAgICAgcGFnZXNpemUgKyB0Y29udGV4dF9zaXplICsgcHNzLnNzaXplCi0jaWYgZGVmaW5lZCAoU1BBUkMpIHx8IGRlZmluZWQgKF9fU1BBUkNfXykKLQkJCSAgICAgICAvKiBTUEFSQyBMeW54IHNlZW1zIHRvIHN0YXJ0IGR1bXBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgLmRhdGEgc2VjdGlvbiBhdCBhIHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeS4gIEl0J3MgT0sgdG8gY2hlY2sgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNkZWZpbmUgbGlrZSBTUEFSQyBoZXJlIGJlY2F1c2UgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgY2FuIG9ubHkgYmUgY29tcGlsZWQgb24gYSBMeW54Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdC4gICovCi0JCQkgICAgICAgKyBwc3MuZGF0YV9zdGFydCAlIHBhZ2VzaXplCi0jZW5kaWYKLQkJCSAgICAgICApOwotICBpZiAoIW5ld3NlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLS8qIEFuZCwgbm93IGZvciB0aGUgLnJlZy9YWFggcHNldWRvIHNlY3Rpb25zLiAgRWFjaCB0aHJlYWQgaGFzIGl0J3Mgb3duCi0gICAucmVnL1hYWCBzZWN0aW9uLCB3aGVyZSBYWFggaXMgdGhlIHRocmVhZCBpZCAod2l0aG91dCBsZWFkaW5nIHplcm9zKS4gIFRoZQotICAgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkIChhdCB0aGUgdGltZSBvZiB0aGUgY29yZSBkdW1wKSBhbHNvIGhhcyBhbiBhbGlhcwotICAgY2FsbGVkIGAucmVnJyAoanVzdCB0byBrZWVwIEdEQiBoYXBweSkuICBOb3RlIHRoYXQgd2UgdXNlIGAucmVnL1hYWCcgYXMKLSAgIG9wcG9zZWQgdG8gYC5yZWdYWFgnIGJlY2F1c2UgR0RCIGV4cGVjdHMgdGhhdCAucmVnMiB3aWxsIGJlIHRoZSBmbG9hdGluZy0KLSAgIHBvaW50IHJlZ2lzdGVycy4gICovCi0KLSAgbmV3c2VjdCA9IG1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsCi0JCQkgICAgICAgU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgICBzaXplb2YgKGNvcmVfc3RfdCksCi0JCQkgICAgICAgMCwKLQkJCSAgICAgICBwYWdlc2l6ZSk7Ci0gIGlmICghbmV3c2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBmb3IgKHNlY251bSA9IDA7IHNlY251bSA8IHBzcy50aHJlYWRjbnQ7IHNlY251bSsrKQotICAgIHsKLSAgICAgIGNoYXIgc2VjbmFtZVsxMDBdOwotCi0gICAgICBzcHJpbnRmIChzZWNuYW1lLCAiLnJlZy8lZCIsIEJVSUxEUElEICgwLCB0aHJlYWRwW3NlY251bV0udGlkKSk7Ci0gICAgICBuZXdzZWN0ID0gbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsCi0JCQkJICAgU0VDX0hBU19DT05URU5UUywKLQkJCQkgICBzaXplb2YgKGNvcmVfc3RfdCksCi0JCQkJICAgMCwKLQkJCQkgICBwYWdlc2l6ZSArIHNlY251bSAqIHNpemVvZiAoY29yZV9zdF90KSk7Ci0gICAgICBpZiAoIW5ld3NlY3QpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1jaGFyICoKLWx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9jb21tYW5kIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWludAotbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGNvcmVfc2lnbmFsIChhYmZkKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLWJvb2xlYW4KLWx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotCi0jZW5kaWYgLyogTFlOWF9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvbTY4azRrbmV0YnNkLmMgYi9iZmQvbTY4azRrbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzQzOGQuLjAwMDAwMDAKLS0tIGEvYmZkL202OGs0a25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JECTQKLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgxMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLNEtfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChtNjhrNGtuZXRic2RfLE9QKQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4azRrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL202OGtsaW51eC5jIGIvYmZkL202OGtsaW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGY0N2E4Li4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc3MiArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIG02OGsgYS5vdXQgYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUJVEFSR0VUX1BBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJMHgwCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jZGVmaW5lIE1BQ0hUWVBFX09LKG10eXBlKSAoKG10eXBlKSA9PSBNXzY4MDIwIHx8IChtdHlwZSkgPT0gTV9VTktOT1dOKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9tNjhrCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a2xpbnV4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbTY4ay1saW51eCIKLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgTVkodmVjKTsKLQotLyogV2UgYWx3YXlzIGdlbmVyYXRlIFFNQUdJQyBmaWxlcyBpbiBwcmVmZXJlbmNlIHRvIFpNQUdJQyBmaWxlcy4gIEl0Ci0gICB3b3VsZCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoaXMgYSBsaW5rZXIgb3B0aW9uLCBpZiB0aGF0IGV2ZXIKLSAgIGJlY29tZXMgaW1wb3J0YW50LiAgKi8KLQotc3RhdGljIHZvaWQgTVlfZmluYWxfbGlua19jYWxsYmFjawotICBQQVJBTVMgKChiZmQgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKiwgZmlsZV9wdHIgKikpOwotc3RhdGljIGJvb2xlYW4gbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBtNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBib29sZWFuCi1tNjhrbGludXhfYmZkX2ZpbmFsX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIG9ial9hb3V0X3N1YmZvcm1hdCAoYWJmZCkgPSBxX21hZ2ljX2Zvcm1hdDsKLSAgcmV0dXJuIE5BTUUoYW91dCxmaW5hbF9saW5rKSAoYWJmZCwgaW5mbywgTVlfZmluYWxfbGlua19jYWxsYmFjayk7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2ZpbmFsX2xpbmsgbTY4a2xpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1tNjhrbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBleHRlcm5hbF9leGVjIGV4ZWNfYnl0ZXM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leGVjICpleGVjcCA9IGV4ZWNfaGRyIChhYmZkKTsKLQotICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLQotICBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgbTY4a2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotDAotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZQlHT1RfUkVGX1BSRUZJWAkiX19HT1RfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfR09UX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBHT1RfUkVGX1BSRUZJWCwgc2l6ZW9mIEdPVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogU2VlIGlmIGEgc3ltYm9sIG5hbWUgaXMgYSByZWZlcmVuY2UgdG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLQotI2lmbmRlZiBQTFRfUkVGX1BSRUZJWAotI2RlZmluZQlQTFRfUkVGX1BSRUZJWAkiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0JICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLQkgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotCSBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIGxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBmcmVlIChyZXQpOwotICAgICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMOwotICAgIH0KLQotICByZXQtPmR5bm9iaiA9IE5VTEw7Ci0gIHJldC0+Zml4dXBfY291bnQgPSAwOwotICByZXQtPmxvY2FsX2J1aWx0aW5zID0gMDsKLSAgcmV0LT5maXh1cF9saXN0ID0gTlVMTDsKLQotICByZXR1cm4gJnJldC0+cm9vdC5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBsaW51eF9saW5rX2hhc2hfbG9va3VwKHRhYmxlLCBzdHJpbmcsIGNyZWF0ZSwgY29weSwgZm9sbG93KSBcCi0gICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKSBcCi0gICBhb3V0X2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChhb3V0X2xpbmtfaGFzaF90cmF2ZXJzZQkJCQkJCVwKLSAgICgmKHRhYmxlKS0+cm9vdCwJCQkJCQkJXAotICAgIChib29sZWFuICgqKSBQQVJBTVMgKChzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSkpIChmdW5jKSwJXAotICAgIChpbmZvKSkpCi0KLS8qIEdldCB0aGUgTGludXggbGluayBoYXNoIHRhYmxlIGZyb20gdGhlIGluZm8gc3RydWN0dXJlLiAgVGhpcyBpcwotICAganVzdCBhIGNhc3QuICAqLwotCi0jZGVmaW5lIGxpbnV4X2hhc2hfdGFibGUocCkgKChzdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlICopICgocCktPmhhc2gpKQotCi0vKiBTdG9yZSB0aGUgaW5mb3JtYXRpb24gZm9yIGEgbmV3IGZpeHVwLiAgKi8KLQotc3RhdGljIHN0cnVjdCBmaXh1cCAqCi1uZXdfZml4dXAgKGluZm8sIGgsIHZhbHVlLCBidWlsdGluKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgaW50IGJ1aWx0aW47Ci17Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLQotICBmID0gKHN0cnVjdCBmaXh1cCAqKSBiZmRfaGFzaF9hbGxvY2F0ZSAoJmluZm8tPmhhc2gtPnRhYmxlLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0JCSAgICAgIGNvcHksIGNvbGxlY3QsIGhhc2hwKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgYm9vbGVhbiBjb3B5OwotICAgICBib29sZWFuIGNvbGxlY3Q7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqaGFzaHA7Ci17Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gaW5zZXJ0OwotCi0gIC8qIExvb2sgdXAgYW5kIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuCi0gICAgIElmIHdlIGRvLCBhbmQgdGhlIGRlZmluaW5nIGVudHJ5IGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgd2UKLSAgICAgbmVlZCB0byBjcmVhdGUgdGhlIGR5bmFtaWMgc2VjdGlvbnMuCi0KLSAgICAgRklYTUU6IFdoYXQgaWYgYWJmZC0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yPyAgV2UgbWF5IHdhbnQgdG8KLSAgICAgYmUgYWJsZSB0byBsaW5rIExpbnV4IGEub3V0IGFuZCBFTEYgb2JqZWN0cyB0b2dldGhlciwgYnV0IHNlcmlvdXMKLSAgICAgY29uZnVzaW9uIGlzIHBvc3NpYmxlLiAgKi8KLQotICBpbnNlcnQgPSBmYWxzZTsKLQotICBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUKLSAgICAgICYmIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPT0gTlVMTAotICAgICAgJiYgc3RyY21wIChuYW1lLCBTSEFSQUJMRV9DT05GTElDVFMpID09IDAKLSAgICAgICYmIChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIGlmICghIGxpbnV4X2xpbmtfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotICAgICAgaW5zZXJ0ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIGZhbHNlLAotCQkJCSAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoICE9IE5VTEwKLQkgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIHN0cnVjdCBmaXh1cCAqZjsKLQotCSAgaWYgKGhhc2hwICE9IE5VTEwpCi0JICAgICpoYXNocCA9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBoOwotCi0JICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoLCB2YWx1ZSwgISBJU19QTFRfU1lNIChuYW1lKSk7Ci0JICBpZiAoZiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBmLT5qdW1wID0gSVNfUExUX1NZTSAobmFtZSk7Ci0KLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotCSBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLQkJCQkgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCSAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLQkgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotCQkgIHNpemVvZiBORUVEU19TSFJMSUIgLSAxKSA9PSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciAqYWxsb2MgPSBOVUxMOwotCi0gICAgICBuYW1lID0gaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nICsgc2l6ZW9mIE5FRURTX1NIUkxJQiAtIDE7Ci0gICAgICBwID0gc3RycmNociAobmFtZSwgJ18nKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JYWxsb2MgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIGlmIChwID09IE5VTEwgfHwgYWxsb2MgPT0gTlVMTCkKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcydcbiIpLAotCQkJICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotCSAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotCSAgKnArKyA9ICdcMCc7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotCSAgICAgYWxsb2MsIHApOwotCSAgZnJlZSAoYWxsb2MpOwotCX0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdCBpdCAqLwotICBpc19wbHQgPSBJU19QTFRfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpOwotCi0gIGlmIChpc19wbHQgfHwgSVNfR09UX1NZTSAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKSkKLSAgICB7Ci0gICAgICAvKiBMb29rIHVwIHRoaXMgc3ltYm9sIHR3aWNlLiAgT25jZSBqdXN0IGFzIGEgcmVndWxhciBsb29rdXAsCi0JIGFuZCB0aGVuIGFnYWluIGZvbGxvd2luZyBhbGwgb2YgdGhlIGluZGlyZWN0IGxpbmtzIHVudGlsIHdlCi0JIHJlYWNoIGEgcmVhbCBzeW1ib2wuICAqLwotICAgICAgaDEgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkgICAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nCi0JCQkJICAgICsgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSksCi0JCQkJICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIC8qIGgyIGRvZXMgbm90IGZvbGxvdyBpbmRpcmVjdCBzeW1ib2xzLiAqLwotICAgICAgaDIgPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkJICAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZwotCQkJCSAgICArIHNpemVvZiBQTFRfUkVGX1BSRUZJWCAtIDEpLAotCQkJCSAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICAvKiBUaGUgcmVhbCBzeW1ib2wgbXVzdCBleGlzdCBidXQgaWYgaXQgaXMgYWxzbyBhbiBBQlMgc3ltYm9sLAotCSB0aGVyZSBpcyBubyBuZWVkIHRvIGhhdmUgYSBmaXh1cC4gIFRoaXMgaXMgYmVjYXVzZSB0aGV5IGJvdGgKLQkgY2FtZSBmcm9tIHRoZSBzYW1lIGxpYnJhcnkuICBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgd2UgaGFkIHRvCi0JIHVzZSBhbiBpbmRpcmVjdCBzeW1ib2wgdG8gZ2V0IHRvIHRoZSByZWFsIHN5bWJvbCwgd2UgYWRkIHRoZQotCSBmaXh1cCBhbnl3YXksIHNpbmNlIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGVzZSBzeW1ib2xzIGNvbWUKLQkgZnJvbSBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgICAgaWYgKGgxICE9IE5VTEwKLQkgICYmICgoKGgxLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJfHwgaDEtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgICAgJiYgISBiZmRfaXNfYWJzX3NlY3Rpb24gKGgxLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgICAgfHwgaDItPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpKQotCXsKLQkgIC8qIFNlZSBpZiB0aGVyZSBpcyBhICJidWlsdGluIiBmaXh1cCBhbHJlYWR5IHByZXNlbnQKLQkgICAgIGludm9sdmluZyB0aGlzIHN5bWJvbC4gIElmIHNvLCBjb252ZXJ0IGl0IHRvIGEgcmVndWxhcgotCSAgICAgZml4dXAuICBJbiB0aGUgZW5kLCB0aGlzIHJlbGF4ZXMgc29tZSBvZiB0aGUgcmVxdWlyZW1lbnRzCi0JICAgICBhYm91dCB0aGUgb3JkZXIgb2YgcGVyZm9ybWluZyBmaXh1cHMuICAqLwotCSAgZXhpc3RzID0gZmFsc2U7Ci0JICBmb3IgKGYxID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7Ci0JICAgICAgIGYxICE9IE5VTEw7Ci0JICAgICAgIGYxID0gZjEtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKGYxLT5oICE9IGggJiYgZjEtPmggIT0gaDEpCi0JCSAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChmMS0+aCA9PSBoMSkKLQkJZXhpc3RzID0gdHJ1ZTsKLQkgICAgICBpZiAoISBleGlzdHMKLQkJICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLQkJewotCQkgIGYgPSBuZXdfZml4dXAgKGluZm8sIGgxLCBmMS0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkJICBmLT5qdW1wID0gaXNfcGx0OwotCQl9Ci0JICAgICAgZjEtPmggPSBoMTsKLQkgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLQkgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0JICAgICAgZXhpc3RzID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKCEgZXhpc3RzCi0JICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JICAgIHsKLQkgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLQkgICAgICBpZiAoZiA9PSBOVUxMKQotCQl7Ci0JCSAgLyogRklYTUU6IE5vIHdheSB0byByZXR1cm4gZXJyb3IuICAqLwotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZi0+anVtcCA9IGlzX3BsdDsKLQkgICAgfQotCX0KLQotICAgICAgLyogUXVpY2sgYW5kIGRpcnR5IHdheSBvZiBzdHJpcHBpbmcgdGhlc2Ugc3ltYm9scyBmcm9tIHRoZQotCSBzeW10YWIuICovCi0gICAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0JaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgLmxpbnV4LWR5bmFtaWMgc2VjdGlvbiBpcy4KLSAgIEl0IGlzIGNhbGxlZCBieSB0aGUgTGludXggbGlua2VyIGVtdWxhdGlvbiBiZWZvcmVfYWxsb2NhdGlvbgotICAgcm91dGluZS4gIFdlIGhhdmUgZmluaXNoZWQgcmVhZGluZyBhbGwgb2YgdGhlIGlucHV0IGZpbGVzLCBhbmQgbm93Ci0gICB3ZSBqdXN0IHNjYW4gdGhlIGhhc2ggdGFibGVzIHRvIGZpbmQgb3V0IGhvdyBtYW55IGFkZGl0aW9uYWwgZml4dXBzCi0gICBhcmUgcmVxdWlyZWQuICAqLwotCi1ib29sZWFuCi1iZmRfbTY4a2xpbnV4X3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotICBhc2VjdGlvbiAqczsKLQotICBpZiAob3V0cHV0X2JmZC0+eHZlYyAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBGaXJzdCBmaW5kIHRoZSBmaXh1cHMuLi4gKi8KLSAgbGludXhfbGlua19oYXNoX3RyYXZlcnNlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCSAgICBsaW51eF90YWxseV9zeW1ib2xzLAotCQkJICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLQl7Ci0JICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLQkgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotCWFib3J0ICgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGZpeHVwIHRhYmxlLiAgV2Ugd2lsbCBmaWxsIGl0IGluIGxhdGVyLiAgKi8KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBpZiAocyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IDggKyBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgKiA4OwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgKHNpemVfdCkgcy0+X3Jhd19zaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIGFyZSByZWFkeSB0byBhY3R1YWxseSB3cml0ZSB0aGUgZml4dXAgdGFibGUgdG8KLSAgIHRoZSBvdXRwdXQgZmlsZS4gIFNjYW4gdGhlIGZpeHVwIHRhYmxlcyBhbmQgc28gZm9ydGggYW5kIGdlbmVyYXRlCi0gICB0aGUgc3R1ZmYgd2UgbmVlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9maW5pc2hfZHluYW1pY19saW5rIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqcywgKm9zLCAqaXM7Ci0gIGJmZF9ieXRlICpmaXh1cF90YWJsZTsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgc3RydWN0IGZpeHVwICpmOwotICB1bnNpZ25lZCBpbnQgbmV3X2FkZHI7Ci0gIGludCBzZWN0aW9uX29mZnNldDsKLSAgdW5zaWduZWQgaW50IGZpeHVwc193cml0dGVuOwotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqLAotCQkJICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwgCi0JICBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JICBvcy0+dm1hICsgcy0+b3V0cHV0X29mZnNldCk7Ci0jZW5kaWYKLQotICBmaXh1cF90YWJsZSA9IHMtPmNvbnRlbnRzOwotICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQsIGZpeHVwX3RhYmxlKTsKLSAgZml4dXBfdGFibGUgKz0gNDsKLQotICAvKiBGaWxsIGluIGZpeHVwIHRhYmxlLiAgKi8KLSAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgaWYgKGYtPmJ1aWx0aW4pCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIlN5bWJvbCAlcyBub3QgZGVmaW5lZCBmb3IgZml4dXBzXG4iKSwKLQkgICAgIGYtPmgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlzID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiRml4dXAoJWQpICVzOiAleCAleFxuIixmLT5qdW1wLCBmLT5oLT5yb290LnJvb3Quc3RyaW5nLAotCSAgICAgIG5ld19hZGRyLCBmLT52YWx1ZSk7Ci0jZW5kaWYKLQotICAgICAgaWYgKGYtPmp1bXApCi0JewotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBmLT52YWx1ZSArIDIsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JfQotICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgaWYgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5sb2NhbF9idWlsdGlucyAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNwZWNpYWwgbWFya2VyIHNvIHdlIGtub3cgdG8gc3dpdGNoIHRvIHRoZSBvdGhlciB0eXBlIG9mIGZpeHVwICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBpZiAoISBmLT5idWlsdGluKQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgICYmIGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotCQkgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotCSAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotCSAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLQkgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLQkJICBuZXdfYWRkciwgZi0+dmFsdWUpOwotI2VuZGlmCi0KLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICArK2ZpeHVwc193cml0dGVuOwotCX0KLSAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgIT0gZml4dXBzX3dyaXR0ZW4pCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJXYXJuaW5nOiBmaXh1cCBjb3VudCBtaXNtYXRjaFxuIikpOwotICAgICAgd2hpbGUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCA+IGZpeHVwc193cml0dGVuKQotCXsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLQkgIGZpeHVwX3RhYmxlICs9IDQ7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0JICBmaXh1cF90YWJsZSArPSA0OwotCSAgKytmaXh1cHNfd3JpdHRlbjsKLQl9Ci0gICAgfQotCi0gIGggPSBsaW51eF9saW5rX2hhc2hfbG9va3VwIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKSwgCi0JCQkgICAgICAiX19CVUlMVElOX0ZJWFVQU19fIiwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gIGlmIChoICE9IE5VTEwKLSAgICAgICYmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgaXMgPSBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJCdWlsdGluIGZpeHVwIHRhYmxlIGF0ICV4XG4iLCBuZXdfYWRkcik7Ci0jZW5kaWYKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmV3X2FkZHIsIGZpeHVwX3RhYmxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLCBvcy0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzLT5jb250ZW50cywgMSwgcy0+X3Jhd19zaXplLCBvdXRwdXRfYmZkKQotICAgICAgIT0gcy0+X3Jhd19zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBsaW51eF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2FkZF9vbmVfc3ltYm9sIGxpbnV4X2FkZF9vbmVfc3ltYm9sCi0jZGVmaW5lIE1ZX2ZpbmlzaF9keW5hbWljX2xpbmsgbGludXhfZmluaXNoX2R5bmFtaWNfbGluawotCi0jZGVmaW5lIE1ZX3ptYWdpY19jb250aWd1b3VzIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbTY4a2x5bnguYyBiL2JmZC9tNjhrbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWNkZmJjLi4wMDAwMDAwCi0tLSBhL2JmZC9tNjhrbHlueC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBtNjhrIGJpbmFyaWVzIHVuZGVyIEx5bnhPUy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotCi0jZGVmaW5lIFRFWFRfU1RBUlRfQUREUiAwCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgNDA5NgotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a2x5bnhfYW91dF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LW02OGstbHlueCIKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLSNkZWZpbmUgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jaWZkZWYgTFlOWF9DT1JFCi0KLWNoYXIgKmx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCgpOwotaW50IGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKCk7Ci1jb25zdCBiZmRfdGFyZ2V0ICpseW54X2NvcmVfZmlsZV9wKCk7Ci0KLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQKLSNkZWZpbmUJTVlfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCBseW54X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfcCBseW54X2NvcmVfZmlsZV9wCi0KLSNlbmRpZiAvKiBMWU5YX0NPUkUgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbTY4a25ldGJzZC5jIGIvYmZkL202OGtuZXRic2QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkMTY2NS4uMDAwMDAwMAotLS0gYS9iZmQvbTY4a25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbTY4ayBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLS8qIE91ciBtNjhrIHBvcnRzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCi0gICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gYWxsIG02OGsgbWFjaGluZXMuICovCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUJMHgyMDAwCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNICWJmZF9hcmNoX202OGsKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fNjhLX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQobTY4a25ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tNjhrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm5ldGJzZC5oIgpkaWZmIC0tZ2l0IGEvYmZkL204OGttYWNoMy5jIGIvYmZkL204OGttYWNoMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTU2NDA4Li4wMDAwMDAwCi0tLSBhL2JmZC9tODhrbWFjaDMuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTW90b3JvbGEgbTg4ayBhLm91dCAoTWFjaCAzKSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJKDQwOTYqMikKLSNkZWZpbmUgU0VHTUVOVF9TSVpFCTB4MjAwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCTAKLSNkZWZpbmUgQllURVNfSU5fV09SRAk0Ci0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkJMSAJCS8qIChOX01BR0lHKHgpID09IFpNQUdJQykgKi8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBOX1RYVFNJWkUoeCkJKCh4KS5hX3RleHQpCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX204OGsKLSNkZWZpbmUgTVkoT1ApIENBVChtODhrbWFjaDNfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1tODhrLW1hY2gzIgotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9tYWtlZmlsZS5kb3MgYi9iZmQvbWFrZWZpbGUuZG9zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTIyYzZhLi4wMDAwMDAwCi0tLSBhL2JmZC9tYWtlZmlsZS5kb3MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi1DRkxBR1M9LU8yCi0KLS5jLm8gOgotCWdjYyAkKENGTEFHUykgLUkuIC1JLi4vaW5jbHVkZSAtYyAkPAotCi1hbGwgOiBsaWJiZmQuYQotCi10YXJnZXRzLm8gOiB0YXJnZXRzLmMKLQlnY2MgJChDRkxBR1MpIC1JLiAtSS4uL2luY2x1ZGUgLURTRUxFQ1RfVkVDUz0mZ28zMmNvZmZfdmVjLCZpMzg2YW91dF92ZWMgLURERUZBVUxUX1ZFQ1RPUj1nbzMyY29mZl92ZWMgLWMgJCouYwotCi1hcmNodXJlcy5vIDogYXJjaHVyZXMuYwotCWdjYyAkKENGTEFHUykgLUkuIC1JLi4vaW5jbHVkZSAtRFNFTEVDVF9BUkNISVRFQ1RVUkVTPWJmZF9pMzg2X2FyY2ggLWMgJCouYwotCi1PQkpTID0gXAotCWxpYmJmZC5vIFwKLQlvcG5jbHMubyBcCi0JYmZkLm8gXAotCWFyY2hpdmUubyBcCi0JdGFyZ2V0cy5vIFwKLQljYWNoZS5vIFwKLQlhcmNodXJlcy5vIFwKLQljb3JlZmlsZS5vIFwKLQlzZWN0aW9uLm8gXAotCWZvcm1hdC5vIFwKLQlzeW1zLm8gXAotCXJlbG9jLm8gXAotCWluaXQubyBcCi0JY29mZmdlbi5vIFwKLQlzcmVjLm8gXAotCWhhc2gubyBcCi0JbGlua2VyLm8gXAotCWVjb2ZmLm8gXAotCWVjb2ZmbGluay5vIFwKLQllbGYubyBcCi0JYW91dDMyLm8gXAotCXN0YWItc3ltLm8gXAotCWkzODZhb3V0Lm8gXAotCWNwdS1pMzg2Lm8gXAotCWNvZmYtZ28zMi5vIFwKLQljb2ZmbGluay5vIFwKLQllbGYzMi5vIFwKLQliaW5hcnkubyBcCi0JdGVraGV4Lm8gXAotCSRFCi0KLWxpYmJmZC5hIDogJChPQkpTKQotCS1ybSBsaWJiZmQuYQotCWFyIHJ2cyBsaWJiZmQuYSAkKE9CSlMpCi0JcmFubGliIGxpYmJmZC5hCmRpZmYgLS1naXQgYS9iZmQvbWFrZWZpbGUudm1zIGIvYmZkL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2YjFmZi4uMDAwMDAwMAotLS0gYS9iZmQvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgYmZkIGxpYnJhcnkgdW5kZXIgb3BlblZNUyAoQWxwaGEgYW5kIFZheCkKLSMKLSMgRm9yIHVzZSB3aXRoIGdudS1tYWtlIGZvciB2bXMKLSMKLSMgQ3JlYXRlZCBieSBLbGF1cyBLImFtcGYsIGtrYWVtcGZAcm1pLmRlCi0jCi0jCi0KLUNDPWNjCi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1IT1NURklMRT1hbHBoYXZtcy5oCi1UQVJHRVRPQkpTID0gY3B1LWFscGhhLm9iagotZWxzZQotSE9TVEZJTEU9dmF4dm1zLmgKLVRBUkdFVE9CSlMgPSBjcHUtdmF4Lm9iagotZW5kaWYKLQotCi1PQkpTPWFyY2hpdmUub2JqLGFyY2h1cmVzLm9iaixiZmQub2JqLGNhY2hlLm9iaixjb2ZmZ2VuLm9iaixjb3JlZmlsZS5vYmosXAotICBmb3JtYXQub2JqLGluaXQub2JqLGxpYmJmZC5vYmosb3BuY2xzLm9iaixyZWxvYy5vYmosc2VjdGlvbi5vYmosc3ltcy5vYmosXAotICB0YXJnZXRzLm9iaixoYXNoLm9iaixsaW5rZXIub2JqLGVsZi5vYmosc3JlYy5vYmosYmluYXJ5Lm9iaix0ZWtoZXgub2JqLFwKLSAgaWhleC5vYmosc3RhYi1zeW1zLm9iaix2bXMub2JqLHZtcy1oZHIub2JqLHZtcy1nc2Qub2JqLHZtcy10aXIub2JqLFwKLSAgdm1zLW1pc2Mub2JqLCQoVEFSR0VUT0JKUykKLQotaWZlcSAoJChDQyksZ2NjKQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfYWxwaGFfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF9hbHBoYV9hcmNoIixcCi0iSEFWRV92bXNfYWxwaGFfdmVjPTEiKQotZWxzZQotREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc192YXhfdmVjIixTRUxFQ1RfQVJDSElURUNUVVJFUz0iJmJmZF92YXhfYXJjaCIsXAotIkhBVkVfdm1zX3ZheF92ZWM9MSIsIlZNU19ERUJVRyIpCi1lbmRpZgotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkkKERFRlMpCi1lbHNlCi1pZmVxICgkKEFSQ0gpLEFMUEhBKQotREVGUz0vZGVmaW5lPShTRUxFQ1RfVkVDUz0iJnZtc19hbHBoYV92ZWMiLFNFTEVDVF9BUkNISVRFQ1RVUkVTPSImYmZkX2FscGhhX2FyY2giLFwKLSJIQVZFX3Ztc19hbHBoYV92ZWM9MSIsInVubGluaz1yZW1vdmUiLCJjb25zdD0iLCJWTVNfREVCVUciLCkKLWVsc2UKLURFRlM9L2RlZmluZT0oU0VMRUNUX1ZFQ1M9IiZ2bXNfdmF4X3ZlYyIsU0VMRUNUX0FSQ0hJVEVDVFVSRVM9IiZiZmRfdmF4X2FyY2giLFwKLSJIQVZFX3Ztc192YXhfdmVjPTEiLCJ1bmxpbms9cmVtb3ZlIiwiY29uc3Q9IiwiVk1TX0RFQlVHIikKLWVuZGlmCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKSQoREVGUykvd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMsbG9uZ2V4dGVybikKLWVuZGlmCi0KLQotbGliYmZkLm9sYjogc3lzZGVwLmggYmZkLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJiZmQgJChPQkpTKQotCi1zeXNkZXAuaDogWy5ob3N0c10kKEhPU1RGSUxFKSBjb25maWcuaAotCSQoQ1ApICQ8ICRACi0KLWJmZC5oOiBiZmQtaW4yLmgKLQkkJCBAY29uZmlndXJlCi0KLXRhcmdtYXRjaC5oOiBiZmQuaAotY29uZmlnLmg6IGJmZC5oCi0KLXZtcy5jOiB2bXMuaAotdm1zLW1oZC5jOiB2bXMuaAotdm1zLWdzZC5jOiB2bXMuaAotdm1zLXRpci5jOiB2bXMuaAotdm1zLW1pc2MuYzogdm1zLmgKLXRhcmdldHMuYzogdGFyZ21hdGNoLmgKLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSBsaWJiZmQub2xiOwotCSQoUk0pIHN5c2RlcC5oOwotCSQoUk0pIGJmZC5oOwotCSQoUk0pIHRhcmdtYXRjaC5oOwotCSQoUk0pIGNvbmZpZy5oOwotCSQoUk0pICoub2JqOwpkaWZmIC0tZ2l0IGEvYmZkL21pcHNic2QuYyBiL2JmZC9taXBzYnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmE2OGQuLjAwMDAwMDAKLS0tIGEvYmZkL21pcHNic2QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2OCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgTUlQUyBCU0QgKGEub3V0KSBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUmFscGggQ2FtcGJlbGwuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLS8qICNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8gKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAxCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCkgIT0gWk1BR0lDID8gKHgpLmFfZW50cnkgOgkvKiBvYmplY3QgZmlsZSBvciBOTUFHSUMgKi9cCi0JICAgIFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRQkvKiBubyBwYWRkaW5nICovXAotICAgICkKLSNkZWZpbmUgTl9EQVRBRERSKHgpIChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgNDA5NgotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX21pcHMKLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fVU5LTk9XTiBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNX01JUFMxIHx8IChtdHlwZSkgPT0gTV9NSVBTMikKLSNkZWZpbmUgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciAnXDAnCi0KLSNkZWZpbmUgTVkoT1ApIENBVChtaXBzYnNkXyxPUCkKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotI2RlZmluZSBTRVRfQVJDSF9NQUNIKEFCRkQsIEVYRUMpIFwKLSAgTVkoc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIE1ZKGNob29zZV9yZWxvY19zaXplKShBQkZEKTsKLXN0YXRpYyB2b2lkIE1ZKHNldF9hcmNoX21hY2gpIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG1hY2h0eXBlKSk7Ci1zdGF0aWMgdm9pZCBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLS8qIFdlIGNhbid0IHVzZSBNWSh4KSBoZXJlIGJlY2F1c2UgaXQgbGVhZHMgdG8gYSByZWN1cnNpdmUgY2FsbCB0byBDQVQKLSAgIHdoZW4gZXhwYW5kZWQgaW5zaWRlIEpVTVBfVEFCTEUuICAqLwotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbWlwc2JzZF9yZWxvY19ob3d0b190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgbWlwc2JzZF9jYW5vbmljYWxpemVfcmVsb2MKLQotI2RlZmluZSBNWV9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBNWV9maW5hbF9saW5rX2NhbGxiYWNrIHVudXNlZAotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIE1ZX2JhY2tlbmRfZGF0YSAmTVkoYmFja2VuZF9kYXRhKQotI2RlZmluZSBNWV9CRkRfVEFSR0VUCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgotCi1zdGF0aWMgdm9pZAotTVkoc2V0X2FyY2hfbWFjaCkgKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gIGxvbmcgbWFjaGluZTsKLQotICAvKiBEZXRlcm1pbmUgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIG9mIHRoZSBvYmplY3QgZmlsZS4gKi8KLSAgc3dpdGNoIChtYWNodHlwZSkgewotCi0gIGNhc2UgTV9NSVBTMToKLSAgICBhcmNoID0gYmZkX2FyY2hfbWlwczsKLSAgICBtYWNoaW5lID0gMzAwMDsKLSAgICBicmVhazsKLQotICBjYXNlIE1fTUlQUzI6Ci0gICAgYXJjaCA9IGJmZF9hcmNoX21pcHM7Ci0gICAgbWFjaGluZSA9IDQwMDA7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICBhcmNoID0gYmZkX2FyY2hfb2JzY3VyZTsKLSAgICBtYWNoaW5lID0gMDsKLSAgICBicmVhazsKLSAgfQotICBiZmRfc2V0X2FyY2hfbWFjaChhYmZkLCBhcmNoLCBtYWNoaW5lKTsgIAotfQotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotTVkoY2hvb3NlX3JlbG9jX3NpemUpIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoKGFiZmQpKSB7Ci0gIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlIGluIEJTRCBhLm91dCBmb3JtYXQuCi0gIFNlY3Rpb24gY29udGVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gd3JpdHRlbi4gIFdlIHdyaXRlIHRoZQotICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaChhYmZkKSkgewotICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgc3dpdGNoIChiZmRfZ2V0X21hY2goYWJmZCkpIHsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAxMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV82ODAxMCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX21hY2hfbTY4MDIwOgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzY4MDIwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fU1BBUkMpOwotICAgIGJyZWFrOwotICBjYXNlIGJmZF9hcmNoX2kzODY6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNXzM4Nik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fMjlLKTsKLSAgICBicmVhazsKLSAgY2FzZSBiZmRfYXJjaF9taXBzOgotICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoKGFiZmQpKSB7Ci0gICAgY2FzZSA0MDAwOgotICAgIGNhc2UgNjAwMDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFKCpleGVjcCwgTV9NSVBTMik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX01JUFMxKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBOX1NFVF9NQUNIVFlQRSgqZXhlY3AsIE1fVU5LTk9XTik7Ci0gIH0KLQotICBNWShjaG9vc2VfcmVsb2Nfc2l6ZSkoYWJmZCk7Ci0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gKiBNSVBTIHJlbG9jYXRpb24gdHlwZXMuCi0gKi8KLSNkZWZpbmUgTUlQU19SRUxPQ18zMgkJMAotI2RlZmluZSBNSVBTX1JFTE9DX0pNUAkJMQotI2RlZmluZSBNSVBTX1JFTE9DX1dESVNQMTYJMgotI2RlZmluZSBNSVBTX1JFTE9DX0hJMTYJCTMKLSNkZWZpbmUgTUlQU19SRUxPQ19ISTE2X1MJNAotI2RlZmluZSBNSVBTX1JFTE9DX0xPMTYJCTUKLQotLyoKLSAqIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBwZXJmb3JtaW5nIGEgQkZEX1JFTE9DX01JUFNfSk1QIHJlbG9jYXRpb24uCi0gKiBUaGUganVtcCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIGZvcm1lZCBmcm9tIHRoZSB1cHBlciA0IGJpdHMgb2YgdGhlCi0gKiAiY3VycmVudCIgcHJvZ3JhbSBjb3VudGVyIGNvbmNhdGVuYXRlZCB3aXRoIHRoZSBqdW1wIGluc3RydWN0aW9uJ3MKLSAqIDI2IGJpdCBmaWVsZCBhbmQgdHdvIHRyYWlsaW5nIHplcm9zLgotICogSWYgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgaXMgbm90IGluIHRoZSBzYW1lIHNlZ21lbnQgYXMgdGhlICJjdXJyZW50IgotICogcHJvZ3JhbSBjb3VudGVyLCB0aGVuIHdlIG5lZWQgdG8gc2lnbmFsIGFuIGVycm9yLgotICovCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9qbXBfYWRkciAoYWJmZCxyZWxvY19lbnRyeSxzeW1ib2wsZGF0YSxpbnB1dF9zZWN0aW9uLG91dHB1dF9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci17Ci0gIGJmZF92bWEgcmVsb2NhdGlvbiwgcGM7Ci0gCi0gIC8qIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGp1c3QgY29udGludWUuICovCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKilOVUxMKQotICAgIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiAKLSAgICogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgKiBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4KLSAgICovCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmVsb2NhdGlvbiA9IDA7Ci0gIGVsc2UKLSAgICByZWxvY2F0aW9uID0gc3ltYm9sLT52YWx1ZTsKLQotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYTsKLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICBwYyA9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0ICsKLSAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArIDQ7Ci0KLSAgaWYgKChyZWxvY2F0aW9uICYgMHhGMDAwMDAwMCkgIT0gKHBjICYgMHhGMDAwMDAwMCkpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotfQotCi0vKgotICogVGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHBlcmZvcm1pbmcgYSBCRkRfUkVMT0NfSEkxNl9TIHJlbG9jYXRpb24uCi0gKiBXZSBuZWVkIHRvIHNlZSBpZiBiaXQgMTUgaXMgc2V0IGluIHRoZSByZXN1bHQuIElmIGl0IGlzLCB3ZSBhZGQKLSAqIDB4MTAwMDAgYW5kIGNvbnRpbnVlIG5vcm1hbGx5LiBUaGlzIHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uCi0gKiB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQgYXQgcnVuIHRpbWUuCi0gKi8KLXN0YXRpYyBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLW1pcHNfZml4X2hpMTZfcyBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCSBhc2VjdGlvbiAqLCBiZmQgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1taXBzX2ZpeF9oaTE2X3MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCSBvdXRwdXRfYmZkLCBlcnJvcl9tZXNzYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5OwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIFBUUiBkYXRhOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotIAotICAvKiBJZiB0aGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBqdXN0IGNvbnRpbnVlLiAqLwotICBpZiAob3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCwgcmV0dXJuIGVycm9yICovCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikKLSAgICAgICYmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspID09IDApCi0gICAgcmV0dXJuIGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogCi0gICAqIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICogaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuCi0gICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NhdGlvbiArPSBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgaWYgKHJlbG9jYXRpb24gJiAweDgwMDApCi0gICAgcmVsb2NfZW50cnktPmFkZGVuZCArPSAweDEwMDAwOwotCi0gIHJldHVybiBiZmRfcmVsb2NfY29udGludWU7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG1pcHNfaG93dG9fdGFibGVfZXh0W10gPSB7Ci0gIHtNSVBTX1JFTE9DXzMyLCAgICAgIDAsIDIsIDMyLCBmYWxzZSwgMCwgIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLAotCSIzMiIsICAgICAgIGZhbHNlLCAwLCAweGZmZmZmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0pNUCwgICAgIDIsIDIsIDI2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwKLQltaXBzX2ZpeF9qbXBfYWRkciwKLQkiTUlQU19KTVAiLCBmYWxzZSwgMCwgMHgwM2ZmZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19XRElTUDE2LCAyLCAyLCAxNiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwKLQkiV0RJU1AxNiIsICBmYWxzZSwgMCwgMHgwMDAwZmZmZiwgZmFsc2V9LAotICB7TUlQU19SRUxPQ19ISTE2LCAgIDE2LCAyLCAxNiwgZmFsc2UsIDAsIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAwLAotCSJISTE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi0gIHtNSVBTX1JFTE9DX0hJMTZfUywgMTYsIDIsIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0gICAgICAgIG1pcHNfZml4X2hpMTZfcywKLSAgICAgICAgIkhJMTZfUyIsICAgZmFsc2UsIDAsIDB4MDAwMGZmZmYsIGZhbHNlfSwKLSAge01JUFNfUkVMT0NfTE8xNiwgICAgMCwgMiwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSJMTzE2IiwgICAgIGZhbHNlLCAwLCAweDAwMDBmZmZmLCBmYWxzZX0sCi19OwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1NWShyZWxvY19ob3d0b190eXBlX2xvb2t1cCkgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0KLSAgaWYgKGJmZF9nZXRfYXJjaCAoYWJmZCkgIT0gYmZkX2FyY2hfbWlwcykKLSAgICByZXR1cm4gMDsKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DXzMyXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19KTVA6Ci0gICAgICByZXR1cm4gKCZtaXBzX2hvd3RvX3RhYmxlX2V4dFtNSVBTX1JFTE9DX0pNUF0pOwotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgcmV0dXJuICgmbWlwc19ob3d0b190YWJsZV9leHRbTUlQU19SRUxPQ19XRElTUDE2XSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSEkxNl0pOwotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfSEkxNl9TXSk7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIHJldHVybiAoJm1pcHNfaG93dG9fdGFibGVfZXh0W01JUFNfUkVMT0NfTE8xNl0pOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgYW91dHguaCB2ZXJzaW9uIGJ1dCB3ZSBuZWVkIHRvIGRvIG91cgotICogb3duIG1hcHBpbmcgb2YgZXh0ZXJuYWwgcmVsb2MgdHlwZSB2YWx1ZXMgdG8gaG93dG8gZW50cmllcy4KLSAqLwotbG9uZwotTVkoY2Fub25pY2FsaXplX3JlbG9jKShhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgICBiZmQgKmFiZmQ7Ci0gICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCwgYzsKLSAgZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgTkFNRShhb3V0LGV4dF9ob3d0b190YWJsZSlbXTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZSwgcmV0dXJuIHRoZSB2YWx1ZXMuICovCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykgewotICAgICAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OwotICAgIH0KLSAgICAqcmVscHRyID0gMDsKLSAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIH0KLSAgaWYgKHRibHB0ciAmJiBzZWN0aW9uLT5yZWxvY19jb3VudCkgewotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KSAKLSAgICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotICAgICpyZWxwdHIgPSAwOwotICAgIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgfQotCi0gIGlmICghTkFNRShhb3V0LHNsdXJwX3JlbG9jX3RhYmxlKShhYmZkLCBzZWN0aW9uLCBzeW1ib2xzKSkKLSAgICByZXR1cm4gLTE7Ci0gIHRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0KLSAgLyogZml4IHVwIGhvd3RvIGVudHJpZXMgKi8KLSAgZm9yIChjb3VudCA9IDA7IGNvdW50KysgPCBzZWN0aW9uLT5yZWxvY19jb3VudDspIAotICAgIHsKLSAgICAgIGMgPSB0YmxwdHItPmhvd3RvIC0gTkFNRShhb3V0LGV4dF9ob3d0b190YWJsZSk7Ci0gICAgICB0YmxwdHItPmhvd3RvID0gJm1pcHNfaG93dG9fdGFibGVfZXh0W2NdOwotCi0gICAgICAqcmVscHRyKysgPSB0YmxwdHIrKzsKLSAgICB9Ci0gICpyZWxwdHIgPSAwOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgTVkoYmFja2VuZF9kYXRhKSA9IHsKLSAgMCwJCQkJLyogem1hZ2ljIGNvbnRpZ3VvdXMgKi8KLSAgMSwJCQkJLyogdGV4dCBpbmNsIGhlYWRlciAqLwotICAwLAkJCQkvKiBlbnRyeSBpcyB0ZXh0IGFkZHJlc3MgKi8KLSAgMCwJCQkJLyogZXhlY19oZHJfZmxhZ3MgKi8KLSAgVEFSR0VUX1BBR0VfU0laRSwJCQkvKiB0ZXh0IHZtYSAqLwotICBNWV9zZXRfc2l6ZXMsCi0gIDAsCQkJCS8qIHRleHQgc2l6ZSBpbmNsdWRlcyBleGVjIGhlYWRlciAqLwotICAwLAkJCQkvKiBhZGRfZHluYW1pY19zeW1ib2xzICovCi0gIDAsCQkJCS8qIGFkZF9vbmVfc3ltYm9sICovCi0gIDAsCQkJCS8qIGxpbmtfZHluYW1pY19vYmplY3QgKi8KLSAgMCwJCQkJLyogd3JpdGVfZHluYW1pY19zeW1ib2wgKi8KLSAgMCwJCQkJLyogY2hlY2tfZHluYW1pY19yZWxvYyAqLwotICAwCQkJCS8qIGZpbmlzaF9keW5hbWljX2xpbmsgKi8KLX07Ci0KLWNvbnN0IGJmZF90YXJnZXQgYW91dF9taXBzX2xpdHRsZV92ZWMgPQotewotICAiYS5vdXQtbWlwcy1saXR0bGUiLAkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91ciwKLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAobGl0dGxlKSAqLwotICBCRkRfRU5ESUFOX0xJVFRMRSwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKGxpdHRsZSkgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUgfCBTRUNfREFUQSksCi0gIE1ZX3N5bWJvbF9sZWFkaW5nX2NoYXIsCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTUsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGRhdGEgKi8KLSAgYmZkX2dldGw2NCwgYmZkX2dldGxfc2lnbmVkXzY0LCBiZmRfcHV0bDY0LAotICAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwgLyogaGRycyAqLwotICAgIHtfYmZkX2R1bW15X3RhcmdldCwgTVlfb2JqZWN0X3AsIC8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsIE1ZX2NvcmVfZmlsZV9wfSwKLSAgICB7YmZkX2ZhbHNlLCBNWV9ta29iamVjdCwJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICAgIHtiZmRfZmFsc2UsIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cywgLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgTVlfYmFja2VuZF9kYXRhLAotfTsKLQotY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYyA9Ci17Ci0gICJhLm91dC1taXBzLWJpZyIsCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyIChiaWcpICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAoYmlnKSAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfQ09ERSB8IFNFQ19EQVRBKSwKLSAgTVlfc3ltYm9sX2xlYWRpbmdfY2hhciwKLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNSwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwgLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LCAvKiBoZHJzICovCi0gICAge19iZmRfZHVtbXlfdGFyZ2V0LCBNWV9vYmplY3RfcCwgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwgTVlfY29yZV9maWxlX3B9LAotICAgIHtiZmRfZmFsc2UsIE1ZX21rb2JqZWN0LAkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gICAge2JmZF9mYWxzZSwgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLCAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsIGJmZF9mYWxzZX0sCi0KLSAgICAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9DT1BZIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0NPUkUgKE1ZKSwKLSAgICAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoTVkpLAotICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChNWSksCi0gICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSBNWV9iYWNrZW5kX2RhdGEsCi19OwpkaWZmIC0tZ2l0IGEvYmZkL21wdy1jb25maWcuaW4gYi9iZmQvbXB3LWNvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhZGRlZS4uMDAwMDAwMAotLS0gYS9iZmQvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgQkZELgotCi0jIFRoaXMgaXMgYWxtb3N0IGFsd2F5cyBjb3JyZWN0LgotCi1TZXQgc2VsYXJjaHMgIiZiZmRfe3RhcmdldF9jcHV9X2FyY2giCi1TZXQgZGVmdmVjICIiCi1TZXQgc2VsdmVjcyAiIgotU2V0IGhhdmV2ZWNzICIiCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1tNjhrLmMubyAie299ImNvZmZsaW5rLmMubycKLQlTZXQgZGVmdmVjIG02OGtjb2ZmX3ZlYwotCVNldCBzZWx2ZWNzICcmbTY4a2NvZmZfdmVjJwotCVNldCBoYXZldmVjcyAnLWQgSEFWRV9tNjhrY29mZl92ZWMnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3Bvd2VycGMtYXBwbGUtbWFjb3MvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLXBtYWMuYy5vICJ7b30ieGNvZmZsaW5rLmMubycKLQlTZXQgZGVmdmVjIHBtYWNfeGNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZwbWFjX3hjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfcG1hY194Y29mZl92ZWMnCi0JU2V0IHNlbGFyY2hzICImYmZkX3Bvd2VycGNfYXJjaCIKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvaTM4Ni1cT3B0aW9uLXgtZ28zMi8KLQlTZXQgQkZEX0JBQ0tFTkRTICcie299ImNvZmYtaTM4Ni5jLm8nCi0JU2V0IGRlZnZlYyBpMzg2Y29mZl92ZWMKLQlTZXQgc2VsdmVjcyAnJmkzODZjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfaTM4NmNvZmZfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLVxPcHRpb24teC1cT3B0aW9uLXgvCi0JU2V0IEJGRF9CQUNLRU5EUyAnIntvfSJjb2ZmLW1pcHMuYy5vICJ7b30iZWNvZmYuYy5vICJ7b30iZWNvZmZsaW5rLmMubyAie299ImVsZjMyLmMubyAie299ImVsZjMyLW1pcHMuYy5vICJ7b30iZWxmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBlY29mZl9iaWdfdmVjCi0JU2V0IHNlbHZlY3MgJyZlY29mZl9iaWdfdmVjLCZlY29mZl9saXR0bGVfdmVjLCZiZmRfZWxmMzJfYmlnbWlwc192ZWMnCi0JU2V0IGhhdmV2ZWNzICctZCBIQVZFX2Vjb2ZmX2JpZ192ZWMgLWQgSEFWRV9lY29mZl9saXR0bGVfdmVjIC1kIEhBVkVfYmZkX2VsZjMyX2JpZ21pcHNfdmVjJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1cT3B0aW9uLXgtaG1zLwotCVNldCBCRkRfQkFDS0VORFMgJyJ7b30iY29mZi1zaC5jLm8gIntvfSJjb2ZmbGluay5jLm8nCi0JU2V0IGRlZnZlYyBzaGNvZmZfdmVjCi0JU2V0IHNlbHZlY3MgJyZzaGNvZmZfdmVjLCZzaGxjb2ZmX3ZlYycKLQlTZXQgaGF2ZXZlY3MgJy1kIEhBVkVfc2hjb2ZmX3ZlYyAtZCBIQVZFX3NobGNvZmZfdmVjJwotRW5kIElmCi0KLVNldCB0YSBgZWNobyB7c2VsYXJjaHN9IHwgc2VkIC1lICdzLyZiZmRfL3tvfWNwdS0vZycgLWUgJ3MvX2FyY2gvLmMuby9nJ2AKLQotU2V0IHRkZWZhdWx0cyAiLWQgREVGQVVMVF9WRUNUT1I9e2RlZnZlY30gLWQgU0VMRUNUX1ZFQ1M9e3NlbHZlY3N9IC1kIFNFTEVDVF9BUkNISVRFQ1RVUkVTPXtzZWxhcmNoc30ge2hhdmV2ZWNzfSIKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICdXT1JEU0laRSA9IDMyJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJ0JGRF9NQUNISU5FUyA9ICcge3RhfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnQkZEX0JBQ0tFTkRTID0gJyB7QkZEX0JBQ0tFTkRTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdUREVGQVVMVFMgPSAnIHt0ZGVmYXVsdHN9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICdIREVQRklMRVMgPSAnCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnVERFUEZJTEVTID0gJwkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCQk+PiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCi0KLSMgV2UgY2FuIG9ubHkgaGFuZGxlIDMyLWJpdCB0YXJnZXRzIHJpZ2h0IG5vdy4KLQotc2VkIC1lICdzL0BXT1JEU0laRUAvMzIvJyBcT3B0aW9uLWQKLSAgICAtZSAncy9Ad29yZHNpemVALzMyLycgXE9wdGlvbi1kCi0gICAgLWUgInMvQFZFUlNJT05AL2BDYXRlbmF0ZSB7c3JjZGlyfVZFUlNJT05gLyIgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0X0JJVF9ERUZJTkVEQC8wLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUXzY0X0JJVEAvLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvQEJGRF9IT1NUX1VfNjRfQklUQC8vJyBcT3B0aW9uLWQKLSAgICAtZSAncy9AQkZEX0hPU1RfNjRCSVRfTE9OR0AvMC8nIFxPcHRpb24tZAotICAgICJ7c3JjZGlyfSJiZmQtaW4yLmggPiJ7b30iYmZkLmgtbmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImJmZC5oLW5ldyAie299ImJmZC5oCi0KLXNlZCAtZSAncy9OTi8zMi9nJyAie3NyY2Rpcn0iZWxmeHgtdGFyZ2V0LmggPiJ7b30iZWxmMzItdGFyZ2V0LmgtbmV3Ci1Nb3ZlSWZDaGFuZ2UgIntvfSJlbGYzMi10YXJnZXQuaC1uZXcgIntvfSJlbGYzMi10YXJnZXQuaAotCi0jIFByZS1leHBhbmQgc29tZSBtYWNyb3MgaW4gY29mZnN3YXAuaCwgc28gTVBXIEMgZG9lc24ndCBjaG9rZS4KLQotc2VkIC1lICdzL14gIFBVVF9BT1VUSERSX1RTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0RTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0JTSVpFICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX0VOVFJZICgvICBiZmRfaF9wdXRfMzIgKC8nIFxPcHRpb24tZAotICAgIC1lICdzL14gIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgKC8gIGJmZF9oX3B1dF8zMiAoLycgXE9wdGlvbi1kCi0gICAgLWUgJ3MvXiAgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCAoLyAgYmZkX2hfcHV0XzMyICgvJyBcT3B0aW9uLWQKLSAgICAie3NyY2Rpcn0iY29mZnN3YXAuaCA+IntvfSJjb2Zmc3dhcC5oLW5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb2Zmc3dhcC5oLW5ldyAie299ImNvZmZzd2FwLmgKZGlmZiAtLWdpdCBhL2JmZC9tcHctbWFrZS5zZWQgYi9iZmQvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjQ2M2M3Li4wMDAwMDAwCi0tLSBhL2JmZC9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIFVuaXggQkZEIE1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQotIyBXaGFjayBvdXQgdW51c2VkIGhvc3QgYW5kIHRhcmdldCBkZWZpbmUgYml0cy4KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotL1RERUZJTkVTL3MvQFRERUZJTkVTQC8vCi0KLSMgRml4IHBhdGhuYW1lcyB0byBpbmNsdWRlIGRpcmVjdG9yaWVzLgotL15JTkNESVIgPSAvcy9eSU5DRElSID0gLiokL0lOQ0RJUiA9ICJ7dG9wc3JjZGlyfSJpbmNsdWRlLwotL15DU0VBUkNIID0gL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLSMgQ29tbWVudCBvdXQgc2V0dGluZyBvZiB2YXJzLCBjb25maWd1cmUgc2NyaXB0IHdpbGwgYWRkIHRoZXNlIGl0c2VsZi4KLS9eV09SRFNJWkUgPS9zL14vIy8KLSMgL15BTExfQkFDS0VORFMvcy9eLyMvCi0vXkJGRF9CQUNLRU5EUy9zL14vIy8KLS9eQkZEX01BQ0hJTkVTL3MvXi8jLwotL15UREVGQVVMVFMvcy9eLyMvCi0KLSMgUmVtb3ZlIGV4dHJhLCB1c2VsZXNzLCAiYWxsIi4KLS9eYWxsIFxcT3B0aW9uLWYgX29sZGVzdC8sL14kL2QKLQotIyBSZW1vdmUgdGhlIE1ha2VmaWxlIHJlYnVpbGQgcnVsZS4KLS9eTWFrZWZpbGUgLywvLS1yZWNoZWNrL2QKLQotIyBEb24ndCBkbyBhbnkgcmVjdXJzaXZlIHN1YmRpciBzdHVmZi4KLS8gc3ViZGlyX2RvL3Mve01BS0V9L251bGwtY29tbWFuZC8KLQotL0JGRF9IL3MvXntCRkRfSH0vI3tCRkRfSH0vCi0KLSMgQWRkIGV4cGxpY2l0IHNyY2RpciBwYXRocyB0byBzcGVjaWFsIGZpbGVzLgotL2NvbmZpZy5iZmQvcy8gY29uZmlnLmJmZC8gIntzfSJjb25maWcuYmZkL2cKLS90YXJnbWF0Y2guc2VkL3MvIHRhcmdtYXRjaC5zZWQvICJ7c30idGFyZ21hdGNoLnNlZC9nCi0KLSMgUG9pbnQgYXQgaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBhbHdheXMgaW4gdGhlIG9iamRpci4KLS9iZmQvcy8ie3N9ImJmZFwuaC8ie299ImJmZC5oL2cKLS9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS90YXJnbWF0Y2gvcy8ie3N9InRhcmdtYXRjaFwuaC8ie299InRhcmdtYXRjaC5oL2cKLS90YXJnbWF0Y2gvcy9edGFyZ21hdGNoXC5oLyJ7b30idGFyZ21hdGNoLmgvCi0vZWxmMzItdGFyZ2V0L3MvIntzfSJlbGYzMi10YXJnZXRcLmgvIntvfSJlbGYzMi10YXJnZXQuaC9nCi0vZWxmMzItdGFyZ2V0L3MvXmVsZjMyLXRhcmdldFwuaC8ie299ImVsZjMyLXRhcmdldC5oLwotL2VsZjY0LXRhcmdldC9zLyJ7c30iZWxmNjQtdGFyZ2V0XC5oLyJ7b30iZWxmNjQtdGFyZ2V0LmgvZwotL2VsZjY0LXRhcmdldC9zL15lbGY2NC10YXJnZXRcLmgvIntvfSJlbGY2NC10YXJnZXQuaC8KLQotLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZwotCi0vZGVwL3MvXC5kZXAvX19kZXAvZwotCi0jIFJlbW92aW5nIGR1cGxpY2F0ZXMgaXMgY29vbCBidXQgcHJlc2VudGx5IHVubmVjZXNzYXJ5LAotIyBzbyB3aGFjayB0aGlzIG91dC4KLS9eb2ZpbGVzIFxcT3B0aW9uLWYvLC9eJC9kCi0vb2ZpbGVzL3Mve09GSUxFU30gb2ZpbGVzL3tPRklMRVN9LwotL2VjaG8gb2ZpbGVzID0gL2QKLS9jYXQgb2ZpbGVzL3MvYGNhdCBvZmlsZXNgL3tPRklMRVN9LwotCi0jIE5vIGNvcmVmaWxlIHN1cHBvcnQuCi0vQ09SRUZJTEUvcy9AQ09SRUZJTEVALy8KLS9DT1JFRkxBRy9zL0BDT1JFRkxBR0AvLwotCi0jIE5vIFBJQyBmb29sZXJ5IGluIHRoaXMgZW52aXJvbm1lbnQuCi0vQEFMTExJQlNAL3MvQEFMTExJQlNAL3tUQVJHRVRMSUJ9LwotL0BQSUNMSVNUQC9zL0BQSUNMSVNUQC8vCi0vQFBJQ0ZMQUdAL3MvQFBJQ0ZMQUdALy8KLS9ee09GSUxFU30gXFxPcHRpb24tZiBzdGFtcC1waWNkaXIvLC9eJC9kCi0KLSMgUmVtb3ZlIHRoZSBwaWMgdHJpY2tlcnkgZnJvbSB0aGUgZGVmYXVsdCBidWlsZCBydWxlLgotL15cLmNcLm8gXFxPcHRpb24tZiAvLC9FbmQgSWYvY1wKLS5jLm8gXFxPcHRpb24tZiAuYwotCi0jIE1QVyBNYWtlIGRvZXNuJ3Qga25vdyBhYm91dCAkPC4KLS8ie299InRhcmdldHMuYy5vIFxcT3B0aW9uLWYgIntzfSJ0YXJnZXRzLmMgTWFrZWZpbGUvLC9eJC9jXAotIntvfSJ0YXJnZXRzLmMubyBcXE9wdGlvbi1mICJ7c30idGFyZ2V0cy5jIE1ha2VmaWxlXAotCXtDQ30gQERBU0hfQ19GTEFHQCB7QUxMX0NGTEFHU30ge1RERUZBVUxUU30gIntzfSJ0YXJnZXRzLmMgLW8gIntvfSJ0YXJnZXRzLmMubwotCi0vIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGUvLC9eJC9jXAotIntvfSJhcmNodXJlcy5jLm8gXFxPcHRpb24tZiAie3N9ImFyY2h1cmVzLmMgTWFrZWZpbGVcCi0Je0NDfSBAREFTSF9DX0ZMQUdAIHtBTExfQ0ZMQUdTfSB7VERFRkFVTFRTfSAie3N9ImFyY2h1cmVzLmMgLW8gIntvfSJhcmNodXJlcy5jLm8KLQotIyBSZW1vdmUgdGhlIC5oIHJlYnVpbGRpbmcgcnVsZXMsIHdlIGRvbid0IGN1cnJlbnRseSBoYXZlIGEgZG9jIHN1YmRpciwKLSMgb3IgYSB3YXkgdG8gYnVpbGQgdGhlIHByb3RvdHlwZS1oYWNraW5nIHRvb2wgdGhhdCdzIGluIGl0LgotL14ie3NyY2Rpcn0iYmZkLWluMi5oIFxcT3B0aW9uLWYgLywvXiQvZAotL14ie3NyY2Rpcn0ibGliYmZkLmggXFxPcHRpb24tZiAvLC9eJC9kCi0vXiJ7c3JjZGlyfSJsaWJjb2ZmLmggXFxPcHRpb24tZiAvLC9eJC9kCmRpZmYgLS1naXQgYS9iZmQvbmV0YnNkLWNvcmUuYyBiL2JmZC9uZXRic2QtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWIxODRkLi4wMDAwMDAwCi0tLSBhL2JmZC9uZXRic2QtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgTmV0QlNEIHN0eWxlIGNvcmUgZmlsZXMKLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBhdWwgS3JhbmVuYnVyZywgRVVSCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy9jb3JlLmg+Ci0KLS8qCi0gKiBGSVhNRTogT24gTmV0QlNEL3NwYXJjIENPUkVfRlBVX09GRlNFVCBzaG91bGQgYmUgKHNpemVvZihzdHJ1Y3QgdHJhcGZyYW1lKSkKLSAqLwotCi1zdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0IHsKLQlzdHJ1Y3QgY29yZSBjb3JlOwotfSAqcmF3cHRyOwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCW5ldGJzZF9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjaGFyICoJCW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCAJCW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbgkJbmV0YnNkX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCQlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSGFuZGxlIE5ldEJTRC1zdHlsZSBjb3JlIGR1bXAgZmlsZS4gICovCi0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1uZXRic2RfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLQotewotCWludAkJaSwgdmFsLCBvZmZzZXQ7Ci0JYXNlY3Rpb24JKmFzZWN0LCAqYXNlY3QyOwotCXN0cnVjdCBjb3JlCWNvcmU7Ci0Jc3RydWN0IGNvcmVzZWcJY29yZXNlZzsKLQotCXZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZjb3JlLCAxLCBzaXplb2YgY29yZSwgYWJmZCk7Ci0JaWYgKHZhbCAhPSBzaXplb2YgY29yZSkgewotCQkvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKENPUkVfR0VUTUFHSUMoY29yZSkgIT0gQ09SRU1BR0lDKSB7Ci0JCWJmZF9zZXRfZXJyb3IoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJhd3B0ciA9IChzdHJ1Y3QgbmV0YnNkX2NvcmVfc3RydWN0ICopCi0JCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5ldGJzZF9jb3JlX3N0cnVjdCkpOwotCWlmIChyYXdwdHIgPT0gTlVMTCkgewotCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyYXdwdHItPmNvcmUgPSBjb3JlOwotCWFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLQlvZmZzZXQgPSBjb3JlLmNfaGRyc2l6ZTsKLQlmb3IgKGkgPSAwOyBpIDwgY29yZS5jX25zZWc7IGkrKykgewotCi0JCWlmIChiZmRfc2VlayAoYWJmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkJCWdvdG8gcHVudDsKLQotCQl2YWwgPSBiZmRfcmVhZCAoKHZvaWQgKikmY29yZXNlZywgMSwgc2l6ZW9mIGNvcmVzZWcsIGFiZmQpOwotCQlpZiAodmFsICE9IHNpemVvZiBjb3Jlc2VnKSB7Ci0JCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JCQlnb3RvIHB1bnQ7Ci0JCX0KLQkJaWYgKENPUkVfR0VUTUFHSUMoY29yZXNlZykgIT0gQ09SRVNFR01BR0lDKSB7Ci0JCQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCQkJZ290byBwdW50OwotCQl9Ci0KLQkJb2Zmc2V0ICs9IGNvcmUuY19zZWdoZHJzaXplOwotCi0JCWFzZWN0ID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZihhc2VjdGlvbikpOwotCQlpZiAoYXNlY3QgPT0gTlVMTCkgewotCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJCWdvdG8gcHVudDsKLQkJfQotCi0JCWFzZWN0LT5fcmF3X3NpemUgPSBjb3Jlc2VnLmNfc2l6ZTsKLQkJYXNlY3QtPnZtYSA9IGNvcmVzZWcuY19hZGRyOwotCQlhc2VjdC0+ZmlsZXBvcyA9IG9mZnNldDsKLQkJYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JCWFzZWN0LT5uZXh0ID0gYWJmZC0+c2VjdGlvbnM7Ci0JCWFiZmQtPnNlY3Rpb25zID0gYXNlY3Q7Ci0JCWFiZmQtPnNlY3Rpb25fY291bnQrKzsKLQkJb2Zmc2V0ICs9IGNvcmVzZWcuY19zaXplOwotCi0JCXN3aXRjaCAoQ09SRV9HRVRGTEFHKGNvcmVzZWcpKSB7Ci0JCWNhc2UgQ09SRV9DUFU6Ci0JCQlhc2VjdC0+bmFtZSA9ICIucmVnIjsKLQkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19IQVNfQ09OVEVOVFM7Ci0jaWZkZWYgQ09SRV9GUFVfT0ZGU0VUCi0JCQkvKiBIYWNraXNoLi4uICovCi0JCQlhc2VjdC0+X3Jhd19zaXplID0gQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyID0gKGFzZWN0aW9uICopYmZkX3phbGxvYyAoYWJmZCwKLQkJCQkJCQkgc2l6ZW9mIChhc2VjdGlvbikpOwotCQkJaWYgKGFzZWN0MiA9PSBOVUxMKSB7Ci0JCQkJYmZkX3NldF9lcnJvcihiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkJCQlnb3RvIHB1bnQ7Ci0JCQl9Ci0JCQlhc2VjdDItPl9yYXdfc2l6ZSA9IGNvcmVzZWcuY19zaXplIC0gQ09SRV9GUFVfT0ZGU0VUOwotCQkJYXNlY3QyLT52bWEgPSAwOwotCQkJYXNlY3QyLT5maWxlcG9zID0gYXNlY3QtPmZpbGVwb3MgKyBDT1JFX0ZQVV9PRkZTRVQ7Ci0JCQlhc2VjdDItPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JCQlhc2VjdDItPm5leHQgPSBhYmZkLT5zZWN0aW9uczsKLQkJCWFzZWN0Mi0+bmFtZSA9ICIucmVnMiI7Ci0JCQlhc2VjdDItPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0hBU19DT05URU5UUzsKLQkJCWFiZmQtPnNlY3Rpb25zID0gYXNlY3QyOwotCQkJYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotI2VuZGlmCi0KLQkJCWJyZWFrOwotCQljYXNlIENPUkVfREFUQToKLQkJCWFzZWN0LT5uYW1lID0gIi5kYXRhIjsKLQkJCWFzZWN0LT5mbGFncyA9IFNFQ19BTExPQytTRUNfTE9BRCtTRUNfSEFTX0NPTlRFTlRTOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ09SRV9TVEFDSzoKLQkJCWFzZWN0LT5uYW1lID0gIi5zdGFjayI7Ci0JCQlhc2VjdC0+ZmxhZ3MgPSBTRUNfQUxMT0MrU0VDX0xPQUQrU0VDX0hBU19DT05URU5UUzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0JcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLXB1bnQ6CXsKLQkJYXNlY3Rpb24JKmFuZXh0OwotCQlmb3IgKGFzZWN0ID0gYWJmZC0+c2VjdGlvbnM7IGFzZWN0OyBhc2VjdCA9IGFuZXh0KSB7Ci0JCQlhbmV4dCA9IGFzZWN0LT5uZXh0OwotCQkJZnJlZSgodm9pZCAqKWFzZWN0KTsKLQkJfQotCX0KLQlmcmVlICgodm9pZCAqKXJhd3B0cik7Ci0JYWJmZC0+dGRhdGEubmV0YnNkX2NvcmVfZGF0YSA9IE5VTEw7Ci0JYWJmZC0+c2VjdGlvbnMgPSBOVUxMOwotCWFiZmQtPnNlY3Rpb25fY291bnQgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY2hhcioKLW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotCWJmZCAqYWJmZDsKLXsKLSAvKnJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOyovCi0gIHJldHVybiBhYmZkLT50ZGF0YS5uZXRic2RfY29yZV9kYXRhLT5jb3JlLmNfbmFtZTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBpbnQKLW5ldGJzZF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0JYmZkICphYmZkOwotewotICAvKnJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ki8KLSAgcmV0dXJuIGFiZmQtPnRkYXRhLm5ldGJzZF9jb3JlX2RhdGEtPmNvcmUuY19zaWdubzsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyBib29sZWFuCi1uZXRic2RfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgbmV0YnNkX2NvcmVfdmVjID0KLSAgewotICAgICJuZXRic2QtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIG5ldGJzZF9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsJCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChuZXRic2QpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9uZXRic2QuaCBiL2JmZC9uZXRic2QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0ODJmMC4uMDAwMDAwMAotLS0gYS9iZmQvbmV0YnNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGRlZmluaXRpb25zIHVzZWQgYnkgYWxsIE5ldEJTRCB0YXJnZXRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotVVNBLiAgKi8KLQotLyogQ2hlY2sgZm9yIG91ciBtYWNoaW5lIHR5cGUgKHBhcnQgb2YgbWFnaWMgbnVtYmVyKS4gKi8KLSNpZm5kZWYgTUFDSFRZUEVfT0sKLSNkZWZpbmUgTUFDSFRZUEVfT0sobSkgKChtKSA9PSBERUZBVUxUX01JRCB8fCAobSkgPT0gTV9VTktOT1dOKQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIG5vcm1hbCBsb2FkIGFkZHJlc3MgZm9yIGV4ZWN1dGFibGVzLiAqLwotI2RlZmluZSBURVhUX1NUQVJUX0FERFIJCVRBUkdFVF9QQUdFX1NJWkUKLQotLyogTmV0QlNEIFpNQUdJQyBoYXMgaXRzIGhlYWRlciBpbiB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KQkxCi0KLS8qIERldGVybWluZSBpZiB0aGlzIGlzIGEgc2hhcmVkIGxpYnJhcnkgdXNpbmcgdGhlIGZsYWdzLiAqLwotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgCShOX0RZTkFNSUMoeCkpCi0KLS8qIFdlIGhhdmUgNiBiaXRzIG9mIGZsYWdzIGFuZCAxMCBiaXRzIG9mIG1hY2hpbmUgSUQuICAqLwotI2RlZmluZSBOX01BQ0hUWVBFKGV4ZWMpIFwKLQkoKGVudW0gbWFjaGluZV90eXBlKSgoKGV4ZWMpLmFfaW5mbyA+PiAxNikgJiAweDAzZmYpKQotI2RlZmluZSBOX0ZMQUdTKGV4ZWMpIFwKLQkoKChleGVjKS5hX2luZm8gPj4gMjYpICYgMHgzZikKLQotI2RlZmluZSBOX1NFVF9JTkZPKGV4ZWMsIG1hZ2ljLCB0eXBlLCBmbGFncykgXAotCSgoZXhlYykuYV9pbmZvID0gKChtYWdpYykgJiAweGZmZmYpIFwKLQkgfCAoKChpbnQpKHR5cGUpICYgMHgzZmYpIDw8IDE2KSBcCi0JIHwgKCgoZmxhZ3MpICYgMHgzZikgPDwgMjQpKQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotCSgoZXhlYykuYV9pbmZvID0gXAotICAgICAgICAgKChleGVjKS5hX2luZm8gJiAweGZiMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHgzZmYpIDw8IDE2KSkKLSNkZWZpbmUgTl9TRVRfRkxBR1MoZXhlYywgZmxhZ3MpIFwKLQkoKGV4ZWMpLmFfaW5mbyA9IFwKLQkgKChleGVjKS5hX2luZm8gJiAweDAzZmZmZmZmKSB8ICgoZmxhZ3MgJiAweDAzZikgPDwgMjYpKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotCi0vKiBPbiBOZXRCU0QsIHRoZSBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGluIG50b2hsJ3MgIm5ldHdvcmsiIChiaWctZW5kaWFuKQotICAgZm9ybWF0LiAgKi8KLSNkZWZpbmUgU1dBUF9NQUdJQyhleHQpIGJmZF9nZXRiMzIgKGV4dCkKLQotLyogT24gTmV0QlNELCB0aGUgZW50cnkgcG9pbnQgbWF5IGJlIHRha2VuIHRvIGJlIHRoZSBzdGFydCBvZiB0aGUgdGV4dAotICAgc2VjdGlvbi4gICovCi0jZGVmaW5lIE1ZX2VudHJ5X2lzX3RleHRfYWRkcmVzcyAxCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykKLXN0YXRpYyBib29sZWFuIE1ZKHdyaXRlX29iamVjdF9jb250ZW50cykgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0jZGVmaW5lIE1ZX3RleHRfaW5jbHVkZXNfaGVhZGVyIDEKLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCi0KLS8qIFdyaXRlIGFuIG9iamVjdCBmaWxlLgotICAgU2VjdGlvbiBjb250ZW50cyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuLiAgV2Ugd3JpdGUgdGhlCi0gICBmaWxlIGhlYWRlciwgc3ltYm9scywgYW5kIHJlbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogV2UgbXVzdCBtYWtlIGNlcnRhaW4gdGhhdCB0aGUgbWFnaWMgbnVtYmVyIGhhcyBiZWVuIHNldC4gIFRoaXMKLSAgICAgd2lsbCBub3JtYWxseSBoYXZlIGJlZW4gZG9uZSBieSBzZXRfc2VjdGlvbl9jb250ZW50cywgYnV0IG9ubHkgaWYKLSAgICAgdGhlcmUgYWN0dWFsbHkgYXJlIHNvbWUgc2VjdGlvbiBjb250ZW50cy4gICovCi0gIGlmICghIGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSB0ZXh0X3NpemU7Ci0gICAgICBmaWxlX3B0ciB0ZXh0X2VuZDsKLQotICAgICAgTkFNRShhb3V0LGFkanVzdF9zaXplc19hbmRfdm1hcykgKGFiZmQsICZ0ZXh0X3NpemUsICZ0ZXh0X2VuZCk7Ci0gICAgfQotCi0jaWYgQ0hPT1NFX1JFTE9DX1NJWkUKLSAgQ0hPT1NFX1JFTE9DX1NJWkUoYWJmZCk7Ci0jZWxzZQotICBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPSBSRUxPQ19TVERfU0laRTsKLSNlbmRpZgotCi0gIC8qIE1hZ2ljIG51bWJlciwgbWFlc3RybywgcGxlYXNlISAgKi8KLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2goYWJmZCkpIHsKLSAgY2FzZSBERUZBVUxUX0FSQ0g6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBERUZBVUxUX01JRCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgTl9TRVRfTUFDSFRZUEUoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIGJyZWFrOwotICB9Ci0KLSAgLyogVGhlIE5ldEJTRCBtYWdpYyBudW1iZXIgaXMgYWx3YXlzIGJpZy1lbmRpYW4gKi8KLSNpZm5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotICAvKiBYWFggYXJlbid0IHRoZXJlIGFueSBtYWNybyB0byBjaGFuZ2UgYnl0ZW9yZGVyIG9mIGEgd29yZCBpbmRlcGVuZGVudCBvZgotICAgICB0aGUgaG9zdCdzIG9yIHRhcmdldCdzIGVuZGlhbmVzc2VzPyAgKi8KLSAgZXhlY3AtPmFfaW5mbwotICAgID0gKGV4ZWNwLT5hX2luZm8gJiAweGZmKSA8PCAyNCB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwKSA8PCA4Ci0gICAgICB8IChleGVjcC0+YV9pbmZvICYgMHhmZjAwMDApID4+IDggfCAoZXhlY3AtPmFfaW5mbyAmIDB4ZmYwMDAwMDApID4+IDI0OwotI2VuZGlmCi0KLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iZmQvbmV3c29zMy5jIGIvYmZkL25ld3NvczMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjN2E3NS4uMDAwMDAwMAotLS0gYS9iZmQvbmV3c29zMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXdzT1MzIChTb255LCA2OGspIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTVkoT1ApIENBVChuZXdzb3MzXyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbmV3c29zMyIKLSNkZWZpbmUgRU5UUllfQ0FOX0JFX1pFUk8KLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAgLyogQXZvaWRzIHdhcm5pbmcgd2hlbiBjb21waWxlZCB3aXRoIC1XYWxsLiAqLwotI2RlZmluZSBERUZBVUxUX0FSQ0ggYmZkX2FyY2hfbTY4awotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9hci5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgImFvdXQtdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtLXRhcmdldC5oIGIvYmZkL25sbS10YXJnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYxZDQ3ZC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtLXRhcmdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qIFRhcmdldCBkZWZpbml0aW9ucyBmb3IgMzIvNjQtYml0IE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIG5sbV9jb3JlX2ZpbGVfcCBfYmZkX2R1bW15X3RhcmdldAotCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIG5sbU5BTUUoZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2dldF9zeW10YWIgbmxtTkFNRShnZXRfc3ltdGFiKQotI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wgbmxtTkFNRShtYWtlX2VtcHR5X3N5bWJvbCkKLSNkZWZpbmUgbmxtX3ByaW50X3N5bWJvbCBubG1OQU1FKHByaW50X3N5bWJvbCkKLSNkZWZpbmUgbmxtX2dldF9zeW1ib2xfaW5mbyBubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgbmxtX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgbmxtX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBubG1fZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgbmxtX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgbmxtX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgbmxtX21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIG5sbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgbmxtTkFNRShnZXRfcmVsb2NfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9jYW5vbmljYWxpemVfcmVsb2MgbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIG5sbV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgYmZkX2RlZmF1bHRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBubG1fc2V0X3NlY3Rpb25fY29udGVudHMgbmxtTkFNRShzZXRfc2VjdGlvbl9jb250ZW50cykKLQotI2RlZmluZSBubG1fc2l6ZW9mX2hlYWRlcnMgX2JmZF9ub2xpbmtfc2l6ZW9mX2hlYWRlcnMKLSNkZWZpbmUgbmxtX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgbmxtX2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgbmxtX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBubG1fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgbmxtX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIG5sbV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBubG1fYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYSB0YXJnZXQuCi0gICBJdCBpbmNsdWRlcyB0aGluZ3MgbGlrZSBpdHMgYnl0ZSBvcmRlciwgbmFtZSwgd2hhdCByb3V0aW5lcyB0byBjYWxsCi0gICB0byBkbyB2YXJpb3VzIG9wZXJhdGlvbnMsIGV0Yy4gIEV2ZXJ5IEJGRCBwb2ludHMgdG8gYSB0YXJnZXQgc3RydWN0dXJlCi0gICB3aXRoIGl0cyAieHZlYyIgbWVtYmVyLgotCi0gICBUaGVyZSBhcmUgdHdvIHN1Y2ggc3RydWN0dXJlcyBoZXJlOiAgb25lIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzIGFuZAotICAgb25lIGZvciBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLiAgICovCi0KLQotI2lmZGVmIFRBUkdFVF9CSUdfU1lNCi1jb25zdCBiZmRfdGFyZ2V0IFRBUkdFVF9CSUdfU1lNID0KLXsKLSAgLyogbmFtZTogaWRlbnRpZnkga2luZCBvZiB0YXJnZXQgKi8KLSAgVEFSR0VUX0JJR19OQU1FLAotCi0gIC8qIGZsYXZvdXI6IGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCBmaWxlICovCi0gIGJmZF90YXJnZXRfbmxtX2ZsYXZvdXIsCi0KLSAgLyogYnl0ZW9yZGVyOiBkYXRhIGlzIGJpZyBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9CSUcsCi0KLSAgLyogaGVhZGVyX2J5dGVvcmRlcjogaGVhZGVyIGlzIGFsc28gYmlnIGVuZGlhbiAqLwotICBCRkRfRU5ESUFOX0JJRywKLQotICAvKiBvYmplY3RfZmxhZ3M6IG1hc2sgb2YgYWxsIGZpbGUgZmxhZ3MgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFMKLSAgIHwgV1BfVEVYVCksCi0gIAotICAvKiBzZWN0aW9uX2ZsYWdzOiBtYXNrIG9mIGFsbCBzZWN0aW9uIGZsYWdzICovCi0gIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfUkVBRE9OTFkgfAotICAgU0VDX0NPREUgfCBTRUNfREFUQSksIAotCi0gICAvKiBsZWFkaW5nX3N5bWJvbF9jaGFyOiBpcyB0aGUgZmlyc3QgY2hhciBvZiBhIHVzZXIgc3ltYm9sCi0gICAgICBwcmVkaWN0YWJsZSwgYW5kIGlmIHNvIHdoYXQgaXMgaXQgKi8KLSAgIDAsCi0KLSAgLyogYXJfcGFkX2NoYXI6IHBhZCBjaGFyYWN0ZXIgZm9yIGZpbGVuYW1lcyB3aXRoaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQvb3Igb3MgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUgKi8KLSAgJy8nLAotCi0gIC8qIGFyX21heF9uYW1lbGVuOiBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGFuIGFyY2hpdmUgaGVhZGVyCi0gICAgIEZJWE1FOiAgdGhpcyByZWFsbHkgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBOTE0sIHRoaXMgaXMgYSBjaGFyYWN0ZXJpc3RpYwotICAgICBvZiB0aGUgYXJjaGl2ZXIgYW5kIHNob3VsZCBiZSBpbmRlcGVuZGVudGx5IHR1bmFibGUuICBUaGlzIHZhbHVlIGlzCi0gICAgIGEgV0FHICh3aWxkIGEqKiBndWVzcykgKi8KLSAgMTUsCi0KLSAgLyogUm91dGluZXMgdG8gYnl0ZS1zd2FwIHZhcmlvdXMgc2l6ZWQgaW50ZWdlcnMgZnJvbSB0aGUgZGF0YSBzZWN0aW9ucyAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gICAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICAgIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBmaWxlIGhlYWRlcnMgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICAgIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCi0KLSAgLyogYmZkX2NoZWNrX2Zvcm1hdDogY2hlY2sgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgcmVhZCAqLwotICB7IF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICBubG1OQU1FKG9iamVjdF9wKSwJCS8qIGFzc2VtYmxlci9saW5rZXIgb3V0cHV0IChvYmplY3QgZmlsZSkgKi8KLSAgICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCS8qIGFuIGFyY2hpdmUgKi8KLSAgICBubG1fY29yZV9maWxlX3AJCS8qIGEgY29yZSBmaWxlICovCi0gIH0sCi0KLSAgLyogYmZkX3NldF9mb3JtYXQ6IHNldCB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyB3cml0dGVuICovCi0gIHsgYmZkX2ZhbHNlLAotICAgIG5sbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIGJmZF93cml0ZV9jb250ZW50czogd3JpdGUgY2FjaGVkIGluZm9ybWF0aW9uIGludG8gYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtTkFNRSh3cml0ZV9vYmplY3RfY29udGVudHMpLAotICAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywKLSAgICBiZmRfZmFsc2UKLSAgfSwKLQotICAvKiBJbml0aWFsaXplIGEganVtcCB0YWJsZSB3aXRoIHRoZSBzdGFuZGFyZCBtYWNyby4gIEFsbCBuYW1lcyBzdGFydCB3aXRoCi0gICAgICJubG0iICovCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChubG0pLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgLyogYmFja2VuZF9kYXRhOiAqLwotICAoUFRSKSBUQVJHRVRfQkFDS0VORF9EQVRBCi19OwotI2VuZGlmCi0KLSNpZmRlZiBUQVJHRVRfTElUVExFX1NZTQotY29uc3QgYmZkX3RhcmdldCBUQVJHRVRfTElUVExFX1NZTSA9Ci17Ci0gIC8qIG5hbWU6IGlkZW50aWZ5IGtpbmQgb2YgdGFyZ2V0ICovCi0gIFRBUkdFVF9MSVRUTEVfTkFNRSwKLQotICAvKiBmbGF2b3VyOiBnZW5lcmFsIGluZGljYXRpb24gYWJvdXQgZmlsZSAqLwotICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotCi0gIC8qIGJ5dGVvcmRlcjogZGF0YSBpcyBsaXR0bGUgZW5kaWFuICovCi0gIEJGRF9FTkRJQU5fTElUVExFLAotCi0gIC8qIGhlYWRlcl9ieXRlb3JkZXI6IGhlYWRlciBpcyBhbHNvIGxpdHRsZSBlbmRpYW4gKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCi0KLSAgLyogb2JqZWN0X2ZsYWdzOiBtYXNrIG9mIGFsbCBmaWxlIGZsYWdzICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1NZTVMgfCBIQVNfTE9DQUxTCi0gICB8IFdQX1RFWFQpLAotICAKLSAgLyogc2VjdGlvbl9mbGFnczogbWFzayBvZiBhbGwgc2VjdGlvbiBmbGFncyAqLwotICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX1JFQURPTkxZIHwKLSAgIFNFQ19EQVRBKSwgCi0KLSAgIC8qIGxlYWRpbmdfc3ltYm9sX2NoYXI6IGlzIHRoZSBmaXJzdCBjaGFyIG9mIGEgdXNlciBzeW1ib2wKLSAgICAgIHByZWRpY3RhYmxlLCBhbmQgaWYgc28gd2hhdCBpcyBpdCAqLwotICAgMCwKLQotICAvKiBhcl9wYWRfY2hhcjogcGFkIGNoYXJhY3RlciBmb3IgZmlsZW5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlcgotICAgICBGSVhNRTogIHRoaXMgcmVhbGx5IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggTkxNLCB0aGlzIGlzIGEgY2hhcmFjdGVyaXN0aWMKLSAgICAgb2YgdGhlIGFyY2hpdmVyIGFuZC9vciBvcyBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZSAqLwotICAnLycsCi0KLSAgLyogYXJfbWF4X25hbWVsZW46IG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIKLSAgICAgRklYTUU6ICB0aGlzIHJlYWxseSBoYXMgbm90aGluZyB0byBkbyB3aXRoIE5MTSwgdGhpcyBpcyBhIGNoYXJhY3RlcmlzdGljCi0gICAgIG9mIHRoZSBhcmNoaXZlciBhbmQgc2hvdWxkIGJlIGluZGVwZW5kZW50bHkgdHVuYWJsZS4gIFRoaXMgdmFsdWUgaXMKLSAgICAgYSBXQUcgKHdpbGQgYSoqIGd1ZXNzKSAqLwotICAxNSwKLQotICAvKiBSb3V0aW5lcyB0byBieXRlLXN3YXAgdmFyaW91cyBzaXplZCBpbnRlZ2VycyBmcm9tIHRoZSBkYXRhIHNlY3Rpb25zICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgICBiZmRfZ2V0bDMyLCBiZmRfZ2V0bF9zaWduZWRfMzIsIGJmZF9wdXRsMzIsCi0gICAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIC8qIFJvdXRpbmVzIHRvIGJ5dGUtc3dhcCB2YXJpb3VzIHNpemVkIGludGVnZXJzIGZyb20gdGhlIGZpbGUgaGVhZGVycyAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gICAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICAgIGJmZF9nZXRsMTYsIGJmZF9nZXRsX3NpZ25lZF8xNiwgYmZkX3B1dGwxNiwKLQotICAvKiBiZmRfY2hlY2tfZm9ybWF0OiBjaGVjayB0aGUgZm9ybWF0IG9mIGEgZmlsZSBiZWluZyByZWFkICovCi0gIHsgX2JmZF9kdW1teV90YXJnZXQsCQkvKiB1bmtub3duIGZvcm1hdCAqLwotICAgIG5sbU5BTUUob2JqZWN0X3ApLAkJLyogYXNzZW1ibGVyL2xpbmtlciBvdXRwdXQgKG9iamVjdCBmaWxlKSAqLwotICAgIGJmZF9nZW5lcmljX2FyY2hpdmVfcCwJLyogYW4gYXJjaGl2ZSAqLwotICAgIG5sbV9jb3JlX2ZpbGVfcAkJLyogYSBjb3JlIGZpbGUgKi8KLSAgfSwKLQotICAvKiBiZmRfc2V0X2Zvcm1hdDogc2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4gKi8KLSAgeyBiZmRfZmFsc2UsCi0gICAgbmxtX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlCi0gIH0sCi0KLSAgLyogYmZkX3dyaXRlX2NvbnRlbnRzOiB3cml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiAqLwotICB7IGJmZF9mYWxzZSwKLSAgICBubG1OQU1FKHdyaXRlX29iamVjdF9jb250ZW50cyksCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZQotICB9LAotCi0gIC8qIEluaXRpYWxpemUgYSBqdW1wIHRhYmxlIHdpdGggdGhlIHN0YW5kYXJkIG1hY3JvLiAgQWxsIG5hbWVzIHN0YXJ0IHdpdGgKLSAgICAgIm5sbSIgKi8KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAobmxtKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKG5sbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAvKiBiYWNrZW5kX2RhdGE6ICovCi0gIChQVFIpIFRBUkdFVF9CQUNLRU5EX0RBVEEKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9ubG0uYyBiL2JmZC9ubG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljNmJhYS4uMDAwMDAwMAotLS0gYS9iZmQvbmxtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBleGVjdXRhYmxlIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLS8qIE1ha2UgYW4gTkxNIG9iamVjdC4gIFdlIGp1c3QgbmVlZCB0byBhbGxvY2F0ZSB0aGUgYmFja2VuZAotICAgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi1ubG1fbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqIGFiZmQ7Ci17Ci0gIG5sbV90ZGF0YSAoYWJmZCkgPQotICAgIChzdHJ1Y3QgbmxtX29ial90ZGF0YSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBubG1fb2JqX3RkYXRhKSk7Ci0gIGlmIChubG1fdGRhdGEgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgaWYgKG5sbV9hcmNoaXRlY3R1cmUgKGFiZmQpICE9IGJmZF9hcmNoX3Vua25vd24pCi0gICAgYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgbmxtX2FyY2hpdGVjdHVyZSAoYWJmZCksCi0JCQkgICAgICAgbmxtX21hY2hpbmUgKGFiZmQpKTsKLQotICAvKiBzaW5jZSBldmVyeXRoaW5nIGlzIGRvbmUgYXQgY2xvc2UgdGltZSwgZG8gd2UgbmVlZCBhbnkgaW5pdGlhbGl6YXRpb24/ICovCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIGZvciBhbiBOTE0gb2JqZWN0LiAgKi8KLQotYm9vbGVhbgotbmxtX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotICAgICB1bnNpZ25lZCBsb25nIG1hY2hpbmU7Ci17Ci0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotICByZXR1cm4gYXJjaCA9PSBubG1fYXJjaGl0ZWN0dXJlIChhYmZkKTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1hbHBoYS5jIGIvYmZkL25sbTMyLWFscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YzhlNTEuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLWFscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTIgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgMzItYml0IEFscGhhIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIDMyIGJpdCBBbHBoYSBOTE0gZm9ybWF0LiAgWW91IG1pZ2h0IHRoaW5rCi0gICB0aGF0IGFuIEFscGhhIGNoaXAgd291bGQgdXNlIGEgNjQgYml0IGZvcm1hdCwgYnV0LCBmb3Igc29tZSByZWFzb24sCi0gICBpdCBkb2Vzbid0LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL2FscGhhLWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX2FscGhhX0V4dGVybmFsX0ZpeGVkX0hlYWRlcgotCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfcHJlZml4Ci0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX21hbmdsZV9yZWxvY3MKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUiwgYmZkX3ZtYSwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gbmxtX2FscGhhX3JlYWRfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfaW1wb3J0Ci0gIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9hbHBoYV9zZXRfcHVibGljX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBiZmRfdm1hIG5sbV9hbHBoYV9nZXRfcHVibGljX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fYWxwaGFfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotDAotLyogQWxwaGEgTkxNJ3MgaGF2ZSBhIHByZWZpeCBoZWFkZXIgYmVmb3JlIHRoZSBzdGFuZGFyZCBOTE0uICBUaGlzCi0gICBmdW5jdGlvbiByZWFkcyBpdCBpbiwgdmVyaWZpZXMgdGhlIHZlcnNpb24sIGFuZCBzZWVrcyB0aGUgYmZkIHRvCi0gICB0aGUgbG9jYXRpb24gYmVmb3JlIHRoZSByZWd1bGFyIE5MTSBoZWFkZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2FscGhhX2JhY2tlbmRfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnMsIHNpemVvZiBzLCAxLCBhYmZkKSAhPSBzaXplb2YgcykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF9oX2dldF8zMiAoYWJmZCwgcy5tYWdpYykgIT0gTkxNMzJfQUxQSEFfTUFHSUMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEZJWE1FOiBTaG91bGQgd2UgY2hlY2sgdGhlIGZvcm1hdCBudW1iZXI/ICAqLwotCi0gIC8qIFNraXAgdG8gdGhlIGVuZCBvZiB0aGUgaGVhZGVyLiAgKi8KLSAgc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcy5zaXplKTsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBzaXplLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcHJlZml4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV93cml0ZV9wcmVmaXggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKLQotICBtZW1zZXQgKCZzLCAwLCBzaXplb2Ygcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIE5MTTMyX0FMUEhBX01BR0lDLCBzLm1hZ2ljKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgMiwgcy5mb3JtYXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzaXplb2Ygcywgcy5zaXplKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnMsIHNpemVvZiBzLCAxLCBhYmZkKSAhPSBzaXplb2YgcykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotDAotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2MgdHlwZXMuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG0zMl9hbHBoYV9ob3d0b190YWJsZVtdID0KLXsKLSAgLyogUmVsb2MgdHlwZSAwIGlzIGlnbm9yZWQgYnkgaXRzZWxmLiAgSG93ZXZlciwgaXQgYXBwZWFycyBhZnRlciBhCi0gICAgIEdQRElTUCByZWxvYyB0byBpZGVudGlmeSB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGxvdyBvcmRlciAxNiBiaXRzCi0gICAgIG9mIHRoZSBncCByZWdpc3RlciBhcmUgbG9hZGVkLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfSUdOT1JFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAwLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA4LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJJR05PUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRkxPTkcsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGUVVBRCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJSRUZRVUFEIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgMzIgYml0IEdQIHJlbGF0aXZlIG9mZnNldC4gIFRoaXMgaXMganVzdCBsaWtlIFJFRkxPTkcgZXhjZXB0Ci0gICAgIHRoYXQgd2hlbiB0aGUgdmFsdWUgaXMgdXNlZCB0aGUgdmFsdWUgb2YgdGhlIGdwIHJlZ2lzdGVyIHdpbGwgYmUKLSAgICAgYWRkZWQgaW4uICAqLwotICBIT1dUTyAoQUxQSEFfUl9HUFJFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFVzZWQgZm9yIGFuIGluc3RydWN0aW9uIHRoYXQgcmVmZXJzIHRvIG1lbW9yeSBvZmYgdGhlIEdQCi0gICAgIHJlZ2lzdGVyLiAgVGhlIG9mZnNldCBpcyAxNiBiaXRzIG9mIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24uICBUaGlzCi0gICAgIHJlbG9jIGFsd2F5cyBzZWVtcyB0byBiZSBhZ2FpbnN0IHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElURVJBTCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElURVJBTCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFRoaXMgcmVsb2Mgb25seSBhcHBlYXJzIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhIExJVEVSQUwgcmVsb2MuCi0gICAgIEl0IGlkZW50aWZpZXMgYSB1c2Ugb2YgdGhlIGxpdGVyYWwuICBJdCBzZWVtcyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0gICAgIHVzZSB0aGlzIHRvIGVsaW1pbmF0ZSBhIHBvcnRpb24gb2YgdGhlIC5saXRhIHNlY3Rpb24uICBUaGUgc3ltYm9sCi0gICAgIGluZGV4IGlzIHNwZWNpYWw6IDEgbWVhbnMgdGhlIGxpdGVyYWwgYWRkcmVzcyBpcyBpbiB0aGUgYmFzZQotICAgICByZWdpc3RlciBvZiBhIG1lbW9yeSBmb3JtYXQgaW5zdHJ1Y3Rpb247IDIgbWVhbnMgdGhlIGxpdGVyYWwKLSAgICAgYWRkcmVzcyBpcyBpbiB0aGUgYnl0ZSBvZmZzZXQgcmVnaXN0ZXIgb2YgYSBieXRlLW1hbmlwdWxhdGlvbgotICAgICBpbnN0cnVjdGlvbjsgMyBtZWFucyB0aGUgbGl0ZXJhbCBhZGRyZXNzIGlzIGluIHRoZSB0YXJnZXQKLSAgICAgcmVnaXN0ZXIgb2YgYSBqc3IgaW5zdHJ1Y3Rpb24uICBUaGlzIGRvZXMgbm90IGFjdHVhbGx5IGRvIGFueQotICAgICByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElUVVNFLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElUVVNFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBMb2FkIHRoZSBncCByZWdpc3Rlci4gIFRoaXMgaXMgYWx3YXlzIHVzZWQgZm9yIGEgbGRhaCBpbnN0cnVjdGlvbgotICAgICB3aGljaCBsb2FkcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgZ3AgcmVnaXN0ZXIuICBUaGUgbmV4dCByZWxvYwotICAgICB3aWxsIGJlIGFuIElHTk9SRSByZWxvYyB3aGljaCBpZGVudGlmaWVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGRhCi0gICAgIGluc3RydWN0aW9uIHdoaWNoIGxvYWRzIHRoZSBsb3dlciAxNiBiaXRzLiAgVGhlIHN5bWJvbCBpbmRleCBvZgotICAgICB0aGUgR1BESVNQIGluc3RydWN0aW9uIGFwcGVhcnMgdG8gYWN0dWFsbHkgYmUgdGhlIG51bWJlciBvZiBieXRlcwotICAgICBiZXR3ZWVuIHRoZSBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBnaXZlcyB0d28gZGlmZmVyZW50Ci0gICAgIHdheXMgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBsZGEgaW5zdHJ1Y3Rpb24gaXM7IEkgZG9uJ3Qga25vdyB3aHkKLSAgICAgYm90aCBhcmUgdXNlZC4gIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSByZWxvY2F0aW9uIGlzIHRoZQotICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIEdQIHZhbHVlIGFuZCB0aGUgY3VycmVudCBsb2NhdGlvbjsgdGhlCi0gICAgIGxvYWQgd2lsbCBhbHdheXMgYmUgZG9uZSBhZ2FpbnN0IGEgcmVnaXN0ZXIgaG9sZGluZyB0aGUgY3VycmVudAotICAgICBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfR1BESVNQLAkvKiB0eXBlICovCi0JIDE2LAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTYsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiR1BESVNQIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSksCQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAyMSBiaXQgYnJhbmNoLiAgVGhlIG5hdGl2ZSBhc3NlbWJsZXIgZ2VuZXJhdGVzIHRoZXNlIGZvcgotICAgICBicmFuY2hlcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYW5kIGFsc28gZmlsbHMgaW4gdGhlIFBDCi0gICAgIHJlbGF0aXZlIG9mZnNldCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBJdCBzZWVtcyB0byBtZSB0aGF0IHRoaXMKLSAgICAgcmVsb2MsIHVubGlrZSB0aGUgb3RoZXJzLCBpcyBub3QgcGFydGlhbF9pbnBsYWNlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfQlJBRERSLAkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAyMSwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkJSQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDB4MWZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSBoaW50IGZvciBhIGp1bXAgdG8gYSByZWdpc3Rlci4gICovCi0gIEhPV1RPIChBTFBIQV9SX0hJTlQsCQkvKiB0eXBlICovCi0JIDIsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSElOVCIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4M2ZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4M2ZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDE2IGJpdCBQQyByZWxhdGl2ZSBvZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9TUkVMMTYsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDEsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDE2LAkJCS8qIGJpdHNpemUgKi8KLQkgdHJ1ZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDE2IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUwzMiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMNjQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmZmZmZmZmZmYsCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmZmZmZmZmZmZiwJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFVTSCIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU3RvcmUgdGhlIHZhbHVlIGZyb20gdGhlIHN0YWNrIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAgU3RvcmUgaXQgaW4KLSAgICAgYSBiaXRmaWVsZCBvZiBzaXplIHJfc2l6ZSBzdGFydGluZyBhdCBiaXQgcG9zaXRpb24gcl9vZmZzZXQuICAqLwotICBIT1dUTyAoQUxQSEFfUl9PUF9TVE9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1NUT1JFIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZmZmZmZmZmZmLAkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfUFNVQiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogU2hpZnQgdGhlIHZhbHVlIG9uIHRoZSB0b3Agb2YgdGhlIHJlbG9jYXRpb24gc3RhY2sgcmlnaHQgYnkgdGhlCi0gICAgIGdpdmVuIHZhbHVlLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFJTSElGVCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BSU0hJRlQiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEFkanVzdCB0aGUgR1AgdmFsdWUgZm9yIGEgbmV3IHJhbmdlIGluIHRoZSBvYmplY3QgZmlsZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0dQVkFMVUUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkdQVkFMVUUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKQkJCS8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfYWxwaGFfbndfaG93dG8gPQotICBIT1dUTyAoQUxQSEFfUl9OV19SRUxPQywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTldfUkVMT0MiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBSZWFkIGFuIEFscGhhIE5MTSByZWxvYy4gIFRoaXMgcm91dGluZSBrZWVwcyBzb21lIHN0YXRpYyBkYXRhIHdoaWNoCi0gICBpdCB1c2VzIHdoZW4gaGFuZGxpbmcgbG9jYWwgcmVsb2NzLiAgVGhpcyBvbmx5IHdvcmtzIGNvcnJlY3RseQotICAgYmVjYXVzZSBhbGwgdGhlIGxvY2FsIHJlbG9jcyBhcmUgcmVhZCBhdCBvbmNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgc3RhdGljIGJmZF92bWEgZ3BfdmFsdWU7Ci0gIHN0YXRpYyBiZmRfdm1hIGxpdGFfYWRkcmVzczsKLSAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3JlbG9jIGV4dDsKLSAgYmZkX3ZtYSByX3ZhZGRyOwotICBsb25nIHJfc3ltbmR4OwotICBpbnQgcl90eXBlLCByX2V4dGVybiwgcl9vZmZzZXQsIHJfc2l6ZTsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7Ci0KLSAgLyogUmVhZCB0aGUgcmVsb2MgZnJvbSB0aGUgZmlsZS4gICovCi0gIGlmIChiZmRfcmVhZCAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU3dhcCBpbiB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotICByX3ZhZGRyID0gYmZkX2hfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LnJfdmFkZHIpOwotICByX3N5bW5keCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC5yX3N5bW5keCk7Ci0KLSAgQkZEX0FTU0VSVCAoYmZkX2xpdHRsZV9lbmRpYW4gKGFiZmQpKTsKLQotICByX3R5cGUgPSAoKGV4dC5yX2JpdHNbMF0gJiBSRUxPQ19CSVRTMF9UWVBFX0xJVFRMRSkKLQkgICAgPj4gUkVMT0NfQklUUzBfVFlQRV9TSF9MSVRUTEUpOwotICByX2V4dGVybiA9IChleHQucl9iaXRzWzFdICYgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRSkgIT0gMDsKLSAgcl9vZmZzZXQgPSAoKGV4dC5yX2JpdHNbMV0gJiBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFKQotCSAgICAgID4+IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpOwotICAvKiBJZ25vcmUgdGhlIHJlc2VydmVkIGJpdHMuICAqLwotICByX3NpemUgPSAoKGV4dC5yX2JpdHNbM10gJiBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRSkKLQkgICAgPj4gUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUpOwotCi0gIC8qIEZpbGwgaW4gdGhlIEJGRCBhcmVsZW50IHN0cnVjdHVyZS4gICovCi0gIGNvZGVfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKHJfZXh0ZXJuKQotICAgIHsKLSAgICAgIC8qIEV4dGVybmFsIHJlbG9jYXRpb25zIGFyZSBvbmx5IHVzZWQgZm9yIGltcG9ydHMuICAqLwotICAgICAgQkZEX0FTU0VSVCAoc3ltICE9IE5VTEwpOwotICAgICAgLyogV2UgZG9uJ3QgbmVlZCB0byBzZXQgc3ltX3B0cl9wdHIgZm9yIHRoaXMgY2FzZS4gIEl0IGlzIHNldCBpbgotCSBubG1fY2Fub25pY2FsaXplX3JlbG9jLiAgKi8KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBOVUxMOwotICAgICAgcmVsLT5hZGRlbmQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEludGVybmFsIHJlbG9jYXRpb25zIGFyZSBvbmx5IHVzZWQgZm9yIGxvY2FsIHJlbG9jYXRpb24KLQkgZml4dXBzLiAgSWYgdGhleSBhcmUgbm90IE5XX1JFTE9DIG9yIEdQRElTUCBvciBJR05PUkUsIHRoZXkKLQkgbXVzdCBiZSBhZ2FpbnN0IC50ZXh0IG9yIC5kYXRhLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DIHx8IHN5bSA9PSBOVUxMKTsKLSAgICAgIGlmIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQwotCSAgfHwgcl90eXBlID09IEFMUEhBX1JfR1BESVNQCi0JICB8fCByX3R5cGUgPT0gQUxQSEFfUl9JR05PUkUpCi0JewotCSAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfc3ltbmR4ID09IEFMUEhBX1JFTE9DX1NFQ1RJT05fVEVYVCkKLQl7Ci0JICByZWwtPnN5bV9wdHJfcHRyID0gY29kZV9zZWMtPnN5bWJvbF9wdHJfcHRyOwotCSAgQkZEX0FTU0VSVCAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgY29kZV9zZWMpID09IDApOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfc3ltbmR4ID09IEFMUEhBX1JFTE9DX1NFQ1RJT05fREFUQSkKLQl7Ci0JICByZWwtPnN5bV9wdHJfcHRyID0gZGF0YV9zZWMtPnN5bWJvbF9wdHJfcHRyOwotCSAgcmVsLT5hZGRlbmQgPSAtIGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIGRhdGFfc2VjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgQkZEX0FTU0VSVCAoMCk7Ci0JICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotICAgIH0KLQotICAvKiBXZSB1c2UgdGhlIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlbG9jIGlzIGluIHRoZSAudGV4dAotICAgICBvciAuZGF0YSBzZWN0aW9uLiAgUl9OV19SRUxPQyByZWxvY3MgZG9uJ3QgcmVhbGx5IGhhdmUgYSBzZWN0aW9uLAotICAgICBzbyB3ZSBwdXQgdGhlbSBpbiAudGV4dC4gICovCi0gIGlmIChyX3R5cGUgPT0gQUxQSEFfUl9OV19SRUxPQwotICAgICAgfHwgcl92YWRkciA8IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKSkKLSAgICB7Ci0gICAgICAqc2VjcCA9IGNvZGVfc2VjOwotICAgICAgcmVsLT5hZGRyZXNzID0gcl92YWRkcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqc2VjcCA9IGRhdGFfc2VjOwotICAgICAgcmVsLT5hZGRyZXNzID0gcl92YWRkciAtIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKLSAgICB9Ci0KLSAgLyogV2UgbXVzdCBhZGp1c3QgdGhlIGFkZGVuZCBiYXNlZCBvbiB0aGUgdHlwZS4gICovCi0gIEJGRF9BU1NFUlQgKChyX3R5cGUgPj0gMCAmJiByX3R5cGUgPD0gQUxQSEFfUl9HUFZBTFVFKQotCSAgICAgIHx8IHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DKTsKLQotICBzd2l0Y2ggKHJfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBBTFBIQV9SX0JSQUREUjoKLSAgICBjYXNlIEFMUEhBX1JfU1JFTDE2OgotICAgIGNhc2UgQUxQSEFfUl9TUkVMMzI6Ci0gICAgY2FzZSBBTFBIQV9SX1NSRUw2NDoKLSAgICAgIC8qIFRoZSBQQyByZWxhdGl2ZSByZWxvY3MgZG8gbm90IHNlZW0gdG8gdXNlIHRoZSBzZWN0aW9uIFZNQSBhcwotCSBhIG5lZ2F0aXZlIGFkZGVuZC4gICovCi0gICAgICByZWwtPmFkZGVuZCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFJFTDMyOgotICAgICAgLyogQ29weSB0aGUgZ3AgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgYWRkZW5kLCB0bwotCSBlbnN1cmUgdGhhdCB3ZSBhcmUgbm90IGNvbmZ1c2VkIGJ5IHRoZSBsaW5rZXIuICAqLwotICAgICAgaWYgKCEgcl9leHRlcm4pCi0JcmVsLT5hZGRlbmQgKz0gZ3BfdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9MSVRFUkFMOgotICAgICAgQkZEX0FTU0VSVCAoISByX2V4dGVybik7Ci0gICAgICByZWwtPmFkZGVuZCArPSBsaXRhX2FkZHJlc3M7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0gICAgY2FzZSBBTFBIQV9SX0dQRElTUDoKLSAgICAgIC8qIFRoZSBMSVRVU0UgYW5kIEdQRElTUCByZWxvY3MgZG8gbm90IHVzZSBhIHN5bWJvbCwgb3IgYW4KLQkgYWRkZW5kLCBidXQgdGhleSBkbyB1c2UgYSBzcGVjaWFsIGNvZGUuICBQdXQgdGhpcyBjb2RlIGluIHRoZQotCSBhZGRlbmQgZmllbGQuICAqLwotICAgICAgcmVsLT5hZGRlbmQgPSByX3N5bW5keDsKLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1NUT1JFOgotICAgICAgLyogVGhlIFNUT1JFIHJlbG9jIG5lZWRzIHRoZSBzaXplIGFuZCBvZmZzZXQgZmllbGRzLiAgV2Ugc3RvcmUKLQkgdGhlbSBpbiB0aGUgYWRkZW5kLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKHJfb2Zmc2V0IDwgMjU2ICYmIHJfc2l6ZSA8IDI1Nik7Ci0gICAgICByZWwtPmFkZGVuZCA9IChyX29mZnNldCA8PCA4KSArIHJfc2l6ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0gICAgY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0gICAgICAvKiBUaGUgUFVTSCwgUFNVQiBhbmQgUFJTSElGVCByZWxvY3MgZG8gbm90IGFjdHVhbGx5IHVzZSBhbgotCSBhZGRyZXNzLiAgSSBiZWxpZXZlIHRoYXQgdGhlIGFkZHJlc3Mgc3VwcGxpZWQgaXMgcmVhbGx5IGFuCi0JIGFkZGVuZC4gICovCi0gICAgICByZWwtPmFkZGVuZCA9IHJfdmFkZHI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQUxQSEFfUl9HUFZBTFVFOgotICAgICAgLyogUmVjb3JkIHRoZSBuZXcgZ3AgdmFsdWUuICAqLwotICAgICAgZ3BfdmFsdWUgKz0gcl9zeW1uZHg7Ci0gICAgICByZWwtPmFkZGVuZCA9IGdwX3ZhbHVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFMUEhBX1JfSUdOT1JFOgotICAgICAgLyogSWYgdGhlIHR5cGUgaXMgQUxQSEFfUl9JR05PUkUsIG1ha2Ugc3VyZSB0aGlzIGlzIGEgcmVmZXJlbmNlCi0JIHRvIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHNvIHRoYXQgdGhlIHJlbG9jIGlzIGlnbm9yZWQuICBGb3IKLQkgc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhpcyByZWxvYyB0eXBlIGlzIG5vdCBhZGp1c3RlZCBieQotCSB0aGUgc2VjdGlvbiB2bWEuICBXZSByZWNvcmQgdGhlIGdwIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlCi0JIGhlcmUsIGZvciBjb252ZW5pZW5jZSB3aGVuIGRvaW5nIHRoZSBHUERJU1AgcmVsb2NhdGlvbi4gICovCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICByZWwtPmFkZHJlc3MgPSByX3ZhZGRyOwotICAgICAgcmVsLT5hZGRlbmQgPSBncF92YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBTFBIQV9SX05XX1JFTE9DOgotICAgICAgLyogSWYgdGhpcyBpcyBTRVRHUCwgd2Ugc2V0IHRoZSBhZGRlbmQgdG8gMC4gIE90aGVyd2lzZSB3ZSBzZXQKLQkgdGhlIGFkZGVuZCB0byB0aGUgc2l6ZSBvZiB0aGUgLmxpdGEgc2VjdGlvbiAodGhpcyBpcwotCSByX3N5bW5keCkgcGx1cyAxLiAgV2UgaGF2ZSBhbHJlYWR5IHNldCB0aGUgYWRkcmVzcyBvZiB0aGUKLQkgcmVsb2MgdG8gcl92YWRkci4gICovCi0gICAgICBpZiAocl9zaXplID09IEFMUEhBX1JfTldfUkVMT0NfU0VUR1ApCi0JewotCSAgZ3BfdmFsdWUgPSByX3ZhZGRyOwotCSAgcmVsLT5hZGRlbmQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHJfc2l6ZSA9PSBBTFBIQV9SX05XX1JFTE9DX0xJVEEpCi0JewotCSAgbGl0YV9hZGRyZXNzID0gcl92YWRkcjsKLQkgIHJlbC0+YWRkZW5kID0gcl9zeW1uZHggKyAxOwotCX0KLSAgICAgIGVsc2UKLQlCRkRfQVNTRVJUICgwKTsKLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAocl90eXBlID09IEFMUEhBX1JfTldfUkVMT0MpCi0gICAgcmVsLT5ob3d0byA9ICZubG0zMl9hbHBoYV9ud19ob3d0bzsKLSAgZWxzZQotICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfYWxwaGFfaG93dG9fdGFibGVbcl90eXBlXTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFuZ2xlIEFscGhhIE5MTSByZWxvY3MgZm9yIG91dHB1dC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYW4gQUxQSEEgTkxNIGltcG9ydCByZWNvcmQgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9hbHBoYV9yZWFkX2ltcG9ydCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci17Ci0gIHN0cnVjdCBubG1fcmVsZW50ICpubG1fcmVsb2NzOwkvKiByZWxvY2F0aW9uIHJlY29yZHMgZm9yIHN5bWJvbCAqLwotICBiZmRfc2l6ZV90eXBlIHJjb3VudDsJCQkvKiBudW1iZXIgb2YgcmVsb2NzICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiB0ZW1wb3JhcnkgMzItYml0IHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN5bWxlbmd0aCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotICBuYW1lW3N5bWxlbmd0aF0gPSAnXDAnOwotICBzeW0gLT4gc3ltYm9sLm5hbWUgPSBuYW1lOwotICBzeW0gLT4gc3ltYm9sLmZsYWdzID0gMDsKLSAgc3ltIC0+IHN5bWJvbC52YWx1ZSA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wuc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJjb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKCFubG1fcmVsb2NzKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX2FscGhhX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCi0JCQkJJm5sbV9yZWxvY3MgLT4gcmVsb2MpCi0JICA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBubG1fcmVsb2NzIC0+IHNlY3Rpb24gPSBzZWN0aW9uOwotICAgICAgbmxtX3JlbG9jcysrOwotICAgICAgc3ltIC0+IHJjbnQrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGFuIEFscGhhIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYmZkX3ZtYSByX3ZhZGRyOwotICBsb25nIHJfc3ltbmR4OwotICBpbnQgcl90eXBlLCByX2V4dGVybiwgcl9vZmZzZXQsIHJfc2l6ZTsKLSAgc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3JlbG9jIGV4dDsKLQotICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAvKiBHZXQgdmFsdWVzIGZvciB0aGUgcmVsb2NhdGlvbiBmaWVsZHMuICAqLwotICByX3R5cGUgPSByZWwtPmhvd3RvLT50eXBlOwotICBpZiAocl90eXBlICE9IEFMUEhBX1JfTldfUkVMT0MpCi0gICAgewotICAgICAgcl92YWRkciA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYykgKyByZWwtPmFkZHJlc3M7Ci0gICAgICBpZiAoKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgPT0gMCkKLQlyX3ZhZGRyICs9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsCi0JCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwKLQkJCQkJCQkgICAgICBOTE1fQ09ERV9OQU1FKSk7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCXsKLQkgIHJfZXh0ZXJuID0gMTsKLQkgIHJfc3ltbmR4ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcl9leHRlcm4gPSAwOwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSAmIFNFQ19DT0RFKQotCSAgICByX3N5bW5keCA9IEFMUEhBX1JFTE9DX1NFQ1RJT05fVEVYVDsKLQkgIGVsc2UKLQkgICAgcl9zeW1uZHggPSBBTFBIQV9SRUxPQ19TRUNUSU9OX0RBVEE7Ci0JfQotICAgICAgcl9vZmZzZXQgPSAwOwotICAgICAgcl9zaXplID0gMDsKLQotICAgICAgc3dpdGNoIChyX3R5cGUpCi0JewotCWNhc2UgQUxQSEFfUl9MSVRVU0U6Ci0JY2FzZSBBTFBIQV9SX0dQRElTUDoKLQkgIHJfc3ltbmR4ID0gcmVsLT5hZGRlbmQ7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9PUF9TVE9SRToKLQkgIHJfc2l6ZSA9IHJlbC0+YWRkZW5kICYgMHhmZjsKLQkgIHJfb2Zmc2V0ID0gKHJlbC0+YWRkZW5kID4+IDgpICYgMHhmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBBTFBIQV9SX09QX1BVU0g6Ci0JY2FzZSBBTFBIQV9SX09QX1BTVUI6Ci0JY2FzZSBBTFBIQV9SX09QX1BSU0hJRlQ6Ci0JICByX3ZhZGRyID0gcmVsLT5hZGRlbmQ7Ci0JICBicmVhazsKLQotCWNhc2UgQUxQSEFfUl9JR05PUkU6Ci0JICByX3ZhZGRyID0gcmVsLT5hZGRyZXNzOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJfdHlwZSA9PSBBTFBIQV9SX05XX1JFTE9DICovCi0gICAgICByX3ZhZGRyID0gcmVsLT5hZGRyZXNzOwotICAgICAgaWYgKHJlbC0+YWRkZW5kID09IDApCi0JewotCSAgcl9zeW1uZHggPSAwOwotCSAgcl9zaXplID0gQUxQSEFfUl9OV19SRUxPQ19TRVRHUDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcl9zeW1uZHggPSByZWwtPmFkZGVuZCAtIDE7Ci0JICByX3NpemUgPSBBTFBIQV9SX05XX1JFTE9DX0xJVEE7Ci0JfQotICAgICAgcl9leHRlcm4gPSAwOwotICAgICAgcl9vZmZzZXQgPSAwOwotICAgIH0KLQotICAvKiBTd2FwIG91dCB0aGUgcmVsb2NhdGlvbiBmaWVsZHMuICAqLwotICBiZmRfaF9wdXRfNjQgKGFiZmQsIHJfdmFkZHIsIChiZmRfYnl0ZSAqKSBleHQucl92YWRkcik7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgcl9zeW1uZHgsIChiZmRfYnl0ZSAqKSBleHQucl9zeW1uZHgpOwotCi0gIEJGRF9BU1NFUlQgKGJmZF9saXR0bGVfZW5kaWFuIChhYmZkKSk7Ci0KLSAgZXh0LnJfYml0c1swXSA9ICgocl90eXBlIDw8IFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFKQotCQkgICAmIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFKTsKLSAgZXh0LnJfYml0c1sxXSA9ICgocl9leHRlcm4gPyBSRUxPQ19CSVRTMV9FWFRFUk5fTElUVExFIDogMCkKLQkJICAgfCAoKHJfb2Zmc2V0IDw8IFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUpCi0JCSAgICAgICYgUkVMT0NfQklUUzFfT0ZGU0VUX0xJVFRMRSkpOwotICBleHQucl9iaXRzWzJdID0gMDsKLSAgZXh0LnJfYml0c1szXSA9ICgocl9zaXplIDw8IFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFKQotCQkgICAmIFJFTE9DX0JJVFMzX1NJWkVfTElUVExFKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHJlbG9jYXRpb24uICAqLwotICBpZiAoYmZkX3dyaXRlICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIEFscGhhIE5ldFdhcmUgZG9lcyBub3QgdXNlIHRoZSBoaWdoIGJpdCB0byBkZXRlcm1pbmUgd2hldGhlciBhCi0gICBwdWJsaWMgc3ltYm9sIGlzIGluIHRoZSBjb2RlIHNlZ21lbnQgb3IgdGhlIGRhdGEgc2VnbWVudC4gIEluc3RlYWQsCi0gICBpdCBqdXN0IHVzZXMgdGhlIGFkZHJlc3MuICBUaGUgc2V0X3B1YmxpY19zZWN0aW9uIGFuZAotICAgZ2V0X3B1YmxpY19vZmZzZXQgcm91dGluZXMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY29kZSB3aGljaCB1c2VzIHRoZQotICAgaGlnaCBiaXQuICAqLwotCi0vKiBTZXQgdGhlIHNlY3Rpb24gZm9yIGEgcHVibGljIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfc2V0X3B1YmxpY19zZWN0aW9uIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgYXNlY3Rpb24gKmNvZGVfc2VjLCAqZGF0YV9zZWM7Ci0KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAoc3ltLT5zeW1ib2wudmFsdWUgPCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYykpCi0gICAgewotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGNvZGVfc2VjOwotICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBkYXRhX3NlYzsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlIC09IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGNvZGVfc2VjKTsKLSAgICAgIC8qIFRoZSBkYXRhIHNlZ21lbnQgaGFkIGJldHRlciBiZSBhbGlnbmVkLiAgKi8KLSAgICAgIEJGRF9BU1NFUlQgKChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYykgJiAweGYpID09IDApOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgb2Zmc2V0IHRvIHdyaXRlIG91dCBmb3IgYSBwdWJsaWMgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJmZF92bWEKLW5sbV9hbHBoYV9nZXRfcHVibGljX29mZnNldCAoYWJmZCwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLXsKLSAgcmV0dXJuIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotfQotDAotLyogV3JpdGUgYW4gQWxwaGEgTkxNIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fYWxwaGFfd3JpdGVfZXh0ZXJuYWwgKGFiZmQsIGNvdW50LCBzeW0sIHJlbG9jcykKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCByZWxvY19hbmRfc2VjICpyZWxvY3M7Ci17Ci0gIGludCBpOwotICBiZmRfYnl0ZSBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0gIGFyZWxlbnQgcjsKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQgKyAyLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogVGhlIGZpcnN0IHR3byByZWxvY3MgZm9yIGVhY2ggZXh0ZXJuYWwgc3ltYm9sIGFyZSB0aGUgLmxpdGEKLSAgICAgYWRkcmVzcyBhbmQgdGhlIEdQIHZhbHVlLiAgKi8KLSAgci5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbl9wdHItPnN5bWJvbF9wdHJfcHRyOwotICByLmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOwotCi0gIHIuYWRkcmVzcyA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKGFiZmQpLT5saXRhX2FkZHJlc3M7Ci0gIHIuYWRkZW5kID0gbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAoYWJmZCktPmxpdGFfc2l6ZSArIDE7Ci0gIGlmIChubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwgJnIpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICByLmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChhYmZkKS0+Z3A7Ci0gIHIuYWRkZW5kID0gMDsKLSAgaWYgKG5sbV9hbHBoYV93cml0ZV9pbXBvcnQgKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCAmcikgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChubG1fYWxwaGFfd3JpdGVfaW1wb3J0IChhYmZkLCByZWxvY3NbaV0uc2VjLAotCQkJCSAgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2luY2x1ZGUgIm5sbXN3YXAuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBubG1fYmFja2VuZF9kYXRhIG5sbTMyX2FscGhhX2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBBbHBoYSBNb2R1bGUgICBcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9hbHBoYV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotICBzaXplb2YgKHN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyKSwKLSAgYmZkX2FyY2hfYWxwaGEsCi0gIDAsCi0gIHRydWUsIC8qIG5vIHVuaW5pdGlhbGl6ZWQgZGF0YSBwZXJtaXR0ZWQgYnkgQWxwaGEgTmV0V2FyZS4gICovCi0gIG5sbV9hbHBoYV9iYWNrZW5kX29iamVjdF9wLAotICBubG1fYWxwaGFfd3JpdGVfcHJlZml4LAotICBubG1fYWxwaGFfcmVhZF9yZWxvYywKLSAgbmxtX2FscGhhX21hbmdsZV9yZWxvY3MsCi0gIG5sbV9hbHBoYV9yZWFkX2ltcG9ydCwKLSAgbmxtX2FscGhhX3dyaXRlX2ltcG9ydCwKLSAgbmxtX2FscGhhX3NldF9wdWJsaWNfc2VjdGlvbiwKLSAgbmxtX2FscGhhX2dldF9wdWJsaWNfb2Zmc2V0LAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9hbHBoYV93cml0ZV9leHRlcm5hbCwKLSAgMCwJLyogd3JpdGVfZXhwb3J0ICovCi19OwotCi0jZGVmaW5lIFRBUkdFVF9MSVRUTEVfTkFNRQkJIm5sbTMyLWFscGhhIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTQkJbmxtTkFNRShhbHBoYV92ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9hbHBoYV9iYWNrZW5kCi0KLSNpbmNsdWRlICJubG0tdGFyZ2V0LmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtMzItaTM4Ni5jIGIvYmZkL25sbTMyLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2Yzc0ZC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzItaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBpMzg2IE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL2kzODYtZXh0LmgiCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtMzJfaTM4Nl9FeHRlcm5hbF9GaXhlZF9IZWFkZXIKLQotI2luY2x1ZGUgImxpYm5sbS5oIgotCi1zdGF0aWMgYm9vbGVhbiBubG1faTM4Nl9yZWFkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqLCBhc2VjdGlvbiAqKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1faTM4Nl93cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1faTM4Nl9yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2kzODZfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotCi0vKiBBZGp1c3QgdGhlIHJlbG9jIGxvY2F0aW9uIGJ5IGFuIGFic29sdXRlIHZhbHVlLiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX2kzODZfYWJzX2hvd3RvID0KLSAgSE9XVE8gKDAsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICIzMiIsCQkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKTsJCS8qIHBjcmVsX29mZnNldCAqLwotCi0vKiBBZGp1c3QgdGhlIHJlbG9jIGxvY2F0aW9uIGJ5IGEgUEMgcmVsYXRpdmUgZGlzcGxhY2VtZW50LiAgKi8KLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtX2kzODZfcGNyZWxfaG93dG8gPQotICBIT1dUTyAoMSwJCQkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkRJU1AzMiIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgdHJ1ZSk7CQkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIFJlYWQgYSBOZXRXYXJlIGkzODYgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2kzODZfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0gIGJmZF92bWEgdmFsOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0KLSAgLyogVGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIGVpdGhlciB0aGUgY29kZSBvciBkYXRhIHNlZ21lbnQuCi0gICAgIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHdoaWNoIG5lZWRzIHRvIGJlIGFkanVzdGVkLgotCi0gICAgIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGZpeHVwIHJhdGhlciB0aGFuIGFuIGltcG9ydGVkIHN5bWJvbCAodGhlCi0gICAgIHN5bSBhcmd1bWVudCBpcyBOVUxMKSB0aGVuIHRoZSBoaWdoIGJpdCBpcyAwIGlmIHRoZSBsb2NhdGlvbgotICAgICBuZWVkcyB0byBiZSBhZGp1c3RlZCBieSB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50LCBvciAxIGlmCi0gICAgIHRoZSBsb2NhdGlvbiBuZWVkcyB0byBiZSBhZGp1c3RlZCBieSB0aGUgYWRkcmVzcyBvZiB0aGUgY29kZQotICAgICBzZWdtZW50LiAgSWYgdGhpcyBpcyBhbiBpbXBvcnRlZCBzeW1ib2wsIHRoZW4gdGhlIGhpZ2ggYml0IGlzIDAKLSAgICAgaWYgdGhlIGxvY2F0aW9uIGlzIDAgaWYgdGhlIGxvY2F0aW9uIHNob3VsZCBiZSBhZGp1c3RlZCBieSB0aGUKLSAgICAgb2Zmc2V0IHRvIHRoZSBzeW1ib2wsIG9yIDEgaWYgdGhlIGxvY2F0aW9uIHNob3VsZCBhZGp1c3RlZCBieSB0aGUKLSAgICAgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4KLQotICAgICBUaGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGlzIDAgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldAotICAgICBpbnRvIHRoZSBkYXRhIHNlZ21lbnQsIG9yIDEgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZQotICAgICBjb2RlIHNlZ21lbnQuCi0KLSAgICAgQWxsIHRoaXMgdHJhbnNsYXRlcyBmYWlybHkgZWFzaWx5IGludG8gYSBCRkQgcmVsb2MuICAqLwotCi0gIGlmIChzeW0gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbCAmIE5MTV9ISUJJVCkgPT0gMCkKLQluYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgICAgIGVsc2UKLQl7Ci0JICBuYW1lID0gTkxNX0NPREVfTkFNRTsKLQkgIHZhbCAmPX4gTkxNX0hJQklUOwotCX0KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSktPnN5bWJvbF9wdHJfcHRyOwotICAgICAgcmVsLT5ob3d0byA9ICZubG1faTM4Nl9hYnNfaG93dG87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gdGhpcyBjYXNlIHdlIGRvIG5vdCBuZWVkIHRvIHNldCB0aGUgc3ltX3B0cl9wdHIgZmllbGQuICAqLwotICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IE5VTEw7Ci0gICAgICBpZiAoKHZhbCAmIE5MTV9ISUJJVCkgPT0gMCkKLQlyZWwtPmhvd3RvID0gJm5sbV9pMzg2X3BjcmVsX2hvd3RvOwotICAgICAgZWxzZQotCXsKLQkgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfYWJzX2hvd3RvOwotCSAgdmFsICY9fiBOTE1fSElCSVQ7Ci0JfQotICAgIH0KLQotICBpZiAoKHZhbCAmIChOTE1fSElCSVQgPj4gMSkpID09IDApCi0gICAgKnNlY3AgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqc2VjcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgICAgIHZhbCAmPX4gKE5MTV9ISUJJVCA+PiAxKTsKLSAgICB9Ci0KLSAgcmVsLT5hZGRyZXNzID0gdmFsOwotICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgTmV0V2FyZSBpMzg2IHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBhc3ltYm9sICpzeW07Ci0gIGJmZF92bWEgdmFsOwotICBiZmRfYnl0ZSB0ZW1wWzRdOwotCi0gIC8qIE5ldFdhcmUgb25seSBzdXBwb3J0cyB0d28ga2luZHMgb2YgcmVsb2NzLiAgV2Ugc2hvdWxkIGNoZWNrCi0gICAgIHNwZWNpYWxfZnVuY3Rpb24gaGVyZSwgYXMgd2VsbCwgYnV0IGF0IHRoZSBtb21lbnQgY29mZi1pMzg2Ci0gICAgIHJlbG9jcyB1c2VzIGEgc3BlY2lhbF9mdW5jdGlvbiB3aGljaCBkb2VzIG5vdCBhZmZlY3Qgd2hhdCB3ZSBkbwotICAgICBoZXJlLiAgKi8KLSAgaWYgKHJlbC0+YWRkZW5kICE9IDAKLSAgICAgIHx8IHJlbC0+aG93dG8gPT0gTlVMTAotICAgICAgfHwgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvLT5zaXplICE9IDIKLSAgICAgIHx8IHJlbC0+aG93dG8tPmJpdHNpemUgIT0gMzIKLSAgICAgIHx8IHJlbC0+aG93dG8tPmJpdHBvcyAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvLT5zcmNfbWFzayAhPSAweGZmZmZmZmZmCi0gICAgICB8fCByZWwtPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gIC8qIFRoZSB2YWx1ZSB3ZSB3cml0ZSBvdXQgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBhcHByb3ByaWF0ZQotICAgICBzZWdtZW50LiAgVGhpcyBvZmZzZXQgaXMgdGhlIHNlY3Rpb24gdm1hLCBhZGp1c3RlZCBieSB0aGUgdm1hIG9mCi0gICAgIHRoZSBsb3dlc3Qgc2VjdGlvbiBpbiB0aGF0IHNlZ21lbnQsIHBsdXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgIHJlbG9jYXRpb24uICAqLwotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpICsgcmVsLT5hZGRyZXNzOwotCi0gIC8qIFRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgMCBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0Ci0gICAgIGludG8gdGhlIGRhdGEgc2VnbWVudCwgb3IgMSBpZiB0aGUgdmFsdWUgaXMgYW4gb2Zmc2V0IGludG8gdGhlCi0gICAgIGNvZGUgc2VnbWVudC4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkKLSAgICB7Ci0gICAgICB2YWwgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0gICAgICB2YWwgfD0gTkxNX0hJQklUID4+IDE7Ci0gICAgfQotICBlbHNlCi0gICAgdmFsIC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICAvKiBOZXRXYXJlIG9ubHkgc3VwcG9ydHMgYWJzb2x1dGUgaW50ZXJuYWwgcmVsb2NzLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogVGhlIGhpZ2ggYml0IGlzIDEgaWYgdGhlIHJlbG9jIGlzIGFnYWluc3QgdGhlIGNvZGUgc2VjdGlvbiwgMAotCSBpZiBhZ2FpbnN0IHRoZSBkYXRhIHNlY3Rpb24uICAqLwotICAgICAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKSAmIFNFQ19DT0RFKQotCXZhbCB8PSBOTE1fSElCSVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhlIGhpZ2ggYml0IGlzIDEgaWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSByZWxvYywgMCBpZiBpdCBpcyBQQwotCSByZWxhdGl2ZS4gICovCi0gICAgICBpZiAoISByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLQl2YWwgfD0gTkxNX0hJQklUOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFBDIHJlbGF0aXZlIHJlbG9jcyBvbiBOZXRXYXJlIG11c3QgYmUgcGNyZWxfb2Zmc2V0LiAgKi8KLQkgIGlmICghIHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgdGVtcCk7Ci0gIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJIHdhbnQgdG8gYmUgYWJsZSB0byB1c2Ugb2JqY29weSB0byB0dXJuIGEgaTM4NiBhLm91dCBvciBDT0ZGIGZpbGUKLSAgIGludG8gYSBOZXRXYXJlIGkzODYgbW9kdWxlLiAgVGhhdCBtZWFucyB0aGF0IHRoZSByZWxvY3MgZnJvbSB0aGUKLSAgIHNvdXJjZSBmaWxlIGhhdmUgdG8gYmUgbWFwcGVkIGludG8gcmVsb2NzIHRoYXQgYXBwbHkgdG8gdGhlIHRhcmdldAotICAgZmlsZS4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyB0byBnaXZlCi0gICBpdCBhIGNoYW5jZSB0byByZXdvcmsgdGhlIHJlbG9jcy4KLQotICAgVGhpcyBpcyBhY3R1YWxseSBhIGZhaXJseSBnZW5lcmFsIGNvbmNlcHQuICBIb3dldmVyLCB0aGlzIGlzIG5vdCBhCi0gICBnZW5lcmFsIGltcGxlbWVudGF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGFyZWxlbnQgKipyZWxfcHRyX3B0ciwgKipyZWxfZW5kOwotCi0gIHJlbF9wdHJfcHRyID0gc2VjLT5vcmVsb2NhdGlvbjsKLSAgcmVsX2VuZCA9IHJlbF9wdHJfcHRyICsgc2VjLT5yZWxvY19jb3VudDsKLSAgZm9yICg7IHJlbF9wdHJfcHRyIDwgcmVsX2VuZDsgcmVsX3B0cl9wdHIrKykKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWw7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLQotICAgICAgcmVsID0gKnJlbF9wdHJfcHRyOwotICAgICAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0KLSAgICAgIC8qIE5vdGUgdGhhdCBubyBzZXJpb3VzIGhhcm0gd2lsbCBlbnN1ZSBpZiB3ZSBmYWlsIHRvIGNoYW5nZSBhCi0JIHJlbG9jLiAgV2Ugd2lsbCB3aW5kIHVwIGZhaWxpbmcgaW4gbmxtX2kzODZfd3JpdGVfaW1wb3J0LiAgKi8KLQotICAgICAgLyogTWFrZSBzdXJlIHRoaXMgcmVsb2MgaXMgd2l0aGluIHRoZSBkYXRhIHdlIGhhdmUuICBXZSBvbmx5IDQKLQkgYnl0ZSByZWxvY3MgaGVyZSwgc28gd2UgaW5zaXN0IG9uIGhhdmluZyA0IGJ5dGVzLiAgKi8KLSAgICAgIGlmIChyZWwtPmFkZHJlc3MgPCBvZmZzZXQKLQkgIHx8IHJlbC0+YWRkcmVzcyArIDQgPiBvZmZzZXQgKyBjb3VudCkKLQljb250aW51ZTsKLQotICAgICAgLyogTmV0V2FyZSBkb2Vzbid0IHN1cHBvcnQgcmVsb2MgYWRkZW5kcywgc28gd2UgZ2V0IHJpZCBvZiB0aGVtCi0JIGhlcmUgYnkgc2ltcGx5IGFkZGluZyB0aGVtIGludG8gdGhlIG9iamVjdCBkYXRhLiAgV2UgaGFuZGxlCi0JIHRoZSBzeW1ib2wgdmFsdWUsIGlmIGFueSwgdGhlIHNhbWUgd2F5LiAgKi8KLSAgICAgIGFkZGVuZCA9IHJlbC0+YWRkZW5kICsgc3ltLT52YWx1ZTsKLQotICAgICAgLyogVGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgc2VjdGlvbi4gIElmIHRoZQotCSBzeW1ib2wgaXMgaW4gdGhlIC5ic3Mgc2VnbWVudCwgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBzaXplIG9mCi0JIHRoZSBkYXRhIHNlZ21lbnQgaW4gdGhlIG9mZnNldCBhcyB3ZWxsLiAgRm9ydHVuYXRlbHksIHdlIGtub3cKLQkgdGhhdCBhdCB0aGlzIHBvaW50IHRoZSBzaXplIG9mIHRoZSBkYXRhIHNlY3Rpb24gaXMgaW4gdGhlIE5MTQotCSBoZWFkZXIuICAqLwotICAgICAgaWYgKCgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpCi0JICAgICYgU0VDX0xPQUQpID09IDApCi0JICAmJiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgICAmIFNFQ19BTExPQykgIT0gMCkpCi0JYWRkZW5kICs9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VTaXplOwotCi0gICAgICBpZiAoYWRkZW5kICE9IDAKLQkgICYmIHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cmlnaHRzaGlmdCA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zaXplID09IDIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHNpemUgPT0gMzIKLQkgICYmIHJlbC0+aG93dG8tPmJpdHBvcyA9PSAwCi0JICAmJiByZWwtPmhvd3RvLT5zcmNfbWFzayA9PSAweGZmZmZmZmZmCi0JICAmJiByZWwtPmhvd3RvLT5kc3RfbWFzayA9PSAweGZmZmZmZmZmKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbC0+YWRkcmVzcyAtIG9mZnNldCk7Ci0JICB2YWwgKz0gYWRkZW5kOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCAoYmZkX2J5dGUgKikgZGF0YSArIHJlbC0+YWRkcmVzcyAtIG9mZnNldCk7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotCi0gICAgICAvKiBOZXRXYXJlIHVzZXMgYSByZWxvYyB3aXRoIHBjcmVsX29mZnNldCBzZXQuICBXZSBhZGp1c3QKLQkgcGNfcmVsYXRpdmUgcmVsb2NzIGFjY29yZGluZ2x5LiAgV2UgYXJlIGdvaW5nIHRvIGNoYW5nZSB0aGUKLQkgaG93dG8gZmllbGQsIHNvIHdlIGNhbiBvbmx5IGRvIHRoaXMgaWYgdGhlIGN1cnJlbnQgb25lIGlzCi0JIGNvbXBhdGlibGUuICBXZSBzaG91bGQgY2hlY2sgc3BlY2lhbF9mdW5jdGlvbiBoZXJlLCBidXQgYXQKLQkgdGhlIG1vbWVudCBjb2ZmLWkzODYgdXNlcyBhIHNwZWNpYWxfZnVuY3Rpb24gd2hpY2ggZG9lcyBub3QKLQkgYWZmZWN0IHdoYXQgd2UgYXJlIGRvaW5nIGhlcmUuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmICEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0Ci0JICAmJiByZWwtPmhvd3RvLT5yaWdodHNoaWZ0ID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNpemUgPT0gMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0c2l6ZSA9PSAzMgotCSAgJiYgcmVsLT5ob3d0by0+Yml0cG9zID09IDAKLQkgICYmIHJlbC0+aG93dG8tPnNyY19tYXNrID09IDB4ZmZmZmZmZmYKLQkgICYmIHJlbC0+aG93dG8tPmRzdF9tYXNrID09IDB4ZmZmZmZmZmYpCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIC8qIFdoZW4gcGNyZWxfb2Zmc2V0IGlzIG5vdCBzZXQsIGl0IG1lYW5zIHRoYXQgdGhlIG5lZ2F0aXZlCi0JICAgICBvZiB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGxvY2F0aW9uIGlzIHN0b3JlZCBpbiB0aGUKLQkgICAgIG1lbW9yeSBsb2NhdGlvbi4gIFdlIG11c3QgYWRkIGl0IGJhY2sgaW4uICAqLwotCSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWwtPmFkZHJlc3MgLSBvZmZzZXQpOwotCSAgdmFsICs9IHJlbC0+YWRkcmVzczsKLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIGRhdGEgKyByZWwtPmFkZHJlc3MgLSBvZmZzZXQpOwotCi0JICByZWwtPmhvd3RvID0gJm5sbV9pMzg2X3BjcmVsX2hvd3RvOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBOZXRXYXJlIGkzODYgaW1wb3J0IHJlY29yZCAqLwotc3RhdGljIGJvb2xlYW4KLW5sbV9pMzg2X3JlYWRfaW1wb3J0IChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgc3RydWN0IG5sbV9yZWxlbnQgKm5sbV9yZWxvY3M7CS8qIHJlbG9jYXRpb24gcmVjb3JkcyBmb3Igc3ltYm9sICovCi0gIGJmZF9zaXplX3R5cGUgcmNvdW50OwkJCS8qIG51bWJlciBvZiByZWxvY3MgKi8KLSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07CS8qIHRlbXBvcmFyeSAzMi1iaXQgdmFsdWUgKi8KLSAgdW5zaWduZWQgY2hhciBzeW1sZW5ndGg7CQkvKiBsZW5ndGggb2Ygc3ltYm9sIG5hbWUgKi8KLSAgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLSAgICAgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN5bSAtPiBzeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN5bWxlbmd0aCArIDEpOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF9yZWFkIChuYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpICE9IHN5bWxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG5hbWVbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gIHN5bSAtPiBzeW1ib2wubmFtZSA9IG5hbWU7Ci0gIHN5bSAtPiBzeW1ib2wuZmxhZ3MgPSAwOwotICBzeW0gLT4gc3ltYm9sLnZhbHVlID0gMDsKLSAgc3ltIC0+IHN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmNvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCB0ZW1wKTsKLSAgbmxtX3JlbG9jcyA9ICgoc3RydWN0IG5sbV9yZWxlbnQgKikKLQkJYmZkX2FsbG9jIChhYmZkLCByY291bnQgKiBzaXplb2YgKHN0cnVjdCBubG1fcmVsZW50KSkpOwotICBpZiAoIW5sbV9yZWxvY3MpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzeW0gLT4gcmVsb2NzID0gbmxtX3JlbG9jczsKLSAgc3ltIC0+IHJjbnQgPSAwOwotICB3aGlsZSAoc3ltIC0+IHJjbnQgPCByY291bnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICAKLSAgICAgIGlmIChubG1faTM4Nl9yZWFkX3JlbG9jIChhYmZkLCBzeW0sICZzZWN0aW9uLAotCQkJICAgICAgICZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIGV4dGVybmFsIHJlZmVyZW5jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1faTM4Nl93cml0ZV9leHRlcm5hbCAoYWJmZCwgY291bnQsIHN5bSwgcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnJlbG9jczsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGJmZF9ieXRlIGxlbjsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChubG1faTM4Nl93cml0ZV9pbXBvcnQgKGFiZmQsIHJlbG9jc1tpXS5zZWMsCi0JCQkJIHJlbG9jc1tpXS5yZWwpID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9pMzg2X2JhY2tlbmQgPQotewotICAiTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVcMDMyIiwKLSAgc2l6ZW9mIChObG0zMl9pMzg2X0V4dGVybmFsX0ZpeGVkX0hlYWRlciksCi0gIDAsCS8qIG9wdGlvbmFsX3ByZWZpeF9zaXplICovCi0gIGJmZF9hcmNoX2kzODYsCi0gIDAsCi0gIGZhbHNlLAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeF9mdW5jICovCi0gIG5sbV9pMzg2X3JlYWRfcmVsb2MsCi0gIG5sbV9pMzg2X21hbmdsZV9yZWxvY3MsCi0gIG5sbV9pMzg2X3JlYWRfaW1wb3J0LAotICBubG1faTM4Nl93cml0ZV9pbXBvcnQsCi0gIDAsCS8qIHNldF9wdWJsaWNfc2VjdGlvbiAqLwotICAwLAkvKiBnZXRfcHVibGljX29mZnNldCAqLwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4sCi0gIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQsCi0gIG5sbV9pMzg2X3dyaXRlX2V4dGVybmFsLAotICAwLAkvKiB3cml0ZV9leHBvcnQgKi8KLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FCQkibmxtMzItaTM4NiIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0JCW5sbU5BTUUoaTM4Nl92ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9pMzg2X2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1wcGMuYyBiL2JmZC9ubG0zMi1wcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmMmRlOC4uMDAwMDAwMAotLS0gYS9iZmQvbmxtMzItcHBjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ1ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIDMyLWJpdCBQb3dlclBDIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0vKiBUaGUgZm9ybWF0IG9mIGEgUG93ZXJQQyBOTE0gY2hhbmdlZC4gIERlZmluZSBPTERGT1JNQVQgdG8gZ2V0IHRoZQotICAgb2xkIGZvcm1hdC4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDMyCi0KLSNpbmNsdWRlICJubG0vcHBjLWV4dC5oIgotI2RlZmluZSBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCU5sbTMyX3Bvd2VycGNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotI2lmZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfcHJlZml4Ci0gIFBBUkFNUyAoKGJmZCAqKSk7Ci0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfcmVhZF9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKiwgYXNlY3Rpb24gKiosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY19yZWFkX2ltcG9ydAotICBQQVJBTVMgKChiZmQgKiwgbmxtTkFNRShzeW1ib2xfdHlwZSkgKikpOwotCi0jaWZkZWYgT0xERk9STUFUCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY193cml0ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqLCBpbnQpKTsKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfd3JpdGVfZXh0ZXJuYWwKLSAgUEFSQU1TICgoYmZkICosIGJmZF9zaXplX3R5cGUsIGFzeW1ib2wgKiwgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikpOwotCi0jaWZuZGVmIE9MREZPUk1BVAotc3RhdGljIGJvb2xlYW4gbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqLCBubG1OQU1FKHN5bWJvbF90eXBlKSAqKSk7Ci1zdGF0aWMgYmZkX3ZtYSBubG1fcG93ZXJwY19nZXRfcHVibGljX29mZnNldAotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0jZW5kaWYKLQwKLSNpZmRlZiBPTERGT1JNQVQKLQotLyogVGhlIHByZWZpeCBoZWFkZXIgaXMgb25seSB1c2VkIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogUG93ZXJQQyBOTE0ncyBoYXZlIGEgcHJlZml4IGhlYWRlciBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTS4gIFRoaXMKLSAgIGZ1bmN0aW9uIHJlYWRzIGl0IGluLCB2ZXJpZmllcyB0aGUgdmVyc2lvbiwgYW5kIHNlZWtzIHRoZSBiZmQgdG8KLSAgIHRoZSBsb2NhdGlvbiBiZWZvcmUgdGhlIHJlZ3VsYXIgTkxNIGhlYWRlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19iYWNrZW5kX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX3ByZWZpeF9oZWFkZXIgczsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChtZW1jbXAgKHMuc2lnbmF0dXJlLCBOTE0zMl9QT1dFUlBDX1NJR05BVFVSRSwgc2l6ZW9mIHMuc2lnbmF0dXJlKSAhPSAwCi0gICAgICB8fCBiZmRfaF9nZXRfMzIgKGFiZmQsIHMuaGVhZGVyVmVyc2lvbikgIT0gTkxNMzJfUE9XRVJQQ19IRUFERVJfVkVSU0lPTikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgcHJlZml4LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX3ByZWZpeCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgbmxtMzJfcG93ZXJwY19leHRlcm5hbF9wcmVmaXhfaGVhZGVyIHM7Ci0KLSAgbWVtc2V0ICgmcywgMCwgc2l6ZW9mIHMpOwotICBtZW1jcHkgKHMuc2lnbmF0dXJlLCBOTE0zMl9QT1dFUlBDX1NJR05BVFVSRSwgc2l6ZW9mIHMuc2lnbmF0dXJlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgTkxNMzJfUE9XRVJQQ19IRUFERVJfVkVSU0lPTiwgcy5oZWFkZXJWZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgMCwgcy5vcmlnaW5zKTsKLQotICAvKiBGSVhNRTogV2hhdCBzaG91bGQgd2UgZG8gYWJvdXQgdGhlIGRhdGU/ICAqLwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZzLCBzaXplb2YgcywgMSwgYWJmZCkgIT0gc2l6ZW9mIHMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgLyogT0xERk9STUFUICovCi0MCi0jaWZuZGVmIE9MREZPUk1BVAotCi0vKiBUaGVyZSBpcyBvbmx5IG9uZSB0eXBlIG9mIHJlbG9jIGluIGEgUG93ZXJQQyBOTE0uICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1fcG93ZXJwY19ob3d0byA9Ci0gIEhPV1RPICgwLAkJCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDIsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDMyLAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiMzIiLAkJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIHNyY19tYXNrICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLyogUmVhZCBhIFBvd2VyUEMgTkxNIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgc2VjcCwgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIG5sbU5BTUUoc3ltYm9sX3R5cGUpICpzeW07Ci0gICAgIGFzZWN0aW9uICoqc2VjcDsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICBiZmRfYnl0ZSB0ZW1wWzRdOwotICBiZmRfdm1hIHZhbDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoYmZkX3JlYWQgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRlbXApOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyBhIHdvcmQgb2Zmc2V0IGludG8gZWl0aGVyIHRoZSBjb2RlIG9yIGRhdGEgc2VnbWVudC4KLSAgICAgVGhpcyBpcyB0aGUgbG9jYXRpb24gd2hpY2ggbmVlZHMgdG8gYmUgYWRqdXN0ZWQuCi0KLSAgICAgVGhlIGhpZ2ggYml0IGlzIDAgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZSBkYXRhCi0gICAgIHNlZ21lbnQsIG9yIDEgaWYgdGhlIHZhbHVlIGlzIGFuIG9mZnNldCBpbnRvIHRoZSB0ZXh0IHNlZ21lbnQuCi0KLSAgICAgSWYgdGhpcyBpcyBhIHJlbG9jYXRpb24gZml4dXAgcmF0aGVyIHRoYW4gYW4gaW1wb3J0ZWQgc3ltYm9sICh0aGUKLSAgICAgc3ltIGFyZ3VtZW50IGlzIE5VTEwpLCB0aGVuIHRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2FudCBiaXQgaXMgMAotICAgICBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IHNob3VsZCBiZSBhZGRlZCB0byB0aGUKLSAgICAgbG9jYXRpb24gYWRkcmVzc2VkIGJ5IHRoZSB2YWx1ZSwgb3IgMSBpZiB0aGUgYWRkcmVzcyBvZiB0aGUgdGV4dAotICAgICBzZWdtZW50IHNob3VsZCBiZSBhZGRlZC4KLQotICAgICBJZiB0aGlzIGlzIGFuIGltcG9ydGVkIHN5bWJvbCwgdGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcwotICAgICBub3QgdXNlZCBhbmQgbXVzdCBiZSAwLiAgKi8KLQotICBpZiAoKHZhbCAmIE5MTV9ISUJJVCkgPT0gMCkKLSAgICBuYW1lID0gTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotICAgICAgdmFsICY9fiBOTE1fSElCSVQ7Ci0gICAgfQotICAqc2VjcCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQotICBpZiAoc3ltID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCh2YWwgJiAoTkxNX0hJQklUID4+IDEpKSA9PSAwKQotCW5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOwotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotCSAgdmFsICY9fiAoTkxNX0hJQklUID4+IDEpOwotCX0KLSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSktPnN5bWJvbF9wdHJfcHRyOwotICAgIH0KLQotICByZWwtPmhvd3RvID0gJm5sbV9wb3dlcnBjX2hvd3RvOwotCi0gIHJlbC0+YWRkcmVzcyA9IHZhbCA8PCAyOwotICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbHNlIC8qIE9MREZPUk1BVCAqLwotCi0vKiBUaGlzIHJlbG9jIGhhbmRsaW5nIGlzIG9ubHkgYXBwbGljYWJsZSB0byB0aGUgb2xkIGZvcm1hdC4gICovCi0KLS8qIEhvdyB0byBwcm9jZXNzIHRoZSB2YXJpb3VzIHJlbG9jIHR5cGVzLiAgUG93ZXJQQyBOTE1zIHVzZSBYQ09GRgotICAgcmVsb2MgdHlwZXMsIGFuZCBJIGhhdmUganVzdCBjb3BpZWQgdGhlIFhDT0ZGIHJlbG9jIHRhYmxlIGhlcmUuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBubG1fcG93ZXJwY19ob3d0b190YWJsZVtdID0KLXsKLSAgLyogU3RhbmRhcmQgMzIgYml0IHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUE9TIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgcmVsb2NhdGlvbiwgYnV0IHN0b3JlIG5lZ2F0aXZlIHZhbHVlLiAgKi8KLSAgSE9XVE8gKDEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIC0yLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9ORUciLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAgICAgLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIDMyIGJpdCBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgKi8KLSAgSE9XVE8gKDIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiAxNiBiaXQgVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotICBIT1dUTyAoMywJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RPQyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRoaXMgaXMuICAqLwotICBIT1dUTyAoNCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMSwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUlRCIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIEV4dGVybmFsIFRPQyByZWxhdGl2ZSBzeW1ib2wuICAqLwotICBIT1dUTyAoNSwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfR0wiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBMb2NhbCBUT0MgcmVsYXRpdmUgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKDYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RDTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgeyA3IH0sCi0gIAotICAvKiBOb24gbW9kaWZpYWJsZSBhYnNvbHV0ZSBicmFuY2guICAqLwotICBIT1dUTyAoOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMjYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfQkEiLCAgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4M2ZmZmZmYywgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDkgfSwKLQotICAvKiBOb24gbW9kaWZpYWJsZSByZWxhdGl2ZSBicmFuY2guICAqLwotICBIT1dUTyAoMHhhLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAyNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9CUiIsICAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHgzZmZmZmZjLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHhiIH0sCi0KLSAgLyogSW5kaXJlY3QgbG9hZC4gICovCi0gIEhPV1RPICgweGMsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JMIiwgICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTG9hZCBhZGRyZXNzLiAgKi8KLSAgSE9XVE8gKDB4ZCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkxBIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICB7IDB4ZSB9LAotICAKLSAgLyogTm9uLXJlbG9jYXRpbmcgcmVmZXJlbmNlLiAgKi8KLSAgSE9XVE8gKDB4ZiwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMzIsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkVGIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsICAgICAJICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIHsgMHgxMCB9LAotICB7IDB4MTEgfSwKLSAgCi0gIC8qIFRPQyByZWxhdGl2ZSBpbmRpcmVjdCBsb2FkLiAgKi8KLSAgSE9XVE8gKDB4MTIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1RSTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogVE9DIHJlbGF0aXZlIGxvYWQgYWRkcmVzcy4gICovCi0gIEhPV1RPICgweDEzLAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9UUkxBIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgcmVsYXRpdmUgYnJhbmNoLiAgKi8KLSAgSE9XVE8gKDB4MTQsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDEsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JSVEJJIiwgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGFic29sdXRlIGJyYW5jaC4gICovCi0gIEhPV1RPICgweDE1LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAxLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAzMiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SUlRCQSIsICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZmZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBjYWxsIGFic29sdXRlIGluZGlyZWN0LiAgKi8KLSAgSE9XVE8gKDB4MTYsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX0NBSSIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBjYWxsIHJlbGF0aXZlLiAgKi8KLSAgSE9XVE8gKDB4MTcsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSksICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotICAKLSAgLyogTW9kaWZpYWJsZSBicmFuY2ggYWJzb2x1dGUuICAqLwotICBIT1dUTyAoMHgxOCwJICAgICAgICAgICAgICAgIC8qIHR5cGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIHJpZ2h0c2hpZnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMiwJICAgICAgICAgICAgICAgIC8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLyAKLQkgMTYsCSAgICAgICAgICAgICAgICAvKiBiaXRzaXplICovICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSwJICAgICAgICAgICAgICAgIC8qIHBjX3JlbGF0aXZlICovICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMCwJICAgICAgICAgICAgICAgIC8qIGJpdHBvcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIDAsCQkgICAgICAgIC8qIHNwZWNpYWxfZnVuY3Rpb24gKi8gICAgICAgICAgICAgICAgICAgICAKLQkgIlJfUkJBIiwgICAgICAgICAgICAgICAvKiBuYW1lICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIHRydWUsCSAgICAgICAgICAgICAgICAvKiBwYXJ0aWFsX2lucGxhY2UgKi8gICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwJICAgICAgICAvKiBzcmNfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDB4ZmZmZiwgICAgICAgIAkvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKSwgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0gIAotICAvKiBNb2RpZmlhYmxlIGJyYW5jaCBhYnNvbHV0ZS4gICovCi0gIEhPV1RPICgweDE5LAkgICAgICAgICAgICAgICAgLyogdHlwZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogcmlnaHRzaGlmdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAyLAkgICAgICAgICAgICAgICAgLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovIAotCSAxNiwJICAgICAgICAgICAgICAgIC8qIGJpdHNpemUgKi8gICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlLAkgICAgICAgICAgICAgICAgLyogcGNfcmVsYXRpdmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAwLAkgICAgICAgICAgICAgICAgLyogYml0cG9zICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SQkFDIiwgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIHJlbGF0aXZlLiAgKi8KLSAgSE9XVE8gKDB4MWEsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDI2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCSAgICAgICAgLyogc3BlY2lhbF9mdW5jdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgIAotCSAiUl9SRUwiLCAgICAgICAgICAgICAgIC8qIG5hbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgdHJ1ZSwJICAgICAgICAgICAgICAgIC8qIHBhcnRpYWxfaW5wbGFjZSAqLyAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLAkgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmLCAgICAgICAgCS8qIGRzdF9tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UpLCAgICAgICAgICAgICAgICAvKiBwY3JlbF9vZmZzZXQgKi8KLSAgCi0gIC8qIE1vZGlmaWFibGUgYnJhbmNoIGFic29sdXRlLiAgKi8KLSAgSE9XVE8gKDB4MWIsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDE2LAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1JFTCIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsCSAgICAgICAgLyogc3JjX21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmYsICAgICAgICAJLyogZHN0X21hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSBmYWxzZSkgICAgICAgICAgICAgICAgIC8qIHBjcmVsX29mZnNldCAqLwotfTsKLQotI2RlZmluZSBIT1dUT19DT1VOVCAoc2l6ZW9mIG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlCQlcCi0JCSAgICAgLyBzaXplb2YgbmxtX3Bvd2VycGNfaG93dG9fdGFibGVbMF0pCi0KLS8qIFJlYWQgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY19yZWFkX3JlbG9jIChhYmZkLCBzeW0sIHNlY3AsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotICAgICBhc2VjdGlvbiAqKnNlY3A7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcmVsb2MgZXh0OwotICBiZmRfdm1hIGxfdmFkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbF9zeW1uZHg7Ci0gIGludCBsX3J0eXBlOwotICBpbnQgbF9yc2Vjbm07Ci0gIGFzZWN0aW9uICpjb2RlX3NlYywgKmRhdGFfc2VjLCAqYnNzX3NlYzsKLQotICAvKiBSZWFkIHRoZSByZWxvYyBmcm9tIHRoZSBmaWxlLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgmZXh0LCBzaXplb2YgZXh0LCAxLCBhYmZkKSAhPSBzaXplb2YgZXh0KQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTd2FwIGluIHRoZSBmaWVsZHMuICAqLwotICBsX3ZhZGRyID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQubF92YWRkcik7Ci0gIGxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleHQubF9zeW1uZHgpOwotICBsX3J0eXBlID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQubF9ydHlwZSk7Ci0gIGxfcnNlY25tID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBleHQubF9yc2Vjbm0pOwotCi0gIC8qIEdldCB0aGUgc2VjdGlvbnMgbm93LCBmb3IgY29udmVuaWVuY2UuICAqLwotICBjb2RlX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQotICAvKiBXb3JrIG91dCB0aGUgYXJlbGVudCBmaWVsZHMuICAqLwotICBpZiAoc3ltICE9IE5VTEwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhbiBpbXBvcnQuICBzeW1fcHRyX3B0ciBpcyBmaWxsZWQgaW4gYnkKLQkgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYy4gICovCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBpZiAobF9zeW1uZHggPT0gMCkKLQlzZWMgPSBjb2RlX3NlYzsKLSAgICAgIGVsc2UgaWYgKGxfc3ltbmR4ID09IDEpCi0Jc2VjID0gZGF0YV9zZWM7Ci0gICAgICBlbHNlIGlmIChsX3N5bW5keCA9PSAyKQotCXNlYyA9IGJzc19zZWM7Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZWwtPnN5bV9wdHJfcHRyID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLSAgICB9Ci0KLSAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIEJGRF9BU1NFUlQgKChsX3J0eXBlICYgMHhmZikgPCBIT1dUT19DT1VOVCk7Ci0KLSAgcmVsLT5ob3d0byA9IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlICsgKGxfcnR5cGUgJiAweGZmKTsKLQotICBCRkRfQVNTRVJUIChyZWwtPmhvd3RvLT5uYW1lICE9IE5VTEwKLQkgICAgICAmJiAoKGxfcnR5cGUgJiAweDgwMDApICE9IDAKLQkJICA/IChyZWwtPmhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdwotCQkgICAgID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLQkJICA6IChyZWwtPmhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdwotCQkgICAgID09IGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkKSkKLQkgICAgICAmJiAoKGxfcnR5cGUgPj4gOCkgJiAweDFmKSA9PSByZWwtPmhvd3RvLT5iaXRzaXplIC0gMSk7Ci0KLSAgaWYgKGxfcnNlY25tID09IDApCi0gICAgKnNlY3AgPSBjb2RlX3NlYzsKLSAgZWxzZSBpZiAobF9yc2Vjbm0gPT0gMSkKLSAgICB7Ci0gICAgICAqc2VjcCA9IGRhdGFfc2VjOwotICAgICAgbF92YWRkciAtPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJlbC0+YWRkcmVzcyA9IGxfdmFkZHI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogTWFuZ2xlIFBvd2VyUEMgTkxNIHJlbG9jcyBmb3Igb3V0cHV0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YTsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgUG93ZXJQQyBOTE0gaW1wb3J0IHJlY29yZCAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBzeW0gLT4gc3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICBuYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfcmVhZCAobmFtZSwgc3ltbGVuZ3RoLCAxLCBhYmZkKSAhPSBzeW1sZW5ndGgpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5hbWVbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gIHN5bSAtPiBzeW1ib2wubmFtZSA9IG5hbWU7Ci0gIHN5bSAtPiBzeW1ib2wuZmxhZ3MgPSAwOwotICBzeW0gLT4gc3ltYm9sLnZhbHVlID0gMDsKLSAgc3ltIC0+IHN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotICByY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHRlbXApOwotICBubG1fcmVsb2NzID0gKChzdHJ1Y3QgbmxtX3JlbGVudCAqKQotCQliZmRfYWxsb2MgKGFiZmQsIHJjb3VudCAqIHNpemVvZiAoc3RydWN0IG5sbV9yZWxlbnQpKSk7Ci0gIGlmIChubG1fcmVsb2NzID09IChzdHJ1Y3QgbmxtX3JlbGVudCAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX3Bvd2VycGNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCAmc2VjdGlvbiwKLQkJCQkgICZubG1fcmVsb2NzIC0+IHJlbG9jKQotCSAgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmxtX3JlbG9jcyAtPiBzZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5sbV9yZWxvY3MrKzsKLSAgICAgIHN5bSAtPiByY250Kys7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2lmbmRlZiBPTERGT1JNQVQKLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHNlYywgcmVsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKnJlbDsKLXsKLSAgYXN5bWJvbCAqc3ltOwotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgdGVtcFs0XTsKLQotICAvKiBQb3dlclBDIE5ldFdhcmUgb25seSBzdXBwb3J0cyBvbmUga2luZCBvZiByZWxvYy4gICovCi0gIGlmIChyZWwtPmFkZGVuZCAhPSAwCi0gICAgICB8fCByZWwtPmhvd3RvID09IE5VTEwKLSAgICAgIHx8IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+c2l6ZSAhPSAyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRzaXplICE9IDMyCi0gICAgICB8fCByZWwtPmhvd3RvLT5iaXRwb3MgIT0gMAotICAgICAgfHwgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLSAgICAgIHx8IChyZWwtPmhvd3RvLT5zcmNfbWFzayAhPSAweGZmZmZmZmZmICYmIHJlbC0+YWRkZW5kICE9IDApCi0gICAgICB8fCByZWwtPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gIC8qIFRoZSB2YWx1ZSB3ZSB3cml0ZSBvdXQgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBhcHByb3ByaWF0ZQotICAgICBzZWdtZW50LCByaWdodHNoaWZ0ZWQgYnkgdHdvLiAgVGhpcyBvZmZzZXQgaXMgdGhlIHNlY3Rpb24gdm1hLAotICAgICBhZGp1c3RlZCBieSB0aGUgdm1hIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBpbiB0aGF0IHNlZ21lbnQsIHBsdXMKLSAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24uICAqLwotICB2YWwgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpICsgcmVsLT5hZGRyZXNzOwotICBpZiAoKHZhbCAmIDMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB2YWwgPj49IDI7Ci0KLSAgLyogVGhlIGhpZ2ggYml0IGlzIDAgaWYgdGhlIHJlbG9jIGlzIGluIHRoZSBkYXRhIHNlY3Rpb24sIG9yIDEgaWYKLSAgICAgdGhlIHJlbG9jIGlzIGluIHRoZSBjb2RlIHNlY3Rpb24uICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0RBVEEpCi0gICAgdmFsIC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotICBlbHNlCi0gICAgewotICAgICAgdmFsIC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICAgICAgdmFsIHw9IE5MTV9ISUJJVDsKLSAgICB9Ci0gICAgCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIGludGVybmFsIHJlbG9jYXRpb24gZml4dXAuICBUaGUgc2Vjb25kIG1vc3QKLQkgc2lnbmlmaWNhbnQgYml0IGlzIDAgaWYgdGhpcyBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIGRhdGEKLQkgc2VnbWVudCwgb3IgMSBpZiBpdCBpcyBhIHJlbG9jIGFnYWluc3QgdGhlIHRleHQgc2VnbWVudC4gICovCi0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpICYgU0VDX0NPREUpCi0JdmFsIHw9IE5MTV9ISUJJVCA+PiAxOwotICAgIH0KLQotICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2Vsc2UgLyogT0xERk9STUFUICovCi0KLS8qIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHJlbG9jIGhhbmRsaW5nIGluIHRoZSBvbGQgZm9ybWF0LiAgKi8KLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fcG93ZXJwY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwsIGluZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotICAgICBpbnQgaW5keDsKLXsKLSAgc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcmVsb2MgZXh0OwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYywgKmJzc19zZWM7Ci0gIGFzeW1ib2wgKnN5bTsKLSAgYXNlY3Rpb24gKnN5bXNlYzsKLSAgdW5zaWduZWQgbG9uZyBsX3N5bW5keDsKLSAgaW50IGxfcnR5cGU7Ci0gIGludCBsX3JzZWNubTsKLSAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gIGJmZF9zaXplX3R5cGUgYWRkcmVzczsKLQotICAvKiBHZXQgdGhlIHNlY3Rpb25zIG5vdywgZm9yIGNvbnZlbmllbmNlLiAgKi8KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0KLSAgc3ltID0gKnJlbC0+c3ltX3B0cl9wdHI7Ci0gIHN5bXNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLSAgaWYgKGluZHggIT0gLTEpCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW1zZWMpKTsKLSAgICAgIGxfc3ltbmR4ID0gaW5keCArIDM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHN5bXNlYyA9PSBjb2RlX3NlYykKLQlsX3N5bW5keCA9IDA7Ci0gICAgICBlbHNlIGlmIChzeW1zZWMgPT0gZGF0YV9zZWMpCi0JbF9zeW1uZHggPSAxOwotICAgICAgZWxzZSBpZiAoc3ltc2VjID09IGJzc19zZWMpCi0JbF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgbF9zeW1uZHgsIGV4dC5sX3N5bW5keCk7Ci0KLSAgZm9yIChob3d0byA9IG5sbV9wb3dlcnBjX2hvd3RvX3RhYmxlOwotICAgICAgIGhvd3RvIDwgbmxtX3Bvd2VycGNfaG93dG9fdGFibGUgKyBIT1dUT19DT1VOVDsKLSAgICAgICBob3d0bysrKQotICAgIHsKLSAgICAgIGlmIChob3d0by0+cmlnaHRzaGlmdCA9PSByZWwtPmhvd3RvLT5yaWdodHNoaWZ0Ci0JICAmJiBob3d0by0+c2l6ZSA9PSByZWwtPmhvd3RvLT5zaXplCi0JICAmJiBob3d0by0+Yml0c2l6ZSA9PSByZWwtPmhvd3RvLT5iaXRzaXplCi0JICAmJiBob3d0by0+cGNfcmVsYXRpdmUgPT0gcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmIGhvd3RvLT5iaXRwb3MgPT0gcmVsLT5ob3d0by0+Yml0cG9zCi0JICAmJiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSByZWwtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkgICAgICB8fCAoISByZWwtPmhvd3RvLT5wYXJ0aWFsX2lucGxhY2UKLQkJICAmJiByZWwtPmFkZGVuZCA9PSAwKSkKLQkgICYmIChob3d0by0+c3JjX21hc2sgPT0gcmVsLT5ob3d0by0+c3JjX21hc2sKLQkgICAgICB8fCAocmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMAotCQkgICYmIHJlbC0+YWRkZW5kID09IDApKQotCSAgJiYgaG93dG8tPmRzdF9tYXNrID09IHJlbC0+aG93dG8tPmRzdF9tYXNrCi0JICAmJiBob3d0by0+cGNyZWxfb2Zmc2V0ID09IHJlbC0+aG93dG8tPnBjcmVsX29mZnNldCkKLQlicmVhazsKLSAgICB9Ci0gIGlmIChob3d0byA+PSBubG1fcG93ZXJwY19ob3d0b190YWJsZSArIEhPV1RPX0NPVU5UKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBsX3J0eXBlID0gaG93dG8tPnR5cGU7Ci0gIGlmIChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3cgPT0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkKQotICAgIGxfcnR5cGUgfD0gMHg4MDAwOwotICBsX3J0eXBlIHw9IChob3d0by0+Yml0c2l6ZSAtIDEpIDw8IDg7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIGxfcnR5cGUsIGV4dC5sX3J0eXBlKTsKLQotICBhZGRyZXNzID0gcmVsLT5hZGRyZXNzOwotCi0gIGlmIChzZWMgPT0gY29kZV9zZWMpCi0gICAgbF9yc2Vjbm0gPSAwOwotICBlbHNlIGlmIChzZWMgPT0gZGF0YV9zZWMpCi0gICAgewotICAgICAgbF9yc2Vjbm0gPSAxOwotICAgICAgYWRkcmVzcyArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlX3NlYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIGxfcnNlY25tLCBleHQubF9yc2Vjbm0pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBhZGRyZXNzLCBleHQubF92YWRkcik7Ci0KLSAgaWYgKGJmZF93cml0ZSAoJmV4dCwgc2l6ZW9mIGV4dCwgMSwgYWJmZCkgIT0gc2l6ZW9mIGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgUG93ZXJQQyBOTE0gaW1wb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX2ltcG9ydCAoYWJmZCwgc2VjLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqcmVsOwotewotICByZXR1cm4gbmxtX3Bvd2VycGNfd3JpdGVfcmVsb2MgKGFiZmQsIHNlYywgcmVsLCAtMSk7Ci19Ci0KLSNlbmRpZiAvKiBPTERGT1JNQVQgKi8KLQotLyogV3JpdGUgYSBQb3dlclBDIE5MTSBleHRlcm5hbCBzeW1ib2wuICBUaGlzIHJvdXRpbmUga2VlcHMgYSBzdGF0aWMKLSAgIGNvdW50IG9mIHRoZSBzeW1ib2wgaW5kZXguICBGSVhNRTogSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgIG5lY2Vzc2FyeSwgYW5kIHRoZSBpbmRleCBuZXZlciBnZXRzIHJlc2V0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9wb3dlcnBjX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotI2lmZGVmIE9MREZPUk1BVAotICBzdGF0aWMgaW50IGluZHg7Ci0jZW5kaWYKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgY291bnQsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCBzaXplb2YodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSNpZm5kZWYgT0xERk9STUFUCi0gICAgICBpZiAoISBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQgKGFiZmQsIHJlbG9jc1tpXS5zZWMsIHJlbG9jc1tpXS5yZWwpKQotCXJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgICBpZiAoISBubG1fcG93ZXJwY193cml0ZV9yZWxvYyAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgICAgIHJlbG9jc1tpXS5yZWwsIGluZHgpKQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotICAgIH0KLQotI2lmZGVmIE9MREZPUk1BVAotICArK2luZHg7Ci0jZW5kaWYKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLSNpZm5kZWYgT0xERk9STUFUCi0KLS8qIFBvd2VyUEMgTmV0d2FyZSB1c2VzIGEgd29yZCBvZmZzZXQsIG5vdCBhIGJ5dGUgb2Zmc2V0LCBmb3IgcHVibGljCi0gICBzeW1ib2xzLiAgKi8KLQotLyogU2V0IHRoZSBzZWN0aW9uIGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3Bvd2VycGNfc2V0X3B1YmxpY19zZWN0aW9uIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLXsKLSAgaWYgKHN5bS0+c3ltYm9sLnZhbHVlICYgTkxNX0hJQklUKQotICAgIHsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH5OTE1fSElCSVQ7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICAgIH0KLQotICBzeW0tPnN5bWJvbC52YWx1ZSA8PD0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBvZmZzZXQgdG8gd3JpdGUgb3V0IGZvciBhIHB1YmxpYyBzeW1ib2wuICAqLwotCi1zdGF0aWMgYmZkX3ZtYQotbmxtX3Bvd2VycGNfZ2V0X3B1YmxpY19vZmZzZXQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGJmZF92bWEgb2Zmc2V0OwotICBhc2VjdGlvbiAqc2VjOwotCi0gIG9mZnNldCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotICBzZWMgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSk7Ci0gIGlmIChzZWMtPmZsYWdzICYgU0VDX0NPREUpCi0gICAgewotICAgICAgb2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICAgICAgb2Zmc2V0IHw9IE5MTV9ISUJJVDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlYy0+ZmxhZ3MgJiAoU0VDX0RBVEEgfCBTRUNfQUxMT0MpKQotICAgIHsKLSAgICAgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCi0gICAgICBvZmZzZXQgLT0gbmxtX2dldF9kYXRhX2xvdyAoYWJmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgY2FuJ3QgaGFuZGxlIGFuIGV4cG9ydGVkIHN5bWJvbCB0aGF0IGlzIG5vdCBpbiB0aGUgY29kZSBvcgotCSBkYXRhIHNlZ21lbnQuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIC8qIEZJWE1FOiBObyB3YXkgdG8gcmV0dXJuIGVycm9yLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0OwotfQotCi0jZW5kaWYgLyogISBkZWZpbmVkIChPTERGT1JNQVQpICovCi0MCi0jaW5jbHVkZSAibmxtc3dhcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sbV9iYWNrZW5kX2RhdGEgbmxtMzJfcG93ZXJwY19iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgUG93ZXJQQyBNb2R1bGUgXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfcG93ZXJwY19FeHRlcm5hbF9GaXhlZF9IZWFkZXIpLAotI2lmbmRlZiBPTERGT1JNQVQKLSAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KLSNlbHNlCi0gIHNpemVvZiAoc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlciksCi0jZW5kaWYKLSAgYmZkX2FyY2hfcG93ZXJwYywKLSAgMCwKLSAgZmFsc2UsCi0jaWZuZGVmIE9MREZPUk1BVAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeCAqLwotI2Vsc2UKLSAgbmxtX3Bvd2VycGNfYmFja2VuZF9vYmplY3RfcCwKLSAgbmxtX3Bvd2VycGNfd3JpdGVfcHJlZml4LAotI2VuZGlmCi0gIG5sbV9wb3dlcnBjX3JlYWRfcmVsb2MsCi0gIG5sbV9wb3dlcnBjX21hbmdsZV9yZWxvY3MsCi0gIG5sbV9wb3dlcnBjX3JlYWRfaW1wb3J0LAotICBubG1fcG93ZXJwY193cml0ZV9pbXBvcnQsCi0jaWZuZGVmIE9MREZPUk1BVAotICBubG1fcG93ZXJwY19zZXRfcHVibGljX3NlY3Rpb24sCi0gIG5sbV9wb3dlcnBjX2dldF9wdWJsaWNfb2Zmc2V0LAotI2Vsc2UKLSAgMCwJLyogc2V0X3B1YmxpY19zZWN0aW9uICovCi0gIDAsCS8qIGdldF9wdWJsaWNfb2Zmc2V0ICovCi0jZW5kaWYKLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1fcG93ZXJwY193cml0ZV9leHRlcm5hbCwKLSAgMCwJLyogd3JpdGVfZXhwb3J0ICovCi19OwotCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRQkJCSJubG0zMi1wb3dlcnBjIgotI2RlZmluZSBUQVJHRVRfQklHX1NZTQkJCW5sbU5BTUUocG93ZXJwY192ZWMpCi0jZGVmaW5lIFRBUkdFVF9CQUNLRU5EX0RBVEEJCSZubG0zMl9wb3dlcnBjX2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi1zcGFyYy5jIGIvYmZkL25sbTMyLXNwYXJjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjNhZGIuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyogU3VwcG9ydCBmb3IgMzItYml0IFNQQVJDIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgotCi0jaW5jbHVkZSAibmxtL3NwYXJjMzItZXh0LmgiCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIJTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyCi0KLSNpbmNsdWRlICJsaWJubG0uaCIKLQotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3JlYWRfcmVsb2MKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICosIGFzZWN0aW9uICoqLCBhcmVsZW50ICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9yZWxvYwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBiZmRfdm1hLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3BhcmNfcmVhZF9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIG5sbU5BTUUoc3ltYm9sX3R5cGUpICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zcGFyY193cml0ZV9pbXBvcnQKLSAgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmRfc2l6ZV90eXBlLCBhc3ltYm9sICosIHN0cnVjdCByZWxvY19hbmRfc2VjICopKTsKLQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSX1NQQVJDX05PTkUgPSAwLAotICAgIFJfU1BBUkNfOCwJCVJfU1BBUkNfMTYsCQlSX1NQQVJDXzMyLCAKLSAgICBSX1NQQVJDX0RJU1A4LAlSX1NQQVJDX0RJU1AxNiwJCVJfU1BBUkNfRElTUDMyLCAKLSAgICBSX1NQQVJDX1dESVNQMzAsCVJfU1BBUkNfV0RJU1AyMiwKLSAgICBSX1NQQVJDX0hJMjIsCVJfU1BBUkNfMjIsCi0gICAgUl9TUEFSQ18xMywJCVJfU1BBUkNfTE8xMCwKLSAgICBSX1NQQVJDX0dPVDEwLAlSX1NQQVJDX0dPVDEzLAkJUl9TUEFSQ19HT1QyMiwKLSAgICBSX1NQQVJDX1BDMTAsCVJfU1BBUkNfUEMyMiwKLSAgICBSX1NQQVJDX1dQTFQzMCwKLSAgICBSX1NQQVJDX0NPUFksCi0gICAgUl9TUEFSQ19HTE9CX0RBVCwJUl9TUEFSQ19KTVBfU0xPVCwKLSAgICBSX1NQQVJDX1JFTEFUSVZFLAotICAgIFJfU1BBUkNfVUEzMiwKLSAgICBSX1NQQVJDX21heAotICB9OwotCi0jaWYgMAotc3RhdGljIENPTlNUIGNoYXIgKkNPTlNUIHJlbG9jX3R5cGVfbmFtZXNbXSA9Ci17Ci0gICJSX1NQQVJDX05PTkUiLAotICAiUl9TUEFSQ184IiwJCSJSX1NQQVJDXzE2IiwJCSJSX1NQQVJDXzMyIiwKLSAgIlJfU1BBUkNfRElTUDgiLAkiUl9TUEFSQ19ESVNQMTYiLAkiUl9TUEFSQ19ESVNQMzIiLAotICAiUl9TUEFSQ19XRElTUDMwIiwJIlJfU1BBUkNfV0RJU1AyMiIsCi0gICJSX1NQQVJDX0hJMjIiLAkiUl9TUEFSQ18yMiIsCi0gICJSX1NQQVJDXzEzIiwJCSJSX1NQQVJDX0xPMTAiLAotICAiUl9TUEFSQ19HT1QxMCIsCSJSX1NQQVJDX0dPVDEzIiwJIlJfU1BBUkNfR09UMjIiLAotICAiUl9TUEFSQ19QQzEwIiwJIlJfU1BBUkNfUEMyMiIsCi0gICJSX1NQQVJDX1dQTFQzMCIsCi0gICJSX1NQQVJDX0NPUFkiLAotICAiUl9TUEFSQ19HTE9CX0RBVCIsCSJSX1NQQVJDX0pNUF9TTE9UIiwKLSAgIlJfU1BBUkNfUkVMQVRJVkUiLAotICAiUl9TUEFSQ19VQTMyIiwKLX07Ci0jZW5kaWYKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbXSA9IAotewotICBIT1dUTyhSX1NQQVJDX05PTkUsICAgIDAsMCwgMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfTk9ORSIsICAgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ184LCAgICAgICAwLDAsIDgsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzgiLCAgICAgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTYsICAgICAgMCwxLDE2LGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18xNiIsICAgICAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDXzMyLCAgICAgIDAsMiwzMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfMzIiLCAgICAgIGZhbHNlLDAsMHhmZmZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19ESVNQOCwgICAwLDAsIDgsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX0RJU1A4IiwgICBmYWxzZSwwLDB4MDAwMDAwZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfRElTUDE2LCAgMCwxLDE2LHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19ESVNQMTYiLCAgZmFsc2UsMCwweDAwMDBmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0RJU1AzMiwgIDAsMiwzMix0cnVlLCAwLGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIlJfU1BBUkNfRElTUDMyIiwgIGZhbHNlLDAsMHgwMGZmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19XRElTUDMwLCAyLDIsMzAsdHJ1ZSwgMCxjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJSX1NQQVJDX1dESVNQMzAiLCBmYWxzZSwwLDB4M2ZmZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfV0RJU1AyMiwgMiwyLDIyLHRydWUsIDAsY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiUl9TUEFSQ19XRElTUDIyIiwgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0hJMjIsICAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfSEkyMiIsICAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ18yMiwgICAgICAwLDIsMjIsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDXzIyIiwgICAgICBmYWxzZSwwLDB4MDAzZmZmZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfMTMsICAgICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ18xMyIsICAgICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0xPMTAsICAgIDAsMiwxMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfTE8xMCIsICAgIGZhbHNlLDAsMHgwMDAwMDNmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19HT1QxMCwgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX0dPVDEwIiwgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR09UMTMsICAgMCwyLDEzLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19HT1QxMyIsICAgZmFsc2UsMCwweDAwMDAxZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0dPVDIyLCAgMTAsMiwyMixmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLDAsIlJfU1BBUkNfR09UMjIiLCAgIGZhbHNlLDAsMHgwMDNmZmZmZix0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19QQzEwLCAgICAwLDIsMTAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJSX1NQQVJDX1BDMTAiLCAgICBmYWxzZSwwLDB4MDAwMDAzZmYsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfUEMyMiwgICAgMCwyLDIyLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiUl9TUEFSQ19QQzIyIiwgICAgZmFsc2UsMCwweDAwM2ZmZmZmLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX1dQTFQzMCwgIDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfV1BMVDMwIiwgIGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19DT1BZLCAgICAwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX0NPUFkiLCAgICBmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfR0xPQl9EQVQsMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19HTE9CX0RBVCIsZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotICBIT1dUTyhSX1NQQVJDX0pNUF9TTE9ULDAsMCwwMCxmYWxzZSwwLGNvbXBsYWluX292ZXJmbG93X2RvbnQsICAgIDAsIlJfU1BBUkNfSk1QX1NMT1QiLGZhbHNlLDAsMHgwMDAwMDAwMCx0cnVlKSwKLSAgSE9XVE8oUl9TUEFSQ19SRUxBVElWRSwwLDAsMDAsZmFsc2UsMCxjb21wbGFpbl9vdmVyZmxvd19kb250LCAgICAwLCJSX1NQQVJDX1JFTEFUSVZFIixmYWxzZSwwLDB4MDAwMDAwMDAsdHJ1ZSksCi0gIEhPV1RPKFJfU1BBUkNfVUEzMiwgICAgMCwwLDAwLGZhbHNlLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgICAgMCwiUl9TUEFSQ19VQTMyIiwgICAgZmFsc2UsMCwweDAwMDAwMDAwLHRydWUpLAotfTsKLQotLyogUmVhZCBhIE5ldFdhcmUgc3BhcmMgcmVsb2MuICAqLwotCi1zdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHsKLSAgdW5zaWduZWQgY2hhciBvZmZzZXRbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYWRkZW5kWzRdOwotICB1bnNpZ25lZCBjaGFyIHR5cGVbMV07Ci0gIHVuc2lnbmVkIGNoYXIgcGFkMVszXTsKLX07Ci0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfcmVhZF9yZWxvYyAoYWJmZCwgc3ltLCBzZWNwLCByZWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgbmxtTkFNRShzeW1ib2xfdHlwZSkgKnN5bTsKLSAgICAgYXNlY3Rpb24gKipzZWNwOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF92bWEgdmFsLCBhZGRlbmQ7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIHN0cnVjdCBubG0zMl9zcGFyY19yZWxvY19leHQgdG1wX3JlbG9jOwotICBhc2VjdGlvbiAqY29kZV9zZWMsICpkYXRhX3NlYzsKLQotICBpZiAoYmZkX3JlYWQgKCZ0bXBfcmVsb2MsIDEyLCAxLCBhYmZkKSAhPSAxMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY29kZV9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0gIGRhdGFfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCi0gICpzZWNwID0gY29kZV9zZWM7Ci0KLSAgdmFsID0gYmZkX2dldF8zMiAoYWJmZCwgdG1wX3JlbG9jLm9mZnNldCk7Ci0gIGFkZGVuZCA9IGJmZF9nZXRfMzIgKGFiZmQsIHRtcF9yZWxvYy5hZGRlbmQpOwotICB0eXBlID0gYmZkX2dldF84IChhYmZkLCB0bXBfcmVsb2MudHlwZSk7Ci0KLSAgcmVsLT5hZGRyZXNzID0gdmFsOwotICByZWwtPmFkZGVuZCA9IGFkZGVuZDsKLSAgcmVsLT5ob3d0byA9IE5VTEw7Ci0KLSAgZm9yIChpbmRleCA9IDA7Ci0gICAgICAgaW5kZXggPCBzaXplb2YobmxtMzJfc3BhcmNfaG93dG9fdGFibGUpIC8gc2l6ZW9mKHJlbG9jX2hvd3RvX3R5cGUpOwotICAgICAgIGluZGV4KyspCi0gICAgaWYgKG5sbTMyX3NwYXJjX2hvd3RvX3RhYmxlW2luZGV4XS50eXBlID09IHR5cGUpIHsKLSAgICAgIHJlbC0+aG93dG8gPSAmbmxtMzJfc3BhcmNfaG93dG9fdGFibGVbaW5kZXhdOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICBhZGRyZXNzID0gJTA4bHgsIGFkZGVuZCA9ICUwOGx4LCB0eXBlID0gJWQsIGhvd3RvID0gJTA4bHhcbiIsCi0JICAgX19GVU5DVElPTl9fLCByZWwtPmFkZHJlc3MsIHJlbC0+YWRkZW5kLCB0eXBlLCByZWwtPmhvd3RvKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLQotfQotCi0vKiBXcml0ZSBhIE5ldFdhcmUgc3BhcmMgcmVsb2MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX3JlbG9jIChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGJmZF92bWEgdmFsOwotICBzdHJ1Y3QgbmxtMzJfc3BhcmNfcmVsb2NfZXh0IHRtcF9yZWxvYzsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBpbnQgdHlwZSA9IC0xOwotICByZWxvY19ob3d0b190eXBlICp0bXA7Ci0KLSAgCi0gIGZvciAoaW5kZXggPSAwOwotICAgICAgIGluZGV4IDwgc2l6ZW9mIChubG0zMl9zcGFyY19ob3d0b190YWJsZSkgLyBzaXplb2YocmVsb2NfaG93dG9fdHlwZSk7Ci0gICAgICAgaW5kZXgrKykgewotICAgIHRtcCA9ICZubG0zMl9zcGFyY19ob3d0b190YWJsZVtpbmRleF07Ci0KLSAgICBpZiAodG1wLT5yaWdodHNoaWZ0ID09IHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQKLQkmJiB0bXAtPnNpemUgPT0gcmVsLT5ob3d0by0+c2l6ZQotCSYmIHRtcC0+Yml0c2l6ZSA9PSByZWwtPmhvd3RvLT5iaXRzaXplCi0JJiYgdG1wLT5wY19yZWxhdGl2ZSA9PSByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSYmIHRtcC0+Yml0cG9zID09IHJlbC0+aG93dG8tPmJpdHBvcwotCSYmIHRtcC0+c3JjX21hc2sgPT0gcmVsLT5ob3d0by0+c3JjX21hc2sKLQkmJiB0bXAtPmRzdF9tYXNrID09IHJlbC0+aG93dG8tPmRzdF9tYXNrKSB7Ci0gICAgICB0eXBlID0gdG1wLT50eXBlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmICh0eXBlID09IC0xKQotICAgIGFib3J0KCk7Ci0KLSAgLyoKLSAgICogTmV0d2FyZSB3YW50cyBhIGxpc3Qgb2YgcmVsb2NzIGZvciBlYWNoIGFkZHJlc3MuCi0gICAqIEZvcm1hdCBpczoKLSAgICoJbG9uZwlvZmZzZXQKLSAgICoJbG9uZwlhZGRlbmQKLSAgICoJY2hhcgl0eXBlCi0gICAqIFRoYXQgc2hvdWxkIGJlIGl0LgotICAgKi8KLQotICAvKiBUaGUgdmFsdWUgd2Ugd3JpdGUgb3V0IGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYXBwcm9wcmlhdGUKLSAgICAgc2VnbWVudC4gIFRoaXMgb2Zmc2V0IGlzIHRoZSBzZWN0aW9uIHZtYSwgYWRqdXN0ZWQgYnkgdGhlIHZtYSBvZgotICAgICB0aGUgbG93ZXN0IHNlY3Rpb24gaW4gdGhhdCBzZWdtZW50LCBwbHVzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgICByZWxvY2F0aW9uLiAgKi8KLSNpZiAwCi0gIHZhbCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsICgqcmVsLT5zeW1fcHRyX3B0ciktPnNlY3Rpb24pICsgcmVsLT5hZGRyZXNzOwotI2Vsc2UKLSAgdmFsID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKSArIHJlbC0+YWRkcmVzczsKLSNlbmRpZgotCi0jaWZkZWYgREVCVUcKLSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICB2YWwgPSAlMDhseCwgYWRkZW5kID0gJTA4bHgsIHR5cGUgPSAlZFxuIiwKLQkgICBfX0ZVTkNUSU9OX18sIHZhbCwgcmVsLT5hZGRlbmQsIHJlbC0+aG93dG8tPnR5cGUpOwotI2VuZGlmCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbCwgdG1wX3JlbG9jLm9mZnNldCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHJlbC0+YWRkZW5kLCB0bXBfcmVsb2MuYWRkZW5kKTsKLSAgYmZkX3B1dF84IChhYmZkLCAoc2hvcnQpKHJlbC0+aG93dG8tPnR5cGUpLCB0bXBfcmVsb2MudHlwZSk7Ci0KLSAgaWYgKGJmZF93cml0ZSAoJnRtcF9yZWxvYywgMTIsIDEsIGFiZmQpICE9IDEyKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFuZ2xlIHJlbG9jcyBmb3IgU1BBUkMgTmV0V2FyZS4gIFdlIGNhbiBqdXN0IHVzZSB0aGUgc3RhbmRhcmQKLSAgIFNQQVJDIHJlbG9jcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBOZXRXYXJlIHNwYXJjIGltcG9ydCByZWNvcmQgKi8KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfcmVhZF9pbXBvcnQgKGFiZmQsIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBubG1OQU1FKHN5bWJvbF90eXBlKSAqc3ltOwotewotICBzdHJ1Y3QgbmxtX3JlbGVudCAqbmxtX3JlbG9jczsJLyogcmVsb2NhdGlvbiByZWNvcmRzIGZvciBzeW1ib2wgKi8KLSAgYmZkX3NpemVfdHlwZSByY291bnQ7CQkJLyogbnVtYmVyIG9mIHJlbG9jcyAqLwotICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsJLyogdGVtcG9yYXJ5IDMyLWJpdCB2YWx1ZSAqLwotICB1bnNpZ25lZCBjaGFyIHN5bWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSAqLwotICBjaGFyICpuYW1lOwotICAKLSAgLyoKLSAgICogRmlyc3QsIHJlYWQgaW4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9uCi0gICAqIGVudHJpZXMgZm9yIHRoaXMgc3ltYm9sCi0gICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgcmNvdW50ID0gYmZkX2dldF8zMiAoYWJmZCwgdGVtcCk7Ci0gIAotICAvKgotICAgKiBOZXh0LCByZWFkIGluIHRoZSBsZW5ndGggb2YgdGhlIHN5bWJvbAotICAgKi8KLSAgCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJnN5bWxlbmd0aCwgc2l6ZW9mIChzeW1sZW5ndGgpLCAxLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgLyoKLSAgICogVGhlbiByZWFkIGluIHRoZSBzeW1ib2wKLSAgICovCi0gIAotICBpZiAoYmZkX3JlYWQgKG5hbWUsIHN5bWxlbmd0aCwgMSwgYWJmZCkgIT0gc3ltbGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmFtZVtzeW1sZW5ndGhdID0gJ1wwJzsKLSAgc3ltIC0+IHN5bWJvbC5uYW1lID0gbmFtZTsKLSAgc3ltIC0+IHN5bWJvbC5mbGFncyA9IDA7Ci0gIHN5bSAtPiBzeW1ib2wudmFsdWUgPSAwOwotICBzeW0gLT4gc3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAKLSAgLyoKLSAgICogTmV4dCwgc3RhcnQgcmVhZGluZyBpbiB0aGUgcmVsb2NzLgotICAgKi8KLSAgCi0gIG5sbV9yZWxvY3MgPSAoKHN0cnVjdCBubG1fcmVsZW50ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgcmNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbmxtX3JlbGVudCkpKTsKLSAgaWYgKCFubG1fcmVsb2NzKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3ltIC0+IHJlbG9jcyA9IG5sbV9yZWxvY3M7Ci0gIHN5bSAtPiByY250ID0gMDsKLSAgd2hpbGUgKHN5bSAtPiByY250IDwgcmNvdW50KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICAgCi0gICAgICBpZiAobmxtX3NwYXJjX3JlYWRfcmVsb2MgKGFiZmQsIHN5bSwgJnNlY3Rpb24sCi0JCQkgICAgICAmbmxtX3JlbG9jcyAtPiByZWxvYykKLQkgID09IGZhbHNlKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5sbV9yZWxvY3MgLT4gc2VjdGlvbiA9IHNlY3Rpb247Ci0gICAgICBubG1fcmVsb2NzKys7Ci0gICAgICBzeW0gLT4gcmNudCsrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3BhcmNfd3JpdGVfaW1wb3J0IChhYmZkLCBzZWMsIHJlbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBhcmVsZW50ICpyZWw7Ci17Ci0gIGNoYXIgdGVtcFs0XTsKLSAgYXNlY3Rpb24gKmNvZGUsICpkYXRhLCAqYnNzLCAqc3ltc2VjOwotICBiZmRfdm1hIGJhc2U7Ci0KLSAgY29kZSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fQ09ERV9OQU1FKTsKLSAgZGF0YSA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgYnNzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0gIHN5bXNlYyA9ICgqcmVsLT5zeW1fcHRyX3B0ciktPnNlY3Rpb247Ci0KLSAgaWYgKHN5bXNlYyA9PSBjb2RlKSB7Ci0gICAgYmFzZSA9IDA7Ci0gIH0gZWxzZSBpZiAoc3ltc2VjID09IGRhdGEpIHsKLSAgICBiYXNlID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgY29kZSk7Ci0gIH0gZWxzZSBpZiAoc3ltc2VjID09IGJzcykgewotICAgIGJhc2UgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBjb2RlKSArIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRhdGEpOwotICB9IGVsc2UKLSAgICBiYXNlID0gMDsKLQotI2lmZGVmIERFQlVHCi0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAgPCV4LCAxPlxuXHQiLAotCSAgIF9fRlVOQ1RJT05fXywgYmFzZSArICgqcmVsLT5zeW1fcHRyX3B0ciktPnZhbHVlKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCBiYXNlICsgKCpyZWwtPnN5bV9wdHJfcHRyKS0+dmFsdWUsIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKXRlbXAsIDQsIDEsIGFiZmQpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBiZmRfcHV0XzMyIChhYmZkLCAxLCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUil0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWwpID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NwYXJjX3dyaXRlX2V4dGVybmFsIChhYmZkLCBjb3VudCwgc3ltLCByZWxvY3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcmVsb2NzOwotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX2J5dGUgbGVuOwotICB1bnNpZ25lZCBjaGFyIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50LCB0ZW1wKTsKLSAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0gIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkgIT0gc2l6ZW9mKGJmZF9ieXRlKSkKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgewotICAgICAgaWYgKG5sbV9zcGFyY193cml0ZV9yZWxvYyAoYWJmZCwgcmVsb2NzW2ldLnNlYywKLQkJCQkgcmVsb2NzW2ldLnJlbCkgPT0gZmFsc2UpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zcGFyY193cml0ZV9leHBvcnQgKGFiZmQsIHN5bSwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBiZmRfYnl0ZSBsZW47Ci0gIGJmZF9ieXRlIHRlbXBbNF07Ci0KLSNpZmRlZiBERUJVRwotICBmcHJpbnRmIChzdGRlcnIsICIlczogPCV4LCAlZCwgJXM+XG4iLAotCSAgIF9fRlVOQ1RJT05fXywgdmFsdWUsIHN0cmxlbiAoc3ltLT5uYW1lKSwgc3ltLT5uYW1lKTsKLSNlbmRpZgotICBiZmRfcHV0XzMyIChhYmZkLCB2YWx1ZSwgdGVtcCk7Ci0gIGxlbiA9IHN0cmxlbiAoc3ltLT5uYW1lKTsKLQotICBpZiAoYmZkX3dyaXRlICh0ZW1wLCA0LCAxLCBhYmZkKSAhPSA0Ci0gICAgICB8fCBiZmRfd3JpdGUgKCZsZW4sIDEsIDEsIGFiZmQpICE9IDEKLSAgICAgIHx8IGJmZF93cml0ZSAoc3ltLT5uYW1lLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSN1bmRlZiBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4KLSN1bmRlZiBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0Ci0KLSNpbmNsdWRlICJubG1zd2FwLmgiCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxtX2JhY2tlbmRfZGF0YSBubG0zMl9zcGFyY19iYWNrZW5kID0KLXsKLSAgIk5ldFdhcmUgU1BBUkMgTW9kdWxlICAgXDAzMiIsCi0gIHNpemVvZiAoTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyKSwKLSAgMCwJLyogb3B0aW9uYWxfcHJlZml4X3NpemUgKi8KLSAgYmZkX2FyY2hfc3BhcmMsCi0gIDAsCi0gIGZhbHNlLAotICAwLAkvKiBiYWNrZW5kX29iamVjdF9wICovCi0gIDAsCS8qIHdyaXRlX3ByZWZpeF9mdW5jICovCi0gIG5sbV9zcGFyY19yZWFkX3JlbG9jLAotICBubG1fc3BhcmNfbWFuZ2xlX3JlbG9jcywKLSAgbmxtX3NwYXJjX3JlYWRfaW1wb3J0LAotICBubG1fc3BhcmNfd3JpdGVfaW1wb3J0LAotICAwLAkvKiBzZXRfcHVibGljX3NlY3Rpb24gKi8KLSAgMCwJLyogZ2V0X3B1YmxpY19vZmZzZXQgKi8KLSAgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luLAotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0LAotICBubG1fc3BhcmNfd3JpdGVfZXh0ZXJuYWwsCi0gIG5sbV9zcGFyY193cml0ZV9leHBvcnQKLX07Ci0KLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FCQkibmxtMzItc3BhcmMiCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNCQlubG1OQU1FKHNwYXJjX3ZlYykKLSNkZWZpbmUgVEFSR0VUX0JBQ0tFTkRfREFUQQkJJm5sbTMyX3NwYXJjX2JhY2tlbmQKLQotI2luY2x1ZGUgIm5sbS10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9ubG0zMi5jIGIvYmZkL25sbTMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzBlNGYuLjAwMDAwMDAKLS0tIGEvYmZkL25sbTMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSAzMi1iaXQgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBBUkNIX1NJWkUgMzIKLSNpbmNsdWRlICJubG1jb2RlLmgiCmRpZmYgLS1naXQgYS9iZmQvbmxtNjQuYyBiL2JmZC9ubG02NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNkOTZhLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG02NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgNjQtYml0IGV4ZWN1dGFibGUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgQVJDSF9TSVpFIDY0Ci0jaW5jbHVkZSAibmxtY29kZS5oIgpkaWZmIC0tZ2l0IGEvYmZkL25sbWNvZGUuaCBiL2JmZC9ubG1jb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWMwYzMuLjAwMDAwMDAKLS0tIGEvYmZkL25sbWNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNTYgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgZXhlY3V0YWJsZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgdXNpbmcgRUxGIHN1cHBvcnQgYXMgdGhlCi0gICB0ZW1wbGF0ZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGlibmxtLmgiCi0KLS8qIFRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGRvIG5vdCB1c2UgdGhlIG5hbWVzIHRoZXkgYXBwZWFyIHRvIHVzZS4KLSAgIFRoaXMgZmlsZSBpcyBhY3R1YWxseSBjb21waWxlZCBtdWx0aXBsZSB0aW1lcywgb25jZSBmb3IgZWFjaCBzaXplCi0gICBvZiBOTE0gdGFyZ2V0IHdlIGFyZSB1c2luZy4gIEF0IGVhY2ggc2l6ZSB3ZSB1c2UgYSBkaWZmZXJlbnQgbmFtZSwKLSAgIGNvbnN0cnVjdGVkIGJ5IHRoZSBtYWNybyBubG1OQU1FLiAgRm9yIGV4YW1wbGUsIHRoZSBmdW5jdGlvbiB3aGljaAotICAgaXMgbmFtZWQgbmxtX3N5bWJvbF90eXBlIGJlbG93IGlzIGFjdHVhbGx5IG5hbWVkIG5sbTMyX3N5bWJvbF90eXBlCi0gICBpbiB0aGUgZmluYWwgZXhlY3V0YWJsZS4gICovCi0KLSNkZWZpbmUgTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0ZpeGVkX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfVmVyc2lvbl9IZWFkZXIpCi0jZGVmaW5lIE5sbV9FeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCU5sbU5BTUUoRXh0ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0V4dGVuZGVkX0hlYWRlcglObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcikKLSNkZWZpbmUgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DdXN0b21fSGVhZGVyKQotI2RlZmluZSBObG1fRXh0ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIJTmxtTkFNRShFeHRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcikKLQotI2RlZmluZSBubG1fc3ltYm9sX3R5cGUJCQlubG1OQU1FKHN5bWJvbF90eXBlKQotI2RlZmluZSBubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAlubG1OQU1FKGdldF9zeW10YWJfdXBwZXJfYm91bmQpCi0jZGVmaW5lIG5sbV9nZXRfc3ltdGFiCQkJbmxtTkFNRShnZXRfc3ltdGFiKQotI2RlZmluZSBubG1fbWFrZV9lbXB0eV9zeW1ib2wJCW5sbU5BTUUobWFrZV9lbXB0eV9zeW1ib2wpCi0jZGVmaW5lIG5sbV9wcmludF9zeW1ib2wJCW5sbU5BTUUocHJpbnRfc3ltYm9sKQotI2RlZmluZSBubG1fZ2V0X3N5bWJvbF9pbmZvCQlubG1OQU1FKGdldF9zeW1ib2xfaW5mbykKLSNkZWZpbmUgbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZAlubG1OQU1FKGdldF9yZWxvY191cHBlcl9ib3VuZCkKLSNkZWZpbmUgbmxtX2Nhbm9uaWNhbGl6ZV9yZWxvYwkJbmxtTkFNRShjYW5vbmljYWxpemVfcmVsb2MpCi0jZGVmaW5lIG5sbV9vYmplY3RfcAkJCW5sbU5BTUUob2JqZWN0X3ApCi0jZGVmaW5lIG5sbV9zZXRfc2VjdGlvbl9jb250ZW50cwlubG1OQU1FKHNldF9zZWN0aW9uX2NvbnRlbnRzKQotI2RlZmluZSBubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzCW5sbU5BTUUod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbihhYmZkLHNyYyxkc3QpIFwKLSAgKG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbl9mdW5jKGFiZmQpKShhYmZkLHNyYyxkc3QpCi0jZGVmaW5lIG5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQoYWJmZCxzcmMsZHN0KSBcCi0gIChubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0X2Z1bmMoYWJmZCkpKGFiZmQsc3JjLGRzdCkKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgb2Ygc3RhdGljIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgYm9vbGVhbiBhZGRfYmZkX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICosIGNoYXIgKiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUsIGZsYWd3b3JkKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIGZpbmRfbm9uemVybwotICBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotc3RhdGljIGJvb2xlYW4gbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4KLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG5sbV9zd2FwX2F1eGlsaWFyeV9oZWFkZXJzX291dAotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3N5bWJvbF90YWJsZQotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucwotICBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZQotICBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotCi0vKiBTaG91bGQgcGVyaGFwcyB1c2UgcHV0X29mZnNldCwgcHV0X3dvcmQsIGV0Yy4gIEZvciBub3csIHRoZSB0d28gdmVyc2lvbnMKLSAgIGNhbiBiZSBoYW5kbGVkIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyAzMiBiaXRzIG9yICJ0aGUgbG9uZyB0eXBlIi4gICovCi0jaWYgQVJDSF9TSVpFID09IDY0Ci0jZGVmaW5lIHB1dF93b3JkCWJmZF9oX3B1dF82NAotI2RlZmluZSBnZXRfd29yZAliZmRfaF9nZXRfNjQKLSNlbmRpZgotI2lmIEFSQ0hfU0laRSA9PSAzMgotI2RlZmluZSBwdXRfd29yZAliZmRfaF9wdXRfMzIKLSNkZWZpbmUgZ2V0X3dvcmQJYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLQotY29uc3QgYmZkX3RhcmdldCAqCi1ubG1fb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IG5sbV9vYmpfdGRhdGEgKnByZXNlcnZlZF90ZGF0YSA9IG5sbV90ZGF0YSAoYWJmZCk7Ci0gIGJvb2xlYW4gKCpiYWNrZW5kX29iamVjdF9wKSBQQVJBTVMgKChiZmQgKikpOwotICBQVFIgeF9meGRoZHIgPSBOVUxMOwotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7Ci0gIHN0cnVjdCBubG1fb2JqX3RkYXRhICpuZXdfdGRhdGEgPSBOVUxMOwotICBjb25zdCBjaGFyICpzaWduYXR1cmU7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qIFNvbWUgTkxNIGZvcm1hdHMgaGF2ZSBhIHByZWZpeCBiZWZvcmUgdGhlIHN0YW5kYXJkIE5MTSBmaXhlZAotICAgICBoZWFkZXIuICAqLwotICBiYWNrZW5kX29iamVjdF9wID0gbmxtX2JhY2tlbmRfb2JqZWN0X3BfZnVuYyAoYWJmZCk7Ci0gIGlmIChiYWNrZW5kX29iamVjdF9wKQotICAgIHsKLSAgICAgIGlmICghKCpiYWNrZW5kX29iamVjdF9wKSAoYWJmZCkpCi0JZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotICAgIH0KLQotICAvKiBSZWFkIGluIHRoZSBmaXhlZCBsZW5ndGggcG9ydGlvbiBvZiB0aGUgTkxNIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQuICAqLwotCi0gIHhfZnhkaGRyID0gKFBUUikgYmZkX21hbGxvYyAoKHNpemVfdCkgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSk7Ci0gIGlmICh4X2Z4ZGhkciA9PSBOVUxMKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgeF9meGRoZHIsIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCksIDEsIGFiZmQpICE9Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQlnb3RvIGdvdF93cm9uZ19mb3JtYXRfZXJyb3I7Ci0gICAgICBlbHNlCi0JZ290byBnb3Rfbm9fbWF0Y2g7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBubG1fb2JqX3RkYXRhIHN0cnVjdHVyZSBhbmQgaG9vayBpdCB1cCB0bwotICAgICB0aGUgdGRhdGEgcG9pbnRlciBpbiB0aGUgYmZkLiAgKi8KLQotICBuZXdfdGRhdGEgPSAoKHN0cnVjdCBubG1fb2JqX3RkYXRhICopCi0JICAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG5sbV9vYmpfdGRhdGEpKSk7Ci0gIGlmIChuZXdfdGRhdGEgPT0gTlVMTCkKLSAgICBnb3RvIGdvdF9ub19tYXRjaDsKLQotICBubG1fdGRhdGEgKGFiZmQpID0gbmV3X3RkYXRhOwotCi0gIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOwotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfaW4gKGFiZmQsIHhfZnhkaGRyLCBpX2Z4ZGhkcnApOwotICBmcmVlICh4X2Z4ZGhkcik7Ci0gIHhfZnhkaGRyID0gTlVMTDsKLQotICAvKiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbiBOTE0gZmlsZSBmb3IgdGhpcyBiYWNrZW5kIGJ5IG1hdGNoaW5nCi0gICAgIHRoZSBOTE0gc2lnbmF0dXJlLiAqLwotCi0gIHNpZ25hdHVyZSA9IG5sbV9zaWduYXR1cmUgKGFiZmQpOwotICBpZiAoc2lnbmF0dXJlICE9IE5VTEwKLSAgICAgICYmICpzaWduYXR1cmUgIT0gJ1wwJwotICAgICAgJiYgc3RybmNtcCAoKGNoYXIgKikgaV9meGRoZHJwLT5zaWduYXR1cmUsIHNpZ25hdHVyZSwKLQkJICBOTE1fU0lHTkFUVVJFX1NJWkUpICE9IDApCi0gICAgZ290byBnb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOwotCi0gIC8qIFRoZXJlJ3Mgbm8gc3VwcG9ydGVkIHdheSB0byBkaXNjb3ZlciB0aGUgZW5kaWFuZXNzIG9mIGFuIE5MTSwgc28gdGVzdCBmb3IKLSAgICAgYSBzYW5lIHZlcnNpb24gbnVtYmVyIGFmdGVyIGRvaW5nIGJ5dGUgc3dhcHBpbmcgYXBwcm9wcmlhdGUgZm9yIHRoaXMKLSAgICAgWFZFQy4gIChIYWNrIGFsZXJ0ISkgKi8KLQotICBpZiAoaV9meGRoZHJwLT52ZXJzaW9uID4gMHhGRkZGKQotICAgIGdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLQotICAvKiBUaGVyZSdzIG5vIHN1cHBvcnRlZCB3YXkgdG8gY2hlY2sgZm9yIDMyIGJpdCB2ZXJzdXMgNjQgYml0IGFkZHJlc3NlcywKLSAgICAgc28gaWdub3JlIHRoaXMgZGlzdGluY3Rpb24gZm9yIG5vdy4gIChGSVhNRSkgKi8KLQotICAvKiBTd2FwIGluIHRoZSByZXN0IG9mIHRoZSByZXF1aXJlZCBoZWFkZXIuICAqLwotICBpZiAoIW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9pbiAoYWJmZCkpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWdvdG8gZ290X3dyb25nX2Zvcm1hdF9lcnJvcjsKLSAgICAgIGVsc2UKLQlnb3RvIGdvdF9ub19tYXRjaDsKLSAgICB9Ci0KLSAgLyogQWRkIHRoZSBzZWN0aW9ucyBzdXBwbGllZCBieSBhbGwgTkxNJ3MsIGFuZCB0aGVuIHJlYWQgaW4gdGhlCi0gICAgIGF1eGlsaWFyeSBoZWFkZXJzLiAgUmVhZGluZyB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMgbWF5IGNyZWF0ZQotICAgICBhZGRpdGlvbmFsIHNlY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGUgY3lnbnVzX2V4dCBoZWFkZXIuCi0gICAgIEZyb20gdGhpcyBwb2ludCBvbiB3ZSBhc3N1bWUgdGhhdCB3ZSBoYXZlIGFuIE5MTSwgYW5kIGRvIG5vdAotICAgICB0cmVhdCBlcnJvcnMgYXMgaW5kaWNhdGluZyB0aGUgd3JvbmcgZm9ybWF0LiAgKi8KLQotICBpZiAoIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0NPREVfTkFNRSwKLQkJCWlfZnhkaGRycC0+Y29kZUltYWdlT2Zmc2V0LAotCQkJaV9meGRoZHJwLT5jb2RlSW1hZ2VTaXplLAotCQkJKFNFQ19DT0RFIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgfCBTRUNfUkVMT0MpKQotICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSwKLQkJCSAgIGlfZnhkaGRycC0+ZGF0YUltYWdlT2Zmc2V0LAotCQkJICAgaV9meGRoZHJwLT5kYXRhSW1hZ2VTaXplLAotCQkJICAgKFNFQ19EQVRBIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgICAgfCBTRUNfUkVMT0MpKQotICAgICAgfHwgIWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FLAotCQkJICAgKGZpbGVfcHRyKSAwLAotCQkJICAgaV9meGRoZHJwLT51bmluaXRpYWxpemVkRGF0YVNpemUsCi0JCQkgICBTRUNfQUxMT0MpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmICghbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpKQotICAgIGdvdG8gZ290X25vX21hdGNoOwotCi0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19SRUxPQzsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlB1YmxpY3MgIT0gMAotICAgICAgfHwgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzICE9IDAKLSAgICAgIHx8IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcyAhPSAwKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19TWU1TOwotCi0gIGFyY2ggPSBubG1fYXJjaGl0ZWN0dXJlIChhYmZkKTsKLSAgaWYgKGFyY2ggIT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCAodW5zaWduZWQgbG9uZykgMCk7Ci0KLSAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVTdGFydE9mZnNldDsKLQotICByZXR1cm4gKGFiZmQtPnh2ZWMpOwotCi1nb3Rfd3JvbmdfZm9ybWF0X2Vycm9yOgotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLWdvdF9ub19tYXRjaDoKLSAgbmxtX3RkYXRhIChhYmZkKSA9IHByZXNlcnZlZF90ZGF0YTsKLSAgaWYgKG5ld190ZGF0YSAhPSBOVUxMKQotICAgIGJmZF9yZWxlYXNlIChhYmZkLCBuZXdfdGRhdGEpOwotICBpZiAoeF9meGRoZHIgIT0gTlVMTCkKLSAgICBmcmVlICh4X2Z4ZGhkcik7Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qIEFkZCBhIHNlY3Rpb24gdG8gdGhlIGJmZC4gKi8KLQotc3RhdGljIGJvb2xlYW4KLWFkZF9iZmRfc2VjdGlvbiAoYWJmZCwgbmFtZSwgb2Zmc2V0LCBzaXplLCBmbGFncykKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuYW1lOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotCi0gIG5ld3NlY3QgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKTsKLSAgaWYgKG5ld3NlY3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICB9Ci0gIG5ld3NlY3QtPnZtYSA9IDA7CQkvKiBOTE0ncyBhcmUgcmVsb2NhdGFibGUuICovCi0gIG5ld3NlY3QtPl9yYXdfc2l6ZSA9IHNpemU7Ci0gIG5ld3NlY3QtPmZpbGVwb3MgPSBvZmZzZXQ7Ci0gIG5ld3NlY3QtPmZsYWdzID0gZmxhZ3M7Ci0gIG5ld3NlY3QtPmFsaWdubWVudF9wb3dlciA9IGJmZF9sb2cyICgwKTsJLyogRklYTUUgKi8KLSAgcmV0dXJuICh0cnVlKTsKLX0KLQotLyogUmVhZCBhbmQgc3dhcCBpbiB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlci4gIEFsbCB0aGUgZmllbGRzIG11c3QKLSAgIGV4aXN0IGluIHRoZSBOTE0sIGFuZCBtdXN0IGV4aXN0IGluIHRoZSBvcmRlciB0aGV5IGFyZSByZWFkIGhlcmUuICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfaW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBSZWFkIHRoZSBkZXNjcmlwdGlvbiBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uVGV4dCwKLQkJbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHN0YWNrU2l6ZSBmaWVsZC4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zdGFja1NpemUgPSBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRlbXApOwotCi0gIC8qIFJlYWQgYW5kIGNvbnZlcnQgdGhlIHJlc2VydmVkIGZpZWxkLiAqLwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgdGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLSAgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnJlc2VydmVkID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0ZW1wKTsKLQotICAvKiBSZWFkIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSwKLQkJc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+b2xkVGhyZWFkTmFtZSksCi0JCTEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBSZWFkIHRoZSBzY3JlZW4gbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgsCi0JCXNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAotCQkxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWUsCi0JCW5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0KLSAgLyogUmVhZCB0aGUgdGhyZWFkIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAotCQlzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoKSwKLQkJMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3JlYWQgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAotCQlubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEsCi0JCTEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotICByZXR1cm4gKHRydWUpOwotfQotCi0vKiBTd2FwIGFuZCB3cml0ZSBvdXQgdGhlIHZhcmlhYmxlIGxlbmd0aCBoZWFkZXIuICBBbGwgdGhlIGZpZWxkcyBtdXN0Ci0gICBleGlzdCBpbiB0aGUgTkxNLCBhbmQgbXVzdCBleGlzdCBpbiB0aGlzIG9yZGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5sbV9zd2FwX3ZhcmlhYmxlX2hlYWRlcl9vdXQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5zaWduZWQgY2hhciB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBXcml0ZSB0aGUgZGVzY3JpcHRpb24gbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25UZXh0LAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPmRlc2NyaXB0aW9uTGVuZ3RoICsgMSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBDb252ZXJ0IGFuZCB3cml0ZSB0aGUgc3RhY2tTaXplIGZpZWxkLiAqLwotCi0gIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnN0YWNrU2l6ZSwKLQkgICAgKGJmZF9ieXRlICopIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIENvbnZlcnQgYW5kIHdyaXRlIHRoZSByZXNlcnZlZCBmaWVsZC4gKi8KLQotICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZCwKLQkgICAgKGJmZF9ieXRlICopIHRlbXApOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSB0ZW1wLCBzaXplb2YgKHRlbXApLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRlbXApKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSBvbGRUaHJlYWROYW1lIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyBhIGZpeGVkIGxlbmd0aCBzdHJpbmcuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPm9sZFRocmVhZE5hbWUsCi0JCSBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKSkKLSAgICByZXR1cm4gKGZhbHNlKTsKLQotICAvKiBXcml0ZSB0aGUgc2NyZWVuIG5hbWUgbGVuZ3RoIGFuZCB0ZXh0IG1lbWJlcnMuICovCi0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZUxlbmd0aCwKLQkJIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpKQotICAgIHJldHVybiAoZmFsc2UpOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+c2NyZWVuTmFtZSwKLQkJIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5zY3JlZW5OYW1lTGVuZ3RoICsgMSwKLQkJIDEsIGFiZmQpICE9Ci0gICAgICAoYmZkX3NpemVfdHlwZSkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIC8qIFdyaXRlIHRoZSB0aHJlYWQgbmFtZSBsZW5ndGggYW5kIHRleHQgbWVtYmVycy4gKi8KLQotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lTGVuZ3RoLAotCQkgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCksCi0JCSAxLCBhYmZkKSAhPQotICAgICAgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpIG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT50aHJlYWROYW1lLAotCQkgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnRocmVhZE5hbWVMZW5ndGggKyAxLAotCQkgMSwgYWJmZCkgIT0KLSAgICAgIChiZmRfc2l6ZV90eXBlKSBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpCi0gICAgcmV0dXJuIChmYWxzZSk7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJlYWQgYW5kIHN3YXAgaW4gdGhlIGNvbnRlbnRzIG9mIGFsbCB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMuICBCZWNhdXNlIG9mCi0gICB0aGUgYnJhaW5kZWFkIGRlc2lnbiwgd2UgaGF2ZSB0byBkbyBzdHJjbXBzIG9uIHN0cmluZ3Mgb2YgaW5kZXRlcm1pbmF0ZQotICAgbGVuZ3RoIHRvIGZpZ3VyZSBvdXQgd2hhdCBlYWNoIGF1eGlsaWFyeSBoZWFkZXIgaXMuICBFdmVuIHdvcnNlLCB3ZSBoYXZlCi0gICBubyB3YXkgb2Yga25vd2luZyBob3cgbWFueSBhdXhpbGlhcnkgaGVhZGVycyB0aGVyZSBhcmUgb3Igd2hlcmUgdGhlIGVuZAotICAgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzIGFyZSwgZXhjZXB0IGJ5IGZpbmRpbmcgc29tZXRoaW5nIHRoYXQgZG9lc24ndAotICAgbG9vayBsaWtlIGEga25vd24gYXV4aWxpYXJ5IGhlYWRlci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZmlyc3QgbmV3IHR5cGUKLSAgIG9mIGF1eGlsaWFyeSBoZWFkZXIgYWRkZWQgd2lsbCBicmVhayBhbGwgZXhpc3RpbmcgdG9vbHMgdGhhdCBkb24ndAotICAgcmVjb2duaXplIGl0LiAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfaW4gKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciB0ZW1wc3RyWzE2XTsKLSAgbG9uZyBwb3NpdGlvbjsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHBvc2l0aW9uID0gYmZkX3RlbGwgKGFiZmQpOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSB0ZW1wc3RyLCBzaXplb2YgKHRlbXBzdHIpLCAxLCBhYmZkKSAhPQotCSAgc2l6ZW9mICh0ZW1wc3RyKSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgcG9zaXRpb24sIFNFRUtfU0VUKSA9PSAtMSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiVmVSc0lvTiMiLCA4KSA9PSAwKQotCXsKLQkgIE5sbV9FeHRlcm5hbF9WZXJzaW9uX0hlYWRlciB0aGRyOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgbWVtY3B5IChubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tYWpvclZlcnNpb24pOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1pbm9yVmVyc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5yZXZpc2lvbik7Ci0JICBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnllYXIpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIubW9udGgpOwotCSAgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRheSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIk1lU3NBZ0VzIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7Ci0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JICBtZW1jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwgdGhkci5zdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlEID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmxhbmd1YWdlSUQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VGaWxlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLm1lc3NhZ2VDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuaGVscEZpbGVPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0ID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGggPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuUlBDRGF0YUxlbmd0aCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoID0KLQkgICAgZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZENvZGVMZW5ndGgpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YU9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREYXRhTGVuZ3RoKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZEV4dGVybmFsUmVmZXJlbmNlQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUHVibGljc09mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRDb3VudCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWREZWJ1Z1JlY29yZENvdW50KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCA9Ci0JICAgIGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5TaGFyZWRFeGl0UHJvY2VkdXJlT2Zmc2V0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucHJvZHVjdElEKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQwKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQxKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQyKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQzKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ0KTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUgPQotCSAgICBnZXRfd29yZCAoYWJmZCwgKGJmZF9ieXRlICopIHRoZHIucmVzZXJ2ZWQ1KTsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wICh0ZW1wc3RyLCAiQ29QeVJpR2hUPSIsIDEwKSA9PSAwKQotCXsKLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCwKLQkJCXNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCksCi0JCQkxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAobmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5zdGFtcCkpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIChubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCkKLQkJCQkgLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoKSwKLQkJCTEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHJldHVybiAoZmFsc2UpOwotCSAgLyogVGhlIGNvcHlyaWdodCBtZXNzYWdlIGlzIGEgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4gKi8KLQkgIGlmIChiZmRfcmVhZCAoKFBUUikgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlLAotCQkgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKLQkJCTEsIGFiZmQpICE9Ci0JICAgICAgKChiZmRfc2l6ZV90eXBlKQotCSAgICAgICBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKSkKLQkgICAgcmV0dXJuIChmYWxzZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAodGVtcHN0ciwgIkN1U3RIZUFkIiwgOCkgPT0gMCkKLQl7Ci0JICBObG1fRXh0ZXJuYWxfQ3VzdG9tX0hlYWRlciB0aGRyOwotCSAgYmZkX3NpemVfdHlwZSBoZHJMZW5ndGg7Ci0JICBmaWxlX3B0ciBkYXRhT2Zmc2V0OwotCSAgYmZkX3NpemVfdHlwZSBkYXRhTGVuZ3RoOwotCSAgY2hhciBkYXRhU3RhbXBbOF07Ci0JICBQVFIgaGRyOwotCi0JICAvKiBSZWFkIHRoZSBzdGFtcCAoIkN1U3RIZUFkIikuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLnN0YW1wLCAxLCBzaXplb2YgKHRoZHIuc3RhbXApLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkci5zdGFtcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlYWQgdGhlIGxlbmd0aCBvZiB0aGlzIGN1c3RvbSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSB0aGRyLmxlbmd0aCwgMSwgc2l6ZW9mICh0aGRyLmxlbmd0aCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mICh0aGRyLmxlbmd0aCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGhkckxlbmd0aCA9IGdldF93b3JkIChhYmZkLCAoYmZkX2J5dGUgKikgdGhkci5sZW5ndGgpOwotCSAgLyogUmVhZCBmdXJ0aGVyIGZpZWxkcyBpZiB3ZSBoYXZlIHRoZW0uICAqLwotCSAgaWYgKGhkckxlbmd0aCA8IE5MTV9UQVJHRVRfTE9OR19TSVpFKQotCSAgICBkYXRhT2Zmc2V0ID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhT2Zmc2V0LCAxLAotCQkJICAgIHNpemVvZiAodGhkci5kYXRhT2Zmc2V0KSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHRoZHIuZGF0YU9mZnNldCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkYXRhT2Zmc2V0ID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFPZmZzZXQpOwotCSAgICB9Ci0JICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFKQotCSAgICBkYXRhTGVuZ3RoID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgdGhkci5kYXRhTGVuZ3RoLCAxLAotCQkJICAgIHNpemVvZiAodGhkci5kYXRhTGVuZ3RoKSwgYWJmZCkKLQkJICAhPSBzaXplb2YgKHRoZHIuZGF0YUxlbmd0aCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkYXRhTGVuZ3RoID0gZ2V0X3dvcmQgKGFiZmQsIChiZmRfYnl0ZSAqKSB0aGRyLmRhdGFMZW5ndGgpOwotCSAgICB9Ci0JICBpZiAoaGRyTGVuZ3RoIDwgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKLQkgICAgbWVtc2V0IChkYXRhU3RhbXAsIDAsIHNpemVvZiAoZGF0YVN0YW1wKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIGRhdGFTdGFtcCwgMSwgc2l6ZW9mIChkYXRhU3RhbXApLCBhYmZkKQotCQkgICE9IHNpemVvZiAoZGF0YVN0YW1wKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIFJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwgaWYgYW55LiAgKi8KLQkgIGlmIChoZHJMZW5ndGggPD0gMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCkKLQkgICAgewotCSAgICAgIGhkciA9IE5VTEw7Ci0JICAgICAgaGRyTGVuZ3RoID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaGRyTGVuZ3RoIC09IDIgKiBOTE1fVEFSR0VUX0xPTkdfU0laRSArIDg7Ci0JICAgICAgaGRyID0gYmZkX2FsbG9jIChhYmZkLCBoZHJMZW5ndGgpOwotCSAgICAgIGlmIChoZHIgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCBoZHJMZW5ndGgsIGFiZmQpICE9IGhkckxlbmd0aCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgZm91bmQgYSBDeWdudXMgaGVhZGVyLCBwcm9jZXNzIGl0LiAgT3RoZXJ3aXNlLAotCSAgICAganVzdCBzYXZlIHRoZSBhc3NvY2lhdGVkIGRhdGEgd2l0aG91dCB0cnlpbmcgdG8gaW50ZXJwcmV0Ci0JICAgICBpdC4gICovCi0JICBpZiAoc3RybmNtcCAoZGF0YVN0YW1wLCAiQ3lHblVzRXgiLCA4KSA9PSAwKQotCSAgICB7Ci0JICAgICAgZmlsZV9wdHIgcG9zOwotCSAgICAgIGJmZF9ieXRlICpjb250ZW50czsKLQkgICAgICBiZmRfYnl0ZSAqcCwgKnBlbmQ7Ci0KLQkgICAgICBCRkRfQVNTRVJUIChoZHJMZW5ndGggPT0gMCAmJiBoZHIgPT0gTlVMTCk7Ci0KLQkgICAgICBwb3MgPSBiZmRfdGVsbCAoYWJmZCk7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhT2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgZGF0YUxlbmd0aCk7Ci0JICAgICAgaWYgKGNvbnRlbnRzID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoYmZkX3JlYWQgKGNvbnRlbnRzLCAxLCBkYXRhTGVuZ3RoLCBhYmZkKSAhPSBkYXRhTGVuZ3RoKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBwb3MsIFNFRUtfU0VUKSAhPSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBtZW1jcHkgKG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCksICJDeUduVXNFeCIsIDgpOwotCSAgICAgIG5sbV9jeWdudXNfZXh0X2hlYWRlciAoYWJmZCktPm9mZnNldCA9IGRhdGFPZmZzZXQ7Ci0JICAgICAgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoID0gZGF0YUxlbmd0aDsKLQotCSAgICAgIC8qIFRoaXMgZGF0YSB0aGlzIGhlYWRlciBwb2ludHMgdG8gcHJvdmlkZXMgYSBsaXN0IG9mCi0JCSB0aGUgc2VjdGlvbnMgd2hpY2ggd2VyZSBpbiB0aGUgb3JpZ2luYWwgb2JqZWN0IGZpbGUKLQkJIHdoaWNoIHdhcyBjb252ZXJ0ZWQgdG8gYmVjb21lIGFuIE5MTS4gIFdlIGxvY2F0ZQotCQkgdGhvc2Ugc2VjdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBCRkQuICBOb3RlIHRoYXQKLQkJIHRoaXMgaXMgbGlrZWx5IHRvIGNyZWF0ZSBhIHNlY29uZCAudGV4dCwgLmRhdGEgYW5kCi0JCSAuYnNzIHNlY3Rpb247IHJldHJpZXZpbmcgdGhlIHNlY3Rpb25zIGJ5IG5hbWUgd2lsbAotCQkgZ2V0IHRoZSBhY3R1YWwgTkxNIHNlY3Rpb25zLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQgdG8KLQkJIGhhcHBlbi4gIFRoZSBzZWN0aW9ucyBmcm9tIHRoZSBvcmlnaW5hbCBmaWxlLCB3aGljaAotCQkgbWF5IGJlIHN1YnNldHMgb2YgdGhlIE5MTSBzZWN0aW9uLCBjYW4gb25seSBiZSBmb3VuZAotCQkgdXNpbmcgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQkgICAgICBwID0gY29udGVudHM7Ci0JICAgICAgcGVuZCA9IHAgKyBkYXRhTGVuZ3RoOwotCSAgICAgIHdoaWxlIChwIDwgcGVuZCkKLQkJewotCQkgIGNoYXIgKm5hbWU7Ci0JCSAgc2l6ZV90IGw7Ci0JCSAgZmlsZV9wdHIgZmlsZXBvczsKLQkJICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0JCSAgYXNlY3Rpb24gKm5ld3NlYzsKLQotCQkgIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcwotCQkgICAgIG51bGwgdGVybWluYXRlZCBzZWN0aW9uIG5hbWUKLQkJICAgICB6ZXJvZXMgdG8gYWRqdXN0IHRvIDQgYnl0ZSBib3VuZGFyeQotCQkgICAgIDQgYnl0ZSBzZWN0aW9uIGRhdGEgZmlsZSBwb2ludGVyCi0JCSAgICAgNCBieXRlIHNlY3Rpb24gc2l6ZQotCQkgICAgICovCi0KLQkJICBuYW1lID0gKGNoYXIgKikgcDsKLQkJICBsID0gc3RybGVuIChuYW1lKSArIDE7Ci0JCSAgbCA9IChsICsgMykgJn4gMzsKLQkJICBwICs9IGw7Ci0JCSAgZmlsZXBvcyA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcCk7Ci0JCSAgcCArPSA0OwotCQkgIHNpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHApOwotCQkgIHAgKz0gNDsKLQotCQkgIG5ld3NlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLQkJICBpZiAobmV3c2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIG5ld3NlYy0+X3Jhd19zaXplID0gc2l6ZTsKLQkJICBpZiAoZmlsZXBvcyAhPSAwKQotCQkgICAgewotCQkgICAgICBuZXdzZWMtPmZpbGVwb3MgPSBmaWxlcG9zOwotCQkgICAgICBuZXdzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPnN0YW1wLCB0aGRyLnN0YW1wLAotCQkgICAgICBzaXplb2YgKHRoZHIuc3RhbXApKTsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmhkckxlbmd0aCA9IGhkckxlbmd0aDsKLQkgICAgICBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQgPSBkYXRhT2Zmc2V0OwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGg7Ci0JICAgICAgbWVtY3B5IChubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwgZGF0YVN0YW1wLAotCQkgICAgICBzaXplb2YgKGRhdGFTdGFtcCkpOwotCSAgICAgIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyID0gaGRyOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIHRoZXJlIGlzIGEgbm9uLXplcm8gYnl0ZSBpbiBhIG1lbW9yeSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1maW5kX25vbnplcm8gKGJ1Ziwgc2l6ZSkKLSAgICAgUFRSIGJ1ZjsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIGNoYXIgKnAgPSAoY2hhciAqKSBidWY7Ci0KLSAgd2hpbGUgKHNpemUtLSAhPSAwKQotICAgIGlmICgqcCsrICE9IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTd2FwIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGF1eGlsaWFyeSBoZWFkZXJzLiAgV2UgY3JlYXRlIHRob3NlCi0gICBhdXhpbGlhcnkgaGVhZGVycyB3aGljaCBoYXZlIGJlZW4gc2V0IG5vbi16ZXJvLiAgV2UgZG8gbm90IHJlcXVpcmUKLSAgIHRoZSBjYWxsZXIgdG8gc2V0IHVwIHRoZSBzdGFtcCBmaWVsZHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIC8qIFdyaXRlIG91dCB0aGUgdmVyc2lvbiBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIlZlUnNJb04jIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCktPm1ham9yVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIubWFqb3JWZXJzaW9uKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bWlub3JWZXJzaW9uLAotCQkoYmZkX2J5dGUgKikgdGhkci5taW5vclZlcnNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT5yZXZpc2lvbiwKLQkJKGJmZF9ieXRlICopIHRoZHIucmV2aXNpb24pOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fdmVyc2lvbl9oZWFkZXIgKGFiZmQpLT55ZWFyLAotCQkoYmZkX2J5dGUgKikgdGhkci55ZWFyKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+bW9udGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLm1vbnRoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX3ZlcnNpb25faGVhZGVyIChhYmZkKS0+ZGF5LAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXkpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiB0aGRyLCBzaXplb2YgKHRoZHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKHRoZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlbmRlZCBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKSkKLSAgICB7Ci0gICAgICBObG1fRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIHRoZHI7Ci0KLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5sYW5ndWFnZUlELAotCQkoYmZkX2J5dGUgKikgdGhkci5sYW5ndWFnZUlEKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlRmlsZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5tZXNzYWdlRmlsZUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIubWVzc2FnZUZpbGVMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+bWVzc2FnZUNvdW50LAotCQkoYmZkX2J5dGUgKikgdGhkci5tZXNzYWdlQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+aGVscEZpbGVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLmhlbHBGaWxlT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPmhlbHBGaWxlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5oZWxwRmlsZUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5SUENEYXRhT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5SUENEYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPlJQQ0RhdGFMZW5ndGgsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLlJQQ0RhdGFMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkQ29kZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkQ29kZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRDb2RlTGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERhdGFPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERhdGFPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JCShiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGF0YUxlbmd0aCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRGF0YUxlbmd0aCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRSZWxvY2F0aW9uRml4dXBPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5zaGFyZWRQdWJsaWNzT2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5zaGFyZWRQdWJsaWNzT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZFB1YmxpY3NDb3VudCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkUHVibGljc0NvdW50KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCSAgICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+c2hhcmVkRGVidWdSZWNvcmRPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLAotCQkoYmZkX3ZtYSkgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnNoYXJlZERlYnVnUmVjb3JkQ291bnQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5TaGFyZWRJbml0aWFsaXphdGlvbk9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsCi0JICAgIChiZmRfdm1hKSBubG1fZXh0ZW5kZWRfaGVhZGVyIChhYmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIHRoZHIuU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5wcm9kdWN0SUQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnByb2R1Y3RJRCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDAsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDEsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMSk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDIsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMik7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDMsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkMyk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDQsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwKLQkJKGJmZF92bWEpIG5sbV9leHRlbmRlZF9oZWFkZXIgKGFiZmQpLT5yZXNlcnZlZDUsCi0JCShiZmRfYnl0ZSAqKSB0aGRyLnJlc2VydmVkNSk7Ci0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmIHRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotCi0gIC8qIFdyaXRlIG91dCB0aGUgY29weXJpZ2h0IGhlYWRlciBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ29QeVJpR2hUPSIsIDEwKTsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRoZHIuc3RhbXAsIHNpemVvZiAodGhkci5zdGFtcCksIDEsIGFiZmQpCi0JICAhPSBzaXplb2YgKHRoZHIuc3RhbXApKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHRoZHIuY29weXJpZ2h0TWVzc2FnZUxlbmd0aFswXSA9Ci0JbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgdGhkci5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoLCAxLCAxLCBhYmZkKSAhPSAxKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFRoZSBjb3B5cmlnaHQgbWVzc2FnZSBpcyBhIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmcuICovCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2UsCi0JCSAgICAgbmxtX2NvcHlyaWdodF9oZWFkZXIgKGFiZmQpLT5jb3B5cmlnaHRNZXNzYWdlTGVuZ3RoICsgMSwKLQkJICAgICAxLCBhYmZkKSAhPQotCSAgKChiZmRfc2l6ZV90eXBlKQotCSAgIG5sbV9jb3B5cmlnaHRfaGVhZGVyIChhYmZkKS0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCArIDEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBjdXN0b20gaGVhZGVyIGlmIHRoZXJlIGlzIG9uZS4gICAqLwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLSAgICAgIGJvb2xlYW4gZHM7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGhkckxlbmd0aDsKLQotICAgICAgZHMgPSBmaW5kX25vbnplcm8gKChQVFIpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YVN0YW1wLAotCQkJIHNpemVvZiAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5kYXRhU3RhbXApKTsKLSAgICAgIG1lbWNweSAodGhkci5zdGFtcCwgIkN1U3RIZUFkIiwgOCk7Ci0gICAgICBoZHJMZW5ndGggPSAoMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgKGRzID8gOCA6IDApCi0JCSAgICsgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIGhkckxlbmd0aCwgdGhkci5sZW5ndGgpOwotICAgICAgcHV0X3dvcmQgKGFiZmQsIChiZmRfdm1hKSBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFPZmZzZXQsCi0JCXRoZHIuZGF0YU9mZnNldCk7Ci0gICAgICBwdXRfd29yZCAoYWJmZCwgKGJmZF92bWEpIG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+ZGF0YUxlbmd0aCwKLQkJdGhkci5kYXRhTGVuZ3RoKTsKLSAgICAgIGlmICghIGRzKQotCXsKLQkgIEJGRF9BU1NFUlQgKG5sbV9jdXN0b21faGVhZGVyIChhYmZkKS0+aGRyTGVuZ3RoID09IDApOwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIDEsCi0JCQkgc2l6ZW9mICh0aGRyKSAtIHNpemVvZiAodGhkci5kYXRhU3RhbXApLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAodGhkcikgLSBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKHRoZHIuZGF0YVN0YW1wLCBubG1fY3VzdG9tX2hlYWRlciAoYWJmZCktPmRhdGFTdGFtcCwKLQkJICBzaXplb2YgKHRoZHIuZGF0YVN0YW1wKSk7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdGhkciwgc2l6ZW9mICh0aGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0aGRyKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGJmZF93cml0ZSAobmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHIsIDEsCi0JCQkgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgsIGFiZmQpCi0JICAgICAgIT0gbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgQ3lnbnVzIGRlYnVnZ2luZyBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAgKi8KLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKSwKLQkJICAgIHNpemVvZiAoTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSkpCi0gICAgewotICAgICAgTmxtX0V4dGVybmFsX0N1c3RvbV9IZWFkZXIgdGhkcjsKLQotICAgICAgbWVtY3B5ICh0aGRyLnN0YW1wLCAiQ3VTdEhlQWQiLCA4KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgMiAqIE5MTV9UQVJHRVRfTE9OR19TSVpFICsgOCwKLQkJKGJmZF9ieXRlICopIHRoZHIubGVuZ3RoKTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+b2Zmc2V0LAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhT2Zmc2V0KTsKLSAgICAgIHB1dF93b3JkIChhYmZkLCAoYmZkX3ZtYSkgbmxtX2N5Z251c19leHRfaGVhZGVyIChhYmZkKS0+bGVuZ3RoLAotCQkoYmZkX2J5dGUgKikgdGhkci5kYXRhTGVuZ3RoKTsKLSAgICAgIG1lbWNweSAodGhkci5kYXRhU3RhbXAsICJDeUduVXNFeCIsIDgpOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRoZHIsIHNpemVvZiAodGhkciksIDEsIGFiZmQpICE9IHNpemVvZiAodGhkcikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV2UgcmVhZCB0aGUgTkxNJ3MgcHVibGljIHN5bWJvbHMgYW5kIHVzZSBpdCB0byBnZW5lcmF0ZSBhIGJmZCBzeW1ib2wKLSAgIHRhYmxlIChoZXksIGl0J3MgYmV0dGVyIHRoYW4gbm90aGluZykgb24gYSBvbmUtZm9yLW9uZSBiYXNpcy4gIFRodXMKLSAgIHVzZSB0aGUgbnVtYmVyIG9mIHB1YmxpYyBzeW1ib2xzIGFzIHRoZSBudW1iZXIgb2YgYmZkIHN5bWJvbHMgd2Ugd2lsbAotICAgaGF2ZSBvbmNlIHdlIGFjdHVhbGx5IGdldCBhcm91bmQgdG8gcmVhZGluZyB0aGVtIGluLgotCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBob2xkIHRoZSBzeW10YWIgdmVjdG9yLCBiYXNlZCBvbgotICAgdGhlIGNvdW50IHBsdXMgMSwgc2luY2Ugd2Ugd2lsbCBOVUxMIHRlcm1pbmF0ZSB0aGUgdmVjdG9yIGFsbG9jYXRlZCBiYXNlZAotICAgb24gdGhpcyBzaXplLiAqLwotCi1sb25nCi1ubG1fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CS8qIE5sbSBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBsb25nIHN5bWNvdW50OwotICBsb25nIHN5bXRhYl9zaXplID0gMDsKLQotICBpX2Z4ZGhkcnAgPSBubG1fZml4ZWRfaGVhZGVyIChhYmZkKTsKLSAgc3ltY291bnQgPSAoaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3MKLQkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMKLQkgICAgICArIGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBzeW10YWJfc2l6ZSA9IChzeW1jb3VudCArIDEpICogKHNpemVvZiAoYXN5bWJvbCkpOwotICByZXR1cm4gKHN5bXRhYl9zaXplKTsKLX0KLQotLyogTm90ZSB0aGF0IGJmZF9nZXRfc3ltY291bnQgaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvIGlmIHNsdXJwaW5nIHRoZQotICAgc3ltYm9sIHRhYmxlIGZhaWxzLiAqLwotCi1sb25nCi1ubG1fZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIG5sbV9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLSAgYmZkX3NpemVfdHlwZSBjb3VudGVyID0gMDsKLQotICBpZiAobmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIC0xOwotICBzeW1iYXNlID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgd2hpbGUgKGNvdW50ZXIgPCBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSkKLSAgICB7Ci0gICAgICAqYWxvY2F0aW9uKysgPSAmc3ltYmFzZS0+c3ltYm9sOwotICAgICAgc3ltYmFzZSsrOwotICAgICAgY291bnRlcisrOwotICAgIH0KLSAgKmFsb2NhdGlvbiA9IChhc3ltYm9sICopIE5VTEw7Ci0gIHJldHVybiBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLX0KLQotLyogTWFrZSBhbiBOTE0gc3ltYm9sLiAgVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUuICAqLwotCi1hc3ltYm9sICoKLW5sbV9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBubG1fc3ltYm9sX3R5cGUgKm5ldzsKLQotICBuZXcgPSAobmxtX3N5bWJvbF90eXBlICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAobmxtX3N5bWJvbF90eXBlKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIEdldCBzeW1ib2wgaW5mb3JtYXRpb24uICAqLwotCi12b2lkCi1ubG1fZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLS8qIFByaW50IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0KLXZvaWQKLW5sbV9wcmludF9zeW1ib2wgKGFiZmQsIGFmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotCi0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLSAgICAgIGlmIChzeW1ib2wtPm5hbWUpCi0JZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICBiZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlLTVzIiwgc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLSAgICAgIGlmIChzeW1ib2wtPm5hbWUpCi0JZnByaW50ZiAoZmlsZSwgIiAlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFNsdXJwIGluIG5sbSBzeW1ib2wgdGFibGUuCi0KLSAgIEluIHRoZSBleHRlcm5hbCAoaW4tZmlsZSkgZm9ybSwgTkxNIGV4cG9ydCByZWNvcmRzIGFyZSB2YXJpYWJsZSBsZW5ndGgsCi0gICB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybToKLQotCTEgYnl0ZQkJbGVuZ3RoIG9mIHRoZSBzeW1ib2wgbmFtZSAoTikKLQlOIGJ5dGVzCQl0aGUgc3ltYm9sIG5hbWUKLQk0IGJ5dGVzCQl0aGUgc3ltYm9sIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGl0J3Mgc2VjdGlvbgotCi0gICBXZSBhbHNvIHJlYWQgaW4gdGhlIGRlYnVnZ2luZyBzeW1ib2xzIGFuZCBpbXBvcnQgcmVjb3Jkcy4gIEltcG9ydAotICAgcmVjb3JkcyBhcmUgdHJlYXRlZCBhcyB1bmRlZmluZWQgc3ltYm9scy4gIEFzIHdlIHJlYWQgdGhlIGltcG9ydAotICAgcmVjb3JkcyB3ZSBhbHNvIHJlYWQgaW4gdGhlIGFzc29jaWF0ZWQgcmVsb2MgaW5mb3JtYXRpb24sIHdoaWNoIGlzCi0gICBhdHRhY2hlZCB0byB0aGUgc3ltYm9sLgotCi0gICBUaGUgYmZkIHN5bWJvbHMgYXJlIGNvcGllZCB0byBTWU1QVFJTLgotCi0gICBXaGVuIHdlIHJldHVybiwgdGhlIGJmZCBzeW1jb3VudCBpcyBlaXRoZXIgemVybyBvciBjb250YWlucyB0aGUgY29ycmVjdAotICAgbnVtYmVyIG9mIHN5bWJvbHMuCi0qLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICppX2Z4ZGhkcnA7CS8qIE5sbSBmaWxlIGhlYWRlciwgaW50ZXJuYWwgZm9ybSAqLwotICBiZmRfc2l6ZV90eXBlIHRvdHN5bWNvdW50OwkvKiBOdW1iZXIgb2YgTkxNIHN5bWJvbHMgKi8KLSAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsJLyogQ291bnRlciBvZiBOTE0gc3ltYm9scyAqLwotICBubG1fc3ltYm9sX3R5cGUgKnN5bTsJCS8qIFBvaW50ZXIgdG8gY3VycmVudCBiZmQgc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltbGVuZ3RoOwkvKiBTeW1ib2wgbGVuZ3RoIHJlYWQgaW50byBoZXJlICovCi0gIHVuc2lnbmVkIGNoYXIgc3ltdHlwZTsJLyogVHlwZSBvZiBkZWJ1Z2dpbmcgc3ltYm9sICovCi0gIGJmZF9ieXRlIHRlbXBbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwkvKiBTeW1ib2wgb2Zmc2V0cyByZWFkIGludG8gaGVyZSAqLwotICBib29sZWFuICgqcmVhZF9pbXBvcnRfZnVuYykgUEFSQU1TICgoYmZkICosIG5sbV9zeW1ib2xfdHlwZSAqKSk7Ci0gIGJvb2xlYW4gKCpzZXRfcHVibGljX3NlY3Rpb25fZnVuYykgUEFSQU1TICgoYmZkICosIG5sbV9zeW1ib2xfdHlwZSAqKSk7Ci0KLSAgaWYgKG5sbV9nZXRfc3ltYm9scyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gKHRydWUpOwotCi0gIC8qIFJlYWQgZWFjaCByYXcgTkxNIHN5bWJvbCwgdXNpbmcgdGhlIGluZm9ybWF0aW9uIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBiZmQKLSAgICAgc3ltYm9sIHRhYmxlIGVudHJ5LgotCi0gICAgIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSB0aGUgaW5pdGlhbCBiZmQgY2Fub25pY2FsIHN5bWJvbCBidWZmZXIgYmFzZWQgb24gYQotICAgICBvbmUtdG8tb25lIG1hcHBpbmcgb2YgdGhlIE5MTSBzeW1ib2xzIHRvIGNhbm9uaWNhbCBzeW1ib2xzLiAgV2UgYWN0dWFsbHkKLSAgICAgdXNlIGFsbCB0aGUgTkxNIHN5bWJvbHMsIHNvIHRoZXJlIHdpbGwgYmUgbm8gc3BhY2UgbGVmdCBvdmVyIGF0IHRoZSBlbmQuCi0gICAgIFdoZW4gd2UgaGF2ZSBhbGwgdGhlIHN5bWJvbHMsIHdlIGJ1aWxkIHRoZSBjYWxsZXIncyBwb2ludGVyIHZlY3Rvci4gKi8KLQotICBhYmZkLT5zeW1jb3VudCA9IDA7Ci0gIGlfZnhkaGRycCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpOwotICB0b3RzeW1jb3VudCA9IChpX2Z4ZGhkcnAtPm51bWJlck9mUHVibGljcwotCQkgKyBpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzCi0JCSArIGlfZnhkaGRycC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBpZiAodG90c3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+cHVibGljc09mZnNldCwgU0VFS19TRVQpID09IC0xKQotICAgIHJldHVybiAoZmFsc2UpOwotCi0gIHN5bSA9ICgobmxtX3N5bWJvbF90eXBlICopCi0JIGJmZF96YWxsb2MgKGFiZmQsIHRvdHN5bWNvdW50ICogc2l6ZW9mIChubG1fc3ltYm9sX3R5cGUpKSk7Ci0gIGlmICghc3ltKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmxtX3NldF9zeW1ib2xzIChhYmZkLCBzeW0pOwotCi0gIC8qIFdlIHVzZSB0aGUgYmZkJ3Mgc3ltY291bnQgZGlyZWN0bHkgYXMgdGhlIGNvbnRyb2wgY291bnQsIHNvIHRoYXQgZWFybHkKLSAgICAgdGVybWluYXRpb24gb2YgdGhlIGxvb3AgbGVhdmVzIHRoZSBzeW1jb3VudCBjb3JyZWN0IGZvciB0aGUgc3ltYm9scyB0aGF0Ci0gICAgIHdlcmUgcmVhZC4gKi8KLQotICBzZXRfcHVibGljX3NlY3Rpb25fZnVuYyA9IG5sbV9zZXRfcHVibGljX3NlY3Rpb25fZnVuYyAoYWJmZCk7Ci0gIHN5bWNvdW50ID0gaV9meGRoZHJwLT5udW1iZXJPZlB1YmxpY3M7Ci0gIHdoaWxlIChhYmZkLT5zeW1jb3VudCA8IHN5bWNvdW50KQotICAgIHsKLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBzeW1sZW5ndGgsIHNpemVvZiAoc3ltbGVuZ3RoKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoc3ltbGVuZ3RoKSkKLQlyZXR1cm4gKGZhbHNlKTsKLSAgICAgIHN5bS0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotICAgICAgc3ltLT5zeW1ib2wubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3ltbGVuZ3RoICsgMSk7Ci0gICAgICBpZiAoIXN5bS0+c3ltYm9sLm5hbWUpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBzeW0tPnN5bWJvbC5uYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpCi0JICAhPSBzeW1sZW5ndGgpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICAvKiBDYXN0IGF3YXkgY29uc3QuICAqLwotICAgICAgKChjaGFyICopIChzeW0tPnN5bWJvbC5uYW1lKSlbc3ltbGVuZ3RoXSA9ICdcMCc7Ci0gICAgICBpZiAoYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0JcmV0dXJuIChmYWxzZSk7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyA9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOwotICAgICAgc3ltLT5zeW1ib2wudmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgdGVtcCk7Ci0gICAgICBpZiAoc2V0X3B1YmxpY19zZWN0aW9uX2Z1bmMpCi0JewotCSAgLyogTW9zdCBiYWNrZW5kcyBjYW4gdXNlIHRoZSBjb2RlIGJlbG93LCBidXQgdW5mb3J0dW5hdGVseQotCSAgICAgc29tZSB1c2UgYSBkaWZmZXJlbnQgc2NoZW1lLiAgKi8KLQkgIGlmICgoKnNldF9wdWJsaWNfc2VjdGlvbl9mdW5jKSAoYWJmZCwgc3ltKSA9PSBmYWxzZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc3ltLT5zeW1ib2wudmFsdWUgJiBOTE1fSElCSVQpCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+TkxNX0hJQklUOwotCSAgICAgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9DT0RFX05BTUUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0KLQkJYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotCSAgICB9Ci0JfQotICAgICAgc3ltLT5yY250ID0gMDsKLSAgICAgIGFiZmQtPnN5bWNvdW50Kys7Ci0gICAgICBzeW0rKzsKLSAgICB9Ci0KLSAgLyogUmVhZCB0aGUgZGVidWdnaW5nIHJlY29yZHMuICAqLwotCi0gIGlmIChpX2Z4ZGhkcnAtPm51bWJlck9mRGVidWdSZWNvcmRzID4gMCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+ZGVidWdJbmZvT2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEpCi0JcmV0dXJuIChmYWxzZSk7Ci0KLSAgICAgIHN5bWNvdW50ICs9IGlfZnhkaGRycC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHM7Ci0gICAgICB3aGlsZSAoYWJmZC0+c3ltY291bnQgPCBzeW1jb3VudCkKLQl7Ci0JICBpZiAoKGJmZF9yZWFkICgoUFRSKSAmIHN5bXR5cGUsIHNpemVvZiAoc3ltdHlwZSksIDEsIGFiZmQpCi0JICAgICAgICE9IHNpemVvZiAoc3ltdHlwZSkpCi0JICAgfHwgYmZkX3JlYWQgKChQVFIpIHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkKLQkgICAgICB8fCAoYmZkX3JlYWQgKChQVFIpICYgc3ltbGVuZ3RoLCBzaXplb2YgKHN5bWxlbmd0aCksIDEsIGFiZmQpCi0JCSAgIT0gc2l6ZW9mIChzeW1sZW5ndGgpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3ltLT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JICBzeW0tPnN5bWJvbC5uYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzeW1sZW5ndGggKyAxKTsKLQkgIGlmICghc3ltLT5zeW1ib2wubmFtZSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSBzeW0tPnN5bWJvbC5uYW1lLCBzeW1sZW5ndGgsIDEsIGFiZmQpCi0JICAgICAgIT0gc3ltbGVuZ3RoKQotCSAgICByZXR1cm4gKGZhbHNlKTsKLQkgIC8qIENhc3QgYXdheSBjb25zdC4gICovCi0JICAoKGNoYXIgKikgKHN5bS0+c3ltYm9sLm5hbWUpKVtzeW1sZW5ndGhdID0gJ1wwJzsKLQkgIHN5bS0+c3ltYm9sLmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgc3ltLT5zeW1ib2wudmFsdWUgPSBnZXRfd29yZCAoYWJmZCwgdGVtcCk7Ci0JICBpZiAoc3ltdHlwZSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9Ci0JCWJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3ltdHlwZSA9PSAxKQotCSAgICB7Ci0JICAgICAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPQotCQliZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX0NPREVfTkFNRSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCSAgICB9Ci0JICBzeW0tPnJjbnQgPSAwOwotCSAgYWJmZC0+c3ltY291bnQrKzsKLQkgIHN5bSsrOwotCX0KLSAgICB9Ci0KLSAgLyogUmVhZCBpbiB0aGUgaW1wb3J0IHJlY29yZHMuICBXZSBjYW4gb25seSBkbyB0aGlzIGlmIHdlIGtub3cgaG93Ci0gICAgIHRvIHJlYWQgcmVsb2NzIGZvciB0aGlzIHRhcmdldC4gICovCi0KLSAgcmVhZF9pbXBvcnRfZnVuYyA9IG5sbV9yZWFkX2ltcG9ydF9mdW5jIChhYmZkKTsKLSAgaWYgKHJlYWRfaW1wb3J0X2Z1bmMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGlfZnhkaGRycC0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0LCBTRUVLX1NFVCkKLQkgID09IC0xKQotCXJldHVybiAoZmFsc2UpOwotCi0gICAgICBzeW1jb3VudCArPSBpX2Z4ZGhkcnAtPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOwotICAgICAgd2hpbGUgKGFiZmQtPnN5bWNvdW50IDwgc3ltY291bnQpCi0JewotCSAgaWYgKCgqcmVhZF9pbXBvcnRfZnVuYykgKGFiZmQsIHN5bSkgPT0gZmFsc2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHN5bSsrOwotCSAgYWJmZC0+c3ltY291bnQrKzsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodHJ1ZSk7Ci19Ci0MCi0vKiBHZXQgdGhlIHJlbG9jcyBmb3IgYW4gTkxNIGZpbGUuICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHJlbG9jcy4KLSAgIEltcG9ydHMgYXJlIHJlbG9jcyBhZ2FpbnN0IHN5bWJvbHMgZGVmaW5lZCBpbiBvdGhlciBOTE0gZmlsZXMuICBXZQotICAgdHJlYXQgdGhlc2UgYXMgcmVsb2NzIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMuICBSZWxvY2F0aW9uIGZpeHVwcwotICAgYXJlIGludGVybmFsIHJlbG9jcy4KLQotICAgVGhlIGFjdHVhbCBmb3JtYXQgdXNlZCB0byBzdG9yZSB0aGUgcmVsb2NzIGlzIG1hY2hpbmUgc3BlY2lmaWMuICAqLwotCi0vKiBSZWFkIGluIHRoZSByZWxvY2F0aW9uIGZpeHVwIGluZm9ybWF0aW9uLiAgVGhpcyBpcyBzdG9yZWQgaW4KLSAgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwcywgYW4gYXJyYXkgb2YgYXJlbGVudCBzdHJ1Y3R1cmVzLCBhbmQKLSAgIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MsIGFuIGFycmF5IG9mIHNlY3Rpb24gcG9pbnRlcnMuICBUaGUKLSAgIHNlY3Rpb24gcG9pbnRlcnMgYXJlIG5lZWRlZCBiZWNhdXNlIHRoZSByZWxvY3MgYXJlIG5vdCBzb3J0ZWQgYnkKLSAgIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX3NsdXJwX3JlbG9jX2ZpeHVwcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBib29sZWFuICgqcmVhZF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgbmxtX3N5bWJvbF90eXBlICosIGFzZWN0aW9uICoqLAotCQkJCWFyZWxlbnQgKikpOwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICBhcmVsZW50ICpyZWxzOwotICBhc2VjdGlvbiAqKnNlY3M7Ci0KLSAgaWYgKG5sbV9yZWxvY2F0aW9uX2ZpeHVwcyAoYWJmZCkgIT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmVhZF9mdW5jID0gbmxtX3JlYWRfcmVsb2NfZnVuYyAoYWJmZCk7Ci0gIGlmIChyZWFkX2Z1bmMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQsCi0JCVNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb3VudCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0gIHJlbHMgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHNlY3MgPSAoYXNlY3Rpb24gKiopIGJmZF9hbGxvYyAoYWJmZCwgY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKChyZWxzID09IE5VTEwgfHwgc2VjcyA9PSBOVUxMKSAmJiBjb3VudCAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKSA9IHJlbHM7Ci0gIG5sbV9yZWxvY2F0aW9uX2ZpeHVwX3NlY3MgKGFiZmQpID0gc2VjczsKLQotICAvKiBXZSBoYXZlIHRvIHJlYWQgcGllY2UgYnkgcGllY2UsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgbGFyZ2UKLSAgICAgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcmVsb2MgaW5mb3JtYXRpb24gaXMuICAqLwotICB3aGlsZSAoY291bnQtLSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoKnJlYWRfZnVuYykgKGFiZmQsIChubG1fc3ltYm9sX3R5cGUgKikgTlVMTCwgc2VjcywgcmVscykgPT0gZmFsc2UpCi0JewotCSAgbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKSA9IE5VTEw7Ci0JICBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzIChhYmZkKSA9IE5VTEw7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKytzZWNzOwotICAgICAgKytyZWxzOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBudW1iZXIgb2YgcmVsb2NzLiAgVGhpcyByZWFsbHkganVzdCByZXR1cm5zIGFuIHVwcGVyIGJvdW5kLAotICAgc2luY2UgaXQgZG9lcyBub3QgYXR0ZW1wdCB0byBkaXN0aW5ndWlzaCB0aGVtIGJhc2VkIG9uIHRoZSBzZWN0aW9uLgotICAgVGhhdCB3aWxsIGJlIGhhbmRsZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseSByZWFkLiAgKi8KLQotbG9uZwotbmxtX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIG5sbV9zeW1ib2xfdHlwZSAqc3ltczsKLSAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgdW5zaWduZWQgaW50IHJldDsKLQotICAvKiBJZiB3ZSBkb24ndCBrbm93IGhvdyB0byByZWFkIHJlbG9jcywganVzdCByZXR1cm4gMC4gICovCi0gIGlmIChubG1fcmVhZF9yZWxvY19mdW5jIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgZWl0aGVyIHRoZSBjb2RlIG9yIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIChTRUNfQ09ERSB8IFNFQ19EQVRBKSkgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBzeW1zID0gbmxtX2dldF9zeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobmxtX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0JcmV0dXJuIC0xOwotICAgICAgc3ltcyA9IG5sbV9nZXRfc3ltYm9scyAoYWJmZCk7Ci0gICAgfQotCi0gIHJldCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0KLSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgd2hpbGUgKGNvdW50LS0gIT0gMCkKLSAgICB7Ci0gICAgICByZXQgKz0gc3ltcy0+cmNudDsKLSAgICAgICsrc3ltczsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZXQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotLyogR2V0IHRoZSByZWxvY3MgdGhlbXNlbHZlcy4gICovCi0KLWxvbmcKLW5sbV9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIHNlYywgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFyZWxlbnQgKipyZWxwdHI7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICBhcmVsZW50ICpyZWxzOwotICBhc2VjdGlvbiAqKnNlY3M7Ci0gIGJmZF9zaXplX3R5cGUgY291bnQsIGk7Ci0gIHVuc2lnbmVkIGludCByZXQ7Ci0KLSAgLyogR2V0IHRoZSByZWxvY2F0aW9uIGZpeHVwcy4gICovCi0gIHJlbHMgPSBubG1fcmVsb2NhdGlvbl9maXh1cHMgKGFiZmQpOwotICBpZiAocmVscyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChubG1fc2x1cnBfcmVsb2NfZml4dXBzIChhYmZkKSA9PSBmYWxzZSkKLQlyZXR1cm4gLTE7Ci0gICAgICByZWxzID0gbmxtX3JlbG9jYXRpb25fZml4dXBzIChhYmZkKTsKLSAgICB9Ci0gIHNlY3MgPSBubG1fcmVsb2NhdGlvbl9maXh1cF9zZWNzIChhYmZkKTsKLQotICByZXQgPSAwOwotICBjb3VudCA9IG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCByZWxzKyssIHNlY3MrKykKLSAgICB7Ci0gICAgICBpZiAoKnNlY3MgPT0gc2VjKQotCXsKLQkgICpyZWxwdHIrKyA9IHJlbHM7Ci0JICArK3JldDsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgaW1wb3J0IHN5bWJvbHMuICAqLwotICBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltYm9scysrKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLQotICAgICAgc3ltID0gKnN5bWJvbHM7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltKSA9PSBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyKQotCXsKLQkgIG5sbV9zeW1ib2xfdHlwZSAqbmxtX3N5bTsKLQkgIGJmZF9zaXplX3R5cGUgajsKLQotCSAgbmxtX3N5bSA9IChubG1fc3ltYm9sX3R5cGUgKikgc3ltOwotCSAgZm9yIChqID0gMDsgaiA8IG5sbV9zeW0tPnJjbnQ7IGorKykKLQkgICAgewotCSAgICAgIGlmIChubG1fc3ltLT5yZWxvY3Nbal0uc2VjdGlvbiA9PSBzZWMpCi0JCXsKLQkJICAqcmVscHRyID0gJm5sbV9zeW0tPnJlbG9jc1tqXS5yZWxvYzsKLQkJICAoKnJlbHB0ciktPnN5bV9wdHJfcHRyID0gc3ltYm9sczsKLQkJICArK3JlbHB0cjsKLQkJICArK3JldDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAqcmVscHRyID0gTlVMTDsKLQotICByZXR1cm4gcmV0OwotfQotDAotLyogQ29tcHV0ZSB0aGUgc2VjdGlvbiBmaWxlIHBvc2l0aW9ucyBmb3IgYW4gTkxNIGZpbGUuICBBbGwgdmFyaWFibGUKLSAgIGxlbmd0aCBkYXRhIGluIHRoZSBmaWxlIGhlYWRlcnMgbXVzdCBiZSBzZXQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMKLSAgIGNhbGxlZC4gIElmIHRoZSB2YXJpYWJsZSBsZW5ndGggZGF0YSBpcyBjaGFuZ2VkIGxhdGVyLCB0aGUKLSAgIHJlc3VsdGluZyBvYmplY3QgZmlsZSB3aWxsIGJlIGluY29ycmVjdC4gIFVuZm9ydHVuYXRlbHksIHRoZXJlIGlzCi0gICBubyB3YXkgdG8gY2hlY2sgdGhpcy4KLQotICAgVGhpcyByb3V0aW5lIGFsc28gc2V0cyB0aGUgU2l6ZSBhbmQgT2Zmc2V0IGZpZWxkcyBpbiB0aGUgZml4ZWQKLSAgIGhlYWRlci4KLQotICAgSXQgYWxzbyBsb29rcyBvdmVyIHRoZSBzeW1ib2xzIGFuZCBtb3ZlcyBhbnkgY29tbW9uIHN5bWJvbHMgaW50bwotICAgdGhlIC5ic3Mgc2VjdGlvbjsgTkxNIGhhcyBubyB3YXkgdG8gcmVwcmVzZW50IGEgY29tbW9uIHN5bWJvbC4KLSAgIFRoaXMgYXBwcm9hY2ggbWVhbnMgdGhhdCBlaXRoZXIgdGhlIHN5bWJvbHMgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbgotICAgc2V0IGF0IHRoaXMgcG9pbnQsIG9yIHRoZXJlIG11c3QgYmUgbm8gY29tbW9uIHN5bWJvbHMuICBXZSBuZWVkIHRvCi0gICBtb3ZlIHRoZSBzeW1ib2xzIGF0IHRoaXMgcG9pbnQgc28gdGhhdCBtYW5nbGVfcmVsb2NzIGNhbiBzZWUgdGhlCi0gICBmaW5hbCB2YWx1ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBmaWxlX3B0ciBzb2ZhcjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgYmZkX3ZtYSB0ZXh0LCBkYXRhLCBic3M7Ci0gIGJmZF92bWEgdGV4dF9sb3csIGRhdGFfbG93OwotICB1bnNpZ25lZCBpbnQgdGV4dF9hbGlnbiwgZGF0YV9hbGlnbiwgb3RoZXJfYWxpZ247Ci0gIGZpbGVfcHRyIHRleHRfcHRyLCBkYXRhX3B0ciwgb3RoZXJfcHRyOwotICBhc2VjdGlvbiAqYnNzX3NlYzsKLSAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IHRydWUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzZWN0aW9uIHRvIGhvbGQgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLSAgYnNzX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAoYnNzX3NlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghYWRkX2JmZF9zZWN0aW9uIChhYmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUsCi0JCQkgICAgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSkgMCwKLQkJCSAgICBTRUNfQUxMT0MpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJzc19zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgICB9Ci0KLSAgYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9IHRydWU7Ci0KLSAgLyogVGhlIGZpeGVkIGhlYWRlci4gICovCi0gIHNvZmFyID0gbmxtX29wdGlvbmFsX3ByZWZpeF9zaXplIChhYmZkKSArIG5sbV9maXhlZF9oZWFkZXJfc2l6ZSAoYWJmZCk7Ci0KLSAgLyogVGhlIHZhcmlhYmxlIGhlYWRlci4gICovCi0gIHNvZmFyICs9IChzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5kZXNjcmlwdGlvbkxlbmd0aCkKLQkgICAgKyBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+ZGVzY3JpcHRpb25MZW5ndGggKyAxCi0JICAgICsgTkxNX1RBUkdFVF9MT05HX1NJWkUJLyogc3RhY2tTaXplICovCi0JICAgICsgTkxNX1RBUkdFVF9MT05HX1NJWkUJLyogcmVzZXJ2ZWQgKi8KLQkgICAgKyBzaXplb2YgKG5sbV92YXJpYWJsZV9oZWFkZXIgKGFiZmQpLT5vbGRUaHJlYWROYW1lKQotCSAgICArIHNpemVvZiAobmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGgpCi0JICAgICsgbmxtX3ZhcmlhYmxlX2hlYWRlciAoYWJmZCktPnNjcmVlbk5hbWVMZW5ndGggKyAxCi0JICAgICsgc2l6ZW9mIChubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCkKLQkgICAgKyBubG1fdmFyaWFibGVfaGVhZGVyIChhYmZkKS0+dGhyZWFkTmFtZUxlbmd0aCArIDEpOwotCi0gIC8qIFRoZSBhdXhpbGlhcnkgaGVhZGVycy4gICovCi0gIGlmIChmaW5kX25vbnplcm8gKChQVFIpIG5sbV92ZXJzaW9uX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcikpKQotICAgIHNvZmFyICs9IHNpemVvZiAoTmxtX0V4dGVybmFsX1ZlcnNpb25fSGVhZGVyKTsKLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2V4dGVuZGVkX2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSBzaXplb2YgKE5sbV9FeHRlcm5hbF9FeHRlbmRlZF9IZWFkZXIpOwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCksCi0JCSAgICBzaXplb2YgKE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKSkpCi0gICAgc29mYXIgKz0gKHNpemVvZiAoTmxtX0V4dGVybmFsX0NvcHlyaWdodF9IZWFkZXIpCi0JICAgICAgKyBubG1fY29weXJpZ2h0X2hlYWRlciAoYWJmZCktPmNvcHlyaWdodE1lc3NhZ2VMZW5ndGggKyAxKTsKLSAgaWYgKGZpbmRfbm9uemVybyAoKFBUUikgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcikpKQotICAgIHNvZmFyICs9IChzaXplb2YgKE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyKQotCSAgICAgICsgbmxtX2N1c3RvbV9oZWFkZXIgKGFiZmQpLT5oZHJMZW5ndGgpOwotICBpZiAoZmluZF9ub256ZXJvICgoUFRSKSBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKGFiZmQpLAotCQkgICAgc2l6ZW9mIChObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIpKSkKLSAgICBzb2ZhciArPSBzaXplb2YgKE5sbV9FeHRlcm5hbF9DdXN0b21fSGVhZGVyKTsKLQotICAvKiBDb21wdXRlIHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zIGluIHR3byBwYXNzZXMuICBGaXJzdCBnZXQgdGhlCi0gICAgIHNpemVzIG9mIHRoZSB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zLCBhbmQgdGhlbiBzZXQgdGhlIGZpbGUKLSAgICAgcG9zaXRpb25zLiAgVGhpcyBjb2RlIGFsaWducyB0aGUgc2VjdGlvbnMgaW4gdGhlIGZpbGUgdXNpbmcgdGhlCi0gICAgIHNhbWUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyB0aGF0IGFwcGx5IHRvIHRoZSBzZWN0aW9ucyBpbiBtZW1vcnk7Ci0gICAgIHRoaXMgbWF5IG5vdCBiZSBuZWNlc3NhcnkuICAqLwotICB0ZXh0ID0gMDsKLSAgdGV4dF9sb3cgPSAoYmZkX3ZtYSkgLSAxOwotICB0ZXh0X2FsaWduID0gMDsKLSAgZGF0YSA9IDA7Ci0gIGRhdGFfbG93ID0gKGJmZF92bWEpIC0gMTsKLSAgZGF0YV9hbGlnbiA9IDA7Ci0gIGJzcyA9IDA7Ci0gIG90aGVyX2FsaWduID0gMDsKLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZjsKLQotICAgICAgc2VjLT5fcmF3X3NpemUgPSBCRkRfQUxJR04gKHNlYy0+X3Jhd19zaXplLCAxIDw8IHNlYy0+YWxpZ25tZW50X3Bvd2VyKTsKLQotICAgICAgZiA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLSAgICAgIGlmIChmICYgU0VDX0NPREUpCi0JewotCSAgdGV4dCArPSBzZWMtPl9yYXdfc2l6ZTsKLQkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpIDwgdGV4dF9sb3cpCi0JICAgIHRleHRfbG93ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKLQkgIGlmIChzZWMtPmFsaWdubWVudF9wb3dlciA+IHRleHRfYWxpZ24pCi0JICAgIHRleHRfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChmICYgU0VDX0RBVEEpCi0JewotCSAgZGF0YSArPSBzZWMtPl9yYXdfc2l6ZTsKLQkgIGlmIChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpIDwgZGF0YV9sb3cpCi0JICAgIGRhdGFfbG93ID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKLQkgIGlmIChzZWMtPmFsaWdubWVudF9wb3dlciA+IGRhdGFfYWxpZ24pCi0JICAgIGRhdGFfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChmICYgU0VDX0hBU19DT05URU5UUykKLQl7Ci0JICBpZiAoc2VjLT5hbGlnbm1lbnRfcG93ZXIgPiBvdGhlcl9hbGlnbikKLQkgICAgb3RoZXJfYWxpZ24gPSBzZWMtPmFsaWdubWVudF9wb3dlcjsKLQl9Ci0gICAgICBlbHNlIGlmIChmICYgU0VDX0FMTE9DKQotCWJzcyArPSBzZWMtPl9yYXdfc2l6ZTsKLSAgICB9Ci0KLSAgbmxtX3NldF90ZXh0X2xvdyAoYWJmZCwgdGV4dF9sb3cpOwotICBubG1fc2V0X2RhdGFfbG93IChhYmZkLCBkYXRhX2xvdyk7Ci0KLSAgaWYgKG5sbV9ub191bmluaXRpYWxpemVkX2RhdGEgKGFiZmQpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgTmV0V2FyZSBmb3JtYXQgZG9lcyBub3QgdXNlIHVuaW5pdGlhbGl6ZWQgZGF0YS4gIFdlIG11c3QKLQkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGRhdGEgc2VjdGlvbi4gIFdlIHdpbGwgbmV2ZXIgd2luZCB1cAotCSB3cml0aW5nIHRob3NlIGZpbGUgbG9jYXRpb25zLCBzbyB0aGV5IHdpbGwgcmVtYWluIHplcm8uICAqLwotICAgICAgZGF0YSArPSBic3M7Ci0gICAgICBic3MgPSAwOwotICAgIH0KLQotICB0ZXh0X3B0ciA9IEJGRF9BTElHTiAoc29mYXIsIDEgPDwgdGV4dF9hbGlnbik7Ci0gIGRhdGFfcHRyID0gQkZEX0FMSUdOICh0ZXh0X3B0ciArIHRleHQsIDEgPDwgZGF0YV9hbGlnbik7Ci0gIG90aGVyX3B0ciA9IEJGRF9BTElHTiAoZGF0YV9wdHIgKyBkYXRhLCAxIDw8IG90aGVyX2FsaWduKTsKLQotICAvKiBGaWxsIGluIHNvbWUgZmllbGRzIGluIHRoZSBoZWFkZXIgZm9yIHdoaWNoIHdlIG5vdyBoYXZlIHRoZQotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQgPSB0ZXh0X3B0cjsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZVNpemUgPSB0ZXh0OwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGF0YUltYWdlT2Zmc2V0ID0gZGF0YV9wdHI7Ci0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VTaXplID0gZGF0YTsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSA9IGJzczsKLQotICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICB7Ci0gICAgICBmbGFnd29yZCBmOwotCi0gICAgICBmID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpOwotCi0gICAgICBpZiAoZiAmIFNFQ19DT0RFKQotCXsKLQkgIHNlYy0+ZmlsZXBvcyA9IHRleHRfcHRyOwotCSAgdGV4dF9wdHIgKz0gc2VjLT5fcmF3X3NpemU7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19EQVRBKQotCXsKLQkgIHNlYy0+ZmlsZXBvcyA9IGRhdGFfcHRyOwotCSAgZGF0YV9wdHIgKz0gc2VjLT5fcmF3X3NpemU7Ci0JfQotICAgICAgZWxzZSBpZiAoZiAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JewotCSAgc2VjLT5maWxlcG9zID0gb3RoZXJfcHRyOwotCSAgb3RoZXJfcHRyICs9IHNlYy0+X3Jhd19zaXplOwotCX0KLSAgICB9Ci0KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnJlbG9jYXRpb25GaXh1cE9mZnNldCA9IG90aGVyX3B0cjsKLQotICAvKiBNb3ZlIGFsbCBjb21tb24gc3ltYm9scyBpbnRvIHRoZSAuYnNzIHNlY3Rpb24uICAqLwotCi0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bV9wdHJfcHRyICE9IE5VTEwpCi0gICAgewotICAgICAgYXN5bWJvbCAqKnN5bV9lbmQ7Ci0gICAgICBiZmRfdm1hIGFkZDsKLQotICAgICAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgICBhZGQgPSAwOwotICAgICAgZm9yICg7IHN5bV9wdHJfcHRyIDwgc3ltX2VuZDsgc3ltX3B0cl9wdHIrKykKLQl7Ci0JICBhc3ltYm9sICpzeW07Ci0JICBiZmRfdm1hIHNpemU7Ci0KLQkgIHN5bSA9ICpzeW1fcHRyX3B0cjsKLQotCSAgaWYgKCFiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBQdXQgdGhlIGNvbW1vbiBzeW1ib2wgaW4gdGhlIC5ic3Mgc2VjdGlvbiwgYW5kIGluY3JlYXNlCi0JICAgICB0aGUgc2l6ZSBvZiB0aGUgLmJzcyBzZWN0aW9uIGJ5IHRoZSBzaXplIG9mIHRoZSBjb21tb24KLQkgICAgIHN5bWJvbCAod2hpY2ggaXMgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgc3ltYm9sKS4gICovCi0JICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgc2l6ZSA9IHN5bS0+dmFsdWU7Ci0JICBzeW0tPnZhbHVlID0gYnNzX3NlYy0+X3Jhd19zaXplICsgYWRkOwotCSAgYWRkICs9IHNpemU7Ci0JICBhZGQgPSBCRkRfQUxJR04gKGFkZCwgMSA8PCBic3Nfc2VjLT5hbGlnbm1lbnRfcG93ZXIpOwotCX0KLSAgICAgIGlmIChhZGQgIT0gMCkKLQl7Ci0JICBpZiAobmxtX25vX3VuaW5pdGlhbGl6ZWRfZGF0YSAoYWJmZCkpCi0JICAgIHsKLQkgICAgICAvKiBXZSBjb3VsZCBoYW5kbGUgdGhpcyBjYXNlLCBidXQgc28gZmFyIGl0IGhhc24ndCBiZWVuCi0JCSBuZWNlc3NhcnkuICAqLwotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+dW5pbml0aWFsaXplZERhdGFTaXplICs9IGFkZDsKLQkgIGJzc19zZWMtPl9yYXdfc2l6ZSArPSBhZGQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24uICBUbyBkbyB0aGlzIHdlIG5lZWQgdG8ga25vdyB3aGVyZQotICAgdGhlIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgbG9jYXRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuICBUaGF0IG1lYW5zCi0gICB0aGF0IHRoZSBzaXplcyBvZiBhbGwgdGhlIHNlY3Rpb25zIG11c3QgYmUgc2V0LCBhbmQgYWxsIHRoZQotICAgdmFyaWFibGUgc2l6ZSBoZWFkZXIgaW5mb3JtYXRpb24gbXVzdCBiZSBrbm93bi4gICovCi0KLWJvb2xlYW4KLW5sbV9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZQotICAgICAgJiYgbmxtX2NvbXB1dGVfc2VjdGlvbl9maWxlX3Bvc2l0aW9ucyAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIGkzODYgTmV0V2FyZSBoYXMgYSB2ZXJ5IHJlc3RyaWN0ZWQgc2V0IG9mIHJlbG9jcy4gIEluIG9yZGVyIGZvcgotICAgICBvYmpjb3B5IHRvIHdvcmssIHRoZSBOTE0gaTM4NiBiYWNrZW5kIG5lZWRzIGEgY2hhbmNlIHRvIHJld29yawotICAgICB0aGUgc2VjdGlvbiBjb250ZW50cyBzbyB0aGF0IGl0cyBzZXQgb2YgcmVsb2NzIHdpbGwgd29yay4gIElmIGFsbAotICAgICB0aGUgcmVsb2NzIGFyZSBhbHJlYWR5IGFjY2VwdGFibGUsIHRoaXMgd2lsbCBub3QgZG8gYW55dGhpbmcuICAqLwotICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBib29sZWFuICgqbWFuZ2xlX3JlbG9jc19mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLAotCQkJCQkgICAgIGJmZF92bWEsIGJmZF9zaXplX3R5cGUpKTsKLQotICAgICAgbWFuZ2xlX3JlbG9jc19mdW5jID0gbmxtX21hbmdsZV9yZWxvY3NfZnVuYyAoYWJmZCk7Ci0gICAgICBpZiAobWFuZ2xlX3JlbG9jc19mdW5jICE9IE5VTEwpCi0JewotCSAgaWYgKCEoKm1hbmdsZV9yZWxvY3NfZnVuYykgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLAotCQkJCSAgICAgIChiZmRfdm1hKSBvZmZzZXQsIGNvdW50KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIChzZWN0aW9uLT5maWxlcG9zICsgb2Zmc2V0KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF93cml0ZSAobG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdlIG5lZWQgdG8gc29ydCBhIGxpc3Qgb2YgcmVsb2NzIGFzc29jaWF0ZWQgd2l0aCBzZWN0aW9ucyB3aGVuIHdlCi0gICB3cml0ZSBvdXQgdGhlIGV4dGVybmFsIHJlbG9jcy4gICovCi0KLXN0YXRpYyBpbnQKLW5sbV9leHRlcm5hbF9yZWxvY19jb21wYXJlIChwMSwgcDIpCi0gICAgIGNvbnN0IHZvaWQgKnAxOwotICAgICBjb25zdCB2b2lkICpwMjsKLXsKLSAgY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKnIxID0gKGNvbnN0IHN0cnVjdCByZWxvY19hbmRfc2VjICopIHAxOwotICBjb25zdCBzdHJ1Y3QgcmVsb2NfYW5kX3NlYyAqcjIgPSAoY29uc3Qgc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgcDI7Ci0gIGludCBjbXA7Ci0KLSAgY21wID0gc3RyY21wICgoKnIxLT5yZWwtPnN5bV9wdHJfcHRyKS0+bmFtZSwKLQkJKCpyMi0+cmVsLT5zeW1fcHRyX3B0ciktPm5hbWUpOwotICBpZiAoY21wICE9IDApCi0gICAgcmV0dXJuIGNtcDsKLQotICAvKiBXZSBzb3J0IGJ5IGFkZHJlc3Mgd2l0aGluIHN5bWJvbCB0byBtYWtlIHRoZSBzb3J0IG1vcmUgc3RhYmxlIGFuZAotICAgICBpbmNyZWFzZSB0aGUgY2hhbmNlcyB0aGF0IGRpZmZlcmVudCBob3N0cyB3aWxsIGdlbmVyYXRlIGJpdCBmb3IKLSAgICAgYml0IGVxdWl2YWxlbnQgcmVzdWx0cy4gICovCi0gIHJldHVybiAoaW50KSAocjEtPnJlbC0+YWRkcmVzcyAtIHIyLT5yZWwtPmFkZHJlc3MpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gTkxNIGZpbGUuICBXZSB3cml0ZSBvdXQgdGhlIGluZm9ybWF0aW9uIGluIHRoaXMgb3JkZXI6Ci0gICAgIGZpeGVkIGhlYWRlcgotICAgICB2YXJpYWJsZSBoZWFkZXIKLSAgICAgYXV4aWxpYXJ5IGhlYWRlcnMKLSAgICAgY29kZSBzZWN0aW9ucwotICAgICBkYXRhIHNlY3Rpb25zCi0gICAgIG90aGVyIHNlY3Rpb25zIChjdXN0b20gZGF0YSwgbWVzc2FnZXMsIGhlbHAsIHNoYXJlZCBOTE0sIFJQQywKLSAgICAgCQkgICAgIG1vZHVsZSBkZXBlbmRlbmNpZXMpCi0gICAgIHJlbG9jYXRpb24gZml4dXBzCi0gICAgIGV4dGVybmFsIHJlZmVyZW5jZXMgKGltcG9ydHMpCi0gICAgIHB1YmxpYyBzeW1ib2xzIChleHBvcnRzKQotICAgICBkZWJ1Z2dpbmcgcmVjb3JkcwotICAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBvcmRlciB1c2VkIGJ5IHRoZSBOZXRXYXJlIHRvb2xzOyB0aGUKLSAgIGRpZmZlcmVuY2UgaXMgdGhhdCBOZXRXYXJlIHB1dHMgdGhlIHNlY3Rpb25zIG90aGVyIHRoYW4gY29kZSwgZGF0YQotICAgYW5kIGN1c3RvbSBkYXRhIGF0IHRoZSBlbmQgb2YgdGhlIE5MTS4gIEl0IGlzIGNvbnZlbmllbnQgZm9yIHVzIHRvCi0gICBrbm93IHdoZXJlIHRoZSBzZWN0aW9ucyBhcmUgZ29pbmcgdG8gYmUgYmVmb3JlIHdvcnJ5aW5nIGFib3V0IHRoZQotICAgc2l6ZSBvZiB0aGUgb3RoZXIgaW5mb3JtYXRpb24uCi0KLSAgIEJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBhbGwgdGhlIHNlY3Rpb24gZGF0YSBzaG91bGQKLSAgIGhhdmUgYmVlbiBvdXRwdXQgdXNpbmcgc2V0X3NlY3Rpb25fY29udGVudHMuICBOb3RlIHRoYXQgY3VzdG9tCi0gICBkYXRhLCB0aGUgbWVzc2FnZSBmaWxlLCB0aGUgaGVscCBmaWxlLCB0aGUgc2hhcmVkIE5MTSBmaWxlLCB0aGUgUlBDCi0gICBkYXRhLCBhbmQgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGFsbCBjb25zaWRlcmVkIHRvIGJlCi0gICBzZWN0aW9uczsgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiB0aGUgb2Zmc2V0IGFuZAotICAgbGVuZ3RoIGZpZWxkcyBpbiB0aGUgTkxNIGhlYWRlcnMuICBUaGUgcmVsb2NhdGlvbiBmaXh1cHMgYW5kCi0gICBpbXBvcnRzIGFyZSBib3RoIG9idGFpbmVkIGZyb20gdGhlIGxpc3Qgb2YgcmVsb2NzIGF0dGFjaGVkIHRvIGVhY2gKLSAgIHNlY3Rpb24uICBUaGUgZXhwb3J0cyBhbmQgZGVidWdnaW5nIHJlY29yZHMgYXJlIG9idGFpbmVkIGZyb20gdGhlCi0gICBsaXN0IG9mIG91dHN5bWJvbHMuICAqLwotCi1ib29sZWFuCi1ubG1fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJvb2xlYW4gKCp3cml0ZV9pbXBvcnRfZnVuYykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKikpOwotICBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3JlbG9jX2NvdW50LCBpbnRlcm5hbF9yZWxvY19jb3VudCwgaSwgYzsKLSAgc3RydWN0IHJlbG9jX2FuZF9zZWMgKmV4dGVybmFsX3JlbG9jczsKLSAgYXN5bWJvbCAqKnN5bV9wdHJfcHRyOwotICBmaWxlX3B0ciBsYXN0OwotICBib29sZWFuICgqd3JpdGVfcHJlZml4X2Z1bmMpIFBBUkFNUyAoKGJmZCAqKSk7Ci0gIHVuc2lnbmVkIGNoYXIgKmZpeGVkX2hlYWRlciA9IE5VTEw7Ci0KLSAgZml4ZWRfaGVhZGVyID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCSAgYmZkX21hbGxvYyAoKHNpemVfdCkgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSkpOwotICBpZiAoZml4ZWRfaGVhZGVyID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UKLSAgICAgICYmIG5sbV9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpID09IGZhbHNlKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgdmFyaWFibGUgbGVuZ3RoIGhlYWRlcnMuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JICAgICBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUgKGFiZmQpICsgbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChubG1fc3dhcF92YXJpYWJsZV9oZWFkZXJfb3V0IChhYmZkKSA9PSBmYWxzZQotICAgICAgfHwgbmxtX3N3YXBfYXV4aWxpYXJ5X2hlYWRlcnNfb3V0IChhYmZkKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIEEgd2VhayBjaGVjayBvbiB3aGV0aGVyIHRoZSBzZWN0aW9uIGZpbGUgcG9zaXRpb25zIHdlcmUKLSAgICAgcmVhc29uYWJsZS4gICovCi0gIGlmIChiZmRfdGVsbCAoYWJmZCkgPiBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y29kZUltYWdlT2Zmc2V0KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogQWR2YW5jZSB0byB0aGUgcmVsb2NzLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0LAotCQlTRUVLX1NFVCkgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGUgZm9ybWF0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgaXMgZGVwZW5kZW50IHVwb24gdGhlCi0gICAgIHBhcnRpY3VsYXIgdGFyZ2V0LiAgV2UgdXNlIGFuIGV4dGVybmFsIHJvdXRpbmUgdG8gd3JpdGUgdGhlIHJlbG9jCi0gICAgIG91dC4gICovCi0gIHdyaXRlX2ltcG9ydF9mdW5jID0gbmxtX3dyaXRlX2ltcG9ydF9mdW5jIChhYmZkKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGludGVybmFsIHJlbG9jYXRpb24gZml4dXBzLiAgV2hpbGUgd2UncmUgbG9vcGluZwotICAgICBvdmVyIHRoZSByZWxvY3MsIHdlIGFsc28gY291bnQgdGhlIGV4dGVybmFsIHJlbG9jcywgd2hpY2ggaXMKLSAgICAgbmVlZGVkIHdoZW4gdGhleSBhcmUgd3JpdHRlbiBvdXQgYmVsb3cuICAqLwotICBpbnRlcm5hbF9yZWxvY19jb3VudCA9IDA7Ci0gIGV4dGVybmFsX3JlbG9jX2NvdW50ID0gMDsKLSAgZm9yIChzZWMgPSBhYmZkLT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBzZWMtPm5leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbF9wdHJfcHRyLCAqKnJlbF9lbmQ7Ci0KLSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIGNhbiBvbmx5IHJlcHJlc2VudCByZWxvY3Mgd2l0aGluIGEgY29kZSBvciBkYXRhCi0JIHNlY3Rpb24uICBXZSBpZ25vcmUgdGhlbSBmb3IgYSBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCi0gICAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIChTRUNfQ09ERSB8IFNFQ19EQVRBKSkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgbmVlZCB0byBrbm93IGhvdyB0byB3cml0ZSBvdXQgaW1wb3J0cyAqLwotICAgICAgaWYgKHdyaXRlX2ltcG9ydF9mdW5jID09IE5VTEwpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgcmVsX3B0cl9wdHIgPSBzZWMtPm9yZWxvY2F0aW9uOwotICAgICAgcmVsX2VuZCA9IHJlbF9wdHJfcHRyICsgc2VjLT5yZWxvY19jb3VudDsKLSAgICAgIGZvciAoOyByZWxfcHRyX3B0ciA8IHJlbF9lbmQ7IHJlbF9wdHJfcHRyKyspCi0JewotCSAgYXJlbGVudCAqcmVsOwotCSAgYXN5bWJvbCAqc3ltOwotCi0JICByZWwgPSAqcmVsX3B0cl9wdHI7Ci0JICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotCSAgaWYgKCEgYmZkX2lzX3VuZF9zZWN0aW9uIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpKQotCSAgICB7Ci0JICAgICAgKytpbnRlcm5hbF9yZWxvY19jb3VudDsKLQkgICAgICBpZiAoKCp3cml0ZV9pbXBvcnRfZnVuYykgKGFiZmQsIHNlYywgcmVsKSA9PSBmYWxzZSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgKytleHRlcm5hbF9yZWxvY19jb3VudDsKLQl9Ci0gICAgfQotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzID0gaW50ZXJuYWxfcmVsb2NfY291bnQ7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbXBvcnRzIChyZWxvY3MgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzKS4gIFRoZXNlCi0gICAgIGFyZSBvdXRwdXQgYXMgYSBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBhbGwgdGhlIHJlbG9jcyBmb3IgdGhhdAotICAgICBzeW1ib2wsIHNvIHdlIG11c3QgZmlyc3QgZ2F0aGVyIHRvZ2V0aGVyIGFsbCB0aGUgcmVsb2NzIGFnYWluc3QKLSAgICAgZXh0ZXJuYWwgc3ltYm9scyBhbmQgc29ydCB0aGVtLiAgKi8KLSAgZXh0ZXJuYWxfcmVsb2NzID0KLSAgICAoc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgYmZkX2FsbG9jIChhYmZkLAotCQkJCQkoZXh0ZXJuYWxfcmVsb2NfY291bnQKLQkJCQkJICogc2l6ZW9mIChzdHJ1Y3QgcmVsb2NfYW5kX3NlYykpKTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSAoc3RydWN0IHJlbG9jX2FuZF9zZWMgKikgTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaSA9IDA7Ci0gIGZvciAoc2VjID0gYWJmZC0+c2VjdGlvbnM7IHNlYyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgc2VjID0gc2VjLT5uZXh0KQotICAgIHsKLSAgICAgIGFyZWxlbnQgKipyZWxfcHRyX3B0ciwgKipyZWxfZW5kOwotCi0gICAgICBpZiAoc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxfcHRyX3B0ciA9IHNlYy0+b3JlbG9jYXRpb247Ci0gICAgICByZWxfZW5kID0gcmVsX3B0cl9wdHIgKyBzZWMtPnJlbG9jX2NvdW50OwotICAgICAgZm9yICg7IHJlbF9wdHJfcHRyIDwgcmVsX2VuZDsgcmVsX3B0cl9wdHIrKykKLQl7Ci0JICBhcmVsZW50ICpyZWw7Ci0JICBhc3ltYm9sICpzeW07Ci0KLQkgIHJlbCA9ICpyZWxfcHRyX3B0cjsKLQkgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0JICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIGNvbnRpbnVlOwotCi0JICBleHRlcm5hbF9yZWxvY3NbaV0ucmVsID0gcmVsOwotCSAgZXh0ZXJuYWxfcmVsb2NzW2ldLnNlYyA9IHNlYzsKLQkgICsraTsKLQl9Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKGkgPT0gZXh0ZXJuYWxfcmVsb2NfY291bnQpOwotCi0gIC8qIFNvcnQgdGhlIGV4dGVybmFsIHJlbG9jcyBieSBuYW1lLiAgKi8KLSAgcXNvcnQgKChQVFIpIGV4dGVybmFsX3JlbG9jcywgKHNpemVfdCkgZXh0ZXJuYWxfcmVsb2NfY291bnQsCi0JIHNpemVvZiAoc3RydWN0IHJlbG9jX2FuZF9zZWMpLCBubG1fZXh0ZXJuYWxfcmVsb2NfY29tcGFyZSk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBleHRlcm5hbCByZWxvY3MuICAqLwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBjID0gMDsKLSAgaSA9IDA7Ci0gIHdoaWxlIChpIDwgZXh0ZXJuYWxfcmVsb2NfY291bnQpCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYmZkX3NpemVfdHlwZSBqLCBjbnQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgcmVsID0gZXh0ZXJuYWxfcmVsb2NzW2ldLnJlbDsKLSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gICAgICBjbnQgPSAwOwotICAgICAgZm9yIChqID0gaTsKLQkgICAoaiA8IGV4dGVybmFsX3JlbG9jX2NvdW50Ci0JICAgICYmICpleHRlcm5hbF9yZWxvY3Nbal0ucmVsLT5zeW1fcHRyX3B0ciA9PSBzeW0pOwotCSAgIGorKykKLQkrK2NudDsKLQotICAgICAgaWYgKCgqbmxtX3dyaXRlX2V4dGVybmFsX2Z1bmMgKGFiZmQpKSAoYWJmZCwgY250LCBzeW0sCi0JCQkJCSAgICAgJmV4dGVybmFsX3JlbG9jc1tpXSkKLQkgID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpICs9IGNudDsKLSAgICB9Ci0KLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzID0gYzsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHB1YmxpYyBzeW1ib2xzIChleHBvcnRzKS4gICovCi0gIHN5bV9wdHJfcHRyID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgaWYgKHN5bV9wdHJfcHRyICE9IChhc3ltYm9sICoqKSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF92bWEgKCpnZXRfcHVibGljX29mZnNldF9mdW5jKSBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKSk7Ci0gICAgICBib29sZWFuICgqd3JpdGVfZXhwb3J0X2Z1bmMpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZF92bWEpKTsKLQotICAgICAgYXN5bWJvbCAqKnN5bV9lbmQ7Ci0KLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5wdWJsaWNzT2Zmc2V0ID0gYmZkX3RlbGwgKGFiZmQpOwotICAgICAgZ2V0X3B1YmxpY19vZmZzZXRfZnVuYyA9IG5sbV9nZXRfcHVibGljX29mZnNldF9mdW5jIChhYmZkKTsKLSAgICAgIHdyaXRlX2V4cG9ydF9mdW5jID0gbmxtX3dyaXRlX2V4cG9ydF9mdW5jIChhYmZkKTsKLSAgICAgIGMgPSAwOwotICAgICAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gICAgICBmb3IgKDsgc3ltX3B0cl9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyX3B0cisrKQotCXsKLQkgIGFzeW1ib2wgKnN5bTsKLQkgIGJmZF9ieXRlIGxlbjsKLQkgIGJmZF92bWEgb2Zmc2V0OwotCSAgYmZkX2J5dGUgdGVtcFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLQkgIHN5bSA9ICpzeW1fcHRyX3B0cjsKLQotCSAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKSkgPT0gMAotCSAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgY29udGludWU7Ci0KLQkgICsrYzsKLQotCSAgaWYgKGdldF9wdWJsaWNfb2Zmc2V0X2Z1bmMpCi0JICAgIHsKLQkgICAgICAvKiBNb3N0IGJhY2tlbmRzIGNhbiB1c2UgdGhlIGNvZGUgYmVsb3csIGJ1dAotCQkgdW5mb3J0dW5hdGVseSBzb21lIHVzZSBhIGRpZmZlcmVudCBzY2hlbWUuICAqLwotCSAgICAgIG9mZnNldCA9ICgqZ2V0X3B1YmxpY19vZmZzZXRfZnVuYykgKGFiZmQsIHN5bSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9mZnNldCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIHNlYyA9IHN5bS0+c2VjdGlvbjsKLQkgICAgICBpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCQl7Ci0JCSAgb2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotCQkgIG9mZnNldCB8PSBOTE1fSElCSVQ7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKLQkJewotCQkgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCi0JCSAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2UgY2FuJ3QgaGFuZGxlIGFuIGV4cG9ydGVkIHN5bWJvbCB0aGF0IGlzIG5vdCBpbgotCQkgICAgIHRoZSBjb2RlIG9yIGRhdGEgc2VnbWVudC4gICovCi0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCSAgICB9Ci0KLQkgIGlmICh3cml0ZV9leHBvcnRfZnVuYykKLQkgICAgewotCSAgICAgIGlmICgoKndyaXRlX2V4cG9ydF9mdW5jKSAoYWJmZCwgc3ltLCBvZmZzZXQpID09IGZhbHNlKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbGVuID0gc3RybGVuIChzeW0tPm5hbWUpOwotCSAgICAgIGlmICgoYmZkX3dyaXRlICgmbGVuLCBzaXplb2YgKGJmZF9ieXRlKSwgMSwgYWJmZCkKLQkJICAgIT0gc2l6ZW9mIChiZmRfYnl0ZSkpCi0JCSAgfHwgYmZkX3dyaXRlIChzeW0tPm5hbWUsIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIHB1dF93b3JkIChhYmZkLCBvZmZzZXQsIHRlbXApOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKHRlbXAsIHNpemVvZiAodGVtcCksIDEsIGFiZmQpICE9IHNpemVvZiAodGVtcCkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mUHVibGljcyA9IGM7Ci0KLSAgICAgIC8qIFdyaXRlIG91dCB0aGUgZGVidWdnaW5nIHJlY29yZHMuICBUaGUgTkxNIGNvbnZlcnNpb24gcHJvZ3JhbQotCSB3YW50cyB0byBiZSBhYmxlIHRvIGluaGliaXQgdGhpcywgc28gYXMgYSBzcGVjaWFsIGhhY2sgaWYKLQkgZGVidWdJbmZvT2Zmc2V0IGlzIHNldCB0byAtMSB3ZSBkb24ndCB3cml0ZSBhbnkgZGVidWdnaW5nCi0JIGluZm9ybWF0aW9uLiAgVGhpcyBjYW4gbm90IGJlIGhhbmRsZWQgYnkgZmlkZGxpbmcgd2l0aCB0aGUKLQkgc3ltYm9sIHRhYmxlLCBiZWNhdXNlIGV4cG9ydGVkIHN5bWJvbHMgYXBwZWFyIGluIGJvdGggdGhlCi0JIGV4cG9ydGVkIHN5bWJvbCBsaXN0IGFuZCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZGVidWdJbmZvT2Zmc2V0ID09IChmaWxlX3B0cikgLSAxKQotCXsKLQkgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSAwOwotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPm51bWJlck9mRGVidWdSZWNvcmRzID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9IGJmZF90ZWxsIChhYmZkKTsKLQkgIGMgPSAwOwotCSAgc3ltX3B0cl9wdHIgPSBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpOwotCSAgc3ltX2VuZCA9IHN5bV9wdHJfcHRyICsgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0JICBmb3IgKDsgc3ltX3B0cl9wdHIgPCBzeW1fZW5kOyBzeW1fcHRyX3B0cisrKQotCSAgICB7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCSAgICAgIGJmZF9ieXRlIHR5cGUsIGxlbjsKLQkgICAgICBiZmRfdm1hIG9mZnNldDsKLQkgICAgICBiZmRfYnl0ZSB0ZW1wW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotCSAgICAgIHN5bSA9ICpzeW1fcHRyX3B0cjsKLQotCSAgICAgIC8qIFRoZSBOTE0gbm90aW9uIG9mIGEgZGVidWdnaW5nIHN5bWJvbCBpcyBhY3R1YWxseSB3aGF0Ci0JCSBCRkQgY2FsbHMgYSBsb2NhbCBvciBnbG9iYWwgc3ltYm9sLiAgV2hhdCBCRkQgY2FsbHMgYQotCQkgZGVidWdnaW5nIHN5bWJvbCBOTE0gZG9lcyBub3QgdW5kZXJzdGFuZCBhdCBhbGwuICAqLwotCSAgICAgIGlmICgoc3ltLT5mbGFncyAmIChCU0ZfTE9DQUwgfCBCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCkpID09IDAKLQkJICB8fCAoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDAKLQkJICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JCWNvbnRpbnVlOwotCi0JICAgICAgKytjOwotCi0JICAgICAgb2Zmc2V0ID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICAgICAgc2VjID0gc3ltLT5zZWN0aW9uOwotCSAgICAgIGlmIChzZWMtPmZsYWdzICYgU0VDX0NPREUpCi0JCXsKLQkJICBvZmZzZXQgLT0gbmxtX2dldF90ZXh0X2xvdyAoYWJmZCk7Ci0JCSAgdHlwZSA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzZWMtPmZsYWdzICYgKFNFQ19EQVRBIHwgU0VDX0FMTE9DKSkKLQkJewotCQkgIC8qIFNFQ19BTExPQyBpcyBmb3IgdGhlIC5ic3Mgc2VjdGlvbi4gICovCi0JCSAgb2Zmc2V0IC09IG5sbV9nZXRfZGF0YV9sb3cgKGFiZmQpOwotCQkgIHR5cGUgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl0eXBlID0gMjsKLQotCSAgICAgIC8qIFRoZSB0eXBlIGlzIDAgZm9yIGRhdGEsIDEgZm9yIGNvZGUsIDIgZm9yIGFic29sdXRlLiAgKi8KLQkgICAgICBpZiAoYmZkX3dyaXRlICgmdHlwZSwgc2l6ZW9mIChiZmRfYnl0ZSksIDEsIGFiZmQpCi0JCSAgIT0gc2l6ZW9mIChiZmRfYnl0ZSkpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgcHV0X3dvcmQgKGFiZmQsIG9mZnNldCwgdGVtcCk7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAodGVtcCwgc2l6ZW9mICh0ZW1wKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh0ZW1wKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgICBsZW4gPSBzdHJsZW4gKHN5bS0+bmFtZSk7Ci0JICAgICAgaWYgKChiZmRfd3JpdGUgKCZsZW4sIHNpemVvZiAoYmZkX2J5dGUpLCAxLCBhYmZkKQotCQkgICAhPSBzaXplb2YgKGJmZF9ieXRlKSkKLQkJICB8fCBiZmRfd3JpdGUgKHN5bS0+bmFtZSwgbGVuLCAxLCBhYmZkKSAhPSBsZW4pCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICB9Ci0JICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMgPSBjOwotCX0KLSAgICB9Ci0KLSAgLyogTkxNTElOSyBmaWxscyBpbiBvZmZzZXQgdmFsdWVzIGV2ZW4gaWYgdGhlcmUgaXMgbm8gZGF0YSwgc28gd2UgZG8KLSAgICAgdGhlIHNhbWUuICAqLwotICBsYXN0ID0gYmZkX3RlbGwgKGFiZmQpOwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVJbWFnZU9mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5jb2RlSW1hZ2VPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRhdGFJbWFnZU9mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kYXRhSW1hZ2VPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmN1c3RvbURhdGFPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+Y3VzdG9tRGF0YU9mZnNldCA9IGxhc3Q7Ci0gIGlmIChubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQgPT0gMCkKLSAgICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID0gbGFzdDsKLSAgaWYgKG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5wdWJsaWNzT2Zmc2V0ID09IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnB1YmxpY3NPZmZzZXQgPSBsYXN0OwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmRlYnVnSW5mb09mZnNldCA9PSAwKQotICAgIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5kZWJ1Z0luZm9PZmZzZXQgPSBsYXN0OwotCi0gIC8qIEF0IHRoaXMgcG9pbnQgZXZlcnl0aGluZyBoYXMgYmVlbiB3cml0dGVuIG91dCBleGNlcHQgdGhlIGZpeGVkCi0gICAgIGhlYWRlci4gICovCi0gIG1lbWNweSAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPnNpZ25hdHVyZSwgbmxtX3NpZ25hdHVyZSAoYWJmZCksCi0JICBOTE1fU0lHTkFUVVJFX1NJWkUpOwotICBubG1fZml4ZWRfaGVhZGVyIChhYmZkKS0+dmVyc2lvbiA9IE5MTV9IRUFERVJfVkVSU0lPTjsKLSAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNvZGVTdGFydE9mZnNldCA9Ci0gICAgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkKLSAgICAgLSBubG1fZ2V0X3RleHRfbG93IChhYmZkKSk7Ci0KLSAgLyogV2UgaGF2ZSBubyBjb252ZW5pZW50IHdheSBmb3IgdGhlIGNhbGxlciB0byBwYXNzIGluIHRoZSBleGl0Ci0gICAgIHByb2NlZHVyZSBvciB0aGUgY2hlY2sgdW5sb2FkIHByb2NlZHVyZSwgc28gdGhlIGNhbGxlciBtdXN0IHNldAotICAgICB0aGUgdmFsdWVzIGluIHRoZSBoZWFkZXIgdG8gdGhlIHZhbHVlcyBvZiB0aGUgc3ltYm9scy4gICovCi0gIG5sbV9maXhlZF9oZWFkZXIgKGFiZmQpLT5leGl0UHJvY2VkdXJlT2Zmc2V0IC09IG5sbV9nZXRfdGV4dF9sb3cgKGFiZmQpOwotICBpZiAobmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0ICE9IDApCi0gICAgbmxtX2ZpeGVkX2hlYWRlciAoYWJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0IC09Ci0gICAgICBubG1fZ2V0X3RleHRfbG93IChhYmZkKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdyaXRlX3ByZWZpeF9mdW5jID0gbmxtX3dyaXRlX3ByZWZpeF9mdW5jIChhYmZkKTsKLSAgaWYgKHdyaXRlX3ByZWZpeF9mdW5jKQotICAgIHsKLSAgICAgIGlmICgoKndyaXRlX3ByZWZpeF9mdW5jKSAoYWJmZCkgPT0gZmFsc2UpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSBiZmRfdGVsbCAoYWJmZCkKLQkgICAgICA9PSBubG1fb3B0aW9uYWxfcHJlZml4X3NpemUgKGFiZmQpKTsKLQotICBubG1fc3dhcF9maXhlZF9oZWFkZXJfb3V0IChhYmZkLCBubG1fZml4ZWRfaGVhZGVyIChhYmZkKSwgZml4ZWRfaGVhZGVyKTsKLSAgaWYgKGJmZF93cml0ZSAoZml4ZWRfaGVhZGVyLCBubG1fZml4ZWRfaGVhZGVyX3NpemUgKGFiZmQpLCAxLCBhYmZkKQotICAgICAgIT0gbmxtX2ZpeGVkX2hlYWRlcl9zaXplIChhYmZkKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoZml4ZWRfaGVhZGVyICE9IE5VTEwpCi0gICAgZnJlZSAoZml4ZWRfaGVhZGVyKTsKLSAgcmV0dXJuIHRydWU7Ci0KLWVycm9yX3JldHVybjoKLSAgaWYgKGZpeGVkX2hlYWRlciAhPSBOVUxMKQotICAgIGZyZWUgKGZpeGVkX2hlYWRlcik7Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2JmZC9ubG1zd2FwLmggYi9iZmQvbmxtc3dhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTljZTcyLi4wMDAwMDAwCi0tLSBhL2JmZC9ubG1zd2FwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyogTkxNIChOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSkgc3dhcHBpbmcgcm91dGluZXMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydCwgdXNpbmcgRUxGIHN1cHBvcnQgYXMgdGhlCi0gICB0ZW1wbGF0ZS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBbHRob3VnaCB0aGlzIGlzIGEgaGVhZGVyIGZpbGUsIGl0IGRlZmluZXMgZnVuY3Rpb25zLiAgSXQgaXMKLSAgIGluY2x1ZGVkIGJ5IE5MTSBiYWNrZW5kcyB0byBkZWZpbmUgc3dhcHBpbmcgZnVuY3Rpb25zIHRoYXQgdmFyeQotICAgZnJvbSBvbmUgTkxNIHRvIGFub3RoZXIuICBUaGUgYmFja2VuZCBjb2RlIG11c3QgYXJyYW5nZSBmb3IKLSAgIE5sbV9FeHRlcm5hbF94eHh4IHRvIGJlIGRlZmluZWQgYXBwcm9wcmlhdGVseSwgYW5kIGNhbiB0aGVuIGluY2x1ZGUKLSAgIHRoaXMgZmlsZSB0byBnZXQgdGhlIHN3YXBwaW5nIHJvdXRpbmVzLgotCi0gICBBdCB0aGUgbW9tZW50IHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIG9uZSBzdHJ1Y3R1cmUsIHRoZSBmaXhlZCBOTE0KLSAgIGZpbGUgaGVhZGVyLiAgKi8KLQotc3RhdGljIHZvaWQgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0JCQkJCSAgICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKikpOwotc3RhdGljIHZvaWQgbmxtX3N3YXBfZml4ZWRfaGVhZGVyX291dCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICAgICAgIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKiwKLQkJCQkJICAgICAgIFBUUikpOwotCi0vKiBUcmFuc2xhdGUgYW4gTkxNIGZpeGVkIGxlbmd0aCBmaWxlIGhlYWRlciBpbiBleHRlcm5hbCBmb3JtYXQgaW50byBhbiBOTE0KLSAgIGZpbGUgaGVhZGVyIGluIGludGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLW5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9pbiAoYWJmZCwgcmVhbHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiByZWFsc3JjOwotICAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICpkc3Q7Ci17Ci0gIE5sbV9FeHRlcm5hbF9GaXhlZF9IZWFkZXIgKnNyYyA9IChObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyICopIHJlYWxzcmM7Ci0gIG1lbWNweSAoZHN0LT5zaWduYXR1cmUsIHNyYy0+c2lnbmF0dXJlLCBOTE1fU0lHTkFUVVJFX1NJWkUpOwotICBtZW1jcHkgKGRzdC0+bW9kdWxlTmFtZSwgc3JjLT5tb2R1bGVOYW1lLCBOTE1fTU9EVUxFX05BTUVfU0laRSk7Ci0gIGRzdC0+dmVyc2lvbiA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT52ZXJzaW9uKTsKLSAgZHN0LT5jb2RlSW1hZ2VPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y29kZUltYWdlT2Zmc2V0KTsKLSAgZHN0LT5jb2RlSW1hZ2VTaXplID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmNvZGVJbWFnZVNpemUpOwotICBkc3QtPmRhdGFJbWFnZU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5kYXRhSW1hZ2VPZmZzZXQpOwotICBkc3QtPmRhdGFJbWFnZVNpemUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZGF0YUltYWdlU2l6ZSk7Ci0gIGRzdC0+dW5pbml0aWFsaXplZERhdGFTaXplID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSk7Ci0gIGRzdC0+Y3VzdG9tRGF0YU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jdXN0b21EYXRhT2Zmc2V0KTsKLSAgZHN0LT5jdXN0b21EYXRhU2l6ZSA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jdXN0b21EYXRhU2l6ZSk7Ci0gIGRzdC0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5tb2R1bGVEZXBlbmRlbmN5T2Zmc2V0KTsKLSAgZHN0LT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyk7Ci0gIGRzdC0+cmVsb2NhdGlvbkZpeHVwT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPnJlbG9jYXRpb25GaXh1cE9mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mUmVsb2NhdGlvbkZpeHVwcyk7Ci0gIGRzdC0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBkc3QtPnB1YmxpY3NPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+cHVibGljc09mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZQdWJsaWNzID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPm51bWJlck9mUHVibGljcyk7Ci0gIGRzdC0+ZGVidWdJbmZvT2Zmc2V0ID0KLSAgICBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPmRlYnVnSW5mb09mZnNldCk7Ci0gIGRzdC0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMpOwotICBkc3QtPmNvZGVTdGFydE9mZnNldCA9Ci0gICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5jb2RlU3RhcnRPZmZzZXQpOwotICBkc3QtPmV4aXRQcm9jZWR1cmVPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZXhpdFByb2NlZHVyZU9mZnNldCk7Ci0gIGRzdC0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQpOwotICBkc3QtPm1vZHVsZVR5cGUgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+bW9kdWxlVHlwZSk7Ci0gIGRzdC0+ZmxhZ3MgPQotICAgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+ZmxhZ3MpOwotfQotCi0vKiBUcmFuc2xhdGUgYW4gTkxNIGZpeGVkIGxlbmd0aCBmaWxlIGhlYWRlciBpbiBpbnRlcm5hbCBmb3JtYXQgaW50bwotICAgYW4gTkxNIGZpbGUgaGVhZGVyIGluIGV4dGVybmFsIGZvcm1hdC4gKi8KLQotc3RhdGljIHZvaWQKLW5sbV9zd2FwX2ZpeGVkX2hlYWRlcl9vdXQgKGFiZmQsIHNyYywgcmVhbGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBObG1fSW50ZXJuYWxfRml4ZWRfSGVhZGVyICpzcmM7Ci0gICAgIFBUUiByZWFsZHN0OwotewotICBObG1fRXh0ZXJuYWxfRml4ZWRfSGVhZGVyICpkc3QgPSAoTmxtX0V4dGVybmFsX0ZpeGVkX0hlYWRlciAqKSByZWFsZHN0OwotICBtZW1zZXQgKGRzdCwgMCwgc2l6ZW9mICpkc3QpOwotICBtZW1jcHkgKGRzdC0+c2lnbmF0dXJlLCBzcmMtPnNpZ25hdHVyZSwgTkxNX1NJR05BVFVSRV9TSVpFKTsKLSAgbWVtY3B5IChkc3QtPm1vZHVsZU5hbWUsIHNyYy0+bW9kdWxlTmFtZSwgTkxNX01PRFVMRV9OQU1FX1NJWkUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPnZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBkc3QtPnZlcnNpb24pOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmNvZGVJbWFnZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+Y29kZUltYWdlT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jb2RlSW1hZ2VTaXplLAotCQkoYmZkX2J5dGUgKikgZHN0LT5jb2RlSW1hZ2VTaXplKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5kYXRhSW1hZ2VPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmRhdGFJbWFnZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZGF0YUltYWdlU2l6ZSwKLQkJKGJmZF9ieXRlICopIGRzdC0+ZGF0YUltYWdlU2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+dW5pbml0aWFsaXplZERhdGFTaXplLAotCQkoYmZkX2J5dGUgKikgZHN0LT51bmluaXRpYWxpemVkRGF0YVNpemUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmN1c3RvbURhdGFPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmN1c3RvbURhdGFPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmN1c3RvbURhdGFTaXplLAotCQkoYmZkX2J5dGUgKikgZHN0LT5jdXN0b21EYXRhU2l6ZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXMsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5yZWxvY2F0aW9uRml4dXBPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPnJlbG9jYXRpb25GaXh1cE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzLAotCQkoYmZkX2J5dGUgKikgZHN0LT5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPmV4dGVybmFsUmVmZXJlbmNlc09mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+ZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5udW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlcywKLQkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXMpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPnB1YmxpY3NPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPnB1YmxpY3NPZmZzZXQpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzcmMtPm51bWJlck9mUHVibGljcywKLQkJKGJmZF9ieXRlICopIGRzdC0+bnVtYmVyT2ZQdWJsaWNzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5kZWJ1Z0luZm9PZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmRlYnVnSW5mb09mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+bnVtYmVyT2ZEZWJ1Z1JlY29yZHMsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPm51bWJlck9mRGVidWdSZWNvcmRzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5jb2RlU3RhcnRPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmNvZGVTdGFydE9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+ZXhpdFByb2NlZHVyZU9mZnNldCwKLQkJKGJmZF9ieXRlICopIGRzdC0+ZXhpdFByb2NlZHVyZU9mZnNldCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgKGJmZF92bWEpIHNyYy0+Y2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQsCi0JCShiZmRfYnl0ZSAqKSBkc3QtPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5tb2R1bGVUeXBlLAotCQkoYmZkX2J5dGUgKikgZHN0LT5tb2R1bGVUeXBlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3JjLT5mbGFncywKLQkJKGJmZF9ieXRlICopIGRzdC0+ZmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvYmZkL25zMzJrLmggYi9iZmQvbnMzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYzYmEwOS4uMDAwMDAwMAotLS0gYS9iZmQvbnMzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIEhlYWRlciBmaWxlIGZvciBuczMyayByb3V0aW5lcy4KLSAgIENvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NhdGVfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfZG9fbnMzMmtfcmVsb2NfY29udGVudHMKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYmZkX3ZtYSwgYmZkX2J5dGUgKiwKLQkgICBsb25nICgqKSBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSksCi0JICAgaW50ICgqKSBQQVJBTVMgKChsb25nLCBiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSkpKTsKLQotZXh0ZXJuIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBfYmZkX25zMzJrX2ZpbmFsX2xpbmtfcmVsb2NhdGUKLSAgUEFSQU1TICgocmVsb2NfaG93dG9fdHlwZSAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX2J5dGUgKiwgYmZkX3ZtYSwKLQkgICBiZmRfdm1hLCBiZmRfdm1hKSk7Ci0KLWV4dGVybiBsb25nIF9iZmRfbnMzMmtfZ2V0X2Rpc3BsYWNlbWVudCBQQVJBTVMgKChiZmRfYnl0ZSAqLCBsb25nLCBsb25nKSk7Ci1leHRlcm4gbG9uZyBfYmZkX25zMzJrX2dldF9pbW1lZGlhdGUgUEFSQU1TICgoYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGludCBfYmZkX25zMzJrX3B1dF9kaXNwbGFjZW1lbnQgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotZXh0ZXJuIGludCBfYmZkX25zMzJrX3B1dF9pbW1lZGlhdGUgUEFSQU1TICgobG9uZywgYmZkX2J5dGUgKiwgbG9uZywgbG9uZykpOwotCi1leHRlcm4gYmZkX3JlbG9jX3N0YXR1c190eXBlIF9iZmRfbnMzMmtfcmVsb2NfZGlzcAotICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLWV4dGVybiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgX2JmZF9uczMya19yZWxvY19pbW0KLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7CmRpZmYgLS1naXQgYS9iZmQvbnMzMmtuZXRic2QuYyBiL2JmZC9uczMya25ldGJzZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjIzNTZkLi4wMDAwMDAwCi0tLSBhL2JmZC9uczMya25ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvbnMzMmsgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJNDA5NgotI2RlZmluZQlTRUdNRU5UX1NJWkUJNDA5NgotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF9uczMyawotI2RlZmluZQlERUZBVUxUX01JRCAJTV81MzJfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChwYzUzMm5ldGJzZF8sT1ApCi0KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotLyogVGhpcyBuZWVkcyB0byBzdGFydCB3aXRoIGEub3V0IHNvIEdEQiBrbm93cyBpdCBpcyBhbiBhLm91dCB2YXJpYW50LiAgKi8KLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtbnMzMmstbmV0YnNkIgotCi0jZGVmaW5lIG5zMzJrYW91dF8zMl9nZXRfc2VjdGlvbl9jb250ZW50cyBhb3V0XzMyX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLSNkZWZpbmUgTVlfdGV4dF9pbmNsdWRlc19oZWFkZXIgMQotCi0vKiBXZSBjYW5gdCB1c2UgdGhlIE1ZTlMgbWFjcm8gaGVyZSBmb3IgY3BwIHJlYXNvbnMgdG9vIHN1YnRsZQotICogZm9yIG1lIC0tIElXRAotICovCi0jZGVmaW5lIE1ZX2JmZF9yZWxvY190eXBlX2xvb2t1cCBuczMya2FvdXRfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNpbmNsdWRlICJiZmQuaCIJCS8qIFRvIGVuc3VyZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gaXMgT0sgKi8KLQotQ09OU1Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqCi1NWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAKLSAgUEFSQU1TKChiZmQgKmFiZmQgQU5ECi0JICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSkpOwotCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9vYXN5cy5jIGIvYmZkL29hc3lzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTU2MGUuLjAwMDAwMDAKLS0tIGEvYmZkL29hc3lzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTM1ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igb2FzeXMgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVU5ERVJTQ09SRV9IQUNLIDEKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgIm9hc3lzLmgiCi0jaW5jbHVkZSAibGlib2FzeXMuaCIKLQotLyogWFhYIC0gRklYTUUuICBvZmZzZXRvZiBiZWxvbmdzIGluIHRoZSBzeXN0ZW0tc3BlY2lmaWMgZmlsZXMgaW4KLSAgIC4uL2luY2x1ZGUvc3lzLiAqLwotLyogRGVmaW5lIG9mZnNldG9mIGZvciB0aG9zZSBzeXN0ZW1zIHdoaWNoIGxhY2sgaXQgKi8KLQotI2lmbmRlZiBvZmZzZXRvZgotI2RlZmluZSBvZmZzZXRvZih0eXBlLCBpZGVudGlmaWVyKSAoc2l6ZV90KSAmKCgodHlwZSAqKSAwKS0+aWRlbnRpZmllcikKLSNlbmRpZgotCi1zdGF0aWMgYm9vbGVhbiBvYXN5c19yZWFkX3JlY29yZCBQQVJBTVMgKChiZmQgKiwKLQkJCQkJICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLAotCQkJCQkgICBvYXN5c19yZWNvcmRfZW51bV90eXBlLAotCQkJCQkgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqLAotCQkJCQkgICBzaXplX3QpKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX3N5bXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIG9hc3lzX3dyaXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gb2FzeXNfd3JpdGVfZW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBvYXN5c193cml0ZV9kYXRhIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLS8qIFJlYWQgaW4gYWxsIHRoZSBzZWN0aW9uIGRhdGEgYW5kIHJlbG9jYXRpb24gc3R1ZmYgdG9vICovCi1QUk9UTyAoc3RhdGljIGJvb2xlYW4sIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSwgKGJmZCAqIENPTlNUIGFiZmQpKTsKLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3JlYWRfcmVjb3JkIChhYmZkLCByZWNvcmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKnJlY29yZDsKLXsKLSAgaWYgKGJmZF9yZWFkICgoUFRSKSByZWNvcmQsIDEsIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoc2l6ZV90KSByZWNvcmQtPmhlYWRlci5sZW5ndGggPD0gKHNpemVfdCkgc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChiZmRfcmVhZCAoKFBUUikgKCgoY2hhciAqKSByZWNvcmQpICsgc2l6ZW9mIChyZWNvcmQtPmhlYWRlcikpLAotCQkxLCByZWNvcmQtPmhlYWRlci5sZW5ndGggLSBzaXplb2YgKHJlY29yZC0+aGVhZGVyKSwKLQkJYWJmZCkKLSAgICAgICE9IHJlY29yZC0+aGVhZGVyLmxlbmd0aCAtIHNpemVvZiAocmVjb3JkLT5oZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1zdGF0aWMgc2l6ZV90Ci1vYXN5c19zdHJpbmdfbGVuZ3RoIChyZWNvcmQpCi0gICAgIG9hc3lzX3JlY29yZF91bmlvbl90eXBlICpyZWNvcmQ7Ci17Ci0gIHJldHVybiByZWNvcmQtPmhlYWRlci5sZW5ndGgKLSAgICAtICgoY2hhciAqKSByZWNvcmQtPnN5bWJvbC5uYW1lIC0gKGNoYXIgKikgcmVjb3JkKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotCi1TbHVycCB0aGUgc3ltYm9sIHRhYmxlIGJ5IHJlYWRpbmcgaW4gYWxsIHRoZSByZWNvcmRzIGF0IHRoZSBzdGFydCBmaWxlCi10aWxsIHdlIGdldCB0byB0aGUgZmlyc3Qgc2VjdGlvbiByZWNvcmQuCi0KLVdlJ2xsIHNvcnQgdGhlIHN5bWJvbHNzIGludG8gIHR3byBsaXN0cywgZGVmaW5lZCBhbmQgdW5kZWZpbmVkLiBUaGUKLXVuZGVmaW5lZCBzeW1ib2xzIHdpbGwgYmUgcGxhY2VkIGludG8gdGhlIHRhYmxlIGFjY29yZGluZyB0byB0aGVpcgotcmVmbm8uCi0KLVdlIGRvIHRoaXMgYnkgcGxhY2luZyBhbGwgdW5kZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGZyb250IG9mIHRoZSB0YWJsZQotbW92aW5nIGluLCBhbmQgdGhlIGRlZmluZWQgc3ltYm9scyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBtb3ZpbmcgYmFjay4KLQotKi8KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3NsdXJwX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICpDT05TVCBhYmZkOwotewotICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSByZWNvcmQ7Ci0gIG9hc3lzX2RhdGFfdHlwZSAqZGF0YSA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBib29sZWFuIGxvb3AgPSB0cnVlOwotICBhc3ltYm9sICpkZXN0X2RlZmluZWQ7Ci0gIGFzeW1ib2wgKmRlc3Q7Ci0gIGNoYXIgKnN0cmluZ19wdHI7Ci0KLQotICBpZiAoZGF0YS0+c3ltYm9scyAhPSAoYXN5bWJvbCAqKSBOVUxMKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgLyogQnV5IGVub3VnaCBtZW1vcnkgZm9yIGFsbCB0aGUgc3ltYm9scyBhbmQgYWxsIHRoZSBuYW1lcyAqLwotICBkYXRhLT5zeW1ib2xzID0KLSAgICAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkgKiBhYmZkLT5zeW1jb3VudCk7Ci0jaWZkZWYgVU5ERVJTQ09SRV9IQUNLCi0gIC8qIGJ1eSAxIG1vcmUgY2hhciBmb3IgZWFjaCBzeW1ib2wgdG8ga2VlcCB0aGUgdW5kZXJzY29yZSBpbiovCi0gIGRhdGEtPnN0cmluZ3MgPSBiZmRfYWxsb2MgKGFiZmQsIGRhdGEtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoICsKLQkJCSAgICAgYWJmZC0+c3ltY291bnQpOwotI2Vsc2UKLSAgZGF0YS0+c3RyaW5ncyA9IGJmZF9hbGxvYyAoYWJmZCwgZGF0YS0+c3ltYm9sX3N0cmluZ19sZW5ndGgpOwotI2VuZGlmCi0gIGlmICghZGF0YS0+c3ltYm9scyB8fCAhZGF0YS0+c3RyaW5ncykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZGVzdF9kZWZpbmVkID0gZGF0YS0+c3ltYm9scyArIGFiZmQtPnN5bWNvdW50IC0gMTsKLQotICBzdHJpbmdfcHRyID0gZGF0YS0+c3RyaW5nczsKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgd2hpbGUgKGxvb3ApCi0gICAgewotCi0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3dpdGNoIChyZWNvcmQuaGVhZGVyLnR5cGUpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bToKLQkgIHsKLQkgICAgaW50IGZsYWcgPSByZWNvcmQuaGVhZGVyLnR5cGUgPT0gKGludCkgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0gPwotCSAgICAoQlNGX0xPQ0FMKSA6IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7Ci0KLQotCSAgICBzaXplX3QgbGVuZ3RoID0gb2FzeXNfc3RyaW5nX2xlbmd0aCAoJnJlY29yZCk7Ci0JICAgIHN3aXRjaCAocmVjb3JkLnN5bWJvbC5yZWxiICYgUkVMT0NBVElPTl9UWVBFX0JJVFMpCi0JICAgICAgewotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkJZGVzdC0+ZmxhZ3MgPSAwOwotCi0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1JFTDoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5zZWN0aW9uID0KLQkJICBPQVNZU19EQVRBIChhYmZkKS0+c2VjdGlvbnNbcmVjb3JkLnN5bWJvbC5yZWxiICYKLQkJCQkJICAgICAgUkVMT0NBVElPTl9TRUNUX0JJVFNdOwotCQlpZiAocmVjb3JkLmhlYWRlci50eXBlID09IChpbnQpIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtKQotCQkgIHsKLQkJICAgIGRlc3QtPmZsYWdzID0gQlNGX0xPQ0FMOwotCQkgICAgaWYgKGRlc3QtPnNlY3Rpb24gPT0gKGFzZWN0aW9uICopICh+MCkpCi0JCSAgICAgIHsKLQkJCS8qIEl0IHNlZW1zIHRoYXQgc29tZXRpbWVzIGludGVybmFsIHN5bWJvbHMgYXJlIHRpZWQgdXAsIGJ1dAotCQkgICAgICAgc3RpbGwgZ2V0IG91dHB1dCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8KLQkJICAgICAgIHNlY3Rpb24gKi8KLQkJCWRlc3QtPnNlY3Rpb24gPSAwOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCi0JCSAgICBkZXN0LT5mbGFncyA9IGZsYWc7Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9VTkQ6Ci0JCWRlc3QgPSBkYXRhLT5zeW1ib2xzICsgYmZkX2hfZ2V0XzE2IChhYmZkLCByZWNvcmQuc3ltYm9sLnJlZm5vKTsKLQkJZGVzdC0+c2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0NPTToKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlkZXN0LT5uYW1lID0gc3RyaW5nX3B0cjsKLQkJZGVzdC0+dGhlX2JmZCA9IGFiZmQ7Ci0KLQkJZGVzdC0+c2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0KLQkJYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoKLQkJZGVzdCA9IGRlc3RfZGVmaW5lZC0tOwotCQlCRkRfQVNTRVJUICgwKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBkZXN0LT5uYW1lID0gc3RyaW5nX3B0cjsKLQkgICAgZGVzdC0+dGhlX2JmZCA9IGFiZmQ7Ci0JICAgIGRlc3QtPnVkYXRhLnAgPSAoUFRSKSBOVUxMOwotCSAgICBkZXN0LT52YWx1ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLnN5bWJvbC52YWx1ZSk7Ci0KLSNpZmRlZiBVTkRFUlNDT1JFX0hBQ0sKLQkgICAgaWYgKHJlY29yZC5zeW1ib2wubmFtZVswXSAhPSAnXycpCi0JICAgICAgewotCQlzdHJpbmdfcHRyWzBdID0gJ18nOwotCQlzdHJpbmdfcHRyKys7Ci0JICAgICAgfQotI2VuZGlmCi0JICAgIG1lbWNweSAoc3RyaW5nX3B0ciwgcmVjb3JkLnN5bWJvbC5uYW1lLCBsZW5ndGgpOwotCi0KLQkgICAgc3RyaW5nX3B0cltsZW5ndGhdID0gMDsKLQkgICAgc3RyaW5nX3B0ciArPSBsZW5ndGggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGxvbmcKLW9hc3lzX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgaWYgKCEgb2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAob2FzeXNfc3ltYm9sX3R5cGUgKikpOwotfQotCi0vKgotKi8KLQotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgb2FzeXNfdmVjOwotCi1sb25nCi1vYXN5c19nZXRfc3ltdGFiIChhYmZkLCBsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqbG9jYXRpb247Ci17Ci0gIGFzeW1ib2wgKnN5bWJhc2U7Ci0gIHVuc2lnbmVkIGludCBjb3VudGVyOwotICBpZiAob2FzeXNfc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBzeW1iYXNlID0gT0FTWVNfREFUQSAoYWJmZCktPnN5bWJvbHM7Ci0gIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBhYmZkLT5zeW1jb3VudDsgY291bnRlcisrKQotICAgIHsKLSAgICAgICoobG9jYXRpb24rKykgPSBzeW1iYXNlKys7Ci0gICAgfQotICAqbG9jYXRpb24gPSAwOwotICByZXR1cm4gYWJmZC0+c3ltY291bnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgYXJjaGl2ZSBzdHVmZgotKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb2FzeXNfYXJjaGl2ZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG9hc3lzX2FyY2hpdmVfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBvYXN5c19leHRhcmNoaXZlX2hlYWRlcl90eXBlIGhlYWRlcl9leHQ7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaWxlX3B0ciBmaWxlcG9zOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKSAwLCBmYWxzZSkgIT0gMAotICAgICAgfHwgKGJmZF9yZWFkICgoUFRSKSAmIGhlYWRlcl9leHQsIDEsIHNpemVvZiAoaGVhZGVyX2V4dCksIGFiZmQpCi0JICAhPSBzaXplb2YgKGhlYWRlcl9leHQpKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaGVhZGVyLnZlcnNpb24gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQudmVyc2lvbik7Ci0gIGhlYWRlci5tb2RfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIGhlYWRlcl9leHQubW9kX2NvdW50KTsKLSAgaGVhZGVyLm1vZF90Ymxfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0Lm1vZF90Ymxfb2Zmc2V0KTsKLSAgaGVhZGVyLnN5bV90Ymxfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5zeW1fdGJsX3NpemUpOwotICBoZWFkZXIuc3ltX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnN5bV9jb3VudCk7Ci0gIGhlYWRlci5zeW1fdGJsX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgaGVhZGVyX2V4dC5zeW1fdGJsX29mZnNldCk7Ci0gIGhlYWRlci54cmVmX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnhyZWZfY291bnQpOwotICBoZWFkZXIueHJlZl9sc3Rfb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBoZWFkZXJfZXh0LnhyZWZfbHN0X29mZnNldCk7Ci0KLSAgLyoKLSAgICBUaGVyZSBpc24ndCBhIG1hZ2ljIG51bWJlciBpbiBhbiBPYXN5cyBhcmNoaXZlLCBzbyB0aGUgYmVzdCB3ZQotICAgIGNhbiBkbyB0byB2ZXJpZnkgcmVhc25hYmxlbmVzcyBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGluCi0gICAgdGhlIGhlYWRlciBhcmUgdG9vIHdlaXJkCi0gICAgKi8KLQotICBpZiAoaGVhZGVyLnZlcnNpb24gPiAxMDAwMCB8fAotICAgICAgaGVhZGVyLm1vZF9jb3VudCA+IDEwMDAwIHx8Ci0gICAgICBoZWFkZXIuc3ltX2NvdW50ID4gMTAwMDAwIHx8Ci0gICAgICBoZWFkZXIueHJlZl9jb3VudCA+IDEwMDAwMCkKLSAgICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLQotICAvKgotICAgIFRoYXQgYWxsIHdvcmtlZCwgbGV0J3MgYnV5IHRoZSBzcGFjZSBmb3IgdGhlIGhlYWRlciBhbmQgcmVhZCBpbgotICAgIHRoZSBoZWFkZXJzLgotICAgICovCi0gIHsKLSAgICBvYXN5c19hcl9kYXRhX3R5cGUgKmFyID0KLSAgICAob2FzeXNfYXJfZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChvYXN5c19hcl9kYXRhX3R5cGUpKTsKLQotICAgIG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKm1vZHVsZSA9Ci0gICAgKG9hc3lzX21vZHVsZV9pbmZvX3R5cGUgKikKLSAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSkgKiBoZWFkZXIubW9kX2NvdW50KTsKLSAgICBvYXN5c19tb2R1bGVfdGFibGVfdHlwZSByZWNvcmQ7Ci0KLSAgICBpZiAoIWFyIHx8ICFtb2R1bGUpCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGFiZmQtPnRkYXRhLm9hc3lzX2FyX2RhdGEgPSBhcjsKLSAgICBhci0+bW9kdWxlID0gbW9kdWxlOwotICAgIGFyLT5tb2R1bGVfY291bnQgPSBoZWFkZXIubW9kX2NvdW50OwotCi0gICAgZmlsZXBvcyA9IGhlYWRlci5tb2RfdGJsX29mZnNldDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVyLm1vZF9jb3VudDsgaSsrKQotICAgICAgewotCWlmIChiZmRfc2VlayAoYWJmZCwgZmlsZXBvcywgU0VFS19TRVQpICE9IDApCi0JICByZXR1cm4gTlVMTDsKLQotCS8qIFRoZXJlIGFyZSB0d28gd2F5cyBvZiBzcGVjaWZ5aW5nIHRoZSBhcmNoaXZlIGhlYWRlciAqLwotCi0JaWYgKDApCi0JICB7Ci0JICAgIG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2FfdHlwZSByZWNvcmRfZXh0OwotCSAgICBpZiAoYmZkX3JlYWQgKChQVFIpICYgcmVjb3JkX2V4dCwgMSwgc2l6ZW9mIChyZWNvcmRfZXh0KSwgYWJmZCkKLQkJIT0gc2l6ZW9mIChyZWNvcmRfZXh0KSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQotCSAgICByZWNvcmQubW9kX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQubW9kX3NpemUpOwotCSAgICByZWNvcmQuZmlsZV9vZmZzZXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZmlsZV9vZmZzZXQpOwotCi0JICAgIHJlY29yZC5kZXBfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwX2NvdW50KTsKLQkgICAgcmVjb3JkLmRlcGVlX2NvdW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmRfZXh0LmRlcGVlX2NvdW50KTsKLQkgICAgcmVjb3JkLnNlY3RfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuc2VjdF9jb3VudCk7Ci0KLQkgICAgbW9kdWxlW2ldLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIDMzKTsKLQkgICAgaWYgKCFtb2R1bGVbaV0ubmFtZSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQotCSAgICBtZW1jcHkgKG1vZHVsZVtpXS5uYW1lLCByZWNvcmRfZXh0Lm1vZF9uYW1lLCAzMyk7Ci0JICAgIGZpbGVwb3MgKz0KLQkgICAgICBzaXplb2YgKHJlY29yZF9leHQpICsKLQkgICAgICByZWNvcmQuZGVwX2NvdW50ICogNCArCi0JICAgICAgcmVjb3JkLmRlcGVlX2NvdW50ICogNCArCi0JICAgICAgcmVjb3JkLnNlY3RfY291bnQgKiA4ICsgMTg3OwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYl90eXBlIHJlY29yZF9leHQ7Ci0JICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiByZWNvcmRfZXh0LCAxLCBzaXplb2YgKHJlY29yZF9leHQpLCBhYmZkKQotCQkhPSBzaXplb2YgKHJlY29yZF9leHQpKQotCSAgICAgIHJldHVybiBOVUxMOwotCi0JICAgIHJlY29yZC5tb2Rfc2l6ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5tb2Rfc2l6ZSk7Ci0JICAgIHJlY29yZC5maWxlX29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5maWxlX29mZnNldCk7Ci0KLQkgICAgcmVjb3JkLmRlcF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5kZXBfY291bnQpOwotCSAgICByZWNvcmQuZGVwZWVfY291bnQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQuZGVwZWVfY291bnQpOwotCSAgICByZWNvcmQuc2VjdF9jb3VudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkX2V4dC5zZWN0X2NvdW50KTsKLQkgICAgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHJlY29yZF9leHQubW9kX25hbWVfbGVuZ3RoKTsKLQotCSAgICBtb2R1bGVbaV0ubmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUgKyAxKTsKLQkgICAgaWYgKCFtb2R1bGVbaV0ubmFtZSkKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgaWYgKGJmZF9yZWFkICgoUFRSKSBtb2R1bGVbaV0ubmFtZSwgMSwgcmVjb3JkLm1vZHVsZV9uYW1lX3NpemUsCi0JCQkgIGFiZmQpCi0JCSE9IHJlY29yZC5tb2R1bGVfbmFtZV9zaXplKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICBtb2R1bGVbaV0ubmFtZVtyZWNvcmQubW9kdWxlX25hbWVfc2l6ZV0gPSAwOwotCSAgICBmaWxlcG9zICs9Ci0JICAgICAgc2l6ZW9mIChyZWNvcmRfZXh0KSArCi0JICAgICAgcmVjb3JkLmRlcF9jb3VudCAqIDQgKwotCSAgICAgIHJlY29yZC5tb2R1bGVfbmFtZV9zaXplICsgMTsKLQotCSAgfQotCi0KLQltb2R1bGVbaV0uc2l6ZSA9IHJlY29yZC5tb2Rfc2l6ZTsKLQltb2R1bGVbaV0ucG9zID0gcmVjb3JkLmZpbGVfb2Zmc2V0OwotCW1vZHVsZVtpXS5hYmZkID0gMDsKLSAgICAgIH0KLQotICB9Ci0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLQotICBhYmZkLT50ZGF0YS5vYXN5c19vYmpfZGF0YSA9IChvYXN5c19kYXRhX3R5cGUgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX2RhdGFfdHlwZSkpOwotICByZXR1cm4gYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLSNkZWZpbmUgTUFYX1NFQ1MgMTYKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLW9hc3lzX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG9hc3lzX2RhdGFfdHlwZSAqb2FzeXM7Ci0gIG9hc3lzX2RhdGFfdHlwZSAqc2F2ZSA9IE9BU1lTX0RBVEEgKGFiZmQpOwotICBib29sZWFuIGxvb3AgPSB0cnVlOwotICBib29sZWFuIGhhZF91c2VmdWxsID0gZmFsc2U7Ci0KLSAgYWJmZC0+dGRhdGEub2FzeXNfb2JqX2RhdGEgPSAwOwotICBvYXN5c19ta29iamVjdCAoYWJmZCk7Ci0gIG9hc3lzID0gT0FTWVNfREFUQSAoYWJmZCk7Ci0gIG1lbXNldCAoKFBUUikgb2FzeXMtPnNlY3Rpb25zLCAweGZmLCBzaXplb2YgKG9hc3lzLT5zZWN0aW9ucykpOwotCi0gIC8qIFBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBmYWlsOwotICBvYXN5cy0+c3ltYm9sX3N0cmluZ19sZW5ndGggPSAwOwotICAvKiBJbnNwZWN0IHRoZSByZWNvcmRzLCBidXQgb25seSBrZWVwIHRoZSBzZWN0aW9uIGluZm8gLQotICAgICByZW1lbWJlciB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9scwotICAgICAqLwotICBvYXN5cy0+Zmlyc3RfZGF0YV9yZWNvcmQgPSAwOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSByZWNvcmQ7Ci0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JZ290byBmYWlsOwotICAgICAgaWYgKChzaXplX3QpIHJlY29yZC5oZWFkZXIubGVuZ3RoIDwgKHNpemVfdCkgc2l6ZW9mIChyZWNvcmQuaGVhZGVyKSkKLQlnb3RvIGZhaWw7Ci0KLQotICAgICAgc3dpdGNoICgob2FzeXNfcmVjb3JkX2VudW1fdHlwZSkgKHJlY29yZC5oZWFkZXIudHlwZSkpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgaGFkX3VzZWZ1bGwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfbG9jYWxfZW51bToKLQkgIC8qIENvdW50IHN5bWJvbHMgYW5kIHJlbWVtYmVyIHRoZWlyIHNpemUgZm9yIGEgZnV0dXJlIG1hbGxvYyAgICovCi0JICBhYmZkLT5zeW1jb3VudCsrOwotCSAgb2FzeXMtPnN5bWJvbF9zdHJpbmdfbGVuZ3RoICs9IDEgKyBvYXN5c19zdHJpbmdfbGVuZ3RoICgmcmVjb3JkKTsKLQkgIGhhZF91c2VmdWxsID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX3NlY3Rpb25fZW51bToKLQkgIHsKLQkgICAgYXNlY3Rpb24gKnM7Ci0JICAgIGNoYXIgKmJ1ZmZlcjsKLQkgICAgdW5zaWduZWQgaW50IHNlY3Rpb25fbnVtYmVyOwotCSAgICBpZiAocmVjb3JkLnNlY3Rpb24uaGVhZGVyLmxlbmd0aCAhPSBzaXplb2YgKHJlY29yZC5zZWN0aW9uKSkKLQkgICAgICB7Ci0JCWdvdG8gZmFpbDsKLQkgICAgICB9Ci0JICAgIGJ1ZmZlciA9IGJmZF9hbGxvYyAoYWJmZCwgMyk7Ci0JICAgIGlmICghYnVmZmVyKQotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgc2VjdGlvbl9udW1iZXIgPSByZWNvcmQuc2VjdGlvbi5yZWxiICYgUkVMT0NBVElPTl9TRUNUX0JJVFM7Ci0JICAgIHNwcmludGYgKGJ1ZmZlciwgIiV1Iiwgc2VjdGlvbl9udW1iZXIpOwotCSAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgYnVmZmVyKTsKLQkgICAgb2FzeXMtPnNlY3Rpb25zW3NlY3Rpb25fbnVtYmVyXSA9IHM7Ci0JICAgIHN3aXRjaCAocmVjb3JkLnNlY3Rpb24ucmVsYiAmIFJFTE9DQVRJT05fVFlQRV9CSVRTKQotCSAgICAgIHsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9BQlM6Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfUkVMOgotCQlicmVhazsKLQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9VTkQ6Ci0JICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQlCRkRfRkFJTCAoKTsKLQkgICAgICB9Ci0KLQkgICAgcy0+X3Jhd19zaXplID0gYmZkX2hfZ2V0XzMyIChhYmZkLCByZWNvcmQuc2VjdGlvbi52YWx1ZSk7Ci0JICAgIHMtPnZtYSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLnNlY3Rpb24udm1hKTsKLQkgICAgcy0+ZmxhZ3MgPSAwOwotCSAgICBoYWRfdXNlZnVsbCA9IHRydWU7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19kYXRhX2VudW06Ci0JICBvYXN5cy0+Zmlyc3RfZGF0YV9yZWNvcmQgPSBiZmRfdGVsbCAoYWJmZCkgLSByZWNvcmQuaGVhZGVyLmxlbmd0aDsKLQljYXNlIG9hc3lzX3JlY29yZF9pc19kZWJ1Z19lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX21vZHVsZV9lbnVtOgotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX25hbWVkX3NlY3Rpb25fZW51bToKLQljYXNlIG9hc3lzX3JlY29yZF9pc19lbmRfZW51bToKLQkgIGlmIChoYWRfdXNlZnVsbCA9PSBmYWxzZSkKLQkgICAgZ290byBmYWlsOwotCSAgbG9vcCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGdvdG8gZmFpbDsKLQl9Ci0gICAgfQotICBvYXN5cy0+c3ltYm9scyA9IChhc3ltYm9sICopIE5VTEw7Ci0gIC8qCi0gICAgT2FzeXMgc3VwcG9ydCBzZXZlcmFsIGFyY2hpdGVjdHVyZXMsIGJ1dCBJIGNhbid0IHNlZSBhIHNpbXBsZSB3YXkKLSAgICB0byBkaXNjb3ZlciB3aGljaCBvbmUgaXMgaW4gYSBwYXJ0aWN1bGFyIGZpbGUgLSB3ZSdsbCBndWVzcwotICAgICovCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX202OGssIDApOwotICBpZiAoYWJmZC0+c3ltY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLSAgICB9Ci0KLSAgLyoKLSAgICBXZSBkb24ndCBrbm93IGlmIGEgc2VjdGlvbiBoYXMgZGF0YSB1bnRpbCB3ZSd2ZSByZWFkIGl0Li4KLSAgICAqLwotCi0gIG9hc3lzX3NsdXJwX3NlY3Rpb25fZGF0YSAoYWJmZCk7Ci0KLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLQotZmFpbDoKLSAgKHZvaWQpIGJmZF9yZWxlYXNlIChhYmZkLCBvYXN5cyk7Ci0gIGFiZmQtPnRkYXRhLm9hc3lzX29ial9kYXRhID0gc2F2ZTsKLSAgcmV0dXJuIChjb25zdCBiZmRfdGFyZ2V0ICopIE5VTEw7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW9hc3lzX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotICBpZiAoIXN5bWJvbC0+c2VjdGlvbikKLSAgICByZXQtPnR5cGUgPSAoc3ltYm9sLT5mbGFncyAmIEJTRl9MT0NBTCkgPyAnYScgOiAnQSc7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYXN5c19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9uYW1lOgotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9tb3JlOgotICAgICAgZnByaW50ZiAoZmlsZSwgIiVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uID09IChhc2VjdGlvbiAqKSBOVUxMID8KLQkoQ09OU1QgY2hhciAqKSAiKmFicyIgOiBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQliZmRfcHJpbnRfc3ltYm9sX3ZhbmRmICgoUFRSKSBmaWxlLCBzeW1ib2wpOwotCi0JZnByaW50ZiAoZmlsZSwgIiAlLTVzICVzIiwKLQkJIHNlY3Rpb25fbmFtZSwKLQkJIHN5bWJvbC0+bmFtZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0vKgotIFRoZSBob3d0byB0YWJsZSBpcyBidWlsZCB1c2luZyB0aGUgdG9wIHR3byBiaXRzIG9mIGEgcmVsb2MgYnl0ZSB0bwotIGluZGV4IGludG8gaXQuIFRoZSBiaXRzIGFyZSBQQ1JFTCxXT1JEL0xPTkcKLSovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBob3d0b190YWJsZVtdID0KLXsKLQotICBIT1dUTyAoMCwgMCwgMSwgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMiwgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgMCwgImFiczMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoMCwgMCwgMSwgMTYsIHRydWUsIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgMCwgInBjcmVsMTYiLCB0cnVlLCAweDAwMDBmZmZmLCAweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPICgwLCAwLCAyLCAzMiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAwLCAicGNyZWwzMiIsIHRydWUsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIGZhbHNlKQotfTsKLQotLyogUmVhZCBpbiBhbGwgdGhlIHNlY3Rpb24gZGF0YSBhbmQgcmVsb2NhdGlvbiBzdHVmZiB0b28gKi8KLXN0YXRpYyBib29sZWFuCi1vYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqQ09OU1QgYWJmZDsKLXsKLSAgb2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgcmVjb3JkOwotICBvYXN5c19kYXRhX3R5cGUgKmRhdGEgPSBPQVNZU19EQVRBIChhYmZkKTsKLSAgYm9vbGVhbiBsb29wID0gdHJ1ZTsKLQotICBvYXN5c19wZXJfc2VjdGlvbl90eXBlICpwZXI7Ci0KLSAgYXNlY3Rpb24gKnM7Ci0KLSAgLyogU2VlIGlmIHRoZSBkYXRhIGhhcyBiZWVuIHNsdXJwZWQgYWxyZWFkeSAuLiAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgcGVyID0gb2FzeXNfcGVyX3NlY3Rpb24gKHMpOwotICAgICAgaWYgKHBlci0+aW5pdGlhbGl6ZWQgPT0gdHJ1ZSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGRhdGEtPmZpcnN0X2RhdGFfcmVjb3JkID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBkYXRhLT5maXJzdF9kYXRhX3JlY29yZCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBpZiAoISBvYXN5c19yZWFkX3JlY29yZCAoYWJmZCwgJnJlY29yZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgc3dpdGNoIChyZWNvcmQuaGVhZGVyLnR5cGUpCi0JewotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2hlYWRlcl9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfZGF0YV9lbnVtOgotCSAgewotCi0JICAgIGJmZF9ieXRlICpzcmMgPSByZWNvcmQuZGF0YS5kYXRhOwotCSAgICBiZmRfYnl0ZSAqZW5kX3NyYyA9ICgoYmZkX2J5dGUgKikgJiByZWNvcmQpICsgcmVjb3JkLmhlYWRlci5sZW5ndGg7Ci0JICAgIGJmZF9ieXRlICpkc3RfcHRyOwotCSAgICBiZmRfYnl0ZSAqZHN0X2Jhc2VfcHRyOwotCSAgICB1bnNpZ25lZCBpbnQgcmVsYml0OwotCSAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JICAgIGFzZWN0aW9uICpzZWN0aW9uID0KLQkgICAgZGF0YS0+c2VjdGlvbnNbcmVjb3JkLmRhdGEucmVsYiAmIFJFTE9DQVRJT05fU0VDVF9CSVRTXTsKLQkgICAgYmZkX3ZtYSBkc3Rfb2Zmc2V0OwotCi0JICAgIHBlciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKTsKLQotCSAgICBpZiAocGVyLT5pbml0aWFsaXplZCA9PSBmYWxzZSkKLQkgICAgICB7Ci0JCXBlci0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCQlpZiAoIXBlci0+ZGF0YSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXBlci0+cmVsb2NfdGFpbF9wdHIgPSAob2FzeXNfcmVsb2NfdHlwZSAqKikgJiAoc2VjdGlvbi0+cmVsb2NhdGlvbik7Ci0JCXBlci0+aGFkX3ZtYSA9IGZhbHNlOwotCQlwZXItPmluaXRpYWxpemVkID0gdHJ1ZTsKLQkJc2VjdGlvbi0+cmVsb2NfY291bnQgPSAwOwotCQlzZWN0aW9uLT5mbGFncyA9IFNFQ19BTExPQzsKLQkgICAgICB9Ci0KLQkgICAgZHN0X29mZnNldCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgcmVjb3JkLmRhdGEuYWRkcik7Ci0JICAgIGlmIChwZXItPmhhZF92bWEgPT0gZmFsc2UpCi0JICAgICAgewotCQkvKiBUYWtlIHRoZSBmaXJzdCB2bWEgd2Ugc2VlIGFzIHRoZSBiYXNlICovCi0JCXNlY3Rpb24tPnZtYSA9IGRzdF9vZmZzZXQ7Ci0JCXBlci0+aGFkX3ZtYSA9IHRydWU7Ci0JICAgICAgfQotCi0JICAgIGRzdF9vZmZzZXQgLT0gc2VjdGlvbi0+dm1hOwotCi0JICAgIGRzdF9iYXNlX3B0ciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YTsKLQkgICAgZHN0X3B0ciA9IG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArCi0JICAgICAgZHN0X29mZnNldDsKLQotCSAgICBpZiAoc3JjIDwgZW5kX3NyYykKLQkgICAgICB7Ci0JCXNlY3Rpb24tPmZsYWdzIHw9IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUzsKLQkgICAgICB9Ci0JICAgIHdoaWxlIChzcmMgPCBlbmRfc3JjKQotCSAgICAgIHsKLQkJdW5zaWduZWQgY2hhciBtb2RfYnl0ZSA9ICpzcmMrKzsKLQkJc2l6ZV90IGdhcCA9IGVuZF9zcmMgLSBzcmM7Ci0KLQkJY291bnQgPSA4OwotCQlpZiAobW9kX2J5dGUgPT0gMCAmJiBnYXAgPj0gOCkKLQkJICB7Ci0JCSAgICBkc3RfcHRyWzBdID0gc3JjWzBdOwotCQkgICAgZHN0X3B0clsxXSA9IHNyY1sxXTsKLQkJICAgIGRzdF9wdHJbMl0gPSBzcmNbMl07Ci0JCSAgICBkc3RfcHRyWzNdID0gc3JjWzNdOwotCQkgICAgZHN0X3B0cls0XSA9IHNyY1s0XTsKLQkJICAgIGRzdF9wdHJbNV0gPSBzcmNbNV07Ci0JCSAgICBkc3RfcHRyWzZdID0gc3JjWzZdOwotCQkgICAgZHN0X3B0cls3XSA9IHNyY1s3XTsKLQkJICAgIGRzdF9wdHIgKz0gODsKLQkJICAgIHNyYyArPSA4OwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGZvciAocmVsYml0ID0gMTsgY291bnQtLSAhPSAwICYmIHNyYyA8IGVuZF9zcmM7IHJlbGJpdCA8PD0gMSkKLQkJICAgICAgewotCQkJaWYgKHJlbGJpdCAmIG1vZF9ieXRlKQotCQkJICB7Ci0JCQkgICAgdW5zaWduZWQgY2hhciByZWxvYyA9ICpzcmM7Ci0JCQkgICAgLyogVGhpcyBpdGVtIG5lZWRzIHRvIGJlIHJlbG9jYXRlZCAqLwotCQkJICAgIHN3aXRjaCAocmVsb2MgJiBSRUxPQ0FUSU9OX1RZUEVfQklUUykKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX0FCUzoKLQotCQkJCWJyZWFrOwotCi0JCQkgICAgICBjYXNlIFJFTE9DQVRJT05fVFlQRV9SRUw6Ci0JCQkJewotCQkJCSAgLyogUmVsb2NhdGUgdGhlIGl0ZW0gcmVsYXRpdmUgdG8gdGhlIHNlY3Rpb24gKi8KLQkJCQkgIG9hc3lzX3JlbG9jX3R5cGUgKnIgPQotCQkJCSAgKG9hc3lzX3JlbG9jX3R5cGUgKikKLQkJCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAgICBzaXplb2YgKG9hc3lzX3JlbG9jX3R5cGUpKTsKLQkJCQkgIGlmICghcikKLQkJCQkgICAgcmV0dXJuIGZhbHNlOwotCQkJCSAgKihwZXItPnJlbG9jX3RhaWxfcHRyKSA9IHI7Ci0JCQkJICBwZXItPnJlbG9jX3RhaWxfcHRyID0gJnItPm5leHQ7Ci0JCQkJICByLT5uZXh0ID0gKG9hc3lzX3JlbG9jX3R5cGUgKikgTlVMTDsKLQkJCQkgIC8qIFJlZmVyZW5jZSB0byB1bmRlZmluZWQgc3ltYm9sICovCi0JCQkJICBzcmMrKzsKLQkJCQkgIC8qIFRoZXJlIGlzIG5vIHN5bWJvbCAqLwotCQkJCSAgci0+c3ltYm9sID0gMDsKLQkJCQkgIC8qIFdvcmsgb3V0IHRoZSBob3d0byAqLwotCQkJCSAgYWJvcnQgKCk7Ci0jaWYgMAotCQkJCSAgci0+cmVsZW50LnNlY3Rpb24gPQotCQkJCSAgICBkYXRhLT5zZWN0aW9uc1tyZWxvYyAmCi0JCQkJCQkgICBSRUxPQ0FUSU9OX1NFQ1RfQklUU107Ci0KLQkJCQkgIHItPnJlbGVudC5hZGRlbmQgPSAtCi0JCQkJICAgIHItPnJlbGVudC5zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQkJCQkgIHItPnJlbGVudC5hZGRyZXNzID0gZHN0X3B0ciAtIGRzdF9iYXNlX3B0cjsKLQkJCQkgIHItPnJlbGVudC5ob3d0byA9ICZob3d0b190YWJsZVtyZWxvYyA+PiA2XTsKLQkJCQkgIHItPnJlbGVudC5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBOVUxMOwotCQkJCSAgc2VjdGlvbi0+cmVsb2NfY291bnQrKzsKLQotCQkJCSAgLyogRmFrZSB1cCB0aGUgZGF0YSB0byBsb29rIGxpa2UgaXQncyBnb3QgdGhlIC12ZSBwYyBpbiBpdCwgdGhpcyBtYWtlcwotCQkJCSAgICAgICBpdCBtdWNoIGVhc2llciB0byBjb252ZXJ0IGludG8gb3RoZXIgZm9ybWF0cy4gVGhpcyBpcyBkb25lIGJ5Ci0JCQkJICAgICAgIGhpdHRpbmcgdGhlIGFkZGVuZC4KLQkJCQkgICAgICAgKi8KLQkJCQkgIGlmIChyLT5yZWxlbnQuaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0JCQkJICAgIHsKLQkJCQkgICAgICByLT5yZWxlbnQuYWRkZW5kIC09IGRzdF9wdHIgLSBkc3RfYmFzZV9wdHI7Ci0JCQkJICAgIH0KLQotCi0JCQkJfQotCQkJCWJyZWFrOwotCi0KLQkJCSAgICAgIGNhc2UgUkVMT0NBVElPTl9UWVBFX1VORDoKLQkJCQl7Ci0JCQkJICBvYXN5c19yZWxvY190eXBlICpyID0KLQkJCQkgIChvYXN5c19yZWxvY190eXBlICopCi0JCQkJICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgc2l6ZW9mIChvYXN5c19yZWxvY190eXBlKSk7Ci0JCQkJICBpZiAoIXIpCi0JCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCQkgICoocGVyLT5yZWxvY190YWlsX3B0cikgPSByOwotCQkJCSAgcGVyLT5yZWxvY190YWlsX3B0ciA9ICZyLT5uZXh0OwotCQkJCSAgci0+bmV4dCA9IChvYXN5c19yZWxvY190eXBlICopIE5VTEw7Ci0JCQkJICAvKiBSZWZlcmVuY2UgdG8gdW5kZWZpbmVkIHN5bWJvbCAqLwotCQkJCSAgc3JjKys7Ci0JCQkJICAvKiBHZXQgc3ltYm9sIG51bWJlciAqLwotCQkJCSAgci0+c3ltYm9sID0gKHNyY1swXSA8PCA4KSB8IHNyY1sxXTsKLQkJCQkgIC8qIFdvcmsgb3V0IHRoZSBob3d0byAqLwotCQkJCSAgYWJvcnQgKCk7Ci0KLSNpZiAwCi0JCQkJICByLT5yZWxlbnQuc2VjdGlvbiA9IChhc2VjdGlvbgotCQkJCQkJICAgICAgICopIE5VTEw7Ci0jZW5kaWYKLQkJCQkgIHItPnJlbGVudC5hZGRlbmQgPSAwOwotCQkJCSAgci0+cmVsZW50LmFkZHJlc3MgPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgci0+cmVsZW50Lmhvd3RvID0gJmhvd3RvX3RhYmxlW3JlbG9jID4+IDZdOwotCQkJCSAgci0+cmVsZW50LnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0JCQkJICBzZWN0aW9uLT5yZWxvY19jb3VudCsrOwotCi0JCQkJICBzcmMgKz0gMjsKLQkJCQkgIC8qIEZha2UgdXAgdGhlIGRhdGEgdG8gbG9vayBsaWtlIGl0J3MgZ290IHRoZSAtdmUgcGMgaW4gaXQsIHRoaXMgbWFrZXMKLQkJCQkgICAgICAgaXQgbXVjaCBlYXNpZXIgdG8gY29udmVydCBpbnRvIG90aGVyIGZvcm1hdHMuIFRoaXMgaXMgZG9uZSBieQotCQkJCSAgICAgICBoaXR0aW5nIHRoZSBhZGRlbmQuCi0JCQkJICAgICAgICovCi0JCQkJICBpZiAoci0+cmVsZW50Lmhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotCQkJCSAgICB7Ci0JCQkJICAgICAgci0+cmVsZW50LmFkZGVuZCAtPSBkc3RfcHRyIC0gZHN0X2Jhc2VfcHRyOwotCQkJCSAgICB9Ci0KLQotCi0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSBSRUxPQ0FUSU9OX1RZUEVfQ09NOgotCQkJCUJGRF9GQUlMICgpOwotCQkJICAgICAgfQotCQkJICB9Ci0JCQkqZHN0X3B0cisrID0gKnNyYysrOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCWNhc2Ugb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW06Ci0JY2FzZSBvYXN5c19yZWNvcmRfaXNfc2VjdGlvbl9lbnVtOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGxvb3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotCi19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19uZXdfc2VjdGlvbl9ob29rIChhYmZkLCBuZXdzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpuZXdzZWN0OwotewotICBuZXdzZWN0LT51c2VkX2J5X2JmZCA9IChQVFIpCi0gICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX3Blcl9zZWN0aW9uX3R5cGUpKTsKLSAgaWYgKCFuZXdzZWN0LT51c2VkX2J5X2JmZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+ZGF0YSA9IChiZmRfYnl0ZSAqKSBOVUxMOwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPnNlY3Rpb24gPSBuZXdzZWN0OwotICBvYXN5c19wZXJfc2VjdGlvbiAobmV3c2VjdCktPm9mZnNldCA9IDA7Ci0gIG9hc3lzX3Blcl9zZWN0aW9uIChuZXdzZWN0KS0+aW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMTsKLSAgLyogVHVybiB0aGUgc2VjdGlvbiBzdHJpbmcgaW50byBhbiBpbmRleCAqLwotCi0gIHNzY2FuZiAobmV3c2VjdC0+bmFtZSwgIiV1IiwgJm5ld3NlY3QtPnRhcmdldF9pbmRleCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGxvbmcKLW9hc3lzX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgYXNlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBhc2VjdDsKLXsKLSAgaWYgKCEgb2FzeXNfc2x1cnBfc2VjdGlvbl9kYXRhIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c19nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgb2FzeXNfcGVyX3NlY3Rpb25fdHlwZSAqcCA9IChvYXN5c19wZXJfc2VjdGlvbl90eXBlICopIHNlY3Rpb24tPnVzZWRfYnlfYmZkOwotICBvYXN5c19zbHVycF9zZWN0aW9uX2RhdGEgKGFiZmQpOwotICBpZiAocC0+aW5pdGlhbGl6ZWQgPT0gZmFsc2UpCi0gICAgewotICAgICAgKHZvaWQpIG1lbXNldCAobG9jYXRpb24sIDAsIChpbnQpIGNvdW50KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAodm9pZCkgbWVtY3B5IChsb2NhdGlvbiwgKFBUUikgKHAtPmRhdGEgKyBvZmZzZXQpLCAoaW50KSBjb3VudCk7Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1sb25nCi1vYXN5c19jYW5vbmljYWxpemVfcmVsb2MgKGlnbm9yZV9hYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCByZWxvY19jb3VudCA9IDA7Ci0gIG9hc3lzX3JlbG9jX3R5cGUgKnNyYyA9IChvYXN5c19yZWxvY190eXBlICopIChzZWN0aW9uLT5yZWxvY2F0aW9uKTsKLSAgd2hpbGUgKHNyYyAhPSAob2FzeXNfcmVsb2NfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFib3J0ICgpOwotCi0jaWYgMAotICAgICAgaWYgKHNyYy0+cmVsZW50LnNlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgc3JjLT5yZWxlbnQuc3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgc3JjLT5zeW1ib2w7Ci0JfQotI2VuZGlmCi0KLSAgICAgICpyZWxwdHIrKyA9ICZzcmMtPnJlbGVudDsKLSAgICAgIHNyYyA9IHNyYy0+bmV4dDsKLSAgICAgIHJlbG9jX2NvdW50Kys7Ci0gICAgfQotICAqcmVscHRyID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50ID0gcmVsb2NfY291bnQ7Ci19Ci0KLQotCi0KLS8qIFdyaXRpbmcgKi8KLQotCi0vKiBDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGFuZCB3cml0ZSBvbmUgcmVjb3JkICovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLCB0eXBlLCByZWNvcmQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgb2FzeXNfcmVjb3JkX2VudW1fdHlwZSB0eXBlOwotICAgICBvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqcmVjb3JkOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgaW50IGNoZWNrc3VtOwotICBzaXplX3QgaTsKLSAgdW5zaWduZWQgY2hhciAqcHRyOwotCi0gIHJlY29yZC0+aGVhZGVyLmxlbmd0aCA9IHNpemU7Ci0gIHJlY29yZC0+aGVhZGVyLnR5cGUgPSAoaW50KSB0eXBlOwotICByZWNvcmQtPmhlYWRlci5jaGVja19zdW0gPSAwOwotICByZWNvcmQtPmhlYWRlci5maWxsID0gMDsKLSAgcHRyID0gKHVuc2lnbmVkIGNoYXIgKikgJnJlY29yZC0+cGFkWzBdOwotICBjaGVja3N1bSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgY2hlY2tzdW0gKz0gKnB0cisrOwotICAgIH0KLSAgcmVjb3JkLT5oZWFkZXIuY2hlY2tfc3VtID0gMHhmZiAmICgtY2hlY2tzdW0pOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSByZWNvcmQsIDEsIHNpemUsIGFiZmQpICE9IHNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBXcml0ZSBvdXQgYWxsIHRoZSBzeW1ib2xzICovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfc3ltcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGFzeW1ib2wgKipnZW5lcmljID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGluZGV4ID0gMDsKLSAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7IGNvdW50KyspCi0gICAgewotCi0gICAgICBvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUgc3ltYm9sOwotICAgICAgYXN5bWJvbCAqQ09OU1QgZyA9IGdlbmVyaWNbY291bnRdOwotCi0gICAgICBDT05TVCBjaGFyICpzcmMgPSBnLT5uYW1lOwotICAgICAgY2hhciAqZHN0ID0gc3ltYm9sLm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbCA9IDA7Ci0KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGctPnNlY3Rpb24pKQotCXsKLQkgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX0NPTTsKLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgaW5kZXgsIHN5bWJvbC5yZWZubyk7Ci0JICBpbmRleCsrOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoZy0+c2VjdGlvbikpCi0JewotCSAgc3ltYm9sLnJlbGIgPSBSRUxPQ0FUSU9OX1RZUEVfQUJTOwotCSAgYmZkX2hfcHV0XzE2IChhYmZkLCAwLCBzeW1ib2wucmVmbm8pOwotCi0JfQotICAgICAgZWxzZSBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChnLT5zZWN0aW9uKSkKLQl7Ci0JICBzeW1ib2wucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9VTkQ7Ci0JICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluZGV4LCBzeW1ib2wucmVmbm8pOwotCSAgLyogT3ZlcmxvYWQgdGhlIHZhbHVlIGZpZWxkIHdpdGggdGhlIG91dHB1dCBpbmRleCBudW1iZXIgKi8KLQkgIGluZGV4Kys7Ci0JfQotICAgICAgZWxzZSBpZiAoZy0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotCXsKLQkgIC8qIHRocm93IGl0IGF3YXkgKi8KLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZy0+c2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFNvbWV0aW1lLCB0aGUgb2FzeXMgdG9vbHMgZ2l2ZSBvdXQgYSBzeW1ib2wgd2l0aCBpbGxlZ2FsCi0JICAgYml0cyBpbiBpdCwgd2UnbGwgb3V0cHV0IGl0IGluIHRoZSBzYW1lIGJyb2tlbiB3YXkgKi8KLQotCSAgICAgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX1JFTCB8IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bWJvbC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX1JFTCB8IGctPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICAgIH0KLQkgIGJmZF9oX3B1dF8xNiAoYWJmZCwgMCwgc3ltYm9sLnJlZm5vKTsKLQl9Ci0jaWZkZWYgVU5ERVJTQ09SRV9IQUNLCi0gICAgICBpZiAoc3JjW2xdID09ICdfJykKLQlkc3RbbCsrXSA9ICcuJzsKLSNlbmRpZgotICAgICAgd2hpbGUgKHNyY1tsXSkKLQl7Ci0JICBkc3RbbF0gPSBzcmNbbF07Ci0JICBsKys7Ci0JfQotCi0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGctPnZhbHVlLCBzeW1ib2wudmFsdWUpOwotCi0KLSAgICAgIGlmIChnLT5mbGFncyAmIEJTRl9MT0NBTCkKLQl7Ci0JICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkJICAgIG9hc3lzX3JlY29yZF9pc19sb2NhbF9lbnVtLAotCQkJCSAgICAob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikgJiBzeW1ib2wsCi0JCQkJICAgIG9mZnNldG9mIChvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGUsCi0JCQkJCSAgICAgIG5hbWVbMF0pICsgbCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJCSAgICBvYXN5c19yZWNvcmRfaXNfc3ltYm9sX2VudW0sCi0JCQkJICAgIChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIHN5bWJvbCwKLQkJCQkgICAgb2Zmc2V0b2YgKG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSwKLQkJCQkJICAgICAgbmFtZVswXSkgKyBsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGctPnZhbHVlID0gaW5kZXggLSAxOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0gLyogV3JpdGUgYSBzZWN0aW9uIGhlYWRlciBmb3IgZWFjaCBzZWN0aW9uICovCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfc2VjdGlvbnMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIHN0YXRpYyBvYXN5c19zZWN0aW9uX3JlY29yZF90eXBlIG91dDsKLQotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgcy0+bmFtZVswXSkpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogY2FuIG5vdCByZXByZXNlbnQgc2VjdGlvbiBgJXMnIGluIG9hc3lzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgcy0+bmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9ucmVwcmVzZW50YWJsZV9zZWN0aW9uKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBvdXQucmVsYiA9IFJFTE9DQVRJT05fVFlQRV9SRUwgfCBzLT50YXJnZXRfaW5kZXg7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIHMtPl9jb29rZWRfc2l6ZSwgb3V0LnZhbHVlKTsKLSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcy0+dm1hLCBvdXQudm1hKTsKLQotICAgICAgaWYgKCEgb2FzeXNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJCW9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW0sCi0JCQkJKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgb3V0LAotCQkJCXNpemVvZiAob3V0KSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9oZWFkZXIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQ3JlYXRlIGFuZCB3cml0ZSB0aGUgaGVhZGVyICovCi0gIG9hc3lzX2hlYWRlcl9yZWNvcmRfdHlwZSByOwotICBzaXplX3QgbGVuZ3RoID0gc3RybGVuIChhYmZkLT5maWxlbmFtZSk7Ci0gIGlmIChsZW5ndGggPiAoc2l6ZV90KSBzaXplb2YgKHIubW9kdWxlX25hbWUpKQotICAgIHsKLSAgICAgIGxlbmd0aCA9IHNpemVvZiAoci5tb2R1bGVfbmFtZSk7Ci0gICAgfQotCi0gICh2b2lkKSBtZW1jcHkgKHIubW9kdWxlX25hbWUsCi0JCSBhYmZkLT5maWxlbmFtZSwKLQkJIGxlbmd0aCk7Ci0gICh2b2lkKSBtZW1zZXQgKHIubW9kdWxlX25hbWUgKyBsZW5ndGgsCi0JCSAnICcsCi0JCSBzaXplb2YgKHIubW9kdWxlX25hbWUpIC0gbGVuZ3RoKTsKLQotICByLnZlcnNpb25fbnVtYmVyID0gT0FTWVNfVkVSU0lPTl9OVU1CRVI7Ci0gIHIucmV2X251bWJlciA9IE9BU1lTX1JFVl9OVU1CRVI7Ci0gIGlmICghIG9hc3lzX3dyaXRlX3JlY29yZCAoYWJmZCwKLQkJCSAgICBvYXN5c19yZWNvcmRfaXNfaGVhZGVyX2VudW0sCi0JCQkgICAgKG9hc3lzX3JlY29yZF91bmlvbl90eXBlICopICYgciwKLQkJCSAgICBvZmZzZXRvZiAob2FzeXNfaGVhZGVyX3JlY29yZF90eXBlLAotCQkJCSAgICAgIGRlc2NyaXB0aW9uWzBdKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotb2FzeXNfd3JpdGVfZW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIG9hc3lzX2VuZF9yZWNvcmRfdHlwZSBlbmQ7Ci0gIHVuc2lnbmVkIGNoYXIgbnVsbCA9IDA7Ci0gIGVuZC5yZWxiID0gUkVMT0NBVElPTl9UWVBFX0FCUzsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBhYmZkLT5zdGFydF9hZGRyZXNzLCBlbmQuZW50cnkpOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIDAsIGVuZC5maWxsKTsKLSAgZW5kLnplcm8gPSAwOwotICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkgICAgb2FzeXNfcmVjb3JkX2lzX2VuZF9lbnVtLAotCQkJICAgIChvYXN5c19yZWNvcmRfdW5pb25fdHlwZSAqKSAmIGVuZCwKLQkJCSAgICBzaXplb2YgKGVuZCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJiBudWxsLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvbXAgKGFwLCBicCkKLSAgICAgQ09OU1QgUFRSIGFwOwotICAgICBDT05TVCBQVFIgYnA7Ci17Ci0gIGFyZWxlbnQgKmEgPSAqKChhcmVsZW50ICoqKSBhcCk7Ci0gIGFyZWxlbnQgKmIgPSAqKChhcmVsZW50ICoqKSBicCk7Ci0gIHJldHVybiBhLT5hZGRyZXNzIC0gYi0+YWRkcmVzczsKLX0KLQotLyoKLSBXcml0aW5nIGRhdGEuLgotCi0qLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3dyaXRlX2RhdGEgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKnM7Ci0gIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzID0gcy0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKLQl7Ci0JICBiZmRfYnl0ZSAqcmF3X2RhdGEgPSBvYXN5c19wZXJfc2VjdGlvbiAocyktPmRhdGE7Ci0JICBvYXN5c19kYXRhX3JlY29yZF90eXBlIHByb2Nlc3NlZF9kYXRhOwotCSAgYmZkX3NpemVfdHlwZSBjdXJyZW50X2J5dGVfaW5kZXggPSAwOwotCSAgdW5zaWduZWQgaW50IHJlbG9jc190b19nbyA9IHMtPnJlbG9jX2NvdW50OwotCSAgYXJlbGVudCAqKnAgPSBzLT5vcmVsb2NhdGlvbjsKLQkgIGlmIChzLT5yZWxvY19jb3VudCAhPSAwKQotCSAgICB7Ci0vKiBTb3J0IHRoZSByZWxvYyByZWNvcmRzIHNvIGl0J3MgZWFzeSB0byBpbnNlcnQgdGhlIHJlbG9jcyBpbnRvIHRoZQotCSAgIGRhdGEgKi8KLQotCSAgICAgIHFzb3J0IChzLT5vcmVsb2NhdGlvbiwKLQkJICAgICBzLT5yZWxvY19jb3VudCwKLQkJICAgICBzaXplb2YgKGFyZWxlbnQgKiopLAotCQkgICAgIGNvbXApOwotCSAgICB9Ci0JICBjdXJyZW50X2J5dGVfaW5kZXggPSAwOwotCSAgcHJvY2Vzc2VkX2RhdGEucmVsYiA9IHMtPnRhcmdldF9pbmRleCB8IFJFTE9DQVRJT05fVFlQRV9SRUw7Ci0KLQkgIHdoaWxlIChjdXJyZW50X2J5dGVfaW5kZXggPCBzLT5fY29va2VkX3NpemUpCi0JICAgIHsKLQkgICAgICAvKiBTY2FuIGZvcndhcmRzIGJ5IGVpZ2h0IGJ5dGVzIG9yIGhvd2V2ZXIgbXVjaCBpcyBsZWZ0IGFuZCBzZWUgaWYKLQkgICAgICAgdGhlcmUgYXJlIGFueSByZWxvY2F0aW9ucyBnb2luZyBvbiAqLwotCSAgICAgIGJmZF9ieXRlICptb2QgPSAmcHJvY2Vzc2VkX2RhdGEuZGF0YVswXTsKLQkgICAgICBiZmRfYnl0ZSAqZHN0ID0gJnByb2Nlc3NlZF9kYXRhLmRhdGFbMV07Ci0KLQkgICAgICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0JICAgICAgKm1vZCA9IDA7Ci0KLQotCSAgICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgcy0+dm1hICsgY3VycmVudF9ieXRlX2luZGV4LAotCQkJICAgIHByb2Nlc3NlZF9kYXRhLmFkZHIpOwotCi0JICAgICAgLyogRG9uJ3Qgc3RhcnQgYSByZWxvY2F0aW9uIHVubGVzcyB5b3UncmUgc3VyZSB5b3UgY2FuIGZpbmlzaCBpdAotIAkgICAgICAgd2l0aGluIHRoZSBzYW1lIGRhdGEgcmVjb3JkLiAgVGhlIHdvcnN0IGNhc2UgcmVsb2NhdGlvbiBpcyBhCi0gCSAgICAgICA0LWJ5dGUgcmVsb2NhdGFibGUgdmFsdWUgd2hpY2ggaXMgc3BsaXQgYWNyb3NzIHR3byBtb2RpZmljYXRpb24KLSAJICAgICAgIGJ5dGVzICgxIHJlbG9jYXRpb24gYnl0ZSArIDIgc3ltYm9sIHJlZmVyZW5jZSBieXRlcyArIDIgZGF0YSArCi0gCSAgICAgICAxIG1vZGlmaWNhdGlvbiBieXRlICsgMiBkYXRhID0gOCBieXRlcyB0b3RhbCkuICBUaGF0J3Mgd2hlcmUKLSAJICAgICAgIHRoZSBtYWdpYyBudW1iZXIgOCBjb21lcyBmcm9tLgotIAkgICAgKi8KLQkgICAgICB3aGlsZSAoY3VycmVudF9ieXRlX2luZGV4IDwgcy0+X3Jhd19zaXplICYmIGRzdCA8PQotCQkgICAgICZwcm9jZXNzZWRfZGF0YS5kYXRhW3NpemVvZiAocHJvY2Vzc2VkX2RhdGEuZGF0YSkgLSA4XSkKLQkJewotCi0KLQkJICBpZiAocmVsb2NzX3RvX2dvICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGFyZWxlbnQgKnIgPSAqcDsKLQkJICAgICAgcmVsb2NfaG93dG9fdHlwZSAqY29uc3QgaG93ID0gci0+aG93dG87Ci0JCSAgICAgIC8qIFRoZXJlIGlzIGEgcmVsb2NhdGlvbiwgaXMgaXQgZm9yIHRoaXMgYnl0ZSA/ICovCi0JCSAgICAgIGlmIChyLT5hZGRyZXNzID09IGN1cnJlbnRfYnl0ZV9pbmRleCkKLQkJCXsKLQkJCSAgdW5zaWduZWQgY2hhciByZWxfYnl0ZTsKLQotCQkJICBwKys7Ci0JCQkgIHJlbG9jc190b19nby0tOwotCi0JCQkgICptb2QgfD0gKDEgPDwgaSk7Ci0JCQkgIGlmIChob3ctPnBjX3JlbGF0aXZlKQotCQkJICAgIHsKLQkJCSAgICAgIHJlbF9ieXRlID0gUkVMT0NBVElPTl9QQ1JFTF9CSVQ7Ci0KLQkJCSAgICAgIC8qIEFsc28gcGF0Y2ggdGhlIHJhdyBkYXRhIHNvIHRoYXQgaXQgZG9lc24ndCBoYXZlCi0JCQkgdGhlIC12ZSBzdHVmZiBhbnkgbW9yZSAqLwotCQkJICAgICAgaWYgKGhvdy0+c2l6ZSAhPSAyKQotCQkJCXsKLQkJCQkgIGJmZF9wdXRfMTYgKGFiZmQsCi0JCQkJCSAgICAgIGJmZF9nZXRfMTYgKGFiZmQsIHJhd19kYXRhKSArCi0JCQkJCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCwgcmF3X2RhdGEpOwotCQkJCX0KLQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGJmZF9wdXRfMzIgKGFiZmQsCi0JCQkJCSAgICAgIGJmZF9nZXRfMzIgKGFiZmQsIHJhd19kYXRhKSArCi0JCQkJCSAgICAgIGN1cnJlbnRfYnl0ZV9pbmRleCwgcmF3X2RhdGEpOwotCQkJCX0KLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICByZWxfYnl0ZSA9IDA7Ci0JCQkgICAgfQotCQkJICBpZiAoaG93LT5zaXplID09IDIpCi0JCQkgICAgewotCQkJICAgICAgcmVsX2J5dGUgfD0gUkVMT0NBVElPTl8zMkJJVF9CSVQ7Ci0JCQkgICAgfQotCi0JCQkgIC8qIElzIHRoaXMgYSBzZWN0aW9uIHJlbGF0aXZlIHJlbG9jYXRpb24sIG9yIGEgc3ltYm9sCi0JCSAgICAgICByZWxhdGl2ZSByZWxvY2F0aW9uID8gKi8KLQkJCSAgYWJvcnQgKCk7Ci0KLSNpZiAwCi0JCQkgIGlmIChyLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIFRoZSByZWxlbnQgaGFzIGEgc2VjdGlvbiBhdHRhY2hlZCwgc28gaXQgbXVzdCBiZSBzZWN0aW9uCi0JCQkgICAgIHJlbGF0aXZlICovCi0JCQkgICAgICByZWxfYnl0ZSB8PSBSRUxPQ0FUSU9OX1RZUEVfUkVMOwotCQkJICAgICAgcmVsX2J5dGUgfD0gci0+c2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkJCSAgICAgICpkc3QrKyA9IHJlbF9ieXRlOwotCQkJICAgIH0KLQkJCSAgZWxzZQotI2VuZGlmCi0JCQkgICAgewotCQkJICAgICAgYXN5bWJvbCAqcCA9ICooci0+c3ltX3B0cl9wdHIpOwotCi0JCQkgICAgICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgYSBzZWN0aW9uIGF0dGFjaGVkLCB0aGVuIGl0Ci0JCQkgICAgIGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuICBDaGFuZ2UgZnJvbSBhIHN5bWJvbAotCQkJICAgICByZWYgdG8gYSBzZWN0aW9uIHJlZiAqLwotCQkJICAgICAgaWYgKHAtPnNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCQkJewotCQkJCSAgcmVsX2J5dGUgfD0gUkVMT0NBVElPTl9UWVBFX1JFTDsKLQkJCQkgIHJlbF9ieXRlIHw9Ci0JCQkJICAgIHAtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JCQkJICAqZHN0KysgPSByZWxfYnl0ZTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgcmVsX2J5dGUgfD0gUkVMT0NBVElPTl9UWVBFX1VORDsKLQkJCQkgICpkc3QrKyA9IHJlbF9ieXRlOwotCQkJCSAgLyogTmV4dCB0d28gYnl0ZXMgYXJlIGEgc3ltYm9sIGluZGV4IC0gd2UgY2FuIGdldAotCQkJICAgICAgIHRoaXMgZnJvbSB0aGUgc3ltYm9sIHZhbHVlIHdoaWNoIGhhcyBiZWVuIHphcHBlZAotCQkJICAgICAgIGludG8gdGhlIHN5bWJvbCBpbmRleCBpbiB0aGUgdGFibGUgd2hlbiB0aGUKLQkJCSAgICAgICBzeW1ib2wgdGFibGUgd2FzIHdyaXR0ZW4KLQkJCSAgICAgICAqLwotCQkJCSAgKmRzdCsrID0gcC0+dmFsdWUgPj4gODsKLQkJCQkgICpkc3QrKyA9IHAtPnZhbHVlOwotCQkJCX0KLQkJCSAgICB9Ci0jZGVmaW5lIEFEVkFOQ0UgeyBpZiAoKytpID49IDgpIHsgaSA9IDA7IG1vZCA9IGRzdCsrOyAqbW9kID0gMDsgfSBjdXJyZW50X2J5dGVfaW5kZXgrKzsgfQotCQkJICAvKiByZWxvY2F0aW9ucyBuZXZlciBvY2N1ciBmcm9tIGFuIHVubG9hZGFibGUgc2VjdGlvbiwKLQkJICAgICAgIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCByYXdfZGF0YSBpcyBub3QgTlVMTAotCQkgICAgICovCi0JCQkgICpkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkJICBBRFZBTkNFCi0JCQkgICAgKiBkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkJICBBRFZBTkNFCi0JCQkgICAgaWYgKGhvdy0+c2l6ZSA9PSAyKQotCQkJICAgIHsKLQkJCSAgICAgICpkc3QrKyA9ICpyYXdfZGF0YSsrOwotCQkJICAgICAgQURWQU5DRQotCQkJCSogZHN0KysgPSAqcmF3X2RhdGErKzsKLQkJCSAgICAgIEFEVkFOQ0UKLQkJCSAgICB9Ci0JCQkgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgfQotCQkgIC8qIElmIHRoaXMgaXMgY29taW5nIGZyb20gYW4gdW5sb2FkYWJsZSBzZWN0aW9uIHRoZW4gY29weQotCQkgICB6ZXJvcyAqLwotCQkgIGlmIChyYXdfZGF0YSA9PSBOVUxMKQotCQkgICAgewotCQkgICAgICAqZHN0KysgPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKmRzdCsrID0gKnJhd19kYXRhKys7Ci0JCSAgICB9Ci0JCSAgQURWQU5DRQotCQl9Ci0KLQkgICAgICAvKiBEb24ndCB3cml0ZSBhIHVzZWxlc3MgbnVsbCBtb2RpZmljYXRpb24gYnl0ZSAqLwotCSAgICAgIGlmIChkc3QgPT0gbW9kICsgMSkKLQkJewotCQkgIC0tZHN0OwotCQl9Ci0KLQkgICAgICBpZiAoISBvYXN5c193cml0ZV9yZWNvcmQgKGFiZmQsCi0JCQkJCW9hc3lzX3JlY29yZF9pc19kYXRhX2VudW0sCi0JCQkJCSgob2FzeXNfcmVjb3JkX3VuaW9uX3R5cGUgKikKLQkJCQkJICYgcHJvY2Vzc2VkX2RhdGEpLAotCQkJCQlkc3QgLSAoYmZkX2J5dGUgKikgJiBwcm9jZXNzZWRfZGF0YSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1vYXN5c193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfaGVhZGVyIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIG9hc3lzX3dyaXRlX3N5bXMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfc2VjdGlvbnMgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgb2FzeXNfd3JpdGVfZGF0YSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBvYXN5c193cml0ZV9lbmQgKGFiZmQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0KLS8qKiBleGVjIGFuZCBjb3JlIGZpbGUgc2VjdGlvbnMgKi8KLQotLyogc2V0IHNlY3Rpb24gY29udGVudHMgaXMgY29tcGxpY2F0ZWQgd2l0aCBPQVNZUyBzaW5jZSB0aGUgZm9ybWF0IGlzCi0qIG5vdCBhIGJ5dGUgaW1hZ2UsIGJ1dCBhIHJlY29yZCBzdHJlYW0uCi0qLwotc3RhdGljIGJvb2xlYW4KLW9hc3lzX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoY291bnQgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAob2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhID09IChiZmRfYnl0ZSAqKSBOVUxMKQotCXsKLQkgIG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSA9Ci0JICAgIChiZmRfYnl0ZSAqKSAoYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fY29va2VkX3NpemUpKTsKLQkgIGlmICghb2FzeXNfcGVyX3NlY3Rpb24gKHNlY3Rpb24pLT5kYXRhKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKHZvaWQpIG1lbWNweSAoKFBUUikgKG9hc3lzX3Blcl9zZWN0aW9uIChzZWN0aW9uKS0+ZGF0YSArIG9mZnNldCksCi0JCSAgICAgbG9jYXRpb24sCi0JCSAgICAgKHNpemVfdCkgY291bnQpOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotCi0vKiBOYXRpdmUtbGV2ZWwgaW50ZXJmYWNlIHRvIHN5bWJvbHMuICovCi0KLS8qIFdlIHJlYWQgdGhlIHN5bWJvbHMgaW50byBhIGJ1ZmZlciwgd2hpY2ggaXMgZGlzY2FyZGVkIHdoZW4gdGhpcwotZnVuY3Rpb24gZXhpdHMuICBXZSByZWFkIHRoZSBzdHJpbmdzIGludG8gYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvCi1ob2xkIHRoZW0gYWxsIHBsdXMgYWxsIHRoZSBjYWNoZWQgc3ltYm9sIGVudHJpZXMuICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLW9hc3lzX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0KLSAgb2FzeXNfc3ltYm9sX3R5cGUgKm5ldyA9Ci0gIChvYXN5c19zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKG9hc3lzX3N5bWJvbF90eXBlKSk7Ci0gIGlmICghbmV3KQotICAgIHJldHVybiBOVUxMOwotICBuZXctPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuICZuZXctPnN5bWJvbDsKLX0KLQwKLQotCi0KLS8qIFVzZXIgc2hvdWxkIGhhdmUgY2hlY2tlZCB0aGUgZmlsZSBmbGFnczsgcGVyaGFwcyB3ZSBzaG91bGQgcmV0dXJuCi1CRkRfTk9fTU9SRV9TWU1CT0xTIGlmIHRoZXJlIGFyZSBub25lPyAqLwotCi1zdGF0aWMgYmZkICoKLW9hc3lzX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgcHJldikKLSAgICAgYmZkICphcmNoOwotICAgICBiZmQgKnByZXY7Ci17Ci0gIG9hc3lzX2FyX2RhdGFfdHlwZSAqYXIgPSBPQVNZU19BUl9EQVRBIChhcmNoKTsKLSAgb2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqcDsKLSAgLyogdGFrZSB0aGUgbmV4dCBvbmUgZnJvbSB0aGUgYXJjaCBzdGF0ZSwgb3IgcmVzZXQgKi8KLSAgaWYgKHByZXYgPT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFJlc2V0IHRoZSBpbmRleCAtIHRoZSBmaXJzdCB0d28gZW50cmllcyBhcmUgYm9ndXMqLwotICAgICAgYXItPm1vZHVsZV9pbmRleCA9IDA7Ci0gICAgfQotCi0gIHAgPSBhci0+bW9kdWxlICsgYXItPm1vZHVsZV9pbmRleDsKLSAgYXItPm1vZHVsZV9pbmRleCsrOwotCi0gIGlmIChhci0+bW9kdWxlX2luZGV4IDw9IGFyLT5tb2R1bGVfY291bnQpCi0gICAgewotICAgICAgaWYgKHAtPmFiZmQgPT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIHAtPmFiZmQgPSBfYmZkX2NyZWF0ZV9lbXB0eV9hcmNoaXZlX2VsZW1lbnRfc2hlbGwgKGFyY2gpOwotCSAgcC0+YWJmZC0+b3JpZ2luID0gcC0+cG9zOwotCSAgcC0+YWJmZC0+ZmlsZW5hbWUgPSBwLT5uYW1lOwotCi0JICAvKiBGaXh1cCBhIHBvaW50ZXIgdG8gdGhpcyBlbGVtZW50IGZvciB0aGUgbWVtYmVyICovCi0JICBwLT5hYmZkLT5hcmVsdF9kYXRhID0gKFBUUikgcDsKLQl9Ci0gICAgICByZXR1cm4gcC0+YWJmZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbW9yZV9hcmNoaXZlZF9maWxlcyk7Ci0gICAgICByZXR1cm4gKGJmZCAqKSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLW9hc3lzX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLAotCQkJIHNlY3Rpb24sCi0JCQkgc3ltYm9scywKLQkJCSBvZmZzZXQsCi0JCQkgZmlsZW5hbWVfcHRyLAotCQkJIGZ1bmN0aW9ubmFtZV9wdHIsCi0JCQkgbGluZV9wdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgY2hhciAqKmZpbGVuYW1lX3B0cjsKLSAgICAgY2hhciAqKmZ1bmN0aW9ubmFtZV9wdHI7Ci0gICAgIHVuc2lnbmVkIGludCAqbGluZV9wdHI7Ci17Ci0gIHJldHVybiBmYWxzZTsKLQotfQotCi1zdGF0aWMgaW50Ci1vYXN5c19nZW5lcmljX3N0YXRfYXJjaF9lbHQgKGFiZmQsIGJ1ZikKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc3RhdCAqYnVmOwotewotICBvYXN5c19tb2R1bGVfaW5mb190eXBlICptb2QgPSAob2FzeXNfbW9kdWxlX2luZm9fdHlwZSAqKSBhYmZkLT5hcmVsdF9kYXRhOwotICBpZiAobW9kID09IChvYXN5c19tb2R1bGVfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYtPnN0X3NpemUgPSBtb2QtPnNpemU7Ci0gICAgICBidWYtPnN0X21vZGUgPSAwNjY2OwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1vYXN5c19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGV4ZWM7Ci17Ci0gIHJldHVybiAwOwotfQotCi0jZGVmaW5lCW9hc3lzX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBvYXN5c19iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLQotI2RlZmluZSBvYXN5c19zbHVycF9hcm1hcCBiZmRfdHJ1ZQotI2RlZmluZSBvYXN5c19zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlIGJmZF90cnVlCi0jZGVmaW5lIG9hc3lzX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlIFwKLSAgKChib29sZWFuICgqKSBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSkpIFwKLSAgIGJmZF90cnVlKQotI2RlZmluZSBvYXN5c190cnVuY2F0ZV9hcm5hbWUgYmZkX2RvbnRfdHJ1bmNhdGVfYXJuYW1lCi0jZGVmaW5lIG9hc3lzX3dyaXRlX2FybWFwIFwKLSAgKChib29sZWFuICgqKSBcCi0gICAgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGludCwgc3RydWN0IG9ybCAqLCB1bnNpZ25lZCBpbnQsIGludCkpKSBcCi0gICBiZmRfdHJ1ZSkKLSNkZWZpbmUgb2FzeXNfcmVhZF9hcl9oZHIgYmZkX251bGx2b2lkcHRyCi0jZGVmaW5lIG9hc3lzX2dldF9lbHRfYXRfaW5kZXggX2JmZF9nZW5lcmljX2dldF9lbHRfYXRfaW5kZXgKLSNkZWZpbmUgb2FzeXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBiZmRfdHJ1ZQotCi0jZGVmaW5lIG9hc3lzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgb2FzeXNfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIG9hc3lzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgb2FzeXNfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBvYXN5c19taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotI2RlZmluZSBvYXN5c19iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBvYXN5c19zZXRfYXJjaF9tYWNoIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2gKLQotI2RlZmluZSBvYXN5c19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgb2FzeXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBvYXN5c19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIG9hc3lzX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBvYXN5c19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBvYXN5c19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBvYXN5c19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBvYXN5c19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotLypTVVBQUkVTUyA0NjAgKi8KLWNvbnN0IGJmZF90YXJnZXQgb2FzeXNfdmVjID0KLXsKLSAgIm9hc3lzIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfb2FzeXNfZmxhdm91ciwKLSAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CQkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAge19iZmRfZHVtbXlfdGFyZ2V0LAotICAgb2FzeXNfb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBvYXN5c19hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBvYXN5c19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBvYXN5c193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAob2FzeXMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LIChvYXN5cyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL29wbmNscy5jIGIvYmZkL29wbmNscy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjEwMTM1Li4wMDAwMDAwCi0tLSBhL2JmZC9vcG5jbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKiBvcG5jbHMuYyAtLSBvcGVuIGFuZCBjbG9zZSBhIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgIm9iamFsbG9jLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpZm5kZWYgU19JWFVTUgotI2RlZmluZSBTX0lYVVNSIDAxMDAJLyogRXhlY3V0ZSBieSBvd25lci4gICovCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotI2RlZmluZSBTX0lYR1JQIDAwMTAJLyogRXhlY3V0ZSBieSBncm91cC4gICovCi0jZW5kaWYKLSNpZm5kZWYgU19JWE9USAotI2RlZmluZSBTX0lYT1RIIDAwMDEJLyogRXhlY3V0ZSBieSBvdGhlcnMuICAqLwotI2VuZGlmCi0KLS8qIGZkb3BlbiBpcyBhIGxvc2VyIC0tIHdlIHNob3VsZCB1c2Ugc3RkaW8gZXhjbHVzaXZlbHkuICBVbmZvcnR1bmF0ZWx5Ci0gICBpZiB3ZSBkbyB0aGF0IHdlIGNhbid0IHVzZSBmY250bC4gICovCi0KLS8qIEZJWE1FOiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLWxvbmcgX2JmZF9jaHVua3NpemUgPSAtMTsKLQotLyogUmV0dXJuIGEgbmV3IEJGRC4gIEFsbCBCRkQncyBhcmUgYWxsb2NhdGVkIHRocm91Z2ggdGhpcyByb3V0aW5lLiAgKi8KLQotYmZkICoKLV9iZmRfbmV3X2JmZCAoKQotewotICBiZmQgKm5iZmQ7Ci0KLSAgbmJmZCA9IChiZmQgKikgYmZkX3ptYWxsb2MgKHNpemVvZiAoYmZkKSk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmJmZC0+bWVtb3J5ID0gKFBUUikgb2JqYWxsb2NfY3JlYXRlICgpOwotICBpZiAobmJmZC0+bWVtb3J5ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgbmJmZC0+YXJjaF9pbmZvID0gJmJmZF9kZWZhdWx0X2FyY2hfc3RydWN0OwotCi0gIG5iZmQtPmRpcmVjdGlvbiA9IG5vX2RpcmVjdGlvbjsKLSAgbmJmZC0+aW9zdHJlYW0gPSBOVUxMOwotICBuYmZkLT53aGVyZSA9IDA7Ci0gIG5iZmQtPnNlY3Rpb25zID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIG5iZmQtPmZvcm1hdCA9IGJmZF91bmtub3duOwotICBuYmZkLT5teV9hcmNoaXZlID0gKGJmZCAqKSBOVUxMOwotICBuYmZkLT5vcmlnaW4gPSAwOwkJCQkKLSAgbmJmZC0+b3BlbmVkX29uY2UgPSBmYWxzZTsKLSAgbmJmZC0+b3V0cHV0X2hhc19iZWd1biA9IGZhbHNlOwotICBuYmZkLT5zZWN0aW9uX2NvdW50ID0gMDsKLSAgbmJmZC0+dXNyZGF0YSA9IChQVFIpIE5VTEw7Ci0gIG5iZmQtPmNhY2hlYWJsZSA9IGZhbHNlOwotICBuYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgbmJmZC0+bXRpbWVfc2V0ID0gZmFsc2U7Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qIEFsbG9jYXRlIGEgbmV3IEJGRCBhcyBhIG1lbWJlciBvZiBhcmNoaXZlIE9CRkQuICAqLwotCi1iZmQgKgotX2JmZF9uZXdfYmZkX2NvbnRhaW5lZF9pbiAob2JmZCkKLSAgICAgYmZkICpvYmZkOwotewotICBiZmQgKm5iZmQ7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgbmJmZC0+eHZlYyA9IG9iZmQtPnh2ZWM7Ci0gIG5iZmQtPm15X2FyY2hpdmUgPSBvYmZkOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLSAgbmJmZC0+dGFyZ2V0X2RlZmF1bHRlZCA9IG9iZmQtPnRhcmdldF9kZWZhdWx0ZWQ7Ci0gIHJldHVybiBuYmZkOwotfQotCi0vKgotU0VDVElPTgotCU9wZW5pbmcgYW5kIGNsb3NpbmcgQkZEcwotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbnIKLQotU1lOT1BTSVMKLSAgICAgICAgYmZkICpiZmRfb3BlbnIoQ09OU1QgY2hhciAqZmlsZW5hbWUsIENPTlNUIGNoYXIgKnRhcmdldCk7Ci0KLURFU0NSSVBUSU9OCi0JT3BlbiB0aGUgZmlsZSBAdmFye2ZpbGVuYW1lfSAodXNpbmcgPDxmb3Blbj4+KSB3aXRoIHRoZSB0YXJnZXQKLQlAdmFye3RhcmdldH0uICBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIEJGRC4KLQotCUNhbGxzIDw8YmZkX2ZpbmRfdGFyZ2V0Pj4sIHNvIEB2YXJ7dGFyZ2V0fSBpcyBpbnRlcnByZXRlZCBhcyBieQotCXRoYXQgZnVuY3Rpb24uCi0KLQlJZiA8PE5VTEw+PiBpcyByZXR1cm5lZCB0aGVuIGFuIGVycm9yIGhhcyBvY2N1cmVkLiAgIFBvc3NpYmxlIGVycm9ycwotCWFyZSA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiBvciA8PHN5c3RlbV9jYWxsPj4gZXJyb3IuCi0qLwotCi1iZmQgKgotYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLSAgICAgQ09OU1QgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKm5iZmQ7Ci0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldF92ZWM7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB0YXJnZXRfdmVjID0gYmZkX2ZpbmRfdGFyZ2V0ICh0YXJnZXQsIG5iZmQpOwotICBpZiAodGFyZ2V0X3ZlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLQotICBpZiAoYmZkX29wZW5fZmlsZSAobmJmZCkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGaWxlIGRpZG4ndCBleGlzdCwgb3Igc29tZSBzdWNoICovCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotICAgICAgb2JqYWxsb2NfZnJlZSAoKHN0cnVjdCBvYmphbGxvYyAqKSBuYmZkLT5tZW1vcnkpOwotICAgICAgZnJlZSAobmJmZCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIG5iZmQ7Ci19Ci0KLS8qIERvbid0IHRyeSB0byBgb3B0aW1pemUnIHRoaXMgZnVuY3Rpb246Ci0KLSAgIG8gLSBXZSBsb2NrIHVzaW5nIHN0YWNrIHNwYWNlIHNvIHRoYXQgaW50ZXJydXB0aW5nIHRoZSBsb2NraW5nCi0gICAgICAgd29uJ3QgY2F1c2UgYSBzdG9yYWdlIGxlYWsuCi0gICBvIC0gV2Ugb3BlbiB0aGUgZmlsZSBzdHJlYW0gbGFzdCwgc2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvCi0gICAgICAgY2xvc2UgaXQgaWYgYW55dGhpbmcgZ29lcyB3cm9uZy4gIENsb3NpbmcgdGhlIHN0cmVhbSBtZWFucyBjbG9zaW5nCi0gICAgICAgdGhlIGZpbGUgZGVzY3JpcHRvciB0b28sIGV2ZW4gdGhvdWdoIHdlIGRpZG4ndCBvcGVuIGl0LgotICovCi0vKgotRlVOQ1RJT04KLSAgICAgICAgIGJmZF9mZG9wZW5yCi0KLVNZTk9QU0lTCi0gICAgICAgICBiZmQgKmJmZF9mZG9wZW5yKENPTlNUIGNoYXIgKmZpbGVuYW1lLCBDT05TVCBjaGFyICp0YXJnZXQsIGludCBmZCk7Ci0KLURFU0NSSVBUSU9OCi0gICAgICAgICA8PGJmZF9mZG9wZW5yPj4gaXMgdG8gPDxiZmRfZm9wZW5yPj4gbXVjaCBsaWtlIDw8ZmRvcGVuPj4gaXMgdG8gPDxmb3Blbj4+LgotCSBJdCBvcGVucyBhIEJGRCBvbiBhIGZpbGUgYWxyZWFkeSBkZXNjcmliZWQgYnkgdGhlIEB2YXJ7ZmR9Ci0JIHN1cHBsaWVkLgotCi0JIFdoZW4gdGhlIGZpbGUgaXMgbGF0ZXIgPDxiZmRfY2xvc2U+PmQsIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSBjbG9zZWQuCi0KLQkgSWYgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhpcyBmaWxlIGRlc2NyaXB0b3IgYmUgY2FjaGVkIGJ5IEJGRAotCSAob3BlbmVkIGFzIG5lZWRlZCwgY2xvc2VkIGFzIG5lZWRlZCB0byBmcmVlIGRlc2NyaXB0b3JzIGZvcgotCSBvdGhlciBvcGVucyksIHdpdGggdGhlIHN1cHBsaWVkIEB2YXJ7ZmR9IHVzZWQgYXMgYW4gaW5pdGlhbAotCSBmaWxlIGRlc2NyaXB0b3IgKGJ1dCBzdWJqZWN0IHRvIGNsb3N1cmUgYXQgYW55IHRpbWUpLCBjYWxsCi0JIGJmZF9zZXRfY2FjaGVhYmxlKGJmZCwgMSkgb24gdGhlIHJldHVybmVkIEJGRC4gIFRoZSBkZWZhdWx0IGlzIHRvCi0JIGFzc3VtZSBubyBjYWNoZWluZzsgdGhlIGZpbGUgZGVzY3JpcHRvciB3aWxsIHJlbWFpbiBvcGVuIHVudGlsCi0JIDw8YmZkX2Nsb3NlPj4sIGFuZCB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSBCRkQgb3BlcmF0aW9ucyBvbiBvdGhlcgotCSBmaWxlcy4KLQotICAgICAgICAgUG9zc2libGUgZXJyb3JzIGFyZSA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiBhbmQgPDxiZmRfZXJyb3Jfc3lzdGVtX2NhbGw+Pi4KLSovCi0KLWJmZCAqCi1iZmRfZmRvcGVuciAoZmlsZW5hbWUsIHRhcmdldCwgZmQpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci0gICAgIGludCBmZDsKLXsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotICBpbnQgZmRmbGFnczsKLQotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpOwotI2lmICEgZGVmaW5lZChIQVZFX0ZDTlRMKSB8fCAhIGRlZmluZWQoRl9HRVRGTCkKLSAgZmRmbGFncyA9IE9fUkRXUjsJCQkvKiBBc3N1bWUgZnVsbCBhY2Nlc3MgKi8KLSNlbHNlCi0gIGZkZmxhZ3MgPSBmY250bCAoZmQsIEZfR0VURkwsIE5VTEwpOwotI2VuZGlmCi0gIGlmIChmZGZsYWdzID09IC0xKSByZXR1cm4gTlVMTDsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0jaWZuZGVmIEhBVkVfRkRPUEVOCi0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0jZWxzZQotICAvKiAoT19BQ0NNT0RFKSBwYXJlbnMgYXJlIHRvIGF2b2lkIFVsdHJpeCBoZWFkZXIgZmlsZSBidWcgKi8KLSAgc3dpdGNoIChmZGZsYWdzICYgKE9fQUNDTU9ERSkpCi0gICAgewotICAgIGNhc2UgT19SRE9OTFk6IG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUkIpOyAgIGJyZWFrOwotICAgIGNhc2UgT19XUk9OTFk6IG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUlVCKTsgIGJyZWFrOwotICAgIGNhc2UgT19SRFdSOiAgIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgZmRvcGVuIChmZCwgRk9QRU5fUlVCKTsgIGJyZWFrOwotICAgIGRlZmF1bHQ6IGFib3J0ICgpOwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChuYmZkLT5pb3N0cmVhbSA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCBwdXQgZXZlcnl0aGluZyB3aGVyZSBpdCBiZWxvbmdzICovCi0KLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICAvKiBBcyBhIHNwZWNpYWwgY2FzZSB3ZSBhbGxvdyBhIEZEIG9wZW4gZm9yIHJlYWQvd3JpdGUgdG8KLSAgICAgYmUgd3JpdHRlbiB0aHJvdWdoLCBhbHRob3VnaCBkb2luZyBzbyByZXF1aXJlcyB0aGF0IHdlIGVuZAotICAgICB0aGUgcHJldmlvdXMgY2xhdXNlIHdpdGggYSBwcmVwb3NpdGlvbi4gICovCi0gIC8qIChPX0FDQ01PREUpIHBhcmVucyBhcmUgdG8gYXZvaWQgVWx0cml4IGhlYWRlciBmaWxlIGJ1ZyAqLwotICBzd2l0Y2ggKGZkZmxhZ3MgJiBPX0FDQ01PREUpCi0gICAgewotICAgIGNhc2UgT19SRE9OTFk6IG5iZmQtPmRpcmVjdGlvbiA9IHJlYWRfZGlyZWN0aW9uOyBicmVhazsKLSAgICBjYXNlIE9fV1JPTkxZOiBuYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247IGJyZWFrOwotICAgIGNhc2UgT19SRFdSOiBuYmZkLT5kaXJlY3Rpb24gPSBib3RoX2RpcmVjdGlvbjsgYnJlYWs7Ci0gICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmICghIGJmZF9jYWNoZV9pbml0IChuYmZkKSkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgbmJmZC0+b3BlbmVkX29uY2UgPSB0cnVlOwotCi0gIHJldHVybiBuYmZkOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbnN0cmVhbXIKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9vcGVuc3RyZWFtcihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUFRSKTsKLQotREVTQ1JJUFRJT04KLQotCU9wZW4gYSBCRkQgZm9yIHJlYWQgYWNjZXNzIG9uIGFuIGV4aXN0aW5nIHN0ZGlvIHN0cmVhbS4gIFdoZW4KLQl0aGUgQkZEIGlzIHBhc3NlZCB0byA8PGJmZF9jbG9zZT4+LCB0aGUgc3RyZWFtIHdpbGwgYmUgY2xvc2VkLgotKi8KLQotYmZkICoKLWJmZF9vcGVuc3RyZWFtciAoZmlsZW5hbWUsIHRhcmdldCwgc3RyZWFtYXJnKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotICAgICBQVFIgc3RyZWFtYXJnOwotewotICBGSUxFICpzdHJlYW0gPSAoRklMRSAqKSBzdHJlYW1hcmc7Ci0gIGJmZCAqbmJmZDsKLSAgY29uc3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlYzsKLQotICBuYmZkID0gX2JmZF9uZXdfYmZkICgpOwotICBpZiAobmJmZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHRhcmdldF92ZWMgPSBiZmRfZmluZF90YXJnZXQgKHRhcmdldCwgbmJmZCk7Ci0gIGlmICh0YXJnZXRfdmVjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIG5iZmQtPmlvc3RyZWFtID0gKFBUUikgc3RyZWFtOwotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSByZWFkX2RpcmVjdGlvbjsKLQkJCQkKLSAgaWYgKCEgYmZkX2NhY2hlX2luaXQgKG5iZmQpKQotICAgIHsKLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBuYmZkOwotfQotDAotLyoqIGJmZF9vcGVudyAtLSBvcGVuIGZvciB3cml0aW5nLgotICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGZyZXNobHktYWxsb2NhdGVkIEJGRCBvbiBzdWNjZXNzLCBvciBOVUxMLgotCi0gIFNlZSBjb21tZW50IGJ5IGJmZF9mZG9wZW5yIGJlZm9yZSB5b3UgdHJ5IHRvIG1vZGlmeSB0aGlzIGZ1bmN0aW9uLiAqLwotCi0vKgotRlVOQ1RJT04KLQliZmRfb3BlbncKLQotU1lOT1BTSVMKLQliZmQgKmJmZF9vcGVudyhDT05TVCBjaGFyICpmaWxlbmFtZSwgQ09OU1QgY2hhciAqdGFyZ2V0KTsKLQotREVTQ1JJUFRJT04KLQlDcmVhdGUgYSBCRkQsIGFzc29jaWF0ZWQgd2l0aCBmaWxlIEB2YXJ7ZmlsZW5hbWV9LCB1c2luZyB0aGUKLQlmaWxlIGZvcm1hdCBAdmFye3RhcmdldH0sIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotCi0JUG9zc2libGUgZXJyb3JzIGFyZSA8PGJmZF9lcnJvcl9zeXN0ZW1fY2FsbD4+LCA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiwKLQk8PGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldD4+LgotKi8KLQotYmZkICoKLWJmZF9vcGVudyAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICpuYmZkOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXRfdmVjOwotCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0KLSAgLyogbmJmZCBoYXMgdG8gcG9pbnQgdG8gaGVhZCBvZiBtYWxsb2MnZWQgYmxvY2sgc28gdGhhdCBiZmRfY2xvc2UgbWF5Ci0gICAgIHJlY2xhaW0gaXQgY29ycmVjdGx5LiAqLwotCi0gIG5iZmQgPSBfYmZkX25ld19iZmQgKCk7Ci0gIGlmIChuYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgdGFyZ2V0X3ZlYyA9IGJmZF9maW5kX3RhcmdldCAodGFyZ2V0LCBuYmZkKTsKLSAgaWYgKHRhcmdldF92ZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBvYmphbGxvY19mcmVlICgoc3RydWN0IG9iamFsbG9jICopIG5iZmQtPm1lbW9yeSk7Ci0gICAgICBmcmVlIChuYmZkKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBuYmZkLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBuYmZkLT5kaXJlY3Rpb24gPSB3cml0ZV9kaXJlY3Rpb247Ci0KLSAgaWYgKGJmZF9vcGVuX2ZpbGUgKG5iZmQpID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsJLyogRmlsZSBub3Qgd3JpdGVhYmxlLCBldGMgKi8KLSAgICAgIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgbmJmZC0+bWVtb3J5KTsKLSAgICAgIGZyZWUgKG5iZmQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gbmJmZDsKLX0KLQotLyoKLQotRlVOQ1RJT04KLQliZmRfY2xvc2UKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jbG9zZShiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCi0JQ2xvc2UgYSBCRkQuIElmIHRoZSBCRkQgd2FzIG9wZW4gZm9yIHdyaXRpbmcsCi0JdGhlbiBwZW5kaW5nIG9wZXJhdGlvbnMgYXJlIGNvbXBsZXRlZCBhbmQgdGhlIGZpbGUgd3JpdHRlbiBvdXQKLQlhbmQgY2xvc2VkLiBJZiB0aGUgY3JlYXRlZCBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZW4KLQk8PGNobW9kPj4gaXMgY2FsbGVkIHRvIG1hcmsgaXQgYXMgc3VjaC4KLQotCUFsbCBtZW1vcnkgYXR0YWNoZWQgdG8gdGhlIEJGRCBpcyByZWxlYXNlZC4KLQotCVRoZSBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBCRkQgaXMgY2xvc2VkIChldmVuCi0JaWYgaXQgd2FzIHBhc3NlZCBpbiB0byBCRkQgYnkgPDxiZmRfZmRvcGVucj4+KS4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4KLSovCi0KLQotYm9vbGVhbgotYmZkX2Nsb3NlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmICghYmZkX3JlYWRfcCAoYWJmZCkpCi0gICAgewotICAgICAgaWYgKCEgQkZEX1NFTkRfRk1UIChhYmZkLCBfYmZkX3dyaXRlX2NvbnRlbnRzLCAoYWJmZCkpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgQkZEX1NFTkQgKGFiZmQsIF9jbG9zZV9hbmRfY2xlYW51cCwgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0ID0gYmZkX2NhY2hlX2Nsb3NlIChhYmZkKTsKLQotICAvKiBJZiB0aGUgZmlsZSB3YXMgb3BlbiBmb3Igd3JpdGluZyBhbmQgaXMgbm93IGV4ZWN1dGFibGUsCi0gICAgIG1ha2UgaXQgc28gKi8KLSAgaWYgKHJldAotICAgICAgJiYgYWJmZC0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbgotICAgICAgJiYgYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotCi0gICAgICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDApCi0JewotIAkgIGludCBtYXNrID0gdW1hc2sgKDApOwotCSAgdW1hc2sgKG1hc2spOwotCSAgY2htb2QgKGFiZmQtPmZpbGVuYW1lLAotCQkgKDA3NzcKLQkJICAmIChidWYuc3RfbW9kZSB8ICgoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSAmfiBtYXNrKSkpKTsKLQl9Ci0gICAgfQotCi0gIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgYWJmZC0+bWVtb3J5KTsKLSAgZnJlZSAoYWJmZCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2Nsb3NlX2FsbF9kb25lCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfY2xvc2VfYWxsX2RvbmUoYmZkICopOwotCi1ERVNDUklQVElPTgotCUNsb3NlIGEgQkZELiAgRGlmZmVycyBmcm9tIDw8YmZkX2Nsb3NlPj4KLQlzaW5jZSBpdCBkb2VzIG5vdCBjb21wbGV0ZSBhbnkgcGVuZGluZyBvcGVyYXRpb25zLiAgVGhpcwotCXJvdXRpbmUgd291bGQgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gaGFkIGp1c3QgdXNlZCBCRkQgZm9yCi0Jc3dhcHBpbmcgYW5kIGRpZG4ndCB3YW50IHRvIHVzZSBhbnkgb2YgdGhlIHdyaXRpbmcgY29kZS4KLQotCUlmIHRoZSBjcmVhdGVkIGZpbGUgaXMgZXhlY3V0YWJsZSwgdGhlbiA8PGNobW9kPj4gaXMgY2FsbGVkCi0JdG8gbWFyayBpdCBhcyBzdWNoLgotCi0JQWxsIG1lbW9yeSBhdHRhY2hlZCB0byB0aGUgQkZEIGlzIHJlbGVhc2VkLgotCi1SRVRVUk5TCi0JPDx0cnVlPj4gaXMgcmV0dXJuZWQgaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPDxmYWxzZT4+LgotCi0qLwotCi1ib29sZWFuCi1iZmRfY2xvc2VfYWxsX2RvbmUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYm9vbGVhbiByZXQ7Ci0KLSAgcmV0ID0gYmZkX2NhY2hlX2Nsb3NlIChhYmZkKTsKLQotICAvKiBJZiB0aGUgZmlsZSB3YXMgb3BlbiBmb3Igd3JpdGluZyBhbmQgaXMgbm93IGV4ZWN1dGFibGUsCi0gICAgIG1ha2UgaXQgc28gKi8KLSAgaWYgKHJldAotICAgICAgJiYgYWJmZC0+ZGlyZWN0aW9uID09IHdyaXRlX2RpcmVjdGlvbgotICAgICAgJiYgYWJmZC0+ZmxhZ3MgJiBFWEVDX1ApCi0gICAgewotICAgICAgc3RydWN0IHN0YXQgYnVmOwotCi0gICAgICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZidWYpID09IDApCi0JewotCSAgaW50IG1hc2sgPSB1bWFzayAoMCk7Ci0JICB1bWFzayAobWFzayk7Ci0JICBjaG1vZCAoYWJmZC0+ZmlsZW5hbWUsCi0JCSAoMHg3NzcKLQkJICAmIChidWYuc3RfbW9kZSB8ICgoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSAmfiBtYXNrKSkpKTsKLQl9Ci0gICAgfQotCi0gIG9iamFsbG9jX2ZyZWUgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgYWJmZC0+bWVtb3J5KTsKLSAgZnJlZSAoYWJmZCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2NyZWF0ZQotCi1TWU5PUFNJUwotCWJmZCAqYmZkX2NyZWF0ZShDT05TVCBjaGFyICpmaWxlbmFtZSwgYmZkICp0ZW1wbCk7Ci0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgbmV3IEJGRCBpbiB0aGUgbWFubmVyIG9mCi0JPDxiZmRfb3Blbnc+PiwgYnV0IHdpdGhvdXQgb3BlbmluZyBhIGZpbGUuIFRoZSBuZXcgQkZECi0JdGFrZXMgdGhlIHRhcmdldCBmcm9tIHRoZSB0YXJnZXQgdXNlZCBieSBAdmFye3RlbXBsYXRlfS4gVGhlCi0JZm9ybWF0IGlzIGFsd2F5cyBzZXQgdG8gPDxiZmRfb2JqZWN0Pj4uCi0KLSovCi0KLWJmZCAqCi1iZmRfY3JlYXRlIChmaWxlbmFtZSwgdGVtcGwpCi0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICAgICBiZmQgKnRlbXBsOwotewotICBiZmQgKm5iZmQ7Ci0KLSAgbmJmZCA9IF9iZmRfbmV3X2JmZCAoKTsKLSAgaWYgKG5iZmQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbmJmZC0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgaWYgKHRlbXBsKQotICAgIG5iZmQtPnh2ZWMgPSB0ZW1wbC0+eHZlYzsKLSAgbmJmZC0+ZGlyZWN0aW9uID0gbm9fZGlyZWN0aW9uOwotICBiZmRfc2V0X2Zvcm1hdCAobmJmZCwgYmZkX29iamVjdCk7Ci0gIHJldHVybiBuYmZkOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV93cml0YWJsZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX21ha2Vfd3JpdGFibGUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlUYWtlcyBhIEJGRCBhcyBjcmVhdGVkIGJ5IDw8YmZkX2NyZWF0ZT4+IGFuZCBjb252ZXJ0cyBpdAotCWludG8gb25lIGxpa2UgYXMgcmV0dXJuZWQgYnkgPDxiZmRfb3Blbnc+Pi4gIEl0IGRvZXMgdGhpcwotCWJ5IGNvbnZlcnRpbmcgdGhlIEJGRCB0byBCRkRfSU5fTUVNT1JZLiAgSXQncyBhc3N1bWVkIHRoYXQKLQl5b3Ugd2lsbCBjYWxsIDw8YmZkX21ha2VfcmVhZGFibGU+PiBvbiB0aGlzIGJmZCBsYXRlci4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4KLSovCi0KLWJvb2xlYW4KLWJmZF9tYWtlX3dyaXRhYmxlKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGJmZF9pbl9tZW1vcnkgKmJpbTsKLQotICBpZiAoYWJmZC0+ZGlyZWN0aW9uICE9IG5vX2RpcmVjdGlvbikKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiaW0gPSAoc3RydWN0IGJmZF9pbl9tZW1vcnkgKikgYmZkX21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2luX21lbW9yeSkpOwotICBhYmZkLT5pb3N0cmVhbSA9IChQVFIpIGJpbTsKLSAgLyogYmZkX3dyaXRlIHdpbGwgZ3JvdyB0aGVzZSBhcyBuZWVkZWQgKi8KLSAgYmltLT5zaXplID0gMDsKLSAgYmltLT5idWZmZXIgPSAwOwotCi0gIGFiZmQtPmZsYWdzIHw9IEJGRF9JTl9NRU1PUlk7Ci0gIGFiZmQtPmRpcmVjdGlvbiA9IHdyaXRlX2RpcmVjdGlvbjsKLSAgYWJmZC0+d2hlcmUgPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfbWFrZV9yZWFkYWJsZQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX21ha2VfcmVhZGFibGUoYmZkICphYmZkKTsKLQotREVTQ1JJUFRJT04KLQlUYWtlcyBhIEJGRCBhcyBjcmVhdGVkIGJ5IDw8YmZkX2NyZWF0ZT4+IGFuZAotCTw8YmZkX21ha2Vfd3JpdGFibGU+PiBhbmQgY29udmVydHMgaXQgaW50byBvbmUgbGlrZSBhcwotCXJldHVybmVkIGJ5IDw8YmZkX29wZW5yPj4uICBJdCBkb2VzIHRoaXMgYnkgd3JpdGluZyB0aGUKLQljb250ZW50cyBvdXQgdG8gdGhlIG1lbW9yeSBidWZmZXIsIHRoZW4gcmV2ZXJzaW5nIHRoZQotCWRpcmVjdGlvbi4KLQotUkVUVVJOUwotCTw8dHJ1ZT4+IGlzIHJldHVybmVkIGlmIGFsbCBpcyBvaywgb3RoZXJ3aXNlIDw8ZmFsc2U+Pi4gICovCi0KLWJvb2xlYW4KLWJmZF9tYWtlX3JlYWRhYmxlKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGFiZmQtPmRpcmVjdGlvbiAhPSB3cml0ZV9kaXJlY3Rpb24gfHwgIShhYmZkLT5mbGFncyAmIEJGRF9JTl9NRU1PUlkpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIEJGRF9TRU5EX0ZNVCAoYWJmZCwgX2JmZF93cml0ZV9jb250ZW50cywgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgQkZEX1NFTkQgKGFiZmQsIF9jbG9zZV9hbmRfY2xlYW51cCwgKGFiZmQpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLQotICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0KLSAgYWJmZC0+d2hlcmUgPSAwOwotICBhYmZkLT5zZWN0aW9ucyA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBhYmZkLT5mb3JtYXQgPSBiZmRfdW5rbm93bjsKLSAgYWJmZC0+bXlfYXJjaGl2ZSA9IChiZmQgKikgTlVMTDsKLSAgYWJmZC0+b3JpZ2luID0gMDsJCQkJCi0gIGFiZmQtPm9wZW5lZF9vbmNlID0gZmFsc2U7Ci0gIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSBmYWxzZTsKLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDA7Ci0gIGFiZmQtPnVzcmRhdGEgPSAoUFRSKSBOVUxMOwotICBhYmZkLT5jYWNoZWFibGUgPSBmYWxzZTsKLSAgYWJmZC0+ZmxhZ3MgPSBCRkRfSU5fTUVNT1JZOwotICBhYmZkLT5tdGltZV9zZXQgPSBmYWxzZTsKLQotICBhYmZkLT50YXJnZXRfZGVmYXVsdGVkID0gdHJ1ZTsKLSAgYWJmZC0+ZGlyZWN0aW9uID0gcmVhZF9kaXJlY3Rpb247Ci0gIGFiZmQtPnNlY3Rpb25zID0gMDsKLSAgYWJmZC0+c3ltY291bnQgPSAwOwotICBhYmZkLT5vdXRzeW1ib2xzID0gMDsKLSAgYWJmZC0+dGRhdGEuYW55ID0gMDsKLQotICBiZmRfY2hlY2tfZm9ybWF0KGFiZmQsIGJmZF9vYmplY3QpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfYWxsb2MKLQotU1lOT1BTSVMKLQlQVFIgYmZkX2FsbG9jIChiZmQgKmFiZmQsIHNpemVfdCB3YW50ZWQpOwotCi1ERVNDUklQVElPTgotCUFsbG9jYXRlIGEgYmxvY2sgb2YgQHZhcnt3YW50ZWR9IGJ5dGVzIG9mIG1lbW9yeSBhdHRhY2hlZCB0bwotCTw8YWJmZD4+IGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgotKi8KLQotCi1QVFIKLWJmZF9hbGxvYyAoYWJmZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgUFRSIHJldDsKLQotICByZXQgPSBvYmphbGxvY19hbGxvYyAoYWJmZC0+bWVtb3J5LCAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0gIGlmIChyZXQgPT0gTlVMTCkKLSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgcmV0dXJuIHJldDsKLX0KLQotUFRSCi1iZmRfemFsbG9jIChhYmZkLCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNpemVfdCBzaXplOwotewotICBQVFIgcmVzOwotCi0gIHJlcyA9IGJmZF9hbGxvYyAoYWJmZCwgc2l6ZSk7Ci0gIGlmIChyZXMpCi0gICAgbWVtc2V0IChyZXMsIDAsIHNpemUpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBGcmVlIGEgYmxvY2sgYWxsb2NhdGVkIGZvciBhIEJGRC4gICovCi0KLXZvaWQKLWJmZF9yZWxlYXNlIChhYmZkLCBibG9jaykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgYmxvY2s7Ci17Ci0gIG9iamFsbG9jX2ZyZWVfYmxvY2sgKChzdHJ1Y3Qgb2JqYWxsb2MgKikgYWJmZC0+bWVtb3J5LCBibG9jayk7Ci19CmRpZmYgLS1naXQgYS9iZmQvb3NmLWNvcmUuYyBiL2JmZC9vc2YtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzFmNGFmLi4wMDAwMDAwCi0tLSBhL2JmZC9vc2YtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgT1NGLzEgY29yZSBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTkzLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjYW4gb25seSBiZSBjb21waWxlZCBvbiBzeXN0ZW1zIHdoaWNoIHVzZSBPU0YvMSBzdHlsZQotICAgY29yZSBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgPHN5cy91c2VyLmg+Ci0jaW5jbHVkZSA8c3lzL2NvcmUuaD4KLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBDT05TVCBjaGFyICosIGZsYWd3b3JkLCBiZmRfc2l6ZV90eXBlLAotCQkJICAgYmZkX3ZtYSwgZmlsZV9wdHIpKTsKLXN0YXRpYyBhc3ltYm9sICoKLW9zZl9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNoYXIgKgotb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludAotb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbgotb3NmX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGVzZSBhcmUgc3RvcmVkIGluIHRoZSBiZmQncyB0ZGF0YSAqLwotCi1zdHJ1Y3Qgb3NmX2NvcmVfc3RydWN0IAotewotICBpbnQgc2lnOwotICBjaGFyIGNtZFtNQVhDT01MRU4gKyAxXTsKLX07Ci0KLSNkZWZpbmUgY29yZV9oZHIoYmZkKSAoKGJmZCktPnRkYXRhLm9zZl9jb3JlX2RhdGEpCi0jZGVmaW5lIGNvcmVfc2lnbmFsKGJmZCkgKGNvcmVfaGRyKGJmZCktPnNpZykKLSNkZWZpbmUgY29yZV9jb21tYW5kKGJmZCkgKGNvcmVfaGRyKGJmZCktPmNtZCkKLQotc3RhdGljIGFzZWN0aW9uICoKLW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCBuYW1lLCBmbGFncywgX3Jhd19zaXplLCB2bWEsIGZpbGVwb3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgX3Jhd19zaXplOwotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgZmlsZV9wdHIgZmlsZXBvczsKLXsKLSAgYXNlY3Rpb24gKmFzZWN0OwotCi0gIGFzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotICBpZiAoIWFzZWN0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSA4OwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotb3NmX2NvcmVfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotb3NmX2NvcmVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHZhbDsKLSAgaW50IGk7Ci0gIGNoYXIgKnNlY25hbWU7Ci0gIHN0cnVjdCBjb3JlX2ZpbGVoZHIgY29yZV9oZWFkZXI7Ci0KLSAgdmFsID0gYmZkX3JlYWQgKChQVFIpJmNvcmVfaGVhZGVyLCAxLCBzaXplb2YgY29yZV9oZWFkZXIsIGFiZmQpOwotICBpZiAodmFsICE9IHNpemVvZiBjb3JlX2hlYWRlcikKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoc3RybmNtcCAoY29yZV9oZWFkZXIubWFnaWMsICJDb3JlIiwgNCkgIT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb3JlX2hkciAoYWJmZCkgPSAoc3RydWN0IG9zZl9jb3JlX3N0cnVjdCAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IG9zZl9jb3JlX3N0cnVjdCkpOwotICBpZiAoIWNvcmVfaGRyIChhYmZkKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJuY3B5IChjb3JlX2NvbW1hbmQgKGFiZmQpLCBjb3JlX2hlYWRlci5uYW1lLCBNQVhDT01MRU4gKyAxKTsKLSAgY29yZV9zaWduYWwgKGFiZmQpID0gY29yZV9oZWFkZXIuc2lnbm87Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNvcmVfaGVhZGVyLm5zY25zOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGNvcmVfc2NuaGRyIGNvcmVfc2NuaGRyOwotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIHZhbCA9IGJmZF9yZWFkICgoUFRSKSZjb3JlX3NjbmhkciwgMSwgc2l6ZW9mIGNvcmVfc2NuaGRyLCBhYmZkKTsKLSAgICAgIGlmICh2YWwgIT0gc2l6ZW9mIGNvcmVfc2NuaGRyKQotCWJyZWFrOwotCi0gICAgICAvKiBTa2lwIGVtcHR5IHNlY3Rpb25zLiAgKi8KLSAgICAgIGlmIChjb3JlX3Njbmhkci5zaXplID09IDAgfHwgY29yZV9zY25oZHIuc2NucHRyID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIHN3aXRjaCAoY29yZV9zY25oZHIuc2NudHlwZSkKLQl7Ci0JY2FzZSBTQ05SR046Ci0JICBzZWNuYW1lID0gIi5kYXRhIjsKLQkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ05TVEFDSzoKLQkgIHNlY25hbWUgPSAiLnN0YWNrIjsKLQkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JY2FzZSBTQ05SRUdTOgotCSAgc2VjbmFtZSA9ICIucmVnIjsKLQkgIGZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaGFuZGxlZCBPU0YvMSBjb3JlIGZpbGUgc2VjdGlvbiB0eXBlICVkXG4iKSwKLQkJCQkgY29yZV9zY25oZHIuc2NudHlwZSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIHNlY25hbWUsIGZsYWdzLAotCQkJICAgICAgKGJmZF9zaXplX3R5cGUpIGNvcmVfc2NuaGRyLnNpemUsCi0JCQkgICAgICAoYmZkX3ZtYSkgY29yZV9zY25oZHIudmFkZHIsCi0JCQkgICAgICAoZmlsZV9wdHIpIGNvcmVfc2NuaGRyLnNjbnB0cikpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1zdGF0aWMgY2hhciAqCi1vc2ZfY29yZV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX2NvbW1hbmQgKGFiZmQpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIGludAotb3NmX2NvcmVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBjb3JlX3NpZ25hbCAoYWJmZCk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgYm9vbGVhbgotb3NmX2NvcmVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgcmV0dXJuIHRydWU7CQkvKiBGSVhNRSwgV2UgaGF2ZSBubyB3YXkgb2YgdGVsbGluZyBhdCB0aGlzIHBvaW50ICovCi19Ci0MCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9zeW10YWJfdXBwZXJfYm91bmQgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZAotI2RlZmluZSBvc2ZfY29yZV9nZXRfc3ltdGFiIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWIKLSNkZWZpbmUgb3NmX2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBvc2ZfY29yZV9nZXRfc3ltYm9sX2luZm8gX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bWJvbF9pbmZvCi0jZGVmaW5lIG9zZl9jb3JlX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIF9iZmRfbm9zeW1ib2xzX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIG9zZl9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBvc2ZfY29yZV9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBvc2ZfY29yZV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIG9zZl9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBvc2ZfY29yZV9taW5pc3ltYm9sX3RvX3N5bWJvbCBfYmZkX25vc3ltYm9sc19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBvc2ZfY29yZV92ZWMgPQotICB7Ci0gICAgIm9zZi1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9CSUcsCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIG9zZl9jb3JlX2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAob3NmX2NvcmUpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChvc2ZfY29yZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2JmZC9wYzUzMi1tYWNoLmMgYi9iZmQvcGM1MzItbWFjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Y0YWM0Li4wMDAwMDAwCi0tLSBhL2JmZC9wYzUzMi1tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBNYWNoMy81MzIgYS5vdXQtaXNoIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIERhbGwKLSAqICAgICAgICAgICAgMTktQXByLTk0Ci0gKgotICogRm9ybWVybHkgcGFydCBvZiBhb3V0LXBjNTMyLW1hY2guYy4gU3BsaXQgb3V0IHRvIGFsbG93IG1vcmUKLSAqIGZsZXhpYmlsaXR5IHdpdGggbXVsdGlwbGUgZm9ybWF0cy4KLSAqCi0gKi8KLS8qIFRoaXMgYXJjaGl0ZWN0dXJlIGhhcyBOX1RYVE9GRiBhbmQgTl9UWFRBRERSIGRlZmluZWQgYXMgaWYKLSAqIE5fSEVBREVSX0lOX1RFWFQsIGJ1dCB0aGUgYV90ZXh0IGVudHJ5ICh0ZXh0IHNpemUpIGRvZXMgbm90IGluY2x1ZGUgdGhlCi0gKiBzcGFjZSBmb3IgdGhlIGhlYWRlci4gU28gd2UgaGF2ZSBOX0hFQURFUl9JTl9URVhUIGRlZmluZWQgdG8KLSAqIDEgYW5kIHNwZWNpYWxseSBkZWZpbmUgb3VyIG93biBOX1RYVFNJWkUKLSAqLwotCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgMQotI2RlZmluZSBOX1RYVFNJWkUoeCkgKCh4KS5hX3RleHQpCi0KLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMHgxMDAwMCAgICAgICAvKiBmcm9tIG9sZCBsZCAqLwotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4MTAwMCAgICAgICAvKiBmcm9tIG9sZCBsZCwgIDAzMiAmIDUzMiBhcmUgcmVhbGx5IDUxMi80ayAqLwotCi0vKiBVc2UgYV9lbnRyeSBvZiAwIHRvIGRpc3Rpbmd1aXNoIG9iamVjdCBmaWxlcyBmcm9tIE9NQUdJQyBleGVjdXRhYmxlcyAqLwotI2RlZmluZSBOX1RYVEFERFIoeCkgXAotICAoTl9NQUdJQyh4KSA9PSBPTUFHSUMgPyBcCi0gICAoKHgpLmFfZW50cnkgPCBURVhUX1NUQVJUX0FERFI/IDA6IFRFWFRfU1RBUlRfQUREUik6IFwKLSAgIChOX01BR0lDKHgpID09IE5NQUdJQz8gVEVYVF9TVEFSVF9BRERSOiBcCi0gICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFKSkKLQotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lIE5fU0hBUkVEX0xJQih4KSAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZGVmaW5lIERFRkFVTFRfQVJDSCBiZmRfYXJjaF9uczMyawotICAKLSNkZWZpbmUgTVkoT1ApIENBVChwYzUzMm1hY2hhb3V0XyxPUCkKLQotLyogTXVzdCBiZSB0aGUgc2FtZSBhcyBhb3V0LW5zMzJrLmMgKi8KLSNkZWZpbmUgTkFNRSh4LHkpIENBVDMobnMzMmthb3V0LF8zMl8seSkKLQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1wYzUzMi1tYWNoIgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLS8qIFdlIGNhbmB0IHVzZSB0aGUgTVlOUyBtYWNybyBoZXJlIGZvciBjcHAgcmVhc29ucyB0b28gc3VidGxlIGZvciBtZSAtLSBJV0QgKi8KLQotI2RlZmluZSBNWV9iZmRfcmVsb2NfdHlwZV9sb29rdXAgbnMzMmthb3V0X2JmZF9yZWxvY190eXBlX2xvb2t1cAotCi0vKiBsaWJhb3V0IGRvZXNuJ3QgdXNlIE5BTUUgZm9yIHRoZXNlIC4uLiAqLwotCi0jZGVmaW5lIE1ZX2dldF9zZWN0aW9uX2NvbnRlbnRzIGFvdXRfMzJfZ2V0X3NlY3Rpb25fY29udGVudHMKLQotI2RlZmluZSBNWV90ZXh0X2luY2x1ZGVzX2hlYWRlciAxCi0KLSNkZWZpbmUgTVlfZXhlY19oZWFkZXJfbm90X2NvdW50ZWQgMQotICAgICAKLSNkZWZpbmUgTVlOU1goT1ApIENBVChuczMya2FvdXRfLE9QKQotcmVsb2NfaG93dG9fdHlwZSAqCi1NWU5TWChiZmRfcmVsb2NfdHlwZV9sb29rdXApCi0gIFBBUkFNUygoYmZkICphYmZkIEFORAotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLQotYm9vbGVhbgotTVlOU1god3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotICBQQVJBTVMoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLWJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotICAKLSNpZiBDSE9PU0VfUkVMT0NfU0laRQotICBDSE9PU0VfUkVMT0NfU0laRShhYmZkKTsKLSNlbHNlCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotI2VuZGlmCi0gIAotICBCRkRfQVNTRVJUIChiZmRfZ2V0X2FyY2ggKGFiZmQpID09IGJmZF9hcmNoX25zMzJrKTsKLSAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIDMyMDMyOgotICAgICAgTl9TRVRfTUFDSFRZUEUgKCpleGVjcCwgTV9OUzMyMDMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI1MzI6Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fTlMzMjUzMik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIE5fU0VUX0ZMQUdTICgqZXhlY3AsIGFvdXRfYmFja2VuZF9pbmZvIChhYmZkKS0+ZXhlY19oZHJfZmxhZ3MpOwotICAKLSAgV1JJVEVfSEVBREVSUyhhYmZkLCBleGVjcCk7Ci0gIAotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBNWV93cml0ZV9vYmplY3RfY29udGVudHMgTVkod3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9wZS1hcm0uYyBiL2JmZC9wZS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhhMDQ4MS4uMDAwMDAwMAotLS0gYS9iZmQvcGUtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIEFSTSBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpZm5kZWYgVEFSR0VUX0xJVFRMRV9TWU0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgYXJtcGVfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGUtYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgICAgYXJtcGVfYmlnX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgICAicGUtYXJtLWJpZyIKLSNlbmRpZgotCi0jZGVmaW5lIENPRkZfV0lUSF9QRQotI2RlZmluZSBQQ1JFTE9GRlNFVCAgICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpZm5kZWYgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgCi0jZGVmaW5lIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfYXJtX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSNlbmRpZgotCQotI2luY2x1ZGUgImNvZmYtYXJtLmMiCmRpZmYgLS1naXQgYS9iZmQvcGUtaTM4Ni5jIGIvYmZkL3BlLWkzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkYmU0NC4uMDAwMDAwMAotLS0gYS9iZmQvcGUtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNkZWZpbmUgVEFSR0VUX1NZTSBpMzg2cGVfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJwZS1pMzg2IgotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLW1jb3JlLmMgYi9iZmQvcGUtbWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExOWY4MS4uMDAwMDAwMAotLS0gYS9iZmQvcGUtbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUNvcmUgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9CSUdfU1lNCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIG1jb3JlX3BlX2JpZ192ZWMKLSNkZWZpbmUgVEFSR0VUX0JJR19OQU1FICAgICAgInBlLW1jb3JlLWJpZyIKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICAgbWNvcmVfcGVfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGUtbWNvcmUtbGl0dGxlIgotI2VuZGlmCi0KLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICAgIHRydWUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2RlZmluZSBNQ09SRV9QRQotCi0jaW5jbHVkZSAiY29mZi1tY29yZS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlLXBwYy5jIGIvYmZkL3BlLXBwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJhYzA0Li4wMDAwMDAwCi0tLSBhL2JmZC9wZS1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUG93ZXJQQyBQRUNPRkYgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNkZWZpbmUgRV9GSUxFTk1MRU4gICAgIDE4Ci0KLSNkZWZpbmUgUFBDX1BFCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICBiZmRfcG93ZXJwY2xlX3BlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgInBlLXBvd2VycGNsZSIKLQotI2RlZmluZSBUQVJHRVRfQklHX1NZTSAgICAgIGJmZF9wb3dlcnBjX3BlX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlLXBvd2VycGMiCi0KLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0KLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotLyogRklYTUU6IHZlcmlmeSBQQ1JFTE9GRlNFVCBpcyBhbHdheXMgZmFsc2UgKi8KLQotI2luY2x1ZGUgImNvZmYtcHBjLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLWFybS5jIGIvYmZkL3BlaS1hcm0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0MjE0YS4uMDAwMDAwMAotLS0gYS9iZmQvcGVpLWFybS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBhcm0gUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmbmRlZiBUQVJHRVRfTElUVExFX1NZTQotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgYXJtcGVpX2xpdHRsZV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZWktYXJtLWxpdHRsZSIKLSNkZWZpbmUgVEFSR0VUX0JJR19TWU0gICAgIGFybXBlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAicGVpLWFybS1iaWciCi0jZW5kaWYKLQotI2RlZmluZSBJTUFHRV9CQVNFICAgICAgICAgTlRfSU1BR0VfQkFTRQotI2RlZmluZSBDT0ZGX0lNQUdFX1dJVEhfUEUKLSNkZWZpbmUgQ09GRl9XSVRIX1BFCi0jZGVmaW5lIFBDUkVMT0ZGU0VUICAgICAgICB0cnVlCi0jZGVmaW5lIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0KLSNpZm5kZWYgYmZkX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgCi0jZGVmaW5lIGJmZF9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfYXJtX3BlX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucwotI2RlZmluZSBiZmRfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZyBcCi0JYmZkX2FybV9wZV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcKLSNkZWZpbmUgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIFwKLQliZmRfYXJtX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSNlbmRpZgotCQotI2luY2x1ZGUgImNvZmYtYXJtLmMiCmRpZmYgLS1naXQgYS9iZmQvcGVpLWkzODYuYyBiL2JmZC9wZWktaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUyOTY4Li4wMDAwMDAwCi0tLSBhL2JmZC9wZWktaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBJbnRlbCAzODYgUEUgSU1BR0UgQ09GRiBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBUQVJHRVRfU1lNIGkzODZwZWlfdmVjCi0jZGVmaW5lIFRBUkdFVF9OQU1FICJwZWktaTM4NiIKLSNkZWZpbmUgSU1BR0VfQkFTRSBOVF9JTUFHRV9CQVNFCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgdHJ1ZQotI2RlZmluZSBUQVJHRVRfVU5ERVJTQ09SRSAnXycKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2luY2x1ZGUgImNvZmYtaTM4Ni5jIgotCi0KLQpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1tY29yZS5jIGIvYmZkL3BlaS1tY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGE4NzJjLi4wMDAwMDAwCi0tLSBhL2JmZC9wZWktbWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgTUNvcmUgUEVDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaWZuZGVmIFRBUkdFVF9CSUdfU1lNCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgIG1jb3JlX3BlaV9iaWdfdmVjCi0jZGVmaW5lIFRBUkdFVF9CSUdfTkFNRSAgICAgICJwZWktbWNvcmUtYmlnIgotI2RlZmluZSBUQVJHRVRfTElUVExFX1NZTSAgICBtY29yZV9wZWlfbGl0dGxlX3ZlYwotI2RlZmluZSBUQVJHRVRfTElUVExFX05BTUUgICAicGVpLW1jb3JlLWxpdHRsZSIKLSNlbmRpZgotCi0jZGVmaW5lIElNQUdFX0JBU0UgICAgICAgICBOVF9JTUFHRV9CQVNFCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLSNkZWZpbmUgUENSRUxPRkZTRVQgICAgICAgIHRydWUKLSNkZWZpbmUgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQotI2RlZmluZSBNQ09SRV9QRQotCi0jaW5jbHVkZSAiY29mZi1tY29yZS5jIgpkaWZmIC0tZ2l0IGEvYmZkL3BlaS1wcGMuYyBiL2JmZC9wZWktcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWJjMGYuLjAwMDAwMDAKLS0tIGEvYmZkL3BlaS1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3IgUG93ZXJQQyBQRSBJTUFHRSBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotLyogc2V0dGluZyB1cCBmb3IgYSBQRSBlbnZpcm9ubWVudCBzdG9sZW4gZGlyZWN0bHkgZnJvbSB0aGUgaTM4NiBzdHJ1Y3R1cmUgKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0KLSNkZWZpbmUgUFBDX1BFCi0KLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9TWU0gICBiZmRfcG93ZXJwY2xlX3BlaV92ZWMKLSNkZWZpbmUgVEFSR0VUX0xJVFRMRV9OQU1FICJwZWktcG93ZXJwY2xlIgotCi0jZGVmaW5lIFRBUkdFVF9CSUdfU1lNICAgICAgYmZkX3Bvd2VycGNfcGVpX3ZlYwotI2RlZmluZSBUQVJHRVRfQklHX05BTUUgICAgInBlaS1wb3dlcnBjIgotCi0jZGVmaW5lIElNQUdFX0JBU0UgICAgICAgICAgTlRfSU1BR0VfQkFTRQotCi0jZGVmaW5lIENPRkZfSU1BR0VfV0lUSF9QRQotI2RlZmluZSBDT0ZGX1dJVEhfUEUKLQotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0vKiBGSVhNRTogVmVyaWZ5IFBDUkVMT0ZGU0VUIGlzIGFsd2F5cyBmYWxzZSAqLwotCi0jaW5jbHVkZSAiY29mZi1wcGMuYyIKLQotCi0KZGlmZiAtLWdpdCBhL2JmZC9wZWljb2RlLmggYi9iZmQvcGVpY29kZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U3ZWY2Li4wMDAwMDAwCi0tLSBhL2JmZC9wZWljb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTk5ICswLDAgQEAKLS8qIFN1cHBvcnQgZm9yIHRoZSBnZW5lcmljIHBhcnRzIG9mIG1vc3QgQ09GRiB2YXJpYW50cywgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotTW9zdCBvZiB0aGlzIGhhY2tlZCBieSAgU3RldmUgQ2hhbWJlcmxhaW4sCi0JCQlzYWNAY3lnbnVzLmNvbQotKi8KLQotLyogSGV5IGxvb2ssIHNvbWUgZG9jdW1lbnRhdGlvbiBbYW5kIGluIGEgcGxhY2UgeW91IGV4cGVjdCB0byBmaW5kIGl0XSEKLQotICAgVGhlIG1haW4gcmVmZXJlbmNlIGZvciB0aGUgcGVpIGZvcm1hdCBpcyAiTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUKLSAgIGFuZCBDb21tb24gT2JqZWN0IEZpbGUgRm9ybWF0IFNwZWNpZmljYXRpb24gNC4xIi4gIEdldCBpdCBpZiB5b3UgbmVlZCB0bwotICAgZG8gc29tZSBzZXJpb3VzIGhhY2tpbmcgb24gdGhpcyBjb2RlLgotCi0gICBBbm90aGVyIHJlZmVyZW5jZToKLSAgICJQZWVyaW5nIEluc2lkZSB0aGUgUEU6IEEgVG91ciBvZiB0aGUgV2luMzIgUG9ydGFibGUgRXhlY3V0YWJsZQotICAgRmlsZSBGb3JtYXQiLCBNU0ogMTk5NCwgVm9sdW1lIDkuCi0KLSAgIFRoZSAqc29sZSogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwZSBmb3JtYXQgYW5kIHRoZSBwZWkgZm9ybWF0IGlzIHRoYXQgdGhlCi0gICBsYXR0ZXIgaGFzIGFuIE1TRE9TIDIuMCAuZXhlIGhlYWRlciBvbiB0aGUgZnJvbnQgdGhhdCBwcmludHMgdGhlIG1lc3NhZ2UKLSAgICJUaGlzIGFwcCBtdXN0IGJlIHJ1biB1bmRlciBXaW5kb3dzLiIgKG9yIHNvbWUgc3VjaCkuCi0gICAoRklYTUU6IFdoZXRoZXIgdGhhdCBzdGF0ZW1lbnQgaXMgKnJlYWxseSogdHJ1ZSBvciBub3QgaXMgdW5rbm93bi4KLSAgIEFyZSB0aGVyZSBtb3JlIHN1YnRsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBlIGFuZCBwZWkgZm9ybWF0cz8KLSAgIEZvciBub3cgYXNzdW1lIHRoZXJlIGFyZW4ndC4gIElmIHlvdSBmaW5kIG9uZSwgdGhlbiBmb3IgR29kIHNha2VzCi0gICBkb2N1bWVudCBpdCBoZXJlISkKLQotICAgVGhlIE1pY3Jvc29mdCBkb2NzIHVzZSB0aGUgd29yZCAiaW1hZ2UiIGluc3RlYWQgb2YgImV4ZWN1dGFibGUiIGJlY2F1c2UKLSAgIHRoZSBmb3JtZXIgY2FuIGFsc28gcmVmZXIgdG8gYSBETEwgKHNoYXJlZCBsaWJyYXJ5KS4gIENvbmZ1c2lvbiBjYW4gYXJpc2UKLSAgIGJlY2F1c2UgdGhlIGBpJyBpbiBgcGVpJyBhbHNvIHJlZmVycyB0byAiaW1hZ2UiLiAgVGhlIGBwZScgZm9ybWF0IGNhbgotICAgYWxzbyBjcmVhdGUgaW1hZ2VzIChpLmUuIGV4ZWN1dGFibGVzKSwgaXQncyBqdXN0IHRoYXQgdG8gcnVuIG9uIGEgd2luMzIKLSAgIHN5c3RlbSB5b3UgbmVlZCB0byB1c2UgdGhlIHBlaSBmb3JtYXQuCi0KLSAgIEZJWE1FOiBQbGVhc2UgYWRkIG1vcmUgZG9jcyBoZXJlIHNvIHRoZSBuZXh0IHBvb3IgZm9vbCB0aGF0IGhhcyB0byBoYWNrCi0gICBvbiB0aGlzIGNvZGUgaGFzIGEgY2hhbmNlIG9mIGdldHRpbmcgc29tZXRoaW5nIGFjY29tcGxpc2hlZCB3aXRob3V0Ci0gICB3YXN0aW5nIHRvbyBtdWNoIHRpbWUuCi0qLwotCi0jaWZkZWYgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhKQotICAgICBQQVJBTVMgKChiZmQgKiwgUFRSKSkKLSAgICAgPSBjb2ZmX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLSNlbHNlCi1zdGF0aWMgYm9vbGVhbiAoKnBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBQVFIpKQotICAgICA9IE5VTEw7Ci0jZW5kaWYKLSNkZWZpbmUgY29mZl9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSBwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgY29mZl9ta29iamVjdCAgICAgIHBlX21rb2JqZWN0Ci0jZGVmaW5lIGNvZmZfbWtvYmplY3RfaG9vayBwZV9ta29iamVjdF9ob29rCi0KLSNpZm5kZWYgR0VUX0ZDTl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpIFwKLSAgICAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNlbmRpZgotCi0jaWZuZGVmIEdFVF9GQ05fRU5ETkRYCi0jZGVmaW5lIEdFVF9GQ05fRU5ETkRYKGFiZmQsIGV4dCkgIFwKLQliZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZW5kaWYKLQotI2lmbmRlZiBQVVRfRkNOX0xOTk9QVFIKLSNkZWZpbmUgUFVUX0ZDTl9MTk5PUFRSKGFiZmQsIGluLCBleHQpICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0ZDTl9FTkRORFgKLSNkZWZpbmUgUFVUX0ZDTl9FTkRORFgoYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keCkKLSNlbmRpZgotI2lmbmRlZiBHRVRfTE5TWl9MTk5PCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xOU1pfU0laRQotI2RlZmluZSBHRVRfTE5TWl9TSVpFKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9MTlNaX0xOTk8KLSNkZWZpbmUgUFVUX0xOU1pfTE5OTyhhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKWV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX0xOU1pfU0laRQotI2RlZmluZSBQVVRfTE5TWl9TSVpFKGFiZmQsIGluLCBleHQpIGJmZF9oX3B1dF8xNihhYmZkLCBpbiwgKGJmZF9ieXRlKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOX1NDTkxFTgotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCAgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9zY25sZW4pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OUkVMT0MKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgIGV4dCkgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTl9OTElOTk8KLSNkZWZpbmUgR0VUX1NDTl9OTElOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTl9TQ05MRU4KLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTlJFTE9DCi0jZGVmaW5lIFBVVF9TQ05fTlJFTE9DKGFiZmQsaW4sIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsIGluLCAoYmZkX2J5dGUgKilleHQtPnhfc2NuLnhfbnJlbG9jKQotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05fTkxJTk5PCi0jZGVmaW5lIFBVVF9TQ05fTkxJTk5PKGFiZmQsaW4sIGV4dCkgIGJmZF9oX3B1dF8xNihhYmZkLGluLCAoYmZkX2J5dGUgICopIGV4dC0+eF9zY24ueF9ubGlubm8pCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0xJTkVOT19MTk5PCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLSNpZm5kZWYgUFVUX0xJTkVOT19MTk5PCi0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMTYoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZW5kaWYKLQotLyogVGhlIGZfc3ltcHRyIGZpZWxkIGluIHRoZSBmaWxlaGRyIGlzIHNvbWV0aW1lcyA2NCBiaXRzLiAgKi8KLSNpZm5kZWYgR0VUX0ZJTEVIRFJfU1lNUFRSCi0jZGVmaW5lIEdFVF9GSUxFSERSX1NZTVBUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfRklMRUhEUl9TWU1QVFIKLSNkZWZpbmUgUFVUX0ZJTEVIRFJfU1lNUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLS8qIFNvbWUgZmllbGRzIGluIHRoZSBhb3V0aGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX1RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX1RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0RTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0RTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIEdFVF9BT1VUSERSX0JTSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0JTSVpFCi0jZGVmaW5lIFBVVF9BT1VUSERSX0JTSVpFIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIEdFVF9BT1VUSERSX0VOVFJZIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0VOVFJZCi0jZGVmaW5lIFBVVF9BT1VUSERSX0VOVFJZIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0jaWZuZGVmIEdFVF9BT1VUSERSX1RFWFRfU1RBUlQKLSNkZWZpbmUgR0VUX0FPVVRIRFJfVEVYVF9TVEFSVCBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfQU9VVEhEUl9URVhUX1NUQVJUCi0jZGVmaW5lIFBVVF9BT1VUSERSX1RFWFRfU1RBUlQgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX0FPVVRIRFJfREFUQV9TVEFSVAotI2RlZmluZSBHRVRfQU9VVEhEUl9EQVRBX1NUQVJUIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQKLSNkZWZpbmUgUFVUX0FPVVRIRFJfREFUQV9TVEFSVCBiZmRfaF9wdXRfMzIKLSNlbmRpZgotCi0vKiBTb21lIGZpZWxkcyBpbiB0aGUgc2NuaGRyIGFyZSBzb21ldGltZXMgNjQgYml0cy4gICovCi0jaWZuZGVmIEdFVF9TQ05IRFJfUEFERFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9QQUREUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX1BBRERSCi0jZGVmaW5lIFBVVF9TQ05IRFJfUEFERFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9WQUREUgotI2RlZmluZSBHRVRfU0NOSERSX1ZBRERSIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfVkFERFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9WQUREUiBiZmRfaF9wdXRfMzIKLSNlbmRpZgotI2lmbmRlZiBHRVRfU0NOSERSX1NJWkUKLSNkZWZpbmUgR0VUX1NDTkhEUl9TSVpFIGJmZF9oX2dldF8zMgotI2VuZGlmCi0jaWZuZGVmIFBVVF9TQ05IRFJfU0laRQotI2RlZmluZSBQVVRfU0NOSERSX1NJWkUgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9TQ05QVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9TQ05QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9TQ05QVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgR0VUX1NDTkhEUl9SRUxQVFIgYmZkX2hfZ2V0XzMyCi0jZW5kaWYKLSNpZm5kZWYgUFVUX1NDTkhEUl9SRUxQVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9SRUxQVFIgYmZkX2hfcHV0XzMyCi0jZW5kaWYKLSNpZm5kZWYgR0VUX1NDTkhEUl9MTk5PUFRSCi0jZGVmaW5lIEdFVF9TQ05IRFJfTE5OT1BUUiBiZmRfaF9nZXRfMzIKLSNlbmRpZgotI2lmbmRlZiBQVVRfU0NOSERSX0xOTk9QVFIKLSNkZWZpbmUgUFVUX1NDTkhEUl9MTk5PUFRSIGJmZF9oX3B1dF8zMgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9yZWxvY19pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3JlbG9jX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9maWxlaGRyX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfZmlsZWhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBjb2ZmX3N3YXBfc3ltX2luIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHVuc2lnbmVkIGludCBjb2ZmX3N3YXBfc3ltX291dCBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9hdXhfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2F1eF9vdXQKLSAgUEFSQU1TICgoYmZkICosIFBUUiwgaW50LCBpbnQsIGludCwgaW50LCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvZmZfc3dhcF9saW5lbm9faW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNvZmZfc3dhcF9saW5lbm9fb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX2FvdXRoZHJfaW4gUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhZGRfZGF0YV9lbnRyeQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKiwgaW50LCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX2FvdXRoZHJfb3V0IFBBUkFNUyAoKGJmZCAqLCBQVFIsIFBUUikpOwotc3RhdGljIHZvaWQgY29mZl9zd2FwX3Njbmhkcl9pbiBQQVJBTVMgKChiZmQgKiwgUFRSLCBQVFIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY29mZl9zd2FwX3Njbmhkcl9vdXQgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9pZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9lZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9wZGF0YSBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9yZWxvYyBQQVJBTVMgKChiZmQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHBlX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgUFRSIHBlX21rb2JqZWN0X2hvb2sgUEFSQU1TICgoYmZkICosIFBUUiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwZV9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9yZWxvY19pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgUFRSIHNyYzsKLSAgICAgUFRSIGRzdDsKLXsKLSAgUkVMT0MgKnJlbG9jX3NyYyA9IChSRUxPQyAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NfZHN0ID0gKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBkc3Q7Ci0KLSAgcmVsb2NfZHN0LT5yX3ZhZGRyID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKXJlbG9jX3NyYy0+cl92YWRkcik7Ci0gIHJlbG9jX2RzdC0+cl9zeW1uZHggPSBiZmRfaF9nZXRfc2lnbmVkXzMyKGFiZmQsIChiZmRfYnl0ZSAqKSByZWxvY19zcmMtPnJfc3ltbmR4KTsKLQotICByZWxvY19kc3QtPnJfdHlwZSA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgcmVsb2Nfc3JjLT5yX3R5cGUpOwotCi0jaWZkZWYgU1dBUF9JTl9SRUxPQ19PRkZTRVQKLSAgcmVsb2NfZHN0LT5yX29mZnNldCA9IFNXQVBfSU5fUkVMT0NfT0ZGU0VUKGFiZmQsCi0JCQkJCSAgICAgKGJmZF9ieXRlICopIHJlbG9jX3NyYy0+cl9vZmZzZXQpOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX3JlbG9jX291dCAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCXNyYzsKLSAgICAgUFRSCWRzdDsKLXsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY19zcmMgPSAoc3RydWN0IGludGVybmFsX3JlbG9jICopc3JjOwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKnJlbG9jX2RzdCA9IChzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKilkc3Q7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCByZWxvY19zcmMtPnJfdmFkZHIsIChiZmRfYnl0ZSAqKSByZWxvY19kc3QtPnJfdmFkZHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgcmVsb2Nfc3JjLT5yX3N5bW5keCwgKGJmZF9ieXRlICopIHJlbG9jX2RzdC0+cl9zeW1uZHgpOwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCByZWxvY19zcmMtPnJfdHlwZSwgKGJmZF9ieXRlICopCi0JICAgICAgIHJlbG9jX2RzdC0+cl90eXBlKTsKLQotI2lmZGVmIFNXQVBfT1VUX1JFTE9DX09GRlNFVAotICBTV0FQX09VVF9SRUxPQ19PRkZTRVQoYWJmZCwKLQkJCXJlbG9jX3NyYy0+cl9vZmZzZXQsCi0JCQkoYmZkX2J5dGUgKikgcmVsb2NfZHN0LT5yX29mZnNldCk7Ci0jZW5kaWYKLSNpZmRlZiBTV0FQX09VVF9SRUxPQ19FWFRSQQotICBTV0FQX09VVF9SRUxPQ19FWFRSQShhYmZkLHJlbG9jX3NyYywgcmVsb2NfZHN0KTsKLSNlbmRpZgotICByZXR1cm4gUkVMU1o7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9maWxlaGRyX2luIChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUgkgICAgIHNyYzsKLSAgICAgUFRSCSAgICAgZHN0OwotewotICBGSUxIRFIgKmZpbGVoZHJfc3JjID0gKEZJTEhEUiAqKSBzcmM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2RzdCA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKSBkc3Q7Ci0gIGZpbGVoZHJfZHN0LT5mX21hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9tYWdpYyk7Ci0gIGZpbGVoZHJfZHN0LT5mX25zY25zID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9uc2Nucyk7Ci0gIGZpbGVoZHJfZHN0LT5mX3RpbWRhdCA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfdGltZGF0KTsKLQotICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfbnN5bXMpOwotICBmaWxlaGRyX2RzdC0+Zl9mbGFncyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKilmaWxlaGRyX3NyYy0+IGZfZmxhZ3MpOwotICBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX3NyYy0+Zl9zeW1wdHIpOwotCi0gIC8qIE90aGVyIHBlb3BsZSdzIHRvb2xzIHNvbWV0aW1lcyBnZW5lcmF0ZSBoZWFkZXJzIHdpdGggYW4gbnN5bXMgYnV0Ci0gICAgIGEgemVybyBzeW1wdHIuICAqLwotICBpZiAoZmlsZWhkcl9kc3QtPmZfbnN5bXMgIT0gMCAmJiBmaWxlaGRyX2RzdC0+Zl9zeW1wdHIgPT0gMCkKLSAgICB7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9uc3ltcyA9IDA7Ci0gICAgICBmaWxlaGRyX2RzdC0+Zl9mbGFncyB8PSBGX0xTWU1TOwotICAgIH0KLQotICBmaWxlaGRyX2RzdC0+Zl9vcHRoZHIgPSBiZmRfaF9nZXRfMTYoYWJmZCwgCi0JCQkJICAgICAgIChiZmRfYnl0ZSAqKWZpbGVoZHJfc3JjLT4gZl9vcHRoZHIpOwotfQotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0KLXN0YXRpYyAgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfZmlsZWhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBpbnQgaWR4OwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqZmlsZWhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciAqKWluOwotICBGSUxIRFIgKmZpbGVoZHJfb3V0ID0gKEZJTEhEUiAqKW91dDsKLQotICBpZiAocGVfZGF0YSAoYWJmZCktPmhhc19yZWxvY19zZWN0aW9uKQotICAgIGZpbGVoZHJfaW4tPmZfZmxhZ3MgJj0gfkZfUkVMRkxHOwotCi0gIGlmIChwZV9kYXRhIChhYmZkKS0+ZGxsKQotICAgIGZpbGVoZHJfaW4tPmZfZmxhZ3MgfD0gRl9ETEw7Ci0KLSAgZmlsZWhkcl9pbi0+cGUuZV9tYWdpYyAgICA9IERPU01BR0lDOwotICBmaWxlaGRyX2luLT5wZS5lX2NibHAgICAgID0gMHg5MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcCAgICAgICA9IDB4MzsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcmxjICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9jcGFyaGRyICA9IDB4NDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9taW5hbGxvYyA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9tYXhhbGxvYyA9IDB4ZmZmZjsKLSAgZmlsZWhkcl9pbi0+cGUuZV9zcyAgICAgICA9IDB4MDsKLSAgZmlsZWhkcl9pbi0+cGUuZV9zcCAgICAgICA9IDB4Yjg7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3N1bSAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfaXAgICAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfY3MgICAgICAgPSAweDA7Ci0gIGZpbGVoZHJfaW4tPnBlLmVfbGZhcmxjICAgPSAweDQwOwotICBmaWxlaGRyX2luLT5wZS5lX292bm8gICAgID0gMHgwOwotCi0gIGZvciAoaWR4PTA7IGlkeCA8IDQ7IGlkeCsrKQotICAgIGZpbGVoZHJfaW4tPnBlLmVfcmVzW2lkeF0gPSAweDA7Ci0KLSAgZmlsZWhkcl9pbi0+cGUuZV9vZW1pZCAgID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5lX29lbWluZm8gPSAweDA7Ci0KLSAgZm9yIChpZHg9MDsgaWR4IDwgMTA7IGlkeCsrKQotICAgIGZpbGVoZHJfaW4tPnBlLmVfcmVzMltpZHhdID0gMHgwOwotCi0gIGZpbGVoZHJfaW4tPnBlLmVfbGZhbmV3ID0gMHg4MDsKLQotICAvKiB0aGlzIG5leHQgY29sbGVjdGlvbiBvZiBkYXRhIGFyZSBtb3N0bHkganVzdCBjaGFyYWN0ZXJzLiAgSXQgYXBwZWFycwotICAgICB0byBiZSBjb25zdGFudCB3aXRoaW4gdGhlIGhlYWRlcnMgcHV0IG9uIE5UIGV4ZXMgKi8KLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMF0gID0gMHgwZWJhMWYwZTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMV0gID0gMHhjZDA5YjQwMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMl0gID0gMHg0YzAxYjgyMTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbM10gID0gMHg2ODU0MjFjZDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNF0gID0gMHg3MDIwNzM2OTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNV0gID0gMHg3MjY3NmY3MjsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbNl0gID0gMHg2MzIwNmQ2MTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbN10gID0gMHg2ZjZlNmU2MTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbOF0gID0gMHg2NTYyMjA3NDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbOV0gID0gMHg2ZTc1NzIyMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTBdID0gMHgyMDZlNjkyMDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTFdID0gMHgyMDUzNGY0NDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTJdID0gMHg2NTY0NmY2ZDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTNdID0gMHgwYTBkMGQyZTsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTRdID0gMHgyNDsKLSAgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbMTVdID0gMHgwOwotICBmaWxlaGRyX2luLT5wZS5udF9zaWduYXR1cmUgPSBOVF9TSUdOQVRVUkU7Ci0KLQotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgdGltZSAoMCksIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl90aW1kYXQpOwotICBQVVRfRklMRUhEUl9TWU1QVFIgKGFiZmQsIChiZmRfdm1hKSBmaWxlaGRyX2luLT5mX3N5bXB0ciwKLQkJICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX3N5bXB0cik7Ci0gIGJmZF9oX3B1dF8zMihhYmZkLCBmaWxlaGRyX2luLT5mX25zeW1zLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbnN5bXMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9vcHRoZHIsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9vcHRoZHIpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9mbGFncywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX2ZsYWdzKTsKLQotICAvKiBwdXQgaW4gZXh0cmEgZG9zIGhlYWRlciBzdHVmZi4gIFRoaXMgZGF0YSByZW1haW5zIGVzc2VudGlhbGx5Ci0gICAgIGNvbnN0YW50LCBpdCBqdXN0IGhhcyB0byBiZSB0YWNrZWQgb24gdG8gdGhlIGJlZ2lubmluZyBvZiBhbGwgZXhlcyAKLSAgICAgZm9yIE5UICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jYmxwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY2JscCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3ApOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9jcmxjLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3JsYyk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NwYXJoZHIsIAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3Bhcmhkcik7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX21pbmFsbG9jLCAKLQkgICAgICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX21pbmFsbG9jKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbWF4YWxsb2MsIAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbWF4YWxsb2MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9zcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3NzKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfc3AsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9zcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzdW0sIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9jc3VtKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfaXAsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9pcCk7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX2NzLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfY3MpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9sZmFybGMsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+ZV9sZmFybGMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vdm5vLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb3Zubyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDQ7IGlkeCsrKQotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfcmVzW2lkeF0sIAotCQkgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfcmVzW2lkeF0pOwotICB9Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX29lbWlkLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb2VtaWQpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZV9vZW1pbmZvLAotCSAgICAgICAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfb2VtaW5mbyk7Ci0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDEwOyBpZHgrKykKLSAgICAgIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5wZS5lX3JlczJbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5lX3JlczJbaWR4XSk7Ci0gIH0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLmVfbGZhbmV3LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmVfbGZhbmV3KTsKLQotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+cGUuZG9zX21lc3NhZ2VbaWR4XSwKLQkJICAgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5kb3NfbWVzc2FnZVtpZHhdKTsKLSAgfQotCi0gIC8qIGFsc28gcHV0IGluIHRoZSBOVCBzaWduYXR1cmUgKi8KLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPnBlLm50X3NpZ25hdHVyZSwgCi0JICAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+bnRfc2lnbmF0dXJlKTsKLQotCi0KLQotICByZXR1cm4gRklMSFNaOwotfQotI2Vsc2UKLQotc3RhdGljICB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICpmaWxlaGRyX2luID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopaW47Ci0gIEZJTEhEUiAqZmlsZWhkcl9vdXQgPSAoRklMSERSICopb3V0OwotCi0gIGJmZF9oX3B1dF8xNihhYmZkLCBmaWxlaGRyX2luLT5mX21hZ2ljLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfbWFnaWMpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc2NucywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zY25zKTsKLSAgYmZkX2hfcHV0XzMyKGFiZmQsIGZpbGVoZHJfaW4tPmZfdGltZGF0LCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfdGltZGF0KTsKLSAgUFVUX0ZJTEVIRFJfU1lNUFRSIChhYmZkLCAoYmZkX3ZtYSkgZmlsZWhkcl9pbi0+Zl9zeW1wdHIsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9zeW1wdHIpOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgZmlsZWhkcl9pbi0+Zl9uc3ltcywgKGJmZF9ieXRlICopIGZpbGVoZHJfb3V0LT5mX25zeW1zKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfb3B0aGRyLCAoYmZkX2J5dGUgKikgZmlsZWhkcl9vdXQtPmZfb3B0aGRyKTsKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGZpbGVoZHJfaW4tPmZfZmxhZ3MsIChiZmRfYnl0ZSAqKSBmaWxlaGRyX291dC0+Zl9mbGFncyk7Ci0KLSAgcmV0dXJuIEZJTEhTWjsKLX0KLQotI2VuZGlmCi0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9zeW1faW4gKGFiZmQsIGV4dDEsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBleHQxOwotICAgICBQVFIgaW4xOwotewotICBTWU1FTlQgKmV4dCA9IChTWU1FTlQgKilleHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICAgICAgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbjE7Ci0KLSAgaWYoIGV4dC0+ZS5lX25hbWVbMF0gPT0gMCkgewotICAgIGluLT5fbi5fbl9uLl9uX3plcm9lcyA9IDA7Ci0gICAgaW4tPl9uLl9uX24uX25fb2Zmc2V0ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmUuZS5lX29mZnNldCk7Ci0gIH0KLSAgZWxzZSB7Ci0jaWYgU1lNTk1MRU4gIT0gRV9TWU1OTUxFTgotICAgIC0+IEVycm9yLCB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBTWU1OTUxFTiE7Ci0jZWxzZQotICAgIG1lbWNweShpbi0+X24uX25fbmFtZSwgZXh0LT5lLmVfbmFtZSwgU1lNTk1MRU4pOwotI2VuZGlmCi0gIH0KLQotICBpbi0+bl92YWx1ZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3ZhbHVlKTsgCi0gIGluLT5uX3NjbnVtID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfc2NudW0pOwotICBpZiAoc2l6ZW9mKGV4dC0+ZV90eXBlKSA9PSAyKXsKLSAgICBpbi0+bl90eXBlID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmVfdHlwZSk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgaW4tPm5fdHlwZSA9IGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICB9Ci0gIGluLT5uX3NjbGFzcyA9IGJmZF9oX2dldF84KGFiZmQsIGV4dC0+ZV9zY2xhc3MpOwotICBpbi0+bl9udW1hdXggPSBiZmRfaF9nZXRfOChhYmZkLCBleHQtPmVfbnVtYXV4KTsKLQotICAvKiBUaGUgc2VjdGlvbiBzeW1ib2xzIGZvciB0aGUgLmlkYXRhJCBzZWN0aW9ucyBoYXZlIGNsYXNzIDB4NjgKLSAgICAgKENfU0VDVElPTiksIHdoaWNoIE1TIGRvY3VtZW50YXRpb24gaW5kaWNhdGVzIGlzIGEgc2VjdGlvbgotICAgICBzeW1ib2wuICBVbmZvcnR1bmF0ZWx5LCB0aGUgdmFsdWUgZmllbGQgaW4gdGhlIHN5bWJvbCBpcyBzaW1wbHkgYQotICAgICBjb3B5IG9mIHRoZSAuaWRhdGEgc2VjdGlvbidzIGZsYWdzIHJhdGhlciB0aGFuIHNvbWV0aGluZyB1c2VmdWwuCi0gICAgIFdoZW4gdGhlc2Ugc3ltYm9scyBhcmUgZW5jb3VudGVyZWQsIGNoYW5nZSB0aGUgdmFsdWUgdG8gMCBzbyB0aGF0Ci0gICAgIHRoZXkgd2lsbCBiZSBoYW5kbGVkIHNvbWV3aGF0IGNvcnJlY3RseSBpbiB0aGUgYmZkIGNvZGUuICAqLwotICBpZiAoaW4tPm5fc2NsYXNzID09IENfU0VDVElPTikKLSAgICB7Ci0gICAgICBpbi0+bl92YWx1ZSA9IDB4MDsKLQotI2lmIDAKLSAgICAgIC8qIEZJWE1FOiBUaGlzIGlzIGNsZWFybHkgd3JvbmcuICBUaGUgcHJvYmxlbSBzZWVtcyB0byBiZSB0aGF0Ci0gICAgICAgICB1bmRlZmluZWQgQ19TRUNUSU9OIHN5bWJvbHMgYXBwZWFyIGluIHRoZSBmaXJzdCBvYmplY3Qgb2YgYQotICAgICAgICAgTVMgZ2VuZXJhdGVkIC5saWIgZmlsZSwgYW5kIHRoZSBzeW1ib2xzIGFyZSBub3QgZGVmaW5lZAotICAgICAgICAgYW55d2hlcmUuICAqLwotICAgICAgaW4tPm5fc2NudW0gPSAxOwotCi0gICAgICAvKiBJIGhhdmUgdHJpZWQgc2V0dGluZyB0aGUgY2xhc3MgdG8gMyBhbmQgdXNpbmcgdGhlIGZvbGxvd2luZwotCSB0byBzZXQgdGhlIHNlY3Rpb24gbnVtYmVyLiAgVGhpcyB3aWxsIHB1dCB0aGUgYWRkcmVzcyBvZiB0aGUKLQkgcG9pbnRlciB0byB0aGUgc3RyaW5nIGtlcm5lbDMyLmRsbCBhdCBhZGRyZXNzZXMgMCBhbmQgMHgxMAotCSBvZmYgc3RhcnQgb2YgaWRhdGEgc2VjdGlvbiB3aGljaCBpcyBub3QgY29ycmVjdCAqLwotICAgICAgLyogICAgaWYgKHN0cmNtcCAoaW4tPl9uLl9uX25hbWUsICIuaWRhdGEkNCIpID09IDApICovCi0gICAgICAvKiAgICAgIGluLT5uX3NjbnVtID0gMzsgKi8KLSAgICAgIC8qICAgIGVsc2UgKi8KLSAgICAgIC8qICAgICAgaW4tPm5fc2NudW0gPSAyOyAqLwotI2Vsc2UKLSAgICAgIC8qIENyZWF0ZSBzeW50aGV0aWMgZW1wdHkgc2VjdGlvbnMgYXMgbmVlZGVkLiAgREogKi8KLSAgICAgIGlmIChpbi0+bl9zY251bSA9PSAwKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0JICBmb3IgKHNlYz1hYmZkLT5zZWN0aW9uczsgc2VjOyBzZWM9c2VjLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCBpbi0+bl9uYW1lKSA9PSAwKQotCQl7Ci0JCSAgaW4tPm5fc2NudW0gPSBzZWMtPnRhcmdldF9pbmRleDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgaWYgKGluLT5uX3NjbnVtID09IDApCi0JewotCSAgaW50IHVudXNlZF9zZWN0aW9uX251bWJlciA9IDA7Ci0JICBhc2VjdGlvbiAqc2VjOwotCSAgY2hhciAqbmFtZTsKLQkgIGZvciAoc2VjPWFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYz1zZWMtPm5leHQpCi0JICAgIGlmICh1bnVzZWRfc2VjdGlvbl9udW1iZXIgPD0gc2VjLT50YXJnZXRfaW5kZXgpCi0JICAgICAgdW51c2VkX3NlY3Rpb25fbnVtYmVyID0gc2VjLT50YXJnZXRfaW5kZXgrMTsKLQotCSAgbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChpbi0+bl9uYW1lKSArIDEwKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybjsKLQkgIHN0cmNweSAobmFtZSwgaW4tPm5fbmFtZSk7Ci0JICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0KLQkgIHNlYy0+dm1hID0gMDsKLQkgIHNlYy0+bG1hID0gMDsKLQkgIHNlYy0+X2Nvb2tlZF9zaXplID0gMDsKLQkgIHNlYy0+X3Jhd19zaXplID0gMDsKLQkgIHNlYy0+ZmlsZXBvcyA9IDA7Ci0JICBzZWMtPnJlbF9maWxlcG9zID0gMDsKLQkgIHNlYy0+cmVsb2NfY291bnQgPSAwOwotCSAgc2VjLT5saW5lX2ZpbGVwb3MgPSAwOwotCSAgc2VjLT5saW5lbm9fY291bnQgPSAwOwotCSAgc2VjLT51c2VyZGF0YSA9IE5VTEw7Ci0JICBzZWMtPm5leHQgPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgIHNlYy0+ZmxhZ3MgPSAwOwotCSAgc2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCSAgc2VjLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfREFUQSB8IFNFQ19MT0FEOwotCi0JICBzZWMtPnRhcmdldF9pbmRleCA9IHVudXNlZF9zZWN0aW9uX251bWJlcjsKLQotCSAgaW4tPm5fc2NudW0gPSB1bnVzZWRfc2VjdGlvbl9udW1iZXI7Ci0JfQotICAgICAgaW4tPm5fc2NsYXNzID0gQ19TVEFUOwotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgY29mZl9zd2FwX3N5bV9pbl9ob29rCi0gIGNvZmZfc3dhcF9zeW1faW5faG9vayhhYmZkLCBleHQxLCBpbjEpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCBpbnAsIGV4dHApCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWlucDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmluID0gKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKilpbnA7Ci0gIFNZTUVOVCAqZXh0ID0oU1lNRU5UICopZXh0cDsKLSAgaWYoaW4tPl9uLl9uX25hbWVbMF0gPT0gMCkgewotICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT5lLmUuZV96ZXJvZXMpOwotICAgIGJmZF9oX3B1dF8zMihhYmZkLCBpbi0+X24uX25fbi5fbl9vZmZzZXQsIChiZmRfYnl0ZSAqKSAgZXh0LT5lLmUuZV9vZmZzZXQpOwotICB9Ci0gIGVsc2UgewotI2lmIFNZTU5NTEVOICE9IEVfU1lNTk1MRU4KLSAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgU1lNTk1MRU4hOwotI2Vsc2UKLSAgICBtZW1jcHkoZXh0LT5lLmVfbmFtZSwgaW4tPl9uLl9uX25hbWUsIFNZTU5NTEVOKTsKLSNlbmRpZgotICB9Ci0KLSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbi0+bl92YWx1ZSAsIChiZmRfYnl0ZSAqKSBleHQtPmVfdmFsdWUpOwotICBiZmRfaF9wdXRfMTYoYWJmZCwgIGluLT5uX3NjbnVtICwgKGJmZF9ieXRlICopIGV4dC0+ZV9zY251bSk7Ci0gIGlmIChzaXplb2YoZXh0LT5lX3R5cGUpID09IDIpCi0gICAgewotICAgICAgYmZkX2hfcHV0XzE2KGFiZmQsICBpbi0+bl90eXBlICwgKGJmZF9ieXRlICopIGV4dC0+ZV90eXBlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfaF9wdXRfMzIoYWJmZCwgIGluLT5uX3R5cGUgLCAoYmZkX2J5dGUgKikgZXh0LT5lX3R5cGUpOwotICAgIH0KLSAgYmZkX2hfcHV0XzgoYWJmZCwgIGluLT5uX3NjbGFzcyAsIGV4dC0+ZV9zY2xhc3MpOwotICBiZmRfaF9wdXRfOChhYmZkLCAgaW4tPm5fbnVtYXV4ICwgZXh0LT5lX251bWF1eCk7Ci0KLSAgcmV0dXJuIFNZTUVTWjsKLX0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hdXhfaW4gKGFiZmQsIGV4dDEsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGluMSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiAJICAgICAgZXh0MTsKLSAgICAgaW50ICAgICAgICAgICAgIHR5cGU7Ci0gICAgIGludCAgICAgICAgICAgICBjbGFzczsKLSAgICAgaW50CSAgICAgIGluZHg7Ci0gICAgIGludAkgICAgICBudW1hdXg7Ci0gICAgIFBUUiAJICAgICAgaW4xOwotewotICBBVVhFTlQgICAgKmV4dCA9IChBVVhFTlQgKilleHQxOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmluID0gKHVuaW9uIGludGVybmFsX2F1eGVudCAqKWluMTsKLQotICBzd2l0Y2ggKGNsYXNzKSB7Ci0gIGNhc2UgQ19GSUxFOgotICAgIGlmIChleHQtPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGluLT54X2ZpbGUueF9uLnhfemVyb2VzID0gMDsKLSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0ID0gCi0JYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0jaWYgRklMTk1MRU4gIT0gRV9GSUxOTUxFTgotICAgICAgLT4gRXJyb3IsIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIEZJTE5NTEVOITsKLSNlbHNlCi0gICAgICBtZW1jcHkgKGluLT54X2ZpbGUueF9mbmFtZSwgZXh0LT54X2ZpbGUueF9mbmFtZSwgRklMTk1MRU4pOwotI2VuZGlmCi0gICAgfQotICAgIHJldHVybjsKLQotCi0gIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBpbi0+eF9zY24ueF9zY25sZW4gPSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc2NuLnhfbnJlbG9jID0gR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KTsKLSAgICAgIGluLT54X3Njbi54X25saW5ubyA9IEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCk7Ci0gICAgICBpbi0+eF9zY24ueF9jaGVja3N1bSA9IGJmZF9oX2dldF8zMiAoYWJmZCwKLQkJCQkJICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jaGVja3N1bSk7Ci0gICAgICBpbi0+eF9zY24ueF9hc3NvY2lhdGVkID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfYXNzb2NpYXRlZCk7Ci0gICAgICBpbi0+eF9zY24ueF9jb21kYXQgPSBiZmRfaF9nZXRfOCAoYWJmZCwKLQkJCQkJKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jb21kYXQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotCi0gIGluLT54X3N5bS54X3RhZ25keC5sID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgaW4tPnhfc3ltLnhfdHZuZHggPSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0gR0VUX0ZDTl9MTk5PUFRSIChhYmZkLCBleHQpOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBHRVRfRkNOX0VORE5EWCAoYWJmZCwgZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgRElNTlVNICE9IEVfRElNTlVNCi0gI2Vycm9yIHdlIG5lZWQgdG8gY29wZSB3aXRoIHRydW5jYXRpbmcgb3IgZXh0ZW5kaW5nIERJTU5VTQotI2VuZGlmCi0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzBdKTsKLSAgICAgIGluLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzFdID0KLQliZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0gPQotCWJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSk7Ci0gICAgICBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSA9Ci0JYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWzNdKTsKLSAgICB9Ci0KLSAgaWYgKElTRkNOKHR5cGUpKSB7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgfQotICBlbHNlIHsKLSAgICBpbi0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8gPSBHRVRfTE5TWl9MTk5PKGFiZmQsIGV4dCk7Ci0gICAgaW4tPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplID0gR0VUX0xOU1pfU0laRShhYmZkLCBleHQpOwotICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWNvZmZfc3dhcF9hdXhfb3V0IChhYmZkLCBpbnAsIHR5cGUsIGNsYXNzLCBpbmR4LCBudW1hdXgsIGV4dHApCi0gICAgIGJmZCAgICphYmZkOwotICAgICBQVFIgCWlucDsKLSAgICAgaW50ICAgdHlwZTsKLSAgICAgaW50ICAgY2xhc3M7Ci0gICAgIGludCAgIGluZHg7Ci0gICAgIGludCAgIG51bWF1eDsKLSAgICAgUFRSCWV4dHA7Ci17Ci0gIHVuaW9uIGludGVybmFsX2F1eGVudCAqaW4gPSAodW5pb24gaW50ZXJuYWxfYXV4ZW50ICopaW5wOwotICBBVVhFTlQgKmV4dCA9IChBVVhFTlQgKilleHRwOwotCi0gIG1lbXNldCgoUFRSKWV4dCwgMCwgQVVYRVNaKTsKLSAgc3dpdGNoIChjbGFzcykgewotICBjYXNlIENfRklMRToKLSAgICBpZiAoaW4tPnhfZmlsZS54X2ZuYW1lWzBdID09IDApIHsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLCAwLCAoYmZkX2J5dGUgKikgZXh0LT54X2ZpbGUueF9uLnhfemVyb2VzKTsKLSAgICAgIGJmZF9oX3B1dF8zMihhYmZkLAotCSAgICAgIGluLT54X2ZpbGUueF9uLnhfb2Zmc2V0LAotCSAgICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfZmlsZS54X24ueF9vZmZzZXQpOwotICAgIH0KLSAgICBlbHNlIHsKLSNpZiBGSUxOTUxFTiAhPSBFX0ZJTE5NTEVOCi0gICAgICAtPiBFcnJvciwgd2UgbmVlZCB0byBjb3BlIHdpdGggdHJ1bmNhdGluZyBvciBleHRlbmRpbmcgRklMTk1MRU4hOwotI2Vsc2UKLSAgICAgIG1lbWNweSAoZXh0LT54X2ZpbGUueF9mbmFtZSwgaW4tPnhfZmlsZS54X2ZuYW1lLCBGSUxOTUxFTik7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuIEFVWEVTWjsKLQotCi0gIGNhc2UgQ19TVEFUOgotI2lmZGVmIENfTEVBRlNUQVQKLSAgY2FzZSBDX0xFQUZTVEFUOgotI2VuZGlmCi0gIGNhc2UgQ19ISURERU46Ci0gICAgaWYgKHR5cGUgPT0gVF9OVUxMKSB7Ci0gICAgICBQVVRfU0NOX1NDTkxFTihhYmZkLCBpbi0+eF9zY24ueF9zY25sZW4sIGV4dCk7Ci0gICAgICBQVVRfU0NOX05SRUxPQyhhYmZkLCBpbi0+eF9zY24ueF9ucmVsb2MsIGV4dCk7Ci0gICAgICBQVVRfU0NOX05MSU5OTyhhYmZkLCBpbi0+eF9zY24ueF9ubGlubm8sIGV4dCk7Ci0gICAgICBiZmRfaF9wdXRfMzIgKGFiZmQsIGluLT54X3Njbi54X2NoZWNrc3VtLAotCQkgICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jaGVja3N1bSk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIGluLT54X3Njbi54X2Fzc29jaWF0ZWQsCi0JCSAgICAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X2Fzc29jaWF0ZWQpOwotICAgICAgYmZkX2hfcHV0XzggKGFiZmQsIGluLT54X3Njbi54X2NvbWRhdCwKLQkJICAgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9jb21kYXQpOwotICAgICAgcmV0dXJuIEFVWEVTWjsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPnhfc3ltLnhfdGFnbmR4LmwsIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfdGFnbmR4KTsKLSNpZm5kZWYgTk9fVFZORFgKLSAgYmZkX2hfcHV0XzE2KGFiZmQsIGluLT54X3N5bS54X3R2bmR4ICwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF90dm5keCk7Ci0jZW5kaWYKLQotICBpZiAoY2xhc3MgPT0gQ19CTE9DSyB8fCBjbGFzcyA9PSBDX0ZDTiB8fCBJU0ZDTiAodHlwZSkgfHwgSVNUQUcgKGNsYXNzKSkKLSAgICB7Ci0gICAgICBQVVRfRkNOX0xOTk9QVFIoYWJmZCwgIGluLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIsIGV4dCk7Ci0gICAgICBQVVRfRkNOX0VORE5EWChhYmZkLCAgaW4tPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwsIGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmIERJTU5VTSAhPSBFX0RJTU5VTQotICNlcnJvciB3ZSBuZWVkIHRvIGNvcGUgd2l0aCB0cnVuY2F0aW5nIG9yIGV4dGVuZGluZyBESU1OVU0KLSNlbmRpZgotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblswXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMF0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsxXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMV0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblsyXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bMl0pOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCBpbi0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lblszXSwKLQkJICAgIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bM10pOwotICAgIH0KLQotICBpZiAoSVNGQ04gKHR5cGUpKQotICAgIGJmZF9oX3B1dF8zMiAoYWJmZCwgaW4tPnhfc3ltLnhfbWlzYy54X2ZzaXplLAotCSAgICAgKGJmZF9ieXRlICopICBleHQtPnhfc3ltLnhfbWlzYy54X2ZzaXplKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIFBVVF9MTlNaX0xOTk8gKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubywgZXh0KTsKLSAgICAgIFBVVF9MTlNaX1NJWkUgKGFiZmQsIGluLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSwgZXh0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIEFVWEVTWjsKLX0KLQotCi1zdGF0aWMgdm9pZAotY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgZXh0MSwgaW4xKQotICAgICBiZmQgICAgICAgICAgICAqYWJmZDsKLSAgICAgUFRSIGV4dDE7Ci0gICAgIFBUUiBpbjE7Ci17Ci0gIExJTkVOTyAqZXh0ID0gKExJTkVOTyAqKWV4dDE7Ci0gIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gICAgICAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWluMTsKLQotICBpbi0+bF9hZGRyLmxfc3ltbmR4ID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0gIGluLT5sX2xubm8gPSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY29mZl9zd2FwX2xpbmVub19vdXQgKGFiZmQsIGlucCwgb3V0cCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW5wOwotICAgICBQVFIJb3V0cDsKLXsKLSAgc3RydWN0IGludGVybmFsX2xpbmVubyAqaW4gPSAoc3RydWN0IGludGVybmFsX2xpbmVubyAqKWlucDsKLSAgc3RydWN0IGV4dGVybmFsX2xpbmVubyAqZXh0ID0gKHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKilvdXRwOwotICBiZmRfaF9wdXRfMzIoYWJmZCwgaW4tPmxfYWRkci5sX3N5bW5keCwgKGJmZF9ieXRlICopCi0JICBleHQtPmxfYWRkci5sX3N5bW5keCk7Ci0KLSAgUFVUX0xJTkVOT19MTk5PIChhYmZkLCBpbi0+bF9sbm5vLCBleHQpOwotICByZXR1cm4gTElORVNaOwotfQotCi0KLQotc3RhdGljIHZvaWQKLWNvZmZfc3dhcF9hb3V0aGRyX2luIChhYmZkLCBhb3V0aGRyX2V4dDEsIGFvdXRoZHJfaW50MSkKLSAgICAgYmZkICAgICAgICAgICAgKmFiZmQ7Ci0gICAgIFBUUiBhb3V0aGRyX2V4dDE7Ci0gICAgIFBUUiBhb3V0aGRyX2ludDE7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICphOwotICBQRUFPVVRIRFIgKnNyYyA9IChQRUFPVVRIRFIgKikoYW91dGhkcl9leHQxKTsKLSAgQU9VVEhEUiAgICAgICAgKmFvdXRoZHJfZXh0ID0gKEFPVVRIRFIgKikgYW91dGhkcl9leHQxOwotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX2FvdXRoZHIgKilhb3V0aGRyX2ludDE7Ci0KLSAgYW91dGhkcl9pbnQtPm1hZ2ljID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+bWFnaWMpOwotICBhb3V0aGRyX2ludC0+dnN0YW1wID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+dnN0YW1wKTsKLSAgYW91dGhkcl9pbnQtPnRzaXplID0KLSAgICBHRVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT50c2l6ZSk7Ci0gIGFvdXRoZHJfaW50LT5kc2l6ZSA9Ci0gICAgR0VUX0FPVVRIRFJfRFNJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX2V4dC0+ZHNpemUpOwotICBhb3V0aGRyX2ludC0+YnNpemUgPQotICAgIEdFVF9BT1VUSERSX0JTSVpFIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPmJzaXplKTsKLSAgYW91dGhkcl9pbnQtPmVudHJ5ID0KLSAgICBHRVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5lbnRyeSk7Ci0gIGFvdXRoZHJfaW50LT50ZXh0X3N0YXJ0ID0KLSAgICBHRVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCAoYmZkX2J5dGUgKikgYW91dGhkcl9leHQtPnRleHRfc3RhcnQpOwotICBhb3V0aGRyX2ludC0+ZGF0YV9zdGFydCA9Ci0gICAgR0VUX0FPVVRIRFJfREFUQV9TVEFSVCAoYWJmZCwgKGJmZF9ieXRlICopIGFvdXRoZHJfZXh0LT5kYXRhX3N0YXJ0KTsKLQotICBhID0gJmFvdXRoZHJfaW50LT5wZTsKLSAgYS0+SW1hZ2VCYXNlID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5JbWFnZUJhc2UpOwotICBhLT5TZWN0aW9uQWxpZ25tZW50ID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TZWN0aW9uQWxpZ25tZW50KTsKLSAgYS0+RmlsZUFsaWdubWVudCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+RmlsZUFsaWdubWVudCk7Ci0gIGEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiA9IAotICAgIGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gCi0gICAgYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBhLT5NYWpvckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBhLT5NaW5vckltYWdlVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWlub3JJbWFnZVZlcnNpb24pOwotICBhLT5NYWpvclN1YnN5c3RlbVZlcnNpb24gPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk1ham9yU3Vic3lzdGVtVmVyc2lvbik7Ci0gIGEtPk1pbm9yU3Vic3lzdGVtVmVyc2lvbiA9IGJmZF9oX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYS0+UmVzZXJ2ZWQxID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5SZXNlcnZlZDEpOwotICBhLT5TaXplT2ZJbWFnZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mSW1hZ2UpOwotICBhLT5TaXplT2ZIZWFkZXJzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TaXplT2ZIZWFkZXJzKTsKLSAgYS0+Q2hlY2tTdW0gPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPkNoZWNrU3VtKTsKLSAgYS0+U3Vic3lzdGVtID0gYmZkX2hfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5TdWJzeXN0ZW0pOwotICBhLT5EbGxDaGFyYWN0ZXJpc3RpY3MgPSBiZmRfaF9nZXRfMTYgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGEtPlNpemVPZlN0YWNrUmVzZXJ2ZSA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mU3RhY2tDb21taXQgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZlN0YWNrQ29tbWl0KTsKLSAgYS0+U2l6ZU9mSGVhcFJlc2VydmUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYS0+U2l6ZU9mSGVhcENvbW1pdCA9IGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+U2l6ZU9mSGVhcENvbW1pdCk7Ci0gIGEtPkxvYWRlckZsYWdzID0gYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5Mb2FkZXJGbGFncyk7Ci0gIGEtPk51bWJlck9mUnZhQW5kU2l6ZXMgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzcmMtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotCi0gIHsKLSAgICBpbnQgaWR4OwotICAgIGZvciAoaWR4PTA7IGlkeCA8IDE2OyBpZHgrKykKLSAgICAgIHsKLQlhLT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPQotCSAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgc3JjLT5EYXRhRGlyZWN0b3J5W2lkeF1bMF0pOwotCWEtPkRhdGFEaXJlY3RvcnlbaWR4XS5TaXplID0KLQkgIGJmZF9oX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIHNyYy0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIGlmIChhb3V0aGRyX2ludC0+ZW50cnkpCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPmVudHJ5ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT5lbnRyeSAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKGFvdXRoZHJfaW50LT50c2l6ZSkgCi0gICAgewotICAgICAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgKz0gYS0+SW1hZ2VCYXNlOwotICAgICAgYW91dGhkcl9pbnQtPnRleHRfc3RhcnQgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0gIGlmIChhb3V0aGRyX2ludC0+ZHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ICs9IGEtPkltYWdlQmFzZTsKLSAgICAgIGFvdXRoZHJfaW50LT5kYXRhX3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotCi0jaWZkZWYgUE9XRVJQQ19MRV9QRQotICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG5vcm1hbGx5IHNldCB1cCBieSBwcGNfcmVsb2NhdGVfc2VjdGlvbi4KLSAgICAgSW4gdGhlIGNhc2Ugb2YgcmVhZGluZyBhIGZpbGUgaW4sIHdlIGNhbiBwaWNrIHRoZW0gdXAgZnJvbQotICAgICB0aGUgRGF0YURpcmVjdG9yeS4KLSAgKi8KLSAgZmlyc3RfdGh1bmtfYWRkcmVzcyA9IGEtPkRhdGFEaXJlY3RvcnlbMTJdLlZpcnR1YWxBZGRyZXNzIDsKLSAgdGh1bmtfc2l6ZSA9IGEtPkRhdGFEaXJlY3RvcnlbMTJdLlNpemU7Ci0gIGltcG9ydF90YWJsZV9zaXplID0gYS0+RGF0YURpcmVjdG9yeVsxXS5TaXplOwotI2VuZGlmCi19Ci0KLQotc3RhdGljIHZvaWQgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGFvdXQsIGlkeCwgbmFtZSwgYmFzZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqYW91dDsKLSAgICAgaW50IGlkeDsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBiYXNlOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotCi0gIC8qIGFkZCBpbXBvcnQgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGlmIGl0IGV4aXN0cyAqLwotICBpZiAoKHNlYyAhPSBOVUxMKQotICAgICAgJiYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpICE9IE5VTEwpCi0gICAgICAmJiAocGVpX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBhb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF0uVmlydHVhbEFkZHJlc3MgPSAoc2VjLT52bWEgLSBiYXNlKSAmIDB4ZmZmZmZmZmY7Ci0gICAgICBhb3V0LT5EYXRhRGlyZWN0b3J5W2lkeF0uU2l6ZSA9IHBlaV9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPnZpcnRfc2l6ZTsKLSAgICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0RBVEE7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfYW91dGhkcl9vdXQgKGFiZmQsIGluLCBvdXQpCi0gICAgIGJmZCAgICAgICAqYWJmZDsKLSAgICAgUFRSCWluOwotICAgICBQVFIJb3V0OwotewotICBzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqYW91dGhkcl9pbiA9IChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWluOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGVfZGF0YSAoYWJmZCktPnBlX29wdGhkcjsKLSAgUEVBT1VUSERSICphb3V0aGRyX291dCA9IChQRUFPVVRIRFIgKilvdXQ7Ci0KLSAgYmZkX3ZtYSBzYSA9IGV4dHJhLT5TZWN0aW9uQWxpZ25tZW50OwotICBiZmRfdm1hIGZhID0gZXh0cmEtPkZpbGVBbGlnbm1lbnQ7Ci0gIGJmZF92bWEgaWIgPSBleHRyYS0+SW1hZ2VCYXNlIDsKLQotICBpZiAoYW91dGhkcl9pbi0+dHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPnRleHRfc3RhcnQgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbi0+ZHNpemUpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQgLT0gaWI7Ci0gICAgICBhb3V0aGRyX2luLT5kYXRhX3N0YXJ0ICY9IDB4ZmZmZmZmZmY7Ci0gICAgfQotICBpZiAoYW91dGhkcl9pbi0+ZW50cnkpIAotICAgIHsKLSAgICAgIGFvdXRoZHJfaW4tPmVudHJ5IC09IGliOwotICAgICAgYW91dGhkcl9pbi0+ZW50cnkgJj0gMHhmZmZmZmZmZjsKLSAgICB9Ci0KLSNkZWZpbmUgRkEoeCkgICgoKHgpICsgZmEgLTEgKSAmICgtIGZhKSkKLSNkZWZpbmUgU0EoeCkgICgoKHgpICsgc2EgLTEgKSAmICgtIHNhKSkKLQotICAvKiBXZSBsaWtlIHRvIGhhdmUgdGhlIHNpemVzIGFsaWduZWQgKi8KLQotICBhb3V0aGRyX2luLT5ic2l6ZSA9IEZBIChhb3V0aGRyX2luLT5ic2l6ZSk7Ci0KLQotICBleHRyYS0+TnVtYmVyT2ZSdmFBbmRTaXplcyA9IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOwotCi0gIC8qIGZpcnN0IG51bGwgb3V0IGFsbCBkYXRhIGRpcmVjdG9yeSBlbnRyaWVzIC4uICovCi0gIG1lbXNldCAoZXh0cmEtPkRhdGFEaXJlY3RvcnksIHNpemVvZiAoZXh0cmEtPkRhdGFEaXJlY3RvcnkpLCAwKTsKLQotICBhZGRfZGF0YV9lbnRyeSAoYWJmZCwgZXh0cmEsIDAsICIuZWRhdGEiLCBpYik7Ci0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMSwgIi5pZGF0YSIsIGliKTsKLSAgYWRkX2RhdGFfZW50cnkgKGFiZmQsIGV4dHJhLCAyLCAiLnJzcmMiICxpYik7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIC8qIEZJWE1FOiBkbyBvdGhlciBQRSBwbGF0Zm9ybXMgdXNlIHRoaXM/ICovCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgMywgIi5wZGF0YSIgLGliKTsKLSNlbmRpZgotCi0gIGFkZF9kYXRhX2VudHJ5IChhYmZkLCBleHRyYSwgNSwgIi5yZWxvYyIsIGliKTsKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgLyogT24gdGhlIFBQQyBOVCBzeXN0ZW0sIHRoaXMgZmllbGQgaXMgc2V0IHVwIGFzIGZvbGxvd3MuIEl0IGlzCi0gICAgIG5vdCBhbiAib2ZmaWNpYWxseSIgcmVzZXJ2ZWQgZmllbGQsIHNvIGl0IGN1cnJlbnRseSBoYXMgbm8gdGl0bGUuCi0gICAgIGZpcnN0X3RodW5rX2FkZHJlc3MgaXMgaWRhdGEkNSwgYW5kIHRoZSB0aHVua19zaXplIGlzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBpZGF0YSQ1IGNodW5rIG9mIHRoZSBpZGF0YSBzZWN0aW9uLgotICAqLwotICBleHRyYS0+RGF0YURpcmVjdG9yeVsxMl0uVmlydHVhbEFkZHJlc3MgPSBmaXJzdF90aHVua19hZGRyZXNzOwotICBleHRyYS0+RGF0YURpcmVjdG9yeVsxMl0uU2l6ZSA9IHRodW5rX3NpemU7Ci0KLSAgLyogT24gdGhlIFBQQyBOVCBzeXN0ZW0sIHRoZSBzaXplIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkgaXMgbm90IHRoZQotICAgICBzaXplIG9mIHRoZSBlbnRpcmUgc2VjdGlvbi4gSXQncyBhY3R1YWxseSBvZmZzZXQgdG8gdGhlIGVuZCBvZiAKLSAgICAgdGhlIGlkYXRhJDMgY29tcG9uZW50IG9mIHRoZSBpZGF0YSBzZWN0aW9uLiBUaGlzIGlzIHRoZSBzaXplIG9mCi0gICAgIHRoZSBlbnRpcmUgaW1wb3J0IHRhYmxlLiAoYWxzbyBrbm93biBhcyB0aGUgc3RhcnQgb2YgaWRhdGEkNCkKLSAgKi8KLSAgZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZSA9IGltcG9ydF90YWJsZV9zaXplOwotI2VuZGlmCi0KLSAgewotICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgYmZkX3ZtYSBkc2l6ZT0gMDsKLSAgICBiZmRfdm1hIGlzaXplID0gU0EoYWJmZC0+c2VjdGlvbnMtPmZpbGVwb3MpOwotICAgIGJmZF92bWEgdHNpemU9IDA7Ci0KLSAgICBmb3IgKHNlYyA9IGFiZmQtPnNlY3Rpb25zOyBzZWM7IHNlYyA9IHNlYy0+bmV4dCkKLSAgICAgIHsKLQlpbnQgcm91bmRlZCA9IEZBKHNlYy0+X3Jhd19zaXplKTsKLQotCWlmIChzZWMtPmZsYWdzICYgU0VDX0RBVEEpIAotCSAgZHNpemUgKz0gcm91bmRlZDsKLQlpZiAoc2VjLT5mbGFncyAmIFNFQ19DT0RFKQotCSAgdHNpemUgKz0gcm91bmRlZDsKLQlpc2l6ZSArPSBTQShyb3VuZGVkKTsKLSAgICAgIH0KLQotICAgIGFvdXRoZHJfaW4tPmRzaXplID0gZHNpemU7Ci0gICAgYW91dGhkcl9pbi0+dHNpemUgPSB0c2l6ZTsKLSAgICBleHRyYS0+U2l6ZU9mSW1hZ2UgPSBpc2l6ZTsKLSAgfQotCi0gIGV4dHJhLT5TaXplT2ZIZWFkZXJzID0gYWJmZC0+c2VjdGlvbnMtPmZpbGVwb3M7Ci0gIGJmZF9oX3B1dF8xNihhYmZkLCBhb3V0aGRyX2luLT5tYWdpYywgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC5tYWdpYyk7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIC8qIHRoaXMgbGl0dGxlIHBpZWNlIG9mIG1hZ2ljIHNldHMgdGhlICJsaW5rZXIgdmVyc2lvbiIgZmllbGQgdG8gMi42MCAqLwotICBiZmRfaF9wdXRfMTYoYWJmZCwgMiAgKyA2MCAqIDI1NiwgKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5zdGFuZGFyZC52c3RhbXApOwotI2Vsc2UKLSAgLyogdGhpcyBsaXR0bGUgcGllY2Ugb2YgbWFnaWMgc2V0cyB0aGUgImxpbmtlciB2ZXJzaW9uIiBmaWVsZCB0byAyLjU1ICovCi0gIGJmZF9oX3B1dF8xNihhYmZkLCAyICArIDU1ICogMjU2LCAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnZzdGFtcCk7Ci0jZW5kaWYKLQotICBQVVRfQU9VVEhEUl9UU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+dHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQudHNpemUpOwotICBQVVRfQU9VVEhEUl9EU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+ZHNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZHNpemUpOwotICBQVVRfQU9VVEhEUl9CU0laRSAoYWJmZCwgYW91dGhkcl9pbi0+YnNpemUsIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuYnNpemUpOwotICBQVVRfQU9VVEhEUl9FTlRSWSAoYWJmZCwgYW91dGhkcl9pbi0+ZW50cnksIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZW50cnkpOwotICBQVVRfQU9VVEhEUl9URVhUX1NUQVJUIChhYmZkLCBhb3V0aGRyX2luLT50ZXh0X3N0YXJ0LAotCQkJICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPnN0YW5kYXJkLnRleHRfc3RhcnQpOwotCi0gIFBVVF9BT1VUSERSX0RBVEFfU1RBUlQgKGFiZmQsIGFvdXRoZHJfaW4tPmRhdGFfc3RhcnQsCi0JCQkgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+c3RhbmRhcmQuZGF0YV9zdGFydCk7Ci0KLQotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5JbWFnZUJhc2UsIAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkltYWdlQmFzZSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNlY3Rpb25BbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPkZpbGVBbGlnbm1lbnQsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RmlsZUFsaWdubWVudCk7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+TWFqb3JJbWFnZVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWFqb3JJbWFnZVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vckltYWdlVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NaW5vckltYWdlVmVyc2lvbik7Ci0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgZXh0cmEtPk1ham9yU3Vic3lzdGVtVmVyc2lvbiwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5NaW5vclN1YnN5c3RlbVZlcnNpb24sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TWlub3JTdWJzeXN0ZW1WZXJzaW9uKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+UmVzZXJ2ZWQxLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlJlc2VydmVkMSk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkltYWdlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkltYWdlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhZGVycywKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFkZXJzKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+Q2hlY2tTdW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+Q2hlY2tTdW0pOwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIGV4dHJhLT5TdWJzeXN0ZW0sCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+U3Vic3lzdGVtKTsKLSAgYmZkX2hfcHV0XzE2IChhYmZkLCBleHRyYS0+RGxsQ2hhcmFjdGVyaXN0aWNzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRsbENoYXJhY3RlcmlzdGljcyk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZlN0YWNrUmVzZXJ2ZSwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZTdGFja1Jlc2VydmUpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5TaXplT2ZTdGFja0NvbW1pdCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZTdGFja0NvbW1pdCk7Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwgZXh0cmEtPlNpemVPZkhlYXBSZXNlcnZlLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPlNpemVPZkhlYXBSZXNlcnZlKTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+U2l6ZU9mSGVhcENvbW1pdCwKLQkJKGJmZF9ieXRlICopIGFvdXRoZHJfb3V0LT5TaXplT2ZIZWFwQ29tbWl0KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+TG9hZGVyRmxhZ3MsCi0JCShiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+TG9hZGVyRmxhZ3MpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIGV4dHJhLT5OdW1iZXJPZlJ2YUFuZFNpemVzLAotCQkoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotICB7Ci0gICAgaW50IGlkeDsKLSAgICBmb3IgKGlkeD0wOyBpZHggPCAxNjsgaWR4KyspCi0gICAgICB7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlZpcnR1YWxBZGRyZXNzLAotCQkgICAgICAoYmZkX2J5dGUgKikgYW91dGhkcl9vdXQtPkRhdGFEaXJlY3RvcnlbaWR4XVswXSk7Ci0JYmZkX2hfcHV0XzMyIChhYmZkLCBleHRyYS0+RGF0YURpcmVjdG9yeVtpZHhdLlNpemUsCi0JCSAgICAgIChiZmRfYnl0ZSAqKSBhb3V0aGRyX291dC0+RGF0YURpcmVjdG9yeVtpZHhdWzFdKTsKLSAgICAgIH0KLSAgfQotCi0gIHJldHVybiBBT1VUU1o7Ci19Ci0KLXN0YXRpYyB2b2lkCi0gICAgY29mZl9zd2FwX3Njbmhkcl9pbiAoYWJmZCwgZXh0LCBpbikKLSAgICAgIGJmZCAgICAgICAgICAgICphYmZkOwotICBQVFIJICAgICBleHQ7Ci0gIFBUUgkgICAgIGluOwotewotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopIGV4dDsKLSAgc3RydWN0IGludGVybmFsX3NjbmhkciAqc2NuaGRyX2ludCA9IChzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyICopIGluOwotCi0gIG1lbWNweShzY25oZHJfaW50LT5zX25hbWUsIHNjbmhkcl9leHQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotICBzY25oZHJfaW50LT5zX3ZhZGRyID0KLSAgICBHRVRfU0NOSERSX1ZBRERSIChhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c192YWRkcik7Ci0gIHNjbmhkcl9pbnQtPnNfcGFkZHIgPQotICAgIEdFVF9TQ05IRFJfUEFERFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLSAgc2NuaGRyX2ludC0+c19zaXplID0KLSAgICBHRVRfU0NOSERSX1NJWkUgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotICBzY25oZHJfaW50LT5zX3NjbnB0ciA9Ci0gICAgR0VUX1NDTkhEUl9TQ05QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NjbnB0cik7Ci0gIHNjbmhkcl9pbnQtPnNfcmVscHRyID0KLSAgICBHRVRfU0NOSERSX1JFTFBUUiAoYWJmZCwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfcmVscHRyKTsKLSAgc2NuaGRyX2ludC0+c19sbm5vcHRyID0KLSAgICBHRVRfU0NOSERSX0xOTk9QVFIgKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2xubm9wdHIpOwotICBzY25oZHJfaW50LT5zX2ZsYWdzID0gYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLQotICBzY25oZHJfaW50LT5zX25yZWxvYyA9IGJmZF9oX2dldF8xNihhYmZkLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBzY25oZHJfaW50LT5zX25sbm5vID0gYmZkX2hfZ2V0XzE2KGFiZmQsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25sbm5vKTsKLQotICBpZiAoc2NuaGRyX2ludC0+c192YWRkciAhPSAwKSAKLSAgICB7Ci0gICAgICBzY25oZHJfaW50LT5zX3ZhZGRyICs9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotICAgICAgc2NuaGRyX2ludC0+c192YWRkciAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCBfQlNTKSA9PSAwKSAKLSAgICB7Ci0gICAgICBzY25oZHJfaW50LT5zX3NpemUgPSBzY25oZHJfaW50LT5zX3BhZGRyOwotICAgICAgc2NuaGRyX2ludC0+c19wYWRkciA9IDA7Ci0gICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1jb2ZmX3N3YXBfc2NuaGRyX291dCAoYWJmZCwgaW4sIG91dCkKLSAgICAgYmZkICAgICAgICphYmZkOwotICAgICBQVFIJaW47Ci0gICAgIFBUUglvdXQ7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnNjbmhkcl9pbnQgPSAoc3RydWN0IGludGVybmFsX3NjbmhkciAqKWluOwotICBTQ05IRFIgKnNjbmhkcl9leHQgPSAoU0NOSERSICopb3V0OwotICB1bnNpZ25lZCBpbnQgcmV0ID0gU0NOSFNaOwotICBiZmRfdm1hIHBzOwotICBiZmRfdm1hIHNzOwotCi0gIG1lbWNweShzY25oZHJfZXh0LT5zX25hbWUsIHNjbmhkcl9pbnQtPnNfbmFtZSwgc2l6ZW9mKHNjbmhkcl9pbnQtPnNfbmFtZSkpOwotCi0gIFBVVF9TQ05IRFJfVkFERFIgKGFiZmQsIAotCQkgICAgKChzY25oZHJfaW50LT5zX3ZhZGRyIAotCQkgICAgICAtIHBlX2RhdGEoYWJmZCktPnBlX29wdGhkci5JbWFnZUJhc2UpCi0JCSAgICAgJiAweGZmZmZmZmZmKSwKLQkJICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3ZhZGRyKTsKLQotICAvKiBOVCB3YW50cyB0aGUgc2l6ZSBkYXRhIHRvIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgTlRfRklMRV9BTElHTk1FTlQKLSAgICAgdmFsdWUgZXhjZXB0IGZvciB0aGUgQlNTIHNlY3Rpb24sIGl0cyBzX3NpemUgc2hvdWxkIGJlIDAgKi8KLQotCi0gIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgX0JTUykgPT0gMCkgCi0gICAgewotICAgICAgcHMgPSBzY25oZHJfaW50LT5zX3NpemU7Ci0gICAgICBzcyA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHMgPSBzY25oZHJfaW50LT5zX3BhZGRyOwotICAgICAgc3MgPSBzY25oZHJfaW50LT5zX3NpemU7Ci0gICAgfQotCi0gIFBVVF9TQ05IRFJfU0laRSAoYWJmZCwgc3MsCi0JCSAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3NpemUpOwotCi0KLSAgUFVUX1NDTkhEUl9QQUREUiAoYWJmZCwgcHMsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3BhZGRyKTsKLQotICBQVVRfU0NOSERSX1NDTlBUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19zY25wdHIsCi0JCSAgICAgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfc2NucHRyKTsKLSAgUFVUX1NDTkhEUl9SRUxQVFIgKGFiZmQsIHNjbmhkcl9pbnQtPnNfcmVscHRyLAotCQkgICAgIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX3JlbHB0cik7Ci0gIFBVVF9TQ05IRFJfTE5OT1BUUiAoYWJmZCwgc2NuaGRyX2ludC0+c19sbm5vcHRyLAotCQkgICAgICAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19sbm5vcHRyKTsKLQotICAvKiBFeHRyYSBmbGFncyBtdXN0IGJlIHNldCB3aGVuIGRlYWxpbmcgd2l0aCBOVC4gIEFsbCBzZWN0aW9ucyBzaG91bGQgYWxzbwotICAgICBoYXZlIHRoZSBJTUFHRV9TQ05fTUVNX1JFQUQgKDB4NDAwMDAwMDApIGZsYWcgc2V0LiAgSW4gYWRkaXRpb24sIHRoZQotICAgICAudGV4dCBzZWN0aW9uIG11c3QgaGF2ZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgKDB4MjAwMDAwMDApIGFuZCB0aGUgZGF0YQotICAgICBzZWN0aW9ucyAoLmlkYXRhLCAuZGF0YSwgLmJzcywgLkNSVCkgbXVzdCBoYXZlIElNQUdFX1NDTl9NRU1fV1JJVEUgc2V0Ci0gICAgICh0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHdoZW4gZGVhbGluZyB3aXRoIHRoZSAuaWRhdGEgc2VjdGlvbiBzaW5jZQotICAgICB0aGUgYWRkcmVzc2VzIGZvciByb3V0aW5lcyBmcm9tIC5kbGxzIG11c3QgYmUgb3ZlcndyaXR0ZW4pLiAgSWYgLnJlbG9jCi0gICAgIHNlY3Rpb24gZGF0YSBpcyBldmVyIGdlbmVyYXRlZCwgd2UgbXVzdCBhZGQgSU1BR0VfU0NOX01FTV9ESVNDQVJEQUJMRQotICAgICAoMHgwMjAwMDAwMCkuICBBbHNvLCB0aGUgcmVzb3VyY2UgZGF0YSBzaG91bGQgYWxzbyBiZSByZWFkIGFuZAotICAgICB3cml0YWJsZS4gICovCi0KLSAgLyogRklYTUU6IGFsaWdubWVudCBpcyBhbHNvIGVuY29kZWQgaW4gdGhpcyBmaWVsZCwgYXQgbGVhc3Qgb24gcHBjIChrcmspICovCi0gIC8qIEZJWE1FOiBldmVuIHdvcnNlLCBJIGRvbid0IHNlZSBob3cgdG8gZ2V0IHRoZSBvcmlnaW5hbCBhbGlnbm1lbnQgZmllbGQqLwotICAvKiAgICAgICAgYmFjay4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBGSVhNRTogQmFzaW5nIHRoaXMgb24gc2VjdGlvbiBuYW1lcyBpcyBib2d1cy4gIEFsc28sIHRoaXMgc2hvdWxkCi0gICAgIGJlIGluIHNlY190b19zdHlwX2ZsYWdzLiAgKi8KLQotICB7Ci0gICAgaW50IGZsYWdzID0gc2NuaGRyX2ludC0+c19mbGFnczsKLSAgICBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuZGF0YSIpICA9PSAwIHx8Ci0Jc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuQ1JUIikgICA9PSAwIHx8Ci0Jc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuYnNzIikgICA9PSAwKQotICAgICAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9SRUFEIHwgSU1BR0VfU0NOX01FTV9XUklURTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICAgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fRVhFQ1VURTsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZWxvYyIpID09IDApCi0gICAgICBmbGFncyA9IChTRUNfREFUQSB8IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUKLQkgICAgICAgfCBJTUFHRV9TQ05fTUVNX1NIQVJFRCk7Ci0gICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIuaWRhdGEiKSA9PSAwKQotICAgICAgZmxhZ3MgPSBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX1dSSVRFIHwgU0VDX0RBVEE7ICAgICAKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZGF0YSIpID09IDAKLQkgICAgIHx8IHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmVkYXRhIikgPT0gMCkKLSAgICAgIGZsYWdzID0gIElNQUdFX1NDTl9NRU1fUkVBRCB8IFNFQ19EQVRBOyAgICAgCi0gICAgZWxzZSBpZiAoc3RyY21wIChzY25oZHJfaW50LT5zX25hbWUsICIucGRhdGEiKSA9PSAwKQotICAgICAgZmxhZ3MgPSBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfCBJTUFHRV9TQ05fQUxJR05fNEJZVEVTIHwKLQkJCSAgSU1BR0VfU0NOX01FTV9SRUFEIDsKLSAgICAvKiBSZW1lbWJlciB0aGlzIGZpZWxkIGlzIGEgbWF4IG9mIDggY2hhcnMsIHNvIHRoZSBudWxsIGlzIF9ub3RfIHRoZXJlCi0gICAgICAgZm9yIGFuIDggY2hhcmFjdGVyIG5hbWUgbGlrZSAiLnJlbGRhdGEiLiAoeWVwLiBTdHVwaWQgYnVnKSAqLwotICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5yZWxkYXRhIiwgOCkgPT0gMCkKLSAgICAgIGZsYWdzID0gIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSB8IElNQUdFX1NDTl9BTElHTl84QllURVMgfAotCSAgICAgICBJTUFHRV9TQ05fTUVNX1JFQUQgfCBJTUFHRV9TQ05fTUVNX1dSSVRFIDsKLSAgICBlbHNlIGlmIChzdHJjbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi55ZGF0YSIpID09IDApCi0gICAgICBmbGFncyA9ICBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgfCBJTUFHRV9TQ05fQUxJR05fOEJZVEVTIHwKLQkgICAgICAgSU1BR0VfU0NOX01FTV9SRUFEIHwgSU1BR0VfU0NOX01FTV9XUklURSA7Ci0gICAgZWxzZSBpZiAoc3RybmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLmRyZWN0dmUiLCA4KSA9PSAwKQotICAgICAgZmxhZ3MgPSAgSU1BR0VfU0NOX0xOS19JTkZPIHwgSU1BR0VfU0NOX0xOS19SRU1PVkUgOwotICAgIGVsc2UgaWYgKHN0cm5jbXAgKHNjbmhkcl9pbnQtPnNfbmFtZSwgIi5zdGFiIiwgNSkgPT0gMCkKLSAgICAgIGZsYWdzIHw9IChJTUFHRV9TQ05fTE5LX0lORk8gfCBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFCi0JCXwgSU1BR0VfU0NOX01FTV9TSEFSRUQgfCBJTUFHRV9TQ05fTUVNX1JFQUQpOwotICAgIGVsc2UgaWYgKHN0cmNtcCAoc2NuaGRyX2ludC0+c19uYW1lLCAiLnJzcmMiKSAgPT0gMCkKLSAgICAgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRCB8IElNQUdFX1NDTl9NRU1fU0hBUkVEOwotICAgIGVsc2UKLSAgICAgIHsKLQlmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1JFQUQ7Ci0JaWYgKCEgKGZsYWdzICYgU0VDX1JFQURPTkxZKSkKLQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fV1JJVEU7Ci0gICAgICB9Ci0KLSAgICBiZmRfaF9wdXRfMzIoYWJmZCwgZmxhZ3MsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX2ZsYWdzKTsKLSAgfQotCi0gIGlmIChzY25oZHJfaW50LT5zX25sbm5vIDw9IDB4ZmZmZikKLSAgICBiZmRfaF9wdXRfMTYoYWJmZCwgc2NuaGRyX2ludC0+c19ubG5ubywgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICBlbHNlCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogbGluZSBudW1iZXIgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJICAgICBzY25oZHJfaW50LT5zX25sbm5vKTsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICBiZmRfaF9wdXRfMTYgKGFiZmQsIDB4ZmZmZiwgKGJmZF9ieXRlICopIHNjbmhkcl9leHQtPnNfbmxubm8pOwotICAgICAgcmV0ID0gMDsKLSAgICB9Ci0gIGlmIChzY25oZHJfaW50LT5zX25yZWxvYyA8PSAweGZmZmYpCi0gICAgYmZkX2hfcHV0XzE2KGFiZmQsIHNjbmhkcl9pbnQtPnNfbnJlbG9jLCAoYmZkX2J5dGUgKikgc2NuaGRyX2V4dC0+c19ucmVsb2MpOwotICBlbHNlCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCIlczogcmVsb2Mgb3ZlcmZsb3c6IDB4JWx4ID4gMHhmZmZmIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCQkJICAgICBzY25oZHJfaW50LT5zX25yZWxvYyk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgYmZkX2hfcHV0XzE2IChhYmZkLCAweGZmZmYsIChiZmRfYnl0ZSAqKSBzY25oZHJfZXh0LT5zX25yZWxvYyk7Ci0gICAgICByZXQgPSAwOwotICAgIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNoYXIgKiBkaXJfbmFtZXNbSU1BR0VfTlVNQkVST0ZfRElSRUNUT1JZX0VOVFJJRVNdID0gCi17Ci0gIE5fICgiRXhwb3J0IERpcmVjdG9yeSBbLmVkYXRhIChvciB3aGVyZSBldmVyIHdlIGZvdW5kIGl0KV0iKSwKLSAgTl8gKCJJbXBvcnQgRGlyZWN0b3J5IFtwYXJ0cyBvZiAuaWRhdGFdIiksCi0gIE5fICgiUmVzb3VyY2UgRGlyZWN0b3J5IFsucnNyY10iKSwKLSAgTl8gKCJFeGNlcHRpb24gRGlyZWN0b3J5IFsucGRhdGFdIiksCi0gIE5fICgiU2VjdXJpdHkgRGlyZWN0b3J5IiksCi0gIE5fICgiQmFzZSBSZWxvY2F0aW9uIERpcmVjdG9yeSBbLnJlbG9jXSIpLAotICBOXyAoIkRlYnVnIERpcmVjdG9yeSIpLAotICBOXyAoIkRlc2NyaXB0aW9uIERpcmVjdG9yeSIpLAotICBOXyAoIlNwZWNpYWwgRGlyZWN0b3J5IiksCi0gIE5fICgiVGhyZWFkIFN0b3JhZ2UgRGlyZWN0b3J5IFsudGxzXSIpLAotICBOXyAoIkxvYWQgQ29uZmlndXJhdGlvbiBEaXJlY3RvcnkiKSwKLSAgTl8gKCJCb3VuZCBJbXBvcnQgRGlyZWN0b3J5IiksCi0gIE5fICgiSW1wb3J0IEFkZHJlc3MgVGFibGUgRGlyZWN0b3J5IiksCi0gIE5fICgiUmVzZXJ2ZWQiKSwKLSAgTl8gKCJSZXNlcnZlZCIpLAotICBOXyAoIlJlc2VydmVkIikKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X2lkYXRhKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaWRhdGEiKTsKLSAgdW5zaWduZWQgbG9uZyBhZGo7Ci0KLSNpZmRlZiBQT1dFUlBDX0xFX1BFCi0gIGFzZWN0aW9uICpyZWxfc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnJlbGRhdGEiKTsKLSNlbmRpZgotCi0gIGJmZF9zaXplX3R5cGUgZGF0YXNpemU7Ci0gIGJmZF9zaXplX3R5cGUgZGF0YW9mZjsKLSAgYmZkX3NpemVfdHlwZSBzZWNzaXplOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0gIGJmZF9zaXplX3R5cGUgc3RhcnQsIHN0b3A7Ci0gIGludCBvbmFsaW5lID0gMjA7Ci0KLSAgcGVfZGF0YV90eXBlICpwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciAqZXh0cmEgPSAmcGUtPnBlX29wdGhkcjsKLQotICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBkYXRhb2ZmID0gMDsKLQotICAgICAgaWYgKGRhdGFzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyLCBzaXplOwotCi0gICAgICBhZGRyID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uVmlydHVhbEFkZHJlc3M7Ci0gICAgICBzaXplID0gZXh0cmEtPkRhdGFEaXJlY3RvcnlbMV0uU2l6ZTsKLQotICAgICAgaWYgKGFkZHIgPT0gMCB8fCBzaXplID09IDApCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCXsKLQkgIGlmIChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlIDw9IGFkZHIKLQkgICAgICAmJiAoKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UKLQkJICAgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSkKLQkJICA+PSBhZGRyICsgc2l6ZSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGlmIChzZWN0aW9uID09IE5VTEwpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiB0aGUgaW1wb3J0IHRhYmxlIHNpemUgaXMgbm90IHJlbGlhYmxlLiAgVGhlCi0gICAgICAgICBpbXBvcnQgZGF0YSB3aWxsIGV4dGVuZCBwYXN0IHRoZSBpbmRpY2F0ZWQgc2l6ZSwgYW5kIGJlZm9yZQotICAgICAgICAgdGhlIGluZGljYXRlZCBhZGRyZXNzLiAgKi8KLSAgICAgIGRhdGFvZmYgPSBhZGRyIC0gKHNlY3Rpb24tPnZtYSAtIGV4dHJhLT5JbWFnZUJhc2UpOwotICAgICAgZGF0YXNpemUgPSBzaXplOwotICAgIH0KLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgaWYgKHJlbF9zZWN0aW9uICE9IDAgJiYgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pICE9IDApCi0gICAgewotICAgICAgLyogVGhlIHRvYyBhZGRyZXNzIGNhbiBiZSBmb3VuZCBieSB0YWtpbmcgdGhlIHN0YXJ0aW5nIGFkZHJlc3MsCi0JIHdoaWNoIG9uIHRoZSBQUEMgbG9jYXRlcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IuIFRoZSBkZXNjcmlwdG9yCi0JIGNvbnNpc3RzIG9mIHRoZSBmdW5jdGlvbiBjb2RlIHN0YXJ0aW5nIGFkZHJlc3MgZm9sbG93ZWQgYnkgdGhlCi0JIGFkZHJlc3Mgb2YgdGhlIHRvYy4gVGhlIHN0YXJ0aW5nIGFkZHJlc3Mgd2UgZ2V0IGZyb20gdGhlIGJmZCwKLQkgYW5kIHRoZSBkZXNjcmlwdG9yIGlzIHN1cHBvc2VkIHRvIGJlIGluIHRoZSAucmVsZGF0YSBzZWN0aW9uLiAKLSAgICAgICovCi0KLSAgICAgIGJmZF92bWEgbG9hZGFibGVfdG9jX2FkZHJlc3M7Ci0gICAgICBiZmRfdm1hIHRvY19hZGRyZXNzOwotICAgICAgYmZkX3ZtYSBzdGFydF9hZGRyZXNzOwotICAgICAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICAgICAgaW50IG9mZnNldDsKLSAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgCi0JCQkJCQkJCSByZWxfc2VjdGlvbikpOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCAmJiBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxfc2VjdGlvbikgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGRhdGFzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgcmVsX3NlY3Rpb24pOwotICAKLSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgCi0JCQkJcmVsX3NlY3Rpb24sIAotCQkJCShQVFIpIGRhdGEsIDAsIAotCQkJCWJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbF9zZWN0aW9uKSk7Ci0KLSAgICAgIG9mZnNldCA9IGFiZmQtPnN0YXJ0X2FkZHJlc3MgLSByZWxfc2VjdGlvbi0+dm1hOwotCi0gICAgICBzdGFydF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK29mZnNldCk7Ci0gICAgICBsb2FkYWJsZV90b2NfYWRkcmVzcyA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStvZmZzZXQrNCk7Ci0gICAgICB0b2NfYWRkcmVzcyA9IGxvYWRhYmxlX3RvY19hZGRyZXNzIC0gMzI3Njg7Ci0KLSAgICAgIGZwcmludGYoZmlsZSwKLQkgICAgICBfKCJcbkZ1bmN0aW9uIGRlc2NyaXB0b3IgbG9jYXRlZCBhdCB0aGUgc3RhcnQgYWRkcmVzczogJTA0bHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGFiZmQtPnN0YXJ0X2FkZHJlc3MpKTsKLSAgICAgIGZwcmludGYgKGZpbGUsCi0JICAgICAgIF8oIlx0Y29kZS1iYXNlICUwOGx4IHRvYyAobG9hZGFibGUvYWN0dWFsKSAlMDhseC8lMDhseFxuIiksIAotCSAgICAgICBzdGFydF9hZGRyZXNzLCBsb2FkYWJsZV90b2NfYWRkcmVzcywgdG9jX2FkZHJlc3MpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBmcHJpbnRmKGZpbGUsCi0JICAgICAgXygiXG5ObyByZWxkYXRhIHNlY3Rpb24hIEZ1bmN0aW9uIGRlc2NyaXB0b3Igbm90IGRlY29kZWQuXG4iKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiXG5UaGUgSW1wb3J0IFRhYmxlcyAoaW50ZXJwcmV0ZWQgLmlkYXRhIHNlY3Rpb24gY29udGVudHMpXG4iKSk7Ci0gIGZwcmludGYoZmlsZSwKLQkgIF8oIiB2bWE6ICAgICAgICAgICAgSGludCAgICBUaW1lICAgICAgRm9yd2FyZCAgRExMICAgICAgIEZpcnN0XG4iKSk7Ci0gIGZwcmludGYoZmlsZSwKLQkgIF8oIiAgICAgICAgICAgICAgICAgVGFibGUgICBTdGFtcCAgICAgQ2hhaW4gICAgTmFtZSAgICAgIFRodW5rXG4iKSk7Ci0KLSAgc2Vjc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHNlY3NpemUpOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIHNlY3NpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCAwLCBzZWNzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWRqID0gKGV4dHJhLT5JbWFnZUJhc2UgLSBzZWN0aW9uLT52bWEpICYgMHhmZmZmZmZmZjsKLQotICBzdGFydCA9IGRhdGFvZmY7Ci0gIHN0b3AgPSBkYXRhb2ZmICsgZGF0YXNpemU7Ci0gIGZvciAoaSA9IHN0YXJ0OyBpIDwgc3RvcDsgaSArPSBvbmFsaW5lKQotICAgIHsKLSAgICAgIGJmZF92bWEgaGludF9hZGRyOwotICAgICAgYmZkX3ZtYSB0aW1lX3N0YW1wOwotICAgICAgYmZkX3ZtYSBmb3J3YXJkX2NoYWluOwotICAgICAgYmZkX3ZtYSBkbGxfbmFtZTsKLSAgICAgIGJmZF92bWEgZmlyc3RfdGh1bms7Ci0gICAgICBpbnQgaWR4ID0gMDsKLSAgICAgIGJmZF9zaXplX3R5cGUgajsKLSAgICAgIGNoYXIgKmRsbDsKLQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgIiAlMDhseFx0IiwgCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGludCkgKGkgKyBzZWN0aW9uLT52bWEgKyBkYXRhb2ZmKSk7Ci0gICAgICAKLSAgICAgIGlmIChpKzIwID4gc3RvcCkKLQl7Ci0JICAvKiBjaGVjayBzdHVmZiAqLwotCSAgOwotCX0KLSAgICAgIAotICAgICAgaGludF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOwotICAgICAgdGltZV9zdGFtcCA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOwotICAgICAgZm9yd2FyZF9jaGFpbiA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzgpOwotICAgICAgZGxsX25hbWUgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGEraSsxMik7Ci0gICAgICBmaXJzdF90aHVuayA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzE2KTsKLSAgICAgIAotICAgICAgZnByaW50ZihmaWxlLCAiJTA4bHggJTA4bHggJTA4bHggJTA4bHggJTA4bHhcbiIsCi0JICAgICAgaGludF9hZGRyLAotCSAgICAgIHRpbWVfc3RhbXAsCi0JICAgICAgZm9yd2FyZF9jaGFpbiwKLQkgICAgICBkbGxfbmFtZSwKLQkgICAgICBmaXJzdF90aHVuayk7Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgPT0gMCAmJiBmaXJzdF90aHVuayA9PSAwKQotCWJyZWFrOwotCi0gICAgICAvKiB0aGUgaW1hZ2UgYmFzZSBpcyBwcmVzZW50IGluIHRoZSBzZWN0aW9uLT52bWEgKi8KLSAgICAgIGRsbCA9IChjaGFyICopIGRhdGEgKyBkbGxfbmFtZSArIGFkajsKLSAgICAgIGZwcmludGYoZmlsZSwgXygiXG5cdERMTCBOYW1lOiAlc1xuIiksIGRsbCk7Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCBfKCJcdHZtYTogIEhpbnQvT3JkIE1lbWJlci1OYW1lXG4iKSk7Ci0KLQkgIGlkeCA9IGhpbnRfYWRkciArIGFkajsKLQotCSAgZm9yIChqID0gMDsgaiA8IHN0b3A7IGogKz0gNCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeCArIGopOwotCi0JICAgICAgaWYgKG1lbWJlciA9PSAwKQotCQlicmVhazsKLQkgICAgICBpZiAobWVtYmVyICYgMHg4MDAwMDAwMCkKLQkJZnByaW50ZiAoZmlsZSwgIlx0JTA0bHhcdCAlNGx1IiwgbWVtYmVyLAotCQkJIG1lbWJlciAmIDB4N2ZmZmZmZmYpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGludCBvcmRpbmFsOwotCQkgIGNoYXIgKm1lbWJlcl9uYW1lOwotCi0JCSAgb3JkaW5hbCA9IGJmZF9nZXRfMTYgKGFiZmQsIGRhdGEgKyBtZW1iZXIgKyBhZGopOwotCQkgIG1lbWJlcl9uYW1lID0gKGNoYXIgKikgZGF0YSArIG1lbWJlciArIGFkaiArIDI7Ci0JCSAgZnByaW50ZiAoZmlsZSwgIlx0JTA0bHhcdCAlNGQgICVzIiwKLQkJCSAgIG1lbWJlciwgb3JkaW5hbCwgbWVtYmVyX25hbWUpOwotCQl9Ci0KLQkgICAgICAvKiBJZiB0aGUgdGltZSBzdGFtcCBpcyBub3QgemVybywgdGhlIGltcG9ydCBhZGRyZXNzCi0gICAgICAgICAgICAgICAgIHRhYmxlIGhvbGRzIGFjdHVhbCBhZGRyZXNzZXMuICAqLwotCSAgICAgIGlmICh0aW1lX3N0YW1wICE9IDAKLQkJICAmJiBmaXJzdF90aHVuayAhPSAwCi0JCSAgJiYgZmlyc3RfdGh1bmsgIT0gaGludF9hZGRyKQotCQlmcHJpbnRmIChmaWxlLCAiXHQlMDRseCIsCi0JCQkgYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGZpcnN0X3RodW5rICsgYWRqICsgaikpOwotCi0JICAgICAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChoaW50X2FkZHIgIT0gZmlyc3RfdGh1bmsgJiYgdGltZV9zdGFtcCA9PSAwKQotCXsKLQkgIGludCBkaWZmZXIgPSAwOwotCSAgaW50IGlkeDI7Ci0KLQkgIGlkeDIgPSBmaXJzdF90aHVuayArIGFkajsKLQotCSAgZm9yIChqPTA7ajxzdG9wO2orPTQpCi0JICAgIHsKLQkgICAgICBpbnQgb3JkaW5hbDsKLQkgICAgICBjaGFyICptZW1iZXJfbmFtZTsKLQkgICAgICBiZmRfdm1hIGhpbnRfbWVtYmVyID0gMDsKLQkgICAgICBiZmRfdm1hIGlhdF9tZW1iZXI7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyICE9IDApCi0JCWhpbnRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgZGF0YSArIGlkeCArIGopOwotCSAgICAgIGlhdF9tZW1iZXIgPSBiZmRfZ2V0XzMyIChhYmZkLCBkYXRhICsgaWR4MiArIGopOwotCi0JICAgICAgaWYgKGhpbnRfYWRkciA9PSAwICYmIGlhdF9tZW1iZXIgPT0gMCkKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoaGludF9hZGRyID09IDAgfHwgaGludF9tZW1iZXIgIT0gaWF0X21lbWJlcikKLQkJewotCQkgIGlmIChkaWZmZXIgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZmlsZSwgCi0JCQkgICAgICAgXygiXHRUaGUgSW1wb3J0IEFkZHJlc3MgVGFibGUgKGRpZmZlcmVuY2UgZm91bmQpXG4iKSk7Ci0JCSAgICAgIGZwcmludGYoZmlsZSwgXygiXHR2bWE6ICBIaW50L09yZCBNZW1iZXItTmFtZVxuIikpOwotCQkgICAgICBkaWZmZXIgPSAxOwotCQkgICAgfQotCQkgIGlmIChpYXRfbWVtYmVyID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGZwcmludGYoZmlsZSwKLQkJCSAgICAgIF8oIlx0Pj4+IFJhbiBvdXQgb2YgSUFUIG1lbWJlcnMhXG4iKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSAKLQkJICAgIHsKLQkJICAgICAgb3JkaW5hbCA9IGJmZF9nZXRfMTYoYWJmZCwKLQkJCQkJICAgZGF0YSArIGlhdF9tZW1iZXIgKyBhZGopOwotCQkgICAgICBtZW1iZXJfbmFtZSA9IChjaGFyICopIGRhdGEgKyBpYXRfbWVtYmVyICsgYWRqICsgMjsKLQkJICAgICAgZnByaW50ZihmaWxlLCAiXHQlMDRseFx0ICU0ZCAgJXNcbiIsCi0JCQkgICAgICBpYXRfbWVtYmVyLCBvcmRpbmFsLCBtZW1iZXJfbmFtZSk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGlmIChoaW50X2FkZHIgIT0gMCAmJiBoaW50X21lbWJlciA9PSAwKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKGRpZmZlciA9PSAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZihmaWxlLAotCQkgICAgICBfKCJcdFRoZSBJbXBvcnQgQWRkcmVzcyBUYWJsZSBpcyBpZGVudGljYWxcbiIpKTsKLQkgICAgfQotCX0KLQotICAgICAgZnByaW50ZihmaWxlLCAiXG4iKTsKLQotICAgIH0KLQotICBmcmVlIChkYXRhKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXBlX3ByaW50X2VkYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmVkYXRhIik7Ci0KLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhb2ZmOwotICBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgaW50IGFkajsKLSAgc3RydWN0IEVEVF90eXBlIAotICAgIHsKLSAgICAgIGxvbmcgZXhwb3J0X2ZsYWdzOyAgICAgICAgICAgICAvKiByZXNlcnZlZCAtIHNob3VsZCBiZSB6ZXJvICovCi0gICAgICBsb25nIHRpbWVfc3RhbXA7Ci0gICAgICBzaG9ydCBtYWpvcl92ZXI7Ci0gICAgICBzaG9ydCBtaW5vcl92ZXI7Ci0gICAgICBiZmRfdm1hIG5hbWU7ICAgICAgICAgICAgICAgICAgLyogcnZhIC0gcmVsYXRpdmUgdG8gaW1hZ2UgYmFzZSAqLwotICAgICAgbG9uZyBiYXNlOyAgICAgICAgICAgICAgICAgICAgIC8qIG9yZGluYWwgYmFzZSAqLwotICAgICAgdW5zaWduZWQgbG9uZyBudW1fZnVuY3Rpb25zOyAgIC8qIE51bWJlciBpbiB0aGUgZXhwb3J0IGFkZHJlc3MgdGFibGUgKi8KLSAgICAgIHVuc2lnbmVkIGxvbmcgbnVtX25hbWVzOyAgICAgICAvKiBOdW1iZXIgaW4gdGhlIG5hbWUgcG9pbnRlciB0YWJsZSAqLwotICAgICAgYmZkX3ZtYSBlYXRfYWRkcjsgICAgLyogcnZhIHRvIHRoZSBleHBvcnQgYWRkcmVzcyB0YWJsZSAqLwotICAgICAgYmZkX3ZtYSBucHRfYWRkcjsgICAgICAgIC8qIHJ2YSB0byB0aGUgRXhwb3J0IE5hbWUgUG9pbnRlciBUYWJsZSAqLwotICAgICAgYmZkX3ZtYSBvdF9hZGRyOyAvKiBydmEgdG8gdGhlIE9yZGluYWwgVGFibGUgKi8KLSAgICB9IGVkdDsKLQotICBwZV9kYXRhX3R5cGUgKnBlID0gcGVfZGF0YSAoYWJmZCk7Ci0gIHN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyICpleHRyYSA9ICZwZS0+cGVfb3B0aGRyOwotCi0gIGlmIChzZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgICAgIGRhdGFvZmYgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF92bWEgYWRkciwgc2l6ZTsKLQotICAgICAgYWRkciA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlZpcnR1YWxBZGRyZXNzOwotICAgICAgc2l6ZSA9IGV4dHJhLT5EYXRhRGlyZWN0b3J5WzBdLlNpemU7Ci0KLSAgICAgIGlmIChhZGRyID09IDAgfHwgc2l6ZSA9PSAwKQotCXJldHVybiB0cnVlOwotCi0gICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbiAhPSBOVUxMOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpZiAoc2VjdGlvbi0+dm1hIC0gZXh0cmEtPkltYWdlQmFzZSA8PSBhZGRyCi0JICAgICAgJiYgKChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlCi0JCSAgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpCi0JCSAgPj0gYWRkciArIHNpemUpKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBpZiAoc2VjdGlvbiA9PSBOVUxMKQotCXJldHVybiB0cnVlOwotCi0gICAgICBkYXRhc2l6ZSA9IHNpemU7Ci0gICAgICBkYXRhb2ZmID0gYWRkciAtIChzZWN0aW9uLT52bWEgLSBleHRyYS0+SW1hZ2VCYXNlKTsKLSAgICB9Ci0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChkYXRhc2l6ZSk7Ci0gIGlmIChkYXRhID09IE5VTEwgJiYgZGF0YXNpemUgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCBkYXRhb2ZmLAotCQkJCSAgZGF0YXNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHbyBnZXQgRXhwb3J0IERpcmVjdG9yeSBUYWJsZSAqLwotICBlZHQuZXhwb3J0X2ZsYWdzICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMCk7IAotICBlZHQudGltZV9zdGFtcCAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErNCk7Ci0gIGVkdC5tYWpvcl92ZXIgICAgICA9IGJmZF9nZXRfMTYoYWJmZCwgZGF0YSs4KTsKLSAgZWR0Lm1pbm9yX3ZlciAgICAgID0gYmZkX2dldF8xNihhYmZkLCBkYXRhKzEwKTsKLSAgZWR0Lm5hbWUgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzEyKTsKLSAgZWR0LmJhc2UgICAgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzE2KTsKLSAgZWR0Lm51bV9mdW5jdGlvbnMgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzIwKTsgCi0gIGVkdC5udW1fbmFtZXMgICAgICA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YSsyNCk7IAotICBlZHQuZWF0X2FkZHIgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMjgpOwotICBlZHQubnB0X2FkZHIgICAgICAgPSBiZmRfZ2V0XzMyKGFiZmQsIGRhdGErMzIpOyAKLSAgZWR0Lm90X2FkZHIgICAgICAgID0gYmZkX2dldF8zMihhYmZkLCBkYXRhKzM2KTsKLQotICBhZGogPSAoZXh0cmEtPkltYWdlQmFzZSAtIChzZWN0aW9uLT52bWEgKyBkYXRhb2ZmKSkgJiAweGZmZmZmZmZmOwotCi0KLSAgLyogRHVtcCB0aGUgRURUIGZpcnN0IGZpcnN0ICovCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuVGhlIEV4cG9ydCBUYWJsZXMgKGludGVycHJldGVkIC5lZGF0YSBzZWN0aW9uIGNvbnRlbnRzKVxuXG4iKSk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiRXhwb3J0IEZsYWdzIFx0XHRcdCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlZHQuZXhwb3J0X2ZsYWdzKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJUaW1lL0RhdGUgc3RhbXAgXHRcdCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlZHQudGltZV9zdGFtcCk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiTWFqb3IvTWlub3IgXHRcdFx0JWQvJWRcbiIpLCBlZHQubWFqb3JfdmVyLCBlZHQubWlub3JfdmVyKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgIF8oIk5hbWUgXHRcdFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQubmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsCi0JICAgIiAlc1xuIiwgZGF0YSArIGVkdC5uYW1lICsgYWRqKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJPcmRpbmFsIEJhc2UgXHRcdFx0JWxkXG4iKSwgZWR0LmJhc2UpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIk51bWJlciBpbjpcbiIpKTsKLQotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQlbHhcbiIpLAotCSAgZWR0Lm51bV9mdW5jdGlvbnMpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlx0W05hbWUgUG9pbnRlci9PcmRpbmFsXSBUYWJsZVx0JWx1XG4iKSwgZWR0Lm51bV9uYW1lcyk7Ci0KLSAgZnByaW50ZihmaWxlLAotCSAgXygiVGFibGUgQWRkcmVzc2VzXG4iKSk7Ci0KLSAgZnByaW50ZiAoZmlsZSwKLQkgICBfKCJcdEV4cG9ydCBBZGRyZXNzIFRhYmxlIFx0XHQiKSk7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBlZHQuZWF0X2FkZHIpOwotICBmcHJpbnRmIChmaWxlLCAiXG4iKTsKLQotICBmcHJpbnRmIChmaWxlLAotCSAgXygiXHROYW1lIFBvaW50ZXIgVGFibGUgXHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5ucHRfYWRkcik7Ci0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotCi0gIGZwcmludGYgKGZpbGUsCi0JICAgXygiXHRPcmRpbmFsIFRhYmxlIFx0XHRcdCIpKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGVkdC5vdF9hZGRyKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgCi0gIC8qIFRoZSBuZXh0IHRhYmxlIHRvIGZpbmQgc2kgdGhlIEV4cG9ydCBBZGRyZXNzIFRhYmxlLiBJdCdzIGJhc2ljYWxseQotICAgICBhIGxpc3Qgb2YgcG9pbnRlcnMgdGhhdCBlaXRoZXIgbG9jYXRlIGEgZnVuY3Rpb24gaW4gdGhpcyBkbGwsIG9yCi0gICAgIGZvcndhcmQgdGhlIGNhbGwgdG8gYW5vdGhlciBkbGwuIFNvbWV0aGluZyBsaWtlOgotICAgICAgdHlwZWRlZiB1bmlvbiAKLSAgICAgIHsKLSAgICAgICAgbG9uZyBleHBvcnRfcnZhOwotICAgICAgICBsb25nIGZvcndhcmRlcl9ydmE7Ci0gICAgICB9IGV4cG9ydF9hZGRyZXNzX3RhYmxlX2VudHJ5OwotICAqLwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuRXhwb3J0IEFkZHJlc3MgVGFibGUgLS0gT3JkaW5hbCBCYXNlICVsZFxuIiksCi0JICBlZHQuYmFzZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGVkdC5udW1fZnVuY3Rpb25zOyArK2kpCi0gICAgewotICAgICAgYmZkX3ZtYSBlYXRfbWVtYmVyID0gYmZkX2dldF8zMiAoYWJmZCwgCi0JCQkJICAgICAgIGRhdGEgKyBlZHQuZWF0X2FkZHIgKyAoaSAqIDQpICsgYWRqKTsKLSAgICAgIGJmZF92bWEgZWF0X2FjdHVhbCA9IChleHRyYS0+SW1hZ2VCYXNlICsgZWF0X21lbWJlcikgJiAweGZmZmZmZmZmOwotICAgICAgYmZkX3ZtYSBlZGF0YV9zdGFydCA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsc2VjdGlvbikgKyBkYXRhb2ZmOwotICAgICAgYmZkX3ZtYSBlZGF0YV9lbmQgPSBlZGF0YV9zdGFydCArIGRhdGFzaXplOwotCi0gICAgICBpZiAoZWF0X21lbWJlciA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZWRhdGFfc3RhcnQgPCBlYXRfYWN0dWFsICYmIGVhdF9hY3R1YWwgPCBlZGF0YV9lbmQpIAotCXsKLQkgIC8qIHRoaXMgcnZhIGlzIHRvIGEgbmFtZSAoZm9yd2FyZGluZyBmdW5jdGlvbikgaW4gb3VyIHNlY3Rpb24gKi8KLQkgIC8qIFNob3VsZCBsb2NhdGUgYSBmdW5jdGlvbiBkZXNjcmlwdG9yICovCi0JICBmcHJpbnRmKGZpbGUsCi0JCSAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzIC0tICVzXG4iLCAKLQkJICAobG9uZykgaSwgKGxvbmcpIChpICsgZWR0LmJhc2UpLCBlYXRfbWVtYmVyLAotCQkgICJGb3J3YXJkZXIgUlZBIiwgZGF0YSArIGVhdF9tZW1iZXIgKyBhZGopOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBTaG91bGQgbG9jYXRlIGEgZnVuY3Rpb24gZGVzY3JpcHRvciBpbiB0aGUgcmVsZGF0YSBzZWN0aW9uICovCi0JICBmcHJpbnRmKGZpbGUsCi0JCSAgIlx0WyU0bGRdICtiYXNlWyU0bGRdICUwNGx4ICVzXG4iLCAKLQkJICAobG9uZykgaSwgKGxvbmcpIChpICsgZWR0LmJhc2UpLCBlYXRfbWVtYmVyLCAiRXhwb3J0IFJWQSIpOwotCX0KLSAgICB9Ci0KLSAgLyogVGhlIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGUgaXMgcGFpcmVkIHdpdGggdGhlIEV4cG9ydCBPcmRpbmFsIFRhYmxlICovCi0gIC8qIER1bXAgdGhlbSBpbiBwYXJhbGxlbCBmb3IgY2xhcml0eSAqLwotICBmcHJpbnRmKGZpbGUsCi0JICBfKCJcbltPcmRpbmFsL05hbWUgUG9pbnRlcl0gVGFibGVcbiIpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZWR0Lm51bV9uYW1lczsgKytpKQotICAgIHsKLSAgICAgIGJmZF92bWEgbmFtZV9wdHIgPSBiZmRfZ2V0XzMyKGFiZmQsIAotCQkJCSAgICBkYXRhICsgCi0JCQkJICAgIGVkdC5ucHRfYWRkcgotCQkJCSAgICArIChpKjQpICsgYWRqKTsKLSAgICAgIAotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIGRhdGEgKyBuYW1lX3B0ciArIGFkajsKLQotICAgICAgYmZkX3ZtYSBvcmQgPSBiZmRfZ2V0XzE2KGFiZmQsIAotCQkJCSAgICBkYXRhICsgCi0JCQkJICAgIGVkdC5vdF9hZGRyCi0JCQkJICAgICsgKGkqMikgKyBhZGopOwotICAgICAgZnByaW50ZihmaWxlLAotCSAgICAgICJcdFslNGxkXSAlc1xuIiwgKGxvbmcpIG9yZCwgbmFtZSk7Ci0KLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9wZGF0YSAoYWJmZCwgdmZpbGUpCi0gICAgIGJmZCAgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucGRhdGEiKTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLSAgaW50IG9uYWxpbmUgPSAyMDsKLQotICBpZiAoc2VjdGlvbiA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKChzdG9wICUgb25hbGluZSkgIT0gMCkKLSAgICBmcHJpbnRmIChmaWxlLCBfKCJXYXJuaW5nLCAucGRhdGEgc2VjdGlvbiBzaXplICglbGQpIGlzIG5vdCBhIG11bHRpcGxlIG9mICVkXG4iKSwKLQkgICAgIChsb25nKXN0b3AsIG9uYWxpbmUpOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuVGhlIEZ1bmN0aW9uIFRhYmxlIChpbnRlcnByZXRlZCAucGRhdGEgc2VjdGlvbiBjb250ZW50cylcbiIpKTsKLSAgZnByaW50ZihmaWxlLAotCSAgXygiIHZtYTpcdFx0QmVnaW4gICAgRW5kICAgICAgRUggICAgICAgRUggICAgICAgUHJvbG9nRW5kXG4iKSk7Ci0gIGZwcmludGYoZmlsZSwKLQkgIF8oIiAgICAgXHRcdEFkZHJlc3MgIEFkZHJlc3MgIEhhbmRsZXIgIERhdGEgICAgIEFkZHJlc3NcbiIpKTsKLQotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkYXRhID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKChzaXplX3QpIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLSAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLSAgaWYgKGRhdGEgPT0gTlVMTCAmJiBkYXRhc2l6ZSAhPSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIAotCQkJICAgIHNlY3Rpb24sIAotCQkJICAgIChQVFIpIGRhdGEsIDAsIAotCQkJICAgIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKTsKLQotICBzdGFydCA9IDA7Ci0KLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCi0gICAgewotICAgICAgYmZkX3ZtYSBiZWdpbl9hZGRyOwotICAgICAgYmZkX3ZtYSBlbmRfYWRkcjsKLSAgICAgIGJmZF92bWEgZWhfaGFuZGxlcjsKLSAgICAgIGJmZF92bWEgZWhfZGF0YTsKLSAgICAgIGJmZF92bWEgcHJvbG9nX2VuZF9hZGRyOwotCi0gICAgICBpZiAoaSsyMCA+IHN0b3ApCi0JICBicmVhazsKLSAgICAgIAotICAgICAgYmVnaW5fYWRkciA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKTsKLSAgICAgIGVuZF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krNCk7Ci0gICAgICBlaF9oYW5kbGVyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krOCk7Ci0gICAgICBlaF9kYXRhID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTIpOwotICAgICAgcHJvbG9nX2VuZF9hZGRyID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2krMTYpOwotICAgICAgCi0gICAgICBpZiAoYmVnaW5fYWRkciA9PSAwICYmIGVuZF9hZGRyID09IDAgJiYgZWhfaGFuZGxlciA9PSAwCi0JICAmJiBlaF9kYXRhID09IDAgJiYgcHJvbG9nX2VuZF9hZGRyID09IDApCi0JewotCSAgLyogV2UgYXJlIHByb2JhYmx5IGludG8gdGhlIHBhZGRpbmcgb2YgdGhlCi0JICAgICBzZWN0aW9uIG5vdyAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBmcHJpbnRmIChmaWxlLAotCSAgICAgICAiICUwOGx4XHQiLCAKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSkpOwotCi0gICAgICBmcHJpbnRmKGZpbGUsICIlMDhseCAlMDhseCAlMDhseCAlMDhseCAlMDhseCIsCi0JICAgICAgYmVnaW5fYWRkciwKLQkgICAgICBlbmRfYWRkciwKLQkgICAgICBlaF9oYW5kbGVyLAotCSAgICAgIGVoX2RhdGEsCi0JICAgICAgcHJvbG9nX2VuZF9hZGRyKTsKLQotI2lmZGVmIFBPV0VSUENfTEVfUEUKLSAgICAgIGlmIChlaF9oYW5kbGVyID09IDAgJiYgZWhfZGF0YSAhPSAwKQotCXsKLQkgIC8qIFNwZWNpYWwgYml0cyBoZXJlLCBhbHRob3VnaCB0aGUgbWVhbmluZyBtYXkgKi8KLQkgIC8qIGJlIGEgbGl0dGxlIG15c3RlcmlvdXMuIFRoZSBvbmx5IG9uZSBJIGtub3cgKi8KLQkgIC8qIGZvciBzdXJlIGlzIDB4MDMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIENvZGUgU2lnbmlmaWNhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDEgUmVnaXN0ZXIgU2F2ZSBNaWxsaWNvZGUgICAgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDIgUmVnaXN0ZXIgUmVzdG9yZSBNaWxsaWNvZGUgICAgICAgICAgICAgKi8KLQkgIC8qIDB4MDMgR2x1ZSBDb2RlIFNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgKi8KLQkgIHN3aXRjaCAoZWhfZGF0YSkKLQkgICAgewotCSAgICBjYXNlIDB4MDE6Ci0JICAgICAgZnByaW50ZihmaWxlLCBfKCIgUmVnaXN0ZXIgc2F2ZSBtaWxsaWNvZGUiKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMHgwMjoKLQkgICAgICBmcHJpbnRmKGZpbGUsIF8oIiBSZWdpc3RlciByZXN0b3JlIG1pbGxpY29kZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAweDAzOgotCSAgICAgIGZwcmludGYoZmlsZSwgXygiIEdsdWUgY29kZSBzZXF1ZW5jZSIpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSNlbmRpZgkgICAKLSAgICAgIGZwcmludGYoZmlsZSwgIlxuIik7Ci0gICAgfQotCi0gIGZyZWUgKGRhdGEpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqdGJsWzZdID0KLXsKLSJBQlNPTFVURSIsCi0iSElHSCIsCi0iTE9XIiwKLSJISUdITE9XIiwKLSJISUdIQURKIiwKLSJNSVBTX0pNUEFERFIiCi19OwotCi1zdGF0aWMgYm9vbGVhbgotcGVfcHJpbnRfcmVsb2MgKGFiZmQsIHZmaWxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiB2ZmlsZTsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIHZmaWxlOwotICBiZmRfYnl0ZSAqZGF0YSA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucmVsb2MiKTsKLSAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgYmZkX3NpemVfdHlwZSBzdGFydCwgc3RvcDsKLQotICBpZiAoc2VjdGlvbiA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGZwcmludGYoZmlsZSwKLQkgIF8oIlxuXG5QRSBGaWxlIEJhc2UgUmVsb2NhdGlvbnMgKGludGVycHJldGVkIC5yZWxvYyBzZWN0aW9uIGNvbnRlbnRzKVxuIikpOwotCi0gIGRhdGEgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoKHNpemVfdCkgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotICBkYXRhc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoZGF0YSA9PSBOVUxMICYmIGRhdGFzaXplICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgCi0JCQkgICAgc2VjdGlvbiwgCi0JCQkgICAgKFBUUikgZGF0YSwgMCwgCi0JCQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikpOwotCi0gIHN0YXJ0ID0gMDsKLQotICBzdG9wID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0KLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOykKLSAgICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGJmZF92bWEgdmlydHVhbF9hZGRyZXNzOwotICAgICAgbG9uZyBudW1iZXIsIHNpemU7Ci0KLSAgICAgIC8qIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBhIHNlcXVlbmNlIG9mIGJsb2Nrcywgd2l0aCBhIGhlYWRlciBjb25zaXN0aW5nCi0JIG9mIHR3byAzMiBiaXQgcXVhbnRpdGllcywgZm9sbG93ZWQgYnkgYSBudW1iZXIgb2YgMTYgYml0IGVudHJpZXMgKi8KLQotICAgICAgdmlydHVhbF9hZGRyZXNzID0gYmZkX2dldF8zMihhYmZkLCBkYXRhK2kpOwotICAgICAgc2l6ZSA9IGJmZF9nZXRfMzIoYWJmZCwgZGF0YStpKzQpOwotICAgICAgbnVtYmVyID0gKHNpemUgLSA4KSAvIDI7Ci0KLSAgICAgIGlmIChzaXplID09IDApIAotCXsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgZnByaW50ZiAoZmlsZSwKLQkgICAgICAgXygiXG5WaXJ0dWFsIEFkZHJlc3M6ICUwOGx4IENodW5rIHNpemUgJWxkICgweCVseCkgTnVtYmVyIG9mIGZpeHVwcyAlbGRcbiIpLAotCSAgICAgICB2aXJ0dWFsX2FkZHJlc3MsIHNpemUsIHNpemUsIG51bWJlcik7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBudW1iZXI7ICsraikKLQl7Ci0JICB1bnNpZ25lZCBzaG9ydCBlID0gYmZkX2dldF8xNihhYmZkLCBkYXRhICsgaSArIDggKyBqKjIpOwotCSAgaW50IHQgPSAgIChlICYgMHhGMDAwKSA+PiAxMjsKLQkgIGludCBvZmYgPSBlICYgMHgwRkZGOwotCi0JICBpZiAodCA+IDUpIAotCSAgICBhYm9ydCgpOwotCi0JICBmcHJpbnRmKGZpbGUsCi0JCSAgXygiXHRyZWxvYyAlNGQgb2Zmc2V0ICU0eCBbJTRseF0gJXNcbiIpLCAKLQkJICBqLCBvZmYsIChsb25nKSAob2ZmICsgdmlydHVhbF9hZGRyZXNzKSwgdGJsW3RdKTsKLQkgIAotCX0KLSAgICAgIGkgKz0gc2l6ZTsKLSAgICB9Ci0KLSAgZnJlZSAoZGF0YSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCB2ZmlsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgdmZpbGU7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSB2ZmlsZTsKLSAgaW50IGo7Ci0gIHBlX2RhdGFfdHlwZSAqcGUgPSBwZV9kYXRhIChhYmZkKTsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgKmkgPSAmcGUtPnBlX29wdGhkcjsKLQotICAvKiBUaGUgTVMgZHVtcGJpbiBwcm9ncmFtIHJlcG9ydGVkbHkgYW5kcyB3aXRoIDB4ZmYwZiBiZWZvcmUKLSAgICAgcHJpbnRpbmcgdGhlIGNoYXJhY3RlcmlzdGljcyBmaWVsZC4gIE5vdCBzdXJlIHdoeS4gIE5vIHJlYXNvbiB0bwotICAgICBlbXVsYXRlIGl0IGhlcmUuICAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJcbkNoYXJhY3RlcmlzdGljcyAweCV4XG4iKSwgcGUtPnJlYWxfZmxhZ3MpOwotI3VuZGVmIFBGCi0jZGVmaW5lIFBGKHgsIHkpICAgIGlmIChwZS0+cmVhbF9mbGFncyAmIHgpIHsgZnByaW50ZiAoZmlsZSwgIlx0JXNcbiIsIHkpOyB9Ci0gIFBGIChGX1JFTEZMRywgInJlbG9jYXRpb25zIHN0cmlwcGVkIik7Ci0gIFBGIChGX0VYRUMsICJleGVjdXRhYmxlIik7Ci0gIFBGIChGX0xOTk8sICJsaW5lIG51bWJlcnMgc3RyaXBwZWQiKTsKLSAgUEYgKEZfTFNZTVMsICJzeW1ib2xzIHN0cmlwcGVkIik7Ci0gIFBGICgweDgwLCAibGl0dGxlIGVuZGlhbiIpOwotICBQRiAoRl9BUjMyV1IsICIzMiBiaXQgd29yZHMiKTsKLSAgUEYgKDB4MjAwLCAiZGVidWdnaW5nIGluZm9ybWF0aW9uIHJlbW92ZWQiKTsKLSAgUEYgKDB4MTAwMCwgInN5c3RlbSBmaWxlIik7Ci0gIFBGIChGX0RMTCwgIkRMTCIpOwotICBQRiAoMHg4MDAwLCAiYmlnIGVuZGlhbiIpOwotI3VuZGVmIFBGCi0KLSAgZnByaW50ZiAoZmlsZSwiXG5JbWFnZUJhc2VcdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5JbWFnZUJhc2UpOwotICBmcHJpbnRmIChmaWxlLCJcblNlY3Rpb25BbGlnbm1lbnRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2VjdGlvbkFsaWdubWVudCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuRmlsZUFsaWdubWVudFx0XHQiKTsKLSAgZnByaW50Zl92bWEgKGZpbGUsIGktPkZpbGVBbGlnbm1lbnQpOwotICBmcHJpbnRmIChmaWxlLCJcbk1ham9yT1N5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNaW5vck9TeXN0ZW1WZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uKTsKLSAgZnByaW50ZiAoZmlsZSwiTWFqb3JJbWFnZVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvckltYWdlVmVyc2lvbik7Ci0gIGZwcmludGYgKGZpbGUsIk1pbm9ySW1hZ2VWZXJzaW9uXHQlZFxuIiwgaS0+TWlub3JJbWFnZVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNYWpvclN1YnN5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NYWpvclN1YnN5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJNaW5vclN1YnN5c3RlbVZlcnNpb25cdCVkXG4iLCBpLT5NaW5vclN1YnN5c3RlbVZlcnNpb24pOwotICBmcHJpbnRmIChmaWxlLCJSZXNlcnZlZDFcdFx0JTA4bHhcbiIsIGktPlJlc2VydmVkMSk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZkltYWdlXHRcdCUwOGx4XG4iLCBpLT5TaXplT2ZJbWFnZSk7Ci0gIGZwcmludGYgKGZpbGUsIlNpemVPZkhlYWRlcnNcdFx0JTA4bHhcbiIsIGktPlNpemVPZkhlYWRlcnMpOwotICBmcHJpbnRmIChmaWxlLCJDaGVja1N1bVx0XHQlMDhseFxuIiwgaS0+Q2hlY2tTdW0pOwotICBmcHJpbnRmIChmaWxlLCJTdWJzeXN0ZW1cdFx0JTA4eFxuIiwgaS0+U3Vic3lzdGVtKTsKLSAgZnByaW50ZiAoZmlsZSwiRGxsQ2hhcmFjdGVyaXN0aWNzXHQlMDh4XG4iLCBpLT5EbGxDaGFyYWN0ZXJpc3RpY3MpOwotICBmcHJpbnRmIChmaWxlLCJTaXplT2ZTdGFja1Jlc2VydmVcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mU3RhY2tSZXNlcnZlKTsKLSAgZnByaW50ZiAoZmlsZSwiXG5TaXplT2ZTdGFja0NvbW1pdFx0Iik7Ci0gIGZwcmludGZfdm1hIChmaWxlLCBpLT5TaXplT2ZTdGFja0NvbW1pdCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuU2l6ZU9mSGVhcFJlc2VydmVcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mSGVhcFJlc2VydmUpOwotICBmcHJpbnRmIChmaWxlLCJcblNpemVPZkhlYXBDb21taXRcdCIpOwotICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+U2l6ZU9mSGVhcENvbW1pdCk7Ci0gIGZwcmludGYgKGZpbGUsIlxuTG9hZGVyRmxhZ3NcdFx0JTA4bHhcbiIsIGktPkxvYWRlckZsYWdzKTsKLSAgZnByaW50ZiAoZmlsZSwiTnVtYmVyT2ZSdmFBbmRTaXplc1x0JTA4bHhcbiIsIGktPk51bWJlck9mUnZhQW5kU2l6ZXMpOwotCi0gIGZwcmludGYgKGZpbGUsIlxuVGhlIERhdGEgRGlyZWN0b3J5XG4iKTsKLSAgZm9yIChqID0gMDsgaiA8IElNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTOyBqKyspIAotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICJFbnRyeSAlMXggIiwgaik7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgaS0+RGF0YURpcmVjdG9yeVtqXS5WaXJ0dWFsQWRkcmVzcyk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICUwOGx4ICIsIGktPkRhdGFEaXJlY3Rvcnlbal0uU2l6ZSk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXNcbiIsIGRpcl9uYW1lc1tqXSk7Ci0gICAgfQotCi0gIHBlX3ByaW50X2lkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X2VkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X3BkYXRhIChhYmZkLCB2ZmlsZSk7Ci0gIHBlX3ByaW50X3JlbG9jIChhYmZkLCB2ZmlsZSk7Ci0KLSAgaWYgKHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHV0YyAoJ1xuJywgZmlsZSk7Ci0gIAotICAgICAgcmV0dXJuIHBlX3NhdmVkX2NvZmZfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEgKGFiZmQsIHZmaWxlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1wZV9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgcGVfZGF0YV90eXBlICpwZTsKLSAgYWJmZC0+dGRhdGEucGVfb2JqX2RhdGEgPSAKLSAgICAoc3RydWN0IHBlX3RkYXRhICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAocGVfZGF0YV90eXBlKSk7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLnBlX29ial9kYXRhID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBlID0gcGVfZGF0YSAoYWJmZCk7Ci0KLSAgcGUtPmNvZmYucGUgPSAxOwotICBwZS0+aW5fcmVsb2NfcCA9IGluX3JlbG9jX3A7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDcmVhdGUgdGhlIENPRkYgYmFja2VuZCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi1zdGF0aWMgUFRSCi1wZV9ta29iamVjdF9ob29rIChhYmZkLCBmaWxlaGRyLCBhb3V0aGRyKQotICAgICBiZmQgKiBhYmZkOwotICAgICBQVFIgZmlsZWhkcjsKLSAgICAgUFRSIGFvdXRoZHI7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICppbnRlcm5hbF9mID0gKHN0cnVjdCBpbnRlcm5hbF9maWxlaGRyICopIGZpbGVoZHI7Ci0gIHBlX2RhdGFfdHlwZSAqcGU7Ci0KLSAgaWYgKHBlX21rb2JqZWN0IChhYmZkKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICBwZSA9IHBlX2RhdGEgKGFiZmQpOwotICBwZS0+Y29mZi5zeW1fZmlsZXBvcyA9IGludGVybmFsX2YtPmZfc3ltcHRyOwotICAvKiBUaGVzZSBtZW1iZXJzIGNvbW11bmljYXRlIGltcG9ydGFudCBjb25zdGFudHMgYWJvdXQgdGhlIHN5bWJvbAotICAgICB0YWJsZSB0byBHREIncyBzeW1ib2wtcmVhZGluZyBjb2RlLiAgVGhlc2UgYGNvbnN0YW50cycKLSAgICAgdW5mb3J0dW5hdGVseSB2YXJ5IGFtb25nIGNvZmYgaW1wbGVtZW50YXRpb25zLi4uICAqLwotICBwZS0+Y29mZi5sb2NhbF9uX2J0bWFzayA9IE5fQlRNQVNLOwotICBwZS0+Y29mZi5sb2NhbF9uX2J0c2hmdCA9IE5fQlRTSEZUOwotICBwZS0+Y29mZi5sb2NhbF9uX3RtYXNrID0gTl9UTUFTSzsKLSAgcGUtPmNvZmYubG9jYWxfbl90c2hpZnQgPSBOX1RTSElGVDsKLSAgcGUtPmNvZmYubG9jYWxfc3ltZXN6ID0gU1lNRVNaOwotICBwZS0+Y29mZi5sb2NhbF9hdXhlc3ogPSBBVVhFU1o7Ci0gIHBlLT5jb2ZmLmxvY2FsX2xpbmVzeiA9IExJTkVTWjsKLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPQotICAgIG9ial9jb252X3RhYmxlX3NpemUgKGFiZmQpID0KLSAgICAgIGludGVybmFsX2YtPmZfbnN5bXM7Ci0KLSAgcGUtPnJlYWxfZmxhZ3MgPSBpbnRlcm5hbF9mLT5mX2ZsYWdzOwotCi0gIGlmICgoaW50ZXJuYWxfZi0+Zl9mbGFncyAmIEZfRExMKSAhPSAwKQotICAgIHBlLT5kbGwgPSAxOwotCi0jaWZkZWYgQ09GRl9JTUFHRV9XSVRIX1BFCi0gIGlmIChhb3V0aGRyKSAKLSAgICBwZS0+cGVfb3B0aGRyID0gKChzdHJ1Y3QgaW50ZXJuYWxfYW91dGhkciAqKWFvdXRoZHIpLT5wZTsKLSNlbmRpZgotCi0jaWZkZWYgQVJNIAotICBpZiAoISBfYmZkX2NvZmZfYXJtX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBpbnRlcm5hbF9mLT5mX2ZsYWdzKSkKLSAgICBjb2ZmX2RhdGEgKGFiZmQpIC0+ZmxhZ3MgPSAwOwotI2VuZGlmCi0gIAotICByZXR1cm4gKFBUUikgcGU7Ci19Ci0KLQotCi0vKiBDb3B5IGFueSBwcml2YXRlIGluZm8gd2UgdW5kZXJzdGFuZCBmcm9tIHRoZSBpbnB1dCBiZmQKLSAgIHRvIHRoZSBvdXRwdXQgYmZkLiAgKi8KLQotI2lmZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotc3RhdGljIGJvb2xlYW4gKCpwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEpCi0gICAgIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpCi0gICAgID0gY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhOwotI3VuZGVmIGNvZmZfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YQotI2Vsc2UKLXN0YXRpYyBib29sZWFuICgqcGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKQotICAgICBQQVJBTVMgKChiZmQgKiwgYmZkICopKQotICAgICA9IE5VTEw7Ci0jZW5kaWYKLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhIHBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLQotc3RhdGljIGJvb2xlYW4KLXBlX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyKQotICAgIHJldHVybiB0cnVlOwotCi0gIHBlX2RhdGEgKG9iZmQpLT5wZV9vcHRoZHIgPSBwZV9kYXRhIChpYmZkKS0+cGVfb3B0aGRyOwotICBwZV9kYXRhIChvYmZkKS0+ZGxsID0gcGVfZGF0YSAoaWJmZCktPmRsbDsKLQotICBpZiAocGVfc2F2ZWRfY29mZl9iZmRfY29weV9wcml2YXRlX2JmZF9kYXRhKQotICAgIHJldHVybiBwZV9zYXZlZF9jb2ZmX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpOwotICAKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLQotLyogQ29weSBwcml2YXRlIHNlY3Rpb24gZGF0YS4gICovCi0KLSNkZWZpbmUgY29mZl9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi1zdGF0aWMgYm9vbGVhbiBwZV9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYmZkICosIGFzZWN0aW9uICopKTsKLQotc3RhdGljIGJvb2xlYW4KLXBlX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjLCBvYmZkLCBvc2VjKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGFzZWN0aW9uICppc2VjOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChpYmZkKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgfHwgYmZkX2dldF9mbGF2b3VyIChvYmZkKSAhPSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpICE9IE5VTEwKLSAgICAgICYmIHBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKSA9PSBOVUxMKQotCXsKLQkgIG9zZWMtPnVzZWRfYnlfYmZkID0KLQkgICAgKFBUUikgYmZkX3phbGxvYyAob2JmZCwgc2l6ZW9mIChzdHJ1Y3QgY29mZl9zZWN0aW9uX3RkYXRhKSk7Ci0JICBpZiAob3NlYy0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChwZWlfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKSA9PSBOVUxMKQotCXsKLQkgIGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dGRhdGEgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBwZWlfc2VjdGlvbl90ZGF0YSkpOwotCSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChvYmZkLCBvc2VjKS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIHBlaV9zZWN0aW9uX2RhdGEgKG9iZmQsIG9zZWMpLT52aXJ0X3NpemUgPQotCXBlaV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWMpLT52aXJ0X3NpemU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JmZC9wby9NYWtlLWluIGIvYmZkL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvYmZkL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvYmZkL3BvL1BPVEZJTEVTLmluIGIvYmZkL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDhmOTg3Li4wMDAwMDAwCi0tLSBhL2JmZC9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi1haXgzODYtY29yZS5jCi1hb3V0LWFkb2JlLmMKLWFvdXQtYXJtLmMKLWFvdXQtbnMzMmsuYwotYW91dC1zcGFyY2xlLmMKLWFvdXQtdGFyZ2V0LmgKLWFvdXQtdGljMzAuYwotYW91dDAuYwotYW91dDMyLmMKLWFvdXQ2NC5jCi1hb3V0ZjEuaAotYW91dHguaAotYXJjaGl2ZS5jCi1hcmNodXJlcy5jCi1iZmQuYwotYmluYXJ5LmMKLWJvdXQuYwotY2FjaGUuYwotY2YtaTM4Nmx5bnguYwotY2YtbTY4a2x5bnguYwotY2Ytc3BhcmNseW54LmMKLWNpc2NvLWNvcmUuYwotY29mZi1hMjlrLmMKLWNvZmYtYWxwaGEuYwotY29mZi1hcG9sbG8uYwotY29mZi1hcm0uYwotY29mZi1hdXguYwotY29mZi1nbzMyLmMKLWNvZmYtaDgzMDAuYwotY29mZi1oODUwMC5jCi1jb2ZmLWkzODYuYwotY29mZi1pODYwLmMKLWNvZmYtaTk2MC5jCi1jb2ZmLW02OGsuYwotY29mZi1tODhrLmMKLWNvZmYtbWlwcy5jCi1jb2ZmLXBtYWMuYwotY29mZi1yczYwMDAuYwotY29mZi1zaC5jCi1jb2ZmLXNwYXJjLmMKLWNvZmYtc3RnbzMyLmMKLWNvZmYtc3ZtNjhrLmMKLWNvZmYtdGljMzAuYwotY29mZi10aWM4MC5jCi1jb2ZmLXU2OGsuYwotY29mZi13NjUuYwotY29mZi13ZTMyay5jCi1jb2ZmLXo4ay5jCi1jb2ZmY29kZS5oCi1jb2ZmZ2VuLmMKLWNvZmZsaW5rLmMKLWNvZmZzd2FwLmgKLWNvcmVmaWxlLmMKLWNwdS1hMjlrLmMKLWNwdS1hbHBoYS5jCi1jcHUtYXJjLmMKLWNwdS1hcm0uYwotY3B1LWQxMHYuYwotY3B1LWQzMHYuYwotY3B1LWZyMzAuYwotY3B1LWg4MzAwLmMKLWNwdS1oODUwMC5jCi1jcHUtaHBwYS5jCi1jcHUtaTM4Ni5jCi1jcHUtaTg2MC5jCi1jcHUtaTk2MC5jCi1jcHUtbTEwMjAwLmMKLWNwdS1tMTAzMDAuYwotY3B1LW0zMnIuYwotY3B1LW02OGsuYwotY3B1LW04OGsuYwotY3B1LW1jb3JlLmMKLWNwdS1taXBzLmMKLWNwdS1uczMyay5jCi1jcHUtcG93ZXJwYy5jCi1jcHUtcnM2MDAwLmMKLWNwdS1zaC5jCi1jcHUtc3BhcmMuYwotY3B1LXRpYzMwLmMKLWNwdS10aWM4MC5jCi1jcHUtdjg1MC5jCi1jcHUtdmF4LmMKLWNwdS13NjUuYwotY3B1LXdlMzJrLmMKLWNwdS16OGsuYwotZGVtbzY0LmMKLWR3YXJmMi5jCi1lY29mZi5jCi1lY29mZmxpbmsuYwotZWNvZmZzd2FwLmgKLWVsZi1iZmQuaAotZWxmLW0xMDIwMC5jCi1lbGYtbTEwMzAwLmMKLWVsZi5jCi1lbGYzMi1hcmMuYwotZWxmMzItZDEwdi5jCi1lbGYzMi1kMzB2LmMKLWVsZjMyLWZyMzAuYwotZWxmMzItZ2VuLmMKLWVsZjMyLWhwcGEuYwotZWxmMzItaHBwYS5oCi1lbGYzMi1pMzg2LmMKLWVsZjMyLWk4NjAuYwotZWxmMzItaTk2MC5jCi1lbGYzMi1tMzJyLmMKLWVsZjMyLW02OGsuYwotZWxmMzItbTg4ay5jCi1lbGYzMi1tY29yZS5jCi1lbGYzMi1taXBzLmMKLWVsZjMyLXBwYy5jCi1lbGYzMi1zaC5jCi1lbGYzMi1zcGFyYy5jCi1lbGYzMi12ODUwLmMKLWVsZjMyLmMKLWVsZjY0LWFscGhhLmMKLWVsZjY0LWdlbi5jCi1lbGY2NC1taXBzLmMKLWVsZjY0LXNwYXJjLmMKLWVsZjY0LmMKLWVsZmFybS1uYWJpLmMKLWVsZmFybS1vYWJpLmMKLWVsZmNvZGUuaAotZWxmbGluay5jCi1mb3JtYXQuYwotZ2VubGluay5oCi1nbzMyc3R1Yi5oCi1oYXNoLmMKLWhwMzAwYnNkLmMKLWhwMzAwaHB1eC5jCi1ocHBhX3N0dWJzLmgKLWhwdXgtY29yZS5jCi1pMzg2YW91dC5jCi1pMzg2YnNkLmMKLWkzODZkeW5peC5jCi1pMzg2ZnJlZWJzZC5jCi1pMzg2bGludXguYwotaTM4Nmx5bnguYwotaTM4Nm1hY2gzLmMKLWkzODZtc2Rvcy5jCi1pMzg2bmV0YnNkLmMKLWkzODZvczlrLmMKLWllZWUuYwotaWhleC5jCi1pbml0LmMKLWlyaXgtY29yZS5jCi1saWJhb3V0LmgKLWxpYmJmZC5jCi1saWJiZmQuaAotbGliY29mZi5oCi1saWJlY29mZi5oCi1saWJocHBhLmgKLWxpYmllZWUuaAotbGlibmxtLmgKLWxpYm9hc3lzLmgKLWxpbmtlci5jCi1seW54LWNvcmUuYwotbTY4azRrbmV0YnNkLmMKLW02OGtsaW51eC5jCi1tNjhrbHlueC5jCi1tNjhrbmV0YnNkLmMKLW04OGttYWNoMy5jCi1taXBzYnNkLmMKLW5ldGJzZC5oCi1uZXdzb3MzLmMKLW5sbS10YXJnZXQuaAotbmxtLmMKLW5sbTMyLWFscGhhLmMKLW5sbTMyLWkzODYuYwotbmxtMzItcHBjLmMKLW5sbTMyLXNwYXJjLmMKLW5sbTMyLmMKLW5sbTY0LmMKLW5sbWNvZGUuaAotbnMzMmsuaAotbnMzMmtuZXRic2QuYwotb2FzeXMuYwotb3BuY2xzLmMKLW9zZi1jb3JlLmMKLXBjNTMyLW1hY2guYwotcGUtYXJtLmMKLXBlLWkzODYuYwotcGUtbWNvcmUuYwotcGUtcHBjLmMKLXBlaS1hcm0uYwotcGVpLWkzODYuYwotcGVpLW1jb3JlLmMKLXBlaS1wcGMuYwotcHBjYm9vdC5jCi1yZWxvYy5jCi1yZWxvYzE2LmMKLXJpc2NpeC5jCi1zY281LWNvcmUuYwotc2VjdGlvbi5jCi1zb20uYwotc29tLmgKLXNwYXJjbGludXguYwotc3BhcmNseW54LmMKLXNwYXJjbmV0YnNkLmMKLXNyZWMuYwotc3RhYi1zeW1zLmMKLXN0YWJzLmMKLXN1bm9zLmMKLXN5bXMuYwotdGFyZ2V0cy5jCi10ZWtoZXguYwotdHJhZC1jb3JlLmMKLXZheG5ldGJzZC5jCi12ZXJzYWRvcy5jCi12bXMtZ3NkLmMKLXZtcy1oZHIuYwotdm1zLW1pc2MuYwotdm1zLXRpci5jCi12bXMuYwotdm1zLmgKLXhjb2ZmbGluay5jCmRpZmYgLS1naXQgYS9iZmQvcG8vYmZkLnBvdCBiL2JmZC9wby9iZmQucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGNkYTE5Li4wMDAwMDAwCi0tLSBhL2JmZC9wby9iZmQucG90CisrKyAvZGV2L251bGwKQEAgLTEsMTQ4OSArMCwwIEBACi0jIFNPTUUgREVTQ1JJUFRJVkUgVElUTEUuCi0jIENvcHlyaWdodCAoQykgWUVBUiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgRklSU1QgQVVUSE9SIDxFTUFJTEBBRERSRVNTPiwgWUVBUi4KLSMKLSMsIGZ1enp5Ci1tc2dpZCAiIgotbXNnc3RyICIiCi0iUHJvamVjdC1JZC1WZXJzaW9uOiBQQUNLQUdFIFZFUlNJT05cbiIKLSJQT1QtQ3JlYXRpb24tRGF0ZTogMTk5OS0wNi0wMyAwMjo1NS0wNzAwXG4iCi0iUE8tUmV2aXNpb24tRGF0ZTogWUVBUi1NTy1EQSBITzpNSStaT05FXG4iCi0iTGFzdC1UcmFuc2xhdG9yOiBGVUxMIE5BTUUgPEVNQUlMQEFERFJFU1M+XG4iCi0iTGFuZ3VhZ2UtVGVhbTogTEFOR1VBR0UgPExMQGxpLm9yZz5cbiIKLSJNSU1FLVZlcnNpb246IDEuMFxuIgotIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1DSEFSU0VUXG4iCi0iQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogRU5DT0RJTkdcbiIKLQotIzogYW91dC1hZG9iZS5jOjE4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5rbm93biBzZWN0aW9uIHR5cGUgaW4gYS5vdXQuYWRvYmUgZmlsZTogJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjEyMzcgYW91dHguaDoxNjUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4gbm90IHJlcHJlc2VudCBzZWN0aW9uIGAlcycgaW4gYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGFvdXR4Lmg6MTYyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gZm9yIHN5bWJvbCBgJXMnIGluIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBhb3V0eC5oOjE2MjMKLW1zZ2lkICIqdW5rbm93bioiCi1tc2dzdHIgIiIKLQotIzogYW91dHguaDozNjY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWxvY2F0ZWFibGUgbGluayBmcm9tICVzIHRvICVzIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXJjaGl2ZS5jOjE3MjQKLW1zZ2lkICJXYXJuaW5nOiB3cml0aW5nIGFyY2hpdmUgd2FzIHNsb3c6IHJld3JpdGluZyB0aW1lc3RhbXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcmNoaXZlLmM6MTk5MAotbXNnaWQgIlJlYWRpbmcgYXJjaGl2ZSBmaWxlIG1vZCB0aW1lc3RhbXAiCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IGJmZCBjYW4ndCBjYWxsIHBlcnJvci4KLSM6IGFyY2hpdmUuYzoyMDE0Ci1tc2dpZCAiV3JpdGluZyB1cGRhdGVkIGFybWFwIHRpbWVzdGFtcCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzQKLW1zZ2lkICJObyBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzUKLW1zZ2lkICJTeXN0ZW0gY2FsbCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyNzYKLW1zZ2lkICJJbnZhbGlkIGJmZCB0YXJnZXQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc3Ci1tc2dpZCAiRmlsZSBpbiB3cm9uZyBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc4Ci1tc2dpZCAiSW52YWxpZCBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjc5Ci1tc2dpZCAiTWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODAKLW1zZ2lkICJObyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI4MQotbXNnaWQgIkFyY2hpdmUgaGFzIG5vIGluZGV4OyBydW4gcmFubGliIHRvIGFkZCBvbmUiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjgyCi1tc2dpZCAiTm8gbW9yZSBhcmNoaXZlZCBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODMKLW1zZ2lkICJNYWxmb3JtZWQgYXJjaGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODQKLW1zZ2lkICJGaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODUKLW1zZ2lkICJGaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjg2Ci1tc2dpZCAiU2VjdGlvbiBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6Mjg3Ci1tc2dpZCAiTm9ucmVwcmVzZW50YWJsZSBzZWN0aW9uIG9uIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODgKLW1zZ2lkICJTeW1ib2wgbmVlZHMgZGVidWcgc2VjdGlvbiB3aGljaCBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzoyODkKLW1zZ2lkICJCYWQgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkwCi1tc2dpZCAiRmlsZSB0cnVuY2F0ZWQiCi1tc2dzdHIgIiIKLQotIzogYmZkLmM6MjkxCi1tc2dpZCAiRmlsZSB0b28gYmlnIgotbXNnc3RyICIiCi0KLSM6IGJmZC5jOjI5MgotbXNnaWQgIiM8SW52YWxpZCBlcnJvciBjb2RlPiIKLW1zZ3N0ciAiIgotCi0jOiBiZmQuYzo2NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkIGFzc2VydGlvbiBmYWlsICVzOiVkIgotbXNnc3RyICIiCi0KLSM6IGJpbmFyeS5jOjI5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBXcml0aW5nIHNlY3Rpb24gYCVzJyB0byBodWdlIChpZSBuZWdhdGl2ZSkgZmlsZSBvZmZzZXQgMHglbHguIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjEyMQotbXNnaWQgIk1pc3NpbmcgSUhDT05TVCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzoxODEKLW1zZ2lkICJNaXNzaW5nIElISUhBTEYiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hMjlrLmM6MjEzCi1tc2dpZCAiVW5yZWNvZ25pemVkIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYTI5ay5jOjQwNgotbXNnaWQgIm1pc3NpbmcgSUhDT05TVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWEyOWsuYzo0OTcKLW1zZ2lkICJtaXNzaW5nIElISUhBTEYgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjg4MCBjb2ZmLWFscGhhLmM6OTE3Ci1tc2dpZCAiR1AgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hbHBoYS5jOjE0ODYgZWxmNjQtYWxwaGEuYzo0MDUxCi1tc2dpZCAidXNpbmcgbXVsdGlwbGUgZ3AgdmFsdWVzIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYWxwaGEuYzoxOTkyIGNvZmYtbWlwcy5jOjE0MzUgZWxmMzItbWlwcy5jOjQ5MjQKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzo4ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBmaW5kIFRIVU1CIGdsdWUgJyVzJyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjkxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIGZpbmQgQVJNIGdsdWUgJyVzJyBmb3IgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjExODggY29mZi1hcm0uYzoxMjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzKCVzKTogd2FybmluZzogaW50ZXJ3b3JraW5nIG5vdCBlbmFibGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjExOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBmaXJzdCBvY2N1cnJlbmNlOiAlczogYXJtIGNhbGwgdG8gdGh1bWIiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxMjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgZmlyc3Qgb2NjdXJyZW5jZTogJXM6IHRodW1iIGNhbGwgdG8gYXJtIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MTI4OQotbXNnaWQgIiAgY29uc2lkZXIgcmVsaW5raW5nIHdpdGggLS1zdXBwb3J0LW9sZC1jb2RlIGVuYWJsZWQiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoxNTc1IGNvZmYtdGljODAuYzo2ODIgY29mZmxpbmsuYzoyNzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgcmVsb2MgYWRkcmVzcyAweCVseCBpbiBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBFUlJPUjogY29tcGlsZWQgZm9yIEFQQ1MtJWQgd2hlcmVhcyB0YXJnZXQgJXMgdXNlcyBBUENTLSVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjA1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IEVSUk9SOiBwYXNzZXMgZmxvYXRzIGluIGZsb2F0IHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGludGVnZXIgIgotInJlZ2lzdGVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogcGFzc2VzIGZsb2F0cyBpbiBpbnRlZ2VyIHJlZ2lzdGVycyB3aGVyZWFzIHRhcmdldCAlcyB1c2VzIGZsb2F0ICIKLSJyZWdpc3RlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogRVJST1I6IGNvbXBpbGVkIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUsIHdoZXJlYXMgdGFyZ2V0ICVzIGlzICIKLSJhYnNvbHV0ZSBwb3NpdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIwNzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBFUlJPUjogY29tcGlsZWQgYXMgYWJzb2x1dGUgcG9zaXRpb24gY29kZSwgd2hlcmVhcyB0YXJnZXQgJXMgaXMgcG9zaXRpb24gIgotImluZGVwZW5kZW50IgotbXNnc3RyICIiCi0KLSM6IGNvZmYtYXJtLmM6MjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiBpbnB1dCBmaWxlICVzIHN1cHBvcnRzIGludGVyd29ya2luZywgd2hlcmVhcyAlcyBkb2VzIG5vdC4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGlucHV0IGZpbGUgJXMgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcsIHdoZXJlYXMgJXMgZG9lcy4iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTMyCi0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAleDoiCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQwCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGZsb2F0IHJlZ2lzdGVyc10iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTQyCi1tc2dpZCAiIFtmbG9hdHMgcGFzc2VkIGluIGludGVnZXIgcmVnaXN0ZXJzXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDUKLW1zZ2lkICIgW3Bvc2l0aW9uIGluZGVwZW5kZW50XSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNDcKLW1zZ2lkICIgW2Fic29sdXRlIHBvc2l0aW9uXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTEKLW1zZ2lkICIgW2ludGVyd29ya2luZyBmbGFnIG5vdCBpbml0aWFsaXNlZF0iCi1tc2dzdHIgIiIKLQotIzogY29mZi1hcm0uYzoyMTUzCi1tc2dpZCAiIFtpbnRlcndvcmtpbmcgc3VwcG9ydGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIxNTUKLW1zZ2lkICIgW2ludGVyd29ya2luZyBub3Qgc3VwcG9ydGVkXSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIldhcm5pbmc6IE5vdCBzZXR0aW5nIGludGVyd29ya2luZyBmbGFnIG9mICVzLCBzaW5jZSBpdCBoYXMgYWxyZWFkeSBiZWVuICIKLSJzcGVjaWZpZWQgYXMgbm9uLWludGVyd29ya2luZyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLWFybS5jOjIyMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogQ2xlYXJpbmcgdGhlIGludGVyd29ya2luZyBmbGFnIG9mICVzIGR1ZSB0byBvdXRzaWRlIHJlcXVlc3QiCi1tc2dzdHIgIiIKLQotIzogY29mZi1pOTYwLmM6MTM1IGNvZmYtaTk2MC5jOjQ4NAotbXNnaWQgInVuY2VydGFpbiBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIG5vbi1DT0ZGIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLW1pcHMuYzo4NzUgZWxmMzItbWlwcy5jOjExMzYKLW1zZ2lkICJHUCByZWxhdGl2ZSByZWxvY2F0aW9uIHdoZW4gX2dwIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjI0MzMKLW1zZ2lkICJ1bnN1cHBvcnRlZCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSMuIE5vIG90aGVyIHNlY3Rpb25zIHNob3VsZCBhcHBlYXIgaW4gLW1lbWJlZGRlZC1waWMKLSMuIGNvZGUuCi0jOiBjb2ZmLW1pcHMuYzoyNDcwCi1tc2dpZCAicmVsb2MgYWdhaW5zdCB1bnN1cHBvcnRlZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvZmYtbWlwcy5jOjI0NzgKLW1zZ2lkICJyZWxvYyBub3QgcHJvcGVybHkgYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmLXRpYzgwLmM6NDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCByZWxvYyB0eXBlIDB4JXgiCi1tc2dzdHIgIiIKLQotIzogY29mZi13NjUuYzozODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgcmVsb2MgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmY29kZS5oOjM0NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGlsbGVnYWwgc3ltYm9sIGluZGV4ICVsZCBpbiBsaW5lIG51bWJlcnMiCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozNDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBkdXBsaWNhdGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozNzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbnJlY29nbml6ZWQgc3RvcmFnZSBjbGFzcyAlZCBmb3IgJXMgc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29mZmNvZGUuaDozOTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBpbGxlZ2FsIHN5bWJvbCBpbmRleCAlbGQgaW4gcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IGNvZmZjb2RlLmg6NDAwMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaWxsZWdhbCByZWxvY2F0aW9uIHR5cGUgJWQgYXQgYWRkcmVzcyAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmZ2VuLmM6MTYwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIHN0cmluZyB0YWJsZSBzaXplICVsdSIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjQyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiB0eXBlIG9mIHN5bWJvbCBgJXMnIGNoYW5nZWQgZnJvbSAlZCB0byAlZCBpbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb2ZmbGluay5jOjIwOTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jcyBpbiBzZWN0aW9uIGAlcycsIGJ1dCBpdCBoYXMgbm8gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogY29mZnN3YXAuaDo4ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6ICVzOiBsaW5lIG51bWJlciBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogY29mZnN3YXAuaDo5MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiByZWxvYyBvdmVyZmxvdzogMHglbHggPiAweGZmZmYiCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6NDIwCi1tc2dpZCAiRHdhcmYgRXJyb3I6IENhbid0IGZpbmQgLmRlYnVnX2FiYnJldiBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEFiYnJldiBvZmZzZXQgKCV1KSBiaWdnZXIgdGhhbiBhYmJyZXYgc2l6ZSAoJXUpLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo2MTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEludmFsaWQgb3IgdW5oYW5kbGVkIEZPUk0gdmFsdWU6ICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo2ODcKLW1zZ2lkICJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uIChiYWQgZmlsZSBudW1iZXIpLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo3MzgKLW1zZ2lkICJEd2FyZiBFcnJvcjogQ2FuJ3QgZmluZCAuZGVidWdfbGluZSBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzo5MDMKLW1zZ2lkICJEd2FyZiBFcnJvcjogbWFuZ2xlZCBsaW5lIG51bWJlciBzZWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBkd2FyZjIuYzoxMDk3IGR3YXJmMi5jOjEyNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IENvdWxkIG5vdCBmaW5kIGFiYnJldiBudW1iZXIgJWQuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjEyMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkR3YXJmIEVycm9yOiBmb3VuZCBkd2FyZiB2ZXJzaW9uICclaHUnLCB0aGlzIHJlYWRlciBvbmx5IGhhbmRsZXMgdmVyc2lvbiAyICIKLSJpbmZvcm1hdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogZHdhcmYyLmM6MTIxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iRHdhcmYgRXJyb3I6IGZvdW5kIGFkZHJlc3Mgc2l6ZSAnJXUnLCB0aGlzIHJlYWRlciBjYW4gbm90IGhhbmRsZSBzaXplcyAiCi0iZ3JlYXRlciB0aGFuICcldScuIgotbXNnc3RyICIiCi0KLSM6IGR3YXJmMi5jOjEyMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRHdhcmYgRXJyb3I6IEJhZCBhYmJyZXYgbnVtYmVyOiAlZC4iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxMzA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gYmFzaWMgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE1ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTU4NyBlY29mZi5jOjE1OTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIEZpcnN0IHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgRW5kKzEgc3ltYm9sOiAlLTdsZCAgIFR5cGU6ICAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIExvY2FsIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYxNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgc3RydWN0OyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIHVuaW9uOyBFbmQrMSBzeW1ib2w6ICVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjE2MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiAgICAgIGVudW07IEVuZCsxIHN5bWJvbDogJWxkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iICAgICAgVHlwZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ1NSBlbGYtbTEwMzAwLmM6NjY3IGVsZjMyLWQxMHYuYzo0OTAgZWxmMzItZnIzMC5jOjY1MAotIzogZWxmMzItbTMyci5jOjExNTcgZWxmMzItdjg1MC5jOjE2NzQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogb3V0IG9mIHJhbmdlIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NTkgZWxmLW0xMDMwMC5jOjY3MSBlbGYzMi1kMTB2LmM6NDk0IGVsZjMyLWZyMzAuYzo2NTQKLSM6IGVsZjMyLW0zMnIuYzoxMTYxIGVsZjMyLXY4NTAuYzoxNjc4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLW0xMDIwMC5jOjQ2MyBlbGYtbTEwMzAwLmM6Njc1IGVsZjMyLWQxMHYuYzo0OTggZWxmMzItbTMyci5jOjExNjUKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGVsZi1tMTAyMDAuYzo0NjcgZWxmLW0xMDMwMC5jOjY3OSBlbGYzMi1kMTB2LmM6NTAyIGVsZjMyLWZyMzAuYzo2NjIKLSM6IGVsZjMyLW0zMnIuYzoxMTY5IGVsZjMyLXY4NTAuYzoxNjk4Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IHVua25vd24gZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIHN0cmluZyBvZmZzZXQgJXUgPj0gJWx1IGZvciBzZWN0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NTQzCi1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjU5MQotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIFNlY3Rpb246XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NjkzCi1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gZGVmaW5pdGlvbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NzE2Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gUmVmZXJlbmNlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzo3MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICByZXF1aXJlZCBmcm9tICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjE4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImNyZWF0aW5nIHNlY3Rpb24gc3ltYm9sLCBuYW1lID0gJXMsIHZhbHVlID0gMHglLjhseCwgaW5kZXggPSAlZCwgc2VjdGlvbiA9ICIKLSIweCUuOGx4XG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjQ5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMgKGFsbG9jYXRlZCAldSwgbmVlZCAldSkiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjU5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTm90IGVub3VnaCByb29tIGZvciBwcm9ncmFtIGhlYWRlcnMsIHRyeSBsaW5raW5nIHdpdGggLU4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjcxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvcjogRmlyc3Qgc2VjdGlvbiBpbiBzZWdtZW50ICglcykgc3RhcnRzIGF0IDB4JXgiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MjcyMgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICAgICAgd2hlcmVhcyBzZWdtZW50IHN0YXJ0cyBhdCAweCV4IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjI5OTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IGFsbG9jYXRlZCBzZWN0aW9uIGAlcycgbm90IGluIHNlZ21lbnQiCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6MzM2NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgcmVxdWlyZWQgYnV0IG5vdCBwcmVzZW50IgotbXNnc3RyICIiCi0KLSM6IGVsZi5jOjMzNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImVsZl9zeW1ib2xfZnJvbV9iZmRfc3ltYm9sIDB4JS44bHgsIG5hbWUgPSAlcywgc3ltIG51bSA9ICVkLCBmbGFncyA9ICIKLSIweCUuOGx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYuYzozNTE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBFbXB0eSBsb2FkYWJsZSBzZWdtZW50IGRldGVjdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogZWxmLmM6NDc5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlICVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWZyMzAuYzo2NTggZWxmMzItdjg1MC5jOjE2ODIKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogZGFuZ2Vyb3VzIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItaHBwYS5jOjEyMTUKLW1zZ2lkICJVbnN1cHBvcnRlZCBjYWxsIHRvIGhwcGFfZWxmX3JlbG9jIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLWkzODYuYzoxMjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogd2FybmluZzogdW5yZXNvbHZhYmxlIHJlbG9jYXRpb24gYWdhaW5zdCBzeW1ib2wgYCVzJyBmcm9tICVzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjgwOAotbXNnaWQgIlNEQSByZWxvY2F0aW9uIHdoZW4gX1NEQV9CQVNFXyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tMzJyLmM6ODkyIGVsZjMyLXBwYy5jOjMwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxMTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYW4gJXMgcmVsb2NhdGlvbiBpcyBpbiB0aGUgd3Jvbmcgc2VjdGlvbiAoJXMpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBJbnN0cnVjdGlvbiBzZXQgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW0zMnIuYzoxOTIzCi0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHgiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbTMyci5jOjE5MjgKLW1zZ2lkICI6IG0zMnIgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSMuIElnbm9yZSBpbml0IGZsYWcgLSBpdCBtYXkgbm90IGJlIHNldCwgZGVzcGl0ZSB0aGUgZmxhZ3MgZmllbGQgY29udGFpbmluZyB2YWxpZCBkYXRhLgotIzogZWxmMzItbTY4ay5jOjQzMiBlbGYzMi1taXBzLmM6MjMwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJwcml2YXRlIGZsYWdzID0gJWx4OiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tNjhrLmM6NDM1Ci1tc2dpZCAiIFtjcHUzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWNvcmUuYzozMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvbXBpbGVkIGZvciBhICVzIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyAlcyBlbmRpYW4uXG4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWNvcmUuYzozNzQgZWxmMzItbWNvcmUuYzo1MDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFJlbG9jYXRpb24gJXMgKCVkKSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1tY29yZS5jOjQ2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogVW5rbm93biByZWxvY2F0aW9uIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MTI5NgotbXNnaWQgIjMyYml0cyBncCByZWxhdGl2ZSByZWxvY2F0aW9uIG9jY3VycyBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoxNDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxpbmtpbmcgbWlwczE2IG9iamVjdHMgaW50byAlcyBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjE0MSBlbGYzMi1wcGMuYzoxNDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSBiaWcgZW5kaWFuIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIGxpdHRsZSBlbmRpYW4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIxNDMgZWxmMzItcHBjLmM6MTQxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgbGl0dGxlIGVuZGlhbiBzeXN0ZW0gYW5kIHRhcmdldCBpcyBiaWcgZW5kaWFuIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMTkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsaW5raW5nIFBJQyBmaWxlcyB3aXRoIG5vbi1QSUMgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyMDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgYWJpY2FsbHMgZmlsZXMgd2l0aCBub24tYWJpY2FsbHMgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IElTQSBtaXNtYXRjaCAoLW1pcHMlZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICgtbWlwcyVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogSVNBIG1pc21hdGNoICglZCkgd2l0aCBwcmV2aW91cyBtb2R1bGVzICglZCkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIyNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IEFCSSBtaXNtYXRjaDogbGlua2luZyAlcyBtb2R1bGUgd2l0aCBwcmV2aW91cyAlcyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMjcyIGVsZjMyLXBwYy5jOjE0NzkgZWxmNjQtc3BhcmMuYzoyMTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1c2VzIGRpZmZlcmVudCBlX2ZsYWdzICgweCVseCkgZmllbGRzIHRoYW4gcHJldmlvdXMgbW9kdWxlcyAoMHglbHgpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzAzCi1tc2dpZCAiIFthYmk9TzMyXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMwNQotbXNnaWQgIiBbYWJpPU82NF0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMDcKLW1zZ2lkICIgW2FiaT1FQUJJMzJdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzA5Ci1tc2dpZCAiIFthYmk9RUFCSTY0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMxMQotbXNnaWQgIiBbYWJpIHVua25vd25dIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzEzCi1tc2dpZCAiIFtubyBhYmkgc2V0XSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMxNgotbXNnaWQgIiBbbWlwczFdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzE4Ci1tc2dpZCAiIFttaXBzMl0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjAKLW1zZ2lkICIgW21pcHMzXSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1taXBzLmM6MjMyMgotbXNnaWQgIiBbbWlwczRdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzoyMzI0Ci1tc2dpZCAiIFt1bmtub3duIElTQV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjcKLW1zZ2lkICIgWzMyYml0bW9kZV0iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjIzMjkKLW1zZ2lkICIgW25vdCAzMmJpdG1vZGVdIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzozODk3Ci1tc2dpZCAic3RhdGljIHByb2NlZHVyZSAobm8gbmFtZSkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjQ0NzAgZWxmNjQtYWxwaGEuYzo0NDI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbGxlZ2FsIHNlY3Rpb24gbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLW1pcHMuYzo0Nzc3Ci1tc2dpZCAibW9yZSBnb3QgZW50cmllcyBhcmUgbmVlZGVkIGZvciBoaXBhZ2UgcmVsb2NhdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjUwODEKLW1zZ2lkICJfZ3BfZGlzcCB1c2VkIHdoZW4gR1Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjU0OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzKzB4JWx4OiBqdW1wIHRvIG1pcHMxNiByb3V0aW5lIHdoaWNoIGlzIG5vdCBqYWwiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItbWlwcy5jOjYyNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENBTEwxNiByZWxvYyBhdCAweCVseCBub3QgYWdhaW5zdCBnbG9iYWwgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjE0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBjb21waWxlZCB3aXRoIC1tcmVsb2NhdGFibGUgYW5kIGxpbmtlZCB3aXRoIG1vZHVsZXMgY29tcGlsZWQgbm9ybWFsbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MTQ1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IGNvbXBpbGVkIG5vcm1hbGx5IGFuZCBsaW5rZWQgd2l0aCBtb2R1bGVzIGNvbXBpbGVkIHdpdGggLW1yZWxvY2F0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1wcGMuYzoxNTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBVbmtub3duIHNwZWNpYWwgbGlua2VyIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MjMxMSBlbGYzMi1wcGMuYzoyMzQ1IGVsZjMyLXBwYy5jOjIzODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHJlbG9jYXRpb24gJXMgY2Fubm90IGJlIHVzZWQgd2hlbiBtYWtpbmcgYSBzaGFyZWQgb2JqZWN0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjMyMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlICVkIGZvciBzeW1ib2wgJXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItcHBjLmM6MzU4MyBlbGYzMi1wcGMuYzozNjA1IGVsZjMyLXBwYy5jOjM2NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBUaGUgdGFyZ2V0ICglcykgb2YgYSAlcyByZWxvY2F0aW9uIGlzIGluIHRoZSB3cm9uZyBvdXRwdXQgc2VjdGlvbiAoJXMpIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXBwYy5jOjM3MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFJlbG9jYXRpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQgZm9yIHN5bWJvbCAlcy4iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo2NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBiYWQgUl9TSF9VU0VTIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjY4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IFJfU0hfVVNFUyBwb2ludHMgdG8gdW5yZWNvZ25pemVkIGluc24gMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjcwMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBSX1NIX1VTRVMgbG9hZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo3MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjc1NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IHN5bWJvbCBpbiB1bmV4cGVjdGVkIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc2guYzo4NzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IDB4JWx4OiB3YXJuaW5nOiBjb3VsZCBub3QgZmluZCBleHBlY3RlZCBDT1VOVCByZWxvYyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjg4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogMHglbHg6IHdhcm5pbmc6IGJhZCBjb3VudCIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi1zaC5jOjEyNzEgZWxmMzItc2guYzoxNjA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAweCVseDogZmF0YWw6IHJlbG9jIG92ZXJmbG93IHdoaWxlIHJlbGF4aW5nIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTUwMiBlbGY2NC1zcGFyYy5jOjE1NzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHByb2JhYmx5IGNvbXBpbGVkIHdpdGhvdXQgLWZQSUM/IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTkyMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzIHN5c3RlbSBhbmQgdGFyZ2V0IGlzIHY4IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTkzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY29tcGlsZWQgZm9yIGEgdjhwbHVzYSBzeXN0ZW0gYW5kIHRhcmdldCBpcyB2OHBsdXMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItc3BhcmMuYzoxOTQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb21waWxlZCBmb3IgYSA2NCBiaXQgc3lzdGVtIGFuZCB0YXJnZXQgaXMgMzIgYml0IgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXNwYXJjLmM6MTk1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbGlua2luZyBsaXR0bGUgZW5kaWFuIGZpbGVzIHdpdGggYmlnIGVuZGlhbiBmaWxlcyIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6NjgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlZhcmlhYmxlIGAlcycgY2Fubm90IG9jY3VweSBpbiBtdWx0aXBsZSBzbWFsbCBkYXRhIHJlZ2lvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW4gb25seSBiZSBpbiBvbmUgb2YgdGhlIHNtYWxsLCB6ZXJvLCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgemVybyBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCBzbWFsbCBhbmQgdGlueSBkYXRhIHJlZ2lvbnMgc2ltdWx0YW5lb3VzbHkiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjY5MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVmFyaWFibGUgYCVzJyBjYW5ub3QgYmUgaW4gYm90aCB6ZXJvIGFuZCB0aW55IGRhdGEgcmVnaW9ucyBzaW11bHRhbmVvdXNseSIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTA3MQotbXNnaWQgIkZBSUxFRCB0byBmaW5kIHByZXZpb3VzIEhJMTYgcmVsb2NcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTY4NgotbXNnaWQgImNvdWxkIG5vdCBsb2NhdGUgc3BlY2lhbCBsaW5rZXIgc3ltYm9sIF9fZ3AiCi1tc2dzdHIgIiIKLQotIzogZWxmMzItdjg1MC5jOjE2OTAKLW1zZ2lkICJjb3VsZCBub3QgbG9jYXRlIHNwZWNpYWwgbGlua2VyIHN5bWJvbCBfX2VwIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxNjk0Ci1tc2dpZCAiY291bGQgbm90IGxvY2F0ZSBzcGVjaWFsIGxpbmtlciBzeW1ib2wgX19jdGJwIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBBcmNoaXRlY3R1cmUgbWlzbWF0Y2ggd2l0aCBwcmV2aW91cyBtb2R1bGVzIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxODk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInByaXZhdGUgZmxhZ3MgPSAlbHg6ICIKLW1zZ3N0ciAiIgotCi0jOiBlbGYzMi12ODUwLmM6MTkwNAotbXNnaWQgInY4NTAgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTA1Ci1tc2dpZCAidjg1MGUgYXJjaGl0ZWN0dXJlIgotbXNnc3RyICIiCi0KLSM6IGVsZjMyLXY4NTAuYzoxOTA2Ci1tc2dpZCAidjg1MGVhIGFyY2hpdGVjdHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1hbHBoYS5jOjk0OQotbXNnaWQgIkdQRElTUCByZWxvY2F0aW9uIGRpZCBub3QgZmluZCBsZGFoIGFuZCBsZGEgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGVsZjY0LWFscGhhLmM6Mjk5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogLmdvdCBzdWJzZWdtZW50IGV4Y2VlZHMgNjRLIChzaXplICVkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjgxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2hlY2tfcmVsb2NzOiB1bmhhbmRsZWQgcmVsb2MgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBlbGY2NC1zcGFyYy5jOjIxODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGxpbmtpbmcgVWx0cmFTUEFSQyBzcGVjaWZpYyB3aXRoIEhBTCBzcGVjaWZpYyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGVsZmNvZGUuaDoxMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB2ZXJzaW9uIGNvdW50ICglbGQpIGRvZXMgbm90IG1hdGNoIHN5bWJvbCBjb3VudCAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBlbGZsaW5rLmM6MzE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBTZWN0aW9uICVzIGlzIGFscmVhZHkgdG8gbGFyZ2UgdG8gcHV0IGhvbGUgb2YgJWxkIGJ5dGVzIGluIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjQ0OSBtNjhrbGludXguYzo0NTMgc3BhcmNsaW51eC5jOjQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogaTM4NmxpbnV4LmM6NDU3IG02OGtsaW51eC5jOjQ2MSBzcGFyY2xpbnV4LmM6NDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBpMzg2bGludXguYzo2NDUgaTM4NmxpbnV4LmM6Njk1IG02OGtsaW51eC5jOjY1MiBtNjhrbGludXguYzo3MDAKLSM6IHNwYXJjbGludXguYzo2NDggc3BhcmNsaW51eC5jOjY5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIgotbXNnc3RyICIiCi0KLSM6IGkzODZsaW51eC5jOjcxOSBtNjhrbGludXguYzo3MjQgc3BhcmNsaW51eC5jOjcyMgotbXNnaWQgIldhcm5pbmc6IGZpeHVwIGNvdW50IG1pc21hdGNoXG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE2NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3RyaW5nIHRvbyBsb25nICglZCBjaGFycywgbWF4IDY1NTM1KSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlY29nbml6ZWQgc3ltYm9sIGAlcycgZmxhZ3MgMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmltcGxlbWVudGVkIEFUSSByZWNvcmQgICV1IGZvciBzeW1ib2wgJXUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjgxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBBVE4gdHlwZSAlZCBpbiBleHRlcm5hbCBwYXJ0IgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo4NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgdHlwZSBhZnRlciBBVE4iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjI1OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogdW5leHBlY3RlZCBjaGFyYWN0ZXIgYCVzJyBpbiBJbnRlbCBIZXggZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzozNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBjaGVja3N1bSBpbiBJbnRlbCBIZXggZmlsZSAoZXhwZWN0ZWQgJXUsIGZvdW5kICV1KSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgYWRkcmVzcyByZWNvcmQgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IGJhZCBleHRlbmRlZCBzdGFydCBhZGRyZXNzIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIGFkZHJlc3MgcmVjb3JkIGxlbmd0aCBpbiBJbnRlbCBIZXggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NDcyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiVkOiBiYWQgZXh0ZW5kZWQgbGluZWFyIHN0YXJ0IGFkZHJlc3MgbGVuZ3RoIGluIEludGVsIEhleCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGloZXguYzo0ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JWQ6IHVucmVjb2duaXplZCBpaGV4IHR5cGUgJXUgaW4gSW50ZWwgSGV4IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NjA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnRlcm5hbCBlcnJvciBpbiBpaGV4X3JlYWRfc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpaGV4LmM6NjQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBiYWQgc2VjdGlvbiBsZW5ndGggaW4gaWhleF9yZWFkX3NlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWhleC5jOjg1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYWRkcmVzcyAweCVzIG91dCBvZiByYW5nZSBmb3IgSW50ZXggSGV4IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogbGliYmZkLmM6NDgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vdCBtYXBwaW5nOiBkYXRhPSVseCBtYXBwZWQ9JWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaWJiZmQuYzo0ODQKLW1zZ2lkICJub3QgbWFwcGluZzogZW52IHZhciBub3Qgc2V0XG4iCi1tc2dzdHIgIiIKLQotIzogbGlua2VyLmM6MjY3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIGRvIHJlbG9jYXRlYWJsZSBsaW5rIHdpdGggJXMgaW5wdXQgYW5kICVzIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBvYXN5cy5jOjEwMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYCVzJyBpbiBvYXN5cyIKLW1zZ3N0ciAiIgotCi0jOiBvc2YtY29yZS5jOjE0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmhhbmRsZWQgT1NGLzEgY29yZSBmaWxlIHNlY3Rpb24gdHlwZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MTgKLW1zZ2lkICIiCi0iXG4iCi0icHBjYm9vdCBoZWFkZXI6XG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJFbnRyeSBvZmZzZXQgICAgICAgID0gMHglLjhseCAoJWxkKVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoICAgICAgICAgICAgICA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDIzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZsYWcgZmllbGQgICAgICAgICAgPSAweCUuMnhcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvbiBuYW1lICAgICAgPSBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDQ4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJQYXJ0aXRpb25bJWRdIHN0YXJ0ICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIKLW1zZ3N0ciAiIgotCi0jOiBwcGNib290LmM6NDU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlBhcnRpdGlvblslZF0gZW5kICAgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIgotbXNnc3RyICIiCi0KLSM6IHBwY2Jvb3QuYzo0NjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUGFydGl0aW9uWyVkXSBzZWN0b3IgPSAweCUuOGx4ICglbGQpXG4iCi1tc2dzdHIgIiIKLQotIzogcHBjYm9vdC5jOjQ2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJQYXJ0aXRpb25bJWRdIGxlbmd0aCA9IDB4JS44bHggKCVsZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb20uYzo1Mjc2Ci1tc2dpZCAic29tX3NpemVvZl9oZWFkZXJzIHVuaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogc3JlYy5jOjI5MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogVW5leHBlY3RlZCBjaGFyYWN0ZXIgYCVzJyBpbiBTLXJlY29yZCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3ltcy5jOjkyMgotbXNnaWQgIlVuc3VwcG9ydGVkIC5zdGFiIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogdm1zLWdzZC5jOjY5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGdzZC9lZ3NkIHN1YnR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLWhkci5jOjQwNwotbXNnaWQgIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6NTM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN0YWNrIG92ZXJmbG93ICglZCkgaW4gX2JmZF92bXNfcHVzaCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtbWlzYy5jOjU1OAotbXNnaWQgIlN0YWNrIHVuZGVyZmxvdyBpbiBfYmZkX3Ztc19wb3AiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzo5MjkKLW1zZ2lkICJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB6ZXJvIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6OTM0Ci1tc2dpZCAiX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgY2FsbGVkIHdpdGggdG9vIG1hbnkgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLW1pc2MuYzoxMDY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyByZXBsYWNlZCBieSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHZtcy1taXNjLmM6MTEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gZW50ZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY5Ci1tc2dpZCAiTm8gTWVtICEiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMwOQotbXNnaWQgIkJhZCBzZWN0aW9uIGluZGV4IGluIEVUSVJfU19DX1NUQV9QUSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuc3VwcG9ydGVkIFNUQSBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjMyOSB2bXMtdGlyLmM6MTI4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBTVEEgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo0MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRVRJUl9TX0NfU1RPX0dCTDogbm8gc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkVUSVJfU19DX1NUT19DQTogbm8gc3ltYm9sIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NDcwCi1tc2dpZCAiRVRJUl9TX0NfU1RPX1JCL0FCOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1MjgKLW1zZ2lkICJFVElSX1NfQ19TVE9fTFBfUFNCOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo1MzQKLW1zZ2lkICJFVElSX1NfQ19TVE9fSElOVF9HQkw6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTQwCi1tc2dpZCAiRVRJUl9TX0NfU1RPX0hJTlRfUFM6IG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NTQ0IHZtcy10aXIuYzoxNDYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIFNUTyBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjY1NwotbXNnaWQgIkVUSVJfU19DX09QUl9JTlNWOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2NzUKLW1zZ2lkICJFVElSX1NfQ19PUFJfVVNIOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo2ODEKLW1zZ2lkICJFVElSX1NfQ19PUFJfUk9UOiBOb3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo3MDAKLW1zZ2lkICJFVElSX1NfQ19PUFJfUkVERUY6IE5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjcwNgotbXNnaWQgIkVUSVJfU19DX09QUl9ERkxJVDogTm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6NzEwIHZtcy10aXIuYzoxNjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlc2VydmVkIE9QUiBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjc3OSB2bXMtdGlyLmM6MTcyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXNlcnZlZCBDVEwgY21kICVkIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzo4MDgKLW1zZ2lkICJFVElSX1NfQ19TVENfTFA6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgyNgotbXNnaWQgIkVUSVJfU19DX1NUQ19HQkw6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjgzNAotbXNnaWQgIkVUSVJfU19DX1NUQ19HQ0E6IG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjg0MwotbXNnaWQgIkVUSVJfU19DX1NUQ19QUzogbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKiBzdGFjayBieXRlIGZyb20gaW1hZ2UKLSMuICogYXJnOiAtCi0jLiAqCi0jLgotIzogdm1zLXRpci5jOjExODkKLW1zZ2lkICJTdGFjay1mcm9tLWltYWdlIG5vdCBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTIwOQotbXNnaWQgIlN0YWNrLWVudHJ5LW1hc2sgbm90IGZ1bGx5IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqIGNvbXBhcmUgcHJvY2VkdXJlIGFyZ3VtZW50Ci0jLiAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLSMuICoJYnkJYXJndW1lbnQgaW5kZXgKLSMuICoJZGEJYXJndW1lbnQgZGVzY3JpcHRvcgotIy4gKgotIy4gKiBjb21wYXJlIGFyZ3VtZW50IGRlc2NyaXB0b3Igd2l0aCBzeW1ib2wgYXJndW1lbnQgKEFSRyRWX1BBU1NNRUNIKQotIy4gKiBhbmQgc3RhY2sgVFJVRSAoYXJncyBtYXRjaCkgb3IgRkFMU0UgKGFyZ3MgZG9udCBtYXRjaCkgdmFsdWUKLSMuCi0jOiB2bXMtdGlyLmM6MTIyNQotbXNnaWQgIlBBU1NNRUNIIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI0NQotbXNnaWQgIlN0YWNrLWxvY2FsLXN5bWJvbCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjEyNjAKLW1zZ2lkICJTdGFjay1saXRlcmFsIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTI4MgotbXNnaWQgIlN0YWNrLWxvY2FsLXN5bWJvbC1lbnRyeS1wb2ludC1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmltcGxlbWVudGVkIFNUTyBjbWQgJWQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjE1OTgKLW1zZ2lkICJUSVJfU19DX09QUl9BU0ggaW5jb21wbGV0ZSIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTYxMgotbXNnaWQgIlRJUl9TX0NfT1BSX1VTSCBpbmNvbXBsZXRlIgotbXNnc3RyICIiCi0KLSM6IHZtcy10aXIuYzoxNjI2Ci1tc2dpZCAiVElSX1NfQ19PUFJfUk9UIGluY29tcGxldGUiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogcmVkZWZpbmUgc3ltYm9sIHRvIGN1cnJlbnQgbG9jYXRpb24KLSMuCi0jOiB2bXMtdGlyLmM6MTY0NwotbXNnaWQgIlRJUl9TX0NfT1BSX1JFREVGIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIy4KLSMuICogZGVmaW5lIGEgbGl0ZXJhbAotIy4KLSM6IHZtcy10aXIuYzoxNjU0Ci1tc2dpZCAiVElSX1NfQ19PUFJfREZMSVQgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcwOQotbXNnaWQgIlRJUl9TX0NfQ1RMX0RGTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcxNwotbXNnaWQgIlRJUl9TX0NfQ1RMX1NUTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTcyNQotbXNnaWQgIlRJUl9TX0NfQ1RMX1NUS0RMIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB2bXMtdGlyLmM6MTc4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJPYmogY29kZSAlZCBub3QgZm91bmQiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjIxMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU0VDX1JFTE9DIHdpdGggbm8gcmVsb2NzIGluIHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogdm1zLXRpci5jOjI0MDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5oYW5kbGVkIHJlbG9jYXRpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTY2MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYCVzJyBoYXMgbGluZSBudW1iZXJzIGJ1dCBubyBlbmNsb3Npbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzEzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjbGFzcyAlZCBzeW1ib2wgYCVzJyBoYXMgbm8gYXV4IGVudHJpZXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MTczNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBjc2VjdCB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjE3NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCBYVFlfRVIgc3ltYm9sIGAlcyc6IGNsYXNzICVkIHNjbnVtICVkIHNjbmxlbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxNzg3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBYTUNfVEMwIHN5bWJvbCBgJXMnIGlzIGNsYXNzICVkIHNjbmxlbiAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxOTExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzeW1ib2wgYCVzJyBoYXMgdW5yZWNvZ25pemVkIHNtY2xhcyAlZCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoxOTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjc2VjdCBgJXMnIG5vdCBpbiBlbmNsb3Npbmcgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyMDM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBtaXNwbGFjZWQgWFRZX0xEIGAlcyciCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6MjM0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVsb2MgJXM6JWQgbm90IGluIGNzZWN0IgotbXNnc3RyICIiCi0KLSM6IHhjb2ZmbGluay5jOjI0ODAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFhDT0ZGIHNoYXJlZCBvYmplY3Qgd2hlbiBub3QgcHJvZHVjaW5nIFhDT0ZGIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzoyNTAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkeW5hbWljIG9iamVjdCB3aXRoIG5vIC5sb2FkZXIgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzozMTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBzdWNoIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzozNzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndhcm5pbmc6IGF0dGVtcHQgdG8gZXhwb3J0IHVuZGVmaW5lZCBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo0NzA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRPQyBvdmVyZmxvdzogMHglbHggPiAweDEwMDAwOyB0cnkgLW1taW5pbWFsLXRvYyB3aGVuIGNvbXBpbGluZyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTI5IHhjb2ZmbGluay5jOjU4ODUgeGNvZmZsaW5rLmM6NTkyMiB4Y29mZmxpbmsuYzo2MjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTUxIHhjb2ZmbGluay5jOjYyNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGAlcycgaW4gbG9hZGVyIHJlbG9jIGJ1dCBub3QgbG9hZGVyIHN5bSIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo1NTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBsb2FkZXIgcmVsb2MgaW4gcmVhZC1vbmx5IHNlY3Rpb24gJXMiCi1tc2dzdHIgIiIKLQotIzogeGNvZmZsaW5rLmM6NjQ0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIDB4JTAyeCIKLW1zZ3N0ciAiIgotCi0jOiB4Y29mZmxpbmsuYzo2NDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBUT0MgcmVsb2MgYXQgMHgleCB0byBzeW1ib2wgYCVzJyB3aXRoIG5vIFRPQyBlbnRyeSIKLW1zZ3N0ciAiIgpkaWZmIC0tZ2l0IGEvYmZkL3BwY2Jvb3QuYyBiL2JmZC9wcGNib290LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZGE0MDcuLjAwMDAwMDAKLS0tIGEvYmZkL3BwY2Jvb3QuYworKysgL2Rldi9udWxsCkBAIC0xLDUzNSArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFBQQ2J1ZyBib290IHJlY29yZHMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWljaGFlbCBNZWlzc25lciwgQ3lnbnVzIFN1cHBvcnQsIDxtZWlzc25lckBjeWdudXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBCRkQgYmFja2VuZCB3aGljaCBtYXkgYmUgdXNlZCB0byB3cml0ZSBQb3dlclBDQnVnIGJvb3Qgb2JqZWN0cy4KLSAgIEl0IG1heSBvbmx5IGJlIHVzZWQgZm9yIG91dHB1dCwgbm90IGlucHV0LiAgVGhlIGludGVudGlvbiBpcyB0aGF0IHRoaXMgbWF5Ci0gICBiZSB1c2VkIGFzIGFuIG91dHB1dCBmb3JtYXQgZm9yIG9iamNvcHkgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgcmF3IGJpbmFyeQotICAgZGF0YS4KLQotICAgVGhpcyBpcyB2ZXJ5IHNpbXBsZS4gIFRoZSBvbmx5IGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRoZSByZWFsIGRhdGEKLSAgIHdpbGwgc3RhcnQgYXQgc29tZSBhZGRyZXNzIFgsIGFuZCBpbiBzb21lIGNhc2VzIHdlIHdpbGwgbm90IHdhbnQgdG8KLSAgIGluY2x1ZGUgWCB6ZXJvZXMganVzdCB0byBnZXQgdG8gdGhhdCBwb2ludC4gIFNpbmNlIHRoZSBzdGFydAotICAgYWRkcmVzcyBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQsIHdlIHVzZSBpdAotICAgaW5zdGVhZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBzdGFydCBvZgotICAgdGhlIGZpbGUuICBvYmpjb3B5IGNvb3BlcmF0ZXMgYnkgc3BlY2lhbGx5IHNldHRpbmcgdGhlIHN0YXJ0Ci0gICBhZGRyZXNzIHRvIHplcm8gYnkgZGVmYXVsdC4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLS8qIFBQQ2J1ZyBsb2NhdGlvbiBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfbG9jYXRpb24gewotICBiZmRfYnl0ZQlpbmQ7Ci0gIGJmZF9ieXRlCWhlYWQ7Ci0gIGJmZF9ieXRlCXNlY3RvcjsKLSAgYmZkX2J5dGUJY3lsaW5kZXI7Ci19IHBwY2Jvb3RfbG9jYXRpb25fdDsKLQotLyogUFBDYnVnIHBhcnRpdGlvbiB0YWJsZSBsYXlvdXQgKi8KLXR5cGVkZWYgc3RydWN0IHBwY2Jvb3RfcGFydGl0aW9uIHsKLSAgcHBjYm9vdF9sb2NhdGlvbl90CXBhcnRpdGlvbl9iZWdpbjsJLyogcGFydGl0aW9uIGJlZ2luICovCi0gIHBwY2Jvb3RfbG9jYXRpb25fdAlwYXJ0aXRpb25fZW5kOwkJLyogcGFydGl0aW9uIGVuZCAqLwotICBiZmRfYnl0ZQkJc2VjdG9yX2JlZ2luWzRdOwkvKiAzMi1iaXQgc3RhcnQgUkJBICh6ZXJvLWJhc2VkKSwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJc2VjdG9yX2xlbmd0aFs0XTsJLyogMzItYml0IFJCQSBjb3VudCAob25lLWJhc2VkKSwgbGl0dGxlIGVuZGlhbiAqLwotfSBwcGNib290X3BhcnRpdGlvbl90OwotCi0vKiBQUENidWcgYm9vdCBsYXlvdXQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgcHBjYm9vdF9oZHIgewotICBiZmRfYnl0ZQkJcGNfY29tcGF0aWJpbGl0eVs0NDZdOwkvKiB4ODYgaW5zdHJ1Y3Rpb24gZmllbGQgKi8KLSAgcHBjYm9vdF9wYXJ0aXRpb25fdAlwYXJ0aXRpb25bNF07CQkvKiBwYXJ0aXRpb24gaW5mb3JtYXRpb24gKi8KLSAgYmZkX2J5dGUJCXNpZ25hdHVyZVsyXTsJCS8qIDB4NTUgYW5kIDB4YWEgKi8KLSAgYmZkX2J5dGUJCWVudHJ5X29mZnNldFs0XTsJLyogZW50cnkgcG9pbnQgb2Zmc2V0LCBsaXR0bGUgZW5kaWFuICovCi0gIGJmZF9ieXRlCQlsZW5ndGhbNF07CQkvKiBsb2FkIGltYWdlIGxlbmd0aCwgbGl0dGxlIGVuZGlhbiAqLwotICBiZmRfYnl0ZQkJZmxhZ3M7CQkJLyogZmxhZyBmaWVsZCAqLwotICBiZmRfYnl0ZQkJb3NfaWQ7CQkJLyogT1NfSUQgKi8KLSAgY2hhcgkJCXBhcnRpdGlvbl9uYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUgKi8KLSAgYmZkX2J5dGUJCXJlc2VydmVkMVs0NzBdOwkJLyogcmVzZXJ2ZWQgKi8KLX0gcHBjYm9vdF9oZHJfdDsKLQotLyogU2lnbmF0dXJlIGJ5dGVzIGZvciBsYXN0IDIgYnl0ZXMgb2YgdGhlIDUxMiBieXRlIHJlY29yZCAqLwotI2RlZmluZSBTSUdOQVRVUkUwIDB4NTUKLSNkZWZpbmUgU0lHTkFUVVJFMSAweGFhCi0KLS8qIFBvd2VyUEMgYm9vdCB0eXBlICovCi0jZGVmaW5lIFBQQ19JTkQgMHg0MQotCi0vKiBJbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHBwY2Jvb3QgaGVhZGVyICovCi10eXBlZGVmIHN0cnVjdCBwcGNib290X2RhdGEgewotICBwcGNib290X2hkcl90CWhlYWRlcjsJCQkJLyogcmF3IGhlYWRlciAqLwotICBhc2VjdGlvbiAqc2VjOwkJCQkvKiBzaW5nbGUgc2VjdGlvbiAqLwotfSBwcGNib290X2RhdGFfdDsKLQotLyogQW55IGJmZCB3ZSBjcmVhdGUgYnkgcmVhZGluZyBhIHBwY2Jvb3QgZmlsZSBoYXMgdGhyZWUgc3ltYm9sczoKLSAgIGEgc3RhcnQgc3ltYm9sLCBhbiBlbmQgc3ltYm9sLCBhbmQgYW4gYWJzb2x1dGUgbGVuZ3RoIHN5bWJvbC4gICovCi0jZGVmaW5lIFBQQ0JPT1RfU1lNUyAzCi0KLXN0YXRpYyBib29sZWFuIHBwY2Jvb3RfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICpwcGNib290X29iamVjdF9wIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X3NldF9hcmNoX21hY2gKLSAgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGxvbmcgcHBjYm9vdF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY2hhciAqbWFuZ2xlX25hbWUgUEFSQU1TICgoYmZkICosIGNoYXIgKikpOwotc3RhdGljIGxvbmcgcHBjYm9vdF9nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgYXN5bWJvbCAqcHBjYm9vdF9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgcHBjYm9vdF9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gcHBjYm9vdF9zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGludCBwcGNib290X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcGNib290X2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLQotI2RlZmluZSBwcGNib290X3NldF90ZGF0YShhYmZkLCBwdHIpICgoYWJmZCktPnRkYXRhLmFueSA9IChQVFIpIChwdHIpKQotI2RlZmluZSBwcGNib290X2dldF90ZGF0YShhYmZkKSAoKHBwY2Jvb3RfZGF0YV90ICopICgoYWJmZCktPnRkYXRhLmFueSkpCi0MCi0vKiBDcmVhdGUgYSBwcGNib290IG9iamVjdC4gIEludm9rZWQgdmlhIGJmZF9zZXRfZm9ybWF0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3RfbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFwcGNib290X2dldF90ZGF0YSAoYWJmZCkpCi0gICAgcHBjYm9vdF9zZXRfdGRhdGEgKGFiZmQsIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAocHBjYm9vdF9kYXRhX3QpKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFNldCB0aGUgYXJjaGl0ZWN0dXJlIHRvIFBvd2VyUEMgKi8KLXN0YXRpYyBib29sZWFuCi1wcGNib290X3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gYmZkX2FyY2hfcG93ZXJwYzsKLQotICBlbHNlIGlmIChhcmNoICE9IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotDAotLyogQW55IGZpbGUgbWF5IGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBwcGNib290IGZpbGUsIHByb3ZpZGVkIHRoZSB0YXJnZXQKLSAgIHdhcyBub3QgZGVmYXVsdGVkLiAgVGhhdCBpcywgaXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCBhcwotICAgYmVpbmcgcHBjYm9vdC4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXBwY2Jvb3Rfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgcHBjYm9vdF9oZHJfdCBoZHI7Ci0gIHNpemVfdCBpOwotICBwcGNib290X2RhdGFfdCAqdGRhdGE7Ci0KLSAgQkZEX0FTU0VSVCAoc2l6ZW9mIChwcGNib290X2hkcl90KSA9PSAxMDI0KTsKLQotICBpZiAoYWJmZC0+dGFyZ2V0X2RlZmF1bHRlZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBGaW5kIHRoZSBmaWxlIHNpemUuICAqLwotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoKHNpemVfdCkgc3RhdGJ1Zi5zdF9zaXplIDwgc2l6ZW9mIChwcGNib290X2hkcl90KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZoZHIsIHNpemVvZiAoaGRyKSwgMSwgYWJmZCkgIT0gc2l6ZW9mIChoZHIpKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyBkbyBzb21lIGJhc2ljIGNoZWNrcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGhkci5wY19jb21wYXRpYmlsaXR5KTsgaSsrKQotICAgIGlmIChoZHIucGNfY29tcGF0aWJpbGl0eVtpXSkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQlyZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICBpZiAoaGRyLnNpZ25hdHVyZVswXSAhPSBTSUdOQVRVUkUwIHx8IGhkci5zaWduYXR1cmVbMV0gIT0gU0lHTkFUVVJFMSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoaGRyLnBhcnRpdGlvblswXS5wYXJ0aXRpb25fZW5kLmluZCAhPSBQUENfSU5EKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFiZmQtPnN5bWNvdW50ID0gUFBDQk9PVF9TWU1TOwotCi0gIC8qIE9uZSBkYXRhIHNlY3Rpb24uICAqLwotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmRhdGEiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBzZWMtPmZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQSB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUzsKLSAgc2VjLT52bWEgPSAwOwotICBzZWMtPl9yYXdfc2l6ZSA9IHN0YXRidWYuc3Rfc2l6ZSAtIHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci0gIHNlYy0+ZmlsZXBvcyA9IHNpemVvZiAocHBjYm9vdF9oZHJfdCk7Ci0KLSAgcHBjYm9vdF9ta29iamVjdCAoYWJmZCk7Ci0gIHRkYXRhID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpOwotICB0ZGF0YS0+c2VjID0gc2VjOwotICBtZW1jcHkgKChQVFIpICZ0ZGF0YS0+aGVhZGVyLCAoUFRSKSAmaGRyLCBzaXplb2YgKHBwY2Jvb3RfaGRyX3QpKTsKLQotICBwcGNib290X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX3Bvd2VycGMsIDApOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotI2RlZmluZSBwcGNib290X2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBwcGNib290X2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBwcGNib290X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotDAotLyogR2V0IGNvbnRlbnRzIG9mIHRoZSBvbmx5IHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYmZkX3NlZWsgKGFiZmQsIG9mZnNldCArIHNpemVvZihwcGNib290X2hkcl90KSwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChsb2NhdGlvbiwgMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXBwY2Jvb3RfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKFBQQ0JPT1RfU1lNUyArIDEpICogc2l6ZW9mIChhc3ltYm9sICopOwotfQotCi0MCi0vKiBDcmVhdGUgYSBzeW1ib2wgbmFtZSBiYXNlZCBvbiB0aGUgYmZkJ3MgZmlsZW5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1tYW5nbGVfbmFtZSAoYWJmZCwgc3VmZml4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKnN1ZmZpeDsKLXsKLSAgaW50IHNpemU7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqcDsKLQotICBzaXplID0gKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpCi0JICArIHN0cmxlbiAoc3VmZml4KQotCSAgKyBzaXplb2YgIl9wcGNib290X18iKTsKLQotICBidWYgPSAoY2hhciAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemUpOwotICBpZiAoYnVmID09IE5VTEwpCi0gICAgcmV0dXJuICIiOwotCi0gIHNwcmludGYgKGJ1ZiwgIl9wcGNib290XyVzXyVzIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN1ZmZpeCk7Ci0KLSAgLyogQ2hhbmdlIGFueSBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdG8gdW5kZXJzY29yZXMuICAqLwotICBmb3IgKHAgPSBidWY7ICpwOyBwKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwKSkKLSAgICAgICpwID0gJ18nOwotCi0gIHJldHVybiBidWY7Ci19Ci0KLQwKLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXBwY2Jvb3RfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIGFzZWN0aW9uICpzZWMgPSBwcGNib290X2dldF90ZGF0YSAoYWJmZCktPnNlYzsKLSAgYXN5bWJvbCAqc3ltczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgc3ltcyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgUFBDQk9PVF9TWU1TICogc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChzeW1zID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN0YXJ0IHN5bWJvbC4gICovCi0gIHN5bXNbMF0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMF0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic3RhcnQiKTsKLSAgc3ltc1swXS52YWx1ZSA9IDA7Ci0gIHN5bXNbMF0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzBdLnNlY3Rpb24gPSBzZWM7Ci0gIHN5bXNbMF0udWRhdGEucCA9IE5VTEw7Ci0KLSAgLyogRW5kIHN5bWJvbC4gICovCi0gIHN5bXNbMV0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMV0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAiZW5kIik7Ci0gIHN5bXNbMV0udmFsdWUgPSBzZWMtPl9yYXdfc2l6ZTsKLSAgc3ltc1sxXS5mbGFncyA9IEJTRl9HTE9CQUw7Ci0gIHN5bXNbMV0uc2VjdGlvbiA9IHNlYzsKLSAgc3ltc1sxXS51ZGF0YS5wID0gTlVMTDsKLQotICAvKiBTaXplIHN5bWJvbC4gICovCi0gIHN5bXNbMl0udGhlX2JmZCA9IGFiZmQ7Ci0gIHN5bXNbMl0ubmFtZSA9IG1hbmdsZV9uYW1lIChhYmZkLCAic2l6ZSIpOwotICBzeW1zWzJdLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0gIHN5bXNbMl0uZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICBzeW1zWzJdLnNlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotICBzeW1zWzJdLnVkYXRhLnAgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBQUENCT09UX1NZTVM7IGkrKykKLSAgICAqYWxvY2F0aW9uKysgPSBzeW1zKys7Ci0gICphbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBQUENCT09UX1NZTVM7Ci19Ci0KLQwKLS8qIE1ha2UgYW4gZW1wdHkgc3ltYm9sLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotcHBjYm9vdF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGFzeW1ib2wgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGFzeW1ib2wpKTsKLX0KLQotDAotI2RlZmluZSBwcGNib290X3ByaW50X3N5bWJvbCBfYmZkX25vc3ltYm9sc19wcmludF9zeW1ib2wKLQotLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY2Jvb3RfZ2V0X3N5bWJvbF9pbmZvIChpZ25vcmVfYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgYmZkX3N5bWJvbF9pbmZvIChzeW1ib2wsIHJldCk7Ci19Ci0KLSNkZWZpbmUgcHBjYm9vdF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHBwY2Jvb3RfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHBwY2Jvb3RfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBwcGNib290X21pbmlzeW1ib2xfdG9fc3ltYm9sIF9iZmRfZ2VuZXJpY19taW5pc3ltYm9sX3RvX3N5bWJvbAotCi0jZGVmaW5lIHBwY2Jvb3RfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpKSBiZmRfMGwpCi0jZGVmaW5lIHBwY2Jvb3RfY2Fub25pY2FsaXplX3JlbG9jIFwKLSAgKChsb25nICgqKSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiwgYXN5bWJvbCAqKikpKSBiZmRfMGwpCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0MCi0vKiBXcml0ZSBzZWN0aW9uIGNvbnRlbnRzIG9mIGEgcHBjYm9vdCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBwY2Jvb3Rfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgb2Zmc2V0LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBkYXRhOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLXsKLSAgaWYgKCEgYWJmZC0+b3V0cHV0X2hhc19iZWd1bikKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxvdzsKLSAgICAgIGFzZWN0aW9uICpzOwotCi0gICAgICAvKiBUaGUgbG93ZXN0IHNlY3Rpb24gVk1BIHNldHMgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgc3RhcnQKLSAgICAgICAgIG9mIHRoZSBmaWxlLiAgV2UgdXNlIHRoZSBzZXQgdGhlIGZpbGUgcG9zaXRpb24gb2YgYWxsIHRoZQotICAgICAgICAgc2VjdGlvbnMuICAqLwotICAgICAgbG93ID0gYWJmZC0+c2VjdGlvbnMtPnZtYTsKLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zLT5uZXh0OyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCWlmIChzLT52bWEgPCBsb3cpCi0JICBsb3cgPSBzLT52bWE7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotCXMtPmZpbGVwb3MgPSBzLT52bWEgLSBsb3c7Ci0KLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gX2JmZF9nZW5lcmljX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGRhdGEsIG9mZnNldCwgc2l6ZSk7Ci19Ci0KLQwKLXN0YXRpYyBpbnQKLXBwY2Jvb3Rfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gc2l6ZW9mIChwcGNib290X2hkcl90KTsKLX0KLQotDAotLyogUHJpbnQgb3V0IHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAoYWJmZCwgZmFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmFyZzsKLXsKLSAgRklMRSAqZiA9IChGSUxFICopZmFyZzsKLSAgcHBjYm9vdF9kYXRhX3QgKnRkYXRhID0gcHBjYm9vdF9nZXRfdGRhdGEgKGFiZmQpOwotICBsb25nIGVudHJ5X29mZnNldCA9IGJmZF9nZXRsX3NpZ25lZF8zMiAoKFBUUikgdGRhdGEtPmhlYWRlci5lbnRyeV9vZmZzZXQpOwotICBsb25nIGxlbmd0aCA9IGJmZF9nZXRsX3NpZ25lZF8zMiAoKFBUUikgdGRhdGEtPmhlYWRlci5sZW5ndGgpOwotICBpbnQgaTsKLQotICBmcHJpbnRmIChmLCBfKCJcbnBwY2Jvb3QgaGVhZGVyOlxuIikpOwotICBmcHJpbnRmIChmLCBfKCJFbnRyeSBvZmZzZXQgICAgICAgID0gMHglLjhseCAoJWxkKVxuIiksIGVudHJ5X29mZnNldCwgZW50cnlfb2Zmc2V0KTsKLSAgZnByaW50ZiAoZiwgXygiTGVuZ3RoICAgICAgICAgICAgICA9IDB4JS44bHggKCVsZClcbiIpLCBsZW5ndGgsIGxlbmd0aCk7Ci0KLSAgaWYgKHRkYXRhLT5oZWFkZXIuZmxhZ3MpCi0gICAgZnByaW50ZiAoZiwgXygiRmxhZyBmaWVsZCAgICAgICAgICA9IDB4JS4yeFxuIiksIHRkYXRhLT5oZWFkZXIuZmxhZ3MpOwotCi0gIGlmICh0ZGF0YS0+aGVhZGVyLm9zX2lkKQotICAgIGZwcmludGYgKGYsICJPU19JRCAgICAgICAgICAgICAgID0gMHglLjJ4XG4iLCB0ZGF0YS0+aGVhZGVyLm9zX2lkKTsKLQotICBpZiAodGRhdGEtPmhlYWRlci5wYXJ0aXRpb25fbmFtZSkKLSAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb24gbmFtZSAgICAgID0gXCIlc1wiXG4iKSwgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25fbmFtZSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICB7Ci0gICAgICBsb25nIHNlY3Rvcl9iZWdpbiAgPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnNlY3Rvcl9iZWdpbik7Ci0gICAgICBsb25nIHNlY3Rvcl9sZW5ndGggPSBiZmRfZ2V0bF9zaWduZWRfMzIgKChQVFIpIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnNlY3Rvcl9sZW5ndGgpOwotCi0gICAgICAvKiBTa2lwIGFsbCAwIGVudHJpZXMgKi8KLSAgICAgIGlmICghdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLmluZAotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5oZWFkCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2JlZ2luLnNlY3RvcgotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5jeWxpbmRlcgotCSAgJiYgIXRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9lbmQuaW5kCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5oZWFkCi0JICAmJiAhdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5zZWN0b3IKLQkgICYmICF0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmN5bGluZGVyCi0JICAmJiAhc2VjdG9yX2JlZ2luICYmICFzZWN0b3JfbGVuZ3RoKQotCWNvbnRpbnVlOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJcblBhcnRpdGlvblslZF0gc3RhcnQgID0geyAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMnggfVxuIiksIGksCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5pbmQsCi0JICAgICAgIHRkYXRhLT5oZWFkZXIucGFydGl0aW9uW2ldLnBhcnRpdGlvbl9iZWdpbi5oZWFkLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uc2VjdG9yLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fYmVnaW4uY3lsaW5kZXIpOwotCi0gICAgICBmcHJpbnRmIChmLCBfKCJQYXJ0aXRpb25bJWRdIGVuZCAgICA9IHsgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4IH1cbiIpLCBpLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLmluZCwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5oZWFkLAotCSAgICAgICB0ZGF0YS0+aGVhZGVyLnBhcnRpdGlvbltpXS5wYXJ0aXRpb25fZW5kLnNlY3RvciwKLQkgICAgICAgdGRhdGEtPmhlYWRlci5wYXJ0aXRpb25baV0ucGFydGl0aW9uX2VuZC5jeWxpbmRlcik7Ci0KLSAgICAgIGZwcmludGYgKGYsIF8oIlBhcnRpdGlvblslZF0gc2VjdG9yID0gMHglLjhseCAoJWxkKVxuIiksIGksIHNlY3Rvcl9iZWdpbiwgc2VjdG9yX2JlZ2luKTsKLSAgICAgIGZwcmludGYgKGYsIF8oIlBhcnRpdGlvblslZF0gbGVuZ3RoID0gMHglLjhseCAoJWxkKVxuIiksIGksIHNlY3Rvcl9sZW5ndGgsIHNlY3Rvcl9sZW5ndGgpOwotICAgIH0KLQotICBmcHJpbnRmIChmLCAiXG4iKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQwKLSNkZWZpbmUgcHBjYm9vdF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIFwKLSAgYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBwcGNib290X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSBwcGNib290X2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX2xpbmtfYWRkX3N5bWJvbHMgX2JmZF9nZW5lcmljX2xpbmtfYWRkX3N5bWJvbHMKLSNkZWZpbmUgcHBjYm9vdF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSBwcGNib290X2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gX2JmZF9nZW5lcmljX2xpbmtfc3BsaXRfc2VjdGlvbgotI2RlZmluZSBwcGNib290X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBwcGNib290X2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgX2JmZF9nZW5lcmljX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSBfYmZkX2dlbmVyaWNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSNkZWZpbmUgcHBjYm9vdF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIF9iZmRfZ2VuZXJpY19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhCi0jZGVmaW5lIHBwY2Jvb3RfYmZkX3NldF9wcml2YXRlX2ZsYWdzIF9iZmRfZ2VuZXJpY19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MKLSNkZWZpbmUgcHBjYm9vdF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0IHBwY2Jvb3RfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEKLQotY29uc3QgYmZkX3RhcmdldCBwcGNib290X3ZlYyA9Ci17Ci0gICJwcGNib290IiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAkvKiBmbGF2b3VyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogYnl0ZW9yZGVyIGlzIGJpZyBlbmRpYW4gZm9yIGNvZGUgKi8KLSAgQkZEX0VORElBTl9MSVRUTEUsCQkvKiBoZWFkZXJfYnl0ZW9yZGVyICovCi0gIEVYRUNfUCwJCQkvKiBvYmplY3RfZmxhZ3MgKi8KLSAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREUgfCBTRUNfREFUQQotICAgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUyksIC8qIHNlY3Rpb25fZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsCS8qIGhkcnMgKi8KLSAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgcHBjYm9vdF9vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewkJCQkvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBwcGNib290X21rb2JqZWN0LAotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0gIHsJCQkJLyogYmZkX3dyaXRlX2NvbnRlbnRzICovCi0gICAgYmZkX2ZhbHNlLAotICAgIGJmZF90cnVlLAotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gIH0sCi0KLSAgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHBwY2Jvb3QpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChwcGNib290KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAocHBjYm9vdCksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICBOVUxMCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3B0cmFjZS1jb3JlLmMgYi9iZmQvcHRyYWNlLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0ZmRiYi4uMDAwMDAwMAotLS0gYS9iZmQvcHRyYWNlLWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKiBCRkQgYmFja2VuZCBmb3IgY29yZSBmaWxlcyB3aGljaCB1c2UgdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZQotICAgQ29weXJpZ2h0IDE5OTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGUgc3RydWN0dXJlIG9mIHRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0cmFkLWNvcmUuYyB3cml0dGVuIGJ5IEpvaG4gR2lsbW9yZQotICAgb2YgQ3lnbnVzIFN1cHBvcnQuCi0gICBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSBieSBLZXZpbiBBLiBCdWV0dG5lci4KLSAgIChMb25ndGVybSBpdCBtYXkgYmUgYmV0dGVyIHRvIG1lcmdlIHRoaXMgZmlsZSB3aXRoIHRyYWQtY29yZS5jKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBQVFJBQ0VfQ09SRQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0jaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgotCi0KLXN0cnVjdCB0cmFkX2NvcmVfc3RydWN0Ci0gIHsKLSAgICBhc2VjdGlvbiAqZGF0YV9zZWN0aW9uOwotICAgIGFzZWN0aW9uICpzdGFja19zZWN0aW9uOwotICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgICBzdHJ1Y3QgcHRyYWNlX3VzZXIgdTsKLSAgfTsKLQotI2RlZmluZSBjb3JlX3VwYWdlKGJmZCkgKCYoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51KSkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5yZWdfc2VjdGlvbikKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqcHRyYWNlX3VuaXhfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jaGFyICoJCXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1pbnQJCXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JCXB0cmFjZV91bml4X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotCQkJIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkCXN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBBUkdTVVNFRCAqLwotY29uc3QgYmZkX3RhcmdldCAqCi1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotCi17Ci0gIGludCB2YWw7Ci0gIHN0cnVjdCBwdHJhY2VfdXNlciB1OwotICBzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqcmF3cHRyOwotCi0gIHZhbCA9IGJmZF9yZWFkICgodm9pZCAqKSZ1LCAxLCBzaXplb2YgdSwgYWJmZCk7Ci0gIGlmICh2YWwgIT0gc2l6ZW9mIHUgfHwgdS5wdF9tYWdpYyAhPSBfQkNTX1BUUkFDRV9NQUdJQyAKLSAgICAgIHx8IHUucHRfcmV2ICE9IF9CQ1NfUFRSQUNFX1JFVikKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJvdGggdGhlIHVwYWdlIGFuZCB0aGUgc3RydWN0IGNvcmVfZGF0YSBhdCBvbmNlLCBzbwotICAgICBhIHNpbmdsZSBmcmVlKCkgd2lsbCBmcmVlIHRoZW0gYm90aC4gICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0KSk7Ci0KLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEgPSByYXdwdHI7Ci0KLSAgcmF3cHRyLT51ID0gdTsgLypDb3B5IHRoZSB1YXJlYSBpbnRvIHRoZSB0ZGF0YSBwYXJ0IG9mIHRoZSBiZmQgKi8KLQotICAvKiBDcmVhdGUgdGhlIHNlY3Rpb25zLiAgVGhpcyBpcyByYXVuY2h5LCBidXQgYmZkX2Nsb3NlIHdhbnRzIHRvIGZyZWUKLSAgICAgdGhlbSBzZXBhcmF0ZWx5LiAgKi8KLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3N0YWNrc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfZGF0YXNlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9yZWdzZWMgKGFiZmQpID0gKGFzZWN0aW9uICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXNlY3Rpb24pKTsKLSAgaWYgKGNvcmVfcmVnc2VjIChhYmZkKSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uYW1lID0gIi5zdGFjayI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5hbWUgPSAiLmRhdGEiOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPm5hbWUgPSAiLnJlZyI7Ci0KLSAgLyogRklYTUU6ICBOZWVkIHRvIHdvcnJ5IGFib3V0IHNoYXJlZCBtZW1vcnksIGxpYnJhcnkgZGF0YSwgYW5kIGxpYnJhcnkKLSAgICAgdGV4dC4gIEkgZG9uJ3QgdGhpbmsgdGhhdCBhbnkgb2YgdGhlc2UgdGhpbmdzIGFyZSBzdXBwb3J0ZWQgb24gdGhlCi0gICAgIHN5c3RlbSBvbiB3aGljaCBJIGFtIGRldmVsb3BpbmcgdGhpcyBmb3IgdGhvdWdoLiAqLwotCi0KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+X3Jhd19zaXplID0gIHUucHRfZHNpemU7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSB1LnB0X3NzaXplOwotICBjb3JlX3JlZ3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IHNpemVvZih1KTsKLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSB1LnB0X29fZGF0YV9zdGFydDsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IFVTUlNUQUNLIC0gdS5wdF9zc2l6ZTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwIC0gc2l6ZW9mKHUpOwkvKiBzZWUgdHJhZC1jb3JlLmMgKi8KLQotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5maWxlcG9zID0gKGludCkgdS5wdF9kYXRhcHRyOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+ZmlsZXBvcyA9IChpbnQpICh1LnB0X2RhdGFwdHIgKyB1LnB0X2RzaXplKTsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5maWxlcG9zID0gMDsgLyogUmVnaXN0ZXIgc2VnbWVudCBpcyBwdHJhY2VfdXNlciAqLwotCi0gIC8qIEFsaWduIHRvIHdvcmQgYXQgbGVhc3QgKi8KLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPmFsaWdubWVudF9wb3dlciA9IDI7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQotICBhYmZkLT5zZWN0aW9ucyA9IGNvcmVfc3RhY2tzZWMgKGFiZmQpOwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfZGF0YXNlYyAoYWJmZCk7Ci0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPm5leHQgPSBjb3JlX3JlZ3NlYyAoYWJmZCk7Ci0gIGFiZmQtPnNlY3Rpb25fY291bnQgPSAzOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi1jaGFyICoKLXB0cmFjZV91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEudHJhZF9jb3JlX2RhdGEtPnUucHRfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBBUkdTVVNFRCAqLwotaW50Ci1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnB0X3NpZ2ZyYW1lLnNpZ19udW07Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1wdHJhY2VfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AgIChjb3JlX2JmZCwgZXhlY19iZmQpCi0gICAgIGJmZCAqY29yZV9iZmQsICpleGVjX2JmZDsKLXsKLSAgLyogRklYTUU6IFVzZSBwdF90aW1kYXQgZmllbGQgb2YgdGhlIHB0cmFjZV91c2VyIHN0cnVjdHVyZSB0byBtYXRjaCAKLSAgICAgdGhlIGRhdGUgb2YgdGhlIGV4ZWN1dGFibGUgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBJZiBzb21lYm9keSBjYWxscyBhbnkgYnl0ZS1zd2FwcGluZyByb3V0aW5lcywgc2hvb3QgdGhlbS4gICovCi1zdGF0aWMgdm9pZAotc3dhcF9hYm9ydCgpCi17Ci0gIGFib3J0KCk7IC8qIFRoaXMgd2F5IGRvZXNuJ3QgcmVxdWlyZSBhbnkgZGVjbGFyYXRpb24gZm9yIEFOU0kgdG8gZnVjayB1cCAqLwotfQotI2RlZmluZQlOT19HRVQJKChiZmRfdm1hICgqKSBQQVJBTVMgKCggICBjb25zdCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19QVVQJKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZQlOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBwdHJhY2VfY29yZV92ZWMgPQotICB7Ci0gICAgInRyYWQtY29yZSIsCi0gICAgYmZkX3RhcmdldF91bmtub3duX2ZsYXZvdXIsCi0gICAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gICAgKEhBU19SRUxPQyB8IEVYRUNfUCB8CS8qIG9iamVjdCBmbGFncyAqLwotICAgICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgICAgSEFTX1NZTVMgfCBIQVNfTE9DQUxTIHwgV1BfVEVYVCB8IERfUEFHRUQpLAotICAgIChTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLCAvKiBzZWN0aW9uIGZsYWdzICovCi0gICAgMCwJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN5bWJvbCBwcmVmaXggKi8KLSAgICAnICcsCQkJCQkJICAgLyogYXJfcGFkX2NoYXIgKi8KLSAgICAxNiwJCQkJCQkJICAgLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMzIgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwJLyogMTYgYml0IGhkcnMgKi8KLQotICAgIHsJCQkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIHVua25vd24gZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogb2JqZWN0IGZpbGUgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBhcmNoaXZlICovCi0gICAgIHB0cmFjZV91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAocHRyYWNlX3VuaXgpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTIChfYmZkX25vc3ltYm9scyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfUkVMT0NTIChfYmZkX25vcmVsb2NzKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9XUklURSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9MSU5LIChfYmZkX25vbGluayksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gICAgKFBUUikgMAkJCS8qIGJhY2tlbmRfZGF0YSAqLwotfTsKLQotI2VuZGlmIC8qIFBUUkFDRV9DT1JFICovCmRpZmYgLS1naXQgYS9iZmQvcmVsb2MuYyBiL2JmZC9yZWxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBjMWIyLi4wMDAwMDAwCi0tLSBhL2JmZC9yZWxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg2MSArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgcmVsb2NhdGlvbiBlbnRyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotU0VDVElPTgotCVJlbG9jYXRpb25zCi0KLQlCRkQgbWFpbnRhaW5zIHJlbG9jYXRpb25zIGluIG11Y2ggdGhlIHNhbWUgd2F5IGl0IG1haW50YWlucwotCXN5bWJvbHM6IHRoZXkgYXJlIGxlZnQgYWxvbmUgdW50aWwgcmVxdWlyZWQsIHRoZW4gcmVhZCBpbgotCWVuLW1hc3MgYW5kIHRyYW5zbGF0ZWQgaW50byBhbiBpbnRlcm5hbCBmb3JtLiAgQSBjb21tb24KLQlyb3V0aW5lIDw8YmZkX3BlcmZvcm1fcmVsb2NhdGlvbj4+IGFjdHMgdXBvbiB0aGUKLQljYW5vbmljYWwgZm9ybSB0byBkbyB0aGUgZml4dXAuCi0KLQlSZWxvY2F0aW9ucyBhcmUgbWFpbnRhaW5lZCBvbiBhIHBlciBzZWN0aW9uIGJhc2lzLAotCXdoaWxlIHN5bWJvbHMgYXJlIG1haW50YWluZWQgb24gYSBwZXIgQkZEIGJhc2lzLgotCi0JQWxsIHRoYXQgYSBiYWNrIGVuZCBoYXMgdG8gZG8gdG8gZml0IHRoZSBCRkQgaW50ZXJmYWNlIGlzIHRvIGNyZWF0ZQotCWEgPDxzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnk+PiBmb3IgZWFjaCByZWxvY2F0aW9uCi0JaW4gYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIGFuZCBmaWxsIGluIHRoZSByaWdodCBiaXRzIG9mIHRoZSBzdHJ1Y3R1cmVzLgotCi1AbWVudQotQCogdHlwZWRlZiBhcmVsZW50OjoKLUAqIGhvd3RvIG1hbmFnZXI6OgotQGVuZCBtZW51Ci0KLSovCi0KLS8qIERPIGNvbXBpbGUgaW4gdGhlIHJlbG9jX2NvZGUgbmFtZSB0YWJsZSBmcm9tIGxpYmJmZC5oLiAgKi8KLSNkZWZpbmUgX0JGRF9NQUtFX1RBQkxFX2JmZF9yZWxvY19jb2RlX3JlYWwKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLS8qCi1ET0NERAotSU5PREUKLQl0eXBlZGVmIGFyZWxlbnQsIGhvd3RvIG1hbmFnZXIsIFJlbG9jYXRpb25zLCBSZWxvY2F0aW9ucwotCi1TVUJTRUNUSU9OCi0JdHlwZWRlZiBhcmVsZW50Ci0KLQlUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgYSByZWxvY2F0aW9uIGVudHJ5OgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBlbnVtIGJmZF9yZWxvY19zdGF0dXMKLS57Ci0uICAgICAgIHsqIE5vIGVycm9ycyBkZXRlY3RlZCAqfQotLiAgYmZkX3JlbG9jX29rLAotLgotLiAgICAgICB7KiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgdGhlcmUgd2FzIGFuIG92ZXJmbG93LiAqfQotLiAgYmZkX3JlbG9jX292ZXJmbG93LAotLgotLiAgICAgICB7KiBUaGUgYWRkcmVzcyB0byByZWxvY2F0ZSB3YXMgbm90IHdpdGhpbiB0aGUgc2VjdGlvbiBzdXBwbGllZC4gKn0KLS4gIGJmZF9yZWxvY19vdXRvZnJhbmdlLAotLgotLiAgICAgICB7KiBVc2VkIGJ5IHNwZWNpYWwgZnVuY3Rpb25zICp9Ci0uICBiZmRfcmVsb2NfY29udGludWUsCi0uCi0uICAgICAgIHsqIFVuc3VwcG9ydGVkIHJlbG9jYXRpb24gc2l6ZSByZXF1ZXN0ZWQuICp9Ci0uICBiZmRfcmVsb2Nfbm90c3VwcG9ydGVkLAotLgotLiAgICAgICB7KiBVbnVzZWQgKn0KLS4gIGJmZF9yZWxvY19vdGhlciwKLS4KLS4gICAgICAgeyogVGhlIHN5bWJvbCB0byByZWxvY2F0ZSBhZ2FpbnN0IHdhcyB1bmRlZmluZWQuICp9Ci0uICBiZmRfcmVsb2NfdW5kZWZpbmVkLAotLgotLiAgICAgICB7KiBUaGUgcmVsb2NhdGlvbiB3YXMgcGVyZm9ybWVkLCBidXQgbWF5IG5vdCBiZSBvayAtIHByZXNlbnRseQotLiAgICAgICAgICBnZW5lcmF0ZWQgb25seSB3aGVuIGxpbmtpbmcgaTk2MCBjb2ZmIGZpbGVzIHdpdGggaTk2MCBiLm91dAotLiAgICAgICAgICBzeW1ib2xzLiAgSWYgdGhpcyB0eXBlIGlzIHJldHVybmVkLCB0aGUgZXJyb3JfbWVzc2FnZSBhcmd1bWVudAotLiAgICAgICAgICB0byBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHdpbGwgYmUgc2V0LiAgKn0KLS4gIGJmZF9yZWxvY19kYW5nZXJvdXMKLS4gfQotLiBiZmRfcmVsb2Nfc3RhdHVzX3R5cGU7Ci0uCi0uCi0udHlwZWRlZiBzdHJ1Y3QgcmVsb2NfY2FjaGVfZW50cnkKLS57Ci0uICAgICAgIHsqIEEgcG9pbnRlciBpbnRvIHRoZSBjYW5vbmljYWwgdGFibGUgb2YgcG9pbnRlcnMgICp9Ci0uICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltX3B0cl9wdHI7Ci0uCi0uICAgICAgIHsqIG9mZnNldCBpbiBzZWN0aW9uICp9Ci0uICBiZmRfc2l6ZV90eXBlIGFkZHJlc3M7Ci0uCi0uICAgICAgIHsqIGFkZGVuZCBmb3IgcmVsb2NhdGlvbiB2YWx1ZSAqfQotLiAgYmZkX3ZtYSBhZGRlbmQ7Ci0uCi0uICAgICAgIHsqIFBvaW50ZXIgdG8gaG93IHRvIHBlcmZvcm0gdGhlIHJlcXVpcmVkIHJlbG9jYXRpb24gKn0KLS4gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotLgotLn0gYXJlbGVudDsKLQotKi8KLQotLyoKLURFU0NSSVBUSU9OCi0KLSAgICAgICAgSGVyZSBpcyBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggb2YgdGhlIGZpZWxkcyB3aXRoaW4gYW4gPDxhcmVsZW50Pj46Ci0KLSAgICAgICAgbyA8PHN5bV9wdHJfcHRyPj4KLQotICAgICAgICBUaGUgc3ltYm9sIHRhYmxlIHBvaW50ZXIgcG9pbnRzIHRvIGEgcG9pbnRlciB0byB0aGUgc3ltYm9sCi0gICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsb2NhdGlvbiByZXF1ZXN0LiAgSXQgaXMKLSAgICAgICAgdGhlIHBvaW50ZXIgaW50byB0aGUgdGFibGUgcmV0dXJuZWQgYnkgdGhlIGJhY2sgZW5kJ3MKLSAgICAgICAgPDxnZXRfc3ltdGFiPj4gYWN0aW9uLiBAeHJlZntTeW1ib2xzfS4gVGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkCi0gICAgICAgIHRocm91Z2ggYSBwb2ludGVyIHRvIGEgcG9pbnRlciBzbyB0aGF0IHRvb2xzIGxpa2UgdGhlIGxpbmtlcgotICAgICAgICBjYW4gZml4IHVwIGFsbCB0aGUgc3ltYm9scyBvZiB0aGUgc2FtZSBuYW1lIGJ5IG1vZGlmeWluZyBvbmx5Ci0gICAgICAgIG9uZSBwb2ludGVyLiBUaGUgcmVsb2NhdGlvbiByb3V0aW5lIGxvb2tzIGluIHRoZSBzeW1ib2wgYW5kCi0gICAgICAgIHVzZXMgdGhlIGJhc2Ugb2YgdGhlIHNlY3Rpb24gdGhlIHN5bWJvbCBpcyBhdHRhY2hlZCB0byBhbmQgdGhlCi0gICAgICAgIHZhbHVlIG9mIHRoZSBzeW1ib2wgYXMgdGhlIGluaXRpYWwgcmVsb2NhdGlvbiBvZmZzZXQuIElmIHRoZQotICAgICAgICBzeW1ib2wgcG9pbnRlciBpcyB6ZXJvLCB0aGVuIHRoZSBzZWN0aW9uIHByb3ZpZGVkIGlzIGxvb2tlZCB1cC4KLQotICAgICAgICBvIDw8YWRkcmVzcz4+Ci0KLSAgICAgICAgVGhlIDw8YWRkcmVzcz4+IGZpZWxkIGdpdmVzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgYmFzZSBvZgotICAgICAgICB0aGUgc2VjdGlvbiBkYXRhIHdoaWNoIG93bnMgdGhlIHJlbG9jYXRpb24gcmVjb3JkIHRvIHRoZSBmaXJzdAotICAgICAgICBieXRlIG9mIHJlbG9jYXRhYmxlIGluZm9ybWF0aW9uLiBUaGUgYWN0dWFsIGRhdGEgcmVsb2NhdGVkCi0gICAgICAgIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhpcyBwb2ludDsgZm9yIGV4YW1wbGUsIGEgcmVsb2NhdGlvbgotICAgICAgICB0eXBlIHdoaWNoIG1vZGlmaWVzIHRoZSBib3R0b20gdHdvIGJ5dGVzIG9mIGEgZm91ciBieXRlIHdvcmQKLSAgICAgICAgd291bGQgbm90IHRvdWNoIHRoZSBmaXJzdCBieXRlIHBvaW50ZWQgdG8gaW4gYSBiaWcgZW5kaWFuCi0gICAgICAgIHdvcmxkLgotCi0JbyA8PGFkZGVuZD4+Ci0KLQlUaGUgPDxhZGRlbmQ+PiBpcyBhIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBiYWNrIGVuZCB0byBiZSBhZGRlZCAoISkKLQl0byB0aGUgcmVsb2NhdGlvbiBvZmZzZXQuIEl0cyBpbnRlcnByZXRhdGlvbiBpcyBkZXBlbmRlbnQgdXBvbgotCXRoZSBob3d0by4gRm9yIGV4YW1wbGUsIG9uIHRoZSA2OGsgdGhlIGNvZGU6Ci0KLQotfCAgICAgICAgY2hhciBmb29bXTsKLXwgICAgICAgIG1haW4oKQotfCAgICAgICAgICAgICAgICB7Ci18ICAgICAgICAgICAgICAgIHJldHVybiBmb29bMHgxMjM0NTY3OF07Ci18ICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBDb3VsZCBiZSBjb21waWxlZCBpbnRvOgotCi18ICAgICAgICBsaW5rdyBmcCwjLTQKLXwgICAgICAgIG1vdmViIEBAIzEyMzQ1Njc4LGQwCi18ICAgICAgICBleHRibCBkMAotfCAgICAgICAgdW5sayBmcAotfCAgICAgICAgcnRzCi0KLQotICAgICAgICBUaGlzIGNvdWxkIGNyZWF0ZSBhIHJlbG9jIHBvaW50aW5nIHRvIDw8Zm9vPj4sIGJ1dCBsZWF2ZSB0aGUKLSAgICAgICAgb2Zmc2V0IGluIHRoZSBkYXRhLCBzb21ldGhpbmcgbGlrZToKLQotCi18UkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbLnRleHRdOgotfG9mZnNldCAgIHR5cGUgICAgICB2YWx1ZQotfDAwMDAwMDA2IDMyICAgICAgICBfZm9vCi18Ci18MDAwMDAwMDAgNGU1NiBmZmZjICAgICAgICAgIDsgbGlua3cgZnAsIy00Ci18MDAwMDAwMDQgMTAzOSAxMjM0IDU2NzggICAgIDsgbW92ZWIgQEAjMTIzNDU2NzgsZDAKLXwwMDAwMDAwYSA0OWMwICAgICAgICAgICAgICAgOyBleHRibCBkMAotfDAwMDAwMDBjIDRlNWUgICAgICAgICAgICAgICA7IHVubGsgZnAKLXwwMDAwMDAwZSA0ZTc1ICAgICAgICAgICAgICAgOyBydHMKLQotCi0gICAgICAgIFVzaW5nIGNvZmYgYW5kIGFuIDg4aywgc29tZSBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSBlbm91Z2gKLSAgICAgICAgc3BhY2UgaW4gdGhlbSB0byByZXByZXNlbnQgdGhlIGZ1bGwgYWRkcmVzcyByYW5nZSwgYW5kCi0gICAgICAgIHBvaW50ZXJzIGhhdmUgdG8gYmUgbG9hZGVkIGluIHR3byBwYXJ0cy4gU28geW91J2QgZ2V0IHNvbWV0aGluZyBsaWtlOgotCi0KLXwgICAgICAgIG9yLnUgICAgIHIxMyxyMCxoaTE2KF9mb28rMHgxMjM0NTY3OCkKLXwgICAgICAgIGxkLmIgICAgIHIyLHIxMyxsbzE2KF9mb28rMHgxMjM0NTY3OCkKLXwgICAgICAgIGptcCAgICAgIHIxCi0KLQotICAgICAgICBUaGlzIHNob3VsZCBjcmVhdGUgdHdvIHJlbG9jcywgYm90aCBwb2ludGluZyB0byA8PF9mb28+PiwgYW5kIHdpdGgKLSAgICAgICAgMHgxMjM0MDAwMCBpbiB0aGVpciBhZGRlbmQgZmllbGQuIFRoZSBkYXRhIHdvdWxkIGNvbnNpc3Qgb2Y6Ci0KLQotfFJFTE9DQVRJT04gUkVDT1JEUyBGT1IgWy50ZXh0XToKLXxvZmZzZXQgICB0eXBlICAgICAgdmFsdWUKLXwwMDAwMDAwMiBIVlJUMTYgICAgX2ZvbysweDEyMzQwMDAwCi18MDAwMDAwMDYgTFZSVDE2ICAgIF9mb28rMHgxMjM0MDAwMAotfAotfDAwMDAwMDAwIDVkYTA1Njc4ICAgICAgICAgICA7IG9yLnUgcjEzLHIwLDB4NTY3OAotfDAwMDAwMDA0IDFjNGQ1Njc4ICAgICAgICAgICA7IGxkLmIgcjIscjEzLDB4NTY3OAotfDAwMDAwMDA4IGY0MDBjMDAxICAgICAgICAgICA7IGptcCByMQotCi0KLSAgICAgICAgVGhlIHJlbG9jYXRpb24gcm91dGluZSBkaWdzIG91dCB0aGUgdmFsdWUgZnJvbSB0aGUgZGF0YSwgYWRkcwotICAgICAgICBpdCB0byB0aGUgYWRkZW5kIHRvIGdldCB0aGUgb3JpZ2luYWwgb2Zmc2V0LCBhbmQgdGhlbiBhZGRzIHRoZQotICAgICAgICB2YWx1ZSBvZiA8PF9mb28+Pi4gTm90ZSB0aGF0IGFsbCAzMiBiaXRzIGhhdmUgdG8gYmUga2VwdCBhcm91bmQKLSAgICAgICAgc29tZXdoZXJlLCB0byBjb3BlIHdpdGggY2FycnkgZnJvbSBiaXQgMTUgdG8gYml0IDE2LgotCi0gICAgICAgIE9uZSBmdXJ0aGVyIGV4YW1wbGUgaXMgdGhlIHNwYXJjIGFuZCB0aGUgYS5vdXQgZm9ybWF0LiBUaGUKLSAgICAgICAgc3BhcmMgaGFzIGEgc2ltaWxhciBwcm9ibGVtIHRvIHRoZSA4OGssIGluIHRoYXQgc29tZQotICAgICAgICBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSByb29tIGZvciBhbiBlbnRpcmUgb2Zmc2V0LCBidXQgb24gdGhlCi0gICAgICAgIHNwYXJjIHRoZSBwYXJ0cyBhcmUgY3JlYXRlZCBpbiBvZGQgc2l6ZWQgbHVtcHMuIFRoZSBkZXNpZ25lcnMgb2YKLSAgICAgICAgdGhlIGEub3V0IGZvcm1hdCBjaG9zZSB0byBub3QgdXNlIHRoZSBkYXRhIHdpdGhpbiB0aGUgc2VjdGlvbgotICAgICAgICBmb3Igc3RvcmluZyBwYXJ0IG9mIHRoZSBvZmZzZXQ7IGFsbCB0aGUgb2Zmc2V0IGlzIGtlcHQgd2l0aGluCi0gICAgICAgIHRoZSByZWxvYy4gQW55dGhpbmcgaW4gdGhlIGRhdGEgc2hvdWxkIGJlIGlnbm9yZWQuCi0KLXwgICAgICAgIHNhdmUgJXNwLC0xMTIsJXNwCi18ICAgICAgICBzZXRoaSAlaGkoX2ZvbysweDEyMzQ1Njc4KSwlZzIKLXwgICAgICAgIGxkc2IgWyVnMislbG8oX2ZvbysweDEyMzQ1Njc4KV0sJWkwCi18ICAgICAgICByZXQKLXwgICAgICAgIHJlc3RvcmUKLQotICAgICAgICBCb3RoIHJlbG9jcyBjb250YWluIGEgcG9pbnRlciB0byA8PGZvbz4+LCBhbmQgdGhlIG9mZnNldHMKLSAgICAgICAgY29udGFpbiBqdW5rLgotCi0KLXxSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFsudGV4dF06Ci18b2Zmc2V0ICAgdHlwZSAgICAgIHZhbHVlCi18MDAwMDAwMDQgSEkyMiAgICAgIF9mb28rMHgxMjM0NTY3OAotfDAwMDAwMDA4IExPMTAgICAgICBfZm9vKzB4MTIzNDU2NzgKLXwKLXwwMDAwMDAwMCA5ZGUzYmY5MCAgICAgOyBzYXZlICVzcCwtMTEyLCVzcAotfDAwMDAwMDA0IDA1MDAwMDAwICAgICA7IHNldGhpICVoaShfZm9vKzApLCVnMgotfDAwMDAwMDA4IGYwNDhhMDAwICAgICA7IGxkc2IgWyVnMislbG8oX2ZvbyswKV0sJWkwCi18MDAwMDAwMGMgODFjN2UwMDggICAgIDsgcmV0Ci18MDAwMDAwMTAgODFlODAwMDAgICAgIDsgcmVzdG9yZQotCi0KLSAgICAgICAgbyA8PGhvd3RvPj4KLQotICAgICAgICBUaGUgPDxob3d0bz4+IGZpZWxkIGNhbiBiZSBpbWFnaW5lZCBhcyBhCi0gICAgICAgIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb24uIEl0IGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB3aGljaAotICAgICAgICBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB3aGF0IHRvIGRvIHdpdGggYWxsIG9mIHRoZSBvdGhlcgotICAgICAgICBpbmZvcm1hdGlvbiBpbiB0aGUgcmVsb2MgcmVjb3JkIGFuZCBkYXRhIHNlY3Rpb24uIEEgYmFjayBlbmQKLSAgICAgICAgd291bGQgbm9ybWFsbHkgaGF2ZSBhIHJlbG9jYXRpb24gaW5zdHJ1Y3Rpb24gc2V0IGFuZCB0dXJuCi0gICAgICAgIHJlbG9jYXRpb25zIGludG8gcG9pbnRlcnMgdG8gdGhlIGNvcnJlY3Qgc3RydWN0dXJlIG9uIGlucHV0IC0KLSAgICAgICAgYnV0IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSBlYWNoIGhvd3RvIGZpZWxkIG9uIGRlbWFuZC4KLQotKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLQk8PGVudW0gY29tcGxhaW5fb3ZlcmZsb3c+PgotCi0JSW5kaWNhdGVzIHdoYXQgc29ydCBvZiBvdmVyZmxvdyBjaGVja2luZyBzaG91bGQgYmUgZG9uZSB3aGVuCi0JcGVyZm9ybWluZyBhIHJlbG9jYXRpb24uCi0KLUNPREVfRlJBR01FTlQKLS4KLS5lbnVtIGNvbXBsYWluX292ZXJmbG93Ci0uewotLgl7KiBEbyBub3QgY29tcGxhaW4gb24gb3ZlcmZsb3cuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd19kb250LAotLgotLgl7KiBDb21wbGFpbiBpZiB0aGUgYml0ZmllbGQgb3ZlcmZsb3dzLCB3aGV0aGVyIGl0IGlzIGNvbnNpZGVyZWQKLS4JICAgYXMgc2lnbmVkIG9yIHVuc2lnbmVkLiAqfQotLiAgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsCi0uCi0uCXsqIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIHNpZ25lZAotLgkgICBudW1iZXIuICp9Ci0uICBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsCi0uCi0uCXsqIENvbXBsYWluIGlmIHRoZSB2YWx1ZSBvdmVyZmxvd3Mgd2hlbiBjb25zaWRlcmVkIGFzIGFuCi0uCSAgIHVuc2lnbmVkIG51bWJlci4gKn0KLS4gIGNvbXBsYWluX292ZXJmbG93X3Vuc2lnbmVkCi0ufTsKLQotKi8KLQotLyoKLVNVQlNVQlNFQ1RJT04KLSAgICAgICAgPDxyZWxvY19ob3d0b190eXBlPj4KLQotICAgICAgICBUaGUgPDxyZWxvY19ob3d0b190eXBlPj4gaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYWxsIHRoZQotICAgICAgICBpbmZvcm1hdGlvbiB0aGF0IGxpYmJmZCBuZWVkcyB0byBrbm93IHRvIHRpZSB1cCBhIGJhY2sgZW5kJ3MgZGF0YS4KLQotQ09ERV9GUkFHTUVOVAotLnN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnk7CQl7KiBGb3J3YXJkIGRlY2xhcmF0aW9uICp9Ci0uCi0uc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdAotLnsKLS4gICAgICAgeyogIFRoZSB0eXBlIGZpZWxkIGhhcyBtYWlubHkgYSBkb2N1bWVudGFyeSB1c2UgLSB0aGUgYmFjayBlbmQgY2FuCi0uICAgICAgICAgICBkbyB3aGF0IGl0IHdhbnRzIHdpdGggaXQsIHRob3VnaCBub3JtYWxseSB0aGUgYmFjayBlbmQncwotLiAgICAgICAgICAgZXh0ZXJuYWwgaWRlYSBvZiB3aGF0IGEgcmVsb2MgbnVtYmVyIGlzIHN0b3JlZAotLiAgICAgICAgICAgaW4gdGhpcyBmaWVsZC4gRm9yIGV4YW1wbGUsIGEgUEMgcmVsYXRpdmUgd29yZCByZWxvY2F0aW9uCi0uICAgICAgICAgICBpbiBhIGNvZmYgZW52aXJvbm1lbnQgaGFzIHRoZSB0eXBlIDAyMyAtIGJlY2F1c2UgdGhhdCdzCi0uICAgICAgICAgICB3aGF0IHRoZSBvdXRzaWRlIHdvcmxkIGNhbGxzIGEgUl9QQ1JXT1JEIHJlbG9jLiAqfQotLiAgdW5zaWduZWQgaW50IHR5cGU7Ci0uCi0uICAgICAgIHsqICBUaGUgdmFsdWUgdGhlIGZpbmFsIHJlbG9jYXRpb24gaXMgc2hpZnRlZCByaWdodCBieS4gVGhpcyBkcm9wcwotLiAgICAgICAgICAgdW53YW50ZWQgZGF0YSBmcm9tIHRoZSByZWxvY2F0aW9uLiAgKn0KLS4gIHVuc2lnbmVkIGludCByaWdodHNoaWZ0OwotLgotLgl7KiAgVGhlIHNpemUgb2YgdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkLiAgVGhpcyBpcyAqbm90KiBhCi0uCSAgICBwb3dlci1vZi10d28gbWVhc3VyZS4gIFRvIGdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9wZXJhdGVkCi0uCSAgICBvbiBieSBhIHR5cGUgb2YgcmVsb2NhdGlvbiwgdXNlIGJmZF9nZXRfcmVsb2Nfc2l6ZS4gICp9Ci0uICBpbnQgc2l6ZTsKLS4KLS4gICAgICAgeyogIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgaXRlbSB0byBiZSByZWxvY2F0ZWQuICBUaGlzIGlzIHVzZWQKLS4JICAgIHdoZW4gZG9pbmcgb3ZlcmZsb3cgY2hlY2tpbmcuICAqfQotLiAgdW5zaWduZWQgaW50IGJpdHNpemU7Ci0uCi0uICAgICAgIHsqICBOb3RlcyB0aGF0IHRoZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUKLS4gICAgICAgICAgIGRhdGEgc2VjdGlvbiBvZiB0aGUgYWRkZW5kLiBUaGUgcmVsb2NhdGlvbiBmdW5jdGlvbiB3aWxsCi0uICAgICAgICAgICBzdWJ0cmFjdCBmcm9tIHRoZSByZWxvY2F0aW9uIHZhbHVlIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbgotLiAgICAgICAgICAgYmVpbmcgcmVsb2NhdGVkLiAqfQotLiAgYm9vbGVhbiBwY19yZWxhdGl2ZTsKLS4KLS4JeyogIFRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIHJlbG9jIHZhbHVlIGluIHRoZSBkZXN0aW5hdGlvbi4KLS4JICAgIFRoZSByZWxvY2F0ZWQgdmFsdWUgaXMgbGVmdCBzaGlmdGVkIGJ5IHRoaXMgYW1vdW50LiAqfQotLiAgdW5zaWduZWQgaW50IGJpdHBvczsKLS4KLS4JeyogV2hhdCB0eXBlIG9mIG92ZXJmbG93IGVycm9yIHNob3VsZCBiZSBjaGVja2VkIGZvciB3aGVuCi0uCSAgIHJlbG9jYXRpbmcuICp9Ci0uICBlbnVtIGNvbXBsYWluX292ZXJmbG93IGNvbXBsYWluX29uX292ZXJmbG93OwotLgotLiAgICAgICB7KiBJZiB0aGlzIGZpZWxkIGlzIG5vbiBudWxsLCB0aGVuIHRoZSBzdXBwbGllZCBmdW5jdGlvbiBpcwotLiAgICAgICAgICBjYWxsZWQgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBmdW5jdGlvbi4gVGhpcyBhbGxvd3MgcmVhbGx5Ci0uICAgICAgICAgIHN0cmFuZ2UgcmVsb2NhdGlvbiBtZXRob2RzIHRvIGJlIGFjY29tb2RhdGVkIChlLmcuLCBpOTYwIGNhbGxqCi0uICAgICAgICAgIGluc3RydWN0aW9ucykuICp9Ci0uICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgKCpzcGVjaWFsX2Z1bmN0aW9uKQotLgkJCQkgICAgUEFSQU1TICgoYmZkICphYmZkLAotLgkJCQkJICAgICBhcmVsZW50ICpyZWxvY19lbnRyeSwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24sCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKm91dHB1dF9iZmQsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZSkpOwotLgotLiAgICAgICB7KiBUaGUgdGV4dHVhbCBuYW1lIG9mIHRoZSByZWxvY2F0aW9uIHR5cGUuICp9Ci0uICBjaGFyICpuYW1lOwotLgotLiAgICAgICB7KiBXaGVuIHBlcmZvcm1pbmcgYSBwYXJ0aWFsIGxpbmssIHNvbWUgZm9ybWF0cyBtdXN0IG1vZGlmeSB0aGUKLS4gICAgICAgICAgcmVsb2NhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRhdGEgLSB0aGlzIGZsYWcgc2lnbmFscyB0aGlzLip9Ci0uICBib29sZWFuIHBhcnRpYWxfaW5wbGFjZTsKLS4KLS4gICAgICAgeyogVGhlIHNyY19tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIHJlYWQgaW4gZGF0YQotLiAgICAgICAgICBhcmUgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbiBzdW0uICBFLmcuLCBpZiB0aGlzIHdhcyBhbiA4IGJpdAotLiAgICAgICAgICBiaXQgb2YgZGF0YSB3aGljaCB3ZSByZWFkIGFuZCByZWxvY2F0ZWQsIHRoaXMgd291bGQgYmUKLS4gICAgICAgICAgMHgwMDAwMDBmZi4gV2hlbiB3ZSBoYXZlIHJlbG9jcyB3aGljaCBoYXZlIGFuIGFkZGVuZCwgc3VjaCBhcwotLiAgICAgICAgICBzdW40IGV4dGVuZGVkIHJlbG9jcywgdGhlIHZhbHVlIGluIHRoZSBvZmZzZXQgcGFydCBvZiBhCi0uICAgICAgICAgIHJlbG9jYXRpbmcgZmllbGQgaXMgZ2FyYmFnZSBzbyB3ZSBuZXZlciB1c2UgaXQuIEluIHRoaXMgY2FzZQotLiAgICAgICAgICB0aGUgbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAqfQotLiAgYmZkX3ZtYSBzcmNfbWFzazsKLS4KLS4gICAgICAgeyogVGhlIGRzdF9tYXNrIHNlbGVjdHMgd2hpY2ggcGFydHMgb2YgdGhlIGluc3RydWN0aW9uIGFyZSByZXBsYWNlZAotLiAgICAgICAgICBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gSW4gbW9zdCBjYXNlcyBzcmNfbWFzayA9PSBkc3RfbWFzaywKLS4gICAgICAgICAgZXhjZXB0IGluIHRoZSBhYm92ZSBzcGVjaWFsIGNhc2UsIHdoZXJlIGRzdF9tYXNrIHdvdWxkIGJlCi0uICAgICAgICAgIDB4MDAwMDAwZmYsIGFuZCBzcmNfbWFzayB3b3VsZCBiZSAweDAwMDAwMDAwLiAgICp9Ci0uICBiZmRfdm1hIGRzdF9tYXNrOwotLgotLiAgICAgICB7KiBXaGVuIHNvbWUgZm9ybWF0cyBjcmVhdGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zLCB0aGV5IGxlYXZlCi0uICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcGMgb2YgdGhlIHBsYWNlIGJlaW5nIHJlbG9jYXRlZCBpbiB0aGUgb2Zmc2V0Ci0uICAgICAgICAgIHNsb3Qgb2YgdGhlIGluc3RydWN0aW9uLCBzbyB0aGF0IGEgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiBjYW4KLS4gICAgICAgICAgYmUgbWFkZSBqdXN0IGJ5IGFkZGluZyBpbiBhbiBvcmRpbmFyeSBvZmZzZXQgKGUuZy4sIHN1bjMgYS5vdXQpLgotLiAgICAgICAgICBTb21lIGZvcm1hdHMgbGVhdmUgdGhlIGRpc3BsYWNlbWVudCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uCi0uICAgICAgICAgIGVtcHR5IChlLmcuLCBtODhrIGJjcyk7IHRoaXMgZmxhZyBzaWduYWxzIHRoZSBmYWN0Lip9Ci0uICBib29sZWFuIHBjcmVsX29mZnNldDsKLS4KLS59OwotCi0qLwotCi0vKgotRlVOQ1RJT04KLQlUaGUgSE9XVE8gTWFjcm8KLQotREVTQ1JJUFRJT04KLQlUaGUgSE9XVE8gZGVmaW5lIGlzIGhvcnJpYmxlIGFuZCB3aWxsIGdvIGF3YXkuCi0KLQotLiNkZWZpbmUgSE9XVE8oQywgUixTLEIsIFAsIEJJLCBPLCBTRiwgTkFNRSwgSU5QTEFDRSwgTUFTS1NSQywgTUFTS0RTVCwgUEMpIFwKLS4gIHsodW5zaWduZWQpQyxSLFMsQiwgUCwgQkksIE8sU0YsTkFNRSxJTlBMQUNFLE1BU0tTUkMsTUFTS0RTVCxQQ30KLQotREVTQ1JJUFRJT04KLQlBbmQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSB0b3RhbGx5IG1hZ2ljIHdheS4gQnV0IGZvciB0aGUKLQltb21lbnQsIHdlIGFyZSBjb21wYXRpYmxlLCBzbyBkbyBpdCB0aGlzIHdheS4KLQotCi0uI2RlZmluZSBORVdIT1dUTyggRlVOQ1RJT04sIE5BTUUsU0laRSxSRUwsSU4pIEhPV1RPKDAsMCxTSVpFLDAsUkVMLDAsY29tcGxhaW5fb3ZlcmZsb3dfZG9udCxGVU5DVElPTiwgTkFNRSxmYWxzZSwwLDAsSU4pCi0uCi1ERVNDUklQVElPTgotCUhlbHBlciByb3V0aW5lIHRvIHR1cm4gYSBzeW1ib2wgaW50byBhIHJlbG9jYXRpb24gdmFsdWUuCi0KLS4jZGVmaW5lIEhPV1RPX1BSRVBBUkUocmVsb2NhdGlvbiwgc3ltYm9sKSAgICAgIFwKLS4gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLS4gIGlmIChzeW1ib2wgIT0gKGFzeW1ib2wgKilOVUxMKSB7ICAgICAgICAgICAgIFwKLS4gICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkgeyBcCi0uICAgICAgcmVsb2NhdGlvbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICAgICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7ICAgICAgICAgICAgICBcCi0uICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0uICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0ufQotCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfZ2V0X3JlbG9jX3NpemUKLQotU1lOT1BTSVMKLQl1bnNpZ25lZCBpbnQgYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0b190eXBlICopOwotCi1ERVNDUklQVElPTgotCUZvciBhIHJlbG9jX2hvd3RvX3R5cGUgdGhhdCBvcGVyYXRlcyBvbiBhIGZpeGVkIG51bWJlciBvZiBieXRlcywKLQl0aGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvcGVyYXRlZCBvbi4KLSAqLwotCi11bnNpZ25lZCBpbnQKLWJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pCi0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotewotICBzd2l0Y2ggKGhvd3RvLT5zaXplKQotICAgIHsKLSAgICBjYXNlIDA6IHJldHVybiAxOwotICAgIGNhc2UgMTogcmV0dXJuIDI7Ci0gICAgY2FzZSAyOiByZXR1cm4gNDsKLSAgICBjYXNlIDM6IHJldHVybiAwOwotICAgIGNhc2UgNDogcmV0dXJuIDg7Ci0gICAgY2FzZSA4OiByZXR1cm4gMTY7Ci0gICAgY2FzZSAtMjogcmV0dXJuIDQ7Ci0gICAgZGVmYXVsdDogYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKgotVFlQRURFRgotCWFyZWxlbnRfY2hhaW4KLQotREVTQ1JJUFRJT04KLQotCUhvdyByZWxvY3MgYXJlIHRpZWQgdG9nZXRoZXIgaW4gYW4gPDxhc2VjdGlvbj4+OgotCi0udHlwZWRlZiBzdHJ1Y3QgcmVsZW50X2NoYWluIHsKLS4gIGFyZWxlbnQgcmVsZW50OwotLiAgc3RydWN0ICAgcmVsZW50X2NoYWluICpuZXh0OwotLn0gYXJlbGVudF9jaGFpbjsKLQotKi8KLQotLyogTl9PTkVTIHByb2R1Y2VzIE4gb25lIGJpdHMsIHdpdGhvdXQgb3ZlcmZsb3dpbmcgbWFjaGluZSBhcml0aG1ldGljLiAgKi8KLSNkZWZpbmUgTl9PTkVTKG4pICgoKCgoYmZkX3ZtYSkgMSA8PCAoKG4pIC0gMSkpIC0gMSkgPDwgMSkgfCAxKQotCi0vKgotRlVOQ1RJT04KLQliZmRfY2hlY2tfb3ZlcmZsb3cKLQotU1lOT1BTSVMKLQliZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLQkJYmZkX2NoZWNrX292ZXJmbG93Ci0JCQkoZW51bSBjb21wbGFpbl9vdmVyZmxvdyBob3csCi0JCQkgdW5zaWduZWQgaW50IGJpdHNpemUsCi0JCQkgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQsCi0JCQkgdW5zaWduZWQgaW50IGFkZHJzaXplLAotCQkJIGJmZF92bWEgcmVsb2NhdGlvbik7Ci0KLURFU0NSSVBUSU9OCi0JUGVyZm9ybSBvdmVyZmxvdyBjaGVja2luZyBvbiBAdmFye3JlbG9jYXRpb259IHdoaWNoIGhhcwotCUB2YXJ7Yml0c2l6ZX0gc2lnbmlmaWNhbnQgYml0cyBhbmQgd2lsbCBiZSBzaGlmdGVkIHJpZ2h0IGJ5Ci0JQHZhcntyaWdodHNoaWZ0fSBiaXRzLCBvbiBhIG1hY2hpbmUgd2l0aCBhZGRyZXNzZXMgY29udGFpbmluZwotCUB2YXJ7YWRkcnNpemV9IHNpZ25pZmljYW50IGJpdHMuICBUaGUgcmVzdWx0IGlzIGVpdGhlciBvZgotCUBjb2Rle2JmZF9yZWxvY19va30gb3IgQGNvZGV7YmZkX3JlbG9jX292ZXJmbG93fS4KLQotKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1iZmRfY2hlY2tfb3ZlcmZsb3cgKGhvdywgYml0c2l6ZSwgcmlnaHRzaGlmdCwgYWRkcnNpemUsIHJlbG9jYXRpb24pCi0gICAgIGVudW0gY29tcGxhaW5fb3ZlcmZsb3cgaG93OwotICAgICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLSAgICAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQ7Ci0gICAgIHVuc2lnbmVkIGludCBhZGRyc2l6ZTsKLSAgICAgYmZkX3ZtYSByZWxvY2F0aW9uOwotewotICBiZmRfdm1hIGZpZWxkbWFzaywgYWRkcm1hc2ssIHNpZ25tYXNrLCBzcywgYTsKLSAgYmZkX3JlbG9jX3N0YXR1c190eXBlIGZsYWcgPSBiZmRfcmVsb2Nfb2s7Ci0KLSAgYSA9IHJlbG9jYXRpb247Ci0KLSAgLyogTm90ZTogQklUU0laRSBzaG91bGQgYWx3YXlzIGJlIDw9IEFERFJTSVpFLCBidXQgaW4gY2FzZSBpdCdzIG5vdCwKLSAgICAgd2UnbGwgYmUgcGVybWlzc2l2ZTogZXh0cmEgYml0cyBpbiB0aGUgZmllbGQgbWFzayB3aWxsCi0gICAgIGF1dG9tYXRpY2FsbHkgZXh0ZW5kIHRoZSBhZGRyZXNzIG1hc2sgZm9yIHB1cnBvc2VzIG9mIHRoZQotICAgICBvdmVyZmxvdyBjaGVjay4gICovCi0gIGZpZWxkbWFzayA9IE5fT05FUyAoYml0c2l6ZSk7Ci0gIGFkZHJtYXNrID0gTl9PTkVTIChhZGRyc2l6ZSkgfCBmaWVsZG1hc2s7Ci0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfZG9udDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0gICAgICAvKiBJZiBhbnkgc2lnbiBiaXRzIGFyZSBzZXQsIGFsbCBzaWduIGJpdHMgbXVzdCBiZSBzZXQuICBUaGF0Ci0gICAgICAgICBpcywgQSBtdXN0IGJlIGEgdmFsaWQgbmVnYXRpdmUgYWRkcmVzcyBhZnRlciBzaGlmdGluZy4gICovCi0gICAgICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKLSAgICAgIHNpZ25tYXNrID0gfiAoZmllbGRtYXNrID4+IDEpOwotICAgICAgc3MgPSBhICYgc2lnbm1hc2s7Ci0gICAgICBpZiAoc3MgIT0gMCAmJiBzcyAhPSAoKGFkZHJtYXNrID4+IHJpZ2h0c2hpZnQpICYgc2lnbm1hc2spKQotCWZsYWcgPSBiZmRfcmVsb2Nfb3ZlcmZsb3c7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgY29tcGxhaW5fb3ZlcmZsb3dfdW5zaWduZWQ6Ci0gICAgICAvKiBXZSBoYXZlIGFuIG92ZXJmbG93IGlmIHRoZSBhZGRyZXNzIGRvZXMgbm90IGZpdCBpbiB0aGUgZmllbGQuICAqLwotICAgICAgYSA9IChhICYgYWRkcm1hc2spID4+IHJpZ2h0c2hpZnQ7Ci0gICAgICBpZiAoKGEgJiB+IGZpZWxkbWFzaykgIT0gMCkKLQlmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotICAgICAgLyogQml0ZmllbGRzIGFyZSBzb21ldGltZXMgc2lnbmVkLCBzb21ldGltZXMgdW5zaWduZWQuICBXZQotICAgICAgICAgb3ZlcmZsb3cgaWYgdGhlIHZhbHVlIGhhcyBzb21lLCBidXQgbm90IGFsbCwgYml0cyBzZXQgb3V0c2lkZQotICAgICAgICAgdGhlIGZpZWxkLCBvciBpZiBpdCBoYXMgYW55IGJpdHMgc2V0IG91dHNpZGUgdGhlIGZpZWxkIGJ1dAotICAgICAgICAgdGhlIHNpZ24gYml0IGlzIG5vdCBzZXQuICAqLwotICAgICAgYSA+Pj0gcmlnaHRzaGlmdDsKLSAgICAgIGlmICgoYSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCXsKLQkgIHNpZ25tYXNrID0gKGZpZWxkbWFzayA+PiAxKSArIDE7Ci0JICBzcyA9IChzaWdubWFzayA8PCByaWdodHNoaWZ0KSAtIDE7Ci0JICBpZiAoKHNzIHwgcmVsb2NhdGlvbikgIT0gfiAoYmZkX3ZtYSkgMCkKLQkgICAgZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wZXJmb3JtX3JlbG9jYXRpb24KLQotU1lOT1BTSVMKLQliZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLSAgICAgICAgICAgICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAoYmZkICphYmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWxlbnQgKnJlbG9jX2VudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFBUUiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJmZCAqb3V0cHV0X2JmZCwKLQkJCSBjaGFyICoqZXJyb3JfbWVzc2FnZSk7Ci0KLURFU0NSSVBUSU9OCi0JSWYgQHZhcntvdXRwdXRfYmZkfSBpcyBzdXBwbGllZCB0byB0aGlzIGZ1bmN0aW9uLCB0aGUKLQlnZW5lcmF0ZWQgaW1hZ2Ugd2lsbCBiZSByZWxvY2F0YWJsZTsgdGhlIHJlbG9jYXRpb25zIGFyZQotCWNvcGllZCB0byB0aGUgb3V0cHV0IGZpbGUgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gY2hhbmdlZCB0bwotCXJlZmxlY3QgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgd29ybGQuIFRoZXJlIGFyZSB0d28gd2F5cyBvZgotCXJlZmxlY3RpbmcgdGhlIHJlc3VsdHMgb2YgcGFydGlhbCBsaW5rYWdlIGluIGFuIG91dHB1dCBmaWxlOgotCWJ5IG1vZGlmeWluZyB0aGUgb3V0cHV0IGRhdGEgaW4gcGxhY2UsIGFuZCBieSBtb2RpZnlpbmcgdGhlCi0JcmVsb2NhdGlvbiByZWNvcmQuICBTb21lIG5hdGl2ZSBmb3JtYXRzIChlLmcuLCBiYXNpYyBhLm91dCBhbmQKLQliYXNpYyBjb2ZmKSBoYXZlIG5vIHdheSBvZiBzcGVjaWZ5aW5nIGFuIGFkZGVuZCBpbiB0aGUKLQlyZWxvY2F0aW9uIHR5cGUsIHNvIHRoZSBhZGRlbmQgaGFzIHRvIGdvIGluIHRoZSBvdXRwdXQgZGF0YS4KLQlUaGlzIGlzIG5vIGJpZyBkZWFsIHNpbmNlIGluIHRoZXNlIGZvcm1hdHMgdGhlIG91dHB1dCBkYXRhCi0Jc2xvdCB3aWxsIGFsd2F5cyBiZSBiaWcgZW5vdWdoIGZvciB0aGUgYWRkZW5kLiBDb21wbGV4IHJlbG9jCi0JdHlwZXMgd2l0aCBhZGRlbmRzIHdlcmUgaW52ZW50ZWQgdG8gc29sdmUganVzdCB0aGlzIHByb2JsZW0uCi0JVGhlIEB2YXJ7ZXJyb3JfbWVzc2FnZX0gYXJndW1lbnQgaXMgc2V0IHRvIGFuIGVycm9yIG1lc3NhZ2UgaWYKLQl0aGlzIHJldHVybiBAY29kZXtiZmRfcmVsb2NfZGFuZ2Vyb3VzfS4KLQotKi8KLQotCi1iZmRfcmVsb2Nfc3RhdHVzX3R5cGUKLWJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBkYXRhLCBpbnB1dF9zZWN0aW9uLCBvdXRwdXRfYmZkLAotCQkJZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICBiZmRfc2l6ZV90eXBlIGFkZHIgPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgYmZkX3ZtYSBvdXRwdXRfYmFzZSA9IDA7Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvID0gcmVsb2NfZW50cnktPmhvd3RvOwotICBhc2VjdGlvbiAqcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uOwotICBhc3ltYm9sICpzeW1ib2w7Ci0KLSAgc3ltYm9sID0gKihyZWxvY19lbnRyeS0+c3ltX3B0cl9wdHIpOwotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICAmJiBvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgcmV0dXJuIGFuIGVycm9yIGlmCi0gICAgIHRoZSBzeW1ib2wgaXMgbm90IGRlZmluZWQuICBBbiB1bmRlZmluZWQgd2VhayBzeW1ib2wgaXMKLSAgICAgY29uc2lkZXJlZCB0byBoYXZlIGEgdmFsdWUgb2YgemVybyAoU1ZSNCBBQkksIHAuIDQtMjcpLiAgKi8KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgJiYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfV0VBSykgPT0gMAotICAgICAgJiYgb3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZmxhZyA9IGJmZF9yZWxvY191bmRlZmluZWQ7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYSBmdW5jdGlvbiBzdXBwbGllZCB0byBoYW5kbGUgdGhpcyByZWxvY2F0aW9uIHR5cGUsCi0gICAgIGNhbGwgaXQuICBJdCdsbCByZXR1cm4gYGJmZF9yZWxvY19jb250aW51ZScgaWYgZnVydGhlciBwcm9jZXNzaW5nCi0gICAgIGNhbiBiZSBkb25lLiAgKi8KLSAgaWYgKGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uKQotICAgIHsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBjb250OwotICAgICAgY29udCA9IGhvd3RvLT5zcGVjaWFsX2Z1bmN0aW9uIChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLAotCQkJCSAgICAgIGlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsCi0JCQkJICAgICAgZXJyb3JfbWVzc2FnZSk7Ci0gICAgICBpZiAoY29udCAhPSBiZmRfcmVsb2NfY29udGludWUpCi0JcmV0dXJuIGNvbnQ7Ci0gICAgfQotCi0gIC8qIElzIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9uIHJlYWxseSB3aXRoaW4gdGhlIHNlY3Rpb24/ICAqLwotICBpZiAocmVsb2NfZW50cnktPmFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFdvcmsgb3V0IHdoaWNoIHNlY3Rpb24gdGhlIHJlbG9jYXRpb24gaXMgdGFyZ2V0dGVkIGF0IGFuZCB0aGUKLSAgICAgaW5pdGlhbCByZWxvY2F0aW9uIGNvbW1hbmQgdmFsdWUuICAqLwotCi0gIC8qIEdldCBzeW1ib2wgdmFsdWUuICAoQ29tbW9uIHN5bWJvbHMgYXJlIHNwZWNpYWwuKSAgKi8KLSAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZWxvY2F0aW9uID0gMDsKLSAgZWxzZQotICAgIHJlbG9jYXRpb24gPSBzeW1ib2wtPnZhbHVlOwotCi0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKG91dHB1dF9iZmQgJiYgaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLSAgICBvdXRwdXRfYmFzZSA9IDA7Ci0gIGVsc2UKLSAgICBvdXRwdXRfYmFzZSA9IHJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHJlbG9jYXRpb24gKz0gb3V0cHV0X2Jhc2UgKyBzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0KLSAgLyogQWRkIGluIHN1cHBsaWVkIGFkZGVuZC4gICovCi0gIHJlbG9jYXRpb24gKz0gcmVsb2NfZW50cnktPmFkZGVuZDsKLQotICAvKiBIZXJlIHRoZSB2YXJpYWJsZSByZWxvY2F0aW9uIGhvbGRzIHRoZSBmaW5hbCBhZGRyZXNzIG9mIHRoZQotICAgICBzeW1ib2wgd2UgYXJlIHJlbG9jYXRpbmcgYWdhaW5zdCwgcGx1cyBhbnkgYWRkZW5kLiAgKi8KLQotICBpZiAoaG93dG8tPnBjX3JlbGF0aXZlID09IHRydWUpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICBXZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OCi0JIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgYW5kIHRoZQotCSBsb2NhdGlvbi4gIFJFTE9DQVRJT04gaXMgYWxyZWFkeSB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sLgotCi0JIFdlIHN0YXJ0IGJ5IHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uIGNvbnRhaW5pbmcKLQkgdGhlIGxvY2F0aW9uLgotCi0JIElmIHBjcmVsX29mZnNldCBpcyBzZXQsIHdlIG11c3QgZnVydGhlciBzdWJ0cmFjdCB0aGUgcG9zaXRpb24KLQkgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbi4gIFNvbWUgdGFyZ2V0cyBhcnJhbmdlIGZvcgotCSB0aGUgYWRkZW5kIHRvIGJlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGxvY2F0aW9uCi0JIHdpdGhpbiB0aGUgc2VjdGlvbjsgZm9yIGV4YW1wbGUsIGkzODYtYW91dCBkb2VzIHRoaXMuICBGb3IKLQkgaTM4Ni1hb3V0LCBwY3JlbF9vZmZzZXQgaXMgZmFsc2UuICBTb21lIG90aGVyIHRhcmdldHMgZG8gbm90Ci0JIGluY2x1ZGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbjsgZm9yIGV4YW1wbGUsIG04OGtiY3MsCi0JIG9yIEVMRi4gIEZvciB0aG9zZSB0YXJnZXRzLCBwY3JlbF9vZmZzZXQgaXMgdHJ1ZS4KLQotCSBJZiB3ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHRoZW4gd2UgbXVzdCBlbnN1cmUKLQkgdGhhdCB0aGlzIHJlbG9jIHdpbGwgYmUgY29ycmVjdGx5IGNvbXB1dGVkIHdoZW4gdGhlIGZpbmFsCi0JIHJlbG9jYXRpb24gaXMgZG9uZS4gIElmIHBjcmVsX29mZnNldCBpcyBmYWxzZSB3ZSB3YW50IHRvIHdpbmQKLQkgdXAgd2l0aCB0aGUgbmVnYXRpdmUgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUgc2VjdGlvbiwKLQkgd2hpY2ggbWVhbnMgd2UgbXVzdCBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBieSB0aGUgY2hhbmdlCi0JIGluIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBJZiBwY3JlbF9vZmZzZXQgaXMgdHJ1ZQotCSB3ZSBkbyBub3Qgd2FudCB0byBhZGp1c3QgdGhlIGV4aXN0aW5nIGFkZGVuZCBhdCBhbGwuCi0KLQkgRklYTUU6IFRoaXMgc2VlbXMgbG9naWNhbCB0byBtZSwgYnV0IGZvciB0aGUgY2FzZSBvZgotCSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCBpdCBpcyBub3Qgd2hhdCB0aGUgY29kZQotCSBhY3R1YWxseSBkb2VzLiAgSSBkb24ndCB3YW50IHRvIGNoYW5nZSBpdCwgYmVjYXVzZSBpdCBzZWVtcwotCSBmYXIgdG9vIGxpa2VseSB0aGF0IHNvbWV0aGluZyB3aWxsIGJyZWFrLiAgKi8KLQotICAgICAgcmVsb2NhdGlvbiAtPQotCWlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCA9PSB0cnVlKQotCXJlbG9jYXRpb24gLT0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoaG93dG8tPnBhcnRpYWxfaW5wbGFjZSA9PSBmYWxzZSkKLQl7Ci0JICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBhbmQgd2Ugd2FudCB0byBhcHBseSB0aGUgcmVsb2NhdGlvbgotCSAgICAgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSAgICAgaW5wbGFjZSB0byByZWZsZWN0IHdoYXQgd2Ugbm93IGtub3cuICAqLwotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCSAgcmV0dXJuIGZsYWc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBwYXJ0aWFsIHJlbG9jYXRpb24sIGJ1dCBpbnBsYWNlLCBzbyBtb2RpZnkgdGhlCi0JICAgICByZWxvYyByZWNvcmQgYSBiaXQuCi0KLQkgICAgIElmIHdlJ3ZlIHJlbG9jYXRlZCB3aXRoIGEgc3ltYm9sIHdpdGggYSBzZWN0aW9uLCBjaGFuZ2UKLQkgICAgIGludG8gYSByZWYgdG8gdGhlIHNlY3Rpb24gYmVsb25naW5nIHRvIHRoZSBzeW1ib2wuICAqLwotCi0JICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0JICAvKiBXVEY/PyAqLwotCSAgaWYgKGFiZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmLXJzNjAwMCIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWxpdHRsZSIpICE9IDAKLQkgICAgICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWJpZyIpICE9IDApCi0JICAgIHsKLSNpZiAxCi0JICAgICAgLyogRm9yIG02OGstY29mZiwgdGhlIGFkZGVuZCB3YXMgYmVpbmcgc3VidHJhY3RlZCB0d2ljZSBkdXJpbmcKLQkJIHJlbG9jYXRpb24gd2l0aCAtci4gIFJlbW92aW5nIHRoZSBsaW5lIGJlbG93IHRoaXMgY29tbWVudAotCQkgZml4ZXMgdGhhdCBwcm9ibGVtOyBzZWUgUFIgMjk1My4KLQotSG93ZXZlciwgSWFuIHdyb3RlIHRoZSBmb2xsb3dpbmcsIHJlZ2FyZGluZyByZW1vdmluZyB0aGUgbGluZSBiZWxvdywKLXdoaWNoIGV4cGxhaW5zIHdoeSBpdCBpcyBzdGlsbCBlbmFibGVkOiAgLS1kam0KLQotSWYgeW91IHB1dCBhIHBhdGNoIGxpa2UgdGhhdCBpbnRvIEJGRCB5b3UgbmVlZCB0byBjaGVjayBhbGwgdGhlIENPRkYKLWxpbmtlcnMuICBJIGFtIGZhaXJseSBjZXJ0YWluIHRoYXQgcGF0Y2ggd2lsbCBicmVhayBjb2ZmLWkzODYgKGUuZy4sCi1TQ08pOyBzZWUgY29mZl9pMzg2X3JlbG9jIGluIGNvZmYtaTM4Ni5jIHdoZXJlIEkgd29ya2VkIGFyb3VuZCB0aGUKLXByb2JsZW0gaW4gYSBkaWZmZXJlbnQgd2F5LiAgVGhlcmUgbWF5IHZlcnkgd2VsbCBiZSBhIHJlYXNvbiB0aGF0IHRoZQotY29kZSB3b3JrcyBhcyBpdCBkb2VzLgotCi1IbW1tLiAgVGhlIGZpcnN0IG9idmlvdXMgcG9pbnQgaXMgdGhhdCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIHNob3VsZAotbm90IGhhdmUgYW55IHRlc3RzIHRoYXQgZGVwZW5kIHVwb24gdGhlIGZsYXZvdXIuICBJdCdzIHNlZW0gbGlrZQotZW50aXJlbHkgdGhlIHdyb25nIHBsYWNlIGZvciBzdWNoIGEgdGhpbmcuICBUaGUgc2Vjb25kIG9idmlvdXMgcG9pbnQKLWlzIHRoYXQgdGhlIGN1cnJlbnQgY29kZSBpZ25vcmVzIHRoZSByZWxvYyBhZGRlbmQgd2hlbiBwcm9kdWNpbmcKLXJlbG9jYXRlYWJsZSBvdXRwdXQgZm9yIENPRkYuICBUaGF0J3MgcGVjdWxpYXIuICBJbiBmYWN0LCBJIHJlYWxseQotaGF2ZSBubyBpZGVhIHdoYXQgdGhlIHBvaW50IG9mIHRoZSBsaW5lIHlvdSB3YW50IHRvIHJlbW92ZSBpcy4KLQotQSB0eXBpY2FsIENPRkYgcmVsb2Mgc3VidHJhY3RzIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgYWRkcyBpbgotdGhlIG5ldyB2YWx1ZSB0byB0aGUgbG9jYXRpb24gaW4gdGhlIG9iamVjdCBmaWxlIChpZiBpdCdzIGEgcGMKLXJlbGF0aXZlIHJlbG9jIGl0IGFkZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9sIHZhbHVlIGFuZCB0aGUKLWxvY2F0aW9uKS4gIFdoZW4gcmVsb2NhdGluZyB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoYXQgcHJvcGVydHkuCi0KLUJGRCBoYW5kbGVzIHRoaXMgYnkgc2V0dGluZyB0aGUgYWRkZW5kIHRvIHRoZSBuZWdhdGl2ZSBvZiB0aGUgb2xkCi12YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVW5mb3J0dW5hdGVseSBpdCBoYW5kbGVzIGNvbW1vbiBzeW1ib2xzIGluIGEKLW5vbi1zdGFuZGFyZCB3YXkgKGl0IGRvZXNuJ3Qgc3VidHJhY3QgdGhlIG9sZCB2YWx1ZSkgYnV0IHRoYXQncyBhCi1kaWZmZXJlbnQgc3RvcnkgKHdlIGNhbid0IGNoYW5nZSBpdCB3aXRob3V0IGxvc2luZyBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvYmplY3QgZmlsZXMpIChjb2ZmLWkzODYgZG9lcyBzdWJ0cmFjdCB0aGUgb2xkCi12YWx1ZSwgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGV4aXN0aW5nIGNvZmYtaTM4NiB0YXJnZXRzLCBsaWtlIFNDTykuCi0KLVNvIGV2ZXJ5dGhpbmcgd29ya3MgZmluZSB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFdoZW4KLXdlIGFyZSBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgbG9naWNhbGx5IHdlIHNob3VsZCBkbyBleGFjdGx5Ci13aGF0IHdlIGRvIHdoZW4gbm90IHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LiAgVGhlcmVmb3JlLCB5b3VyCi1wYXRjaCBpcyBjb3JyZWN0LiAgSW4gZmFjdCwgaXQgc2hvdWxkIHByb2JhYmx5IGFsd2F5cyBqdXN0IHNldAotcmVsb2NfZW50cnktPmFkZGVuZCB0byAwIGZvciBhbGwgY2FzZXMsIHNpbmNlIGl0IGlzLCBpbiBmYWN0LCBnb2luZyB0bwotYWRkIHRoZSB2YWx1ZSBpbnRvIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgd29uJ3QgaHVydCB0aGUgQ09GRiBjb2RlLAotd2hpY2ggZG9lc24ndCB1c2UgdGhlIGFkZGVuZDsgSSdtIG5vdCBzdXJlIHdoYXQgaXQgd2lsbCBkbyB0byBvdGhlcgotZm9ybWF0cyAodGhlIHRoaW5nIHRvIGNoZWNrIGZvciB3b3VsZCBiZSB3aGV0aGVyIGFueSBmb3JtYXRzIGJvdGggdXNlCi10aGUgYWRkZW5kIGFuZCBzZXQgcGFydGlhbF9pbnBsYWNlKS4KLQotV2hlbiBJIHdhbnRlZCB0byBtYWtlIGNvZmYtaTM4NiBwcm9kdWNlIHJlbG9jYXRlYWJsZSBvdXRwdXQsIEkgcmFuCi1pbnRvIHRoZSBwcm9ibGVtIHRoYXQgeW91IGFyZSBydW5uaW5nIGludG86IEkgd2FudGVkIHRvIHJlbW92ZSB0aGF0Ci1saW5lLiAgUmF0aGVyIHRoYW4gcmlzayBpdCwgSSBtYWRlIHRoZSBjb2ZmLWkzODYgcmVsb2NzIHVzZSBhIHNwZWNpYWwKLWZ1bmN0aW9uOyBpdCdzIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYy4gIFRoZSBmdW5jdGlvbgotc3BlY2lmaWNhbGx5IGFkZHMgdGhlIGFkZGVuZCBmaWVsZCBpbnRvIHRoZSBvYmplY3QgZmlsZSwga25vd2luZyB0aGF0Ci1iZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIG5vdCBnb2luZyB0by4gIElmIHlvdSByZW1vdmUgdGhhdCBsaW5lLCB0aGVuCi1jb2ZmLWkzODYuYyB3aWxsIHdpbmQgdXAgYWRkaW5nIHRoZSBhZGRlbmQgZmllbGQgaW4gdHdpY2UuICBJdCdzCi10cml2aWFsIHRvIGZpeDsgaXQganVzdCBuZWVkcyB0byBiZSBkb25lLgotCi1UaGUgcHJvYmxlbSB3aXRoIHJlbW92aW5nIHRoZSBsaW5lIGlzIGp1c3QgdGhhdCBpdCBtYXkgYnJlYWsgc29tZQotd29ya2luZyBjb2RlLiAgV2l0aCBCRkQgaXQncyBoYXJkIHRvIGJlIHN1cmUgb2YgYW55dGhpbmcuICBUaGUgcmlnaHQKLXdheSB0byBkZWFsIHdpdGggdGhpcyBpcyBzaW1wbHkgdG8gYnVpbGQgYW5kIHRlc3QgYXQgbGVhc3QgYWxsIHRoZQotc3VwcG9ydGVkIENPRkYgdGFyZ2V0cy4gIEl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgaWYgdGltZSBhbmQgZGlzawotc3BhY2UgY29uc3VtaW5nLiAgRm9yIGVhY2ggdGFyZ2V0OgotICAgIDEpIGJ1aWxkIHRoZSBsaW5rZXIKLSAgICAyKSBnZW5lcmF0ZSBzb21lIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IHVzaW5nIC1yIChJIHdvdWxkCi0gICAgICAgcHJvYmFibHkgdXNlIHBhcmFub2lhLm8gYW5kIGxpbmsgYWdhaW5zdCBuZXdsaWIvbGliYy5hLCB3aGljaAotICAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCB0YXJnZXRzIHdvdWxkIGJlIGF2YWlsYWJsZSBpbgotICAgICAgIC91c3IvY3lnbnVzL3Byb2dyZXNzaXZlL0gtaG9zdC90YXJnZXQvbGliL2xpYmMuYSkuCi0gICAgMykgbWFrZSB0aGUgY2hhbmdlIHRvIHJlbG9jLmMKLSAgICA0KSByZWJ1aWxkIHRoZSBsaW5rZXIKLSAgICA1KSByZXBlYXQgc3RlcCAyCi0gICAgNikgaWYgdGhlIHJlc3VsdGluZyBvYmplY3QgZmlsZXMgYXJlIHRoZSBzYW1lLCB5b3UgaGF2ZSBhdCBsZWFzdAotICAgICAgIG1hZGUgaXQgbm8gd29yc2UKLSAgICA3KSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgeW91IGhhdmUgdG8gZmlndXJlIG91dCB3aGljaCB2ZXJzaW9uIGlzCi0gICAgICAgcmlnaHQKLSovCi0JICAgICAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICAgICAgcmVsb2NfZW50cnktPmFkZGVuZCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSByZWxvY2F0aW9uOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250Ci0gICAgICAmJiBmbGFnID09IGJmZF9yZWxvY19vaykKLSAgICBmbGFnID0gYmZkX2NoZWNrX292ZXJmbG93IChob3d0by0+Y29tcGxhaW5fb25fb3ZlcmZsb3csCi0JCQkgICAgICAgaG93dG8tPmJpdHNpemUsCi0JCQkgICAgICAgaG93dG8tPnJpZ2h0c2hpZnQsCi0JCQkgICAgICAgYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoYWJmZCksCi0JCQkgICAgICAgcmVsb2NhdGlvbik7Ci0KLSAgLyoKLSAgICBFaXRoZXIgd2UgYXJlIHJlbG9jYXRpbmcgYWxsIHRoZSB3YXksIG9yIHdlIGRvbid0IHdhbnQgdG8gYXBwbHkKLSAgICB0aGUgcmVsb2NhdGlvbiB0byB0aGUgcmVsb2MgZW50cnkgKHByb2JhYmx5IGJlY2F1c2UgdGhlcmUgaXNuJ3QKLSAgICBhbnkgcm9vbSBpbiB0aGUgb3V0cHV0IGZvcm1hdCB0byBkZXNjcmliZSBhZGRlbmRzIHRvIHJlbG9jcykKLSAgICAqLwotCi0gIC8qIFRoZSBjYXN0IHRvIGJmZF92bWEgYXZvaWRzIGEgYnVnIGluIHRoZSBBbHBoYSBPU0YvMSBDIGNvbXBpbGVyCi0gICAgIChPU0YgdmVyc2lvbiAxLjMsIGNvbXBpbGVyIHZlcnNpb24gMy4xMSkuICBJdCBtaXNjb21waWxlcyB0aGUKLSAgICAgZm9sbG93aW5nIHByb2dyYW06Ci0KLSAgICAgc3RydWN0IHN0cgotICAgICB7Ci0gICAgICAgdW5zaWduZWQgaW50IGkwOwotICAgICB9IHMgPSB7IDAgfTsKLQotICAgICBpbnQKLSAgICAgbWFpbiAoKQotICAgICB7Ci0gICAgICAgdW5zaWduZWQgbG9uZyB4OwotCi0gICAgICAgeCA9IDB4MTAwMDAwMDAwOwotICAgICAgIHggPDw9ICh1bnNpZ25lZCBsb25nKSBzLmkwOwotICAgICAgIGlmICh4ID09IDApCi0JIHByaW50ZiAoImZhaWxlZFxuIik7Ci0gICAgICAgZWxzZQotCSBwcmludGYgKCJzdWNjZWVkZWQgKCVseClcbiIsIHgpOwotICAgICB9Ci0gICAgICovCi0KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIGhvd3RvLT5yaWdodHNoaWZ0OwotCi0gIC8qIFNoaWZ0IGV2ZXJ5dGhpbmcgdXAgdG8gd2hlcmUgaXQncyBnb2luZyB0byBiZSB1c2VkICovCi0KLSAgcmVsb2NhdGlvbiA8PD0gKGJmZF92bWEpIGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogV2FpdCBmb3IgdGhlIGRheSB3aGVuIGFsbCBoYXZlIHRoZSBtYXNrIGluIHRoZW0gKi8KLQotICAvKiBXaGF0IHdlIGRvOgotICAgICBpIGluc3RydWN0aW9uIHRvIGJlIGxlZnQgYWxvbmUKLSAgICAgbyBvZmZzZXQgd2l0aGluIGluc3RydWN0aW9uCi0gICAgIHIgcmVsb2NhdGlvbiBvZmZzZXQgdG8gYXBwbHkKLSAgICAgUyBzcmMgbWFzawotICAgICBEIGRzdCBtYXNrCi0gICAgIE4gfmRzdCBtYXNrCi0gICAgIEEgcGFydCAxCi0gICAgIEIgcGFydCAyCi0gICAgIFIgcmVzdWx0Ci0KLSAgICAgRG8gdGhpczoKLSAgICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgICAgICAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgICAgICAgICAgUyBTIFMgUyBTICAgIHRvIGdldCB0aGUgc2l6ZSBvZmZzZXQgd2Ugd2FudAotICAgICArICAgciByIHIgciByIHIgciByIHIgciAgdG8gZ2V0IHRoZSBmaW5hbCB2YWx1ZSB0byBwbGFjZQotICAgICBhbmQgICAgICAgICAgIEQgRCBEIEQgRCAgdG8gY2hvcCB0byByaWdodCBzaXplCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIEEgQSBBIEEgQQotICAgICBBbmQgdGhpczoKLSAgICAgLi4uICAgaSBpIGkgaSBpIG8gbyBvIG8gbyAgZnJvbSBiZmRfZ2V0PHNpemU+Ci0gICAgIGFuZCAgIE4gTiBOIE4gTiAgICAgICAgICAgIGdldCBpbnN0cnVjdGlvbgotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAuLi4gICBCIEIgQiBCIEIKLQotICAgICBBbmQgdGhlbjoKLSAgICAgQiBCIEIgQiBCCi0gICAgIG9yICAgICAgICAgICAgICBBIEEgQSBBIEEKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgUiBSIFIgUiBSIFIgUiBSIFIgUiAgICAgICAgcHV0IGludG8gYmZkX3B1dDxzaXplPgotICAgICAqLwotCi0jZGVmaW5lIERPSVQoeCkgXAotICB4ID0gKCAoeCAmIH5ob3d0by0+ZHN0X21hc2spIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyAgcmVsb2NhdGlvbikgJiBob3d0by0+ZHN0X21hc2spKQotCi0gIHN3aXRjaCAoaG93dG8tPnNpemUpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHsKLQljaGFyIHggPSBiZmRfZ2V0XzggKGFiZmQsIChjaGFyICopIGRhdGEgKyBhZGRyKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzggKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgewotCXNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMTYgKGFiZmQsIHgsICh1bnNpZ25lZCBjaGFyICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHsKLQlsb25nIHggPSBiZmRfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIC0yOgotICAgICAgewotCWxvbmcgeCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0JcmVsb2NhdGlvbiA9IC1yZWxvY2F0aW9uOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgLTE6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8xNiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLQlyZWxvY2F0aW9uID0gLXJlbG9jYXRpb247Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgeCwgKGJmZF9ieXRlICopIGRhdGEgKyBhZGRyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLyogRG8gbm90aGluZyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0jaWZkZWYgQkZENjQKLSAgICAgIHsKLQliZmRfdm1hIHggPSBiZmRfZ2V0XzY0IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfNjQgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gICAgICB9Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYmZkX3JlbG9jX290aGVyOwotICAgIH0KLQotICByZXR1cm4gZmxhZzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2luc3RhbGxfcmVsb2NhdGlvbgotCi1TWU5PUFNJUwotCWJmZF9yZWxvY19zdGF0dXNfdHlwZQotICAgICAgICAgICAgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXJlbGVudCAqcmVsb2NfZW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFRSIGRhdGEsIGJmZF92bWEgZGF0YV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbiwKLQkJCSBjaGFyICoqZXJyb3JfbWVzc2FnZSk7Ci0KLURFU0NSSVBUSU9OCi0JVGhpcyBsb29rcyByZW1hcmthYmx5IGxpa2UgPDxiZmRfcGVyZm9ybV9yZWxvY2F0aW9uPj4sIGV4Y2VwdCBpdAotCWRvZXMgbm90IGV4cGVjdCB0aGF0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiBmaWxsZWQgaW4uCi0JSS5lLiwgaXQncyBzdWl0YWJsZSBmb3IgdXNlIHdoZW4gY3JlYXRpbmcsIHJhdGhlciB0aGFuIGFwcGx5aW5nCi0JYSByZWxvY2F0aW9uLgotCi0JRm9yIG5vdywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCByZXNlcnZlZCBmb3IgdGhlCi0JYXNzZW1ibGVyLgotCi0qLwotCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotYmZkX2luc3RhbGxfcmVsb2NhdGlvbiAoYWJmZCwgcmVsb2NfZW50cnksIGRhdGFfc3RhcnQsIGRhdGFfc3RhcnRfb2Zmc2V0LAotCQkJaW5wdXRfc2VjdGlvbiwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvY19lbnRyeTsKLSAgICAgUFRSIGRhdGFfc3RhcnQ7Ci0gICAgIGJmZF92bWEgZGF0YV9zdGFydF9vZmZzZXQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSAgYmZkX3ZtYSByZWxvY2F0aW9uOwotICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgZmxhZyA9IGJmZF9yZWxvY19vazsKLSAgYmZkX3NpemVfdHlwZSBhZGRyID0gcmVsb2NfZW50cnktPmFkZHJlc3M7Ci0gIGJmZF92bWEgb3V0cHV0X2Jhc2UgPSAwOwotICByZWxvY19ob3d0b190eXBlICpob3d0byA9IHJlbG9jX2VudHJ5LT5ob3d0bzsKLSAgYXNlY3Rpb24gKnJlbG9jX3RhcmdldF9vdXRwdXRfc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICBiZmRfYnl0ZSAqZGF0YTsKLQotICBzeW1ib2wgPSAqKHJlbG9jX2VudHJ5LT5zeW1fcHRyX3B0cik7Ci0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgewotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgICAgIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGlzIGEgZnVuY3Rpb24gc3VwcGxpZWQgdG8gaGFuZGxlIHRoaXMgcmVsb2NhdGlvbiB0eXBlLAotICAgICBjYWxsIGl0LiAgSXQnbGwgcmV0dXJuIGBiZmRfcmVsb2NfY29udGludWUnIGlmIGZ1cnRoZXIgcHJvY2Vzc2luZwotICAgICBjYW4gYmUgZG9uZS4gICovCi0gIGlmIChob3d0by0+c3BlY2lhbF9mdW5jdGlvbikKLSAgICB7Ci0gICAgICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgY29udDsKLSAgCi0gICAgICAvKiBYWFggLSBUaGUgc3BlY2lhbF9mdW5jdGlvbiBjYWxscyBoYXZlbid0IGJlZW4gZml4ZWQgdXAgdG8gZGVhbAotCSB3aXRoIGNyZWF0aW5nIG5ldyByZWxvY2F0aW9ucyBhbmQgc2VjdGlvbiBjb250ZW50cy4gICovCi0gICAgICBjb250ID0gaG93dG8tPnNwZWNpYWxfZnVuY3Rpb24gKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsCi0JCQkJICAgICAgLyogWFhYIC0gTm9uLXBvcnRhYmxlISAqLwotCQkJCSAgICAgICgoYmZkX2J5dGUgKikgZGF0YV9zdGFydAotCQkJCSAgICAgICAtIGRhdGFfc3RhcnRfb2Zmc2V0KSwKLQkJCQkgICAgICBpbnB1dF9zZWN0aW9uLCBhYmZkLCBlcnJvcl9tZXNzYWdlKTsKLSAgICAgIGlmIChjb250ICE9IGJmZF9yZWxvY19jb250aW51ZSkKLQlyZXR1cm4gY29udDsKLSAgICB9Ci0KLSAgLyogSXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jYXRpb24gcmVhbGx5IHdpdGhpbiB0aGUgc2VjdGlvbj8gICovCi0gIGlmIChyZWxvY19lbnRyeS0+YWRkcmVzcyA+IGlucHV0X3NlY3Rpb24tPl9jb29rZWRfc2l6ZSkKLSAgICByZXR1cm4gYmZkX3JlbG9jX291dG9mcmFuZ2U7Ci0KLSAgLyogV29yayBvdXQgd2hpY2ggc2VjdGlvbiB0aGUgcmVsb2NhdGlvbiBpcyB0YXJnZXR0ZWQgYXQgYW5kIHRoZQotICAgICBpbml0aWFsIHJlbG9jYXRpb24gY29tbWFuZCB2YWx1ZS4gICovCi0KLSAgLyogR2V0IHN5bWJvbCB2YWx1ZS4gIChDb21tb24gc3ltYm9scyBhcmUgc3BlY2lhbC4pICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJlbG9jYXRpb24gPSAwOwotICBlbHNlCi0gICAgcmVsb2NhdGlvbiA9IHN5bWJvbC0+dmFsdWU7Ci0KLSAgcmVsb2NfdGFyZ2V0X291dHB1dF9zZWN0aW9uID0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbjsKLQotICAvKiBDb252ZXJ0IGlucHV0LXNlY3Rpb24tcmVsYXRpdmUgc3ltYm9sIHZhbHVlIHRvIGFic29sdXRlLiAgKi8KLSAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgb3V0cHV0X2Jhc2UgPSAwOwotICBlbHNlCi0gICAgb3V0cHV0X2Jhc2UgPSByZWxvY190YXJnZXRfb3V0cHV0X3NlY3Rpb24tPnZtYTsKLQotICByZWxvY2F0aW9uICs9IG91dHB1dF9iYXNlICsgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotCi0gIC8qIEFkZCBpbiBzdXBwbGllZCBhZGRlbmQuICAqLwotICByZWxvY2F0aW9uICs9IHJlbG9jX2VudHJ5LT5hZGRlbmQ7Ci0KLSAgLyogSGVyZSB0aGUgdmFyaWFibGUgcmVsb2NhdGlvbiBob2xkcyB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUKLSAgICAgc3ltYm9sIHdlIGFyZSByZWxvY2F0aW5nIGFnYWluc3QsIHBsdXMgYW55IGFkZGVuZC4gICovCi0KLSAgaWYgKGhvd3RvLT5wY19yZWxhdGl2ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgV2Ugd2FudCB0byBzZXQgUkVMT0NBVElPTgotCSB0byB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGFuZCB0aGUKLQkgbG9jYXRpb24uICBSRUxPQ0FUSU9OIGlzIGFscmVhZHkgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4KLQotCSBXZSBzdGFydCBieSBzdWJ0cmFjdGluZyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBjb250YWluaW5nCi0JIHRoZSBsb2NhdGlvbi4KLQotCSBJZiBwY3JlbF9vZmZzZXQgaXMgc2V0LCB3ZSBtdXN0IGZ1cnRoZXIgc3VidHJhY3QgdGhlIHBvc2l0aW9uCi0JIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24uICBTb21lIHRhcmdldHMgYXJyYW5nZSBmb3IKLQkgdGhlIGFkZGVuZCB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlIHBvc2l0aW9uIG9mIHRoZSBsb2NhdGlvbgotCSB3aXRoaW4gdGhlIHNlY3Rpb247IGZvciBleGFtcGxlLCBpMzg2LWFvdXQgZG9lcyB0aGlzLiAgRm9yCi0JIGkzODYtYW91dCwgcGNyZWxfb2Zmc2V0IGlzIGZhbHNlLiAgU29tZSBvdGhlciB0YXJnZXRzIGRvIG5vdAotCSBpbmNsdWRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbG9jYXRpb247IGZvciBleGFtcGxlLCBtODhrYmNzLAotCSBvciBFTEYuICBGb3IgdGhvc2UgdGFyZ2V0cywgcGNyZWxfb2Zmc2V0IGlzIHRydWUuCi0KLQkgSWYgd2UgYXJlIHByb2R1Y2luZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB0aGVuIHdlIG11c3QgZW5zdXJlCi0JIHRoYXQgdGhpcyByZWxvYyB3aWxsIGJlIGNvcnJlY3RseSBjb21wdXRlZCB3aGVuIHRoZSBmaW5hbAotCSByZWxvY2F0aW9uIGlzIGRvbmUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2Ugd2FudCB0byB3aW5kCi0JIHVwIHdpdGggdGhlIG5lZ2F0aXZlIG9mIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24sCi0JIHdoaWNoIG1lYW5zIHdlIG11c3QgYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYnkgdGhlIGNoYW5nZQotCSBpbiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uLiAgSWYgcGNyZWxfb2Zmc2V0IGlzIHRydWUKLQkgd2UgZG8gbm90IHdhbnQgdG8gYWRqdXN0IHRoZSBleGlzdGluZyBhZGRlbmQgYXQgYWxsLgotCi0JIEZJWE1FOiBUaGlzIHNlZW1zIGxvZ2ljYWwgdG8gbWUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKLQkgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQgaXQgaXMgbm90IHdoYXQgdGhlIGNvZGUKLQkgYWN0dWFsbHkgZG9lcy4gIEkgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgaXQsIGJlY2F1c2UgaXQgc2VlbXMKLQkgZmFyIHRvbyBsaWtlbHkgdGhhdCBzb21ldGhpbmcgd2lsbCBicmVhay4gICovCi0KLSAgICAgIHJlbG9jYXRpb24gLT0KLQlpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgaWYgKGhvd3RvLT5wY3JlbF9vZmZzZXQgPT0gdHJ1ZSAmJiBob3d0by0+cGFydGlhbF9pbnBsYWNlID09IHRydWUpCi0JcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkcmVzczsKLSAgICB9Ci0KLSAgaWYgKGhvd3RvLT5wYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwgYW5kIHdlIHdhbnQgdG8gYXBwbHkgdGhlIHJlbG9jYXRpb24KLQkgdG8gdGhlIHJlbG9jIGVudHJ5IHJhdGhlciB0aGFuIHRoZSByYXcgZGF0YS4gTW9kaWZ5IHRoZSByZWxvYwotCSBpbnBsYWNlIHRvIHJlZmxlY3Qgd2hhdCB3ZSBub3cga25vdy4gICovCi0gICAgICByZWxvY19lbnRyeS0+YWRkZW5kID0gcmVsb2NhdGlvbjsKLSAgICAgIHJlbG9jX2VudHJ5LT5hZGRyZXNzICs9IGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQ7Ci0gICAgICByZXR1cm4gZmxhZzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgcGFydGlhbCByZWxvY2F0aW9uLCBidXQgaW5wbGFjZSwgc28gbW9kaWZ5IHRoZQotCSByZWxvYyByZWNvcmQgYSBiaXQuCi0KLQkgSWYgd2UndmUgcmVsb2NhdGVkIHdpdGggYSBzeW1ib2wgd2l0aCBhIHNlY3Rpb24sIGNoYW5nZQotCSBpbnRvIGEgcmVmIHRvIHRoZSBzZWN0aW9uIGJlbG9uZ2luZyB0byB0aGUgc3ltYm9sLiAgKi8KLQotICAgICAgcmVsb2NfZW50cnktPmFkZHJlc3MgKz0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQotICAgICAgLyogV1RGPz8gKi8KLSAgICAgIGlmIChhYmZkLT54dmVjLT5mbGF2b3VyID09IGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJhaXhjb2ZmLXJzNjAwMCIpICE9IDAKLQkgICYmIHN0cmNtcCAoYWJmZC0+eHZlYy0+bmFtZSwgInhjb2ZmLXBvd2VybWFjIikgIT0gMAotCSAgJiYgc3RyY21wIChhYmZkLT54dmVjLT5uYW1lLCAiY29mZi1JbnRlbC1saXR0bGUiKSAhPSAwCi0JICAmJiBzdHJjbXAgKGFiZmQtPnh2ZWMtPm5hbWUsICJjb2ZmLUludGVsLWJpZyIpICE9IDApCi0JewotI2lmIDEKLS8qIEZvciBtNjhrLWNvZmYsIHRoZSBhZGRlbmQgd2FzIGJlaW5nIHN1YnRyYWN0ZWQgdHdpY2UgZHVyaW5nCi0gICByZWxvY2F0aW9uIHdpdGggLXIuICBSZW1vdmluZyB0aGUgbGluZSBiZWxvdyB0aGlzIGNvbW1lbnQKLSAgIGZpeGVzIHRoYXQgcHJvYmxlbTsgc2VlIFBSIDI5NTMuCi0KLUhvd2V2ZXIsIElhbiB3cm90ZSB0aGUgZm9sbG93aW5nLCByZWdhcmRpbmcgcmVtb3ZpbmcgdGhlIGxpbmUgYmVsb3csCi13aGljaCBleHBsYWlucyB3aHkgaXQgaXMgc3RpbGwgZW5hYmxlZDogIC0tZGptCi0KLUlmIHlvdSBwdXQgYSBwYXRjaCBsaWtlIHRoYXQgaW50byBCRkQgeW91IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBDT0ZGCi1saW5rZXJzLiAgSSBhbSBmYWlybHkgY2VydGFpbiB0aGF0IHBhdGNoIHdpbGwgYnJlYWsgY29mZi1pMzg2IChlLmcuLAotU0NPKTsgc2VlIGNvZmZfaTM4Nl9yZWxvYyBpbiBjb2ZmLWkzODYuYyB3aGVyZSBJIHdvcmtlZCBhcm91bmQgdGhlCi1wcm9ibGVtIGluIGEgZGlmZmVyZW50IHdheS4gIFRoZXJlIG1heSB2ZXJ5IHdlbGwgYmUgYSByZWFzb24gdGhhdCB0aGUKLWNvZGUgd29ya3MgYXMgaXQgZG9lcy4KLQotSG1tbS4gIFRoZSBmaXJzdCBvYnZpb3VzIHBvaW50IGlzIHRoYXQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBzaG91bGQKLW5vdCBoYXZlIGFueSB0ZXN0cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBmbGF2b3VyLiAgSXQncyBzZWVtIGxpa2UKLWVudGlyZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3Igc3VjaCBhIHRoaW5nLiAgVGhlIHNlY29uZCBvYnZpb3VzIHBvaW50Ci1pcyB0aGF0IHRoZSBjdXJyZW50IGNvZGUgaWdub3JlcyB0aGUgcmVsb2MgYWRkZW5kIHdoZW4gcHJvZHVjaW5nCi1yZWxvY2F0ZWFibGUgb3V0cHV0IGZvciBDT0ZGLiAgVGhhdCdzIHBlY3VsaWFyLiAgSW4gZmFjdCwgSSByZWFsbHkKLWhhdmUgbm8gaWRlYSB3aGF0IHRoZSBwb2ludCBvZiB0aGUgbGluZSB5b3Ugd2FudCB0byByZW1vdmUgaXMuCi0KLUEgdHlwaWNhbCBDT0ZGIHJlbG9jIHN1YnRyYWN0cyB0aGUgb2xkIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIGFkZHMgaW4KLXRoZSBuZXcgdmFsdWUgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBvYmplY3QgZmlsZSAoaWYgaXQncyBhIHBjCi1yZWxhdGl2ZSByZWxvYyBpdCBhZGRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHN5bWJvbCB2YWx1ZSBhbmQgdGhlCi1sb2NhdGlvbikuICBXaGVuIHJlbG9jYXRpbmcgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGF0IHByb3BlcnR5LgotCi1CRkQgaGFuZGxlcyB0aGlzIGJ5IHNldHRpbmcgdGhlIGFkZGVuZCB0byB0aGUgbmVnYXRpdmUgb2YgdGhlIG9sZAotdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFVuZm9ydHVuYXRlbHkgaXQgaGFuZGxlcyBjb21tb24gc3ltYm9scyBpbiBhCi1ub24tc3RhbmRhcmQgd2F5IChpdCBkb2Vzbid0IHN1YnRyYWN0IHRoZSBvbGQgdmFsdWUpIGJ1dCB0aGF0J3MgYQotZGlmZmVyZW50IHN0b3J5ICh3ZSBjYW4ndCBjaGFuZ2UgaXQgd2l0aG91dCBsb3NpbmcgYmFja3dhcmQKLWNvbXBhdGliaWxpdHkgd2l0aCBvbGQgb2JqZWN0IGZpbGVzKSAoY29mZi1pMzg2IGRvZXMgc3VidHJhY3QgdGhlIG9sZAotdmFsdWUsIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBjb2ZmLWkzODYgdGFyZ2V0cywgbGlrZSBTQ08pLgotCi1TbyBldmVyeXRoaW5nIHdvcmtzIGZpbmUgd2hlbiBub3QgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQuICBXaGVuCi13ZSBhcmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIGxvZ2ljYWxseSB3ZSBzaG91bGQgZG8gZXhhY3RseQotd2hhdCB3ZSBkbyB3aGVuIG5vdCBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dC4gIFRoZXJlZm9yZSwgeW91cgotcGF0Y2ggaXMgY29ycmVjdC4gIEluIGZhY3QsIGl0IHNob3VsZCBwcm9iYWJseSBhbHdheXMganVzdCBzZXQKLXJlbG9jX2VudHJ5LT5hZGRlbmQgdG8gMCBmb3IgYWxsIGNhc2VzLCBzaW5jZSBpdCBpcywgaW4gZmFjdCwgZ29pbmcgdG8KLWFkZCB0aGUgdmFsdWUgaW50byB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIHdvbid0IGh1cnQgdGhlIENPRkYgY29kZSwKLXdoaWNoIGRvZXNuJ3QgdXNlIHRoZSBhZGRlbmQ7IEknbSBub3Qgc3VyZSB3aGF0IGl0IHdpbGwgZG8gdG8gb3RoZXIKLWZvcm1hdHMgKHRoZSB0aGluZyB0byBjaGVjayBmb3Igd291bGQgYmUgd2hldGhlciBhbnkgZm9ybWF0cyBib3RoIHVzZQotdGhlIGFkZGVuZCBhbmQgc2V0IHBhcnRpYWxfaW5wbGFjZSkuCi0KLVdoZW4gSSB3YW50ZWQgdG8gbWFrZSBjb2ZmLWkzODYgcHJvZHVjZSByZWxvY2F0ZWFibGUgb3V0cHV0LCBJIHJhbgotaW50byB0aGUgcHJvYmxlbSB0aGF0IHlvdSBhcmUgcnVubmluZyBpbnRvOiBJIHdhbnRlZCB0byByZW1vdmUgdGhhdAotbGluZS4gIFJhdGhlciB0aGFuIHJpc2sgaXQsIEkgbWFkZSB0aGUgY29mZi1pMzg2IHJlbG9jcyB1c2UgYSBzcGVjaWFsCi1mdW5jdGlvbjsgaXQncyBjb2ZmX2kzODZfcmVsb2MgaW4gY29mZi1pMzg2LmMuICBUaGUgZnVuY3Rpb24KLXNwZWNpZmljYWxseSBhZGRzIHRoZSBhZGRlbmQgZmllbGQgaW50byB0aGUgb2JqZWN0IGZpbGUsIGtub3dpbmcgdGhhdAotYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBpcyBub3QgZ29pbmcgdG8uICBJZiB5b3UgcmVtb3ZlIHRoYXQgbGluZSwgdGhlbgotY29mZi1pMzg2LmMgd2lsbCB3aW5kIHVwIGFkZGluZyB0aGUgYWRkZW5kIGZpZWxkIGluIHR3aWNlLiAgSXQncwotdHJpdmlhbCB0byBmaXg7IGl0IGp1c3QgbmVlZHMgdG8gYmUgZG9uZS4KLQotVGhlIHByb2JsZW0gd2l0aCByZW1vdmluZyB0aGUgbGluZSBpcyBqdXN0IHRoYXQgaXQgbWF5IGJyZWFrIHNvbWUKLXdvcmtpbmcgY29kZS4gIFdpdGggQkZEIGl0J3MgaGFyZCB0byBiZSBzdXJlIG9mIGFueXRoaW5nLiAgVGhlIHJpZ2h0Ci13YXkgdG8gZGVhbCB3aXRoIHRoaXMgaXMgc2ltcGx5IHRvIGJ1aWxkIGFuZCB0ZXN0IGF0IGxlYXN0IGFsbCB0aGUKLXN1cHBvcnRlZCBDT0ZGIHRhcmdldHMuICBJdCBzaG91bGQgYmUgc3RyYWlnaHRmb3J3YXJkIGlmIHRpbWUgYW5kIGRpc2sKLXNwYWNlIGNvbnN1bWluZy4gIEZvciBlYWNoIHRhcmdldDoKLSAgICAxKSBidWlsZCB0aGUgbGlua2VyCi0gICAgMikgZ2VuZXJhdGUgc29tZSBleGVjdXRhYmxlLCBhbmQgbGluayBpdCB1c2luZyAtciAoSSB3b3VsZAotICAgICAgIHByb2JhYmx5IHVzZSBwYXJhbm9pYS5vIGFuZCBsaW5rIGFnYWluc3QgbmV3bGliL2xpYmMuYSwgd2hpY2gKLSAgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgdGFyZ2V0cyB3b3VsZCBiZSBhdmFpbGFibGUgaW4KLSAgICAgICAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9ILWhvc3QvdGFyZ2V0L2xpYi9saWJjLmEpLgotICAgIDMpIG1ha2UgdGhlIGNoYW5nZSB0byByZWxvYy5jCi0gICAgNCkgcmVidWlsZCB0aGUgbGlua2VyCi0gICAgNSkgcmVwZWF0IHN0ZXAgMgotICAgIDYpIGlmIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGVzIGFyZSB0aGUgc2FtZSwgeW91IGhhdmUgYXQgbGVhc3QKLSAgICAgICBtYWRlIGl0IG5vIHdvcnNlCi0gICAgNykgaWYgdGhleSBhcmUgZGlmZmVyZW50IHlvdSBoYXZlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggdmVyc2lvbiBpcwotICAgICAgIHJpZ2h0Ci0qLwotCSAgcmVsb2NhdGlvbiAtPSByZWxvY19lbnRyeS0+YWRkZW5kOwotI2VuZGlmCi0JICByZWxvY19lbnRyeS0+YWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVsb2NfZW50cnktPmFkZGVuZCA9IHJlbG9jYXRpb247Ci0JfQotICAgIH0KLQotICAvKiBGSVhNRTogVGhpcyBvdmVyZmxvdyBjaGVja2luZyBpcyBpbmNvbXBsZXRlLCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICBtaWdodCBoYXZlIG92ZXJmbG93ZWQgYmVmb3JlIHdlIGdldCBoZXJlLiAgRm9yIGEgY29ycmVjdCBjaGVjayB3ZQotICAgICBuZWVkIHRvIGNvbXB1dGUgdGhlIHZhbHVlIGluIGEgc2l6ZSBsYXJnZXIgdGhhbiBiaXRzaXplLCBidXQgd2UKLSAgICAgY2FuJ3QgcmVhc29uYWJseSBkbyB0aGF0IGZvciBhIHJlbG9jIHRoZSBzYW1lIHNpemUgYXMgYSBob3N0Ci0gICAgIG1hY2hpbmUgd29yZC4KLSAgICAgRklYTUU6IFdlIHNob3VsZCBhbHNvIGRvIG92ZXJmbG93IGNoZWNraW5nIG9uIHRoZSByZXN1bHQgYWZ0ZXIKLSAgICAgYWRkaW5nIGluIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyAhPSBjb21wbGFpbl9vdmVyZmxvd19kb250KQotICAgIGZsYWcgPSBiZmRfY2hlY2tfb3ZlcmZsb3cgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdywKLQkJCSAgICAgICBob3d0by0+Yml0c2l6ZSwKLQkJCSAgICAgICBob3d0by0+cmlnaHRzaGlmdCwKLQkJCSAgICAgICBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChhYmZkKSwKLQkJCSAgICAgICByZWxvY2F0aW9uKTsKLQotICAvKgotICAgIEVpdGhlciB3ZSBhcmUgcmVsb2NhdGluZyBhbGwgdGhlIHdheSwgb3Igd2UgZG9uJ3Qgd2FudCB0byBhcHBseQotICAgIHRoZSByZWxvY2F0aW9uIHRvIHRoZSByZWxvYyBlbnRyeSAocHJvYmFibHkgYmVjYXVzZSB0aGVyZSBpc24ndAotICAgIGFueSByb29tIGluIHRoZSBvdXRwdXQgZm9ybWF0IHRvIGRlc2NyaWJlIGFkZGVuZHMgdG8gcmVsb2NzKQotICAgICovCi0KLSAgLyogVGhlIGNhc3QgdG8gYmZkX3ZtYSBhdm9pZHMgYSBidWcgaW4gdGhlIEFscGhhIE9TRi8xIEMgY29tcGlsZXIKLSAgICAgKE9TRiB2ZXJzaW9uIDEuMywgY29tcGlsZXIgdmVyc2lvbiAzLjExKS4gIEl0IG1pc2NvbXBpbGVzIHRoZQotICAgICBmb2xsb3dpbmcgcHJvZ3JhbToKLQotICAgICBzdHJ1Y3Qgc3RyCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBpbnQgaTA7Ci0gICAgIH0gcyA9IHsgMCB9OwotCi0gICAgIGludAotICAgICBtYWluICgpCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIHg7Ci0KLSAgICAgICB4ID0gMHgxMDAwMDAwMDA7Ci0gICAgICAgeCA8PD0gKHVuc2lnbmVkIGxvbmcpIHMuaTA7Ci0gICAgICAgaWYgKHggPT0gMCkKLQkgcHJpbnRmICgiZmFpbGVkXG4iKTsKLSAgICAgICBlbHNlCi0JIHByaW50ZiAoInN1Y2NlZWRlZCAoJWx4KVxuIiwgeCk7Ci0gICAgIH0KLSAgICAgKi8KLQotICByZWxvY2F0aW9uID4+PSAoYmZkX3ZtYSkgaG93dG8tPnJpZ2h0c2hpZnQ7Ci0KLSAgLyogU2hpZnQgZXZlcnl0aGluZyB1cCB0byB3aGVyZSBpdCdzIGdvaW5nIHRvIGJlIHVzZWQgKi8KLQotICByZWxvY2F0aW9uIDw8PSAoYmZkX3ZtYSkgaG93dG8tPmJpdHBvczsKLQotICAvKiBXYWl0IGZvciB0aGUgZGF5IHdoZW4gYWxsIGhhdmUgdGhlIG1hc2sgaW4gdGhlbSAqLwotCi0gIC8qIFdoYXQgd2UgZG86Ci0gICAgIGkgaW5zdHJ1Y3Rpb24gdG8gYmUgbGVmdCBhbG9uZQotICAgICBvIG9mZnNldCB3aXRoaW4gaW5zdHJ1Y3Rpb24KLSAgICAgciByZWxvY2F0aW9uIG9mZnNldCB0byBhcHBseQotICAgICBTIHNyYyBtYXNrCi0gICAgIEQgZHN0IG1hc2sKLSAgICAgTiB+ZHN0IG1hc2sKLSAgICAgQSBwYXJ0IDEKLSAgICAgQiBwYXJ0IDIKLSAgICAgUiByZXN1bHQKLQotICAgICBEbyB0aGlzOgotICAgICBpIGkgaSBpIGkgbyBvIG8gbyBvICAgICAgICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgICAgICAgICBTIFMgUyBTIFMgICAgdG8gZ2V0IHRoZSBzaXplIG9mZnNldCB3ZSB3YW50Ci0gICAgICsgICByIHIgciByIHIgciByIHIgciByICB0byBnZXQgdGhlIGZpbmFsIHZhbHVlIHRvIHBsYWNlCi0gICAgIGFuZCAgICAgICAgICAgRCBEIEQgRCBEICB0byBjaG9wIHRvIHJpZ2h0IHNpemUKLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgQSBBIEEgQSBBCi0gICAgIEFuZCB0aGlzOgotICAgICAuLi4gICBpIGkgaSBpIGkgbyBvIG8gbyBvICBmcm9tIGJmZF9nZXQ8c2l6ZT4KLSAgICAgYW5kICAgTiBOIE4gTiBOICAgICAgICAgICAgZ2V0IGluc3RydWN0aW9uCi0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIC4uLiAgIEIgQiBCIEIgQgotCi0gICAgIEFuZCB0aGVuOgotICAgICBCIEIgQiBCIEIKLSAgICAgb3IgICAgICAgICAgICAgIEEgQSBBIEEgQQotICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICBSIFIgUiBSIFIgUiBSIFIgUiBSICAgICAgICBwdXQgaW50byBiZmRfcHV0PHNpemU+Ci0gICAgICovCi0KLSNkZWZpbmUgRE9JVCh4KSBcCi0gIHggPSAoICh4ICYgfmhvd3RvLT5kc3RfbWFzaykgfCAoKCh4ICYgaG93dG8tPnNyY19tYXNrKSArICByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpCi0KLSAgZGF0YSA9IChiZmRfYnl0ZSAqKSBkYXRhX3N0YXJ0ICsgKGFkZHIgLSBkYXRhX3N0YXJ0X29mZnNldCk7Ci0KLSAgc3dpdGNoIChob3d0by0+c2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgewotCWNoYXIgeCA9IGJmZF9nZXRfOCAoYWJmZCwgKGNoYXIgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF84IChhYmZkLCB4LCAodW5zaWduZWQgY2hhciAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgewotCXNob3J0IHggPSBiZmRfZ2V0XzE2IChhYmZkLCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0JRE9JVCAoeCk7Ci0JYmZkX3B1dF8xNiAoYWJmZCwgeCwgKHVuc2lnbmVkIGNoYXIgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCURPSVQgKHgpOwotCWJmZF9wdXRfMzIgKGFiZmQsIHgsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgLTI6Ci0gICAgICB7Ci0JbG9uZyB4ID0gYmZkX2dldF8zMiAoYWJmZCwgKGJmZF9ieXRlICopIGRhdGEpOwotCXJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQlET0lUICh4KTsKLQliZmRfcHV0XzMyIChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIERvIG5vdGhpbmcgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgewotCWJmZF92bWEgeCA9IGJmZF9nZXRfNjQgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhKTsKLQlET0lUICh4KTsKLQliZmRfcHV0XzY0IChhYmZkLCB4LCAoYmZkX2J5dGUgKikgZGF0YSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vdGhlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLS8qIFRoaXMgcmVsb2NhdGlvbiByb3V0aW5lIGlzIHVzZWQgYnkgc29tZSBvZiB0aGUgYmFja2VuZCBsaW5rZXJzLgotICAgVGhleSBkbyBub3QgY29uc3RydWN0IGFzeW1ib2wgb3IgYXJlbGVudCBzdHJ1Y3R1cmVzLCBzbyB0aGVyZSBpcyBubwotICAgcmVhc29uIGZvciB0aGVtIHRvIHVzZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLiAgQWxzbywKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gaXMgc28gaGFja2VkIHVwIGl0IGlzIGVhc2llciB0byB3cml0ZSBhIG5ldwotICAgZnVuY3Rpb24gdGhhbiB0byB0cnkgdG8gZGVhbCB3aXRoIGl0LgotCi0gICBUaGlzIHJvdXRpbmUgZG9lcyBhIGZpbmFsIHJlbG9jYXRpb24uICBXaGV0aGVyIGl0IGlzIHVzZWZ1bCBmb3IgYQotICAgcmVsb2NhdGVhYmxlIGxpbmsgZGVwZW5kcyB1cG9uIGhvdyB0aGUgb2JqZWN0IGZvcm1hdCBkZWZpbmVzCi0gICByZWxvY2F0aW9ucy4KLQotICAgRklYTUU6IFRoaXMgcm91dGluZSBpZ25vcmVzIGFueSBzcGVjaWFsX2Z1bmN0aW9uIGluIHRoZSBIT1dUTywKLSAgIHNpbmNlIHRoZSBleGlzdGluZyBzcGVjaWFsX2Z1bmN0aW9uIHZhbHVlcyBoYXZlIGJlZW4gd3JpdHRlbiBmb3IKLSAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24uCi0KLSAgIEhPV1RPIGlzIHRoZSByZWxvYyBob3d0byBpbmZvcm1hdGlvbi4KLSAgIElOUFVUX0JGRCBpcyB0aGUgQkZEIHdoaWNoIHRoZSByZWxvYyBhcHBsaWVzIHRvLgotICAgSU5QVVRfU0VDVElPTiBpcyB0aGUgc2VjdGlvbiB3aGljaCB0aGUgcmVsb2MgYXBwbGllcyB0by4KLSAgIENPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbi4KLSAgIEFERFJFU1MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbG9jIHdpdGhpbiBJTlBVVF9TRUNUSU9OLgotICAgVkFMVUUgaXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgdGhlIHJlbG9jIHJlZmVycyB0by4KLSAgIEFEREVORCBpcyB0aGUgYWRkZW5kIG9mIHRoZSByZWxvYy4gICovCi0KLWJmZF9yZWxvY19zdGF0dXNfdHlwZQotX2JmZF9maW5hbF9saW5rX3JlbG9jYXRlIChob3d0bywgaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uLCBjb250ZW50cywgYWRkcmVzcywKLQkJCSAgdmFsdWUsIGFkZGVuZCkKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBhc2VjdGlvbiAqaW5wdXRfc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0KLSAgLyogU2FuaXR5IGNoZWNrIHRoZSBhZGRyZXNzLiAgKi8KLSAgaWYgKGFkZHJlc3MgPiBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdXRvZnJhbmdlOwotCi0gIC8qIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYSBiYXNpYyByZWxvY2F0aW9uCi0gICAgIGFnYWluc3QgYSBzeW1ib2wuICBXZSB3YW50IHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgdG8KLSAgICAgcmVsb2NhdGUgdG8uICBUaGlzIGlzIGp1c3QgVkFMVUUsIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLCBwbHVzCi0gICAgIEFEREVORCwgYW55IGFkZGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbG9jLiAgKi8KLSAgcmVsb2NhdGlvbiA9IHZhbHVlICsgYWRkZW5kOwotCi0gIC8qIElmIHRoZSByZWxvY2F0aW9uIGlzIFBDIHJlbGF0aXZlLCB3ZSB3YW50IHRvIHNldCBSRUxPQ0FUSU9OIHRvCi0gICAgIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzeW1ib2wgKGN1cnJlbnRseSBpbiBSRUxPQ0FUSU9OKSBhbmQgdGhlCi0gICAgIGxvY2F0aW9uIHdlIGFyZSByZWxvY2F0aW5nLiAgU29tZSB0YXJnZXRzIChlLmcuLCBpMzg2LWFvdXQpCi0gICAgIGFycmFuZ2UgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiB0byBiZSB0aGUgbmVnYXRpdmUgb2YgdGhlCi0gICAgIG9mZnNldCBvZiB0aGUgbG9jYXRpb24gd2l0aGluIHRoZSBzZWN0aW9uOyBmb3Igc3VjaCB0YXJnZXRzCi0gICAgIHBjcmVsX29mZnNldCBpcyBmYWxzZS4gIE90aGVyIHRhcmdldHMgKGUuZy4sIG04OGtiY3Mgb3IgRUxGKQotICAgICBzaW1wbHkgbGVhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIGFzIHplcm87IGZvciBzdWNoCi0gICAgIHRhcmdldHMgcGNyZWxfb2Zmc2V0IGlzIHRydWUuICBJZiBwY3JlbF9vZmZzZXQgaXMgZmFsc2Ugd2UgZG8gbm90Ci0gICAgIG5lZWQgdG8gc3VidHJhY3Qgb3V0IHRoZSBvZmZzZXQgb2YgdGhlIGxvY2F0aW9uIHdpdGhpbiB0aGUKLSAgICAgc2VjdGlvbiAod2hpY2ggaXMganVzdCBBRERSRVNTKS4gICovCi0gIGlmIChob3d0by0+cGNfcmVsYXRpdmUpCi0gICAgewotICAgICAgcmVsb2NhdGlvbiAtPSAoaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpZiAoaG93dG8tPnBjcmVsX29mZnNldCkKLQlyZWxvY2F0aW9uIC09IGFkZHJlc3M7Ci0gICAgfQotCi0gIHJldHVybiBfYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLAotCQkJCSBjb250ZW50cyArIGFkZHJlc3MpOwotfQotCi0vKiBSZWxvY2F0ZSBhIGdpdmVuIGxvY2F0aW9uIHVzaW5nIGEgZ2l2ZW4gdmFsdWUgYW5kIGhvd3RvLiAgKi8KLQotYmZkX3JlbG9jX3N0YXR1c190eXBlCi1fYmZkX3JlbG9jYXRlX2NvbnRlbnRzIChob3d0bywgaW5wdXRfYmZkLCByZWxvY2F0aW9uLCBsb2NhdGlvbikKLSAgICAgcmVsb2NfaG93dG9fdHlwZSAqaG93dG87Ci0gICAgIGJmZCAqaW5wdXRfYmZkOwotICAgICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gICAgIGJmZF9ieXRlICpsb2NhdGlvbjsKLXsKLSAgaW50IHNpemU7Ci0gIGJmZF92bWEgeDsKLSAgYm9vbGVhbiBvdmVyZmxvdzsKLSAgdW5zaWduZWQgaW50IHJpZ2h0c2hpZnQgPSBob3d0by0+cmlnaHRzaGlmdDsKLSAgdW5zaWduZWQgaW50IGJpdHBvcyA9IGhvd3RvLT5iaXRwb3M7Ci0KLSAgLyogSWYgdGhlIHNpemUgaXMgbmVnYXRpdmUsIG5lZ2F0ZSBSRUxPQ0FUSU9OLiAgVGhpcyBpc24ndCB2ZXJ5Ci0gICAgIGdlbmVyYWwuICAqLwotICBpZiAoaG93dG8tPnNpemUgPCAwKQotICAgIHJlbG9jYXRpb24gPSAtcmVsb2NhdGlvbjsKLQotICAvKiBHZXQgdGhlIHZhbHVlIHdlIGFyZSBnb2luZyB0byByZWxvY2F0ZS4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICAgIHggPSBiZmRfZ2V0XzggKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgeCA9IGJmZF9nZXRfMTYgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgeCA9IGJmZF9nZXRfMzIgKGlucHV0X2JmZCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmZGVmIEJGRDY0Ci0gICAgICB4ID0gYmZkX2dldF82NCAoaW5wdXRfYmZkLCBsb2NhdGlvbik7Ci0jZWxzZQotICAgICAgYWJvcnQgKCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICBGSVhNRTogV2UgbWF5IGRyb3AgYml0cyBkdXJpbmcgdGhlIGFkZGl0aW9uCi0gICAgIHdoaWNoIHdlIGRvbid0IGNoZWNrIGZvci4gIFdlIG11c3QgZWl0aGVyIGNoZWNrIGF0IGV2ZXJ5IHNpbmdsZQotICAgICBvcGVyYXRpb24sIHdoaWNoIHdvdWxkIGJlIHRlZGlvdXMsIG9yIHdlIG11c3QgZG8gdGhlIGNvbXB1dGF0aW9ucwotICAgICBpbiBhIHR5cGUgbGFyZ2VyIHRoYW4gYmZkX3ZtYSwgd2hpY2ggd291bGQgYmUgaW5lZmZpY2llbnQuICAqLwotICBvdmVyZmxvdyA9IGZhbHNlOwotICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ICE9IGNvbXBsYWluX292ZXJmbG93X2RvbnQpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRybWFzaywgZmllbGRtYXNrLCBzaWdubWFzaywgc3M7Ci0gICAgICBiZmRfdm1hIGEsIGIsIHN1bTsKLQotICAgICAgLyogR2V0IHRoZSB2YWx1ZXMgdG8gYmUgYWRkZWQgdG9nZXRoZXIuICBGb3Igc2lnbmVkIGFuZCB1bnNpZ25lZAotICAgICAgICAgcmVsb2NhdGlvbnMsIHdlIGFzc3VtZSB0aGF0IGFsbCB2YWx1ZXMgc2hvdWxkIGJlIHRydW5jYXRlZCB0bwotICAgICAgICAgdGhlIHNpemUgb2YgYW4gYWRkcmVzcy4gIEZvciBiaXRmaWVsZHMsIGFsbCB0aGUgYml0cyBtYXR0ZXIuCi0gICAgICAgICBTZWUgYWxzbyBiZmRfY2hlY2tfb3ZlcmZsb3cuICAqLwotICAgICAgZmllbGRtYXNrID0gTl9PTkVTIChob3d0by0+Yml0c2l6ZSk7Ci0gICAgICBhZGRybWFzayA9IE5fT05FUyAoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSkgfCBmaWVsZG1hc2s7Ci0gICAgICBhID0gcmVsb2NhdGlvbjsKLSAgICAgIGIgPSB4ICYgaG93dG8tPnNyY19tYXNrOwotCi0gICAgICBzd2l0Y2ggKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdykKLQl7Ci0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQ6Ci0JICBhID0gKGEgJiBhZGRybWFzaykgPj4gcmlnaHRzaGlmdDsKLQotCSAgLyogSWYgYW55IHNpZ24gYml0cyBhcmUgc2V0LCBhbGwgc2lnbiBiaXRzIG11c3QgYmUgc2V0LgotCSAgICAgVGhhdCBpcywgQSBtdXN0IGJlIGEgdmFsaWQgbmVnYXRpdmUgYWRkcmVzcyBhZnRlcgotCSAgICAgc2hpZnRpbmcuICAqLwotCSAgc2lnbm1hc2sgPSB+IChmaWVsZG1hc2sgPj4gMSk7Ci0JICBzcyA9IGEgJiBzaWdubWFzazsKLQkgIGlmIChzcyAhPSAwICYmIHNzICE9ICgoYWRkcm1hc2sgPj4gcmlnaHRzaGlmdCkgJiBzaWdubWFzaykpCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQotCSAgLyogV2Ugb25seSBuZWVkIHRoaXMgbmV4dCBiaXQgb2YgY29kZSBpZiB0aGUgc2lnbiBiaXQgb2YgQgotICAgICAgICAgICAgIGlzIGJlbG93IHRoZSBzaWduIGJpdCBvZiBBLiAgVGhpcyB3b3VsZCBvbmx5IGhhcHBlbiBpZgotICAgICAgICAgICAgIFNSQ19NQVNLIGhhZCBmZXdlciBiaXRzIHRoYW4gQklUU0laRS4gIE5vdGUgdGhhdCBpZgotICAgICAgICAgICAgIFNSQ19NQVNLIGhhcyBtb3JlIGJpdHMgdGhhbiBCSVRTSVpFLCB3ZSBjYW4gZ2V0IGludG8KLSAgICAgICAgICAgICB0cm91YmxlOyB3ZSB3b3VsZCBuZWVkIHRvIHZlcmlmeSB0aGF0IEIgaXMgaW4gcmFuZ2UsIGFzCi0gICAgICAgICAgICAgd2UgZG8gZm9yIEEgYWJvdmUuICAqLwotCSAgc2lnbm1hc2sgPSAoKH4gaG93dG8tPnNyY19tYXNrKSA+PiAxKSAmIGhvd3RvLT5zcmNfbWFzazsKLQkgIGlmICgoYiAmIHNpZ25tYXNrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogU2V0IGFsbCB0aGUgYml0cyBhYm92ZSB0aGUgc2lnbiBiaXQuICAqLwotCSAgICAgIGIgLT0gc2lnbm1hc2sgPDw9IDE7Ci0JICAgIH0KLQotCSAgYiA9IChiICYgYWRkcm1hc2spID4+IGJpdHBvczsKLQotCSAgLyogTm93IHdlIGNhbiBkbyB0aGUgYWRkaXRpb24uICAqLwotCSAgc3VtID0gYSArIGI7Ci0KLQkgIC8qIFNlZSBpZiB0aGUgcmVzdWx0IGhhcyB0aGUgY29ycmVjdCBzaWduLiAgQml0cyBhYm92ZSB0aGUKLSAgICAgICAgICAgICBzaWduIGJpdCBhcmUganVuayBub3c7IGlnbm9yZSB0aGVtLiAgSWYgdGhlIHN1bSBpcwotICAgICAgICAgICAgIHBvc2l0aXZlLCBtYWtlIHN1cmUgd2UgZGlkIG5vdCBoYXZlIGFsbCBuZWdhdGl2ZSBpbnB1dHM7Ci0gICAgICAgICAgICAgaWYgdGhlIHN1bSBpcyBuZWdhdGl2ZSwgbWFrZSBzdXJlIHdlIGRpZCBub3QgaGF2ZSBhbGwKLSAgICAgICAgICAgICBwb3NpdGl2ZSBpbnB1dHMuICBUaGUgdGVzdCBiZWxvdyBsb29rcyBvbmx5IGF0IHRoZSBzaWduCi0gICAgICAgICAgICAgYml0cywgYW5kIGl0IHJlYWxseSBqdXN0Ci0JICAgICAgICAgU0lHTiAoQSkgPT0gU0lHTiAoQikgJiYgU0lHTiAoQSkgIT0gU0lHTiAoU1VNKQotCSAgICAgKi8KLQkgIHNpZ25tYXNrID0gKGZpZWxkbWFzayA+PiAxKSArIDE7Ci0JICBpZiAoKCh+IChhIF4gYikpICYgKGEgXiBzdW0pKSAmIHNpZ25tYXNrKQotCSAgICBvdmVyZmxvdyA9IHRydWU7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBjb21wbGFpbl9vdmVyZmxvd191bnNpZ25lZDoKLQkgIC8qIENoZWNraW5nIGZvciBhbiB1bnNpZ25lZCBvdmVyZmxvdyBpcyByZWxhdGl2ZWx5IGVhc3k6Ci0gICAgICAgICAgICAgdHJpbSB0aGUgYWRkcmVzc2VzIGFuZCBhZGQsIGFuZCB0cmltIHRoZSByZXN1bHQgYXMgd2VsbC4KLSAgICAgICAgICAgICBPdmVyZmxvdyBpcyBub3JtYWxseSBpbmRpY2F0ZWQgd2hlbiB0aGUgcmVzdWx0IGRvZXMgbm90Ci0gICAgICAgICAgICAgZml0IGluIHRoZSBmaWVsZC4gIEhvd2V2ZXIsIHdlIGFsc28gbmVlZCB0byBjb25zaWRlciB0aGUKLSAgICAgICAgICAgICBjYXNlIHdoZW4sIGUuZy4sIGZpZWxkbWFzayBpcyAweDdmZmZmZmZmIG9yIHNtYWxsZXIsIGFuCi0gICAgICAgICAgICAgaW5wdXQgaXMgMHg4MDAwMDAwMCwgYW5kIGJmZF92bWEgaXMgb25seSAzMiBiaXRzOyB0aGVuIHdlCi0gICAgICAgICAgICAgd2lsbCBnZXQgc3VtID09IDAsIGJ1dCB0aGVyZSBpcyBhbiBvdmVyZmxvdywgc2luY2UgdGhlCi0gICAgICAgICAgICAgaW5wdXRzIGRpZCBub3QgZml0IGluIHRoZSBmaWVsZC4gIEluc3RlYWQgb2YgZG9pbmcgYQotICAgICAgICAgICAgIHNlcGFyYXRlIHRlc3QsIHdlIGNhbiBjaGVjayBmb3IgdGhpcyBieSBvci1pbmcgaW4gdGhlCi0gICAgICAgICAgICAgb3BlcmFuZHMgd2hlbiB0ZXN0aW5nIGZvciB0aGUgc3VtIG92ZXJmbG93aW5nIGl0cyBmaW5hbAotICAgICAgICAgICAgIGZpZWxkLiAgKi8KLQkgIGEgPSAoYSAmIGFkZHJtYXNrKSA+PiByaWdodHNoaWZ0OwotCSAgYiA9IChiICYgYWRkcm1hc2spID4+IGJpdHBvczsKLQkgIHN1bSA9IChhICsgYikgJiBhZGRybWFzazsKLQkgIGlmICgoYSB8IGIgfCBzdW0pICYgfiBmaWVsZG1hc2spCi0JICAgIG92ZXJmbG93ID0gdHJ1ZTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkOgotCSAgLyogTXVjaCBsaWtlIHVuc2lnbmVkLCBleGNlcHQgbm8gdHJpbW1pbmcgd2l0aCBhZGRybWFzay4gIEluCi0gICAgICAgICAgICAgYWRkaXRpb24sIHRoZSBzdW0gb3ZlcmZsb3dzIGlmIHRoZXJlIGlzIGEgY2Fycnkgb3V0IG9mCi0gICAgICAgICAgICAgdGhlIGJmZF92bWEsIGkuZS4sIHRoZSBzdW0gaXMgbGVzcyB0aGFuIGVpdGhlciBpbnB1dAotICAgICAgICAgICAgIG9wZXJhbmQuICAqLwotCSAgYSA+Pj0gcmlnaHRzaGlmdDsKLQkgIGIgPj49IGJpdHBvczsKLQotCSAgLyogQml0ZmllbGRzIGFyZSBzb21ldGltZXMgdXNlZCBmb3Igc2lnbmVkIG51bWJlcnM7IGZvcgotICAgICAgICAgICAgIGV4YW1wbGUsIGEgMTMtYml0IGZpZWxkIHNvbWV0aW1lcyByZXByZXNlbnRzIHZhbHVlcyBpbgotICAgICAgICAgICAgIDAuLjgxOTEgYW5kIHNvbWV0aW1lcyByZXByZXNlbnRzIHZhbHVlcyBpbiAtNDA5Ni4uNDA5NS4KLSAgICAgICAgICAgICBJZiB0aGUgZmllbGQgaXMgc2lnbmVkIGFuZCBhIGlzIC00MDk1ICgweDEwMDEpIGFuZCBiIGlzCi0gICAgICAgICAgICAgLTEgKDB4MWZmZiksIHRoZSBzdW0gaXMgLTQwOTYgKDB4MTAwMCksIGJ1dCAoMHgxMDAxICsKLSAgICAgICAgICAgICAweDFmZmYgaXMgMHgzMDAwKS4gIEl0J3Mgbm90IGNsZWFyIGhvdyB0byBoYW5kbGUgdGhpcwotICAgICAgICAgICAgIGV2ZXJ5d2hlcmUsIHNpbmNlIHRoZXJlIGlzIG5vdCB3YXkgdG8ga25vdyBob3cgbWFueSBiaXRzCi0gICAgICAgICAgICAgYXJlIHNpZ25pZmljYW50IGluIHRoZSByZWxvY2F0aW9uLCBidXQgdGhlIG9yaWdpbmFsIGNvZGUKLSAgICAgICAgICAgICBhc3N1bWVkIHRoYXQgaXQgd2FzIGZ1bGx5IHNpZ24gZXh0ZW5kZWQsIGFuZCB3ZSB3aWxsIGtlZXAKLSAgICAgICAgICAgICB0aGF0IGFzc3VtcHRpb24uICAqLwotCSAgc2lnbm1hc2sgPSAoZmllbGRtYXNrID4+IDEpICsgMTsKLQotCSAgaWYgKChhICYgfiBmaWVsZG1hc2spICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBTb21lIGJpdHMgb3V0IG9mIHRoZSBmaWVsZCBhcmUgc2V0LiAgVGhpcyBtaWdodCBub3QKLSAgICAgICAgICAgICAgICAgYmUgYSBwcm9ibGVtOiBpZiB0aGlzIGlzIGEgc2lnbmVkIGJpdGZpZWxkLCBpdCBpcyBPSwotICAgICAgICAgICAgICAgICBpZmYgYWxsIHRoZSBoaWdoIGJpdHMgYXJlIHNldCwgaW5jbHVkaW5nIHRoZSBzaWduCi0gICAgICAgICAgICAgICAgIGJpdC4gIFdlJ2xsIHRyeSBzZXR0aW5nIGFsbCBidXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQKLSAgICAgICAgICAgICAgICAgYml0IGluIHRoZSBvcmlnaW5hbCByZWxvY2F0aW9uIHZhbHVlOiBpZiB0aGlzIGlzIGFsbAotICAgICAgICAgICAgICAgICBvbmVzLCB3ZSBhcmUgT0ssIGFzc3VtaW5nIGEgc2lnbmVkIGJpdGZpZWxkLiAgKi8KLQkgICAgICBzcyA9IChzaWdubWFzayA8PCByaWdodHNoaWZ0KSAtIDE7Ci0JICAgICAgaWYgKChzcyB8IHJlbG9jYXRpb24pICE9IH4gKGJmZF92bWEpIDApCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgICBhICY9IGZpZWxkbWFzazsKLQkgICAgfQotCi0JICAvKiBXZSBqdXN0IGFzc3VtZSAoYiAmIH4gZmllbGRtYXNrKSA9PSAwLiAgKi8KLQotCSAgLyogV2UgZXhwbGljaXRseSBwZXJtaXQgd3JhcCBhcm91bmQgaWYgdGhpcyByZWxvY2F0aW9uCi0JICAgICBjb3ZlcnMgdGhlIGhpZ2ggYml0IG9mIGFuIGFkZHJlc3MuICBUaGUgTGludXgga2VybmVsCi0JICAgICByZWxpZXMgb24gaXQsIGFuZCBpdCBpcyB0aGUgb25seSB3YXkgdG8gd3JpdGUgYXNzZW1ibGVyCi0JICAgICBjb2RlIHdoaWNoIGNhbiBydW4gd2hlbiBsb2FkZWQgYXQgYSBsb2NhdGlvbiAweDgwMDAwMDAwCi0JICAgICBhd2F5IGZyb20gdGhlIGxvY2F0aW9uIGF0IHdoaWNoIGl0IGlzIGxpbmtlZC4gICovCi0JICBpZiAoaG93dG8tPmJpdHNpemUgKyByaWdodHNoaWZ0Ci0JICAgICAgPT0gYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoaW5wdXRfYmZkKSkKLQkgICAgYnJlYWs7Ci0KLQkgIHN1bSA9IGEgKyBiOwotCSAgaWYgKHN1bSA8IGEgfHwgKHN1bSAmIH4gZmllbGRtYXNrKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgd2FzIGEgY2Fycnkgb3V0LCBvciB0aGUgZmllbGQgb3ZlcmZsb3cuICBUZXN0Ci0gICAgICAgICAgICAgICAgIGZvciBzaWduZWQgb3BlcmFuZHMgYWdhaW4uICBIZXJlIGlzIHRoZSBvdmVyZmxvdyB0ZXN0Ci0gICAgICAgICAgICAgICAgIGlzIGFzIGZvciBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQuICAqLwotCSAgICAgIGlmICgoKH4gKGEgXiBiKSkgJiAoYSBeIHN1bSkpICYgc2lnbm1hc2spCi0JCW92ZXJmbG93ID0gdHJ1ZTsKLQkgICAgfQotCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIFB1dCBSRUxPQ0FUSU9OIGluIHRoZSByaWdodCBiaXRzLiAgKi8KLSAgcmVsb2NhdGlvbiA+Pj0gKGJmZF92bWEpIHJpZ2h0c2hpZnQ7Ci0gIHJlbG9jYXRpb24gPDw9IChiZmRfdm1hKSBiaXRwb3M7Ci0KLSAgLyogQWRkIFJFTE9DQVRJT04gdG8gdGhlIHJpZ2h0IGJpdHMgb2YgWC4gICovCi0gIHggPSAoKHggJiB+aG93dG8tPmRzdF9tYXNrKQotICAgICAgIHwgKCgoeCAmIGhvd3RvLT5zcmNfbWFzaykgKyByZWxvY2F0aW9uKSAmIGhvd3RvLT5kc3RfbWFzaykpOwotCi0gIC8qIFB1dCB0aGUgcmVsb2NhdGVkIHZhbHVlIGJhY2sgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgMToKLSAgICAgIGJmZF9wdXRfOCAoaW5wdXRfYmZkLCB4LCBsb2NhdGlvbik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBiZmRfcHV0XzE2IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGJmZF9wdXRfMzIgKGlucHV0X2JmZCwgeCwgbG9jYXRpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotI2lmZGVmIEJGRDY0Ci0gICAgICBiZmRfcHV0XzY0IChpbnB1dF9iZmQsIHgsIGxvY2F0aW9uKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBvdmVyZmxvdyA/IGJmZF9yZWxvY19vdmVyZmxvdyA6IGJmZF9yZWxvY19vazsKLX0KLQotLyoKLURPQ0RECi1JTk9ERQotCWhvd3RvIG1hbmFnZXIsICAsIHR5cGVkZWYgYXJlbGVudCwgUmVsb2NhdGlvbnMKLQotU0VDVElPTgotCVRoZSBob3d0byBtYW5hZ2VyCi0KLQlXaGVuIGFuIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGNyZWF0ZSBhIHJlbG9jYXRpb24sIGJ1dCBkb2Vzbid0Ci0Ja25vdyB3aGF0IHRoZSB0YXJnZXQgbWFjaGluZSBtaWdodCBjYWxsIGl0LCBpdCBjYW4gZmluZCBvdXQgYnkKLQl1c2luZyB0aGlzIGJpdCBvZiBjb2RlLgotCi0qLwotCi0vKgotVFlQRURFRgotCWJmZF9yZWxvY19jb2RlX3R5cGUKLQotREVTQ1JJUFRJT04KLQlUaGUgaW5zaWRlcyBvZiBhIHJlbG9jIGNvZGUuICBUaGUgaWRlYSBpcyB0aGF0LCBldmVudHVhbGx5LCB0aGVyZQotCXdpbGwgYmUgb25lIGVudW1lcmF0b3IgZm9yIGV2ZXJ5IHR5cGUgb2YgcmVsb2NhdGlvbiB3ZSBldmVyIGRvLgotCVBhc3Mgb25lIG9mIHRoZXNlIHZhbHVlcyB0byA8PGJmZF9yZWxvY190eXBlX2xvb2t1cD4+LCBhbmQgaXQnbGwKLQlyZXR1cm4gYSBob3d0byBwb2ludGVyLgotCi0JVGhpcyBkb2VzIG1lYW4gdGhhdCB0aGUgYXBwbGljYXRpb24gbXVzdCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QKLQllbnVtZXJhdG9yIHZhbHVlOyB5b3UgY2FuJ3QgZ2V0IGEgaG93dG8gcG9pbnRlciBmcm9tIGEgcmFuZG9tIHNldAotCW9mIGF0dHJpYnV0ZXMuCi0KLVNFTlVNCi0gICBiZmRfcmVsb2NfY29kZV9yZWFsCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzY0Ci1FTlVNWAotICBCRkRfUkVMT0NfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yNgotRU5VTVgKLSAgQkZEX1JFTE9DXzI0Ci1FTlVNWAotICBCRkRfUkVMT0NfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNAotRU5VTVgKLSAgQkZEX1JFTE9DXzgKLUVOVU1ET0MKLSAgQmFzaWMgYWJzb2x1dGUgcmVsb2NhdGlvbnMgb2YgTiBiaXRzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182NF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMjRfUENSRUwKLUVOVU1YCi0gIEJGRF9SRUxPQ18xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzEyX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9QQ1JFTAotRU5VTURPQwotICBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucy4gIFNvbWV0aW1lcyB0aGVzZSBhcmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3MKLW9mIHRoZSByZWxvY2F0aW9uIGl0c2VsZjsgc29tZXRpbWVzIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZgotdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgcmVsb2NhdGlvbi4gIEl0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIHRhcmdldC4KLQotVGhlIDI0LWJpdCByZWxvY2F0aW9uIGlzIHVzZWQgaW4gc29tZSBJbnRlbCA5NjAgY29uZmlndXJhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfR09UX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfR09UT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DXzhfUExUX1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMzJfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUExUT0ZGCi1FTlVNWAotICBCRkRfUkVMT0NfTE8xNl9QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ19ISTE2X1BMVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19QTFRPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ184X1BMVE9GRgotRU5VTURPQwotICBGb3IgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ182OEtfR0xPQl9EQVQKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ182OEtfUkVMQVRJVkUKLUVOVU1ET0MKLSAgUmVsb2NhdGlvbnMgdXNlZCBieSA2OEsgRUxGLgotCi1FTlVNCi0gIEJGRF9SRUxPQ18zMl9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfQkFTRVJFTAotRU5VTVgKLSAgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfOF9CQVNFUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfUlZBCi1FTlVNRE9DCi0gIExpbmthZ2UtdGFibGUgcmVsYXRpdmUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzhfRkZubgotRU5VTURPQwotICBBYnNvbHV0ZSA4LWJpdCByZWxvY2F0aW9uLCBidXQgdXNlZCB0byBmb3JtIGFuIGFkZHJlc3MgbGlrZSAweEZGbm4uCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi1FTlVNWAotICBCRkRfUkVMT0NfMTZfUENSRUxfUzIKLUVOVU1YCi0gIEJGRF9SRUxPQ18yM19QQ1JFTF9TMgotRU5VTURPQwotICBUaGVzZSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhcmUgc3RvcmVkIGFzIHdvcmQgZGlzcGxhY2VtZW50cyAtLQotaS5lLiwgYnl0ZSBkaXNwbGFjZW1lbnRzIHNoaWZ0ZWQgcmlnaHQgdHdvIGJpdHMuICBUaGUgMzAtYml0IHdvcmQKLWRpc3BsYWNlbWVudCAoPDwzMl9QQ1JFTF9TMj4+IC0tIDMyIGJpdHMsIHNoaWZ0ZWQgMikgaXMgdXNlZCBvbiB0aGUKLVNQQVJDLiAgKFNQQVJDIHRvb2xzIGdlbmVyYWxseSByZWZlciB0byB0aGlzIGFzIDw8V0RJU1AzMD4+LikgIFRoZQotc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgaXMgdXNlZCBvbiB0aGUgTUlQUywgYW5kIHRoZSAyMy1iaXQKLWRpc3BsYWNlbWVudCBpcyB1c2VkIG9uIHRoZSBBbHBoYS4KLQotRU5VTQotICBCRkRfUkVMT0NfSEkyMgotRU5VTVgKLSAgQkZEX1JFTE9DX0xPMTAKLUVOVU1ET0MKLSAgSGlnaCAyMiBiaXRzIGFuZCBsb3cgMTAgYml0cyBvZiAzMi1iaXQgdmFsdWUsIHBsYWNlZCBpbnRvIGxvd2VyIGJpdHMgb2YKLXRoZSB0YXJnZXQgd29yZC4gIFRoZXNlIGFyZSB1c2VkIG9uIHRoZSBTUEFSQy4KLQotRU5VTQotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTVgKLSAgQkZEX1JFTE9DX0dQUkVMMzIKLUVOVU1ET0MKLSAgRm9yIHN5c3RlbXMgdGhhdCBhbGxvY2F0ZSBhIEdsb2JhbCBQb2ludGVyIHJlZ2lzdGVyLCB0aGVzZSBhcmUKLWRpc3BsYWNlbWVudHMgb2ZmIHRoYXQgcmVnaXN0ZXIuICBUaGVzZSByZWxvY2F0aW9uIHR5cGVzIGFyZQotaGFuZGxlZCBzcGVjaWFsbHksIGJlY2F1c2UgdGhlIHZhbHVlIHRoZSByZWdpc3RlciB3aWxsIGhhdmUgaXMKLWRlY2lkZWQgcmVsYXRpdmVseSBsYXRlLgotCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0k5NjBfQ0FMTEoKLUVOVU1ET0MKLSAgUmVsb2MgdHlwZXMgdXNlZCBmb3IgaTk2MC9iLm91dC4KLQotRU5VTQotICBCRkRfUkVMT0NfTk9ORQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkMxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dPVDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfR09UMTMKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19HT1QyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDMTAKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQzIyCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfQ09QWQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSk1QX1NMT1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1VBMzIKLUVOVU1ET0MKLSAgU1BBUkMgRUxGIHJlbG9jYXRpb25zLiAgVGhlcmUgaXMgcHJvYmFibHkgc29tZSBvdmVybGFwIHdpdGggb3RoZXIKLSAgcmVsb2NhdGlvbiB0eXBlcyBhbHJlYWR5IGRlZmluZWQuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UxMwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMgotRU5VTURPQwotICBJIHRoaW5rIHRoZXNlIGFyZSBzcGVjaWZpYyB0byBTUEFSQyBhLm91dCAoZS5nLiwgU3VuIDQpLgotCi1FTlVNRVEKLSAgQkZEX1JFTE9DX1NQQVJDXzY0Ci0gIEJGRF9SRUxPQ182NAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfMTEKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19PTE8xMAotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19QQ19ITTEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUENfTE0yMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19XRElTUDE5Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfNwotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDXzYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ181Ci1FTlVNRVFYCi0gIEJGRF9SRUxPQ19TUEFSQ19ESVNQNjQKLSAgQkZEX1JFTE9DXzY0X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUExUNjQKLUVOVU1YCi0gIEJGRF9SRUxPQ19TUEFSQ19ISVgyMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NQQVJDX0xPWDEwCi1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfSDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTTQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfTDQ0Ci1FTlVNWAotICBCRkRfUkVMT0NfU1BBUkNfUkVHSVNURVIKLUVOVU1ET0MKLSAgU1BBUkM2NCByZWxvY2F0aW9ucwotCi1FTlVNCi0gIEJGRF9SRUxPQ19TUEFSQ19SRVYzMgotRU5VTURPQwotICBTUEFSQyBsaXR0bGUgZW5kaWFuIHJlbG9jYXRpb24KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTYKLUVOVU1ET0MKLSAgQWxwaGEgRUNPRkYgYW5kIEVMRiByZWxvY2F0aW9ucy4gIFNvbWUgb2YgdGhlc2UgdHJlYXQgdGhlIHN5bWJvbCBvcgotICAgICAiYWRkZW5kIiBpbiBzb21lIHNwZWNpYWwgd2F5LgotICBGb3IgR1BESVNQX0hJMTYgKCJncGRpc3AiKSByZWxvY2F0aW9ucywgdGhlIHN5bWJvbCBpcyBpZ25vcmVkIHdoZW4KLSAgICAgd3JpdGluZzsgd2hlbiByZWFkaW5nLCBpdCB3aWxsIGJlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4gIFRoZQotICAgICBhZGRlbmQgaXMgdGhlIGRpc3BsYWNlbWVudCBpbiBieXRlcyBvZiB0aGUgImxkYSIgaW5zdHJ1Y3Rpb24gZnJvbQotICAgICB0aGUgImxkYWgiIGluc3RydWN0aW9uICh3aGljaCBpcyBhdCB0aGUgYWRkcmVzcyBvZiB0aGlzIHJlbG9jKS4KLUVOVU0KLSAgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9MTzE2Ci1FTlVNRE9DCi0gIEZvciBHUERJU1BfTE8xNiAoImlnbm9yZSIpIHJlbG9jYXRpb25zLCB0aGUgc3ltYm9sIGlzIGhhbmRsZWQgYXMKLSAgICAgd2l0aCBHUERJU1BfSEkxNiByZWxvY3MuICBUaGUgYWRkZW5kIGlzIGlnbm9yZWQgd2hlbiB3cml0aW5nIHRoZQotICAgICByZWxvY2F0aW9ucyBvdXQsIGFuZCBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uCi0gICAgIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZS4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfR1BESVNQCi1FTlVNRE9DCi0gIFRoZSBFTEYgR1BESVNQIHJlbG9jYXRpb24gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgR1BESVNQX0hJMTYKLSAgICAgcmVsb2NhdGlvbiBleGNlcHQgdGhhdCB0aGVyZSBpcyBubyBhY2NvbXBhbnlpbmcgR1BESVNQX0xPMTYKLSAgICAgcmVsb2NhdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfTElURVJBTAotRU5VTVgKLSAgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQUxQSEFfTElUVVNFCi1FTlVNRE9DCi0gIFRoZSBBbHBoYSBMSVRFUkFML0xJVFVTRSByZWxvY3MgYXJlIHByb2R1Y2VkIGJ5IGEgc3ltYm9sIHJlZmVyZW5jZTsKLSAgICAgdGhlIGFzc2VtYmxlciB0dXJucyBpdCBpbnRvIGEgTERRIGluc3RydWN0aW9uIHRvIGxvYWQgdGhlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIHN5bWJvbCwgYW5kIHRoZW4gZmlsbHMgaW4gYSByZWdpc3RlciBpbiB0aGUgcmVhbCBpbnN0cnVjdGlvbi4KLQotICAgICBUaGUgTElURVJBTCByZWxvYywgYXQgdGhlIExEUSBpbnN0cnVjdGlvbiwgcmVmZXJzIHRvIHRoZSAubGl0YQotICAgICBzZWN0aW9uIHN5bWJvbC4gIFRoZSBhZGRlbmQgaXMgaWdub3JlZCB3aGVuIHdyaXRpbmcsIGJ1dCBpcyBmaWxsZWQKLSAgICAgaW4gd2l0aCB0aGUgZmlsZSdzIEdQIHZhbHVlIG9uIHJlYWRpbmcsIGZvciBjb252ZW5pZW5jZSwgYXMgd2l0aCB0aGUKLSAgICAgR1BESVNQX0xPMTYgcmVsb2MuCi0KLSAgICAgVGhlIEVMRl9MSVRFUkFMIHJlbG9jIGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDE2X0dPVE9GRiBhbmQgR1BESVNQX0xPMTYuCi0gICAgIEl0IHNob3VsZCByZWZlciB0byB0aGUgc3ltYm9sIHRvIGJlIHJlZmVyZW5jZWQsIGFzIHdpdGggMTZfR09UT0ZGLAotICAgICBidXQgaXQgZ2VuZXJhdGVzIG91dHB1dCBub3QgYmFzZWQgb24gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgLmdvdAotICAgICBzZWN0aW9uLCBidXQgcmVsYXRpdmUgdG8gdGhlIEdQIHZhbHVlIGNob3NlbiBmb3IgdGhlIGZpbGUgZHVyaW5nIHRoZQotICAgICBmaW5hbCBsaW5rIHN0YWdlLgotCi0gICAgIFRoZSBMSVRVU0UgcmVsb2MsIG9uIHRoZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUgbG9hZGVkIGFkZHJlc3MsIGdpdmVzCi0gICAgIGluZm9ybWF0aW9uIHRvIHRoZSBsaW5rZXIgdGhhdCBpdCBtaWdodCBiZSBhYmxlIHRvIHVzZSB0byBvcHRpbWl6ZQotICAgICBhd2F5IHNvbWUgbGl0ZXJhbCBzZWN0aW9uIHJlZmVyZW5jZXMuICBUaGUgc3ltYm9sIGlzIGlnbm9yZWQgKHJlYWQKLSAgICAgYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gc3ltYm9sKSwgYW5kIHRoZSAiYWRkZW5kIiBpbmRpY2F0ZXMgdGhlIHR5cGUKLSAgICAgb2YgaW5zdHJ1Y3Rpb24gdXNpbmcgdGhlIHJlZ2lzdGVyOgotICAgICAgICAgICAgICAxIC0gIm1lbW9yeSIgZm10IGluc24KLSAgICAgICAgICAgICAgMiAtIGJ5dGUtbWFuaXB1bGF0aW9uIChieXRlIG9mZnNldCByZWcpCi0gICAgICAgICAgICAgIDMgLSBqc3IgKHRhcmdldCBvZiBicmFuY2gpCi0KLSAgICAgVGhlIEdOVSBsaW5rZXIgY3VycmVudGx5IGRvZXNuJ3QgZG8gYW55IG9mIHRoaXMgb3B0aW1pemluZy4KLQotRU5VTQotICBCRkRfUkVMT0NfQUxQSEFfSElOVAotRU5VTURPQwotICBUaGUgSElOVCByZWxvY2F0aW9uIGluZGljYXRlcyBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIGZpbGxlZCBpbnRvIHRoZQotICAgICAiaGludCIgZmllbGQgb2YgYSBqbXAvanNyL3JldCBpbnN0cnVjdGlvbiwgZm9yIHBvc3NpYmxlIGJyYW5jaC0KLSAgICAgcHJlZGljdGlvbiBsb2dpYyB3aGljaCBtYXkgYmUgcHJvdmlkZWQgb24gc29tZSBwcm9jZXNzb3JzLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFCi1FTlVNRE9DCi0gIFRoZSBMSU5LQUdFIHJlbG9jYXRpb24gb3V0cHV0cyBhIGxpbmthZ2UgcGFpciBpbiB0aGUgb2JqZWN0IGZpbGUsCi0gICAgIHdoaWNoIGlzIGZpbGxlZCBieSB0aGUgbGlua2VyLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUgotRU5VTURPQwotICBUaGUgQ09ERUFERFIgcmVsb2NhdGlvbiBvdXRwdXRzIGEgU1RPX0NBIGluIHRoZSBvYmplY3QgZmlsZSwKLSAgICAgd2hpY2ggaXMgZmlsbGVkIGJ5IHRoZSBsaW5rZXIuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFNfSk1QCi1FTlVNRE9DCi0gIEJpdHMgMjcuLjIgb2YgdGhlIHJlbG9jYXRpb24gYWRkcmVzcyBzaGlmdGVkIHJpZ2h0IDIgYml0czsKLSAgICAgc2ltcGxlIHJlbG9jIG90aGVyd2lzZS4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQUzE2X0pNUAotRU5VTURPQwotICBUaGUgTUlQUzE2IGp1bXAgaW5zdHJ1Y3Rpb24uCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01JUFMxNl9HUFJFTAotRU5VTURPQwotICBNSVBTMTYgR1AgcmVsYXRpdmUgcmVsb2MuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0hJMTYKLUVOVU1ET0MKLSAgSGlnaCAxNiBiaXRzIG9mIDMyLWJpdCB2YWx1ZTsgc2ltcGxlIHJlbG9jLgotRU5VTQotICBCRkRfUkVMT0NfSEkxNl9TCi1FTlVNRE9DCi0gIEhpZ2ggMTYgYml0cyBvZiAzMi1iaXQgdmFsdWUgYnV0IHRoZSBsb3cgMTYgYml0cyB3aWxsIGJlIHNpZ24KLSAgICAgZXh0ZW5kZWQgYW5kIGFkZGVkIHRvIGZvcm0gdGhlIGZpbmFsIHJlc3VsdC4gIElmIHRoZSBsb3cgMTYKLSAgICAgYml0cyBmb3JtIGEgbmVnYXRpdmUgbnVtYmVyLCB3ZSBuZWVkIHRvIGFkZCBvbmUgdG8gdGhlIGhpZ2ggdmFsdWUKLSAgICAgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIGJvcnJvdyB3aGVuIHRoZSBsb3cgYml0cyBhcmUgYWRkZWQuCi1FTlVNCi0gIEJGRF9SRUxPQ19MTzE2Ci1FTlVNRE9DCi0gIExvdyAxNiBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfSEkxNl9TCi1FTlVNRE9DCi0gIExpa2UgQkZEX1JFTE9DX0hJMTZfUywgYnV0IFBDIHJlbGF0aXZlLgotRU5VTQotICBCRkRfUkVMT0NfUENSRUxfTE8xNgotRU5VTURPQwotICBMaWtlIEJGRF9SRUxPQ19MTzE2LCBidXQgUEMgcmVsYXRpdmUuCi0KLUVOVU1FUQotICBCRkRfUkVMT0NfTUlQU19HUFJFTAotICBCRkRfUkVMT0NfR1BSRUwxNgotRU5VTURPQwotICBSZWxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBnbG9iYWwgcG9pbnRlci4KLQotRU5VTQotICBCRkRfUkVMT0NfTUlQU19MSVRFUkFMCi1FTlVNRE9DCi0gIFJlbG9jYXRpb24gYWdhaW5zdCBhIE1JUFMgbGl0ZXJhbCBzZWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMMTYKLUVOVU1FUVgKLSAgQkZEX1JFTE9DX01JUFNfR1BSRUwzMgotICBCRkRfUkVMT0NfR1BSRUwzMgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19DQUxMX0hJMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNgotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfU1VCCi1FTlVNWAotICBCRkRfUkVMT0NfTUlQU19HT1RfUEFHRQotRU5VTVgKLSAgQkZEX1JFTE9DX01JUFNfR09UX09GU1QKLUVOVU1YCi0gIEJGRF9SRUxPQ19NSVBTX0dPVF9ESVNQCi1DT01NRU5UCi1FTlVNRE9DCi0gIE1JUFMgRUxGIHJlbG9jYXRpb25zLgotCi1DT01NRU5UCi0KLUVOVU0KLSAgQkZEX1JFTE9DXzM4Nl9HT1QzMgotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9QTFQzMgotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfMzg2X0pVTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9SRUxBVElWRQotRU5VTVgKLSAgQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLUVOVU1YCi0gIEJGRF9SRUxPQ18zODZfR09UUEMKLUVOVU1ET0MKLSAgaTM4Ni9lbGYgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfTlMzMktfSU1NXzgKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19JTU1fOF9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfOAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF84X1BDUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfTlMzMktfRElTUF8xNl9QQ1JFTAotRU5VTVgKLSAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwKLUVOVU1ET0MKLSAgbnMzMmsgcmVsb2NhdGlvbnMKLQotRU5VTQotICBCRkRfUkVMT0NfUFBDX0IyNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CQTI2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX1RPQzE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0IxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJUQUtFTgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU4KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0pNUF9TTE9UCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX1JFTEFUSVZFCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQwotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIzMgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9MTwotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9ISQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfU0RBSTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2Ci1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyUkVMCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9TREEyMQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfTVJLUkVGCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNgotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8KLUVOVU1YCi0gIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJCi1FTlVNWAotICBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9IQQotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfQklUX0ZMRAotRU5VTVgKLSAgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0RBCi1FTlVNRE9DCi0gIFBvd2VyKHJzNjAwMCkgYW5kIFBvd2VyUEMgcmVsb2NhdGlvbnMuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0NUT1IKLUVOVU1ET0MKLSAgVGhlIHR5cGUgb2YgcmVsb2MgdXNlZCB0byBidWlsZCBhIGNvbnRydWN0b3IgdGFibGUgLSBhdCB0aGUgbW9tZW50Ci0gIHByb2JhYmx5IGEgMzIgYml0IHdpZGUgYWJzb2x1dGUgcmVsb2NhdGlvbiwgYnV0IHRoZSB0YXJnZXQgY2FuIGNob29zZS4KLSAgSXQgZ2VuZXJhbGx5IGRvZXMgbWFwIHRvIG9uZSBvZiB0aGUgb3RoZXIgcmVsb2NhdGlvbiB0eXBlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotRU5VTURPQwotICBBUk0gMjYgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLSAgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1NXSQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9NVUxUSQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0FEUl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fTERSX0lNTQotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9MSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0lOX1BPT0wKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTgKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU0KLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfU0hJRlQKLUVOVU1YCi0gIEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVDEyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVDMyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0pVTVBfU0xPVAotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9DT1BZCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dMT0JfREFUCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1BMVDMyCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX1JFTEFUSVZFCi1FTlVNWAotICBCRkRfUkVMT0NfQVJNX0dPVE9GRgotRU5VTVgKLSAgQkZEX1JFTE9DX0FSTV9HT1RQQwotRU5VTURPQwotICBUaGVzZSByZWxvY3MgYXJlIG9ubHkgdXNlZCB3aXRoaW4gdGhlIEFSTSBhc3NlbWJsZXIuICBUaGV5IGFyZSBub3QKLSAgKGF0IHByZXNlbnQpIHdyaXR0ZW4gdG8gYW55IG9iamVjdCBmaWxlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfU0hfUENESVNQOEJZMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NNAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTTRCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU00Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfSU1NOAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0lNTThCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9JTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfU0hfU1dJVENIMTYKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9TV0lUQ0gzMgotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX1VTRVMKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9DT1VOVAotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0FMSUdOCi1FTlVNWAotICBCRkRfUkVMT0NfU0hfQ09ERQotRU5VTVgKLSAgQkZEX1JFTE9DX1NIX0RBVEEKLUVOVU1YCi0gIEJGRF9SRUxPQ19TSF9MQUJFTAotRU5VTURPQwotICBIaXRhY2hpIFNIIHJlbG9jcy4gIE5vdCBhbGwgb2YgdGhlc2UgYXBwZWFyIGluIG9iamVjdCBmaWxlcy4KLQotRU5VTQotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOQotRU5VTVgKLSAgQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDEyCi1FTlVNWAotICBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMKLUVOVU1ET0MKLSAgVGh1bWIgMjMtLCAxMi0gYW5kIDktYml0IHBjLXJlbGF0aXZlIGJyYW5jaGVzLiAgVGhlIGxvd2VzdCBiaXQgbXVzdAotICBiZSB6ZXJvIGFuZCBpcyBub3Qgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4KLQotRU5VTQotICBCRkRfUkVMT0NfQVJDX0IyMl9QQ1JFTAotRU5VTURPQwotICBBcmdvbmF1dCBSSVNDIENvcmUgKEFSQykgcmVsb2NzLgotICBBUkMgMjIgYml0IHBjLXJlbGF0aXZlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUKLSAgbm90IHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyMCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyNgotICB0aHJvdWdoIDcgb2YgdGhlIGluc3RydWN0aW9uLgotRU5VTQotICBCRkRfUkVMT0NfQVJDX0IyNgotRU5VTURPQwotICBBUkMgMjYgYml0IGFic29sdXRlIGJyYW5jaC4gIFRoZSBsb3dlc3QgdHdvIGJpdHMgbXVzdCBiZSB6ZXJvIGFuZCBhcmUgbm90Ci0gIHN0b3JlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgaGlnaCAyNCBiaXRzIGFyZSBpbnN0YWxsZWQgaW4gYml0cyAyMwotICB0aHJvdWdoIDAuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUgotRU5VTURPQwotICBNaXRzdWJpc2hpIEQxMFYgcmVsb2NzLgotICBUaGlzIGlzIGEgMTAtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX0wKLUVOVU1ET0MKLSAgTWl0c3ViaXNoaSBEMTBWIHJlbG9jcy4KLSAgVGhpcyBpcyBhIDEwLWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMKLSAgYXNzdW1lZCB0byBiZSAwLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgcmVsb2MKLSAgZXhjZXB0IGl0IGlzIGluIHRoZSBsZWZ0IGNvbnRhaW5lciwgaS5lLiwKLSAgc2hpZnRlZCBsZWZ0IDE1IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzE4Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHJlbG9jIHdpdGggdGhlIHJpZ2h0IDIgYml0cwotICBhc3N1bWVkIHRvIGJlIDAuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfNgotRU5VTURPQwotICBNaXRzdWJpc2hpIEQzMFYgcmVsb2NzLgotICBUaGlzIGlzIGEgNi1iaXQgYWJzb2x1dGUgcmVsb2MuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDYtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzlfUENSRUxfUgotRU5VTURPQwotICBUaGlzIGlzIGEgNi1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCAKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuIFNhbWUKLSAgYXMgdGhlIHByZXZpb3VzIHJlbG9jIGJ1dCBvbiB0aGUgcmlnaHQgc2lkZQotICBvZiB0aGUgY29udGFpbmVyLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzE1Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMi1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCB0aGUgCi0gIHJpZ2h0IDMgYml0c2Fzc3VtZWQgdG8gYmUgMC4gIAotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTItYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiAgCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMX1IKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDEyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoIAotICB0aGUgcmlnaHQgMyBiaXRzIGFzc3VtZWQgdG8gYmUgMC4gU2FtZQotICBhcyB0aGUgcHJldmlvdXMgcmVsb2MgYnV0IG9uIHRoZSByaWdodCBzaWRlCi0gIG9mIHRoZSBjb250YWluZXIuICAKLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMjEKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgYWJzb2x1dGUgcmVsb2Mgd2l0aCAKLSAgdGhlIHJpZ2h0IDMgYml0cyBhc3N1bWVkIHRvIGJlIDAuCi1FTlVNCi0gIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SCi1FTlVNRE9DCi0gIFRoaXMgaXMgYW4gMTgtYml0IHBjLXJlbGF0aXZlIHJlbG9jIHdpdGggCi0gIHRoZSByaWdodCAzIGJpdHMgYXNzdW1lZCB0byBiZSAwLiBTYW1lCi0gIGFzIHRoZSBwcmV2aW91cyByZWxvYyBidXQgb24gdGhlIHJpZ2h0IHNpZGUKLSAgb2YgdGhlIGNvbnRhaW5lci4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMzIKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyLWJpdCBhYnNvbHV0ZSByZWxvYy4KLUVOVU0KLSAgQkZEX1JFTE9DX0QzMFZfMzJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyLWJpdCBwYy1yZWxhdGl2ZSByZWxvYy4KLQotRU5VTQotICBCRkRfUkVMT0NfTTMyUl8yNAotRU5VTURPQwotICBNaXRzdWJpc2hpIE0zMlIgcmVsb2NzLgotICBUaGlzIGlzIGEgMjQgYml0IGFic29sdXRlIGFkZHJlc3MuCi1FTlVNCi0gIEJGRF9SRUxPQ19NMzJSXzEwX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxMC1iaXQgcGMtcmVsYXRpdmUgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMThfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiAxOC1iaXQgcmVsb2Mgd2l0aCB0aGUgcmlnaHQgMiBiaXRzIGFzc3VtZWQgdG8gYmUgMC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDI2LWJpdCByZWxvYyB3aXRoIHRoZSByaWdodCAyIGJpdHMgYXNzdW1lZCB0byBiZSAwLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTwotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIGhpZ2ggMTYgYml0cyBvZiBhbiBhZGRyZXNzCi0gIHVzZWQgd2hlbiB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdHJlYXRlZCBhcyB1bnNpZ25lZC4KLUVOVU0KLSAgQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8KLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2LWJpdCByZWxvYyBjb250YWluaW5nIHRoZSBoaWdoIDE2IGJpdHMgb2YgYW4gYWRkcmVzcwotICB1c2VkIHdoZW4gdGhlIGxvd2VyIDE2IGJpdHMgYXJlIHRyZWF0ZWQgYXMgc2lnbmVkLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9MTzE2Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNi1iaXQgcmVsb2MgY29udGFpbmluZyB0aGUgbG93ZXIgMTYgYml0cyBvZiBhbiBhZGRyZXNzLgotRU5VTQotICBCRkRfUkVMT0NfTTMyUl9TREExNgotRU5VTURPQwotICBUaGlzIGlzIGEgMTYtYml0IHJlbG9jIGNvbnRhaW5pbmcgdGhlIHNtYWxsIGRhdGEgYXJlYSBvZmZzZXQgZm9yIHVzZSBpbgotICBhZGQzLCBsb2FkLCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwXzlfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDktYml0IHJlbG9jCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAyMi1iaXQgcmVsb2MKLQotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9TREFfMTVfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDE1IGJpdHMgYXJlIHVzZWQpIGZyb20gdGhlCi0gIHNob3J0IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9aREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHplcm8gZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNV8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgMTUgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUKLSAgemVybyBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzZfOF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhbiA4IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNiBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZQotICB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGFuIDhiaXQgb2Zmc2V0IChvZiB3aGljaCBvbmx5IDcgYml0cyBhcmUgdXNlZCkgZnJvbSB0aGUgdGlueQotICBkYXRhIGFyZWEgcG9pbnRlci4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfVERBXzdfN19PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDcgYml0IG9mZnNldCBmcm9tIHRoZSB0aW55IGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfMTZfMTZfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi1DT01NRU5UCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1REQV80XzVfT0ZGU0VUCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSA1IGJpdCBvZmZzZXQgKG9mIHdoaWNoIG9ubHkgNCBiaXRzIGFyZSB1c2VkKSBmcm9tIHRoZSB0aW55Ci0gIGRhdGEgYXJlYSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9UREFfNF80X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNCBiaXQgb2Zmc2V0IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9TUExJVF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgc2hvcnQgZGF0YSBhcmVhIHBvaW50ZXIsIHdpdGggdGhlCi0gIGJpdHMgcGxhY2VkIG5vbi1jb250aWdvdXNseSBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgemVybyBkYXRhIGFyZWEgcG9pbnRlciwgd2l0aCB0aGUKLSAgYml0cyBwbGFjZWQgbm9uLWNvbnRpZ291c2x5IGluIHRoZSBpbnN0cnVjdGlvbi4KLUVOVU0KLSAgQkZEX1JFTE9DX1Y4NTBfQ0FMTFRfNl83X09GRlNFVAotRU5VTURPQwotICBUaGlzIGlzIGEgNiBiaXQgb2Zmc2V0IGZyb20gdGhlIGNhbGwgdGFibGUgYmFzZSBwb2ludGVyLgotRU5VTQotICBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCBvZmZzZXQgZnJvbSB0aGUgY2FsbCB0YWJsZSBiYXNlIHBvaW50ZXIuCi1DT01NRU5UCi0KLUVOVU0KLSAgQkZEX1JFTE9DX01OMTAzMDBfMzJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyYml0IHBjcmVsIHJlbG9jIGZvciB0aGUgbW4xMDMwMCwgb2Zmc2V0IGJ5IHR3byBieXRlcyBpbiB0aGUKLSAgaW5zdHJ1Y3Rpb24uCi1FTlVNCi0gIEJGRF9SRUxPQ19NTjEwMzAwXzE2X1BDUkVMCi1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNmJpdCBwY3JlbCByZWxvYyBmb3IgdGhlIG1uMTAzMDAsIG9mZnNldCBieSB0d28gYnl0ZXMgaW4gdGhlCi0gIGluc3RydWN0aW9uLgotCi1FTlVNCi0gIEJGRF9SRUxPQ19USUMzMF9MRFAKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDhiaXQgRFAgcmVsb2MgZm9yIHRoZSB0bXMzMjBjMzAsIHdoZXJlIHRoZSBtb3N0Ci0gIHNpZ25pZmljYW50IDggYml0cyBvZiBhIDI0IGJpdCB3b3JkIGFyZSBwbGFjZWQgaW50byB0aGUgbGVhc3QKLSAgc2lnbmlmaWNhbnQgOCBiaXRzIG9mIHRoZSBvcGNvZGUuCi0KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfNDgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDQ4IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMzIgYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMjAKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDMyIGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgMjAgYml0cyBzcGxpdCB1cCBpbnRvCi0gIHR3byBzZWN0aW9ucy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfNl9JTl80Ci1FTlVNRE9DCi0gIFRoaXMgaXMgYSAxNiBiaXQgcmVsb2MgZm9yIHRoZSBGUjMwIHRoYXQgc3RvcmVzIGEgNiBiaXQgd29yZCBvZmZzZXQgaW4KLSAgNCBiaXRzLgotRU5VTQotICBCRkRfUkVMT0NfRlIzMF84X0lOXzgKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYW4gOCBiaXQgYnl0ZSBvZmZzZXQKLSAgaW50byA4IGJpdHMuCi1FTlVNCi0gIEJGRF9SRUxPQ19GUjMwXzlfSU5fOAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHNob3J0IG9mZnNldAotICBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMTBfSU5fOAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDEwIGJpdCB3b3JkIG9mZnNldAotICBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfOV9QQ1JFTAotRU5VTURPQwotICBUaGlzIGlzIGEgMTYgYml0IHJlbG9jIGZvciB0aGUgRlIzMCB0aGF0IHN0b3JlcyBhIDkgYml0IHBjIHJlbGF0aXZlCi0gIHNob3J0IG9mZnNldCBpbnRvIDggYml0cy4KLUVOVU0KLSAgQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUwKLUVOVU1ET0MKLSAgVGhpcyBpcyBhIDE2IGJpdCByZWxvYyBmb3IgdGhlIEZSMzAgdGhhdCBzdG9yZXMgYSAxMiBiaXQgcGMgcmVsYXRpdmUKLSAgc2hvcnQgb2Zmc2V0IGludG8gMTEgYml0cy4KLSAgCi1FTlVNCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU04Qlk0Ci1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyCi1FTlVNWAotICBCRkRfUkVMT0NfTUNPUkVfUENSRUxfMzIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIKLUVOVU1YCi0gIEJGRF9SRUxPQ19NQ09SRV9SVkEKLUVOVU1ET0MKLSAgTW90b3JvbGEgTWNvcmUgcmVsb2NhdGlvbnMuCi0gIAotRU5VTQotICBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLUVOVU1YCi0gIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLUVOVU1ET0MKLSAgVGhlc2UgdHdvIHJlbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mIAotICB0aGUgZW50cmllcyBpbiBhIEMrKyB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGFyZSBhY3R1YWxseSB1c2VkLiAgV2hlbgotICB0aGUgLS1nYy1zZWN0aW9ucyBvcHRpb24gaXMgZ2l2ZW4sIHRoZSBsaW5rZXIgd2lsbCB6ZXJvIG91dCB0aGUgZW50cmllcwotICB0aGF0IGFyZSBub3QgdXNlZCwgc28gdGhhdCB0aGUgY29kZSBmb3IgdGhvc2UgZnVuY3Rpb25zIG5lZWQgbm90IGJlCi0gIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLSAgVlRBQkxFX0lOSEVSSVQgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdXNlZCB0byBkZXNjcmliZSB0byB0aGUKLSAgbGlua2VyIHRoZSBpbmhlcml0ZW5jZSB0cmVlIG9mIGEgQysrIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUuICBUaGUKLSAgcmVsb2NhdGlvbidzIHN5bWJvbCBzaG91bGQgYmUgdGhlIHBhcmVudCBjbGFzcycgdnRhYmxlLCBhbmQgdGhlCi0gIHJlbG9jYXRpb24gc2hvdWxkIGJlIGxvY2F0ZWQgYXQgdGhlIGNoaWxkIHZ0YWJsZS4KLQotICBWVEFCTEVfRU5UUlkgaXMgYSB6ZXJvLXNwYWNlIHJlbG9jYXRpb24gdGhhdCBkZXNjcmliZXMgdGhlIHVzZSBvZiBhCi0gIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgZW50cnkuICBUaGUgcmVsb2MncyBzeW1ib2wgc2hvdWxkIHJlZmVyIHRvIHRoZQotICB0YWJsZSBvZiB0aGUgY2xhc3MgbWVudGlvbmVkIGluIHRoZSBjb2RlLiAgT2ZmIG9mIHRoYXQgYmFzZSwgYW4gb2Zmc2V0Ci0gIGRlc2NyaWJlcyB0aGUgZW50cnkgdGhhdCBpcyBiZWluZyB1c2VkLiAgRm9yIFJlbGEgaG9zdHMsIHRoaXMgb2Zmc2V0IAotICBpcyBzdG9yZWQgaW4gdGhlIHJlbG9jJ3MgYWRkZW5kLiAgRm9yIFJlbCBob3N0cywgd2UgYXJlIGZvcmNlZCB0byBwdXQKLSAgdGhpcyBvZmZzZXQgaW4gdGhlIHJlbG9jJ3Mgc2VjdGlvbiBvZmZzZXQuCi0KLUVORFNFTlVNCi0gIEJGRF9SRUxPQ19VTlVTRUQKLUNPREVfRlJBR01FTlQKLS4KLS50eXBlZGVmIGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGU7Ci0qLwotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9yZWxvY190eXBlX2xvb2t1cAotCi1TWU5PUFNJUwotCXJlbG9jX2hvd3RvX3R5cGUgKgotCWJmZF9yZWxvY190eXBlX2xvb2t1cCAoYmZkICphYmZkLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgcG9pbnRlciB0byBhIGhvd3RvIHN0cnVjdHVyZSB3aGljaCwgd2hlbgotCWludm9rZWQsIHdpbGwgcGVyZm9ybSB0aGUgcmVsb2NhdGlvbiBAdmFye2NvZGV9IG9uIGRhdGEgZnJvbSB0aGUKLQlhcmNoaXRlY3R1cmUgbm90ZWQuCi0KLSovCi0KLQotcmVsb2NfaG93dG9fdHlwZSAqCi1iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIHJldHVybiBCRkRfU0VORCAoYWJmZCwgcmVsb2NfdHlwZV9sb29rdXAsIChhYmZkLCBjb2RlKSk7Ci19Ci0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIGJmZF9ob3d0b18zMiA9Ci1IT1dUTyAoMCwgMDAsIDIsIDMyLCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIDAsICJWUlQzMiIsIGZhbHNlLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKTsKLQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZGVmYXVsdF9yZWxvY190eXBlX2xvb2t1cAotCi1TWU5PUFNJUwotCXJlbG9jX2hvd3RvX3R5cGUgKmJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwCi0JKGJmZCAqYWJmZCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBhIGRlZmF1bHQgcmVsb2NhdGlvbiBsb29rdXAgcm91dGluZSBmb3IgYW55IGFyY2hpdGVjdHVyZS4KLQotCi0qLwotCi1yZWxvY19ob3d0b190eXBlICoKLWJmZF9kZWZhdWx0X3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0gICAgICAvKiBUaGUgdHlwZSBvZiByZWxvYyB1c2VkIGluIGEgY3Rvciwgd2hpY2ggd2lsbCBiZSBhcyB3aWRlIGFzIHRoZQotCSBhZGRyZXNzIC0gc28gZWl0aGVyIGEgNjQsIDMyLCBvciAxNiBiaXR0ZXIuICAqLwotICAgICAgc3dpdGNoIChiZmRfZ2V0X2FyY2hfaW5mbyAoYWJmZCktPmJpdHNfcGVyX2FkZHJlc3MpCi0JewotCWNhc2UgNjQ6Ci0JICBCRkRfRkFJTCAoKTsKLQljYXNlIDMyOgotCSAgcmV0dXJuICZiZmRfaG93dG9fMzI7Ci0JY2FzZSAxNjoKLQkgIEJGRF9GQUlMICgpOwotCWRlZmF1bHQ6Ci0JICBCRkRfRkFJTCAoKTsKLQl9Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJGRF9GQUlMICgpOwotICAgIH0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lCi0KLVNZTk9QU0lTCi0JY29uc3QgY2hhciAqYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBhIHByaW50YWJsZSBuYW1lIGZvciB0aGUgc3VwcGxpZWQgcmVsb2NhdGlvbiBjb2RlLgotCVVzZWZ1bCBtYWlubHkgZm9yIHByaW50aW5nIGVycm9yIG1lc3NhZ2VzLgotKi8KLQotY29uc3QgY2hhciAqCi1iZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGlmIChjb2RlID4gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfbmFtZXNbKGludCljb2RlXTsKLX0KLQotLyoKLUlOVEVSTkFMX0ZVTkNUSU9OCi0JYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotCSAoYmZkICphYmZkLAotCSAgYXNlY3Rpb24gKnNlY3Rpb24sCi0JICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCSAgYm9vbGVhbiAqKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIGZvciByZWxheGluZyBmb3IgYmFjayBlbmRzIHdoaWNoCi0JZG9uJ3QgZG8gcmVsYXhpbmcgLS0gaS5lLiwgZG9lcyBub3RoaW5nLgotKi8KLQotLypBUkdTVVNFRCovCi1ib29sZWFuCi1iZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgKmFnYWluID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKgotSU5URVJOQUxfRlVOQ1RJT04KLQliZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2dlbmVyaWNfZ2Nfc2VjdGlvbnMKLQkgKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKTsKLQotREVTQ1JJUFRJT04KLQlQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIGZvciByZWxheGluZyBmb3IgYmFjayBlbmRzIHdoaWNoCi0JZG9uJ3QgZG8gc2VjdGlvbiBnYyAtLSBpLmUuLCBkb2VzIG5vdGhpbmcuCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9nZW5lcmljX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1JTlRFUk5BTF9GVU5DVElPTgotCWJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotCi1TWU5PUFNJUwotCWJmZF9ieXRlICoKLQkgICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGJmZCAqYWJmZCwKLQkgICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8sCi0JICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXIsCi0JICAgICBiZmRfYnl0ZSAqZGF0YSwKLQkgICAgIGJvb2xlYW4gcmVsb2NhdGVhYmxlLAotCSAgICAgYXN5bWJvbCAqKnN5bWJvbHMpOwotCi1ERVNDUklQVElPTgotCVByb3ZpZGVzIGRlZmF1bHQgaGFuZGxpbmcgb2YgcmVsb2NhdGlvbiBlZmZvcnQgZm9yIGJhY2sgZW5kcwotCXdoaWNoIGNhbid0IGJlIGJvdGhlcmVkIHRvIGRvIGl0IGVmZmljaWVudGx5LgotCi0qLwotCi1iZmRfYnl0ZSAqCi1iZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwKLQkJCQkJICAgIHJlbG9jYXRlYWJsZSwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci0gICAgIGJmZF9ieXRlICpkYXRhOwotICAgICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIC8qIEdldCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgdGhlIHN0dWZmICovCi0gIGJmZCAqaW5wdXRfYmZkID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBsaW5rX29yZGVyLT51LmluZGlyZWN0LnNlY3Rpb247Ci0KLSAgbG9uZyByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoaW5wdXRfYmZkLCBpbnB1dF9zZWN0aW9uKTsKLSAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvciA9IE5VTEw7Ci0gIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgaWYgKHJlbG9jX3NpemUgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSByZWxvY19zaXplKTsKLSAgaWYgKHJlbG9jX3ZlY3RvciA9PSBOVUxMICYmIHJlbG9jX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiByZWFkIGluIHRoZSBzZWN0aW9uICovCi0gIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sCi0JCQkJIChQVFIpIGRhdGEsCi0JCQkJIDAsCi0JCQkJIGlucHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2UncmUgbm90IHJlbGF4aW5nIHRoZSBzZWN0aW9uLCBzbyBqdXN0IGNvcHkgdGhlIHNpemUgaW5mbyAqLwotICBpbnB1dF9zZWN0aW9uLT5fY29va2VkX3NpemUgPSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemU7Ci0gIGlucHV0X3NlY3Rpb24tPnJlbG9jX2RvbmUgPSB0cnVlOwotCi0gIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5wdXRfYmZkLAotCQkJCQlpbnB1dF9zZWN0aW9uLAotCQkJCQlyZWxvY192ZWN0b3IsCi0JCQkJCXN5bWJvbHMpOwotICBpZiAocmVsb2NfY291bnQgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChyZWxvY19jb3VudCA+IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnBhcmVudDsKLSAgICAgIGZvciAocGFyZW50ID0gcmVsb2NfdmVjdG9yOyAqcGFyZW50ICE9IChhcmVsZW50ICopIE5VTEw7Ci0JICAgcGFyZW50KyspCi0JewotCSAgY2hhciAqZXJyb3JfbWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0JICBiZmRfcmVsb2Nfc3RhdHVzX3R5cGUgciA9Ci0JICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24gKGlucHV0X2JmZCwKLQkJCQkgICAgKnBhcmVudCwKLQkJCQkgICAgKFBUUikgZGF0YSwKLQkJCQkgICAgaW5wdXRfc2VjdGlvbiwKLQkJCQkgICAgcmVsb2NhdGVhYmxlID8gYWJmZCA6IChiZmQgKikgTlVMTCwKLQkJCQkgICAgJmVycm9yX21lc3NhZ2UpOwotCi0JICBpZiAocmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKm9zID0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0KLQkgICAgICAvKiBBIHBhcnRpYWwgbGluaywgc28ga2VlcCB0aGUgcmVsb2NzICovCi0JICAgICAgb3MtPm9yZWxvY2F0aW9uW29zLT5yZWxvY19jb3VudF0gPSAqcGFyZW50OwotCSAgICAgIG9zLT5yZWxvY19jb3VudCsrOwotCSAgICB9Ci0KLQkgIGlmIChyICE9IGJmZF9yZWxvY19vaykKLQkgICAgewotCSAgICAgIHN3aXRjaCAocikKLQkJewotCQljYXNlIGJmZF9yZWxvY191bmRlZmluZWQ6Ci0JCSAgaWYgKCEoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX2Rhbmdlcm91czoKLQkJICBCRkRfQVNTRVJUIChlcnJvcl9tZXNzYWdlICE9IChjaGFyICopIE5VTEwpOwotCQkgIGlmICghKCgqbGlua19pbmZvLT5jYWxsYmFja3MtPnJlbG9jX2Rhbmdlcm91cykKLQkJCShsaW5rX2luZm8sIGVycm9yX21lc3NhZ2UsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJCSAoKnBhcmVudCktPmFkZHJlc3MpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgIGJyZWFrOwotCQljYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkJICBpZiAoISgoKmxpbmtfaW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJCShsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKCooKnBhcmVudCktPnN5bV9wdHJfcHRyKSwKLQkJCSAoKnBhcmVudCktPmhvd3RvLT5uYW1lLCAoKnBhcmVudCktPmFkZGVuZCwKLQkJCSBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sICgqcGFyZW50KS0+YWRkcmVzcykpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgYmZkX3JlbG9jX291dG9mcmFuZ2U6Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0gIHJldHVybiBkYXRhOwotCi1lcnJvcl9yZXR1cm46Ci0gIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9yZWxvYzE2LmMgYi9iZmQvcmVsb2MxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc5NTJlLi4wMDAwMDAwCi0tLSBhL2JmZC9yZWxvYzE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyogOCBhbmQgMTYgYml0IENPRkYgcmVsb2NhdGlvbiBmdW5jdGlvbnMsIGZvciBCRkQuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAKLU1vc3Qgb2YgdGhpcyBoYWNrZWQgYnkgIFN0ZXZlIENoYW1iZXJsYWluLAotCQkJc2FjQGN5Z251cy5jb20gCi0qLwotCi0vKiBUaGVzZSByb3V0aW5lcyBhcmUgdXNlZCBieSBjb2ZmLWg4MzAwIGFuZCBjb2ZmLXo4ayB0byBkbwotICAgcmVsb2NhdGlvbi4KLQotICAgRklYTUU6IFRoaXMgY29kZSBzaG91bGQgYmUgcmV3cml0dGVuIHRvIHN1cHBvcnQgdGhlIG5ldyBDT0ZGCi0gICBsaW5rZXIuICBCYXNpY2FsbHksIHRoZXkgbmVlZCB0byBkZWFsIHdpdGggQ09GRiByZWxvY3MgcmF0aGVyIHRoYW4KLSAgIEJGRCBnZW5lcmljIHJlbG9jcy4gIFRoZXkgc2hvdWxkIHN0b3JlIHRoZSByZWxvY3MgaW4gc29tZSBsb2NhdGlvbgotICAgd2hlcmUgY29mZl9saW5rX2lucHV0X2JmZCBjYW4gZmluZCB0aGVtIChhbmQgY29mZl9saW5rX2lucHV0X2JmZAotICAgc2hvdWxkIGJlIGNoYW5nZWQgdG8gdXNlIHRoaXMgbG9jYXRpb24gcmF0aGVyIHRoYW4gcmVyZWFkaW5nIHRoZQotICAgZmlsZSkgKHVubGVzcyBpbmZvLT5rZWVwX21lbW9yeSBpcyBmYWxzZSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNob3VsZAotICAgZnJlZSB1cCB0aGUgcmVsb2NzIGFmdGVyIGRlYWxpbmcgd2l0aCB0aGVtKS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2VubGluay5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLWJmZF92bWEKLWJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3ZhbHVlIChyZWxvYywgbGlua19pbmZvLCBpbnB1dF9zZWN0aW9uKQotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGFzeW1ib2wgKnN5bWJvbCA9ICoocmVsb2MtPnN5bV9wdHJfcHRyKTsKLSAgLyogQSBzeW1ib2wgaG9sZHMgYSBwb2ludGVyIHRvIGEgc2VjdGlvbiwgYW5kIGFuIG9mZnNldCBmcm9tIHRoZQotICAgICBiYXNlIG9mIHRoZSBzZWN0aW9uLiAgVG8gcmVsb2NhdGUsIHdlIGZpbmQgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbAotICAgICBsaXZlIGluIHRoZSBvdXRwdXQgYW5kIGFkZCB0aGF0IGluICovCi0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKQotICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIEJGRC4gIExvb2sgaXQgdXAgaW4gdGhlCi0JIGdsb2JhbCBsaW5rZXIgaGFzaCB0YWJsZS4gIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4KLQkgd2UgY29udmVydCB0aGlzIHN0dWZmIHRvIHVzZSBhIHNwZWNpZmljIGZpbmFsX2xpbmsgZnVuY3Rpb24KLQkgYW5kIGNoYW5nZSB0aGUgaW50ZXJmYWNlIHRvIGJmZF9yZWxheF9zZWN0aW9uIHRvIG5vdCByZXF1aXJlCi0JIHRoZSBnZW5lcmljIHN5bWJvbHMuICAqLwotICAgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKGlucHV0X3NlY3Rpb24tPm93bmVyLCBsaW5rX2luZm8sCi0JCQkJCWJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCQkJCWZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCSAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXZhbHVlID0gKGgtPnUuZGVmLnZhbHVlCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBlbHNlIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JdmFsdWUgPSBoLT51LmMuc2l6ZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISAoKCpsaW5rX2luZm8tPmNhbGxiYWNrcy0+dW5kZWZpbmVkX3N5bWJvbCkKLQkJIChsaW5rX2luZm8sIGJmZF9hc3ltYm9sX25hbWUgKHN5bWJvbCksCi0JCSAgaW5wdXRfc2VjdGlvbi0+b3duZXIsIGlucHV0X3NlY3Rpb24sIHJlbG9jLT5hZGRyZXNzKSkpCi0JICAgIGFib3J0ICgpOwotCSAgdmFsdWUgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgdmFsdWUgPSBzeW1ib2wtPnZhbHVlICsKLQlzeW1ib2wtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQgKwotCSAgc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICAgIH0KLSAgCi0gIC8qIEFkZCB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSByZWxvY2F0aW9uICovCi0gIHZhbHVlICs9IHJlbG9jLT5hZGRlbmQ7Ci0gIAotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXZvaWQKLWJmZF9wZXJmb3JtX3NsaXAoYWJmZCwgc2xpcCwgaW5wdXRfc2VjdGlvbiwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHNsaXA7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBhc3ltYm9sICoqczsKLQotICBzID0gX2JmZF9nZW5lcmljX2xpbmtfZ2V0X3N5bWJvbHMgKGFiZmQpOwotICBCRkRfQVNTRVJUIChzICE9IChhc3ltYm9sICoqKSBOVUxMKTsKLQotICAvKiBGaW5kIGFsbCBzeW1ib2xzIHBhc3QgdGhpcyBwb2ludCwgYW5kIG1ha2UgdGhlbSBrbm93Ci0gICAgIHdoYXQncyBoYXBwZW5lZCAqLwotICB3aGlsZSAoKnMpIAotICAgIHsKLSAgICAgIGFzeW1ib2wgKnAgPSAqczsKLSAgICAgIGlmIChwLT5zZWN0aW9uID09IGlucHV0X3NlY3Rpb24pIAotCXsKLQkgIC8qIFRoaXMgd2FzIHBvaW50aW5nIGludG8gdGhpcyBzZWN0aW9uLCBzbyBtYW5nbGUgaXQgKi8KLQkgIGlmIChwLT52YWx1ZSA+IHZhbHVlKQotCSAgICB7Ci0JICAgICAgcC0+dmFsdWUgLT0gc2xpcDsKLQkgICAgICBpZiAocC0+dWRhdGEucCAhPSBOVUxMKQotCQl7Ci0JCSAgc3RydWN0IGdlbmVyaWNfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JCSAgaCA9IChzdHJ1Y3QgZ2VuZXJpY19saW5rX2hhc2hfZW50cnkgKikgcC0+dWRhdGEucDsKLQkJICBCRkRfQVNTRVJUIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKTsKLQkJICBoLT5yb290LnUuZGVmLnZhbHVlIC09IHNsaXA7Ci0JCSAgQkZEX0FTU0VSVCAoaC0+cm9vdC51LmRlZi52YWx1ZSA9PSBwLT52YWx1ZSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHMrKzsKLSAgICB9ICAgIAotfQotCi1ib29sZWFuIAotYmZkX2NvZmZfcmVsb2MxNl9yZWxheF9zZWN0aW9uIChhYmZkLCBpLCBsaW5rX2luZm8sIGFnYWluKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICppOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotICAgICBib29sZWFuICphZ2FpbjsKLXsKLSAgLyogR2V0IGVub3VnaCBtZW1vcnkgdG8gaG9sZCB0aGUgc3R1ZmYgKi8KLSAgYmZkICppbnB1dF9iZmQgPSBpLT5vd25lcjsKLSAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb24gPSBpOwotICBpbnQgKnNocmlua3M7Ci0gIGludCBzaHJpbmsgPSAwOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yID0gTlVMTDsKLSAgbG9uZyByZWxvY19jb3VudDsKLQotICAvKiBXZSBvbmx5IGRvIGdsb2JhbCByZWxheGF0aW9uIG9uY2UuICBJdCBpcyBub3Qgc2FmZSB0byBkbyBpdCBtdWx0aXBsZQotICAgICB0aW1lcyAoc2VlIGRpc2N1c3Npb24gb2YgdGhlICJzaHJpbmtzIiBhcnJheSBiZWxvdykuICAqLwotICAqYWdhaW4gPSBmYWxzZTsKLQotICBpZiAocmVsb2Nfc2l6ZSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgaWYgKCFyZWxvY192ZWN0b3IgJiYgcmVsb2Nfc2l6ZSA+IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCB0aGUgcmVsb2NzIGFuZCB0aGluayBhYm91dCB0aGVtICovCi0gIHJlbG9jX2NvdW50ID0KLSAgICBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIHJlbG9jX3ZlY3RvciwKLQkJCSAgICBfYmZkX2dlbmVyaWNfbGlua19nZXRfc3ltYm9scyAoaW5wdXRfYmZkKSk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgewotICAgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhlIHJlbG9jMTYuYyBhbmQgcmVsYXRlZCByZWxheGluZyBjb2RlIGlzIHZlcnkgc2ltcGxlLCB0aGUgcHJpY2UKLSAgICAgZm9yIHRoYXQgc2ltcGxpY2l0eSBpcyB3ZSBjYW4gb25seSBjYWxsIHRoaXMgZnVuY3Rpb24gb25jZSBmb3IKLSAgICAgZWFjaCBzZWN0aW9uLgotCi0gICAgIFNvLCB0byBnZXQgdGhlIGJlc3QgcmVzdWx0cyB3aXRoaW4gdGhhdCBsaW1pdGF0aW9uLCB3ZSBkbyBtdWx0aXBsZQotICAgICByZWxheGluZyBwYXNzZXMgb3ZlciBlYWNoIHNlY3Rpb24gaGVyZS4gIFRoYXQgaW52b2x2ZXMga2VlcGluZyB0cmFjawotICAgICBvZiB0aGUgInNocmluayIgYXQgZWFjaCByZWxvYyBpbiB0aGUgc2VjdGlvbi4gIFRoaXMgYWxsb3dzIHVzIHRvCi0gICAgIGFjY3VyYXRlbHkgZGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSBsb2NhdGlvbiBvZiB0d28gcmVsb2NzIHdpdGhpbgotICAgICB0aGlzIHNlY3Rpb24uCi0KLSAgICAgSW4gdGhlb3J5LCBpZiB3ZSBrZXB0IHRoZSAic2hyaW5rcyIgYXJyYXkgZm9yIGVhY2ggc2VjdGlvbiBmb3IgdGhlCi0gICAgIGVudGlyZSBsaW5rLCB3ZSBjb3VsZCB1c2UgdGhlIGdlbmVyaWMgcmVsYXhpbmcgY29kZSBpbiB0aGUgbGlua2VyCi0gICAgIGFuZCBnZXQgYmV0dGVyIHJlc3VsdHMsIHBhcnRpY3VsYXJseSBmb3IganNyLT5ic3IgYW5kIDI0LT4xNiBiaXQKLSAgICAgbWVtb3J5IHJlZmVyZW5jZSByZWxheGF0aW9ucy4gICovCi0gICAgIAotICBpZiAocmVsb2NfY291bnQgPiAwKQotICAgIHsKLSAgICAgIGludCBhbm90aGVyX3Bhc3MgPSAwOwotCi0gICAgICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc2hyaW5rcyBhcnJheSBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgICAgIHNocmlua3MgPSAoaW50ICopIGJmZF9tYWxsb2MgKHJlbG9jX2NvdW50ICogc2l6ZW9mIChpbnQpKTsKLSAgICAgIG1lbXNldCAoc2hyaW5rcywgMCwgcmVsb2NfY291bnQgKiBzaXplb2YgKGludCkpOwotCi0gICAgICAvKiBMb29wIHVudGlsIG5vdGhpbmcgY2hhbmdlcyBpbiB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZG8gewotCWFyZWxlbnQgKipwYXJlbnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0JbG9uZyBqOwotCi0JYW5vdGhlcl9wYXNzID0gMDsKLQotCWZvciAoaSA9IDAsIHBhcmVudCA9IHJlbG9jX3ZlY3RvcjsgKnBhcmVudDsgcGFyZW50KyssIGkrKykgCi0JICB7Ci0JICAgIC8qIExldCB0aGUgdGFyZ2V0L21hY2hpbmUgZGVwZW5kZW50IGNvZGUgZXhhbWluZSBlYWNoIHJlbG9jCi0JICAgICAgIGluIHRoaXMgc2VjdGlvbiBhbmQgYXR0ZW1wdCB0byBzaHJpbmsgaXQuICAqLwotCSAgICBzaHJpbmsgPSBiZmRfY29mZl9yZWxvYzE2X2VzdGltYXRlIChhYmZkLCBpbnB1dF9zZWN0aW9uLCAqcGFyZW50LAotCQkJCQkJc2hyaW5rc1tpXSwgbGlua19pbmZvKTsKLQotCSAgICAvKiBJZiBpdCBzaHJ1bmssIG5vdGUgaXQgaW4gdGhlIHNocmlua3MgYXJyYXkgYW5kIHNldCB1cCBmb3IKLQkgICAgICAgYW5vdGhlciBwYXNzLiAgKi8KLQkgICAgaWYgKHNocmluayAhPSBzaHJpbmtzW2ldKQotCSAgICAgIHsKLQkgICAgICAgIGFub3RoZXJfcGFzcyA9IDE7Ci0JCWZvciAoaiA9IGkgKyAxOyBqIDwgcmVsb2NfY291bnQ7IGorKykKLQkJICBzaHJpbmtzW2pdICs9IHNocmluayAtIHNocmlua3NbaV07Ci0JICAgICAgfQotCSAgfQotICAKLSAgICAgIH0gd2hpbGUgKGFub3RoZXJfcGFzcyk7Ci0KLSAgICAgIGZyZWUoKGNoYXIgKilzaHJpbmtzKTsKLSAgICB9Ci0KLSAgaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplIC09IHNocmluazsgIAotICBmcmVlKChjaGFyICopcmVsb2NfdmVjdG9yKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJmZF9ieXRlICoKLWJmZF9jb2ZmX3JlbG9jMTZfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKGluX2FiZmQsCi0JCQkJCQlsaW5rX2luZm8sCi0JCQkJCQlsaW5rX29yZGVyLAotCQkJCQkJZGF0YSwKLQkJCQkJCXJlbG9jYXRlYWJsZSwKLQkJCQkJCXN5bWJvbHMpCi0gICAgIGJmZCAqaW5fYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotICAvKiBHZXQgZW5vdWdoIG1lbW9yeSB0byBob2xkIHRoZSBzdHVmZiAqLwotICBiZmQgKmlucHV0X2JmZCA9IGxpbmtfb3JkZXItPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3duZXI7Ci0gIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uID0gbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uOwotICBsb25nIHJlbG9jX3NpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24pOwotICBhcmVsZW50ICoqcmVsb2NfdmVjdG9yOwotICBsb25nIHJlbG9jX2NvdW50OwotCi0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBJZiBwcm9kdWNpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgZG9uJ3QgYm90aGVyIHRvIHJlbGF4LiAgKi8KLSAgaWYgKHJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm4gYmZkX2dlbmVyaWNfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChpbl9hYmZkLCBsaW5rX2luZm8sCi0JCQkJCQkgICAgICAgbGlua19vcmRlciwKLQkJCQkJCSAgICAgICBkYXRhLCByZWxvY2F0ZWFibGUsCi0JCQkJCQkgICAgICAgc3ltYm9scyk7Ci0KLSAgLyogcmVhZCBpbiB0aGUgc2VjdGlvbiAqLwotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMoaW5wdXRfYmZkLAotCQkJCSBpbnB1dF9zZWN0aW9uLAotCQkJCSBkYXRhLAotCQkJCSAwLAotCQkJCSBpbnB1dF9zZWN0aW9uLT5fcmF3X3NpemUpKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgCi0gIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jKChzaXplX3QpIHJlbG9jX3NpemUpOwotICBpZiAoIXJlbG9jX3ZlY3RvciAmJiByZWxvY19zaXplICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICByZWxvY19jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGlucHV0X2JmZCwgCi0JCQkJCWlucHV0X3NlY3Rpb24sCi0JCQkJCXJlbG9jX3ZlY3RvciwKLQkJCQkJc3ltYm9scyk7Ci0gIGlmIChyZWxvY19jb3VudCA8IDApCi0gICAgewotICAgICAgZnJlZSAocmVsb2NfdmVjdG9yKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAKLSAgaWYgKHJlbG9jX2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcGFyZW50ID0gcmVsb2NfdmVjdG9yOwotICAgICAgYXJlbGVudCAqcmVsb2MgOwotICAgICAgdW5zaWduZWQgaW50IGRzdF9hZGRyZXNzID0gMDsKLSAgICAgIHVuc2lnbmVkIGludCBzcmNfYWRkcmVzcyA9IDA7Ci0gICAgICB1bnNpZ25lZCBpbnQgcnVuOwotICAgICAgdW5zaWduZWQgaW50IGlkeDsKLSAgICAKLSAgICAgIC8qIEZpbmQgaG93IGxvbmcgYSBydW4gd2UgY2FuIGRvICovCi0gICAgICB3aGlsZSAoZHN0X2FkZHJlc3MgPCBsaW5rX29yZGVyLT5zaXplKSAKLQl7Ci0JICByZWxvYyA9ICpwYXJlbnQ7Ci0JICBpZiAocmVsb2MpIAotCSAgICB7Ci0JICAgICAgLyogTm90ZSB0aGF0IHRoZSByZWxheGluZyBkaWRuJ3QgdGllIHVwIHRoZSBhZGRyZXNzZXMgaW4gdGhlCi0JCSByZWxvY2F0aW9uLCBzbyB3ZSB1c2UgdGhlIG9yaWdpbmFsIGFkZHJlc3MgdG8gd29yayBvdXQgdGhlCi0JCSBydW4gb2Ygbm9uLXJlbG9jYXRlZCBkYXRhICovCi0JICAgICAgcnVuID0gcmVsb2MtPmFkZHJlc3MgLSBzcmNfYWRkcmVzczsKLQkgICAgICBwYXJlbnQrKzsKLQkgICAgfQotCSAgZWxzZSAKLQkgICAgewotCSAgICAgIHJ1biA9IGxpbmtfb3JkZXItPnNpemUgLSBkc3RfYWRkcmVzczsKLQkgICAgfQotCSAgLyogQ29weSB0aGUgYnl0ZXMgKi8KLQkgIGZvciAoaWR4ID0gMDsgaWR4IDwgcnVuOyBpZHgrKykKLQkgICAgewotCSAgICAgIGRhdGFbZHN0X2FkZHJlc3MrK10gPSBkYXRhW3NyY19hZGRyZXNzKytdOwotCSAgICB9Ci0gICAgCi0JICAvKiBOb3cgZG8gdGhlIHJlbG9jYXRpb24gKi8KLSAgICAKLQkgIGlmIChyZWxvYykgCi0JICAgIHsKLQkgICAgICBiZmRfY29mZl9yZWxvYzE2X2V4dHJhX2Nhc2VzIChpbnB1dF9iZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwKLQkJCQkJICAgIHJlbG9jLCBkYXRhLCAmc3JjX2FkZHJlc3MsCi0JCQkJCSAgICAmZHN0X2FkZHJlc3MpOwotCSAgICB9ICAgIAotCX0KLSAgICB9Ci0gIGZyZWUoKGNoYXIgKilyZWxvY192ZWN0b3IpOwotICByZXR1cm4gZGF0YTsKLX0KLQpkaWZmIC0tZ2l0IGEvYmZkL3Jpc2NpeC5jIGIvYmZkL3Jpc2NpeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWFiNDlhLi4wMDAwMDAwCi0tLSBhL2JmZC9yaXNjaXguYworKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIFJJU0MgaVggKEFjb3JuLCBhcm0pIGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLSAgIAotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFJJU0MgaVggb3ZlcmxvYWRzIHRoZSBNQUdJQyBmaWVsZCB0byBpbmRpY2F0ZSBtb3JlIHRoYW4ganVzdCB0aGUgdXN1YWwKLSAgIFtaTk9dTUFHSUMgdmFsdWVzLiAgQWxzbyBpbmNsdWRlZCBhcmUgc3F1ZWV6aW5nIGluZm9ybWF0aW9uIGFuZAotICAgc2hhcmVkIGxpYnJhcnkgdXNhZ2UuICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGNvbWUgZnJvbSB0aGUgbWFuIHBhZ2UuICAqLwotI2RlZmluZSBTSExJQkxFTiA2MAotCi0jZGVmaW5lIE1GX0lNUFVSRSAgICAgICAwMDIwMAotI2RlZmluZSBNRl9TUVVFRVpFRCAgICAgMDEwMDAKLSNkZWZpbmUgTUZfVVNFU19TTCAgICAgIDAyMDAwCi0jZGVmaW5lIE1GX0lTX1NMICAgICAgICAwNDAwMAotCi0vKiBDb21tb24gY29tYmluYXRpb25zLiAgKi8KLSNkZWZpbmUgSU1BR0lDICAgICAgICAgIChNRl9JTVBVUkV8Wk1BR0lDKSAgICAgIC8qIERlbWFuZCBsb2FkIChpbXB1cmUgdGV4dCkgKi8KLSNkZWZpbmUgU1BPTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfE9NQUdJQykgICAgIC8qIE9NQUdJQyB3aXRoIGxhcmdlIGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIG1heSBjb250YWluIGEgcmVmIHRvIGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaGFyZWQgbGliIHJlcXVpcmVkIGJ5IHRoZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iamVjdC4gKi8KLSNkZWZpbmUgU0xPTUFHSUMgICAgICAgIChNRl9JU19TTHxPTUFHSUMpIC8qIEEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIGxpYnJhcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSB0ZXh0IHBvcnRpb24gb2YgdGhlIG9iamVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udGFpbnMgIm92ZXJmbG93IHRleHQiIGZyb20gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBzaGFyZWQgbGlicmFyeSB0byBiZSBsaW5rZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIHdpdGggYW4gb2JqZWN0ICovCi0jZGVmaW5lIFFNQUdJQyAgICAgICAgICAoTUZfU1FVRUVaRUR8Wk1BR0lDKSAgICAvKiBTcWVlemVkIGRlbWFuZCBwYWdlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IFRoaXMgaW50ZXJwcmV0YXRpb24gb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFFNQUdJQyBzZWVtcyB0byBiZSBhdCB2YXJpYW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2l0aCB0aGF0IHVzZWQgb24gb3RoZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyY2hpdGVjdHVyZXMuICovCi0jZGVmaW5lIFNQWk1BR0lDICAgICAgICAoTUZfVVNFU19TTHxaTUFHSUMpICAgICAvKiBwcm9ncmFtIHdoaWNoIHVzZXMgc2wgKi8KLSNkZWZpbmUgU1BRTUFHSUMgICAgICAgIChNRl9VU0VTX1NMfFFNQUdJQykgICAgIC8qIHNxZWV6ZWQgZGl0dG8gKi8KLSNkZWZpbmUgU0xaTUFHSUMgICAgICAgIChNRl9JU19TTHxaTUFHSUMpICAgICAgIC8qIHNoYXJlZCBsaWIgcGFydCBvZiBwcm9nICovCi0jZGVmaW5lIFNMUFpNQUdJQyAgICAgICAoTUZfVVNFU19TTHxTTFpNQUdJQykgICAvKiBzbCB3aGljaCB1c2VzIGFub3RoZXIgKi8KLQotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2luZm8gJiBNRl9VU0VTX1NMKQotCi0vKiBPbmx5IGEgcHVyZSBPTUFHSUMgZmlsZSBoYXMgdGhlIG1pbmltYWwgaGVhZGVyICovCi0jZGVmaW5lIE5fVFhUT0ZGKHgpICAgICAgICAgICAgICAgICAgICAgXAotICgoeCkuYV9pbmZvID09IE9NQUdJQyA/IDMyICAgICAgICAgICAgIFwKLSAgOiAoTl9NQUdJQyh4KSA9PSBaTUFHSUMpID8gVEFSR0VUX1BBR0VfU0laRSAgXAotICA6IDk5OSkKLQotI2RlZmluZSBOX1RYVEFERFIoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChOX01BR0lDKHgpICE9IFpNQUdJQyA/IDAgLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIC8qIFByb2dyYW1zIHdpdGggc2hhcmVkIGxpYnMgYXJlIGxvYWRlZCBhdCB0aGUgZmlyc3QgcGFnZSBhZnRlciBhbGwgdGhlICAgXAotICAgICAgdGV4dCBzZWdtZW50cyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgcHJvZ3JhbXMuICBXaXRob3V0IGxvb2tpbmcgdGhpcyAgICBcCi0gICAgICB1cCB3ZSBjYW4ndCBrbm93IGV4YWN0bHkgd2hhdCB0aGUgYWRkcmVzcyB3aWxsIGJlLiAgQSByZWFzb25hYmxlIGd1ZXNzIFwKLSAgICAgIGlzIHRoYXQgYV9lbnRyeSB3aWxsIGJlIGluIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBleGVjdXRhYmxlLiAgKi8gICAgICAgXAotICAgOiBOX1NIQVJFRF9MSUIoeCkgPyAoKHgpLmFfZW50cnkgJiB+KFRBUkdFVF9QQUdFX1NJWkUgLSAxKSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgOiBURVhUX1NUQVJUX0FERFIpCi0KLSNkZWZpbmUgTl9TWU1PRkYoeCkgXAotICAoTl9UWFRPRkYgKHgpICsgKHgpLmFfdGV4dCArICh4KS5hX2RhdGEgKyAoeCkuYV90cnNpemUgKyAoeCkuYV9kcnNpemUpCi0KLSNkZWZpbmUgTl9TVFJPRkYoeCkgKE5fU1lNT0ZGICh4KSArICh4KS5hX3N5bXMpCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDMyNzY4Ci0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMzI3NjgKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX2FybQotCi0jZGVmaW5lIE1ZKE9QKSBDQVQocmlzY2l4XyxPUCkKLSNkZWZpbmUgVEFSR0VUTkFNRSAiYS5vdXQtcmlzY2l4IgotI2RlZmluZSBOX0JBRE1BRyh4KSAoKCgoeCkuYV9pbmZvICYgfjAwNzIwMCkgIT0gWk1BR0lDKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAoKCh4KS5hX2luZm8gJiB+MDA2MDAwKSAhPSBPTUFHSUMpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICgoeCkuYV9pbmZvICE9IE5NQUdJQykpCi0jZGVmaW5lIE5fTUFHSUMoeCkgKCh4KS5hX2luZm8gJiB+MDcyMDApCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2RlZmluZSBXUklURV9IRUFERVJTKGFiZmQsIGV4ZWNwKQkJCQkJICAgXAotICB7CQkJCQkJCQkJICAgXAotICAgIGJmZF9zaXplX3R5cGUgdGV4dF9zaXplOyAvKiBkdW1teSB2YXJzICovCQkJCSAgIFwKLSAgICBmaWxlX3B0ciB0ZXh0X2VuZDsJCQkJCQkJICAgXAotICAgIGlmIChhZGF0YShhYmZkKS5tYWdpYyA9PSB1bmRlY2lkZWRfbWFnaWMpCQkJCSAgIFwKLSAgICAgIE5BTUUoYW91dCxhZGp1c3Rfc2l6ZXNfYW5kX3ZtYXMpIChhYmZkLCAmdGV4dF9zaXplLCAmdGV4dF9lbmQpOwkgICBcCi0gICAgCQkJCQkJCQkJICAgXAotICAgIGV4ZWNwLT5hX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSAqIEVYVEVSTkFMX05MSVNUX1NJWkU7CSAgIFwKLSAgICBleGVjcC0+YV9lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7CQkJICAgXAotICAgIAkJCQkJCQkJCSAgIFwKLSAgICBleGVjcC0+YV90cnNpemUgPSAoKG9ial90ZXh0c2VjIChhYmZkKS0+cmVsb2NfY291bnQpICoJCSAgIFwKLQkJICAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSk7CQkJICAgXAotICAgIGV4ZWNwLT5hX2Ryc2l6ZSA9ICgob2JqX2RhdGFzZWMgKGFiZmQpLT5yZWxvY19jb3VudCkgKgkJICAgXAotCQkgICAgICAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpKTsJCQkgICBcCi0gICAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfb3V0KSAoYWJmZCwgZXhlY3AsICZleGVjX2J5dGVzKTsJCSAgIFwKLSAgICAJCQkJCQkJCQkgICBcCi0gICAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSAhPSAwKSByZXR1cm4gZmFsc2U7CSAgIFwKLSAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmZXhlY19ieXRlcywgMSwgRVhFQ19CWVRFU19TSVpFLCBhYmZkKQkJICAgXAotCSE9IEVYRUNfQllURVNfU0laRSkJCQkJCQkgICBcCi0gICAgICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLSAgICAvKiBOb3cgd3JpdGUgb3V0IHJlbG9jIGluZm8sIGZvbGxvd2VkIGJ5IHN5bXMgYW5kIHN0cmluZ3MgKi8JICAgXAotCQkJCQkJCQkJICAgXAotICAgIGlmIChiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpICE9IChhc3ltYm9sICoqKSBOVUxMCQkJICAgXAotCSYmIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICE9IDApCQkJCSAgIFwKLSAgICAgIHsJCQkJCQkJCQkgICBcCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKE5fU1lNT0ZGKCpleGVjcCkpLCBTRUVLX1NFVCkgIT0gMCkgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmICghIE5BTUUoYW91dCx3cml0ZV9zeW1zKShhYmZkKSkgcmV0dXJuIGZhbHNlOwkJICAgXAotCQkJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX1RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoISByaXNjaXhfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIG9ial90ZXh0c2VjIChhYmZkKSkpCSAgIFwKLQkgIHJldHVybiBmYWxzZTsJCQkJCQkJICAgXAotCWlmIChiZmRfc2VlayAoYWJmZCwgKGZpbGVfcHRyKShOX0RSRUxPRkYoKmV4ZWNwKSksIFNFRUtfU0VUKSAhPSAwKSBcCi0JICByZXR1cm4gZmFsc2U7CQkJCQkJCSAgIFwKLQkJCQkJCQkJCSAgIFwKLQlpZiAoIU5BTUUoYW91dCxzcXVpcnRfb3V0X3JlbG9jcykoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkJICAgXAotCSAgcmV0dXJuIGZhbHNlOwkJCQkJCQkgICBcCi0gICAgICB9CQkJCQkJCQkJICAgXAotICB9Ci0KLSNpbmNsdWRlICJsaWJhb3V0LmgiCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNl9kb25lIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosIGFzeW1ib2wgKiwgUFRSLAotCQkJCSAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotcmlzY2l4X2ZpeF9wY3JlbF8yNiBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqLCBhc3ltYm9sICosIFBUUiwKLQkJCSAgICAgYXNlY3Rpb24gKiwgYmZkICosIGNoYXIgKiopKTsKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tdID0gewotICAvKiB0eXBlICAgICAgICAgICAgICBycyBzaXplIGJzeiAgcGNyZWwgYml0cG9zIG92cmYgICAgICAgICAgICAgICAgICAgICBzZiBuYW1lICAgICBwYXJ0X2lucGwgcmVhZG1hc2sgIHNldG1hc2sgICAgcGNkb25lICovCi0gIEhPV1RPKCAwLCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCI4IiwgICAgICAgIHRydWUsIDB4MDAwMDAwZmYsMHgwMDAwMDBmZiwgZmFsc2UpLAotICBIT1dUTyggMSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCBmYWxzZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsMCwiMTYiLCAgICAgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCAyLCAgICAgICAgICAgICAgMCwgIDIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCIzMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDMsICAgICAgICAgICAgICAyLCAgMywgICAyNiwgdHJ1ZSwgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgcmlzY2l4X2ZpeF9wY3JlbF8yNiAsICJBUk0yNiIsICAgICAgdHJ1ZSwgMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCi0gIEhPV1RPKCA0LCAgICAgICAgICAgICAgMCwgIDAsICAgOCwgIHRydWUsICAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICAwLCJESVNQOCIsICAgICB0cnVlLCAweDAwMDAwMGZmLDB4MDAwMDAwZmYsIHRydWUpLAotICBIT1dUTyggNSwgICAgICAgICAgICAgIDAsICAxLCAgIDE2LCB0cnVlLCAgMCwgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAgMCwiRElTUDE2IiwgICAgdHJ1ZSwgMHgwMDAwZmZmZiwweDAwMDBmZmZmLCB0cnVlKSwKLSAgSE9XVE8oIDYsICAgICAgICAgICAgICAwLCAgMiwgICAzMiwgdHJ1ZSwgIDAsIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgIDAsIkRJU1AzMiIsICAgIHRydWUsIDB4ZmZmZmZmZmYsMHhmZmZmZmZmZiwgdHJ1ZSksCi0gIEhPV1RPKCA3LCAgICAgICAgICAgICAgMiwgIDMsICAgMjYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQsICByaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUsICJBUk0yNkQiLHRydWUsMHgwMGZmZmZmZiwweDAwZmZmZmZmLCBmYWxzZSksCi0gIHstMX0sCi0gIEhPV1RPKCA5LCAgICAgICAgICAgICAgMCwgLTEsICAgMTYsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUcxNiIsICAgICAgICB0cnVlLCAweDAwMDBmZmZmLDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8oIDEwLCAgICAgICAgICAgICAgMCwgLTIsICAgMzIsIGZhbHNlLCAwLCBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwwLCJORUczMiIsICAgICAgICB0cnVlLCAweGZmZmZmZmZmLDB4ZmZmZmZmZmYsIGZhbHNlKQotfTsKLQotI2RlZmluZSBSSVNDSVhfVEFCTEVfU0laRSBcCi0gIChzaXplb2YgKHJpc2NpeF9zdGRfcmVsb2NfaG93dG8pIC8gc2l6ZW9mIChyZWxvY19ob3d0b190eXBlKSkKLQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2X2RvbmUgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2wsIGRhdGEsIGlucHV0X3NlY3Rpb24sCi0JCQkgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICAvKiBUaGlzIGlzIGRlYWQgc2ltcGxlIGF0IHByZXNlbnQuICAqLwotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yaXNjaXhfZml4X3BjcmVsXzI2IChhYmZkLCByZWxvY19lbnRyeSwgc3ltYm9sLCBkYXRhLCBpbnB1dF9zZWN0aW9uLAotCQkgICAgIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBiZmRfdm1hIHJlbG9jYXRpb247Ci0gIGJmZF9zaXplX3R5cGUgYWRkciA9IHJlbG9jX2VudHJ5LT5hZGRyZXNzOwotICBsb25nIHRhcmdldCA9IGJmZF9nZXRfMzIgKGFiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgYWRkcik7Ci0gIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBmbGFnID0gYmZkX3JlbG9jX29rOwotICAKLSAgLyogSWYgdGhpcyBpcyBhbiB1bmRlZmluZWQgc3ltYm9sLCByZXR1cm4gZXJyb3IgKi8KLSAgaWYgKHN5bWJvbC0+c2VjdGlvbiA9PSAmYmZkX3VuZF9zZWN0aW9uCi0gICAgICAmJiAoc3ltYm9sLT5mbGFncyAmIEJTRl9XRUFLKSA9PSAwKQotICAgIHJldHVybiBvdXRwdXRfYmZkID8gYmZkX3JlbG9jX2NvbnRpbnVlIDogYmZkX3JlbG9jX3VuZGVmaW5lZDsKLQotICAvKiBJZiB0aGUgc2VjdGlvbnMgYXJlIGRpZmZlcmVudCwgYW5kIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbiwKLSAgICAganVzdCBpZ25vcmUgaXQgZm9yIG5vdy4gICovCi0gIGlmIChzeW1ib2wtPnNlY3Rpb24tPm5hbWUgIT0gaW5wdXRfc2VjdGlvbi0+bmFtZQotICAgICAgJiYgb3V0cHV0X2JmZCAhPSAoYmZkICopTlVMTCkKLSAgICByZXR1cm4gYmZkX3JlbG9jX2NvbnRpbnVlOwotCi0gIHJlbG9jYXRpb24gPSAodGFyZ2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKLSAgcmVsb2NhdGlvbiA9IChyZWxvY2F0aW9uIF4gMHgwMjAwMDAwMCkgLSAweDAyMDAwMDAwOyAvKiBTaWduIGV4dGVuZCAqLwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+dmFsdWU7Ci0gIHJlbG9jYXRpb24gKz0gc3ltYm9sLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICByZWxvY2F0aW9uICs9IHN5bWJvbC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiArPSByZWxvY19lbnRyeS0+YWRkZW5kOwotICByZWxvY2F0aW9uIC09IGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0gIHJlbG9jYXRpb24gLT0gaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLSAgcmVsb2NhdGlvbiAtPSBhZGRyOwotICBpZiAocmVsb2NhdGlvbiAmIDMpCi0gICAgcmV0dXJuIGJmZF9yZWxvY19vdmVyZmxvdzsKLQotICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgaWYgKHJlbG9jYXRpb24gJiAweDAyMDAwMDAwKQotICAgIHsKLSAgICAgIGlmICgocmVsb2NhdGlvbiAmIH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpICE9IH4gKGJmZF92bWEpIDB4MDNmZmZmZmYpCi0JZmxhZyA9IGJmZF9yZWxvY19vdmVyZmxvdzsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlbG9jYXRpb24gJiB+MHgwM2ZmZmZmZikKLSAgICBmbGFnID0gYmZkX3JlbG9jX292ZXJmbG93OwotCi0gIHRhcmdldCAmPSB+MHgwMGZmZmZmZjsKLSAgdGFyZ2V0IHw9IChyZWxvY2F0aW9uID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgdGFyZ2V0LCAoYmZkX2J5dGUgKikgZGF0YSArIGFkZHIpOwotCi0gIC8qIE5vdyB0aGUgQVJNIG1hZ2ljLi4uIENoYW5nZSB0aGUgcmVsb2MgdHlwZSBzbyB0aGF0IGl0IGlzIG1hcmtlZCBhcyBkb25lLgotICAgICBTdHJpY3RseSB0aGlzIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHdlIGFyZSBkb2luZyBhIHBhcnRpYWwgcmVsb2NhdGlvbi4gICovCi0gIHJlbG9jX2VudHJ5LT5ob3d0byA9ICZyaXNjaXhfc3RkX3JlbG9jX2hvd3RvWzddOwotICAKLSAgcmV0dXJuIGZsYWc7Ci19Ci0KLXJlbG9jX2hvd3RvX3R5cGUgKgotREVGVU4ocmlzY2l4X3JlbG9jX3R5cGVfbG9va3VwLChhYmZkLGNvZGUpLAotICAgICAgYmZkICphYmZkIEFORAotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpCi17Ci0jZGVmaW5lIEFTVEQoaSxqKSAgICAgICBjYXNlIGk6IHJldHVybiAmcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tqXQotICBpZiAoY29kZSA9PSBCRkRfUkVMT0NfQ1RPUikKLSAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaF9pbmZvIChhYmZkKS0+Yml0c19wZXJfYWRkcmVzcykKLSAgICAgIHsKLSAgICAgIGNhc2UgMzI6Ci0gICAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgICB9Ci0KLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18xNiwgMSk7Ci0gICAgICBBU1REIChCRkRfUkVMT0NfMzIsIDIpOwotICAgICAgQVNURCAoQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0gsIDMpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzhfUENSRUwsIDQpOwotICAgICAgQVNURCAoQkZEX1JFTE9DXzE2X1BDUkVMLCA1KTsKLSAgICAgIEFTVEQgKEJGRF9SRUxPQ18zMl9QQ1JFTCwgNik7Ci0gICAgZGVmYXVsdDogcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIE5VTEw7Ci0gICAgfQotfQotCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIF9iZmRfZ2VuZXJpY19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0jZGVmaW5lIE1ZX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIE1ZX2ZpbmFsX2xpbmtfY2FsbGJhY2sgc2hvdWxkX25vdF9iZV91c2VkCi0jZGVmaW5lIE1ZX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0KLSNkZWZpbmUgTVlfYmZkX3JlbG9jX3R5cGVfbG9va3VwIHJpc2NpeF9yZWxvY190eXBlX2xvb2t1cAotI2RlZmluZSBNWV9jYW5vbmljYWxpemVfcmVsb2MgcmlzY2l4X2Nhbm9uaWNhbGl6ZV9yZWxvYwotI2RlZmluZSBNWV9vYmplY3RfcCByaXNjaXhfb2JqZWN0X3AKLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnJpc2NpeF9jYWxsYmFjayBQQVJBTVMgKChiZmQgKikpOwotCi12b2lkCi1yaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCBnLCBuYXRwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqZzsKLSAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqbmF0cHRyOwotewotICBpbnQgcl9pbmRleDsKLSAgYXN5bWJvbCAqc3ltID0gKihnLT5zeW1fcHRyX3B0cik7Ci0gIGludCByX2V4dGVybjsKLSAgaW50IHJfbGVuZ3RoOwotICBpbnQgcl9wY3JlbDsKLSAgaW50IHJfbmVnID0gMDsJLyogTmVnYXRpdmUgcmVsb2NzIHVzZSB0aGUgQkFTRVJFTCBiaXQuICAqLwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb24gPSBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCi0gIFBVVF9XT1JEKGFiZmQsIGctPmFkZHJlc3MsIG5hdHB0ci0+cl9hZGRyZXNzKTsKLQotICByX2xlbmd0aCA9IGctPmhvd3RvLT5zaXplIDsgICAvKiBTaXplIGFzIGEgcG93ZXIgb2YgdHdvICovCi0gIGlmIChyX2xlbmd0aCA8IDApCi0gICAgewotICAgICAgcl9sZW5ndGggPSAtcl9sZW5ndGg7Ci0gICAgICByX25lZyA9IDE7Ci0gICAgfQotCi0gIHJfcGNyZWwgID0gKGludCkgZy0+aG93dG8tPnBjX3JlbGF0aXZlOyAvKiBSZWxhdGl2ZSB0byBQQz8gKi8KLQotICAvKiBGb3IgUklTQyBpWCwgaW4gcGMtcmVsYXRpdmUgcmVsb2NzIHRoZSByX3BjcmVsIGJpdCBtZWFucyB0aGF0IHRoZQotICAgICByZWxvY2F0aW9uIGhhcyBiZWVuIGRvbmUgYWxyZWFkeSAoT25seSBmb3IgdGhlIDI2LWJpdCBvbmUgSSB0aGluayk/Pz8hISEKLSAgICAgKi8KLSAgCi0gIGlmIChyX2xlbmd0aCA9PSAzKQotICAgIHJfcGNyZWwgPSByX3BjcmVsID8gMCA6IDE7Ci0gIAotCi0jaWYgMAotICAvKiBGb3IgYSBzdGFuZGFyZCByZWxvYywgdGhlIGFkZGVuZCBpcyBpbiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICByX2FkZGVuZCA9IGctPmFkZGVuZCArICgqKGctPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWE7Ci0jZW5kaWYKLQotICAvKiBuYW1lIHdhcyBjbG9iYmVyZWQgYnkgYW91dF93cml0ZV9zeW1zIHRvIGJlIHN5bWJvbCBpbmRleCAqLwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyByZWxhdGl2ZSB0byBhIHN5bWJvbCB0aGVuIHNldCB0aGUKLSAgICAgcl9pbmRleCB0byB0aGUgc3ltYm9scyBpbmRleCwgYW5kIHRoZSByX2V4dGVybiBiaXQuCi0KLSAgICAgQWJzb2x1dGUgc3ltYm9scyBjYW4gY29tZSBpbiBpbiB0d28gd2F5cywgZWl0aGVyIGFzIGFuIG9mZnNldAotICAgICBmcm9tIHRoZSBhYnMgc2VjdGlvbiwgb3IgYXMgYSBzeW1ib2wgd2hpY2ggaGFzIGFuIGFicyB2YWx1ZS4KLSAgICAgY2hlY2sgZm9yIHRoYXQgaGVyZQotICAgICAqLwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKG91dHB1dF9zZWN0aW9uKQotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF9hYnNfc2VjdGlvbgotICAgICAgfHwgb3V0cHV0X3NlY3Rpb24gPT0gJmJmZF91bmRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAoYmZkX2Fic19zZWN0aW9uLnN5bWJvbCA9PSBzeW0pCi0JewotCSAgLyogV2hvb3BzLCBsb29rZWQgbGlrZSBhbiBhYnMgc3ltYm9sLCBidXQgaXMgcmVhbGx5IGFuIG9mZnNldAotCSAgICAgZnJvbSB0aGUgYWJzIHNlY3Rpb24gKi8KLQkgIHJfaW5kZXggPSAwOwotCSAgcl9leHRlcm4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBGaWxsIGluIHN5bWJvbCAqLwotCSAgcl9leHRlcm4gPSAxOwotCSAgcl9pbmRleCA9ICgqZy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBKdXN0IGFuIG9yZGluYXJ5IHNlY3Rpb24gKi8KLSAgICAgIHJfZXh0ZXJuID0gMDsKLSAgICAgIHJfaW5kZXggID0gb3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICB9Ci0KLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzBdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsyXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fQklHOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUc6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmF0cHRyLT5yX2luZGV4WzJdID0gcl9pbmRleCA+PiAxNjsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFsxXSA9IHJfaW5kZXggPj4gODsKLSAgICAgIG5hdHB0ci0+cl9pbmRleFswXSA9IHJfaW5kZXg7Ci0gICAgICBuYXRwdHItPnJfdHlwZVswXSA9Ci0JKCAgKHJfZXh0ZXJuID8gICBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFOiAwKQotCSB8IChyX3BjcmVsICA/ICAgUkVMT0NfU1REX0JJVFNfUENSRUxfTElUVExFOiAwKQotCSB8IChyX25lZyAgICA/ICAgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEU6IDApCi0JIHwgKHJfbGVuZ3RoIDw8ICBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0gICAgfQotfQotCi1ib29sZWFuCi1yaXNjaXhfc3F1aXJ0X291dF9yZWxvY3MgKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGFyZWxlbnQgKipnZW5lcmljOwotICB1bnNpZ25lZCBjaGFyICpuYXRpdmUsICpuYXRwdHI7Ci0gIHNpemVfdCBlYWNoX3NpemU7Ci0gIAotICB1bnNpZ25lZCBpbnQgY291bnQgPSBzZWN0aW9uLT5yZWxvY19jb3VudDsKLSAgc2l6ZV90IG5hdHNpemU7Ci0KLSAgaWYgKGNvdW50ID09IDApIHJldHVybiB0cnVlOwotCi0gIGVhY2hfc2l6ZSA9IG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKTsKLSAgbmF0c2l6ZSA9IGVhY2hfc2l6ZSAqIGNvdW50OwotICBuYXRpdmUgPSAodW5zaWduZWQgY2hhciAqKSBiZmRfemFsbG9jIChhYmZkLCBuYXRzaXplKTsKLSAgaWYgKCFuYXRpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGdlbmVyaWMgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQotICBmb3IgKG5hdHB0ciA9IG5hdGl2ZTsKLSAgICAgICBjb3VudCAhPSAwOwotICAgICAgIC0tY291bnQsIG5hdHB0ciArPSBlYWNoX3NpemUsICsrZ2VuZXJpYykKLSAgICByaXNjaXhfc3dhcF9zdGRfcmVsb2Nfb3V0IChhYmZkLCAqZ2VuZXJpYywKLQkJCSAgICAgICAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBuYXRwdHIpOwotCi0gIGlmICggYmZkX3dyaXRlICgoUFRSKSBuYXRpdmUsIDEsIG5hdHNpemUsIGFiZmQpICE9IG5hdHNpemUpCi0gICAgewotICAgICAgYmZkX3JlbGVhc2UoYWJmZCwgbmF0aXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYmZkX3JlbGVhc2UgKGFiZmQsIG5hdGl2ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qCi0gKiBUaGlzIGlzIGp1c3QgbGlrZSB0aGUgc3RhbmRhcmQgYW91dHguaCB2ZXJzaW9uIGJ1dCB3ZSBuZWVkIHRvIGRvIG91cgotICogb3duIG1hcHBpbmcgb2YgZXh0ZXJuYWwgcmVsb2MgdHlwZSB2YWx1ZXMgdG8gaG93dG8gZW50cmllcy4KLSAqLwotbG9uZwotTVkoY2Fub25pY2FsaXplX3JlbG9jKShhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgICBiZmQgKmFiZmQ7Ci0gICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIGFyZWxlbnQgKnRibHB0ciA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIHVuc2lnbmVkIGludCBjb3VudCwgYzsKLSAgZXh0ZXJuIHJlbG9jX2hvd3RvX3R5cGUgTkFNRShhb3V0LHN0ZF9ob3d0b190YWJsZSlbXTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZSwgcmV0dXJuIHRoZSB2YWx1ZXMuICovCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT05TVFJVQ1RPUikgewotICAgIGFyZWxlbnRfY2hhaW4gKmNoYWluID0gc2VjdGlvbi0+Y29uc3RydWN0b3JfY2hhaW47Ci0KLSAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzZWN0aW9uLT5yZWxvY19jb3VudDsgY291bnQrKykgewotICAgICAgKnJlbHB0cisrID0gJmNoYWluLT5yZWxlbnQ7Ci0gICAgICBjaGFpbiA9IGNoYWluLT5uZXh0OwotICAgIH0KLSAgICAqcmVscHRyID0gMDsKLSAgICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIH0KLSAgaWYgKHRibHB0ciAmJiBzZWN0aW9uLT5yZWxvY19jb3VudCkgewotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCsrIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7KQotICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgKnJlbHB0ciA9IDA7Ci0gICAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB9Ci0KLSAgaWYgKCFOQU1FKGFvdXQsc2x1cnBfcmVsb2NfdGFibGUpKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMpKQotICAgIHJldHVybiAtMTsKLSAgdGJscHRyID0gc2VjdGlvbi0+cmVsb2NhdGlvbjsKLQotICAvKiBmaXggdXAgaG93dG8gZW50cmllcyAqLwotICBmb3IgKGNvdW50ID0gMDsgY291bnQrKyA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OykKLSAgICB7Ci0gICAgICBjID0gdGJscHRyLT5ob3d0byAtIE5BTUUoYW91dCxzdGRfaG93dG9fdGFibGUpOwotICAgICAgQkZEX0FTU0VSVCAoYyA8IFJJU0NJWF9UQUJMRV9TSVpFKTsKLSAgICAgIHRibHB0ci0+aG93dG8gPSAmcmlzY2l4X3N0ZF9yZWxvY19ob3d0b1tjXTsKLQotICAgICAgKnJlbHB0cisrID0gdGJscHRyKys7Ci0gICAgfQotICAqcmVscHRyID0gMDsKLSAgcmV0dXJuIHNlY3Rpb24tPnJlbG9jX2NvdW50OwotfQotCi0vKiBUaGlzIGlzIHRoZSBzYW1lIGFzIE5BTUUoYW91dCxzb21lX2FvdXRfb2JqZWN0X3ApLCBidXQgaGFzIGRpZmZlcmVudCAKLSAgIGV4cGFuc2lvbnMgb2YgdGhlIG1hY3JvIGRlZmluaXRpb25zLiAgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqCi1yaXNjaXhfc29tZV9hb3V0X29iamVjdF9wIChhYmZkLCBleGVjcCwgY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3A7Ci0gICAgIGNvbnN0IGJmZF90YXJnZXQgKigqY2FsbGJhY2tfdG9fcmVhbF9vYmplY3RfcCkgUEFSQU1TICgoYmZkICopKTsKLXsKLSAgc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgKnJhd3B0ciwgKm9sZHJhd3B0cjsKLSAgY29uc3QgYmZkX3RhcmdldCAqcmVzdWx0OwotCi0gIHJhd3B0ciA9ICgoc3RydWN0IGFvdXRfZGF0YV9zdHJ1Y3QgICopIAotCSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBhb3V0X2RhdGFfc3RydWN0ICkpKTsKLQotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgb2xkcmF3cHRyID0gYWJmZC0+dGRhdGEuYW91dF9kYXRhOwotICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSByYXdwdHI7Ci0KLSAgLyogQ29weSB0aGUgY29udGVudHMgb2YgdGhlIG9sZCB0ZGF0YSBzdHJ1Y3QuCi0gICAgIEluIHBhcnRpY3VsYXIsIHdlIHdhbnQgdGhlIHN1YmZvcm1hdCwgc2luY2UgZm9yIGhwdXggaXQgd2FzIHNldCBpbgotICAgICBocDMwMGhwdXguYzpzd2FwX2V4ZWNfaGVhZGVyX2luIGFuZCB3aWxsIGJlIHVzZWQgaW4KLSAgICAgaHAzMDBocHV4LmM6Y2FsbGJhY2suICAqLwotICBpZiAob2xkcmF3cHRyICE9IE5VTEwpCi0gICAgKmFiZmQtPnRkYXRhLmFvdXRfZGF0YSA9ICpvbGRyYXdwdHI7Ci0KLSAgYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkciA9ICZyYXdwdHItPmU7Ci0gICooYWJmZC0+dGRhdGEuYW91dF9kYXRhLT5hLmhkcikgPSAqZXhlY3A7ICAgICAvKiBDb3B5IGluIHRoZSBpbnRlcm5hbF9leGVjCi0JCQkJCQkgICBzdHJ1Y3QgKi8KLSAgZXhlY3AgPSBhYmZkLT50ZGF0YS5hb3V0X2RhdGEtPmEuaGRyOwotCi0gIC8qIFNldCB0aGUgZmlsZSBmbGFncyAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGV4ZWNwLT5hX2Ryc2l6ZSB8fCBleGVjcC0+YV90cnNpemUpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1JFTE9DOwotICAvKiBTZXR0aW5nIG9mIEVYRUNfUCBoYXMgYmVlbiBkZWZlcnJlZCB0byB0aGUgYm90dG9tIG9mIHRoaXMgZnVuY3Rpb24gKi8KLSAgaWYgKGV4ZWNwLT5hX3N5bXMpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19TWU1TIHwgSEFTX0xPQ0FMUzsKLSAgaWYgKE5fRFlOQU1JQygqZXhlY3ApKQotICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0KLQkJCQkJCQkJICAKLSAgaWYgKChleGVjcC0+YV9pbmZvICYgTUZfU1FVRUVaRUQpICE9IDApIC8qIFNxdWVlemVkIGZpbGVzIGFyZW4ndCBzdXBwb3J0ZWQgCi0JCQkJCSAgICAgKHlldCkhICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKChleGVjcC0+YV9pbmZvICYgTUZfSVNfU0wpICE9IDApCS8qIE5vciBhcmUgc2hhcmVkIGxpYnJhcmllcyAqLwotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IFpNQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBEX1BBR0VEIHwgV1BfVEVYVDsKLSAgICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IHpfbWFnaWM7Ci0gICAgfQotICBlbHNlIGlmIChOX01BR0lDICgqZXhlY3ApID09IE5NQUdJQykKLSAgICB7Ci0gICAgICBhYmZkLT5mbGFncyB8PSBXUF9URVhUOwotICAgICAgYWRhdGEgKGFiZmQpLm1hZ2ljID0gbl9tYWdpYzsKLSAgICB9Ci0gIGVsc2UgaWYgKE5fTUFHSUMgKCpleGVjcCkgPT0gT01BR0lDKQotICAgIGFkYXRhIChhYmZkKS5tYWdpYyA9IG9fbWFnaWM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaG91bGQgaGF2ZSBiZWVuIGNoZWNrZWQgd2l0aCBOX0JBRE1BRyBiZWZvcmUgdGhpcyByb3V0aW5lCi0gICAgICAgICB3YXMgY2FsbGVkLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gZXhlY3AtPmFfZW50cnk7Ci0KLSAgb2JqX2FvdXRfc3ltYm9scyAoYWJmZCkgPSAoYW91dF9zeW1ib2xfdHlwZSAqKU5VTEw7Ci0gIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpID0gZXhlY3AtPmFfc3ltcyAvIHNpemVvZiAoc3RydWN0IGV4dGVybmFsX25saXN0KTsKLQotICAvKiBUaGUgZGVmYXVsdCByZWxvY2F0aW9uIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBWNyBVbml4LiAgKi8KLSAgb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpID0gUkVMT0NfU1REX1NJWkU7Ci0KLSAgLyogVGhlIGRlZmF1bHQgc3ltYm9sIGVudHJ5IHNpemUgaXMgdGhhdCBvZiB0cmFkaXRpb25hbCBVbml4LiAqLwotICBvYmpfc3ltYm9sX2VudHJ5X3NpemUgKGFiZmQpID0gRVhURVJOQUxfTkxJU1RfU0laRTsKLQotICBvYmpfYW91dF9leHRlcm5hbF9zeW1zIChhYmZkKSA9IE5VTEw7Ci0gIG9ial9hb3V0X2V4dGVybmFsX3N0cmluZ3MgKGFiZmQpID0gTlVMTDsKLSAgb2JqX2FvdXRfc3ltX2hhc2hlcyAoYWJmZCkgPSBOVUxMOwotCi0gIGlmICghIE5BTUUoYW91dCxtYWtlX3NlY3Rpb25zKSAoYWJmZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5fcmF3X3NpemUgPSBleGVjcC0+YV9kYXRhOwotICBvYmpfYnNzc2VjIChhYmZkKS0+X3Jhd19zaXplID0gZXhlY3AtPmFfYnNzOwotCi0gIG9ial90ZXh0c2VjIChhYmZkKS0+ZmxhZ3MgPQotICAgIChleGVjcC0+YV90cnNpemUgIT0gMAotICAgICA/IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUxPQykKLSAgICAgOiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfQ09ERSB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLSAgb2JqX2RhdGFzZWMgKGFiZmQpLT5mbGFncyA9Ci0gICAgKGV4ZWNwLT5hX2Ryc2l6ZSAhPSAwCi0gICAgID8gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX1JFTE9DKQotICAgICA6IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUykpOwotICBvYmpfYnNzc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0M7Ci0KLSAgcmVzdWx0ID0gKCpjYWxsYmFja190b19yZWFsX29iamVjdF9wKShhYmZkKTsKLQotI2lmIGRlZmluZWQoTUFDSCkgfHwgZGVmaW5lZChTVEFUX0ZPUl9FWEVDKQotICAvKiBUaGUgb3JpZ2luYWwgaGV1cmlzdGljIGRvZXNuJ3Qgd29yayBpbiBzb21lIGltcG9ydGFudCBjYXNlcy4gVGhlCi0gICAqIGEub3V0IGZpbGUgaGFzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXh0IHN0YXJ0IGFkZHJlc3MuIEZvcgotICAgKiBmaWxlcyAobGlrZSBrZXJuZWxzKSBsaW5rZWQgdG8gbm9uLXN0YW5kYXJkIGFkZHJlc3NlcyAobGQgLVR0ZXh0Ci0gICAqIG5ubikgdGhlIGVudHJ5IHBvaW50IG1heSBub3QgYmUgYmV0d2VlbiB0aGUgZGVmYXVsdCB0ZXh0IHN0YXJ0Ci0gICAqIChvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSBhbmQgKG9ial90ZXh0c2VjKGFiZmQpLT52bWEpICsgdGV4dCBzaXplCi0gICAqIFRoaXMgaXMgbm90IGp1c3QgYSBtYWNoIGlzc3VlLiBNYW55IGtlcm5lbHMgYXJlIGxvYWRlZCBhdCBub24KLSAgICogc3RhbmRhcmQgYWRkcmVzc2VzLgotICAgKi8KLSAgewotICAgIHN0cnVjdCBzdGF0IHN0YXRfYnVmOwotICAgIGlmIChhYmZkLT5pb3N0cmVhbSAhPSBOVUxMCi0JJiYgKGFiZmQtPmZsYWdzICYgQkZEX0lOX01FTU9SWSkgPT0gMAotICAgICAgICAmJiAoZnN0YXQoZmlsZW5vKChGSUxFICopIChhYmZkLT5pb3N0cmVhbSkpLCAmc3RhdF9idWYpID09IDApCi0gICAgICAgICYmICgoc3RhdF9idWYuc3RfbW9kZSAmIDAxMTEpICE9IDApKQotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotICB9Ci0jZWxzZSAvKiAhIE1BQ0ggKi8KLSAgLyogTm93IHRoYXQgdGhlIHNlZ21lbnQgYWRkcmVzc2VzIGhhdmUgYmVlbiB3b3JrZWQgb3V0LCB0YWtlIGEgYmV0dGVyCi0gICAgIGd1ZXNzIGF0IHdoZXRoZXIgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZS4gIElmIHRoZSBlbnRyeSBwb2ludAotICAgICBpcyB3aXRoaW4gdGhlIHRleHQgc2VnbWVudCwgYXNzdW1lIGl0IGlzLiAgKFRoaXMgbWFrZXMgZmlsZXMKLSAgICAgZXhlY3V0YWJsZSBldmVuIGlmIHRoZWlyIGVudHJ5IHBvaW50IGFkZHJlc3MgaXMgMCwgYXMgbG9uZyBhcwotICAgICB0aGVpciB0ZXh0IHN0YXJ0cyBhdCB6ZXJvLikKLQotICAgICBBdCBzb21lIHBvaW50IHdlIHNob3VsZCBwcm9iYWJseSBicmVhayBkb3duIGFuZCBzdGF0IHRoZSBmaWxlIGFuZAotICAgICBkZWNsYXJlIGl0IGV4ZWN1dGFibGUgaWYgKG9uZSBvZikgaXRzICd4JyBiaXRzIGFyZSBvbi4uLiAgKi8KLSAgaWYgKChleGVjcC0+YV9lbnRyeSA+PSBvYmpfdGV4dHNlYyhhYmZkKS0+dm1hKSAmJgotICAgICAgKGV4ZWNwLT5hX2VudHJ5IDwgb2JqX3RleHRzZWMoYWJmZCktPnZtYSArIG9ial90ZXh0c2VjKGFiZmQpLT5fcmF3X3NpemUpKQotICAgIGFiZmQtPmZsYWdzIHw9IEVYRUNfUDsKLSNlbmRpZiAvKiBNQUNIICovCi0gIGlmIChyZXN1bHQpCi0gICAgewotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZyZWUgKHJhd3B0cik7Ci0gICAgICBhYmZkLT50ZGF0YS5hb3V0X2RhdGEgPSBvbGRyYXdwdHI7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLU1ZKG9iamVjdF9wKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOyAgICAgIC8qIFJhdyBleGVjIGhlYWRlciBmcm9tIGZpbGUgKi8KLSAgc3RydWN0IGludGVybmFsX2V4ZWMgZXhlYzsgICAgICAgICAgICAvKiBDbGVhbmVkLXVwIGV4ZWMgaGVhZGVyICovCi0gIGNvbnN0IGJmZF90YXJnZXQgKnRhcmdldDsKLQotICBpZiAoYmZkX3JlYWQgKChQVFIpICZleGVjX2J5dGVzLCAxLCBFWEVDX0JZVEVTX1NJWkUsIGFiZmQpCi0gICAgICAhPSBFWEVDX0JZVEVTX1NJWkUpIHsKLSAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGV4ZWMuYV9pbmZvID0gYmZkX2hfZ2V0XzMyIChhYmZkLCBleGVjX2J5dGVzLmVfaW5mbyk7Ci0KLSAgaWYgKE5fQkFETUFHIChleGVjKSkgcmV0dXJuIDA7Ci0jaWZkZWYgTUFDSFRZUEVfT0sKLSAgaWYgKCEoTUFDSFRZUEVfT0sgKE5fTUFDSFRZUEUgKGV4ZWMpKSkpIHJldHVybiAwOwotI2VuZGlmCi0KLSAgTkFNRShhb3V0LHN3YXBfZXhlY19oZWFkZXJfaW4pKGFiZmQsICZleGVjX2J5dGVzLCAmZXhlYyk7Ci0KLSAgdGFyZ2V0ID0gcmlzY2l4X3NvbWVfYW91dF9vYmplY3RfcCAoYWJmZCwgJmV4ZWMsIE1ZKGNhbGxiYWNrKSk7Ci0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9yczYwMDAtY29yZS5jIGIvYmZkL3JzNjAwMC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDU1NWYuLjAwMDAwMDAKLS0tIGEvYmZkL3JzNjAwMC1jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLyogSUJNIFJTLzYwMDAgIlhDT0ZGIiBiYWNrLWVuZCBmb3IgQkZELgotICAgQ29weXJpZ2h0IDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEZJWE1FOiBDYW4gc29tZW9uZSBwcm92aWRlIGEgdHJhbnNsaXRlcmF0aW9uIG9mIHRoaXMgbmFtZSBpbnRvIEFTQ0lJPwotICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFycyBjYXVzZWQgYSBjb21waWxlciB3YXJuaW5nIG9uIEhJVVggKHNvIEkgcmVwbGFjZWQKLSAgIHRoZW0gd2l0aCBvY3RhbCBlc2NhcGVzKSwgYW5kIGlzbid0IHVzZWZ1bCB3aXRob3V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdAotICAgY2hhcmFjdGVyIHNldCBpdCBpcy4KLSAgIFdyaXR0ZW4gYnkgTWV0aW4gRy4gT3ppc2lrLCBNaW1pIFBoXDM3M1wzNjRuZy1UaFwzNDVvIFZcMzY1LCAKLSAgICAgYW5kIEpvaG4gR2lsbW9yZS4KLSAgIEFyY2hpdmUgc3VwcG9ydCBmcm9tIERhbW9uIEEuIFBlcm1lemVsLgotICAgQ29udHJpYnV0ZWQgYnkgSUJNIENvcnBvcmF0aW9uIGFuZCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHBvcnQgY3VycmVudGx5IG9ubHkgaGFuZGxlcyByZWFkaW5nIG9iamVjdCBmaWxlcywgZXhjZXB0IHdoZW4KLSAgIGNvbXBpbGVkIG9uIGFuIFJTLzYwMDAgaG9zdC4gIC0tIG5vIGFyY2hpdmUgc3VwcG9ydCwgbm8gY29yZSBmaWxlcy4KLSAgIEluIGFsbCBjYXNlcywgaXQgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nLgotCi0gICBGSVhNRW1nbyBjb21tZW50cyBhcmUgbGVmdCBmcm9tIE1ldGluIE96aXNpaydzIG9yaWdpbmFsIHBvcnQuCi0KLSAgIFRoaXMgaXMgaW4gYSBzZXBhcmF0ZSBmaWxlIGZyb20gY29mZi1yczYwMDAuYywgYmVjYXVzZSBpdCBpbmNsdWRlcwotICAgc3lzdGVtIGluY2x1ZGUgZmlsZXMgdGhhdCBjb25mbGljdCB3aXRoIGNvZmYvcnM2MDAwLmguCi0gICovCi0KLS8qIEludGVybmFsY29mZi5oIGFuZCBjb2ZmY29kZS5oIG1vZGlmeSB0aGVtc2VsdmVzIGJhc2VkIG9uIHRoaXMgZmxhZy4gICovCi0jZGVmaW5lIFJTNjAwMENPRkZfQyAxCi0KLS8qIFRoZSBBSVggNC4xIGtlcm5lbCBpcyBvYnZpb3VzbHkgY29tcGlsZWQgd2l0aCAtRF9MT05HX0xPTkcsIHNvCi0gICB3ZSBoYXZlIHRvIGRlZmluZSBfTE9OR19MT05HIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBnY2MgdG8gZ2V0IHRoZQotICAgcHJvcGVyIGFsaWdubWVudHMgaW4gdGhlIHVzZXIgc3RydWN0dXJlLiAgKi8KLSNpZiBkZWZpbmVkKF9BSVg0MSkgJiYgIWRlZmluZWQoX0xPTkdfTE9ORykKLSNkZWZpbmUgX0xPTkdfTE9ORwotI2VuZGlmCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2lmZGVmIEFJWF9DT1JFCi0KLS8qIEFPVVRIRFIgaXMgZGVmaW5lZCBieSB0aGUgYWJvdmUuICBXZSBuZWVkIGFub3RoZXIgZGVmbiBvZiBpdCwgZnJvbSB0aGUKLSAgIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgUHVudCB0aGUgb2xkIG9uZSBhbmQgZ2V0IHVzIGEgbmV3IG5hbWUgZm9yIHRoZQotICAgdHlwZWRlZiBpbiB0aGUgc3lzdGVtIGluY2x1ZGUgZmlsZXMuICAqLwotI2lmZGVmIEFPVVRIRFIKLSN1bmRlZiBBT1VUSERSCi0jZW5kaWYKLSNkZWZpbmUJQU9VVEhEUglzZWNvbmRfQU9VVEhEUgotCi0jdW5kZWYJU0NOSERSCi0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKglTdXBwb3J0IGZvciBjb3JlIGZpbGUgc3R1ZmYuLiAJCQkJCSAgICAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpbmNsdWRlIDxzeXMvdXNlci5oPgotI2luY2x1ZGUgPHN5cy9sZHIuaD4KLSNpbmNsdWRlIDxzeXMvY29yZS5oPgotCi0KLS8qIE51bWJlciBvZiBzcGVjaWFsIHB1cnBvc2UgcmVnaXN0ZXJzIHN1cHBvcnRlZCBieSBnZGIuICBUaGlzIHZhbHVlCi0gICBzaG91bGQgbWF0Y2ggYHRtLmgnIGluIGdkYiBkaXJlY3RvcnkuICBDbGVhbiB0aGlzIG1lc3MgdXAgYW5kIHVzZQotICAgdGhlIG1hY3JvcyBpbiBzeXMvcmVnLmguICBGSVhNRW1nby4gKi8KLQotI2RlZmluZQlOVU1fT0ZfU1BFQ19SRUdTICA3Ci0KLSNkZWZpbmUJY29yZV9oZHIoYmZkKQkJKCgoUnM2a0NvckRhdGEqKShiZmQtPnRkYXRhLmFueSkpLT5oZHIpCi0KLS8qIEFJWCA0LjEgQ2hhbmdlZCB0aGUgbmFtZXMgYW5kIGxvY2F0aW9ucyBvZiBhIGZldyBpdGVtcyBpbiB0aGUgY29yZSBmaWxlLAotICAgdGhpcyBzZWVtcyB0byBiZSB0aGUgcXVpY2tlc3QgZWFzaWV0IHdheSB0byBkZWFsIHdpdGggaXQuIAotCi0gICBOb3RlIGhvd2V2ZXIgdGhhdCBlbmNvZGluZyBtYWdpYyBhZGRyZXNzZXMgKFNUQUNLX0VORF9BRERSKSBpcyBnb2luZwotICAgdG8gYmUgX3ZlcnlfIGZyYWdpbGUuICBCdXQgSSBkb24ndCBzZWUgYW55IGVhc3kgd2F5IHRvIGdldCB0aGF0IGluZm8KLSAgIHJpZ2h0IG5vdy4gICovCi0jaWZkZWYgQ09SRV9WRVJTSU9OXzEKLSNkZWZpbmUgQ09SRV9EQVRBX1NJWkVfRklFTEQgY191LlVfZHNpemUKLSNkZWZpbmUgQ09SRV9DT01NX0ZJRUxEIGNfdS5VX2NvbW0KLSNkZWZpbmUgU0FWRV9GSUVMRCBjX21zdAotI2RlZmluZQlTVEFDS19FTkRfQUREUiAweDJmZjIzMDAwCi0jZWxzZQotI2RlZmluZSBDT1JFX0RBVEFfU0laRV9GSUVMRCBjX3UudV9kc2l6ZQotI2RlZmluZSBDT1JFX0NPTU1fRklFTEQgY191LnVfY29tbQotI2RlZmluZSBTQVZFX0ZJRUxEIGNfdS51X3NhdmUKLSNkZWZpbmUJU1RBQ0tfRU5EX0FERFIgMHgyZmY4MDAwMAotI2VuZGlmCi0KLS8qIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIGJmZCdzIHRkYXRhICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBjb3JlX2R1bXAgaGRyOwkJLyogY29yZSBmaWxlIGhlYWRlciAqLwotfSBSczZrQ29yRGF0YTsKLQotc3RhdGljIGFzZWN0aW9uICptYWtlX2JmZF9hc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBmbGFnd29yZCwKLQkJCQkJICAgIGJmZF9zaXplX3R5cGUsIGJmZF92bWEsIGZpbGVfcHRyKSk7Ci0KLXN0YXRpYyBhc2VjdGlvbiAqCi1tYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgbmFtZSwgZmxhZ3MsIF9yYXdfc2l6ZSwgdm1hLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGZpbGVfcHRyIGZpbGVwb3M7Ci17Ci0gIGFzZWN0aW9uICphc2VjdDsKLQotICBhc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKTsKLSAgaWYgKCFhc2VjdCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBhc2VjdC0+ZmxhZ3MgPSBmbGFnczsKLSAgYXNlY3QtPl9yYXdfc2l6ZSA9IF9yYXdfc2l6ZTsKLSAgYXNlY3QtPnZtYSA9IHZtYTsKLSAgYXNlY3QtPmZpbGVwb3MgPSBmaWxlcG9zOwotICBhc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gODsKLQotICByZXR1cm4gYXNlY3Q7Ci19Ci0KLS8qIERlY2lkZSBpZiBhIGdpdmVuIGJmZCByZXByZXNlbnRzIGEgYGNvcmUnIGZpbGUgb3Igbm90LiBUaGVyZSByZWFsbHkgaXMgbm8KLSAgIG1hZ2ljIG51bWJlciBvciBhbnl0aGluZyBsaWtlLCBpbiByczYwMDBjb2ZmLiAqLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXJzNjAwMGNvZmZfY29yZV9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBjb3JlX2R1bXAgY29yZWRhdGE7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gIGJmZF9zaXplX3R5cGUgbnJlYWQ7Ci0gIGNoYXIgKnRtcHB0cjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQotICAgIHJldHVybiBOVUxMOwotCi0gIG5yZWFkID0gYmZkX3JlYWQgKCZjb3JlZGF0YSwgMSwgc2l6ZW9mIChzdHJ1Y3QgY29yZV9kdW1wKSwgYWJmZCk7Ci0gIGlmIChucmVhZCAhPSBzaXplb2YgKHN0cnVjdCBjb3JlX2R1bXApKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJZiB0aGUgY29yZSBmaWxlIHVsaW1pdCBpcyB0b28gc21hbGwsIHRoZSBzeXN0ZW0gd2lsbCBmaXJzdAotICAgICBvbWl0IHRoZSBkYXRhIHNlZ21lbnQsIHRoZW4gb21pdCB0aGUgc3RhY2ssIHRoZW4gZGVjbGluZSB0bwotICAgICBkdW1wIGNvcmUgYWx0b2dldGhlciAoYXMgZmFyIGFzIEkga25vdyBVQkxPQ0tfVkFMSUQgYW5kIExFX1ZBTElECi0gICAgIGFyZSBhbHdheXMgc2V0KSAodGhpcyBpcyBiYXNlZCBvbiBleHBlcmltZW50YXRpb24gb24gQUlYIDMuMikuCi0gICAgIE5vdywgdGhlIHRoaW5nIGlzIHRoYXQgR0RCIHVzZXJzIHdpbGwgYmUgc3VycHJpc2VkCi0gICAgIGlmIHNlZ21lbnRzIGp1c3Qgc2lsZW50bHkgZG9uJ3QgYXBwZWFyICh3ZWxsLCBtYXliZSB0aGV5IHdvdWxkCi0gICAgIHRoaW5rIHRvIGNoZWNrICJpbmZvIGZpbGVzIiwgSSBkb24ndCBrbm93KS4KLQotICAgICBGb3IgdGhlIGRhdGEgc2VnbWVudCwgd2UgaGF2ZSBubyBjaG9pY2UgYnV0IHRvIGtlZXAgZ29pbmcgaWYgaXQncwotICAgICBub3QgdGhlcmUsIHNpbmNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIG5vdCB0byBkdW1wIGl0IChyZWdhcmRsZXNzCi0gICAgIG9mIHRoZSB1bGltaXQsIGl0J3MgYmFzZWQgb24gU0FfRlVMTERVTVApLiAgQnV0IGZvciB0aGUgc3RhY2sgc2VnbWVudCwKLSAgICAgaWYgaXQncyBub3QgdGhlcmUsIHdlIHJlZnVzZSB0byBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhpcyBjb3JlCi0gICAgIGZpbGUuICBUaGUgdXNlZnVsbmVzcyBvZiBhIGNvcmUgZHVtcCB3aXRob3V0IGEgc3RhY2sgc2VnbWVudCBpcyBwcmV0dHkKLSAgICAgbGltaXRlZCBhbnl3YXkuICAqLwotICAgICAKLSAgaWYgKCEoY29yZWRhdGEuY19mbGFnICYgVUJMT0NLX1ZBTElEKQotICAgICAgfHwgIShjb3JlZGF0YS5jX2ZsYWcgJiBMRV9WQUxJRCkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCEoY29yZWRhdGEuY19mbGFnICYgVVNUQUNLX1ZBTElEKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIERvbid0IGNoZWNrIHRoZSBjb3JlIGZpbGUgc2l6ZSBmb3IgYSBmdWxsIGNvcmUsIEFJWCA0LjEgaW5jbHVkZXMKLSAgICAgYWRkaXRpb25hbCBzaGFyZWQgbGlicmFyeSBzZWN0aW9ucyBpbiBhIGZ1bGwgY29yZS4gICovCi0gIGlmICghKGNvcmVkYXRhLmNfZmxhZyAmIChGVUxMX0NPUkUgfCBDT1JFX1RSVU5DKSkKLSAgICAgICYmICgoYmZkX3ZtYSljb3JlZGF0YS5jX3N0YWNrICsgY29yZWRhdGEuY19zaXplKSAhPSBzdGF0YnVmLnN0X3NpemUpCi0gICAgewotICAgICAgLyogSWYgdGhlIHNpemUgaXMgd3JvbmcsIGl0IG1lYW5zIHdlJ3JlIG1pc2ludGVycHJldGluZyBzb21ldGhpbmcuICAqLwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogU2FuaXR5IGNoZWNrIG9uIHRoZSBjX3RhYiBmaWVsZC4gICovCi0gIGlmICgodV9sb25nKSBjb3JlZGF0YS5jX3RhYiA8IHNpemVvZiBjb3JlZGF0YSB8fAotICAgICAgKHVfbG9uZykgY29yZWRhdGEuY190YWIgPj0gc3RhdGJ1Zi5zdF9zaXplIHx8Ci0gICAgICAobG9uZykgY29yZWRhdGEuY190YWIgPj0gKGxvbmcpY29yZWRhdGEuY19zdGFjaykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBJc3N1ZSB3YXJuaW5nIGlmIHRoZSBjb3JlIGZpbGUgd2FzIHRydW5jYXRlZCBkdXJpbmcgd3JpdGluZy4gICovCi0gIGlmIChjb3JlZGF0YS5jX2ZsYWcgJiBDT1JFX1RSVU5DKQotICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IHdhcm5pbmcgY29yZSBmaWxlIHRydW5jYXRlZCIpLAotCQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIC8qIEFsbG9jYXRlIGNvcmUgZmlsZSBoZWFkZXIuICAqLwotICB0bXBwdHIgPSAoY2hhciopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoUnM2a0NvckRhdGEpKTsKLSAgaWYgKCF0bXBwdHIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gICAgICAKLSAgc2V0X3RkYXRhIChhYmZkLCB0bXBwdHIpOwotCi0gIC8qIENvcHkgY29yZSBmaWxlIGhlYWRlci4gICovCi0gIGNvcmVfaGRyIChhYmZkKSA9IGNvcmVkYXRhOwotCi0gIC8qIC5zdGFjayBzZWN0aW9uLiAqLwotICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwKLSAgCQkJICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMsCi0JCQkgIChiZmRfc2l6ZV90eXBlKSBjb3JlZGF0YS5jX3NpemUsCi0JCQkgIChiZmRfdm1hKSAoU1RBQ0tfRU5EX0FERFIgLSBjb3JlZGF0YS5jX3NpemUpLAotCQkJICAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfc3RhY2spKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIC5yZWcgc2VjdGlvbiBmb3IgR1BScyBhbmQgc3BlY2lhbCByZWdpc3RlcnMuICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIucmVnIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgKCgzMiArIE5VTV9PRl9TUEVDX1JFR1MpICogNCksCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoZmlsZV9wdHIpICgoY2hhciAqKSAmY29yZWRhdGEuU0FWRV9GSUVMRAotCQkJCSAgICAgIC0gKGNoYXIgKikgJmNvcmVkYXRhKSkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogLnJlZzIgc2VjdGlvbiBmb3IgRlBScyAoZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzKS4gKi8KLSAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5yZWcyIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgOCAqIDMyLAkvKiAzMiBGUFJzLiAqLwotCQkJICAoYmZkX3ZtYSkgMCwKLQkJCSAgKGZpbGVfcHRyKSAoKGNoYXIgKikgJmNvcmVkYXRhLlNBVkVfRklFTEQuZnByWzBdCi0JCQkJICAgICAgLSAoY2hhciAqKSAmY29yZWRhdGEpKSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiAubGRpbmZvIHNlY3Rpb24uCi0gICAgIFRvIGFjdHVhbGx5IGZpbmQgb3V0IGhvdyBsb25nIHRoaXMgc2VjdGlvbiBpcyBpbiB0aGlzIHBhcnRpY3VsYXIKLSAgICAgY29yZSBkdW1wIHdvdWxkIHJlcXVpcmUgZ29pbmcgZG93biB0aGUgd2hvbGUgbGlzdCBvZiBzdHJ1Y3QgbGRfaW5mbydzLgotICAgICBTZWUgaWYgd2UgY2FuIGp1c3QgZmFrZSBpdC4gICovCi0gIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIubGRpbmZvIiwKLSAgCQkJICBTRUNfSEFTX0NPTlRFTlRTLAotCQkJICAoYmZkX3NpemVfdHlwZSkgMHg3ZmZmZmZmZiwKLQkJCSAgKGJmZF92bWEpIDAsCi0JCQkgIChmaWxlX3B0cikgY29yZWRhdGEuY190YWIpKQotICAgIHJldHVybiBOVUxMOwotCi0jaWZuZGVmIENPUkVfVkVSU0lPTl8xCi0gIC8qIC5kYXRhIHNlY3Rpb24gaWYgcHJlc2VudC4KLSAgICAgQUlYIDMgZHVtcHMgdGhlIGNvbXBsZXRlIGRhdGEgc2VjdGlvbiBhbmQgc2V0cyBGVUxMX0NPUkUgaWYgdGhlCi0gICAgIHVsaW1pdCBpcyBsYXJnZSBlbm91Z2gsIG90aGVyd2lzZSB0aGUgZGF0YSBzZWN0aW9uIGlzIG9taXR0ZWQuCi0gICAgIEFJWCA0IHNldHMgRlVMTF9DT1JFIGV2ZW4gaWYgdGhlIGNvcmUgZmlsZSBpcyB0cnVuY2F0ZWQsIHdlIGhhdmUKLSAgICAgdG8gZXhhbWluZSBjb3JlZGF0YS5jX2RhdGFzaXplIGJlbG93IHRvIGZpbmQgb3V0IHRoZSBhY3R1YWwgc2l6ZSBvZgotICAgICB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0gIGlmIChjb3JlZGF0YS5jX2ZsYWcgJiBGVUxMX0NPUkUpCi0gICAgewotICAgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCSAgICAgIFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCSAgICAgIChiZmRfc2l6ZV90eXBlKSBjb3JlZGF0YS5DT1JFX0RBVEFfU0laRV9GSUVMRCwKLQkJCSAgICAgIChiZmRfdm1hKQotCQkJCUNEQVRBX0FERFIgKGNvcmVkYXRhLkNPUkVfREFUQV9TSVpFX0ZJRUxEKSwKLQkJCSAgICAgIChmaWxlX3B0cikgY29yZWRhdGEuY19zdGFjayArIGNvcmVkYXRhLmNfc2l6ZSkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBDT1JFX1ZFUlNJT05fMQotICAvKiBBSVggNCBhZGRzIGRhdGEgc2VjdGlvbnMgZnJvbSBsb2FkZWQgb2JqZWN0cyB0byB0aGUgY29yZSBmaWxlLAotICAgICB3aGljaCBjYW4gYmUgZm91bmQgYnkgZXhhbWluaW5nIGxkaW5mbywgYW5kIGFub255bW91c2x5IG1tYXBwZWQKLSAgICAgcmVnaW9ucy4gICovCi0gIHsKLSAgICBzdHJ1Y3QgbGRfaW5mbyBsZGluZm87Ci0gICAgYmZkX3NpemVfdHlwZSBsZGluZm9fc2l6ZTsKLSAgICBmaWxlX3B0ciBsZGluZm9fb2Zmc2V0ID0gKGZpbGVfcHRyKSBjb3JlZGF0YS5jX3RhYjsKLQotICAgIC8qIC5kYXRhIHNlY3Rpb24gZnJvbSBleGVjdXRhYmxlLiAgKi8KLSAgICBpZiAoY29yZWRhdGEuY19kYXRhc2l6ZSkKLSAgICAgIHsKLQlpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLmRhdGEiLAotCQkJCVNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCQkoYmZkX3NpemVfdHlwZSkgY29yZWRhdGEuY19kYXRhc2l6ZSwKLQkJCQkoYmZkX3ZtYSkKLQkJCQkgIENEQVRBX0FERFIgKGNvcmVkYXRhLkNPUkVfREFUQV9TSVpFX0ZJRUxEKSwKLQkJCQkoZmlsZV9wdHIpIGNvcmVkYXRhLmNfZGF0YSkpCi0JICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLQotICAgIC8qIC5kYXRhIHNlY3Rpb25zIGZyb20gbG9hZGVkIG9iamVjdHMuICAqLwotICAgIGxkaW5mb19zaXplID0gKGNoYXIgKikgJmxkaW5mby5sZGluZm9fZmlsZW5hbWVbMF0KLQkJICAtIChjaGFyICopICZsZGluZm8ubGRpbmZvX25leHQ7Ci0gICAgd2hpbGUgKDEpCi0gICAgICB7Ci0JaWYgKGJmZF9zZWVrIChhYmZkLCBsZGluZm9fb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBOVUxMOwotCWlmIChiZmRfcmVhZCAoJmxkaW5mbywgbGRpbmZvX3NpemUsIDEsIGFiZmQpICE9IGxkaW5mb19zaXplKQotCSAgcmV0dXJuIE5VTEw7Ci0JaWYgKGxkaW5mby5sZGluZm9fY29yZSkKLQkgIHsKLQkgICAgaWYgKCFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgIi5kYXRhIiwKLQkJCQkgICAgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTLAotCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgbGRpbmZvLmxkaW5mb19kYXRhc2l6ZSwKLQkJCQkgICAgKGJmZF92bWEpIGxkaW5mby5sZGluZm9fZGF0YW9yZywKLQkJCQkgICAgKGZpbGVfcHRyKSBsZGluZm8ubGRpbmZvX2NvcmUpKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgfQotCWlmIChsZGluZm8ubGRpbmZvX25leHQgPT0gMCkKLQkgIGJyZWFrOwotCWxkaW5mb19vZmZzZXQgKz0gbGRpbmZvLmxkaW5mb19uZXh0OwotICAgICAgfQotCi0gICAgLyogLnZtZGF0YSBzZWN0aW9ucyBmcm9tIGFub255bW91c2x5IG1tYXBwZWQgcmVnaW9ucy4gICovCi0gICAgaWYgKGNvcmVkYXRhLmNfdm1yZWdpb25zKQotICAgICAgewotCWludCBpOwotCi0JaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGNvcmVkYXRhLmNfdm1tLCBTRUVLX1NFVCkgIT0gMCkKLQkgIHJldHVybiBOVUxMOwotCi0JZm9yIChpID0gMDsgaSA8IGNvcmVkYXRhLmNfdm1yZWdpb25zOyBpKyspCi0JICB7Ci0JICAgIHN0cnVjdCB2bV9pbmZvIHZtaW5mbzsKLQotCSAgICBpZiAoYmZkX3JlYWQgKCZ2bWluZm8sIHNpemVvZiAodm1pbmZvKSwgMSwgYWJmZCkgIT0gc2l6ZW9mICh2bWluZm8pKQotCSAgICAgIHJldHVybiBOVUxMOwotCSAgICBpZiAodm1pbmZvLnZtaW5mb19vZmZzZXQpCi0JICAgICAgewotCQlpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnZtZGF0YSIsCi0JCQkJCVNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUywKLQkJCQkJKGJmZF9zaXplX3R5cGUpIHZtaW5mby52bWluZm9fc2l6ZSwKLQkJCQkJKGJmZF92bWEpIHZtaW5mby52bWluZm9fYWRkciwKLQkJCQkJKGZpbGVfcHRyKSB2bWluZm8udm1pbmZvX29mZnNldCkpCi0JCSAgcmV0dXJuIE5VTEw7Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gYWJmZC0+eHZlYzsJCQkJLyogdGhpcyBpcyBnYXJiYWdlIGZvciBub3cuICovCi19Ci0KLQotCi0vKiByZXR1cm4gYHRydWUnIGlmIGdpdmVuIGNvcmUgaXMgZnJvbSB0aGUgZ2l2ZW4gZXhlY3V0YWJsZS4uICovCi1ib29sZWFuCi1yczYwMDBjb2ZmX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkOwotICAgICBiZmQgKmV4ZWNfYmZkOwotewotICBzdHJ1Y3QgY29yZV9kdW1wIGNvcmVkYXRhOwotICBzdHJ1Y3QgbGRfaW5mbyBsZGluZm87Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgY2hhciAqcGF0aCwgKnM7Ci0gIHNpemVfdCBhbGxvYzsKLSAgY29uc3QgY2hhciAqc3RyMSwgKnN0cjI7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmIChiZmRfc2VlayAoY29yZV9iZmQsIDAsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAoJmNvcmVkYXRhLCBzaXplb2YgY29yZWRhdGEsIDEsIGNvcmVfYmZkKSAhPSBzaXplb2YgY29yZWRhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfc2VlayAoY29yZV9iZmQsIChsb25nKSBjb3JlZGF0YS5jX3RhYiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNpemUgPSAoY2hhciAqKSAmbGRpbmZvLmxkaW5mb19maWxlbmFtZVswXSAtIChjaGFyICopICZsZGluZm8ubGRpbmZvX25leHQ7Ci0gIGlmIChiZmRfcmVhZCAoJmxkaW5mbywgc2l6ZSwgMSwgY29yZV9iZmQpICE9IHNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGFsbG9jID0gMTAwOwotICBwYXRoID0gYmZkX21hbGxvYyAoYWxsb2MpOwotICBpZiAocGF0aCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgcyA9IHBhdGg7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkIChzLCAxLCAxLCBjb3JlX2JmZCkgIT0gMSkKLQl7Ci0JICBmcmVlIChwYXRoKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoKnMgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgICsrczsKLSAgICAgIGlmIChzID09IHBhdGggKyBhbGxvYykKLQl7Ci0JICBjaGFyICpuOwotCi0JICBhbGxvYyAqPSAyOwotCSAgbiA9IGJmZF9yZWFsbG9jIChwYXRoLCBhbGxvYyk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZSAocGF0aCk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBzID0gbiArIChwYXRoIC0gcyk7Ci0JICBwYXRoID0gbjsKLQl9Ci0gICAgfQotICAKLSAgc3RyMSA9IHN0cnJjaHIgKHBhdGgsICcvJyk7Ci0gIHN0cjIgPSBzdHJyY2hyIChleGVjX2JmZC0+ZmlsZW5hbWUsICcvJyk7Ci0KLSAgLyogc3RlcCBvdmVyIGNoYXJhY3RlciAnLycgKi8KLSAgc3RyMSA9IHN0cjEgIT0gTlVMTCA/IHN0cjEgKyAxIDogcGF0aDsKLSAgc3RyMiA9IHN0cjIgIT0gTlVMTCA/IHN0cjIgKyAxIDogZXhlY19iZmQtPmZpbGVuYW1lOwotCi0gIGlmIChzdHJjbXAgKHN0cjEsIHN0cjIpID09IDApCi0gICAgcmV0ID0gdHJ1ZTsKLSAgZWxzZQotICAgIHJldCA9IGZhbHNlOwotCi0gIGZyZWUgKHBhdGgpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLWNoYXIgKgotcnM2MDAwY29mZl9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbSA9IGNvcmVfaGRyIChhYmZkKS5DT1JFX0NPTU1fRklFTEQ7Ci0gIGlmICgqY29tKQotICAgIHJldHVybiBjb207Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1yczYwMDBjb2ZmX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gY29yZV9oZHIgKGFiZmQpLmNfc2lnbm87Ci19Ci0KLQotYm9vbGVhbgotcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgICBpZiAoY291bnQgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgIC8qIFJlYWRpbmcgYSBjb3JlIGZpbGUncyBzZWN0aW9ucyB3aWxsIGJlIHNsaWdodGx5IGRpZmZlcmVudC4gRm9yIHRoZQotICAgICAgIHJlc3Qgb2YgdGhlbSB3ZSBjYW4gdXNlIGJmZF9nZW5lcmljX2dldF9zZWN0aW9uX2NvbnRlbnRzICgpIEkgc3VwcG9zZS4gKi8KLSAgICAvKiBNYWtlIHN1cmUgdGhpcyByb3V0aW5lIHdvcmtzIGZvciBhbnkgYmZkIGFuZCBhbnkgc2VjdGlvbi4gRklYTUVtZ28uICovCi0KLSAgICBpZiAoYWJmZC0+Zm9ybWF0ID09IGJmZF9jb3JlICYmIHN0cmNtcCAoc2VjdGlvbi0+bmFtZSwgIi5yZWciKSA9PSAwKSB7Ci0KLSAgICAgIHN0cnVjdCBtc3RzYXZlIG1zdGF0dXM7Ci0gICAgICBpbnQgICAgcmVnb2Zmc2V0ID0gKGNoYXIqKSZtc3RhdHVzLmdwclswXSAtIChjaGFyKikmbXN0YXR1czsKLQotICAgICAgLyogQXNzZXJ0IHRoYXQgdGhlIG9ubHkgd2F5IHRoaXMgY29kZSB3aWxsIGJlIGV4ZWN1dGVkIGlzIHJlYWRpbmcgdGhlCi0gICAgICAgICB3aG9sZSBzZWN0aW9uLiAqLwotICAgICAgaWYgKG9mZnNldCB8fCBjb3VudCAhPSAoc2l6ZW9mKG1zdGF0dXMuZ3ByKSArICg0ICogTlVNX09GX1NQRUNfUkVHUykpKQotICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgIChfKCJFUlJPUiEgaW4gcnM2MDAwY29mZl9nZXRfc2VjdGlvbl9jb250ZW50cygpXG4iKSk7Ci0KLSAgICAgIC8qIGZvciBgLnJlZycgc2VjdGlvbiwgYGZpbGVwb3MnIGlzIGEgcG9pbnRlciB0byB0aGUgYG1zdHNhdmUnIHN0cnVjdHVyZQotICAgICAgICAgaW4gdGhlIGNvcmUgZmlsZS4gKi8KLQotICAgICAgLyogcmVhZCBHUFIncyBpbnRvIHRoZSBsb2NhdGlvbi4gKi8KLSAgICAgIGlmICggYmZkX3NlZWsoYWJmZCwgc2VjdGlvbi0+ZmlsZXBvcyArIHJlZ29mZnNldCwgU0VFS19TRVQpID09IC0xCi0JfHwgYmZkX3JlYWQobG9jYXRpb24sIHNpemVvZiAobXN0YXR1cy5ncHIpLCAxLCBhYmZkKSAhPSBzaXplb2YgKG1zdGF0dXMuZ3ByKSkKLQlyZXR1cm4gKGZhbHNlKTsgLyogb24gZXJyb3IgKi8KLQotICAgICAgLyogaW5jcmVtZW50IGxvY2F0aW9uIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc3BlY2lhbCByZWdpc3RlcnMgaW4gdGhlIHNlY3Rpb24sCi0gICAgICAgICByZXNldCByZWdpc3RlciBvZmZzZXQgdmFsdWUgdG8gdGhlIGJlZ2lubmluZyBvZiBmaXJzdCBzcGVjaWFsIHJlZ2lzdGVyCi0JIGluIG1zdHNhdmUgc3RydWN0dXJlLCBhbmQgcmVhZCBzcGVjaWFsIHJlZ2lzdGVycy4gKi8KLQotICAgICAgbG9jYXRpb24gPSAoUFRSKSAoKGNoYXIqKWxvY2F0aW9uICsgc2l6ZW9mIChtc3RhdHVzLmdwcikpOwotICAgICAgcmVnb2Zmc2V0ID0gKGNoYXIqKSZtc3RhdHVzLmlhciAtIChjaGFyKikmbXN0YXR1czsKLQotICAgICAgaWYgKCBiZmRfc2VlayhhYmZkLCBzZWN0aW9uLT5maWxlcG9zICsgcmVnb2Zmc2V0LCBTRUVLX1NFVCkgPT0gLTEKLQl8fCBiZmRfcmVhZChsb2NhdGlvbiwgNCAqIE5VTV9PRl9TUEVDX1JFR1MsIDEsIGFiZmQpICE9IAotCQkJCQkJCTQgKiBOVU1fT0ZfU1BFQ19SRUdTKQotCXJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLwotICAgICAgCi0gICAgICAvKiBpbmNyZW1lbnQgbG9jYXRpb24gYWRkcmVzcywgYW5kIHJlYWQgdGhlIHNwZWNpYWwgcmVnaXN0ZXJzLi4gKi8KLSAgICAgIC8qIEZJWE1FbWdvICovCi0gICAgICByZXR1cm4gKHRydWUpOwotICAgIH0KLQotICAgIC8qIGVsc2UsIHVzZSBkZWZhdWx0IGJmZCBzZWN0aW9uIGNvbnRlbnQgdHJhbnNmZXIuICovCi0gICAgZWxzZQotICAgICAgcmV0dXJuIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50cyAKLSAgICAgIAkJCShhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCk7Ci19Ci0KLSNlbmRpZiAvKiBBSVhfQ09SRSAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NjbzUtY29yZS5jIGIvYmZkL3NjbzUtY29yZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTBjOGYxLi4wMDAwMDAwCi0tLSBhL2JmZC9zY281LWNvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKiBCRkQgYmFjayBlbmQgZm9yIFNDTzUgY29yZSBmaWxlcyAoVS1hcmVhIGFuZCByYXcgc2VjdGlvbnMpCi0gICBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSm91a2UgTnVtYW4gPGpudW1hbkBoaXNjb20ubmw+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIgICAgICAgICAgIC8qIEJGRCBhLm91dCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4gICAgICAgICAgIC8qIEFmdGVyIGEub3V0LmggICovCi0jaW5jbHVkZSA8c3lzL3BhY2Nlc3MuaD4KLSNpbmNsdWRlIDxzeXMvcmVnaW9uLmg+Ci0KLXN0cnVjdCBzY281X2NvcmVfc3RydWN0Ci17Ci0gIHN0cnVjdCB1c2VyIHU7Ci19OwotCi0vKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGJmZF9zaXplX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfdm1hLCBmaWxlX3B0cikpOwotc3RhdGljIGFzeW1ib2wgKnNjbzVfY29yZV9tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHN0cnVjdCB1c2VyICpyZWFkX3VhcmVhIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLWNvbnN0IGJmZF90YXJnZXQgKnNjbzVfY29yZV9maWxlX3AgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1jaGFyICpzY281X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1pbnQgc2NvNV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1ib29sZWFuIHNjbzVfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIFBBUkFNUyAoKGJmZCAqY29yZV9iZmQsCi0JCQkJCQkgICAgIGJmZCAqZXhlY19iZmQpKTsKLXN0YXRpYyB2b2lkIHN3YXBfYWJvcnQgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgYXNlY3Rpb24gKgotbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsIG5hbWUsIGZsYWdzLCBfcmF3X3NpemUsIHZtYSwgZmlsZXBvcykKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgYmZkX3NpemVfdHlwZSBfcmF3X3NpemU7Ci0gICAgIGJmZF92bWEgdm1hOwotICAgICBmaWxlX3B0ciBmaWxlcG9zOwotewotICBhc2VjdGlvbiAqYXNlY3Q7Ci0KLSAgYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmFtZSk7Ci0gIGlmICghYXNlY3QpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGFzZWN0LT5mbGFncyA9IGZsYWdzOwotICBhc2VjdC0+X3Jhd19zaXplID0gX3Jhd19zaXplOwotICBhc2VjdC0+dm1hID0gdm1hOwotICBhc2VjdC0+ZmlsZXBvcyA9IGZpbGVwb3M7Ci0gIGFzZWN0LT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIHJldHVybiBhc2VjdDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotc2NvNV9jb3JlX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0gCi1zdGF0aWMgc3RydWN0IHVzZXIgKgotcmVhZF91YXJlYShhYmZkLCBmaWxlcG9zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBmaWxlcG9zOwotCi17Ci0gIHN0cnVjdCBzY281X2NvcmVfc3RydWN0ICpyYXdwdHI7Ci0KLSAgcmF3cHRyID0gKChzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCAqKQotCSAgICBiZmRfem1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2NvNV9jb3JlX3N0cnVjdCkpKTsKLSAgaWYgKHJhd3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhID0gcmF3cHRyOwotCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIGZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZyYXdwdHItPnUsIDEsIHNpemVvZiByYXdwdHItPnUsIGFiZmQpCi0JICAhPSBzaXplb2YgcmF3cHRyLT51KSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBTYW5pdHkgY2hlY2sgcGVyaGFwcz8/PyAqLwotICBpZiAocmF3cHRyLT51LnVfZHNpemUgPiAweDEwMDAwMDApICAgIC8qIFJlbWVtYmVyLCBpdCdzIGluIHBhZ2VzLi4uICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChyYXdwdHItPnUudV9zc2l6ZSA+IDB4MTAwMDAwMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmV0dXJuICZyYXdwdHItPnU7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXNjbzVfY29yZV9maWxlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvZmZzZXRfc2l6LCB2YWwsIG5zZWNzLCBjaGVhZG9mZnM7Ci0gIGludCBjb3Jlc2l6ZTsKLSAgc3RydWN0IHVzZXIgKnU7Ci0gIHN0cnVjdCBjb3Jlb2Zmc2V0cyBjb2Zmc2V0czsKLSAgc3RydWN0IGNvcmVzZWN0aGVhZCBjaGVhZDsKLSAgY2hhciAqc2VjbmFtZTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgLyogUmVhZCBjb3Jlb2Zmc2V0cyByZWdpb24gYXQgZW5kIG9mIGNvcmUgKHNlZSBjb3JlKEZQKSkgKi8KLQotICB7Ci0gICAgRklMRSAqc3RyZWFtID0gYmZkX2NhY2hlX2xvb2t1cCAoYWJmZCk7Ci0gICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoZnN0YXQgKGZpbGVubyAoc3RyZWFtKSwgJnN0YXRidWYpIDwgMCkKLSAgICAgIHsKLSAgICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgY29yZXNpemUgPSBzdGF0YnVmLnN0X3NpemU7Ci0gIH0KLSAgLyogTGFzdCBsb25nIGluIGNvcmUgaXMgc2l6ZW9mIHN0cnVjdCBjb3Jlb2Zmc2V0cywgcmVhZCBpdCAqLwotICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjb3Jlc2l6ZS1zaXplb2YgY29mZnNldF9zaXosIFNFRUtfU0VUKSAhPSAwKQotICAgICAgfHwgKGJmZF9yZWFkICgodm9pZCAqKSZjb2Zmc2V0X3NpeiwgMSwgc2l6ZW9mIGNvZmZzZXRfc2l6LCBhYmZkKQotCSAgIT0gc2l6ZW9mIGNvZmZzZXRfc2l6KSApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFVzZSBpdCB0byBzZWVrIHN0YXJ0IG9mIGNvcmVvZmZzZXRzIHJlZ2lvbiwgcmVhZCBpdCBhbmQgZGV0ZXJtaW5lCi0gICAgIHZhbGlkaXR5ICovCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIGNvcmVzaXplLWNvZmZzZXRfc2l6LCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY29mZnNldHMsIDEsIHNpemVvZiBjb2Zmc2V0cywgYWJmZCkKLQkgICE9IHNpemVvZiBjb2Zmc2V0cykKLSAgICAgIHx8ICgoY29mZnNldHMudV9pbmZvICE9IDEpICYmIChjb2Zmc2V0cy51X2luZm8gIT0gQ19WRVJTSU9OKSkpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0KLSAgaWYgKGNvZmZzZXRzLnVfaW5mbyA9PSAxKSAKLSAgICB7IAotICAgICAgLyogT2xkIHZlcnNpb24sIG5vIHNlY3Rpb24gaGVhZHMsIHJlYWQgaW5mbyBmcm9tIHVzZXIgc3RydWN0ICovCi0KLSAgICAgIHUgPSByZWFkX3VhcmVhKGFiZmQsIGNvZmZzZXRzLnVfdXNlcik7Ci0gICAgICBpZiAoISB1KQotICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnJlZyIsIFNFQ19IQVNfQ09OVEVOVFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9zaXplX3R5cGUpIGNvZmZzZXRzLnVfdXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gKGJmZF92bWEpIHUtPnVfYXIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfcHRyKSBjb2Zmc2V0cy51X3VzZXIpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAKLSAgICAgIGlmICghbWFrZV9iZmRfYXNlY3Rpb24gKGFiZmQsICIuZGF0YSIsIAotCQkJICAgICAgU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiZmRfc2l6ZV90eXBlKSB1LT51X2V4ZGF0YS51eF9kc2l6ZQotCQkJICAgICAgICsgdS0+dV9leGRhdGEudXhfYnNpemUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF92bWEpIHUtPnVfZXhkYXRhLnV4X2RhdG9yZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX3B0cikgY29mZnNldHMudV9kYXRhKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgCi0gICAgICBpZiAoIW1ha2VfYmZkX2FzZWN0aW9uIChhYmZkLCAiLnN0YWNrIiwgCi0JCQkgICAgICBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF9zaXplX3R5cGUpIHUtPnVfc3NpemUgKiBOQlBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmZF92bWEpIHUtPnVfc3ViLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfcHRyKSBjb2Zmc2V0cy51X3N0YWNrKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgIHJldHVybiBhYmZkLT54dmVjOwkJLyogRG9uZSBmb3IgdmVyc2lvbiAxICovCi0gICAgfSAgICAgIAotCi0gIC8qIEltbWVkaWF0ZWx5IGJlZm9yZSBjb3Jlb2Zmc2V0cyByZWdpb24gaXMgYSBsb25nIHdpdGggb2Zmc2V0IGluIGNvcmUKLSAgICAgdG8gZmlyc3QgY29yZXNlY3RoZWFkIChDT1JFU19PRkZTRVRTKSwgdGhlIGxvbmcgYmVmb3JlIHRoaXMgaXMgdGhlCi0gICAgIG51bWJlciBvZiBzZWN0aW9uIGhlYWRzIGluIHRoZSBsaXN0LiBSZWFkIGJvdGggbG9uZ3MgYW5kIHJlYWQgdGhlCi0gICAgIGNvcmVzZWN0aGVhZCBhbmQgY2hlY2sgaXRzIHZhbGlkaXR5ICovCi0gICAgCi0gIGlmICgoYmZkX3NlZWsgKGFiZmQsIAotCQkgY29yZXNpemUgLSBjb2Zmc2V0X3NpeiAtIDIgKiBzaXplb2YgY29mZnNldF9zaXosIAotCQkgU0VFS19TRVQpICE9IDApCi0gICAgICB8fCAoYmZkX3JlYWQgKCh2b2lkICopJm5zZWNzLCAxLCBzaXplb2YgbnNlY3MsIGFiZmQpICE9IHNpemVvZiBuc2VjcykKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWRvZmZzLCAxLCBzaXplb2YgY2hlYWRvZmZzLCBhYmZkKQotCSAgIT0gc2l6ZW9mIGNoZWFkb2ZmcykKLSAgICAgIHx8IChiZmRfc2VlayAoYWJmZCwgY2hlYWRvZmZzLCBTRUVLX1NFVCkgIT0gMCkKLSAgICAgIHx8IChiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWQsIDEsIHNpemVvZiBjaGVhZCwgYWJmZCkgIT0gc2l6ZW9mIGNoZWFkKQotICAgICAgfHwgKGNoZWFkLmNzX3N0eXBlICE9IENPUkVTX09GRlNFVFMpCi0gICAgICB8fCAoY2hlYWQuY3NfeC5jc3hfbWFnaWMgIT0gQ09SRU1BR0lDX05VTUJFUikpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgLyogT0ssIHdlIGJlbGlldmUgeW91LiAgWW91J3JlIGEgY29yZSBmaWxlIChzdXJlLCBzdXJlKS4gICovCi0KLSAgLyogTm93IGxvb3Agb3ZlciBhbGwgcmVnaW9ucyBhbmQgbWFwIHRoZW0gKi8KLSAgbnNlY3MtLTsJCQkJLyogV2UndmUgc2VlbiBDT1JFU19PRkZTRVRTIGFscmVhZHkgKi8KLSAgZm9yICg7IG5zZWNzOyBuc2Vjcy0tKSAKLSAgICB7Ci0gICAgICBpZiAoKGJmZF9zZWVrIChhYmZkLCBjaGVhZC5jc19oc2VlaywgU0VFS19TRVQpICE9IDApCi0JICB8fCBiZmRfcmVhZCAoKHZvaWQgKikmY2hlYWQsIDEsIHNpemVvZiBjaGVhZCwgYWJmZCkgIT0gc2l6ZW9mIGNoZWFkKQotICAgICAgICB7Ci0gICAgICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7IAotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgIHN3aXRjaCAoY2hlYWQuY3Nfc3R5cGUpIAotCXsKLQljYXNlIENPUkVTX01BR0lDOgkJCS8qIENvcmUgaGVhZGVyLCBjaGVjayBtYWdpYyAqLwotCSAgaWYgKGNoZWFkLmNzX3guY3N4X21hZ2ljICE9IENPUkVNQUdJQ19OVU1CRVIpCi0JICAgIHsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgICAgICByZXR1cm4gTlVMTDsKLQkgICAgfQotCSAgc2VjbmFtZSA9IE5VTEw7Ci0JICBuc2VjcysrOwkJCQkvKiBNQUdJQyBub3QgaW4gc2VjdGlvbiBjbnQhKi8KLQkgIGJyZWFrOwotCWNhc2UgQ09SRVNfVUFSRUE6CQkJLyogVS1hcmVhLCByZWFkIGluIHRkYXRhICovCi0JICB1ID0gcmVhZF91YXJlYShhYmZkLCBjaGVhZC5jc19zc2Vlayk7Ci0JICBpZiAoISB1KQotCSAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICAgIC8qIFRoaXMgaXMgdHJpY2t5LiAgQXMgdGhlICJyZWdpc3RlciBzZWN0aW9uIiwgd2UgZ2l2ZSB0aGVtCi0JICAgICB0aGUgZW50aXJlIHVwYWdlIGFuZCBzdGFjay4gIHUudV9hcjAgcG9pbnRzIHRvIHdoZXJlCi0JICAgICAicmVnaXN0ZXIgMCIgaXMgc3RvcmVkLiAgVGhlcmUgYXJlIHR3byB0cmlja3Mgd2l0aCB0aGlzLAotCSAgICAgdGhvdWdoLiAgT25lIGlzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIHJlZ2lzdGVycyBtaWdodCBiZQotCSAgICAgYXQgcG9zaXRpdmUgb3IgbmVnYXRpdmUgKG9yIGJvdGgpIGRpc3BsYWNlbWVudHMgZnJvbQotCSAgICAgKnVfYXIwLiAgVGhlIG90aGVyIGlzIHRoYXQgdV9hcjAgaXMgc29tZXRpbWVzIGFuIGFic29sdXRlCi0JICAgICBhZGRyZXNzIGluIGtlcm5lbCBtZW1vcnksIGFuZCBvbiBvdGhlciBzeXN0ZW1zIGl0IGlzIGFuCi0JICAgICBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBgc3RydWN0IHVzZXInLgotCQotCSAgICAgQXMgYSBwcmFjdGljYWwgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSByZWdpc3RlcnMKLQkgICAgIGFjdHVhbGx5IGFyZSwgc28gd2UgaGF2ZSB0byBwYXNzIHRoZSB3aG9sZSBhcmVhIHRvIEdEQi4KLQkgICAgIFdlIGVuY29kZSB0aGUgdmFsdWUgb2YgdV9hcjAgYnkgc2V0dGluZyB0aGUgLnJlZ3Mgc2VjdGlvbgotCSAgICAgdXAgc28gdGhhdCBpdHMgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyAwIGlzIGF0IHRoZSBwbGFjZQotCSAgICAgcG9pbnRlZCB0byBieSB1X2FyMCAoYnkgc2V0dGluZyB0aGUgdm1hIG9mIHRoZSBzdGFydCBvZgotCSAgICAgdGhlIHNlY3Rpb24gdG8gLXVfYXIwKS4gIEdEQiB1c2VzIHRoaXMgaW5mbyB0byBsb2NhdGUgdGhlCi0JICAgICByZWdzLCB1c2luZyBtaW5vciB0cmlja2VyeSB0byBnZXQgYXJvdW5kIHRoZQotCSAgICAgb2Zmc2V0LW9yLWFic29sdXRlLWFkZHIgcHJvYmxlbS4gKi8KLQotCSAgY2hlYWQuY3NfdmFkZHIgPSAwIC0gKGJmZF92bWEpIHUtPnVfYXIwOwotCi0KLSAgICAgICAgICBzZWNuYW1lID0gIi5yZWciOwotICAgICAgICAgIGZsYWdzID0gU0VDX0hBU19DT05URU5UUzsKLQotICAgICAgICAgIGJyZWFrOwotCWNhc2UgQ09SRVNfUFJFR0lPTjoJCQkvKiBBIHByb2dyYW0gcmVnaW9uLCBtYXAgaXQgKi8KLQkgIHN3aXRjaCAoY2hlYWQuY3NfeC5jc3hfcHJlZy5jc3hwX3J0eXApCi0JICAgIHsKLQkgICAgY2FzZSBQVF9EQVRBOgotCSAgICAgIHNlY25hbWUgPSAiLmRhdGEiOyAgCS8qIERhdGEgcmVnaW9uLiAgICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NUQUNLOgotCSAgICAgIHNlY25hbWUgPSAiLnN0YWNrIjsgCS8qIFN0YWNrIHJlZ2lvbi4gICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX1NITUVNOgotCSAgICAgIHNlY25hbWUgPSAiLnNobWVtIjsgCS8qIFNoYXJlZCBtZW1vcnkgICAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBUX0xJQkRBVDoKLQkgICAgICBzZWNuYW1lID0gIi5saWJkYXQiOwkvKiBTaGFyZWQgbGlicmFyeSBkYXRhICAgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQVF9WODY6Ci0JICAgICAgc2VjbmFtZSA9ICIudmlydDg2IjsJLyogVmlydHVhbCA4MDg2IG1vZGUgICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfU0hGSUw6Ci0JICAgICAgc2VjbmFtZSA9ICIubW1maWxlIjsJLyogTWVtb3J5IG1hcHBlZCBmaWxlICAgICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUFRfWERBVEEwOgotCSAgICAgIHNlY25hbWUgPSAiLlhkYXQwIjsgCS8qIFhFTklYIGRhdGEgcmVnaW9uLCB2aXJ0dWFsIDAgKi8KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzZWNuYW1lID0gIiI7Ci0JICAgIH0KLQkgIGZsYWdzID0gU0VDX0FMTE9DICsgU0VDX0xPQUQgKyBTRUNfSEFTX0NPTlRFTlRTOwotCSAgYnJlYWs7Ci0JY2FzZSBDT1JFU19QUk9DOgkJCS8qIHN0cnVjdCBwcm9jICovCi0JY2FzZSBDT1JFU19JVElNRVI6CQkJLyogaW50ZXJ2YWwgdGltZXJzICovCi0JY2FzZSBDT1JFU19TQ09VVFNOQU1FOgkJCS8qIHN0cnVjdCBzY291dHNuYW1lICovCi0JICBzZWNuYW1lID0gTlVMTDsJLyogSWdub3JlIHRoZXNlICovCi0JICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJVbmhhbmRsZWQgU0NPIGNvcmUgZmlsZSBzZWN0aW9uIHR5cGUgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVhZC5jc19zdHlwZSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKHNlY25hbWUKLQkgICYmICFtYWtlX2JmZF9hc2VjdGlvbiAoYWJmZCwgc2VjbmFtZSwgZmxhZ3MsCi0JCQkJIChiZmRfc2l6ZV90eXBlKSBjaGVhZC5jc192c2l6ZSwKLQkJCQkgKGJmZF92bWEpIGNoZWFkLmNzX3ZhZGRyLAotCQkJCSAoZmlsZV9wdHIpIGNoZWFkLmNzX3NzZWVrKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICB9Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci0KLX0KLQotY2hhciAqCi1zY281X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqY29tID0gYWJmZC0+dGRhdGEuc2NvNV9jb3JlX2RhdGEtPnUudV9jb21tOwotICBpZiAoKmNvbSkKLSAgICByZXR1cm4gY29tOwotICBlbHNlCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLXNjbzVfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIChpZ25vcmVfYWJmZCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLXsKLSAgcmV0dXJuICgoaWdub3JlX2FiZmQtPnRkYXRhLnNjbzVfY29yZV9kYXRhLT51LnVfc3lzYWJvcnQgIT0gMCkgCi0JICA/IGlnbm9yZV9hYmZkLT50ZGF0YS5zY281X2NvcmVfZGF0YS0+dS51X3N5c2Fib3J0IAotCSAgOiAtMSk7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi1zY281X2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAgKGNvcmVfYmZkLCBleGVjX2JmZCkKLSAgICAgYmZkICpjb3JlX2JmZCwgKmV4ZWNfYmZkOwotewotICByZXR1cm4gdHJ1ZTsgICAgICAgICAgLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotCi0jZGVmaW5lIHNjbzVfY29yZV9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIF9iZmRfbm9zeW1ib2xzX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9zeW10YWIgX2JmZF9ub3N5bWJvbHNfZ2V0X3N5bXRhYgotI2RlZmluZSBzY281X2NvcmVfcHJpbnRfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX3ByaW50X3N5bWJvbAotI2RlZmluZSBzY281X2NvcmVfZ2V0X3N5bWJvbF9pbmZvIF9iZmRfbm9zeW1ib2xzX2dldF9zeW1ib2xfaW5mbwotI2RlZmluZSBzY281X2NvcmVfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgX2JmZF9ub3N5bWJvbHNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgc2NvNV9jb3JlX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSBzY281X2NvcmVfZmluZF9uZWFyZXN0X2xpbmUgX2JmZF9ub3N5bWJvbHNfZmluZF9uZWFyZXN0X2xpbmUKLSNkZWZpbmUgc2NvNV9jb3JlX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgc2NvNV9jb3JlX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9ub3N5bWJvbHNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzY281X2NvcmVfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfbWluaXN5bWJvbF90b19zeW1ib2wKLQotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUgTk9fR0VUICAoKGJmZF92bWEgKCopIFBBUkFNUyAoKCAgIGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0jZGVmaW5lIE5PX1BVVCAgKCh2b2lkICAgICgqKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSkpIHN3YXBfYWJvcnQgKQotI2RlZmluZSBOT19TSUdORURfR0VUIFwKLSAgKChiZmRfc2lnbmVkX3ZtYSAoKikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLQotY29uc3QgYmZkX3RhcmdldCBzY281X2NvcmVfdmVjID0KLSAgewotICAgICJzY281LWNvcmUiLAotICAgIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLAotICAgIEJGRF9FTkRJQU5fTElUVExFLCAgICAgICAgIC8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgQkZEX0VORElBTl9MSVRUTEUsICAgICAgICAgLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAgIChIQVNfUkVMT0MgfCBFWEVDX1AgfCAgICAgICAvKiBvYmplY3QgZmxhZ3MgKi8KLSAgICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwgLyogc2VjdGlvbiBmbGFncyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeW1ib2wgcHJlZml4ICovCi0gICAgJyAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX3BhZF9jaGFyICovCi0gICAgMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFyX21heF9uYW1lbGVuICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogNjQgYml0IGRhdGEgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDE2IGJpdCBkYXRhICovCi0gICAgTk9fR0VULCBOT19TSUdORURfR0VULCBOT19QVVQsICAgICAgLyogNjQgYml0IGhkcnMgKi8KLSAgICBOT19HRVQsIE5PX1NJR05FRF9HRVQsIE5PX1BVVCwgICAgICAvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULCAgICAgIC8qIDE2IGJpdCBoZHJzICovCi0KLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiB1bmtub3duIGZvcm1hdCAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwgICAgICAgICAvKiBhcmNoaXZlICovCi0gICAgIHNjbzVfY29yZV9maWxlX3AgICAgICAJLyogYSBjb3JlIGZpbGUgKi8KLSAgICB9LAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZmRfc2V0X2Zvcm1hdCAqLwotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZSwKLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UKLSAgICB9LAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLQotICAgICAgIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9DT1JFIChzY281KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc2NvNV9jb3JlKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0xJTksgKF9iZmRfbm9saW5rKSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgICAoUFRSKSAwICAgICAgICAgICAgICAgICAgICAgLyogYmFja2VuZF9kYXRhICovCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3NlY3Rpb24uYyBiL2JmZC9zZWN0aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNGE5Y2QuLjAwMDAwMDAKLS0tIGEvYmZkL3NlY3Rpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDEwODEgKzAsMCBAQAotLyogT2JqZWN0IGZpbGUgInNlY3Rpb24iIHN1cHBvcnQgZm9yIHRoZSBCRkQgbGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JU2VjdGlvbnMKLQotCVRoZSByYXcgZGF0YSBjb250YWluZWQgd2l0aGluIGEgQkZEIGlzIG1haW50YWluZWQgdGhyb3VnaCB0aGUKLQlzZWN0aW9uIGFic3RyYWN0aW9uLiAgQSBzaW5nbGUgQkZEIG1heSBoYXZlIGFueSBudW1iZXIgb2YKLQlzZWN0aW9ucy4gIEl0IGtlZXBzIGhvbGQgb2YgdGhlbSBieSBwb2ludGluZyB0byB0aGUgZmlyc3Q7Ci0JZWFjaCBvbmUgcG9pbnRzIHRvIHRoZSBuZXh0IGluIHRoZSBsaXN0LgotCi0JU2VjdGlvbnMgYXJlIHN1cHBvcnRlZCBpbiBCRkQgaW4gPDxzZWN0aW9uLmM+Pi4KLQotQG1lbnUKLUAqIFNlY3Rpb24gSW5wdXQ6OgotQCogU2VjdGlvbiBPdXRwdXQ6OgotQCogdHlwZWRlZiBhc2VjdGlvbjo6Ci1AKiBzZWN0aW9uIHByb3RvdHlwZXM6OgotQGVuZCBtZW51Ci0KLUlOT0RFCi1TZWN0aW9uIElucHV0LCBTZWN0aW9uIE91dHB1dCwgU2VjdGlvbnMsIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBpbnB1dAotCi0JV2hlbiBhIEJGRCBpcyBvcGVuZWQgZm9yIHJlYWRpbmcsIHRoZSBzZWN0aW9uIHN0cnVjdHVyZXMgYXJlCi0JY3JlYXRlZCBhbmQgYXR0YWNoZWQgdG8gdGhlIEJGRC4KLQotCUVhY2ggc2VjdGlvbiBoYXMgYSBuYW1lIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2VjdGlvbiBpbiB0aGUKLQlvdXRzaWRlIHdvcmxkLS0tZm9yIGV4YW1wbGUsIDw8YS5vdXQ+PiB3b3VsZCBjb250YWluIGF0IGxlYXN0Ci0JdGhyZWUgc2VjdGlvbnMsIGNhbGxlZCA8PC50ZXh0Pj4sIDw8LmRhdGE+PiBhbmQgPDwuYnNzPj4uCi0KLQlOYW1lcyBuZWVkIG5vdCBiZSB1bmlxdWU7IGZvciBleGFtcGxlIGEgQ09GRiBmaWxlIG1heSBoYXZlIHNldmVyYWwKLQlzZWN0aW9ucyBuYW1lZCA8PC5kYXRhPj4uCi0KLQlTb21ldGltZXMgYSBCRkQgd2lsbCBjb250YWluIG1vcmUgdGhhbiB0aGUgYGBuYXR1cmFsJycgbnVtYmVyIG9mCi0Jc2VjdGlvbnMuIEEgYmFjayBlbmQgbWF5IGF0dGFjaCBvdGhlciBzZWN0aW9ucyBjb250YWluaW5nCi0JY29uc3RydWN0b3IgZGF0YSwgb3IgYW4gYXBwbGljYXRpb24gbWF5IGFkZCBhIHNlY3Rpb24gKHVzaW5nCi0JPDxiZmRfbWFrZV9zZWN0aW9uPj4pIHRvIHRoZSBzZWN0aW9ucyBhdHRhY2hlZCB0byBhbiBhbHJlYWR5IG9wZW4KLQlCRkQuIEZvciBleGFtcGxlLCB0aGUgbGlua2VyIGNyZWF0ZXMgYW4gZXh0cmEgc2VjdGlvbgotCTw8Q09NTU9OPj4gZm9yIGVhY2ggaW5wdXQgZmlsZSdzIEJGRCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0Ci0JY29tbW9uIHN0b3JhZ2UuCi0KLQlUaGUgcmF3IGRhdGEgaXMgbm90IG5lY2Vzc2FyaWx5IHJlYWQgaW4gd2hlbgotCXRoZSBzZWN0aW9uIGRlc2NyaXB0b3IgaXMgY3JlYXRlZC4gU29tZSB0YXJnZXRzIG1heSBsZWF2ZSB0aGUKLQlkYXRhIGluIHBsYWNlIHVudGlsIGEgPDxiZmRfZ2V0X3NlY3Rpb25fY29udGVudHM+PiBjYWxsIGlzCi0JbWFkZS4gT3RoZXIgYmFjayBlbmRzIG1heSByZWFkIGluIGFsbCB0aGUgZGF0YSBhdCBvbmNlLiAgRm9yCi0JZXhhbXBsZSwgYW4gUy1yZWNvcmQgZmlsZSBoYXMgdG8gYmUgcmVhZCBvbmNlIHRvIGRldGVybWluZSB0aGUKLQlzaXplIG9mIHRoZSBkYXRhLiBBbiBJRUVFLTY5NSBmaWxlIGRvZXNuJ3QgY29udGFpbiByYXcgZGF0YSBpbgotCXNlY3Rpb25zLCBidXQgZGF0YSBhbmQgcmVsb2NhdGlvbiBleHByZXNzaW9ucyBpbnRlcm1peGVkLCBzbwotCXRoZSBkYXRhIGFyZWEgaGFzIHRvIGJlIHBhcnNlZCB0byBnZXQgb3V0IHRoZSBkYXRhIGFuZAotCXJlbG9jYXRpb25zLgotCi1JTk9ERQotU2VjdGlvbiBPdXRwdXQsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb24gSW5wdXQsIFNlY3Rpb25zCi0KLVNVQlNFQ1RJT04KLQlTZWN0aW9uIG91dHB1dAotCi0JVG8gd3JpdGUgYSBuZXcgb2JqZWN0IHN0eWxlIEJGRCwgdGhlIHZhcmlvdXMgc2VjdGlvbnMgdG8gYmUKLQl3cml0dGVuIGhhdmUgdG8gYmUgY3JlYXRlZC4gVGhleSBhcmUgYXR0YWNoZWQgdG8gdGhlIEJGRCBpbgotCXRoZSBzYW1lIHdheSBhcyBpbnB1dCBzZWN0aW9uczsgZGF0YSBpcyB3cml0dGVuIHRvIHRoZQotCXNlY3Rpb25zIHVzaW5nIDw8YmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzPj4uCi0KLQlBbnkgcHJvZ3JhbSB0aGF0IGNyZWF0ZXMgb3IgY29tYmluZXMgc2VjdGlvbnMgKGUuZy4sIHRoZSBhc3NlbWJsZXIKLQlhbmQgbGlua2VyKSBtdXN0IHVzZSB0aGUgPDxhc2VjdGlvbj4+IGZpZWxkcyA8PG91dHB1dF9zZWN0aW9uPj4gYW5kCi0JPDxvdXRwdXRfb2Zmc2V0Pj4gdG8gaW5kaWNhdGUgdGhlIGZpbGUgc2VjdGlvbnMgdG8gd2hpY2ggZWFjaAotCXNlY3Rpb24gbXVzdCBiZSB3cml0dGVuLiAgKElmIHRoZSBzZWN0aW9uIGlzIGJlaW5nIGNyZWF0ZWQgZnJvbQotCXNjcmF0Y2gsIDw8b3V0cHV0X3NlY3Rpb24+PiBzaG91bGQgcHJvYmFibHkgcG9pbnQgdG8gdGhlIHNlY3Rpb24KLQlpdHNlbGYgYW5kIDw8b3V0cHV0X29mZnNldD4+IHNob3VsZCBwcm9iYWJseSBiZSB6ZXJvLikKLQotCVRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gY29tZXMgZnJvbSBpbnB1dCBzZWN0aW9ucyBhdHRhY2hlZAotCSh2aWEgPDxvdXRwdXRfc2VjdGlvbj4+IHBvaW50ZXJzKSB0bwotCXRoZSBvdXRwdXQgc2VjdGlvbnMuICBUaGUgb3V0cHV0IHNlY3Rpb24gc3RydWN0dXJlIGNhbiBiZQotCWNvbnNpZGVyZWQgYSBmaWx0ZXIgZm9yIHRoZSBpbnB1dCBzZWN0aW9uOiB0aGUgb3V0cHV0IHNlY3Rpb24KLQlkZXRlcm1pbmVzIHRoZSB2bWEgb2YgdGhlIG91dHB1dCBkYXRhIGFuZCB0aGUgbmFtZSwgYnV0IHRoZQotCWlucHV0IHNlY3Rpb24gZGV0ZXJtaW5lcyB0aGUgb2Zmc2V0IGludG8gdGhlIG91dHB1dCBzZWN0aW9uIG9mCi0JdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4KLQotCUUuZy4sIHRvIGNyZWF0ZSBhIHNlY3Rpb24gIk8iLCBzdGFydGluZyBhdCAweDEwMCwgMHgxMjMgbG9uZywKLQljb250YWluaW5nIHR3byBzdWJzZWN0aW9ucywgIkEiIGF0IG9mZnNldCAweDAgKGkuZS4sIGF0IHZtYQotCTB4MTAwKSBhbmQgIkIiIGF0IG9mZnNldCAweDIwIChpLmUuLCBhdCB2bWEgMHgxMjApIHRoZSA8PGFzZWN0aW9uPj4KLQlzdHJ1Y3R1cmVzIHdvdWxkIGxvb2sgbGlrZToKLQotfCAgIHNlY3Rpb24gbmFtZSAgICAgICAgICAiQSIKLXwgICAgIG91dHB1dF9vZmZzZXQgICAweDAwCi18ICAgICBzaXplICAgICAgICAgICAgMHgyMAotfCAgICAgb3V0cHV0X3NlY3Rpb24gLS0tLS0tLS0tLS0+ICBzZWN0aW9uIG5hbWUgICAgIk8iCi18ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHZtYSAgICAgICAgICAgICAweDEwMAotfCAgIHNlY3Rpb24gbmFtZSAgICAgICAgICAiQiIgfCAgICBzaXplICAgICAgICAgICAgMHgxMjMKLXwgICAgIG91dHB1dF9vZmZzZXQgICAweDIwICAgIHwKLXwgICAgIHNpemUgICAgICAgICAgICAweDEwMyAgIHwKLXwgICAgIG91dHB1dF9zZWN0aW9uICAtLS0tLS0tLXwKLQotCi1TVUJTRUNUSU9OCi0JTGluayBvcmRlcnMKLQotCVRoZSBkYXRhIHdpdGhpbiBhIHNlY3Rpb24gaXMgc3RvcmVkIGluIGEgQGRmbntsaW5rX29yZGVyfS4KLQlUaGVzZSBhcmUgbXVjaCBsaWtlIHRoZSBmaXh1cHMgaW4gPDxnYXM+Pi4gIFRoZSBsaW5rX29yZGVyCi0JYWJzdHJhY3Rpb24gYWxsb3dzIGEgc2VjdGlvbiB0byBncm93IGFuZCBzaHJpbmsgd2l0aGluIGl0c2VsZi4KLQotCUEgbGlua19vcmRlciBrbm93cyBob3cgYmlnIGl0IGlzLCBhbmQgd2hpY2ggaXMgdGhlIG5leHQKLQlsaW5rX29yZGVyIGFuZCB3aGVyZSB0aGUgcmF3IGRhdGEgZm9yIGl0IGlzOyBpdCBhbHNvIHBvaW50cyB0bwotCWEgbGlzdCBvZiByZWxvY2F0aW9ucyB3aGljaCBhcHBseSB0byBpdC4KLQotCVRoZSBsaW5rX29yZGVyIGlzIHVzZWQgYnkgdGhlIGxpbmtlciB0byBwZXJmb3JtIHJlbGF4aW5nIG9uCi0JZmluYWwgY29kZS4gIFRoZSBjb21waWxlciBjcmVhdGVzIGNvZGUgd2hpY2ggaXMgYXMgYmlnIGFzCi0JbmVjZXNzYXJ5IHRvIG1ha2UgaXQgd29yayB3aXRob3V0IHJlbGF4aW5nLCBhbmQgdGhlIHVzZXIgY2FuCi0Jc2VsZWN0IHdoZXRoZXIgdG8gcmVsYXguICBTb21ldGltZXMgcmVsYXhpbmcgdGFrZXMgYSBsb3Qgb2YKLQl0aW1lLiAgVGhlIGxpbmtlciBydW5zIGFyb3VuZCB0aGUgcmVsb2NhdGlvbnMgdG8gc2VlIGlmIGFueQotCWFyZSBhdHRhY2hlZCB0byBkYXRhIHdoaWNoIGNhbiBiZSBzaHJ1bmssIGlmIHNvIGl0IGRvZXMgaXQgb24KLQlhIGxpbmtfb3JkZXIgYnkgbGlua19vcmRlciBiYXNpcy4KLQotKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0vKgotRE9DREQKLUlOT0RFCi10eXBlZGVmIGFzZWN0aW9uLCBzZWN0aW9uIHByb3RvdHlwZXMsIFNlY3Rpb24gT3V0cHV0LCBTZWN0aW9ucwotU1VCU0VDVElPTgotCXR5cGVkZWYgYXNlY3Rpb24KLQotCUhlcmUgaXMgdGhlIHNlY3Rpb24gc3RydWN0dXJlOgotCi1DT0RFX0ZSQUdNRU5UCi0uCi0udHlwZWRlZiBzdHJ1Y3Qgc2VjCi0uewotLiAgICAgICAgeyogVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb247IHRoZSBuYW1lIGlzbid0IGEgY29weSwgdGhlIHBvaW50ZXIgaXMKLS4gICAgICAgIHRoZSBzYW1lIGFzIHRoYXQgcGFzc2VkIHRvIGJmZF9tYWtlX3NlY3Rpb24uICp9Ci0uCi0uICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0uCi0uICAgICAgICB7KiBXaGljaCBzZWN0aW9uIGlzIGl0OyAwLi5udGguICAgICAgKn0KLS4KLS4gICBpbnQgaW5kZXg7Ci0uCi0uICAgICAgICB7KiBUaGUgbmV4dCBzZWN0aW9uIGluIHRoZSBsaXN0IGJlbG9uZ2luZyB0byB0aGUgQkZELCBvciBOVUxMLiAqfQotLgotLiAgICBzdHJ1Y3Qgc2VjICpuZXh0OwotLgotLiAgICAgICAgeyogVGhlIGZpZWxkIGZsYWdzIGNvbnRhaW5zIGF0dHJpYnV0ZXMgb2YgdGhlIHNlY3Rpb24uIFNvbWUKLS4gICAgICAgICAgIGZsYWdzIGFyZSByZWFkIGluIGZyb20gdGhlIG9iamVjdCBmaWxlLCBhbmQgc29tZSBhcmUKLS4gICAgICAgICAgIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgaW5mb3JtYXRpb24uICAqfQotLgotLiAgICBmbGFnd29yZCBmbGFnczsKLS4KLS4jZGVmaW5lIFNFQ19OT19GTEFHUyAgIDB4MDAwCi0uCi0uICAgICAgICB7KiBUZWxscyB0aGUgT1MgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgc2VjdGlvbiB3aGVuIGxvYWRpbmcuCi0uICAgICAgICAgICBUaGlzIGlzIGNsZWFyIGZvciBhIHNlY3Rpb24gY29udGFpbmluZyBkZWJ1ZyBpbmZvcm1hdGlvbgotLiAgICAgICAgICAgb25seS4gKn0KLS4jZGVmaW5lIFNFQ19BTExPQyAgICAgIDB4MDAxCi0uCi0uICAgICAgICB7KiBUZWxscyB0aGUgT1MgdG8gbG9hZCB0aGUgc2VjdGlvbiBmcm9tIHRoZSBmaWxlIHdoZW4gbG9hZGluZy4KLS4gICAgICAgICAgIFRoaXMgaXMgY2xlYXIgZm9yIGEgLmJzcyBzZWN0aW9uLiAqfQotLiNkZWZpbmUgU0VDX0xPQUQgICAgICAgMHgwMDIKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgc3RpbGwgdG8gYmUgcmVsb2NhdGVkLCBzbyB0aGVyZSBpcwotLiAgICAgICAgICAgc29tZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIHRvby4gKn0KLS4jZGVmaW5lIFNFQ19SRUxPQyAgICAgIDB4MDA0Ci0uCi0uI2lmIDAgICB7KiBPYnNvbGV0ZSA/ICp9Ci0uI2RlZmluZSBTRUNfQkFMSUdOICAgICAweDAwOAotLiNlbmRpZgotLgotLiAgICAgICAgeyogQSBzaWduYWwgdG8gdGhlIE9TIHRoYXQgdGhlIHNlY3Rpb24gY29udGFpbnMgcmVhZCBvbmx5Ci0uICAgICAgICAgIGRhdGEuICp9Ci0uI2RlZmluZSBTRUNfUkVBRE9OTFkgICAweDAxMAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29kZSBvbmx5LiAqfQotLiNkZWZpbmUgU0VDX0NPREUgICAgICAgMHgwMjAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgb25seS4gKn0KLS4jZGVmaW5lIFNFQ19EQVRBICAgICAgIDB4MDQwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiB3aWxsIHJlc2lkZSBpbiBST00uICp9Ci0uI2RlZmluZSBTRUNfUk9NICAgICAgICAweDA4MAotLgotLiAgICAgICAgeyogVGhlIHNlY3Rpb24gY29udGFpbnMgY29uc3RydWN0b3IgaW5mb3JtYXRpb24uIFRoaXMgc2VjdGlvbgotLiAgICAgICAgICAgdHlwZSBpcyB1c2VkIGJ5IHRoZSBsaW5rZXIgdG8gY3JlYXRlIGxpc3RzIG9mIGNvbnN0cnVjdG9ycyBhbmQKLS4gICAgICAgICAgIGRlc3RydWN0b3JzIHVzZWQgYnkgPDxnKys+Pi4gV2hlbiBhIGJhY2sgZW5kIHNlZXMgYSBzeW1ib2wKLS4gICAgICAgICAgIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGEgY29uc3RydWN0b3IgbGlzdCwgaXQgY3JlYXRlcyBhIG5ldwotLiAgICAgICAgICAgc2VjdGlvbiBmb3IgdGhlIHR5cGUgb2YgbmFtZSAoZS5nLiwgPDxfX0NUT1JfTElTVF9fPj4pLCBhdHRhY2hlcwotLiAgICAgICAgICAgdGhlIHN5bWJvbCB0byBpdCwgYW5kIGJ1aWxkcyBhIHJlbG9jYXRpb24uIFRvIGJ1aWxkIHRoZSBsaXN0cwotLiAgICAgICAgICAgb2YgY29uc3RydWN0b3JzLCBhbGwgdGhlIGxpbmtlciBoYXMgdG8gZG8gaXMgY2F0ZW5hdGUgYWxsIHRoZQotLiAgICAgICAgICAgc2VjdGlvbnMgY2FsbGVkIDw8X19DVE9SX0xJU1RfXz4+IGFuZCByZWxvY2F0ZSB0aGUgZGF0YQotLiAgICAgICAgICAgY29udGFpbmVkIHdpdGhpbiAtIGV4YWN0bHkgdGhlIG9wZXJhdGlvbnMgaXQgd291bGQgcGVmb3JtIG9uCi0uICAgICAgICAgICBzdGFuZGFyZCBkYXRhLiAqfQotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SIDB4MTAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBpcyBhIGNvbnN0cnVjdG9yLCBhbmQgc2hvdWxkIGJlIHBsYWNlZCBhdCB0aGUKLS4gICAgICAgICAgZW5kIG9mIHRoZSB0ZXh0LCBkYXRhLCBvciBic3Mgc2VjdGlvbig/KS4gKn0KLS4jZGVmaW5lIFNFQ19DT05TVFJVQ1RPUl9URVhUIDB4MTEwMAotLiNkZWZpbmUgU0VDX0NPTlNUUlVDVE9SX0RBVEEgMHgyMTAwCi0uI2RlZmluZSBTRUNfQ09OU1RSVUNUT1JfQlNTICAweDMxMDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGhhcyBjb250ZW50cyAtIGEgZGF0YSBzZWN0aW9uIGNvdWxkIGJlCi0uICAgICAgICAgICA8PFNFQ19BTExPQz4+IHwgPDxTRUNfSEFTX0NPTlRFTlRTPj47IGEgZGVidWcgc2VjdGlvbiBjb3VsZCBiZQotLiAgICAgICAgICAgPDxTRUNfSEFTX0NPTlRFTlRTPj4gKn0KLS4jZGVmaW5lIFNFQ19IQVNfQ09OVEVOVFMgMHgyMDAKLS4KLS4gICAgICAgIHsqIEFuIGluc3RydWN0aW9uIHRvIHRoZSBsaW5rZXIgdG8gbm90IG91dHB1dCB0aGUgc2VjdGlvbgotLiAgICAgICAgICAgZXZlbiBpZiBpdCBoYXMgaW5mb3JtYXRpb24gd2hpY2ggd291bGQgbm9ybWFsbHkgYmUgd3JpdHRlbi4gKn0KLS4jZGVmaW5lIFNFQ19ORVZFUl9MT0FEIDB4NDAwCi0uCi0uICAgICAgICB7KiBUaGUgc2VjdGlvbiBpcyBhIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbi4gIFRoaXMgZmxhZyBpcwotLiAgICAgICAgICAgb25seSBmb3IgdGhlIGxpbmtlci4gIElmIHRoaXMgdHlwZSBvZiBzZWN0aW9uIGFwcGVhcnMgaW4KLS4gICAgICAgICAgIHRoZSBpbnB1dCBmaWxlLCB0aGUgbGlua2VyIG11c3QgY29weSBpdCB0byB0aGUgb3V0cHV0IGZpbGUKLS4gICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZtYSBvciBzaXplLiAgRklYTUU6IEFsdGhvdWdoIHRoaXMKLS4gICAgICAgICAgIHdhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIGdlbmVyYWwsIGl0IHJlYWxseSBpcyBDT0ZGCi0uICAgICAgICAgICBzcGVjaWZpYyAoYW5kIHRoZSBmbGFnIHdhcyByZW5hbWVkIHRvIGluZGljYXRlIHRoaXMpLiAgSXQKLS4gICAgICAgICAgIG1pZ2h0IGJlIGNsZWFuZXIgdG8gaGF2ZSBzb21lIG1vcmUgZ2VuZXJhbCBtZWNoYW5pc20gdG8KLS4gICAgICAgICAgIGFsbG93IHRoZSBiYWNrIGVuZCB0byBjb250cm9sIHdoYXQgdGhlIGxpbmtlciBkb2VzIHdpdGgKLS4gICAgICAgICAgIHNlY3Rpb25zLiAqfQotLiNkZWZpbmUgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgMHg4MDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIGNvbW1vbiBzeW1ib2xzIChzeW1ib2xzIG1heSBiZSBkZWZpbmVkCi0uICAgICAgICAgICBtdWx0aXBsZSB0aW1lcywgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGlzIHRoZSBhbW91bnQgb2YKLS4gICAgICAgICAgIHNwYWNlIGl0IHJlcXVpcmVzLCBhbmQgdGhlIGxhcmdlc3Qgc3ltYm9sIHZhbHVlIGlzIHRoZSBvbmUKLS4gICAgICAgICAgIHVzZWQpLiAgTW9zdCB0YXJnZXRzIGhhdmUgZXhhY3RseSBvbmUgb2YgdGhlc2UgKHdoaWNoIHdlCi0uCSAgICB0cmFuc2xhdGUgdG8gYmZkX2NvbV9zZWN0aW9uX3B0ciksIGJ1dCBFQ09GRiBoYXMgdHdvLiAqfQotLiNkZWZpbmUgU0VDX0lTX0NPTU1PTiAweDgwMDAKLS4KLS4gICAgICAgIHsqIFRoZSBzZWN0aW9uIGNvbnRhaW5zIG9ubHkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRm9yCi0uICAgICAgICAgICBleGFtcGxlLCB0aGlzIGlzIHNldCBmb3IgRUxGIC5kZWJ1ZyBhbmQgLnN0YWIgc2VjdGlvbnMuCi0uICAgICAgICAgICBzdHJpcCB0ZXN0cyB0aGlzIGZsYWcgdG8gc2VlIGlmIGEgc2VjdGlvbiBjYW4gYmUKLS4gICAgICAgICAgIGRpc2NhcmRlZC4gKn0KLS4jZGVmaW5lIFNFQ19ERUJVR0dJTkcgMHgxMDAwMAotLgotLiAgICAgICAgeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgaGVsZCBpbiBtZW1vcnkgcG9pbnRlZCB0bwotLiAgICAgICAgICAgYnkgdGhlIGNvbnRlbnRzIGZpZWxkLiAgVGhpcyBpcyBjaGVja2VkIGJ5Ci0uICAgICAgICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsIGFuZCB0aGUgZGF0YSBpcyByZXRyaWV2ZWQgZnJvbQotLiAgICAgICAgICAgbWVtb3J5IGlmIGFwcHJvcHJpYXRlLiAgKn0KLS4jZGVmaW5lIFNFQ19JTl9NRU1PUlkgMHgyMDAwMAotLgotLiAgICAgICAgeyogVGhlIGNvbnRlbnRzIG9mIHRoaXMgc2VjdGlvbiBhcmUgdG8gYmUgZXhjbHVkZWQgYnkgdGhlCi0uCSAgICBsaW5rZXIgZm9yIGV4ZWN1dGFibGUgYW5kIHNoYXJlZCBvYmplY3RzIHVubGVzcyB0aG9zZQotLgkgICAgb2JqZWN0cyBhcmUgdG8gYmUgZnVydGhlciByZWxvY2F0ZWQuICAqfQotLiNkZWZpbmUgU0VDX0VYQ0xVREUgMHg0MDAwMAotLgotLgl7KiBUaGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uIGFyZSB0byBiZSBzb3J0ZWQgYnkgdGhlCi0uCSAgIGJhc2VkIG9uIHRoZSBhZGRyZXNzIHNwZWNpZmllZCBpbiB0aGUgYXNzb2NpYXRlZCBzeW1ib2wKLS4JICAgdGFibGUuICAqfQotLiNkZWZpbmUgU0VDX1NPUlRfRU5UUklFUyAweDgwMDAwCi0uCi0uCXsqIFdoZW4gbGlua2luZywgZHVwbGljYXRlIHNlY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgc2hvdWxkIGJlCi0uCSAgIGRpc2NhcmRlZCwgcmF0aGVyIHRoYW4gYmVpbmcgY29tYmluZWQgaW50byBhIHNpbmdsZSBzZWN0aW9uIGFzCi0uCSAgIGlzIHVzdWFsbHkgZG9uZS4gIFRoaXMgaXMgc2ltaWxhciB0byBob3cgY29tbW9uIHN5bWJvbHMgYXJlCi0uCSAgIGhhbmRsZWQuICBTZWUgU0VDX0xJTktfRFVQTElDQVRFUyBiZWxvdy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19PTkNFIDB4MTAwMDAwCi0uCi0uCXsqIElmIFNFQ19MSU5LX09OQ0UgaXMgc2V0LCB0aGlzIGJpdGZpZWxkIGRlc2NyaWJlcyBob3cgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgaGFuZGxlIGR1cGxpY2F0ZSBzZWN0aW9ucy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTIDB4NjAwMDAwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCBkdXBsaWNhdGUKLS4JICAgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHNob3VsZCBzaW1wbHkgYmUgZGlzY2FyZGVkLiAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEIDB4MAotLgotLgl7KiBUaGlzIHZhbHVlIGZvciBTRUNfTElOS19EVVBMSUNBVEVTIG1lYW5zIHRoYXQgdGhlIGxpbmtlcgotLgkgICBzaG91bGQgd2FybiBpZiB0aGVyZSBhcmUgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucywgYWx0aG91Z2gKLS4JICAgaXQgc2hvdWxkIHN0aWxsIG9ubHkgbGluayBvbmUgY29weS4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZIDB4MjAwMDAwCi0uCi0uCXsqIFRoaXMgdmFsdWUgZm9yIFNFQ19MSU5LX0RVUExJQ0FURVMgbWVhbnMgdGhhdCB0aGUgbGlua2VyCi0uCSAgIHNob3VsZCB3YXJuIGlmIGFueSBkdXBsaWNhdGUgc2VjdGlvbnMgYXJlIGEgZGlmZmVyZW50IHNpemUuICAqfQotLiNkZWZpbmUgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkUgMHg0MDAwMDAKLS4KLS4JeyogVGhpcyB2YWx1ZSBmb3IgU0VDX0xJTktfRFVQTElDQVRFUyBtZWFucyB0aGF0IHRoZSBsaW5rZXIKLS4JICAgc2hvdWxkIHdhcm4gaWYgYW55IGR1cGxpY2F0ZSBzZWN0aW9ucyBjb250YWluIGRpZmZlcmVudAotLgkgICBjb250ZW50cy4gICp9Ci0uI2RlZmluZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFMgMHg2MDAwMDAKLS4KLS4JeyogVGhpcyBzZWN0aW9uIHdhcyBjcmVhdGVkIGJ5IHRoZSBsaW5rZXIgYXMgcGFydCBvZiBkeW5hbWljCi0uCSAgIHJlbG9jYXRpb24gb3Igb3RoZXIgYXJjYW5lIHByb2Nlc3NpbmcuICBJdCBpcyBza2lwcGVkIHdoZW4KLS4JICAgZ29pbmcgdGhyb3VnaCB0aGUgZmlyc3QtcGFzcyBvdXRwdXQsIHRydXN0aW5nIHRoYXQgc29tZW9uZQotLgkgICBlbHNlIHVwIHRoZSBsaW5lIHdpbGwgdGFrZSBjYXJlIG9mIGl0IGxhdGVyLiAgKn0KLS4jZGVmaW5lIFNFQ19MSU5LRVJfQ1JFQVRFRCAweDgwMDAwMAotLgotLgl7KiBUaGlzIHNlY3Rpb24gc2hvdWxkIG5vdCBiZSBzdWJqZWN0IHRvIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uI2RlZmluZSBTRUNfS0VFUCAweDEwMDAwMDAKLS4KLS4JeyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zICJzaG9ydCIgZGF0YSwgYW5kIHNob3VsZCBiZSBwbGFjZWQKLS4JICAgIm5lYXIiIHRoZSBHUC4gICp9Ci0uI2RlZmluZSBTRUNfU0hPUlQgMHgyMDAwMDAwCi0uCi0uCXsqICBFbmQgb2Ygc2VjdGlvbiBmbGFncy4gICp9Ci0uCi0uCXsqIFNvbWUgaW50ZXJuYWwgcGFja2VkIGJvb2xlYW4gZmllbGRzLiAgKn0KLS4KLS4JeyogU2VlIHRoZSB2bWEgZmllbGQuICAqfQotLgl1bnNpZ25lZCBpbnQgdXNlcl9zZXRfdm1hIDogMTsKLS4KLS4JeyogV2hldGhlciByZWxvY2F0aW9ucyBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKn0KLS4JdW5zaWduZWQgaW50IHJlbG9jX2RvbmUgOiAxOwotLgotLgl7KiBBIG1hcmsgZmxhZyB1c2VkIGJ5IHNvbWUgb2YgdGhlIGxpbmtlciBiYWNrZW5kcy4gICp9Ci0uCXVuc2lnbmVkIGludCBsaW5rZXJfbWFyayA6IDE7Ci0uCi0uCXsqIEEgbWFyayBmbGFnIHVzZWQgYnkgc29tZSBsaW5rZXIgYmFja2VuZHMgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gICp9Ci0uCXVuc2lnbmVkIGludCBnY19tYXJrIDogMTsKLS4KLS4JeyogRW5kIG9mIGludGVybmFsIHBhY2tlZCBib29sZWFuIGZpZWxkcy4gICp9Ci0uCi0uICAgICAgIHsqICBUaGUgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiAtIHdoZXJlIGl0IHdpbGwgYmUKLS4gICAgICAgICAgIGF0IHJ1biB0aW1lLiAgVGhlIHN5bWJvbHMgYXJlIHJlbG9jYXRlZCBhZ2FpbnN0IHRoaXMuICBUaGUKLS4JICAgIHVzZXJfc2V0X3ZtYSBmbGFnIGlzIG1haW50YWluZWQgYnkgYmZkOyBpZiBpdCdzIG5vdCBzZXQsIHRoZQotLgkgICAgYmFja2VuZCBjYW4gYXNzaWduIGFkZHJlc3NlcyAoZm9yIGV4YW1wbGUsIGluIDw8YS5vdXQ+Piwgd2hlcmUKLS4JICAgIHRoZSBkZWZhdWx0IGFkZHJlc3MgZm9yIDw8LmRhdGE+PiBpcyBkZXBlbmRlbnQgb24gdGhlIHNwZWNpZmljCi0uCSAgICB0YXJnZXQgYW5kIHZhcmlvdXMgZmxhZ3MpLiAgKn0KLS4KLS4gICBiZmRfdm1hIHZtYTsKLS4KLS4gICAgICAgeyogIFRoZSBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24gLSB3aGVyZSBpdCB3b3VsZCBiZSBpbiBhCi0uICAgICAgICAgICByb20gaW1hZ2U7IHJlYWxseSBvbmx5IHVzZWQgZm9yIHdyaXRpbmcgc2VjdGlvbiBoZWFkZXIKLS4JICAgIGluZm9ybWF0aW9uLiAqfQotLgotLiAgIGJmZF92bWEgbG1hOwotLgotLiAgICAgICAgeyogVGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gaW4gYnl0ZXMsIGFzIGl0IHdpbGwgYmUgb3V0cHV0LgotLiAgICAgICAgICAgY29udGFpbnMgYSB2YWx1ZSBldmVuIGlmIHRoZSBzZWN0aW9uIGhhcyBubyBjb250ZW50cyAoZS5nLiwgdGhlCi0uICAgICAgICAgICBzaXplIG9mIDw8LmJzcz4+KS4gVGhpcyB3aWxsIGJlIGZpbGxlZCBpbiBhZnRlciByZWxvY2F0aW9uICp9Ci0uCi0uICAgYmZkX3NpemVfdHlwZSBfY29va2VkX3NpemU7Ci0uCi0uICAgICAgICB7KiBUaGUgb3JpZ2luYWwgc2l6ZSBvbiBkaXNrIG9mIHRoZSBzZWN0aW9uLCBpbiBieXRlcy4gIE5vcm1hbGx5IHRoaXMKLS4JICAgIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBzaXplLCBidXQgaWYgc29tZSByZWxheGluZyBoYXMKLS4JICAgIGJlZW4gZG9uZSwgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgYmlnZ2VyLiAgKn0KLS4KLS4gICBiZmRfc2l6ZV90eXBlIF9yYXdfc2l6ZTsKLS4KLS4gICAgICAgIHsqIElmIHRoaXMgc2VjdGlvbiBpcyBnb2luZyB0byBiZSBvdXRwdXQsIHRoZW4gdGhpcyB2YWx1ZSBpcyB0aGUKLS4gICAgICAgICAgIG9mZnNldCBpbnRvIHRoZSBvdXRwdXQgc2VjdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgaW5wdXQKLS4gICAgICAgICAgIHNlY3Rpb24uIEUuZy4sIGlmIHRoaXMgd2FzIGdvaW5nIHRvIHN0YXJ0IGF0IHRoZSAxMDB0aCBieXRlIGluCi0uICAgICAgICAgICB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoaXMgdmFsdWUgd291bGQgYmUgMTAwLiAqfQotLgotLiAgIGJmZF92bWEgb3V0cHV0X29mZnNldDsKLS4KLS4gICAgICAgIHsqIFRoZSBvdXRwdXQgc2VjdGlvbiB0aHJvdWdoIHdoaWNoIHRvIG1hcCBvbiBvdXRwdXQuICp9Ci0uCi0uICAgc3RydWN0IHNlYyAqb3V0cHV0X3NlY3Rpb247Ci0uCi0uICAgICAgICB7KiBUaGUgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIHRoZSBzZWN0aW9uLCBhcyBhbiBleHBvbmVudCBvZiAyIC0KLS4gICAgICAgICAgIGUuZy4sIDMgYWxpZ25zIHRvIDJeMyAob3IgOCkuICp9Ci0uCi0uICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsKLS4KLS4gICAgICAgIHsqIElmIGFuIGlucHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiByZWxvY2F0aW9uCi0uICAgICAgICAgICByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICp9Ci0uCi0uICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICpyZWxvY2F0aW9uOwotLgotLiAgICAgICAgeyogSWYgYW4gb3V0cHV0IHNlY3Rpb24sIGEgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0bwotLiAgICAgICAgICAgcmVsb2NhdGlvbiByZWNvcmRzIGZvciB0aGUgZGF0YSBpbiB0aGlzIHNlY3Rpb24uICp9Ci0uCi0uICAgc3RydWN0IHJlbG9jX2NhY2hlX2VudHJ5ICoqb3JlbG9jYXRpb247Ci0uCi0uICAgICAgICB7KiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gcmVjb3JkcyBpbiBvbmUgb2YgdGhlIGFib3ZlICAqfQotLgotLiAgIHVuc2lnbmVkIHJlbG9jX2NvdW50OwotLgotLiAgICAgICAgeyogSW5mb3JtYXRpb24gYmVsb3cgaXMgYmFjayBlbmQgc3BlY2lmaWMgLSBhbmQgbm90IGFsd2F5cyB1c2VkCi0uICAgICAgICAgICBvciB1cGRhdGVkLiAgKn0KLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2Ygc2VjdGlvbiBkYXRhICAgICp9Ci0uCi0uICAgZmlsZV9wdHIgZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIEZpbGUgcG9zaXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvICp9Ci0uCi0uICAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0uCi0uICAgICAgICB7KiBGaWxlIHBvc2l0aW9uIG9mIGxpbmUgZGF0YSAgICAgICAqfQotLgotLiAgIGZpbGVfcHRyIGxpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFBvaW50ZXIgdG8gZGF0YSBmb3IgYXBwbGljYXRpb25zICp9Ci0uCi0uICAgUFRSIHVzZXJkYXRhOwotLgotLiAgICAgICAgeyogSWYgdGhlIFNFQ19JTl9NRU1PUlkgZmxhZyBpcyBzZXQsIHRoaXMgcG9pbnRzIHRvIHRoZSBhY3R1YWwKLS4gICAgICAgICAgIGNvbnRlbnRzLiAgKn0KLS4gICB1bnNpZ25lZCBjaGFyICpjb250ZW50czsKLS4KLS4gICAgICAgIHsqIEF0dGFjaGVkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uICp9Ci0uCi0uICAgYWxlbnQgKmxpbmVubzsKLS4KLS4gICAgICAgIHsqIE51bWJlciBvZiBsaW5lIG51bWJlciByZWNvcmRzICAgKn0KLS4KLS4gICB1bnNpZ25lZCBpbnQgbGluZW5vX2NvdW50OwotLgotLiAgICAgICAgeyogV2hlbiBhIHNlY3Rpb24gaXMgYmVpbmcgb3V0cHV0LCB0aGlzIHZhbHVlIGNoYW5nZXMgYXMgbW9yZQotLiAgICAgICAgICAgbGluZW51bWJlcnMgYXJlIHdyaXR0ZW4gb3V0ICp9Ci0uCi0uICAgZmlsZV9wdHIgbW92aW5nX2xpbmVfZmlsZXBvczsKLS4KLS4gICAgICAgIHsqIFdoYXQgdGhlIHNlY3Rpb24gbnVtYmVyIGlzIGluIHRoZSB0YXJnZXQgd29ybGQgICp9Ci0uCi0uICAgaW50IHRhcmdldF9pbmRleDsKLS4KLS4gICBQVFIgdXNlZF9ieV9iZmQ7Ci0uCi0uICAgICAgICB7KiBJZiB0aGlzIGlzIGEgY29uc3RydWN0b3Igc2VjdGlvbiB0aGVuIGhlcmUgaXMgYSBsaXN0IG9mIHRoZQotLiAgICAgICAgICAgcmVsb2NhdGlvbnMgY3JlYXRlZCB0byByZWxvY2F0ZSBpdGVtcyB3aXRoaW4gaXQuICp9Ci0uCi0uICAgc3RydWN0IHJlbGVudF9jaGFpbiAqY29uc3RydWN0b3JfY2hhaW47Ci0uCi0uICAgICAgICB7KiBUaGUgQkZEIHdoaWNoIG93bnMgdGhlIHNlY3Rpb24uICp9Ci0uCi0uICAgYmZkICpvd25lcjsKLS4KLS4JIHsqIEEgc3ltYm9sIHdoaWNoIHBvaW50cyBhdCB0aGlzIHNlY3Rpb24gb25seSAqfQotLiAgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bWJvbDsKLS4gICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9sX3B0cl9wdHI7Ci0uCi0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX2hlYWQ7Ci0uICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyX3RhaWw7Ci0ufSBhc2VjdGlvbiA7Ci0uCi0uICAgIHsqIFRoZXNlIHNlY3Rpb25zIGFyZSBnbG9iYWwsIGFuZCBhcmUgbWFuYWdlZCBieSBCRkQuICBUaGUgYXBwbGljYXRpb24KLS4gICAgICAgYW5kIHRhcmdldCBiYWNrIGVuZCBhcmUgbm90IHBlcm1pdHRlZCB0byBjaGFuZ2UgdGhlIHZhbHVlcyBpbgotLgl0aGVzZSBzZWN0aW9ucy4gIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIHNlY3Rpb25fcHRyIG1hY3JvcyByYXRoZXIKLS4gICAgICAgdGhhbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIGNvbnN0IHNlY3Rpb25zLiAgVGhlIGNvbnN0IHNlY3Rpb25zCi0uICAgICAgIG1heSBldmVudHVhbGx5IHZhbmlzaC4gICp9Ci0uI2RlZmluZSBCRkRfQUJTX1NFQ1RJT05fTkFNRSAiKkFCUyoiCi0uI2RlZmluZSBCRkRfVU5EX1NFQ1RJT05fTkFNRSAiKlVORCoiCi0uI2RlZmluZSBCRkRfQ09NX1NFQ1RJT05fTkFNRSAiKkNPTSoiCi0uI2RlZmluZSBCRkRfSU5EX1NFQ1RJT05fTkFNRSAiKklORCoiCi0uCi0uICAgIHsqIHRoZSBhYnNvbHV0ZSBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9hYnNfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9hYnNfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2Fic19zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2Fic19zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIHVuZGVmaW5lZCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF91bmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF91bmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX3VuZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX3VuZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF91bmRfc2VjdGlvbl9wdHIpCi0uICAgIHsqIFBvaW50ZXIgdG8gdGhlIGNvbW1vbiBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9jb21fc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9jb21fc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2NvbV9zZWN0aW9uKQotLiAgICB7KiBQb2ludGVyIHRvIHRoZSBpbmRpcmVjdCBzZWN0aW9uICp9Ci0uZXh0ZXJuIGNvbnN0IGFzZWN0aW9uIGJmZF9pbmRfc2VjdGlvbjsKLS4jZGVmaW5lIGJmZF9pbmRfc2VjdGlvbl9wdHIgKChhc2VjdGlvbiAqKSAmYmZkX2luZF9zZWN0aW9uKQotLiNkZWZpbmUgYmZkX2lzX2luZF9zZWN0aW9uKHNlYykgKChzZWMpID09IGJmZF9pbmRfc2VjdGlvbl9wdHIpCi0uCi0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfYWJzX3N5bWJvbDsKLS5leHRlcm4gY29uc3Qgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqIGNvbnN0IGJmZF9jb21fc3ltYm9sOwotLmV4dGVybiBjb25zdCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICogY29uc3QgYmZkX3VuZF9zeW1ib2w7Ci0uZXh0ZXJuIGNvbnN0IHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKiBjb25zdCBiZmRfaW5kX3N5bWJvbDsKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyhzZWN0aW9uKSBcCi0uICAgICAoc2VjdGlvbi0+cmVsb2NfZG9uZSA/IChhYm9ydCgpLDEpOiAoc2VjdGlvbiktPl9yYXdfc2l6ZSkKLS4jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX2FmdGVyX3JlbG9jKHNlY3Rpb24pIFwKLS4gICAgICgoc2VjdGlvbi0+cmVsb2NfZG9uZSkgPyAoc2VjdGlvbiktPl9jb29rZWRfc2l6ZTogKGFib3J0KCksMSkpCi0qLwotCi0vKiBUaGVzZSBzeW1ib2xzIGFyZSBnbG9iYWwsIG5vdCBzcGVjaWZpYyB0byBhbnkgQkZELiAgVGhlcmVmb3JlLCBhbnl0aGluZwotICAgdGhhdCB0cmllcyB0byBjaGFuZ2UgdGhlbSBpcyBicm9rZW4sIGFuZCBzaG91bGQgYmUgcmVwYWlyZWQuICAqLwotc3RhdGljIGNvbnN0IGFzeW1ib2wgZ2xvYmFsX3N5bXNbXSA9Ci17Ci0gLyogdGhlX2JmZCwgbmFtZSwgdmFsdWUsIGF0dHIsIHNlY3Rpb24gWywgdWRhdGFdICovCi0gIHswLCBCRkRfQ09NX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9jb21fc2VjdGlvbn0sCi0gIHswLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbn0sCi0gIHswLCBCRkRfQUJTX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9hYnNfc2VjdGlvbn0sCi0gIHswLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSwgMCwgQlNGX1NFQ1RJT05fU1lNLCAoYXNlY3Rpb24gKikgJmJmZF9pbmRfc2VjdGlvbn0sCi19OwotCi0jZGVmaW5lIFNURF9TRUNUSU9OKFNFQywgRkxBR1MsIFNZTSwgTkFNRSwgSURYKQlcCi0gIGNvbnN0IGFzeW1ib2wgKiBjb25zdCBTWU0gPSAoYXN5bWJvbCAqKSAmZ2xvYmFsX3N5bXNbSURYXTsgXAotICBjb25zdCBhc2VjdGlvbiBTRUMgPSBcCi0gICAgeyBOQU1FLCAwLCAwLCBGTEFHUywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgKGFzZWN0aW9uICopICZTRUMsIFwKLSAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBcCi0gICAgICAoYXN5bWJvbCAqKSAmZ2xvYmFsX3N5bXNbSURYXSwgKGFzeW1ib2wgKiopICZTWU0sIDAsIDAgfQotCi1TVERfU0VDVElPTiAoYmZkX2NvbV9zZWN0aW9uLCBTRUNfSVNfQ09NTU9OLCBiZmRfY29tX3N5bWJvbCwKLQkgICAgIEJGRF9DT01fU0VDVElPTl9OQU1FLCAwKTsKLVNURF9TRUNUSU9OIChiZmRfdW5kX3NlY3Rpb24sIDAsIGJmZF91bmRfc3ltYm9sLCBCRkRfVU5EX1NFQ1RJT05fTkFNRSwgMSk7Ci1TVERfU0VDVElPTiAoYmZkX2Fic19zZWN0aW9uLCAwLCBiZmRfYWJzX3N5bWJvbCwgQkZEX0FCU19TRUNUSU9OX05BTUUsIDIpOwotU1REX1NFQ1RJT04gKGJmZF9pbmRfc2VjdGlvbiwgMCwgYmZkX2luZF9zeW1ib2wsIEJGRF9JTkRfU0VDVElPTl9OQU1FLCAzKTsKLSN1bmRlZiBTVERfU0VDVElPTgotCi0vKgotRE9DREQKLUlOT0RFCi1zZWN0aW9uIHByb3RvdHlwZXMsICAsIHR5cGVkZWYgYXNlY3Rpb24sIFNlY3Rpb25zCi1TVUJTRUNUSU9OCi0JU2VjdGlvbiBwcm90b3R5cGVzCi0KLVRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIGV4cG9ydGVkIGJ5IHRoZSBzZWN0aW9uIGhhbmRsaW5nIHBhcnQgb2YgQkZELgotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2J5X25hbWUKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX2dldF9zZWN0aW9uX2J5X25hbWUoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLQlSdW4gdGhyb3VnaCBAdmFye2FiZmR9IGFuZCByZXR1cm4gdGhlIG9uZSBvZiB0aGUKLQk8PGFzZWN0aW9uPj5zIHdob3NlIG5hbWUgbWF0Y2hlcyBAdmFye25hbWV9LCBvdGhlcndpc2UgPDxOVUxMPj4uCi0JQHhyZWZ7U2VjdGlvbnN9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCVRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBzcGVjaWFsIGNhc2VzOyB0aGUgbm9ybWFsIHdheSB0byBwcm9jZXNzCi0JYWxsIHNlY3Rpb25zIG9mIGEgZ2l2ZW4gbmFtZSBpcyB0byB1c2UgPDxiZmRfbWFwX292ZXJfc2VjdGlvbnM+PiBhbmQKLQk8PHN0cmNtcD4+IG9uIHRoZSBuYW1lIChvciBiZXR0ZXIgeWV0LCBiYXNlIGl0IG9uIHRoZSBzZWN0aW9uIGZsYWdzCi0Jb3Igc29tZXRoaW5nIGVsc2UpIGZvciBlYWNoIHNlY3Rpb24uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjdDsKLQotICBmb3IgKHNlY3QgPSBhYmZkLT5zZWN0aW9uczsgc2VjdCAhPSBOVUxMOyBzZWN0ID0gc2VjdC0+bmV4dCkKLSAgICBpZiAoIXN0cmNtcCAoc2VjdC0+bmFtZSwgbmFtZSkpCi0gICAgICByZXR1cm4gc2VjdDsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5Ci0KLVNZTk9QU0lTCi0JYXNlY3Rpb24gKmJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShiZmQgKmFiZmQsIENPTlNUIGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9Ci0JYW5kIGF0dGFjaCBpdCB0byB0aGUgZW5kIG9mIHRoZSBjaGFpbiBvZiBzZWN0aW9ucyBmb3IgdGhlCi0JQkZEIEB2YXJ7YWJmZH0uIEFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgc2VjdGlvbiB3aXRoIGEgbmFtZSB3aGljaAotCWlzIGFscmVhZHkgaW4gdXNlIHJldHVybnMgaXRzIHBvaW50ZXIgd2l0aG91dCBjaGFuZ2luZyB0aGUKLQlzZWN0aW9uIGNoYWluLgotCi0JSXQgaGFzIHRoZSBmdW5ueSBuYW1lIHNpbmNlIHRoaXMgaXMgdGhlIHdheSBpdCB1c2VkIHRvIGJlCi0JYmVmb3JlIGl0IHdhcyByZXdyaXR0ZW4uLi4uCi0KLQlQb3NzaWJsZSBlcnJvcnMgYXJlOgotCW8gPDxiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24+PiAtCi0JSWYgb3V0cHV0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgZm9yIHRoaXMgQkZELgotCW8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLQotCUlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgotCi0qLwotCi0KLWFzZWN0aW9uICoKLWJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBhc2VjdGlvbiAqc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWUpOwotICBpZiAoc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIG5hbWUpOwotICAgIH0KLSAgcmV0dXJuIHNlYzsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkKLQotU1lOT1BTSVMKLQlhc2VjdGlvbiAqYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkoYmZkICphYmZkLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIENyZWF0ZSBhIG5ldyBlbXB0eSBzZWN0aW9uIGNhbGxlZCBAdmFye25hbWV9IGFuZCBhdHRhY2ggaXQgdG8gdGhlIGVuZCBvZgotICAgdGhlIGNoYWluIG9mIHNlY3Rpb25zIGZvciBAdmFye2FiZmR9LiAgQ3JlYXRlIGEgbmV3IHNlY3Rpb24gZXZlbiBpZiB0aGVyZQotICAgaXMgYWxyZWFkeSBhIHNlY3Rpb24gd2l0aCB0aGF0IG5hbWUuCi0KLSAgIFJldHVybiA8PE5VTEw+PiBhbmQgc2V0IDw8YmZkX2Vycm9yPj4gb24gZXJyb3I7IHBvc3NpYmxlIGVycm9ycyBhcmU6Ci0gICBvIDw8YmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uPj4gLSBJZiBvdXRwdXQgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgQHZhcnthYmZkfS4KLSAgIG8gPDxiZmRfZXJyb3Jfbm9fbWVtb3J5Pj4gLSBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KLSovCi0KLXNlY19wdHIKLWJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpuZXdzZWN0OwotICBhc2VjdGlvbiAqKnByZXYgPSAmYWJmZC0+c2VjdGlvbnM7Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKGFiZmQtPm91dHB1dF9oYXNfYmVndW4pCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICB3aGlsZSAoc2VjdCkKLSAgICB7Ci0gICAgICBwcmV2ID0gJnNlY3QtPm5leHQ7Ci0gICAgICBzZWN0ID0gc2VjdC0+bmV4dDsKLSAgICB9Ci0KLSAgbmV3c2VjdCA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChuZXdzZWN0ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgbmV3c2VjdC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPmluZGV4ID0gYWJmZC0+c2VjdGlvbl9jb3VudCsrOwotICBuZXdzZWN0LT5mbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBuZXdzZWN0LT51c2VyZGF0YSA9IE5VTEw7Ci0gIG5ld3NlY3QtPmNvbnRlbnRzID0gTlVMTDsKLSAgbmV3c2VjdC0+bmV4dCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBuZXdzZWN0LT5yZWxvY2F0aW9uID0gKGFyZWxlbnQgKikgTlVMTDsKLSAgbmV3c2VjdC0+cmVsb2NfY291bnQgPSAwOwotICBuZXdzZWN0LT5saW5lX2ZpbGVwb3MgPSAwOwotICBuZXdzZWN0LT5vd25lciA9IGFiZmQ7Ci0KLSAgLyogQ3JlYXRlIGEgc3ltYm9sIHdob3Mgb25seSBqb2IgaXMgdG8gcG9pbnQgdG8gdGhpcyBzZWN0aW9uLiBUaGlzIGlzCi0gICAgIHVzZWZ1bCBmb3IgdGhpbmdzIGxpa2UgcmVsb2NzIHdoaWNoIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSBvZiBhCi0gICAgIHNlY3Rpb24uICAqLwotICBuZXdzZWN0LT5zeW1ib2wgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAobmV3c2VjdC0+c3ltYm9sID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+bmFtZSA9IG5hbWU7Ci0gIG5ld3NlY3QtPnN5bWJvbC0+dmFsdWUgPSAwOwotICBuZXdzZWN0LT5zeW1ib2wtPnNlY3Rpb24gPSBuZXdzZWN0OwotICBuZXdzZWN0LT5zeW1ib2wtPmZsYWdzID0gQlNGX1NFQ1RJT05fU1lNOwotCi0gIG5ld3NlY3QtPnN5bWJvbF9wdHJfcHRyID0gJm5ld3NlY3QtPnN5bWJvbDsKLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9uZXdfc2VjdGlvbl9ob29rLCAoYWJmZCwgbmV3c2VjdCkpICE9IHRydWUpCi0gICAgewotICAgICAgZnJlZSAobmV3c2VjdCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgKnByZXYgPSBuZXdzZWN0OwotICByZXR1cm4gbmV3c2VjdDsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2Vfc2VjdGlvbgotCi1TWU5PUFNJUwotCWFzZWN0aW9uICpiZmRfbWFrZV9zZWN0aW9uKGJmZCAqLCBDT05TVCBjaGFyICpuYW1lKTsKLQotREVTQ1JJUFRJT04KLSAgIExpa2UgPDxiZmRfbWFrZV9zZWN0aW9uX2FueXdheT4+LCBidXQgcmV0dXJuIDw8TlVMTD4+ICh3aXRob3V0IGNhbGxpbmcKLSAgIGJmZF9zZXRfZXJyb3IgKCkpIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHNlY3Rpb24gY2hhaW4gaWYgdGhlcmUgaXMgYWxyZWFkeSBhCi0gICBzZWN0aW9uIG5hbWVkIEB2YXJ7bmFtZX0uICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgcmV0dXJuIDw8TlVMTD4+IGFuZCBzZXQKLSAgIDw8YmZkX2Vycm9yPj4uCi0qLwotCi1hc2VjdGlvbiAqCi1iZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGFzZWN0aW9uICpzZWN0ID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgQkZEX0FCU19TRUNUSU9OX05BTUUpID09IDApCi0gICAgewotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfQ09NX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLSAgICB9Ci0gIGlmIChzdHJjbXAgKG5hbWUsIEJGRF9VTkRfU0VDVElPTl9OQU1FKSA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiBiZmRfdW5kX3NlY3Rpb25fcHRyOwotICAgIH0KLQotICBpZiAoc3RyY21wIChuYW1lLCBCRkRfSU5EX1NFQ1RJT05fTkFNRSkgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gYmZkX2luZF9zZWN0aW9uX3B0cjsKLSAgICB9Ci0KLSAgd2hpbGUgKHNlY3QpCi0gICAgewotICAgICAgaWYgKCFzdHJjbXAgKHNlY3QtPm5hbWUsIG5hbWUpKQotCXJldHVybiBOVUxMOwotICAgICAgc2VjdCA9IHNlY3QtPm5leHQ7Ci0gICAgfQotCi0gIC8qIFRoZSBuYW1lIGlzIG5vdCBhbHJlYWR5IHVzZWQ7IGdvIGFoZWFkIGFuZCBtYWtlIGEgbmV3IHNlY3Rpb24uICAqLwotICByZXR1cm4gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5hbWUpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9mbGFncwotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX3NldF9zZWN0aW9uX2ZsYWdzKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgZmxhZ3dvcmQgZmxhZ3MpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgc2VjdGlvbiBAdmFye3NlY30gaW4gdGhlIEJGRAotCUB2YXJ7YWJmZH0gdG8gdGhlIHZhbHVlIEB2YXJ7ZmxhZ3N9LiBSZXR1cm4gPDx0cnVlPj4gb24gc3VjY2VzcywKLQk8PGZhbHNlPj4gb24gZXJyb3IuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlUaGUgc2VjdGlvbiBjYW5ub3QgaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGUgYXR0cmlidXRlcwotCXJlcXVlc3RlZC4gRm9yIGV4YW1wbGUsIGEgLmJzcyBzZWN0aW9uIGluIDw8YS5vdXQ+PiBtYXkgbm90Ci0JaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4gZmllbGQgc2V0LgotCi0qLwotCi0vKkFSR1NVU0VEKi8KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgZmxhZ3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBmbGFnd29yZCBmbGFnczsKLXsKLSNpZiAwCi0gIC8qIElmIHlvdSB0cnkgdG8gY29weSBhIHRleHQgc2VjdGlvbiBmcm9tIGFuIGlucHV0IGZpbGUgKHdoZXJlIGl0Ci0gICAgIGhhcyB0aGUgU0VDX0NPREUgZmxhZyBzZXQpIHRvIGFuIG91dHB1dCBmaWxlLCB0aGlzIGxvc2VzIGJpZyBpZgotICAgICB0aGUgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoYWJmZCkgZG9lc24ndCBoYXZlIHRoZSBTRUNfQ09ERQotICAgICBzZXQgLSB3aGljaCBpdCBkb2Vzbid0LCBhdCBsZWFzdCBub3QgZm9yIGEub3V0LiAgRklYTUUgKi8KLQotICBpZiAoKGZsYWdzICYgYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoYWJmZCkpICE9IGZsYWdzKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotI2VuZGlmCi0KLSAgc2VjdGlvbi0+ZmxhZ3MgPSBmbGFnczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21hcF9vdmVyX3NlY3Rpb25zCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfbWFwX292ZXJfc2VjdGlvbnMoYmZkICphYmZkLAotCQkJCSAgIHZvaWQgKCpmdW5jKShiZmQgKmFiZmQsCi0JCQkJCQlhc2VjdGlvbiAqc2VjdCwKLQkJCQkJCVBUUiBvYmopLAotCQkJCSAgIFBUUiBvYmopOwotCi1ERVNDUklQVElPTgotCUNhbGwgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIEB2YXJ7ZnVuY30gZm9yIGVhY2ggc2VjdGlvbgotCWF0dGFjaGVkIHRvIHRoZSBCRkQgQHZhcnthYmZkfSwgcGFzc2luZyBAdmFye29ian0gYXMgYW4KLQlhcmd1bWVudC4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFzIGlmIGJ5Ci0KLXwJZnVuYyhhYmZkLCB0aGVfc2VjdGlvbiwgb2JqKTsKLQotCVRoaXMgaXMgdGhlIHByZWZlcmVkIG1ldGhvZCBmb3IgaXRlcmF0aW5nIG92ZXIgc2VjdGlvbnM7IGFuCi0JYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gdXNlIGEgbG9vcDoKLQotfAkgICBzZWN0aW9uICpwOwotfAkgICBmb3IgKHAgPSBhYmZkLT5zZWN0aW9uczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLXwJICAgICAgZnVuYyhhYmZkLCBwLCAuLi4pCi0KLQotKi8KLQotLypWQVJBUkdTMiovCi12b2lkCi1iZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIG9wZXJhdGlvbiwgdXNlcl9zdG9yYWdlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHZvaWQgKCpvcGVyYXRpb24pIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGFzZWN0aW9uICogc2VjdCwgUFRSIG9iaikpOwotICAgICBQVFIgdXNlcl9zdG9yYWdlOwotewotICBhc2VjdGlvbiAqc2VjdDsKLSAgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIGZvciAoc2VjdCA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0ICE9IE5VTEw7IGkrKywgc2VjdCA9IHNlY3QtPm5leHQpCi0gICAgKCpvcGVyYXRpb24pIChhYmZkLCBzZWN0LCB1c2VyX3N0b3JhZ2UpOwotCi0gIGlmIChpICE9IGFiZmQtPnNlY3Rpb25fY291bnQpCS8qIERlYnVnZ2luZyAqLwotICAgIGFib3J0ICgpOwotfQotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc2VjdGlvbl9zaXplCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3NlY3Rpb25fc2l6ZShiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWMsIGJmZF9zaXplX3R5cGUgdmFsKTsKLQotREVTQ1JJUFRJT04KLQlTZXQgQHZhcntzZWN9IHRvIHRoZSBzaXplIEB2YXJ7dmFsfS4gSWYgdGhlIG9wZXJhdGlvbiBpcwotCW9rLCB0aGVuIDw8dHJ1ZT4+IGlzIHJldHVybmVkLCBlbHNlIDw8ZmFsc2U+Pi4KLQotCVBvc3NpYmxlIGVycm9yIHJldHVybnM6Ci0JbyA8PGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbj4+IC0KLQlXcml0aW5nIGhhcyBzdGFydGVkIHRvIHRoZSBCRkQsIHNvIHNldHRpbmcgdGhlIHNpemUgaXMgaW52YWxpZC4KLQotKi8KLQotYm9vbGVhbgotYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHB0ciwgdmFsKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgcHRyOwotICAgICBiZmRfc2l6ZV90eXBlIHZhbDsKLXsKLSAgLyogT25jZSB5b3UndmUgc3RhcnRlZCB3cml0aW5nIHRvIGFueSBzZWN0aW9uIHlvdSBjYW5ub3QgY3JlYXRlIG9yIGNoYW5nZQotICAgICB0aGUgc2l6ZSBvZiBhbnkgb3RoZXJzLiAqLwotCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHB0ci0+X2Nvb2tlZF9zaXplID0gdmFsOwotICBwdHItPl9yYXdfc2l6ZSA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgICAgICAgIChiZmQgKmFiZmQsCi0gICAgICAgICBhc2VjdGlvbiAqc2VjdGlvbiwKLSAgICAgICAgIFBUUiBkYXRhLAotICAgICAgICAgZmlsZV9wdHIgb2Zmc2V0LAotICAgICAgICAgYmZkX3NpemVfdHlwZSBjb3VudCk7Ci0KLQotREVTQ1JJUFRJT04KLQlTZXRzIHRoZSBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBAdmFye3NlY3Rpb259IGluIEJGRAotCUB2YXJ7YWJmZH0gdG8gdGhlIGRhdGEgc3RhcnRpbmcgaW4gbWVtb3J5IGF0IEB2YXJ7ZGF0YX0uIFRoZQotCWRhdGEgaXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24gc3RhcnRpbmcgYXQgb2Zmc2V0Ci0JQHZhcntvZmZzZXR9IGZvciBAdmFye2NvdW50fSBieXRlcy4KLQotCi0KLQlOb3JtYWxseSA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZSA8PGZhbHNlPj4uIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0JbyA8PGJmZF9lcnJvcl9ub19jb250ZW50cz4+IC0KLQlUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUgPDxTRUNfSEFTX0NPTlRFTlRTPj4KLQlhdHRyaWJ1dGUsIHNvIG5vdGhpbmcgY2FuIGJlIHdyaXR0ZW4gdG8gaXQuCi0JbyBhbmQgc29tZSBtb3JlIHRvbwotCi0JVGhpcyByb3V0aW5lIGlzIGZyb250IGVuZCB0byB0aGUgYmFjayBlbmQgZnVuY3Rpb24KLQk8PF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHM+Pi4KLQotCi0qLwotCi0jZGVmaW5lIGJmZF9nZXRfc2VjdGlvbl9zaXplX25vdyhhYmZkLHNlYykgXAotKHNlYy0+cmVsb2NfZG9uZSBcCi0gPyBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9hZnRlcl9yZWxvYyAoc2VjKSBcCi0gOiBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYykpCi0KLWJvb2xlYW4KLWJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgYmZkX3NpemVfdHlwZSBzejsKLQotICBpZiAoIShiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2NvbnRlbnRzKTsKLSAgICAgIHJldHVybiAoZmFsc2UpOwotICAgIH0KLQotICBpZiAob2Zmc2V0IDwgMCkKLSAgICB7Ci0gICAgYmFkX3ZhbDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc3ogPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9ub3cgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoKGJmZF9zaXplX3R5cGUpIG9mZnNldCA+IHN6Ci0gICAgICB8fCBjb3VudCA+IHN6Ci0gICAgICB8fCBvZmZzZXQgKyBjb3VudCA+IHN6KQotICAgIGdvdG8gYmFkX3ZhbDsKLQotICBzd2l0Y2ggKGFiZmQtPmRpcmVjdGlvbikKLSAgICB7Ci0gICAgY2FzZSByZWFkX2RpcmVjdGlvbjoKLSAgICBjYXNlIG5vX2RpcmVjdGlvbjoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIHdyaXRlX2RpcmVjdGlvbjoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBib3RoX2RpcmVjdGlvbjoKLSAgICAgIC8qIEZpbGUgaXMgb3BlbmVkIGZvciB1cGRhdGUuIGBvdXRwdXRfaGFzX2JlZ3VuJyBzb21lIHRpbWUgYWdvIHdoZW4KLQkgICB0aGUgZmlsZSB3YXMgY3JlYXRlZC4gIERvIG5vdCByZWNvbXB1dGUgc2VjdGlvbnMgc2l6ZXMgb3IgYWxpZ25tZW50cwotCSAgIGluIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudC4gICovCi0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoQkZEX1NFTkQgKGFiZmQsIF9iZmRfc2V0X3NlY3Rpb25fY29udGVudHMsCi0JCShhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpKQotICAgIHsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgICAgICAgKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBsb2NhdGlvbiwKLSAgICAgICAgIGZpbGVfcHRyIG9mZnNldCwgYmZkX3NpemVfdHlwZSBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JUmVhZCBkYXRhIGZyb20gQHZhcntzZWN0aW9ufSBpbiBCRkQgQHZhcnthYmZkfQotCWludG8gbWVtb3J5IHN0YXJ0aW5nIGF0IEB2YXJ7bG9jYXRpb259LiBUaGUgZGF0YSBpcyByZWFkIGF0IGFuCi0Jb2Zmc2V0IG9mIEB2YXJ7b2Zmc2V0fSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgc2VjdGlvbiwKLQlhbmQgaXMgcmVhZCBmb3IgQHZhcntjb3VudH0gYnl0ZXMuCi0KLQlJZiB0aGUgY29udGVudHMgb2YgYSBjb25zdHJ1Y3RvciB3aXRoIHRoZSA8PFNFQ19DT05TVFJVQ1RPUj4+Ci0JZmxhZyBzZXQgYXJlIHJlcXVlc3RlZCBvciBpZiB0aGUgc2VjdGlvbiBkb2VzIG5vdCBoYXZlIHRoZQotCTw8U0VDX0hBU19DT05URU5UUz4+IGZsYWcgc2V0LCB0aGVuIHRoZSBAdmFye2xvY2F0aW9ufSBpcyBmaWxsZWQKLQl3aXRoIHplcm9lcy4gSWYgbm8gZXJyb3JzIG9jY3VyLCA8PHRydWU+PiBpcyByZXR1cm5lZCwgZWxzZQotCTw8ZmFsc2U+Pi4KLQotCi0KLSovCi1ib29sZWFuCi1iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3o7Ci0KLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPTlNUUlVDVE9SKQotICAgIHsKLSAgICAgIG1lbXNldCAobG9jYXRpb24sIDAsICh1bnNpZ25lZCkgY291bnQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChvZmZzZXQgPCAwKQotICAgIHsKLSAgICBiYWRfdmFsOgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBFdmVuIGlmIHJlbG9jX2RvbmUgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiByZWFkcyB1bnJlbG9jYXRlZAotICAgICBjb250ZW50cywgc28gd2Ugd2FudCB0aGUgcmF3IHNpemUuICAqLwotICBzeiA9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLSAgaWYgKChiZmRfc2l6ZV90eXBlKSBvZmZzZXQgPiBzeiB8fCBjb3VudCA+IHN6IHx8IG9mZnNldCArIGNvdW50ID4gc3opCi0gICAgZ290byBiYWRfdmFsOwotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIC8qIERvbid0IGJvdGhlci4gICovCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0gICAgewotICAgICAgbWVtc2V0IChsb2NhdGlvbiwgMCwgKHVuc2lnbmVkKSBjb3VudCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19JTl9NRU1PUlkpICE9IDApCi0gICAgewotICAgICAgbWVtY3B5IChsb2NhdGlvbiwgc2VjdGlvbi0+Y29udGVudHMgKyBvZmZzZXQsIChzaXplX3QpIGNvdW50KTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICByZXR1cm4gQkZEX1NFTkQgKGFiZmQsIF9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHMsCi0JCSAgIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkpOwotfQotCi0vKgotRlVOQ1RJT04KLQliZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YQotCi1TWU5PUFNJUwotCWJvb2xlYW4gYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEoYmZkICppYmZkLCBhc2VjdGlvbiAqaXNlYywgYmZkICpvYmZkLCBhc2VjdGlvbiAqb3NlYyk7Ci0KLURFU0NSSVBUSU9OCi0JQ29weSBwcml2YXRlIHNlY3Rpb24gaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzZWN9IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzZWN0aW9uIEB2YXJ7b3NlY30gaW4gdGhlIEJGRCBAdmFye29iZmR9LgotCVJldHVybiA8PHRydWU+PiBvbiBzdWNjZXNzLCA8PGZhbHNlPj4gb24gZXJyb3IuICBQb3NzaWJsZSBlcnJvcgotCXJldHVybnMgYXJlOgotCi0JbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0JTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b3NlY30uCi0KLS4jZGVmaW5lIGJmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikgXAotLiAgICAgQkZEX1NFTkQgKG9iZmQsIF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSwgXAotLgkJKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikpCi0qLwotCi0vKgotRlVOQ1RJT04KLQlfYmZkX3N0cmlwX3NlY3Rpb25fZnJvbV9vdXRwdXQKLQotU1lOT1BTSVMKLQl2b2lkIF9iZmRfc3RyaXBfc2VjdGlvbl9mcm9tX291dHB1dAotCShhc2VjdGlvbiAqc2VjdGlvbik7Ci0KLURFU0NSSVBUSU9OCi0JUmVtb3ZlIEB2YXJ7c2VjdGlvbn0gZnJvbSB0aGUgb3V0cHV0LiAgSWYgdGhlIG91dHB1dCBzZWN0aW9uIGJlY29tZXMKLQllbXB0eSwgcmVtb3ZlIGl0IGZyb20gdGhlIG91dHB1dCBiZmQuCi0qLwotdm9pZAotX2JmZF9zdHJpcF9zZWN0aW9uX2Zyb21fb3V0cHV0IChzKQotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgYXNlY3Rpb24gKipzcHAsICpvczsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpwLCAqcHA7Ci0KLSAgLyogRXhjaXNlIHRoZSBpbnB1dCBzZWN0aW9uIGZyb20gdGhlIGxpbmsgb3JkZXIuICAqLwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmb3IgKHAgPSBvcy0+bGlua19vcmRlcl9oZWFkLCBwcCA9IE5VTEw7IHAgIT0gTlVMTDsgcHAgPSBwLCBwID0gcC0+bmV4dCkKLSAgICBpZiAocC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcgotCSYmIHAtPnUuaW5kaXJlY3Quc2VjdGlvbiA9PSBzKQotICAgICAgewotCWlmIChwcCkKLQkgIHBwLT5uZXh0ID0gcC0+bmV4dDsKLQllbHNlCi0JICBvcy0+bGlua19vcmRlcl9oZWFkID0gcC0+bmV4dDsKLQlpZiAoIXAtPm5leHQpCi0JICBvcy0+bGlua19vcmRlcl90YWlsID0gcHA7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgLyogSWYgdGhlIG91dHB1dCBzZWN0aW9uIGlzIGVtcHR5LCByZW1vdmUgaXQgdG9vLiAgQ2FyZWZ1bCBhYm91dCBzZWN0aW9ucwotICAgICB0aGF0IGhhdmUgYmVlbiBkaXNjYXJkZWQgaW4gdGhlIGxpbmsgc2NyaXB0IC0tIHRoZXkgYXJlIG1hcHBlZCB0byAKLSAgICAgYmZkX2Fic19zZWN0aW9uLCB3aGljaCBoYXMgbm8gb3duZXIuICAqLwotICBpZiAoIW9zLT5saW5rX29yZGVyX2hlYWQgJiYgb3MtPm93bmVyKQotICAgIHsKLSAgICAgIGZvciAoc3BwID0gJm9zLT5vd25lci0+c2VjdGlvbnM7ICpzcHA7IHNwcCA9ICYoKnNwcCktPm5leHQpCi0JaWYgKCpzcHAgPT0gb3MpCi0JICB7Ci0JICAgICpzcHAgPSBvcy0+bmV4dDsKLQkgICAgb3MtPm93bmVyLT5zZWN0aW9uX2NvdW50LS07Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JmZC9zb20uYyBiL2JmZC9zb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxZmFjMC4uMDAwMDAwMAotLS0gYS9iZmQvc29tLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjYzICswLDAgQEAKLS8qIGJmZCBiYWNrLWVuZCBmb3IgSFAgUEEtUklTQyBTT00gb2JqZWN0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBDb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZQotICAgVW5pdmVyc2l0eSBvZiBVdGFoIChwYS1nZGItYnVnc0Bjcy51dGFoLmVkdSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2lmIGRlZmluZWQgKEhPU1RfSFBQQUhQVVgpIHx8IGRlZmluZWQgKEhPU1RfSFBQQUJTRCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBT1NGKSB8fCBkZWZpbmVkKEhPU1RfSFBQQU1QRUlYKQotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAic29tLmgiCi0KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNpbmNsdWRlIDxtYWNoaW5lL3JlZy5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogTWFnaWMgbm90IGRlZmluZWQgaW4gc3RhbmRhcmQgSFAtVVggaGVhZGVyIGZpbGVzIHVudGlsIDguMCAqLwotCi0jaWZuZGVmIENQVV9QQV9SSVNDMV8wCi0jZGVmaW5lIENQVV9QQV9SSVNDMV8wIDB4MjBCCi0jZW5kaWYgLyogQ1BVX1BBX1JJU0MxXzAgKi8KLQotI2lmbmRlZiBDUFVfUEFfUklTQzFfMQotI2RlZmluZSBDUFVfUEFfUklTQzFfMSAweDIxMAotI2VuZGlmIC8qIENQVV9QQV9SSVNDMV8xICovCi0KLSNpZm5kZWYgQ1BVX1BBX1JJU0MyXzAKLSNkZWZpbmUgQ1BVX1BBX1JJU0MyXzAgMHgyMTQKLSNlbmRpZiAvKiBDUFVfUEFfUklTQzJfMCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDMV8wX0lECi0jZGVmaW5lIF9QQV9SSVNDMV8wX0lEIENQVV9QQV9SSVNDMV8wCi0jZW5kaWYgLyogX1BBX1JJU0MxXzBfSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQzFfMV9JRAotI2RlZmluZSBfUEFfUklTQzFfMV9JRCBDUFVfUEFfUklTQzFfMQotI2VuZGlmIC8qIF9QQV9SSVNDMV8xX0lEICovCi0KLSNpZm5kZWYgX1BBX1JJU0MyXzBfSUQKLSNkZWZpbmUgX1BBX1JJU0MyXzBfSUQgQ1BVX1BBX1JJU0MyXzAKLSNlbmRpZiAvKiBfUEFfUklTQzJfMF9JRCAqLwotCi0jaWZuZGVmIF9QQV9SSVNDX01BWElECi0jZGVmaW5lIF9QQV9SSVNDX01BWElECTB4MkZGCi0jZW5kaWYgLyogX1BBX1JJU0NfTUFYSUQgKi8KLQotI2lmbmRlZiBfUEFfUklTQ19JRAotI2RlZmluZSBfUEFfUklTQ19JRChfX21fbnVtKQkJXAotICAgICgoKF9fbV9udW0pID09IF9QQV9SSVNDMV8wX0lEKSB8fAlcCi0gICAgICgoX19tX251bSkgPj0gX1BBX1JJU0MxXzFfSUQgJiYgKF9fbV9udW0pIDw9IF9QQV9SSVNDX01BWElEKSkKLSNlbmRpZiAvKiBfUEFfUklTQ19JRCAqLwotCi0KLS8qIEhJVVggaW4gaXQncyBpbmZpbml0ZSBzdHVwaWRpdHkgY2hhbmdlZCB0aGUgbmFtZXMgZm9yIHNldmVyYWwgIndlbGwKLSAgIGtub3duIiBjb25zdGFudHMuICBXb3JrIGFyb3VuZCBzdWNoIGJyYWluZGFtYWdlLiAgVHJ5IHRoZSBIUFVYIHZlcnNpb24KLSAgIGZpcnN0LCB0aGVuIHRoZSBISVVYIHZlcnNpb24sIGFuZCBmaW5hbGx5IHByb3ZpZGUgYSBkZWZhdWx0LiAgKi8KLSNpZmRlZiBIUFVYX0FVWF9JRAotI2RlZmluZSBFWEVDX0FVWF9JRCBIUFVYX0FVWF9JRAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoRVhFQ19BVVhfSUQpICYmIGRlZmluZWQgKEhJVVhfQVVYX0lEKQotI2RlZmluZSBFWEVDX0FVWF9JRCBISVVYX0FVWF9JRAotI2VuZGlmCi0KLSNpZm5kZWYgRVhFQ19BVVhfSUQKLSNkZWZpbmUgRVhFQ19BVVhfSUQgMAotI2VuZGlmCi0KLS8qIFNpemUgKGluIGNoYXJzKSBvZiB0aGUgdGVtcG9yYXJ5IGJ1ZmZlcnMgdXNlZCBkdXJpbmcgZml4dXAgYW5kIHN0cmluZwotICAgdGFibGUgd3JpdGVzLiAgICovCi0gICAKLSNkZWZpbmUgU09NX1RNUF9CVUZTSVpFIDgxOTIKLQotLyogU2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBpbiBhcmNoaXZlcy4gICovCi0jZGVmaW5lIFNPTV9MU1RfSEFTSF9TSVpFIDMxCi0KLS8qIE1heCBudW1iZXIgb2YgU09NcyB0byBiZSBmb3VuZCBpbiBhbiBhcmNoaXZlLiAgKi8KLSNkZWZpbmUgU09NX0xTVF9NT0RVTEVfTElNSVQgMTAyNAotCi0vKiBHZW5lcmljIGFsaWdubWVudCBtYWNyby4gICovCi0jZGVmaW5lIFNPTV9BTElHTih2YWwsIGFsaWdubWVudCkgXAotICAoKCh2YWwpICsgKGFsaWdubWVudCkgLSAxKSAmIH4oKGFsaWdubWVudCkgLSAxKSkKLQotLyogU09NIGFsbG93cyBhbnkgb25lIG9mIHRoZSBmb3VyIHByZXZpb3VzIHJlbG9jYXRpb25zIHRvIGJlIHJldXNlZAotICAgd2l0aCBhICJSX1BSRVZfRklYVVAiIHJlbG9jYXRpb24gZW50cnkuICBTaW5jZSBSX1BSRVZfRklYVVAKLSAgIHJlbG9jYXRpb25zIGFyZSBhbHdheXMgYSBzaW5nbGUgYnl0ZSwgdXNpbmcgYSBSX1BSRVZfRklYVVAgaW5zdGVhZAotICAgb2Ygc29tZSBtdWx0aS1ieXRlIHJlbG9jYXRpb24gbWFrZXMgb2JqZWN0IGZpbGVzIHNtYWxsZXIuIAotCi0gICBOb3RlIG9uZSBzaWRlIGVmZmVjdCBvZiB1c2luZyBhIFJfUFJFVl9GSVhVUCBpcyB0aGUgcmVsb2NhdGlvbiB0aGF0Ci0gICBpcyBiZWluZyByZXBlYXRlZCBtb3ZlcyB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAgKi8KLXN0cnVjdCByZWxvY19xdWV1ZQotICB7Ci0gICAgdW5zaWduZWQgY2hhciAqcmVsb2M7Ci0gICAgdW5zaWduZWQgaW50IHNpemU7Ci0gIH0gcmVsb2NfcXVldWVbNF07Ci0KLS8qIFRoaXMgZnVsbHkgZGVzY3JpYmVzIHRoZSBzeW1ib2wgdHlwZXMgd2hpY2ggbWF5IGJlIGF0dGFjaGVkIHRvCi0gICBhbiBFWFBPUlQgb3IgSU1QT1JUIGRpcmVjdGl2ZS4gIE9ubHkgU09NIHVzZXMgdGhpcyBmb3JtYXRpb24KLSAgIChFTEYgaGFzIG5vIG5lZWQgZm9yIGl0KS4gICovCi10eXBlZGVmIGVudW0KLXsKLSAgU1lNQk9MX1RZUEVfVU5LTk9XTiwKLSAgU1lNQk9MX1RZUEVfQUJTT0xVVEUsCi0gIFNZTUJPTF9UWVBFX0NPREUsCi0gIFNZTUJPTF9UWVBFX0RBVEEsCi0gIFNZTUJPTF9UWVBFX0VOVFJZLAotICBTWU1CT0xfVFlQRV9NSUxMSUNPREUsCi0gIFNZTUJPTF9UWVBFX1BMQUJFTCwKLSAgU1lNQk9MX1RZUEVfUFJJX1BST0csCi0gIFNZTUJPTF9UWVBFX1NFQ19QUk9HLAotfSBwYV9zeW1ib2xfdHlwZTsKLQotc3RydWN0IHNlY3Rpb25fdG9fdHlwZQotewotICBjaGFyICpzZWN0aW9uOwotICBjaGFyIHR5cGU7Ci19OwotCi0vKiBBc3NvcnRlZCBzeW1ib2wgaW5mb3JtYXRpb24gdGhhdCBuZWVkcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlIEJGRCBzeW1ib2wKLSAgIGFuZC9vciB0aGUgQkZEIGJhY2tlbmQgcHJpdmF0ZSBzeW1ib2wgZGF0YS4gICovCi1zdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8KLXsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF90eXBlOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX3Njb3BlOwotICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX2luZm87Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfdmFsdWU7Ci0gIHVuc2lnbmVkIGludCBwcml2X2xldmVsOwotfTsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotc3RhdGljIGJvb2xlYW4gc29tX21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3Rfc2V0dXAgUEFSQU1TICgoYmZkICosCi0JCQkJCQkgICAgc3RydWN0IGhlYWRlciAqLAotCQkJCQkJICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKiwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBzZXR1cF9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGhlYWRlciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqIHNvbV9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3N0cmluZ190YWJsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBzb21fc2x1cnBfc3ltYm9sX3RhYmxlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc29tX2Nhbm9uaWNhbGl6ZV9yZWxvYyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwKLQkJCQkJICAgIGFyZWxlbnQgKiosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyBsb25nIHNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc29tX3NldF9yZWxvY19pbmZvIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJYXJlbGVudCAqLCBhc2VjdGlvbiAqLAotCQkJCQkJYXN5bWJvbCAqKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NsdXJwX3JlbG9jX3RhYmxlIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLAotCQkJCQkgICAgICBhc3ltYm9sICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgbG9uZyBzb21fZ2V0X3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGFzeW1ib2wgKiBzb21fbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmludF9zeW1ib2wgUEFSQU1TICgoYmZkICosIFBUUiwKLQkJCQkgICAgICBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc29tX25ld19zZWN0aW9uX2hvb2sgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0JCQkJCQkJICBiZmQgKiwgYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJCQkJICBiZmQgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0jZGVmaW5lIHNvbV9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSBfYmZkX2dlbmVyaWNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSNkZWZpbmUgc29tX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyBfYmZkX2dlbmVyaWNfYmZkX3NldF9wcml2YXRlX2ZsYWdzCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIsCi0JCQkJCQkgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotCQkJCQkJIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fc2V0X2FyY2hfbWFjaCBQQVJBTVMgKChiZmQgKiwgZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5kX25lYXJlc3RfbGluZSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJICAgICAgYXN5bWJvbCAqKiwgYmZkX3ZtYSwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgQ09OU1QgY2hhciAqKiwKLQkJCQkJICAgICAgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyB2b2lkIHNvbV9nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGFzZWN0aW9uICogYmZkX3NlY3Rpb25fZnJvbV9zb21fc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCAKLQkJCQkJc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqKSk7Ci1zdGF0aWMgaW50IGxvZzIgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlIGhwcGFfc29tX3JlbG9jIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICosCi0JCQkJCQkgICAgIGFzeW1ib2wgKiwgUFRSLAotCQkJCQkJICAgICBhc2VjdGlvbiAqLCBiZmQgKiwKLQkJCQkJCSAgICAgY2hhciAqKikpOwotc3RhdGljIHZvaWQgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgUEFSQU1TICgoc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB2b2lkIHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotc3RhdGljIHZvaWQgc29tX3JlbG9jX3F1ZXVlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgcmVsb2NfcXVldWUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IHNvbV9yZWxvY19xdWV1ZV9maW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQkgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogdHJ5X3ByZXZfZml4dXAgUEFSQU1TICgoYmZkICosIGludCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKikpOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19za2lwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogc29tX3JlbG9jX2FkZGVuZCBQQVJBTVMgKChiZmQgKiwgaW50LCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICAgIHVuc2lnbmVkIGludCAqLAotCQkJCQkJIHN0cnVjdCByZWxvY19xdWV1ZSAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqIHNvbV9yZWxvY19jYWxsIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBjaGFyICosCi0JCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKiwKLQkJCQkJICAgICAgIGFyZWxlbnQgKiwgaW50LAotCQkJCQkgICAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNvbV9jb3VudF9zdWJzcGFjZXMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgY29tcGFyZV9zeW1zIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfc3Vic3BhY2VzIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb21fY29tcHV0ZV9jaGVja3N1bSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3ByZXBfaGVhZGVycyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzb21fc2l6ZW9mX2hlYWRlcnMgUEFSQU1TICgoYmZkICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHNvbV9maW5pc2hfd3JpdGluZyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2J1aWxkX2FuZF93cml0ZV9zeW1ib2xfdGFibGUgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNvbV9wcmVwX2Zvcl9maXh1cHMgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNvbV93cml0ZV9maXh1cHMgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3BhY2Vfc3RyaW5ncyBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgbG9uZywKLQkJCQkJCXVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fd3JpdGVfc3ltYm9sX3N0cmluZ3MgUEFSQU1TICgoYmZkICosIHVuc2lnbmVkIGxvbmcsCi0JCQkJCQkgYXN5bWJvbCAqKiwgdW5zaWduZWQgaW50LAotCQkJCQkJIHVuc2lnbmVkICosCi0JCQkJCQkgQ09NUFVOSVQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JlZ2luX3dyaXRpbmcgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyByZWxvY19ob3d0b190eXBlICogc29tX2JmZF9yZWxvY190eXBlX2xvb2t1cAotCVBBUkFNUyAoKGJmZCAqLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpKTsKLXN0YXRpYyBjaGFyIHNvbV9zZWN0aW9uX3R5cGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IHNvbV9kZWNvZGVfc3ltY2xhc3MgUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBsc3RfaGVhZGVyICosCi0JCQkJCQkgc3ltaW5kZXggKikpOwotCi1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGxzdF9oZWFkZXIgKiwKLQkJCQkJCSAgIGNhcnN5bSAqKnN5bXMpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9zbHVycF9hcm1hcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc29tX3dyaXRlX2FybWFwIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIHN0cnVjdCBvcmwgKiwKLQkJCQkJdW5zaWduZWQgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwKLQkJCQkJICAgICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50ICosCi0JCQkJCQkgIHVuc2lnbmVkIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHNvbV9iZmRfYXJfc3ltYm9sX2hhc2ggUEFSQU1TICgoYXN5bWJvbCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiBQQVJBTVMgKChiZmQgKiwgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgdW5zaWduZWQgaW50LAotCQkJCQkJICAgICAgc3RydWN0IGxzdF9oZWFkZXIsCi0JCQkJCQkgICAgICB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNvbV9pc19zcGFjZSBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21faXNfc3Vic3BhY2UgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIGJvb2xlYW4gc29tX2lzX2NvbnRhaW5lciBQQVJBTVMgKChhc2VjdGlvbiAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzb21fYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci0JCi0vKiBNYXAgU09NIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotCi0gICBUaGlzIHRhYmxlIGluY2x1ZGVzIGFsbCB0aGUgc3RhbmRhcmQgc3Vic3BhY2VzIGFzIGRlZmluZWQgaW4gdGhlIAotICAgY3VycmVudCAiUFJPIEFCSSBmb3IgUEEtUklTQyBTeXN0ZW1zIiwgJFVOV0lORCQgd2hpY2ggZm9yIAotICAgc29tZSByZWFzb24gd2FzIGxlZnQgb3V0LCBhbmQgc2VjdGlvbnMgc3BlY2lmaWMgdG8gZW1iZWRkZWQgc3RhYnMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlY3Rpb25fdG9fdHlwZSBzdHRbXSA9IHsKLSAgeyIkVEVYVCQiLCAndCd9LAotICB7IiRTSExJQl9JTkZPJCIsICd0J30sCi0gIHsiJE1JTExJQ09ERSQiLCAndCd9LAotICB7IiRMSVQkIiwgJ3QnfSwKLSAgeyIkQ09ERSQiLCAndCd9LAotICB7IiRVTldJTkRfU1RBUlQkIiwgJ3QnfSwKLSAgeyIkVU5XSU5EJCIsICd0J30sCi0gIHsiJFBSSVZBVEUkIiwgJ2QnfSwKLSAgeyIkUExUJCIsICdkJ30sCi0gIHsiJFNITElCX0RBVEEkIiwgJ2QnfSwKLSAgeyIkREFUQSQiLCAnZCd9LAotICB7IiRTSE9SVERBVEEkIiwgJ2cnfSwKLSAgeyIkRExUJCIsICdkJ30sCi0gIHsiJEdMT0JBTCQiLCAnZyd9LAotICB7IiRTSE9SVEJTUyQiLCAncyd9LAotICB7IiRCU1MkIiwgJ2InfSwKLSAgeyIkR0RCX1NUUklOR1MkIiwgJ04nfSwKLSAgeyIkR0RCX1NZTUJPTFMkIiwgJ04nfSwKLSAgezAsIDB9Ci19OwotCi0vKiBBYm91dCB0aGUgcmVsb2NhdGlvbiBmb3JtYXR0aW5nIHRhYmxlLi4uCi0KLSAgIFRoZXJlIGFyZSAyNTYgZW50cmllcyBpbiB0aGUgdGFibGUsIG9uZSBmb3IgZWFjaCBwb3NzaWJsZQotICAgcmVsb2NhdGlvbiBvcGNvZGUgYXZhaWxhYmxlIGluIFNPTS4gIFdlIGluZGV4IHRoZSB0YWJsZSBieQotICAgdGhlIHJlbG9jYXRpb24gb3Bjb2RlLiAgVGhlIG5hbWVzIGFuZCBvcGVyYXRpb25zIGFyZSB0aG9zZQotICAgZGVmaW5lZCBieSBhLm91dF84MDAgKDQpLgotCi0gICBSaWdodCBub3cgdGhpcyB0YWJsZSBpcyBvbmx5IHVzZWQgdG8gY291bnQgYW5kIHBlcmZvcm0gbWluaW1hbAotICAgcHJvY2Vzc2luZyBvbiByZWxvY2F0aW9uIHN0cmVhbXMgc28gdGhhdCB0aGV5IGNhbiBiZSBpbnRlcm5hbGl6ZWQKLSAgIGludG8gQkZEIGFuZCBzeW1ib2xpY2FsbHkgcHJpbnRlZCBieSB1dGlsaXRpZXMuICBUbyBtYWtlIGFjdHVhbCB1c2UgCi0gICBvZiB0aGVtIHdvdWxkIGJlIG11Y2ggbW9yZSBkaWZmaWN1bHQsIEJGRCdzIGNvbmNlcHQgb2YgcmVsb2NhdGlvbnMKLSAgIGlzIGZhciB0b28gc2ltcGxlIHRvIGhhbmRsZSBTT00gcmVsb2NhdGlvbnMuICBUaGUgYmFzaWMgYXNzdW1wdGlvbgotICAgdGhhdCBhIHJlbG9jYXRpb24gY2FuIGJlIGNvbXBsZXRlbHkgcHJvY2Vzc2VkIGluZGVwZW5kZW50IG9mIG90aGVyCi0gICByZWxvY2F0aW9ucyBiZWZvcmUgYW4gb2JqZWN0IGZpbGUgaXMgd3JpdHRlbiBpcyBpbnZhbGlkIGZvciBTT00uCi0KLSAgIFRoZSBTT00gcmVsb2NhdGlvbnMgYXJlIG1lYW50IHRvIGJlIHByb2Nlc3NlZCBhcyBhIHN0cmVhbSwgdGhleQotICAgc3BlY2lmeSBjb3B5aW5nIG9mIGRhdGEgZnJvbSB0aGUgaW5wdXQgc2VjdGlvbiB0byB0aGUgb3V0cHV0IHNlY3Rpb24KLSAgIHdoaWxlIHBvc3NpYmx5IG1vZGlmeWluZyB0aGUgZGF0YSBpbiBzb21lIG1hbm5lci4gIFRoZXkgYWxzbyBjYW4gCi0gICBzcGVjaWZ5IHRoYXQgYSB2YXJpYWJsZSBudW1iZXIgb2YgemVyb3Mgb3IgdW5pbml0aWFsaXplZCBkYXRhIGJlCi0gICBpbnNlcnRlZCBvbiBpbiB0aGUgb3V0cHV0IHNlZ21lbnQgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0LiAgU29tZQotICAgcmVsb2NhdGlvbnMgc3BlY2lmeSB0aGF0IHNvbWUgcHJldmlvdXMgcmVsb2NhdGlvbiBiZSByZS1hcHBsaWVkIGF0Ci0gICB0aGUgY3VycmVudCBsb2NhdGlvbiBpbiB0aGUgaW5wdXQvb3V0cHV0IHNlY3Rpb25zLiAgQW5kIGZpbmFsbHkgYSBudW1iZXIKLSAgIG9mIHJlbG9jYXRpb25zIGhhdmUgZWZmZWN0cyBvbiBvdGhlciBzZWN0aW9ucyAoUl9FTlRSWSwgUl9FWElULAotICAgUl9VTldJTkRfQVVYIGFuZCBhIHZhcmlldHkgb2Ygb3RoZXJzKS4gIFRoZXJlIGlzbid0IGV2ZW4gZW5vdWdoIHJvb20KLSAgIGluIHRoZSBCRkQgcmVsb2NhdGlvbiBkYXRhIHN0cnVjdHVyZSB0byBzdG9yZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8KLSAgIHBlcmZvcm0gYWxsIHRoZSByZWxvY2F0aW9ucy4KLQotICAgRWFjaCBlbnRyeSBpbiB0aGUgdGFibGUgaGFzIHRocmVlIGZpZWxkcy4gCi0KLSAgIFRoZSBmaXJzdCBlbnRyeSBpcyBhbiBpbmRleCBpbnRvIHRoaXMgImNsYXNzIiBvZiByZWxvY2F0aW9ucy4gIFRoaXMKLSAgIGluZGV4IGNhbiB0aGVuIGJlIHVzZWQgYXMgYSB2YXJpYWJsZSB3aXRoaW4gdGhlIHJlbG9jYXRpb24gaXRzZWxmLgotCi0gICBUaGUgc2Vjb25kIGZpZWxkIGlzIGEgZm9ybWF0IHN0cmluZyB3aGljaCBhY3R1YWxseSBjb250cm9scyBwcm9jZXNzaW5nCi0gICBvZiB0aGUgcmVsb2NhdGlvbi4gIEl0IHVzZXMgYSBzaW1wbGUgcG9zdGZpeCBtYWNoaW5lIHRvIGRvIGNhbGN1bGF0aW9ucwotICAgYmFzZWQgb24gdmFyaWFibGVzL2NvbnN0YW50cyBmb3VuZCBpbiB0aGUgc3RyaW5nIGFuZCB0aGUgcmVsb2NhdGlvbgotICAgc3RyZWFtLiAgCi0KLSAgIFRoZSB0aGlyZCBmaWVsZCBzcGVjaWZ5cyB3aGV0aGVyIG9yIG5vdCB0aGlzIHJlbG9jYXRpb24gbWF5IHVzZSAKLSAgIGEgY29uc3RhbnQgKFYpIGZyb20gdGhlIHByZXZpb3VzIFJfREFUQV9PVkVSUklERSByYXRoZXIgdGhhbiBhIGNvbnN0YW50Ci0gICBzdG9yZWQgaW4gdGhlIGluc3RydWN0aW9uLgotCi0gICBWYXJpYWJsZXM6ICAKLSAgCi0gICBMID0gaW5wdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgRCA9IGluZGV4IGludG8gY2xhc3Mgb2YgcmVsb2NhdGlvbnMKLSAgIE0gPSBvdXRwdXQgc3BhY2UgYnl0ZSBjb3VudAotICAgTiA9IHN0YXRlbWVudCBudW1iZXIgKHVudXNlZD8pCi0gICBPID0gc3RhY2sgb3BlcmF0aW9uCi0gICBSID0gcGFyYW1ldGVyIHJlbG9jYXRpb24gYml0cwotICAgUyA9IHN5bWJvbCBpbmRleAotICAgVCA9IGZpcnN0IDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBVID0gc2Vjb25kIDMyIGJpdHMgb2Ygc3RhY2sgdW53aW5kIGluZm9ybWF0aW9uCi0gICBWID0gYSBsaXRlcmFsIGNvbnN0YW50ICh1c3VhbGx5IHVzZWQgaW4gdGhlIG5leHQgcmVsb2NhdGlvbikKLSAgIFAgPSBhIHByZXZpb3VzIHJlbG9jYXRpb24KLSAgCi0gICBMb3dlciBjYXNlIGxldHRlcnMgKHN0YXJ0aW5nIHdpdGggJ2InKSByZWZlciB0byBmb2xsb3dpbmcgCi0gICBieXRlcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0uICAnYicgaXMgdGhlIG5leHQgMSBieXRlLAotICAgYyBpcyB0aGUgbmV4dCAyIGJ5dGVzLCBkIGlzIHRoZSBuZXh0IDMgYnl0ZXMsIGV0Yy4uLiAgCi0gICBUaGlzIGlzIHRoZSB2YXJpYWJsZSBwYXJ0IG9mIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgdGhhdAotICAgbWFrZXMgb3VyIGxpZmUgYSBsaXZpbmcgaGVsbC4KLQotICAgbnVtZXJpY2FsIGNvbnN0YW50cyBhcmUgYWxzbyB1c2VkIGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgTm90ZQotICAgdGhlIGNvbnN0YW50cyBhcmUgcmVwcmVzZW50ZWQgaW4gZGVjaW1hbC4gCi0KLSAgICcrJywgIioiIGFuZCAiPSIgcmVwcmVzZW50cyB0aGUgb2J2aW91cyBwb3N0Zml4IG9wZXJhdG9ycy4KLSAgICc8JyByZXByZXNlbnRzIGEgbGVmdCBzaGlmdC4gCi0KLSAgIFN0YWNrIE9wZXJhdGlvbnM6Ci0KLSAgIFBhcmFtZXRlciBSZWxvY2F0aW9uIEJpdHM6Ci0KLSAgIFVud2luZCBFbnRyaWVzOiAgCi0gICAKLSAgIFByZXZpb3VzIFJlbG9jYXRpb25zOiAgVGhlIGluZGV4IGZpZWxkIHJlcHJlc2VudHMgd2hpY2ggaW4gdGhlIHF1ZXVlCi0gICBvZiA0IHByZXZpb3VzIGZpeHVwcyBzaG91bGQgYmUgcmUtYXBwbGllZC4KLQotICAgTGl0ZXJhbCBDb25zdGFudHM6ICBUaGVzZSBhcmUgZ2VuZXJhbGx5IHVzZWQgdG8gcmVwcmVzZW50IGFkZGVuZAotICAgcGFydHMgb2YgcmVsb2NhdGlvbnMgd2hlbiB0aGVzZSBjb25zdGFudHMgYXJlIG5vdCBzdG9yZWQgaW4gdGhlCi0gICBmaWVsZHMgb2YgdGhlIGluc3RydWN0aW9ucyB0aGVtc2VsdmVzLiAgRm9yIGV4YW1wbGUgdGhlIGluc3RydWN0aW9uCi0gICBhZGRpbCBmb28tJGdsb2JhbCQtMHgxMjM0IHdvdWxkIHVzZSBhbiBvdmVycmlkZSBmb3IgIjB4MTIzNCIgcmF0aGVyCi0gICB0aGFuIHN0b3JpbmcgaXQgaW50byB0aGUgYWRkaWwgaXRzZWxmLiAgKi8KLQotc3RydWN0IGZpeHVwX2Zvcm1hdAotewotICBpbnQgRDsKLSAgY2hhciAqZm9ybWF0OwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaXh1cF9mb3JtYXQgc29tX2ZpeHVwX2Zvcm1hdHNbMjU2XSA9Ci17Ci0gIC8qIFJfTk9fUkVMT0NBVElPTiAqLwotICAwLCAgICJMRDErNCo9IiwgICAgICAgLyogMHgwMCAqLwotICAxLCAgICJMRDErNCo9IiwJLyogMHgwMSAqLwotICAyLCAgICJMRDErNCo9IiwJLyogMHgwMiAqLwotICAzLCAgICJMRDErNCo9IiwJLyogMHgwMyAqLwotICA0LCAgICJMRDErNCo9IiwJLyogMHgwNCAqLwotICA1LCAgICJMRDErNCo9IiwJLyogMHgwNSAqLwotICA2LCAgICJMRDErNCo9IiwJLyogMHgwNiAqLwotICA3LCAgICJMRDErNCo9IiwJLyogMHgwNyAqLwotICA4LCAgICJMRDErNCo9IiwJLyogMHgwOCAqLwotICA5LCAgICJMRDErNCo9IiwJLyogMHgwOSAqLwotICAxMCwgICJMRDErNCo9IiwJLyogMHgwYSAqLwotICAxMSwgICJMRDErNCo9IiwJLyogMHgwYiAqLwotICAxMiwgICJMRDErNCo9IiwJLyogMHgwYyAqLwotICAxMywgICJMRDErNCo9IiwJLyogMHgwZCAqLwotICAxNCwgICJMRDErNCo9IiwJLyogMHgwZSAqLwotICAxNSwgICJMRDErNCo9IiwJLyogMHgwZiAqLwotICAxNiwgICJMRDErNCo9IiwJLyogMHgxMCAqLwotICAxNywgICJMRDErNCo9IiwJLyogMHgxMSAqLwotICAxOCwgICJMRDErNCo9IiwJLyogMHgxMiAqLwotICAxOSwgICJMRDErNCo9IiwJLyogMHgxMyAqLwotICAyMCwgICJMRDErNCo9IiwJLyogMHgxNCAqLwotICAyMSwgICJMRDErNCo9IiwJLyogMHgxNSAqLwotICAyMiwgICJMRDErNCo9IiwJLyogMHgxNiAqLwotICAyMywgICJMRDErNCo9IiwJLyogMHgxNyAqLwotICAwLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MTggKi8KLSAgMSwgICAiTEQ4PGIrMSs0Kj0iLAkvKiAweDE5ICovCi0gIDIsICAgIkxEODxiKzErNCo9IiwJLyogMHgxYSAqLwotICAzLCAgICJMRDg8YisxKzQqPSIsCS8qIDB4MWIgKi8KLSAgMCwgICAiTEQxNjxjKzErNCo9IiwJLyogMHgxYyAqLwotICAxLCAgICJMRDE2PGMrMSs0Kj0iLAkvKiAweDFkICovCi0gIDIsICAgIkxEMTY8YysxKzQqPSIsCS8qIDB4MWUgKi8KLSAgMCwgICAiTGQxKz0iLCAgICAgICAgIC8qIDB4MWYgKi8KLSAgLyogUl9aRVJPRVMgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIwICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjEgKi8KLSAgLyogUl9VTklOSVQgKi8KLSAgMCwgICAgIkxiMSs0Kj0iLAkvKiAweDIyICovCi0gIDEsICAgICJMZDErPSIsCS8qIDB4MjMgKi8KLSAgLyogUl9SRUxPQ0FUSU9OICovCi0gIDAsICAgICJMND0iLCAgICAgICAgICAvKiAweDI0ICovCi0gIC8qIFJfREFUQV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TYj0iLAkvKiAweDI1ICovCi0gIDEsICAgICJMND1TZD0iLAkvKiAweDI2ICovCi0gIC8qIFJfREFUQV9QTEVCRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4MjcgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4MjggKi8KLSAgLyogUl9TUEFDRV9SRUYgKi8KLSAgMCwgICAgIkw0PSIsICAgICAgICAgIC8qIDB4MjkgKi8KLSAgLyogUl9SRVBFQVRFRF9JTklUICovCi0gIDAsICAgICJMND1NYjErNCo9IiwJLyogMHgyYSAqLwotICAxLCAgICAiTGI0Kj1NYjErTCo9IiwJLyogMHgyYiAqLwotICAyLCAgICAiTGI0Kj1NZDErNCo9IiwJLyogMHgyYyAqLwotICAzLCAgICAiTGQxKz1NZTErPSIsCS8qIDB4MmQgKi8KLSAgMCwgICAJIiIsCSAgICAgICAgLyogMHgyZSAqLwotICAwLCAgIAkiIiwJICAgICAgICAvKiAweDJmICovCi0gIC8qIFJfUENSRUxfQ0FMTCAqLwotICAwLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMCAqLwotICAxLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMSAqLwotICAyLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMiAqLwotICAzLCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzMyAqLwotICA0LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNCAqLwotICA1LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNSAqLwotICA2LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNiAqLwotICA3LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzNyAqLwotICA4LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOCAqLwotICA5LCAgICAiTDQ9UkQ9U2I9IiwJLyogMHgzOSAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYSAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNiPSIsLyogMHgzYiAqLwotICAwLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzYyAqLwotICAxLCAgICAiTDQ9UkQ4PGIrPVNkPSIsLyogMHgzZCAqLwotICAvKiBSX1NIT1JUX1BDUkVMX01PREUgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHgzZSAqLwotICAvKiBSX0xPTkdfUENSRUxfTU9ERSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDNmICovCi0gIC8qIFJfQUJTX0NBTEwgKi8KLSAgMCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDAgKi8KLSAgMSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDEgKi8KLSAgMiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDIgKi8KLSAgMywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDMgKi8KLSAgNCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDQgKi8KLSAgNSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDUgKi8KLSAgNiwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDYgKi8KLSAgNywgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDcgKi8KLSAgOCwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDggKi8KLSAgOSwgICAgIkw0PVJEPVNiPSIsCS8qIDB4NDkgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGEgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TYj0iLC8qIDB4NGIgKi8KLSAgMCwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGMgKi8KLSAgMSwgICAgIkw0PVJEODxiKz1TZD0iLC8qIDB4NGQgKi8KLSAgLyogUl9SRVNFUlZFRCAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZSAqLwotICAwLCAgICAgIiIsCSAgICAgICAgLyogMHg0ZiAqLwotICAvKiBSX0RQX1JFTEFUSVZFICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDUwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDUxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDUyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDUzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDU0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDU1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDU2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDU3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDU4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDU5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDVhICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDViICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDVjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDVkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDVlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDVmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDYwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDYxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDYyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDYzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDY0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDY1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDY2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDY3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDY4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDY5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDZhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDZiICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDZjICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDZkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDZlICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDZmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweDcwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweDcxICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3MiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDczICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4NzQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3NSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDc2ICovCi0gIDAsICAgICIiLCAgICAgIAkvKiAweDc3ICovCi0gIC8qIFJfRExUX1JFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHg3OCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHg3OSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLCAgICAgICAgCS8qIDB4N2EgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3YiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4N2QgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHg3ZSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweDdmICovCi0gIC8qIFJfQ09ERV9PTkVfU1lNQk9MICovCi0gIDAsICAgICJMND1TRD0iLAkvKiAweDgwICovCi0gIDEsICAgICJMND1TRD0iLAkvKiAweDgxICovCi0gIDIsICAgICJMND1TRD0iLAkvKiAweDgyICovCi0gIDMsICAgICJMND1TRD0iLAkvKiAweDgzICovCi0gIDQsICAgICJMND1TRD0iLAkvKiAweDg0ICovCi0gIDUsICAgICJMND1TRD0iLAkvKiAweDg1ICovCi0gIDYsICAgICJMND1TRD0iLAkvKiAweDg2ICovCi0gIDcsICAgICJMND1TRD0iLAkvKiAweDg3ICovCi0gIDgsICAgICJMND1TRD0iLAkvKiAweDg4ICovCi0gIDksICAgICJMND1TRD0iLAkvKiAweDg5ICovCi0gIDEwLCAgICJMND1TRD0iLAkvKiAweDhxICovCi0gIDExLCAgICJMND1TRD0iLAkvKiAweDhiICovCi0gIDEyLCAgICJMND1TRD0iLAkvKiAweDhjICovCi0gIDEzLCAgICJMND1TRD0iLAkvKiAweDhkICovCi0gIDE0LCAgICJMND1TRD0iLAkvKiAweDhlICovCi0gIDE1LCAgICJMND1TRD0iLAkvKiAweDhmICovCi0gIDE2LCAgICJMND1TRD0iLAkvKiAweDkwICovCi0gIDE3LCAgICJMND1TRD0iLAkvKiAweDkxICovCi0gIDE4LCAgICJMND1TRD0iLAkvKiAweDkyICovCi0gIDE5LCAgICJMND1TRD0iLAkvKiAweDkzICovCi0gIDIwLCAgICJMND1TRD0iLAkvKiAweDk0ICovCi0gIDIxLCAgICJMND1TRD0iLAkvKiAweDk1ICovCi0gIDIyLCAgICJMND1TRD0iLAkvKiAweDk2ICovCi0gIDIzLCAgICJMND1TRD0iLAkvKiAweDk3ICovCi0gIDI0LCAgICJMND1TRD0iLAkvKiAweDk4ICovCi0gIDI1LCAgICJMND1TRD0iLAkvKiAweDk5ICovCi0gIDI2LCAgICJMND1TRD0iLAkvKiAweDlhICovCi0gIDI3LCAgICJMND1TRD0iLAkvKiAweDliICovCi0gIDI4LCAgICJMND1TRD0iLAkvKiAweDljICovCi0gIDI5LCAgICJMND1TRD0iLAkvKiAweDlkICovCi0gIDMwLCAgICJMND1TRD0iLAkvKiAweDllICovCi0gIDMxLCAgICJMND1TRD0iLAkvKiAweDlmICovCi0gIDMyLCAgICJMND1TYj0iLAkvKiAweGEwICovCi0gIDMzLCAgICJMND1TZD0iLAkvKiAweGExICovCi0gIC8qIFJfUkVTRVJWRUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhMiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGEzICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhNSAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE2ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YTcgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhOCAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGE5ICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWEgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhhYiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGFjICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YWQgKi8KLSAgLyogUl9NSUxMSV9SRUwgKi8KLSAgMCwgICAgIkw0PVNiPSIsCS8qIDB4YWUgKi8KLSAgMSwgICAgIkw0PVNkPSIsCS8qIDB4YWYgKi8KLSAgLyogUl9DT0RFX1BMQUJFTCAqLwotICAwLCAgICAiTDQ9U2I9IiwJLyogMHhiMCAqLwotICAxLCAgICAiTDQ9U2Q9IiwJLyogMHhiMSAqLwotICAvKiBSX0JSRUFLUE9JTlQgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhiMiAqLwotICAvKiBSX0VOVFJZICovCi0gIDAsICAgICJUZT1VZT0iLCAgICAgICAvKiAweGIzICovCi0gIDEsICAgICJVZj0iLAkgICAgICAgIC8qIDB4YjQgKi8KLSAgLyogUl9BTFRfRU5UUlkgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiNSAqLwotICAvKiBSX0VYSVQgKi8KLSAgMCwgICAgIiIsCQkvKiAweGI2ICovCi0gIC8qIFJfQkVHSU5fVFJZICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4YjcgKi8KLSAgLyogUl9FTkRfVFJZICovCi0gIDAsICAgICJSMD0iLAkgICAgICAgIC8qIDB4YjggKi8KLSAgMSwgICAgIlJiNCo9IiwJLyogMHhiOSAqLwotICAyLCAgICAiUmQ0Kj0iLAkvKiAweGJhICovCi0gIC8qIFJfQkVHSU5fQlJUQUIgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhiYiAqLwotICAvKiBSX0VORF9CUlRBQiAqLwotICAwLCAgICAiIiwJICAgICAgICAvKiAweGJjICovCi0gIC8qIFJfU1RBVEVNRU5UICovCi0gIDAsICAgICJOYj0iLAkgICAgICAgIC8qIDB4YmQgKi8KLSAgMSwgICAgIk5jPSIsCSAgICAgICAgLyogMHhiZSAqLwotICAyLCAgICAiTmQ9IiwJICAgICAgICAvKiAweGJmICovCi0gIC8qIFJfREFUQV9FWFBSICovCi0gIDAsICAgICJMND0iLAkgICAgICAgIC8qIDB4YzAgKi8KLSAgLyogUl9DT0RFX0VYUFIgKi8KLSAgMCwgICAgIkw0PSIsCSAgICAgICAgLyogMHhjMSAqLwotICAvKiBSX0ZTRUwgKi8KLSAgMCwgICAgIiIsCQkvKiAweGMyICovCi0gIC8qIFJfTFNFTCAqLwotICAwLCAgICAiIiwJCS8qIDB4YzMgKi8KLSAgLyogUl9SU0VMICovCi0gIDAsICAgICIiLAkJLyogMHhjNCAqLwotICAvKiBSX05fTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzUgKi8KLSAgLyogUl9TX01PREUgKi8KLSAgMCwgICAgIiIsCQkvKiAweGM2ICovCi0gIC8qIFJfRF9NT0RFICovCi0gIDAsICAgICIiLAkJLyogMHhjNyAqLwotICAvKiBSX1JfTU9ERSAqLwotICAwLCAgICAiIiwJCS8qIDB4YzggKi8KLSAgLyogUl9EQVRBX09WRVJSSURFICovCi0gIDAsICAgICJWMD0iLAkgICAgICAgIC8qIDB4YzkgKi8KLSAgMSwgICAgIlZiPSIsCSAgICAgICAgLyogMHhjYSAqLwotICAyLCAgICAiVmM9IiwJICAgICAgICAvKiAweGNiICovCi0gIDMsICAgICJWZD0iLAkgICAgICAgIC8qIDB4Y2MgKi8KLSAgNCwgICAgIlZlPSIsCSAgICAgICAgLyogMHhjZCAqLwotICAvKiBSX1RSQU5TTEFURUQgKi8KLSAgMCwgICAgIiIsCSAgICAgICAgLyogMHhjZSAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsICAgICIiLAkgICAgICAgIC8qIDB4Y2YgKi8KLSAgLyogUl9DT01QMSAqLwotICAwLCAgICAiT2I9IiwJICAgICAgICAvKiAweGQwICovCi0gIC8qIFJfQ09NUDIgKi8KLSAgMCwgICAgIk9iPVNkPSIsCS8qIDB4ZDEgKi8KLSAgLyogUl9DT01QMyAqLwotICAwLCAgICAiT2I9VmU9IiwJLyogMHhkMiAqLwotICAvKiBSX1BSRVZfRklYVVAgKi8KLSAgMCwgICAgIlAiLCAgIAkgICAgICAgIC8qIDB4ZDMgKi8KLSAgMSwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDQgKi8KLSAgMiwgICAgIlAiLAkgICAgICAgIC8qIDB4ZDUgKi8KLSAgMywgICAgIlAiLAkgICAgICAgIC8qIDB4ZDYgKi8KLSAgLyogUl9TRUNfU1RNVCAqLwotICAwLAkiIiwJCS8qIDB4ZDcgKi8KLSAgLyogUl9OMFNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDggKi8KLSAgLyogUl9OMVNFTCAqLwotICAwLAkiIiwJCS8qIDB4ZDkgKi8KLSAgLyogUl9MSU5FVEFCICovCi0gIDAsCSIiLAkJLyogMHhkYSAqLwotICAvKiBSX0xJTkVUQUJfRVNDICovCi0gIDAsCSIiLAkJLyogMHhkYiAqLwotICAvKiBSX0xUUF9PVkVSUklERSAqLwotICAwLAkiIiwJCS8qIDB4ZGMgKi8KLSAgLyogUl9DT01NRU5UICovCi0gIDAsCSIiLAkJLyogMHhkZCAqLwotICAvKiBSX1JFU0VSVkVEICovCi0gIDAsCSIiLAkJLyogMHhkZSAqLwotICAwLAkiIiwJCS8qIDB4ZGYgKi8KLSAgMCwJIiIsCQkvKiAweGUwICovCi0gIDAsCSIiLAkJLyogMHhlMSAqLwotICAwLAkiIiwJCS8qIDB4ZTIgKi8KLSAgMCwJIiIsCQkvKiAweGUzICovCi0gIDAsCSIiLAkJLyogMHhlNCAqLwotICAwLAkiIiwJCS8qIDB4ZTUgKi8KLSAgMCwJIiIsCQkvKiAweGU2ICovCi0gIDAsCSIiLAkJLyogMHhlNyAqLwotICAwLAkiIiwJCS8qIDB4ZTggKi8KLSAgMCwJIiIsCQkvKiAweGU5ICovCi0gIDAsCSIiLAkJLyogMHhlYSAqLwotICAwLAkiIiwJCS8qIDB4ZWIgKi8KLSAgMCwJIiIsCQkvKiAweGVjICovCi0gIDAsCSIiLAkJLyogMHhlZCAqLwotICAwLAkiIiwJCS8qIDB4ZWUgKi8KLSAgMCwJIiIsCQkvKiAweGVmICovCi0gIDAsCSIiLAkJLyogMHhmMCAqLwotICAwLAkiIiwJCS8qIDB4ZjEgKi8KLSAgMCwJIiIsCQkvKiAweGYyICovCi0gIDAsCSIiLAkJLyogMHhmMyAqLwotICAwLAkiIiwJCS8qIDB4ZjQgKi8KLSAgMCwJIiIsCQkvKiAweGY1ICovCi0gIDAsCSIiLAkJLyogMHhmNiAqLwotICAwLAkiIiwJCS8qIDB4ZjcgKi8KLSAgMCwJIiIsCQkvKiAweGY4ICovCi0gIDAsCSIiLAkJLyogMHhmOSAqLwotICAwLAkiIiwJCS8qIDB4ZmEgKi8KLSAgMCwJIiIsCQkvKiAweGZiICovCi0gIDAsCSIiLAkJLyogMHhmYyAqLwotICAwLAkiIiwJCS8qIDB4ZmQgKi8KLSAgMCwJIiIsCQkvKiAweGZlICovCi0gIDAsCSIiLAkJLyogMHhmZiAqLwotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMV9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDQwLAotICAweDQxLAotICAweDQyLAotICAweDQzLAotICAweDQ0LAotICAweDQ1LAotICAweDQ2LAotICAweDQ3LAotICAweDQ4LAotICAweDQ5LAotICAweDRhLAotICAweDRiLAotICAweDYwLAotICAweDgwLAotICAweGEwLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wMl9vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDgwLAotICAweDgyLAotICAweGMwLAotICAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludCBjb21wM19vcGNvZGVzW10gPQotewotICAweDAwLAotICAweDAyLAotICAtMQotfTsKLQotLyogVGhlc2UgYXBwYXJlbnRseSBhcmUgbm90IGluIG9sZGVyIHZlcnNpb25zIG9mIGhwdXggcmVsb2MuaCAoaHB1eDcpLiAgKi8KLSNpZm5kZWYgUl9ETFRfUkVMCi0jZGVmaW5lIFJfRExUX1JFTCAweDc4Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0FVWF9VTldJTkQKLSNkZWZpbmUgUl9BVVhfVU5XSU5EIDB4Y2YKLSNlbmRpZgotCi0jaWZuZGVmIFJfU0VDX1NUTVQKLSNkZWZpbmUgUl9TRUNfU1RNVCAweGQ3Ci0jZW5kaWYKLQotLyogQW5kIHRoZXNlIGZpcnN0IGFwcGVhcmVkIGluIGhwdXgxMC4gICovCi0jaWZuZGVmIFJfU0hPUlRfUENSRUxfTU9ERQotI2RlZmluZSBSX1NIT1JUX1BDUkVMX01PREUgMHgzZQotI2VuZGlmCi0KLSNpZm5kZWYgUl9MT05HX1BDUkVMX01PREUKLSNkZWZpbmUgUl9MT05HX1BDUkVMX01PREUgMHgzZgotI2VuZGlmCi0KLSNpZm5kZWYgUl9OMFNFTAotI2RlZmluZSBSX04wU0VMIDB4ZDgKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjFTRUwKLSNkZWZpbmUgUl9OMVNFTCAweGQ5Ci0jZW5kaWYKLQotI2lmbmRlZiBSX0xJTkVUQUIKLSNkZWZpbmUgUl9MSU5FVEFCIDB4ZGEKLSNlbmRpZgotCi0jaWZuZGVmIFJfTElORVRBQl9FU0MKLSNkZWZpbmUgUl9MSU5FVEFCX0VTQyAweGRiCi0jZW5kaWYKLQotI2lmbmRlZiBSX0xUUF9PVkVSUklERQotI2RlZmluZSBSX0xUUF9PVkVSUklERSAweGRjCi0jZW5kaWYKLQotI2lmbmRlZiBSX0NPTU1FTlQKLSNkZWZpbmUgUl9DT01NRU5UIDB4ZGQKLSNlbmRpZgotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSBzb21faHBwYV9ob3d0b190YWJsZVtdID0KLXsKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX05PX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX05PX1JFTE9DQVRJT04ifSwKLSAge1JfTk9fUkVMT0NBVElPTiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTk9fUkVMT0NBVElPTiJ9LAotICB7Ul9OT19SRUxPQ0FUSU9OLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OT19SRUxPQ0FUSU9OIn0sCi0gIHtSX1pFUk9FUywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfWkVST0VTIn0sCi0gIHtSX1pFUk9FUywgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfWkVST0VTIn0sCi0gIHtSX1VOSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfVU5JTklUIn0sCi0gIHtSX1VOSU5JVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfVU5JTklUIn0sCi0gIHtSX1JFTE9DQVRJT04sIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFTE9DQVRJT04ifSwKLSAge1JfREFUQV9PTkVfU1lNQk9MLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09ORV9TWU1CT0wifSwKLSAge1JfREFUQV9PTkVfU1lNQk9MLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09ORV9TWU1CT0wifSwKLSAge1JfREFUQV9QTEFCRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfUExBQkVMIn0sCi0gIHtSX0RBVEFfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX1BMQUJFTCJ9LAotICB7Ul9TUEFDRV9SRUYsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1NQQUNFX1JFRiJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVBFQVRFRF9JTklULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUkVQRUFURURfSU5JVCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9QQ1JFTF9DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QQ1JFTF9DQUxMIn0sCi0gIHtSX1BDUkVMX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BDUkVMX0NBTEwifSwKLSAge1JfUENSRUxfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUENSRUxfQ0FMTCJ9LAotICB7Ul9TSE9SVF9QQ1JFTF9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TSE9SVF9QQ1JFTF9NT0RFIn0sCi0gIHtSX0xPTkdfUENSRUxfTU9ERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTE9OR19QQ1JFTF9NT0RFIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfQUJTX0NBTEwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0FCU19DQUxMIn0sCi0gIHtSX0FCU19DQUxMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BQlNfQ0FMTCJ9LAotICB7Ul9BQlNfQ0FMTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQUJTX0NBTEwifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX0RQX1JFTEFUSVZFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EUF9SRUxBVElWRSJ9LAotICB7Ul9EUF9SRUxBVElWRSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRFBfUkVMQVRJVkUifSwKLSAge1JfRFBfUkVMQVRJVkUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RQX1JFTEFUSVZFIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfRExUX1JFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRExUX1JFTCJ9LAotICB7Ul9ETFRfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9ETFRfUkVMIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX0NPREVfT05FX1NZTUJPTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09ERV9PTkVfU1lNQk9MIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfTUlMTElfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9NSUxMSV9SRUwifSwKLSAge1JfTUlMTElfUkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9NSUxMSV9SRUwifSwKLSAge1JfQ09ERV9QTEFCRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPREVfUExBQkVMIn0sCi0gIHtSX0NPREVfUExBQkVMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX1BMQUJFTCJ9LAotICB7Ul9CUkVBS1BPSU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9CUkVBS1BPSU5UIn0sCi0gIHtSX0VOVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTlRSWSJ9LAotICB7Ul9FTlRSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5UUlkifSwKLSAge1JfQUxUX0VOVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9BTFRfRU5UUlkifSwKLSAge1JfRVhJVCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRVhJVCJ9LAotICB7Ul9CRUdJTl9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0JFR0lOX1RSWSJ9LAotICB7Ul9FTkRfVFJZLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfVFJZIn0sCi0gIHtSX0VORF9UUlksIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0VORF9UUlkifSwKLSAge1JfRU5EX1RSWSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRU5EX1RSWSJ9LAotICB7Ul9CRUdJTl9CUlRBQiwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQkVHSU5fQlJUQUIifSwKLSAge1JfRU5EX0JSVEFCLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9FTkRfQlJUQUIifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfU1RBVEVNRU5ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TVEFURU1FTlQifSwKLSAge1JfREFUQV9FWFBSLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX0VYUFIifSwKLSAge1JfQ09ERV9FWFBSLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT0RFX0VYUFIifSwKLSAge1JfRlNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfRlNFTCJ9LAotICB7Ul9MU0VMLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9MU0VMIn0sCi0gIHtSX1JTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JTRUwifSwKLSAge1JfTl9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9OX01PREUifSwKLSAge1JfU19NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TX01PREUifSwKLSAge1JfRF9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EX01PREUifSwKLSAge1JfUl9NT0RFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SX01PREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX0RBVEFfT1ZFUlJJREUsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0RBVEFfT1ZFUlJJREUifSwKLSAge1JfREFUQV9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfREFUQV9PVkVSUklERSJ9LAotICB7Ul9EQVRBX09WRVJSSURFLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9EQVRBX09WRVJSSURFIn0sCi0gIHtSX1RSQU5TTEFURUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1RSQU5TTEFURUQifSwKLSAge1JfQVVYX1VOV0lORCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQVVYX1VOV0lORCJ9LAotICB7Ul9DT01QMSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfQ09NUDEifSwKLSAge1JfQ09NUDIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTVAyIn0sCi0gIHtSX0NPTVAzLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9DT01QMyJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1BSRVZfRklYVVAsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1BSRVZfRklYVVAifSwKLSAge1JfUFJFVl9GSVhVUCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUFJFVl9GSVhVUCJ9LAotICB7Ul9QUkVWX0ZJWFVQLCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9QUkVWX0ZJWFVQIn0sCi0gIHtSX1NFQ19TVE1ULCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9TRUNfU1RNVCJ9LAotICB7Ul9OMFNFTCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTjBTRUwifSwKLSAge1JfTjFTRUwsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX04xU0VMIn0sCi0gIHtSX0xJTkVUQUIsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xJTkVUQUIifSwKLSAge1JfTElORVRBQl9FU0MsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0xJTkVUQUJfRVNDIn0sCi0gIHtSX0xUUF9PVkVSUklERSwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfTFRQX09WRVJSSURFIn0sCi0gIHtSX0NPTU1FTlQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX0NPTU1FTlQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn0sCi0gIHtSX1JFU0VSVkVELCAwLCAwLCAzMiwgZmFsc2UsIDAsIDAsIGhwcGFfc29tX3JlbG9jLCAiUl9SRVNFUlZFRCJ9LAotICB7Ul9SRVNFUlZFRCwgMCwgMCwgMzIsIGZhbHNlLCAwLCAwLCBocHBhX3NvbV9yZWxvYywgIlJfUkVTRVJWRUQifSwKLSAge1JfUkVTRVJWRUQsIDAsIDAsIDMyLCBmYWxzZSwgMCwgMCwgaHBwYV9zb21fcmVsb2MsICJSX1JFU0VSVkVEIn19OwotICAKLS8qIEluaXRpYWxpemUgdGhlIFNPTSByZWxvY2F0aW9uIHF1ZXVlLiAgQnkgZGVmaW5pdGlvbiB0aGUgcXVldWUgaG9sZHMKLSAgIHRoZSBsYXN0IGZvdXIgbXVsdGlieXRlIGZpeHVwcy4gICovCi0gIAotc3RhdGljIHZvaWQKLXNvbV9pbml0aWFsaXplX3JlbG9jX3F1ZXVlIChxdWV1ZSkKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgcXVldWVbMF0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVswXS5zaXplID0gMDsKLSAgcXVldWVbMV0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVsxXS5zaXplID0gMDsKLSAgcXVldWVbMl0ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVsyXS5zaXplID0gMDsKLSAgcXVldWVbM10ucmVsb2MgPSBOVUxMOwotICBxdWV1ZVszXS5zaXplID0gMDsKLX0KLQotLyogSW5zZXJ0IGEgbmV3IHJlbG9jYXRpb24gaW50byB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcmVsb2NfcXVldWVfaW5zZXJ0IChwLCBzaXplLCBxdWV1ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIHF1ZXVlWzNdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gIHF1ZXVlWzNdLnNpemUgPSBxdWV1ZVsyXS5zaXplOwotICBxdWV1ZVsyXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgcXVldWVbMV0ucmVsb2MgPSBxdWV1ZVswXS5yZWxvYzsKLSAgcXVldWVbMV0uc2l6ZSA9IHF1ZXVlWzBdLnNpemU7Ci0gIHF1ZXVlWzBdLnJlbG9jID0gcDsKLSAgcXVldWVbMF0uc2l6ZSA9IHNpemU7Ci19Ci0KLS8qIFdoZW4gYW4gZW50cnkgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUgaXMgcmV1c2VkLCB0aGUgZW50cnkgbW92ZXMKLSAgIHRvIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuICAqLwotCi1zdGF0aWMgdm9pZAotc29tX3JlbG9jX3F1ZXVlX2ZpeCAocXVldWUsIGluZGV4KQotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotICAgICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoaW5kZXggPT0gMSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICp0bXAxID0gcXVldWVbMF0ucmVsb2M7Ci0gICAgICB1bnNpZ25lZCBpbnQgdG1wMiA9IHF1ZXVlWzBdLnNpemU7Ci0gICAgICBxdWV1ZVswXS5yZWxvYyA9IHF1ZXVlWzFdLnJlbG9jOwotICAgICAgcXVldWVbMF0uc2l6ZSA9IHF1ZXVlWzFdLnNpemU7Ci0gICAgICBxdWV1ZVsxXS5yZWxvYyA9IHRtcDE7Ci0gICAgICBxdWV1ZVsxXS5zaXplID0gdG1wMjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluZGV4ID09IDIpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqdG1wMSA9IHF1ZXVlWzBdLnJlbG9jOwotICAgICAgdW5zaWduZWQgaW50IHRtcDIgPSBxdWV1ZVswXS5zaXplOwotICAgICAgcXVldWVbMF0ucmVsb2MgPSBxdWV1ZVsyXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzBdLnNpemUgPSBxdWV1ZVsyXS5zaXplOwotICAgICAgcXVldWVbMl0ucmVsb2MgPSBxdWV1ZVsxXS5yZWxvYzsKLSAgICAgIHF1ZXVlWzJdLnNpemUgPSBxdWV1ZVsxXS5zaXplOwotICAgICAgcXVldWVbMV0ucmVsb2MgPSB0bXAxOwotICAgICAgcXVldWVbMV0uc2l6ZSA9IHRtcDI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbmRleCA9PSAzKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnRtcDEgPSBxdWV1ZVswXS5yZWxvYzsKLSAgICAgIHVuc2lnbmVkIGludCB0bXAyID0gcXVldWVbMF0uc2l6ZTsKLSAgICAgIHF1ZXVlWzBdLnJlbG9jID0gcXVldWVbM10ucmVsb2M7Ci0gICAgICBxdWV1ZVswXS5zaXplID0gcXVldWVbM10uc2l6ZTsKLSAgICAgIHF1ZXVlWzNdLnJlbG9jID0gcXVldWVbMl0ucmVsb2M7Ci0gICAgICBxdWV1ZVszXS5zaXplID0gcXVldWVbMl0uc2l6ZTsKLSAgICAgIHF1ZXVlWzJdLnJlbG9jID0gcXVldWVbMV0ucmVsb2M7Ci0gICAgICBxdWV1ZVsyXS5zaXplID0gcXVldWVbMV0uc2l6ZTsKLSAgICAgIHF1ZXVlWzFdLnJlbG9jID0gdG1wMTsKLSAgICAgIHF1ZXVlWzFdLnNpemUgPSB0bXAyOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYWJvcnQoKTsKLX0KLQotLyogU2VhcmNoIGZvciBhIHBhcnRpY3VsYXIgcmVsb2NhdGlvbiBpbiB0aGUgcmVsb2NhdGlvbiBxdWV1ZS4gICovCi0KLXN0YXRpYyBpbnQKLXNvbV9yZWxvY19xdWV1ZV9maW5kIChwLCBzaXplLCBxdWV1ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIHN0cnVjdCByZWxvY19xdWV1ZSAqcXVldWU7Ci17Ci0gIGlmIChxdWV1ZVswXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVswXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbMF0uc2l6ZSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHF1ZXVlWzFdLnJlbG9jICYmICFtZW1jbXAgKHAsIHF1ZXVlWzFdLnJlbG9jLCBzaXplKQotICAgICAgJiYgc2l6ZSA9PSBxdWV1ZVsxXS5zaXplKQotICAgIHJldHVybiAxOwotICBpZiAocXVldWVbMl0ucmVsb2MgJiYgIW1lbWNtcCAocCwgcXVldWVbMl0ucmVsb2MsIHNpemUpCi0gICAgICAmJiBzaXplID09IHF1ZXVlWzJdLnNpemUpCi0gICAgcmV0dXJuIDI7Ci0gIGlmIChxdWV1ZVszXS5yZWxvYyAmJiAhbWVtY21wIChwLCBxdWV1ZVszXS5yZWxvYywgc2l6ZSkKLSAgICAgICYmIHNpemUgPT0gcXVldWVbM10uc2l6ZSkKLSAgICByZXR1cm4gMzsKLSAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi10cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIHNpemUsIHF1ZXVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXA7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpbnQgcXVldWVfaW5kZXggPSBzb21fcmVsb2NfcXVldWVfZmluZCAocCwgc2l6ZSwgcXVldWUpOwotCi0gIGlmIChxdWV1ZV9pbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICAvKiBGb3VuZCB0aGlzIGluIGEgcHJldmlvdXMgZml4dXAuICBVbmRvIHRoZSBmaXh1cCB3ZQotCSBqdXN0IGJ1aWx0IGFuZCB1c2UgUl9QUkVWX0ZJWFVQIGluc3RlYWQuICBXZSBzYXZlZCAKLQkgYSB0b3RhbCBvZiBzaXplIC0gMSBieXRlcyBpbiB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgUl9QUkVWX0ZJWFVQICsgcXVldWVfaW5kZXgsIHApOwotICAgICAgcCArPSAxOwotICAgICAgKnN1YnNwYWNlX3JlbG9jX3NpemVwICs9IDE7Ci0gICAgICBzb21fcmVsb2NfcXVldWVfZml4IChxdWV1ZSwgcXVldWVfaW5kZXgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgKHAsIHNpemUsIHF1ZXVlKTsKLSAgICAgICpzdWJzcGFjZV9yZWxvY19zaXplcCArPSBzaXplOwotICAgICAgcCArPSBzaXplOwotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEVtaXQgdGhlIHByb3BlciBSX05PX1JFTE9DQVRJT04gZml4dXBzIHRvIG1hcCB0aGUgbmV4dCBTS0lQCi0gICBieXRlcyB3aXRob3V0IGFueSByZWxvY2F0aW9uLiAgVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBzdWJzcGFjZQotICAgcmVsb2NhdGlvbiBzdHJlYW0gdmlhIFNVQlNQQUNFX1JFTE9DX1NJWkVfUDsgYWxzbyByZXR1cm4gdGhlIAotICAgY3VycmVudCBwb2ludGVyIGludG8gdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotc29tX3JlbG9jX3NraXAgKGFiZmQsIHNraXAsIHAsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgc2tpcDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgLyogVXNlIGEgNCBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeSB3aXRoIGEgbWF4aW1hbCB2YWx1ZQotICAgICB0aGVuIFJfUFJFVl9GSVhVUHMgdG8gZ2V0IHRoZSBkaWZmZXJlbmNlIGRvd24gdG8gYQotICAgICByZWFzb25hYmxlIHNpemUuICAqLwotICBpZiAoc2tpcCA+PSAweDEwMDAwMDApCi0gICAgewotICAgICAgc2tpcCAtPSAweDEwMDAwMDA7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIDMxLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgcCArIDEpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgMHhmZmZmLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgICB3aGlsZSAoc2tpcCA+PSAweDEwMDAwMDApCi0JewotCSAgc2tpcCAtPSAweDEwMDAwMDA7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfUFJFVl9GSVhVUCwgcCk7Ci0JICBwKys7Ci0JICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gMTsKLQkgIC8qIE5vIG5lZWQgdG8gYWRqdXN0IHF1ZXVlIGhlcmUgc2luY2Ugd2UgYXJlIHJlcGVhdGluZyB0aGUKLQkgICAgIG1vc3QgcmVjZW50IGZpeHVwLiAgKi8KLQl9Ci0gICAgfQotICAKLSAgLyogVGhlIGRpZmZlcmVuY2UgbXVzdCBiZSBsZXNzIHRoYW4gMHgxMDAwMDAwLiAgVXNlIG9uZSAKLSAgICAgbW9yZSBSX05PX1JFTE9DQVRJT04gZW50cnkgdG8gZ2V0IHRvIHRoZSByaWdodCBkaWZmZXJlbmNlLiAgKi8KLSAgaWYgKChza2lwICYgMykgPT0gMCAmJiBza2lwIDw9IDB4YzAwMDAgJiYgc2tpcCA+IDApCi0gICAgewotICAgICAgLyogRGlmZmVyZW5jZSBjYW4gYmUgaGFuZGxlZCBpbiBhIHNpbXBsZSBzaW5nbGUtYnl0ZQotCSBSX05PX1JFTE9DQVRJT04gZW50cnkuICAqLwotICAgICAgaWYgKHNraXAgPD0gMHg2MCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIChza2lwID4+IDIpIC0gMSwgcCk7Ci0JICAqc3Vic3BhY2VfcmVsb2Nfc2l6ZXAgKz0gMTsKLQkgIHArKzsKLQl9Ci0gICAgICAvKiBIYW5kbGUgaXQgd2l0aCBhIHR3byBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeS4gICovCi0gICAgICBlbHNlIGlmIChza2lwIDw9IDB4MTAwMCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIFJfTk9fUkVMT0NBVElPTiArIDI0ICsgKCgoc2tpcCA+PiAyKSAtIDEpID4+IDgpLCBwKTsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgKHNraXAgPj4gMikgLSAxLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAyLCBxdWV1ZSk7Ci0JfQotICAgICAgLyogSGFuZGxlIGl0IHdpdGggYSB0aHJlZSBieXRlIFJfTk9fUkVMT0NBVElPTiBlbnRyeS4gICovCi0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAyOCArICgoKHNraXAgPj4gMikgLSAxKSA+PiAxNiksIHApOwotCSAgYmZkX3B1dF8xNiAoYWJmZCwgKHNraXAgPj4gMikgLSAxLCBwICsgMSk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0JfQotICAgIH0KLSAgLyogVWdoLiAgUHVudCBhbmQgdXNlIGEgNCBieXRlIGVudHJ5LiAgKi8KLSAgZWxzZSBpZiAoc2tpcCA+IDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX05PX1JFTE9DQVRJT04gKyAzMSwgcCk7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIChza2lwIC0gMSkgPj4gMTYsIHAgKyAxKTsKLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIHNraXAgLSAxLCBwICsgMik7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA0LCBxdWV1ZSk7Ci0gICAgfQotICByZXR1cm4gcDsKLX0KLQotLyogRW1pdCB0aGUgcHJvcGVyIFJfREFUQV9PVkVSUklERSBmaXh1cHMgdG8gaGFuZGxlIGEgbm9uemVybyBhZGRlbmQKLSAgIGZyb20gYSBCRkQgcmVsb2NhdGlvbi4gIFVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgc3Vic3BhY2UgcmVsb2NhdGlvbgotICAgc3RyZWFtIHZpYSBTVUJTUEFDRV9SRUxPQ19TSVpFX1A7IGFsc28gcmV0dXJuIHRoZSBjdXJyZW50IHBvaW50ZXIKLSAgIGludG8gdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotc29tX3JlbG9jX2FkZGVuZCAoYWJmZCwgYWRkZW5kLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgcXVldWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGFkZGVuZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgaW50ICpzdWJzcGFjZV9yZWxvY19zaXplcDsKLSAgICAgc3RydWN0IHJlbG9jX3F1ZXVlICpxdWV1ZTsKLXsKLSAgaWYgKCh1bnNpZ25lZCkoYWRkZW5kKSArIDB4ODAgPCAweDEwMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDEsIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCBhZGRlbmQsIHAgKyAxKTsKLSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDIsIHF1ZXVlKTsgCi0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQpIChhZGRlbmQpICsgMHg4MDAwIDwgMHgxMDAwMCkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDIsIHApOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCAzLCBxdWV1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQpIChhZGRlbmQpICsgMHg4MDAwMDAgPCAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3B1dF84IChhYmZkLCBSX0RBVEFfT1ZFUlJJREUgKyAzLCBwKTsKLSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYWRkZW5kID4+IDE2LCBwICsgMSk7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBhZGRlbmQsIHAgKyAyKTsKLSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDQsIHF1ZXVlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfcHV0XzggKGFiZmQsIFJfREFUQV9PVkVSUklERSArIDQsIHApOwotICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgYWRkZW5kLCBwICsgMSk7Ci0gICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA1LCBxdWV1ZSk7Ci0gICAgfQotICByZXR1cm4gcDsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgcmVsb2NhdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXNvbV9yZWxvY19jYWxsIChhYmZkLCBwLCBzdWJzcGFjZV9yZWxvY19zaXplcCwgYmZkX3JlbG9jLCBzeW1fbnVtLCBxdWV1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwOwotICAgICB1bnNpZ25lZCBpbnQgKnN1YnNwYWNlX3JlbG9jX3NpemVwOwotICAgICBhcmVsZW50ICpiZmRfcmVsb2M7Ci0gICAgIGludCBzeW1fbnVtOwotICAgICBzdHJ1Y3QgcmVsb2NfcXVldWUgKnF1ZXVlOwotewotICBpbnQgYXJnX2JpdHMgPSBIUFBBX1JfQVJHX1JFTE9DIChiZmRfcmVsb2MtPmFkZGVuZCk7Ci0gIGludCBydG5fYml0cyA9IGFyZ19iaXRzICYgMHgzOwotICBpbnQgdHlwZSwgZG9uZSA9IDA7Ci0gIAotICAvKiBZb3UnbGwgbmV2ZXIgYmVsaWV2ZSBhbGwgdGhpcyBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHJlbG9jYXRpb25zCi0gICAgIGZvciBmdW5jdGlvbiBjYWxscy4gIEhhdmluZyB0byBjb21wdXRlIGFuZCBwYWNrIHRoZSBhcmd1bWVudAotICAgICByZWxvY2F0aW9uIGJpdHMgaXMgdGhlIHJlYWwgbmlnaHRtYXJlLgotICAgICAKLSAgICAgSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gaG93IHRoaXMgd29ya3MsIGp1c3QgZm9yZ2V0IGl0LiAgWW91IHJlYWxseQotICAgICBkbyBub3Qgd2FudCB0byBrbm93IGFib3V0IHRoaXMgYnJhaW5kYW1hZ2UuICAqLwotCi0gIC8qIEZpcnN0IHNlZSBpZiB0aGlzIGNhbiBiZSBkb25lIHdpdGggYSAic2ltcGxlIiByZWxvY2F0aW9uLiAgU2ltcGxlCi0gICAgIHJlbG9jYXRpb25zIGhhdmUgYSBzeW1ib2wgbnVtYmVyIDwgMHgxMDAgYW5kIGhhdmUgc2ltcGxlIGVuY29kaW5ncwotICAgICBvZiBhcmd1bWVudCByZWxvY2F0aW9ucy4gICovCi0KLSAgaWYgKHN5bV9udW0gPCAweDEwMCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGFyZ19iaXRzKQotCXsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCSAgdHlwZSA9IDA7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgODoKLQljYXNlIDEgPDwgOCB8IDE6Ci0JICB0eXBlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgMSA8PCA4IHwgMSA8PCA2OgotCWNhc2UgMSA8PCA4IHwgMSA8PCA2IHwgMToKLQkgIHR5cGUgPSAyOwotCSAgYnJlYWs7Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQ6Ci0JY2FzZSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxOgotCSAgdHlwZSA9IDM7Ci0JICBicmVhazsKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNCB8IDEgPDwgMjoKLQljYXNlIDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNCB8IDEgPDwgMiB8IDE6Ci0JICB0eXBlID0gNDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiBOb3Qgb25lIG9mIHRoZSBlYXN5IGVuY29kaW5ncy4gIFRoaXMgd2lsbCBoYXZlIHRvIGJlCi0JICAgICBoYW5kbGVkIGJ5IHRoZSBtb3JlIGNvbXBsZXggY29kZSBiZWxvdy4gICovCi0JICB0eXBlID0gLTE7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAodHlwZSAhPSAtMSkKLQl7Ci0JICAvKiBBY2NvdW50IGZvciB0aGUgcmV0dXJuIHZhbHVlIHRvby4gICovCi0JICBpZiAocnRuX2JpdHMpCi0JICAgIHR5cGUgKz0gNTsKLQotCSAgLyogRW1pdCBhIDIgYnl0ZSByZWxvY2F0aW9uLiAgVGhlbiBzZWUgaWYgaXQgY2FuIGJlIGhhbmRsZWQKLQkgICAgIHdpdGggYSByZWxvY2F0aW9uIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgdHlwZSwgcCk7Ci0JICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAxKTsKLQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDIsIHF1ZXVlKTsKLQkgIGRvbmUgPSAxOwotCX0KLSAgICB9Ci0gIAotICAvKiBJZiB0aGlzIGNvdWxkIG5vdCBiZSBoYW5kbGVkIHdpdGggYSBzaW1wbGUgcmVsb2NhdGlvbiwgdGhlbiBkbyBhIGhhcmQKLSAgICAgb25lLiAgSGFyZCByZWxvY2F0aW9ucyBvY2N1ciBpZiB0aGUgc3ltYm9sIG51bWJlciB3YXMgdG9vIGhpZ2ggb3IgaWYKLSAgICAgdGhlIGVuY29kaW5nIG9mIGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBpcyB0b28gY29tcGxleC4gICovCi0gIGlmICghIGRvbmUpCi0gICAgewotICAgICAgLyogRG9uJ3QgYXNrIGFib3V0IHRoZXNlIG1hZ2ljIHNlcXVlbmNlcy4gIEkgdG9vayB0aGVtIHN0cmFpZ2h0Ci0JIGZyb20gZ2FzLTEuMzYgd2hpY2ggdG9vayB0aGVtIGZyb20gdGhlIGEub3V0IG1hbiBwYWdlLiAgKi8KLSAgICAgIHR5cGUgPSBydG5fYml0czsKLSAgICAgIGlmICgoYXJnX2JpdHMgPj4gNiAmIDB4ZikgPT0gMHhlKQotCXR5cGUgKz0gOSAqIDQwOwotICAgICAgZWxzZQotCXR5cGUgKz0gKDMgKiAoYXJnX2JpdHMgPj4gOCAmIDMpICsgKGFyZ19iaXRzID4+IDYgJiAzKSkgKiA0MDsKLSAgICAgIGlmICgoYXJnX2JpdHMgPj4gMiAmIDB4ZikgPT0gMHhlKQotCXR5cGUgKz0gOSAqIDQ7Ci0gICAgICBlbHNlCi0JdHlwZSArPSAoMyAqIChhcmdfYml0cyA+PiA0ICYgMykgKyAoYXJnX2JpdHMgPj4gMiAmIDMpKSAqIDQ7Ci0gICAgICAKLSAgICAgIC8qIE91dHB1dCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSByZWxvY2F0aW9uLiAgVGhlc2UgZGVzY3JpYmUKLQkgdGhlIGxlbmd0aCBvZiB0aGUgcmVsb2NhdGlvbiBhbmQgZW5jb2Rpbmcgc3R5bGUuICAqLwotICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMTAKLQkJICsgMiAqIChzeW1fbnVtID49IDB4MTAwKSArICh0eXBlID49IDB4MTAwKSwKLQkJIHApOwotICAgICAgYmZkX3B1dF84IChhYmZkLCB0eXBlLCBwICsgMSk7Ci0gICAgICAKLSAgICAgIC8qIE5vdyBvdXRwdXQgdGhlIHN5bWJvbCBpbmRleCBhbmQgc2VlIGlmIHRoaXMgYml6YXJyZSByZWxvY2F0aW9uCi0JIGp1c3QgaGFwcGVuZWQgdG8gYmUgaW4gdGhlIHJlbG9jYXRpb24gcXVldWUuICAqLwotICAgICAgaWYgKHN5bV9udW0gPCAweDEwMCkKLQl7Ci0JICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0sIHAgKyAyKTsKLQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgc3Vic3BhY2VfcmVsb2Nfc2l6ZXAsIHAsIDMsIHF1ZXVlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMik7Ci0JICBiZmRfcHV0XzE2IChhYmZkLCBzeW1fbnVtLCBwICsgMyk7Ci0JICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsIHN1YnNwYWNlX3JlbG9jX3NpemVwLCBwLCA1LCBxdWV1ZSk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHA7Ci19Ci0KLQotLyogUmV0dXJuIHRoZSBsb2dhcml0aG0gb2YgWCwgYmFzZSAyLCBjb25zaWRlcmluZyBYIHVuc2lnbmVkLiAKLSAgIEFib3J0IC0xIGlmIFggaXMgbm90IGEgcG93ZXIgb3IgdHdvIG9yIGlzIHplcm8uICAqLwotCi1zdGF0aWMgaW50Ci1sb2cyICh4KQotICAgICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgaW50IGxvZyA9IDA7Ci0KLSAgLyogVGVzdCBmb3IgMCBvciBhIHBvd2VyIG9mIDIuICAqLwotICBpZiAoeCA9PSAwIHx8IHggIT0gKHggJiAteCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHdoaWxlICgoeCA+Pj0gMSkgIT0gMCkKLSAgICBsb2crKzsKLSAgcmV0dXJuIGxvZzsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZQotaHBwYV9zb21fcmVsb2MgKGFiZmQsIHJlbG9jX2VudHJ5LCBzeW1ib2xfaW4sIGRhdGEsCi0JCWlucHV0X3NlY3Rpb24sIG91dHB1dF9iZmQsIGVycm9yX21lc3NhZ2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqcmVsb2NfZW50cnk7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbF9pbjsKLSAgICAgUFRSIGRhdGE7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIGNoYXIgKiplcnJvcl9tZXNzYWdlOwotewotICBpZiAob3V0cHV0X2JmZCkKLSAgICB7Ci0gICAgICByZWxvY19lbnRyeS0+YWRkcmVzcyArPSBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmV0dXJuIGJmZF9yZWxvY19vazsKLSAgICB9Ci0gIHJldHVybiBiZmRfcmVsb2Nfb2s7Ci19Ci0KLS8qIEdpdmVuIGEgZ2VuZXJpYyBIUFBBIHJlbG9jYXRpb24gdHlwZSwgdGhlIGluc3RydWN0aW9uIGZvcm1hdCwKLSAgIGFuZCBhIGZpZWxkIHNlbGVjdG9yLCByZXR1cm4gb25lIG9yIG1vcmUgYXBwcm9wcmlhdGUgU09NIHJlbG9jYXRpb25zLiAgKi8KLQotaW50ICoqCi1ocHBhX3NvbV9nZW5fcmVsb2NfdHlwZSAoYWJmZCwgYmFzZV90eXBlLCBmb3JtYXQsIGZpZWxkLCBzeW1fZGlmZiwgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBiYXNlX3R5cGU7Ci0gICAgIGludCBmb3JtYXQ7Ci0gICAgIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCBmaWVsZDsKLSAgICAgaW50IHN5bV9kaWZmOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGludCAqZmluYWxfdHlwZSwgKipmaW5hbF90eXBlczsKLQotICBmaW5hbF90eXBlcyA9IChpbnQgKiopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQgKikgKiA2KTsKLSAgZmluYWxfdHlwZSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotICBpZiAoIWZpbmFsX3R5cGVzIHx8ICFmaW5hbF90eXBlKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIFRoZSBmaWVsZCBzZWxlY3RvciBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIHJlbG9jYXRpb25zIHRvIGJlIAotICAgICBnZW5lcmF0ZWQuICBJdCdzIGltcG9zc2libGUgdG8ga25vdyBhdCB0aGlzIG1vbWVudCBpZiBhZGRpdGlvbmFsCi0gICAgIHJlbG9jYXRpb25zIHdpbGwgYmUgbmVlZGVkLCBzbyB3ZSBtYWtlIHRoZW0uICBUaGUgY29kZSB0byBhY3R1YWxseQotICAgICB3cml0ZSB0aGUgcmVsb2NhdGlvbi9maXh1cCBzdHJlYW0gaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nCi0gICAgIGFueSByZWR1bmRhbnQgcmVsb2NhdGlvbnMuICAqLwotICBzd2l0Y2ggKGZpZWxkKQotICAgIHsKLSAgICAgIGNhc2UgZV9mc2VsOgotICAgICAgY2FzZSBlX3BzZWw6Ci0gICAgICBjYXNlIGVfbHBzZWw6Ci0gICAgICBjYXNlIGVfcnBzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzFdID0gTlVMTDsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV90c2VsOgotICAgICAgY2FzZSBlX2x0c2VsOgotICAgICAgY2FzZSBlX3J0c2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCWlmIChmaWVsZCA9PSBlX3RzZWwpCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX0ZTRUw7Ci0JZWxzZSBpZiAoZmllbGQgPT0gZV9sdHNlbCkKLQkgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQllbHNlCi0JICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX2xzc2VsOgotICAgICAgY2FzZSBlX3Jzc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfU19NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9sc2VsOgotICAgICAgY2FzZSBlX3JzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OX01PREU7Ci0JZmluYWxfdHlwZXNbMV0gPSBmaW5hbF90eXBlOwotCWZpbmFsX3R5cGVzWzJdID0gTlVMTDsKLQkqZmluYWxfdHlwZSA9IGJhc2VfdHlwZTsKLQlicmVhazsKLQotICAgICAgY2FzZSBlX2xkc2VsOgotICAgICAgY2FzZSBlX3Jkc2VsOgotCWZpbmFsX3R5cGVzWzBdID0gKGludCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoaW50KSk7Ci0JaWYgKCFmaW5hbF90eXBlc1swXSkKLQkgIHJldHVybiBOVUxMOwotCSpmaW5hbF90eXBlc1swXSA9IFJfRF9NT0RFOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9scnNlbDoKLSAgICAgIGNhc2UgZV9ycnNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX1JfTU9ERTsKLQlmaW5hbF90eXBlc1sxXSA9IGZpbmFsX3R5cGU7Ci0JZmluYWxfdHlwZXNbMl0gPSBOVUxMOwotCSpmaW5hbF90eXBlID0gYmFzZV90eXBlOwotCWJyZWFrOwotCi0gICAgICBjYXNlIGVfbnNlbDoKLQlmaW5hbF90eXBlc1swXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMF0pCi0JICByZXR1cm4gTlVMTDsKLQkqZmluYWxfdHlwZXNbMF0gPSBSX04xU0VMOwotCWZpbmFsX3R5cGVzWzFdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1syXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgZV9ubHNlbDoKLSAgICAgIGNhc2UgZV9ubHJzZWw6Ci0JZmluYWxfdHlwZXNbMF0gPSAoaW50ICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQlpZiAoIWZpbmFsX3R5cGVzWzBdKQotCSAgcmV0dXJuIE5VTEw7Ci0JKmZpbmFsX3R5cGVzWzBdID0gUl9OMFNFTDsKLQlmaW5hbF90eXBlc1sxXSA9IChpbnQgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKGludCkpOwotCWlmICghZmluYWxfdHlwZXNbMV0pCi0JICByZXR1cm4gTlVMTDsKLQlpZiAoZmllbGQgPT0gZV9ubHNlbCkKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfTl9NT0RFOwotCWVsc2UKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfUl9NT0RFOwotCWZpbmFsX3R5cGVzWzJdID0gZmluYWxfdHlwZTsKLQlmaW5hbF90eXBlc1szXSA9IE5VTEw7Ci0JKmZpbmFsX3R5cGUgPSBiYXNlX3R5cGU7Ci0JYnJlYWs7Ci0gICAgfQotICAKLSAgc3dpdGNoIChiYXNlX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9IUFBBOgotICAgICAgLyogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgbmVlZHMgKnZlcnkqIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICAgICAgaWYgKHN5bV9kaWZmKQotCXsKLQkgIGZpbmFsX3R5cGVzWzBdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzFdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzJdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzNdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGlmICghZmluYWxfdHlwZXNbMF0gfHwgIWZpbmFsX3R5cGVzWzFdIHx8ICFmaW5hbF90eXBlc1syXSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgaWYgKGZpZWxkID09IGVfZnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9yc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JICBlbHNlIGlmIChmaWVsZCA9PSBlX2xzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfQ09NUDI7Ci0JICAqZmluYWxfdHlwZXNbMl0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzNdID0gUl9DT01QMTsKLQkgIGZpbmFsX3R5cGVzWzRdID0gZmluYWxfdHlwZTsKLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlc1s0XSA9IFJfREFUQV9FWFBSOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0NPREVfRVhQUjsKLQkgIGZpbmFsX3R5cGVzWzVdID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIFBMQUJFTHMgZ2V0IHRoZWlyIG93biByZWxvY2F0aW9uIHR5cGUuICAqLwotICAgICAgZWxzZSBpZiAoZmllbGQgPT0gZV9wc2VsCi0JICB8fCBmaWVsZCA9PSBlX2xwc2VsCi0JICB8fCBmaWVsZCA9PSBlX3Jwc2VsKQotCXsKLQkgIC8qIEEgUExBQkVMIHJlbG9jYXRpb24gdGhhdCBoYXMgYSBzaXplIG9mIDMyIGJpdHMgbXVzdAotCSAgICAgYmUgYSBSX0RBVEFfUExBQkVMLiAgQWxsIG90aGVycyBhcmUgUl9DT0RFX1BMQUJFTHMuICAqLwotCSAgaWYgKGZvcm1hdCA9PSAzMikKLQkgICAgKmZpbmFsX3R5cGUgPSBSX0RBVEFfUExBQkVMOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZSA9IFJfQ09ERV9QTEFCRUw7Ci0JfQotICAgICAgLyogUElDIHN0dWZmLiAgKi8KLSAgICAgIGVsc2UgaWYgKGZpZWxkID09IGVfdHNlbAotCSAgfHwgZmllbGQgPT0gZV9sdHNlbAotCSAgfHwgZmllbGQgPT0gZV9ydHNlbCkKLQkqZmluYWxfdHlwZSA9IFJfRExUX1JFTDsKLSAgICAgIC8qIEEgcmVsb2NhdGlvbiBpbiB0aGUgZGF0YSBzcGFjZSBpcyBhbHdheXMgYSBmdWxsIDMyYml0cy4gICovCi0gICAgICBlbHNlIGlmIChmb3JtYXQgPT0gMzIpCi0JewotCSAgKmZpbmFsX3R5cGUgPSBSX0RBVEFfT05FX1NZTUJPTDsKLQotCSAgLyogSWYgdGhlcmUncyBubyBTT00gc3ltYm9sIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQkZECi0JICAgICBzeW1ib2wsIHRoZW4gc2V0IHRoZSBzeW1ib2wgdHlwZSB0byBTVF9EQVRBLgotCi0JICAgICBPbmx5IGRvIHRoaXMgaWYgdGhlIHR5cGUgaXMgZ29pbmcgdG8gZGVmYXVsdCBsYXRlciB3aGVuCi0JICAgICB3ZSB3cml0ZSB0aGUgb2JqZWN0IGZpbGUuCi0KLQkgICAgIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSBsaW5rZXIgbmV2ZXIgZW5jb3VudGVycyBhbgotCSAgICAgUl9EQVRBX09ORV9TWU1CT0wgcmVsb2MgaW52b2x2aW5nIGFuIFNUX0NPREUgc3ltYm9sLgotCi0JICAgICBUaGlzIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gZ2VuZXJhdGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0JICAgICB0YWJsZXMuCi0KLQkgICAgIE5vdGUgdGhhdCBvbmUgZGF5IHdlIG1heSBuZWVkIHRvIGFsc28gZW1pdCBCRUdJTl9CUlRBQiBhbmQKLQkgICAgIEVORF9CUlRBQiB0byBwcmV2ZW50IHRoZSBsaW5rZXIgZnJvbSBvcHRpbWl6aW5nIGF3YXkgaW5zbnMKLQkgICAgIGluIGV4Y2VwdGlvbiBoYW5kbGluZyByZWdpb25zLiAgKi8KLQkgIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkgICAgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMAotCSAgICAgICYmIChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwCi0JICAgICAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JICAgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOwotCX0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFJfSFBQQV9HT1RPRkY6Ci0gICAgICAvKiBNb3JlIFBMQUJFTCBzcGVjaWFsIGNhc2VzLiAgKi8KLSAgICAgIGlmIChmaWVsZCA9PSBlX3BzZWwKLQkgIHx8IGZpZWxkID09IGVfbHBzZWwKLQkgIHx8IGZpZWxkID09IGVfcnBzZWwpCi0JKmZpbmFsX3R5cGUgPSBSX0RBVEFfUExBQkVMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJfSFBQQV9DT01QTEVYOgotICAgICAgLyogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgbmVlZHMgKnZlcnkqIHNwZWNpYWwgaGFuZGxpbmcuICAqLwotICAgICAgaWYgKHN5bV9kaWZmKQotCXsKLQkgIGZpbmFsX3R5cGVzWzBdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzFdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzJdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGZpbmFsX3R5cGVzWzNdID0gKGludCAqKWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChpbnQpKTsKLQkgIGlmICghZmluYWxfdHlwZXNbMF0gfHwgIWZpbmFsX3R5cGVzWzFdIHx8ICFmaW5hbF90eXBlc1syXSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgaWYgKGZpZWxkID09IGVfZnNlbCkKLQkgICAgKmZpbmFsX3R5cGVzWzBdID0gUl9GU0VMOwotCSAgZWxzZSBpZiAoZmllbGQgPT0gZV9yc2VsKQotCSAgICAqZmluYWxfdHlwZXNbMF0gPSBSX1JTRUw7Ci0JICBlbHNlIGlmIChmaWVsZCA9PSBlX2xzZWwpCi0JICAgICpmaW5hbF90eXBlc1swXSA9IFJfTFNFTDsKLQkgICpmaW5hbF90eXBlc1sxXSA9IFJfQ09NUDI7Ci0JICAqZmluYWxfdHlwZXNbMl0gPSBSX0NPTVAyOwotCSAgKmZpbmFsX3R5cGVzWzNdID0gUl9DT01QMTsKLQkgIGZpbmFsX3R5cGVzWzRdID0gZmluYWxfdHlwZTsKLQkgIGlmIChmb3JtYXQgPT0gMzIpCi0JICAgICpmaW5hbF90eXBlc1s0XSA9IFJfREFUQV9FWFBSOwotCSAgZWxzZQotCSAgICAqZmluYWxfdHlwZXNbNF0gPSBSX0NPREVfRVhQUjsKLQkgIGZpbmFsX3R5cGVzWzVdID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQlicmVhazsKLQotICAgIGNhc2UgUl9IUFBBX05PTkU6Ci0gICAgY2FzZSBSX0hQUEFfQUJTX0NBTEw6Ci0gICAgY2FzZSBSX0hQUEFfUENSRUxfQ0FMTDoKLSAgICAgIC8qIFJpZ2h0IG5vdyB3ZSBjYW4gZGVmYXVsdCBhbGwgdGhlc2UuICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gZmluYWxfdHlwZXM7Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVjdCBlbnRyeSBpbiB0aGUgUEEgU09NIHJlbG9jYXRpb24KLSAgIGhvd3RvIHRhYmxlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSAqCi1zb21fYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBjb2RlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotewotICBpZiAoKGludCkgY29kZSA8IChpbnQpIFJfTk9fUkVMT0NBVElPTiArIDI1NSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUICgoaW50KSBzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXS50eXBlID09IChpbnQpIGNvZGUpOwotICAgICAgcmV0dXJuICZzb21faHBwYV9ob3d0b190YWJsZVsoaW50KSBjb2RlXTsKLSAgICB9Ci0KLSAgcmV0dXJuIChyZWxvY19ob3d0b190eXBlICopIDA7Ci19Ci0KLS8qIFBlcmZvcm0gc29tZSBpbml0aWFsaXphdGlvbiBmb3IgYW4gb2JqZWN0LiAgU2F2ZSByZXN1bHRzIG9mIHRoaXMKLSAgIGluaXRpYWxpemF0aW9uIGluIHRoZSBCRkQuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi1zb21fb2JqZWN0X3NldHVwIChhYmZkLCBmaWxlX2hkcnAsIGF1eF9oZHJwLCBjdXJyZW50X29mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcnA7Ci0gICAgIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmF1eF9oZHJwOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IGZvdW5kOwotCi0gIC8qIHNvbV9ta29iamVjdCB3aWxsIHNldCBiZmRfZXJyb3IgaWYgc29tX21rb2JqZWN0IGZhaWxzLiAgKi8KLSAgaWYgKHNvbV9ta29iamVjdCAoYWJmZCkgIT0gdHJ1ZSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBTZXQgQkZEIGZsYWdzIGJhc2VkIG9uIHdoYXQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBTT00uICAqLwotICBhYmZkLT5mbGFncyA9IEJGRF9OT19GTEFHUzsKLSAgaWYgKGZpbGVfaGRycC0+c3ltYm9sX3RvdGFsKQotICAgIGFiZmQtPmZsYWdzIHw9IEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfCBIQVNfU1lNUyB8IEhBU19MT0NBTFM7Ci0KLSAgc3dpdGNoIChmaWxlX2hkcnAtPmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgREVNQU5EX01BR0lDOgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gKERfUEFHRUQgfCBXUF9URVhUIHwgRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoV1BfVEVYVCB8IEVYRUNfUCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVYRUNfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSAoRVhFQ19QKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgICBhYmZkLT5mbGFncyB8PSBIQVNfUkVMT0M7Ci0gICAgICBicmVhazsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICBjYXNlIFNITF9NQUdJQzoKLSNlbmRpZgotI2lmZGVmIERMX01BR0lDCi0gICAgY2FzZSBETF9NQUdJQzoKLSNlbmRpZgotICAgICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSB0byBob2xkIHRoZSBzYXZlZCBleGVjIGhlYWRlciBpbmZvcm1hdGlvbi4gICovCi0gIG9ial9zb21fZXhlY19kYXRhIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSAqKQotICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2RhdGEgKSk7Ci0gIGlmIChvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBUaGUgYnJhaW5kYW1hZ2VkIE9TRjEgbGlua2VyIHN3aXRjaGVkIGV4ZWNfZmxhZ3MgYW5kIGV4ZWNfZW50cnkhCi0KLSAgICAgV2UgdXNlZCB0byBpZGVudGlmeSBPU0YxIGJpbmFyaWVzIGJhc2VkIG9uIE5FV19WRVJTSU9OX0lELCBidXQKLSAgICAgYXBwYXJlbnRseSB0aGUgbGF0ZXN0IEhQVVggbGlua2VyIGlzIHVzaW5nIE5FV19WRVJTSU9OX0lEIG5vdy4KLQotICAgICBJdCdzIGFib3V0IHRpbWUsIE9TRiBoYXMgdXNlZCB0aGUgbmV3IGlkIHNpbmNlIGF0IGxlYXN0IDE5OTI7Ci0gICAgIEhQVVggZGlkbid0IHN0YXJ0IHRpbGwgbmVhcmx5IDE5OTUhLgotICAgIAotICAgICBUaGUgbmV3IGFwcHJvYWNoIGV4YW1pbmVzIHRoZSBlbnRyeSBmaWVsZC4gIElmIGl0J3MgemVybyBvciBub3QgNAotICAgICBieXRlIGFsaWduZWQgdGhlbiBpdCdzIG5vdCBhIHByb3BlciBjb2RlIGFkZHJlc3MgYW5kIHdlIGd1ZXNzIGl0J3MKLSAgICAgcmVhbGx5IHRoZSBleGVjdXRhYmxlIGZsYWdzLiAgKi8KLSAgZm91bmQgPSAwOwotICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID49IHNlY3Rpb24tPnZtYQotCSAgJiYgYXV4X2hkcnAtPmV4ZWNfZW50cnkgPCBzZWN0aW9uLT52bWEgKyBzZWN0aW9uLT5fY29va2VkX3NpemUpCi0JZm91bmQgPSAxOwotICAgIH0KLSAgaWYgKGF1eF9oZHJwLT5leGVjX2VudHJ5ID09IDAKLSAgICAgIHx8IChhdXhfaGRycC0+ZXhlY19lbnRyeSAmIDB4MykgIT0gMAotICAgICAgfHwgISBmb3VuZCkKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZmxhZ3M7Ci0gICAgICBvYmpfc29tX2V4ZWNfZGF0YSAoYWJmZCktPmV4ZWNfZmxhZ3MgPSBhdXhfaGRycC0+ZXhlY19lbnRyeTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfZ2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQpID0gYXV4X2hkcnAtPmV4ZWNfZW50cnkgKyBjdXJyZW50X29mZnNldDsKLSAgICAgIG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFncyA9IGF1eF9oZHJwLT5leGVjX2ZsYWdzOwotICAgIH0KLQotICBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9ocHBhLCBwYTEwKTsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF90b3RhbDsKLQotICAvKiBJbml0aWFsaXplIHRoZSBzYXZlZCBzeW1ib2wgdGFibGUgYW5kIHN0cmluZyB0YWJsZSB0byBOVUxMLiAgCi0gICAgIFNhdmUgaW1wb3J0YW50IG9mZnNldHMgYW5kIHNpemVzIGZyb20gdGhlIFNPTSBoZWFkZXIgaW50bwotICAgICB0aGUgQkZELiAgKi8KLSAgb2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpID0gKGNoYXIgICopIE5VTEw7Ci0gIG9ial9zb21fc3ltdGFiIChhYmZkKSA9IChzb21fc3ltYm9sX3R5cGUgKikgTlVMTDsKLSAgb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCkgPSBOVUxMOwotICBvYmpfc29tX3N0cmluZ3RhYl9zaXplIChhYmZkKSA9IGZpbGVfaGRycC0+c3ltYm9sX3N0cmluZ3Nfc2l6ZTsKLSAgb2JqX3NvbV9zeW1fZmlsZXBvcyAoYWJmZCkgPSBmaWxlX2hkcnAtPnN5bWJvbF9sb2NhdGlvbiArIGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX3N0cl9maWxlcG9zIChhYmZkKSA9IChmaWxlX2hkcnAtPnN5bWJvbF9zdHJpbmdzX2xvY2F0aW9uCi0JCQkJKyBjdXJyZW50X29mZnNldCk7Ci0gIG9ial9zb21fcmVsb2NfZmlsZXBvcyAoYWJmZCkgPSAoZmlsZV9oZHJwLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uCi0JCQkJICArIGN1cnJlbnRfb2Zmc2V0KTsKLSAgb2JqX3NvbV9leGVjX2RhdGEgKGFiZmQpLT5zeXN0ZW1faWQgPSBmaWxlX2hkcnAtPnN5c3RlbV9pZDsKLQotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotLyogQ29udmVydCBhbGwgb2YgdGhlIHNwYWNlIGFuZCBzdWJzcGFjZSBpbmZvIGludG8gQkZEIHNlY3Rpb25zLiAgRWFjaCBzcGFjZQotICAgY29udGFpbnMgYSBudW1iZXIgb2Ygc3Vic3BhY2VzLCB3aGljaCBpbiB0dXJuIGRlc2NyaWJlIHRoZSBtYXBwaW5nIGJldHdlZW4KLSAgIHJlZ2lvbnMgb2YgdGhlIGV4ZWMgZmlsZSwgYW5kIHRoZSBhZGRyZXNzIHNwYWNlIHRoYXQgdGhlIHByb2dyYW0gcnVucyBpbi4KLSAgIEJGRCBzZWN0aW9ucyB3aGljaCBjb3JyZXNwb25kIHRvIHNwYWNlcyB3aWxsIG92ZXJsYXAgdGhlIHNlY3Rpb25zIGZvciB0aGUKLSAgIGFzc29jaWF0ZWQgc3Vic3BhY2VzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNldHVwX3NlY3Rpb25zIChhYmZkLCBmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGhlYWRlciAqZmlsZV9oZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci17Ci0gIGNoYXIgKnNwYWNlX3N0cmluZ3M7Ci0gIHVuc2lnbmVkIGludCBzcGFjZV9pbmRleCwgaTsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3N1YnNwYWNlcyA9IDA7Ci0gIGFzZWN0aW9uICoqc3Vic3BhY2Vfc2VjdGlvbnMsICpzZWN0aW9uOwotCi0gIC8qIEZpcnN0LCByZWFkIGluIHNwYWNlIG5hbWVzICovCi0KLSAgc3BhY2Vfc3RyaW5ncyA9IGJmZF9tYWxsb2MgKGZpbGVfaGRyLT5zcGFjZV9zdHJpbmdzX3NpemUpOwotICBpZiAoIXNwYWNlX3N0cmluZ3MgJiYgZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19sb2NhdGlvbiwgCi0gIAkJU0VFS19TRVQpIDwgMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgaWYgKGJmZF9yZWFkIChzcGFjZV9zdHJpbmdzLCAxLCBmaWxlX2hkci0+c3BhY2Vfc3RyaW5nc19zaXplLCBhYmZkKQotICAgICAgIT0gZmlsZV9oZHItPnNwYWNlX3N0cmluZ3Nfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBMb29wIG92ZXIgYWxsIG9mIHRoZSBzcGFjZSBkaWN0aW9uYXJpZXMsIGJ1aWxkaW5nIHVwIHNlY3Rpb25zICovCi0gIGZvciAoc3BhY2VfaW5kZXggPSAwOyBzcGFjZV9pbmRleCA8IGZpbGVfaGRyLT5zcGFjZV90b3RhbDsgc3BhY2VfaW5kZXgrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3BhY2U7Ci0gICAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgc3Vic3BhY2UsIHNhdmVfc3Vic3BhY2U7Ci0gICAgICBpbnQgc3Vic3BhY2VfaW5kZXg7Ci0gICAgICBhc2VjdGlvbiAqc3BhY2VfYXNlY3Q7Ci0gICAgICBjaGFyICpuZXduYW1lOwotCi0gICAgICAvKiBSZWFkIHRoZSBzcGFjZSBkaWN0aW9uYXJ5IGVsZW1lbnQgKi8KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChjdXJyZW50X29mZnNldCArIGZpbGVfaGRyLT5zcGFjZV9sb2NhdGlvbgotCQkgICAgICsgc3BhY2VfaW5kZXggKiBzaXplb2Ygc3BhY2UpLAotCQkgICAgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICAgIGlmIChiZmRfcmVhZCAoJnNwYWNlLCAxLCBzaXplb2Ygc3BhY2UsIGFiZmQpICE9IHNpemVvZiBzcGFjZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogU2V0dXAgdGhlIHNwYWNlIG5hbWUgc3RyaW5nICovCi0gICAgICBzcGFjZS5uYW1lLm5fbmFtZSA9IHNwYWNlLm5hbWUubl9zdHJ4ICsgc3BhY2Vfc3RyaW5nczsKLQotICAgICAgLyogTWFrZSBhIHNlY3Rpb24gb3V0IG9mIGl0ICovCi0gICAgICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotICAgICAgaWYgKCFuZXduYW1lKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc3RyY3B5IChuZXduYW1lLCBzcGFjZS5uYW1lLm5fbmFtZSk7Ci0JCQkgICAKLSAgICAgIHNwYWNlX2FzZWN0ID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsIG5ld25hbWUpOwotICAgICAgaWYgKCFzcGFjZV9hc2VjdCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgIGlmIChzcGFjZS5pc19sb2FkYWJsZSA9PSAwKQotCXNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREVCVUdHSU5HOwotCi0gICAgICAvKiBTZXQgdXAgYWxsIHRoZSBhdHRyaWJ1dGVzIGZvciB0aGUgc3BhY2UuICAqLwotICAgICAgaWYgKGJmZF9zb21fc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc3BhY2VfYXNlY3QsIHNwYWNlLmlzX2RlZmluZWQsCi0JCQkJCSAgc3BhY2UuaXNfcHJpdmF0ZSwgc3BhY2Uuc29ydF9rZXksCi0JCQkJCSAgc3BhY2Uuc3BhY2VfbnVtYmVyKSA9PSBmYWxzZSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSWYgdGhlIHNwYWNlIGhhcyBubyBzdWJzcGFjZXMsIHRoZW4gd2UncmUgZG9uZS4gICovCi0gICAgICBpZiAoc3BhY2Uuc3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogTm93LCByZWFkIGluIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgKGN1cnJlbnRfb2Zmc2V0ICsgZmlsZV9oZHItPnN1YnNwYWNlX2xvY2F0aW9uCi0JCSAgICAgKyBzcGFjZS5zdWJzcGFjZV9pbmRleCAqIHNpemVvZiBzdWJzcGFjZSksCi0JCSAgICBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkgIT0gc2l6ZW9mIHN1YnNwYWNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgLyogU2VlayBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgc3Vic3BhY2VzIGZvciBsb29wIGJlbG93ICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsCi0JCSAgICAoY3VycmVudF9vZmZzZXQgKyBmaWxlX2hkci0+c3Vic3BhY2VfbG9jYXRpb24KLQkJICAgICArIHNwYWNlLnN1YnNwYWNlX2luZGV4ICogc2l6ZW9mIHN1YnNwYWNlKSwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIFNldHVwIHRoZSBzdGFydCBhZGRyZXNzIGFuZCBmaWxlIGxvYyBmcm9tIHRoZSBmaXJzdCBzdWJzcGFjZSByZWNvcmQgKi8KLSAgICAgIHNwYWNlX2FzZWN0LT52bWEgPSBzdWJzcGFjZS5zdWJzcGFjZV9zdGFydDsKLSAgICAgIHNwYWNlX2FzZWN0LT5maWxlcG9zID0gc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSArIGN1cnJlbnRfb2Zmc2V0OwotICAgICAgc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0gICAgICBpZiAoc3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogSW5pdGlhbGl6ZSBzYXZlX3N1YnNwYWNlIHNvIHdlIGNhbiByZWxpYWJseSBkZXRlcm1pbmUgaWYgdGhpcwotCSBsb29wIHBsYWNlZCBhbnkgdXNlZnVsIHZhbHVlcyBpbnRvIGl0LiAgKi8KLSAgICAgIG1lbXNldCAoJnNhdmVfc3Vic3BhY2UsIDAsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0KLSAgICAgIC8qIExvb3Agb3ZlciB0aGUgcmVzdCBvZiB0aGUgc3Vic3BhY2VzLCBidWlsZGluZyB1cCBtb3JlIHNlY3Rpb25zICovCi0gICAgICBmb3IgKHN1YnNwYWNlX2luZGV4ID0gMDsgc3Vic3BhY2VfaW5kZXggPCBzcGFjZS5zdWJzcGFjZV9xdWFudGl0eTsKLQkgICBzdWJzcGFjZV9pbmRleCsrKQotCXsKLQkgIGFzZWN0aW9uICpzdWJzcGFjZV9hc2VjdDsKLQotCSAgLyogUmVhZCBpbiB0aGUgbmV4dCBzdWJzcGFjZSAqLwotCSAgaWYgKGJmZF9yZWFkICgmc3Vic3BhY2UsIDEsIHNpemVvZiBzdWJzcGFjZSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2Ygc3Vic3BhY2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBTZXR1cCB0aGUgc3Vic3BhY2UgbmFtZSBzdHJpbmcgKi8KLQkgIHN1YnNwYWNlLm5hbWUubl9uYW1lID0gc3Vic3BhY2UubmFtZS5uX3N0cnggKyBzcGFjZV9zdHJpbmdzOwotCi0JICBuZXduYW1lID0gYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHN1YnNwYWNlLm5hbWUubl9uYW1lKSArIDEpOwotCSAgaWYgKCFuZXduYW1lKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHN0cmNweSAobmV3bmFtZSwgc3Vic3BhY2UubmFtZS5uX25hbWUpOwotCi0JICAvKiBNYWtlIGEgc2VjdGlvbiBvdXQgb2YgdGhpcyBzdWJzcGFjZSAqLwotCSAgc3Vic3BhY2VfYXNlY3QgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgbmV3bmFtZSk7Ci0JICBpZiAoIXN1YnNwYWNlX2FzZWN0KQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgLyogU3RvcmUgcHJpdmF0ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VjdGlvbi4gICovCi0JICBpZiAoYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzdWJzcGFjZV9hc2VjdCwgc3BhY2VfYXNlY3QsCi0JCQkJCQkgc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cywKLQkJCQkJCSBzdWJzcGFjZS5zb3J0X2tleSwKLQkJCQkJCSBzdWJzcGFjZS5xdWFkcmFudCkgPT0gZmFsc2UpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBLZWVwIGFuIGVhc3kgbWFwcGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBhbmQgc2VjdGlvbnMuIAotCSAgICAgTm90ZSB3ZSBkbyBub3QgbmVjZXNzYXJpbHkgcmVhZCB0aGUgc3Vic3BhY2VzIGluIHRoZQotCSAgICAgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuCi0KLQkgICAgIFNvIHRvIG1ha2UgdGhlIHRhcmdldCBpbmRleCBjb21lIG91dCBjb3JyZWN0bHksIHdlCi0JICAgICBzdG9yZSB0aGUgbG9jYXRpb24gb2YgdGhlIHN1YnNwYWNlIGhlYWRlciBpbiB0YXJnZXQKLQkgICAgIGluZGV4LCB0aGVuIHNvcnQgdXNpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdWJzcGFjZQotCSAgICAgaGVhZGVyIGFzIHRoZSBrZXkuICBUaGVuIHdlIGNhbiBhc3NpZ24gY29ycmVjdAotCSAgICAgc3Vic3BhY2UgaW5kaWNlcy4gICovCi0JICB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIHN1YnNwYWNlX2FzZWN0LT50YXJnZXRfaW5kZXggPSBiZmRfdGVsbCAoYWJmZCkgLSBzaXplb2YgKHN1YnNwYWNlKTsKLQotCSAgLyogU2V0IFNFQ19SRUFET05MWSBhbmQgU0VDX0NPREUvU0VDX0RBVEEgYXMgc3BlY2lmaWVkCi0JICAgICBieSB0aGUgYWNjZXNzX2NvbnRyb2xfYml0cyBpbiB0aGUgc3Vic3BhY2UgaGVhZGVyLiAgKi8KLQkgIHN3aXRjaCAoc3Vic3BhY2UuYWNjZXNzX2NvbnRyb2xfYml0cyA+PiA0KQotCSAgICB7Ci0JICAgIC8qIFJlYWRvbmx5IGRhdGEuICAqLyAgCi0JICAgIGNhc2UgMHgwOgotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfREFUQSB8IFNFQ19SRUFET05MWTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBOb3JtYWwgZGF0YS4gICovICAKLQkgICAgY2FzZSAweDE6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19EQVRBOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIFJlYWRvbmx5IGNvZGUgYW5kIHRoZSBnYXRld2F5cy4KLQkgICAgICAgR2F0ZXdheXMgaGF2ZSBvdGhlciBhdHRyaWJ1dGVzIHdoaWNoIGRvIG5vdCBtYXAKLQkgICAgICAgaW50byBhbnl0aGluZyBCRkQga25vd3MgYWJvdXQuICAqLwotCSAgICBjYXNlIDB4MjoKLQkgICAgY2FzZSAweDQ6Ci0JICAgIGNhc2UgMHg1OgotCSAgICBjYXNlIDB4NjoKLQkgICAgY2FzZSAweDc6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZOwotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIGR5bmFtaWMgKHdyaXRhYmxlKSBjb2RlLiAgKi8KLQkgICAgY2FzZSAweDM6Ci0JICAgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAKLQkgIGlmIChzdWJzcGFjZS5kdXBfY29tbW9uIHx8IHN1YnNwYWNlLmlzX2NvbW1vbikgCi0JICAgIHN1YnNwYWNlX2FzZWN0LT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgZWxzZSBpZiAoc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoID4gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLQkgIGlmIChzdWJzcGFjZS5pc19sb2FkYWJsZSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCSAgZWxzZQotCSAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX0RFQlVHR0lORzsKLQotCSAgaWYgKHN1YnNwYWNlLmNvZGVfb25seSkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzIHw9IFNFQ19DT0RFOwotCi0JICAvKiBCb3RoIGZpbGVfbG9jX2luaXRfdmFsdWUgYW5kIGluaXRpYWxpemF0aW9uX2xlbmd0aCB3aWxsCi0JICAgICBiZSB6ZXJvIGZvciBhIEJTUyBsaWtlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlID09IDAKLQkgICAgICAmJiBzdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGggPT0gMCkKLQkgICAgc3Vic3BhY2VfYXNlY3QtPmZsYWdzICY9IH4oU0VDX0RBVEEgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMpOwotCi0JICAvKiBUaGlzIHN1YnNwYWNlIGhhcyByZWxvY2F0aW9ucy4KLQkgICAgIFRoZSBmaXh1cF9yZXF1ZXN0X3F1YW50aXR5IGlzIGEgYnl0ZSBjb3VudCBmb3IgdGhlIG51bWJlciBvZgotCSAgICAgZW50cmllcyBpbiB0aGUgcmVsb2NhdGlvbiBzdHJlYW07IGl0IGlzIG5vdCB0aGUgYWN0dWFsIG51bWJlcgotCSAgICAgb2YgcmVsb2NhdGlvbnMgaW4gdGhlIHN1YnNwYWNlLiAgKi8KLQkgIGlmIChzdWJzcGFjZS5maXh1cF9yZXF1ZXN0X3F1YW50aXR5ICE9IDApCi0JICAgIHsKLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICAgIHN1YnNwYWNlX2FzZWN0LT5yZWxfZmlsZXBvcyA9IHN1YnNwYWNlLmZpeHVwX3JlcXVlc3RfaW5kZXg7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2VfYXNlY3QpLT5yZWxvY19zaXplCi0JCT0gc3Vic3BhY2UuZml4dXBfcmVxdWVzdF9xdWFudGl0eTsKLQkgICAgICAvKiBXZSBjYW4gbm90IGRldGVybWluZSB0aGlzIHlldC4gIFdoZW4gd2UgcmVhZCBpbiB0aGUgCi0JCSByZWxvY2F0aW9uIHRhYmxlIHRoZSBjb3JyZWN0IHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluLiAgKi8KLQkgICAgICBzdWJzcGFjZV9hc2VjdC0+cmVsb2NfY291bnQgPSAtMTsKLQkgICAgfQotCi0JICAvKiBVcGRhdGUgc2F2ZV9zdWJzcGFjZSBpZiBhcHByb3ByaWF0ZS4gICovCi0JICBpZiAoc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSA+IHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZSkKLQkgICAgc2F2ZV9zdWJzcGFjZSA9IHN1YnNwYWNlOwotCi0JICBzdWJzcGFjZV9hc2VjdC0+dm1hID0gc3Vic3BhY2Uuc3Vic3BhY2Vfc3RhcnQ7Ci0JICBzdWJzcGFjZV9hc2VjdC0+X2Nvb2tlZF9zaXplID0gc3Vic3BhY2Uuc3Vic3BhY2VfbGVuZ3RoOwotCSAgc3Vic3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IHN1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aDsKLQkgIHN1YnNwYWNlX2FzZWN0LT5maWxlcG9zID0gKHN1YnNwYWNlLmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJCQkgICAgICsgY3VycmVudF9vZmZzZXQpOwotCSAgc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9IGxvZzIgKHN1YnNwYWNlLmFsaWdubWVudCk7Ci0JICBpZiAoc3Vic3BhY2VfYXNlY3QtPmFsaWdubWVudF9wb3dlciA9PSAtMSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotCi0gICAgICAvKiBUaGlzIGNhbiBoYXBwZW4gZm9yIGEgLm8gd2hpY2ggZGVmaW5lcyBzeW1ib2xzIGluIG90aGVyd2lzZQotICAgICAgICAgZW1wdHkgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGlmICghc2F2ZV9zdWJzcGFjZS5maWxlX2xvY19pbml0X3ZhbHVlKQotCXsKLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAwOwotCSAgc3BhY2VfYXNlY3QtPl9yYXdfc2l6ZSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFNldHVwIHRoZSBzaXplcyBmb3IgdGhlIHNwYWNlIHNlY3Rpb24gYmFzZWQgdXBvbiB0aGUgaW5mbyBpbiB0aGUKLQkgICAgIGxhc3Qgc3Vic3BhY2Ugb2YgdGhlIHNwYWNlLiAgKi8KLQkgIHNwYWNlX2FzZWN0LT5fY29va2VkX3NpemUgPSAoc2F2ZV9zdWJzcGFjZS5zdWJzcGFjZV9zdGFydAotCQkJCSAgICAgICAtIHNwYWNlX2FzZWN0LT52bWEKLQkJCQkgICAgICAgKyBzYXZlX3N1YnNwYWNlLnN1YnNwYWNlX2xlbmd0aCk7Ci0JICBzcGFjZV9hc2VjdC0+X3Jhd19zaXplID0gKHNhdmVfc3Vic3BhY2UuZmlsZV9sb2NfaW5pdF92YWx1ZQotCQkJCSAgICAtIHNwYWNlX2FzZWN0LT5maWxlcG9zCi0JCQkJICAgICsgc2F2ZV9zdWJzcGFjZS5pbml0aWFsaXphdGlvbl9sZW5ndGgpOwotCX0KLSAgICB9Ci0gIC8qIE5vdyB0aGF0IHdlJ3ZlIHJlYWQgaW4gYWxsIHRoZSBzdWJzcGFjZSByZWNvcmRzLCB3ZSBuZWVkIHRvIGFzc2lnbgotICAgICBhIHRhcmdldCBpbmRleCB0byBlYWNoIHN1YnNwYWNlLiAgKi8KLSAgc3Vic3BhY2Vfc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIGJmZF9tYWxsb2MgKHRvdGFsX3N1YnNwYWNlcwotCQkJCQkJKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldID0gc2VjdGlvbjsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIHFzb3J0IChzdWJzcGFjZV9zZWN0aW9ucywgdG90YWxfc3Vic3BhY2VzLAotCSBzaXplb2YgKGFzZWN0aW9uICopLCBjb21wYXJlX3N1YnNwYWNlcyk7Ci0gIAotICAvKiBzdWJzcGFjZV9zZWN0aW9ucyBpcyBub3cgc29ydGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc3Vic3BhY2VzCi0gICAgIGFwcGVhciBpbiB0aGUgb2JqZWN0IGZpbGUuICBBc3NpZ24gYW4gaW5kZXggdG8gZWFjaCBvbmUgbm93LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3N1YnNwYWNlczsgaSsrKQotICAgIHN1YnNwYWNlX3NlY3Rpb25zW2ldLT50YXJnZXRfaW5kZXggPSBpOwotCi0gIGlmIChzcGFjZV9zdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAoc3BhY2Vfc3RyaW5ncyk7Ci0KLSAgaWYgKHN1YnNwYWNlX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgZnJlZSAoc3Vic3BhY2Vfc2VjdGlvbnMpOwotCi0gIHJldHVybiB0cnVlOwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3BhY2Vfc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKHNwYWNlX3N0cmluZ3MpOwotCi0gIGlmIChzdWJzcGFjZV9zZWN0aW9ucyAhPSBOVUxMKQotICAgIGZyZWUgKHN1YnNwYWNlX3NlY3Rpb25zKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIGEgU09NIG9iamVjdCBhbmQgbWFrZSBpdCBpbnRvIGEgQkZELiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc29tX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBoZWFkZXIgZmlsZV9oZHI7Ci0gIHN0cnVjdCBzb21fZXhlY19hdXhoZHIgYXV4X2hkcjsKLSAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldCA9IDA7Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBzb21fZW50cnkgc29tX2VudHJ5OwotI2RlZmluZSBFTlRSWV9TSVpFIHNpemVvZihzdHJ1Y3Qgc29tX2VudHJ5KQotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgJiBmaWxlX2hkciwgMSwgRklMRV9IRFJfU0laRSwgYWJmZCkgIT0gRklMRV9IRFJfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKCFfUEFfUklTQ19JRCAoZmlsZV9oZHIuc3lzdGVtX2lkKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzd2l0Y2ggKGZpbGVfaGRyLmFfbWFnaWMpCi0gICAgewotICAgIGNhc2UgUkVMT0NfTUFHSUM6Ci0gICAgY2FzZSBFWEVDX01BR0lDOgotICAgIGNhc2UgU0hBUkVfTUFHSUM6Ci0gICAgY2FzZSBERU1BTkRfTUFHSUM6Ci0jaWZkZWYgRExfTUFHSUMKLSAgICBjYXNlIERMX01BR0lDOgotI2VuZGlmCi0jaWZkZWYgU0hMX01BR0lDCi0gICAgY2FzZSBTSExfTUFHSUM6Ci0jZW5kaWYKLSNpZmRlZiBTSEFSRURfTUFHSUNfQ05YCi0gICAgY2FzZSBTSEFSRURfTUFHSUNfQ05YOgotI2VuZGlmCi0gICAgICBicmVhazsKLQotI2lmZGVmIEVYRUNMSUJNQUdJQwotICAgIGNhc2UgRVhFQ0xJQk1BR0lDOgotICAgICAgLyogUmVhZCB0aGUgbHN0IGhlYWRlciBhbmQgZGV0ZXJtaW5lIHdoZXJlIHRoZSBTT00gZGlyZWN0b3J5IGJlZ2lucyAqLwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9oZWFkZXIsIDEsIFNMU1RIRFIsIGFiZmQpICE9IFNMU1RIRFIpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIFBvc2l0aW9uIHRvIGFuZCByZWFkIHRoZSBmaXJzdCBkaXJlY3RvcnkgZW50cnkgKi8KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfaGVhZGVyLmRpcl9sb2MsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBzb21fZW50cnksIDEsIEVOVFJZX1NJWkUsIGFiZmQpICE9IEVOVFJZX1NJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwpCi0JICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIC8qIE5vdyBwb3NpdGlvbiB0byB0aGUgZmlyc3QgU09NICovCi0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgc29tX2VudHJ5LmxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBjdXJyZW50X29mZnNldCA9IHNvbV9lbnRyeS5sb2NhdGlvbjsKLQotICAgICAgLyogQW5kIGZpbmFsbHksIHJlLXJlYWQgdGhlIHNvbSBoZWFkZXIgKi8KLQotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGZpbGVfaGRyLCAxLCBGSUxFX0hEUl9TSVpFLCBhYmZkKSAhPSBGSUxFX0hEUl9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCSAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChmaWxlX2hkci52ZXJzaW9uX2lkICE9IFZFUlNJT05fSUQKLSAgICAgICYmIGZpbGVfaGRyLnZlcnNpb25faWQgIT0gTkVXX1ZFUlNJT05fSUQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGF1eF9oZWFkZXJfc2l6ZSBmaWVsZCBpbiB0aGUgZmlsZSBoZWFkZXIgaXMgemVybywgdGhlbiB0aGlzCi0gICAgIG9iamVjdCBpcyBhbiBpbmNvbXBsZXRlIGV4ZWN1dGFibGUgKGEgLm8gZmlsZSkuICBEbyBub3QgdHJ5IHRvIHJlYWQKLSAgICAgYSBub24tZXhpc3RhbnQgYXV4aWxpYXJ5IGhlYWRlci4gICovCi0gIG1lbXNldCAoJmF1eF9oZHIsIDAsIHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcikpOwotICBpZiAoZmlsZV9oZHIuYXV4X2hlYWRlcl9zaXplICE9IDApCi0gICAgewotICAgICAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGF1eF9oZHIsIDEsIEFVWF9IRFJfU0laRSwgYWJmZCkgIT0gQVVYX0hEUl9TSVpFKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQkgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIGlmICghc2V0dXBfc2VjdGlvbnMgKGFiZmQsICZmaWxlX2hkciwgY3VycmVudF9vZmZzZXQpKQotICAgIHsKLSAgICAgIC8qIHNldHVwX3NlY3Rpb25zIGRvZXMgbm90IGJ1YmJsZSB1cCBhIGJmZCBlcnJvciBjb2RlLiAgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbGlkIFNPTSBvYmplY3QuICBEbyBzb21lIGluaXRpYWxpemF0aW9uLiAgKi8KLSAgcmV0dXJuIHNvbV9vYmplY3Rfc2V0dXAgKGFiZmQsICZmaWxlX2hkciwgJmF1eF9oZHIsIGN1cnJlbnRfb2Zmc2V0KTsKLX0KLQotLyogQ3JlYXRlIGEgU09NIG9iamVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fbWtvYmplY3QgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgYmFja2VuZCBpbmZvcm1hdGlvbi4gICovCi0gIGFiZmQtPnRkYXRhLnNvbV9kYXRhID0gKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QgKikKLSAgICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZGF0YV9zdHJ1Y3QpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLnNvbV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSW5pdGlhbGl6ZSBzb21lIGluZm9ybWF0aW9uIGluIHRoZSBmaWxlIGhlYWRlci4gIFRoaXMgcm91dGluZSBtYWtlcwotICAgbm90IGF0dGVtcHQgYXQgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGZvciBhIGZ1bGwgZXhlY3V0YWJsZTsgaXQKLSAgIGlzIG9ubHkgbWVhbnQgdG8gaGFuZGxlIHJlbG9jYXRhYmxlIG9iamVjdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3ByZXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgaGVhZGVyICpmaWxlX2hkcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogTWFrZSBhbmQgYXR0YWNoIGEgZmlsZSBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gIGZpbGVfaGRyID0gKHN0cnVjdCBoZWFkZXIgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKSk7Ci0gIGlmIChmaWxlX2hkciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCkgPSBmaWxlX2hkcjsKLQotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotCi0gICAgICAvKiBNYWtlIGFuZCBhdHRhY2ggYW4gZXhlYyBoZWFkZXIgdG8gdGhlIEJGRC4gICovCi0gICAgICBvYmpfc29tX2V4ZWNfaGRyIChhYmZkKSA9IChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICopCi0JYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyKSk7Ci0gICAgICBpZiAob2JqX3NvbV9leGVjX2hkciAoYWJmZCkgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhYmZkLT5mbGFncyAmIERfUEFHRUQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBERU1BTkRfTUFHSUM7Ci0gICAgICBlbHNlIGlmIChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JZmlsZV9oZHItPmFfbWFnaWMgPSBTSEFSRV9NQUdJQzsKLSNpZmRlZiBTSExfTUFHSUMKLSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykKLQlmaWxlX2hkci0+YV9tYWdpYyA9IFNITF9NQUdJQzsKLSNlbmRpZgotICAgICAgZWxzZQotCWZpbGVfaGRyLT5hX21hZ2ljID0gRVhFQ19NQUdJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICBmaWxlX2hkci0+YV9tYWdpYyA9IFJFTE9DX01BR0lDOwotCi0gIC8qIE9ubHkgbmV3IGZvcm1hdCBTT00gaXMgc3VwcG9ydGVkLiAgKi8KLSAgZmlsZV9oZHItPnZlcnNpb25faWQgPSBORVdfVkVSU0lPTl9JRDsKLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsLCBhbmQgZW1iZWRkaW5nIHRpbWVzdGFtcHMgaXMgbm90IGFsd2F5cwotICAgICBhIHdpc2UgdGhpbmcgdG8gZG8sIGl0IG1ha2VzIGNvbXBhcmluZyBvYmplY3RzIGR1cmluZyBhIG11bHRpLXN0YWdlCi0gICAgIGJvb3RzdHJhcCBkaWZmaWN1bHQuICAqLwotICBmaWxlX2hkci0+ZmlsZV90aW1lLnNlY3MgPSAwOwotICBmaWxlX2hkci0+ZmlsZV90aW1lLm5hbm9zZWNzID0gMDsgCi0KLSAgZmlsZV9oZHItPmVudHJ5X3NwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X3N1YnNwYWNlID0gMDsKLSAgZmlsZV9oZHItPmVudHJ5X29mZnNldCA9IDA7Ci0gIGZpbGVfaGRyLT5wcmVzdW1lZF9kcCA9IDA7Ci0KLSAgLyogTm93IGl0ZXJhdGUgb3ZlciB0aGUgc2VjdGlvbnMgdHJhbnNsYXRpbmcgaW5mb3JtYXRpb24gZnJvbQotICAgICBCRkQgc2VjdGlvbnMgdG8gU09NIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIElnbm9yZSBhbnl0aGluZyB3aGljaCBoYXMgbm90IGJlZW4gbWFya2VkIGFzIGEgc3BhY2Ugb3IKLQkgc3Vic3BhY2UuICAqLwotICAgICAgaWYgKCFzb21faXNfc3BhY2UgKHNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKHNlY3Rpb24pKQotCWNvbnRpbnVlOwotICAgICAgCi0gICAgICBpZiAoc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQl7Ci0JICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHNwYWNlIGRpY3Rpb25hcnkuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QKLQkgICAgPSAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICopCi0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKTsKLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdCA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAvKiBTZXQgc3BhY2UgYXR0cmlidXRlcy4gIE5vdGUgbW9zdCBhdHRyaWJ1dGVzIG9mIFNPTSBzcGFjZXMKLQkgICAgIGFyZSBzZXQgYmFzZWQgb24gdGhlIHN1YnNwYWNlcyBpdCBjb250YWlucy4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+bG9hZGVyX2ZpeF9pbmRleCA9IC0xOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPmluaXRfcG9pbnRlcl9pbmRleCA9IC0xOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zb3J0X2tleSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5zb3J0X2tleTsKLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19kZWZpbmVkID0gCi0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX2RlZmluZWQ7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfcHJpdmF0ZSA9IAotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19wcml2YXRlOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnNwYWNlX251bWJlciA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNwYWNlX251bWJlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5LiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0Ci0JICAgID0gKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCAqKQotCSAgICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSk7Ci0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBTZXQgc3Vic3BhY2UgYXR0cmlidXRlcy4gIEJhc2ljIHN0dWZmIGlzIGRvbmUgaGVyZSwgYWRkaXRpb25hbAotCSAgICAgYXR0cmlidXRlcyBhcmUgZmlsbGVkIGluIGxhdGVyIGFzIG1vcmUgaW5mb3JtYXRpb24gYmVjb21lcwotCSAgICAgYXZhaWxhYmxlLiAgKi8KLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19JU19DT01NT04pCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZHVwX2NvbW1vbiA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmlzX2NvbW1vbiA9IDE7Ci0JICAgIH0KLQotCSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAxOwotCi0JICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmNvZGVfb25seSA9IDE7Ci0KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zdWJzcGFjZV9zdGFydCA9IAotCSAgICBzZWN0aW9uLT52bWE7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3Vic3BhY2VfbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+aW5pdGlhbGl6YXRpb25fbGVuZ3RoID0KLQkgICAgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbik7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+YWxpZ25tZW50ID0gCi0JICAgIDEgPDwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyOwotCi0JICAvKiBTZXQgbW9yZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSBzdHVmZmVkIGF3YXkgaW4gcHJpdmF0ZSBkYXRhLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zb3J0X2tleSA9Ci0JICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5OwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmFjY2Vzc19jb250cm9sX2JpdHMgPQotCSAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5hY2Nlc3NfY29udHJvbF9iaXRzOwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPnF1YWRyYW50ID0KLQkgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+cXVhZHJhbnQ7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZWN0aW9uIGlzIGEgU09NIHNwYWNlLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2lzX3NwYWNlIChzZWN0aW9uKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgLyogSWYgbm8gY29weSBkYXRhIGlzIGF2YWlsYWJsZSwgdGhlbiBpdCdzIG5laXRoZXIgYSBzcGFjZSBub3IgYQotICAgICBzdWJzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIElmIHRoZSBjb250YWluaW5nIHNwYWNlIGlzbid0IHRoZSBzYW1lIGFzIHRoZSBnaXZlbiBzZWN0aW9uLAotICAgICB0aGVuIHRoaXMgaXNuJ3QgYSBzcGFjZS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgIT0gc2VjdGlvbgotICAgICAgJiYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb24KLQkgICE9IHNlY3Rpb24pKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBPSy4gIE11c3QgYmUgYSBzcGFjZS4gICovCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gc2VjdGlvbiBpcyBhIFNPTSBzdWJzcGFjZSwgZmFsc2Ugb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIC8qIElmIG5vIGNvcHkgZGF0YSBpcyBhdmFpbGFibGUsIHRoZW4gaXQncyBuZWl0aGVyIGEgc3BhY2Ugbm9yIGEKLSAgICAgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJZiB0aGUgY29udGFpbmluZyBzcGFjZSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gc2VjdGlvbiwKLSAgICAgdGhlbiB0aGlzIGlzbid0IGEgc3Vic3BhY2UuICAqLwotICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID09IHNlY3Rpb24KLSAgICAgIHx8IChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICA9PSBzZWN0aW9uKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogT0suICBNdXN0IGJlIGEgc3Vic3BhY2UuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHNwYWNlIGNvbnRhaW5pbnMgdGhlIGdpdmVuIHN1YnNwYWNlLiAgSXQKLSAgIGlzIHNhZmUgdG8gYXNzdW1lIHNwYWNlIHJlYWxseSBpcyBhIHNwYWNlLCBhbmQgc3Vic3BhY2UgcmVhbGx5Ci0gICBpcyBhIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9pc19jb250YWluZXIgKHNwYWNlLCBzdWJzcGFjZSkKLSAgICAgYXNlY3Rpb24gKnNwYWNlLCAqc3Vic3BhY2U7Ci17Ci0gIHJldHVybiAoc29tX3NlY3Rpb25fZGF0YSAoc3Vic3BhY2UpLT5jb3B5X2RhdGEtPmNvbnRhaW5lciA9PSBzcGFjZQotCSAgfHwgKHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNwYWNlKS0+Y29weV9kYXRhLT5jb250YWluZXItPm91dHB1dF9zZWN0aW9uCi0JICAgICAgPT0gc3BhY2UpKTsKLX0KLQotLyogQ291bnQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIHNwYWNlcyBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXNvbV9jb3VudF9zcGFjZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGNvdW50ID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgICBjb3VudCArPSBzb21faXNfc3BhY2UgKHNlY3Rpb24pOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFjZXMgYXR0YWNoZWQgdG8gdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY291bnRfc3Vic3BhY2VzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjb3VudCA9IDA7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIGNvdW50ICs9IHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbik7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi0vKiBSZXR1cm4gLTEsIDAsIDEgaW5kaWNhdGluZyB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2Ygc3ltMSBhbmQgc3ltMi4KLQotICAgV2UgZGVzaXJlIHN5bWJvbHMgdG8gYmUgb3JkZXJlZCBzdGFydGluZyB3aXRoIHRoZSBzeW1ib2wgd2l0aCB0aGUKLSAgIGhpZ2hlc3QgcmVsb2NhdGlvbiBjb3VudCBkb3duIHRvIHRoZSBzeW1ib2wgd2l0aCB0aGUgbG93ZXN0IHJlbG9jYXRpb24KLSAgIGNvdW50LiAgRG9pbmcgc28gY29tcGFjdHMgdGhlIHJlbG9jYXRpb24gc3RyZWFtLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zeW1zIChhcmcxLCBhcmcyKQotICAgICBjb25zdCBQVFIgYXJnMTsKLSAgICAgY29uc3QgUFRSIGFyZzI7Ci0KLXsKLSAgYXN5bWJvbCAqKnN5bTEgPSAoYXN5bWJvbCAqKikgYXJnMTsKLSAgYXN5bWJvbCAqKnN5bTIgPSAoYXN5bWJvbCAqKikgYXJnMjsKLSAgdW5zaWduZWQgaW50IGNvdW50MSwgY291bnQyOwotICAKLSAgLyogR2V0IHJlbG9jYXRpb24gY291bnQgZm9yIGVhY2ggc3ltYm9sLiAgTm90ZSB0aGF0IHRoZSBjb3VudAotICAgICBpcyBzdG9yZWQgaW4gdGhlIHVkYXRhIHBvaW50ZXIgZm9yIHNlY3Rpb24gc3ltYm9scyEgICovCi0gIGlmICgoKnN5bTEpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDEgPSAoKnN5bTEpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQxID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMSktPnJlbG9jX2NvdW50OwotCi0gIGlmICgoKnN5bTIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICBjb3VudDIgPSAoKnN5bTIpLT51ZGF0YS5pOwotICBlbHNlCi0gICAgY291bnQyID0gc29tX3N5bWJvbF9kYXRhICgqc3ltMiktPnJlbG9jX2NvdW50OwotCi0gIC8qIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuICAqLwotICBpZiAoY291bnQxIDwgY291bnQyKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChjb3VudDEgPiBjb3VudDIpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIC0xLCAwLCAxIGluZGljYXRpbmcgdGhlIHJlbGF0aXZlIG9yZGVyaW5nIG9mIHN1YnNwYWNlMQotICAgYW5kIHN1YnNwYWNlLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zdWJzcGFjZXMgKGFyZzEsIGFyZzIpCi0gICAgIGNvbnN0IFBUUiBhcmcxOwotICAgICBjb25zdCBQVFIgYXJnMjsKLQotewotICBhc2VjdGlvbiAqKnN1YnNwYWNlMSA9IChhc2VjdGlvbiAqKikgYXJnMTsKLSAgYXNlY3Rpb24gKipzdWJzcGFjZTIgPSAoYXNlY3Rpb24gKiopIGFyZzI7Ci0gIHVuc2lnbmVkIGludCBjb3VudDEsIGNvdW50MjsKLSAgCi0gIGlmICgoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCA8ICgqc3Vic3BhY2UyKS0+dGFyZ2V0X2luZGV4KQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpzdWJzcGFjZTIpLT50YXJnZXRfaW5kZXggPCAoKnN1YnNwYWNlMSktPnRhcmdldF9pbmRleCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQZXJmb3JtIHZhcmlvdXMgd29yayBpbiBwcmVwYXJhdGlvbiBmb3IgZW1pdHRpbmcgdGhlIGZpeHVwIHN0cmVhbS4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcHJlcF9mb3JfZml4dXBzIChhYmZkLCBzeW1zLCBudW1fc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1fc3ltczsKLXsKLSAgaW50IGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICBhc3ltYm9sICoqc29ydGVkX3N5bXM7Ci0KLSAgLyogTW9zdCBTT00gcmVsb2NhdGlvbnMgaW52b2x2aW5nIGEgc3ltYm9sIGhhdmUgYSBsZW5ndGggd2hpY2ggaXMKLSAgICAgZGVwZW5kZW50IG9uIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sLiAgU28gc3ltYm9scyB3aGljaCBhcmUKLSAgICAgdXNlZCBvZnRlbiBpbiByZWxvY2F0aW9ucyBzaG91bGQgaGF2ZSBhIHNtYWxsIGluZGV4LiAgKi8KLQotICAvKiBGaXJzdCBpbml0aWFsaXplIHRoZSBjb3VudGVycyBmb3IgZWFjaCBzeW1ib2wuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBIYW5kbGUgYSBzZWN0aW9uIHN5bWJvbDsgdGhlc2UgaGF2ZSBubyBwb2ludGVycyBiYWNrIHRvIHRoZQotCSBTT00gc3ltYm9sIGluZm8uICBTbyB3ZSBqdXN0IHVzZSB0aGUgdWRhdGEgZmllbGQgdG8gaG9sZCB0aGUKLQkgcmVsb2NhdGlvbiBjb3VudC4gICovCi0gICAgICBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKSA9PSBOVUxMCi0JICB8fCBzeW1zW2ldLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQl7Ci0JICBzeW1zW2ldLT5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0JICBzeW1zW2ldLT51ZGF0YS5pID0gMDsKLQl9Ci0gICAgICBlbHNlCi0Jc29tX3N5bWJvbF9kYXRhIChzeW1zW2ldKS0+cmVsb2NfY291bnQgPSAwOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB0aGUgY291bnRlcnMgYXJlIGluaXRpYWxpemVkLCBtYWtlIGEgd2VpZ2h0ZWQgY291bnQKLSAgICAgb2YgaG93IG9mdGVuIGEgZ2l2ZW4gc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIERvZXMgdGhpcyBzZWN0aW9uIGhhdmUgYW55IHJlbG9jYXRpb25zPyAgKi8KLSAgICAgIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA8PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXYWxrIHRocm91Z2ggZWFjaCByZWxvY2F0aW9uIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgZm9yIChpID0gMTsgaSA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBpKyspCi0JewotCSAgYXJlbGVudCAqcmVsb2MgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbltpXTsKLQkgIGludCBzY2FsZTsKLQotCSAgLyogQSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlICpBQlMqIHNlY3Rpb24gcmVhbGx5Ci0JICAgICBkb2VzIG5vdCBoYXZlIGEgc3ltYm9sLiAgTGlrZXdpc2UgaWYgdGhlIHN5bWJvbCBpc24ndCBhc3NvY2lhdGVkCi0JICAgICB3aXRoIGFueSBzZWN0aW9uLiAgKi8KLQkgIGlmIChyZWxvYy0+c3ltX3B0cl9wdHIgPT0gTlVMTAotCSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5zZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIFNjYWxpbmcgdG8gZW5jb3VyYWdlIHN5bWJvbHMgaW52b2x2ZWQgaW4gUl9EUF9SRUxBVElWRSAKLQkgICAgIGFuZCBSX0NPREVfT05FX1NZTUJPTCByZWxvY2F0aW9ucyB0byBjb21lIGZpcnN0LiAgVGhlc2UKLQkgICAgIHR3byByZWxvY2F0aW9ucyBoYXZlIHNpbmdsZSBieXRlIHZlcnNpb25zIGlmIHRoZSBzeW1ib2wKLQkgICAgIGluZGV4IGlzIHZlcnkgc21hbGwuICAqLwotCSAgaWYgKHJlbG9jLT5ob3d0by0+dHlwZSA9PSBSX0RQX1JFTEFUSVZFCi0JICAgICAgfHwgcmVsb2MtPmhvd3RvLT50eXBlID09IFJfQ09ERV9PTkVfU1lNQk9MKQotCSAgICBzY2FsZSA9IDI7Ci0JICBlbHNlCi0JICAgIHNjYWxlID0gMTsKLQotCSAgLyogSGFuZGxlIHNlY3Rpb24gc3ltYm9scyBieSBzdG9yaW5nIHRoZSBjb3VudCBpbiB0aGUgdWRhdGEKLQkgICAgIGZpZWxkLiAgSXQgd2lsbCBub3QgYmUgdXNlZCBhbmQgdGhlIGNvdW50IGlzIHZlcnkgaW1wb3J0YW50Ci0JICAgICBmb3IgdGhlc2Ugc3ltYm9scy4gICovCi0JICBpZiAoKCpyZWxvYy0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLQkgICAgewotCSAgICAgICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSA9Ci0JCSgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+dWRhdGEuaSArIHNjYWxlOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIEEgbm9ybWFsIHN5bWJvbC4gIEluY3JlbWVudCB0aGUgY291bnQuICAqLwotCSAgc29tX3N5bWJvbF9kYXRhICgqcmVsb2MtPnN5bV9wdHJfcHRyKS0+cmVsb2NfY291bnQgKz0gc2NhbGU7Ci0JfQotICAgIH0KLQotICAvKiBTb3J0IGEgY29weSBvZiB0aGUgc3ltYm9sIHRhYmxlLCByYXRoZXIgdGhhbiB0aGUgY2Fub25pY2FsCi0gICAgIG91dHB1dCBzeW1ib2wgdGFibGUuICAqLwotICBzb3J0ZWRfc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfemFsbG9jIChhYmZkLCBudW1fc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG1lbWNweSAoc29ydGVkX3N5bXMsIHN5bXMsIG51bV9zeW1zICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgcXNvcnQgKHNvcnRlZF9zeW1zLCBudW1fc3ltcywgc2l6ZW9mIChhc3ltYm9sICopLCBjb21wYXJlX3N5bXMpOwotICBvYmpfc29tX3NvcnRlZF9zeW1zIChhYmZkKSA9IHNvcnRlZF9zeW1zOwotCi0gIC8qIENvbXB1dGUgdGhlIHN5bWJvbCBpbmRleGVzLCB0aGV5IHdpbGwgYmUgbmVlZGVkIGJ5IHRoZSByZWxvY2F0aW9uCi0gICAgIGNvZGUuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bXM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBBIHNlY3Rpb24gc3ltYm9sLiAgQWdhaW4sIHRoZXJlIGlzIG5vIHBvaW50ZXIgdG8gYmFja2VuZCBzeW1ib2wKLQkgaW5mb3JtYXRpb24sIHNvIHdlIHJldXNlIHRoZSB1ZGF0YSBmaWVsZCBhZ2Fpbi4gICovCi0gICAgICBpZiAoc29ydGVkX3N5bXNbaV0tPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKQotCXNvcnRlZF9zeW1zW2ldLT51ZGF0YS5pID0gaTsKLSAgICAgIGVsc2UKLSAgICAgICAgc29tX3N5bWJvbF9kYXRhIChzb3J0ZWRfc3ltc1tpXSktPmluZGV4ID0gaTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfZml4dXBzIChhYmZkLCBjdXJyZW50X29mZnNldCwgdG90YWxfcmVsb2Nfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9yZWxvY19zaXplcDsKLXsKLSAgdW5zaWduZWQgaW50IGksIGo7Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgdG90YWxfcmVsb2Nfc2l6ZSA9IDA7Ci0gIHVuc2lnbmVkIGludCBzdWJzcGFjZV9yZWxvY19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IG51bV9zcGFjZXMgPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfdG90YWw7Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogQWxsIHRoZSBmaXh1cHMgZm9yIGEgcGFydGljdWxhciBzdWJzcGFjZSBhcmUgZW1pdHRlZCBpbiBhIHNpbmdsZQotICAgICBzdHJlYW0uICBBbGwgdGhlIHN1YnNwYWNlcyBmb3IgYSBwYXJ0aWN1bGFyIHNwYWNlIGFyZSBlbWl0dGVkCi0gICAgIGFzIGEgc2luZ2xlIHN0cmVhbS4KLQotICAgICBTbywgdG8gZ2V0IGFsbCB0aGUgbG9jYXRpb25zIGNvcnJlY3Qgb25lIG11c3QgaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUKLSAgICAgc3BhY2VzLCBmb3IgZWFjaCBzcGFjZSBpdGVyYXRlIHRocm91Z2ggaXRzIHN1YnNwYWNlcyBhbmQgb3V0cHV0IGEKLSAgICAgZml4dXBzIHN0cmVhbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBpdGVyYXRlIHRocm91Z2ggZWFjaCBvZiBpdHMgc3Vic3BhY2VzLiAgKi8KLSAgICAgIGZvciAoc3Vic2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotCSAgIHN1YnNlY3Rpb24gIT0gTlVMTDsKLQkgICBzdWJzZWN0aW9uID0gc3Vic2VjdGlvbi0+bmV4dCkKLQl7Ci0JICBpbnQgcmVsb2Nfb2Zmc2V0LCBjdXJyZW50X3JvdW5kaW5nX21vZGU7Ci0KLQkgIC8qIEZpbmQgYSBzdWJzcGFjZSBvZiB0aGlzIHNwYWNlLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgc3Vic3BhY2UgZG9lcyBub3QgaGF2ZSByZWFsIGRhdGEsIHRoZW4gd2UgYXJlCi0JICAgICBmaW5pc2VkIHdpdGggaXQuICAqLwotCSAgaWYgKChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9pbmRleAotCQk9IC0xOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFRoaXMgc3Vic3BhY2UgaGFzIHNvbWUgcmVsb2NhdGlvbnMuICBQdXQgdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0JICAgICBpbmRleCBpbnRvIHRoZSBzdWJzcGFjZSByZWNvcmQuICAqLwotCSAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpeHVwX3JlcXVlc3RfaW5kZXgKLQkgICAgPSB0b3RhbF9yZWxvY19zaXplOwotCi0JICAvKiBUbyBtYWtlIGxpZmUgZWFzaWVyIHN0YXJ0IG92ZXIgd2l0aCBhIGNsZWFuIHNsYXRlIGZvciAKLQkgICAgIGVhY2ggc3Vic3BhY2UuICBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0KLQkgICAgIGZvciB0aGlzIHN1YnNwYWNlIGluIHByZXBhcmF0aW9uIGZvciB3cml0aW5nIG91dCBpdHMgZml4dXAKLQkgICAgIHN0cmVhbS4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0ICsgdG90YWxfcmVsb2Nfc2l6ZSwgU0VFS19TRVQpIDwgMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICAvKiBCdWZmZXIgc3BhY2UgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQuICBKdXN0IHBlcmZvcm0gc29tZQotCSAgICAgaW5pdGlhbGl6YXRpb24gaGVyZS4gICovCi0JICBwID0gdG1wX3NwYWNlOwotCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSA9IDA7Ci0JICByZWxvY19vZmZzZXQgPSAwOwotCSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLQkgIGN1cnJlbnRfcm91bmRpbmdfbW9kZSA9IFJfTl9NT0RFOwotCi0JICAvKiBUcmFuc2xhdGUgZWFjaCBCRkQgcmVsb2NhdGlvbiBpbnRvIG9uZSBvciBtb3JlIFNPTSAKLQkgICAgIHJlbG9jYXRpb25zLiAgKi8KLQkgIGZvciAoaiA9IDA7IGogPCBzdWJzZWN0aW9uLT5yZWxvY19jb3VudDsgaisrKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqYmZkX3JlbG9jID0gc3Vic2VjdGlvbi0+b3JlbG9jYXRpb25bal07Ci0JICAgICAgdW5zaWduZWQgaW50IHNraXA7Ci0JICAgICAgaW50IHN5bV9udW07Ci0KLQkgICAgICAvKiBHZXQgdGhlIHN5bWJvbCBudW1iZXIuICBSZW1lbWJlciBpdCdzIHN0b3JlZCBpbiBhIAotCQkgc3BlY2lhbCBwbGFjZSBmb3Igc2VjdGlvbiBzeW1ib2xzLiAgKi8KLQkgICAgICBpZiAoKCpiZmRfcmVsb2MtPnN5bV9wdHJfcHRyKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JCXN5bV9udW0gPSAoKmJmZF9yZWxvYy0+c3ltX3B0cl9wdHIpLT51ZGF0YS5pOwotCSAgICAgIGVsc2UKLQkJc3ltX251bSA9IHNvbV9zeW1ib2xfZGF0YSAoKmJmZF9yZWxvYy0+c3ltX3B0cl9wdHIpLT5pbmRleDsKLQkgICAgICAKLQkgICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGNvdXBsZSByZWxvY2F0aW9ucywKLQkJIHRoZW4gZHVtcCB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgQWxzbyByZWluaXRpYWxpemUKLQkJIHRoZSByZWxvY2F0aW9uIHF1ZXVlLiAKLQotCQkgTm8gc2luZ2xlIEJGRCByZWxvY2F0aW9uIGNvdWxkIGV2ZXIgdHJhbnNsYXRlIGludG8gbW9yZQotCQkgdGhhbiAxMDAgYnl0ZXMgb2YgU09NIHJlbG9jYXRpb25zICgyMGJ5dGVzIGlzIHByb2JhYmx5IHRoZQotCQkgdXBwZXIgbGltaXQsIGJ1dCBsZWF2ZSBsb3RzIG9mIHNwYWNlIGZvciBncm93dGgpLiAgKi8KLQkgICAgICBpZiAocCAtIHRtcF9zcGFjZSArIDEwMCA+IFNPTV9UTVBfQlVGU0laRSkKLQkJewotCQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRtcF9zcGFjZSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkJICAgICAgIT0gcCAtIHRtcF9zcGFjZSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkgIHAgPSB0bXBfc3BhY2U7Ci0JCSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLQkJfQotCi0JICAgICAgLyogRW1pdCBSX05PX1JFTE9DQVRJT04gZml4dXBzIHRvIG1hcCBhbnkgYnl0ZXMgd2hpY2ggd2VyZQotCQkgc2tpcHBlZC4gICovCi0JICAgICAgc2tpcCA9IGJmZF9yZWxvYy0+YWRkcmVzcyAtIHJlbG9jX29mZnNldDsKLQkgICAgICBwID0gc29tX3JlbG9jX3NraXAgKGFiZmQsIHNraXAsIHAsCi0JCQkJICAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JICAgICAgLyogVXBkYXRlIHJlbG9jX29mZnNldCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLgotCi0JCSBNYW55IHJlbG9jYXRpb25zIGRvIG5vdCBjb25zdW1lIGlucHV0IGJ5dGVzLiAgVGhleQotCQkgYXJlIG1hcmtlcnMsIG9yIHNldCBzdGF0ZSBuZWNlc3NhcnkgdG8gcGVyZm9ybSBzb21lCi0JCSBsYXRlciByZWxvY2F0aW9uLiAgKi8KLQkgICAgICBzd2l0Y2ggKGJmZF9yZWxvYy0+aG93dG8tPnR5cGUpCi0JCXsKLQkJY2FzZSBSX0VOVFJZOgotCQljYXNlIFJfQUxUX0VOVFJZOgotCQljYXNlIFJfRVhJVDoKLQkJY2FzZSBSX05fTU9ERToKLQkJY2FzZSBSX1NfTU9ERToKLQkJY2FzZSBSX0RfTU9ERToKLQkJY2FzZSBSX1JfTU9ERToKLQkJY2FzZSBSX0ZTRUw6Ci0JCWNhc2UgUl9MU0VMOgotCQljYXNlIFJfUlNFTDoKLQkJY2FzZSBSX0NPTVAxOgotCQljYXNlIFJfQ09NUDI6Ci0JCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQkJY2FzZSBSX0VORF9CUlRBQjoKLQkJY2FzZSBSX0JFR0lOX1RSWToKLQkJY2FzZSBSX0VORF9UUlk6Ci0JCWNhc2UgUl9OMFNFTDoKLQkJY2FzZSBSX04xU0VMOgotCQkgIHJlbG9jX29mZnNldCA9IGJmZF9yZWxvYy0+YWRkcmVzczsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIHJlbG9jX29mZnNldCA9IGJmZF9yZWxvYy0+YWRkcmVzcyArIDQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIE5vdyB0aGUgYWN0dWFsIHJlbG9jYXRpb24gd2UgY2FyZSBhYm91dC4gICovCi0JICAgICAgc3dpdGNoIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlKQotCQl7Ci0JCWNhc2UgUl9QQ1JFTF9DQUxMOgotCQljYXNlIFJfQUJTX0NBTEw6Ci0JCSAgcCA9IHNvbV9yZWxvY19jYWxsIChhYmZkLCBwLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBiZmRfcmVsb2MsIHN5bV9udW0sIHJlbG9jX3F1ZXVlKTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfQ09ERV9PTkVfU1lNQk9MOgotCQljYXNlIFJfRFBfUkVMQVRJVkU6Ci0JCSAgLyogQWNjb3VudCBmb3IgYW55IGFkZGVuZC4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+YWRkZW5kKQotCQkgICAgcCA9IHNvbV9yZWxvY19hZGRlbmQgKGFiZmQsIGJmZF9yZWxvYy0+YWRkZW5kLCBwLCAKLQkJCQkJICAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JCSAgaWYgKHN5bV9udW0gPCAweDIwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgKyBzeW1fbnVtLCBwKTsKLQkJICAgICAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgICAgICBwICs9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3ltX251bSA8IDB4MTAwKQotCQkgICAgewotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUgKyAzMiwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSwgcCArIDEpOwotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLCBwLAotCQkJCQkgIDIsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzeW1fbnVtIDwgMHgxMDAwMDAwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMzMsIHApOwotCQkgICAgICBiZmRfcHV0XzggKGFiZmQsIHN5bV9udW0gPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDIpOyAKLQkJICAgICAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkJICBwLCA0LCByZWxvY19xdWV1ZSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0RBVEFfT05FX1NZTUJPTDoKLQkJY2FzZSBSX0RBVEFfUExBQkVMOgotCQljYXNlIFJfQ09ERV9QTEFCRUw6Ci0JCWNhc2UgUl9ETFRfUkVMOgotCQkgIC8qIEFjY291bnQgZm9yIGFueSBhZGRlbmQgdXNpbmcgUl9EQVRBX09WRVJSSURFLiAgKi8KLQkJICBpZiAoYmZkX3JlbG9jLT5ob3d0by0+dHlwZSAhPSBSX0RBVEFfT05FX1NZTUJPTAotCQkgICAgICAmJiBiZmRfcmVsb2MtPmFkZGVuZCkKLQkJICAgIHAgPSBzb21fcmVsb2NfYWRkZW5kIChhYmZkLCBiZmRfcmVsb2MtPmFkZGVuZCwgcCwgCi0JCQkJCSAgJnN1YnNwYWNlX3JlbG9jX3NpemUsIHJlbG9jX3F1ZXVlKTsKLQotCQkgIGlmIChzeW1fbnVtIDwgMHgxMDApCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSwgcCArIDEpOwotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLCBwLAotCQkJCQkgIDIsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzeW1fbnVtIDwgMHgxMDAwMDAwMCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgc3ltX251bSA+PiAxNiwgcCArIDEpOwotCQkgICAgICBiZmRfcHV0XzE2IChhYmZkLCBzeW1fbnVtLCBwICsgMik7IAotCQkgICAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCQkgIHAsIDQsIHJlbG9jX3F1ZXVlKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJICBicmVhazsKLQotCQljYXNlIFJfRU5UUlk6Ci0JCSAgewotCQkgICAgaW50IHRtcDsKLQkJICAgIGFyZWxlbnQgKnRtcF9yZWxvYyA9IE5VTEw7Ci0JCSAgICBiZmRfcHV0XzggKGFiZmQsIFJfRU5UUlksIHApOwotCi0JCSAgICAvKiBSX0VOVFJZIHJlbG9jYXRpb25zIGhhdmUgNjQgYml0cyBvZiBhc3NvY2lhdGVkCi0JCSAgICAgICBkYXRhLiAgVW5mb3J0dW5hdGVseSB0aGUgYWRkZW5kIGZpZWxkIG9mIGEgYmZkCi0JCSAgICAgICByZWxvY2F0aW9uIGlzIG9ubHkgMzIgYml0cy4gIFNvLCB3ZSBzcGxpdCB1cAotCQkgICAgICAgdGhlIDY0Yml0IHVud2luZCBpbmZvcm1hdGlvbiBhbmQgc3RvcmUgcGFydCBpbgotCQkgICAgICAgdGhlIFJfRU5UUlkgcmVsb2NhdGlvbiwgYW5kIHRoZSByZXN0IGluIHRoZSBSX0VYSVQKLQkJICAgICAgIHJlbG9jYXRpb24uICAqLwotCQkgICAgYmZkX3B1dF8zMiAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQsIHAgKyAxKTsKLQkJCi0JCSAgICAvKiBGaW5kIHRoZSBuZXh0IFJfRVhJVCByZWxvY2F0aW9uLiAgKi8KLQkJICAgIGZvciAodG1wID0gajsgdG1wIDwgc3Vic2VjdGlvbi0+cmVsb2NfY291bnQ7IHRtcCsrKQotCQkgICAgICB7Ci0JCSAgICAgICAgdG1wX3JlbG9jID0gc3Vic2VjdGlvbi0+b3JlbG9jYXRpb25bdG1wXTsKLQkJCWlmICh0bXBfcmVsb2MtPmhvd3RvLT50eXBlID09IFJfRVhJVCkKLQkJCSAgYnJlYWs7Ci0JCSAgICAgIH0KLQotCQkgICAgaWYgKHRtcCA9PSBzdWJzZWN0aW9uLT5yZWxvY19jb3VudCkKLQkJICAgICAgYWJvcnQgKCk7Ci0KLQkJICAgIGJmZF9wdXRfMzIgKGFiZmQsIHRtcF9yZWxvYy0+YWRkZW5kLCBwICsgNSk7Ci0JCSAgICBwID0gdHJ5X3ByZXZfZml4dXAgKGFiZmQsICZzdWJzcGFjZV9yZWxvY19zaXplLAotCQkJCQlwLCA5LCByZWxvY19xdWV1ZSk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCSAgCi0JCWNhc2UgUl9OX01PREU6Ci0JCWNhc2UgUl9TX01PREU6Ci0JCWNhc2UgUl9EX01PREU6Ci0JCWNhc2UgUl9SX01PREU6Ci0JCSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIHJlcXVlc3RzIHRoZSBjdXJyZW50IHJvdW5kaW5nCi0JCSAgICAgbW9kZSwgdGhlbiBpdCBpcyByZWR1bmRhbnQuICAqLwotCQkgIGlmIChiZmRfcmVsb2MtPmhvd3RvLT50eXBlICE9IGN1cnJlbnRfcm91bmRpbmdfbW9kZSkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICAgICAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgICAgICBwICs9IDE7Ci0JCSAgICAgIGN1cnJlbnRfcm91bmRpbmdfbW9kZSA9IGJmZF9yZWxvYy0+aG93dG8tPnR5cGU7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0VYSVQ6Ci0JCWNhc2UgUl9BTFRfRU5UUlk6Ci0JCWNhc2UgUl9GU0VMOgotCQljYXNlIFJfTFNFTDoKLQkJY2FzZSBSX1JTRUw6Ci0JCWNhc2UgUl9CRUdJTl9CUlRBQjoKLQkJY2FzZSBSX0VORF9CUlRBQjoKLQkJY2FzZSBSX0JFR0lOX1RSWToKLQkJY2FzZSBSX04wU0VMOgotCQljYXNlIFJfTjFTRUw6Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9FTkRfVFJZOgotCQkgIC8qIFRoZSBlbmQgb2YgYSBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9uLiAgVGhlIHJlbG9jJ3MKLQkJICAgICBhZGRlbmQgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nCi0JCSAgICAgY29kZS4gICovCi0JCSAgaWYgKGJmZF9yZWxvYy0+YWRkZW5kID09IDApCi0JCSAgICBiZmRfcHV0XzggKGFiZmQsIGJmZF9yZWxvYy0+aG93dG8tPnR5cGUsIHApOwotCQkgIGVsc2UgaWYgKGJmZF9yZWxvYy0+YWRkZW5kIDwgMTAyNCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMSwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMSk7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgMiwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlICsgMiwgcCk7Ci0JCSAgICAgIGJmZF9wdXRfOCAoYWJmZCwgKGJmZF9yZWxvYy0+YWRkZW5kIC8gNCkgPj4gMTYsIHAgKyAxKTsKLQkJICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgYmZkX3JlbG9jLT5hZGRlbmQgLyA0LCBwICsgMik7Ci0JCSAgICAgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJCSAgcCwgNCwgcmVsb2NfcXVldWUpOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgICAgICAKLQkJY2FzZSBSX0NPTVAxOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDQ0LCBwICsgMSk7Ci0JCSAgcCA9IHRyeV9wcmV2X2ZpeHVwIChhYmZkLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwKLQkJCQkgICAgICBwLCAyLCByZWxvY19xdWV1ZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBSX0NPTVAyOgotCQkgIC8qIFRoZSBvbmx5IHRpbWUgd2UgZ2VuZXJhdGUgUl9DT01QMSwgUl9DT01QMiBhbmQgCi0JCSAgICAgUl9DT0RFX0VYUFIgcmVsb2NzIGlzIGZvciB0aGUgZGlmZmVyZW5jZSBvZiB0d28KLQkJICAgICBzeW1ib2xzLiAgSGVuY2Ugd2UgY2FuIGNoZWF0IGhlcmUuICAqLwotCQkgIGJmZF9wdXRfOCAoYWJmZCwgYmZkX3JlbG9jLT5ob3d0by0+dHlwZSwgcCk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCAweDgwLCBwICsgMSk7Ci0JCSAgYmZkX3B1dF84IChhYmZkLCBzeW1fbnVtID4+IDE2LCBwICsgMik7Ci0JCSAgYmZkX3B1dF8xNiAoYWJmZCwgc3ltX251bSwgcCArIDMpOwotCQkgIHAgPSB0cnlfcHJldl9maXh1cCAoYWJmZCwgJnN1YnNwYWNlX3JlbG9jX3NpemUsCi0JCQkJICAgICAgcCwgNSwgcmVsb2NfcXVldWUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgUl9DT0RFX0VYUFI6Ci0JCWNhc2UgUl9EQVRBX0VYUFI6Ci0JCSAgLyogVGhlIG9ubHkgdGltZSB3ZSBnZW5lcmF0ZSBSX0NPTVAxLCBSX0NPTVAyIGFuZCAKLQkJICAgICBSX0NPREVfRVhQUiByZWxvY3MgaXMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgICAgIHN5bWJvbHMuICBIZW5jZSB3ZSBjYW4gY2hlYXQgaGVyZS4gICovCi0JCSAgYmZkX3B1dF84IChhYmZkLCBiZmRfcmVsb2MtPmhvd3RvLT50eXBlLCBwKTsKLQkJICBzdWJzcGFjZV9yZWxvY19zaXplICs9IDE7Ci0JCSAgcCArPSAxOwotCQkgIGJyZWFrOwotCi0JCS8qIFB1dCBhICJSX1JFU0VSVkVEIiByZWxvY2F0aW9uIGluIHRoZSBzdHJlYW0gaWYKLQkJICAgd2UgaGl0IHNvbWV0aGluZyB3ZSBkbyBub3QgdW5kZXJzdGFuZC4gIFRoZSBsaW5rZXIKLQkJICAgd2lsbCBjb21wbGFpbiBsb3VkbHkgaWYgdGhpcyBldmVyIGhhcHBlbnMuICAqLwotCQlkZWZhdWx0OgotCQkgIGJmZF9wdXRfOCAoYWJmZCwgMHhmZiwgcCk7Ci0JCSAgc3Vic3BhY2VfcmVsb2Nfc2l6ZSArPSAxOwotCQkgIHAgKz0gMTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIExhc3QgQkZEIHJlbG9jYXRpb24gZm9yIGEgc3Vic3BhY2UgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCSAgICAgTWFwIHRoZSByZXN0IG9mIHRoZSBzdWJzcGFjZSB3aXRoIFJfTk9fUkVMT0NBVElPTiBmaXh1cHMuICAqLwotCSAgcCA9IHNvbV9yZWxvY19za2lwIChhYmZkLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKSAKLQkJCSAgICAgICAgICAgICAgLSByZWxvY19vZmZzZXQsCi0JCQkgICAgICBwLCAmc3Vic3BhY2VfcmVsb2Nfc2l6ZSwgcmVsb2NfcXVldWUpOwotCi0JICAvKiBTY3JpYmJsZSBvdXQgdGhlIHJlbG9jYXRpb25zLiAgKi8KLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpIHRtcF9zcGFjZSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkgICAgICAhPSBwIC0gdG1wX3NwYWNlKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBwID0gdG1wX3NwYWNlOwotCi0JICB0b3RhbF9yZWxvY19zaXplICs9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Zml4dXBfcmVxdWVzdF9xdWFudGl0eQotCSAgICA9IHN1YnNwYWNlX3JlbG9jX3NpemU7Ci0JfQotICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0gICAgfQotICAqdG90YWxfcmVsb2Nfc2l6ZXAgPSB0b3RhbF9yZWxvY19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBzdHJpbmdfc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgbG9uZyBjdXJyZW50X29mZnNldDsKLSAgICAgdW5zaWduZWQgaW50ICpzdHJpbmdfc2l6ZXA7Ci17Ci0gIC8qIENodW5rIG9mIG1lbW9yeSB0aGF0IHdlIGNhbiB1c2UgYXMgYnVmZmVyIHNwYWNlLCB0aGVuIHRocm93Ci0gICAgIGF3YXkuICAqLwotICB1bnNpZ25lZCBjaGFyIHRtcF9zcGFjZVtTT01fVE1QX0JVRlNJWkVdOwotICB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXYWxrIHRocm91Z2ggYWxsIHRoZSBzcGFjZXMgYW5kIHN1YnNwYWNlcyAob3JkZXIgaXMgbm90IGltcG9ydGFudCkKLSAgICAgYnVpbGRpbmcgdXAgYW5kIHdyaXRpbmcgc3RyaW5nIHRhYmxlIGVudHJpZXMgZm9yIHRoZWlyIG5hbWVzLiAgKi8KLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb24gIT0gTlVMTDsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgLyogT25seSB3b3JrIHdpdGggc3BhY2Uvc3Vic3BhY2VzOyBhdm9pZCBhbnkgb3RoZXIgc2VjdGlvbnMKLQkgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIG1hZGUgKC50ZXh0IGZvciBleGFtcGxlKS4gICovCi0gICAgICBpZiAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikgJiYgIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzcGFjZS9zdWJzcGFjZSBuYW1lLiAgKi8KLSAgICAgIGxlbmd0aCA9IHN0cmxlbiAoc2VjdGlvbi0+bmFtZSk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcm9vbSBmb3IgdGhlIG5leHQgZW50cnksIHRoZW4gZHVtcCB0aGUKLQkgY3VycmVudCBidWZmZXIgY29udGVudHMgbm93LiAgRWFjaCBlbnRyeSB3aWxsIHRha2UgNCBieXRlcyB0bwotCSBob2xkIHRoZSBzdHJpbmcgbGVuZ3RoICsgdGhlIHN0cmluZyBpdHNlbGYgKyBudWxsIHRlcm1pbmF0b3IuICAqLwotICAgICAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCXsKLQkgIGlmIChiZmRfd3JpdGUgKChQVFIpICZ0bXBfc3BhY2VbMF0sIHAgLSB0bXBfc3BhY2UsIDEsIGFiZmQpCi0JICAgICAgIT0gcCAtIHRtcF9zcGFjZSkgCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIEFsaWdubWVudCBpc3N1ZXMgYXJlIGFscmVhZHkgaGFuZGxlZC4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgcCArPSA0OwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgaW5kZXggaW4gdGhlIHNwYWNlL3N1YnNwYWNlIHJlY29yZHMuICAqLwotICAgICAgaWYgKHNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPm5hbWUubl9zdHJ4ID0gc3RyaW5nc19zaXplOwotICAgICAgZWxzZQotCXNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5uYW1lLm5fc3RyeCA9IHN0cmluZ3Nfc2l6ZTsKLQotICAgICAgLyogTmV4dCBjb21lcyB0aGUgc3RyaW5nIGl0c2VsZiArIGEgbnVsbCB0ZXJtaW5hdG9yLiAgKi8KLSAgICAgIHN0cmNweSAocCwgc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0JewotCSAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgIHArKzsKLQkgIHN0cmluZ3Nfc2l6ZSsrOwotCX0KLSAgICB9Ci0KLSAgLyogRG9uZSB3aXRoIHRoZSBzcGFjZS9zdWJzcGFjZSBzdHJpbmdzLiAgV3JpdGUgb3V0IGFueSBpbmZvcm1hdGlvbgotICAgICBjb250YWluZWQgaW4gYSBwYXJ0aWFsIGJsb2NrLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkgIT0gcCAtIHRtcF9zcGFjZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICpzdHJpbmdfc2l6ZXAgPSBzdHJpbmdzX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX3dyaXRlX3N5bWJvbF9zdHJpbmdzIChhYmZkLCBjdXJyZW50X29mZnNldCwgc3ltcywgbnVtX3N5bXMsIHN0cmluZ19zaXplcCwKLQkJCSAgY29tcGlsYXRpb25fdW5pdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIGN1cnJlbnRfb2Zmc2V0OwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgdW5zaWduZWQgaW50IG51bV9zeW1zOwotICAgICB1bnNpZ25lZCBpbnQgKnN0cmluZ19zaXplcDsKLSAgICAgQ09NUFVOSVQgKmNvbXBpbGF0aW9uX3VuaXQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICAKLSAgLyogQ2h1bmsgb2YgbWVtb3J5IHRoYXQgd2UgY2FuIHVzZSBhcyBidWZmZXIgc3BhY2UsIHRoZW4gdGhyb3cKLSAgICAgYXdheS4gICovCi0gIHVuc2lnbmVkIGNoYXIgdG1wX3NwYWNlW1NPTV9UTVBfQlVGU0laRV07Ci0gIHVuc2lnbmVkIGNoYXIgKnA7Ci0gIHVuc2lnbmVkIGludCBzdHJpbmdzX3NpemUgPSAwOwotICB1bnNpZ25lZCBjaGFyICpjb21wWzRdOwotCi0gIC8qIFRoaXMgZ2V0cyBhIGJpdCBncnVlc29tZSBiZWNhdXNlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LiAgVGhlCi0gICAgIHN0cmluZ3Mgd2l0aGluIHRoZSBjb21waWxhdGlvbiB1bml0IGFyZSBwYXJ0IG9mIHRoZSBzeW1ib2wKLSAgICAgc3RyaW5ncywgYnV0IGRvbid0IGhhdmUgc3ltYm9sX2RpY3Rpb25hcnkgZW50cmllcy4gIFNvLCBtYW51YWxseQotICAgICB3cml0ZSB0aGVtIGFuZCB1cGRhdGUgdGhlIGNvbXBsaWF0aW9uIHVuaXQgaGVhZGVyLiAgT24gaW5wdXQsIHRoZQotICAgICBjb21waWxhdGlvbiB1bml0IGhlYWRlciBjb250YWlucyBsb2NhbCBjb3BpZXMgb2YgdGhlIHN0cmluZ3MuCi0gICAgIE1vdmUgdGhlbSBhc2lkZS4gICovCi0gIGlmIChjb21waWxhdGlvbl91bml0KQotICAgIHsKLSAgICAgIGNvbXBbMF0gPSBjb21waWxhdGlvbl91bml0LT5uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMV0gPSBjb21waWxhdGlvbl91bml0LT5sYW5ndWFnZV9uYW1lLm5fbmFtZTsKLSAgICAgIGNvbXBbMl0gPSBjb21waWxhdGlvbl91bml0LT5wcm9kdWN0X2lkLm5fbmFtZTsKLSAgICAgIGNvbXBbM10gPSBjb21waWxhdGlvbl91bml0LT52ZXJzaW9uX2lkLm5fbmFtZTsKLSAgICB9Ci0KLSAgbWVtc2V0ICh0bXBfc3BhY2UsIDAsIFNPTV9UTVBfQlVGU0laRSk7Ci0gIHAgPSB0bXBfc3BhY2U7Ci0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHNwYWNlIHN0cmluZ3MgaW4gcHJlcGFyYXRpb24gZm9yIHdyaXRpbmcKLSAgICAgdGhlbSBvdXQuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoY29tcGlsYXRpb25fdW5pdCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCXsKLQkgIGludCBsZW5ndGggPSBzdHJsZW4gKGNvbXBbaV0pOwotCi0JICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAKLQkgICAgIHRoZSBjdXJyZW50IGJ1ZmZlciBjb250ZW50cyBub3cuICAqLwotCSAgaWYgKHAgLSB0bXBfc3BhY2UgKyA1ICsgbGVuZ3RoID4gU09NX1RNUF9CVUZTSVpFKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgJnRtcF9zcGFjZVswXSwgcCAtIHRtcF9zcGFjZSwgMSwgYWJmZCkKLQkJICAhPSBwIC0gdG1wX3NwYWNlKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgLyogUmVzZXQgdG8gYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgc3BhY2UuICAqLwotCSAgICAgIHAgPSB0bXBfc3BhY2U7Ci0JICAgIH0KLQotCSAgLyogRmlyc3QgZWxlbWVudCBpbiBhIHN0cmluZyB0YWJsZSBlbnRyeSBpcyB0aGUgbGVuZ3RoIG9mCi0JICAgICB0aGUgc3RyaW5nLiAgVGhpcyBtdXN0IGFsd2F5cyBiZSA0IGJ5dGUgYWxpZ25lZC4gIFRoaXMgaXMKLQkgICAgIGFsc28gYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXgKLQkgICAgIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUgZW50cnkuICAqLwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgbGVuZ3RoLCBwKTsKLQkgIHN0cmluZ3Nfc2l6ZSArPSA0OwotCSAgcCArPSA0OwotCi0JICAvKiBOZXh0IGNvbWVzIHRoZSBzdHJpbmcgaXRzZWxmICsgYSBudWxsIHRlcm1pbmF0b3IuICAqLwotCSAgc3RyY3B5IChwLCBjb21wW2ldKTsKLQotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgMDoJCi0JICAgICAgb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKS0+bmFtZS5uX3N0cnggPSBzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMToKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5sYW5ndWFnZV9uYW1lLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT5wcm9kdWN0X2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMzoKLQkgICAgICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLT52ZXJzaW9uX2lkLm5fc3RyeCA9IAotCQlzdHJpbmdzX3NpemU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgcCArPSBsZW5ndGggKyAxOwotCSAgc3RyaW5nc19zaXplICs9IGxlbmd0aCArIDE7Ci0KLQkgIC8qIEFsd2F5cyBhbGlnbiB1cCB0byB0aGUgbmV4dCB3b3JkIGJvdW5kYXJ5LiAgKi8KLQkgIHdoaWxlIChzdHJpbmdzX3NpemUgJSA0KQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF84IChhYmZkLCAwLCBwKTsKLQkgICAgICBzdHJpbmdzX3NpemUrKzsKLQkgICAgICBwKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltczsgaSsrKQotICAgIHsKLSAgICAgIGludCBsZW5ndGggPSBzdHJsZW4gKHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20gZm9yIHRoZSBuZXh0IGVudHJ5LCB0aGVuIGR1bXAgdGhlCi0JIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5vdy4gICovCi0gICAgIGlmIChwIC0gdG1wX3NwYWNlICsgNSArIGxlbmd0aCA+IFNPTV9UTVBfQlVGU0laRSkKLQl7Ci0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKQotCSAgICAgICE9IHAgLSB0bXBfc3BhY2UpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFJlc2V0IHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNwYWNlLiAgKi8KLQkgIHAgPSB0bXBfc3BhY2U7Ci0JfQotCi0gICAgICAvKiBGaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIHRhYmxlIGVudHJ5IGlzIHRoZSBsZW5ndGggb2YgdGhlCi0JIHN0cmluZy4gIFRoaXMgbXVzdCBhbHdheXMgYmUgNCBieXRlIGFsaWduZWQuICBUaGlzIGlzIGFsc28KLQkgYW4gYXBwcm9wcmlhdGUgdGltZSB0byBmaWxsIGluIHRoZSBzdHJpbmcgaW5kZXggZmllbGQgaW4gdGhlCi0JIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0gICAgICBiZmRfcHV0XzMyIChhYmZkLCBsZW5ndGgsIHApOwotICAgICAgc3RyaW5nc19zaXplICs9IDQ7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIC8qIE5leHQgY29tZXMgdGhlIHN0cmluZyBpdHNlbGYgKyBhIG51bGwgdGVybWluYXRvci4gICovCi0gICAgICBzdHJjcHkgKHAsIHN5bXNbaV0tPm5hbWUpOwotCi0gICAgICBzb21fc3ltYm9sX2RhdGEoc3ltc1tpXSktPnN0cmluZ3RhYl9vZmZzZXQgPSBzdHJpbmdzX3NpemU7Ci0gICAgICBwICs9IGxlbmd0aCArIDE7Ci0gICAgICBzdHJpbmdzX3NpemUgKz0gbGVuZ3RoICsgMTsKLQotICAgICAgLyogQWx3YXlzIGFsaWduIHVwIHRvIHRoZSBuZXh0IHdvcmQgYm91bmRhcnkuICAqLwotICAgICAgd2hpbGUgKHN0cmluZ3Nfc2l6ZSAlIDQpCi0gICAgICAgIHsKLQkgIGJmZF9wdXRfOCAoYWJmZCwgMCwgcCk7Ci0JICBzdHJpbmdzX3NpemUrKzsKLQkgIHArKzsKLSAgICAgICAgfQotICAgIH0KLQotICAvKiBTY3JpYmJsZSBvdXQgYW55IHBhcnRpYWwgYmxvY2suICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSAmdG1wX3NwYWNlWzBdLCBwIC0gdG1wX3NwYWNlLCAxLCBhYmZkKSAhPSBwIC0gdG1wX3NwYWNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc3RyaW5nX3NpemVwID0gc3RyaW5nc19zaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29tcHV0ZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBiZSBwbGFjZWQgaW4gdGhlIFNPTSBoZWFkZXJzLCAKLSAgIHNwYWNlL3N1YnNwYWNlIGRpY3Rpb25hcmllcywgcmVsb2NhdGlvbiBzdHJlYW1zLCBldGMuICBCZWdpbgotICAgd3JpdGluZyBwYXJ0cyBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbiAKLXNvbV9iZWdpbl93cml0aW5nIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQgPSAwOwotICBpbnQgc3RyaW5nc19zaXplID0gMDsKLSAgdW5zaWduZWQgaW50IHRvdGFsX3JlbG9jX3NpemUgPSAwOwotICB1bnNpZ25lZCBsb25nIG51bV9zcGFjZXMsIG51bV9zdWJzcGFjZXMsIGk7Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotICB1bnNpZ25lZCBpbnQgdG90YWxfc3Vic3BhY2VzID0gMDsKLSAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXIgPSBOVUxMOwotCi0gIC8qIFRoZSBmaWxlIGhlYWRlciB3aWxsIGFsd2F5cyBiZSBmaXJzdCBpbiBhbiBvYmplY3QgZmlsZSwgCi0gICAgIGV2ZXJ5dGhpbmcgZWxzZSBjYW4gYmUgaW4gcmFuZG9tIGxvY2F0aW9ucy4gIFRvIGtlZXAgdGhpbmdzCi0gICAgICJzaW1wbGUiIEJGRCB3aWxsIGxheSBvdXQgdGhlIG9iamVjdCBmaWxlIGluIHRoZSBtYW5uZXIgc3VnZ2VzdGVkCi0gICAgIGJ5IHRoZSBQUk8gQUJJIGZvciBQQS1SSVNDIFN5c3RlbXMuICAqLwotCi0gIC8qIEJlZm9yZSBhbnkgb3V0cHV0IGNhbiByZWFsbHkgYmVnaW4gb2Zmc2V0cyBmb3IgYWxsIHRoZSBtYWpvcgotICAgICBwb3J0aW9ucyBvZiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZSBjb21wdXRlZC4gIFNvLCBzdGFydGluZwotICAgICB3aXRoIHRoZSBpbml0aWFsIGZpbGUgaGVhZGVyIGNvbXB1dGUgKGFuZCBzb21ldGltZXMgd3JpdGUpCi0gICAgIGVhY2ggcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGZpbGUgaGVhZGVyLCBpdCdzIGNvbnRlbnRzIGFyZSBub3QgY29tcGxldGUKLSAgICAgeWV0LCBzbyBpdCBjYW4gbm90IGJlIHdyaXR0ZW4gYXQgdGhpcyB0aW1lLiAgKi8KLSAgY3VycmVudF9vZmZzZXQgKz0gc2l6ZW9mIChzdHJ1Y3QgaGVhZGVyKTsgIAotCi0gIC8qIEFueSBhdXhpbGlhcnkgaGVhZGVycyB3aWxsIGZvbGxvdyB0aGUgZmlsZSBoZWFkZXIuICBSaWdodCBub3cKLSAgICAgd2Ugc3VwcG9ydCBvbmx5IHRoZSBjb3B5cmlnaHQgYW5kIHZlcnNpb24gaGVhZGVycy4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgPSAwOwotICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0gICAgewotICAgICAgLyogUGFydHMgb2YgdGhlIGV4ZWMgaGVhZGVyIHdpbGwgYmUgZmlsbGVkIGluIGxhdGVyLCBzbwotCSBkZWxheSB3cml0aW5nIHRoZSBoZWFkZXIgaXRzZWxmLiAgRmlsbCBpbiB0aGUgZGVmYXVsdHMsCi0JIGFuZCB3cml0ZSBpdCBsYXRlci4gICovCi0gICAgICBjdXJyZW50X29mZnNldCArPSBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19hdXhoZHIpOwotICAgICAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmF1eF9oZWFkZXJfc2l6ZQotCSs9IHNpemVvZiAoc3RydWN0IHNvbV9leGVjX2F1eGhkcik7Ci0gICAgICBleGVjX2hlYWRlciA9IG9ial9zb21fZXhlY19oZHIgKGFiZmQpOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIudHlwZSA9IEVYRUNfQVVYX0lEOwotICAgICAgZXhlY19oZWFkZXItPnNvbV9hdXhoZHIubGVuZ3RoID0gNDA7Ci0gICAgfQotICBpZiAob2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdyaXRlIHRoZSB2ZXJzaW9uIHN0cmluZy4gICovCi0gICAgICBsZW4gPSBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnVzZXJfc3RyaW5nLAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGF1eF9pZCBzdHJ1Y3R1cmUgYW5kIHRoZSBzdHJpbmcgbGVuZ3RoLiAgKi8KLSAgICAgIGxlbiA9IHNpemVvZiAoc3RydWN0IGF1eF9pZCkgKyBzaXplb2YgKHVuc2lnbmVkIGludCk7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9zaXplICs9IGxlbjsKLSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCksIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV3JpdGUgdGhlIGNvcHlyaWdodCBzdHJpbmcuICAqLwotICAgICAgbGVuID0gb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCAtIHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5hdXhfaGVhZGVyX3NpemUgKz0gbGVuOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKGJmZF93cml0ZSAoKFBUUikgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+Y29weXJpZ2h0LAotCQkgICAgIGxlbiwgMSwgYWJmZCkgIT0gbGVuKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTmV4dCBjb21lcyB0aGUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnM7IHdlIGhhdmUgbm8gaW5pdGlhbGl6YXRpb24KLSAgICAgcG9pbnRlcnMsIHNvIGN1cnJlbnQgb2Zmc2V0IGRvZXMgbm90IGNoYW5nZS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5pbml0X2FycmF5X3RvdGFsID0gMDsKLQotICAvKiBOZXh0IGFyZSB0aGUgc3BhY2UgcmVjb3Jkcy4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHNwYWNlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3BhY2UgcmVjb3Jkcy4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHNwYWNlcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgc3RyaW5nIHRhYmxlLAotICAgICBhbmQgdGhlIGluZGV4IGZvciBlYWNoIHNwYWNlIGludG8gdGhlIHN0cmluZyB0YWJsZSBpcyBjb21wdXRlZAotICAgICBiZWxvdy4gIFRoZXJlZm9yZSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHdyaXRlIHRoZSBzcGFjZSBoZWFkZXJzCi0gICAgIGF0IHRoaXMgdGltZS4gICovCi0gIG51bV9zcGFjZXMgPSBzb21fY291bnRfc3BhY2VzIChhYmZkKTsKLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zcGFjZV90b3RhbCA9IG51bV9zcGFjZXM7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IG51bV9zcGFjZXMgKiBzaXplb2YgKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0KLSAgLyogTmV4dCBhcmUgdGhlIHN1YnNwYWNlIHJlY29yZHMuICBUaGVzZSBhcmUgZml4ZWQgbGVuZ3RoIHJlY29yZHMuCi0KLSAgICAgQ291bnQgdGhlIG51bWJlciBvZiBzdWJzcGFlcyB0byBkZXRlcm1pbmUgaG93IG11Y2ggcm9vbSBpcyBuZWVkZWQKLSAgICAgaW4gdGhlIG9iamVjdCBmaWxlIGZvciB0aGUgc3Vic3BhY2UgcmVjb3Jkcy4KLQotICAgICBBIHZhcmlldHkgaWYgZmllbGRzIGluIHRoZSBzdWJzcGFjZSByZWNvcmQgYXJlIHN0aWxsIHVua25vd24gYXQKLSAgICAgdGhpcyB0aW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSwgZml4dXAgc3RyZWFtIGxvY2F0aW9uL3NpemUsIGV0YykuICAqLwotICBudW1fc3Vic3BhY2VzID0gc29tX2NvdW50X3N1YnNwYWNlcyAoYWJmZCk7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zdWJzcGFjZV9sb2NhdGlvbiA9IGN1cnJlbnRfb2Zmc2V0OwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3Vic3BhY2VfdG90YWwgPSBudW1fc3Vic3BhY2VzOwotICBjdXJyZW50X29mZnNldCArPSBudW1fc3Vic3BhY2VzICogc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgaXMgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWVzLiAgV2Ugd2lsbAotICAgICBidWlsZCBhbmQgd3JpdGUgdGhlIHN0cmluZyB0YWJsZSBvbiB0aGUgZmx5LiAgQXQgdGhlIHNhbWUgdGltZQotICAgICB3ZSB3aWxsIGZpbGwgaW4gdGhlIHNwYWNlL3N1YnNwYWNlIG5hbWUgaW5kZXggZmllbGRzLiAgKi8KLQotICAvKiBUaGUgc3RyaW5nIHRhYmxlIG5lZWRzIHRvIGJlIGFsaWduZWQgb24gYSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsKLQotICAvKiBNYXJrIHRoZSBvZmZzZXQgb2YgdGhlIHNwYWNlL3N1YnNwYWNlIHN0cmluZyB0YWJsZSBpbiB0aGUgCi0gICAgIGZpbGUgaGVhZGVyLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNwYWNlX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHNwYWNlIHN0cmluZ3MuICAqLwotICBpZiAoc29tX3dyaXRlX3NwYWNlX3N0cmluZ3MgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmc3RyaW5nc19zaXplKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUmVjb3JkIHRvdGFsIHN0cmluZyB0YWJsZSBzaXplIGluIHRoZSBoZWFkZXIgYW5kIHVwZGF0ZSB0aGUKLSAgICAgY3VycmVudCBvZmZzZXQuICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2Vfc3RyaW5nc19zaXplID0gc3RyaW5nc19zaXplOwotICBjdXJyZW50X29mZnNldCArPSBzdHJpbmdzX3NpemU7Ci0KLSAgLyogTmV4dCBpcyB0aGUgY29tcGlsYXRpb24gdW5pdC4gKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5jb21waWxlcl90b3RhbCA9IDA7Ci0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKSAKLSAgICB7Ci0gICAgICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y29tcGlsZXJfdG90YWwgPSAxOwotICAgICAgY3VycmVudF9vZmZzZXQgKz0gQ09NUFVOSVRTWjsgCi0gICAgfQotCi0gIC8qIE5vdyBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdGhlIGxvYWRhYmxlIHN1YnNwYWNlcywgdGFraW5nCi0gICAgIGNhcmUgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgc3RheXMgcHJvcGVybHkgYWxpZ25lZC4gICovCi0KLSAgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NwYWNlczsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzdWJzZWN0aW9uOwotICAgICAgaW50IGZpcnN0X3N1YnNwYWNlOwotICAgICAgdW5zaWduZWQgaW50IHN1YnNwYWNlX29mZnNldCA9IDA7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMTsKLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBpbiB0aGUgc3BhY2UsIGFuZCB3ZSBhcmUKLQkgICAgIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHRoZW4gdGFrZSBjYXJlIHRvIG1ha2Ugc3VyZSBhbGwKLQkgICAgIHRoZSBhbGlnbm1lbnRzIGFyZSBjb3JyZWN0IGFuZCB1cGRhdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLQkgIGlmIChmaXJzdF9zdWJzcGFjZQotCSAgICAgICYmIChhYmZkLT5mbGFncyAmIChFWEVDX1AgfCBEWU5BTUlDKSkpCi0JICAgIHsKLQkgICAgICAvKiBEZW1hbmQgcGFnZWQgZXhlY3V0YWJsZXMgaGF2ZSBlYWNoIHNwYWNlIGFsaWduZWQgdG8gYQotCQkgcGFnZSBib3VuZGFyeS4gIFNoYXJhYmxlIGV4ZWN1dGFibGVzICh3cml0ZS1wcm90ZWN0ZWQKLQkJIHRleHQpIGhhdmUganVzdCB0aGUgcHJpdmF0ZSAoYWthIGRhdGEgJiBic3MpIHNwYWNlIGFsaWduZWQKLQkJIHRvIGEgcGFnZSBib3VuZGFyeS4gIFVnaC4gIE5vdCB0cnVlIGZvciBIUFVYLgotCi0JCSBUaGUgSFBVWCBrZXJuZWwgcmVxdWlyZXMgdGhlIHRleHQgdG8gYWx3YXlzIGJlIHBhZ2UgYWxpZ25lZAotCQkgd2l0aGluIHRoZSBmaWxlIHJlZ2FyZGxlc3Mgb2YgdGhlIGV4ZWN1dGFibGUncyB0eXBlLiAgKi8KLQkgICAgICBpZiAoYWJmZC0+ZmxhZ3MgJiAoRF9QQUdFRCB8IERZTkFNSUMpCi0JCSAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpCi0JCSAgfHwgKChhYmZkLT5mbGFncyAmIFdQX1RFWFQpCi0JCSAgICAgICYmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKSkpCi0JCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0JICAgICAgLyogVXBkYXRlIHRoZSBleGVjIGhlYWRlci4gICovCi0JICAgICAgaWYgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUgJiYgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPT0gMCkKLQkJewotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX3RtZW0gPSBzZWN0aW9uLT52bWE7Ci0JCSAgZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgPSBjdXJyZW50X29mZnNldDsKLQkJfQotCSAgICAgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBICYmIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID09IDApCi0JCXsKLQkJICBleGVjX2hlYWRlci0+ZXhlY19kbWVtID0gc2VjdGlvbi0+dm1hOwotCQkgIGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlID0gY3VycmVudF9vZmZzZXQ7Ci0JCX0KLQotCSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgZXhhY3RseSB3aGVyZSB3ZSBhcmUgd2l0aGluIGEgcGFydGljdWxhcgotCQkgc3BhY2UuICBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGUgYnJhaW5kYW1hZ2VkIEhQVVgKLQkJIGxvYWRlciB3aWxsIGNyZWF0ZSBob2xlcyBiZXR3ZWVuIHN1YnNwYWNlcyAqYW5kKiAKLQkJIHN1YnNwYWNlIGFsaWdubWVudHMgYXJlICpOT1QqIHByZXNlcnZlZC4gIFdoYXQgYSBjcm9jay4gICovCi0JICAgICAgc3Vic3BhY2Vfb2Zmc2V0ID0gc3Vic2VjdGlvbi0+dm1hOwotCi0JICAgICAgLyogT25seSBkbyB0aGlzIGZvciB0aGUgZmlyc3Qgc3Vic3BhY2Ugd2l0aGluIGVhY2ggc3BhY2UuICAqLwotCSAgICAgIGZpcnN0X3N1YnNwYWNlID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgYnJhaW5kYW1hZ2VkIEhQVVggbG9hZGVyIG1heSBoYXZlIGNyZWF0ZWQgYSBob2xlCi0JCSBiZXR3ZWVuIHR3byBzdWJzcGFjZXMuICBJdCBpcyAqbm90KiBzdWZmaWNpZW50IHRvIHVzZQotCQkgdGhlIGFsaWdubWVudCBzcGVjaWZpY2F0aW9ucyB3aXRoaW4gdGhlIHN1YnNwYWNlcyB0bwotCQkgYWNjb3VudCBmb3IgdGhlc2UgaG9sZXMgLS0gSSd2ZSBydW4gaW50byBhdCBsZWFzdCBvbmUKLQkJIGNhc2Ugd2hlcmUgdGhlIGxvYWRlciBsZWZ0IG9uZSBjb2RlIHN1YnNwYWNlIHVuYWxpZ25lZAotCQkgaW4gYSBmaW5hbCBleGVjdXRhYmxlLgotCi0JCSBUbyBjb21iYXQgdGhpcyB3ZSBrZWVwIGEgY3VycmVudCBvZmZzZXQgd2l0aGluIGVhY2ggc3BhY2UsCi0JCSBhbmQgdXNlIHRoZSBzdWJzcGFjZSB2bWEgZmllbGRzIHRvIGRldGVjdCBhbmQgcHJlc2VydmUKLQkJIGhvbGVzLiAgV2hhdCBhIGNyb2NrIQotCi0JCSBwcy4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgdW5sb2FkYWJsZSBzcGFjZS9zdWJzcGFjZXMuICAqLwotCSAgICAgIGN1cnJlbnRfb2Zmc2V0ICs9IHN1YnNlY3Rpb24tPnZtYSAtIHN1YnNwYWNlX29mZnNldDsKLQkgICAgICBpZiAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIGVsc2UKLQkJZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgKz0gc3Vic2VjdGlvbi0+dm1hIC0gc3Vic3BhY2Vfb2Zmc2V0OwotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBzdWJzZWN0aW9uLT52bWEgLSBzdWJzcGFjZV9vZmZzZXQ7Ci0JICAgIH0KLQotCi0JICBzdWJzZWN0aW9uLT50YXJnZXRfaW5kZXggPSB0b3RhbF9zdWJzcGFjZXMrKzsKLQkgIC8qIFRoaXMgaXMgcmVhbCBkYXRhIHRvIGJlIGxvYWRlZCBmcm9tIHRoZSBmaWxlLiAgKi8KLQkgIGlmIChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19MT0FEKQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBjb2RlICYgZGF0YS4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgJiYgc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkJZXhlY19oZWFkZXItPmV4ZWNfdHNpemUgKz0gc3Vic2VjdGlvbi0+X2Nvb2tlZF9zaXplOwotCSAgICAgIGVsc2UgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpCi0JCSAgICAgICAmJiBzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19EQVRBKQotCQlleGVjX2hlYWRlci0+ZXhlY19kc2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPmZpbGVfbG9jX2luaXRfdmFsdWUKLQkJPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBzdWJzZWN0aW9uLT5maWxlcG9zID0gY3VycmVudF9vZmZzZXQ7Ci0JICAgICAgY3VycmVudF9vZmZzZXQgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Vic2VjdGlvbik7IAotCSAgICAgIHN1YnNwYWNlX29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsKLQkgICAgfQotCSAgLyogTG9va3MgbGlrZSB1bmluaXRpYWxpemVkIGRhdGEuICAqLwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBic3Mgc2VjdGlvbi4gICovCi0JICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCQlleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSArPSBzdWJzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0KLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IDA7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QtPgotCQlpbml0aWFsaXphdGlvbl9sZW5ndGggPSAwOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogRmluYWxseSBjb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuCi0gICAgIElmIGJ1aWxkaW5nIGFuIGV4ZWN1dGFibGUsIHN0YXJ0IHRoZSB1bmxvYWRhYmxlIHN0dWZmIG9uIGl0cwotICAgICBvd24gcGFnZS4gICovCi0KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3Vic2VjdGlvbjsKLQotICAgICAgLyogRmluZCBhIHNwYWNlLiAgKi8KLSAgICAgIHdoaWxlICghc29tX2lzX3NwYWNlIChzZWN0aW9uKSkKLQlzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLQotICAgICAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotCWN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotCi0gICAgICAvKiBOb3cgbG9vayBmb3IgYWxsIGl0cyBzdWJzcGFjZXMuICAqLwotICAgICAgZm9yIChzdWJzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgc3Vic2VjdGlvbiAhPSBOVUxMOwotCSAgIHN1YnNlY3Rpb24gPSBzdWJzZWN0aW9uLT5uZXh0KQotCXsKLQkgIAotCSAgaWYgKCFzb21faXNfc3Vic3BhY2UgKHN1YnNlY3Rpb24pCi0JICAgICAgfHwgIXNvbV9pc19jb250YWluZXIgKHNlY3Rpb24sIHN1YnNlY3Rpb24pCi0JICAgICAgfHwgKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQotCSAgc3Vic2VjdGlvbi0+dGFyZ2V0X2luZGV4ID0gdG90YWxfc3Vic3BhY2VzKys7Ci0JICAvKiBUaGlzIGlzIHJlYWwgZGF0YSB0byBiZSBsb2FkZWQgZnJvbSB0aGUgZmlsZS4gICovCi0JICBpZiAoKHN1YnNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+ZmlsZV9sb2NfaW5pdF92YWx1ZQotCQk9IGN1cnJlbnRfb2Zmc2V0OwotCSAgICAgIHN1YnNlY3Rpb24tPmZpbGVwb3MgPSBjdXJyZW50X29mZnNldDsKLQkgICAgICBjdXJyZW50X29mZnNldCArPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdWJzZWN0aW9uKTsgCi0JICAgIH0KLQkgIC8qIExvb2tzIGxpa2UgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlCi0JCT0gMDsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+Ci0JCWluaXRpYWxpemF0aW9uX2xlbmd0aCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN1YnNlY3Rpb24pOwotCSAgICB9Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogSWYgYnVpbGRpbmcgYW4gZXhlY3V0YWJsZSwgdGhlbiBtYWtlIHN1cmUgdG8gc2VlayB0byBhbmQgd3JpdGUKLSAgICAgb25lIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB0byBtYWtlIHN1cmUgYW55IG5lY2Vzc2FyeQotICAgICB6ZXJvcyBhcmUgZmlsbGVkIGluLiAgVWdoLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIGN1cnJlbnRfb2Zmc2V0ID0gU09NX0FMSUdOIChjdXJyZW50X29mZnNldCwgUEFfUEFHRVNJWkUpOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0IC0gMSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiZmRfd3JpdGUgKChQVFIpICIiLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+dW5sb2FkYWJsZV9zcF9zaXplCi0gICAgPSBjdXJyZW50X29mZnNldCAtIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT51bmxvYWRhYmxlX3NwX2xvY2F0aW9uOwotCi0gIC8qIExvYWRlciBmaXh1cHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gYW55IHdheSBzaGFwZSBvciBmb3JtLiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmxvYWRlcl9maXh1cF9sb2NhdGlvbiA9IDA7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5sb2FkZXJfZml4dXBfdG90YWwgPSAwOwotCi0gIC8qIERvbmUuICBTdG9yZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgU09NIHNvIGZhci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmFsbHksIHNjcmliYmxlIG91dCB0aGUgdmFyaW91cyBoZWFkZXJzIHRvIHRoZSBkaXNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9maW5pc2hfd3JpdGluZyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbnVtX3NwYWNlcyA9IHNvbV9jb3VudF9zcGFjZXMgKGFiZmQpOwotICBhc3ltYm9sICoqc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCk7Ci0gIGludCBpLCBudW1fc3ltcywgc3RyaW5nc19zaXplOwotICBpbnQgc3Vic3BhY2VfaW5kZXggPSAwOwotICBmaWxlX3B0ciBsb2NhdGlvbjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHVuc2lnbmVkIGxvbmcgY3VycmVudF9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9yZWxvY19zaXplOwotCi0gIC8qIE5leHQgaXMgdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlIGFyZSBmaXhlZCBsZW5ndGggcmVjb3Jkcy4KLQotICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gZGV0ZXJtaW5lIGhvdyBtdWNoIHJvb20gaXMgbmVlZGVkCi0gICAgIGluIHRoZSBvYmplY3QgZmlsZSBmb3IgdGhlIHN5bWJvbCB0YWJsZS4KLQotICAgICBUaGUgbmFtZXMgb2YgdGhlIHN5bWJvbHMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIHN0cmluZyB0YWJsZSwKLSAgICAgYW5kIHRoZSBpbmRleCBmb3IgZWFjaCBzeW1ib2wgbmFtZSBpbnRvIHRoZSBzdHJpbmcgdGFibGUgaXMgY29tcHV0ZWQKLSAgICAgYmVsb3cuICBUaGVyZWZvcmUsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byB3cml0ZSB0aGUgc3ltYm9sIHRhYmxlCi0gICAgIGF0IHRoaXMgdGltZS4gCi0KLSAgICAgVGhlc2UgdXNlZCB0byBiZSBvdXRwdXQgYmVmb3JlIHRoZSBzdWJzcGFjZSBjb250ZW50cywgYnV0IHRoZXkKLSAgICAgd2VyZSBtb3ZlZCBoZXJlIHRvIHdvcmsgYXJvdW5kIGEgc3R1cGlkIGJ1ZyBpbiB0aGUgaHB1eCBsaW5rZXIKLSAgICAgKGZpeGVkIGluIGhwdXgxMCkuICAqLwotICBjdXJyZW50X29mZnNldCA9IG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoOwotCi0gIC8qIE1ha2Ugc3VyZSB3ZSdyZSBvbiBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOyAKLQotICBudW1fc3ltcyA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zeW1ib2xfdG90YWwgPSBudW1fc3ltczsKLSAgY3VycmVudF9vZmZzZXQgKz0gbnVtX3N5bXMgKiBzaXplb2YgKHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQpOwotCi0gIC8qIE5leHQgYXJlIHRoZSBzeW1ib2wgc3RyaW5ncy4KLSAgICAgQWxpZ24gdGhlbSB0byBhIHdvcmQgYm91bmRhcnkuICAqLwotICBpZiAoY3VycmVudF9vZmZzZXQgJSA0KQotICAgIGN1cnJlbnRfb2Zmc2V0ICs9ICg0IC0gKGN1cnJlbnRfb2Zmc2V0ICUgNCkpOwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3ltYm9sX3N0cmluZ3NfbG9jYXRpb24gPSBjdXJyZW50X29mZnNldDsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIHN5bWJvbCBzdHJpbmdzLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9zeW1ib2xfc3RyaW5ncyAoYWJmZCwgY3VycmVudF9vZmZzZXQsIHN5bXMsCi0JCQkJbnVtX3N5bXMsICZzdHJpbmdzX3NpemUsCi0JCQkJb2JqX3NvbV9jb21waWxhdGlvbl91bml0IChhYmZkKSkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZWNvcmQgdG90YWwgc3RyaW5nIHRhYmxlIHNpemUgaW4gaGVhZGVyIGFuZCB1cGRhdGUgdGhlCi0gICAgIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLSAgb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9zdHJpbmdzX3NpemUgPSBzdHJpbmdzX3NpemU7Ci0gIGN1cnJlbnRfb2Zmc2V0ICs9IHN0cmluZ3Nfc2l6ZTsKLQotICAvKiBEbyBwcmVwIHdvcmsgYmVmb3JlIGhhbmRsaW5nIGZpeHVwcy4gICovCi0gIHNvbV9wcmVwX2Zvcl9maXh1cHMgKGFiZmQsCi0JCSAgICAgICBiZmRfZ2V0X291dHN5bWJvbHMgKGFiZmQpLAotCQkgICAgICAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotCi0gIC8qIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgdGhlIGZpeHVwIHN0cmVhbSB3aGljaCBzdGFydHMgb24gYQotICAgICB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKGN1cnJlbnRfb2Zmc2V0ICUgNCkKLSAgICBjdXJyZW50X29mZnNldCArPSAoNCAtIChjdXJyZW50X29mZnNldCAlIDQpKTsgCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X2xvY2F0aW9uID0gY3VycmVudF9vZmZzZXQ7Ci0KLSAgLyogV3JpdGUgdGhlIGZpeHVwcyBhbmQgdXBkYXRlIGZpZWxkcyBpbiBzdWJzcGFjZSBoZWFkZXJzIHdoaWNoCi0gICAgIHJlbGF0ZSB0byB0aGUgZml4dXAgc3RyZWFtLiAgKi8KLSAgaWYgKHNvbV93cml0ZV9maXh1cHMgKGFiZmQsIGN1cnJlbnRfb2Zmc2V0LCAmdG90YWxfcmVsb2Nfc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFJlY29yZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgZml4dXAgc3RyZWFtIGluIHRoZSBmaWxlIGhlYWRlci4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5maXh1cF9yZXF1ZXN0X3RvdGFsID0gdG90YWxfcmVsb2Nfc2l6ZTsKLQotICAvKiBEb25lLiAgU3RvcmUgdGhlIHRvdGFsIHNpemUgb2YgdGhlIFNPTS4gICovCi0gIG9ial9zb21fZmlsZV9oZHIgKGFiZmQpLT5zb21fbGVuZ3RoID0gY3VycmVudF9vZmZzZXQgKyB0b3RhbF9yZWxvY19zaXplOwotIAotICAvKiBOb3cgdGhhdCB0aGUgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGlzIGNvbXBsZXRlLCBidWlsZCBhbmQKLSAgICAgd3JpdGUgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChzb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFN1YnNwYWNlcyBhcmUgd3JpdHRlbiBmaXJzdCBzbyB0aGF0IHdlIGNhbiBzZXQgdXAgaW5mb3JtYXRpb24KLSAgICAgYWJvdXQgdGhlbSBpbiB0aGVpciBjb250YWluaW5nIHNwYWNlcyBhcyB0aGUgc3Vic3BhY2UgaXMgd3JpdHRlbi4gICovCi0KLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4gICovCi0gIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN1YnNwYWNlX2xvY2F0aW9uOwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxvY2F0aW9uLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBsb2FkYWJsZSBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZQotCSAgICAgb3Igc3Vic3BhY2UuICBPciBkb2VzIG5vdCBoYXZlIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUKLQkgICAgIGhhcyBubyByZWFsIGJpdHMgb24gdGhlIGRpc2spLiAgKi8KLQkgIGlmICghc29tX2lzX3N1YnNwYWNlIChzdWJzZWN0aW9uKQotCSAgICAgIHx8ICFzb21faXNfY29udGFpbmVyIChzZWN0aW9uLCBzdWJzZWN0aW9uKQotCSAgICAgIHx8IChzdWJzZWN0aW9uLT5mbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHN1YnNwYWNlIGZvciB0aGlzIHNwYWNlLCB0aGVuIHNhdmUKLQkgICAgIHRoZSBpbmRleCBvZiB0aGUgc3Vic3BhY2UgaW4gaXRzIGNvbnRhaW5pbmcgc3BhY2UuICBBbHNvCi0JICAgICBzZXQgImlzX2xvYWRhYmxlIiBpbiB0aGUgY29udGFpbmluZyBzcGFjZS4gICovCi0KLQkgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkgPT0gMCkKLQkgICAgewotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5pc19sb2FkYWJsZSA9IDE7Ci0JICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX2luZGV4Ci0JCT0gc3Vic3BhY2VfaW5kZXg7Ci0JICAgIH0KLQotCSAgLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2Ygc3Vic3BhY2VzIHNlZW4gYW5kIHRoZSBudW1iZXIgb2YKLQkgICAgIHN1YnNwYWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBjdXJyZW50IHNwYWNlLiAgKi8KLQkgIHN1YnNwYWNlX2luZGV4Kys7Ci0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQotCSAgLyogTWFyayB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgc3BhY2Ugd2l0aGluIHRoZSBzdWJzcGFjZSdzCi0JICAgICBkaWN0aW9uYXJ5IHJlY29yZC4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdC0+c3BhY2VfaW5kZXggPSBpOwotCSAgCi0JICAvKiBEdW1wIHRoZSBjdXJyZW50IHN1YnNwYWNlIGhlYWRlci4gICovCi0JICBpZiAoYmZkX3dyaXRlICgoUFRSKSBzb21fc2VjdGlvbl9kYXRhIChzdWJzZWN0aW9uKS0+c3Vic3BhY2VfZGljdCwKLQkJCSBzaXplb2YgKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X3JlY29yZCksIDEsIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgLyogR290byB0aGUgbmV4dCBzZWN0aW9uLiAgKi8KLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OyAKLSAgICB9Ci0KLSAgLyogTm93IHJlcGVhdCB0aGUgcHJvY2VzcyBmb3IgdW5sb2FkYWJsZSBzdWJzcGFjZXMuICAqLwotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0gIC8qIE5vdyBmb3IgZWFjaCBzcGFjZSB3cml0ZSBvdXQgcmVjb3JkcyBmb3IgaXRzIHN1YnNwYWNlcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3BhY2VzOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnN1YnNlY3Rpb247Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIE5vdyBsb29rIGZvciBhbGwgaXRzIHN1YnNwYWNlcy4gICovCi0gICAgICBmb3IgKHN1YnNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLQkgICBzdWJzZWN0aW9uICE9IE5VTEw7Ci0JICAgc3Vic2VjdGlvbiA9IHN1YnNlY3Rpb24tPm5leHQpCi0JewotCSAgCi0JICAvKiBTa2lwIGFueSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBzcGFjZSBvcgotCSAgICAgc3Vic3BhY2UsIG9yIHdoaWNoIFNFQ19BTExPQyBzZXQgKGFuZCB0aGVyZWZvcmUgaGFuZGxlZAotCSAgICAgaW4gdGhlIGxvYWRhYmxlIHNwYWNlcy9zdWJzcGFjZXMgY29kZSBhYm92ZSkuICAqLwotCi0JICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc3Vic2VjdGlvbikKLQkgICAgICB8fCAhc29tX2lzX2NvbnRhaW5lciAoc2VjdGlvbiwgc3Vic2VjdGlvbikKLQkgICAgICB8fCAoc3Vic2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDApCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzdWJzcGFjZSBmb3IgdGhpcyBzcGFjZSwgdGhlbiBzYXZlCi0JICAgICB0aGUgaW5kZXggb2YgdGhlIHN1YnNwYWNlIGluIGl0cyBjb250YWluaW5nIHNwYWNlLiAgQ2xlYXIKLQkgICAgICJpc19sb2FkYWJsZSIuICAqLwotCi0JICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnNwYWNlX2RpY3QtPnN1YnNwYWNlX3F1YW50aXR5ID09IDApCi0JICAgIHsKLQkgICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+aXNfbG9hZGFibGUgPSAwOwotCSAgICAgIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LT5zdWJzcGFjZV9pbmRleAotCQk9IHN1YnNwYWNlX2luZGV4OwotCSAgICB9Ci0KLQkgIC8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHN1YnNwYWNlcyBzZWVuIGFuZCB0aGUgbnVtYmVyIG9mCi0JICAgICBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY3VycmVudCBzcGFjZS4gICovCi0JICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+c3BhY2VfZGljdC0+c3Vic3BhY2VfcXVhbnRpdHkrKzsKLQkgIHN1YnNwYWNlX2luZGV4Kys7IAotCi0JICAvKiBNYXJrIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzcGFjZSB3aXRoaW4gdGhlIHN1YnNwYWNlJ3MKLQkgICAgIGRpY3Rpb25hcnkgcmVjb3JkLiAgKi8KLQkgIHNvbV9zZWN0aW9uX2RhdGEgKHN1YnNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5zcGFjZV9pbmRleCA9IGk7Ci0JICAKLQkgIC8qIER1bXAgdGhpcyBzdWJzcGFjZSBoZWFkZXIuICAqLwotCSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc29tX3NlY3Rpb25fZGF0YSAoc3Vic2VjdGlvbiktPnN1YnNwYWNlX2RpY3QsCi0JCQkgc2l6ZW9mIChzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9yZWNvcmQpLCAxLCBhYmZkKQotCSAgICAgICE9IHNpemVvZiAoc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsgCi0gICAgfQotCi0gIC8qIEFsbCB0aGUgc3Vic3BhY2UgZGljdGlvbmRhcnkgcmVjb3JkcyBhcmUgd3JpdHRlbiwgYW5kIGFsbCB0aGUKLSAgICAgZmllbGRzIGFyZSBzZXQgdXAgaW4gdGhlIHNwYWNlIGRpY3Rpb25hcnkgcmVjb3Jkcy4KLQotICAgICBTZWVrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBhbmQgc3RhcnQgd3JpdGluZyB0aGUgc3BhY2UKLSAgICAgZGljdGlvbmFyeSByZWNvcmRzLiAgKi8KLSAgbG9jYXRpb24gPSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+c3BhY2VfbG9jYXRpb247Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgbG9jYXRpb24sIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zcGFjZXM7IGkrKykKLSAgICB7Ci0KLSAgICAgIC8qIEZpbmQgYSBzcGFjZS4gICovCi0gICAgICB3aGlsZSAoIXNvbV9pc19zcGFjZSAoc2VjdGlvbikpCi0Jc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQ7Ci0KLSAgICAgIC8qIER1bXAgaXRzIGhlYWRlciAgKi8KLSAgICAgIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zcGFjZV9kaWN0LAotCQkgICAgIHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSwgMSwgYWJmZCkKLQkgICE9IHNpemVvZiAoc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEdvdG8gdGhlIG5leHQgc2VjdGlvbi4gICovCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgLyogV3JpdGUgdGhlIGNvbXBpbGF0aW9uIHVuaXQgcmVjb3JkIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIGlmIChvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpKQotICAgIHsKLSAgICAgIGxvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPmNvbXBpbGVyX2xvY2F0aW9uOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsb2NhdGlvbiwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpLAotCQkgICAgIENPTVBVTklUU1osIDEsIGFiZmQpICE9IENPTVBVTklUU1opCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2V0dGluZyBvZiB0aGUgc3lzdGVtX2lkIGhhcyB0byBoYXBwZW4gdmVyeSBsYXRlIG5vdyB0aGF0IGNvcHlpbmcgb2YKLSAgICAgQkZEIHByaXZhdGUgZGF0YSBoYXBwZW5zICphZnRlciogc2VjdGlvbiBjb250ZW50cyBhcmUgc2V0LiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+c3lzdGVtX2lkOwotICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IHBhMjApCi0gICAgb2JqX3NvbV9maWxlX2hkcihhYmZkKS0+c3lzdGVtX2lkID0gQ1BVX1BBX1JJU0MyXzA7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfbWFjaCAoYWJmZCkgPT0gcGExMSkKLSAgICBvYmpfc29tX2ZpbGVfaGRyKGFiZmQpLT5zeXN0ZW1faWQgPSBDUFVfUEFfUklTQzFfMTsKLSAgZWxzZQotICAgIG9ial9zb21fZmlsZV9oZHIoYWJmZCktPnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtIGZvciB0aGUgZmlsZSBoZWFkZXIganVzdCBiZWZvcmUgd3JpdGluZwotICAgICB0aGUgaGVhZGVyIHRvIGRpc2suICAqLwotICBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+Y2hlY2tzdW0gPSBzb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCk7Ci0KLSAgLyogT25seSB0aGluZyBsZWZ0IHRvIGRvIGlzIHdyaXRlIG91dCB0aGUgZmlsZSBoZWFkZXIuICBJdCBpcyBhbHdheXMKLSAgICAgYXQgbG9jYXRpb24gemVyby4gIFNlZWsgdGhlcmUgYW5kIHdyaXRlIGl0LiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIDAsIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKSwKLQkJIHNpemVvZiAoc3RydWN0IGhlYWRlciksIDEsIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBoZWFkZXIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgd3JpdGUgdGhlIGV4ZWMgaGVhZGVyLiAgKi8KLSAgaWYgKGFiZmQtPmZsYWdzICYgKEVYRUNfUCB8IERZTkFNSUMpKQotICAgIHsKLSAgICAgIGxvbmcgdG1wLCBzb21fbGVuZ3RoOwotICAgICAgc3RydWN0IHNvbV9leGVjX2F1eGhkciAqZXhlY19oZWFkZXI7Ci0KLSAgICAgIGV4ZWNfaGVhZGVyID0gb2JqX3NvbV9leGVjX2hkciAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19lbnRyeSA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gICAgICBleGVjX2hlYWRlci0+ZXhlY19mbGFncyA9IG9ial9zb21fZXhlY19kYXRhIChhYmZkKS0+ZXhlY19mbGFnczsKLQotICAgICAgLyogT2ggam95cy4gIFJhbSBzb21lIG9mIHRoZSBCU1MgZGF0YSBpbnRvIHRoZSBEQVRBIHNlY3Rpb24KLQkgdG8gYmUgY29tcGF0YWJsZSB3aXRoIGhvdyB0aGUgaHAgbGlua2VyIG1ha2VzIG9iamVjdHMKLQkgKHNhdmVzIG1lbW9yeSBzcGFjZSkuICAqLwotICAgICAgdG1wID0gZXhlY19oZWFkZXItPmV4ZWNfZHNpemU7Ci0gICAgICB0bXAgPSBTT01fQUxJR04gKHRtcCwgUEFfUEFHRVNJWkUpOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgLT0gKHRtcCAtIGV4ZWNfaGVhZGVyLT5leGVjX2RzaXplKTsKLSAgICAgIGlmIChleGVjX2hlYWRlci0+ZXhlY19ic2l6ZSA8IDApCi0JZXhlY19oZWFkZXItPmV4ZWNfYnNpemUgPSAwOwotICAgICAgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPSB0bXA7Ci0KLSAgICAgIC8qIE5vdyBwZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcy4gIFRoZSBpZGVhIGlzIHRvIGNhdGNoIGJvZ29ucyBub3cgYW5kCi0JIGluZm9ybSB0aGUgdXNlciwgaW5zdGVhZCBvZiBzaWxlbnRseSBnZW5lcmF0aW5nIGEgYm9ndXMgZmlsZS4gICovCi0gICAgICBzb21fbGVuZ3RoID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnNvbV9sZW5ndGg7Ci0gICAgICBpZiAoZXhlY19oZWFkZXItPmV4ZWNfdGZpbGUgKyBleGVjX2hlYWRlci0+ZXhlY190c2l6ZSA+IHNvbV9sZW5ndGgKLQkgIHx8IGV4ZWNfaGVhZGVyLT5leGVjX2RmaWxlICsgZXhlY19oZWFkZXItPmV4ZWNfZHNpemUgPiBzb21fbGVuZ3RoKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBvYmpfc29tX2ZpbGVfaGRyIChhYmZkKS0+YXV4X2hlYWRlcl9sb2NhdGlvbiwKLQkJICAgIFNFRUtfU0VUKSA8IDApCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoYmZkX3dyaXRlICgoUFRSKSBleGVjX2hlYWRlciwgQVVYX0hEUl9TSVpFLCAxLCBhYmZkKQotCSAgIT0gQVVYX0hEUl9TSVpFKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGNoZWNrc3VtIGZvciBhIFNPTSBmaWxlIGhlYWRlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1zb21fY29tcHV0ZV9jaGVja3N1bSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBsb25nIGNoZWNrc3VtLCBjb3VudCwgaTsKLSAgdW5zaWduZWQgbG9uZyAqYnVmZmVyID0gKHVuc2lnbmVkIGxvbmcgKikgb2JqX3NvbV9maWxlX2hkciAoYWJmZCk7Ci0KLSAgY2hlY2tzdW0gPSAwOwotICBjb3VudCA9IHNpemVvZiAoc3RydWN0IGhlYWRlcikgLyBzaXplb2YgKHVuc2lnbmVkIGxvbmcpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICBjaGVja3N1bSBePSAqKGJ1ZmZlciArIGkpOwotCi0gIHJldHVybiBjaGVja3N1bTsKLX0KLQotc3RhdGljIHZvaWQKLXNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGFiZmQsIHN5bSwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIHN0cnVjdCBzb21fbWlzY19zeW1ib2xfaW5mbyAqaW5mbzsKLXsKLSAgLyogSW5pdGlhbGl6ZS4gICovCi0gIG1lbXNldCAoaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8pKTsKLQotICAvKiBUaGUgSFAgU09NIGxpbmtlciByZXF1aXJlcyBkZXRhaWxlZCB0eXBlIGluZm9ybWF0aW9uIGFib3V0Ci0gICAgIGFsbCBzeW1ib2xzIChpbmNsdWRpbmcgdW5kZWZpbmVkIHN5bWJvbHMhKS4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSB0eXBlIHNwZWNpZmllZCBpbiBhbiBpbXBvcnQvZXhwb3J0IHN0YXRlbWVudCBkb2VzIG5vdAotICAgICBhbHdheXMgbWF0Y2ggd2hhdCB0aGUgbGlua2VyIHdhbnRzLiAgU2V2ZXJlIGJyYWluZGFtYWdlLiAgKi8KLQkgCi0gIC8qIFNlY3Rpb24gc3ltYm9scyB3aWxsIG5vdCBoYXZlIGEgU09NIHN5bWJvbCB0eXBlIGFzc2lnbmVkIHRvCi0gICAgIHRoZW0geWV0LiAgQXNzaWduIGFsbCBzZWN0aW9uIHN5bWJvbHMgdHlwZSBTVF9EQVRBLiAgKi8KLSAgaWYgKHN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0gICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICBlbHNlCi0gICAgewotICAgICAgLyogQ29tbW9uIHN5bWJvbHMgbXVzdCBoYXZlIHNjb3BlIFNTX1VOU0FUIGFuZCB0eXBlCi0JIFNUX1NUT1JBR0Ugb3IgdGhlIGxpbmtlciB3aWxsIGNob2tlLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JewotCSAgaW5mby0+c3ltYm9sX3Njb3BlID0gU1NfVU5TQVQ7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1NUT1JBR0U7Ci0JfQotCi0gICAgICAvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgc3ltYm9sIHdpdGhvdXQgYW4gYXNzb2NpYXRlZAotCSB0eXBlLiAgVGhpcyBoYXBwZW5zIGlmIHRoZSB1c2VyIGltcG9ydGVkIHRoZSBzeW1ib2wKLQkgd2l0aG91dCBhIHR5cGUgYW5kIHRoZSBzeW1ib2wgd2FzIG5ldmVyIGRlZmluZWQKLQkgbG9jYWxseS4gIElmIEJTRl9GVU5DVElPTiBpcyBzZXQgZm9yIHRoaXMgc3ltYm9sLCB0aGVuCi0JIGFzc2lnbiBpdCB0eXBlIFNUX0NPREUgKHRoZSBIUCBsaW5rZXIgcmVxdWlyZXMgdW5kZWZpbmVkCi0JIGV4dGVybmFsIGZ1bmN0aW9ucyB0byBoYXZlIHR5cGUgU1RfQ09ERSByYXRoZXIgdGhhbiBTVF9FTlRSWSkuICAqLwotICAgICAgZWxzZSBpZiAoKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTgotCQl8fCBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0NPREUpCi0JICAgICAgICYmIGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKQotCSAgICAgICAmJiBzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKQotCWluZm8tPnN5bWJvbF90eXBlID0gU1RfQ09ERTsKLQotICAgICAgLyogSGFuZGxlIGZ1bmN0aW9uIHN5bWJvbHMgd2hpY2ggd2VyZSBkZWZpbmVkIGluIHRoaXMgZmlsZS4KLQkgVGhleSBzaG91bGQgaGF2ZSB0eXBlIFNUX0VOVFJZLiAgQWxzbyByZXRyaWV2ZSB0aGUgYXJndW1lbnQKLQkgcmVsb2NhdGlvbiBiaXRzIGZyb20gdGhlIFNPTSBiYWNrZW5kIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfRU5UUlkKLQkgICAgICAgfHwgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERQotCQkgICAmJiAoc3ltLT5mbGFncyAmIEJTRl9GVU5DVElPTikpCi0JICAgICAgIHx8IChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04KLQkJICAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKSkKLQl7Ci0JICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0VOVFJZOwotCSAgaW5mby0+YXJnX3JlbG9jID0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jOwotCSAgaW5mby0+cHJpdl9sZXZlbD0gc29tX3N5bWJvbF9kYXRhIChzeW0pLT50Y19kYXRhLmFwLmhwcGFfcHJpdl9sZXZlbDsKLQl9Ci0KLSAgICAgIC8qIEZvciB1bmtub3duIHN5bWJvbHMgc2V0IHRoZSBzeW1ib2wncyB0eXBlIGJhc2VkIG9uIHRoZSBzeW1ib2wncwotCSBzZWN0aW9uIChTVF9EQVRBIGZvciBEQVRBIHNlY3Rpb25zLCBTVF9DT0RFIGZvciBDT0RFIHNlY3Rpb25zKS4gICovCi0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1VOS05PV04pCi0JewotCSAgaWYgKHN5bS0+c2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09ERSkKLQkgICAgaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9DT0RFOwotCSAgZWxzZQotCSAgICBpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0JfQotICAKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfVU5LTk9XTikKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0RBVEE7Ci0KLSAgICAgIC8qIEZyb20gbm93IG9uIGl0J3MgYSB2ZXJ5IHNpbXBsZSBtYXBwaW5nLiAgKi8KLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9BQlNPTFVURTsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQ09ERSkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX0NPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX0RBVEEpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9EQVRBOwotICAgICAgZWxzZSBpZiAoc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9PSBTWU1CT0xfVFlQRV9NSUxMSUNPREUpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9NSUxMSUNPREU7Ci0gICAgICBlbHNlIGlmIChzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID09IFNZTUJPTF9UWVBFX1BMQUJFTCkKLQlpbmZvLT5zeW1ib2xfdHlwZSA9IFNUX1BMQUJFTDsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfUFJJX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9QUklfUFJPRzsKLSAgICAgIGVsc2UgaWYgKHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfU0VDX1BST0cpCi0JaW5mby0+c3ltYm9sX3R5cGUgPSBTVF9TRUNfUFJPRzsKLSAgICB9Ci0JCi0gIC8qIE5vdyBoYW5kbGUgdGhlIHN5bWJvbCdzIHNjb3BlLiAgRXhwb3J0ZWQgZGF0YSB3aGljaCBpcyBub3QKLSAgICAgaW4gdGhlIGNvbW1vbiBzZWN0aW9uIGhhcyBzY29wZSBTU19VTklWRVJTQUwuICBOb3RlIHNjb3BlCi0gICAgIG9mIGNvbW1vbiBzeW1ib2xzIHdhcyBoYW5kbGVkIGVhcmxpZXIhICAqLwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotICAgIGluZm8tPnN5bWJvbF9zY29wZSA9IFNTX1VOU0FUOwotICBlbHNlIGlmIChzeW0tPmZsYWdzICYgQlNGX0VYUE9SVCAmJiAhIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19VTklWRVJTQUw7Ci0gIC8qIEFueXRoaW5nIGVsc2Ugd2hpY2ggaXMgbm90IGluIHRoZSBjb21tb24gc2VjdGlvbiBoYXMgc2NvcGUKLSAgICAgU1NfTE9DQUwuICAqLwotICBlbHNlIGlmICghIGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfc2NvcGUgPSBTU19MT0NBTDsKLQotICAvKiBOb3cgc2V0IHRoZSBzeW1ib2xfaW5mbyBmaWVsZC4gIEl0IGhhcyBubyByZWFsIG1lYW5pbmcKLSAgICAgZm9yIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9scywgYnV0IHRoZSBIUCBsaW5rZXIgd2lsbAotICAgICBjaG9rZSBpZiBpdCdzIG5vdCBzZXQgdG8gc29tZSAicmVhc29uYWJsZSIgdmFsdWUuICBXZQotICAgICB1c2UgemVybyBhcyBhIHJlYXNvbmFibGUgdmFsdWUuICAqLwotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0gICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLSAgICAgIHx8IGJmZF9pc19hYnNfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IDA7Ci0gIC8qIEZvciBhbGwgb3RoZXIgc3ltYm9scywgdGhlIHN5bWJvbF9pbmZvIGZpZWxkIGNvbnRhaW5zIHRoZSAKLSAgICAgc3Vic3BhY2UgaW5kZXggb2YgdGhlIHNwYWNlIHRoaXMgc3ltYm9sIGlzIGNvbnRhaW5lZCBpbi4gICovCi0gIGVsc2UKLSAgICBpbmZvLT5zeW1ib2xfaW5mbyA9IHN5bS0+c2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCi0gIC8qIFNldCB0aGUgc3ltYm9sJ3MgdmFsdWUuICAqLwotICBpbmZvLT5zeW1ib2xfdmFsdWUgPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWE7Ci19Ci0KLS8qIEJ1aWxkIGFuZCB3cml0ZSwgaW4gb25lIGJpZyBjaHVuaywgdGhlIGVudGlyZSBzeW1ib2wgdGFibGUgZm9yCi0gICB0aGlzIEJGRC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYnVpbGRfYW5kX3dyaXRlX3N5bWJvbF90YWJsZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB1bnNpZ25lZCBpbnQgbnVtX3N5bXMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgZmlsZV9wdHIgc3ltdGFiX2xvY2F0aW9uID0gb2JqX3NvbV9maWxlX2hkciAoYWJmZCktPnN5bWJvbF9sb2NhdGlvbjsKLSAgYXN5bWJvbCAqKmJmZF9zeW1zID0gb2JqX3NvbV9zb3J0ZWRfc3ltcyAoYWJmZCk7Ci0gIHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKnNvbV9zeW10YWIgPSBOVUxMOwotICBpbnQgaSwgc3ltdGFiX3NpemU7Ci0KLSAgLyogQ29tcHV0ZSB0b3RhbCBzeW1ib2wgdGFibGUgc2l6ZSBhbmQgYWxsb2NhdGUgYSBjaHVuayBvZiBtZW1vcnkKLSAgICAgdG8gaG9sZCB0aGUgc3ltYm9sIHRhYmxlIGFzIHdlIGJ1aWxkIGl0LiAgKi8KLSAgc3ltdGFiX3NpemUgPSBudW1fc3ltcyAqIHNpemVvZiAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0gIHNvbV9zeW10YWIgPSAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqKSBiZmRfbWFsbG9jIChzeW10YWJfc2l6ZSk7Ci0gIGlmIChzb21fc3ltdGFiID09IE5VTEwgJiYgc3ltdGFiX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0IChzb21fc3ltdGFiLCAwLCBzeW10YWJfc2l6ZSk7Ci0KLSAgLyogV2FsayBvdmVyIGVhY2ggc3ltYm9sLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1zOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87Ci0KLSAgICAgIC8qIFRoaXMgaXMgcmVhbGx5IGFuIGluZGV4IGludG8gdGhlIHN5bWJvbCBzdHJpbmdzIHRhYmxlLiAgCi0JIEJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlLCB0aGUgaW5kZXggaGFzIGFscmVhZHkgYmVlbiAKLQkgY29tcHV0ZWQgYW5kIHN0b3JlZCBpbnRvIHRoZSBuYW1lIGZpZWxkIGluIHRoZSBCRkQgc3ltYm9sLiAgKi8KLSAgICAgIHNvbV9zeW10YWJbaV0ubmFtZS5uX3N0cnggPSBzb21fc3ltYm9sX2RhdGEoYmZkX3N5bXNbaV0pLT5zdHJpbmd0YWJfb2Zmc2V0OwotCi0gICAgICAvKiBEZXJpdmUgU09NIGluZm9ybWF0aW9uIGZyb20gdGhlIEJGRCBzeW1ib2wuICAqLwotICAgICAgc29tX2JmZF9kZXJpdmVfbWlzY19zeW1ib2xfaW5mbyAoYWJmZCwgYmZkX3N5bXNbaV0sICZpbmZvKTsKLQotICAgICAgLyogTm93IHVzZSBpdC4gICovCi0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF90eXBlID0gaW5mby5zeW1ib2xfdHlwZTsKLSAgICAgIHNvbV9zeW10YWJbaV0uc3ltYm9sX3Njb3BlID0gaW5mby5zeW1ib2xfc2NvcGU7Ci0gICAgICBzb21fc3ltdGFiW2ldLmFyZ19yZWxvYyA9IGluZm8uYXJnX3JlbG9jOwotICAgICAgc29tX3N5bXRhYltpXS5zeW1ib2xfaW5mbyA9IGluZm8uc3ltYm9sX2luZm87Ci0gICAgICBzb21fc3ltdGFiW2ldLnhsZWFzdCA9IDM7Ci0gICAgICBzb21fc3ltdGFiW2ldLnN5bWJvbF92YWx1ZSA9IGluZm8uc3ltYm9sX3ZhbHVlIHwgaW5mby5wcml2X2xldmVsOwotICAgIH0KLQotICAvKiBFdmVyeXRoaW5nIGlzIHJlYWR5LCBzZWVrIHRvIHRoZSByaWdodCBsb2NhdGlvbiBhbmQKLSAgICAgc2NyaWJibGUgb3V0IHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHN5bXRhYl9sb2NhdGlvbiwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9zeW10YWIsIHN5bXRhYl9zaXplLCAxLCBhYmZkKSAhPSBzeW10YWJfc2l6ZSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoc29tX3N5bXRhYiAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9zeW10YWIpOwotICByZXR1cm4gdHJ1ZTsKLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChzb21fc3ltdGFiICE9IE5VTEwpCi0gICAgZnJlZSAoc29tX3N5bXRhYik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogV3JpdGUgYW4gb2JqZWN0IGluIFNPTSBmb3JtYXQuICAqLyAgCi0KLXN0YXRpYyBib29sZWFuCi1zb21fd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFNldCB1cCBmaXhlZCBwYXJ0cyBvZiB0aGUgZmlsZSwgc3BhY2UsIGFuZCBzdWJzcGFjZSBoZWFkZXJzLgotCSBOb3RpZnkgdGhlIHdvcmxkIHRoYXQgb3V0cHV0IGhhcyBiZWd1bi4gICovCi0gICAgICBzb21fcHJlcF9oZWFkZXJzIChhYmZkKTsKLSAgICAgIGFiZmQtPm91dHB1dF9oYXNfYmVndW4gPSB0cnVlOwotICAgICAgLyogU3RhcnQgd3JpdGluZyB0aGUgb2JqZWN0IGZpbGUuICBUaGlzIGluY2x1ZGUgYWxsIHRoZSBzdHJpbmcKLQkgdGFibGVzLCBmaXh1cCBzdHJlYW1zLCBhbmQgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHNvbV9iZWdpbl93cml0aW5nIChhYmZkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzb21fZmluaXNoX3dyaXRpbmcgKGFiZmQpKTsKLX0KLQotDAotLyogUmVhZCBhbmQgc2F2ZSB0aGUgc3RyaW5nIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9zbHVycF9zdHJpbmdfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqc3RyaW5ndGFiOwotCi0gIC8qIFVzZSB0aGUgc2F2ZWQgdmVyc2lvbiBpZiBpdHMgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKG9ial9zb21fc3RyaW5ndGFiIChhYmZkKSAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEkgZG9uJ3QgdGhpbmsgdGhpcyBjYW4gY3VycmVudGx5IGhhcHBlbiwgYW5kIEknbSBub3Qgc3VyZSBpdCBzaG91bGQKLSAgICAgcmVhbGx5IGJlIGFuIGVycm9yLCBidXQgaXQncyBiZXR0ZXIgdGhhbiBnZXR0aW5nIHVucHJlZGljdGFibGUgcmVzdWx0cwotICAgICBmcm9tIHRoZSBob3N0J3MgbWFsbG9jIHdoZW4gcGFzc2VkIGEgc2l6ZSBvZiB6ZXJvLiAgKi8KLSAgaWYgKG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBhbmQgcmVhZCBpbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLSAgc3RyaW5ndGFiID0gYmZkX21hbGxvYyAob2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpOwotICBpZiAoc3RyaW5ndGFiID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBtZW1zZXQgKHN0cmluZ3RhYiwgMCwgb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpOwotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3NvbV9zdHJfZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICAKLSAgaWYgKGJmZF9yZWFkIChzdHJpbmd0YWIsIG9ial9zb21fc3RyaW5ndGFiX3NpemUgKGFiZmQpLCAxLCBhYmZkKQotICAgICAgIT0gb2JqX3NvbV9zdHJpbmd0YWJfc2l6ZSAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFNhdmUgb3VyIHJlc3VsdHMgYW5kIHJldHVybiBzdWNjZXNzLiAqLwotICBvYmpfc29tX3N0cmluZ3RhYiAoYWJmZCkgPSBzdHJpbmd0YWI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBkYXRhIChpbiBieXRlcykgcmVxdWlyZWQgdG8gaG9sZCB0aGUgc3ltYm9sCi0gICB0YWJsZSBmb3IgdGhpcyBvYmplY3QuICAqLwotCi1zdGF0aWMgbG9uZwotc29tX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKCFzb21fc2x1cnBfc3ltYm9sX3RhYmxlIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIChiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSArIDEpICogKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci19Ci0KLS8qIENvbnZlcnQgZnJvbSBhIFNPTSBzdWJzcGFjZSBpbmRleCB0byBhIEJGRCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICoKLWJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgc3ltYm9sKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzeW1ib2xfZGljdGlvbmFyeV9yZWNvcmQgKnN5bWJvbDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgLyogVGhlIG1lYW5pbmcgb2YgdGhlIHN5bWJvbF9pbmZvIGZpZWxkIGNoYW5nZXMgZm9yIGZ1bmN0aW9ucwotICAgICB3aXRoaW4gZXhlY3V0YWJsZXMuICBTbyBvbmx5IHVzZSB0aGUgcXVpY2sgc3ltYm9sX2luZm8gbWFwcGluZyBmb3IKLSAgICAgaW5jb21wbGV0ZSBvYmplY3RzIGFuZCBub24tZnVuY3Rpb24gc3ltYm9scyBpbiBleGVjdXRhYmxlcy4gICovCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiAoRVhFQ19QIHwgRFlOQU1JQykpID09IDAKLSAgICAgIHx8IChzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX0VOVFJZCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX1BSSV9QUk9HCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX1NFQ19QUk9HCi0JICAmJiBzeW1ib2wtPnN5bWJvbF90eXBlICE9IFNUX01JTExJQ09ERSkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGluZGV4ID0gc3ltYm9sLT5zeW1ib2xfaW5mbzsKLSAgICAgIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotCWlmIChzZWN0aW9uLT50YXJnZXRfaW5kZXggPT0gaW5kZXggJiYgc29tX2lzX3N1YnNwYWNlIChzZWN0aW9uKSkKLQkgIHJldHVybiBzZWN0aW9uOwotCi0gICAgICAvKiBDb3VsZCBiZSBhIHN5bWJvbCBmcm9tIGFuIGV4dGVybmFsIGxpYnJhcnkgKHN1Y2ggYXMgYW4gT01PUwotCSBzaGFyZWQgbGlicmFyeSkuICBEb24ndCBhYm9ydC4gICovCi0gICAgICByZXR1cm4gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IHN5bWJvbC0+c3ltYm9sX3ZhbHVlOwotCi0gICAgICAvKiBGb3IgZXhlY3V0YWJsZXMgd2Ugd2lsbCBoYXZlIHRvIHVzZSB0aGUgc3ltYm9sJ3MgYWRkcmVzcyBhbmQKLQkgZmluZCBvdXQgd2hhdCBzZWN0aW9uIHdvdWxkIGNvbnRhaW4gdGhhdCBhZGRyZXNzLiAgIFl1ay4gICovCi0gICAgICBmb3IgKHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsgc2VjdGlvbjsgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0JewotCSAgaWYgKHZhbHVlID49IHNlY3Rpb24tPnZtYQotCSAgICAgICYmIHZhbHVlIDw9IHNlY3Rpb24tPnZtYSArIHNlY3Rpb24tPl9jb29rZWRfc2l6ZQotCSAgICAgICYmIHNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikpCi0JICAgIHJldHVybiBzZWN0aW9uOwotCX0KLQotICAgICAgLyogQ291bGQgYmUgYSBzeW1ib2wgZnJvbSBhbiBleHRlcm5hbCBsaWJyYXJ5IChzdWNoIGFzIGFuIE9NT1MKLQkgc2hhcmVkIGxpYnJhcnkpLiAgRG9uJ3QgYWJvcnQuICAqLwotICAgICAgcmV0dXJuIGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0KLSAgICB9Ci19Ci0KLS8qIFJlYWQgYW5kIHNhdmUgdGhlIHN5bWJvbCB0YWJsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIEJGRC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHN5bWJvbF9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBpbnQgc3ltc2l6ZSA9IHNpemVvZiAoc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCk7Ci0gIGNoYXIgKnN0cmluZ3RhYjsKLSAgc3RydWN0IHN5bWJvbF9kaWN0aW9uYXJ5X3JlY29yZCAqYnVmID0gTlVMTCwgKmJ1ZnAsICplbmRidWZwOwotICBzb21fc3ltYm9sX3R5cGUgKnN5bSwgKnN5bWJhc2U7Ci0KLSAgLyogUmV0dXJuIHNhdmVkIHZhbHVlIGlmIGl0IGV4aXN0cy4gICovCi0gIGlmIChvYmpfc29tX3N5bXRhYiAoYWJmZCkgIT0gTlVMTCkKLSAgICBnb3RvIHN1Y2Nlc3NmdWxfcmV0dXJuOwotCi0gIC8qIFNwZWNpYWwgY2FzZS4gIFRoaXMgaXMgKm5vdCogYW4gZXJyb3IuICAqLwotICBpZiAoc3ltYm9sX2NvdW50ID09IDApCi0gICAgZ290byBzdWNjZXNzZnVsX3JldHVybjsKLQotICBpZiAoIXNvbV9zbHVycF9zdHJpbmdfdGFibGUgKGFiZmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHN0cmluZ3RhYiA9IG9ial9zb21fc3RyaW5ndGFiIChhYmZkKTsKLQotICBzeW1iYXNlID0gKChzb21fc3ltYm9sX3R5cGUgKikKLQkgICAgIGJmZF9tYWxsb2MgKHN5bWJvbF9jb3VudCAqIHNpemVvZiAoc29tX3N5bWJvbF90eXBlKSkpOwotICBpZiAoc3ltYmFzZSA9PSBOVUxMKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBtZW1zZXQgKHN5bWJhc2UsIDAsIHN5bWJvbF9jb3VudCAqIHNpemVvZiAoc29tX3N5bWJvbF90eXBlKSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgZXh0ZXJuYWwgU09NIHJlcHJlc2VudGF0aW9uLiAgKi8KLSAgYnVmID0gYmZkX21hbGxvYyAoc3ltYm9sX2NvdW50ICogc3ltc2l6ZSk7Ci0gIGlmIChidWYgPT0gTlVMTCAmJiBzeW1ib2xfY291bnQgKiBzeW1zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChiZmRfc2VlayAoYWJmZCwgb2JqX3NvbV9zeW1fZmlsZXBvcyAoYWJmZCksIFNFRUtfU0VUKSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmIChiZmRfcmVhZCAoYnVmLCBzeW1ib2xfY291bnQgKiBzeW1zaXplLCAxLCBhYmZkKSAKLSAgICAgICE9IHN5bWJvbF9jb3VudCAqIHN5bXNpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogSXRlcmF0ZSBvdmVyIGFsbCB0aGUgc3ltYm9scyBhbmQgaW50ZXJuYWxpemUgdGhlbS4gICovCi0gIGVuZGJ1ZnAgPSBidWYgKyBzeW1ib2xfY291bnQ7Ci0gIGZvciAoYnVmcCA9IGJ1Ziwgc3ltID0gc3ltYmFzZTsgYnVmcCA8IGVuZGJ1ZnA7ICsrYnVmcCkKLSAgICB7Ci0KLSAgICAgIC8qIEkgZG9uJ3QgdGhpbmsgd2UgY2FyZSBhYm91dCB0aGVzZS4gICovCi0gICAgICBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfU1lNX0VYVAotCSAgfHwgYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfQVJHX0VYVCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2V0IHNvbWUgcHJpdmF0ZSBkYXRhIHdlIGNhcmUgYWJvdXQuICAqLwotICAgICAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX05VTEwpCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9BQlNPTFVURSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfQUJTT0xVVEU7Ci0gICAgICBlbHNlIGlmIChidWZwLT5zeW1ib2xfdHlwZSA9PSBTVF9EQVRBKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9EQVRBOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfQ09ERSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfQ09ERTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1BSSV9QUk9HKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9QUklfUFJPRzsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX1NFQ19QUk9HKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9TRUNfUFJPRzsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX0VOVFJZKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9FTlRSWTsKLSAgICAgIGVsc2UgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlID09IFNUX01JTExJQ09ERSkKLQlzb21fc3ltYm9sX2RhdGEgKHN5bSktPnNvbV90eXBlID0gU1lNQk9MX1RZUEVfTUlMTElDT0RFOwotICAgICAgZWxzZSBpZiAoYnVmcC0+c3ltYm9sX3R5cGUgPT0gU1RfUExBQkVMKQotCXNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+c29tX3R5cGUgPSBTWU1CT0xfVFlQRV9QTEFCRUw7Ci0gICAgICBlbHNlCi0Jc29tX3N5bWJvbF9kYXRhIChzeW0pLT5zb21fdHlwZSA9IFNZTUJPTF9UWVBFX1VOS05PV047Ci0gICAgICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MgPSBidWZwLT5hcmdfcmVsb2M7Ci0KLSAgICAgIC8qIFNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cy4gICovCi0gICAgICBzeW0tPnN5bWJvbC50aGVfYmZkID0gYWJmZDsKLSAgICAgIHN5bS0+c3ltYm9sLm5hbWUgPSBidWZwLT5uYW1lLm5fc3RyeCArIHN0cmluZ3RhYjsKLSAgICAgIHN5bS0+c3ltYm9sLnZhbHVlID0gYnVmcC0+c3ltYm9sX3ZhbHVlOwotICAgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IDA7Ci0gICAgICBzeW0tPnN5bWJvbC5mbGFncyA9IDA7Ci0KLSAgICAgIHN3aXRjaCAoYnVmcC0+c3ltYm9sX3R5cGUpCi0JewotCWNhc2UgU1RfRU5UUlk6Ci0JY2FzZSBTVF9NSUxMSUNPREU6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICBzb21fc3ltYm9sX2RhdGEgKHN5bSktPnRjX2RhdGEuYXAuaHBwYV9wcml2X2xldmVsID0KLQkgICAgc3ltLT5zeW1ib2wudmFsdWUgJiAweDM7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAmPSB+MHgzOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNUX1NUVUI6Ci0JY2FzZSBTVF9DT0RFOgotCWNhc2UgU1RfUFJJX1BST0c6Ci0JY2FzZSBTVF9TRUNfUFJPRzoKLQkgIHNvbV9zeW1ib2xfZGF0YSAoc3ltKS0+dGNfZGF0YS5hcC5ocHBhX3ByaXZfbGV2ZWwgPQotCSAgICBzeW0tPnN5bWJvbC52YWx1ZSAmIDB4MzsKLQkgIHN5bS0+c3ltYm9sLnZhbHVlICY9IH4weDM7Ci0JICAvKiBJZiB0aGUgc3ltYm9sJ3Mgc2NvcGUgaXMgU1RfVU5TQVQsIHRoZW4gdGhlc2UgYXJlCi0JICAgICB1bmRlZmluZWQgZnVuY3Rpb24gc3ltYm9scy4gICovCi0JICBpZiAoYnVmcC0+c3ltYm9sX3Njb3BlID09IFNTX1VOU0FUKQotCSAgICBzeW0tPnN5bWJvbC5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICAgICAKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIEhhbmRsZSBzY29waW5nIGFuZCBzZWN0aW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHN3aXRjaCAoYnVmcC0+c3ltYm9sX3Njb3BlKQotCXsKLQkvKiBzeW1ib2xfaW5mbyBmaWVsZCBpcyB1bmRlZmluZWQgZm9yIFNTX0VYVEVSTkFMIGFuZCBTU19VTlNBVCBzeW1ib2xzLAotCSAgIHNvIHRoZSBzZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN5bWJvbCBjYW4ndCBiZSBrbm93bi4gICovCi0JY2FzZSBTU19FWFRFUk5BTDoKLQkgIGlmIChidWZwLT5zeW1ib2xfdHlwZSAhPSBTVF9TVE9SQUdFKQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkgIGVsc2UKLQkgICAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9jb21fc2VjdGlvbl9wdHI7Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSAoQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUwpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFNTX1VOU0FUOgotCSAgaWYgKGJ1ZnAtPnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIHN5bS0+c3ltYm9sLnNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICBzeW0tPnN5bWJvbC5zZWN0aW9uID0gYmZkX2NvbV9zZWN0aW9uX3B0cjsKLQkgIGJyZWFrOwotCi0JY2FzZSBTU19VTklWRVJTQUw6Ci0JICBzeW0tPnN5bWJvbC5mbGFncyB8PSAoQlNGX0VYUE9SVCB8IEJTRl9HTE9CQUwpOwotCSAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgYnVmcCk7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQotI2lmIDAKLQkvKiBTU19HTE9CQUwgYW5kIFNTX0xPQ0FMIGFyZSB0d28gbmFtZXMgZm9yIHRoZSBzYW1lIHRoaW5nLgotCSAgIFNvdW5kIGR1bWI/ICBJdCBpcy4gICovCi0JY2FzZSBTU19HTE9CQUw6Ci0jZW5kaWYKLQljYXNlIFNTX0xPQ0FMOgotCSAgc3ltLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0xPQ0FMOwotCSAgc3ltLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9zZWN0aW9uX2Zyb21fc29tX3N5bWJvbCAoYWJmZCwgYnVmcCk7Ci0JICBzeW0tPnN5bWJvbC52YWx1ZSAtPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT52bWE7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIE1hcmsgc2VjdGlvbiBzeW1ib2xzIGFuZCBzeW1ib2xzIHVzZWQgYnkgdGhlIGRlYnVnZ2VyLgotCSBOb3RlICRTVEFSVCQgaXMgYSBtYWdpYyBjb2RlIHN5bWJvbCwgTk9UIGEgc2VjdGlvbiBzeW1ib2wuICAqLwotICAgICAgaWYgKHN5bS0+c3ltYm9sLm5hbWVbMF0gPT0gJyQnCi0JICAmJiBzeW0tPnN5bWJvbC5uYW1lW3N0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgLSAxXSA9PSAnJCcKLQkgICYmICFzdHJjbXAgKHN5bS0+c3ltYm9sLm5hbWUsIHN5bS0+c3ltYm9sLnNlY3Rpb24tPm5hbWUpKQotCXN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLSAgICAgIGVsc2UgaWYgKCFzdHJuY21wIChzeW0tPnN5bWJvbC5uYW1lLCAiTCQwXDAwMiIsIDQpKQotCXsKLQkgIHN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9TRUNUSU9OX1NZTTsKLQkgIHN5bS0+c3ltYm9sLm5hbWUgPSBzeW0tPnN5bWJvbC5zZWN0aW9uLT5uYW1lOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJuY21wIChzeW0tPnN5bWJvbC5uYW1lLCAiTCQwXDAwMSIsIDQpKQotCXN5bS0+c3ltYm9sLmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0KLSAgICAgIC8qIE5vdGUgaW5jcmVtZW50IGF0IGJvdHRvbSBvZiBsb29wLCBzaW5jZSB3ZSBza2lwIHNvbWUgc3ltYm9scwotICAgICAgICAgd2UgY2FuIG5vdCBpbmNsdWRlIGl0IGFzIHBhcnQgb2YgdGhlIGZvciBzdGF0ZW1lbnQuICAqLwotICAgICAgc3ltKys7Ci0gICAgfQotCi0gIC8qIFdlIG1vZGlmeSB0aGUgc3ltYm9sIGNvdW50IHRvIHJlY29yZCB0aGUgbnVtYmVyIG9mIEJGRCBzeW1ib2xzIHdlCi0gICAgIGNyZWF0ZWQuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IHN5bSAtIHN5bWJhc2U7Ci0KLSAgLyogU2F2ZSBvdXIgcmVzdWx0cyBhbmQgcmV0dXJuIHN1Y2Nlc3MuICAqLwotICBvYmpfc29tX3N5bXRhYiAoYWJmZCkgPSBzeW1iYXNlOwotIHN1Y2Nlc3NmdWxfcmV0dXJuOgotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLSAgcmV0dXJuICh0cnVlKTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2Fub25pY2FsaXplIGEgU09NIHN5bWJvbCB0YWJsZS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMKLSAgIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotc29tX2dldF9zeW10YWIgKGFiZmQsIGxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLXsKLSAgaW50IGk7Ci0gIHNvbV9zeW1ib2xfdHlwZSAqc3ltYmFzZTsKLQotICBpZiAoIXNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGFiZmQpKQotICAgIHJldHVybiAtMTsKLQotICBpID0gYmZkX2dldF9zeW1jb3VudCAoYWJmZCk7Ci0gIHN5bWJhc2UgPSBvYmpfc29tX3N5bXRhYiAoYWJmZCk7Ci0KLSAgZm9yICg7IGkgPiAwOyBpLS0sIGxvY2F0aW9uKyssIHN5bWJhc2UrKykKLSAgICAqbG9jYXRpb24gPSAmc3ltYmFzZS0+c3ltYm9sOwotCi0gIC8qIEZpbmFsIG51bGwgcG9pbnRlci4gICovCi0gICpsb2NhdGlvbiA9IDA7Ci0gIHJldHVybiAoYmZkX2dldF9zeW1jb3VudCAoYWJmZCkpOwotfQotCi0vKiBNYWtlIGEgU09NIHN5bWJvbC4gIFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCB0byBkbyBoZXJlLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotc29tX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNvbV9zeW1ib2xfdHlwZSAqbmV3ID0KLSAgKHNvbV9zeW1ib2xfdHlwZSAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHNvbV9zeW1ib2xfdHlwZSkpOwotICBpZiAobmV3ID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIG5ldy0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0gIHJldHVybiAmbmV3LT5zeW1ib2w7Ci19Ci0KLS8qIFByaW50IHN5bWJvbCBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zb21fcHJpbnRfc3ltYm9sIChpZ25vcmVfYWJmZCwgYWZpbGUsIHN5bWJvbCwgaG93KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBQVFIgYWZpbGU7Ci0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgYmZkX3ByaW50X3N5bWJvbF90eXBlIGhvdzsKLXsKLSAgRklMRSAqZmlsZSA9IChGSUxFICopIGFmaWxlOwotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAic29tICIpOwotICAgICAgZnByaW50Zl92bWEgKGZpbGUsIHN5bWJvbC0+dmFsdWUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIiAlbHgiLCAobG9uZykgc3ltYm9sLT5mbGFncyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfYWxsOgotICAgICAgewotCUNPTlNUIGNoYXIgKnNlY3Rpb25fbmFtZTsKLQlzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24gPyBzeW1ib2wtPnNlY3Rpb24tPm5hbWUgOiAiKCpub25lKikiOwotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKChQVFIpIGZpbGUsIHN5bWJvbCk7Ci0JZnByaW50ZiAoZmlsZSwgIiAlc1x0JXMiLCBzZWN0aW9uX25hbWUsIHN5bWJvbC0+bmFtZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnJCcpOwotfQotCi0vKiBDb3VudCBvciBwcm9jZXNzIHZhcmlhYmxlLWxlbmd0aCBTT00gZml4dXAgcmVjb3Jkcy4KLQotICAgVG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiB3ZSB1c2UgdGhpcyBjb2RlIGJvdGggdG8gY29tcHV0ZSB0aGUgbnVtYmVyCi0gICBvZiByZWxvY2F0aW9ucyByZXF1ZXN0ZWQgYnkgYSBzdHJlYW0sIGFuZCB0byBpbnRlcm5hbGl6ZSB0aGUgc3RyZWFtLgotCi0gICBXaGVuIGNvbXB1dGluZyB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHJlcXVlc3RlZCBieSBhIHN0cmVhbSB0aGUKLSAgIHZhcmlhYmxlcyBycHRyLCBzZWN0aW9uLCBhbmQgc3ltYm9scyBoYXZlIG5vIG1lYW5pbmcuCi0KLSAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIHJlcXVlc3RlZCBieSB0aGUgZml4dXAgc3RyZWFtLiAgV2hlbgotICAgbm90IGp1c3QgY291bnRpbmcgCi0KLSAgIFRoaXMgbmVlZHMgYXQgbGVhc3QgdHdvIG9yIHRocmVlIG1vcmUgcGFzc2VzIHRvIGdldCBpdCBjbGVhbmVkIHVwLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotc29tX3NldF9yZWxvY19pbmZvIChmaXh1cCwgZW5kLCBpbnRlcm5hbF9yZWxvY3MsIHNlY3Rpb24sIHN5bWJvbHMsIGp1c3RfY291bnQpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmZpeHVwOwotICAgICB1bnNpZ25lZCBpbnQgZW5kOwotICAgICBhcmVsZW50ICppbnRlcm5hbF9yZWxvY3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLSAgICAgYm9vbGVhbiBqdXN0X2NvdW50OwotewotICB1bnNpZ25lZCBpbnQgb3AsIHZhcm5hbWUsIGRlYWxsb2NhdGVfY29udGVudHMgPSAwOwotICB1bnNpZ25lZCBjaGFyICplbmRfZml4dXBzID0gJmZpeHVwW2VuZF07Ci0gIGNvbnN0IHN0cnVjdCBmaXh1cF9mb3JtYXQgKmZwOwotICBjaGFyICpjcDsKLSAgdW5zaWduZWQgY2hhciAqc2F2ZV9maXh1cDsKLSAgaW50IHZhcmlhYmxlc1syNl0sIHN0YWNrWzIwXSwgYywgdiwgY291bnQsIHByZXZfZml4dXAsICpzcCwgc2F2ZWRfdW53aW5kX2JpdHM7Ci0gIGNvbnN0IGludCAqc3Vib3A7Ci0gIGFyZWxlbnQgKnJwdHI9IGludGVybmFsX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0KLSNkZWZpbmUJdmFyKGMpCQl2YXJpYWJsZXNbKGMpIC0gJ0EnXQotI2RlZmluZQlwdXNoKHYpCQkoKnNwKysgPSAodikpCi0jZGVmaW5lCXBvcCgpCQkoKi0tc3ApCi0jZGVmaW5lCWVtcHR5c3RhY2soKQkoc3AgPT0gc3RhY2spCi0KLSAgc29tX2luaXRpYWxpemVfcmVsb2NfcXVldWUgKHJlbG9jX3F1ZXVlKTsKLSAgbWVtc2V0ICh2YXJpYWJsZXMsIDAsIHNpemVvZiAodmFyaWFibGVzKSk7Ci0gIG1lbXNldCAoc3RhY2ssIDAsIHNpemVvZiAoc3RhY2spKTsKLSAgY291bnQgPSAwOwotICBwcmV2X2ZpeHVwID0gMDsKLSAgc2F2ZWRfdW53aW5kX2JpdHMgPSAwOwotICBzcCA9IHN0YWNrOwotCi0gIHdoaWxlIChmaXh1cCA8IGVuZF9maXh1cHMpCi0gICAgewotCi0gICAgICAvKiBTYXZlIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgZml4dXAuICBXZSdsbCB1c2UKLQkgaXQgbGF0ZXIgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBwdXQgdGhpcyBmaXh1cAotCSBvbiB0aGUgcXVldWUuICAqLwotICAgICAgc2F2ZV9maXh1cCA9IGZpeHVwOwotCi0gICAgICAvKiBHZXQgdGhlIGZpeHVwIGNvZGUgYW5kIGl0cyBhc3NvY2lhdGVkIGZvcm1hdC4gICovCi0gICAgICBvcCA9ICpmaXh1cCsrOwotICAgICAgZnAgPSAmc29tX2ZpeHVwX2Zvcm1hdHNbb3BdOwotCi0gICAgICAvKiBIYW5kbGUgYSByZXF1ZXN0IGZvciBhIHByZXZpb3VzIGZpeHVwLiAgKi8KLSAgICAgIGlmICgqZnAtPmZvcm1hdCA9PSAnUCcpCi0JewotCSAgLyogR2V0IHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJldiBmaXh1cCwgbW92ZQotCSAgICAgdGhlIHJlcGVhdGVkIGZpeHVwIHRvIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4gICovCi0JICBmaXh1cCA9IHJlbG9jX3F1ZXVlW2ZwLT5EXS5yZWxvYzsKLQkgIHNvbV9yZWxvY19xdWV1ZV9maXggKHJlbG9jX3F1ZXVlLCBmcC0+RCk7Ci0JICBwcmV2X2ZpeHVwID0gMTsKLQotCSAgLyogR2V0IHRoZSBmaXh1cCBjb2RlIGFuZCBpdHMgYXNzb2NpYXRlZCBmb3JtYXQuICAqLwotCSAgb3AgPSAqZml4dXArKzsKLQkgIGZwID0gJnNvbV9maXh1cF9mb3JtYXRzW29wXTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgZml4dXAgd2lsbCBiZSBwYXNzZWQgdG8gQkZELCBzZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzLiAgKi8KLSAgICAgIGlmICghIGp1c3RfY291bnQKLQkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfTk9fUkVMT0NBVElPTgotCSAgJiYgc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgIT0gUl9EQVRBX09WRVJSSURFKQotCXsKLQkgIHJwdHItPmFkZHJlc3MgPSBvZmZzZXQ7Ci0JICBycHRyLT5ob3d0byA9ICZzb21faHBwYV9ob3d0b190YWJsZVtvcF07Ci0JICBycHRyLT5hZGRlbmQgPSAwOwotCSAgcnB0ci0+c3ltX3B0cl9wdHIgPSBiZmRfYWJzX3NlY3Rpb25fcHRyLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIC8qIFNldCBkZWZhdWx0IGlucHV0IGxlbmd0aCB0byAwLiAgR2V0IHRoZSBvcGNvZGUgY2xhc3MgaW5kZXgKLQkgaW50byBELiAgKi8KLSAgICAgIHZhciAoJ0wnKSA9IDA7Ci0gICAgICB2YXIgKCdEJykgPSBmcC0+RDsKLSAgICAgIHZhciAoJ1UnKSA9IHNhdmVkX3Vud2luZF9iaXRzOwotCi0gICAgICAvKiBHZXQgdGhlIG9wY29kZSBmb3JtYXQuICAqLwotICAgICAgY3AgPSBmcC0+Zm9ybWF0OwotCi0gICAgICAvKiBQcm9jZXNzIHRoZSBmb3JtYXQgc3RyaW5nLiAgUGFyc2luZyBoYXBwZW5zIGluIHR3byBwaGFzZXMsCi0JIHBhcnNlIFJIUywgdGhlbiBhc3NpZ24gdG8gTEhTLiAgUmVwZWF0IHVudGlsIG5vIG1vcmUgCi0JIGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcuICAqLwotICAgICAgd2hpbGUgKCpjcCkKLQl7Ci0JICAvKiBUaGUgdmFyaWFibGUgdGhpcyBwYXNzIGlzIGdvaW5nIHRvIGNvbXB1dGUgYSB2YWx1ZSBmb3IuICAqLwotCSAgdmFybmFtZSA9ICpjcCsrOwotCi0JICAvKiBTdGFydCBwcm9jZXNzaW5nIFJIUy4gIENvbnRpbnVlIHVudGlsIGEgTlVMTCBvciAnPScgaXMgZm91bmQuICAqLwotCSAgZG8KLQkgICAgewotCSAgICAgIGMgPSAqY3ArKzsKLQotCSAgICAgIC8qIElmIHRoaXMgaXMgYSB2YXJpYWJsZSwgcHVzaCBpdCBvbiB0aGUgc3RhY2suICAqLwotCSAgICAgIGlmIChpc3VwcGVyIChjKSkKLQkJcHVzaCAodmFyIChjKSk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIGlzIGEgbG93ZXIgY2FzZSBsZXR0ZXIsIHRoZW4gaXQgcmVwcmVzZW50cwotCQkgYWRkaXRpb25hbCBkYXRhIGZyb20gdGhlIGZpeHVwIHN0cmVhbSB0byBiZSBwdXNoZWQgb250bwotCQkgdGhlIHN0YWNrLiAgKi8KLQkgICAgICBlbHNlIGlmIChpc2xvd2VyIChjKSkKLQkJewotCQkgIGludCBiaXRzID0gKGMgLSAnYScpICogODsKLQkJICBmb3IgKHYgPSAwOyBjID4gJ2EnOyAtLWMpCi0JCSAgICB2ID0gKHYgPDwgOCkgfCAqZml4dXArKzsKLQkJICBpZiAodmFybmFtZSA9PSAnVicpCi0JCSAgICB2ID0gc2lnbl9leHRlbmQgKHYsIGJpdHMpOwotCQkgIHB1c2ggKHYpOwotCQl9Ci0KLQkgICAgICAvKiBBIGRlY2ltYWwgY29uc3RhbnQuICBQdXNoIGl0IG9uIHRoZSBzdGFjay4gICovCi0JICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoYykpCi0JCXsKLQkJICB2ID0gYyAtICcwJzsKLQkJICB3aGlsZSAoaXNkaWdpdCAoKmNwKSkKLQkJICAgIHYgPSAodiAqIDEwKSArICgqY3ArKyAtICcwJyk7Ci0JCSAgcHVzaCAodik7Ci0JCX0KLQkgICAgICBlbHNlCi0KLQkJLyogQW4gb3BlcmF0b3IuICBQb3AgdHdvIHR3byB2YWx1ZXMgZnJvbSB0aGUgc3RhY2sgYW5kCi0JCSAgIHVzZSB0aGVtIGFzIG9wZXJhbmRzIHRvIHRoZSBnaXZlbiBvcGVyYXRpb24uICBQdXNoCi0JCSAgIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBiYWNrIG9uIHRoZSBzdGFjay4gICovCi0JCXN3aXRjaCAoYykKLQkJICB7Ci0JCSAgY2FzZSAnKyc6Ci0JCSAgICB2ID0gcG9wICgpOwotCQkgICAgdiArPSBwb3AgKCk7Ci0JCSAgICBwdXNoICh2KTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgJyonOgotCQkgICAgdiA9IHBvcCAoKTsKLQkJICAgIHYgKj0gcG9wICgpOwotCQkgICAgcHVzaCAodik7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICc8JzoKLQkJICAgIHYgPSBwb3AgKCk7Ci0JCSAgICB2ID0gcG9wICgpIDw8IHY7Ci0JCSAgICBwdXNoICh2KTsKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgIH0KLQkgIHdoaWxlICgqY3AgJiYgKmNwICE9ICc9Jyk7Ci0KLQkgIC8qIE1vdmUgb3ZlciB0aGUgZXF1YWwgb3BlcmF0b3IuICAqLwotCSAgY3ArKzsKLQotCSAgLyogUG9wIHRoZSBSSFMgb2ZmIHRoZSBzdGFjay4gICovCi0JICBjID0gcG9wICgpOwotCi0JICAvKiBQZXJmb3JtIHRoZSBhc3NpZ25tZW50LiAgKi8KLQkgIHZhciAodmFybmFtZSkgPSBjOwotCi0JICAvKiBIYW5kbGUgc2lkZSBlZmZlY3RzLiBhbmQgc3BlY2lhbCAnTycgc3RhY2sgY2FzZXMuICAqLwotCSAgc3dpdGNoICh2YXJuYW1lKQotCSAgICB7Ci0JICAgIC8qIENvbnN1bWUgc29tZSBieXRlcyBmcm9tIHRoZSBpbnB1dCBzcGFjZS4gICovCi0JICAgIGNhc2UgJ0wnOgotCSAgICAgIG9mZnNldCArPSBjOwotCSAgICAgIGJyZWFrOwotCSAgICAvKiBBIHN5bWJvbCB0byB1c2UgaW4gdGhlIHJlbG9jYXRpb24uICBNYWtlIGEgbm90ZQotCSAgICAgICBvZiB0aGlzIGlmIHdlIGFyZSBub3QganVzdCBjb3VudGluZy4gICovCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIGlmICghIGp1c3RfY291bnQpCi0JCXJwdHItPnN5bV9wdHJfcHRyID0gJnN5bWJvbHNbY107Ci0JICAgICAgYnJlYWs7Ci0JICAgIC8qIEFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBmb3IgYSBmdW5jdGlvbiBjYWxsLiAgKi8KLQkgICAgY2FzZSAnUic6Ci0JICAgICAgaWYgKCEganVzdF9jb3VudCkKLQkJewotCQkgIHVuc2lnbmVkIGludCB0bXAgPSB2YXIgKCdSJyk7Ci0JCSAgcnB0ci0+YWRkZW5kID0gMDsKLQotCQkgIGlmICgoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9QQ1JFTF9DQUxMCi0JCSAgICAgICAmJiBSX1BDUkVMX0NBTEwgKyAxMCA+IG9wKQotCQkgICAgICB8fCAoc29tX2hwcGFfaG93dG9fdGFibGVbb3BdLnR5cGUgPT0gUl9BQlNfQ0FMTAotCQkJICAmJiBSX0FCU19DQUxMICsgMTAgPiBvcCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFNpbXBsZSBlbmNvZGluZy4gICovCi0JCSAgICAgIGlmICh0bXAgPiA0KQotCQkJewotCQkJICB0bXAgLT0gNTsKLQkJCSAgcnB0ci0+YWRkZW5kIHw9IDE7Ci0JCQl9Ci0JCSAgICAgIGlmICh0bXAgPT0gNCkKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDggfCAxIDw8IDYgfCAxIDw8IDQgfCAxIDw8IDI7Ci0JCSAgICAgIGVsc2UgaWYgKHRtcCA9PSAzKQotCQkJcnB0ci0+YWRkZW5kIHw9IDEgPDwgOCB8IDEgPDwgNiB8IDEgPDwgNDsKLQkJICAgICAgZWxzZSBpZiAodG1wID09IDIpCi0JCQlycHRyLT5hZGRlbmQgfD0gMSA8PCA4IHwgMSA8PCA2OwotCQkgICAgICBlbHNlIGlmICh0bXAgPT0gMSkKLQkJCXJwdHItPmFkZGVuZCB8PSAxIDw8IDg7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgdG1wMSwgdG1wMjsKLQotCQkgICAgICAvKiBGaXJzdCBwYXJ0IGlzIGVhc3kgLS0gbG93IG9yZGVyIHR3byBiaXRzIGFyZQotCQkJIGRpcmVjdGx5IGNvcGllZCwgdGhlbiBzaGlmdGVkIGF3YXkuICAqLwotCQkgICAgICBycHRyLT5hZGRlbmQgPSB0bXAgJiAweDM7Ci0JCSAgICAgIHRtcCA+Pj0gMjsKLQotCQkgICAgICAvKiBEaXZpbmcgdGhlIHJlc3VsdCBieSAxMCBnaXZlcyB1cyB0aGUgc2Vjb25kCi0JCQkgcGFydC4gIElmIGl0IGlzIDksIHRoZW4gdGhlIGZpcnN0IHR3byB3b3JkcwotCQkJIGFyZSBhIGRvdWJsZSBwcmVjaXNpb24gcGFyYW1hdGVyLCBlbHNlIGl0IGlzCi0JCQkgMyAqIHRoZSBmaXJzdCBhcmcgYml0cyArIHRoZSAybmQgYXJnIGJpdHMuICAqLwotCQkgICAgICB0bXAxID0gdG1wIC8gMTA7Ci0JCSAgICAgIHRtcCAtPSB0bXAxICogMTA7Ci0JCSAgICAgIGlmICh0bXAxID09IDkpCi0JCQlycHRyLT5hZGRlbmQgKz0gKDB4ZSA8PCA2KTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAvKiBHZXQgdGhlIHR3byBwaWVjZXMuICAqLwotCQkJICB0bXAyID0gdG1wMSAvIDM7Ci0JCQkgIHRtcDEgLT0gdG1wMiAqIDM7Ci0JCQkgIC8qIFB1dCB0aGVtIGluIHRoZSBhZGRlbmQuICAqLwotCQkJICBycHRyLT5hZGRlbmQgKz0gKHRtcDIgPDwgOCkgKyAodG1wMSA8PCA2KTsKLQkJCX0KLQotCQkgICAgICAvKiBXaGF0J3MgbGVmdCBpcyB0aGUgdGhpcmQgcGFydC4gIEl0J3MgdW5wYWNrZWQKLQkJCSBqdXN0IGxpa2UgdGhlIHNlY29uZC4gICovCi0JCSAgICAgIGlmICh0bXAgPT0gOSkKLQkJCXJwdHItPmFkZGVuZCArPSAoMHhlIDw8IDIpOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHRtcDIgPSB0bXAgLyAzOwotCQkJICB0bXAgLT0gdG1wMiAqIDM7Ci0JCQkgIHJwdHItPmFkZGVuZCArPSAodG1wMiA8PCA0KSArICh0bXAgPDwgMik7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgcnB0ci0+YWRkZW5kID0gSFBQQV9SX0FEREVORCAocnB0ci0+YWRkZW5kLCAwKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICAvKiBIYW5kbGUgdGhlIGxpbmtlciBleHByZXNzaW9uIHN0YWNrLiAgKi8KLQkgICAgY2FzZSAnTyc6Ci0JICAgICAgc3dpdGNoIChvcCkKLQkJewotCQljYXNlIFJfQ09NUDE6Ci0JCSAgc3Vib3AgPSBjb21wMV9vcGNvZGVzOwotCQkgIGJyZWFrOwotCQljYXNlIFJfQ09NUDI6Ci0JCSAgc3Vib3AgPSBjb21wMl9vcGNvZGVzOwotCQkgIGJyZWFrOwotCQljYXNlIFJfQ09NUDM6Ci0JCSAgc3Vib3AgPSBjb21wM19vcGNvZGVzOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgd2hpbGUgKCpzdWJvcCA8PSAodW5zaWduZWQgY2hhcikgYykKLQkJKytzdWJvcDsKLQkgICAgICAtLXN1Ym9wOwotCSAgICAgIGJyZWFrOwotCSAgICAvKiBUaGUgbG93ZXIgMzJ1bndpbmQgYml0cyBtdXN0IGJlIHBlcnNpc3RlbnQuICAqLwotCSAgICBjYXNlICdVJzoKLQkgICAgICBzYXZlZF91bndpbmRfYml0cyA9IHZhciAoJ1UnKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSB1c2VkIGEgcHJldmlvdXMgZml4dXAsIGNsZWFuIHVwIGFmdGVyIGl0LiAgKi8KLSAgICAgIGlmIChwcmV2X2ZpeHVwKQotCXsKLQkgIGZpeHVwID0gc2F2ZV9maXh1cCArIDE7Ci0JICBwcmV2X2ZpeHVwID0gMDsKLQl9Ci0gICAgICAvKiBRdWV1ZSBpdC4gICovCi0gICAgICBlbHNlIGlmIChmaXh1cCA+IHNhdmVfZml4dXAgKyAxKQotCXNvbV9yZWxvY19xdWV1ZV9pbnNlcnQgKHNhdmVfZml4dXAsIGZpeHVwIC0gc2F2ZV9maXh1cCwgcmVsb2NfcXVldWUpOwotCi0gICAgICAvKiBXZSBkbyBub3QgcGFzcyBSX0RBVEFfT1ZFUlJJREUgb3IgUl9OT19SRUxPQ0FUSU9OIAotCSBmaXh1cHMgdG8gQkZELiAgKi8KLSAgICAgIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSAhPSBSX0RBVEFfT1ZFUlJJREUKLQkgICYmIHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlICE9IFJfTk9fUkVMT0NBVElPTikKLQl7Ci0JICAvKiBEb25lIHdpdGggYSBzaW5nbGUgcmVsb2N0aW9uLiBMb29wIGJhY2sgdG8gdGhlIHRvcC4gICovCi0JICBpZiAoISBqdXN0X2NvdW50KQotCSAgICB7Ci0JICAgICAgaWYgKHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfRU5UUlkpCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1QnKTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0VYSVQpCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1UnKTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX1BDUkVMX0NBTEwKLQkJICAgICAgIHx8IHNvbV9ocHBhX2hvd3RvX3RhYmxlW29wXS50eXBlID09IFJfQUJTX0NBTEwpCi0JCTsKLQkgICAgICBlbHNlIGlmIChzb21faHBwYV9ob3d0b190YWJsZVtvcF0udHlwZSA9PSBSX0RBVEFfT05FX1NZTUJPTCkKLQkJewotCQkgIHVuc2lnbmVkIGFkZGVuZCA9IHZhciAoJ1YnKTsKLQotCQkgIC8qIFRyeSB3aGF0IHdhcyBzcGVjaWZpZWQgaW4gUl9EQVRBX09WRVJSSURFIGZpcnN0Ci0JCSAgICAgKGlmIGFueXRoaW5nKS4gIFRoZW4gdGhlIGhhcmQgd2F5IHVzaW5nIHRoZQotCQkgICAgIHNlY3Rpb24gY29udGVudHMuICAqLwotCQkgIHJwdHItPmFkZGVuZCA9IHZhciAoJ1YnKTsKLQotCQkgIGlmIChycHRyLT5hZGRlbmQgPT0gMCAmJiAhc2VjdGlvbi0+Y29udGVudHMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIEdvdCB0byByZWFkIHRoZSBkYW1uIGNvbnRlbnRzIGZpcnN0LiAgV2UgZG9uJ3QKLQkJICAgICAgICAgYm90aGVyIHNhdmluZyB0aGUgY29udGVudHMgKHlldCkuICBBZGQgaXQgb25lCi0JCQkgZGF5IGlmIHRoZSBuZWVkIGFyaXNlcy4gICovCi0JCSAgICAgIHNlY3Rpb24tPmNvbnRlbnRzID0gYmZkX21hbGxvYyAoc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJICAgICAgZGVhbGxvY2F0ZV9jb250ZW50cyA9IDE7Ci0JCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoc2VjdGlvbi0+b3duZXIsCi0JCQkJCQlzZWN0aW9uLAotCQkJCQkJc2VjdGlvbi0+Y29udGVudHMsCi0JCQkJCQkwLAotCQkJCQkJc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChycHRyLT5hZGRlbmQgPT0gMCkKLQkJICAgIHJwdHItPmFkZGVuZCA9IGJmZF9nZXRfMzIgKHNlY3Rpb24tPm93bmVyLAotCQkJCQkgICAgICAgKHNlY3Rpb24tPmNvbnRlbnRzCi0JCQkJCQkrIG9mZnNldCAtIHZhciAoJ0wnKSkpOwotCQkJCi0JCX0KLQkgICAgICBlbHNlCi0JCXJwdHItPmFkZGVuZCA9IHZhciAoJ1YnKTsKLQkgICAgICBycHRyKys7Ci0JICAgIH0KLQkgIGNvdW50Kys7Ci0JICAvKiBOb3cgdGhhdCB3ZSd2ZSBoYW5kbGVkIGEgImZ1bGwiIHJlbG9jYXRpb24sIHJlc2V0Ci0JICAgICBzb21lIHN0YXRlLiAgKi8KLQkgIG1lbXNldCAodmFyaWFibGVzLCAwLCBzaXplb2YgKHZhcmlhYmxlcykpOwotCSAgbWVtc2V0IChzdGFjaywgMCwgc2l6ZW9mIChzdGFjaykpOwotCX0KLSAgICB9Ci0gIGlmIChkZWFsbG9jYXRlX2NvbnRlbnRzKQotICAgIGZyZWUgKHNlY3Rpb24tPmNvbnRlbnRzKTsKLQotICByZXR1cm4gY291bnQ7Ci0KLSN1bmRlZiB2YXIKLSN1bmRlZiBwdXNoCi0jdW5kZWYgcG9wCi0jdW5kZWYgZW1wdHlzdGFjawotfQotCi0vKiBSZWFkIGluIHRoZSByZWxvY3MgKGFrYSBmaXh1cHMgaW4gU09NIHRlcm1zKSBmb3IgYSBzZWN0aW9uLiAKLQotICAgc29tX2dldF9yZWxvY191cHBlcl9ib3VuZCBjYWxscyB0aGlzIHJvdXRpbmUgd2l0aCBKVVNUX0NPVU5UIAotICAgc2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgaXQgb25seSBuZWVkcyBhIGNvdW50IG9mIHRoZSBudW1iZXIKLSAgIG9mIGFjdHVhbCByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fc2x1cnBfcmVsb2NfdGFibGUgKGFiZmQsIHNlY3Rpb24sIHN5bWJvbHMsIGp1c3RfY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBib29sZWFuIGp1c3RfY291bnQ7Ci17Ci0gIGNoYXIgKmV4dGVybmFsX3JlbG9jczsKLSAgdW5zaWduZWQgaW50IGZpeHVwX3N0cmVhbV9zaXplOwotICBhcmVsZW50ICppbnRlcm5hbF9yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBudW1fcmVsb2NzOwotCi0gIGZpeHVwX3N0cmVhbV9zaXplID0gc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3NpemU7Ci0gIC8qIElmIHRoZXJlIHdlcmUgbm8gcmVsb2NhdGlvbnMsIHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4gICovCi0gIGlmIChzZWN0aW9uLT5yZWxvY19jb3VudCA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIHJlbG9jX2NvdW50IGlzIC0xLCB0aGVuIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBoYXMgbm90IGJlZW4gCi0gICAgIHBhcnNlZC4gIFdlIG11c3QgZG8gc28gbm93IHRvIGtub3cgaG93IG1hbnkgcmVsb2NhdGlvbnMgZXhpc3QuICAqLwotICBpZiAoc2VjdGlvbi0+cmVsb2NfY291bnQgPT0gLTEpCi0gICAgewotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gKGNoYXIgKikgYmZkX21hbGxvYyAoZml4dXBfc3RyZWFtX3NpemUpOwotICAgICAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSAoY2hhciAqKSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIFJlYWQgaW4gdGhlIGV4dGVybmFsIGZvcm1zLiAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLAotCQkgICAgb2JqX3NvbV9yZWxvY19maWxlcG9zIChhYmZkKSArIHNlY3Rpb24tPnJlbF9maWxlcG9zLAotCQkgICAgU0VFS19TRVQpCi0JICAhPSAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChiZmRfcmVhZCAoZXh0ZXJuYWxfcmVsb2NzLCAxLCBmaXh1cF9zdHJlYW1fc2l6ZSwgYWJmZCkKLQkgICE9IGZpeHVwX3N0cmVhbV9zaXplKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogTGV0IGNhbGxlcnMga25vdyBob3cgbWFueSByZWxvY2F0aW9ucyBmb3VuZC4KLQkgYWxzbyBzYXZlIHRoZSByZWxvY2F0aW9uIHN0cmVhbSBhcyB3ZSB3aWxsCi0JIG5lZWQgaXQgYWdhaW4uICAqLwotICAgICAgc2VjdGlvbi0+cmVsb2NfY291bnQgPSBzb21fc2V0X3JlbG9jX2luZm8gKGV4dGVybmFsX3JlbG9jcywKLQkJCQkJCSBmaXh1cF9zdHJlYW1fc2l6ZSwKLQkJCQkJCSBOVUxMLCBOVUxMLCBOVUxMLCB0cnVlKTsKLQotICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPnJlbG9jX3N0cmVhbSA9IGV4dGVybmFsX3JlbG9jczsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIGNhbGxlciBvbmx5IHdhbnRlZCBhIGNvdW50LCB0aGVuIHJldHVybiBub3cuICAqLwotICBpZiAoanVzdF9jb3VudCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBudW1fcmVsb2NzID0gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0gIGV4dGVybmFsX3JlbG9jcyA9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5yZWxvY19zdHJlYW07Ci0gIC8qIFJldHVybiBzYXZlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVsb2NhdGlvbnMgaWYgaXQgaXMgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKHNlY3Rpb24tPnJlbG9jYXRpb24gIT0gKGFyZWxlbnQgKikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnRlcm5hbF9yZWxvY3MgPSAoYXJlbGVudCAqKSAKLSAgICBiZmRfemFsbG9jIChhYmZkLCAobnVtX3JlbG9jcyAqIHNpemVvZiAoYXJlbGVudCkpKTsKLSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSAoYXJlbGVudCAqKSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQcm9jZXNzIGFuZCBpbnRlcm5hbGl6ZSB0aGUgcmVsb2NhdGlvbnMuICAqLwotICBzb21fc2V0X3JlbG9jX2luZm8gKGV4dGVybmFsX3JlbG9jcywgZml4dXBfc3RyZWFtX3NpemUsCi0JCSAgICAgIGludGVybmFsX3JlbG9jcywgc2VjdGlvbiwgc3ltYm9scywgZmFsc2UpOwotCi0gIC8qIFdlJ3JlIGRvbmUgd2l0aCB0aGUgZXh0ZXJuYWwgcmVsb2NhdGlvbnMuICBGcmVlIHRoZW0uICAqLwotICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+cmVsb2Nfc3RyZWFtID0gTlVMTDsKLQotICAvKiBTYXZlIG91ciByZXN1bHRzIGFuZCByZXR1cm4gc3VjY2Vzcy4gICovCi0gIHNlY3Rpb24tPnJlbG9jYXRpb24gPSBpbnRlcm5hbF9yZWxvY3M7Ci0gIHJldHVybiAodHJ1ZSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSByZWxvY2F0aW9uCi0gICBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHNlY3Rpb24uICAqLyAKLQotc3RhdGljIGxvbmcKLXNvbV9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGFzZWN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgYXNlY3Q7Ci17Ci0gIC8qIElmIHNlY3Rpb24gaGFzIHJlbG9jYXRpb25zLCB0aGVuIHJlYWQgaW4gdGhlIHJlbG9jYXRpb24gc3RyZWFtCi0gICAgIGFuZCBwYXJzZSBpdCB0byBkZXRlcm1pbmUgaG93IG1hbnkgcmVsb2NhdGlvbnMgZXhpc3QuICAqLwotICBpZiAoYXNlY3QtPmZsYWdzICYgU0VDX1JFTE9DKQotICAgIHsKLSAgICAgIGlmICghIHNvbV9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgYXNlY3QsIE5VTEwsIHRydWUpKQotCXJldHVybiAtMTsKLSAgICAgIHJldHVybiAoYXNlY3QtPnJlbG9jX2NvdW50ICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci0gICAgfQotICAvKiBUaGVyZSBhcmUgbm8gcmVsb2NhdGlvbnMuICAqLwotICByZXR1cm4gMDsKLX0KLQotLyogQ29udmVydCByZWxvY2F0aW9ucyBmcm9tIFNPTSAoZXh0ZXJuYWwpIGZvcm0gaW50byBCRkQgaW50ZXJuYWwKLSAgIGZvcm0uICBSZXR1cm4gdGhlIG51bWJlciBvZiByZWxvY2F0aW9ucy4gICovCi0KLXN0YXRpYyBsb25nCi1zb21fY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwdHIsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBhcmVsZW50ICoqcmVscHRyOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSAgYXJlbGVudCAqdGJscHRyOwotICBpbnQgY291bnQ7Ci0KLSAgaWYgKHNvbV9zbHVycF9yZWxvY190YWJsZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgZmFsc2UpID09IGZhbHNlKQotICAgIHJldHVybiAtMTsKLQotICBjb3VudCA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICB0YmxwdHIgPSBzZWN0aW9uLT5yZWxvY2F0aW9uOwotCi0gIHdoaWxlIChjb3VudC0tKQotICAgICpyZWxwdHIrKyA9IHRibHB0cisrOwotCi0gICpyZWxwdHIgPSAoYXJlbGVudCAqKSBOVUxMOwotICByZXR1cm4gc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci19Ci0KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHNvbV92ZWM7Ci0KLS8qIEEgaG9vayB0byBzZXQgdXAgb2JqZWN0IGZpbGUgZGVwZW5kZW50IHNlY3Rpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX25ld19zZWN0aW9uX2hvb2sgKGFiZmQsIG5ld3NlY3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKm5ld3NlY3Q7Ci17Ci0gIG5ld3NlY3QtPnVzZWRfYnlfYmZkID0KLSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotICBpZiAoIW5ld3NlY3QtPnVzZWRfYnlfYmZkKQotICAgIHJldHVybiBmYWxzZTsKLSAgbmV3c2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gMzsKLQotICAvKiBXZSBhbGxvdyBtb3JlIHRoYW4gdGhyZWUgc2VjdGlvbnMgaW50ZXJuYWxseSAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29weSBhbnkgcHJpdmF0ZSBpbmZvIHdlIHVuZGVyc3RhbmQgZnJvbSB0aGUgaW5wdXQgc3ltYm9sCi0gICB0byB0aGUgb3V0cHV0IHN5bWJvbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bWJvbCwgb2JmZCwgb3N5bWJvbCkKLSAgICAgYmZkICppYmZkOwotICAgICBhc3ltYm9sICppc3ltYm9sOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKm9zeW1ib2w7Ci17Ci0gIHN0cnVjdCBzb21fc3ltYm9sICppbnB1dF9zeW1ib2wgPSAoc3RydWN0IHNvbV9zeW1ib2wgKikgaXN5bWJvbDsKLSAgc3RydWN0IHNvbV9zeW1ib2wgKm91dHB1dF9zeW1ib2wgPSAoc3RydWN0IHNvbV9zeW1ib2wgKikgb3N5bWJvbDsKLQotICAvKiBPbmUgZGF5IHdlIG1heSB0cnkgdG8gZ3JvayBvdGhlciBwcml2YXRlIGRhdGEuICAqLwotICBpZiAoaWJmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCBvYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFRoZSBvbmx5IHByaXZhdGUgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBjb3B5IGlzIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0gICAgIGJpdHMuICAqLwotICBvdXRwdXRfc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jID0KLSAgICBpbnB1dF9zeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2M7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IHNlY3Rpb24KLSAgIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChpYmZkLCBpc2VjdGlvbiwgb2JmZCwgb3NlY3Rpb24pCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYXNlY3Rpb24gKmlzZWN0aW9uOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjdGlvbjsKLXsKLSAgLyogT25lIGRheSB3ZSBtYXkgdHJ5IHRvIGdyb2sgb3RoZXIgcHJpdmF0ZSBkYXRhLiAgKi8KLSAgaWYgKGliZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cgotICAgICAgfHwgb2JmZC0+eHZlYy0+Zmxhdm91ciAhPSBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyCi0gICAgICB8fCAoIXNvbV9pc19zcGFjZSAoaXNlY3Rpb24pICYmICFzb21faXNfc3Vic3BhY2UgKGlzZWN0aW9uKSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEKLSAgICA9IChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgKikKLSAgICAgIGJmZF96YWxsb2MgKG9iZmQsIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtZW1jcHkgKHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLAotCSAgc29tX3NlY3Rpb25fZGF0YSAoaXNlY3Rpb24pLT5jb3B5X2RhdGEsCi0JICBzaXplb2YgKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCkpOwotCi0gIC8qIFJlcGFyZW50IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChvc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyKQotICAgIHNvbV9zZWN0aW9uX2RhdGEgKG9zZWN0aW9uKS0+Y29weV9kYXRhLT5jb250YWluZXIgPQotICAgICAgc29tX3NlY3Rpb25fZGF0YSAob3NlY3Rpb24pLT5jb3B5X2RhdGEtPmNvbnRhaW5lci0+b3V0cHV0X3NlY3Rpb247Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvcHkgYW55IHByaXZhdGUgaW5mbyB3ZSB1bmRlcnN0YW5kIGZyb20gdGhlIGlucHV0IGJmZAotICAgdG8gdGhlIG91dHB1dCBiZmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZCwgKm9iZmQ7Ci17Ci0gIC8qIE9uZSBkYXkgd2UgbWF5IHRyeSB0byBncm9rIG90aGVyIHByaXZhdGUgZGF0YS4gICovCi0gIGlmIChpYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIKLSAgICAgIHx8IG9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBbGxvY2F0ZSBzb21lIG1lbW9yeSB0byBob2xkIHRoZSBkYXRhIHdlIG5lZWQuICAqLwotICBvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCkgPSAoc3RydWN0IHNvbV9leGVjX2RhdGEgKikKLSAgICBiZmRfemFsbG9jIChvYmZkLCBzaXplb2YgKHN0cnVjdCBzb21fZXhlY19kYXRhKSk7Ci0gIGlmIChvYmpfc29tX2V4ZWNfZGF0YSAob2JmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTm93IGNvcHkgdGhlIGRhdGEuICAqLwotICBtZW1jcHkgKG9ial9zb21fZXhlY19kYXRhIChvYmZkKSwgb2JqX3NvbV9leGVjX2RhdGEgKGliZmQpLAotCSAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2V4ZWNfZGF0YSkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgYmFja2VuZCBpbmZvIGZvciBzZWN0aW9ucyB3aGljaCBjYW4gbm90IGJlIGRlc2NyaWJlZAotICAgaW4gdGhlIEJGRCBkYXRhIHN0cnVjdHVyZXMuICAqLwotCi1ib29sZWFuCi1iZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNlY3Rpb24sIGRlZmluZWQsIHByaXZhdGUsIHNvcnRfa2V5LCBzcG51bSkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGludCBkZWZpbmVkOwotICAgICBpbnQgcHJpdmF0ZTsKLSAgICAgdW5zaWduZWQgaW50IHNvcnRfa2V5OwotICAgICBpbnQgc3BudW07Ci17Ci0gIC8qIEFsbG9jYXRlIG1lbW9yeSB0byBob2xkIHRoZSBtYWdpYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YQotCT0gKHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgYmZkX3phbGxvYyAoc2VjdGlvbi0+b3duZXIsCi0JCSAgICAgIHNpemVvZiAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0KSk7Ci0gICAgICBpZiAoc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPnNvcnRfa2V5ID0gc29ydF9rZXk7Ci0gIHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEtPmlzX2RlZmluZWQgPSBkZWZpbmVkOwotICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhLT5pc19wcml2YXRlID0gcHJpdmF0ZTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0gc2VjdGlvbjsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c3BhY2VfbnVtYmVyID0gc3BudW07Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZXQgYmFja2VuZCBpbmZvIGZvciBzdWJzZWN0aW9ucyB3aGljaCBjYW4gbm90IGJlIGRlc2NyaWJlZCAKLSAgIGluIHRoZSBCRkQgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLQotYm9vbGVhbgotYmZkX3NvbV9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWN0aW9uLCBjb250YWluZXIsIGFjY2VzcywKLQkJCQkgICBzb3J0X2tleSwgcXVhZHJhbnQpCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBhc2VjdGlvbiAqY29udGFpbmVyOwotICAgICBpbnQgYWNjZXNzOwotICAgICB1bnNpZ25lZCBpbnQgc29ydF9rZXk7Ci0gICAgIGludCBxdWFkcmFudDsKLXsKLSAgLyogQWxsb2NhdGUgbWVtb3J5IHRvIGhvbGQgdGhlIG1hZ2ljIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5jb3B5X2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhCi0JPSAoc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0ICopCi0JICBiZmRfemFsbG9jIChzZWN0aW9uLT5vd25lciwKLQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc29tX2NvcHlhYmxlX3NlY3Rpb25fZGF0YV9zdHJ1Y3QpKTsKLSAgICAgIGlmIChzb21fc2VjdGlvbl9kYXRhIChzZWN0aW9uKS0+Y29weV9kYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+c29ydF9rZXkgPSBzb3J0X2tleTsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+YWNjZXNzX2NvbnRyb2xfYml0cyA9IGFjY2VzczsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+cXVhZHJhbnQgPSBxdWFkcmFudDsKLSAgc29tX3NlY3Rpb25fZGF0YSAoc2VjdGlvbiktPmNvcHlfZGF0YS0+Y29udGFpbmVyID0gY29udGFpbmVyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBmdWxsIFNPTSBzeW1ib2wgdHlwZS4gIFNPTSBuZWVkcyBmYXIgbW9yZSBzeW1ib2wgaW5mb3JtYXRpb24KLSAgIHRoYW4gYW55IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdCBJJ20gYXdhcmUgb2YuICBJdCBpcyBtYW5kYXRvcnkKLSAgIHRvIGJlIGFibGUgdG8ga25vdyBpZiBhIHN5bWJvbCBpcyBhbiBlbnRyeSBwb2ludCwgbWlsbGljb2RlLCBkYXRhLAotICAgY29kZSwgYWJzb2x1dGUsIHN0b3JhZ2UgcmVxdWVzdCwgb3IgcHJvY2VkdXJlIGxhYmVsLiAgSWYgeW91IGdldAotICAgdGhlIHN5bWJvbCB0eXBlIHdyb25nIHlvdXIgcHJvZ3JhbSB3aWxsIG5vdCBsaW5rLiAgKi8KLQotdm9pZAotYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUgKHN5bWJvbCwgdHlwZSkKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLXsKLSAgc29tX3N5bWJvbF9kYXRhIChzeW1ib2wpLT5zb21fdHlwZSA9IHR5cGU7Ci19Ci0KLS8qIEF0dGFjaCBhbiBhdXhpbGlhcnkgaGVhZGVyIHRvIHRoZSBCRkQgYmFja2VuZCBzbyB0aGF0IGl0IG1heSBiZQotICAgd3JpdHRlbiBpbnRvIHRoZSBvYmplY3QgZmlsZS4gICovCi1ib29sZWFuCi1iZmRfc29tX2F0dGFjaF9hdXhfaGRyIChhYmZkLCB0eXBlLCBzdHJpbmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHR5cGUgPT0gVkVSU0lPTl9BVVhfSUQpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgICAgIGludCBwYWQgPSAwOwotCi0gICAgICBpZiAobGVuICUgNCkKLQlwYWQgPSAoNCAtIChsZW4gJSA0KSk7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKSA9IChzdHJ1Y3QgdXNlcl9zdHJpbmdfYXV4X2hkciAqKQotCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGF1eF9pZCkKLQkJCSAgICAgICsgc2l6ZW9mICh1bnNpZ25lZCBpbnQpICsgbGVuICsgcGFkKTsKLSAgICAgIGlmICghb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPmhlYWRlcl9pZC50eXBlID0gVkVSU0lPTl9BVVhfSUQ7Ci0gICAgICBvYmpfc29tX3ZlcnNpb25faGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCA9IGxlbiArIHBhZDsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5oZWFkZXJfaWQubGVuZ3RoICs9IHNpemVvZiAoaW50KTsKLSAgICAgIG9ial9zb21fdmVyc2lvbl9oZHIgKGFiZmQpLT5zdHJpbmdfbGVuZ3RoID0gbGVuOwotICAgICAgc3RybmNweSAob2JqX3NvbV92ZXJzaW9uX2hkciAoYWJmZCktPnVzZXJfc3RyaW5nLCBzdHJpbmcsIGxlbik7Ci0gICAgfQotICBlbHNlIGlmICh0eXBlID09IENPUFlSSUdIVF9BVVhfSUQpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgICAgIGludCBwYWQgPSAwOwotCi0gICAgICBpZiAobGVuICUgNCkKLQlwYWQgPSAoNCAtIChsZW4gJSA0KSk7Ci0gICAgICBvYmpfc29tX2NvcHlyaWdodF9oZHIgKGFiZmQpID0gKHN0cnVjdCBjb3B5cmlnaHRfYXV4X2hkciAqKQotCWJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGF1eF9pZCkKLQkJCSAgICArIHNpemVvZiAodW5zaWduZWQgaW50KSArIGxlbiArIHBhZCk7Ci0gICAgICBpZiAoIW9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLnR5cGUgPSBDT1BZUklHSFRfQVVYX0lEOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+aGVhZGVyX2lkLmxlbmd0aCA9IGxlbiArIHBhZDsKLSAgICAgIG9ial9zb21fY29weXJpZ2h0X2hkciAoYWJmZCktPmhlYWRlcl9pZC5sZW5ndGggKz0gc2l6ZW9mIChpbnQpOwotICAgICAgb2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+c3RyaW5nX2xlbmd0aCA9IGxlbjsKLSAgICAgIHN0cmNweSAob2JqX3NvbV9jb3B5cmlnaHRfaGRyIChhYmZkKS0+Y29weXJpZ2h0LCBzdHJpbmcpOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEF0dGFjaCBhbiBjb21waWxhdGlvbiB1bml0IGhlYWRlciB0byB0aGUgQkZEIGJhY2tlbmQgc28gdGhhdCBpdCBtYXkgYmUKLSAgIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1ib29sZWFuCi1iZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0IChhYmZkLCBuYW1lLCBsYW5ndWFnZV9uYW1lLCBwcm9kdWN0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9pZCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZV9uYW1lOwotICAgICBjb25zdCBjaGFyICpwcm9kdWN0X2lkOwotICAgICBjb25zdCBjaGFyICp2ZXJzaW9uX2lkOwotewotICBDT01QVU5JVCAqbiA9IChDT01QVU5JVCAqKSBiZmRfemFsbG9jIChhYmZkLCBDT01QVU5JVFNaKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSNkZWZpbmUgU1RSRFVQKGYpIFwKLSAgaWYgKGYgIT0gTlVMTCkgXAotICAgIHsgXAotICAgICAgbi0+Zi5uX25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIHN0cmxlbiAoZikgKyAxKTsgXAotICAgICAgaWYgKG4tPmYubl9uYW1lID09IE5VTEwpIFwKLQlyZXR1cm4gZmFsc2U7IFwKLSAgICAgIHN0cmNweSAobi0+Zi5uX25hbWUsIGYpOyBcCi0gICAgfQotCi0gIFNUUkRVUCAobmFtZSk7Ci0gIFNUUkRVUCAobGFuZ3VhZ2VfbmFtZSk7Ci0gIFNUUkRVUCAocHJvZHVjdF9pZCk7Ci0gIFNUUkRVUCAodmVyc2lvbl9pZCk7Ci0KLSN1bmRlZiBTVFJEVVAKLQotICBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQgKGFiZmQpID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKGNvdW50ID09IDAgfHwgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApKQotICAgIHJldHVybiB0cnVlOwotICBpZiAoKGJmZF9zaXplX3R5cGUpKG9mZnNldCtjb3VudCkgPiBzZWN0aW9uLT5fcmF3X3NpemUKLSAgICAgIHx8IGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpKHNlY3Rpb24tPmZpbGVwb3MgKyBvZmZzZXQpLCBTRUVLX1NFVCkgPT0gLTEKLSAgICAgIHx8IGJmZF9yZWFkIChsb2NhdGlvbiwgKGJmZF9zaXplX3R5cGUpMSwgY291bnQsIGFiZmQpICE9IGNvdW50KQotICAgIHJldHVybiAoZmFsc2UpOyAvKiBvbiBlcnJvciAqLwotICByZXR1cm4gKHRydWUpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBTZXQgdXAgZml4ZWQgcGFydHMgb2YgdGhlIGZpbGUsIHNwYWNlLCBhbmQgc3Vic3BhY2UgaGVhZGVycy4KLQkgTm90aWZ5IHRoZSB3b3JsZCB0aGF0IG91dHB1dCBoYXMgYmVndW4uICAqLwotICAgICAgc29tX3ByZXBfaGVhZGVycyAoYWJmZCk7Ci0gICAgICBhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLSAgICAgIC8qIFN0YXJ0IHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLiAgVGhpcyBpbmNsdWRlIGFsbCB0aGUgc3RyaW5nCi0JIHRhYmxlcywgZml4dXAgc3RyZWFtcywgYW5kIG90aGVyIHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZS4gICovCi0gICAgICBzb21fYmVnaW5fd3JpdGluZyAoYWJmZCk7Ci0gICAgfQotCi0gIC8qIE9ubHkgd3JpdGUgc3Vic3BhY2VzIHdoaWNoIGhhdmUgInJlYWwiIGNvbnRlbnRzIChlZy4gdGhlIGNvbnRlbnRzCi0gICAgIGFyZSBub3QgZ2VuZXJhdGVkIGF0IHJ1biB0aW1lIGJ5IHRoZSBPUykuICAqLwotICBpZiAoIXNvbV9pc19zdWJzcGFjZSAoc2VjdGlvbikKLSAgICAgIHx8ICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBTZWVrIHRvIHRoZSBwcm9wZXIgb2Zmc2V0IHdpdGhpbiB0aGUgb2JqZWN0IGZpbGUgYW5kIHdyaXRlIHRoZQotICAgICBkYXRhLiAgKi8KLSAgb2Zmc2V0ICs9IHNvbV9zZWN0aW9uX2RhdGEgKHNlY3Rpb24pLT5zdWJzcGFjZV9kaWN0LT5maWxlX2xvY19pbml0X3ZhbHVlOyAKLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgbG9jYXRpb24sIDEsIGNvdW50LCBhYmZkKSAhPSBjb3VudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc29tX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLXsKLSAgLyogQWxsb3cgYW55IGFyY2hpdGVjdHVyZSB0byBiZSBzdXBwb3J0ZWQgYnkgdGhlIFNPTSBiYWNrZW5kICovCi0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoaW5lKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjdGlvbiwgc3ltYm9scywgb2Zmc2V0LCBmaWxlbmFtZV9wdHIsCi0JCQlmdW5jdGlvbm5hbWVfcHRyLCBsaW5lX3B0cikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGJmZF92bWEgb2Zmc2V0OwotICAgICBDT05TVCBjaGFyICoqZmlsZW5hbWVfcHRyOwotICAgICBDT05TVCBjaGFyICoqZnVuY3Rpb25uYW1lX3B0cjsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lX3B0cjsKLXsKLSAgcmV0dXJuIChmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNvbV9zaXplb2ZfaGVhZGVycyAoYWJmZCwgcmVsb2MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiByZWxvYzsKLXsKLSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJzb21fc2l6ZW9mX2hlYWRlcnMgdW5pbXBsZW1lbnRlZCIpKTsKLSAgZmZsdXNoIChzdGRlcnIpOwotICBhYm9ydCAoKTsKLSAgcmV0dXJuICgwKTsKLX0KLQotLyogUmV0dXJuIHRoZSBzaW5nbGUtY2hhcmFjdGVyIHN5bWJvbCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8KLSAgIFNPTSBzZWN0aW9uIFMsIG9yICc/JyBmb3IgYW4gdW5rbm93biBTT00gc2VjdGlvbi4gICovCi0KLXN0YXRpYyBjaGFyCi1zb21fc2VjdGlvbl90eXBlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlICp0OwotCi0gIGZvciAodCA9ICZzdHRbMF07IHQtPnNlY3Rpb247IHQrKykKLSAgICBpZiAoIXN0cmNtcCAocywgdC0+c2VjdGlvbikpCi0gICAgICByZXR1cm4gdC0+dHlwZTsKLSAgcmV0dXJuICc/JzsKLX0KLQotc3RhdGljIGludAotc29tX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIGNoYXIgYzsKLQotICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnQyc7Ci0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdVJzsKLSAgaWYgKGJmZF9pc19pbmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ0knOwotICBpZiAoIShzeW1ib2wtPmZsYWdzICYgKEJTRl9HTE9CQUx8QlNGX0xPQ0FMKSkpCi0gICAgcmV0dXJuICc/JzsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pCi0gICAgICB8fCAoc29tX3N5bWJvbF9kYXRhIChzeW1ib2wpICE9IE5VTEwKLQkgICYmIHNvbV9zeW1ib2xfZGF0YSAoc3ltYm9sKS0+c29tX3R5cGUgPT0gU1lNQk9MX1RZUEVfQUJTT0xVVEUpKQotICAgIGMgPSAnYSc7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKLSAgICBjID0gc29tX3NlY3Rpb25fdHlwZSAoc3ltYm9sLT5zZWN0aW9uLT5uYW1lKTsKLSAgZWxzZQotICAgIHJldHVybiAnPyc7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX0dMT0JBTCkKLSAgICBjID0gdG91cHBlciAoYyk7Ci0gIHJldHVybiBjOwotfQotCi0vKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgU09NIHN5bWJvbCBTWU1CT0wgaW4gUkVULiAgKi8KLQotc3RhdGljIHZvaWQKLXNvbV9nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICByZXQtPnR5cGUgPSBzb21fZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpOwotICBpZiAocmV0LT50eXBlICE9ICdVJykKLSAgICByZXQtPnZhbHVlID0gc3ltYm9sLT52YWx1ZStzeW1ib2wtPnNlY3Rpb24tPnZtYTsKLSAgZWxzZQotICAgIHJldC0+dmFsdWUgPSAwOwotICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Ci19Ci0KLS8qIENvdW50IHRoZSBudW1iZXIgb2Ygc3ltYm9scyBpbiB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBOZWNlc3NhcnkKLSAgIHNvIHRoYXQgd2UgY2FuIGFsbG9jYXRlIHNwYWNlIGZvciBhbGwgdGhlIGNhcnN5bXMgYXQgb25jZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2NvdW50X2FyX3N5bWJvbHMgKGFiZmQsIGxzdF9oZWFkZXIsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBsc3RfaGVhZGVyICpsc3RfaGVhZGVyOwotICAgICBzeW1pbmRleCAqY291bnQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBmaWxlX3B0ciBsc3RfZmlsZXBvcyA9IGJmZF90ZWxsIChhYmZkKSAtIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCi0gIGhhc2hfdGFibGUgPSAKLSAgICAodW5zaWduZWQgaW50ICopIGJmZF9tYWxsb2MgKGxzdF9oZWFkZXItPmhhc2hfc2l6ZQotCQkJCSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0X2hlYWRlci0+aGFzaF9zaXplICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogRG9uJ3QgZm9yZ2V0IHRvIGluaXRpYWxpemUgdGhlIGNvdW50ZXIhICAqLwotICAqY291bnQgPSAwOwotCi0gIC8qIFJlYWQgaW4gdGhlIGhhc2ggdGFibGUuICBUaGUgaGFzIHRhYmxlIGlzIGFuIGFycmF5IG9mIDMyYml0IGZpbGUgb2Zmc2V0cwotICAgICB3aGljaCBwb2ludCB0byB0aGUgaGFzaCBjaGFpbnMuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpIGhhc2hfdGFibGUsIGxzdF9oZWFkZXItPmhhc2hfc2l6ZSwgNCwgYWJmZCkKLSAgICAgICE9IGxzdF9oZWFkZXItPmhhc2hfc2l6ZSAqIDQpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV2FsayBlYWNoIGNoYWluIGNvdW50aW5nIHRoZSBudW1iZXIgb2Ygc3ltYm9scyBmb3VuZCBvbiB0aGF0IHBhcnRpY3VsYXIKLSAgICAgY2hhaW4uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbHN0X2hlYWRlci0+aGFzaF9zaXplOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkIGxzdF9zeW1ib2w7Ci0KLSAgICAgIC8qIEFuIGVtcHR5IGNoYWluIGhhcyB6ZXJvIGFzIGl0J3MgZmlsZSBvZmZzZXQuICAqLwotICAgICAgaWYgKGhhc2hfdGFibGVbaV0gPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2VlayB0byB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoaXMgaGFzaCBjaGFpbi4gICovCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgaGFzaF90YWJsZVtpXSwgU0VFS19TRVQpIDwgMCkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogUmVhZCBpbiB0aGlzIHN5bWJvbCBhbmQgdXBkYXRlIHRoZSBjb3VudGVyLiAgKi8KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgKCpjb3VudCkrKzsKLQotICAgICAgLyogTm93IGl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgc3ltYm9scyBvbiB0aGlzIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChsc3Rfc3ltYm9sLm5leHRfZW50cnkpCi0JewotCi0JICAvKiBTZWVrIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBpZiAoYmZkX3NlZWsgKGFiZmQsIGxzdF9maWxlcG9zICsgbHN0X3N5bWJvbC5uZXh0X2VudHJ5LCBTRUVLX1NFVCkKLQkgICAgICA8IDApCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAvKiBSZWFkIHRoZSBzeW1ib2wgaW4gYW5kIHVwZGF0ZSB0aGUgY291bnRlci4gICovCi0JICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X3N5bWJvbCwgMSwgc2l6ZW9mIChsc3Rfc3ltYm9sKSwgYWJmZCkKLQkgICAgICAhPSBzaXplb2YgKGxzdF9zeW1ib2wpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgKCpjb3VudCkrKzsKLQl9Ci0gICAgfQotICBpZiAoaGFzaF90YWJsZSAhPSBOVUxMKQotICAgIGZyZWUgKGhhc2hfdGFibGUpOwotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGhhc2hfdGFibGUgIT0gTlVMTCkKLSAgICBmcmVlIChoYXNoX3RhYmxlKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBGaWxsIGluIHRoZSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzIChTWU1TKSBmcm9tIHRoZSBhcmNoaXZlIGRlc2NyaWJlZAotICAgYnkgQUJGRCBhbmQgTFNUX0hFQURFUi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2ZpbGxfaW5fYXJfc3ltYm9scyAoYWJmZCwgbHN0X2hlYWRlciwgc3ltcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgbHN0X2hlYWRlciAqbHN0X2hlYWRlcjsKLSAgICAgY2Fyc3ltICoqc3ltczsKLXsKLSAgdW5zaWduZWQgaW50IGksIGxlbjsKLSAgY2Fyc3ltICpzZXQgPSBzeW1zWzBdOwotICB1bnNpZ25lZCBpbnQgKmhhc2hfdGFibGUgPSBOVUxMOwotICBzdHJ1Y3Qgc29tX2VudHJ5ICpzb21fZGljdCA9IE5VTEw7Ci0gIGZpbGVfcHRyIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgaGFzaF90YWJsZSA9IAotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+aGFzaF9zaXplCi0JCQkJICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKTsKLSAgaWYgKGhhc2hfdGFibGUgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5oYXNoX3NpemUgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBzb21fZGljdCA9Ci0gICAgKHN0cnVjdCBzb21fZW50cnkgKikgYmZkX21hbGxvYyAobHN0X2hlYWRlci0+bW9kdWxlX2NvdW50Ci0JCQkJICAgICAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkpOwotICBpZiAoc29tX2RpY3QgPT0gTlVMTCAmJiBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBSZWFkIGluIHRoZSBoYXNoIHRhYmxlLiAgVGhlIGhhcyB0YWJsZSBpcyBhbiBhcnJheSBvZiAzMmJpdCBmaWxlIG9mZnNldHMKLSAgICAgd2hpY2ggcG9pbnQgdG8gdGhlIGhhc2ggY2hhaW5zLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSBoYXNoX3RhYmxlLCBsc3RfaGVhZGVyLT5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5oYXNoX3NpemUgKiA0KQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFNlZWsgdG8gYW5kIHJlYWQgaW4gdGhlIFNPTSBkaWN0aW9uYXJ5LiAgV2Ugd2lsbCBuZWVkIHRoaXMgdG8gZmlsbAotICAgICBpbiB0aGUgY2Fyc3ltJ3MgZmlsZXBvcyBmaWVsZC4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgbHN0X2ZpbGVwb3MgKyBsc3RfaGVhZGVyLT5kaXJfbG9jLCBTRUVLX1NFVCkgPCAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChiZmRfcmVhZCAoKFBUUikgc29tX2RpY3QsIGxzdF9oZWFkZXItPm1vZHVsZV9jb3VudCwgCi0JCXNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSksIGFiZmQpCi0gICAgICAhPSBsc3RfaGVhZGVyLT5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdhbGsgZWFjaCBjaGFpbiBmaWxsaW5nIGluIHRoZSBjYXJzeW1zIGFzIHdlIGdvIGFsb25nLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGxzdF9oZWFkZXItPmhhc2hfc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCBsc3Rfc3ltYm9sOwotCi0gICAgICAvKiBBbiBlbXB0eSBjaGFpbiBoYXMgemVybyBhcyBpdCdzIGZpbGUgb2Zmc2V0LiAgKi8KLSAgICAgIGlmIChoYXNoX3RhYmxlW2ldID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZWsgdG8gYW5kIHJlYWQgdGhlIGZpcnN0IHN5bWJvbCBvbiB0aGUgY2hhaW4uICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGhhc2hfdGFibGVbaV0sIFNFRUtfU0VUKSA8IDApCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoKFBUUikgJiBsc3Rfc3ltYm9sLCAxLCBzaXplb2YgKGxzdF9zeW1ib2wpLCBhYmZkKQotCSAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgLyogR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wsIGZpcnN0IGdldCB0aGUgbGVuZ3RoIHdoaWNoIGlzIHN0b3JlZAotCSBhcyBhIDMyYml0IGludGVnZXIganVzdCBiZWZvcmUgdGhlIHN5bWJvbC4KLQotCSBPbmUgbWlnaHQgYXNrIHdoeSB3ZSBkb24ndCBqdXN0IHJlYWQgaW4gdGhlIGVudGlyZSBzdHJpbmcgdGFibGUKLQkgYW5kIGluZGV4IGludG8gaXQuICBXZWxsLCBhY2NvcmRpbmcgdG8gdGhlIFNPTSBBQkkgdGhlIHN0cmluZwotCSBpbmRleCBjYW4gcG9pbnQgKmFueXdoZXJlKiBpbiB0aGUgYXJjaGl2ZSB0byBzYXZlIHNwYWNlLCBzbyBqdXN0Ci0JIHVzaW5nIHRoZSBzdHJpbmcgdGFibGUgd291bGQgbm90IGJlIHNhZmUuICAqLwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPnN0cmluZ19sb2MKLQkJCSAgICArIGxzdF9zeW1ib2wubmFtZS5uX3N0cnggLSA0LCBTRUVLX1NFVCkgPCAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBpZiAoYmZkX3JlYWQgKCZsZW4sIDEsIDQsIGFiZmQpICE9IDQpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZSBhbmQgbnVsbCB0ZXJtaW5hdGUgaXQgdG9vLiAgKi8KLSAgICAgIHNldC0+bmFtZSA9IGJmZF96YWxsb2MgKGFiZmQsIGxlbiArIDEpOwotICAgICAgaWYgKCFzZXQtPm5hbWUpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoYmZkX3JlYWQgKHNldC0+bmFtZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgICAgIHNldC0+bmFtZVtsZW5dID0gMDsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZmlsZSBvZmZzZXQuICBOb3RlIHRoYXQgdGhlICJsb2NhdGlvbiIgZmllbGQgcG9pbnRzCi0JIHRvIHRoZSBTT00gaXRzZWxmLCBub3QgdGhlIGFyX2hkciBpbiBmcm9udCBvZiBpdC4gICovCi0gICAgICBzZXQtPmZpbGVfb2Zmc2V0ID0gc29tX2RpY3RbbHN0X3N5bWJvbC5zb21faW5kZXhdLmxvY2F0aW9uCi0JCQkgIC0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLQotICAgICAgLyogR28gdG8gdGhlIG5leHQgc3ltYm9sLiAgKi8KLSAgICAgIHNldCsrOwotCi0gICAgICAvKiBJdGVyYXRlIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChsc3Rfc3ltYm9sLm5leHRfZW50cnkpCi0JewotCSAgLyogU2VlayB0byB0aGUgbmV4dCBzeW1ib2wgYW5kIHJlYWQgaXQgaW4uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9zeW1ib2wubmV4dF9lbnRyeSwgU0VFS19TRVQpIDwwKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmIGxzdF9zeW1ib2wsIDEsIHNpemVvZiAobHN0X3N5bWJvbCksIGFiZmQpCi0JICAgICAgIT0gc2l6ZW9mIChsc3Rfc3ltYm9sKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIFNlZWsgdG8gdGhlIG5hbWUgbGVuZ3RoICYgc3RyaW5nIGFuZCByZWFkIHRoZW0gaW4uICAqLwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBsc3RfZmlsZXBvcyArIGxzdF9oZWFkZXItPnN0cmluZ19sb2MgCi0JCQkJKyBsc3Rfc3ltYm9sLm5hbWUubl9zdHJ4IC0gNCwgU0VFS19TRVQpIDwgMCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIGlmIChiZmRfcmVhZCAoJmxlbiwgMSwgNCwgYWJmZCkgIT0gNCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmFtZSBhbmQgbnVsbCB0ZXJtaW5hdGUgaXQgdG9vLiAgKi8KLQkgIHNldC0+bmFtZSA9IGJmZF96YWxsb2MgKGFiZmQsIGxlbiArIDEpOwotCSAgaWYgKCFzZXQtPm5hbWUpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBpZiAoYmZkX3JlYWQgKHNldC0+bmFtZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgc2V0LT5uYW1lW2xlbl0gPSAwOwotCi0JICAvKiBGaWxsIGluIHRoZSBmaWxlIG9mZnNldC4gIE5vdGUgdGhhdCB0aGUgImxvY2F0aW9uIiBmaWVsZCBwb2ludHMKLQkgICAgIHRvIHRoZSBTT00gaXRzZWxmLCBub3QgdGhlIGFyX2hkciBpbiBmcm9udCBvZiBpdC4gICovCi0JICBzZXQtPmZpbGVfb2Zmc2V0ID0gc29tX2RpY3RbbHN0X3N5bWJvbC5zb21faW5kZXhdLmxvY2F0aW9uCi0JCQkgICAgICAgLSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpOwotCi0JICAvKiBHbyBvbiB0byB0aGUgbmV4dCBzeW1ib2wuICAqLwotCSAgc2V0Kys7Ci0JfQotICAgIH0KLSAgLyogSWYgd2UgaGF2ZW4ndCBkaWVkIGJ5IG5vdywgdGhlbiB3ZSBzdWNjZXNzZnVsbHkgcmVhZCB0aGUgZW50aXJlIAotICAgICBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWFkIGluIHRoZSBMU1QgZnJvbSB0aGUgYXJjaGl2ZS4gICovCi1zdGF0aWMgYm9vbGVhbgotc29tX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBsc3RfaGVhZGVyIGxzdF9oZWFkZXI7Ci0gIHN0cnVjdCBhcl9oZHIgYXJfaGVhZGVyOwotICB1bnNpZ25lZCBpbnQgcGFyc2VkX3NpemU7Ci0gIHN0cnVjdCBhcnRkYXRhICphcmRhdGEgPSBiZmRfYXJkYXRhIChhYmZkKTsKLSAgY2hhciBuZXh0bmFtZVsxN107Ci0gIGludCBpID0gYmZkX3JlYWQgKChQVFIpIG5leHRuYW1lLCAxLCAxNiwgYWJmZCk7Ci0KLSAgLyogU3BlY2lhbCBjYXNlcy4gICovCi0gIGlmIChpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0gIGlmIChpICE9IDE2KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgLSAxNiwgU0VFS19DVVIpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogRm9yIGFyY2hpdmVzIHdpdGhvdXQgLm8gZmlsZXMgdGhlcmUgaXMgbm8gc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHN0cm5jbXAgKG5leHRuYW1lLCAiLyAgICAgICAgICAgICAgICIsIDE2KSkKLSAgICB7Ci0gICAgICBiZmRfaGFzX21hcCAoYWJmZCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBSZWFkIGluIGFuZCBzYW5pdHkgY2hlY2sgdGhlIGFyY2hpdmUgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF9yZWFkICgoUFRSKSAmYXJfaGVhZGVyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBhYmZkKQotICAgICAgIT0gc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN0cm5jbXAgKGFyX2hlYWRlci5hcl9mbWFnLCBBUkZNQUcsIDIpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9tYWxmb3JtZWRfYXJjaGl2ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEhvdyBiaWcgaXMgdGhlIGFyY2hpdmUgc3ltYm9sIHRhYmxlIGVudHJ5PyAgKi8KLSAgZXJybm8gPSAwOwotICBwYXJzZWRfc2l6ZSA9IHN0cnRvbCAoYXJfaGVhZGVyLmFyX3NpemUsIE5VTEwsIDEwKTsKLSAgaWYgKGVycm5vICE9IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX21hbGZvcm1lZF9hcmNoaXZlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU2F2ZSBvZmYgdGhlIGZpbGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCByZWFsIHVzZXIgZGF0YS4gICovCi0gIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpICsgcGFyc2VkX3NpemU7Ci0KLSAgLyogUmVhZCBpbiB0aGUgbGlicmFyeSBzeW1ib2wgdGFibGUuICBXZSdsbCBtYWtlIGhlYXZ5IHVzZSBvZiB0aGlzCi0gICAgIGluIGp1c3QgYSBtaW51dGUuICAqLwotICBpZiAoYmZkX3JlYWQgKChQVFIpICYgbHN0X2hlYWRlciwgMSwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogU2FuaXR5IGNoZWNrLiAgKi8KLSAgaWYgKGxzdF9oZWFkZXIuYV9tYWdpYyAhPSBMSUJNQUdJQykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfbWFsZm9ybWVkX2FyY2hpdmUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKHNvbV9iZmRfY291bnRfYXJfc3ltYm9scyAoYWJmZCwgJmxzdF9oZWFkZXIsICZhcmRhdGEtPnN5bWRlZl9jb3VudCkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGxpYnJhcnkgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCBhcmRhdGEtPmZpcnN0X2ZpbGVfZmlsZXBvcyAtIHBhcnNlZF9zaXplIAotCQkJKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSwgU0VFS19TRVQpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSW5pdGlhbGl6YWUgdGhlIGNhY2hlIGFuZCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGxpYnJhcnkgc3ltYm9scy4gICovCi0gIGFyZGF0YS0+Y2FjaGUgPSAwOwotICBhcmRhdGEtPnN5bWRlZnMgPSAoY2Fyc3ltICopIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkJICAoYXJkYXRhLT5zeW1kZWZfY291bnQKLQkJCQkJICAgKiBzaXplb2YgKGNhcnN5bSkpKTsKLSAgaWYgKCFhcmRhdGEtPnN5bWRlZnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyBmaWxsIGluIHRoZSBjYW5vbmljYWwgYXJjaGl2ZSBzeW1ib2xzLiAgKi8KLSAgaWYgKHNvbV9iZmRfZmlsbF9pbl9hcl9zeW1ib2xzIChhYmZkLCAmbHN0X2hlYWRlciwgJmFyZGF0YS0+c3ltZGVmcykKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTZWVrIGJhY2sgdG8gdGhlICJmaXJzdCIgZmlsZSBpbiB0aGUgYXJjaGl2ZS4gIE5vdGUgdGhlICJmaXJzdCIKLSAgICAgZmlsZSBtYXkgYmUgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIGFyZGF0YS0+Zmlyc3RfZmlsZV9maWxlcG9zLCBTRUVLX1NFVCkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3RpZnkgdGhlIGdlbmVyaWMgYXJjaGl2ZSBjb2RlIHRoYXQgd2UgaGF2ZSBhIHN5bWJvbCBtYXAuICAqLwotICBiZmRfaGFzX21hcCAoYWJmZCkgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQmVnaW4gcHJlcGFyaW5nIHRvIHdyaXRlIGEgU09NIGxpYnJhcnkgc3ltYm9sIHRhYmxlLgotCi0gICBBcyBwYXJ0IG9mIHRoZSBwcmVwIHdvcmsgd2UgbmVlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzeW1ib2xzCi0gICBhbmQgdGhlIHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgc3RyaW5nIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSAoYWJmZCwgbnVtX3N5bXMsIHN0cmluZ3NpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50ICpudW1fc3ltcywgKnN0cmluZ3NpemU7Ci17Ci0gIGJmZCAqY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0KLSAgLyogU29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gICpudW1fc3ltcyA9IDA7Ci0gICpzdHJpbmdzaXplID0gMDsKLQotICAvKiBJdGVyYXRlIG92ZXIgZWFjaCBCRkQgd2l0aGluIHRoaXMgYXJjaGl2ZS4gICovCi0gIHdoaWxlIChjdXJyX2JmZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjdXJyX2NvdW50LCBpOwotICAgICAgc29tX3N5bWJvbF90eXBlICpzeW07Ci0KLSAgICAgIC8qIERvbid0IGJvdGhlciBmb3Igbm9uLVNPTSBvYmplY3RzLiAgKi8KLSAgICAgIGlmIChjdXJyX2JmZC0+Zm9ybWF0ICE9IGJmZF9vYmplY3QKLQkgIHx8IGN1cnJfYmZkLT54dmVjLT5mbGF2b3VyICE9IGJmZF90YXJnZXRfc29tX2ZsYXZvdXIpCi0JewotCSAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTWFrZSBzdXJlIHRoZSBzeW1ib2wgdGFibGUgaGFzIGJlZW4gcmVhZCwgdGhlbiBzbmFnIGEgcG9pbnRlcgotCSB0byBpdC4gIEl0J3MgYSBsaXR0bGUgc2xpbWV5IHRvIGdyYWIgdGhlIHN5bWJvbHMgdmlhIG9ial9zb21fc3ltdGFiLAotCSBidXQgZG9pbmcgc28gYXZvaWRzIGFsbG9jYXRpbmcgbG90cyBvZiBleHRyYSBtZW1vcnkuICAqLwotICAgICAgaWYgKHNvbV9zbHVycF9zeW1ib2xfdGFibGUgKGN1cnJfYmZkKSA9PSBmYWxzZSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHN5bSA9IG9ial9zb21fc3ltdGFiIChjdXJyX2JmZCk7Ci0gICAgICBjdXJyX2NvdW50ID0gYmZkX2dldF9zeW1jb3VudCAoY3Vycl9iZmQpOwotCi0gICAgICAvKiBFeGFtaW5lIGVhY2ggc3ltYm9sIHRvIGRldGVybWluZSBpZiBpdCBiZWxvbmdzIGluIHRoZQotCSBsaWJyYXJ5IHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY3Vycl9jb3VudDsgaSsrLCBzeW0rKykKLQl7Ci0JICBzdHJ1Y3Qgc29tX21pc2Nfc3ltYm9sX2luZm8gaW5mbzsKLQotCSAgLyogRGVyaXZlIFNPTSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgc3ltYm9sLiAgKi8KLQkgIHNvbV9iZmRfZGVyaXZlX21pc2Nfc3ltYm9sX2luZm8gKGN1cnJfYmZkLCAmc3ltLT5zeW1ib2wsICZpbmZvKTsKLQotCSAgLyogU2hvdWxkIHdlIGluY2x1ZGUgdGhpcyBzeW1ib2w/ICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfTlVMTAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfU1lNX0VYVAotCSAgICAgIHx8IGluZm8uc3ltYm9sX3R5cGUgPT0gU1RfQVJHX0VYVCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIE9ubHkgZ2xvYmFsIHN5bWJvbHMgYW5kIHVuc2F0aXNmaWVkIGNvbW1vbnMuICAqLwotCSAgaWYgKGluZm8uc3ltYm9sX3Njb3BlICE9IFNTX1VOSVZFUlNBTAotCSAgICAgICYmIGluZm8uc3ltYm9sX3R5cGUgIT0gU1RfU1RPUkFHRSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIERvIG5vIGluY2x1ZGUgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbikpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBCdW1wIHRoZSB2YXJpb3VzIGNvdW50ZXJzLCBiZWluZyBjYXJlZnVsIHRvIGhvbm9yCi0JICAgICBhbGlnbm1lbnQgY29uc2lkZXJhdGlvbnMgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICAoKm51bV9zeW1zKSsrOwotCSAgKnN0cmluZ3NpemUgPSAqc3RyaW5nc2l6ZSArIHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgKyA1OwotCSAgd2hpbGUgKCpzdHJpbmdzaXplICUgNCkKLQkgICAgKCpzdHJpbmdzaXplKSsrOwotCX0KLQotICAgICAgY3Vycl9iZmQgPSBjdXJyX2JmZC0+bmV4dDsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYXNoIGEgc3ltYm9sIG5hbWUgYmFzZWQgb24gdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHByZXNlbnRlZCBpbiB0aGUKLSAgIFNPTSBBQkkuICAqLwotc3RhdGljIHVuc2lnbmVkIGludAotc29tX2JmZF9hcl9zeW1ib2xfaGFzaCAoc3ltYm9sKQotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4gKHN5bWJvbC0+bmFtZSk7Ci0KLSAgLyogTmFtZXMgd2l0aCBsZW5ndGggMSBhcmUgc3BlY2lhbC4gICovCi0gIGlmIChsZW4gPT0gMSkKLSAgICByZXR1cm4gMHgxMDAwMTAwIHwgKHN5bWJvbC0+bmFtZVswXSA8PCAxNikgfCBzeW1ib2wtPm5hbWVbMF07Ci0KLSAgcmV0dXJuICgobGVuICYgMHg3ZikgPDwgMjQpIHwgKHN5bWJvbC0+bmFtZVsxXSA8PCAxNikKLQkgIHwgKHN5bWJvbC0+bmFtZVtsZW4tMl0gPDwgOCkgfCBzeW1ib2wtPm5hbWVbbGVuLTFdOwotfQotCi0vKiBEbyB0aGUgYnVsayBvZiB0aGUgd29yayByZXF1aXJlZCB0byB3cml0ZSB0aGUgU09NIGxpYnJhcnkKLSAgIHN5bWJvbCB0YWJsZS4gICovCi0gICAKLXN0YXRpYyBib29sZWFuCi1zb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiAoYWJmZCwgbnN5bXMsIHN0cmluZ19zaXplLCBsc3QsIGVsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IG5zeW1zLCBzdHJpbmdfc2l6ZTsKLSAgICAgc3RydWN0IGxzdF9oZWFkZXIgbHN0OwotICAgICB1bnNpZ25lZCBlbGVuZ3RoOwotewotICBmaWxlX3B0ciBsc3RfZmlsZXBvczsKLSAgY2hhciAqc3RyaW5ncyA9IE5VTEwsICpwOwotICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKmxzdF9zeW1zID0gTlVMTCwgKmN1cnJfbHN0X3N5bTsKLSAgYmZkICpjdXJyX2JmZDsKLSAgdW5zaWduZWQgaW50ICpoYXNoX3RhYmxlID0gTlVMTDsKLSAgc3RydWN0IHNvbV9lbnRyeSAqc29tX2RpY3QgPSBOVUxMOwotICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKipsYXN0X2hhc2hfZW50cnkgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgY3Vycl9zb21fb2Zmc2V0LCBzb21faW5kZXggPSAwOwotCi0gIGhhc2hfdGFibGUgPQotICAgICh1bnNpZ25lZCBpbnQgKikgYmZkX21hbGxvYyAobHN0Lmhhc2hfc2l6ZSAqIHNpemVvZiAodW5zaWduZWQgaW50KSk7Ci0gIGlmIChoYXNoX3RhYmxlID09IE5VTEwgJiYgbHN0Lmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotICBzb21fZGljdCA9Ci0gICAgKHN0cnVjdCBzb21fZW50cnkgKikgYmZkX21hbGxvYyAobHN0Lm1vZHVsZV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKTsKLSAgaWYgKHNvbV9kaWN0ID09IE5VTEwgJiYgbHN0Lm1vZHVsZV9jb3VudCAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGxhc3RfaGFzaF9lbnRyeSA9Ci0gICAgKChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKiopCi0gICAgIGJmZF9tYWxsb2MgKGxzdC5oYXNoX3NpemUgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCAqKSkpOwotICBpZiAobGFzdF9oYXNoX2VudHJ5ID09IE5VTEwgJiYgbHN0Lmhhc2hfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvdHMgb2YgZmllbGRzIGFyZSBmaWxlIHBvc2l0aW9ucyByZWxhdGl2ZSB0byB0aGUgc3RhcnQKLSAgICAgb2YgdGhlIGxzdCByZWNvcmQuICBTbyBzYXZlIGl0cyBsb2NhdGlvbi4gICovCi0gIGxzdF9maWxlcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlcik7Ci0KLSAgLyogU29tZSBpbml0aWFsaXphdGlvbi4gICovCi0gIG1lbXNldCAoaGFzaF90YWJsZSwgMCwgNCAqIGxzdC5oYXNoX3NpemUpOwotICBtZW1zZXQgKHNvbV9kaWN0LCAwLCBsc3QubW9kdWxlX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSk7Ci0gIG1lbXNldCAobGFzdF9oYXNoX2VudHJ5LCAwLCAJCi0JICBsc3QuaGFzaF9zaXplICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKikpOwotCi0gIC8qIFN5bWJvbHMgaGF2ZSBzb21faW5kZXggZmllbGRzLCBzbyB3ZSBoYXZlIHRvIGtlZXAgdHJhY2sgb2YgdGhlCi0gICAgIGluZGV4IG9mIGVhY2ggU09NIGluIHRoZSBhcmNoaXZlLgotCi0gICAgIFRoZSBTT00gZGljdGlvbmFyeSBoYXMgKGFtb25nIG90aGVyIHRoaW5ncykgdGhlIGFic29sdXRlIGZpbGUKLSAgICAgcG9zaXRpb24gZm9yIHRoZSBTT00gd2hpY2ggYSBwYXJ0aWN1bGFyIGRpY3Rpb25hcnkgZW50cnkKLSAgICAgZGVzY3JpYmVzLiAgV2UgaGF2ZSB0byBjb21wdXRlIHRoYXQgaW5mb3JtYXRpb24gYXMgd2UgaXRlcmF0ZQotICAgICB0aHJvdWdoIHRoZSBTT01zL3N5bWJvbHMuICAqLwotICBzb21faW5kZXggPSAwOwotCi0gIC8qIFdlIGFkZCBpbiB0aGUgc2l6ZSBvZiB0aGUgYXJjaGl2ZSBoZWFkZXIgdHdpY2UgYXMgdGhlIGxvY2F0aW9uCi0gICAgIGluIHRoZSBTT00gZGljdGlvbmFyeSBpcyB0aGUgYWN0dWFsIG9mZnNldCBvZiB0aGUgU09NLCBub3QgdGhlCi0gICAgIGFyY2hpdmUgaGVhZGVyIGJlZm9yZSB0aGUgU09NLiAgKi8KLSAgY3Vycl9zb21fb2Zmc2V0ID0gOCArIDIgKiBzaXplb2YgKHN0cnVjdCBhcl9oZHIpICsgbHN0LmZpbGVfZW5kOwotCi0gIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGFyY2hpdmUgaGVhZGVyIGFuZCB0aGUgY29udGVudHMgb2YgdGhlCi0gICAgIGV4dGVuZGVkIHN0cmluZyB0YWJsZS4gIE5vdGUgdGhhdCBlbGVuZ3RoIGluY2x1ZGVzIHRoZSBzaXplCi0gICAgIG9mIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhlIGV4dGVuZGVkIG5hbWUgdGFibGUhICAqLwotICBpZiAoZWxlbmd0aCkKLSAgICBjdXJyX3NvbV9vZmZzZXQgKz0gZWxlbmd0aDsKLQotICAvKiBNYWtlIHN1cmUgd2UncmUgcHJvcGVybHkgYWxpZ25lZC4gICovCi0gIGN1cnJfc29tX29mZnNldCA9IChjdXJyX3NvbV9vZmZzZXQgKyAweDEpICYgfjB4MTsKLQotICAvKiBGSVhNRSBzaG91bGQgYmUgZG9uZSB3aXRoIGJ1ZmZlcnMganVzdCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZS4uLiAqLwotICBsc3Rfc3ltcyA9IGJmZF9tYWxsb2MgKG5zeW1zICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpKTsKLSAgaWYgKGxzdF9zeW1zID09IE5VTEwgJiYgbnN5bXMgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgc3RyaW5ncyA9IGJmZF9tYWxsb2MgKHN0cmluZ19zaXplKTsKLSAgaWYgKHN0cmluZ3MgPT0gTlVMTCAmJiBzdHJpbmdfc2l6ZSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHAgPSBzdHJpbmdzOwotICBjdXJyX2xzdF9zeW0gPSBsc3Rfc3ltczsKLQotICBjdXJyX2JmZCA9IGFiZmQtPmFyY2hpdmVfaGVhZDsKLSAgd2hpbGUgKGN1cnJfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGN1cnJfY291bnQsIGk7Ci0gICAgICBzb21fc3ltYm9sX3R5cGUgKnN5bTsKLQotICAgICAgLyogRG9uJ3QgYm90aGVyIGZvciBub24tU09NIG9iamVjdHMuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgIT0gYmZkX29iamVjdAotCSAgfHwgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgIT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQl7Ci0JICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbiByZWFkLCB0aGVuIHNuYWcgYSBwb2ludGVyCi0JIHRvIGl0LiAgSXQncyBhIGxpdHRsZSBzbGltZXkgdG8gZ3JhYiB0aGUgc3ltYm9scyB2aWEgb2JqX3NvbV9zeW10YWIsCi0JIGJ1dCBkb2luZyBzbyBhdm9pZHMgYWxsb2NhdGluZyBsb3RzIG9mIGV4dHJhIG1lbW9yeS4gICovCi0gICAgICBpZiAoc29tX3NsdXJwX3N5bWJvbF90YWJsZSAoY3Vycl9iZmQpID09IGZhbHNlKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBzeW0gPSBvYmpfc29tX3N5bXRhYiAoY3Vycl9iZmQpOwotICAgICAgY3Vycl9jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGN1cnJfYmZkKTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJfY291bnQ7IGkrKywgc3ltKyspCi0JewotCSAgc3RydWN0IHNvbV9taXNjX3N5bWJvbF9pbmZvIGluZm87Ci0KLQkgIC8qIERlcml2ZSBTT00gaW5mb3JtYXRpb24gZnJvbSB0aGUgQkZEIHN5bWJvbC4gICovCi0JICBzb21fYmZkX2Rlcml2ZV9taXNjX3N5bWJvbF9pbmZvIChjdXJyX2JmZCwgJnN5bS0+c3ltYm9sLCAmaW5mbyk7Ci0KLQkgIC8qIFNob3VsZCB3ZSBpbmNsdWRlIHRoaXMgc3ltYm9sPyAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF90eXBlID09IFNUX05VTEwKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX1NZTV9FWFQKLQkgICAgICB8fCBpbmZvLnN5bWJvbF90eXBlID09IFNUX0FSR19FWFQpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBPbmx5IGdsb2JhbCBzeW1ib2xzIGFuZCB1bnNhdGlzZmllZCBjb21tb25zLiAgKi8KLQkgIGlmIChpbmZvLnN5bWJvbF9zY29wZSAhPSBTU19VTklWRVJTQUwKLQkgICAgICAmJiBpbmZvLnN5bWJvbF90eXBlICE9IFNUX1NUT1JBR0UpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBEbyBubyBpbmNsdWRlIHVuZGVmaW5lZCBzeW1ib2xzLiAgKi8KLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c3ltYm9sLnNlY3Rpb24pKQotCSAgICBjb250aW51ZTsKLQotCSAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc3ltYm9sIGZyb20gdGhpcyBTT00sIHRoZW4gdXBkYXRlCi0JICAgICB0aGUgU09NIGRpY3Rpb25hcnkgdG9vLiAgKi8KLQkgIGlmIChzb21fZGljdFtzb21faW5kZXhdLmxvY2F0aW9uID09IDApCi0JICAgIHsKLQkgICAgICBzb21fZGljdFtzb21faW5kZXhdLmxvY2F0aW9uID0gY3Vycl9zb21fb2Zmc2V0OwotCSAgICAgIHNvbV9kaWN0W3NvbV9pbmRleF0ubGVuZ3RoID0gYXJlbHRfc2l6ZSAoY3Vycl9iZmQpOwotCSAgICB9Ci0KLQkgIC8qIEZpbGwgaW4gdGhlIGxzdCBzeW1ib2wgcmVjb3JkLiAgKi8KLQkgIGN1cnJfbHN0X3N5bS0+aGlkZGVuID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+c2Vjb25kYXJ5X2RlZiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF90eXBlID0gaW5mby5zeW1ib2xfdHlwZTsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3Njb3BlID0gaW5mby5zeW1ib2xfc2NvcGU7Ci0JICBjdXJyX2xzdF9zeW0tPmNoZWNrX2xldmVsID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+bXVzdF9xdWFsaWZ5ID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+aW5pdGlhbGx5X2Zyb3plbiA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPm1lbW9yeV9yZXNpZGVudCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPmlzX2NvbW1vbiA9IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zeW1ib2wuc2VjdGlvbik7Ci0JICBjdXJyX2xzdF9zeW0tPmR1cF9jb21tb24gPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT54bGVhc3QgPSAzOwotCSAgY3Vycl9sc3Rfc3ltLT5hcmdfcmVsb2MgPSBpbmZvLmFyZ19yZWxvYzsKLQkgIGN1cnJfbHN0X3N5bS0+bmFtZS5uX3N0cnggPSBwIC0gc3RyaW5ncyArIDQ7Ci0JICBjdXJyX2xzdF9zeW0tPnF1YWxpZmllcl9uYW1lLm5fc3RyeCA9IDA7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9pbmZvID0gaW5mby5zeW1ib2xfaW5mbzsKLQkgIGN1cnJfbHN0X3N5bS0+c3ltYm9sX3ZhbHVlID0gaW5mby5zeW1ib2xfdmFsdWUgfCBpbmZvLnByaXZfbGV2ZWw7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9kZXNjcmlwdG9yID0gMDsKLQkgIGN1cnJfbHN0X3N5bS0+cmVzZXJ2ZWQgPSAwOwotCSAgY3Vycl9sc3Rfc3ltLT5zb21faW5kZXggPSBzb21faW5kZXg7Ci0JICBjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgPSBzb21fYmZkX2FyX3N5bWJvbF9oYXNoICgmc3ltLT5zeW1ib2wpOwotCSAgY3Vycl9sc3Rfc3ltLT5uZXh0X2VudHJ5ID0gMDsKLQotCSAgLyogSW5zZXJ0IGludG8gdGhlIGhhc2ggdGFibGUuICAqLwotCSAgaWYgKGhhc2hfdGFibGVbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0pCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQgKnRtcDsKLQotCSAgICAgIC8qIFRoZXJlIGlzIGFscmVhZHkgc29tZXRoaW5nIGF0IHRoZSBoZWFkIG9mIHRoaXMgaGFzaCBjaGFpbiwKLQkJIHNvIHRhY2sgdGhpcyBzeW1ib2wgb250byB0aGUgZW5kIG9mIHRoZSBjaGFpbi4gICovCi0JICAgICAgdG1wID0gbGFzdF9oYXNoX2VudHJ5W2N1cnJfbHN0X3N5bS0+c3ltYm9sX2tleSAlIGxzdC5oYXNoX3NpemVdOwotCSAgICAgIHRtcC0+bmV4dF9lbnRyeQotCQk9IChjdXJyX2xzdF9zeW0gLSBsc3Rfc3ltcykgKiBzaXplb2YgKHN0cnVjdCBsc3Rfc3ltYm9sX3JlY29yZCkKLQkJICArIGxzdC5oYXNoX3NpemUgKiA0IAotCQkgICsgbHN0Lm1vZHVsZV9jb3VudCAqIHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkKLQkJICArIHNpemVvZiAoc3RydWN0IGxzdF9oZWFkZXIpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGaXJzdCBlbnRyeSBpbiB0aGlzIGhhc2ggY2hhaW4uICAqLwotCSAgICAgIGhhc2hfdGFibGVbY3Vycl9sc3Rfc3ltLT5zeW1ib2xfa2V5ICUgbHN0Lmhhc2hfc2l6ZV0KLQkJPSAoY3Vycl9sc3Rfc3ltIC0gbHN0X3N5bXMpICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpCi0JCSAgKyBsc3QuaGFzaF9zaXplICogNCAKLQkJICArIGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpCi0JCSAgKyBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQkgICAgfQotCi0JICAvKiBLZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHN5bWJvbCB3ZSBhZGRlZCB0byB0aGlzIGNoYWluIHNvIHdlIGNhbgotCSAgICAgZWFzaWx5IHVwZGF0ZSBpdHMgbmV4dF9lbnRyeSBwb2ludGVyLiAgKi8KLQkgIGxhc3RfaGFzaF9lbnRyeVtjdXJyX2xzdF9zeW0tPnN5bWJvbF9rZXkgJSBsc3QuaGFzaF9zaXplXQotCSAgICA9IGN1cnJfbHN0X3N5bTsKLQotCi0JICAvKiBVcGRhdGUgdGhlIHN0cmluZyB0YWJsZS4gICovCi0JICBiZmRfcHV0XzMyIChhYmZkLCBzdHJsZW4gKHN5bS0+c3ltYm9sLm5hbWUpLCBwKTsKLQkgIHAgKz0gNDsKLQkgIHN0cmNweSAocCwgc3ltLT5zeW1ib2wubmFtZSk7Ci0JICBwICs9IHN0cmxlbiAoc3ltLT5zeW1ib2wubmFtZSkgKyAxOwotCSAgd2hpbGUgKChpbnQpcCAlIDQpCi0JICAgIHsKLQkgICAgICBiZmRfcHV0XzggKGFiZmQsIDAsIHApOwotCSAgICAgIHArKzsKLQkgICAgfQotCi0JICAvKiBIZWFkIHRvIHRoZSBuZXh0IHN5bWJvbC4gICovCi0JICBjdXJyX2xzdF9zeW0rKzsKLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2Ygd2hlcmUgZWFjaCBTT00gd2lsbCBmaW5hbGx5IHJlc2lkZTsgdGhlbiBsb29rCi0JIGF0IHRoZSBuZXh0IEJGRC4gICovCi0gICAgICBjdXJyX3NvbV9vZmZzZXQgKz0gYXJlbHRfc2l6ZSAoY3Vycl9iZmQpICsgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsKLSAKLSAgICAgIC8qIEEgcGFydGljdWxhciBvYmplY3QgaW4gdGhlIGFyY2hpdmUgbWF5IGhhdmUgYW4gb2RkIGxlbmd0aDsgdGhlCi0JIGxpbmtlciByZXF1aXJlcyBvYmplY3RzIGJlZ2luIG9uIGFuIGV2ZW4gYm91bmRhcnkuICBTbyByb3VuZAotCSB1cCB0aGUgY3VycmVudCBvZmZzZXQgYXMgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGN1cnJfc29tX29mZnNldCA9IChjdXJyX3NvbV9vZmZzZXQgKyAweDEpICYgfjB4MTsKLSAgICAgIGN1cnJfYmZkID0gY3Vycl9iZmQtPm5leHQ7Ci0gICAgICBzb21faW5kZXgrKzsKLSAgICB9Ci0KLSAgLyogTm93IHNjcmliYmxlIG91dCB0aGUgaGFzaCB0YWJsZS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIGhhc2hfdGFibGUsIGxzdC5oYXNoX3NpemUsIDQsIGFiZmQpCi0gICAgICAhPSBsc3QuaGFzaF9zaXplICogNCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBUaGVuIHRoZSBTT00gZGljdGlvbmFyeS4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpIHNvbV9kaWN0LCBsc3QubW9kdWxlX2NvdW50LAotCQkgc2l6ZW9mIChzdHJ1Y3Qgc29tX2VudHJ5KSwgYWJmZCkKLSAgICAgICE9IGxzdC5tb2R1bGVfY291bnQgKiBzaXplb2YgKHN0cnVjdCBzb21fZW50cnkpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFRoZSBsaWJyYXJ5IHN5bWJvbHMuICAqLwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBsc3Rfc3ltcywgbnN5bXMsIHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSwgYWJmZCkKLSAgICAgICE9IG5zeW1zICogc2l6ZW9mIChzdHJ1Y3QgbHN0X3N5bWJvbF9yZWNvcmQpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIEFuZCBmaW5hbGx5IHRoZSBzdHJpbmdzLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgc3RyaW5ncywgc3RyaW5nX3NpemUsIDEsIGFiZmQpICE9IHN0cmluZ19zaXplKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSAhPSBOVUxMKQotICAgIGZyZWUgKGxhc3RfaGFzaF9lbnRyeSk7Ci0gIGlmIChsc3Rfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGxzdF9zeW1zKTsKLSAgaWYgKHN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzdHJpbmdzKTsKLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChoYXNoX3RhYmxlICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF90YWJsZSk7Ci0gIGlmIChzb21fZGljdCAhPSBOVUxMKQotICAgIGZyZWUgKHNvbV9kaWN0KTsKLSAgaWYgKGxhc3RfaGFzaF9lbnRyeSAhPSBOVUxMKQotICAgIGZyZWUgKGxhc3RfaGFzaF9lbnRyeSk7Ci0gIGlmIChsc3Rfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGxzdF9zeW1zKTsKLSAgaWYgKHN0cmluZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChzdHJpbmdzKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgTFNUIGZvciB0aGUgYXJjaGl2ZS4KLQotICAgWW91J2xsIG5ldmVyIGJlbGlldmUgdGhpcyBpcyByZWFsbHkgaG93IGFybWFwcyBhcmUgaGFuZGxlZCBpbiBTT00uLi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXNvbV93cml0ZV9hcm1hcCAoYWJmZCwgZWxlbmd0aCwgbWFwLCBvcmxfY291bnQsIHN0cmlkeCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBpbnQgZWxlbmd0aDsKLSAgICAgc3RydWN0IG9ybCAqbWFwOwotICAgICB1bnNpZ25lZCBpbnQgb3JsX2NvdW50OwotICAgICBpbnQgc3RyaWR4OwotewotICBiZmQgKmN1cnJfYmZkOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwotICB1bnNpZ25lZCBpbnQgaSwgbHN0X3NpemUsIG5zeW1zLCBzdHJpbmdzaXplOwotICBzdHJ1Y3QgYXJfaGRyIGhkcjsKLSAgc3RydWN0IGxzdF9oZWFkZXIgbHN0OwotICBpbnQgKnA7Ci0gCi0gIC8qIFdlJ2xsIHVzZSB0aGlzIGZvciB0aGUgYXJjaGl2ZSdzIGRhdGUgYW5kIG1vZGUgbGF0ZXIuICAqLwotICBpZiAoc3RhdCAoYWJmZC0+ZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBGdWRnZSBmYWN0b3IuICAqLwotICBiZmRfYXJkYXRhIChhYmZkKS0+YXJtYXBfdGltZXN0YW1wID0gc3RhdGJ1Zi5zdF9tdGltZSArIDYwOwotCi0gIC8qIEFjY291bnQgZm9yIHRoZSBsc3QgaGVhZGVyIGZpcnN0LiAgKi8KLSAgbHN0X3NpemUgPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKTsKLQotICAvKiBTdGFydCBidWlsZGluZyB0aGUgTFNUIGhlYWRlci4gICovCi0gIC8qIEZJWE1FOiAgRG8gd2UgbmVlZCB0byBleGFtaW5lIGVhY2ggZWxlbWVudCB0byBkZXRlcm1pbmUgdGhlCi0gICAgIGxhcmdlc3QgaWQgbnVtYmVyPyAgKi8KLSAgbHN0LnN5c3RlbV9pZCA9IENQVV9QQV9SSVNDMV8wOwotICBsc3QuYV9tYWdpYyA9IExJQk1BR0lDOwotICBsc3QudmVyc2lvbl9pZCA9IFZFUlNJT05fSUQ7Ci0gIGxzdC5maWxlX3RpbWUuc2VjcyA9IDA7Ci0gIGxzdC5maWxlX3RpbWUubmFub3NlY3MgPSAwOwotCi0gIGxzdC5oYXNoX2xvYyA9IGxzdF9zaXplOwotICBsc3QuaGFzaF9zaXplID0gU09NX0xTVF9IQVNIX1NJWkU7Ci0KLSAgLyogSGFzaCB0YWJsZSBpcyBhIFNPTV9MU1RfSEFTSF9TSVpFIDMyYml0IG9mZnNldHMuICAqLwotICBsc3Rfc2l6ZSArPSA0ICogU09NX0xTVF9IQVNIX1NJWkU7Ci0KLSAgLyogV2UgbmVlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIFNPTXMgaW4gdGhpcyBhcmNoaXZlLiAgKi8KLSAgY3Vycl9iZmQgPSBhYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIGxzdC5tb2R1bGVfY291bnQgPSAwOwotICB3aGlsZSAoY3Vycl9iZmQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBPbmx5IHRydWUgU09NIG9iamVjdHMgY291bnQuICAqLwotICAgICAgaWYgKGN1cnJfYmZkLT5mb3JtYXQgPT0gYmZkX29iamVjdAotCSAgJiYgY3Vycl9iZmQtPnh2ZWMtPmZsYXZvdXIgPT0gYmZkX3RhcmdldF9zb21fZmxhdm91cikKLQlsc3QubW9kdWxlX2NvdW50Kys7Ci0gICAgICBjdXJyX2JmZCA9IGN1cnJfYmZkLT5uZXh0OwotICAgIH0KLSAgbHN0Lm1vZHVsZV9saW1pdCA9IGxzdC5tb2R1bGVfY291bnQ7Ci0gIGxzdC5kaXJfbG9jID0gbHN0X3NpemU7Ci0gIGxzdF9zaXplICs9IHNpemVvZiAoc3RydWN0IHNvbV9lbnRyeSkgKiBsc3QubW9kdWxlX2NvdW50OwotCi0gIC8qIFdlIGRvbid0IHN1cHBvcnQgaW1wb3J0L2V4cG9ydCB0YWJsZXMsIGF1eGlsaWFyeSBoZWFkZXJzLAotICAgICBvciBmcmVlIGxpc3RzIHlldC4gIE1ha2UgdGhlIGxpbmtlciB3b3JrIGEgbGl0dGxlIGhhcmRlcgotICAgICB0byBtYWtlIG91ciBsaWZlIGVhc2llci4gICovCi0KLSAgbHN0LmV4cG9ydF9sb2MgPSAwOwotICBsc3QuZXhwb3J0X2NvdW50ID0gMDsKLSAgbHN0LmltcG9ydF9sb2MgPSAwOwotICBsc3QuYXV4X2xvYyA9IDA7Ci0gIGxzdC5hdXhfc2l6ZSA9IDA7Ci0KLSAgLyogQ291bnQgaG93IG1hbnkgc3ltYm9scyB3ZSB3aWxsIGhhdmUgb24gdGhlIGhhc2ggY2hhaW5zIGFuZCB0aGUKLSAgICAgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoc29tX2JmZF9wcmVwX2Zvcl9hcl93cml0ZSAoYWJmZCwgJm5zeW1zLCAmc3RyaW5nc2l6ZSkgPT0gZmFsc2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGxzdF9zaXplICs9IHNpemVvZiAoc3RydWN0IGxzdF9zeW1ib2xfcmVjb3JkKSAqIG5zeW1zOwotCi0gIC8qIEZvciB0aGUgc3RyaW5nIHRhYmxlLiAgT25lIGRheSB3ZSBtaWdodCBhY3R1YWxseSB1c2UgdGhpcyBpbmZvCi0gICAgIHRvIGF2b2lkIHNtYWxsIHNlZWtzL3JlYWRzIHdoZW4gcmVhZGluZyBhcmNoaXZlcy4gICovCi0gIGxzdC5zdHJpbmdfbG9jID0gbHN0X3NpemU7Ci0gIGxzdC5zdHJpbmdfc2l6ZSA9IHN0cmluZ3NpemU7Ci0gIGxzdF9zaXplICs9IHN0cmluZ3NpemU7Ci0KLSAgLyogU09NIEFCSSBzYXlzIHRoaXMgbXVzdCBiZSB6ZXJvLiAgKi8KLSAgbHN0LmZyZWVfbGlzdCA9IDA7Ci0gIGxzdC5maWxlX2VuZCA9IGxzdF9zaXplOwotCi0gIC8qIENvbXB1dGUgdGhlIGNoZWNrc3VtLiAgTXVzdCBoYXBwZW4gYWZ0ZXIgdGhlIGVudGlyZSBsc3QgaGVhZGVyCi0gICAgIGhhcyBmaWxsZWQgaW4uICAqLwotICBwID0gKGludCAqKSZsc3Q7Ci0gIGxzdC5jaGVja3N1bSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKS9zaXplb2YgKGludCkgLSAxOyBpKyspCi0gICAgbHN0LmNoZWNrc3VtIF49ICpwKys7Ci0KLSAgc3ByaW50ZiAoaGRyLmFyX25hbWUsICIvICAgICAgICAgICAgICAgIik7Ci0gIHNwcmludGYgKGhkci5hcl9kYXRlLCAiJWxkIiwgYmZkX2FyZGF0YSAoYWJmZCktPmFybWFwX3RpbWVzdGFtcCk7Ci0gIHNwcmludGYgKGhkci5hcl91aWQsICIlbGQiLCAobG9uZykgZ2V0dWlkICgpKTsKLSAgc3ByaW50ZiAoaGRyLmFyX2dpZCwgIiVsZCIsIChsb25nKSBnZXRnaWQgKCkpOwotICBzcHJpbnRmIChoZHIuYXJfbW9kZSwgIiUtOG8iLCAodW5zaWduZWQgaW50KSBzdGF0YnVmLnN0X21vZGUpOwotICBzcHJpbnRmIChoZHIuYXJfc2l6ZSwgIiUtMTBkIiwgKGludCkgbHN0X3NpemUpOwotICBoZHIuYXJfZm1hZ1swXSA9ICdgJzsKLSAgaGRyLmFyX2ZtYWdbMV0gPSAnXDAxMic7Ci0KLSAgLyogVHVybiBhbnkgbnVsbHMgaW50byBzcGFjZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChzdHJ1Y3QgYXJfaGRyKTsgaSsrKQotICAgIGlmICgoKGNoYXIgKikgKCZoZHIpKVtpXSA9PSAnXDAnKQotICAgICAgKCgoY2hhciAqKSAoJmhkcikpW2ldKSA9ICcgJzsKLQotICAvKiBTY3JpYmJsZSBvdXQgdGhlIGFyIGhlYWRlci4gICovCi0gIGlmIChiZmRfd3JpdGUgKChQVFIpICZoZHIsIDEsIHNpemVvZiAoc3RydWN0IGFyX2hkciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBhcl9oZHIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBOb3cgc2NyaWJibGUgb3V0IHRoZSBsc3QgaGVhZGVyLiAgKi8KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgJmxzdCwgMSwgc2l6ZW9mIChzdHJ1Y3QgbHN0X2hlYWRlciksIGFiZmQpCi0gICAgICAhPSBzaXplb2YgKHN0cnVjdCBsc3RfaGVhZGVyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQnVpbGQgYW5kIHdyaXRlIHRoZSBhcm1hcC4gICovCi0gIGlmIChzb21fYmZkX2FyX3dyaXRlX3N5bWJvbF9zdHVmZiAoYWJmZCwgbnN5bXMsIHN0cmluZ3NpemUsIGxzdCwgZWxlbmd0aCkKLSAgICAgID09IGZhbHNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgCi0gIC8qIERvbmUuICAqLwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnJlZSBhbGwgaW5mb3JtYXRpb24gd2UgaGF2ZSBjYWNoZWQgZm9yIHRoaXMgQkZELiAgV2UgY2FuIGFsd2F5cwotICAgcmVhZCBpdCBhZ2FpbiBsYXRlciBpZiB3ZSBuZWVkIGl0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfZnJlZV9jYWNoZWRfaW5mbyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbzsKLQotICBpZiAoYmZkX2dldF9mb3JtYXQgKGFiZmQpICE9IGJmZF9vYmplY3QpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSNkZWZpbmUgRlJFRSh4KSBpZiAoeCAhPSBOVUxMKSB7IGZyZWUgKHgpOyB4ID0gTlVMTDsgfQotICAvKiBGcmVlIHRoZSBuYXRpdmUgc3RyaW5nIGFuZCBzeW1ib2wgdGFibGVzLiAgKi8KLSAgRlJFRSAob2JqX3NvbV9zeW10YWIgKGFiZmQpKTsKLSAgRlJFRSAob2JqX3NvbV9zdHJpbmd0YWIgKGFiZmQpKTsKLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gKGFzZWN0aW9uICopIE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIC8qIEZyZWUgdGhlIG5hdGl2ZSByZWxvY2F0aW9ucy4gICovCi0gICAgICBvLT5yZWxvY19jb3VudCA9IC0xOwotICAgICAgRlJFRSAoc29tX3NlY3Rpb25fZGF0YSAobyktPnJlbG9jX3N0cmVhbSk7Ci0gICAgICAvKiBGcmVlIHRoZSBnZW5lcmljIHJlbG9jYXRpb25zLiAgKi8KLSAgICAgIEZSRUUgKG8tPnJlbG9jYXRpb24pOwotICAgIH0KLSN1bmRlZiBGUkVFCi0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBvZiBtaXNjZWxsYW5lb3VzIHN1cHBvcnQgZnVuY3Rpb25zLiAqLwotCi0vKiBMaW5rZXIgc3VwcG9ydCBmdW5jdGlvbnMuICAqLwotc3RhdGljIGJvb2xlYW4KLXNvbV9iZmRfbGlua19zcGxpdF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIChzb21faXNfc3Vic3BhY2UgKHNlYykgJiYgc2VjLT5fcmF3X3NpemUgPiAyNDAwMDApOwotfQotCi0jZGVmaW5lCXNvbV9jbG9zZV9hbmRfY2xlYW51cAkJc29tX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0KLSNkZWZpbmUgc29tX3JlYWRfYXJfaGRyCQkJX2JmZF9nZW5lcmljX3JlYWRfYXJfaGRyCi0jZGVmaW5lIHNvbV9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUJYmZkX2dlbmVyaWNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlCi0jZGVmaW5lIHNvbV9nZXRfZWx0X2F0X2luZGV4CQlfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleAotI2RlZmluZSBzb21fZ2VuZXJpY19zdGF0X2FyY2hfZWx0CWJmZF9nZW5lcmljX3N0YXRfYXJjaF9lbHQKLSNkZWZpbmUgc29tX3RydW5jYXRlX2FybmFtZQkJYmZkX2JzZF90cnVuY2F0ZV9hcm5hbWUKLSNkZWZpbmUgc29tX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUJX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIHNvbV9jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSBcCi0gIF9iZmRfYXJjaGl2ZV9jb2ZmX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlCi0jZGVmaW5lIHNvbV91cGRhdGVfYXJtYXBfdGltZXN0YW1wCWJmZF90cnVlCi0jZGVmaW5lIHNvbV9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSAgX2JmZF9nZW5lcmljX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0KLSNkZWZpbmUgc29tX2dldF9saW5lbm8gICAgICAgICAgICAgICAgICBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHNvbV9iZmRfbWFrZV9kZWJ1Z19zeW1ib2wJX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHNvbV9yZWFkX21pbmlzeW1ib2xzCQlfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSBzb21fbWluaXN5bWJvbF90b19zeW1ib2wJX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0jZGVmaW5lIHNvbV9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cgXAotICBfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0KLSNkZWZpbmUgc29tX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSBzb21fYmZkX3JlbGF4X3NlY3Rpb24gYmZkX2dlbmVyaWNfcmVsYXhfc2VjdGlvbgotI2RlZmluZSBzb21fYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgc29tX2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHNvbV9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotCi0jZGVmaW5lIHNvbV9iZmRfZ2Nfc2VjdGlvbnMJCWJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0KLQotY29uc3QgYmZkX3RhcmdldCBzb21fdmVjID0KLXsKLSAgInNvbSIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCB8IERZTkFNSUMpLAotICAoU0VDX0NPREUgfCBTRUNfREFUQSB8IFNFQ19ST00gfCBTRUNfSEFTX0NPTlRFTlRTCi0gICB8IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKSwJCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLQotLyogbGVhZGluZ19zeW1ib2xfY2hhcjogaXMgdGhlIGZpcnN0IGNoYXIgb2YgYSB1c2VyIHN5bWJvbAotICAgcHJlZGljdGFibGUsIGFuZCBpZiBzbyB3aGF0IGlzIGl0ICovCi0gIDAsCi0gICcvJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTQsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotICB7X2JmZF9kdW1teV90YXJnZXQsCi0gICBzb21fb2JqZWN0X3AsCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICBiZmRfZ2VuZXJpY19hcmNoaXZlX3AsCi0gICBfYmZkX2R1bW15X3RhcmdldAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNvbV9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZQotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHNvbV93cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSN1bmRlZiBzb20KLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChzb20pLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc29tKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNvbSksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwotCi0jZW5kaWYgLyogSE9TVF9IUFBBSFBVWCB8fCBIT1NUX0hQUEFCU0QgfHwgSE9TVF9IUFBBT1NGICovCmRpZmYgLS1naXQgYS9iZmQvc29tLmggYi9iZmQvc29tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzc4MDQuLjAwMDAwMDAKLS0tIGEvYmZkL3NvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qIEhQIFBBLVJJU0MgU09NIG9iamVjdCBmaWxlIGZvcm1hdDogIGRlZmluaXRpb25zIGludGVybmFsIHRvIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIENvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlCi0gICBVbml2ZXJzaXR5IG9mIFV0YWggKHBhLWdkYi1idWdzQGNzLnV0YWguZWR1KS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfU09NX0gKLSNkZWZpbmUgX1NPTV9ICi0KLSNpbmNsdWRlICJsaWJocHBhLmgiCi0KLSNpbmNsdWRlIDxhLm91dC5oPgotI2luY2x1ZGUgPGxzdC5oPgotI2luY2x1ZGUgPGFyLmg+Ci0KLS8qIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBjdXJyZW50bHkgdXNlIGFueXRoaW5nIGZyb20gdGhlc2UKLSAgIHR3byBpbmNsdWRlIGZpbGVzLCBidXQgaXQncyBsaWtlbHkgdG8gbmVlZCB0aGVtIGluIHRoZSBmdXR1cmUuICAqLwotI2lmZGVmIFJfRExUX1JFTAotI2luY2x1ZGUgPHNobC5oPgotI2luY2x1ZGUgPGRsLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpCi0vKiBCU0QgdXNlcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNjaGVtZSBmb3Igb2JqZWN0IGZpbGUgaWRlbnRpZmljYXRpb24uCi0gICBzbyBmb3Igbm93LCBkZWZpbmUgX1BBX1JJU0NfSUQgdG8gYWNjZXB0IGFueSByYW5kb20gdmFsdWUgZm9yIGEgbW9kZWwKLSAgIG51bWJlci4gICovCi0jdW5kZWYgX1BBX1JJU0NfSUQKLSNkZWZpbmUgX1BBX1JJU0NfSUQoX19tX251bSkgMQotI2VuZGlmIC8qIEhPU1RfSFBQQUJTRCAqLwotCi0jZGVmaW5lIEZJTEVfSERSX1NJWkUgc2l6ZW9mKHN0cnVjdCBoZWFkZXIpCi0jZGVmaW5lIEFVWF9IRFJfU0laRSBzaXplb2Yoc3RydWN0IHNvbV9leGVjX2F1eGhkcikKLQotdHlwZWRlZiBzdHJ1Y3Qgc29tX3N5bWJvbAotICB7Ci0gICAgYXN5bWJvbCBzeW1ib2w7Ci0gICAgdW5zaWduZWQgaW50IHNvbV90eXBlOwotCi0gICAgLyogU3RydWN0dXJlZCBsaWtlIHRoZSBFTEYgdGNfZGF0YSB1bmlvbi4gIEFsbG93cyBtb3JlIGNvZGUgc2hhcmluZwotICAgICAgIGluIEdBUyB0aGlzIHdheS4gICovCi0gICAgdW5pb24KLSAgICAgIHsKLQlzdHJ1Y3QKLQl7Ci0JICB1bnNpZ25lZCBpbnQgaHBwYV9hcmdfcmVsb2M7Ci0JICB1bnNpZ25lZCBpbnQgaHBwYV9wcml2X2xldmVsOwotCX0gYXA7Ci0JUFRSIGFueTsKLSAgICAgIH0KLSAgICB0Y19kYXRhOwotCi0gICAgLyogSW5kZXggb2YgdGhpcyBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIE9ubHkgdXNlZCB3aGVuCi0gICAgICAgYnVpbGRpbmcgcmVsb2NhdGlvbiBzdHJlYW1zIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLwotICAgIGludCBpbmRleDsKLQotICAgIC8qIEhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGlzIHVzZWQgaW4gYSByZWxvY2F0aW9uLiAgQnkgc29ydGluZwotICAgICAgIHRoZSBzeW1ib2xzIGZyb20gbW9zdCB1c2VkIHRvIGxlYXN0IHVzZWQgd2UgY2FuIHNpZ25pZmljYW50bHkKLSAgICAgICByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIHJlbG9jYXRpb24gc3RyZWFtIGZvciBpbmNvbXBsZXRlIG9iamVjdHMuICAqLwotICAgIGludCByZWxvY19jb3VudDsKLQotICAgIC8qIER1cmluZyBvYmplY3QgZmlsZSB3cml0aW5nLCB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lIG9mIHRoaXMgc3ltYm9sCi0gICAgICAgaW4gdGhlIFNPTSBzdHJpbmcgdGFibGUuICovCi0gICAgaW50IHN0cmluZ3RhYl9vZmZzZXQ7Ci0gIH0KLXNvbV9zeW1ib2xfdHlwZTsKLQotLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgdGhlIG1hZ2ljIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhIEJGRCdzCi0gICBwcml2YXRlIGRhdGEgd2hpY2ggbmVlZHMgdG8gYmUgY29waWVkIGR1cmluZyBhbiBvYmpjb3B5L3N0cmlwIHJ1bi4gICovCi1zdHJ1Y3Qgc29tX2V4ZWNfZGF0YQotICB7Ci0gICAgLyogU29ydC1vZiBhIG1hZ2ljIG51bWJlci4gIEJTRCB1c2VzIGl0IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KLSAgICAgICBuYXRpdmUgZXhlY3V0YWJsZXMgYW5kIGhwdXggZXhlY3V0YWJsZXMuICAqLwotICAgIHNob3J0IHN5c3RlbV9pZDsKLQotICAgIC8qIE1hZ2ljIGV4ZWMgZmxhZ3MuICBUaGVzZSBjb250cm9sIHRoaW5ncyBsaWtlIHdoZXRoZXIgb3Igbm90Ci0gICAgICAgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNpbmcgaXMgYWxsb3dlZCBhbmQgdGhlIGxpa2UuICAqLwotICAgIGxvbmcgZXhlY19mbGFnczsKLQotICAgIC8qIEFkZCBtb3JlIHN0dWZmIGhlcmUgYXMgbmVlZGVkLiAgR29vZCBleGFtcGxlcyBvZiBpbmZvcm1hdGlvbgotICAgICAgIHdlIG1pZ2h0IHdhbnQgdG8gcGFzcyB3b3VsZCBiZSBwcmVzdW1lZF9kcCwgZW50cnlfKiBhbmQgbWF5YmUKLSAgICAgICBvdGhlcnMgZnJvbSB0aGUgZmlsZSBoZWFkZXIuICAqLwotICB9OwotCi1zdHJ1Y3Qgc29tZGF0YQotICB7Ci0gICAgLyogQWxsIHRoZSBtYWdpYyBpbmZvcm1hdGlvbiBhYm91dCBhbiBleGVjdXRhYmxlIHdoaWNoIGxpdmVzCi0gICAgICAgaW4gdGhlIHByaXZhdGUgQkZEIHN0cnVjdHVyZSBhbmQgbmVlZHMgdG8gYmUgY29waWVkIGZyb20KLSAgICAgICB0aGUgaW5wdXQgYmZkIHRvIHRoZSBvdXRwdXQgYmZkIGR1cmluZyBhIG9iamNvcHkvc3RyaXAuICAqLwotICAgIHN0cnVjdCBzb21fZXhlY19kYXRhICpleGVjX2RhdGE7Ci0KLSAgICAvKiBUaGVzZSB0aHJlZSBmaWVsZHMgYXJlIG9ubHkgdXNlZCB3aGVuIHdyaXRpbmcgZmlsZXMgYW5kIGFyZQotICAgICAgIGdlbmVyYXRlZCBmcm9tIHNjcmF0Y2guICBUaGV5IG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weQotICAgICAgIG9yIHN0cmlwIHRvIHdvcmsuICAqLwotICAgIHN0cnVjdCBoZWFkZXIgKmZpbGVfaGRyOwotICAgIHN0cnVjdCBjb3B5cmlnaHRfYXV4X2hkciAqY29weXJpZ2h0X2F1eF9oZHI7Ci0gICAgc3RydWN0IHVzZXJfc3RyaW5nX2F1eF9oZHIgKnZlcnNpb25fYXV4X2hkcjsKLSAgICBzdHJ1Y3Qgc29tX2V4ZWNfYXV4aGRyICpleGVjX2hkcjsKLSAgICBDT01QVU5JVCAqY29tcF91bml0OwotCi0gICAgLyogUG9pbnRlcnMgdG8gYSBzYXZlZCBjb3B5IG9mIHRoZSBzeW1ib2wgYW5kIHN0cmluZyB0YWJsZXMuICBUaGVzZQotICAgICAgIG5lZWQgbm90IGJlIGNvcGllZCBmb3Igb2JqY29weSBvciBzdHJpcCB0byB3b3JrLiAgKi8KLSAgICBzb21fc3ltYm9sX3R5cGUgKnN5bXRhYjsKLSAgICBjaGFyICpzdHJpbmd0YWI7Ci0gICAgYXN5bWJvbCAqKnNvcnRlZF9zeW1zOwotCi0gICAgLyogV2UgcmVtZW1iZXIgdGhlc2Ugb2Zmc2V0cyBzbyB0aGF0IGFmdGVyIGNoZWNrX2ZpbGVfZm9ybWF0LCB3ZSBoYXZlCi0gICAgICAgbm8gZGVwZW5kZW5jaWVzIG9uIHRoZSBwYXJ0aWN1bGFyIGZvcm1hdCBvZiB0aGUgZXhlY19oZHIuCi0gICAgICAgVGhlc2Ugb2Zmc2V0cyBuZWVkIG5vdCBiZSBjb3BpZWQgZm9yIG9iamNvcHkgb3Igc3RyaXAgdG8gd29yay4gICovCi0KLSAgICBmaWxlX3B0ciBzeW1fZmlsZXBvczsKLSAgICBmaWxlX3B0ciBzdHJfZmlsZXBvczsKLSAgICBmaWxlX3B0ciByZWxvY19maWxlcG9zOwotICAgIHVuc2lnbmVkIHN0cmluZ3RhYl9zaXplOwotICB9OwotCi1zdHJ1Y3Qgc29tX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3Qgc29tZGF0YSBhOwotICB9OwotCi0vKiBTdWJzdHJ1Y3R1cmUgb2Ygc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uCi0gICB3aGljaCBjYW4ndCBiZSByZXByZXNlbnRlZCBieSB0aGUgZ2VuZXJpYyBCRkQgc2VjdGlvbiBzdHJ1Y3R1cmUsCi0gICBidXQgd2hpY2ggbXVzdCBiZSBjb3BpZWQgZHVyaW5nIG9iamNvcHkgb3Igc3RyaXAuICAqLwotc3RydWN0IHNvbV9jb3B5YWJsZV9zZWN0aW9uX2RhdGFfc3RydWN0Ci0gIHsKLSAgICAvKiBWYXJpb3VzIGZpZWxkcyBpbiBzcGFjZSBhbmQgc3Vic3BhY2UgaGVhZGVycyB0aGF0IHdlIG5lZWQKLSAgICAgICB0byBwYXNzIGFyb3VuZC4gICovCi0gICAgdW5zaWduZWQgaW50IHNvcnRfa2V5IDogODsKLSAgICB1bnNpZ25lZCBpbnQgYWNjZXNzX2NvbnRyb2xfYml0cyA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGlzX2RlZmluZWQgOiAxOwotICAgIHVuc2lnbmVkIGludCBpc19wcml2YXRlIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgcXVhZHJhbnQgOiAyOwotCi0gICAgLyogRm9yIHN1YnNwYWNlcywgdGhpcyBwb2ludHMgdG8gdGhlIHNlY3Rpb24gd2hpY2ggcmVwcmVzZW50cyB0aGUKLSAgICAgICBzcGFjZSBpbiB3aGljaCB0aGUgc3Vic3BhY2UgaXMgY29udGFpbmVkLiAgRm9yIHNwYWNlcyBpdCBwb2ludHMKLSAgICAgICBiYWNrIHRvIHRoZSBzZWN0aW9uIGZvciB0aGlzIHNwYWNlLiAgKi8KLSAgICBhc2VjdGlvbiAqY29udGFpbmVyOwotCi0gICAgLyogVGhlIHVzZXItc3BlY2lmaWVkIHNwYWNlIG51bWJlci4gIEl0IGlzIHdyb25nIHRvIHVzZSB0aGlzIGFzCi0gICAgICAgYW4gaW5kZXggc2luY2UgZHVwbGljYXRlcyBhbmQgaG9sZXMgYXJlIGFsbG93ZWQuICAqLwotICAgIGludCBzcGFjZV9udW1iZXI7Ci0KLSAgICAvKiBBZGQgbW9yZSBzdHVmZiBoZXJlIGFzIG5lZWRlZC4gIEdvb2QgZXhhbXBsZXMgb2YgaW5mb3JtYXRpb24KLSAgICAgICB3ZSBtaWdodCB3YW50IHRvIHBhc3Mgd291bGQgYmUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnMsIAotICAgICAgIGFuZCB0aGUgbWFueSBzdWJzcGFjZSBmbGFncyB3ZSBkbyBub3QgcmVwcmVzZW50IHlldC4gICovCi0gIH07Ci0KLS8qIFVzZWQgdG8ga2VlcCBleHRyYSBTT00gc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gc2VjdGlvbi4KLQotICAgcmVsb2Nfc2l6ZSBob2xkcyB0aGUgc2l6ZSBvZiB0aGUgcmVsb2NhdGlvbiBzdHJlYW0sIG5vdGUgdGhpcwotICAgaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgbnVtYmVyIG9mIHJlbG9jYXRpb25zIGFzIFNPTSByZWxvY2F0aW9ucwotICAgYXJlIHZhcmlhYmxlIGxlbmd0aC4gCi0KLSAgIHJlbG9jX3N0cmVhbSBpcyB0aGUgYWN0dWFsIHN0cmVhbSBvZiByZWxvY2F0aW9uIGVudHJpZXMuICAqLwotCi1zdHJ1Y3Qgc29tX3NlY3Rpb25fZGF0YV9zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBzb21fY29weWFibGVfc2VjdGlvbl9kYXRhX3N0cnVjdCAqY29weV9kYXRhOwotICAgIHVuc2lnbmVkIGludCByZWxvY19zaXplOwotICAgIGNoYXIgKnJlbG9jX3N0cmVhbTsKLSAgICBzdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9yZWNvcmQgKnNwYWNlX2RpY3Q7Ci0gICAgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfcmVjb3JkICpzdWJzcGFjZV9kaWN0OwotICB9OwotCi0jZGVmaW5lIHNvbWRhdGEoYmZkKQkJCSgoYmZkKS0+dGRhdGEuc29tX2RhdGEtPmEpCi0jZGVmaW5lIG9ial9zb21fZXhlY19kYXRhKGJmZCkJCShzb21kYXRhKGJmZCkuZXhlY19kYXRhKQotI2RlZmluZSBvYmpfc29tX2ZpbGVfaGRyKGJmZCkJCShzb21kYXRhKGJmZCkuZmlsZV9oZHIpCi0jZGVmaW5lIG9ial9zb21fZXhlY19oZHIoYmZkKQkJKHNvbWRhdGEoYmZkKS5leGVjX2hkcikKLSNkZWZpbmUgb2JqX3NvbV9jb3B5cmlnaHRfaGRyKGJmZCkJKHNvbWRhdGEoYmZkKS5jb3B5cmlnaHRfYXV4X2hkcikKLSNkZWZpbmUgb2JqX3NvbV92ZXJzaW9uX2hkcihiZmQpCShzb21kYXRhKGJmZCkudmVyc2lvbl9hdXhfaGRyKQotI2RlZmluZSBvYmpfc29tX2NvbXBpbGF0aW9uX3VuaXQoYmZkKQkoc29tZGF0YShiZmQpLmNvbXBfdW5pdCkKLSNkZWZpbmUgb2JqX3NvbV9zeW10YWIoYmZkKQkJKHNvbWRhdGEoYmZkKS5zeW10YWIpCi0jZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiKGJmZCkJCShzb21kYXRhKGJmZCkuc3RyaW5ndGFiKQotI2RlZmluZSBvYmpfc29tX3N5bV9maWxlcG9zKGJmZCkJKHNvbWRhdGEoYmZkKS5zeW1fZmlsZXBvcykKLSNkZWZpbmUgb2JqX3NvbV9zdHJfZmlsZXBvcyhiZmQpCShzb21kYXRhKGJmZCkuc3RyX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc3RyaW5ndGFiX3NpemUoYmZkKQkoc29tZGF0YShiZmQpLnN0cmluZ3RhYl9zaXplKQotI2RlZmluZSBvYmpfc29tX3JlbG9jX2ZpbGVwb3MoYmZkKQkoc29tZGF0YShiZmQpLnJlbG9jX2ZpbGVwb3MpCi0jZGVmaW5lIG9ial9zb21fc29ydGVkX3N5bXMoYmZkKQkoc29tZGF0YShiZmQpLnNvcnRlZF9zeW1zKQotI2RlZmluZSBzb21fc2VjdGlvbl9kYXRhKHNlYykgXAotICAoKHN0cnVjdCBzb21fc2VjdGlvbl9kYXRhX3N0cnVjdCAqKXNlYy0+dXNlZF9ieV9iZmQpCi0jZGVmaW5lIHNvbV9zeW1ib2xfZGF0YShzeW1ib2wpCQkoKHNvbV9zeW1ib2xfdHlwZSAqKSBzeW1ib2wpCi0KLQotLyogRGVmaW5lcyBncm91cHMgb2YgYmFzaWMgcmVsb2NhdGlvbnMuICBGSVhNRTogIFRoZXNlIHNob3VsZAotICAgYmUgdGhlIG9ubHkgYmFzaWMgcmVsb2NhdGlvbnMgY3JlYXRlZCBieSBHQVMuICBUaGUgcmVzdAotICAgc2hvdWxkIGJlIGludGVybmFsIHRvIHRoZSBCRkQgYmFja2VuZC4KLQotICAgVGhlIGlkZWEgaXMgYm90aCBTT00gYW5kIEVMRiBkZWZpbmUgdGhlc2UgYmFzaWMgcmVsb2NhdGlvbgotICAgdHlwZXMgc28gdGhleSBtYXAgaW50byBhIFNPTSBvciBFTEYgc3BlY2lmaWMgcmVsb2F0aW9uIGFzCi0gICBhcHByb3ByaWF0ZS4gIFRoaXMgYWxsb3dzIEdBUyB0byBzaGFyZSBtdWNoIG1vcmUgY29kZSAKLSAgIGJldHdlZW4gdGhlIHR3byBvYmplY3QgZm9ybWF0cy4gICovCi0KLSNkZWZpbmUgUl9IUFBBX05PTkUJCQlSX05PX1JFTE9DQVRJT04KLSNkZWZpbmUJUl9IUFBBCQkJCVJfQ09ERV9PTkVfU1lNQk9MCi0jZGVmaW5lCVJfSFBQQV9QQ1JFTF9DQUxMCQlSX1BDUkVMX0NBTEwKLSNkZWZpbmUgUl9IUFBBX0FCU19DQUxMCQkJUl9BQlNfQ0FMTAotI2RlZmluZQlSX0hQUEFfR09UT0ZGCQkJUl9EUF9SRUxBVElWRQotI2RlZmluZSBSX0hQUEFfRU5UUlkJCQlSX0VOVFJZCi0jZGVmaW5lIFJfSFBQQV9FWElUCQkJUl9FWElUCi0jZGVmaW5lIFJfSFBQQV9DT01QTEVYCQkJUl9DT01QMQotI2RlZmluZSBSX0hQUEFfQkVHSU5fQlJUQUIJCVJfQkVHSU5fQlJUQUIKLSNkZWZpbmUgUl9IUFBBX0VORF9CUlRBQgkJUl9FTkRfQlJUQUIKLSNkZWZpbmUgUl9IUFBBX0JFR0lOX1RSWQkJUl9CRUdJTl9UUlkKLSNkZWZpbmUgUl9IUFBBX0VORF9UUlkJCQlSX0VORF9UUlkKLQotLyogRXhwb3J0ZWQgZnVuY3Rpb25zLCBtb3N0bHkgZm9yIHVzZSBieSBHQVMuICAqLwotYm9vbGVhbiBiZmRfc29tX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgaW50LCBpbnQsCi0JCQkJCQl1bnNpZ25lZCBpbnQsIGludCkpOwotYm9vbGVhbiBiZmRfc29tX3NldF9zdWJzZWN0aW9uX2F0dHJpYnV0ZXMgUEFSQU1TICgoYXNlY3Rpb24gKiwgYXNlY3Rpb24gKiwKLQkJCQkJCSAgIGludCwgdW5zaWduZWQgaW50LCBpbnQpKTsKLXZvaWQgYmZkX3NvbV9zZXRfc3ltYm9sX3R5cGUgUEFSQU1TICgoYXN5bWJvbCAqLCB1bnNpZ25lZCBpbnQpKTsKLWJvb2xlYW4gYmZkX3NvbV9hdHRhY2hfYXV4X2hkciBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKLWludCAqKiBocHBhX3NvbV9nZW5fcmVsb2NfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgaW50LCBpbnQsIGVudW0gaHBwYV9yZWxvY19maWVsZF9zZWxlY3Rvcl90eXBlX2FsdCwKLQkgICBpbnQsIGFzeW1ib2wgKikpOwotYm9vbGVhbiBiZmRfc29tX2F0dGFjaF9jb21waWxhdGlvbl91bml0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQotI2VuZGlmIC8qIF9TT01fSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbGludXguYyBiL2JmZC9zcGFyY2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZDRlN2UuLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDc3MCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIGxpbnV4IGZsYXZvcmVkIHNwYXJjIGEub3V0IGJpbmFyaWVzLgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LAotVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFICAgICAgICA0MDk2Ci0jZGVmaW5lIFpNQUdJQ19ESVNLX0JMT0NLX1NJWkUgMTAyNAotI2RlZmluZSBTRUdNRU5UX1NJWkUgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgICAgICAgIDB4MAotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLQotI2RlZmluZSBNQUNIVFlQRV9PSyhtdHlwZSkgKChtdHlwZSkgPT0gTV9TUEFSQyB8fCAobXR5cGUpID09IE1fVU5LTk9XTikKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgImFvdXQvYXIuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiICAgICAgICAgICAvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNsaW51eF8sT1ApCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXNwYXJjLWxpbnV4IgotCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBNWSh2ZWMpOwotCi0vKiBXZSBhbHdheXMgZ2VuZXJhdGUgUU1BR0lDIGZpbGVzIGluIHByZWZlcmVuY2UgdG8gWk1BR0lDIGZpbGVzLiAgSXQKLSAgIHdvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyBhIGxpbmtlciBvcHRpb24sIGlmIHRoYXQgZXZlcgotICAgYmVjb21lcyBpbXBvcnRhbnQuICAqLwotCi1zdGF0aWMgdm9pZCBNWV9maW5hbF9saW5rX2NhbGxiYWNrCi0gIFBBUkFNUyAoKGJmZCAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqLCBmaWxlX3B0ciAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNwYXJjbGludXhfYmZkX2ZpbmFsX2xpbmsKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbykpOwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNsaW51eF9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgb2JqX2FvdXRfc3ViZm9ybWF0IChhYmZkKSA9IHFfbWFnaWNfZm9ybWF0OwotICByZXR1cm4gTkFNRShhb3V0LGZpbmFsX2xpbmspIChhYmZkLCBpbmZvLCBNWV9maW5hbF9saW5rX2NhbGxiYWNrKTsKLX0KLQotI2RlZmluZSBNWV9iZmRfZmluYWxfbGluayBzcGFyY2xpbnV4X2JmZF9maW5hbF9saW5rCi0KLS8qIFNldCB0aGUgbWFjaGluZSB0eXBlIGNvcnJlY3RseS4gICovCi0KLXN0YXRpYyBib29sZWFuIHNwYXJjbGludXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNsaW51eF93cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGV4dGVybmFsX2V4ZWMgZXhlY19ieXRlczsKLSAgc3RydWN0IGludGVybmFsX2V4ZWMgKmV4ZWNwID0gZXhlY19oZHIgKGFiZmQpOwotCi0gIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fU1BBUkMpOwotCi0gIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotCi0gIFdSSVRFX0hFQURFUlMoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3dyaXRlX29iamVjdF9jb250ZW50cyBzcGFyY2xpbnV4X3dyaXRlX29iamVjdF9jb250ZW50cwotLyogQ29kZSB0byBsaW5rIGFnYWluc3QgTGludXggYS5vdXQgc2hhcmVkIGxpYnJhcmllcy4gICovCi0KLS8qIFNlZSBpZiBhIHN5bWJvbCBuYW1lIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLQotI2lmbmRlZiBHT1RfUkVGX1BSRUZJWAotI2RlZmluZSAgICAgICAgR09UX1JFRl9QUkVGSVggICJfX0dPVF8iCi0jZW5kaWYKLQotI2RlZmluZSBJU19HT1RfU1lNKG5hbWUpIFwKLSAgKHN0cm5jbXAgKG5hbWUsIEdPVF9SRUZfUFJFRklYLCBzaXplb2YgR09UX1JFRl9QUkVGSVggLSAxKSA9PSAwKQotCi0vKiBTZWUgaWYgYSBzeW1ib2wgbmFtZSBpcyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuICovCi0KLSNpZm5kZWYgUExUX1JFRl9QUkVGSVgKLSNkZWZpbmUgICAgICAgIFBMVF9SRUZfUFJFRklYICAiX19QTFRfIgotI2VuZGlmCi0KLSNkZWZpbmUgSVNfUExUX1NZTShuYW1lKSBcCi0gIChzdHJuY21wIChuYW1lLCBQTFRfUkVGX1BSRUZJWCwgc2l6ZW9mIFBMVF9SRUZfUFJFRklYIC0gMSkgPT0gMCkKLQotLyogVGhpcyBzdHJpbmcgaXMgdXNlZCB0byBnZW5lcmF0ZSBzcGVjaWFsaXplZCBlcnJvciBtZXNzYWdlcy4gICovCi0KLSNpZm5kZWYgTkVFRFNfU0hSTElCCi0jZGVmaW5lIE5FRURTX1NIUkxJQiAiX19ORUVEU19TSFJMSUJfIgotI2VuZGlmCi0KLS8qIFRoaXMgc3BlY2lhbCBzeW1ib2wgaXMgYSBzZXQgdmVjdG9yIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mCi0gICBwb2ludGVycyB0byBmaXh1cCB0YWJsZXMuICBJdCB3aWxsIGJlIHByZXNlbnQgaW4gYW55IGR5bmFtaWNseQotICAgbGlua2VkIGZpbGUuICBUaGUgbGlua2VyIGdlbmVyYXRlZCBmaXh1cCB0YWJsZSBzaG91bGQgYWxzbyBiZSBhZGRlZAotICAgdG8gdGhlIGxpc3QsIGFuZCBpdCBzaG91bGQgYWx3YXlzIGFwcGVhciBpbiB0aGUgc2Vjb25kIHNsb3QgKHRoZQotICAgZmlyc3Qgb25lIGlzIGEgZHVtbXkgd2l0aCBhIG1hZ2ljIG51bWJlciB0aGF0IGlzIGRlZmluZWQgaW4KLSAgIGNydDAubykuICAqLwotCi0jaWZuZGVmIFNIQVJBQkxFX0NPTkZMSUNUUwotI2RlZmluZSBTSEFSQUJMRV9DT05GTElDVFMgIl9fU0hBUkFCTEVfQ09ORkxJQ1RTX18iCi0jZW5kaWYKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgZml4dXBzLiAgVGhlIHRlcm1pbm9sb2d5IGlzIGEgYml0IHN0cmFuZ2UsIGJ1dAotICAgZWFjaCBmaXh1cCBjb250YWlucyB0d28gMzIgYml0IG51bWJlcnMuICBBIHJlZ3VsYXIgZml4dXAgY29udGFpbnMKLSAgIGFuIGFkZHJlc3MgYW5kIGEgcG9pbnRlciwgYW5kIGF0IHJ1bnRpbWUgd2Ugc2hvdWxkIHN0b3JlIHRoZQotICAgYWRkcmVzcyBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgcG9pbnRlci4gIEEgYnVpbHRpbiBmaXh1cAotICAgY29udGFpbnMgdHdvIHBvaW50ZXJzLCBhbmQgd2Ugc2hvdWxkIHJlYWQgdGhlIGFkZHJlc3MgdXNpbmcgb25lCi0gICBwb2ludGVyIGFuZCBzdG9yZSBpdCBhdCB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgb3RoZXIKLSAgIHBvaW50ZXIuICBCdWlsdGluIGZpeHVwcyBjb21lIGludG8gcGxheSB3aGVuIHdlIGhhdmUgZHVwbGljYXRlCi0gICBfX0dPVF9fIHN5bWJvbHMgZm9yIHRoZSBzYW1lIHZhcmlhYmxlLiAgVGhlIGJ1aWx0aW4gZml4dXAgd2lsbCBjb3B5Ci0gICB0aGUgR09UIHBvaW50ZXIgZnJvbSBvbmUgb3ZlciBpbnRvIHRoZSBvdGhlci4gICovCi0KLXN0cnVjdCBmaXh1cAotewotICBzdHJ1Y3QgZml4dXAgKm5leHQ7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEganVtcCBpbnN0cnVjdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGZpeGVkLAotICAgICB6ZXJvIGlmIHRoaXMgaXMganVzdCBhIHBvaW50ZXIgKi8KLSAgY2hhciBqdW1wOwotCi0gIGNoYXIgYnVpbHRpbjsKLX07Ci0KLS8qIFdlIGRvbid0IG5lZWQgYSBzcGVjaWFsIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLCBidXQgd2UgZG8gbmVlZAotICAgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGJldHdlZW4gbGlua2VyIHBhc3Nlcywgc28gd2UgdXNlIGEgc3BlY2lhbAotICAgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci19OwotCi1zdHJ1Y3QgbGludXhfbGlua19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF90YWJsZSByb290OwotCi0gIC8qIEZpcnN0IGR5bmFtaWMgb2JqZWN0IGZvdW5kIGluIGxpbmsuICAqLwotICBiZmQgKmR5bm9iajsKLQotICAvKiBOdW1iZXIgb2YgZml4dXBzLiAgKi8KLSAgc2l6ZV90IGZpeHVwX2NvdW50OwotCi0gIC8qIE51bWJlciBvZiBidWlsdGluIGZpeHVwcy4gICovCi0gIHNpemVfdCBsb2NhbF9idWlsdGluczsKLQotICAvKiBMaXN0IG9mIGZpeHVwcy4gICovCi0gIHN0cnVjdCBmaXh1cCAqZml4dXBfbGlzdDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmxpbnV4X2xpbmtfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKmxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSAgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBzdHJ1Y3QgZml4dXAgKm5ld19maXh1cAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICosCi0gICAgICAgICAgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBsaW51eF9hZGRfb25lX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgY29uc3QgY2hhciAqLCBmbGFnd29yZCwgYXNlY3Rpb24gKiwKLSAgICAgICAgICBiZmRfdm1hLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sCi0gICAgICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiopKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X3RhbGx5X3N5bWJvbHMKLSAgUEFSQU1TICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi1saW51eF9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICAgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgICBOQU1FKGFvdXQsbGlua19oYXNoX25ld2Z1bmMpICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkczsgdGhlcmUgYXJlbid0IGFueS4gICovCi0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgTGludXggbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLWxpbnV4X2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKQotICAgICAgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IGxpbnV4X2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eF9saW5rX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmZpeHVwX2NvdW50ID0gMDsKLSAgcmV0LT5sb2NhbF9idWlsdGlucyA9IDA7Ci0gIHJldC0+Zml4dXBfbGlzdCA9IE5VTEw7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIExpbnV4IGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgbGludXhfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYW91dF9saW5rX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSksXAotICAgICAgICAgICAgICAgICAgICAgICAgIChmb2xsb3cpKSkKLQotLyogVHJhdmVyc2UgYSBMaW51eCBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGxpbnV4X2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykgICAgICAgICAgICAgICAgICAgIFwKLSAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgKCYodGFibGUpLT5yb290LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLCBcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBMaW51eCBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgbGludXhfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBsaW51eF9saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLS8qIFN0b3JlIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBuZXcgZml4dXAuICAqLwotCi1zdGF0aWMgc3RydWN0IGZpeHVwICoKLW5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsIGJ1aWx0aW4pCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBpbnQgYnVpbHRpbjsKLXsKLSAgc3RydWN0IGZpeHVwICpmOwotCi0gIGYgPSAoc3RydWN0IGZpeHVwICopIGJmZF9oYXNoX2FsbG9jYXRlICgmaW5mby0+aGFzaC0+dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoc3RydWN0IGZpeHVwKSk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgcmV0dXJuIGY7Ci0gIGYtPm5leHQgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3QgPSBmOwotICBmLT5oID0gaDsKLSAgZi0+dmFsdWUgPSB2YWx1ZTsKLSAgZi0+YnVpbHRpbiA9IGJ1aWx0aW47Ci0gIGYtPmp1bXAgPSAwOwotICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIFdlIGNvbWUgaGVyZSBvbmNlIHdlIHJlYWxpemUgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gbGluayB0byBhIHNoYXJlZAotICAgbGlicmFyeS4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBzZWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCi0gICBmaXh1cCB0YWJsZSwgYW5kIHdlIHVsdGltYXRlbHkgbmVlZCB0byBhZGQgYSBwb2ludGVyIHRvIHRoaXMgaW50bwotICAgdGhlIHNldCB2ZWN0b3IgZm9yIFNIQVJBQkxFX0NPTkZMSUNUUy4gIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90Ci0gICBrbm93IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uLCBidXQgdGhhdCdzIE9LIC0gd2UganVzdCBuZWVkIHRvCi0gICBjcmVhdGUgaXQgZm9yIG5vdy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgcmVnaXN0ZXIgYXNlY3Rpb24gKnM7Ci0KLSAgLyogTm90ZSB0aGF0IHdlIHNldCB0aGUgU0VDX0lOX01FTU9SWSBmbGFnLiAgKi8KLSAgZmxhZ3MgPSBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCi0gIC8qIFdlIGNob29zZSB0byB1c2UgdGhlIG5hbWUgIi5saW51eC1keW5hbWljIiBmb3IgdGhlIGZpeHVwIHRhYmxlLgotICAgICBXaHkgbm90PyAqLwotICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5saW51eC1keW5hbWljIik7Ci0gIGlmIChzID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzLT5fcmF3X3NpemUgPSAwOwotICBzLT5jb250ZW50cyA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGFkZCBhIHNpbmdsZSBzeW1ib2wgdG8gdGhlIGxpbmtlciBoYXNoIHRhYmxlLiAgVGhpcyBpcwotICAgYSB3cmFwcGVyIGFyb3VuZCBfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbCB3aGljaCBoYW5kbGVzIHRoZQotICAgdHdlYWtpbmcgbmVlZGVkIGZvciBkeW5hbWljIGxpbmtpbmcgc3VwcG9ydC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1saW51eF9hZGRfb25lX3N5bWJvbCAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICBjb3B5LCBjb2xsZWN0LCBoYXNocCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGJvb2xlYW4gY29weTsKLSAgICAgYm9vbGVhbiBjb2xsZWN0OwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKmhhc2hwOwotewotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoOwotICBib29sZWFuIGluc2VydDsKLQotICAvKiBMb29rIHVwIGFuZCBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIHRoaXMgc3ltYm9sIGluIHRoZSBoYXNoIHRhYmxlLgotICAgICBJZiB3ZSBkbywgYW5kIHRoZSBkZWZpbmluZyBlbnRyeSBpcyBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIHdlCi0gICAgIG5lZWQgdG8gY3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zLgotCi0gICAgIEZJWE1FOiBXaGF0IGlmIGFiZmQtPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcj8gIFdlIG1heSB3YW50IHRvCi0gICAgIGJlIGFibGUgdG8gbGluayBMaW51eCBhLm91dCBhbmQgRUxGIG9iamVjdHMgdG9nZXRoZXIsIGJ1dCBzZXJpb3VzCi0gICAgIGNvbmZ1c2lvbiBpcyBwb3NzaWJsZS4gICovCi0KLSAgaW5zZXJ0ID0gZmFsc2U7Ci0KLSAgaWYgKCEgaW5mby0+cmVsb2NhdGVhYmxlCi0gICAgICAmJiBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID09IE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgU0hBUkFCTEVfQ09ORkxJQ1RTKSA9PSAwCi0gICAgICAmJiAoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLSAgICAgICYmIGFiZmQtPnh2ZWMgPT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLSAgICB7Ci0gICAgICBpZiAoISBsaW51eF9saW5rX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvKSkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqID0gYWJmZDsKLSAgICAgIGluc2VydCA9IHRydWU7Ci0gICAgfQotCi0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlY3Rpb24pCi0gICAgICAmJiBhYmZkLT54dmVjID09IGluZm8tPmhhc2gtPmNyZWF0b3IpCi0gICAgewotICAgICAgaCA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMCi0gICAgICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgfHwgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLSAgICAgICB7Ci0gICAgICAgICBzdHJ1Y3QgZml4dXAgKmY7Ci0KLSAgICAgICAgIGlmIChoYXNocCAhPSBOVUxMKQotICAgICAgICAgICAqaGFzaHAgPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgaDsKLQotICAgICAgICAgZiA9IG5ld19maXh1cCAoaW5mbywgaCwgdmFsdWUsICEgSVNfUExUX1NZTSAobmFtZSkpOwotICAgICAgICAgaWYgKGYgPT0gTlVMTCkKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgZi0+anVtcCA9IElTX1BMVF9TWU0gKG5hbWUpOwotCi0gICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICB9Ci0gICAgfQotCi0gIC8qIERvIHRoZSB1c3VhbCBwcm9jZWR1cmUgZm9yIGFkZGluZyBhIHN5bWJvbC4gICovCi0gIGlmICghIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHN0cmluZywgY29weSwgY29sbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBJbnNlcnQgYSBwb2ludGVyIHRvIG91ciB0YWJsZSBpbiB0aGUgc2V0IHZlY3Rvci4gIFRoZSBkeW5hbWljCi0gICAgIGxpbmtlciByZXF1aXJlcyB0aGlzIGluZm9ybWF0aW9uICovCi0gIGlmIChpbnNlcnQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIC8qIEhlcmUgd2UgZG8gb3VyIHNwZWNpYWwgdGhpbmcgdG8gYWRkIHRoZSBwb2ludGVyIHRvIHRoZQotICAgICAgICBkeW5hbWljIHNlY3Rpb24gaW4gdGhlIFNIQVJBQkxFX0NPTkZMSUNUUyBzZXQgdmVjdG9yLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0KLSAgICAgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotICAgICAgICAgICAgKGluZm8sIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosIFNIQVJBQkxFX0NPTkZMSUNUUywKLSAgICAgICAgICAgICBCU0ZfR0xPQkFMIHwgQlNGX0NPTlNUUlVDVE9SLCBzLCAwLCBOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpKSkKLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB3aWxsIGNyYXdsIHRoZSBoYXNoIHRhYmxlIGFuZCBjb21lIGhlcmUgZm9yIGV2ZXJ5IGdsb2JhbCBzeW1ib2wuCi0gICBXZSB3aWxsIGV4YW1pbmUgZWFjaCBlbnRyeSBhbmQgc2VlIGlmIHRoZXJlIGFyZSBpbmRpY2F0aW9ucyB0aGF0IHdlCi0gICBuZWVkIHRvIGFkZCBhIGZpeHVwLiAgVGhlcmUgYXJlIHR3byBwb3NzaWJsZSBjYXNlcyAtIG9uZSBpcyB3aGVyZQotICAgeW91IGhhdmUgZHVwbGljYXRlIGRlZmluaXRpb25zIG9mIFBMVCBvciBHT1Qgc3ltYm9scyAtIHRoZXNlIHdpbGwKLSAgIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodCBhbmQgYWRkZWQgYXMgImJ1aWx0aW4iIGZpeHVwcy4gIElmIHdlIGZpbmQKLSAgIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbm9uIFBMVC9HT1Qgc3ltYm9sIGlzIGFsc28gcHJlc2VudCwgd2UKLSAgIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyIGZpeHVwIGluc3RlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHZpYSBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfdGFsbHlfc3ltYm9scyAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGxpbnV4X2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0gIHN0cnVjdCBmaXh1cCAqZiwgKmYxOwotICBpbnQgaXNfcGx0OwotICBzdHJ1Y3QgbGludXhfbGlua19oYXNoX2VudHJ5ICpoMSwgKmgyOwotICBib29sZWFuIGV4aXN0czsKLQotICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICYmIHN0cm5jbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgTkVFRFNfU0hSTElCLAotICAgICAgICAgICAgICAgICBzaXplb2YgTkVFRFNfU0hSTElCIC0gMSkgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciAqcDsKLSAgICAgIGNoYXIgKmFsbG9jID0gTlVMTDsKLQotICAgICAgbmFtZSA9IGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyArIHNpemVvZiBORUVEU19TSFJMSUIgLSAxOwotICAgICAgcCA9IHN0cnJjaHIgKG5hbWUsICdfJyk7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotICAgICAgIGFsbG9jID0gKGNoYXIgKikgYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotCi0gICAgICBpZiAocCA9PSBOVUxMIHx8IGFsbG9jID09IE5VTEwpCi0gICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPdXRwdXQgZmlsZSByZXF1aXJlcyBzaGFyZWQgbGlicmFyeSBgJXMnXG4iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHN0cmNweSAoYWxsb2MsIG5hbWUpOwotICAgICAgICAgcCA9IHN0cnJjaHIgKGFsbG9jLCAnXycpOwotICAgICAgICAgKnArKyA9ICdcMCc7Ci0gICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgKF8oIk91dHB1dCBmaWxlIHJlcXVpcmVzIHNoYXJlZCBsaWJyYXJ5IGAlcy5zby4lcydcbiIpLAotICAgICAgICAgICAgYWxsb2MsIHApOwotICAgICAgICAgZnJlZSAoYWxsb2MpOwotICAgICAgIH0KLQotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIG5vdCBhIFBMVC9HT1QsIHdlIGRvIG5vdCBldmVuIG5lZWQgdG8gbG9vayBhdAotICAgICBpdC4gICovCi0gIGlzX3BsdCA9IElTX1BMVF9TWU0gKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0KLSAgaWYgKGlzX3BsdCB8fCBJU19HT1RfU1lNIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcpKQotICAgIHsKLSAgICAgIC8qIExvb2sgdXAgdGhpcyBzeW1ib2wgdHdpY2UuICBPbmNlIGp1c3QgYXMgYSByZWd1bGFyIGxvb2t1cCwKLSAgICAgICAgYW5kIHRoZW4gYWdhaW4gZm9sbG93aW5nIGFsbCBvZiB0aGUgaW5kaXJlY3QgbGlua3MgdW50aWwgd2UKLSAgICAgICAgcmVhY2ggYSByZWFsIHN5bWJvbC4gICovCi0gICAgICBoMSA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotICAgICAgLyogaDIgZG9lcyBub3QgZm9sbG93IGluZGlyZWN0IHN5bWJvbHMuICovCi0gICAgICBoMiA9IGxpbnV4X2xpbmtfaGFzaF9sb29rdXAgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5yb290LnJvb3Qucm9vdC5zdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YgUExUX1JFRl9QUkVGSVggLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICAgICAgLyogVGhlIHJlYWwgc3ltYm9sIG11c3QgZXhpc3QgYnV0IGlmIGl0IGlzIGFsc28gYW4gQUJTIHN5bWJvbCwKLSAgICAgICAgdGhlcmUgaXMgbm8gbmVlZCB0byBoYXZlIGEgZml4dXAuICBUaGlzIGlzIGJlY2F1c2UgdGhleSBib3RoCi0gICAgICAgIGNhbWUgZnJvbSB0aGUgc2FtZSBsaWJyYXJ5LiAgSWYgb24gdGhlIG90aGVyIGhhbmQsIHdlIGhhZCB0bwotICAgICAgICB1c2UgYW4gaW5kaXJlY3Qgc3ltYm9sIHRvIGdldCB0byB0aGUgcmVhbCBzeW1ib2wsIHdlIGFkZCB0aGUKLSAgICAgICAgZml4dXAgYW55d2F5LCBzaW5jZSB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlc2Ugc3ltYm9scyBjb21lCi0gICAgICAgIGZyb20gZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJpZXMgKi8KLSAgICAgIGlmIChoMSAhPSBOVUxMCi0gICAgICAgICAmJiAoKChoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICAgICAgICB8fCBoMS0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgICAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAoaDEtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uKSkKLSAgICAgICAgICAgICB8fCBoMi0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCkpCi0gICAgICAgewotICAgICAgICAgLyogU2VlIGlmIHRoZXJlIGlzIGEgImJ1aWx0aW4iIGZpeHVwIGFscmVhZHkgcHJlc2VudAotICAgICAgICAgICAgaW52b2x2aW5nIHRoaXMgc3ltYm9sLiAgSWYgc28sIGNvbnZlcnQgaXQgdG8gYSByZWd1bGFyCi0gICAgICAgICAgICBmaXh1cC4gIEluIHRoZSBlbmQsIHRoaXMgcmVsYXhlcyBzb21lIG9mIHRoZSByZXF1aXJlbWVudHMKLSAgICAgICAgICAgIGFib3V0IHRoZSBvcmRlciBvZiBwZXJmb3JtaW5nIGZpeHVwcy4gICovCi0gICAgICAgICBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgIGZvciAoZjEgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsKLSAgICAgICAgICAgICAgZjEgIT0gTlVMTDsKLSAgICAgICAgICAgICAgZjEgPSBmMS0+bmV4dCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgIGlmICgoZjEtPmggIT0gaCAmJiBmMS0+aCAhPSBoMSkKLSAgICAgICAgICAgICAgICAgfHwgKCEgZjEtPmJ1aWx0aW4gJiYgISBmMS0+anVtcCkpCi0gICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICBpZiAoZjEtPmggPT0gaDEpCi0gICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICAgaWYgKCEgZXhpc3RzCi0gICAgICAgICAgICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgZjEtPmgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSwgMCk7Ci0gICAgICAgICAgICAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZjEtPmggPSBoMTsKLSAgICAgICAgICAgICBmMS0+anVtcCA9IGlzX3BsdDsKLSAgICAgICAgICAgICBmMS0+YnVpbHRpbiA9IDA7Ci0gICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgICAgaWYgKCEgZXhpc3RzCi0gICAgICAgICAgICAgJiYgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICBmID0gbmV3X2ZpeHVwIChpbmZvLCBoMSwgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlLCAwKTsKLSAgICAgICAgICAgICBpZiAoZiA9PSBOVUxMKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAvKiBGSVhNRTogTm8gd2F5IHRvIHJldHVybiBlcnJvci4gICovCi0gICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIGYtPmp1bXAgPSBpc19wbHQ7Ci0gICAgICAgICAgIH0KLSAgICAgICB9Ci0KLSAgICAgIC8qIFF1aWNrIGFuZCBkaXJ0eSB3YXkgb2Ygc3RyaXBwaW5nIHRoZXNlIHN5bWJvbHMgZnJvbSB0aGUKLSAgICAgICAgc3ltdGFiLiAqLwotICAgICAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24pKQotICAgICAgIGgtPnJvb3Qud3JpdHRlbiA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIC5saW51eC1keW5hbWljIHNlY3Rpb24gaXMuCi0gICBJdCBpcyBjYWxsZWQgYnkgdGhlIExpbnV4IGxpbmtlciBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24KLSAgIHJvdXRpbmUuICBXZSBoYXZlIGZpbmlzaGVkIHJlYWRpbmcgYWxsIG9mIHRoZSBpbnB1dCBmaWxlcywgYW5kIG5vdwotICAgd2UganVzdCBzY2FuIHRoZSBoYXNoIHRhYmxlcyB0byBmaW5kIG91dCBob3cgbWFueSBhZGRpdGlvbmFsIGZpeHVwcwotICAgYXJlIHJlcXVpcmVkLiAgKi8KLQotYm9vbGVhbgotYmZkX3NwYXJjbGludXhfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCBpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBzdHJ1Y3QgZml4dXAgKmY7Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmIChvdXRwdXRfYmZkLT54dmVjICE9ICZNWSh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIEZpcnN0IGZpbmQgdGhlIGZpeHVwcy4uLiAqLwotICBsaW51eF9saW5rX2hhc2hfdHJhdmVyc2UgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGludXhfdGFsbHlfc3ltYm9scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChQVFIpIGluZm8pOwotCi0gIC8qIElmIHRoZXJlIGFyZSBidWlsdGluIGZpeHVwcywgbGVhdmUgcm9vbSBmb3IgYSBtYXJrZXIuICBUaGlzIGlzCi0gICAgIHVzZWQgYnkgdGhlIGR5bmFtaWMgbGlua2VyIHNvIHRoYXQgaXQga25vd3MgdGhhdCBhbGwgdGhhdCBmb2xsb3cKLSAgICAgYXJlIGJ1aWx0aW4gZml4dXBzIGluc3RlYWQgb2YgcmVndWxhciBmaXh1cHMuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLSAgICAgICB7Ci0gICAgICAgICArK2xpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudDsKLSAgICAgICAgICsrbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmxvY2FsX2J1aWx0aW5zOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiAwKQotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZml4dXAgdGFibGUuICBXZSB3aWxsIGZpbGwgaXQgaW4gbGF0ZXIuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmxpbnV4LWR5bmFtaWMiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzLT5fcmF3X3NpemUgPSA4ICsgbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICogODsKLSAgICAgIHMtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgcy0+X3Jhd19zaXplKTsKLSAgICAgIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIG1lbXNldCAocy0+Y29udGVudHMsIDAsIChzaXplX3QpIHMtPl9yYXdfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSBjb21lIGhlcmUgb25jZSB3ZSBhcmUgcmVhZHkgdG8gYWN0dWFsbHkgd3JpdGUgdGhlIGZpeHVwIHRhYmxlIHRvCi0gICB0aGUgb3V0cHV0IGZpbGUuICBTY2FuIHRoZSBmaXh1cCB0YWJsZXMgYW5kIHNvIGZvcnRoIGFuZCBnZW5lcmF0ZQotICAgdGhlIHN0dWZmIHdlIG5lZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbGludXhfZmluaXNoX2R5bmFtaWNfbGluayAob3V0cHV0X2JmZCwgaW5mbykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKnMsICpvcywgKmlzOwotICBiZmRfYnl0ZSAqZml4dXBfdGFibGU7Ci0gIHN0cnVjdCBsaW51eF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIHN0cnVjdCBmaXh1cCAqZjsKLSAgdW5zaWduZWQgaW50IG5ld19hZGRyOwotICBpbnQgc2VjdGlvbl9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBmaXh1cHNfd3JpdHRlbjsKLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiA9PSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubGludXgtZHluYW1pYyIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBvcyA9IHMtPm91dHB1dF9zZWN0aW9uOwotICBmaXh1cHNfd3JpdHRlbiA9IDA7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gIHByaW50ZiAoIkZpeHVwIHRhYmxlIGZpbGUgb2Zmc2V0OiAleCAgVk1BOiAleFxuIiwKLSAgICAgICAgIG9zLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLSAgICAgICAgIG9zLT52bWEgKyBzLT5vdXRwdXRfb2Zmc2V0KTsKLSNlbmRpZgotCi0gIGZpeHVwX3RhYmxlID0gcy0+Y29udGVudHM7Ci0gIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGxpbnV4X2hhc2hfdGFibGUgKGluZm8pLT5maXh1cF9jb3VudCwgZml4dXBfdGFibGUpOwotICBmaXh1cF90YWJsZSArPSA0OwotCi0gIC8qIEZpbGwgaW4gZml4dXAgdGFibGUuICAqLwotICBmb3IgKGYgPSBsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfbGlzdDsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+YnVpbHRpbikKLSAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKGYtPmgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgJiYgZi0+aC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgIHsKLSAgICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotICAgICAgICAgICAoXygiU3ltYm9sICVzIG5vdCBkZWZpbmVkIGZvciBmaXh1cHNcbiIpLAotICAgICAgICAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgIH0KLQotICAgICAgaXMgPSBmLT5oLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fb2Zmc2V0ID0gaXMtPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpcy0+b3V0cHV0X29mZnNldDsKLSAgICAgIG5ld19hZGRyID0gZi0+aC0+cm9vdC5yb290LnUuZGVmLnZhbHVlICsgc2VjdGlvbl9vZmZzZXQ7Ci0KLSNpZmRlZiBMSU5VWF9MSU5LX0RFQlVHCi0gICAgICBwcmludGYgKCJGaXh1cCglZCkgJXM6ICV4ICV4XG4iLGYtPmp1bXAsIGYtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0gICAgICAgICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICBpZiAoZi0+anVtcCkKLSAgICAgICB7Ci0gICAgICAgICAvKiBSZWxhdGl2ZSBhZGRyZXNzICovCi0gICAgICAgICBuZXdfYWRkciA9IG5ld19hZGRyIC0gKGYtPnZhbHVlICsgNSk7Ci0JIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZi0+dmFsdWUgKyAxLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICB7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgIH0KLSAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgfQotCi0gIGlmIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+bG9jYWxfYnVpbHRpbnMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBTcGVjaWFsIG1hcmtlciBzbyB3ZSBrbm93IHRvIHN3aXRjaCB0byB0aGUgb3RoZXIgdHlwZSBvZiBmaXh1cCAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIDAsIGZpeHVwX3RhYmxlKTsKLSAgICAgIGZpeHVwX3RhYmxlICs9IDQ7Ci0gICAgICArK2ZpeHVwc193cml0dGVuOwotICAgICAgZm9yIChmID0gbGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2xpc3Q7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0gICAgICAgewotICAgICAgICAgaWYgKCEgZi0+YnVpbHRpbikKLSAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgIGlmIChmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICAgICAgICAmJiBmLT5oLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLSAgICAgICAgICAgICAgIChfKCJTeW1ib2wgJXMgbm90IGRlZmluZWQgZm9yIGZpeHVwc1xuIiksCi0gICAgICAgICAgICAgICAgZi0+aC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgfQotCi0gICAgICAgICBpcyA9IGYtPmgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgICAgc2VjdGlvbl9vZmZzZXQgPSBpcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIGlzLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgICAgbmV3X2FkZHIgPSBmLT5oLT5yb290LnJvb3QudS5kZWYudmFsdWUgKyBzZWN0aW9uX29mZnNldDsKLQotI2lmZGVmIExJTlVYX0xJTktfREVCVUcKLSAgICAgICAgIHByaW50ZiAoIkZpeHVwKEIpICVzOiAleCAleFxuIiwgZi0+aC0+cm9vdC5yb290LnN0cmluZywKLSAgICAgICAgICAgICAgICAgbmV3X2FkZHIsIGYtPnZhbHVlKTsKLSNlbmRpZgotCi0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBuZXdfYWRkciwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIGYtPnZhbHVlLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgKytmaXh1cHNfd3JpdHRlbjsKLSAgICAgICB9Ci0gIH0KLQotICBpZiAobGludXhfaGFzaF90YWJsZSAoaW5mbyktPmZpeHVwX2NvdW50ICE9IGZpeHVwc193cml0dGVuKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiV2FybmluZzogZml4dXAgY291bnQgbWlzbWF0Y2hcbiIpKTsKLSAgICAgIHdoaWxlIChsaW51eF9oYXNoX3RhYmxlIChpbmZvKS0+Zml4dXBfY291bnQgPiBmaXh1cHNfd3JpdHRlbikKLSAgICAgICB7Ci0gICAgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAwLCBmaXh1cF90YWJsZSk7Ci0gICAgICAgICBmaXh1cF90YWJsZSArPSA0OwotICAgICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotICAgICAgICAgZml4dXBfdGFibGUgKz0gNDsKLSAgICAgICAgICsrZml4dXBzX3dyaXR0ZW47Ci0gICAgICAgfQotICAgIH0KLQotICBoID0gbGludXhfbGlua19oYXNoX2xvb2t1cCAobGludXhfaGFzaF90YWJsZSAoaW5mbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX0JVSUxUSU5fRklYVVBTX18iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQotICBpZiAoaCAhPSBOVUxMCi0gICAgICAmJiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotICAgIHsKLSAgICAgIGlzID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBzZWN0aW9uX29mZnNldCA9IGlzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaXMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBuZXdfYWRkciA9IGgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSArIHNlY3Rpb25fb2Zmc2V0OwotCi0jaWZkZWYgTElOVVhfTElOS19ERUJVRwotICAgICAgcHJpbnRmICgiQnVpbHRpbiBmaXh1cCB0YWJsZSBhdCAleFxuIiwgbmV3X2FkZHIpOwotI2VuZGlmCi0KLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIG5ld19hZGRyLCBmaXh1cF90YWJsZSk7Ci0gICAgfQotICBlbHNlCi0gICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgMCwgZml4dXBfdGFibGUpOwotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwgb3MtPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJmZF93cml0ZSAoKFBUUikgcy0+Y29udGVudHMsIDEsIHMtPl9yYXdfc2l6ZSwgb3V0cHV0X2JmZCkKLSAgICAgICE9IHMtPl9yYXdfc2l6ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgbGludXhfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfb25lX3N5bWJvbCBsaW51eF9hZGRfb25lX3N5bWJvbAotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIGxpbnV4X2ZpbmlzaF9keW5hbWljX2xpbmsKLQotI2RlZmluZSBNWV96bWFnaWNfY29udGlndW91cyAxCi0KLSNpbmNsdWRlICJhb3V0LXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvYmZkL3NwYXJjbHlueC5jIGIvYmZkL3NwYXJjbHlueC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmZjYWU1Li4wMDAwMDAwCi0tLSBhL2JmZC9zcGFyY2x5bnguYworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBCRkQgc3VwcG9ydCBmb3IgU3BhcmMgYmluYXJpZXMgdW5kZXIgTHlueE9TLgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgMAotI2RlZmluZSBCWVRFU19JTl9XT1JEIDQKLSNkZWZpbmUgTl9TSEFSRURfTElCKHgpIDAKLQotI2RlZmluZSBURVhUX1NUQVJUX0FERFIgMAotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDQwOTYKLSNkZWZpbmUgU0VHTUVOVF9TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUgREVGQVVMVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0KLSNlbmRpZgotCi0jZGVmaW5lIE1ZKE9QKSBDQVQoc3BhcmNseW54X2FvdXRfLE9QKQotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1seW54IgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJhb3V0L3N1bjQuaCIKLSNpbmNsdWRlICJsaWJhb3V0LmgiCQkvKiBCRkQgYS5vdXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzICovCi0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0KLS8qIFRoaXMgaXMgbmVlZGVkIHRvIHJlamVjdCBhIE5ld3NPUyBmaWxlLCBlLmcuIGluCi0gICBnZGIvdGVzdHN1aXRlL2dkYi50MTAvY3Jvc3Nsb2FkLmV4cC4gPGtpbmdkb25AY3lnbnVzLmNvbT4KLSAgIEkgbmVlZGVkIHRvIGFkZCBNX1VOS05PV04gdG8gcmVjb2duaXplIGEgNjgwMDAgb2JqZWN0LCBzbyB0aGlzIHdpbGwKLSAgIHByb2JhYmx5IG5vIGxvbmdlciByZWplY3QgYSBOZXdzT1Mgb2JqZWN0LiAgPGlhbkBjeWdudXMuY29tPi4gKi8KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpICgobXR5cGUpID09IE1fVU5LTk9XTiBcCi0JCQkgICAgfHwgKG10eXBlKSA9PSBNXzY4MDEwIFwKLQkJCSAgICB8fCAobXR5cGUpID09IE1fNjgwMjAgXAotCQkJICAgIHx8IChtdHlwZSkgPT0gTV9TUEFSQykKLQotLyoKLVRoZSBmaWxlIEBjb2Rle2FvdXRmMS5ofSBjb250YWlucyB0aGUgY29kZSBmb3IgQkZEJ3MKLWEub3V0IGJhY2sgZW5kLiBDb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBiYWNrIGVuZCBpcyBnaXZlbiBieSB0aGVzZQotdHdvIHByZXByb2Nlc3NvciBuYW1lczoKLUB0YWJsZSBAY29kZQotQGl0ZW0gQVJDSF9TSVpFCi1UaGlzIHZhbHVlIHNob3VsZCBiZSBlaXRoZXIgMzIgb3IgNjQsIGRlcGVuZGluZyB1cG9uIHRoZSBzaXplIG9mIGFuCi1pbnQgaW4gdGhlIHRhcmdldCBmb3JtYXQuIEl0IGNoYW5nZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3RzIHdoaWNoCi1wZXJmb3JtIHRoZSBtZW1vcnkvZGlzayBtYXBwaW5nIG9mIHN0cnVjdHVyZXMuCi0KLVRoZSA2NCBiaXQgYmFja2VuZCBtYXkgb25seSBiZSB1c2VkIGlmIHRoZSBob3N0IGNvbXBpbGVyIHN1cHBvcnRzIDY0Ci1pbnRzIChlZyBsb25nIGxvbmcgd2l0aCBnY2MpLCBieSBkZWZpbmluZyB0aGUgbmFtZSBAY29kZXtCRkRfSE9TVF82NF9CSVR9IGluIEBjb2Rle2JmZC5ofS4KLVdpdGggdGhpcyBuYW1lIGRlZmluZWQsIEBlbXBoe2FsbH0gYmZkIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCB3aXRoIDY0Yml0Ci1hcml0aG1ldGljLCBub3QganVzdCB0aG9zZSB0byBhIDY0Yml0IHRhcmdldC4KLQotQGl0ZW0gVEFSR0VUTkFNRQotVGhlIG5hbWUgcHV0IGludG8gdGhlIHRhcmdldCB2ZWN0b3IuCi1AaXRlbQotQGVuZCB0YWJsZQotCi0qLwotCi0vKlNVUFBSRVNTNTU4Ki8KLS8qU1VQUFJFU1M1MjkqLwotCi12b2lkCi1OQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkgKGFiZmQsIG1hY2h0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBtYWNodHlwZTsKLXsKLSAgLyogRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgdHlwZSBvZiB0aGUgb2JqZWN0IGZpbGUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgbG9uZyBtYWNoaW5lOwotICBzd2l0Y2ggKG1hY2h0eXBlKQotICAgIHsKLQotICAgIGNhc2UgTV9VTktOT1dOOgotICAgICAgLyogU29tZSBTdW4zcyBtYWtlIG1hZ2ljIG51bWJlcnMgd2l0aG91dCBjcHUgdHlwZXMgaW4gdGhlbSwgc28KLQkgd2UnbGwgZGVmYXVsdCB0byB0aGUgNjgwMDAuICovCi0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAxMDoKLSAgICBjYXNlIE1fSFAyMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV82ODAyMDoKLSAgICBjYXNlIE1fSFAzMDA6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSBiZmRfbWFjaF9tNjgwMjA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9TUEFSQzoKLSAgICAgIGFyY2ggPSBiZmRfYXJjaF9zcGFyYzsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMzg2OgotICAgIGNhc2UgTV8zODZfRFlOSVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfaTM4NjsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fMjlLOgotICAgICAgYXJjaCA9IGJmZF9hcmNoX2EyOWs7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0hQVVg6Ci0gICAgICBhcmNoID0gYmZkX2FyY2hfbTY4azsKLSAgICAgIG1hY2hpbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXJjaCA9IGJmZF9hcmNoX29ic2N1cmU7Ci0gICAgICBtYWNoaW5lID0gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2hpbmUpOwotfQotCi0jZGVmaW5lIFNFVF9BUkNIX01BQ0goQUJGRCwgRVhFQykgXAotICBOQU1FKGx5bngsc2V0X2FyY2hfbWFjaCkoQUJGRCwgTl9NQUNIVFlQRSAoRVhFQykpOyBcCi0gIGNob29zZV9yZWxvY19zaXplKEFCRkQpOwotCi0vKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSByZWxvY2F0aW9uIGVudHJ5LCBiYXNlZCBvbiB0aGUgYXJjaGl0ZWN0dXJlICovCi1zdGF0aWMgdm9pZAotY2hvb3NlX3JlbG9jX3NpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX0VYVF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9IFJFTE9DX1NURF9TSVpFOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBhbiBvYmplY3QgZmlsZSBpbiBMeW54T1MgZm9ybWF0LgotICBTZWN0aW9uIGNvbnRlbnRzIGhhdmUgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uICBXZSB3cml0ZSB0aGUKLSAgZmlsZSBoZWFkZXIsIHN5bWJvbHMsIGFuZCByZWxvY2F0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLU5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0ZXJuYWxfZXhlYyBleGVjX2J5dGVzOwotICBzdHJ1Y3QgaW50ZXJuYWxfZXhlYyAqZXhlY3AgPSBleGVjX2hkciAoYWJmZCk7Ci0KLSAgLyogTWFnaWMgbnVtYmVyLCBtYWVzdHJvLCBwbGVhc2UhICAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIHN3aXRjaCAoYmZkX2dldF9tYWNoIChhYmZkKSkKLQl7Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMTA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDEwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0JICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNXzY4MDIwKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1NQQVJDKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMzg2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfYTI5azoKLSAgICAgIE5fU0VUX01BQ0hUWVBFICgqZXhlY3AsIE1fMjlLKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOX1NFVF9NQUNIVFlQRSAoKmV4ZWNwLCBNX1VOS05PV04pOwotICAgIH0KLQotICBjaG9vc2VfcmVsb2Nfc2l6ZSAoYWJmZCk7Ci0KLSAgTl9TRVRfRkxBR1MgKCpleGVjcCwgYW91dF9iYWNrZW5kX2luZm8gKGFiZmQpLT5leGVjX2hkcl9mbGFncyk7Ci0KLSAgV1JJVEVfSEVBREVSUyAoYWJmZCwgZXhlY3ApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIE1ZX3NldF9zaXplcyBzcGFyY2x5bnhfc2V0X3NpemVzCi1zdGF0aWMgYm9vbGVhbgotc3BhcmNseW54X3NldF9zaXplcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwOwotICAgICAgYWRhdGEgKGFiZmQpLmV4ZWNfYnl0ZXNfc2l6ZSA9IEVYRUNfQllURVNfU0laRTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIGFkYXRhIChhYmZkKS5wYWdlX3NpemUgPSAweDIwMDA7Ci0gICAgICBhZGF0YSAoYWJmZCkuc2VnbWVudF9zaXplID0gMHgyMDAwMDsKLSAgICAgIGFkYXRhIChhYmZkKS5leGVjX2J5dGVzX3NpemUgPSBFWEVDX0JZVEVTX1NJWkU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYW91dF9iYWNrZW5kX2RhdGEgc3BhcmNseW54X2FvdXRfYmFja2VuZCA9Ci17Ci0gIDAsIDEsIDAsIDEsIDAsIHNwYXJjbHlueF9zZXRfc2l6ZXMsIDAsCi0gIDAsCQkJCS8qIGFkZF9keW5hbWljX3N5bWJvbHMgKi8KLSAgMCwJCQkJLyogYWRkX29uZV9zeW1ib2wgKi8KLSAgMCwJCQkJLyogbGlua19keW5hbWljX29iamVjdCAqLwotICAwLAkJCQkvKiB3cml0ZV9keW5hbWljX3N5bWJvbCAqLwotICAwLAkJCQkvKiBjaGVja19keW5hbWljX3JlbG9jICovCi0gIDAJCQkJLyogZmluaXNoX2R5bmFtaWNfbGluayAqLwotfTsKLQwKLQotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19zdGFydAkJYmZkX3ZvaWQKLSNkZWZpbmUgTVlfYmZkX2RlYnVnX2luZm9fZW5kCQliZmRfdm9pZAotI2RlZmluZSBNWV9iZmRfZGVidWdfaW5mb19hY2N1bXVsYXRlCVwKLQkJCSh2b2lkICgqKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqKSkpIGJmZF92b2lkCi0KLSNkZWZpbmUgTVlfd3JpdGVfb2JqZWN0X2NvbnRlbnRzCU5BTUUoYW91dCxzcGFyY2x5bnhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzKQotI2RlZmluZSBNWV9iYWNrZW5kX2RhdGEJCQkmc3BhcmNseW54X2FvdXRfYmFja2VuZAotCi0jZGVmaW5lIFRBUkdFVF9JU19CSUdfRU5ESUFOX1AKLQotI2lmZGVmIExZTlhfQ09SRQotCi1jaGFyICpseW54X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKCk7Ci1pbnQgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKCk7Ci1ib29sZWFuIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICgpOwotY29uc3QgYmZkX3RhcmdldCAqbHlueF9jb3JlX2ZpbGVfcCAoKTsKLQotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIGx5bnhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZAotI2RlZmluZQlNWV9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgbHlueF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwKLSNkZWZpbmUJTVlfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wIGx5bnhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wCi0jZGVmaW5lCU1ZX2NvcmVfZmlsZV9wIGx5bnhfY29yZV9maWxlX3AKLQotI2VuZGlmIC8qIExZTlhfQ09SRSAqLwotCi0jaW5jbHVkZSAiYW91dC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcGFyY25ldGJzZC5jIGIvYmZkL3NwYXJjbmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNzdiYjguLjAwMDAwMDAKLS0tIGEvYmZkL3NwYXJjbmV0YnNkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBCRkQgYmFjay1lbmQgZm9yIE5ldEJTRC9zcGFyYyBhLm91dC1pc2ggYmluYXJpZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQJNAotI2RlZmluZSBUQVJHRVRfSVNfQklHX0VORElBTl9QCi0KLS8qIFNQQVJDIGNoaXBzIHVzZSBlaXRoZXIgNEsgb3IgOEsgcGFnZXMsIGJ1dCBvYmplY3QgZmlsZXMgYWx3YXlzCi0gICBhc3N1bWUgOEsgcGFnZSBhbGlnbm1lbnQgc28gdGhleSB3aWxsIHdvcmsgb24gZWl0aGVyIG9uZS4gKi8KLSNkZWZpbmUgVEFSR0VUX1BBR0VfU0laRSAweDIwMDAKLQotI2RlZmluZSBERUZBVUxUX0FSQ0gJYmZkX2FyY2hfc3BhcmMKLSNkZWZpbmUgREVGQVVMVF9NSUQgCU1fU1BBUkNfTkVUQlNECi0KLSNkZWZpbmUgTVkoT1ApIENBVChzcGFyY25ldGJzZF8sT1ApCi0vKiBUaGlzIG5lZWRzIHRvIHN0YXJ0IHdpdGggYS5vdXQgc28gR0RCIGtub3dzIGl0IGlzIGFuIGEub3V0IHZhcmlhbnQuICAqLwotI2RlZmluZSBUQVJHRVROQU1FICJhLm91dC1zcGFyYy1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC9zcmVjLmMgYi9iZmQvc3JlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQyZjk2Li4wMDAwMDAwCi0tLSBhL2JmZC9zcmVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzc3ICswLDAgQEAKLS8qIEJGRCBiYWNrLWVuZCBmb3Igcy1yZWNvcmQgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydCA8c2FjQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TVUJTRUNUSU9OCi0JUy1SZWNvcmQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQkKLQlPcmRpbmFyeSBTLVJlY29yZHMgY2Fubm90IGhvbGQgYW55dGhpbmcgYnV0IGFkZHJlc3NlcyBhbmQKLQlkYXRhLCBzbyB0aGF0J3MgYWxsIHRoYXQgd2UgaW1wbGVtZW50LgotCi0JVGhlIG9ubHkgaW50ZXJlc3RpbmcgdGhpbmcgaXMgdGhhdCBTLVJlY29yZHMgbWF5IGNvbWUgb3V0IG9mCi0Jb3JkZXIgYW5kIHRoZXJlIGlzIG5vIGhlYWRlciwgc28gYW4gaW5pdGlhbCBzY2FuIGlzIHJlcXVpcmVkCi0JdG8gZGlzY292ZXIgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYWRkcmVzc2VzIHVzZWQgdG8gY3JlYXRlCi0JdGhlIHZtYSBhbmQgc2l6ZSBvZiB0aGUgb25seSBzZWN0aW9uIHdlIGNyZWF0ZS4gIFdlCi0JYXJiaXRyYXJpbHkgY2FsbCB0aGlzIHNlY3Rpb24gIi50ZXh0Ii4KLQotCVdoZW4gYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIGlzIGNhbGxlZCB0aGUgZmlsZSBpcyByZWFkCi0JYWdhaW4sIGFuZCB0aGlzIHRpbWUgdGhlIGRhdGEgaXMgcGxhY2VkIGludG8gYSBiZmRfYWxsb2MnZAotCWFyZWEuCi0KLQlBbnkgbnVtYmVyIG9mIHNlY3Rpb25zIG1heSBiZSBjcmVhdGVkIGZvciBvdXRwdXQsIHdlIHNhdmUgdGhlbQotCXVwIGFuZCBvdXRwdXQgdGhlbSB3aGVuIGl0J3MgdGltZSB0byBjbG9zZSB0aGUgYmZkLgotCi0JQW4gcyByZWNvcmQgbG9va3MgbGlrZToKLQkKLUVYQU1QTEUKLQlTPHR5cGU+PGxlbmd0aD48YWRkcmVzcz48ZGF0YT48Y2hlY2tzdW0+Ci0JCi1ERVNDUklQVElPTgotCVdoZXJlCi0JbyBsZW5ndGgKLQlpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvbGxvd2luZyB1cHRvIHRoZSBjaGVja3N1bS4gTm90ZSB0aGF0Ci0JdGhpcyBpcyBub3QgdGhlIG51bWJlciBvZiBjaGFycyBmb2xsb3dpbmcsIHNpbmNlIGl0IHRha2VzIHR3bwotCWNoYXJzIHRvIHJlcHJlc2VudCBhIGJ5dGUuCi0JbyB0eXBlCi0JaXMgb25lIG9mOgotCTApIGhlYWRlciByZWNvcmQKLQkxKSB0d28gYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JMikgdGhyZWUgYnl0ZSBhZGRyZXNzIGRhdGEgcmVjb3JkCi0JMykgZm91ciBieXRlIGFkZHJlc3MgZGF0YSByZWNvcmQKLQk3KSBmb3VyIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQk4KSB0aHJlZSBieXRlIGFkZHJlc3MgdGVybWluYXRpb24gcmVjb3JkCi0JOSkgdHdvIGJ5dGUgYWRkcmVzcyB0ZXJtaW5hdGlvbiByZWNvcmQKLQkKLQlvIGFkZHJlc3MKLQlpcyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZGF0YSBmb2xsb3dpbmcsIG9yIGluIHRoZSBjYXNlIG9mCi0JYSB0ZXJtaW5hdGlvbiByZWNvcmQsIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBpbWFnZQotCW8gZGF0YQotCWlzIHRoZSBkYXRhLgotCW8gY2hlY2tzdW0KLQlpcyB0aGUgc3VtIG9mIGFsbCB0aGUgcmF3IGJ5dGUgZGF0YSBpbiB0aGUgcmVjb3JkLCBmcm9tIHRoZSBsZW5ndGgKLQl1cHdhcmRzLCBtb2R1bG8gMjU2IGFuZCBzdWJ0cmFjdGVkIGZyb20gMjU1LgotCi0KLVNVQlNFQ1RJT04KLQlTeW1ib2wgUy1SZWNvcmQgaGFuZGxpbmcKLQotREVTQ1JJUFRJT04KLQlTb21lIElDRSBlcXVpcG1lbnQgdW5kZXJzdGFuZHMgYW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkCi0JUy1SZWNvcmQgZm9ybWF0OyBzeW1ib2xzIGFuZCB0aGVpciBhZGRyZXNzZXMgY2FuIGJlIHNlbnQKLQliZWZvcmUgdGhlIGRhdGEuCi0KLQlUaGUgZm9ybWF0IG9mIHRoaXMgaXM6Ci0JKCQkIDxtb2R1bGVuYW1lPgotCQkoPHNwYWNlPiA8c3ltYm9sPiA8YWRkcmVzcz4pKikKLQkkJAotCi0Jc28gYSBzaG9ydCBzeW1ib2wgdGFibGUgY291bGQgbG9vayBsaWtlOgotCi1FWEFNUExFCi0JJCQgZmxhc2gueAotCSQkIGZsYXNoLmMKLQkgIF9wb3J0NiAkMAotCSAgX2RlbGF5ICQ0Ci0JICBfc3RhcnQgJDE0Ci0JICBfZXRleHQgJDgwMzYKLQkgIF9lZGF0YSAkODAzNgotIAkgIF9lbmQgJDgwMzYKLQkkJAotCi1ERVNDUklQVElPTgotCVdlIGFsbG93IHN5bWJvbHMgdG8gYmUgYW55d2hlcmUgaW4gdGhlIGRhdGEgc3RyZWFtIC0gdGhlIG1vZHVsZSBuYW1lcwotCWFyZSBhbHdheXMgaWdub3JlZC4KLQkJCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotc3RhdGljIHZvaWQgc3JlY19nZXRfc3ltYm9sX2luZm8gUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiwgc3ltYm9sX2luZm8gKikpOwotc3RhdGljIHZvaWQgc3JlY19wcmludF9zeW1ib2wKLSBQQVJBTVMgKChiZmQgKiwgUFRSLCBhc3ltYm9sICosIGJmZF9wcmludF9zeW1ib2xfdHlwZSkpOwotc3RhdGljIHZvaWQgc3JlY19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgc3JlY19nZXRfYnl0ZSBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgdm9pZCBzcmVjX2JhZF9ieXRlIFBBUkFNUyAoKGJmZCAqLCB1bnNpZ25lZCBpbnQsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zY2FuIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqc3JlY19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnN5bWJvbHNyZWNfb2JqZWN0X3AgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfcmVhZF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfcmVjb3JkIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGJmZF92bWEsCi0JCQkJCSAgY29uc3QgYmZkX2J5dGUgKiwKLQkJCQkJICBjb25zdCBiZmRfYnl0ZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX3dyaXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzcmVjX25ld19zeW1ib2wgUEFSQU1TICgoYmZkICosIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19nZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3JlY19zZXRfYXJjaF9tYWNoCi0gIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfc2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBib29sZWFuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzeW1ib2xzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGludCBzcmVjX3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYXN5bWJvbCAqc3JlY19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgc3JlY19nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyBzcmVjX2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLQotLyogTWFjcm9zIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gaGV4IGFuZCBiaW5hcnkuICovCi0KLXN0YXRpYyBDT05TVCBjaGFyIGRpZ3NbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotI2RlZmluZSBOSUJCTEUoeCkgaGV4X3ZhbHVlKHgpCi0jZGVmaW5lIEhFWChidWZmZXIpICgoTklCQkxFKChidWZmZXIpWzBdKTw8NCkgKyBOSUJCTEUoKGJ1ZmZlcilbMV0pKQotI2RlZmluZSBUT0hFWChkLCB4LCBjaCkgXAotCWRbMV0gPSBkaWdzWyh4KSAmIDB4Zl07IFwKLQlkWzBdID0gZGlnc1soKHgpPj40KSYweGZdOyBcCi0JY2ggKz0gKCh4KSAmIDB4ZmYpOwotI2RlZmluZQlJU0hFWCh4KSAgaGV4X3AoeCkKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gKi8KLQotc3RhdGljIHZvaWQKLXNyZWNfaW5pdCAoKQotewotICBzdGF0aWMgYm9vbGVhbiBpbml0ZWQgPSBmYWxzZTsKLQotICBpZiAoaW5pdGVkID09IGZhbHNlKQotICAgIHsKLSAgICAgIGluaXRlZCA9IHRydWU7Ci0gICAgICBoZXhfaW5pdCAoKTsKLSAgICB9Ci19Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvbiBhIGxpbmUgaXMgRkYgKi8KLSNkZWZpbmUgTUFYQ0hVTksgMHhmZgotLyogVGhlIG51bWJlciBvZiBieXRlcyB3ZSBmaXQgb250byBhIGxpbmUgb24gb3V0cHV0ICovCi0jZGVmaW5lIENIVU5LIDIxCi0KLS8qIFdoZW4gd3JpdGluZyBhbiBTLXJlY29yZCBmaWxlLCB0aGUgUy1yZWNvcmRzIGNhbiBub3QgYmUgb3V0cHV0IGFzCi0gICB0aGV5IGFyZSBzZWVuLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIHRoZW0gaW4gbWVtb3J5LiAgKi8KLQotc3RydWN0IHNyZWNfZGF0YV9saXN0X3N0cnVjdAotewotICBzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0ICpuZXh0OwotICBiZmRfYnl0ZSAqZGF0YTsKLSAgYmZkX3ZtYSB3aGVyZTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3JlY19kYXRhX2xpc3Rfc3RydWN0IHNyZWNfZGF0YV9saXN0X3R5cGU7Ci0KLS8qIFdoZW4gc2Nhbm5pbmcgdGhlIFMtcmVjb3JkIGZpbGUsIGEgbGlua2VkIGxpc3Qgb2Ygc3JlY19zeW1ib2wKLSAgIHN0cnVjdHVyZXMgaXMgYnVpbHQgdG8gcmVwcmVzZW50IHRoZSBzeW1ib2wgdGFibGUgKGlmIHRoZXJlIGlzCi0gICBvbmUpLiAgKi8KLQotc3RydWN0IHNyZWNfc3ltYm9sCi17Ci0gIHN0cnVjdCBzcmVjX3N5bWJvbCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBUaGUgUy1yZWNvcmQgdGRhdGEgaW5mb3JtYXRpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBzcmVjX2RhdGFfc3RydWN0Ci0gIHsKLSAgICBzcmVjX2RhdGFfbGlzdF90eXBlICpoZWFkOwotICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKnRhaWw7Ci0gICAgdW5zaWduZWQgaW50IHR5cGU7Ci0gICAgc3RydWN0IHNyZWNfc3ltYm9sICpzeW1ib2xzOwotICAgIHN0cnVjdCBzcmVjX3N5bWJvbCAqc3ltdGFpbDsKLSAgICBhc3ltYm9sICpjc3ltYm9sczsKLSAgfQotdGRhdGFfdHlwZTsKLQotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCB0ZGF0YV90eXBlICosCi0JCQkJCSAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3JlY193cml0ZV90ZXJtaW5hdG9yIFBBUkFNUyAoKGJmZCAqLCB0ZGF0YV90eXBlICopKTsKLQotLyogU2V0IHVwIHRoZSBTLXJlY29yZCB0ZGF0YSBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYWJmZC0+dGRhdGEuc3JlY19kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhID0gdGRhdGE7Ci0gICAgICB0ZGF0YS0+dHlwZSA9IDE7Ci0gICAgICB0ZGF0YS0+aGVhZCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+dGFpbCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+c3ltYm9scyA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+c3ltdGFpbCA9IE5VTEw7Ci0gICAgICB0ZGF0YS0+Y3N5bWJvbHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhIGJ5dGUgZnJvbSBhbiBTIHJlY29yZCBmaWxlLiAgU2V0ICpFUlJPUlBUUiBpZiBhbiBlcnJvcgotICAgb2NjdXJyZWQuICBSZXR1cm4gRU9GIG9uIGVycm9yIG9yIGVuZCBvZiBmaWxlLiAgKi8KLQotc3RhdGljIGludAotc3JlY19nZXRfYnl0ZSAoYWJmZCwgZXJyb3JwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiAqZXJyb3JwdHI7Ci17Ci0gIGJmZF9ieXRlIGM7Ci0KLSAgaWYgKGJmZF9yZWFkICgmYywgMSwgMSwgYWJmZCkgIT0gMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpCi0JKmVycm9ycHRyID0gdHJ1ZTsKLSAgICAgIHJldHVybiBFT0Y7Ci0gICAgfQotCi0gIHJldHVybiAoaW50KSAoYyAmIDB4ZmYpOwotfQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIFMgcmVjb3JkIGZpbGUuICBGSVhNRTogVGhpcyBwcm9iYWJseSBzaG91bGQKLSAgIG5vdCBjYWxsIGZwcmludGYsIGJ1dCB3ZSByZWFsbHkgZG8gbmVlZCBzb21lIG1lY2hhbmlzbSBmb3IgcHJpbnRpbmcKLSAgIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgaW50IGM7Ci0gICAgIGJvb2xlYW4gZXJyb3I7Ci17Ci0gIGlmIChjID09IEVPRikKLSAgICB7Ci0gICAgICBpZiAoISBlcnJvcikKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwXTsKLQotICAgICAgaWYgKCEgaXNwcmludCAoYykpCi0Jc3ByaW50ZiAoYnVmLCAiXFwlMDNvIiwgKHVuc2lnbmVkIGludCkgYyk7Ci0gICAgICBlbHNlCi0JewotCSAgYnVmWzBdID0gYzsKLQkgIGJ1ZlsxXSA9ICdcMCc7Ci0JfQotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JKF8oIiVzOiVkOiBVbmV4cGVjdGVkIGNoYXJhY3RlciBgJXMnIGluIFMtcmVjb3JkIGZpbGVcbiIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbGluZW5vLCBidWYpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0gICAgfQotfQotCi0vKiBBZGQgYSBuZXcgc3ltYm9sIGZvdW5kIGluIGFuIFMtcmVjb3JkIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19uZXdfc3ltYm9sIChhYmZkLCBuYW1lLCB2YWwpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzcmVjX3N5bWJvbCAqbjsKLQotICBuID0gKHN0cnVjdCBzcmVjX3N5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHNyZWNfc3ltYm9sKSk7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT52YWwgPSB2YWw7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scyA9PSBOVUxMKQotICAgIGFiZmQtPnRkYXRhLnNyZWNfZGF0YS0+c3ltYm9scyA9IG47Ci0gIGVsc2UKLSAgICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bXRhaWwtPm5leHQgPSBuOwotICBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bXRhaWwgPSBuOwotICBuLT5uZXh0ID0gTlVMTDsKLQotICArK2FiZmQtPnN5bWNvdW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIHRoZSBTIHJlY29yZCBmaWxlIGFuZCB0dXJuIGl0IGludG8gc2VjdGlvbnMuICBXZSBjcmVhdGUgYSBuZXcKLSAgIHNlY3Rpb24gZm9yIGVhY2ggY29udGlndW91cyBzZXQgb2YgYnl0ZXMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3JlY19zY2FuIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBjOwotICB1bnNpZ25lZCBpbnQgbGluZW5vID0gMTsKLSAgYm9vbGVhbiBlcnJvciA9IGZhbHNlOwotICBiZmRfYnl0ZSAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGJ1ZnNpemUgPSAwOwotICBhc2VjdGlvbiAqc2VjID0gTlVMTDsKLSAgY2hhciAqc3ltYnVmID0gTlVMTDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgd2hpbGUgKChjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIC8qIFdlIG9ubHkgYnVpbGQgc2VjdGlvbnMgZnJvbSBjb250aWd1b3VzIFMtcmVjb3Jkcywgc28gaWYgdGhpcwotICAgICAgICAgaXMgbm90IGFuIFMtcmVjb3JkLCB0aGVuIHN0b3AgYnVpbGRpbmcgYSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmIChjICE9ICdTJyAmJiBjICE9ICdccicgJiYgYyAhPSAnXG4nKQotCXNlYyA9IE5VTEw7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JZGVmYXVsdDoKLQkgIHNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCSAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQljYXNlICdcbic6Ci0JICArK2xpbmVubzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnXHInOgotCSAgYnJlYWs7Ci0KLQljYXNlICckJzoKLQkgIC8qIFN0YXJ0aW5nIGEgbW9kdWxlIG5hbWUsIHdoaWNoIHdlIGlnbm9yZS4gICovCi0JICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSAnXG4nCi0JCSAmJiBjICE9IEVPRikKLQkgICAgOwotCSAgaWYgKGMgPT0gRU9GKQotCSAgICB7Ci0JICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgKytsaW5lbm87Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSAnICc6Ci0JICBkbwotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFsYzsKLQkgICAgICBjaGFyICpwLCAqc3ltbmFtZTsKLQkgICAgICBiZmRfdm1hIHN5bXZhbDsKLQotCSAgICAgIC8qIFN0YXJ0aW5nIGEgc3ltYm9sIGRlZmluaXRpb24uICAqLwotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQotCQk7Ci0KLQkgICAgICBpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgYWxjID0gMTA7Ci0JICAgICAgc3ltYnVmID0gKGNoYXIgKikgYmZkX21hbGxvYyAoYWxjICsgMSk7Ci0JICAgICAgaWYgKHN5bWJ1ZiA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICAgIHAgPSBzeW1idWY7Ci0KLQkgICAgICAqcCsrID0gYzsKLQkgICAgICB3aGlsZSAoKGMgPSBzcmVjX2dldF9ieXRlIChhYmZkLCAmZXJyb3IpKSAhPSBFT0YKLQkJICAgICAmJiAhIGlzc3BhY2UgKGMpKQotCQl7Ci0JCSAgaWYgKCh1bnNpZ25lZCBpbnQpIChwIC0gc3ltYnVmKSA+PSBhbGMpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKm47Ci0KLQkJICAgICAgYWxjICo9IDI7Ci0JCSAgICAgIG4gPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAoc3ltYnVmLCBhbGMgKyAxKTsKLQkJICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBwID0gbiArIChwIC0gc3ltYnVmKTsKLQkJICAgICAgc3ltYnVmID0gbjsKLQkJICAgIH0KLQotCQkgICpwKysgPSBjOwotCQl9Ci0KLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXsKLQkJICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICBnb3RvIGVycm9yX3JldHVybjsKLQkJfQotCi0JICAgICAgKnArKyA9ICdcMCc7Ci0JICAgICAgc3ltbmFtZSA9IGJmZF9hbGxvYyAoYWJmZCwgcCAtIHN5bWJ1Zik7Ci0JICAgICAgaWYgKHN5bW5hbWUgPT0gTlVMTCkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgc3RyY3B5IChzeW1uYW1lLCBzeW1idWYpOwotCSAgICAgIGZyZWUgKHN5bWJ1Zik7Ci0JICAgICAgc3ltYnVmID0gTlVMTDsKLQotCSAgICAgIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRgotCQkgICAgICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpKQotCQk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQl7Ci0JCSAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQotCSAgICAgIC8qIFNraXAgYSBkb2xsYXIgc2lnbiBiZWZvcmUgdGhlIGhleCB2YWx1ZS4gICovCi0JICAgICAgaWYgKGMgPT0gJyQnKQotCQl7Ci0JCSAgYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcik7Ci0JCSAgaWYgKGMgPT0gRU9GKQotCQkgICAgewotCQkgICAgICBzcmVjX2JhZF9ieXRlIChhYmZkLCBsaW5lbm8sIGMsIGVycm9yKTsKLQkJICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHN5bXZhbCA9IDA7Ci0JICAgICAgd2hpbGUgKElTSEVYIChjKSkKLQkJewotCQkgIHN5bXZhbCA8PD0gNDsKLQkJICBzeW12YWwgKz0gTklCQkxFIChjKTsKLQkJICBjID0gc3JlY19nZXRfYnl0ZSAoYWJmZCwgJmVycm9yKTsKLQkJfQotCi0JICAgICAgaWYgKCEgc3JlY19uZXdfc3ltYm9sIChhYmZkLCBzeW1uYW1lLCBzeW12YWwpKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0Jyk7Ci0KLQkgIGlmIChjID09ICdcbicpCi0JICAgICsrbGluZW5vOwotCSAgZWxzZSBpZiAoYyAhPSAnXHInKQotCSAgICB7Ci0JICAgICAgc3JlY19iYWRfYnl0ZSAoYWJmZCwgbGluZW5vLCBjLCBlcnJvcik7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0gICAgCi0JY2FzZSAnUyc6Ci0JICB7Ci0JICAgIGZpbGVfcHRyIHBvczsKLQkgICAgY2hhciBoZHJbM107Ci0JICAgIHVuc2lnbmVkIGludCBieXRlczsKLQkgICAgYmZkX3ZtYSBhZGRyZXNzOwotCSAgICBiZmRfYnl0ZSAqZGF0YTsKLQotCSAgICAvKiBTdGFydGluZyBhbiBTLXJlY29yZC4gICovCi0KLQkgICAgcG9zID0gYmZkX3RlbGwgKGFiZmQpIC0gMTsKLQotCSAgICBpZiAoYmZkX3JlYWQgKGhkciwgMSwgMywgYWJmZCkgIT0gMykKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgICBpZiAoISBJU0hFWCAoaGRyWzFdKSB8fCAhIElTSEVYIChoZHJbMl0pKQotCSAgICAgIHsKLQkJaWYgKCEgSVNIRVggKGhkclsxXSkpCi0JCSAgYyA9IGhkclsxXTsKLQkJZWxzZQotCQkgIGMgPSBoZHJbMl07Ci0JCXNyZWNfYmFkX2J5dGUgKGFiZmQsIGxpbmVubywgYywgZXJyb3IpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgYnl0ZXMgPSBIRVggKGhkciArIDEpOwotCSAgICBpZiAoYnl0ZXMgKiAyID4gYnVmc2l6ZSkKLQkgICAgICB7Ci0JCWlmIChidWYgIT0gTlVMTCkKLQkJICBmcmVlIChidWYpOwotCQlidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoYnl0ZXMgKiAyKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQlidWZzaXplID0gYnl0ZXMgKiAyOwotCSAgICAgIH0KLQotCSAgICBpZiAoYmZkX3JlYWQgKGJ1ZiwgMSwgYnl0ZXMgKiAyLCBhYmZkKSAhPSBieXRlcyAqIDIpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkgICAgLyogSWdub3JlIHRoZSBjaGVja3N1bSBieXRlLiAgKi8KLQkgICAgLS1ieXRlczsKLQotCSAgICBhZGRyZXNzID0gMDsKLQkgICAgZGF0YSA9IGJ1ZjsKLQkgICAgc3dpdGNoIChoZHJbMF0pCi0JICAgICAgewotCSAgICAgIGNhc2UgJzAnOgotCSAgICAgIGNhc2UgJzUnOgotCQkvKiBQcm9sb2d1ZS0taWdub3JlIHRoZSBmaWxlIG5hbWUsIGJ1dCBzdG9wIGJ1aWxkaW5nIGEKLSAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGF0IHRoaXMgcG9pbnQuICAqLwotCQlzZWMgPSBOVUxMOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgotCQlhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQktLWJ5dGVzOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzInOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS0tYnl0ZXM7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnMSc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQlieXRlcyAtPSAyOwotCi0JCWlmIChzZWMgIT0gTlVMTAotCQkgICAgJiYgc2VjLT52bWEgKyBzZWMtPl9yYXdfc2l6ZSA9PSBhZGRyZXNzKQotCQkgIHsKLQkJICAgIC8qIFRoaXMgZGF0YSBnb2VzIGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2UgYXJlCi0gICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBidWlsZGluZy4gICovCi0JCSAgICBzZWMtPl9yYXdfc2l6ZSArPSBieXRlczsKLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBjaGFyIHNlY2J1ZlsyMF07Ci0JCSAgICBjaGFyICpzZWNuYW1lOwotCi0JCSAgICBzcHJpbnRmIChzZWNidWYsICIuc2VjJWQiLCBiZmRfY291bnRfc2VjdGlvbnMgKGFiZmQpICsgMSk7Ci0JCSAgICBzZWNuYW1lID0gKGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJsZW4gKHNlY2J1ZikgKyAxKTsKLQkJICAgIHN0cmNweSAoc2VjbmFtZSwgc2VjYnVmKTsKLQkJICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIHNlY25hbWUpOwotCQkgICAgaWYgKHNlYyA9PSBOVUxMKQotCQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAgIHNlYy0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTIHwgU0VDX0xPQUQgfCBTRUNfQUxMT0M7Ci0JCSAgICBzZWMtPnZtYSA9IGFkZHJlc3M7Ci0JCSAgICBzZWMtPmxtYSA9IGFkZHJlc3M7Ci0JCSAgICBzZWMtPl9yYXdfc2l6ZSA9IGJ5dGVzOwotCQkgICAgc2VjLT5maWxlcG9zID0gcG9zOwotCQkgIH0KLQotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzcnOgotCQlhZGRyZXNzID0gSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCQkvKiBGYWxsIHRocm91Z2guICAqLwotCSAgICAgIGNhc2UgJzgnOgotCQlhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCQlkYXRhICs9IDI7Ci0JCS8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgICAgY2FzZSAnOSc6Ci0JCWFkZHJlc3MgPSAoYWRkcmVzcyA8PCA4KSB8IEhFWCAoZGF0YSk7Ci0JCWRhdGEgKz0gMjsKLQkJYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkJZGF0YSArPSAyOwotCi0JCS8qIFRoaXMgaXMgYSB0ZXJtaW5hdGlvbiByZWNvcmQuICAqLwotCQlhYmZkLT5zdGFydF9hZGRyZXNzID0gYWRkcmVzczsKLQotCQlpZiAoYnVmICE9IE5VTEwpCi0JCSAgZnJlZSAoYnVmKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlcnJvcikKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN5bWJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKHN5bWJ1Zik7Ci0gIGlmIChidWYgIT0gTlVMTCkKLSAgICBmcmVlIChidWYpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotc3JlY19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBiZmRfYnl0ZSBiWzRdOwotCi0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICdTJyB8fCAhSVNIRVggKGJbMV0pIHx8ICFJU0hFWCAoYlsyXSkgfHwgIUlTSEVYIChiWzNdKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBzcmVjX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgISBzcmVjX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIENoZWNrIHdoZXRoZXIgYW4gZXhpc3RpbmcgZmlsZSBpcyBhbiBTLXJlY29yZCBmaWxlIHdpdGggc3ltYm9scy4gICovCi0KLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICoKLXN5bWJvbHNyZWNfb2JqZWN0X3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciBiWzJdOwotCi0gIHNyZWNfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCAyLCBhYmZkKSAhPSAyKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICckJyB8fCBiWzFdICE9ICckJykKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoISBzcmVjX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgISBzcmVjX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLS8qIFJlYWQgaW4gdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbiBpbiBhbiBTLXJlY29yZCBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfcmVhZF9zZWN0aW9uIChhYmZkLCBzZWN0aW9uLCBjb250ZW50cykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBpbnQgYzsKLSAgYmZkX3NpemVfdHlwZSBzb2ZhciA9IDA7Ci0gIGJvb2xlYW4gZXJyb3IgPSBmYWxzZTsKLSAgYmZkX2J5dGUgKmJ1ZiA9IE5VTEw7Ci0gIHNpemVfdCBidWZzaXplID0gMDsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlY3Rpb24tPmZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIHdoaWxlICgoYyA9IHNyZWNfZ2V0X2J5dGUgKGFiZmQsICZlcnJvcikpICE9IEVPRikKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBoZHJbM107Ci0gICAgICB1bnNpZ25lZCBpbnQgYnl0ZXM7Ci0gICAgICBiZmRfdm1hIGFkZHJlc3M7Ci0gICAgICBiZmRfYnl0ZSAqZGF0YTsKLQotICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHNyZWNfc2NhbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCwgc28gd2UKLSAgICAgICAgIG91Z2h0IHRvIGtub3cgdGhlIGV4YWN0IGZvcm1hdC4gICovCi0gICAgICBCRkRfQVNTRVJUIChjID09ICdTJyk7Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoaGRyLCAxLCAzLCBhYmZkKSAhPSAzKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBCRkRfQVNTRVJUIChJU0hFWCAoaGRyWzFdKSAmJiBJU0hFWCAoaGRyWzJdKSk7Ci0KLSAgICAgIGJ5dGVzID0gSEVYIChoZHIgKyAxKTsKLQotICAgICAgaWYgKGJ5dGVzICogMiA+IGJ1ZnNpemUpCi0JewotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKGJ5dGVzICogMik7Ci0JICBpZiAoYnVmID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgYnVmc2l6ZSA9IGJ5dGVzICogMjsKLQl9Ci0KLSAgICAgIGlmIChiZmRfcmVhZCAoYnVmLCAxLCBieXRlcyAqIDIsIGFiZmQpICE9IGJ5dGVzICogMikKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgYWRkcmVzcyA9IDA7Ci0gICAgICBkYXRhID0gYnVmOwotICAgICAgc3dpdGNoIChoZHJbMF0pCi0JewotCWRlZmF1bHQ6Ci0JICBCRkRfQVNTRVJUIChzb2ZhciA9PSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgaWYgKGJ1ZiAhPSBOVUxMKQotCSAgICBmcmVlIChidWYpOwotCSAgcmV0dXJuIHRydWU7Ci0KLQljYXNlICczJzoKLQkgIGFkZHJlc3MgPSBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgLS1ieXRlczsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnMic6Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgLS1ieXRlczsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSAnMSc6Ci0JICBhZGRyZXNzID0gKGFkZHJlc3MgPDwgOCkgfCBIRVggKGRhdGEpOwotCSAgZGF0YSArPSAyOwotCSAgYWRkcmVzcyA9IChhZGRyZXNzIDw8IDgpIHwgSEVYIChkYXRhKTsKLQkgIGRhdGEgKz0gMjsKLQkgIGJ5dGVzIC09IDI7Ci0KLQkgIGlmIChhZGRyZXNzICE9IHNlY3Rpb24tPnZtYSArIHNvZmFyKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgY29tZSB0byB0aGUgZW5kIG9mIHRoaXMgc2VjdGlvbi4gICovCi0JICAgICAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgICBpZiAoYnVmICE9IE5VTEwpCi0JCWZyZWUgKGJ1Zik7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgY29uc2lkZXIgY2hlY2tzdW0uICAqLwotCSAgLS1ieXRlczsKLQotCSAgd2hpbGUgKGJ5dGVzLS0gIT0gMCkKLQkgICAgewotCSAgICAgIGNvbnRlbnRzW3NvZmFyXSA9IEhFWCAoZGF0YSk7Ci0JICAgICAgZGF0YSArPSAyOwotCSAgICAgICsrc29mYXI7Ci0JICAgIH0KLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyb3IpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgQkZEX0FTU0VSVCAoc29mYXIgPT0gc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotICBpZiAoYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGJ1ZiAhPSBOVUxMKQotICAgIGZyZWUgKGJ1Zik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR2V0IHRoZSBjb250ZW50cyBvZiBhIHNlY3Rpb24gaW4gYW4gUy1yZWNvcmQgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmIChzZWN0aW9uLT51c2VkX2J5X2JmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNlY3Rpb24tPnVzZWRfYnlfYmZkID0gYmZkX2FsbG9jIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlY3Rpb24tPnVzZWRfYnlfYmZkID09IE5VTEwKLQkgICYmIHNlY3Rpb24tPl9yYXdfc2l6ZSAhPSAwKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgc3JlY19yZWFkX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnVzZWRfYnlfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG1lbWNweSAobG9jYXRpb24sIChiZmRfYnl0ZSAqKSBzZWN0aW9uLT51c2VkX2J5X2JmZCArIG9mZnNldCwKLQkgIChzaXplX3QpIGNvdW50KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2V0IHRoZSBhcmNoaXRlY3R1cmUuICBXZSBhY2NlcHQgYW4gdW5rbm93biBhcmNoaXRlY3R1cmUgaGVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICB7Ci0gICAgICBhYmZkLT5hcmNoX2luZm8gPSAmYmZkX2RlZmF1bHRfYXJjaF9zdHJ1Y3Q7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIHJldHVybiBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoIChhYmZkLCBhcmNoLCBtYWNoKTsKLX0KLQotLyogd2UgaGF2ZSB0byBzYXZlIHVwIGFsbCB0aGUgU3JlY29yZHMgZm9yIGEgc3BsdXJnZSBiZWZvcmUgb3V0cHV0ICovCi0KLXN0YXRpYyBib29sZWFuCi1zcmVjX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvOwotewotICB0ZGF0YV90eXBlICp0ZGF0YSA9IGFiZmQtPnRkYXRhLnNyZWNfZGF0YTsKLSAgcmVnaXN0ZXIgc3JlY19kYXRhX2xpc3RfdHlwZSAqZW50cnk7Ci0KLSAgZW50cnkgPSAoKHNyZWNfZGF0YV9saXN0X3R5cGUgKikKLQkgICBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3JlY19kYXRhX2xpc3RfdHlwZSkpKTsKLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChieXRlc190b19kbwotICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKQotICAgICAgJiYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpKQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpkYXRhID0gKGJmZF9ieXRlICopIGJmZF9hbGxvYyAoYWJmZCwgYnl0ZXNfdG9fZG8pOwotICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBtZW1jcHkgKChQVFIpIGRhdGEsIGxvY2F0aW9uLCAoc2l6ZV90KSBieXRlc190b19kbyk7Ci0KLSAgICAgIGlmICgoc2VjdGlvbi0+bG1hICsgb2Zmc2V0ICsgYnl0ZXNfdG9fZG8gLSAxKSA8PSAweGZmZmYpCi0JewotCi0JfQotICAgICAgZWxzZSBpZiAoKHNlY3Rpb24tPmxtYSArIG9mZnNldCArIGJ5dGVzX3RvX2RvIC0gMSkgPD0gMHhmZmZmZmYKLQkgICAgICAgJiYgdGRhdGEtPnR5cGUgPD0gMikKLQl7Ci0JICB0ZGF0YS0+dHlwZSA9IDI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHRkYXRhLT50eXBlID0gMzsKLQl9Ci0KLSAgICAgIGVudHJ5LT5kYXRhID0gZGF0YTsKLSAgICAgIGVudHJ5LT53aGVyZSA9IHNlY3Rpb24tPmxtYSArIG9mZnNldDsKLSAgICAgIGVudHJ5LT5zaXplID0gYnl0ZXNfdG9fZG87Ci0KLSAgICAgIC8qIFNvcnQgdGhlIHJlY29yZHMgYnkgYWRkcmVzcy4gIE9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YKLSAgICAgICAgIGFkZGluZyBhIHJlY29yZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgKi8KLSAgICAgIGlmICh0ZGF0YS0+dGFpbCAhPSBOVUxMCi0JICAmJiBlbnRyeS0+d2hlcmUgPj0gdGRhdGEtPnRhaWwtPndoZXJlKQotCXsKLQkgIHRkYXRhLT50YWlsLT5uZXh0ID0gZW50cnk7Ci0JICBlbnRyeS0+bmV4dCA9IE5VTEw7Ci0JICB0ZGF0YS0+dGFpbCA9IGVudHJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdpc3RlciBzcmVjX2RhdGFfbGlzdF90eXBlICoqbG9vazsKLQotCSAgZm9yIChsb29rID0gJnRkYXRhLT5oZWFkOwotCSAgICAgICAqbG9vayAhPSBOVUxMICYmICgqbG9vayktPndoZXJlIDwgZW50cnktPndoZXJlOwotCSAgICAgICBsb29rID0gJigqbG9vayktPm5leHQpCi0JICAgIDsKLQkgIGVudHJ5LT5uZXh0ID0gKmxvb2s7Ci0JICAqbG9vayA9IGVudHJ5OwotCSAgaWYgKGVudHJ5LT5uZXh0ID09IE5VTEwpCi0JICAgIHRkYXRhLT50YWlsID0gZW50cnk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgcmVjb3JkIG9mIHR5cGUsIG9mIHRoZSBzdXBwbGllZCBudW1iZXIgb2YgYnl0ZXMuIFRoZQotICAgc3VwcGxpZWQgYnl0ZXMgYW5kIGxlbmd0aCBkb24ndCBoYXZlIGEgY2hlY2tzdW0uIFRoYXQncyB3b3JrZWQgb3V0Ci0gICBoZXJlCi0qLwotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLCB0eXBlLCBhZGRyZXNzLCBkYXRhLCBlbmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLSAgICAgY29uc3QgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGNvbnN0IGJmZF9ieXRlICplbmQ7Ci17Ci0gIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgdW5zaWduZWQgaW50IGNoZWNrX3N1bSA9IDA7Ci0gIENPTlNUIGJmZF9ieXRlICpzcmMgPSBkYXRhOwotICBjaGFyICpkc3QgPSBidWZmZXI7Ci0gIGNoYXIgKmxlbmd0aDsKLSAgYmZkX3NpemVfdHlwZSB3cmxlbjsKLQotICAqZHN0KysgPSAnUyc7Ci0gICpkc3QrKyA9ICcwJyArIHR5cGU7Ci0KLSAgbGVuZ3RoID0gZHN0OwotICBkc3QgKz0gMjsJCQkvKiBsZWF2ZSByb29tIGZvciBkc3QqLwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNzoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDI0KSwgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIGNhc2UgODoKLSAgICBjYXNlIDI6Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyA+PiAxNiksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICBjYXNlIDk6Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMDoKLSAgICAgIFRPSEVYIChkc3QsIChhZGRyZXNzID4+IDgpLCBjaGVja19zdW0pOwotICAgICAgZHN0ICs9IDI7Ci0gICAgICBUT0hFWCAoZHN0LCAoYWRkcmVzcyksIGNoZWNrX3N1bSk7Ci0gICAgICBkc3QgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICBmb3IgKHNyYyA9IGRhdGE7IHNyYyA8IGVuZDsgc3JjKyspCi0gICAgewotICAgICAgVE9IRVggKGRzdCwgKnNyYywgY2hlY2tfc3VtKTsKLSAgICAgIGRzdCArPSAyOwotICAgIH0KLQotICAvKiBGaWxsIGluIHRoZSBsZW5ndGggKi8KLSAgVE9IRVggKGxlbmd0aCwgKGRzdCAtIGxlbmd0aCkgLyAyLCBjaGVja19zdW0pOwotICBjaGVja19zdW0gJj0gMHhmZjsKLSAgY2hlY2tfc3VtID0gMjU1IC0gY2hlY2tfc3VtOwotICBUT0hFWCAoZHN0LCBjaGVja19zdW0sIGNoZWNrX3N1bSk7Ci0gIGRzdCArPSAyOwotCi0gICpkc3QrKyA9ICdccic7Ci0gICpkc3QrKyA9ICdcbic7Ci0gIHdybGVuID0gZHN0IC0gYnVmZmVyOwotICBpZiAoYmZkX3dyaXRlICgoUFRSKSBidWZmZXIsIDEsIHdybGVuLCBhYmZkKSAhPSB3cmxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcltNQVhDSFVOS107Ci0gIGJmZF9ieXRlICpkc3QgPSBidWZmZXI7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEknbGwgcHV0IGFuIGFyYml0YXJ5IDQwIGNoYXIgbGltaXQgb24gaGVhZGVyIHNpemUgKi8KLSAgZm9yIChpID0gMDsgaSA8IDQwICYmIGFiZmQtPmZpbGVuYW1lW2ldOyBpKyspCi0gICAgewotICAgICAgKmRzdCsrID0gYWJmZC0+ZmlsZW5hbWVbaV07Ci0gICAgfQotICByZXR1cm4gc3JlY193cml0ZV9yZWNvcmQgKGFiZmQsIDAsIDAsIGJ1ZmZlciwgZHN0KTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXNyZWNfd3JpdGVfc2VjdGlvbiAoYWJmZCwgdGRhdGEsIGxpc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdGRhdGFfdHlwZSAqdGRhdGE7Ci0gICAgIHNyZWNfZGF0YV9saXN0X3R5cGUgKmxpc3Q7Ci17Ci0gIHVuc2lnbmVkIGludCBieXRlc193cml0dGVuID0gMDsKLSAgYmZkX2J5dGUgKmxvY2F0aW9uID0gbGlzdC0+ZGF0YTsKLQotICB3aGlsZSAoYnl0ZXNfd3JpdHRlbiA8IGxpc3QtPnNpemUpCi0gICAgewotICAgICAgYmZkX3ZtYSBhZGRyZXNzOwotCi0gICAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfdGhpc19jaHVuayA9IGxpc3QtPnNpemUgLSBieXRlc193cml0dGVuOwotCi0gICAgICBpZiAoYnl0ZXNfdGhpc19jaHVuayA+IENIVU5LKQotCXsKLQkgIGJ5dGVzX3RoaXNfY2h1bmsgPSBDSFVOSzsKLQl9Ci0KLSAgICAgIGFkZHJlc3MgPSBsaXN0LT53aGVyZSArIGJ5dGVzX3dyaXR0ZW47Ci0KLSAgICAgIGlmICghIHNyZWNfd3JpdGVfcmVjb3JkIChhYmZkLAotCQkJICAgICAgIHRkYXRhLT50eXBlLAotCQkJICAgICAgIGFkZHJlc3MsCi0JCQkgICAgICAgbG9jYXRpb24sCi0JCQkgICAgICAgbG9jYXRpb24gKyBieXRlc190aGlzX2NodW5rKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJ5dGVzX3dyaXR0ZW4gKz0gYnl0ZXNfdGhpc19jaHVuazsKLSAgICAgIGxvY2F0aW9uICs9IGJ5dGVzX3RoaXNfY2h1bms7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV90ZXJtaW5hdG9yIChhYmZkLCB0ZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICB0ZGF0YV90eXBlICp0ZGF0YTsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzJdOwotCi0gIHJldHVybiBzcmVjX3dyaXRlX3JlY29yZCAoYWJmZCwgMTAgLSB0ZGF0YS0+dHlwZSwKLQkJCSAgICBhYmZkLT5zdGFydF9hZGRyZXNzLCBidWZmZXIsIGJ1ZmZlcik7Ci19Ci0KLQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9zeW1ib2xzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgYnVmZmVyW01BWENIVU5LXTsKLSAgLyogRHVtcCBvdXQgdGhlIHN5bWJvbHMgb2YgYSBiZmQgKi8KLSAgaW50IGk7Ci0gIGludCBjb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotCi0gIGlmIChjb3VudCkKLSAgICB7Ci0gICAgICBzaXplX3QgbGVuOwotICAgICAgYXN5bWJvbCAqKnRhYmxlID0gYmZkX2dldF9vdXRzeW1ib2xzIChhYmZkKTsKLSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiQkICVzXHJcbiIsIGFiZmQtPmZpbGVuYW1lKTsKLQotICAgICAgbGVuID0gc3RybGVuIChidWZmZXIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCXsKLQkgIGFzeW1ib2wgKnMgPSB0YWJsZVtpXTsKLQkgIGlmICghIGJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgcykKLQkgICAgICAmJiAocy0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSnVzdCBkdW1wIG91dCBub24gZGVidWcgc3ltYm9scyAqLwotCSAgICAgIGJmZF9zaXplX3R5cGUgbDsKLQkgICAgICBjaGFyIGJ1ZjJbNDBdLCAqcDsKLQotCSAgICAgIHNwcmludGZfdm1hIChidWYyLAotCQkJICAgcy0+dmFsdWUgKyBzLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+bG1hCi0JCQkgICArIHMtPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgICAgIHAgPSBidWYyOwotCSAgICAgIHdoaWxlIChwWzBdID09ICcwJyAmJiBwWzFdICE9IDApCi0JCXArKzsKLQkgICAgICBzcHJpbnRmIChidWZmZXIsICIgICVzICQlc1xyXG4iLCBzLT5uYW1lLCBwKTsKLQkgICAgICBsID0gc3RybGVuIChidWZmZXIpOwotCSAgICAgIGlmIChiZmRfd3JpdGUgKGJ1ZmZlciwgbCwgMSwgYWJmZCkgIT0gbCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotICAgICAgc3ByaW50ZiAoYnVmZmVyLCAiJCQgXHJcbiIpOwotICAgICAgbGVuID0gc3RybGVuIChidWZmZXIpOwotICAgICAgaWYgKGJmZF93cml0ZSAoYnVmZmVyLCBsZW4sIDEsIGFiZmQpICE9IGxlbikKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbGVhbgotaW50ZXJuYWxfc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHN5bWJvbHM7Ci17Ci0gIHRkYXRhX3R5cGUgKnRkYXRhID0gYWJmZC0+dGRhdGEuc3JlY19kYXRhOwotICBzcmVjX2RhdGFfbGlzdF90eXBlICpsaXN0OwotCi0gIGlmIChzeW1ib2xzKQotICAgIHsKLSAgICAgIGlmICghIHNyZWNfd3JpdGVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBzcmVjX3dyaXRlX2hlYWRlciAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB3YW5kZXIgdGhvdWdoIGFsbCB0aGUgc2VjdGlvbnMgcHJvdmlkZWQgYW5kIG91dHB1dCB0aGVtICovCi0gIGxpc3QgPSB0ZGF0YS0+aGVhZDsKLQotICB3aGlsZSAobGlzdCAhPSAoc3JlY19kYXRhX2xpc3RfdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHNyZWNfd3JpdGVfc2VjdGlvbiAoYWJmZCwgdGRhdGEsIGxpc3QpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgcmV0dXJuIHNyZWNfd3JpdGVfdGVybWluYXRvciAoYWJmZCwgdGRhdGEpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotc3JlY193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIGludGVybmFsX3NyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkLCAwKTsKLX0KLQotc3RhdGljIGJvb2xlYW4KLXN5bWJvbHNyZWNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiBpbnRlcm5hbF9zcmVjX3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCwgMSk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotc3JlY19zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGV4ZWM7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXN5bWJvbCAqCi1zcmVjX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKm5ldyA9IChhc3ltYm9sICopIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoYXN5bWJvbCkpOwotICBpZiAobmV3KQotICAgIG5ldy0+dGhlX2JmZCA9IGFiZmQ7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBuZWVkZWQgdG8gcmVhZCB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXNyZWNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXNyZWNfZ2V0X3N5bXRhYiAoYWJmZCwgYWxvY2F0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKiphbG9jYXRpb247Ci17Ci0gIHVuc2lnbmVkIGludCBzeW1jb3VudCA9IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotICBhc3ltYm9sICpjc3ltYm9sczsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgY3N5bWJvbHMgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPmNzeW1ib2xzOwotICBpZiAoY3N5bWJvbHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICpjOwotICAgICAgc3RydWN0IHNyZWNfc3ltYm9sICpzOwotCi0gICAgICBjc3ltYm9scyA9IChhc3ltYm9sICopIGJmZF9hbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wpKTsKLSAgICAgIGlmIChjc3ltYm9scyA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEuc3JlY19kYXRhLT5jc3ltYm9scyA9IGNzeW1ib2xzOwotCi0gICAgICBmb3IgKHMgPSBhYmZkLT50ZGF0YS5zcmVjX2RhdGEtPnN5bWJvbHMsIGMgPSBjc3ltYm9sczsKLQkgICBzICE9IE5VTEw7Ci0JICAgcyA9IHMtPm5leHQsICsrYykKLQl7Ci0JICBjLT50aGVfYmZkID0gYWJmZDsKLQkgIGMtPm5hbWUgPSBzLT5uYW1lOwotCSAgYy0+dmFsdWUgPSBzLT52YWw7Ci0JICBjLT5mbGFncyA9IEJTRl9HTE9CQUw7Ci0JICBjLT5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQkgIGMtPnVkYXRhLnAgPSBOVUxMOwotCX0KLSAgICB9Ci0JCi0gIGZvciAoaSA9IDA7IGkgPCBzeW1jb3VudDsgaSsrKQotICAgICphbG9jYXRpb24rKyA9IGNzeW1ib2xzKys7Ci0gICphbG9jYXRpb24gPSBOVUxMOwotCi0gIHJldHVybiBzeW1jb3VudDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc3JlY19nZXRfc3ltYm9sX2luZm8gKGlnbm9yZV9hYmZkLCBzeW1ib2wsIHJldCkKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBiZmRfc3ltYm9sX2luZm8gKHN5bWJvbCwgcmV0KTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotc3JlY19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JICAgICAgIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwKLQkgICAgICAgc3ltYm9sLT5uYW1lKTsKLQotICAgIH0KLX0KLQotI2RlZmluZQlzcmVjX2Nsb3NlX2FuZF9jbGVhbnVwIF9iZmRfZ2VuZXJpY19jbG9zZV9hbmRfY2xlYW51cAotI2RlZmluZSBzcmVjX2JmZF9mcmVlX2NhY2hlZF9pbmZvIF9iZmRfZ2VuZXJpY19iZmRfZnJlZV9jYWNoZWRfaW5mbwotI2RlZmluZSBzcmVjX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSBzcmVjX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIGJmZF9nZW5lcmljX2lzX2xvY2FsX2xhYmVsX25hbWUKLSNkZWZpbmUgc3JlY19nZXRfbGluZW5vIF9iZmRfbm9zeW1ib2xzX2dldF9saW5lbm8KLSNkZWZpbmUgc3JlY19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSBzcmVjX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCBfYmZkX25vc3ltYm9sc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wKLSNkZWZpbmUgc3JlY19yZWFkX21pbmlzeW1ib2xzIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzCi0jZGVmaW5lIHNyZWNfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgc3JlY19nZXRfcmVsb2NfdXBwZXJfYm91bmQgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSkpIGJmZF8wbCkKLSNkZWZpbmUgc3JlY19jYW5vbmljYWxpemVfcmVsb2MgXAotICAoKGxvbmcgKCopIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSkpIGJmZF8wbCkKLSNkZWZpbmUgc3JlY19iZmRfcmVsb2NfdHlwZV9sb29rdXAgX2JmZF9ub3JlbG9jc19iZmRfcmVsb2NfdHlwZV9sb29rdXAKLQotI2RlZmluZSBzcmVjX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotI2RlZmluZSBzcmVjX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgc3JlY19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHNyZWNfYmZkX2djX3NlY3Rpb25zIGJmZF9nZW5lcmljX2djX3NlY3Rpb25zCi0jZGVmaW5lIHNyZWNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgc3JlY19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSBzcmVjX2JmZF9maW5hbF9saW5rIF9iZmRfZ2VuZXJpY19maW5hbF9saW5rCi0jZGVmaW5lIHNyZWNfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLWNvbnN0IGJmZF90YXJnZXQgc3JlY192ZWMgPQotewotICAic3JlYyIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3NyZWNfZmxhdm91ciwKLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLSAgQkZEX0VORElBTl9VTktOT1dOLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgc3JlY19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgfSwKLSAgewotICAgIGJmZF9mYWxzZSwKLSAgICBzcmVjX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBzcmVjX3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZIChfYmZkX2dlbmVyaWMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFIChfYmZkX25vY29yZSksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKF9iZmRfbm9hcmNoaXZlKSwKLSAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwotCi0KLQotY29uc3QgYmZkX3RhcmdldCBzeW1ib2xzcmVjX3ZlYyA9Ci17Ci0gICJzeW1ib2xzcmVjIiwJCQkvKiBuYW1lICovCi0gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChIQVNfUkVMT0MgfCBFWEVDX1AgfAkJLyogb2JqZWN0IGZsYWdzICovCi0gICBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwKLSAgIEhBU19TWU1TIHwgSEFTX0xPQ0FMUyB8IFdQX1RFWFQgfCBEX1BBR0VEKSwKLSAgKFNFQ19DT0RFIHwgU0VDX0RBVEEgfCBTRUNfUk9NIHwgU0VDX0hBU19DT05URU5UUwotICAgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksCS8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgMCwJCQkJLyogbGVhZGluZyB1bmRlcnNjb3JlICovCi0gICcgJywJCQkJLyogYXJfcGFkX2NoYXIgKi8KLSAgMTYsCQkJCS8qIGFyX21heF9uYW1lbGVuICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGRhdGEgKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogaGRycyAqLwotCi0gIHsKLSAgICBfYmZkX2R1bW15X3RhcmdldCwKLSAgICBzeW1ib2xzcmVjX29iamVjdF9wLAkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gIH0sCi0gIHsKLSAgICBiZmRfZmFsc2UsCi0gICAgc3JlY19ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgc3ltYm9sc3JlY193cml0ZV9vYmplY3RfY29udGVudHMsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChzcmVjKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09QWSAoX2JmZF9nZW5lcmljKSwKLSAgQkZEX0pVTVBfVEFCTEVfQ09SRSAoX2JmZF9ub2NvcmUpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAoc3JlYyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHNyZWMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDIChfYmZkX25vZHluYW1pYyksCi0KLSAgKFBUUikgMAotfTsKZGlmZiAtLWdpdCBhL2JmZC9zdGFiLXN5bXMuYyBiL2JmZC9zdGFiLXN5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmZTZjOC4uMDAwMDAwMAotLS0gYS9iZmQvc3RhYi1zeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBUYWJsZSBvZiBzdGFiIG5hbWVzIGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotCi0jZGVmaW5lIEFSQ0hfU0laRSAzMgkJLyogVmFsdWUgZG9lc24ndCBtYXR0ZXIuICovCi0jaW5jbHVkZSAibGliYW91dC5oIgotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0KLS8qIElnbm9yZSBkdXBsaWNhdGUgc3RhYiBjb2RlczsganVzdCByZXR1cm4gdGhlIHN0cmluZyBmb3IgdGhlIGZpcnN0Ci0gICBvbmUuICAqLwotI2RlZmluZSBfX2RlZmluZV9zdGFiKE5BTUUsIENPREUsIFNUUklORykgX19kZWZpbmVfbmFtZShDT0RFLCBTVFJJTkcpCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKE5BTUUsIENPREUsIFNUUklORykKLQotLyogVGhlc2UgYXJlIG5vdCByZWFsbHkgc3RhYiBzeW1ib2xzLCBidXQgaXQgaXMKLSAgIGNvbnZlbmllbnQgdG8gaGF2ZSB0aGVtIGhlcmUgZm9yIHRoZSBzYWtlIG9mIG5tLgotICAgRm9yIGNvbXBsZXRlbmVzcywgd2UgY291bGQgYWxzbyBhZGQgTl9URVhUIGV0YywgYnV0IHRob3NlCi0gICBhcmUgbmV2ZXIgbmVlZGVkLCBzaW5jZSBubSB0cmVhdHMgdGhvc2Ugc3BlY2lhbGx5LiAqLwotI2RlZmluZSBFWFRSQV9TWU1CT0xTIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRBLCAiU0VUQSIpLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovIFwKLSAgX19kZWZpbmVfbmFtZSAoTl9TRVRULCAiU0VUVCIpLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVEQsICJTRVREIikvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fU0VUQiwgIlNFVEIiKS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8gXAotICBfX2RlZmluZV9uYW1lIChOX1NFVFYsICJTRVRWIikvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAqLyBcCi0gIF9fZGVmaW5lX25hbWUgKE5fSU5EUiwgIklORFIiKSBcCi0gIF9fZGVmaW5lX25hbWUgKE5fV0FSTklORywgIldBUk5JTkciKQotCi1jb25zdCBjaGFyICoKLWJmZF9nZXRfc3RhYl9uYW1lIChjb2RlKQotICAgICBpbnQgY29kZTsKLXsKLSAgc3dpdGNoIChjb2RlKQotICAgIHsKLSNkZWZpbmUgX19kZWZpbmVfbmFtZSh2YWwsIHN0cikgY2FzZSB2YWw6IHJldHVybiBzdHI7Ci0jaW5jbHVkZSAiYW91dC9zdGFiLmRlZiIKLSAgICAgIEVYVFJBX1NZTUJPTFMKLSAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICopIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvc3RhYnMuYyBiL2JmZC9zdGFicy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmMwMDBkLi4wMDAwMDAwCi0tLSBhL2JmZC9zdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLS8qIFN0YWJzIGluIHNlY3Rpb25zIGxpbmtpbmcgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3IgbGlua2luZyBzdGFicyBpbiBzZWN0aW9ucywgYXMgdXNlZAotICAgb24gQ09GRiBhbmQgRUxGLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLS8qIFN0YWJzIGVudHJpZXMgdXNlIGEgMTIgYnl0ZSBmb3JtYXQ6Ci0gICAgIDQgYnl0ZSBzdHJpbmcgdGFibGUgaW5kZXgKLSAgICAgMSBieXRlIHN0YWIgdHlwZQotICAgICAxIGJ5dGUgc3RhYiBvdGhlciBmaWVsZAotICAgICAyIGJ5dGUgc3RhYiBkZXNjIGZpZWxkCi0gICAgIDQgYnl0ZSBzdGFiIHZhbHVlCi0gICBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlIGZvciBhIDY0IGJpdCBvYmplY3QgZm9ybWF0LgotCi0gICBUaGUgc3RhYnMgc3ltYm9scyBhcmUgZGl2aWRlZCBpbnRvIGNvbXBpbGF0aW9uIHVuaXRzLiAgRm9yIHRoZQotICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aCBvZgotICAgdGhlIHN0cmluZyB0YWJsZSBmb3IgdGhpcyB1bml0LCBhbmQgdGhlIGRlc2MgZmllbGQgaXMgdGhlIG51bWJlciBvZgotICAgc3RhYnMgc3ltYm9scyBmb3IgdGhpcyB1bml0LiAgKi8KLQotI2RlZmluZSBTVFJEWE9GRiAoMCkKLSNkZWZpbmUgVFlQRU9GRiAoNCkKLSNkZWZpbmUgT1RIRVJPRkYgKDUpCi0jZGVmaW5lIERFU0NPRkYgKDYpCi0jZGVmaW5lIFZBTE9GRiAoOCkKLSNkZWZpbmUgU1RBQlNJWkUgKDEyKQotCi0vKiBBIGhhc2ggdGFibGUgdXNlZCBmb3IgaGVhZGVyIGZpbGVzIHdpdGggTl9CSU5DTCBlbnRyaWVzLiAgKi8KLQotc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIEEgbGlua2VkIGxpc3Qgb2YgdG90YWxzIHRoYXQgd2UgaGF2ZSBmb3VuZCBmb3IgYSBwYXJ0aWN1bGFyIGhlYWRlcgotICAgZmlsZS4gICovCi0KLXN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzCi17Ci0gIHN0cnVjdCBzdGFiX2xpbmtfaW5jbHVkZXNfdG90YWxzICpuZXh0OwotICBiZmRfdm1hIHRvdGFsOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5Ci17Ci0gIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSByb290OwotICAvKiBMaXN0IG9mIHRvdGFscyB3ZSBoYXZlIGZvdW5kIGZvciB0aGlzIGZpbGUuICAqLwotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqdG90YWxzOwotfTsKLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiB0aGUgaGVhZGVyIGZpbGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3RhYl9saW5rX2luY2x1ZGVzX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIFwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgbGlzdCBvZiBOX0JJTkNMIHN5bWJvbHMsIHNvbWUgb2YKLSAgIHdoaWNoIG1pZ2h0IGJlIGNvbnZlcnRlZCBpbnRvIE5fRVhDTCBzeW1ib2xzLiAgKi8KLQotc3RydWN0IHN0YWJfZXhjbF9saXN0Ci17Ci0gIC8qIFRoZSBuZXh0IHN5bWJvbCB0byBjb252ZXJ0LiAgKi8KLSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpuZXh0OwotICAvKiBUaGUgb2Zmc2V0IHRvIHRoaXMgc3ltYm9sIGluIHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBvZmZzZXQ7Ci0gIC8qIFRoZSB2YWx1ZSB0byB1c2UgZm9yIHRoZSBzeW1ib2wuICAqLwotICBiZmRfdm1hIHZhbDsKLSAgLyogVGhlIHR5cGUgb2YgdGhpcyBzeW1ib2wgKE5fQklOQ0wgb3IgTl9FWENMKS4gICovCi0gIGludCB0eXBlOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgc3RvcmVkIHdpdGggZWFjaCAuc3RhYiBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvCi17Ci0gIC8qIFRoaXMgaXMgYSBsaW5rZWQgbGlzdCBvZiBOX0JJTkNMIHN5bWJvbHMgd2hpY2ggc2hvdWxkIGJlCi0gICAgIGNvbnZlcnRlZCBpbnRvIE5fRVhDTCBzeW1ib2xzLiAgKi8KLSAgc3RydWN0IHN0YWJfZXhjbF9saXN0ICpleGNsczsKLQotICAvKiBUaGlzIGlzIHVzZWQgdG8gbWFwIGlucHV0IHN0YWIgb2Zmc2V0cyB3aXRoaW4gdGhlaXIgc2VjdGlvbnMKLSAgICAgdG8gb3V0cHV0IHN0YWIgb2Zmc2V0cywgdG8gdGFrZSBpbnRvIGFjY291bnQgc3RhYnMgdGhhdCBoYXZlCi0gICAgIGJlZW4gZGVsZXRlZC4gIElmIGl0IGlzIE5VTEwsIHRoZSBvdXRwdXQgb2Zmc2V0cyBhcmUgdGhlIHNhbWUKLSAgICAgYXMgdGhlIGlucHV0IG9mZnNldHMsIGJlY2F1c2Ugbm8gc3RhYnMgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbQotICAgICB0aGlzIHNlY3Rpb24uICBPdGhlcndpc2UgdGhlIGkndGggZW50cnkgaXMgdGhlIG51bWJlciBvZgotICAgICBieXRlcyBvZiBzdGFicyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIHByaW9yIHRvIHRoZSBpJ3RoCi0gICAgIHN0YWIuICovCi0gIGJmZF9zaXplX3R5cGUgKmN1bXVsYXRpdmVfc2tpcHM7Ci0KLSAgLyogVGhpcyBpcyBhbiBhcnJheSBvZiBzdHJpbmcgaW5kaWNlcy4gIEZvciBlYWNoIHN0YWIgc3ltYm9sLCB3ZQotICAgICBzdG9yZSB0aGUgc3RyaW5nIGluZGV4IGhlcmUuICBJZiBhIHN0YWIgc3ltYm9sIHNob3VsZCBub3QgYmUKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIG91dHB1dCwgdGhlIHN0cmluZyBpbmRleCBpcyAtMS4gICovCi0gIGJmZF9zaXplX3R5cGUgc3RyaWR4c1sxXTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBzdGFicyBpbiBzZWN0aW9ucwotICAgaW5mb3JtYXRpb24gd2hpbGUgbGlua2luZy4gICovCi0KLXN0cnVjdCBzdGFiX2luZm8KLXsKLSAgLyogQSBoYXNoIHRhYmxlIHVzZWQgdG8gaG9sZCBzdGFicyBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqc3RyaW5nczsKLSAgLyogVGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RhYmxlIGluY2x1ZGVzOwotICAvKiBUaGUgZmlyc3QgLnN0YWJzdHIgc2VjdGlvbi4gICovCi0gIGFzZWN0aW9uICpzdGFic3RyOwotfTsKLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqc3RhYl9saW5rX2luY2x1ZGVzX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLQwKLS8qIFRoZSBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGhlYWRlciBmaWxlIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0YWJfbGlua19pbmNsdWRlc19uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICpyZXQgPQotICAgIChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLAotCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPnRvdGFscyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQwKLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIGlucHV0IGZpbGUgZnJvbSB0aGUgYWRkX3N5bWJvbHMKLSAgIHBhc3Mgb2YgdGhlIGxpbmtlci4gICovCi0KLWJvb2xlYW4KLV9iZmRfbGlua19zZWN0aW9uX3N0YWJzIChhYmZkLCBwc2luZm8sIHN0YWJzZWMsIHN0YWJzdHJzZWMsIHBzZWNpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgICAgYXNlY3Rpb24gKnN0YWJzdHJzZWM7Ci0gICAgIFBUUiAqcHNlY2luZm87Ci17Ci0gIGJvb2xlYW4gZmlyc3Q7Ci0gIHN0cnVjdCBzdGFiX2luZm8gKnNpbmZvOwotICBiZmRfc2l6ZV90eXBlIGNvdW50OwotICBzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKnNlY2luZm87Ci0gIGJmZF9ieXRlICpzdGFiYnVmID0gTlVMTDsKLSAgYmZkX2J5dGUgKnN0YWJzdHJidWYgPSBOVUxMOwotICBiZmRfYnl0ZSAqc3ltLCAqc3ltZW5kOwotICBiZmRfc2l6ZV90eXBlIHN0cm9mZiwgbmV4dF9zdHJvZmYsIHNraXA7Ci0gIGJmZF9zaXplX3R5cGUgKnBzdHJpZHg7Ci0KLSAgaWYgKHN0YWJzZWMtPl9yYXdfc2l6ZSA9PSAwCi0gICAgICB8fCBzdGFic3Ryc2VjLT5fcmF3X3NpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGZpbGUgZG9lcyBub3QgY29udGFpbiBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChzdGFic2VjLT5fcmF3X3NpemUgJSBTVEFCU0laRSAhPSAwKQotICAgIHsKLSAgICAgIC8qIFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBmb3JtYXQgb2YgdGhlc2Ugc3RhYiBzeW1ib2xzLgotICAgICAgICAgRG9uJ3QgdHJ5IHRvIG9wdGltaXplIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICgoc3RhYnN0cnNlYy0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0gICAgewotICAgICAgLyogV2Ugc2hvdWxkbid0IHNlZSByZWxvY2F0aW9ucyBpbiB0aGUgc3RyaW5ncywgYW5kIHdlIGFyZW4ndAotICAgICAgICAgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICgoc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTAotICAgICAgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24pKQotICAgICAgfHwgKHN0YWJzdHJzZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAoc3RhYnN0cnNlYy0+b3V0cHV0X3NlY3Rpb24pKSkKLSAgICB7Ci0gICAgICAvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHNlY3Rpb25zIGlzIGJlaW5nIGRpc2NhcmRlZCBmcm9tIHRoZQotICAgICAgICAgbGluaywgc28gd2Ugc2hvdWxkIGp1c3QgaWdub3JlIHRoZW0uICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGZpcnN0ID0gZmFsc2U7Ci0KLSAgaWYgKCpwc2luZm8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBzdGFicyBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YuICAqLwotICAgICAgZmlyc3QgPSB0cnVlOwotICAgICAgKnBzaW5mbyA9IChQVFIpIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3Qgc3RhYl9pbmZvKSk7Ci0gICAgICBpZiAoKnBzaW5mbyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc2luZm8gPSAoc3RydWN0IHN0YWJfaW5mbyAqKSAqcHNpbmZvOwotICAgICAgc2luZm8tPnN0cmluZ3MgPSBfYmZkX3N0cmluZ3RhYl9pbml0ICgpOwotICAgICAgaWYgKHNpbmZvLT5zdHJpbmdzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKCZzaW5mby0+aW5jbHVkZXMucm9vdCwKLQkJCQkgICBzdGFiX2xpbmtfaW5jbHVkZXNfbmV3ZnVuYywKLQkJCQkgICAyNTEpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgc2luZm8tPnN0YWJzdHIgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5zdGFic3RyIik7Ci0gICAgICBzaW5mby0+c3RhYnN0ci0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSB8IFNFQ19ERUJVR0dJTkc7Ci0gICAgfQotCi0gIHNpbmZvID0gKHN0cnVjdCBzdGFiX2luZm8gKikgKnBzaW5mbzsKLQotICAvKiBJbml0aWFsaXplIHRoZSBpbmZvcm1hdGlvbiB3ZSBhcmUgZ29pbmcgdG8gc3RvcmUgZm9yIHRoaXMgLnN0YWIKLSAgICAgc2VjdGlvbi4gICovCi0KLSAgY291bnQgPSBzdGFic2VjLT5fcmF3X3NpemUgLyBTVEFCU0laRTsKLQotICAqcHNlY2luZm8gPSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkgKHNpemVvZiAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvKQotCQkJICArIChjb3VudCAtIDEpICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSkpOwotICBpZiAoKnBzZWNpbmZvID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc2VjaW5mbyA9IChzdHJ1Y3Qgc3RhYl9zZWN0aW9uX2luZm8gKikgKnBzZWNpbmZvOwotICBzZWNpbmZvLT5leGNscyA9IE5VTEw7Ci0gIHNlY2luZm8tPmN1bXVsYXRpdmVfc2tpcHMgPSBOVUxMOwotICBtZW1zZXQgKHNlY2luZm8tPnN0cmlkeHMsIDAsIGNvdW50ICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0KLSAgLyogUmVhZCB0aGUgc3RhYnMgaW5mb3JtYXRpb24gZnJvbSBhYmZkLiAgKi8KLQotICBzdGFiYnVmID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0gIHN0YWJzdHJidWYgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3RhYnN0cnNlYy0+X3Jhd19zaXplKTsKLSAgaWYgKHN0YWJidWYgPT0gTlVMTCB8fCBzdGFic3RyYnVmID09IE5VTEwpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzdGFic2VjLCBzdGFiYnVmLCAwLAotCQkJCSAgc3RhYnNlYy0+X3Jhd19zaXplKQotICAgICAgfHwgISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzdHJzZWMsIHN0YWJzdHJidWYsIDAsCi0JCQkJICAgICBzdGFic3Ryc2VjLT5fcmF3X3NpemUpKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc3RhYnMgc3ltYm9scywgd29yayBvdXQgdGhlIG5ldyBzdHJpbmcgaW5kaWNlcywKLSAgICAgYW5kIGlkZW50aWZ5IE5fQklOQ0wgc3ltYm9scyB3aGljaCBjYW4gYmUgZWxpbWluYXRlZC4gICovCi0KLSAgc3Ryb2ZmID0gMDsKLSAgbmV4dF9zdHJvZmYgPSAwOwotICBza2lwID0gMDsKLQotICBzeW1lbmQgPSBzdGFiYnVmICsgc3RhYnNlYy0+X3Jhd19zaXplOwotICBmb3IgKHN5bSA9IHN0YWJidWYsIHBzdHJpZHggPSBzZWNpbmZvLT5zdHJpZHhzOwotICAgICAgIHN5bSA8IHN5bWVuZDsKLSAgICAgICBzeW0gKz0gU1RBQlNJWkUsICsrcHN0cmlkeCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLQotICAgICAgaWYgKCpwc3RyaWR4ICE9IDApCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkIGJ5IGFuIE5fQklOQ0wgcGFzcy4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHR5cGUgPSBzeW1bVFlQRU9GRl07Ci0KLSAgICAgIGlmICh0eXBlID09IDApCi0JewotCSAgLyogU3BlY2lhbCB0eXBlIDAgc3RhYnMgaW5kaWNhdGUgdGhlIG9mZnNldCB0byB0aGUgbmV4dAotICAgICAgICAgICAgIHN0cmluZyB0YWJsZS4gIFdlIG9ubHkgY29weSB0aGUgdmVyeSBmaXJzdCBvbmUuICAqLwotCSAgc3Ryb2ZmID0gbmV4dF9zdHJvZmY7Ci0JICBuZXh0X3N0cm9mZiArPSBiZmRfZ2V0XzMyIChhYmZkLCBzeW0gKyA4KTsKLQkgIGlmICghIGZpcnN0KQotCSAgICB7Ci0JICAgICAgKnBzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JICAgICAgKytza2lwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBmaXJzdCA9IGZhbHNlOwotCX0KLQotICAgICAgLyogU3RvcmUgdGhlIHN0cmluZyBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIHJlY29yZCB0aGUgaW5kZXguICAqLwotICAgICAgc3RyaW5nID0gKChjaGFyICopIHN0YWJzdHJidWYKLQkJKyBzdHJvZmYKLQkJKyBiZmRfZ2V0XzMyIChhYmZkLCBzeW0gKyBTVFJEWE9GRikpOwotICAgICAgKnBzdHJpZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKHNpbmZvLT5zdHJpbmdzLCBzdHJpbmcsIHRydWUsIHRydWUpOwotCi0gICAgICAvKiBBbiBOX0JJTkNMIHN5bWJvbCBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBzdGFicyBlbnRyaWVzCi0JIGZvciBhIGhlYWRlciBmaWxlLiAgV2UgbmVlZCB0byBzY2FuIGFoZWFkIHRvIHRoZSBuZXh0IE5fRUlOQ0wKLQkgc3ltYm9sLCBpZ25vcmluZyBuZXN0aW5nLCBhZGRpbmcgdXAgYWxsIHRoZSBjaGFyYWN0ZXJzIGluIHRoZQotCSBzeW1ib2wgbmFtZXMsIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUgbnVtYmVycyBpbiB0eXBlcyAodGhlCi0JIGZpcnN0IG51bWJlciBhZnRlciBhbiBvcGVuIHBhcmVudGhlc2lzKS4gICovCi0gICAgICBpZiAodHlwZSA9PSBOX0JJTkNMKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCSAgaW50IG5lc3Q7Ci0JICBiZmRfYnl0ZSAqaW5jbF9zeW07Ci0JICBzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX2VudHJ5ICppbmNsX2VudHJ5OwotCSAgc3RydWN0IHN0YWJfbGlua19pbmNsdWRlc190b3RhbHMgKnQ7Ci0JICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKm5lOwotCi0JICB2YWwgPSAwOwotCSAgbmVzdCA9IDA7Ci0JICBmb3IgKGluY2xfc3ltID0gc3ltICsgU1RBQlNJWkU7Ci0JICAgICAgIGluY2xfc3ltIDwgc3ltZW5kOwotCSAgICAgICBpbmNsX3N5bSArPSBTVEFCU0laRSkKLQkgICAgewotCSAgICAgIGludCBpbmNsX3R5cGU7Ci0KLQkgICAgICBpbmNsX3R5cGUgPSBpbmNsX3N5bVtUWVBFT0ZGXTsKLQkgICAgICBpZiAoaW5jbF90eXBlID09IDApCi0JCWJyZWFrOwotCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0VJTkNMKQotCQl7Ci0JCSAgaWYgKG5lc3QgPT0gMCkKLQkJICAgIGJyZWFrOwotCQkgIC0tbmVzdDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGluY2xfdHlwZSA9PSBOX0JJTkNMKQotCQkrK25lc3Q7Ci0JICAgICAgZWxzZSBpZiAobmVzdCA9PSAwKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqc3RyOwotCi0JCSAgc3RyID0gKChjaGFyICopIHN0YWJzdHJidWYKLQkJCSArIHN0cm9mZgotCQkJICsgYmZkX2dldF8zMiAoYWJmZCwgaW5jbF9zeW0gKyBTVFJEWE9GRikpOwotCQkgIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKQotCQkgICAgewotCQkgICAgICB2YWwgKz0gKnN0cjsKLQkJICAgICAgaWYgKCpzdHIgPT0gJygnKQotCQkJewotCQkJICAvKiBTa2lwIHRoZSBmaWxlIG51bWJlci4gICovCi0JCQkgICsrc3RyOwotCQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzdHIpKQotCQkJICAgICsrc3RyOwotCQkJICAtLXN0cjsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBhIGhlYWRlciBmaWxlIHdpdGggdGhlIHNhbWUKLQkgICAgIHZhbHVlLCB0aGVuIHJlcGxhY2VkIHRoaXMgb25lIHdpdGggYW4gTl9FWENMIHN5bWJvbC4gICovCi0JICBpbmNsX2VudHJ5ID0gc3RhYl9saW5rX2luY2x1ZGVzX2xvb2t1cCAoJnNpbmZvLT5pbmNsdWRlcywgc3RyaW5nLAotCQkJCQkJICB0cnVlLCB0cnVlKTsKLQkgIGlmIChpbmNsX2VudHJ5ID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICBmb3IgKHQgPSBpbmNsX2VudHJ5LT50b3RhbHM7IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JICAgIGlmICh0LT50b3RhbCA9PSB2YWwpCi0JICAgICAgYnJlYWs7Ci0KLQkgIC8qIFJlY29yZCB0aGlzIHN5bWJvbCwgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSB2YWx1ZQotICAgICAgICAgICAgIGNvcnJlY3RseS4gICovCi0JICBuZSA9IChzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKikgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKm5lKTsKLQkgIGlmIChuZSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIG5lLT5vZmZzZXQgPSBzeW0gLSBzdGFiYnVmOwotCSAgbmUtPnZhbCA9IHZhbDsKLQkgIG5lLT50eXBlID0gTl9CSU5DTDsKLQkgIG5lLT5uZXh0ID0gc2VjaW5mby0+ZXhjbHM7Ci0JICBzZWNpbmZvLT5leGNscyA9IG5lOwotCi0JICBpZiAodCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHNlZW4gdGhpcyBoZWFkZXIgZmlsZQotCQkgd2l0aCB0aGlzIHNldCBvZiBzdGFicyBzdHJpbmdzLiAgKi8KLQkgICAgICB0ID0gKChzdHJ1Y3Qgc3RhYl9saW5rX2luY2x1ZGVzX3RvdGFscyAqKQotCQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAoJnNpbmZvLT5pbmNsdWRlcy5yb290LCBzaXplb2YgKnQpKTsKLQkgICAgICBpZiAodCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB0LT50b3RhbCA9IHZhbDsKLQkgICAgICB0LT5uZXh0ID0gaW5jbF9lbnRyeS0+dG90YWxzOwotCSAgICAgIGluY2xfZW50cnktPnRvdGFscyA9IHQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgKmluY2xfcHN0cmlkeDsKLQotCSAgICAgIC8qIFdlIGhhdmUgc2VlbiB0aGlzIGhlYWRlciBmaWxlIGJlZm9yZS4gIFRlbGwgdGhlIGZpbmFsCi0JCSBwYXNzIHRvIGNoYW5nZSB0aGUgdHlwZSB0byBOX0VYQ0wuICAqLwotCSAgICAgIG5lLT50eXBlID0gTl9FWENMOwotCi0JICAgICAgLyogTWFyayB0aGUgc2tpcHBlZCBzeW1ib2xzLiAgKi8KLQotCSAgICAgIG5lc3QgPSAwOwotCSAgICAgIGZvciAoaW5jbF9zeW0gPSBzeW0gKyBTVEFCU0laRSwgaW5jbF9wc3RyaWR4ID0gcHN0cmlkeCArIDE7Ci0JCSAgIGluY2xfc3ltIDwgc3ltZW5kOwotCQkgICBpbmNsX3N5bSArPSBTVEFCU0laRSwgKytpbmNsX3BzdHJpZHgpCi0JCXsKLQkJICBpbnQgaW5jbF90eXBlOwotCi0JCSAgaW5jbF90eXBlID0gaW5jbF9zeW1bVFlQRU9GRl07Ci0KLQkJICBpZiAoaW5jbF90eXBlID09IE5fRUlOQ0wpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChuZXN0ID09IDApCi0JCQl7Ci0JCQkgICppbmNsX3BzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JCQkgICsrc2tpcDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIC0tbmVzdDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbmNsX3R5cGUgPT0gTl9CSU5DTCkKLQkJICAgICsrbmVzdDsKLQkJICBlbHNlIGlmIChuZXN0ID09IDApCi0JCSAgICB7Ci0JCSAgICAgICppbmNsX3BzdHJpZHggPSAoYmZkX3NpemVfdHlwZSkgLTE7Ci0JCSAgICAgICsrc2tpcDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBmcmVlIChzdGFiYnVmKTsKLSAgc3RhYmJ1ZiA9IE5VTEw7Ci0gIGZyZWUgKHN0YWJzdHJidWYpOwotICBzdGFic3RyYnVmID0gTlVMTDsKLQotICAvKiBXZSBuZWVkIHRvIHNldCB0aGUgc2VjdGlvbiBzaXplcyBzdWNoIHRoYXQgdGhlIGxpbmtlciB3aWxsCi0gICAgIGNvbXB1dGUgdGhlIG91dHB1dCBzZWN0aW9uIHNpemVzIGNvcnJlY3RseS4gIFdlIHNldCB0aGUgLnN0YWIKLSAgICAgc2l6ZSB0byBub3QgaW5jbHVkZSB0aGUgZW50cmllcyB3ZSBkb24ndCB3YW50LiAgV2Ugc2V0Ci0gICAgIFNFQ19FWENMVURFIGZvciB0aGUgLnN0YWJzdHIgc2VjdGlvbiwgc28gdGhhdCBpdCB3aWxsIGJlIGRyb3BwZWQKLSAgICAgZnJvbSB0aGUgbGluay4gIFdlIHJlY29yZCB0aGUgc2l6ZSBvZiB0aGUgc3RydGFiIGluIHRoZSBmaXJzdAotICAgICAuc3RhYnN0ciBzZWN0aW9uIHdlIHNhdywgYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBzZXQgU0VDX0VYQ0xVREUKLSAgICAgZm9yIHRoYXQgc2VjdGlvbi4gICovCi0gIHN0YWJzZWMtPl9jb29rZWRfc2l6ZSA9IChjb3VudCAtIHNraXApICogU1RBQlNJWkU7Ci0gIGlmIChzdGFic2VjLT5fY29va2VkX3NpemUgPT0gMCkKLSAgICBzdGFic2VjLT5mbGFncyB8PSBTRUNfRVhDTFVERTsKLSAgc3RhYnN0cnNlYy0+ZmxhZ3MgfD0gU0VDX0VYQ0xVREU7Ci0gIHNpbmZvLT5zdGFic3RyLT5fY29va2VkX3NpemUgPSBfYmZkX3N0cmluZ3RhYl9zaXplIChzaW5mby0+c3RyaW5ncyk7Ci0KLSAgLyogQ2FsY3VsYXRlIHRoZSBgY3VtdWxhdGl2ZV9za2lwcycgYXJyYXkgbm93IHRoYXQgc3RhYnMgaGF2ZSBiZWVuCi0gICAgIGRlbGV0ZWQgZm9yIHRoaXMgc2VjdGlvbi4gKi8KLQotICBpZiAoc2tpcCAhPSAwKQotICAgIHsKLSAgICAgIGJmZF9zaXplX3R5cGUgaSwgb2Zmc2V0OwotICAgICAgYmZkX3NpemVfdHlwZSAqcHNraXBzOwotCi0gICAgICBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzID0KLQkoYmZkX3NpemVfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIGNvdW50ICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0gICAgICBpZiAoc2VjaW5mby0+Y3VtdWxhdGl2ZV9za2lwcyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICBwc2tpcHMgPSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzOwotICAgICAgcHN0cmlkeCA9IHNlY2luZm8tPnN0cmlkeHM7Ci0gICAgICBvZmZzZXQgPSAwOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcHNraXBzKyssIHBzdHJpZHgrKykKLQl7Ci0JICAqcHNraXBzID0gb2Zmc2V0OwotCSAgaWYgKCpwc3RyaWR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkgICAgb2Zmc2V0ICs9IFNUQUJTSVpFOwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAob2Zmc2V0ICE9IDApOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHN0YWJidWYgIT0gTlVMTCkKLSAgICBmcmVlIChzdGFiYnVmKTsKLSAgaWYgKHN0YWJzdHJidWYgIT0gTlVMTCkKLSAgICBmcmVlIChzdGFic3RyYnVmKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIHN0YWIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIHJlbG9jYXRlZAotICAgY29udGVudHMuICAqLwotCi1ib29sZWFuCi1fYmZkX3dyaXRlX3NlY3Rpb25fc3RhYnMgKG91dHB1dF9iZmQsIHBzaW5mbywgc3RhYnNlYywgcHNlY2luZm8sIGNvbnRlbnRzKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotICAgICBhc2VjdGlvbiAqc3RhYnNlYzsKLSAgICAgUFRSICpwc2VjaW5mbzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotewotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotICBzdHJ1Y3Qgc3RhYl9leGNsX2xpc3QgKmU7Ci0gIGJmZF9ieXRlICpzeW0sICp0b3N5bSwgKnN5bWVuZDsKLSAgYmZkX3NpemVfdHlwZSAqcHN0cmlkeDsKLQotICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLQotICBpZiAoc2VjaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dHB1dF9iZmQsIHN0YWJzZWMtPm91dHB1dF9zZWN0aW9uLAotCQkJCSAgICAgY29udGVudHMsIHN0YWJzZWMtPm91dHB1dF9vZmZzZXQsCi0JCQkJICAgICBzdGFic2VjLT5fcmF3X3NpemUpOwotCi0gIC8qIEhhbmRsZSBlYWNoIE5fQklOQ0wgZW50cnkuICAqLwotICBmb3IgKGUgPSBzZWNpbmZvLT5leGNsczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqZXhjbF9zeW07Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGUtPm9mZnNldCA8IHN0YWJzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBleGNsX3N5bSA9IGNvbnRlbnRzICsgZS0+b2Zmc2V0OwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgZS0+dmFsLCBleGNsX3N5bSArIFZBTE9GRik7Ci0gICAgICBleGNsX3N5bVtUWVBFT0ZGXSA9IGUtPnR5cGU7Ci0gICAgfQotCi0gIC8qIENvcHkgb3ZlciBhbGwgdGhlIHN0YWJzIHN5bWJvbHMsIG9taXR0aW5nIHRoZSBvbmVzIHdlIGRvbid0IHdhbnQsCi0gICAgIGFuZCBjb3JyZWN0aW5nIHRoZSBzdHJpbmcgaW5kaWNlcyBmb3IgdGhvc2Ugd2UgZG8gd2FudC4gICovCi0gIHRvc3ltID0gY29udGVudHM7Ci0gIHN5bWVuZCA9IGNvbnRlbnRzICsgc3RhYnNlYy0+X3Jhd19zaXplOwotICBmb3IgKHN5bSA9IGNvbnRlbnRzLCBwc3RyaWR4ID0gc2VjaW5mby0+c3RyaWR4czsKLSAgICAgICBzeW0gPCBzeW1lbmQ7Ci0gICAgICAgc3ltICs9IFNUQUJTSVpFLCArK3BzdHJpZHgpCi0gICAgewotICAgICAgaWYgKCpwc3RyaWR4ICE9IChiZmRfc2l6ZV90eXBlKSAtMSkKLQl7Ci0JICBpZiAodG9zeW0gIT0gc3ltKQotCSAgICBtZW1jcHkgKHRvc3ltLCBzeW0sIFNUQUJTSVpFKTsKLQkgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsICpwc3RyaWR4LCB0b3N5bSArIFNUUkRYT0ZGKTsKLQotCSAgaWYgKHN5bVtUWVBFT0ZGXSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgaGVhZGVyIHN5bWJvbCBmb3IgdGhlIHN0YWJzIHNlY3Rpb24uICBXZQotICAgICAgICAgICAgICAgICBkb24ndCByZWFsbHkgbmVlZCBvbmUsIHNpbmNlIHdlIGhhdmUgbWVyZ2VkIGFsbCB0aGUKLSAgICAgICAgICAgICAgICAgaW5wdXQgc3RhYnMgc2VjdGlvbnMgaW50byBvbmUsIGJ1dCB3ZSBnZW5lcmF0ZSBvbmUKLSAgICAgICAgICAgICAgICAgZm9yIHRoZSBiZW5lZml0IG9mIHJlYWRlcnMgd2hpY2ggZXhwZWN0IHRvIHNlZSBvbmUuICAqLwotCSAgICAgIEJGRF9BU1NFUlQgKHN5bSA9PSBjb250ZW50cyk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoc2luZm8tPnN0cmluZ3MpLAotCQkJICB0b3N5bSArIFZBTE9GRik7Ci0JICAgICAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwKLQkJCSAgc3RhYnNlYy0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSAvIFNUQUJTSVpFIC0gMSwKLQkJCSAgdG9zeW0gKyBERVNDT0ZGKTsKLQkgICAgfQotCi0JICB0b3N5bSArPSBTVEFCU0laRTsKLQl9Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChiZmRfc2l6ZV90eXBlKSAodG9zeW0gLSBjb250ZW50cykgPT0gc3RhYnNlYy0+X2Nvb2tlZF9zaXplKTsKLQotICByZXR1cm4gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBzdGFic2VjLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICBjb250ZW50cywgc3RhYnNlYy0+b3V0cHV0X29mZnNldCwKLQkJCQkgICBzdGFic2VjLT5fY29va2VkX3NpemUpOwotfQotCi0vKiBXcml0ZSBvdXQgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotCi1ib29sZWFuCi1fYmZkX3dyaXRlX3N0YWJfc3RyaW5ncyAob3V0cHV0X2JmZCwgcHNpbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIFBUUiAqcHNpbmZvOwotewotICBzdHJ1Y3Qgc3RhYl9pbmZvICpzaW5mbzsKLQotICBzaW5mbyA9IChzdHJ1Y3Qgc3RhYl9pbmZvICopICpwc2luZm87Ci0KLSAgaWYgKHNpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGJmZF9pc19hYnNfc2VjdGlvbiAoc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc2VjdGlvbiB3YXMgZGlzY2FyZGVkIGZyb20gdGhlIGxpbmsuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIEJGRF9BU1NFUlQgKChzaW5mby0+c3RhYnN0ci0+b3V0cHV0X29mZnNldAotCSAgICAgICArIF9iZmRfc3RyaW5ndGFiX3NpemUgKHNpbmZvLT5zdHJpbmdzKSkKLQkgICAgICA8PSBzaW5mby0+c3RhYnN0ci0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLSAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkoc2luZm8tPnN0YWJzdHItPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zCi0JCSArIHNpbmZvLT5zdGFic3RyLT5vdXRwdXRfb2Zmc2V0KSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKG91dHB1dF9iZmQsIHNpbmZvLT5zdHJpbmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogV2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHN0YWJzIGluZm9ybWF0aW9uLiAgKi8KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoc2luZm8tPnN0cmluZ3MpOwotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmc2luZm8tPmluY2x1ZGVzLnJvb3QpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGp1c3QgYW4gYWRkcmVzcyBpbiB0aGUgLnN0YWIgc2VjdGlvbi4gIEdpdmVuIE9GRlNFVCB3aXRoaW4KLSAgIFNUQUJTRUMsIHRoaXMgcmV0dXJucyB0aGUgbmV3IG9mZnNldCBpbiB0aGUgYWRqdXN0ZWQgc3RhYiBzZWN0aW9uLAotICAgb3IgLTEgaWYgdGhlIGFkZHJlc3MgcmVmZXJzIHRvIGEgc3RhYiB3aGljaCBoYXMgYmVlbiByZW1vdmVkLiAgKi8KLQotYmZkX3ZtYQotX2JmZF9zdGFiX3NlY3Rpb25fb2Zmc2V0IChvdXRwdXRfYmZkLCBwc2luZm8sIHN0YWJzZWMsIHBzZWNpbmZvLCBvZmZzZXQpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgUFRSICpwc2luZm87Ci0gICAgIGFzZWN0aW9uICpzdGFic2VjOwotICAgICBQVFIgKnBzZWNpbmZvOwotICAgICBiZmRfdm1hIG9mZnNldDsKLXsKLSAgc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICpzZWNpbmZvOwotCi0gIHNlY2luZm8gPSAoc3RydWN0IHN0YWJfc2VjdGlvbl9pbmZvICopICpwc2VjaW5mbzsKLQotICBpZiAoc2VjaW5mbyA9PSBOVUxMKQotICAgIHJldHVybiBvZmZzZXQ7Ci0KLSAgaWYgKG9mZnNldCA+PSBzdGFic2VjLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIG9mZnNldCAtIChzdGFic2VjLT5fY29va2VkX3NpemUgLSBzdGFic2VjLT5fcmF3X3NpemUpOwotCi0gIGlmIChzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzKQotICAgIHsKLSAgICAgIGJmZF92bWEgaTsKLQotICAgICAgaSA9IG9mZnNldCAvIFNUQUJTSVpFOwotCi0gICAgICBpZiAoc2VjaW5mby0+c3RyaWR4cyBbaV0gPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiAoYmZkX3ZtYSkgLTE7Ci0KLSAgICAgIHJldHVybiBvZmZzZXQgLSBzZWNpbmZvLT5jdW11bGF0aXZlX3NraXBzIFtpXTsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KZGlmZiAtLWdpdCBhL2JmZC9zdGFtcC1oLmluIGIvYmZkL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvYmZkL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2JmZC9zdW5vcy5jIGIvYmZkL3N1bm9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNGY4NzguLjAwMDAwMDAKLS0tIGEvYmZkL3N1bm9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQ4ICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBTdW5PUyBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXN1bm9zLWJpZyIKLSNkZWZpbmUgTVkoT1ApIENBVChzdW5vc19iaWdfLE9QKQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmFvdXQuaCIKLQotLyogU3RhdGljIHJvdXRpbmVzIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gc3Vub3NfcmVhZF9keW5hbWljX2luZm8gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2x1cnBfZHluYW1pY19zeW10YWIgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKikpOwotc3RhdGljIGxvbmcgc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBsb25nIHN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqLCBhcmVsZW50ICoqLCBhc3ltYm9sICoqKSk7Ci1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdW5vc19saW5rX2hhc2hfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpzdW5vc19saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfYWRkX2R5bmFtaWNfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGV4dGVybmFsX25saXN0ICoqLAotCSAgIGJmZF9zaXplX3R5cGUgKiwgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfYWRkX29uZV9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYmZkICosIGNvbnN0IGNoYXIgKiwgZmxhZ3dvcmQsIGFzZWN0aW9uICosCi0JICAgYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBib29sZWFuLCBib29sZWFuLAotCSAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19zY2FuX3JlbG9jcwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9zdGRfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfc2Nhbl9leHRfcmVsb2NzCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKiwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIGJvb2xlYW4gc3Vub3NfbGlua19keW5hbWljX29iamVjdAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gc3Vub3Nfd3JpdGVfZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdW5vc19jaGVja19keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIGJmZCAqLCBhc2VjdGlvbiAqLAotCSAgIHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIsIGJmZF9ieXRlICosIGJvb2xlYW4gKiwKLQkgICBiZmRfdm1hICopKTsKLXN0YXRpYyBib29sZWFuIHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmsKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotI2RlZmluZSBNWV9nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgc3Vub3NfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kCi0jZGVmaW5lIE1ZX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiBzdW5vc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSNkZWZpbmUgTVlfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQgc3Vub3NfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQKLSNkZWZpbmUgTVlfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2Mgc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MKLSNkZWZpbmUgTVlfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgc3Vub3NfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSBNWV9hZGRfZHluYW1pY19zeW1ib2xzIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMKLSNkZWZpbmUgTVlfYWRkX29uZV9zeW1ib2wgc3Vub3NfYWRkX29uZV9zeW1ib2wKLSNkZWZpbmUgTVlfbGlua19keW5hbWljX29iamVjdCBzdW5vc19saW5rX2R5bmFtaWNfb2JqZWN0Ci0jZGVmaW5lIE1ZX3dyaXRlX2R5bmFtaWNfc3ltYm9sIHN1bm9zX3dyaXRlX2R5bmFtaWNfc3ltYm9sCi0jZGVmaW5lIE1ZX2NoZWNrX2R5bmFtaWNfcmVsb2Mgc3Vub3NfY2hlY2tfZHluYW1pY19yZWxvYwotI2RlZmluZSBNWV9maW5pc2hfZHluYW1pY19saW5rIHN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmsKLQotLyogPz8/IFdoZXJlIHNob3VsZCB0aGlzIGdvPyAgKi8KLSNkZWZpbmUgTUFDSFRZUEVfT0sobXR5cGUpIFwKLSAgKCgobXR5cGUpID09IE1fU1BBUkMgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgMCkgIT0gTlVMTCkgXAotICAgfHwgKChtdHlwZSkgPT0gTV9TUEFSQ0xFVCBcCi0gICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpICE9IE5VTEwpIFwKLSAgIHx8ICgobXR5cGUpID09IE1fU1BBUkNMSVRFX0xFIFwKLSAgICAgICAmJiBiZmRfbG9va3VwX2FyY2ggKGJmZF9hcmNoX3NwYXJjLCBiZmRfbWFjaF9zcGFyY19zcGFyY2xldCkgIT0gTlVMTCkgXAotICAgfHwgKCgobXR5cGUpID09IE1fVU5LTk9XTiB8fCAobXR5cGUpID09IE1fNjgwMTAgfHwgKG10eXBlKSA9PSBNXzY4MDIwKSBcCi0gICAgICAgJiYgYmZkX2xvb2t1cF9hcmNoIChiZmRfYXJjaF9tNjhrLCAwKSAhPSBOVUxMKSkKLQotLyogSW5jbHVkZSB0aGUgdXN1YWwgYS5vdXQgc3VwcG9ydC4gICovCi0jaW5jbHVkZSAiYW91dGYxLmgiCi0KLS8qIFRoZSBTdW5PUyA0LjEuNCAvdXNyL2luY2x1ZGUvbG9jYWxlLmggZGVmaW5lcyB2YWxpZCBhcyBhIG1hY3JvLiAgKi8KLSN1bmRlZiB2YWxpZAotCi0vKiBTdW5PUyBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LiAgV2Ugc3RvcmUgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlCi0gICBpbiBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpLiAgKi8KLQotc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbwotewotICAvKiBXaGV0aGVyIHdlIGZvdW5kIGFueSBkeW5hbWljIGluZm9ybWF0aW9uLiAgKi8KLSAgYm9vbGVhbiB2YWxpZDsKLSAgLyogRHluYW1pYyBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluayBkeW5pbmZvOwotICAvKiBOdW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBkeW5zeW1fY291bnQ7Ci0gIC8qIFJlYWQgaW4gbmxpc3RzIGZvciBkeW5hbWljIHN5bWJvbHMuICAqLwotICBzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKmR5bnN5bTsKLSAgLyogYXN5bWJvbCBzdHJ1Y3R1cmVzIGZvciBkeW5hbWljIHN5bWJvbHMuICAqLwotICBhb3V0X3N5bWJvbF90eXBlICpjYW5vbmljYWxfZHluc3ltOwotICAvKiBSZWFkIGluIGR5bmFtaWMgc3RyaW5nIHRhYmxlLiAgKi8KLSAgY2hhciAqZHluc3RyOwotICAvKiBOdW1iZXIgb2YgZHluYW1pYyByZWxvY3MuICAqLwotICB1bnNpZ25lZCBsb25nIGR5bnJlbF9jb3VudDsKLSAgLyogUmVhZCBpbiBkeW5hbWljIHJlbG9jcy4gIFRoaXMgbWF5IGJlIHJlbG9jX3N0ZF9leHRlcm5hbCBvcgotICAgICByZWxvY19leHRfZXh0ZXJuYWwuICAqLwotICBQVFIgZHlucmVsOwotICAvKiBhcmVsZW50IHN0cnVjdHVyZXMgZm9yIGR5bmFtaWMgcmVsb2NzLiAgKi8KLSAgYXJlbGVudCAqY2Fub25pY2FsX2R5bnJlbDsKLX07Ci0KLS8qIFRoZSBoYXNoIHRhYmxlIG9mIGR5bmFtaWMgc3ltYm9scyBpcyBjb21wb3NlZCBvZiB0d28gd29yZCBlbnRyaWVzLgotICAgU2VlIGluY2x1ZGUvYW91dC9zdW40LmggZm9yIGRldGFpbHMuICAqLwotCi0jZGVmaW5lIEhBU0hfRU5UUllfU0laRSAoMiAqIEJZVEVTX0lOX1dPUkQpCi0KLS8qIFJlYWQgaW4gdGhlIGJhc2ljIGR5bmFtaWMgaW5mb3JtYXRpb24uICBUaGlzIGxvY2F0ZXMgdGhlIF9fRFlOQU1JQwotICAgc3RydWN0dXJlIGFuZCB1c2VzIGl0IHRvIGZpbmQgdGhlIGR5bmFtaWNfbGluayBzdHJ1Y3R1cmUuICBJdAotICAgY3JlYXRlcyBhbmQgc2F2ZXMgYSBzdW5vc19keW5hbWljX2luZm8gc3RydWN0dXJlLiAgSWYgaXQgY2FuJ3QgZmluZAotICAgX19EWU5BTUlDLCBpdCBzZXRzIHRoZSB2YWxpZCBmaWVsZCBvZiB0aGUgc3Vub3NfZHluYW1pY19pbmZvCi0gICBzdHJ1Y3R1cmUgdG8gZmFsc2UgdG8gYXZvaWQgZG9pbmcgdGhpcyB3b3JrIGFnYWluLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0gIGFzZWN0aW9uICpkeW5zZWM7Ci0gIGJmZF92bWEgZHlub2ZmOwotICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljIGR5bmluZm87Ci0gIHVuc2lnbmVkIGxvbmcgZHludmVyOwotICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsgbGlua2luZm87Ci0KLSAgaWYgKG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCkgIT0gKFBUUikgTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvID0gKChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopCi0JICBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8pKSk7Ci0gIGlmICghaW5mbykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnZhbGlkID0gZmFsc2U7Ci0gIGluZm8tPmR5bnN5bSA9IE5VTEw7Ci0gIGluZm8tPmR5bnN0ciA9IE5VTEw7Ci0gIGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPSBOVUxMOwotICBpbmZvLT5keW5yZWwgPSBOVUxMOwotICBpbmZvLT5jYW5vbmljYWxfZHlucmVsID0gTlVMTDsKLSAgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKSA9IChQVFIpIGluZm87Ci0KLSAgLyogVGhpcyBjb2RlIHVzZWQgdG8gbG9vayBmb3IgdGhlIF9fRFlOQU1JQyBzeW1ib2wgdG8gbG9jYXRlIHRoZSBkeW5hbWljCi0gICAgIGxpbmtpbmcgaW5mb3JtYXRpb24uCi0gICAgIEhvd2V2ZXIgdGhpcyBpbmhpYml0cyByZWNvdmVyaW5nIHRoZSBkeW5hbWljIHN5bWJvbHMgZnJvbSBhCi0gICAgIHN0cmlwcGVkIG9iamVjdCBmaWxlLCBzbyBibGluZGx5IGFzc3VtZSB0aGF0IHRoZSBkeW5hbWljIGxpbmtpbmcKLSAgICAgaW5mb3JtYXRpb24gaXMgbG9jYXRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VjdGlvbi4KLSAgICAgV2UgY291bGQgdmVyaWZ5IHRoaXMgYXNzdW1wdGlvbiBsYXRlciBieSBsb29raW5nIHRocm91Z2ggdGhlIGR5bmFtaWMKLSAgICAgc3ltYm9scyBmb3IgdGhlIF9fRFlOQU1JQyBzeW1ib2wuICAqLwotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvYmpfZGF0YXNlYyAoYWJmZCksIChQVFIpICZkeW5pbmZvLAotCQkJCSAgKGZpbGVfcHRyKSAwLCBzaXplb2YgZHluaW5mbykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHludmVyID0gR0VUX1dPUkQgKGFiZmQsIGR5bmluZm8ubGRfdmVyc2lvbik7Ci0gIGlmIChkeW52ZXIgIT0gMiAmJiBkeW52ZXIgIT0gMykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vZmYgPSBHRVRfV09SRCAoYWJmZCwgZHluaW5mby5sZCk7Ci0KLSAgLyogZHlub2ZmIGlzIGEgdmlydHVhbCBhZGRyZXNzLiAgSXQgaXMgcHJvYmFibHkgYWx3YXlzIGluIHRoZSAuZGF0YQotICAgICBzZWN0aW9uLCBidXQgdGhpcyBjb2RlIHNob3VsZCB3b3JrIGV2ZW4gaWYgaXQgbW92ZXMuICAqLwotICBpZiAoZHlub2ZmIDwgYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgb2JqX2RhdGFzZWMgKGFiZmQpKSkKLSAgICBkeW5zZWMgPSBvYmpfdGV4dHNlYyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBkeW5zZWMgPSBvYmpfZGF0YXNlYyAoYWJmZCk7Ci0gIGR5bm9mZiAtPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBkeW5zZWMpOwotICBpZiAoZHlub2ZmID4gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgZHluc2VjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBUaGlzIGV4ZWN1dGFibGUgYXBwZWFycyB0byBiZSBkeW5hbWljYWxseSBsaW5rZWQgaW4gYSB3YXkgdGhhdCB3ZQotICAgICBjYW4gdW5kZXJzdGFuZC4gICovCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgZHluc2VjLCAoUFRSKSAmbGlua2luZm8sIGR5bm9mZiwKLQkJCQkgIChiZmRfc2l6ZV90eXBlKSBzaXplb2YgbGlua2luZm8pKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFN3YXAgaW4gdGhlIGR5bmFtaWMgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIGluZm8tPmR5bmluZm8ubGRfbG9hZGVkID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX2xvYWRlZCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfbmVlZCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9uZWVkKTsKLSAgaW5mby0+ZHluaW5mby5sZF9ydWxlcyA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9ydWxlcyk7Ci0gIGluZm8tPmR5bmluZm8ubGRfZ290ID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX2dvdCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfcGx0ID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3BsdCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfcmVsID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3JlbCk7Ci0gIGluZm8tPmR5bmluZm8ubGRfaGFzaCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9oYXNoKTsKLSAgaW5mby0+ZHluaW5mby5sZF9zdGFiID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3N0YWIpOwotICBpbmZvLT5keW5pbmZvLmxkX3N0YWJfaGFzaCA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9zdGFiX2hhc2gpOwotICBpbmZvLT5keW5pbmZvLmxkX2J1Y2tldHMgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfYnVja2V0cyk7Ci0gIGluZm8tPmR5bmluZm8ubGRfc3ltYm9scyA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9zeW1ib2xzKTsKLSAgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUgPSBHRVRfV09SRCAoYWJmZCwgbGlua2luZm8ubGRfc3ltYl9zaXplKTsKLSAgaW5mby0+ZHluaW5mby5sZF90ZXh0ID0gR0VUX1dPUkQgKGFiZmQsIGxpbmtpbmZvLmxkX3RleHQpOwotICBpbmZvLT5keW5pbmZvLmxkX3BsdF9zeiA9IEdFVF9XT1JEIChhYmZkLCBsaW5raW5mby5sZF9wbHRfc3opOwotCi0gIC8qIFJlcG9ydGVkbHkgdGhlIGFkZHJlc3NlcyBuZWVkIHRvIGJlIG9mZnNldCBieSB0aGUgc2l6ZSBvZiB0aGUKLSAgICAgZXhlYyBoZWFkZXIgaW4gYW4gTk1BR0lDIGZpbGUuICAqLwotICBpZiAoYWRhdGEgKGFiZmQpLm1hZ2ljID09IG5fbWFnaWMpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBleGVjX2J5dGVzX3NpemUgPSBhZGF0YSAoYWJmZCkuZXhlY19ieXRlc19zaXplOwotCi0gICAgICBpbmZvLT5keW5pbmZvLmxkX25lZWQgKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9ydWxlcyArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgICBpbmZvLT5keW5pbmZvLmxkX3JlbCArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgICBpbmZvLT5keW5pbmZvLmxkX2hhc2ggKz0gZXhlY19ieXRlc19zaXplOwotICAgICAgaW5mby0+ZHluaW5mby5sZF9zdGFiICs9IGV4ZWNfYnl0ZXNfc2l6ZTsKLSAgICAgIGluZm8tPmR5bmluZm8ubGRfc3ltYm9scyArPSBleGVjX2J5dGVzX3NpemU7Ci0gICAgfQotCi0gIC8qIFRoZSBvbmx5IHdheSB0byBnZXQgdGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpbmZvcm1hdGlvbiBhcHBlYXJzIHRvCi0gICAgIGJlIHRvIGRldGVybWluZSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBpdCBhbmQgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGluZm8tPmR5bnN5bV9jb3VudCA9ICgoaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzIC0gaW5mby0+ZHluaW5mby5sZF9zdGFiKQotCQkJLyBFWFRFUk5BTF9OTElTVF9TSVpFKTsKLSAgQkZEX0FTU0VSVCAoaW5mby0+ZHluc3ltX2NvdW50ICogRVhURVJOQUxfTkxJU1RfU0laRQotCSAgICAgID09ICh1bnNpZ25lZCBsb25nKSAoaW5mby0+ZHluaW5mby5sZF9zeW1ib2xzCi0JCQkJICAtIGluZm8tPmR5bmluZm8ubGRfc3RhYikpOwotCi0gIC8qIFNpbWlsYXJseSwgdGhlIHJlbG9jcyBlbmQgYXQgdGhlIGhhc2ggdGFibGUuICAqLwotICBpbmZvLT5keW5yZWxfY291bnQgPSAoKGluZm8tPmR5bmluZm8ubGRfaGFzaCAtIGluZm8tPmR5bmluZm8ubGRfcmVsKQotCQkJLyBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkpOwotICBCRkRfQVNTRVJUIChpbmZvLT5keW5yZWxfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkKLQkgICAgICA9PSAodW5zaWduZWQgbG9uZykgKGluZm8tPmR5bmluZm8ubGRfaGFzaAotCQkJCSAgLSBpbmZvLT5keW5pbmZvLmxkX3JlbCkpOwotCi0gIGluZm8tPnZhbGlkID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIGZvciB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXN1bm9zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotCi0gIGlmICghIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gIGlmICghIGluZm8tPnZhbGlkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChpbmZvLT5keW5zeW1fY291bnQgKyAxKSAqIHNpemVvZiAoYXN5bWJvbCAqKTsKLX0KLQotLyogUmVhZCB0aGUgZXh0ZXJuYWwgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKmluZm87Ci0KLSAgLyogR2V0IHRoZSBnZW5lcmFsIGR5bmFtaWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAob2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gIGlmICghIGluZm8tPnZhbGlkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBkeW5hbWljIG5saXN0IHN0cnVjdHVyZXMuICAqLwotICBpZiAoaW5mby0+ZHluc3ltID09IChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5keW5zeW0gPSAoKHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKQotCQkgICAgICBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJIChpbmZvLT5keW5zeW1fY291bnQKLQkJCQkgICogRVhURVJOQUxfTkxJU1RfU0laRSkpKTsKLSAgICAgIGlmIChpbmZvLT5keW5zeW0gPT0gTlVMTCAmJiBpbmZvLT5keW5zeW1fY291bnQgIT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfc3RhYiwgU0VFS19TRVQpICE9IDAKLQkgIHx8IChiZmRfcmVhZCAoKFBUUikgaW5mby0+ZHluc3ltLCBpbmZvLT5keW5zeW1fY291bnQsCi0JCQlFWFRFUk5BTF9OTElTVF9TSVpFLCBhYmZkKQotCSAgICAgICE9IGluZm8tPmR5bnN5bV9jb3VudCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKQotCXsKLQkgIGlmIChpbmZvLT5keW5zeW0gIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9yZWxlYXNlIChhYmZkLCBpbmZvLT5keW5zeW0pOwotCSAgICAgIGluZm8tPmR5bnN5bSA9IE5VTEw7Ci0JICAgIH0KLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgZHluYW1pYyBzdHJpbmdzLiAgKi8KLSAgaWYgKGluZm8tPmR5bnN0ciA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGluZm8tPmR5bnN0ciA9IChjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUpOwotICAgICAgaWYgKGluZm8tPmR5bnN0ciA9PSBOVUxMICYmIGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKGJmZF9zZWVrIChhYmZkLCBpbmZvLT5keW5pbmZvLmxkX3N5bWJvbHMsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKChQVFIpIGluZm8tPmR5bnN0ciwgMSwgaW5mby0+ZHluaW5mby5sZF9zeW1iX3NpemUsCi0JCQlhYmZkKQotCSAgICAgICE9IGluZm8tPmR5bmluZm8ubGRfc3ltYl9zaXplKSkKLQl7Ci0JICBpZiAoaW5mby0+ZHluc3RyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaW5mby0+ZHluc3RyKTsKLQkgICAgICBpbmZvLT5keW5zdHIgPSBOVUxMOwotCSAgICB9Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXN1bm9zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3RvcmFnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3RvcmFnZTsKLXsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqaW5mbzsKLSAgdW5zaWduZWQgbG9uZyBpOwotCi0gIGlmICghIHN1bm9zX3NsdXJwX2R5bmFtaWNfc3ltdGFiIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0KLSNpZmRlZiBDSEVDS19EWU5BTUlDX0hBU0gKLSAgLyogQ2hlY2sgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgZHluYW1pYyBoYXNoIHRhYmxlIGJ5IG1ha2luZyBzdXJlCi0gICAgIHRoYXQgZWFjaCBzeW1ib2wgY2FuIGJlIGxvY2F0ZWQgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICB7Ci0gICAgYmZkX3NpemVfdHlwZSB0YWJsZV9zaXplOwotICAgIGJmZF9ieXRlICp0YWJsZTsKLSAgICBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgICBpZiAoaW5mby0+ZHluaW5mby5sZF9idWNrZXRzID4gaW5mby0+ZHluc3ltX2NvdW50KQotICAgICAgYWJvcnQgKCk7Ci0gICAgdGFibGVfc2l6ZSA9IGluZm8tPmR5bmluZm8ubGRfc3RhYiAtIGluZm8tPmR5bmluZm8ubGRfaGFzaDsKLSAgICB0YWJsZSA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jICh0YWJsZV9zaXplKTsKLSAgICBpZiAodGFibGUgPT0gTlVMTCAmJiB0YWJsZV9zaXplICE9IDApCi0gICAgICBhYm9ydCAoKTsKLSAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIGluZm8tPmR5bmluZm8ubGRfaGFzaCwgU0VFS19TRVQpICE9IDAKLQl8fCBiZmRfcmVhZCAoKFBUUikgdGFibGUsIDEsIHRhYmxlX3NpemUsIGFiZmQpICE9IHRhYmxlX3NpemUpCi0gICAgICBhYm9ydCAoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZHluc3ltX2NvdW50OyBpKyspCi0gICAgICB7Ci0JdW5zaWduZWQgY2hhciAqbmFtZTsKLQl1bnNpZ25lZCBsb25nIGhhc2g7Ci0KLQluYW1lID0gKCh1bnNpZ25lZCBjaGFyICopIGluZm8tPmR5bnN0cgotCQkrIEdFVF9XT1JEIChhYmZkLCBpbmZvLT5keW5zeW1baV0uZV9zdHJ4KSk7Ci0JaGFzaCA9IDA7Ci0Jd2hpbGUgKCpuYW1lICE9ICdcMCcpCi0JICBoYXNoID0gKGhhc2ggPDwgMSkgKyAqbmFtZSsrOwotCWhhc2ggJj0gMHg3ZmZmZmZmZjsKLQloYXNoICU9IGluZm8tPmR5bmluZm8ubGRfYnVja2V0czsKLQl3aGlsZSAoR0VUX1dPUkQgKGFiZmQsIHRhYmxlICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSkgIT0gaSkKLQkgIHsKLQkgICAgaGFzaCA9IEdFVF9XT1JEIChhYmZkLAotCQkJICAgICB0YWJsZSArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUgKyBCWVRFU19JTl9XT1JEKTsKLQkgICAgaWYgKGhhc2ggPT0gMCB8fCBoYXNoID49IHRhYmxlX3NpemUgLyBIQVNIX0VOVFJZX1NJWkUpCi0JICAgICAgYWJvcnQgKCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgZnJlZSAodGFibGUpOwotICB9Ci0jZW5kaWYgLyogQ0hFQ0tfRFlOQU1JQ19IQVNIICovCi0KLSAgLyogR2V0IHRoZSBhc3ltYm9sIHN0cnVjdHVyZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZHluYW1pYyBubGlzdAotICAgICBzdHJ1Y3R1cmVzLiAgKi8KLSAgaWYgKGluZm8tPmNhbm9uaWNhbF9keW5zeW0gPT0gKGFvdXRfc3ltYm9sX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5jYW5vbmljYWxfZHluc3ltID0gKChhb3V0X3N5bWJvbF90eXBlICopCi0JCQkJYmZkX2FsbG9jIChhYmZkLAotCQkJCQkgICAoaW5mby0+ZHluc3ltX2NvdW50Ci0JCQkJCSAgICAqIHNpemVvZiAoYW91dF9zeW1ib2xfdHlwZSkpKSk7Ci0gICAgICBpZiAoaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9PSBOVUxMICYmIGluZm8tPmR5bnN5bV9jb3VudCAhPSAwKQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKCEgYW91dF8zMl90cmFuc2xhdGVfc3ltYm9sX3RhYmxlIChhYmZkLCBpbmZvLT5jYW5vbmljYWxfZHluc3ltLAotCQkJCQkgICAgaW5mby0+ZHluc3ltLCBpbmZvLT5keW5zeW1fY291bnQsCi0JCQkJCSAgICBpbmZvLT5keW5zdHIsCi0JCQkJCSAgICBpbmZvLT5keW5pbmZvLmxkX3N5bWJfc2l6ZSwKLQkJCQkJICAgIHRydWUpKQotCXsKLQkgIGlmIChpbmZvLT5jYW5vbmljYWxfZHluc3ltICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSk7Ci0JICAgICAgaW5mby0+Y2Fub25pY2FsX2R5bnN5bSA9IE5VTEw7Ci0JICAgIH0KLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotCi0gIC8qIFJldHVybiBwb2ludGVycyB0byB0aGUgZHluYW1pYyBhc3ltYm9sIHN0cnVjdHVyZXMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+ZHluc3ltX2NvdW50OyBpKyspCi0gICAgKnN0b3JhZ2UrKyA9IChhc3ltYm9sICopIChpbmZvLT5jYW5vbmljYWxfZHluc3ltICsgaSk7Ci0gICpzdG9yYWdlID0gTlVMTDsKLQotICByZXR1cm4gaW5mby0+ZHluc3ltX2NvdW50OwotfQotCi0vKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgZm9yIHRoZSBkeW5hbWljIHJlbG9jcy4gICovCi0KLXN0YXRpYyBsb25nCi1zdW5vc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotCi0gIGlmICghIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW5mbyA9IChzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICopIG9ial9hb3V0X2R5bmFtaWNfaW5mbyAoYWJmZCk7Ci0gIGlmICghIGluZm8tPnZhbGlkKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIChpbmZvLT5keW5yZWxfY291bnQgKyAxKSAqIHNpemVvZiAoYXJlbGVudCAqKTsKLX0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotc3Vub3NfY2Fub25pY2FsaXplX2R5bmFtaWNfcmVsb2MgKGFiZmQsIHN0b3JhZ2UsIHN5bXMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXJlbGVudCAqKnN0b3JhZ2U7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotewotICBzdHJ1Y3Qgc3Vub3NfZHluYW1pY19pbmZvICppbmZvOwotICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgLyogR2V0IHRoZSBnZW5lcmFsIGR5bmFtaWMgaW5mb3JtYXRpb24uICAqLwotICBpZiAob2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKSA9PSAoUFRSKSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3JlYWRfZHluYW1pY19pbmZvIChhYmZkKSkKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIGluZm8gPSAoc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqKSBvYmpfYW91dF9keW5hbWljX2luZm8gKGFiZmQpOwotICBpZiAoISBpbmZvLT52YWxpZCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fc3ltYm9scyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEdldCB0aGUgZHluYW1pYyByZWxvYyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChpbmZvLT5keW5yZWwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbmZvLT5keW5yZWwgPSAoUFRSKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICAgKGluZm8tPmR5bnJlbF9jb3VudAotCQkJCSAgICAgICAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSkpOwotICAgICAgaWYgKGluZm8tPmR5bnJlbCA9PSBOVUxMICYmIGluZm8tPmR5bnJlbF9jb3VudCAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgaW5mby0+ZHluaW5mby5sZF9yZWwsIFNFRUtfU0VUKSAhPSAwCi0JICB8fCAoYmZkX3JlYWQgKChQVFIpIGluZm8tPmR5bnJlbCwgaW5mby0+ZHlucmVsX2NvdW50LAotCQkJb2JqX3JlbG9jX2VudHJ5X3NpemUgKGFiZmQpLCBhYmZkKQotCSAgICAgICE9IGluZm8tPmR5bnJlbF9jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSkpCi0JewotCSAgaWYgKGluZm8tPmR5bnJlbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3JlbGVhc2UgKGFiZmQsIGluZm8tPmR5bnJlbCk7Ci0JICAgICAgaW5mby0+ZHlucmVsID0gTlVMTDsKLQkgICAgfQotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBhcmVsZW50IHN0cnVjdHVyZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZHluYW1pYyByZWxvYwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChpbmZvLT5jYW5vbmljYWxfZHlucmVsID09IChhcmVsZW50ICopIE5VTEwpCi0gICAgewotICAgICAgYXJlbGVudCAqdG87Ci0KLSAgICAgIGluZm8tPmNhbm9uaWNhbF9keW5yZWwgPSAoKGFyZWxlbnQgKikKLQkJCQliZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgIChpbmZvLT5keW5yZWxfY291bnQKLQkJCQkJICAgICogc2l6ZW9mIChhcmVsZW50KSkpKTsKLSAgICAgIGlmIChpbmZvLT5jYW5vbmljYWxfZHlucmVsID09IE5VTEwgJiYgaW5mby0+ZHlucmVsX2NvdW50ICE9IDApCi0JcmV0dXJuIC0xOwotICAgICAgCi0gICAgICB0byA9IGluZm8tPmNhbm9uaWNhbF9keW5yZWw7Ci0KLSAgICAgIGlmIChvYmpfcmVsb2NfZW50cnlfc2l6ZSAoYWJmZCkgPT0gUkVMT0NfRVhUX1NJWkUpCi0JewotCSAgcmVnaXN0ZXIgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcDsKLQkgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnBlbmQ7Ci0KLQkgIHAgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSBpbmZvLT5keW5yZWw7Ci0JICBwZW5kID0gcCArIGluZm8tPmR5bnJlbF9jb3VudDsKLQkgIGZvciAoOyBwIDwgcGVuZDsgcCsrLCB0bysrKQotCSAgICBOQU1FKGFvdXQsc3dhcF9leHRfcmVsb2NfaW4pIChhYmZkLCBwLCB0bywgc3ltcywKLQkJCQkJICBpbmZvLT5keW5zeW1fY291bnQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpwOwotCSAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcGVuZDsKLQotCSAgcCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIGluZm8tPmR5bnJlbDsKLQkgIHBlbmQgPSBwICsgaW5mby0+ZHlucmVsX2NvdW50OwotCSAgZm9yICg7IHAgPCBwZW5kOyBwKyssIHRvKyspCi0JICAgIE5BTUUoYW91dCxzd2FwX3N0ZF9yZWxvY19pbikgKGFiZmQsIHAsIHRvLCBzeW1zLAotCQkJCQkgIGluZm8tPmR5bnN5bV9jb3VudCk7Ci0JfQotICAgIH0KLQotICAvKiBSZXR1cm4gcG9pbnRlcnMgdG8gdGhlIGR5bmFtaWMgYXJlbGVudCBzdHJ1Y3R1cmVzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGluZm8tPmR5bnJlbF9jb3VudDsgaSsrKQotICAgICpzdG9yYWdlKysgPSBpbmZvLT5jYW5vbmljYWxfZHlucmVsICsgaTsKLSAgKnN0b3JhZ2UgPSBOVUxMOwotCi0gIHJldHVybiBpbmZvLT5keW5yZWxfY291bnQ7Ci19Ci0MCi0vKiBDb2RlIHRvIGhhbmRsZSBsaW5raW5nIG9mIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuICAqLwotCi0vKiBBIFNQQVJDIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5IGlzIDEyIGJ5dGVzLiAgVGhlIGZpcnN0IGVudHJ5Ci0gICBpbiB0aGUgdGFibGUgaXMgYSBqdW1wIHdoaWNoIGlzIGZpbGxlZCBpbiBieSB0aGUgcnVudGltZSBsaW5rZXIuCi0gICBUaGUgcmVtYWluaW5nIGVudHJpZXMgYXJlIGJyYW5jaGVzIGJhY2sgdG8gdGhlIGZpcnN0IGVudHJ5LAotICAgZm9sbG93ZWQgYnkgYW4gaW5kZXggaW50byB0aGUgcmVsb2NhdGlvbiB0YWJsZSBlbmNvZGVkIHRvIGxvb2sgbGlrZQotICAgYSBzZXRoaSBvZiAlZzAuICAqLwotCi0jZGVmaW5lIFNQQVJDX1BMVF9FTlRSWV9TSVpFICgxMikKLQotc3RhdGljIGNvbnN0IGJmZF9ieXRlIHNwYXJjX3BsdF9maXJzdF9lbnRyeVtTUEFSQ19QTFRfRU5UUllfU0laRV0gPQotewotICAvKiBzZXRoaSAlaGkoMCksJWcxOyBhZGRyZXNzIGZpbGxlZCBpbiBieSBydW50aW1lIGxpbmtlci4gICovCi0gIDB4MywgMCwgMCwgMCwKLSAgLyogam1wICVnMTsgb2Zmc2V0IGZpbGxlZCBpbiBieSBydW50aW1lIGxpbmtlci4gICovCi0gIDB4ODEsIDB4YzAsIDB4NjAsIDAsCi0gIC8qIG5vcCAqLwotICAweDEsIDAsIDAsIDAKLX07Ci0KLS8qIHNhdmUgJXNwLCAtOTYsICVzcCAqLwotI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfV09SRDAgMHg5ZGUzYmZhMAotLyogY2FsbDsgYWRkcmVzcyBmaWxsZWQgaW4gbGF0ZXIuICAqLwotI2RlZmluZSBTUEFSQ19QTFRfRU5UUllfV09SRDEgMHg0MDAwMDAwMAotLyogc2V0aGk7IHJlbG9jIGluZGV4IGZpbGxlZCBpbiBsYXRlci4gICovCi0jZGVmaW5lIFNQQVJDX1BMVF9FTlRSWV9XT1JEMiAweDAxMDAwMDAwCi0KLS8qIFRoaXMgc2VxdWVuY2UgaXMgdXNlZCB3aGVuIGZvciB0aGUganVtcCB0YWJsZSBlbnRyeSB0byBhIGRlZmluZWQKLSAgIHN5bWJvbCBpbiBhIGNvbXBsZXRlIGV4ZWN1dGFibGUuICBJdCBpcyB1c2VkIHdoZW4gbGlua2luZyBQSUMKLSAgIGNvbXBpbGVkIGNvZGUgd2hpY2ggaXMgbm90IGJlaW5nIHB1dCBpbnRvIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotLyogc2V0aGkgPGFkZHJlc3MgdG8gYmUgZmlsbGVkIGluIGxhdGVyPiwgJWcxICovCi0jZGVmaW5lIFNQQVJDX1BMVF9QSUNfV09SRDAgMHgwMzAwMDAwMAotLyogam1wICVnMSArIDxhZGRyZXNzIHRvIGJlIGZpbGxlZCBpbiBsYXRlcj4gKi8KLSNkZWZpbmUgU1BBUkNfUExUX1BJQ19XT1JEMSAweDgxYzA2MDAwCi0vKiBub3AgKi8KLSNkZWZpbmUgU1BBUkNfUExUX1BJQ19XT1JEMiAweDAxMDAwMDAwCi0KLS8qIEFuIG02OGsgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgZW50cnkgaXMgOCBieXRlcy4gIFRoZSBmaXJzdCBlbnRyeQotICAgaW4gdGhlIHRhYmxlIGlzIGEganVtcCB3aGljaCBpcyBmaWxsZWQgaW4gdGhlIGJ5IHRoZSBydW50aW1lCi0gICBsaW5rZXIuICBUaGUgcmVtYWluaW5nIGVudHJpZXMgYXJlIGJyYW5jaGVzIGJhY2sgdG8gdGhlIGZpcnN0Ci0gICBlbnRyeSwgZm9sbG93ZWQgYnkgYSB0d28gYnl0ZSBpbmRleCBpbnRvIHRoZSByZWxvY2F0aW9uIHRhYmxlLiAgKi8KLQotI2RlZmluZSBNNjhLX1BMVF9FTlRSWV9TSVpFICg4KQotCi1zdGF0aWMgY29uc3QgYmZkX2J5dGUgbTY4a19wbHRfZmlyc3RfZW50cnlbTTY4S19QTFRfRU5UUllfU0laRV0gPQotewotICAvKiBqbXBzIEAjICovCi0gIDB4NGUsIDB4ZjksCi0gIC8qIEZpbGxlZCBpbiBieSBydW50aW1lIGxpbmtlciB3aXRoIGEgbWFnaWMgYWRkcmVzcy4gICovCi0gIDAsIDAsIDAsIDAsCi0gIC8qIE5vdCB1c2VkPyAgKi8KLSAgMCwgMAotfTsKLQotLyogYnNybCAqLwotI2RlZmluZSBNNjhLX1BMVF9FTlRSWV9XT1JEMCAoMHg2MWZmKQotLyogUmVtYWluaW5nIHdvcmRzIGZpbGxlZCBpbiBsYXRlci4gICovCi0KLS8qIEFuIGVudHJ5IGluIHRoZSBTdW5PUyBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5IHJvb3Q7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGR5bmFtaWMgc3ltYm9sLCB0aGlzIGlzIGl0cyBpbmRleCBpbnRvIHRoZSBkeW5hbWljCi0gICAgIHN5bWJvbCB0YWJsZS4gIFRoaXMgaXMgaW5pdGlhbGl6ZWQgdG8gLTEuICBBcyB0aGUgbGlua2VyIGxvb2tzIGF0Ci0gICAgIHRoZSBpbnB1dCBmaWxlcywgaXQgY2hhbmdlcyB0aGlzIHRvIC0yIGlmIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCi0gICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgQWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gc2VlbiwKLSAgICAgdGhlIGxpbmtlciB3aWxsIGtub3cgd2hldGhlciB0byBidWlsZCBhIGR5bmFtaWMgc3ltYm9sIHRhYmxlOyBpZgotICAgICBpdCBkb2VzIGJ1aWxkIG9uZSwgdGhpcyBiZWNvbWVzIHRoZSBpbmRleCBpbnRvIHRoZSB0YWJsZS4gICovCi0gIGxvbmcgZHluaW5keDsKLQotICAvKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBzeW1ib2wsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBuYW1lIGluIHRoZQotICAgICBkeW5hbWljIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotICBsb25nIGR5bnN0cl9pbmRleDsKLQotICAvKiBUaGUgb2Zmc2V0IGludG8gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgdXNlZCBmb3IgdGhpcyBzeW1ib2wuICBJZgotICAgICB0aGUgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBHT1QgZW50cnksIHRoaXMgaXMgMC4gICovCi0gIGJmZF92bWEgZ290X29mZnNldDsKLQotICAvKiBUaGUgb2Zmc2V0IGludG8gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIHVzZWQgZm9yIHRoaXMgc3ltYm9sLgotICAgICBJZiB0aGUgc3ltYm9sIGRvZXMgbm90IHJlcXVpcmUgYSBQTFQgZW50cnksIHRoaXMgaXMgMC4gICovCi0gIGJmZF92bWEgcGx0X29mZnNldDsKLQotICAvKiBTb21lIGxpbmtlciBmbGFncy4gICovCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19SRUZfUkVHVUxBUiAwMQotICAvKiBTeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIgb2JqZWN0LiAgKi8KLSNkZWZpbmUgU1VOT1NfREVGX1JFR1VMQVIgMDIKLSAgLyogU3ltYm9sIGlzIHJlZmVyZW5jZWQgYnkgYSBkeW5hbWljIG9iamVjdC4gICovCi0jZGVmaW5lIFNVTk9TX1JFRl9EWU5BTUlDIDA0Ci0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19ERUZfRFlOQU1JQyAwMTAKLSAgLyogU3ltYm9sIGlzIGEgY29uc3RydWN0b3Igc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBTVU5PU19DT05TVFJVQ1RPUiAwMjAKLX07Ci0KLS8qIFRoZSBTdW5PUyBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGFvdXRfbGlua19oYXNoX3RhYmxlIHJvb3Q7Ci0KLSAgLyogVGhlIG9iamVjdCB3aGljaCBob2xkcyB0aGUgZHluYW1pYyBzZWN0aW9ucy4gICovCi0gIGJmZCAqZHlub2JqOwotCi0gIC8qIFdoZXRoZXIgd2UgaGF2ZSBjcmVhdGVkIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQ7Ci0KLSAgLyogV2hldGhlciB3ZSBuZWVkIHRoZSBkeW5hbWljIHNlY3Rpb25zLiAgKi8KLSAgYm9vbGVhbiBkeW5hbWljX3NlY3Rpb25zX25lZWRlZDsKLQotICAvKiBXaGV0aGVyIHdlIG5lZWQgdGhlIC5nb3QgdGFibGUuICAqLwotICBib29sZWFuIGdvdF9uZWVkZWQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBkeW5hbWljIHN5bWJvbHMuICAqLwotICBzaXplX3QgZHluc3ltY291bnQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgc2l6ZV90IGJ1Y2tldGNvdW50OwotCi0gIC8qIFRoZSBsaXN0IG9mIGR5bmFtaWMgb2JqZWN0cyBuZWVkZWQgYnkgZHluYW1pYyBvYmplY3RzIGluY2x1ZGVkIGluCi0gICAgIHRoZSBsaW5rLiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQ7Ci0KLSAgLyogVGhlIG9mZnNldCBvZiBfX0dMT0JBTF9PRkZTRVRfVEFCTEVfIGludG8gdGhlIC5nb3Qgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgZ290X2Jhc2U7Ci19OwotCi0vKiBSb3V0aW5lIHRvIGNyZWF0ZSBhbiBlbnRyeSBpbiBhbiBTdW5PUyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopCi0JIE5BTUUoYW91dCxsaW5rX2hhc2hfbmV3ZnVuYykgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LAotCQkJCSAgICAgICB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+ZHluaW5keCA9IC0xOwotICAgICAgcmV0LT5keW5zdHJfaW5kZXggPSAtMTsKLSAgICAgIHJldC0+Z290X29mZnNldCA9IDA7Ci0gICAgICByZXQtPnBsdF9vZmZzZXQgPSAwOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogQ3JlYXRlIGEgU3VuT1MgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXN1bm9zX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSAqcmV0OwotCi0gIHJldCA9ICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSAqKQotCSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgaWYgKCEgTkFNRShhb3V0LGxpbmtfaGFzaF90YWJsZV9pbml0KSAoJnJldC0+cm9vdCwgYWJmZCwKLQkJCQkJIHN1bm9zX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5keW5vYmogPSBOVUxMOwotICByZXQtPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IGZhbHNlOwotICByZXQtPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkID0gZmFsc2U7Ci0gIHJldC0+Z290X25lZWRlZCA9IGZhbHNlOwotICByZXQtPmR5bnN5bWNvdW50ID0gMDsKLSAgcmV0LT5idWNrZXRjb3VudCA9IDA7Ci0gIHJldC0+bmVlZGVkID0gTlVMTDsKLSAgcmV0LT5nb3RfYmFzZSA9IDA7Ci0KLSAgcmV0dXJuICZyZXQtPnJvb3Qucm9vdDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhbiBTdW5PUyBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHN1bm9zX2xpbmtfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5LCBmb2xsb3cpIFwKLSAgKChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIFwKLSAgIGFvdXRfbGlua19oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpLFwKLQkJCSAgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhIFN1bk9TIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgc3Vub3NfbGlua19oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCVwKLSAgKGFvdXRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBhb3V0X2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKSkgKGZ1bmMpLAlcCi0gICAgKGluZm8pKSkKLQotLyogR2V0IHRoZSBTdW5PUyBsaW5rIGhhc2ggdGFibGUgZnJvbSB0aGUgaW5mbyBzdHJ1Y3R1cmUuICBUaGlzIGlzCi0gICBqdXN0IGEgY2FzdC4gICovCi0KLSNkZWZpbmUgc3Vub3NfaGFzaF90YWJsZShwKSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfdGFibGUgKikgKChwKS0+aGFzaCkpCi0KLXN0YXRpYyBib29sZWFuIHN1bm9zX3NjYW5fZHluYW1pY19zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLQotLyogQ3JlYXRlIHRoZSBkeW5hbWljIHNlY3Rpb25zIG5lZWRlZCBpZiB3ZSBhcmUgbGlua2luZyBhZ2FpbnN0IGEKLSAgIGR5bmFtaWMgb2JqZWN0LCBvciBpZiB3ZSBhcmUgbGlua2luZyBQSUMgY29tcGlsZWQgY29kZS4gIEFCRkQgaXMgYQotICAgYmZkIHdlIGNhbiBhdHRhY2ggdGhlIGR5bmFtaWMgc2VjdGlvbnMgdG8uICBUaGUgbGlua2VyIHNjcmlwdCB3aWxsCi0gICBsb29rIGZvciB0aGVzZSBzcGVjaWFsIHNlY3Rpb25zIG5hbWVzIGFuZCBwdXQgdGhlbSBpbiB0aGUgcmlnaHQKLSAgIHBsYWNlIGluIHRoZSBvdXRwdXQgZmlsZS4gIFNlZSBpbmNsdWRlL2FvdXQvc3VuNC5oIGZvciBtb3JlIGRldGFpbHMKLSAgIG9mIHRoZSBkeW5hbWljIGxpbmtpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIG5lZWRlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBuZWVkZWQ7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX2NyZWF0ZWQpCi0gICAgewotICAgICAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmogPSBhYmZkOwotCi0gICAgICBmbGFncyA9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZCi0JICAgICAgIHwgU0VDX0xJTktFUl9DUkVBVEVEKTsKLQotICAgICAgLyogVGhlIC5keW5hbWljIHNlY3Rpb24gaG9sZHMgdGhlIGJhc2ljIGR5bmFtaWMgaW5mb3JtYXRpb246IHRoZQotCSBzdW40X2R5bmFtaWMgc3RydWN0dXJlLCB0aGUgZHluYW1pYyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiwgYW5kCi0JIHRoZSBzdW40X2R5bmFtaWNfbGluayBzdHJ1Y3R1cmUuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluYW1pYyIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChhYmZkLCBzLCAyKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFRoZSAuZ290IHNlY3Rpb24gaG9sZHMgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICBUaGUgYWRkcmVzcwotCSBpcyBwdXQgaW4gdGhlIGxkX2dvdCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5nb3QiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncykKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLnBsdCBzZWN0aW9uIGhvbGRzIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIFRoZQotCSBhZGRyZXNzIGlzIHB1dCBpbiB0aGUgbGRfcGx0IGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnBsdCIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIGZsYWdzIHwgU0VDX0NPREUpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5keW5yZWwgc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyByZWxvY3MuICBUaGUgYWRkcmVzcyBpcwotCSBwdXQgaW4gdGhlIGxkX3JlbCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5keW5yZWwiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLmhhc2ggc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyBoYXNoIHRhYmxlLiAgVGhlIGFkZHJlc3MKLQkgaXMgcHV0IGluIHRoZSBsZF9oYXNoIGZpZWxkLiAgKi8KLSAgICAgIHMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLmhhc2giKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzLCBmbGFncyB8IFNFQ19SRUFET05MWSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBUaGUgLmR5bnN5bSBzZWN0aW9uIGhvbGRzIHRoZSBkeW5hbWljIHN5bWJvbHMuICBUaGUgYWRkcmVzcwotCSBpcyBwdXQgaW4gdGhlIGxkX3N0YWIgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3ltIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogVGhlIC5keW5zdHIgc2VjdGlvbiBob2xkcyB0aGUgZHluYW1pYyBzeW1ib2wgc3RyaW5nIHRhYmxlLgotCSBUaGUgYWRkcmVzcyBpcyBwdXQgaW4gdGhlIGxkX3N5bWJvbHMgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZHluc3RyIik7Ci0gICAgICBpZiAocyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcywgZmxhZ3MgfCBTRUNfUkVBRE9OTFkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfY3JlYXRlZCA9IHRydWU7Ci0gICAgfQotCi0gIGlmICgobmVlZGVkICYmICEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkKQotICAgICAgfHwgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGJmZCAqZHlub2JqOwotCi0gICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPT0gMCkKLQlzLT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQgPSB0cnVlOwotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9uZWVkZWQgPSB0cnVlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGR5bmFtaWMgc3ltYm9scyBkdXJpbmcgYSBsaW5rLiAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGEub3V0Ci0gICBiYWNrZW5kIGxpbmtlciBmb3IgZWFjaCBvYmplY3QgaXQgZW5jb3VudGVycy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19hZGRfZHluYW1pY19zeW1ib2xzIChhYmZkLCBpbmZvLCBzeW1zcCwgc3ltX2NvdW50cCwgc3RyaW5nc3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBleHRlcm5hbF9ubGlzdCAqKnN5bXNwOwotICAgICBiZmRfc2l6ZV90eXBlICpzeW1fY291bnRwOwotICAgICBjaGFyICoqc3RyaW5nc3A7Ci17Ci0gIGFzZWN0aW9uICpzOwotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IHN1bm9zX2R5bmFtaWNfaW5mbyAqZGluZm87Ci0gIHVuc2lnbmVkIGxvbmcgbmVlZDsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhbGwgdGhlIHJlcXVpcmVkIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucyAoYWJmZCwgaW5mbywKLQkJCQkJICAgKCgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JCQkJCSAgICAgJiYgISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JCQkJCSAgICA/IHRydWUKLQkJCQkJICAgIDogZmFsc2UpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkbyBmb3IgYSBub3JtYWwgb2JqZWN0LiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQotICAvKiBXZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoZSBzZWN0aW9ucyBpbiBhIGR5bmFtaWMgb2JqZWN0IGluIHRoZQotICAgICBvdXRwdXQgZmlsZS4gIFdlIGhhY2sgYnkgc2ltcGx5IGNsb2JiZXJpbmcgdGhlIGxpc3Qgb2Ygc2VjdGlvbnMKLSAgICAgaW4gdGhlIEJGRC4gIFRoaXMgY291bGQgYmUgaGFuZGxlZCBtb3JlIGNsZWFubHkgYnksIHNheSwgYSBuZXcKLSAgICAgc2VjdGlvbiBmbGFnOyB0aGUgZXhpc3RpbmcgU0VDX05FVkVSX0xPQUQgZmxhZyBpcyBub3QgdGhlIG9uZSB3ZQotICAgICB3YW50LCBiZWNhdXNlIHRoYXQgb25lIHN0aWxsIGltcGxpZXMgdGhhdCB0aGUgc2VjdGlvbiB0YWtlcyB1cAotICAgICBzcGFjZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBJZiB0aGlzIGlzIHRoZSBmaXJzdCBvYmplY3Qgd2UgaGF2ZQotICAgICBzZWVuLCB3ZSBtdXN0IHByZXNlcnZlIHRoZSBkeW5hbWljIHNlY3Rpb25zIHdlIGp1c3QgY3JlYXRlZC4gICovCi0gIGlmIChhYmZkICE9IGR5bm9iaikKLSAgICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7Ci0JICAgKHMtPmZsYWdzICYgU0VDX0xJTktFUl9DUkVBVEVEKSA9PSAwOwotCSAgIHMgPSBzLT5uZXh0KQotCTsKLSAgICAgIGFiZmQtPnNlY3Rpb25zID0gczsKLSAgICB9Ci0KLSAgLyogVGhlIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8ganVzdCBpZ25vcmUgZHluYW1pYyBvYmplY3RzIHdoZW4gLXIgaXMKLSAgICAgdXNlZC4gICovCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhlcmUncyBubyBob3BlIG9mIHVzaW5nIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggZG9lcyBub3QgZXhhY3RseQotICAgICBtYXRjaCB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZS4gICovCi0gIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSAubmVlZCBhbmQgYSAucnVsZXMgc2VjdGlvbnMuICBUaGVzZSBhcmUgb25seQotICAgICBuZWVkZWQgaWYgdGhlcmUgcmVhbGx5IGlzIGEgZHluYW1pYyBvYmplY3QgaW4gdGhlIGxpbmssIHNvIHRoZXkKLSAgICAgYXJlIG5vdCBhZGRlZCBieSBzdW5vc19jcmVhdGVfZHluYW1pY19zZWN0aW9ucy4gICovCi0gIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSAubmVlZCBzZWN0aW9uIGhvbGRzIHRoZSBsaXN0IG9mIG5hbWVzIG9mIHNoYXJlZCBvYmpldHMKLQkgd2hpY2ggbXVzdCBiZSBpbmNsdWRlZCBhdCBydW50aW1lLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcwotCSBzZWN0aW9uIGlzIHB1dCBpbiB0aGUgbGRfbmVlZCBmaWVsZC4gICovCi0gICAgICBzID0gYmZkX21ha2Vfc2VjdGlvbiAoZHlub2JqLCAiLm5lZWQiKTsKLSAgICAgIGlmIChzID09IE5VTEwKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChkeW5vYmosIHMsCi0JCQkJICAgICAgKFNFQ19BTExPQwotCQkJCSAgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19JTl9NRU1PUlkKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkpKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChkeW5vYmosIHMsIDIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZSAucnVsZXMgc2VjdGlvbiBob2xkcyB0aGUgcGF0aCB0byBzZWFyY2ggZm9yIHNoYXJlZAotCSBvYmplY3RzLiAgVGhlIGFkZHJlc3Mgb2YgdGhpcyBzZWN0aW9uIGlzIHB1dCBpbiB0aGUgbGRfcnVsZXMKLQkgZmllbGQuICAqLwotICAgICAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGR5bm9iaiwgIi5ydWxlcyIpOwotICAgICAgaWYgKHMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGR5bm9iaiwgcywKLQkJCQkgICAgICAoU0VDX0FMTE9DCi0JCQkJICAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgICAgIHwgU0VDX0lOX01FTU9SWQotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWSkpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGR5bm9iaiwgcywgMikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBQaWNrIHVwIHRoZSBkeW5hbWljIHN5bWJvbHMgYW5kIHJldHVybiB0aGVtIHRvIHRoZSBjYWxsZXIuICAqLwotICBpZiAoISBzdW5vc19zbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRpbmZvID0gKHN0cnVjdCBzdW5vc19keW5hbWljX2luZm8gKikgb2JqX2FvdXRfZHluYW1pY19pbmZvIChhYmZkKTsKLSAgKnN5bXNwID0gZGluZm8tPmR5bnN5bTsKLSAgKnN5bV9jb3VudHAgPSBkaW5mby0+ZHluc3ltX2NvdW50OwotICAqc3RyaW5nc3AgPSBkaW5mby0+ZHluc3RyOwotCi0gIC8qIFJlY29yZCBpbmZvcm1hdGlvbiBhYm91dCBhbnkgb3RoZXIgb2JqZWN0cyBuZWVkZWQgYnkgdGhpcyBvbmUuICAqLwotICBuZWVkID0gZGluZm8tPmR5bmluZm8ubGRfbmVlZDsKLSAgd2hpbGUgKG5lZWQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSBidWZbMTZdOwotICAgICAgdW5zaWduZWQgbG9uZyBuYW1lLCBmbGFnczsKLSAgICAgIHVuc2lnbmVkIHNob3J0IG1ham9yX3ZubywgbWlub3Jfdm5vOwotICAgICAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICoqcHA7Ci0gICAgICBjaGFyICpuYW1lYnVmLCAqcDsKLSAgICAgIHNpemVfdCBhbGM7Ci0gICAgICBiZmRfYnl0ZSBiOwotICAgICAgY2hhciAqbmFtZWNvcHk7Ci0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbmVlZCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF9yZWFkIChidWYsIDEsIDE2LCBhYmZkKSAhPSAxNikKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZvciB0aGUgZm9ybWF0IG9mIGFuIGxkX25lZWQgZW50cnksIHNlZSBhb3V0L3N1bjQuaC4gIFdlCi0gICAgICAgICBzaG91bGQgcHJvYmFibHkgZGVmaW5lIHN0cnVjdHMgZm9yIHRoaXMgbWFuaXB1bGF0aW9uLiAgKi8KLQotICAgICAgbmFtZSA9IGJmZF9nZXRfMzIgKGFiZmQsIGJ1Zik7Ci0gICAgICBmbGFncyA9IGJmZF9nZXRfMzIgKGFiZmQsIGJ1ZiArIDQpOwotICAgICAgbWFqb3Jfdm5vID0gKHVuc2lnbmVkIHNob3J0KWJmZF9nZXRfMTYgKGFiZmQsIGJ1ZiArIDgpOwotICAgICAgbWlub3Jfdm5vID0gKHVuc2lnbmVkIHNob3J0KWJmZF9nZXRfMTYgKGFiZmQsIGJ1ZiArIDEwKTsKLSAgICAgIG5lZWQgPSBiZmRfZ2V0XzMyIChhYmZkLCBidWYgKyAxMik7Ci0KLSAgICAgIG5lZWRlZCA9ICgoc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICopCi0JCWJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QpKSk7Ci0gICAgICBpZiAobmVlZGVkID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmVlZGVkLT5ieSA9IGFiZmQ7Ci0KLSAgICAgIC8qIFdlIHJldHVybiB0aGUgbmFtZSBhcyBbLWxdbmFtZVsubWFqXVsubWluXS4gICovCi0gICAgICBhbGMgPSAzMDsKLSAgICAgIG5hbWVidWYgPSAoY2hhciAqKSBiZmRfbWFsbG9jIChhbGMgKyAxKTsKLSAgICAgIGlmIChuYW1lYnVmID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcCA9IG5hbWVidWY7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiAweDgwMDAwMDAwKSAhPSAwKQotCXsKLQkgICpwKysgPSAnLSc7Ci0JICAqcCsrID0gJ2wnOwotCX0KLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwgbmFtZSwgU0VFS19TRVQpICE9IDApCi0JewotCSAgZnJlZSAobmFtZWJ1Zik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBkbwotCXsKLQkgIGlmIChiZmRfcmVhZCAoJmIsIDEsIDEsIGFiZmQpICE9IDEpCi0JICAgIHsKLQkgICAgICBmcmVlIChuYW1lYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKChzaXplX3QpIChwIC0gbmFtZWJ1ZikgPj0gYWxjKQotCSAgICB7Ci0JICAgICAgY2hhciAqbjsKLQotCSAgICAgIGFsYyAqPSAyOwotCSAgICAgIG4gPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAobmFtZWJ1ZiwgYWxjICsgMSk7Ci0JICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKG5hbWVidWYpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIHAgPSBuICsgKHAgLSBuYW1lYnVmKTsKLQkgICAgICBuYW1lYnVmID0gbjsKLQkgICAgfQotCi0JICAqcCsrID0gYjsKLQl9Ci0gICAgICB3aGlsZSAoYiAhPSAnXDAnKTsKLQotICAgICAgaWYgKG1ham9yX3ZubyA9PSAwKQotCSpwID0gJ1wwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyIG1hamJ1ZlszMF07Ci0JICBjaGFyIG1pbmJ1ZlszMF07Ci0KLQkgIHNwcmludGYgKG1hamJ1ZiwgIi4lZCIsIG1ham9yX3Zubyk7Ci0JICBpZiAobWlub3Jfdm5vID09IDApCi0JICAgIG1pbmJ1ZlswXSA9ICdcMCc7Ci0JICBlbHNlCi0JICAgIHNwcmludGYgKG1pbmJ1ZiwgIi4lZCIsIG1pbm9yX3Zubyk7Ci0KLQkgIGlmICgocCAtIG5hbWVidWYpICsgc3RybGVuIChtYWpidWYpICsgc3RybGVuIChtaW5idWYpID49IGFsYykKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBhbGMgPSAocCAtIG5hbWVidWYpICsgc3RybGVuIChtYWpidWYpICsgc3RybGVuIChtaW5idWYpOwotCSAgICAgIG4gPSAoY2hhciAqKSBiZmRfcmVhbGxvYyAobmFtZWJ1ZiwgYWxjICsgMSk7Ci0JICAgICAgaWYgKG4gPT0gTlVMTCkKLQkJewotCQkgIGZyZWUgKG5hbWVidWYpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIHAgPSBuICsgKHAgLSBuYW1lYnVmKTsKLQkgICAgICBuYW1lYnVmID0gbjsKLQkgICAgfQotCi0JICBzdHJjcHkgKHAsIG1hamJ1Zik7Ci0JICBzdHJjYXQgKHAsIG1pbmJ1Zik7Ci0JfQotCi0gICAgICBuYW1lY29weSA9IGJmZF9hbGxvYyAoYWJmZCwgc3RybGVuIChuYW1lYnVmKSArIDEpOwotICAgICAgaWYgKG5hbWVjb3B5ID09IE5VTEwpCi0JewotCSAgZnJlZSAobmFtZWJ1Zik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgc3RyY3B5IChuYW1lY29weSwgbmFtZWJ1Zik7Ci0gICAgICBmcmVlIChuYW1lYnVmKTsKLSAgICAgIG5lZWRlZC0+bmFtZSA9IG5hbWVjb3B5OwotCi0gICAgICBuZWVkZWQtPm5leHQgPSBOVUxMOwotCi0gICAgICBmb3IgKHBwID0gJnN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci0JICAgKnBwICE9IE5VTEw7Ci0JICAgcHAgPSAmKCpwcCktPm5leHQpCi0JOwotICAgICAgKnBwID0gbmVlZGVkOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gYWRkIGEgc2luZ2xlIHN5bWJvbCB0byB0aGUgbGlua2VyIGhhc2ggdGFibGUuICBUaGlzIGlzCi0gICBhIHdyYXBwZXIgYXJvdW5kIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sIHdoaWNoIGhhbmRsZXMgdGhlCi0gICB0d2Vha2luZyBuZWVkZWQgZm9yIGR5bmFtaWMgbGlua2luZyBzdXBwb3J0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2FkZF9vbmVfc3ltYm9sIChpbmZvLCBhYmZkLCBuYW1lLCBmbGFncywgc2VjdGlvbiwgdmFsdWUsIHN0cmluZywKLQkJICAgICAgY29weSwgY29sbGVjdCwgaGFzaHApCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBib29sZWFuIGNvcHk7Ci0gICAgIGJvb2xlYW4gY29sbGVjdDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKipoYXNocDsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgaW50IG5ld19mbGFnOwotCi0gIGlmICgoZmxhZ3MgJiAoQlNGX0lORElSRUNUIHwgQlNGX1dBUk5JTkcgfCBCU0ZfQ09OU1RSVUNUT1IpKSAhPSAwCi0gICAgICB8fCAhIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLCBuYW1lLCB0cnVlLCBjb3B5LAotCQkJCWZhbHNlKTsKLSAgZWxzZQotICAgIGggPSAoKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikKLQkgYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAoYWJmZCwgaW5mbywgbmFtZSwgdHJ1ZSwgY29weSwgZmFsc2UpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGhhc2hwICE9IE5VTEwpCi0gICAgKmhhc2hwID0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIGg7Ci0KLSAgLyogVHJlYXQgYSBjb21tb24gc3ltYm9sIGluIGEgZHluYW1pYyBvYmplY3QgYXMgZGVmaW5lZCBpbiB0aGUgLmJzcwotICAgICBzZWN0aW9uIG9mIHRoZSBkeW5hbWljIG9iamVjdC4gIFdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgc3BhY2UKLSAgICAgZm9yIGl0IGluIG91ciBwcm9jZXNzIGltYWdlLiAgKi8KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmIGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgc2VjdGlvbiA9IG9ial9ic3NzZWMgKGFiZmQpOwotCi0gIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikKLSAgICAgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfbmV3Ci0gICAgICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotICAgICAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIC8qIFdlIGFyZSBkZWZpbmluZyB0aGUgc3ltYm9sLCBhbmQgaXQgaXMgYWxyZWFkeSBkZWZpbmVkLiAgVGhpcwotCSBpcyBhIHBvdGVudGlhbCBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLiAgKi8KLSAgICAgIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCXsKLQkgIC8qIFRoZSBkZWZpbml0aW9uIHdlIGFyZSBhZGRpbmcgaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LgotCSAgICAgV2UgZG8gbm90IHdhbnQgdGhpcyBuZXcgZGVmaW5pdGlvbiB0byBvdmVycmlkZSB0aGUKLQkgICAgIGV4aXN0aW5nIGRlZmluaXRpb24sIHNvIHdlIHByZXRlbmQgaXQgaXMganVzdCBhCi0JICAgICByZWZlcmVuY2UuICAqLwotCSAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JfQotICAgICAgZWxzZSBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgICYmIGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgICAgICYmIChoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLQl7Ci0JICAvKiBUaGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBpcyBmcm9tIGEgZHluYW1pYyBvYmplY3QuICBXZQotCSAgICAgd2FudCB0byBvdmVycmlkZSBpdCB3aXRoIHRoZSBkZWZpbml0aW9uIHdlIGp1c3QgZm91bmQuCi0JICAgICBDbG9iYmVyIHRoZSBleGlzdGluZyBkZWZpbml0aW9uLiAgKi8KLQkgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICBoLT5yb290LnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCX0KLSAgICAgIGVsc2UgaWYgKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JICAgICAgICYmIChoLT5yb290LnJvb3QudS5jLnAtPnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JewotCSAgLyogVGhlIGV4aXN0aW5nIGRlZmluaXRpb24gaXMgZnJvbSBhIGR5bmFtaWMgb2JqZWN0LiAgV2UKLQkgICAgIHdhbnQgdG8gb3ZlcnJpZGUgaXQgd2l0aCB0aGUgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLgotCSAgICAgQ2xvYmJlciB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbi4gIFdlIGNhbid0IHNldCBpdCB0byBuZXcsCi0JICAgICBiZWNhdXNlIGl0IGlzIG9uIHRoZSB1bmRlZmluZWQgbGlzdC4gICovCi0JICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZCA9IGgtPnJvb3Qucm9vdC51LmMucC0+c2VjdGlvbi0+b3duZXI7Ci0JfQotICAgIH0KLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotICAgICAgJiYgYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19DT05TVFJVQ1RPUikgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZXhpc3Rpbmcgc3ltYm9sIGlzIGEgY29uc3RydWN0b3Igc3ltYm9sLCBhbmQgdGhpcyBzeW1ib2wKLSAgICAgICAgIGlzIGZyb20gYSBkeW5hbWljIG9iamVjdC4gIEEgY29uc3RydWN0b3Igc3ltYm9sIGlzIGFjdHVhbGx5IGEKLSAgICAgICAgIGRlZmluaXRpb24sIGFsdGhvdWdoIHRoZSB0eXBlIHdpbGwgYmUgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLSAgICAgICAgIGF0IHRoaXMgcG9pbnQuICBXZSB3YW50IHRvIGlnbm9yZSB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZQotICAgICAgICAgZHluYW1pYyBvYmplY3QuICAqLwotICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0gICAgfQotICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfQ09OU1RSVUNUT1IpICE9IDAKLQkgICAmJiAoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwCi0JICAgJiYgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgJiYgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICAmJiAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgLyogVGhlIGV4aXN0aW5nIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIGFuZCB0aGlzCi0gICAgICAgICBpcyBhIGNvbnN0cnVjdG9yIHN5bWJvbC4gIEFzIGFib3ZlLCB3ZSB3YW50IHRvIGZvcmNlIHRoZSB1c2UKLSAgICAgICAgIG9mIHRoZSBjb25zdHJ1Y3RvciBzeW1ib2wgZnJvbSB0aGUgcmVndWxhciBvYmplY3QuICAqLwotICAgICAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX25ldzsKLSAgICB9Ci0KLSAgLyogRG8gdGhlIHVzdWFsIHByb2NlZHVyZSBmb3IgYWRkaW5nIGEgc3ltYm9sLiAgKi8KLSAgaWYgKCEgX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgKGluZm8sIGFiZmQsIG5hbWUsIGZsYWdzLCBzZWN0aW9uLAotCQkJCQkgIHZhbHVlLCBzdHJpbmcsIGNvcHksIGNvbGxlY3QsCi0JCQkJCSAgaGFzaHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYWJmZC0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yKQotICAgIHsKLSAgICAgIC8qIFNldCBhIGZsYWcgaW4gdGhlIGhhc2ggdGFibGUgZW50cnkgaW5kaWNhdGluZyB0aGUgdHlwZSBvZgotCSByZWZlcmVuY2Ugb3IgZGVmaW5pdGlvbiB3ZSBqdXN0IGZvdW5kLiAgS2VlcCBhIGNvdW50IG9mIHRoZQotCSBudW1iZXIgb2YgZHluYW1pYyBzeW1ib2xzIHdlIGZpbmQuICBBIGR5bmFtaWMgc3ltYm9sIGlzIG9uZQotCSB3aGljaCBpcyByZWZlcmVuY2VkIG9yIGRlZmluZWQgYnkgYm90aCBhIHJlZ3VsYXIgb2JqZWN0IGFuZCBhCi0JIHNoYXJlZCBvYmplY3QuICAqLwotICAgICAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JewotCSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0JICAgIG5ld19mbGFnID0gU1VOT1NfUkVGX1JFR1VMQVI7Ci0JICBlbHNlCi0JICAgIG5ld19mbGFnID0gU1VOT1NfREVGX1JFR1VMQVI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pKQotCSAgICBuZXdfZmxhZyA9IFNVTk9TX1JFRl9EWU5BTUlDOwotCSAgZWxzZQotCSAgICBuZXdfZmxhZyA9IFNVTk9TX0RFRl9EWU5BTUlDOwotCX0KLSAgICAgIGgtPmZsYWdzIHw9IG5ld19mbGFnOwotCi0gICAgICBpZiAoaC0+ZHluaW5keCA9PSAtMQotCSAgJiYgKGgtPmZsYWdzICYgKFNVTk9TX0RFRl9SRUdVTEFSIHwgU1VOT1NfUkVGX1JFR1VMQVIpKSAhPSAwKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLQotICAgICAgaWYgKChmbGFncyAmIEJTRl9DT05TVFJVQ1RPUikgIT0gMAotCSAgJiYgKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLQloLT5mbGFncyB8PSBTVU5PU19DT05TVFJVQ1RPUjsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJldHVybiB0aGUgbGlzdCBvZiBvYmplY3RzIG5lZWRlZCBieSBCRkQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqCi1iZmRfc3Vub3NfZ2V0X25lZWRlZF9saXN0IChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciAhPSAmTVkodmVjKSkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5uZWVkZWQ7Ci19Ci0KLS8qIFJlY29yZCBhbiBhc3NpZ25tZW50IG1hZGUgdG8gYSBzeW1ib2wgYnkgYSBsaW5rZXIgc2NyaXB0LiAgV2UgbmVlZAotICAgdGhpcyBpbiBjYXNlIHNvbWUgZHluYW1pYyBvYmplY3QgcmVmZXJzIHRvIHRoaXMgc3ltYm9sLiAgKi8KLQotYm9vbGVhbgotYmZkX3N1bm9zX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgd2UgaGF2ZSBleGFtaW5lZCBhbGwgdGhlIGlucHV0IG9iamVjdHMuICBJZgotICAgICB0aGUgc3ltYm9sIGRvZXMgbm90IGV4aXN0LCBpdCBtZXJlbHkgbWVhbnMgdGhhdCBubyBvYmplY3QgcmVmZXJzCi0gICAgIHRvIGl0LCBhbmQgd2UgY2FuIGp1c3QgaWdub3JlIGl0IGF0IHRoaXMgcG9pbnQuICAqLwotICBoID0gc3Vub3NfbGlua19oYXNoX2xvb2t1cCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsCi0JCQkgICAgICBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJbiBhIHNoYXJlZCBsaWJyYXJ5LCB0aGUgX19EWU5BTUlDIHN5bWJvbCBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlCi0gICAgIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgaW5mby0+c2hhcmVkIHx8IHN0cmNtcCAobmFtZSwgIl9fRFlOQU1JQyIpICE9IDApCi0gICAgewotICAgICAgaC0+ZmxhZ3MgfD0gU1VOT1NfREVGX1JFR1VMQVI7Ci0KLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNldCB1cCB0aGUgc2l6ZXMgYW5kIGNvbnRlbnRzIG9mIHRoZSBkeW5hbWljIHNlY3Rpb25zIGNyZWF0ZWQgaW4KLSAgIHN1bm9zX2FkZF9keW5hbWljX3N5bWJvbHMuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgU3VuT1MgbGlua2VyCi0gICBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplcyBvZiB0aGUKLSAgIHNlY3Rpb25zIGJlZm9yZSB0aGUgbGlua2VyIHNldHMgdGhlIGFkZHJlc3NlcyBvZiB0aGUgdmFyaW91cwotICAgc2VjdGlvbnMuICBUaGlzIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgcmVhZGluZyBhbGwgdGhlIHJlbG9jcyBzbwotICAgdGhhdCB3ZSBjYW4gd29yayBvdXQgd2hpY2ggb25lcyBuZWVkIHRvIGJlY29tZSBkeW5hbWljIHJlbG9jcy4gIElmCi0gICBpbmZvLT5rZWVwX21lbW9yeSBpcyB0cnVlLCB3ZSBrZWVwIHRoZSByZWxvY3MgaW4gbWVtb3J5OyBvdGhlcndpc2UsCi0gICB3ZSBkaXNjYXJkIHRoZW0sIGFuZCB3aWxsIHJlYWQgdGhlbSBhZ2FpbiBsYXRlci4gICovCi0KLWJvb2xlYW4KLWJmZF9zdW5vc19zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8sIHNkeW5wdHIsIHNuZWVkcHRyLAotCQkJCSBzcnVsZXNwdHIpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICoqc2R5bnB0cjsKLSAgICAgYXNlY3Rpb24gKipzbmVlZHB0cjsKLSAgICAgYXNlY3Rpb24gKipzcnVsZXNwdHI7Ci17Ci0gIGJmZCAqZHlub2JqOwotICBzaXplX3QgZHluc3ltY291bnQ7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGFzZWN0aW9uICpzOwotICBzaXplX3QgYnVja2V0Y291bnQ7Ci0gIHNpemVfdCBoYXNoYWxsb2M7Ci0gIHNpemVfdCBpOwotICBiZmQgKnN1YjsKLQotICAqc2R5bnB0ciA9IE5VTEw7Ci0gICpzbmVlZHB0ciA9IE5VTEw7Ci0gICpzcnVsZXNwdHIgPSBOVUxMOwotCi0gIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG91dHB1dF9iZmQtPnh2ZWMgIT0gJk1ZKHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogTG9vayB0aHJvdWdoIGFsbCB0aGUgaW5wdXQgQkZEJ3MgYW5kIHJlYWQgdGhlaXIgcmVsb2NzLiAgSXQgd291bGQKLSAgICAgYmUgYmV0dGVyIGlmIHdlIGRpZG4ndCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCB0aGVyZSBpcyBubyBvdGhlciB3YXkKLSAgICAgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZHluYW1pYyByZWxvY3Mgd2UgbmVlZCwgYW5kLCBtb3JlCi0gICAgIGltcG9ydGFudGx5LCB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8ga25vdyB3aGljaCBzeW1ib2xzIHNob3VsZAotICAgICBnZXQgYW4gZW50cnkgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgaWYgKChzdWItPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgJiYgc3ViLT54dmVjID09IG91dHB1dF9iZmQtPnh2ZWMpCi0JewotCSAgaWYgKCEgc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIHN1Yiwgb2JqX3RleHRzZWMgKHN1YiksCi0JCQkJICAgZXhlY19oZHIgKHN1YiktPmFfdHJzaXplKQotCSAgICAgIHx8ICEgc3Vub3Nfc2Nhbl9yZWxvY3MgKGluZm8sIHN1Yiwgb2JqX2RhdGFzZWMgKHN1YiksCi0JCQkJICAgICAgZXhlY19oZHIgKHN1YiktPmFfZHJzaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgZHluc3ltY291bnQgPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0KLSAgLyogSWYgdGhlcmUgd2VyZSBubyBkeW5hbWljIG9iamVjdHMgaW4gdGhlIGxpbmssIGFuZCB3ZSBkb24ndCBuZWVkCi0gICAgIHRvIGJ1aWxkIGEgZ2xvYmFsIG9mZnNldCB0YWJsZSwgdGhlcmUgaXMgbm90aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgaWYgKCEgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bmFtaWNfc2VjdGlvbnNfbmVlZGVkCi0gICAgICAmJiAhIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIElmIF9fR0xPQkFMX09GRlNFVF9UQUJMRV8gd2FzIG1lbnRpb25lZCwgZGVmaW5lIGl0LiAgKi8KLSAgaCA9IHN1bm9zX2xpbmtfaGFzaF9sb29rdXAgKHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgICAgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGggIT0gTlVMTCAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19SRUZfUkVHVUxBUikgIT0gMCkKLSAgICB7Ci0gICAgICBoLT5mbGFncyB8PSBTVU5PU19ERUZfUkVHVUxBUjsKLSAgICAgIGlmIChoLT5keW5pbmR4ID09IC0xKQotCXsKLQkgICsrc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotCSAgaC0+ZHluaW5keCA9IC0yOwotCX0KLSAgICAgIGgtPnJvb3Qucm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCi0gICAgICAvKiBJZiB0aGUgLmdvdCBzZWN0aW9uIGlzIG1vcmUgdGhhbiAweDEwMDAgYnl0ZXMsIHdlIHNldAotICAgICAgICAgX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyB0byBiZSAweDEwMDAgYnl0ZXMgaW50byB0aGUgc2VjdGlvbiwKLSAgICAgICAgIHNvIHRoYXQgMTMgYml0IHJlbG9jYXRpb25zIGhhdmUgYSBncmVhdGVyIGNoYW5jZSBvZiB3b3JraW5nLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIGlmIChzLT5fcmF3X3NpemUgPj0gMHgxMDAwKQotCWgtPnJvb3Qucm9vdC51LmRlZi52YWx1ZSA9IDB4MTAwMDsKLSAgICAgIGVsc2UKLQloLT5yb290LnJvb3QudS5kZWYudmFsdWUgPSAwOwotCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X2Jhc2UgPSBoLT5yb290LnJvb3QudS5kZWYudmFsdWU7Ci0gICAgfQotCi0gIC8qIElmIHRoZXJlIGFyZSBhbnkgc2hhcmVkIG9iamVjdHMgaW4gdGhlIGxpbmssIHRoZW4gd2UgbmVlZCB0byBzZXQKLSAgICAgdXAgdGhlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluYW1pY19zZWN0aW9uc19uZWVkZWQpCi0gICAgewotICAgICAgKnNkeW5wdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLQotICAgICAgLyogVGhlIC5keW5hbWljIHNlY3Rpb24gaXMgYWx3YXlzIHRoZSBzYW1lIHNpemUuICAqLwotICAgICAgcyA9ICpzZHlucHRyOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IChzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWMpCi0JCSAgICAgICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUKLQkJICAgICAgKyBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWNfbGluaykpOwotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5keW5zeW0gYW5kIC5oYXNoIHNlY3Rpb25zLiAgV2UgY291bnRlZAotCSB0aGUgbnVtYmVyIG9mIGR5bmFtaWMgc3ltYm9scyBhcyB3ZSByZWFkIHRoZSBpbnB1dCBmaWxlcy4gIFdlCi0JIHdpbGwgYnVpbGQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlICguZHluc3ltKSBhbmQgdGhlIGhhc2gKLQkgdGFibGUgKC5oYXNoKSB3aGVuIHdlIGJ1aWxkIHRoZSBmaW5hbCBzeW1ib2wgdGFibGUsIGJlY2F1c2UKLQkgdW50aWwgdGhlbiB3ZSBkbyBub3Qga25vdyB0aGUgY29ycmVjdCB2YWx1ZSB0byBnaXZlIHRoZQotCSBzeW1ib2xzLiAgV2UgYnVpbGQgdGhlIGR5bmFtaWMgc3ltYm9sIHN0cmluZyB0YWJsZSAoLmR5bnN0cikKLQkgaW4gYSB0cmF2ZXJzYWwgb2YgdGhlIHN5bWJvbCB0YWJsZSB1c2luZwotCSBzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sLiAgKi8KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIHMtPl9yYXdfc2l6ZSA9IGR5bnN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QpOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHMtPmNvbnRlbnRzID09IE5VTEwgJiYgcy0+X3Jhd19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgCi0gICAgICAvKiBUaGUgbnVtYmVyIG9mIGJ1Y2tldHMgaXMganVzdCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZGl2aWRlZAotCSBieSBmb3VyLiAgVG8gY29tcHV0ZSB0aGUgZmluYWwgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSwgd2UKLQkgbXVzdCBhY3R1YWxseSBjb21wdXRlIHRoZSBoYXNoIHRhYmxlLiAgTm9ybWFsbHkgd2UgbmVlZAotCSBleGFjdGx5IGFzIG1hbnkgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBhcyB0aGVyZSBhcmUKLQkgZHluYW1pYyBzeW1ib2xzLCBidXQgaWYgc29tZSBvZiB0aGUgYnVja2V0cyBhcmUgbm90IHVzZWQgd2UKLQkgd2lsbCBuZWVkIGFkZGl0aW9uYWwgZW50cmllcy4gIEluIHRoZSB3b3JzdCBjYXNlLCBldmVyeQotCSBzeW1ib2wgd2lsbCBoYXNoIHRvIHRoZSBzYW1lIGJ1Y2tldCwgYW5kIHdlIHdpbGwgbmVlZAotCSBCVUNLRVRDT1VOVCAtIDEgZXh0cmEgZW50cmllcy4gICovCi0gICAgICBpZiAoZHluc3ltY291bnQgPj0gNCkKLQlidWNrZXRjb3VudCA9IGR5bnN5bWNvdW50IC8gNDsKLSAgICAgIGVsc2UgaWYgKGR5bnN5bWNvdW50ID4gMCkKLQlidWNrZXRjb3VudCA9IGR5bnN5bWNvdW50OwotICAgICAgZWxzZQotCWJ1Y2tldGNvdW50ID0gMTsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBoYXNoYWxsb2MgPSAoZHluc3ltY291bnQgKyBidWNrZXRjb3VudCAtIDEpICogSEFTSF9FTlRSWV9TSVpFOwotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIGhhc2hhbGxvYyk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCAmJiBkeW5zeW1jb3VudCA+IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbWVtc2V0IChzLT5jb250ZW50cywgMCwgaGFzaGFsbG9jKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBidWNrZXRjb3VudDsgaSsrKQotCVBVVF9XT1JEIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgLTEsIHMtPmNvbnRlbnRzICsgaSAqIEhBU0hfRU5UUllfU0laRSk7Ci0gICAgICBzLT5fcmF3X3NpemUgPSBidWNrZXRjb3VudCAqIEhBU0hfRU5UUllfU0laRTsKLQotICAgICAgc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50ID0gYnVja2V0Y291bnQ7Ci0KLSAgICAgIC8qIFNjYW4gYWxsIHRoZSBzeW1ib2xzLCBwbGFjZSB0aGVtIGluIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwKLQkgYW5kIGJ1aWxkIHRoZSBkeW5hbWljIGhhc2ggdGFibGUuICBXZSByZXVzZSBkeW5zeW1jb3VudCBhcyBhCi0JIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB3ZSBoYXZlIGFkZGVkIHNvIGZhci4gICovCi0gICAgICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQgPSAwOwotICAgICAgc3Vub3NfbGlua19oYXNoX3RyYXZlcnNlIChzdW5vc19oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQlzdW5vc19zY2FuX2R5bmFtaWNfc3ltYm9sLAotCQkJCShQVFIpIGluZm8pOwotICAgICAgQkZEX0FTU0VSVCAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50ID09IGR5bnN5bWNvdW50KTsKLQotICAgICAgLyogVGhlIFN1bk9TIG5hdGl2ZSBsaW5rZXIgc2VlbXMgdG8gYWxpZ24gdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0JIHN5bWJvbCBzdHJpbmdzIHRvIGEgbXVsdGlwbGUgb2YgOC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzCi0JIGltcG9ydGFudCwgYnV0IGl0IGNhbid0IGh1cnQgbXVjaC4gICovCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5zdHIiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBpZiAoKHMtPl9yYXdfc2l6ZSAmIDcpICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0JICBiZmRfYnl0ZSAqY29udGVudHM7Ci0KLQkgIGFkZCA9IDggLSAocy0+X3Jhd19zaXplICYgNyk7Ci0JICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfcmVhbGxvYyAocy0+Y29udGVudHMsCi0JCQkJCSAgICAgICAoc2l6ZV90KSAocy0+X3Jhd19zaXplICsgYWRkKSk7Ci0JICBpZiAoY29udGVudHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbWVtc2V0IChjb250ZW50cyArIHMtPl9yYXdfc2l6ZSwgMCwgKHNpemVfdCkgYWRkKTsKLQkgIHMtPmNvbnRlbnRzID0gY29udGVudHM7Ci0JICBzLT5fcmF3X3NpemUgKz0gYWRkOwotCX0KLSAgICB9Ci0KLSAgLyogTm93IHRoYXQgd2UgaGF2ZSB3b3JrZWQgb3V0IHRoZSBzaXplcyBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UKLSAgICAgdGFibGUgYW5kIHRoZSBkeW5hbWljIHJlbG9jcywgYWxsb2NhdGUgc3RvcmFnZSBmb3IgdGhlbS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZS4gICovCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoZHlub2JqKSkKLQl7Ci0JY2FzZSBiZmRfYXJjaF9zcGFyYzoKLQkgIG1lbWNweSAocy0+Y29udGVudHMsIHNwYXJjX3BsdF9maXJzdF9lbnRyeSwgU1BBUkNfUExUX0VOVFJZX1NJWkUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9hcmNoX202OGs6Ci0JICBtZW1jcHkgKHMtPmNvbnRlbnRzLCBtNjhrX3BsdF9maXJzdF9lbnRyeSwgTTY4S19QTFRfRU5UUllfU0laRSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotICBpZiAocy0+X3Jhd19zaXplICE9IDApCi0gICAgewotICAgICAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAocy0+Y29udGVudHMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKiBXZSB1c2UgdGhlIHJlbG9jX2NvdW50IGZpZWxkIHRvIGtlZXAgdHJhY2sgb2YgaG93IG1hbnkgb2YgdGhlCi0gICAgIHJlbG9jcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICBzLT5yZWxvY19jb3VudCA9IDA7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUuICAqLwotICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChkeW5vYmosIHMtPl9yYXdfc2l6ZSk7Ci0gIGlmIChzLT5jb250ZW50cyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqc25lZWRwdHIgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKTsKLSAgKnNydWxlc3B0ciA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucnVsZXMiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2NhbiB0aGUgcmVsb2NzIGZvciBhbiBpbnB1dCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX3NjYW5fcmVsb2NzIChpbmZvLCBhYmZkLCBzZWMsIHJlbF9zaXplKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBQVFIgcmVsb2NzOwotICBQVFIgZnJlZV9yZWxvY3MgPSBOVUxMOwotCi0gIGlmIChyZWxfc2l6ZSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5KQotICAgIHJlbG9jcyA9IGZyZWVfcmVsb2NzID0gYmZkX21hbGxvYyAoKHNpemVfdCkgcmVsX3NpemUpOwotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqbjsKLQotICAgICAgbiA9ICgoc3RydWN0IGFvdXRfc2VjdGlvbl9kYXRhX3N0cnVjdCAqKQotCSAgIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgYW91dF9zZWN0aW9uX2RhdGFfc3RydWN0KSkpOwotICAgICAgaWYgKG4gPT0gTlVMTCkKLQlyZWxvY3MgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHNldF9hb3V0X3NlY3Rpb25fZGF0YSAoc2VjLCBuKTsKLQkgIHJlbG9jcyA9IGJmZF9tYWxsb2MgKChzaXplX3QpIHJlbF9zaXplKTsKLQkgIGFvdXRfc2VjdGlvbl9kYXRhIChzZWMpLT5yZWxvY3MgPSByZWxvY3M7Ci0JfQotICAgIH0KLSAgaWYgKHJlbG9jcyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIHNlYy0+cmVsX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCBiZmRfcmVhZCAocmVsb2NzLCAxLCByZWxfc2l6ZSwgYWJmZCkgIT0gcmVsX3NpemUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChhYmZkKSA9PSBSRUxPQ19TVERfU0laRSkKLSAgICB7Ci0gICAgICBpZiAoISBzdW5vc19zY2FuX3N0ZF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywKLQkJCQkgICAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvY3MsCi0JCQkJICAgcmVsX3NpemUpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHN1bm9zX3NjYW5fZXh0X3JlbG9jcyAoaW5mbywgYWJmZCwgc2VjLAotCQkJCSAgIChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jcywKLQkJCQkgICByZWxfc2l6ZSkpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChmcmVlX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZyZWVfcmVsb2NzKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGZyZWVfcmVsb2NzICE9IE5VTEwpCi0gICAgZnJlZSAoZnJlZV9yZWxvY3MpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbiB1c2luZyBzdGFuZGFyZCByZWxvY3MuICBXZQotICAgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGR5bmFtaWMKLSAgIHN5bWJvbC4gIElmIHRoZSBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIGFuIGVudHJ5IGlzIG1hZGUgaW4KLSAgIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZS4gIE5vdGUgdGhhdCB0aGlzIHdpbGwgZG8gdGhlIHdyb25nCi0gICB0aGluZyBpZiB0aGUgc3ltYm9sIGlzIGFjdHVhbGx5IGRhdGE7IEkgZG9uJ3QgdGhpbmsgdGhlIFN1biAzCi0gICBuYXRpdmUgbGlua2VyIGhhbmRsZXMgdGhpcyBjYXNlIGNvcnJlY3RseSBlaXRoZXIuICBJZiB0aGUgc3ltYm9sIGlzCi0gICBub3QgaW4gdGhlIC50ZXh0IHNlY3Rpb24sIHdlIG11c3QgcHJlc2VydmUgdGhlIHJlbG9jIGFzIGEgZHluYW1pYwotICAgcmVsb2MuICBGSVhNRTogV2Ugc2hvdWxkIGFsc28gaGFuZGxlIHRoZSBQSUMgcmVsb2NzIGhlcmUgYnkKLSAgIGJ1aWxkaW5nIGdsb2JhbCBvZmZzZXQgdGFibGUgZW50cmllcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX3N0ZF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywgcmVsb2NzLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3Qgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBiZmQgKmR5bm9iajsKLSAgYXNlY3Rpb24gKnNwbHQgPSBOVUxMOwotICBhc2VjdGlvbiAqc3JlbCA9IE5VTEw7Ci0gIHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaGVzOwotICBjb25zdCBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpyZWwsICpyZWxlbmQ7Ci0KLSAgLyogV2Ugb25seSBrbm93IGhvdyB0byBoYW5kbGUgbTY4ayBwbHQgZW50cmllcy4gICovCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGFiZmQpICE9IGJmZF9hcmNoX202OGspCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZHlub2JqID0gTlVMTDsKLQotICBzeW1faGFzaGVzID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKiopIG9ial9hb3V0X3N5bV9oYXNoZXMgKGFiZmQpOwotCi0gIHJlbGVuZCA9IHJlbG9jcyArIHJlbF9zaXplIC8gUkVMT0NfU1REX1NJWkU7Ci0gIGZvciAocmVsID0gcmVsb2NzOyByZWwgPCByZWxlbmQ7IHJlbCsrKQotICAgIHsKLSAgICAgIGludCByX2luZGV4OwotICAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgLyogV2Ugb25seSB3YW50IHJlbG9jcyBhZ2FpbnN0IGV4dGVybmFsIHN5bWJvbHMuICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgaWYgKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcpID09IDApCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRSkgPT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBHZXQgdGhlIHN5bWJvbCBpbmRleC4gICovCi0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChhYmZkKSkKLQlyX2luZGV4ID0gKChyZWwtPnJfaW5kZXhbMF0gPDwgMTYpCi0JCSAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICB8IHJlbC0+cl9pbmRleFsyXSk7Ci0gICAgICBlbHNlCi0Jcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkgICB8IChyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJICAgfCByZWwtPnJfaW5kZXhbMF0pOwotCi0gICAgICAvKiBHZXQgdGhlIGhhc2ggdGFibGUgZW50cnkuICAqLwotICAgICAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIC8qIFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBoYXBwZW4sIGJ1dCBpdCB3aWxsIGluIGFueSBjYXNlCi0JICAgICBiZSBjYXVnaHQgaW4gdGhlIHJlbG9jYXRpb24gcGhhc2UuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBBdCB0aGlzIHBvaW50IGNvbW1vbiBzeW1ib2xzIGhhdmUgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCwgc28KLQkgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGVtLiAgV2UgbmVlZCB0byBjb25zaWRlciB0aGF0Ci0JIHdlIG1heSBoYXZlIGFscmVhZHkgc2VlbiB0aGlzIHN5bWJvbCBhbmQgbWFya2VkIGl0IHVuZGVmaW5lZDsKLQkgaWYgdGhlIHN5bWJvbCBpcyByZWFsbHkgdW5kZWZpbmVkLCB0aGVuIFNVTk9TX0RFRl9EWU5BTUlDCi0JIHdpbGwgYmUgemVyby4gICovCi0gICAgICBpZiAoaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkgICYmIGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNnb3Q7Ci0KLQkgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCBmYWxzZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0JICBzcGx0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCSAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNyZWwgIT0gTlVMTCk7Ci0KLQkgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCSAgQkZEX0FTU0VSVCAoc2dvdCAhPSBOVUxMKTsKLQkgIGlmIChzZ290LT5fcmF3X3NpemUgPT0gMCkKLQkgICAgc2dvdC0+X3Jhd19zaXplID0gQllURVNfSU5fV09SRDsKLQkgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIEJGRF9BU1NFUlQgKChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKTsKLSAgICAgIEJGRF9BU1NFUlQgKGgtPnBsdF9vZmZzZXQgIT0gMAotCQkgIHx8ICgoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICAgID8gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAmIERZTkFNSUMpICE9IDAKLQkJICAgICAgOiAoaC0+cm9vdC5yb290LnUudW5kZWYuYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKSk7Ci0KLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCBkZWZpbmVkIG9ubHkgYnkgYSBkeW5hbWljCi0JIG9iamVjdC4gICovCi0KLSAgICAgIGlmIChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICAvKiBQcmVzdW1hYmx5IHRoaXMgc3ltYm9sIHdhcyBtYXJrZWQgYXMgYmVpbmcgdW5kZWZpbmVkIGJ5Ci0JICAgICBhbiBlYXJsaWVyIHJlbG9jLiAgKi8KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKLQl9Ci0gICAgICBlbHNlIGlmICgoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREUpID09IDApCi0JewotCSAgYmZkICpzdWI7Ci0KLQkgIC8qIFRoaXMgcmVsb2MgaXMgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLiAgSXQgbXVzdCBiZQotCSAgICAgY29waWVkIGludG8gdGhlIGR5bmFtaWMgcmVsb2NzLiAgV2UgbWFyayB0aGUgc3ltYm9sIGFzCi0JICAgICBiZWluZyB1bmRlZmluZWQuICAqLwotCSAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX1NURF9TSVpFOwotCSAgc3ViID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBzdWI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGluIHRoZSAudGV4dCBzZWN0aW9uLiAgV2UgbXVzdCBnaXZlIGl0IGFuCi0JICAgICBlbnRyeSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUsIGlmIHdlIGhhdmUgbm90Ci0JICAgICBhbHJlYWR5IGRvbmUgc28uICBXZSBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbAotCSAgICAgdG8gdGhlIC5wbHQgc2VjdGlvbjsgdGhpcyB3aWxsIGNhdXNlIHJlbG9jcyBhZ2FpbnN0IGl0IHRvCi0JICAgICBiZSBoYW5kbGVkIGNvcnJlY3RseS4gICovCi0JICBpZiAoaC0+cGx0X29mZnNldCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKHNwbHQtPl9yYXdfc2l6ZSA9PSAwKQotCQlzcGx0LT5fcmF3X3NpemUgPSBNNjhLX1BMVF9FTlRSWV9TSVpFOwotCSAgICAgIGgtPnBsdF9vZmZzZXQgPSBzcGx0LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXsKLQkJICBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9IHNwbHQ7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gc3BsdC0+X3Jhd19zaXplOwotCQl9Ci0KLQkgICAgICBzcGx0LT5fcmF3X3NpemUgKz0gTTY4S19QTFRfRU5UUllfU0laRTsKLQotCSAgICAgIC8qIFdlIG1heSBhbHNvIG5lZWQgYSBkeW5hbWljIHJlbG9jIGVudHJ5LiAgKi8KLQkgICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19TVERfU0laRTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNjYW4gdGhlIHJlbG9jcyBmb3IgYW4gaW5wdXQgc2VjdGlvbiB1c2luZyBleHRlbmRlZCByZWxvY3MuICBXZQotICAgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGR5bmFtaWMKLSAgIHN5bWJvbC4gIElmIHRoZSByZWxvYyBpcyBhIFdESVNQMzAsIGFuZCB0aGUgc3ltYm9sIGlzIGluIHRoZSAudGV4dAotICAgc2VjdGlvbiwgYW4gZW50cnkgaXMgbWFkZSBpbiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUuCi0gICBPdGhlcndpc2UsIHdlIG11c3QgcHJlc2VydmUgdGhlIHJlbG9jIGFzIGEgZHluYW1pYyByZWxvYy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc19zY2FuX2V4dF9yZWxvY3MgKGluZm8sIGFiZmQsIHNlYywgcmVsb2NzLCByZWxfc2l6ZSkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY29uc3Qgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqcmVsb2NzOwotICAgICBiZmRfc2l6ZV90eXBlIHJlbF9zaXplOwotewotICBiZmQgKmR5bm9iajsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoZXM7Ci0gIGNvbnN0IHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKnJlbCwgKnJlbGVuZDsKLSAgYXNlY3Rpb24gKnNwbHQgPSBOVUxMOwotICBhc2VjdGlvbiAqc2dvdCA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzcmVsID0gTlVMTDsKLQotICAvKiBXZSBvbmx5IGtub3cgaG93IHRvIGhhbmRsZSBTUEFSQyBwbHQgZW50cmllcy4gICovCi0gIGlmIChiZmRfZ2V0X2FyY2ggKGFiZmQpICE9IGJmZF9hcmNoX3NwYXJjKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGR5bm9iaiA9IE5VTEw7Ci0KLSAgc3ltX2hhc2hlcyA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICoqKSBvYmpfYW91dF9zeW1faGFzaGVzIChhYmZkKTsKLQotICByZWxlbmQgPSByZWxvY3MgKyByZWxfc2l6ZSAvIFJFTE9DX0VYVF9TSVpFOwotICBmb3IgKHJlbCA9IHJlbG9jczsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgcl9pbmRleDsKLSAgICAgIGludCByX2V4dGVybjsKLSAgICAgIGludCByX3R5cGU7Ci0gICAgICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQotICAgICAgLyogU3dhcCBpbiB0aGUgcmVsb2MgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoYWJmZCkpCi0JewotCSAgcl9pbmRleCA9ICgocmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkgICAgIHwgKHJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkgICAgIHwgcmVsLT5yX2luZGV4WzJdKTsKLQkgIHJfZXh0ZXJuID0gKDAgIT0gKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRykpOwotCSAgcl90eXBlID0gKChyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotCQkgICAgPj4gUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByX2luZGV4ID0gKChyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCSAgICAgfCAocmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCSAgICAgfCByZWwtPnJfaW5kZXhbMF0pOwotCSAgcl9leHRlcm4gPSAoMCAhPSAocmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFKSk7Ci0JICByX3R5cGUgPSAoKHJlbC0+cl90eXBlWzBdICYgUkVMT0NfRVhUX0JJVFNfVFlQRV9MSVRUTEUpCi0JCSAgICA+PiBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSk7Ci0JfQotCi0gICAgICBpZiAocl9leHRlcm4pCi0JewotCSAgaCA9IHN5bV9oYXNoZXNbcl9pbmRleF07Ci0JICBpZiAoaCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBzaG91bGQgbm90IG5vcm1hbGx5IGhhcHBlbiwgYnV0IGl0IHdpbGwgaW4gYW55Ci0JCSBjYXNlIGJlIGNhdWdodCBpbiB0aGUgcmVsb2NhdGlvbiBwaGFzZS4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBiYXNlIHJlbGF0aXZlIHJlbG9jLCB3ZSBuZWVkIHRvIG1ha2UgYW4gZW50cnkgaW4KLSAgICAgICAgIHRoZSAuZ290IHNlY3Rpb24uICAqLwotICAgICAgaWYgKHJfdHlwZSA9PSBSRUxPQ19CQVNFMTAKLQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMTMKLQkgIHx8IHJfdHlwZSA9PSBSRUxPQ19CQVNFMjIpCi0JewotCSAgaWYgKGR5bm9iaiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIGZhbHNlKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0JICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0JICAgICAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICAgICAgc3JlbCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JICAgICAgQkZEX0FTU0VSVCAoc3BsdCAhPSBOVUxMICYmIHNnb3QgIT0gTlVMTCAmJiBzcmVsICE9IE5VTEwpOwotCi0JICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5pdGlhbCBlbnRyeSBpbiB0aGUgLmdvdCB0YWJsZS4gICovCi0JICAgICAgaWYgKHNnb3QtPl9yYXdfc2l6ZSA9PSAwKQotCQlzZ290LT5fcmF3X3NpemUgPSBCWVRFU19JTl9XT1JEOwotCSAgICAgIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5nb3RfbmVlZGVkID0gdHJ1ZTsKLQkgICAgfQotCi0JICBpZiAocl9leHRlcm4pCi0JICAgIHsKLQkgICAgICBpZiAoaC0+Z290X29mZnNldCAhPSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIGgtPmdvdF9vZmZzZXQgPSBzZ290LT5fcmF3X3NpemU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChyX2luZGV4ID49IGJmZF9nZXRfc3ltY291bnQgKGFiZmQpKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBhYm5vcm1hbCwgYnV0IHNob3VsZCBiZSBjYXVnaHQgaW4gdGhlCi0JCSAgICAgcmVsb2NhdGlvbiBwaGFzZS4gICovCi0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGlmIChhZGF0YSAoYWJmZCkubG9jYWxfZ290X29mZnNldHMgPT0gTlVMTCkKLQkJewotCQkgIGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyA9Ci0JCSAgICAoYmZkX3ZtYSAqKSBiZmRfemFsbG9jIChhYmZkLAotCQkJCQkgICAgKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpCi0JCQkJCSAgICAgKiBzaXplb2YgKGJmZF92bWEpKSk7Ci0JCSAgaWYgKGFkYXRhIChhYmZkKS5sb2NhbF9nb3Rfb2Zmc2V0cyA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzW3JfaW5kZXhdICE9IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgYWRhdGEgKGFiZmQpLmxvY2FsX2dvdF9vZmZzZXRzW3JfaW5kZXhdID0gc2dvdC0+X3Jhd19zaXplOwotCSAgICB9Ci0KLQkgIHNnb3QtPl9yYXdfc2l6ZSArPSBCWVRFU19JTl9XT1JEOwotCi0JICAvKiBJZiB3ZSBhcmUgbWFraW5nIGEgc2hhcmVkIGxpYnJhcnksIG9yIGlmIHRoZSBzeW1ib2wgaXMKLQkgICAgIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgd2Ugd2lsbCBuZWVkIGEgZHluYW1pYyByZWxvYwotCSAgICAgZW50cnkuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZAotCSAgICAgIHx8IChoICE9IE5VTEwKLQkJICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgIT0gMAotCQkgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKSkKLQkgICAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE90aGVyd2lzZSwgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiByZWxvY3MgYWdhaW5zdCBzeW1ib2xzCi0gICAgICAgICBkZWZpbmVkIGluIGR5bmFtaWMgb2JqZWN0cyBidXQgbm90IGluIHJlZ3VsYXIgb2JqZWN0cy4gIFdlCi0gICAgICAgICBvbmx5IG5lZWQgdG8gY29uc2lkZXIgcmVsb2NzIGFnYWluc3QgZXh0ZXJuYWwgc3ltYm9scy4gICovCi0gICAgICBpZiAoISByX2V4dGVybikKLQl7Ci0JICAvKiBCdXQsIGlmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgZ2VuZXJhdGUgYW4gYWJzb2x1dGUgcmVsb2MuICAqLwotCSAgaWYgKGluZm8tPnNoYXJlZCkKLQkgICAgewotCSAgICAgIGlmIChkeW5vYmogPT0gTlVMTCkKLQkJewotCQkgIGlmICghIHN1bm9zX2NyZWF0ZV9keW5hbWljX3NlY3Rpb25zIChhYmZkLCBpbmZvLCB0cnVlKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCQkgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCQkgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCQkgIHNyZWwgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotCQkgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQkJfQotCi0JICAgICAgc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQXQgdGhpcyBwb2ludCBjb21tb24gc3ltYm9scyBoYXZlIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQsIHNvCi0JIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlbS4gIFdlIG5lZWQgdG8gY29uc2lkZXIgdGhhdAotCSB3ZSBtYXkgaGF2ZSBhbHJlYWR5IHNlZW4gdGhpcyBzeW1ib2wgYW5kIG1hcmtlZCBpdCB1bmRlZmluZWQ7Ci0JIGlmIHRoZSBzeW1ib2wgaXMgcmVhbGx5IHVuZGVmaW5lZCwgdGhlbiBTVU5PU19ERUZfRFlOQU1JQwotCSB3aWxsIGJlIHplcm8uICAqLwotICAgICAgaWYgKGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JICAmJiBoLT5yb290LnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKHJfdHlwZSAhPSBSRUxPQ19KTVBfVEJMCi0JICAmJiAhIGluZm8tPnNoYXJlZAotCSAgJiYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JICAgICAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDApKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAocl90eXBlID09IFJFTE9DX0pNUF9UQkwKLQkgICYmICEgaW5mby0+c2hhcmVkCi0JICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgPT0gMAotCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaXMgYXBwYXJlbnRseSB1bmRlZmluZWQuICBEb24ndCBkbyBhbnl0aGluZwotICAgICAgICAgICAgIGhlcmU7IGp1c3QgbGV0IHRoZSByZWxvY2F0aW9uIHJvdXRpbmUgcmVwb3J0IGFuIHVuZGVmaW5lZAotICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZHlub2JqID09IE5VTEwpCi0JewotCSAgaWYgKCEgc3Vub3NfY3JlYXRlX2R5bmFtaWNfc2VjdGlvbnMgKGFiZmQsIGluZm8sIGZhbHNlKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLQkgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotCSAgc2dvdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZ290Iik7Ci0JICBzcmVsID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5keW5yZWwiKTsKLQkgIEJGRF9BU1NFUlQgKHNwbHQgIT0gTlVMTCAmJiBzZ290ICE9IE5VTEwgJiYgc3JlbCAhPSBOVUxMKTsKLQotCSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5pdGlhbCBlbnRyeSBpbiB0aGUgLmdvdCB0YWJsZS4gICovCi0JICBpZiAoc2dvdC0+X3Jhd19zaXplID09IDApCi0JICAgIHNnb3QtPl9yYXdfc2l6ZSA9IEJZVEVTX0lOX1dPUkQ7Ci0JICBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCA9IHRydWU7Ci0JfQotCi0gICAgICBCRkRfQVNTRVJUIChyX3R5cGUgPT0gUkVMT0NfSk1QX1RCTAotCQkgIHx8IGluZm8tPnNoYXJlZAotCQkgIHx8IChoLT5mbGFncyAmIFNVTk9TX1JFRl9SRUdVTEFSKSAhPSAwKTsKLSAgICAgIEJGRF9BU1NFUlQgKHJfdHlwZSA9PSBSRUxPQ19KTVBfVEJMCi0JCSAgfHwgaW5mby0+c2hhcmVkCi0JCSAgfHwgaC0+cGx0X29mZnNldCAhPSAwCi0JCSAgfHwgKChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgIHx8IGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgICAgPyAoaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLT5mbGFncwotCQkJICYgRFlOQU1JQykgIT0gMAotCQkgICAgICA6IChoLT5yb290LnJvb3QudS51bmRlZi5hYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApKTsKLQotICAgICAgLyogVGhpcyByZWxvYyBpcyBhZ2FpbnN0IGEgc3ltYm9sIGRlZmluZWQgb25seSBieSBhIGR5bmFtaWMKLQkgb2JqZWN0LCBvciBpdCBpcyBhIGp1bXAgdGFibGUgcmVsb2MgZnJvbSBQSUMgY29tcGlsZWQgY29kZS4gICovCi0KLSAgICAgIGlmIChyX3R5cGUgIT0gUkVMT0NfSk1QX1RCTAotCSAgJiYgaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgLyogUHJlc3VtYWJseSB0aGlzIHN5bWJvbCB3YXMgbWFya2VkIGFzIGJlaW5nIHVuZGVmaW5lZCBieQotCSAgICAgYW4gZWFybGllciByZWxvYy4gICovCi0JICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0JfQotICAgICAgZWxzZSBpZiAocl90eXBlICE9IFJFTE9DX0pNUF9UQkwKLQkgICAgICAgJiYgKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKQotCXsKLQkgIGJmZCAqc3ViOwotCi0JICAvKiBUaGlzIHJlbG9jIGlzIG5vdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIEl0IG11c3QgYmUKLQkgICAgIGNvcGllZCBpbnRvIHRoZSBkeW5hbWljIHJlbG9jcy4gIFdlIG1hcmsgdGhlIHN5bWJvbCBhcwotCSAgICAgYmVpbmcgdW5kZWZpbmVkLiAgKi8KLQkgIHNyZWwtPl9yYXdfc2l6ZSArPSBSRUxPQ19FWFRfU0laRTsKLQkgIGlmICgoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkgICAgewotCSAgICAgIHN1YiA9IGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgICAgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBzdWI7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaXMgaW4gdGhlIC50ZXh0IHNlY3Rpb24uICBXZSBtdXN0IGdpdmUgaXQgYW4KLQkgICAgIGVudHJ5IGluIHRoZSBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgaWYgd2UgaGF2ZSBub3QKLQkgICAgIGFscmVhZHkgZG9uZSBzby4gIFdlIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3ltYm9sCi0JICAgICB0byB0aGUgLnBsdCBzZWN0aW9uOyB0aGlzIHdpbGwgY2F1c2UgcmVsb2NzIGFnYWluc3QgaXQgdG8KLQkgICAgIGJlIGhhbmRsZWQgY29ycmVjdGx5LiAgKi8KLQkgIGlmIChoLT5wbHRfb2Zmc2V0ID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoc3BsdC0+X3Jhd19zaXplID09IDApCi0JCXNwbHQtPl9yYXdfc2l6ZSA9IFNQQVJDX1BMVF9FTlRSWV9TSVpFOwotCSAgICAgIGgtPnBsdF9vZmZzZXQgPSBzcGx0LT5fcmF3X3NpemU7Ci0KLQkgICAgICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JCXsKLQkJICBpZiAoaC0+cm9vdC5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JCSAgICBoLT5yb290LnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkJICBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbiA9IHNwbHQ7Ci0JCSAgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlID0gc3BsdC0+X3Jhd19zaXplOwotCQl9Ci0KLQkgICAgICBzcGx0LT5fcmF3X3NpemUgKz0gU1BBUkNfUExUX0VOVFJZX1NJWkU7Ci0KLQkgICAgICAvKiBXZSB3aWxsIGFsc28gbmVlZCBhIGR5bmFtaWMgcmVsb2MgZW50cnksIHVubGVzcyB0aGlzCi0gICAgICAgICAgICAgICAgIGlzIGEgSk1QX1RCTCByZWxvYyBwcm9kdWNlZCBieSBsaW5raW5nIFBJQyBjb21waWxlZAotICAgICAgICAgICAgICAgICBjb2RlLCBhbmQgd2UgYXJlIG5vdCBtYWtpbmcgYSBzaGFyZWQgbGlicmFyeS4gICovCi0JICAgICAgaWYgKGluZm8tPnNoYXJlZCB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkJc3JlbC0+X3Jhd19zaXplICs9IFJFTE9DX0VYVF9TSVpFOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBjcmVhdGluZyBhIHNoYXJlZCBsaWJyYXJ5LCB3ZSBuZWVkIHRvIGNvcHkgb3ZlcgotICAgICAgICAgICAgIGFueSByZWxvYyBvdGhlciB0aGFuIGEganVtcCB0YWJsZSByZWxvYy4gICovCi0JICBpZiAoaW5mby0+c2hhcmVkICYmIHJfdHlwZSAhPSBSRUxPQ19KTVBfVEJMKQotCSAgICBzcmVsLT5fcmF3X3NpemUgKz0gUkVMT0NfRVhUX1NJWkU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQnVpbGQgdGhlIGhhc2ggdGFibGUgb2YgZHluYW1pYyBzeW1ib2xzLCBhbmQgdG8gbWFyayBhcyB3cml0dGVuIGFsbAotICAgc3ltYm9scyBmcm9tIGR5bmFtaWMgb2JqZWN0cyB3aGljaCB3ZSBkbyBub3QgcGxhbiB0byB3cml0ZSBvdXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3Vub3Nfc2Nhbl9keW5hbWljX3N5bWJvbCAoaCwgZGF0YSkKLSAgICAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvID0gKHN0cnVjdCBiZmRfbGlua19pbmZvICopIGRhdGE7Ci0KLSAgLyogU2V0IHRoZSB3cml0dGVuIGZsYWcgZm9yIHN5bWJvbHMgd2UgZG8gbm90IHdhbnQgdG8gd3JpdGUgb3V0IGFzCi0gICAgIHBhcnQgb2YgdGhlIHJlZ3VsYXIgc3ltYm9sIHRhYmxlLiAgVGhpcyBpcyBhbGwgc3ltYm9scyB3aGljaCBhcmUKLSAgICAgbm90IGRlZmluZWQgaW4gYSByZWd1bGFyIG9iamVjdCBmaWxlLiAgRm9yIHNvbWUgcmVhc29uIHN5bWJvbHMKLSAgICAgd2hpY2ggYXJlIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIG9iamVjdCBhbmQgZGVmaW5lZCBieSBhIGR5bmFtaWMKLSAgICAgb2JqZWN0IGRvIG5vdCBzZWVtIHRvIHNob3cgdXAgaW4gdGhlIHJlZ3VsYXIgc3ltYm9sIHRhYmxlLiAgSXQgaXMKLSAgICAgcG9zc2libGUgZm9yIGEgc3ltYm9sIHRvIGhhdmUgb25seSBTVU5PU19SRUZfUkVHVUxBUiBzZXQgaGVyZSwgaXQKLSAgICAgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCB3aGljaCB3YXMgdHVybmVkIGludG8gYSBjb21tb24gc3ltYm9sCi0gICAgIGJlY2F1c2UgaXQgd2FzIGZvdW5kIGluIGFuIGFyY2hpdmUgb2JqZWN0IHdoaWNoIHdhcyBub3QgaW5jbHVkZWQKLSAgICAgaW4gdGhlIGxpbmsuICAqLwotICBpZiAoKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSAhPSAwCi0gICAgICAmJiBzdHJjbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywgIl9fRFlOQU1JQyIpICE9IDApCi0gICAgaC0+cm9vdC53cml0dGVuID0gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QgYW5kIHJlZmVyZW5jZWQgYnkgYQotICAgICByZWd1bGFyIG9iamVjdCwgc2VlIHdoZXRoZXIgd2UgZ2F2ZSBpdCBhIHJlYXNvbmFibGUgdmFsdWUgd2hpbGUKLSAgICAgc2Nhbm5pbmcgdGhlIHJlbG9jcy4gICovCi0KLSAgaWYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfRFlOQU1JQykgIT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgU1VOT1NfUkVGX1JFR1VMQVIpICE9IDApCi0gICAgewotICAgICAgaWYgKChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICB8fCBoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiAoKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCSAgJiYgaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYmZkICpzdWI7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGN1cnJlbnRseSBkZWZpbmVkIGluIGEgZHluYW1pYyBzZWN0aW9uCi0JICAgICB3aGljaCBpcyBub3QgYmVpbmcgcHV0IGludG8gdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotCSAgICAgaW1wbGllcyB0aGF0IHRoZXJlIGlzIG5vIHJlbG9jIGFnYWluc3QgdGhlIHN5bWJvbC4gIEknbQotCSAgICAgbm90IHN1cmUgd2h5IHRoaXMgY2FzZSB3b3VsZCBldmVyIG9jY3VyLiAgSW4gYW55IGNhc2UsIHdlCi0JICAgICBjaGFuZ2UgdGhlIHN5bWJvbCB0byBiZSB1bmRlZmluZWQuICAqLwotCSAgc3ViID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgaC0+cm9vdC5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgIGgtPnJvb3Qucm9vdC51LnVuZGVmLmFiZmQgPSBzdWI7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIG9yIHJlZmVyZW5jZWQgYnkgYSByZWd1bGFyIGZpbGUsIGFkZCBpdAotICAgICB0byB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLSAgaWYgKChoLT5mbGFncyAmIChTVU5PU19ERUZfUkVHVUxBUiB8IFNVTk9TX1JFRl9SRUdVTEFSKSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpuYW1lOwotICAgICAgdW5zaWduZWQgbG9uZyBoYXNoOwotICAgICAgYmZkICpkeW5vYmo7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmR5bmluZHggPT0gLTIpOwotCi0gICAgICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gICAgICBoLT5keW5pbmR4ID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bnN5bWNvdW50OwotICAgICAgKytzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHluc3ltY291bnQ7Ci0KLSAgICAgIGxlbiA9IHN0cmxlbiAoaC0+cm9vdC5yb290LnJvb3Quc3RyaW5nKTsKLQotICAgICAgLyogV2UgZG9uJ3QgYm90aGVyIHRvIGNvbnN0cnVjdCBhIEJGRCBoYXNoIHRhYmxlIGZvciB0aGUgc3RyaW5ncwotCSB3aGljaCBhcmUgdGhlIG5hbWVzIG9mIHRoZSBkeW5hbWljIHN5bWJvbHMuICBVc2luZyBhIGhhc2gKLQkgdGFibGUgZm9yIHRoZSByZWd1bGFyIHN5bWJvbHMgaXMgYmVuZWZpY2lhbCwgYmVjYXVzZSB0aGUKLQkgcmVndWxhciBzeW1ib2xzIGluY2x1ZGVzIHRoZSBkZWJ1Z2dpbmcgc3ltYm9scywgd2hpY2ggaGF2ZQotCSBsb25nIG5hbWVzIGFuZCBhcmUgb2Z0ZW4gZHVwbGljYXRlZCBpbiBzZXZlcmFsIG9iamVjdCBmaWxlcy4KLQkgVGhlcmUgYXJlIG5vIGRlYnVnZ2luZyBzeW1ib2xzIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3RyIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3JlYWxsb2MgKHMtPmNvbnRlbnRzLAotCQkJCQkgICBzLT5fcmF3X3NpemUgKyBsZW4gKyAxKTsKLSAgICAgIGlmIChjb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHMtPmNvbnRlbnRzID0gY29udGVudHM7Ci0KLSAgICAgIGgtPmR5bnN0cl9pbmRleCA9IHMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cmNweSAoKGNoYXIgKikgY29udGVudHMgKyBzLT5fcmF3X3NpemUsIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZyk7Ci0gICAgICBzLT5fcmF3X3NpemUgKz0gbGVuICsgMTsKLQotICAgICAgLyogQWRkIGl0IHRvIHRoZSBkeW5hbWljIGhhc2ggdGFibGUuICAqLwotICAgICAgbmFtZSA9ICh1bnNpZ25lZCBjaGFyICopIGgtPnJvb3Qucm9vdC5yb290LnN0cmluZzsKLSAgICAgIGhhc2ggPSAwOwotICAgICAgd2hpbGUgKCpuYW1lICE9ICdcMCcpCi0JaGFzaCA9IChoYXNoIDw8IDEpICsgKm5hbWUrKzsKLSAgICAgIGhhc2ggJj0gMHg3ZmZmZmZmZjsKLSAgICAgIGhhc2ggJT0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmJ1Y2tldGNvdW50OwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5oYXNoIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotCi0gICAgICBpZiAoR0VUX1NXT1JEIChkeW5vYmosIHMtPmNvbnRlbnRzICsgaGFzaCAqIEhBU0hfRU5UUllfU0laRSkgPT0gLTEpCi0JUFVUX1dPUkQgKGR5bm9iaiwgaC0+ZHluaW5keCwgcy0+Y29udGVudHMgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfdm1hIG5leHQ7Ci0KLQkgIG5leHQgPSBHRVRfV09SRCAoZHlub2JqLAotCQkJICAgKHMtPmNvbnRlbnRzCi0JCQkgICAgKyBoYXNoICogSEFTSF9FTlRSWV9TSVpFCi0JCQkgICAgKyBCWVRFU19JTl9XT1JEKSk7Ci0JICBQVVRfV09SRCAoZHlub2JqLCBzLT5fcmF3X3NpemUgLyBIQVNIX0VOVFJZX1NJWkUsCi0JCSAgICBzLT5jb250ZW50cyArIGhhc2ggKiBIQVNIX0VOVFJZX1NJWkUgKyBCWVRFU19JTl9XT1JEKTsKLQkgIFBVVF9XT1JEIChkeW5vYmosIGgtPmR5bmluZHgsIHMtPmNvbnRlbnRzICsgcy0+X3Jhd19zaXplKTsKLQkgIFBVVF9XT1JEIChkeW5vYmosIG5leHQsIHMtPmNvbnRlbnRzICsgcy0+X3Jhd19zaXplICsgQllURVNfSU5fV09SRCk7Ci0JICBzLT5fcmF3X3NpemUgKz0gSEFTSF9FTlRSWV9TSVpFOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExpbmsgYSBkeW5hbWljIG9iamVjdC4gIFdlIGFjdHVhbGx5IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZG8gYXQKLSAgIHRoaXMgcG9pbnQuICBUaGlzIGVudHJ5IHBvaW50IGV4aXN0cyB0byBwcmV2ZW50IHRoZSByZWd1bGFyIGxpbmtlcgotICAgY29kZSBmcm9tIGRvaW5nIGFueXRoaW5nIHdpdGggdGhlIG9iamVjdC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2xpbmtfZHluYW1pY19vYmplY3QgKGluZm8sIGFiZmQpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYSBkeW5hbWljIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBmaW5hbCB0cmF2ZXJzYWwKLSAgIG92ZXIgdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdW5vc193cml0ZV9keW5hbWljX3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZykKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGFvdXRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotewotICBzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICpoID0gKHN0cnVjdCBzdW5vc19saW5rX2hhc2hfZW50cnkgKikgaGFyZzsKLSAgaW50IHR5cGU7Ci0gIGJmZF92bWEgdmFsOwotICBhc2VjdGlvbiAqczsKLSAgc3RydWN0IGV4dGVybmFsX25saXN0ICpvdXRzeW07Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLCBmaWxsIGluIHRoZQotICAgICB0YWJsZSBlbnRyeS4gICovCi0gIGlmIChoLT5wbHRfb2Zmc2V0ICE9IDApCi0gICAgewotICAgICAgYmZkICpkeW5vYmo7Ci0gICAgICBhc2VjdGlvbiAqc3BsdDsKLSAgICAgIGJmZF9ieXRlICpwOwotICAgICAgYXNlY3Rpb24gKnM7Ci0gICAgICBiZmRfdm1hIHJfYWRkcmVzczsKLQotICAgICAgZHlub2JqID0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iajsKLSAgICAgIHNwbHQgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLnBsdCIpOwotICAgICAgcCA9IHNwbHQtPmNvbnRlbnRzICsgaC0+cGx0X29mZnNldDsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0KLSAgICAgIHJfYWRkcmVzcyA9IChzcGx0LT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICsgc3BsdC0+b3V0cHV0X29mZnNldAotCQkgICArIGgtPnBsdF9vZmZzZXQpOwotCi0gICAgICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAob3V0cHV0X2JmZCkpCi0JewotCWNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0JICBpZiAoaW5mby0+c2hhcmVkIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgU1BBUkNfUExUX0VOVFJZX1dPUkQwLCBwKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICAoU1BBUkNfUExUX0VOVFJZX1dPUkQxCi0JCQkgICArICgoKC0gKGgtPnBsdF9vZmZzZXQgKyA0KSA+PiAyKQotCQkJICAgICAgICYgMHgzZmZmZmZmZikpKSwKLQkJCSAgcCArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9FTlRSWV9XT1JEMiArIHMtPnJlbG9jX2NvdW50LAotCQkJICBwICsgOCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgdmFsID0gKGgtPnJvb3Qucm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBoLT5yb290LnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkgICAgICsgaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBTUEFSQ19QTFRfUElDX1dPUkQwICsgKCh2YWwgPj4gMTApICYgMHgzZmZmZmYpLAotCQkJICBwKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLAotCQkJICBTUEFSQ19QTFRfUElDX1dPUkQxICsgKHZhbCAmIDB4M2ZmKSwKLQkJCSAgcCArIDQpOwotCSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFNQQVJDX1BMVF9QSUNfV09SRDIsIHAgKyA4KTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJmZF9hcmNoX202OGs6Ci0JICBpZiAoISBpbmZvLT5zaGFyZWQgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpICE9IDApCi0JICAgIGFib3J0ICgpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgTTY4S19QTFRfRU5UUllfV09SRDAsIHApOwotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKC0gKGgtPnBsdF9vZmZzZXQgKyAyKSksIHAgKyAyKTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIHMtPnJlbG9jX2NvdW50LCBwICsgNik7Ci0JICByX2FkZHJlc3MgKz0gMjsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgLyogV2UgYWxzbyBuZWVkIHRvIGFkZCBhIGp1bXAgdGFibGUgcmVsb2MsIHVubGVzcyB0aGlzIGlzIHRoZQotICAgICAgICAgcmVzdWx0IG9mIGEgSk1QX1RCTCByZWxvYyBmcm9tIFBJQyBjb21waWxlZCBjb2RlLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zaGFyZWQgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX1JFR1VMQVIpID09IDApCi0JewotCSAgQkZEX0FTU0VSVCAoaC0+ZHluaW5keCA+PSAwKTsKLQkgIEJGRF9BU1NFUlQgKHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikKLQkJICAgICAgPCBzLT5fcmF3X3NpemUpOwotCSAgcCA9IHMtPmNvbnRlbnRzICsgcy0+cmVsb2NfY291bnQgKiBvYmpfcmVsb2NfZW50cnlfc2l6ZSAob3V0cHV0X2JmZCk7Ci0JICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKG91dHB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQotCSAgICAgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSBwOwotCSAgICAgIFBVVF9XT1JEIChvdXRwdXRfYmZkLCByX2FkZHJlc3MsIHNyZWwtPnJfYWRkcmVzcyk7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAob3V0cHV0X2JmZCkpCi0JCXsKLQkJICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHgpOwotCQkgIHNyZWwtPnJfdHlwZVswXSA9IChSRUxPQ19TVERfQklUU19FWFRFUk5fQklHCi0JCQkJICAgICB8IFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDE2KTsKLQkJICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShoLT5keW5pbmR4ID4+IDgpOwotCQkgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaC0+ZHluaW5keDsKLQkJICBzcmVsLT5yX3R5cGVbMF0gPSAoUkVMT0NfU1REX0JJVFNfRVhURVJOX0xJVFRMRQotCQkJCSAgICAgfCBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKmVyZWw7Ci0KLQkgICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcDsKLQkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgcl9hZGRyZXNzLCBlcmVsLT5yX2FkZHJlc3MpOwotCSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCQl7Ci0JCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiAxNik7Ci0JCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaC0+ZHluaW5keCA+PiA4KTsKLQkJICBlcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWgtPmR5bmluZHg7Ci0JCSAgZXJlbC0+cl90eXBlWzBdID0KLQkJICAgIChSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCi0JCSAgICAgfCAoUkVMT0NfSk1QX1NMT1QgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gMTYpOwotCQkgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGgtPmR5bmluZHggPj4gOCk7Ci0JCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSloLT5keW5pbmR4OwotCQkgIGVyZWwtPnJfdHlwZVswXSA9Ci0JCSAgICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQotCQkgICAgIHwgKFJFTE9DX0pNUF9TTE9UIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKSk7Ci0JCX0KLQkgICAgICBQVVRfV09SRCAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIGVyZWwtPnJfYWRkZW5kKTsKLQkgICAgfQotCi0JICArK3MtPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBpcyBub3QgYSBkeW5hbWljIHN5bWJvbCwgd2UgZG9uJ3QgaGF2ZSB0byBkbyBhbnl0aGluZwotICAgICBlbHNlLiAgV2Ugb25seSBjaGVjayB0aGlzIGFmdGVyIGhhbmRsaW5nIHRoZSBQTFQgZW50cnksIGJlY2F1c2UKLSAgICAgd2UgY2FuIGhhdmUgYSBQTFQgZW50cnkgZm9yIGEgbm9uZHluYW1pYyBzeW1ib2wgd2hlbiBsaW5raW5nIFBJQwotICAgICBjb21waWxlZCBjb2RlIGZyb20gYSByZWd1bGFyIG9iamVjdC4gICovCi0gIGlmIChoLT5keW5pbmR4IDwgMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzd2l0Y2ggKGgtPnJvb3Qucm9vdC50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9uZXc6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIC8qIEF2b2lkIHZhcmlhYmxlIG5vdCBpbml0aWFsaXplZCB3YXJuaW5ncy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZpbmVkOgotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrOgotICAgICAgewotCWFzZWN0aW9uICpzZWM7Ci0JYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCi0Jc2VjID0gaC0+cm9vdC5yb290LnUuZGVmLnNlY3Rpb247Ci0Jb3V0cHV0X3NlY3Rpb24gPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotCUJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAob3V0cHV0X3NlY3Rpb24pCi0JCSAgICB8fCBvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0JaWYgKGgtPnBsdF9vZmZzZXQgIT0gMAotCSAgICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkKLQkgIHsKLQkgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotCSAgICB2YWwgPSAwOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKG91dHB1dF9zZWN0aW9uID09IG9ial90ZXh0c2VjIChvdXRwdXRfYmZkKSkKLQkgICAgICB0eXBlID0gKGgtPnJvb3Qucm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgICAgICA/IE5fVEVYVAotCQkgICAgICA6IE5fV0VBS1QpOwotCSAgICBlbHNlIGlmIChvdXRwdXRfc2VjdGlvbiA9PSBvYmpfZGF0YXNlYyAob3V0cHV0X2JmZCkpCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0RBVEEKLQkJICAgICAgOiBOX1dFQUtEKTsKLQkgICAgZWxzZSBpZiAob3V0cHV0X3NlY3Rpb24gPT0gb2JqX2Jzc3NlYyAob3V0cHV0X2JmZCkpCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0JTUwotCQkgICAgICA6IE5fV0VBS0IpOwotCSAgICBlbHNlCi0JICAgICAgdHlwZSA9IChoLT5yb290LnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgPyBOX0FCUwotCQkgICAgICA6IE5fV0VBS0EpOwotCSAgICB0eXBlIHw9IE5fRVhUOwotCSAgICB2YWwgPSAoaC0+cm9vdC5yb290LnUuZGVmLnZhbHVlCi0JCSAgICsgb3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIHNlYy0+b3V0cHV0X29mZnNldCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotICAgICAgdHlwZSA9IE5fVU5ERiB8IE5fRVhUOwotICAgICAgdmFsID0gaC0+cm9vdC5yb290LnUuYy5zaXplOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbGlua19oYXNoX3VuZGVmd2VhazoKLSAgICAgIHR5cGUgPSBOX1dFQUtVOwotICAgICAgdmFsID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdDoKLSAgICBjYXNlIGJmZF9saW5rX2hhc2hfd2FybmluZzoKLSAgICAgIC8qIEZJWE1FOiBJZ25vcmUgdGhlc2UgZm9yIG5vdy4gIFRoZSBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoCi0JIHRoZXkgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0IGFyZSBub3QgY2xlYXIgdG8gbWUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmR5bm9iaiwgIi5keW5zeW0iKTsKLSAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgb3V0c3ltID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgKikKLQkgICAgKHMtPmNvbnRlbnRzICsgaC0+ZHluaW5keCAqIEVYVEVSTkFMX05MSVNUX1NJWkUpKTsKLQotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgdHlwZSwgb3V0c3ltLT5lX3R5cGUpOwotICBiZmRfaF9wdXRfOCAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX290aGVyKTsKLQotICAvKiBGSVhNRTogVGhlIG5hdGl2ZSBsaW5rZXIgZG9lc24ndCB1c2UgMCBmb3IgZGVzYy4gIEl0IHNlZW1zIHRvIHVzZQotICAgICBvbmUgbGVzcyB0aGFuIHRoZSBkZXNjIHZhbHVlIGluIHRoZSBzaGFyZWQgbGlicmFyeSwgYWx0aG91Z2ggdGhhdAotICAgICBzZWVtcyB1bmxpa2VseS4gICovCi0gIGJmZF9oX3B1dF8xNiAob3V0cHV0X2JmZCwgMCwgb3V0c3ltLT5lX2Rlc2MpOwotCi0gIFBVVF9XT1JEIChvdXRwdXRfYmZkLCBoLT5keW5zdHJfaW5kZXgsIG91dHN5bS0+ZV9zdHJ4KTsKLSAgUFVUX1dPUkQgKG91dHB1dF9iZmQsIHZhbCwgb3V0c3ltLT5lX3ZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgZm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhbiBleHRlcm5hbCBzeW1ib2wuICBJZiB0aGlzCi0gICBpcyBhIHJlbG9jIHdoaWNoIGFyZSBhcmUgZ29pbmcgdG8gY29weSBhcyBhIGR5bmFtaWMgcmVsb2MsIHRoZW4KLSAgIGNvcHkgaXQgb3ZlciwgYW5kIHRlbGwgdGhlIGNhbGxlciB0byBub3QgYm90aGVyIHByb2Nlc3NpbmcgdGhpcwotICAgcmVsb2MuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdW5vc19jaGVja19keW5hbWljX3JlbG9jIChpbmZvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sIGhhcmcsIHJlbG9jLAotCQkJICAgY29udGVudHMsIHNraXAsIHJlbG9jYXRpb25wKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYmZkICppbnB1dF9iZmQ7Ci0gICAgIGFzZWN0aW9uICppbnB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYW91dF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIFBUUiByZWxvYzsKLSAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICAgICBib29sZWFuICpza2lwOwotICAgICBiZmRfdm1hICpyZWxvY2F0aW9ucDsKLXsKLSAgc3RydWN0IHN1bm9zX2xpbmtfaGFzaF9lbnRyeSAqaCA9IChzdHJ1Y3Qgc3Vub3NfbGlua19oYXNoX2VudHJ5ICopIGhhcmc7Ci0gIGJmZCAqZHlub2JqOwotICBib29sZWFuIGJhc2VyZWw7Ci0gIGJvb2xlYW4gam1wdGJsOwotICBib29sZWFuIHBjcmVsOwotICBhc2VjdGlvbiAqczsKLSAgYmZkX2J5dGUgKnA7Ci0gIGxvbmcgaW5keDsKLQotICAqc2tpcCA9IGZhbHNlOwotCi0gIGR5bm9iaiA9IHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5vYmo7Ci0KLSAgaWYgKGggIT0gTlVMTAotICAgICAgJiYgaC0+cGx0X29mZnNldCAhPSAwCi0gICAgICAmJiAoaW5mby0+c2hhcmVkCi0JICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNwbHQ7Ci0KLSAgICAgIC8qIFJlZGlyZWN0IHRoZSByZWxvY2F0aW9uIHRvIHRoZSBQTFQgZW50cnkuICAqLwotICAgICAgc3BsdCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIucGx0Iik7Ci0gICAgICAqcmVsb2NhdGlvbnAgPSAoc3BsdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICArIHNwbHQtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBoLT5wbHRfb2Zmc2V0KTsKLSAgICB9Ci0KLSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotICAgIHsKLSAgICAgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0KLSAgICAgIHNyZWwgPSAoc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqKSByZWxvYzsKLSAgICAgIGlmIChiZmRfaGVhZGVyX2JpZ19lbmRpYW4gKGlucHV0X2JmZCkpCi0JewotCSAgYmFzZXJlbCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRykpOwotCSAgam1wdGJsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRykpOwotCSAgcGNyZWwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfUENSRUxfQklHKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJhc2VyZWwgPSAoMCAhPSAoc3JlbC0+cl90eXBlWzBdICYgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpKTsKLQkgIGptcHRibCA9ICgwICE9IChzcmVsLT5yX3R5cGVbMF0gJiBSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUpKTsKLQkgIHBjcmVsID0gKDAgIT0gKHNyZWwtPnJfdHlwZVswXSAmIFJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRSkpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotICAgICAgaW50IHJfdHlwZTsKLQotICAgICAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHJlbG9jOwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQlyX3R5cGUgPSAoKGVyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfQklHKQotCQkgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHKTsKLSAgICAgIGVsc2UKLQlyX3R5cGUgPSAoKGVyZWwtPnJfdHlwZVswXSAmIFJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFKQotCQkgID4+IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFKTsKLSAgICAgIGJhc2VyZWwgPSAocl90eXBlID09IFJFTE9DX0JBU0UxMAotCQkgfHwgcl90eXBlID09IFJFTE9DX0JBU0UxMwotCQkgfHwgcl90eXBlID09IFJFTE9DX0JBU0UyMik7Ci0gICAgICBqbXB0YmwgPSByX3R5cGUgPT0gUkVMT0NfSk1QX1RCTDsKLSAgICAgIHBjcmVsID0gKHJfdHlwZSA9PSBSRUxPQ19ESVNQOAotCSAgICAgICB8fCByX3R5cGUgPT0gUkVMT0NfRElTUDE2Ci0JICAgICAgIHx8IHJfdHlwZSA9PSBSRUxPQ19ESVNQMzIKLQkgICAgICAgfHwgcl90eXBlID09IFJFTE9DX1dESVNQMzAKLQkgICAgICAgfHwgcl90eXBlID09IFJFTE9DX1dESVNQMjIpOwotICAgICAgLyogV2UgZG9uJ3QgY29uc2lkZXIgdGhlIFBDMTAgYW5kIFBDMjIgdHlwZXMgdG8gYmUgUEMgcmVsYXRpdmUsCi0gICAgICAgICBiZWNhdXNlIHRoZXkgYXJlIHBjcmVsX29mZnNldC4gICovCi0gICAgfQotCi0gIGlmIChiYXNlcmVsKQotICAgIHsKLSAgICAgIGJmZF92bWEgKmdvdF9vZmZzZXRwOwotICAgICAgYXNlY3Rpb24gKnNnb3Q7Ci0KLSAgICAgIGlmIChoICE9IE5VTEwpCi0JZ290X29mZnNldHAgPSAmaC0+Z290X29mZnNldDsKLSAgICAgIGVsc2UgaWYgKGFkYXRhIChpbnB1dF9iZmQpLmxvY2FsX2dvdF9vZmZzZXRzID09IE5VTEwpCi0JZ290X29mZnNldHAgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCByZWxvY19zdGRfZXh0ZXJuYWwgKnNyZWw7Ci0JICBpbnQgcl9pbmRleDsKLQotCSAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHJlbG9jOwotCSAgaWYgKG9ial9yZWxvY19lbnRyeV9zaXplIChpbnB1dF9iZmQpID09IFJFTE9DX1NURF9TSVpFKQotCSAgICB7Ci0JICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoaW5wdXRfYmZkKSkKLQkJcl9pbmRleCA9ICgoc3JlbC0+cl9pbmRleFswXSA8PCAxNikKLQkJCSAgIHwgKHNyZWwtPnJfaW5kZXhbMV0gPDwgOCkKLQkJCSAgIHwgc3JlbC0+cl9pbmRleFsyXSk7Ci0JICAgICAgZWxzZQotCQlyX2luZGV4ID0gKChzcmVsLT5yX2luZGV4WzJdIDw8IDE2KQotCQkJICAgfCAoc3JlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICAgfCBzcmVsLT5yX2luZGV4WzBdKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqZXJlbDsKLQotCSAgICAgIGVyZWwgPSAoc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCAqKSByZWxvYzsKLQkgICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChpbnB1dF9iZmQpKQotCQlyX2luZGV4ID0gKChlcmVsLT5yX2luZGV4WzBdIDw8IDE2KQotCQkJICAgfCAoZXJlbC0+cl9pbmRleFsxXSA8PCA4KQotCQkJICAgfCBlcmVsLT5yX2luZGV4WzJdKTsKLQkgICAgICBlbHNlCi0JCXJfaW5kZXggPSAoKGVyZWwtPnJfaW5kZXhbMl0gPDwgMTYpCi0JCQkgICB8IChlcmVsLT5yX2luZGV4WzFdIDw8IDgpCi0JCQkgICB8IGVyZWwtPnJfaW5kZXhbMF0pOwotCSAgICB9Ci0KLQkgIGdvdF9vZmZzZXRwID0gYWRhdGEgKGlucHV0X2JmZCkubG9jYWxfZ290X29mZnNldHMgKyByX2luZGV4OwotCX0KLQotICAgICAgQkZEX0FTU0VSVCAoZ290X29mZnNldHAgIT0gTlVMTCAmJiAqZ290X29mZnNldHAgIT0gMCk7Ci0KLSAgICAgIHNnb3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotCi0gICAgICAvKiBXZSBzZXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byBpbmRpY2F0ZSB3aGV0aGVyIHdlIGhhdmUKLQkgYWxyZWFkeSBpbml0aWFsaXplZCB0aGUgR09UIGVudHJ5LiAgKi8KLSAgICAgIGlmICgoKmdvdF9vZmZzZXRwICYgMSkgPT0gMCkKLQl7Ci0JICBpZiAoaCA9PSBOVUxMCi0JICAgICAgfHwgKCEgaW5mby0+c2hhcmVkCi0JCSAgJiYgKChoLT5mbGFncyAmIFNVTk9TX0RFRl9EWU5BTUlDKSA9PSAwCi0JCSAgICAgIHx8IChoLT5mbGFncyAmIFNVTk9TX0RFRl9SRUdVTEFSKSAhPSAwKSkpCi0JICAgIFBVVF9XT1JEIChkeW5vYmosICpyZWxvY2F0aW9ucCwgc2dvdC0+Y29udGVudHMgKyAqZ290X29mZnNldHApOwotCSAgZWxzZQotCSAgICBQVVRfV09SRCAoZHlub2JqLCAwLCBzZ290LT5jb250ZW50cyArICpnb3Rfb2Zmc2V0cCk7Ci0KLQkgIGlmIChpbmZvLT5zaGFyZWQKLQkgICAgICB8fCAoaCAhPSBOVUxMCi0JCSAgJiYgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpICE9IDAKLQkJICAmJiAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgPT0gMCkpCi0JICAgIHsKLQkgICAgICAvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIEdMT0JfREFUIG9yIDMyIHJlbG9jIHRvIHRlbGwgdGhlCi0gICAgICAgICAgICAgICAgIGR5bmFtaWMgbGlua2VyIHRvIGZpbGwgaW4gdGhpcyBlbnRyeSBpbiB0aGUgdGFibGUuICAqLwotCi0JICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0JICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLQkgICAgICBCRkRfQVNTRVJUIChzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopCi0JCQkgIDwgcy0+X3Jhd19zaXplKTsKLQotCSAgICAgIHAgPSAocy0+Y29udGVudHMKLQkJICAgKyBzLT5yZWxvY19jb3VudCAqIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopKTsKLQotCSAgICAgIGlmIChoICE9IE5VTEwpCi0JCWluZHggPSBoLT5keW5pbmR4OwotCSAgICAgIGVsc2UKLQkJaW5keCA9IDA7Ci0KLQkgICAgICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikgPT0gUkVMT0NfU1REX1NJWkUpCi0JCXsKLQkJICBzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICpzcmVsOwotCi0JCSAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHA7Ci0JCSAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJCSAgICAoKmdvdF9vZmZzZXRwCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQpLAotCQkJICAgIHNyZWwtPnJfYWRkcmVzcyk7Ci0JCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKLQkJICAgIHsKLQkJICAgICAgc3JlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaW5keDsKLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCXNyZWwtPnJfdHlwZVswXSA9IDIgPDwgUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRzsKLQkJICAgICAgZWxzZQotCQkJc3JlbC0+cl90eXBlWzBdID0KLQkJCSAgKFJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcKLQkJCSAgIHwgUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcKLQkJCSAgIHwgUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCi0JCQkgICB8ICgyIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCQkgICAgICBzcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCQkgICAgICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWluZHg7Ci0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzcmVsLT5yX3R5cGVbMF0gPSAyIDw8IFJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEU7Ci0JCSAgICAgIGVsc2UKLQkJCXNyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIChSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCi0JCQkgICB8IFJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCi0JCQkgICB8IFJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQotCQkJICAgfCAoMiA8PCBSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfTElUVExFKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotCi0JCSAgZXJlbCA9IChzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICopIHA7Ci0JCSAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJCSAgICAoKmdvdF9vZmZzZXRwCi0JCQkgICAgICsgc2dvdC0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgICArIHNnb3QtPm91dHB1dF9vZmZzZXQpLAotCQkJICAgIGVyZWwtPnJfYWRkcmVzcyk7Ci0JCSAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKLQkJICAgIHsKLQkJICAgICAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaW5keDsKLQkJICAgICAgaWYgKGggPT0gTlVMTCkKLQkJCWVyZWwtPnJfdHlwZVswXSA9Ci0JCQkgIFJFTE9DXzMyIDw8IFJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfQklHOwotCQkgICAgICBlbHNlCi0JCQllcmVsLT5yX3R5cGVbMF0gPQotCQkJICAoUkVMT0NfRVhUX0JJVFNfRVhURVJOX0JJRwotCQkJICAgfCAoUkVMT0NfR0xPQl9EQVQgPDwgUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCQkgICAgICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCQkgICAgICBlcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKWluZHg7Ci0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQllcmVsLT5yX3R5cGVbMF0gPQotCQkJICBSRUxPQ18zMiA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRTsKLQkJICAgICAgZWxzZQotCQkJZXJlbC0+cl90eXBlWzBdID0KLQkJCSAgKFJFTE9DX0VYVF9CSVRTX0VYVEVSTl9MSVRUTEUKLQkJCSAgIHwgKFJFTE9DX0dMT0JfREFUCi0JCQkgICAgICA8PCBSRUxPQ19FWFRfQklUU19UWVBFX1NIX0xJVFRMRSkpOwotCQkgICAgfQotCQkgIFBVVF9XT1JEIChkeW5vYmosIDAsIGVyZWwtPnJfYWRkZW5kKTsKLQkJfQotCi0JICAgICAgKytzLT5yZWxvY19jb3VudDsKLQkgICAgfQotCi0JICAqZ290X29mZnNldHAgfD0gMTsKLQl9Ci0KLSAgICAgICpyZWxvY2F0aW9ucCA9IChzZ290LT52bWEKLQkJICAgICAgKyAoKmdvdF9vZmZzZXRwICZ+IDEpCi0JCSAgICAgIC0gc3Vub3NfaGFzaF90YWJsZSAoaW5mbyktPmdvdF9iYXNlKTsKLQotICAgICAgLyogVGhlcmUgaXMgbm90aGluZyBlbHNlIHRvIGRvIGZvciBhIGJhc2UgcmVsYXRpdmUgcmVsb2MuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKCEgaW5mby0+c2hhcmVkKQotICAgIHsKLSAgICAgIGlmIChoID09IE5VTEwKLQkgIHx8IGgtPmR5bmluZHggPT0gLTEKLQkgIHx8IGgtPnJvb3Qucm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCAoaC0+ZmxhZ3MgJiBTVU5PU19ERUZfUkVHVUxBUikgIT0gMAotCSAgfHwgKGgtPmZsYWdzICYgU1VOT1NfREVGX0RZTkFNSUMpID09IDAKLQkgIHx8IChoLT5yb290LnJvb3QudS51bmRlZi5hYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGggIT0gTlVMTAotCSAgJiYgKGgtPmR5bmluZHggPT0gLTEKLQkgICAgICB8fCBqbXB0YmwKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5yb290LnN0cmluZywKLQkJCSAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIpID09IDApKQotCXJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBJdCBsb29rcyBsaWtlIHRoaXMgaXMgYSByZWxvYyB3ZSBhcmUgc3VwcG9zZWQgdG8gY29weS4gICovCi0KLSAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHlucmVsIik7Ci0gIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gIEJGRF9BU1NFUlQgKHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikgPCBzLT5fcmF3X3NpemUpOwotCi0gIHAgPSBzLT5jb250ZW50cyArIHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaik7Ci0KLSAgLyogQ29weSB0aGUgcmVsb2Mgb3Zlci4gICovCi0gIG1lbWNweSAocCwgcmVsb2MsIG9ial9yZWxvY19lbnRyeV9zaXplIChkeW5vYmopKTsKLQotICBpZiAoaCAhPSBOVUxMKQotICAgIGluZHggPSBoLT5keW5pbmR4OwotICBlbHNlCi0gICAgaW5keCA9IDA7Ci0KLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGFuZCBzeW1ib2wgaW5kZXguICAqLwotICBpZiAob2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikgPT0gUkVMT0NfU1REX1NJWkUpCi0gICAgewotICAgICAgc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCAqc3JlbDsKLQotICAgICAgc3JlbCA9IChzdHJ1Y3QgcmVsb2Nfc3RkX2V4dGVybmFsICopIHA7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLAotCQkoR0VUX1dPUkQgKGR5bm9iaiwgc3JlbC0+cl9hZGRyZXNzKQotCQkgKyBpbnB1dF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9vZmZzZXQpLAotCQlzcmVsLT5yX2FkZHJlc3MpOwotICAgICAgaWYgKGJmZF9oZWFkZXJfYmlnX2VuZGlhbiAoZHlub2JqKSkKLQl7Ci0JICBzcmVsLT5yX2luZGV4WzBdID0gKGJmZF9ieXRlKShpbmR4ID4+IDE2KTsKLQkgIHNyZWwtPnJfaW5kZXhbMV0gPSAoYmZkX2J5dGUpKGluZHggPj4gOCk7Ci0JICBzcmVsLT5yX2luZGV4WzJdID0gKGJmZF9ieXRlKWluZHg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCSAgc3JlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkgIHNyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpaW5keDsKLQl9Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZSBhZGRlbmQgZm9yIGEgUEMgcmVsYXRpdmUKLSAgICAgICAgIHJlbG9jLiAgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsICplcmVsOwotCi0gICAgICBlcmVsID0gKHN0cnVjdCByZWxvY19leHRfZXh0ZXJuYWwgKikgcDsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCShHRVRfV09SRCAoZHlub2JqLCBlcmVsLT5yX2FkZHJlc3MpCi0JCSArIGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCWVyZWwtPnJfYWRkcmVzcyk7Ci0gICAgICBpZiAoYmZkX2hlYWRlcl9iaWdfZW5kaWFuIChkeW5vYmopKQotCXsKLQkgIGVyZWwtPnJfaW5kZXhbMF0gPSAoYmZkX2J5dGUpKGluZHggPj4gMTYpOwotCSAgZXJlbC0+cl9pbmRleFsxXSA9IChiZmRfYnl0ZSkoaW5keCA+PiA4KTsKLQkgIGVyZWwtPnJfaW5kZXhbMl0gPSAoYmZkX2J5dGUpaW5keDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXJlbC0+cl9pbmRleFsyXSA9IChiZmRfYnl0ZSkoaW5keCA+PiAxNik7Ci0JICBlcmVsLT5yX2luZGV4WzFdID0gKGJmZF9ieXRlKShpbmR4ID4+IDgpOwotCSAgZXJlbC0+cl9pbmRleFswXSA9IChiZmRfYnl0ZSlpbmR4OwotCX0KLSAgICAgIGlmIChwY3JlbCAmJiBoICE9IE5VTEwpCi0JewotCSAgLyogQWRqdXN0IHRoZSBhZGRlbmQgZm9yIHRoZSBjaGFuZ2UgaW4gYWRkcmVzcy4gICovCi0JICBQVVRfV09SRCAoZHlub2JqLAotCQkgICAgKEdFVF9XT1JEIChkeW5vYmosIGVyZWwtPnJfYWRkZW5kKQotCQkgICAgIC0gKGlucHV0X3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSsgaW5wdXRfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQkJLSBpbnB1dF9zZWN0aW9uLT52bWEpKSwKLQkJICAgIGVyZWwtPnJfYWRkZW5kKTsKLQl9Ci0gICAgfQotCi0gICsrcy0+cmVsb2NfY291bnQ7Ci0KLSAgaWYgKGggIT0gTlVMTCkKLSAgICAqc2tpcCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCB0aGUgZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1bm9zX2ZpbmlzaF9keW5hbWljX2xpbmsgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGJmZCAqZHlub2JqOwotICBhc2VjdGlvbiAqbzsKLSAgYXNlY3Rpb24gKnM7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIGlmICghIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5keW5hbWljX3NlY3Rpb25zX25lZWRlZAotICAgICAgJiYgISBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+Z290X25lZWRlZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkeW5vYmogPSBzdW5vc19oYXNoX3RhYmxlIChpbmZvKS0+ZHlub2JqOwotCi0gIHNkeW4gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bmFtaWMiKTsKLSAgQkZEX0FTU0VSVCAoc2R5biAhPSBOVUxMKTsKLQotICAvKiBGaW5pc2ggdXAgdGhlIC5uZWVkIHNlY3Rpb24uICBUaGUgbGlua2VyIGVtdWxhdGlvbiBjb2RlIGZpbGxlZCBpdAotICAgICBpbiwgYnV0IHdpdGggb2Zmc2V0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiBpbnN0ZWFkIG9mCi0gICAgIHJlYWwgYWRkcmVzc2VzLiAgTm93IHRoYXQgd2Uga25vdyB0aGUgc2VjdGlvbiBsb2NhdGlvbiwgd2UgY2FuCi0gICAgIGZpbGwgaW4gdGhlIGZpbmFsIHZhbHVlcy4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLm5lZWQiKTsKLSAgaWYgKHMgIT0gTlVMTCAmJiBzLT5fcmF3X3NpemUgIT0gMCkKLSAgICB7Ci0gICAgICBmaWxlX3B0ciBmaWxlcG9zOwotICAgICAgYmZkX2J5dGUgKnA7Ci0KLSAgICAgIGZpbGVwb3MgPSBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQ7Ci0gICAgICBwID0gcy0+Y29udGVudHM7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgUFVUX1dPUkQgKGR5bm9iaiwgR0VUX1dPUkQgKGR5bm9iaiwgcCkgKyBmaWxlcG9zLCBwKTsKLQkgIHZhbCA9IEdFVF9XT1JEIChkeW5vYmosIHAgKyAxMik7Ci0JICBpZiAodmFsID09IDApCi0JICAgIGJyZWFrOwotCSAgUFVUX1dPUkQgKGR5bm9iaiwgdmFsICsgZmlsZXBvcywgcCArIDEyKTsKLQkgIHAgKz0gMTY7Ci0JfQotICAgIH0KLQotICAvKiBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIC5nb3Qgc2VjdGlvbiBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgICAgZHluYW1pYyBpbmZvcm1hdGlvbiwgdW5sZXNzIHRoaXMgaXMgYSBzaGFyZWQgbGlicmFyeS4gICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmdvdCIpOwotICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICBpZiAoaW5mby0+c2hhcmVkIHx8IHNkeW4tPl9yYXdfc2l6ZSA9PSAwKQotICAgIFBVVF9XT1JEIChkeW5vYmosIDAsIHMtPmNvbnRlbnRzKTsKLSAgZWxzZQotICAgIFBVVF9XT1JEIChkeW5vYmosIHNkeW4tPm91dHB1dF9zZWN0aW9uLT52bWEgKyBzZHluLT5vdXRwdXRfb2Zmc2V0LAotCSAgICAgIHMtPmNvbnRlbnRzKTsKLQotICBmb3IgKG8gPSBkeW5vYmotPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwCi0JICAmJiBvLT5jb250ZW50cyAhPSBOVUxMKQotCXsKLQkgIEJGRF9BU1NFUlQgKG8tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLQkJICAgICAgJiYgby0+b3V0cHV0X3NlY3Rpb24tPm93bmVyID09IGFiZmQpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICBvLT5jb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkJICBvLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAoc2R5bi0+X3Jhd19zaXplID4gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljIGVzZDsKLSAgICAgIHN0cnVjdCBleHRlcm5hbF9zdW40X2R5bmFtaWNfbGluayBlc2RsOwotCi0gICAgICAvKiBGaW5pc2ggdXAgdGhlIGR5bmFtaWMgbGluayBpbmZvcm1hdGlvbi4gICovCi0gICAgICBQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMywgZXNkLmxkX3ZlcnNpb24pOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwKLQkJc2R5bi0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHNkeW4tPm91dHB1dF9vZmZzZXQgKyBzaXplb2YgZXNkLAotCQllc2QubGRkKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCShzZHluLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSArIHNkeW4tPm91dHB1dF9vZmZzZXQKLQkJICsgc2l6ZW9mIGVzZAotCQkgKyBFWFRFUk5BTF9TVU40X0RZTkFNSUNfREVCVUdHRVJfU0laRSksCi0JCWVzZC5sZCk7Ci0KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2R5bi0+b3V0cHV0X3NlY3Rpb24sICZlc2QsCi0JCQkJICAgICAgc2R5bi0+b3V0cHV0X29mZnNldCwgc2l6ZW9mIGVzZCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMCwgZXNkbC5sZF9sb2FkZWQpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5uZWVkIik7Ci0gICAgICBpZiAocyA9PSBOVUxMIHx8IHMtPl9yYXdfc2l6ZSA9PSAwKQotCVBVVF9XT1JEIChkeW5vYmosIChiZmRfdm1hKSAwLCBlc2RsLmxkX25lZWQpOwotICAgICAgZWxzZQotCVBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJICBlc2RsLmxkX25lZWQpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5ydWxlcyIpOwotICAgICAgaWYgKHMgPT0gTlVMTCB8fCBzLT5fcmF3X3NpemUgPT0gMCkKLQlQVVRfV09SRCAoZHlub2JqLCAoYmZkX3ZtYSkgMCwgZXNkbC5sZF9ydWxlcyk7Ci0gICAgICBlbHNlCi0JUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQkgIGVzZGwubGRfcnVsZXMpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5nb3QiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9nb3QpOwotCi0gICAgICBzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGR5bm9iaiwgIi5wbHQiKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9wbHQpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+X3Jhd19zaXplLCBlc2RsLmxkX3BsdF9zeik7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnJlbCIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMtPnJlbG9jX2NvdW50ICogb2JqX3JlbG9jX2VudHJ5X3NpemUgKGR5bm9iaikKLQkJICA9PSBzLT5fcmF3X3NpemUpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX3JlbCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmhhc2giKTsKLSAgICAgIEJGRF9BU1NFUlQgKHMgIT0gTlVMTCk7Ci0gICAgICBQVVRfV09SRCAoZHlub2JqLCBzLT5vdXRwdXRfc2VjdGlvbi0+ZmlsZXBvcyArIHMtPm91dHB1dF9vZmZzZXQsCi0JCWVzZGwubGRfaGFzaCk7Ci0KLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoZHlub2JqLCAiLmR5bnN5bSIpOwotICAgICAgQkZEX0FTU0VSVCAocyAhPSBOVUxMKTsKLSAgICAgIFBVVF9XT1JEIChkeW5vYmosIHMtPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgcy0+b3V0cHV0X29mZnNldCwKLQkJZXNkbC5sZF9zdGFiKTsKLQotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIDAsIGVzZGwubGRfc3RhYl9oYXNoKTsKLQotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgKGJmZF92bWEpIHN1bm9zX2hhc2hfdGFibGUgKGluZm8pLT5idWNrZXRjb3VudCwKLQkJZXNkbC5sZF9idWNrZXRzKTsKLQotICAgICAgcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChkeW5vYmosICIuZHluc3RyIik7Ci0gICAgICBCRkRfQVNTRVJUIChzICE9IE5VTEwpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+b3V0cHV0X3NlY3Rpb24tPmZpbGVwb3MgKyBzLT5vdXRwdXRfb2Zmc2V0LAotCQllc2RsLmxkX3N5bWJvbHMpOwotICAgICAgUFVUX1dPUkQgKGR5bm9iaiwgcy0+X3Jhd19zaXplLCBlc2RsLmxkX3N5bWJfc2l6ZSk7Ci0KLSAgICAgIC8qIFRoZSBzaXplIG9mIHRoZSB0ZXh0IGFyZWEgaXMgdGhlIHNpemUgb2YgdGhlIC50ZXh0IHNlY3Rpb24KLQkgcm91bmRlZCB1cCB0byBhIHBhZ2UgYm91bmRhcnkuICBGSVhNRTogU2hvdWxkIHRoZSBwYWdlIHNpemUgYmUKLQkgY29uZGl0aW9uYWwgb24gc29tZXRoaW5nPyAgKi8KLSAgICAgIFBVVF9XT1JEIChkeW5vYmosCi0JCUJGRF9BTElHTiAob2JqX3RleHRzZWMgKGFiZmQpLT5fcmF3X3NpemUsIDB4MjAwMCksCi0JCWVzZGwubGRfdGV4dCk7Ci0gIAotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZHluLT5vdXRwdXRfc2VjdGlvbiwgJmVzZGwsCi0JCQkJICAgICAgKHNkeW4tPm91dHB1dF9vZmZzZXQKLQkJCQkgICAgICAgKyBzaXplb2YgZXNkCi0JCQkJICAgICAgICsgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUpLAotCQkJCSAgICAgIHNpemVvZiBlc2RsKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGFiZmQtPmZsYWdzIHw9IERZTkFNSUM7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N5bXMuYyBiL2JmZC9zeW1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OWQxZjIuLjAwMDAwMDAKLS0tIGEvYmZkL3N5bXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTMgKzAsMCBAQAotLyogR2VuZXJpYyBzeW1ib2wtdGFibGUgc3VwcG9ydCBmb3IgdGhlIEJGRCBsaWJyYXJ5LgotICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1TRUNUSU9OCi0JU3ltYm9scwotCi0JQkZEIHRyaWVzIHRvIG1haW50YWluIGFzIG11Y2ggc3ltYm9sIGluZm9ybWF0aW9uIGFzIGl0IGNhbiB3aGVuCi0JaXQgbW92ZXMgaW5mb3JtYXRpb24gZnJvbSBmaWxlIHRvIGZpbGUuIEJGRCBwYXNzZXMgaW5mb3JtYXRpb24KLQl0byBhcHBsaWNhdGlvbnMgdGhvdWdoIHRoZSA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUuIFdoZW4gdGhlCi0JYXBwbGljYXRpb24gcmVxdWVzdHMgdGhlIHN5bWJvbCB0YWJsZSwgQkZEIHJlYWRzIHRoZSB0YWJsZSBpbgotCXRoZSBuYXRpdmUgZm9ybSBhbmQgdHJhbnNsYXRlcyBwYXJ0cyBvZiBpdCBpbnRvIHRoZSBpbnRlcm5hbAotCWZvcm1hdC4gVG8gbWFpbnRhaW4gbW9yZSB0aGFuIHRoZSBpbmZvcm1hdGlvbiBwYXNzZWQgdG8KLQlhcHBsaWNhdGlvbnMsIHNvbWUgdGFyZ2V0cyBrZWVwIHNvbWUgaW5mb3JtYXRpb24gYGBiZWhpbmQgdGhlCi0Jc2NlbmVzJycgaW4gYSBzdHJ1Y3R1cmUgb25seSB0aGUgcGFydGljdWxhciBiYWNrIGVuZCBrbm93cwotCWFib3V0LiBGb3IgZXhhbXBsZSwgdGhlIGNvZmYgYmFjayBlbmQga2VlcHMgdGhlIG9yaWdpbmFsCi0Jc3ltYm9sIHRhYmxlIHN0cnVjdHVyZSBhcyB3ZWxsIGFzIHRoZSBjYW5vbmljYWwgc3RydWN0dXJlIHdoZW4KLQlhIEJGRCBpcyByZWFkIGluLiBPbiBvdXRwdXQsIHRoZSBjb2ZmIGJhY2sgZW5kIGNhbiByZWNvbnN0cnVjdAotCXRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlIHNvIHRoYXQgbm8gaW5mb3JtYXRpb24gaXMgbG9zdCwgZXZlbgotCWluZm9ybWF0aW9uIHVuaXF1ZSB0byBjb2ZmIHdoaWNoIEJGRCBkb2Vzbid0IGtub3cgb3IKLQl1bmRlcnN0YW5kLiBJZiBhIGNvZmYgc3ltYm9sIHRhYmxlIHdlcmUgcmVhZCwgYnV0IHdlcmUgd3JpdHRlbgotCXRocm91Z2ggYW4gYS5vdXQgYmFjayBlbmQsIGFsbCB0aGUgY29mZiBzcGVjaWZpYyBpbmZvcm1hdGlvbgotCXdvdWxkIGJlIGxvc3QuIFRoZSBzeW1ib2wgdGFibGUgb2YgYSBCRkQKLQlpcyBub3QgbmVjZXNzYXJpbHkgcmVhZCBpbiB1bnRpbCBhIGNhbm9uaWNhbGl6ZSByZXF1ZXN0IGlzCi0JbWFkZS4gVGhlbiB0aGUgQkZEIGJhY2sgZW5kIGZpbGxzIGluIGEgdGFibGUgcHJvdmlkZWQgYnkgdGhlCi0JYXBwbGljYXRpb24gd2l0aCBwb2ludGVycyB0byB0aGUgY2Fub25pY2FsIGluZm9ybWF0aW9uLiAgVG8KLQlvdXRwdXQgc3ltYm9scywgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIEJGRCB3aXRoIGEgdGFibGUgb2YKLQlwb2ludGVycyB0byBwb2ludGVycyB0byA8PGFzeW1ib2w+PnMuIFRoaXMgYWxsb3dzIGFwcGxpY2F0aW9ucwotCWxpa2UgdGhlIGxpbmtlciB0byBvdXRwdXQgYSBzeW1ib2wgYXMgaXQgd2FzIHJlYWQsIHNpbmNlIHRoZSBgYGJlaGluZAotCXRoZSBzY2VuZXMnJyBpbmZvcm1hdGlvbiB3aWxsIGJlIHN0aWxsIGF2YWlsYWJsZS4KLUBtZW51Ci1AKiBSZWFkaW5nIFN5bWJvbHM6OgotQCogV3JpdGluZyBTeW1ib2xzOjoKLUAqIE1pbmkgU3ltYm9sczo6Ci1AKiB0eXBlZGVmIGFzeW1ib2w6OgotQCogc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9uczo6Ci1AZW5kIG1lbnUKLQotSU5PREUKLVJlYWRpbmcgU3ltYm9scywgV3JpdGluZyBTeW1ib2xzLCBTeW1ib2xzLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JUmVhZGluZyBzeW1ib2xzCi0KLQlUaGVyZSBhcmUgdHdvIHN0YWdlcyB0byByZWFkaW5nIGEgc3ltYm9sIHRhYmxlIGZyb20gYSBCRkQ6Ci0JYWxsb2NhdGluZyBzdG9yYWdlLCBhbmQgdGhlIGFjdHVhbCByZWFkaW5nIHByb2Nlc3MuIFRoaXMgaXMgYW4KLQlleGNlcnB0IGZyb20gYW4gYXBwbGljYXRpb24gd2hpY2ggcmVhZHMgdGhlIHN5bWJvbCB0YWJsZToKLQotfAkgIGxvbmcgc3RvcmFnZV9uZWVkZWQ7Ci18CSAgYXN5bWJvbCAqKnN5bWJvbF90YWJsZTsKLXwJICBsb25nIG51bWJlcl9vZl9zeW1ib2xzOwotfAkgIGxvbmcgaTsKLXwKLXwJICBzdG9yYWdlX25lZWRlZCA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLXwKLXwgICAgICAgICBpZiAoc3RvcmFnZV9uZWVkZWQgPCAwKQotfCAgICAgICAgICAgRkFJTAotfAotfAkgIGlmIChzdG9yYWdlX25lZWRlZCA9PSAwKSB7Ci18CSAgICAgcmV0dXJuIDsKLXwJICB9Ci18CSAgc3ltYm9sX3RhYmxlID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN0b3JhZ2VfbmVlZGVkKTsKLXwJICAgIC4uLgotfAkgIG51bWJlcl9vZl9zeW1ib2xzID0KLXwJICAgICBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltYm9sX3RhYmxlKTsKLXwKLXwgICAgICAgICBpZiAobnVtYmVyX29mX3N5bWJvbHMgPCAwKQotfCAgICAgICAgICAgRkFJTAotfAotfAkgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2Zfc3ltYm9sczsgaSsrKSB7Ci18CSAgICAgcHJvY2Vzc19zeW1ib2wgKHN5bWJvbF90YWJsZVtpXSk7Ci18CSAgfQotCi0JQWxsIHN0b3JhZ2UgZm9yIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaXMgaW4gYW4gb2JqYWxsb2MKLQljb25uZWN0ZWQgdG8gdGhlIEJGRDsgaXQgaXMgZnJlZWQgd2hlbiB0aGUgQkZEIGlzIGNsb3NlZC4KLQotCi1JTk9ERQotV3JpdGluZyBTeW1ib2xzLCBNaW5pIFN5bWJvbHMsIFJlYWRpbmcgU3ltYm9scywgU3ltYm9scwotU1VCU0VDVElPTgotCVdyaXRpbmcgc3ltYm9scwotCi0JV3JpdGluZyBvZiBhIHN5bWJvbCB0YWJsZSBpcyBhdXRvbWF0aWMgd2hlbiBhIEJGRCBvcGVuIGZvcgotCXdyaXRpbmcgaXMgY2xvc2VkLiBUaGUgYXBwbGljYXRpb24gYXR0YWNoZXMgYSB2ZWN0b3Igb2YKLQlwb2ludGVycyB0byBwb2ludGVycyB0byBzeW1ib2xzIHRvIHRoZSBCRkQgYmVpbmcgd3JpdHRlbiwgYW5kCi0JZmlsbHMgaW4gdGhlIHN5bWJvbCBjb3VudC4gVGhlIGNsb3NlIGFuZCBjbGVhbnVwIGNvZGUgcmVhZHMKLQl0aHJvdWdoIHRoZSB0YWJsZSBwcm92aWRlZCBhbmQgcGVyZm9ybXMgYWxsIHRoZSBuZWNlc3NhcnkKLQlvcGVyYXRpb25zLiBUaGUgQkZEIG91dHB1dCBjb2RlIG11c3QgYWx3YXlzIGJlIHByb3ZpZGVkIHdpdGggYW4KLQlgYG93bmVkJycgc3ltYm9sOiBvbmUgd2hpY2ggaGFzIGNvbWUgZnJvbSBhbm90aGVyIEJGRCwgb3Igb25lCi0Jd2hpY2ggaGFzIGJlZW4gY3JlYXRlZCB1c2luZyA8PGJmZF9tYWtlX2VtcHR5X3N5bWJvbD4+LiAgSGVyZSBpcyBhbgotCWV4YW1wbGUgc2hvd2luZyB0aGUgY3JlYXRpb24gb2YgYSBzeW1ib2wgdGFibGUgd2l0aCBvbmx5IG9uZSBlbGVtZW50OgotCi18CSNpbmNsdWRlICJiZmQuaCIKLXwJbWFpbigpCi18CXsKLXwJICBiZmQgKmFiZmQ7Ci18CSAgYXN5bWJvbCAqcHRyc1syXTsKLXwJICBhc3ltYm9sICpuZXc7Ci18Ci18CSAgYWJmZCA9IGJmZF9vcGVudygiZm9vIiwiYS5vdXQtc3Vub3MtYmlnIik7Ci18CSAgYmZkX3NldF9mb3JtYXQoYWJmZCwgYmZkX29iamVjdCk7Ci18CSAgbmV3ID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotfAkgIG5ldy0+bmFtZSA9ICJkdW1teV9zeW1ib2wiOwotfAkgIG5ldy0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheShhYmZkLCAiLnRleHQiKTsKLXwJICBuZXctPmZsYWdzID0gQlNGX0dMT0JBTDsKLXwJICBuZXctPnZhbHVlID0gMHgxMjM0NTsKLXwKLXwJICBwdHJzWzBdID0gbmV3OwotfAkgIHB0cnNbMV0gPSAoYXN5bWJvbCAqKTA7Ci18Ci18CSAgYmZkX3NldF9zeW10YWIoYWJmZCwgcHRycywgMSk7Ci18CSAgYmZkX2Nsb3NlKGFiZmQpOwotfAl9Ci18Ci18CS4vbWFrZXN5bQotfAlubSBmb28KLXwJMDAwMTIzNDUgQSBkdW1teV9zeW1ib2wKLQotCU1hbnkgZm9ybWF0cyBjYW5ub3QgcmVwcmVzZW50IGFyYml0YXJ5IHN5bWJvbCBpbmZvcm1hdGlvbjsgZm9yCi0gCWluc3RhbmNlLCB0aGUgPDxhLm91dD4+IG9iamVjdCBmb3JtYXQgZG9lcyBub3QgYWxsb3cgYW4KLQlhcmJpdGFyeSBudW1iZXIgb2Ygc2VjdGlvbnMuIEEgc3ltYm9sIHBvaW50aW5nIHRvIGEgc2VjdGlvbgotCXdoaWNoIGlzIG5vdCBvbmUgIG9mIDw8LnRleHQ+PiwgPDwuZGF0YT4+IG9yIDw8LmJzcz4+IGNhbm5vdAotCWJlIGRlc2NyaWJlZC4KLQotSU5PREUKLU1pbmkgU3ltYm9scywgdHlwZWRlZiBhc3ltYm9sLCBXcml0aW5nIFN5bWJvbHMsIFN5bWJvbHMKLVNVQlNFQ1RJT04KLQlNaW5pIFN5bWJvbHMKLQotCU1pbmkgc3ltYm9scyBwcm92aWRlIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIHN5bWJvbCB0YWJsZS4KLQlUaGV5IHVzZSBsZXNzIG1lbW9yeSBzcGFjZSwgYnV0IHJlcXVpcmUgbW9yZSB0aW1lIHRvIGFjY2Vzcy4KLQlUaGV5IGNhbiBiZSB1c2VmdWwgZm9yIHRvb2xzIGxpa2Ugbm0gb3Igb2JqZHVtcCwgd2hpY2ggbWF5Ci0JaGF2ZSB0byBoYW5kbGUgc3ltYm9sIHRhYmxlcyBvZiBleHRyZW1lbHkgbGFyZ2UgZXhlY3V0YWJsZXMuCi0KLQlUaGUgPDxiZmRfcmVhZF9taW5pc3ltYm9scz4+IGZ1bmN0aW9uIHdpbGwgcmVhZCB0aGUgc3ltYm9scwotCWludG8gbWVtb3J5IGluIGFuIGludGVybmFsIGZvcm0uICBJdCB3aWxsIHJldHVybiBhIDw8dm9pZCAqPj4KLQlwb2ludGVyIHRvIGEgYmxvY2sgb2YgbWVtb3J5LCBhIHN5bWJvbCBjb3VudCwgYW5kIHRoZSBzaXplIG9mCi0JZWFjaCBzeW1ib2wuICBUaGUgcG9pbnRlciBpcyBhbGxvY2F0ZWQgdXNpbmcgPDxtYWxsb2M+PiwgYW5kCi0Jc2hvdWxkIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgotCi0JVGhlIGZ1bmN0aW9uIDw8YmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sPj4gd2lsbCB0YWtlIGEgcG9pbnRlcgotCXRvIGEgbWluaXN5bWJvbCwgYW5kIGEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSByZXR1cm5lZCBieQotCTw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4sIGFuZCByZXR1cm4gYSA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUuCi0JVGhlIHJldHVybiB2YWx1ZSBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgZnJvbQotCTw8YmZkX21ha2VfZW1wdHlfc3ltYm9sPj4gd2hpY2ggd2FzIHBhc3NlZCBpbi4KLQotKi8KLQotCi0KLS8qCi1ET0NERAotSU5PREUKLXR5cGVkZWYgYXN5bWJvbCwgc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgTWluaSBTeW1ib2xzLCBTeW1ib2xzCi0KLSovCi0vKgotU1VCU0VDVElPTgotCXR5cGVkZWYgYXN5bWJvbAotCi0JQW4gPDxhc3ltYm9sPj4gaGFzIHRoZSBmb3JtOgotCi0qLwotCi0vKgotQ09ERV9GUkFHTUVOVAotCi0uCi0udHlwZWRlZiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5Ci0uewotLgl7KiBBIHBvaW50ZXIgdG8gdGhlIEJGRCB3aGljaCBvd25zIHRoZSBzeW1ib2wuIFRoaXMgaW5mb3JtYXRpb24KLS4JICAgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgYSBiYWNrIGVuZCBjYW4gd29yayBvdXQgd2hhdCBhZGRpdGlvbmFsCi0uICAgCSAgIGluZm9ybWF0aW9uIChpbnZpc2libGUgdG8gdGhlIGFwcGxpY2F0aW9uIHdyaXRlcikgaXMgY2FycmllZAotLgkgICB3aXRoIHRoZSBzeW1ib2wuCi0uCi0uCSAgIFRoaXMgZmllbGQgaXMgKmFsbW9zdCogcmVkdW5kYW50LCBzaW5jZSB5b3UgY2FuIHVzZSBzZWN0aW9uLT5vd25lcgotLgkgICBpbnN0ZWFkLCBleGNlcHQgdGhhdCBzb21lIHN5bWJvbHMgcG9pbnQgdG8gdGhlIGdsb2JhbCBzZWN0aW9ucwotLgkgICBiZmRfe2Ficyxjb20sdW5kfV9zZWN0aW9uLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBtYWtpbmcKLS4JICAgdGhlc2UgZ2xvYmFscyBiZSBwZXItYmZkIChvciBwZXItdGFyZ2V0LWZsYXZvcikuICBGSVhNRS4gKn0KLS4KLS4gIHN0cnVjdCBfYmZkICp0aGVfYmZkOyB7KiBVc2UgYmZkX2FzeW1ib2xfYmZkKHN5bSkgdG8gYWNjZXNzIHRoaXMgZmllbGQuICp9Ci0uCi0uCXsqIFRoZSB0ZXh0IG9mIHRoZSBzeW1ib2wuIFRoZSBuYW1lIGlzIGxlZnQgYWxvbmUsIGFuZCBub3QgY29waWVkOyB0aGUKLS4JICAgYXBwbGljYXRpb24gbWF5IG5vdCBhbHRlciBpdC4gKn0KLS4gIENPTlNUIGNoYXIgKm5hbWU7Ci0uCi0uCXsqIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgVGhpcyByZWFsbHkgc2hvdWxkIGJlIGEgdW5pb24gb2YgYQotLiAgICAgICAgICBudW1lcmljIHZhbHVlIHdpdGggYSBwb2ludGVyLCBzaW5jZSBzb21lIGZsYWdzIGluZGljYXRlIHRoYXQKLS4gICAgICAgICAgYSBwb2ludGVyIHRvIGFub3RoZXIgc3ltYm9sIGlzIHN0b3JlZCBoZXJlLiAgKn0KLS4gIHN5bXZhbHVlIHZhbHVlOwotLgotLgl7KiBBdHRyaWJ1dGVzIG9mIGEgc3ltYm9sOiAqfQotLgotLiNkZWZpbmUgQlNGX05PX0ZMQUdTICAgIDB4MDAKLS4KLS4JeyogVGhlIHN5bWJvbCBoYXMgbG9jYWwgc2NvcGU7IDw8c3RhdGljPj4gaW4gPDxDPj4uIFRoZSB2YWx1ZQotLiAJICAgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQotLiNkZWZpbmUgQlNGX0xPQ0FMCTB4MDEKLS4KLS4JeyogVGhlIHN5bWJvbCBoYXMgZ2xvYmFsIHNjb3BlOyBpbml0aWFsaXplZCBkYXRhIGluIDw8Qz4+LiBUaGUKLS4JICAgdmFsdWUgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBzZWN0aW9uIG9mIHRoZSBkYXRhLiAqfQotLiNkZWZpbmUgQlNGX0dMT0JBTAkweDAyCi0uCi0uCXsqIFRoZSBzeW1ib2wgaGFzIGdsb2JhbCBzY29wZSBhbmQgaXMgZXhwb3J0ZWQuIFRoZSB2YWx1ZSBpcwotLgkgICB0aGUgb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24gb2YgdGhlIGRhdGEuICp9Ci0uI2RlZmluZSBCU0ZfRVhQT1JUCUJTRl9HTE9CQUwgeyogbm8gcmVhbCBkaWZmZXJlbmNlICp9Ci0uCi0uCXsqIEEgbm9ybWFsIEMgc3ltYm9sIHdvdWxkIGJlIG9uZSBvZjoKLS4JICAgPDxCU0ZfTE9DQUw+PiwgPDxCU0ZfRk9SVF9DT01NPj4sICA8PEJTRl9VTkRFRklORUQ+PiBvcgotLgkgICA8PEJTRl9HTE9CQUw+PiAqfQotLgotLgl7KiBUaGUgc3ltYm9sIGlzIGEgZGVidWdnaW5nIHJlY29yZC4gVGhlIHZhbHVlIGhhcyBhbiBhcmJpdGFyeQotLgkgICBtZWFuaW5nLiAqfQotLiNkZWZpbmUgQlNGX0RFQlVHR0lORwkweDA4Ci0uCi0uCXsqIFRoZSBzeW1ib2wgZGVub3RlcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgVXNlZCBpbiBFTEYsCi0uCSAgIHBlcmhhcHMgb3RoZXJzIHNvbWVkYXkuICAqfQotLiNkZWZpbmUgQlNGX0ZVTkNUSU9OICAgIDB4MTAKLS4KLS4JeyogVXNlZCBieSB0aGUgbGlua2VyLiAqfQotLiNkZWZpbmUgQlNGX0tFRVAgICAgICAgIDB4MjAKLS4jZGVmaW5lIEJTRl9LRUVQX0cgICAgICAweDQwCi0uCi0uCXsqIEEgd2VhayBnbG9iYWwgc3ltYm9sLCBvdmVycmlkYWJsZSB3aXRob3V0IHdhcm5pbmdzIGJ5Ci0uCSAgIGEgcmVndWxhciBnbG9iYWwgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUuICAqfQotLiNkZWZpbmUgQlNGX1dFQUsgICAgICAgIDB4ODAKLS4KLS4gICAgICAgeyogVGhpcyBzeW1ib2wgd2FzIGNyZWF0ZWQgdG8gcG9pbnQgdG8gYSBzZWN0aW9uLCBlLmcuIEVMRidzCi0uCSAgIFNUVF9TRUNUSU9OIHN5bWJvbHMuICAqfQotLiNkZWZpbmUgQlNGX1NFQ1RJT05fU1lNIDB4MTAwCi0uCi0uCXsqIFRoZSBzeW1ib2wgdXNlZCB0byBiZSBhIGNvbW1vbiBzeW1ib2wsIGJ1dCBub3cgaXQgaXMKLS4JICAgYWxsb2NhdGVkLiAqfQotLiNkZWZpbmUgQlNGX09MRF9DT01NT04gIDB4MjAwCi0uCi0uCXsqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBjb21tb24gZGF0YS4gKn0KLS4jZGVmaW5lIEJGRF9GT1JUX0NPTU1fREVGQVVMVF9WQUxVRSAwCi0uCi0uCXsqIEluIHNvbWUgZmlsZXMgdGhlIHR5cGUgb2YgYSBzeW1ib2wgc29tZXRpbWVzIGFsdGVycyBpdHMKLS4JICAgbG9jYXRpb24gaW4gYW4gb3V0cHV0IGZpbGUgLSBpZSBpbiBjb2ZmIGEgPDxJU0ZDTj4+IHN5bWJvbAotLgkgICB3aGljaCBpcyBhbHNvIDw8Q19FWFQ+PiBzeW1ib2wgYXBwZWFycyB3aGVyZSBpdCB3YXMKLS4JICAgZGVjbGFyZWQgYW5kIG5vdCBhdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gIFRoaXMgYml0IGlzIHNldAotLiAgCSAgIGJ5IHRoZSB0YXJnZXQgQkZEIHBhcnQgdG8gY29udmV5IHRoaXMgaW5mb3JtYXRpb24uICp9Ci0uCi0uI2RlZmluZSBCU0ZfTk9UX0FUX0VORCAgICAweDQwMAotLgotLgl7KiBTaWduYWwgdGhhdCB0aGUgc3ltYm9sIGlzIHRoZSBsYWJlbCBvZiBjb25zdHJ1Y3RvciBzZWN0aW9uLiAqfQotLiNkZWZpbmUgQlNGX0NPTlNUUlVDVE9SICAgMHg4MDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBhIHdhcm5pbmcgc3ltYm9sLiAgVGhlIG5hbWUgaXMgYQotLgkgICB3YXJuaW5nLiAgVGhlIG5hbWUgb2YgdGhlIG5leHQgc3ltYm9sIGlzIHRoZSBvbmUgdG8gd2FybiBhYm91dDsKLS4JICAgaWYgYSByZWZlcmVuY2UgaXMgbWFkZSB0byBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQKLS4JICAgc3ltYm9sLCBhIHdhcm5pbmcgaXMgaXNzdWVkIGJ5IHRoZSBsaW5rZXIuICp9Ci0uI2RlZmluZSBCU0ZfV0FSTklORyAgICAgICAweDEwMDAKLS4KLS4JeyogU2lnbmFsIHRoYXQgdGhlIHN5bWJvbCBpcyBpbmRpcmVjdC4gIFRoaXMgc3ltYm9sIGlzIGFuIGluZGlyZWN0Ci0uCSAgIHBvaW50ZXIgdG8gdGhlIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG5leHQgc3ltYm9sLiAqfQotLiNkZWZpbmUgQlNGX0lORElSRUNUICAgICAgMHgyMDAwCi0uCi0uCXsqIEJTRl9GSUxFIG1hcmtzIHN5bWJvbHMgdGhhdCBjb250YWluIGEgZmlsZSBuYW1lLiAgVGhpcyBpcyB1c2VkCi0uCSAgIGZvciBFTEYgU1RUX0ZJTEUgc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCU0ZfRklMRSAgICAgICAgICAweDQwMDAKLS4KLS4JeyogU3ltYm9sIGlzIGZyb20gZHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLiAgKn0KLS4jZGVmaW5lIEJTRl9EWU5BTUlDCSAgIDB4ODAwMAotLgotLiAgICAgICB7KiBUaGUgc3ltYm9sIGRlbm90ZXMgYSBkYXRhIG9iamVjdC4gIFVzZWQgaW4gRUxGLCBhbmQgcGVyaGFwcwotLiAgICAgICAgICBvdGhlcnMgc29tZWRheS4gICp9Ci0uI2RlZmluZSBCU0ZfT0JKRUNUCSAgIDB4MTAwMDAKLS4KLS4gIGZsYWd3b3JkIGZsYWdzOwotLgotLgl7KiBBIHBvaW50ZXIgdG8gdGhlIHNlY3Rpb24gdG8gd2hpY2ggdGhpcyBzeW1ib2wgaXMKLS4JICAgcmVsYXRpdmUuICBUaGlzIHdpbGwgYWx3YXlzIGJlIG5vbiBOVUxMLCB0aGVyZSBhcmUgc3BlY2lhbAotLiAgICAgICAgICBzZWN0aW9ucyBmb3IgdW5kZWZpbmVkIGFuZCBhYnNvbHV0ZSBzeW1ib2xzLiAgKn0KLS4gIHN0cnVjdCBzZWMgKnNlY3Rpb247Ci0uCi0uCXsqIEJhY2sgZW5kIHNwZWNpYWwgZGF0YS4gICp9Ci0uICB1bmlvbgotLiAgICB7Ci0uICAgICAgUFRSIHA7Ci0uICAgICAgYmZkX3ZtYSBpOwotLiAgICB9IHVkYXRhOwotLgotLn0gYXN5bWJvbDsKLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi1zdGF0aWMgY2hhciBjb2ZmX3NlY3Rpb25fdHlwZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyoKLURPQ0RECi1JTk9ERQotc3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucywgICwgdHlwZWRlZiBhc3ltYm9sLCBTeW1ib2xzCi1TVUJTRUNUSU9OCi0JU3ltYm9sIGhhbmRsaW5nIGZ1bmN0aW9ucwotKi8KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQKLQotREVTQ1JJUFRJT04KLQlSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIHZlY3RvciBvZiBwb2ludGVycwotCXRvIDw8YXN5bWJvbHM+PiBmb3IgYWxsIHRoZSBzeW1ib2xzIGluIHRoZSBCRkQgQHZhcnthYmZkfSwKLQlpbmNsdWRpbmcgYSB0ZXJtaW5hbCBOVUxMIHBvaW50ZXIuIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzIGluCi0JdGhlIEJGRCwgdGhlbiByZXR1cm4gMC4gIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuIC0xLgotCi0uI2RlZmluZSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZChhYmZkKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kLCAoYWJmZCkpCi0KLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9pc19sb2NhbF9sYWJlbAotCi1TWU5PUFNJUwotICAgICAgICBib29sZWFuIGJmZF9pc19sb2NhbF9sYWJlbChiZmQgKmFiZmQsIGFzeW1ib2wgKnN5bSk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN5bWJvbCBAdmFye3N5bX0gaW4gdGhlIEJGRCBAdmFye2FiZmR9IGlzCi0JYSBjb21waWxlciBnZW5lcmF0ZWQgbG9jYWwgbGFiZWwsIGVsc2UgcmV0dXJuIGZhbHNlLgotKi8KLQotYm9vbGVhbgotYmZkX2lzX2xvY2FsX2xhYmVsIChhYmZkLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotICBpZiAoKHN5bS0+ZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzeW0tPm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoYWJmZCwgc3ltLT5uYW1lKTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUKLQotU1lOT1BTSVMKLSAgICAgICAgYm9vbGVhbiBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCVJldHVybiB0cnVlIGlmIGEgc3ltYm9sIHdpdGggdGhlIG5hbWUgQHZhcntuYW1lfSBpbiB0aGUgQkZECi0JQHZhcnthYmZkfSBpcyBhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4KLQlmYWxzZS4gIFRoaXMganVzdCBjaGVja3Mgd2hldGhlciB0aGUgbmFtZSBoYXMgdGhlIGZvcm0gb2YgYQotCWxvY2FsIGxhYmVsLgotCi0uI2RlZmluZSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZShhYmZkLCBuYW1lKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lLCAoYWJmZCwgbmFtZSkpCi0qLwotCi0vKgotRlVOQ1RJT04KLQliZmRfY2Fub25pY2FsaXplX3N5bXRhYgotCi1ERVNDUklQVElPTgotCVJlYWQgdGhlIHN5bWJvbHMgZnJvbSB0aGUgQkZEIEB2YXJ7YWJmZH0sIGFuZCBmaWxscyBpbgotCXRoZSB2ZWN0b3IgQHZhcntsb2NhdGlvbn0gd2l0aCBwb2ludGVycyB0byB0aGUgc3ltYm9scyBhbmQKLQlhIHRyYWlsaW5nIE5VTEwuCi0JUmV0dXJuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHN5bWJvbCBwb2ludGVycywgbm90Ci0JaW5jbHVkaW5nIHRoZSBOVUxMLgotCi0KLS4jZGVmaW5lIGJmZF9jYW5vbmljYWxpemVfc3ltdGFiKGFiZmQsIGxvY2F0aW9uKSBcCi0uICAgICBCRkRfU0VORCAoYWJmZCwgX2JmZF9jYW5vbmljYWxpemVfc3ltdGFiLFwKLS4gICAgICAgICAgICAgICAgICAoYWJmZCwgbG9jYXRpb24pKQotCi0qLwotCi0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfc3ltdGFiCi0KLVNZTk9QU0lTCi0JYm9vbGVhbiBiZmRfc2V0X3N5bXRhYiAoYmZkICphYmZkLCBhc3ltYm9sICoqbG9jYXRpb24sIHVuc2lnbmVkIGludCBjb3VudCk7Ci0KLURFU0NSSVBUSU9OCi0JQXJyYW5nZSB0aGF0IHdoZW4gdGhlIG91dHB1dCBCRkQgQHZhcnthYmZkfSBpcyBjbG9zZWQsCi0JdGhlIHRhYmxlIEB2YXJ7bG9jYXRpb259IG9mIEB2YXJ7Y291bnR9IHBvaW50ZXJzIHRvIHN5bWJvbHMKLQl3aWxsIGJlIHdyaXR0ZW4uCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X3N5bXRhYiAoYWJmZCwgbG9jYXRpb24sIHN5bWNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipsb2NhdGlvbjsKLSAgICAgdW5zaWduZWQgaW50IHN5bWNvdW50OwotewotICBpZiAoKGFiZmQtPmZvcm1hdCAhPSBiZmRfb2JqZWN0KSB8fCAoYmZkX3JlYWRfcCAoYWJmZCkpKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGJmZF9nZXRfb3V0c3ltYm9scyAoYWJmZCkgPSBsb2NhdGlvbjsKLSAgYmZkX2dldF9zeW1jb3VudCAoYWJmZCkgPSBzeW1jb3VudDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9wcmludF9zeW1ib2xfdmFuZGYKLQotU1lOT1BTSVMKLQl2b2lkIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoUFRSIGZpbGUsIGFzeW1ib2wgKnN5bWJvbCk7Ci0KLURFU0NSSVBUSU9OCi0JUHJpbnQgdGhlIHZhbHVlIGFuZCBmbGFncyBvZiB0aGUgQHZhcntzeW1ib2x9IHN1cHBsaWVkIHRvIHRoZQotCXN0cmVhbSBAdmFye2ZpbGV9LgotKi8KLXZvaWQKLWJmZF9wcmludF9zeW1ib2xfdmFuZGYgKGFyZywgc3ltYm9sKQotICAgICBQVFIgYXJnOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBhcmc7Ci0gIGZsYWd3b3JkIHR5cGUgPSBzeW1ib2wtPmZsYWdzOwotICBpZiAoc3ltYm9sLT5zZWN0aW9uICE9IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlICsgc3ltYm9sLT5zZWN0aW9uLT52bWEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGZfdm1hIChmaWxlLCBzeW1ib2wtPnZhbHVlKTsKLSAgICB9Ci0KLSAgLyogVGhpcyBwcmVzdW1lcyB0aGF0IGEgc3ltYm9sIGNhbiBub3QgYmUgYm90aCBCU0ZfREVCVUdHSU5HIGFuZAotICAgICBCU0ZfRFlOQU1JQywgbm9yIG1vcmUgdGhhbiBvbmUgb2YgQlNGX0ZVTkNUSU9OLCBCU0ZfRklMRSwgYW5kCi0gICAgIEJTRl9PQkpFQ1QuICAqLwotICBmcHJpbnRmIChmaWxlLCAiICVjJWMlYyVjJWMlYyVjIiwKLQkgICAoKHR5cGUgJiBCU0ZfTE9DQUwpCi0JICAgID8gKHR5cGUgJiBCU0ZfR0xPQkFMKSA/ICchJyA6ICdsJwotCSAgICA6ICh0eXBlICYgQlNGX0dMT0JBTCkgPyAnZycgOiAnICcpLAotCSAgICh0eXBlICYgQlNGX1dFQUspID8gJ3cnIDogJyAnLAotCSAgICh0eXBlICYgQlNGX0NPTlNUUlVDVE9SKSA/ICdDJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9XQVJOSU5HKSA/ICdXJyA6ICcgJywKLQkgICAodHlwZSAmIEJTRl9JTkRJUkVDVCkgPyAnSScgOiAnICcsCi0JICAgKHR5cGUgJiBCU0ZfREVCVUdHSU5HKSA/ICdkJyA6ICh0eXBlICYgQlNGX0RZTkFNSUMpID8gJ0QnIDogJyAnLAotCSAgICgodHlwZSAmIEJTRl9GVU5DVElPTikKLQkgICAgPyAnRicKLQkgICAgOiAoKHR5cGUgJiBCU0ZfRklMRSkKLQkgICAgICAgPyAnZicKLQkgICAgICAgOiAoKHR5cGUgJiBCU0ZfT0JKRUNUKSA/ICdPJyA6ICcgJykpKSk7Ci19Ci0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX21ha2VfZW1wdHlfc3ltYm9sCi0KLURFU0NSSVBUSU9OCi0JQ3JlYXRlIGEgbmV3IDw8YXN5bWJvbD4+IHN0cnVjdHVyZSBmb3IgdGhlIEJGRCBAdmFye2FiZmR9Ci0JYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0KLQlUaGlzIHJvdXRpbmUgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZWFjaCBiYWNrIGVuZCBoYXMgcHJpdmF0ZQotCWluZm9ybWF0aW9uIHN1cnJvdW5kaW5nIHRoZSA8PGFzeW1ib2w+Pi4gQnVpbGRpbmcgeW91ciBvd24KLQk8PGFzeW1ib2w+PiBhbmQgcG9pbnRpbmcgdG8gaXQgd2lsbCBub3QgY3JlYXRlIHRoZSBwcml2YXRlCi0JaW5mb3JtYXRpb24sIGFuZCB3aWxsIGNhdXNlIHByb2JsZW1zIGxhdGVyIG9uLgotCi0uI2RlZmluZSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCkgXAotLiAgICAgQkZEX1NFTkQgKGFiZmQsIF9iZmRfbWFrZV9lbXB0eV9zeW1ib2wsIChhYmZkKSkKLSovCi0KLS8qCi1GVU5DVElPTgotCWJmZF9tYWtlX2RlYnVnX3N5bWJvbAotCi1ERVNDUklQVElPTgotCUNyZWF0ZSBhIG5ldyA8PGFzeW1ib2w+PiBzdHJ1Y3R1cmUgZm9yIHRoZSBCRkQgQHZhcnthYmZkfSwKLQl0byBiZSB1c2VkIGFzIGEgZGVidWdnaW5nIHN5bWJvbC4gIEZ1cnRoZXIgZGV0YWlscyBvZiBpdHMgdXNlIGhhdmUKLQl5ZXQgdG8gYmUgd29ya2VkIG91dC4KLQotLiNkZWZpbmUgYmZkX21ha2VfZGVidWdfc3ltYm9sKGFiZmQscHRyLHNpemUpIFwKLS4gICAgICAgIEJGRF9TRU5EIChhYmZkLCBfYmZkX21ha2VfZGVidWdfc3ltYm9sLCAoYWJmZCwgcHRyLCBzaXplKSkKLSovCi0KLXN0cnVjdCBzZWN0aW9uX3RvX3R5cGUKLXsKLSAgQ09OU1QgY2hhciAqc2VjdGlvbjsKLSAgY2hhciB0eXBlOwotfTsKLQotLyogTWFwIHNlY3Rpb24gbmFtZXMgdG8gUE9TSVgvQlNEIHNpbmdsZS1jaGFyYWN0ZXIgc3ltYm9sIHR5cGVzLgotICAgVGhpcyB0YWJsZSBpcyBwcm9iYWJseSBpbmNvbXBsZXRlLiAgSXQgaXMgc29ydGVkIGZvciBjb252ZW5pZW5jZSBvZgotICAgYWRkaW5nIGVudHJpZXMuICBTaW5jZSBpdCBpcyBzbyBzaG9ydCwgYSBsaW5lYXIgc2VhcmNoIGlzIHVzZWQuICAqLwotc3RhdGljIENPTlNUIHN0cnVjdCBzZWN0aW9uX3RvX3R5cGUgc3R0W10gPQotewotICB7IipERUJVRyoiLCAnTid9LAotICB7Ii5ic3MiLCAnYid9LAotICB7Inplcm92YXJzIiwgJ2InfSwJCS8qIE1SSSAuYnNzICovCi0gIHsiLmRhdGEiLCAnZCd9LAotICB7InZhcnMiLCAnZCd9LAkJLyogTVJJIC5kYXRhICovCi0gIHsiLnJkYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KLSAgeyIucm9kYXRhIiwgJ3InfSwJCS8qIFJlYWQgb25seSBkYXRhLiAgKi8KLSAgeyIuc2JzcyIsICdzJ30sCQkvKiBTbWFsbCBCU1MgKHVuaW5pdGlhbGl6ZWQgZGF0YSkuICAqLwotICB7Ii5zY29tbW9uIiwgJ2MnfSwJCS8qIFNtYWxsIGNvbW1vbi4gICovCi0gIHsiLnNkYXRhIiwgJ2cnfSwJCS8qIFNtYWxsIGluaXRpYWxpemVkIGRhdGEuICAqLwotICB7Ii50ZXh0IiwgJ3QnfSwKLSAgeyJjb2RlIiwgJ3QnfSwJCS8qIE1SSSAudGV4dCAqLwotICB7MCwgMH0KLX07Ci0KLS8qIFJldHVybiB0aGUgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgdHlwZSBjb3JyZXNwb25kaW5nIHRvCi0gICBzZWN0aW9uIFMsIG9yICc/JyBmb3IgYW4gdW5rbm93biBDT0ZGIHNlY3Rpb24uICAKLQotICAgQ2hlY2sgZm9yIGFueSBsZWFkaW5nIHN0cmluZyB3aGljaCBtYXRjaGVzLCBzbyAudGV4dDUgcmV0dXJucwotICAgJ3QnIGFzIHdlbGwgYXMgLnRleHQgKi8KLQotc3RhdGljIGNoYXIKLWNvZmZfc2VjdGlvbl90eXBlIChzKQotICAgICBjb25zdCBjaGFyICpzOwotewotICBDT05TVCBzdHJ1Y3Qgc2VjdGlvbl90b190eXBlICp0OwotCi0gIGZvciAodCA9ICZzdHRbMF07IHQtPnNlY3Rpb247IHQrKykgCi0gICAgaWYgKCFzdHJuY21wIChzLCB0LT5zZWN0aW9uLCBzdHJsZW4gKHQtPnNlY3Rpb24pKSkKLSAgICAgIHJldHVybiB0LT50eXBlOwotCi0gIHJldHVybiAnPyc7Ci19Ci0KLSNpZm5kZWYgaXNsb3dlcgotI2RlZmluZSBpc2xvd2VyKGMpICgoYykgPj0gJ2EnICYmIChjKSA8PSAneicpCi0jZW5kaWYKLSNpZm5kZWYgdG91cHBlcgotI2RlZmluZSB0b3VwcGVyKGMpIChpc2xvd2VyKGMpID8gKChjKSAmIH4weDIwKSA6IChjKSkKLSNlbmRpZgotCi0vKgotRlVOQ1RJT04KLQliZmRfZGVjb2RlX3N5bWNsYXNzCi0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgY2hhcmFjdGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN5bWJvbAotCWNsYXNzIG9mIEB2YXJ7c3ltYm9sfSwgb3IgJz8nIGZvciBhbiB1bmtub3duIGNsYXNzLgotCi1TWU5PUFNJUwotCWludCBiZmRfZGVjb2RlX3N5bWNsYXNzKGFzeW1ib2wgKnN5bWJvbCk7Ci0qLwotaW50Ci1iZmRfZGVjb2RlX3N5bWNsYXNzIChzeW1ib2wpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLXsKLSAgY2hhciBjOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCi0gICAgcmV0dXJuICdDJzsKLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkKLSAgICByZXR1cm4gJ1UnOwotICBpZiAoYmZkX2lzX2luZF9zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIHJldHVybiAnSSc7Ci0gIGlmIChzeW1ib2wtPmZsYWdzICYgQlNGX1dFQUspCi0gICAgcmV0dXJuICdXJzsKLSAgaWYgKCEoc3ltYm9sLT5mbGFncyAmIChCU0ZfR0xPQkFMIHwgQlNGX0xPQ0FMKSkpCi0gICAgcmV0dXJuICc/JzsKLQotICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotICAgIGMgPSAnYSc7Ci0gIGVsc2UgaWYgKHN5bWJvbC0+c2VjdGlvbikKLSAgICBjID0gY29mZl9zZWN0aW9uX3R5cGUgKHN5bWJvbC0+c2VjdGlvbi0+bmFtZSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gJz8nOwotICBpZiAoc3ltYm9sLT5mbGFncyAmIEJTRl9HTE9CQUwpCi0gICAgYyA9IHRvdXBwZXIgKGMpOwotICByZXR1cm4gYzsKLQotICAvKiBXZSBkb24ndCBoYXZlIHRvIGhhbmRsZSB0aGVzZSBjYXNlcyBqdXN0IHlldCwgYnV0IHdlIHdpbGwgc29vbjoKLSAgICAgTl9TRVRWOiAndic7Ci0gICAgIE5fU0VUQTogJ2wnOwotICAgICBOX1NFVFQ6ICd4JzsKLSAgICAgTl9TRVREOiAneic7Ci0gICAgIE5fU0VUQjogJ3MnOwotICAgICBOX0lORFI6ICdpJzsKLSAgICAgKi8KLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX3N5bWJvbF9pbmZvCi0KLURFU0NSSVBUSU9OCi0JRmlsbCBpbiB0aGUgYmFzaWMgaW5mbyBhYm91dCBzeW1ib2wgdGhhdCBubSBuZWVkcy4KLQlBZGRpdGlvbmFsIGluZm8gbWF5IGJlIGFkZGVkIGJ5IHRoZSBiYWNrLWVuZHMgYWZ0ZXIKLQljYWxsaW5nIHRoaXMgZnVuY3Rpb24uCi0KLVNZTk9QU0lTCi0Jdm9pZCBiZmRfc3ltYm9sX2luZm8oYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KTsKLSovCi0KLXZvaWQKLWJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpCi0gICAgIGFzeW1ib2wgKnN5bWJvbDsKLSAgICAgc3ltYm9sX2luZm8gKnJldDsKLXsKLSAgcmV0LT50eXBlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoc3ltYm9sKTsKLSAgaWYgKHJldC0+dHlwZSAhPSAnVScpCi0gICAgcmV0LT52YWx1ZSA9IHN5bWJvbC0+dmFsdWUgKyBzeW1ib2wtPnNlY3Rpb24tPnZtYTsKLSAgZWxzZQotICAgIHJldC0+dmFsdWUgPSAwOwotICByZXQtPm5hbWUgPSBzeW1ib2wtPm5hbWU7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEoYmZkICppYmZkLCBhc3ltYm9sICppc3ltLCBiZmQgKm9iZmQsIGFzeW1ib2wgKm9zeW0pOwotCi1ERVNDUklQVElPTgotCUNvcHkgcHJpdmF0ZSBzeW1ib2wgaW5mb3JtYXRpb24gZnJvbSBAdmFye2lzeW19IGluIHRoZSBCRkQKLQlAdmFye2liZmR9IHRvIHRoZSBzeW1ib2wgQHZhcntvc3ltfSBpbiB0aGUgQkZEIEB2YXJ7b2JmZH0uCi0JUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0JcmV0dXJucyBhcmU6Ci0KLQlvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLQlOb3QgZW5vdWdoIG1lbW9yeSBleGlzdHMgdG8gY3JlYXRlIHByaXZhdGUgZGF0YSBmb3IgQHZhcntvc2VjfS4KLQotLiNkZWZpbmUgYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSBcCi0uICAgICBCRkRfU0VORCAob2JmZCwgX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEsIFwKLS4JCShpYmZkLCBpc3ltYm9sLCBvYmZkLCBvc3ltYm9sKSkKLQotKi8KLQotLyogVGhlIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBtaW5pIHN5bWJvbHMuCi0gICBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgYmFja2VuZCBkb2VzIG5vdCBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKLSAgIHZlcnNpb24uICBJdCBqdXN0IHVzZXMgQkZEIGFzeW1ib2wgc3RydWN0dXJlcyBhcyBtaW5pIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXNwLCBzaXplcCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiAqbWluaXN5bXNwOwotICAgICB1bnNpZ25lZCBpbnQgKnNpemVwOwotewotICBsb25nIHN0b3JhZ2U7Ci0gIGFzeW1ib2wgKipzeW1zID0gTlVMTDsKLSAgbG9uZyBzeW1jb3VudDsKLQotICBpZiAoZHluYW1pYykKLSAgICBzdG9yYWdlID0gYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzdG9yYWdlID0gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpOwotICBpZiAoc3RvcmFnZSA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgc3ltcyA9IChhc3ltYm9sICoqKSBiZmRfbWFsbG9jICgoc2l6ZV90KSBzdG9yYWdlKTsKLSAgaWYgKHN5bXMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoZHluYW1pYykKLSAgICBzeW1jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHN5bXMpOwotICBlbHNlCi0gICAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgKm1pbmlzeW1zcCA9IChQVFIpIHN5bXM7Ci0gICpzaXplcCA9IHNpemVvZiAoYXN5bWJvbCAqKTsKLSAgcmV0dXJuIHN5bWNvdW50OwotCi0gZXJyb3JfcmV0dXJuOgotICBpZiAoc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKHN5bXMpOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIFRoZSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGEgbWluaXN5bWJvbCB0bwotICAgYW4gYXN5bWJvbC4gIFdlIGRvbid0IHdvcnJ5IGFib3V0IHRoZSBzeW0gYXJndW1lbnQgd2UgYXJlIHBhc3NlZDsKLSAgIHdlIGp1c3QgcmV0dXJuIHRoZSBhc3ltYm9sIHRoZSBtaW5pc3ltYm9sIHBvaW50cyB0by4gICovCi0KLS8qQVJHU1VTRUQqLwotYXN5bWJvbCAqCi1fYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIGNvbnN0IFBUUiBtaW5pc3ltOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIHJldHVybiAqKGFzeW1ib2wgKiopIG1pbmlzeW07Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gLnN0YWIgYW5kIC5zdGFic3RyCi0gICBzZWN0aW9ucyB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZSBhbmQgbGluZSBjbG9zZXN0IHRvIGEgZGVzaXJlZAotICAgbG9jYXRpb24uICBUaGlzIGlzIHVzZWQgYnkgQ09GRiBhbmQgRUxGIHRhcmdldHMuICBJdCBzZXRzICpwZm91bmQKLSAgIHRvIHRydWUgaWYgaXQgZmluZHMgc29tZSBpbmZvcm1hdGlvbi4gIFRoZSAqcGluZm8gZmllbGQgaXMgdXNlZCB0bwotICAgcGFzcyBjYWNoZWQgaW5mb3JtYXRpb24gaW4gYW5kIG91dCBvZiB0aGlzIHJvdXRpbmU7IHRoaXMgZmlyc3QgdGltZQotICAgdGhlIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBhIEJGRCwgKnBpbmZvIHNob3VsZCBiZSBOVUxMLiAgVGhlIHZhbHVlCi0gICBwbGFjZWQgaW4gKnBpbmZvIHNob3VsZCBiZSBzYXZlZCB3aXRoIHRoZSBCRkQsIGFuZCBwYXNzZWQgYmFjayBlYWNoCi0gICB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KLQotLyogV2UgdXNlIGEgY2FjaGUgYnkgZGVmYXVsdC4gICovCi0KLSNkZWZpbmUgRU5BQkxFX0NBQ0hJTkcKLQotLyogV2Uga2VlcCBhbiBhcnJheSBvZiBpbmRleGVudHJ5IHN0cnVjdHVyZXMgdG8gcmVjb3JkIHdoZXJlIGluIHRoZQotICAgc3RhYnMgc2VjdGlvbiB3ZSBzaG91bGQgbG9vayB0byBmaW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBhCi0gICBwYXJ0aWN1bGFyIGFkZHJlc3MuICAqLwotCi1zdHJ1Y3QgaW5kZXhlbnRyeQotewotICBiZmRfdm1hIHZhbDsKLSAgYmZkX2J5dGUgKnN0YWI7Ci0gIGJmZF9ieXRlICpzdHI7Ci0gIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICBjaGFyICpmaWxlX25hbWU7Ci0gIGNoYXIgKmZ1bmN0aW9uX25hbWU7Ci19OwotCi0vKiBDb21wYXJlIHR3byBpbmRleGVudHJ5IHN0cnVjdHVyZXMuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQuICAqLwotCi1zdGF0aWMgaW50Ci1jbXBpbmRleGVudHJ5IChhLCBiKQotICAgICBjb25zdCBQVFIgKmE7Ci0gICAgIGNvbnN0IFBUUiAqYjsKLXsKLSAgY29uc3Qgc3RydWN0IGluZGV4ZW50cnkgKmNvbnRlc3RhbnRBID0gKGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICopIGE7Ci0gIGNvbnN0IHN0cnVjdCBpbmRleGVudHJ5ICpjb250ZXN0YW50QiA9IChjb25zdCBzdHJ1Y3QgaW5kZXhlbnRyeSAqKSBiOwotCi0gIGlmIChjb250ZXN0YW50QS0+dmFsIDwgY29udGVzdGFudEItPnZhbCkKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UgaWYgKGNvbnRlc3RhbnRBLT52YWwgPiBjb250ZXN0YW50Qi0+dmFsKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdHVyZSBpcyBzdG9yZWQgaW4gKnBpbmZvLiAgKi8KLQotc3RydWN0IHN0YWJfZmluZF9pbmZvCi17Ci0gIC8qIFRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0YWJzZWM7Ci0gIC8qIFRoZSAuc3RhYnN0ciBzZWN0aW9uLiAgKi8KLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgLyogVGhlIGNvbnRlbnRzIG9mIHRoZSAuc3RhYiBzZWN0aW9uLiAgKi8KLSAgYmZkX2J5dGUgKnN0YWJzOwotICAvKiBUaGUgY29udGVudHMgb2YgdGhlIC5zdGFic3RyIHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqc3RyczsKLQotICAvKiBBIHRhYmxlIHRoYXQgaW5kZXhlcyBzdGFicyBieSBtZW1vcnkgYWRkcmVzcy4gICovCi0gIHN0cnVjdCBpbmRleGVudHJ5ICppbmRleHRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kZXh0YWJsZS4gICovCi0gIGludCBpbmRleHRhYmxlc2l6ZTsKLQotI2lmZGVmIEVOQUJMRV9DQUNISU5HCi0gIC8qIENhY2hlZCB2YWx1ZXMgdG8gcmVzdGFydCBxdWlja2x5LiAgKi8KLSAgc3RydWN0IGluZGV4ZW50cnkgKmNhY2hlZF9pbmRleGVudHJ5OwotICBiZmRfdm1hIGNhY2hlZF9vZmZzZXQ7Ci0gIGJmZF9ieXRlICpjYWNoZWRfc3RhYjsKLSAgY2hhciAqY2FjaGVkX2ZpbGVfbmFtZTsKLSNlbmRpZgotCi0gIC8qIFNhdmVkIHB0ciB0byBtYWxsb2MnZWQgZmlsZW5hbWUuICAqLwotICBjaGFyICpmaWxlbmFtZTsKLX07Ci0KLWJvb2xlYW4KLV9iZmRfc3RhYl9zZWN0aW9uX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzeW1ib2xzLCBzZWN0aW9uLCBvZmZzZXQsIHBmb3VuZCwKLQkJCQkgICAgIHBmaWxlbmFtZSwgcGZubmFtZSwgcGxpbmUsIHBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gKnBmb3VuZDsKLSAgICAgY29uc3QgY2hhciAqKnBmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBmbm5hbWU7Ci0gICAgIHVuc2lnbmVkIGludCAqcGxpbmU7Ci0gICAgIFBUUiAqcGluZm87Ci17Ci0gIHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqaW5mbzsKLSAgYmZkX3NpemVfdHlwZSBzdGFic2l6ZSwgc3Ryc2l6ZTsKLSAgYmZkX2J5dGUgKnN0YWIsICpzdHIsICpsYXN0X3N0YWI7Ci0gIGJmZF9zaXplX3R5cGUgc3Ryb2ZmOwotICBzdHJ1Y3QgaW5kZXhlbnRyeSAqaW5kZXhlbnRyeTsKLSAgY2hhciAqZGlyZWN0b3J5X25hbWUsICpmaWxlX25hbWU7Ci0gIGludCBzYXdfZnVuOwotCi0gICpwZm91bmQgPSBmYWxzZTsKLSAgKnBmaWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAqcGZubmFtZSA9IE5VTEw7Ci0gICpwbGluZSA9IDA7Ci0KLSAgLyogU3RhYnMgZW50cmllcyB1c2UgYSAxMiBieXRlIGZvcm1hdDoKLSAgICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgICAgMSBieXRlIHN0YWIgdHlwZQotICAgICAgIDEgYnl0ZSBzdGFiIG90aGVyIGZpZWxkCi0gICAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICAgIDQgYnl0ZSBzdGFiIHZhbHVlCi0gICAgIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBjaGFuZ2UgZm9yIGEgNjQgYml0IG9iamVjdCBmb3JtYXQuCi0KLSAgICAgVGhlIHN0YWJzIHN5bWJvbHMgYXJlIGRpdmlkZWQgaW50byBjb21waWxhdGlvbiB1bml0cy4gIEZvciB0aGUKLSAgICAgZmlyc3QgZW50cnkgaW4gZWFjaCB1bml0LCB0aGUgdHlwZSBvZiAwLCB0aGUgdmFsdWUgaXMgdGhlIGxlbmd0aAotICAgICBvZiB0aGUgc3RyaW5nIHRhYmxlIGZvciB0aGlzIHVuaXQsIGFuZCB0aGUgZGVzYyBmaWVsZCBpcyB0aGUKLSAgICAgbnVtYmVyIG9mIHN0YWJzIHN5bWJvbHMgZm9yIHRoaXMgdW5pdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotICBpbmZvID0gKHN0cnVjdCBzdGFiX2ZpbmRfaW5mbyAqKSAqcGluZm87Ci0gIGlmIChpbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBzdGFic2l6ZSA9IGluZm8tPnN0YWJzZWMtPl9yYXdfc2l6ZTsKLSAgICAgIHN0cnNpemUgPSBpbmZvLT5zdHJzZWMtPl9yYXdfc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX3NpemUsIHJlbG9jX2NvdW50OwotICAgICAgYXJlbGVudCAqKnJlbG9jX3ZlY3RvcjsKLSAgICAgIGludCBpOwotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGNoYXIgKmZpbGVfbmFtZTsKLSAgICAgIGNoYXIgKmRpcmVjdG9yeV9uYW1lOwotICAgICAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLQotICAgICAgaW5mbyA9IChzdHJ1Y3Qgc3RhYl9maW5kX2luZm8gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mICppbmZvKTsKLSAgICAgIGlmIChpbmZvID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogV2hlbiB1c2luZyB0aGUgbGlua2VyIC0tc3BsaXQtYnktZmlsZSBvcgotCSAtLXNwbGl0LWJ5LXJlbG9jIG9wdGlvbnMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgLnN0YWIgYW5kCi0JIC5zdGFic3RyIHNlY3Rpb25zIHRvIGJlIHNwbGl0LiAgV2Ugc2hvdWxkIGhhbmRsZSB0aGF0LiAgKi8KLQotICAgICAgaW5mby0+c3RhYnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWIiKTsKLSAgICAgIGluZm8tPnN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnN0YWJzdHIiKTsKLQotICAgICAgaWYgKGluZm8tPnN0YWJzZWMgPT0gTlVMTCB8fCBpbmZvLT5zdHJzZWMgPT0gTlVMTCkKLQl7Ci0JICAvKiBObyBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTZXQgKnBpbmZvIHNvIHRoYXQgd2UKLSAgICAgICAgICAgICBjYW4gcmV0dXJuIHF1aWNrbHkgaW4gdGhlIGluZm8gIT0gTlVMTCBjYXNlIGFib3ZlLiAgKi8KLQkgICpwaW5mbyA9IChQVFIpIGluZm87Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHN0YWJzaXplID0gaW5mby0+c3RhYnNlYy0+X3Jhd19zaXplOwotICAgICAgc3Ryc2l6ZSA9IGluZm8tPnN0cnNlYy0+X3Jhd19zaXplOwotCi0gICAgICBpbmZvLT5zdGFicyA9IChiZmRfYnl0ZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHN0YWJzaXplKTsKLSAgICAgIGluZm8tPnN0cnMgPSAoYmZkX2J5dGUgKikgYmZkX2FsbG9jIChhYmZkLCBzdHJzaXplKTsKLSAgICAgIGlmIChpbmZvLT5zdGFicyA9PSBOVUxMIHx8IGluZm8tPnN0cnMgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3RhYnNlYywgaW5mby0+c3RhYnMsIDAsCi0JCQkJICAgICAgc3RhYnNpemUpCi0JICB8fCAhIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaW5mby0+c3Ryc2VjLCBpbmZvLT5zdHJzLCAwLAotCQkJCQkgc3Ryc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIG9iamVjdCBmaWxlLCB3ZSBoYXZlIHRvIHJlbG9jYXRlCi0JIHRoZSBlbnRyaWVzIGluIC5zdGFiLiAgVGhpcyBzaG91bGQgYWx3YXlzIGJlIHNpbXBsZSAzMiBiaXQKLQkgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeW1ib2xzIGRlZmluZWQgaW4gdGhpcyBvYmplY3QgZmlsZSwgc28KLQkgdGhpcyBzaG91bGQgYmUgbm8gYmlnIGRlYWwuICAqLwotICAgICAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGluZm8tPnN0YWJzZWMpOwotICAgICAgaWYgKHJlbG9jX3NpemUgPCAwKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlbG9jX3ZlY3RvciA9IChhcmVsZW50ICoqKSBiZmRfbWFsbG9jIChyZWxvY19zaXplKTsKLSAgICAgIGlmIChyZWxvY192ZWN0b3IgPT0gTlVMTCAmJiByZWxvY19zaXplICE9IDApCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVsb2NfY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBpbmZvLT5zdGFic2VjLCByZWxvY192ZWN0b3IsCi0JCQkJCSAgICBzeW1ib2xzKTsKLSAgICAgIGlmIChyZWxvY19jb3VudCA8IDApCi0JewotCSAgaWYgKHJlbG9jX3ZlY3RvciAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY192ZWN0b3IpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmIChyZWxvY19jb3VudCA+IDApCi0JewotCSAgYXJlbGVudCAqKnByOwotCi0JICBmb3IgKHByID0gcmVsb2NfdmVjdG9yOyAqcHIgIT0gTlVMTDsgcHIrKykKLQkgICAgewotCSAgICAgIGFyZWxlbnQgKnI7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0JICAgICAgYXN5bWJvbCAqc3ltOwotCi0JICAgICAgciA9ICpwcjsKLQkgICAgICBpZiAoci0+aG93dG8tPnJpZ2h0c2hpZnQgIT0gMAotCQkgIHx8IHItPmhvd3RvLT5zaXplICE9IDIKLQkJICB8fCByLT5ob3d0by0+Yml0c2l6ZSAhPSAzMgotCQkgIHx8IHItPmhvd3RvLT5wY19yZWxhdGl2ZQotCQkgIHx8IHItPmhvd3RvLT5iaXRwb3MgIT0gMAotCQkgIHx8IHItPmhvd3RvLT5kc3RfbWFzayAhPSAweGZmZmZmZmZmKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiVW5zdXBwb3J0ZWQgLnN0YWIgcmVsb2NhdGlvbiIpKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotCQkgIGlmIChyZWxvY192ZWN0b3IgIT0gTlVMTCkKLQkJICAgIGZyZWUgKHJlbG9jX3ZlY3Rvcik7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOwotCSAgICAgIHZhbCAmPSByLT5ob3d0by0+c3JjX21hc2s7Ci0JICAgICAgc3ltID0gKnItPnN5bV9wdHJfcHRyOwotCSAgICAgIHZhbCArPSBzeW0tPnZhbHVlICsgc3ltLT5zZWN0aW9uLT52bWEgKyByLT5hZGRlbmQ7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgdmFsLCBpbmZvLT5zdGFicyArIHItPmFkZHJlc3MpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocmVsb2NfdmVjdG9yICE9IE5VTEwpCi0JZnJlZSAocmVsb2NfdmVjdG9yKTsKLQotICAgICAgLyogRmlyc3QgdGltZSB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIGJ1aWxkIGEgdGFibGUgbWF0Y2hpbmcKLQkgZnVuY3Rpb24gVk0gYWRkcmVzc2VzIHRvIHN0YWJzLCB0aGVuIHNvcnQgYmFzZWQgb24gc3RhcnRpbmcKLQkgVk0gYWRkcmVzcy4gIERvIHRoaXMgaW4gdHdvIHBhc3Nlczogb25jZSB0byBjb3VudCBob3cgbWFueQotCSB0YWJsZSBlbnRyaWVzIHdlJ2xsIG5lZWQsIGFuZCBhIHNlY29uZCB0byBhY3R1YWxseSBidWlsZCB0aGUKLQkgdGFibGUuICAqLwotCi0gICAgICBpbmZvLT5pbmRleHRhYmxlc2l6ZSA9IDA7Ci0gICAgICBzYXdfZnVuID0gMTsKLSAgICAgIGZvciAoc3RhYiA9IGluZm8tPnN0YWJzOyBzdGFiIDwgaW5mby0+c3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSBTVEFCU0laRSkKLQl7Ci0JICBpZiAoc3RhYltUWVBFT0ZGXSA9PSBOX1NPKQotCSAgICB7Ci0JICAgICAgLyogTl9TTyB3aXRoIG51bGwgbmFtZSBpbmRpY2F0ZXMgRU9GICovCi0JICAgICAgaWYgKGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBTVFJEWE9GRikgPT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICAvKiBpZiB3ZSBkaWQgbm90IHNlZSBhIGZ1bmN0aW9uIGRlZiwgbGVhdmUgc3BhY2UgZm9yIG9uZS4gKi8KLQkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCQkrK2luZm8tPmluZGV4dGFibGVzaXplOwotCi0JICAgICAgc2F3X2Z1biA9IDA7Ci0KLQkgICAgICAvKiB0d28gTl9TTydzIGluIGEgcm93IGlzIGEgZmlsZW5hbWUgYW5kIGRpcmVjdG9yeS4gU2tpcCAqLwotCSAgICAgIGlmIChzdGFiICsgU1RBQlNJWkUgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplCi0JCSAgJiYgKihzdGFiICsgU1RBQlNJWkUgKyBUWVBFT0ZGKSA9PSBOX1NPKQotCQl7Ci0JCSAgc3RhYiArPSBTVEFCU0laRTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzdGFiW1RZUEVPRkZdID09IE5fRlVOKQotCSAgICB7Ci0JICAgICAgc2F3X2Z1biA9IDE7Ci0JICAgICAgKytpbmZvLT5pbmRleHRhYmxlc2l6ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNhd19mdW4gPT0gMCkKLQkrK2luZm8tPmluZGV4dGFibGVzaXplOwotICAgICAgCi0gICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZXNpemUgPT0gMCkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgICsraW5mby0+aW5kZXh0YWJsZXNpemU7Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGUgPSAoKHN0cnVjdCBpbmRleGVudHJ5ICopCi0JCQkgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCQkgICAgIChzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KQotCQkJCSAgICAgICogaW5mby0+aW5kZXh0YWJsZXNpemUpKSk7Ci0gICAgICBpZiAoaW5mby0+aW5kZXh0YWJsZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIHNhd19mdW4gPSAxOwotCi0gICAgICBmb3IgKGkgPSAwLCBzdHJvZmYgPSAwLCBzdGFiID0gaW5mby0+c3RhYnMsIHN0ciA9IGluZm8tPnN0cnM7Ci0JICAgaSA8IGluZm8tPmluZGV4dGFibGVzaXplICYmIHN0YWIgPCBpbmZvLT5zdGFicyArIHN0YWJzaXplOwotCSAgIHN0YWIgKz0gU1RBQlNJWkUpCi0JewotCSAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBlbnRyeSBpbiBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCSAgICAgIGlmICgoYmZkX3NpemVfdHlwZSkgKChpbmZvLT5zdHJzICsgc3Ryc2l6ZSkgLSBzdHIpIDwgc3Ryb2ZmKQotCQlicmVhazsKLQkgICAgICBzdHIgKz0gc3Ryb2ZmOwotCSAgICAgIHN0cm9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TTzoKLQkgICAgICAvKiBUaGUgbWFpbiBmaWxlIG5hbWUuICAqLwotCi0JICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGNyZWF0ZXMgYSBuZXcgaW5kZXh0YWJsZSBlbnRyeSB3aXRoCi0JICAgICAgICAgYSBOVUxMIGZ1bmN0aW9uIG5hbWUgaWYgdGhlcmUgd2VyZSBubyBOX0ZVTnMgaW4gYSBmaWxlLgotCSAgICAgICAgIE5vdGUgdGhhdCBhIE5fU08gd2l0aG91dCBhIGZpbGUgbmFtZSBpcyBhbiBFT0YgYW5kCi0JICAgICAgICAgdGhlcmUgY291bGQgYmUgMiBOX1NPIGZvbGxvd2luZyBpdCB3aXRoIHRoZSBuZXcgZmlsZW5hbWUgCi0JICAgICAgICAgYW5kIGRpcmVjdG9yeS4gKi8KLQkgICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCQl7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSBiZmRfZ2V0XzMyIChhYmZkLCBsYXN0X3N0YWIgKyBWQUxPRkYpOwotCQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0ciA9IHN0cjsKLQkJICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gZGlyZWN0b3J5X25hbWU7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5mdW5jdGlvbl9uYW1lID0gTlVMTDsKLQkJICArK2k7Ci0JCX0KLQkgICAgICBzYXdfZnVuID0gMDsKLQkgICAgICAKLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgIGlmICgqZmlsZV9uYW1lID09ICdcMCcpCi0JCXsKLQkJICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0JCSAgZmlsZV9uYW1lID0gTlVMTDsKLQkJICBzYXdfZnVuID0gMTsKLQkJfQotCSAgICAgIGVsc2UgewotCQlsYXN0X3N0YWIgPSBzdGFiOwotCQlpZiAoc3RhYiArIFNUQUJTSVpFID49IGluZm8tPnN0YWJzICsgc3RhYnNpemUKLQkJICAgIHx8ICooc3RhYiArIFNUQUJTSVpFICsgVFlQRU9GRikgIT0gTl9TTykKLQkJICB7Ci0JCSAgICBkaXJlY3RvcnlfbmFtZSA9IE5VTEw7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogVHdvIGNvbnNlY3V0aXZlIE5fU09zIGFyZSBhIGRpcmVjdG9yeSBhbmQgYSBmaWxlCi0JCSAgICAgICBuYW1lLiAgKi8KLQkJICAgIHN0YWIgKz0gU1RBQlNJWkU7Ci0JCSAgICBkaXJlY3RvcnlfbmFtZSA9IGZpbGVfbmFtZTsKLQkJICAgIGZpbGVfbmFtZSA9ICgoY2hhciAqKSBzdHIKLQkJCQkgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TT0w6Ci0JICAgICAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9GVU46Ci0JICAgICAgLyogQSBmdW5jdGlvbiBuYW1lLiAgKi8KLQkgICAgICBzYXdfZnVuID0gMTsKLQkgICAgICBuYW1lID0gKGNoYXIgKikgc3RyICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFNUUkRYT0ZGKTsKLQotCSAgICAgIGlmICgqbmFtZSA9PSAnXDAnKQotCQluYW1lID0gTlVMTDsKLQotCSAgICAgIGZ1bmN0aW9uX25hbWUgPSBuYW1lOwotCi0JICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IHN0YWI7Ci0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0JICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gZmlsZV9uYW1lOwotCSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IGZ1bmN0aW9uX25hbWU7Ci0JICAgICAgKytpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc2F3X2Z1biA9PSAwKQotCXsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0udmFsID0gYmZkX2dldF8zMiAoYWJmZCwgbGFzdF9zdGFiICsgVkFMT0ZGKTsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RhYiA9IGxhc3Rfc3RhYjsKLQkgIGluZm8tPmluZGV4dGFibGVbaV0uc3RyID0gc3RyOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5kaXJlY3RvcnlfbmFtZSA9IGRpcmVjdG9yeV9uYW1lOwotCSAgaW5mby0+aW5kZXh0YWJsZVtpXS5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0JICBpbmZvLT5pbmRleHRhYmxlW2ldLmZ1bmN0aW9uX25hbWUgPSBOVUxMOwotCSAgKytpOwotCX0KLQotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS52YWwgPSAoYmZkX3ZtYSkgLTE7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLnN0YWIgPSBpbmZvLT5zdGFicyArIHN0YWJzaXplOwotICAgICAgaW5mby0+aW5kZXh0YWJsZVtpXS5zdHIgPSBzdHI7Ci0gICAgICBpbmZvLT5pbmRleHRhYmxlW2ldLmRpcmVjdG9yeV9uYW1lID0gTlVMTDsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZmlsZV9uYW1lID0gTlVMTDsKLSAgICAgIGluZm8tPmluZGV4dGFibGVbaV0uZnVuY3Rpb25fbmFtZSA9IE5VTEw7Ci0gICAgICArK2k7Ci0KLSAgICAgIGluZm8tPmluZGV4dGFibGVzaXplID0gaTsKLSAgICAgIHFzb3J0IChpbmZvLT5pbmRleHRhYmxlLCBpLCBzaXplb2YgKHN0cnVjdCBpbmRleGVudHJ5KSwgY21waW5kZXhlbnRyeSk7Ci0KLSAgICAgICpwaW5mbyA9IChQVFIpIGluZm87Ci0gICAgfQotCi0gIC8qIFdlIGFyZSBwYXNzZWQgYSBzZWN0aW9uIHJlbGF0aXZlIG9mZnNldC4gIFRoZSBvZmZzZXRzIGluIHRoZQotICAgICBzdGFicyBpbmZvcm1hdGlvbiBhcmUgYWJzb2x1dGUuICAqLwotICBvZmZzZXQgKz0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjdGlvbik7Ci0KLSNpZmRlZiBFTkFCTEVfQ0FDSElORwotICBpZiAoaW5mby0+Y2FjaGVkX2luZGV4ZW50cnkgIT0gTlVMTAotICAgICAgJiYgb2Zmc2V0ID49IGluZm8tPmNhY2hlZF9vZmZzZXQKLSAgICAgICYmIG9mZnNldCA8IChpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSArIDEpLT52YWwpCi0gICAgewotICAgICAgc3RhYiA9IGluZm8tPmNhY2hlZF9zdGFiOwotICAgICAgaW5kZXhlbnRyeSA9IGluZm8tPmNhY2hlZF9pbmRleGVudHJ5OwotICAgICAgZmlsZV9uYW1lID0gaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIC8qIENhY2hlIG5vbi1leGlzdGFudCBvciBpbnZhbGlkLiAgRG8gYmluYXJ5IHNlYXJjaCBvbgotICAgICAgICAgaW5kZXh0YWJsZS4gICovCi0KLSAgICAgIGxvbmcgbG93LCBoaWdoOwotICAgICAgbG9uZyBtaWQgPSAtMTsKLQotICAgICAgaW5kZXhlbnRyeSA9IE5VTEw7Ci0KLSAgICAgIGxvdyA9IDA7Ci0gICAgICBoaWdoID0gaW5mby0+aW5kZXh0YWJsZXNpemUgLSAxOwotICAgICAgd2hpbGUgKGxvdyAhPSBoaWdoKQotCXsKLQkgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0JICBpZiAob2Zmc2V0ID49IGluZm8tPmluZGV4dGFibGVbbWlkXS52YWwKLQkgICAgICAmJiBvZmZzZXQgPCBpbmZvLT5pbmRleHRhYmxlW21pZCArIDFdLnZhbCkKLQkgICAgewotCSAgICAgIGluZGV4ZW50cnkgPSAmaW5mby0+aW5kZXh0YWJsZVttaWRdOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5pbmRleHRhYmxlW21pZF0udmFsID4gb2Zmc2V0KQotCSAgICBoaWdoID0gbWlkOwotCSAgZWxzZQotCSAgICBsb3cgPSBtaWQgKyAxOwotCX0KLQotICAgICAgaWYgKGluZGV4ZW50cnkgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgc3RhYiA9IGluZGV4ZW50cnktPnN0YWIgKyBTVEFCU0laRTsKLSAgICAgIGZpbGVfbmFtZSA9IGluZGV4ZW50cnktPmZpbGVfbmFtZTsKLSAgICB9Ci0KLSAgZGlyZWN0b3J5X25hbWUgPSBpbmRleGVudHJ5LT5kaXJlY3RvcnlfbmFtZTsKLSAgc3RyID0gaW5kZXhlbnRyeS0+c3RyOwotCi0gIGZvciAoOyBzdGFiIDwgKGluZGV4ZW50cnkrMSktPnN0YWI7IHN0YWIgKz0gU1RBQlNJWkUpCi0gICAgewotICAgICAgYm9vbGVhbiBkb25lOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0KLSAgICAgIGRvbmUgPSBmYWxzZTsKLQotICAgICAgc3dpdGNoIChzdGFiW1RZUEVPRkZdKQotCXsKLQljYXNlIE5fU09MOgotCSAgLyogVGhlIG5hbWUgb2YgYW4gaW5jbHVkZSBmaWxlLiAgKi8KLQkgIHZhbCA9IGJmZF9nZXRfMzIgKGFiZmQsIHN0YWIgKyBWQUxPRkYpOwotCSAgaWYgKHZhbCA8PSBvZmZzZXQpCi0JICAgIHsKLQkgICAgICBmaWxlX25hbWUgPSAoY2hhciAqKSBzdHIgKyBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiICsgU1RSRFhPRkYpOwotCSAgICAgICpwbGluZSA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBOX1NMSU5FOgotCWNhc2UgTl9EU0xJTkU6Ci0JY2FzZSBOX0JTTElORToKLQkgIC8qIEEgbGluZSBudW1iZXIuICBUaGUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQotICAgICAgICAgICAgIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCSAgdmFsID0gaW5kZXhlbnRyeS0+dmFsICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIFZBTE9GRik7Ci0JICBpZiAodmFsIDw9IG9mZnNldCkKLQkgICAgewotCSAgICAgICpwbGluZSA9IGJmZF9nZXRfMTYgKGFiZmQsIHN0YWIgKyBERVNDT0ZGKTsKLQotI2lmZGVmIEVOQUJMRV9DQUNISU5HCi0JICAgICAgaW5mby0+Y2FjaGVkX3N0YWIgPSBzdGFiOwotCSAgICAgIGluZm8tPmNhY2hlZF9vZmZzZXQgPSB2YWw7Ci0JICAgICAgaW5mby0+Y2FjaGVkX2ZpbGVfbmFtZSA9IGZpbGVfbmFtZTsKLQkgICAgICBpbmZvLT5jYWNoZWRfaW5kZXhlbnRyeSA9IGluZGV4ZW50cnk7Ci0jZW5kaWYKLQkgICAgfQotCSAgaWYgKHZhbCA+IG9mZnNldCkKLQkgICAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgTl9GVU46Ci0JY2FzZSBOX1NPOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChkb25lKQotCWJyZWFrOwotICAgIH0KLQotICAqcGZvdW5kID0gdHJ1ZTsKLQotICBpZiAoZmlsZV9uYW1lWzBdID09ICcvJyB8fCBkaXJlY3RvcnlfbmFtZSA9PSBOVUxMKQotICAgICpwZmlsZW5hbWUgPSBmaWxlX25hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzaXplX3QgZGlybGVuOwotCi0gICAgICBkaXJsZW4gPSBzdHJsZW4gKGRpcmVjdG9yeV9uYW1lKTsKLSAgICAgIGlmIChpbmZvLT5maWxlbmFtZSA9PSBOVUxMCi0JICB8fCBzdHJuY21wIChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUsIGRpcmxlbikgIT0gMAotCSAgfHwgc3RyY21wIChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKSAhPSAwKQotCXsKLQkgIGlmIChpbmZvLT5maWxlbmFtZSAhPSBOVUxMKQotCSAgICBmcmVlIChpbmZvLT5maWxlbmFtZSk7Ci0JICBpbmZvLT5maWxlbmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKGRpcmxlbiArCi0JCQkJCQlzdHJsZW4gKGZpbGVfbmFtZSkKLQkJCQkJCSsgMSk7Ci0JICBpZiAoaW5mby0+ZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSwgZGlyZWN0b3J5X25hbWUpOwotCSAgc3RyY3B5IChpbmZvLT5maWxlbmFtZSArIGRpcmxlbiwgZmlsZV9uYW1lKTsKLQl9Ci0KLSAgICAgICpwZmlsZW5hbWUgPSBpbmZvLT5maWxlbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotCi0gICAgICAvKiBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWV0aGluZyBsaWtlIG1haW46RigwLDEpLCBzbyB3ZSB3YW50Ci0gICAgICAgICB0byBjbG9iYmVyIHRoZSBjb2xvbi4gIEl0J3MgT0sgdG8gY2hhbmdlIHRoZSBuYW1lLCBzaW5jZSB0aGUKLSAgICAgICAgIHN0cmluZyBpcyBpbiBvdXIgb3duIGxvY2FsIHN0b3JhZ2UgYW55aG93LiAgKi8KLQotICAgICAgcyA9IHN0cmNociAoaW5kZXhlbnRyeS0+ZnVuY3Rpb25fbmFtZSwgJzonKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JKnMgPSAnXDAnOwotCi0gICAgICAqcGZubmFtZSA9IGluZGV4ZW50cnktPmZ1bmN0aW9uX25hbWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3N5c2RlcC5oIGIvYmZkL3N5c2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTU4OTgzLi4wMDAwMDAwCi0tLSBhL2JmZC9zeXNkZXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKiBzeXNkZXAuaCAtLSBoYW5kbGUgaG9zdCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBCRkQgbGlicmFyeQotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgQkZEX1NZU0RFUF9ICi0jZGVmaW5lIEJGRF9TWVNERVBfSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9TVERERUZfSAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmICEoZGVmaW5lZChlcnJubykgfHwgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChfSU5DX0VSUk5PKSkKLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKnN0cmNociAoKTsKLWV4dGVybiBjaGFyICpzdHJyY2hyICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9CSU5BUllfRk9QRU4KLSNpbmNsdWRlICJmb3Blbi1iaW4uaCIKLSNlbHNlCi0jaW5jbHVkZSAiZm9wZW4tc2FtZS5oIgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBPX1JET05MWQotI2RlZmluZSBPX1JET05MWSAwCi0jZW5kaWYKLSNpZm5kZWYgT19XUk9OTFkKLSNkZWZpbmUgT19XUk9OTFkgMQotI2VuZGlmCi0jaWZuZGVmIE9fUkRXUgotI2RlZmluZSBPX1JEV1IgMgotI2VuZGlmCi0jaWZuZGVmIE9fQUNDTU9ERQotI2RlZmluZSBPX0FDQ01PREUgKE9fUkRPTkxZIHwgT19XUk9OTFkgfCBPX1JEV1IpCi0jZW5kaWYKLQotI2lmbmRlZiBTRUVLX1NFVAotI2RlZmluZSBTRUVLX1NFVCAwCi0jZW5kaWYKLSNpZm5kZWYgU0VFS19DVVIKLSNkZWZpbmUgU0VFS19DVVIgMQotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotZXh0ZXJuIGNoYXIgKnN0cnN0ciAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLWV4dGVybiBQVFIgbWFsbG9jICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1JFQUxMT0MKLWV4dGVybiBQVFIgcmVhbGxvYyAoKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotZXh0ZXJuIGNoYXIgKmdldGVudiAoKTsKLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotI2luY2x1ZGUgPGxpYmludGwuaD4KLSNkZWZpbmUgXyhTdHJpbmcpIGRnZXR0ZXh0IChQQUNLQUdFLCBTdHJpbmcpCi0jaWZkZWYgZ2V0dGV4dF9ub29wCi0jZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jZWxzZQotI2RlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotI2RlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSNkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSNkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotI2RlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotI2RlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSNkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCi0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKEJGRF9TWVNERVBfSCkgKi8KZGlmZiAtLWdpdCBhL2JmZC90YXJnZXRzLmMgYi9iZmQvdGFyZ2V0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRjMjY4Li4wMDAwMDAwCi0tLSBhL2JmZC90YXJnZXRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgxICswLDAgQEAKLS8qIEdlbmVyaWMgdGFyZ2V0LWZpbGUtdHlwZSBzdXBwb3J0IGZvciB0aGUgQkZEIGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotI2luY2x1ZGUgImZubWF0Y2guaCIKLQotLyoKLVNFQ1RJT04gCi0JVGFyZ2V0cwotCi1ERVNDUklQVElPTgotCUVhY2ggcG9ydCBvZiBCRkQgdG8gYSBkaWZmZXJlbnQgbWFjaGluZSByZXF1cmllcyB0aGUgY3JlYXRpb24KLQlvZiBhIHRhcmdldCBiYWNrIGVuZC4gQWxsIHRoZSBiYWNrIGVuZCBwcm92aWRlcyB0byB0aGUgcm9vdAotCXBhcnQgb2YgQkZEIGlzIGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gZnVuY3Rpb25zCi0Jd2hpY2ggcGVyZm9ybSBjZXJ0YWluIGxvdyBsZXZlbCBvcGVyYXRpb25zIG9uIGZpbGVzLiBCRkQKLQl0cmFuc2xhdGVzIHRoZSBhcHBsaWNhdGlvbnMncyByZXF1ZXN0cyB0aHJvdWdoIGEgcG9pbnRlciBpbnRvCi0JY2FsbHMgdG8gdGhlIGJhY2sgZW5kIHJvdXRpbmVzLiAKLQotCVdoZW4gYSBmaWxlIGlzIG9wZW5lZCB3aXRoIDw8YmZkX29wZW5yPj4sIGl0cyBmb3JtYXQgYW5kCi0JdGFyZ2V0IGFyZSB1bmtub3duLiBCRkQgdXNlcyB2YXJpb3VzIG1lY2hhbmlzbXMgdG8gZGV0ZXJtaW5lCi0JaG93IHRvIGludGVycHJldCB0aGUgZmlsZS4gVGhlIG9wZXJhdGlvbnMgcGVyZm9ybWVkIGFyZToKLQotCW8gQ3JlYXRlIGEgQkZEIGJ5IGNhbGxpbmcgdGhlIGludGVybmFsIHJvdXRpbmUKLQk8PF9iZmRfbmV3X2JmZD4+LCB0aGVuIGNhbGwgPDxiZmRfZmluZF90YXJnZXQ+PiB3aXRoIHRoZQotCXRhcmdldCBzdHJpbmcgc3VwcGxpZWQgdG8gPDxiZmRfb3BlbnI+PiBhbmQgdGhlIG5ldyBCRkQgcG9pbnRlci4gCi0KLQlvIElmIGEgbnVsbCB0YXJnZXQgc3RyaW5nIHdhcyBwcm92aWRlZCB0byA8PGJmZF9maW5kX3RhcmdldD4+LAotCWxvb2sgdXAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDw8R05VVEFSR0VUPj4gYW5kIHVzZQotCXRoYXQgYXMgdGhlIHRhcmdldCBzdHJpbmcuIAotCi0JbyBJZiB0aGUgdGFyZ2V0IHN0cmluZyBpcyBzdGlsbCA8PE5VTEw+Piwgb3IgdGhlIHRhcmdldCBzdHJpbmcgaXMKLQk8PGRlZmF1bHQ+PiwgdGhlbiB1c2UgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHRhcmdldCB2ZWN0b3IKLQlhcyB0aGUgdGFyZ2V0IHR5cGUsIGFuZCBzZXQgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaW4gdGhlIEJGRCB0bwotCWNhdXNlIDw8YmZkX2NoZWNrX2Zvcm1hdD4+IHRvIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHRhcmdldHMuCi0JQHhyZWZ7YmZkX3RhcmdldH0uICBAeHJlZntGb3JtYXRzfS4KLQotCW8gT3RoZXJ3aXNlLCBpbnNwZWN0IHRoZSBlbGVtZW50cyBpbiB0aGUgdGFyZ2V0IHZlY3RvcgotCW9uZSBieSBvbmUsIHVudGlsIGEgbWF0Y2ggb24gdGFyZ2V0IG5hbWUgaXMgZm91bmQuIFdoZW4gZm91bmQsCi0JdXNlIGl0LiAKLQotCW8gT3RoZXJ3aXNlIHJldHVybiB0aGUgZXJyb3IgPDxiZmRfZXJyb3JfaW52YWxpZF90YXJnZXQ+PiB0bwotCTw8YmZkX29wZW5yPj4uCi0KLQlvIDw8YmZkX29wZW5yPj4gYXR0ZW1wdHMgdG8gb3BlbiB0aGUgZmlsZSB1c2luZwotCTw8YmZkX29wZW5fZmlsZT4+LCBhbmQgcmV0dXJucyB0aGUgQkZELgotCi0JT25jZSB0aGUgQkZEIGhhcyBiZWVuIG9wZW5lZCBhbmQgdGhlIHRhcmdldCBzZWxlY3RlZCwgdGhlIGZpbGUKLQlmb3JtYXQgbWF5IGJlIGRldGVybWluZWQuIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nCi0JPDxiZmRfY2hlY2tfZm9ybWF0Pj4gb24gdGhlIEJGRCB3aXRoIGEgc3VnZ2VzdGVkIGZvcm1hdC4gCi0JSWYgPDx0YXJnZXRfZGVmYXVsdGVkPj4gaGFzIGJlZW4gc2V0LCBlYWNoIHBvc3NpYmxlIHRhcmdldAotCXR5cGUgaXMgdHJpZWQgdG8gc2VlIGlmIGl0IHJlY29nbml6ZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQuCi0JPDxiZmRfY2hlY2tfZm9ybWF0Pj4gcmV0dXJucyA8PHRydWU+PiB3aGVuIHRoZSBjYWxsZXIgZ3Vlc3NlcyByaWdodC4KLUBtZW51Ci1AKiBiZmRfdGFyZ2V0OjoKLUBlbmQgbWVudQotKi8KLQotCi0vKgotCi1JTk9ERQotCWJmZF90YXJnZXQsICAsIFRhcmdldHMsIFRhcmdldHMKLURPQ0RECi1TVUJTRUNUSU9OCi0JYmZkX3RhcmdldAotCi1ERVNDUklQVElPTgotCVRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdGhhdCBCRkQga25vd3MgYWJvdXQgYQotCXRhcmdldC4gSXQgaW5jbHVkZXMgdGhpbmdzIGxpa2UgaXRzIGJ5dGUgb3JkZXIsIG5hbWUsIGFuZCB3aGljaAotCXJvdXRpbmVzIHRvIGNhbGwgdG8gZG8gdmFyaW91cyBvcGVyYXRpb25zLiAgIAotCi0JRXZlcnkgQkZEIHBvaW50cyB0byBhIHRhcmdldCBzdHJ1Y3R1cmUgd2l0aCBpdHMgPDx4dmVjPj4KLQltZW1iZXIuIAotCi0JVGhlIG1hY3JvcyBiZWxvdyBhcmUgdXNlZCB0byBkaXNwYXRjaCB0byBmdW5jdGlvbnMgdGhyb3VnaCB0aGUKLQk8PGJmZF90YXJnZXQ+PiB2ZWN0b3IuIFRoZXkgYXJlIHVzZWQgaW4gYSBudW1iZXIgb2YgbWFjcm9zIGZ1cnRoZXIKLQlkb3duIGluIEBmaWxle2JmZC5ofSwgYW5kIGFyZSBhbHNvIHVzZWQgd2hlbiBjYWxsaW5nIHZhcmlvdXMKLQlyb3V0aW5lcyBieSBoYW5kIGluc2lkZSB0aGUgQkZEIGltcGxlbWVudGF0aW9uLiAgVGhlIEB2YXJ7YXJnbGlzdH0KLQlhcmd1bWVudCBtdXN0IGJlIHBhcmVudGhlc2l6ZWQ7IGl0IGNvbnRhaW5zIGFsbCB0aGUgYXJndW1lbnRzCi0JdG8gdGhlIGNhbGxlZCBmdW5jdGlvbi4gCi0KLQlUaGV5IG1ha2UgdGhlIGRvY3VtZW50YXRpb24gKG1vcmUpIHVucGxlYXNhbnQgdG8gcmVhZCwgc28gaWYKLQlzb21lb25lIHdhbnRzIHRvIGZpeCB0aGlzIGFuZCBub3QgYnJlYWsgdGhlIGFib3ZlLCBwbGVhc2UgZG8uCi0KLS4jZGVmaW5lIEJGRF9TRU5EKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgICAgICAgICAgICAgICgoKigoYmZkKS0+eHZlYy0+bWVzc2FnZSkpIGFyZ2xpc3QpCi0uCi0uI2lmZGVmIERFQlVHX0JGRF9TRU5ECi0uI3VuZGVmIEJGRF9TRU5ECi0uI2RlZmluZSBCRkRfU0VORChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotLiAgICAoKCooKGJmZCktPnh2ZWMtPm1lc3NhZ2UpKSBhcmdsaXN0KSA6IFwKLS4gICAgKGJmZF9hc3NlcnQgKF9fRklMRV9fLF9fTElORV9fKSwgTlVMTCkpCi0uI2VuZGlmCi0KLQlGb3Igb3BlcmF0aW9ucyB3aGljaCBpbmRleCBvbiB0aGUgQkZEIGZvcm1hdDoKLQotLiNkZWZpbmUgQkZEX1NFTkRfRk1UKGJmZCwgbWVzc2FnZSwgYXJnbGlzdCkgXAotLiAgICAgICAgICAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KQotLgotLiNpZmRlZiBERUJVR19CRkRfU0VORAotLiN1bmRlZiBCRkRfU0VORF9GTVQKLS4jZGVmaW5lIEJGRF9TRU5EX0ZNVChiZmQsIG1lc3NhZ2UsIGFyZ2xpc3QpIFwKLS4gICgoKGJmZCkgJiYgKGJmZCktPnh2ZWMgJiYgKGJmZCktPnh2ZWMtPm1lc3NhZ2UpID8gXAotLiAgICgoKGJmZCktPnh2ZWMtPm1lc3NhZ2VbKGludCkoKGJmZCktPmZvcm1hdCldKSBhcmdsaXN0KSA6IFwKLS4gICAoYmZkX2Fzc2VydCAoX19GSUxFX18sX19MSU5FX18pLCBOVUxMKSkKLS4jZW5kaWYKLQotCVRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3aGljaCBkZWZpbmVzIHRoZSB0eXBlIG9mIEJGRCB0aGlzIGlzLiAgVGhlCi0JPDx4dmVjPj4gbWVtYmVyIG9mIHRoZSBzdHJ1Y3QgPDxiZmQ+PiBpdHNlbGYgcG9pbnRzIGhlcmUuICBFYWNoCi0JbW9kdWxlIHRoYXQgaW1wbGVtZW50cyBhY2Nlc3MgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0IHVuZGVyIEJGRCwKLQlkZWZpbmVzIG9uZSBvZiB0aGVzZS4KLQotCi0JRklYTUUsIHRoZXNlIG5hbWVzIHNob3VsZCBiZSByYXRpb25hbGlzZWQgd2l0aCB0aGUgbmFtZXMgb2YKLQl0aGUgZW50cnkgcG9pbnRzIHdoaWNoIGNhbGwgdGhlbS4gVG9vIGJhZCB3ZSBjYW4ndCBoYXZlIG9uZQotCW1hY3JvIHRvIGRlZmluZSB0aGVtIGJvdGghIAotCi0uZW51bSBiZmRfZmxhdm91ciB7Ci0uICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9pZWVlX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X25sbV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vYXN5c19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF90ZWtoZXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfc3JlY19mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9paGV4X2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3NvbV9mbGF2b3VyLAotLiAgYmZkX3RhcmdldF9vczlrX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X3ZlcnNhZG9zX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X21zZG9zX2ZsYXZvdXIsCi0uICBiZmRfdGFyZ2V0X292YXhfZmxhdm91ciwKLS4gIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCi0ufTsKLS4KLS5lbnVtIGJmZF9lbmRpYW4geyBCRkRfRU5ESUFOX0JJRywgQkZEX0VORElBTl9MSVRUTEUsIEJGRF9FTkRJQU5fVU5LTk9XTiB9OwotLgotLnsqIEZvcndhcmQgZGVjbGFyYXRpb24uICAqfQotLnR5cGVkZWYgc3RydWN0IGJmZF9saW5rX2luZm8gX2JmZF9saW5rX2luZm87Ci0uCi0udHlwZWRlZiBzdHJ1Y3QgYmZkX3RhcmdldAotLnsKLQotSWRlbnRpZmllcyB0aGUga2luZCBvZiB0YXJnZXQsIGUuZy4sIFN1bk9TNCwgVWx0cml4LCBldGMuCi0KLS4gIGNoYXIgKm5hbWU7Ci0KLVRoZSAiZmxhdm91ciIgb2YgYSBiYWNrIGVuZCBpcyBhIGdlbmVyYWwgaW5kaWNhdGlvbiBhYm91dCB0aGUgY29udGVudHMKLW9mIGEgZmlsZS4KLQotLiAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotCi1UaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBkYXRhIGFyZWEgb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9lbmRpYW4gYnl0ZW9yZGVyOwotCi1UaGUgb3JkZXIgb2YgYnl0ZXMgd2l0aGluIHRoZSBoZWFkZXIgcGFydHMgb2YgYSBmaWxlLgotCi0uICBlbnVtIGJmZF9lbmRpYW4gaGVhZGVyX2J5dGVvcmRlcjsKLQotQSBtYXNrIG9mIGFsbCB0aGUgZmxhZ3Mgd2hpY2ggYW4gZXhlY3V0YWJsZSBtYXkgaGF2ZSBzZXQgLQotZnJvbSB0aGUgc2V0IDw8QkZEX05PX0ZMQUdTPj4sIDw8SEFTX1JFTE9DPj4sIC4uLjw8RF9QQUdFRD4+LgotCi0uICBmbGFnd29yZCBvYmplY3RfZmxhZ3M7ICAgICAgIAotCi1BIG1hc2sgb2YgYWxsIHRoZSBmbGFncyB3aGljaCBhIHNlY3Rpb24gbWF5IGhhdmUgc2V0IC0gZnJvbQotdGhlIHNldCA8PFNFQ19OT19GTEFHUz4+LCA8PFNFQ19BTExPQz4+LCAuLi48PFNFVF9ORVZFUl9MT0FEPj4uCi0KLS4gIGZsYWd3b3JkIHNlY3Rpb25fZmxhZ3M7Ci0KLVRoZSBjaGFyYWN0ZXIgbm9ybWFsbHkgZm91bmQgYXQgdGhlIGZyb250IG9mIGEgc3ltYm9sIAotKGlmIGFueSksIHBlcmhhcHMgYF8nLgotCi0uICBjaGFyIHN5bWJvbF9sZWFkaW5nX2NoYXI7Ci0KLVRoZSBwYWQgY2hhcmFjdGVyIGZvciBmaWxlIG5hbWVzIHdpdGhpbiBhbiBhcmNoaXZlIGhlYWRlci4KLQotLiAgY2hhciBhcl9wYWRfY2hhcjsgICAgICAgICAgICAKLQotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYW4gYXJjaGl2ZSBoZWFkZXIuCi0KLS4gIHVuc2lnbmVkIHNob3J0IGFyX21heF9uYW1lbGVuOwotCi1FbnRyaWVzIGZvciBieXRlIHN3YXBwaW5nIGZvciBkYXRhLiBUaGVzZSBhcmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyCi1lbnRyeSBwb2ludHMsIHNpbmNlIHRoZXkgZG9uJ3QgdGFrZSBhIEJGRCBhc3RoZSBmaXJzdCBhcmd1bWVudC4KLUNlcnRhaW4gb3RoZXIgaGFuZGxlcnMgY291bGQgZG8gdGhlIHNhbWUuCi0KLS4gIGJmZF92bWEgICAgICAoKmJmZF9nZXR4NjQpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfcHV0eDY0KSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfZ2V0eDMyKSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX3B1dHgzMikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2dldHgxNikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9wdXR4MTYpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLQotQnl0ZSBzd2FwcGluZyBmb3IgdGhlIGhlYWRlcnMKLQotLiAgYmZkX3ZtYSAgICAgICgqYmZkX2hfZ2V0eDY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfc2lnbmVkX3ZtYSAoKmJmZF9oX2dldHhfc2lnbmVkXzY0KSBQQVJBTVMgKChjb25zdCBiZmRfYnl0ZSAqKSk7Ci0uICB2b2lkICAgICAgICAgKCpiZmRfaF9wdXR4NjQpIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICopKTsKLS4gIGJmZF92bWEgICAgICAoKmJmZF9oX2dldHgzMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgYmZkX3NpZ25lZF92bWEgKCpiZmRfaF9nZXR4X3NpZ25lZF8zMikgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKikpOwotLiAgdm9pZCAgICAgICAgICgqYmZkX2hfcHV0eDMyKSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfYnl0ZSAqKSk7Ci0uICBiZmRfdm1hICAgICAgKCpiZmRfaF9nZXR4MTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIGJmZF9zaWduZWRfdm1hICgqYmZkX2hfZ2V0eF9zaWduZWRfMTYpIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKTsKLS4gIHZvaWQgICAgICAgICAoKmJmZF9oX3B1dHgxNikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpOwotCi1Gb3JtYXQgZGVwZW5kZW50IHJvdXRpbmVzOiB0aGVzZSBhcmUgdmVjdG9ycyBvZiBlbnRyeSBwb2ludHMKLXdpdGhpbiB0aGUgdGFyZ2V0IHZlY3RvciBzdHJ1Y3R1cmUsIG9uZSBmb3IgZWFjaCBmb3JtYXQgdG8gY2hlY2suCi0KLUNoZWNrIHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHJlYWQuICBSZXR1cm4gYSA8PGJmZF90YXJnZXQgKj4+IG9yIHplcm8uIAotCi0uICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqKCpfYmZkX2NoZWNrX2Zvcm1hdFtiZmRfdHlwZV9lbmRdKSBQQVJBTVMgKChiZmQgKikpOwotCi1TZXQgdGhlIGZvcm1hdCBvZiBhIGZpbGUgYmVpbmcgd3JpdHRlbi4gIAotCi0uICBib29sZWFuICAgICAgICAgICAgICgqX2JmZF9zZXRfZm9ybWF0W2JmZF90eXBlX2VuZF0pIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLVdyaXRlIGNhY2hlZCBpbmZvcm1hdGlvbiBpbnRvIGEgZmlsZSBiZWluZyB3cml0dGVuLCBhdCA8PGJmZF9jbG9zZT4+LiAKLQotLiAgYm9vbGVhbiAgICAgICAgICAgICAoKl9iZmRfd3JpdGVfY29udGVudHNbYmZkX3R5cGVfZW5kXSkgUEFSQU1TICgoYmZkICopKTsKLQotVGhlIGdlbmVyYWwgdGFyZ2V0IHZlY3Rvci4KLQotLgotLiAgeyogR2VuZXJpYyBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfR0VORVJJQyhOQU1FKVwKLS5DQVQoTkFNRSxfY2xvc2VfYW5kX2NsZWFudXApLFwKLS5DQVQoTkFNRSxfYmZkX2ZyZWVfY2FjaGVkX2luZm8pLFwKLS5DQVQoTkFNRSxfbmV3X3NlY3Rpb25faG9vayksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50cyksXAotLkNBVChOQU1FLF9nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cpCi0uCi0uICB7KiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqfQotLiAgYm9vbGVhbiAgICAgICAoKl9jbG9zZV9hbmRfY2xlYW51cCkgUEFSQU1TICgoYmZkICopKTsKLS4gIHsqIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICp9Ci0uICBib29sZWFuICgqX2JmZF9mcmVlX2NhY2hlZF9pbmZvKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogQ2FsbGVkIHdoZW4gYSBuZXcgc2VjdGlvbiBpcyBjcmVhdGVkLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfbmV3X3NlY3Rpb25faG9vaykgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIHsqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9nZXRfc2VjdGlvbl9jb250ZW50cykgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIFBUUiwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSkpOwotLiAgYm9vbGVhbiAgICAgICAoKl9iZmRfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93KQotLiAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYmZkICosIHNlY19wdHIsIGJmZF93aW5kb3cgKiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdG8gY29weSBwcml2YXRlIGRhdGEuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09QWShOQU1FKVwKLS5DQVQoTkFNRSxfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfbWVyZ2VfcHJpdmF0ZV9iZmRfZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3NlY3Rpb25fZGF0YSksXAotLkNBVChOQU1FLF9iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKSxcCi0uQ0FUKE5BTUUsX2JmZF9zZXRfcHJpdmF0ZV9mbGFncyksXAotLkNBVChOQU1FLF9iZmRfcHJpbnRfcHJpdmF0ZV9iZmRfZGF0YSlcCi0uICB7KiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLS4gICAgIHRvIGFub3RoZXIuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uICB7KiBDYWxsZWQgdG8gbWVyZ2UgQkZEIGdlbmVyYWwgcHJpdmF0ZSBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhIGNvbW1vbiBvdXRwdXQgZmlsZSB3aGVuIGxpbmtpbmcuICAqfQotLiAgYm9vbGVhbgkgKCpfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc2VjdGlvbiBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0uICAgICB0byBhbm90aGVyLiAgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmQgKiwgc2VjX3B0cikpOwotLiAgeyogQ2FsbGVkIHRvIGNvcHkgQkZEIHByaXZhdGUgc3ltYm9sIGRhdGEgZnJvbSBvbmUgc3ltYm9sIAotLiAgICAgdG8gYW5vdGhlci4gICp9Ci0uICBib29sZWFuICAgICAgICgqX2JmZF9jb3B5X3ByaXZhdGVfc3ltYm9sX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosCi0uCQkJCQkJCSAgIGJmZCAqLCBhc3ltYm9sICopKTsKLS4gIHsqIENhbGxlZCB0byBzZXQgcHJpdmF0ZSBiYWNrZW5kIGZsYWdzICp9Ci0uICBib29sZWFuCSAoKl9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MpIFBBUkFNUyAoKGJmZCAqLCBmbGFnd29yZCkpOwotLgotLiAgeyogQ2FsbGVkIHRvIHByaW50IHByaXZhdGUgQkZEIGRhdGEgKn0KLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEpIFBBUkFNUyAoKGJmZCAqLCBQVFIpKTsKLS4KLS4gIHsqIENvcmUgZmlsZSBlbnRyeSBwb2ludHMuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfQ09SRShOQU1FKVwKLS5DQVQoTkFNRSxfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCksXAotLkNBVChOQU1FLF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwpLFwKLS5DQVQoTkFNRSxfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wKQotLiAgY2hhciAqICAgKCpfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGludCAgICAgICgqX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCkgUEFSQU1TICgoYmZkICosIGJmZCAqKSk7Ci0uCi0uICB7KiBBcmNoaXZlIGVudHJ5IHBvaW50cy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9BUkNISVZFKE5BTUUpXAotLkNBVChOQU1FLF9zbHVycF9hcm1hcCksXAotLkNBVChOQU1FLF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKSxcCi0uQ0FUKE5BTUUsX3RydW5jYXRlX2FybmFtZSksXAotLkNBVChOQU1FLF93cml0ZV9hcm1hcCksXAotLkNBVChOQU1FLF9yZWFkX2FyX2hkciksXAotLkNBVChOQU1FLF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUpLFwKLS5DQVQoTkFNRSxfZ2V0X2VsdF9hdF9pbmRleCksXAotLkNBVChOQU1FLF9nZW5lcmljX3N0YXRfYXJjaF9lbHQpLFwKLS5DQVQoTkFNRSxfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCkKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9hcm1hcCkgUEFSQU1TICgoYmZkICopKTsKLS4gIGJvb2xlYW4gICgqX2JmZF9zbHVycF9leHRlbmRlZF9uYW1lX3RhYmxlKSBQQVJBTVMgKChiZmQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKQotLiAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgY2hhciAqKiwgYmZkX3NpemVfdHlwZSAqLCBjb25zdCBjaGFyICoqKSk7Ci0uICB2b2lkICAgICAoKl9iZmRfdHJ1bmNhdGVfYXJuYW1lKSBQQVJBTVMgKChiZmQgKiwgQ09OU1QgY2hhciAqLCBjaGFyICopKTsKLS4gIGJvb2xlYW4gICgqd3JpdGVfYXJtYXApIFBBUkFNUyAoKGJmZCAqYXJjaCwgCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW5ndGgsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9ybCAqbWFwLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcmxfY291bnQsIAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZHgpKTsKLS4gIFBUUiAoKl9iZmRfcmVhZF9hcl9oZHJfZm4pIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBiZmQgKiAgICAoKm9wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSkgUEFSQU1TICgoYmZkICphcmNoLCBiZmQgKnByZXYpKTsKLS4jZGVmaW5lIGJmZF9nZXRfZWx0X2F0X2luZGV4KGIsaSkgQkZEX1NFTkQoYiwgX2JmZF9nZXRfZWx0X2F0X2luZGV4LCAoYixpKSkKLS4gIGJmZCAqICAgICgqX2JmZF9nZXRfZWx0X2F0X2luZGV4KSBQQVJBTVMgKChiZmQgKiwgc3ltaW5kZXgpKTsKLS4gIGludCAgICAgICgqX2JmZF9zdGF0X2FyY2hfZWx0KSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHN0YXQgKikpOwotLiAgYm9vbGVhbiAgKCpfYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXApIFBBUkFNUyAoKGJmZCAqKSk7Ci0uCi0uICB7KiBFbnRyeSBwb2ludHMgdXNlZCBmb3Igc3ltYm9scy4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW10YWIpLFwKLS5DQVQoTkFNRSxfbWFrZV9lbXB0eV9zeW1ib2wpLFwKLS5DQVQoTkFNRSxfcHJpbnRfc3ltYm9sKSxcCi0uQ0FUKE5BTUUsX2dldF9zeW1ib2xfaW5mbyksXAotLkNBVChOQU1FLF9iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSksXAotLkNBVChOQU1FLF9nZXRfbGluZW5vKSxcCi0uQ0FUKE5BTUUsX2ZpbmRfbmVhcmVzdF9saW5lKSxcCi0uQ0FUKE5BTUUsX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCksXAotLkNBVChOQU1FLF9yZWFkX21pbmlzeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX21pbmlzeW1ib2xfdG9fc3ltYm9sKQotLiAgbG9uZyAgKCpfYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICBsb25nICAoKl9iZmRfY2Fub25pY2FsaXplX3N5bXRhYikgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAgKgotLiAgICAgICAgICAgICAgICAoKl9iZmRfbWFrZV9lbXB0eV9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqKSk7Ci0uICB2b2lkICAgICAgICAgICgqX2JmZF9wcmludF9zeW1ib2wpIFBBUkFNUyAoKGJmZCAqLCBQVFIsCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUpKTsKLS4jZGVmaW5lIGJmZF9wcmludF9zeW1ib2woYixwLHMsZSkgQkZEX1NFTkQoYiwgX2JmZF9wcmludF9zeW1ib2wsIChiLHAscyxlKSkKLS4gIHZvaWQgICAgICAgICAgKCpfYmZkX2dldF9zeW1ib2xfaW5mbykgUEFSQU1TICgoYmZkICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICosCi0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfaW5mbyAqKSk7Ci0uI2RlZmluZSBiZmRfZ2V0X3N5bWJvbF9pbmZvKGIscCxlKSBCRkRfU0VORChiLCBfYmZkX2dldF9zeW1ib2xfaW5mbywgKGIscCxlKSkKLS4gIGJvb2xlYW4JICgqX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lKSBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqKSk7Ci0uCi0uICBhbGVudCAqICAgICgqX2dldF9saW5lbm8pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICopKTsKLS4gIGJvb2xlYW4gICAgKCpfYmZkX2ZpbmRfbmVhcmVzdF9saW5lKSBQQVJBTVMgKChiZmQgKmFiZmQsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjICpzZWN0aW9uLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltYm9scywKLS4gICAgICAgICAgICAgICAgICAgIGJmZF92bWEgb2Zmc2V0LCBDT05TVCBjaGFyICoqZmlsZSwgQ09OU1QgY2hhciAqKmZ1bmMsCi0uICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLS4geyogQmFjay1kb29yIHRvIGFsbG93IGZvcm1hdC1hd2FyZSBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGRlYnVnIHN5bWJvbHMKLS4gICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0uICAgIHdoZW4gY3JlYXRpbmcgQ09GRiBmaWxlcy4gICp9Ci0uICBhc3ltYm9sICogICgqX2JmZF9tYWtlX2RlYnVnX3N5bWJvbCkgUEFSQU1TICgoCi0uICAgICAgIGJmZCAqYWJmZCwKLS4gICAgICAgdm9pZCAqcHRyLAotLiAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpKTsKLS4jZGVmaW5lIGJmZF9yZWFkX21pbmlzeW1ib2xzKGIsIGQsIG0sIHMpIFwKLS4gIEJGRF9TRU5EIChiLCBfcmVhZF9taW5pc3ltYm9scywgKGIsIGQsIG0sIHMpKQotLiAgbG9uZyAgKCpfcmVhZF9taW5pc3ltYm9scykgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiAqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICopKTsKLS4jZGVmaW5lIGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbChiLCBkLCBtLCBmKSBcCi0uICBCRkRfU0VORCAoYiwgX21pbmlzeW1ib2xfdG9fc3ltYm9sLCAoYiwgZCwgbSwgZikpCi0uICBhc3ltYm9sICooKl9taW5pc3ltYm9sX3RvX3N5bWJvbCkgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIGNvbnN0IFBUUiwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3ltYm9sICopKTsKLS4KLS4gIHsqIFJvdXRpbmVzIGZvciByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfUkVMT0NTKE5BTUUpXAotLkNBVChOQU1FLF9nZXRfcmVsb2NfdXBwZXJfYm91bmQpLFwKLS5DQVQoTkFNRSxfY2Fub25pY2FsaXplX3JlbG9jKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxvY190eXBlX2xvb2t1cCkKLS4gIGxvbmcgICgqX2dldF9yZWxvY191cHBlcl9ib3VuZCkgUEFSQU1TICgoYmZkICosIHNlY19wdHIpKTsKLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfcmVsb2MpIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBhcmVsZW50ICoqLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLiAgeyogU2VlIGRvY3VtZW50YXRpb24gb24gcmVsb2MgdHlwZXMuICAqfQotLiAgcmVsb2NfaG93dG9fdHlwZSAqCi0uICAgICAgICgqcmVsb2NfdHlwZV9sb29rdXApIFBBUkFNUyAoKGJmZCAqYWJmZCwKLS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgd2hlbiB3cml0aW5nIGFuIG9iamVjdCBmaWxlLiAgKn0KLS4jZGVmaW5lIEJGRF9KVU1QX1RBQkxFX1dSSVRFKE5BTUUpXAotLkNBVChOQU1FLF9zZXRfYXJjaF9tYWNoKSxcCi0uQ0FUKE5BTUUsX3NldF9zZWN0aW9uX2NvbnRlbnRzKQotLiAgYm9vbGVhbiAgICAoKl9iZmRfc2V0X2FyY2hfbWFjaCkgUEFSQU1TICgoYmZkICosIGVudW0gYmZkX2FyY2hpdGVjdHVyZSwKLS4gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcpKTsKLS4gIGJvb2xlYW4gICAgICAgKCpfYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzKSBQQVJBTVMgKChiZmQgKiwgc2VjX3B0ciwgUFRSLAotLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wdHIsIGJmZF9zaXplX3R5cGUpKTsKLS4KLS4gIHsqIFJvdXRpbmVzIHVzZWQgYnkgdGhlIGxpbmtlci4gICp9Ci0uI2RlZmluZSBCRkRfSlVNUF9UQUJMRV9MSU5LKE5BTUUpXAotLkNBVChOQU1FLF9zaXplb2ZfaGVhZGVycyksXAotLkNBVChOQU1FLF9iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzKSxcCi0uQ0FUKE5BTUUsX2JmZF9yZWxheF9zZWN0aW9uKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX2FkZF9zeW1ib2xzKSxcCi0uQ0FUKE5BTUUsX2JmZF9maW5hbF9saW5rKSxcCi0uQ0FUKE5BTUUsX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pLFwKLS5DQVQoTkFNRSxfYmZkX2djX3NlY3Rpb25zKQotLiAgaW50ICAgICAgICAoKl9iZmRfc2l6ZW9mX2hlYWRlcnMpIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci0uICBiZmRfYnl0ZSAqICgqX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMpIFBBUkFNUyAoKGJmZCAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgc3RydWN0IGJmZF9saW5rX29yZGVyICosCi0uICAgICAgICAgICAgICAgICAgICBiZmRfYnl0ZSAqZGF0YSwgYm9vbGVhbiByZWxvY2F0ZWFibGUsCi0uICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uCi0uICBib29sZWFuICAgICgqX2JmZF9yZWxheF9zZWN0aW9uKSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IHNlYyAqLAotLiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqYWdhaW4pKTsKLS4KLS4gIHsqIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLS4gICAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKn0KLS4gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICooKl9iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSkgUEFSQU1TICgoYmZkICopKTsKLS4KLS4gIHsqIEFkZCBzeW1ib2xzIGZyb20gdGhpcyBvYmplY3QgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKn0KLS4gIGJvb2xlYW4gKCpfYmZkX2xpbmtfYWRkX3N5bWJvbHMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBEbyBhIGxpbmsgYmFzZWQgb24gdGhlIGxpbmtfb3JkZXIgc3RydWN0dXJlcyBhdHRhY2hlZCB0byBlYWNoCi0uICAgICBzZWN0aW9uIG9mIHRoZSBCRkQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZmluYWxfbGluaykgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLS4KLS4gIHsqIFNob3VsZCB0aGlzIHNlY3Rpb24gYmUgc3BsaXQgdXAgaW50byBzbWFsbGVyIHBpZWNlcyBkdXJpbmcgbGlua2luZy4gICp9Ci0uICBib29sZWFuICgqX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc2VjICopKTsKLS4KLS4gIHsqIFJlbW92ZSBzZWN0aW9ucyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBmcm9tIHRoZSBvdXRwdXQuICAqfQotLiAgYm9vbGVhbiAoKl9iZmRfZ2Nfc2VjdGlvbnMpIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci0uCi0uICB7KiBSb3V0aW5lcyB0byBoYW5kbGUgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY3MuICAqfQotLiNkZWZpbmUgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyhOQU1FKVwKLS5DQVQoTkFNRSxfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSxcCi0uQ0FUKE5BTUUsX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiksXAotLkNBVChOQU1FLF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCksXAotLkNBVChOQU1FLF9jYW5vbmljYWxpemVfZHluYW1pY19yZWxvYykKLS4gIHsqIEdldCB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICp9Ci0uICBsb25nICAoKl9iZmRfZ2V0X2R5bmFtaWNfc3ltdGFiX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKn0KLS4gIGxvbmcgICgqX2JmZF9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIpCi0uICAgIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqKSk7Ci0uICB7KiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kKSBQQVJBTVMgKChiZmQgKikpOwotLiAgeyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqfQotLiAgbG9uZyAgKCpfYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKQotLiAgICBQQVJBTVMgKChiZmQgKiwgYXJlbGVudCAqKiwgc3RydWN0IHN5bWJvbF9jYWNoZV9lbnRyeSAqKikpOwotLgotCi1EYXRhIGZvciB1c2UgYnkgYmFjay1lbmQgcm91dGluZXMsIHdoaWNoIGlzbid0IGdlbmVyaWMgZW5vdWdoIHRvIGJlbG9uZwotaW4gdGhpcyBzdHJ1Y3R1cmUuCi0KLS4gUFRSIGJhY2tlbmRfZGF0YTsKLS59IGJmZF90YXJnZXQ7Ci0KLSovCi0KLS8qIEFsbCBrbm93biB4dmVjcyAoZXZlbiB0aG9zZSB0aGF0IGRvbid0IGNvbXBpbGUgb24gYWxsIHN5c3RlbXMpLgotICAgQWxwaGFiZXRpemVkIGZvciBlYXN5IHJlZmVyZW5jZS4KLSAgIFRoZXkgYXJlIGxpc3RlZCBhIHNlY29uZCB0aW1lIGJlbG93LCBzaW5jZQotICAgd2UgY2FuJ3QgaW50ZXJtaXggZXh0ZXJuJ3MgYW5kIGluaXRpYWxpemVycy4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhMjlrY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYV9vdXRfYWRvYmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dF9hcm1fYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfYXJtX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhb3V0X21pcHNfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFvdXRfbWlwc19saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYW91dDBfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFwb2xsb2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtY29mZl9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybXBlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYXJtX2Vwb2NfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFybV9lcG9jX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2JpZ19ob3N0OwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYl9vdXRfdmVjX2xpdHRsZV9ob3N0OwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2FscGhhX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9iaWdhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ2FybV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZWFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfbGl0dGxlYXJtX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVhcm1fb2FiaV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmMzJfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2JpZ21pcHNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QxMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2QzMHZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2hwcGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k4NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2k5NjBfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9saXR0bGVtaXBzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tMzJyX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tNjhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tODhrX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMjAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tbjEwMzAwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NoX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9zaGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX3NwYXJjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl92ODUwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9mcjMwX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGYzMl9tY29yZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjMyX21jb3JlX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfZWxmNjRfYmlnX2dlbmVyaWNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJmZF9lbGY2NF9zcGFyY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBkZW1vXzY0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBlY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZWNvZmZfYmlnbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGVjb2ZmYWxwaGFfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGg4MzAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBoODUwMGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaG9zdF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwYnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwMzAwaHB1eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzb21fdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmFvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2ZHluaXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmZyZWVic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm9zOWtfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNfcGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBiZmRfcG93ZXJwY19wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgYmZkX3Bvd2VycGNsZV9wZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4NnBlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZwZWlfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMmNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgZ28zMnN0dWJiZWRjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bHlueF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZseW54X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaTM4Nm1hY2gzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGkzODZtc2Rvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpMzg2bmV0YnNkX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGk4NjBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGljb2ZmX2JpZ192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpY29mZl9saXR0bGVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaWVlZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrYXV4X2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2NvZmZ1bl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbGludXhfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtNjhrbHlueF9jb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGtuZXRic2RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbTY4a3N5c3Zjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG02OGs0a25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtODhrYmNzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG04OGttYWNoM192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBtY29yZV9wZV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVfbGl0dGxlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG1jb3JlX3BlaV9iaWdfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbWNvcmVfcGVpX2xpdHRsZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBuZXdzb3MzX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IG5sbTMyX2kzODZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfc3BhcmNfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmxtMzJfcG93ZXJwY192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBvYXN5c192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwYzUzMm1hY2hhb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBwY2Jvb3RfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcmlzY2l4X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHBtYWNfeGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgcnM2MDAwY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzaGNvZmZfc21hbGxfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2hsY29mZl9zbWFsbF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2xlX2FvdXRfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3BhcmNsaW51eF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfYW91dF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2x5bnhfY29mZl92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY25ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcGFyY2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc3Vub3NfYmlnX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRla2hleF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB0aWMzMF9hb3V0X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRpYzMwX2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdGljODBjb2ZmX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHZheG5ldGJzZF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB2bXNfYWxwaGFfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdm1zX3ZheF92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCB3ZTMya2NvZmZfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgdzY1X3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHo4a2NvZmZfdmVjOwotCi0vKiBzcmVjIGlzIGFsd2F5cyBpbmNsdWRlZC4gICovCi1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBzcmVjX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHN5bWJvbHNyZWNfdmVjOwotCi0vKiBiaW5hcnkgaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGJpbmFyeV92ZWM7Ci0KLS8qIGloZXggaXMgYWx3YXlzIGluY2x1ZGVkLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGloZXhfdmVjOwotCi0vKiBBbGwgb2YgdGhlIHh2ZWNzIGZvciBjb3JlIGZpbGVzLiAgKi8KLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGFpeDM4Nl9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGNpc2NvX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgaHB1eF9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IGhwcGFic2RfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBpcml4X2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgbmV0YnNkX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgb3NmX2NvcmVfdmVjOwotZXh0ZXJuIGNvbnN0IGJmZF90YXJnZXQgc2NvNV9jb3JlX3ZlYzsKLWV4dGVybiBjb25zdCBiZmRfdGFyZ2V0IHRyYWRfY29yZV92ZWM7Ci1leHRlcm4gY29uc3QgYmZkX3RhcmdldCBwdHJhY2VfY29yZV92ZWM7Ci0KLWNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCBiZmRfdGFyZ2V0X3ZlY3RvcltdID0gewotCi0jaWZkZWYgU0VMRUNUX1ZFQ1MKLQotCVNFTEVDVF9WRUNTLAotCi0jZWxzZSAvKiBub3QgU0VMRUNUX1ZFQ1MgKi8KLQotI2lmZGVmIERFRkFVTFRfVkVDVE9SCi0JJkRFRkFVTFRfVkVDVE9SLAotI2VuZGlmCi0JLyogVGhpcyBsaXN0IGlzIGFscGhhYmV0aXplZCB0byBtYWtlIGl0IGVhc3kgdG8gY29tcGFyZQotCSAgIHdpdGggb3RoZXIgdmVjdG9yIGxpc3RzIC0tIHRoZSBkZWNscyBhYm92ZSBhbmQKLQkgICB0aGUgY2FzZSBzdGF0ZW1lbnQgaW4gY29uZmlndXJlLmluLgotCSAgIFZlY3RvcnMgdGhhdCBkb24ndCBjb21waWxlIG9uIGFsbCBzeXN0ZW1zLCBvciBhcmVuJ3QgZmluaXNoZWQsCi0JICAgc2hvdWxkIGhhdmUgYW4gZW50cnkgaGVyZSB3aXRoICNpZiAwIGFyb3VuZCBpdCwgdG8gc2hvdyB0aGF0Ci0JICAgaXQgd2Fzbid0IG9taXR0ZWQgYnkgbWlzdGFrZS4gICovCi0JJmEyOWtjb2ZmX2JpZ192ZWMsCi0JJmFfb3V0X2Fkb2JlX3ZlYywKLSNpZiAwCQkJCS8qIE5vIG9uZSBzZWVtcyB0byB1c2UgdGhpcy4gICovCi0JJmFvdXRfbWlwc19iaWdfdmVjLAotI2VuZGlmCi0JJmFvdXRfbWlwc19saXR0bGVfdmVjLAotCSZiX291dF92ZWNfYmlnX2hvc3QsCi0JJmJfb3V0X3ZlY19saXR0bGVfaG9zdCwKLQotCS8qIFRoaXMsIGFuZCBvdGhlciB2ZWN0b3JzLCBtYXkgbm90IGJlIHVzZWQgaW4gYW55ICoubXQgY29uZmlndXJhdGlvbi4KLQkgICBCdXQgdGhhdCBkb2VzIG5vdCBtZWFuIHRoZXkgYXJlIHVubmVjZXNzYXJ5LiAgSWYgY29uZmlndXJlZCB3aXRoCi0JICAgLS1lbmFibGUtdGFyZ2V0cz1hbGwsIG9iamR1bXAgb3IgZ2RiIHNob3VsZCBiZSBhYmxlIHRvIGV4YW1pbmUKLQkgICB0aGUgZmlsZSBldmVuIGlmIHdlIGRvbid0IHJlY29nbml6ZSB0aGUgbWFjaGluZSB0eXBlLiAgKi8KLQkmYmZkX2VsZjMyX2JpZ19nZW5lcmljX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZiZmRfZWxmNjRfYWxwaGFfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9iaWdhcmNfdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2JpZ2FybV92ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfYmlnYXJtX29hYmlfdmVjLAotCSZiZmRfZWxmMzJfYmlnbWlwc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2JpZ21pcHNfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9kMTB2X3ZlYywKLQkmYmZkX2VsZjMyX2QzMHZfdmVjLAotCSZiZmRfZWxmMzJfaHBwYV92ZWMsCi0JJmJmZF9lbGYzMl9pMzg2X3ZlYywKLQkmYmZkX2VsZjMyX2k4NjBfdmVjLAotCSZiZmRfZWxmMzJfaTk2MF92ZWMsCi0JJmJmZF9lbGYzMl9saXR0bGVfZ2VuZXJpY192ZWMsCi0JJmJmZF9lbGYzMl9saXR0bGVhcmNfdmVjLAotICAgICAgICAmYmZkX2VsZjMyX2xpdHRsZWFybV92ZWMsCi0gICAgICAgICZiZmRfZWxmMzJfbGl0dGxlYXJtX29hYmlfdmVjLAotCSZiZmRfZWxmMzJfbGl0dGxlbWlwc192ZWMsCi0jaWZkZWYgQkZENjQKLQkmYmZkX2VsZjY0X2xpdHRsZW1pcHNfdmVjLAotI2VuZGlmCi0JJmJmZF9lbGYzMl9tMzJyX3ZlYywKLQkmYmZkX2VsZjMyX21uMTAyMDBfdmVjLAotCSZiZmRfZWxmMzJfbW4xMDMwMF92ZWMsCi0JJmJmZF9lbGYzMl9tNjhrX3ZlYywKLQkmYmZkX2VsZjMyX204OGtfdmVjLAotCSZiZmRfZWxmMzJfc3BhcmNfdmVjLAotCSZiZmRfZWxmMzJfcG93ZXJwY192ZWMsCi0JJmJmZF9lbGYzMl9wb3dlcnBjbGVfdmVjLAotCSZiZmRfZWxmMzJfdjg1MF92ZWMsCi0JJmJmZF9lbGYzMl9mcjMwX3ZlYywKLQkmYmZkX2VsZjMyX21jb3JlX2JpZ192ZWMsCi0JJmJmZF9lbGYzMl9tY29yZV9saXR0bGVfdmVjLAotI2lmZGVmIEJGRDY0CQkJLyogTm8gb25lIHNlZW1zIHRvIHVzZSB0aGlzLiAgKi8KLQkmYmZkX2VsZjY0X2JpZ19nZW5lcmljX3ZlYywKLQkmYmZkX2VsZjY0X2xpdHRsZV9nZW5lcmljX3ZlYywKLSNlbmRpZgotI2lmIDAKLQkmYmZkX2VsZjY0X3NwYXJjX3ZlYywKLSNlbmRpZgotCS8qIFdlIGRvbid0IGluY2x1ZGUgY2lzY29fY29yZV92ZWMuICBBbHRob3VnaCBpdCBoYXMgYSBtYWdpYyBudW1iZXIsCi0JICAgdGhlIG1hZ2ljIG51bWJlciBpc24ndCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBhbmQgdGh1cwotCSAgIG1pZ2h0IHNwdXJpb3VzbHkgbWF0Y2ggb3RoZXIga2luZHMgb2YgZmlsZXMuICAqLwotI2lmZGVmIEJGRDY0Ci0JJmRlbW9fNjRfdmVjLAkvKiBPbmx5IGNvbXBpbGVkIGlmIGhvc3QgaGFzIGxvbmctbG9uZyBzdXBwb3J0ICovCi0jZW5kaWYKLQkmZWNvZmZfYmlnX3ZlYywKLQkmZWNvZmZfbGl0dGxlX3ZlYywKLQkmZWNvZmZfYmlnbGl0dGxlX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZlY29mZmFscGhhX2xpdHRsZV92ZWMsCi0jZW5kaWYKLQkmaDgzMDBjb2ZmX3ZlYywKLQkmaDg1MDBjb2ZmX3ZlYywKLSNpZiAwCi0JLyogU2luY2UgYS5vdXQgZmlsZXMgbGFjayBkZWNlbnQgbWFnaWMgbnVtYmVycywgbm8gd2F5IHRvIHJlY29nbml6ZQotCSAgIHdoaWNoIGtpbmQgb2YgYS5vdXQgZmlsZSBpdCBpcy4gICovCi0JJmhvc3RfYW91dF92ZWMsCi0jZW5kaWYKLSNpZiAwCQkJCS8qIENsYXNoZXMgd2l0aCBzdW5vc19iaWdfdmVjIG1hZ2ljIG5vLiAgKi8KLQkmaHAzMDBic2RfdmVjLAotI2VuZGlmCi0JJmhwMzAwaHB1eF92ZWMsCi0jaWYgZGVmaW5lZCAoSE9TVF9IUFBBSFBVWCkgfHwgZGVmaW5lZCAoSE9TVF9IUFBBQlNEKSB8fCBkZWZpbmVkIChIT1NUX0hQUEFPU0YpCi0gICAgICAgICZzb21fdmVjLAotI2VuZGlmCi0JJmkzODZhb3V0X3ZlYywKLQkmaTM4NmJzZF92ZWMsCi0JJmkzODZjb2ZmX3ZlYywKLQkmaTM4NmZyZWVic2RfdmVjLAotCSZpODYwY29mZl92ZWMsCi0JJmJmZF9wb3dlcnBjX3BlX3ZlYywKLQkmYmZkX3Bvd2VycGNsZV9wZV92ZWMsCi0JJmJmZF9wb3dlcnBjX3BlaV92ZWMsCi0JJmJmZF9wb3dlcnBjbGVfcGVpX3ZlYywKLQkmZ28zMmNvZmZfdmVjLAotCSZnbzMyc3R1YmJlZGNvZmZfdmVjLAotI2lmIDAKLQkvKiBTaW5jZSBhLm91dCBmaWxlcyBsYWNrIGRlY2VudCBtYWdpYyBudW1iZXJzLCBubyB3YXkgdG8gcmVjb2duaXplCi0JICAgd2hpY2gga2luZCBvZiBhLm91dCBmaWxlIGl0IGlzLiAgKi8KLQkmaTM4NmxpbnV4X3ZlYywKLSNlbmRpZgotCSZpMzg2bHlueF9hb3V0X3ZlYywKLQkmaTM4Nmx5bnhfY29mZl92ZWMsCi0jaWYgMAotCS8qIE5vIGRpc3Rpbmd1aXNoaW5nIGZlYXR1cmVzIGZvciBNYWNoIDMgZXhlY3V0YWJsZXMuICAqLwotCSZpMzg2bWFjaDNfdmVjLAotI2VuZGlmCi0JJmkzODZtc2Rvc192ZWMsCi0JJmkzODZuZXRic2RfdmVjLAotCSZpMzg2b3M5a192ZWMsCi0JJmkzODZwZV92ZWMsCi0JJmkzODZwZWlfdmVjLAotCSZhcm1jb2ZmX2xpdHRsZV92ZWMsCi0JJmFybWNvZmZfYmlnX3ZlYywKLQkmYXJtcGVfbGl0dGxlX3ZlYywKLQkmYXJtcGVfYmlnX3ZlYywKLQkmYXJtcGVpX2xpdHRsZV92ZWMsCi0JJmFybXBlaV9iaWdfdmVjLAotCSZhcm1fZXBvY19wZV9saXR0bGVfdmVjLAotCSZhcm1fZXBvY19wZV9iaWdfdmVjLAotCSZhcm1fZXBvY19wZWlfbGl0dGxlX3ZlYywKLQkmYXJtX2Vwb2NfcGVpX2JpZ192ZWMsCi0JJmljb2ZmX2JpZ192ZWMsCi0JJmljb2ZmX2xpdHRsZV92ZWMsCi0JJmllZWVfdmVjLAotCSZtNjhrY29mZl92ZWMsCi0JJm02OGtjb2ZmdW5fdmVjLAotI2lmIDAKLQkvKiBTaW5jZSBhLm91dCBmaWxlcyBsYWNrIGRlY2VudCBtYWdpYyBudW1iZXJzLCBubyB3YXkgdG8gcmVjb2duaXplCi0JICAgd2hpY2gga2luZCBvZiBhLm91dCBmaWxlIGl0IGlzLiAgKi8KLQkmbTY4a2xpbnV4X3ZlYywKLSNlbmRpZgotCSZtNjhrbHlueF9hb3V0X3ZlYywKLQkmbTY4a2x5bnhfY29mZl92ZWMsCi0JJm02OGtuZXRic2RfdmVjLAotCSZtNjhrc3lzdmNvZmZfdmVjLAotCSZtODhrYmNzX3ZlYywKLQkmbTg4a21hY2gzX3ZlYywKLQkmbWNvcmVfcGVfYmlnX3ZlYywKLQkmbWNvcmVfcGVfbGl0dGxlX3ZlYywKLQkmbWNvcmVfcGVpX2JpZ192ZWMsCi0JJm1jb3JlX3BlaV9saXR0bGVfdmVjLAotCSZuZXdzb3MzX3ZlYywKLQkmbmxtMzJfaTM4Nl92ZWMsCi0JJm5sbTMyX3NwYXJjX3ZlYywKLSNpZmRlZiBCRkQ2NAotCSZubG0zMl9hbHBoYV92ZWMsCi0jZW5kaWYKLQkmcGM1MzJuZXRic2RfdmVjLAotI2lmIDAKLQkvKiBXZSBoYXZlIG5vIG9hc3lzIHRvb2xzIGFueW1vcmUsIHNvIHdlIGNhbid0IHRlc3QgYW55IG9mIHRoaXMKLQkgICBhbnltb3JlLiBJZiB5b3Ugd2FudCB0byB0ZXN0IHRoZSBzdHVmZiB5b3Vyc2VsZiwgZ28gYWhlYWQuLi4KLQkgICBzdGV2ZUBjeWdudXMuY29tCi0JICAgV29yc2UsIHNpbmNlIHRoZXJlIGlzIG5vIG1hZ2ljIG51bWJlciBmb3IgYXJjaGl2ZXMsIHRoZXJlCi0JICAgY2FuIGJlIGFubm95aW5nIHRhcmdldCBtaXMtbWF0Y2hlcy4gICovCi0JJm9hc3lzX3ZlYywKLSNlbmRpZgotCSZwYzUzMm1hY2hhb3V0X3ZlYywKLSNpZiAwCi0JLyogV2UgaGF2ZSBubyB3YXkgb2YgZGlzdGluZ3Vpc2hpbmcgdGhlc2UgZnJvbSBvdGhlciBhLm91dCB2YXJpYW50cyAqLwotCSZhb3V0X2FybV9iaWdfdmVjLAotCSZhb3V0X2FybV9saXR0bGVfdmVjLAotCSZyaXNjaXhfdmVjLAotI2VuZGlmCi0jaWYgMAotCS8qIFRoaXMgaGFzIHRoZSBzYW1lIG1hZ2ljIG51bWJlciBhcyBSUy82MDAwLiAqLwotCSZwbWFjX3hjb2ZmX3ZlYywKLSNlbmRpZgotCSZyczYwMDBjb2ZmX3ZlYywKLQkmcHBjYm9vdF92ZWMsCi0JJnNoY29mZl92ZWMsCi0JJnNobGNvZmZfdmVjLAotCSZzaGNvZmZfc21hbGxfdmVjLAotCSZzaGxjb2ZmX3NtYWxsX3ZlYywKLQkmc3BhcmNsZV9hb3V0X3ZlYywKLQkmc3BhcmNsaW51eF92ZWMsCi0JJnNwYXJjbHlueF9hb3V0X3ZlYywKLQkmc3BhcmNseW54X2NvZmZfdmVjLAotCSZzcGFyY25ldGJzZF92ZWMsCi0JJnN1bm9zX2JpZ192ZWMsCi0JJmFvdXQwX2JpZ192ZWMsCi0JJnRpYzMwX2FvdXRfdmVjLAotCSZ0aWMzMF9jb2ZmX3ZlYywKLQkmdGljODBjb2ZmX3ZlYywKLQkmdmF4bmV0YnNkX3ZlYywKLQkmdmVyc2Fkb3NfdmVjLAotI2lmZGVmIEJGRDY0Ci0JJnZtc19hbHBoYV92ZWMsCi0jZW5kaWYKLQkmdm1zX3ZheF92ZWMsCi0JJndlMzJrY29mZl92ZWMsCi0JJno4a2NvZmZfdmVjLAotCi0jZW5kaWYgLyogbm90IFNFTEVDVF9WRUNTICovCi0KLS8qIEFsd2F5cyBzdXBwb3J0IFMtcmVjb3JkcywgZm9yIGNvbnZlbmllbmNlLiAgKi8KLQkmc3JlY192ZWMsCi0JJnN5bWJvbHNyZWNfdmVjLAotLyogQW5kIHRla2hleCAqLwotCSZ0ZWtoZXhfdmVjLAotLyogTGlrZXdpc2UgZm9yIGJpbmFyeSBvdXRwdXQuICAqLwotCSZiaW5hcnlfdmVjLAotLyogTGlrZXdpc2UgZm9yIGloZXguICAqLwotCSZpaGV4X3ZlYywKLQotLyogQWRkIGFueSByZXF1aXJlZCB0cmFkaXRpb25hbC1jb3JlLWZpbGUtaGFuZGxlci4gICovCi0KLSNpZmRlZiBBSVgzODZfQ09SRQotCSZhaXgzODZfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBIUFVYX0NPUkUKLQkmaHB1eF9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmIEhQUEFCU0RfQ09SRQotCSZocHBhYnNkX2NvcmVfdmVjLAotI2VuZGlmCi0jaWZkZWYgSVJJWF9DT1JFCi0JJmlyaXhfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBORVRCU0RfQ09SRQotCSZuZXRic2RfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBPU0ZfQ09SRQotCSZvc2ZfY29yZV92ZWMsCi0jZW5kaWYKLSNpZmRlZiBTQ081X0NPUkUKLQkmc2NvNV9jb3JlX3ZlYywKLSNlbmRpZgotI2lmZGVmCVRSQURfQ09SRQotCSZ0cmFkX2NvcmVfdmVjLAotI2VuZGlmCi0KLSNpZmRlZglQVFJBQ0VfQ09SRQotCSZwdHJhY2VfY29yZV92ZWMsCi0jZW5kaWYKLQotCU5VTEwgLyogZW5kIG9mIGxpc3QgbWFya2VyICovCi19OwotCi0vKiBiZmRfZGVmYXVsdF92ZWN0b3JbMF0gY29udGFpbnMgZWl0aGVyIHRoZSBhZGRyZXNzIG9mIHRoZSBkZWZhdWx0IHZlY3RvciwKLSAgIGlmIHRoZXJlIGlzIG9uZSwgb3IgemVybyBpZiB0aGVyZSBpc24ndC4gICovCi0KLWNvbnN0IGJmZF90YXJnZXQgKmJmZF9kZWZhdWx0X3ZlY3RvcltdID0gewotI2lmZGVmIERFRkFVTFRfVkVDVE9SCi0JJkRFRkFVTFRfVkVDVE9SLAotI2VuZGlmCi0JTlVMTAotfTsKLQotLyogV2hlbiB0aGVyZSBpcyBhbiBhbWJpZ3VvdXMgbWF0Y2gsIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyBwdXRzIHRoZQotICAgbmFtZXMgb2YgdGhlIG1hdGNoaW5nIHRhcmdldHMgaW4gYW4gYXJyYXkuICBUaGlzIHZhcmlhYmxlIGlzIHRoZSBtYXhpbXVtCi0gICBudW1iZXIgb2YgZW50cmllcyB0aGF0IHRoZSBhcnJheSBjb3VsZCBwb3NzaWJseSBuZWVkLiAgKi8KLWNvbnN0IHNpemVfdCBfYmZkX3RhcmdldF92ZWN0b3JfZW50cmllcyA9IHNpemVvZihiZmRfdGFyZ2V0X3ZlY3Rvcikvc2l6ZW9mKCpiZmRfdGFyZ2V0X3ZlY3Rvcik7Ci0MCi0vKiBUaGlzIGFycmF5IG1hcHMgY29uZmlndXJhdGlvbiB0cmlwbGV0cyBvbnRvIEJGRCB2ZWN0b3JzLiAgKi8KLQotc3RydWN0IHRhcmdtYXRjaAotewotICAvKiBUaGUgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgKi8KLSAgY29uc3QgY2hhciAqdHJpcGxldDsKLSAgLyogVGhlIEJGRCB2ZWN0b3IuICBJZiB0aGlzIGlzIE5VTEwsIHRoZW4gdGhlIHZlY3RvciBpcyBmb3VuZCBieQotICAgICBzZWFyY2hpbmcgZm9yd2FyZCBmb3IgdGhlIG5leHQgc3RydWN0dXJlIHdpdGggYSBub24gTlVMTCB2ZWN0b3IKLSAgICAgZmllbGQuICAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICp2ZWN0b3I7Ci19OwotCi0vKiB0YXJnbWF0Y2guaCBpcyBidWlsdCBieSBNYWtlZmlsZSBvdXQgb2YgY29uZmlnLmJmZC4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRhcmdtYXRjaCBiZmRfdGFyZ2V0X21hdGNoW10gPSB7Ci0jaW5jbHVkZSAidGFyZ21hdGNoLmgiCi0gIHsgTlVMTCwgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqZmluZF90YXJnZXQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIEZpbmQgYSB0YXJnZXQgdmVjdG9yLCBnaXZlbiBhIG5hbWUgb3IgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotZmluZF90YXJnZXQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGJmZF90YXJnZXQgKiBjb25zdCAqdGFyZ2V0OwotICBjb25zdCBzdHJ1Y3QgdGFyZ21hdGNoICptYXRjaDsKLQotICBmb3IgKHRhcmdldCA9ICZiZmRfdGFyZ2V0X3ZlY3RvclswXTsgKnRhcmdldCAhPSBOVUxMOyB0YXJnZXQrKykKLSAgICBpZiAoc3RyY21wIChuYW1lLCAoKnRhcmdldCktPm5hbWUpID09IDApCi0gICAgICByZXR1cm4gKnRhcmdldDsKLQotICAvKiBJZiB3ZSBjb3VsZG4ndCBtYXRjaCBvbiB0aGUgZXhhY3QgbmFtZSwgdHJ5IG1hdGNoaW5nIG9uIHRoZQotICAgICBjb25maWd1cmF0aW9uIHRyaXBsZXQuICBGSVhNRTogV2Ugc2hvdWxkIHJ1biB0aGUgdHJpcGxldCB0aHJvdWdoCi0gICAgIGNvbmZpZy5zdWIgZmlyc3QsIGJ1dCB0aGF0IGlzIGhhcmQuICAqLwotICBmb3IgKG1hdGNoID0gJmJmZF90YXJnZXRfbWF0Y2hbMF07IG1hdGNoLT50cmlwbGV0ICE9IE5VTEw7IG1hdGNoKyspCi0gICAgewotICAgICAgaWYgKGZubWF0Y2ggKG1hdGNoLT50cmlwbGV0LCBuYW1lLCAwKSA9PSAwKQotCXsKLQkgIHdoaWxlIChtYXRjaC0+dmVjdG9yID09IE5VTEwpCi0JICAgICsrbWF0Y2g7Ci0JICByZXR1cm4gbWF0Y2gtPnZlY3RvcjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF9zZXRfZGVmYXVsdF90YXJnZXQKLQotU1lOT1BTSVMKLQlib29sZWFuIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKGNvbnN0IGNoYXIgKm5hbWUpOwotCi1ERVNDUklQVElPTgotCVNldCB0aGUgZGVmYXVsdCB0YXJnZXQgdmVjdG9yIHRvIHVzZSB3aGVuIHJlY29nbml6aW5nIGEgQkZELgotCVRoaXMgdGFrZXMgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCwgd2hpY2ggbWF5IGJlIGEgQkZEIHRhcmdldAotCW5hbWUgb3IgYSBjb25maWd1cmF0aW9uIHRyaXBsZXQuCi0qLwotCi1ib29sZWFuCi1iZmRfc2V0X2RlZmF1bHRfdGFyZ2V0IChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKGJmZF9kZWZhdWx0X3ZlY3RvclswXSAhPSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG5hbWUsIGJmZF9kZWZhdWx0X3ZlY3RvclswXS0+bmFtZSkgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICB0YXJnZXQgPSBmaW5kX3RhcmdldCAobmFtZSk7Ci0gIGlmICh0YXJnZXQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYmZkX2RlZmF1bHRfdmVjdG9yWzBdID0gdGFyZ2V0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLUZVTkNUSU9OCi0JYmZkX2ZpbmRfdGFyZ2V0Ci0KLVNZTk9QU0lTCi0JY29uc3QgYmZkX3RhcmdldCAqYmZkX2ZpbmRfdGFyZ2V0KENPTlNUIGNoYXIgKnRhcmdldF9uYW1lLCBiZmQgKmFiZmQpOwotCi1ERVNDUklQVElPTgotCVJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHRyYW5zZmVyIHZlY3RvciBmb3IgdGhlIG9iamVjdCB0YXJnZXQKLQluYW1lZCBAdmFye3RhcmdldF9uYW1lfS4gIElmIEB2YXJ7dGFyZ2V0X25hbWV9IGlzIDw8TlVMTD4+LCBjaG9vc2UgdGhlCi0Jb25lIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8PEdOVVRBUkdFVD4+OyBpZiB0aGF0IGlzIG51bGwgb3Igbm90Ci0JZGVmaW5lZCwgdGhlbiBjaG9vc2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YXJnZXQgbGlzdC4KLQlQYXNzaW5nIGluIHRoZSBzdHJpbmcgImRlZmF1bHQiIG9yIHNldHRpbmcgdGhlIGVudmlyb25tZW50Ci0JdmFyaWFibGUgdG8gImRlZmF1bHQiIHdpbGwgY2F1c2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YXJnZXQKLQlsaXN0IHRvIGJlIHJldHVybmVkLCBhbmQgInRhcmdldF9kZWZhdWx0ZWQiIHdpbGwgYmUgc2V0IGluIHRoZQotCUJGRC4gIFRoaXMgY2F1c2VzIDw8YmZkX2NoZWNrX2Zvcm1hdD4+IHRvIGxvb3Agb3ZlciBhbGwgdGhlCi0JdGFyZ2V0cyB0byBmaW5kIHRoZSBvbmUgdGhhdCBtYXRjaGVzIHRoZSBmaWxlIGJlaW5nIHJlYWQuICAgCi0qLwotCi1jb25zdCBiZmRfdGFyZ2V0ICoKLWJmZF9maW5kX3RhcmdldCAodGFyZ2V0X25hbWUsIGFiZmQpCi0gICAgIGNvbnN0IGNoYXIgKnRhcmdldF9uYW1lOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNvbnN0IGNoYXIgKnRhcmduYW1lOwotICBjb25zdCBiZmRfdGFyZ2V0ICp0YXJnZXQ7Ci0KLSAgaWYgKHRhcmdldF9uYW1lICE9IE5VTEwpCi0gICAgdGFyZ25hbWUgPSB0YXJnZXRfbmFtZTsKLSAgZWxzZQotICAgIHRhcmduYW1lID0gZ2V0ZW52ICgiR05VVEFSR0VUIik7Ci0KLSAgLyogVGhpcyBpcyBzYWZlOyB0aGUgdmVjdG9yIGNhbm5vdCBiZSBudWxsICovCi0gIGlmICh0YXJnbmFtZSA9PSBOVUxMIHx8IHN0cmNtcCAodGFyZ25hbWUsICJkZWZhdWx0IikgPT0gMCkKLSAgICB7Ci0gICAgICBhYmZkLT50YXJnZXRfZGVmYXVsdGVkID0gdHJ1ZTsKLSAgICAgIGlmIChiZmRfZGVmYXVsdF92ZWN0b3JbMF0gIT0gTlVMTCkKLQlhYmZkLT54dmVjID0gYmZkX2RlZmF1bHRfdmVjdG9yWzBdOwotICAgICAgZWxzZQotCWFiZmQtPnh2ZWMgPSBiZmRfdGFyZ2V0X3ZlY3RvclswXTsKLSAgICAgIHJldHVybiBhYmZkLT54dmVjOwotICAgIH0KLQotICBhYmZkLT50YXJnZXRfZGVmYXVsdGVkID0gZmFsc2U7Ci0KLSAgdGFyZ2V0ID0gZmluZF90YXJnZXQgKHRhcmduYW1lKTsKLSAgaWYgKHRhcmdldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGFiZmQtPnh2ZWMgPSB0YXJnZXQ7Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLS8qCi1GVU5DVElPTgotCWJmZF90YXJnZXRfbGlzdAotCi1TWU5PUFNJUwotCWNvbnN0IGNoYXIgKipiZmRfdGFyZ2V0X2xpc3Qodm9pZCk7Ci0KLURFU0NSSVBUSU9OCi0JUmV0dXJuIGEgZnJlc2hseSBtYWxsb2NlZCBOVUxMLXRlcm1pbmF0ZWQKLQl2ZWN0b3Igb2YgdGhlIG5hbWVzIG9mIGFsbCB0aGUgdmFsaWQgQkZEIHRhcmdldHMuIERvIG5vdAotCW1vZGlmeSB0aGUgbmFtZXMuCi0KLSovCi0KLWNvbnN0IGNoYXIgKioKLWJmZF90YXJnZXRfbGlzdCAoKQotewotICBpbnQgdmVjX2xlbmd0aD0gMDsKLSNpZiBkZWZpbmVkIChIT1NUX0hQUEFIUFVYKSAmJiAhIGRlZmluZWQgKF9fU1REQ19fKQotICAvKiBUaGUgbmF0aXZlIGNvbXBpbGVyIG9uIHRoZSBIUDkwMDAvNzAwIGhhcyBhIGJ1ZyB3aGljaCBjYXVzZXMgaXQKLSAgICAgdG8gbG9vcCBlbmRsZXNzbHkgd2hlbiBjb21waWxpbmcgdGhpcyBmaWxlLiAgVGhpcyBhdm9pZHMgaXQuICAqLwotICB2b2xhdGlsZQotI2VuZGlmCi0gICAgY29uc3QgYmZkX3RhcmdldCAqIGNvbnN0ICp0YXJnZXQ7Ci0gIENPTlNUICBjaGFyICoqbmFtZV9saXN0LCAqKm5hbWVfcHRyOwotCi0gIGZvciAodGFyZ2V0ID0gJmJmZF90YXJnZXRfdmVjdG9yWzBdOyAqdGFyZ2V0ICE9IE5VTEw7IHRhcmdldCsrKQotICAgIHZlY19sZW5ndGgrKzsKLQotICBuYW1lX3B0ciA9IG5hbWVfbGlzdCA9IChDT05TVCBjaGFyICoqKQotICAgIGJmZF96bWFsbG9jICgodmVjX2xlbmd0aCArIDEpICogc2l6ZW9mIChjaGFyICoqKSk7Ci0KLSAgaWYgKG5hbWVfbGlzdCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGZvciAodGFyZ2V0ID0gJmJmZF90YXJnZXRfdmVjdG9yWzBdOyAqdGFyZ2V0ICE9IE5VTEw7IHRhcmdldCsrKQotICAgICoobmFtZV9wdHIrKykgPSAoKnRhcmdldCktPm5hbWU7Ci0KLSAgcmV0dXJuIG5hbWVfbGlzdDsKLX0KZGlmZiAtLWdpdCBhL2JmZC90YXJnbWF0Y2guc2VkIGIvYmZkL3RhcmdtYXRjaC5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNDBlNzIuLjAwMDAwMDAKLS0tIGEvYmZkL3RhcmdtYXRjaC5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0xLC9TVEFSVCBPRiB0YXJnbWF0Y2guaC8JZAotL0VORCBPRiB0YXJnbWF0Y2guaC8sJAkJZAotcy9eI2lmL0tFRVAgI2lmLwotcy9eI2VuZGlmL0tFRVAgI2VuZGlmLwotcy9eWyAJXSojLiokLy8KLXMvXktFRVAgIy8jLwotcy9bIAldKlxcJC8vCi10IGxhYjEKLQk6bGFiMQotcy9bfCAJXVt8IAldKlwoW158KCkgCV1bXnwoKSAJXSpcKVsgCV0qfC97ICJcMSIsIE5VTEwgfSwvZwotcy9bfCAJXVt8IAldKlwoW158KCkgCV1bXnwoKSAJXSpcKVsgCV0qKS97ICJcMSIsL2cKLXQgbGFiMgotcy9eWyAJXSp0YXJnX2RlZnZlYz1cKFteIAldKlwpLyNpZiAhZGVmaW5lZCAoU0VMRUNUX1ZFQ1MpIHx8IGRlZmluZWQgKEhBVkVfXDEpLwotdCBsYWIzCi1zLy4qPS4qLy8KLXMvOzsvLwotYgotCTpsYWIyCi1ICi1kCi0JOmxhYjMKLUcKLXMvXG4vJUVPTCUvZwotcy9cKGRlZmluZWQgKEhBVkVfXClcKFteKV0qXClcKC4qXCkvXDFcMlwzXAotXCZcMiB9LFwKLSNlbmRpZi8KLXMvJUVPTCUvXAotL2cKLXAKLXMvLiovL2cKLXMvXG4vL2cKLWgKZGlmZiAtLWdpdCBhL2JmZC90ZWtoZXguYyBiL2JmZC90ZWtoZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4ZmUyZC4uMDAwMDAwMAotLS0gYS9iZmQvdGVraGV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY1ICswLDAgQEAKLS8qIEJGRCBiYWNrZW5kIGZvciBFeHRlbmRlZCBUZWt0cm9uaXggSGV4IEZvcm1hdCAgb2JqZWN0cy4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IDxzYWNAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLVNVQlNFQ1RJT04KLQlUZWt0cm9uaXggSGV4IEZvcm1hdCBoYW5kbGluZwotCi1ERVNDUklQVElPTgotCQotCVRlayBIZXggcmVjb3JkcyBjYW4gaG9sZCBzeW1ib2xzIGFuZCBkYXRhLCBidXQgbm90Ci0JcmVsb2NhdGlvbnMuIFRoZWlyIG1haW4gYXBwbGljYXRpb24gaXMgY29tbXVuaWNhdGlvbiB3aXRoCi0JZGV2aWNlcyBsaWtlIFBST00gcHJvZ3JhbW1lcnMgYW5kIElDRSBlcXVpcG1lbnQuCi0JCi0JSXQgc2VlbXMgdGhhdCB0aGUgc2VjdGlvbnMgYXJlIGRlc2NpYmVkIGFzIGJlaW5nIHJlYWxseSBiaWcsCi0gICAgICAgIHRoZSBleGFtcGxlIEkgaGF2ZSBzYXlzIHRoYXQgdGhlIHRleHQgc2VjdGlvbiBpcyAwLi5mZmZmZmZmZi4KLQlCRkQgd291bGQgYmFyZiB3aXRoIHRoaXMsIG1hbnkgYXBwcyB3b3VsZCB0cnkgdG8gYWxsb2MgNEdCIHRvCi0JcmVhZCBpbiB0aGUgZmlsZS4KLQotCVRleCBIZXggbWF5IGNvbnRhaW4gbWFueSBzZWN0aW9ucywgYnV0IHRoZSBkYXRhIHdoaWNoIGNvbWVzIGluCi0JaGFzIG5vIHRhZyBzYXlpbmcgd2hpY2ggc2VjdGlvbiBpdCBiZWxvbmdzIHRvLCBzbyB3ZSBjcmVhdGUKLQlvbmUgc2VjdGlvbiBmb3IgZWFjaCBibG9jayBvZiBkYXRhLCBjYWxsZWQgImJsa25ubm4iIHdoaWNoIHdlCi0Jc3RpY2sgYWxsIHRoZSBkYXRhIGludG8uCi0KLQlUZWtIZXggbWF5IGNvbWUgb3V0IG9mIAlvcmRlciBhbmQgdGhlcmUgaXMgbm8gaGVhZGVyLCBzbyBhbgotCWluaXRpYWwgc2NhbiBpcyByZXF1aXJlZCAgdG8gZGlzY292ZXIgdGhlIG1pbmltdW0gYW5kIG1heGltdW0KLQlhZGRyZXNzZXMgdXNlZCB0byBjcmVhdGUgdGhlIHZtYSBhbmQgc2l6ZSBvZiB0aGUgc2VjdGlvbnMgd2UKLQljcmVhdGUuCi0JV2UgcmVhZCBpbiB0aGUgZGF0YSBpbnRvIHBhZ2VzIG9mIENIVU5LX01BU0srMSBzaXplIGFuZCByZWFkCi0JdGhlbSBvdXQgZnJvbSB0aGF0IHdoZW5ldmVyIHdlIG5lZWQgdG8uCi0KLQlBbnkgbnVtYmVyIG9mIHNlY3Rpb25zIG1heSBiZSBjcmVhdGVkIGZvciBvdXRwdXQsIHdlIHNhdmUgdGhlbQotCXVwIGFuZCBvdXRwdXQgdGhlbSB3aGVuIGl0J3MgdGltZSB0byBjbG9zZSB0aGUgYmZkLgotCi0KLQlBIFRla0hleCByZWNvcmQgbG9va3MgbGlrZToKLUVYQU1QTEUKLQklPGJsb2NrIGxlbmd0aD48dHlwZT48Y2hlY2tzdW0+PHN0dWZmPjxjcj4KLQkKLURFU0NSSVBUSU9OCi0JV2hlcmUKLQlvIGxlbmd0aAotCWlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlY29yZCBub3QgaW5jbHVkaW5nIHRoZSAlIHNpZ24uCi0JbyB0eXBlCi0JaXMgb25lIG9mOgotCTMpIHN5bWJvbCByZWNvcmQKLQk2KSBkYXRhIHJlY29yZAotCTgpIHRlcm1pbmF0aW9uIHJlY29yZAotCQotCi1UaGUgZGF0YSBjYW4gY29tZSBvdXQgb2Ygb3JkZXIsIGFuZCBtYXkgYmUgZGlzY29udGlnb3VzLiBUaGlzIGlzIGEKLXNlcmlhbCBwcm90b2NvbCwgc28gYmlnIGZpbGVzIGFyZSB1bmxpa2VseSwgc28gd2Uga2VlcCBhIGxpc3Qgb2YgOGsgY2h1bmtzCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBiZmRfdm1hIGxvdzsKLSAgICBiZmRfdm1hIGhpZ2g7Ci0gIH0gYWRkcl9yYW5nZV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdAotICB7Ci0KLSAgICBhc3ltYm9sIHN5bWJvbDsKLSAgICBzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKnByZXY7Ci0KLSAgfSB0ZWtoZXhfc3ltYm9sX3R5cGU7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGRpZ3NbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotc3RhdGljIGNoYXIgc3VtX2Jsb2NrWzI1Nl07Ci0KLSNkZWZpbmUgTk9UX0hFWCAyMAotI2RlZmluZSBOSUJCTEUoeCkgaGV4X3ZhbHVlKHgpCi0jZGVmaW5lIEhFWChidWZmZXIpICgoTklCQkxFKChidWZmZXIpWzBdKTw8NCkgKyBOSUJCTEUoKGJ1ZmZlcilbMV0pKQotI2RlZmluZSBUT0hFWChkLHgpIFwKLShkKVsxXSA9IGRpZ3NbKHgpICYgMHhmXTsgXAotKGQpWzBdID0gZGlnc1soKHgpPj40KSYweGZdOwotI2RlZmluZQlJU0hFWCh4KSAgaGV4X3AoeCkKLQotc3RhdGljIHZvaWQgdGVraGV4X2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJmZF92bWEgZ2V0dmFsdWUgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgdGVraGV4X3ByaW50X3N5bWJvbAotIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGFzeW1ib2wgKiwgYmZkX3ByaW50X3N5bWJvbF90eXBlKSk7Ci1zdGF0aWMgdm9pZCB0ZWtoZXhfZ2V0X3N5bWJvbF9pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIHN5bWJvbF9pbmZvICopKTsKLXN0YXRpYyBhc3ltYm9sICp0ZWtoZXhfbWFrZV9lbXB0eV9zeW1ib2wgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBpbnQgdGVraGV4X3NpemVvZl9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfd3JpdGVfb2JqZWN0X2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBvdXQgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqLCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlc3ltIFBBUkFNUyAoKGNoYXIgKiosIENPTlNUIGNoYXIgKikpOwotc3RhdGljIHZvaWQgd3JpdGV2YWx1ZSBQQVJBTVMgKChjaGFyICoqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQqLCBzZWNfcHRyLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgYm9vbGVhbiB0ZWtoZXhfc2V0X2FyY2hfbWFjaAotIFBBUkFNUyAoKGJmZCAqLCBlbnVtIGJmZF9hcmNoaXRlY3R1cmUsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIHRla2hleF9nZXRfc2VjdGlvbl9jb250ZW50cwotIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIsIGZpbGVfcHRyLCBiZmRfc2l6ZV90eXBlKSk7Ci1zdGF0aWMgdm9pZCBtb3ZlX3NlY3Rpb25fY29udGVudHMKLSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSLCBmaWxlX3B0ciwgYmZkX3NpemVfdHlwZSwgYm9vbGVhbikpOwotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKnRla2hleF9vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGJvb2xlYW4gdGVraGV4X21rb2JqZWN0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgbG9uZyB0ZWtoZXhfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIGxvbmcgdGVraGV4X2dldF9zeW10YWIgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiopKTsKLXN0YXRpYyB2b2lkIHBhc3Nfb3ZlciBQQVJBTVMgKChiZmQgKiwgdm9pZCAoKikoYmZkKiwgaW50LCBjaGFyICopKSk7Ci1zdGF0aWMgdm9pZCBmaXJzdF9waGFzZSBQQVJBTVMgKChiZmQgKiwgaW50LCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGluc2VydF9ieXRlIFBBUkFNUyAoKGJmZCAqLCBpbnQsIGJmZF92bWEpKTsKLXN0YXRpYyBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmZpbmRfY2h1bmsgUEFSQU1TICgoYmZkICosIGJmZF92bWEpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0c3ltIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOwotCi0vKgotSGVyZSdzIGFuIGV4YW1wbGUKLSUzQTZDNjQ4MDAwNEU1NkZGRkM0RTcxNzA2M0IwQUVGRkZDNkQwNjUyQUVGRkZDNjBGMjRFNUU0RTc1Ci0lMUIzNzA5VF9TRUdNRU5UMTEwOEZGRkZGRkZGCi0lMkIzQUI5VF9TRUdNRU5UN0RnY2NfY29tcGlsZWQkMTA4N2hlbGxvJGMxMAotJTM3MzgyOVRfU0VHTUVOVDgwaW50JHQxJHIxJCQyMTQ3NDEwODBjaGFyJHQyJHIyJDAkMTI3MTAKLSUzNzM3NjlUX1NFR01FTlQ4MGxvbmckaW50JHQzJHIxJCQxMDgwdW5zaWduZWQkaW50JHQ0JDEwCi0lMzczQ0E5VF9TRUdNRU5UODBsb25nJHVuc2lnbmVkJGluMTA4MHNob3J0JGludCR0NiRyMSQxMAotJTM3MzA0OVRfU0VHTUVOVDgwbG9uZyRsb25nJGludCR0NzEwODBzaG9ydCR1bnNpZ25lZCRpMTAKLSUzNzNBMjlUX1NFR01FTlQ4MGxvbmckbG9uZyR1bnNpZ24xMDgwc2lnbmVkJGNoYXIkdDEwJDEwCi0lMzczRDY5VF9TRUdNRU5UODB1bnNpZ25lZCRjaGFyJHQxMTA4MGZsb2F0JHQxMiRyMSQ0JDAxMAotJTM3M0QxOVRfU0VHTUVOVDgwZG91YmxlJHQxMyRyMSQ4JDEwODBsb25nJGRvdWJsZSR0MTQkMTAKLSUyNzM0RDlUX1NFR01FTlQ4QnZvaWQkdDE1JDE1MTAzNV9tYWluMTAKLSUyRjNDQTlUX1NFR01FTlQ4MSQxMDgxJDE2ODEkMUU4MSQyMTQ4N21haW4kRjExMAotJTI4MzJGOVRfU0VHTUVOVDgzaSQxOEZGRkZGRkZDODEkMTQ4MSQyMTQKLSUwNyA4IDEwIDEwCi0KLWV4cGxhbmF0aW9uOgotJTNBNkM2NDgwMDA0RTU2RkZGQzRFNzE3MDYzQjBBRUZGRkM2RDA2NTJBRUZGRkM2MEYyNEU1RTRFNzUKLSBeIF5eIF4gICAgIF4tZGF0YQotIHwgfHwgKy0tLS0tLSA0IGNoYXIgaW50ZWdlciAweDgwMDAKLSB8IHwrLS0tLS0tLS0gY2hlY2tzdW0KLSB8ICstLS0tLS0tLS0gdHlwZSA2IChkYXRhIHJlY29yZCkKLSArLS0tLS0tLS0tLS0gbGVuZ3RoIDNhIGNoYXJzCi0gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gM2EgKDU4IGNoYXJzKSAtLS0tLS0tLS0tLS0tLS0tLS0tPgotCi0lMUIzNzA5VF9TRUdNRU5UMTEwOEZGRkZGRkZGCi0gICAgICBeICAgICAgICAgXl4gXi0gOCBjaGFyYWN0ZXIgaW50ZWdlciAweGZmZmZmZmZmCi0gICAgICB8ICAgICAgICAgfCstICAgMSBjaGFyYWN0ZXIgaW50ZWdlciAwCi0gICAgICB8ICAgICAgICAgKy0tICAgdHlwZSAxIHN5bWJvbCAoc2VjdGlvbiBkZWZpbml0aW9uKQotICAgICAgKy0tLS0tLS0tLS0tLSAgIDkgY2hhciBzeW1ib2wgVF9TRUdNRU5UCi0KLSUyQjNBQjlUX1NFR01FTlQ3RGdjY19jb21waWxlZCQxMDg3aGVsbG8kYzEwCi0lMzczODI5VF9TRUdNRU5UODBpbnQkdDEkcjEkJDIxNDc0MTA4MGNoYXIkdDIkcjIkMCQxMjcxMAotJTM3Mzc2OVRfU0VHTUVOVDgwbG9uZyRpbnQkdDMkcjEkJDEwODB1bnNpZ25lZCRpbnQkdDQkMTAKLSUzNzNDQTlUX1NFR01FTlQ4MGxvbmckdW5zaWduZWQkaW4xMDgwc2hvcnQkaW50JHQ2JHIxJDEwCi0lMzczMDQ5VF9TRUdNRU5UODBsb25nJGxvbmckaW50JHQ3MTA4MHNob3J0JHVuc2lnbmVkJGkxMAotJTM3M0EyOVRfU0VHTUVOVDgwbG9uZyRsb25nJHVuc2lnbjEwODBzaWduZWQkY2hhciR0MTAkMTAKLSUzNzNENjlUX1NFR01FTlQ4MHVuc2lnbmVkJGNoYXIkdDExMDgwZmxvYXQkdDEyJHIxJDQkMDEwCi0lMzczRDE5VF9TRUdNRU5UODBkb3VibGUkdDEzJHIxJDgkMTA4MGxvbmckZG91YmxlJHQxNCQxMAotJTI3MzREOVRfU0VHTUVOVDhCdm9pZCR0MTUkMTUxMDM1X21haW4xMAotJTJGM0NBOVRfU0VHTUVOVDgxJDEwODEkMTY4MSQxRTgxJDIxNDg3bWFpbiRGMTEwCi0lMjgzMkY5VF9TRUdNRU5UODNpJDE4RkZGRkZGRkM4MSQxNDgxJDIxNAotJTA3ODEwMTAKLQotVHVybnMgaW50bwotc2FjQHRoZXB1YiQgLi9vYmpkdW1wIC1keCAtbSBtNjhrIGYKLQotZjogICAgIGZpbGUgZm9ybWF0IHRla2hleAotLS0tLS14LS0tIDkvNTU3MjggLTEzNDIxOTQxNiBTZXAgMjkgMTU6MTMgMTk5NSBmCi1hcmNoaXRlY3R1cmU6IFVOS05PV04hLCBmbGFncyAweDAwMDAwMDEwOgotSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMAotU0VDVElPTiAwIFtEMDAwMDAwMDBdCTogc2l6ZSAwMDAyMDAwMCB2bWEgMDAwMDAwMDAgYWxpZ24gMioqMAotIEFMTE9DLCBMT0FECi1TRUNUSU9OIDEgW0QwMDAwODAwMF0JOiBzaXplIDAwMDAyMDAxIHZtYSAwMDAwODAwMCBhbGlnbiAyKiowCi0KLVNFQ1RJT04gMiBbVF9TRUdNRU5UXQk6IHNpemUgZmZmZmZmZmYgdm1hIDAwMDAwMDAwIGFsaWduIDIqKjAKLQotU1lNQk9MIFRBQkxFOgotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGdjY19jb21waWxlZCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBoZWxsbyRjCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgaW50JHQxJHIxJCQyMTQ3NAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGNoYXIkdDIkcjIkMCQxMjcKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGludCR0MyRyMSQkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgdW5zaWduZWQkaW50JHQ0JAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckdW5zaWduZWQkaW4KLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBzaG9ydCRpbnQkdDYkcjEkCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgbG9uZyRsb25nJGludCR0NwotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHNob3J0JHVuc2lnbmVkJGkKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBsb25nJGxvbmckdW5zaWduCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgc2lnbmVkJGNoYXIkdDEwJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIHVuc2lnbmVkJGNoYXIkdDEKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCBmbG9hdCR0MTIkcjEkNCQwCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgZG91YmxlJHQxMyRyMSQ4JAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIGxvbmckZG91YmxlJHQxNCQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCB2b2lkJHQxNSQxNQotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIF9tYWluCi0wMDAwMDAwMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UICQKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAxMCAgZyAgICAgICBUX1NFR01FTlQgJAotMDAwMDAwMDAgIGcgICAgICAgVF9TRUdNRU5UIG1haW4kRjEKLWZjZmZmZmZmICBnICAgICAgIFRfU0VHTUVOVCBpJDEKLTAwMDAwMDAwICBnICAgICAgIFRfU0VHTUVOVCAkCi0wMDAwMDAxMCAgZyAgICAgICBUX1NFR01FTlQgJAotCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgW0QwMDAwMDAwMF06IChub25lKQotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFtEMDAwMDgwMDBdOiAobm9uZSkKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBbVF9TRUdNRU5UXTogKG5vbmUpCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gRDAwMDAwMDAwOgotLi4uCi0wMDAwODAwMCAoJCspN2ZmMCBsaW5rdyBmcCwjLTQKLTAwMDA4MDA0ICgkKyk3ZmY0IG5vcAotMDAwMDgwMDYgKCQrKTdmZjYgbW92ZWwgIzk5LGQwCi0wMDAwODAwOCAoJCspN2ZmOCBjbXBsIGZwQCgtNCksZDAKLTAwMDA4MDBjICgkKyk3ZmZjIGJsdHMgMDAwMDgwMTQgKCQrKTgwMDQKLTAwMDA4MDBlICgkKyk3ZmZlIGFkZHFsICMxLGZwQCgtNCkKLTAwMDA4MDEyICgkKyk4MDAyIGJyYXMgMDAwMDgwMDYgKCQrKTdmZjYKLTAwMDA4MDE0ICgkKyk4MDA0IHVubGsgZnAKLTAwMDA4MDE2ICgkKyk4MDA2IHJ0cwotLi4uCi0KLSovCi0KLXN0YXRpYyB2b2lkCi10ZWtoZXhfaW5pdCAoKQotewotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGVkID0gZmFsc2U7Ci0gIGludCB2YWw7Ci0KLSAgaWYgKGluaXRlZCA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpbml0ZWQgPSB0cnVlOwotICAgICAgaGV4X2luaXQgKCk7Ci0gICAgICB2YWwgPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCi0JewotCSAgc3VtX2Jsb2NrW2kgKyAnMCddID0gdmFsKys7Ci0JfQotICAgICAgZm9yIChpID0gJ0EnOyBpIDw9ICdaJzsgaSsrKQotCXsKLQkgIHN1bV9ibG9ja1tpXSA9IHZhbCsrOwotCX0KLSAgICAgIHN1bV9ibG9ja1snJCddID0gdmFsKys7Ci0gICAgICBzdW1fYmxvY2tbJyUnXSA9IHZhbCsrOwotICAgICAgc3VtX2Jsb2NrWycuJ10gPSB2YWwrKzsKLSAgICAgIHN1bV9ibG9ja1snXyddID0gdmFsKys7Ci0gICAgICBmb3IgKGkgPSAnYSc7IGkgPD0gJ3onOyBpKyspCi0JewotCSAgc3VtX2Jsb2NrW2ldID0gdmFsKys7Ci0JfQotICAgIH0KLX0KLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9uIGEgbGluZSBpcyBGRiAqLwotI2RlZmluZSBNQVhDSFVOSyAweGZmCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdlIGZpdCBvbnRvIGEgbGluZSBvbiBvdXRwdXQgKi8KLSNkZWZpbmUgQ0hVTksgMjEKLQotLyogV2UgY2Fubm90IG91dHB1dCBvdXIgdGVraGV4b3JkcyBhcyB3ZSBzZWUgdGhlbSwgd2UgaGF2ZSB0byBnbHVlIHRoZW0KLSAgIHRvZ2V0aGVyLCB0aGlzIGlzIGRvbmUgaW4gdGhpcyBzdHJ1Y3R1cmUgOiAqLwotCi1zdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF9zdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgYmZkX3ZtYSB3aGVyZTsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBzdHJ1Y3QgdGVraGV4X2RhdGFfbGlzdF9zdHJ1Y3QgKm5leHQ7Ci0KLX07Ci10eXBlZGVmIHN0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3N0cnVjdCB0ZWtoZXhfZGF0YV9saXN0X3R5cGU7Ci0KLSNkZWZpbmUgQ0hVTktfTUFTSyAweDFmZmYKLQotc3RydWN0IGRhdGFfc3RydWN0Ci0gIHsKLSAgICBjaGFyIGNodW5rX2RhdGFbQ0hVTktfTUFTSyArIDFdOwotICAgIGNoYXIgY2h1bmtfaW5pdFtDSFVOS19NQVNLICsgMV07Ci0gICAgYmZkX3ZtYSB2bWE7Ci0gICAgc3RydWN0IGRhdGFfc3RydWN0ICpuZXh0OwotICB9OwotCi10eXBlZGVmIHN0cnVjdCB0ZWtoZXhfZGF0YV9zdHJ1Y3QKLXsKLSAgdGVraGV4X2RhdGFfbGlzdF90eXBlICpoZWFkOwotICB1bnNpZ25lZCBpbnQgdHlwZTsKLSAgc3RydWN0IHRla2hleF9zeW1ib2xfc3RydWN0ICpzeW1ib2xzOwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmRhdGE7Ci19IHRkYXRhX3R5cGU7Ci0KLSNkZWZpbmUgZW5kYSh4KSAoeC0+dm1hICsgeC0+c2l6ZSkKLQotc3RhdGljIGJmZF92bWEKLWdldHZhbHVlIChzcmNwKQotICAgICBjaGFyICoqc3JjcDsKLXsKLSAgY2hhciAqc3JjID0gKnNyY3A7Ci0gIGJmZF92bWEgdmFsdWUgPSAwOwotICB1bnNpZ25lZCBpbnQgbGVuID0gaGV4X3ZhbHVlKCpzcmMrKyk7Ci0KLSAgaWYgKGxlbiA9PSAwKQotICAgIGxlbiA9IDE2OwotICB3aGlsZSAobGVuLS0pCi0gICAgewotICAgICAgdmFsdWUgPSB2YWx1ZSA8PCA0IHwgaGV4X3ZhbHVlKCpzcmMrKyk7Ci0gICAgfQotICAqc3JjcCA9IHNyYzsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1nZXRzeW0gKGRzdHAsIHNyY3ApCi0gICAgIGNoYXIgKmRzdHA7Ci0gICAgIGNoYXIgKipzcmNwOwotewotICBjaGFyICpzcmMgPSAqc3JjcDsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBsZW4gPSBoZXhfdmFsdWUoKnNyYysrKTsKLQotICBpZiAobGVuID09IDApCi0gICAgbGVuID0gMTY7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICBkc3RwW2ldID0gc3JjW2ldOwotICBkc3RwW2ldID0gMDsKLSAgKnNyY3AgPSBzcmMgKyBpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc3RydWN0IGRhdGFfc3RydWN0ICoKLWZpbmRfY2h1bmsgKGFiZmQsIHZtYSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmRfdm1hIHZtYTsKLXsKLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGE7Ci0KLSAgdm1hICY9IH5DSFVOS19NQVNLOwotICB3aGlsZSAoZCAmJiAoZC0+dm1hKSAhPSB2bWEpCi0gICAgewotICAgICAgZCA9IGQtPm5leHQ7Ci0gICAgfQotICBpZiAoIWQpCi0gICAgewotICAgICAgY2hhciAqc25hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIDEyKTsKLQotICAgICAgLyogTm8gY2h1bmsgZm9yIHRoaXMgYWRkcmVzcywgc28gbWFrZSBvbmUgdXAgKi8KLSAgICAgIGQgPSAoc3RydWN0IGRhdGFfc3RydWN0ICopCi0JYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBkYXRhX3N0cnVjdCkpOwotCi0gICAgICBpZiAoIXNuYW1lIHx8ICFkKQotCXJldHVybiBOVUxMOwotCi0gICAgICBtZW1zZXQgKGQtPmNodW5rX2luaXQsIDAsIENIVU5LX01BU0sgKyAxKTsKLSAgICAgIG1lbXNldCAoZC0+Y2h1bmtfZGF0YSwgMCwgQ0hVTktfTUFTSyArIDEpOwotICAgICAgZC0+bmV4dCA9IGFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5kYXRhOwotICAgICAgZC0+dm1hID0gdm1hOwotICAgICAgYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPmRhdGEgPSBkOwotICAgIH0KLSAgcmV0dXJuIGQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfYnl0ZSAoYWJmZCwgdmFsdWUsIGFkZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHZhbHVlOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIC8qIEZpbmQgdGhlIGNodW5rIHRoYXQgdGhpcyBieXRlIG5lZWRzIGFuZCBwdXQgaXQgaW4gKi8KLSAgc3RydWN0IGRhdGFfc3RydWN0ICpkID0gZmluZF9jaHVuayAoYWJmZCwgYWRkcik7Ci0KLSAgZC0+Y2h1bmtfZGF0YVthZGRyICYgQ0hVTktfTUFTS10gPSB2YWx1ZTsKLSAgZC0+Y2h1bmtfaW5pdFthZGRyICYgQ0hVTktfTUFTS10gPSAxOwotfQotCi0vKiBUaGUgZmlyc3QgcGFzcyBpcyB0byBmaW5kIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHNlY3Rpb25zLCBhbmQgc2VlCi0gIGhvdyBiaWcgdGhlIGRhdGEgaXMgKi8KLXN0YXRpYyB2b2lkCi1maXJzdF9waGFzZSAoYWJmZCwgdHlwZSwgc3JjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpzcmM7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgaW50IGxlbjsKLSAgY2hhciBzeW1bMTddOwkJCS8qIEEgc3ltYm9sIGNhbiBvbmx5IGJlIDE2Y2hhcnMgbG9uZyAqLwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnNic6Ci0gICAgICAvKiBEYXRhIHJlY29yZCAtIHJlYWQgaXQgYW5kIHN0b3JlIGl0ICovCi0gICAgICB7Ci0JYmZkX3ZtYSBhZGRyID0gZ2V0dmFsdWUgKCZzcmMpOwotCi0Jd2hpbGUgKCpzcmMpCi0JICB7Ci0JICAgIGluc2VydF9ieXRlIChhYmZkLCBIRVggKHNyYyksIGFkZHIpOwotCSAgICBzcmMgKz0gMjsKLQkgICAgYWRkcisrOwotCSAgfQotICAgICAgfQotCi0gICAgICByZXR1cm47Ci0gICAgY2FzZSAnMyc6Ci0gICAgICAvKiBTeW1ib2wgcmVjb3JkLCByZWFkIHRoZSBzZWdtZW50ICovCi0gICAgICBsZW4gPSBnZXRzeW0gKHN5bSwgJnNyYyk7Ci0gICAgICBzZWN0aW9uID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHN5bSk7Ci0gICAgICBpZiAoc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQl7Ci0JICBjaGFyICpuID0gYmZkX2FsbG9jIChhYmZkLCBsZW4gKyAxKTsKLQotCSAgaWYgKCFuKQotCSAgICBhYm9ydCgpOwkJLyogRklYTUUgKi8KLQkgIG1lbWNweSAobiwgc3ltLCBsZW4gKyAxKTsKLQkgIHNlY3Rpb24gPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCBuKTsKLQl9Ci0gICAgICB3aGlsZSAoKnNyYykKLQl7Ci0JICBzd2l0Y2ggKCpzcmMpCi0JICAgIHsKLQkgICAgY2FzZSAnMSc6CQkvKiBzZWN0aW9uIHJhbmdlICovCi0JICAgICAgc3JjKys7Ci0JICAgICAgc2VjdGlvbi0+dm1hID0gZ2V0dmFsdWUgKCZzcmMpOwotCSAgICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGdldHZhbHVlICgmc3JjKSAtIHNlY3Rpb24tPnZtYTsKLQkgICAgICBzZWN0aW9uLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRCB8IFNFQ19BTExPQzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMCc6Ci0JICAgIGNhc2UgJzInOgotCSAgICBjYXNlICczJzoKLQkgICAgY2FzZSAnNCc6Ci0JICAgIGNhc2UgJzYnOgotCSAgICBjYXNlICc3JzoKLQkgICAgY2FzZSAnOCc6Ci0JICAgICAgLyogU3ltYm9scywgYWRkIHRvIHNlY3Rpb24gKi8KLQkgICAgICB7Ci0JCXRla2hleF9zeW1ib2xfdHlwZSAqbmV3ID0KLQkJKHRla2hleF9zeW1ib2xfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJCSAgICAgICBzaXplb2YgKHRla2hleF9zeW1ib2xfdHlwZSkpOwotCQljaGFyIHR5cGUgPSAoKnNyYyk7Ci0KLQkJaWYgKCFuZXcpCi0JCSAgYWJvcnQoKTsJLyogRklYTUUgKi8KLQkJbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0JCXNyYysrOwotCQlhYmZkLT5zeW1jb3VudCsrOwotCQlhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQkJbmV3LT5wcmV2ID0gYWJmZC0+dGRhdGEudGVraGV4X2RhdGEtPnN5bWJvbHM7Ci0JCWFiZmQtPnRkYXRhLnRla2hleF9kYXRhLT5zeW1ib2xzID0gbmV3OwotCQlsZW4gPSBnZXRzeW0gKHN5bSwgJnNyYyk7Ci0JCW5ldy0+c3ltYm9sLm5hbWUgPSBiZmRfYWxsb2MgKGFiZmQsIGxlbiArIDEpOwotCQlpZiAoIW5ldy0+c3ltYm9sLm5hbWUpCi0JCSAgYWJvcnQoKTsJLyogRklYTUUgKi8KLQkJbWVtY3B5ICgoY2hhciAqKSAobmV3LT5zeW1ib2wubmFtZSksIHN5bSwgbGVuICsgMSk7Ci0JCW5ldy0+c3ltYm9sLnNlY3Rpb24gPSBzZWN0aW9uOwotCQlpZiAodHlwZSA8PSAnNCcpCi0JCSAgbmV3LT5zeW1ib2wuZmxhZ3MgPSAoQlNGX0dMT0JBTCB8IEJTRl9FWFBPUlQpOwotCQllbHNlCi0JCSAgbmV3LT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTE9DQUw7Ci0JCW5ldy0+c3ltYm9sLnZhbHVlID0gZ2V0dmFsdWUgKCZzcmMpIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIH0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFBhc3Mgb3ZlciBhbiB0ZWtoZXgsIGNhbGxpbmcgb25lIG9mIHRoZSBhYm92ZSBmdW5jdGlvbnMgb24gZWFjaAotICAgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhc3Nfb3ZlciAoYWJmZCwgZnVuYykKLSAgICAgYmZkICphYmZkOwotICAgICB2b2lkICgqZnVuYykgUEFSQU1TICgoYmZkICosIGludCwgY2hhciAqKSk7Ci17Ci0gIHVuc2lnbmVkIGludCBjaGFyc19vbl9saW5lOwotICBib29sZWFuIGVvZiA9IGZhbHNlOwotCi0gIC8qIFRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0gIHdoaWxlIChlb2YgPT0gZmFsc2UpCi0gICAgewotICAgICAgY2hhciBidWZmZXJbTUFYQ0hVTktdOwotICAgICAgY2hhciAqc3JjID0gYnVmZmVyOwotICAgICAgY2hhciB0eXBlOwotCi0gICAgICAvKiBGaW5kIGZpcnN0ICclJyAqLwotICAgICAgZW9mID0gKGJvb2xlYW4pIChiZmRfcmVhZCAoc3JjLCAxLCAxLCBhYmZkKSAhPSAxKTsKLSAgICAgIHdoaWxlICgqc3JjICE9ICclJyAmJiAhZW9mKQotCXsKLQkgIGVvZiA9IChib29sZWFuKSAoYmZkX3JlYWQgKHNyYywgMSwgMSwgYWJmZCkgIT0gMSk7Ci0JfQotICAgICAgaWYgKGVvZikKLQlicmVhazsKLSAgICAgIHNyYysrOwotCi0gICAgICAvKiBGZXRjaCB0aGUgdHlwZSBhbmQgdGhlIGxlbmd0aCBhbmQgdGhlIGNoZWNrc3VtICovCi0gICAgICBpZiAoYmZkX3JlYWQgKHNyYywgMSwgNSwgYWJmZCkgIT0gNSkKLQlhYm9ydCAoKTsgLyogRklYTUUgKi8KLQotICAgICAgdHlwZSA9IHNyY1syXTsKLQotICAgICAgaWYgKCFJU0hFWCAoc3JjWzBdKSB8fCAhSVNIRVggKHNyY1sxXSkpCi0JYnJlYWs7Ci0KLSAgICAgIGNoYXJzX29uX2xpbmUgPSBIRVggKHNyYykgLSA1OwkvKiBBbHJlYWR5IHJlYWQgZml2ZSBjaGFyICovCi0KLSAgICAgIGlmIChiZmRfcmVhZCAoc3JjLCAxLCBjaGFyc19vbl9saW5lLCBhYmZkKSAhPSBjaGFyc19vbl9saW5lKQotCWFib3J0ICgpOyAvKiBGSVhNRSAqLwotICAgICAgc3JjW2NoYXJzX29uX2xpbmVdID0gMDsJLyogcHV0IGEgbnVsbCBhdCB0aGUgZW5kICovCi0KLSAgICAgIGZ1bmMgKGFiZmQsIHR5cGUsIHNyYyk7Ci0gICAgfQotCi19Ci0KLXN0YXRpYyBsb25nCi10ZWtoZXhfZ2V0X3N5bXRhYiAoYWJmZCwgdGFibGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnRhYmxlOwotewotICB0ZWtoZXhfc3ltYm9sX3R5cGUgKnAgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+c3ltYm9sczsKLSAgdW5zaWduZWQgaW50IGMgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLQotICB0YWJsZVtjXSA9IDA7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYmxlWy0tY10gPSAmKHAtPnN5bWJvbCk7Ci0gICAgICBwID0gcC0+cHJldjsKLSAgICB9Ci0KLSAgcmV0dXJuIGJmZF9nZXRfc3ltY291bnQgKGFiZmQpOwotfQotCi1zdGF0aWMgbG9uZwotdGVraGV4X2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcmV0dXJuIChhYmZkLT5zeW1jb3VudCArIDEpICogKHNpemVvZiAoc3RydWN0IHRla2hleF9hc3ltYm9sX3N0cnVjdCAqKSk7Ci0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXRla2hleF9ta29iamVjdCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB0ZGF0YV90eXBlICp0ZGF0YSA9ICh0ZGF0YV90eXBlICopIGJmZF9hbGxvYyAoYWJmZCwgc2l6ZW9mICh0ZGF0YV90eXBlKSk7Ci0KLSAgaWYgKCF0ZGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGFiZmQtPnRkYXRhLnRla2hleF9kYXRhID0gdGRhdGE7Ci0gIHRkYXRhLT50eXBlID0gMTsKLSAgdGRhdGEtPmhlYWQgPSAodGVraGV4X2RhdGFfbGlzdF90eXBlICopIE5VTEw7Ci0gIHRkYXRhLT5zeW1ib2xzID0gKHN0cnVjdCB0ZWtoZXhfc3ltYm9sX3N0cnVjdCAqKSBOVUxMOwotICB0ZGF0YS0+ZGF0YSA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0gIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGxvb2tzIGxpa2UgaXQncyBpbiBUZWtIZXggZm9ybWF0LiBKdXN0IGxvb2sKLSAgZm9yIGEgcGVyY2VudCBzaWduIGFuZCBzb21lIGhleCBkaWdpdHMgKi8KLQotc3RhdGljIGNvbnN0IGJmZF90YXJnZXQgKgotdGVraGV4X29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgYls0XTsKLQotICB0ZWtoZXhfaW5pdCAoKTsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDAKLSAgICAgIHx8IGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKSAhPSA0KQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChiWzBdICE9ICclJyB8fCAhSVNIRVggKGJbMV0pIHx8ICFJU0hFWCAoYlsyXSkgfHwgIUlTSEVYIChiWzNdKSkKLSAgICByZXR1cm4gKGNvbnN0IGJmZF90YXJnZXQgKikgTlVMTDsKLQotICB0ZWtoZXhfbWtvYmplY3QgKGFiZmQpOwotCi0gIHBhc3Nfb3ZlciAoYWJmZCwgZmlyc3RfcGhhc2UpOwotICByZXR1cm4gYWJmZC0+eHZlYzsKLX0KLQotc3RhdGljIHZvaWQKLW1vdmVfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb25wLCBvZmZzZXQsIGNvdW50LCBnZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLSAgICAgYm9vbGVhbiBnZXQ7Ci17Ci0gIGJmZF92bWEgYWRkcjsKLSAgY2hhciAqbG9jYXRpb24gPSAoY2hhciAqKSBsb2NhdGlvbnA7Ci0gIGJmZF92bWEgcHJldl9udW1iZXIgPSAxOwkvKiBOb3RoaW5nIGNhbiBoYXZlIHRoaXMgYXMgYSBoaWdoIGJpdCovCi0gIHN0cnVjdCBkYXRhX3N0cnVjdCAqZCA9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLQotICBmb3IgKGFkZHIgPSBzZWN0aW9uLT52bWE7IGNvdW50ICE9IDA7IGNvdW50LS0sIGFkZHIrKykKLSAgICB7Ci0KLSAgICAgIGJmZF92bWEgY2h1bmtfbnVtYmVyID0gYWRkciAmIH5DSFVOS19NQVNLOwkvKiBHZXQgaGlnaCBiaXRzIG9mIGFkZHJlc3MgKi8KLSAgICAgIGJmZF92bWEgbG93X2JpdHMgPSBhZGRyICYgQ0hVTktfTUFTSzsKLQotICAgICAgaWYgKGNodW5rX251bWJlciAhPSBwcmV2X251bWJlcikKLQl7Ci0JICAvKiBEaWZmZXJlbnQgY2h1bmssIHNvIG1vdmUgcG9pbnRlciAqLwotCSAgZCA9IGZpbmRfY2h1bmsgKGFiZmQsIGNodW5rX251bWJlcik7Ci0JfQotCi0gICAgICBpZiAoZ2V0KQotCXsKLQkgIGlmIChkLT5jaHVua19pbml0W2xvd19iaXRzXSkKLQkgICAgewotCSAgICAgICpsb2NhdGlvbiA9IGQtPmNodW5rX2RhdGFbbG93X2JpdHNdOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqbG9jYXRpb24gPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGQtPmNodW5rX2RhdGFbbG93X2JpdHNdID0gKmxvY2F0aW9uOwotCSAgZC0+Y2h1bmtfaW5pdFtsb3dfYml0c10gPSAoKmxvY2F0aW9uICE9IDApOwotCX0KLQotICAgICAgbG9jYXRpb24rKzsKLQotICAgIH0KLQotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSAgaWYgKHNlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLSAgICB7Ci0gICAgICBtb3ZlX3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBjb3VudCwgdHJ1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSkKLSAgICAgYmZkICphYmZkOwotICAgICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgICAgdW5zaWduZWQgbG9uZyBtYWNoaW5lOwotewotICByZXR1cm4gYmZkX2RlZmF1bHRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYXJjaCwgbWFjaGluZSk7Ci19Ci0KLS8qIHdlIGhhdmUgdG8gc2F2ZSB1cCBhbGwgdGhlIFRla2hleG9yZHMgZm9yIGEgc3BsdXJnZSBiZWZvcmUgb3V0cHV0LAotICAgICovCi0KLXN0YXRpYyBib29sZWFuCi10ZWtoZXhfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9ucCwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbnA7Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBieXRlc190b19kbzsKLXsKLQotICBpZiAoYWJmZC0+b3V0cHV0X2hhc19iZWd1biA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICAvKiBUaGUgZmlyc3QgdGltZSBhcm91bmQsIGFsbG9jYXRlIGVub3VnaCBzZWN0aW9ucyB0byBob2xkIGFsbCB0aGUgY2h1bmtzICovCi0gICAgICBhc2VjdGlvbiAqcyA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgYmZkX3ZtYSB2bWE7Ci0KLSAgICAgIGZvciAocyA9IGFiZmQtPnNlY3Rpb25zOyBzOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAocy0+ZmxhZ3MgJiBTRUNfTE9BRCkKLQkgICAgewotCSAgICAgIGZvciAodm1hID0gcy0+dm1hICYgfkNIVU5LX01BU0s7Ci0JCSAgIHZtYSA8IHMtPnZtYSArIHMtPl9yYXdfc2l6ZTsKLQkJICAgdm1hICs9IENIVU5LX01BU0spCi0JCWZpbmRfY2h1bmsgKGFiZmQsIHZtYSk7Ci0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGlmIChzZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0gICAgewotICAgICAgbW92ZV9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbnAsIG9mZnNldCwgYnl0ZXNfdG9fZG8sIGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotfQotCi1zdGF0aWMgdm9pZAotd3JpdGV2YWx1ZSAoZHN0LCB2YWx1ZSkKLSAgICAgY2hhciAqKmRzdDsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgY2hhciAqcCA9ICpkc3Q7Ci0gIGludCBsZW47Ci0gIGludCBzaGlmdDsKLQotICBmb3IgKGxlbiA9IDgsIHNoaWZ0ID0gMjg7IHNoaWZ0OyBzaGlmdCAtPSA0LCBsZW4tLSkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlID4+IHNoaWZ0KSAmIDB4ZikKLQl7Ci0JICAqcCsrID0gbGVuICsgJzAnOwotCSAgd2hpbGUgKGxlbikKLQkgICAgewotCSAgICAgICpwKysgPSBkaWdzWyh2YWx1ZSA+PiBzaGlmdCkgJiAweGZdOwotCSAgICAgIHNoaWZ0IC09IDQ7Ci0JICAgICAgbGVuLS07Ci0JICAgIH0KLQkgICpkc3QgPSBwOwotCSAgcmV0dXJuOwotCi0JfQotICAgIH0KLSAgKnArKyA9ICcxJzsKLSAgKnArKyA9ICcwJzsKLSAgKmRzdCA9IHA7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cml0ZXN5bSAoZHN0LCBzeW0pCi0gICAgIGNoYXIgKipkc3Q7Ci0gICAgIENPTlNUIGNoYXIgKnN5bTsKLXsKLSAgY2hhciAqcCA9ICpkc3Q7Ci0gIGludCBsZW4gPSAoc3ltID8gc3RybGVuIChzeW0pIDogMCk7Ci0KLSAgaWYgKGxlbiA+PSAxNikKLSAgICB7Ci0gICAgICAqcCsrID0gJzAnOwotICAgICAgbGVuID0gMTY7Ci0gICAgfQotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGVuID09IDApCi0JewotCSAgKnArKyA9ICcxJzsKLQkgIHN5bSA9ICIkIjsKLQkgIGxlbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpwKysgPSBkaWdzW2xlbl07Ci0JfQotICAgIH0KLQotICB3aGlsZSAobGVuLS0pCi0gICAgewotICAgICAgKnArKyA9ICpzeW0rKzsKLSAgICB9Ci0gICpkc3QgPSBwOwotfQotCi1zdGF0aWMgdm9pZAotb3V0IChhYmZkLCB0eXBlLCBzdGFydCwgZW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpzdGFydDsKLSAgICAgY2hhciAqZW5kOwotewotICBpbnQgc3VtID0gMDsKLSAgY2hhciAqczsKLSAgY2hhciBmcm9udFs2XTsKLSAgYmZkX3NpemVfdHlwZSB3cmxlbjsKLQotICBmcm9udFswXSA9ICclJzsKLSAgVE9IRVggKGZyb250ICsgMSwgZW5kIC0gc3RhcnQgKyA1KTsKLSAgZnJvbnRbM10gPSB0eXBlOwotCi0gIGZvciAocyA9IHN0YXJ0OyBzIDwgZW5kOyBzKyspCi0gICAgewotICAgICAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgKnNdOwotICAgIH0KLQotICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFsxXV07CS8qICBsZW5ndGggKi8KLSAgc3VtICs9IHN1bV9ibG9ja1sodW5zaWduZWQgY2hhcikgZnJvbnRbMl1dOwotICBzdW0gKz0gc3VtX2Jsb2NrWyh1bnNpZ25lZCBjaGFyKSBmcm9udFszXV07CS8qIHR5cGUgKi8KLSAgVE9IRVggKGZyb250ICsgNCwgc3VtKTsKLSAgaWYgKGJmZF93cml0ZSAoZnJvbnQsIDEsIDYsIGFiZmQpICE9IDYpCi0gICAgYWJvcnQgKCk7Ci0gIGVuZFswXSA9ICdcbic7Ci0gIHdybGVuID0gZW5kIC0gc3RhcnQgKyAxOwotICBpZiAoYmZkX3dyaXRlIChzdGFydCwgMSwgd3JsZW4sIGFiZmQpICE9IHdybGVuKQotICAgIGFib3J0ICgpOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgYnl0ZXNfd3JpdHRlbjsKLSAgY2hhciBidWZmZXJbMTAwXTsKLSAgYXN5bWJvbCAqKnA7Ci0gIGFzZWN0aW9uICpzOwotICBzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKmQ7Ci0KLSAgdGVraGV4X2luaXQgKCk7Ci0KLSAgYnl0ZXNfd3JpdHRlbiA9IDA7Ci0KLSAgLyogQW5kIHRoZSByYXcgZGF0YSAqLwotICBmb3IgKGQgPSBhYmZkLT50ZGF0YS50ZWtoZXhfZGF0YS0+ZGF0YTsKLSAgICAgICBkICE9IChzdHJ1Y3QgZGF0YV9zdHJ1Y3QgKikgTlVMTDsKLSAgICAgICBkID0gZC0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgbG93OwotCi0gICAgICBDT05TVCBpbnQgc3BhbiA9IDMyOwotICAgICAgaW50IGFkZHI7Ci0KLSAgICAgIC8qIFdyaXRlIGl0IGluIGJsb2NrcyBvZiAzMiBieXRlcyAqLwotCi0gICAgICBmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQ0hVTktfTUFTSyArIDE7IGFkZHIgKz0gc3BhbikKLQl7Ci0JICBpbnQgbmVlZCA9IDA7Ci0KLQkgIC8qIENoZWNrIHRvIHNlZSBpZiBuZWNlc3NhcnkgKi8KLQkgIGZvciAobG93ID0gMDsgIW5lZWQgJiYgbG93IDwgc3BhbjsgbG93KyspCi0JICAgIHsKLQkgICAgICBpZiAoZC0+Y2h1bmtfaW5pdFthZGRyICsgbG93XSkKLQkJbmVlZCA9IDE7Ci0JICAgIH0KLQkgIGlmIChuZWVkKQotCSAgICB7Ci0JICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOwotCi0JICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgYWRkciArIGQtPnZtYSk7Ci0JICAgICAgZm9yIChsb3cgPSAwOyBsb3cgPCBzcGFuOyBsb3crKykKLQkJewotCQkgIFRPSEVYIChkc3QsIGQtPmNodW5rX2RhdGFbYWRkciArIGxvd10pOwotCQkgIGRzdCArPSAyOwotCQl9Ci0JICAgICAgb3V0IChhYmZkLCAnNicsIGJ1ZmZlciwgZHN0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIC8qIHdyaXRlIGFsbCB0aGUgc2VjdGlvbiBoZWFkZXJzIGZvciB0aGUgc2VjdGlvbnMgKi8KLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gKGFzZWN0aW9uICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNoYXIgKmRzdCA9IGJ1ZmZlcjsKLQotICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPm5hbWUpOwotICAgICAgKmRzdCsrID0gJzEnOwotICAgICAgd3JpdGV2YWx1ZSAoJmRzdCwgcy0+dm1hKTsKLSAgICAgIHdyaXRldmFsdWUgKCZkc3QsIHMtPnZtYSArIHMtPl9yYXdfc2l6ZSk7Ci0gICAgICBvdXQgKGFiZmQsICczJywgYnVmZmVyLCBkc3QpOwotICAgIH0KLQotICAvKiBBbmQgdGhlIHN5bWJvbHMgKi8KLSAgaWYgKGFiZmQtPm91dHN5bWJvbHMpCi0gICAgewotICAgICAgZm9yIChwID0gYWJmZC0+b3V0c3ltYm9sczsgKnA7IHArKykKLQl7Ci0JICBpbnQgc2VjdGlvbl9jb2RlID0gYmZkX2RlY29kZV9zeW1jbGFzcyAoKnApOwotCi0JICBpZiAoc2VjdGlvbl9jb2RlICE9ICc/JykKLQkgICAgewkJCS8qIGRvIG5vdCBpbmNsdWRlIGRlYnVnIHN5bWJvbHMgKi8KLQkgICAgICBhc3ltYm9sICpzID0gKnA7Ci0JICAgICAgY2hhciAqZHN0ID0gYnVmZmVyOwotCi0JICAgICAgd3JpdGVzeW0gKCZkc3QsIHMtPnNlY3Rpb24tPm5hbWUpOwotCi0JICAgICAgc3dpdGNoIChzZWN0aW9uX2NvZGUpCi0JCXsKLQkJY2FzZSAnQSc6Ci0JCSAgKmRzdCsrID0gJzInOwotCQkgIGJyZWFrOwotCQljYXNlICdhJzoKLQkJICAqZHN0KysgPSAnNic7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0QnOgotCQljYXNlICdCJzoKLQkJY2FzZSAnTyc6Ci0JCSAgKmRzdCsrID0gJzQnOwotCQkgIGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAnYic6Ci0JCWNhc2UgJ28nOgotCQkgICpkc3QrKyA9ICc4JzsKLQkJICBicmVhazsKLQkJY2FzZSAnVCc6Ci0JCSAgKmRzdCsrID0gJzMnOwotCQkgIGJyZWFrOwotCQljYXNlICd0JzoKLQkJICAqZHN0KysgPSAnNyc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0MnOgotCQljYXNlICdVJzoKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHdyaXRlc3ltICgmZHN0LCBzLT5uYW1lKTsKLQkgICAgICB3cml0ZXZhbHVlICgmZHN0LCBzLT52YWx1ZSArIHMtPnNlY3Rpb24tPnZtYSk7Ci0JICAgICAgb3V0IChhYmZkLCAnMycsIGJ1ZmZlciwgZHN0KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQW5kIHRoZSB0ZXJtaW5hdG9yICovCi0gIGlmIChiZmRfd3JpdGUgKCIlMDc4MTAxMFxuIiwgMSwgOSwgYWJmZCkgIT0gOSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXRla2hleF9zaXplb2ZfaGVhZGVycyAoYWJmZCwgZXhlYykKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGV4ZWM7Ci0KLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBhc3ltYm9sICoKLXRla2hleF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICB0ZWtoZXhfc3ltYm9sX3R5cGUgKm5ldyA9Ci0gICh0ZWtoZXhfc3ltYm9sX3R5cGUgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QpKTsKLQotICBpZiAoIW5ldykKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3LT5zeW1ib2wudGhlX2JmZCA9IGFiZmQ7Ci0gIG5ldy0+cHJldiA9IChzdHJ1Y3QgdGVraGV4X3N5bWJvbF9zdHJ1Y3QgKikgTlVMTDsKLSAgcmV0dXJuICYobmV3LT5zeW1ib2wpOwotfQotCi1zdGF0aWMgdm9pZAotdGVraGV4X2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi1zdGF0aWMgdm9pZAotdGVraGV4X3ByaW50X3N5bWJvbCAoaWdub3JlX2FiZmQsIGZpbGVwLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICppZ25vcmVfYWJmZDsKLSAgICAgUFRSIGZpbGVwOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIGJmZF9wcmludF9zeW1ib2xfdHlwZSBob3c7Ci17Ci0gIEZJTEUgKmZpbGUgPSAoRklMRSAqKSBmaWxlcDsKLQotICBzd2l0Y2ggKGhvdykKLSAgICB7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiJXMiLCBzeW1ib2wtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX21vcmU6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX3ByaW50X3N5bWJvbF9hbGw6Ci0gICAgICB7Ci0JQ09OU1QgY2hhciAqc2VjdGlvbl9uYW1lID0gc3ltYm9sLT5zZWN0aW9uLT5uYW1lOwotCi0JYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLQotCWZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JCSBzZWN0aW9uX25hbWUsCi0JCSBzeW1ib2wtPm5hbWUpOwotICAgICAgfQotICAgIH0KLX0KLQotI2RlZmluZQl0ZWtoZXhfY2xvc2VfYW5kX2NsZWFudXAgX2JmZF9nZW5lcmljX2Nsb3NlX2FuZF9jbGVhbnVwCi0jZGVmaW5lIHRla2hleF9iZmRfZnJlZV9jYWNoZWRfaW5mbyBfYmZkX2dlbmVyaWNfYmZkX2ZyZWVfY2FjaGVkX2luZm8KLSNkZWZpbmUgdGVraGV4X25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSB0ZWtoZXhfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgYmZkX2dlbmVyaWNfaXNfbG9jYWxfbGFiZWxfbmFtZQotI2RlZmluZSB0ZWtoZXhfZ2V0X2xpbmVubyBfYmZkX25vc3ltYm9sc19nZXRfbGluZW5vCi0jZGVmaW5lIHRla2hleF9maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSB0ZWtoZXhfYmZkX21ha2VfZGVidWdfc3ltYm9sIF9iZmRfbm9zeW1ib2xzX2JmZF9tYWtlX2RlYnVnX3N5bWJvbAotI2RlZmluZSB0ZWtoZXhfcmVhZF9taW5pc3ltYm9scyBfYmZkX2dlbmVyaWNfcmVhZF9taW5pc3ltYm9scwotI2RlZmluZSB0ZWtoZXhfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgdGVraGV4X2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMgXAotICBiZmRfZ2VuZXJpY19nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSNkZWZpbmUgdGVraGV4X2JmZF9yZWxheF9zZWN0aW9uIGJmZF9nZW5lcmljX3JlbGF4X3NlY3Rpb24KLSNkZWZpbmUgdGVraGV4X2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUgX2JmZF9nZW5lcmljX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUKLSNkZWZpbmUgdGVraGV4X2JmZF9saW5rX2FkZF9zeW1ib2xzIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9zeW1ib2xzCi0jZGVmaW5lIHRla2hleF9iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSB0ZWtoZXhfYmZkX2xpbmtfc3BsaXRfc2VjdGlvbiBfYmZkX2dlbmVyaWNfbGlua19zcGxpdF9zZWN0aW9uCi0KLSNkZWZpbmUgdGVraGV4X2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotY29uc3QgYmZkX3RhcmdldCB0ZWtoZXhfdmVjID0KLXsKLSAgInRla2hleCIsCQkJLyogbmFtZSAqLwotICBiZmRfdGFyZ2V0X3Rla2hleF9mbGF2b3VyLAotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgaGVhZGVycyBieXRlIG9yZGVyICovCi0gIChFWEVDX1AgfAkJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX1NZTVMgfCBIQVNfTElORU5PIHwgSEFTX0RFQlVHIHwgSEFTX1JFTE9DIHwgSEFTX0xPQ0FMUyB8Ci0gICBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkvKiBzZWN0aW9uIGZsYWdzICovCi0gIDAsCQkJCS8qIGxlYWRpbmcgdW5kZXJzY29yZSAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE2LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBkYXRhICovCi0gIGJmZF9nZXRiNjQsIGJmZF9nZXRiX3NpZ25lZF82NCwgYmZkX3B1dGI2NCwKLSAgYmZkX2dldGIzMiwgYmZkX2dldGJfc2lnbmVkXzMyLCBiZmRfcHV0YjMyLAotICBiZmRfZ2V0YjE2LCBiZmRfZ2V0Yl9zaWduZWRfMTYsIGJmZF9wdXRiMTYsCS8qIGhkcnMgKi8KLQotICB7Ci0gICAgX2JmZF9kdW1teV90YXJnZXQsCi0gICAgdGVraGV4X29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHRla2hleF9ta29iamVjdCwKLSAgICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLSAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICBiZmRfZmFsc2UsCi0gICAgdGVraGV4X3dyaXRlX29iamVjdF9jb250ZW50cywKLSAgICBfYmZkX3dyaXRlX2FyY2hpdmVfY29udGVudHMsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHRla2hleCksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh0ZWtoZXgpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKF9iZmRfbm9yZWxvY3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfTElOSyAodGVraGV4KSwKLSAgQkZEX0pVTVBfVEFCTEVfRFlOQU1JQyAoX2JmZF9ub2R5bmFtaWMpLAotCi0gIChQVFIpIDAKLX07CmRpZmYgLS1naXQgYS9iZmQvdHJhZC1jb3JlLmMgYi9iZmQvdHJhZC1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDkyMGIuLjAwMDAwMDAKLS0tIGEvYmZkL3RyYWQtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE2ICswLDAgQEAKLS8qIEJGRCBiYWNrIGVuZCBmb3IgdHJhZGl0aW9uYWwgVW5peCBjb3JlIGZpbGVzIChVLWFyZWEgYW5kIHJhdyBzZWN0aW9ucykKLSAgIENvcHlyaWdodCAxOTg4LCA4OSwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEpvaG4gR2lsbW9yZSBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliYW91dC5oIiAgICAgICAgICAgLyogQkZEIGEub3V0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyAqLwotCi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jaW5jbHVkZSA8c3lzL2Rpci5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotCi0jaW5jbHVkZSA8c3lzL3VzZXIuaD4JCS8qIEFmdGVyIGEub3V0LmggICovCi0KLSNpZmRlZiBUUkFEX0hFQURFUgotI2luY2x1ZGUgVFJBRF9IRUFERVIKLSNlbmRpZgotCi0gIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0IAotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhX3NlY3Rpb247Ci0gICAgICBhc2VjdGlvbiAqc3RhY2tfc2VjdGlvbjsKLSAgICAgIGFzZWN0aW9uICpyZWdfc2VjdGlvbjsKLSAgICAgIHN0cnVjdCB1c2VyIHU7Ci0gICAgfTsKLQotI2RlZmluZSBjb3JlX3VwYWdlKGJmZCkgKCYoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51KSkKLSNkZWZpbmUgY29yZV9kYXRhc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+ZGF0YV9zZWN0aW9uKQotI2RlZmluZSBjb3JlX3N0YWNrc2VjKGJmZCkgKChiZmQpLT50ZGF0YS50cmFkX2NvcmVfZGF0YS0+c3RhY2tfc2VjdGlvbikKLSNkZWZpbmUgY29yZV9yZWdzZWMoYmZkKSAoKGJmZCktPnRkYXRhLnRyYWRfY29yZV9kYXRhLT5yZWdfc2VjdGlvbikKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLQotY29uc3QgYmZkX3RhcmdldCAqdHJhZF91bml4X2NvcmVfZmlsZV9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotY2hhciAqCQl0cmFkX3VuaXhfY29yZV9maWxlX2ZhaWxpbmdfY29tbWFuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWludAkJdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWJvb2xlYW4JCXRyYWRfdW5peF9jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AKLQkJCSBQQVJBTVMgKChiZmQgKmNvcmVfYmZkLCBiZmQgKmV4ZWNfYmZkKSk7Ci1zdGF0aWMgdm9pZAlzd2FwX2Fib3J0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSGFuZGxlIDQuMi1zdHlsZSAoYW5kIHBlcmhhcHMgYWxzbyBzeXNWLXN0eWxlKSBjb3JlIGR1bXAgZmlsZS4gICovCi0KLS8qIEFSR1NVU0VEICovCi1jb25zdCBiZmRfdGFyZ2V0ICoKLXRyYWRfdW5peF9jb3JlX2ZpbGVfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotCi17Ci0gIGludCB2YWw7Ci0gIHN0cnVjdCB1c2VyIHU7Ci0gIHN0cnVjdCB0cmFkX2NvcmVfc3RydWN0ICpyYXdwdHI7Ci0KLSNpZmRlZiBUUkFEX0NPUkVfVVNFUl9PRkZTRVQKLSAgLyogSWYgZGVmaW5lZCwgdGhpcyBtYWNybyBpcyB0aGUgZmlsZSBwb3NpdGlvbiBvZiB0aGUgdXNlciBzdHJ1Y3QuICAqLwotICBpZiAoYmZkX3NlZWsgKGFiZmQsIFRSQURfQ09SRV9VU0VSX09GRlNFVCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLSAgICAKLSAgdmFsID0gYmZkX3JlYWQgKCh2b2lkICopJnUsIDEsIHNpemVvZiB1LCBhYmZkKTsKLSAgaWYgKHZhbCAhPSBzaXplb2YgdSkKLSAgICB7Ci0gICAgICAvKiBUb28gc21hbGwgdG8gYmUgYSBjb3JlIGZpbGUgKi8KLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIFNhbml0eSBjaGVjayBwZXJoYXBzPz8/ICovCi0gIGlmICh1LnVfZHNpemUgPiAweDEwMDAwMDApCS8qIFJlbWVtYmVyLCBpdCdzIGluIHBhZ2VzLi4uICovCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmICh1LnVfc3NpemUgPiAweDEwMDAwMDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCB0aGUgc2l6ZSBjbGFpbWVkIGlzIG5vIGdyZWF0ZXIgdGhhbiB0aGUgZmlsZSBzaXplLiAgKi8KLSAgewotICAgIEZJTEUgKnN0cmVhbSA9IGJmZF9jYWNoZV9sb29rdXAgKGFiZmQpOwotICAgIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0gICAgaWYgKHN0cmVhbSA9PSBOVUxMKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKGZzdGF0IChmaWxlbm8gKHN0cmVhbSksICZzdGF0YnVmKSA8IDApCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSAgICBpZiAoTkJQRyAqIChVUEFHRVMgKyB1LnVfZHNpemUKLSNpZmRlZiBUUkFEX0NPUkVfRFNJWkVfSU5DTFVERVNfVFNJWkUKLQkJLSB1LnVfdHNpemUKLSNlbmRpZgotCQkrIHUudV9zc2l6ZSkgPiBzdGF0YnVmLnN0X3NpemUpCi0gICAgICB7Ci0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQlyZXR1cm4gMDsKLSAgICAgIH0KLSNpZm5kZWYgVFJBRF9DT1JFX0FMTE9XX0FOWV9FWFRSQV9TSVpFCi0gICAgaWYgKE5CUEcgKiAoVVBBR0VTICsgdS51X2RzaXplICsgdS51X3NzaXplKQotI2lmZGVmIFRSQURfQ09SRV9FWFRSQV9TSVpFX0FMTE9XRUQKLQkvKiBTb21lIHN5c3RlbXMgd3JpdGUgdGhlIGZpbGUgdG9vIGJpZy4gICovCi0JKyBUUkFEX0NPUkVfRVhUUkFfU0laRV9BTExPV0VECi0jZW5kaWYKLQk8IHN0YXRidWYuc3Rfc2l6ZSkKLSAgICAgIHsKLQkvKiBUaGUgZmlsZSBpcyB0b28gYmlnLiAgTWF5YmUgaXQncyBub3QgYSBjb3JlIGZpbGUKLQkgICBvciB3ZSBvdGhlcndpc2UgaGF2ZSBiYWQgdmFsdWVzIGZvciB1X2RzaXplIGFuZCB1X3NzaXplKS4gICovCi0JYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jZW5kaWYKLSAgfQotCi0gIC8qIE9LLCB3ZSBiZWxpZXZlIHlvdS4gIFlvdSdyZSBhIGNvcmUgZmlsZSAoc3VyZSwgc3VyZSkuICAqLwotCi0gIC8qIEFsbG9jYXRlIGJvdGggdGhlIHVwYWdlIGFuZCB0aGUgc3RydWN0IGNvcmVfZGF0YSBhdCBvbmNlLCBzbwotICAgICBhIHNpbmdsZSBmcmVlKCkgd2lsbCBmcmVlIHRoZW0gYm90aC4gICovCi0gIHJhd3B0ciA9IChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCAqKQotCQliZmRfem1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdHJhZF9jb3JlX3N0cnVjdCkpOwotICBpZiAocmF3cHRyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIAotICBhYmZkLT50ZGF0YS50cmFkX2NvcmVfZGF0YSA9IHJhd3B0cjsKLQotICByYXdwdHItPnUgPSB1OyAvKkNvcHkgdGhlIHVhcmVhIGludG8gdGhlIHRkYXRhIHBhcnQgb2YgdGhlIGJmZCAqLwotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHJhdW5jaHksIGJ1dCBiZmRfY2xvc2Ugd2FudHMgdG8gZnJlZQotICAgICB0aGVtIHNlcGFyYXRlbHkuICAqLwotCi0gIGNvcmVfc3RhY2tzZWMoYWJmZCkgPSAoYXNlY3Rpb24gKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc2VjdGlvbikpOwotICBpZiAoY29yZV9zdGFja3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgY29yZV9kYXRhc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX2RhdGFzZWMgKGFiZmQpID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKSA9IChhc2VjdGlvbiAqKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChjb3JlX3JlZ3NlYyAoYWJmZCkgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+bmFtZSA9ICIuc3RhY2siOwotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT5uYW1lID0gIi5kYXRhIjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5uYW1lID0gIi5yZWciOwotCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5mbGFncyA9IFNFQ19BTExPQyArIFNFQ19MT0FEICsgU0VDX0hBU19DT05URU5UUzsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfQUxMT0MgKyBTRUNfTE9BRCArIFNFQ19IQVNfQ09OVEVOVFM7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmxhZ3MgPSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPl9yYXdfc2l6ZSA9ICBOQlBHICogdS51X2RzaXplCi0jaWZkZWYgVFJBRF9DT1JFX0RTSVpFX0lOQ0xVREVTX1RTSVpFCi0gICAgLSBOQlBHICogdS51X3RzaXplCi0jZW5kaWYKLSAgICAgIDsKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPl9yYXdfc2l6ZSA9IE5CUEcgKiB1LnVfc3NpemU7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+X3Jhd19zaXplID0gTkJQRyAqIFVQQUdFUzsgLyogTGFyZ2VyIHRoYW4gc2l6ZW9mIHN0cnVjdCB1ICovCi0KLSAgLyogV2hhdCBhIGhhY2suLi4gd2UnZCBsaWtlIHRvIHN0ZWFsIGl0IGZyb20gdGhlIGV4ZWMgZmlsZSwKLSAgICAgc2luY2UgdGhlIHVwYWdlIGRvZXMgbm90IHNlZW0gdG8gcHJvdmlkZSBpdC4gIEZJWE1FLiAgKi8KLSNpZmRlZiBIT1NUX0RBVEFfU1RBUlRfQUREUgotICBjb3JlX2RhdGFzZWMgKGFiZmQpLT52bWEgPSBIT1NUX0RBVEFfU1RBUlRfQUREUjsKLSNlbHNlCi0gIGNvcmVfZGF0YXNlYyAoYWJmZCktPnZtYSA9IEhPU1RfVEVYVF9TVEFSVF9BRERSICsgKE5CUEcgKiB1LnVfdHNpemUpOwotI2VuZGlmCi0KLSNpZmRlZiBIT1NUX1NUQUNLX1NUQVJUX0FERFIKLSAgY29yZV9zdGFja3NlYyAoYWJmZCktPnZtYSA9IEhPU1RfU1RBQ0tfU1RBUlRfQUREUjsKLSNlbHNlCi0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT52bWEgPSBIT1NUX1NUQUNLX0VORF9BRERSIC0gKE5CUEcgKiB1LnVfc3NpemUpOwotI2VuZGlmCi0KLSAgLyogVGhpcyBpcyB0cmlja3kuICBBcyB0aGUgInJlZ2lzdGVyIHNlY3Rpb24iLCB3ZSBnaXZlIHRoZW0gdGhlIGVudGlyZQotICAgICB1cGFnZSBhbmQgc3RhY2suICB1LnVfYXIwIHBvaW50cyB0byB3aGVyZSAicmVnaXN0ZXIgMCIgaXMgc3RvcmVkLgotICAgICBUaGVyZSBhcmUgdHdvIHRyaWNrcyB3aXRoIHRoaXMsIHRob3VnaC4gIE9uZSBpcyB0aGF0IHRoZSByZXN0IG9mIHRoZQotICAgICByZWdpc3RlcnMgbWlnaHQgYmUgYXQgcG9zaXRpdmUgb3IgbmVnYXRpdmUgKG9yIGJvdGgpIGRpc3BsYWNlbWVudHMKLSAgICAgZnJvbSAqdV9hcjAuICBUaGUgb3RoZXIgaXMgdGhhdCB1X2FyMCBpcyBzb21ldGltZXMgYW4gYWJzb2x1dGUgYWRkcmVzcwotICAgICBpbiBrZXJuZWwgbWVtb3J5LCBhbmQgb24gb3RoZXIgc3lzdGVtcyBpdCBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBgc3RydWN0IHVzZXInLgotICAgICAKLSAgICAgQXMgYSBwcmFjdGljYWwgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSByZWdpc3RlcnMgYWN0dWFsbHkgYXJlLAotICAgICBzbyB3ZSBoYXZlIHRvIHBhc3MgdGhlIHdob2xlIGFyZWEgdG8gR0RCLiAgV2UgZW5jb2RlIHRoZSB2YWx1ZSBvZiB1X2FyMAotICAgICBieSBzZXR0aW5nIHRoZSAucmVncyBzZWN0aW9uIHVwIHNvIHRoYXQgaXRzIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MKLSAgICAgMCBpcyBhdCB0aGUgcGxhY2UgcG9pbnRlZCB0byBieSB1X2FyMCAoYnkgc2V0dGluZyB0aGUgdm1hIG9mIHRoZSBzdGFydAotICAgICBvZiB0aGUgc2VjdGlvbiB0byAtdV9hcjApLiAgR0RCIHVzZXMgdGhpcyBpbmZvIHRvIGxvY2F0ZSB0aGUgcmVncywKLSAgICAgdXNpbmcgbWlub3IgdHJpY2tlcnkgdG8gZ2V0IGFyb3VuZCB0aGUgb2Zmc2V0LW9yLWFic29sdXRlLWFkZHIgcHJvYmxlbS4gKi8KLSAgY29yZV9yZWdzZWMgKGFiZmQpLT52bWEgPSAwIC0gKGJmZF92bWEpIHUudV9hcjA7Ci0KLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+ZmlsZXBvcyA9IE5CUEcgKiBVUEFHRVM7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5maWxlcG9zID0gKE5CUEcgKiBVUEFHRVMpICsgTkJQRyAqIHUudV9kc2l6ZQotI2lmZGVmIFRSQURfQ09SRV9EU0laRV9JTkNMVURFU19UU0laRQotICAgIC0gTkJQRyAqIHUudV90c2l6ZQotI2VuZGlmCi0gICAgICA7Ci0gIGNvcmVfcmVnc2VjIChhYmZkKS0+ZmlsZXBvcyA9IDA7IC8qIFJlZ2lzdGVyIHNlZ21lbnQgaXMgdGhlIHVwYWdlICovCi0KLSAgLyogQWxpZ24gdG8gd29yZCBhdCBsZWFzdCAqLwotICBjb3JlX3N0YWNrc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLSAgY29yZV9yZWdzZWMgKGFiZmQpLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCi0gIGFiZmQtPnNlY3Rpb25zID0gY29yZV9zdGFja3NlYyAoYWJmZCk7Ci0gIGNvcmVfc3RhY2tzZWMgKGFiZmQpLT5uZXh0ID0gY29yZV9kYXRhc2VjIChhYmZkKTsKLSAgY29yZV9kYXRhc2VjIChhYmZkKS0+bmV4dCA9IGNvcmVfcmVnc2VjIChhYmZkKTsKLSAgYWJmZC0+c2VjdGlvbl9jb3VudCA9IDM7Ci0KLSAgcmV0dXJuIGFiZmQtPnh2ZWM7Ci19Ci0KLWNoYXIgKgotdHJhZF91bml4X2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZm5kZWYgTk9fQ09SRV9DT01NQU5ECi0gIGNoYXIgKmNvbSA9IGFiZmQtPnRkYXRhLnRyYWRfY29yZV9kYXRhLT51LnVfY29tbTsKLSAgaWYgKCpjb20pCi0gICAgcmV0dXJuIGNvbTsKLSAgZWxzZQotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1pbnQKLXRyYWRfdW5peF9jb3JlX2ZpbGVfZmFpbGluZ19zaWduYWwgKGlnbm9yZV9hYmZkKQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotewotI2lmZGVmIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwKLSAgcmV0dXJuIFRSQURfVU5JWF9DT1JFX0ZJTEVfRkFJTElOR19TSUdOQUwoaWdub3JlX2FiZmQpOwotI2Vsc2UKLSAgcmV0dXJuIC0xOwkJLyogRklYTUUsIHdoZXJlIGlzIGl0PyAqLwotI2VuZGlmCi19Ci0KLS8qIEFSR1NVU0VEICovCi1ib29sZWFuCi10cmFkX3VuaXhfY29yZV9maWxlX21hdGNoZXNfZXhlY3V0YWJsZV9wICAoY29yZV9iZmQsIGV4ZWNfYmZkKQotICAgICBiZmQgKmNvcmVfYmZkLCAqZXhlY19iZmQ7Ci17Ci0gIHJldHVybiB0cnVlOwkJLyogRklYTUUsIFdlIGhhdmUgbm8gd2F5IG9mIHRlbGxpbmcgYXQgdGhpcyBwb2ludCAqLwotfQotDAotLyogSWYgc29tZWJvZHkgY2FsbHMgYW55IGJ5dGUtc3dhcHBpbmcgcm91dGluZXMsIHNob290IHRoZW0uICAqLwotc3RhdGljIHZvaWQKLXN3YXBfYWJvcnQoKQotewotICBhYm9ydCgpOyAvKiBUaGlzIHdheSBkb2Vzbid0IHJlcXVpcmUgYW55IGRlY2xhcmF0aW9uIGZvciBBTlNJIHRvIGZ1Y2sgdXAgKi8KLX0KLSNkZWZpbmUJTk9fR0VUCSgoYmZkX3ZtYSAoKikgUEFSQU1TICgoICAgY29uc3QgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fUFVUCSgodm9pZCAgICAoKikgUEFSQU1TICgoYmZkX3ZtYSwgYmZkX2J5dGUgKikpKSBzd2FwX2Fib3J0ICkKLSNkZWZpbmUJTk9fU0lHTkVEX0dFVCBcCi0gICgoYmZkX3NpZ25lZF92bWEgKCopIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICopKSkgc3dhcF9hYm9ydCApCi0KLWNvbnN0IGJmZF90YXJnZXQgdHJhZF9jb3JlX3ZlYyA9Ci0gIHsKLSAgICAidHJhZC1jb3JlIiwKLSAgICBiZmRfdGFyZ2V0X3Vua25vd25fZmxhdm91ciwKLSAgICBCRkRfRU5ESUFOX1VOS05PV04sCQkvKiB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICAgIEJGRF9FTkRJQU5fVU5LTk9XTiwJCS8qIHRhcmdldCBoZWFkZXJzIGJ5dGUgb3JkZXIgKi8KLSAgICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJLyogb2JqZWN0IGZsYWdzICovCi0gICAgIEhBU19MSU5FTk8gfCBIQVNfREVCVUcgfAotICAgICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gICAgKFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyksIC8qIHNlY3Rpb24gZmxhZ3MgKi8KLSAgICAwLAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3ltYm9sIHByZWZpeCAqLwotICAgICcgJywJCQkJCQkgICAvKiBhcl9wYWRfY2hhciAqLwotICAgIDE2LAkJCQkJCQkgICAvKiBhcl9tYXhfbmFtZWxlbiAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgZGF0YSAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiA2NCBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAzMiBiaXQgaGRycyAqLwotICAgIE5PX0dFVCwgTk9fU0lHTkVEX0dFVCwgTk9fUFVULAkvKiAxNiBiaXQgaGRycyAqLwotCi0gICAgewkJCQkvKiBiZmRfY2hlY2tfZm9ybWF0ICovCi0gICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAkJLyogdW5rbm93biBmb3JtYXQgKi8KLSAgICAgX2JmZF9kdW1teV90YXJnZXQsCQkvKiBvYmplY3QgZmlsZSAqLwotICAgICBfYmZkX2R1bW15X3RhcmdldCwJCS8qIGFyY2hpdmUgKi8KLSAgICAgdHJhZF91bml4X2NvcmVfZmlsZV9wCS8qIGEgY29yZSBmaWxlICovCi0gICAgfSwKLSAgICB7CQkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlLAotICAgICBiZmRfZmFsc2UsIGJmZF9mYWxzZQotICAgIH0sCi0gICAgewkJCQkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgICAgYmZkX2ZhbHNlLCBiZmRfZmFsc2UsCi0gICAgIGJmZF9mYWxzZSwgYmZkX2ZhbHNlCi0gICAgfSwKLSAgICAKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDIChfYmZkX2dlbmVyaWMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfQ09SRSAodHJhZF91bml4KSwKLSAgICAgICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFIChfYmZkX25vYXJjaGl2ZSksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfU1lNQk9MUyAoX2JmZF9ub3N5bWJvbHMpLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAoX2JmZF9ub3JlbG9jcyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKF9iZmRfZ2VuZXJpYyksCi0gICAgICAgQkZEX0pVTVBfVEFCTEVfTElOSyAoX2JmZF9ub2xpbmspLAotICAgICAgIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAgIChQVFIpIDAJCQkvKiBiYWNrZW5kX2RhdGEgKi8KLX07CmRpZmYgLS1naXQgYS9iZmQvdmF4bmV0YnNkLmMgYi9iZmQvdmF4bmV0YnNkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzdkMDkuLjAwMDAwMDAKLS0tIGEvYmZkL3ZheG5ldGJzZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBOZXRCU0QvVkFYIGEub3V0LWlzaCBiaW5hcmllcy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUJQllURVNfSU5fV09SRAk0Ci0jdW5kZWYgVEFSR0VUX0lTX0JJR19FTkRJQU5fUAotCi0jZGVmaW5lCVRBUkdFVF9QQUdFX1NJWkUJMTAyNAotI2RlZmluZQlTRUdNRU5UX1NJWkUJVEFSR0VUX1BBR0VfU0laRQotCi0jZGVmaW5lCURFRkFVTFRfQVJDSAliZmRfYXJjaF92YXgKLSNkZWZpbmUJREVGQVVMVF9NSUQgCU1fVkFYX05FVEJTRAotCi0jZGVmaW5lIE1ZKE9QKSBDQVQodmF4bmV0YnNkXyxPUCkKLS8qIFRoaXMgbmVlZHMgdG8gc3RhcnQgd2l0aCBhLm91dCBzbyBHREIga25vd3MgaXQgaXMgYW4gYS5vdXQgdmFyaWFudC4gICovCi0jZGVmaW5lIFRBUkdFVE5BTUUgImEub3V0LXZheC1uZXRic2QiCi0KLSNpbmNsdWRlICJuZXRic2QuaCIKZGlmZiAtLWdpdCBhL2JmZC92ZXJzYWRvcy5jIGIvYmZkL3ZlcnNhZG9zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkY2QxMDguLjAwMDAwMDAKLS0tIGEvYmZkL3ZlcnNhZG9zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLyogQkZEIGJhY2stZW5kIGZvciBWRVJTQWRvcy1FIG9iamVjdHMuCi0gICBDb3B5cmlnaHQgMTk5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IDxzYWNAY3lnbnVzLmNvbT4uCi0KLSAgIFZlcnNhZG9zIGlzIGEgTW90b3JvbGEgdHJhZGVtYXJrLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gICBTVUJTRUNUSU9OCi0gICBWRVJTQWRvcy1FIHJlbG9jYXRlYWJsZSBvYmplY3QgZmlsZSBmb3JtYXQKLQotICAgREVTQ1JJUFRJT04KLQotICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgcmVhZGluZyBvZiBWRVJTQWRvcyByZWxvY2F0ZWFibGUKLSAgIG9iamVjdCBmaWxlcy4KLQotICAgQSBWRVJTQWRvcyBmaWxlIGxvb2tzIGxpa2UgY29udGFpbnMKLQotICAgbyBJbmRlbnRpZmljYXRpb24gUmVjb3JkCi0gICBvIEV4dGVybmFsIFN5bWJvbCBEZWZpbml0aW9uIFJlY29yZAotICAgbyBPYmplY3QgVGV4dCBSZWNyb2QKLSAgIG8gRW5kIFJlY29yZAotCi0KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLQotc3RhdGljIGJvb2xlYW4gdmVyc2Fkb3NfbWtvYmplY3QgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHZlcnNhZG9zX3NjYW4gUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyBjb25zdCBiZmRfdGFyZ2V0ICp2ZXJzYWRvc19vYmplY3RfcCBQQVJBTVMgKChiZmQgKikpOwotCi0KLSNkZWZpbmUgVkhFQURFUiAnMScKLSNkZWZpbmUgVkVTVERFRiAnMicKLSNkZWZpbmUgVk9UUiAnMycKLSNkZWZpbmUgVkVORCAnNCcKLQotCi0jZGVmaW5lIEVTX0JBU0UgMTcJCS8qIGZpcnN0IHN5bWJvbCBoYXMgZXNkaWQgMTcgKi8KLQotLyogUGVyIGZpbGUgdGFyZ2V0IGRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotCi0vKiBvbmUgZm9yIGVhY2ggc2VjdGlvbiAqLwotc3RydWN0IGVzZGlkCi0gIHsKLSAgICBhc2VjdGlvbiAqc2VjdGlvbjsJCS8qIHB0ciB0byBiZmQgdmVyc2lvbiAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwkvKiB1c2VkIHRvIGJ1aWxkIGltYWdlICovCi0gICAgaW50IHBjOwotICAgIGludCByZWxvY3M7CQkJLyogcmVsb2MgY291bnQsIHZhbGlkIGVuZCBvZiBwYXNzIDEgKi8KLSAgICBpbnQgZG9uZXJlbDsJCS8qIGhhdmUgcmVsb2NzIGJlZW4gdHJhbnNsYXRlZCAqLwotICB9OwotCi10eXBlZGVmIHN0cnVjdCB2ZXJzYWRvc19kYXRhX3N0cnVjdAotICB7Ci0gICAgaW50IGVzX2RvbmU7CQkvKiBjb3VudCBvZiBzeW1ib2wgaW5kZXgsIHN0YXJ0cyBhdCBFU19CQVNFICovCi0gICAgYXN5bWJvbCAqc3ltYm9sczsJCS8qIHBvaW50ZXIgdG8gbG9jYWwgc3ltYm9scyAqLwotICAgIGNoYXIgKnN0cmluZ3M7CQkvKiBzdHJpbmdzIG9mIGFsbCB0aGUgYWJvdmUgKi8KLSAgICBpbnQgc3RyaW5nbGVuOwkJLyogbGVuIG9mIHN0cmluZyB0YWJsZSAodmFsaWQgZW5kIG9mIHBhc3MxKSAqLwotICAgIGludCBuc2Vjc3ltczsJCS8qIG51bWJlciBvZiBzZWN0aW9ucyAqLwotCi0gICAgaW50IG5kZWZzOwkJCS8qIG51bWJlciBvZiBleHBvcnRlZCBzeW1ib2xzICh0aGV5IGRvbnQgZ2V0IGVzZGlkcykgKi8KLSAgICBpbnQgbnJlZnM7CQkJLyogbnVtYmVyIG9mIGltcG9ydGVkIHN5bWJvbHMgICh2YWxpZCBlbmQgb2YgcGFzczEpICovCi0KLSAgICBpbnQgcmVmX2lkeDsJCS8qIGN1cnJlbnQgcHJvY2Vzc2VkIHZhbHVlIG9mIHRoZSBhYm92ZSAqLwotICAgIGludCBkZWZfaWR4OwotCi0gICAgaW50IHBhc3NfMl9kb25lOwotCi0gICAgc3RydWN0IGVzZGlkIGVbMTZdOwkJLyogcGVyIHNlY3Rpb24gaW5mbyAqLwotICAgIGludCBhbGVydDsJCQkvKiB0byBzZWUgaWYgd2UncmUgdHJhbXBsaW5nICovCi0gICAgYXN5bWJvbCAqcmVzdFsyNTYgLSAxNl07CS8qIHBlciBzeW1ib2wgaW5mbyAqLwotCi0gIH0KLXRkYXRhX3R5cGU7Ci0KLSNkZWZpbmUgVkRBVEEoYWJmZCkgICAgICAgKGFiZmQtPnRkYXRhLnZlcnNhZG9zX2RhdGEpCi0jZGVmaW5lIEVEQVRBKGFiZmQsIG4pICAgIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhLT5lW25dKQotI2RlZmluZSBSREFUQShhYmZkLCBuKSAgICAoYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YS0+cmVzdFtuXSkKLQotc3RydWN0IGV4dF9vdHIKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgICBjaGFyIHR5cGU7Ci0gICAgdW5zaWduZWQgY2hhciBtYXBbNF07Ci0gICAgdW5zaWduZWQgY2hhciBlc2RpZDsKLSAgICB1bnNpZ25lZCBjaGFyIGRhdGFbMjAwXTsKLSAgfTsKLQotc3RydWN0IGV4dF92aGVhZGVyCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIHNpemU7Ci0gICAgY2hhciB0eXBlOwkJCS8qIHJlY29yZCB0eXBlICovCi0gICAgY2hhciBuYW1lWzEwXTsJCS8qIG1vZHVsZSBuYW1lICovCi0gICAgY2hhciByZXY7CQkJLyogbW9kdWxlIHJldiBudW1iZXIgKi8KLSAgICBjaGFyIGxhbmc7Ci0gICAgY2hhciB2b2xbNF07Ci0gICAgY2hhciB1c2VyWzJdOwotICAgIGNoYXIgY2F0WzhdOwotICAgIGNoYXIgZm5hbWVbOF07Ci0gICAgY2hhciBleHRbMl07Ci0gICAgY2hhciB0aW1lWzNdOwotICAgIGNoYXIgZGF0ZVszXTsKLSAgICBjaGFyIHJlc3RbMjExXTsKLSAgfTsKLQotc3RydWN0IGV4dF9lc2QKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgICBjaGFyIHR5cGU7Ci0gICAgdW5zaWduZWQgY2hhciBlc2RfZW50cmllc1sxXTsKLSAgfTsKLSNkZWZpbmUgRVNEX0FCUyAJMAotI2RlZmluZSBFU0RfQ09NTU9OIAkxCi0jZGVmaW5lIEVTRF9TVERfUkVMX1NFQyAyCi0jZGVmaW5lIEVTRF9TSFJUX1JFTF9TRUMgMwotI2RlZmluZSBFU0RfWERFRl9JTl9TRUMgNAotI2RlZmluZSBFU0RfWFJFRl9TWU0gICAgNwotI2RlZmluZSBFU0RfWFJFRl9TRUMJNgotI2RlZmluZSBFU0RfWERFRl9JTl9BQlMgNQotdW5pb24gZXh0X2FueQotICB7Ci0gICAgdW5zaWduZWQgY2hhciBzaXplOwotICAgIHN0cnVjdCBleHRfdmhlYWRlciBoZWFkZXI7Ci0gICAgc3RydWN0IGV4dF9lc2QgZXNkOwotICAgIHN0cnVjdCBleHRfb3RyIG90cjsKLSAgfTsKLQotLyogSW5pdGlhbGl6ZSBieSBmaWxsaW5nIGluIHRoZSBoZXggY29udmVyc2lvbiBhcnJheS4gKi8KLQotCi0KLQotCi0vKiBTZXQgdXAgdGhlIHRkYXRhIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChhYmZkLT50ZGF0YS52ZXJzYWRvc19kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgdGRhdGFfdHlwZSAqdGRhdGEgPSAodGRhdGFfdHlwZSAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAodGRhdGFfdHlwZSkpOwotICAgICAgaWYgKHRkYXRhID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYWJmZC0+dGRhdGEudmVyc2Fkb3NfZGF0YSA9IHRkYXRhOwotICAgICAgdGRhdGEtPnN5bWJvbHMgPSBOVUxMOwotICAgICAgVkRBVEEgKGFiZmQpLT5hbGVydCA9IDB4MTIzNDU2Nzg7Ci0gICAgfQotCi0gIGJmZF9kZWZhdWx0X3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX202OGssIDApOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBSZXBvcnQgYSBwcm9ibGVtIGluIGFuIFMgcmVjb3JkIGZpbGUuICBGSVhNRTogVGhpcyBwcm9iYWJseSBzaG91bGQKLSAgIG5vdCBjYWxsIGZwcmludGYsIGJ1dCB3ZSByZWFsbHkgZG8gbmVlZCBzb21lIG1lY2hhbmlzbSBmb3IgcHJpbnRpbmcKLSAgIGVycm9yIG1lc3NhZ2VzLiAgKi8KLQotCi0KLXN0YXRpYyBhc3ltYm9sICoKLXZlcnNhZG9zX25ld19zeW1ib2wgKGFiZmQsIHNudW0sIG5hbWUsIHZhbCwgc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBzbnVtOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgYXN5bWJvbCAqbiA9IFZEQVRBIChhYmZkKS0+c3ltYm9scyArIHNudW07Ci0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT52YWx1ZSA9IHZhbDsKLSAgbi0+c2VjdGlvbiA9IHNlYzsKLSAgbi0+dGhlX2JmZCA9IGFiZmQ7Ci0gIG4tPmZsYWdzID0gMDsKLSAgcmV0dXJuIG47Ci19Ci0KLQotc3RhdGljIGludAotZ2V0X3JlY29yZCAoYWJmZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuaW9uIGV4dF9hbnkgKnB0cjsKLXsKLSAgYmZkX3JlYWQgKCZwdHItPnNpemUsIDEsIDEsIGFiZmQpOwotICBpZiAoYmZkX3JlYWQgKChjaGFyICopIHB0ciArIDEsIDEsIHB0ci0+c2l6ZSwgYWJmZCkgIT0gcHRyLT5zaXplKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1nZXRfNCAocHApCi0gICAgIHVuc2lnbmVkIGNoYXIgKipwcDsKLXsKLSAgdW5zaWduZWQgY2hhciAqcCA9ICpwcDsKLSAgKnBwICs9IDQ7Ci0gIHJldHVybiAocFswXSA8PCAyNCkgfCAocFsxXSA8PCAxNikgfCAocFsyXSA8PCA4KSB8IChwWzNdIDw8IDApOwotfQotCi12b2lkCi1nZXRfMTAgKHBwLCBuYW1lKQotICAgICB1bnNpZ25lZCBjaGFyICoqcHA7Ci0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKnAgPSAoY2hhciAqKSAqcHA7Ci0gIGludCBsZW4gPSAxMDsKLSAgKnBwICs9IGxlbjsKLSAgd2hpbGUgKCpwICE9ICcgJwotCSAmJiBsZW4pCi0gICAgewotICAgICAgKm5hbWUrKyA9ICpwKys7Ci0gICAgICBsZW4tLTsKLSAgICB9Ci0gICpuYW1lID0gMDsKLX0KLQotc3RhdGljIGNoYXIgKgotbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqbiA9IFZEQVRBIChhYmZkKS0+c3RyaW5nczsKLSAgc3RyY3B5IChWREFUQSAoYWJmZCktPnN0cmluZ3MsIG5hbWUpOwotICBWREFUQSAoYWJmZCktPnN0cmluZ3MgKz0gc3RybGVuIChWREFUQSAoYWJmZCktPnN0cmluZ3MpICsgMTsKLSAgcmV0dXJuIG47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXByb2Nlc3NfZXNkIChhYmZkLCBlc2QsIHBhc3MpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGV4dF9lc2QgKmVzZDsKLSAgICAgaW50IHBhc3M7Ci17Ci0gIC8qIFJlYWQgdGhyb3VnaCB0aGUgZXh0IGRlZiBmb3IgdGhlIGVzdCBlbnRyaWVzICovCi0gIGludCB0b2dvID0gZXNkLT5zaXplIC0gMjsKLSAgYmZkX3ZtYSBzaXplOwotICBiZmRfdm1hIHN0YXJ0OwotICBhc2VjdGlvbiAqc2VjOwotICBjaGFyIG5hbWVbMTFdOwotICB1bnNpZ25lZCBjaGFyICpwdHIgPSBlc2QtPmVzZF9lbnRyaWVzOwotICB1bnNpZ25lZCBjaGFyICplbmQgPSBwdHIgKyB0b2dvOwotICB3aGlsZSAocHRyIDwgZW5kKQotICAgIHsKLSAgICAgIGludCBzY24gPSAqcHRyICYgMHhmOwotICAgICAgaW50IHR5cCA9ICgqcHRyID4+IDQpICYgMHhmOwotCi0gICAgICAvKiBEZWNsYXJlIHRoaXMgc2VjdGlvbiAqLwotICAgICAgc3ByaW50ZiAobmFtZSwgIiVkIiwgc2NuKTsKLSAgICAgIHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgc3RyZHVwIChuYW1lKSk7Ci0gICAgICBzZWMtPnRhcmdldF9pbmRleCA9IHNjbjsKLSAgICAgIEVEQVRBIChhYmZkLCBzY24pLnNlY3Rpb24gPSBzZWM7Ci0gICAgICBwdHIrKzsKLSAgICAgIHN3aXRjaCAodHlwKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBFU0RfWFJFRl9TRUM6Ci0JY2FzZSBFU0RfWFJFRl9TWU06Ci0JICB7Ci0JICAgIGludCBzbnVtID0gVkRBVEEgKGFiZmQpLT5yZWZfaWR4Kys7Ci0JICAgIGdldF8xMCAoJnB0ciwgbmFtZSk7Ci0JICAgIGlmIChwYXNzID09IDEpCi0JICAgICAgewotCQlWREFUQSAoYWJmZCktPnN0cmluZ2xlbiArPSBzdHJsZW4gKG5hbWUpICsgMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBlc2lkeDsKLQkJYXN5bWJvbCAqczsKLQkJY2hhciAqbiA9IG5ld19zeW1ib2xfc3RyaW5nIChhYmZkLCBuYW1lKTsKLQkJcyA9IHZlcnNhZG9zX25ld19zeW1ib2wgKGFiZmQsIHNudW0sIG4sIDAsCi0JCQkJCSAmYmZkX3VuZF9zZWN0aW9uLCBzY24pOwotCQllc2lkeCA9IFZEQVRBIChhYmZkKS0+ZXNfZG9uZSsrOwotCQlSREFUQSAoYWJmZCwgZXNpZHggLSBFU19CQVNFKSA9IHM7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0KLQotCWNhc2UgRVNEX0FCUzoKLQkgIHNpemUgPSBnZXRfNCAoJnB0cik7Ci0JICBzdGFydCA9IGdldF80ICgmcHRyKTsKLQkgIGJyZWFrOwotCWNhc2UgRVNEX1NURF9SRUxfU0VDOgotCWNhc2UgRVNEX1NIUlRfUkVMX1NFQzoKLQkgIHsKLQkgICAgc2VjLT5fcmF3X3NpemUgPSBnZXRfNCAoJnB0cik7Ci0JICAgIHNlYy0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBFU0RfWERFRl9JTl9BQlM6Ci0JICBzZWMgPSAoYXNlY3Rpb24gKikgJiBiZmRfYWJzX3NlY3Rpb247Ci0JY2FzZSBFU0RfWERFRl9JTl9TRUM6Ci0JICB7Ci0JICAgIGludCBzbnVtID0gVkRBVEEgKGFiZmQpLT5kZWZfaWR4Kys7Ci0JICAgIGxvbmcgdmFsOwotCSAgICBnZXRfMTAgKCZwdHIsIG5hbWUpOwotCSAgICB2YWwgPSBnZXRfNCAoJnB0cik7Ci0JICAgIGlmIChwYXNzID09IDEpCi0JICAgICAgewotCQkvKiBKdXN0IHJlbWVtYmVyIHRoZSBzeW1ib2wgKi8KLQkJVkRBVEEgKGFiZmQpLT5zdHJpbmdsZW4gKz0gc3RybGVuIChuYW1lKSArIDE7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlhc3ltYm9sICpzOwotCQljaGFyICpuID0gbmV3X3N5bWJvbF9zdHJpbmcgKGFiZmQsIG5hbWUpOwotCQlzID0gdmVyc2Fkb3NfbmV3X3N5bWJvbCAoYWJmZCwgc251bSArIFZEQVRBIChhYmZkKS0+bnJlZnMsIG4sIHZhbCwgc2VjLCBzY24pOwotCQlzLT5mbGFncyB8PSBCU0ZfR0xPQkFMOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLSNkZWZpbmUgUl9SRUxXT1JEIDEKLSNkZWZpbmUgUl9SRUxMT05HIDIKLSNkZWZpbmUgUl9SRUxXT1JEX05FRyAzCi0jZGVmaW5lIFJfUkVMTE9OR19ORUcgNAotCi1yZWxvY19ob3d0b190eXBlIHZlcnNhZG9zX2hvd3RvX3RhYmxlW10gPQotewotICBIT1dUTyAoUl9SRUxXT1JELCAwLCAxLCAxNiwgZmFsc2UsCi0JIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JICIrdjE2IiwgdHJ1ZSwgMHgwMDAwZmZmZiwgMHgwMDAwZmZmZiwgZmFsc2UpLAotICBIT1dUTyAoUl9SRUxMT05HLCAwLCAyLCAzMiwgZmFsc2UsCi0JIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JICIrdjMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotCi0gIEhPV1RPIChSX1JFTFdPUkRfTkVHLCAwLCAtMSwgMTYsIGZhbHNlLAotCSAwLCBjb21wbGFpbl9vdmVyZmxvd19kb250LCAwLAotCSAiLXYxNiIsIHRydWUsIDB4MDAwMGZmZmYsIDB4MDAwMGZmZmYsIGZhbHNlKSwKLSAgSE9XVE8gKFJfUkVMTE9OR19ORUcsIDAsIC0yLCAzMiwgZmFsc2UsCi0JIDAsIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIDAsCi0JICItdjMyIiwgdHJ1ZSwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgZmFsc2UpLAotfTsKLQotCi1zdGF0aWMgaW50Ci1nZXRfb2Zmc2V0IChsZW4sIHB0cikKLSAgICAgaW50IGxlbjsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICBpbnQgdmFsID0gMDsKLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIHZhbCA9ICpwdHIrKzsKLSAgICAgIGlmICh2YWwgJiAweDgwKQotCXZhbCB8PSB+MHhmZjsKLSAgICAgIGZvciAoaSA9IDE7IGkgPCBsZW47IGkrKykKLQl2YWwgPSAodmFsIDw8IDgpIHwgKnB0cisrOwotICAgIH0KLQotICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19vdHIgKGFiZmQsIG90ciwgcGFzcykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgZXh0X290ciAqb3RyOwotICAgICBpbnQgcGFzczsKLXsKLSAgdW5zaWduZWQgbG9uZyBzaGlmdDsKLSAgdW5zaWduZWQgY2hhciAqc3JjcCA9IG90ci0+ZGF0YTsKLSAgdW5zaWduZWQgY2hhciAqZW5kcCA9ICh1bnNpZ25lZCBjaGFyICopIG90ciArIG90ci0+c2l6ZTsKLSAgdW5zaWduZWQgaW50IGJpdHMgPSAob3RyLT5tYXBbMF0gPDwgMjQpCi0gIHwgKG90ci0+bWFwWzFdIDw8IDE2KQotICB8IChvdHItPm1hcFsyXSA8PCA4KQotICB8IChvdHItPm1hcFszXSA8PCAwKTsKLQotICBzdHJ1Y3QgZXNkaWQgKmVzZGlkID0gJkVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSk7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzID0gZXNkaWQtPmNvbnRlbnRzOwotICBpbnQgbmVlZF9jb250ZW50cyA9IDA7Ci0gIHVuc2lnbmVkIGludCBkc3RfaWR4ID0gZXNkaWQtPnBjOwotCi0gIGZvciAoc2hpZnQgPSAoMSA8PCAzMSk7IHNoaWZ0ICYmIHNyY3AgPCBlbmRwOyBzaGlmdCA+Pj0gMSkKLSAgICB7Ci0gICAgICBpZiAoYml0cyAmIHNoaWZ0KQotCXsKLQkgIGludCBmbGFnID0gKnNyY3ArKzsKLQkgIGludCBlc2RpZHMgPSAoZmxhZyA+PiA1KSAmIDB4NzsKLQkgIGludCBzaXplaW53b3JkcyA9ICgoZmxhZyA+PiAzKSAmIDEpID8gMiA6IDE7Ci0JICBpbnQgb2Zmc2V0bGVuID0gZmxhZyAmIDB4NzsKLQkgIGludCBqOwotCi0KLQkgIGlmIChlc2RpZHMgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEEgemVybyBlc2RpZCBtZWFucyB0aGUgbmV3IHBjIGlzIHRoZSBvZmZzZXQgZ2l2ZW4gKi8KLQkgICAgICBkc3RfaWR4ICs9IGdldF9vZmZzZXQgKG9mZnNldGxlbiwgc3JjcCk7Ci0JICAgICAgc3JjcCArPSBvZmZzZXRsZW47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCB2YWwgPSBnZXRfb2Zmc2V0IChvZmZzZXRsZW4sIHNyY3AgKyBlc2RpZHMpOwotCSAgICAgIGlmIChwYXNzID09IDEpCi0JCW5lZWRfY29udGVudHMgPSAxOwotCSAgICAgIGVsc2UKLQkJZm9yIChqID0gMDsgaiA8IHNpemVpbndvcmRzICogMjsgaisrKQotCQkgIHsKLQkJICAgIGNvbnRlbnRzW2RzdF9pZHggKyAoc2l6ZWlud29yZHMgKiAyKSAtIGogLSAxXSA9IHZhbDsKLQkJICAgIHZhbCA+Pj0gODsKLQkJICB9Ci0KLQkgICAgICBmb3IgKGogPSAwOyBqIDwgZXNkaWRzOyBqKyspCi0JCXsKLQkJICBpbnQgZXNkaWQgPSAqc3JjcCsrOwotCi0JCSAgaWYgKGVzZGlkKQotCQkgICAgewotCQkgICAgICBpbnQgcm4gPSBFREFUQSAoYWJmZCwgb3RyLT5lc2RpZCAtIDEpLnJlbG9jcysrOwotCQkgICAgICBpZiAocGFzcyA9PSAxKQotCQkJewotCQkJICAvKiB0aGlzIGlzIHRoZSBmaXJzdCBwYXNzIG92ZXIgdGhlIGRhdGEsIAotCQkJICAgICBqdXN0IHJlbWVtYmVyIHRoYXQgd2UgbmVlZCBhIHJlbG9jICovCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYXJlbGVudCAqbiA9Ci0JCQkgIEVEQVRBIChhYmZkLCBvdHItPmVzZGlkIC0gMSkuc2VjdGlvbi0+cmVsb2NhdGlvbiArIHJuOwotCQkJICBuLT5hZGRyZXNzID0gZHN0X2lkeDsKLQotCQkJICBuLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSBlc2RpZDsKLQkJCSAgbi0+YWRkZW5kID0gMDsKLQkJCSAgbi0+aG93dG8gPSB2ZXJzYWRvc19ob3d0b190YWJsZSArICgoaiAmIDEpICogMikgKyAoc2l6ZWlud29yZHMgLSAxKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIHNyY3AgKz0gb2Zmc2V0bGVuOwotCSAgICAgIGRzdF9pZHggKz0gc2l6ZWlud29yZHMgKiAyOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5lZWRfY29udGVudHMgPSAxOwotCSAgaWYgKGRzdF9pZHggPCBlc2RpZC0+c2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICBpZiAocGFzcyA9PSAyKQotCSAgICAgIHsKLQkJLyogYWJzb2x1dGUgY29kZSwgY29tZXMgaW4gMTYgYml0IGx1bXBzICovCi0JCWNvbnRlbnRzW2RzdF9pZHhdID0gc3JjcFswXTsKLQkJY29udGVudHNbZHN0X2lkeCArIDFdID0gc3JjcFsxXTsKLQkgICAgICB9Ci0JICBkc3RfaWR4ICs9IDI7Ci0JICBzcmNwICs9IDI7Ci0JfQotICAgIH0KLSAgRURBVEEgKGFiZmQsIG90ci0+ZXNkaWQgLSAxKS5wYyA9IGRzdF9pZHg7Ci0KLSAgaWYgKCFjb250ZW50cyAmJiBuZWVkX2NvbnRlbnRzKQotICAgIGVzZGlkLT5jb250ZW50cyA9ICh1bnNpZ25lZCBjaGFyICopIGJmZF9hbGxvYyAoYWJmZCwgZXNkaWQtPnNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQotfQotCi1zdGF0aWMgYm9vbGVhbgotdmVyc2Fkb3Nfc2NhbiAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBpbnQgbG9vcCA9IDE7Ci0gIGludCBpOwotICBpbnQgajsKLSAgaW50IG5zZWNzID0gMDsKLQotICBWREFUQSAoYWJmZCktPm5yZWZzID0gMDsKLSAgVkRBVEEgKGFiZmQpLT5uZGVmcyA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+cmVmX2lkeCA9IDA7Ci0gIFZEQVRBIChhYmZkKS0+ZGVmX2lkeCA9IDA7Ci0KLSAgd2hpbGUgKGxvb3ApCi0gICAgewotICAgICAgdW5pb24gZXh0X2FueSBhbnk7Ci0gICAgICBpZiAoIWdldF9yZWNvcmQgKGFiZmQsICZhbnkpKQotCXJldHVybiB0cnVlOwotICAgICAgc3dpdGNoIChhbnkuaGVhZGVyLnR5cGUpCi0JewotCWNhc2UgVkhFQURFUjoKLQkgIGJyZWFrOwotCWNhc2UgVkVORDoKLQkgIGxvb3AgPSAwOwotCSAgYnJlYWs7Ci0JY2FzZSBWRVNUREVGOgotCSAgcHJvY2Vzc19lc2QgKGFiZmQsICZhbnkuZXNkLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgVk9UUjoKLQkgIHByb2Nlc3Nfb3RyIChhYmZkLCAmYW55Lm90ciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdyBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHJlbG9jcyBhbmQgc2VjdGlvbnMgKi8KLQotICBWREFUQSAoYWJmZCktPm5yZWZzID0gVkRBVEEgKGFiZmQpLT5yZWZfaWR4OwotICBWREFUQSAoYWJmZCktPm5kZWZzID0gVkRBVEEgKGFiZmQpLT5kZWZfaWR4OwotICBWREFUQSAoYWJmZCktPnJlZl9pZHggPSAwOwotICBWREFUQSAoYWJmZCktPmRlZl9pZHggPSAwOwotCi0gIGFiZmQtPnN5bWNvdW50ID0gVkRBVEEgKGFiZmQpLT5ucmVmcyArIFZEQVRBIChhYmZkKS0+bmRlZnM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGVzZGlkICplc2RpZCA9ICZFREFUQSAoYWJmZCwgaSk7Ci0gICAgICBpZiAoZXNkaWQtPnNlY3Rpb24pCi0JewotCSAgZXNkaWQtPnNlY3Rpb24tPnJlbG9jYXRpb24KLQkgICAgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIHNpemVvZiAoYXJlbGVudCkgKiBlc2RpZC0+cmVsb2NzKTsKLQotCSAgZXNkaWQtPnBjID0gMDsKLQotCSAgaWYgKGVzZGlkLT5jb250ZW50cykKLQkgICAgZXNkaWQtPnNlY3Rpb24tPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfTE9BRDsKLQotCSAgZXNkaWQtPnNlY3Rpb24tPnJlbG9jX2NvdW50ID0gZXNkaWQtPnJlbG9jczsKLQkgIGlmIChlc2RpZC0+cmVsb2NzKQotCSAgICBlc2RpZC0+c2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCi0JICBlc2RpZC0+cmVsb2NzID0gMDsKLQotCSAgLyogQWRkIGFuIGVudHJ5IGludG8gdGhlIHN5bWJvbCB0YWJsZSBmb3IgaXQgKi8KLQkgIG5zZWNzKys7Ci0JICBWREFUQSAoYWJmZCktPnN0cmluZ2xlbiArPSBzdHJsZW4gKGVzZGlkLT5zZWN0aW9uLT5uYW1lKSArIDE7Ci0JfQotICAgIH0KLQotICBhYmZkLT5zeW1jb3VudCArPSBuc2VjczsKLQotICBWREFUQSAoYWJmZCktPnN5bWJvbHMgPSAoYXN5bWJvbCAqKSBiZmRfYWxsb2MgKGFiZmQsCi0JCQkJICAgICAgIHNpemVvZiAoYXN5bWJvbCkgKiAoYWJmZC0+c3ltY291bnQpKTsKLQotICBWREFUQSAoYWJmZCktPnN0cmluZ3MgPSBiZmRfYWxsb2MgKGFiZmQsIFZEQVRBIChhYmZkKS0+c3RyaW5nbGVuKTsKLQotICBpZiAoKFZEQVRBIChhYmZkKS0+c3ltYm9scyA9PSBOVUxMICYmIGFiZmQtPnN5bWNvdW50ID4gMCkKLSAgICAgIHx8IChWREFUQSAoYWJmZCktPnN0cmluZ3MgPT0gTlVMTCAmJiBWREFUQSAoYWJmZCktPnN0cmluZ2xlbiA+IDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBBY3R1YWxseSBmaWxsIGluIHRoZSBzZWN0aW9uIHN5bWJvbHMsCi0gICAgIHdlIHN0aWNrIHRoZW0gYXQgdGhlIGVuZCBvZiB0aGUgdGFibGUgKi8KLQotICBmb3IgKGogPSBWREFUQSAoYWJmZCktPm5yZWZzICsgVkRBVEEgKGFiZmQpLT5uZGVmcywgaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBlc2RpZCAqZXNkaWQgPSAmRURBVEEgKGFiZmQsIGkpOwotICAgICAgYXNlY3Rpb24gKnNlYyA9IGVzZGlkLT5zZWN0aW9uOwotICAgICAgaWYgKHNlYykKLQl7Ci0JICBhc3ltYm9sICpzID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzICsgajsKLQkgIHMtPm5hbWUgPSBuZXdfc3ltYm9sX3N0cmluZyAoYWJmZCwgc2VjLT5uYW1lKTsKLQkgIHMtPnNlY3Rpb24gPSBzZWM7Ci0JICBzLT5mbGFncyA9IEJTRl9MT0NBTDsKLQkgIHMtPnZhbHVlID0gMDsKLQkgIHMtPnRoZV9iZmQgPSBhYmZkOwotCSAgaisrOwotCX0KLSAgICB9Ci0gIGlmIChhYmZkLT5zeW1jb3VudCkKLSAgICBhYmZkLT5mbGFncyB8PSBIQVNfU1lNUzsKLQotICAvKiBTZXQgdGhpcyB0byBuc2VjcyAtIHNpbmNlIHdlJ3ZlIGFscmVhZHkgcGxhbnRlZCB0aGUgc2VjdGlvbgotICAgICBzeW1ib2xzICovCi0gIFZEQVRBIChhYmZkKS0+bnNlY3N5bXMgPSBuc2VjczsKLQotICBWREFUQSAoYWJmZCktPnJlZl9pZHggPSAwOwotCi0gIHJldHVybiAxOwotfQotCi0KLQotLyogQ2hlY2sgd2hldGhlciBhbiBleGlzdGluZyBmaWxlIGlzIGEgdmVyc2Fkb3MgIGZpbGUuICAqLwotCi1zdGF0aWMgY29uc3QgYmZkX3RhcmdldCAqCi12ZXJzYWRvc19vYmplY3RfcCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBzdHJ1Y3QgZXh0X3ZoZWFkZXIgZXh0OwotICB1bnNpZ25lZCBjaGFyIGxlbjsKLQotICBpZiAoYmZkX3NlZWsgKGFiZmQsIChmaWxlX3B0cikgMCwgU0VFS19TRVQpICE9IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9yZWFkICgmbGVuLCAxLCAxLCBhYmZkKSAhPSAxKQotICAgIHsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCkKLQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX3JlYWQgKCZleHQudHlwZSwgMSwgbGVuLCBhYmZkKSAhPSBsZW4pCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX3N5c3RlbV9jYWxsKQotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGd1ZXNzIHRoYXQgdGhlIGxhbmd1YWdlIGZpZWxkIHdpbGwgbmV2ZXIgYmUgbGFyZ2VyIHRoYW4gMTAuCi0gICAgIEluIHNhbXBsZSBmaWxlcywgaXQgaXMgYWx3YXlzIGVpdGhlciAwIG9yIDEuICBDaGVja2luZyBmb3IgdGhpcwotICAgICBwcmV2ZW50cyBjb25mdXNpb24gd2l0aCBJbnRlbCBIZXggZmlsZXMuICAqLwotICBpZiAoZXh0LnR5cGUgIT0gVkhFQURFUgotICAgICAgfHwgZXh0LmxhbmcgPiAxMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBPSywgbG9va3MgbGlrZSBhIHJlY29yZCwgYnVpbGQgdGhlIHRkYXRhIGFuZCByZWFkIGluLiAgKi8KLQotICBpZiAoIXZlcnNhZG9zX21rb2JqZWN0IChhYmZkKQotICAgICAgfHwgIXZlcnNhZG9zX3NjYW4gKGFiZmQpKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldHVybiBhYmZkLT54dmVjOwotfQotCi0KLXN0YXRpYyBib29sZWFuCi12ZXJzYWRvc19wYXNzXzIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgdW5pb24gZXh0X2FueSBhbnk7Ci0KLSAgaWYgKFZEQVRBIChhYmZkKS0+cGFzc18yX2RvbmUpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGJmZF9zZWVrIChhYmZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBWREFUQSAoYWJmZCktPmVzX2RvbmUgPSBFU19CQVNFOwotCi0KLSAgLyogcmVhZCByZWNvcmRzIHRpbGwgd2UgZ2V0IHRvIHdoZXJlIHdlIHdhbnQgdG8gYmUgKi8KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBnZXRfcmVjb3JkIChhYmZkLCAmYW55KTsKLSAgICAgIHN3aXRjaCAoYW55LmhlYWRlci50eXBlKQotCXsKLQljYXNlIFZFTkQ6Ci0JICBWREFUQSAoYWJmZCktPnBhc3NfMl9kb25lID0gMTsKLQkgIHJldHVybiAxOwotCWNhc2UgVkVTVERFRjoKLQkgIHByb2Nlc3NfZXNkIChhYmZkLCAmYW55LmVzZCwgMik7Ci0JICBicmVhazsKLQljYXNlIFZPVFI6Ci0JICBwcm9jZXNzX290ciAoYWJmZCwgJmFueS5vdHIsIDIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBjb3VudCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGxvY2F0aW9uOwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0gIGlmICghdmVyc2Fkb3NfcGFzc18yIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbWVtY3B5IChsb2NhdGlvbiwKLQkgIEVEQVRBIChhYmZkLCBzZWN0aW9uLT50YXJnZXRfaW5kZXgpLmNvbnRlbnRzICsgb2Zmc2V0LAotCSAgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIHZlcnNhZG9zX2dldF9zZWN0aW9uX2NvbnRlbnRzX2luX3dpbmRvdyBcCi0gIF9iZmRfZ2VuZXJpY19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3cKLQotc3RhdGljIGJvb2xlYW4KLXZlcnNhZG9zX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCBsb2NhdGlvbiwgb2Zmc2V0LCBieXRlc190b19kbykKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlY3Rpb247Ci0gICAgIFBUUiBsb2NhdGlvbjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ5dGVzX3RvX2RvOwotewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLypBUkdTVVNFRCAqLwotc3RhdGljIGludAotdmVyc2Fkb3Nfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIGV4ZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBleGVjOwotewotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGFzeW1ib2wgKgotdmVyc2Fkb3NfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqbmV3ID0gKGFzeW1ib2wgKikgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChhc3ltYm9sKSk7Ci0gIGlmIChuZXcpCi0gICAgbmV3LT50aGVfYmZkID0gYWJmZDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogUmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IG5lZWRlZCB0byByZWFkIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgbG9uZwotdmVyc2Fkb3NfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICByZXR1cm4gKGJmZF9nZXRfc3ltY291bnQgKGFiZmQpICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGxvbmcKLXZlcnNhZG9zX2dldF9zeW10YWIgKGFiZmQsIGFsb2NhdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqYWxvY2F0aW9uOwotewotICB1bnNpZ25lZCBpbnQgc3ltY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGFzeW1ib2wgKnM7Ci0KLSAgdmVyc2Fkb3NfcGFzc18yIChhYmZkKTsKLQotICBmb3IgKGkgPSAwLCBzID0gVkRBVEEgKGFiZmQpLT5zeW1ib2xzOwotICAgICAgIGkgPCBzeW1jb3VudDsKLSAgICAgICBzKyssIGkrKykKLSAgICB7Ci0gICAgICAqYWxvY2F0aW9uKysgPSBzOwotICAgIH0KLQotICAqYWxvY2F0aW9uID0gTlVMTDsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0KLS8qQVJHU1VTRUQgKi8KLXZvaWQKLXZlcnNhZG9zX2dldF9zeW1ib2xfaW5mbyAoaWdub3JlX2FiZmQsIHN5bWJvbCwgcmV0KQotICAgICBiZmQgKmlnbm9yZV9hYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci0gICAgIHN5bWJvbF9pbmZvICpyZXQ7Ci17Ci0gIGJmZF9zeW1ib2xfaW5mbyAoc3ltYm9sLCByZXQpOwotfQotCi0vKkFSR1NVU0VEICovCi12b2lkCi12ZXJzYWRvc19wcmludF9zeW1ib2wgKGlnbm9yZV9hYmZkLCBhZmlsZSwgc3ltYm9sLCBob3cpCi0gICAgIGJmZCAqaWdub3JlX2FiZmQ7Ci0gICAgIFBUUiBhZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotICBGSUxFICpmaWxlID0gKEZJTEUgKikgYWZpbGU7Ci0gIHN3aXRjaCAoaG93KQotICAgIHsKLSAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbmFtZToKLSAgICAgIGZwcmludGYgKGZpbGUsICIlcyIsIHN5bWJvbC0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYmZkX3ByaW50X3N5bWJvbF92YW5kZiAoKFBUUikgZmlsZSwgc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgJS01cyAlcyIsCi0JICAgICAgIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwKLQkgICAgICAgc3ltYm9sLT5uYW1lKTsKLQotICAgIH0KLX0KLQotbG9uZwotdmVyc2Fkb3NfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBhc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIGFzZWN0OwotewotICByZXR1cm4gKGFzZWN0LT5yZWxvY19jb3VudCArIDEpICogc2l6ZW9mIChhcmVsZW50ICopOwotfQotCi0KLWxvbmcKLXZlcnNhZG9zX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVscHRyLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLSAgICAgYXJlbGVudCAqKnJlbHB0cjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgYXJlbGVudCAqc3JjOwotCi0gIHZlcnNhZG9zX3Bhc3NfMiAoYWJmZCk7Ci0gIHNyYyA9IHNlY3Rpb24tPnJlbG9jYXRpb247Ci0gIGlmICghRURBVEEgKGFiZmQsIHNlY3Rpb24tPnRhcmdldF9pbmRleCkuZG9uZXJlbCkKLSAgICB7Ci0gICAgICBFREFUQSAoYWJmZCwgc2VjdGlvbi0+dGFyZ2V0X2luZGV4KS5kb25lcmVsID0gMTsKLSAgICAgIC8qIHRyYW5zbGF0ZSBmcm9tIGluZGV4ZXMgdG8gc3ltcHRyIHB0cnMgKi8KLSAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotCXsKLQkgIGludCBlc2RpZCA9IChpbnQpIHNyY1tjb3VudF0uc3ltX3B0cl9wdHI7Ci0KLQkgIGlmIChlc2RpZCA9PSAwKQotCSAgICB7Ci0JICAgICAgc3JjW2NvdW50XS5zeW1fcHRyX3B0ciA9IGJmZF9hYnNfc2VjdGlvbi5zeW1ib2xfcHRyX3B0cjsKLQkgICAgfQotCSAgZWxzZSBpZiAoZXNkaWQgPCBFU19CQVNFKQkvKiBTZWN0aW9uIHJlbGF0aXZlIHRoaW5nICovCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZXNkaWQgKmUgPSAmRURBVEEgKGFiZmQsIGVzZGlkIC0gMSk7Ci0JICAgICAgaWYgKCFzZWN0aW9uKQotCQl7Ci0JCSAvKiogcmVsb2NhdGlvbiByZWxhdGl2ZSB0byBzZWN0aW9uIHdoaWNoIHdhcwotCQkgICBuZXZlciBkZWNsYXJlZCAhICovCi0JCX0KLQkgICAgICBzcmNbY291bnRdLnN5bV9wdHJfcHRyID0gZS0+c2VjdGlvbi0+c3ltYm9sX3B0cl9wdHI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNyY1tjb3VudF0uc3ltX3B0cl9wdHIgPSBzeW1ib2xzICsgZXNkaWQgLSBFU19CQVNFOwotCSAgICB9Ci0KLQl9Ci0gICAgfQotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IHNlY3Rpb24tPnJlbG9jX2NvdW50OyBjb3VudCsrKQotICAgIHsKLSAgICAgICpyZWxwdHIrKyA9IHNyYysrOwotICAgIH0KLSAgKnJlbHB0ciA9IDA7Ci0gIHJldHVybiBzZWN0aW9uLT5yZWxvY19jb3VudDsKLX0KLQotI2RlZmluZQl2ZXJzYWRvc19jbG9zZV9hbmRfY2xlYW51cCBfYmZkX2dlbmVyaWNfY2xvc2VfYW5kX2NsZWFudXAKLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2ZyZWVfY2FjaGVkX2luZm8gX2JmZF9nZW5lcmljX2JmZF9mcmVlX2NhY2hlZF9pbmZvCi0jZGVmaW5lIHZlcnNhZG9zX25ld19zZWN0aW9uX2hvb2sgX2JmZF9nZW5lcmljX25ld19zZWN0aW9uX2hvb2sKLQotI2RlZmluZSB2ZXJzYWRvc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSBiZmRfZ2VuZXJpY19pc19sb2NhbF9sYWJlbF9uYW1lCi0jZGVmaW5lIHZlcnNhZG9zX2dldF9saW5lbm8gX2JmZF9ub3N5bWJvbHNfZ2V0X2xpbmVubwotI2RlZmluZSB2ZXJzYWRvc19maW5kX25lYXJlc3RfbGluZSBfYmZkX25vc3ltYm9sc19maW5kX25lYXJlc3RfbGluZQotI2RlZmluZSB2ZXJzYWRvc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2wgX2JmZF9ub3N5bWJvbHNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0jZGVmaW5lIHZlcnNhZG9zX3JlYWRfbWluaXN5bWJvbHMgX2JmZF9nZW5lcmljX3JlYWRfbWluaXN5bWJvbHMKLSNkZWZpbmUgdmVyc2Fkb3NfbWluaXN5bWJvbF90b19zeW1ib2wgX2JmZF9nZW5lcmljX21pbmlzeW1ib2xfdG9fc3ltYm9sCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwIF9iZmRfbm9yZWxvY3NfYmZkX3JlbG9jX3R5cGVfbG9va3VwCi0KLSNkZWZpbmUgdmVyc2Fkb3Nfc2V0X2FyY2hfbWFjaCBiZmRfZGVmYXVsdF9zZXRfYXJjaF9tYWNoCi0KLSNkZWZpbmUgdmVyc2Fkb3NfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyBcCi0gIGJmZF9nZW5lcmljX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cwotI2RlZmluZSB2ZXJzYWRvc19iZmRfcmVsYXhfc2VjdGlvbiBiZmRfZ2VuZXJpY19yZWxheF9zZWN0aW9uCi0jZGVmaW5lIHZlcnNhZG9zX2JmZF9nY19zZWN0aW9ucyBiZmRfZ2VuZXJpY19nY19zZWN0aW9ucwotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSBfYmZkX2dlbmVyaWNfbGlua19oYXNoX3RhYmxlX2NyZWF0ZQotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19hZGRfc3ltYm9scyBfYmZkX2dlbmVyaWNfbGlua19hZGRfc3ltYm9scwotI2RlZmluZSB2ZXJzYWRvc19iZmRfZmluYWxfbGluayBfYmZkX2dlbmVyaWNfZmluYWxfbGluawotI2RlZmluZSB2ZXJzYWRvc19iZmRfbGlua19zcGxpdF9zZWN0aW9uIF9iZmRfZ2VuZXJpY19saW5rX3NwbGl0X3NlY3Rpb24KLQotY29uc3QgYmZkX3RhcmdldCB2ZXJzYWRvc192ZWMgPQotewotICAidmVyc2Fkb3MiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF92ZXJzYWRvc19mbGF2b3VyLAotICBCRkRfRU5ESUFOX0JJRywJCS8qIHRhcmdldCBieXRlIG9yZGVyICovCi0gIEJGRF9FTkRJQU5fQklHLAkJLyogdGFyZ2V0IGhlYWRlcnMgYnl0ZSBvcmRlciAqLwotICAoSEFTX1JFTE9DIHwgRVhFQ19QIHwJCS8qIG9iamVjdCBmbGFncyAqLwotICAgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8Ci0gICBIQVNfU1lNUyB8IEhBU19MT0NBTFMgfCBXUF9URVhUIHwgRF9QQUdFRCksCi0gIChTRUNfQ09ERSB8IFNFQ19EQVRBIHwgU0VDX1JPTSB8IFNFQ19IQVNfQ09OVEVOVFMKLSAgIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MpLAkJLyogc2VjdGlvbiBmbGFncyAqLwotICAwLAkJCQkvKiBsZWFkaW5nIHVuZGVyc2NvcmUgKi8KLSAgJyAnLAkJCQkvKiBhcl9wYWRfY2hhciAqLwotICAxNiwJCQkJLyogYXJfbWF4X25hbWVsZW4gKi8KLSAgYmZkX2dldGI2NCwgYmZkX2dldGJfc2lnbmVkXzY0LCBiZmRfcHV0YjY0LAotICBiZmRfZ2V0YjMyLCBiZmRfZ2V0Yl9zaWduZWRfMzIsIGJmZF9wdXRiMzIsCi0gIGJmZF9nZXRiMTYsIGJmZF9nZXRiX3NpZ25lZF8xNiwgYmZkX3B1dGIxNiwJLyogZGF0YSAqLwotICBiZmRfZ2V0YjY0LCBiZmRfZ2V0Yl9zaWduZWRfNjQsIGJmZF9wdXRiNjQsCi0gIGJmZF9nZXRiMzIsIGJmZF9nZXRiX3NpZ25lZF8zMiwgYmZkX3B1dGIzMiwKLSAgYmZkX2dldGIxNiwgYmZkX2dldGJfc2lnbmVkXzE2LCBiZmRfcHV0YjE2LAkvKiBoZHJzICovCi0KLSAgewotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIHZlcnNhZG9zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICAgIF9iZmRfZHVtbXlfdGFyZ2V0LAotICB9LAotICB7Ci0gICAgYmZkX2ZhbHNlLAotICAgIHZlcnNhZG9zX21rb2JqZWN0LAotICAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsCi0gICAgYmZkX2ZhbHNlLAotICB9LAotICB7CQkJCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgIGJmZF9mYWxzZSwKLSAgICBiZmRfZmFsc2UsCi0gICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLAotICAgIGJmZF9mYWxzZSwKLSAgfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKF9iZmRfZ2VuZXJpYyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKF9iZmRfbm9jb3JlKSwKLSAgQkZEX0pVTVBfVEFCTEVfQVJDSElWRSAoX2JmZF9ub2FyY2hpdmUpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9XUklURSAodmVyc2Fkb3MpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2ZXJzYWRvcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKF9iZmRfbm9keW5hbWljKSwKLQotICAoUFRSKSAwCi19OwpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy1nc2QuYyBiL2JmZC92bXMtZ3NkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNTI0NjIuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy1nc2QuYworKysgL2Rldi9udWxsCkBAIC0xLDkyMCArMCwwIEBACi0vKiB2bXMtZ3NkLmMgLS0gQkZEIGJhY2stZW5kIGZvciBWQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIEluYy4KLQotICAgZ28gYW5kIHJlYWQgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAoZXNwLiBhcHBlbmRpeCBCKQotICAgaWYgeW91IGRvbid0IGtub3cgd2hhdCdzIGdvaW5nIG9uIGhlcmUgOi0pCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogdHlwaWNhbCBzZWN0aW9ucyBmb3IgdmF4IG9iamVjdCBmaWxlcyAgKi8KLQotI2RlZmluZSBWQVhfQ09ERV9OQU1FCQkiJENPREUiCi0jZGVmaW5lIFZBWF9EQVRBX05BTUUJCSIkREFUQSIKLSNkZWZpbmUgVkFYX0FERFJFU1NfREFUQV9OQU1FCSIkQUREUkVTU19EQVRBIgotCi0vKiB0eXBpY2FsIHNlY3Rpb25zIGZvciBldmF4IG9iamVjdCBmaWxlcyAgKi8KLQotI2RlZmluZSBFVkFYX0FCU19OQU1FCQkiJEFCUyQiCi0jZGVmaW5lIEVWQVhfQ09ERV9OQU1FCQkiJENPREUkIgotI2RlZmluZSBFVkFYX0xJTktfTkFNRQkJIiRMSU5LJCIKLSNkZWZpbmUgRVZBWF9EQVRBX05BTUUJCSIkREFUQSQiCi0jZGVmaW5lIEVWQVhfQlNTX05BTUUJCSIkQlNTJCIKLSNkZWZpbmUgRVZBWF9SRUFET05MWUFERFJfTkFNRQkiJFJFQURPTkxZX0FERFIkIgotI2RlZmluZSBFVkFYX1JFQURPTkxZX05BTUUJIiRSRUFET05MWSQiCi0jZGVmaW5lIEVWQVhfTElURVJBTF9OQU1FCSIkTElURVJBTCQiCi0jZGVmaW5lIEVWQVhfQ09NTU9OX05BTUUJIiRDT01NT04kIgotI2RlZmluZSBFVkFYX0xPQ0FMX05BTUUJCSIkTE9DQUwkIgotCi1zdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7CQkJLyogbmFtZSBvZiBzZWN0aW9uICovCi0gIGludCB2ZmxhZ3NfYWx3YXlzOwotICBmbGFnd29yZCBmbGFnc19hbHdheXM7CS8qIGZsYWdzIHdlIHNldCBhbHdheXMgKi8KLSAgaW50IHZmbGFnc19oYXNzaXplOwotICBmbGFnd29yZCBmbGFnc19oYXNzaXplOwkvKiBmbGFncyB3ZSBzZXQgaWYgdGhlIHNlY3Rpb24gaGFzIGEgc2l6ZSA+IDAgKi8KLX07Ci0KLS8qIFRoZXNlIGZsYWdzIGFyZSBkZWNjcnRsL3ZheGNydGwgKG9wZW5WTVMgNi4yIFZBWCkgY29tcGF0aWJsZSAgKi8KLQotc3RhdGljIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0IHZheF9zZWN0aW9uX2ZsYWdzW10gPSB7Ci0gIHsgVkFYX0NPREVfTkFNRSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9TSFJ8R1BTX1NfTV9FWEV8R1BTX1NfTV9SRCksCi0JKFNFQ19DT0RFKSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9TSFJ8R1BTX1NfTV9FWEV8R1BTX1NfTV9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0NPREV8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgVkFYX0RBVEFfTkFNRSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCksCi0JKFNFQ19EQVRBKSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRHxHUFNfU19NX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgVkFYX0FERFJFU1NfREFUQV9OQU1FLAotCShHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1JEKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IE5VTEwsCi0JKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfREFUQSksCi0JKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9Ci19OwotCi0KLS8qIFRoZXNlIGZsYWdzIGFyZSBkZWNjcnRsL3ZheGNydGwgKG9wZW5WTVMgNi4yIEFscGhhKSBjb21wYXRpYmxlICAqLwotCi1zdGF0aWMgc3RydWN0IHNlY19mbGFnc19zdHJ1Y3QgZXZheF9zZWN0aW9uX2ZsYWdzW10gPSB7Ci0gIHsgRVZBWF9BQlNfTkFNRSwKLQkoRUdQU19TX1ZfU0hSKSwKLQkoU0VDX0RBVEEpLAotCShFR1BTX1NfVl9TSFIpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfQ09ERV9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9FWEUpLAotCShTRUNfQ09ERSksCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX0VYRSksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0NPREV8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9MSVRFUkFMX05BTUUsCi0JKEVHUFNfU19WX1BJQ3xFR1BTX1NfVl9SRUx8RUdQU19TX1ZfU0hSfEVHUFNfU19WX1JEfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19SRUFET05MWXxTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX0xJTktfTkFNRSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfREFUQXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfUkVBRE9OTFl8U0VDX0xPQUQpIH0sCi0gIHsgRVZBWF9EQVRBX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfREFUQSksCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlQpLAotCShTRUNfSU5fTUVNT1JZfFNFQ19EQVRBfFNFQ19IQVNfQ09OVEVOVFN8U0VDX0FMTE9DfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfQlNTX05BTUUsCi0JKEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRHxFR1BTX1NfVl9XUlR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfTk9fRkxBR1MpLAotCShFR1BTX1NfVl9SRUx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EKSwKLQkoU0VDX0lOX01FTU9SWXxTRUNfSEFTX0NPTlRFTlRTfFNFQ19BTExPQ3xTRUNfTE9BRCkgfSwKLSAgeyBFVkFYX1JFQURPTkxZQUREUl9OQU1FLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEKSwKLQkoU0VDX0RBVEF8U0VDX1JFQURPTkxZKSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfUkVBRE9OTFlfTkFNRSwKLQkoRUdQU19TX1ZfUElDfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9TSFJ8RUdQU19TX1ZfUkR8RUdQU19TX1ZfTk9NT0QpLAotCShTRUNfREFUQXxTRUNfUkVBRE9OTFkpLAotCShFR1BTX1NfVl9QSUN8RUdQU19TX1ZfUkVMfEVHUFNfU19WX1NIUnxFR1BTX1NfVl9SRCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX1JFQURPTkxZfFNFQ19MT0FEKSB9LAotICB7IEVWQVhfTE9DQUxfTkFNRSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0sCi0gIHsgTlVMTCwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19EQVRBKSwKLQkoRUdQU19TX1ZfUkVMfEVHUFNfU19WX1JEfEVHUFNfU19WX1dSVCksCi0JKFNFQ19JTl9NRU1PUll8U0VDX0RBVEF8U0VDX0hBU19DT05URU5UU3xTRUNfQUxMT0N8U0VDX0xPQUQpIH0KLX07Ci0KLS8qIFJldHJpZXZlIGJmZCBzZWN0aW9uIGZsYWdzIGJ5IG5hbWUgYW5kIHNpemUgICovCi0KLXN0YXRpYyBmbGFnd29yZAotdm1zX3NlY2ZsYWdfYnlfbmFtZSAoYWJmZCwgc2VjdGlvbl9mbGFncywgbmFtZSwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3Qgc2VjX2ZsYWdzX3N0cnVjdCAqc2VjdGlvbl9mbGFnczsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBpID0gMDsKLQotICB3aGlsZSAoc2VjdGlvbl9mbGFnc1tpXS5uYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKChQUklWKGlzX3ZheCk/Ci0JICAgIHN0cmNhc2VjbXAgKG5hbWUsIHNlY3Rpb25fZmxhZ3NbaV0ubmFtZSk6Ci0JICAgIHN0cmNtcCAobmFtZSwgc2VjdGlvbl9mbGFnc1tpXS5uYW1lKSkgPT0gMCkKLQl7Ci0JICBpZiAoc2l6ZSA+IDApCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2hhc3NpemU7Ci0JICBlbHNlCi0JICAgIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLmZsYWdzX2Fsd2F5czsKLQl9Ci0gICAgICBpKys7Ci0gICAgfQotICBpZiAoc2l6ZSA+IDApCi0gICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0uZmxhZ3NfaGFzc2l6ZTsKLSAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0uZmxhZ3NfYWx3YXlzOwotfQotCi0KLS8qIFJldHJpZXZlIHZtcyBzZWN0aW9uIGZsYWdzIGJ5IG5hbWUgYW5kIHNpemUgICovCi0KLXN0YXRpYyBmbGFnd29yZAotdm1zX2VzZWNmbGFnX2J5X25hbWUgKHNlY3Rpb25fZmxhZ3MsIG5hbWUsIHNpemUpCi0gICAgIHN0cnVjdCBzZWNfZmxhZ3Nfc3RydWN0ICpzZWN0aW9uX2ZsYWdzOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IGkgPSAwOwotCi0gIHdoaWxlIChzZWN0aW9uX2ZsYWdzW2ldLm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBzZWN0aW9uX2ZsYWdzW2ldLm5hbWUpID09IDApCi0JewotCSAgaWYgKHNpemUgPiAwKQotCSAgICByZXR1cm4gc2VjdGlvbl9mbGFnc1tpXS52ZmxhZ3NfaGFzc2l6ZTsKLQkgIGVsc2UKLQkgICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2Fsd2F5czsKLQl9Ci0gICAgICBpKys7Ci0gICAgfQotICBpZiAoc2l6ZSA+IDApCi0gICAgcmV0dXJuIHNlY3Rpb25fZmxhZ3NbaV0udmZsYWdzX2hhc3NpemU7Ci0gIHJldHVybiBzZWN0aW9uX2ZsYWdzW2ldLnZmbGFnc19hbHdheXM7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIFZNU19ERUJVRwotLyogZGVidWcgKi8KLQotc3RydWN0IGZsYWdkZXNjc3RydWN0IHsgY2hhciAqbmFtZTsgZmxhZ3dvcmQgdmFsdWU7IH07Ci0KLS8qIENvbnZlcnQgZmxhZyB0byBwcmludGFibGUgc3RyaW5nICAqLwotCi1zdGF0aWMgY2hhciAqCi1mbGFnMnN0cihmbGFnZGVzYywgZmxhZ3MpCi0gICAgIHN0cnVjdCBmbGFnZGVzY3N0cnVjdCAqZmxhZ2Rlc2M7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotCi0gIHN0YXRpYyBjaGFyIHJlc1s2NF07Ci0gIGludCBuZXh0ID0gMDsKLQotICByZXNbMF0gPSAwOwotICB3aGlsZSAoZmxhZ2Rlc2MtPm5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzICYgZmxhZ2Rlc2MtPnZhbHVlKSAhPSAwKQotCXsKLQkgIGlmIChuZXh0KQotCSAgICBzdHJjYXQocmVzLCAiLCIpOwotCSAgZWxzZQotCSAgICBuZXh0ID0gMTsKLQkgIHN0cmNhdCAocmVzLCBmbGFnZGVzYy0+bmFtZSk7Ci0JfQotICAgICAgZmxhZ2Rlc2MrKzsKLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0jZW5kaWYKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBpbnB1dCByb3V0aW5lcyAqLwotCi0vKiBQcm9jZXNzIEdTRC9FR1NEIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfZ3NkIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICBzdGF0aWMgc3RydWN0IGZsYWdkZXNjc3RydWN0IGdwc2ZsYWdkZXNjW10gPQotICB7Ci0gICAgeyAiUElDIiwgMHgwMDAxIH0sCi0gICAgeyAiTElCIiwgMHgwMDAyIH0sCi0gICAgeyAiT1ZSIiwgMHgwMDA0IH0sCi0gICAgeyAiUkVMIiwgMHgwMDA4IH0sCi0gICAgeyAiR0JMIiwgMHgwMDEwIH0sCi0gICAgeyAiU0hSIiwgMHgwMDIwIH0sCi0gICAgeyAiRVhFIiwgMHgwMDQwIH0sCi0gICAgeyAiUkQiLCAgMHgwMDgwIH0sCi0gICAgeyAiV1JUIiwgMHgwMTAwIH0sCi0gICAgeyAiVkVDIiwgMHgwMjAwIH0sCi0gICAgeyAiTk9NT0QiLCAweDA0MDAgfSwKLSAgICB7ICJDT00iLCAweDA4MDAgfSwKLSAgICB7IE5VTEwsIDAgfQotICB9OwotCi0gIHN0YXRpYyBzdHJ1Y3QgZmxhZ2Rlc2NzdHJ1Y3QgZ3N5ZmxhZ2Rlc2NbXSA9Ci0gIHsKLSAgICB7ICJXRUFLIiwgMHgwMDAxIH0sCi0gICAgeyAiREVGIiwgIDB4MDAwMiB9LAotICAgIHsgIlVOSSIsICAweDAwMDQgfSwKLSAgICB7ICJSRUwiLCAgMHgwMDA4IH0sCi0gICAgeyAiQ09NTSIsIDB4MDAxMCB9LAotICAgIHsgIlZFQ0VQIiwgMHgwMDIwIH0sCi0gICAgeyAiTk9STSIsIDB4MDA0MCB9LAotICAgIHsgTlVMTCwgMCB9Ci0gIH07Ci0jZW5kaWYKLQotICBpbnQgZ3NkX3R5cGUsIGdzZF9zaXplOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzLCBvbGRfZmxhZ3M7Ci0gIGNoYXIgKm5hbWU7Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0gIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOwotICB1bnNpZ25lZCBsb25nIGFsaWduX2FkZHI7Ci0gIHN0YXRpYyBpbnQgcHNlY3RfaWR4ID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDIsICJHU0QvRUdTRCAoJWQvJXgpXG4iLCBvYmp0eXBlLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAob2JqdHlwZSkKLSAgICB7Ci0gICAgICBjYXNlIEVPQkpfU19DX0VHU0Q6Ci0gCVBSSVYodm1zX3JlYykgKz0gODsJLyogc2tpcCB0eXBlLCBzaXplLCBsX3RlbXAgKi8KLQlQUklWKHJlY19zaXplKSAtPSA4OwotCWJyZWFrOwotICAgICAgY2FzZSBPQkpfU19DX0dTRDoKLQlQUklWKHZtc19yZWMpICs9IDE7Ci0JUFJJVihyZWNfc2l6ZSkgLT0gMTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBjYWxjdWxhdGUgYmFzZSBhZGRyZXNzIGZvciBlYWNoIHNlY3Rpb24gICovCi0gIGJhc2VfYWRkciA9IDBMOwotCi0gIGFiZmQtPnN5bWNvdW50ID0gMDsKLQotICB3aGlsZSAoUFJJVihyZWNfc2l6ZSkgPiAwKQotICAgIHsKLSAgICAgIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwotCi0gICAgICBpZiAob2JqdHlwZSA9PSBPQkpfU19DX0dTRCkKLQl7Ci0JICBnc2RfdHlwZSA9ICp2bXNfcmVjOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgdm1zX3JlYywgJmdzZF90eXBlLCAmZ3NkX3NpemUpOwotCSAgZ3NkX3R5cGUgKz0gRVZBWF9PRkZTRVQ7Ci0JfQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgImdzZF90eXBlICVkXG4iLCBnc2RfdHlwZSk7Ci0jZW5kaWYKLQotICAgICAgc3dpdGNoIChnc2RfdHlwZSkKLQl7Ci0JICBjYXNlIEdTRF9TX0NfUFNDOgotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBwcm9ncmFtIHNlY3Rpb24gZGVmaW5pdGlvbgotCSAgICAgICAqLwotCi0JICAgICAgYXNlY3Rpb24gKm9sZF9zZWN0aW9uID0gMDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDQsICJHU0RfU19DX1BTQ1xuIik7Ci0jZW5kaWYKLQkgICAgICAvKiBJZiB0aGlzIHNlY3Rpb24gaXNuJ3QgYSBiZmQgc2VjdGlvbi4gICovCi0KLQkgICAgICBpZiAoUFJJVihpc192YXgpICYmIChwc2VjdF9pZHggPCAoYWJmZC0+c2VjdGlvbl9jb3VudC0xKSkpCi0JCXsKLQkJICAvKiBjaGVjayBmb3IgdGVtcG9yYXJ5IHNlY3Rpb24gZnJvbSBUSVIgcmVjb3JkLiAgKi8KLQotCQkgIGlmIChwc2VjdF9pZHggPCBQUklWKHNlY3Rpb25fY291bnQpKQotCQkgICAgb2xkX3NlY3Rpb24gPSBQUklWKHNlY3Rpb25zKVtwc2VjdF9pZHhdOwotCQkgIGVsc2UKLQkJICAgIG9sZF9zZWN0aW9uID0gMDsKLQkJfQotCi0JICAgICAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA4KTsKLQkgICAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0JICAgICAgaWYgKCFzZWN0aW9uKQotCQl7Ci0JCSAgZnByaW50ZiAoc3RkZXJyLCAiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZFxuIiwgbmFtZSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgb2xkX2ZsYWdzID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDIpOwotCSAgICAgIHNlY3Rpb24tPl9yYXdfc2l6ZSA9IGJmZF9nZXRsMzIodm1zX3JlYyArIDQpOwkvKiBhbGxvY2F0aW9uICovCi0JICAgICAgbmV3X2ZsYWdzID0gdm1zX3NlY2ZsYWdfYnlfbmFtZSAoYWJmZCwgdmF4X3NlY3Rpb25fZmxhZ3MsIG5hbWUsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JICAgICAgaWYgKG9sZF9mbGFncyAmIEVHUFNfU19WX1JFTCkKLQkJbmV3X2ZsYWdzIHw9IFNFQ19SRUxPQzsKLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1BTX1NfTV9PVlIpCi0JCW5ld19mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotCSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWN0aW9uLCBuZXdfZmxhZ3MpKQotCQl7Ci0JCSAgZnByaW50ZiAoc3RkZXJyLCAiYmZkX3NldF9zZWN0aW9uX2ZsYWdzICglcywgJXgpIGZhaWxlZFxuIiwgbmFtZSwgbmV3X2ZsYWdzKTsKLQkJICByZXR1cm4gLTE7Ci0JCX0KLQkgICAgICBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSB2bXNfcmVjWzFdOwotCSAgICAgIGFsaWduX2FkZHIgPSAoMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgICAgIGlmICgoYmFzZV9hZGRyICUgYWxpZ25fYWRkcikgIT0gMCkKLQkJYmFzZV9hZGRyICs9IChhbGlnbl9hZGRyIC0gKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpKTsKLQkgICAgICBzZWN0aW9uLT52bWEgPSAoYmZkX3ZtYSliYXNlX2FkZHI7Ci0JICAgICAgYmFzZV9hZGRyICs9IHNlY3Rpb24tPl9yYXdfc2l6ZTsKLQotCSAgICAgIC8qIGdsb2JhbCBzZWN0aW9uIGlzIGNvbW1vbiBzeW1ib2wgICovCi0KLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1BTX1NfTV9HQkwpCi0JCXsKLQkJICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBzeW1ib2wgPSBlbnRyeS0+c3ltYm9sOwotCi0JCSAgc3ltYm9sLT52YWx1ZSA9IDA7Ci0JCSAgc3ltYm9sLT5zZWN0aW9uID0gc2VjdGlvbjsKLQkJICBzeW1ib2wtPmZsYWdzID0gKEJTRl9HTE9CQUx8QlNGX1NFQ1RJT05fU1lNfEJTRl9PTERfQ09NTU9OKTsKLQkJfQotCi0JICAgICAgLyogY29weSBzYXZlZCBjb250ZW50cyBpZiBvbGRfc2VjdGlvbiBzZXQgICovCi0KLQkgICAgICBpZiAob2xkX3NlY3Rpb24gIT0gMCkKLQkJewotCQkgIHNlY3Rpb24tPmNvbnRlbnRzID0gb2xkX3NlY3Rpb24tPmNvbnRlbnRzOwotCQkgIGlmIChzZWN0aW9uLT5fcmF3X3NpemUgPCBvbGRfc2VjdGlvbi0+X3Jhd19zaXplKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJTaXplIG1pc21hdGNoIHNlY3Rpb24gJXM9JWQsICVzPSVkXG4iLCBvbGRfc2VjdGlvbi0+bmFtZSwgb2xkX3NlY3Rpb24tPl9yYXdfc2l6ZSwgc2VjdGlvbi0+bmFtZSwgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkJICAgICAgcmV0dXJuIC0xOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNlY3Rpb24tPl9yYXdfc2l6ZSA+IG9sZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0JCSAgICB7Ci0JCSAgICAgIHNlY3Rpb24tPmNvbnRlbnRzID0gKCh1bnNpZ25lZCBjaGFyICopCi0JCQkJICAgIGJmZF9yZWFsbG9jIChvbGRfc2VjdGlvbi0+Y29udGVudHMsIHNlY3Rpb24tPl9yYXdfc2l6ZSkpOwotCQkgICAgICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkJCXsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCQkgIHJldHVybiAtMTsKLQkJICAgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCQliZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkJICBpZiAoc2VjdGlvbi0+Y29udGVudHMgPT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCSAgICAgIHJldHVybiAtMTsKLQkJICAgIH0KLQkJICBtZW1zZXQgKHNlY3Rpb24tPmNvbnRlbnRzLCAwLCAoc2l6ZV90KXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0JCX0KLQkgICAgICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0jaWYgVk1TX0RFQlVHCi0JICAgICAgdm1zX2RlYnVnICg0LCAiZ3NkIHBzYyAlZCAoJXMsIGZsYWdzICUwNHg9JXMpICIsCi0JCQkgc2VjdGlvbi0+aW5kZXgsIG5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIgKGdwc2ZsYWdkZXNjLCBvbGRfZmxhZ3MpKTsKLQkgICAgICB2bXNfZGVidWcgKDQsICIlZCBieXRlcyBhdCAweCUwOGx4IChtZW0gJXApXG4iLAotCQkJIHNlY3Rpb24tPl9yYXdfc2l6ZSwgc2VjdGlvbi0+dm1hLCBzZWN0aW9uLT5jb250ZW50cyk7Ci0jZW5kaWYKLQotCSAgICAgIGdzZF9zaXplID0gdm1zX3JlY1s4XSArIDk7Ci0KLQkgICAgICBwc2VjdF9pZHgrKzsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkgIGNhc2UgR1NEX1NfQ19FUE06Ci0JICBjYXNlIEdTRF9TX0NfRVBNVzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgZXBtXG4iKTsKLSNlbmRpZgotCSAgLypGQUxMVEhSVSovCi0JICBjYXNlIEdTRF9TX0NfU1lNOgotCSAgY2FzZSBHU0RfU19DX1NZTVc6Ci0JICAgIHsKLQkgICAgICBpbnQgbmFtZV9vZmZzZXQsIHZhbHVlX29mZnNldDsKLQotCSAgICAgIC8qCi0JICAgICAgICogc3ltYm9sIHNwZWNpZmljYXRpb24gKGRlZmluaXRpb24gb3IgcmVmZXJlbmNlKQotCSAgICAgICAqLwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIkdTRF9TX0NfU1lNKFcpXG4iKTsKLSNlbmRpZgotCSAgICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAyKTsKLQkgICAgICBuZXdfZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0KLQkgICAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9XRUFLKQotCQluZXdfZmxhZ3MgfD0gQlNGX1dFQUs7Ci0KLQkgICAgICBzd2l0Y2ggKGdzZF90eXBlKQotCQl7Ci0JCSAgY2FzZSBHU0RfU19DX0VQTToKLQkJICAgIG5hbWVfb2Zmc2V0ID0gMTE7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA1OwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgR1NEX1NfQ19FUE1XOgotCQkgICAgbmFtZV9vZmZzZXQgPSAxMjsKLQkJICAgIHZhbHVlX29mZnNldCA9IDY7Ci0JCSAgICBuZXdfZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBHU0RfU19DX1NZTToKLQkJICAgIGlmIChvbGRfZmxhZ3MgJiBHU1lfU19NX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkJICAgICAgbmFtZV9vZmZzZXQgPSA5OwotCQkgICAgZWxzZQotCQkgICAgICBuYW1lX29mZnNldCA9IDQ7Ci0JCSAgICB2YWx1ZV9vZmZzZXQgPSA1OwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSBHU0RfU19DX1NZTVc6Ci0JCSAgICBpZiAob2xkX2ZsYWdzICYgR1NZX1NfTV9ERUYpCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gMTA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG5hbWVfb2Zmc2V0ID0gNTsKLQkJICAgIHZhbHVlX29mZnNldCA9IDY7Ci0JCSAgICBicmVhazsKLQkJfQotCi0JICAgICAgLyogc2F2ZSBzeW1ib2wgaW4gdm1zX3N5bWJvbF90YWJsZSAqLwotCi0JICAgICAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsCi0JCQlfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nICh2bXNfcmVjICsgbmFtZV9vZmZzZXQpKTsKLQkgICAgICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCQl7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0JCSAgcmV0dXJuIC0xOwotCQl9Ci0JICAgICAgc3ltYm9sID0gZW50cnktPnN5bWJvbDsKLQotCSAgICAgIGlmIChvbGRfZmxhZ3MgJiBHU1lfU19NX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkJewotCQkgIGludCBwc2VjdDsKLQotCQkgIHN5bWJvbC0+dmFsdWUgPSBiZmRfZ2V0bDMyICh2bXNfcmVjK3ZhbHVlX29mZnNldCk7Ci0JCSAgaWYgKChnc2RfdHlwZSA9PSBHU0RfU19DX1NZTVcpCi0JCSAgICAgIHx8IChnc2RfdHlwZSA9PSBHU0RfU19DX0VQTVcpKQotCQkgICAgcHNlY3QgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgdmFsdWVfb2Zmc2V0IC0gMik7Ci0JCSAgZWxzZQotCQkgICAgcHNlY3QgPSB2bXNfcmVjW3ZhbHVlX29mZnNldC0xXTsKLQotCQkgIHN5bWJvbC0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKXBzZWN0OwotI2lmIFZNU19ERUJVRwotCQkgIHZtc19kZWJ1Zyg0LCAiZ3NkIHN5bSBkZWYgIyVkICglcywgJWQgWyVwXSwgJTA0eD0lcylcbiIsIGFiZmQtPnN5bWNvdW50LAotCQkJCXN5bWJvbC0+bmFtZSwgKGludClzeW1ib2wtPnNlY3Rpb24sIHN5bWJvbC0+c2VjdGlvbiwgb2xkX2ZsYWdzLCBmbGFnMnN0cihnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkJfQotCSAgICAgIGVsc2UJLyogc3ltYm9sIHJlZmVyZW5jZSAqLwotCQl7Ci0JCSAgc3ltYm9sLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQkZEX1VORF9TRUNUSU9OX05BTUUpOwotI2lmIFZNU19ERUJVRwotCQkgIHZtc19kZWJ1ZyAoNCwgImdzZCBzeW0gcmVmICMlZCAoJXMsICVzIFslcF0sICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCQlzeW1ib2wtPm5hbWUsIHN5bWJvbC0+c2VjdGlvbi0+bmFtZSwgc3ltYm9sLT5zZWN0aW9uLCBvbGRfZmxhZ3MsIGZsYWcyc3RyIChnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkJfQotCi0JICAgICAgZ3NkX3NpemUgPSB2bXNfcmVjW25hbWVfb2Zmc2V0XSArIG5hbWVfb2Zmc2V0ICsgMTsKLQkgICAgICBzeW1ib2wtPmZsYWdzID0gbmV3X2ZsYWdzOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JICBjYXNlIEdTRF9TX0NfUFJPOgotCSAgY2FzZSBHU0RfU19DX1BST1c6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHByb1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0lEQzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgaWRjXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfRU5WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBlbnZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MU1k6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGxzeVxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX0xFUE06Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIGxlcG1cbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19MUFJPOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBscHJvXG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfU1BTQzoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2Qgc3BzY1xuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCSAgY2FzZSBHU0RfU19DX1NZTVY6Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZ3NkIHN5bXZcbiIpOwotI2VuZGlmCi0JICBicmVhazsKLQkgIGNhc2UgR1NEX1NfQ19FUE1WOgotI2lmIFZNU19ERUJVRwotCQl2bXNfZGVidWcoNCwgImdzZCBlcG12XG4iKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JICBjYXNlIEdTRF9TX0NfUFJPVjoKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJnc2QgcHJvdlxuIik7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JY2FzZSBFR1NEX1NfQ19QU0MgKyBFVkFYX09GRlNFVDoKLQkgIHsKLQkgICAgLyogcHJvZ3JhbSBzZWN0aW9uIGRlZmluaXRpb24gICovCi0KLQkgICAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrMTIpOwotCSAgICBzZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSk7Ci0JICAgIGlmICghc2VjdGlvbikKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA2KTsKLQkgICAgc2VjdGlvbi0+X3Jhd19zaXplID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDgpOwkvKiBhbGxvY2F0aW9uICovCi0JICAgIG5ld19mbGFncyA9IHZtc19zZWNmbGFnX2J5X25hbWUgKGFiZmQsIGV2YXhfc2VjdGlvbl9mbGFncywgbmFtZSwgKGludCkgc2VjdGlvbi0+X3Jhd19zaXplKTsKLQkgICAgaWYgKG9sZF9mbGFncyAmIEVHUFNfU19WX1JFTCkKLQkgICAgICBuZXdfZmxhZ3MgfD0gU0VDX1JFTE9DOwotCSAgICBpZiAoIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbiwgbmV3X2ZsYWdzKSkKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IHZtc19yZWNbNF07Ci0JICAgIGFsaWduX2FkZHIgPSAoMSA8PCBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpOwotCSAgICBpZiAoKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpICE9IDApCi0JICAgICAgYmFzZV9hZGRyICs9IChhbGlnbl9hZGRyIC0gKGJhc2VfYWRkciAlIGFsaWduX2FkZHIpKTsKLQkgICAgc2VjdGlvbi0+dm1hID0gKGJmZF92bWEpYmFzZV9hZGRyOwotCSAgICBiYXNlX2FkZHIgKz0gc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICBzZWN0aW9uLT5jb250ZW50cyA9ICgodW5zaWduZWQgY2hhciAqKQotCQkJCSBiZmRfbWFsbG9jIChzZWN0aW9uLT5fcmF3X3NpemUpKTsKLQkgICAgaWYgKHNlY3Rpb24tPmNvbnRlbnRzID09IE5VTEwpCi0JICAgICAgcmV0dXJuIC0xOwotCSAgICBtZW1zZXQgKHNlY3Rpb24tPmNvbnRlbnRzLCAwLCAoc2l6ZV90KSBzZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0jaWYgVk1TX0RFQlVHCi0JICAgIHZtc19kZWJ1Zyg0LCAiZWdzZCBwc2MgJWQgKCVzLCBmbGFncyAlMDR4PSVzKSAiLAotCQkgICAgICAgc2VjdGlvbi0+aW5kZXgsIG5hbWUsIG9sZF9mbGFncywgZmxhZzJzdHIoZ3BzZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotCSAgICB2bXNfZGVidWcoNCwgIiVkIGJ5dGVzIGF0IDB4JTA4bHggKG1lbSAlcClcbiIsCi0JCSAgICAgICBzZWN0aW9uLT5fcmF3X3NpemUsIHNlY3Rpb24tPnZtYSwgc2VjdGlvbi0+Y29udGVudHMpOwotI2VuZGlmCi0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfU1lNICsgRVZBWF9PRkZTRVQ6Ci0JICB7Ci0JICAgIC8qIHN5bWJvbCBzcGVjaWZpY2F0aW9uIChkZWZpbml0aW9uIG9yIHJlZmVyZW5jZSkgICovCi0KLQkgICAgc3ltYm9sID0gX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotCSAgICBpZiAoc3ltYm9sID09IDApCi0JICAgICAgcmV0dXJuIC0xOwotCi0JICAgIG9sZF9mbGFncyA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA2KTsKLQkgICAgbmV3X2ZsYWdzID0gQlNGX05PX0ZMQUdTOwotCi0JICAgIGlmIChvbGRfZmxhZ3MgJiBFR1NZX1NfVl9XRUFLKQotCSAgICAgIG5ld19mbGFncyB8PSBCU0ZfV0VBSzsKLQotCSAgICBpZiAodm1zX3JlY1s2XSAmIEVHU1lfU19WX0RFRikJLyogc3ltYm9sIGRlZmluaXRpb24gKi8KLQkgICAgICB7Ci0JCXN5bWJvbC0+bmFtZSA9Ci0JCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyszMik7Ci0JCWlmIChvbGRfZmxhZ3MgJiBFR1NZX1NfVl9OT1JNKQotCQkgIHsgICAgICAgICAvKiBwcm9jIGRlZiAqLwotCQkgICAgbmV3X2ZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQkJICB9Ci0JCXN5bWJvbC0+dmFsdWUgPSBiZmRfZ2V0bDY0ICh2bXNfcmVjKzgpOwotCQlzeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikoKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRsMzIgKHZtc19yZWMrMjgpKTsKLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJlZ3NkIHN5bSBkZWYgIyVkICglcywgJWQsICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCSAgIHN5bWJvbC0+bmFtZSwgKGludClzeW1ib2wtPnNlY3Rpb24sIG9sZF9mbGFncywgZmxhZzJzdHIoZ3N5ZmxhZ2Rlc2MsIG9sZF9mbGFncykpOwotI2VuZGlmCi0JICAgICAgfQotCSAgICBlbHNlCS8qIHN5bWJvbCByZWZlcmVuY2UgKi8KLQkgICAgICB7Ci0JICAgICAgICBzeW1ib2wtPm5hbWUgPQotCQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMrOCk7Ci0jaWYgVk1TX0RFQlVHCi0JCXZtc19kZWJ1Zyg0LCAiZWdzZCBzeW0gcmVmICMlZCAoJXMsICUwNHg9JXMpXG4iLCBhYmZkLT5zeW1jb3VudCwKLQkJCSAgIHN5bWJvbC0+bmFtZSwgb2xkX2ZsYWdzLCBmbGFnMnN0cihnc3lmbGFnZGVzYywgb2xkX2ZsYWdzKSk7Ci0jZW5kaWYKLQkgICAgICAgIHN5bWJvbC0+c2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsIEJGRF9VTkRfU0VDVElPTl9OQU1FKTsKLQkgICAgICB9Ci0KLQkgICAgc3ltYm9sLT5mbGFncyA9IG5ld19mbGFnczsKLQotCSAgICAvKiBzYXZlIHN5bWJvbCBpbiB2bXNfc3ltYm9sX3RhYmxlICAqLwotCi0JICAgIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKikgYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBzeW1ib2wtPm5hbWUsIHRydWUsIGZhbHNlKTsKLQkgICAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgICB7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCQlyZXR1cm4gLTE7Ci0JICAgICAgfQotCSAgICBpZiAoZW50cnktPnN5bWJvbCAhPSAoYXN5bWJvbCAqKU5VTEwpCi0JICAgICAgewkJCQkJLyogRklYTUUgPywgREVDIEMgZ2VuZXJhdGVzIHRoaXMgKi8KLSNpZiBWTVNfREVCVUcKLQkJdm1zX2RlYnVnKDQsICJFR1NEX1NfQ19TWU06IGR1cGxpY2F0ZSBcIiVzXCJcbiIsIHN5bWJvbC0+bmFtZSk7Ci0jZW5kaWYKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWVudHJ5LT5zeW1ib2wgPSBzeW1ib2w7Ci0JCVBSSVYoZ3NkX3N5bV9jb3VudCkrKzsKLQkJYWJmZC0+c3ltY291bnQrKzsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUdTRF9TX0NfSURDICsgRVZBWF9PRkZTRVQ6Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oInVua25vd24gZ3NkL2Vnc2Qgc3VidHlwZSAlZCIpLCBnc2RfdHlwZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIHJldHVybiAtMTsKLQotCX0gLyogc3dpdGNoICovCi0KLSAgICAgIFBSSVYocmVjX3NpemUpIC09IGdzZF9zaXplOwotICAgICAgUFJJVih2bXNfcmVjKSArPSBnc2Rfc2l6ZTsKLQotICAgIH0gLyogd2hpbGUgKHJlY3NpemUgPiAwKSAqLwotCi0gIGlmIChhYmZkLT5zeW1jb3VudCA+IDApCi0gICAgYWJmZC0+ZmxhZ3MgfD0gSEFTX1NZTVM7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogb3V0cHV0IHJvdXRpbmVzICovCi0KLS8qIFdyaXRlIHNlY3Rpb24gYW5kIHN5bWJvbCBkaXJlY3Rvcnkgb2YgYmZkIGFiZmQgICovCi0KLWludAotX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICBpbnQgc3ltbnVtOwotICBpbnQgbGFzdF9pbmRleCA9IC0xOwotICBjaGFyIGR1bW15X25hbWVbMTBdOwotICBjaGFyICpzbmFtZTsKLSAgZmxhZ3dvcmQgbmV3X2ZsYWdzLCBvbGRfZmxhZ3M7Ci0gIGNoYXIgKm5wdHIsICp1cHRyOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMiwgInZtc193cml0ZV9nc2QgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgLyogb3V0cHV0IHNlY3Rpb25zICAqLwotCi0gIHNlY3Rpb24gPSBhYmZkLT5zZWN0aW9uczsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgzLCAiJWQgc2VjdGlvbnMgZm91bmRcbiIsIGFiZmQtPnNlY3Rpb25fY291bnQpOwotI2VuZGlmCi0KLSAgLyogZWdzZCBpcyBxdWFkd29yZCBhbGlnbmVkICAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIDgpOwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRUdTRCwgLTEpOwotICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0gIF9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKTsJCS8qIHByZXBhcmUgb3V0cHV0IGZvciBzdWJyZWNvcmRzICovCi0KLSAgd2hpbGUgKHNlY3Rpb24gIT0gMCkKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMywgIlNlY3Rpb24gIyVkICVzLCAlZCBieXRlc1xuIiwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIChpbnQpc2VjdGlvbi0+X3Jhd19zaXplKTsKLSNlbmRpZgotCi0JLyogMTMgYnl0ZXMgZWdzZCwgbWF4IDMxIGNoYXJzIG5hbWUgLT4gc2hvdWxkIGJlIDQ0IGJ5dGVzICovCi0gICAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCA2NCkgPCAwKQotCXsKLQkgIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VHU0QsIC0xKTsKLQkgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLQkgIF9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKTsJCS8qIHByZXBhcmUgb3V0cHV0IGZvciBzdWJyZWNvcmRzICovCi0JfQotCi0JLyogQ3JlYXRlIGR1bW15IHNlY3Rpb25zIHRvIGtlZXAgY29uc2VjdXRpdmUgaW5kaWNlcyAqLwotCi0gICAgICB3aGlsZSAoc2VjdGlvbi0+aW5kZXggLSBsYXN0X2luZGV4ID4gMSkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDMsICJpbmRleCAlZCwgbGFzdCAlZFxuIiwgc2VjdGlvbi0+aW5kZXgsIGxhc3RfaW5kZXgpOwotI2VuZGlmCi0JICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVHU0RfU19DX1BTQywgLTEpOwotCSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKLQkgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7Ci0JICBzcHJpbnRmIChkdW1teV9uYW1lLCAiLkRVTU1ZJTAyZCIsIGxhc3RfaW5kZXgpOwotCSAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIGR1bW15X25hbWUpOwotCSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkgIGxhc3RfaW5kZXgrKzsKLQl9Ci0KLSAgICAgIC8qIERvbid0IGtub3cgaWYgdGhpcyBpcyBuZWNjZXNhcnkgZm9yIHRoZSBsaW5rZXIgYnV0IGZvciBub3cgaXQga2VlcHMKLQkgdm1zX3NsdXJwX2dzZCBoYXBweSAgKi8KLQotICAgICAgc25hbWUgPSAoY2hhciAqKXNlY3Rpb24tPm5hbWU7Ci0gICAgICBpZiAoKnNuYW1lID09ICcuJykKLQl7Ci0JICBzbmFtZSsrOwotCSAgaWYgKCgqc25hbWUgPT0gJ3QnKSAmJiAoc3RyY21wIChzbmFtZSwgInRleHQiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBQUklWKGlzX3ZheCk/VkFYX0NPREVfTkFNRTpFVkFYX0NPREVfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2QnKSAmJiAoc3RyY21wIChzbmFtZSwgImRhdGEiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBQUklWKGlzX3ZheCk/VkFYX0RBVEFfTkFNRTpFVkFYX0RBVEFfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2InKSAmJiAoc3RyY21wIChzbmFtZSwgImJzcyIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfQlNTX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdsJykgJiYgKHN0cmNtcCAoc25hbWUsICJsaW5rIikgPT0gMCkpCi0JICAgIHNuYW1lID0gRVZBWF9MSU5LX05BTUU7Ci0JICBlbHNlIGlmICgoKnNuYW1lID09ICdyJykgJiYgKHN0cmNtcCAoc25hbWUsICJyZGF0YSIpID09IDApKQotCSAgICBzbmFtZSA9IEVWQVhfUkVBRE9OTFlfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2wnKSAmJiAoc3RyY21wIChzbmFtZSwgImxpdGVyYWwiKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0xJVEVSQUxfTkFNRTsKLQkgIGVsc2UgaWYgKCgqc25hbWUgPT0gJ2MnKSAmJiAoc3RyY21wIChzbmFtZSwgImNvbW0iKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0NPTU1PTl9OQU1FOwotCSAgZWxzZSBpZiAoKCpzbmFtZSA9PSAnbCcpICYmIChzdHJjbXAgKHNuYW1lLCAibGNvbW0iKSA9PSAwKSkKLQkgICAgc25hbWUgPSBFVkFYX0xPQ0FMX05BTUU7Ci0JfQotICAgICAgZWxzZQotCXNuYW1lID0gX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBzbmFtZSwgRU9CSl9TX0NfU0VDU0laKTsKLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFR1NEX1NfQ19QU0MsIC0xKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyICYgMHhmZik7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLQl7Ci0JICBuZXdfZmxhZ3MgPSAoRUdQU19TX1ZfT1ZSfEVHUFNfU19WX1JFTHxFR1BTX1NfVl9HQkx8RUdQU19TX1ZfUkR8RUdQU19TX1ZfV1JUfEVHUFNfU19WX05PTU9EfEVHUFNfU19WX0NPTSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5ld19mbGFncyA9IHZtc19lc2VjZmxhZ19ieV9uYW1lIChldmF4X3NlY3Rpb25fZmxhZ3MsIHNuYW1lLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgbmV3X2ZsYWdzKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBzZWN0aW9uLT5fcmF3X3NpemUpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIHNuYW1lKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgICAgIGxhc3RfaW5kZXggPSBzZWN0aW9uLT5pbmRleDsKLSAgICAgIHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0OwotICAgIH0KLQotICAvKiBvdXRwdXQgc3ltYm9scyAgKi8KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDMsICIlZCBzeW1ib2xzIGZvdW5kXG4iLCBhYmZkLT5zeW1jb3VudCk7Ci0jZW5kaWYKLQotICBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKGFiZmQsIChiZmRfdm1hKS0xKTsKLQotICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IGFiZmQtPnN5bWNvdW50OyBzeW1udW0rKykKLSAgICB7Ci0KLSAgICAgIHN5bWJvbCA9IGFiZmQtPm91dHN5bWJvbHNbc3ltbnVtXTsKLSAgICAgIGlmICgqKHN5bWJvbC0+bmFtZSkgPT0gJ18nKQotCXsKLQkgIGlmIChzdHJjbXAgKHN5bWJvbC0+bmFtZSwgIl9fbWFpbiIpID09IDApCi0JICAgIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCwgKGJmZF92bWEpc3ltYm9sLT52YWx1ZSk7Ci0JfQotICAgICAgb2xkX2ZsYWdzID0gc3ltYm9sLT5mbGFnczsKLQotICAgICAgaWYgKG9sZF9mbGFncyAmIEJTRl9GSUxFKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKChvbGRfZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfV0VBSykpID09IDApCS8qIG5vdCB4ZGVmICovCi0JICAmJiAoIWJmZF9pc191bmRfc2VjdGlvbiAoc3ltYm9sLT5zZWN0aW9uKSkpCS8qIGFuZCBub3QgeHJlZiAqLwotCWNvbnRpbnVlOwkJCQkJLyogZG9udCBvdXRwdXQgKi8KLQotICAgICAgLyogMTMgYnl0ZXMgZWdzZCwgbWF4IDY0IGNoYXJzIG5hbWUgLT4gc2hvdWxkIGJlIDc3IGJ5dGVzICAqLwotCi0gICAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCA4MCkgPCAwKQotCXsKLQkgIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotCSAgX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCk7Ci0JICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VHU0QsIC0xKTsKLQkgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsKLQkgIF9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKTsJCS8qIHByZXBhcmUgb3V0cHV0IGZvciBzdWJyZWNvcmRzICovCi0JfQotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVHU0RfU19DX1NZTSwgLTEpOwotCi0gICAgICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIDApOwkJCS8qIGRhdGEgdHlwZSwgYWxpZ25tZW50ICovCi0KLSAgICAgIG5ld19mbGFncyA9IDA7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfV0VBSykKLQluZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfV0VBSzsKLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHN5bWJvbC0+c2VjdGlvbikpCQkvKiAuY29tbSAgKi8KLQluZXdfZmxhZ3MgfD0gKEVHU1lfU19WX1dFQUt8RUdTWV9TX1ZfQ09NTSk7Ci0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pCi0JewotCSAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX05PUk07Ci0JICBuZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfUkVMOwotCX0KLSAgICAgIGlmIChvbGRfZmxhZ3MgJiAoQlNGX0dMT0JBTHxCU0ZfV0VBSykpCi0JewotCSAgbmV3X2ZsYWdzIHw9IEVHU1lfU19WX0RFRjsKLQkgIGlmICghYmZkX2lzX2Fic19zZWN0aW9uIChzeW1ib2wtPnNlY3Rpb24pKQotCSAgICBuZXdfZmxhZ3MgfD0gRUdTWV9TX1ZfUkVMOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgbmV3X2ZsYWdzKTsKLQotICAgICAgaWYgKG9sZF9mbGFncyAmIChCU0ZfR0xPQkFMfEJTRl9XRUFLKSkJCS8qIHN5bWJvbCBkZWZpbml0aW9uICovCi0JewotCSAgaWYgKG9sZF9mbGFncyAmIEJTRl9GVU5DVElPTikKLQkgICAgewotCSAgICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCBzeW1ib2wtPnZhbHVlKTsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkgICAgICgoYXN5bWJvbCAqKShzeW1ib2wtPnVkYXRhLnApKS0+dmFsdWUpOwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLAotCQkJCSAgICAgKCgoYXN5bWJvbCAqKShzeW1ib2wtPnVkYXRhLnApKQotCQkJCSAgICAgIC0+c2VjdGlvbi0+aW5kZXgpKTsKLQkgICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgc3ltYm9sLT5zZWN0aW9uLT5pbmRleCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCBzeW1ib2wtPnZhbHVlKTsJLyogTF9WQUxVRSAqLwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCAwKTsJCQkvKiBMX0NPREVfQUREUkVTUyAqLwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAwKTsJCQkvKiBMX0NBX1BTSU5EWCAqLwotCSAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBzeW1ib2wtPnNlY3Rpb24tPmluZGV4KTsvKiBMX1BTSU5EWCAqLwotCSAgICB9Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltYm9sLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCA4KTsKLSAgX2JmZF92bXNfb3V0cHV0X3BvcCAoYWJmZCk7Ci0gIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOyAKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMtaGRyLmMgYi9iZmQvdm1zLWhkci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQyMGFhLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMtaGRyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgSERSIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIEVNSCByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gICBhbmQKLSAgIEVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCi0gICBFRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJiZmQuaCIKLQotI2luY2x1ZGUgInZtcy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyogUmVhZCAmIHByb2Nlc3MgZW1oIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfaGRyIChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7Ci0gIGludCBzdWJ0eXBlOwotCi0gIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZygyLCAiSERSL0VNSFxuIik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBPQkpfU19DX0hEUjoKLQlzdWJ0eXBlID0gdm1zX3JlY1sxXTsKLQlicmVhazsKLSAgICAgIGNhc2UgRU9CSl9TX0NfRU1IOgotCXN1YnR5cGUgPSBiZmRfZ2V0bDE2ICh2bXNfcmVjICsgNCkgKyBFVkFYX09GRlNFVDsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0Jc3VidHlwZSA9IC0xOwotICAgIH0KLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoMywgInN1YnR5cGUgJWRcbiIsIHN1YnR5cGUpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChzdWJ0eXBlKQotICAgIHsKLQotICAgICAgY2FzZSBNSERfU19DX01IRDoKLQkvKgotCSAqIG1vZHVsZSBoZWFkZXIKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzJdOwotCVBSSVYoaGRyX2RhdGEpLmhkcl9sX3JlY3NpeiA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyAzKTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDUpOwotCXB0ciA9IHZtc19yZWMgKyA1ICsgdm1zX3JlY1s1XSArIDE7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JcHRyICs9ICpwdHIgKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X2RhdGUgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfTE5NOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19sbm0gPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfU1JDOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY19zcmMgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfVFRMOgotCS8qCi0JICoKLQkgKi8KLQlQUklWKGhkcl9kYXRhKS5oZHJfY190dGwgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfQ1BSOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfTVRDOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIE1IRF9TX0NfR1RYOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfTUhEICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKiBtb2R1bGUgaGVhZGVyCi0JICovCi0JUFJJVihoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1s2XTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMSA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfbF9hcmNoMiA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDE2KTsKLQlQUklWKGhkcl9kYXRhKS5oZHJfdF9uYW1lID0KLQkgIF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyAyMCk7Ci0JcHRyID0gdm1zX3JlYyArIDIwICsgdm1zX3JlY1syMF0gKyAxOwotCVBSSVYoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPQotCSAgX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQlwdHIgKz0gKnB0ciArIDE7Ci0JUFJJVihoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9Ci0JICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCAxNyk7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfTE5NICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX2xubSA9Ci0JICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfU1JDICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3NyYyA9Ci0JICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotCVBSSVYoaGRyX2RhdGEpLmhkcl9jX3R0bCA9Ci0JICBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJVihyZWNfbGVuZ3RoLTYpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEVNSF9TX0NfQ1BSICsgRVZBWF9PRkZTRVQ6Ci0JLyoKLQkgKgotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU1IX1NfQ19NVEMgKyBFVkFYX09GRlNFVDoKLQkvKgotCSAqCi0JICovCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBFTUhfU19DX0dUWCArIEVWQVhfT0ZGU0VUOgotCS8qCi0JICoKLQkgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIC0xOwotCi0gICAgfSAvKiBzd2l0Y2ggKi8KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIE91dHB1dCByb3V0aW5lcy4gICovCi0KLQotLyogTWFudWZhY3VyZSBhIFZNUyBsaWtlIHRpbWUgb24gYSB1bml4IGJhc2VkIHN5c3RlbS4KLSAgIHN0b2xlbiBmcm9tIG9iai12bXMuYyAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotZ2V0X3Ztc190aW1lX3N0cmluZyAoKQotewotICBzdGF0aWMgdW5zaWduZWQgY2hhciB0YnVmWzE4XTsKLSNpZm5kZWYgVk1TCi0jaW5jbHVkZSA8dGltZS5oPgotCi0gIGNoYXIgKnBudDsKLSAgdGltZV90IHRpbWViOwotICB0aW1lICgmdGltZWIpOwotICBwbnQgPSBjdGltZSAoJnRpbWViKTsKLSAgcG50WzNdID0gMDsKLSAgcG50WzddID0gMDsKLSAgcG50WzEwXSA9IDA7Ci0gIHBudFsxNl0gPSAwOwotICBwbnRbMjRdID0gMDsKLSAgc3ByaW50ZiAodGJ1ZiwgIiUycy0lM3MtJXMgJXMiLCBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwotI2Vsc2UKLSNpbmNsdWRlIDxzdGFybGV0Lmg+Ci0gIHN0cnVjdAotICB7Ci0gICAgaW50IFNpemU7Ci0gICAgdW5zaWduZWQgY2hhciAqUHRyOwotICB9IERlc2NyaXB0b3I7Ci0gIERlc2NyaXB0b3IuU2l6ZSA9IDE3OwotICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7Ci0gIFNZUyRBU0NUSU0gKDAsICZEZXNjcmlwdG9yLCAwLCAwKTsKLSNlbmRpZiAvKiBub3QgVk1TICovCi0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zdGltZXN0cmluZzonJXMnXG4iLCB0YnVmKTsKLSNlbmRpZgotCi0gIHJldHVybiB0YnVmOwotfQotCi0KLS8qIHdyaXRlIG9iamVjdCBoZWFkZXIgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2hkciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgYXN5bWJvbCAqc3ltYm9sOwotICBpbnQgc3ltbnVtOwotICBpbnQgaGFkX2Nhc2UgPSAwOwotICBpbnQgaGFkX2ZpbGUgPSAwOwotCi0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2hkciAoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgKGFiZmQsIDIpOwotCi0gIC8qIE1IRCAqLwotCi0gIGlmIChvYmp0eXBlID09IE9CSl9TX0NfSERSKQotICAgIHsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19NSEQpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCBFT0JKX1NfQ19TVFJMVkwpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIE1BWF9PVVRSRUNfU0laRSk7Ci0gICAgfQotCi0gIGlmIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIHN0cmlwIHBhdGggYW5kIHN1ZmZpeCBpbmZvcm1hdGlvbiAqLwotCi0gICAgICBjaGFyICpmbmFtZSwgKmZvdXQsICpmcHRyOwotCi0gICAgICBmcHRyID0gYmZkX2dldF9maWxlbmFtZSAoYWJmZCk7Ci0gICAgICBmbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChmcHRyKSArIDEpOwotICAgICAgc3RyY3B5IChmbmFtZSwgZnB0cik7Ci0gICAgICBmb3V0ID0gc3RycmNociAoZm5hbWUsICddJyk7Ci0gICAgICBpZiAoZm91dCA9PSAwKQotCWZvdXQgPSBzdHJjaHIgKGZuYW1lLCAnOicpOwotICAgICAgaWYgKGZvdXQgIT0gMCkKLQlmb3V0Kys7Ci0gICAgICBlbHNlCi0JZm91dCA9IGZuYW1lOwotCi0gICAgICAvKiBzdHJpcCAub2JqIHN1ZmZpeCAgKi8KLQotICAgICAgZnB0ciA9IHN0cnJjaHIgKGZuYW1lLCAnLicpOwotICAgICAgaWYgKChmcHRyICE9IDApCi0JICAmJiAoc3RyY2FzZWNtcCAoZnB0ciwgIi5PQkoiKSA9PSAwKSkKLQkqZnB0ciA9IDA7Ci0KLSAgICAgIGZwdHIgPSBmb3V0OwotICAgICAgd2hpbGUgKCpmcHRyICE9IDApCi0JewotCSAgaWYgKGlzbG93ZXIgKCpmcHRyKSkKLQkgICAgKmZwdHIgPSB0b3VwcGVyICgqZnB0cik7Ci0JICBmcHRyKys7Ci0JICBpZiAoKCpmcHRyID09ICc7JykKLQkgICAgIHx8ICgoZnB0ciAtIGZvdXQpID4gMzEpKQotCSAgICAqZnB0ciA9IDA7Ci0JfQotICAgICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIGZvdXQpOwotICAgIH0KLSAgZWxzZQotICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLCAiTk9OQU1FIik7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGdldF92bXNfdGltZV9zdHJpbmcgKCksIDE3KTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZpbGwgKGFiZmQsIDAsIDE3KTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBMTU4gKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19MTk0pOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikiR0FTIHByb0dJUyIsIDEwKTsKLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICAvKiBTUkMgKi8KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19TUkMpOwotCi0gIGZvciAoc3ltbnVtID0gMDsgc3ltbnVtIDwgYWJmZC0+c3ltY291bnQ7IHN5bW51bSsrKQotICAgIHsKLSAgICAgIHN5bWJvbCA9IGFiZmQtPm91dHN5bWJvbHNbc3ltbnVtXTsKLQotICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfRklMRSkKLQl7Ci0JICBjaGFyICpzOwotCi0JICBpZiAoc3RybmNtcCAoKGNoYXIgKilzeW1ib2wtPm5hbWUsICI8Q0FTRToiLCA2KSA9PSAwKQotCSAgICB7Ci0JICAgICAgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykgPSBzeW1ib2wtPm5hbWVbNl0gLSAnMCc7Ci0JICAgICAgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpID0gc3ltYm9sLT5uYW1lWzddIC0gJzAnOwotCi0JICAgICAgaWYgKGhhZF9maWxlKQotCQlicmVhazsKLQkgICAgICBoYWRfY2FzZSA9IDE7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopc3ltYm9sLT5uYW1lLCBzdHJsZW4gKHN5bWJvbC0+bmFtZSkpOwotCSAgaWYgKGhhZF9jYXNlKQotCSAgICBicmVhazsKLQkgIGhhZF9maWxlID0gMTsKLQl9Ci0gICAgfQotCi0gIGlmIChzeW1udW0gPT0gYWJmZC0+c3ltY291bnQpCi0gICAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIm5vbmFtZSIsIDYpOwotCi0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgLyogVFRMICovCi0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfVFRMKTsKLSAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIlRUTCIsIDMpOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIC8qIENQUiAqLwotCi0gIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX0NQUik7Ci0gIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLAotCQkJICh1bnNpZ25lZCBjaGFyICopIkdOVSBCRkQgcG9ydGVkIGJ5IEtsYXVzIEvkbXBmIDE5OTQtMTk5NiIsCi0JCQkgMzkpOwotICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCi0gIHJldHVybiAwOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUHJvY2VzcyBFT00vRUVPTSByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2VvbSAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqdm1zX3JlYzsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoMiwgIkVPTS9FRU9NXG4iKTsKLSNlbmRpZgotCi0gIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwotCi0gIGlmICgob2JqdHlwZSA9PSBPQkpfU19DX0VPTSkgCi0gICAgIHx8IChvYmp0eXBlID09IE9CSl9TX0NfRU9NVykpCi0gICAgewotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RvdGFsX2xwcyA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA0KTsKLSAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA9ICoodm1zX3JlYyArIDgpOwotICAgICAgaWYgKFBSSVYoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA+IDEpCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJPYmplY3QgbW9kdWxlIE5PVCBlcnJvci1mcmVlICFcbiIpKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIFBSSVYoZW9tX2RhdGEpLmVvbV9oYXNfdHJhbnNmZXIgPSBmYWxzZTsKLSAgICAgIGlmIChQUklWKHJlY19zaXplKSA+IDEwKQotCXsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21faGFzX3RyYW5zZmVyID0gdHJ1ZTsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21fYl90ZnJmbGcgPSAqKHZtc19yZWMgKyA5KTsKLQkgICBQUklWKGVvbV9kYXRhKS5lb21fbF9wc2luZHggPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTIpOwotCSAgIFBSSVYoZW9tX2RhdGEpLmVvbV9sX3RmcmFkciA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxNik7Ci0KLQkgICBhYmZkLT5zdGFydF9hZGRyZXNzID0gUFJJVihlb21fZGF0YSkuZW9tX2xfdGZyYWRyOwotCX0KLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFdyaXRlIGVvbSByZWNvcmQgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAidm1zX3dyaXRlX2VvbSAoJXAsICVkKVxuIiwgYWJmZCwgb2JqdHlwZSk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIG9ianR5cGUsIC0xKTsKLSAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKShQUklWKHZtc19saW5rYWdlX2luZGV4KSA+PiAxKSk7Ci0gIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogY29tcGxldGlvbiBjb2RlICovCi0gIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogZmlsbCBieXRlICovCi0KLSAgaWYgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgIT0gKGJmZF92bWEpLTEpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgICAgIHNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5saW5rIik7Ci0gICAgICBpZiAoc2VjdGlvbiA9PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgMCk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNlY3Rpb24tPmluZGV4KSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOwotICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLW1pc2MuYyBiL2JmZC92bXMtbWlzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWIxZmM4Li4wMDAwMDAwCi0tLSBhL2JmZC92bXMtbWlzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NiArMCwwIEBACi0vKiB2bXMtbWlzYy5jIC0tIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIGZvciBWQVggKG9wZW5WTVMvVkFYKSBhbmQKLSAgIEVWQVggKG9wZW5WTVMvQWxwaGEpIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0jaWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmIFZNU19ERUJVRwotLyogZGVidWcgZnVuY3Rpb25zICovCi0KLS8qIGRlYnVnIGZ1bmN0aW9uIGZvciBhbGwgdm1zIGV4dGVuc2lvbnMKLSAgIGV2YWx1YXRlcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBWTVNfREVCVUcgZm9yIGEKLSAgIG51bWVyaWNhbCB2YWx1ZSBvbiB0aGUgZmlyc3QgY2FsbAotICAgYWxsIGVycm9yIGxldmVscyBiZWxvdyB0aGlzIHZhbHVlIGFyZSBwcmludGVkCi0gIAotICAgbGV2ZWxzOgotICAgMQl0b3BsZXZlbCBiZmQgY2FsbHMgKGZ1bmN0aW9ucyBmcm9tIHRoZSBiZmQgdmVjdG9yKQotICAgMglmdW5jdGlvbnMgY2FsbGVkIGJ5IGJmZCBjYWxscwotICAgLi4uCi0gICA5CWFsbW9zdCBldmVyeXRoaW5nCi0KLSAgIGxldmVsIGlzIGFsc28gaWRlbnRhdGlvbiBsZXZlbC4gSW5kZW50YXRpb24gaXMgcGVyZm9ybWVkCi0gICBpZiBsZXZlbCA+IDAKLQkqLwotCi0jaWYgX19TVERDX18KLXZvaWQKLV9iZmRfdm1zX2RlYnVnIChpbnQgbGV2ZWwsIGNoYXIgKmZvcm1hdCwgLi4uKQotewotICBzdGF0aWMgaW50IG1pbl9sZXZlbCA9IC0xOwotICBzdGF0aWMgRklMRSAqb3V0cHV0ID0gTlVMTDsKLSAgY2hhciAqZXB0cjsKLSAgdmFfbGlzdCBhcmdzOwotICBpbnQgYWJzbHZsID0gKGxldmVsID4gMCk/bGV2ZWw6LWxldmVsOwotCi0gIGlmIChtaW5fbGV2ZWwgPT0gLTEpCi0gICAgewotICAgICAgaWYgKChlcHRyID0gZ2V0ZW52KCJWTVNfREVCVUciKSkgIT0gTlVMTCkKLQl7Ci0JICBtaW5fbGV2ZWwgPSBhdG9pKGVwdHIpOwotCSAgb3V0cHV0ID0gc3RkZXJyOwotCX0KLSAgICAgIGVsc2UKLQltaW5fbGV2ZWwgPSAwOwotICAgIH0KLSAgaWYgKG91dHB1dCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgaWYgKGFic2x2bCA+IG1pbl9sZXZlbCkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUoLS1sZXZlbD4wKQotICAgIGZwcmludGYob3V0cHV0LCAiICIpOwotICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOwotICB2ZnByaW50ZihvdXRwdXQsIGZvcm1hdCwgYXJncyk7Ci0gIGZmbHVzaChvdXRwdXQpOwotICB2YV9lbmQoYXJncyk7Ci0KLSAgcmV0dXJuOwotfQotCi0jZWxzZSAvKiBub3QgX19TVERDX18gKi8KLQotdm9pZAotX2JmZF92bXNfZGVidWcgKGxldmVsLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpCi0gICAgIGludCBsZXZlbDsKLSAgICAgY2hhciAqZm9ybWF0OwotICAgICBsb25nIGExOyBsb25nIGEyOyBsb25nIGEzOwotICAgICBsb25nIGE0OyBsb25nIGE1OyBsb25nIGE2OwotewotICBzdGF0aWMgaW50IG1pbl9sZXZlbCA9IC0xOwotICBzdGF0aWMgRklMRSAqb3V0cHV0ID0gTlVMTDsKLSAgY2hhciAqZXB0cjsKLQotICBpZiAobWluX2xldmVsID09IC0xKQotICAgIHsKLSAgICAgIGlmICgoZXB0ciA9IGdldGVudigiVk1TX0RFQlVHIikpICE9IE5VTEwpCi0JewotCSAgbWluX2xldmVsID0gYXRvaShlcHRyKTsKLQkgIG91dHB1dCA9IHN0ZGVycjsKLQl9Ci0gICAgICBlbHNlCi0JbWluX2xldmVsID0gMDsKLSAgICB9Ci0gIGlmIChvdXRwdXQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChsZXZlbCA+IG1pbl9sZXZlbCkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUoLS1sZXZlbD4wKQotICAgIGZwcmludGYob3V0cHV0LCAiICIpOwotICBmcHJpbnRmKG91dHB1dCwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTsKLSAgZmZsdXNoKG91dHB1dCk7Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmIC8qIF9fU1REQ19fICovCi0KLQotLyogYSBkZWJ1ZyBmdW5jdGlvbgotICAgaGV4IGR1bXAgJ3NpemUnIGJ5dGVzIHN0YXJ0aW5nIGF0ICdwdHInICAqLwotCi12b2lkCi1fYmZkX2hleGR1bXAgKGxldmVsLCBwdHIsIHNpemUsIG9mZnNldCkKLSAgICAgaW50IGxldmVsOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgb2Zmc2V0OwotewotICB1bnNpZ25lZCBjaGFyICpscHRyID0gcHRyOwotICBpbnQgY291bnQgPSAwOwotICBsb25nIHN0YXJ0ID0gb2Zmc2V0OwotCi0gIHdoaWxlIChzaXplLS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgoY291bnQlMTYpID09IDApCi0Jdm1zX2RlYnVnIChsZXZlbCwgIiUwOGx4OiIsIHN0YXJ0KTsKLSAgICAgIHZtc19kZWJ1ZyAoLWxldmVsLCAiICUwMngiLCAqcHRyKyspOwotICAgICAgY291bnQrKzsKLSAgICAgIHN0YXJ0Kys7Ci0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXsKLQkgIHdoaWxlICgoY291bnQlMTYpICE9IDApCi0JICAgIHsKLQkgICAgICB2bXNfZGVidWcgKC1sZXZlbCwgIiAgICIpOwotCSAgICAgIGNvdW50Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoKGNvdW50JTE2KSA9PSAwKQotCXsKLQkgIHZtc19kZWJ1ZyAoLWxldmVsLCAiICIpOwotCSAgd2hpbGUgKGxwdHIgPCBwdHIpCi0JICAgIHsKLQkgICAgICB2bXNfZGVidWcgKC1sZXZlbCwgIiVjIiwgKCpscHRyIDwgMzIpPycuJzoqbHB0cik7Ci0JICAgICAgbHB0cisrOwotCSAgICB9Ci0JICB2bXNfZGVidWcgKC1sZXZlbCwgIlxuIik7Ci0JfQotICAgIH0KLSAgaWYgKChjb3VudCUxNikgIT0gMCkKLSAgICB2bXNfZGVidWcgKC1sZXZlbCwgIlxuIik7Ci0KLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLQwKLS8qIGhhc2ggZnVuY3Rpb25zCi0KLSAgIFRoZXNlIGFyZSBuZWVkZWQgd2hlbiByZWFkaW5nIGFuIG9iamVjdCBmaWxlLiAgKi8KLQotLyogYWxsb2NhdGUgbmV3IHZtc19oYXNoX2VudHJ5Ci0gICBrZWVwIHRoZSBzeW1ib2wgbmFtZSBhbmQgYSBwb2ludGVyIHRvIHRoZSBiZmQgc3ltYm9sIGluIHRoZSB0YWJsZSAgKi8KLQotc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLV9iZmRfdm1zX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgdm1zX3N5bWJvbF9lbnRyeSAqcmV0OwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNSwgIl9iZmRfdm1zX2hhc2hfbmV3ZnVuYyglcCwgJXAsICVzKVxuIiwgZW50cnksIHRhYmxlLCBzdHJpbmcpOwotI2VuZGlmCi0KLSAgaWYgKGVudHJ5ID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilOVUxMKQotICAgIHsKLSAgICAgIHJldCA9ICh2bXNfc3ltYm9sX2VudHJ5ICopCi0JICAgICAgYmZkX2hhc2hfYWxsb2NhdGUgKHRhYmxlLCBzaXplb2YgKHZtc19zeW1ib2xfZW50cnkpKTsKLSAgICAgIGlmIChyZXQgPT0gKHZtc19zeW1ib2xfZW50cnkgKikgTlVMTCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLQkgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopTlVMTDsKLQl9Ci0gICAgICBlbnRyeSA9IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotICAgIH0KLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgYmFzZSBjbGFzcy4gICovCi0KLSAgcmV0ID0gKHZtc19zeW1ib2xfZW50cnkgKikgYmZkX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpOwotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19oYXNoX25ld2Z1bmMgcmV0ICVwXG4iLCByZXQpOwotI2VuZGlmCi0KLSAgcmV0LT5zeW1ib2wgPSAoYXN5bWJvbCAqKU5VTEw7Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKilyZXQ7Ci19Ci0KLQwKLS8qIG9iamVjdCBmaWxlIGlucHV0IGZ1bmN0aW9ucyAqLwotCi0vKiBSZXR1cm4gdHlwZSBhbmQgbGVuZ3RoIGZyb20gcmVjb3JkIGhlYWRlciAoYnVmKSBvbiBBbHBoYS4gICovCi0KLXZvaWQKLV9iZmRfdm1zX2dldF9oZWFkZXJfdmFsdWVzIChhYmZkLCBidWYsIHR5cGUsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpidWY7Ci0gICAgIGludCAqdHlwZTsKLSAgICAgaW50ICpsZW5ndGg7Ci17Ci0gIGlmICh0eXBlICE9IDApCi0gICAgKnR5cGUgPSBiZmRfZ2V0bDE2IChidWYpOwotICBidWYgKz0gMjsKLSAgaWYgKGxlbmd0aCAhPSAwKQotICAgICpsZW5ndGggPSBiZmRfZ2V0bDE2IChidWYpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMTAsICJfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyB0eXBlICV4LCBsZW5ndGggJXhcbiIsICh0eXBlPyp0eXBlOjApLCAobGVuZ3RoPypsZW5ndGg6MCkpOwotI2VuZGlmCi0KLQotICByZXR1cm47Ci19Ci0KLQotLyogR2V0IG5leHQgcmVjb3JkIGZyb20gb2JqZWN0IGZpbGUgdG8gdm1zX2J1ZgotICAgc2V0IFBSSVYoYnVmX3NpemUpIGFuZCByZXR1cm4gaXQKLSAgCi0gICB0aGlzIGlzIGEgbGl0dGxlIHRyaWNreSBzaW5jZSBpdCBzaG91bGQgYmUgcG9ydGFibGUuCi0gIAotICAgdGhlIG9wZW5WTVMgb2JqZWN0IGZpbGUgaGFzICd2YXJpYWJsZSBsZW5ndGgnIHdoaWNoIG1lYW5zIHRoYXQKLSAgIHJlYWQoKSByZXR1cm5zIGRhdGEgaW4gY2h1bmtzIG9mIChob3BlZnVsbHkpIGNvcnJlY3QgYW5kIGV4cGVjdGVkCi0gICBzaXplLiBUaGUgbGlua2VyIChhbmQgb3RoZXIgdG9vbHMgb24gdm1zKSBkZXBlbmQgb24gdGhhdC4gVW5peCBkb2Vzbid0Ci0gICBrbm93IGFib3V0ICdmb3JtYXR0ZWQnIGZpbGVzLCBzbyByZWFkaW5nIGFuZCB3cml0aW5nIHN1Y2ggYW4gb2JqZWN0Ci0gICBmaWxlIGluIGEgdW5peCBlbnZpcm9ubWVudCBpcyBub3QgdHJpdmlhbC4KLSAgCi0gICBXaXRoIHRoZSB0b29sICdmaWxlJyAoYXZhaWxhYmxlIG9uIGFsbCB2bXMgZnRwIHNpdGVzKSwgb25lCi0gICBjYW4gdmlldyBhbmQgY2hhbmdlIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZmlsZS4gQ2hhbmdpbmcgZnJvbQotICAgJ3ZhcmlhYmxlIGxlbmd0aCcgdG8gJ2ZpeGVkIGxlbmd0aCwgNTEyIGJ5dGVzJyByZXZlYWxzIHRoZQotICAgcmVjb3JkIGxlbmd0aCBhdCB0aGUgZmlyc3QgMiBieXRlcyBvZiBldmVyeSByZWNvcmQuIFRoZSBzYW1lCi0gICBoYXBwZW5zIGR1cmluZyB0aGUgdHJhbnNmZXIgb2Ygb2JqZWN0IGZpbGVzIGZyb20gdm1zIHRvIHVuaXgsCi0gICBhdCBsZWFzdCB3aXRoIHVjeCwgZGVjJ3MgaW1wbGVtZW50YXRpb24gb2YgdGNwL2lwLgotICAKLSAgIFRoZSB2bXMgZm9ybWF0IHJlcGVhdHMgdGhlIGxlbmd0aCBhdCBieXRlcyAyICYgMyBvZiBldmVyeSByZWNvcmQuCi0gIAotICAgT24gdGhlIGZpcnN0IGNhbGwgKGZpbGVfZm9ybWF0ID09IEZGX1VOS05PV04pIHdlIGNoZWNrIGlmCi0gICB0aGUgZmlyc3QgYW5kIHRoZSB0aGlyZCBieXRlIHBhaXIgKCEpIG9mIHRoZSByZWNvcmQgbWF0Y2guCi0gICBJZiB0aGV5IGRvIGl0J3MgYW4gb2JqZWN0IGZpbGUgaW4gYW4gdW5peCBlbnZpcm9ubWVudCBvciB3aXRoCi0gICB3cm9uZyBhdHRyaWJ1dGVzIChGRl9GT1JFSUdOKSwgZWxzZSB3ZSBzaG91bGQgYmUgaW4gYSB2bXMKLSAgIGVudmlyb25tZW50IHdoZXJlIHJlYWQoKSByZXR1cm5zIHRoZSByZWNvcmQgc2l6ZSAoRkZfTkFUSVZFKS4KLSAgCi0gICByZWFkaW5nIGlzIGFsd2F5cyBkb25lIGluIDIgc3RlcHMuCi0gICBmaXJzdCBqdXN0IHRoZSByZWNvcmQgaGVhZGVyIGlzIHJlYWQgYW5kIHRoZSBsZW5ndGggZXh0cmFjdGVkCi0gICBieSBnZXRfaGVhZGVyX3ZhbHVlcwotICAgdGhlbiB0aGUgcmVhZCBidWZmZXIgaXMgYWRqdXN0ZWQgYW5kIHRoZSByZW1haW5pbmcgYnl0ZXMgYXJlCi0gICByZWFkIGluLgotICAKLSAgIGFsbCBmaWxlIGkvbyBpcyBhbHdheXMgZG9uZSBvbiBldmVuIGZpbGUgcG9zaXRpb25zICAqLwotCi1pbnQKLV9iZmRfdm1zX2dldF9yZWNvcmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHRlc3RfbGVuLCB0ZXN0X3N0YXJ0LCByZW1haW5pbmc7Ci0gIHVuc2lnbmVkIGNoYXIgKnZtc19idWY7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg4LCAiX2JmZF92bXNfZ2V0X3JlY29yZFxuIik7Ci0jZW5kaWYKLQotICAvKiBtaW5pbXVtIGlzIDYgYnl0ZXMgb24gQWxwaGEKLSAgICAgKDIgYnl0ZXMgbGVuZ3RoLCAyIGJ5dGVzIHJlY29yZCBpZCwgMiBieXRlcyBsZW5ndGggcmVwZWF0ZWQpCi0KLSAgICAgb24gVkFYIHRoZXJlJ3Mgbm8gbGVuZ3RoIGluZm9ybWF0aW9uIGluIHRoZSByZWNvcmQKLSAgICAgc28gc3RhcnQgd2l0aCBPQkpfU19DX01BWFJFQ1NJWiAgKi8KLQotICBpZiAoUFJJVihidWZfc2l6ZSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoUFJJVihpc192YXgpKQotCXsKLQkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE9CSl9TX0NfTUFYUkVDU0laKTsKLQkgIFBSSVYoYnVmX3NpemUpID0gT0JKX1NfQ19NQVhSRUNTSVo7Ci0JICBQUklWKGZpbGVfZm9ybWF0KSA9IEZGX1ZBWDsKLQl9Ci0gICAgICBlbHNlCi0JUFJJVih2bXNfYnVmKSA9ICh1bnNpZ25lZCBjaGFyICopIG1hbGxvYyAoNik7Ci0gICAgfQotCi0gIHZtc19idWYgPSBQUklWKHZtc19idWYpOwotCi0gIGlmICh2bXNfYnVmID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX21lbW9yeSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHN3aXRjaCAoUFJJVihmaWxlX2Zvcm1hdCkpCi0gICAgewotICAgICAgY2FzZSBGRl9VTktOT1dOOgotICAgICAgY2FzZSBGRl9GT1JFSUdOOgotCXRlc3RfbGVuID0gNjsJCQkvKiBwcm9iZSA2IGJ5dGVzICovCi0JdGVzdF9zdGFydCA9IDI7CQkJLyogd2hlcmUgdGhlIHJlY29yZCBzdGFydHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZGX05BVElWRToKLQl0ZXN0X2xlbiA9IDQ7Ci0JdGVzdF9zdGFydCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBGRl9WQVg6Ci0JdGVzdF9sZW4gPSAwOwotCXRlc3Rfc3RhcnQgPSAwOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICAvKiBza2lwIG9kZCBhbGlnbm1lbnQgYnl0ZSAgKi8KLQotICBpZiAoYmZkX3RlbGwgKGFiZmQpICYgMSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3JlYWQgKFBSSVYodm1zX2J1ZiksIDEsIDEsIGFiZmQpICE9IDEpCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ZpbGVfdHJ1bmNhdGVkKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICB9Ci0KLSAgLyogcmVhZCB0aGUgcmVjb3JkIGhlYWRlciBvbiBBbHBoYS4gICovCi0KLSAgaWYgKCh0ZXN0X2xlbiAhPSAwKQotICAgICAgJiYgKGJmZF9yZWFkIChQUklWKHZtc19idWYpLCAxLCB0ZXN0X2xlbiwgYWJmZCkgIT0gdGVzdF9sZW4pKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogY2hlY2sgZmlsZSBmb3JtYXQgb24gZmlyc3QgY2FsbCAgKi8KLQotICBpZiAoUFJJVihmaWxlX2Zvcm1hdCkgPT0gRkZfVU5LTk9XTikKLSAgICB7CQkJCQkJLyogcmVjb3JkIGxlbmd0aCByZXBlYXRzID8gKi8KLSAgICAgIGlmICggKHZtc19idWZbMF0gPT0gdm1zX2J1Zls0XSkKLSAgICAgICAgJiYgKHZtc19idWZbMV0gPT0gdm1zX2J1Zls1XSkpCi0JewotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9GT1JFSUdOOwkvKiBZOiBmb3JlaWduIGVudmlyb25tZW50ICovCi0JICB0ZXN0X3N0YXJ0ID0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgUFJJVihmaWxlX2Zvcm1hdCkgPSBGRl9OQVRJVkU7CS8qIE46IG5hdGl2ZSBlbnZpcm9ubWVudCAqLwotCSAgdGVzdF9zdGFydCA9IDA7Ci0JfQotICAgIH0KLQotICBpZiAoUFJJVihpc192YXgpKQotICAgIHsKLSAgICAgIFBSSVYocmVjX2xlbmd0aCkgPSBiZmRfcmVhZCAodm1zX2J1ZiwgMSwgUFJJVihidWZfc2l6ZSksIGFiZmQpOwotICAgICAgaWYgKFBSSVYocmVjX2xlbmd0aCkgPD0gMCkKLQl7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgUFJJVih2bXNfcmVjKSA9IHZtc19idWY7Ci0gICAgfQotICBlbHNlCQkvKiBBbHBoYSAgKi8KLSAgICB7Ci0gICAgICAvKiBleHRyYWN0IHZtcyByZWNvcmQgbGVuZ3RoICAqLwotCi0gICAgICBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcyAoYWJmZCwgdm1zX2J1Zit0ZXN0X3N0YXJ0LCBOVUxMLAotCQkJCSAgJlBSSVYocmVjX2xlbmd0aCkpOwotCi0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA8PSAwKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIHRoYXQncyB3aGF0IHRoZSBsaW5rZXIgbWFudWFsIHNheXMgICovCi0KLSAgICAgIGlmIChQUklWKHJlY19sZW5ndGgpID4gRU9CSl9TX0NfTUFYUkVDU0laKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIGFkanVzdCB0aGUgYnVmZmVyICAqLwotCi0gICAgICBpZiAoUFJJVihyZWNfbGVuZ3RoKSA+IFBSSVYoYnVmX3NpemUpKQotCXsKLQkgIFBSSVYodm1zX2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSByZWFsbG9jICh2bXNfYnVmLCBQUklWKHJlY19sZW5ndGgpKTsKLQkgIHZtc19idWYgPSBQUklWKHZtc19idWYpOwotCSAgaWYgKHZtc19idWYgPT0gMCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19tZW1vcnkpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgUFJJVihidWZfc2l6ZSkgPSBQUklWKHJlY19sZW5ndGgpOwotCX0KLQotICAgICAgLyogcmVhZCB0aGUgcmVtYWluaW5nIHJlY29yZCAgKi8KLQotICAgICAgcmVtYWluaW5nID0gUFJJVihyZWNfbGVuZ3RoKSAtIHRlc3RfbGVuICsgdGVzdF9zdGFydDsKLQotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICgxMCwgImJmZF9yZWFkIHJlbWFpbmluZyAlZFxuIiwgcmVtYWluaW5nKTsKLSNlbmRpZgotICAgICAgaWYgKGJmZF9yZWFkICh2bXNfYnVmICsgdGVzdF9sZW4sIDEsIHJlbWFpbmluZywgYWJmZCkgIT0gcmVtYWluaW5nKQotCXsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9maWxlX3RydW5jYXRlZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBQUklWKHZtc19yZWMpID0gdm1zX2J1ZiArIHRlc3Rfc3RhcnQ7Ci0gICAgfQotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMTEsICJiZmRfcmVhZCByZWNfbGVuZ3RoICVkXG4iLCBQUklWKHJlY19sZW5ndGgpKTsKLSNlbmRpZgotCi0gIHJldHVybiBQUklWKHJlY19sZW5ndGgpOwotfQotCi0KLS8qIGdldCBuZXh0IHZtcyByZWNvcmQgZnJvbSBmaWxlCi0gICB1cGRhdGUgdm1zX3JlYyBhbmQgcmVjX2xlbmd0aCB0byBuZXcgKHJlbWFpbmluZykgdmFsdWVzICAqLwotCi1pbnQKLV9iZmRfdm1zX25leHRfcmVjb3JkIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX25leHRfcmVjb3JkIChsZW4gJWQsIHNpemUgJWQpXG4iLAotCSAgICAgIFBSSVYocmVjX2xlbmd0aCksIFBSSVYocmVjX3NpemUpKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKHJlY19sZW5ndGgpID4gMCkKLSAgICB7Ci0gICAgICBQUklWKHZtc19yZWMpICs9IFBSSVYocmVjX3NpemUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChfYmZkX3Ztc19nZXRfcmVjb3JkIChhYmZkKSA8PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKFBSSVYoaXNfdmF4KSkKLSAgICB7Ci0gICAgICBQUklWKHJlY190eXBlKSA9ICooUFJJVih2bXNfcmVjKSk7Ci0gICAgICBQUklWKHJlY19zaXplKSA9IFBSSVYocmVjX2xlbmd0aCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgX2JmZF92bXNfZ2V0X2hlYWRlcl92YWx1ZXMgKGFiZmQsIFBSSVYodm1zX3JlYyksICZQUklWKHJlY190eXBlKSwKLQkJCQkgICZQUklWKHJlY19zaXplKSk7Ci0gICAgfQotICBQUklWKHJlY19sZW5ndGgpIC09IFBSSVYocmVjX3NpemUpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoOCwgIl9iZmRfdm1zX25leHRfcmVjb3JkOiByZWMgJXAsIHNpemUgJWQsIGxlbmd0aCAlZCwgdHlwZSAlZFxuIiwKLQkgICAgICBQUklWKHZtc19yZWMpLCBQUklWKHJlY19zaXplKSwgUFJJVihyZWNfbGVuZ3RoKSwKLQkgICAgICBQUklWKHJlY190eXBlKSk7Ci0jZW5kaWYKLQotICByZXR1cm4gUFJJVihyZWNfdHlwZSk7Ci19Ci0KLQotDAotLyogQ29weSBzaXplZCBzdHJpbmcgKHN0cmluZyB3aXRoIGZpeGVkIGxlbmd0aCkgdG8gbmV3IGFsbG9jYXRlZCBhcmVhCi0gICBzaXplIGlzIHN0cmluZyBsZW5ndGggKHNpemUgb2YgcmVjb3JkKSAgKi8KLQotY2hhciAqCi1fYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAoc3RyLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICpzdHI7Ci0gICAgIGludCBzaXplOwotewotICBjaGFyICpuZXdzdHIgPSBiZmRfbWFsbG9jIChzaXplICsgMSk7Ci0KLSAgaWYgKG5ld3N0ciA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICBzdHJuY3B5IChuZXdzdHIsIChjaGFyICopc3RyLCBzaXplKTsKLSAgbmV3c3RyW3NpemVdID0gMDsKLQotICByZXR1cm4gbmV3c3RyOwotfQotCi0vKiBDb3B5IGNvdW50ZWQgc3RyaW5nIChzdHJpbmcgd2l0aCBsZW5ndGggYXQgZmlyc3QgYnl0ZSkgdG8gbmV3IGFsbG9jYXRlZCBhcmVhCi0gICBwdHIgcG9pbnRzIHRvIGxlbmd0aCBieXRlIG9uIGVudHJ5ICAqLwotCi1jaGFyICoKLV9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cikKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICBpbnQgbGVuID0gKnB0cisrOwotCi0gIHJldHVybiBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAocHRyLCBsZW4pOwotfQotCi0MCi0vKiBzdGFjayByb3V0aW5lcyBmb3Igdm1zIEVUSVIgY29tbWFuZHMgKi8KLQotLyogUHVzaCB2YWx1ZSBhbmQgc2VjdGlvbiBpbmRleCAgKi8KLQotdm9pZAotX2JmZF92bXNfcHVzaCAoYWJmZCwgdmFsLCBwc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICB1cXVhZCB2YWw7Ci0gICAgIGludCBwc2VjdDsKLXsKLSAgc3RhdGljIGludCBsYXN0X3BzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNCwgIjxwdXNoICUwMTZseCglZCkgYXQgJWQ+XG4iLCB2YWwsIHBzZWN0LCBQUklWKHN0YWNrcHRyKSk7Ci0jZW5kaWYKLQotICBpZiAocHNlY3QgPj0gMCkKLSAgICBsYXN0X3BzZWN0ID0gcHNlY3Q7Ci0KLSAgUFJJVihzdGFja1tQUklWKHN0YWNrcHRyKV0pLnZhbHVlID0gdmFsOwotICBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3QgPSBsYXN0X3BzZWN0OwotICBQUklWKHN0YWNrcHRyKSsrOwotICBpZiAoUFJJVihzdGFja3B0cikgPj0gU1RBQ0tTSVpFKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjayBvdmVyZmxvdyAoJWQpIGluIF9iZmRfdm1zX3B1c2giKSwgUFJJVihzdGFja3B0cikpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyogUG9wIHZhbHVlIGFuZCBzZWN0aW9uIGluZGV4ICAqLwotCi11cXVhZAotX2JmZF92bXNfcG9wIChhYmZkLCBwc2VjdCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgKnBzZWN0OwotewotICB1cXVhZCB2YWx1ZTsKLQotICBpZiAoUFJJVihzdGFja3B0cikgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2sgdW5kZXJmbG93IGluIF9iZmRfdm1zX3BvcCIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLSAgUFJJVihzdGFja3B0ciktLTsKLSAgdmFsdWUgPSBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkudmFsdWU7Ci0gIGlmICgocHNlY3QgIT0gTlVMTCkgJiYgKFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCA+PSAwKSkKLSAgICAqcHNlY3QgPSBQUklWKHN0YWNrW1BSSVYoc3RhY2twdHIpXSkucHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg0LCAiPHBvcCAlMDE2bHgoJWQpPlxuIiwgdmFsdWUsIFBSSVYoc3RhY2tbUFJJVihzdGFja3B0cildKS5wc2VjdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLQwKLS8qIG9iamVjdCBmaWxlIG91dHB1dCBmdW5jdGlvbnMgKi8KLQotLyogR0FTIHRlbmRzIHRvIHdyaXRlIHNlY3Rpb25zIGluIGxpdHRsZSBjaHVua3MgKGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cykKLSAgIHdoaWNoIHdlIGNhbid0IHVzZSBkaXJlY3RseS4gU28gd2Ugc2F2ZSB0aGUgbGl0dGxlIGNodW5rcyBpbiBsaW5rZWQKLSAgIGxpc3RzIChvbmUgcGVyIHNlY3Rpb24pIGFuZCB3cml0ZSB0aGVtIGxhdGVyLiAgKi8KLQotLyogQWRkIGEgbmV3IHZtc19zZWN0aW9uIHN0cnVjdHVyZSB0byB2bXNfc2VjdGlvbl90YWJsZQotICAgLSBmb3J3YXJkIGNoYWluaW5nIC0gICovCi0KLXN0YXRpYyB2bXNfc2VjdGlvbiAqCi1hZGRfbmV3X2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlY19wdHIgc2VjdGlvbjsKLXsKLSAgdm1zX3NlY3Rpb24gKnNwdHIsICpuZXdwdHI7Ci0KLSAgc3B0ciA9IFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW3NlY3Rpb24tPmluZGV4XTsKLSAgaWYgKHNwdHIgIT0gTlVMTCkKLSAgICByZXR1cm4gc3B0cjsKLQotICBuZXdwdHIgPSAodm1zX3NlY3Rpb24gKikgYmZkX21hbGxvYyAoc2l6ZW9mICh2bXNfc2VjdGlvbikpOwotICBpZiAobmV3cHRyID09ICh2bXNfc2VjdGlvbiAqKSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBuZXdwdHItPmNvbnRlbnRzID0gKHVuc2lnbmVkIGNoYXIgKikgYmZkX2FsbG9jIChhYmZkLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0gIGlmIChuZXdwdHItPmNvbnRlbnRzID09ICh1bnNpZ25lZCBjaGFyICopTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgbmV3cHRyLT5vZmZzZXQgPSAwOwotICBuZXdwdHItPnNpemUgPSBzZWN0aW9uLT5fcmF3X3NpemU7Ci0gIG5ld3B0ci0+bmV4dCA9IDA7Ci0gIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW3NlY3Rpb24tPmluZGV4XSA9IG5ld3B0cjsKLSAgcmV0dXJuIG5ld3B0cjsKLX0KLQotCi0vKiBTYXZlIHNlY3Rpb24gZGF0YSAmIG9mZnNldCB0byBhbiB2bXNfc2VjdGlvbiBzdHJ1Y3R1cmUKLSAgIHZtc19zZWN0aW9uX3RhYmxlW10gaG9sZHMgdGhlIHZtc19zZWN0aW9uIGNoYWluICAqLwotCi1ib29sZWFuCi1fYmZkX3NhdmVfdm1zX3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24sIGRhdGEsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VjX3B0ciBzZWN0aW9uOwotICAgICBQVFIgZGF0YTsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGNvdW50OwotewotICB2bXNfc2VjdGlvbiAqc3B0cjsKLQotICBpZiAoc2VjdGlvbi0+aW5kZXggPj0gVk1TX1NFQ1RJT05fQ09VTlQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoY291bnQgPT0gKGJmZF9zaXplX3R5cGUpMCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgc3B0ciA9IGFkZF9uZXdfY29udGVudHMgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAoc3B0ciA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgbWVtY3B5IChzcHRyLT5jb250ZW50cyArIG9mZnNldCwgZGF0YSwgKHNpemVfdCkgY291bnQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEdldCB2bXNfc2VjdGlvbiBwb2ludGVyIHRvIHNhdmVkIGNvbnRlbnRzIGZvciBzZWN0aW9uICMgaW5kZXggICovCi0KLXZtc19zZWN0aW9uICoKLV9iZmRfZ2V0X3Ztc19zZWN0aW9uIChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgaW5kZXg7Ci17Ci0gIGlmIChpbmRleCA+PSAgVk1TX1NFQ1RJT05fQ09VTlQpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJldHVybiBQUklWKHZtc19zZWN0aW9uX3RhYmxlKVtpbmRleF07Ci19Ci0KLQwKLS8qIE9iamVjdCBvdXRwdXQgcm91dGluZXMgICovCi0KLS8qIEJlZ2luIG5ldyByZWNvcmQgb3IgcmVjb3JkIGhlYWRlcgotICAgd3JpdGUgMiBieXRlcyByZWN0eXBlCi0gICB3cml0ZSAyIGJ5dGVzIHJlY29yZCBsZW5ndGggKGZpbGxlZCBpbiBhdCBmbHVzaCkKLSAgIHdyaXRlIDIgYnl0ZXMgaGVhZGVyIHR5cGUgKG9tbWl0dGVkIGlmIHJlY2hlYWQgPT0gLTEpICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIHJlY3R5cGUsIHJlY2hlYWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHJlY3R5cGU7Ci0gICAgIGludCByZWNoZWFkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYmVnaW4odHlwZSAlZCwgaGVhZCAlZClcbiIsIHJlY3R5cGUsCi0JICAgICAgcmVjaGVhZCk7Ci0jZW5kaWYKLQotICBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQscmVjdHlwZSk7Ci0KLSAgLyogc2F2ZSBjdXJyZW50IG91dHB1dCBwb3NpdGlvbiB0byBmaWxsIGluIGxlbmdodCBsYXRlciAgKi8KLQotICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCi0gICAgUFJJVihsZW5ndGhfcG9zKSA9IFBSSVYob3V0cHV0X3NpemUpOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9iZWdpbjogbGVuZ3RoX3BvcyA9ICVkXG4iLAotCSAgICAgIFBSSVYobGVuZ3RoX3BvcykpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLDApOwkJLyogcGxhY2Vob2xkZXIgZm9yIGxlbmd0aCAqLwotCi0gIGlmIChyZWNoZWFkICE9IC0xKQotICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCxyZWNoZWFkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogU2V0IHJlY29yZC9zdWJyZWNvcmQgYWxpZ25tZW50ICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50IChhYmZkLCBhbGlnbnRvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBhbGlnbnRvOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfYWxpZ25tZW50KCVkKVxuIiwgYWxpZ250byk7Ci0jZW5kaWYKLQotICBQUklWKG91dHB1dF9hbGlnbm1lbnQpID0gYWxpZ250bzsKLSAgcmV0dXJuOwotfQotCi0KLS8qIFByZXBhcmUgZm9yIHN1YnJlY29yZCBmaWVsZHMgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9wdXNoIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc19vdXRwdXRfcHVzaChwdXNoZWRfc2l6ZSA9ICVkKVxuIiwgUFJJVihvdXRwdXRfc2l6ZSkpOwotI2VuZGlmCi0KLSAgUFJJVihwdXNoX2xldmVsKSsrOwotICBQUklWKHB1c2hlZF9zaXplKSA9IFBSSVYob3V0cHV0X3NpemUpOwotICByZXR1cm47Ci19Ci0KLQotLyogRW5kIG9mIHN1YnJlY29yZCBmaWVsZHMgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAidm1zX291dHB1dF9wb3AocHVzaGVkX3NpemUgPSAlZClcbiIsIFBSSVYocHVzaGVkX3NpemUpKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0gIFBSSVYobGVuZ3RoX3BvcykgPSAyOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInZtc19vdXRwdXRfcG9wOiBsZW5ndGhfcG9zID0gJWRcbiIsIFBSSVYobGVuZ3RoX3BvcykpOwotI2VuZGlmCi0KLSAgUFJJVihwdXNoZWRfc2l6ZSkgPSAwOwotICBQUklWKHB1c2hfbGV2ZWwpLS07Ci0gIHJldHVybjsKLX0KLQotCi0vKiBGbHVzaCB1bndyaXR0ZW4gb3V0cHV0LCBlbmRzIGN1cnJlbnQgcmVjb3JkICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHJlYWxfc2l6ZSA9IFBSSVYob3V0cHV0X3NpemUpOwotICBpbnQgYWxpZ25jb3VudDsKLSAgaW50IGxlbmd0aDsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZmx1c2gocmVhbF9zaXplID0gJWQsIHB1c2hlZF9zaXplICVkIGF0IGxlbnBvcyAlZClcbiIsCi0JICAgICAgcmVhbF9zaXplLCBQUklWKHB1c2hlZF9zaXplKSwgUFJJVihsZW5ndGhfcG9zKSk7Ci0jZW5kaWYKLQotICBpZiAoUFJJVihwdXNoX2xldmVsKSA+IDApCi0gICAgbGVuZ3RoID0gcmVhbF9zaXplIC0gUFJJVihwdXNoZWRfc2l6ZSk7Ci0gIGVsc2UKLSAgICBsZW5ndGggPSByZWFsX3NpemU7Ci0KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybjsKLSAgYWxpZ25jb3VudCA9IChQUklWKG91dHB1dF9hbGlnbm1lbnQpCi0JCS0gKGxlbmd0aCAlIFBSSVYob3V0cHV0X2FsaWdubWVudCkpKSAlIFBSSVYob3V0cHV0X2FsaWdubWVudCk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiYWxpZ246IGFkZGluZyAlZCBieXRlc1xuIiwgYWxpZ25jb3VudCk7Ci0jZW5kaWYKLQotICB3aGlsZShhbGlnbmNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIFBSSVYob3V0cHV0X2J1ZilbcmVhbF9zaXplKytdID0gMDsKLSNpZiAwCi0gICAgICAvKiB0aGlzIGlzIHdoeSBJICpsb3ZlKiB2bXM6IGluY29uc2lzdGVuY3kgOi19Ci0JIGFsaWdubWVudCBpcyBhZGRlZCB0byB0aGUgc3VicmVjb3JkIGxlbmd0aAotCSBidXQgbm90IHRvIHRoZSByZWNvcmQgbGVuZ3RoICAqLwotICAgICAgaWYgKFBSSVYocHVzaF9sZXZlbCkgPiAwKQotI2VuZGlmCi0JbGVuZ3RoKys7Ci0gICAgfQotCi0gIC8qIHB1dCBsZW5ndGggdG8gYnVmZmVyICAqLwotICBQUklWKG91dHB1dF9zaXplKSA9IFBSSVYobGVuZ3RoX3Bvcyk7Ci0gIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgKHVuc2lnbmVkIGludClsZW5ndGgpOwotCi0gIGlmIChQUklWKHB1c2hfbGV2ZWwpID09IDApCi0gICAgewotI2lmbmRlZiBWTVMKLQkvKiB3cml0ZSBsZW5ndGggZmlyc3QsIHNlZSBGRl9GT1JFSUdOIGluIHRoZSBpbnB1dCByb3V0aW5lcyAqLwotICAgICAgZndyaXRlIChQUklWKG91dHB1dF9idWYpKzIsIDIsIDEsIChGSUxFICopYWJmZC0+aW9zdHJlYW0pOwotI2VuZGlmCi0gICAgICBmd3JpdGUgKFBSSVYob3V0cHV0X2J1ZiksIHJlYWxfc2l6ZSwgMSwgKEZJTEUgKilhYmZkLT5pb3N0cmVhbSk7Ci0KLSAgICAgIFBSSVYob3V0cHV0X3NpemUpID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQUklWKG91dHB1dF9zaXplKSA9IHJlYWxfc2l6ZTsKLSAgICAgIFBSSVYocHVzaGVkX3NpemUpID0gUFJJVihvdXRwdXRfc2l6ZSk7Ci0gICAgfQotCi0gIHJldHVybjsKLX0KLQotCi0vKiBFbmQgcmVjb3JkIG91dHB1dCAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfZW5kXG4iKTsKLSNlbmRpZgotCi0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIGNoZWNrIHJlbWFpbmluZyBidWZmZXIgc2l6ZQotCi0gICByZXR1cm4gd2hhdCdzIGxlZnQuICAqLwotCi1pbnQKLV9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgc2l6ZSkKLSAgICBiZmQgKmFiZmQ7Ci0gICAgaW50IHNpemU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9jaGVjayglZClcbiIsIHNpemUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIChNQVhfT1VUUkVDX1NJWkUgLSAoUFJJVihvdXRwdXRfc2l6ZSkgKyBzaXplICsgTUlOX09VVFJFQ19MVUZUKSk7Ci19Ci0KLQotLyogT3V0cHV0IGJ5dGUgKDggYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2J5dGUoJTAyeClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGJmZF9wdXRfOCAoYWJmZCwgdmFsdWUgJiAweGZmLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSAxOwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IHNob3J0ICgxNiBiaXQpIHZhbHVlICAqLwotCi12b2lkCi1fYmZkX3Ztc19vdXRwdXRfc2hvcnQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X3Nob3J0ICglMDR4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF8xNiAoYWJmZCwgdmFsdWUgJiAweGZmZmYsIFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IDI7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgbG9uZyAoMzIgYml0KSB2YWx1ZSAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9sb25nICglMDhseClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGJmZF9wdXRfMzIgKGFiZmQsIHZhbHVlLCBQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSkpOwotICBQUklWKG91dHB1dF9zaXplKSArPSA0OwotICByZXR1cm47Ci19Ci0KLQotLyogT3V0cHV0IHF1YWQgKDY0IGJpdCkgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1cXVhZCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X3F1YWQoJTAxNmx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgYmZkX3B1dF82NChhYmZkLCB2YWx1ZSwgUFJJVihvdXRwdXRfYnVmKSArIFBSSVYob3V0cHV0X3NpemUpKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gODsKLSAgcmV0dXJuOwotfQotCi0KLS8qIE91dHB1dCBjLXN0cmluZyBhcyBjb3VudGVkIHN0cmluZyAgKi8KLQotdm9pZAotX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKnZhbHVlOwotewotaW50IGxlbjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDYsICJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCglcylcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGxlbiA9IHN0cmxlbiAodmFsdWUpOwotICBpZiAobGVuID09IDApCi0gICAgewotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJfYmZkX3Ztc19vdXRwdXRfY291bnRlZCBjYWxsZWQgd2l0aCB6ZXJvIGJ5dGVzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKGxlbiA+IDI1NSkKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIl9iZmRfdm1zX291dHB1dF9jb3VudGVkIGNhbGxlZCB3aXRoIHRvbyBtYW55IGJ5dGVzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIGxlbiAmIDB4ZmYpOwotICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKil2YWx1ZSwgbGVuKTsKLX0KLQotCi0vKiBPdXRwdXQgY2hhcmFjdGVyIGFyZWEgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBkYXRhLCBsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiX2JmZF92bXNfb3V0cHV0X2R1bXAoJWQpXG4iLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHJldHVybjsKLQotICBtZW1jcHkgKFBSSVYob3V0cHV0X2J1ZikgKyBQUklWKG91dHB1dF9zaXplKSwgZGF0YSwgbGVuZ3RoKTsKLSAgUFJJVihvdXRwdXRfc2l6ZSkgKz0gbGVuZ3RoOwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBPdXRwdXQgY291bnQgYnl0ZXMgb2YgdmFsdWUgICovCi0KLXZvaWQKLV9iZmRfdm1zX291dHB1dF9maWxsIChhYmZkLCB2YWx1ZSwgY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHZhbHVlOwotICAgICBpbnQgY291bnQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgIl9iZmRfdm1zX291dHB1dF9maWxsKHZhbCAlMDJ4IHRpbWVzICVkKVxuIiwgdmFsdWUsIGNvdW50KTsKLSNlbmRpZgotCi0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybjsKLSAgbWVtc2V0IChQUklWKG91dHB1dF9idWYpICsgUFJJVihvdXRwdXRfc2l6ZSksIHZhbHVlLCBjb3VudCk7Ci0gIFBSSVYob3V0cHV0X3NpemUpICs9IGNvdW50OwotCi0gIHJldHVybjsKLX0KLQotLyogdGhpcyBoYXNoIHJvdXRpbmUgYm9ycm93ZWQgZnJvbSBHTlUtRU1BQ1MsIGFuZCBzdHJlbmd0aGVuZWQgc2xpZ2h0bHkgIEVSWSovCi0KLXN0YXRpYyBpbnQKLWhhc2hfc3RyaW5nIChwdHIpCi0gICAgIGNvbnN0IGNoYXIgKnB0cjsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIHB0cjsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqZW5kID0gcCArIHN0cmxlbiAocHRyKTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOwotICByZWdpc3RlciBpbnQgaGFzaCA9IDA7Ci0KLSAgd2hpbGUgKHAgIT0gZW5kKQotICAgIHsKLSAgICAgIGMgPSAqcCsrOwotICAgICAgaGFzaCA9ICgoaGFzaCA8PCAzKSArIChoYXNoIDw8IDE1KSArIChoYXNoID4+IDI4KSArIGMpOwotICAgIH0KLSAgcmV0dXJuIGhhc2g7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgbGVuZ3RoLWhhc2hlZCBWTVMgc3ltYm9sIG5hbWUgKGxpbWl0ZWQgdG8gbWF4bGVuIGNoYXJzKS4gICovCi0KLWNoYXIgKgotX2JmZF92bXNfbGVuZ3RoX2hhc2hfc3ltYm9sIChhYmZkLCBpbiwgbWF4bGVuKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKmluOwotICAgICBpbnQgbWF4bGVuOwotewotICBsb25nIGludCBpbml0OwotICBsb25nIGludCByZXN1bHQ7Ci0gIGludCBpbl9sZW47Ci0gIGNoYXIgKnBudCA9IDA7Ci0gIGNoYXIgKm5ld19uYW1lOwotICBjb25zdCBjaGFyICpvbGRfbmFtZTsKLSAgaW50IGk7Ci0gIHN0YXRpYyBjaGFyIG91dGJ1ZltFT0JKX1NfQ19TWU1TSVorMV07Ci0gIGNoYXIgKm91dCA9IG91dGJ1ZjsKLQotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcoNCwgIl9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCBcIiVzXCJcbiIsIGluKTsKLSNlbmRpZgotCi0gIGlmIChtYXhsZW4gPiBFT0JKX1NfQ19TWU1TSVopCi0gICAgbWF4bGVuID0gRU9CSl9TX0NfU1lNU0laOwotCi0gIG5ld19uYW1lID0gb3V0OwkJLyogc2F2ZSB0aGlzIGZvciBsYXRlci4gICovCi0KLSAgLyogV2UgbWF5IG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHN5bWJvbCwgc2F2ZSB0aGUgaGFzaCBmb3IgbGF0ZXIuICAqLwotCi0gIGluX2xlbiA9IHN0cmxlbiAoaW4pOwotCi0gIHJlc3VsdCA9IChpbl9sZW4gPiBtYXhsZW4pID8gaGFzaF9zdHJpbmcgKGluKSA6IDA7Ci0KLSAgb2xkX25hbWUgPSBpbjsKLQotICAvKiBEbyB0aGUgbGVuZ3RoIGNoZWNraW5nLiAgKi8KLQotICBpZiAoaW5fbGVuIDw9IG1heGxlbikKLSAgICB7Ci0gICAgICBpID0gaW5fbGVuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChQUklWKGZsYWdfaGFzaF9sb25nX25hbWVzKSkKLQlpID0gbWF4bGVuLTk7Ci0gICAgICBlbHNlCi0JaSA9IG1heGxlbjsKLSAgICB9Ci0KLSAgc3RybmNweSAob3V0LCBpbiwgaSk7Ci0gIGluICs9IGk7Ci0gIG91dCArPSBpOwotCi0gIGlmICgoaW5fbGVuID4gbWF4bGVuKQotICAgICAgJiYgUFJJVihmbGFnX2hhc2hfbG9uZ19uYW1lcykpCi0gICAgc3ByaW50ZiAob3V0LCAiXyUwOHgiLCByZXN1bHQpOwotICBlbHNlCi0gICAgKm91dCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnKDQsICItLT4gWyVkXVwiJXNcIlxuIiwgc3RybGVuIChvdXRidWYpLCBvdXRidWYpOwotI2VuZGlmCi0KLSAgaWYgKGluX2xlbiA+IG1heGxlbgotCSYmIFBSSVYoZmxhZ19oYXNoX2xvbmdfbmFtZXMpCi0JJiYgUFJJVihmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpKQotICAgIHByaW50ZiAoXygiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iKSwgb2xkX25hbWUsIG5ld19uYW1lKTsKLQotICByZXR1cm4gb3V0YnVmOwotfQotCi0KLS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IHN5bWJvbC4gICovCi0KLXN0YXRpYyBhc3ltYm9sICoKLW5ld19zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXN5bWJvbCAqc3ltYm9sOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg3LCAgIm5ld19zeW1ib2wgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0KLSAgc3ltYm9sID0gX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3ltYm9sID09IDApCi0gICAgcmV0dXJuIHN5bWJvbDsKLSAgc3ltYm9sLT5uYW1lID0gbmFtZTsKLSAgc3ltYm9sLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgQkZEX1VORF9TRUNUSU9OX05BTUUpOwotCi0gIHJldHVybiBzeW1ib2w7Ci19Ci0KLQotLyogQWxsb2NhdGUgYW5kIGVudGVyIGEgbmV3IHByaXZhdGUgc3ltYm9sLiAgKi8KLQotdm1zX3N5bWJvbF9lbnRyeSAqCi1fYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDYsICAiX2JmZF92bXNfZW50ZXJfc3ltYm9sICVzXG4iLCBuYW1lKTsKLSNlbmRpZgotCi0gIGVudHJ5ID0gKHZtc19zeW1ib2xfZW50cnkgKikKLQkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLSAgaWYgKGVudHJ5ID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDgsICAiY3JlYXRpbmcgaGFzaCBlbnRyeSBmb3IgJXNcbiIsIG5hbWUpOwotI2VuZGlmCi0gICAgICBlbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoZW50cnkgIT0gMCkKLQl7Ci0JICBhc3ltYm9sICpzeW1ib2w7Ci0JICBzeW1ib2wgPSBuZXdfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzeW1ib2wgIT0gMCkKLQkgICAgewotCSAgICAgIGVudHJ5LT5zeW1ib2wgPSBzeW1ib2w7Ci0JICAgICAgUFJJVihnc2Rfc3ltX2NvdW50KSsrOwotCSAgICAgIGFiZmQtPnN5bWNvdW50Kys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZW50cnkgPSAwOwotCX0KLSAgICAgIGVsc2UKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oImZhaWxlZCB0byBlbnRlciAlcyIpLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICBfYmZkX3Ztc19kZWJ1ZyAoOCwgICJmb3VuZCBoYXNoIGVudHJ5IGZvciAlc1xuIiwgbmFtZSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDcsICItPiBlbnRyeSAlcCwgZW50cnktPnN5bWJvbCAlcFxuIiwgZW50cnksIGVudHJ5LT5zeW1ib2wpOwotI2VuZGlmCi0gIHJldHVybiBlbnRyeTsKLX0KZGlmZiAtLWdpdCBhL2JmZC92bXMtdGlyLmMgYi9iZmQvdm1zLXRpci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODJmNTJiLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMtdGlyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDg5ICswLDAgQEAKLS8qIHZtcy10aXIuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVElSIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKLSAgIEVUSVIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwotCi0gICBnbyBhbmQgcmVhZCB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsIChlc3AuIGFwcGVuZGl4IEIpCi0gICBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0J3MgZ29pbmcgb24gaGVyZSA6LSkKLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHlwZSBhYmJyZXZpYXRpb25zIGFyZSB1c2VkOgotCi0JY3MJY291bnRlZCBzdHJpbmcgKGFzY2lpIHN0cmluZyB3aXRoIGxlbmd0aCBieXRlKQotCWJ5CWJ5dGUgKDEgYnl0ZSkKLQlzaAlzaG9ydCAoMiBieXRlLCAxNiBiaXQpCi0JbHcJbG9uZ3dvcmQgKDQgYnl0ZSwgMzIgYml0KQotCXF3CXF1YWR3b3JkICg4IGJ5dGUsIDY0IGJpdCkKLQlkYQlkYXRhIHN0cmVhbSAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0KLSNpbmNsdWRlICJ2bXMuaCIKLQotc3RhdGljIHZvaWQgaW1hZ2Vfc2V0X3B0ciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBwc2VjdCwgdXF1YWQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV9pbmNfcHRyIFBBUkFNUyAoKGJmZCAqYWJmZCwgdXF1YWQgb2Zmc2V0KSk7Ci1zdGF0aWMgdm9pZCBpbWFnZV9kdW1wIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfYiBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfdyBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGludCB2YWx1ZSkpOwotc3RhdGljIHZvaWQgaW1hZ2Vfd3JpdGVfbCBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGxvbmcgdmFsdWUpKTsKLXN0YXRpYyB2b2lkIGltYWdlX3dyaXRlX3EgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCB2YWx1ZSkpOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotY2hlY2tfc2VjdGlvbiAoYWJmZCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IG9mZnNldDsKLQotICBvZmZzZXQgPSBQUklWKGltYWdlX3B0cikgLSBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50czsKLSAgaWYgKChvZmZzZXQgKyBzaXplKSA+IFBSSVYoaW1hZ2Vfc2VjdGlvbiktPl9yYXdfc2l6ZSkKLSAgICB7Ci0gICAgICBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyA9IGJmZF9yZWFsbG9jIChQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cywgb2Zmc2V0ICsgc2l6ZSk7Ci0gICAgICBpZiAoUFJJVihpbWFnZV9zZWN0aW9uKS0+Y29udGVudHMgPT0gMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk5vIE1lbSAhIikpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIFBSSVYoaW1hZ2Vfc2VjdGlvbiktPl9yYXdfc2l6ZSA9IG9mZnNldCArIHNpemU7Ci0gICAgICBQUklWKGltYWdlX3B0cikgPSBQUklWKGltYWdlX3NlY3Rpb24pLT5jb250ZW50cyArIG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHJvdXRpbmVzIHRvIGZpbGwgc2VjdGlvbnMgY29udGVudHMgZHVyaW5nIHRpci9ldGlyIHJlYWQgKi8KLQotLyogSW5pdGlhbGl6ZSBpbWFnZSBidWZmZXIgcG9pbnRlciB0byBiZSBmaWxsZWQgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgb2Zmc2V0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBwc2VjdDsKLSAgICAgdXF1YWQgb2Zmc2V0OwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNCwgImltYWdlX3NldF9wdHIgKCVkPSVzLCAlZClcbiIsCi0JCXBzZWN0LCBQUklWKHNlY3Rpb25zKVtwc2VjdF0tPm5hbWUsIG9mZnNldCk7Ci0jZW5kaWYKLQotICBQUklWKGltYWdlX3B0cikgPSBQUklWKHNlY3Rpb25zKVtwc2VjdF0tPmNvbnRlbnRzICsgb2Zmc2V0OwotICBQUklWKGltYWdlX3NlY3Rpb24pID0gUFJJVihzZWN0aW9ucylbcHNlY3RdOwotICByZXR1cm47Ci19Ci0KLQotLyogSW5jcmVtZW50IGltYWdlIGJ1ZmZlciBwb2ludGVyIGJ5IG9mZnNldCAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX2luY19wdHIgKGFiZmQsIG9mZnNldCkKLSAgICAgYmZkICphYmZkOwotICAgICB1cXVhZCBvZmZzZXQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiaW1hZ2VfaW5jX3B0ciAoJWQpXG4iLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgUFJJVihpbWFnZV9wdHIpICs9IG9mZnNldDsKLQotICByZXR1cm47Ci19Ci0KLQotLyogRHVtcCBtdWx0aXBsZSBieXRlcyB0byBzZWN0aW9uIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBzaXplLCBvZmZzZXQpCi0gICAgYmZkICphYmZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICBpbnQgc2l6ZTsKLSAgICBpbnQgb2Zmc2V0OwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoOCwgImltYWdlX2R1bXAgZnJvbSAoJXAsICVkKSB0byAoJXApXG4iLCBwdHIsIHNpemUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIF9iZmRfaGV4ZHVtcCAoOSwgcHRyLCBzaXplLCBvZmZzZXQpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCBzaXplKSkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUgKHNpemUtLSA+IDApCi0gICAgKlBSSVYoaW1hZ2VfcHRyKSsrID0gKnB0cisrOwotICByZXR1cm47Ci19Ci0KLQotLyogV3JpdGUgYnl0ZSB0byBzZWN0aW9uIGltYWdlICAqLwotCi1zdGF0aWMgdm9pZAotaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgdmFsdWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgaW50IHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX2IoJTAyeClcbiIsIChpbnQpdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCAxKSkKLSAgICByZXR1cm47Ci0KLSAgKlBSSVYoaW1hZ2VfcHRyKSsrID0gKHZhbHVlICYgMHhmZik7Ci0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSAyLWJ5dGUgd29yZCB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX3cgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDYsICJpbWFnZV93cml0ZV93KCUwNHgpXG4iLCAoaW50KXZhbHVlKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKGlzX3ZheCkgJiYgY2hlY2tfc2VjdGlvbiAoYWJmZCwgMikpCi0gICAgcmV0dXJuOwotCi0gIGJmZF9wdXRsMTYgKHZhbHVlLCBQUklWKGltYWdlX3B0cikpOwotICBQUklWKGltYWdlX3B0cikgKz0gMjsKLQotICByZXR1cm47Ci19Ci0KLQotLyogV3JpdGUgNC1ieXRlIGxvbmcgdG8gaW1hZ2UgICovCi0KLXN0YXRpYyB2b2lkCi1pbWFnZV93cml0ZV9sIChhYmZkLCB2YWx1ZSkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX2wgKCUwOGx4KVxuIiwgdmFsdWUpOwotI2VuZGlmCi0KLSAgaWYgKFBSSVYoaXNfdmF4KSAmJiBjaGVja19zZWN0aW9uIChhYmZkLCA0KSkKLSAgICByZXR1cm47Ci0KLSAgYmZkX3B1dGwzMiAodmFsdWUsIFBSSVYoaW1hZ2VfcHRyKSk7Ci0gIFBSSVYoaW1hZ2VfcHRyKSArPSA0OwotCi0gIHJldHVybjsKLX0KLQotCi0vKiBXcml0ZSA4LWJ5dGUgcXVhZCB0byBpbWFnZSAgKi8KLQotc3RhdGljIHZvaWQKLWltYWdlX3dyaXRlX3EgKGFiZmQsIHZhbHVlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHVxdWFkIHZhbHVlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNiwgImltYWdlX3dyaXRlX3EgKCUwMTZseClcbiIsIHZhbHVlKTsKLSNlbmRpZgotCi0gIGlmIChQUklWKGlzX3ZheCkgJiYgY2hlY2tfc2VjdGlvbiAoYWJmZCwgOCkpCi0gICAgcmV0dXJuOwotCi0gIGJmZF9wdXRsNjQgKHZhbHVlLCBQUklWKGltYWdlX3B0cikpOwotICBQUklWKGltYWdlX3B0cikgKz0gODsKLQotICByZXR1cm47Ci19Ci0MCi0KLSNkZWZpbmUgSElHSEJJVChvcCkgKChvcCAmIDB4ODAwMDAwMDBMKSA9PSAweDgwMDAwMDAwTCkKLQotLyogZXRpcl9zdGEKLSAgCi0gICB2bXMgc3RhY2sgY29tbWFuZHMKLSAgCi0gICBoYW5kbGUgc3RhX3h4eCBjb21tYW5kcyBpbiBldGlyIHNlY3Rpb24KLSAgIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICAKLSAgIHNlZSB0YWJsZSBCLTggb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RhIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YSAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIHN0YWNrICovCi0KLSAgICAgIC8qIHN0YWNrIGdsb2JhbAotCSAgIGFyZzogY3MJc3ltYm9sIG5hbWUKLQotCSAgIHN0YWNrIDMyIGJpdCB2YWx1ZSBvZiBzeW1ib2wgKGhpZ2ggYml0cyBzZXQgdG8gMCkgICovCi0KLSAgICAgIGNhc2UgRVRJUl9TX0NfU1RBX0dCTDoKLQl7Ci0JICBjaGFyICpuYW1lOwotCSAgdm1zX3N5bWJvbF9lbnRyeSAqZW50cnk7Ci0KLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKQotCQkgIGJmZF9oYXNoX2xvb2t1cCAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoMywgIkVUSVJfU19DX1NUQV9HQkw6IG5vIHN5bWJvbCBcIiVzXCJcbiIsIG5hbWUpOwotI2VuZGlmCi0JICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKTAsIC0xKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSksIC0xKTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0JLyogc3RhY2sgbG9uZ3dvcmQKLQkgICBhcmc6IGx3CXZhbHVlCi0KLQkgICBzdGFjayAzMiBiaXQgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDY0IGJpdCAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfTFc6Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKWJmZF9nZXRsMzIgKHB0ciksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0JLyogc3RhY2sgZ2xvYmFsCi0JICAgYXJnOiBxdwl2YWx1ZQotCi0JICAgc3RhY2sgNjQgYml0IHZhbHVlIG9mIHN5bWJvbAkgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfUVc6Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKWJmZF9nZXRsNjQocHRyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLQkvKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0Ci0JICAgYXJnOiBsdwlzZWN0aW9uIGluZGV4Ci0JICAJcXcJc2lnbmVkIHF1YWR3b3JkIG9mZnNldCAobG93IDMyIGJpdHMpCi0KLQkgICBzdGFjayBxdyBhcmd1bWVudCBhbmQgc2VjdGlvbiBpbmRleAotCSAgIChzZWUgRVRJUl9TX0NfU1RPX09GRiwgRVRJUl9TX0NfQ1RMX1NFVFJCKSAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfUFE6Ci0gIAl7Ci0JICB1cXVhZCBkdW1teTsKLQkgIGludCBwc2VjdDsKLQotCSAgcHNlY3QgPSBiZmRfZ2V0bDMyIChwdHIpOwotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkJhZCBzZWN0aW9uIGluZGV4IGluIEVUSVJfU19DX1NUQV9QUSIpKTsKLQkgICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGR1bW15ID0gYmZkX2dldGw2NCAocHRyKzQpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQkvKiBhbGwgbm90IHN1cHBvcnRlZCAgKi8KLQotICAgICAgY2FzZSBFVElSX1NfQ19TVEFfTEk6Ci0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9NT0Q6Ci0gICAgICBjYXNlIEVUSVJfU19DX1NUQV9DS0FSRzoKLQotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5zdXBwb3J0ZWQgU1RBIGNtZCAlZCIpLCBjbWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RBIGNtZCAlZCIpLCBjbWQpOwotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0YSB0cnVlXG4iKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKgotICAgZXRpcl9zdG8KLSAgCi0gICB2bXMgc3RvcmUgY29tbWFuZHMKLSAgCi0gICBoYW5kbGUgc3RvX3h4eCBjb21tYW5kcyBpbiBldGlyIHNlY3Rpb24KLSAgIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICAKLSAgIHNlZSB0YWJsZSBCLTkgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfc3RvIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIHVxdWFkIGR1bW15OwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX3N0byAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLQotICAgICAgLyogc3RvcmUgYnl0ZTogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0I6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSNpZiAwCi0gICAgICBpZiAoaXNfc2hhcmUpCQkvKiBGSVhNRSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoIkVUSVJfU19DX1NUT19COiBieXRlIGZpeHVwcyBub3Qgc3VwcG9ydGVkIik7Ci0jZW5kaWYKLSAgICAgIGltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIHdvcmQ6IHBvcCBzdGFjaywgd3JpdGUgd29yZAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19XOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0jaWYgMAotICAgICAgaWYgKGlzX3NoYXJlKQkJLyogRklYTUUgKi8KLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJFVElSX1NfQ19TVE9fQjogd29yZCBmaXh1cHMgbm90IHN1cHBvcnRlZCIpOwotI2VuZGlmCi0gICAgICBpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGxvbmd3b3JkOiBwb3Agc3RhY2ssIHdyaXRlIGxvbmd3b3JkCi0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0xXOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotICAgICAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdG9yZSBxdWFkd29yZDogcG9wIHN0YWNrLCB3cml0ZSBxdWFkd29yZAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19RVzoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLSAgICAgIGltYWdlX3dyaXRlX3EgKGFiZmQsIGR1bW15KTsJCS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGltbWVkaWF0ZSByZXBlYXRlZDogcG9wIHN0YWNrIGZvciByZXBlYXQgY291bnQKLQkgYXJnOiBsdwlieXRlIGNvdW50Ci0JIGRhCWRhdGEgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19JTU1SOgotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCXNpemUgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoZHVtbXktLSA+IDBMKQotCSAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyKzQsIHNpemUsIDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGdsb2JhbDogd3JpdGUgc3ltYm9sIHZhbHVlCi0JIGFyZzogY3MJZ2xvYmFsIHN5bWJvbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fR0JMOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCWlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICB7Ci0JICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0dCTDogbm8gc3ltYm9sIFwiJXNcIiIpLAotCQkJCSAgIG5hbWUpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgaW1hZ2Vfd3JpdGVfcSAoYWJmZCwgKHVxdWFkKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBzdG9yZSBjb2RlIGFkZHJlc3M6IHdyaXRlIGFkZHJlc3Mgb2YgZW50cnkgcG9pbnQKLQkgYXJnOiBjcwlnbG9iYWwgc3ltYm9sIG5hbWUgKHByb2NlZHVyZSkgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19DQToKLSAgICAgIHsKLQl2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQljaGFyICpuYW1lOwotCi0JbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0JZW50cnkgPSAodm1zX3N5bWJvbF9lbnRyeSAqKSBiZmRfaGFzaF9sb29rdXAgKFBSSVYodm1zX3N5bWJvbF90YWJsZSksIG5hbWUsIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgIHsKLQkgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fQ0E6IG5vIHN5bWJvbCBcIiVzXCIiKSwKLQkJCQkgICBuYW1lKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCWVsc2UKLQkgIGltYWdlX3dyaXRlX3EgKGFiZmQsICh1cXVhZCkoZW50cnktPnN5bWJvbC0+dmFsdWUpKTsJLyogRklYTUUsIHJlbG9jICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbm90IHN1cHBvcnRlZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX1JCOgotICAgIGNhc2UgRVRJUl9TX0NfU1RPX0FCOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fUkIvQUI6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIC8qIHN0b3JlIG9mZnNldCB0byBwc2VjdDogcG9wIHN0YWNrLCBhZGQgbG93IDMyIGJpdHMgdG8gYmFzZSBvZiBwc2VjdAotICAgICAgIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RPX09GRjoKLSAgICAgIHsKLQl1cXVhZCBxOwotCWludCBwc2VjdDsKLQotCXEgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JcSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCWltYWdlX3dyaXRlX3EgKGFiZmQsIHEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0b3JlIGltbWVkaWF0ZQotCSBhcmc6IGx3CWNvdW50IG9mIGJ5dGVzCi0JIGRhCWRhdGEgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUT19JTU06Ci0gICAgICB7Ci0JaW50IHNpemU7Ci0KLQlzaXplID0gYmZkX2dldGwzMiAocHRyKTsKLQlpbWFnZV9kdW1wIChhYmZkLCBwdHIrNCwgc2l6ZSwgMCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogdGhpcyBjb2RlIGlzICdyZXNlcnZlZCB0byBkaWdpdGFsJyBhY2NvcmRpbmcgdG8gdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCwKLQkgaG93ZXZlciBpdCBpcyBnZW5lcmF0ZWQgYnkgdGhlIERFQyBDIGNvbXBpbGVyIGFuZCBkZWZpbmVkIGluIHRoZSBpbmNsdWRlIGZpbGUuCi0JIEZJWE1FLCBzaW5jZSB0aGUgZm9sbG93aW5nIGlzIGp1c3QgYSBndWVzcwotCSBzdG9yZSBnbG9iYWwgbG9uZ3dvcmQ6IHN0b3JlIDMyYml0IHZhbHVlIG9mIHN5bWJvbAotCSBhcmc6IGNzCXN5bWJvbCBuYW1lICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fR0JMX0xXOgotICAgICAgewotCXZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCWNoYXIgKm5hbWU7Ci0KLQluYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQllbnRyeSA9ICh2bXNfc3ltYm9sX2VudHJ5ICopYmZkX2hhc2hfbG9va3VwIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCWlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICB7Ci0jaWYgVk1TX0RFQlVHCi0JICAgIF9iZmRfdm1zX2RlYnVnICgzLCAiRVRJUl9TX0NfU1RPX0dCTF9MVzogbm8gc3ltYm9sIFwiJXNcIlxuIiwgbmFtZSk7Ci0jZW5kaWYKLQkgICAgaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpMCk7CS8qIEZJWE1FLCByZWxvYyAqLwotCSAgfQotCWVsc2UKLQkgIGltYWdlX3dyaXRlX2wgKGFiZmQsICh1bnNpZ25lZCBsb25nKShlbnRyeS0+c3ltYm9sLT52YWx1ZSkpOwkvKiBGSVhNRSwgcmVsb2MgKi8KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBub3Qgc3VwcG9ydGVkICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fTFBfUFNCOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19TVE9fTFBfUFNCOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fSElOVF9HQkw6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUT19ISU5UX0dCTDogbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVE9fSElOVF9QUzoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RPX0hJTlRfUFM6IG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIpLCBjbWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBzdGFjayBvcGVyYXRvciBjb21tYW5kcwotICAgYWxsIDMyIGJpdCBzaWduZWQgYXJpdGhtZXRpYwotICAgYWxsIHdvcmQganVzdCBsaWtlIGEgc3RhY2sgY2FsY3VsYXRvcgotICAgYXJndW1lbnRzIGFyZSBwb3BwZWQgZnJvbSBzdGFjaywgcmVzdWx0cyBhcmUgcHVzaGVkIG9uIHN0YWNrCi0gIAotICAgc2VlIHRhYmxlIEItMTAgb2YgdGhlIG9wZW5WTVMgbGlua2VyIG1hbnVhbCAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWV0aXJfb3ByIChhYmZkLCBjbWQsIHB0cikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgY21kOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci17Ci0gIGxvbmcgb3AxLCBvcDI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJldGlyX29wciAlZC8leFxuIiwgY21kLCBjbWQpOwotICBfYmZkX2hleGR1bXAgKDgsIHB0ciwgMTYsIChpbnQpcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgICAgIC8qIG9wZXJhdGlvbiAqLwotCi0gICAgICAvKiBuby1vcCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX05PUDoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBhZGQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9BREQ6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxICsgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN1YnRyYWN0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfU1VCOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMiAtIG9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBtdWx0aXBseSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX01VTDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgKiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZGl2aWRlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfRElWOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBpZiAob3AyID09IDApCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKTBMLCAtMSk7Ci0gICAgICBlbHNlCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDIgLyBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbG9naWNhbCBhbmQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9BTkQ6Ci0gICAgICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxICYgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGxvZ2ljYWwgaW5jbHVzaXZlIG9yCSAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfSU9SOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIG9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpKG9wMSB8IG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBsb2dpY2FsIGV4Y2x1c2l2ZSBvciAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0VPUjoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVxdWFkKShvcDEgXiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogbmVnYXRlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfTkVHOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkoLW9wMSksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBjb21wbGVtZW50ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfQ09NOgotICAgICAgb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZCkob3AxIF4gLTFMKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGluc2VydCBmaWVsZCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0lOU1Y6Ci0gICAgICAodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfSU5TVjogTm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogYXJpdGhtZXRpYyBzaGlmdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX0FTSDoKLSAgICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0gICAgICBvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotICAgICAgaWYgKG9wMiA8IDApCQkvKiBzaGlmdCByaWdodCAqLwotCW9wMSA+Pj0gLW9wMjsKLSAgICAgIGVsc2UJCQkvKiBzaGlmdCBsZWZ0ICovCi0Jb3AxIDw8PSBvcDI7Ci0gICAgICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodXF1YWQpb3AxLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogdW5zaWduZWQgc2hpZnQgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9VU0g6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX09QUl9VU0g6IE5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogcm90YXRlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19PUFJfUk9UOgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJFVElSX1NfQ19PUFJfUk9UOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHNlbGVjdCAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfT1BSX1NFTDoKLSAgICAgIGlmICgobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpICYgMHgwMUwpCi0JKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1cXVhZClvcDEsIC0xKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogcmVkZWZpbmUgc3ltYm9sIHRvIGN1cnJlbnQgbG9jYXRpb24gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9SRURFRjoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX1JFREVGOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGRlZmluZSBhIGxpdGVyYWwgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX09QUl9ERkxJVDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfT1BSX0RGTElUOiBOb3Qgc3VwcG9ydGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBPUFIgY21kICVkIiksIGNtZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogY29udHJvbCBjb21tYW5kcwotICAKLSAgIHNlZSB0YWJsZSBCLTExIG9mIHRoZSBvcGVuVk1TIGxpbmtlciBtYW51YWwgICovCi0KLXN0YXRpYyBib29sZWFuCi1ldGlyX2N0bCAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICB1cXVhZAkgZHVtbXk7Ci0gIGludCBwc2VjdDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfY3RsICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogc2V0IHJlbG9jYXRpb24gYmFzZTogcG9wIHN0YWNrLCBzZXQgaW1hZ2UgbG9jYXRpb24gY291bnRlcgotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9TRVRSQjoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotICAgICAgaW1hZ2Vfc2V0X3B0ciAoYWJmZCwgcHNlY3QsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBhdWdtZW50IHJlbG9jYXRpb24gYmFzZTogaW5jcmVtZW50IGltYWdlIGxvY2F0aW9uIGNvdW50ZXIgYnkgb2Zmc2V0Ci0JIGFyZzogbHcJb2Zmc2V0IHZhbHVlICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfQVVHUkI6Ci0gICAgICBkdW1teSA9IGJmZF9nZXRsMzIgKHB0cik7Ci0gICAgICBpbWFnZV9pbmNfcHRyIChhYmZkLCBkdW1teSk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogZGVmaW5lIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHNhdmUgbG9jYXRpb24gY291bnRlciB1bmRlciBpbmRleAotCSBhcmc6IC0gICovCi0KLSAgICBjYXNlIEVUSVJfU19DX0NUTF9ERkxPQzoKLSAgICAgIGR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBicmVhazsKLQotICAgICAgLyogc2V0IGxvY2F0aW9uOiBwb3AgaW5kZXgsIHJlc3RvcmUgbG9jYXRpb24gY291bnRlciBmcm9tIGluZGV4Ci0JIGFyZzogLSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfQ1RMX1NUTE9DOgotICAgICAgZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIHN0YWNrIGRlZmluZWQgbG9jYXRpb246IHBvcCBpbmRleCwgcHVzaCBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgYXJnOiAtICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19DVExfU1RLREw6Ci0gICAgICBkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIENUTCBjbWQgJWQiKSwgY21kKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogc3RvcmUgY29uZGl0aW9uYWwgY29tbWFuZHMKLSAgCi0gICBzZWUgdGFibGUgQi0xMiBhbmQgQi0xMyBvZiB0aGUgb3BlblZNUyBsaW5rZXIgbWFudWFsICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZXRpcl9zdGMgKGFiZmQsIGNtZCwgcHRyKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBjbWQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLXsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoNSwgImV0aXJfc3RjICVkLyV4XG4iLCBjbWQsIGNtZCk7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjbWQpCi0gICAgewotICAgICAgLyogMjAwIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpcgotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfTFA6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19MUDogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDEgU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZQotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgY3MJcHJvY2VkdXJlIG5hbWUKLQkgYnkJc2lnbmF0dXJlIGxlbmd0aAotCSBkYQlzaWduYXR1cmUgICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19MUF9QU0I6Ci0gICAgICBpbWFnZV9pbmNfcHRyIChhYmZkLCAxNik7CS8qIHNraXAgZW50cnkscHJvY3ZhbCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIDIwMiBTdG9yZS1jb25kaXRpb25hbCBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlnbG9iYWwgbmFtZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0dCTDoKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0dCTDogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDMgU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzoJbHcJbGlua2FnZSBpbmRleAotCSBjcwlwcm9jZWR1cmUgbmFtZSAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0dDQToKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiRVRJUl9TX0NfU1RDX0dDQTogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDQgU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBwc2VjdCArIG9mZnNldAotCSBhcmc6CWx3CWxpbmthZ2UgaW5kZXgKLQkgbHcJcHNlY3QgaW5kZXgKLQkgcXcJb2Zmc2V0ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfUFM6Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIkVUSVJfU19DX1NUQ19QUzogbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAyMDUgU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IGFkZHJlc3Mgb2YgZ2xvYmFsCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OT1BfR0JMOgotCi0gICAgICAvKiAyMDYgU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX05PUF9QUzoKLQotICAgICAgLyogMjA3IFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcwotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQlNSX0dCTDoKLQotICAgICAgLyogMjA4IFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBwZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CU1JfUFM6Ci0KLSAgICAgIC8qIDIwOSBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgZ2xvYmFsIGFkZHJlc3MKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xEQV9HQkw6Ci0KLSAgICAgIC8qIDIxMCBTdG9yZS1jb25kaXRpb25hbCBMREEgYXQgcHNlY3QgKyBvZmZzZXQKLQkgYXJnOiAgKi8KLQotICAgIGNhc2UgRVRJUl9TX0NfU1RDX0xEQV9QUzoKLQotICAgICAgLyogMjExIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBvciBIaW50IGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19CT0hfR0JMOgotCi0gICAgICAvKiAyMTIgU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldAotCSBhcmc6ICAqLwotCi0gICAgY2FzZSBFVElSX1NfQ19TVENfQk9IX1BTOgotCi0gICAgICAvKiAyMTMgU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzCi0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OQkhfR0JMOgotCi0gICAgICAvKiAyMTQgU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IHBzZWN0ICsgb2Zmc2V0Ci0JIGFyZzogICovCi0KLSAgICBjYXNlIEVUSVJfU19DX1NUQ19OQkhfUFM6Ci0vKiBGSVhNRSAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpICgiRVRJUl9TX0NfU1RDX3h4OiAoJWQpIG5vdCBzdXBwb3J0ZWQiLCBjbWQpOyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDMsICAiUmVzZXJ2ZWQgU1RDIGNtZCAlZCIsIGNtZCk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotc3RhdGljIGFzZWN0aW9uICoKLW5ld19zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGlkeDsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGNoYXIgc25hbWVbMTZdOwotICBjaGFyICpuYW1lOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAgIm5ld19zZWN0aW9uICVkXG4iLCBpZHgpOwotI2VuZGlmCi0gIHNwcmludGYgKHNuYW1lLCBTRUNUSU9OX05BTUVfVEVNUExBVEUsIGlkeCk7Ci0KLSAgbmFtZSA9IGJmZF9tYWxsb2MgKHN0cmxlbiAoc25hbWUpICsgMSk7Ci0gIGlmIChuYW1lID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIHN0cmNweSAobmFtZSwgc25hbWUpOwotCi0gIHNlY3Rpb24gPSBiZmRfbWFsbG9jIChzaXplb2YgKGFzZWN0aW9uKSk7Ci0gIGlmIChzZWN0aW9uID09IDApCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgX2JmZF92bXNfZGVidWcgKDYsICAiYmZkX21ha2Vfc2VjdGlvbiAoJXMpIGZhaWxlZCIsIG5hbWUpOwotI2VuZGlmCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgc2VjdGlvbi0+X3Jhd19zaXplID0gMDsKLSAgc2VjdGlvbi0+dm1hID0gMDsKLSAgc2VjdGlvbi0+Y29udGVudHMgPSAwOwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSAwOwotICBzZWN0aW9uLT5uYW1lID0gbmFtZTsKLSAgc2VjdGlvbi0+aW5kZXggPSBpZHg7Ci0KLSAgcmV0dXJuIHNlY3Rpb247Ci19Ci0KLQotc3RhdGljIGludAotYWxsb2Nfc2VjdGlvbiAoYWJmZCwgaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBpZHg7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAgImFsbG9jX3NlY3Rpb24gJWRcbiIsIGlkeCk7Ci0jZW5kaWYKLQotICBQUklWKHNlY3Rpb25zKSA9ICgoYXNlY3Rpb24gKiopCi0JCSAgICBiZmRfcmVhbGxvYyAoUFJJVihzZWN0aW9ucyksIChpZHgrMSkgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gIGlmIChQUklWKHNlY3Rpb25zKSA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoUFJJVihzZWN0aW9uX2NvdW50KSA8PSBpZHgpCi0gICAgewotICAgICAgUFJJVihzZWN0aW9ucylbUFJJVihzZWN0aW9uX2NvdW50KV0gPSBuZXdfc2VjdGlvbiAoYWJmZCwgUFJJVihzZWN0aW9uX2NvdW50KSk7Ci0gICAgICBpZiAoUFJJVihzZWN0aW9ucylbUFJJVihzZWN0aW9uX2NvdW50KV0gPT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgICBQUklWKHNlY3Rpb25fY291bnQpKys7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiB0aXJfc3RhCi0gKgotICogdmF4IHN0YWNrIGNvbW1hbmRzCi0gKgotICogaGFuZGxlIHN0YV94eHggY29tbWFuZHMgaW4gdGlyIHNlY3Rpb24KLSAqIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICoKLSAqIHNlZSB0YWJsZSA3LTMgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9zdGEgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBpbnQgY21kID0gKnB0cisrOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX3N0YSAlZFxuIiwgY21kKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoY21kKQotICAgIHsKLSAgLyogc3RhY2sgKi8KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfR0JMOgotCS8qCi0JICogc3RhY2sgZ2xvYmFsCi0JICogYXJnOiBjcwlzeW1ib2wgbmFtZQotCSAqCi0JICogc3RhY2sgMzIgYml0IHZhbHVlIG9mIHN5bWJvbCAoaGlnaCBiaXRzIHNldCB0byAwKQotCSAqLwotCXsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHB0cik7Ci0KLSAgICAgICAgICBlbnRyeSA9IF9iZmRfdm1zX2VudGVyX3N5bWJvbCAoYWJmZCwgbmFtZSk7Ci0JICBpZiAoZW50cnkgPT0gKHZtc19zeW1ib2xfZW50cnkgKilOVUxMKQotCSAgICByZXR1cm4gMDsKLQotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKGVudHJ5LT5zeW1ib2wtPnZhbHVlKSwgLTEpOwotCSAgcHRyICs9ICpwdHIgKyAxOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1NCOgotCS8qCi0JICogc3RhY2sgc2lnbmVkIGJ5dGUKLQkgKiBhcmc6IGJ5CXZhbHVlCi0JICoKLQkgKiBzdGFjayBieXRlIHZhbHVlLCBzaWduIGV4dGVuZCB0byAzMiBiaXQKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAobG9uZykqcHRyKyssIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1NXOgotCS8qCi0JICogc3RhY2sgc2lnbmVkIHNob3J0IHdvcmQKLQkgKiBhcmc6IHNoCXZhbHVlCi0JICoKLQkgKiBzdGFjayAxNiBiaXQgdmFsdWUsIHNpZ24gZXh0ZW5kIHRvIDMyIGJpdAotCSAqLwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIChsb25nKWJmZF9nZXRsMTYocHRyKSwgLTEpOwotCXB0ciArPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTFc6Ci0JLyoKLQkgKiBzdGFjayBzaWduZWQgbG9uZ3dvcmQKLQkgKiBhcmc6IGx3CXZhbHVlCi0JICoKLQkgKiBzdGFjayAzMiBiaXQgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAobG9uZyliZmRfZ2V0bDMyIChwdHIpLCAtMSk7Ci0JcHRyICs9IDQ7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9QQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfV1BCOgotCS8qCi0JICogc3RhY2sgcHNlY3QgYmFzZSBwbHVzIGJ5dGUgb2Zmc2V0ICh3b3JkIGluZGV4KQotCSAqIGFyZzogYnkJc2VjdGlvbiBpbmRleAotCSAqCShzaAlzZWN0aW9uIGluZGV4KQotCSAqCWJ5CXNpZ25lZCBieXRlIG9mZnNldAotCSAqCi0JICovCi0gIAl7Ci0JICB1bnNpZ25lZCBsb25nIGR1bW15OwotCSAgaW50IHBzZWN0OwotCi0JICBpZiAoY21kID09IFRJUl9TX0NfU1RBX1BCKQotCSAgICBwc2VjdCA9ICpwdHIrKzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBzZWN0ID0gYmZkX2dldGwxNihwdHIpOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0KLQkgIGlmIChwc2VjdCA+PSBQUklWKHNlY3Rpb25fY291bnQpKQotCSAgICB7Ci0JICAgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgICB9Ci0KLQkgIGR1bW15ID0gKGxvbmcpKnB0cisrOwotCSAgZHVtbXkgKz0gKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIGR1bW15LCBwc2VjdCk7Ci0gICAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1BXOgotICAgICAgY2FzZSBUSVJfU19DX1NUQV9XUFc6Ci0JLyoKLQkgKiBzdGFjayBwc2VjdCBiYXNlIHBsdXMgd29yZCBvZmZzZXQgKHdvcmQgaW5kZXgpCi0JICogYXJnOiBieQlzZWN0aW9uIGluZGV4Ci0JICoJKHNoCXNlY3Rpb24gaW5kZXgpCi0JICoJc2gJc2lnbmVkIHNob3J0IG9mZnNldAotCSAqCi0JICovCi0gIAl7Ci0JICB1bnNpZ25lZCBsb25nIGR1bW15OwotCSAgaW50IHBzZWN0OwotCi0JICBpZiAoY21kID09IFRJUl9TX0NfU1RBX1BXKQotCSAgICBwc2VjdCA9ICpwdHIrKzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBzZWN0ID0gYmZkX2dldGwxNihwdHIpOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0KLQkgIGlmIChwc2VjdCA+PSBQUklWKHNlY3Rpb25fY291bnQpKQotCSAgICB7Ci0JICAgICAgYWxsb2Nfc2VjdGlvbiAoYWJmZCwgcHNlY3QpOwotCSAgICB9Ci0KLQkgIGR1bW15ID0gYmZkX2dldGwxNihwdHIpOyBwdHIrPTI7Ci0JICBkdW1teSArPSAoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgZHVtbXksIHBzZWN0KTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfUEw6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dQTDoKLQkvKgotCSAqIHN0YWNrIHBzZWN0IGJhc2UgcGx1cyBsb25nIG9mZnNldCAod29yZCBpbmRleCkKLQkgKiBhcmc6IGJ5CXNlY3Rpb24gaW5kZXgKLQkgKgkoc2gJc2VjdGlvbiBpbmRleCkKLQkgKglsdwlzaWduZWQgbG9uZ3dvcmQgb2Zmc2V0Ci0JICoKLQkgKi8KLSAgCXsKLQkgIHVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JICBpbnQgcHNlY3Q7Ci0KLQkgIGlmIChjbWQgPT0gVElSX1NfQ19TVEFfUEwpCi0JICAgIHBzZWN0ID0gKnB0cisrOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHNlY3QgPSBiZmRfZ2V0bDE2KHB0cik7Ci0JICAgICAgcHRyICs9IDI7Ci0JICAgIH0KLQotCSAgaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICAgIHsKLQkgICAgICBhbGxvY19zZWN0aW9uIChhYmZkLCBwc2VjdCk7Ci0JICAgIH0KLQotCSAgZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOyBwdHIgKz0gNDsKLQkgIGR1bW15ICs9IChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWE7Ci0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCBkdW1teSwgcHNlY3QpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9VQjoKLQkvKgotCSAqIHN0YWNrIHVuc2lnbmVkIGJ5dGUKLQkgKiBhcmc6IGJ5CXZhbHVlCi0JICoKLQkgKiBzdGFjayBieXRlIHZhbHVlCi0JICovCi0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKnB0cisrLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9VVzoKLQkvKgotCSAqIHN0YWNrIHVuc2lnbmVkIHNob3J0IHdvcmQKLQkgKiBhcmc6IHNoCXZhbHVlCi0JICoKLQkgKiBzdGFjayAxNiBiaXQgdmFsdWUKLQkgKi8KLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZyliZmRfZ2V0bDE2KHB0ciksIC0xKTsKLQlwdHIgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0JGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0JLypGQUxMVEhSVSovCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX1dGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0JLypGQUxMVEhSVSovCi0gICAgICBjYXNlIFRJUl9TX0NfU1RBX0xGSToKLQkvKgotCSAqIHN0YWNrIGJ5dGUgZnJvbSBpbWFnZQotCSAqIGFyZzogLQotCSAqCi0JICovCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU3RhY2stZnJvbS1pbWFnZSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0JcmV0dXJuIE5VTEw7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfRVBNOgotCS8qCi0JICogc3RhY2sgZW50cnkgcG9pbnQgbWFzawotCSAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLQkgKgotCSAqIHN0YWNrICh1bnNpZ25lZCkgZW50cnkgcG9pbnQgbWFzayBvZiBzeW1ib2wKLQkgKiBlcnIgaWYgc3ltYm9sIGlzIG5vIGVudHJ5IHBvaW50Ci0JICovCi0JewotCSAgY2hhciAqbmFtZTsKLQkgIHZtc19zeW1ib2xfZW50cnkgKmVudHJ5OwotCi0JICBuYW1lID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKLQkgIGVudHJ5ID0gX2JmZF92bXNfZW50ZXJfc3ltYm9sIChhYmZkLCBuYW1lKTsKLQkgIGlmIChlbnRyeSA9PSAodm1zX3N5bWJvbF9lbnRyeSAqKU5VTEwpCi0JICAgIHJldHVybiAwOwotCi0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1lbnRyeS1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfQ0tBUkc6Ci0JLyoKLQkgKiBjb21wYXJlIHByb2NlZHVyZSBhcmd1bWVudAotCSAqIGFyZzogY3MJc3ltYm9sIG5hbWUKLQkgKglieQlhcmd1bWVudCBpbmRleAotCSAqCWRhCWFyZ3VtZW50IGRlc2NyaXB0b3IKLQkgKgotCSAqIGNvbXBhcmUgYXJndW1lbnQgZGVzY3JpcHRvciB3aXRoIHN5bWJvbCBhcmd1bWVudCAoQVJHJFZfUEFTU01FQ0gpCi0JICogYW5kIHN0YWNrIFRSVUUgKGFyZ3MgbWF0Y2gpIG9yIEZBTFNFIChhcmdzIGRvbnQgbWF0Y2gpIHZhbHVlCi0JICovCi0gICAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUEFTU01FQ0ggbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIDFMLCAtMSk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVEFfTFNZOgotCS8qCi0JICogc3RhY2sgbG9jYWwgc3ltYm9sIHZhbHVlCi0JICogYXJnOglzaAllbnZpcm9ubWVudCBpbmRleAotCSAqCWNzCXN5bWJvbCBuYW1lCi0JICovCi0JewotCSAgaW50IGVudmlkeDsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgZW52aWR4ID0gYmZkX2dldGwxNihwdHIpOyBwdHIgKz0gMjsKLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1sb2NhbC1zeW1ib2wgbm90IGZ1bGx5IGltcGxlbWVudGVkIikpOwotCSAgX2JmZF92bXNfcHVzaCAoYWJmZCwgMEwsIC0xKTsKLQkgIHB0ciArPSAqcHRyICsgMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MSVQ6Ci0JLyoKLQkgKiBzdGFjayBsaXRlcmFsCi0gCSAqIGFyZzoJYnkJbGl0ZXJhbCBpbmRleAotCSAqCi0JICogc3RhY2sgbGl0ZXJhbAotCSAqLwotCXB0cisrOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJTdGFjay1saXRlcmFsIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQlicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX1NUQV9MRVBNOgotCS8qCi0JICogc3RhY2sgbG9jYWwgc3ltYm9sIGVudHJ5IHBvaW50IG1hc2sKLQkgKiBhcmc6CXNoCWVudmlyb25tZW50IGluZGV4Ci0JICoJY3MJc3ltYm9sIG5hbWUKLQkgKgotCSAqIHN0YWNrICh1bnNpZ25lZCkgZW50cnkgcG9pbnQgbWFzayBvZiBzeW1ib2wKLQkgKiBlcnIgaWYgc3ltYm9sIGlzIG5vIGVudHJ5IHBvaW50Ci0JICovCi0JewotCSAgaW50IGVudmlkeDsKLQkgIGNoYXIgKm5hbWU7Ci0JICB2bXNfc3ltYm9sX2VudHJ5ICplbnRyeTsKLQotCSAgZW52aWR4ID0gYmZkX2dldGwxNihwdHIpOyBwdHIgKz0gMjsKLQkgIG5hbWUgPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwotCSAgZW50cnkgPSBfYmZkX3Ztc19lbnRlcl9zeW1ib2wgKGFiZmQsIG5hbWUpOwotCSAgaWYgKGVudHJ5ID09ICh2bXNfc3ltYm9sX2VudHJ5ICopTlVMTCkKLQkgICAgcmV0dXJuIDA7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlN0YWNrLWxvY2FsLXN5bWJvbC1lbnRyeS1wb2ludC1tYXNrIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsIDBMLCAtMSk7Ci0JICBwdHIgKz0gKnB0ciArIDE7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJSZXNlcnZlZCBTVEEgY21kICVkIiksIHB0clstMV0pOwotCXJldHVybiBOVUxMOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qCi0gKiB0aXJfc3RvCi0gKgotICogdmF4IHN0b3JlIGNvbW1hbmRzCi0gKgotICogaGFuZGxlIHN0b194eHggY29tbWFuZHMgaW4gdGlyIHNlY3Rpb24KLSAqIHB0ciBwb2ludHMgdG8gZGF0YSBhcmVhIGluIHJlY29yZAotICoKLSAqIHNlZSB0YWJsZSA3LTQgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9zdG8gKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICB1bnNpZ25lZCBsb25nIGR1bW15OwotICBpbnQgc2l6ZTsKLSAgaW50IHBzZWN0OwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX3N0byAlZFxuIiwgKnB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKCpwdHIrKykKLSAgICB7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1NCOgotCS8qCi0JICogc3RvcmUgc2lnbmVkIGJ5dGU6IHBvcCBzdGFjaywgd3JpdGUgYnl0ZQotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWltYWdlX3dyaXRlX2IgKGFiZmQsIGR1bW15ICYgMHhmZik7CS8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fU1c6Ci0JLyoKLQkgKiBzdG9yZSBzaWduZWQgd29yZDogcG9wIHN0YWNrLCB3cml0ZSB3b3JkCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOwkvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xXOgotCS8qCi0JICogc3RvcmUgbG9uZ3dvcmQ6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fQkQ6Ci0JLyoKLQkgKiBzdG9yZSBieXRlIGRpc3BsYWNlZDogcG9wIHN0YWNrLCBzdWIgbGMrMSwgd3JpdGUgYnl0ZQotCSAqIGFyZzogLQotCSAqLwotCWR1bW15ID0gX2JmZF92bXNfcG9wIChhYmZkLCAmcHNlY3QpOwotCWR1bW15IC09ICgoUFJJVihzZWN0aW9ucylbcHNlY3RdKS0+dm1hICsgMSk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1dEOgotCS8qCi0JICogc3RvcmUgd29yZCBkaXNwbGFjZWQ6IHBvcCBzdGFjaywgc3ViIGxjKzIsIHdyaXRlIHdvcmQKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQlkdW1teSAtPSAoKFBSSVYoc2VjdGlvbnMpW3BzZWN0XSktPnZtYSArIDIpOwotCWltYWdlX3dyaXRlX3cgKGFiZmQsIGR1bW15ICYgMHhmZmZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19MRDoKLQkvKgotCSAqIHN0b3JlIGxvbmcgZGlzcGxhY2VkOiBwb3Agc3RhY2ssIHN1YiBsYys0LCB3cml0ZSBsb25nCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JZHVtbXkgLT0gKChQUklWKHNlY3Rpb25zKVtwc2VjdF0pLT52bWEgKyA0KTsKLQlpbWFnZV93cml0ZV9sIChhYmZkLCBkdW1teSAmIDB4ZmZmZmZmZmYpOy8qIEZJWE1FOiBjaGVjayB0b3AgYml0cyAqLwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX0xJOgotCS8qCi0JICogc3RvcmUgc2hvcnQgbGl0ZXJhbDogcG9wIHN0YWNrLCB3cml0ZSBieXRlCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsvKiBGSVhNRTogY2hlY2sgdG9wIGJpdHMgKi8KLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSURSOgotCS8qCi0JICogc3RvcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQgZGF0YSByZWZlcmVuY2U6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKiBGSVhNRTogaW5jb21wbGV0ZSAhCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19QSUNSOgotCS8qCi0JICogc3RvcmUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSByZWZlcmVuY2U6IHBvcCBzdGFjaywgd3JpdGUgbG9uZ3dvcmQKLQkgKiBhcmc6IC0KLQkgKiBGSVhNRTogaW5jb21wbGV0ZSAhCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgMHg5Zik7Ci0JaW1hZ2Vfd3JpdGVfbCAoYWJmZCwgZHVtbXkgJiAweGZmZmZmZmZmKTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SSVZCOgotCS8qCi0JICogc3RvcmUgcmVwZWF0ZWQgaW1tZWRpYXRlIHZhcmlhYmxlIGJ5dGVzCi0JICogMS1ieXRlIGNvdW50IG4gZmllbGQgZm9sbG93ZWQgYnkgbiBieXRlcyBvZiBkYXRhCi0JICogcG9wIHN0YWNrLCB3cml0ZSBuIGJ5dGVzIDxzdGFjaz4gdGltZXMKLQkgKi8KLQlzaXplID0gKnB0cisrOwotCWR1bW15ID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQl3aGlsZSAoZHVtbXktLSA+IDBMKQotCSAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBzaXplLCAwKTsKLQlwdHIgKz0gc2l6ZTsKLQlicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fQjoKLQkvKgotCSAqIHN0b3JlIGJ5dGUgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaW1hZ2Vfd3JpdGVfYiAoYWJmZCwgZHVtbXkgJiAweGZmKTsKLQlicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVzoKLQkvKgotCSAqIHN0b3JlIHdvcmQgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaW1hZ2Vfd3JpdGVfdyAoYWJmZCwgZHVtbXkgJiAweGZmZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SQjoKLQkvKgotCSAqIHN0b3JlIHJlcGVhdGVkIGJ5dGUgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlzaXplID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JICBpbWFnZV93cml0ZV9iIChhYmZkLCBkdW1teSAmIDB4ZmYpOwotCWJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX1NUT19SVzoKLQkvKgotCSAqIHN0b3JlIHJlcGVhdGVkIHdvcmQgZnJvbSB0b3AgbG9uZ3dvcmQKLQkgKi8KLQlzaXplID0gKHVuc2lnbmVkIGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlkdW1teSA9ICh1bnNpZ25lZCBsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jd2hpbGUgKHNpemUtLSA+IDApCi0JICBpbWFnZV93cml0ZV93IChhYmZkLCBkdW1teSAmIDB4ZmZmZik7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUlNCOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19SU1c6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JMOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19WUFM6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1VTQjoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fVVNXOgotICAgICAgY2FzZSBUSVJfU19DX1NUT19SVUI6Ci0gICAgICBjYXNlIFRJUl9TX0NfU1RPX1JVVzoKLSAgICAgIGNhc2UgVElSX1NfQ19TVE9fUElSUjoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlVuaW1wbGVtZW50ZWQgU1RPIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgU1RPIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKgotICogc3RhY2sgb3BlcmF0b3IgY29tbWFuZHMKLSAqIGFsbCAzMiBiaXQgc2lnbmVkIGFyaXRobWV0aWMKLSAqIGFsbCB3b3JkIGp1c3QgbGlrZSBhIHN0YWNrIGNhbGN1bGF0b3IKLSAqIGFyZ3VtZW50cyBhcmUgcG9wcGVkIGZyb20gc3RhY2ssIHJlc3VsdHMgYXJlIHB1c2hlZCBvbiBzdGFjawotICoKLSAqIHNlZSB0YWJsZSA3LTUgb2YgdGhlIFZBWC9WTVMgbGlua2VyIG1hbnVhbAotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9vcHIgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBsb25nIG9wMSwgb3AyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg1LCAidGlyX29wciAlZFxuIiwgKnB0cik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKCpwdHIrKykKLSAgICB7Ci0gIC8qIG9wZXJhdGlvbiAqLwotICAgICAgY2FzZSBUSVJfU19DX09QUl9OT1A6Ci0JLyoKLQkgKiBuby1vcAotCSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQUREOgotCS8qCi0JICogYWRkCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgKyBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9TVUI6Ci0JLyoKLQkgKiBzdWJ0cmFjdAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AyIC0gb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfTVVMOgotCS8qCi0JICogbXVsdGlwbHkKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSAqIG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0RJVjoKLQkvKgotCSAqIGRpdmlkZQotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlpZiAob3AyID09IDApCi0JICBfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykwTCwgLTEpOwotCWVsc2UKLQkgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDIgLyBvcDEpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9BTkQ6Ci0JLyoKLQkgKiBsb2dpY2FsIGFuZAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0Jb3AyID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlfYmZkX3Ztc19wdXNoIChhYmZkLCAodW5zaWduZWQgbG9uZykob3AxICYgb3AyKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfSU9SOgotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JLyoKLQkgKiBsb2dpY2FsIGluY2x1c2l2ZSBvcgotCSAqLwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSB8IG9wMiksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0VPUjoKLQkvKgotCSAqIGxvZ2ljYWwgZXhjbHVzaXZlIG9yCi0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKShvcDEgXiBvcDIpLCAtMSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9ORUc6Ci0JLyoKLQkgKiBuZWdhdGUKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKSgtb3AxKSwgLTEpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfQ09NOgotCS8qCi0JICogY29tcGxlbWVudAotCSAqLwotCW9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKG9wMSBeIC0xTCksIC0xKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0lOU1Y6Ci0JLyoKLQkgKiBpbnNlcnQgZmllbGQKLQkgKi8KLQkodm9pZClfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAgKCJUSVJfU19DX09QUl9JTlNWIGluY29tcGxldGUiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0FTSDoKLQkvKgotCSAqIGFyaXRobWV0aWMgc2hpZnQKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQob3AxKSkJCS8qIHNoaWZ0IHJpZ2h0ICovCi0JICBvcDIgPj49IG9wMTsKLQllbHNlCQkJLyogc2hpZnQgbGVmdCAqLwotCSAgb3AyIDw8PSBvcDE7Ci0JX2JmZF92bXNfcHVzaCAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpb3AyLCAtMSk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX09QUl9BU0ggaW5jb21wbGV0ZSIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX1VTSDoKLQkvKgotCSAqIHVuc2lnbmVkIHNoaWZ0Ci0JICovCi0Jb3AxID0gKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQlvcDIgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCWlmIChISUdIQklUKG9wMSkpCQkvKiBzaGlmdCByaWdodCAqLwotCSAgb3AyID4+PSBvcDE7Ci0JZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQkgIG9wMiA8PD0gb3AxOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMiwgLTEpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfVVNIIGluY29tcGxldGUiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9ST1Q6Ci0JLyoKLQkgKiByb3RhdGUKLQkgKi8KLQlvcDEgPSAobG9uZylfYmZkX3Ztc19wb3AgKGFiZmQsIE5VTEwpOwotCW9wMiA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JaWYgKEhJR0hCSVQoMCkpCQkvKiBzaGlmdCByaWdodCAqLwotCSAgb3AyID4+PSBvcDE7Ci0JZWxzZQkJCS8qIHNoaWZ0IGxlZnQgKi8KLQkgIG9wMiA8PD0gb3AxOwotCV9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMiwgLTEpOwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfUk9UIGluY29tcGxldGUiKSk7Ci0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBUSVJfU19DX09QUl9TRUw6Ci0JLyoKLQkgKiBzZWxlY3QKLQkgKi8KLQlpZiAoKGxvbmcpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKSAmIDB4MDFMKQotCSAgKHZvaWQpX2JmZF92bXNfcG9wIChhYmZkLCBOVUxMKTsKLQllbHNlCi0JICB7Ci0JICAgIG9wMSA9IChsb25nKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAgICh2b2lkKV9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JICAgIF9iZmRfdm1zX3B1c2ggKGFiZmQsICh1bnNpZ25lZCBsb25nKW9wMSwgLTEpOwotCSAgfQotICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVElSX1NfQ19PUFJfUkVERUY6Ci0JLyoKLQkgKiByZWRlZmluZSBzeW1ib2wgdG8gY3VycmVudCBsb2NhdGlvbgotCSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfUkVERUYgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRJUl9TX0NfT1BSX0RGTElUOgotCS8qCi0JICogZGVmaW5lIGEgbGl0ZXJhbAotCSAqLwotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVElSX1NfQ19PUFJfREZMSVQgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotCSgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiUmVzZXJ2ZWQgT1BSIGNtZCAlZCIpLCBwdHJbLTFdKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9jdGwgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotLyoKLSAqIGNvbnRyb2wgY29tbWFuZHMKLSAqCi0gKiBzZWUgdGFibGUgNy02IG9mIHRoZSBWQVgvVk1TIGxpbmtlciBtYW51YWwKLSAqLwotewotICB1bnNpZ25lZCBsb25nIGR1bW15OwotICBpbnQgcHNlY3Q7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDUsICJ0aXJfY3RsICVkXG4iLCAqcHRyKTsKLSNlbmRpZgotCi0gIHN3aXRjaCAoKnB0cisrKQotICAgIHsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfU0VUUkI6Ci0JLyoKLQkgKiBzZXQgcmVsb2NhdGlvbiBiYXNlOiBwb3Agc3RhY2ssIHNldCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyCi0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JaWYgKHBzZWN0ID49IFBSSVYoc2VjdGlvbl9jb3VudCkpCi0JICB7Ci0JICAgIGFsbG9jX3NlY3Rpb24gKGFiZmQsIHBzZWN0KTsKLQkgIH0KLQlpbWFnZV9zZXRfcHRyIChhYmZkLCBwc2VjdCwgZHVtbXkpOwotICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJUl9TX0NfQ1RMX0FVR1JCOgotCS8qCi0JICogYXVnbWVudCByZWxvY2F0aW9uIGJhc2U6IGluY3JlbWVudCBpbWFnZSBsb2NhdGlvbiBjb3VudGVyIGJ5IG9mZnNldAotCSAqIGFyZzogbHcJb2Zmc2V0IHZhbHVlCi0JICovCi0JZHVtbXkgPSBiZmRfZ2V0bDMyIChwdHIpOwotCWltYWdlX2luY19wdHIgKGFiZmQsIGR1bW15KTsKLSAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUSVJfU19DX0NUTF9ERkxPQzoKLQkvKgotCSAqIGRlZmluZSBsb2NhdGlvbjogcG9wIGluZGV4LCBzYXZlIGxvY2F0aW9uIGNvdW50ZXIgdW5kZXIgaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgTlVMTCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX0NUTF9ERkxPQyBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLSAgICAgIGNhc2UgVElSX1NfQ19DVExfU1RMT0M6Ci0JLyoKLQkgKiBzZXQgbG9jYXRpb246IHBvcCBpbmRleCwgcmVzdG9yZSBsb2NhdGlvbiBjb3VudGVyIGZyb20gaW5kZXgKLQkgKiBhcmc6IC0KLQkgKi8KLQlkdW1teSA9IF9iZmRfdm1zX3BvcCAoYWJmZCwgJnBzZWN0KTsKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlRJUl9TX0NfQ1RMX1NUTE9DIG5vdCBmdWxseSBpbXBsZW1lbnRlZCIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVElSX1NfQ19DVExfU1RLREw6Ci0JLyoKLQkgKiBzdGFjayBkZWZpbmVkIGxvY2F0aW9uOiBwb3AgaW5kZXgsIHB1c2ggbG9jYXRpb24gY291bnRlciBmcm9tIGluZGV4Ci0JICogYXJnOiAtCi0JICovCi0JZHVtbXkgPSBfYmZkX3Ztc19wb3AgKGFiZmQsICZwc2VjdCk7Ci0JKCpfYmZkX2Vycm9yX2hhbmRsZXIpIChfKCJUSVJfU19DX0NUTF9TVEtETCBub3QgZnVsbHkgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIlJlc2VydmVkIENUTCBjbWQgJWQiKSwgcHRyWy0xXSk7Ci0JYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKgotICogaGFuZGxlIGNvbW1hbmQgZnJvbSBUSVIgc2VjdGlvbgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXRpcl9jbWQgKGJmZCAqYWJmZCwgdW5zaWduZWQgY2hhciAqcHRyKQotewotICBzdHJ1Y3QgewotICAgIGludCBtaW5jb2Q7Ci0gICAgaW50IG1heGNvZDsKLSAgICB1bnNpZ25lZCBjaGFyICogKCpleHBsYWluKShiZmQgKiwgdW5zaWduZWQgY2hhciAqKTsKLSAgfSB0aXJfdGFibGVbXSA9IHsKLSAgICB7IDAsCQkgVElSX1NfQ19NQVhTVEFDT0QsIHRpcl9zdGEgfQotICAgLHsgVElSX1NfQ19NSU5TVE9DT0QsIFRJUl9TX0NfTUFYU1RPQ09ELCB0aXJfc3RvIH0KLSAgICx7IFRJUl9TX0NfTUlOT1BSQ09ELCBUSVJfU19DX01BWE9QUkNPRCwgdGlyX29wciB9Ci0gICAseyBUSVJfU19DX01JTkNUTENPRCwgVElSX1NfQ19NQVhDVExDT0QsIHRpcl9jdGwgfQotICAgLHsgLTEsIC0xLCBOVUxMIH0KLSAgfTsKLSAgaW50IGkgPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAidGlyX2NtZCAlZC8leFxuIiwgKnB0ciwgKnB0cik7Ci0gIF9iZmRfaGV4ZHVtcCAoOCwgcHRyLCAxNiwgKGludClwdHIpOwotI2VuZGlmCi0KLSAgaWYgKCpwdHIgJiAweDgwKQkJCQkvKiBzdG9yZSBpbW1lZGlhdGUgKi8KLSAgICB7Ci0gICAgICBpID0gMTI4IC0gKCpwdHIrKyAmIDB4N2YpOwotICAgICAgaW1hZ2VfZHVtcCAoYWJmZCwgcHRyLCBpLCAwKTsKLSAgICAgIHB0ciArPSBpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlICh0aXJfdGFibGVbaV0ubWluY29kID49IDApCi0JewotCSAgaWYgKCAodGlyX3RhYmxlW2ldLm1pbmNvZCA8PSAqcHRyKSAKLQkgICAgJiYgKCpwdHIgPD0gdGlyX3RhYmxlW2ldLm1heGNvZCkpCi0JICAgIHsKLQkgICAgICBwdHIgPSB0aXJfdGFibGVbaV0uZXhwbGFpbiAoYWJmZCwgcHRyKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaSsrOwotCX0KLSAgICAgIGlmICh0aXJfdGFibGVbaV0ubWluY29kIDwgMCkKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iaiBjb2RlICVkIG5vdCBmb3VuZCIpLCAqcHRyKTsKLQkgIHB0ciA9IDA7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcHRyOwotfQotCi0KLS8qIGhhbmRsZSBjb21tYW5kIGZyb20gRVRJUiBzZWN0aW9uICAqLwotCi1zdGF0aWMgaW50Ci1ldGlyX2NtZCAoYWJmZCwgY21kLCBwdHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IGNtZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotewotICBzdGF0aWMgc3RydWN0IHsKLSAgICBpbnQgbWluY29kOwotICAgIGludCBtYXhjb2Q7Ci0gICAgYm9vbGVhbiAoKmV4cGxhaW4pIFBBUkFNUygoYmZkICosIGludCwgdW5zaWduZWQgY2hhciAqKSk7Ci0gIH0gZXRpcl90YWJsZVtdID0gewotICAgIHsgRVRJUl9TX0NfTUlOU1RBQ09ELCBFVElSX1NfQ19NQVhTVEFDT0QsIGV0aXJfc3RhIH0sCi0gICAgeyBFVElSX1NfQ19NSU5TVE9DT0QsIEVUSVJfU19DX01BWFNUT0NPRCwgZXRpcl9zdG8gfSwKLSAgICB7IEVUSVJfU19DX01JTk9QUkNPRCwgRVRJUl9TX0NfTUFYT1BSQ09ELCBldGlyX29wciB9LAotICAgIHsgRVRJUl9TX0NfTUlOQ1RMQ09ELCBFVElSX1NfQ19NQVhDVExDT0QsIGV0aXJfY3RsIH0sCi0gICAgeyBFVElSX1NfQ19NSU5TVENDT0QsIEVUSVJfU19DX01BWFNUQ0NPRCwgZXRpcl9zdGMgfSwKLSAgICB7IC0xLCAtMSwgTlVMTCB9Ci0gIH07Ci0KLSAgaW50IGkgPSAwOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg0LCAiZXRpcl9jbWQgJWQvJXhcbiIsIGNtZCwgY21kKTsKLSAgX2JmZF9oZXhkdW1wICg4LCBwdHIsIDE2LCAoaW50KXB0cik7Ci0jZW5kaWYKLQotICB3aGlsZSAoZXRpcl90YWJsZVtpXS5taW5jb2QgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAoIChldGlyX3RhYmxlW2ldLm1pbmNvZCA8PSBjbWQpIAotCSYmIChjbWQgPD0gZXRpcl90YWJsZVtpXS5tYXhjb2QpKQotCXsKLQkgIGlmICghZXRpcl90YWJsZVtpXS5leHBsYWluIChhYmZkLCBjbWQsIHB0cikpCi0JICAgIHJldHVybiAtMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGkrKzsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDQsICJldGlyX2NtZDogPSAwXG4iKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIFJlY29yZHMgKE9CSiRDX1RJUikKLSAgIGhhbmRsZSB0aXIgcmVjb3JkICAqLwotCi1zdGF0aWMgaW50Ci1hbmFseXplX3RpciAoYWJmZCwgcHRyLCBsZW5ndGgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotewotICB1bnNpZ25lZCBjaGFyICptYXhwdHI7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX3RpcjogJWQgYnl0ZXNcbiIsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICBtYXhwdHIgPSBwdHIgKyBsZW5ndGg7Ci0KLSAgd2hpbGUgKHB0ciA8IG1heHB0cikKLSAgICB7Ci0gICAgICBwdHIgPSB0aXJfY21kIChhYmZkLCBwdHIpOwotICAgICAgaWYgKHB0ciA9PSAwKQotCXJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiBSZWNvcmRzIChFT0JKJENfRVRJUikKLSAgIGhhbmRsZSBldGlyIHJlY29yZCAgKi8KLQotc3RhdGljIGludAotYW5hbHl6ZV9ldGlyIChhYmZkLCBwdHIsIGxlbmd0aCkKLSAgICAgYmZkICphYmZkOwotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci17Ci0gIGludCBjbWQ7Ci0gIHVuc2lnbmVkIGNoYXIgKm1heHB0cjsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX2V0aXI6ICVkIGJ5dGVzXG4iLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgbWF4cHRyID0gcHRyICsgbGVuZ3RoOwotCi0gIHdoaWxlIChwdHIgPCBtYXhwdHIpCi0gICAgewotICAgICAgY21kID0gYmZkX2dldGwxNiAocHRyKTsKLSAgICAgIGxlbmd0aCA9IGJmZF9nZXRsMTYgKHB0ciArIDIpOwotICAgICAgcmVzdWx0ID0gZXRpcl9jbWQgKGFiZmQsIGNtZCwgcHRyKzQpOwotICAgICAgaWYgKHJlc3VsdCAhPSAwKQotCWJyZWFrOwotICAgICAgcHRyICs9IGxlbmd0aDsKLSAgICB9Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDMsICJhbmFseXplX2V0aXI6ID0gJWRcbiIsIHJlc3VsdCk7Ci0jZW5kaWYKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHByb2Nlc3MgRVRJUiByZWNvcmQKLSAgCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF90aXIgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0gIGludCByZXN1bHQ7Ci0KLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJUSVIvRVRJUlxuIik7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKG9ianR5cGUpCi0gICAgewotICAgICAgY2FzZSBFT0JKX1NfQ19FVElSOgotCVBSSVYodm1zX3JlYykgKz0gNDsJLyogc2tpcCB0eXBlLCBzaXplICovCi0JUFJJVihyZWNfc2l6ZSkgLT0gNDsKLQlyZXN1bHQgPSBhbmFseXplX2V0aXIgKGFiZmQsIFBSSVYodm1zX3JlYyksIFBSSVYocmVjX3NpemUpKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT0JKX1NfQ19USVI6Ci0JUFJJVih2bXNfcmVjKSArPSAxOwkvKiBza2lwIHR5cGUgKi8KLQlQUklWKHJlY19zaXplKSAtPSAxOwotCXJlc3VsdCA9IGFuYWx5emVfdGlyIChhYmZkLCBQUklWKHZtc19yZWMpLCBQUklWKHJlY19zaXplKSk7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXJlc3VsdCA9IC0xOwotCWJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qIHByb2Nlc3MgRURCRyByZWNvcmQKLSAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCi0gIAotICAgbm90IGltcGxlbWVudGVkIHlldCAgKi8KLQotaW50Ci1fYmZkX3Ztc19zbHVycF9kYmcgKGFiZmQsIG9ianR5cGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IG9ianR5cGU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICgyLCAiREJHL0VEQkdcbiIpOwotI2VuZGlmCi0KLSAgYWJmZC0+ZmxhZ3MgfD0gKEhBU19ERUJVRyB8IEhBU19MSU5FTk8pOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBwcm9jZXNzIEVUQlQgcmVjb3JkCi0gICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgotICAKLSAgIG5vdCBpbXBsZW1lbnRlZCB5ZXQgICovCi0KLWludAotX2JmZF92bXNfc2x1cnBfdGJ0IChhYmZkLCBvYmp0eXBlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBvYmp0eXBlOwotewotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgIlRCVC9FVEJUXG4iKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIHByb2Nlc3MgTE5LIHJlY29yZAotICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IKLSAgCi0gICBub3QgaW1wbGVtZW50ZWQgeWV0ICAqLwotCi1pbnQKLV9iZmRfdm1zX3NsdXJwX2xuayAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJMTktcbiIpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyoJCQkJCQkJCQkqLwotLyoJV1JJVEUgRVRJUiBTRUNUSU9OCQkJCQkJKi8KLS8qCQkJCQkJCQkJKi8KLS8qCXRoaXMgaXMgc3RpbGwgdW5kZXIgY29uc3RydWN0aW9uIGFuZCB0aGVyZWZvcmUgbm90IGRvY3VtZW50ZWQJKi8KLS8qCQkJCQkJCQkJKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHN0YXJ0X2V0aXJfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IGluZGV4LCB1cXVhZCBvZmZzZXQsIGJvb2xlYW4ganVzdG9mZnNldCkpOwotc3RhdGljIHZvaWQgc3RvX2ltbSBQQVJBTVMgKChiZmQgKmFiZmQsIHZtc19zZWN0aW9uICpzcHRyLCBiZmRfdm1hIHZhZGRyLCBpbnQgaW5kZXgpKTsKLXN0YXRpYyB2b2lkIGVuZF9ldGlyX3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICB2bXNfc2VjdGlvbiAqc3B0cjsKLSAgICAgYmZkX3ZtYSB2YWRkcjsKLSAgICAgaW50IGluZGV4OwotewotICBpbnQgc2l6ZTsKLSAgaW50IHNzaXplOwotICB1bnNpZ25lZCBjaGFyICpjcHRyOwotCi0jaWYgVk1TX0RFQlVHCi0gIF9iZmRfdm1zX2RlYnVnICg4LCAic3RvX2ltbSAlZCBieXRlc1xuIiwgc3B0ci0+c2l6ZSk7Ci0gIF9iZmRfaGV4ZHVtcCAoOSwgc3B0ci0+Y29udGVudHMsIChpbnQpc3B0ci0+c2l6ZSwgKGludCl2YWRkcik7Ci0jZW5kaWYKLQotICBzc2l6ZSA9IHNwdHItPnNpemU7Ci0gIGNwdHIgPSBzcHRyLT5jb250ZW50czsKLQotICB3aGlsZSAoc3NpemUgPiAwKQotICAgIHsKLQotICAgICAgc2l6ZSA9IHNzaXplOwkJCQkvKiB0cnkgYWxsIHRoZSByZXN0ICovCi0KLSAgICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIHNpemUpIDwgMCkKLQl7CQkJCQkvKiBkb2Vzbid0IGZpdCwgc3BsaXQgISAqLwotCSAgZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBpbmRleCwgdmFkZHIsIGZhbHNlKTsKLQkgIHNpemUgPSBfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDApOwkvKiBnZXQgbWF4IHNpemUgKi8KLQkgIGlmIChzaXplID4gc3NpemUpCQkJLyogbW9yZSB0aGFuIHdoYXQncyBsZWZ0ID8gKi8KLQkgICAgc2l6ZSA9IHNzaXplOwotCX0KLQotICAgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19TVE9fSU1NLCAtMSk7Ci0gICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNpemUpKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCBjcHRyLCBzaXplKTsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICgxMCwgImR1bXBlZCAlZCBieXRlc1xuIiwgc2l6ZSk7Ci0gICAgICBfYmZkX2hleGR1bXAgKDEwLCBjcHRyLCAoaW50KXNpemUsIChpbnQpdmFkZHIpOwotI2VuZGlmCi0KLSAgICAgIHZhZGRyICs9IHNpemU7Ci0gICAgICBzc2l6ZSAtPSBzaXplOwotICAgICAgY3B0ciArPSBzaXplOwotICAgIH0KLQotICByZXR1cm47Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIHN0YXJ0IEVUSVIgcmVjb3JkIGZvciBzZWN0aW9uICNpbmRleCBhdCB2aXJ0dWFsIGFkZHIgb2Zmc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBpbmRleCwgb2Zmc2V0LCBqdXN0b2Zmc2V0KQotICAgIGJmZCAqYWJmZDsKLSAgICBpbnQgaW5kZXg7Ci0gICAgdXF1YWQgb2Zmc2V0OwotICAgIGJvb2xlYW4ganVzdG9mZnNldDsKLXsKLSAgaWYgKCFqdXN0b2Zmc2V0KQotICAgIHsKLSAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRVRJUiwgLTEpOwkvKiBvbmUgRVRJUiBwZXIgc2VjdGlvbiAqLwotICAgICAgX2JmZF92bXNfb3V0cHV0X3B1c2ggKGFiZmQpOwotICAgIH0KLQotICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVUSVJfU19DX1NUQV9QUSwgLTEpOwkvKiBwdXNoIHN0YXJ0IG9mZnNldCAqLwotICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgKHVuc2lnbmVkIGxvbmcpaW5kZXgpOwotICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwgKHVxdWFkKW9mZnNldCk7Ci0gIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFVElSX1NfQ19DVExfU0VUUkIsIC0xKTsJLyogc3RhcnQgPSBwb3AgKCkgKi8KLSAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogZW5kIGV0aXIgcmVjb3JkICAqLwotc3RhdGljIHZvaWQKLWVuZF9ldGlyX3JlY29yZCAoYWJmZCkKLSAgICBiZmQgKmFiZmQ7Ci17Ci0gIF9iZmRfdm1zX291dHB1dF9wb3AgKGFiZmQpOwotICBfYmZkX3Ztc19vdXRwdXRfZW5kIChhYmZkKTsgCi19Ci0KLS8qIHdyaXRlIHNlY3Rpb24gY29udGVudHMgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIHZtc19zZWN0aW9uICpzcHRyOwotICBpbnQgbmV4dG9mZnNldDsKLQotI2lmIFZNU19ERUJVRwotICBfYmZkX3Ztc19kZWJ1ZyAoMiwgInZtc193cml0ZV90aXIgKCVwLCAlZClcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgNCk7Ci0KLSAgbmV4dG9mZnNldCA9IDA7Ci0gIFBSSVYodm1zX2xpbmthZ2VfaW5kZXgpID0gMTsKLQotICAvKiBkdW1wIGFsbCBvdGhlciBzZWN0aW9ucyAgKi8KLQotICBzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7Ci0KLSAgd2hpbGUgKHNlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0KLSNpZiBWTVNfREVCVUcKLSAgICAgIF9iZmRfdm1zX2RlYnVnICg0LCAid3JpdGluZyAlZC4gc2VjdGlvbiAnJXMnICglZCBieXRlcylcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lLCAoaW50KShzZWN0aW9uLT5fcmF3X3NpemUpKTsNCi0jZW5kaWYKLQotICAgICAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDX1JFTE9DKQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoKGkgPSBzZWN0aW9uLT5yZWxvY19jb3VudCkgPD0gMCkKLQkgICAgewotCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiU0VDX1JFTE9DIHdpdGggbm8gcmVsb2NzIGluIHNlY3Rpb24gJXMiKSwKLQkJCQkgICAgIHNlY3Rpb24tPm5hbWUpOwotCSAgICB9Ci0jaWYgVk1TX0RFQlVHCi0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhcmVsZW50ICoqcnB0cjsKLQkgICAgICBfYmZkX3Ztc19kZWJ1ZyAoNCwgIiVkIHJlbG9jYXRpb25zOlxuIiwgaSk7Ci0JICAgICAgcnB0ciA9IHNlY3Rpb24tPm9yZWxvY2F0aW9uOwotCSAgICAgIHdoaWxlIChpLS0gPiAwKQotCQl7Ci0JCSAgX2JmZF92bXNfZGVidWcgKDQsICJzeW0gJXMgaW4gc2VjICVzLCB2YWx1ZSAlMDhseCwgYWRkciAlMDhseCwgb2ZmICUwOGx4LCBsZW4gJWQ6ICVzXG4iLAotCQkJICAgICAgKCooKnJwdHIpLT5zeW1fcHRyX3B0ciktPm5hbWUsCi0JCQkgICAgICAoKigqcnB0ciktPnN5bV9wdHJfcHRyKS0+c2VjdGlvbi0+bmFtZSwKLQkJCSAgICAgIChsb25nKSgqKCpycHRyKS0+c3ltX3B0cl9wdHIpLT52YWx1ZSwKLQkJCSAgICAgICgqcnB0ciktPmFkZHJlc3MsICgqcnB0ciktPmFkZGVuZCwKLQkJCSAgICAgIGJmZF9nZXRfcmVsb2Nfc2l6ZSgoKnJwdHIpLT5ob3d0byksCi0JCQkgICAgICAoKnJwdHIpLT5ob3d0by0+bmFtZSk7Ci0JCSAgcnB0cisrOwotCQl9Ci0JICAgIH0KLSNlbmRpZgotCX0KLQotICAgICAgaWYgKChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JJiYgKCEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkpCi0JewotCSAgYmZkX3ZtYSB2YWRkcjsJCS8qIHZpcnR1YWwgYWRkciBpbiBzZWN0aW9uICovCi0KLQkgIHNwdHIgPSBfYmZkX2dldF92bXNfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbi0+aW5kZXgpOwotCSAgaWYgKHNwdHIgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19jb250ZW50cyk7Ci0JICAgICAgcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgIHZhZGRyID0gKGJmZF92bWEpKHNwdHItPm9mZnNldCk7Ci0KLQkgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLCBzZWN0aW9uLT5pbmRleCwgKHVxdWFkKSBzcHRyLT5vZmZzZXQsCi0JCQkgICAgIGZhbHNlKTsKLQotCSAgd2hpbGUgKHNwdHIgIT0gTlVMTCkJCQkJLyogb25lIFNUQV9QUSwgQ1RMX1NFVFJCIHBlciB2bXNfc2VjdGlvbiAqLwotCSAgICB7Ci0KLQkgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpCQkJLyogY2hlY2sgZm9yIHJlbG9jcyAqLwotCQl7Ci0JCSAgYXJlbGVudCAqKnJwdHIgPSBzZWN0aW9uLT5vcmVsb2NhdGlvbjsKLQkJICBpbnQgaSA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotCQkgIGZvciAoOzspCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9zaXplX3R5cGUgYWRkciA9ICgqcnB0ciktPmFkZHJlc3M7Ci0JCSAgICAgIGludCBsZW4gPSBiZmRfZ2V0X3JlbG9jX3NpemUgKCgqcnB0ciktPmhvd3RvKTsKLQkJICAgICAgaWYgKHNwdHItPm9mZnNldCA8IGFkZHIpCQkvKiBzcHRyIHN0YXJ0cyBiZWZvcmUgcmVsb2MgKi8KLQkJCXsKLQkJCSAgaW50IGJlZm9yZSA9IGFkZHIgLSBzcHRyLT5vZmZzZXQ7Ci0JCQkgIGlmIChzcHRyLT5zaXplIDw9IGJlZm9yZSkJCS8qIGNvbXBsZXRlIGJlZm9yZSAqLwotCQkJICAgIHsKLQkJCSAgICAgIHN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7Ci0JCQkgICAgICB2YWRkciArPSBzcHRyLT5zaXplOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICBlbHNlCQkJCS8qIHBhcnRseSBiZWZvcmUgKi8KLQkJCSAgICB7Ci0JCQkgICAgICBpbnQgYWZ0ZXIgPSBzcHRyLT5zaXplIC0gYmVmb3JlOwotCQkJICAgICAgc3B0ci0+c2l6ZSA9IGJlZm9yZTsKLQkJCSAgICAgIHN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7Ci0JCQkgICAgICB2YWRkciArPSBzcHRyLT5zaXplOwotCQkJICAgICAgc3B0ci0+Y29udGVudHMgKz0gYmVmb3JlOwotCQkJICAgICAgc3B0ci0+b2Zmc2V0ICs9IGJlZm9yZTsKLQkJCSAgICAgIHNwdHItPnNpemUgPSBhZnRlcjsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNwdHItPm9mZnNldCA9PSBhZGRyKQkvKiBzcHRyIHN0YXJ0cyBhdCByZWxvYyAqLwotCQkJewotCQkJICBhc3ltYm9sICpzeW0gPSAqKCpycHRyKS0+c3ltX3B0cl9wdHI7Ci0JCQkgIGFzZWN0aW9uICpzZWMgPSBzeW0tPnNlY3Rpb247Ci0KLQkJCSAgc3dpdGNoICgoKnJwdHIpLT5ob3d0by0+dHlwZSkKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSBBTFBIQV9SX0lHTk9SRToKLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgY2FzZSBBTFBIQV9SX1JFRkxPTkc6Ci0JCQkgICAgICB7Ci0JCQkJaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwKLQkJCQkJCQkJc3RybGVuKChjaGFyICopc3ltLT5uYW1lKSkKLQkJCQkJPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX0dCTF9MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwKLQkJCQkJCQkgICAgICBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICB9Ci0JCQkJZWxzZSBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCAxNikgPCAwKQotCQkJCSAgICAgIHsKLQkJCQkJZW5kX2V0aXJfcmVjb3JkIChhYmZkKTsKLQkJCQkJc3RhcnRfZXRpcl9yZWNvcmQgKGFiZmQsCi0JCQkJCQkJICAgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkJICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgICAgICB9Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RBX0xXLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9xdWFkIChhYmZkLAotCQkJCQkJCSAgICh1cXVhZClzeW0tPnZhbHVlKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fTFcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDMyKSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfUFEsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKHNlYy0+aW5kZXgpKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKCh1cXVhZCkoKnJwdHIpLT5hZGRlbmQKLQkJCQkJCQkgICAgKyAodXF1YWQpc3ltLT52YWx1ZSkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19MVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfUkVGUVVBRDoKLQkJCSAgICAgIHsKLQkJCQlpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCQkJCSAgewotCQkJCSAgICBpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLAotCQkJCQkJCQlzdHJsZW4oKGNoYXIgKilzeW0tPm5hbWUpKQotCQkJCQk8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVE9fR0JMLAotCQkJCQkJCSAgICAtMSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9jb3VudGVkIChhYmZkLAotCQkJCQkJCSAgICAgIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCQkgIH0KLQkJCQllbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JCQkJICB7Ci0JCQkJICAgIGlmIChfYmZkX3Ztc19vdXRwdXRfY2hlY2sgKGFiZmQsIDE2KSA8IDApCi0JCQkJICAgICAgewotCQkJCQllbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCQlzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwKLQkJCQkJCQkgICBzZWN0aW9uLT5pbmRleCwKLQkJCQkJCQkgICB2YWRkciwgZmFsc2UpOwotCQkJCSAgICAgIH0KLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCSAgICBFVElSX1NfQ19TVEFfUVcsCi0JCQkJCQkJICAgIC0xKTsKLQkJCQkgICAgX2JmZF92bXNfb3V0cHV0X3F1YWQgKGFiZmQsCi0JCQkJCQkJICAgKHVxdWFkKXN5bS0+dmFsdWUpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUT19RVywKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJCWVsc2UKLQkJCQkgIHsKLQkJCQkgICAgaWYgKF9iZmRfdm1zX291dHB1dF9jaGVjayAoYWJmZCwgMzIpIDwgMCkKLQkJCQkgICAgICB7Ci0JCQkJCWVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJCXN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJCSAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJCSAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICAgICAgfQotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJICAgIEVUSVJfU19DX1NUQV9QUSwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwKLQkJCQkJCQkgICAodW5zaWduZWQgbG9uZykoc2VjLT5pbmRleCkpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfcXVhZCAoYWJmZCwKLQkJCQkJCQkgICAoKHVxdWFkKSgqcnB0ciktPmFkZGVuZAotCQkJCQkJCSAgICArICh1cXVhZClzeW0tPnZhbHVlKSk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkJICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwKLQkJCQkJCQkgICAgRVRJUl9TX0NfU1RPX09GRiwKLQkJCQkJCQkgICAgLTEpOwotCQkJCSAgICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwotCQkJCSAgfQotCQkJICAgICAgfQotCQkJICAgICAgYnJlYWs7Ci0KLQkJCSAgICBjYXNlIEFMUEhBX1JfSElOVDoKLQkJCSAgICAgIHsKLQkJCQlpbnQgaGludF9zaXplOwotCi0JCQkJaGludF9zaXplID0gc3B0ci0+c2l6ZTsKLQkJCQlzcHRyLT5zaXplID0gbGVuOwotCQkJCXN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7Ci0JCQkJc3B0ci0+c2l6ZSA9IGhpbnRfc2l6ZTsKLSNpZiAwCi0JCQkJdm1zX291dHB1dF9iZWdpbihhYmZkLCBFVElSX1NfQ19TVE9fSElOVF9HQkwsIC0xKTsKLQkJCQl2bXNfb3V0cHV0X2xvbmcoYWJmZCwgKHVuc2lnbmVkIGxvbmcpKHNlYy0+aW5kZXgpKTsKLQkJCQl2bXNfb3V0cHV0X3F1YWQoYWJmZCwgKHVxdWFkKWFkZHIpOwotCi0JCQkJdm1zX291dHB1dF9jb3VudGVkKGFiZmQsIF9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCAoYWJmZCwgc3ltLT5uYW1lLCBFT0JKX1NfQ19TWU1TSVopKTsKLQkJCQl2bXNfb3V0cHV0X2ZsdXNoKGFiZmQpOwotI2VuZGlmCi0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIEFMUEhBX1JfTElOS0FHRToKLQkJCSAgICAgIHsKLQkJCQlpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLCA2NCkgPCAwKQotCQkJCSAgewotCQkJCSAgICBlbmRfZXRpcl9yZWNvcmQgKGFiZmQpOwotCQkJCSAgICBzdGFydF9ldGlyX3JlY29yZCAoYWJmZCwgc2VjdGlvbi0+aW5kZXgsCi0JCQkJCQkgICAgICAgdmFkZHIsIGZhbHNlKTsKLQkJCQkgIH0KLQkJCQlfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsCi0JCQkJCQkJRVRJUl9TX0NfU1RDX0xQX1BTQiwKLQkJCQkJCQktMSk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCi0JCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpUFJJVih2bXNfbGlua2FnZV9pbmRleCkpOwotCQkJCVBSSVYodm1zX2xpbmthZ2VfaW5kZXgpICs9IDI7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwotCQkJCV9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7Ci0JCQkgICAgICB9Ci0JCQkgICAgICBicmVhazsKLQotCQkJICAgIGNhc2UgQUxQSEFfUl9DT0RFQUREUjoKLQkJCSAgICAgIHsKLQkJCQlpZiAoX2JmZF92bXNfb3V0cHV0X2NoZWNrIChhYmZkLAotCQkJCQkJCSAgICBzdHJsZW4oKGNoYXIgKilzeW0tPm5hbWUpKQotCQkJCSAgICA8IDApCi0JCQkJICB7Ci0JCQkJICAgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0JCQkJICAgIHN0YXJ0X2V0aXJfcmVjb3JkIChhYmZkLAotCQkJCQkJICAgICAgIHNlY3Rpb24tPmluZGV4LAotCQkJCQkJICAgICAgIHZhZGRyLCBmYWxzZSk7Ci0JCQkJICB9Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLAotCQkJCQkJCUVUSVJfU19DX1NUT19DQSwKLQkJCQkJCQktMSk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsCi0JCQkJCQkJICBfYmZkX3Ztc19sZW5ndGhfaGFzaF9zeW1ib2wgKGFiZmQsIHN5bS0+bmFtZSwgRU9CSl9TX0NfU1lNU0laKSk7Ci0JCQkJX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKLQkJCSAgICAgIH0KLQkJCSAgICAgIGJyZWFrOwotCi0JCQkgICAgZGVmYXVsdDoKLQkJCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiVW5oYW5kbGVkIHJlbG9jYXRpb24gJXMiKSwKLQkJCQkJCSAgICAgKCpycHRyKS0+aG93dG8tPm5hbWUpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCi0JCQkgIHZhZGRyICs9IGxlbjsKLQotCQkJICBpZiAobGVuID09IHNwdHItPnNpemUpCi0JCQkgICAgewotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgc3B0ci0+Y29udGVudHMgKz0gbGVuOwotCQkJICAgICAgc3B0ci0+b2Zmc2V0ICs9IGxlbjsKLQkJCSAgICAgIHNwdHItPnNpemUgLT0gbGVuOwotCQkJICAgICAgaS0tOwotCQkJICAgICAgcnB0cisrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQkJCQkJLyogc3B0ciBzdGFydHMgYWZ0ZXIgcmVsb2MgKi8KLQkJCXsKLQkJCSAgaS0tOwkJCQkvKiBjaGVjayBuZXh0IHJlbG9jICovCi0JCQkgIHJwdHIrKzsKLQkJCX0KLQotCQkgICAgICBpZiAoaT09MCkJCQkJLyogYWxsIHJlbG9jIGNoZWNrZWQgKi8KLQkJCXsKLQkJCSAgaWYgKHNwdHItPnNpemUgPiAwKQotCQkJICAgIHsKLQkJCSAgICAgIHN0b19pbW0gKGFiZmQsIHNwdHIsIHZhZGRyLCBzZWN0aW9uLT5pbmRleCk7CS8qIGR1bXAgcmVzdCAqLwotCQkJICAgICAgdmFkZHIgKz0gc3B0ci0+c2l6ZTsKLQkJCSAgICB9Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfSAvKiBmb3IgKDs7KSAqLwotCQl9IC8qIGlmIFNFQ19SRUxPQyAqLwotCSAgICAgIGVsc2UJCQkJCQkvKiBubyByZWxvY3MsIGp1c3QgZHVtcCAqLwotCQl7Ci0JCSAgc3RvX2ltbSAoYWJmZCwgc3B0ciwgdmFkZHIsIHNlY3Rpb24tPmluZGV4KTsKLQkJICB2YWRkciArPSBzcHRyLT5zaXplOwotCQl9Ci0KLQkgICAgICBzcHRyID0gc3B0ci0+bmV4dDsKLQotCSAgICB9IC8qIHdoaWxlIChzcHRyICE9IDApICovCi0KLQkgIGVuZF9ldGlyX3JlY29yZCAoYWJmZCk7Ci0KLQl9IC8qIGhhc19jb250ZW50cyAqLwotCi0gICAgICBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dDsKLSAgICB9Ci0KLSAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudChhYmZkLCAyKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogd3JpdGUgdHJhY2ViYWNrIGRhdGEgZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX3RidCAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfdGJ0ICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKLSNlbmRpZgotCi0gIHJldHVybiAwOwotfQotCi0KLS8qIHdyaXRlIGRlYnVnIGluZm8gZm9yIGJmZCBhYmZkICAqLwotCi1pbnQKLV9iZmRfdm1zX3dyaXRlX2RiZyAoYWJmZCwgb2JqdHlwZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgb2JqdHlwZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgX2JmZF92bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZGJnICglcCwgb2JqdHlwZSlcbiIsIGFiZmQsIG9ianR5cGUpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iZmQvdm1zLmMgYi9iZmQvdm1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmMxM2EuLjAwMDAwMDAKLS0tIGEvYmZkL3Ztcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0NyArMCwwIEBACi0vKiB2bXMuYyAtLSBCRkQgYmFjay1lbmQgZm9yIFZBWCAob3BlblZNUy9WQVgpIGFuZAotICAgRVZBWCAob3BlblZNUy9BbHBoYSkgZmlsZXMuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmJmZC5oIgotCi0jaW5jbHVkZSAidm1zLmgiCi0KLXN0YXRpYyBib29sZWFuIHZtc19pbml0aWFsaXplIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHByaXZfc2VjdGlvbl9jb3VudDsKLXN0YXRpYyBib29sZWFuIGZpbGxfc2VjdGlvbl9wdHIgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2ZpeHVwX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjb3B5X3N5bWJvbHMgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByZWxvY19uaWwKLSAgUEFSQU1TICgoYmZkICosIGFyZWxlbnQgKiwgYXN5bWJvbCAqLCBQVFIsIGFzZWN0aW9uICosIGJmZCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKnZtc19vYmplY3RfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqdm1zX2FyY2hpdmVfcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19ta29iamVjdCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc193cml0ZV9vYmplY3RfY29udGVudHMgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY2xvc2VfYW5kX2NsZWFudXAgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2ZyZWVfY2FjaGVkX2luZm8gUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfbmV3X3NlY3Rpb25faG9vayBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZ2V0X3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIHgxLCBmaWxlX3B0ciB4MiwKLQkgICBiZmRfc2l6ZV90eXBlIHgzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ci0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF93aW5kb3cgKncsIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBQQVJBTVMgKChiZmQgKnNyYywgYmZkICpkZXN0KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEKLSAgUEFSQU1TICgoYmZkICpzcmNiZmQsIGFzZWN0aW9uICpzcmNzZWMsIGJmZCAqZHN0YmZkLCBhc2VjdGlvbiAqZHN0c2VjKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YQotICBQQVJBTVMgKChiZmQgKmliZmQsIGFzeW1ib2wgKmlzeW0sIGJmZCAqb2JmZCwgYXN5bWJvbCAqb3N5bSkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqZmlsZSkpOwotc3RhdGljIGNoYXIgKnZtc19jb3JlX2ZpbGVfZmFpbGluZ19jb21tYW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGludCB2bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZCAqYmJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NsdXJwX2FybWFwIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfY29uc3RydWN0X2V4dGVuZGVkX25hbWVfdGFibGUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICoqdGFibG9jLCBiZmRfc2l6ZV90eXBlICp0YWJsZW4sCi0JICAgY29uc3QgY2hhciAqKm5hbWUpKTsKLXN0YXRpYyB2b2lkIHZtc190cnVuY2F0ZV9hcm5hbWUKLSAgUEFSQU1TICgoYmZkICphYmZkLCBDT05TVCBjaGFyICpwYXRobmFtZSwgY2hhciAqYXJoZHIpKTsKLXN0YXRpYyBib29sZWFuIHZtc193cml0ZV9hcm1hcAotICBQQVJBTVMgKChiZmQgKmFyY2gsIHVuc2lnbmVkIGludCBlbGVuZ3RoLCBzdHJ1Y3Qgb3JsICptYXAsCi0JICAgdW5zaWduZWQgaW50IG9ybF9jb3VudCwgaW50IHN0cmlkeCkpOwotc3RhdGljIFBUUiB2bXNfcmVhZF9hcl9oZHIgUEFSQU1TICgoYmZkICphYmZkKSk7Ci1zdGF0aWMgYmZkICp2bXNfZ2V0X2VsdF9hdF9pbmRleCBQQVJBTVMgKChiZmQgKmFiZmQsIHN5bWluZGV4IGluZGV4KSk7Ci1zdGF0aWMgYmZkICp2bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIFBBUkFNUyAoKGJmZCAqYXJjaCwgYmZkICpwcmV2KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfdXBkYXRlX2FybWFwX3RpbWVzdGFtcCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBpbnQgdm1zX2dlbmVyaWNfc3RhdF9hcmNoX2VsdCBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBzdGF0ICpzdGF0KSk7Ci1zdGF0aWMgbG9uZyB2bXNfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19nZXRfc3ltdGFiIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqKnN5bWJvbHMpKTsKLXN0YXRpYyB2b2lkIHZtc19wcmludF9zeW1ib2wKLSAgUEFSQU1TICgoYmZkICphYmZkLCBQVFIgZmlsZSwgYXN5bWJvbCAqc3ltYm9sLCBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93KSk7Ci1zdGF0aWMgdm9pZCB2bXNfZ2V0X3N5bWJvbF9pbmZvCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXN5bWJvbCAqc3ltYm9sLCBzeW1ib2xfaW5mbyAqcmV0KSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoYmZkICphYmZkLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBhbGVudCAqdm1zX2dldF9saW5lbm8gUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICpzeW1ib2wpKTsKLXN0YXRpYyBib29sZWFuIHZtc19maW5kX25lYXJlc3RfbGluZQotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBhc3ltYm9sICoqc3ltYm9scywgYmZkX3ZtYSBvZmZzZXQsCi0JICAgY29uc3QgY2hhciAqKmZpbGUsIGNvbnN0IGNoYXIgKipmdW5jLCB1bnNpZ25lZCBpbnQgKmxpbmUpKTsKLXN0YXRpYyBhc3ltYm9sICp2bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIHNpemUpKTsKLXN0YXRpYyBsb25nIHZtc19yZWFkX21pbmlzeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYm9vbGVhbiBkeW5hbWljLCBQVFIgKm1pbmlzeW1zcCwgdW5zaWduZWQgaW50ICpzaXplcCkpOwotc3RhdGljIGFzeW1ib2wgKnZtc19taW5pc3ltYm9sX3RvX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYywgY29uc3QgUFRSIG1pbmlzeW0sIGFzeW1ib2wgKnN5bSkpOwotc3RhdGljIGxvbmcgdm1zX2dldF9yZWxvY191cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0KSk7Ci1zdGF0aWMgbG9uZyB2bXNfY2Fub25pY2FsaXplX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNyY3NlYywgYXJlbGVudCAqKmxvY2F0aW9uLAotCSAgIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqdm1zX2JmZF9yZWxvY190eXBlX2xvb2t1cAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfc2V0X2FyY2hfbWFjaAotICBQQVJBTVMgKChiZmQgKmFiZmQsIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoLCB1bnNpZ25lZCBsb25nIG1hY2gpKTsKLXN0YXRpYyBib29sZWFuIHZtc19zZXRfc2VjdGlvbl9jb250ZW50cwotICBQQVJBTVMgKChiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLCBQVFIgbG9jYXRpb24sIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1zdGF0aWMgaW50IHZtc19zaXplb2ZfaGVhZGVycyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gcmVsb2MpKTsKLXN0YXRpYyBiZmRfYnl0ZSAqdm1zX2JmZF9nZXRfcmVsb2NhdGVkX3NlY3Rpb25fY29udGVudHMKLSAgUEFSQU1TICgoYmZkICphYmZkLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvLAotCSAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlciwgYmZkX2J5dGUgKmRhdGEsCi0JICAgYm9vbGVhbiByZWxvY2F0ZWFibGUsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX3JlbGF4X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbywKLQkgICBib29sZWFuICphZ2FpbikpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9nY19zZWN0aW9ucwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm8pKTsKLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqdm1zX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9saW5rX2FkZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9maW5hbF9saW5rCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbykpOwotc3RhdGljIGJvb2xlYW4gdm1zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbikpOwotc3RhdGljIGxvbmcgdm1zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLXN0YXRpYyBsb25nIHZtc19jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIKLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc3ltYm9sICoqc3ltYm9scykpOwotc3RhdGljIGxvbmcgdm1zX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotc3RhdGljIGxvbmcgdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXJlbGVudCAqKmFyZWwsIGFzeW1ib2wgKipzeW1ib2xzKSk7Ci1zdGF0aWMgYm9vbGVhbiB2bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgUEFSQU1TICgoYmZkICppYmZkLCBiZmQgKm9iZmQpKTsKLXN0YXRpYyBib29sZWFuIHZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgUEFSQU1TICgoYmZkICphYmZkLCBmbGFnd29yZCBmbGFncykpOwotCi0jZGVmaW5lIHZtc19tYWtlX2VtcHR5X3N5bWJvbCBfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbAotDAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1jb25zdCBiZmRfdGFyZ2V0IHZtc19hbHBoYV92ZWMgPQotewotCi0gICJ2bXMtYWxwaGEiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIsCi0gIGZhbHNlLAkJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgZmFsc2UsCQkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEhBU19TWU1TCi0gICB8IFdQX1RFWFQgfCBEX1BBR0VEKSwJLyogb2JqZWN0IGZsYWdzICovCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZKSwJCS8qIHNlY3QgZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LAotCi0gIHtfYmZkX2R1bW15X3RhcmdldCwgdm1zX29iamVjdF9wLAkJLyogYmZkX2NoZWNrX2Zvcm1hdCAqLwotICAgdm1zX2FyY2hpdmVfcCwgX2JmZF9kdW1teV90YXJnZXR9LAotICB7YmZkX2ZhbHNlLCB2bXNfbWtvYmplY3QsCQkJLyogYmZkX3NldF9mb3JtYXQgKi8KLSAgIF9iZmRfZ2VuZXJpY19ta2FyY2hpdmUsIGJmZF9mYWxzZX0sCi0gIHtiZmRfZmFsc2UsIHZtc193cml0ZV9vYmplY3RfY29udGVudHMsCS8qIGJmZF93cml0ZV9jb250ZW50cyAqLwotICAgX2JmZF93cml0ZV9hcmNoaXZlX2NvbnRlbnRzLCBiZmRfZmFsc2V9LAotCi0gIEJGRF9KVU1QX1RBQkxFX0dFTkVSSUMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUFkgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0NPUkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0FSQ0hJVkUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1NZTUJPTFMgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1JFTE9DUyAodm1zKSwKLSAgQkZEX0pVTVBfVEFCTEVfV1JJVEUgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0xJTksgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX0RZTkFNSUMgKHZtcyksCi0KLSAgKFBUUikgMAotfTsKLQotY29uc3QgYmZkX3RhcmdldCB2bXNfdmF4X3ZlYyA9Ci17Ci0KLSAgInZtcy12YXgiLAkJCS8qIG5hbWUgKi8KLSAgYmZkX3RhcmdldF9vdmF4X2ZsYXZvdXIsCi0gIGZhbHNlLAkJCS8qIGRhdGEgYnl0ZSBvcmRlciBpcyBsaXR0bGUgKi8KLSAgZmFsc2UsCQkJLyogaGVhZGVyIGJ5dGUgb3JkZXIgaXMgbGl0dGxlICovCi0KLSAgKEhBU19SRUxPQyB8IEhBU19TWU1TIAkvKiBvYmplY3QgZmxhZ3MgKi8KLSAgIHwgV1BfVEVYVCB8IERfUEFHRUQKLSAgIHwgSEFTX0xJTkVOTyB8IEhBU19ERUJVRyB8IEhBU19MT0NBTFMpLAotCi0gIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSB8IFNFQ19EQVRBCi0gICB8IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZKSwJCS8qIHNlY3QgZmxhZ3MgKi8KLSAgMCwJCQkJLyogc3ltYm9sX2xlYWRpbmdfY2hhciAqLwotICAnICcsCQkJCS8qIGFyX3BhZF9jaGFyICovCi0gIDE1LAkJCQkvKiBhcl9tYXhfbmFtZWxlbiAqLwotICBiZmRfZ2V0bDY0LCBiZmRfZ2V0bF9zaWduZWRfNjQsIGJmZF9wdXRsNjQsCi0gIGJmZF9nZXRsMzIsIGJmZF9nZXRsX3NpZ25lZF8zMiwgYmZkX3B1dGwzMiwKLSAgYmZkX2dldGwxNiwgYmZkX2dldGxfc2lnbmVkXzE2LCBiZmRfcHV0bDE2LCAvKiBkYXRhICovCi0gIGJmZF9nZXRsNjQsIGJmZF9nZXRsX3NpZ25lZF82NCwgYmZkX3B1dGw2NCwKLSAgYmZkX2dldGwzMiwgYmZkX2dldGxfc2lnbmVkXzMyLCBiZmRfcHV0bDMyLAotICBiZmRfZ2V0bDE2LCBiZmRfZ2V0bF9zaWduZWRfMTYsIGJmZF9wdXRsMTYsIC8qIGhkcnMgKi8KLQotICB7X2JmZF9kdW1teV90YXJnZXQsIHZtc19vYmplY3RfcCwJCS8qIGJmZF9jaGVja19mb3JtYXQgKi8KLSAgIHZtc19hcmNoaXZlX3AsIF9iZmRfZHVtbXlfdGFyZ2V0fSwKLSAge2JmZF9mYWxzZSwgdm1zX21rb2JqZWN0LAkJCS8qIGJmZF9zZXRfZm9ybWF0ICovCi0gICBfYmZkX2dlbmVyaWNfbWthcmNoaXZlLCBiZmRfZmFsc2V9LAotICB7YmZkX2ZhbHNlLCB2bXNfd3JpdGVfb2JqZWN0X2NvbnRlbnRzLAkvKiBiZmRfd3JpdGVfY29udGVudHMgKi8KLSAgIF9iZmRfd3JpdGVfYXJjaGl2ZV9jb250ZW50cywgYmZkX2ZhbHNlfSwKLQotICBCRkRfSlVNUF9UQUJMRV9HRU5FUklDICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1BZICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9DT1JFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9BUkNISVZFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9TWU1CT0xTICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9SRUxPQ1MgKHZtcyksCi0gIEJGRF9KVU1QX1RBQkxFX1dSSVRFICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9MSU5LICh2bXMpLAotICBCRkRfSlVNUF9UQUJMRV9EWU5BTUlDICh2bXMpLAotCi0gIChQVFIpIDAKLX07Ci0MCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8qIEluaXRpYWxpemUgcHJpdmF0ZSBkYXRhICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2luaXRpYWxpemUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGFiZmQtPnRkYXRhLmFueSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCwgKGJmZF92bWEpLTEpOwotCi0gIGFiZmQtPnRkYXRhLmFueSA9ICgoc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0KikKLQkJICAgICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCkpKTsKLSAgaWYgKGFiZmQtPnRkYXRhLmFueSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmZGVmIF9fQUxQSEEKLSAgUFJJVihpc192YXgpID0gMDsKLSNlbHNlCi0gIFBSSVYoaXNfdmF4KSA9IDE7Ci0jZW5kaWYKLSAgUFJJVih2bXNfYnVmKSA9IDA7Ci0gIFBSSVYoYnVmX3NpemUpID0gMDsKLSAgUFJJVihyZWNfbGVuZ3RoKSA9IDA7Ci0gIFBSSVYoZmlsZV9mb3JtYXQpID0gRkZfVU5LTk9XTjsKLSAgUFJJVihmaXh1cF9kb25lKSA9IGZhbHNlOwotICBQUklWKHNlY3Rpb25zKSA9IE5VTEw7Ci0KLSAgUFJJVihzdGFjaykgPSAoKHN0cnVjdCBzdGFja19zdHJ1Y3QgKikKLQkJIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0YWNrX3N0cnVjdCkgKiBTVEFDS1NJWkUpKTsKLSAgaWYgKFBSSVYoc3RhY2spID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0xOgotICAgICAgZnJlZSAoYWJmZC0+dGRhdGEuYW55KTsKLSAgICAgIGFiZmQtPnRkYXRhLmFueSA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBQUklWKHN0YWNrcHRyKSA9IDA7Ci0KLSAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgICAgIGJmZF9tYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICBpZiAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9PSAwKQotICAgIHsKLSAgICAgdm1zX2luaXRfbm9fbWVtMjoKLSAgICAgIGZyZWUgKFBSSVYoc3RhY2spKTsKLSAgICAgIFBSSVYoc3RhY2spID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMTsKLSAgICB9Ci0KLSAgaWYgKCFiZmRfaGFzaF90YWJsZV9pbml0IChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBfYmZkX3Ztc19oYXNoX25ld2Z1bmMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9ICgoc3RydWN0IGxvY2F0aW9uX3N0cnVjdCAqKQotCQkJICBiZmRfbWFsbG9jIChzaXplb2YgKHN0cnVjdCBsb2NhdGlvbl9zdHJ1Y3QpCi0JCQkJICAgICAgKiBMT0NBVElPTl9TQVZFX1NJWkUpKTsKLSAgaWYgKFBSSVYobG9jYXRpb25fc3RhY2spID09IDApCi0gICAgewotICAgICB2bXNfaW5pdF9ub19tZW0zOgotICAgICAgZnJlZSAoUFJJVih2bXNfc3ltYm9sX3RhYmxlKSk7Ci0gICAgICBQUklWKHZtc19zeW1ib2xfdGFibGUpID0gMDsKLSAgICAgIGdvdG8gdm1zX2luaXRfbm9fbWVtMjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IFZNU19TRUNUSU9OX0NPVU5UOyBpKyspCi0gICAgUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV0gPSBOVUxMOwotCi0gIFBSSVYob3V0cHV0X2J1ZikgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MgKE1BWF9PVVRSRUNfU0laRSk7Ci0gIGlmIChQUklWKG91dHB1dF9idWYpID09IDApCi0gICAgewotICAgICAgZnJlZSAoUFJJVihsb2NhdGlvbl9zdGFjaykpOwotICAgICAgUFJJVihsb2NhdGlvbl9zdGFjaykgPSAwOwotICAgICAgZ290byB2bXNfaW5pdF9ub19tZW0zOwotICAgIH0KLSAgUFJJVihwdXNoX2xldmVsKSA9IDA7Ci0gIFBSSVYocHVzaGVkX3NpemUpID0gMDsKLSAgUFJJVihsZW5ndGhfcG9zKSA9IDI7Ci0gIFBSSVYob3V0cHV0X3NpemUpID0gMDsKLSAgUFJJVihvdXRwdXRfYWxpZ25tZW50KSA9IDE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRmlsbCBzeW1ib2wtPnNlY3Rpb24gd2l0aCBzZWN0aW9uIHB0cgotICAgc3ltYm9sLT5zZWN0aW9uIGlzIGZpbGxlZCB3aXRoIHRoZSBzZWN0aW9uIGluZGV4IGZvciBkZWZpbmVkIHN5bWJvbHMKLSAgIGR1cmluZyByZWFkaW5nIHRoZSBHU0QvRUdTRCBzZWN0aW9uLiBCdXQgd2UgbmVlZCB0aGUgcG9pbnRlciB0byB0aGUKLSAgIGJmZCBzZWN0aW9uIGxhdGVyLgotCi0gICBJdCBoYXMgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHJlZmVyZW5jZWQgKHVuZGVmaW5lZCBzZWN0aW9uKSBzeW1ib2xzCi0KLSAgIGNhbGxlZCBmcm9tIGJmZF9oYXNoX3RyYXZlcnNlIGluIHZtc19maXh1cF9zZWN0aW9ucyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWZpbGxfc2VjdGlvbl9wdHIgKGVudHJ5LCBzZWN0aW9ucykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgUFRSIHNlY3Rpb25zOwotewotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0KLSAgc3ltID0gICgodm1zX3N5bWJvbF9lbnRyeSAqKWVudHJ5KS0+c3ltYm9sOwotICBzZWMgPSBzeW0tPnNlY3Rpb247Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICg2LCAiZmlsbF9zZWN0aW9uX3B0cjogc3ltICVwLCBzZWMgJXBcbiIsIHN5bSwgc2VjKTsKLSNlbmRpZgotCi0gIC8qIGZpbGwgZm9yd2FyZCByZWZlcmVuY2VzICh0aGVzZSBjb250YWluIHNlY3Rpb24gbnVtYmVyLCBub3Qgc2VjdGlvbiBwdHIpLiAgKi8KLQotICBpZiAoKGludClzZWMgPCBwcml2X3NlY3Rpb25fY291bnQpCi0gICAgewotICAgICAgc2VjID0gKCh2bXNfc3ltYm9sX2VudHJ5ICopZW50cnkpLT5zeW1ib2wtPnNlY3Rpb24gPQotCSgoYXNlY3Rpb24gKiopc2VjdGlvbnMpWyhpbnQpc2VjXTsKLSAgICB9Ci0KLSAgaWYgKHN0cmNtcCAoc3ltLT5uYW1lLCBzZWMtPm5hbWUpID09IDApCi0gICAgc3ltLT5mbGFncyB8PSBCU0ZfU0VDVElPTl9TWU07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogRml4dXAgc2VjdGlvbnMKLSAgIHNldCB1cCBhbGwgcG9pbnRlcnMgYW5kIGFycmF5cywgY291bnRlcnMgYW5kIHNpemVzIGFyZSBmaXhlZCBub3cKLQotICAgd2UgYnVpbGQgYSBwcml2YXRlIHNlY3Rpb25zIHZlY3RvciBmb3IgZWFzeSBhY2Nlc3Mgc2luY2Ugc2VjdGlvbnMKLSAgIGFyZSBhbHdheXMgcmVmZXJlbmNlZCBieSBhbiBpbmRleCBudW1iZXIuCi0KLSAgIGFsbG9jIFBSSVYoc2VjdGlvbnMpIGFjY29yZGluZyB0byBhYmZkLT5zZWN0aW9uX2NvdW50Ci0JY29weSBhYmZkLT5zZWN0aW9ucyB0byBQUklWKHNlY3Rpb25zKSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19maXh1cF9zZWN0aW9ucyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLQotICBpZiAoUFJJVihmaXh1cF9kb25lKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKgotICAgKiB0cmF2ZXJzZSBzeW1ib2wgdGFibGUgYW5kIGZpbGwgaW4gYWxsIHNlY3Rpb24gcG9pbnRlcnMKLSAgICovCi0KLSAgLyogY2FuJ3QgcHJvdmlkZSBzZWN0aW9uIGNvdW50IGFzIGFyZ3VtZW50IHRvIGZpbGxfc2VjdGlvbl9wdHIoKS4gICovCi0gIHByaXZfc2VjdGlvbl9jb3VudCA9IFBSSVYoc2VjdGlvbl9jb3VudCk7Ci0gIGJmZF9oYXNoX3RyYXZlcnNlIChQUklWKHZtc19zeW1ib2xfdGFibGUpLCBmaWxsX3NlY3Rpb25fcHRyLAotCQkgICAgKFBUUikoUFJJVihzZWN0aW9ucykpKTsKLQotICBQUklWKGZpeHVwX2RvbmUpID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vKiBDaGVjayB0aGUgZm9ybWF0IGZvciBhIGZpbGUgYmVpbmcgcmVhZC4KLSAgIFJldHVybiBhIChiZmRfdGFyZ2V0ICopIGlmIGl0J3MgYW4gb2JqZWN0IGZpbGUgb3IgemVybyBpZiBub3QuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJmZF90YXJnZXQgKgotdm1zX29iamVjdF9wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGludCBlcnIgPSAwOwotICBpbnQgcHJldl90eXBlOwotICBjb25zdCBzdHJ1Y3QgYmZkX3RhcmdldCAqdGFyZ2V0X3ZlY3RvciA9IDA7Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IDA7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX29iamVjdF9wKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLQotICBpZiAoIXZtc19pbml0aWFsaXplIChhYmZkKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJ2bXNfaW5pdGlhbGl6ZSAoKSBmYWlsZWQgISFcbiIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAoYWJmZCwgMEwsIFNFRUtfU0VUKSkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90cnVuY2F0ZWQpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHByZXZfdHlwZSA9IC0xOwotCi0gIGRvCi0gICAgewotI2lmIFZNU19ERUJVRwotICAgICAgdm1zX2RlYnVnICg3LCAicmVhZGluZyBhdCAlMDhseFxuIiwgYmZkX3RlbGwoYWJmZCkpOwotI2VuZGlmCi0gICAgICBpZiAoX2JmZF92bXNfbmV4dF9yZWNvcmQgKGFiZmQpIDwgMCkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDIsICJuZXh0X3JlY29yZCBmYWlsZWRcbiIpOyAgICAgIAotI2VuZGlmCi0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKChwcmV2X3R5cGUgPT0gRU9CSl9TX0NfRUdTRCkKLQkgICAmJiAoUFJJVihyZWNfdHlwZSkgIT0gRU9CSl9TX0NfRUdTRCkpCi0JewotCSAgaWYgKHZtc19maXh1cF9zZWN0aW9ucyAoYWJmZCkgPT0gZmFsc2UpCi0JICAgIHsKLSNpZiBWTVNfREVCVUcKLQkgICAgICB2bXNfZGVidWcgKDIsICJ2bXNfZml4dXBfc2VjdGlvbnMgZmFpbGVkXG4iKTsKLSNlbmRpZgotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0gICAgICBwcmV2X3R5cGUgPSBQUklWKHJlY190eXBlKTsKLQotICAgICAgaWYgKHRhcmdldF92ZWN0b3IgPT0gMCkKLQl7Ci0JICBpZiAocHJldl90eXBlIDw9IE9CSl9TX0NfTUFYUkVDVFlQKQotCSAgICB0YXJnZXRfdmVjdG9yID0gJnZtc192YXhfdmVjOwotCSAgZWxzZQotCSAgICB0YXJnZXRfdmVjdG9yID0gJnZtc19hbHBoYV92ZWM7Ci0JfQotCi0gICAgICBzd2l0Y2ggKHByZXZfdHlwZSkKLQl7Ci0JICBjYXNlIE9CSl9TX0NfSERSOgotCSAgY2FzZSBFT0JKX1NfQ19FTUg6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2hkciAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfRU9NOgotCSAgY2FzZSBPQkpfU19DX0VPTVc6Ci0JICBjYXNlIEVPQkpfU19DX0VFT006Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2VvbSAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfR1NEOgotCSAgY2FzZSBFT0JKX1NfQ19FR1NEOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF9nc2QgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX1RJUjoKLQkgIGNhc2UgRU9CSl9TX0NfRVRJUjoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfdGlyIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGNhc2UgT0JKX1NfQ19EQkc6Ci0JICBjYXNlIEVPQkpfU19DX0VEQkc6Ci0JICAgIGVyciA9IF9iZmRfdm1zX3NsdXJwX2RiZyAoYWJmZCwgcHJldl90eXBlKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE9CSl9TX0NfVEJUOgotCSAgY2FzZSBFT0JKX1NfQ19FVEJUOgotCSAgICBlcnIgPSBfYmZkX3Ztc19zbHVycF90YnQgKGFiZmQsIHByZXZfdHlwZSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBPQkpfU19DX0xOSzoKLQkgICAgZXJyID0gX2JmZF92bXNfc2x1cnBfbG5rIChhYmZkLCBwcmV2X3R5cGUpOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGVyciA9IC0xOwotCX0KLSAgICAgIGlmIChlcnIgIT0gMCkKLQl7Ci0jaWYgVk1TX0RFQlVHCi0JICB2bXNfZGVidWcgKDIsICJzbHVycCB0eXBlICVkIGZhaWxlZCB3aXRoICVkXG4iLCBwcmV2X3R5cGUsIGVycik7Ci0jZW5kaWYKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgd2hpbGUgKChwcmV2X3R5cGUgIT0gRU9CSl9TX0NfRUVPTSkgJiYgKHByZXZfdHlwZSAhPSBPQkpfU19DX0VPTSkgJiYgKHByZXZfdHlwZSAhPSBPQkpfU19DX0VPTVcpKTsKLQotICBpZiAodGFyZ2V0X3ZlY3RvciA9PSAmdm1zX3ZheF92ZWMpCi0gICAgewotICAgICAgaWYgKHZtc19maXh1cF9zZWN0aW9ucyAoYWJmZCkgPT0gZmFsc2UpCi0JewotI2lmIFZNU19ERUJVRwotCSAgdm1zX2RlYnVnICgyLCAidm1zX2ZpeHVwX3NlY3Rpb25zIGZhaWxlZFxuIik7Ci0jZW5kaWYKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBzZXQgYXJjaF9pbmZvIHRvIHZheCAgKi8KLSAKLSAgICAgIGFyY2ggPSBiZmRfc2Nhbl9hcmNoICgidmF4Iik7Ci0gICAgICBQUklWIChpc192YXgpID0gMTsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoMiwgImFyY2ggaXMgdmF4XG4iKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAodGFyZ2V0X3ZlY3RvciA9PSAmdm1zX2FscGhhX3ZlYykKLSAgICB7Ci0gICAgICAvKiBzZXQgYXJjaF9pbmZvIHRvIGFscGhhICAqLwotIAotICAgICAgYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJhbHBoYSIpOwotICAgICAgUFJJViAoaXNfdmF4KSA9IDA7Ci0jaWYgVk1TX0RFQlVHCi0gICAgICB2bXNfZGVidWcgKDIsICJhcmNoIGlzIGFscGhhXG4iKTsKLSNlbmRpZgotICAgIH0KLQotICBpZiAoYXJjaCA9PSAwKQotICAgIHsKLSNpZiBWTVNfREVCVUcKLSAgICAgIHZtc19kZWJ1ZyAoMiwgImFyY2ggbm90IGZvdW5kXG4iKTsKLSNlbmRpZgotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3dyb25nX2Zvcm1hdCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7Ci0KLSAgcmV0dXJuIHRhcmdldF92ZWN0b3I7Ci19Ci0KLQotLyogQ2hlY2sgdGhlIGZvcm1hdCBmb3IgYSBmaWxlIGJlaW5nIHJlYWQuCi0gICBSZXR1cm4gYSAoYmZkX3RhcmdldCAqKSBpZiBpdCdzIGFuIGFyY2hpdmUgZmlsZSBvciB6ZXJvLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBiZmRfdGFyZ2V0ICoKLXZtc19hcmNoaXZlX3AgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2FyY2hpdmVfcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogU2V0IHRoZSBmb3JtYXQgb2YgYSBmaWxlIGJlaW5nIHdyaXR0ZW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX21rb2JqZWN0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19ta29iamVjdCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKCF2bXNfaW5pdGlhbGl6ZSAoYWJmZCkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAidm1zX2luaXRpYWxpemUgKCkgZmFpbGVkICEhXG4iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICB7Ci0jaWZkZWYgX19WQVgKLSAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2ggPSBiZmRfc2Nhbl9hcmNoICgidmF4Iik7Ci0jZWxzZQotICAgIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IGJmZF9zY2FuX2FyY2ggKCJhbHBoYSIpOwotI2VuZGlmCi0gICAgaWYgKGFyY2ggPT0gMCkKLSAgICAgIHsKLQliZmRfc2V0X2Vycm9yKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotCXJldHVybiAwOwotICAgICAgfQotICAgIGFiZmQtPmFyY2hfaW5mbyA9IGFyY2g7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBXcml0ZSBjYWNoZWQgaW5mb3JtYXRpb24gaW50byBhIGZpbGUgYmVpbmcgd3JpdHRlbiwgYXQgYmZkX2Nsb3NlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc193cml0ZV9vYmplY3RfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3dyaXRlX29iamVjdF9jb250ZW50cyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0KLSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiAwKQkJCS8qIHdlIGhhdmUgc2VjdGlvbnMgKi8KLSAgICB7Ci0gICAgICBpZiAoUFJJVihpc192YXgpKQotCXsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9oZHIgKGFiZmQsIE9CSl9TX0NfSERSKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZ3NkIChhYmZkLCBPQkpfU19DX0dTRCkgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKF9iZmRfdm1zX3dyaXRlX3RpciAoYWJmZCwgT0JKX1NfQ19USVIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIE9CSl9TX0NfVEJUKSAhPSAwKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfZGJnIChhYmZkLCBPQkpfU19DX0RCRykgIT0gMCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiAyNTUpCi0JICAgIHsKLQkgICAgICBpZiAoX2JmZF92bXNfd3JpdGVfZW9tIChhYmZkLCBPQkpfU19DX0VPTVcpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKF9iZmRfdm1zX3dyaXRlX2VvbSAoYWJmZCwgT0JKX1NfQ19FT00pICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoX2JmZF92bXNfd3JpdGVfaGRyIChhYmZkLCBFT0JKX1NfQ19FTUgpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9nc2QgKGFiZmQsIEVPQkpfU19DX0VHU0QpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90aXIgKGFiZmQsIEVPQkpfU19DX0VUSVIpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV90YnQgKGFiZmQsIEVPQkpfU19DX0VUQlQpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9kYmcgKGFiZmQsIEVPQkpfU19DX0VEQkcpICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChfYmZkX3Ztc193cml0ZV9lb20gKGFiZmQsIEVPQkpfU19DX0VFT00pICE9IDApCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyotLSA0LjEsIGdlbmVyaWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBDYWxsZWQgd2hlbiB0aGUgQkZEIGlzIGJlaW5nIGNsb3NlZCB0byBkbyBhbnkgbmVjZXNzYXJ5IGNsZWFudXAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2Nsb3NlX2FuZF9jbGVhbnVwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHZtc19zZWN0aW9uICplcywgKmVzMTsKLSAgdm1zX3JlbG9jICplciwgKmVyMTsKLSAgaW50IGk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nsb3NlX2FuZF9jbGVhbnVwKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgaWYgKGFiZmQgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoUFJJVih2bXNfYnVmKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKFBSSVYodm1zX2J1ZikpOwotICAgICAgUFJJVih2bXNfYnVmKSA9IE5VTEw7Ci0gICAgfQotICBQUklWKGJ1Zl9zaXplKSA9IDA7Ci0KLSAgaWYgKFBSSVYob3V0cHV0X2J1ZikgIT0gMCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKG91dHB1dF9idWYpKTsKLSAgICAgIFBSSVYob3V0cHV0X2J1ZikgPSAwOwotICAgIH0KLQotICBzZWMgPSBhYmZkLT5zZWN0aW9uczsKLSAgd2hpbGUgKHNlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzZWMtPmNvbnRlbnRzKQotCWZyZWUgKHNlYy0+Y29udGVudHMpOwotICAgICAgc2VjID0gc2VjLT5uZXh0OwotICAgIH0KLQotICBpZiAoUFJJVihzZWN0aW9ucykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHNlY3Rpb25zKSk7Ci0gICAgICBQUklWKHNlY3Rpb25zKSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChQUklWKHZtc19zeW1ib2xfdGFibGUpKQotICAgIHsKLSAgICAgIGJmZF9oYXNoX3RhYmxlX2ZyZWUgKFBSSVYodm1zX3N5bWJvbF90YWJsZSkpOwotICAgICAgUFJJVih2bXNfc3ltYm9sX3RhYmxlKSA9IDA7Ci0gICAgfQotCi0gIGlmIChQUklWKHN0YWNrKSkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKHN0YWNrKSk7Ci0gICAgICBQUklWKHN0YWNrKSA9IDA7Ci0gICAgfQotCi0gIGlmIChQUklWKGxvY2F0aW9uX3N0YWNrKSkKLSAgICB7Ci0gICAgICBmcmVlIChQUklWKGxvY2F0aW9uX3N0YWNrKSk7Ci0gICAgICBQUklWKGxvY2F0aW9uX3N0YWNrKSA9IDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBWTVNfU0VDVElPTl9DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGVzID0gUFJJVih2bXNfc2VjdGlvbl90YWJsZSlbaV07Ci0gICAgICB3aGlsZSAoZXMgIT0gTlVMTCkKLQl7Ci0JICBlczEgPSBlcy0+bmV4dDsKLQkgIGZyZWUgKGVzKTsKLQkgIGVzID0gZXMxOwotCX0KLSAgICAgIFBSSVYodm1zX3NlY3Rpb25fdGFibGUpW2ldID0gTlVMTDsKLSAgIH0KLQotICBmcmVlIChhYmZkLT50ZGF0YS5hbnkpOwotICBhYmZkLT50ZGF0YS5hbnkgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIEFzayB0aGUgQkZEIHRvIGZyZWUgYWxsIGNhY2hlZCBpbmZvcm1hdGlvbi4gICovCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9mcmVlX2NhY2hlZF9pbmZvIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZnJlZV9jYWNoZWRfaW5mbyglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENhbGxlZCB3aGVuIGEgbmV3IHNlY3Rpb24gaXMgY3JlYXRlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfbmV3X3NlY3Rpb25faG9vayAoYWJmZCwgc2VjdGlvbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX25ld19zZWN0aW9uX2hvb2sgKCVwLCBbJWRdJXMpLCBjb3VudCAlZFxuIiwgYWJmZCwgc2VjdGlvbi0+aW5kZXgsIHNlY3Rpb24tPm5hbWUsIGFiZmQtPnNlY3Rpb25fY291bnQpOwotI2VuZGlmCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoYWJmZCwgc2VjdGlvbiwgNCk7Ci0KLSAgaWYgKGFiZmQtPnNlY3Rpb25fY291bnQgPiBQUklWKHNlY3Rpb25fY291bnQpKQotICAgIHsKLSAgICAgIFBSSVYoc2VjdGlvbnMpID0gKChhc2VjdGlvbiAqKikKLQkJCSAgICBiZmRfcmVhbGxvYyAoUFJJVihzZWN0aW9ucyksIGFiZmQtPnNlY3Rpb25fY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gICAgICBpZiAoUFJJVihzZWN0aW9ucykgPT0gMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBQUklWKHNlY3Rpb25fY291bnQpID0gYWJmZC0+c2VjdGlvbl9jb3VudDsKLSAgICB9Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoNiwgInNlY3Rpb25fY291bnQ6ICVkXG4iLCBQUklWKHNlY3Rpb25fY291bnQpKTsKLSNlbmRpZgotICBQUklWKHNlY3Rpb25zKVtzZWN0aW9uLT5pbmRleF0gPSBzZWN0aW9uOwotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDcsICIlZDogJXNcbiIsIHNlY3Rpb24tPmluZGV4LCBzZWN0aW9uLT5uYW1lKTsKLSNlbmRpZgotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4KLSAgIGJ1ZiBwb2ludHMgdG8gYSBidWZmZXIgb2YgYnVmX3NpemUgYnl0ZXMgdG8gYmUgZmlsbGVkIHdpdGgKLSAgIHNlY3Rpb24gZGF0YSAoc3RhcnRpbmcgYXQgb2Zmc2V0IGludG8gc2VjdGlvbikgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGJ1Ziwgb2Zmc2V0LCBidWZfc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGJ1ZjsKLSAgICAgZmlsZV9wdHIgb2Zmc2V0OwotICAgICBiZmRfc2l6ZV90eXBlIGJ1Zl9zaXplOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3NlY3Rpb25fY29udGVudHMoJXAsICVzLCAlcCwgb2ZmICVsZCwgc2l6ZSAlZClcbiIsCi0JCSBhYmZkLCBzZWN0aW9uLT5uYW1lLCBidWYsIG9mZnNldCwgKGludClidWZfc2l6ZSk7Ci0jZW5kaWYKLQotICAvKiBzaG91bGRuJ3QgYmUgY2FsbGVkLCBzaW5jZSBhbGwgc2VjdGlvbnMgYXJlIElOX01FTU9SWSAgKi8KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgc2VjdGlvbi4KLSAgIGJ1ZiBwb2ludHMgdG8gYSBidWZmZXIgb2YgYnVmX3NpemUgYnl0ZXMgdG8gYmUgZmlsbGVkIHdpdGgKLSAgIHNlY3Rpb24gZGF0YSAoc3RhcnRpbmcgYXQgb2Zmc2V0IGludG8gc2VjdGlvbikgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93IChhYmZkLCBzZWN0aW9uLCB3LCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfd2luZG93ICp3OwotICAgICBmaWxlX3B0ciBvZmZzZXQ7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc2VjdGlvbl9jb250ZW50c19pbl93aW5kb3coJXAsICVzLCAlcCwgb2ZmICVsZCwgY291bnQgJWQpXG4iLAotCQkgYWJmZCwgc2VjdGlvbi0+bmFtZSwgdywgb2Zmc2V0LCAoaW50KWNvdW50KTsKLSNlbmRpZgotCi0gIC8qIHNob3VsZG4ndCBiZSBjYWxsZWQsIHNpbmNlIGFsbCBzZWN0aW9ucyBhcmUgSU5fTUVNT1JZICAqLwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuMiwgY29weSBwcml2YXRlIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBDYWxsZWQgdG8gY29weSBCRkQgZ2VuZXJhbCBwcml2YXRlIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEgKHNyYywgZGVzdCkKLSAgICAgYmZkICpzcmM7Ci0gICAgIGJmZCAqZGVzdDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfYmZkX2RhdGEoJXAsICVwKVxuIiwgc3JjLCBkZXN0KTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBNZXJnZSBwcml2YXRlIEJGRCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBCRkQgQHZhcntpYmZkfSB0byB0aGUKLSAgIHRoZSBvdXRwdXQgZmlsZSBCRkQgQHZhcntvYmZkfSB3aGVuIGxpbmtpbmcuICBSZXR1cm4gPDx0cnVlPj4KLSAgIG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotCi0gICBvIDw8YmZkX2Vycm9yX25vX21lbW9yeT4+IC0KLSAgICAgTm90IGVub3VnaCBtZW1vcnkgZXhpc3RzIHRvIGNyZWF0ZSBwcml2YXRlIGRhdGEgZm9yIEB2YXJ7b2JmZH0uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpYmZkLCBvYmZkKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCJ2bXNfYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoJXAsICVwKVxuIiwgaWJmZCwgb2JmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogU2V0IHByaXZhdGUgQkZEIGZsYWcgaW5mb3JtYXRpb24gaW4gdGhlIEJGRCBAdmFye2FiZmR9LgotICAgUmV0dXJuIDw8dHJ1ZT4+IG9uIHN1Y2Nlc3MsIDw8ZmFsc2U+PiBvbiBlcnJvci4gIFBvc3NpYmxlIGVycm9yCi0gICByZXR1cm5zIGFyZToKLQotICAgbyA8PGJmZF9lcnJvcl9ub19tZW1vcnk+PiAtCi0gICAgIE5vdCBlbm91Z2ggbWVtb3J5IGV4aXN0cyB0byBjcmVhdGUgcHJpdmF0ZSBkYXRhIGZvciBAdmFye29iZmR9LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKGFiZmQsIGZsYWdzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGZsYWd3b3JkIGZsYWdzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsInZtc19iZmRfc2V0X3ByaXZhdGVfZmxhZ3MoJXAsICVseClcbiIsIGFiZmQsIChsb25nKWZsYWdzKTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBDYWxsZWQgdG8gY29weSBCRkQgcHJpdmF0ZSBzZWN0aW9uIGRhdGEgZnJvbSBvbmUgb2JqZWN0IGZpbGUKLSAgIHRvIGFub3RoZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhIChzcmNiZmQsIHNyY3NlYywgZHN0YmZkLCBkc3RzZWMpCi0gICAgIGJmZCAqc3JjYmZkOwotICAgICBhc2VjdGlvbiAqc3Jjc2VjOwotICAgICBiZmQgKmRzdGJmZDsKLSAgICAgYXNlY3Rpb24gKmRzdHNlYzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9jb3B5X3ByaXZhdGVfc2VjdGlvbl9kYXRhKCVwLCAlcywgJXAsICVzKVxuIiwKLQkJIHNyY2JmZCwgc3Jjc2VjLT5uYW1lLCBkc3RiZmQsIGRzdHNlYy0+bmFtZSk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENhbGxlZCB0byBjb3B5IEJGRCBwcml2YXRlIHN5bWJvbCBkYXRhIGZyb20gb25lIG9iamVjdCBmaWxlCi0gICB0byBhbm90aGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gCi12bXNfYmZkX2NvcHlfcHJpdmF0ZV9zeW1ib2xfZGF0YSAoaWJmZCwgaXN5bSwgb2JmZCwgb3N5bSkKLSAgICAgYmZkICppYmZkOwotICAgICBhc3ltYm9sICppc3ltOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzeW1ib2wgKm9zeW07Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfY29weV9wcml2YXRlX3N5bWJvbF9kYXRhKCVwLCAlcywgJXAsICVzKVxuIiwKLQkJIGliZmQsIGlzeW0tPm5hbWUsIG9iZmQsIG9zeW0tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKi0tIFBhcnQgNC4zLCBjb3JlIGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFJldHVybiBhIHJlYWQtb25seSBzdHJpbmcgZXhwbGFpbmluZyB3aGljaCBwcm9ncmFtIHdhcyBydW5uaW5nCi0gICB3aGVuIGl0IGZhaWxlZCBhbmQgcHJvZHVjZWQgdGhlIGNvcmUgZmlsZSBhYmZkLiAgKi8KLQotc3RhdGljIGNoYXIgKgotdm1zX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZXR1cm5zIHRoZSBzaWduYWwgbnVtYmVyIHdoaWNoIGNhdXNlZCB0aGUgY29yZSBkdW1wIHdoaWNoCi0gICBnZW5lcmF0ZWQgdGhlIGZpbGUgdGhlIEJGRCBhYmZkIGlzIGF0dGFjaGVkIHRvLiAgKi8KLQotc3RhdGljIGludAotdm1zX2NvcmVfZmlsZV9mYWlsaW5nX3NpZ25hbCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfY29yZV9maWxlX2ZhaWxpbmdfc2lnbmFsKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGNvcmUgZmlsZSBhdHRhY2hlZCB0byBjb3JlX2JmZCB3YXMgZ2VuZXJhdGVkCi0gICBieSBhIHJ1biBvZiB0aGUgZXhlY3V0YWJsZSBmaWxlIGF0dGFjaGVkIHRvIGV4ZWNfYmZkLCBmYWxzZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2NvcmVfZmlsZV9tYXRjaGVzX2V4ZWN1dGFibGVfcCAoYWJmZCwgYmJmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKmJiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jb3JlX2ZpbGVfbWF0Y2hlc19leGVjdXRhYmxlX3AoJXAsICVwKVxuIiwgYWJmZCwgYmJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKi0tIFBhcnQgNC40LCBhcmNoaXZlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qID8/PwlkbyBzb21ldGhpbmcgd2l0aCBhbiBhcmNoaXZlIG1hcC4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NsdXJwX2FybWFwIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19zbHVycF9hcm1hcCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiA/Pz8JZG8gc29tZXRoaW5nIHdpdGggYW4gZXh0ZW5kZWQgbmFtZSB0YWJsZS4KLSAgIFJldHVybiBmYWxzZSBvbiBlcnJvciwgdHJ1ZSBvdGhlcndpc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NsdXJwX2V4dGVuZGVkX25hbWVfdGFibGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogPz8/CWRvIHNvbWV0aGluZyB3aXRoIGFuIGV4dGVuZGVkIG5hbWUgdGFibGUuCi0gICBSZXR1cm4gZmFsc2Ugb24gZXJyb3IsIHRydWUgb3RoZXJ3aXNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19jb25zdHJ1Y3RfZXh0ZW5kZWRfbmFtZV90YWJsZSAoYWJmZCwgdGFibG9jLCB0YWJsZW4sIG5hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY2hhciAqKnRhYmxvYzsKLSAgICAgYmZkX3NpemVfdHlwZSAqdGFibGVuOwotICAgICBjb25zdCBjaGFyICoqbmFtZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2NvbnN0cnVjdF9leHRlbmRlZF9uYW1lX3RhYmxlKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0KLS8qIFRydW5jYXRlIHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgdG8gbWF0Y2ggc3lzdGVtLWRlcGVuZGVudCByZXN0cmljdGlvbnMgICovCi0KLXN0YXRpYyB2b2lkCi12bXNfdHJ1bmNhdGVfYXJuYW1lIChhYmZkLCBwYXRobmFtZSwgYXJoZHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgQ09OU1QgY2hhciAqcGF0aG5hbWU7Ci0gICAgIGNoYXIgKmFyaGRyOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfdHJ1bmNhdGVfYXJuYW1lKCVwLCAlcywgJXMpXG4iLCBhYmZkLCBwYXRobmFtZSwgYXJoZHIpOwotI2VuZGlmCi0gIHJldHVybjsKLX0KLQotCi0vKiA/Pz8Jd3JpdGUgYXJjaGl2ZSBtYXAgICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfd3JpdGVfYXJtYXAgKGFyY2gsIGVsZW5ndGgsIG1hcCwgb3JsX2NvdW50LCBzdHJpZHgpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgdW5zaWduZWQgaW50IGVsZW5ndGg7Ci0gICAgIHN0cnVjdCBvcmwgKm1hcDsKLSAgICAgdW5zaWduZWQgaW50IG9ybF9jb3VudDsKLSAgICAgaW50IHN0cmlkeDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3dyaXRlX2FybWFwKCVwLCAlZCwgJXAsICVkICVkKVxuIiwKLQlhcmNoLCBlbGVuZ3RoLCBtYXAsIG9ybF9jb3VudCwgc3RyaWR4KTsKLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBhcmNoaXZlIGhlYWRlciA/Pz8gICovCi0KLXN0YXRpYyBQVFIKLXZtc19yZWFkX2FyX2hkciAoYWJmZCkKLSAgICBiZmQgKiBhYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcmVhZF9hcl9oZHIoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gKFBUUikwOwotfQotCi0KLS8qIFByb3ZpZGVkIGEgQkZELCBAdmFye2FyY2hpdmV9LCBjb250YWluaW5nIGFuIGFyY2hpdmUgYW5kIE5VTEwsIG9wZW4KLSAgIGFuIGlucHV0IEJGRCBvbiB0aGUgZmlyc3QgY29udGFpbmVkIGVsZW1lbnQgYW5kIHJldHVybnMgdGhhdC4KLSAgIFN1YnNlcXVlbnQgY2FsbHMgc2hvdWxkIHBhc3MgdGhlIGFyY2hpdmUgYW5kIHRoZSBwcmV2aW91cyByZXR1cm4gdmFsdWUKLSAgIHRvIHJldHVybiBhIGNyZWF0ZWQgQkZEIHRvIHRoZSBuZXh0IGNvbnRhaW5lZCBlbGVtZW50LgotICAgTlVMTCBpcyByZXR1cm5lZCB3aGVuIHRoZXJlIGFyZSBubyBtb3JlLiAgKi8KLQotc3RhdGljIGJmZCAqCi12bXNfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBwcmV2KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSglcCwgJXApXG4iLCBhcmNoLCBwcmV2KTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogUmV0dXJuIHRoZSBCRkQgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ltYm9sIGluIEFCRkQgaW5kZXhlZCBieQotICAgSU5ERVguICBJTkRFWCBzaG91bGQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGJmZF9nZXRfbmV4dF9tYXBlbnQuICAqLwotCi1zdGF0aWMgYmZkICoKLXZtc19nZXRfZWx0X2F0X2luZGV4IChhYmZkLCBpbmRleCkKLSAgICAgYmZkICphYmZkOwotICAgICBzeW1pbmRleCBpbmRleDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9lbHRfYXRfaW5kZXgoJXAsICVwKVxuIiwgYWJmZCwgaW5kZXgpOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfZ2V0X2VsdF9hdF9pbmRleChhYmZkLCBpbmRleCk7Ci19Ci0KLQotLyogPz8/Ci0gICAtPiBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0ICAqLwotCi1zdGF0aWMgaW50Ci12bXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0IChhYmZkLCBzdGF0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBzdGF0ICpzdGF0OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KCVwLCAlcClcbiIsIGFiZmQsIHN0YXQpOwotI2VuZGlmCi0gIHJldHVybiBiZmRfZ2VuZXJpY19zdGF0X2FyY2hfZWx0KGFiZmQsIHN0YXQpOwotfQotCi0KLS8qIFRoaXMgaXMgYSBuZXcgZnVuY3Rpb24gaW4gYmZkIDIuNSAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc191cGRhdGVfYXJtYXBfdGltZXN0YW1wIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc191cGRhdGVfYXJtYXBfdGltZXN0YW1wKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qLS0gUGFydCA0LjUsIHN5bWJvbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSBhIHZlY3RvciBvZiBwb2ludGVycwotICAgdG8gYXN5bWJvbHMgZm9yIGFsbCB0aGUgc3ltYm9scyBpbiB0aGUgQkZEIGFiZmQsIGluY2x1ZGluZyBhCi0gICB0ZXJtaW5hbCBOVUxMIHBvaW50ZXIuIElmIHRoZXJlIGFyZSBubyBzeW1ib2xzIGluIHRoZSBCRkQsCi0gICB0aGVuIHJldHVybiAwLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCByZXR1cm4gLTEuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9zeW10YWJfdXBwZXJfYm91bmQoJXApLCAlZCBzeW1ib2xzXG4iLCBhYmZkLCBQUklWKGdzZF9zeW1fY291bnQpKTsKLSNlbmRpZgotICByZXR1cm4gKFBSSVYoZ3NkX3N5bV9jb3VudCkrMSkgKiBzaXplb2YoYXN5bWJvbCAqKTsKLX0KLQotCi0vKiBDb3B5IHN5bWJvbHMgZnJvbSBoYXNoIHRhYmxlIHRvIHN5bWJvbCB2ZWN0b3IKLQotICAgY2FsbGVkIGZyb20gYmZkX2hhc2hfdHJhdmVyc2UgaW4gdm1zX2dldF9zeW10YWIKLSAgIGluaXQgY291bnRlciB0byAwIGlmIGVudHJ5ID09IDAgICovCi0KLXN0YXRpYyBib29sZWFuCi1jb3B5X3N5bWJvbHMgKGVudHJ5LCBhcmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIFBUUiBhcmc7Ci17Ci0gIGJmZCAqYWJmZCA9IChiZmQgKikgYXJnOwotCi0gIGlmIChlbnRyeSA9PSBOVUxMKQkvKiBpbml0IGNvdW50ZXIgKi8KLSAgICBQUklWKHN5bW51bSkgPSAwOwotICBlbHNlCQkJLyogZmlsbCB2ZWN0b3IsIGluYyBjb3VudGVyICovCi0gICAgUFJJVihzeW1jYWNoZSlbUFJJVihzeW1udW0pKytdID0gKCh2bXNfc3ltYm9sX2VudHJ5ICopZW50cnkpLT5zeW1ib2w7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogUmVhZCB0aGUgc3ltYm9scyBmcm9tIHRoZSBCRkQgYWJmZCwgYW5kIGZpbGxzIGluIHRoZSB2ZWN0b3IKLSAgIGxvY2F0aW9uIHdpdGggcG9pbnRlcnMgdG8gdGhlIHN5bWJvbHMgYW5kIGEgdHJhaWxpbmcgTlVMTC4KLQotICAgcmV0dXJuICMgb2Ygc3ltYm9scyByZWFkICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2dldF9zeW10YWIgKGFiZmQsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltdGFiKCVwLCA8cmV0PilcbiIsIGFiZmQpOwotI2VuZGlmCi0KLQkvKiBpbml0IGNvdW50ZXIgKi8KLSAgKHZvaWQpY29weV9zeW1ib2xzKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikwLCBhYmZkKTsKLQotCS8qIHRyYXZlcnNlIHRhYmxlIGFuZCBmaWxsIHN5bWJvbHMgdmVjdG9yICovCi0KLSAgUFJJVihzeW1jYWNoZSkgPSBzeW1ib2xzOwotICBiZmRfaGFzaF90cmF2ZXJzZShQUklWKHZtc19zeW1ib2xfdGFibGUpLCBjb3B5X3N5bWJvbHMsIChQVFIpYWJmZCk7Ci0KLSAgc3ltYm9sc1tQUklWKGdzZF9zeW1fY291bnQpXSA9IE5VTEw7Ci0KLSAgcmV0dXJuIFBSSVYoZ3NkX3N5bV9jb3VudCk7Ci19Ci0KLQotLyogQ3JlYXRlIGEgbmV3IGFzeW1ib2wgc3RydWN0dXJlIGZvciB0aGUgQkZEIGFiZmQgYW5kIHJldHVybiBhIHBvaW50ZXIKLSAgIHRvIGl0LgotICAgVGhpcyByb3V0aW5lIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGVhY2ggYmFjayBlbmQgaGFzIHByaXZhdGUgaW5mb3JtYXRpb24KLSAgIHN1cnJvdW5kaW5nIHRoZSBhc3ltYm9sLiBCdWlsZGluZyB5b3VyIG93biBhc3ltYm9sIGFuZCBwb2ludGluZyB0byBpdAotICAgd2lsbCBub3QgY3JlYXRlIHRoZSBwcml2YXRlIGluZm9ybWF0aW9uLCBhbmQgd2lsbCBjYXVzZSBwcm9ibGVtcyBsYXRlciBvbi4gICovCi0KLWFzeW1ib2wgKgotX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqc3ltYm9sID0gKGFzeW1ib2wgKiliZmRfemFsbG9jKGFiZmQsIHNpemVvZihhc3ltYm9sKSk7Ci0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAiX2JmZF92bXNfbWFrZV9lbXB0eV9zeW1ib2woJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotCi0gIGlmIChzeW1ib2wgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fbWVtb3J5KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgc3ltYm9sLT50aGVfYmZkID0gYWJmZDsKLQotICByZXR1cm4gc3ltYm9sOwotfQotCi0KLS8qIFByaW50IHN5bWJvbCB0byBmaWxlIGFjY29yZGluZyB0byBob3cuIGhvdyBpcyBvbmUgb2YKLSAgIGJmZF9wcmludF9zeW1ib2xfbmFtZQlqdXN0IHByaW50IHRoZSBuYW1lCi0gICBiZmRfcHJpbnRfc3ltYm9sX21vcmUJcHJpbnQgbW9yZSAoPz8/KQotICAgYmZkX3ByaW50X3N5bWJvbF9hbGwJcHJpbnQgYWxsIHdlIGtub3csIHdoaWNoIGlzIG5vdCBtdWNoIHJpZ2h0IG5vdyA6LSkgICovCi0KLXN0YXRpYyB2b2lkCi12bXNfcHJpbnRfc3ltYm9sIChhYmZkLCBmaWxlLCBzeW1ib2wsIGhvdykKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZmlsZTsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBiZmRfcHJpbnRfc3ltYm9sX3R5cGUgaG93OwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfcHJpbnRfc3ltYm9sKCVwLCAlcCwgJXAsICVkKVxuIiwgYWJmZCwgZmlsZSwgc3ltYm9sLCBob3cpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChob3cpCi0gICAgewotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX25hbWU6Ci0gICAgICBjYXNlIGJmZF9wcmludF9zeW1ib2xfbW9yZToKLQlmcHJpbnRmKChGSUxFICopZmlsZSwiICVzIiwgc3ltYm9sLT5uYW1lKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICBicmVhazsKLQotICAgICAgY2FzZSBiZmRfcHJpbnRfc3ltYm9sX2FsbDoKLQl7Ci0JICBDT05TVCBjaGFyICpzZWN0aW9uX25hbWUgPSBzeW1ib2wtPnNlY3Rpb24tPm5hbWU7Ci0KLQkgIGJmZF9wcmludF9zeW1ib2xfdmFuZGYoKFBUUilmaWxlLHN5bWJvbCk7Ci0KLQkgIGZwcmludGYoKEZJTEUgKilmaWxlLCIgJS04cyAlcyIsIHNlY3Rpb25fbmFtZSwgc3ltYm9sLT5uYW1lKTsKLSAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm47Ci19Ci0KLQotLyogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHN5bWJvbCBpbiByZXQuCi0KLSAgIGZpbGwgdHlwZSwgdmFsdWUgYW5kIG5hbWUKLSAgIHR5cGU6Ci0JQQlhYnNvbHV0ZQotCUIJYnNzIHNlZ21lbnQgc3ltYm9sCi0JQwljb21tb24gc3ltYm9sCi0JRAlkYXRhIHNlZ21lbnQgc3ltYm9sCi0JZglmaWxlbmFtZQotCXQJYSBzdGF0aWMgZnVuY3Rpb24gc3ltYm9sCi0JVAl0ZXh0IHNlZ21lbnQgc3ltYm9sCi0JVQl1bmRlZmluZWQKLQktCWRlYnVnICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltYm9sLCByZXQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqc3ltYm9sOwotICAgICBzeW1ib2xfaW5mbyAqcmV0OwotewotICBhc2VjdGlvbiAqc2VjOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfc3ltYm9sX2luZm8oJXAsICVwLCAlcClcbiIsIGFiZmQsIHN5bWJvbCwgcmV0KTsKLSNlbmRpZgotCi0gIHNlYyA9IHN5bWJvbC0+c2VjdGlvbjsKLQotICBpZiAocmV0ID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0MnOwotICBlbHNlIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0EnOwotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ1UnOwotICBlbHNlIGlmIChiZmRfaXNfaW5kX3NlY3Rpb24gKHNlYykpCi0gICAgcmV0LT50eXBlID0gJ0knOwotICBlbHNlIGlmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkKLSAgICByZXQtPnR5cGUgPSAnVCc7Ci0gIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19EQVRBKQotICAgIHJldC0+dHlwZSA9ICdEJzsKLSAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCBzZWMpICYgU0VDX0FMTE9DKQotICAgIHJldC0+dHlwZSA9ICdCJzsKLSAgZWxzZQotICAgIHJldC0+dHlwZSA9ICctJzsKLQotICBpZiAocmV0LT50eXBlICE9ICdVJykKLSAgICByZXQtPnZhbHVlID0gc3ltYm9sLT52YWx1ZSArIHN5bWJvbC0+c2VjdGlvbi0+dm1hOwotICBlbHNlCi0gICAgcmV0LT52YWx1ZSA9IDA7Ci0gIHJldC0+bmFtZSA9IHN5bWJvbC0+bmFtZTsKLQotICByZXR1cm47Ci19Ci0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN5bWJvbCBzeW0gaW4gdGhlIEJGRCBhYmZkIGlzCi0gICBhIGNvbXBpbGVyIGdlbmVyYXRlZCBsb2NhbCBsYWJlbCwgZWxzZSByZXR1cm4gZmFsc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9pc19sb2NhbF9sYWJlbF9uYW1lIChhYmZkLCBuYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSglcCwgJXMpXG4iLCBhYmZkLCBuYW1lKTsKLSNlbmRpZgotICByZXR1cm4gbmFtZVswXSA9PSAnJCc7Ci19Ci0KLQotLyogR2V0IHNvdXJjZSBsaW5lIG51bWJlciBmb3Igc3ltYm9sICAqLwotCi1zdGF0aWMgYWxlbnQgKgotdm1zX2dldF9saW5lbm8gKGFiZmQsIHN5bWJvbCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICpzeW1ib2w7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19nZXRfbGluZW5vKCVwLCAlcClcbiIsIGFiZmQsIHN5bWJvbCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogUHJvdmlkZWQgYSBCRkQsIGEgc2VjdGlvbiBhbmQgYW4gb2Zmc2V0IGludG8gdGhlIHNlY3Rpb24sIGNhbGN1bGF0ZSBhbmQKLSAgIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgYW5kIHRoZSBsaW5lIG5lYXJlc3QgdG8gdGhlIHdhbnRlZAotICAgbG9jYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1ib2xzLCBvZmZzZXQsIGZpbGUsIGZ1bmMsIGxpbmUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotICAgICBiZmRfdm1hIG9mZnNldDsKLSAgICAgQ09OU1QgY2hhciAqKmZpbGU7Ci0gICAgIENPTlNUIGNoYXIgKipmdW5jOwotICAgICB1bnNpZ25lZCBpbnQgKmxpbmU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19maW5kX25lYXJlc3RfbGluZSglcCwgJXMsICVwLCAlbGQsIDxyZXQ+LCA8cmV0PiwgPHJldD4pXG4iLAotCSAgICAgIGFiZmQsIHNlY3Rpb24tPm5hbWUsIHN5bWJvbHMsIChsb25nIGludClvZmZzZXQpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBCYWNrLWRvb3IgdG8gYWxsb3cgZm9ybWF0LWF3YXJlIGFwcGxpY2F0aW9ucyB0byBjcmVhdGUgZGVidWcgc3ltYm9scwotICAgd2hpbGUgdXNpbmcgQkZEIGZvciBldmVyeXRoaW5nIGVsc2UuICBDdXJyZW50bHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyCi0gICB3aGVuIGNyZWF0aW5nIENPRkYgZmlsZXMuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqCi12bXNfYmZkX21ha2VfZGVidWdfc3ltYm9sIChhYmZkLCBwdHIsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgdm9pZCAqcHRyOwotICAgICB1bnNpZ25lZCBsb25nIHNpemU7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbWFrZV9kZWJ1Z19zeW1ib2woJXAsICVwLCAlbGQpXG4iLCBhYmZkLCBwdHIsIHNpemUpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qIFJlYWQgbWluaXN5bWJvbHMuICBGb3IgbWluaXN5bWJvbHMsIHdlIHVzZSB0aGUgdW5tb2RpZmllZCBhLm91dAotICAgc3ltYm9scy4gIFRoZSBtaW5pc3ltYm9sX3RvX3N5bWJvbCBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZXNlIGludG8KLSAgIEJGRCBhc3ltYm9sIHN0cnVjdHVyZXMuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zcCwgc2l6ZXApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgKm1pbmlzeW1zcDsKLSAgICAgdW5zaWduZWQgaW50ICpzaXplcDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3JlYWRfbWluaXN5bWJvbHMoJXAsICVkLCAlcCwgJWQpXG4iLCBhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsICpzaXplcCk7Ci0jZW5kaWYKLSAgcmV0dXJuIF9iZmRfZ2VuZXJpY19yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltc3AsIHNpemVwKTsKLX0KLQotLyogQ29udmVydCBhIG1pbmlzeW1ib2wgdG8gYSBCRkQgYXN5bWJvbC4gIEEgbWluaXN5bWJvbCBpcyBqdXN0IGFuCi0gICB1bm1vZGlmaWVkIGEub3V0IHN5bWJvbC4gIFRoZSBTWU0gYXJndW1lbnQgaXMgYSBzdHJ1Y3R1cmUgcmV0dXJuZWQKLSAgIGJ5IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCwgd2hpY2ggd2UgZmlsbCBpbiBoZXJlLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotdm1zX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBjb25zdCBQVFIgbWluaXN5bTsKLSAgICAgYXN5bWJvbCAqc3ltOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfbWluaXN5bWJvbF90b19zeW1ib2woJXAsICVkLCAlcCwgJXApXG4iLCBhYmZkLCBkeW5hbWljLCBtaW5pc3ltLCBzeW0pOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX2dlbmVyaWNfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW0sIHN5bSk7Ci19Ci0KLS8qLS0gUGFydCA0LjYsIHJlbG9jYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24KLSAgIGFzc29jaWF0ZWQgd2l0aCBzZWN0aW9uIHNlY3QgYXR0YWNoZWQgdG8gYmZkIGFiZmQuCi0gICBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybiAtMS4gICovCi0KLXN0YXRpYyBsb25nCi12bXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWN0aW9uKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kKCVwLCAlcylcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiAtMUw7Ci19Ci0KLQotLyogQ2FsbCB0aGUgYmFjayBlbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGVuIEJGRCBhYmZkIGFuZCB0cmFuc2xhdGUgdGhlCi0gICBleHRlcm5hbCBmb3JtIG9mIHRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHNlYyBpbnRvIHRoZQotICAgaW50ZXJuYWwgY2Fub25pY2FsIGZvcm0uICBQbGFjZSB0aGUgdGFibGUgaW50byBtZW1vcnkgYXQgbG9jLCB3aGljaCBoYXMKLSAgIGJlZW4gcHJlYWxsb2NhdGVkLCB1c3VhbGx5IGJ5IGEgY2FsbCB0byBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLgotICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlbG9jcywgb3IgLTEgb24gZXJyb3IuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGFyZWxlbnQgKipsb2NhdGlvbjsKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19jYW5vbmljYWxpemVfcmVsb2MoJXAsICVzLCA8cmV0PiwgPHJldD4pXG4iLCBhYmZkLCBzZWN0aW9uLT5uYW1lKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIHRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBlY29mZi1hbHBoYSwgbmVlZHMgdG8gYmUgZml4ZWQgcHJvYmFibHkgKi8KLQotLyogSG93IHRvIHByb2Nlc3MgdGhlIHZhcmlvdXMgcmVsb2MgdHlwZXMuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX3N0YXR1c190eXBlCi1yZWxvY19uaWwgKGFiZmQsIHJlbG9jLCBzeW0sIGRhdGEsIHNlYywgb3V0cHV0X2JmZCwgZXJyb3JfbWVzc2FnZSkKLSAgICAgYmZkICphYmZkOwotICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgYXN5bWJvbCAqc3ltOwotICAgICBQVFIgZGF0YTsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBjaGFyICoqZXJyb3JfbWVzc2FnZTsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAicmVsb2NfbmlsKGFiZmQgJXAsIG91dHB1dF9iZmQgJXApXG4iLCBhYmZkLCBvdXRwdXRfYmZkKTsKLSAgdm1zX2RlYnVnICgyLCAiSW4gc2VjdGlvbiAlcywgc3ltYm9sICVzXG4iLAotCXNlYy0+bmFtZSwgc3ltLT5uYW1lKTsKLSAgdm1zX2RlYnVnICgyLCAicmVsb2Mgc3ltICVzLCBhZGRyICUwOGx4LCBhZGRlbmQgJTA4bHgsIHJlbG9jIGlzIGEgJXNcbiIsCi0JCXJlbG9jLT5zeW1fcHRyX3B0clswXS0+bmFtZSwKLQkJKHVuc2lnbmVkIGxvbmcpcmVsb2MtPmFkZHJlc3MsCi0JCSh1bnNpZ25lZCBsb25nKXJlbG9jLT5hZGRlbmQsIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0gIHZtc19kZWJ1ZyAoMiwgImRhdGEgYXQgJXBcbiIsIGRhdGEpOwotLyogIF9iZmRfaGV4ZHVtcCAoMiwgZGF0YSwgYmZkX2dldF9yZWxvY19zaXplKHJlbG9jLT5ob3d0byksMCk7ICovCi0jZW5kaWYKLQotICByZXR1cm4gYmZkX3JlbG9jX29rOwotfQotCi0vKiBJbiBjYXNlIHdlJ3JlIG9uIGEgMzItYml0IG1hY2hpbmUsIGNvbnN0cnVjdCBhIDY0LWJpdCAiLTEiIHZhbHVlCi0gICBmcm9tIHNtYWxsZXIgdmFsdWVzLiAgU3RhcnQgd2l0aCB6ZXJvLCB3aWRlbiwgKnRoZW4qIGRlY3JlbWVudC4gICovCi0jZGVmaW5lIE1JTlVTX09ORQkoKChiZmRfdm1hKTApIC0gMSkKLQotc3RhdGljIHJlbG9jX2hvd3RvX3R5cGUgYWxwaGFfaG93dG9fdGFibGVbXSA9Ci17Ci0gIEhPV1RPIChBTFBIQV9SX0lHTk9SRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgOCwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiSUdOT1JFIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpLAkJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IHJlZmVyZW5jZSB0byBhIHN5bWJvbC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1JFRlFVQUQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIlJFRlFVQUQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSBNSU5VU19PTkUsCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBBIDIxIGJpdCBicmFuY2guICBUaGUgbmF0aXZlIGFzc2VtYmxlciBnZW5lcmF0ZXMgdGhlc2UgZm9yCi0gICAgIGJyYW5jaGVzIHdpdGhpbiB0aGUgdGV4dCBzZWdtZW50LCBhbmQgYWxzbyBmaWxscyBpbiB0aGUgUEMKLSAgICAgcmVsYXRpdmUgb2Zmc2V0IGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIEhPV1RPIChBTFBIQV9SX0JSQUREUiwJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjEsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiQlJBRERSIiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMHgxZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDFmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgaGludCBmb3IgYSBqdW1wIHRvIGEgcmVnaXN0ZXIuICAqLwotICBIT1dUTyAoQUxQSEFfUl9ISU5ULAkJLyogdHlwZSAqLwotCSAyLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMSwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMTQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIkhJTlQiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweDNmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweDNmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAxNiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDE2LAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAxLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAxNiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMTYiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmYsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiAzMiBiaXQgUEMgcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfU1JFTDMyLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSAyLAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSAzMiwJCQkvKiBiaXRzaXplICovCi0JIHRydWUsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJTUkVMMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIEEgNjQgYml0IFBDIHJlbGF0aXZlIG9mZnNldC4gICovCi0gIEhPV1RPIChBTFBIQV9SX1NSRUw2NCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgNCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgNjQsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiU1JFTDY0IiwJCS8qIG5hbWUgKi8KLQkgdHJ1ZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgTUlOVVNfT05FLAkJLyogc3JjX21hc2sgKi8KLQkgTUlOVVNfT05FLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogUHVzaCBhIHZhbHVlIG9uIHRoZSByZWxvYyBldmFsdWF0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFVTSCwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BVU0giLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZSBmcm9tIHRoZSBzdGFjayBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gIFN0b3JlIGl0IGluCi0gICAgIGEgYml0ZmllbGQgb2Ygc2l6ZSByX3NpemUgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIHJfb2Zmc2V0LiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfU1RPUkUsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDQsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDY0LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiT1BfU1RPUkUiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSBNSU5VU19PTkUsCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBTdWJ0cmFjdCB0aGUgcmVsb2MgYWRkcmVzcyBmcm9tIHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZQotICAgICByZWxvY2F0aW9uIHN0YWNrLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfT1BfUFNVQiwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X2RvbnQsIC8qIGNvbXBsYWluX29uX292ZXJmbG93ICovCi0JIHJlbG9jX25pbCwJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk9QX1BTVUIiLAkJLyogbmFtZSAqLwotCSBmYWxzZSwJCQkvKiBwYXJ0aWFsX2lucGxhY2UgKi8KLQkgMCwJCQkvKiBzcmNfbWFzayAqLwotCSAwLAkJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi0gIC8qIFNoaWZ0IHRoZSB2YWx1ZSBvbiB0aGUgdG9wIG9mIHRoZSByZWxvY2F0aW9uIHN0YWNrIHJpZ2h0IGJ5IHRoZQotICAgICBnaXZlbiB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX09QX1BSU0hJRlQsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJPUF9QUlNISUZUIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSksCQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotICAvKiBIYWNrLiBMaW5rYWdlIGlzIGRvbmUgYnkgbGlua2VyLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfTElOS0FHRSwJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgOCwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMjU2LAkJCS8qIGJpdHNpemUgKi8KLQkgZmFsc2UsCQkJLyogcGNfcmVsYXRpdmUgKi8KLQkgMCwJCQkvKiBiaXRwb3MgKi8KLQkgY29tcGxhaW5fb3ZlcmZsb3dfZG9udCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiTElOS0FHRSIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAwLAkJCS8qIHNyY19tYXNrICovCi0JIDAsCQkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSAzMiBiaXQgcmVmZXJlbmNlIHRvIGEgc3ltYm9sLiAgKi8KLSAgSE9XVE8gKEFMUEhBX1JfUkVGTE9ORywJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19iaXRmaWVsZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgcmVsb2NfbmlsLAkJLyogc3BlY2lhbF9mdW5jdGlvbiAqLwotCSAiUkVGTE9ORyIsCQkvKiBuYW1lICovCi0JIHRydWUsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDB4ZmZmZmZmZmYsCQkvKiBzcmNfbWFzayAqLwotCSAweGZmZmZmZmZmLAkJLyogZHN0X21hc2sgKi8KLQkgZmFsc2UpLAkJLyogcGNyZWxfb2Zmc2V0ICovCi0KLSAgLyogQSA2NCBiaXQgcmVmZXJlbmNlIHRvIGEgcHJvY2VkdXJlLCB3cml0dGVuIGFzIDMyIGJpdCB2YWx1ZS4gICovCi0gIEhPV1RPIChBTFBIQV9SX0NPREVBRERSLAkvKiB0eXBlICovCi0JIDAsCQkJLyogcmlnaHRzaGlmdCAqLwotCSA0LAkJCS8qIHNpemUgKDAgPSBieXRlLCAxID0gc2hvcnQsIDIgPSBsb25nKSAqLwotCSA2NCwJCQkvKiBiaXRzaXplICovCi0JIGZhbHNlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSByZWxvY19uaWwsCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJDT0RFQUREUiIsCQkvKiBuYW1lICovCi0JIGZhbHNlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIGZhbHNlKSwJCS8qIHBjcmVsX29mZnNldCAqLwotCi19OwotCi0vKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgaG93dG8gc3RydWN0dXJlIHdoaWNoLCB3aGVuIGludm9rZWQsIHdpbGwgcGVyZm9ybQotICAgdGhlIHJlbG9jYXRpb24gY29kZSBvbiBkYXRhIGZyb20gdGhlIGFyY2hpdGVjdHVyZSBub3RlZC4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVsb2NfaG93dG9fc3RydWN0ICoKLXZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIGNvZGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci17Ci0gIGludCBhbHBoYV90eXBlOwotCi0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcmVsb2NfdHlwZV9sb29rdXAoJXAsICVkKVx0IiwgYWJmZCwgY29kZSk7Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgICAgY2FzZSBCRkRfUkVMT0NfMTY6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMzI6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9SRUZMT05HOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DXzY0OgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGUVVBRDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19DVE9SOgkJYWxwaGFfdHlwZSA9IEFMUEhBX1JfUkVGUVVBRDsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfQlJBRERSOwlicmVhazsKLSAgICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0hJTlQ6CWFscGhhX3R5cGUgPSBBTFBIQV9SX0hJTlQ7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMTY7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMMzI7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfNjRfUENSRUw6CQlhbHBoYV90eXBlID0gQUxQSEFfUl9TUkVMNjQ7CWJyZWFrOwotICAgICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToJYWxwaGFfdHlwZSA9IEFMUEhBX1JfTElOS0FHRTsJYnJlYWs7Ci0gICAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoJYWxwaGFfdHlwZSA9IEFMUEhBX1JfQ09ERUFERFI7CWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQkoKl9iZmRfZXJyb3JfaGFuZGxlcikgKCJyZWxvYyAoJWQpIGlzICpVTktOT1dOKiIsIGNvZGUpOwotCXJldHVybiAoY29uc3Qgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCAqKSBOVUxMOwotICAgIH0KLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgyLCAicmVsb2MgaXMgJXNcbiIsIGFscGhhX2hvd3RvX3RhYmxlW2FscGhhX3R5cGVdLm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiAmYWxwaGFfaG93dG9fdGFibGVbYWxwaGFfdHlwZV07Ci19Ci0KLQotLyotLSBQYXJ0IDQuNywgd3JpdGluZyBhbiBvYmplY3QgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTZXQgdGhlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSB0eXBlIGluIEJGRCBhYmZkIHRvIGFyY2ggYW5kIG1hY2guCi0gICBGaW5kIHRoZSBjb3JyZWN0IHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgYW5kIGluc2VydCBpdCBpbnRvIHRoZSBhcmNoX2luZm8KLSAgIHBvaW50ZXIuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX3NldF9hcmNoX21hY2ggKGFiZmQsIGFyY2gsIG1hY2gpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9hcmNoX21hY2goJXAsICVkLCAlbGQpXG4iLCBhYmZkLCBhcmNoLCBtYWNoKTsKLSNlbmRpZgotICBhYmZkLT5hcmNoX2luZm8gPSBiZmRfc2Nhbl9hcmNoKCJhbHBoYSIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIFNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWN0aW9uIHNlY3Rpb24gaW4gQkZEIGFiZmQgdG8gdGhlIGRhdGEgc3RhcnRpbmcKLSAgIGluIG1lbW9yeSBhdCBkYXRhLiBUaGUgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGFydGluZyBhdAotICAgb2Zmc2V0IG9mZnNldCBmb3IgY291bnQgYnl0ZXMuCi0KLSAgIE5vcm1hbGx5IHRydWUgaXMgcmV0dXJuZWQsIGVsc2UgZmFsc2UuIFBvc3NpYmxlIGVycm9yIHJldHVybnMgYXJlOgotICAgbyBiZmRfZXJyb3Jfbm9fY29udGVudHMgLSBUaGUgb3V0cHV0IHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGUKLQlTRUNfSEFTX0NPTlRFTlRTIGF0dHJpYnV0ZSwgc28gbm90aGluZyBjYW4gYmUgd3JpdHRlbiB0byBpdC4KLSAgIG8gYW5kIHNvbWUgbW9yZSB0b28gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGxvY2F0aW9uLCBvZmZzZXQsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBQVFIgbG9jYXRpb247Ci0gICAgIGZpbGVfcHRyIG9mZnNldDsKLSAgICAgYmZkX3NpemVfdHlwZSBjb3VudDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX3NldF9zZWN0aW9uX2NvbnRlbnRzKCVwLCBzZWMgJXMsIGxvYyAlcCwgb2ZmICVsZCwgY291bnQgJWQpXG4iLAotCQkJCQlhYmZkLCBzZWN0aW9uLT5uYW1lLCBsb2NhdGlvbiwgKGxvbmcgaW50KW9mZnNldCwgKGludCljb3VudCk7Ci0gIHZtc19kZWJ1ZyAoMiwgInNlY3JhdyAlZCwgc2VjY29va2VkICVkXG4iLCAoaW50KXNlY3Rpb24tPl9yYXdfc2l6ZSwgKGludClzZWN0aW9uLT5fY29va2VkX3NpemUpOwotI2VuZGlmCi0gIHJldHVybiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24oYWJmZCwgc2VjdGlvbiwgbG9jYXRpb24sIG9mZnNldCwgY291bnQpOwotfQotCi0KLS8qLS0gUGFydCA0LjgsIGxpbmtlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogR2V0IHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlcnMuICAqLwotCi1zdGF0aWMgaW50Ci12bXNfc2l6ZW9mX2hlYWRlcnMgKGFiZmQsIHJlbG9jKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gcmVsb2M7Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19zaXplb2ZfaGVhZGVycyglcCwgJXMpXG4iLCBhYmZkLCAocmVsb2MpPyJUcnVlIjoiRmFsc2UiKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBQcm92aWRlcyBkZWZhdWx0IGhhbmRsaW5nIG9mIHJlbG9jYXRpb24gZWZmb3J0IGZvciBiYWNrIGVuZHMKLSAgIHdoaWNoIGNhbid0IGJlIGJvdGhlcmVkIHRvIGRvIGl0IGVmZmljaWVudGx5LiAgKi8KLQotc3RhdGljIGJmZF9ieXRlICoKLXZtc19iZmRfZ2V0X3JlbG9jYXRlZF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsaW5rX2luZm8sIGxpbmtfb3JkZXIsIGRhdGEsCi0JCQkJCSByZWxvY2F0ZWFibGUsIHN5bWJvbHMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotICAgICBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgYm9vbGVhbiByZWxvY2F0ZWFibGU7Ci0gICAgIGFzeW1ib2wgKipzeW1ib2xzOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2dldF9yZWxvY2F0ZWRfc2VjdGlvbl9jb250ZW50cyglcCwgJXAsICVwLCAlcCwgJXMsICVwKVxuIiwKLQkJCWFiZmQsIGxpbmtfaW5mbywgbGlua19vcmRlciwgZGF0YSwgKHJlbG9jYXRlYWJsZSk/IlRydWUiOiJGYWxzZSIsIHN5bWJvbHMpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi0KLS8qID8/PyAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfcmVsYXhfc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgbGlua19pbmZvLCBhZ2FpbikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLSAgICAgYm9vbGVhbiAqYWdhaW47Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfcmVsYXhfc2VjdGlvbiglcCwgJXMsICVwLCA8cmV0PilcbiIsCi0JCQkJCWFiZmQsIHNlY3Rpb24tPm5hbWUsIGxpbmtfaW5mbyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2djX3NlY3Rpb25zIChhYmZkLCBsaW5rX2luZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmxpbmtfaW5mbzsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2JmZF9nY19zZWN0aW9ucyglcCwgJXApXG4iLCBhYmZkLCBsaW5rX2luZm8pOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qIENyZWF0ZSBhIGhhc2ggdGFibGUgZm9yIHRoZSBsaW5rZXIuICBEaWZmZXJlbnQgYmFja2VuZHMgc3RvcmUKLSAgIGRpZmZlcmVudCBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICoKLXZtc19iZmRfbGlua19oYXNoX3RhYmxlX2NyZWF0ZSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfaGFzaF90YWJsZV9jcmVhdGUoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBBZGQgc3ltYm9scyBmcm9tIHRoaXMgb2JqZWN0IGZpbGUgaW50byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi12bXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGxpbmtfaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqbGlua19pbmZvOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX2xpbmtfYWRkX3N5bWJvbHMoJXAsICVwKVxuIiwgYWJmZCwgbGlua19pbmZvKTsKLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogRG8gYSBsaW5rIGJhc2VkIG9uIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZXMgYXR0YWNoZWQgdG8gZWFjaAotICAgc2VjdGlvbiBvZiB0aGUgQkZELiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXZtc19iZmRfZmluYWxfbGluayAoYWJmZCwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfZmluYWxfbGluayglcCwgJXApXG4iLCBhYmZkLCBsaW5rX2luZm8pOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTaG91bGQgdGhpcyBzZWN0aW9uIGJlIHNwbGl0IHVwIGludG8gc21hbGxlciBwaWVjZXMgZHVyaW5nIGxpbmtpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9saW5rX3NwbGl0X3NlY3Rpb24gKGFiZmQsIHNlY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci17Ci0jaWYgVk1TX0RFQlVHCi0gIHZtc19kZWJ1ZyAoMSwgInZtc19iZmRfbGlua19zcGxpdF9zZWN0aW9uKCVwLCAlcylcbiIsIGFiZmQsIHNlY3Rpb24tPm5hbWUpOwotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLX0KLQotLyotLSBQYXJ0IDQuOSwgZHluYW1pYyBzeW1ib2xzIGFuZCByZWxvY2F0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfZHluYW1pY19zeW10YWJfdXBwZXJfYm91bmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCglcClcbiIsIGFiZmQpOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotdm1zX2JmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBmaWxlKQotICAgIGJmZCAqYWJmZDsKLSAgICB2b2lkICpmaWxlOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfYmZkX3ByaW50X3ByaXZhdGVfYmZkX2RhdGEoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3ltYm9scykKLSAgICAgYmZkICphYmZkOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiglcCwgPHJldD4pXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMEw7Ci19Ci0KLQotLyogR2V0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHJlcXVpcmVkIHRvIGhvbGQgdGhlIGR5bmFtaWMgcmVsb2NzLiAgKi8KLQotc3RhdGljIGxvbmcKLXZtc19nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotI2lmIFZNU19ERUJVRwotICB2bXNfZGVidWcgKDEsICJ2bXNfZ2V0X2R5bmFtaWNfcmVsb2NfdXBwZXJfYm91bmQoJXApXG4iLCBhYmZkKTsKLSNlbmRpZgotICByZXR1cm4gMEw7Ci19Ci0KLQotLyogUmVhZCBpbiB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1zdGF0aWMgbG9uZwotdm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBhcmVsLCBzeW1ib2xzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKiphcmVsOwotICAgICBhc3ltYm9sICoqc3ltYm9sczsKLXsKLSNpZiBWTVNfREVCVUcKLSAgdm1zX2RlYnVnICgxLCAidm1zX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jKCVwKVxuIiwgYWJmZCk7Ci0jZW5kaWYKLSAgcmV0dXJuIDBMOwotfQpkaWZmIC0tZ2l0IGEvYmZkL3Ztcy5oIGIvYmZkL3Ztcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmJkZDAyLi4wMDAwMDAwCi0tLSBhL2JmZC92bXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0jdW5kZWYgdm1zCi0vKiB2bXMuaCAtLSBIZWFkZXIgZmlsZSBmb3IgVk1TIChBbHBoYSBhbmQgVmF4KSBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIChra2FlbXBmQHJtaS5kZSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFZNU19ICi0jZGVmaW5lIFZNU19ICi0KLQotLyogQ29uc3RhbnRzIHN0YXJ0aW5nIHdpdGggJ0V4eHhfJyBhcmUgZm9yIG9wZW5WTVMvQWxwaGEgKEVWQVggb2JqZWN0IGxhbmd1YWdlKSAgKi8KLQotLyogVk1TIFRleHQsIGluZm9ybWF0aW9uIGFuZCByZWxvY2F0aW9uIHJlY29yZCAoVElSL0VUSVIpIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBUSVJfU19DX1NUQV9HQkwJCTAKLSNkZWZpbmUgVElSX1NfQ19TVEFfU0IJCTEKLSNkZWZpbmUgVElSX1NfQ19TVEFfU1cJCTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFcJCTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEIJCTQKLSNkZWZpbmUgVElSX1NfQ19TVEFfUFcJCTUKLSNkZWZpbmUgVElSX1NfQ19TVEFfUEwJCTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfVUIgIAk3Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1VXICAJOAotI2RlZmluZSBUSVJfU19DX1NUQV9CRkkgCTkKLSNkZWZpbmUgVElSX1NfQ19TVEFfV0ZJIAkxMAotI2RlZmluZSBUSVJfU19DX1NUQV9MRkkgCTExCi0jZGVmaW5lIFRJUl9TX0NfU1RBX0VQTSAJMTIKLSNkZWZpbmUgVElSX1NfQ19TVEFfQ0tBUkcgICAgICAgMTMKLSNkZWZpbmUgVElSX1NfQ19TVEFfV1BCIAkxNAotI2RlZmluZSBUSVJfU19DX1NUQV9XUFcgCTE1Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX1dQTCAJMTYKLSNkZWZpbmUgVElSX1NfQ19TVEFfTFNZIAkxNwotI2RlZmluZSBUSVJfU19DX1NUQV9MSVQgCTE4Ci0jZGVmaW5lIFRJUl9TX0NfU1RBX0xFUE0gICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUFYU1RBQ09EICAgICAgIDE5Ci0jZGVmaW5lIFRJUl9TX0NfTUlOU1RPQ09EICAgICAgIDIwCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1NCICAJMjAKLSNkZWZpbmUgVElSX1NfQ19TVE9fU1cgIAkyMQotI2RlZmluZSBUSVJfU19DX1NUT19MICAgCTIyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX0xXICAJMjIKLSNkZWZpbmUgVElSX1NfQ19TVE9fQkQgIAkyMwotI2RlZmluZSBUSVJfU19DX1NUT19XRCAgCTI0Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX0xEICAJMjUKLSNkZWZpbmUgVElSX1NfQ19TVE9fTEkgIAkyNgotI2RlZmluZSBUSVJfU19DX1NUT19QSURSICAgICAgICAyNwotI2RlZmluZSBUSVJfU19DX1NUT19QSUNSICAgICAgICAyOAotI2RlZmluZSBUSVJfU19DX1NUT19SU0IgCTI5Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JTVyAJMzAKLSNkZWZpbmUgVElSX1NfQ19TVE9fUkwgIAkzMQotI2RlZmluZSBUSVJfU19DX1NUT19WUFMgCTMyCi0jZGVmaW5lIFRJUl9TX0NfU1RPX1VTQiAJMzMKLSNkZWZpbmUgVElSX1NfQ19TVE9fVVNXIAkzNAotI2RlZmluZSBUSVJfU19DX1NUT19SVUIgCTM1Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JVVyAJMzYKLSNkZWZpbmUgVElSX1NfQ19TVE9fQiAgIAkzNwotI2RlZmluZSBUSVJfU19DX1NUT19XICAgCTM4Ci0jZGVmaW5lIFRJUl9TX0NfU1RPX1JCICAJMzkKLSNkZWZpbmUgVElSX1NfQ19TVE9fUlcgIAk0MAotI2RlZmluZSBUSVJfU19DX1NUT19SSVZCICAgICAgICA0MQotI2RlZmluZSBUSVJfU19DX1NUT19QSVJSICAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01BWFNUT0NPRCAgICAgICA0MgotI2RlZmluZSBUSVJfU19DX01JTk9QUkNPRCAgICAgICA1MAotI2RlZmluZSBUSVJfU19DX09QUl9OT1AgCTUwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FERCAJNTEKLSNkZWZpbmUgVElSX1NfQ19PUFJfU1VCIAk1MgotI2RlZmluZSBUSVJfU19DX09QUl9NVUwgCTUzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0RJViAJNTQKLSNkZWZpbmUgVElSX1NfQ19PUFJfQU5EIAk1NQotI2RlZmluZSBUSVJfU19DX09QUl9JT1IgCTU2Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0VPUiAJNTcKLSNkZWZpbmUgVElSX1NfQ19PUFJfTkVHIAk1OAotI2RlZmluZSBUSVJfU19DX09QUl9DT00gCTU5Ci0jZGVmaW5lIFRJUl9TX0NfT1BSX0lOU1YgICAgICAgIDYwCi0jZGVmaW5lIFRJUl9TX0NfT1BSX0FTSCAJNjEKLSNkZWZpbmUgVElSX1NfQ19PUFJfVVNIIAk2MgotI2RlZmluZSBUSVJfU19DX09QUl9ST1QgCTYzCi0jZGVmaW5lIFRJUl9TX0NfT1BSX1NFTCAJNjQKLSNkZWZpbmUgVElSX1NfQ19PUFJfUkVERUYgICAgICAgNjUKLSNkZWZpbmUgVElSX1NfQ19PUFJfREZMSVQgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NQVhPUFJDT0QgICAgICAgNjYKLSNkZWZpbmUgVElSX1NfQ19NSU5DVExDT0QgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfU0VUUkIgICAgICAgODAKLSNkZWZpbmUgVElSX1NfQ19DVExfQVVHUkIgICAgICAgODEKLSNkZWZpbmUgVElSX1NfQ19DVExfREZMT0MgICAgICAgODIKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RMT0MgICAgICAgODMKLSNkZWZpbmUgVElSX1NfQ19DVExfU1RLREwgICAgICAgODQKLSNkZWZpbmUgVElSX1NfQ19NQVhDVExDT0QgICAgICAgODQKLQotI2RlZmluZSBFVElSX1NfQ19NSU5TVEFDT0QgMAkJLyogTWluaW11bSBzdG9yZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfR0JMIDAJCS8qIFN0YWNrIGdsb2JhbCBzeW1ib2wgdmFsdWUJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX0xXIDEJCS8qIFN0YWNrIGxvbmd3b3JkCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfUVcgMgkJLyogU3RhY2sgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUQV9QUSAzCQkvKiBTdGFjayBwc2VjdCBiYXNlIHBsdXMgcXVhZHdvcmQgb2Zmc2V0ICAqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfTEkgNAkJLyogU3RhY2sgbGl0ZXJhbAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RBX01PRCA1CQkvKiBTdGFjayBtb2R1bGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVEFfQ0tBUkcgNgkJLyogQ2hlY2sgQXJndW1lbnRzCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhTVEFDT0QgNgkJLyogTWF4aW11bSBzdGFjayBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19NSU5TVE9DT0QgNTAJCS8qIE1pbmltdW0gc3RvcmUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0IgNTAJCS8qIFN0b3JlIGJ5dGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fVyA1MQkJLyogU3RvcmUgd29yZAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19MVyA1MgkJLyogU3RvcmUgbG9uZ3dvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19RVyA1MwkJLyogU3RvcmUgcXVhZHdvcmQJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19JTU1SIDU0CQkvKiBTdG9yZSBpbW1lZGlhdGUgUmVwZWF0ZWQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0dCTCA1NQkJLyogU3RvcmUgZ2xvYmFsCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0NBIDU2CQkvKiBTdG9yZSBjb2RlIGFkZHJlc3MJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19SQiA1NwkJLyogU3RvcmUgcmVsYXRpdmUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19BQiA1OAkJLyogU3RvcmUgYWJzb2x1dGUgYnJhbmNoCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19PRkYgNTkJCS8qIFN0b3JlIG9mZnNldCB3aXRoaW4gcHNlY3QJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0lNTSA2MQkJLyogU3RvcmUgaW1tZWRpYXRlCQkqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fR0JMX0xXIDYyCQkvKiBTdG9yZSBnbG9iYWwgTG9uZ3dvcmQJKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RPX0xQX1BTQiA2MwkJLyogU1RPX0xQX1BTQiBub3QgdmFsaWQgaW4gbGV2ZWwgMiB1c2UgU1RDX0xQX1BTQgkJCSovCi0jZGVmaW5lIEVUSVJfU19DX1NUT19ISU5UX0dCTCA2NAkvKiBTdG9yZSAxNCBiaXQgSElOVCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVE9fSElOVF9QUyA2NQkJLyogU3RvcmUgMTQgYml0IEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RPQ09EIDY1CQkvKiBNYXhpbXVtIHN0b3JlIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX01JTk9QUkNPRCAxMDAJCS8qIE1pbmltdW0gb3BlcmF0ZSBjb2RlCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfTk9QIDEwMAkJLyogTm8tb3AJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQUREIDEwMQkJLyogQWRkCQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9TVUIgMTAyCQkvKiBTdWJ0cmFjdAkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9NVUwgMTAzCQkvKiBNdWx0aXBseQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9ESVYgMTA0CQkvKiBEaXZpZGUJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQU5EIDEwNQkJLyogTG9naWNhbCBBTkQJCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfSU9SIDEwNgkJLyogTG9naWNhbCBpbmNsdXNpdmUgT1IJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9FT1IgMTA3CQkvKiBMb2dpY2FsIGV4Y2x1c2l2ZSBPUgkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX05FRyAxMDgJCS8qIE5lZ2F0ZQkJCSovCi0jZGVmaW5lIEVUSVJfU19DX09QUl9DT00gMTA5CQkvKiBDb21wbGVtZW50CQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX0lOU1YgMTEwCQkvKiBJbnNlcnQgYml0IGZpZWxkCQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfQVNIIDExMQkJLyogQXJpdGhtZXRpYyBzaGlmdAkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1VTSCAxMTIJCS8qIFVuc2lnbmVkIHNoaWZ0CQkqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfUk9UIDExMwkJLyogUm90YXRlCQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1NFTCAxMTQJCS8qIFNlbGVjdCBvbmUgb2YgdGhyZWUgbG9uZ3dvcmRzIG9uIHRvcCBvZiBzdGFjayAgKi8KLSNkZWZpbmUgRVRJUl9TX0NfT1BSX1JFREVGIDExNQkJLyogUmVkZWZpbmUgdGhpcyBzeW1ib2wgYWZ0ZXIgcGFzcyAyICAqLwotI2RlZmluZSBFVElSX1NfQ19PUFJfREZMSVQgMTE2CQkvKiBEZWZpbmUgYSBsaXRlcmFsCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhPUFJDT0QgMTE2CQkvKiBNYXhpbXVtIG9wZXJhdGUgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOQ1RMQ09EIDE1MAkJLyogTWluaW11bSBjb250cm9sIGNvZGUJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TRVRSQiAxNTAJCS8qIFNldCByZWxvY2F0aW9uIGJhc2UJCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9BVUdSQiAxNTEJCS8qIEF1Z21lbnQgcmVsb2NhdGlvbiBiYXNlCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9ERkxPQyAxNTIJCS8qIERlZmluZSBkZWJ1ZyBsb2NhdGlvbgkqLwotI2RlZmluZSBFVElSX1NfQ19DVExfU1RMT0MgMTUzCQkvKiBTZXQgZGVidWcgbG9jYXRpb24JCSovCi0jZGVmaW5lIEVUSVJfU19DX0NUTF9TVEtETCAxNTQJCS8qIFN0YWNrIGRlYnVnIGxvY2F0aW9uCQkqLwotI2RlZmluZSBFVElSX1NfQ19NQVhDVExDT0QgMTU0CQkvKiBNYXhpbXVtIGNvbnRyb2wgY29kZQkJKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUlOU1RDQ09EIDIwMAkJLyogTWluaW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19MUCAyMDAJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIExpbmthZ2UgUGFpciAgICAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTFBfUFNCIDIwMQkJLyogU3RvcmUtY29uZGl0aW9uYWwgTGlua2FnZSBQYWlyIHdpdGggUHJvY2VkdXJlIFNpZ25hdHVyZSAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0JMIDIwMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQWRkcmVzcyBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfR0NBIDIwMwkJLyogU3RvcmUtY29uZGl0aW9uYWwgQ29kZSBBZGRyZXNzIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19QUyAyMDQJCS8qIFN0b3JlLWNvbmRpdGlvbmFsIEFkZHJlc3MgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX05PUF9HQkwgMjA1CS8qIFN0b3JlLWNvbmRpdGlvbmFsIE5PUCBhdCBhZGRyZXNzIG9mIGdsb2JhbCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTk9QX1BTIDIwNgkJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0JTUl9HQkwgMjA3CS8qIFN0b3JlLWNvbmRpdGlvbmFsIEJTUiBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQlNSX1BTIDIwOAkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIGF0IHBlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfU1RDX0xEQV9HQkwgMjA5CS8qIFN0b3JlLWNvbmRpdGlvbmFsIExEQSBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTERBX1BTIDIxMAkJLyogU3RvcmUtY29uZGl0aW9uYWwgTERBIGF0IHBzZWN0ICsgb2Zmc2V0ICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19CT0hfR0JMIDIxMQkvKiBTdG9yZS1jb25kaXRpb25hbCBCU1Igb3IgSGludCBhdCBnbG9iYWwgYWRkcmVzcyAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfQk9IX1BTIDIxMgkJLyogU3RvcmUtY29uZGl0aW9uYWwgQlNSIG9yIEhpbnQgYXQgcGVjdCArIG9mZnNldCAqLwotI2RlZmluZSBFVElSX1NfQ19TVENfTkJIX0dCTCAyMTMJLyogU3RvcmUtY29uZGl0aW9uYWwgTk9QLEJTUiBvciBISU5UIGF0IGdsb2JhbCBhZGRyZXNzICovCi0jZGVmaW5lIEVUSVJfU19DX1NUQ19OQkhfUFMgMjE0CQkvKiBTdG9yZS1jb25kaXRpb25hbCBOT1AsQlNSIG9yIEhJTlQgYXQgcHNlY3QgKyBvZmZzZXQgKi8KLSNkZWZpbmUgRVRJUl9TX0NfTUFYU1RDQ09EIDIxNAkJLyogTWF4aW11bSBzdG9yZS1jb25kaXRpb25hbCBjb2RlICAgICovCi0KLS8qIFZNUyBHbG9iYWwgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkIChHU0QvRUdTRCkuICAqLwotCi0jZGVmaW5lIEdTRF9TX0tfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfRU5UUklFUyAxCi0jZGVmaW5lIEdTRF9TX0NfUFNDICAgICAwCi0jZGVmaW5lIEdTRF9TX0NfU1lNICAgICAxCi0jZGVmaW5lIEdTRF9TX0NfRVBNICAgICAyCi0jZGVmaW5lIEdTRF9TX0NfUFJPICAgICAzCi0jZGVmaW5lIEdTRF9TX0NfU1lNVyAgICA0Ci0jZGVmaW5lIEdTRF9TX0NfRVBNVyAgICA1Ci0jZGVmaW5lIEdTRF9TX0NfUFJPVyAgICA2Ci0jZGVmaW5lIEdTRF9TX0NfSURDICAgICA3Ci0jZGVmaW5lIEdTRF9TX0NfRU5WICAgICA4Ci0jZGVmaW5lIEdTRF9TX0NfTFNZICAgICA5Ci0jZGVmaW5lIEdTRF9TX0NfTEVQTSAgICAxMAotI2RlZmluZSBHU0RfU19DX0xQUk8gICAgMTEKLSNkZWZpbmUgR1NEX1NfQ19TUFNDICAgIDEyCi0jZGVmaW5lIEdTRF9TX0NfU1lNViAgICAxMwotI2RlZmluZSBHU0RfU19DX0VQTVYgICAgMTQKLSNkZWZpbmUgR1NEX1NfQ19QUk9WICAgIDE1Ci0jZGVmaW5lIEdTRF9TX0NfTUFYUkVDVFlQICAgICAgIDE1Ci0KLSNkZWZpbmUgRUdTRF9TX0tfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfRU5UUklFUyAyCS8qIE9mZnNldCB0byBmaXJzdCBlbnRyeSBpbiByZWNvcmQJKi8KLSNkZWZpbmUgRUdTRF9TX0NfUFNDIDAJCS8qIFBzZWN0IGRlZmluaXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19TWU0gMQkJLyogU3ltYm9sIHNwZWNpZmljYXRpb24JCQkqLwotI2RlZmluZSBFR1NEX1NfQ19JREMgMgkJLyogUmFuZG9tIGVudGl0eSBjaGVjawkJCSovCi0jZGVmaW5lIEVHU0RfU19DX1NQU0MgNQkJLyogU2hhcmVhYmxlIGltYWdlIHBzZWN0IGRlZmluaXRpb24JKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNViA2CQkvKiBWZWN0b3JlZCAoZHVhbC12YWx1ZWQpIHZlcnNpb25zIG9mIFNZTSwgKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNTSA3CQkvKiBNYXNrZWQgdmVyc2lvbnMgb2YgU1lNLAkJKi8KLSNkZWZpbmUgRUdTRF9TX0NfU1lNRyA4CQkvKiBFR1NUIC0gZ3N0IHZlcnNpb24gb2YgU1lNCQkqLwotI2RlZmluZSBFR1NEX1NfQ19NQVhSRUNUWVAgOAkvKiBNYXhpbXVtIGVudHJ5IHR5cGUgZGVmaW5lZAkJKi8KLQotI2RlZmluZSBHUFNfU19NX1BJQyAgICAgMQotI2RlZmluZSBHUFNfU19NX0xJQiAgICAgMgotI2RlZmluZSBHUFNfU19NX09WUiAgICAgNAotI2RlZmluZSBHUFNfU19NX1JFTCAgICAgOAotI2RlZmluZSBHUFNfU19NX0dCTCAgICAgMTYKLSNkZWZpbmUgR1BTX1NfTV9TSFIgICAgIDMyCi0jZGVmaW5lIEdQU19TX01fRVhFICAgICA2NAotI2RlZmluZSBHUFNfU19NX1JEICAgICAgMTI4Ci0jZGVmaW5lIEdQU19TX01fV1JUICAgICAyNTYKLSNkZWZpbmUgR1BTX1NfTV9WRUMgICAgIDUxMgotI2RlZmluZSBHUFNfU19LX05BTUUgICAgOQotI2RlZmluZSBHUFNfU19DX05BTUUgICAgOQotCi0jZGVmaW5lIEVHUFNfU19WX1BJQwkweDAwMDEKLSNkZWZpbmUgRUdQU19TX1ZfTElCCTB4MDAwMgotI2RlZmluZSBFR1BTX1NfVl9PVlIJMHgwMDA0Ci0jZGVmaW5lIEVHUFNfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdQU19TX1ZfR0JMCTB4MDAxMAotI2RlZmluZSBFR1BTX1NfVl9TSFIJMHgwMDIwCi0jZGVmaW5lIEVHUFNfU19WX0VYRQkweDAwNDAKLSNkZWZpbmUgRUdQU19TX1ZfUkQJMHgwMDgwCi0jZGVmaW5lIEVHUFNfU19WX1dSVAkweDAxMDAKLSNkZWZpbmUgRUdQU19TX1ZfVkVDCTB4MDIwMAotI2RlZmluZSBFR1BTX1NfVl9OT01PRAkweDA0MDAKLSNkZWZpbmUgRUdQU19TX1ZfQ09NCTB4MDgwMAotCi0jZGVmaW5lIEdTWV9TX01fV0VBSyAgICAxCi0jZGVmaW5lIEdTWV9TX01fREVGICAgICAyCi0jZGVmaW5lIEdTWV9TX01fVU5JICAgICA0Ci0jZGVmaW5lIEdTWV9TX01fUkVMICAgICA4Ci0KLSNkZWZpbmUgRUdTWV9TX1ZfV0VBSwkweDAwMDEKLSNkZWZpbmUgRUdTWV9TX1ZfREVGCTB4MDAwMgotI2RlZmluZSBFR1NZX1NfVl9VTkkJMHgwMDA0Ci0jZGVmaW5lIEVHU1lfU19WX1JFTAkweDAwMDgKLSNkZWZpbmUgRUdTWV9TX1ZfQ09NTQkweDAwMTAKLSNkZWZpbmUgRUdTWV9TX1ZfVkVDRVAJMHgwMDIwCi0jZGVmaW5lIEVHU1lfU19WX05PUk0JMHgwMDQwCi0KLSNkZWZpbmUgTFNZX1NfTV9ERUYgICAgIDIKLSNkZWZpbmUgTFNZX1NfTV9SRUwgICAgIDgKLQotI2RlZmluZSBFTlZfU19NX0RFRiAgICAgMQotI2RlZmluZSBFTlZfU19NX05FU1RFRCAgMgotCi0vKgotICoJRGVidWdnZXIgc3ltYm9sIGRlZmluaXRpb25zOiAgVGhlc2UgYXJlIGRvbmUgYnkgaGFuZCwgYXMgbm8KLSAqCQkJCQltYWNoaW5lLXJlYWRhYmxlIHZlcnNpb24gc2VlbXMKLSAqCQkJCQl0byBiZSBhdmFpbGFibGUuCi0gKi8KLSNkZWZpbmUgRFNUX1NfQ19DCQkgIDcJLyogTGFuZ3VhZ2UgPT0gIkMiCSovCi0jZGVmaW5lIERTVF9TX0NfQ1hYCQkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCQkxNTMKLSNkZWZpbmUJRFNUX1NfQ19TT1VSQ0UJCTE1NQkvKiBTb3VyY2UgZmlsZQkJKi8KLSNkZWZpbmUgRFNUX1NfQ19QUk9MT0cJCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkJMTc2CS8qIEJlZ2lubmluZyBvZiBibG9jawkqLwotI2RlZmluZQlEU1RfU19DX0JMS0VORAkJMTc3CS8qIEVuZCBvZiBibG9jawkqLwotI2RlZmluZSBEU1RfU19DX0VOVFJZCQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkJMTg0Ci0jZGVmaW5lCURTVF9TX0NfTElORV9OVU0JMTg1CS8qIExpbmUgTnVtYmVyCQkqLwotI2RlZmluZSBEU1RfU19DX0xCTE9STElUCTE4NgotI2RlZmluZSBEU1RfU19DX0xBQkVMCQkxODcKLSNkZWZpbmUJRFNUX1NfQ19NT0RCRUcJCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECQkxODkJLyogRW5kIG9mIG1vZHVsZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkJFRwkJMTkwCS8qIEJlZ2lubmluZyBvZiByb3V0aW5lCSovCi0jZGVmaW5lCURTVF9TX0NfUlRORU5ECQkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cgNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IgNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJMTEKLSNkZWZpbmUgRFNUX1NfQ19TRVRfUENfTAkxMgotI2RlZmluZSBEU1RfU19DX1NFVF9TVE1UTlVNCTEzCi0jZGVmaW5lIERTVF9TX0NfVEVSTQkJMTQJLyogRW5kIG9mIGxpbmVzCSovCi0jZGVmaW5lIERTVF9TX0NfVEVSTV9XCQkxNQkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUJRFNUX1NfQ19TRVRfQUJTX1BDCTE2CS8qIFNldCBQQwkqLwotI2RlZmluZQlEU1RfU19DX0RFTFRBX1BDX0wJMTcJLyogSW5jciBQQwkqLwotI2RlZmluZSBEU1RfU19DX0lOQ1JfTElOVU1fTAkxOAkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9CCTE5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfTElOVU1fTAkyMAkvKiBTZXQgTGluZSAjCSovCi0jZGVmaW5lCURTVF9TX0NfVEVSTV9MCQkyMQkvKiBFbmQgb2YgbGluZXMJKi8KLS8qIHRoZXNlIGFyZSB1c2VkIHdpdGggRFNUX1NfQ19TT1VSQ0UgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVDTEZJTEUJIDEJLyogRGVjbGFyZSBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRGSUxFCSAyCS8qIFNldCBzb3VyY2UgZmlsZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfTAkgMwkvKiBTZXQgcmVjb3JkLCBsb25nd29yZCB2YWx1ZSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19TRVRSRUNfVwkgNAkvKiBTZXQgcmVjb3JkLCB3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0RFRkxJTkVTX1cJMTAJLyogIyBvZiBsaW5lLCB3b3JkIGNvdW50ZXIgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfQgkxMQkvKiAjIG9mIGxpbmUsIGJ5dGUgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19GT1JNRkVFRAkxNgkvKiBeTCBjb3VudHMgYXMgYSByZWNvcmQgKi8KLS8qIHRoZSBmb2xsb3dpbmcgYXJlIHRoZSBjb2RlcyBmb3IgdGhlIHZhcmlvdXMgZGF0YSB0eXBlcy4gIEFueXRoaW5nIG5vdCBvbgotICogdGhlIGxpc3QgaXMgaW5jbHVkZWQgdW5kZXIgJ2FkdmFuY2VkX3R5cGUnCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQ0hBUgkJMHgwMgotI2RlZmluZSBEQkdfU19DX1VTSU5UCQkweDAzCi0jZGVmaW5lIERCR19TX0NfVUxJTlQJCTB4MDQKLSNkZWZpbmUgREJHX1NfQ19VUVVBRAkJMHgwNQotI2RlZmluZSBEQkdfU19DX1NDSEFSCQkweDA2Ci0jZGVmaW5lIERCR19TX0NfU1NJTlQJCTB4MDcKLSNkZWZpbmUgREJHX1NfQ19TTElOVAkJMHgwOAotI2RlZmluZSBEQkdfU19DX1NRVUFECQkweDA5Ci0jZGVmaW5lIERCR19TX0NfUkVBTDQJCTB4MGEKLSNkZWZpbmUgREJHX1NfQ19SRUFMOAkJMHgwYgkJLyogRF9mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg0CQkweDBjCQkvKiAyeEZfZmxvYXQgY29tcGxleCBmbG9hdCAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDgJCTB4MGQJCS8qIDJ4RF9mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX1JFQUw4X0cJCTB4MWIJCS8qIEdfZmxvYXQgZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOF9HCTB4MWQJCS8qIDJ4R19mbG9hdCBjb21wbGV4IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0ZVTkNUSU9OX0FERFIJMHgxNwotI2RlZmluZSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUJMHhhMwotLyogIFNvbWUgb2YgdGhlc2UgYXJlIGp1c3QgZm9yIGZ1dHVyZSByZWZlcmVuY2UuICBbcHJdCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUQQkJMHgwMQkvKiB1bnNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19VQklUVQkJMHgyMgkvKiB1bnNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRBCQkweDI5CS8qIHNpZ25lZCwgYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19TQklUVQkJMHgyYQkvKiBzaWduZWQsIHVuYWxpZ25lZCBiaXQgZmllbGQgKi8KLSNkZWZpbmUgREJHX1NfQ19DU1RSSU5HCQkweDJlCS8qIGFzY2l6ICgnXDAnIHRlcm1pbmF0ZWQpIHN0cmluZyAqLwotI2RlZmluZSBEQkdfU19DX1dDSEFSCQkweDM4CS8qIHdjaGFyX3QgKi8KLS8qICBUaGVzZSBhcmUgZGVzY3JpcHRvciBjbGFzcyBjb2Rlcy4KLSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19TCQkweDAxCS8qIHN0YXRpYyAoZml4ZWQgbGVuZ3RoKSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19ECQkweDAyCS8qIGR5bmFtaWMgc3RyaW5nIChub3QgdmlhIG1hbGxvYyEpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0EJCTB4MDQJLyogYXJyYXkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfVUJTCQkweDBkCS8qIHVuYWxpZ25lZCBiaXQgc3RyaW5nICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkZWZpbml0aW9ucyBvZiBzdHJ1Y3QKLSAqICB1bmlvbiBhbmQgZW51bSByZWNvcmRzCi0gKi8KLSNkZWZpbmUgREJHX1NfQ19FTlVNX0lURU0JCTB4YTQKLSNkZWZpbmUgREJHX1NfQ19FTlVNX1NUQVJUCQkweGE1Ci0jZGVmaW5lIERCR19TX0NfRU5VTV9FTkQJCTB4YTYKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1RfSVRFTQkJRFNUX0tfVkZMQUdTX0JJVE9GRlMJLyogMHhmZiAqLwotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9TVEFSVAkJMHhhYgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9FTkQJCTB4YWMKLSNkZWZpbmUgRFNUX0tfVFlQU1BFQwkJCTB4YWYJCS8qIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotLyogVGhlc2UgY29kZXMgYXJlIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZHMKLSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfTk9WQUwJCTB4ODAJLyogc3RydWN0IGRlZmluaXRpb24gb25seSAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfRFNDCQkweGZhCS8qIGRlc2NyaXB0b3IgdXNlZCAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfVFZTCQkweGZiCS8qIHRyYWlsaW5nIHZhbHVlIHNwZWNpZmllZCAqLwotI2RlZmluZSBEU1RfS19WU19GT0xMT1dTCQkweGZkCS8qIHZhbHVlIHNwZWMgZm9sbG93cyAqLwotI2RlZmluZSBEU1RfS19WRkxBR1NfQklUT0ZGUwkJMHhmZgkvKiB2YWx1ZSBjb250YWlucyBiaXQgb2Zmc2V0ICovCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfTElURVJBTAkwCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfQUREUgkxCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfREVTQwkyCi0jZGVmaW5lIERTVF9LX1ZBTEtJTkRfUkVHCTMKLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9BUAkweDBjCS8qIFIxMiAqLwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0ZQCTB4MGQJLyogUjEzICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfU1AJMHgwZQkvKiBSMTQgKi8KLSNkZWZpbmUgRFNUX1ZfVkFMS0lORAkJMAkvKiBvZmZzZXQgb2YgdmFsa2luZCBmaWVsZCAqLwotI2RlZmluZSBEU1RfVl9JTkRJUkVDVAkJMgkvKiBvZmZzZXQgdG8gaW5kaXJlY3QgYml0ICovCi0jZGVmaW5lIERTVF9WX0RJU1AJCTMJLyogb2Zmc2V0IHRvIGRpc3BsYWNlbWVudCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfUkVHTlVNCQk0CS8qIG9mZnNldCB0byByZWdpc3RlciBudW1iZXIgKi8KLSNkZWZpbmUgRFNUX01fSU5ESVJFQ1QJCSgxPDxEU1RfVl9JTkRJUkVDVCkKLSNkZWZpbmUgRFNUX01fRElTUAkJKDE8PERTVF9WX0RJU1ApCi0jZGVmaW5lIERCR19DX0ZVTkNUSU9OX1BBUkFNCS8qIDB4YzkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9BUDw8RFNUX1ZfUkVHTlVNKSkKLSNkZWZpbmUgREJHX0NfTE9DQUxfU1lNCQkvKiAweGQ5ICovCVwKLQkoRFNUX0tfVkFMS0lORF9BRERSfERTVF9NX0RJU1B8KERTVF9LX1JFR19WQVhfRlA8PERTVF9WX1JFR05VTSkpCi0vKiBLaW5kcyBvZiB2YWx1ZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1ZTX0FMTE9DX1NQTElUCTMJLyogc3BsaXQgbGlmZXRpbWUgKi8KLS8qIEtpbmRzIG9mIHR5cGUgc3BlY2lmaWNhdGlvbnMKLSAqLwotI2RlZmluZSBEU1RfS19UU19BVE9NCQkweDAxCS8qIGF0b21pYyB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfRFNDCQkweDAyCS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX0lORAkJMHgwMwkvKiBpbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSNkZWZpbmUgRFNUX0tfVFNfVFBUUgkJMHgwNAkvKiB0eXBlZCBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19QVFIJCTB4MDUJLyogcG9pbnRlciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfQVJSQVkJCTB4MDcJLyogYXJyYXkgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX05PVl9MRU5HCTB4MGUJLyogbm92ZWwgbGVuZ3RoIHR5cGUgc3BlYyAqLwotLyogIFRoZXNlIGFyZSB0aGUgY29kZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgc3VmZml4IHJlY29yZHMgdG8gZGV0ZXJtaW5lIHRoZQotICogIGFjdHVhbCBkYXRhIHR5cGUKLSAqLwotI2RlZmluZSBEQkdfU19DX0JBU0lDCQkJRFNUX0tfVFNfQVRPTQotI2RlZmluZSBEQkdfU19DX0JBU0lDX0FSUkFZCQlEU1RfS19UU19EU0MKLSNkZWZpbmUgREJHX1NfQ19TVFJVQ1QJCQlEU1RfS19UU19JTkQKLSNkZWZpbmUgREJHX1NfQ19QT0lOVEVSCQkJRFNUX0tfVFNfVFBUUgotI2RlZmluZSBEQkdfU19DX1ZPSUQJCQlEU1RfS19UU19QVFIKLSNkZWZpbmUgREJHX1NfQ19DT01QTEVYX0FSUkFZCQlEU1RfS19UU19BUlJBWQotCi0vKiBWTVMgTW9kdWxlIGhlYWRlciByZWNvcmQgKEVNSCkgZGVmaW5pdGlvbnMuICAqLwotCi0jZGVmaW5lIE1IRF9TX0NfTUhEIDAKLSNkZWZpbmUgTUhEX1NfQ19MTk0gMQotI2RlZmluZSBNSERfU19DX1NSQyAyCi0jZGVmaW5lIE1IRF9TX0NfVFRMIDMKLSNkZWZpbmUgTUhEX1NfQ19DUFIgNAotI2RlZmluZSBNSERfU19DX01UQyA1Ci0jZGVmaW5lIE1IRF9TX0NfR1RYIDYKLSNkZWZpbmUgTUhEX1NfQ19NQVhIRFJUWVAgNgotCi0jZGVmaW5lIEVNSF9TX0NfTUhEIDAJCS8qIE1haW4gaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgRU1IX1NfQ19MTk0gMQkJLyogTGFuZ3VhZ2UgbmFtZSBhbmQgdmVyc2lvbgkqLwotI2RlZmluZSBFTUhfU19DX1NSQyAyCQkvKiBTb3VyY2UgZmlsZSBzcGVjaWZpY2F0aW9uCSovCi0jZGVmaW5lIEVNSF9TX0NfVFRMIDMJCS8qIFRpdGxlIHRleHQgb2YgbW9kdWxlCQkqLwotI2RlZmluZSBFTUhfU19DX0NQUiA0CQkvKiBDb3B5cmlnaHQgbm90aWNlCQkqLwotI2RlZmluZSBFTUhfU19DX01UQyA1CQkvKiBNYWludGVuYW5jZSBzdGF0dXMJCSovCi0jZGVmaW5lIEVNSF9TX0NfR1RYIDYJCS8qIEdlbmVyYWwgdGV4dAkJCSovCi0jZGVmaW5lIEVNSF9TX0NfTUFYSERSVFlQIDYJLyogTWF4aW11bSBhbGxvd2FibGUgdHlwZQkqLwotCi0vKiB2bXMuYy4gICovCi0KLWV4dGVybiBhc3ltYm9sICpfYmZkX3Ztc19tYWtlX2VtcHR5X3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotLyogdm1zLWdzZC5jLiAgKi8KLQotZXh0ZXJuIGludCBfYmZkX3Ztc19zbHVycF9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9nc2QgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiB2bXMtbWhkLmMuICAqLwotCi1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2hkciBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3NsdXJwX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci1leHRlcm4gaW50IF9iZmRfdm1zX3dyaXRlX2VvbSBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBvYmp0eXBlKSk7Ci0KLS8qIHZtcy10aXIuYy4gICovCi0KLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGlyIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfZGJnIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfdGJ0IFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfc2x1cnBfbG5rIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IG9ianR5cGUpKTsKLQotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90aXIgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV90YnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc193cml0ZV9kYmcgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkpOwotCi0vKiBUaGUgcl90eXBlIGZpZWxkIGluIGEgcmVsb2MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9JR05PUkUJCTAKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkxCi0jZGVmaW5lIEFMUEhBX1JfQlJBRERSCQkyCi0jZGVmaW5lIEFMUEhBX1JfSElOVAkJMwotI2RlZmluZSBBTFBIQV9SX1NSRUwxNgkJNAotI2RlZmluZSBBTFBIQV9SX1NSRUwzMgkJNQotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkJNgotI2RlZmluZSBBTFBIQV9SX09QX1BVU0gJCTcKLSNkZWZpbmUgQUxQSEFfUl9PUF9TVE9SRQk4Ci0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkJOQotI2RlZmluZSBBTFBIQV9SX09QX1BSU0hJRlQJMTAKLSNkZWZpbmUgQUxQSEFfUl9MSU5LQUdFCQkxMQotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEyCi0jZGVmaW5lIEFMUEhBX1JfQ09ERUFERFIJMTMKLQotLyogT2JqZWN0IGxhbmd1YWdlIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBPQkpfU19DX0hEUiAwCQkvKlZBWCBtb2R1bGUgaGVhZGVyIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19HU0QgMQkJLypWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RJUiAyCQkvKlZBWCB0ZXh0IGluZm9ybWF0aW9uIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT00gMwkJLypWQVggZW5kIG9mIG1vZHVsZSByZWNvcmQJCSovCi0jZGVmaW5lIE9CSl9TX0NfREJHIDQJCS8qVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBPQkpfU19DX1RCVCA1CQkvKlZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIE9CSl9TX0NfTE5LIDYJCS8qVkFYIGxpbmtlciBvcHRpb25zIHJlY29yZAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19FT01XIDcJCS8qVkFYIGVuZCBvZiBtb2R1bGUgd29yZC1wc2VjdCByZWNvcmQJKi8KLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNUWVAgNwkvKlZBWCBMYXN0IGFzc2lnbmVkIHJlY29yZCB0eXBlCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FTUggOAkJLypFVkFYIG1vZHVsZSBoZWFkZXIgcmVjb3JkCQkqLwotI2RlZmluZSBFT0JKX1NfQ19FRU9NIDkJCS8qRVZBWCBlbmQgb2YgbW9kdWxlIHJlY29yZAkJKi8KLSNkZWZpbmUgRU9CSl9TX0NfRUdTRCAxMAkvKkVWQVggZ2xvYmFsIHN5bWJvbCBkZWZpbml0aW9uIHJlY29yZCAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfRVRJUiAxMQkvKkVWQVggdGV4dCBpbmZvcm1hdGlvbiByZWNvcmQJCSovCi0jZGVmaW5lIEVPQkpfU19DX0VEQkcgMTIJLypFVkFYIERlYnVnZ2VyIGluZm9ybWF0aW9uIHJlY29yZAkqLwotI2RlZmluZSBFT0JKX1NfQ19FVEJUIDEzCS8qRVZBWCBUcmFjZWJhY2sgaW5mb3JtYXRpb24gcmVjb3JkCSovCi0jZGVmaW5lIEVPQkpfU19DX01BWFJFQ1RZUCAxMwkvKkVWQVggTGFzdCBhc3NpZ25lZCByZWNvcmQgdHlwZQkqLwotI2RlZmluZSBPQkpfU19LX1NVQlRZUCAxCi0jZGVmaW5lIE9CSl9TX0NfU1VCVFlQIDEKLSNkZWZpbmUgRU9CSl9TX0tfU1VCVFlQIDQKLSNkZWZpbmUgRU9CSl9TX0NfU1VCVFlQIDQKLSNkZWZpbmUgT0JKX1NfQ19NQVhSRUNTSVogMjA0OAkvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBFT0JKX1NfQ19NQVhSRUNTSVogODE5MiAvKk1heGltdW0gbGVnYWwgcmVjb3JkIHNpemUgICAgICAgICAqLwotI2RlZmluZSBPQkpfU19DX1NUUkxWTCAwCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVPQkpfU19DX1NUUkxWTCAyCS8qU3RydWN0dXJlIGxldmVsICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE9CSl9TX0NfU1lNU0laIDMxCS8qTWF4aW11bSBzeW1ib2wgbGVuZ3RoCQkqLwotI2RlZmluZSBFT0JKX1NfQ19TWU1TSVogNjQJLypNYXhpbXVtIHN5bWJvbCBsZW5ndGgJCSovCi0jZGVmaW5lIEVPQkpfU19DX1NFQ1NJWiAzMQkvKk1heGltdW0gc2VjdGlvbiBuYW1lIGxlbmd0aAkJKi8KLSNkZWZpbmUgT0JKX1NfQ19TVE9SRVBMSU0gLTEJLypNYXhpbXVtIHJlcGVhdCBjb3VudCBvbiBzdG9yZSBjb21tYW5kcyAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfU1RPUkVQTElNIC0xCS8qTWF4aW11bSByZXBlYXQgY291bnQgb24gc3RvcmUgY29tbWFuZHMgICovCi0jZGVmaW5lIE9CSl9TX0NfUFNDQUxJTElNIDkJLypNYXhpbXVtIHAtc2VjdCBhbGlnbm1lbnQgICAgICAgICAgKi8KLSNkZWZpbmUgRU9CSl9TX0NfUFNDQUxJTElNIDE2CS8qTWF4aW11bSBwLXNlY3QgYWxpZ25tZW50ICAgICAgICAgICovCi0KLSNkZWZpbmUgRVZBWF9PRkZTRVQJMjU2CS8qdHlwZSBvZmZzZXQgZm9yIEVWQVggY29kZXMgaW4gc3dpdGNoICAqLwotLyogTWlzY2VsbGFuZW91cyBkZWZpbml0aW9ucy4gICovCi0KLSNpZiBfX0dOVUNfXwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdXF1YWQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVxdWFkOwotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX09VVFJFQ19TSVpFIDQwOTYKLSNkZWZpbmUgTUlOX09VVFJFQ19MVUZUIDY0Ci0KLXR5cGVkZWYgc3RydWN0IF92bXNfc2VjdGlvbiB7Ci0gIHVuc2lnbmVkIGNoYXIgKmNvbnRlbnRzOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaXplOwotICBzdHJ1Y3QgX3Ztc19zZWN0aW9uICpuZXh0OwotfSB2bXNfc2VjdGlvbjsKLQotZXh0ZXJuIGJvb2xlYW4gX2JmZF9zYXZlX3Ztc19zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sIFBUUiBkYXRhLCBmaWxlX3B0ciBvZmZzZXQsCi0JICAgYmZkX3NpemVfdHlwZSBjb3VudCkpOwotZXh0ZXJuIHZtc19zZWN0aW9uICpfYmZkX2dldF92bXNfc2VjdGlvbiBQQVJBTVMgKChiZmQgKmFiZmQsIGludCBpbmRleCkpOwotCi10eXBlZGVmIHN0cnVjdCBfdm1zX3JlbG9jIHsKLSAgc3RydWN0IF92bXNfcmVsb2MgKm5leHQ7Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLX0gdm1zX3JlbG9jOwotCi0vKiB2bXMgbW9kdWxlIGhlYWRlciAgKi8KLQotc3RydWN0IGhkcl9zdHJ1YyB7Ci0gIGludCBoZHJfYl9zdHJsdmw7Ci0gIGxvbmcgaGRyX2xfYXJjaDE7Ci0gIGxvbmcgaGRyX2xfYXJjaDI7Ci0gIGxvbmcgaGRyX2xfcmVjc2l6OwotICBjaGFyICpoZHJfdF9uYW1lOwotICBjaGFyICpoZHJfdF92ZXJzaW9uOwotICBjaGFyICpoZHJfdF9kYXRlOwotICBjaGFyICpoZHJfY19sbm07Ci0gIGNoYXIgKmhkcl9jX3NyYzsKLSAgY2hhciAqaGRyX2NfdHRsOwotfTsKLQotCi0vKiB2bXMgZW5kIG9mIG1vZHVsZSAgKi8KLQotc3RydWN0IGVvbV9zdHJ1YyB7Ci0gIGxvbmcgZW9tX2xfdG90YWxfbHBzOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX2NvbWNvZDsKLSAgYm9vbGVhbiBlb21faGFzX3RyYW5zZmVyOwotICB1bnNpZ25lZCBjaGFyIGVvbV9iX3RmcmZsZzsKLSAgbG9uZyBlb21fbF9wc2luZHg7Ci0gIGxvbmcgZW9tX2xfdGZyYWRyOwotfTsKLQotZW51bSBmaWxlX2Zvcm1hdF9lbnVtIHsgRkZfVU5LTk9XTiwgRkZfRk9SRUlHTiwgRkZfTkFUSVZFLCBGRl9WQVggfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgdm1zX3N5bWJvbF9zdHJ1Y3QgewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgYmZkX2hhc2g7Ci0gIGFzeW1ib2wgKnN5bWJvbDsKLX0gdm1zX3N5bWJvbF9lbnRyeTsKLQotLyogc3RhY2sgdmFsdWUgZm9yIHB1c2gvcG9wIGNvbW1hbmRzICAqLwotCi1zdHJ1Y3Qgc3RhY2tfc3RydWN0IHsKLSAgdXF1YWQgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIFNUQUNLU0laRSA4MTkyCi0KLS8qIGxvY2F0aW9uIHN0YWNrIGRlZmluaXRpb25zIGZvciBDVExfREZMT0MsIENUTF9TVExPQywgYW5kIENUTF9TVEtETCAgKi8KLQotc3RydWN0IGxvY2F0aW9uX3N0cnVjdCB7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGludCBwc2VjdDsKLX07Ci0jZGVmaW5lIExPQ0FUSU9OX1NBVkVfU0laRSAzMgotCi0jZGVmaW5lIFZNU19TRUNUSU9OX0NPVU5UIDEwMjQKLQotc3RydWN0IHZtc19wcml2YXRlX2RhdGFfc3RydWN0IHsKLSAgaW50IGlzX3ZheDsKLSAgYm9vbGVhbiBmaXh1cF9kb25lOwkJCS8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgYWxsCi0JCQkJCSAgIHNlY3Rpb24gcG9pbnRlcnMgYW5kIFBSSVYoc2VjdGlvbnMpCi0JCQkJCSAgIGFyZSBzZXQgdXAgY29ycmVjdGx5ICAqLwotICB1bnNpZ25lZCBjaGFyICp2bXNfYnVmOwkJLyogYnVmZmVyIHRvIHJlY29yZCAgKi8KLSAgaW50IGJ1Zl9zaXplOwkJCQkvKiBtYXggc2l6ZSBvZiBidWZmZXIgICovCi0gIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CQkvKiBhY3R1YWwgcmVjb3JkIHB0ciAgKi8KLSAgaW50IHJlY19sZW5ndGg7CQkJLyogcmVtYWluaW5nIHJlY29yZCBsZW5ndGggICovCi0gIGludCByZWNfc2l6ZTsJCQkJLyogYWN0dWFsIHJlY29yZCBzaXplICAqLwotICBpbnQgcmVjX3R5cGU7CQkJCS8qIGFjdHVhbCByZWNvcmQgdHlwZSAgKi8KLSAgZW51bSBmaWxlX2Zvcm1hdF9lbnVtIGZpbGVfZm9ybWF0OwotCi0gIHN0cnVjdCBoZHJfc3RydWMgaGRyX2RhdGE7CQkvKiBkYXRhIGZyb20gSERSL0VNSCByZWNvcmQgICovCi0gIHN0cnVjdCBlb21fc3RydWMgZW9tX2RhdGE7CQkvKiBkYXRhIGZyb20gRU9NL0VFT00gcmVjb3JkICAqLwotICBpbnQgc2VjdGlvbl9jb3VudDsJCQkvKiAjIG9mIHNlY3Rpb25zIGluIGZvbGxvd2luZyBhcnJheSAgKi8KLSAgYXNlY3Rpb24gKipzZWN0aW9uczsJCQkvKiBhcnJheSBvZiBHU0QvRUdTRCBzZWN0aW9ucyAgKi8KLSAgaW50IGdzZF9zeW1fY291bnQ7CQkJLyogIyBvZiBHU0QvRUdTRCBzeW1ib2xzICAqLwotICBhc3ltYm9sICoqc3ltYm9sczsJCQkvKiB2ZWN0b3Igb2YgR1NEL0VHU0Qgc3ltYm9scyAgKi8KLSAgc3RydWN0IHByb2NfdmFsdWUgKnByb2NlZHVyZTsKLQotICBzdHJ1Y3Qgc3RhY2tfc3RydWN0ICpzdGFjazsKLSAgaW50IHN0YWNrcHRyOwotCi0gIHZtc19zZWN0aW9uICp2bXNfc2VjdGlvbl90YWJsZVtWTVNfU0VDVElPTl9DT1VOVF07Ci0KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp2bXNfc3ltYm9sX3RhYmxlOwotICBzdHJ1Y3Qgc3ltYm9sX2NhY2hlX2VudHJ5ICoqc3ltY2FjaGU7Ci0gIGludCBzeW1udW07Ci0KLSAgc3RydWN0IGxvY2F0aW9uX3N0cnVjdCAqbG9jYXRpb25fc3RhY2s7Ci0KLSAgYXNlY3Rpb24gKmltYWdlX3NlY3Rpb247CQkvKiBzZWN0aW9uIGZvciBpbWFnZV9wdHIgICovCi0gIHVuc2lnbmVkIGNoYXIgKmltYWdlX3B0cjsJCS8qIGEgcG9pbnRlciB0byBzZWN0aW9uLT5jb250ZW50cyAqLwotCi0gIHVuc2lnbmVkIGNoYXIgcGRzY1s4XTsJCS8qIHByb2NlZHVyZSBkZXNjcmlwdG9yICovCi0KLSAgLyogT3V0cHV0IHJvdXRpbmUgc3RvcmFnZSAgKi8KLQotICB1bnNpZ25lZCBjaGFyICpvdXRwdXRfYnVmOwkJLyogb3V0cHV0IGRhdGEgICovCi0gIGludCBwdXNoX2xldmVsOwotICBpbnQgcHVzaGVkX3NpemU7Ci0gIGludCBsZW5ndGhfcG9zOwotICBpbnQgb3V0cHV0X3NpemU7Ci0gIGludCBvdXRwdXRfYWxpZ25tZW50OwotCi0gIC8qIGxpbmthZ2UgaW5kZXggY291bnRlcgotICAgdXNlZCBieSBjb25kaXRpb25hbCBzdG9yZSBjb21tYW5kcyAoRVRJUl9TX0NfU1RDXykgICovCi0KLSAgaW50IHZtc19saW5rYWdlX2luZGV4OwotCi0gIC8qIHNlZSB0Yy1hbHBoYS5jIG9mIGdhcyBmb3IgYSBkZXNjcmlwdGlvbi4gICovCi0gIGludCBmbGFnX2hhc2hfbG9uZ19uYW1lczsJLyogLSssIGhhc2ggaW5zdGVhZCBvZiB0cnVuY2F0ZSAqLwotICBpbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCwgc2hvdyBoYXNoaW5nL3RydW5jYXRpb24gKi8KLX07Ci0KLSNkZWZpbmUgUFJJVihuYW1lKQkoKHN0cnVjdCB2bXNfcHJpdmF0ZV9kYXRhX3N0cnVjdCAqKWFiZmQtPnRkYXRhLmFueSktPm5hbWUKLQotI2RlZmluZSBTRUNUSU9OX05BTUVfVEVNUExBVEUgIl9fU0VDX18lZCIKLQotI2lmIFZNU19ERUJVRwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfZGVidWcgUEFSQU1TKChpbnQgbGV2ZWwsIGNoYXIgKmZvcm1hdCwgLi4uKSk7Ci1leHRlcm4gdm9pZCBfYmZkX2hleGR1bXAKLSAgUEFSQU1TICgoaW50IGxldmVsLCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplLCBpbnQgb2Zmc2V0KSk7Ci0KLSNkZWZpbmUgdm1zX2RlYnVnIF9iZmRfdm1zX2RlYnVnCi0jZW5kaWYKLQotZXh0ZXJuIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqX2JmZF92bXNfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnksIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGUsCi0JICAgY29uc3QgY2hhciAqc3RyaW5nKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19nZXRfaGVhZGVyX3ZhbHVlcwotICBQQVJBTVMgKChiZmQgKmFiZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50ICp0eXBlLCBpbnQgKmxlbmd0aCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19nZXRfcmVjb3JkIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIGludCBfYmZkX3Ztc19uZXh0X3JlY29yZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnN0ciwgaW50IHNpemUpKTsKLWV4dGVybiBjaGFyICpfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKnB0cikpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfcHVzaCBQQVJBTVMgKChiZmQgKmFiZmQsIHVxdWFkIHZhbCwgaW50IHBzZWN0KSk7Ci1leHRlcm4gdXF1YWQgX2JmZF92bXNfcG9wIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50ICpwc2VjdCkpOwotCi1leHRlcm4gYm9vbGVhbiBfYmZkX3NhdmVfdm1zX3NlY3Rpb24KLSAgUEFSQU1TICgoYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgUFRSIGRhdGEsIGZpbGVfcHRyIG9mZnNldCwKLQkgICBiZmRfc2l6ZV90eXBlIGNvdW50KSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfYmVnaW4KLSAgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgcmVjdHlwZSwgaW50IHJlY2hlYWQpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9hbGlnbm1lbnQgUEFSQU1TICgoYmZkICphYmZkLCBpbnQgYWxpZ250bykpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X3B1c2ggUEFSQU1TICgoYmZkICphYmZkKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfcG9wIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIFBBUkFNUyAoKGJmZCAqYWJmZCkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2VuZCBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLWV4dGVybiBpbnQgX2JmZF92bXNfb3V0cHV0X2NoZWNrIFBBUkFNUyAoKGJmZCAqYWJmZCwgaW50IHNpemUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9ieXRlIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgaW50IHZhbHVlKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfc2hvcnQgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBpbnQgdmFsdWUpKTsKLWV4dGVybiB2b2lkIF9iZmRfdm1zX291dHB1dF9sb25nIFBBUkFNUyAoKGJmZCAqYWJmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X3F1YWQgUEFSQU1TICgoYmZkICphYmZkLCB1cXVhZCB2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICp2YWx1ZSkpOwotZXh0ZXJuIHZvaWQgX2JmZF92bXNfb3V0cHV0X2R1bXAgUEFSQU1TICgoYmZkICphYmZkLCB1bnNpZ25lZCBjaGFyICpkYXRhLAotCQkJCQkgICBpbnQgbGVuZ3RoKSk7Ci1leHRlcm4gdm9pZCBfYmZkX3Ztc19vdXRwdXRfZmlsbCBQQVJBTVMgKChiZmQgKmFiZmQsIGludCB2YWx1ZSwgaW50IGxlbmd0aCkpOwotZXh0ZXJuIGNoYXIgKl9iZmRfdm1zX2xlbmd0aF9oYXNoX3N5bWJvbCBQQVJBTVMgKChiZmQgKmFiZmQsIGNvbnN0IGNoYXIgKmluLCBpbnQgbWF4bGVuKSk7Ci0KLWV4dGVybiB2bXNfc3ltYm9sX2VudHJ5ICpfYmZkX3Ztc19lbnRlcl9zeW1ib2wgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICpuYW1lKSk7Ci0KLSNlbmRpZiAvKiBWTVNfSCAqLwpkaWZmIC0tZ2l0IGEvYmZkL3hjb2ZmbGluay5jIGIvYmZkL3hjb2ZmbGluay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjVjMGM2Li4wMDAwMDAwCi0tLSBhL2JmZC94Y29mZmxpbmsuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NDAgKzAsMCBAQAotLyogUE9XRVIvUG93ZXJQQyBYQ09GRiBsaW5rZXIgc3VwcG9ydC4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4sIEN5Z251cyBTdXBwb3J0LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBYQ09GRiBsaW5rZXIgY29kZS4gICovCi0KLSNkZWZpbmUgU1RSSU5HX1NJWkVfU0laRSAoNCkKLQotLyogSW4gb3JkZXIgdG8gc3VwcG9ydCBsaW5raW5nIGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzIGludG8gYW4KLSAgIFhDT0ZGIGZvcm1hdCwgd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIGEgcGFydGljdWxhcgotICAgYmZkX3RhcmdldCBpcyBhbiBYQ09GRiB2ZWN0b3IuICBGSVhNRTogV2UgbmVlZCB0byByZXRoaW5rIHRoaXMKLSAgIHdob2xlIGFwcHJvYWNoLiAgKi8KLSNkZWZpbmUgWENPRkZfWFZFQ1AoeHYpIFwKLSAgKHN0cmNtcCAoKHh2KS0+bmFtZSwgImFpeGNvZmYtcnM2MDAwIikgPT0gMCBcCi0gICB8fCBzdHJjbXAgKCh4diktPm5hbWUsICJ4Y29mZi1wb3dlcm1hYyIpID09IDApCi0KLS8qIEdldCB0aGUgWENPRkYgaGFzaCB0YWJsZSBlbnRyaWVzIGZvciBhIEJGRC4gICovCi0jZGVmaW5lIG9ial94Y29mZl9zeW1faGFzaGVzKGJmZCkgXAotICAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKiopIG9ial9jb2ZmX3N5bV9oYXNoZXMgKGJmZCkpCi0KLS8qIFhDT0ZGIHJlbG9jYXRpb24gdHlwZXMuICBUaGVzZSBwcm9iYWJseSBiZWxvbmcgaW4gYSBoZWFkZXIgZmlsZQotICAgc29tZXdoZXJlLiAgVGhlIHJlbG9jYXRpb25zIGFyZSBkZXNjcmliZWQgaW4gdGhlIGZ1bmN0aW9uCi0gICBfYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uIGluIHRoaXMgZmlsZS4gICovCi0KLSNkZWZpbmUgUl9QT1MgICAoMHgwMCkKLSNkZWZpbmUgUl9ORUcgICAoMHgwMSkKLSNkZWZpbmUgUl9SRUwgICAoMHgwMikKLSNkZWZpbmUgUl9UT0MgICAoMHgwMykKLSNkZWZpbmUgUl9SVEIgICAoMHgwNCkKLSNkZWZpbmUgUl9HTCAgICAoMHgwNSkKLSNkZWZpbmUgUl9UQ0wgICAoMHgwNikKLSNkZWZpbmUgUl9CQSAgICAoMHgwOCkKLSNkZWZpbmUgUl9CUiAgICAoMHgwYSkKLSNkZWZpbmUgUl9STCAgICAoMHgwYykKLSNkZWZpbmUgUl9STEEgICAoMHgwZCkKLSNkZWZpbmUgUl9SRUYgICAoMHgwZikKLSNkZWZpbmUgUl9UUkwgICAoMHgxMikKLSNkZWZpbmUgUl9UUkxBICAoMHgxMykKLSNkZWZpbmUgUl9SUlRCSSAoMHgxNCkKLSNkZWZpbmUgUl9SUlRCQSAoMHgxNSkKLSNkZWZpbmUgUl9DQUkgICAoMHgxNikKLSNkZWZpbmUgUl9DUkVMICAoMHgxNykKLSNkZWZpbmUgUl9SQkEgICAoMHgxOCkKLSNkZWZpbmUgUl9SQkFDICAoMHgxOSkKLSNkZWZpbmUgUl9SQlIgICAoMHgxYSkKLSNkZWZpbmUgUl9SQlJDICAoMHgxYikKLQotLyogVGhlIGZpcnN0IHdvcmQgb2YgZ2xvYmFsIGxpbmthZ2UgY29kZS4gIFRoaXMgbXVzdCBiZSBtb2RpZmllZCBieQotICAgZmlsbGluZyBpbiB0aGUgY29ycmVjdCBUT0Mgb2Zmc2V0LiAgKi8KLQotI2RlZmluZSBYQ09GRl9HTElOS19GSVJTVCAoMHg4MTgyMDAwMCkJLyogbHd6IHIxMiwwKHIyKSAqLwotCi0vKiBUaGUgcmVtYWluaW5nIHdvcmRzIG9mIGdsb2JhbCBsaW5rYWdlIGNvZGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB4Y29mZl9nbGlua19jb2RlW10gPQotewotICAweDkwNDEwMDE0LAkvKiBzdHcgcjIsMjAocjEpICovCi0gIDB4ODAwYzAwMDAsCS8qIGx3eiByMCwwKHIxMikgKi8KLSAgMHg4MDRjMDAwNCwJLyogbHd6IHIyLDQocjEyKSAqLwotICAweDdjMDkwM2E2LAkvKiBtdGN0ciByMCAqLwotICAweDRlODAwNDIwLAkvKiBiY3RyICovCi0gIDB4MCwJCS8qIHN0YXJ0IG9mIHRyYWNlYmFjayB0YWJsZSAqLwotICAweDAwMGM4MDAwLAkvKiB0cmFjZWJhY2sgdGFibGUgKi8KLSAgMHgwCQkvKiB0cmFjZWJhY2sgdGFibGUgKi8KLX07Ci0KLSNkZWZpbmUgWENPRkZfR0xJTktfU0laRSBcCi0gICgoKHNpemVvZiB4Y29mZl9nbGlua19jb2RlIC8gc2l6ZW9mIHhjb2ZmX2dsaW5rX2NvZGVbMF0pICogNCkgKyA0KQotCi0vKiBXZSByZXVzZSB0aGUgU0VDX1JPTSBmbGFnIGFzIGEgbWFyayBmbGFnIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uCi0gICBUaGlzIGZsYWcgd2lsbCBvbmx5IGJlIHVzZWQgb24gaW5wdXQgc2VjdGlvbnMuICAqLwotCi0jZGVmaW5lIFNFQ19NQVJLIChTRUNfUk9NKQotCi0vKiBUaGUgbGRoZHIgc3RydWN0dXJlLiAgVGhpcyBhcHBlYXJzIGF0IHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlcgotICAgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZGhkcgotewotICAvKiBUaGUgdmVyc2lvbiBudW1iZXI6IGN1cnJlbnRseSBhbHdheXMgMS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF92ZXJzaW9uOwotICAvKiBUaGUgbnVtYmVyIG9mIHN5bWJvbCB0YWJsZSBlbnRyaWVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25zeW1zOwotICAvKiBUaGUgbnVtYmVyIG9mIHJlbG9jYXRpb24gdGFibGUgZW50cmllcy4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9ucmVsb2M7Ci0gIC8qIFRoZSBsZW5ndGggb2YgdGhlIGltcG9ydCBmaWxlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9pc3RsZW47Ci0gIC8qIFRoZSBudW1iZXIgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX25pbXBpZDsKLSAgLyogVGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgLmxvYWRlciBzZWN0aW9uIHRvIHRoZSBmaXJzdAotICAgICBlbnRyeSBpbiB0aGUgaW1wb3J0IGZpbGUgdGFibGUuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfaW1wb2ZmOwotICAvKiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGFibGUuICAqLwotICBiZmRfc2l6ZV90eXBlIGxfc3RsZW47Ci0gIC8qIFRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIC5sb2FkZXIgc2VjdGlvbiB0byB0aGUgZmlyc3QKLSAgICAgZW50cnkgaW4gdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zdG9mZjsKLX07Ci0KLXN0cnVjdCBleHRlcm5hbF9sZGhkcgotewotICBiZmRfYnl0ZSBsX3ZlcnNpb25bNF07Ci0gIGJmZF9ieXRlIGxfbnN5bXNbNF07Ci0gIGJmZF9ieXRlIGxfbnJlbG9jWzRdOwotICBiZmRfYnl0ZSBsX2lzdGxlbls0XTsKLSAgYmZkX2J5dGUgbF9uaW1waWRbNF07Ci0gIGJmZF9ieXRlIGxfaW1wb2ZmWzRdOwotICBiZmRfYnl0ZSBsX3N0bGVuWzRdOwotICBiZmRfYnl0ZSBsX3N0b2ZmWzRdOwotfTsKLQotI2RlZmluZSBMREhEUlNaICg4ICogNCkKLQotLyogVGhlIGxkc3ltIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgYSBzeW1ib2wgaW4gdGhlCi0gICAubG9hZGVyIHNlY3Rpb24uICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfbGRzeW0KLXsKLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIG5hbWUgaWYgPD0gU1lNTk1MRU4gY2hhcmFjdGVycy4gICovCi0gICAgICBjaGFyIF9sX25hbWVbU1lNTk1MRU5dOwotICAgICAgc3RydWN0Ci0JewotCSAgLyogWmVybyBpZiB0aGUgc3ltYm9sIG5hbWUgaXMgbW9yZSB0aGFuIFNZTU5NTEVOIGNoYXJhY3RlcnMuICAqLwotCSAgbG9uZyBfbF96ZXJvZXM7Ci0JICAvKiBUaGUgb2Zmc2V0IGluIHRoZSBzdHJpbmcgdGFibGUgaWYgdGhlIHN5bWJvbCBuYW1lIGlzIG1vcmUKLSAgICAgICAgICAgICB0aGFuIFNZTU5NTEVOIGNoYXJhY3RlcnMuICAqLwotCSAgbG9uZyBfbF9vZmZzZXQ7Ci0JfSBfbF9sOwotICAgIH0gX2w7Ci0gIC8qIFRoZSBzeW1ib2wgdmFsdWUuICAqLwotICBiZmRfdm1hIGxfdmFsdWU7Ci0gIC8qIFRoZSBzeW1ib2wgc2VjdGlvbiBudW1iZXIuICAqLwotICBzaG9ydCBsX3NjbnVtOwotICAvKiBUaGUgc3ltYm9sIHR5cGUgYW5kIGZsYWdzLiAgKi8KLSAgY2hhciBsX3NtdHlwZTsKLSAgLyogVGhlIHN5bWJvbCBzdG9yYWdlIGNsYXNzLiAgKi8KLSAgY2hhciBsX3NtY2xhczsKLSAgLyogVGhlIGltcG9ydCBmaWxlIElELiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsX2lmaWxlOwotICAvKiBPZmZzZXQgdG8gdGhlIHBhcmFtZXRlciB0eXBlIGNoZWNrIHN0cmluZy4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9wYXJtOwotfTsKLQotc3RydWN0IGV4dGVybmFsX2xkc3ltCi17Ci0gIHVuaW9uCi0gICAgewotICAgICAgYmZkX2J5dGUgX2xfbmFtZVtTWU1OTUxFTl07Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBiZmRfYnl0ZSBfbF96ZXJvZXNbNF07Ci0JICBiZmRfYnl0ZSBfbF9vZmZzZXRbNF07Ci0JfSBfbF9sOwotICAgIH0gX2w7Ci0gIGJmZF9ieXRlIGxfdmFsdWVbNF07Ci0gIGJmZF9ieXRlIGxfc2NudW1bMl07Ci0gIGJmZF9ieXRlIGxfc210eXBlWzFdOwotICBiZmRfYnl0ZSBsX3NtY2xhc1sxXTsKLSAgYmZkX2J5dGUgbF9pZmlsZVs0XTsKLSAgYmZkX2J5dGUgbF9wYXJtWzRdOwotfTsKLQotI2RlZmluZSBMRFNZTVNaICg4ICsgMyAqIDQgKyAyICsgMikKLQotLyogVGhlc2UgZmxhZ3MgYXJlIGZvciB0aGUgbF9zbXR5cGUgZmllbGQgKHRoZSBsb3dlciB0aHJlZSBiaXRzIGFyZSBhbgotICAgWFRZXyogdmFsdWUpLiAgKi8KLQotLyogSW1wb3J0ZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTF9JTVBPUlQgKDB4NDApCi0vKiBFbnRyeSBwb2ludC4gICovCi0jZGVmaW5lIExfRU5UUlkgKDB4MjApCi0vKiBFeHBvcnRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBMX0VYUE9SVCAoMHgxMCkKLQotLyogVGhlIGxkcmVsIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgYSByZWxvYyBpbiB0aGUKLSAgIC5sb2FkZXIgc2VjdGlvbi4gICovCi0KLXN0cnVjdCBpbnRlcm5hbF9sZHJlbAotewotICAvKiBUaGUgcmVsb2MgYWRkcmVzcy4gICovCi0gIGJmZF92bWEgbF92YWRkcjsKLSAgLyogVGhlIHN5bWJvbCB0YWJsZSBpbmRleCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uIHN5bWJvbCB0YWJsZS4gICovCi0gIGJmZF9zaXplX3R5cGUgbF9zeW1uZHg7Ci0gIC8qIFRoZSByZWxvY2F0aW9uIHR5cGUgYW5kIHNpemUuICAqLwotICBzaG9ydCBsX3J0eXBlOwotICAvKiBUaGUgc2VjdGlvbiBudW1iZXIgdGhpcyByZWxvY2F0aW9uIGFwcGxpZXMgdG8uICAqLwotICBzaG9ydCBsX3JzZWNubTsKLX07Ci0KLXN0cnVjdCBleHRlcm5hbF9sZHJlbAotewotICBiZmRfYnl0ZSBsX3ZhZGRyWzRdOwotICBiZmRfYnl0ZSBsX3N5bW5keFs0XTsKLSAgYmZkX2J5dGUgbF9ydHlwZVsyXTsKLSAgYmZkX2J5dGUgbF9yc2Vjbm1bMl07Ci19OwotCi0jZGVmaW5lIExEUkVMU1ogKDIgKiA0ICsgMiAqIDIpCi0KLS8qIFRoZSBsaXN0IG9mIGltcG9ydCBmaWxlcy4gICovCi0KLXN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZQotewotICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgbGlzdC4gICovCi0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbmV4dDsKLSAgLyogVGhlIHBhdGguICAqLwotICBjb25zdCBjaGFyICpwYXRoOwotICAvKiBUaGUgZmlsZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZTsKLSAgLyogVGhlIG1lbWJlciBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbWVtYmVyOwotfTsKLQotLyogQW4gZW50cnkgaW4gdGhlIFhDT0ZGIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSByb290OwotCi0gIC8qIFN5bWJvbCBpbmRleCBpbiBvdXRwdXQgZmlsZS4gIFNldCB0byAtMSBpbml0aWFsbHkuICBTZXQgdG8gLTIgaWYKLSAgICAgdGhlcmUgaXMgYSByZWxvYyBhZ2FpbnN0IHRoaXMgc3ltYm9sLiAgKi8KLSAgbG9uZyBpbmR4OwotCi0gIC8qIElmIHdlIGhhdmUgY3JlYXRlZCBhIFRPQyBlbnRyeSBmb3IgdGhpcyBzeW1ib2wsIHRoaXMgaXMgdGhlIC50YwotICAgICBzZWN0aW9uIHdoaWNoIGhvbGRzIGl0LiAgKi8KLSAgYXNlY3Rpb24gKnRvY19zZWN0aW9uOwotCi0gIHVuaW9uCi0gICAgewotICAgICAgLyogSWYgd2UgaGF2ZSBjcmVhdGVkIGEgVE9DIGVudHJ5ICh0aGUgWENPRkZfU0VUX1RPQyBmbGFnIGlzCi0JIHNldCksIHRoaXMgaXMgdGhlIG9mZnNldCBpbiB0b2Nfc2VjdGlvbi4gICovCi0gICAgICBiZmRfdm1hIHRvY19vZmZzZXQ7Ci0gICAgICAvKiBJZiB0aGUgVE9DIGVudHJ5IGNvbWVzIGZyb20gYW4gaW5wdXQgZmlsZSwgdGhpcyBpcyBzZXQgdG8gdGhlCi0gICAgICAgICBzeW1ib2wgaW5kZXggb2YgdGhlIENfSElERVhUIFhNQ19UQyBvciBYTUNfVEQgc3ltYm9sLiAgKi8KLSAgICAgIGxvbmcgdG9jX2luZHg7Ci0gICAgfSB1OwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQgd2hpY2ggaXMgY2FsbGVkLCB0aGlzCi0gICAgIGZpZWxkIGhvbGRzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gZGVzY3JpcHRvci4gIElmIHRoaXMgc3ltYm9sCi0gICAgIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvciwgdGhpcyBmaWVsZCBob2xkcyBhIHBvaW50ZXIgdG8gdGhlCi0gICAgIGZ1bmN0aW9uIGVudHJ5IHBvaW50LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqZGVzY3JpcHRvcjsKLQotICAvKiBUaGUgLmxvYWRlciBzeW1ib2wgdGFibGUgZW50cnksIGlmIHRoZXJlIGlzIG9uZS4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqbGRzeW07Ci0KLSAgLyogSWYgWENPRkZfQlVJTFRfTERTWU0gaXMgc2V0LCB0aGlzIGlzIHRoZSAubG9hZGVyIHN5bWJvbCB0YWJsZQotICAgICBpbmRleC4gIElmIFhDT0ZGX0JVSUxEX0xEU1lNIGlzIGNsZWFyLCBhbmQgWENPRkZfSU1QT1JUIGlzIHNldCwKLSAgICAgdGhpcyBpcyB0aGUgbF9pZmlsZSB2YWx1ZS4gICovCi0gIGxvbmcgbGRpbmR4OwotCi0gIC8qIFNvbWUgbGlua2VyIGZsYWdzLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZmxhZ3M7Ci0gIC8qIFN5bWJvbCBpcyByZWZlcmVuY2VkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9SRUZfUkVHVUxBUiAoMDEpCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhciBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9ERUZfUkVHVUxBUiAoMDIpCi0gIC8qIFN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QuICAqLwotI2RlZmluZSBYQ09GRl9ERUZfRFlOQU1JQyAoMDQpCi0gIC8qIFN5bWJvbCBpcyB1c2VkIGluIGEgcmVsb2MgYmVpbmcgY29waWVkIGludG8gdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0jZGVmaW5lIFhDT0ZGX0xEUkVMICgwMTApCi0gIC8qIFN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQuICAqLwotI2RlZmluZSBYQ09GRl9FTlRSWSAoMDIwKQotICAvKiBTeW1ib2wgaXMgY2FsbGVkOyB0aGlzIGlzLCBpdCBhcHBlYXJzIGluIGEgUl9CUiByZWxvYy4gICovCi0jZGVmaW5lIFhDT0ZGX0NBTExFRCAoMDQwKQotICAvKiBTeW1ib2wgbmVlZHMgdGhlIFRPQyBlbnRyeSBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYQ09GRl9TRVRfVE9DICgwMTAwKQotICAvKiBTeW1ib2wgaXMgZXhwbGljaXRseSBpbXBvcnRlZC4gICovCi0jZGVmaW5lIFhDT0ZGX0lNUE9SVCAoMDIwMCkKLSAgLyogU3ltYm9sIGlzIGV4cGxpY2l0bHkgZXhwb3J0ZWQuICAqLwotI2RlZmluZSBYQ09GRl9FWFBPUlQgKDA0MDApCi0gIC8qIFN5bWJvbCBoYXMgYmVlbiBwcm9jZXNzZWQgYnkgeGNvZmZfYnVpbGRfbGRzeW1zLiAgKi8KLSNkZWZpbmUgWENPRkZfQlVJTFRfTERTWU0gKDAxMDAwKQotICAvKiBTeW1ib2wgaXMgbWVudGlvbmVkIGJ5IGEgc2VjdGlvbiB3aGljaCB3YXMgbm90IGdhcmJhZ2UgY29sbGVjdGVkLiAgKi8KLSNkZWZpbmUgWENPRkZfTUFSSyAoMDIwMDApCi0gIC8qIFN5bWJvbCBzaXplIGlzIHJlY29yZGVkIGluIHNpemVfbGlzdCBsaXN0IGZyb20gaGFzaCB0YWJsZS4gICovCi0jZGVmaW5lIFhDT0ZGX0hBU19TSVpFICgwNDAwMCkKLSAgLyogU3ltYm9sIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIFhDT0ZGX0RFU0NSSVBUT1IgKDAxMDAwMCkKLSAgLyogTXVsdGlwbGUgZGVmaW5pdGlvbnMgaGF2ZSBiZWVuIGZvciB0aGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgWENPRkZfTVVMVElQTFlfREVGSU5FRCAoMDIwMDAwKQotCi0gIC8qIFRoZSBzdG9yYWdlIG1hcHBpbmcgY2xhc3MuICAqLwotICB1bnNpZ25lZCBjaGFyIHNtY2xhczsKLX07Ci0KLS8qIFRoZSBYQ09GRiBsaW5rZXIgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgcm9vdDsKLQotICAvKiBUaGUgLmRlYnVnIHN0cmluZyBoYXNoIHRhYmxlLiAgV2UgbmVlZCB0byBjb21wdXRlIHRoaXMgd2hpbGUKLSAgICAgcmVhZGluZyB0aGUgaW5wdXQgZmlsZXMsIHNvIHRoYXQgd2Uga25vdyBob3cgbGFyZ2UgdGhlIC5kZWJ1ZwotICAgICBzZWN0aW9uIHdpbGwgYmUgYmVmb3JlIHdlIGFzc2lnbiBzZWN0aW9uIHBvc2l0aW9ucy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKmRlYnVnX3N0cnRhYjsKLQotICAvKiBUaGUgLmRlYnVnIHNlY3Rpb24gd2Ugd2lsbCB1c2UgZm9yIHRoZSBmaW5hbCBvdXRwdXQuICAqLwotICBhc2VjdGlvbiAqZGVidWdfc2VjdGlvbjsKLQotICAvKiBUaGUgLmxvYWRlciBzZWN0aW9uIHdlIHdpbGwgdXNlIGZvciB0aGUgZmluYWwgb3V0cHV0LiAgKi8KLSAgYXNlY3Rpb24gKmxvYWRlcl9zZWN0aW9uOwotCi0gIC8qIEEgY291bnQgb2Ygbm9uIFRPQyByZWxhdGl2ZSByZWxvY3Mgd2hpY2ggd2lsbCBuZWVkIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLiAgKi8KLSAgc2l6ZV90IGxkcmVsX2NvdW50OwotCi0gIC8qIFRoZSAubG9hZGVyIHNlY3Rpb24gaGVhZGVyLiAgKi8KLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotCi0gIC8qIFRoZSAuZ2wgc2VjdGlvbiB3ZSB1c2UgdG8gaG9sZCBnbG9iYWwgbGlua2FnZSBjb2RlLiAgKi8KLSAgYXNlY3Rpb24gKmxpbmthZ2Vfc2VjdGlvbjsKLQotICAvKiBUaGUgLnRjIHNlY3Rpb24gd2UgdXNlIHRvIGhvbGQgdG9jIGVudHJpZXMgd2UgYnVpbGQgZm9yIGdsb2JhbAotICAgICBsaW5rYWdlIGNvZGUuICAqLwotICBhc2VjdGlvbiAqdG9jX3NlY3Rpb247Ci0KLSAgLyogVGhlIC5kcyBzZWN0aW9uIHdlIHVzZSB0byBob2xkIGZ1bmN0aW9uIGRlc2NyaXB0b3JzIHdoaWNoIHdlCi0gICAgIGNyZWF0ZSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4gICovCi0gIGFzZWN0aW9uICpkZXNjcmlwdG9yX3NlY3Rpb247Ci0KLSAgLyogVGhlIGxpc3Qgb2YgaW1wb3J0IGZpbGVzLiAgKi8KLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICppbXBvcnRzOwotCi0gIC8qIFJlcXVpcmVkIGFsaWdubWVudCBvZiBzZWN0aW9ucyB3aXRoaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotCi0gIC8qIFdoZXRoZXIgdGhlIC50ZXh0IHNlY3Rpb24gbXVzdCBiZSByZWFkLW9ubHkuICAqLwotICBib29sZWFuIHRleHRybzsKLQotICAvKiBXaGV0aGVyIGdhcmJhZ2UgY29sbGVjdGlvbiB3YXMgZG9uZS4gICovCi0gIGJvb2xlYW4gZ2M7Ci0KLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBzeW1ib2xzIGZvciB3aGljaCB3ZSBoYXZlIHNpemUgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QKLSAgICB7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKm5leHQ7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotICAgIH0gKnNpemVfbGlzdDsKLQotICAvKiBNYWdpYyBzZWN0aW9uczogX3RleHQsIF9ldGV4dCwgX2RhdGEsIF9lZGF0YSwgX2VuZCwgZW5kLiAgKi8KLSAgYXNlY3Rpb24gKnNwZWNpYWxfc2VjdGlvbnNbNl07Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlIGR1cmluZyB0aGUKLSAgIGZpbmFsIGxpbmsgcGhhc2UuICAqLwotCi1zdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8KLXsKLSAgLyogVGhlIHJlbG9jcyB0byBiZSBvdXRwdXQuICAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLSAgLyogRm9yIGVhY2ggcmVsb2MgYWdhaW5zdCBhIGdsb2JhbCBzeW1ib2wgd2hvc2UgaW5kZXggd2FzIG5vdCBrbm93bgotICAgICB3aGVuIHRoZSByZWxvYyB3YXMgaGFuZGxlZCwgdGhlIGdsb2JhbCBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnJlbF9oYXNoZXM7Ci0gIC8qIElmIHRoZXJlIGlzIGEgVE9DIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgYSBnbG9iYWwgc3ltYm9sLCBhbmQgdGhlCi0gICAgIGluZGV4IG9mIHRoZSBUT0Mgc3ltYm9sIGlzIG5vdCBrbm93biB3aGVuIHRoZSByZWxvYyB3YXMgaGFuZGxlZCwKLSAgICAgYW4gZW50cnkgaXMgYWRkZWQgdG8gdGhpcyBsaW5rZWQgbGlzdC4gIFRoaXMgaXMgbm90IGFuIGFycmF5LAotICAgICBsaWtlIHJlbF9oYXNoZXMsIGJlY2F1c2UgdGhpcyBjYXNlIGlzIHF1aXRlIHVuY29tbW9uLiAgKi8KLSAgc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaAotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2ggKm5leHQ7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0gICAgfSAqdG9jX3JlbF9oYXNoZXM7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiB0aGF0IHdlIHBhc3MgYXJvdW5kIHdoaWxlIGRvaW5nIHRoZSBmaW5hbCBsaW5rIHN0ZXAuICAqLwotCi1zdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvCi17Ci0gIC8qIEdlbmVyYWwgbGluayBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAvKiBPdXRwdXQgQkZELiAgKi8KLSAgYmZkICpvdXRwdXRfYmZkOwotICAvKiBIYXNoIHRhYmxlIGZvciBsb25nIHN5bWJvbCBuYW1lcy4gICovCi0gIHN0cnVjdCBiZmRfc3RydGFiX2hhc2ggKnN0cnRhYjsKLSAgLyogQXJyYXkgb2YgaW5mb3JtYXRpb24ga2VwdCBmb3IgZWFjaCBvdXRwdXQgc2VjdGlvbiwgaW5kZXhlZCBieSB0aGUKLSAgICAgdGFyZ2V0X2luZGV4IGZpZWxkLiAgKi8KLSAgc3RydWN0IHhjb2ZmX2xpbmtfc2VjdGlvbl9pbmZvICpzZWN0aW9uX2luZm87Ci0gIC8qIFN5bWJvbCBpbmRleCBvZiBsYXN0IENfRklMRSBzeW1ib2wgKC0xIGlmIG5vbmUpLiAgKi8KLSAgbG9uZyBsYXN0X2ZpbGVfaW5kZXg7Ci0gIC8qIENvbnRlbnRzIG9mIGxhc3QgQ19GSUxFIHN5bWJvbC4gICovCi0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgbGFzdF9maWxlOwotICAvKiBTeW1ib2wgaW5kZXggb2YgVE9DIHN5bWJvbC4gICovCi0gIGxvbmcgdG9jX3N5bWluZHg7Ci0gIC8qIFN0YXJ0IG9mIC5sb2FkZXIgc3ltYm9scy4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqbGRzeW07Ci0gIC8qIE5leHQgLmxvYWRlciByZWxvYyB0byBzd2FwIG91dC4gICovCi0gIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqbGRyZWw7Ci0gIC8qIEZpbGUgcG9zaXRpb24gb2Ygc3RhcnQgb2YgbGluZSBudW1iZXJzLiAgKi8KLSAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc3dhcHBlZCBzeW1ib2xzIG9mIGFueSBpbnB1dCBmaWxlLiAgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaW50ZXJuYWxfc3ltczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBpbmRpY2VzIG9mIHN5bWJvbHMgb2YgYW55Ci0gICAgIGlucHV0IGZpbGUuICAqLwotICBsb25nICpzeW1faW5kaWNlczsKLSAgLyogQnVmZmVyIGxhcmdlIGVub3VnaCB0byBob2xkIG91dHB1dCBzeW1ib2xzIGZvciBhbnkgaW5wdXQgZmlsZS4gICovCi0gIGJmZF9ieXRlICpvdXRzeW1zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgZXh0ZXJuYWwgbGluZSBudW1iZXJzIGZvciBhbnkgaW5wdXQKLSAgICAgc2VjdGlvbi4gICovCi0gIGJmZF9ieXRlICpsaW5lbm9zOwotICAvKiBCdWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gaG9sZCBleHRlcm5hbCByZWxvY3Mgb2YgYW55IGlucHV0IHNlY3Rpb24uICAqLwotICBiZmRfYnl0ZSAqZXh0ZXJuYWxfcmVsb2NzOwotfTsKLQotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZGhkcl9pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkaGRyICosIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkaGRyX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3Qgc3RydWN0IGludGVybmFsX2xkaGRyICosIHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2FwX2xkc3ltX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKiwgc3RydWN0IGludGVybmFsX2xkc3ltICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRzeW1fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKiwgc3RydWN0IGV4dGVybmFsX2xkc3ltICopKTsKLXN0YXRpYyB2b2lkIHhjb2ZmX3N3YXBfbGRyZWxfaW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqLCBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgKikpOwotc3RhdGljIHZvaWQgeGNvZmZfc3dhcF9sZHJlbF9vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqLCBzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwgKikpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqeGNvZmZfbGlua19oYXNoX25ld2Z1bmMKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc3RydWN0IGludGVybmFsX3JlbG9jICp4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotICBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYm9vbGVhbiwgYmZkX2J5dGUgKiwgYm9vbGVhbiwKLQkgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbGlua19hZGRfb2JqZWN0X3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfYXJjaGl2ZV9lbGVtZW50Ci0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2NoZWNrX2R5bmFtaWNfYXJfc3ltYm9scwotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGJmZF9saW5rX2luZm8gKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSB4Y29mZl9maW5kX3JlbG9jCi0gIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCBiZmRfc2l6ZV90eXBlLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9saW5rX2FkZF9keW5hbWljX3N5bWJvbHMKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX21hcmtfc3ltYm9sCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpOwotc3RhdGljIGJvb2xlYW4geGNvZmZfbWFyayBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCB4Y29mZl9zd2VlcCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB4Y29mZl9idWlsZF9sZHN5bXMKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX2xpbmtfaW5wdXRfYmZkCi0gIFBBUkFNUyAoKHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKiwgYmZkICopKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wKLSAgUEFSQU1TICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKiwgYXNlY3Rpb24gKiwKLQkgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKikpOwotc3RhdGljIGludCB4Y29mZl9zb3J0X3JlbG9jcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotDAotLyogUm91dGluZXMgdG8gc3dhcCBpbmZvcm1hdGlvbiBpbiB0aGUgWENPRkYgLmxvYWRlciBzZWN0aW9uLiAgSWYgd2UKLSAgIGV2ZXIgbmVlZCB0byB3cml0ZSBhbiBYQ09GRiBsb2FkZXIsIHRoaXMgc3R1ZmYgd2lsbCBuZWVkIHRvIGJlCi0gICBtb3ZlZCB0byBhbm90aGVyIGZpbGUgc2hhcmVkIGJ5IHRoZSBsaW5rZXIgKHdoaWNoIFhDT0ZGIGNhbGxzIHRoZQotICAgYGBiaW5kZXInJykgYW5kIHRoZSBsb2FkZXIuICAqLwotCi0vKiBTd2FwIGluIHRoZSBsZGhkciBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkaGRyICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZGhkciAqZHN0OwotewotICBkc3QtPmxfdmVyc2lvbiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF92ZXJzaW9uKTsKLSAgZHN0LT5sX25zeW1zID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX25zeW1zKTsKLSAgZHN0LT5sX25yZWxvYyA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9ucmVsb2MpOwotICBkc3QtPmxfaXN0bGVuID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2lzdGxlbik7Ci0gIGRzdC0+bF9uaW1waWQgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfbmltcGlkKTsKLSAgZHN0LT5sX2ltcG9mZiA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9pbXBvZmYpOwotICBkc3QtPmxfc3RsZW4gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfc3RsZW4pOwotICBkc3QtPmxfc3RvZmYgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfc3RvZmYpOwotfQotCi0vKiBTd2FwIG91dCB0aGUgbGRoZHIgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3YXBfbGRoZHJfb3V0IChhYmZkLCBzcmMsIGRzdCkKLSAgICAgYmZkICphYmZkOwotICAgICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgKnNyYzsKLSAgICAgc3RydWN0IGV4dGVybmFsX2xkaGRyICpkc3Q7Ci17Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF92ZXJzaW9uLCBkc3QtPmxfdmVyc2lvbik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9uc3ltcywgZHN0LT5sX25zeW1zKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX25yZWxvYywgZHN0LT5sX25yZWxvYyk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9pc3RsZW4sIGRzdC0+bF9pc3RsZW4pOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfbmltcGlkLCBkc3QtPmxfbmltcGlkKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX2ltcG9mZiwgZHN0LT5sX2ltcG9mZik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9zdGxlbiwgZHN0LT5sX3N0bGVuKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3N0b2ZmLCBkc3QtPmxfc3RvZmYpOwotfQotCi0vKiBTd2FwIGluIHRoZSBsZHN5bSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgc3JjLCBkc3QpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3Qgc3RydWN0IGV4dGVybmFsX2xkc3ltICpzcmM7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqZHN0OwotewotICBpZiAoYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5fbC5fbF9sLl9sX3plcm9lcykgIT0gMCkKLSAgICBtZW1jcHkgKGRzdC0+X2wuX2xfbmFtZSwgc3JjLT5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkc3QtPl9sLl9sX2wuX2xfemVyb2VzID0gMDsKLSAgICAgIGRzdC0+X2wuX2xfbC5fbF9vZmZzZXQgPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPl9sLl9sX2wuX2xfb2Zmc2V0KTsKLSAgICB9Ci0gIGRzdC0+bF92YWx1ZSA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF92YWx1ZSk7Ci0gIGRzdC0+bF9zY251bSA9IGJmZF9nZXRfMTYgKGFiZmQsIHNyYy0+bF9zY251bSk7Ci0gIGRzdC0+bF9zbXR5cGUgPSBiZmRfZ2V0XzggKGFiZmQsIHNyYy0+bF9zbXR5cGUpOwotICBkc3QtPmxfc21jbGFzID0gYmZkX2dldF84IChhYmZkLCBzcmMtPmxfc21jbGFzKTsKLSAgZHN0LT5sX2lmaWxlID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX2lmaWxlKTsKLSAgZHN0LT5sX3Bhcm0gPSBiZmRfZ2V0XzMyIChhYmZkLCBzcmMtPmxfcGFybSk7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZHN5bSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHN5bV9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmRzdDsKLXsKLSAgaWYgKHNyYy0+X2wuX2xfbC5fbF96ZXJvZXMgIT0gMCkKLSAgICBtZW1jcHkgKGRzdC0+X2wuX2xfbmFtZSwgc3JjLT5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCAwLCBkc3QtPl9sLl9sX2wuX2xfemVyb2VzKTsKLSAgICAgIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+X2wuX2xfbC5fbF9vZmZzZXQsIGRzdC0+X2wuX2xfbC5fbF9vZmZzZXQpOwotICAgIH0KLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZhbHVlLCBkc3QtPmxfdmFsdWUpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfc2NudW0sIGRzdC0+bF9zY251bSk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgc3JjLT5sX3NtdHlwZSwgZHN0LT5sX3NtdHlwZSk7Ci0gIGJmZF9wdXRfOCAoYWJmZCwgc3JjLT5sX3NtY2xhcywgZHN0LT5sX3NtY2xhcyk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIHNyYy0+bF9pZmlsZSwgZHN0LT5sX2lmaWxlKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3Bhcm0sIGRzdC0+bF9wYXJtKTsKLX0KLQotLyogU3dhcCBpbiB0aGUgbGRyZWwgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3YXBfbGRyZWxfaW4gKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqc3JjOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgKmRzdDsKLXsKLSAgZHN0LT5sX3ZhZGRyID0gYmZkX2dldF8zMiAoYWJmZCwgc3JjLT5sX3ZhZGRyKTsKLSAgZHN0LT5sX3N5bW5keCA9IGJmZF9nZXRfMzIgKGFiZmQsIHNyYy0+bF9zeW1uZHgpOwotICBkc3QtPmxfcnR5cGUgPSBiZmRfZ2V0XzE2IChhYmZkLCBzcmMtPmxfcnR5cGUpOwotICBkc3QtPmxfcnNlY25tID0gYmZkX2dldF8xNiAoYWJmZCwgc3JjLT5sX3JzZWNubSk7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBsZHJlbCBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgdm9pZAoteGNvZmZfc3dhcF9sZHJlbF9vdXQgKGFiZmQsIHNyYywgZHN0KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9sZHJlbCAqc3JjOwotICAgICBzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwgKmRzdDsKLXsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgc3JjLT5sX3ZhZGRyLCBkc3QtPmxfdmFkZHIpOwotICBiZmRfcHV0XzMyIChhYmZkLCBzcmMtPmxfc3ltbmR4LCBkc3QtPmxfc3ltbmR4KTsKLSAgYmZkX3B1dF8xNiAoYWJmZCwgc3JjLT5sX3J0eXBlLCBkc3QtPmxfcnR5cGUpOwotICBiZmRfcHV0XzE2IChhYmZkLCBzcmMtPmxfcnNlY25tLCBkc3QtPmxfcnNlY25tKTsKLX0KLQwKLS8qIFJvdXRpbmVzIHRvIHJlYWQgWENPRkYgZHluYW1pYyBpbmZvcm1hdGlvbi4gIFRoaXMgZG9uJ3QgcmVhbGx5Ci0gICBiZWxvbmcgaGVyZSwgYnV0IHdlIGFscmVhZHkgaGF2ZSB0aGUgbGRzeW0gbWFuaXB1bGF0aW9uIHJvdXRpbmVzCi0gICBoZXJlLiAgKi8KLQotLyogUmVhZCB0aGUgY29udGVudHMgb2YgYSBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpID09IE5VTEwpCi0gICAgewotICAgICAgc2VjLT51c2VkX2J5X2JmZCA9IGJmZF96YWxsb2MgKGFiZmQsCi0JCQkJICAgICBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLSAgICAgIGlmIChzZWMtPnVzZWRfYnlfYmZkID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID09IE5VTEwpCi0gICAgewotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzID0KLQkoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBzZWMpLT5jb250ZW50cyA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsCi0JCQkJICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIHNlYyktPmNvbnRlbnRzLAotCQkJCSAgICAgIChmaWxlX3B0cikgMCwgc2VjLT5fcmF3X3NpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEdldCB0aGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqbHNlYzsKLSAgYmZkX2J5dGUgKmNvbnRlbnRzOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19zeW1ib2xzKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKCEgeGNvZmZfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGxzZWMpKQotICAgIHJldHVybiAtMTsKLSAgY29udGVudHMgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzOwotCi0gIHhjb2ZmX3N3YXBfbGRoZHJfaW4gKGFiZmQsIChzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgY29udGVudHMsICZsZGhkcik7Ci0KLSAgcmV0dXJuIChsZGhkci5sX25zeW1zICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKik7Ci19Ci0KLS8qIEdldCB0aGUgZHluYW1pYyBzeW1ib2xzLiAgKi8KLQotbG9uZwotX2JmZF94Y29mZl9jYW5vbmljYWxpemVfZHluYW1pY19zeW10YWIgKGFiZmQsIHBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipwc3ltczsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKmVsc3ltLCAqZWxzeW1lbmQ7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKnN5bWJ1ZjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzID0gdHJ1ZTsKLQotICB4Y29mZl9zd2FwX2xkaGRyX2luIChhYmZkLCAoc3RydWN0IGV4dGVybmFsX2xkaGRyICopIGNvbnRlbnRzLCAmbGRoZHIpOwotCi0gIHN0cmluZ3MgPSAoY2hhciAqKSBjb250ZW50cyArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgc3ltYnVmID0gKChjb2ZmX3N5bWJvbF90eXBlICopCi0JICAgIGJmZF96YWxsb2MgKGFiZmQsIGxkaGRyLmxfbnN5bXMgKiBzaXplb2YgKGNvZmZfc3ltYm9sX3R5cGUpKSk7Ci0gIGlmIChzeW1idWYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChjb250ZW50cyArIExESERSU1opOwotICBlbHN5bWVuZCA9IGVsc3ltICsgbGRoZHIubF9uc3ltczsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyssIHN5bWJ1ZisrLCBwc3ltcysrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSBsZHN5bTsKLQotICAgICAgeGNvZmZfc3dhcF9sZHN5bV9pbiAoYWJmZCwgZWxzeW0sICZsZHN5bSk7Ci0KLSAgICAgIHN5bWJ1Zi0+c3ltYm9sLnRoZV9iZmQgPSBhYmZkOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQlzeW1idWYtPnN5bWJvbC5uYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgU1lNTk1MRU47IGkrKykKLQkgICAgaWYgKGxkc3ltLl9sLl9sX25hbWVbaV0gPT0gJ1wwJykKLQkgICAgICBicmVhazsKLQkgIGlmIChpIDwgU1lNTk1MRU4pCi0JICAgIHN5bWJ1Zi0+c3ltYm9sLm5hbWUgPSAoY2hhciAqKSBlbHN5bS0+X2wuX2xfbmFtZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmM7Ci0KLQkgICAgICBjID0gYmZkX2FsbG9jIChhYmZkLCBTWU1OTUxFTiArIDEpOwotCSAgICAgIGlmIChjID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQkgICAgICBtZW1jcHkgKGMsIGxkc3ltLl9sLl9sX25hbWUsIFNZTU5NTEVOKTsKLQkgICAgICBjW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICAgICAgc3ltYnVmLT5zeW1ib2wubmFtZSA9IGM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChsZHN5bS5sX3NtY2xhcyA9PSBYTUNfWE8pCi0Jc3ltYnVmLT5zeW1ib2wuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgICBlbHNlCi0Jc3ltYnVmLT5zeW1ib2wuc2VjdGlvbiA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwKLQkJCQkJCQkgICAgICBsZHN5bS5sX3NjbnVtKTsKLSAgICAgIHN5bWJ1Zi0+c3ltYm9sLnZhbHVlID0gbGRzeW0ubF92YWx1ZSAtIHN5bWJ1Zi0+c3ltYm9sLnNlY3Rpb24tPnZtYTsKLQotICAgICAgc3ltYnVmLT5zeW1ib2wuZmxhZ3MgPSBCU0ZfTk9fRkxBR1M7Ci0gICAgICBpZiAoKGxkc3ltLmxfc210eXBlICYgTF9FWFBPUlQpICE9IDApCi0Jc3ltYnVmLT5zeW1ib2wuZmxhZ3MgfD0gQlNGX0dMT0JBTDsKLQotICAgICAgLyogRklYTUU6IFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGUgb3RoZXIgaW5mb3JtYXRpb24gc3RvcmVkCi0gICAgICAgICB3aXRoIHRoZSBsb2FkZXIgc3ltYm9sLiAgKi8KLQotICAgICAgKnBzeW1zID0gKGFzeW1ib2wgKikgc3ltYnVmOwotICAgIH0KLQotICAqcHN5bXMgPSBOVUxMOwotCi0gIHJldHVybiBsZGhkci5sX25zeW1zOwotfQotCi0vKiBHZXQgdGhlIHNpemUgcmVxdWlyZWQgdG8gaG9sZCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2dldF9keW5hbWljX3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZXR1cm4gKGxkaGRyLmxfbnJlbG9jICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKik7Ci19Ci0KLS8qIFRoZSB0eXBpY2FsIGR5bmFtaWMgcmVsb2MuICAqLwotCi1zdGF0aWMgcmVsb2NfaG93dG9fdHlwZSB4Y29mZl9keW5hbWljX3JlbG9jID0KLSAgSE9XVE8gKDAsCSAgICAgICAgICAgICAgICAvKiB0eXBlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiByaWdodHNoaWZ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDIsCSAgICAgICAgICAgICAgICAvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8gCi0JIDMyLAkgICAgICAgICAgICAgICAgLyogYml0c2l6ZSAqLyAgICAgICAgICAgICAgICAgICAKLQkgZmFsc2UsCSAgICAgICAgICAgICAgICAvKiBwY19yZWxhdGl2ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIDAsCSAgICAgICAgICAgICAgICAvKiBiaXRwb3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGNvbXBsYWluX292ZXJmbG93X2JpdGZpZWxkLCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJICAgICAgICAvKiBzcGVjaWFsX2Z1bmN0aW9uICovICAgICAgICAgICAgICAgICAgICAgCi0JICJSX1BPUyIsICAgICAgICAgICAgICAgLyogbmFtZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCSB0cnVlLAkgICAgICAgICAgICAgICAgLyogcGFydGlhbF9pbnBsYWNlICovICAgICAgICAgICAgICAgICAgICAgIAotCSAweGZmZmZmZmZmLCAgICAgICAgICAgIC8qIHNyY19tYXNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgMHhmZmZmZmZmZiwgICAgICAgICAgICAvKiBkc3RfbWFzayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JIGZhbHNlKTsgICAgICAgICAgICAgICAgLyogcGNyZWxfb2Zmc2V0ICovCi0KLS8qIEdldCB0aGUgZHluYW1pYyByZWxvY3MuICAqLwotCi1sb25nCi1fYmZkX3hjb2ZmX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCBwcmVsb2NzLCBzeW1zKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFyZWxlbnQgKipwcmVsb2NzOwotICAgICBhc3ltYm9sICoqc3ltczsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyIGxkaGRyOwotICBhcmVsZW50ICpyZWxidWY7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqZWxyZWwsICplbHJlbGVuZDsKLQotICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBsc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIubG9hZGVyIik7Ci0gIGlmIChsc2VjID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIC0xOwotICBjb250ZW50cyA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBjb250ZW50cywgJmxkaGRyKTsKLQotICByZWxidWYgPSAoYXJlbGVudCAqKSBiZmRfYWxsb2MgKGFiZmQsIGxkaGRyLmxfbnJlbG9jICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gIGlmIChyZWxidWYgPT0gTlVMTCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgZWxyZWwgPSAoKHN0cnVjdCBleHRlcm5hbF9sZHJlbCAqKQotCSAgIChjb250ZW50cyArIExESERSU1ogKyBsZGhkci5sX25zeW1zICogTERTWU1TWikpOwotICBlbHJlbGVuZCA9IGVscmVsICsgbGRoZHIubF9ucmVsb2M7Ci0gIGZvciAoOyBlbHJlbCA8IGVscmVsZW5kOyBlbHJlbCsrLCByZWxidWYrKywgcHJlbG9jcysrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCBsZHJlbDsKLQotICAgICAgeGNvZmZfc3dhcF9sZHJlbF9pbiAoYWJmZCwgZWxyZWwsICZsZHJlbCk7Ci0KLSAgICAgIGlmIChsZHJlbC5sX3N5bW5keCA+PSAzKQotCXJlbGJ1Zi0+c3ltX3B0cl9wdHIgPSBzeW1zICsgKGxkcmVsLmxfc3ltbmR4IC0gMyk7Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqbmFtZTsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIHN3aXRjaCAobGRyZWwubF9zeW1uZHgpCi0JICAgIHsKLQkgICAgY2FzZSAwOgotCSAgICAgIG5hbWUgPSAiLnRleHQiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgbmFtZSA9ICIuZGF0YSI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBuYW1lID0gIi5ic3MiOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLQkgIGlmIChzZWMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCi0JICByZWxidWYtPnN5bV9wdHJfcHRyID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLQl9Ci0KLSAgICAgIHJlbGJ1Zi0+YWRkcmVzcyA9IGxkcmVsLmxfdmFkZHI7Ci0gICAgICByZWxidWYtPmFkZGVuZCA9IDA7Ci0KLSAgICAgIC8qIE1vc3QgZHluYW1pYyByZWxvY3MgaGF2ZSB0aGUgc2FtZSB0eXBlLiAgRklYTUU6IFRoaXMgaXMgb25seQotICAgICAgICAgY29ycmVjdCBpZiBsZHJlbC5sX3J0eXBlID09IDAuICBJbiBvdGhlciBjYXNlcywgd2Ugc2hvdWxkIHVzZQotICAgICAgICAgYSBkaWZmZXJlbnQgaG93dG8uICAqLwotICAgICAgcmVsYnVmLT5ob3d0byA9ICZ4Y29mZl9keW5hbWljX3JlbG9jOwotCi0gICAgICAvKiBGSVhNRTogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBsX3JzZWNubSBmaWVsZC4gICovCi0KLSAgICAgICpwcmVsb2NzID0gcmVsYnVmOwotICAgIH0KLQotICAqcHJlbG9jcyA9IE5VTEw7Ci0KLSAgcmV0dXJuIGxkaGRyLmxfbnJlbG9jOwotfQotDAotLyogUm91dGluZSB0byBjcmVhdGUgYW4gZW50cnkgaW4gYW4gWENPRkYgbGluayBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqCi14Y29mZl9saW5rX2hhc2hfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgZW50cnk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYnkgYQotICAgICBzdWJjbGFzcy4gICovCi0gIGlmIChyZXQgPT0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXQgPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSkpKTsKLSAgaWYgKHJldCA9PSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCSBfYmZkX2xpbmtfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwKLQkJCQkgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0ICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IGxvY2FsIGZpZWxkcy4gICovCi0gICAgICByZXQtPmluZHggPSAtMTsKLSAgICAgIHJldC0+dG9jX3NlY3Rpb24gPSBOVUxMOwotICAgICAgcmV0LT51LnRvY19pbmR4ID0gLTE7Ci0gICAgICByZXQtPmRlc2NyaXB0b3IgPSBOVUxMOwotICAgICAgcmV0LT5sZHN5bSA9IE5VTEw7Ci0gICAgICByZXQtPmxkaW5keCA9IC0xOwotICAgICAgcmV0LT5mbGFncyA9IDA7Ci0gICAgICByZXQtPnNtY2xhcyA9IFhNQ19VQTsKLSAgICB9Ci0KLSAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotfQotCi0vKiBDcmVhdGUgYSBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF90YWJsZSAqCi1fYmZkX3hjb2ZmX2JmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKnJldDsKLQotICByZXQgPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKikKLQkgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUpKSk7Ci0gIGlmIChyZXQgPT0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfdGFibGUgKikgTlVMTCkKLSAgICByZXR1cm4gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEw7Ci0gIGlmICghIF9iZmRfbGlua19oYXNoX3RhYmxlX2luaXQgKCZyZXQtPnJvb3QsIGFiZmQsIHhjb2ZmX2xpbmtfaGFzaF9uZXdmdW5jKSkKLSAgICB7Ci0gICAgICBiZmRfcmVsZWFzZSAoYWJmZCwgcmV0KTsKLSAgICAgIHJldHVybiAoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKikgTlVMTDsKLSAgICB9Ci0KLSAgcmV0LT5kZWJ1Z19zdHJ0YWIgPSBfYmZkX3hjb2ZmX3N0cmluZ3RhYl9pbml0ICgpOwotICByZXQtPmRlYnVnX3NlY3Rpb24gPSBOVUxMOwotICByZXQtPmxvYWRlcl9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5sZHJlbF9jb3VudCA9IDA7Ci0gIG1lbXNldCAoJnJldC0+bGRoZHIsIDAsIHNpemVvZiAoc3RydWN0IGludGVybmFsX2xkaGRyKSk7Ci0gIHJldC0+bGlua2FnZV9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT50b2Nfc2VjdGlvbiA9IE5VTEw7Ci0gIHJldC0+ZGVzY3JpcHRvcl9zZWN0aW9uID0gTlVMTDsKLSAgcmV0LT5pbXBvcnRzID0gTlVMTDsKLSAgcmV0LT5maWxlX2FsaWduID0gMDsKLSAgcmV0LT50ZXh0cm8gPSBmYWxzZTsKLSAgcmV0LT5nYyA9IGZhbHNlOwotICBtZW1zZXQgKHJldC0+c3BlY2lhbF9zZWN0aW9ucywgMCwgc2l6ZW9mIHJldC0+c3BlY2lhbF9zZWN0aW9ucyk7Ci0KLSAgLyogVGhlIGxpbmtlciB3aWxsIGFsd2F5cyBnZW5lcmF0ZSBhIGZ1bGwgYS5vdXQgaGVhZGVyLiAgV2UgbmVlZCB0bwotICAgICByZWNvcmQgdGhhdCBmYWN0IG5vdywgYmVmb3JlIHRoZSBzaXplb2ZfaGVhZGVycyByb3V0aW5lIGNvdWxkIGJlCi0gICAgIGNhbGxlZC4gICovCi0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5mdWxsX2FvdXRoZHIgPSB0cnVlOwotCi0gIHJldHVybiAmcmV0LT5yb290OwotfQotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIGFuIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgeGNvZmZfbGlua19oYXNoX2xvb2t1cCh0YWJsZSwgc3RyaW5nLCBjcmVhdGUsIGNvcHksIGZvbGxvdykgXAotICAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2xpbmtfaGFzaF9sb29rdXAgKCYodGFibGUpLT5yb290LCAoc3RyaW5nKSwgKGNyZWF0ZSksIChjb3B5KSxcCi0JCQkgKGZvbGxvdykpKQotCi0vKiBUcmF2ZXJzZSBhbiBYQ09GRiBsaW5rIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIHhjb2ZmX2xpbmtfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfbGlua19oYXNoX3RyYXZlcnNlCQkJCQkJXAotICAgKCYodGFibGUpLT5yb290LAkJCQkJCQlcCi0gICAgKGJvb2xlYW4gKCopIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBHZXQgdGhlIFhDT0ZGIGxpbmsgaGFzaCB0YWJsZSBmcm9tIHRoZSBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMKLSAgIGp1c3QgYSBjYXN0LiAgKi8KLQotI2RlZmluZSB4Y29mZl9oYXNoX3RhYmxlKHApICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF90YWJsZSAqKSAoKHApLT5oYXNoKSkKLQwKLS8qIFJlYWQgaW50ZXJuYWwgcmVsb2NzIGZvciBhbiBYQ09GRiBjc2VjdC4gIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZAotICAgX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIHdoaWNoIHRyaWVzIHRvIHRha2UgYWR2YW50YWdlIG9mIGFueQotICAgcmVsb2NzIHdoaWNoIG1heSBoYXZlIGJlZW4gY2FjaGVkIGZvciB0aGUgZW5jbG9zaW5nIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IGludGVybmFsX3JlbG9jICoKLXhjb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkgICAgcmVxdWlyZV9pbnRlcm5hbCwgaW50ZXJuYWxfcmVsb2NzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGJvb2xlYW4gY2FjaGU7Ci0gICAgIGJmZF9ieXRlICpleHRlcm5hbF9yZWxvY3M7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9pbnRlcm5hbDsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICppbnRlcm5hbF9yZWxvY3M7Ci17Ci0gIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+cmVsb2NzID09IE5VTEwKLSAgICAgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0KLSAgICAgIGVuY2xvc2luZyA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgc2VjKS0+ZW5jbG9zaW5nOwotCi0gICAgICBpZiAoZW5jbG9zaW5nICE9IE5VTEwKLQkgICYmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKSA9PSBOVUxMCi0JICAgICAgfHwgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGVuY2xvc2luZyktPnJlbG9jcyA9PSBOVUxMKQotCSAgJiYgY2FjaGUKLQkgICYmIGVuY2xvc2luZy0+cmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGlmIChfYmZkX2NvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKGFiZmQsIGVuY2xvc2luZywgdHJ1ZSwKLQkJCQkJICAgICAgZXh0ZXJuYWxfcmVsb2NzLCBmYWxzZSwKLQkJCQkJICAgICAgKHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBOVUxMKQotCSAgICAgID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgaWYgKGVuY2xvc2luZyAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKSAhPSBOVUxMCi0JICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICE9IE5VTEwpCi0JewotCSAgc2l6ZV90IG9mZjsKLQotCSAgb2ZmID0gKChzZWMtPnJlbF9maWxlcG9zIC0gZW5jbG9zaW5nLT5yZWxfZmlsZXBvcykKLQkJIC8gYmZkX2NvZmZfcmVsc3ogKGFiZmQpKTsKLQkgIGlmICghIHJlcXVpcmVfaW50ZXJuYWwpCi0JICAgIHJldHVybiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgZW5jbG9zaW5nKS0+cmVsb2NzICsgb2ZmOwotCSAgbWVtY3B5IChpbnRlcm5hbF9yZWxvY3MsCi0JCSAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGVuY2xvc2luZyktPnJlbG9jcyArIG9mZiwKLQkJICBzZWMtPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLQkgIHJldHVybiBpbnRlcm5hbF9yZWxvY3M7Ci0JfQotICAgIH0KLQotICByZXR1cm4gX2JmZF9jb2ZmX3JlYWRfaW50ZXJuYWxfcmVsb2NzIChhYmZkLCBzZWMsIGNhY2hlLCBleHRlcm5hbF9yZWxvY3MsCi0JCQkJCSByZXF1aXJlX2ludGVybmFsLCBpbnRlcm5hbF9yZWxvY3MpOwotfQotDAotLyogR2l2ZW4gYW4gWENPRkYgQkZELCBhZGQgc3ltYm9scyB0byB0aGUgZ2xvYmFsIGhhc2ggdGFibGUgYXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotYm9vbGVhbgotX2JmZF94Y29mZl9iZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2Zvcm1hdCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX29iamVjdDoKLSAgICAgIHJldHVybiB4Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbyk7Ci0KLSAgICBjYXNlIGJmZF9hcmNoaXZlOgotICAgICAgLyogSWYgdGhlIGFyY2hpdmUgaGFzIGEgbWFwLCBkbyB0aGUgdXN1YWwgc2VhcmNoLiAgV2UgdGhlbiBuZWVkCi0gICAgICAgICB0byBjaGVjayB0aGUgYXJjaGl2ZSBmb3Igc3RyaXBwZWQgZHluYW1pYyBvYmplY3RzLCBiZWNhdXNlCi0gICAgICAgICB0aGV5IHdpbGwgbm90IGFwcGVhciBpbiB0aGUgYXJjaGl2ZSBtYXAgZXZlbiB0aG91Z2ggdGhleQotICAgICAgICAgc2hvdWxkLCBwZXJoYXBzLCBiZSBpbmNsdWRlZC4gIElmIHRoZSBhcmNoaXZlIGhhcyBubyBtYXAsIHdlCi0gICAgICAgICBqdXN0IGNvbnNpZGVyIGVhY2ggb2JqZWN0IGZpbGUgaW4gdHVybiwgc2luY2UgdGhhdCBhcHBhcmVudGx5Ci0gICAgICAgICBpcyB3aGF0IHRoZSBBSVggbmF0aXZlIGxpbmtlciBkb2VzLiAgKi8KLSAgICAgIGlmIChiZmRfaGFzX21hcCAoYWJmZCkpCi0JewotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMKLQkJIChhYmZkLCBpbmZvLCB4Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB7Ci0JYmZkICptZW1iZXI7Ci0KLQltZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhYmZkLCAoYmZkICopIE5VTEwpOwotCXdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQkgIHsKLQkgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKG1lbWJlciwgYmZkX29iamVjdCkKLQkJJiYgKCEgYmZkX2hhc19tYXAgKGFiZmQpCi0JCSAgICB8fCAoKG1lbWJlci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0JCQkmJiAobWVtYmVyLT5mbGFncyAmIEhBU19TWU1TKSA9PSAwKSkpCi0JICAgICAgewotCQlib29sZWFuIG5lZWRlZDsKLQotCQlpZiAoISB4Y29mZl9saW5rX2NoZWNrX2FyY2hpdmVfZWxlbWVudCAobWVtYmVyLCBpbmZvLCAmbmVlZGVkKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmIChuZWVkZWQpCi0JCSAgbWVtYmVyLT5hcmNoaXZlX3Bhc3MgPSAtMTsKLQkgICAgICB9Ci0JICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFiZmQsIG1lbWJlcik7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl93cm9uZ19mb3JtYXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogQWRkIHN5bWJvbHMgZnJvbSBhbiBYQ09GRiBvYmplY3QgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9saW5rX2FkZF9vYmplY3Rfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChhYmZkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghIHhjb2ZmX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENoZWNrIGEgc2luZ2xlIGFyY2hpdmUgZWxlbWVudCB0byBzZWUgaWYgd2UgbmVlZCB0byBpbmNsdWRlIGl0IGluCi0gICB0aGUgbGluay4gICpQTkVFREVEIGlzIHNldCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGlzIGVsZW1lbnQgaXMKLSAgIG5lZWRlZCBpbiB0aGUgbGluayBvciBub3QuICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIF9iZmRfZ2VuZXJpY19saW5rX2FkZF9hcmNoaXZlX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19hcmNoaXZlX2VsZW1lbnQgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoYWJmZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHhjb2ZmX2xpbmtfY2hlY2tfYXJfc3ltYm9scyAoYWJmZCwgaW5mbywgcG5lZWRlZCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgqcG5lZWRlZCkKLSAgICB7Ci0gICAgICBpZiAoISB4Y29mZl9saW5rX2FkZF9zeW1ib2xzIChhYmZkLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGluZm8tPmtlZXBfbWVtb3J5IHx8ICEgKnBuZWVkZWQpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoYWJmZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzIHRvIHNlZSBpZiB0aGlzIG9iamVjdCBmaWxlIHNob3VsZCBiZQotICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBib29sZWFuICpwbmVlZGVkOwotewotICBiZmRfc2l6ZV90eXBlIHN5bWVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiAhIGluZm8tPnN0YXRpY19saW5rCi0gICAgICAmJiBpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0gICAgcmV0dXJuIHhjb2ZmX2xpbmtfY2hlY2tfZHluYW1pY19hcl9zeW1ib2xzIChhYmZkLCBpbmZvLCBwbmVlZGVkKTsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgKiBzeW1lc3o7Ci0gIHdoaWxlIChlc3ltIDwgZXN5bV9lbmQpCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW07Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChhYmZkLCAoUFRSKSBlc3ltLCAoUFRSKSAmc3ltKTsKLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCAmJiBzeW0ubl9zY251bSAhPSBOX1VOREVGKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgIC8qIFRoaXMgc3ltYm9sIGlzIGV4dGVybmFsbHkgdmlzaWJsZSwgYW5kIGlzIGRlZmluZWQgYnkgdGhpcwotICAgICAgICAgICAgIG9iamVjdCBmaWxlLiAgKi8KLQotCSAgbmFtZSA9IF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZSAoYWJmZCwgJnN5bSwgYnVmKTsKLQkgIGlmIChuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotCSAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHRoYXQgYXJlIGN1cnJlbnRseQotCSAgICAgdW5kZWZpbmVkLiAgSWYgYSBzeW1ib2wgaXMgY3VycmVudGx5IGtub3duIHRvIGJlIGNvbW1vbiwKLQkgICAgIFhDT0ZGIGxpbmtlcnMgZG8gbm90IGJyaW5nIGluIGFuIG9iamVjdCBmaWxlIHdoaWNoCi0JICAgICBkZWZpbmVzIGl0LiAgV2UgYWxzbyBkb24ndCBicmluZyBpbiBzeW1ib2xzIHRvIHNhdGlzZnkKLQkgICAgIHVuZGVmaW5lZCByZWZlcmVuY2VzIGluIHNoYXJlZCBvYmplY3RzLiAgKi8KLQkgIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0JICAgICAgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgICYmIChpbmZvLT5oYXNoLT5jcmVhdG9yICE9IGFiZmQtPnh2ZWMKLQkJICB8fCAoKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5mbGFncwotCQkgICAgICAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGlmICghICgqaW5mby0+Y2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KSAoaW5mbywgYWJmZCwgbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICAqcG5lZWRlZCA9IHRydWU7Ci0JICAgICAgcmV0dXJuIHRydWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgbG9hZGVyIHN5bWJvbHMgdG8gc2VlIGlmIHRoaXMgZHluYW1pYyBvYmplY3QKLSAgIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIFRoZSBuYXRpdmUgbGlua2VyIHVzZXMgdGhlIGxvYWRlcgotICAgc3ltYm9scywgbm90IHRoZSBub3JtYWwgc3ltYm9sIHRhYmxlLCBzbyB3ZSBkbyB0b28uICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19jaGVja19keW5hbWljX2FyX3N5bWJvbHMgKGFiZmQsIGluZm8sIHBuZWVkZWQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gKnBuZWVkZWQ7Ci17Ci0gIGFzZWN0aW9uICpsc2VjOwotICBiZmRfYnl0ZSAqYnVmOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRoZHIgbGRoZHI7Ci0gIGNvbnN0IGNoYXIgKnN0cmluZ3M7Ci0gIHN0cnVjdCBleHRlcm5hbF9sZHN5bSAqZWxzeW0sICplbHN5bWVuZDsKLQotICAqcG5lZWRlZCA9IGZhbHNlOwotCi0gIGxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5sb2FkZXIiKTsKLSAgaWYgKGxzZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGVyZSBhcmUgbm8gc3ltYm9scywgc28gZG9uJ3QgdHJ5IHRvIGluY2x1ZGUgaXQuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmICghIHhjb2ZmX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBsc2VjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJ1ZiA9IGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHM7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBidWYsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJ1ZiArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChidWYgKyBMREhEUlNaKTsKLSAgZWxzeW1lbmQgPSBlbHN5bSArIGxkaGRyLmxfbnN5bXM7Ci0gIGZvciAoOyBlbHN5bSA8IGVsc3ltZW5kOyBlbHN5bSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHN5bSBsZHN5bTsKLSAgICAgIGNoYXIgbmFtYnVmW1NZTU5NTEVOICsgMV07Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIHhjb2ZmX3N3YXBfbGRzeW1faW4gKGFiZmQsIGVsc3ltLCAmbGRzeW0pOwotCi0gICAgICAvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGV4cG9ydGVkIHN5bWJvbHMuICAqLwotICAgICAgaWYgKChsZHN5bS5sX3NtdHlwZSAmIExfRVhQT1JUKSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAobGRzeW0uX2wuX2xfbC5fbF96ZXJvZXMgPT0gMCkKLQluYW1lID0gc3RyaW5ncyArIGxkc3ltLl9sLl9sX2wuX2xfb2Zmc2V0OwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAobmFtYnVmLCBsZHN5bS5fbC5fbF9uYW1lLCBTWU1OTUxFTik7Ci0JICBuYW1idWZbU1lNTk1MRU5dID0gJ1wwJzsKLQkgIG5hbWUgPSBuYW1idWY7Ci0JfQotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsIG5hbWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0KLSAgICAgIC8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gc3ltYm9scyB0aGF0IGFyZSBjdXJyZW50bHkKLSAgICAgICAgIHVuZGVmaW5lZC4gIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHdlIGFyZSB1c2luZyBhbiBYQ09GRgotICAgICAgICAgaGFzaCB0YWJsZS4gICovCi0gICAgICBpZiAoaCAhPSBOVUxMCi0JICAmJiBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAmJiAoKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopIGgpLT5mbGFncwotCSAgICAgICYgWENPRkZfREVGX0RZTkFNSUMpID09IDApCi0JewotCSAgaWYgKCEgKCppbmZvLT5jYWxsYmFja3MtPmFkZF9hcmNoaXZlX2VsZW1lbnQpIChpbmZvLCBhYmZkLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgKnBuZWVkZWQgPSB0cnVlOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBXZSBkbyBub3QgbmVlZCB0aGlzIHNoYXJlZCBvYmplY3QuICAqLwotCi0gIGlmIChidWYgIT0gTlVMTCAmJiAhIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+a2VlcF9jb250ZW50cykKLSAgICB7Ci0gICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzKTsKLSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMgPSBOVUxMOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyB0aGUgaW5kZXggb2YgcmVsb2MgaW4gUkVMT0NTIHdpdGggdGhlIGxlYXN0IGFkZHJlc3MgZ3JlYXRlcgotICAgdGhhbiBvciBlcXVhbCB0byBBRERSRVNTLiAgVGhlIHJlbG9jcyBhcmUgc29ydGVkIGJ5IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZQoteGNvZmZfZmluZF9yZWxvYyAocmVsb2NzLCBjb3VudCwgYWRkcmVzcykKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgYmZkX3NpemVfdHlwZSBtaW4sIG1heCwgdGhpczsKLQotICBpZiAoY291bnQgPCAyKQotICAgIHsKLSAgICAgIGlmIChjb3VudCA9PSAxICYmIHJlbG9jc1swXS5yX3ZhZGRyIDwgYWRkcmVzcykKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgbWluID0gMDsKLSAgbWF4ID0gY291bnQ7Ci0KLSAgLyogRG8gYSBiaW5hcnkgc2VhcmNoIG92ZXIgKG1pbixtYXhdLiAgKi8KLSAgd2hpbGUgKG1pbiArIDEgPCBtYXgpCi0gICAgewotICAgICAgYmZkX3ZtYSByYWRkcjsKLQotICAgICAgdGhpcyA9IChtYXggKyBtaW4pIC8gMjsKLSAgICAgIHJhZGRyID0gcmVsb2NzW3RoaXNdLnJfdmFkZHI7Ci0gICAgICBpZiAocmFkZHIgPiBhZGRyZXNzKQotCW1heCA9IHRoaXM7Ci0gICAgICBlbHNlIGlmIChyYWRkciA8IGFkZHJlc3MpCi0JbWluID0gdGhpczsKLSAgICAgIGVsc2UKLQl7Ci0JICBtaW4gPSB0aGlzOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAocmVsb2NzW21pbl0ucl92YWRkciA8IGFkZHJlc3MpCi0gICAgcmV0dXJuIG1pbiArIDE7Ci0KLSAgd2hpbGUgKG1pbiA+IDAKLQkgJiYgcmVsb2NzW21pbiAtIDFdLnJfdmFkZHIgPT0gYWRkcmVzcykKLSAgICAtLW1pbjsKLQotICByZXR1cm4gbWluOwotfQotCi0vKiBBZGQgYWxsIHRoZSBzeW1ib2xzIGZyb20gYW4gb2JqZWN0IGZpbGUgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIFhDT0ZGIGlzIGEgd2VpcmQgZm9ybWF0LiAgQSBub3JtYWwgWENPRkYgLm8gZmlsZXMgd2lsbCBoYXZlIHRocmVlCi0gICBDT0ZGIHNlY3Rpb25zLS0udGV4dCwgLmRhdGEsIGFuZCAuYnNzLS1idXQgZWFjaCBDT0ZGIHNlY3Rpb24gd2lsbAotICAgY29udGFpbiBtYW55IGNzZWN0cy4gIFRoZXNlIGNzZWN0cyBhcmUgZGVzY3JpYmVkIGluIHRoZSBzeW1ib2wKLSAgIHRhYmxlLiAgRnJvbSB0aGUgbGlua2VyJ3MgcG9pbnQgb2YgdmlldywgZWFjaCBjc2VjdCBtdXN0IGJlCi0gICBjb25zaWRlcmVkIGEgc2VjdGlvbiBpbiBpdHMgb3duIHJpZ2h0LiAgRm9yIGV4YW1wbGUsIGEgVE9DIGVudHJ5IGlzCi0gICBoYW5kbGVkIGFzIGEgc21hbGwgWE1DX1RDIGNzZWN0LiAgVGhlIGxpbmtlciBtdXN0IGJlIGFibGUgdG8gbWVyZ2UKLSAgIGRpZmZlcmVudCBUT0MgZW50cmllcyB0b2dldGhlciwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtdXN0IGJlIGFibGUgdG8KLSAgIGV4dHJhY3QgdGhlIFhNQ19UQyBjc2VjdHMgZnJvbSB0aGUgLmRhdGEgc2VjdGlvbiBvZiB0aGUgaW5wdXQgLm8KLSAgIGZpbGUuCi0KLSAgIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2Ygb3VyIGxpbmtlciwgdGhpcyBpcywgb2YgY291cnNlLCBhIGhpZGVvdXMKLSAgIG5pZ2h0bWFyZS4gIFdlIGNvcGUgYnkgYWN0dWFsbHkgY3JlYXRpbmcgc2VjdGlvbnMgZm9yIGVhY2ggY3NlY3QsCi0gICBhbmQgZGlzY2FyZGluZyB0aGUgb3JpZ2luYWwgc2VjdGlvbnMuICBXZSB0aGVuIGhhdmUgdG8gaGFuZGxlIHRoZQotICAgcmVsb2NhdGlvbiBlbnRyaWVzIGNhcmVmdWxseSwgc2luY2UgdGhlIG9ubHkgd2F5IHRvIHRlbGwgd2hpY2gKLSAgIGNzZWN0IHRoZXkgYmVsb25nIHRvIGlzIHRvIGV4YW1pbmUgdGhlIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IG5fdG1hc2s7Ci0gIHVuc2lnbmVkIGludCBuX2J0c2hmdDsKLSAgYm9vbGVhbiBkZWZhdWx0X2NvcHk7Ci0gIGJmZF9zaXplX3R5cGUgc3ltY291bnQ7Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKipzeW1faGFzaDsKLSAgYXNlY3Rpb24gKipjc2VjdF9jYWNoZTsKLSAgYmZkX3NpemVfdHlwZSBsaW5lc3o7Ci0gIGFzZWN0aW9uICpvOwotICBhc2VjdGlvbiAqbGFzdF9yZWFsOwotICBib29sZWFuIGtlZXBfc3ltczsKLSAgYXNlY3Rpb24gKmNzZWN0OwotICB1bnNpZ25lZCBpbnQgY3NlY3RfaW5kZXg7Ci0gIGFzZWN0aW9uICpmaXJzdF9jc2VjdDsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIGJmZF9ieXRlICplc3ltOwotICBiZmRfYnl0ZSAqZXN5bV9lbmQ7Ci0gIHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdAotICAgIHsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotICAgICAgYXNlY3Rpb24gKipjc2VjdHM7Ci0gICAgICBiZmRfYnl0ZSAqbGluZW5vczsKLSAgICB9ICpyZWxvY19pbmZvID0gTlVMTDsKLQotICBrZWVwX3N5bXMgPSBvYmpfY29mZl9rZWVwX3N5bXMgKGFiZmQpOwotCi0gIGlmICgoYWJmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiAhIGluZm8tPnN0YXRpY19saW5rKQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gYnVpbGQgYSAubG9hZGVyIHNlY3Rpb24sIHNvIHdlIGRvIGl0IGhlcmUuICBUaGlzCi0JIHdvbid0IHdvcmsgaWYgd2UncmUgcHJvZHVjaW5nIGFuIFhDT0ZGIG91dHB1dCBmaWxlIHdpdGggbm8KLQkgWENPRkYgaW5wdXQgZmlsZXMuICBGSVhNRS4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmxzZWM7Ci0KLQkgIGxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5sb2FkZXIiKTsKLQkgIGlmIChsc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uID0gbHNlYzsKLQkgIGxzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgbGlua2FnZSBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKmxzZWM7Ci0KLQkgIGxzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi5nbCIpOwotCSAgaWYgKGxzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uID0gbHNlYzsKLQkgIGxzZWMtPmZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCSAgfCBTRUNfSU5fTUVNT1JZKTsKLQkgIGxzZWMtPmFsaWdubWVudF9wb3dlciA9IDI7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIHRoZSBUT0Mgc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnRzZWM7Ci0KLQkgIHRzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoYWJmZCwgIi50YyIpOwotCSAgaWYgKHRzZWMgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24gPSB0c2VjOwotCSAgdHNlYy0+ZmxhZ3MgfD0gKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUwotCQkJICB8IFNFQ19JTl9NRU1PUlkpOwotCSAgdHNlYy0+YWxpZ25tZW50X3Bvd2VyID0gMjsKLQl9Ci0gICAgICAvKiBMaWtld2lzZSBmb3IgdGhlIGRlc2NyaXB0b3Igc2VjdGlvbi4gICovCi0gICAgICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGFzZWN0aW9uICpkc2VjOwotCi0JICBkc2VjID0gYmZkX21ha2Vfc2VjdGlvbl9hbnl3YXkgKGFiZmQsICIuZHMiKTsKLQkgIGlmIChkc2VjID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbiA9IGRzZWM7Ci0JICBkc2VjLT5mbGFncyB8PSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTCi0JCQkgIHwgU0VDX0lOX01FTU9SWSk7Ci0JICBkc2VjLT5hbGlnbm1lbnRfcG93ZXIgPSAyOwotCX0KLSAgICAgIC8qIExpa2V3aXNlIGZvciB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uID09IE5VTEwKLQkgICYmIGluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQl7Ci0JICBhc2VjdGlvbiAqZHNlYzsKLQotCSAgZHNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmRlYnVnIik7Ci0JICBpZiAoZHNlYyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uID0gZHNlYzsKLQkgIGRzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfSU5fTUVNT1JZOwotCX0KLSAgICB9Ci0KLSAgaWYgKChhYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDAKLSAgICAgICYmICEgaW5mby0+c3RhdGljX2xpbmspCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbl90bWFzayA9IGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdG1hc2s7Ci0gIG5fYnRzaGZ0ID0gY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl9idHNoZnQ7Ci0KLSAgLyogRGVmaW5lIG1hY3JvcyBzbyB0aGF0IElTRkNOLCBldC4gYWwuLCBtYWNyb3Mgd29yayBjb3JyZWN0bHkuICAqLwotI2RlZmluZSBOX1RNQVNLIG5fdG1hc2sKLSNkZWZpbmUgTl9CVFNIRlQgbl9idHNoZnQKLQotICBpZiAoaW5mby0+a2VlcF9tZW1vcnkpCi0gICAgZGVmYXVsdF9jb3B5ID0gZmFsc2U7Ci0gIGVsc2UKLSAgICBkZWZhdWx0X2NvcHkgPSB0cnVlOwotCi0gIHN5bWNvdW50ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpOwotCi0gIC8qIFdlIGtlZXAgYSBsaXN0IG9mIHRoZSBsaW5rZXIgaGFzaCB0YWJsZSBlbnRyaWVzIHRoYXQgY29ycmVzcG9uZAotICAgICB0byBlYWNoIGV4dGVybmFsIHN5bWJvbC4gICovCi0gIHN5bV9oYXNoID0gKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgIGJmZF9hbGxvYyAoYWJmZCwKLQkJCSAoc3ltY291bnQKLQkJCSAgKiBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikpKSk7Ci0gIGlmIChzeW1faGFzaCA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGNvZmZfZGF0YSAoYWJmZCktPnN5bV9oYXNoZXMgPSAoc3RydWN0IGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaDsKLSAgbWVtc2V0IChzeW1faGFzaCwgMCwKLQkgIChzaXplX3QpIHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICopKTsKLQotICAvKiBCZWNhdXNlIG9mIHRoZSB3ZWlyZCBzdHVmZiB3ZSBhcmUgZG9pbmcgd2l0aCBYQ09GRiBjc2VjdHMsIHdlIGNhbgotICAgICBub3QgZWFzaWx5IGRldGVybWluZSB3aGljaCBzZWN0aW9uIGEgc3ltYm9sIGlzIGluLCBzbyB3ZSBzdG9yZQotICAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHRkYXRhIGZvciB0aGUgaW5wdXQgZmlsZS4gICovCi0gIGNzZWN0X2NhY2hlID0gKChhc2VjdGlvbiAqKikKLQkJIGJmZF9hbGxvYyAoYWJmZCwgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKSk7Ci0gIGlmIChjc2VjdF9jYWNoZSA9PSBOVUxMICYmIHN5bWNvdW50ICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIHhjb2ZmX2RhdGEgKGFiZmQpLT5jc2VjdHMgPSBjc2VjdF9jYWNoZTsKLSAgbWVtc2V0IChjc2VjdF9jYWNoZSwgMCwgKHNpemVfdCkgc3ltY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQotICAvKiBXaGlsZSBzcGxpdHRpbmcgc2VjdGlvbnMgaW50byBjc2VjdHMsIHdlIG5lZWQgdG8gYXNzaWduIHRoZQotICAgICByZWxvY3MgY29ycmVjdGx5LiAgVGhlIHJlbG9jcyBhbmQgdGhlIGNzZWN0cyBtdXN0IGJvdGggYmUgaW4KLSAgICAgb3JkZXIgYnkgVk1BIHdpdGhpbiBhIGdpdmVuIHNlY3Rpb24sIHNvIHdlIGhhbmRsZSB0aGlzIGJ5Ci0gICAgIHNjYW5uaW5nIGFsb25nIHRoZSByZWxvY3MgYXMgd2UgcHJvY2VzcyB0aGUgY3NlY3RzLiAgV2UgaW5kZXgKLSAgICAgaW50byByZWxvY19pbmZvIHVzaW5nIHRoZSBzZWN0aW9uIHRhcmdldF9pbmRleC4gICovCi0gIHJlbG9jX2luZm8gPSAoKHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdCAqKQotCQliZmRfbWFsbG9jICgoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpCi0JCQkgICAgKiBzaXplb2YgKHN0cnVjdCByZWxvY19pbmZvX3N0cnVjdCkpKTsKLSAgaWYgKHJlbG9jX2luZm8gPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbWVtc2V0ICgoUFRSKSByZWxvY19pbmZvLCAwLAotCSAgKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKSAqIHNpemVvZiAoc3RydWN0IHJlbG9jX2luZm9fc3RydWN0KSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVsb2NzIGFuZCBsaW5lIG51bWJlcnMgZm9yIGVhY2ggc2VjdGlvbi4gICovCi0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIGxhc3RfcmVhbCA9IE5VTEw7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGxhc3RfcmVhbCA9IG87Ci0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3MgPQotCSAgICB4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcyAoYWJmZCwgbywgdHJ1ZSwgKGJmZF9ieXRlICopIE5VTEwsCi0JCQkJCWZhbHNlLCAoc3RydWN0IGludGVybmFsX3JlbG9jICopIE5VTEwpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyA9Ci0JICAgIChhc2VjdGlvbiAqKikgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgbWVtc2V0IChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzLCAwLAotCQkgIG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChhc2VjdGlvbiAqKSk7Ci0JfQotCi0gICAgICBpZiAoKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkgICYmIG8tPmxpbmVub19jb3VudCA+IDApCi0JewotCSAgYmZkX2J5dGUgKmxpbmVub3M7Ci0KLQkgIGxpbmVub3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoby0+bGluZW5vX2NvdW50ICogbGluZXN6KTsKLQkgIGlmIChsaW5lbm9zID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgPSBsaW5lbm9zOwotCSAgaWYgKGJmZF9zZWVrIChhYmZkLCBvLT5saW5lX2ZpbGVwb3MsIFNFRUtfU0VUKSAhPSAwCi0JICAgICAgfHwgKGJmZF9yZWFkIChsaW5lbm9zLCBsaW5lc3osIG8tPmxpbmVub19jb3VudCwgYWJmZCkKLQkJICAhPSBsaW5lc3ogKiBvLT5saW5lbm9fY291bnQpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIERvbid0IGxldCB0aGUgbGlua2VyIHJlbG9jYXRpb24gcm91dGluZXMgZGlzY2FyZCB0aGUgc3ltYm9scy4gICovCi0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoYWJmZCkgPSB0cnVlOwotCi0gIGNzZWN0ID0gTlVMTDsKLSAgY3NlY3RfaW5kZXggPSAwOwotICBmaXJzdF9jc2VjdCA9IE5VTEw7Ci0KLSAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChhYmZkKTsKLSAgQkZEX0FTU0VSVCAoc3ltZXN6ID09IGJmZF9jb2ZmX2F1eGVzeiAoYWJmZCkpOwotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpOwotICBlc3ltX2VuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXg7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY2hhciBidWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGludCBzbXR5cDsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqc2V0X3RvYzsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVzeW0sIChQVFIpICZzeW0pOwotCi0gICAgICAvKiBJbiB0aGlzIHBhc3Mgd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBzeW1ib2xzIHdpdGggY3NlY3QKLSAgICAgICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChzeW0ubl9zY2xhc3MgIT0gQ19FWFQgJiYgc3ltLm5fc2NsYXNzICE9IENfSElERVhUKQotCXsKLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19GSUxFICYmIGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgICBjc2VjdCA9IE5VTEw7Ci0JICAgIH0KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgICpjc2VjdF9jYWNoZSA9IGNzZWN0OwotCSAgZWxzZSBpZiAoZmlyc3RfY3NlY3QgPT0gTlVMTCB8fCBzeW0ubl9zY2xhc3MgPT0gQ19GSUxFKQotCSAgICAqY3NlY3RfY2FjaGUgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgIGVsc2UKLQkgICAgKmNzZWN0X2NhY2hlID0gTlVMTDsKLQkgIGVzeW0gKz0gKHN5bS5uX251bWF1eCArIDEpICogc3ltZXN6OwotCSAgc3ltX2hhc2ggKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQkgIGNzZWN0X2NhY2hlICs9IHN5bS5uX251bWF1eCArIDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG5hbWUgPSBfYmZkX2NvZmZfaW50ZXJuYWxfc3ltZW50X25hbWUgKGFiZmQsICZzeW0sIGJ1Zik7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBoYXMgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gaXQsCi0gICAgICAgICBhbmQgd2UncmUgbm90IHN0cmlwcGluZyBpdCwgY291bnQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGFuZAotICAgICAgICAgYWRkIHRoZW0gdG8gdGhlIGNvdW50IGZvciB0aGlzIGNzZWN0LiAgSW4gdGhlIGZpbmFsIGxpbmsgcGFzcwotICAgICAgICAgd2UgYXJlIGdvaW5nIHRvIGF0dGFjaCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBieSBzeW1ib2wsCi0gICAgICAgICByYXRoZXIgdGhhbiBieSBzZWN0aW9uLCBpbiBvcmRlciB0byBtb3JlIGVhc2lseSBoYW5kbGUKLSAgICAgICAgIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gICAgICBpZiAoKGluZm8tPnN0cmlwID09IHN0cmlwX25vbmUgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkgICYmIHN5bS5uX251bWF1eCA+IDEKLQkgICYmIGNzZWN0ICE9IE5VTEwKLQkgICYmIElTRkNOIChzeW0ubl90eXBlKSkKLQl7Ci0JICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4bGluOwotCi0JICBiZmRfY29mZl9zd2FwX2F1eF9pbiAoYWJmZCwgKFBUUikgKGVzeW0gKyBzeW1lc3opLAotCQkJCXN5bS5uX3R5cGUsIHN5bS5uX3NjbGFzcywKLQkJCQkwLCBzeW0ubl9udW1hdXgsIChQVFIpICZhdXhsaW4pOwotCSAgaWYgKGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgIT0gMCkKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICplbmNsb3Npbmc7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBsaW5vZmY7Ci0KLQkgICAgICBlbmNsb3NpbmcgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+ZW5jbG9zaW5nOwotCSAgICAgIGlmIChlbmNsb3NpbmcgPT0gTlVMTCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiBgJXMnIGhhcyBsaW5lIG51bWJlcnMgYnV0IG5vIGVuY2xvc2luZyBzZWN0aW9uIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgICAgbGlub2ZmID0gKGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIKLQkJCS0gZW5jbG9zaW5nLT5saW5lX2ZpbGVwb3MpOwotCSAgICAgIGlmIChsaW5vZmYgPCBlbmNsb3NpbmctPmxpbmVub19jb3VudCAqIGxpbmVzeikKLQkJewotCQkgIHN0cnVjdCBpbnRlcm5hbF9saW5lbm8gbGluOwotCQkgIGJmZF9ieXRlICpsaW5wc3RhcnQ7Ci0KLQkJICBsaW5wc3RhcnQgPSAocmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ubGluZW5vcwotCQkJICAgICAgICsgbGlub2ZmKTsKLQkJICBiZmRfY29mZl9zd2FwX2xpbmVub19pbiAoYWJmZCwgKFBUUikgbGlucHN0YXJ0LCAoUFRSKSAmbGluKTsKLQkJICBpZiAobGluLmxfbG5ubyA9PSAwCi0JCSAgICAgICYmICgoYmZkX3NpemVfdHlwZSkgbGluLmxfYWRkci5sX3N5bW5keAotCQkJICA9PSAoKGVzeW0KLQkJCSAgICAgICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAgICAgIC8gc3ltZXN6KSkpCi0JCSAgICB7Ci0JCSAgICAgIGJmZF9ieXRlICpsaW5wZW5kLCAqbGlucDsKLQotCQkgICAgICBsaW5wZW5kID0gKHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmxpbmVub3MKLQkJCQkgKyBlbmNsb3NpbmctPmxpbmVub19jb3VudCAqIGxpbmVzeik7Ci0JCSAgICAgIGZvciAobGlucCA9IGxpbnBzdGFydCArIGxpbmVzejsKLQkJCSAgIGxpbnAgPCBsaW5wZW5kOwotCQkJICAgbGlucCArPSBsaW5lc3opCi0JCQl7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX2luIChhYmZkLCAoUFRSKSBsaW5wLAotCQkJCQkJICAgKFBUUikgJmxpbik7Ci0JCQkgIGlmIChsaW4ubF9sbm5vID09IDApCi0JCQkgICAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGNzZWN0LT5saW5lbm9fY291bnQgKz0gKGxpbnAgLSBsaW5wc3RhcnQpIC8gbGluZXN6OwotCQkgICAgICAvKiBUaGUgc2V0dGluZyBvZiBsaW5lX2ZpbGVwb3Mgd2lsbCBvbmx5IGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlZnVsIGlmIGFsbCB0aGUgbGluZSBudW1iZXIgZW50cmllcyBmb3IgYQotICAgICAgICAgICAgICAgICAgICAgICAgIGNzZWN0IGFyZSBjb250aWd1b3VzOyB0aGlzIG9ubHkgbWF0dGVycyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciByZXBvcnRpbmcuICAqLwotCQkgICAgICBpZiAoY3NlY3QtPmxpbmVfZmlsZXBvcyA9PSAwKQotCQkJY3NlY3QtPmxpbmVfZmlsZXBvcyA9Ci0JCQkgIGF1eGxpbi54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHI7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogUGljayB1cCB0aGUgY3NlY3QgYXV4aWxpYXJ5IGluZm9ybWF0aW9uLiAgKi8KLQotICAgICAgaWYgKHN5bS5uX251bWF1eCA9PSAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGNsYXNzICVkIHN5bWJvbCBgJXMnIGhhcyBubyBhdXggZW50cmllcyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIHN5bS5uX3NjbGFzcywgbmFtZSk7Ci0JICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCX0KLQotICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGFiZmQsCi0JCQkgICAgKFBUUikgKGVzeW0gKyBzeW1lc3ogKiBzeW0ubl9udW1hdXgpLAotCQkJICAgIHN5bS5uX3R5cGUsIHN5bS5uX3NjbGFzcywKLQkJCSAgICBzeW0ubl9udW1hdXggLSAxLCBzeW0ubl9udW1hdXgsCi0JCQkgICAgKFBUUikgJmF1eCk7Ci0KLSAgICAgIHNtdHlwID0gU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApOwotCi0gICAgICBmbGFncyA9IEJTRl9HTE9CQUw7Ci0gICAgICBzZWN0aW9uID0gTlVMTDsKLSAgICAgIHZhbHVlID0gMDsKLSAgICAgIHNldF90b2MgPSBOVUxMOwotCi0gICAgICBzd2l0Y2ggKHNtdHlwKQotCXsKLQlkZWZhdWx0OgotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogc3ltYm9sIGAlcycgaGFzIHVucmVjb2duaXplZCBjc2VjdCB0eXBlICVkIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgbmFtZSwgc210eXApOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICBnb3RvIGVycm9yX3JldHVybjsKLQotCWNhc2UgWFRZX0VSOgotCSAgLyogVGhpcyBpcyBhbiBleHRlcm5hbCByZWZlcmVuY2UuICAqLwotCSAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0hJREVYVAotCSAgICAgIHx8IHN5bS5uX3NjbnVtICE9IE5fVU5ERUYKLQkgICAgICB8fCBhdXgueF9jc2VjdC54X3Njbmxlbi5sICE9IDApCi0JICAgIHsKLQkgICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJKF8oIiVzOiBiYWQgWFRZX0VSIHN5bWJvbCBgJXMnOiBjbGFzcyAlZCBzY251bSAlZCBzY25sZW4gJWQiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzeW0ubl9zY2xhc3MsIHN5bS5uX3NjbnVtLAotCQkgYXV4LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIH0KLQotCSAgLyogQW4gWE1DX1hPIGV4dGVybmFsIHJlZmVyZW5jZSBpcyBhY3R1YWxseSBhIHJlZmVyZW5jZSB0bwotICAgICAgICAgICAgIGFuIGFic29sdXRlIGxvY2F0aW9uLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyAhPSBYTUNfWE8pCi0JICAgIHNlY3Rpb24gPSBiZmRfdW5kX3NlY3Rpb25fcHRyOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsdWUgPSBzeW0ubl92YWx1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFhUWV9TRDoKLQkgIC8qIFRoaXMgaXMgYSBjc2VjdCBkZWZpbml0aW9uLiAgKi8KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgfQotCi0JICBjc2VjdCA9IE5VTEw7Ci0JICBjc2VjdF9pbmRleCA9IC0xOwotCi0JICAvKiBXaGVuIHdlIHNlZSBhIFRPQyBhbmNob3IsIHdlIHJlY29yZCB0aGUgVE9DIHZhbHVlLiAgKi8KLQkgIGlmIChhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMwKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bS5uX3NjbGFzcyAhPSBDX0hJREVYVAotCQkgIHx8IGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgIT0gMCkKLQkJewotCQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgICAgKF8oIiVzOiBYTUNfVEMwIHN5bWJvbCBgJXMnIGlzIGNsYXNzICVkIHNjbmxlbiAlZCIpLAotCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBzeW0ubl9zY2xhc3MsCi0JCSAgICAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgZ290byBlcnJvcl9yZXR1cm47Ci0JCX0KLQkgICAgICB4Y29mZl9kYXRhIChhYmZkKS0+dG9jID0gc3ltLm5fdmFsdWU7Ci0JICAgIH0KLQotCSAgLyogV2UgbXVzdCBtZXJnZSBUT0MgZW50cmllcyBmb3IgdGhlIHNhbWUgc3ltYm9sLiAgV2UgY2FuCi0JICAgICBtZXJnZSB0d28gVE9DIGVudHJpZXMgaWYgdGhleSBhcmUgYm90aCBDX0hJREVYVCwgdGhleQotCSAgICAgYm90aCBoYXZlIHRoZSBzYW1lIG5hbWUsIHRoZXkgYXJlIGJvdGggNCBieXRlcyBsb25nLCBhbmQKLQkgICAgIHRoZXkgYm90aCBoYXZlIGEgcmVsb2NhdGlvbiB0YWJsZSBlbnRyeSBmb3IgYW4gZXh0ZXJuYWwKLQkgICAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zCi0JICAgICB0aGF0IHdlIG11c3QgbG9vayB0aHJvdWdoIHRoZSByZWxvY2F0aW9ucy4gIEljay4gICovCi0JICBpZiAoYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1RDCi0JICAgICAgJiYgc3ltLm5fc2NsYXNzID09IENfSElERVhUCi0JICAgICAgJiYgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9PSA0Ci0JICAgICAgJiYgaW5mby0+aGFzaC0+Y3JlYXRvciA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmVuY2xvc2luZzsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbG9jczsKLQkgICAgICBiZmRfc2l6ZV90eXBlIHJlbGluZHg7Ci0JICAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWw7Ci0KLQkgICAgICBlbmNsb3NpbmcgPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKGFiZmQsIHN5bS5uX3NjbnVtKTsKLQkgICAgICBpZiAoZW5jbG9zaW5nID09IE5VTEwpCi0JCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JICAgICAgcmVsb2NzID0gcmVsb2NfaW5mb1tlbmNsb3NpbmctPnRhcmdldF9pbmRleF0ucmVsb2NzOwotCSAgICAgIHJlbGluZHggPSB4Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGVuY2xvc2luZy0+cmVsb2NfY291bnQsCi0JCQkJCSAgc3ltLm5fdmFsdWUpOwotCSAgICAgIHJlbCA9IHJlbG9jcyArIHJlbGluZHg7Ci0JICAgICAgaWYgKHJlbGluZHggPCBlbmNsb3NpbmctPnJlbG9jX2NvdW50Ci0JCSAgJiYgcmVsLT5yX3ZhZGRyID09IChiZmRfdm1hKSBzeW0ubl92YWx1ZQotCQkgICYmIHJlbC0+cl9zaXplID09IDMxCi0JCSAgJiYgcmVsLT5yX3R5cGUgPT0gUl9QT1MpCi0JCXsKLQkJICBiZmRfYnl0ZSAqZXJlbHN5bTsKLQkJICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHJlbHN5bTsKLQotCQkgIGVyZWxzeW0gPSAoKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGFiZmQpCi0JCQkgICAgICsgcmVsLT5yX3N5bW5keCAqIHN5bWVzeik7Ci0JCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKGFiZmQsIChQVFIpIGVyZWxzeW0sIChQVFIpICZyZWxzeW0pOwotCQkgIGlmIChyZWxzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JCSAgICB7Ci0JCSAgICAgIGNvbnN0IGNoYXIgKnJlbG5hbWU7Ci0JCSAgICAgIGNoYXIgcmVsYnVmW1NZTU5NTEVOICsgMV07Ci0JCSAgICAgIGJvb2xlYW4gY29weTsKLQkJICAgICAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgICAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGUgVE9DIGVudHJ5IGlzCi0JCQkgZm9yIGFuIGV4dGVybmFsbHkgdmlzaWJsZSBzeW1ib2wuICAqLwotCQkgICAgICByZWxuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChhYmZkLCAmcmVsc3ltLAotCQkJCQkJCQlyZWxidWYpOwotCQkgICAgICBpZiAocmVsbmFtZSA9PSBOVUxMKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJICAgICAgLyogV2Ugb25seSBtZXJnZSBUT0MgZW50cmllcyBpZiB0aGUgVEMgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGFzIHRoZSBzeW1ib2wgbmFtZS4gIFRoaXMgaGFuZGxlcwotICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBub3JtYWwgY2FzZSwgYnV0IG5vdCBjb21tb24gY2FzZXMgbGlrZQotICAgICAgICAgICAgICAgICAgICAgICAgIFNZTS5QNCB3aGljaCBnY2MgZ2VuZXJhdGVzIHRvIHN0b3JlIFNZTSArIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgVE9DLiAgRklYTUUuICAqLwotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCByZWxuYW1lKSA9PSAwKQotCQkJewotCQkJICBjb3B5ID0gKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkJCQkgIHx8IHJlbHN5bS5fbi5fbl9uLl9uX3plcm9lcyAhPSAwCi0JCQkJICB8fCByZWxzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCk7Ci0JCQkgIGggPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICAgIHJlbG5hbWUsIHRydWUsIGNvcHksCi0JCQkJCQkgICAgICBmYWxzZSk7Ci0JCQkgIGlmIChoID09IE5VTEwpCi0JCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJCSAgLyogQXQgdGhpcyBwb2ludCBoLT5yb290LnR5cGUgY291bGQgYmUKLQkJCSAgICAgYmZkX2xpbmtfaGFzaF9uZXcuICBUaGF0IHNob3VsZCBiZSBPSywKLQkJCSAgICAgc2luY2Ugd2Uga25vdyBmb3Igc3VyZSB0aGF0IHdlIHdpbGwgY29tZQotCQkJICAgICBhY3Jvc3MgdGhpcyBzeW1ib2wgYXMgd2Ugc3RlcCB0aHJvdWdoIHRoZQotCQkJICAgICBmaWxlLiAgKi8KLQotCQkJICAvKiBXZSBzdG9yZSBoIGluICpzeW1faGFzaCBmb3IgdGhlCi0JCQkgICAgIGNvbnZlbmllbmNlIG9mIHRoZSByZWxvY2F0ZV9zZWN0aW9uCi0JCQkgICAgIGZ1bmN0aW9uLiAgKi8KLQkJCSAgKnN5bV9oYXNoID0gaDsKLQotCQkJICBpZiAoaC0+dG9jX3NlY3Rpb24gIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICBhc2VjdGlvbiAqKnJlbF9jc2VjdHM7Ci0KLQkJCSAgICAgIC8qIFdlIGFscmVhZHkgaGF2ZSBhIFRPQyBlbnRyeSBmb3IgdGhpcwotCQkJCSBzeW1ib2wsIHNvIHdlIGNhbiBqdXN0IGlnbm9yZSB0aGlzCi0JCQkJIG9uZS4gICovCi0JCQkgICAgICByZWxfY3NlY3RzID0KLQkJCQlyZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5jc2VjdHM7Ci0JCQkgICAgICByZWxfY3NlY3RzW3JlbGluZHhdID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQotCQkJICAvKiBXZSBhcmUgYWJvdXQgdG8gY3JlYXRlIGEgVE9DIGVudHJ5IGZvcgotCQkJICAgICB0aGlzIHN5bWJvbC4gICovCi0JCQkgIHNldF90b2MgPSBoOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgc2VjdGlvbi4gIFdlIGdldCB0aGUgbmFtZSBmcm9tCi0JICAgICB0aGUgY3NlY3Qgc3RvcmFnZSBtYXBwaW5nIGNsYXNzLCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuCi0JICAgICBhY2N1bXVsYXRlIHNpbWlsYXIgY3NlY3RzIHRvZ2V0aGVyLiAgKi8KLQkgIHsKLQkgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNzZWN0X25hbWVfYnlfY2xhc3NbXSA9Ci0JICAgICAgewotCQkiLnByIiwgIi5ybyIsICIuZGIiLCAiLnRjIiwgIi51YSIsICIucnciLCAiLmdsIiwgIi54byIsCi0JCSIuc3YiLCAiLmJzIiwgIi5kcyIsICIudWMiLCAiLnRpIiwgIi50YiIsIE5VTEwsICIudGMwIiwKLQkJIi50ZCIKLQkgICAgICB9OwotCSAgICBjb25zdCBjaGFyICpjc2VjdF9uYW1lOwotCSAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotCi0JICAgIGlmICgoYXV4LnhfY3NlY3QueF9zbWNsYXMgPj0KLQkJIHNpemVvZiBjc2VjdF9uYW1lX2J5X2NsYXNzIC8gc2l6ZW9mIGNzZWN0X25hbWVfYnlfY2xhc3NbMF0pCi0JCXx8IGNzZWN0X25hbWVfYnlfY2xhc3NbYXV4LnhfY3NlY3QueF9zbWNsYXNdID09IE5VTEwpCi0JICAgICAgewotCQkoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAoXygiJXM6IHN5bWJvbCBgJXMnIGhhcyB1bnJlY29nbml6ZWQgc21jbGFzICVkIiksCi0JCSAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lLCBhdXgueF9jc2VjdC54X3NtY2xhcyk7Ci0JCWJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICB9Ci0KLQkgICAgY3NlY3RfbmFtZSA9IGNzZWN0X25hbWVfYnlfY2xhc3NbYXV4LnhfY3NlY3QueF9zbWNsYXNdOwotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCBjc2VjdF9uYW1lKTsKLQkgICAgaWYgKGNzZWN0ID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGVuY2xvc2luZyA9IGNvZmZfc2VjdGlvbl9mcm9tX2JmZF9pbmRleCAoYWJmZCwgc3ltLm5fc2NudW0pOwotCSAgICBpZiAoZW5jbG9zaW5nID09IE5VTEwpCi0JICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICAgIGlmICghIGJmZF9pc19hYnNfc2VjdGlvbiAoZW5jbG9zaW5nKQotCQkmJiAoKGJmZF92bWEpIHN5bS5uX3ZhbHVlIDwgZW5jbG9zaW5nLT52bWEKLQkJICAgIHx8ICgoYmZkX3ZtYSkgc3ltLm5fdmFsdWUgKyBhdXgueF9jc2VjdC54X3Njbmxlbi5sCi0JCQk+IGVuY2xvc2luZy0+dm1hICsgZW5jbG9zaW5nLT5fcmF3X3NpemUpKSkKLQkgICAgICB7Ci0JCSgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkgIChfKCIlczogY3NlY3QgYCVzJyBub3QgaW4gZW5jbG9zaW5nIHNlY3Rpb24iKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgfQotCSAgICBjc2VjdC0+dm1hID0gc3ltLm5fdmFsdWU7Ci0JICAgIGNzZWN0LT5maWxlcG9zID0gKGVuY2xvc2luZy0+ZmlsZXBvcwotCQkJICAgICAgKyBzeW0ubl92YWx1ZQotCQkJICAgICAgLSBlbmNsb3NpbmctPnZtYSk7Ci0JICAgIGNzZWN0LT5fcmF3X3NpemUgPSBhdXgueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfSEFTX0NPTlRFTlRTOwotCSAgICBjc2VjdC0+YWxpZ25tZW50X3Bvd2VyID0gU01UWVBfQUxJR04gKGF1eC54X2NzZWN0Lnhfc210eXApOwotCi0JICAgIC8qIFJlY29yZCB0aGUgZW5jbG9zaW5nIHNlY3Rpb24gaW4gdGhlIHRkYXRhIGZvciB0aGlzIG5ldwotCSAgICAgICBzZWN0aW9uLiAgKi8KLQkgICAgY3NlY3QtPnVzZWRfYnlfYmZkID0KLQkgICAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgICAgaWYgKGNzZWN0LT51c2VkX2J5X2JmZCA9PSBOVUxMKQotCSAgICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9Ci0JICAgICAgYmZkX3phbGxvYyAoYWJmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfc2VjdGlvbl90ZGF0YSkpOwotCSAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+dGRhdGEgPT0gTlVMTCkKLQkgICAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgICAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmVuY2xvc2luZyA9IGVuY2xvc2luZzsKLQkgICAgeGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBjc2VjdCktPmxpbmVub19jb3VudCA9Ci0JICAgICAgZW5jbG9zaW5nLT5saW5lbm9fY291bnQ7Ci0KLQkgICAgaWYgKGVuY2xvc2luZy0+b3duZXIgPT0gYWJmZCkKLQkgICAgICB7Ci0JCXN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsb2NzOwotCQliZmRfc2l6ZV90eXBlIHJlbGluZHg7Ci0JCXN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotCQlhc2VjdGlvbiAqKnJlbF9jc2VjdDsKLQotCQlyZWxvY3MgPSByZWxvY19pbmZvW2VuY2xvc2luZy0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JCXJlbGluZHggPSB4Y29mZl9maW5kX3JlbG9jIChyZWxvY3MsIGVuY2xvc2luZy0+cmVsb2NfY291bnQsCi0JCQkJCSAgICBjc2VjdC0+dm1hKTsKLQkJcmVsID0gcmVsb2NzICsgcmVsaW5keDsKLQkJcmVsX2NzZWN0ID0gKHJlbG9jX2luZm9bZW5jbG9zaW5nLT50YXJnZXRfaW5kZXhdLmNzZWN0cwotCQkJICAgICArIHJlbGluZHgpOwotCQljc2VjdC0+cmVsX2ZpbGVwb3MgPSAoZW5jbG9zaW5nLT5yZWxfZmlsZXBvcwotCQkJCSAgICAgICsgcmVsaW5keCAqIGJmZF9jb2ZmX3JlbHN6IChhYmZkKSk7Ci0JCXdoaWxlIChyZWxpbmR4IDwgZW5jbG9zaW5nLT5yZWxvY19jb3VudAotCQkgICAgICAgJiYgKnJlbF9jc2VjdCA9PSBOVUxMCi0JCSAgICAgICAmJiByZWwtPnJfdmFkZHIgPCBjc2VjdC0+dm1hICsgY3NlY3QtPl9yYXdfc2l6ZSkKLQkJICB7Ci0JCSAgICAqcmVsX2NzZWN0ID0gY3NlY3Q7Ci0JCSAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX1JFTE9DOwotCQkgICAgKytjc2VjdC0+cmVsb2NfY291bnQ7Ci0JCSAgICArK3JlbGluZHg7Ci0JCSAgICArK3JlbDsKLQkJICAgICsrcmVsX2NzZWN0OwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogVGhlcmUgYXJlIGEgbnVtYmVyIG9mIG90aGVyIGZpZWxkcyBhbmQgc2VjdGlvbiBmbGFncwotCSAgICAgICB3aGljaCB3ZSBkbyBub3QgYm90aGVyIHRvIHNldC4gICovCi0KLQkgICAgY3NlY3RfaW5kZXggPSAoKGVzeW0KLQkJCSAgICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJCSAgIC8gc3ltZXN6KTsKLQotCSAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+Zmlyc3Rfc3ltbmR4ID0gY3NlY3RfaW5kZXg7Ci0KLQkgICAgaWYgKGZpcnN0X2NzZWN0ID09IE5VTEwpCi0JICAgICAgZmlyc3RfY3NlY3QgPSBjc2VjdDsKLQotCSAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBDX0VYVCwgd2UgdHJlYXQgaXQgYXMgc3RhcnRpbmcgYXQgdGhlCi0JICAgICAgIGJlZ2lubmluZyBvZiB0aGUgbmV3bHkgY3JlYXRlZCBzZWN0aW9uLiAgKi8KLQkgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQkgICAgICB7Ci0JCXNlY3Rpb24gPSBjc2VjdDsKLQkJdmFsdWUgPSAwOwotCSAgICAgIH0KLQotCSAgICAvKiBJZiB0aGlzIGlzIGEgVE9DIHNlY3Rpb24gZm9yIGEgc3ltYm9sLCByZWNvcmQgaXQuICAqLwotCSAgICBpZiAoc2V0X3RvYyAhPSBOVUxMKQotCSAgICAgIHNldF90b2MtPnRvY19zZWN0aW9uID0gY3NlY3Q7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgWFRZX0xEOgotCSAgLyogVGhpcyBpcyBhIGxhYmVsIGRlZmluaXRpb24uICBUaGUgeF9zY25sZW4gZmllbGQgaXMgdGhlCi0gICAgICAgICAgICAgc3ltYm9sIGluZGV4IG9mIHRoZSBjc2VjdC4gIEkgYmVsaWV2ZSB0aGF0IHRoaXMgbXVzdAotICAgICAgICAgICAgIGFsd2F5cyBmb2xsb3cgdGhlIGFwcHJvcHJpYXRlIFhUWV9TRCBzeW1ib2wsIHNvIEkgd2lsbAotICAgICAgICAgICAgIGluc2lzdCBvbiBpdC4gICovCi0JICB7Ci0JICAgIGJvb2xlYW4gYmFkOwotCi0JICAgIGJhZCA9IGZhbHNlOwotCSAgICBpZiAoYXV4LnhfY3NlY3QueF9zY25sZW4ubCA8IDAKLQkJfHwgKGF1eC54X2NzZWN0Lnhfc2NubGVuLmwKLQkJICAgID49IGVzeW0gLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpKQotCSAgICAgIGJhZCA9IHRydWU7Ci0JICAgIGlmICghIGJhZCkKLQkgICAgICB7Ci0JCXNlY3Rpb24gPSB4Y29mZl9kYXRhIChhYmZkKS0+Y3NlY3RzW2F1eC54X2NzZWN0Lnhfc2NubGVuLmxdOwotCQlpZiAoc2VjdGlvbiA9PSBOVUxMCi0JCSAgICB8fCAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwKQotCQkgIGJhZCA9IHRydWU7Ci0JICAgICAgfQotCSAgICBpZiAoYmFkKQotCSAgICAgIHsKLQkJKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgKF8oIiVzOiBtaXNwbGFjZWQgWFRZX0xEIGAlcyciKSwKLQkJICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWUpOwotCQliZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgfQotCi0JICAgIHZhbHVlID0gc3ltLm5fdmFsdWUgLSBjc2VjdC0+dm1hOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIFhUWV9DTToKLQkgIC8qIFRoaXMgaXMgYW4gdW5pdGlhbGl6ZWQgY3NlY3QuICBXZSBjb3VsZCBiYXNlIHRoZSBuYW1lIG9uCi0gICAgICAgICAgICAgdGhlIHN0b3JhZ2UgbWFwcGluZyBjbGFzcywgYnV0IHdlIGRvbid0IGJvdGhlciBleGNlcHQgZm9yCi0gICAgICAgICAgICAgYW4gWE1DX1REIHN5bWJvbC4gIElmIHRoaXMgY3NlY3QgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLAotICAgICAgICAgICAgIGl0IGlzIGEgY29tbW9uIHN5bWJvbC4gIFdlIHB1dCBYTUNfVEQgc3ltYm9scyBpbiBzZWN0aW9ucwotICAgICAgICAgICAgIG5hbWVkIC50b2Nic3MsIGFuZCByZWx5IG9uIHRoZSBsaW5rZXIgc2NyaXB0IHRvIHB1dCB0aGF0Ci0gICAgICAgICAgICAgaW4gdGhlIFRPQyBhcmVhLiAgKi8KLQotCSAgaWYgKGNzZWN0ICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGNzZWN0KS0+bGFzdF9zeW1uZHggPQotCQkoKGVzeW0KLQkJICAtIChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChhYmZkKSkKLQkJIC8gc3ltZXN6KTsKLQkgICAgfQotCi0JICBpZiAoYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX1REKQotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnRvY2JzcyIpOwotCSAgZWxzZQotCSAgICBjc2VjdCA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLmJzcyIpOwotCSAgaWYgKGNzZWN0ID09IE5VTEwpCi0JICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCSAgY3NlY3QtPnZtYSA9IHN5bS5uX3ZhbHVlOwotCSAgY3NlY3QtPl9yYXdfc2l6ZSA9IGF1eC54X2NzZWN0Lnhfc2NubGVuLmw7Ci0JICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgY3NlY3QtPmFsaWdubWVudF9wb3dlciA9IFNNVFlQX0FMSUdOIChhdXgueF9jc2VjdC54X3NtdHlwKTsKLQkgIC8qIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciBmaWVsZHMgYW5kIHNlY3Rpb24gZmxhZ3MKLQkgICAgIHdoaWNoIHdlIGRvIG5vdCBib3RoZXIgdG8gc2V0LiAgKi8KLQotCSAgY3NlY3RfaW5kZXggPSAoKGVzeW0KLQkJCSAgLSAoYmZkX2J5dGUgKikgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoYWJmZCkpCi0JCQkgLyBzeW1lc3opOwotCi0JICBjc2VjdC0+dXNlZF9ieV9iZmQgPQotCSAgICAoUFRSKSBiZmRfemFsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCBjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjc2VjdC0+dXNlZF9ieV9iZmQgPT0gTlVMTCkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JICBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9Ci0JICAgIGJmZF96YWxsb2MgKGFiZmQsIHNpemVvZiAoc3RydWN0IHhjb2ZmX3NlY3Rpb25fdGRhdGEpKTsKLQkgIGlmIChjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT50ZGF0YSA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgY3NlY3QpLT5maXJzdF9zeW1uZHggPSBjc2VjdF9pbmRleDsKLQotCSAgaWYgKGZpcnN0X2NzZWN0ID09IE5VTEwpCi0JICAgIGZpcnN0X2NzZWN0ID0gY3NlY3Q7Ci0KLQkgIGlmIChzeW0ubl9zY2xhc3MgPT0gQ19FWFQpCi0JICAgIHsKLQkgICAgICBjc2VjdC0+ZmxhZ3MgfD0gU0VDX0lTX0NPTU1PTjsKLQkgICAgICBjc2VjdC0+X3Jhd19zaXplID0gMDsKLQkgICAgICBzZWN0aW9uID0gY3NlY3Q7Ci0JICAgICAgdmFsdWUgPSBhdXgueF9jc2VjdC54X3Njbmxlbi5sOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQ2hlY2sgZm9yIG1hZ2ljIHN5bWJvbCBuYW1lcy4gICovCi0gICAgICBpZiAoKHNtdHlwID09IFhUWV9TRCB8fCBzbXR5cCA9PSBYVFlfQ00pCi0JICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyAhPSBYTUNfVEMKLQkgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzICE9IFhNQ19URCkKLQl7Ci0JICBpbnQgaTsKLQotCSAgaSA9IC0xOwotCSAgaWYgKG5hbWVbMF0gPT0gJ18nKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobmFtZSwgIl90ZXh0IikgPT0gMCkKLQkJaSA9IDA7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2V0ZXh0IikgPT0gMCkKLQkJaSA9IDE7Ci0JICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiX2RhdGEiKSA9PSAwKQotCQlpID0gMjsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZWRhdGEiKSA9PSAwKQotCQlpID0gMzsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJfZW5kIikgPT0gMCkKLQkJaSA9IDQ7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG5hbWVbMF0gPT0gJ2UnICYmIHN0cmNtcCAobmFtZSwgImVuZCIpID09IDApCi0JICAgIGkgPSA1OwotCi0JICBpZiAoaSAhPSAtMSkKLQkgICAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNwZWNpYWxfc2VjdGlvbnNbaV0gPSBjc2VjdDsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhZGQgdGhlIHN5bWJvbCB0byB0aGUKLSAgICAgICAgIGxpbmtlciBoYXNoIHRhYmxlLiAgKi8KLQotICAgICAgaWYgKHN5bS5uX3NjbGFzcyA9PSBDX0VYVCkKLQl7Ci0JICBib29sZWFuIGNvcHk7Ci0KLQkgIEJGRF9BU1NFUlQgKHNlY3Rpb24gIT0gTlVMTCk7Ci0KLQkgIC8qIFdlIG11c3QgY29weSB0aGUgbmFtZSBpbnRvIG1lbW9yeSBpZiB3ZSBnb3QgaXQgZnJvbSB0aGUKLSAgICAgICAgICAgICBzeW1lbnQgaXRzZWxmLCByYXRoZXIgdGhhbiB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkgIGNvcHkgPSBkZWZhdWx0X2NvcHk7Ci0JICBpZiAoc3ltLl9uLl9uX24uX25femVyb2VzICE9IDAKLQkgICAgICB8fCBzeW0uX24uX25fbi5fbl9vZmZzZXQgPT0gMCkKLQkgICAgY29weSA9IHRydWU7Ci0KLQkgIC8qIFRoZSBBSVggbGlua2VyIGFwcGVhcnMgdG8gb25seSBkZXRlY3QgbXVsdGlwbGUgc3ltYm9sCi0JICAgICBkZWZpbml0aW9ucyB3aGVuIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBzeW1ib2wuICBJZgotCSAgICAgYSBzeW1ib2wgaXMgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcywgYW5kIHRoZSBvbmx5Ci0JICAgICByZWZlcmVuY2VzIGFyZSBmcm9tIHRoZSBzYW1lIG9iamVjdCBmaWxlLCB0aGUgQUlYIGxpbmtlcgotCSAgICAgYXBwZWFycyB0byBwZXJtaXQgaXQuICBJdCBkb2VzIG5vdCBtZXJnZSB0aGUgZGlmZmVyZW50Ci0JICAgICBkZWZpbml0aW9ucywgYnV0IGhhbmRsZXMgdGhlbSBpbmRlcGVuZGVudGx5LiAgT24gdGhlCi0JICAgICBvdGhlciBoYW5kLCBpZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSwgdGhlIGxpbmtlciByZXBvcnRzCi0JICAgICBhbiBlcnJvci4KLQotCSAgICAgVGhpcyBtYXR0ZXJzIGJlY2F1c2UgdGhlIEFJWCA8bmV0L25ldF9nbG9iYWxzLmg+IGhlYWRlcgotCSAgICAgZmlsZSBhY3R1YWxseSBkZWZpbmVzIGFuIGluaXRpYWxpemVkIGFycmF5LCBzbyB3ZSBoYXZlIHRvCi0JICAgICBhY3R1YWxseSBwZXJtaXQgdGhhdCB0byB3b3JrLgotCi0JICAgICBKdXN0IHRvIG1ha2UgbWF0dGVycyBldmVuIG1vcmUgY29uZnVzaW5nLCB0aGUgQUlYIGxpbmtlcgotCSAgICAgYXBwZWFycyB0byBwZXJtaXQgbXVsdGlwbGUgc3ltYm9sIGRlZmluaXRpb25zIHdoZW5ldmVyCi0JICAgICB0aGUgc2Vjb25kIGRlZmluaXRpb24gaXMgaW4gYW4gYXJjaGl2ZSByYXRoZXIgdGhhbiBhbgotCSAgICAgb2JqZWN0IGZpbGUuICBUaGlzIG1heSBiZSBhIGNvbnNlcXVlbmNlIG9mIHRoZSBtYW5uZXIgaW4KLQkgICAgIHdoaWNoIGl0IGhhbmRsZXMgYXJjaGl2ZXM6IEkgdGhpbmsgaXQgbWF5IGxvYWQgdGhlIGVudGlyZQotCSAgICAgYXJjaGl2ZSBpbiBhcyBzZXBhcmF0ZSBjc2VjdHMsIGFuZCB0aGVuIGxldCBnYXJiYWdlCi0JICAgICBjb2xsZWN0aW9uIGRpc2NhcmQgc3ltYm9scy4KLQotCSAgICAgV2UgYWxzbyBoYXZlIHRvIGhhbmRsZSB0aGUgY2FzZSBvZiBzdGF0aWNhbGx5IGxpbmtpbmcgYQotCSAgICAgc2hhcmVkIG9iamVjdCwgd2hpY2ggd2lsbCBjYXVzZSBzeW1ib2wgcmVkZWZpbml0aW9ucywKLQkgICAgIGFsdGhvdWdoIHRoaXMgaXMgYW4gZWFzaWVyIGNhc2UgdG8gZGV0ZWN0LiAgKi8KLQotCSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYykKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoc2VjdGlvbikpCi0JCSpzeW1faGFzaCA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJCQkJICAgIG5hbWUsIHRydWUsIGNvcHksIGZhbHNlKTsKLQkgICAgICBlbHNlCi0JCSpzeW1faGFzaCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotCQkJICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChhYmZkLCBpbmZvLCBuYW1lLAotCQkJCQkJCSAgIHRydWUsIGNvcHksIGZhbHNlKSk7Ci0JICAgICAgaWYgKCpzeW1faGFzaCA9PSBOVUxMKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgICBpZiAoKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCQkgICYmICEgYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKQotCQkgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChzZWN0aW9uKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSBzZWNvbmQgZGVmaW5pdGlvbiBvZiBhIGRlZmluZWQgc3ltYm9sLiAgKi8KLQkJICBpZiAoKGFiZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMAotCQkgICAgICAmJiAoKCpzeW1faGFzaCktPnNtY2xhcyAhPSBYTUNfR0wKLQkJCSAgfHwgYXV4LnhfY3NlY3QueF9zbWNsYXMgPT0gWE1DX0dMCi0JCQkgIHx8ICgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAgICAgICYgRFlOQU1JQykgPT0gMCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBuZXcgc3ltYm9sIGlzIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgZWl0aGVyIHRoZSBleGlzdGluZyBzeW1ib2wgaXMgbm90IGdsb2JhbAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UgY29kZSBvciB0aGlzIHN5bWJvbCBpcyBnbG9iYWwgbGlua2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuICBJZiB0aGUgZXhpc3Rpbmcgc3ltYm9sIGlzIGdsb2JhbAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmthZ2UgY29kZSBhbmQgdGhlIG5ldyBzeW1ib2wgaXMgbm90LCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2Ugd2FudCB0byB1c2UgdGhlIG5ldyBzeW1ib2wuICAqLwotCQkgICAgICBzZWN0aW9uID0gYmZkX3VuZF9zZWN0aW9uX3B0cjsKLQkJICAgICAgdmFsdWUgPSAwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MKLQkJCSAgICAmIERZTkFNSUMpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBleGlzdGluZyBzeW1ib2wgaXMgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LgotICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2UgaXQuICAqLwotCQkgICAgICAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JCSAgICAgICgqc3ltX2hhc2gpLT5yb290LnUudW5kZWYuYWJmZCA9Ci0JCQkoKnN5bV9oYXNoKS0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lcjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChhYmZkLT5teV9hcmNoaXZlICE9IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSByZWRlZmluaXRpb24gaW4gYW4gb2JqZWN0IGNvbnRhaW5lZAotICAgICAgICAgICAgICAgICAgICAgICAgIGluIGFuIGFyY2hpdmUuICBKdXN0IGlnbm9yZSBpdC4gIFNlZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50IGFib3ZlLiAgKi8KLQkJICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIHZhbHVlID0gMDsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgoKnN5bV9oYXNoKS0+cm9vdC5uZXh0ICE9IE5VTEwKLQkJCSAgIHx8IGluZm8tPmhhc2gtPnVuZGVmc190YWlsID09ICYoKnN5bV9oYXNoKS0+cm9vdCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBzeW1ib2wgaGFzIGJlZW4gcmVmZXJlbmNlZC4gIEluIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlLCB3ZSBqdXN0IGNvbnRpbnVlIGFuZCBwZXJtaXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIFNlZSB0aGUgY29tbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGFib3V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFJWCBsaW5rZXIuICAqLwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCgqc3ltX2hhc2gpLT5zbWNsYXMgPT0gYXV4LnhfY3NlY3QueF9zbWNsYXMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBzeW1ib2xzIGFyZSBib3RoIGNzZWN0cyBvZiB0aGUgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzLiAgVGhlcmUgaXMgYXQgbGVhc3QgYSBjaGFuY2UgdGhhdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXMgYSBzZW1pLWxlZ2l0aW1hdGUgcmVkZWZpbml0aW9uLiAgKi8KLQkJICAgICAgc2VjdGlvbiA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JCSAgICAgIHZhbHVlID0gMDsKLQkJICAgICAgKCpzeW1faGFzaCktPmZsYWdzIHw9IFhDT0ZGX01VTFRJUExZX0RFRklORUQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoKCpzeW1faGFzaCktPmZsYWdzICYgWENPRkZfTVVMVElQTFlfREVGSU5FRCkgIT0gMAotCQkgICAgICAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCQkgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkJICAgICAgICYmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHNlY3Rpb24pCi0JCQkgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHNlY3Rpb24pKSkKLQkJewotCQkgIC8qIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbC4KLQkJICAgICBSZXBvcnQgdGhlIGVycm9yIG5vdy4gIFNlZSB0aGUgY29tbWVudCBhYm92ZQotCQkgICAgIGFib3V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFJWCBsaW5rZXIuICBXZSBjb3VsZAotCQkgICAgIGFsc28gZG8gdGhpcyB3aXRoIHdhcm5pbmcgc3ltYm9scywgYnV0IEknbSBub3QKLQkJICAgICBzdXJlIHRoZSBYQ09GRiBsaW5rZXIgaXMgd2hvbGx5IHByZXBhcmVkIHRvCi0JCSAgICAgaGFuZGxlIHRoZW0sIGFuZCB0aGF0IHdvdWxkIG9ubHkgYmUgYSB3YXJuaW5nLAotCQkgICAgIG5vdCBhbiBlcnJvci4gICovCi0JCSAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT5tdWx0aXBsZV9kZWZpbml0aW9uKQotCQkJIChpbmZvLCAoKnN5bV9oYXNoKS0+cm9vdC5yb290LnN0cmluZywKLQkJCSAgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwgMCwKLQkJCSAgKCpzeW1faGFzaCktPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIsCi0JCQkgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24sCi0JCQkgICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnZhbHVlKSkpCi0JCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkJICAvKiBUcnkgbm90IHRvIGdpdmUgdGhpcyBlcnJvciB0b28gbWFueSB0aW1lcy4gICovCi0JCSAgKCpzeW1faGFzaCktPmZsYWdzICY9IH5YQ09GRl9NVUxUSVBMWV9ERUZJTkVEOwotCQl9Ci0JICAgIH0KLQotCSAgLyogX2JmZF9nZW5lcmljX2xpbmtfYWRkX29uZV9zeW1ib2wgbWF5IGNhbGwgdGhlIGxpbmtlciB0bwotCSAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIHRoZSBsaW5rZXIgbWF5IHRyeSB0byByZWFkCi0JICAgICB0aGUgc3ltYm9sIHRhYmxlIHRvIGdpdmUgYSBnb29kIGVycm9yLiAgUmlnaHQgbm93LCB0aGUKLQkgICAgIGxpbmUgbnVtYmVycyBhcmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBzaW5jZSB0aGV5IGFyZQotCSAgICAgY291bnRlZCBib3RoIGluIHRoZSByZWFsIHNlY3Rpb25zIGFuZCBpbiB0aGUgbmV3IGNzZWN0cy4KLQkgICAgIFdlIG5lZWQgdG8gbGVhdmUgdGhlIGNvdW50IGluIHRoZSByZWFsIHNlY3Rpb25zIHNvIHRoYXQKLQkgICAgIHRoZSBsaW5rZXIgY2FuIHJlcG9ydCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGVycm9yCi0JICAgICBjb3JyZWN0bHksIHNvIHRlbXBvcmFyaWx5IGNsb2JiZXIgdGhlIGxpbmsgdG8gdGhlIGNzZWN0cwotCSAgICAgc28gdGhhdCB0aGUgbGlua2VyIHdpbGwgbm90IHRyeSB0byByZWFkIHRoZSBsaW5lIG51bWJlcnMKLQkgICAgIGEgc2Vjb25kIHRpbWUgZnJvbSB0aGUgY3NlY3RzLiAgKi8KLQkgIEJGRF9BU1NFUlQgKGxhc3RfcmVhbC0+bmV4dCA9PSBmaXJzdF9jc2VjdCk7Ci0JICBsYXN0X3JlYWwtPm5leHQgPSBOVUxMOwotCSAgaWYgKCEgKF9iZmRfZ2VuZXJpY19saW5rX2FkZF9vbmVfc3ltYm9sCi0JCSAoaW5mbywgYWJmZCwgbmFtZSwgZmxhZ3MsIHNlY3Rpb24sIHZhbHVlLAotCQkgIChjb25zdCBjaGFyICopIE5VTEwsIGNvcHksIHRydWUsCi0JCSAgKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICoqKSBzeW1faGFzaCkpKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQkgIGxhc3RfcmVhbC0+bmV4dCA9IGZpcnN0X2NzZWN0OwotCi0JICBpZiAoc210eXAgPT0gWFRZX0NNKQotCSAgICB7Ci0JICAgICAgaWYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkJICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+c2VjdGlvbiAhPSBjc2VjdCkKLQkJewotCQkgIC8qIFdlIGRvbid0IG5lZWQgdGhlIGNvbW1vbiBjc2VjdCB3ZSBqdXN0IGNyZWF0ZWQuICAqLwotCQkgIGNzZWN0LT5fcmF3X3NpemUgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKCpzeW1faGFzaCktPnJvb3QudS5jLnAtPmFsaWdubWVudF9wb3dlcgotCQkgICAgID0gY3NlY3QtPmFsaWdubWVudF9wb3dlcjsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChpbmZvLT5oYXNoLT5jcmVhdG9yID09IGFiZmQtPnh2ZWMpCi0JICAgIHsKLQkgICAgICBpbnQgZmxhZzsKLQotCSAgICAgIGlmIChzbXR5cCA9PSBYVFlfRVIgfHwgc210eXAgPT0gWFRZX0NNKQotCQlmbGFnID0gWENPRkZfUkVGX1JFR1VMQVI7Ci0JICAgICAgZWxzZQotCQlmbGFnID0gWENPRkZfREVGX1JFR1VMQVI7Ci0JICAgICAgKCpzeW1faGFzaCktPmZsYWdzIHw9IGZsYWc7Ci0KLQkgICAgICBpZiAoKCpzeW1faGFzaCktPnNtY2xhcyA9PSBYTUNfVUEKLQkJICB8fCBmbGFnID09IFhDT0ZGX0RFRl9SRUdVTEFSKQotCQkoKnN5bV9oYXNoKS0+c21jbGFzID0gYXV4LnhfY3NlY3QueF9zbWNsYXM7Ci0JICAgIH0KLQl9Ci0KLSAgICAgICpjc2VjdF9jYWNoZSA9IGNzZWN0OwotCi0gICAgICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLSAgICAgIHN5bV9oYXNoICs9IHN5bS5uX251bWF1eCArIDE7Ci0gICAgICBjc2VjdF9jYWNoZSArPSBzeW0ubl9udW1hdXggKyAxOwotICAgIH0KLQotICBCRkRfQVNTRVJUIChsYXN0X3JlYWwgPT0gTlVMTCB8fCBsYXN0X3JlYWwtPm5leHQgPT0gZmlyc3RfY3NlY3QpOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgc2VlbiBhbGwgdGhlIHJlbG9jcy4gICovCi0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IGZpcnN0X2NzZWN0OyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICAvKiBSZXNldCB0aGUgc2VjdGlvbiBzaXplIGFuZCB0aGUgbGluZSBudW1iZXIgY291bnQsIHNpbmNlIHRoZQotCSBkYXRhIGlzIG5vdyBhdHRhY2hlZCB0byB0aGUgY3NlY3RzLiAgRG9uJ3QgcmVzZXQgdGhlIHNpemUgb2YKLQkgdGhlIC5kZWJ1ZyBzZWN0aW9uLCBzaW5jZSB3ZSBuZWVkIHRvIHJlYWQgaXQgYmVsb3cgaW4KLQkgYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucy4gICovCi0gICAgICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgbyksICIuZGVidWciKSAhPSAwKQotCW8tPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotCi0gICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX1JFTE9DKSAhPSAwKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgaTsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotCSAgYXNlY3Rpb24gKipyZWxfY3NlY3Q7Ci0KLQkgIHJlbCA9IHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxvY3M7Ci0JICByZWxfY3NlY3QgPSByZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzOwotCSAgZm9yIChpID0gMDsgaSA8IG8tPnJlbG9jX2NvdW50OyBpKyssIHJlbCsrLCByZWxfY3NlY3QrKykKLQkgICAgewotCSAgICAgIGlmICgqcmVsX2NzZWN0ID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogcmVsb2MgJXM6JWQgbm90IGluIGNzZWN0IiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG8tPm5hbWUsIGkpOwotCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCQkgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0KLQkgICAgICAvKiBXZSBpZGVudGlmeSBhbGwgc3ltYm9scyB3aGljaCBhcmUgY2FsbGVkLCBzbyB0aGF0IHdlCi0JCSBjYW4gY3JlYXRlIGdsdWUgY29kZSBmb3IgY2FsbHMgdG8gZnVuY3Rpb25zIGltcG9ydGVkCi0JCSBmcm9tIGR5bmFtaWMgb2JqZWN0cy4gICovCi0JICAgICAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgPT0gYWJmZC0+eHZlYwotCQkgICYmICpyZWxfY3NlY3QgIT0gYmZkX3VuZF9zZWN0aW9uX3B0cgotCQkgICYmIChyZWwtPnJfdHlwZSA9PSBSX0JSCi0JCSAgICAgIHx8IHJlbC0+cl90eXBlID09IFJfUkJSKQotCQkgICYmIG9ial94Y29mZl9zeW1faGFzaGVzIChhYmZkKVtyZWwtPnJfc3ltbmR4XSAhPSBOVUxMKQotCQl7Ci0JCSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCQkgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoYWJmZClbcmVsLT5yX3N5bW5keF07Ci0JCSAgaC0+ZmxhZ3MgfD0gWENPRkZfQ0FMTEVEOwotCQkgIC8qIElmIHRoZSBzeW1ib2wgbmFtZSBzdGFydHMgd2l0aCBhIHBlcmlvZCwgaXQgaXMKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBjb2RlIG9mIGEgZnVuY3Rpb24uICBJZiB0aGUgc3ltYm9sIGlzCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgdW5kZWZpbmVkLCB0aGVuIGFkZCBhbiB1bmRlZmluZWQgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IuICBUaGlzIHNob3VsZCBkbyBubwotICAgICAgICAgICAgICAgICAgICAgaGFybSwgYmVjYXVzZSBhbnkgcmVndWxhciBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZQotICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc2hvdWxkIGFsc28gZGVmaW5lIHRoZSBmdW5jdGlvbgotICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci4gIEl0IGhlbHBzLCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgd2UKLSAgICAgICAgICAgICAgICAgICAgIHdpbGwgaWRlbnRpZnkgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3Igd2l0aCBhCi0gICAgICAgICAgICAgICAgICAgICBkeW5hbWljIG9iamVjdCBpZiBhIGR5bmFtaWMgb2JqZWN0IGRlZmluZXMgaXQuICAqLwotCQkgIGlmIChoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotCQkgICAgICAmJiBoLT5kZXNjcmlwdG9yID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotCQkgICAgICBoZHMgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJCSAgICBoLT5yb290LnJvb3Quc3RyaW5nICsgMSwKLQkJCQkJCSAgICB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCSAgICAgIGlmIChoZHMgPT0gTlVMTCkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JCQl7Ci0JCQkgIGlmICghIChfYmZkX2dlbmVyaWNfbGlua19hZGRfb25lX3N5bWJvbAotCQkJCSAoaW5mbywgYWJmZCwgaGRzLT5yb290LnJvb3Quc3RyaW5nLAotCQkJCSAgKGZsYWd3b3JkKSAwLCBiZmRfdW5kX3NlY3Rpb25fcHRyLAotCQkJCSAgKGJmZF92bWEpIDAsIChjb25zdCBjaGFyICopIE5VTEwsIGZhbHNlLAotCQkJCSAgdHJ1ZSwKLQkJCQkgIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKikgJmhkcykpKQotCQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkJfQotCQkgICAgICBoZHMtPmZsYWdzIHw9IFhDT0ZGX0RFU0NSSVBUT1I7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKChoZHMtPmZsYWdzICYgWENPRkZfQ0FMTEVEKSA9PSAwCi0JCQkJICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSA9PSAwKTsKLQkJICAgICAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkJICAgICAgaC0+ZGVzY3JpcHRvciA9IGhkczsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGZyZWUgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5jc2VjdHMpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyA9IE5VTEw7Ci0KLQkgIC8qIFJlc2V0IFNFQ19SRUxPQyBhbmQgdGhlIHJlbG9jX2NvdW50LCBzaW5jZSB0aGUgcmVsb2MKLQkgICAgIGluZm9ybWF0aW9uIGlzIG5vdyBhdHRhY2hlZCB0byB0aGUgY3NlY3RzLiAgKi8KLQkgIG8tPmZsYWdzICY9fiBTRUNfUkVMT0M7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0KLQkgIC8qIElmIHdlIGFyZSBub3Qga2VlcGluZyBtZW1vcnksIGZyZWUgdGhlIHJlbG9jIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmICghIGluZm8tPmtlZXBfbWVtb3J5Ci0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pICE9IE5VTEwKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPnJlbG9jcyAhPSBOVUxMCi0JICAgICAgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmtlZXBfcmVsb2NzKQotCSAgICB7Ci0JICAgICAgZnJlZSAoY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5yZWxvY3MpOwotCSAgICAgIGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBvKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCX0KLQotICAgICAgLyogRnJlZSB1cCB0aGUgbGluZSBudW1iZXJzLiAgRklYTUU6IFdlIGNvdWxkIGNhY2hlIHRoZXNlCi0gICAgICAgICBzb21ld2hlcmUgZm9yIHRoZSBmaW5hbCBsaW5rLCB0byBhdm9pZCByZWFkaW5nIHRoZW0gYWdhaW4uICAqLwotICAgICAgaWYgKHJlbG9jX2luZm9bby0+dGFyZ2V0X2luZGV4XS5saW5lbm9zICE9IE5VTEwpCi0JewotCSAgZnJlZSAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MpOwotCSAgcmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmxpbmVub3MgPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocmVsb2NfaW5mbyk7Ci0KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKHJlbG9jX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQl7Ci0JICBpZiAocmVsb2NfaW5mb1tvLT50YXJnZXRfaW5kZXhdLmNzZWN0cyAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0uY3NlY3RzKTsKLQkgIGlmIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyAhPSBOVUxMKQotCSAgICBmcmVlIChyZWxvY19pbmZvW28tPnRhcmdldF9pbmRleF0ubGluZW5vcyk7Ci0JfQotICAgIGZyZWUgKHJlbG9jX2luZm8pOwotICAgIH0KLSAgb2JqX2NvZmZfa2VlcF9zeW1zIChhYmZkKSA9IGtlZXBfc3ltczsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jdW5kZWYgTl9UTUFTSwotI3VuZGVmIE5fQlRTSEZUCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgc3ltYm9scyBmcm9tIGEgZHluYW1pYyBvYmplY3QgdG8gdGhlCi0gICBnbG9iYWwgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX2xpbmtfYWRkX2R5bmFtaWNfc3ltYm9scyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYXNlY3Rpb24gKmxzZWM7Ci0gIGJmZF9ieXRlICpidWY7Ci0gIHN0cnVjdCBpbnRlcm5hbF9sZGhkciBsZGhkcjsKLSAgY29uc3QgY2hhciAqc3RyaW5nczsKLSAgc3RydWN0IGV4dGVybmFsX2xkc3ltICplbHN5bSwgKmVsc3ltZW5kOwotICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKm47Ci0gIGNvbnN0IGNoYXIgKmJuYW1lOwotICBjb25zdCBjaGFyICptbmFtZTsKLSAgY29uc3QgY2hhciAqczsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqKnBwOwotCi0gIC8qIFdlIGNhbiBvbmx5IGhhbmRsZSBhIGR5bmFtaWMgb2JqZWN0IGlmIHdlIGFyZSBnZW5lcmF0aW5nIGFuIFhDT0ZGCi0gICAgIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKGluZm8tPmhhc2gtPmNyZWF0b3IgIT0gYWJmZC0+eHZlYykKLSAgICB7Ci0gICAgICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkoXygiJXM6IFhDT0ZGIHNoYXJlZCBvYmplY3Qgd2hlbiBub3QgcHJvZHVjaW5nIFhDT0ZGIG91dHB1dCIpLAotCSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfaW52YWxpZF9vcGVyYXRpb24pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBUaGUgc3ltYm9scyB3ZSB1c2UgZnJvbSBhIGR5bmFtaWMgb2JqZWN0IGFyZSBub3QgdGhlIHN5bWJvbHMgaW4KLSAgICAgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUsIGJ1dCwgcmF0aGVyLCB0aGUgc3ltYm9scyBpbiB0aGUgZXhwb3J0Ci0gICAgIHRhYmxlLiAgSWYgdGhlcmUgaXMgYSBnbG9iYWwgc3ltYm9sIGluIGEgZHluYW1pYyBvYmplY3Qgd2hpY2ggaXMKLSAgICAgbm90IGluIHRoZSBleHBvcnQgdGFibGUsIHRoZSBsb2FkZXIgd2lsbCBub3QgYmUgYWJsZSB0byBmaW5kIGl0LAotICAgICBzbyB3ZSBkb24ndCB3YW50IHRvIGZpbmQgaXQgZWl0aGVyLiAgQWxzbywgb24gQUlYIDQuMS4zLCBzaHIubyBpbgotICAgICBsaWJjLmEgaGFzIHN5bWJvbHMgaW4gdGhlIGV4cG9ydCB0YWJsZSB3aGljaCBhcmUgbm90IGluIHRoZQotICAgICBzeW1ib2wgdGFibGUuICAqLwotCi0gIC8qIFJlYWQgaW4gdGhlIC5sb2FkZXIgc2VjdGlvbi4gIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5IHVzZSB0aGUKLSAgICAgb19zbmxvYWRlciBmaWVsZCBpbiB0aGUgYS5vdXQgaGVhZGVyLCByYXRoZXIgdGhhbiBncmFiYmluZyB0aGUKLSAgICAgc2VjdGlvbiBieSBuYW1lLiAgKi8KLSAgbHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxvYWRlciIpOwotICBpZiAobHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCShfKCIlczogZHluYW1pYyBvYmplY3Qgd2l0aCBubyAubG9hZGVyIHNlY3Rpb24iKSwKLQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISB4Y29mZl9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgbHNlYykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBidWYgPSBjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbHNlYyktPmNvbnRlbnRzOwotCi0gIC8qIFJlbW92ZSB0aGUgc2VjdGlvbnMgZnJvbSB0aGlzIG9iamVjdCwgc28gdGhhdCB0aGV5IGRvIG5vdCBnZXQKLSAgICAgaW5jbHVkZWQgaW4gdGhlIGxpbmsuICAqLwotICBhYmZkLT5zZWN0aW9ucyA9IE5VTEw7Ci0KLSAgeGNvZmZfc3dhcF9sZGhkcl9pbiAoYWJmZCwgKHN0cnVjdCBleHRlcm5hbF9sZGhkciAqKSBidWYsICZsZGhkcik7Ci0KLSAgc3RyaW5ncyA9IChjaGFyICopIGJ1ZiArIGxkaGRyLmxfc3RvZmY7Ci0KLSAgZWxzeW0gPSAoc3RydWN0IGV4dGVybmFsX2xkc3ltICopIChidWYgKyBMREhEUlNaKTsKLSAgZWxzeW1lbmQgPSBlbHN5bSArIGxkaGRyLmxfbnN5bXM7Ci0gIEJGRF9BU1NFUlQgKHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkc3ltKSA9PSBMRFNZTVNaKTsKLSAgZm9yICg7IGVsc3ltIDwgZWxzeW1lbmQ7IGVsc3ltKyspCi0gICAgewotICAgICAgc3RydWN0IGludGVybmFsX2xkc3ltIGxkc3ltOwotICAgICAgY2hhciBuYW1idWZbU1lNTk1MRU4gKyAxXTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICB4Y29mZl9zd2FwX2xkc3ltX2luIChhYmZkLCBlbHN5bSwgJmxkc3ltKTsKLQotICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBleHBvcnRlZCBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICgobGRzeW0ubF9zbXR5cGUgJiBMX0VYUE9SVCkgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKGxkc3ltLl9sLl9sX2wuX2xfemVyb2VzID09IDApCi0JbmFtZSA9IHN0cmluZ3MgKyBsZHN5bS5fbC5fbF9sLl9sX29mZnNldDsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKG5hbWJ1ZiwgbGRzeW0uX2wuX2xfbmFtZSwgU1lNTk1MRU4pOwotCSAgbmFtYnVmW1NZTU5NTEVOXSA9ICdcMCc7Ci0JICBuYW1lID0gbmFtYnVmOwotCX0KLQotICAgICAgLyogTm9ybWFsbHkgd2UgY291bGQgbm90IGNhbGwgeGNvZmZfbGlua19oYXNoX2xvb2t1cCBpbiBhbiBhZGQKLQkgc3ltYm9scyByb3V0aW5lLCBzaW5jZSB3ZSBtaWdodCBub3QgYmUgdXNpbmcgYW4gWENPRkYgaGFzaAotCSB0YWJsZS4gIEhvd2V2ZXIsIHdlIHZlcmlmaWVkIGFib3ZlIHRoYXQgd2UgYXJlIHVzaW5nIGFuIFhDT0ZGCi0JIGhhc2ggdGFibGUuICAqLwotCi0gICAgICBoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsCi0JCQkJICB0cnVlLCB0cnVlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfRFlOQU1JQzsKLQotICAgICAgLyogSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIGFuZCB0aGUgQkZEIGl0IHdhcyBmb3VuZCBpbiBpcwotCSBub3QgYSBkeW5hbWljIG9iamVjdCwgY2hhbmdlIHRoZSBCRkQgdG8gdGhpcyBkeW5hbWljIG9iamVjdCwKLQkgc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBjb3JyZWN0IGltcG9ydCBmaWxlIElELiAgKi8KLSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCSAgJiYgKGgtPnJvb3QudS51bmRlZi5hYmZkID09IE5VTEwKLQkgICAgICB8fCAoaC0+cm9vdC51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMCkpCi0JaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCi0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCXsKLQkgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCSAgLyogV2UgZG8gbm90IHdhbnQgdG8gYWRkIHRoaXMgdG8gdGhlIHVuZGVmaW5lZCBzeW1ib2wgbGlzdC4gICovCi0JfQotCi0gICAgICBpZiAoaC0+c21jbGFzID09IFhNQ19VQQotCSAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JaC0+c21jbGFzID0gbGRzeW0ubF9zbWNsYXM7Ci0KLSAgICAgIC8qIFVubGVzcyB0aGlzIGlzIGFuIFhNQ19YTyBzeW1ib2wsIHdlIGRvbid0IGJvdGhlciB0byBhY3R1YWxseQotICAgICAgICAgZGVmaW5lIGl0LCBzaW5jZSB3ZSBkb24ndCBoYXZlIGEgc2VjdGlvbiB0byBwdXQgaXQgaW4gYW55aG93LgotICAgICAgICAgSW5zdGVhZCwgdGhlIHJlbG9jYXRpb24gcm91dGluZXMgaGFuZGxlIHRoZSBERUZfRFlOQU1JQyBmbGFnCi0gICAgICAgICBjb3JyZWN0bHkuICAqLwotCi0gICAgICBpZiAoaC0+c21jbGFzID09IFhNQ19YTwotCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0JewotCSAgLyogVGhpcyBzeW1ib2wgaGFzIGFuIGFic29sdXRlIHZhbHVlLiAgKi8KLQkgIGgtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gbGRzeW0ubF92YWx1ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgc3ltYm9sIGRlZmluZXMgYSBmdW5jdGlvbiBkZXNjcmlwdG9yLCB0aGVuIGl0Ci0JIGltcGxpY2l0bHkgZGVmaW5lcyB0aGUgZnVuY3Rpb24gY29kZSBhcyB3ZWxsLiAgKi8KLSAgICAgIGlmIChoLT5zbWNsYXMgPT0gWE1DX0RTCi0JICB8fCAoaC0+c21jbGFzID09IFhNQ19YTyAmJiBuYW1lWzBdICE9ICcuJykpCi0JaC0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwKQotCXsKLQkgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotCSAgaGRzID0gaC0+ZGVzY3JpcHRvcjsKLQkgIGlmIChoZHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGNoYXIgKmRzbm07Ci0KLQkgICAgICBkc25tID0gYmZkX21hbGxvYyAoc3RybGVuIChuYW1lKSArIDIpOwotCSAgICAgIGlmIChkc25tID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBkc25tWzBdID0gJy4nOwotCSAgICAgIHN0cmNweSAoZHNubSArIDEsIG5hbWUpOwotCSAgICAgIGhkcyA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBkc25tLAotCQkJCQkgICAgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0JICAgICAgZnJlZSAoZHNubSk7Ci0JICAgICAgaWYgKGhkcyA9PSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgICBpZiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JCXsKLQkJICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCQkgIGhkcy0+cm9vdC51LnVuZGVmLmFiZmQgPSBhYmZkOwotCQkgIC8qIFdlIGRvIG5vdCB3YW50IHRvIGFkZCB0aGlzIHRvIHRoZSB1bmRlZmluZWQKLSAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCBsaXN0LiAgKi8KLQkJfQotCi0JICAgICAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkgICAgICBoLT5kZXNjcmlwdG9yID0gaGRzOwotCSAgICB9Ci0KLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVGX0RZTkFNSUM7Ci0JICBpZiAoaGRzLT5zbWNsYXMgPT0gWE1DX1VBKQotCSAgICBoZHMtPnNtY2xhcyA9IFhNQ19QUjsKLQotCSAgLyogQW4gYWJzb2x1dGUgc3ltYm9sIGFwcGVhcnMgdG8gYWN0dWFsbHkgZGVmaW5lIGNvZGUsIG5vdCBhCi0JICAgICBmdW5jdGlvbiBkZXNjcmlwdG9yLiAgVGhpcyBpcyBob3cgc29tZSBtYXRoIGZ1bmN0aW9ucyBhcmUKLQkgICAgIGltcGxlbWVudGVkIG9uIEFJWCA0LjEuICAqLwotCSAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfWE8KLQkgICAgICAmJiAoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICB8fCBoZHMtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykpCi0JICAgIHsKLQkgICAgICBoZHMtPnNtY2xhcyA9IFhNQ19YTzsKLQkgICAgICBoZHMtPnJvb3QudHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgICAgICBoZHMtPnJvb3QudS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgaGRzLT5yb290LnUuZGVmLnZhbHVlID0gbGRzeW0ubF92YWx1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGJ1ZiAhPSBOVUxMICYmICEgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5rZWVwX2NvbnRlbnRzKQotICAgIHsKLSAgICAgIGZyZWUgKGNvZmZfc2VjdGlvbl9kYXRhIChhYmZkLCBsc2VjKS0+Y29udGVudHMpOwotICAgICAgY29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIGxzZWMpLT5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFJlY29yZCB0aGlzIGZpbGUgaW4gdGhlIGltcG9ydCBmaWxlcy4gICovCi0KLSAgbiA9ICgoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICopCi0gICAgICAgYmZkX2FsbG9jIChhYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSkpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG4tPm5leHQgPSBOVUxMOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIHBhdGggZW50cnkgaW4gdGhlIGltcG9ydCBmaWxlIGxpc3QgZm9yIGEKLSAgICAgc2hhcmVkIG9iamVjdCBhcHBlYXJzIHRvIGFsd2F5cyBiZSBlbXB0eS4gIFRoZSBmaWxlIG5hbWUgaXMgdGhlCi0gICAgIGJhc2UgbmFtZS4gICovCi0gIG4tPnBhdGggPSAiIjsKLSAgaWYgKGFiZmQtPm15X2FyY2hpdmUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBibmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotICAgICAgbW5hbWUgPSAiIjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBibmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQtPm15X2FyY2hpdmUpOwotICAgICAgbW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLSAgICB9Ci0gIHMgPSBzdHJyY2hyIChibmFtZSwgJy8nKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICBibmFtZSA9IHMgKyAxOwotICBuLT5maWxlID0gYm5hbWU7Ci0gIG4tPm1lbWJlciA9IG1uYW1lOwotCi0gIC8qIFdlIHN0YXJ0IGMgYXQgMSBiZWNhdXNlIHRoZSBmaXJzdCBpbXBvcnQgZmlsZSBudW1iZXIgaXMgcmVzZXJ2ZWQKLSAgICAgZm9yIExJQlBBVEguICAqLwotICBmb3IgKHBwID0gJnhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5pbXBvcnRzLCBjID0gMTsKLSAgICAgICAqcHAgIT0gTlVMTDsKLSAgICAgICBwcCA9ICYoKnBwKS0+bmV4dCwgKytjKQotICAgIDsKLSAgKnBwID0gbjsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+aW1wb3J0X2ZpbGVfaWQgPSBjOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUm91dGluZXMgdGhhdCBhcmUgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuCi0gICBoYW5kbGVkLCBidXQgYmVmb3JlIHRoZSBzZWN0aW9ucyBhcmUgbGFpZCBvdXQgaW4gbWVtb3J5LiAgKi8KLQotLyogTWFyayBhIHN5bWJvbCBhcyBub3QgYmVpbmcgZ2FyYmFnZSwgaW5jbHVkaW5nIHRoZSBzZWN0aW9uIGluIHdoaWNoCi0gICBpdCBpcyBkZWZpbmVkLiAgKi8KLQotc3RhdGljIElOTElORSBib29sZWFuCi14Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci17Ci0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX01BUks7Ci0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpoc2VjOwotCi0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaWYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChoc2VjKQotCSAgJiYgKGhzZWMtPmZsYWdzICYgU0VDX01BUkspID09IDApCi0JewotCSAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgaHNlYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmIChoLT50b2Nfc2VjdGlvbiAhPSBOVUxMCi0gICAgICAmJiAoaC0+dG9jX3NlY3Rpb24tPmZsYWdzICYgU0VDX01BUkspID09IDApCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgaC0+dG9jX3NlY3Rpb24pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBtYXJrIHBoYXNlIG9mIGdhcmJhZ2UgY29sbGVjdGlvbi4gIEZvciBhIGdpdmVuIHNlY3Rpb24sIG1hcmsKLSAgIGl0LCBhbmQgYWxsIHRoZSBzZWN0aW9ucyB3aGljaCBkZWZpbmUgc3ltYm9scyB0byB3aGljaCBpdCByZWZlcnMuCi0gICBCZWNhdXNlIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gbG9vayBhdCB0aGUgcmVsb2NzLCB3ZSBhbHNvIGNvdW50Ci0gICB0aGUgbnVtYmVyIG9mIHJlbG9jcyB3aGljaCBuZWVkIHRvIGJlIGNvcGllZCBpbnRvIHRoZSAubG9hZGVyCi0gICBzZWN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX21hcmsgKGluZm8sIHNlYykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLSAgICAgIHx8IChzZWMtPmZsYWdzICYgU0VDX01BUkspICE9IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2VjLT5mbGFncyB8PSBTRUNfTUFSSzsKLQotICBpZiAoc2VjLT5vd25lci0+eHZlYyA9PSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0gICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0gICAgICAmJiB4Y29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqaHAsICoqaHBlbmQ7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbCwgKnJlbGVuZDsKLQotICAgICAgLyogTWFyayBhbGwgdGhlIHN5bWJvbHMgaW4gdGhpcyBzZWN0aW9uLiAgKi8KLQotICAgICAgaHAgPSAob2JqX3hjb2ZmX3N5bV9oYXNoZXMgKHNlYy0+b3duZXIpCi0JICAgICsgeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5maXJzdF9zeW1uZHgpOwotICAgICAgaHBlbmQgPSAob2JqX3hjb2ZmX3N5bV9oYXNoZXMgKHNlYy0+b3duZXIpCi0JICAgICAgICsgeGNvZmZfc2VjdGlvbl9kYXRhIChzZWMtPm93bmVyLCBzZWMpLT5sYXN0X3N5bW5keCk7Ci0gICAgICBmb3IgKDsgaHAgPCBocGVuZDsgaHArKykKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICBoID0gKmhwOwotCSAgaWYgKGggIT0gTlVMTAotCSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9uIHJlbG9jcy4gICovCi0KLSAgICAgIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMAotCSAgJiYgc2VjLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgcmVsID0geGNvZmZfcmVhZF9pbnRlcm5hbF9yZWxvY3MgKHNlYy0+b3duZXIsIHNlYywgdHJ1ZSwKLQkJCQkJICAgIChiZmRfYnl0ZSAqKSBOVUxMLCBmYWxzZSwKLQkJCQkJICAgIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikgTlVMTCk7Ci0JICBpZiAocmVsID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIHJlbGVuZCA9IHJlbCArIHNlYy0+cmVsb2NfY291bnQ7Ci0JICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpyc2VjOwotCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpZiAoKHVuc2lnbmVkIGludCkgcmVsLT5yX3N5bW5keAotCQkgID4gb2JqX3Jhd19zeW1lbnRfY291bnQgKHNlYy0+b3duZXIpKQotCQljb250aW51ZTsKLQotCSAgICAgIGggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoc2VjLT5vd25lcilbcmVsLT5yX3N5bW5keF07Ci0JICAgICAgaWYgKGggIT0gTlVMTAotCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDApCi0JCXsKLQkJICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHJzZWMgPSB4Y29mZl9kYXRhIChzZWMtPm93bmVyKS0+Y3NlY3RzW3JlbC0+cl9zeW1uZHhdOwotCSAgICAgIGlmIChyc2VjICE9IE5VTEwKLQkJICAmJiAocnNlYy0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMCkKLQkJewotCQkgIGlmICghIHhjb2ZmX21hcmsgKGluZm8sIHJzZWMpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICAvKiBTZWUgaWYgdGhpcyByZWxvYyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgLmxvYWRlcgotICAgICAgICAgICAgICAgICBzZWN0aW9uLiAgKi8KLQkgICAgICBzd2l0Y2ggKHJlbC0+cl90eXBlKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCSAgaWYgKGggPT0gTlVMTAotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uCi0JCSAgICAgIHx8ICgoaC0+ZmxhZ3MgJiBYQ09GRl9DQUxMRUQpICE9IDAKLQkJCSAgJiYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkJICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotCQkJICAmJiBoLT5kZXNjcmlwdG9yICE9IE5VTEwKLQkJCSAgJiYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwCi0JCQkgICAgICB8fCAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwCi0JCQkJICAmJiAoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MKLQkJCQkgICAgICAmIFhDT0ZGX0RFRl9SRUdVTEFSKSA9PSAwKSkpKQotCQkgICAgYnJlYWs7Ci0JCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJY2FzZSBSX1BPUzoKLQkJY2FzZSBSX05FRzoKLQkJY2FzZSBSX1JMOgotCQljYXNlIFJfUkxBOgotCQkgICsreGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkcmVsX2NvdW50OwotCQkgIGlmIChoICE9IE5VTEwpCi0JCSAgICBoLT5mbGFncyB8PSBYQ09GRl9MRFJFTDsKLQkJICBicmVhazsKLQkJY2FzZSBSX1RPQzoKLQkJY2FzZSBSX0dMOgotCQljYXNlIFJfVENMOgotCQljYXNlIFJfVFJMOgotCQljYXNlIFJfVFJMQToKLQkJICAvKiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBhIC5sb2FkZXIgcmVsb2MgZm9yIGEgVE9DCi0JCSAgICAgcmVsYXRpdmUgcmVsb2MuICAqLwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkKLQkgICAgICAmJiBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0JICAgICAgJiYgY29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYyktPnJlbG9jcyAhPSBOVUxMCi0JICAgICAgJiYgISBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+a2VlcF9yZWxvY3MpCi0JICAgIHsKLQkgICAgICBmcmVlIChjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzKTsKLQkgICAgICBjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+cmVsb2NzID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoZSBzd2VlcCBwaGFzZSBvZiBnYXJiYWdlIGNvbGxlY3Rpb24uICBSZW1vdmUgYWxsIGdhcmJhZ2UKLSAgIHNlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLXhjb2ZmX3N3ZWVwIChpbmZvKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkICpzdWI7Ci0KLSAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKm87Ci0KLSAgICAgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JewotCSAgaWYgKChvLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogS2VlcCBhbGwgc2VjdGlvbnMgZnJvbSBub24tWENPRkYgaW5wdXQgZmlsZXMuICBLZWVwCi0gICAgICAgICAgICAgICAgIHNwZWNpYWwgc2VjdGlvbnMuICBLZWVwIC5kZWJ1ZyBzZWN0aW9ucyBmb3IgdGhlCi0gICAgICAgICAgICAgICAgIG1vbWVudC4gICovCi0JICAgICAgaWYgKHN1Yi0+eHZlYyAhPSBpbmZvLT5oYXNoLT5jcmVhdG9yCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc2VjdGlvbgotCQkgIHx8IG8gPT0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uCi0JCSAgfHwgbyA9PSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb24KLQkJICB8fCBvID09IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb24KLQkJICB8fCBzdHJjbXAgKG8tPm5hbWUsICIuZGVidWciKSA9PSAwKQotCQlvLT5mbGFncyB8PSBTRUNfTUFSSzsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBvLT5fcmF3X3NpemUgPSAwOwotCQkgIG8tPnJlbG9jX2NvdW50ID0gMDsKLQkJICBvLT5saW5lbm9fY291bnQgPSAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBSZWNvcmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHNldC4gIFRoaXMgaXMgdXNlZCB0byBvdXRwdXQgdGhlCi0gICBjb3JyZWN0IGNzZWN0IGxlbmd0aC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgKG91dHB1dF9iZmQsIGluZm8sIGhhcmcsIHNpemUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoYXJnOwotICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKm47Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIC8qIFRoaXMgd2lsbCBoYXJkbHkgZXZlciBiZSBjYWxsZWQuICBJIGRvbid0IHdhbnQgdG8gYnVybiBmb3VyIGJ5dGVzCi0gICAgIHBlciBnbG9iYWwgc3ltYm9sLCBzbyBpbnN0ZWFkIHRoZSBzaXplIGlzIGtlcHQgb24gYSBsaW5rZWQgbGlzdAotICAgICBhdHRhY2hlZCB0byB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSAgbiA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfc2l6ZV9saXN0ICopCi0gICAgICAgYmZkX2FsbG9jIChvdXRwdXRfYmZkLCBzaXplb2YgKHN0cnVjdCB4Y29mZl9saW5rX3NpemVfbGlzdCkpKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG4tPm5leHQgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+c2l6ZV9saXN0OwotICBuLT5oID0gaDsKLSAgbi0+c2l6ZSA9IHNpemU7Ci0gIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5zaXplX2xpc3QgPSBuOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0hBU19TSVpFOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBJbXBvcnQgYSBzeW1ib2wuICAqLwotCi1ib29sZWFuCi1iZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgaW5mbywgaGFyZywgdmFsLCBpbXBwYXRoLCBpbXBmaWxlLAotCQkJIGltcG1lbWJlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhhcmc7Ci0gICAgIGJmZF92bWEgdmFsOwotICAgICBjb25zdCBjaGFyICppbXBwYXRoOwotICAgICBjb25zdCBjaGFyICppbXBmaWxlOwotICAgICBjb25zdCBjaGFyICppbXBtZW1iZXI7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmggPSAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSBoYXJnOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBBIHN5bWJvbCBuYW1lIHdoaWNoIHN0YXJ0cyB3aXRoIGEgcGVyaW9kIGlzIHRoZSBjb2RlIGZvciBhCi0gICAgIGZ1bmN0aW9uLiAgSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIHRoZW4gYWRkIGFuIHVuZGVmaW5lZAotICAgICBzeW1ib2wgZm9yIHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yLCBhbmQgaW1wb3J0IHRoYXQgaW5zdGVhZC4gICovCi0gIGlmIChoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotICAgICAgJiYgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICAmJiB2YWwgPT0gKGJmZF92bWEpIC0xKQotICAgIHsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotICAgICAgaGRzID0gaC0+ZGVzY3JpcHRvcjsKLSAgICAgIGlmIChoZHMgPT0gTlVMTCkKLQl7Ci0JICBoZHMgPSB4Y29mZl9saW5rX2hhc2hfbG9va3VwICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKSwKLQkJCQkJaC0+cm9vdC5yb290LnN0cmluZyArIDEsCi0JCQkJCXRydWUsIGZhbHNlLCB0cnVlKTsKLQkgIGlmIChoZHMgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotCSAgICB7Ci0JICAgICAgaGRzLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLQkgICAgICBoZHMtPnJvb3QudS51bmRlZi5hYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JICAgIH0KLQkgIGhkcy0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLQkgIEJGRF9BU1NFUlQgKChoZHMtPmZsYWdzICYgWENPRkZfQ0FMTEVEKSA9PSAwCi0JCSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFU0NSSVBUT1IpID09IDApOwotCSAgaGRzLT5kZXNjcmlwdG9yID0gaDsKLQkgIGgtPmRlc2NyaXB0b3IgPSBoZHM7Ci0JfQotCi0gICAgICAvKiBOb3csIGlmIHRoZSBkZXNjcmlwdG9yIGlzIHVuZGVmaW5lZCwgaW1wb3J0IHRoZSBkZXNjcmlwdG9yCi0gICAgICAgICByYXRoZXIgdGhhbiB0aGUgc3ltYm9sIHdlIHdlcmUgdG9sZCB0byBpbXBvcnQuICBGSVhNRTogSXMKLSAgICAgICAgIHRoaXMgY29ycmVjdCBpbiBhbGwgY2FzZXM/ICAqLwotICAgICAgaWYgKGhkcy0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotCWggPSBoZHM7Ci0gICAgfQotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0lNUE9SVDsKLQotICBpZiAodmFsICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgJiYgKCEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JICAgICAgfHwgaC0+cm9vdC51LmRlZi52YWx1ZSAhPSB2YWwpKQotCXsKLQkgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+bXVsdGlwbGVfZGVmaW5pdGlvbikKLQkJIChpbmZvLCBoLT5yb290LnJvb3Quc3RyaW5nLCBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyLAotCQkgIGgtPnJvb3QudS5kZWYuc2VjdGlvbiwgaC0+cm9vdC51LmRlZi52YWx1ZSwKLQkJICBvdXRwdXRfYmZkLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCB2YWwpKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIGgtPnJvb3QudS5kZWYudmFsdWUgPSB2YWw7Ci0gICAgfQotCi0gIC8qIFdlIG92ZXJsb2FkIHRoZSBsZGluZHggZmllbGQgdG8gaG9sZCB0aGUgbF9pZmlsZSB2YWx1ZSBmb3IgdGhpcwotICAgICBzeW1ib2wuICAqLwotICBCRkRfQVNTRVJUIChoLT5sZHN5bSA9PSBOVUxMKTsKLSAgQkZEX0FTU0VSVCAoKGgtPmZsYWdzICYgWENPRkZfQlVJTFRfTERTWU0pID09IDApOwotICBpZiAoaW1wcGF0aCA9PSBOVUxMKQotICAgIGgtPmxkaW5keCA9IC0xOwotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGM7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUgKipwcDsKLQotICAgICAgLyogV2Ugc3RhcnQgYyBhdCAxIGJlY2F1c2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBpbXBvcnQgbGlzdCBpcwotICAgICAgICAgcmVzZXJ2ZWQgZm9yIHRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoLiAgKi8KLSAgICAgIGZvciAocHAgPSAmeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmltcG9ydHMsIGMgPSAxOwotCSAgICpwcCAhPSBOVUxMOwotCSAgIHBwID0gJigqcHApLT5uZXh0LCArK2MpCi0JewotCSAgaWYgKHN0cmNtcCAoKCpwcCktPnBhdGgsIGltcHBhdGgpID09IDAKLQkgICAgICAmJiBzdHJjbXAgKCgqcHApLT5maWxlLCBpbXBmaWxlKSA9PSAwCi0JICAgICAgJiYgc3RyY21wICgoKnBwKS0+bWVtYmVyLCBpbXBtZW1iZXIpID09IDApCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCpwcCA9PSBOVUxMKQotCXsKLQkgIHN0cnVjdCB4Y29mZl9pbXBvcnRfZmlsZSAqbjsKLQotCSAgbiA9ICgoc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICopCi0JICAgICAgIGJmZF9hbGxvYyAob3V0cHV0X2JmZCwgc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfaW1wb3J0X2ZpbGUpKSk7Ci0JICBpZiAobiA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBuLT5uZXh0ID0gTlVMTDsKLQkgIG4tPnBhdGggPSBpbXBwYXRoOwotCSAgbi0+ZmlsZSA9IGltcGZpbGU7Ci0JICBuLT5tZW1iZXIgPSBpbXBtZW1iZXI7Ci0JICAqcHAgPSBuOwotCX0KLQotICAgICAgaC0+bGRpbmR4ID0gYzsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEV4cG9ydCBhIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9leHBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCBpbmZvLCBoYXJnLCBzeXNjYWxsKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFyZzsKLSAgICAgYm9vbGVhbiBzeXNjYWxsOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoID0gKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikgaGFyZzsKLQotICBpZiAoISBYQ09GRl9YVkVDUCAob3V0cHV0X2JmZC0+eHZlYykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfRVhQT1JUOwotCi0gIC8qIEZJWE1FOiBJJ20gbm90IGF0IGFsbCBzdXJlIHdoYXQgc3lzY2FsbCBpcyBzdXBwb3NlZCB0byBtZWFuLCBzbwotICAgICBJJ20ganVzdCBnb2luZyB0byBpZ25vcmUgaXQgdW50aWwgc29tZWJvZHkgZXhwbGFpbnMgaXQuICAqLwotCi0gIC8qIFNlZSBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gIEl0IG1heSBiZSBvbmUgZXZlbiB0aG91Z2gKLSAgICAgaXQgaXMgbm90IHNvIG1hcmtlZC4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSA9PSAwCi0gICAgICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdICE9ICcuJykKLSAgICB7Ci0gICAgICBjaGFyICpmbm5hbWU7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZm47Ci0KLSAgICAgIGZubmFtZSA9IChjaGFyICopIGJmZF9tYWxsb2MgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgKyAyKTsKLSAgICAgIGlmIChmbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbm5hbWVbMF0gPSAnLic7Ci0gICAgICBzdHJjcHkgKGZubmFtZSArIDEsIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotICAgICAgaGZuID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksCi0JCQkJICAgIGZubmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGZyZWUgKGZubmFtZSk7Ci0gICAgICBpZiAoaGZuICE9IE5VTEwKLQkgICYmIGhmbi0+c21jbGFzID09IFhNQ19QUgotCSAgJiYgKGhmbi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGhmbi0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0JewotCSAgaC0+ZmxhZ3MgfD0gWENPRkZfREVTQ1JJUFRPUjsKLQkgIGgtPmRlc2NyaXB0b3IgPSBoZm47Ci0JICBoZm4tPmRlc2NyaXB0b3IgPSBoOwotCX0KLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGRvbid0IGdhcmJhZ2UgY29sbGVjdCB0aGlzIHN5bWJvbC4gICovCi0gIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGRlc2NyaXB0b3IsIG1ha2Ugc3VyZSB3ZSBkb24ndCBnYXJiYWdlCi0gICAgIGNvbGxlY3QgdGhlIGFzc29jaWF0ZWQgZnVuY3Rpb24gY29kZS4gIFdlIG5vcm1hbGx5IGRvbid0IGhhdmUgdG8KLSAgICAgd29ycnkgYWJvdXQgdGhpcywgYmVjYXVzZSB0aGUgZGVzY3JpcHRvciB3aWxsIGJlIGF0dGFjaGVkIHRvIGEKLSAgICAgc2VjdGlvbiB3aXRoIHJlbG9jcywgYnV0IGlmIHdlIGFyZSBjcmVhdGluZyB0aGUgZGVzY3JpcHRvcgotICAgICBvdXJzZWx2ZXMgdGhvc2UgcmVsb2NzIHdpbGwgbm90IGJlIHZpc2libGUgdG8gdGhlIG1hcmsgY29kZS4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIHhjb2ZmX21hcmtfc3ltYm9sIChpbmZvLCBoLT5kZXNjcmlwdG9yKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDb3VudCBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wuICBUaGlzIGlzIGNhbGxlZCBmb3IgcmVsb2NzCi0gICBnZW5lcmF0ZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsIHR5cGljYWxseSBmb3IgZ2xvYmFsIGNvbnN0cnVjdG9ycwotICAgYW5kIGRlc3RydWN0b3JzLiAgKi8KLQotYm9vbGVhbgotYmZkX3hjb2ZmX2xpbmtfY291bnRfcmVsb2MgKG91dHB1dF9iZmQsIGluZm8sIG5hbWUpCi0gICAgIGJmZCAqb3V0cHV0X2JmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaWYgKCEgWENPRkZfWFZFQ1AgKG91dHB1dF9iZmQtPnh2ZWMpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGggPSAoKHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKikKLSAgICAgICBiZmRfd3JhcHBlZF9saW5rX2hhc2hfbG9va3VwIChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lLCBmYWxzZSwgZmFsc2UsCi0JCQkJICAgICBmYWxzZSkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHsKLSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKSAoXygiJXM6IG5vIHN1Y2ggc3ltYm9sIiksIG5hbWUpOwotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX3N5bWJvbHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBoLT5mbGFncyB8PSBYQ09GRl9SRUZfUkVHVUxBUiB8IFhDT0ZGX0xEUkVMOwotICArK3hjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5sZHJlbF9jb3VudDsKLSAgCi0gIC8qIE1hcmsgdGhlIHN5bWJvbCB0byBhdm9pZCBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotICBpZiAoISB4Y29mZl9tYXJrX3N5bWJvbCAoaW5mbywgaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgdG8gd2hpY2ggdGhlIGxpbmtlciBzY3JpcHQKLSAgIGFzc2lnbnMgYSB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCBpbmZvLCBuYW1lKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBoID0geGNvZmZfbGlua19oYXNoX2xvb2t1cCAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyksIG5hbWUsIHRydWUsIHRydWUsCi0JCQkgICAgICBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGgtPmZsYWdzIHw9IFhDT0ZGX0RFRl9SRUdVTEFSOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdGhyb3VnaAotICAgeGNvZmZfbGlua19oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvCi17Ci0gIC8qIFNldCBpZiBhIHByb2JsZW0gb2NjdXJyZWQuICAqLwotICBib29sZWFuIGZhaWxlZDsKLSAgLyogT3V0cHV0IEJGRC4gICovCi0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgLyogTGluayBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgLyogV2hldGhlciBhbGwgZGVmaW5lZCBzeW1ib2xzIHNob3VsZCBiZSBleHBvcnRlZC4gICovCi0gIGJvb2xlYW4gZXhwb3J0X2RlZmluZWRzOwotICAvKiBOdW1iZXIgb2YgbGRzeW0gc3RydWN0dXJlcy4gICovCi0gIHNpemVfdCBsZHN5bV9jb3VudDsKLSAgLyogU2l6ZSBvZiBzdHJpbmcgdGFibGUuICAqLwotICBzaXplX3Qgc3RyaW5nX3NpemU7Ci0gIC8qIFN0cmluZyB0YWJsZS4gICovCi0gIGJmZF9ieXRlICpzdHJpbmdzOwotICAvKiBBbGxvY2F0ZWQgc2l6ZSBvZiBzdHJpbmcgdGFibGUuICAqLwotICBzaXplX3Qgc3RyaW5nX2FsYzsKLX07Ci0KLS8qIEJ1aWxkIHRoZSAubG9hZGVyIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgWENPRkYgbGlua2VyCi0gICBlbXVsYXRpb24gYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZS4gIFdlIG11c3Qgc2V0IHRoZSBzaXplIG9mIHRoZQotICAgLmxvYWRlciBzZWN0aW9uIGJlZm9yZSB0aGUgbGlua2VyIGxheXMgb3V0IHRoZSBvdXRwdXQgZmlsZS4KLSAgIExJQlBBVEggaXMgdGhlIGxpYnJhcnkgcGF0aCB0byBzZWFyY2ggZm9yIHNoYXJlZCBvYmplY3RzOyB0aGlzIGlzCi0gICBub3JtYWxseSBidWlsdCBmcm9tIHRoZSAtTCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBsaW5rZXIuICBFTlRSWQotICAgaXMgdGhlIG5hbWUgb2YgdGhlIGVudHJ5IHBvaW50IHN5bWJvbCAodGhlIC1lIGxpbmtlciBvcHRpb24pLgotICAgRklMRV9BTElHTiBpcyB0aGUgYWxpZ25tZW50IHRvIHVzZSBmb3Igc2VjdGlvbnMgd2l0aGluIHRoZSBmaWxlCi0gICAodGhlIC1IIGxpbmtlciBvcHRpb24pLiAgTUFYU1RBQ0sgaXMgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSAodGhlCi0gICAtYm1heHN0YWNrIGxpbmtlciBvcHRpb24pLiAgTUFYREFUQSBpcyB0aGUgbWF4aW11bSBkYXRhIHNpemUgKHRoZQotICAgLWJtYXhkYXRhIGxpbmtlciBvcHRpb24pLiAgR0MgaXMgd2hldGhlciB0byBkbyBnYXJiYWdlIGNvbGxlY3Rpb24KLSAgICh0aGUgLWJnYyBsaW5rZXIgb3B0aW9uKS4gIE1PRFRZUEUgaXMgdGhlIG1vZHVsZSB0eXBlICh0aGUKLSAgIC1ibW9kdHlwZSBsaW5rZXIgb3B0aW9uKS4gIFRFWFRSTyBpcyB3aGV0aGVyIHRoZSB0ZXh0IHNlY3Rpb24gbXVzdAotICAgYmUgcmVhZCBvbmx5ICh0aGUgLWJ0ZXh0cm8gbGlua2VyIG9wdGlvbikuICBFWFBPUlRfREVGSU5FRFMgaXMKLSAgIHdoZXRoZXIgYWxsIGRlZmluZWQgc3ltYm9scyBzaG91bGQgYmUgZXhwb3J0ZWQgKHRoZSAtdW5peCBsaW5rZXIKLSAgIG9wdGlvbikuICBTUEVDSUFMX1NFQ1RJT05TIGlzIHNldCBieSB0aGlzIHJvdXRpbmUgdG8gY3NlY3RzIHdpdGgKLSAgIG1hZ2ljIG5hbWVzIGxpa2UgX2VuZC4gICovCi0KLWJvb2xlYW4KLWJmZF94Y29mZl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsIGluZm8sIGxpYnBhdGgsIGVudHJ5LAotCQkJCSBmaWxlX2FsaWduLCBtYXhzdGFjaywgbWF4ZGF0YSwgZ2MsCi0JCQkJIG1vZHR5cGUsIHRleHRybywgZXhwb3J0X2RlZmluZWRzLAotCQkJCSBzcGVjaWFsX3NlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpsaWJwYXRoOwotICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICAgdW5zaWduZWQgbG9uZyBmaWxlX2FsaWduOwotICAgICB1bnNpZ25lZCBsb25nIG1heHN0YWNrOwotICAgICB1bnNpZ25lZCBsb25nIG1heGRhdGE7Ci0gICAgIGJvb2xlYW4gZ2M7Ci0gICAgIGludCBtb2R0eXBlOwotICAgICBib29sZWFuIHRleHRybzsKLSAgICAgYm9vbGVhbiBleHBvcnRfZGVmaW5lZHM7Ci0gICAgIGFzZWN0aW9uICoqc3BlY2lhbF9zZWN0aW9uczsKLXsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqaGVudHJ5OwotICBhc2VjdGlvbiAqbHNlYzsKLSAgc3RydWN0IHhjb2ZmX2xvYWRlcl9pbmZvIGxkaW5mbzsKLSAgaW50IGk7Ci0gIHNpemVfdCBpbXBzaXplLCBpbXBjb3VudDsKLSAgc3RydWN0IHhjb2ZmX2ltcG9ydF9maWxlICpmbDsKLSAgc3RydWN0IGludGVybmFsX2xkaGRyICpsZGhkcjsKLSAgYmZkX3NpemVfdHlwZSBzdG9mZjsKLSAgcmVnaXN0ZXIgY2hhciAqb3V0OwotICBhc2VjdGlvbiAqc2VjOwotICBiZmQgKnN1YjsKLSAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZGVidWdfc3RydGFiOwotICBiZmRfYnl0ZSAqZGVidWdfY29udGVudHMgPSBOVUxMOwotCi0gIGlmICghIFhDT0ZGX1hWRUNQIChvdXRwdXRfYmZkLT54dmVjKSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCXNwZWNpYWxfc2VjdGlvbnNbaV0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGxkaW5mby5mYWlsZWQgPSBmYWxzZTsKLSAgbGRpbmZvLm91dHB1dF9iZmQgPSBvdXRwdXRfYmZkOwotICBsZGluZm8uaW5mbyA9IGluZm87Ci0gIGxkaW5mby5leHBvcnRfZGVmaW5lZHMgPSBleHBvcnRfZGVmaW5lZHM7Ci0gIGxkaW5mby5sZHN5bV9jb3VudCA9IDA7Ci0gIGxkaW5mby5zdHJpbmdfc2l6ZSA9IDA7Ci0gIGxkaW5mby5zdHJpbmdzID0gTlVMTDsKLSAgbGRpbmZvLnN0cmluZ19hbGMgPSAwOwotCi0gIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5tYXhzdGFjayA9IG1heHN0YWNrOwotICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+bWF4ZGF0YSA9IG1heGRhdGE7Ci0gIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5tb2R0eXBlID0gbW9kdHlwZTsKLQotICB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZmlsZV9hbGlnbiA9IGZpbGVfYWxpZ247Ci0gIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT50ZXh0cm8gPSB0ZXh0cm87Ci0KLSAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgaGVudHJ5ID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGhlbnRyeSA9IHhjb2ZmX2xpbmtfaGFzaF9sb29rdXAgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCBlbnRyeSwKLQkJCQkgICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoZW50cnkgIT0gTlVMTCkKLQloZW50cnktPmZsYWdzIHw9IFhDT0ZGX0VOVFJZOwotICAgIH0KLQotICAvKiBHYXJiYWdlIGNvbGxlY3QgdW51c2VkIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGluZm8tPnJlbG9jYXRlYWJsZQotICAgICAgfHwgISBnYwotICAgICAgfHwgaGVudHJ5ID09IE5VTEwKLSAgICAgIHx8IChoZW50cnktPnJvb3QudHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIGhlbnRyeS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpCi0gICAgewotICAgICAgZ2MgPSBmYWxzZTsKLSAgICAgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5nYyA9IGZhbHNlOwotCi0gICAgICAvKiBXZSBzdGlsbCBuZWVkIHRvIGNhbGwgeGNvZmZfbWFyaywgaW4gb3JkZXIgdG8gc2V0IGxkcmVsX2NvdW50Ci0gICAgICAgICBjb3JyZWN0bHkuICAqLwotICAgICAgZm9yIChzdWIgPSBpbmZvLT5pbnB1dF9iZmRzOyBzdWIgIT0gTlVMTDsgc3ViID0gc3ViLT5saW5rX25leHQpCi0JewotCSAgYXNlY3Rpb24gKm87Ci0KLQkgIGZvciAobyA9IHN1Yi0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoKG8tPmZsYWdzICYgU0VDX01BUkspID09IDApCi0JCXsKLQkJICBpZiAoISB4Y29mZl9tYXJrIChpbmZvLCBvKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgeGNvZmZfbWFyayAoaW5mbywgaGVudHJ5LT5yb290LnUuZGVmLnNlY3Rpb24pKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgeGNvZmZfc3dlZXAgKGluZm8pOwotICAgICAgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmdjID0gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogUmV0dXJuIHNwZWNpYWwgc2VjdGlvbnMgdG8gdGhlIGNhbGxlci4gICovCi0gIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnNwZWNpYWxfc2VjdGlvbnNbaV07Ci0gICAgICBpZiAoc2VjICE9IE5VTEwKLQkgICYmIGdjCi0JICAmJiAoc2VjLT5mbGFncyAmIFNFQ19NQVJLKSA9PSAwKQotCXNlYyA9IE5VTEw7Ci0gICAgICBzcGVjaWFsX3NlY3Rpb25zW2ldID0gc2VjOwotICAgIH0KLQotICBpZiAoaW5mby0+aW5wdXRfYmZkcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEknbSBub3Qgc3VyZSB3aGF0IHRvIGRvIGluIHRoaXMgYml6YXJyZSBjYXNlLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICB4Y29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLCB4Y29mZl9idWlsZF9sZHN5bXMsCi0JCQkgICAgKFBUUikgJmxkaW5mbyk7Ci0gIGlmIChsZGluZm8uZmFpbGVkKQotICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCi0gIC8qIFdvcmsgb3V0IHRoZSBzaXplIG9mIHRoZSBpbXBvcnQgZmlsZSBuYW1lcy4gIEVhY2ggaW1wb3J0IGZpbGUgSUQKLSAgICAgY29uc2lzdHMgb2YgdGhyZWUgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3M6IHRoZSBwYXRoLCB0aGUgZmlsZQotICAgICBuYW1lLCBhbmQgdGhlIGFyY2hpdmUgbWVtYmVyIG5hbWUuICBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIGxpc3QKLSAgICAgb2YgbmFtZXMgaXMgdGhlIHBhdGggdG8gdXNlIHRvIGZpbmQgb2JqZWN0cywgd2hpY2ggdGhlIGxpbmtlciBoYXMKLSAgICAgcGFzc2VkIGluIGFzIHRoZSBsaWJwYXRoIGFyZ3VtZW50LiAgRm9yIHNvbWUgcmVhc29uLCB0aGUgcGF0aAotICAgICBlbnRyeSBpbiB0aGUgb3RoZXIgaW1wb3J0IGZpbGUgbmFtZXMgYXBwZWFycyB0byBhbHdheXMgYmUgZW1wdHkuICAqLwotICBpbXBzaXplID0gc3RybGVuIChsaWJwYXRoKSArIDM7Ci0gIGltcGNvdW50ID0gMTsKLSAgZm9yIChmbCA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5pbXBvcnRzOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5uZXh0KQotICAgIHsKLSAgICAgICsraW1wY291bnQ7Ci0gICAgICBpbXBzaXplICs9IChzdHJsZW4gKGZsLT5wYXRoKQotCQkgICsgc3RybGVuIChmbC0+ZmlsZSkKLQkJICArIHN0cmxlbiAoZmwtPm1lbWJlcikKLQkJICArIDMpOwotICAgIH0KLQotICAvKiBTZXQgdXAgdGhlIC5sb2FkZXIgc2VjdGlvbiBoZWFkZXIuICAqLwotICBsZGhkciA9ICZ4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRoZHI7Ci0gIGxkaGRyLT5sX3ZlcnNpb24gPSAxOwotICBsZGhkci0+bF9uc3ltcyA9IGxkaW5mby5sZHN5bV9jb3VudDsKLSAgbGRoZHItPmxfbnJlbG9jID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkcmVsX2NvdW50OwotICBsZGhkci0+bF9pc3RsZW4gPSBpbXBzaXplOwotICBsZGhkci0+bF9uaW1waWQgPSBpbXBjb3VudDsKLSAgbGRoZHItPmxfaW1wb2ZmID0gKExESERSU1oKLQkJICAgICArIGxkaGRyLT5sX25zeW1zICogTERTWU1TWgotCQkgICAgICsgbGRoZHItPmxfbnJlbG9jICogTERSRUxTWik7Ci0gIGxkaGRyLT5sX3N0bGVuID0gbGRpbmZvLnN0cmluZ19zaXplOwotICBzdG9mZiA9IGxkaGRyLT5sX2ltcG9mZiArIGltcHNpemU7Ci0gIGlmIChsZGluZm8uc3RyaW5nX3NpemUgPT0gMCkKLSAgICBsZGhkci0+bF9zdG9mZiA9IDA7Ci0gIGVsc2UKLSAgICBsZGhkci0+bF9zdG9mZiA9IHN0b2ZmOwotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBmaW5hbCBzaXplIG9mIHRoZSAubG9hZGVyIHNlY3Rpb24uICBBbGxvY2F0ZQotICAgICBzcGFjZSBmb3IgaXQuICAqLwotICBsc2VjID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uOwotICBsc2VjLT5fcmF3X3NpemUgPSBzdG9mZiArIGxkaGRyLT5sX3N0bGVuOwotICBsc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBsc2VjLT5fcmF3X3NpemUpOwotICBpZiAobHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBTZXQgdXAgdGhlIGhlYWRlci4gICovCi0gIHhjb2ZmX3N3YXBfbGRoZHJfb3V0IChvdXRwdXRfYmZkLCBsZGhkciwKLQkJCShzdHJ1Y3QgZXh0ZXJuYWxfbGRoZHIgKikgbHNlYy0+Y29udGVudHMpOwotCi0gIC8qIFNldCB1cCB0aGUgaW1wb3J0IGZpbGUgbmFtZXMuICAqLwotICBvdXQgPSAoY2hhciAqKSBsc2VjLT5jb250ZW50cyArIGxkaGRyLT5sX2ltcG9mZjsKLSAgc3RyY3B5IChvdXQsIGxpYnBhdGgpOwotICBvdXQgKz0gc3RybGVuIChsaWJwYXRoKSArIDE7Ci0gICpvdXQrKyA9ICdcMCc7Ci0gICpvdXQrKyA9ICdcMCc7Ci0gIGZvciAoZmwgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+aW1wb3J0czsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+bmV4dCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotCi0gICAgICBzID0gZmwtPnBhdGg7Ci0gICAgICB3aGlsZSAoKCpvdXQrKyA9ICpzKyspICE9ICdcMCcpCi0JOwotICAgICAgcyA9IGZsLT5maWxlOwotICAgICAgd2hpbGUgKCgqb3V0KysgPSAqcysrKSAhPSAnXDAnKQotCTsKLSAgICAgIHMgPSBmbC0+bWVtYmVyOwotICAgICAgd2hpbGUgKCgqb3V0KysgPSAqcysrKSAhPSAnXDAnKQotCTsKLSAgICB9Ci0KLSAgQkZEX0FTU0VSVCAoKGJmZF9zaXplX3R5cGUpICgoYmZkX2J5dGUgKikgb3V0IC0gbHNlYy0+Y29udGVudHMpID09IHN0b2ZmKTsKLQotICAvKiBTZXQgdXAgdGhlIHN5bWJvbCBzdHJpbmcgdGFibGUuICAqLwotICBpZiAobGRpbmZvLnN0cmluZ19zaXplID4gMCkKLSAgICB7Ci0gICAgICBtZW1jcHkgKG91dCwgbGRpbmZvLnN0cmluZ3MsIGxkaW5mby5zdHJpbmdfc2l6ZSk7Ci0gICAgICBmcmVlIChsZGluZm8uc3RyaW5ncyk7Ci0gICAgICBsZGluZm8uc3RyaW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IHNldCB1cCB0aGUgc3ltYm9sIHRhYmxlIG9yIHRoZSByZWxvY3MgeWV0LCBiZWNhdXNlIHdlCi0gICAgIGRvbid0IHlldCBrbm93IHRoZSBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgdmFyaW91cyBzZWN0aW9ucy4gIFRoZQotICAgICAubG9hZGVyIHN5bWJvbHMgYXJlIHdyaXR0ZW4gb3V0IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbm9ybWFsCi0gICAgIHN5bWJvbHMgYXJlIHdyaXR0ZW4gb3V0IGluIHhjb2ZmX2xpbmtfaW5wdXRfYmZkIG9yCi0gICAgIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wuICBUaGUgLmxvYWRlciByZWxvY3MgYXJlIHdyaXR0ZW4gb3V0Ci0gICAgIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIHJlbG9jcyBhcmUgaGFuZGxlZCBpbgotICAgICB4Y29mZl9saW5rX2lucHV0X2JmZC4gICovCi0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBtYWdpYyBzZWN0aW9ucy4gICovCi0gIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5saW5rYWdlX3NlY3Rpb247Ci0gIGlmIChzZWMtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjLT5jb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLSAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPnRvY19zZWN0aW9uOwotICBpZiAoc2VjLT5fcmF3X3NpemUgPiAwKQotICAgIHsKLSAgICAgIHNlYy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX3phbGxvYyAob3V0cHV0X2JmZCwgc2VjLT5fcmF3X3NpemUpOwotICAgICAgaWYgKHNlYy0+Y29udGVudHMgPT0gTlVMTCkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0gIHNlYyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb247Ci0gIGlmIChzZWMtPl9yYXdfc2l6ZSA+IDApCi0gICAgewotICAgICAgc2VjLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBiZmRfemFsbG9jIChvdXRwdXRfYmZkLCBzZWMtPl9yYXdfc2l6ZSk7Ci0gICAgICBpZiAoc2VjLT5jb250ZW50cyA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSd2ZSBkb25lIGdhcmJhZ2UgY29sbGVjdGlvbiwgZmlndXJlIG91dCB0aGUgY29udGVudHMKLSAgICAgb2YgdGhlIC5kZWJ1ZyBzZWN0aW9uLiAgKi8KLSAgZGVidWdfc3RydGFiID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3N0cnRhYjsKLQotICBmb3IgKHN1YiA9IGluZm8tPmlucHV0X2JmZHM7IHN1YiAhPSBOVUxMOyBzdWIgPSBzdWItPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc3ViZGViOwotICAgICAgYmZkX3NpemVfdHlwZSBzeW1jb3VudDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgKmRlYnVnX2luZGV4OwotICAgICAgYXNlY3Rpb24gKipjc2VjdHBwOwotICAgICAgYmZkX2J5dGUgKmVzeW0sICplc3ltZW5kOwotICAgICAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0KLSAgICAgIGlmIChzdWItPnh2ZWMgIT0gaW5mby0+aGFzaC0+Y3JlYXRvcikKLQljb250aW51ZTsKLSAgICAgIHN1YmRlYiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdWIsICIuZGVidWciKTsKLSAgICAgIGlmIChzdWJkZWIgPT0gTlVMTCB8fCBzdWJkZWItPl9yYXdfc2l6ZSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsCi0JICB8fCBpbmZvLT5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlcgotCSAgfHwgaW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbCkKLQl7Ci0JICBzdWJkZWItPl9yYXdfc2l6ZSA9IDA7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghIF9iZmRfY29mZl9nZXRfZXh0ZXJuYWxfc3ltYm9scyAoc3ViKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgc3ltY291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoc3ViKTsKLSAgICAgIGRlYnVnX2luZGV4ID0gKCh1bnNpZ25lZCBsb25nICopCi0JCSAgICAgYmZkX3phbGxvYyAoc3ViLCBzeW1jb3VudCAqIHNpemVvZiAodW5zaWduZWQgbG9uZykpKTsKLSAgICAgIGlmIChkZWJ1Z19pbmRleCA9PSBOVUxMKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgeGNvZmZfZGF0YSAoc3ViKS0+ZGVidWdfaW5kaWNlcyA9IGRlYnVnX2luZGV4OwotCi0gICAgICAvKiBHcmFiIHRoZSBjb250ZW50cyBvZiB0aGUgLmRlYnVnIHNlY3Rpb24uICBXZSB1c2UgbWFsbG9jIGFuZAotCSBjb3B5IHRoZSBuYW1lcyBpbnRvIHRoZSBkZWJ1ZyBzdHJpbmd0YWIsIHJhdGhlciB0aGFuCi0JIGJmZF9hbGxvYywgYmVjYXVzZSBJIGV4cGVjdCB0aGF0LCB3aGVuIGxpbmtpbmcgbWFueSBmaWxlcwotCSB0b2dldGhlciwgbWFueSBvZiB0aGUgc3RyaW5ncyB3aWxsIGJlIHRoZSBzYW1lLiAgU3RvcmluZyB0aGUKLQkgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBzaG91bGQgc2F2ZSBzcGFjZSBpbiB0aGlzIGNhc2UuICAqLwotICAgICAgZGVidWdfY29udGVudHMgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAoc3ViZGViLT5fcmF3X3NpemUpOwotICAgICAgaWYgKGRlYnVnX2NvbnRlbnRzID09IE5VTEwpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKHN1Yiwgc3ViZGViLCAoUFRSKSBkZWJ1Z19jb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHN1YmRlYi0+X3Jhd19zaXplKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLQotICAgICAgY3NlY3RwcCA9IHhjb2ZmX2RhdGEgKHN1YiktPmNzZWN0czsKLQotICAgICAgc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChzdWIpOwotICAgICAgZXN5bSA9IChiZmRfYnl0ZSAqKSBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChzdWIpOwotICAgICAgZXN5bWVuZCA9IGVzeW0gKyBzeW1jb3VudCAqIHN5bWVzejsKLSAgICAgIHdoaWxlIChlc3ltIDwgZXN5bWVuZCkKLQl7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bTsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKHN1YiwgKFBUUikgZXN5bSwgKFBUUikgJnN5bSk7Ci0KLQkgICpkZWJ1Z19pbmRleCA9ICh1bnNpZ25lZCBsb25nKSAtMTsKLQotCSAgaWYgKHN5bS5fbi5fbl9uLl9uX3plcm9lcyA9PSAwCi0JICAgICAgJiYgKmNzZWN0cHAgIT0gTlVMTAotCSAgICAgICYmICghIGdjCi0JCSAgfHwgKCgqY3NlY3RwcCktPmZsYWdzICYgU0VDX01BUkspICE9IDAKLQkJICB8fCAqY3NlY3RwcCA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCSAgICAgICYmIGJmZF9jb2ZmX3N5bW5hbWVfaW5fZGVidWcgKHN1YiwgJnN5bSkpCi0JICAgIHsKLQkgICAgICBjaGFyICpuYW1lOwotCSAgICAgIGJmZF9zaXplX3R5cGUgaW5keDsKLQotCSAgICAgIG5hbWUgPSAoY2hhciAqKSBkZWJ1Z19jb250ZW50cyArIHN5bS5fbi5fbl9uLl9uX29mZnNldDsKLQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChkZWJ1Z19zdHJ0YWIsIG5hbWUsIHRydWUsIHRydWUpOwotCSAgICAgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgKmRlYnVnX2luZGV4ID0gaW5keDsKLQkgICAgfQotCi0JICBlc3ltICs9IChzeW0ubl9udW1hdXggKyAxKSAqIHN5bWVzejsKLQkgIGNzZWN0cHAgKz0gc3ltLm5fbnVtYXV4ICsgMTsKLQkgIGRlYnVnX2luZGV4ICs9IHN5bS5uX251bWF1eCArIDE7Ci0JfQotCi0gICAgICBmcmVlIChkZWJ1Z19jb250ZW50cyk7Ci0gICAgICBkZWJ1Z19jb250ZW50cyA9IE5VTEw7Ci0KLSAgICAgIC8qIENsZWFyIHRoZSBzaXplIG9mIHN1YmRlYiwgc28gdGhhdCBpdCBpcyBub3QgaW5jbHVkZWQgZGlyZWN0bHkKLQkgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgICAgIHN1YmRlYi0+X3Jhd19zaXplID0gMDsKLQotICAgICAgaWYgKCEgaW5mby0+a2VlcF9tZW1vcnkpCi0JewotCSAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoc3ViKSkKLQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoaW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotICAgIHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZWJ1Z19zZWN0aW9uLT5fcmF3X3NpemUgPQotICAgICAgX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZGVidWdfc3RydGFiKTsKLQotICByZXR1cm4gdHJ1ZTsKLQotIGVycm9yX3JldHVybjoKLSAgaWYgKGxkaW5mby5zdHJpbmdzICE9IE5VTEwpCi0gICAgZnJlZSAobGRpbmZvLnN0cmluZ3MpOwotICBpZiAoZGVidWdfY29udGVudHMgIT0gTlVMTCkKLSAgICBmcmVlIChkZWJ1Z19jb250ZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQWRkIGEgc3ltYm9sIHRvIHRoZSAubG9hZGVyIHN5bWJvbHMsIGlmIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi14Y29mZl9idWlsZF9sZHN5bXMgKGgsIHApCi0gICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8gKmxkaW5mbyA9IChzdHJ1Y3QgeGNvZmZfbG9hZGVyX2luZm8gKikgcDsKLSAgc2l6ZV90IGxlbjsKLQotICAvKiBJZiB0aGlzIGlzIGEgZmluYWwgbGluaywgYW5kIHRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYXMgYSBjb21tb24KLSAgICAgc3ltYm9sIGluIGEgcmVndWxhciBvYmplY3QgZmlsZSwgYW5kIHRoZXJlIHdhcyBubyBkZWZpbml0aW9uIGluCi0gICAgIGFueSBkeW5hbWljIG9iamVjdCwgdGhlbiB0aGUgbGlua2VyIHdpbGwgaGF2ZSBhbGxvY2F0ZWQgc3BhY2UgZm9yCi0gICAgIHRoZSBzeW1ib2wgaW4gYSBjb21tb24gc2VjdGlvbiBidXQgdGhlIFhDT0ZGX0RFRl9SRUdVTEFSIGZsYWcKLSAgICAgd2lsbCBub3QgaGF2ZSBiZWVuIHNldC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfUkVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChoLT5yb290LnUuZGVmLnNlY3Rpb24pCi0JICB8fCAoaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSA9PSAwKSkKLSAgICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfUkVHVUxBUjsKLQotICAvKiBJZiBhbGwgZGVmaW5lZCBzeW1ib2xzIHNob3VsZCBiZSBleHBvcnRlZCwgbWFyayB0aGVtIG5vdy4gIFdlCi0gICAgIGRvbid0IHdhbnQgdG8gZXhwb3J0IHRoZSBhY3R1YWwgZnVuY3Rpb25zLCBqdXN0IHRoZSBmdW5jdGlvbgotICAgICBkZXNjcmlwdG9ycy4gICovCi0gIGlmIChsZGluZm8tPmV4cG9ydF9kZWZpbmVkcwotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpICE9IDAKLSAgICAgICYmIGgtPnJvb3Qucm9vdC5zdHJpbmdbMF0gIT0gJy4nKQotICAgIHsKLSAgICAgIGJvb2xlYW4gZXhwb3J0OwotCi0gICAgICAvKiBXZSBkb24ndCBleHBvcnQgYSBzeW1ib2wgd2hpY2ggaXMgYmVpbmcgZGVmaW5lZCBieSBhbiBvYmplY3QKLQkgaW5jbHVkZWQgZnJvbSBhbiBhcmNoaXZlIHdoaWNoIGNvbnRhaW5zIGEgc2hhcmVkIG9iamVjdC4gIFRoZQotCSByYXRpb25hbGUgaXMgdGhhdCBpZiBhbiBhcmNoaXZlIGNvbnRhaW5zIGJvdGggYW4gdW5zaGFyZWQgYW5kCi0JIGEgc2hhcmVkIG9iamVjdCwgdGhlbiB0aGVyZSBtdXN0IGJlIHNvbWUgcmVhc29uIHRoYXQgdGhlCi0JIHVuc2hhcmVkIG9iamVjdCBpcyB1bnNoYXJlZCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gc3RhcnQKLQkgcHJvdmlkaW5nIGEgc2hhcmVkIHZlcnNpb24gb2YgaXQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHNvbHZlcwotCSBhIGJ1ZyBpbnZvbHZpbmcgdGhlIF9zYXZlZk5OIHNldCBvZiBmdW5jdGlvbnMuICBnY2Mgd2lsbCBjYWxsCi0JIHRob3NlIGZ1bmN0aW9ucyB3aXRob3V0IHByb3ZpZGluZyBhIHNsb3QgdG8gcmVzdG9yZSB0aGUgVE9DLAotCSBzbyBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGVzZSBmdW5jdGlvbnMgYmUgbGlua2VkIGluIGRpcmVjdGx5Ci0JIGFuZCBub3QgZnJvbSBhIHNoYXJlZCBvYmplY3QsIHdoaWNoIG1lYW5zIHRoYXQgYSBzaGFyZWQKLQkgb2JqZWN0IHdoaWNoIGFsc28gaGFwcGVucyB0byBsaW5rIHRoZW0gaW4gbXVzdCBub3QgZXhwb3J0Ci0JIHRoZW0uICBUaGlzIGlzIGNvbmZ1c2luZywgYnV0IEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdGhpbmsgb2YKLQkgYSBkaWZmZXJlbnQgYXBwcm9hY2guICBOb3RlIHRoYXQgdGhlIHN5bWJvbHMgY2FuLCBvZiBjb3Vyc2UsCi0JIGJlIGV4cG9ydGVkIGV4cGxpY2l0bHkuICAqLwotICAgICAgZXhwb3J0ID0gdHJ1ZTsKLSAgICAgIGlmICgoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JICAmJiBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICYmIGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPm15X2FyY2hpdmUgIT0gTlVMTCkKLQl7Ci0JICBiZmQgKmFyYmZkLCAqbWVtYmVyOwotCi0JICBhcmJmZCA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPm15X2FyY2hpdmU7Ci0JICBtZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmJmZCwgKGJmZCAqKSBOVUxMKTsKLQkgIHdoaWxlIChtZW1iZXIgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgobWVtYmVyLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0JCXsKLQkJICBleHBvcnQgPSBmYWxzZTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGFyYmZkLCBtZW1iZXIpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoZXhwb3J0KQotCWgtPmZsYWdzIHw9IFhDT0ZGX0VYUE9SVDsKLSAgICB9Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBnYXJiYWdlIGNvbGxlY3Qgc3ltYm9scyB3aGljaCBhcmUgbm90IGRlZmluZWQgaW4KLSAgICAgWENPRkYgZmlsZXMuICBUaGlzIGlzIGEgY29udmVuaWVudCBwbGFjZSB0byBtYXJrIHRoZW0uICAqLwotICBpZiAoeGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+Z2MKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX01BUkspID09IDAKLSAgICAgICYmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXIgPT0gTlVMTAotCSAgfHwgKGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3duZXItPnh2ZWMKLQkgICAgICAhPSBsZGluZm8tPmluZm8tPmhhc2gtPmNyZWF0b3IpKSkKLSAgICBoLT5mbGFncyB8PSBYQ09GRl9NQVJLOwotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGNhbGxlZCBhbmQgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0LCBvciBpdAotICAgICBpcyBpbXBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHNldCB1cCBnbG9iYWwgbGlua2FnZSBjb2RlIGZvciBpdC4KLSAgICAgKFVubGVzcyB3ZSBkaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCB3ZSBkaWRuJ3QgbmVlZCB0aGlzCi0gICAgIHN5bWJvbC4pICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfQ0FMTEVEKSAhPSAwCi0gICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0gICAgICAmJiBoLT5yb290LnJvb3Quc3RyaW5nWzBdID09ICcuJwotICAgICAgJiYgaC0+ZGVzY3JpcHRvciAhPSBOVUxMCi0gICAgICAmJiAoKGgtPmRlc2NyaXB0b3ItPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDAKLQkgIHx8ICgoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDAKLQkgICAgICAmJiAoaC0+ZGVzY3JpcHRvci0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMCkpCi0gICAgICAmJiAoISB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYwotCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgIT0gMCkpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmhkczsKLQotICAgICAgc2VjID0geGNvZmZfaGFzaF90YWJsZSAobGRpbmZvLT5pbmZvKS0+bGlua2FnZV9zZWN0aW9uOwotICAgICAgaC0+cm9vdC50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uID0gc2VjOwotICAgICAgaC0+cm9vdC51LmRlZi52YWx1ZSA9IHNlYy0+X3Jhd19zaXplOwotICAgICAgaC0+c21jbGFzID0gWE1DX0dMOwotICAgICAgaC0+ZmxhZ3MgfD0gWENPRkZfREVGX1JFR1VMQVI7Ci0gICAgICBzZWMtPl9yYXdfc2l6ZSArPSBYQ09GRl9HTElOS19TSVpFOwotCi0gICAgICAvKiBUaGUgZ2xvYmFsIGxpbmthZ2UgY29kZSByZXF1aXJlcyBhIFRPQyBlbnRyeSBmb3IgdGhlCi0gICAgICAgICBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGhkcyA9IGgtPmRlc2NyaXB0b3I7Ci0gICAgICBCRkRfQVNTRVJUICgoaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkJICAgfHwgaGRzLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0JCSAgJiYgKGhkcy0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMCk7Ci0gICAgICBoZHMtPmZsYWdzIHw9IFhDT0ZGX01BUks7Ci0gICAgICBpZiAoaGRzLT50b2Nfc2VjdGlvbiA9PSBOVUxMKQotCXsKLQkgIGhkcy0+dG9jX3NlY3Rpb24gPSB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT50b2Nfc2VjdGlvbjsKLQkgIGhkcy0+dS50b2Nfb2Zmc2V0ID0gaGRzLT50b2Nfc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgaGRzLT50b2Nfc2VjdGlvbi0+X3Jhd19zaXplICs9IDQ7Ci0JICArK3hjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmxkcmVsX2NvdW50OwotCSAgKytoZHMtPnRvY19zZWN0aW9uLT5yZWxvY19jb3VudDsKLQkgIGhkcy0+aW5keCA9IC0yOwotCSAgaGRzLT5mbGFncyB8PSBYQ09GRl9TRVRfVE9DIHwgWENPRkZfTERSRUw7Ci0KLQkgIC8qIFdlIG5lZWQgdG8gY2FsbCB4Y29mZl9idWlsZF9sZHN5bXMgcmVjdXJzaXZlbHkgaGVyZSwKLSAgICAgICAgICAgICBiZWNhdXNlIHdlIG1heSBhbHJlYWR5IGhhdmUgcGFzc2VkIGhkcyBvbiB0aGUgdHJhdmVyc2FsLiAgKi8KLQkgIHhjb2ZmX2J1aWxkX2xkc3ltcyAoaGRzLCBwKTsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIGlzIGV4cG9ydGVkLCBidXQgbm90IGRlZmluZWQsIHdlIG5lZWQgdG8gdHJ5IHRvCi0gICAgIGRlZmluZSBpdC4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpICE9IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgPT0gMAotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpID09IDAKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwCi0gICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspKQotICAgIHsKLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwCi0JICAmJiAoaC0+ZGVzY3JpcHRvci0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPmRlc2NyaXB0b3ItPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCXsKLQkgIGFzZWN0aW9uICpzZWM7Ci0KLQkgIC8qIFRoaXMgaXMgYW4gdW5kZWZpbmVkIGZ1bmN0aW9uIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAgICAgYSBkZWZpbmVkIGVudHJ5IHBvaW50LiAgV2UgY2FuIGJ1aWxkIHVwIGEgZnVuY3Rpb24KLSAgICAgICAgICAgICBkZXNjcmlwdG9yIG91cnNlbHZlcy4gIEJlbGlldmUgaXQgb3Igbm90LCB0aGUgQUlYIGxpbmtlcgotICAgICAgICAgICAgIGFjdHVhbGx5IGRvZXMgdGhpcywgYW5kIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSB3ZSBuZWVkIHRvCi0gICAgICAgICAgICAgZG8gaXQgYXMgd2VsbC4gICovCi0JICBzZWMgPSB4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb247Ci0JICBoLT5yb290LnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICBoLT5yb290LnUuZGVmLnNlY3Rpb24gPSBzZWM7Ci0JICBoLT5yb290LnUuZGVmLnZhbHVlID0gc2VjLT5fcmF3X3NpemU7Ci0JICBoLT5zbWNsYXMgPSBYTUNfRFM7Ci0JICBoLT5mbGFncyB8PSBYQ09GRl9ERUZfUkVHVUxBUjsKLQkgIHNlYy0+X3Jhd19zaXplICs9IDEyOwotCi0JICAvKiBBIGZ1bmN0aW9uIGRlc2NyaXB0b3IgdXNlcyB0d28gcmVsb2NzOiBvbmUgZm9yIHRoZQotICAgICAgICAgICAgIGFzc29jaWF0ZWQgY29kZSwgYW5kIG9uZSBmb3IgdGhlIFRPQyBhZGRyZXNzLiAgKi8KLQkgIHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmxkcmVsX2NvdW50ICs9IDI7Ci0JICBzZWMtPnJlbG9jX2NvdW50ICs9IDI7Ci0KLQkgIC8qIFdlIGhhbmRsZSB3cml0aW5nIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGRlc2NyaXB0b3IgaW4KLSAgICAgICAgICAgICB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCJ3YXJuaW5nOiBhdHRlbXB0IHRvIGV4cG9ydCB1bmRlZmluZWQgc3ltYm9sIGAlcyciKSwKLQkgICAgIGgtPnJvb3Qucm9vdC5zdHJpbmcpOwotCSAgaC0+bGRzeW0gPSBOVUxMOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIHN0aWxsIGEgY29tbW9uIHN5bWJvbCwgYW5kIGl0IHdhc24ndCBnYXJiYWdlCi0gICAgIGNvbGxlY3RlZCwgd2UgbmVlZCB0byBhY3R1YWxseSBhbGxvY2F0ZSBzcGFjZSBmb3IgaXQgaW4gdGhlIC5ic3MKLSAgICAgc2VjdGlvbi4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLSAgICAgICYmICghIHhjb2ZmX2hhc2hfdGFibGUgKGxkaW5mby0+aW5mbyktPmdjCi0JICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9NQVJLKSAhPSAwKQotICAgICAgJiYgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+X3Jhd19zaXplID09IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAoYmZkX2lzX2NvbV9zZWN0aW9uIChoLT5yb290LnUuYy5wLT5zZWN0aW9uKSk7Ci0gICAgICBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5fcmF3X3NpemUgPSBoLT5yb290LnUuYy5zaXplOwotICAgIH0KLQotICAvKiBXZSBuZWVkIHRvIGFkZCBhIHN5bWJvbCB0byB0aGUgLmxvYWRlciBzZWN0aW9uIGlmIGl0IGlzIG1lbnRpb25lZAotICAgICBpbiBhIHJlbG9jIHdoaWNoIHdlIGFyZSBjb3B5aW5nIHRvIHRoZSAubG9hZGVyIHNlY3Rpb24gYW5kIGl0IHdhcwotICAgICBub3QgZGVmaW5lZCBvciBjb21tb24sIG9yIGlmIGl0IGlzIHRoZSBlbnRyeSBwb2ludCwgb3IgaWYgaXQgaXMKLSAgICAgYmVpbmcgZXhwb3J0ZWQuICAqLwotCi0gIGlmICgoKGgtPmZsYWdzICYgWENPRkZfTERSRUwpID09IDAKLSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0VOVFJZKSA9PSAwCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9FWFBPUlQpID09IDApCi0gICAgewotICAgICAgaC0+bGRzeW0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIC8qIFdlIGRvbid0IG5lZWQgdG8gYWRkIHRoaXMgc3ltYm9sIGlmIHdlIGRpZCBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kCi0gICAgIHdlIGRpZCBub3QgbWFyayB0aGlzIHN5bWJvbC4gICovCi0gIGlmICh4Y29mZl9oYXNoX3RhYmxlIChsZGluZm8tPmluZm8pLT5nYwotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLSAgICB7Ci0gICAgICBoLT5sZHN5bSA9IE5VTEw7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgbWF5IGhhdmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBzeW1ib2wgZHVlIHRvIHRoZSByZWN1cnNpdmUKLSAgICAgY2FsbCBhYm92ZS4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9CVUlMVF9MRFNZTSkgIT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBXZSBuZWVkIHRvIGFkZCB0aGlzIHN5bWJvbCB0byB0aGUgLmxvYWRlciBzeW1ib2xzLiAgKi8KLQotICBCRkRfQVNTRVJUIChoLT5sZHN5bSA9PSBOVUxMKTsKLSAgaC0+bGRzeW0gPSAoKHN0cnVjdCBpbnRlcm5hbF9sZHN5bSAqKQotCSAgICAgIGJmZF96YWxsb2MgKGxkaW5mby0+b3V0cHV0X2JmZCwKLQkJCSAgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0pKSk7Ci0gIGlmIChoLT5sZHN5bSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxkaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgIT0gMCkKLSAgICBoLT5sZHN5bS0+bF9pZmlsZSA9IGgtPmxkaW5keDsKLQotICAvKiBUaGUgZmlyc3QgMyBzeW1ib2wgdGFibGUgaW5kaWNlcyBhcmUgcmVzZXJ2ZWQgdG8gaW5kaWNhdGUgdGhlCi0gICAgIHNlY3Rpb25zLiAgKi8KLSAgaC0+bGRpbmR4ID0gbGRpbmZvLT5sZHN5bV9jb3VudCArIDM7Ci0KLSAgKytsZGluZm8tPmxkc3ltX2NvdW50OwotCi0gIGxlbiA9IHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZyk7Ci0gIGlmIChsZW4gPD0gU1lNTk1MRU4pCi0gICAgc3RybmNweSAoaC0+bGRzeW0tPl9sLl9sX25hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIFNZTU5NTEVOKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChsZGluZm8tPnN0cmluZ19zaXplICsgbGVuICsgMyA+IGxkaW5mby0+c3RyaW5nX2FsYykKLQl7Ci0JICBzaXplX3QgbmV3YWxjOwotCSAgYmZkX2J5dGUgKm5ld3N0cmluZ3M7Ci0KLQkgIG5ld2FsYyA9IGxkaW5mby0+c3RyaW5nX2FsYyAqIDI7Ci0JICBpZiAobmV3YWxjID09IDApCi0JICAgIG5ld2FsYyA9IDMyOwotCSAgd2hpbGUgKGxkaW5mby0+c3RyaW5nX3NpemUgKyBsZW4gKyAzID4gbmV3YWxjKQotCSAgICBuZXdhbGMgKj0gMjsKLQotCSAgbmV3c3RyaW5ncyA9ICgoYmZkX2J5dGUgKikKLQkJCWJmZF9yZWFsbG9jICgoUFRSKSBsZGluZm8tPnN0cmluZ3MsIG5ld2FsYykpOwotCSAgaWYgKG5ld3N0cmluZ3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxkaW5mby0+ZmFpbGVkID0gdHJ1ZTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGxkaW5mby0+c3RyaW5nX2FsYyA9IG5ld2FsYzsKLQkgIGxkaW5mby0+c3RyaW5ncyA9IG5ld3N0cmluZ3M7Ci0JfQotCi0gICAgICBiZmRfcHV0XzE2IChsZGluZm8tPm91dHB1dF9iZmQsIGxlbiArIDEsCi0JCSAgbGRpbmZvLT5zdHJpbmdzICsgbGRpbmZvLT5zdHJpbmdfc2l6ZSk7Ci0gICAgICBzdHJjcHkgKGxkaW5mby0+c3RyaW5ncyArIGxkaW5mby0+c3RyaW5nX3NpemUgKyAyLCBoLT5yb290LnJvb3Quc3RyaW5nKTsKLSAgICAgIGgtPmxkc3ltLT5fbC5fbF9sLl9sX3plcm9lcyA9IDA7Ci0gICAgICBoLT5sZHN5bS0+X2wuX2xfbC5fbF9vZmZzZXQgPSBsZGluZm8tPnN0cmluZ19zaXplICsgMjsKLSAgICAgIGxkaW5mby0+c3RyaW5nX3NpemUgKz0gbGVuICsgMzsKLSAgICB9Ci0KLSAgaC0+ZmxhZ3MgfD0gWENPRkZfQlVJTFRfTERTWU07Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0MCi0vKiBEbyB0aGUgZmluYWwgbGluayBzdGVwLiAgKi8KLQotYm9vbGVhbgotX2JmZF94Y29mZl9iZmRfZmluYWxfbGluayAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX3NpemVfdHlwZSBzeW1lc3o7Ci0gIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gZmluZm87Ci0gIGFzZWN0aW9uICpvOwotICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnA7Ci0gIHNpemVfdCBtYXhfY29udGVudHNfc2l6ZTsKLSAgc2l6ZV90IG1heF9zeW1fY291bnQ7Ci0gIHNpemVfdCBtYXhfbGluZW5vX2NvdW50OwotICBzaXplX3QgbWF4X3JlbG9jX2NvdW50OwotICBzaXplX3QgbWF4X291dHB1dF9yZWxvY19jb3VudDsKLSAgZmlsZV9wdHIgcmVsX2ZpbGVwb3M7Ci0gIHVuc2lnbmVkIGludCByZWxzejsKLSAgZmlsZV9wdHIgbGluZV9maWxlcG9zOwotICB1bnNpZ25lZCBpbnQgbGluZXN6OwotICBiZmQgKnN1YjsKLSAgYmZkX2J5dGUgKmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gIGNoYXIgc3RyYnVmW1NUUklOR19TSVpFX1NJWkVdOwotCi0gIGlmIChpbmZvLT5zaGFyZWQpCi0gICAgYWJmZC0+ZmxhZ3MgfD0gRFlOQU1JQzsKLQotICBzeW1lc3ogPSBiZmRfY29mZl9zeW1lc3ogKGFiZmQpOwotCi0gIGZpbmZvLmluZm8gPSBpbmZvOwotICBmaW5mby5vdXRwdXRfYmZkID0gYWJmZDsKLSAgZmluZm8uc3RydGFiID0gTlVMTDsKLSAgZmluZm8uc2VjdGlvbl9pbmZvID0gTlVMTDsKLSAgZmluZm8ubGFzdF9maWxlX2luZGV4ID0gLTE7Ci0gIGZpbmZvLnRvY19zeW1pbmR4ID0gLTE7Ci0gIGZpbmZvLmludGVybmFsX3N5bXMgPSBOVUxMOwotICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gIGZpbmZvLm91dHN5bXMgPSBOVUxMOwotICBmaW5mby5saW5lbm9zID0gTlVMTDsKLSAgZmluZm8uY29udGVudHMgPSBOVUxMOwotICBmaW5mby5leHRlcm5hbF9yZWxvY3MgPSBOVUxMOwotCi0gIGZpbmZvLmxkc3ltID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0gKikKLQkJICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24tPmNvbnRlbnRzCi0JCSAgKyBMREhEUlNaKSk7Ci0gIGZpbmZvLmxkcmVsID0gKChzdHJ1Y3QgZXh0ZXJuYWxfbGRyZWwgKikKLQkJICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb24tPmNvbnRlbnRzCi0JCSAgKyBMREhEUlNaCi0JCSAgKyB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGRoZHIubF9uc3ltcyAqIExEU1lNU1opKTsKLQotICB4Y29mZl9kYXRhIChhYmZkKS0+Y29mZi5saW5rX2luZm8gPSBpbmZvOwotCi0gIGZpbmZvLnN0cnRhYiA9IF9iZmRfc3RyaW5ndGFiX2luaXQgKCk7Ci0gIGlmIChmaW5mby5zdHJ0YWIgPT0gTlVMTCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBDb3VudCB0aGUgbGluZSBudW1iZXIgYW5kIHJlbG9jYXRpb24gZW50cmllcyByZXF1aXJlZCBmb3IgdGhlCi0gICAgIG91dHB1dCBmaWxlLiAgRGV0ZXJtaW5lIGEgZmV3IG1heGltdW0gc2l6ZXMuICAqLwotICBtYXhfY29udGVudHNfc2l6ZSA9IDA7Ci0gIG1heF9saW5lbm9fY291bnQgPSAwOwotICBtYXhfcmVsb2NfY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBvLT5yZWxvY19jb3VudCA9IDA7Ci0gICAgICBvLT5saW5lbm9fY291bnQgPSAwOwotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIC8qIE1hcmsgYWxsIHNlY3Rpb25zIHdoaWNoIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLQkJIGxpbmsuICBUaGlzIHdpbGwgbm9ybWFsbHkgYmUgZXZlcnkgc2VjdGlvbi4gIFdlIG5lZWQKLQkJIHRvIGRvIHRoaXMgc28gdGhhdCB3ZSBjYW4gaWRlbnRpZnkgYW55IHNlY3Rpb25zIHdoaWNoCi0JCSB0aGUgbGlua2VyIGhhcyBkZWNpZGVkIHRvIG5vdCBpbmNsdWRlLiAgKi8KLQkgICAgICBzZWMtPmxpbmtlcl9tYXJrID0gdHJ1ZTsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJby0+bGluZW5vX2NvdW50ICs9IHNlYy0+bGluZW5vX2NvdW50OwotCi0JICAgICAgby0+cmVsb2NfY291bnQgKz0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICAgIGlmIChzZWMtPl9yYXdfc2l6ZSA+IG1heF9jb250ZW50c19zaXplKQotCQltYXhfY29udGVudHNfc2l6ZSA9IHNlYy0+X3Jhd19zaXplOwotCSAgICAgIGlmIChzZWMtPmxpbmVub19jb3VudCA+IG1heF9saW5lbm9fY291bnQpCi0JCW1heF9saW5lbm9fY291bnQgPSBzZWMtPmxpbmVub19jb3VudDsKLQkgICAgICBpZiAoY29mZl9zZWN0aW9uX2RhdGEgKHNlYy0+b3duZXIsIHNlYykgIT0gTlVMTAotCQkgICYmIHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKSAhPSBOVUxMCi0JCSAgJiYgKHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+bGluZW5vX2NvdW50Ci0JCSAgICAgID4gbWF4X2xpbmVub19jb3VudCkpCi0JCW1heF9saW5lbm9fY291bnQgPQotCQkgIHhjb2ZmX3NlY3Rpb25fZGF0YSAoc2VjLT5vd25lciwgc2VjKS0+bGluZW5vX2NvdW50OwotCSAgICAgIGlmIChzZWMtPnJlbG9jX2NvdW50ID4gbWF4X3JlbG9jX2NvdW50KQotCQltYXhfcmVsb2NfY291bnQgPSBzZWMtPnJlbG9jX2NvdW50OwotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgICsrby0+cmVsb2NfY291bnQ7Ci0JfQotICAgIH0KLQotICAvKiBDb21wdXRlIHRoZSBmaWxlIHBvc2l0aW9ucyBmb3IgYWxsIHRoZSBzZWN0aW9ucy4gICovCi0gIGlmIChhYmZkLT5vdXRwdXRfaGFzX2JlZ3VuKQotICAgIHsKLSAgICAgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZmlsZV9hbGlnbiAhPSAwKQotCWFib3J0ICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF92bWEgZmlsZV9hbGlnbjsKLQotICAgICAgZmlsZV9hbGlnbiA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5maWxlX2FsaWduOwotICAgICAgaWYgKGZpbGVfYWxpZ24gIT0gMCkKLQl7Ci0JICBib29sZWFuIHNhd19jb250ZW50czsKLQkgIGludCBpbmR4OwotCSAgYXNlY3Rpb24gKipvcDsKLQkgIGZpbGVfcHRyIHNvZmFyOwotCi0JICAvKiBJbnNlcnQgLnBhZCBzZWN0aW9ucyBiZWZvcmUgZXZlcnkgc2VjdGlvbiB3aGljaCBoYXMKLSAgICAgICAgICAgICBjb250ZW50cyBhbmQgaXMgbG9hZGVkLCBpZiBpdCBpcyBwcmVjZWRlZCBieSBzb21lIG90aGVyCi0gICAgICAgICAgICAgc2VjdGlvbiB3aGljaCBoYXMgY29udGVudHMgYW5kIGlzIGxvYWRlZC4gICovCi0JICBzYXdfY29udGVudHMgPSB0cnVlOwotCSAgZm9yIChvcCA9ICZhYmZkLT5zZWN0aW9uczsgKm9wICE9IE5VTEw7IG9wID0gJigqb3ApLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoKCpvcCktPm5hbWUsICIucGFkIikgPT0gMCkKLQkJc2F3X2NvbnRlbnRzID0gZmFsc2U7Ci0JICAgICAgZWxzZSBpZiAoKCgqb3ApLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKLQkJICAgICAgICYmICgoKm9wKS0+ZmxhZ3MgJiBTRUNfTE9BRCkgIT0gMCkKLQkJewotCQkgIGlmICghIHNhd19jb250ZW50cykKLQkJICAgIHNhd19jb250ZW50cyA9IHRydWU7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqbiwgKmhvbGQ7Ci0KLQkJICAgICAgaG9sZCA9ICpvcDsKLQkJICAgICAgKm9wID0gTlVMTDsKLQkJICAgICAgbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCAiLnBhZCIpOwotCQkgICAgICBCRkRfQVNTRVJUICgqb3AgPT0gbik7Ci0JCSAgICAgIG4tPm5leHQgPSBob2xkOwotCQkgICAgICBuLT5mbGFncyA9IFNFQ19IQVNfQ09OVEVOVFM7Ci0JCSAgICAgIG4tPmFsaWdubWVudF9wb3dlciA9IDA7Ci0JCSAgICAgIHNhd19jb250ZW50cyA9IGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgLyogUmVzZXQgdGhlIHNlY3Rpb24gaW5kaWNlcyBhZnRlciBpbnNlcnRpbmcgdGhlIG5ldwotICAgICAgICAgICAgIHNlY3Rpb25zLiAgKi8KLQkgIGluZHggPSAwOwotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIHsKLQkgICAgICArK2luZHg7Ci0JICAgICAgby0+dGFyZ2V0X2luZGV4ID0gaW5keDsKLQkgICAgfQotCSAgQkZEX0FTU0VSVCAoKHVuc2lnbmVkIGludCkgaW5keCA9PSBhYmZkLT5zZWN0aW9uX2NvdW50KTsKLQotCSAgLyogV29yayBvdXQgYXBwcm9wcmlhdGUgc2l6ZXMgZm9yIHRoZSAucGFkIHNlY3Rpb25zIHRvIGZvcmNlCi0gICAgICAgICAgICAgZWFjaCBzZWN0aW9uIHRvIGxhbmQgb24gYSBwYWdlIGJvdW5kYXJ5LiAgVGhpcyBiaXQgb2YKLSAgICAgICAgICAgICBjb2RlIGtub3dzIHdoYXQgY29tcHV0ZV9zZWN0aW9uX2ZpbGVfcG9zaXRpb25zIGlzIGdvaW5nCi0gICAgICAgICAgICAgdG8gZG8uICAqLwotCSAgc29mYXIgPSBiZmRfY29mZl9maWxoc3ogKGFiZmQpOwotCSAgc29mYXIgKz0gYmZkX2NvZmZfYW91dHN6IChhYmZkKTsKLQkgIHNvZmFyICs9IGFiZmQtPnNlY3Rpb25fY291bnQgKiBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotCSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0JICAgIGlmIChvLT5yZWxvY19jb3VudCA+PSAweGZmZmYgfHwgby0+bGluZW5vX2NvdW50ID49IDB4ZmZmZikKLQkgICAgICBzb2ZhciArPSBiZmRfY29mZl9zY25oc3ogKGFiZmQpOwotCi0JICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKG8tPm5hbWUsICIucGFkIikgPT0gMCkKLQkJewotCQkgIGJmZF92bWEgcGFnZW9mZjsKLQotCQkgIEJGRF9BU1NFUlQgKG8tPl9yYXdfc2l6ZSA9PSAwKTsKLQkJICBwYWdlb2ZmID0gc29mYXIgJiAoZmlsZV9hbGlnbiAtIDEpOwotCQkgIGlmIChwYWdlb2ZmICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIG8tPl9yYXdfc2l6ZSA9IGZpbGVfYWxpZ24gLSBwYWdlb2ZmOwotCQkgICAgICBzb2ZhciArPSBmaWxlX2FsaWduIC0gcGFnZW9mZjsKLQkJICAgICAgby0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCQkgICAgc29mYXIgKz0gQkZEX0FMSUdOIChvLT5fcmF3X3NpemUsCi0JCQkJCTEgPDwgby0+YWxpZ25tZW50X3Bvd2VyKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBiZmRfY29mZl9jb21wdXRlX3NlY3Rpb25fZmlsZV9wb3NpdGlvbnMgKGFiZmQpKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgIH0KLQotICAvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHBvaW50ZXJzIHdlIG5lZWQgdG8ga2VlcCBmb3IgdGhlIHJlbG9jcy4gICovCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgIC8qIFdlIHVzZSBzZWN0aW9uX2NvdW50ICsgMSwgcmF0aGVyIHRoYW4gc2VjdGlvbl9jb3VudCwgYmVjYXVzZQotICAgICAgIHRoZSB0YXJnZXRfaW5kZXggZmllbGRzIGFyZSAxIGJhc2VkLiAgKi8KLSAgICBmaW5mby5zZWN0aW9uX2luZm8gPQotICAgICAgKChzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8gKikKLSAgICAgICBiZmRfbWFsbG9jICgoYWJmZC0+c2VjdGlvbl9jb3VudCArIDEpCi0JCSAgICogc2l6ZW9mIChzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8pKSk7Ci0gICAgaWYgKGZpbmZvLnNlY3Rpb25faW5mbyA9PSBOVUxMKQotICAgICAgZ290byBlcnJvcl9yZXR1cm47Ci0gICAgZm9yIChpID0gMDsgaSA8PSBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0gICAgICB7Ci0JZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyA9IE5VTEw7Ci0JZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgPSBOVUxMOwotCWZpbmZvLnNlY3Rpb25faW5mb1tpXS50b2NfcmVsX2hhc2hlcyA9IE5VTEw7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBTZXQgdGhlIGZpbGUgcG9zaXRpb25zIGZvciB0aGUgcmVsb2NzLiAgKi8KLSAgcmVsX2ZpbGVwb3MgPSBvYmpfcmVsb2NiYXNlIChhYmZkKTsKLSAgcmVsc3ogPSBiZmRfY29mZl9yZWxzeiAoYWJmZCk7Ci0gIG1heF9vdXRwdXRfcmVsb2NfY291bnQgPSAwOwotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoby0+cmVsb2NfY291bnQgPT0gMCkKLQlvLT5yZWxfZmlsZXBvcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBzdHJpcHBlZCBmaWxlIGhhcyBubyByZWxvY3MuICBIb3dldmVyLCB3ZSBzdGlsbAotICAgICAgICAgICAgIGFsbG9jYXRlIHRoZSBidWZmZXJzLCBzbyB0aGF0IGxhdGVyIGNvZGUgZG9lc24ndCBoYXZlIHRvCi0gICAgICAgICAgICAgd29ycnkgYWJvdXQgd2hldGhlciB3ZSBhcmUgc3RyaXBwaW5nIG9yIG5vdC4gICovCi0JICBpZiAoaW5mby0+c3RyaXAgPT0gc3RyaXBfYWxsKQotCSAgICBvLT5yZWxfZmlsZXBvcyA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0JICAgICAgby0+cmVsX2ZpbGVwb3MgPSByZWxfZmlsZXBvczsKLQkgICAgICByZWxfZmlsZXBvcyArPSBvLT5yZWxvY19jb3VudCAqIHJlbHN6OwotCSAgICB9Ci0KLQkgIC8qIFdlIGRvbid0IGtub3cgdGhlIGluZGljZXMgb2YgZ2xvYmFsIHN5bWJvbHMgdW50aWwgd2UgaGF2ZQotICAgICAgICAgICAgIHdyaXR0ZW4gb3V0IGFsbCB0aGUgbG9jYWwgc3ltYm9scy4gIEZvciBlYWNoIHNlY3Rpb24gaW4KLSAgICAgICAgICAgICB0aGUgb3V0cHV0IGZpbGUsIHdlIGtlZXAgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGFzaAotICAgICAgICAgICAgIHRhYmxlIGVudHJpZXMuICBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhCi0gICAgICAgICAgICAgcmVsb2MuICBXaGVuIHdlIGZpbmQgYSByZWxvYyBhZ2FpbnN0IGEgZ2xvYmFsIHN5bWJvbCwgd2UKLSAgICAgICAgICAgICBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGNhbgotICAgICAgICAgICAgIGZpeCB1cCB0aGUgc3ltYm9sIGluZGV4IGFmdGVyIHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZQotICAgICAgICAgICAgIGxvY2FsIHN5bWJvbHMuCi0KLQkgICAgIEJlY2F1c2Ugb2YgdGhpcyBwcm9ibGVtLCB3ZSBhbHNvIGtlZXAgdGhlIHJlbG9jcyBpbgotCSAgICAgbWVtb3J5IHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpbmsuICBUaGlzIHdhc3RlcyBtZW1vcnkuCi0JICAgICBXZSBjb3VsZCBiYWNrcGF0Y2ggdGhlIGZpbGUgbGF0ZXIsIEkgc3VwcG9zZSwgYWx0aG91Z2ggaXQKLQkgICAgIHdvdWxkIGJlIHNsb3cuICAqLwotCSAgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzID0KLQkgICAgKChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKikKLQkgICAgIGJmZF9tYWxsb2MgKG8tPnJlbG9jX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKSk7Ci0JICBmaW5mby5zZWN0aW9uX2luZm9bby0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzID0KLQkgICAgKChzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqKQotCSAgICAgYmZkX21hbGxvYyAoby0+cmVsb2NfY291bnQKLQkJICAgICAqIHNpemVvZiAoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKSkpOwotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jcyA9PSBOVUxMCi0JICAgICAgfHwgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlcyA9PSBOVUxMKQotCSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotCSAgaWYgKG8tPnJlbG9jX2NvdW50ID4gbWF4X291dHB1dF9yZWxvY19jb3VudCkKLQkgICAgbWF4X291dHB1dF9yZWxvY19jb3VudCA9IG8tPnJlbG9jX2NvdW50OwotCX0KLSAgICB9Ci0KLSAgLyogV2Ugbm93IGtub3cgdGhlIHNpemUgb2YgdGhlIHJlbG9jcywgc28gd2UgY2FuIGRldGVybWluZSB0aGUgZmlsZQotICAgICBwb3NpdGlvbnMgb2YgdGhlIGxpbmUgbnVtYmVycy4gICovCi0gIGxpbmVfZmlsZXBvcyA9IHJlbF9maWxlcG9zOwotICBmaW5mby5saW5lX2ZpbGVwb3MgPSBsaW5lX2ZpbGVwb3M7Ci0gIGxpbmVzeiA9IGJmZF9jb2ZmX2xpbmVzeiAoYWJmZCk7Ci0gIGZvciAobyA9IGFiZmQtPnNlY3Rpb25zOyBvICE9IE5VTEw7IG8gPSBvLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChvLT5saW5lbm9fY291bnQgPT0gMCkKLQlvLT5saW5lX2ZpbGVwb3MgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIG8tPmxpbmVfZmlsZXBvcyA9IGxpbmVfZmlsZXBvczsKLQkgIGxpbmVfZmlsZXBvcyArPSBvLT5saW5lbm9fY291bnQgKiBsaW5lc3o7Ci0JfQotCi0gICAgICAvKiBSZXNldCB0aGUgcmVsb2MgYW5kIGxpbmVubyBjb3VudHMsIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIHRvCi0JIGNvdW50IHRoZSBudW1iZXIgb2YgZW50cmllcyB3ZSBoYXZlIG91dHB1dCBzbyBmYXIuICAqLwotICAgICAgby0+cmVsb2NfY291bnQgPSAwOwotICAgICAgby0+bGluZW5vX2NvdW50ID0gMDsKLSAgICB9Ci0KLSAgb2JqX3N5bV9maWxlcG9zIChhYmZkKSA9IGxpbmVfZmlsZXBvczsKLQotICAvKiBGaWd1cmUgb3V0IHRoZSBsYXJnZXN0IG51bWJlciBvZiBzeW1ib2xzIGluIGFuIGlucHV0IEJGRC4gIFRha2UKLSAgICAgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFyIHRoZSBvdXRwdXRfaGFzX2JlZ3VuIGZpZWxkcyBvZiBhbGwgdGhlCi0gICAgIGlucHV0IEJGRCdzLiAgV2Ugd2FudCBhdCBsZWFzdCA2IHN5bWJvbHMsIHNpbmNlIHRoYXQgaXMgdGhlCi0gICAgIG51bWJlciB3aGljaCB4Y29mZl93cml0ZV9nbG9iYWxfc3ltYm9sIG1heSBuZWVkLiAgKi8KLSAgbWF4X3N5bV9jb3VudCA9IDY7Ci0gIGZvciAoc3ViID0gaW5mby0+aW5wdXRfYmZkczsgc3ViICE9IE5VTEw7IHN1YiA9IHN1Yi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHNpemVfdCBzejsKLQotICAgICAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gZmFsc2U7Ci0gICAgICBzeiA9IG9ial9yYXdfc3ltZW50X2NvdW50IChzdWIpOwotICAgICAgaWYgKHN6ID4gbWF4X3N5bV9jb3VudCkKLQltYXhfc3ltX2NvdW50ID0gc3o7Ci0gICAgfQotCi0gIC8qIEFsbG9jYXRlIHNvbWUgYnVmZmVycyB1c2VkIHdoaWxlIGxpbmtpbmcuICAqLwotICBmaW5mby5pbnRlcm5hbF9zeW1zID0gKChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICopCi0JCQkgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudAotCQkJCSAgICAgKiBzaXplb2YgKHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQpKSk7Ci0gIGZpbmZvLnN5bV9pbmRpY2VzID0gKGxvbmcgKikgYmZkX21hbGxvYyAobWF4X3N5bV9jb3VudCAqIHNpemVvZiAobG9uZykpOwotICBmaW5mby5vdXRzeW1zID0gKChiZmRfYnl0ZSAqKQotCQkgICBiZmRfbWFsbG9jICgoc2l6ZV90KSAoKG1heF9zeW1fY291bnQgKyAxKSAqIHN5bWVzeikpKTsKLSAgZmluZm8ubGluZW5vcyA9IChiZmRfYnl0ZSAqKSBiZmRfbWFsbG9jIChtYXhfbGluZW5vX2NvdW50Ci0JCQkJCSAgICogYmZkX2NvZmZfbGluZXN6IChhYmZkKSk7Ci0gIGZpbmZvLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9jb250ZW50c19zaXplKTsKLSAgZmluZm8uZXh0ZXJuYWxfcmVsb2NzID0gKGJmZF9ieXRlICopIGJmZF9tYWxsb2MgKG1heF9yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgaWYgKChmaW5mby5pbnRlcm5hbF9zeW1zID09IE5VTEwgJiYgbWF4X3N5bV9jb3VudCA+IDApCi0gICAgICB8fCAoZmluZm8uc3ltX2luZGljZXMgPT0gTlVMTCAmJiBtYXhfc3ltX2NvdW50ID4gMCkKLSAgICAgIHx8IGZpbmZvLm91dHN5bXMgPT0gTlVMTAotICAgICAgfHwgKGZpbmZvLmxpbmVub3MgPT0gTlVMTCAmJiBtYXhfbGluZW5vX2NvdW50ID4gMCkKLSAgICAgIHx8IChmaW5mby5jb250ZW50cyA9PSBOVUxMICYmIG1heF9jb250ZW50c19zaXplID4gMCkKLSAgICAgIHx8IChmaW5mby5leHRlcm5hbF9yZWxvY3MgPT0gTlVMTCAmJiBtYXhfcmVsb2NfY291bnQgPiAwKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCkgPSAwOwotICB4Y29mZl9kYXRhIChhYmZkKS0+dG9jID0gKGJmZF92bWEpIC0xOwotCi0gIC8qIFdlIG5vdyBrbm93IHRoZSBwb3NpdGlvbiBvZiBldmVyeXRoaW5nIGluIHRoZSBmaWxlLCBleGNlcHQgdGhhdAotICAgICB3ZSBkb24ndCBrbm93IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUgYW5kIHRoZXJlZm9yZSB3ZSBkb24ndAotICAgICBrbm93IHdoZXJlIHRoZSBzdHJpbmcgdGFibGUgc3RhcnRzLiAgV2UganVzdCBidWlsZCB0aGUgc3RyaW5nCi0gICAgIHRhYmxlIGluIG1lbW9yeSBhcyB3ZSBnbyBhbG9uZy4gIFdlIHByb2Nlc3MgYWxsIHRoZSByZWxvY2F0aW9ucwotICAgICBmb3IgYSBzaW5nbGUgaW5wdXQgZmlsZSBhdCBvbmNlLiAgKi8KLSAgZm9yIChvID0gYWJmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgZm9yIChwID0gby0+bGlua19vcmRlcl9oZWFkOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyCi0JICAgICAgJiYgcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lci0+eHZlYyA9PSBhYmZkLT54dmVjKQotCSAgICB7Ci0JICAgICAgc3ViID0gcC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lcjsKLQkgICAgICBpZiAoISBzdWItPm91dHB1dF9oYXNfYmVndW4pCi0JCXsKLQkJICBpZiAoISB4Y29mZl9saW5rX2lucHV0X2JmZCAoJmZpbmZvLCBzdWIpKQotCQkgICAgZ290byBlcnJvcl9yZXR1cm47Ci0JCSAgc3ViLT5vdXRwdXRfaGFzX2JlZ3VuID0gdHJ1ZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwLT50eXBlID09IGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIKLQkJICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpCi0JICAgIHsKLQkgICAgICBpZiAoISB4Y29mZl9yZWxvY19saW5rX29yZGVyIChhYmZkLCAmZmluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgX2JmZF9kZWZhdWx0X2xpbmtfb3JkZXIgKGFiZmQsIGluZm8sIG8sIHApKQotCQlnb3RvIGVycm9yX3JldHVybjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgYnVmZmVycyB1c2VkIGJ5IHhjb2ZmX2xpbmtfaW5wdXRfYmZkLiAgKi8KLQotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICAgICAgZmluZm8uaW50ZXJuYWxfc3ltcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gICAgICBmaW5mby5zeW1faW5kaWNlcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8ubGluZW5vcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLmxpbmVub3MpOwotICAgICAgZmluZm8ubGluZW5vcyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChmaW5mby5jb250ZW50cyk7Ci0gICAgICBmaW5mby5jb250ZW50cyA9IE5VTEw7Ci0gICAgfQotICBpZiAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoZmluZm8uZXh0ZXJuYWxfcmVsb2NzKTsKLSAgICAgIGZpbmZvLmV4dGVybmFsX3JlbG9jcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBDX0ZJTEUgc3ltYm9sIGlzIHN1cHBvc2VkIHRvIGJlIC0xLiAgV3JpdGUKLSAgICAgaXQgb3V0IGFnYWluLiAgKi8KLSAgaWYgKGZpbmZvLmxhc3RfZmlsZV9pbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBmaW5mby5sYXN0X2ZpbGUubl92YWx1ZSA9IC0xOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChhYmZkLCAoUFRSKSAmZmluZm8ubGFzdF9maWxlLAotCQkJICAgICAoUFRSKSBmaW5mby5vdXRzeW1zKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKGFiZmQpCi0JCSAgICAgKyBmaW5mby5sYXN0X2ZpbGVfaW5kZXggKiBzeW1lc3opLAotCQkgICAgU0VFS19TRVQpICE9IDAKLQkgIHx8IGJmZF93cml0ZSAoZmluZm8ub3V0c3ltcywgc3ltZXN6LCAxLCBhYmZkKSAhPSBzeW1lc3opCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCBhbGwgdGhlIGdsb2JhbCBzeW1ib2xzIHdoaWNoIGRvIG5vdCBjb21lIGZyb20gWENPRkYKLSAgICAgaW5wdXQgZmlsZXMuICAqLwotICB4Y29mZl9saW5rX2hhc2hfdHJhdmVyc2UgKHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLAotCQkJICAgIHhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wsCi0JCQkgICAgKFBUUikgJmZpbmZvKTsKLQotICBpZiAoZmluZm8ub3V0c3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKGZpbmZvLm91dHN5bXMpOwotICAgICAgZmluZm8ub3V0c3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgd3JpdHRlbiBvdXQgYWxsIHRoZSBnbG9iYWwgc3ltYm9scywgd2Uga25vdyB0aGUKLSAgICAgc3ltYm9sIGluZGljZXMgdG8gdXNlIGZvciByZWxvY3MgYWdhaW5zdCB0aGVtLCBhbmQgd2UgY2FuIGZpbmFsbHkKLSAgICAgd3JpdGUgb3V0IHRoZSByZWxvY3MuICAqLwotICBleHRlcm5hbF9yZWxvY3MgPSAoYmZkX2J5dGUgKikgYmZkX21hbGxvYyAobWF4X291dHB1dF9yZWxvY19jb3VudCAqIHJlbHN6KTsKLSAgaWYgKGV4dGVybmFsX3JlbG9jcyA9PSBOVUxMICYmIG1heF9vdXRwdXRfcmVsb2NfY291bnQgIT0gMCkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBmb3IgKG8gPSBhYmZkLT5zZWN0aW9uczsgbyAhPSBOVUxMOyBvID0gby0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoICp0b2NfcmVsX2hhc2g7Ci0gICAgICBiZmRfYnl0ZSAqZXJlbDsKLQotICAgICAgLyogQSBzdHJpcHBlZCBmaWxlIGhhcyBubyByZWxvY3MuICAqLwotICAgICAgaWYgKGluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQl7Ci0JICBvLT5yZWxvY19jb3VudCA9IDA7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChvLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpcmVsID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzOwotICAgICAgaXJlbGVuZCA9IGlyZWwgKyBvLT5yZWxvY19jb3VudDsKLSAgICAgIHJlbF9oYXNoID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsX2hhc2hlczsKLSAgICAgIGZvciAoOyBpcmVsIDwgaXJlbGVuZDsgaXJlbCsrLCByZWxfaGFzaCsrLCBlcmVsICs9IHJlbHN6KQotCXsKLQkgIGlmICgqcmVsX2hhc2ggIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgoKnJlbF9oYXNoKS0+aW5keCA8IDApCi0JCXsKLQkJICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuYXR0YWNoZWRfcmVsb2MpCi0JCQkgKGluZm8sICgqcmVsX2hhc2gpLT5yb290LnJvb3Quc3RyaW5nLAotCQkJICAoYmZkICopIE5VTEwsIG8sIGlyZWwtPnJfdmFkZHIpKSkKLQkJICAgIGdvdG8gZXJyb3JfcmV0dXJuOwotCQkgICgqcmVsX2hhc2gpLT5pbmR4ID0gMDsKLQkJfQotCSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gKCpyZWxfaGFzaCktPmluZHg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZvciAodG9jX3JlbF9oYXNoID0gZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0udG9jX3JlbF9oYXNoZXM7Ci0JICAgdG9jX3JlbF9oYXNoICE9IE5VTEw7Ci0JICAgdG9jX3JlbF9oYXNoID0gdG9jX3JlbF9oYXNoLT5uZXh0KQotCXsKLQkgIGlmICh0b2NfcmVsX2hhc2gtPmgtPnUudG9jX2luZHggPCAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgKCgqaW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkgICAgIChpbmZvLCB0b2NfcmVsX2hhc2gtPmgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCSAgICAgIChiZmQgKikgTlVMTCwgbywgdG9jX3JlbF9oYXNoLT5yZWwtPnJfdmFkZHIpKSkKLQkJZ290byBlcnJvcl9yZXR1cm47Ci0JICAgICAgdG9jX3JlbF9oYXNoLT5oLT51LnRvY19pbmR4ID0gMDsKLQkgICAgfQotCSAgdG9jX3JlbF9oYXNoLT5yZWwtPnJfc3ltbmR4ID0gdG9jX3JlbF9oYXNoLT5oLT51LnRvY19pbmR4OwotCX0KLQotICAgICAgLyogWENPRkYgcmVxdWlyZXMgdGhhdCB0aGUgcmVsb2NzIGJlIHNvcnRlZCBieSBhZGRyZXNzLiAgV2UgdGVuZAotICAgICAgICAgdG8gcHJvZHVjZSB0aGVtIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGVpciBjb250YWluaW5nIGNzZWN0cwotICAgICAgICAgYXBwZWFyIGluIHRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSBieQotICAgICAgICAgYWRkcmVzcy4gIFNvIHdlIHNvcnQgdGhlbSBoZXJlLiAgVGhlcmUgbWF5IGJlIGEgYmV0dGVyIHdheSB0bwotICAgICAgICAgZG8gdGhpcy4gICovCi0gICAgICBxc29ydCAoKFBUUikgZmluZm8uc2VjdGlvbl9pbmZvW28tPnRhcmdldF9pbmRleF0ucmVsb2NzLAotCSAgICAgby0+cmVsb2NfY291bnQsIHNpemVvZiAoc3RydWN0IGludGVybmFsX3JlbG9jKSwKLQkgICAgIHhjb2ZmX3NvcnRfcmVsb2NzKTsKLQotICAgICAgaXJlbCA9IGZpbmZvLnNlY3Rpb25faW5mb1tvLT50YXJnZXRfaW5kZXhdLnJlbG9jczsKLSAgICAgIGlyZWxlbmQgPSBpcmVsICsgby0+cmVsb2NfY291bnQ7Ci0gICAgICBlcmVsID0gZXh0ZXJuYWxfcmVsb2NzOwotICAgICAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyssIHJlbF9oYXNoKyssIGVyZWwgKz0gcmVsc3opCi0JYmZkX2NvZmZfc3dhcF9yZWxvY19vdXQgKGFiZmQsIChQVFIpIGlyZWwsIChQVFIpIGVyZWwpOwotCi0gICAgICBpZiAoYmZkX3NlZWsgKGFiZmQsIG8tPnJlbF9maWxlcG9zLCBTRUVLX1NFVCkgIT0gMAotCSAgfHwgYmZkX3dyaXRlICgoUFRSKSBleHRlcm5hbF9yZWxvY3MsIHJlbHN6LCBvLT5yZWxvY19jb3VudCwKLQkJCWFiZmQpICE9IHJlbHN6ICogby0+cmVsb2NfY291bnQpCi0JZ290byBlcnJvcl9yZXR1cm47Ci0gICAgfQotCi0gIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICAgICAgZXh0ZXJuYWxfcmVsb2NzID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogRnJlZSB1cCB0aGUgc2VjdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChmaW5mby5zZWN0aW9uX2luZm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGFiZmQtPnNlY3Rpb25fY291bnQ7IGkrKykKLQl7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsb2NzKTsKLQkgIGlmIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyAhPSBOVUxMKQotCSAgICBmcmVlIChmaW5mby5zZWN0aW9uX2luZm9baV0ucmVsX2hhc2hlcyk7Ci0JfQotICAgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvKTsKLSAgICAgIGZpbmZvLnNlY3Rpb25faW5mbyA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFdyaXRlIG91dCB0aGUgbG9hZGVyIHNlY3Rpb24gY29udGVudHMuICAqLwotICBCRkRfQVNTRVJUICgoYmZkX2J5dGUgKikgZmluZm8ubGRyZWwKLQkgICAgICA9PSAoeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxvYWRlcl9zZWN0aW9uLT5jb250ZW50cwotCQkgICsgeGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmxkaGRyLmxfaW1wb2ZmKSk7Ci0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bG9hZGVyX3NlY3Rpb247Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sCi0JCQkJICBvLT5jb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkgIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBtYWdpYyBzZWN0aW9ucy4gICovCi0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+bGlua2FnZV9zZWN0aW9uOwotICBpZiAoby0+X3Jhd19zaXplID4gMAotICAgICAgJiYgISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIG8tPm91dHB1dF9zZWN0aW9uLCBvLT5jb250ZW50cywKLQkJCQkgICAgIG8tPm91dHB1dF9vZmZzZXQsIG8tPl9yYXdfc2l6ZSkpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIG8gPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+dG9jX3NlY3Rpb247Ci0gIGlmIChvLT5fcmF3X3NpemUgPiAwCi0gICAgICAmJiAhIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sIG8tPmNvbnRlbnRzLAotCQkJCSAgICAgby0+b3V0cHV0X29mZnNldCwgby0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLSAgbyA9IHhjb2ZmX2hhc2hfdGFibGUgKGluZm8pLT5kZXNjcmlwdG9yX3NlY3Rpb247Ci0gIGlmIChvLT5fcmF3X3NpemUgPiAwCi0gICAgICAmJiAhIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgby0+b3V0cHV0X3NlY3Rpb24sIG8tPmNvbnRlbnRzLAotCQkJCSAgICAgby0+b3V0cHV0X29mZnNldCwgby0+X3Jhd19zaXplKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICAvKiBXcml0ZSBvdXQgdGhlIHN0cmluZyB0YWJsZS4gICovCi0gIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJKG9ial9zeW1fZmlsZXBvcyAoYWJmZCkKLQkJICsgb2JqX3Jhd19zeW1lbnRfY291bnQgKGFiZmQpICogc3ltZXN6KSwKLQkJU0VFS19TRVQpICE9IDApCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGJmZF9oX3B1dF8zMiAoYWJmZCwKLQkJX2JmZF9zdHJpbmd0YWJfc2l6ZSAoZmluZm8uc3RydGFiKSArIFNUUklOR19TSVpFX1NJWkUsCi0JCShiZmRfYnl0ZSAqKSBzdHJidWYpOwotICBpZiAoYmZkX3dyaXRlIChzdHJidWYsIDEsIFNUUklOR19TSVpFX1NJWkUsIGFiZmQpICE9IFNUUklOR19TSVpFX1NJWkUpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0gIGlmICghIF9iZmRfc3RyaW5ndGFiX2VtaXQgKGFiZmQsIGZpbmZvLnN0cnRhYikpCi0gICAgZ290byBlcnJvcl9yZXR1cm47Ci0KLSAgX2JmZF9zdHJpbmd0YWJfZnJlZSAoZmluZm8uc3RydGFiKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGRlYnVnZ2luZyBzdHJpbmcgdGFibGUuICAqLwotICBvID0geGNvZmZfaGFzaF90YWJsZSAoaW5mbyktPmRlYnVnX3NlY3Rpb247Ci0gIGlmIChvICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9zdHJ0YWJfaGFzaCAqZGVidWdfc3RydGFiOwotCi0gICAgICBkZWJ1Z19zdHJ0YWIgPSB4Y29mZl9oYXNoX3RhYmxlIChpbmZvKS0+ZGVidWdfc3RydGFiOwotICAgICAgQkZEX0FTU0VSVCAoby0+b3V0cHV0X3NlY3Rpb24tPl9yYXdfc2l6ZSAtIG8tPm91dHB1dF9vZmZzZXQKLQkJICA+PSBfYmZkX3N0cmluZ3RhYl9zaXplIChkZWJ1Z19zdHJ0YWIpKTsKLSAgICAgIGlmIChiZmRfc2VlayAoYWJmZCwKLQkJICAgIG8tPm91dHB1dF9zZWN0aW9uLT5maWxlcG9zICsgby0+b3V0cHV0X29mZnNldCwKLQkJICAgIFNFRUtfU0VUKSAhPSAwKQotCWdvdG8gZXJyb3JfcmV0dXJuOwotICAgICAgaWYgKCEgX2JmZF9zdHJpbmd0YWJfZW1pdCAoYWJmZCwgZGVidWdfc3RydGFiKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgLyogU2V0dGluZyBiZmRfZ2V0X3N5bWNvdW50IHRvIDAgd2lsbCBjYXVzZSB3cml0ZV9vYmplY3RfY29udGVudHMgdG8KLSAgICAgbm90IHRyeSB0byB3cml0ZSBvdXQgdGhlIHN5bWJvbHMuICAqLwotICBiZmRfZ2V0X3N5bWNvdW50IChhYmZkKSA9IDA7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChmaW5mby5zdHJ0YWIgIT0gTlVMTCkKLSAgICBfYmZkX3N0cmluZ3RhYl9mcmVlIChmaW5mby5zdHJ0YWIpOwotICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhYmZkLT5zZWN0aW9uX2NvdW50OyBpKyspCi0JewotCSAgaWYgKGZpbmZvLnNlY3Rpb25faW5mb1tpXS5yZWxvY3MgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbG9jcyk7Ci0JICBpZiAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMgIT0gTlVMTCkKLQkgICAgZnJlZSAoZmluZm8uc2VjdGlvbl9pbmZvW2ldLnJlbF9oYXNoZXMpOwotCX0KLSAgICAgIGZyZWUgKGZpbmZvLnNlY3Rpb25faW5mbyk7Ci0gICAgfQotICBpZiAoZmluZm8uaW50ZXJuYWxfc3ltcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmludGVybmFsX3N5bXMpOwotICBpZiAoZmluZm8uc3ltX2luZGljZXMgIT0gTlVMTCkKLSAgICBmcmVlIChmaW5mby5zeW1faW5kaWNlcyk7Ci0gIGlmIChmaW5mby5vdXRzeW1zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ub3V0c3ltcyk7Ci0gIGlmIChmaW5mby5saW5lbm9zICE9IE5VTEwpCi0gICAgZnJlZSAoZmluZm8ubGluZW5vcyk7Ci0gIGlmIChmaW5mby5jb250ZW50cyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmNvbnRlbnRzKTsKLSAgaWYgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyAhPSBOVUxMKQotICAgIGZyZWUgKGZpbmZvLmV4dGVybmFsX3JlbG9jcyk7Ci0gIGlmIChleHRlcm5hbF9yZWxvY3MgIT0gTlVMTCkKLSAgICBmcmVlIChleHRlcm5hbF9yZWxvY3MpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIExpbmsgYW4gaW5wdXQgZmlsZSBpbnRvIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuICBUaGlzIGZ1bmN0aW9uCi0gICBoYW5kbGVzIGFsbCB0aGUgc2VjdGlvbnMgYW5kIHJlbG9jYXRpb25zIG9mIHRoZSBpbnB1dCBmaWxlIGF0IG9uY2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgoteGNvZmZfbGlua19pbnB1dF9iZmQgKGZpbmZvLCBpbnB1dF9iZmQpCi0gICAgIHN0cnVjdCB4Y29mZl9maW5hbF9saW5rX2luZm8gKmZpbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLXsKLSAgYmZkICpvdXRwdXRfYmZkOwotICBjb25zdCBjaGFyICpzdHJpbmdzOwotICBiZmRfc2l6ZV90eXBlIHN5bWVudF9iYXNlOwotICB1bnNpZ25lZCBpbnQgbl90bWFzazsKLSAgdW5zaWduZWQgaW50IG5fYnRzaGZ0OwotICBib29sZWFuIGNvcHksIGhhc2g7Ci0gIGJmZF9zaXplX3R5cGUgaXN5bWVzejsKLSAgYmZkX3NpemVfdHlwZSBvc3ltZXN6OwotICBiZmRfc2l6ZV90eXBlIGxpbmVzejsKLSAgYmZkX2J5dGUgKmVzeW07Ci0gIGJmZF9ieXRlICplc3ltX2VuZDsKLSAgc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKnN5bV9oYXNoOwotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppc3ltcDsKLSAgYXNlY3Rpb24gKipjc2VjdHBwOwotICB1bnNpZ25lZCBsb25nICpkZWJ1Z19pbmRleDsKLSAgbG9uZyAqaW5kZXhwOwotICB1bnNpZ25lZCBsb25nIG91dHB1dF9pbmRleDsKLSAgYmZkX2J5dGUgKm91dHN5bTsKLSAgdW5zaWduZWQgaW50IGluY2xzOwotICBhc2VjdGlvbiAqb2xpbmU7Ci0gIGJvb2xlYW4ga2VlcF9zeW1zOwotICBhc2VjdGlvbiAqbzsKLQotICAvKiBXZSBjYW4ganVzdCBza2lwIERZTkFNSUMgZmlsZXMsIHVubGVzcyB0aGlzIGlzIGEgc3RhdGljIGxpbmsuICAqLwotICBpZiAoKGlucHV0X2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwCi0gICAgICAmJiAhIGZpbmZvLT5pbmZvLT5zdGF0aWNfbGluaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBNb3ZlIGFsbCB0aGUgc3ltYm9scyB0byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgc3RyaW5ncyA9IE5VTEw7Ci0gIHN5bWVudF9iYXNlID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotICBpc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChpbnB1dF9iZmQpOwotICBvc3ltZXN6ID0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLSAgbGluZXN6ID0gYmZkX2NvZmZfbGluZXN6IChpbnB1dF9iZmQpOwotICBCRkRfQVNTRVJUIChsaW5lc3ogPT0gYmZkX2NvZmZfbGluZXN6IChvdXRwdXRfYmZkKSk7Ci0KLSAgbl90bWFzayA9IGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+bG9jYWxfbl90bWFzazsKLSAgbl9idHNoZnQgPSBjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmxvY2FsX25fYnRzaGZ0OwotCi0gIC8qIERlZmluZSBtYWNyb3Mgc28gdGhhdCBJU0ZDTiwgZXQuIGFsLiwgbWFjcm9zIHdvcmsgY29ycmVjdGx5LiAgKi8KLSNkZWZpbmUgTl9UTUFTSyBuX3RtYXNrCi0jZGVmaW5lIE5fQlRTSEZUIG5fYnRzaGZ0Ci0KLSAgY29weSA9IGZhbHNlOwotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgY29weSA9IHRydWU7Ci0gIGhhc2ggPSB0cnVlOwotICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLSAgICBoYXNoID0gZmFsc2U7Ci0KLSAgaWYgKCEgX2JmZF9jb2ZmX2dldF9leHRlcm5hbF9zeW1ib2xzIChpbnB1dF9iZmQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgc3ltX2hhc2ggPSBvYmpfeGNvZmZfc3ltX2hhc2hlcyAoaW5wdXRfYmZkKTsKLSAgY3NlY3RwcCA9IHhjb2ZmX2RhdGEgKGlucHV0X2JmZCktPmNzZWN0czsKLSAgZGVidWdfaW5kZXggPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5kZWJ1Z19pbmRpY2VzOwotICBpc3ltcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotICBpbmRleHAgPSBmaW5mby0+c3ltX2luZGljZXM7Ci0gIG91dHB1dF9pbmRleCA9IHN5bWVudF9iYXNlOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLSAgaW5jbHMgPSAwOwotICBvbGluZSA9IE5VTEw7Ci0KLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotICAgICAgaW50IHNtdHlwID0gMDsKLSAgICAgIGJvb2xlYW4gc2tpcDsKLSAgICAgIGJvb2xlYW4gcmVxdWlyZTsKLSAgICAgIGludCBhZGQ7Ci0KLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX2luIChpbnB1dF9iZmQsIChQVFIpIGVzeW0sIChQVFIpIGlzeW1wKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIENfRVhUIG9yIENfSElERVhUIHN5bWJvbCwgd2UgbmVlZCB0aGUgY3NlY3QKLSAgICAgICAgIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmIChpc3ltcC0+bl9zY2xhc3MgPT0gQ19FWFQgfHwgaXN5bXAtPm5fc2NsYXNzID09IENfSElERVhUKQotCXsKLQkgIEJGRF9BU1NFUlQgKGlzeW1wLT5uX251bWF1eCA+IDApOwotCSAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwKLQkJCQkoUFRSKSAoZXN5bSArIGlzeW1lc3ogKiBpc3ltcC0+bl9udW1hdXgpLAotCQkJCWlzeW1wLT5uX3R5cGUsIGlzeW1wLT5uX3NjbGFzcywKLQkJCQlpc3ltcC0+bl9udW1hdXggLSAxLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJKFBUUikgJmF1eCk7Ci0JICBzbXR5cCA9IFNNVFlQX1NNVFlQIChhdXgueF9jc2VjdC54X3NtdHlwKTsKLQl9Ci0KLSAgICAgIC8qIE1ha2UgYSBjb3B5IG9mICppc3ltcCBzbyB0aGF0IHRoZSByZWxvY2F0ZV9zZWN0aW9uIGZ1bmN0aW9uCi0JIGFsd2F5cyBzZWVzIHRoZSBvcmlnaW5hbCB2YWx1ZXMuICBUaGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbgotCSBhbHdheXMgcmVjb21wdXRpbmcgdGhlIHN5bWJvbCB2YWx1ZSBldmVuIGlmIHdlIGFyZSBzdHJpcHBpbmcKLQkgdGhlIHN5bWJvbC4gICovCi0gICAgICBpc3ltID0gKmlzeW1wOwotCi0gICAgICAvKiBJZiB0aGlzIHN5bWJvbCBpcyBpbiB0aGUgLmxvYWRlciBzZWN0aW9uLCBzd2FwIG91dCB0aGUKLSAgICAgICAgIC5sb2FkZXIgc3ltYm9sIGluZm9ybWF0aW9uLiAgSWYgdGhpcyBpcyBhbiBleHRlcm5hbCBzeW1ib2wKLSAgICAgICAgIHJlZmVyZW5jZSB0byBhIGRlZmluZWQgc3ltYm9sLCB0aG91Z2gsIHRoZW4gd2FpdCB1bnRpbCB3ZSBnZXQKLSAgICAgICAgIHRvIHRoZSBkZWZpbml0aW9uLiAgKi8KLSAgICAgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAmJiAqc3ltX2hhc2ggIT0gTlVMTAotCSAgJiYgKCpzeW1faGFzaCktPmxkc3ltICE9IE5VTEwKLQkgICYmIChzbXR5cCAhPSBYVFlfRVIKLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKSkKLQl7Ci0JICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgc3RydWN0IGludGVybmFsX2xkc3ltICpsZHN5bTsKLQotCSAgaCA9ICpzeW1faGFzaDsKLQkgIGxkc3ltID0gaC0+bGRzeW07Ci0JICBpZiAoaXN5bS5uX3NjbnVtID4gMCkKLQkgICAgewotCSAgICAgIGxkc3ltLT5sX3NjbnVtID0gKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgICBsZHN5bS0+bF92YWx1ZSA9IChpc3ltLm5fdmFsdWUKLQkJCQkrICgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkrICgqY3NlY3RwcCktPm91dHB1dF9vZmZzZXQKLQkJCQktICgqY3NlY3RwcCktPnZtYSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxkc3ltLT5sX3NjbnVtID0gaXN5bS5uX3NjbnVtOwotCSAgICAgIGxkc3ltLT5sX3ZhbHVlID0gaXN5bS5uX3ZhbHVlOwotCSAgICB9Ci0KLQkgIGxkc3ltLT5sX3NtdHlwZSA9IHNtdHlwOwotCSAgaWYgKCgoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMAotCSAgICAgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKLQkgICAgICB8fCAoaC0+ZmxhZ3MgJiBYQ09GRl9JTVBPUlQpICE9IDApCi0JICAgIGxkc3ltLT5sX3NtdHlwZSB8PSBMX0lNUE9SVDsKLQkgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpICE9IDAKLQkgICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDApCi0JICAgICAgfHwgKGgtPmZsYWdzICYgWENPRkZfRVhQT1JUKSAhPSAwKQotCSAgICBsZHN5bS0+bF9zbXR5cGUgfD0gTF9FWFBPUlQ7Ci0JICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRU5UUlkpICE9IDApCi0JICAgIGxkc3ltLT5sX3NtdHlwZSB8PSBMX0VOVFJZOwotCi0JICBsZHN5bS0+bF9zbWNsYXMgPSBhdXgueF9jc2VjdC54X3NtY2xhczsKLQotCSAgaWYgKGxkc3ltLT5sX2lmaWxlID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkgICAgbGRzeW0tPmxfaWZpbGUgPSAwOwotCSAgZWxzZSBpZiAobGRzeW0tPmxfaWZpbGUgPT0gMCkKLQkgICAgewotCSAgICAgIGlmICgobGRzeW0tPmxfc210eXBlICYgTF9JTVBPUlQpID09IDApCi0JCWxkc3ltLT5sX2lmaWxlID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBiZmQgKmltcGJmZDsKLQotCQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JCSAgICBpbXBiZmQgPSBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCQkgIGVsc2UgaWYgKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZAotCQkJICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrKQotCQkgICAgaW1wYmZkID0gaC0+cm9vdC51LnVuZGVmLmFiZmQ7Ci0JCSAgZWxzZQotCQkgICAgaW1wYmZkID0gTlVMTDsKLQotCQkgIGlmIChpbXBiZmQgPT0gTlVMTCkKLQkJICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKGltcGJmZC0+eHZlYyA9PSBmaW5mby0+b3V0cHV0X2JmZC0+eHZlYyk7Ci0JCSAgICAgIGxkc3ltLT5sX2lmaWxlID0geGNvZmZfZGF0YSAoaW1wYmZkKS0+aW1wb3J0X2ZpbGVfaWQ7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBsZHN5bS0+bF9wYXJtID0gMDsKLQotCSAgQkZEX0FTU0VSVCAoaC0+bGRpbmR4ID49IDApOwotCSAgQkZEX0FTU0VSVCAoTERTWU1TWiA9PSBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9sZHN5bSkpOwotCSAgeGNvZmZfc3dhcF9sZHN5bV9vdXQgKGZpbmZvLT5vdXRwdXRfYmZkLCBsZHN5bSwKLQkJCQlmaW5mby0+bGRzeW0gKyBoLT5sZGluZHggLSAzKTsKLQkgIGgtPmxkc3ltID0gTlVMTDsKLQotCSAgLyogRmlsbCBpbiBzbmVudHJ5IG5vdyB0aGF0IHdlIGtub3cgdGhlIHRhcmdldF9pbmRleC4gICovCi0JICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRU5UUlkpICE9IDAKLQkgICAgICAmJiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspKQotCSAgICB4Y29mZl9kYXRhIChvdXRwdXRfYmZkKS0+c25lbnRyeSA9Ci0JICAgICAgaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCX0KLQotICAgICAgKmluZGV4cCA9IC0xOwotCi0gICAgICBza2lwID0gZmFsc2U7Ci0gICAgICByZXF1aXJlID0gZmFsc2U7Ci0gICAgICBhZGQgPSAxICsgaXN5bS5uX251bWF1eDsKLQotICAgICAgLyogSWYgd2UgYXJlIHNraXBwaW5nIHRoaXMgY3NlY3QsIHdlIHdhbnQgdG8gc2tpcCB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAoKmNzZWN0cHAgPT0gTlVMTCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogSWYgd2UgZ2FyYmFnZSBjb2xsZWN0ZWQgdGhpcyBjc2VjdCwgd2Ugd2FudCB0byBza2lwIHRoaXMKLSAgICAgICAgIHN5bWJvbC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiB4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmdjCi0JICAmJiAoKCpjc2VjdHBwKS0+ZmxhZ3MgJiBTRUNfTUFSSykgPT0gMAotCSAgJiYgKmNzZWN0cHAgIT0gYmZkX2Fic19zZWN0aW9uX3B0cikKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogQW4gWENPRkYgbGlua2VyIGFsd2F5cyBza2lwcyBDX1NUQVQgc3ltYm9scy4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBpc3ltcC0+bl9zY2xhc3MgPT0gQ19TVEFUKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBXZSBza2lwIGFsbCBidXQgdGhlIGZpcnN0IFRPQyBhbmNob3IuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgaXN5bXAtPm5fc2NsYXNzID09IENfSElERVhUCi0JICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMwKQotCXsKLQkgIGlmIChmaW5mby0+dG9jX3N5bWluZHggIT0gLTEpCi0JICAgIHNraXAgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSB0b2N2YWwsIHRvY2VuZDsKLQotCSAgICAgIHRvY3ZhbCA9ICgoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkrICgqY3NlY3RwcCktPm91dHB1dF9vZmZzZXQKLQkJCSsgaXN5bS5uX3ZhbHVlCi0JCQktICgqY3NlY3RwcCktPnZtYSk7Ci0JICAgICAgLyogV2Ugd2FudCB0byBmaW5kIG91dCBpZiB0b2N2YWwgaXMgYSBnb29kIHZhbHVlIHRvIHVzZQotICAgICAgICAgICAgICAgICBhcyB0aGUgVE9DIGFuY2hvci0tdGhhdCBpcywgd2hldGhlciB3ZSBjYW4gYWNjZXNzIGFsbAotICAgICAgICAgICAgICAgICBvZiB0aGUgVE9DIHVzaW5nIGEgMTYgYml0IG9mZnNldCBmcm9tIHRvY3ZhbC4gIFRoaXMKLSAgICAgICAgICAgICAgICAgdGVzdCBhc3N1bWVzIHRoYXQgdGhlIFRPQyBjb21lcyBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAgICAgICAgICAgICBvdXRwdXQgc2VjdGlvbiwgYXMgaXQgZG9lcyBpbiB0aGUgZGVmYXVsdCBsaW5rZXIKLSAgICAgICAgICAgICAgICAgc2NyaXB0LiAgRklYTUU6IFRoaXMgZG9lc24ndCBoYW5kbGUgLnRvY2JzcyBzZWN0aW9ucwotICAgICAgICAgICAgICAgICBjcmVhdGVkIGZyb20gWE1DX1REIGNvbW1vbiBzeW1ib2xzIGNvcnJlY3RseS4gICovCi0KLQkgICAgICB0b2NlbmQgPSAoKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJKyAoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+X3Jhd19zaXplKTsKLQotCSAgICAgIGlmICh0b2N2YWwgKyAweDEwMDAwIDwgdG9jZW5kKQotCQl7Ci0JCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JCSAgICAoXygiVE9DIG92ZXJmbG93OiAweCVseCA+IDB4MTAwMDA7IHRyeSAtbW1pbmltYWwtdG9jIHdoZW4gY29tcGlsaW5nIiksCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpICh0b2NlbmQgLSB0b2N2YWwpKTsKLQkJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV90b29fYmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIGlmICh0b2N2YWwgKyAweDgwMDAgPCB0b2NlbmQpCi0JCXsKLQkJICBiZmRfdm1hIHRvY2FkZDsKLQotCQkgIHRvY2FkZCA9IHRvY2VuZCAtICh0b2N2YWwgKyAweDgwMDApOwotCQkgIHRvY3ZhbCArPSB0b2NhZGQ7Ci0JCSAgaXN5bS5uX3ZhbHVlICs9IHRvY2FkZDsKLQkJfQotCi0JICAgICAgZmluZm8tPnRvY19zeW1pbmR4ID0gb3V0cHV0X2luZGV4OwotCSAgICAgIHhjb2ZmX2RhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKS0+dG9jID0gdG9jdmFsOwotCSAgICAgIHhjb2ZmX2RhdGEgKGZpbmZvLT5vdXRwdXRfYmZkKS0+c250b2MgPQotCQkoKmNzZWN0cHApLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCSAgICAgIHJlcXVpcmUgPSB0cnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBhcmUgc3RyaXBwaW5nIGFsbCBzeW1ib2xzLCB3ZSB3YW50IHRvIHNraXAgdGhpcyBvbmUuICAqLwotICAgICAgaWYgKCEgc2tpcAotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLQlza2lwID0gdHJ1ZTsKLQotICAgICAgLyogV2UgY2FuIHNraXAgcmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBpc3ltLm5fc2NsYXNzID09IENfRVhUCi0JICAmJiBzbXR5cCA9PSBYVFlfRVIKLQkgICYmICgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0Jc2tpcCA9IHRydWU7Ci0KLSAgICAgIC8qIFdlIGNhbiBza2lwIGNvbW1vbiBzeW1ib2xzIGlmIHRoZXkgZ290IGRlZmluZWQgc29tZXdoZXJlCi0gICAgICAgICBlbHNlLiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIGlzeW0ubl9zY2xhc3MgPT0gQ19FWFQKLQkgICYmIHNtdHlwID09IFhUWV9DTQotCSAgJiYgKCgqc3ltX2hhc2gpLT5yb290LnR5cGUgIT0gYmZkX2xpbmtfaGFzaF9jb21tb24KLQkgICAgICB8fCAoKnN5bV9oYXNoKS0+cm9vdC51LmMucC0+c2VjdGlvbiAhPSAqY3NlY3RwcCkKLQkgICYmICgoKnN5bV9oYXNoKS0+cm9vdC50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8ICgqc3ltX2hhc2gpLT5yb290LnUuZGVmLnNlY3Rpb24gIT0gKmNzZWN0cHApKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBTa2lwIGxvY2FsIHN5bWJvbHMgaWYgd2UgYXJlIGRpc2NhcmRpbmcgdGhlbS4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBmaW5mby0+aW5mby0+ZGlzY2FyZCA9PSBkaXNjYXJkX2FsbAotCSAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX0VYVAotCSAgJiYgKGlzeW0ubl9zY2xhc3MgIT0gQ19ISURFWFQKLQkgICAgICB8fCBzbXR5cCAhPSBYVFlfU0QpKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBJZiB3ZSBzdHJpcHBpbmcgZGVidWdnaW5nIHN5bWJvbHMsIGFuZCB0aGlzIGlzIGEgZGVidWdnaW5nCi0gICAgICAgICBzeW1ib2wsIHRoZW4gc2tpcCBpdC4gICovCi0gICAgICBpZiAoISBza2lwCi0JICAmJiBmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfZGVidWdnZXIKLQkgICYmIGlzeW0ubl9zY251bSA9PSBOX0RFQlVHKQotCXNraXAgPSB0cnVlOwotCi0gICAgICAvKiBJZiBzb21lIHN5bWJvbHMgYXJlIHN0cmlwcGVkIGJhc2VkIG9uIHRoZSBuYW1lLCB3b3JrIG91dCB0aGUKLQkgbmFtZSBhbmQgZGVjaWRlIHdoZXRoZXIgdG8gc2tpcCB0aGlzIHN5bWJvbC4gIFdlIGRvbid0IGhhbmRsZQotCSB0aGlzIGNvcnJlY3RseSBmb3Igc3ltYm9scyB3aG9zZSBuYW1lcyBhcmUgaW4gdGhlIC5kZWJ1ZwotCSBzZWN0aW9uOyB0byBnZXQgaXQgcmlnaHQgd2Ugd291bGQgbmVlZCBhIG5ldyBiZmRfc3RydGFiX2hhc2gKLQkgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBzdHJpbmcgZ2l2ZW4gdGhlIGluZGV4LiAgKi8KLSAgICAgIGlmICghIHNraXAKLQkgICYmIChmaW5mby0+aW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZQotCSAgICAgIHx8IGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbCkKLQkgICYmIChkZWJ1Z19pbmRleCA9PSBOVUxMIHx8ICpkZWJ1Z19pbmRleCA9PSAodW5zaWduZWQgbG9uZykgLTEpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLCBidWYpOwotCSAgaWYgKG5hbWUgPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgICYmIChiZmRfaGFzaF9sb29rdXAgKGZpbmZvLT5pbmZvLT5rZWVwX2hhc2gsIG5hbWUsIGZhbHNlLAotCQkJCSAgICBmYWxzZSkgPT0gTlVMTCkpCi0JICAgICAgfHwgKGZpbmZvLT5pbmZvLT5kaXNjYXJkID09IGRpc2NhcmRfbAotCQkgICYmIChpc3ltLm5fc2NsYXNzICE9IENfRVhUCi0JCSAgICAgICYmIChpc3ltLm5fc2NsYXNzICE9IENfSElERVhUCi0JCQkgIHx8IHNtdHlwICE9IFhUWV9TRCkpCi0JCSAgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKGlucHV0X2JmZCwgbmFtZSkpKQotCSAgICBza2lwID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGNhbiBub3Qgc2tpcCB0aGUgZmlyc3QgVE9DIGFuY2hvci4gICovCi0gICAgICBpZiAoc2tpcAotCSAgJiYgcmVxdWlyZQotCSAgJiYgZmluZm8tPmluZm8tPnN0cmlwICE9IHN0cmlwX2FsbCkKLQlza2lwID0gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIG5vdyBrbm93IHdoZXRoZXIgd2UgYXJlIHRvIHNraXAgdGhpcyBzeW1ib2wgb3Igbm90LiAgKi8KLSAgICAgIGlmICghIHNraXApCi0JewotCSAgLyogQWRqdXN0IHRoZSBzeW1ib2wgaW4gb3JkZXIgdG8gb3V0cHV0IGl0LiAgKi8KLQotCSAgaWYgKGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPT0gMAotCSAgICAgICYmIGlzeW0uX24uX25fbi5fbl9vZmZzZXQgIT0gMCkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgc3ltYm9sIGhhcyBhIGxvbmcgbmFtZS4gIEVudGVyIGl0IGluIHRoZSBzdHJpbmcKLQkJIHRhYmxlIHdlIGFyZSBidWlsZGluZy4gIElmICpkZWJ1Z19pbmRleCAhPSAtMSwgdGhlCi0JCSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gZW50ZXJlZCBpbiB0aGUgLmRlYnVnIHNlY3Rpb24uICAqLwotCSAgICAgIGlmIChkZWJ1Z19pbmRleCAhPSBOVUxMICYmICpkZWJ1Z19pbmRleCAhPSAodW5zaWduZWQgbG9uZykgLTEpCi0JCWlzeW0uX24uX25fbi5fbl9vZmZzZXQgPSAqZGVidWdfaW5kZXg7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbmFtZTsKLQkJICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkJICBuYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsICZpc3ltLAotCQkJCQkJCSAoY2hhciAqKSBOVUxMKTsKLQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIG5hbWUsIGhhc2gsIGNvcHkpOwotCQkgIGlmIChpbmR4ID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaXN5bS5uX3NjbGFzcyAhPSBDX0JTVEFUCi0JICAgICAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX0VTVEFUCi0JICAgICAgJiYgaXN5bS5uX3NjbGFzcyAhPSBDX0RFQ0wKLQkgICAgICAmJiBpc3ltLm5fc2NudW0gPiAwKQotCSAgICB7Ci0JICAgICAgaXN5bS5uX3NjbnVtID0gKCpjc2VjdHBwKS0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgICAgICBpc3ltLm5fdmFsdWUgKz0gKCgqY3NlY3RwcCktPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCSAgICAgICArICgqY3NlY3RwcCktPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgICAtICgqY3NlY3RwcCktPnZtYSk7Ci0JICAgIH0KLQotCSAgLyogVGhlIHZhbHVlIG9mIGEgQ19GSUxFIHN5bWJvbCBpcyB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZQotCSAgICAgbmV4dCBDX0ZJTEUgc3ltYm9sLiAgVGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBzeW1ib2wKLQkgICAgIGlzIC0xLiAgV2UgdHJ5IHRvIGdldCB0aGlzIHJpZ2h0LCBiZWxvdywganVzdCBiZWZvcmUgd2UKLQkgICAgIHdyaXRlIHRoZSBzeW1ib2xzIG91dCwgYnV0IGluIHRoZSBnZW5lcmFsIGNhc2Ugd2UgbWF5Ci0JICAgICBoYXZlIHRvIHdyaXRlIHRoZSBzeW1ib2wgb3V0IHR3aWNlLiAgKi8KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRklMRSkKLQkgICAgewotCSAgICAgIGlmIChmaW5mby0+bGFzdF9maWxlX2luZGV4ICE9IC0xCi0JCSAgJiYgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlICE9IChsb25nKSBvdXRwdXRfaW5kZXgpCi0JCXsKLQkJICAvKiBXZSBtdXN0IGNvcnJlY3QgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IENfRklMRSBlbnRyeS4gICovCi0JCSAgZmluZm8tPmxhc3RfZmlsZS5uX3ZhbHVlID0gb3V0cHV0X2luZGV4OwotCQkgIGlmICgoYmZkX3NpemVfdHlwZSkgZmluZm8tPmxhc3RfZmlsZV9pbmRleCA+PSBzeW1lbnRfYmFzZSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGxhc3QgQ19GSUxFIHN5bWJvbCBpcyBpbiB0aGlzIGlucHV0IGZpbGUuICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkJCSAgICAgKFBUUikgKGZpbmZvLT5vdXRzeW1zCi0JCQkJCQkgICAgKyAoKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXgKLQkJCQkJCQktIHN5bWVudF9iYXNlKQotCQkJCQkJICAgICAgICogb3N5bWVzeikpKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSB3cml0dGVuIG91dCB0aGUgbGFzdCBDX0ZJTEUKLQkJCSBzeW1ib2wuICBXZSBuZWVkIHRvIHdyaXRlIGl0IG91dCBhZ2Fpbi4gIFdlCi0JCQkgYm9ycm93ICpvdXRzeW0gdGVtcG9yYXJpbHkuICAqLwotCQkgICAgICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsCi0JCQkJCSAgICAgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkJCSAgICAgKFBUUikgb3V0c3ltKTsKLQkJICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJCSAgICAob2JqX3N5bV9maWxlcG9zIChvdXRwdXRfYmZkKQotCQkJCSAgICAgKyBmaW5mby0+bGFzdF9maWxlX2luZGV4ICogb3N5bWVzeiksCi0JCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCQkgIHx8IChiZmRfd3JpdGUgKG91dHN5bSwgb3N5bWVzeiwgMSwgb3V0cHV0X2JmZCkKLQkJCSAgICAgICE9IG9zeW1lc3opKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmaW5mby0+bGFzdF9maWxlX2luZGV4ID0gb3V0cHV0X2luZGV4OwotCSAgICAgIGZpbmZvLT5sYXN0X2ZpbGUgPSBpc3ltOwotCSAgICB9Ci0KLQkgIC8qIFRoZSB2YWx1ZSBvZiBhIENfQklOQ0wgb3IgQ19FSU5DTCBzeW1ib2wgaXMgYSBmaWxlIG9mZnNldAotICAgICAgICAgICAgIGludG8gdGhlIGxpbmUgbnVtYmVycy4gIFdlIHVwZGF0ZSB0aGUgc3ltYm9sIHZhbHVlcyB3aGVuCi0gICAgICAgICAgICAgd2UgaGFuZGxlIHRoZSBsaW5lIG51bWJlcnMuICAqLwotCSAgaWYgKGlzeW0ubl9zY2xhc3MgPT0gQ19CSU5DTAotCSAgICAgIHx8IGlzeW0ubl9zY2xhc3MgPT0gQ19FSU5DTCkKLQkgICAgewotCSAgICAgIGlzeW0ubl92YWx1ZSA9IGZpbmZvLT5saW5lX2ZpbGVwb3M7Ci0JICAgICAgKytpbmNsczsKLQkgICAgfQotCi0JICAvKiBPdXRwdXQgdGhlIHN5bWJvbC4gICovCi0KLQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sIChQVFIpIG91dHN5bSk7Ci0KLQkgICppbmRleHAgPSBvdXRwdXRfaW5kZXg7Ci0KLQkgIGlmIChpc3ltLm5fc2NsYXNzID09IENfRVhUKQotCSAgICB7Ci0JICAgICAgbG9uZyBpbmR4OwotCSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgICBpbmR4ID0gKChlc3ltIC0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCkpCi0JCSAgICAgIC8gaXN5bWVzeik7Ci0JICAgICAgaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW2luZHhdOwotCSAgICAgIEJGRF9BU1NFUlQgKGggIT0gTlVMTCk7Ci0JICAgICAgaC0+aW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgfQotCi0JICAvKiBJZiB0aGlzIGlzIGEgc3ltYm9sIGluIHRoZSBUT0Mgd2hpY2ggd2UgbWF5IGhhdmUgbWVyZ2VkCi0gICAgICAgICAgICAgKGNsYXNzIFhNQ19UQyksIHJlbWVtYmVyIHRoZSBzeW1ib2wgaW5kZXggb2YgdGhlIFRPQwotICAgICAgICAgICAgIHN5bWJvbC4gICovCi0JICBpZiAoaXN5bS5uX3NjbGFzcyA9PSBDX0hJREVYVAotCSAgICAgICYmIGF1eC54X2NzZWN0Lnhfc21jbGFzID09IFhNQ19UQwotCSAgICAgICYmICpzeW1faGFzaCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgQkZEX0FTU0VSVCAoKCgqc3ltX2hhc2gpLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpID09IDApOwotCSAgICAgIEJGRF9BU1NFUlQgKCgqc3ltX2hhc2gpLT50b2Nfc2VjdGlvbiAhPSBOVUxMKTsKLQkgICAgICAoKnN5bV9oYXNoKS0+dS50b2NfaW5keCA9IG91dHB1dF9pbmRleDsKLQkgICAgfQotCi0JICBvdXRwdXRfaW5kZXggKz0gYWRkOwotCSAgb3V0c3ltICs9IGFkZCAqIG9zeW1lc3o7Ci0JfQotCi0gICAgICBlc3ltICs9IGFkZCAqIGlzeW1lc3o7Ci0gICAgICBpc3ltcCArPSBhZGQ7Ci0gICAgICBjc2VjdHBwICs9IGFkZDsKLSAgICAgIHN5bV9oYXNoICs9IGFkZDsKLSAgICAgIGlmIChkZWJ1Z19pbmRleCAhPSBOVUxMKQotCWRlYnVnX2luZGV4ICs9IGFkZDsKLSAgICAgICsraW5kZXhwOwotICAgICAgZm9yICgtLWFkZDsgYWRkID4gMDsgLS1hZGQpCi0JKmluZGV4cCsrID0gLTE7Ci0gICAgfQotCi0gIC8qIEZpeCB1cCB0aGUgYXV4IGVudHJpZXMgYW5kIHRoZSBDX0JTVEFUIHN5bWJvbHMuICBUaGlzIG11c3QgYmUKLSAgICAgZG9uZSBpbiBhIHNlcGFyYXRlIHBhc3MsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUgY29ycmVjdCBzeW1ib2wKLSAgICAgaW5kaWNlcyB1bnRpbCB3ZSBoYXZlIGFscmVhZHkgZGVjaWRlZCB3aGljaCBzeW1ib2xzIHdlIGFyZSBnb2luZwotICAgICB0byBrZWVwLiAgKi8KLQotICBlc3ltID0gKGJmZF9ieXRlICopIG9ial9jb2ZmX2V4dGVybmFsX3N5bXMgKGlucHV0X2JmZCk7Ci0gIGVzeW1fZW5kID0gZXN5bSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpICogaXN5bWVzejsKLSAgaXN5bXAgPSBmaW5mby0+aW50ZXJuYWxfc3ltczsKLSAgaW5kZXhwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotICBjc2VjdHBwID0geGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzOwotICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLSAgd2hpbGUgKGVzeW0gPCBlc3ltX2VuZCkKLSAgICB7Ci0gICAgICBpbnQgYWRkOwotCi0gICAgICBhZGQgPSAxICsgaXN5bXAtPm5fbnVtYXV4OwotCi0gICAgICBpZiAoKmluZGV4cCA8IDApCi0JZXN5bSArPSBhZGQgKiBpc3ltZXN6OwotICAgICAgZWxzZQotCXsKLQkgIGludCBpOwotCi0JICBpZiAoaXN5bXAtPm5fc2NsYXNzID09IENfQlNUQVQpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlzeW07Ci0JICAgICAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JICAgICAgLyogVGhlIHZhbHVlIG9mIGEgQ19CU1RBVCBzeW1ib2wgaXMgdGhlIHN5bWJvbCB0YWJsZQotICAgICAgICAgICAgICAgICBpbmRleCBvZiB0aGUgY29udGFpbmluZyBjc2VjdC4gICovCi0JICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKG91dHB1dF9iZmQsIChQVFIpIG91dHN5bSwgKFBUUikgJmlzeW0pOwotCSAgICAgIGluZHggPSBpc3ltLm5fdmFsdWU7Ci0JICAgICAgaWYgKGluZHggPCBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJewotCQkgIGxvbmcgc3ltaW5keDsKLQotCQkgIHN5bWluZHggPSBmaW5mby0+c3ltX2luZGljZXNbaW5keF07Ci0JCSAgaWYgKHN5bWluZHggPCAwKQotCQkgICAgaXN5bS5uX3ZhbHVlID0gMDsKLQkJICBlbHNlCi0JCSAgICBpc3ltLm5fdmFsdWUgPSBzeW1pbmR4OwotCQkgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmlzeW0sCi0JCQkJCSAoUFRSKSBvdXRzeW0pOwotCQl9Ci0JICAgIH0KLQotCSAgZXN5bSArPSBpc3ltZXN6OwotCSAgb3V0c3ltICs9IG9zeW1lc3o7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBpc3ltcC0+bl9udW1hdXggJiYgZXN5bSA8IGVzeW1fZW5kOyBpKyspCi0JICAgIHsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0JICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgKFBUUikgZXN5bSwgaXN5bXAtPm5fdHlwZSwKLQkJCQkgICAgaXN5bXAtPm5fc2NsYXNzLCBpLCBpc3ltcC0+bl9udW1hdXgsCi0JCQkJICAgIChQVFIpICZhdXgpOwotCi0JICAgICAgaWYgKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZJTEUpCi0JCXsKLQkJICAvKiBUaGlzIGlzIHRoZSBmaWxlIG5hbWUgKG9yIHNvbWUgY29tbWVudCBwdXQgaW4gYnkKLQkJICAgICB0aGUgY29tcGlsZXIpLiAgSWYgaXQgaXMgbG9uZywgd2UgbXVzdCBwdXQgaXQgaW4KLQkJICAgICB0aGUgc3RyaW5nIHRhYmxlLiAgKi8KLQkJICBpZiAoYXV4LnhfZmlsZS54X24ueF96ZXJvZXMgPT0gMAotCQkgICAgICAmJiBhdXgueF9maWxlLnhfbi54X29mZnNldCAhPSAwKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJICAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotCi0JCSAgICAgIEJGRF9BU1NFUlQgKGF1eC54X2ZpbGUueF9uLnhfb2Zmc2V0Ci0JCQkJICA+PSBTVFJJTkdfU0laRV9TSVpFKTsKLQkJICAgICAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkJCXsKLQkJCSAgc3RyaW5ncyA9IF9iZmRfY29mZl9yZWFkX3N0cmluZ190YWJsZSAoaW5wdXRfYmZkKTsKLQkJCSAgaWYgKHN0cmluZ3MgPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICAgIGZpbGVuYW1lID0gc3RyaW5ncyArIGF1eC54X2ZpbGUueF9uLnhfb2Zmc2V0OwotCQkgICAgICBpbmR4ID0gX2JmZF9zdHJpbmd0YWJfYWRkIChmaW5mby0+c3RydGFiLCBmaWxlbmFtZSwKLQkJCQkJCSBoYXNoLCBjb3B5KTsKLQkJICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBhdXgueF9maWxlLnhfbi54X29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKGlzeW1wLT5uX3NjbGFzcyA9PSBDX0VYVAotCQkJfHwgaXN5bXAtPm5fc2NsYXNzID09IENfSElERVhUKQotCQkgICAgICAgJiYgaSArIDEgPT0gaXN5bXAtPm5fbnVtYXV4KQotCQl7Ci0JCSAgLyogV2UgZG9uJ3Qgc3VwcG9ydCB0eXBlIGNoZWNraW5nLiAgSSBkb24ndCBrbm93IGlmCi0gICAgICAgICAgICAgICAgICAgICBhbnlib2R5IGRvZXMuICAqLwotCQkgIGF1eC54X2NzZWN0LnhfcGFybWhhc2ggPSAwOwotCQkgIC8qIEkgZG9uJ3QgdGhpbmsgYW55Ym9keSB1c2VzIHRoZXNlIGZpZWxkcywgYnV0IHdlJ2QKLSAgICAgICAgICAgICAgICAgICAgIGJldHRlciBjbG9iYmVyIHRoZW0ganVzdCBpbiBjYXNlLiAgKi8KLQkJICBhdXgueF9jc2VjdC54X3N0YWIgPSAwOwotCQkgIGF1eC54X2NzZWN0Lnhfc25zdGFiID0gMDsKLQkJICBpZiAoU01UWVBfU01UWVAgKGF1eC54X2NzZWN0Lnhfc210eXApID09IFhUWV9MRCkKLQkJICAgIHsKLQkJICAgICAgdW5zaWduZWQgbG9uZyBpbmR4OwotCi0JCSAgICAgIGluZHggPSBhdXgueF9jc2VjdC54X3Njbmxlbi5sOwotCQkgICAgICBpZiAoaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJewotCQkJICBsb25nIHN5bWluZHg7Ci0KLQkJCSAgc3ltaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJCSAgaWYgKHN5bWluZHggPCAwKQotCQkJICAgIGF1eC54X3N5bS54X3RhZ25keC5sID0gMDsKLQkJCSAgZWxzZQotCQkJICAgIGF1eC54X3N5bS54X3RhZ25keC5sID0gc3ltaW5keDsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKGlzeW1wLT5uX3NjbGFzcyAhPSBDX1NUQVQgfHwgaXN5bXAtPm5fdHlwZSAhPSBUX05VTEwpCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGluZHg7Ci0KLQkJICBpZiAoSVNGQ04gKGlzeW1wLT5uX3R5cGUpCi0JCSAgICAgIHx8IElTVEFHIChpc3ltcC0+bl9zY2xhc3MpCi0JCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0JMT0NLCi0JCSAgICAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0ZDTikKLQkJICAgIHsKLQkJICAgICAgaW5keCA9IGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCQkgICAgICBpZiAoaW5keCA+IDAKLQkJCSAgJiYgaW5keCA8IG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKQotCQkJewotCQkJICAvKiBXZSBsb29rIGZvcndhcmQgdGhyb3VnaCB0aGUgc3ltYm9sIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIG5leHQgc3ltYm9sIHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmNsdWRlLiAgSSBkb24ndCBrbm93IGlmIHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlbHkgcmlnaHQuICAqLwotCQkJICB3aGlsZSAoZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdIDwgMAotCQkJCSAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCQkgICAgKytpbmR4OwotCQkJICBpZiAoaW5keCA+PSBvYmpfcmF3X3N5bWVudF9jb3VudCAoaW5wdXRfYmZkKSkKLQkJCSAgICBpbmR4ID0gb3V0cHV0X2luZGV4OwotCQkJICBlbHNlCi0JCQkgICAgaW5keCA9IGZpbmZvLT5zeW1faW5kaWNlc1tpbmR4XTsKLQkJCSAgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LmwgPSBpbmR4OwotCQkJfQotCQkgICAgfQotCi0JCSAgaW5keCA9IGF1eC54X3N5bS54X3RhZ25keC5sOwotCQkgIGlmIChpbmR4ID4gMCAmJiBpbmR4IDwgb2JqX3Jhd19zeW1lbnRfY291bnQgKGlucHV0X2JmZCkpCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgc3ltaW5keDsKLQotCQkgICAgICBzeW1pbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW2luZHhdOwotCQkgICAgICBpZiAoc3ltaW5keCA8IDApCi0JCQlhdXgueF9zeW0ueF90YWduZHgubCA9IDA7Ci0JCSAgICAgIGVsc2UKLQkJCWF1eC54X3N5bS54X3RhZ25keC5sID0gc3ltaW5keDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogQ29weSBvdmVyIHRoZSBsaW5lIG51bWJlcnMsIHVubGVzcyB3ZSBhcmUgc3RyaXBwaW5nCi0JCSB0aGVtLiAgV2UgZG8gdGhpcyBvbiBhIHN5bWJvbCBieSBzeW1ib2wgYmFzaXMgaW4KLQkJIG9yZGVyIHRvIG1vcmUgZWFzaWx5IGhhbmRsZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotCSAgICAgIGlmICgoaXN5bXAtPm5fc2NsYXNzID09IENfRVhUCi0JCSAgIHx8IGlzeW1wLT5uX3NjbGFzcyA9PSBDX0hJREVYVCkKLQkJICAmJiBpID09IDAKLQkJICAmJiBpc3ltcC0+bl9udW1hdXggPiAxCi0JCSAgJiYgSVNGQ04gKGlzeW1wLT5uX3R5cGUpCi0JCSAgJiYgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciAhPSAwKQotCQl7Ci0JCSAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9ub25lCi0JCSAgICAgICYmIGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9zb21lKQotCQkgICAgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciA9IDA7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqZW5jbG9zaW5nOwotCQkgICAgICB1bnNpZ25lZCBpbnQgZW5jX2NvdW50OwotCQkgICAgICBiZmRfc2l6ZV90eXBlIGxpbm9mZjsKLQkJICAgICAgc3RydWN0IGludGVybmFsX2xpbmVubyBsaW47Ci0KLQkJICAgICAgbyA9ICpjc2VjdHBwOwotCQkgICAgICBlbmNsb3NpbmcgPSB4Y29mZl9zZWN0aW9uX2RhdGEgKGFiZmQsIG8pLT5lbmNsb3Npbmc7Ci0JCSAgICAgIGVuY19jb3VudCA9IHhjb2ZmX3NlY3Rpb25fZGF0YSAoYWJmZCwgbyktPmxpbmVub19jb3VudDsKLQkJICAgICAgaWYgKG9saW5lICE9IGVuY2xvc2luZykKLQkJCXsKLQkJCSAgaWYgKGJmZF9zZWVrIChpbnB1dF9iZmQsCi0JCQkJCWVuY2xvc2luZy0+bGluZV9maWxlcG9zLAotCQkJCQlTRUVLX1NFVCkgIT0gMAotCQkJICAgICAgfHwgKGJmZF9yZWFkIChmaW5mby0+bGluZW5vcywgbGluZXN6LAotCQkJCQkgICAgZW5jX2NvdW50LCBpbnB1dF9iZmQpCi0JCQkJICAhPSBsaW5lc3ogKiBlbmNfY291bnQpKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQkJCSAgb2xpbmUgPSBlbmNsb3Npbmc7Ci0JCQl9Ci0KLQkJICAgICAgbGlub2ZmID0gKGF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIKLQkJCQktIGVuY2xvc2luZy0+bGluZV9maWxlcG9zKTsKLQotCQkgICAgICBiZmRfY29mZl9zd2FwX2xpbmVub19pbiAoaW5wdXRfYmZkLAotCQkJCQkgICAgICAgKFBUUikgKGZpbmZvLT5saW5lbm9zICsgbGlub2ZmKSwKLQkJCQkJICAgICAgIChQVFIpICZsaW4pOwotCQkgICAgICBpZiAobGluLmxfbG5ubyAhPSAwCi0JCQkgIHx8ICgoYmZkX3NpemVfdHlwZSkgbGluLmxfYWRkci5sX3N5bW5keAotCQkJICAgICAgIT0gKChlc3ltCi0JCQkJICAgLSBpc3ltZXN6Ci0JCQkJICAgLSAoKGJmZF9ieXRlICopCi0JCQkJICAgICAgb2JqX2NvZmZfZXh0ZXJuYWxfc3ltcyAoaW5wdXRfYmZkKSkpCi0JCQkJICAvIGlzeW1lc3opKSkKLQkJCWF1eC54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIgPSAwOwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGJmZF9ieXRlICpsaW5wZW5kLCAqbGlucDsKLQkJCSAgYmZkX3ZtYSBvZmZzZXQ7Ci0JCQkgIGJmZF9zaXplX3R5cGUgY291bnQ7Ci0KLQkJCSAgbGluLmxfYWRkci5sX3N5bW5keCA9ICppbmRleHA7Ci0JCQkgIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmxpbiwKLQkJCQkJCSAgICAoUFRSKSAoZmluZm8tPmxpbmVub3MKLQkJCQkJCQkgICArIGxpbm9mZikpOwotCi0JCQkgIGxpbnBlbmQgPSAoZmluZm8tPmxpbmVub3MKLQkJCQkgICAgICsgZW5jX2NvdW50ICogbGluZXN6KTsKLQkJCSAgb2Zmc2V0ID0gKG8tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJCQkgICAgKyBvLT5vdXRwdXRfb2Zmc2V0Ci0JCQkJICAgIC0gby0+dm1hKTsKLQkJCSAgZm9yIChsaW5wID0gZmluZm8tPmxpbmVub3MgKyBsaW5vZmYgKyBsaW5lc3o7Ci0JCQkgICAgICAgbGlucCA8IGxpbnBlbmQ7Ci0JCQkgICAgICAgbGlucCArPSBsaW5lc3opCi0JCQkgICAgewotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9faW4gKGlucHV0X2JmZCwgKFBUUikgbGlucCwKLQkJCQkJCSAgICAgICAoUFRSKSAmbGluKTsKLQkJCSAgICAgIGlmIChsaW4ubF9sbm5vID09IDApCi0JCQkJYnJlYWs7Ci0JCQkgICAgICBsaW4ubF9hZGRyLmxfcGFkZHIgKz0gb2Zmc2V0OwotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9saW5lbm9fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkJCShQVFIpICZsaW4sCi0JCQkJCQkJKFBUUikgbGlucCk7Ci0JCQkgICAgfQotCi0JCQkgIGNvdW50ID0gKGxpbnAgLSAoZmluZm8tPmxpbmVub3MgKyBsaW5vZmYpKSAvIGxpbmVzejsKLQotCQkJICBhdXgueF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyID0KLQkJCSAgICAoby0+b3V0cHV0X3NlY3Rpb24tPmxpbmVfZmlsZXBvcwotCQkJICAgICArIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKiBsaW5lc3opOwotCi0JCQkgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJCQkJYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0ciwKLQkJCQkJU0VFS19TRVQpICE9IDAKLQkJCSAgICAgIHx8IChiZmRfd3JpdGUgKGZpbmZvLT5saW5lbm9zICsgbGlub2ZmLAotCQkJCQkgICAgIGxpbmVzeiwgY291bnQsIG91dHB1dF9iZmQpCi0JCQkJICAhPSBsaW5lc3ogKiBjb3VudCkpCi0JCQkgICAgcmV0dXJuIGZhbHNlOwotCi0JCQkgIG8tPm91dHB1dF9zZWN0aW9uLT5saW5lbm9fY291bnQgKz0gY291bnQ7Ci0KLQkJCSAgaWYgKGluY2xzID4gMCkKLQkJCSAgICB7Ci0JCQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICppaXNwLCAqaWlzcGVuZDsKLQkJCSAgICAgIGxvbmcgKmlpbmRwOwotCQkJICAgICAgYmZkX2J5dGUgKm9vczsKLQkJCSAgICAgIGludCBpaWFkZDsKLQotCQkJICAgICAgLyogVXBkYXRlIGFueSBDX0JJTkNMIG9yIENfRUlOQ0wgc3ltYm9scwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCByZWZlciB0byBhIGxpbmUgbnVtYmVyIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Ugd2UganVzdCBvdXRwdXQuICAqLwotCQkJICAgICAgaWlzcCA9IGZpbmZvLT5pbnRlcm5hbF9zeW1zOwotCQkJICAgICAgaWlzcGVuZCA9IChpaXNwCi0JCQkJCSArIG9ial9yYXdfc3ltZW50X2NvdW50IChpbnB1dF9iZmQpKTsKLQkJCSAgICAgIGlpbmRwID0gZmluZm8tPnN5bV9pbmRpY2VzOwotCQkJICAgICAgb29zID0gZmluZm8tPm91dHN5bXM7Ci0JCQkgICAgICB3aGlsZSAoaWlzcCA8IGlpc3BlbmQpCi0JCQkJewotCQkJCSAgaWYgKCppaW5kcCA+PSAwCi0JCQkJICAgICAgJiYgKGlpc3AtPm5fc2NsYXNzID09IENfQklOQ0wKLQkJCQkJICB8fCBpaXNwLT5uX3NjbGFzcyA9PSBDX0VJTkNMKQotCQkJCSAgICAgICYmICgoYmZkX3NpemVfdHlwZSkgaWlzcC0+bl92YWx1ZQotCQkJCQkgID49IGVuY2xvc2luZy0+bGluZV9maWxlcG9zICsgbGlub2ZmKQotCQkJCSAgICAgICYmICgoYmZkX3NpemVfdHlwZSkgaWlzcC0+bl92YWx1ZQotCQkJCQkgIDwgKGVuY2xvc2luZy0+bGluZV9maWxlcG9zCi0JCQkJCSAgICAgKyBlbmNfY291bnQgKiBsaW5lc3opKSkKLQkJCQkgICAgewotCQkJCSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgaWlzOwotCi0JCQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1faW4gKG91dHB1dF9iZmQsCi0JCQkJCQkJICAgIChQVFIpIG9vcywKLQkJCQkJCQkgICAgKFBUUikgJmlpcyk7Ci0JCQkJICAgICAgaWlzLm5fdmFsdWUgPQotCQkJCQkoaWlzcC0+bl92YWx1ZQotCQkJCQkgLSBlbmNsb3NpbmctPmxpbmVfZmlsZXBvcwotCQkJCQkgLSBsaW5vZmYKLQkJCQkJICsgYXV4Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cik7Ci0JCQkJICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLAotCQkJCQkJCSAgICAgKFBUUikgJmlpcywKLQkJCQkJCQkgICAgIChQVFIpIG9vcyk7Ci0JCQkJICAgICAgLS1pbmNsczsKLQkJCQkgICAgfQotCi0JCQkJICBpaWFkZCA9IDEgKyBpaXNwLT5uX251bWF1eDsKLQkJCQkgIGlmICgqaWluZHAgPj0gMCkKLQkJCQkgICAgb29zICs9IGlpYWRkICogb3N5bWVzejsKLQkJCQkgIGlpc3AgKz0gaWlhZGQ7Ci0JCQkJICBpaW5kcCArPSBpaWFkZDsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0KLQkgICAgICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZhdXgsIGlzeW1wLT5uX3R5cGUsCi0JCQkJICAgICBpc3ltcC0+bl9zY2xhc3MsIGksIGlzeW1wLT5uX251bWF1eCwKLQkJCQkgICAgIChQVFIpIG91dHN5bSk7Ci0JICAgICAgb3V0c3ltICs9IG9zeW1lc3o7Ci0JICAgICAgZXN5bSArPSBpc3ltZXN6OwotCSAgICB9Ci0JfQotCi0gICAgICBpbmRleHAgKz0gYWRkOwotICAgICAgaXN5bXAgKz0gYWRkOwotICAgICAgY3NlY3RwcCArPSBhZGQ7Ci0gICAgfQotCi0gIC8qIElmIHdlIHN3YXBwZWQgb3V0IGEgQ19GSUxFIHN5bWJvbCwgZ3Vlc3MgdGhhdCB0aGUgbmV4dCBDX0ZJTEUKLSAgICAgc3ltYm9sIHdpbGwgYmUgdGhlIGZpcnN0IHN5bWJvbCBpbiB0aGUgbmV4dCBpbnB1dCBmaWxlLiAgSW4gdGhlCi0gICAgIG5vcm1hbCBjYXNlLCB0aGlzIHdpbGwgc2F2ZSB1cyBmcm9tIHdyaXRpbmcgb3V0IHRoZSBDX0ZJTEUgc3ltYm9sCi0gICAgIGFnYWluLiAgKi8KLSAgaWYgKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggIT0gLTEKLSAgICAgICYmIChiZmRfc2l6ZV90eXBlKSBmaW5mby0+bGFzdF9maWxlX2luZGV4ID49IHN5bWVudF9iYXNlKQotICAgIHsKLSAgICAgIGZpbmZvLT5sYXN0X2ZpbGUubl92YWx1ZSA9IG91dHB1dF9pbmRleDsKLSAgICAgIGJmZF9jb2ZmX3N3YXBfc3ltX291dCAob3V0cHV0X2JmZCwgKFBUUikgJmZpbmZvLT5sYXN0X2ZpbGUsCi0JCQkgICAgIChQVFIpIChmaW5mby0+b3V0c3ltcwotIAkJCQkgICAgKyAoKGZpbmZvLT5sYXN0X2ZpbGVfaW5kZXggLSBzeW1lbnRfYmFzZSkKLSAJCQkJICAgICAgICogb3N5bWVzeikpKTsKLSAgICB9Ci0KLSAgLyogV3JpdGUgdGhlIG1vZGlmaWVkIHN5bWJvbHMgdG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLSAgaWYgKG91dHN5bSA+IGZpbmZvLT5vdXRzeW1zKQotICAgIHsKLSAgICAgIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJICAgIG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkgKyBzeW1lbnRfYmFzZSAqIG9zeW1lc3osCi0JCSAgICBTRUVLX1NFVCkgIT0gMAotCSAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLAotCQkJb3V0cHV0X2JmZCkKLQkgICAgICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBCRkRfQVNTRVJUICgob2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpCi0JCSAgICsgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIG9zeW1lc3opCi0JCSAgPT0gb3V0cHV0X2luZGV4KTsKLQotICAgICAgb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpID0gb3V0cHV0X2luZGV4OwotICAgIH0KLQotICAvKiBEb24ndCBsZXQgdGhlIGxpbmtlciByZWxvY2F0aW9uIHJvdXRpbmVzIGRpc2NhcmQgdGhlIHN5bWJvbHMuICAqLwotICBrZWVwX3N5bXMgPSBvYmpfY29mZl9rZWVwX3N5bXMgKGlucHV0X2JmZCk7Ci0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoaW5wdXRfYmZkKSA9IHRydWU7Ci0KLSAgLyogUmVsb2NhdGUgdGhlIGNvbnRlbnRzIG9mIGVhY2ggc2VjdGlvbi4gICovCi0gIGZvciAobyA9IGlucHV0X2JmZC0+c2VjdGlvbnM7IG8gIT0gTlVMTDsgbyA9IG8tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmNvbnRlbnRzOwotCi0gICAgICBpZiAoISBvLT5saW5rZXJfbWFyaykKLQl7Ci0JICAvKiBUaGlzIHNlY3Rpb24gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbGluay4gICovCi0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICB8fCBvLT5fcmF3X3NpemUgPT0gMAotCSAgfHwgKG8tPmZsYWdzICYgU0VDX0lOX01FTU9SWSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgaGF2ZSBzZXQgZmlsZXBvcyBjb3JyZWN0bHkgZm9yIHRoZSBzZWN0aW9ucyB3ZSBjcmVhdGVkIHRvCi0gICAgICAgICByZXByZXNlbnQgY3NlY3RzLCBzbyBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgc2hvdWxkIHdvcmsuICAqLwotICAgICAgaWYgKGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pICE9IE5VTEwKLQkgICYmIGNvZmZfc2VjdGlvbl9kYXRhIChpbnB1dF9iZmQsIG8pLT5jb250ZW50cyAhPSBOVUxMKQotCWNvbnRlbnRzID0gY29mZl9zZWN0aW9uX2RhdGEgKGlucHV0X2JmZCwgbyktPmNvbnRlbnRzOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5wdXRfYmZkLCBvLCBmaW5mby0+Y29udGVudHMsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBvLT5fcmF3X3NpemUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBjb250ZW50cyA9IGZpbmZvLT5jb250ZW50czsKLQl9Ci0KLSAgICAgIGlmICgoby0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgaW50IHRhcmdldF9pbmRleDsKLQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50ZXJuYWxfcmVsb2NzOwotCSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotCSAgYmZkX3ZtYSBvZmZzZXQ7Ci0JICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWxlbmQ7Ci0JICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2g7Ci0JICBsb25nIHJfc3ltbmR4OwotCi0JICAvKiBSZWFkIGluIHRoZSByZWxvY3MuICAqLwotCSAgdGFyZ2V0X2luZGV4ID0gby0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLQkgIGludGVybmFsX3JlbG9jcyA9ICh4Y29mZl9yZWFkX2ludGVybmFsX3JlbG9jcwotCQkJICAgICAoaW5wdXRfYmZkLCBvLCBmYWxzZSwgZmluZm8tPmV4dGVybmFsX3JlbG9jcywKLQkJCSAgICAgIHRydWUsCi0JCQkgICAgICAoZmluZm8tPnNlY3Rpb25faW5mb1t0YXJnZXRfaW5kZXhdLnJlbG9jcwotCQkJICAgICAgICsgby0+b3V0cHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50KSkpOwotCSAgaWYgKGludGVybmFsX3JlbG9jcyA9PSBOVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgIC8qIENhbGwgcHJvY2Vzc29yIHNwZWNpZmljIGNvZGUgdG8gcmVsb2NhdGUgdGhlIHNlY3Rpb24KLSAgICAgICAgICAgICBjb250ZW50cy4gICovCi0JICBpZiAoISBiZmRfY29mZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBmaW5mby0+aW5mbywKLQkJCQkJICAgaW5wdXRfYmZkLCBvLAotCQkJCQkgICBjb250ZW50cywKLQkJCQkJICAgaW50ZXJuYWxfcmVsb2NzLAotCQkJCQkgICBmaW5mby0+aW50ZXJuYWxfc3ltcywKLQkJCQkJICAgeGNvZmZfZGF0YSAoaW5wdXRfYmZkKS0+Y3NlY3RzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBvZmZzZXQgPSBvLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgby0+b3V0cHV0X29mZnNldCAtIG8tPnZtYTsKLQkgIGlyZWwgPSBpbnRlcm5hbF9yZWxvY3M7Ci0JICBpcmVsZW5kID0gaXJlbCArIG8tPnJlbG9jX2NvdW50OwotCSAgcmVsX2hhc2ggPSAoZmluZm8tPnNlY3Rpb25faW5mb1t0YXJnZXRfaW5kZXhdLnJlbF9oYXNoZXMKLQkJICAgICAgKyBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCSAgZm9yICg7IGlyZWwgPCBpcmVsZW5kOyBpcmVsKyssIHJlbF9oYXNoKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoID0gTlVMTDsKLQkgICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0JICAgICAgYm9vbGVhbiBxdWlldDsKLQotCSAgICAgICpyZWxfaGFzaCA9IE5VTEw7Ci0KLQkgICAgICAvKiBBZGp1c3QgdGhlIHJlbG9jIGFkZHJlc3MgYW5kIHN5bWJvbCBpbmRleC4gICovCi0KLQkgICAgICBpcmVsLT5yX3ZhZGRyICs9IG9mZnNldDsKLQotCSAgICAgIHJfc3ltbmR4ID0gaXJlbC0+cl9zeW1uZHg7Ci0KLQkgICAgICBpZiAocl9zeW1uZHggPT0gLTEpCi0JCWggPSBOVUxMOwotCSAgICAgIGVsc2UKLQkJaCA9IG9ial94Y29mZl9zeW1faGFzaGVzIChpbnB1dF9iZmQpW3Jfc3ltbmR4XTsKLQotCSAgICAgIGlmIChyX3N5bW5keCAhPSAtMSAmJiBmaW5mby0+aW5mby0+c3RyaXAgIT0gc3RyaXBfYWxsKQotCQl7Ci0JCSAgaWYgKGggIT0gTlVMTAotCQkgICAgICAmJiBoLT5zbWNsYXMgIT0gWE1DX1RECi0JCSAgICAgICYmIChpcmVsLT5yX3R5cGUgPT0gUl9UT0MKLQkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfR0wKLQkJCSAgfHwgaXJlbC0+cl90eXBlID09IFJfVENMCi0JCQkgIHx8IGlyZWwtPnJfdHlwZSA9PSBSX1RSTAotCQkJICB8fCBpcmVsLT5yX3R5cGUgPT0gUl9UUkxBKSkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIFRPQyByZWxhdGl2ZSByZWxvYyB3aXRoIGEgc3ltYm9sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWQuICBUaGUgc3ltYm9sIHNob3VsZCBiZSB0aGUgb25lIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyByZWxvYyBpcyBmb3IuICBXZSB3YW50IHRvIG1ha2UgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgIHJlbG9jIGFnYWluc3QgdGhlIFRPQyBhZGRyZXNzIG9mIHRoZSBzeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbm90IHRoZSBzeW1ib2wgaXRzZWxmLiAgKi8KLQkJICAgICAgQkZEX0FTU0VSVCAoaC0+dG9jX3NlY3Rpb24gIT0gTlVMTCk7Ci0JCSAgICAgIEJGRF9BU1NFUlQgKChoLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpID09IDApOwotCQkgICAgICBpZiAoaC0+dS50b2NfaW5keCAhPSAtMSkKLQkJCWlyZWwtPnJfc3ltbmR4ID0gaC0+dS50b2NfaW5keDsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzdHJ1Y3QgeGNvZmZfdG9jX3JlbF9oYXNoICpuOwotCQkJICBzdHJ1Y3QgeGNvZmZfbGlua19zZWN0aW9uX2luZm8gKnNpOwotCi0JCQkgIG4gPSAoKHN0cnVjdCB4Y29mZl90b2NfcmVsX2hhc2ggKikKLQkJCSAgICAgICBiZmRfYWxsb2MgKGZpbmZvLT5vdXRwdXRfYmZkLAotCQkJCQkgIHNpemVvZiAoc3RydWN0IHhjb2ZmX3RvY19yZWxfaGFzaCkpKTsKLQkJCSAgaWYgKG4gPT0gTlVMTCkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIHNpID0gZmluZm8tPnNlY3Rpb25faW5mbyArIHRhcmdldF9pbmRleDsKLQkJCSAgbi0+bmV4dCA9IHNpLT50b2NfcmVsX2hhc2hlczsKLQkJCSAgbi0+aCA9IGg7Ci0JCQkgIG4tPnJlbCA9IGlyZWw7Ci0JCQkgIHNpLT50b2NfcmVsX2hhc2hlcyA9IG47Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgZ2xvYmFsIHN5bWJvbC4gICovCi0JCSAgICAgIGlmIChoLT5pbmR4ID49IDApCi0JCQlpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogVGhpcyBzeW1ib2wgaXMgYmVpbmcgd3JpdHRlbiBhdCB0aGUgZW5kCi0JCQkgICAgIG9mIHRoZSBmaWxlLCBhbmQgd2UgZG8gbm90IHlldCBrbm93IHRoZQotCQkJICAgICBzeW1ib2wgaW5kZXguICBXZSBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZQotCQkJICAgICBoYXNoIHRhYmxlIGVudHJ5IGluIHRoZSByZWxfaGFzaCBsaXN0LgotCQkJICAgICBXZSBzZXQgdGhlIGluZHggZmllbGQgdG8gLTIgdG8gaW5kaWNhdGUKLQkJCSAgICAgdGhhdCB0aGlzIHN5bWJvbCBtdXN0IG5vdCBiZSBzdHJpcHBlZC4gICovCi0JCQkgICpyZWxfaGFzaCA9IGg7Ci0JCQkgIGgtPmluZHggPSAtMjsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgaW5keDsKLQotCQkgICAgICBpbmR4ID0gZmluZm8tPnN5bV9pbmRpY2VzW3Jfc3ltbmR4XTsKLQotCQkgICAgICBpZiAoaW5keCA9PSAtMSkKLQkJCXsKLQkJCSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqaXM7Ci0KLQkJCSAgLyogUmVsb2NhdGlvbnMgYWdhaW5zdCBhIFRDMCBUT0MgYW5jaG9yIGFyZQotCQkJICAgICBhdXRvbWF0aWNhbGx5IHRyYW5zZm9ybWVkIHRvIGJlIGFnYWluc3QKLQkJCSAgICAgdGhlIFRPQyBhbmNob3IgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkJCSAgaXMgPSBmaW5mby0+aW50ZXJuYWxfc3ltcyArIHJfc3ltbmR4OwotCQkJICBpZiAoaXMtPm5fc2NsYXNzID09IENfSElERVhUCi0JCQkgICAgICAmJiBpcy0+bl9udW1hdXggPiAwKQotCQkJICAgIHsKLQkJCSAgICAgIFBUUiBhdXhwdHI7Ci0JCQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0JCQkgICAgICBhdXhwdHIgPSAoKFBUUikKLQkJCQkJKCgoYmZkX2J5dGUgKikKLQkJCQkJICBvYmpfY29mZl9leHRlcm5hbF9zeW1zIChpbnB1dF9iZmQpKQotCQkJCQkgKyAoKHJfc3ltbmR4ICsgaXMtPm5fbnVtYXV4KQotCQkJCQkgICAgKiBpc3ltZXN6KSkpOwotCQkJICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfaW4gKGlucHV0X2JmZCwgYXV4cHRyLAotCQkJCQkJICAgIGlzLT5uX3R5cGUsIGlzLT5uX3NjbGFzcywKLQkJCQkJCSAgICBpcy0+bl9udW1hdXggLSAxLAotCQkJCQkJICAgIGlzLT5uX251bWF1eCwKLQkJCQkJCSAgICAoUFRSKSAmYXV4KTsKLQkJCSAgICAgIGlmIChTTVRZUF9TTVRZUCAoYXV4LnhfY3NlY3QueF9zbXR5cCkgPT0gWFRZX1NECi0JCQkJICAmJiBhdXgueF9jc2VjdC54X3NtY2xhcyA9PSBYTUNfVEMwKQotCQkJCWluZHggPSBmaW5mby0+dG9jX3N5bWluZHg7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIGlmIChpbmR4ICE9IC0xKQotCQkJaXJlbC0+cl9zeW1uZHggPSBpbmR4OwotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKmlzOwotCQkJICBjb25zdCBjaGFyICpuYW1lOwotCQkJICBjaGFyIGJ1ZltTWU1OTUxFTiArIDFdOwotCi0JCQkgIC8qIFRoaXMgcmVsb2MgaXMgYWdhaW5zdCBhIHN5bWJvbCB3ZSBhcmUKLQkJCSAgICAgc3RyaXBwaW5nLiAgSXQgd291bGQgYmUgcG9zc2libGUgdG8gaGFuZGxlCi0JCQkgICAgIHRoaXMgY2FzZSwgYnV0IEkgZG9uJ3QgdGhpbmsgaXQncyB3b3J0aCBpdC4gICovCi0JCQkgIGlzID0gZmluZm8tPmludGVybmFsX3N5bXMgKyByX3N5bW5keDsKLQotCQkJICBuYW1lID0gKF9iZmRfY29mZl9pbnRlcm5hbF9zeW1lbnRfbmFtZQotCQkJCSAgKGlucHV0X2JmZCwgaXMsIGJ1ZikpOwotCQkJICBpZiAobmFtZSA9PSBOVUxMKQotCQkJICAgIHJldHVybiBmYWxzZTsKLQotCQkJICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCQkJCSAoZmluZm8tPmluZm8sIG5hbWUsIGlucHV0X2JmZCwgbywKLQkJCQkgIGlyZWwtPnJfdmFkZHIpKSkKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHF1aWV0ID0gZmFsc2U7Ci0JICAgICAgc3dpdGNoIChpcmVsLT5yX3R5cGUpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBpZiAoaCA9PSBOVUxMCi0JCSAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCQkgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JCSAgICBicmVhazsKLQkJICAvKiBGYWxsIHRocm91Z2guICAqLwotCQljYXNlIFJfUE9TOgotCQljYXNlIFJfTkVHOgotCQljYXNlIFJfUkw6Ci0JCWNhc2UgUl9STEE6Ci0JCSAgLyogVGhpcyByZWxvYyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgLmxvYWRlcgotCQkgICAgIHNlY3Rpb24uICAqLwotCQkgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotCQkgIGlmIChyX3N5bW5keCA9PSAtMSkKLQkJICAgIGxkcmVsLmxfc3ltbmR4ID0gLTE7Ci0JCSAgZWxzZSBpZiAoaCA9PSBOVUxMCi0JCQkgICB8fCAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWsKLQkJCSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pKQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc2VjOwotCi0JCSAgICAgIGlmIChoID09IE5VTEwpCi0JCQlzZWMgPSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT5jc2VjdHNbcl9zeW1uZHhdOwotCQkgICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pCi0JCQlzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotCQkgICAgICBlbHNlCi0JCQlzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JCSAgICAgIHNlYyA9IHNlYy0+b3V0cHV0X3NlY3Rpb247Ci0KLQkJICAgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotCQkJbGRyZWwubF9zeW1uZHggPSAwOwotCQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHNlYy0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLQkJCWxkcmVsLmxfc3ltbmR4ID0gMTsKLQkJICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWMtPm5hbWUsICIuYnNzIikgPT0gMCkKLQkJCWxkcmVsLmxfc3ltbmR4ID0gMjsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCi0JCQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksCi0JCQkgICAgIHNlYy0+bmFtZSk7Ci0JCQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCQkJICByZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISBmaW5mby0+aW5mby0+cmVsb2NhdGVhYmxlCi0JCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSA9PSAwCi0JCQkgICYmIChoLT5mbGFncyAmIFhDT0ZGX0lNUE9SVCkgPT0gMCkKLQkJCXsKLQkJCSAgLyogV2UgYWxyZWFkeSBjYWxsZWQgdGhlIHVuZGVmaW5lZF9zeW1ib2wKLQkJCSAgICAgY2FsbGJhY2sgZm9yIHRoaXMgcmVsb2NhdGlvbiwgaW4KLQkJCSAgICAgX2JmZF9wcGNfeGNvZmZfcmVsb2NhdGVfc2VjdGlvbi4gIERvbid0Ci0JCQkgICAgIGlzc3VlIGFueSBtb3JlIHdhcm5pbmdzLiAgKi8KLQkJCSAgcXVpZXQgPSB0cnVlOwotCQkJfQotCQkgICAgICBpZiAoaC0+bGRpbmR4IDwgMCAmJiAhIHF1aWV0KQotCQkJewotCQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJCSAgICAoXygiJXM6IGAlcycgaW4gbG9hZGVyIHJlbG9jIGJ1dCBub3QgbG9hZGVyIHN5bSIpLAotCQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkJCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCQkgIHJldHVybiBmYWxzZTsKLQkJCX0KLQkJICAgICAgbGRyZWwubF9zeW1uZHggPSBoLT5sZGluZHg7Ci0JCSAgICB9Ci0JCSAgbGRyZWwubF9ydHlwZSA9IChpcmVsLT5yX3NpemUgPDwgOCkgfCBpcmVsLT5yX3R5cGU7Ci0JCSAgbGRyZWwubF9yc2Vjbm0gPSBvLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotCQkgIGlmICh4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnRleHRybwotCQkgICAgICAmJiBzdHJjbXAgKG8tPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLnRleHQiKSA9PSAwCi0JCSAgICAgICYmICEgcXVpZXQpCi0JCSAgICB7Ci0JCSAgICAgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCQkJKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gcmVhZC1vbmx5IHNlY3Rpb24gJXMiKSwKLQkJCSBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLAotCQkJIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChmaW5mby0+b3V0cHV0X2JmZCwKLQkJCQkJICAgICAgIG8tPm91dHB1dF9zZWN0aW9uKSk7Ci0JCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbik7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLAotCQkJCQlmaW5mby0+bGRyZWwpOwotCQkgIEJGRF9BU1NFUlQgKHNpemVvZiAoc3RydWN0IGV4dGVybmFsX2xkcmVsKSA9PSBMRFJFTFNaKTsKLQkJICArK2ZpbmZvLT5sZHJlbDsKLQkJICBicmVhazsKLQotCQljYXNlIFJfVE9DOgotCQljYXNlIFJfR0w6Ci0JCWNhc2UgUl9UQ0w6Ci0JCWNhc2UgUl9UUkw6Ci0JCWNhc2UgUl9UUkxBOgotCQkgIC8qIFdlIHNob3VsZCBuZXZlciBuZWVkIGEgLmxvYWRlciByZWxvYyBmb3IgYSBUT0MKLQkJICAgICByZWxhdGl2ZSByZWxvYy4gICovCi0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBvLT5vdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQgKz0gby0+cmVsb2NfY291bnQ7Ci0JfQotCi0gICAgICAvKiBXcml0ZSBvdXQgdGhlIG1vZGlmaWVkIHNlY3Rpb24gY29udGVudHMuICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvLT5vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICAgICBjb250ZW50cywgby0+b3V0cHV0X29mZnNldCwKLQkJCQkgICAgICAoby0+X2Nvb2tlZF9zaXplICE9IDAKLQkJCQkgICAgICAgPyBvLT5fY29va2VkX3NpemUKLQkJCQkgICAgICAgOiBvLT5fcmF3X3NpemUpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIG9ial9jb2ZmX2tlZXBfc3ltcyAoaW5wdXRfYmZkKSA9IGtlZXBfc3ltczsKLQotICBpZiAoISBmaW5mby0+aW5mby0+a2VlcF9tZW1vcnkpCi0gICAgewotICAgICAgaWYgKCEgX2JmZF9jb2ZmX2ZyZWVfc3ltYm9scyAoaW5wdXRfYmZkKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jdW5kZWYgTl9UTUFTSwotI3VuZGVmIE5fQlRTSEZUCi0KLS8qIFdyaXRlIG91dCBhIG5vbi1YQ09GRiBnbG9iYWwgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3dyaXRlX2dsb2JhbF9zeW1ib2wgKGgsIHApCi0gICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbyA9IChzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICopIHA7Ci0gIGJmZCAqb3V0cHV0X2JmZDsKLSAgYmZkX2J5dGUgKm91dHN5bTsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBpc3ltOwotICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgYXV4OwotCi0gIG91dHB1dF9iZmQgPSBmaW5mby0+b3V0cHV0X2JmZDsKLSAgb3V0c3ltID0gZmluZm8tPm91dHN5bXM7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgd2FzIGdhcmJhZ2UgY29sbGVjdGVkLCBqdXN0IHNraXAgaXQuICAqLwotICBpZiAoeGNvZmZfaGFzaF90YWJsZSAoZmluZm8tPmluZm8pLT5nYwotICAgICAgJiYgKGgtPmZsYWdzICYgWENPRkZfTUFSSykgPT0gMCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3ZSBuZWVkIGEgLmxvYWRlciBzZWN0aW9uIGVudHJ5LCB3cml0ZSBpdCBvdXQuICAqLwotICBpZiAoaC0+bGRzeW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRzeW0gKmxkc3ltOwotICAgICAgYmZkICppbXBiZmQ7Ci0KLSAgICAgIGxkc3ltID0gaC0+bGRzeW07Ci0KLSAgICAgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmd2VhaykKLQl7Ci0JICBsZHN5bS0+bF92YWx1ZSA9IDA7Ci0JICBsZHN5bS0+bF9zY251bSA9IE5fVU5ERUY7Ci0JICBsZHN5bS0+bF9zbXR5cGUgPSBYVFlfRVI7Ci0JICBpbXBiZmQgPSBoLT5yb290LnUudW5kZWYuYWJmZDsKLQl9Ci0gICAgICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgIHx8IGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZndlYWspCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotCSAgbGRzeW0tPmxfdmFsdWUgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCQkgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJCSAgICArIGgtPnJvb3QudS5kZWYudmFsdWUpOwotCSAgbGRzeW0tPmxfc2NudW0gPSBzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBsZHN5bS0+bF9zbXR5cGUgPSBYVFlfU0Q7Ci0JICBpbXBiZmQgPSBzZWMtPm93bmVyOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKCgoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfUkVHVUxBUikgPT0gMAotCSAgICYmIChoLT5mbGFncyAmIFhDT0ZGX0RFRl9EWU5BTUlDKSAhPSAwKQotCSAgfHwgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQotCWxkc3ltLT5sX3NtdHlwZSB8PSBMX0lNUE9SVDsKLSAgICAgIGlmICgoKGgtPmZsYWdzICYgWENPRkZfREVGX1JFR1VMQVIpICE9IDAKLQkgICAmJiAoaC0+ZmxhZ3MgJiBYQ09GRl9ERUZfRFlOQU1JQykgIT0gMCkKLQkgIHx8IChoLT5mbGFncyAmIFhDT0ZGX0VYUE9SVCkgIT0gMCkKLQlsZHN5bS0+bF9zbXR5cGUgfD0gTF9FWFBPUlQ7Ci0gICAgICBpZiAoKGgtPmZsYWdzICYgWENPRkZfRU5UUlkpICE9IDApCi0JbGRzeW0tPmxfc210eXBlIHw9IExfRU5UUlk7Ci0KLSAgICAgIGxkc3ltLT5sX3NtY2xhcyA9IGgtPnNtY2xhczsKLQotICAgICAgaWYgKGxkc3ltLT5sX2lmaWxlID09IChiZmRfc2l6ZV90eXBlKSAtMSkKLQlsZHN5bS0+bF9pZmlsZSA9IDA7Ci0gICAgICBlbHNlIGlmIChsZHN5bS0+bF9pZmlsZSA9PSAwKQotCXsKLQkgIGlmICgobGRzeW0tPmxfc210eXBlICYgTF9JTVBPUlQpID09IDApCi0JICAgIGxkc3ltLT5sX2lmaWxlID0gMDsKLQkgIGVsc2UgaWYgKGltcGJmZCA9PSBOVUxMKQotCSAgICBsZHN5bS0+bF9pZmlsZSA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBCRkRfQVNTRVJUIChpbXBiZmQtPnh2ZWMgPT0gb3V0cHV0X2JmZC0+eHZlYyk7Ci0JICAgICAgbGRzeW0tPmxfaWZpbGUgPSB4Y29mZl9kYXRhIChpbXBiZmQpLT5pbXBvcnRfZmlsZV9pZDsKLQkgICAgfQotCX0KLQotICAgICAgbGRzeW0tPmxfcGFybSA9IDA7Ci0KLSAgICAgIEJGRF9BU1NFUlQgKGgtPmxkaW5keCA+PSAwKTsKLSAgICAgIEJGRF9BU1NFUlQgKExEU1lNU1ogPT0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfbGRzeW0pKTsKLSAgICAgIHhjb2ZmX3N3YXBfbGRzeW1fb3V0IChvdXRwdXRfYmZkLCBsZHN5bSwgZmluZm8tPmxkc3ltICsgaC0+bGRpbmR4IC0gMyk7Ci0gICAgICBoLT5sZHN5bSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgc3ltYm9sIG5lZWRzIGdsb2JhbCBsaW5rYWdlIGNvZGUsIHdyaXRlIGl0IG91dC4gICovCi0gIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uCi0JICA9PSB4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmxpbmthZ2Vfc2VjdGlvbikpCi0gICAgewotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBiZmRfdm1hIHRvY29mZjsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotCi0gICAgICBwID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uLT5jb250ZW50cyArIGgtPnJvb3QudS5kZWYudmFsdWU7Ci0KLSAgICAgIC8qIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGUgZ2xvYmFsIGxpbmthZ2UgY29kZSBsb2FkcyBhCi0gICAgICAgICBzcGVjaWZpYyBUT0MgZWxlbWVudC4gICovCi0gICAgICB0b2NvZmYgPSAoaC0+ZGVzY3JpcHRvci0+dG9jX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJKyBoLT5kZXNjcmlwdG9yLT50b2Nfc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCQktIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2MpOwotICAgICAgaWYgKChoLT5kZXNjcmlwdG9yLT5mbGFncyAmIFhDT0ZGX1NFVF9UT0MpICE9IDApCi0JdG9jb2ZmICs9IGgtPmRlc2NyaXB0b3ItPnUudG9jX29mZnNldDsKLSAgICAgIGJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIFhDT0ZGX0dMSU5LX0ZJUlNUIHwgKHRvY29mZiAmIDB4ZmZmZiksIHApOwotICAgICAgZm9yIChpID0gMCwgcCArPSA0OwotCSAgIGkgPCBzaXplb2YgeGNvZmZfZ2xpbmtfY29kZSAvIHNpemVvZiB4Y29mZl9nbGlua19jb2RlWzBdOwotCSAgIGkrKywgcCArPSA0KQotCWJmZF9wdXRfMzIgKG91dHB1dF9iZmQsIHhjb2ZmX2dsaW5rX2NvZGVbaV0sIHApOwotICAgIH0KLQotICAvKiBJZiB3ZSBjcmVhdGVkIGEgVE9DIGVudHJ5IGZvciB0aGlzIHN5bWJvbCwgd3JpdGUgb3V0IHRoZSByZXF1aXJlZAotICAgICByZWxvY3MuICAqLwotICBpZiAoKGgtPmZsYWdzICYgWENPRkZfU0VUX1RPQykgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqdG9jc2VjOwotICAgICAgYXNlY3Rpb24gKm9zZWM7Ci0gICAgICBpbnQgb2luZHg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmlyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IGlyc3ltOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IGlyYXV4OwotCi0gICAgICB0b2NzZWMgPSBoLT50b2Nfc2VjdGlvbjsKLSAgICAgIG9zZWMgPSB0b2NzZWMtPm91dHB1dF9zZWN0aW9uOwotICAgICAgb2luZHggPSBvc2VjLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpcmVsID0gZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsb2NzICsgb3NlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBpcmVsLT5yX3ZhZGRyID0gKG9zZWMtPnZtYQotCQkgICAgICAgKyB0b2NzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+dS50b2Nfb2Zmc2V0KTsKLSAgICAgIGlmIChoLT5pbmR4ID49IDApCi0JaXJlbC0+cl9zeW1uZHggPSBoLT5pbmR4OwotICAgICAgZWxzZQotCXsKLQkgIGgtPmluZHggPSAtMjsKLQkgIGlyZWwtPnJfc3ltbmR4ID0gb2JqX3Jhd19zeW1lbnRfY291bnQgKG91dHB1dF9iZmQpOwotCX0KLSAgICAgIGlyZWwtPnJfdHlwZSA9IFJfUE9TOwotICAgICAgaXJlbC0+cl9zaXplID0gMzE7Ci0gICAgICBmaW5mby0+c2VjdGlvbl9pbmZvW29pbmR4XS5yZWxfaGFzaGVzW29zZWMtPnJlbG9jX2NvdW50XSA9IE5VTEw7Ci0gICAgICArK29zZWMtPnJlbG9jX2NvdW50OwotCi0gICAgICBCRkRfQVNTRVJUIChoLT5sZGluZHggPj0gMCk7Ci0gICAgICBsZHJlbC5sX3ZhZGRyID0gaXJlbC0+cl92YWRkcjsKLSAgICAgIGxkcmVsLmxfc3ltbmR4ID0gaC0+bGRpbmR4OwotICAgICAgbGRyZWwubF9ydHlwZSA9ICgzMSA8PCA4KSB8IFJfUE9TOwotICAgICAgbGRyZWwubF9yc2Vjbm0gPSBvaW5keDsKLSAgICAgIHhjb2ZmX3N3YXBfbGRyZWxfb3V0IChvdXRwdXRfYmZkLCAmbGRyZWwsIGZpbmZvLT5sZHJlbCk7Ci0gICAgICArK2ZpbmZvLT5sZHJlbDsKLQotICAgICAgLyogV2UgbmVlZCB0byBlbWl0IGEgc3ltYm9sIHRvIGRlZmluZSBhIGNzZWN0IHdoaWNoIGhvbGRzIHRoZQotICAgICAgICAgcmVsb2MuICAqLwotICAgICAgaWYgKGZpbmZvLT5pbmZvLT5zdHJpcCAhPSBzdHJpcF9hbGwpCi0JewotCSAgaWYgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgPD0gU1lNTk1MRU4pCi0JICAgIHN0cm5jcHkgKGlyc3ltLl9uLl9uX25hbWUsIGgtPnJvb3Qucm9vdC5zdHJpbmcsIFNZTU5NTEVOKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJvb2xlYW4gaGFzaDsKLQkgICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLQkgICAgICBoYXNoID0gdHJ1ZTsKLQkgICAgICBpZiAoKG91dHB1dF9iZmQtPmZsYWdzICYgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCkgIT0gMCkKLQkJaGFzaCA9IGZhbHNlOwotCSAgICAgIGluZHggPSBfYmZkX3N0cmluZ3RhYl9hZGQgKGZpbmZvLT5zdHJ0YWIsIGgtPnJvb3Qucm9vdC5zdHJpbmcsCi0JCQkJCSBoYXNoLCBmYWxzZSk7Ci0JICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaXJzeW0uX24uX25fbi5fbl96ZXJvZXMgPSAwOwotCSAgICAgIGlyc3ltLl9uLl9uX24uX25fb2Zmc2V0ID0gU1RSSU5HX1NJWkVfU0laRSArIGluZHg7Ci0JICAgIH0KLQotCSAgaXJzeW0ubl92YWx1ZSA9IGlyZWwtPnJfdmFkZHI7Ci0JICBpcnN5bS5uX3NjbnVtID0gb3NlYy0+dGFyZ2V0X2luZGV4OwotCSAgaXJzeW0ubl9zY2xhc3MgPSBDX0hJREVYVDsKLQkgIGlyc3ltLm5fdHlwZSA9IFRfTlVMTDsKLQkgIGlyc3ltLm5fbnVtYXV4ID0gMTsKLQotCSAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXJzeW0sIChQVFIpIG91dHN5bSk7Ci0JICBvdXRzeW0gKz0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotCSAgbWVtc2V0ICgmaXJhdXgsIDAsIHNpemVvZiBpcmF1eCk7Ci0JICBpcmF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfU0Q7Ci0JICBpcmF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSA0OwotCSAgaXJhdXgueF9jc2VjdC54X3NtY2xhcyA9IFhNQ19UQzsKLQotCSAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXJhdXgsIFRfTlVMTCwgQ19ISURFWFQsCi0JCQkJIDAsIDEsIChQVFIpIG91dHN5bSk7Ci0JICBvdXRzeW0gKz0gYmZkX2NvZmZfYXV4ZXN6IChvdXRwdXRfYmZkKTsKLQotCSAgaWYgKGgtPmluZHggPj0gMCkKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZW4ndCBnb2luZyB0byB3cml0ZSBvdXQgdGhlIHN5bWJvbHMgYmVsb3csIHNvIHdlCi0JCSBuZWVkIHRvIHdyaXRlIHRoZW0gb3V0IG5vdy4gICovCi0JICAgICAgaWYgKGJmZF9zZWVrIChvdXRwdXRfYmZkLAotCQkJICAgIChvYmpfc3ltX2ZpbGVwb3MgKG91dHB1dF9iZmQpCi0JCQkgICAgICsgKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkJCSogYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKSkpLAotCQkJICAgIFNFRUtfU0VUKSAhPSAwCi0JCSAgfHwgKGJmZF93cml0ZSAoZmluZm8tPm91dHN5bXMsIG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zLCAxLAotCQkJCSBvdXRwdXRfYmZkKQotCQkgICAgICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgKz0KLQkJKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSAvIGJmZF9jb2ZmX3N5bWVzeiAob3V0cHV0X2JmZCk7Ci0KLQkgICAgICBvdXRzeW0gPSBmaW5mby0+b3V0c3ltczsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgYSBzcGVjaWFsbHkgZGVmaW5lZCBmdW5jdGlvbiBkZXNjcmlwdG9yLCB3cml0ZQotICAgICBpdCBvdXQuICBUaGUgZmlyc3Qgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gY29kZQotICAgICBpdHNlbGYsIHRoZSBzZWNvbmQgd29yZCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgVE9DLCBhbmQgdGhlIHRoaXJkCi0gICAgIHdvcmQgaXMgemVyby4gICovCi0gIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9ERVNDUklQVE9SKSAhPSAwCi0gICAgICAmJiBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0gICAgICAmJiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uCi0JICA9PSB4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPmRlc2NyaXB0b3Jfc2VjdGlvbikpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgIGFzZWN0aW9uICpvc2VjOwotICAgICAgaW50IG9pbmR4OwotICAgICAgYmZkX2J5dGUgKnA7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoZW50cnk7Ci0gICAgICBhc2VjdGlvbiAqZXNlYzsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaXJlbDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9sZHJlbCBsZHJlbDsKLSAgICAgIGFzZWN0aW9uICp0c2VjOwotCi0gICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0gICAgICBvc2VjID0gc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgICAgIG9pbmR4ID0gb3NlYy0+dGFyZ2V0X2luZGV4OwotICAgICAgcCA9IHNlYy0+Y29udGVudHMgKyBoLT5yb290LnUuZGVmLnZhbHVlOwotCi0gICAgICBoZW50cnkgPSBoLT5kZXNjcmlwdG9yOwotICAgICAgQkZEX0FTU0VSVCAoaGVudHJ5ICE9IE5VTEwKLQkJICAmJiAoaGVudHJ5LT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JCSAgICAgIHx8IGhlbnRyeS0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykpOwotICAgICAgZXNlYyA9IGhlbnRyeS0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwKLQkJICAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICArIGVzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgKyBoZW50cnktPnJvb3QudS5kZWYudmFsdWUpLAotCQkgIHApOwotCi0gICAgICBpcmVsID0gZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsb2NzICsgb3NlYy0+cmVsb2NfY291bnQ7Ci0gICAgICBpcmVsLT5yX3ZhZGRyID0gKG9zZWMtPnZtYQotCQkgICAgICAgKyBzZWMtPm91dHB1dF9vZmZzZXQKLQkJICAgICAgICsgaC0+cm9vdC51LmRlZi52YWx1ZSk7Ci0gICAgICBpcmVsLT5yX3N5bW5keCA9IGVzZWMtPm91dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBpcmVsLT5yX3R5cGUgPSBSX1BPUzsKLSAgICAgIGlyZWwtPnJfc2l6ZSA9IDMxOwotICAgICAgZmluZm8tPnNlY3Rpb25faW5mb1tvaW5keF0ucmVsX2hhc2hlc1tvc2VjLT5yZWxvY19jb3VudF0gPSBOVUxMOwotICAgICAgKytvc2VjLT5yZWxvY19jb3VudDsKLQotICAgICAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0gICAgICBpZiAoc3RyY21wIChlc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDA7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGVzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIuYnNzIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDI7Ci0gICAgICBlbHNlCi0JewotCSAgKCpfYmZkX2Vycm9yX2hhbmRsZXIpCi0JICAgIChfKCIlczogbG9hZGVyIHJlbG9jIGluIHVucmVjb2duaXplZCBzZWN0aW9uIGAlcyciKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG91dHB1dF9iZmQpLAotCSAgICAgZXNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbGRyZWwubF9ydHlwZSA9ICgzMSA8PCA4KSB8IFJfUE9TOwotICAgICAgbGRyZWwubF9yc2Vjbm0gPSBvaW5keDsKLSAgICAgIHhjb2ZmX3N3YXBfbGRyZWxfb3V0IChvdXRwdXRfYmZkLCAmbGRyZWwsIGZpbmZvLT5sZHJlbCk7Ci0gICAgICArK2ZpbmZvLT5sZHJlbDsKLQotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgeGNvZmZfZGF0YSAob3V0cHV0X2JmZCktPnRvYywgcCArIDQpOwotCi0gICAgICB0c2VjID0gY29mZl9zZWN0aW9uX2Zyb21fYmZkX2luZGV4IChvdXRwdXRfYmZkLAotCQkJCQkgIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT5zbnRvYyk7Ci0KLSAgICAgICsraXJlbDsKLSAgICAgIGlyZWwtPnJfdmFkZHIgPSAob3NlYy0+dm1hCi0JCSAgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlCi0JCSAgICAgICArIDQpOwotICAgICAgaXJlbC0+cl9zeW1uZHggPSB0c2VjLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgaXJlbC0+cl90eXBlID0gUl9QT1M7Ci0gICAgICBpcmVsLT5yX3NpemUgPSAzMTsKLSAgICAgIGZpbmZvLT5zZWN0aW9uX2luZm9bb2luZHhdLnJlbF9oYXNoZXNbb3NlYy0+cmVsb2NfY291bnRdID0gTlVMTDsKLSAgICAgICsrb3NlYy0+cmVsb2NfY291bnQ7Ci0KLSAgICAgIGxkcmVsLmxfdmFkZHIgPSBpcmVsLT5yX3ZhZGRyOwotICAgICAgaWYgKHN0cmNtcCAodHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsICIudGV4dCIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wICh0c2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSwgIi5kYXRhIikgPT0gMCkKLQlsZHJlbC5sX3N5bW5keCA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lLCAiLmJzcyIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAyOwotICAgICAgZWxzZQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGxvYWRlciByZWxvYyBpbiB1bnJlY29nbml6ZWQgc2VjdGlvbiBgJXMnIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChvdXRwdXRfYmZkKSwKLQkgICAgIHRzZWMtPm91dHB1dF9zZWN0aW9uLT5uYW1lKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub25yZXByZXNlbnRhYmxlX3NlY3Rpb24pOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGxkcmVsLmxfcnR5cGUgPSAoMzEgPDwgOCkgfCBSX1BPUzsKLSAgICAgIGxkcmVsLmxfcnNlY25tID0gb2luZHg7Ci0gICAgICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICAgICAgKytmaW5mby0+bGRyZWw7Ci0gICAgfQotCi0gIGlmIChoLT5pbmR4ID49IDAgfHwgZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbCkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChvdXRzeW0gPT0gZmluZm8tPm91dHN5bXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoZmluZm8tPmluZm8tPnN0cmlwID09IHN0cmlwX2FsbAotCSAgfHwgKGZpbmZvLT5pbmZvLT5zdHJpcCA9PSBzdHJpcF9zb21lCi0JICAgICAgJiYgKGJmZF9oYXNoX2xvb2t1cCAoZmluZm8tPmluZm8tPmtlZXBfaGFzaCwKLQkJCQkgICBoLT5yb290LnJvb3Quc3RyaW5nLCBmYWxzZSwgZmFsc2UpCi0JCSAgPT0gTlVMTCkpKSkKLSAgICB7Ci0gICAgICBCRkRfQVNTRVJUIChvdXRzeW0gPT0gZmluZm8tPm91dHN5bXMpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChoLT5pbmR4ICE9IC0yCi0gICAgICAmJiAoaC0+ZmxhZ3MgJiAoWENPRkZfUkVGX1JFR1VMQVIgfCBYQ09GRl9ERUZfUkVHVUxBUikpID09IDApCi0gICAgewotICAgICAgQkZEX0FTU0VSVCAob3V0c3ltID09IGZpbmZvLT5vdXRzeW1zKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBtZW1zZXQgKCZhdXgsIDAsIHNpemVvZiBhdXgpOwotCi0gIGgtPmluZHggPSBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCk7Ci0KLSAgaWYgKHN0cmxlbiAoaC0+cm9vdC5yb290LnN0cmluZykgPD0gU1lNTk1MRU4pCi0gICAgc3RybmNweSAoaXN5bS5fbi5fbl9uYW1lLCBoLT5yb290LnJvb3Quc3RyaW5nLCBTWU1OTUxFTik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBib29sZWFuIGhhc2g7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGluZHg7Ci0KLSAgICAgIGhhc2ggPSB0cnVlOwotICAgICAgaWYgKChvdXRwdXRfYmZkLT5mbGFncyAmIEJGRF9UUkFESVRJT05BTF9GT1JNQVQpICE9IDApCi0JaGFzaCA9IGZhbHNlOwotICAgICAgaW5keCA9IF9iZmRfc3RyaW5ndGFiX2FkZCAoZmluZm8tPnN0cnRhYiwgaC0+cm9vdC5yb290LnN0cmluZywgaGFzaCwKLQkJCQkgZmFsc2UpOwotICAgICAgaWYgKGluZHggPT0gKGJmZF9zaXplX3R5cGUpIC0xKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlzeW0uX24uX25fbi5fbl96ZXJvZXMgPSAwOwotICAgICAgaXN5bS5fbi5fbl9uLl9uX29mZnNldCA9IFNUUklOR19TSVpFX1NJWkUgKyBpbmR4OwotICAgIH0KLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0gICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZndlYWspCi0gICAgewotICAgICAgaXN5bS5uX3ZhbHVlID0gMDsKLSAgICAgIGlzeW0ubl9zY251bSA9IE5fVU5ERUY7Ci0gICAgICBpc3ltLm5fc2NsYXNzID0gQ19FWFQ7Ci0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOwotICAgIH0KLSAgZWxzZSBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAmJiBoLT5zbWNsYXMgPT0gWE1DX1hPKQotICAgIHsKLSAgICAgIEJGRF9BU1NFUlQgKGJmZF9pc19hYnNfc2VjdGlvbiAoaC0+cm9vdC51LmRlZi5zZWN0aW9uKSk7Ci0gICAgICBpc3ltLm5fdmFsdWUgPSBoLT5yb290LnUuZGVmLnZhbHVlOwotICAgICAgaXN5bS5uX3NjbnVtID0gTl9VTkRFRjsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0VYVDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfRVI7Ci0gICAgfQotICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgeGNvZmZfbGlua19zaXplX2xpc3QgKmw7Ci0KLSAgICAgIGlzeW0ubl92YWx1ZSA9IChoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJICAgICAgKyBoLT5yb290LnUuZGVmLnZhbHVlKTsKLSAgICAgIGlzeW0ubl9zY251bSA9IGgtPnJvb3QudS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnRhcmdldF9pbmRleDsKLSAgICAgIGlzeW0ubl9zY2xhc3MgPSBDX0hJREVYVDsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc210eXAgPSBYVFlfU0Q7Ci0KLSAgICAgIGlmICgoaC0+ZmxhZ3MgJiBYQ09GRl9IQVNfU0laRSkgIT0gMCkKLQl7Ci0JICBmb3IgKGwgPSB4Y29mZl9oYXNoX3RhYmxlIChmaW5mby0+aW5mbyktPnNpemVfbGlzdDsKLQkgICAgICAgbCAhPSBOVUxMOwotCSAgICAgICBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmIChsLT5oID09IGgpCi0JCXsKLQkJICBhdXgueF9jc2VjdC54X3Njbmxlbi5sID0gbC0+c2l6ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHsKLSAgICAgIGlzeW0ubl92YWx1ZSA9IChoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICsgaC0+cm9vdC51LmMucC0+c2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICBpc3ltLm5fc2NudW0gPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotICAgICAgYXV4LnhfY3NlY3QueF9zbXR5cCA9IFhUWV9DTTsKLSAgICAgIGF1eC54X2NzZWN0Lnhfc2NubGVuLmwgPSBoLT5yb290LnUuYy5zaXplOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIGlzeW0ubl90eXBlID0gVF9OVUxMOwotICBpc3ltLm5fbnVtYXV4ID0gMTsKLQotICBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZpc3ltLCAoUFRSKSBvdXRzeW0pOwotICBvdXRzeW0gKz0gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICBhdXgueF9jc2VjdC54X3NtY2xhcyA9IGgtPnNtY2xhczsKLQotICBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKG91dHB1dF9iZmQsIChQVFIpICZhdXgsIFRfTlVMTCwgaXN5bS5uX3NjbGFzcywgMCwgMSwKLQkJCSAoUFRSKSBvdXRzeW0pOwotICBvdXRzeW0gKz0gYmZkX2NvZmZfYXV4ZXN6IChvdXRwdXRfYmZkKTsKLQotICBpZiAoKGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICB8fCBoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgaC0+c21jbGFzICE9IFhNQ19YTykKLSAgICB7Ci0gICAgICAvKiBXZSBqdXN0IG91dHB1dCBhbiBTRCBzeW1ib2wuICBOb3cgb3V0cHV0IGFuIExEIHN5bWJvbC4gICovCi0KLSAgICAgIGgtPmluZHggKz0gMjsKLQotICAgICAgaXN5bS5uX3NjbGFzcyA9IENfRVhUOwotICAgICAgYmZkX2NvZmZfc3dhcF9zeW1fb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmaXN5bSwgKFBUUikgb3V0c3ltKTsKLSAgICAgIG91dHN5bSArPSBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpOwotCi0gICAgICBhdXgueF9jc2VjdC54X3NtdHlwID0gWFRZX0xEOwotICAgICAgYXV4LnhfY3NlY3QueF9zY25sZW4ubCA9IG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKTsKLQotICAgICAgYmZkX2NvZmZfc3dhcF9hdXhfb3V0IChvdXRwdXRfYmZkLCAoUFRSKSAmYXV4LCBUX05VTEwsIENfRVhULCAwLCAxLAotCQkJICAgICAoUFRSKSBvdXRzeW0pOwotICAgICAgb3V0c3ltICs9IGJmZF9jb2ZmX2F1eGVzeiAob3V0cHV0X2JmZCk7Ci0gICAgfQotCi0gIGlmIChiZmRfc2VlayAob3V0cHV0X2JmZCwKLQkJKG9ial9zeW1fZmlsZXBvcyAob3V0cHV0X2JmZCkKLQkJICsgKG9ial9yYXdfc3ltZW50X2NvdW50IChvdXRwdXRfYmZkKQotCQkgICAgKiBiZmRfY29mZl9zeW1lc3ogKG91dHB1dF9iZmQpKSksCi0JCVNFRUtfU0VUKSAhPSAwCi0gICAgICB8fCAoYmZkX3dyaXRlIChmaW5mby0+b3V0c3ltcywgb3V0c3ltIC0gZmluZm8tPm91dHN5bXMsIDEsIG91dHB1dF9iZmQpCi0JICAhPSAoYmZkX3NpemVfdHlwZSkgKG91dHN5bSAtIGZpbmZvLT5vdXRzeW1zKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBvYmpfcmF3X3N5bWVudF9jb3VudCAob3V0cHV0X2JmZCkgKz0KLSAgICAob3V0c3ltIC0gZmluZm8tPm91dHN5bXMpIC8gYmZkX2NvZmZfc3ltZXN6IChvdXRwdXRfYmZkKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgbGluayBvcmRlciB3aGljaCBpcyBzdXBwb3NlZCB0byBnZW5lcmF0ZSBhIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXhjb2ZmX3JlbG9jX2xpbmtfb3JkZXIgKG91dHB1dF9iZmQsIGZpbmZvLCBvdXRwdXRfc2VjdGlvbiwgbGlua19vcmRlcikKLSAgICAgYmZkICpvdXRwdXRfYmZkOwotICAgICBzdHJ1Y3QgeGNvZmZfZmluYWxfbGlua19pbmZvICpmaW5mbzsKLSAgICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmxpbmtfb3JkZXI7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICpoOwotICBhc2VjdGlvbiAqaHNlYzsKLSAgYmZkX3ZtYSBodmFsOwotICBiZmRfdm1hIGFkZGVuZDsKLSAgc3RydWN0IGludGVybmFsX3JlbG9jICppcmVsOwotICBzdHJ1Y3QgeGNvZmZfbGlua19oYXNoX2VudHJ5ICoqcmVsX2hhc2hfcHRyOwotICBzdHJ1Y3QgaW50ZXJuYWxfbGRyZWwgbGRyZWw7Ci0KLSAgaWYgKGxpbmtfb3JkZXItPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcikKLSAgICB7Ci0gICAgICAvKiBXZSBuZWVkIHRvIHNvbWVob3cgbG9jYXRlIGEgc3ltYm9sIGluIHRoZSByaWdodCBzZWN0aW9uLiAgVGhlCi0gICAgICAgICBzeW1ib2wgbXVzdCBlaXRoZXIgaGF2ZSBhIHZhbHVlIG9mIHplcm8sIG9yIHdlIG11c3QgYWRqdXN0Ci0gICAgICAgICB0aGUgYWRkZW5kIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgRklYTUU6IFdyaXRlIHRoaXMKLSAgICAgICAgIHdoZW4gd2UgbmVlZCBpdC4gIFRoZSBvbGQgbGlua2VyIGNvdWxkbid0IGhhbmRsZSB0aGlzIGFueWhvdy4gICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIGxpbmtfb3JkZXItPnUucmVsb2MucC0+cmVsb2MpOwotICBpZiAoaG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaCA9ICgoc3RydWN0IHhjb2ZmX2xpbmtfaGFzaF9lbnRyeSAqKQotICAgICAgIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsIGZpbmZvLT5pbmZvLAotCQkJCSAgICAgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCQkJICAgICBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLSAgaWYgKGggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT51bmF0dGFjaGVkX3JlbG9jKQotCSAgICAgKGZpbmZvLT5pbmZvLCBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSwgKGJmZCAqKSBOVUxMLAotCSAgICAgIChhc2VjdGlvbiAqKSBOVUxMLCAoYmZkX3ZtYSkgMCkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotICAgIHsKLSAgICAgIGhzZWMgPSBoLT5yb290LnUuYy5wLT5zZWN0aW9uOwotICAgICAgaHZhbCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICB7Ci0gICAgICBoc2VjID0gaC0+cm9vdC51LmRlZi5zZWN0aW9uOwotICAgICAgaHZhbCA9IGgtPnJvb3QudS5kZWYudmFsdWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaHNlYyA9IE5VTEw7Ci0gICAgICBodmFsID0gMDsKLSAgICB9Ci0KLSAgYWRkZW5kID0gbGlua19vcmRlci0+dS5yZWxvYy5wLT5hZGRlbmQ7Ci0gIGlmIChoc2VjICE9IE5VTEwpCi0gICAgYWRkZW5kICs9IChoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JICAgICAgICsgaHNlYy0+b3V0cHV0X29mZnNldAotCSAgICAgICArIGh2YWwpOwotCi0gIGlmIChhZGRlbmQgIT0gMCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gICAgICBiZmRfYnl0ZSAqYnVmOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHJzdGF0OwotICAgICAgYm9vbGVhbiBvazsKLQotICAgICAgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pOwotICAgICAgYnVmID0gKGJmZF9ieXRlICopIGJmZF96bWFsbG9jIChzaXplKTsKLSAgICAgIGlmIChidWYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJzdGF0ID0gX2JmZF9yZWxvY2F0ZV9jb250ZW50cyAoaG93dG8sIG91dHB1dF9iZmQsIGFkZGVuZCwgYnVmKTsKLSAgICAgIHN3aXRjaCAocnN0YXQpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBpZiAoISAoKCpmaW5mby0+aW5mby0+Y2FsbGJhY2tzLT5yZWxvY19vdmVyZmxvdykKLQkJIChmaW5mby0+aW5mbywgbGlua19vcmRlci0+dS5yZWxvYy5wLT51Lm5hbWUsCi0JCSAgaG93dG8tPm5hbWUsIGFkZGVuZCwgKGJmZCAqKSBOVUxMLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJICAoYmZkX3ZtYSkgMCkpKQotCSAgICB7Ci0JICAgICAgZnJlZSAoYnVmKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIG9rID0gYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbiwgKFBUUikgYnVmLAotCQkJCSAgICAgKGZpbGVfcHRyKSBsaW5rX29yZGVyLT5vZmZzZXQsIHNpemUpOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICAgIGlmICghIG9rKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogU3RvcmUgdGhlIHJlbG9jIGluZm9ybWF0aW9uIGluIHRoZSByaWdodCBwbGFjZS4gIEl0IHdpbGwgZ2V0Ci0gICAgIHN3YXBwZWQgYW5kIHdyaXR0ZW4gb3V0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbmFsX2xpbmsgcm91dGluZS4gICovCi0KLSAgaXJlbCA9IChmaW5mby0+c2VjdGlvbl9pbmZvW291dHB1dF9zZWN0aW9uLT50YXJnZXRfaW5kZXhdLnJlbG9jcwotCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotICByZWxfaGFzaF9wdHIgPSAoZmluZm8tPnNlY3Rpb25faW5mb1tvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4XS5yZWxfaGFzaGVzCi0JCSAgKyBvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQpOwotCi0gIG1lbXNldCAoaXJlbCwgMCwgc2l6ZW9mIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpKTsKLSAgKnJlbF9oYXNoX3B0ciA9IE5VTEw7Ci0KLSAgaXJlbC0+cl92YWRkciA9IG91dHB1dF9zZWN0aW9uLT52bWEgKyBsaW5rX29yZGVyLT5vZmZzZXQ7Ci0KLSAgaWYgKGgtPmluZHggPj0gMCkKLSAgICBpcmVsLT5yX3N5bW5keCA9IGgtPmluZHg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIC0yIHRvIGZvcmNlIHRoaXMgc3ltYm9sIHRvIGdldCB3cml0dGVuIG91dC4gICovCi0gICAgICBoLT5pbmR4ID0gLTI7Ci0gICAgICAqcmVsX2hhc2hfcHRyID0gaDsKLSAgICAgIGlyZWwtPnJfc3ltbmR4ID0gMDsKLSAgICB9Ci0KLSAgaXJlbC0+cl90eXBlID0gaG93dG8tPnR5cGU7Ci0gIGlyZWwtPnJfc2l6ZSA9IGhvd3RvLT5iaXRzaXplIC0gMTsKLSAgaWYgKGhvd3RvLT5jb21wbGFpbl9vbl9vdmVyZmxvdyA9PSBjb21wbGFpbl9vdmVyZmxvd19zaWduZWQpCi0gICAgaXJlbC0+cl9zaXplIHw9IDB4ODA7Ci0KLSAgKytvdXRwdXRfc2VjdGlvbi0+cmVsb2NfY291bnQ7Ci0KLSAgLyogTm93IG91dHB1dCB0aGUgcmVsb2MgdG8gdGhlIC5sb2FkZXIgc2VjdGlvbi4gICovCi0KLSAgbGRyZWwubF92YWRkciA9IGlyZWwtPnJfdmFkZHI7Ci0KLSAgaWYgKGhzZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzZWNuYW1lOwotCi0gICAgICBzZWNuYW1lID0gaHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWU7Ci0KLSAgICAgIGlmIChzdHJjbXAgKHNlY25hbWUsICIudGV4dCIpID09IDApCi0JbGRyZWwubF9zeW1uZHggPSAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzZWNuYW1lLCAiLmRhdGEiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc2VjbmFtZSwgIi5ic3MiKSA9PSAwKQotCWxkcmVsLmxfc3ltbmR4ID0gMjsKLSAgICAgIGVsc2UKLQl7Ci0JICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkgICAgKF8oIiVzOiBsb2FkZXIgcmVsb2MgaW4gdW5yZWNvZ25pemVkIHNlY3Rpb24gYCVzJyIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksIHNlY25hbWUpOwotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChoLT5sZGluZHggPCAwKQotCXsKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IGAlcycgaW4gbG9hZGVyIHJlbG9jIGJ1dCBub3QgbG9hZGVyIHN5bSIpLAotCSAgICAgYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCksCi0JICAgICBoLT5yb290LnJvb3Quc3RyaW5nKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGxkcmVsLmxfc3ltbmR4ID0gaC0+bGRpbmR4OwotICAgIH0KLQotICBsZHJlbC5sX3J0eXBlID0gKGlyZWwtPnJfc2l6ZSA8PCA4KSB8IGlyZWwtPnJfdHlwZTsKLSAgbGRyZWwubF9yc2Vjbm0gPSBvdXRwdXRfc2VjdGlvbi0+dGFyZ2V0X2luZGV4OwotICB4Y29mZl9zd2FwX2xkcmVsX291dCAob3V0cHV0X2JmZCwgJmxkcmVsLCBmaW5mby0+bGRyZWwpOwotICArK2ZpbmZvLT5sZHJlbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU29ydCByZWxvY3MgYnkgVk1BLiAgVGhpcyBpcyBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAoteGNvZmZfc29ydF9yZWxvY3MgKHAxLCBwMikKLSAgICAgY29uc3QgUFRSIHAxOwotICAgICBjb25zdCBQVFIgcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcjEgPSAoY29uc3Qgc3RydWN0IGludGVybmFsX3JlbG9jICopIHAxOwotICBjb25zdCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnIyID0gKGNvbnN0IHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqKSBwMjsKLQotICBpZiAocjEtPnJfdmFkZHIgPiByMi0+cl92YWRkcikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAocjEtPnJfdmFkZHIgPCByMi0+cl92YWRkcikKLSAgICByZXR1cm4gLTE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyB0aGUgcmVsb2NhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIFJTLzYwMDAvUE9XRVIvUG93ZXJQQy4KLSAgIFRoaXMgaXMgY3VycmVudGx5IHRoZSBvbmx5IHByb2Nlc3NvciB3aGljaCB1c2VzIFhDT0ZGOyBJIGhvcGUgdGhhdAotICAgd2lsbCBuZXZlciBjaGFuZ2UuICAqLwotCi1ib29sZWFuCi1fYmZkX3BwY194Y29mZl9yZWxvY2F0ZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBpbmZvLCBpbnB1dF9iZmQsCi0JCQkJIGlucHV0X3NlY3Rpb24sIGNvbnRlbnRzLCByZWxvY3MsIHN5bXMsCi0JCQkJIHNlY3Rpb25zKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmlucHV0X2JmZDsKLSAgICAgYXNlY3Rpb24gKmlucHV0X3NlY3Rpb247Ci0gICAgIGJmZF9ieXRlICpjb250ZW50czsKLSAgICAgc3RydWN0IGludGVybmFsX3JlbG9jICpyZWxvY3M7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bXM7Ci0gICAgIGFzZWN0aW9uICoqc2VjdGlvbnM7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqcmVsOwotICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKnJlbGVuZDsKLQotICByZWwgPSByZWxvY3M7Ci0gIHJlbGVuZCA9IHJlbCArIGlucHV0X3NlY3Rpb24tPnJlbG9jX2NvdW50OwotICBmb3IgKDsgcmVsIDwgcmVsZW5kOyByZWwrKykKLSAgICB7Ci0gICAgICBsb25nIHN5bW5keDsKLSAgICAgIHN0cnVjdCB4Y29mZl9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW07Ci0gICAgICBiZmRfdm1hIGFkZGVuZDsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCBob3d0bzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSByc3RhdDsKLQotICAgICAgLyogUmVsb2NhdGlvbiB0eXBlIFJfUkVGIGlzIGEgc3BlY2lhbCByZWxvY2F0aW9uIHR5cGUgd2hpY2ggaXMKLSAgICAgICAgIG1lcmVseSB1c2VkIHRvIHByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uIGZyb20gb2NjdXJyaW5nIGZvcgotICAgICAgICAgdGhlIGNzZWN0IGluY2x1ZGluZyB0aGUgc3ltYm9sIHdoaWNoIGl0IHJlZmVyZW5jZXMuICAqLwotICAgICAgaWYgKHJlbC0+cl90eXBlID09IFJfUkVGKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW1uZHggPSByZWwtPnJfc3ltbmR4OwotCi0gICAgICBpZiAoc3ltbmR4ID09IC0xKQotCXsKLQkgIGggPSBOVUxMOwotCSAgc3ltID0gTlVMTDsKLQkgIGFkZGVuZCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsgICAgCi0JICBoID0gb2JqX3hjb2ZmX3N5bV9oYXNoZXMgKGlucHV0X2JmZClbc3ltbmR4XTsKLQkgIHN5bSA9IHN5bXMgKyBzeW1uZHg7Ci0JICBhZGRlbmQgPSAtIHN5bS0+bl92YWx1ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGJ1aWxkIHRoZSBob3d0byBpbmZvcm1hdGlvbiBvbiB0aGUgZmx5LiAgKi8KLQotICAgICAgaG93dG8udHlwZSA9IHJlbC0+cl90eXBlOwotICAgICAgaG93dG8ucmlnaHRzaGlmdCA9IDA7Ci0gICAgICBob3d0by5zaXplID0gMjsKLSAgICAgIGhvd3RvLmJpdHNpemUgPSAocmVsLT5yX3NpemUgJiAweDFmKSArIDE7Ci0gICAgICBob3d0by5wY19yZWxhdGl2ZSA9IGZhbHNlOwotICAgICAgaG93dG8uYml0cG9zID0gMDsKLSAgICAgIGlmICgocmVsLT5yX3NpemUgJiAweDgwKSAhPSAwKQotCWhvd3RvLmNvbXBsYWluX29uX292ZXJmbG93ID0gY29tcGxhaW5fb3ZlcmZsb3dfc2lnbmVkOwotICAgICAgZWxzZQotCWhvd3RvLmNvbXBsYWluX29uX292ZXJmbG93ID0gY29tcGxhaW5fb3ZlcmZsb3dfYml0ZmllbGQ7Ci0gICAgICBob3d0by5zcGVjaWFsX2Z1bmN0aW9uID0gTlVMTDsKLSAgICAgIGhvd3RvLm5hbWUgPSAiaW50ZXJuYWwiOwotICAgICAgaG93dG8ucGFydGlhbF9pbnBsYWNlID0gdHJ1ZTsKLSAgICAgIGlmIChob3d0by5iaXRzaXplID09IDMyKQotCWhvd3RvLnNyY19tYXNrID0gaG93dG8uZHN0X21hc2sgPSAweGZmZmZmZmZmOwotICAgICAgZWxzZQotCXsKLQkgIGhvd3RvLnNyY19tYXNrID0gaG93dG8uZHN0X21hc2sgPSAoMSA8PCBob3d0by5iaXRzaXplKSAtIDE7Ci0JICBpZiAoaG93dG8uYml0c2l6ZSA9PSAxNikKLQkgICAgaG93dG8uc2l6ZSA9IDE7Ci0JfQotICAgICAgaG93dG8ucGNyZWxfb2Zmc2V0ID0gZmFsc2U7Ci0KLSAgICAgIHZhbCA9IDA7Ci0KLSAgICAgIGlmIChoID09IE5VTEwpCi0JewotCSAgYXNlY3Rpb24gKnNlYzsKLQotCSAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgewotCSAgICAgIHNlYyA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2VjID0gc2VjdGlvbnNbc3ltbmR4XTsKLQkgICAgICAvKiBIYWNrIHRvIG1ha2Ugc3VyZSB3ZSB1c2UgdGhlIHJpZ2h0IFRPQyBhbmNob3IgdmFsdWUKLSAgICAgICAgICAgICAgICAgaWYgdGhpcyByZWxvYyBpcyBhZ2FpbnN0IHRoZSBUT0MgYW5jaG9yLiAgKi8KLQkgICAgICBpZiAoc2VjLT5uYW1lWzNdID09ICcwJwotCQkgICYmIHN0cmNtcCAoc2VjLT5uYW1lLCAiLnRjMCIpID09IDApCi0JCXZhbCA9IHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2M7Ci0JICAgICAgZWxzZQotCQl2YWwgPSAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+dm1hCi0JCSAgICAgICArIHNlYy0+b3V0cHV0X29mZnNldAotCQkgICAgICAgKyBzeW0tPm5fdmFsdWUKLQkJICAgICAgIC0gc2VjLT52bWEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChoLT5yb290LnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICAgICAgfHwgaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICAgewotCSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLQkgICAgICBzZWMgPSBoLT5yb290LnUuZGVmLnNlY3Rpb247Ci0JICAgICAgdmFsID0gKGgtPnJvb3QudS5kZWYudmFsdWUKLQkJICAgICArIHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaC0+cm9vdC50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IGgtPnJvb3QudS5jLnAtPnNlY3Rpb247Ci0JICAgICAgdmFsID0gKHNlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkgICAgICsgc2VjLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKGgtPmZsYWdzICYgWENPRkZfREVGX0RZTkFNSUMpICE9IDAKLQkJICAgfHwgKGgtPmZsYWdzICYgWENPRkZfSU1QT1JUKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogRXZlcnkgc3ltYm9sIGluIGEgc2hhcmVkIG9iamVjdCBpcyBkZWZpbmVkIHNvbWV3aGVyZS4gICovCi0JICAgICAgdmFsID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoISBpbmZvLT5yZWxvY2F0ZWFibGUpCi0JICAgIHsKLQkgICAgICBpZiAoISAoKCppbmZvLT5jYWxsYmFja3MtPnVuZGVmaW5lZF9zeW1ib2wpCi0JCSAgICAgKGluZm8sIGgtPnJvb3Qucm9vdC5zdHJpbmcsIGlucHV0X2JmZCwgaW5wdXRfc2VjdGlvbiwKLQkJICAgICAgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIC8qIERvbid0IHRyeSB0byBwcm9jZXNzIHRoZSByZWxvYy4gIEl0IGNhbid0IGhlbHAsIGFuZAotICAgICAgICAgICAgICAgICBpdCBtYXkgZ2VuZXJhdGUgYW5vdGhlciBlcnJvci4gICovCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEkgdG9vayB0aGUgcmVsb2NhdGlvbiB0eXBlIGRlZmluaXRpb25zIGZyb20gdHdvIGRvY3VtZW50czoKLQkgdGhlIFBvd2VyUEMgQUlYIFZlcnNpb24gNCBBcHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlLCBGaXJzdAotCSBFZGl0aW9uIChBcHJpbCAxOTkyKSwgYW5kIHRoZSBQb3dlck9wZW4gQUJJLCBCaWctRW5kaWFuCi0JIDMyLUJpdCBIYXJkd2FyZSBJbXBsZW1lbnRhdGlvbiAoSnVuZSAzMCwgMTk5NCkuICBEaWZmZXJlbmNlcwotCSBiZXR3ZWVuIHRoZSBkb2N1bWVudHMgYXJlIG5vdGVkIGJlbG93LiAgKi8KLQotICAgICAgc3dpdGNoIChyZWwtPnJfdHlwZSkKLQl7Ci0JY2FzZSBSX1JUQjoKLQljYXNlIFJfUlJUQkk6Ci0JY2FzZSBSX1JSVEJBOgotCSAgLyogVGhlc2UgcmVsb2NzIGFyZSBkZWZpbmVkIGJ5IHRoZSBQb3dlclBDIEFCSSB0byBiZQotICAgICAgICAgICAgIHJlbGF0aXZlIGJyYW5jaGVzIHdoaWNoIHVzZSBoYWxmIG9mIHRoZSBkaWZmZXJlbmNlCi0gICAgICAgICAgICAgYmV0d2VlbiB0aGUgc3ltYm9sIGFuZCB0aGUgcHJvZ3JhbSBjb3VudGVyLiAgSSBjYW4ndAotICAgICAgICAgICAgIHF1aXRlIGZpZ3VyZSBvdXQgd2hlbiB0aGlzIGlzIHVzZWZ1bC4gIFRoZXNlIHJlbG9jcyBhcmUKLSAgICAgICAgICAgICBub3QgZGVmaW5lZCBieSB0aGUgUG93ZXJPcGVuIEFCSS4gICovCi0JZGVmYXVsdDoKLQkgICgqX2JmZF9lcnJvcl9oYW5kbGVyKQotCSAgICAoXygiJXM6IHVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSAweCUwMngiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGlucHV0X2JmZCksICh1bnNpZ25lZCBpbnQpIHJlbC0+cl90eXBlKTsKLQkgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9iYWRfdmFsdWUpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgUl9QT1M6Ci0JICAvKiBTaW1wbGUgcG9zaXRpdmUgcmVsb2NhdGlvbi4gICovCi0JICBicmVhazsKLQljYXNlIFJfTkVHOgotCSAgLyogU2ltcGxlIG5lZ2F0aXZlIHJlbG9jYXRpb24uICAqLwotCSAgdmFsID0gLSB2YWw7Ci0JICBicmVhazsKLQljYXNlIFJfUkVMOgotCSAgLyogU2ltcGxlIFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotCSAgaG93dG8ucGNfcmVsYXRpdmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBSX1RPQzoKLQkgIC8qIFRPQyByZWxhdGl2ZSByZWxvY2F0aW9uLiAgVGhlIHZhbHVlIGluIHRoZSBpbnN0cnVjdGlvbiBpbgotICAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgaW5wdXQgZmlsZSBUT0MgdG8KLSAgICAgICAgICAgICB0aGUgZGVzaXJlZCBsb2NhdGlvbi4gIFdlIHdhbnQgdGhlIG9mZnNldCBmcm9tIHRoZSBmaW5hbAotICAgICAgICAgICAgIFRPQyB0byB0aGUgZGVzaXJlZCBsb2NhdGlvbi4gIFdlIGhhdmU6Ci0JICAgICAgICAgaXN5bSA9IGlUT0MgKyBpbgotCQkgaWluc24gPSBpbiArIG8KLQkJIG9zeW0gPSBvVE9DICsgb24KLQkJIG9pbnNuID0gb24gKyBvCi0JICAgICBzbyB3ZSBtdXN0IGNoYW5nZSBpbnNuIGJ5IG9uIC0gaW4uCi0JICAgICAqLwotCWNhc2UgUl9HTDoKLQkgIC8qIEdsb2JhbCBsaW5rYWdlIHJlbG9jYXRpb24uICBUaGUgdmFsdWUgb2YgdGhpcyByZWxvY2F0aW9uCi0gICAgICAgICAgICAgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5IGluIHRoZSBUT0Mgc2VjdGlvbi4gICovCi0JY2FzZSBSX1RDTDoKLQkgIC8qIExvY2FsIG9iamVjdCBUT0MgYWRkcmVzcy4gIEkgY2FuJ3QgZmlndXJlIG91dCB0aGUKLSAgICAgICAgICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgY2FzZSBSX0dMLiAgKi8KLQljYXNlIFJfVFJMOgotCSAgLyogVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICBBIFRPQyByZWxhdGl2ZSBsb2FkIGluc3RydWN0aW9uCi0gICAgICAgICAgICAgd2hpY2ggbWF5IGJlIGNoYW5nZWQgdG8gYSBsb2FkIGFkZHJlc3MgaW5zdHJ1Y3Rpb24uCi0gICAgICAgICAgICAgRklYTUU6IFdlIGRvbid0IGN1cnJlbnRseSBpbXBsZW1lbnQgdGhpcyBvcHRpbWl6YXRpb24uICAqLwotCWNhc2UgUl9UUkxBOgotCSAgLyogVE9DIHJlbGF0aXZlIHJlbG9jYXRpb24uICBUaGlzIGlzIGEgVE9DIHJlbGF0aXZlIGxvYWQKLSAgICAgICAgICAgICBhZGRyZXNzIGluc3RydWN0aW9uIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvIGEgbG9hZAotICAgICAgICAgICAgIGluc3RydWN0aW9uLiAgRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uICAqLwotCSAgaWYgKGggIT0gTlVMTCAmJiBoLT5zbWNsYXMgIT0gWE1DX1REKQotCSAgICB7Ci0JICAgICAgaWYgKGgtPnRvY19zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikKLQkJICAgIChfKCIlczogVE9DIHJlbG9jIGF0IDB4JXggdG8gc3ltYm9sIGAlcycgd2l0aCBubyBUT0MgZW50cnkiKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpbnB1dF9iZmQpLCByZWwtPnJfdmFkZHIsCi0JCSAgICAgaC0+cm9vdC5yb290LnN0cmluZyk7Ci0JCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX2JhZF92YWx1ZSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBCRkRfQVNTRVJUICgoaC0+ZmxhZ3MgJiBYQ09GRl9TRVRfVE9DKSA9PSAwKTsKLQkgICAgICB2YWwgPSAoaC0+dG9jX3NlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEKLQkJICAgICArIGgtPnRvY19zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLQkgICAgfQotCi0JICB2YWwgPSAoKHZhbCAtIHhjb2ZmX2RhdGEgKG91dHB1dF9iZmQpLT50b2MpCi0JCSAtIChzeW0tPm5fdmFsdWUgLSB4Y29mZl9kYXRhIChpbnB1dF9iZmQpLT50b2MpKTsKLQkgIGFkZGVuZCA9IDA7Ci0JICBicmVhazsKLQljYXNlIFJfQkE6Ci0JICAvKiBBYnNvbHV0ZSBicmFuY2guICBXZSBkb24ndCB3YW50IHRvIG1lc3Mgd2l0aCB0aGUgbG93ZXIKLSAgICAgICAgICAgICB0d28gYml0cyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCWNhc2UgUl9DQUk6Ci0JICAvKiBUaGUgUG93ZXJQQyBBQkkgZGVmaW5lcyB0aGlzIGFzIGFuIGFic29sdXRlIGNhbGwgd2hpY2gKLSAgICAgICAgICAgICBtYXkgYmUgbW9kaWZpZWQgdG8gYmVjb21lIGEgcmVsYXRpdmUgY2FsbC4gIFRoZSBQb3dlck9wZW4KLSAgICAgICAgICAgICBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQljYXNlIFJfUkJBOgotCSAgLyogQWJzb2x1dGUgYnJhbmNoIHdoaWNoIG1heSBiZSBtb2RpZmllZCB0byBiZWNvbWUgYQotICAgICAgICAgICAgIHJlbGF0aXZlIGJyYW5jaC4gICovCi0JY2FzZSBSX1JCQUM6Ci0JICAvKiBUaGUgUG93ZXJQQyBBQkkgZGVmaW5lcyB0aGlzIGFzIGFuIGFic29sdXRlIGJyYW5jaCB0byBhCi0gICAgICAgICAgICAgZml4ZWQgYWRkcmVzcyB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYW4gYWJzb2x1dGUgYnJhbmNoCi0gICAgICAgICAgICAgdG8gYSBzeW1ib2wuICBUaGUgUG93ZXJPcGVuIEFCSSBkb2VzIG5vdCBkZWZpbmUgdGhpcwotICAgICAgICAgICAgIHJlbG9jYXRpb24gdHlwZS4gICovCi0JY2FzZSBSX1JCUkM6Ci0JICAvKiBUaGUgUG93ZXJQQyBBQkkgZGVmaW5lcyB0aGlzIGFzIGFuIGFic29sdXRlIGJyYW5jaCB0byBhCi0gICAgICAgICAgICAgZml4ZWQgYWRkcmVzcyB3aGljaCBtYXkgYmUgbW9kaWZpZWQgdG8gYSByZWxhdGl2ZSBicmFuY2guCi0gICAgICAgICAgICAgVGhlIFBvd2VyT3BlbiBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQkgIGhvd3RvLnNyY19tYXNrICY9IH4zOwotCSAgaG93dG8uZHN0X21hc2sgPSBob3d0by5zcmNfbWFzazsKLQkgIGJyZWFrOwotCWNhc2UgUl9CUjoKLQkgIC8qIFJlbGF0aXZlIGJyYW5jaC4gIFdlIGRvbid0IHdhbnQgdG8gbWVzcyB3aXRoIHRoZSBsb3dlcgotICAgICAgICAgICAgIHR3byBiaXRzIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JY2FzZSBSX0NSRUw6Ci0JICAvKiBUaGUgUG93ZXJQQyBBQkkgZGVmaW5lcyB0aGlzIGFzIGEgcmVsYXRpdmUgY2FsbCB3aGljaCBtYXkKLSAgICAgICAgICAgICBiZSBtb2RpZmllZCB0byBiZWNvbWUgYW4gYWJzb2x1dGUgY2FsbC4gIFRoZSBQb3dlck9wZW4KLSAgICAgICAgICAgICBBQkkgZG9lcyBub3QgZGVmaW5lIHRoaXMgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLQljYXNlIFJfUkJSOgotCSAgLyogQSByZWxhdGl2ZSBicmFuY2ggd2hpY2ggbWF5IGJlIG1vZGlmaWVkIHRvIGJlY29tZSBhbgotICAgICAgICAgICAgIGFic29sdXRlIGJyYW5jaC4gIEZJWE1FOiBXZSBkb24ndCBpbXBsZW1lbnQgdGhpcywKLSAgICAgICAgICAgICBhbHRob3VnaCB3ZSBzaG91bGQgZm9yIHN5bWJvbHMgb2Ygc3RvcmFnZSBtYXBwaW5nIGNsYXNzCi0gICAgICAgICAgICAgWE1DX1hPLiAgKi8KLQkgIGhvd3RvLnBjX3JlbGF0aXZlID0gdHJ1ZTsKLQkgIGhvd3RvLnNyY19tYXNrICY9IH4zOwotCSAgaG93dG8uZHN0X21hc2sgPSBob3d0by5zcmNfbWFzazsKLQkgIGJyZWFrOwotCWNhc2UgUl9STDoKLQkgIC8qIFRoZSBQb3dlclBDIEFJWCBBQkkgZGVzY3JpYmVzIHRoaXMgYXMgYSBsb2FkIHdoaWNoIG1heSBiZQotICAgICAgICAgICAgIGNoYW5nZWQgdG8gYSBsb2FkIGFkZHJlc3MuICBUaGUgUG93ZXJPcGVuIEFCSSBzYXlzIHRoaXMKLSAgICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyBjYXNlIFJfUE9TLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgUl9STEE6Ci0JICAvKiBUaGUgUG93ZXJQQyBBSVggQUJJIGRlc2NyaWJlcyB0aGlzIGFzIGEgbG9hZCBhZGRyZXNzCi0gICAgICAgICAgICAgd2hpY2ggbWF5IGJlIGNoYW5nZWQgdG8gYSBsb2FkLiAgVGhlIFBvd2VyT3BlbiBBQkkgc2F5cwotICAgICAgICAgICAgIHRoaXMgaXMgdGhlIHNhbWUgYXMgUl9QT1MuICAqLwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBzZWUgYW4gUl9CUiBvciBSX1JCUiByZWxvYyB3aGljaCBpcyBqdW1waW5nIHRvIGdsb2JhbAotICAgICAgICAgbGlua2FnZSBjb2RlLCBhbmQgaXQgaXMgZm9sbG93ZWQgYnkgYW4gYXBwcm9wcmlhdGUgY3JvciBub3AKLSAgICAgICAgIGluc3RydWN0aW9uLCB3ZSByZXBsYWNlIHRoZSBjcm9yIHdpdGggbHd6IHIyLDIwKHIxKS4gIFRoaXMKLSAgICAgICAgIHJlc3RvcmVzIHRoZSBUT0MgYWZ0ZXIgdGhlIGdsaW5rIGNvZGUuICBDb250cmFyaXdpc2UsIGlmIHRoZQotICAgICAgICAgY2FsbCBpcyBmb2xsb3dlZCBieSBhIGx3eiByMiwyMChyMSksIGJ1dCB0aGUgY2FsbCBpcyBub3QKLSAgICAgICAgIGdvaW5nIHRvIGdsb2JhbCBsaW5rYWdlIGNvZGUsIHdlIGNhbiByZXBsYWNlIHRoZSBsb2FkIHdpdGggYQotICAgICAgICAgY3Jvci4gICovCi0gICAgICBpZiAoKHJlbC0+cl90eXBlID09IFJfQlIgfHwgcmVsLT5yX3R5cGUgPT0gUl9SQlIpCi0JICAmJiBoICE9IE5VTEwKLQkgICYmIGgtPnJvb3QudHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgICYmIChyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEgKyA4Ci0JICAgICAgPD0gaW5wdXRfc2VjdGlvbi0+X2Nvb2tlZF9zaXplKSkKLQl7Ci0JICBiZmRfYnl0ZSAqcG5leHQ7Ci0JICB1bnNpZ25lZCBsb25nIG5leHQ7Ci0KLQkgIHBuZXh0ID0gY29udGVudHMgKyAocmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSArIDQ7Ci0JICBuZXh0ID0gYmZkX2dldF8zMiAoaW5wdXRfYmZkLCBwbmV4dCk7Ci0KLQkgIC8qIFRoZSBfcHRyZ2wgZnVuY3Rpb24gaXMgbWFnaWMuICBJdCBpcyB1c2VkIGJ5IHRoZSBBSVgKLSAgICAgICAgICAgICBjb21waWxlciB0byBjYWxsIGEgZnVuY3Rpb24gdGhyb3VnaCBhIHBvaW50ZXIuICAqLwotCSAgaWYgKGgtPnNtY2xhcyA9PSBYTUNfR0wKLQkgICAgICB8fCBzdHJjbXAgKGgtPnJvb3Qucm9vdC5zdHJpbmcsICIuX3B0cmdsIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChuZXh0ID09IDB4NGRlZjdiODIJCS8qIGNyb3IgMTUsMTUsMTUgKi8KLQkJICB8fCBuZXh0ID09IDB4NGZmZmZiODIpCS8qIGNyb3IgMzEsMzEsMzEgKi8KLQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDgwNDEwMDE0LCBwbmV4dCk7IC8qIGx3eiByMSwyMChyMSkgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG5leHQgPT0gMHg4MDQxMDAxNCkJCS8qIGx3eiByMSwyMChyMSkgKi8KLQkJYmZkX3B1dF8zMiAoaW5wdXRfYmZkLCAweDRmZmZmYjgyLCBwbmV4dCk7IC8qIGNyb3IgMzEsMzEsMzEgKi8KLQkgICAgfQotCX0KLQotICAgICAgLyogQSBQQyByZWxhdGl2ZSByZWxvYyBpbmNsdWRlcyB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgKi8KLSAgICAgIGlmIChob3d0by5wY19yZWxhdGl2ZSkKLQlhZGRlbmQgKz0gaW5wdXRfc2VjdGlvbi0+dm1hOwotCi0gICAgICByc3RhdCA9IF9iZmRfZmluYWxfbGlua19yZWxvY2F0ZSAoJmhvd3RvLCBpbnB1dF9iZmQsIGlucHV0X3NlY3Rpb24sCi0JCQkJCWNvbnRlbnRzLAotCQkJCQlyZWwtPnJfdmFkZHIgLSBpbnB1dF9zZWN0aW9uLT52bWEsCi0JCQkJCXZhbCwgYWRkZW5kKTsKLQotICAgICAgc3dpdGNoIChyc3RhdCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIGNoYXIgYnVmW1NZTU5NTEVOICsgMV07Ci0JICAgIGNoYXIgaG93dG9fbmFtZVsxMF07Ci0KLQkgICAgaWYgKHN5bW5keCA9PSAtMSkKLQkgICAgICBuYW1lID0gIipBQlMqIjsKLQkgICAgZWxzZSBpZiAoaCAhPSBOVUxMKQotCSAgICAgIG5hbWUgPSBoLT5yb290LnJvb3Quc3RyaW5nOwotCSAgICBlbHNlCi0JICAgICAgewotCQluYW1lID0gX2JmZF9jb2ZmX2ludGVybmFsX3N5bWVudF9uYW1lIChpbnB1dF9iZmQsIHN5bSwgYnVmKTsKLQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICBzcHJpbnRmIChob3d0b19uYW1lLCAiMHglMDJ4IiwgcmVsLT5yX3R5cGUpOwotCi0JICAgIGlmICghICgoKmluZm8tPmNhbGxiYWNrcy0+cmVsb2Nfb3ZlcmZsb3cpCi0JCSAgIChpbmZvLCBuYW1lLCBob3d0b19uYW1lLCAoYmZkX3ZtYSkgMCwgaW5wdXRfYmZkLAotCQkgICAgaW5wdXRfc2VjdGlvbiwgcmVsLT5yX3ZhZGRyIC0gaW5wdXRfc2VjdGlvbi0+dm1hKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9DaGFuZ2VMb2cgYi9iaW51dGlscy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNTkyMTQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjcwOSArMCwwIEBACi0xOTk5LTA2LTIzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGRsbHRvb2xfU09VUkNFUyk6IEFkZCBkeW4tc3RyaW5nLmMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0yMyAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoSEFWRV9FWEVDVVRBQkxFX1NVRkZJWCk6IERlZmluZS4KLQkqIGRsbHRvb2wuYyAobG9va19mb3JfcHJvZyk6IFVzZSBIQVZFX0VYRUNVVEFCTEVfU1VGRklYLgotCSogZGxsd3JhcC5jIChsb29rX2Zvcl9wcm9nKTogTGlrZXdpc2UuCi0JKiByZXNyYy5jIChsb29rX2Zvcl9kZWZhdWx0KTogTGlrZXdpc2UuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNi0yMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gTXVtaXQgS2hhbiA8a2hhbkB4cmF5bGl0aC53aXNjLkVEVT46Ci0JKiBjb25maWd1cmUuaW46IERlZmluZSBFWEVDVVRBQkxFX1NVRkZJWC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSAiZHluLXN0cmluZy5oIi4gIEluY2x1ZGUgPHN0ZGFyZy5oPiBiYXNlZCBvbgotCUFOU0lfUFJPVE9UWVBFUywgbm90IF9fU1REQ19fLgotCShvdXRmaWxlKTogUmVtb3ZlLgotCShnZW5fZXhwX2ZpbGUpOiBDaGFuZ2UgdXNlcyBvZiBvdXRmaWxlIHRvIHVzZSBhbGxvY2EuCi0JKG1ha2Vfb25lX2xpYl9maWxlLCBtYWtlX2hlYWQsIG1ha2VfdGFpbCk6IExpa2V3aXNlLgotCShnZW5fbGliX2ZpbGUpOiBMaWtld2lzZS4KLQkobG9va19mb3JfcHJvZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlZHVjZV9uYW1lKTogUmV3cml0ZSB0byB1c2UgbG9va19mb3JfcHJvZy4KLQkobWNvcmVfZWxmX2dlbl9vdXRfZmlsZSk6IFVzZSBkeW5fc3RyaW5nX3QgcmF0aGVyIHRoYW4gb3V0ZmlsZS4KLQkqIGRsbHdyYXAuYzogRG9uJ3QgaW5jbHVkZSA8c3RkaW8uaD4sIDxlcnJuby5oPiwgPHN0cmluZy5oPiwKLQk8c3RkbGliLmg+LCBvciA8dW5pc3RkLmg+LiAgSW5jbHVkZSA8c3lzL3N0YXQuaD4gYW5kIGVpdGhlcgotCTxzdGRhcmcuaD4gb3IgPHZhcmFyZ3MuaD4uCi0JKGRyaXZlcl9uYW1lKTogSW5pdGlhbGl6ZSB0byBOVUxMLCBub3QgImdjYyIuCi0JKGRsbHRvb2xfbmFtZSk6IEluaXRpYWxpemUgdG8gTlVMTCwgbm90ICJkbGx0b29sIi4KLQkoZGlzcGxheSwgaW5mb3JtLCBsb29rX2Zvcl9wcm9nLCBkZWR1Y2VfbmFtZSk6IE5ldyBzdGF0aWMKLQlmdW5jdGlvbnMuCi0JKHVzYWdlKTogTWVudGlvbiAtbW5vLWN5Z3dpbi4KLQkoT1BUSU9OX01OT19DWUdXSU4pOiBEZWZpbmUuCi0JKG1haW4pOiBIYW5kbGUgLW1uby1jeWd3aW4uICBEZWR1Y2UgZHJpdmVyX25hbWUgYW5kIGRsbHRvb2xfbmFtZS4KLQkqIHJlc3JjLmMgKGxvb2tfZm9yX2RlZmF1bHQpOiBNYWtlIHN0YXRpYy4gIFJlbW92ZSB1bnVzZWQgbG9jYWwKLQlwYXRoLiAgQ2hlY2sgdXNpbmcgRVhFQ1VUQUJMRV9TVUZGSVguCi0JKHJlYWRfcmNfZmlsZSk6IEFsbG9jYXRlIGVub3VnaCBzcGFjZSB0byBob2xkIEVYRUNVVEFCTEVfU1VGRklYLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShkbGx3cmFwX0xEQUREKTogQWRkICQoSU5UTExJQlMpLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVuIDIxIDE2OjQ5OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IFVzZSBlbGZfaHBwYV9yZWxvY190eXBlIGluc3RlYWQgb2YKLSAgICAgICAgZWxmMzJfaHBwYV9yZWxvY190eXBlLgotCi0xOTk5LTA2LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUpOiBMaW5rIG9iamVjdCBmaWxlcyB3aXRoIHRoZQotCS5leHAgZmlsZSwgbm90IHRoZSAubGliIGZpbGUuCi0KLUZyaSBKdW4gMTggMjA6MTc6NTEgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRlZmxleC5sOiBBY2NlcHQgc2luZ2xlLWNoYXJhY3RlciBzeW1ib2wgbmFtZXMuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X3N5bWJvbF90eXBlKTogRGV0ZWN0IEFSTSBzeW1ib2xzIHR5cGVkIGFzIFRodW1iCi0JZnVuY3Rpb25zLiAKLQotMTk5OS0wNi0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZXJfb3B0aW9ucyk6IE5ldyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgLU0vLS1kaXNhc3NlbWJsZXItb3B0aW9ucyBvcHRpb24uCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLWRpc2Fzc2VtYmxlci1vcHRpb25zLgotCShkaXNhc3NlbWJsZV9kYXRhKTogSW5pdGlhbGlzZSBkaXNhc3NlbWJsZXJfb3B0aW9ucyBmaWVsZCBvZgotCWRpc2Fzc2VtYmxlcl9pbmZvIHN0cnVjdHVyZS4KLQkobWFpbik6IEFkZCBwYXJzaW5nIG9mIC1NIG9wdGlvbi4KLQkKLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIHRvIG9iamR1bXAuCi0KLQkqIE5FV1M6IERlc2NyaWJlIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIHRvIG9iamR1bXAuCi0KLQotTW9uIEp1biAxNCAxMDoyNzo1NCAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IEZpeCB0eXBvcy4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBJZiB0aGUgZGlzYXNzZW1ibGVyIHJldHVybnMgYW4KLQllcnJvciwgcHJpbnQgb3V0IGFueXRoaW5nIGl0IG1heSBoYXZlIHByaW50ZWQgdG8gdGhlIGJ1ZmZlci4gIEZyb20KLQlILkouIEx1IDxoamxAZ251Lm9yZz4uCi0KLQkqIGRlZnBhcnNlLnkgKGV4cGxpc3QpOiBSZW1vdmUgc2VwYXJhdGUgZXhwbGluZSB0byBlbGltaW5hdGUKLQlzaGlmdC9yZWR1Y2UgY29uZmxpY3QuCi0KLQlGcm9tIEthaS1Vd2UgUm9tbWVsIDxyb21tZWxAYXJzLmRlPjoKLQkqIGRlZnBhcnNlLnk6IEFkZCB0b2tlbnMgTk9OU0hBUkVELCBTSU5HTEUsIE1VTFRJUExFLAotCUlOSVRJTlNUQU5DRSwgSU5JVEdMT0JBTCwgVEVSTUlOU1RBTkNFLCBhbmQgVEVSTUdMT0JBTC4KLQkoY29tbWFuZCk6IEFkZCBvcHRpb25fbGlzdCBhZnRlciBMSUJSQVJZLgotCShhdHRyKTogQWNjZXB0IGFuZCBpZ25vcmUgTk9OU0hBUkVELCBTSU5HTEUsIGFuZCBNVUxUSVBMRS4KLQkob3B0aW9uX2xpc3QsIG9wdGlvbik6IE5ldyBub250ZXJtaW5hbHMuCi0JKiBkZWZsZXgubDogUmVjb2duaXplIE5PTlNIQVJFRCwgU0lOR0xFLCBNVUxUSVBMRSwgSU5JVElOU1RBTkNFLAotCUlOSVRHTE9CQUwsIFRFUk1JTlNUQU5DRSwgYW5kIFRFUk1HTE9CQUwuCi0KLTE5OTktMDYtMTIgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhci5jIChPX0JJTkFSWSk6IERlZmluZSBhcyAwIGlmIG5vdCBkZWZpbmVkLgotCShyYW5saWJfdG91Y2gpOiBPcGVuIGZpbGUgd2l0aCBPX0JJTkFSWS4KLQotCSogcmVuYW1lLmMgKE9fQklOQVJZKTogRGVmaW5lIGFzIDAgaWYgbm90IGRlZmluZWQuCi0JKHNpbXBsZV9jb3B5KTogT3BlbiBmaWxlcyB3aXRoIE9fQklOQVJZLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILiBQZXRlciBBbnZpbiA8aHBhQHRyYW5zbWV0YS5jb20+OgotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGNvcHkgZmllbGQuCi0JKHNlY3Rpb25zX2NvcGllZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAib25seS1zZWN0aW9uIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLWogYW5kIC0tb25seS1zZWN0aW9uLgotCShmaW5kX3NlY3Rpb25fbGlzdCk6IEluaXRpYWxpemUgY29weSBmaWVsZC4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IENoZWNrIGZvciBjb3B5aW5nIHNlY3Rpb25zLgotCShjb3B5X29iamVjdCk6IENoZWNrIHNlY3Rpb25zX2NvcGllZCB3aGVuIGNhbGxpbmcgZmlsdGVyX3N5bWJvbHMuCi0JKHNldHVwX3NlY3Rpb24pOiBDaGVjayBmb3IgY29weWluZyBzZWN0aW9ucy4KLQkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSAtai8tLW9ubHktc2VjdGlvbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLWovLS1vbmx5LXNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgZnJleHAgaXMgbm90IGF2YWlsYWJsZSwgY2hlY2sgaW4gLWxtLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiByZWFkZWxmLmMgKGdldF9lbGZfY2xhc3MpOiBVc2UgY29ycmVjdCBwcmludGYgZm9ybWF0IGZvciB0eXBlLgotCShnZXRfZGF0YV9lbmNvZGluZyk6IExpa2V3aXNlLgotCShnZXRfb3NhYmlfbmFtZSk6IExpa2V3aXNlLgotCShwcm9jZXNzX2ZpbGVfaGVhZGVyKTogRG9uJ3QgcGFzcyBhbiBleHRyYSBhcmd1bWVudCB0byBwcmludGYuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogQ2FzdCBkeW5hbWljX3NpemUgdG8gbG9uZyBiZWZvcmUKLQlwcmludGluZy4KLQkoZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24pOiBDYXN0IGJ5dGVfZ2V0IHRvIGxvbmcgYmVmb3JlCi0JcHJpbnRpbmcuCi0KLVdlZCBKdW4gIDkgMTE6NDA6MTYgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZWFkZWxmLmMgKGR1bXBfc2VjdGlvbik6IENhc3QgdmFsdWVzIGZyb20gYnl0ZV9nZXQgdG8KLSAJW3Vuc2lnbmVkXSBsb25nIGZvciBwcmludGluZywgaW4gY2FzZSBpdCBpcyB3aWRlciB0aGFuIGxvbmcuCi0JKGRpc3BsYXlfYmxvY2spOiBMaWtld2lzZS4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogTGlrZXdpc2UuCi0JKGRlY29kZV9sb2NhdGlvbl9leHByZXNzaW9uKTogTGlrZXdpc2UuICBEb24ndCBkZXBlbmQgb24KLSAJZXZhbHVhdGlvbiBvcmRlci4KLQotTW9uIEp1biAgNyAxMjoxNDo1NyAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHdpbmRyZXMuYyAodXNhZ2UpOiBGaXggdHlwby4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBVc2UgNjRiaXQgd2lkZSBmaWVsZHMgaW4gaW50ZXJuYWwgc3RyY3V0dXJlcyBldmVuIGlmCi0JdGFyZ2V0dGluZyBhIDMyYml0IGFyY2hpdGVjdHVyZS4KLQkoZHVtcF9yZWxvY2F0aW9ucyk6IFRha2UgYSBuZXcgcGFyYW1ldGVyIC0gdGhlIG51bWJlciBvZiBzeW1ib2xzCi0JaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBBZGQgc3VwcG9ydCBmb3IgNjRiaXQgRUxGIGZpbGVzLgotCi0xOTk5LTA2LTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUpOiBVc2UgY29uc3RhbnRzIGZvciB0ZW1wb3JhcnkKLQlmaWxlIG5hbWVzLiAKLQotV2VkIEp1biAgMiAxMjozNDozNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGdlbl9leHBfZmlsZSk6IFJldmVydCAxOTk5MDQxMSBjaGFuZ2UuCi0KLU1vbiBNYXkgMzEgMDk6NTY6MjIgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfcmVsb2NzKTogRGV0ZXJtaW5lIHR5cGUgb2YgcmVsb2MgZnJvbQotCURUX1BMVFJFTCBhbmQgZnJvbSBzZWN0aW9uIHR5cGUuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZ2V0X2VsZl9jbGFzcyk6IERpc3BsYXkgdW5rbm93biBjbGFzcyBudW1iZXIuCi0JKGdldF9kYXRhX2VuY29kaW5nKTogRGlzcGxheSB1bmtub3duIGVuY29kaW5nIG51bWJlci4KLQkoZ2V0X29zYWJpX25hbWUpOiBEaXNwbGF5IHVua25vd24gQUJJIG51bWJlci4KLQkocHJvY2Vzc19maWxlX2hlYWRlcik6IERpc3BsYXkgdW5rbm93biB2ZXJzaW9uIG51bWJlci4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogRml4IHR5cG8uCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFkZCBleHRyYSBwYXJhbWV0ZXI6IGlzX3JlbGEgdG8KLQlzcGVjaWZ5IHRoZSBraW5kIG9mIHJlbG9jYXRpb25zIHRvIGJlIGR1bXBlZC4gIENhbGwgZ3Vlc3NfaXNfcmVsYQotCWlmIHRoaXMgcGFyYW1ldGVyIGhhcyBhIHZhbHVlIG9mIFVOS05PV04uCi0JKGd1ZXNzX2lzX3JlbGEpOiBOZXcgZnVuY3Rpb246ICBHdWVzcyB0aGUga2luZCBvZiByZWxvYyBiZWluZyB1c2VkCi0JYmFjZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgotCShwcm9jZXNzX3JlbG9jcyk6IERldGVybWluZSB0eXBlIG9mIHJlbG9jIGJlZm9yZSBjYWxsaW5nCi0JZHVtcF9yZWxvY2F0aW9ucy4KLQotMTk5OS0wNS0yOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIHJlYWRlbGYuYzogSW5jbHVkZSAiZWxmL2k5NjAuaCIuCi0JKGR1bXBfcmVsb2NhdGlvbnMpOiBIYW5kbGUgRU1fOTYwLgotCi1UaHUgTWF5IDI3IDExOjU4OjMzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqY29weS5jIChjb3B5X2FyY2hpdmUpOiBQcmVzZXJ2ZSBkYXRlcyBvZiBhcmNoaXZlIG1lbWJlcnMgaWYKLQlyZXF1ZXN0ZWQuCi0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IEFsd2F5cyBwcmludCB0aGUgYWRkZW5kIG9uIFJFTEEKLQlzeXN0ZW1zIGV2ZW4gaWYgdGhlcmUgaXMgbm8gc3ltYm9sLgotCShwcm9jZXNzX3Byb2dyYW1faGVhZGVycyk6IFJlc2V0IGR5bmFtaWNfc2l6ZSBiZWZvcmUgbG9vcGluZwotCXRocm91Z2ggdGhlIHByb2dyYW0gaGVhZGVycy4KLQkocHJvY2Vzc192ZXJzaW9uX3NlY3Rpb25zKTogQ2FzdCBzaF9vZmZzZXQgdG8gdW5zaWduZWQgbG9uZyBmb3IKLQlwcmludGluZyBpbiBjYXNlIGJmZF92bWEgaXMgd2lkZXIuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogVXNlIGdldF9zeW1ib2xfaW5kZXhfdHlwZSB3aGVuIHByaW50aW5nCi0Jc3Rfc2huZHguCi0KLTE5OTktMDUtMTcgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiB3aW5kcmVzLmM6IGFkZCB2ZXJib3NlIG9wdGlvbgotCShtYWluKTogcHJvY2VzcyB2ZXJib3NlIG9wdGlvbgotCSogcmVzcmMuYyAobG9va19mb3JfZGVmYXVsdCk6IG5ldy4gIExvb2sgZm9yIHRoZSBkZWZhdWx0Ci0JcHJlcHJvY2Vzc29yIGluIGEgZ2l2ZW4gbG9jYXRpb24uCi0JKHJlYWRfcmNfZmlsZSk6IGZvciBmb28vYmFyLXdpbmRyZXMsIGxvb2sgZm9yIGZvby9iYXItZ2NjLAotCWZvby9nY2MgKGluIGNhc2Ugb2YgZm9vL3dpbmRyZXMpLCBhbmQgdGhlbiBnY2MgKHRoZSBvbGQgZGVmYXVsdCkuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZGVkdWNlX25hbWUpOiBOZXcgZnVuY3Rpb246IERlZHVjZSBuYW1lIG9mIHByb2dyYW0gdG8KLQlydW4uCi0JKG1jb3JlX2VsZl9vdXRfZmlsZSk6IE5ldyB2YXJpYWJsZTogTmFtZSBvZiBtY29yZS1lbGYgb3V0cHV0IGZpbGUuCi0JKG1jb3JlX2VsZl9saW5rZXIpOiBOZXcgdmFyaWFibGU6IE5hbWUgb2YgbGlua2VyIHRvIHVzZS4KLQkobWNvcmVfZWxmX2xpbmtlcl9mbGFncyk6IE5ldyB2YXJpYWJsZTogTGlua2VyIGZsYWdzIHRvIHBhc3MuCi0JKHNjYW5fb2JqX2ZpbGUpOiBDYWNoZSBmaWxlbmFtZXMgaWYgbmVjZXNzYXJ5LgotCSh1c2FnZSk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkobWFpbik6IFN1cHBvcnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zOiAtTSAoZ2VuZXJhdGUgYW4KLQltY29yZS1lbGYgb3V0cHV0IGZpbGUpIC1MIChuYW1lIG9mIGxpbmtlciB0byB1c2UpIC1GIChmbGFncyB0bwotCXBhc3MgdG8gbGlua2VyKS4gCi0JKG1jb3JlX2VsZl9jYWNoZV9maWxlbmFtZSk6IFN0b3JlIGEgZmlsZW5hbWUgaW4gYSBjYWNoZS4KLQkobWNvcmVfZWxmX2dlbl9vdXRfZmlsZSk6IE5ldyBmdW5jdGlvbjogR2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUKLQlwZXIgdGhlIG1jb3JlLWVsZiBzcGVjLgotCi0xOTk5LTA1LTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKEJVSUxEX01JU0MpOiBCdWlsZCBkbGx0b29sIGZvciBtY29yZQotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogZGxsdG9vbC5jOiBVcGRhdGUgZXhhbXBsZSBpbiBjb21tZW50LgotCShETExUT09MX01DT1JFKTogRGVmaW5lLgotCShETExUT09MX01DT1JFX0VMRik6IERlZmluZS4KLQkoRFJFQ1RWRV9TRUNUSU9OX05BTUUpOiBEZWZpbmUuCi0JKG1jb3JlX2JlX2p0YWIsIG1jb3JlX2xlX2p0YWIpOiBCaW5hcnkgZm9yIHBlcmZvcm1pbmcgYW4gbWNvcmUKLQlqdW1wIHRvIGFkZHJlc3MuCi0JKG10YWJsZSk6IEFkZCBlbnRyaWVzIGZvciBtY29yZSB2YXJpYW50cy4KLQkocnZhYWZ0ZXIsIHJ2YWJlZm9yZSwgYXNtX3ByZWZpeCk6IEFkZCBtY29yZSBzdXBwcG9ydC4KLQkoc2Nhbl9kcmVjdHZlX3N5bWJvbHMpOiBVc2UgRFJFQ1RWRV9TRUNUSU9OX05BTUUuCi0JKG1ha2VfaGVhZCwgbWFrZV90YWlsKTogQ29wZSBpZiBmaWxlIGNhbm5vdCBiZSBjcmVhdGVkLgotCSh1c2FnZSk6IEltcHJvdmUgbGF5b3V0LgotCQotMTk5OS0wNS0xMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IGFkZCBjb2RlIHRvIHN1cHByZXNzIGNlcnRhaW4gb3V0cHV0IGZyb20gY3BwLCByZXBsYWNlCi0JYWxsIHJldHVybnMgd2l0aCBNQVlCRV9SRVRVUk4KLQkoTUFZQkVfUkVUVVJOKTogbmV3LCBpbXBsZW1lbnQgdGhlIHN1cHByZXNzaW9uIGJ5IHJldHVybmluZwotCUlHTk9SRURfVE9LRU4gYXMgbmVlZGVkLgotCShjcHBfbGluZSk6IHJlbWVtYmVyIHdoaWNoIGZpbGUgd2UncmUgaW4sIG1hcmsgZGF0YSBmcm9tIGluY2x1ZGVkCi0JKi5oIGZpbGVzIGZvciBzdXBwcmVzc2lvbi4KLQkqIHJjcGFyc2UueSAoaW5wdXQpOiBhbGxvdyBJR05PUkVEX1RPS0VOIG91dHNpZGUgb2Yga25vd24gY29uc3RydWN0cwotCi0xOTk5LTA1LTEwICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogd2luZHJlcy5jIChxdW90KTogUXVvdGUgc2hlbGwgbWV0YWNoYXJhY3RlcnMgaW4gYSBzdHJpbmcKLQkobWFpbik6IHF1b3RlIHBhcmFtZXRlcnMgdG8gY3BwIHRoYXQgbWlnaHQgaGF2ZSBtZXRhY2hhcmFjdGVycyBpbgotCXRoZW0uICBBbGxvdyAtRCBhcyBhbiBhbGlhcyBmb3IgLS1kZWZpbmUgdG8gYWxsb3cgZm9yIHNoYXJpbmcgbWFrZQotCW1hY3JvcyB3aXRoIGdjYy4KLQotCSogb2JqZHVtcC5jIChkdW1wX3JlbG9jX3NldCk6IGRvbid0IGNvcmUgaWYgaG93dG8tPm5hbWUgaXMgTlVMTAotCi0JKiBNYWtlZmlsZS5hbTogR2l2ZSByZXNjb2ZmLmMgYSBjcHUtc3BlY2lmaWMgLUQgc28gaXQgY2FuIHNldAotCXRoZSBjb3JyZWN0IEJGRC4KLQkqIE1ha2VmaWxlLmluOiBkaXR0bwotCSogcmVzY29mZi5jICh3cml0ZV9jb2ZmX2ZpbGUpOiBTZXQgdGhlIGNvcnJlY3QgQkZECi0KLTE5OTktMDUtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiByZW5hbWUuYyAoc21hcnRfcmVuYW1lKTogRml4IHRlc3Qgb2Ygd2hldGhlciBmaWxlIGV4aXN0cy4KLQotMTk5OS0wNS0wNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGRpc3BsYXlfZW5kaWFuIGJhc2VkIG9uIHRhcmdldAotCWVuZGlhbmlzbS4KLQotMTk5OS0wNS0wNSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoaW50ZXJ3b3JrKTogUmVtb3ZlLgotCShhcm1faW50ZXJ3b3JrX2p0YWIpOiBVc2UgYnggaW5zbi4KLQkodGh1bWJfanRhYik6IExpa2V3aXNlLgotCShNQVJNX0lOVEVSV09SSyk6IE5ldyBtYWNoaW5lIHR5cGUuCi0JKHJ2YWFmdGVyKTogSGFuZGxlIGl0LgotCShydmFiZWZvcmUpIExpa2V3aXNlLgotCShhc21fcHJlZml4KTogTGlrZXdpc2UuCi0JKGdlbl9leHBfdHlwZSk6IENoZWNrIG1hY2hpbmUgdHlwZSBpbnN0ZWFkIG9mCi0JaW50ZXJ3b3JrIGZsYWcuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogTGlrZXdpc2UuCi0JKG1ha2VfaGVhZCk6IExpa2V3aXNlLgotCShtYWtlX3RhaWwpOiBMaWtld2lzZS4KLQkodXNhZ2UpOiBVcGRhdGUgbWFjaGluZSB0eXBlcy4KLQkobWFpbik6IFJlbW92ZSAtaW50ZXJ3b3JrIHN1cHBvcnQuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIHJlYWRlbGYuYyAoZ2V0X21hY2hpbmVfZmxhZ3MpOiAgQ2hlY2sgZm9yIEVGX0NQVTMyLgotICAgICAgICAoZ2V0X2RhdGFfZW5jb2RpbmcpOiBGaXggdHlwby4KLSAKLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTE4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9yYW5nZV90eXBlKTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uIGluCi0JQkZENjQgY2FzZS4KLQotCSogcmVhZGVsZi5jIChnZXRfc2VjdGlvbl90eXBlX25hbWUpOiBVc2UgY29ycmVjdCB0eXBlcyBpbiBwcmludGYKLQlmb3JtYXRzLgotCShwcm9jZXNzX3JlbG9jcyk6IExpa2V3aXNlLgotCShwcm9jZXNzX2R5bmFtaWNfc2VnbWVudCk6IExpa2V3aXNlLgotCShwcm9jZXNzX3N5bWJvbF90YWJsZSk6IExpa2V3aXNlLgotCShwcm9jZXNzX21pcHNfc3BlY2lmaWMpOiBMaWtld2lzZS4KLQotVHVlIEFwciAxMyAyMToyMjowMCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IE1hcmsgdGh1bWIgZnVuY3Rpb25zIGFzCi0JQ19USFVNQkVYVEZVTkMuCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5oIChlbnZpcm9uKTogRGVjbGFyZSBpdCwgaWYgbmVlZGVkLgotCShhbGxvY2EpIFtDX0FMTE9DQV06IERvbid0IHVzZSBnY2MncyBidWlsdGluIG9yIDxhbGxvY2EuaD4uCi0JKiBjb25maWd1cmUuaW4gKGVudmlyb24pOiBEZXRlY3QgZGVjbGFyYXRpb24uCi0JKiBubS5jIChtYWluKTogRG9uJ3QgZGVjbGFyZSBlbnZpcm9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLQkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogUGFkIG91dCB0aGUgLnJlbG9jIHNlY3Rpb24gdG8gYQotCTMyLWJ5dGUgYm91bmRhcnkgd2l0aCBkdW1teSByZWxvY2F0aW9ucywgdG8gbWFrZSB0aGUgQmVPUyBsb2FkZXIKLQloYXBweS4gIFBhdGNoIGZyb20gQm9iIE1hbnNvbiA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4uCi0KLTE5OTktMDQtMDggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoYysrZmlsdCk6IFVwZGF0ZWQgZm9yIC1qLy0tamF2YSwgYW5kIGhwL2VkZwotCWZvcm1hdHMuCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQWRkIGFiaWxpdHkgdG8gZGVjb2RlIG5ldyBjb25zdGFudHMgZm91bmQgaW4gQXByaWwgMjUKLQkxOTk4IERyYWZ0IG9mIFN5c3RlbSBWIEFCSSBzcGVjLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogYnVjb21tLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCSogYWRkcjJsaW5lLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUKLQlzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIGl0LgotCSogYXIuYyAobWFpbik6IExpa2V3aXNlLgotCSogY29mZmR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogZGxsdG9vbC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubG1jb252LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG5tLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAobWFpbik6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHNyY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN5c2R1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogd2luZHJlcy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiByZWFkZWxmLmMgKG1haW4pOiBDYWxsIGxvY2FsZSBzZXR0aW5nIGZ1bmN0aW9ucy4KLQotMTk5OS0wNC0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbik6IEZpeCBEV19PUF9jb25zdDh7c3x1fQotCWRlY29kZXMuIAotCi0xOTk5LTA0LTA0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogcmVuYW1lLmM6IE5ldyBmaWxlLCBjb3BpZWQgb3V0IG9mIG9iamNvcHkuYyB3aXRoIGEgZmV3IGNoYW5nZXMuCi0JKiBidWNvbW0uaCAoc2V0X3RpbWVzLCBzbWFydF9yZW5hbWUpOiBEZWNsYXJlLgotCSogYXIuYzogRG9uJ3QgaW5jbHVkZSA8dXRpbWUuaD4uCi0JKGV4dHJhY3RfZmlsZSk6IENhbGwgc2V0X3RpbWVzIHJhdGhlciB0aGFuIHV0aW1lLgotCSh3cml0ZV9hcmNoaXZlKTogQ2FsbCBzbWFydF9yZW5hbWUgcmF0aGVyIHRoYW4gdW5saW5rIGFuZCByZW5hbWUuCi0JKiBvYmpjb3B5LmM6IERvbid0IGluY2x1ZGUgPHV0aW1lLmg+LgotCShzaW1wbGVfY29weSwgc21hcnRfcmVuYW1lLCBzZXRfdGltZXMpOiBNb3ZlIHRvIHJlbmFtZS5jLgotCShzdHJpcF9tYWluKTogVXBkYXRlIHNtYXJ0X3JlbmFtZSBjYWxsIGZvciBuZXcgcGFyYW1ldGVyLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHJlbmFtZS5jLgotCShvYmpjb3B5X1NPVVJDRVMsIHN0cmlwX25ld19TT1VSQ0VTKTogQWRkIHJlbmFtZS5jLgotCShhcl9TT1VSQ0VTLCByYW5saWJfU09VUkNFUyk6IEFkZCByZW5hbWUuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEVYVFJBX1BST0dSQU1TKTogUmVtb3ZlIGJhY2tzbGFzaCB3aGljaCB0cm91YmxlcyBjdXJyZW50IHZlcnNpb24KLQlvZiBhdXRvbWFrZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBkbGx3cmFwLmMgKG1haW4pOiBFeHBlY3QgY29ycmVjdCB0eXBlIGluIGZvcm1hdCBzdHJpbmcuCi0JKiByZXNyZXMuYzogSW5jbHVkZSAiYmZkLmgiLCAiYnVjb21tLmgiLCAibGliaWJlcnR5LmgiLCBhbmQKLQk8dGltZS5oPi4gIERvbid0IGluY2x1ZGUgPHN0ZGlvLmg+IGFuZCA8ZXJybm8uaD4uCi0JKHdyaXRlX3Jlc19maWxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgZSBhbmQgaS4KLQkocmVhZF9yZXNvdXJjZV9lbnRyeSk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIHJ0eXBlIGFuZCBuLgotCShyZWFkX3VuaXN0cmluZyk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgbi4KLQotMTk5OS0wNC0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFycGFyc2UueTogRGVjbGFyZSB5eWxleC4KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBJbml0aWFsaXplIGJ5dGVzLiAgQWRkIGNvbW1lbnQKLQlmb3IgaW5jb3JyZWN0IHVzZSBvZiBieXRlcy4KLQkqIHJlYWRlbGYuYzogQ2hhbmdlIG1hbnkgZm9ybWF0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQotMTk5OS0wNC0wMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChyZXNldF9zdGF0ZV9tYWNoaW5lKTogTmV3IGZ1bmN0aW9uLiAgUmVzZXRzIHRoZQotCXJlZ2lzdGVycyBvZiB0aGUgc291cmNlIGxpbmUgbnVtYmVyIHN0YXRlIG1hY2hpbmUuCi0JKHByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCk6IFVzZSBzdGF0ZSBtYWNoaW5lLgotCShkaXNwbGF5X2RlYnVnX2xpbmVzKTogVXNlIHN0YXRlIG1hY2hpbmUuICBIYW5kbGUgbXVsdGlwbGUgbGluZQotCW51bWJlciBibG9ja3Mgd2l0aGluIHRoZSBzYW1lIHNlY3Rpb24uCi0KLTE5OTktMDMtMjkgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3ApOiBlbmRfc2VxdWVuY2UgYWxzbyByZXNldHMKLQl0aGUgbGluZSBudW1iZXIuCi0JKGRpc3BsYXlfZGVidWdfbGluZXMpOiBhZHZhbmNlX2xpbmUgdGFrZXMgYSBzaWduZWQgb3BlcmFuZC4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogUHJpbnQgcmVmcyBhcyA8JXg+LCBhZGRyZXNzZXMgYXMgJSN4LAotCW90aGVycyBhcyAlZC4gIEhhbmRsZSBvdGhlciBsb2NhdGlvbiBleHByZXNzaW9uIGF0dHJpYnV0ZXMuCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IEhhbmRsZSBuZXN0aW5nLiAgQWx3YXlzIHByaW50IHRoZQlvZmZzZXQuCi0KLTE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogV2hlbiBjaGVja2luZyB3aGV0aGVyIHRvIGtlZXAgYQotCXN5bWJvbCwgY2hlY2sgdGhlIEJGRCBzZWN0aW9uIHN5bWJvbCBmb3IgYSBzeW1ib2wgd2l0aAotCUJTRl9TRUNUSU9OX1NZTSBzZXQuCi0KLTE5OTktMDMtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUHJpbnQgbmV3IFNvbGFyaXMgZHluYW1pYwotCXNlY3Rpb24gZW50cmllcy4gIENvcnJlY3QgcHJpbnRpbmcgb2YgRFRfUE9TRkxBR18xIGFuZCBEVF9GTEFHU18xLgotCi0xOTk5LTAzLTEwICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHJlcXVlc3RfZHVtcCk6IE5ldyBmdW5jdGlvbi4KLQlSZW1vdmVkIGFyYml0YXJ5IGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc2VjdGlvbnMgdGhhdCBjYW4gYmUKLQlkdW1wZWQuCi0KLVdlZCBNYXIgMTAgMTU6MTA6MTQgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobWFrZV9vbmVfbGliX2ZpbGUpOiBVc2UgJTA1ZCB0byBvdXRwdXQgdGhlIHN0dWIgbmFtZSBzbwotCW9yZGVyIGluIHRoZSBpbXBvcnQgbGlicmFyeSBpcyBwcmVzZXJ2ZWQuCi0KLTE5OTktMDItMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogRml4IGNvbXBpbGUgdGltZSB3YXJpbmdzLgotCi0xOTk5LTAyLTE3ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHJlc2Jpbi5jIChyZXNfdG9fYmluX3ZlcnNpb25pbmZvKTogSW5zdGVhZCBvZiBlbnRlcmluZyBhIHZhbHVlCi0JbGVuZ3RoIG9mIHplcm8gaW4gYSB2ZXJzaW9uIGluZm8gc3RyaW5nLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUKLQlsZW5ndGguCi0KLVR1ZSBGZWIgMTYgMTY6MDA6MzMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMy4gIENoYW5nZSBBTV9QUk9HX0lOU1RBTEwgdG8KLQlBQ19QUk9HX0lOU1RBTEwuICBBZGQgY29tbWVudHMgZm9yIEFDX0RFRklORSBjYWxscy4KLQkqIGFjY29uZmlnLmg6IFJlbW92ZS4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChyZWFkX2FuZF9kaXNwbGF5X2F0dHIpOiBBZGQgZGlzcGxheSBvZiBiYXNpYyB0eXBlCi0JZW5jb2RpbmdzLgotCShkaXNwbGF5X2RlYnVnX2FyYW5nZXMpOiBOZXcgZnVuY3Rpb246IERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIGEKLQkuZGVidWdfYXJhbmdlcyBzZWN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2luZm8pOiBEdW1wIHRhZ3MgZm91bmQgYWZ0ZXIgY29tcHVuaXQgZW50cnkuCi0KLQkqIGJpbnV0aWxzLnRleGk6IEZpeGVkIGJ1ZyBpbiByZWFkZWxmIGRvY3VtZW50YXRpb24uCi0KLU1vbiBGZWIgIDEgMTI6Mzg6MDEgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiByZWFkZWxmLmMgKGR1bXBfcmVsb2NhdGlvbnMpOiAgSGFuZGxlIEVNX0FSTSBhcyBSRUwuCi0KLTE5OTktMDEtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zeW1ib2xfdGFibGUpOiBEbyBub3QgcHJvZHVjZSBhIGhpc3RvZ3JhbSBvZgotCWJ1Y2tldCBjaGFpbnMgaWYgbm9uZSB3ZXJlIGZvdW5kLgotCi0xOTk5LTAxLTI3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ZXJzaW9uLmM6IEFkZCAxOTk5IGNvcHlyaWdodC4KLQotCSogYmludXRpbHMudGV4aSAocmVhZGVsZik6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucwotCS0tZGVidWctZHVtcCBhbmQgLS1oaXN0b2dyYW0uCi0KLQkqIHJlYWRlbGYuYzogQWRkIGFiaWxpdHkgdG8gZGlzcGxheSBjb250ZW50cyBvZiBzb21lIG9yIGFsbCBvZiB0aGUKLQlEd2FyZjIgZGVidWcgc2VjdGlvbnMuICB7V29yayBvbmx5IHBhcnRpYWxseSBjb21wbGV0ZWR9LgotCShkaXNwbGF5X2RlYnVnX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfaW5mbyk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2RlYnVnX2xpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKGRpc3BsYXlfZGVidWdfYWJicmV2KTogTmV3IGZ1bmN0aW9uLgotCShwcm9jZXNzX2FiYnJldl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShyZWFkX2xlYjEyOCk6IE5ldyBmdW5jdGlvbi4KLQkocHJvY2Vzc19leHRlbmRlZF9saW5lX29wKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfVEFHX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKGdldF9BVF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfRk9STV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShmcmVlX2FiYnJldnMpOiBOZXcgZnVuY3Rpb24uCi0JKGFkZF9hYmJyZXYpOiBOZXcgZnVuY3Rpb24uCi0JKGFkZF9hYmJyZXZfYXR0cik6IE5ldyBmdW5jdGlvbi4KLQkocmVhZF9hbmRfZGlzcGxheV9hdHRyKTogTmV3IGZ1bmN0aW9uLgotCShkaXNwbGF5X2Jsb2NrKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgSmFuIDE0IDIzOjM2OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29mZmR1bXAuYyAoeGNhbGxvYyk6IFJlbW92ZSwgaW4gbGliaWJlcnR5IG5vdy4KLQkqIHNyY29udi5jICh4Y2FsbG9jKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKHhjYWxsb2MpOiBMaWtld2lzZS4KLQotMTk5OS0wMS0xNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3NlY3Rpb25faGVhZGVycyk6IE9taXQgdHJhaWxpbmcgc3BhY2UgYXQgZW5kCi0Jb2Ygc2VjdGlvbiBoZWFkZXIgY29udGVudHMgbGluZS4KLQotV2VkIERlYyAxNiAxNzoyMDowNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00OiBSZWdlbmVyYXRlLgotCi1Nb24gRGVjIDE0IDEyOjU1OjM2IDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZGxsd3JhcC5jOiBJbmNsdWRlIGJmZC5oIGFuZCBidWNvbW0uaC4gIE1vdmUgZ2V0b3B0LmggaW5jbHVkZQotCWFmdGVyIGxpYmliZXJ0eS5oIGluY2x1ZGUuCi0KLVR1ZSBEZWMgIDggMTY6Mjk6NDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLjE6IEZpeCB0eXBvICgtZCB0byAtRCkuICBGcm9tIE5va3ViaSBIaXJvdGFrYQotCTxobm9rdWJpQHl5eS5vci5qcD4uCi0KLVN1biBEZWMgIDYgMTM6Mjg6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKFNGSUxFKTogQWRkIHNpemUgZmllbGQuCi0JKG9iamR1bXBfc3ByaW50Zik6IE1lcmdlIGJvdGggdmVyc2lvbnMgaW50byBvbmUuICBJbmNyZWFzZSBidWZmZXIKLQlzaXplIGFzIG5lZWRlZCB0byBhdm9pZCBvdmVyZmxvdy4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBDaGFuZ2UgYnVmIGZyb20gMTAwMCBieXRlcyB0byA1MC4gIENoYW5nZQotCWluaXRpYWxpemF0aW9uIGFuZCB1c2Ugb2Ygc2ZpbGUgdG8gbWF0Y2ggY2hhbmdlcyB0bwotCW9iamR1bXBfc3ByaW50Zi4KLQotCSogc3RyaXAuMTogRml4IHR5cG8gKC1WIHRvIC12KS4gIEZyb20gSXNzZWkgSGlyYXlhbWEKLQk8aXNzQG1haWwud2JzLm9yLmpwPi4KLQotMTk5OC0xMi0wMyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBJbXByb3ZlIG91dHB1dCBmb3JtYXQgZm9yCi0JdmFyaW91cyBEVF8qIHZhbHVlcy4KLQotMTk5OC0xMi0wMiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19taXBzX3NwZWNpZmljKTogUHJpbnQgLmNvbmZsaWN0IHNlY3Rpb24KLQljb250ZW50LgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IFByaW50IGxfZmxhZ3MgaW4gbGlibGlzdCBpbgotCXRleHR1YWwgZm9ybS4KLQotMTk5OC0xMS0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXIuYyAoZXh0cmFjdF9maWxlKTogQWRkIHNvbWUgcGFyYW5vaWEgY2hlY2tzIGZvciBuZWdhdGl2ZWx5Ci0Jc2l6ZWQgZmlsZXMuCi0KLVR1ZSBOb3YgMjQgMDk6Mzk6MjQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoRElSX1NFUEFSQVRPUik6IERlZmluZSBhcyAnXFwnIGlmIFdJTjMyIGlzIGRlZmluZWQuCi0KLVR1ZSBOb3YgMTcgMTA6MjU6MjYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLU1vbiBOb3YgMTYgMTk6MTc6MjMgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBwby9iaW51dGlscy5wb3Q6IFJlZ2VuZXJhdGUuCi0KLU1vbiBOb3YgMTYgMTA6MTg6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlZ2VybmF0ZWQgZGVwZW5kZW5jaWVzLgotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1TYXQgTm92IDE0IDE0OjUwOjU2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVidWcuYyAoZGVidWdfbmFtZV90eXBlKTogQ29ycmVjdCByZXR1cm4gdHlwZSBmcm9tIGZhbHNlIHRvCi0JREVCVUdfVFlQRV9OVUxMLgotCi1TYXQgTm92IDE0IDE0OjQ4OjIxIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2tpcCBvdmVyIHJlbG9jcyBiZWxvdyBzdGFydAotCWFkZHJlc3MuCi0KLVR1ZSBOb3YgMTAgMTU6MzE6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBkZXBlbmRlbmN5IG9mIHJlYWRlbGYuYyBvbiBlbGYvZnIzMC5oCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotV2VkIE5vdiAgNCAxNjoyNTo1NSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEFkZCBzdXBwb3J0IGZvciB0aGUgRlIzMC4KLQotTW9uIE5vdiAgMiAxNDo1OTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1GcmkgT2N0IDMwIDE1OjE0OjQ5IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmM6IGNoYW5nZSBhbGwgcmVmZXJlbmNlcyB0byBjeWd3aW4zMl8gdG8gY3lnd2luXywKLQljaGFuZ2UgQ3lnd2luIHRhcmdldCBkZWYgdG8gQ1lHV0lOLgotCi1XZWQgT2N0IDI4IDEwOjMxOjE5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFJlcGxhY2UgJ3Vuc2lnbmVkIGxvbmcnIHdpdGgKLQknYmZkX3ZtYScuCi0KLVR1ZSBPY3QgMjcgMTQ6Mzk6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IEFwcGxpZWQgdGhpcyBwYXRjaCBmcm9tIFBoaWxpcAotCUJsdW5kZWxsIDxwYkBuZXh1cy5jby51az46ICBNYWtlIGFkZHJlc3MgdmFyaWFibGVzIHVuc2lnbmVkIHRvCi0JYXZvaWQgcHJvYmxlbXMgd2hlbiBkaXNhc3NlbWJsaW5nIGNvZGUgYXQgaGlnaC1iaXQtc2V0IGFkZHJlc3Nlcy4KLQotTW9uIE9jdCAyNiAxNDowNzo1OSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHdyYXAuYyAoc3RyaGFzaCk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1haW4pOiBVc2UgaXQgdG8gc3VwcGx5IGltYWdlIGJhc2UgaWYgbm90IHN1cHBsaWVkIGJ5IHVzZXIuCi0gICAgICAgIChwcm9ncmFtX3ZlcnNpb24pOiBVcCB0byAwLjIuNC4KLQotTW9uIE9jdCAyNiAxNDowNzo1OSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotICAgICAgICAqIGRsbHRvb2wuYyAoYWRkX3N0ZGNhbGxfYWxpYXMpOiBOZXcgZ2xvYmFsLgotICAgICAgICAobG9uZ19vcHRpb25zKTogQWRkIC0tYWRkLXN0ZGNhbGwtYWxpYXMgb3B0aW9uLgotICAgICAgICAobWFpbik6IEhhbmRsZSBpdC4KLSAgICAgICAgKHNjYW5fZHJlY3R2ZV9zeW1ib2xzKTogQWRkIGFsaWFzIGlmIC0tYWRkLXN0ZGNhbGwtYWxpYXMgaXMKLSAgICAgICAgc3BlY2lmaWVkLgotICAgICAgICAoc2Nhbl9maWx0ZXJlZF9zeW1ib2xzKTogTGlrZXdpc2UuCi0gICAgICAgIChnZW5fZGVmX2ZpbGUpOiBPdXRwdXQgYWxpYXMgZm9yIHN0ZGNhbGwgc3ltcyBpZiBhcHByb3ByaWF0ZS4KLQotICAgICAgICAqIGJpbnV0aWxzLnRleGkgKGRsbHRvb2wpOiBEb2N1bWVudCAtLWFkZC1zdGRjYWxsLWFsaWFzIG9wdGlvbi4KLQotICAgICAgICAqIGRsbHdyYXAuYyAobG9uZ19vcHRpb25zKTogQWRkIC0tYWRkLXN0ZGNhbGwtYWxpYXMgb3B0aW9uLgotICAgICAgICAobWFpbik6IEhhbmRsZSBpdC4KLQotICAgICAgICAqIGRlZnBhcnNlLnkgKG9wdF9uYW1lKTogQWxsb3cgIi4iIGluIG5hbWUuCi0gICAgICAgICogZGxsdG9vbC5jIChkZWZfbmFtZSk6IFNldCBkbGxfbmFtZSBmcm9tIE5BTUUgZW50cnkgaW4gZGVmIGZpbGUuCi0gICAgICAgIChkZWZfbGlicmFyeSk6IFNldCBkbGxfbmFtZSBmcm9tIExJQlJBUlkgZW50cnkgaW4gZGVmIGZpbGUuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmMgKGxvbmdfb3B0aW9ucyk6IC0taW1wbGliIHN5bm9ueW0gZm9yIC0tb3V0cHV0LWxpYi4KLSAgICAgICAgKG1haW4pOiBQYXNzIC0tZXhwb3J0LWFsbCB0byBkbGx0b29sIG9ubHkgaWYgc3BlY2lmaWVkLgotICAgICAgICAocHJvZ3JhbV92ZXJzaW9uKTogVXAgdG8gMC4yLjMuCi0KLU1vbiBPY3QgMjYgMTQ6MDc6NTkgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLSAgICAgICAgKiBkbGx3cmFwLmMgKG15YmFzZW5hbWUpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtYWluKTogUnVuIGRsbHRvb2wgdG8gY3JlYXRlIGV4cG9ydCBkZWZpbml0aW9uIGZpbGUgYW5kIGltcG9ydAotICAgICAgICBsaWJyYXJ5IGZpbGUgaWYgbmVjZXNzYXJ5LgotICAgICAgICBDaGFuZ2UgZXhwX2ZpbGVfbmFtZSBzbyB0aGF0IGl0J3MgYmFzZWQgb24gdGhlIGRsbCBuYW1lLgotCi1TdW4gT2N0IDI1IDEwOjM3OjQ1IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0gICAgICAgICogZGxsdG9vbC5jIChzY2FuX2FsbF9zeW1ib2xzKTogRml4IHBhdGNoIGVycm9yLgotCi1GcmkgT2N0IDE2IDIyOjU2OjIwIDE5OTggIEZlbGl4IExlZSAgPGZsZWVAY3lnbnVzLmNvbT4KLQotCSogbm0uYyAoZGlzcGxheV9yZWxfZmlsZSk6IGZpeCAibm8gc3ltYm9scyIgbWVzc2FnZXMuCi0JKiBvYmpkdW1wLmMgKHNsdXJwX3N5bXRhYik6IGRpdHRvLgotCSogcG8vUE9URklMRVMuaW4sIHBvL2JpbnV0aWxzLnBvdDogcmVidWlsdAotCi1Nb24gT2N0IDEyIDE0OjI4OjAzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAoZHVtcF9yZWxvY2F0aW9ucyk6IFJlbmFtZSBmaWVsZCBmcm9tIFZhbHVlIHRvIEluZm8gdG8KLQltYXRjaCBuYW1lIG9mIGZpZWxkIGluIEVMRiBzdHJ1Y3R1cmVzLgotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogY2FsbCBBQ19FWEVFWFQgaW5zdGVhZCBvZiBBTV9FWEVFWFQgYW5kCi0JQU1fQ1lHV0lOMzIuCi0JKiBhY2xvY2FsLm00OiByZW1vdmUgbG9jYWwgQU1fRVhFRVhUL0FNX0NZR1dJTjMyIG1hY3Jvcy4KLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQlGcm9tIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PjoKLSAgICAgICAgKiBkbGx0b29sLmMgKHNjYW5fYWxsX3N5bWJvbHMpOiBEb24ndCByZS1leHBvcnQgc3ltYm9scyBleHBvcnRlZAotICAgICAgICBieSBvdGhlciBETExzLgotCi1UaHUgT2N0ICA4IDE1OjMzOjA4IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChCVUlMRF9ETExXUkFQKTogQWRkLgotCShCVUlMRF9ETExXUkFQLCBETExXUkFQX1BST0cpOiBBZGQuCi0JKGJpbl9QUk9HUkFNUyk6IEFkZCBkbGx3cmFwLgotCSogTWFrZWZpbGUuaW46IHJlZ2VuZXJhdGUgd2l0aCBhdXRvbWFrZQotCi0JRnJvbSBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT46Ci0gICAgICAgICogZGxsd3JhcC5jOiBOZXcgZmlsZSBmcm9tIGRsbGhlbHBlcnMgdjAuMi4xLgotCShwcmludF92ZXJzaW9uKTogTmV3IGZ1bmN0aW9uLgotCShsb25nX29wdGlvbnMpOiBBZGQgLS12ZXJzaW9uLgotCShtYWluKTogSGFuZGxlLgotICAgICAgICAqIGR5bi1zdHJpbmcuaCwgZHluLXN0cmluZy5jOiBOZXcgZmlsZXMgZnJvbSBlZ2NzLTEuMS9nY2MuCi0gICAgICAgICogY29uZmlndXJlLmluIChCVUlMRF9ETExXUkFQKTogQWRkLgotICAgICAgICAqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVHVlIE9jdCAgNiAxODoyMDoxMCAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAod2luZHJlc19TT1VSQ0VTKTogQWRkIHJlc3Jlcy5jLgotCSh3aW5kcmVzX09CSkVDVFMpOiBBZGQgcmVzcmVzLm8uCi0JKiBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZSB3aXRoIGF1dG9tYWtlCi0KLSAgICAgICAgRnJvbSBBbmRlcnMgTm9ybGFuZGVyIDxhbm9ybGFuZEBoZW0yLnBhc3NhZ2VuLnNlPi4KLSAgICAgICAgKiByZXNyZXMuYzogTmV3IGZpbGUuICBJbXBsZW1lbnRhdGlvbiBvZiByZWFkX3Jlc19maWxlIGFuZAotICAgICAgICB3cml0ZV9yZXNfZmlsZSBmdW5jdGlvbnMgZm9yIHdpbmRyZXMuCi0gICAgICAgICogcmNwYXJzZS55OiBIYW5kbGUgQ09OVFJPTCdzIHdpdGggbmFtZWQgY2xhc3Nlcy4KLSAgICAgICAgKiByZXNiaW4uYzogQnVnIGluIHJlc190b19iaW5fZGlhbG9nIGFuZCBiaW5fdG9fcmVzX2RpYWxvZwotICAgICAgICB3aGVuIGRpYWxvZyBpcyBleHRlbmRlZDogVGhlIHZlcnNpb24gYW5kIHNpZ25hdHVyZSBmaWVsZHMgc2hvdWxkCi0gICAgICAgIGJlIHJldmVyc2VkIChkZXNwaXRlIHdoYXQgdGhlIGRvY3Mgc2F5KS4gSWQgaXMgMzIgYml0cyBsb25nIGluCi0gICAgICAgIGV4dGVuZGVkIGRpYWxvZ3MuCi0gICAgICAgICogcmVzcmMuYyAod3JpdGVfcmNfZGlhbG9nKTogcHJvcGVybHkgcHJpbnQgY29udHJvbHMgd2l0aCBuYW1lZAotICAgICAgICBjbGFzc2VzLgotICAgICAgICAqIHdpbmRyZXMuYyAocmVhZF9yZXNfZmlsZSwgd3JpdGVfcmVzX2ZpbGUpOiBSZW1vdmUgc3R1YnMuCi0gICAgICAgICogcmVzcmVzLmMgKHdyaXRlX3Jlcyk6IFJlbmFtZSBSVF9BQ0NFTEVSQVRPUlMgdG8gUlRfQUNDRUxFUkFUT1IuCi0KLVN1biBPY3QgIDQgMjA6MzQ6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBOb2t1YmkgSGlyb3Rha2EgPGhub2t1YmlAeXl5Lm9yLmpwPjoKLQkqIG9iamNvcHkuMTogRml4IHR5cG8gaW4gLS1yZW1vdmUtbGVhZGluZy1jaGFyIGRvY3MuCi0JKiBvYmpkdW1wLjE6IEZpeCBmb3JtYXR0aW5nIGluIC0tc3RhYnMgZG9jcy4KLQotU2F0IFNlcCAxOSAyMzozMzo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjcGFyc2UueSAobWVtZmxhZ3NfbW92ZSk6IENvcnJlY3QgcmVjdXJzaW9uLgotCi0xOTk4LTA5LTEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWJvbF90YWJsZSk6IFByaW50IGluIGhpc3RvZ3JhbSBob3cgbWFueQotCXN5bWJvbHMgYXJlIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgY2hhaW4gbGVuZ3RoLgotCi1TdW4gU2VwICA2IDE2OjE1OjQ3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzKTogRG8gbm90IHRyeSB0byBkdW1wIGVtcHR5Ci0Jc2VjdGlvbnMuCi0KLVNhdCBTZXAgIDUgMTk6MTc6MTAgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGRsbHRvb2wuYyAoc2Nhbl9hbGxfc3ltYm9scyk6IERvbid0IHJlLWV4cG9ydCBzeW1ib2xzIGV4cG9ydGVkCi0JYnkgb3RoZXIgRExMcy4KLQotMTk5OC0wOS0wMiAxNDo1MCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19keW5hbWljX3NlZ21lbnQpOiBQcmludCBEVF8qIHZhbHVlIG9ubHkgaWYKLQlkb19keW5hbWljLgotCShkb19oaXN0b2dyYW0pOiBOZXcgdmFyaWFibGUuCi0JKG9wdGlvbnMpOiBOZXcgbG9uZyBvcHRpb24gaGlzdG9ncmFtLiAgU2V0IGRvX2hpc3RvZ3JhbSBpZiB0aGlzCi0Jb3B0aW9uIGlzIHVzZWQuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1oaXN0b2dyYW0uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgMCByZXR1cm4gdmFsdWUgZnJvbSBnZXRvcHRfbG9uZy4gIEVuYWJsZQotCWRvX2hpc3RvZ3JhbSBmb3IgLWEuCi0JKHByb2Nlc3Nfc3ltYm9sX3RhYmxlKTogUmVhZCBoYXNoIHRhYmxlIGFsc28gaWYgb25seSBkb19oaXN0b2dyYW0uCi0JQWRkIGNvZGUgdG8gcHJpbnQgaGFzaCB0YWJsZSBoaXN0b2dyYW0uCi0KLTE5OTgtMDgtMjUgMTY6NDUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmMgKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogUmVhZCBzeW1pbmZvIHNlY3Rpb24gaWYKLQlhdmFpbGFibGUuCi0JKHByb2Nlc3Nfc3ltaW5mbyk6IE5ldyBmdW5jdGlvbi4gIFByaW50IHN5bWluZm8gaW5mb3JtYXRpb24uCi0JKHByb2Nlc3NfZmlsZSk6IENhbGwgcHJvY2Vzc19zeW1pbmZvIGFuZCBmcmVlIHN5bWluZm8gZGF0YSBhdCB0aGUgZW5kLgotCi1XZWQgQXVnIDE5IDE2OjE5OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jICh1c2FnZSk6IEFkZCBmaWxlIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWFpbik6IERvbid0IHRyZWF0ICc/JyBhcyBhIHNwZWNpYWwgY2FzZSBpbiBnZXRvcHQgcmV0dXJuLgotCi0JKiBiaW51dGlscy50ZXhpIChkbGx0b29sKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuICBBZGQgc29tZSB1c2VzIG9mCi0JQHZhci4KLQotV2VkIEF1ZyAxOSAxNjoxOTowNyAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogZGxsdG9vbC5jIChnZW5fZGVmX2ZpbGUpOiBQbHVnIG1lbW9yeSBsZWFrLiAgRG9uJ3QgcHJpbnQKLQlkZW1hbmdsZWQgbmFtZSBpZiBpdCBpcyBOVUxMLgotCi0JU3VwcG9ydCBmb3IgZXhwb3J0aW5nIGFsbCBzeW1ib2xzIHRvIGFuIG91dHB1dCBleHBvcnQgZGVmIGZpbGU6Ci0JKiBkbGx0b29sLmMgKHtleHBvcnRfYWxsX3N5bWJvbHMsIG5vX2RlZmF1bHRfZXhjbHVkZXMsCi0Jbm9fZGVmYXVsdF9leGNsdWRlcywgZXhjbHVkZXN9KTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlcy4KLQkoc3RydWN0IHN0cmluZ19saXN0KTogVHlwZSB0byBob2xkIGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLgotCShzY2FuX2RyZWN0dmVfc3ltYm9scyk6IFJlbmFtZWQgZnJvbSBzY2FuX29wZW5fb2JqX2ZpbGUuCi0JKHNjYW5fZmlsdGVyZWRfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGFkZF9leGNsdWRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG1hdGNoX2V4Y2x1ZGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzZXRfZGVmYXVsdF9leGNsdWRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbHRlcl9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2Nhbl9hbGxfc3ltYm9scyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNjYW5fb3Blbl9vYmpfZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHVzYWdlKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCBuZXcgb3B0aW9ucy4KLQkobWFpbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQotMTk5OC0wNy0zMSAyMToyNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYyAocHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMpOiBQcmludCBwX29mZnNldCB2YWx1ZSB3aXRoCi0Jc2l4IGhleCBkaWdpdHMuCi0JKGR5bmFtaWNfc2VnbWVudF9taXBzX3ZhbCk6IEFkZCBzdXBwb3J0IGZvciBEVF9NSVBTX0ZMQUdTLAotCURUX01JUFNfSVZFUlNJT04sIGFuZCBEVF9NSVBTX1RJTUVfU1RBTVAuCi0JKHByb2Nlc3NfbWlwc19zcGVjaWZpYyk6IEFsc28gcHJpbnQgc2Vjb25kcyBvZiB0aW1lIHN0YW1wLgotCi1GcmkgSnVsIDMxIDEwOjA0OjIzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogIEVNX0FSTSB1c2VzIHJlbGEgcmVsb2NzLgotCi0xOTk4LTA3LTMwIDE2OjI1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfZHluYW1pY190eXBlKTogRG9uJ3QgdXNlZCBnZXR0ZXh0IG9uIHRoZSBuYW1lcy4KLQlBZGQgbmV3IERUXyogdmFsdWVzIGZyb20gU29sYXJpcy4gIERvbid0IHByaW50IG51ZW1yaWMgdmFsdWUgaW4KLQljYXNlIG9mIGFuIHVua25vd24gZW50cnkuCi0JKHByb2Nlc3NfZHluYW1pY19zZWdtZW50KTogSGFuZGxlIG5ldyBEVF8qIGVudHJpZXMuICBQcmludCBudW1lcmljCi0JdmFsdWVzIGluIGRlY2ltYWwsIG5vdCBoZXguCi0KLUZyaSBKdWwgMjQgMTY6Mjg6NTcgMTk5OCAgSmVmZiBIb2xjb21iICA8amVmZmhAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfZHluYW1pY190eXBlKTogUmVtb3ZlIGVtcHR5IGRlZmF1bHQgZnJvbSBzd2l0Y2gKLQlzdGF0ZW1lbnQuCi0KLUZyaSBKdWwgMjQgMTY6Mjg6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDI0IDA5OjM4OjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogUmVtb3ZlZCBzcHVyaW91cyBpbmNsdXNpb24gb2YgZWxmL2ludGVybmFsLmggYW5kCi0JZWxmLWJmZC5oLgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jOiBDb25zaXN0YW50bHkgdXNlIGVsZl8gcHJlZml4IGZvciAqX3JlbG9jX3R5cGUKLQlmdW5jdGlvbnMuCi0KLVdlZCBKdWwgMjIgMTY6Mjk6MTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogQWRkIGR1bXBzIG9mIEhQUEEgYW5kIEFSQwotCXJlbG9jYXRpb25zLgotCi0JKHByb2Nlc3NfcmVsb2NzKTogRG8gbm90IGFib3J0IGlmIG5vIHN0cmluZyB0YWJsZSBjYW4gYmUgZm91bmQuCi0KLTE5OTgtMDctMjIgMTQ6NTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFJlbW92ZSBkZWZpbml0aW9uIG9mIGZ1bmN0aW9ucyB0byByZXR1cm4gcmVsb2NhdGlvbgotCXN5bWJvbCBzdHJpbmdzLiAgVGhleSBub3cgZ2V0IGltcGxpY2l0bHkgZGVmaW5lZCB3aGVuIGluY2x1ZGUgdGhlCi0Jc3lzdGVtIHNwZWNpZmljIEVMRiBoZWFkZXIuCi0KLTE5OTgtMDctMjIgMTM6NTEgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEJlZm9yZSBpbmNsdWRlIHN5c3RlbSBzcGVjaWZpYyBFTEYgaGVhZGVyIGRlZmluZQotCVNUQVJUX1JFTE9DX05VTUJFUlMsIFJFTE9DX05VTUJFUiwgYW5kIEVORF9SRUxPQ19OVU1CRVJTLiAgRm9yIG5vdwotCXVzZWQgZm9yIHBwYywgbWlwcywgYW5kIG1uMTAzMDAuCi0KLVdlZCBKdWwgMjIgMTA6MjY6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChkdW1wX3JlbG9jYXRpb25zKTogRGlzcGxheSBudW1iZXIgb2YgdW5yZWNvZ25pc2VkCi0JcmVsb2NhdGlvbnMuCi0KLTE5OTgtMDctMjEgMTM6MTMgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFVzZSBzeW1ib2xpYyBuYW1lcyBvZiByZWxvY2F0aW9uIGVudHJpZXMgZm9yIHRoZSB2YXJpb3VzCi0JYXJjaGl0ZWN0dXJlcy4gIENvcnJlY3QgbW9yZSBsYXlvdXQgZGV0YWlscy4KLQlQcmludCBuYW1lcyBvZiBNSVBTIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICBQcmludCBBbHBoYSwgQVJNLCBhbmQKLQlNSVBTIHJlbG9jYXRpb24gdHlwZSBuYW1lcy4KLQotMTk5OC0wNy0yMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBBZGQgY29kZSBmb3Igc3RyaXAgYWxsIHN5bWJvbHMgY2FzZS4KLSAgICAgICAgKGNvcHlfb2JqZWN0cyk6IFN0cmlwIGFsbCBjYXNlIGlzIG5vdyBwcm9jZXNzZWQgYWxzbyB0aHJvdWdoCi0JZmlsdGVyX3N5bWJvbHMuICBObyBtYXJraW5nIHN5bWJvbHMgdXNlZCBpbiByZWxvY2F0aW9ucyB3aGVuIHN0cmlwCi0JYWxsIHN5bWJvbHMgY2FzZS4KLQkoY29weV9zZWN0aW9uKTogV2hlbiBzdHJpcCBhbGwgc3ltYm9scyBjYXNlLCByZW1vdmUgcmVsb2NhdGlvbnMKLQl3aGljaCBhcmUgbm90IGluIGtlZXAgc3RyaXAgc3BlY2lmaWMgbGlzdC4KLQkoc3RyaXBfbWFpbik6IFJlbW92ZSBndWFyZCBgc3RyaXBfc3BlY2lmaWNfbGlzdCA9PSBOVUxMJyBmb3IKLQlzZXR0aW5nIHVwIHN0cmlwIGFsbCBzeW1ib2xzIGJ5IGRlZmF1bHQuCi0KLU1vbiBKdWwgMjAgMTI6NTE6MTYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGFkZHIybGluZS5jIChmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbik6IE9ubHkgY29uc2lkZXIgYSBzZWN0aW9uCi0JaWYgdGhlIHBjIHZhbHVlIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiBpdC4KLQkodHJhbnNsYXRlX2FkZHJlc3Nlcyk6IERvbid0IGNyYXNoIGlmIGZ1bmN0aW9ubmFtZSBvciBmaWxlbmFtZSBhcmUKLQludWxsLgotCi0xOTk4LTA3LTIwIDA3OjQ1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChwcm9jZXNzX3N5bWJvbF90YWJsZSk6IEZpeCBsaXR0bGUgYWxpZ25tZW50IHByb2JsZW0KLQlpbiBwcmludGVkIHRhYmxlIGhlYWRlci4KLQotMTk5OC0wNy0yMCAwNzoxNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogQ29ycmVjdCByZWFkaW5nIG9mIC5keW5hbWljIHNlY3Rpb24uCi0JKGR5bmFtaWNfc2VjdGlvbik6IE5vdyBhIGdsb2JhbCB2YXJpYWJsZS4KLQkocHJvY2Vzc19taXBzX2ZwZV9leGNlcHRpb24sIHByb2Nlc3NfbWlwc19zcGVjaWZpYywKLQlwcm9jZXNzX2FyY2hfc3BlY2lmaWMpOiBOZXcgZnVuY3Rpb25zLgotCShnZXRfZmlsZV9oZWFkZXIpOiBDYWxsIHByb2Nlc3NfYXJjaF9zcGVjaWZpYy4KLQotMTk5OC0wNy0xOSAxNToxNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogRml4IHNldmVyYWwgdmVyc2lvbmluZyByZWxhdGVkIGJ1Z3MuICBQcm9kdWNlIG5pY2VyCi0Jb3V0cHV0LgotCUFkZCBzdXBwb3J0IGZvciBwcm9jZXNzb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gb24gTUlQUy4KLQotRnJpIEp1bCAxMCAxNTo1Nzo1OCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFN3aXRjaCBwcm90b3R5cGVzIGZyb20gdW5zaWduZWQgc2hvcnQgdG8gdW5zaWduZWQKLQlpbnQuCi0KLUZyaSBKdWwgMTAgMTY6MTc6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBDaHJpc3RpYW4gSG9sbGFuZCA8Q0hvbGxhbmRAZGUubHVjZW50LmNvbT46Ci0JKiBpZWVlLmMgKHBhcnNlX2llZWUpOiBJbml0aWFsaXplIGluZm8uZ2xvYmFsX3ZhcnMgYW5kCi0JaW5mby5nbG9iYWxfdHlwZXMuCi0JKHBhcnNlX2llZWVfYXRuKTogSWdub3JlIHJlZ2lzdGVyIGxpZmV0aW1lIGluZm9ybWF0aW9uIHJlcG9ydGVkbHkKLQllbWl0dGVkIGJ5IE1SSSBjb21waWxlci4KLQotVGh1IEp1bCAgOSAxMzowODowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVsICA3IDIxOjQ4OjU0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcmVhZGVsZi5jIChieXRlX2dldCk6IFVzZSBQQVJBTVMgaW4gcHJvdG90eXBlLgotCShlcnJvcik6IE1ha2UgaXQgd29yayB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4KLQkod2Fybik6IExpa2V3aXNlLgotCShnZXRfdmVyX2ZsYWdzKTogRG9uJ3QgdXNlIGFuIEFOU0kgcHJvdG90eXBlIGluIHRoZSBkZWZpbml0aW9uLgotCi1UdWUgSnVsICA3IDEzOjI2OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBTZXQgc2l6ZSBjb3JyZWN0bHkgaWYgdGhlIHNpemUgb2YgdGhlCi0Jc2VjdGlvbiBpcyBub3QgYW4gZXZlbiBtdWx0aXBsZSBvZiB0aGUgaW50ZXJsZWF2ZS4gIEJhc2VkIG9uIHBhdGNoCi0JZnJvbSBCcmlvbiBTdG9uZSA8QnJpb24uU3RvbmVAYXR0d3MuY29tPi4KLQotVGh1IEp1bCAgMiAxNDowMTozNCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHJtaS5kZT4KLQotCSogY29uZmlndXJlLmNvbTogQWRkIHZheC92bXMgc3VwcG9ydC4KLQkqIG1ha2VmaWxlLnZtcy1pbjogUmVuYW1lZCBmcm9tIG1ha2VmaWxlLnZtcy4gIEFkZCBzdWJzdGl0dXRpb25zCi0Jbm93IGRvbmUgYnkgY29uZmlndXJlLmNvbS4KLQotV2VkIEp1bCAgMSAyMDo0Mzo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEhhbmRsZSA0IGFuZCA4IGJ5dGUgc2lnbmVkCi0gCWludGVnZXJzIHdpdGggcmVhbCB1cHBlciBib3VuZHMuICBIYW5kbGUgYSBsb3dlciBib3VuZCBvbmUgbGFyZ2VyCi0gCXRoYW4gdGhlIHVwcGVyIGJvdW5kIGFzIGEgc2lnbmVkIGludGVnZXIuICBIYW5kbGUgOCBieXRlIHNpZ25lZAotCWludGVnZXJzLgotCShzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlKTogT3B0aW9uYWxseSByZXR1cm4gdGhlIGRlbWFuZ2xlZCBuYW1lIG9mCi0JdGhlIHRlbXBsYXRlLgotCShzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZCk6IFRyZWF0IGEgdGVtcGxhdGUgbmFtZSBhcyBhIHRhZ2dlZAotCXR5cGUuCi0JKHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlKTogTGlrZXdpc2UuCi0KLVdlZCBKdWwgIDEgMTY6Mjk6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jOiBNaW5vciBmb3JtYXR0aW5nIGltcHJvdmVtZW50cy4KLQkqIHJlYWRlbGYuYzogTWlub3Igb3V0cHV0IGZvcm1hdHRpbmcgaW1wcm92ZW1lbnQuCi0KLVdlZCBKdWwgIDEgMTQ6MjM6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByY2xleC5sOiBBZGQgY2FzdHMgYW5kIGNoYW5nZSB0eXBlcyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIHJjcGFyc2UueTogTGlrZXdpc2UuCi0JKiByZXNiaW4uYzogTGlrZXdpc2UuCi0JKiByZXNjb2ZmLmM6IExpa2V3aXNlLgotCSogcmVzcmMuYzogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLSAJKEhGSUxFUyk6IFJlbW92ZSByZWFkZWxmLmguCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBBbmRyZXcgS296aW4KLQk8QW5kcmV3LktvemluQHAxNC5mOTYwLm41MDIwLnoyLmZpZG9uZXQub3JnPjoKLQkqIHdpbmR1bmkuaDogTmV3IGZpbGUsIGZyb20gd2luZHJlcy5oLgotCSogd2luZHVuaS5jOiBOZXcgZmlsZSwgZnJvbSB3aW5kcmVzLmMuCi0JKiB3aW5kcmVzLmM6IE1vdmUgVW5pY29kZSBmdW5jdGlvbnMgaW50byB3aW5kdW5pLmMuCi0JKiB3aW5kcmVzLmg6IE1vdmUgVW5pY29kZSBkZWNsYXJhdGlvbnMgaW50byB3aW5kdW5pLmguICBJbmNsdWRlCi0Jd2luZHVuaS5oLgotIAkoUlRfQUNDRUxFUkFUT1IpOiBSZW5hbWUgZnJvbSBSVF9BQ0NFTEVSQVRPUlMgdG8gbWF0Y2ggV2luZG93cwotCW1hY3JvLiAgQ2hhbmdlIGFsbCB1c2VzLgotCShSVF9QTFVHUExBWSwgUlRfVlhEKTogQ29ycmVjdCB2YWx1ZXMuCi0JKiBNYWtlZmlsZS5hbSAoSEZJTEVTKTogQWRkIHdpbmRyZXMuaC4KLQkoQ0ZJTEVTKTogQWRkIHdpbmR1bmkuYy4KLQkod2luZHJlc19TT1VSQ0VTKTogQWRkIHdpbmR1bmkuYy4KLQotTW9uIEp1biAyOSAxNzowMToyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFVzZSBCRkQgSW50ZXJuYWwgYW5kIEV4dGVybmFsIEVsZiBzdHJ1Y3R1cmVzLgotCSogcmVhZGVsZi5oOiBSZW1vdmVkIC0gbm8gbG9uZ2VyIG5lZWRlZC4KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgcmVhZGVsZi5jJ3MgZGVwZW5kZW5jeSB1cG9uIHJlYWRlbGYuaC4KLQotMTk5OC0wNi0yNiAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IGtlZXBfc3BlY2lmaWNfbGlzdCA9PSBOVUxMIGFzIGFkZGl0aW9uYWwKLQljb25kaXRpb24gdG8gc2V0IHVwIHN0cmlwIGFsbCBzeW1ib2xzIGJ5IGRlZmF1bHQuCi0JKGNvcHlfYXJjaGl2ZSk6IGRvbid0IGNoYW5nZSBhcmNoaXZlIHdoZW4gZXJyb3IgaW4gb2JqZWN0IGZpbGVzIG9mCi0JdGhlIGFyY2hpdmUuCi0KLVdlZCBKdW4gMjQgMTc6NTM6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9udW1iZXIpOiBTaWduIGV4dGVuZCBuZWdhdGl2ZSB2YWx1ZXMgY29ycmVjdGx5IGlmCi0JYmZkX3ZtYSBpcyBsYXJnZXIgdGhhbiB1bnNpZ25lZCBsb25nLgotCi1UdWUgSnVuIDIzIDE0OjU1OjA1IDE5OTggIE1pa2UgU3R1bXAgIDxtcnNAd3JzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IERvbid0IGxldCBFWEVFWFQgaW50ZXJmZXJlCi0Jd2l0aCB0aGUgcHJvZ3JhbSB0cmFuc2Zvcm0gbmFtZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVuIDIzIDExOjA4OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogUmV3cml0ZSB0byB1c2UgZm9wZW4vZnJlYWQgcmF0ZWhyIHRoYW4gbW1hcC4KLQotCUFkZCAtLXNlY3Rpb24taGVhZGVycyBjb21tYW5kIGxpbmUgc3dpdGNoLCB3aGljaCBpcyBhbiBhbGlhcyBmb3IKLQktLXNlY3Rpb25zLgotCi0JSW5jb3Jwb3JhdGUgaW1wcm92ZW1udHMgbWFkZSBieSBBbmRyZWFzIFNjaHdhYgotCTxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+IGluY2x1ZGluZyBvdXRwdXQKLQlmb3JtYXR0aW5nIGFuZCB2ZXJzaW9uIGluZm8gZGlzcGxheS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgLS1zZWN0aW9uLWhlYWRlcnMgc3dpdGNoIHRvIHJlYWRlbGYuCi0KLU1vbiBKdW4gMjIgMTg6Mjg6MTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IEluY2x1ZGUgYmZkLmggYW5kIGJ1Y29tbS5oIGJlZm9yZSBzeXN0ZW0gaGVhZGVyCi0JZmlsZXMuCi0JKHBhcnNlX2FyZ3MpOiBDaGFuZ2UgdHlwZSBvZiBjIGZyb20gY2hhciB0byBpbnQuCi0KLVN1biBKdW4gMTQgMTQ6MjY6MjggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jICh1c2FnZSk6IFdyaXRlIHRvIHN0ZG91dCwgbm90IHN0ZGVyci4KLQotRnJpIEp1biAxMiAxMzozMzo1MSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBEZXBlbmQgb24gLnBvdCBmaWxlIGlmIG1haW50YWluZXIgbW9kZQotCWVuYWJsZWQuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotRnJpIEp1biAxMiAxNjowNjoxNSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcmVhZGVsZi5jIChnZXRfcHBjX3JlbF90eXBlKTogTmV3IFBvd2VyUEMgc3VwcG9ydC4KLQkoZHVtcF9yZWxvY2F0aW9ucyk6IFBvd2VyUEMgdXNlcyBSRUxBIHJlbG9jYXRpb25zLgotCShnZXRfbWFjaGluZV9uYW1lKTogU3BlbGwgUG93ZXJQQyBjb3JyZWN0bHkuCi0JKGdldF9maWxlX3R5cGUpOiBDaGFuZ2UgdW5zaWduZWQgc2hvcnQgcGFyYW1ldGVyIHRvIHVuc2lnbmVkLgotCShnZXRfbWFjaGluZV9uYW1lKTogRGl0dG8uCi0JKGdldF9tYWNoaW5lX2RhdGEpOiBSZXR1cm4gd2hldGhlciBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4uCi0JKGdldF9tYWNoaW5lX2ZsYWdzKTogSW50ZXJwcmV0IFBvd2VyUEMsIE0zMlIsIGFuZCBNSVBTIGZsYWdzLgotCShwcm9jZXNzX2VsZl9oZWFkZXIpOiBQcmludCBlbmRpYW4tZXNzLiAgQ29udmVydCBhbGwgbnVtZXJpYwotCWZvcm1hdHMgdG8gbG9uZyBvciB1bnNpZ25lZCBsb25nLiAgUHJpbnQgb3V0IG1hY2hpbmUgc3BlY2lmaWMgZmxhZwotCWJpdHMuCi0JKHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzKTogSW5jcmVhc2UgbmFtZSBieSAzIGNvbHVtbnMgYW5kIGRlY3JlYXNlCi0JdHlwZSBieSB0aGUgc2FtZSBzbyB0aGF0IC5nY2NfZXhjZXB0X3RhYmxlIGZpdHMgaW4gdGhlIHNwYWNlLgotCi0JKiByZWFkZWxmLmg6IEluY2x1ZGUgZWxmL3BwYy5oLCBlbGYvbWlwcy5oLCBhbmQgZWxmL20zMnIuaCB0byBnZXQKLQltYWNoaW5lIHNwZWNpZmljIGZsYWcgYml0cy4KLQotVGh1IEp1biAxMSAxNzo1NDoyNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWFkZWxmLmM6IFJlbW92ZSBleHRyYW5lb3VzICNpbmNsdWRlcy4gIEZpeCB3YXJuaW5ncyBwcm9kdWNlZAotCWJ5IC1XYWxsIHdoZW4gY29tcGlsaW5nIHVuZGVyIExpbnV4LgotCi0JKiBNYWtlZmlsZS5hbSAocmVhZGVsZl9MREFERCk6IEFkZCAkKExJQklCRVJUWSkuCi0KLVRodSBKdW4gMTEgMTg6MzA6MjAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgc2VsZl9jcm9zc3JlZiBmaWVsZC4KLQkocGFyc2Vfc3RhYl9zdHJpbmcpOiBJZiBhIHRhZyBpcyBhIGNyb3NzIHJlZmVyZW5jZSB0byBpdHNlbGYsCi0JZG9uJ3QgZGVmaW5lIGl0IGluIHRoZSB0YWdzIGxpc3QuCi0JKHBhcnNlX3N0YWJfdHlwZSk6IFNldCBpbmZvLT5zZWxmX2Nyb3NzcmVmLgotCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QpOiBEZWZpbmUuCi0JKGRlYnVnX2dldF9yZWFsX3R5cGUpOiBBZGQgbGlzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JQ2hlY2sgZm9yIGNpcmN1bGFyaXR5IHRvIGF2b2lkIGNyYXNoaW5nIHdoZW4gaXQgb2NjdXJzLgotCi1UaHUgSnVuIDExIDE0OjQ4OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlYWRlbGYuYzogTmV3IGZpbGU6IERpc3BsYXkgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlLgotCSogcmVhZGVsZi5oOiBOZXcgZmlsZTogSGVhZGVyIGZpbGUgZm9yIHJlYWRlbGYuYwotCSogTWFrZWZpbGUuYW06IEFkZCBydWxlcyB0byBidWlsZCByZWFkZWxmLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQuCi0JKiBiaW51dGlscy50ZXhpOiBEb2N1bWVudCByZWFkZWxmLgotCSogTkVXUzogTWVudGlvbiBpbmNsdXNpb24gb2YgcmVhZGVsZiBpbnRvIGJpbnV0aWxzLgotCSogcG8vUE9URklMRVMuaW47IFJlYnVpbHQuCi0KLUZyaSBKdW4gIDUgMTg6NDM6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBBZGp1c3QgdGhlIHNlY3Rpb24gc2l6ZSBpZiBjb3B5X2J5dGUKLQlpcyA+PSAwLgotCShjb3B5X3NlY3Rpb24pOiBEbyBub3QgY2FsbCBiZmRfc2V0X3NlY3Rpb25fc2l6ZS4KLQotVGh1IEp1biAgNCAwOToxMjoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfdXNhZ2UpOiBBZGQgbWlzc2luZyBcblwgZnJvbSBoZWxwIGRlc2NyaXB0aW9uLgotCi1XZWQgSnVuICAzIDE5OjMxOjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKFlBQ0MpOiBDb3JyZWN0IGJpc29uIC1MIG9wdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1wLy0tcHJpdmF0ZS1oZWFkZXJzLgotCi1XZWQgSnVuICAzIDEyOjA5OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogQWRkIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uczogLS1jaGFuZ2Utc2VjdGlvbi1sbWEKLQlhbmQgLS1jaGFuZ2Utc2VjdGlvbi12bWEuICBSZW5hbWUgb2xkIGNvbW1hbmQgbGluZSBvcHRpb24KLQktLWFkanVzdC1zZWN0aW9uLXZtYSB0byAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MuICBSZW5hbWUKLQktLWFkanVzdC12bWEgdG8gLS1jaGFuZ2UtYWRkcmVzc2VzIGFuZCAtLWFkanVzdC1zdGFydCB0bwotCS0tY2hhbmdlLXN0YXJ0LiAgUHJvdmlkZSBhbGlhc2VzIHRvIHN1cHBvcnQgdGhlIG9sZCB2ZXJzaW9ucyBvZgotCXRoZXNlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi0JQ2hhbmdlIHRoZSBuYW1lcyBvZiBtYWNyb3MgYW5kIGVudW0gZWxlbWVudHMgdG8gdXBwZXIgY2FzZSB0bwotCW1hdGNoIHRoZSBHTlUgY29kaW5nIHN0YW5kYXJkLgotCi0JUmVwbGFjZSBjYWxscyB0byBmcHJpbnRmIChzdGRlcnIsLi4uKSB3aXRoIGNhbGxzIHRvIGZhdGFsICgpIG9yCi0Jbm9uX2ZhdGFsICgpIGFzIGFwcHJvcHJpYXRlLgotCi0JKiBvYmpjb3B5LjE6IERvY3VtZW50IGNvbW1hbmQgbGluZSBvcHRpb24gY2hhbmdlcy4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IGNvbW1hbmQgbGluZSBvcHRpb24gY2hhbmdlcy4KLQotCSogYnVjb21tLmg6IE5ldyBleHBvcnRlZCBmdW50aW9uIGZyb20gYnVjb21tLmM6IG5vbl9mYXRhbCgpLgotCSogYnVjb21tLmMgKG5vbl9mYXRhbCk6IE5ldyBleHBvcnRlZCBmdW5jdGlvbi4gIEp1c3QgbGlrZSBmYXRhbCgpCi0JZXhjZXB0IHRoYXQgaXQgcmV0dXJucyByYXRoZXIgdGhhbiBjYWxsaW5nIHhleGl0KCkuCi0KLQkoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzKTogQ2FsbCBmYXRhbCgpIHJhdGhlciB0aGFuIGJmZF9mYXRhbCgpLgotCi0JKGNoZWNrX21hdGNoaW5nX2Zvcm1hdHMpOiBGaXggQyBmb3JtYXRpbmcuCi0KLQkocGFyc2Vfdm1hKTogQ2FsbCBmYXRhbCgpLgotCi1Nb24gSnVuICAxIDE4OjI2OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gWXVsaSBCYXJjb2hlbiA8eXVsaS5iYXJjb2hlbkB0ZWxyYWQuY28uaWw+OgotCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IEF2b2lkIGVuZGxlc3MgbG9vcHMgY29tcGFyaW5nCi0JZnVuY3Rpb24gYW5kIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuCi0KLUZyaSBNYXkgMjIgMTQ6MDI6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGR1bXBfaWF0KTogQ29tbWVudCBvdXQ7IG5vdCB1c2VkLgotCShkaXNwbGF5KTogUmVuYW1lIGZyb20gdGVsbC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotVGh1IE1heSAxNCAxNDowMDo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmM6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiBETExzLiAgQWRkIHN1cHBvcnQgZm9yCi0JaW50ZXJ3b3JraW5nIGJldHdlZW4gQVJNIGFuZCBUaHVtYiBwcm9ncmFtcyBhbmQgRExMcy4gIFRpZHkgdGhlCi0JY29kZS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgZGxsdG9vbC4KLQotCSogY29uZmlndXJlOiBCdWlsZCBkbGx0b29sIGZvciB0aHVtYi1wZSB0YXJnZXRzLgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBJbmNsdWRlIDE5OTggaW4gY29weXJpZ2h0IHN0cmluZ3MuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWIpOiBTdXBwb3J0IFdpbjMyIHN0eWxlIGRpcmVjdG9yeSBzZXBhcmF0b3JzLgotCi1TdW4gTWF5IDEwIDIyOjM0OjQ0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotRnJpIE1heSAgOCAxMDozMzoxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhci5jICh1c2FnZSk6IEV4dGVuZCBpbmZvcm1hdGlvbiBwcm92aWRlZCBhYm91dCBjb21tYW5kIGxpbmUKLQlvcHRpb25zLgotCi1XZWQgTWF5ICA2IDE1OjI4OjUxIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLiAgUGFzcyBDQyB2YWx1ZSB3aGVuCi0JY2FsbGluZyBtYWtlLgotCi1UdWUgTWF5ICA1IDE1OjE5OjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogQnVpbGQgZGxsdG9vbCBmb3IgdGh1bWItcGUgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBCdWlsZCBkbGx0b29sIGZvciB0aHVtYi1wZSB0YXJnZXQuCi0KLVN1biBNYXkgIDMgMjI6MDQ6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoRVhUUkFfUFJPR1JBTVMpOiBDaGFuZ2UgJChTUkNPTlZfUFJPRykgdG8gc3lzY29uZgotCXN5c2R1bXAgY29mZmR1bXAgdG8gYXZvaWQgZXh0cmEgJChFWEVFWFQpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBcHIgMjkgMjI6MjI6NTUgMTk5OCAgR2VvZmZyZXkgTm9lciA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN0b3AgYXBwZW5kaW5nIEVYRUVYVCB0byB0aGUgZW5kIG9mCi0JU1JDT05WX1BST0cgKHdyb25nIGJlY2F1c2UgdGhhdCB2YXJpYWJsZSBtYXkgY29udGFpbiBtdWx0aXBsZQotCXByb2dyYW1zKQotCSogTWFrZWZpbGUuYW06IGluc3RlYWQsIGFkZCBFWEVFWFRzIHRvIGVhY2ggU1JDT05WX1BST0cKLQlwcm9ncmFtCi0JKiBNYWtlZmlsZS5pbjogcmVnZW5lcmF0ZQotCSogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVR1ZSBBcHIgMjggMTk6MTQ6MzQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IENvbmRpdGlvbmFsbHkgY2FsbCBzZXRsb2NhbGUuCi0JKiB3aW5kcmVzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHN5c2R1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAobWFpbik6IExpa2V3aXNlLgotCSogbm0uYyAobWFpbik6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBkbGx0b29sLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGNvZmZkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGFyLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGJ1Y29tbS5oOiBJbmNsdWRlIDxsb2NhbGUuaD4gaWYgSEFWRV9MT0NBTEVfSC4KLQkoTENfTUVTU0FHRVMpOiBOb3cgY2FuIGJlIGRlZmluZWQgZXZlbiB3aGVuIEVOQUJMRV9OTFMuCi0KLVR1ZSBBcHIgMjggMTA6MzM6MDcgMTk5OCAgQmlsbCBNb3llciAgPHR0a0BjeWdudXMuY29tPgotCi0JQWRkIHN1cHBvcnQgZm9yIElNUE9SVFM6Ci0JKiBkZWZwYXJzZS55IChpbXBsaW5lKTogQWRkIElNUE9SVFMgc3ludGF4ZXMuCi0JKiBkbGx0b29sLmMgKGlmdW5jdHlwZSwgaWhlYWR0eXBlKTogTmV3IHR5cGVkZWZzLgotCShpbXBvcnRfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFwcGVuZF9pbXBvcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWZfaW1wb3J0KTogQWRkIGFuIGVudHJ5IHRvIGltcG9ydF9saXN0LgotCShnZW5lcmF0ZV9pZGF0YV9vZmlsZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdlbl9leHBfZmlsZSk6IENhbGwgZ2VuZXJhdGVfaWRhdGFfb2ZpbGUuCi0JKiBkbGx0b29sLmggKGRlZl9pbXBvcnQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLU1vbiBBcHIgMjcgMTY6Mzk6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSB2ZXJzaW9uIG51bWJlciB0byAyLjkuNAotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXByIDIyIDE2OjAwOjM1IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAwMDozMzo1NiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoSU5DTFVERVMpOiBTZWFyY2ggaW50bCBkaXJzIGZvciBoZWFkZXJzOyBkZWZpbmUKLQlMT0NBTEVESVIuCi0JKiBhZGRyMmxpbmUuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgdGV4dGRvbWFpbi4KLQkqIGFyLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGNvZmZkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIGRsbHRvb2wuYyAobWFpbik6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzcmNvbnYuYyAobWFpbik6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzeXNkdW1wLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIHdpbmRyZXMuYyAobWFpbik6IExpa2V3aXNlLgotCi1UdWUgQXByIDIxIDIyOjEzOjA4IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBidWNvbW0uaDogQWRkZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzLgotCSogYWNjb25maWcuaCAoRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVFRFWFQsIEhBVkVfU1RQQ1BZLAotCUhBVkVfTENfTUVTU0FHRVMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQ1lfR05VX0dFVFRFWFQuICBDcmVhdGUgcG8vTWFrZWZpbGUuaW4gYW5kCi0JcG8vTWFrZWZpbGUuICBVc2UgQU1fUFJPR19MRVguCi0JKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IE5ldyBtYWNyby4KLQkoUE9URklMRVMpOiBMaWtld2lzZS4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCShMREFERCk6IEFkZGVkIElOVExMSUJTLgotCShvYmpkdW1wX0xEQUREKTogTGlrZXdpc2UuCi0JKGNfX2ZpbHRfTERBREQpOiBMaWtld2lzZS4KLQkoYXJfTERBREQpOiBMaWtld2lzZS4KLQkocmFubGliX0xEQUREKTogTGlrZXdpc2UuCi0JKGRsbHRvb2xfTERBREQpOiBMaWtld2lzZS4KLQkod2luZHJlc19MREFERCk6IExpa2V3aXNlLgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2JpbnV0aWxzLnBvdDogTmV3IGZpbGVzLgotCi1UdWUgQXByIDIxIDE2OjA3OjE4IDE5OTggIFN0YW5pc2xhdiBCcmFiZWMgIDx1dHhAazMzMi5mZWxkLmN2dXQuY3o+Ci0KLQkqIG9iamNvcHkuYyAocHJlc2VydmVfZGF0ZXMpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKHNtYXJ0X3JlbmFtZSk6IElmIHByZXNlcnZlX2RhdGVzLCBjYWxsIHNldF90aW1lcyB3aGVuIGNvcHlpbmcuCi0JKHN0cmlwX21haW4pOiBSZW1vdmUgcHJlc2VydmVfZGF0ZXMgbG9jYWwgdmFyaWFibGUuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCi1UdWUgQXByICA3IDE1OjQxOjE1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IEFkZCBkZWZwYXJzZS5oLCBkZWZwYXJzZS5jLCByY2xleC5jLAotCXJjcGFyc2UuaCwgYW5kIHJjcGFyc2UuYwotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBBcHIgIDYgMTY6MjQ6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoUFJPR1MpOiBNb3ZlICQoQUREUjJMSU5FX1BST0cpIHRvIGVuZCwgc28gdGhhdAotCU1ha2VmaWxlLmluIGRvZXNuJ3QgaGF2ZSBhbiBlbXB0eSBjb250aW51YXRpb24gbGluZS4KLQkoYmluX1BST0dSQU1TKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAgMyAxNDo0ODo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCi0JKE1PU1RMWUNMRUFORklMRVMpOiBBZGQgYmludXRpbHMubG9nLCBiaW51dGlscy5zdW0sIGFuZCBhYmNkZWZnaCouCi0JKG1vc3RseWNsZWFuLWxvY2FsKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1XZWQgQXByICAxIDE1OjU0OjE2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gWmFjayBXZWluYmVyZyA8emFja0ByYWJpLnBoeXMuY29sdW1iaWEuZWR1PiBhbmQgSC5KLiBMdQotCTxoamxAZ251Lm9yZz46Ci0JKiBhci5jICh1c2FnZSk6IE1lbnRpb24gUyBtb2RpZmllci4KLQkobWFpbik6IEFkZCBTIG1vZGlmaWVyLgotCSogYXIuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgUyBtb2RpZmllci4KLQotV2VkIEFwciAgMSAxMzoxMToyMyAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYmludXRpbHMudGV4aTogVXNlIEBpdGVteCBmb3IgYSBzZWNvbmRhcnkgaXRlbSBpbiBhIHRhYmxlLgotCi1UdWUgTWFyIDMxIDE4OjQ0OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVwLWluLnNlZDogQWRkIHJ1bGUgdG8gcmVtb3ZlIEBPQkpESVJALgotCSogTWFrZWZpbGUuYW0gKGRlcC5zZWQpOiBTdWJzdGl0dXRlIGZvciBAT0JKRElSQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMwIDEyOjQ3OjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi0JKiBNYWtlZmlsZS5hbSAoRElTVENMRUFORklMRVMpOiBSZW1vdmUgZGVmcGFyc2UuaCwgYXJwYXJzZS5oLAotCXJjcGFyc2UuaCwgYW5kIG5sbWhlYWRlci5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVNhdCBNYXIgMjggMTc6Mzk6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogbmxtY29udi5jIChtYWluKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShhbHBoYV9tYW5nbGVfcmVsb2NzKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCSogc2l6ZS5jIChwcmludF9zeXN2X2Zvcm1hdCk6IExpa2V3aXNlLgotCSogc3JjY29udi5jICh3cl9vYik6IExpa2V3aXNlLgotCSogd3JzdGFicy5jIChzdGFiX21vZGlmeV90eXBlKTogTGlrZXdpc2UuCi0JKHN0YWJfdmFyaWFibGUpOiBMaWtld2lzZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IEluaXRpYWxpemUgdmFyaWFibGVzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbm0uYyAoc29ydF9zeW1ib2xzX2J5X3NpemUpOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkqIHdyc3RhYnMuYyAoc3RhYl9lbmRfY2xhc3NfdHlwZSk6IExpa2V3aXNlLgotCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDIpOiBDaGFuZ2UgaiB0byB1bnNpZ25lZCBpbnQuCi0JKGRvX2xpbmVzKTogQ2hhbmdlIGwgdG8gdW5zaWduZWQgaW50LgotCSogbmxtaGVhZGVyLnkgKHl5bGV4KTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCSogbm0uYyAocHJpbnRfc3ltYm9sKTogQ2hhbmdlIGogdG8gbG9uZy4KLQkqIHNpemUuYyAobHByaW50X251bWJlcik6IENvbW1lbnQgb3V0LgotCSogc3Jjb252LmMgKHdyX29iKTogQ2hhbmdlIGkgdG8gYmZkX3NpemVfdHlwZS4KLQkqIHN5c2R1bXAuYyAodW5pdF9pbmZvX2xpc3QpOiBDb21tZW50IG91dC4KLQkob2JqZWN0X2JvZHlfbGlzdCwgcHJvZ3JhbV9zdHJ1Y3R1cmUsIGRlYnVnX2xpc3QpOiBMaWtld2lzZS4KLQkqIHN5c2luZm8ueSAoeXllcnJvcik6IFJldHVybiB2YWx1ZS4KLQotVGh1IE1hciAyNiAxNzowNjo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkZWZwYXJzZS55IChleHBsaXN0KTogQWxsb3cgZXBzaWxvbi4KLQlTdWdnZXN0aW9uIGZyb20gSm9uYXRoYW4tSGFycmlzQHBzaW9uLmNvbS4KLQotVGh1IE1hciAyNiAxNjo1OTowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb2ZmZ3Jvay5jIChkb19zZWN0aW9uc19wMSk6IFVzZSB0aGUgc2VjdGlvbidzIGxtYSBpbnN0ZWFkIG9mIHZtYQotCWZvciB0aGUgYmVuZWZpdCBvZiBwcm9tIGxvYWRlcnMuCi0KLVdlZCBNYXIgMjUgMTM6MDU6MzkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkoRElTVENMRUFORklMRVMpOiBOZXcgdmFyaWFibGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIE1hciAyNCAxOTozMzowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJjbGV4Lmw6IEFjY2VwdCB7IGFuZCB9IGFzIHN5bm9ueW1zIGZvciBCRUdJTiBhbmQgRU5ELgotCi1GcmkgTWFyIDIwIDE5OjE4OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVR1ZSBGZWIgMjQgMTM6MDc6NTAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogRGVsZXRlICIrK3BsYWNlIiBhZnRlciBjYWxsIHRvCi0JZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MuICBTZXQgZGlzYXNtX2luZm8uc3ltYm9scyB0byBhcnJheSBvZgotCXN5bWJvbHMgYXQgdGhlIGN1cnJlbnQgYWRkcmVzcy4KLQotV2VkIEZlYiAxOCAyMzozOTo0NiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogSW5zdGFsbCBwcm9wZXJseSB3aGVuIGxuCi0JZmFpbHMgb3IgdG9vbGRpciA9PSBwcmVmaXguCi0KLVR1ZSBGZWIgMTcgMTg6NDA6NTUgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb21wYXJlX3NlY3Rpb25fbG1hKTogUmVuYW1lIGZyb20gX3ZtYS4KLSAgICAgICAgKGNvcHlfb2JqZWN0KTogR2FwIGZpbGwgYmFzZWQgb24gTE1BIG5vdCBWTUEuCi0JKiBiaW51dGlscy50ZXhpOiBVcGRhdGUgYW5kIGNsYXJpZnkuCi0JKiBvYmpjb3B5LjE6IExpa2V3aXNlLgotCi1UdWUgRmViIDE3IDIwOjM0OjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChnZW5fZXhwX2ZpbGUpOiBHZW5lcmF0ZSBfaW1wX18lcyBhcyB3ZWxsIGFzIF9faW1wXyVzLAotCWZvciBNaWNyb3NvZnQgY29tcGF0aWJpbGl0eS4KLQkobWFrZV9vbmVfbGliX2ZpbGUpOiBMaWtld2lzZS4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IERvbid0IGFkZCAxIHRvIGhpbnQuCi0KLUZyaSBGZWIgMTMgMTY6Mzc6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQVVUT01BS0VfT1BUSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBhdXRvbWFrZSAxLjJlLgotCi1UaHUgRmViIDEyIDE0OjEzOjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVmbGV4Lmw6IEFjY2VwdCAnPycgaW4gc3ltYm9sIG5hbWVzLCBmb3IgVkMrKyBtYW5nbGVkIG5hbWVzLgotCUZyb20gTWlrZXkgPGplZmZkYkBuZXR6b25lLmNvbT4uCi0KLQkqIGFkZHIybGluZS5jICh1c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0JKiBhci5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogbmxtY29udi5jIChzaG93X3VzYWdlKTogTGlrZXdpc2UuCi0JKiBubS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogTGlrZXdpc2UuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBzaXplLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiB3aW5kcmVzLmMgKHVzYWdlKTogTGlrZXdpc2UuCi0JKiBiaW51dGlscy50ZXhpIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCi0KLVNhdCBGZWIgIDcgMTU6MzY6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotVGh1IEZlYiAgNSAxMjoyMToxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQotRnJpIEphbiAzMCAxOToxNjoyOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0NfRk9SX1RBUkdFVCxubG1jb212Lm8pOiBDaGFuZ2UgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQotCXRvIHRyYW5zZm9ybS4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi1UaHUgSmFuIDI5IDE2OjI0OjA0IDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBkbGx0b29sLmM6IERlZmluZSBleGl0IHN0YXR1cyBtYWNyb3MgZm9yIF9XSU4zMiBidXQgbm90Ci0JX19DWUdXSU4zMl9fLgotCShnZW5fbGliX2ZpbGUpOiBDaGVjayBmb3IgZXhpdCBzdGF0dXMgb2YgdW5saW5rLgotCSogcmVzcmMuYzogRGVmaW5lIHBvcGVuIGFuZCBwY2xvc2UgaWYgX1dJTjMyIGJ1dCBub3QKLQlfX0NZR1dJTjMyX18uCi0KLVdlZCBKYW4gMjggMTc6NDU6NDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSB2Zm9yayBjaGVjay4KLQkqIG5sbWNvbnYuYzogTmV2ZXIgaW5jbHVkZSB2Zm9yay5oLgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDI4IDE3OjQzOjAyIDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogT25seSBwYXNzIG9uZSBhcmd1bWVudCB0byBta2RpciBpZgotCV9XSU4zMiBidXQgbm90IF9fQ1lHV0lOMzJfXy4KLQkoc21hcnRfcmVuYW1lKTogQWRkIGNvZGUgZm9yIF9XSU4zMiAobm90IF9fQ1lHV0lOMzJfXyksIHRvIGNvcGUKLQl3aXRoIGRpZmZlcmVudCByZW5hbWUgYmVoYXZpb3VyIGFuZCBsYWNrIG9mIGNob3duLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBtaW5ndzMyIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBidWlsZAotCWRsbHRvb2wuCi0JKiBkbGx0b29sLmM6IE5ldmVyIGluY2x1ZGUgdmZvcmsuaC4KLQkocnVuKTogVXNlIHBleGVjdXRlIHJhdGhlciB0aGFuIHZmb3JrLgotCShnZW5fbGliX2ZpbGUpOiBDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX3NldF9hcmNoaXZlX2hlYWQgYW5kCi0JYmZkX2Nsb3NlLiAgQ2xvc2UgYWxsIHRoZSBCRkRzIGluIHRoZSBhcmNoaXZlIGJlZm9yZSBkZWxldGluZyB0aGUKLQl0ZW1wb3JhcnkgZmlsZXMuCi0KLVRodSBKYW4gMjIgMTY6MjI6NTUgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfYnl0ZXMpOiBBZGQgZmxhZyBJTlNOX0hBU19SRUxPQyB0byB0ZWxsCi0JZGlzYXNzZW1ibHkgZnVuY3Rpb24gdGhlcmUgaXMgYSByZWxvYyBvbiB0aGlzIGxpbmUuCi0KLVdlZCBKYW4gMTQgMTU6Mjk6NDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHNoLCBoODMwMCk6IERlbGV0ZSB2YXJpYWJsZXMuCi0JKGFkZHJzaXplLCB0b29sbmFtZSwgcm5hbWVzKTogTmV3IHZhcmlhYmxlcy4KLQkod3JpdGVJTlQpOiBVc2UgYWRkcnNpemUuCi0JKHdyX3VuKTogVXNlIHRvb2xuYW1lLgotCSh3cl9oZCk6IFNldCB1cCBhZGRyc2l6ZSBldCBhbCBwcm9wZXJseSBmb3IgaDgzMDBbaHNdLgotCSh3YWxrX3RyZWVfc3ltYm9sKTogWmVybyBkc3kuICBVc2Ugcm5hbWVzLgotCSh3cl91biwgd3JfaGQsIHdyX29iLCB3cl9kdSk6IFVzZSBwcm9wZXIgYmZkIGFjY2VzcyBtYWNyb3MuCi0JKiBzeXNkdW1wLmMgKHNoLCBoODMwMCk6IERlbGV0ZSB2YXJpYWJsZXMuCi0JKGFkZHJzaXplKTogTmV3IHZhcmlhYmxlLgotCShnZXRJTlQpOiBVc2UgaXQuCi0JKGdldG9uZSk6IEluaXRpYWxpemUgaXQuCi0JKGdldEJJVFMpOiBSYW5nZSBjaGVjayBvbiBNQVguCi0KLU1vbiBEZWMgMjkgMTY6NTg6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBNYXR0aGV3IEJlbGxhbnRvbmkgPG1hdHRoZXdAY2hyeXNhbGlzLmNvbT46Ci0JKiBhci5jIChnZXRfcG9zX2JmZCk6IEFkZCBkZWZhdWx0X3Bvc25hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHJlcGxhY2VfbWVtYmVycyk6IERlZmF1bHQgdG8gcmVwbGFjaW5nIGluIHRoZSBzYW1lIHBvc2l0aW9uLgotCi1Nb24gRGVjIDIyIDExOjI3OjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmNsZXgubDogRG9uJ3QgcGVybWl0IGEgY29tbWEgaW4gYSBTVFJJTkcuCi0JKiByY3BhcnNlLnkgKGFjY19lbnRyeSk6IFdhcm4gaWYgYW4gaW5hcHByb3ByaWF0ZSBtb2RpZmllciBpcyB1c2VkCi0Jd2l0aCBhIG5vbiBWSVJUS0VZLgotCShhY2NfZXZlbnQpOiBGb3IgYSBjb250cm9sIGNoYXJhY3Rlciwgc2V0IFZJUlRLRVksIGFuZCBmb3JjZSB0aGUKLQljaGFyYWN0ZXIgdG8gdXBwZXJjYXNlLgotCShhY2Nfb3B0aW9ucyk6IERvbid0IHJlcXVpcmUgYSBjb21tYSBzZXBhcmF0b3IuCi0KLVR1ZSBEZWMgIDkgMTM6MjU6NDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNpemUuYyAoc2l6ZV9udW1iZXIpOiBOZXcgZnVuY3Rpb24gdG8gcHJvdmlkZSBzaXplIG9mIGZpZWxkLgotCSh7bCxyfXByaW50X251bWJlcik6IEZvciBvY3RhbCBhbmQgaGV4IGZpZWxkcywgcHJpbnQgZmllbGQgdXNpbmcKLQknMCcgYW5kICcweCcgc3VmZml4ZXMuICBEbyBub3QgaW5jbHVkZSBmb2xsb3dpbmcgdGFiLgotCShzeXN2X2ludGVybmFsX3NpemVyKTogU2l6ZSBzZWN0aW9uIG5hbWUsIHNlY3Rpb24gc2l6ZSwgYW5kIHZtYQotCWFkZHJlc3MgZmllbGRzLgotCShzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBVc2UgY2FsY3VsYXRlZCBzaXplcyBmb3IgdGhlIGNvbHVtbnMuCi0JKHByaW50X3N5c3ZfZm9ybWF0KTogU2l6ZSBjb2x1bW5zIGJlZm9yZSBwcmludGluZy4KLQkocHJpbnRfYmVya2VsZXlfZm9ybWF0KTogUHJpbnQgdGFicyBiZXR3ZWVuIG51bWJlcnMgbm93IHRoYXQKLQl7bCxyfXByaW50X251bWJlciBkb2Vzbid0LiAgUHJpbnQgZmllbGRzIHJpZ2h0IGp1c3RpZmllZC4KLQotTW9uIERlYyAgOCAxMToyMjowNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSk6IFJlbW92ZSBjYWxsIHRvCi0JZGlzYXNtX3N5bWFkZHIoKSBhcyB0aGlzIGZ1bmN0aW9uIG5vIGxvbmdlciBleGlzdHMuCi0KLVR1ZSBEZWMgIDIgMTA6MjM6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBDYWxsIGRpc2FzbV9zeW1hZGRyKCkKLQl0byBhbGxvdyBiYWNrZW5kIHRvIGtub3cgd2hpY2ggc3ltYm9sIGhhcyBqdXN0IGJlZW4gZGlzcGxheWVkLgotCi1UdWUgRGVjICAyIDEzOjA2OjQ2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd2luZHJlcy5oIChFU0NBUEVfKik6IERlZmluZSBzdGFuZGFyZCBlc2NhcGUgc2VxdWVuY2VzLgotCSogcmNsZXgubCAoaGFuZGxlX3F1b3Rlcyk6IEhhbmRsZSBzdGFuZGFyZCBlc2NhcGUgc2VxdWVuY2VzLiAgV2FybgotCWFib3V0IGFuIHVucmVjb2duaXplZCBlc2NhcGUgY2hhcmFjdGVyLgotCSogd2luZHJlcy5jICh1bmljb2RlX3ByaW50KTogUHJpbnQgc3RhbmRhcmQgZXNjYXBlIHNlcXVlbmNlcy4KLQkqIHJjcGFyc2UueSAoYWNjX2V2ZW50KTogSW5pdGlhbGl6ZSAkJC5uZXh0LgotCSogcmVzYmluLmMgKGJpbl90b19yZXNfbWVudWl0ZW1zKTogRG9uJ3Qgc2V0IE1FTlVJVEVNX1BPUFVQIG9yCi0JTUVOVUlURU1fRU5ETUVOVSBpbiB0aGUgbWVudSBpdGVtIGZsYWdzLgotCShiaW5fdG9fcmVzX2FjY2VsZXJhdG9ycyk6IEFsbG9jYXRlIGEgc3RydWN0dXJlICh0aGUgb2xkIGNvZGUKLQluZXZlciB3b3JrZWQpLgotCShyZXNfdG9fYmluX2FjY2VsZXJhdG9yKTogQ29ycmVjdCB0aGUgdGVzdCBmb3Igc2V0dGluZyBBQ0NfTEFTVC4KLQkocmVzX3RvX2Jpbl9kaWFsb2cpOiBTYXZlIHRoZSBleHRlbmRlZCBzdHlsZSByYXRoZXIgdGhhbiBzYXZpbmcKLQl0aGUgc3R5bGUgdHdpY2UuICBSZW1vdmUgdXNlbGVzcyBzaGFkb3dpbmcgbGVuZ3RoIHZhcmlhYmxlLiAgU2V0Ci0JdGhlIGxlbmd0aCBvZiBjb250cm9sIGRhdGEgY29ycmVjdGx5LgotCSogcmVzcmMuYyAod3JpdGVfcmNfZGlhbG9nKTogRG9uJ3QgcHJpbnQgdGhlIGNsYXNzIG9yIG1lbnUgaWYgdGhlCi0Jc3RyaW5nIGxlbmd0aCBpcyB6ZXJvLgotCi1Nb24gTm92IDI0IDE4OjUyOjQzIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX2FyZ3R5cGVzKTogRG9uJ3QgdHJ5IHRvIHBhcnNlIHRoZSBuYW1lIG9mIGEKLQlkZXN0cnVjdG9yIGFzIG1hbmdsZWQgYXJndW1lbnQgdHlwZXMuCi0KLU1vbiBOb3YgMTAgMTc6NTE6NDEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGFkZHIybGluZS5jICh0cmFuc2xhdGVfYWRkcmVzc2VzKTogVXNlIGJmZF9zY2FuX3ZtYSByYXRoZXIKLQl0aGFuIHN0cnRvbCB0byBzY2FuIGFkZHJlc3Nlcy4KLQotU3VuIE5vdiAgOSAxMTowMTozMSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmFtIChiaW5fUFJPR1JBTVMpOiBEb24ndCB1c2UgbGluZSBjb250aW51YXRpb25zIGhlcmUuCi0KLVR1ZSBOb3YgIDQgMTE6NTY6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfc2VjdGlvbik6IERvbid0IGNyYXNoIGlmIHRoZXJlIGlzIG5vIHBhcnRpY3VsYXIKLQlpbmZvcm1hdGlvbiBmb3IgYSBzZWN0aW9uLgotCi1Nb24gTm92ICAzIDEyOjM2OjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChwYXJzZV9mbGFncyk6IE1ha2UgZmxhZyBjaGVjayBjYXNlIGluc2Vuc2l0aXZlLgotCUNoZWNrIGZvciBgY29udGVudHMnIGZsYWcuICBHaXZlIGFuIGVycm9yIGZvciB1bnJlY29nbml6ZWQgZmxhZ3MuCi0JKGNvcHlfc2VjdGlvbik6IElmIHRoZSBjb250ZW50cyBmbGFnIHdhcyBzZXQgZm9yIGEgc2VjdGlvbiB0aGF0Ci0JaGFkIG5vIGNvbnRlbnRzLCB6ZXJvIG91dCB0aGUgbmV3IGNvbnRlbnRzLgotCSogYmludXRpbHMudGV4aSAob2JqY29weSk6IERvY3VtZW50IGNvbnRlbnRzIHNlY3Rpb24gZmxhZy4KLQotU3VuIE5vdiAgMiAxNDo0OTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYzogTW92ZSBuZXcgc3RydWN0IGFuZCB2YXJpYWJsZSBkZWZpbml0aW9ucyB0byB0b3Agb2YKLQlmaWxlLiAgUmVtb3ZlIG9ic29sZXRlIGFkZF9zdHJpcF9zeW1ib2wgYW5kIGlzX3N0cmlwX3N5bWJvbAotCWRlY2xhcmF0aW9ucy4gIEFkZCBwcm90b3R5cGUgZGVjbGFyYXRpb25zIGZvciBhZGRfc3BlY2lmaWNfc3ltYm9sCi0JYW5kIGlzX3NwZWNpZmllZF9zeW1ib2wuCi0KLU1vbiBPY3QgMjAgMTU6MzE6NDMgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb20gKEhBVkVfU0JSSyk6IFVuZGVmaW5lLgotCi1UdWUgT2N0IDE0IDE2OjE0OjM1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9zeW1ib2xfYXRfYWRkcmVzcyk6IE5ldyBmdW5jdGlvbi4gIFJldHVybnMKLQl0cnVlIGlmIGEgc3ltYm9sIGNhbiBiZSBmb3VuZCBhdCB0aGUgYWRkcmVzcyBwYXNzZWQgaW4uCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBTZXQgdGhlIHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgZmllbGQgdG8gcG9pbnQKLQl0byBvYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzLgotCi1GcmkgT2N0IDEwIDE0OjEzOjA5IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYywgb2JqY29weS4xLCBiaW51dGlscy50ZXhpOiAibG9jYWxpemUiIGlzIGEgYmV0dGVyIG5hbWUKLQl0aGFuICJwcml2YXRpemUiLiAgVXBkYXRlIGFsbCByZWZlcmVuY2VzLgotCi1UaHUgT2N0ICA5IDE1OjU3OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoc3RyaXApOiBSZW1vdmUgZHVwbGljYXRlIC0tdGFyZ2V0LiAgRnJvbSBNYXJ0eQotCUxlaXNuZXIgPGxlaXNuZXJAc2RzcC5tYy54ZXJveC5jb20+LgotCi0JKiBubS5jIChsaW5lbm9fY2FjaGVfYmZkKTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShsaW5lbm9fY2FjaGVfcmVsX2JmZCk6IE5ldyBmaWxlIHN0YXRpYyB2YXJpYWJsZS4KLQkoZGlzcGxheV9hcmNoaXZlKTogQ2xlYXIgbGluZW5vX2NhY2hlX2JmZCBhbmQgbGluZW5vX2NhY2hlX3JlbF9iZmQKLQl3aGVuIGNsb3NpbmcgYSBCRkQuCi0JKGRpc3BsYXlfZmlsZSk6IExpa2V3aXNlLgotCShwcmludF9zeW1ib2wpOiBVc2UgbGluZW5vX2NhY2hlX2JmZCBhbmQgbGluZW5vX2NhY2hlX3JlbF9iZmQKLQlpbnN0ZWFkIG9mIGNhY2hlX2JmZCBhbmQgY2FjaGVfcmVsX2JmZC4gIE1ha2Ugc2VjY291bnQgc3RhdGljLCBhbmQKLQlvbmx5IHNldCBpdCB3aGVuIHNldHRpbmcgcmVsb2NzLgotCi1XZWQgT2N0ICA4IDIxOjE5OjExIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoa2VlcF9zcGVjaWZpY19saXN0LCBwcml2YXRpemVfc3BlY2lmaWNfbGlzdCwKLQl3ZWFrZW5fc3BlY2lmaWNfbGlzdCk6IE5ldyB2YXJpYWJsZXMuCi0JKGtlZXBfc3ltYm9scyk6IFJlbW92ZWQuCi0JKGFkZF9zcGVjaWZpY19zeW1ib2wpOiBOZXcgZnVuY3Rpb24gZnJvbSB0aGUgY2FyY2FzIG9mCi0JYWRkX3N0cmlwX3N5bWJvbC4gIFRha2VzIGEgbGlzdCBhcyBhbiBhcmd1bWVudC4KLQkoaXNfc3BlY2lmaWVkX3N5bWJvbCk6IExpa2V3aXNlIGZyb20gaXNfc3RyaXBfc3ltYm9sLgotCShmaWx0ZXJfc3ltYm9scyk6IEhvbm9yIHRoZSBuZXcgcHJpdmF0aXplIGFuZCB3ZWFrZW4gbGlzdHMuCi0JT3B0aW1pemUgYmZkX2FzeW1ib2xfbmFtZSBoYW5kbGluZy4KLQkoY29weV9vYmplY3QsIGNvcHlfb3B0aW9ucywgY29weV91c2FnZSk6IEFkZCBwcml2YXRpemUtc3ltYm9sICYKLQl3ZWFrZW4tc3ltYm9sIG9wdGlvbnMuCi0KLQkqIG9iamNvcHkuMSwgYmludXRpbHMudGV4aTogVXBkYXRlIGRvY3MuCi0KLVN1biBPY3QgIDUgMDk6MDU6NDQgMTk5NyAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogTWFrZSAiLS1wcmVmaXgtYWRkcmVzc2VzIgotIAlkaXNhc3NlbWJseSBhZGp1c3QgdG8gbWl4ZWQtbGVuZ3RoIGluc3RydWN0aW9ucy4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogQWRkICIweCIgcHJlZml4IGZvciBoZXhhZGVjaW1hbAotIAlzeW1ib2wtb2Zmc2V0cyBpbiBkaXNhc3NlbWJseS4KLQotRnJpIE9jdCAgMyAxMjowNDoyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc2V0X3RpbWVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgcmVwbGFjaW5nCi0JbWFrZV9zYW1lX2RhdGVzLgotCShzdHJpcF9tYWluKTogSWYgcHJlc2VydmVfZGF0ZXMsIHN0YXQgdGhlIGlucHV0IGZpbGUgYmVmb3JlCi0JY29weWluZyBpdCwgYW5kIGNhbGwgc2V0X3RpbWVzIGFmdGVyd2FyZC4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0KLQkqIHdyc3RhYnMuYyAod3JpdGVfc3RhYnNfaW5fc2VjdGlvbnNfZGVidWdnaW5nX2luZm8pOiBDYXN0IHAgdG8KLQljaGFyICogd2hlbiBjYWxsaW5nIHN0cmNweSBhbmQgc3RybGVuLgotCi1XZWQgU2VwIDI0IDExOjM0OjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aQkoYXIgY21kbGluZSk6IERvY3VtZW50IHRoYXQgcSBub3cgd29ya3MgbGlrZSByLgotCUZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT4uCi0KLQkqIGJpbnV0aWxzLnRleGkgKHNpemUpOiBUaGUgb2JqZWN0IGZpbGUgYXJndW1lbnQgaXMgb3B0aW9uYWwuCi0JRnJvbSBNYXJ0eSBMZWlzbmVyIDxsZWlzbmVyQHNkc3AubWMueGVyb3guY29tPi4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgQXVnIDI2IDE3OjQ4OjM0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEVYRUVYVF9GT1JfQlVJTEQpOiBOZXcgdmFyaWFibGUuICBVc2UgaXQgaW4gYWxsCi0JcmVmZXJlbmNlcyB0byB0aGUgc3lzaW5mbyBwcm9ncmFtLgotCSogY29uZmlndXJlLmluOiBSZWJ1aWxkIHdpdGggbmV3IGJmZC9hY2luY2x1ZGUubTQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgOCAxNTozMjo0OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYzogSW5jbHVkZSA8dGltZS5oPi4KLQkoZGVmaW5lX3Jlc291cmNlKTogU2V0IGEgdGltZXN0YW1wIGZvciB0aGUgcmVzb3VyY2UuCi0KLVdlZCBBdWcgIDYgMTM6Mzc6NTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBUQVJHRVQgaW4gaGVhZGVyIGZpbGUuCi0JKiBhY2NvbmZpZy5oIChUQVJHRVQpOiBBZGQgI3VuZGVmLgotCSogTWFrZWZpbGUuYW0gKHZlcnNpb24ubywgYnVjb21tLm8pOiBSZW1vdmUgc3BlY2lhbCB0YXJnZXRzLgotCSogYnVjb21tLmMgKHRhcmdldCk6IFJlbW92ZS4KLQkqIG5tLmMgKHByb2dyYW1fbmFtZSk6IERvbid0IGRlY2xhcmUuCi0JKHRhcmdldCk6IE1ha2Ugc3RhdGljLgotCSogc2l6ZS5jICh0YXJnZXQpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEF1ZyAgNSAwMDowMTo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogRXhwb3J0IHIuCi0JKC5kZXAxKTogVXNlICQoSU5DTFVERVMpIHJhdGhlciB0aGFuICQoQUxMX0NGTEFHUykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogbmxtaGVhZGVyLnk6IFVzZSBWRVJTSU9OSyByYXRoZXIgdGhhbiBWRVJTSU9OLgotCi0JKiBNYWtlZmlsZS5hbSAoU1RSSVBfUFJPRyk6IENoYW5nZSBmcm9tIHN0cmlwLm5ldyB0byBzdHJpcC1uZXcuCi0JKE5NX1BST0cpOiBDaGFuZ2UgZnJvbSBubS5uZXcgdG8gbm0tbmV3LgotCShUT09MX1BST0dTLCBpbnN0YWxsLWV4ZWMtbG9jYWwpOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEF1ZyAgNCAxMTo0NzozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIEFDX0FSR19QUk9HUkFNOyBpdCdzIGludm9rZWQgYnkKLQlBTV9JTklUX0FVVE9NQUtFLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogQ3JlYXRlICQodG9vbGRpcikvYmluIGJlZm9yZQotCXRyeWluZyB0byBpbnN0YWxsIGFueXRoaW5nIGludG8gaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKFRPT0xfUFJPR1MpOiBVc2UgYW4gZXhwbGljaXQgJChFWEVFWFQpLgotCShpbnN0YWxsLWV4ZWMtbG9jYWwpOiBXaGVuIGhhbmRsaW5nICQobm9pbnN0X1BST0dSQU1TKSwgb25seSB1c2UKLQkkKEVYRUVYVCkgb24gdGhlIGluc3RhbGxlZCBmaWxlLiAgV2hlbiBoYW5kbGluZyAkKFRPT0xfUFJPR1MpLAotCWhhbmRsZSAkKEVYRUVYVCkgY29ycmVjdGx5LgotCSogY29uZmlndXJlLmluOiBBZGQgYW4gZXhwbGljaXQgJChFWEVFWFQpIHdoZW4gc3Vic3RpdHV0aW5nIGZvcgotCXRoZSBuYW1lIG9mIGEgcHJvZ3JhbSB0byBidWlsZC4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBuZXcgYXV0b21ha2UKLQlwYXRjaGVzLgotCi0JKiBkZWZsZXgubCwgZGVmcGFyc2UueTogVXNlIFZFUlNJT05LIHJhdGhlciB0aGFuIFZFUlNJT04uCi0JKiByY2xleC5sLCByY3BhcnNlLnk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW0gKHdpbmRyZXNfU09VUkNFUyk6IEFkZCAkKEJVTElCUykuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEF1ZyAgMSAxMzowODozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogSW5jbHVkZSBiZmQvYWNpbmNsdWRlLm00LCBub3QgYmZkL2FjbWFjcm9zLm00LgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVRodSBKdWwgMzEgMTE6NTE6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUsIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlCi0Jc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFDX1BST0dfWUFDQywKLQlBQ19QUk9HX0xFWCwgQUNfREVDTF9ZWVRFU1QsIEFNX01BSU5UQUlORVJfTU9ERSwgQU1fQ1lHV0lOMzIsIGFuZAotCUFNX0VYRUVYVC4gIFJlcGxhY2UgQUNfUFJPR19JTlNUQUxMIHdpdGggQU1fUFJPR19JTlNUQUxMLiAgUmVtb3ZlCi0Jc3RhbXAtaCBoYW5kbGluZyBpbiBBQ19PVVRQVVQuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UgYW5kIFZFUlNJT04uCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWcuaW4sIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCUZyb20gVG9uIHZhbiBPdmVyYmVlayA8dHZvdmVyYmVAd2suZXN0ZWMuZXNhLm5sPjoKLQkqIHJjcGFyc2UueSAoZGlhbG9nKTogRGVmYXVsdCBtZW51IGFuZCBjbGFzcyB0byBiZSBuYW1lZC4KLQkoc3R5bGVzKTogSWYgRk9OVCBpcyBzZWVuLCBzZXQgRFNfU0VURk9OVCBpbiBkaWFsb2cgc3R5bGUuCi0JKiByZXNiaW4uYyAocmVzX3RvX2Jpbl9kaWFsb2cpOiBDb3JyZWN0IGNvbXB1dGF0aW9uIG9mIGZvbnQKLQlpbmZvcm1hdGlvbiBsZW5ndGguCi0KLVdlZCBKdWwgMzAgMTE6MjE6MDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBUb24gdmFuIE92ZXJiZWVrIDx0dm92ZXJiZUB3ay5lc3RlYy5lc2Eubmw+OgotCSogcmVzYmluLmMgKHJlc190b19iaW5fbWVudSk6IENvcnJlY3QgY29tcHV0YXRpb24gb2YgbWVudQotCXZzLiBtZW51ZXggbGVuZ3RoLgotCSogcmVzcmMuYyAoZGVmaW5lX3N0cmluZ3RhYmxlKTogQWRkIDEgdG8gcmVzb3VyY2UgSUQuCi0KLVR1ZSBKdWwgMjkgMTE6MDY6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZXNiaW4uYyAoYmluX3RvX3Jlc19zdHJpbmcpOiBDb3JyZWN0IGFkanVzdG1lbnQgb2YgZGF0YSBhbmQKLQlsZW5ndGguICBGcm9tIFRvbiB2YW4gT3ZlcmJlZWsgPHR2b3ZlcmJlQHdrLmVzdGVjLmVzYS5ubD4uCi0KLVR1ZSBKdWwgMjIgMTg6MDE6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubG1jb252LmMgKGxpbmtfaW5wdXRzKTogQ2FsbCBsaWJpYmVydHkgcGV4ZWN1dGUgZnVuY3Rpb24uCi0JKHBleGVjdXRlKSBbbXVsdGlwbGUgdmVyc2lvbnNdOiBSZW1vdmUuCi0KLVR1ZSBKdWwgMjIgMTY6MTk6MzQgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBidWNvbW0uYyAobWFrZV90ZW1wbmFtZSk6IElmIHdlIG1pZ2h0IGJlIHVzaW5nIGEgRE9TIGZpbGVzeXN0ZW0sCi0JY2hlY2sgZm9yIGEgYmFja3NsYXNoIGFzIHdlbGwgYXMgYSBzbGFzaC4KLQotVGh1IEp1biAyNiAxMzo1MzoxNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdpbmRyZXMuYyAobWFpbik6IFF1aXQgaWYgd2UgZGlkbid0IGdldCBhbnkgcmVzb3VyY2VzLgotCSh1c2FnZSk6IEZpeCAtLXl5ZGVidWcgdXNhZ2UgbWVzc2FnZS4KLQkqIHJlc2NvZmYuYyAod3JpdGVfY29mZl9maWxlKTogRG9uJ3QgZnJlZSB0aGUgcmVsb2NhdGlvbiBhcnJheQotCXVudGlsIGFmdGVyIHdlJ3ZlIGNsb3NlZCB0aGUgQkZELgotCShyZWFkX2NvZmZfcnNyYyk6IFF1aXQgcmF0aGVyIHRoYW4gdHJ5IHRvIHJlYWQgc3RhbmRhcmQgaW5wdXQuCi0JKHdyaXRlX2NvZmZfZmlsZSk6IFF1aXQgcmF0aGVyIHRoYW4gdHJ5IHRvIHdyaXRlIHRvIHN0YW5kYXJkCi0Jb3V0cHV0LgotCSogcmNwYXJzZS55OiBBZGQgYSBjb3VwbGUgb2YgbWlzc2luZyBzZW1pY29sb25zIChhY2NlcHRlZCBieSBiaXNvbgotCWJ1dCBub3QgYnlhY2MpLgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgd2luZHJlcy4KLQotV2VkIEp1biAyNSAyMDo1NzowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlc2Jpbi5jOiBOZXcgZmlsZS4KLQkqIHJjbGV4LmwsIHJjcGFyc2UueSwgcmVzY29mZi5jLCByZXNyYy5jLCB3aW5kcmVzLmMsIHdpbmRyZXMuaDoKLQlOdW1lcm91cyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQ0ZJTEVTKTogQWRkIHJlc2Jpbi5jLgotCShXSU5EUkVTX09CSlMpOiBBZGQgcmVzYmluLm8uCi0KLVN1biBKdW4gMjIgMTc6Mjk6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRmlyc3Qgc3RhYiBhdCBXaW5kb3dzIHJlc291cmNlIGNvbXBpbGVyOgotCSogd2luZHJlcy5oOiBOZXcgZmlsZS4KLQkqIHdpbmRyZXMuYzogTmV3IGZpbGUuCi0JKiByZXNyYy5jOiBOZXcgZmlsZS4KLQkqIHJjcGFyc2UueTogTmV3IGZpbGUuCi0JKiByY2xleC5sOiBOZXcgZmlsZS4KLQkqIHJlc2NvZmYuYzogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBhbmQgc3Vic3RpdHV0ZSBCVUlMRF9XSU5EUkVTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoV0lORFJFU19QUk9HKTogTmV3IHZhcmlhYmxlLgotCShQUk9HUyk6IEFkZCBAQlVJTERfV0lORFJFU0AuCi0JKEhGSUxFUyk6IEFkZCBkbGx0b29sLmggYW5kIHdpbmRyZXMuaC4KLQkoQ0ZJTEVTKTogQWRkIHdpbmRyZXMuYyBhbmQgcmVzcmMuYy4KLQkoR0VORVJBVEVEX0NGSUxFUyk6IEFkZCByY3BhcnNlLmMgYW5kIHJjbGV4LmMuCi0JKFdJTkRSRVNfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkkKFdJTkRSRVNfUFJPRyk6IE5ldyB0YXJnZXQuCi0JKHJjcGFyc2UuYywgcmNwYXJzZS5oLCByY2xleC5jKTogTmV3IHRhcmdldHMuCi0KLVRodSBKdW4gMTIgMTI6Mjc6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGV4cG9ydF90eXBlKTogQWRkIGRhdGEgZmllbGQuCi0JKGRlZl9leHBvcnRzKTogQWRkIGRhdGEgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShkdW1wX2RlZl9pbmZvKTogUHJpbnQgZGF0YSBmaWVsZC4KLQkoZ2VuX2RlZl9maWxlKTogTGlrZXdpc2UuCi0JKG1ha2Vfb25lX2xpYl9maWxlKTogSGFuZGxlIGRhdGEgZmllbGQgYnkgbm90IGVtaXR0aW5nIHNpbXBsZQotCWxhYmVsIGFuZCBub3QgZW1pdHRpbmcgYW55dGhpbmcgaW4gU0VDX1RFWFQuCi0JKGR0YWIpOiBQcmludCBkYXRhIGZpZWxkLgotCShwcm9jZXNzX2R1cGxpY2F0ZXMpOiBNZXJnZSBkYXRhIGZpZWxkLgotCSogZGxsdG9vbC5oIChkZWZfZXhwb3J0cyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGRlZnBhcnNlLnkgKGV4cGxpbmUpOiBBY2NlcHQgb3B0X0RBVEEuICBQYXNzIGl0IHRvIGRlZl9leHBvcnRzLgotCShvcHRfREFUQSk6IE5ldyBub24tdGVybWluYWwuCi0KLVdlZCBKdW4gMTEgMTc6MTU6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmg6IE5ldyBmaWxlLgotCSogZGVmbGV4Lmw6IEluY2x1ZGUgZGxsdG9vbC5oIGFuZCBsaWJpYmVydHkuaC4gIERvbid0IGRlY2xhcmUKLQlzdHJkdXAuICBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKiBkZWZwYXJzZS55OiBJbmNsdWRlIGJmZC5oLCBidWNvbW0uaCwgYW5kIGRsbHRvb2wuaC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSBkbGx0b29sLmggYW5kIHRpbWUuaC4gIE1ha2UgYSBsb3Qgb2YKLQl2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBzdGF0aWMuICBNYWtlIGEgbG90IG9mIGNoYXIgKiB2YXJpYWJsZXMKLQlhbmQgcGFyYW1ldGVycyBjb25zdC4gIEFkZCBkZWNsYXJhdGlvbnMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBEbwotCXNvbWUgcmVpbmRlbnRpbmcuICBIaWRlIG1vcmUgUG93ZXJQQyBzdHVmZiBpbnNpZGUgRExMVE9PTF9QUEMuCi0KLVdlZCBKdW4gMTEgMTI6MDU6NTIgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogYXIuYyAoYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUpOiBBZGQgY29uc3QuCi0KLU1vbiBNYXkgMTIgMjI6MDk6MzUgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFBhc3MgQ0NfRk9SX1RBUkdFVCBhbmQgQ0ZMQUdTX0ZPUl9UQVJHRVQKLQl0byBydW50ZXN0LgotCi1Nb24gTWF5IDEyIDEzOjE0OjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCBjbGVhciBPUENPREVTIHdoZW4gLS1lbmFibGUtY29tbW9uYmZkbGliIGlzCi0JdXNlZCBvbiBIUC9VWC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAyNSAxNDoyMjowOCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBDaGFuZ2UgKi5pbmZvKgotCXRvIGJpbnV0aWxzLmluZm8qIHRvIHNhdmUgc3lzcm9mZi5pbmZvLgotCi1UdWUgQXByIDE1IDEzOjQyOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1hGT1JNLCBJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLQlkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcgJChJTlNUQUxMX1hGT1JNKSBhbmQKLQkkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsLWluZm8pOiBSdW4gbWtpbnN0YWxsZGlycy4KLQotTW9uIEFwciAxNCAxMTo1MjozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQotCUZyb20gVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPjoKLQkqIE1ha2VmaWxlLmluOiBBbHdheXMgdXNlICQoU0hFTEwpIHdoZW4gcnVubmluZyBtb3ZlLWlmLWNoYW5nZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Q09ORklHX1NIRUxMfSB3aGVuIHJ1bm5pbmcgJGFjX2NvbmZpZ19zdWIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDQgMTM6Mjg6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19GVU5DX0FMTE9DQS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogYnVjb21tLmg6IEFkZCBhbGxvY2EgaGFuZGxpbmcsIGNvcGllZCBmcm9tIGdhcy9hcy5oLgotCSogZGxsdG9vbC5jOiBBZGQgI3ByYWdtYSBhbGxvY2EgZm9yIEFJWCB0byBzdGFydCBvZiBmaWxlLgotCSogbmxtY29udi5jOiBMaWtld2lzZS4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuICBSZW1vdmUKLQlldmVyeXRoaW5nIHRoYXQgY2xlYW4gcmVtb3Zlcy4KLQotVGh1IEFwciAgMyAxMzoxODozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVR1ZSBBcHIgIDEgMTY6MjE6NDQgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5jb206IE5ldyBmaWxlLgotCSogY29uZmlnLmgtdm1zOiBSZW1vdmUgZmlsZS4KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIGZvciBuZXcgY29uZmlndXJlIHNjaGVtZS4KLQotTW9uIE1hciAzMSAxNTozMDo0MyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBvYmpjb3B5LmMgKG1ha2Vfc2FtZV9kYXRlcyk6IFVzZSBzdGF0YnVmLCBub3QgYnVmLCBpZiBub3QKLQlIQVZFX0dPT0RfVVRJTUVfSC4KLQotRnJpIE1hciAyOCAxNzo1Nzo1MyAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBEb24ndCBsaW5rIGFnYWluc3QgQkZETElCIHR3aWNlLgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3IgY29tbW9uYmZkbGliLiAgSWYgaXQgaXMgc2V0LAotCXNldCBPUENPREVTIHRvIGVtcHR5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgTWFyIDI3IDE2OjAzOjAyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gTWFydHkgTGVpc25lciA8bGVpc25lckBzZHNwLm1jLnhlcm94LmNvbT46Ci0JKiBvYmpjb3B5LmM6IEluY2x1ZGUgPHV0aW1lLmg+IG9yIDxzeXMvdGltZS5oPi4KLQkoc3RyaXBfb3B0aW9ucyk6IEFkZCAicHJlc2VydmUtZGF0ZXMiLgotCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLXAgYW5kIC0tcHJlc2VydmUtZGF0ZXMuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKG1ha2Vfc2FtZV9kYXRlcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHN0cmlwX21haW4pOiBIYW5kbGUgLXAuCi0JKGNvcHlfbWFpbik6IExpa2V3aXNlLgotCSogYmludXRpbHMudGV4aSwgc3RyaXAuMSwgb2JqY29weS4xOiBEb2N1bWVudCBuZXcgb3B0aW9uLgotCi0JYWRkcjJsaW5lLmMgY29udHJpYnV0ZWQgYnkgVWxyaWNoIExhdXRoZXIKLQk8VWxyaWNoLkxhdXRoZXJAemZlLnNpZW1lbnMuZGU+OgotCSogYWRkcjJsaW5lLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQUREUjJMSU5FX1BST0cpOiBOZXcgdmFyaWFibGUuCi0JKE1BTlBBR0VTKTogQWRkIGFkZHIybGluZS4KLQkoUFJPR1MpOiBBZGQgJChBRERSMkxJTkVfUFJPRykuCi0JKENGSUxFUyk6IEFkZCBhZGRyMmxpbmUuYy4KLQkoJChBRERSMkxJTkVfUFJPRykpOiBOZXcgdGFyZ2V0LgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgYWRkcjJsaW5lLgotCSogYWRkcjJsaW5lLjE6IE5ldyBmaWxlLgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBVcGRhdGUgY29weXJpZ2h0IGRhdGUuCi0KLU1vbiBNYXIgMjQgMTA6NTI6NDUgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGV4aXQgaWYgYSBmaWxlIGNhbm5vdCBiZQotCWRpc2Fzc2VtYmxlZCwgaW5zdGVhZCBqdXN0IHJldHVybi4KLQotVGh1IE1hciAyMCAyMToxNjo1MSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNpemUuYyAodXNhZ2UpOiBNYWtlIGRlZmluaXRpb24gbWF0Y2ggaXRzIHByb3RvdHlwZS4KLQkoZGlzcGxheV9iZmQsIGxwcmludF9udW1iZXIsIHJwcmludF9udW1iZXIpOiBMaWtld2lzZS4KLQkocHJpbnRfYmVya2VsZXlfZm9ybWF0LCBzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBMaWtld2lzZS4KLQkocHJpbnRfc3lzdl9mb3JtYXQpOiBMaWtld2lzZS4KLQkqIG5tLmMgKHNldF9wcmludF9yYWRpeCwgc2V0X291dHB1dF9mb3JtYXQpOiBMaWtld2lzZS4KLQkqIG9iamNvcHkuYyAoZmlsdGVyX2J5dGVzKTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMTggMTY6Mzk6NTUgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIE1hbnkgZmlsZXM6IEFkZCBmdW5jdGlvbiBwcm90b3R5cGVzLgotCSogYXIuYyAobXJpX2VtdWwsIGdldF9wb3NfYmZkKTogTWFrZSBzdGF0aWMuCi0JKiBhcmxleC5sOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuICBEb24ndCBkZWNsYXJlIHN0cmR1cC4gIFVzZQotCXhzdHJkdXAgcmF0aGVyIHRoYW4gc3RyZHVwLgotCSogYXJwYXJzZS55ICh5eWVycm9yKTogTWFrZSBhcmd1bWVudCBjb25zdC4gIENvcnJlY3QgdHlwby4KLQkqIGFyc3VwLmMgKHN0cmR1cCk6IERvbid0IGRlY2xhcmUuCi0JKGFyX3NhdmUpOiBVc2UgeHN0cmR1cCByYXRoZXIgdGhhbiBzdHJkdXAuCi0JKiBmaWxlbW9kZS5jOiBJbmNsdWRlICJidWNvbW0uaCIuCi0JKiBubS5jICh1c2FnZSk6IE1ha2Ugc3RhdGljLgotCShwcmludF9zeW1uYW1lKTogTWFrZSBmb3JtYXQgYW5kIG5hbWUgY29uc3QuCi0JKiBvYmpjb3B5LmMgKGNhdCk6IFJlbW92ZS4KLQkoY29weV9hcmNoaXZlKTogTWFrZSBvdXRwdXRfdGFyZ2V0IGNvbnN0LiAgVXNlIGNvbmNhdCwgbm90IGNhdC4KLQkoY29weV9maWxlLCBzaW1wbGVfY29weSwgc21hcnRfcmVuYW1lKTogTWFrZSBhcmd1bWVudHMgY29uc3QuCi0JKiBvYmpkdW1wLmMgKHJlYWRfc2VjdGlvbl9zdGFicyk6IExpa2V3aXNlLgotCShwcmludF9zZWN0aW9uX3N0YWJzKTogTGlrZXdpc2UuCi0JKGRpc3BsYXlfdGFyZ2V0X3RhYmxlcyk6IERvbid0IGRlY2xhcmUgZ2V0ZW52LgotCSogc3RyaW5ncy5jIChzdHJpbmdzX29iamVjdF9maWxlKTogQ2hhbmdlIGZpbGUgdG8gY29uc3QuCi0JKHByaW50X3N0cmluZ3MpOiBDaGFuZ2UgZmlsZW5hbWUgdG8gY29uc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLVR1ZSBNYXIgMTggMTE6Mzc6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBCRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpLgotCSogYWNjb25maWcuaDogQWRkIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogYnVjb21tLmggKGdldGVudik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9HRVRFTlYuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIG5sbWNvbnYuYyAoZ2V0ZW52KTogRG9uJ3QgZGVjbGFyZS4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1TYXQgTWFyIDE1IDE1OjM1OjU2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBKYW1pZSBMb2tpZXIgPGphbWllQHJlYmVsbGlvbi5jby51az46Ci0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgImRlbWFuZ2xlLmgiLgotCShkb19kZW1hbmdsZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtQy8tLWRlbWFuZ2xlLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRlbWFuZ2xlIi4KLQkob2JqZHVtcF9wcmludF9zeW1uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogVXNlIG9iamR1bXBfcHJpbnRfc3ltbmFtZS4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBMaWtld2lzZS4KLQkoZHVtcF9yZWxvY19zZXQpOiBMaWtld2lzZS4KLQkoZHVtcF9zeW1ib2xzKTogRGVtYW5nbGUgc3ltYm9sIG5hbWUuCi0JKG1haW4pOiBIYW5kbGUgLUMuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpkdW1wLjE6IERvY3VtZW50IC1DLy0tZGVtYW5nbGUuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBNZW50aW9uIC0tbm8tc2hvdy1yYXctaW5zbi4KLQkobG9uZ19vcHRpb25zKTogQWRkICJuby1zaG93LXJhdy1pbnNuIi4KLQkoZGlzYXNzZW1ibGVfYnl0ZXMpOiBIYW5kbGUgLS1uby1zaG93LXJhdy1pbnNuLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtLW5vLXNob3ctcmF3LWluc24uCi0KLVdlZCBNYXIgMTIgMTE6NDI6MDAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHJkZGJnLmMgKGZyZWVfc2F2ZWRfc3RhYnMpOiBTZXQgdGhlIHN0cmluZ3MgdG8gTlVMTCBhZnRlciBiZWluZwotCWZyZWVkLgotCi1GcmkgRmViIDI4IDE3OjE4OjQ1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmMgKHNldF9kZWZhdWx0X2JmZF90YXJnZXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBidWNvbW0uaCAoc2V0X2RlZmF1bHRfYmZkX3RhcmdldCk6IERlY2xhcmUuCi0JKiBhci5jIChtYWluKTogQ2FsbCBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0LgotCSogbmxtY29udi5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBubS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBvYmpjb3B5LmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIG9iamR1bXAuYyAobWFpbik6IExpa2V3aXNlLgotCSogc2l6ZS5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluIChidWNvbW0ubyk6IE5ldyB0YXJnZXQsIHRvIGRlZmluZSBUQVJHRVQuCi0KLVR1ZSBGZWIgMjUgMjE6Mjg6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGFkanVzdF9zZWN0aW9uX3ZtYSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHVzYWdlKTogTWVudGlvbiAtLWFkanVzdC1zZWN0aW9uLXZtYS4KLQkoT1BUSU9OX0FESlVTVF9WTUEpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiYWRkanVzdC12bWEiLgotCShkaXNwbGF5X2JmZCk6IElmIGFkanVzdF9zZWN0aW9uX3ZtYSBpcyBub3QgMCwgYWRkIGl0IHRvIGFsbCB0aGUKLQlzZWN0aW9uIGFkZHJlc3Nlcy4KLQkobWFpbik6IEhhbmRsZSBPUFRJT05fQURKVVNUX1ZNQS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1hZGp1c3Qtdm1hLgotCi1GcmkgRmViIDE0IDE4OjQ2OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAocHJpbnRfc3ltYm9sKTogQ2FjaGUgdGhlIEJGRCBhcyB3ZWxsIGFzIHRoZSBzeW1ib2xzIGFuZAotIAlyZWxvY3MsIGFuZCBkb24ndCB0cnkgdG8gdXNlIHRoZSBzeW1ib2xzIG9yIHJlbG9jcyB3aXRoIGEKLSAJZGlmZmVyZW50IEJGRC4KLQotVGh1IEZlYiAxMyAyMTozNDo0MyAxOTk3ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQHByb2dpcy5kZSkKLQotCSogY29uZmlnLmgtdm1zOiBzYnJrKCkgaXMgcHJvdmlkZWQgb24gb3BlblZNUy9BbHBoYS4KLQkqIG1ha2VmaWxlLnZtczogYWxsb3cgY29tcGlsaW5nIHdpdGggY3VycmVudCBnY2Mgc25hcHNob3QuCi0KLVRodSBGZWIgMTMgMjA6MTQ6NDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcnN1cC5jLCBjb2ZmZ3Jvay5jLCBkbGx0b29sLmMsIG5sbWNvbnYuYzogVXNlIHhtYWxsb2MgcmF0aGVyCi0JdGhhbiBtYWxsb2MuCi0KLVdlZCBGZWIgMTIgMTY6MTI6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBDb3JyZWN0IFZNQSBhcmd1bWVudCB0bwotCWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzLiAgSW1wcm92ZSBoYW5kbGluZyBvZiBjb2RlIHdpdGggbm8gc3ltYm9sCi0JZm9sbG93ZWQgYnkgY29kZSB3aXRoIGEgc3ltYm9sLgotCi1XZWQgRmViIDEyIDEyOjE2OjQ3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2J5dGVzKTogTWFrZSBvdXRwdXQgb2YgcmF3IGluc3RydWN0aW9ucwotCXdvcmsgYmV0dGVyIGZvciBub24tc3RhbmRhcmQgdmFsdWVzIG9mIGJ5dGVzX3Blcl9jaHVuayBhbmQKLQlieXRlc19wZXJfbGluZS4KLQotVGh1IEZlYiAgNiAxNDoxNDo1OSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IEFkZGVkIGNvZGUgdG8gYWxsb3cgc29tZSBjb250cm9sCi0gCW92ZXIgdGhlIHdheSByYXcgaW5zdHJ1Y3Rpb25zIGFyZSBkaXNwbGF5ZWQuCi0KLVRodSBGZWIgIDYgMTI6MzY6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3QgYmluY2xfZmlsZSk6IEFkZCBuZXh0X3N0YWNrIGZpZWxkLgotCShwdXNoX2JpbmNsKTogUHV0IHRoZSBuZXcgZmlsZSBvbiBib3RoIGJpbmNsX2xpc3QgYW5kCi0JYmluY2xfc3RhY2suICBDbGVhciB0aGUgZmlsZV90eXBlcyBmaWVsZC4KLQkocG9wX2JpbmNsKTogVXNlIHRoZSBuZXh0X3N0YWNrIGZpZWxkIHdoZW4gcG9wcGluZyB0aGUgc3RhY2suCi0JRG9uJ3QgcHV0IHRoZSBmaWxlIG9uIGJpbmNsX2xpc3QuCi0JKGZpbmRfZXhjbCk6IEluY2x1ZGUgdGhlIGZpbGUgbmFtZSB3aGVuIHdhcm5pbmcgYWJvdXQgYW4gdW5mb3VuZAotCU5fRVhDTC4KLQotCSogZGVidWcuYyAoZGVidWdfdHlwZV9zYW1lcCk6IERvbid0IGNyYXNoIGlmIHdlIGFyZSBwYXNzZWQgTlVMTC4KLQotVGh1IEZlYiAgNiAxMTo1NDoyNCAxOTk3ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIG9iamNvcHkuMTogQWRkIG1pc3Npbmcgc3BhY2UgYWZ0ZXIgLkIuCi0KLUZyaSBKYW4gMzEgMTA6MzM6MDcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEluaXRpYWxpemUgYGF1eC5yZXF1aXJlX3NlYycuCi0KLVdlZCBKYW4gMjkgMTM6MjE6MjEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBBZGQgc2tpcF96ZXJvZXMgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkob2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltKTogTGlrZXdpc2UuICBDYWxsIG9iamR1bXBfcHJpbnRfdmFsdWUKLQl0byBwcmludCBhZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBKdXN0IGNhbGwgb2JqZHVtcF9wcmludF9hZGRyLgotCShkaXNhc3NlbWJsZV9ieXRlcyk6IFByaW50IHJlYWwgYWRkcmVzcywgbm90IGZ1bmN0aW9uIG9mZnNldC4KLQlTa2lwIGEgY2VydGFpbiBudW1iZXIgb2YgbGVhZGluZyB6ZXJvZXMuCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfemVyb2VzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tZGlzYXNzZW1ibGUtemVyb2VzLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRpc2Fzc2VtYmxlLXplcm9lcyIuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogQ2hlY2sgZGlzYXNzZW1ibGVfemVyb2VzLgotCi1UdWUgSmFuIDI4IDE2OjQ3OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IERvbid0IHNraXAgemVyb2VzIGlmIHRoZQotCWRpc2Fzc2VtYmxlciBoYXMgdG9sZCB1cyB0aGF0IHdlIGFyZSBpbiBhIGJyYW5jaCBkZWxheSBzbG90LgotCi1Nb24gSmFuIDIwIDE0OjI0OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2l6ZS5jIChiZXJrZWxleV9zdW0pOiBSZXdyaXRlLiAgU2tpcCBzZWN0aW9ucyB3aGljaCBhcmUgbm90Ci0JU0VDX0FMTE9DLiAgQ291bnQgU0VDX1JFQURPTkxZIHNlY3Rpb25zIGFzIHRleHQuCi0KLVR1ZSBKYW4gMTQgMTU6MTQ6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW4pOiBSZW1vdmUgKi5pbmZvKiwgbm90Ci0JanVzdCAqLmluZm8uICBGcm9tIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+LgotCi1UdWUgRGVjIDMxIDE1OjQyOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotRnJpIERlYyAyNyAxMToxOToyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogV29yayBhcm91bmQgYnVnIGluIEFDX0ZVTkNfVkZPUksgaW4gYXV0b2NvbmYgMi4xMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IERlYyAxOSAxMzoxMToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEFuZHJldyBKIEtsb3NzbmVyIDxhbmRyZXdAcG9nby53di50ZWsuY29tPjoKLQkqIG9iamNvcHkuYyAoT1BUSU9OX1dFQUtFTik6IERlZmluZS4KLQkoY29weV9vcHRpb25zKTogQWRkICJ3ZWFrZW4iLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXdlYWtlbi4KLQkod2Vha2VuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZmlsdGVyX3N5bWJvbHMpOiBIYW5kbGUgd2Vha2VuLgotCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgd2Vha2VuLgotCShjb3B5X21haW4pOiBIYW5kbGUgT1BUSU9OX1dFQUtFTi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS13ZWFrZW4uCi0KLVdlZCBEZWMgMTggMjI6NDk6MTMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVzZSBOZXdGb2xkZXJSZWN1cnNpdmUgZm9yIGluc3RhbGxhdGlvbi4KLQotU2F0IERlYyAgNyAxMDoxNzoyNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogQWRkICJlbHNlIHRydWUiIGNsYXVzZSB0byBjYXRlciB0bwotCWJyb2tlbiAibWFrZSIgb24gc29tZSBzeXN0ZW1zLgotCi1GcmkgRGVjICA2IDE3OjIxOjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX2JiKTogQWx3YXlzIGluaXRpYWxpemUgbmFtY29weSB0byBhdm9pZCBnY2MKLQl3YXJuaW5nIGFib3V0IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUuCi0JKGllZWVfcmVhZF9jeHhfY2xhc3MpOiBMaWtld2lzZSwgZm9yIHBmLgotCShpZWVlX2VudW1fdHlwZSk6IExpa2V3aXNlLCBmb3IgaS4KLQotVHVlIE5vdiAyNiAxNzowMToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RhYl9hcnJheV90eXBlKTogQWRkIGNhc3RzIHdoZW4gcHJpbnRpbmcKLQliZmRfc2lnbmVkX3ZtYSB2YWx1ZXMuCi0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0KLU1vbiBOb3YgMjUgMTY6NTM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCBjcmFzaCBpZiB0aGVyZSBpcyBubwotCXN5bWJvbC4KLQotRnJpIE5vdiAyMiAxNzoyOToxNCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYXIuYyAob3Blbl9pbmFyY2gpOiBEb24ndCBjYWxsIGJmZF9vcGVuciB3aXRoIGEgbnVsbCBuYW1lLgotCi1GcmkgTm92ICAxIDEyOjA4OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aTogQWRkIHNlY3Rpb24gb24gcmVwb3J0aW5nIGJ1Z3MuCi0KLVRodSBPY3QgMzEgMTg6MjA6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9oYW5kbGUpOiBBZGQgYmluY2xfbGlzdCBmaWVsZC4KLQkocGFyc2Vfc3RhYik6IFBhc3MgdmFsdWUgdG8gcHVzaF9iaW5jbC4gIENhbGwgZmluZF9leGNsIGZvcgotCU5fRVhDTC4KLQkoc3RydWN0IGJpbmNsX2ZpbGUpOiBBZGQgaGFzaCwgZmlsZSBhbmQgZmlsZV90eXBlcyBmaWVsZHMuCi0JKHB1c2hfYmluY2wpOiBBZGQgaGFzaCBwYXJhbWV0ZXIuICBTYXZlIGl0IGluIHRoZSBuZXcgaGFzaCBmaWVsZC4KLQlTYXZlIHRoZSBmaWxlIG51bWJlciBpbiB0aGUgbmV3IGZpbGUgZmllbGQuCi0JKHBvcF9iaW5jbCk6IFB1dCB0aGUgYmluY2xfZmlsZSBvbiBiaW5jbF9saXN0LCByYXRoZXIgdGhhbiBmcmVlaW5nCi0JaXQuICBTYXZlIHRoZSBmaWxlIHR5cGVzIGluIHRoZSBuZXcgZmlsZV90eXBlcyBmaWVsZC4KLQkoZmluZF9leGNsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotCSogaWVlZS5jIChpZWVlX2xpbmVubyk6IERvbid0IGNvbXBhcmUgbGluZSBudW1iZXIgYWRkcmVzc2VzIHRvCi0JaW5mby0+aGlnaGFkZHIgKHVuZG8gcGFydCBvZiBPY3RvYmVyIDI4IHBhdGNoKS4KLQotVHVlIE9jdCAyOSAxNjo0MDoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAob2JqZHVtcF9wcmludF92YWx1ZSk6IERvbid0IHByaW50IHRoZSBlbXB0eSBzdHJpbmcKLQlmb3IgemVyby4KLQotTW9uIE9jdCAyOCAxNjo1ODoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBmdW5jdGlvbl9lbmQgZmllbGQuCi0JKHN0YXJ0X3N0YWIpOiBJbml0aWFsaXplIGZ1bmN0aW9uX2VuZC4KLQkoZmluaXNoX3N0YWIpOiBQYXNzIGluZm8tPmZ1bmN0aW9uX2VuZCB0byBkZWJ1Z19lbmRfZnVuY3Rpb24uCi0JKHBhcnNlX3N0YWIpOiBJZiBpbmZvLT5mdW5jdGlvbl9lbmQgaXMgc2V0LCB1c2UgaXQgYXMgdGhlIGFkZHJlc3MKLQl3aGljaCBlbmRzIGEgZnVuY3Rpb24uCi0KLQkqIGllZWUuYyAoaWVlZV9hcnJheV90eXBlKTogUmVtZW1iZXIgdGhlIGNvcnJlY3Qgc2l6ZS4KLQotCSogaWVlZS5jIChpZWVlX2ZpbmlzaF9jb21waWxhdGlvbl91bml0KTogUGVybWl0IGNvYWxlc2NpbmcgcmFuZ2VzCi0JdGhhdCBhcmUgdXAgdG8gMHgxMDAwIGJ5dGVzIGFwYXJ0LCBub3QganVzdCA2NC4KLQkoaWVlZV9hZGRfYmIxMV9ibG9ja3MpOiBEb24ndCBib3RoZXIgdG8gZW1pdCBhIEJCMTEgdGhhdCBpcyBsZXNzCi0JdGhhbiAweDEwMCBieXRlcy4KLQkoaWVlZV9saW5lbm8pOiBPbmx5IGVtaXQgbGluZSBudW1iZXJzIHRoYXQgYXJlIGxlc3MgdGhhbgotCWluZm8tPmhpZ2hhZGRyLgotCi1GcmkgT2N0IDI1IDEyOjEyOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0pOiBBZGQgZGVmaW5lZCBmaWVsZC4KLQkoaWVlZV9lbnVtX3R5cGUpOiBJZiB0aGUgZW51bSB0YWcgaGFzIGJlZW4gc2VlbiBiZWZvcmUgYnV0IG5vdAotCWRlZmluZWQsIHJldXNlIHRoZSBzYW1lIHR5cGUgaW5kZXgsIGFuZCBkZWZpbmUgaXQuCi0JKGllZWVfdGFnX3R5cGUpOiBJZiB0aGlzIGVudW0gaGFzIG5vdCBiZWVuIGRlZmluZWQsIGFkZCBhbgotCXVuZGVmaW5lZCBlbnRyeSB0byB0aGUgbGlzdCBvZiBlbnVtcy4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9ieXRlcyk6IExldCB0aGUgZGlzYXNzZW1ibGVyIG92ZXJyaWRlIHRoZQotCW51bWJlciBvZiBieXRlcyBwcmludGVkIG9uIGEgbGluZS4KLQotVGh1IE9jdCAyNCAxNjo0MjoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAocHJlZml4X2FkZHJlc3Nlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAicHJlZml4LWFkZHJlc3NlcyIuCi0JKGNvbXBhcmVfc3ltYm9scyk6IFNvcnQgQlNGX0ZVTkNUSU9OIHN5bWJvbHMgYmVmb3JlIG90aGVyCi0Jc3ltYm9scy4KLQkoZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jb2JqZHVtcF9wcmludF9hZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jb2JqZHVtcF9wcmludF9hZGRyZXNzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDYWxsIG5ldyBmdW5jdGlvbnMuCi0JKGRpc2Fzc2VtYmxlX2J5dGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCWRpc2Fzc2VtYmxlX2RhdGEuICBDaGFuZ2UgZGlzYXNzZW1ibHkgZm9ybWF0LCB1bmxlc3MKLQlwcmVmaXhfYWRkcmVzc2VzIGlzIHNldC4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENhbGwgZGlzYXNzZW1ibGVfYnl0ZXMuICBVbmxlc3MKLQlwcmVmaXhfYWRkcmVzc2VzIGlzIHNldCwgZGlzYXNzZW1ibGUgaW4gY2h1bmtzIGhlYWRlZCBieSBhCi0Jc3ltYm9sLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtLXByZWZpeC1hZGRyZXNzZXMuCi0KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IFByZXNlcnZlIHRoZQotCWJhY2tzbGFzaCB3aGVuIGNvbmNhdGVuYXRpbmcgbXVsdGlwbGUgc3RhYnMgc3RyaW5ncy4KLQotVGh1IE9jdCAxMCAxMTozNjozMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNjYW5fb3Blbl9vYmpfZmlsZSk6IEZpeCBsb29wIGV4aXQgdGVzdC4KLQlBZGQgbWlzc2luZyBwYXJhbWV0ZXIgdG8gZGVmX2V4cG9ydHMuCi0KLVR1ZSBPY3QgIDggMTI6MDY6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTEVYX09QVElPTlMpOiBTZXQgdG8gZW1wdHkgc3RyaW5nLiAgLUkgLUNlbSBpcyB0aGUKLQlkZWZhdWx0IGZvciBmbGV4LCBhbmQgaXMgbm90IHJlY29nbml6ZWQgYnkgbGV4LgotCi1UaHUgT2N0ICAzIDE3OjQxOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMudGV4aSAoVGFyZ2V0IFNlbGVjdGlvbik6IERvY3VtZW50IHRoYXQgeW91IGNhbiBub3cKLQlzcGVjaWZ5IHRhcmdldHMgdXNpbmcgY29uZmlndXJhdGlvbiB0cmlwbGV0cy4KLQotCSogYXIuYyAodXNhZ2UpOiBEZWNsYXJlLiAgTWFrZSBzdXJlIGFsbCBjYWxsZXJzIHBhc3MgYW4gYXJndW1lbnQuCi0KLVRodSBPY3QgIDMgMTU6Mzk6NDIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0KLVdlZCBPY3QgIDIgMTU6NDk6MTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogQnVtcCB2ZXJzaW9uIGRhdGUuCi0KLVR1ZSBPY3QgIDEgMTU6MDA6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB2ZXJzaW9uLmMgKHByaW50X3ZlcnNpb24pOiBOZXcgZnVuY3Rpb24uCi0JKiBidWNvbW0uaCAocHJpbnRfdmVyc2lvbik6IERlY2xhcmUuCi0JKiBhci5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCShkb19zaG93X3ZlcnNpb24pOiBSZW1vdmUuCi0JKHVzYWdlKTogQWRkIGhlbHAgcGFyYW1ldGVyLiAgUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogU2V0IGlzX3JhbmxpYiBhdCBzdGFydC4gIENoZWNrIGZvciAtLWhlbHAgYW5kIC0tdmVyc2lvbi4KLQlDYWxsIHByaW50X3ZlcnNpb24sIG5vdCBkb19zaG93X3ZlcnNpb24uCi0JKiBubG1jb252LmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKG1haW4pOiBDYWxsIHByaW50X3ZlcnNpb24uCi0JKHNob3dfdXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKiBubS5jIChwcm9ncmFtX3ZlcnNpb24sIHByaW50X3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkqIG9iamNvcHkuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkoY29weV91c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkoc3RyaXBfdXNhZ2UpOiBMaWtld2lzZS4KLQkoc3RyaXBfbWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkoY29weV9tYWluKTogTGlrZXdpc2UuCi0JKiBvYmpkdW1wLmMgKHByb2dyYW1fdmVyc2lvbik6IERvbid0IGRlY2xhcmUuCi0JKHVzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2FsbCBwcmludF92ZXJzaW9uLgotCSogc2l6ZS5jIChwcm9ncmFtX3ZlcnNpb24pOiBEb24ndCBkZWNsYXJlLgotCSh1c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkqIHN0cmluZ3MuYyAocHJvZ3JhbV92ZXJzaW9uKTogRG9uJ3QgZGVjbGFyZS4KLQkobWFpbik6IENhbGwgcHJpbnRfdmVyc2lvbi4KLQkodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQotVGh1IFNlcCAxOSAxNDo1MzoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogUmV2ZXJ0IE1vbmRheSdzIHJlZmxvY2FscCBwYXRjaCwgYW5kIGFwcGx5IHRoaXMgcGF0Y2gKLQlpbnN0ZWFkOgotIAkod3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IFdyaXRlIGEgZHVtbXkgdHlwZSBhdCB0aGUgZW5kIG9mIHRoZQotCWdsb2JhbCB0eXBlIGJsb2NrLgotCi1Nb24gU2VwIDE2IDE1OjMwOjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV93cml0ZV90eXBlKTogQWRkIHJlZmxvY2FscCBmaWVsZC4KLQkoaWVlZV9wb2ludGVyX3R5cGUpOiBTZXQgcmVmbG9jYWxwIGFmdGVyIHB1c2hpbmcgdHlwZS4KLQkoaWVlZV9mdW5jdGlvbl90eXBlKTogSWYgcmVmbG9jYWxwIGlzIHNldCwgbWFrZSB0aGlzIHR5cGUgbG9jYWwuCi0JKGllZWVfcmFuZ2VfdHlwZSwgaWVlZV9hcnJheV90eXBlLCBpZWVlX3NldF90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfY29uc3RfdHlwZSwgaWVlZV92b2xhdGlsZV90eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfc3RydWN0X2ZpZWxkLCBpZWVlX2NsYXNzX2Jhc2VjbGFzcyk6IExpa2V3aXNlLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX2luZm8pOiBBZGQgZ2xvYmFsX3R5cGVzIGZpZWxkLgotCShwYXJzZV9pZWVlX2JiKTogV2hlbiBzdGFydGluZyBhIEJCMSwgaW5pdGlhbGl6ZSB0aGUgdHlwZXMgZmllbGQKLQl0byB0aGUgZ2xvYmFsX3R5cGVzIGZpZWxkLgotCShwYXJzZV9pZWVlX2JlKTogV2hlbiBlbmRpbmcgYSBCQjIsIGNvcHkgdGhlIHR5cGVzIGZpZWxkIHRvIHRoZQotCWdsb2JhbF90eXBlcyBmaWVsZC4KLQotRnJpIFNlcCAxMyAxNzozMjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY2hhbmdlX2xlYWRpbmdfY2hhcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSKTogRGVmaW5lLgotCShjb3B5X29wdGlvbnMpOiBBZGQgImNoYW5nZS1sZWFkaW5nLWNoYXIiLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLWNoYW5nZS1sZWFkaW5nLWNoYXIuCi0JKGZpbHRlcl9zeW1ib2xzKTogQWRkIG9iZmQgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCUltcGxlbWVudCBjaGFuZ2VfbGVhZGluZ19jaGFyLgotCShjb3B5X29iamVjdCk6IENhbGwgZmlsdGVyX3N5bWJvbHMgaWYgY2hhbmdlX2xlYWRpbmdfY2hhci4KLQkoY29weV9tYWluKTogSGFuZGxlIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLWNoYW5nZS1sZWFkaW5nLWNoYXIuCi0KLVR1ZSBTZXAgIDMgMTQ6MDU6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfZW51bV90eXBlKTogRG9uJ3QgY2hlY2sgaW5kZXggaW50byBhIE5VTEwgbmFtZXMKLQlhcnJheS4KLQkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogQWx3YXlzIGluaXRpYWxpemUgbmV4dC4KLQkqIHJkY29mZi5jIChwYXJzZV9jb2ZmX3R5cGUpOiBXYXJuIGFib3V0IGFuIGluY29tcHJlaGVuc2libGUKLQl0eXBlIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCSogcmRkYmcuYyAocmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8pOiBJbml0aWFsaXplIGYuCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX21lbWJlcnMpOiBTZXQgY29udGV4dCBpbiBhbGwgY2FzZXMuCi0KLVRodSBBdWcgMjkgMTY6NTY6NTIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEF1ZyAyOSAxMToyOToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoTF90bXBuYW0pOiBOZXZlciBkZWZpbmUuCi0JKGRpc3BsYXlfdGFyZ2V0X2xpc3QpOiBVc2UgY2hvb3NlX3RlbXBfYmFzZSBpbnN0ZWFkIG9mIHRtcG5hbS4KLQkoZGlzcGxheV9pbmZvX3RhYmxlKTogTGlrZXdpc2UuCi0KLVR1ZSBBdWcgMjcgMTg6MTU6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiKTogQW4gTl9GVU4gc3ltYm9sIHdpdGggYW4gZW1wdHkgc3RyaW5nCi0JaW5kaWNhdGVzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbi4KLQotVGh1IEF1ZyAyMiAxNzowODowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYyAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5KTogQWRkIG5leHQgZmllbGQuCi0JKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSk6IENoYW5nZSBzdHJpbmdzIHRvIGEgcG9pbnRlciB0bwotCXN0cmluZ19oYXNoX2VudHJ5LiAgQWRkIGxhc3Rfc3RyaW5ncyBmaWVsZC4gIFJlbW92ZSBzdHJpbmdzX2FsbG9jCi0JZmllbGQuCi0JKHN0cmluZ19oYXNoX25ld2Z1bmMpOiBJbml0aWFsaXplIG5leHQgZmllbGQuCi0JKHN0YWJfd3JpdGVfc3ltYm9sKTogQ29weSBzdHJpbmcgaW50byBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGludG8KLQlidWZmZXIuICBLZWVwIGEgbGlzdCBvZiBoYXNoIHRhYmxlIGVudHJpZXMuCi0JKHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvKTogSW5pdGlhbGl6ZSBsYXN0X3N0cmluZy4KLQlDb3B5IHN0cmluZ3MgZnJvbSBsaXN0IG9mIGhhc2ggdGFibGUgZW50cmllcyBpbiBtZW1vcnkuCi0JKHN0YWJfbW9kaWZ5X3R5cGUpOiBJZiB0aGUgZW50cnkgb24gdGhlIHN0YWNrIGlzIGEgZGVmaW5pdGlvbiwKLQltYWtlIGEgbmV3IGRlZmluaXRpb24gcmF0aGVyIHRoYW4gZmFpbGluZyBhbiBhc3NlcnQuCi0JKHN0YWJfYXJyYXlfdHlwZSk6IFRoZSBzaXplIGlzIG9ubHkgemVybyBpZiBoaWdoIGlzIHN0cmljdGx5IGxlc3MKLQl0aGFuIGxvdy4KLQotCSogaWVlZS5jIChzdHJ1Y3QgaWVlZV9pbmZvKTogQWRkIHNhd19maWxlbmFtZSBmaWVsZC4KLQkocGFyc2VfaWVlZSk6IEluaXRpYWxpemUgc2F3X2ZpbGVuYW1lLgotCShwYXJzZV9pZWVlX2JiKTogU2V0IHNhd19maWxlbmFtZSBmb3IgYSBCQjEgb3IgQkIyLiAgSW4gYSBCQjEsCi0JZGlzY2FyZCB0aGUgY3VycmVudCB2YXJpYWJsZXMgYW5kIHR5cGVzLiAgSW4gYSBCQjEwLCBpZiBubwotCWZpbGVuYW1lIGhhcyBiZWVuIHNlZW4sIGNhbGwgZGVidWdfc2V0X2ZpbGVuYW1lLgotCShwYXJzZV9pZWVlX3R5KTogSW4gY2FzZSAnZycsIHRoZSB0eXBlIGlzIG9wdGlvbmFsLgotCi0JKiBwcmRiZy5jIChwcl9maXhfdmlzaWJpbGl0eSk6IERvbid0IGFib3J0IG9uCi0JREVCVUdfVklTSUJJTElUWV9JR05PUkUuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX25hbWVfdHlwZSk6IENvcnJlY3QgZXJyb3IgbWVzc2FnZS4KLQotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuICBVc2UgaXQgd2hlbmV2ZXIgbGlua2luZyBhCi0JcHJvZ3JhbS4KLQotVGh1IEF1ZyAxNSAxOTozMDo0MSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIHN5bWJvbGljIGRvdWJsZXF1b3RlcyBhcm91bmQgdGhlIHZlcnNpb24KLQludW1iZXIuCi0KLVRodSBBdWcgIDggMTI6Mjc6NTIgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogQWRkIGJldHRlciBzdXBwb3J0IGZvciBERUMgQyBjb21waWxhdGlvbi4KLQlBZGQgbmV3IG1hY3JvcyBhcyBpbiBNYWtlZmlsZS5pbi4KLQotV2VkIEF1ZyAgNyAxNDoyNzozMyAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURfREVDTEFSQVRJT04gb24gc3Ryc3RyIGFuZCBzYnJrLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCi0JKE5FRURfREVDTEFSQVRJT05fU0JSSyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogYnVjb21tLmggKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKHNicmspOiBEZWNsYXJlIGlmIEhBVkVfU0JSSyBhbmQgTkVFRF9ERUNMQVJBVElPTl9TQlJLLgotCi0JKiBwcmRiZy5jIChwcl9lbmRfc3RydWN0X3R5cGUpOiBBdm9pZCB1c2luZyBhIHN0cmluZyBjb25zdGFudCBpbgotCWFzc2VydCwgZm9yIHRoZSBiZW5lZml0IG9mIGJyb2tlbiBhc3NlcnQgbWFjcm9zLgotCi1GcmkgSnVsIDI2IDE0OjA2OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogU2V0IGRpc2FzbV9pbmZvLmZsYXZvdXIgZnJvbQotCWFiZmQuCi0KLVR1ZSBKdWwgMjMgMTM6NTk6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNlY2RhdGEpOiBJbiBub24gRExMVE9PTF9QUEMgY2FzZSwgY2hhbmdlIGFsaWdubWVudAotCW9mIC50ZXh0IHNlY3Rpb24gdG8gMi4KLQotTW9uIEp1bCAyMiAwODo0NjoxNSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzKTogIEZpeCB0ZXN0IGZvciBzdGFicyBzZWN0aW9ucwotCWVuZGluZyB3aXRoIG51bWJlcnMuICBUaGlzIGZpeGVzIGEgcHJvYmxlbSB3aXRoIC5zdGFiIGJlaW5nCi0JY29uZnVzZWQgd2l0aCAuc3RhYi5pbmRleC4KLQotV2VkIEp1bCAxMCAxMzozMjoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHN0YWJfZGVtYW5nbGVfZnVuZF90eXBlKTogUmV0dXJuIGEgdm9pZCAqIGZvciBhCi0JdGVtcGxhdGUsIHJhdGhlciB0aGFuIHNpbXBseSBhYm9ydGluZy4KLQotTW9uIEp1bCAgOCAxNToyODowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG9wZW5faW5hcmNoKTogQWRkIGZpbGUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYKLQl0aGlzIGlzIGEgbmV3bHkgY3JlYXRlZCBhcmNoaXZlLCBzZXQgdGhlIHRhcmdldCBiYXNlZCBvbiB0aGUKLQlmaWxlLgotCSogYXJzdXAuaCAob3Blbl9pbmFyY2gpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0KLVRodSBKdWwgIDQgMTI6MDA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byBjeWdudXMtMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotCSogcmRjb2ZmLmMgKHBhcnNlX2NvZmYpOiBHZXQgYWRkcmVzcyB0byBwYXNzIHRvIGRlYnVnX2VuZF9mdW5jdGlvbgotCWZyb20gZnVuY3Rpb24gc2l6ZSwgbm90IHZhbHVlIG9mIC5lZiBzeW1ib2wuICBGcm9tIE5pbmcKLQlNb3NiZXJnZXItVGFuZyA8bmluZ0BBWlN0YXJOZXQuY29tPi4KLQotU2F0IEp1biAyOSAyMToxODowOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbik6IEFkZCAtbyBvcHRpb24sIGFuZCBoYW5kbGUgaXQuCi0JKHN0cmlwX3VzYWdlKTogTWVudGlvbiAtby4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmlwLjE6IE1lbnRpb24gLW8uCi0KLU1vbiBKdW4gMjQgMTc6MTk6MDIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0JSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYgc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogQXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQotTW9uIEp1biAyNCAxMTo1OToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZW5kaWFuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC1FQi8tRUwvLS1lbmRpYW4uCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZW5kaWFuIi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IElmIGVuZGlhbm5lc3Mgd2FzIHNwZWNpZmllZCwgcmVwbGFjZQotCWFiZmQtPnh2ZWMgd2l0aCBhIGNvcHkgb2YgaXRzZWxmIHdpdGggdGhlIGdpdmVuIGVuZGlhbm5lc3MuCi0JKG1haW4pOiBIYW5kbGUgLUVCLy1FTC8tLWVuZGlhbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogTWVudGlvbiAtRUIvLUVMLy0tZW5kaWFuLgotCi0JKiBvYmpkdW1wLmM6IE1ha2UgbW9zdCB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBzdGF0aWMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYWxwaGEqLSotb3NmKiwgbGluayBhZ2FpbnN0IGxpYmJmZC5hIGlmIG5vdAotCXVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEwLgotCi1TdW4gSnVuIDIzIDE0OjQ3OjM2IDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKHNlY2RhdGEpOiBDaGFuZ2VkIC5yZGF0YSB0byAucmVsZGF0YSBzbyAucmVsb2Mgd2lsbCB3b3JrLgotCShtYWtlX29uZV9saWJfZmlsZSk6IFJlbW92ZWQgY3J1ZnQuICgjaWYgMSkKLQotV2VkIEp1biAxOSAxNDo0NjozOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoc3RhYnMpOiBDaGFuZ2UgZnJvbSBzdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgKiB0bwotCWJmZF9ieXRlICouCi0JKHByaW50X3NlY3Rpb25fc3RhYnMpOiBGZXRjaCBzdGFicyBpbmZvcm1hdGlvbiBkaXJlY3RseSwgcmF0aGVyCi0JdGhhbiBhc3N1bWluZyB0aGF0IHN0cnVjdCBpbnRlcm5hbF9ubGlzdCBpcyB0aGUgcmlnaHQgc2l6ZS4KLQotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgY2hhbmdlIHRvIGJpbmFyeSBmb3JtYXQ6IGZpbGUgcG9zaXRpb24KLQliYXNlZCBvbiBsb2FkIGFkZHJlc3MsIG5vdCBzZWN0aW9uIFZNQS4KLQotCSogYnVjb21tLmg6IERlZmluZSBTRUVLX1NFVCwgU0VFS19DVVIsIGFuZCBTRUVLX0VORCBpZiB0aGV5IGFyZQotCW5vdCBhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBKdW4gMTggMTg6MjU6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIGRlZmxleC5jLgotCi1UdWUgSnVuIDE4IDE1OjAzOjQ0IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWcuaC12bXMsIG1ha2VmaWxlLnZtczogTmV3IGZpbGVzLgotCi1Nb24gSnVuIDE3IDA5OjQ3OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX29uZV9saWJfZmlsZSk6IFVzZSBCRkRfUkVMT0NfUlZBIHJhdGhlciB0aGFuCi0JQkZEX1JFTE9DXzMyIGluIElEQVRBNy4KLQotV2VkIEp1biAxMiAxMTo1MjowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHN0cnVjdCBnZXRfcmVsb2NzX2luZm8pOiBEZWZpbmUuCi0JKGxpbmVfbnVtYmVycyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAibGluZS1udW1iZXJzIi4KLQkodXNhZ2UpOiBNZW50aW9uIC1sIGFuZCAtLWxpbmUtbnVtYmVycy4KLQkobWFpbik6IEhhbmRsZSAtbC4KLQkocHJpbnRfc3ltYm9sKTogUHJpbnQgbGluZSBudW1iZXJzIGlmIHJlcXVlc3RlZC4KLQkoZ2V0X3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBiaW51dGlscy50ZXhpLCBubS4xOiBEb2N1bWVudCAtbC8tLWxpbmUtbnVtYmVycy4KLQotVHVlIEp1biAxMSAyMDoxMjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY19zZXQpOiBBZGQgc2VjIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLiAgSWYgd2l0aF9saW5lX251bWJlcnMgaXMgc2V0LCBkaXNwbGF5IGxpbmUgbnVtYmVycyBvZgotCXJlbG9jYXRpb24gZW50cmllcy4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLWwgd2l0aCAtci4KLQotTW9uIEp1biAxMCAyMzo0Mjo1OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyLmMgKG9wZW5faW5hcmNoKTogUmVwb3J0IEJGRCBlcnJvciBtZXNzYWdlIGlmIGFuIGFyY2hpdmUgY2FuCi0Jbm90IGJlIHJlY29nbml6ZWQuICBMaXN0IG1hdGNoaW5nIGZvcm1hdHMgaWYgdGhlIGZpbGUgaXMKLQlhbWJpZ3VvdXNseSByZWNvZ25pemVkLgotCShyYW5saWJfdG91Y2gpOiBMaWtld2lzZS4KLQotVGh1IEp1biAgNiAxMzo1NjoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFJFQURNRTogQWRkIG5vdGVzIG9uIGhvdyB0byBidWlsZCBpZiB5b3UgZG9uJ3QgaGF2ZSBhci4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBvbGQgaW5jb3JyZWN0IHNldHRpbmcgb2YgQ0MuCi0KLVR1ZSBKdW4gIDQgMTA6NTI6NDkgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgY2hlY2sgdG8gc2VlIGlmIHRvb2xkaXIgZXhpc3RzLgotCU1ha2UgJCh0b29sZGlyKSBhbmQgJCh0b29sZGlyKS9iaW4uCi0KLU1vbiBKdW4gIDMgMTc6NDA6MjMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKG1haW4pOiBNYWtlIG1haW4gYW4gaW50IGZ1bmN0aW9uLCBub3Qgdm9pZC4KLQotRnJpIE1heSAzMSAxMzo1OToyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKGZpbHRlcl9zeW1ib2xzKTogQ2hlY2sgZm9yIEJTRl9XRUFLIGFzIHdlbGwgYXMKLQlCU0ZfR0xPQkFMLgotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgTWF5ICA4IDE2OjU3OjIwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IE1ha2UgY2xlYXIgdGhhdCBpdCBpcyBvbmx5IGEgd2FybmluZwotCXdoZW4gdGhlIG91dHB1dCBmaWxlIGNhbiBub3QgcmVwcmVzZW50IHRoZSBhcmNoaXRlY3R1cmUuCi0KLUZyaSBNYXkgIDMgMTE6MzA6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCByZWZlciB0byBieXRlcyBwYXN0IHRoZSBlbmQKLQlvZiBkYXRhLgotCi1XZWQgQXByIDI0IDE0OjEwOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmRkYmcuYyAocmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8pOiBNb3ZlIGNhbGwgdG8KLQlmcmVlX3NhdmVkX3N0YWJzIG91dHNpZGUgdGhlIGxvb3Agb3ZlciB0aGUgc3ltYm9scy4KLQotVHVlIEFwciAyMyAxMjo1NjoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBzeW1ib2xzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGgKLSAJYC4nIGFmdGVyIG90aGVyIHN5bWJvbHMuICBJZiBubyBvdGhlciBkZWNpc2lvbiBjYW4gYmUgbWFkZSwgc29ydAotCXN5bWJvbHMgYnkgbmFtZS4KLQotVGh1IEFwciAxOCAxNjowMjoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRlcC1pbi5zZWQ6IFN1YnN0aXR1dGUgJChCRkRESVIpIGZvciBAQkZERElSQC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoZGVwLnNlZCk6IFN1YnN0aXR1dGUgJChCRkRESVIpIGZvciBAQkZERElSQC4KLQotVHVlIEFwciAxNiAxMzo1MDoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJkY29mZi5jOiBOZXcgZmlsZS4KLQkqIHJkZGJnLmMgKHJlYWRfZGVidWdnaW5nX2luZm8pOiBSZWFkIENPRkYgc3ltYm9scyBpZiBDT0ZGIGZsYXZvdXIKLQlhbmQgbm8gc3RhYnMgd2VyZSBmb3VuZC4KLQkqIGJ1ZGJnLmggKHBhcnNlX2NvZmYpOiBEZWNsYXJlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBBZGQgcmRjb2ZmLmMuCi0JKERFQlVHX09CSlMpOiBBZGQgcmRjb2ZmLm8uCi0KLU1vbiBBcHIgMTUgMTU6NTU6MDEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbmxtY29udi5jIChjaG9vc2VfdGVtcF9iYXNleyxfdHJ5fSk6IERlbGV0ZSwgaW4gbGliaWJlcnR5IG5vdy4KLQkobGlua19pbnB1dHMpOiBVcGRhdGUgY2FsbCB0byBjaG9vc2VfdGVtcF9iYXNlLgotCi1Nb24gQXByICA4IDE0OjQwOjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjkgMTY6MTE6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBQcmludCB0aGUgU0VDX0xJTktfT05DRSBmbGFnCi0JYW5kIHRoZSBTRUNfTElOS19EVVBMSUNBVEVTIGZpZWxkLgotCi1GcmkgTWFyIDI5IDExOjM1OjU1IDE5OTYgIEouVC4gQ29ua2xpbiAgKGp0Y0BsaXNhLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuMTogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgotCi1UaHUgTWFyIDI4IDE0OjE3OjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JzdGFicy5jIChzdGFiX2VudW1fdHlwZSk6IFNldCBidWYgYmVmb3JlIHVzaW5nIGl0LgotCi1GcmkgTWFyIDIyIDE1OjQ5OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc3RydWN0IHN0YWJfaGFuZGxlKTogQWRkIGZpZWxkIGFiZmQuCi0JKHN0YXJ0X3N0YWIpOiBBZGQgYWJmZCBwYXJhbWV0ZXIuCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogU2tpcCB0aGUgc3ltYm9sIGxlYWRpbmcgY2hhciB3aGVuIHNlYXJjaGluZwotCWZvciB0aGUgdmFsdWUgb2YgYSBnbG9iYWwgc3ltYm9sLgotCSogYnVkYmcuaCAoc3RhcnRfc3RhYik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IFBhc3MgYWJmZCB0bwotCXN0YXJ0X3N0YWIuCi0JKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjEgMTI6NDA6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cnN0YWJzLmMgKHN0YWJfZnVuY3Rpb25fdHlwZSk6IE91dHB1dCBhbiBlbXB0eSB0eXBlZGVmIGZvciBhbgotCXVudXNlZCBhcmd1bWVudCwgcmF0aGVyIHRoYW4gbWFraW5nIHVwIGEgbWVhbmluZ2xlc3MgbmFtZS4KLQkoc3RhYl92YXJpYWJsZSk6IFVzZSBOX1JTWU0gZm9yIGEgREVCVUdfUkVHSVNURVIgdmFyaWFibGUuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaW5mbyk6IEFkZCBnbG9iYWxfdmFycyBmaWVsZC4KLQkocGFyc2VfaWVlZV9iZSk6IFdoZW4gZW5kaW5nIHRoZSBnbG9iYWwgdHlwZWRlZiBibG9jaywgY29weSB0aGUKLQl2YXJpYWJsZXMgaW50byBpbmZvLT5nbG9iYWxfdmFycy4KLQkocGFyc2VfaWVlZV9hdG4pOiBEb24ndCByZXF1aXJlIGFuIE5OIHJlY29yZCBmb3IgYSBwbWlzYyBBVE4uCi0JKGllZWVfcmVhZF9yZWZlcmVuY2UpOiBTZWFyY2ggdGhlIGdsb2JhbCB2YXJpYWJsZXMgYWZ0ZXIgdGhlIGxvY2FsCi0JdmFyaWFibGVzLgotCi1XZWQgTWFyIDIwIDE4OjA4OjE5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBNYWtlIHN1cmUgc3ltX25hbWUgaXMgYWx3YXlzIHNldC4KLQkoZHVtcF9zZWN0aW9uX2hlYWRlcik6IEFsd2F5cyBwdXQgYSBzcGFjZSBhZnRlciB0aGUgc2VjdGlvbiBuYW1lLgotCShkdW1wX2JmZF9oZWFkZXIpOiBUZXJtaW5hdGUgb3V0cHV0IHdpdGggbmV3bGluZS4KLQotV2VkIE1hciAyMCAxNjozNToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyc3RhYnMuYzogTmV3IGZpbGUuCi0JKiBidWRiZy5oICh3cml0ZV9zdGFic19pbl9zZWN0aW9uc19kZWJ1Z2dpbmdfaW5mbyk6IERlY2xhcmUuCi0JKiBvYmpjb3B5LmMgKHdyaXRlX2RlYnVnZ2luZ19pbmZvKTogRm9yIENPRkYgb3IgRUxGLCBvdXRwdXQgc3RhYnMKLQlpbiBzZWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIHdyc3RhYnMuYy4KLQkoV1JJVEVfREVCVUdfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChPQkpDT1BZX1BST0cpKTogVXNlICQoV1JJVEVfREVCVUdfT0JKUyksIG5vdCAkKERFQlVHX09CSlMpLgotCSgkKFNUUklQX1BST0cpKTogTGlrZXdpc2UuCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfbWVtYmVycyk6IE1ha2UgdHlwZSBzdHViIGRldGVjdGlvbiBtb3JlIGxpa2UKLQlnZGIuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfaGFuZGxlKTogQWRkIGZpZWxkcyBjb21wbGV4X2Zsb2F0X2luZGV4IGFuZAotCWNvbXBsZXhfZG91YmxlX2luZGV4LgotCShpZWVlX2NvbXBsZXhfdHlwZSk6IENhY2hlIHR5cGUgaW5kZXggaW4gY29tcGxleF9mbG9hdF9pbmRleCBhbmQKLQljb21wbGV4X2RvdWJsZV9pbmRleCwgZGVwZW5kaW5nIHVwb24gc2l6ZS4gIFNldCBzaXplIG9uIHR5cGUgc3RhY2sKLQl0byBzaXplICogMi4KLQotCSogaWVlZS5jIChpZWVlX2VtcHR5X3R5cGUpOiBVc2UgYnVpbHRpbl91bmtub3duLCBub3QgMC4KLQkoaWVlZV92b2lkX3R5cGUpOiBVc2UgYnVpbHRpbl92b2lkLCBub3QgMS4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX3R5KTogSGFuZGxlICdWJyB0eXBlIGNvZGUuCi0JKHBhcnNlX2llZWVfYXRuKTogRG9uJ3QgcmVxdWlyZSB0d28gbnVtYmVycyBmb3IgdHlwZSAxMC4KLQotCSogaWVlZS5jIChwYXJzZV9pZWVlX2JlKTogQWRkIG9uZSB0byBvZmZzZXQgYXQgZW5kIG9mIGZ1bmN0aW9uIG9yCi0JYmxvY2suCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfYmxvY2spOiBBZGQgZmllbGQgc2tpcC4KLQkocGFyc2VfaWVlZV9iYik6IERvbid0IGNhbGwgZGVidWdfcmVjb3JkX2Z1bmN0aW9uIGZvciBfX1hSWUNQUAotCWZ1bmN0aW9uLCBhbmQgc2V0IHNraXAgZmllbGQuCi0JKHBhcnNlX2llZWVfYmUpOiBEb24ndCBjYWxsIGRlYnVnX2VuZF9mdW5jdGlvbiBpZiBza2lwIGlzIHNldC4KLQotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IEFkZCBmaWVsZHMgY3VycmVudF93cml0ZV9saW5lbm8KLQlhbmQgY3VycmVudF93cml0ZV9saW5lbm9faW5kZXguCi0JKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBjdXJyZW50X3dyaXRlX2xpbmVubyBhbmQKLQljdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCBmb3IgZWFjaCB1bml0LiAgQ2FsbAotCWRlYnVnX3dyaXRlX2xpbmVub3MgcmF0aGVyIHRoYW4gd3JpdGluZyBvdXQgdGhlIGxpbmUgbnVtYmVycwotCWRpcmVjdGx5LgotCShkZWJ1Z193cml0ZV9mdW5jdGlvbik6IENhbGwgZGVidWdfd3JpdGVfbGluZW5vcy4KLQkoZGVidWdfd3JpdGVfYmxvY2spOiBMaWtld2lzZS4KLQkoZGVidWdfd3JpdGVfbGluZW5vcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGRlYnVnLmMgKGRlYnVnX3dyaXRlX3R5cGUpOiBGb3IgREVCVUdfS0lORF9GVU5DVElPTiwgcHVzaCByZXR1cm4KLQl0eXBlIGJlZm9yZSBhcmd1bWVudHMuCi0KLU1vbiBNYXIgMTggMTg6MDU6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBBQ19GVU5DX1ZGT1JLLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBkbGx0b29sLmMsIG5sbWNvbnYuYzogSW5jbHVkZSA8dmZvcmsuaD4gaWYgSEFWRV9WRk9SS19IIGlzCi0JZGVmaW5lZC4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9yYW5nZV90eXBlKTogQSBjb21wbGV4IHR5cGUgaXMgZGVmaW5lZCBhcyBhCi0Jc3VicmFuZ2Ugb2YgaXRzZWxmIHdpdGggdGhlIGhpZ2ggYm91bmQgemVyby4KLQkqIGllZWUuYyAoaWVlZV9jb21wbGV4X3R5cGUpOiBEb24ndCBjcmFzaCBvbiBzaXplcyBvZiAxMiBvciAxNi4KLQotVHVlIE1hciAxMiAxMjowOTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYyAoaWVlZV93cml0ZV91bmRlZmluZWRfdGFnKTogU3dpdGNoIHRvIGdsb2JhbF90eXBlcyBldmVuCi0JaWYgaXQgaXMgbm90IGVtcHR5LgotCShpZWVlX3RhZ190eXBlKTogRm9yIGFuIGVudW0sIGxvb2sgdGhyb3VnaCBpbmZvLT5lbnVtcy4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi0JKiBkZWJ1Zy5jIChkZWJ1Z190eXBlX3NhbWVwKTogRG9uJ3QgbG9vcCBlbmRsZXNzbHkgaW4KLQlERUJVR19LSU5EX0VOVU0gY2FzZS4gIEZyb20gRXJpYyBCYXVyIDxlY2JAbmV4ZW4uY29tPi4KLQotTW9uIE1hciAxMSAxMjozNTowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJkZGJnLmMgKHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyk6IENhbGwgc2F2ZV9zdGFiIGZvcgotCWVhY2ggc3RhYiBlbnRyeSwgY2FsbCBzdGFiX2NvbnRleHQgb24gYW4gZXJyb3IsIGFuZCBjYWxsCi0JZnJlZV9zYXZlZF9zdGFicyBiZWZvcmUgcnR1cm5pbmcuCi0JKHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvKTogTGlrZXdpc2UuCi0JKFNBVkVfU1RBQlNfQ09VTlQpOiBEZWZpbmUuCi0JKHN0cnVjdCBzYXZlZF9zdGFiKTogRGVmaW5lLgotCShzYXZlZF9zdGFicywgc2F2ZWRfc3RhYnNfaW5kZXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoc2F2ZV9zdGFiLCBzdGFiX2NvbnRleHQsIGZyZWVfc2F2ZWRfc3RhYnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9zLgotCi0JKiBvYmpkdW1wLmMgKHN0YWJfbmFtZSk6IFJlbW92ZS4KLQkoc3RydWN0IHN0YWJfcHJpbnQpOiBSZW1vdmUuCi0JKHN0YWJfcHJpbnQpOiBSZW1vdmUuCi0JKGR1bXBfc3RhYnMpOiBEb24ndCBpbml0aWFsaXplIHN0YWJfbmFtZS4KLQkocHJpbnRfc2VjdGlvbl9zdGFicyk6IENhbGwgYmZkX2dldF9zdGFiX25hbWUgcmF0aGVyIHRoYW4gdXNpbmcKLQl0aGUgc3RhYl9uYW1lIGFycmF5LgotCi1UdWUgRmViIDI3IDE5OjUyOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHJkYmcuYyAocHJfaW50X2NvbnN0YW50KTogSW5pdGlhbGl6ZSBpbmZvIGNvcnJlY3RseS4KLQkocHJfZmxvYXRfY29uc3RhbnQpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAyNiAxODoxMTozNyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIHRvIGhhbmRsZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCi1TYXQgRmViIDI0IDExOjIxOjQ5IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBTZWFyY2ggJChCRkRMSUIpIGJlZm9yZQotCSQoT1BDT0RFUykuCi0KLVRodSBGZWIgMTUgMTI6NDQ6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHRhbXBlciB3aXRoIExERkxBR1MuICBDYWxsIEFDX1BST0dfQ0MgYmVmb3JlCi0JY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShjaGVjayk6IFVzZSAkKFJQQVRIX0VOVlZBUikgcmF0aGVyIHRoYW4gTERfTElCUkFSWV9QQVRILgotCi0JKiBvYmpjb3B5LmMgKHNtYXJ0X3JlbmFtZSk6IFJhdGhlciB0aGFuIGRvaW5nIGNobW9kIHRoZW4gY2hvd24sIGRvCi0JY2htb2Qgd2l0aG91dCBzZXR1aWQsIHRoZW4gY2hvd24sIHRoZW4gY2htb2Qgd2l0aCBzZXR1aWQuCi0KLVdlZCBGZWIgMTQgMTY6NDY6NDIgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogYXJzdXAuYyAobWFwX292ZXJfbGlzdCk6IFJlaW5kZW50LiAgRG9uJ3QgYXNzdW1lIHRoYXQgdGhlCi0JZnVuY3Rpb24gZG9lcyBub3QgZGVsZXRlIHRoZSBCRkQuCi0JKGFyX2FkZGxpYl9kb2VyKTogRG9uJ3Qgc2V0IHByZXYtPm5leHQgaWYgcHJldiBpcyBOVUxMLgotCi1XZWQgRmViIDE0IDE1OjEyOjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jIChpZWVlX3JlZ25vX3RvX2dlbnJlZyk6IENvbnZlcnQgcmVnaXN0ZXIgbnVtYmVycyBmb3IgbTY4awotCWFuZCBpOTYwLgotCShpZWVlX2dlbnJlZ190b19yZWdubyk6IExpa2V3aXNlLgotCi1Nb24gRmViIDEyIDE0OjE5OjU5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaWVlZS5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byB3cml0ZSBjb2RlIHRvIHB1dCB0eXBlcyBpbiB0aGUKLQlnbG9iYWwgdHlwZSBibG9jayB3aGVuIHBvc3NpYmxlLCB0byBvdXRwdXQgcmFuZ2VzIGZvciBhbGwgbWVtb3J5Ci0Jb2NjdXBpZWQgYnkgdGhlIG1vZHVsZSwgYW5kIHRvIGltcHJvdmUgZWZmaWNpZW5jeS4KLQotCSogZGVidWcuYyAoc3RydWN0IGRlYnVnX2hhbmRsZSk6IFJlbW92ZSBjbGFzc19tYXJrIGZpZWxkLiAgQWRkCi0JaWRfbGlzdCBhbmQgY29tcGFyZV9saXN0IGZpZWxkcy4KLQkoc3RydWN0IGRlYnVnX2NsYXNzX2lkKTogRGVmaW5lLgotCShzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QpOiBEZWZpbmUuCi0JKGRlYnVnX3dyaXRlKTogSW5pdGlhbGl6ZSBpbmZvLT5pZF9saXN0Ci0JKGRlYnVnX3dyaXRlX25hbWUpOiBSZW1vdmUgcmVmZXJlbmNlIHRvIGluZm8tPmNsYXNzX21hcmsuCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBHZXQgaWQgZm9yIGFsbCBzdHJ1Y3RzIGFuZCBjbGFzc2VzLiAgU2ltcGxpZnkKLQl0ZXN0IGZvciB3aGV0aGVyIHN0cnVjdCBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4uCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBHZXQgaWQgZm9yIGFsbCBjbGFzc2VzLiAgU2ltcGxpZnkgdGVzdAotCWZvciB3aGV0aGVyIGNsYXNzIGhhcyBhbHJlYWR5IGJlZW4gd3JpdHRlbi4KLQkoZGVidWdfd3JpdGVfYmxvY2spOiBEb24ndCB3cml0ZSBvdXQgYmxvY2tzIG90aGVyIHRoYW4gdGhlIHRvcAotCWxldmVsIGJsb2NrIGlmIHRoZXkgaGF2ZSBubyBsb2NhbCB2YXJpYWJsZXMuCi0JKGRlYnVnX3NldF9jbGFzc19pZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGRlYnVnX3R5cGVfc2FtZXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkZWJ1Z19jbGFzc190eXBlX3NhbWVwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIHByZGJnLmMgKHByX3N0YXJ0X3N0cnVjdF90eXBlKTogQWx3YXlzIHByaW50IGlkLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX3RhZ190eXBlKTogTGlrZXdpc2UuCi0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IEFkZCBzeW1zIGFuZCBzeW1jb3VudCBmaWVsZHMuCi0JKHN0YXJ0X3N0YWIpOiBBZGQgc3ltcyBhbmQgc3ltY291bnQgcGFyYW1ldGVycy4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShwYXJzZV9zdGFiX3N0cmluZyk6IExvb2sgdXAgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgc3ltYm9sIHRhYmxlCi0JdG8gZ2V0IHRoZSByaWdodCB2YWx1ZS4KLQkqIGJ1ZGJnLmggKHN0YXJ0X3N0YWIpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiByZGRiZy5jIChyZWFkX3NlY3Rpb25fc3RhYnNfZGVidWdnaW5nX2luZm8pOiBBZGQgc3ltcyBhbmQKLQlzeW1jb3VudCBwYXJhbWV0ZXJzLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCi0JKiBzdGFicy5jIChwYXJzZV9zdGFiX2FycmF5X3R5cGUpOiBJZiB0aGUgaW5kZXggdHlwZSBpcyAwLCB1c2UKLQlpbnQuCi0KLVdlZCBGZWIgIDcgMTQ6MTc6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmMgKGllZWVfc3RhcnRfY29tcGlsYXRpb25fdW5pdCk6IENsZWFyIG1vZGlmaWVkIGFuZAotCW1vZGlmaWVkX2FsbG9jIGZpZWxkcyBvZiBpbmZvLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAtLWVuYWJsZS1zaGFyZWQuICBTdWJzdGl0dXRlIG5ldwotCXZhcmlhYmxlcyBCRkRMSUIgYW5kIE9QQ09ERVMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoQkZETElCKTogU2V0IHRvIEBCRkRMSUJALgotCShPUENPREVTKTogU2V0IHRvIEBPUENPREVTQC4KLQotTW9uIEZlYiAgNSAxNjoxODo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KLQlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluIChITERGTEFHUyk6IE5ldyBzdWJzdGl0dXRpb24uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERkxBR1MpOiBOZXcgdmFyaWFibGUuICBNYWtlIGFsbCBsaW5rcyB1c2UKLQkkKEhMREZMQUdTKSBiZWZvcmUgJChDRkxBR1MpIGFuZCAkKExERkxBR1MpLgotCShCRkRMSUJfREVQKTogTmV3IHZhcmlhYmxlLiAgUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgJChCRkQpIGFzCi0JYSBkZXBlbmRlbmN5IHdpdGggJChCRkRMSUJfREVQKS4gIFJlbW92ZSAkKEJGRCkgYXMgYSBkZXBlbmRlbmN5IGlmCi0JdGhlcmUgaXMgYWxzbyBhIGRlcGVuZGVuY3kgb24gJChBRERMX0RFUFMpLgotCShCRkRMSUIpOiBSZW5hbWUgZnJvbSBCRkQ7IGNoYW5nZSBhbGwgdXNlczsgc2V0IHRvIC1MLi4vYmZkIC1sYmZkLgotCShPUENPREVTX0RFUCk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuZHMgb2YgJChPUENPREVTKQotCWFzIGEgZGVwZW5kZW5jeSB3aXRoICQoT1BDT0RFU19ERVApLgotCShPUENPREVTKTogU2V0IHRvIC1MLi4vb3Bjb2RlcyAtbG9wY29kZXMuCi0JKEFERExfREVQUyk6IE5ldyB2YXJpYWJsZS4gIFJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mCi0JJChBRERMX0xJQlMpIGFzIGEgZGVwZW5kZW5jeSB3aXRoICQoQURETF9ERVBTKS4KLQkoY2hlY2spOiBTZXQgTERfTElCUkFSWV9QQVRIIGluIHRoZSBlbnZpcm9ubWVudC4KLQkoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEJGRCBjb25maWd1cmUuaG9zdCBhbmQgY29uZmlnLmJmZC4KLQotRnJpIEZlYiAgMiAxNzowMjo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jOiAjaW5jbHVkZSBzdGRhcmcuaCBvciB2YXJhcmdzLmguCi0JKG9iamR1bXBfcHJpbnRfdmFsdWUpOiBDaGFuZ2UgRklMRSogYXJnIHRvIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKi4KLQlBbGwgY2FsbGVycyB1cGRhdGVkLiAgVXNlIGZwcmludGZfZnVuYy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQ29uc2lzdGVudGx5IHVzZSBmcHJpbnRmX2Z1bmMuCi0JKG9iamR1bXBfc3ByaW50Zik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFByaW50IGluc24gaW50byBhIGJ1ZmZlciwgcHJpbnQgcmF3IGluc24gb3Vyc2VsdmVzLAotCXRoZW4gcHJpbnQgaW5zbiBtbmVtb25pYy4KLQotRnJpIEZlYiAgMiAxNjo0ODo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAgMSAwOTozODoxOCAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMy02XTg2LSotd2luMzIpOiBCZWNvbWVzIGlbMy02XTg2LSotY3lnd2luMzIuCi0JKHBvd2VycGMqLSotY3lnd2luMzIpOiBOZXcuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1XZWQgSmFuIDMxIDEzOjIyOjAzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLjEuCi0KLU1vbiBKYW4gMjkgMTc6MzY6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEggSiBMdSA8aGpsQHpvb20uY29tPjoKLQkqIG9iamNvcHkuYyAocmVtb3ZlX2xlYWRpbmdfY2hhcik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSKTogRGVmaW5lLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXJlbW92ZS1sZWFkaW5nLWNoYXIuCi0JKGZpbHRlcl9zeW1ib2xzKTogSWYgcmVtb3ZlX2xlYWRpbmdfY2hhciwgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQlvZiBhIGdsb2JhbCBzeW1ib2wgbWF0Y2hlcyB0aGUgc3ltYm9sIGxlYWRpbmcgY2hhciBvZiB0aGUgQkZELAotCXJlbW92ZSB0aGUgZmlyc3QgY2hhcmFjdGVyLgotCShjb3B5X29iamVjdCk6IEZpbHRlciB0aGUgc3ltYm9scyBpZiByZW1vdmVfbGVhZGluZ19jaGFyIGlzIHNldC4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tcmVtb3ZlLWxlYWRpbmctY2hhci4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1yZW1vdmUtbGVhZGluZy1jaGFyLgotCi1TYXQgSmFuIDI3IDE1OjQwOjEzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogQWRkIHByb3RvdHlwZSB0byBhdm9pZCBjb21waWxlciB3YXJuaW5nIG9uCi0JU3VuT1MuCi0KLUZyaSBKYW4gMjYgMTE6NTM6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy50ZXhpIChubSk6IEltcHJvdmUgZG9jdW1lbnRhdGlvbiBvbiBzeW1ib2wgdHlwZXMuCi0JKG9iamR1bXApOiBSZWZlcmVuY2UgdGhlIHN0YWJzIG1hbnVhbCBmcm9tIHRoZSBkaXNjdXNzaW9uIG9mIHRoZQotCS0tc3RhYnMgb3B0aW9uLgotCi1UaHUgSmFuIDI1IDExOjIxOjQ2IDE5OTYgIFJheW1vbmQgSm91ICA8cmpvdUBtZXhpY2FuLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIGEgInN0YW1wcyIgdGFyZ2V0LgotCi1UaHUgSmFuIDI1IDEzOjUxOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMsIGR1bXBfc2VjdGlvbl9oZWFkZXIpOiBDaGFuZ2Ugb2JqZHVtcCAtaAotCW91dHB1dCB0byBiZSBzaW1wbGVyIGFuZCB0byBpbmNsdWRlIHNlY3Rpb24gZmlsZSBvZmZzZXRzLgotCi1XZWQgSmFuIDI0IDEyOjA2OjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAocGFyc2Vfc3RhYl9tZW1iZXJzKTogRG9uJ3QgYWRqdXN0IHZvZmZzZXQuCi0KLQkqIGllZWUuYyAoaWVlZV9yZWFkX2N4eF9jbGFzcyk6IERvbid0IG11bHRpcGx5IHZvZmZzZXQgYnkgNC4KLQkoc3RydWN0IGllZWVfd3JpdGVfdHlwZSk6IEFkZCBuYW1lIGZpZWxkLgotCShzdHJ1Y3QgaWVlZV90eXBlX2NsYXNzKTogUmVtb3ZlIG5hbWUgZmllbGQuICBDaGFuZ2UgYWxsIHVzZXMgdG8KLQl1c2UgbmV3IG5hbWUgZmllbGQgaW4gdHlwZSBpbnN0ZWFkLgotCShzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSk6IEluaXRpYWxpemUgbmFtZSBmaWVsZCBvZiB0eXBlLgotCShpZWVlX3N0YXJ0X2NsYXNzX3R5cGUpOiBEb24ndCBpbml0aWFsaXplIGNsYXNzZGVmIGVudHJ5IG9mIHRhZy4KLQkoaWVlZV9jbGFzc19tZXRob2RfdmFyKTogRG9uJ3QgYWRqdXN0IHZvZmZzZXQuCi0JKGllZWVfZW5kX2NsYXNzX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV90YWdfdHlwZSk6IEluaXRpYWxpemUgbmV3IG5hbWUgZmllbGQgb2YgdHlwZS4KLQkoaWVlZV90eXBkZWYpOiBTZXQgbmFtZSBhZnRlciBjb3B5aW5nIGluIHR5cGUgaW5mb3JtYXRpb24uCi0KLQkqIGRlYnVnLmMgKFZPRkZTRVRfU1RBVElDX01FVEhPRCk6IERlZmluZSBhcyAtMSwgbm90IDEuCi0KLQkqIGllZWUuYyAoc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSk6IERlZmluZS4KLQkoc3RydWN0IGllZWVfaGFuZGxlKTogQWRkIG1vZGlmaWVkIGFuZCBtb2RpZmllZF9hbGxvYyBmaWVsZHMuCi0JKGllZWVfZ2V0X21vZGlmaWVkX2luZm8pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3BvaW50ZXJfdHlwZSk6IENhY2hlIHR5cGUgaW5kZXguCi0JKGllZWVfY29uc3RfdHlwZSk6IExpa2V3aXNlLgotCShpZWVlX3ZvbGF0aWxlX3R5cGUpOiBMaWtld2lzZS4KLQotCSogaWVlZS5jIChpZWVlX2RlZmluZV9uYW1lZF90eXBlKTogV2hlbiBjcmVhdGluZyBhIHRhZyBmb3IgYW4KLQlhbm9ueW1vdXMgc3RydWN0LCBjb3B5IHRoZSBuYW1lIGludG8gbWVtb3J5LgotCShpZWVlX3RhZ190eXBlKTogTGlrZXdpc2UuCi0JKiBkZWJ1Zy5jIChkZWJ1Z193cml0ZV90eXBlKTogT25seSBjaGVjayBhbmQgc2V0IGlkIGZpZWxkIGZvciBhbgotCXVubmFtZWQgb2JqZWN0LgotCShkZWJ1Z193cml0ZV9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0KLQkqIGllZWUuYzogVmFyaW91cyBjaGFuZ2VzIHRvIHdyaXRlIG91dCB0eXBlcyBmb3IgZnVuY3Rpb25zIGFuZAotCXJlZmVyZW5jZXMsIGFuZCB0byBub3Qgd3JpdGUgb3V0IHVubmVjZXNzYXJ5IGZ1bmN0aW9uIHR5cGVzLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX3Zhcik6IFJlbW92ZSB2YXJpYWJsZSBmaWVsZC4gIEFkZCBraW5kCi0JZmllbGQsIGFuZCBkZWZpbmUgc29tZSBlbnVtIGNvbnN0YW50cyBmb3IgaXQuCi0JKHBhcnNlX2llZWVfdHkpOiBTZXQga2luZCBmaWVsZCBvZiB2YXJpYWJsZSBmb3IgJ3gnIGFuZCAnWCcgdHlwZXMuCi0JKHBhcnNlX2llZWVfYXRuKTogTWFrZSBhbiBpbmRpcmVjdCBzbG90IGZvciBhbiBleHRlcm5hbCB2YXJpYWJsZSwKLQlhbHRob3VnaCB3ZSBvdGhlcndpc2UgZG9uJ3QgcmVjb3JkIGl0LiAgU2V0IGtpbmQgZmllbGQgcmF0aGVyIHRoYW4KLQl2YXJpYWJsZSBmaWVsZCBvZiBwdmFyLgotCShpZWVlX3JlYWRfY3h4X2NsYXNzKTogVHJ5IHRvIGdldCB0aGUgdHlwZSBvZiBhIHN0YXRpYyBtZW1iZXIuCi0JKGllZWVfcmVhZF9yZWZlcmVuY2UpOiBDaGVjayBraW5kIGZpZWxkIHJhdGhlciB0aGFuIHZhcmlhYmxlCi0JZmllbGQuCi0KLVR1ZSBKYW4gMjMgMTU6NTQ6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byBoYW5kbGUgcmVhZGluZyBDKysgcmVmZXJlbmNlIHR5cGUKLQlpbmZvcm1hdGlvbi4KLQotCSogZGVidWcuaCAoZW51bSBkZWJ1Z192YXJfa2luZCk6IEFkZCBERUJVR19WQVJfSUxMRUdBTC4KLQkoZW51bSBkZWJ1Z19wYXJtX2tpbmQpOiBBZGQgREVCVUdfUEFSTV9JTExFR0FMLgotCSogZGVidWcuYyAoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IEhhbmRsZSBERUJVR19LSU5EX0ZVTkNUSU9OLgotCi0JKiBpZWVlLmM6IFZhcmlvdXMgY2hhbmdlcyB0byB3cml0ZSBvdXQgZGVmaW5pdGlvbnMgb2YgQysrIGNsYXNzZXMuCi0KLQkqIGRlYnVnLmMgKGRlYnVnX2FwcGVuZF9maWxlbmFtZSk6IFJlbW92ZS4KLQkqIGRlYnVnLmggKGRlYnVnX2FwcGVuZF9maWxlbmFtZSk6IERvbid0IGRlY2xhcmUuCi0KLQkqIHN0YWJzLmMgKHN0cnVjdCBzdGFiX2hhbmRsZSk6IFJlbW92ZSBsYXN0X3R5cGUgZmllbGQuICBBZGQKLQlzb19zdHJpbmcgYW5kIHNvX3ZhbHVlIGZpZWxkcy4KLQkoZmluaXNoX3N0YWIpOiBDYWxsIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgYmVmb3JlIGNhbGxpbmcKLQlkZWJ1Z19lbmRfZnVuY3Rpb24uICBEb24ndCB3YXJuIGFib3V0IHBlbmRpbmcgdmFyaWFibGVzLgotCShwYXJzZV9zdGFiKTogQWNjdW11bGF0ZSBOX1NPIHN0cmluZ3MgdW50aWwgYSBub24gTl9TTyBzeW1ib2wgaXMKLQlzZWVuLCByYXRoZXIgdGhhbiBjYWxsaW5nIGRlYnVnX2FwcGVuZF9maWxlbmFtZS4gIENhbGwKLQlzdGFiX2VtaXRfcGVuZGluZ192YXJzIGJlZm9yZSBjYWxsaW5nIGRlYnVnX2VuZF9mdW5jdGlvbi4gIERvbid0Ci0Jc2V0IGluZm8tPmxhc3RfdHlwZS4KLQotVHVlIEphbiAyMyAwOTo1Mzo1NCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHVua25vd24gZW5kaWFubmVzcy4KLQlQYXNzIGZwcmludGYgdG8gSU5JVF9ESVNBU1NFTUJMRV9JTkZPLgotCi1Nb24gSmFuIDIyIDE2OjQ2OjQzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JQWRkIG5ldyBvcHRpb24gLS1zaG93LXJhdy1pbnNuLgotCSogb2JqZHVtcC5jIChzaG93X3Jhd19pbnNuKTogTmV3IGdsb2JhbC4KLQkodXNhZ2UpOiBVcGRhdGUuCi0JKGxvbmdfb3B0aW9ucyk6IFVwZGF0ZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBkaXNhc21faW5mby5mbGFncyBpZiAtLXNob3ctcmF3LWluc24uCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBuZXcgYXJjaCxtYWNoLGVuZGlhbiBmaWVsZHMgaW4KLQlkaXNhc21faW5mby4KLQotTW9uIEphbiAyMiAxOToyOTozNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGllZWUuYzogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gcGFzcyBhIHNpbmdsZSBpbmZvIGFyZ3VtZW50IGFyb3VuZAotCWluIHRoZSByZWFkaW5nIHJvdXRpbmVzLCByYXRoZXIgdGhhbiBzZXZlcmFsIGFyZ3VtZW50cy4gIEFkZCBjb2RlCi0JdG8gcmVhZCBDKysgZGVidWdnaW5nIHJlY29yZHMuCi0KLQkqIGRlYnVnLmggKGRlYnVnX2dldF90eXBlX3NpemUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfbmFtZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF9iaXRwb3MpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZF92aXNpYmlsaXR5KTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lKTogRGVjbGFyZS4KLQkqIGRlYnVnLmMgKGRlYnVnX2dldF9yZWFsX3R5cGUpOiBIYW5kbGUgREVCVUdfS0lORF9UQUdHRUQuCi0JKGRlYnVnX2dldF90eXBlX3NpemUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfYml0cG9zKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfYml0c2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX2dldF9maWVsZF9waHlzbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IE1ha2Ugc3VyZSB3ZSBwYXNzIHRoZSByZWFsIGtpbmQsIG5vdCBJTkRJUkVDVCwKLQl0byB0YWdfdHlwZS4gIFBhc3MgdGhlIG5hbWUgcmVjdXJzaXZlbHkgZm9yIElORElSRUNULgotCi1GcmkgSmFuIDE5IDEyOjMxOjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVidWcuaCAoc3RydWN0IGRlYnVnX3dyaXRlX2Zucyk6IFJlbW92ZSBlbGxpcHNpc190eXBlLiAgQWRkIGludAotCWFuZCBib29sZWFuIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25fdHlwZS4gIEFkZCBib29sZWFuIHBhcmFtZXRlciB0bwotCW1ldGhvZF90eXBlLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBEb24ndCBkZWNsYXJlLgotCShkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUpOiBBZGQgZGVidWdfdHlwZSAqIGFuZCBib29sZWFuCi0JcGFyYW1ldGVycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkoZGVidWdfbWFrZV9tZXRob2RfdHlwZSk6IEFkZCBib29sZWFuIHBhcmFtZXRlci4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogQWRkIGJvb2xlYW4gKiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkoZGVidWdfZ2V0X3RhcmdldF90eXBlKTogRGVjbGFyZS4KLQkqIGRlYnVnLmMgKHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlKTogQWRkIGZpZWxkcyBhcmdfdHlwZXMgYW5kCi0JdmFyYXJncy4KLQkoc3RydWN0IGRlYnVnX21ldGhvZF90eXBlKTogQWRkIGZpZWxkIHZhcmFyZ3MuCi0JKGRlYnVnX2VsbGlwc2lzX3R5cGUsIEVMTElQU0lTX1ApOiBSZW1vdmUuCi0JKGRlYnVnX21ha2VfZWxsaXBzaXNfdHlwZSk6IFJlbW92ZS4KLQkoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ190eXBlcyBhbmQgdmFyYXJncyBwYXJhbWV0ZXJzLgotCShkZWJ1Z19tYWtlX21ldGhvZF90eXBlKTogQWRkIHZhcmFyZ3MgcGFyYW1ldGVyLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogQWRkIHB2YXJhcmdzIHBhcmFtZXRlci4KLQkoZGVidWdfZ2V0X3RhcmdldF90eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z193cml0ZV90eXBlKTogSW4gY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OLCBwdXNoIGFyZ3VtZW50Ci0JdHlwZXMgYW5kIHBhc3MgY291bnQgdG8gZnVuY3Rpb25fdHlwZS4gIEluIERFQlVHX0tJTkRfTUVUSE9ELCB1c2UKLQlhIHNpZ25lZCBpbnQgZm9yIHRoZSBjb3VudCwgZG9uJ3QgY2FsbCBlbGxpcHNpc190eXBlLCBhbmQgcGFzcwotCXZhcmFyZ3MgdG8gbWV0aG9kX3R5cGUuCi0JKiBzdGFicy5jIChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvKTogQWRkIHZhcmFyZ3MgZmllbGQuCi0JKHN0YWJfZGVtYW5nbGVfYXJndHlwZXMpOiBBZGQgcHZhcmFyZ3MgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHN0YWJfZGVtYW5nbGVfYXJncyk6IExpa2V3aXNlLgotCShzdGFiX2RlbWFuZ2xlX3R5cGUpOiBJbiBjYXNlICdGJywgcGljayB1cCBhcmd1bWVudCB0eXBlcy4KLQkqIHByZGJnLmMgKHByX2VsbGlwc2lzX3R5cGUpOiBSZW1vdmUuCi0JKHByX2Z1bmN0aW9uX3R5cGUpOiBBZGQgYXJnY291bnQgYW5kIHZhcmFyZ3MgcGFyYW1ldGVycy4KLQkocHJfbWV0aG9kX3R5cGUpOiBBZGQgdmFyYXJncyBwYXJhbWV0ZXIuCi0JKiBpZWVlLmMgKGllZWVfZWxsaXBzaXNfdHlwZSk6IFJlbW92ZS4KLQkoaWVlZV9mdW5jdGlvbl90eXBlKTogQWRkIGFyZ2NvdW50IGFuZCB2YXJhcmdzIHBhcmFtZXRlcnMuCi0JKGllZWVfbWV0aG9kX3R5cGUpOiBBZGQgdmFyYXJncyBwYXJhbWV0ZXIuICBSZW1vdmUgbW9zdCBvZgotCWZ1bmN0aW9uIGJvZHksIGFuZCBqdXN0IGNhbGwgaWVlZV9mdW5jdGlvbl90eXBlLgotCi0JKiBzdGFicy5jOiBJbmNsdWRlICJkZW1hbmdsZS5oIi4gIEFkZGVkIHNldmVyYWwgbmV3IHN0YXRpYwotCWZ1bmN0aW9ucyBub3QgbGlzdGVkIGJlbG93IHRvIGRlbWFuZ2xlIGFyZ3VtZW50IHR5cGVzOyB0aGV5IGFyZQotCWFsbCBjYWxsZWQgdmlhIHN0YWJfZGVtYW5nbGVfYXJndHlwZXMuCi0JKGZpbmlzaF9zdGFiKTogSWYgdGhlIGtpbmQgb2YgYW4gdW5kZWZpbmVkIHRhZyBpcwotCURFQlVHX0tJTkRfSUxMRUdBTCwgdXNlIERFQlVHX0tJTkRfU1RSVUNUIGluc3RlYWQuICBXYXJuIGlmIHRoZXJlCi0JYXJlIGFueSBwZW5kaW5nIHZhcmlhYmxlLgotCShwYXJzZV9zdGFiKTogRG9uJ3QgY2xvc2UgdGhlIGZ1bmN0aW9uIHdoZW4gdGhlIGJsb2NrIGRlcHRoIGdvZXMKLQl0byB6ZXJvLiAgUGFzcyB2YWx1ZSB0byBkZWJ1Z19lbmRfZnVuY3Rpb24uCi0JKHBhcnNlX3N0YWJfc3RyaW5nKTogSW4gY2FzZSAnVCcsIHBhc3MgdGhlIG5hbWUgdG8KLQlwYXJzZV9zdGFiX3R5cGUuCi0JKHBhcnNlX3N0YWJfdHlwZSk6IEluIGNhc2UgJ3gnLCB1c2Ugc3RhYl9maW5kX3RhZ2dlZF90eXBlLiAgSW4KLQljYXNlICcjJywgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIHZhcmlhYmxlIG51bWJlcnMgb2YgYXJndW1lbnRzLgotCShwYXJzZV9zdGFiX3N0cnVjdF90eXBlKTogQWRkIHRhZ25hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKHBhcnNlX3N0YWJfbWVtYmVycyk6IEFkZCB0YWduYW1lIGFuZCB0eXBlbnVtcyBwYXJhbWV0ZXJzLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuICBJZiB0aGUgdHlwZSBvZiBhIG1ldGhvZCBpcyBhIHN0dWIsIGNhbGwKLQlwYXJzZV9zdGFiX2FyZ3R5cGVzIHRvIGRlbWFuZ2xlIHRoZSBhcmd1bWVudCB0eXBlcyBhbmQgZ2V0IHRoZQotCXBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgotCShwYXJzZV9zdGFiX2FyZ3R5cGVzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RhYl9yZWNvcmRfdmFyaWFibGUpOiBGb3IgYSBERUJVR19HTE9CQUwgb3IgREVCVUdfU1RBVElDCi0JdmFyaWFibGUsIGNhbGwgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIGltbWVkaWF0ZWx5LgotCShzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBkZWJ1Zy5oIChlbnVtIGRlYnVnX3R5cGVfa2luZCk6IEFkZCBERUJVR19LSU5EX0lMTEVHQUwuCi0JKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBBZGQgZmllbGQgZWxsaXBzaXNfdHlwZS4gIEFkZCBpZAotCXBhcmFtZXRlciB0byBzdGFydF9zdHJ1Y3RfdHlwZSwgc3RhcnRfY2xhc3NfdHlwZSwgYW5kIHRhZ190eXBlLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBEZWNsYXJlLgotCShkZWJ1Z19maW5kX25hbWVkX3R5cGUpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfdHlwZV9raW5kKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X3JldHVybl90eXBlKTogRGVjbGFyZS4KLQkoZGVidWdfZ2V0X3BhcmFtZXRlcl90eXBlcyk6IERlY2xhcmUuCi0JKGRlYnVnX2dldF9maWVsZHMpOiBEZWNsYXJlLgotCShkZWJ1Z19nZXRfZmllbGRfdHlwZSk6IERlY2xhcmUuCi0JKiBkZWJ1Zy5jIChzdHJ1Y3QgZGVidWdfaGFuZGxlKTogQWRkIGZpZWxkcyBjbGFzc19pZCBhbmQgYmFzZV9pZC4KLQkoc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUpOiBBZGQgZmllbGQgaWQuCi0JKHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBhcmd0eXBlcyB0byBwaHlzbmFtZS4KLQlDaGFuZ2UgYWxsIHVzZXMuCi0JKGRlYnVnX2VsbGlwc2lzX3R5cGUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShFTExJUFNJU19QKTogTmV3IG1hY3JvLgotCShkZWJ1Z19tYWtlX2VsbGlwc2lzX3R5cGUpOiBOZXcgZnVuY3Rpb24uCi0JKGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQpOiBSZW5hbWUgYXJndHlwZXMgdG8gcGh5c25hbWUuCi0JKGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50KTogTGlrZXdpc2UuCi0JKGRlYnVnX25hbWVfdHlwZSk6IEFsd2F5cyBwdXQgdHlwZXMgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCi0JKGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZmluZF90YWdnZWRfdHlwZSk6IFRyZWF0IERFQlVHX0tJTkRfSUxMRUdBTCBzcGVjaWFsbHksCi0JcmF0aGVyIHRoYW4gREVCVUdfS0lORF9WT0lELgotCShkZWJ1Z19nZXRfcmVhbF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X3R5cGVfa2luZCk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfZ2V0X3JldHVybl90eXBlKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRzKTogTmV3IGZ1bmN0aW9uLgotCShkZWJ1Z19nZXRfZmllbGRfdHlwZSk6IE5ldyBmdW5jdGlvbi4KLQkoZGVidWdfd3JpdGUpOiBJbml0aWFsaXplIGJhc2VfaWQuCi0JKGRlYnVnX3dyaXRlX3R5cGUpOiBQYXNzIG5ldyBpZCBhcmd1bWVudCB0byB0YWdfdHlwZS4gIEhhbmRsZQotCURFQlVHX0tJTkRfSUxMRUdBTC4gIFVzZSBpZCBmb3IJREVCVUdfS0lORF9TVFJVQ1QgYW5kCi0JREVCVUdfS0lORF9VTklPTi4gIEhhbmRsZSBlbGxpcHNpcyBmb3IgbWV0aG9kIGFyZ3VtZW50cy4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IERvbid0IGRlcmVmZXJlbmNlIGtjbGFzcyBpZiBpdCBpcyBOVUxMLgotCVVzZSBpZC4KLQkqIHByZGJnLmMgKHByX2Zucyk6IEFkZCBwcl9lbGxpcHNpc190eXBlLgotCShwcl9lbGxpcHNpc190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJfcG9pbnRlcl90eXBlKTogSWYgdGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXksIHBhcmVudGhlc2l6ZQotCWl0IGNvcnJlY3RseS4KLQkocHJfc3RhcnRfc3RydWN0X3R5cGUpOiBBZGQgaWQgcGFyYW1ldGVyLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX3RhZ190eXBlKTogTGlrZXdpc2UuCi0JKHByX2ZpeF92aXNpYmlsaXR5KTogQWRkIHRoZSB2aXNpYmlsaXR5IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLAotCW5vdCB0aGUgc2Vjb25kIGVsZW1lbnQgb24gdGhlIHN0YWNrLgotCShwcl9zdHJ1Y3RfZmllbGQpOiBQb3AgdGhlIHN0YWNrIGJlZm9yZSBjYWxsaW5nIHByX2ZpeF92aXNpYmlsaXR5LgotCShwcl9jbGFzc19zdGF0aWNfbWVtYmVyKTogTGlrZXdpc2UuCi0JKHByX2NsYXNzX3N0YXJ0X21ldGhvZCk6IERvbid0IHB1c2ggYSB0eXBlLCBqdXN0IHNldCB0aGUgbWV0aG9kCi0JbmFtZSBpbiB0aGUgdHlwZSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4KLQkocHJfY2xhc3NfZW5kX21ldGhvZCk6IERvbid0IHBvcCB0aGUgc3RhY2suCi0JKHByX2NsYXNzX21ldGhvZF92YXJpYW50KTogUmVuYW1lIGFyZ3R5cGVzIHBhcmFtZXRlciB0byBwaHlzbmFtZS4KLQlBcHBlbmQgY29uc3QgYW5kIHZvbGF0aWxlIHJhdGhlciB0aGFuIHByZXBlbmRpbmcgdGhlbS4gIEFkZCBhCi0Jc3BhY2UgYWZ0ZXIgdGhlIHBoeXNuYW1lLgotCShwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQpOiBMaWtld2lzZS4KLQkqIGllZWUuYyAoaWVlZV9mbnMpOiBBZGQgaWVlZV9lbGxpcHNpc190eXBlLgotCShpZWVlX2RlZmluZV9uYW1lZF90eXBlKTogVXNlIERFQlVHX0tJTkRfSUxMRUdBTCByYXRoZXIgdGhhbgotCURFQlVHX0tJTkRfVk9JRC4KLQkod3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyk6IExpa2V3aXNlLgotCShpZWVlX3R5cGRlZik6IExpa2V3aXNlLgotCShpZWVlX2VsbGlwc2lzX3R5cGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpZWVlX3N0YXJ0X3N0cnVjdF90eXBlKTogQWRkIGlkIHBhcmFtZXRlci4KLQkoaWVlZV9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKGllZWVfdGFnX3R5cGUpOiBMaWtld2lzZS4KLQkoaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudCk6IFJlbmFtZSBuYW1lIHRvIHBoeXNuYW1lLgotCShpZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCk6IExpa2V3aXNlLgotCi0JKiBNYWtlZmlsZS5pbiAoREVCVUdfT0JKUyk6IFJlbW92ZSBwcmRiZy5vLgotCSgkKE9CSkRVTVBfUFJPRykpOiBEZXBlbmQgdXBvbiwgYW5kIGxpbmsgYWdhaW5zdCwgcHJkYmcuby4KLQotVGh1IEphbiAxOCAxNzozNTowNiAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtYWtlX3RhaWwpOiBDaGFuZ2VkIHRoZSBvcmRlciBvZiB0aGUgc2VjdGlvbnMgdG8gYXZvaWQKLQlhbiBhbGlnbm1lbnQgcHJvYmxlbS4KLQotV2VkIEphbiAxNyAxNDoyMzowMCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl9kdSk6IFNldCBkdS5zdGFja2ZybXQgdG8gMC4KLQkod3JfdW4sIHdyX3NjKTogRW1pdCBhbGwgc2VjdGlvbnMsIGV2ZW4gdGhvc2Ugd2l0aCAwIHNpemUuCi0KLVR1ZSBKYW4gMTYgMTY6MTU6NDkgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzcmNvbnYuYyAod3JfaGQpOiBTcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IHdhcyBiZWluZwotCXN0b3JlZCBpbiBzZWdtZW50IGlkZW50aWZpZXIgZmllbGQuCi0KLVR1ZSBKYW4gMTYgMTI6MDc6MjUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluIChCVUlMRF9OTE1DT05WLCBCVUlMRF9TUkNPTlYsIFNZU0lORk9fUFJPRywKLQlCVUlMRF9ETExUT09MKTogUHV0IGRlZmluaXRpb25zIGZvciB0aGVzZSBpbnRvIG1ha2VmaWxlIHdoZW4KLQljb25maWd1cmluZywgaW5zdGVhZCBvZiBhbHdheXMgY2xlYXJpbmcgaW4gbXB3LW1ha2Uuc2VkLgotCSogbXB3LW1ha2Uuc2VkOiBFZGl0IG91dCBhbnkgaG9zdF9hbGlhcyBvciB0YXJnZXRfYWxpYXMgc2V0dGluZ3MsCi0JZml4IHBhdGhuYW1lIHRvIEJGRCBpbnRlcm5hbCBpbmNsdWRlIGZpbGVzLCByZW1vdmUgZGVwZW5kZW5jeQotCWNhbGN1bGF0aW9uIHJ1bGVzLgotCi1UaHUgSmFuIDExIDE3OjMxOjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogQWRkIG5ldyBzZWN0aW9uIGZsYWdzCi0JU0VDX3tFWENMVURFLFNPUlRfRU5UUklFU30uCi0KLVRodSBKYW4gMTEgMTE6NDU6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogTlVMTCB0ZXJtaW5hdGUgdGhlIG91dHB1dCBzeW1ib2xzLgotCShjb3B5X29iamVjdCk6IEFsbG9jYXRlIHNwYWNlIGZvciBhIHBvc3NpYmxlIGV4dHJhIE5VTEwgcG9pbnRlci4KLQotCSogZGVidWcuYyAoZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUpOiBNYWtlIHN1cmUgd2UgYXJlCi0JZ2l2ZW4gYSBraW5kIG9mIHR5cGUgd2UgY2FuIGhhbmRsZS4KLQkoZGVidWdfd3JpdGVfdHlwZSk6IEhhbmRsZSB1bmRlZmluZWQgZW51bXMgYW5kIHN0cnVjdHMuCi0JKGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUpOiBIYW5kbGUgdW5kZWZpbmVkIGNsYXNzZXMuCi0JKiBwcmRiZy5jIChwcl9lbnVtX3R5cGUpOiBIYW5kbGUgYW4gdW5kZWZpbmVkIGVudW0uCi0JKiBpZWVlLmMgKGllZWVfZW51bV90eXBlKTogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTAgMTU6MzM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCBkZXBlbmRlbmNpZXMuCi0JKEFMTE9DQSwgTUFMTE9DKTogUmVtb3ZlIHZhcmlhYmxlcy4KLQkoQURETF9MSUJTKTogUmVtb3ZlICQoTUFMTE9DKSBmcm9tIGRlZmluaXRpb24uCi0JKiBhbGxvY2EuYywgZ21hbGxvYy5jOiBSZW1vdmUuCi0KLU1vbiBKYW4gIDggMTg6MDI6MjkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IEFkZCBnbG9iYWwgZnVuY3Rpb24gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyBhbmQgYQotCWJ1bmNoIG9mIHN0YXRpYyBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgdXNlZCB0byB3cml0ZSBvdXQgSUVFRQotCWRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkqIGJ1ZGJnLmggKHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8pOiBEZWNsYXJlLgotCi0JKiBpZWVlLmMgKHN0cnVjdCBpZWVlX3R5cGUpOiBBZGQgcHNsb3QgZmllbGQuCi0JKGVudW0gYnVpbHRpbl90eXBlcyk6IERlZmluZS4KLQkoaWVlZV9idWlsdGluX3R5cGUpOiBGb3IgYSBwb2ludGVyLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuYW1lZAotCXR5cGUuICBVc2UgZW51bSB2YWx1ZXMgcmF0aGVyIHRoYW4gbnVtYmVycy4KLQkoaWVlZV9hbGxvY190eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaWVlZV9yZWFkX3R5cGVfaW5kZXgpOiBVc2UgaWVlZV9hbGxvY190eXBlLgotCShwYXJzZV9pZWVlX2JiKTogTGlrZXdpc2UuCi0JKHBhcnNlX2llZWVfdHkpOiBMaWtld2lzZS4gIFVzZSBpZWVlX2J1aWx0aW5fdHlwZSBmb3IgYXJyYXkgcmFuZ2UsCi0JcmF0aGVyIHRoYW4gbWFraW5nIGEgbmV3IGludGVnZXIgdHlwZS4gIFN0b3JlIHRoZSBuZXcgdHlwZSBpbiB0aGUKLQlzbG90LCBpZiB0aGVyZSBpcyBvbmUuCi0JKHBhcnNlX2llZWVfYXRuKTogVHJlYXQgQVROMTAgYXMgZGVmaW5pbmcgYSByZWdpc3RlciB2YXJpYWJsZS4KLQkoaWVlZV9yZWdub190b19nZW5yZWcpOiBSZW5hbWUgZnJvbSBpZWVlX3JlZ25vX3RvX2dlbi4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShpZWVlX2dlbnJlZ190b19yZWdubyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIHN0YWJzLmMgKHBhcnNlX3N0YWJfdHlwZSk6IEFkZCBuZXcgdHlwZW5hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuCi0JKHBhcnNlX3N0YWJfcmFuZ2VfdHlwZSk6IEFkZCBuZXcgdHlwZW5hbWUgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0KLQkqIGRlYnVnLmggKHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMpOiBBZGQgdGFnIHBhcmFtZXRlciB0bwotCWVudW1fdHlwZSwgc3RhcnRfc3RydWN0X3R5cGUsIGFuZCBzdGFydF9jbGFzc190eXBlLgotCSogZGVidWcuYyAoZGVidWdfd3JpdGVfdHlwZSk6IFBhc3MgYW55IHRhZyBuYW1lIHRvCi0Jc3RhcnRfc3RydWN0X3R5cGUsIGRlYnVnX3dyaXRlX2NsYXNzX3R5cGUsIGFuZCBlbnVtX3R5cGUuICBJZgotCURFQlVHX0tJTkRfVEFHR0VELCBwYXNzIHRoZSBuYW1lIGluIHRoZSByZWN1cnNpdmUgY2FsbC4KLQkoZGVidWdfd3JpdGVfY2xhc3NfdHlwZSk6IEFjY2VwdCBhIG5ldyB0YWcgcGFyYW1ldGVyLCBhbmQgcGFzcyBpdAotCXRvIHN0YXJ0X2NsYXNzX3R5cGUuCi0JKiBwcmRiZy5jIChwb3BfdHlwZSk6IERvbid0IHJlbW92ZSAnKycgY2hhcmFjdGVyLgotCShwcl9lbnVtX3R5cGUpOiBBY2NlcHQgYW5kIHVzZSB0YWcgcGFyYW1ldGVyLgotCShwcl9zdGFydF9zdHJ1Y3RfdHlwZSk6IExpa2V3aXNlLgotCShwcl9zdGFydF9jbGFzc190eXBlKTogTGlrZXdpc2UuCi0JKHByX2NsYXNzX2Jhc2VjbGFzcyk6IEFkanVzdCBhbGdvcml0aG0gdXNlZCB0byBmaW5kIHdoZXJlIHRvIHB1dAotCXRoZSBiYXNlY2xhc3MgbmFtZS4KLQkocHJfdGFnKTogRG9uJ3QgYm90aGVyIHRvIGluc2VydCB0aGUgdGFnIG5hbWUuCi0KLQkqIG9iamNvcHkuYzogSW5jbHVkZSBidWRiZy5oLgotCShjb252ZXJ0X2RlYnVnZ2luZyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKE9QVElPTl9ERUJVR0dJTkcpOiBEZWZpbmUuCi0JKGNvcHlfb3B0aW9ucyk6IEFkZCAiZGVidWdnaW5nIi4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1kZWJ1Z2dpbmcuCi0JKGlzX3N0cmlwX3NlY3Rpb24pOiBTa2lwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBjb252ZXJ0X2RlYnVnZ2luZy4KLQkoc2V0dXBfc2VjdGlvbiwgY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKGZpbHRlcl9zeW1ib2xzKTogU2tpcCBkZWJ1Z2dpbmcgc3ltYm9scyBpZiBjb252ZXJ0X2RlYnVnZ2luZy4KLQkoY29weV9vYmplY3QpOiBJZiBjb252ZXJ0X2RlYnVnZ2luZywgcmVhZCBhbmQgd3JpdGUgZGVidWdnaW5nCi0JaW5mb3JtYXRpb24uCi0JKHdyaXRlX2RlYnVnZ2luZ19pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tZGVidWdnaW5nLgotCSogTWFrZWZpbGUuaW4gKERFQlVHX09CSlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoT0JKQ09QWV9QUk9HKSk6IERlcGVuZCB1cG9uIGFuZCBsaW5rIGFnYWluc3QgJChERUJVR19PQkpTKS4KLQkoJChTVFJJUF9QUk9HKSk6IExpa2V3aXNlLgotCShPQkpEVU1QX09CSlMpOiBSZW1vdmUgdmFyaWFibGUuCi0JKCQoT0JKRFVNUF9QUk9HKSk6IFVzZSBvYmpkdW1wLm8gJChERUJVR19PQkpTKSByYXRoZXIgdGhhbgotCSQoT0JKRFVNUF9PQkpTKS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1kZWJ1Z2dpbmcuCi0KLVRodSBKYW4gIDQgMTY6MzE6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmM6IE5ldyBmaWxlIHdpdGggY29kZSB0byByZWFkIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSogYnVkYmcuaCAocGFyc2VfaWVlZSk6IERlY2xhcmUuCi0JKiByZGRiZy5jIChyZWFkX2RlYnVnZ2luZ19pbmZvKTogSGFuZGxlIElFRUUgZmxhdm91ciBmaWxlcy4KLQkocmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkoQ0ZJTEVTKTogQWRkIGllZWUuYy4KLQkoT0JKRFVNUF9PQkpTKTogQWRkIGllZWUuby4KLQotCSogYnVjb21tLmggKHhyZWFsbG9jKTogQ2hhbmdlIHR5cGUgb2YgZmlyc3QgcGFyYW1ldGVyIGZyb20gY2hhciAqCi0JdG8gUFRSLgotCi1UdWUgSmFuICAyIDE3OjQ0OjA3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IEFkZCB0YXJnZXRzIHRvIGF1dG9tYXRpY2FsbHkgcmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JUmVtb3ZlIHRhcmdldHMgd2hpY2gganVzdCBsaXN0ZWQgZGVwZW5kZW5jaWVzIG9mIC5vIGZpbGVzLgotCShERVApOiBOZXcgdmFyaWFibGUuCi0JKEhGSUxFUywgR0VORVJBVEVEX0hGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENGSUxFUywgR0VORVJBVEVEX0NGSUxFUyk6IE5ldyB2YXJpYWJsZXMuCi0JKHVuZGVyc2NvcmUuYyk6IERvbid0IGRvIGFueXRoaW5nLCBqdXN0IGRlcGVuZCB1cG9uIHN0YW1wLXVuZGVyLgotCShzdGFtcC11bmRlcik6IE5ldyB0YXJnZXQ7IGRvIHdoYXQgdW5kZXJzY29yZS5jIHVzZWQgdG8gZG8uCi0JKG5sbWNvbnYubyk6IERlcGVuZCB1cG9uIHN5bS5oIGFuZCBlY29mZi5oLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCwgZGVwLCBkZXAtaW4pOiBOZXcgdGFyZ2V0cy4KLQkoc3RhZ2UxLCBzdGFnZTIsIHN0YWdlMywgYWdhaW5zdCwgY29tcGFyaXNvbik6IFJlbW92ZS4KLQkoZGUtc3RhZ2UxLCBkZS1zdGFnZTIsIGRlLXN0YWdlMyk6IFJlbW92ZS4KLQkoY2xlYW4sIGRpc3RjbGVhbik6IFJlbW92ZSBzdGFtcC11bmRlciBhbmQgZGVwLnNlZC4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi0JSW1wbGVtZW50IGdlbmVyaWMgZGVidWdnaW5nIHN1cHBvcnQuICBJbXBsZW1lbnQgYSBzdGFicyByZWFkZXIgYW5kCi0JYSBnZW5lcmljIHByaW50ZXIuCi0JKiBidWRiZy5oLCBkZWJ1Zy5jLCBkZWJ1Zy5oLCBwcmRiZy5jLCByZGRiZy5jLCBzdGFicy5jOiBOZXcgZmlsZXMuCi0JKiBvYmpkdW1wLmM6IEluY2x1ZGUgImRlYnVnLmgiIGFuZCAiYnVkYmcuaCIuCi0JKGR1bXBfZGVidWdnaW5nKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkodXNhZ2UpOiBNZW50aW9uIC0tZGVidWdnaW5nLgotCShsb25nX29wdGlvbnMpOiBBZGQgImRlYnVnZ2luZyIuCi0JKGRpc3BsYXlfYmZkKTogSGFuZGxlIC0tZGVidWdnaW5nLgotCSogTWFrZWZpbGUuaW4gKE9CSkRVTVBfT0JKUyk6IE5ldyB2YXJpYWJsZS4KLQkoJChPQkpEVU1QX1BST0cpKTogVXNlICQoT0JKRFVNUF9PQkpTKS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgLS1kZWJ1Z2dpbmcuCi0KLVNhdCBEZWMgMzAgMDk6NTk6NTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBubS5jICggbG9uZ19vcHRpb25zKTogQWRkICItLWRlZmluZWQtb25seSIgb3B0aW9uLgotCSh1c2FnZSk6IFVwZGF0ZSBmb3IgbmV3ICItLWRlZmluZWQtb25seSIgb3B0aW9uLgotCShmaWx0ZXJfc3ltYm9scyk6IEhhbmRsZSAiLS1kZWZpbmVkLW9ubHkiLgotCi1GcmkgRGVjIDI5IDE2OjA0OjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJwYXJzZS55OiBJbmNsdWRlICJidWNvbW0uaCIsIG5vdCA8c3lzZGVwLmg+LgotCSogbmxtaGVhZGVyLnk6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KLQotVHVlIERlYyAyNiAxODoyMzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHByaW50X3N5bWRlZl9lbnRyeSk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9nZXRfZWx0X2F0X2luZGV4LgotCi1TYXQgRGVjIDIzIDExOjAzOjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY2d5bnN1LmNvbT4KLQotCSogY29uZmlndXJlLmluIChETExUT09MX0RFRlMpOiBCdWlsZCBkbGx0b29sIGZvciBQb3dlclBDIGlmIHRhcmdldAotCWlzIHBvd2VycGMqLSotd2luKiBpbiBhZGRpdGlvbiB0byBwb3dlcnBjKi0qLSpwZSouCi0KLUZyaSBEZWMgMTUgMTY6MzA6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGVuZGlhbl9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIGl0LgotCSogbmxtY29udi5jIChtYWluKTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KLQotRnJpIERlYyAxNSAwNzo1MTozNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBTdGFydCBmcm9tIDEgaWYgbm8gb3RoZXIgaW5zdHJ1Y3Rpb25zCi0gCWdpdmVuLgotCi1UdWUgRGVjIDEyIDEyOjA1OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuKTogUmVtb3ZlICQoREVNQU5HTEVSX1BST0cpLjEuICBGcm9tIFJvbmFsZAotCUYuIEd1aWxtZXR0ZSA8cmZnQG1vbmtleXMuY29tPi4KLQotTW9uIERlYyAxMSAxNDozMzowNSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1hYy1iaW51dGlscy5yOiBGaXggY29weXJpZ2h0IGFuZCB2ZXJzaW9uIHN0cmluZ3MuCi0KLQkqIE1ha2VmaWxlLmluICh2ZXJzaW9uKTogUmVtb3ZlLCBubyBsb25nZXIgdXNlZC4KLQotRnJpIERlYyAgMSAxNDo0MTo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZCAoaW5zdGFsbCwgaW5zdGFsbC1vbmx5KTogRWRpdCBpbiBNYWMtc3BlY2lmaWMKLQlpbnN0YWxsIHByb2NlZHVyZS4KLQotVGh1IE5vdiAzMCAyMDoyNjowMiAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChwcGNfanRhYik6IFRoZSBiaW5hcnkgZ2x1ZSBmb3IgUG93ZXJQQyBkbGwgbGlua2FnZSwKLQlpbmNsdWRpbmcgdGhlIHJldHVybiBpbnN0cnVjdGlvbi4KLQlzaW5mbzogYWRkZWQgYSBwcmVmZXJyZWQgYWxpZ25tZW50IGZpZWxkLgotCShzZWNkYXRhKTogc2VjdGlvbiBkYXRhIGZvciB0aGUgUG93ZXJQQyB2ZXJzaW9uLgotCShtYWtlX29uZV9saWJfZmlsZSk6IE1vcmUgc3ltYm9scywgTW9yZSBzZWN0aW9ucyAocGRhdGEsIHJkYXRhKQotCShtYWtlX3RhaWwpOiBVc2UgaWRhdGEkNiBpbnN0ZWFkIG9mIGlkYXRhJDcgZm9yIHBwYy4gQWxzbyBhZGRlZCBhCi0JTlVMTCBpZGF0YSQzIGRlc2NyaXB0b3IgKHRlbXBvcmFyeSkuCi0KLVR1ZSBOb3YgMjggMTc6MjM6NDQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChmaWxsX29yZGluYWxzKTogRG9uJ3QgcmVmZXJlbmNlIGRfZXhwb3J0X3ZlYyBpZgotCXRoZXJlIGFyZSBubyBleHBvcnRlZCBmdW5jdGlvbnMuCi0KLU1vbiBOb3YgMjcgMTM6MDU6NTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUgd2l0aCBhdXRvY29uZiAyLjcuCi0KLVdlZCBOb3YgMjIgMTM6MTc6MTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKGZpbGxfb3JkaW5hbHMpOiBTdGFydCBhc3NpZ25pbmcgb3JkaW5hbHMgYXQgMS4KLQotCSogTWFrZWZpbGUuaW4gKEVYUEVDVCk6IFVzZSAkJHIsIG5vdCAkJHtyb290bWV9LgotCShjaGVjayk6IFNldCByLCBub3Qgcm9vdG1lLgotCi1UdWUgTm92IDIxIDE4OjA0OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgQkZEX05FRURfREVDTEFSQVRJT04uCi0JKiBhY2NvbmZpZy5oOiBQdXQgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIGluIEBUT1BAIHNlY3Rpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotRnJpIE5vdiAxNyAxMDozNDozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogVXNlIEBob3N0QCBhbmQgQHRhcmdldEAsIG5vdAotCSQoaG9zdF9jYW5vbmljYWwpIGFuZCAkKHRhcmdldF9jYW5vbmljYWwpLgotCi1UaHUgTm92IDE2IDAzOjM5OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVmVyc2lvbiAyLjYgcmVsZWFzZWQuCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjYuCi0KLVdlZCBOb3YgMTUgMTI6MTQ6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCk6IERlZmluZS4KLQkoY2hlY2spOiBQYXNzIENDIGFuZCBDRkxBR1MgdG8gcnVudGVzdC4KLQotCSogbm0uYyAoZGlzcGxheV9yZWxfZmlsZSk6IERvbid0IHJlcXVpcmUgYSBEWU5BTUlDIG9iamVjdCB3aGVuCi0JZHVtcGluZyB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUuCi0KLQkqIG9iamR1bXAuYyAoY29tcGFyZV9zeW1ib2xzKTogU29ydCBnbG9iYWwgc3ltYm9scyBiZWZvcmUgbG9jYWwKLQlzeW1ib2xzIGJlZm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogRG9uJ3QgZnV0eiBhcm91bmQgbG9va2luZyBmb3IgYSBnbG9iYWwKLQlzeW1ib2wgd2l0aCB0aGUgc2FtZSB2YWx1ZS4KLQotVHVlIE5vdiAxNCAxNzoxOToxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYzogVXNlIEZPUEVOXyogbWFjcm9zIHJhdGhlciB0aGFuICJyIiBvciAidyIuCi0KLQkqIGRsbHRvb2wuYyAoZmlsbF9vcmRpbmFscyk6IENvcnJlY3QgbWVtc2V0IGNhbGwuCi0KLVN1biBOb3YgMTIgMTI6NTY6MDUgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQgKERFTUFOR0xFUl9QUk9HKTogRWRpdCBvdXQgYXR0ZW1wdHMgdG8gZG8gYW55dGhpbmcKLSAJd2l0aCB0aGUgbWFuIHBhZ2UuCi0KLUZyaSBOb3YgMTAgMTE6NDE6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNldHVwX3NlY3Rpb24pOiBDb3B5IHRoZSBzZWN0aW9uIGxtYSBpbmRlcGVuZGVudGx5IG9mCi0JdGhlIHZtYS4KLQotV2VkIE5vdiAgOCAxMTozMzowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyc3VwLmMgKGFyX29wZW4pOiBDYXN0IG1hbGxvYyByZXR1cm4gdmFsdWUuCi0KLVR1ZSBOb3YgIDcgMDk6MDE6MjYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlIChETExUT09MX0RFRlMpOiBBZGRlZCBwcGMgdGFyZ2V0LgotCSogZGxsdG9vbC5jIChNUFBDKTogQWRkZWQgYmFzaWMgUFBDIGRlZmluaXRpb25zLgotCi1UdWUgTm92ICA3IDE0OjAyOjU3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCB0cmVhdCByczYwMDAtKi1seW54KiBzcGVjaWFsbHkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvcnNseW54OiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIEB0YXJnZXRfbWFrZWZpbGVfZnJhZ21lbnRALgotCi1Nb24gTm92ICA2IDE1OjAwOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmg6IEluY2x1ZGUgPHN5cy90eXBlcy5oPi4KLQkqIGFyLmM6IERvbid0IGluY2x1ZGUgPHN5cy90eXBlcy5oPiBvciA8c3RkaW8uaD4uCi0JKiBidWNvbW0uYywgZGxsdG9vbC5jLCBubG1jb252LmMsIG9iamNvcHkuYywgb2JqZHVtcC5jOiBMaWtld2lzZS4KLQotRnJpIE5vdiAgMyAxMjozODowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCi0JUGVybWl0IHVzZXIgdG8gb3ZlcnJpZGUgREVNQU5HTEVSX1BST0cgZnJvbSBjb21tYW5kIGxpbmUuICBGcm9tCi0JTWFuZnJlZCBIb2xsc3RlaW4gPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPi4KLQkqIE1ha2VmaWxlLmluICgkKERFTUFOR0xFUl9QUk9HKSk6IERlcGVuZCB1cG9uCi0JJChERU1BTkdMRVJfUFJPRykuMS4KLQkoaW5zdGFsbCk6IERvbid0IGRlcGVuZCB1cG9uICQoREVNQU5HTEVSX1BST0cpLjEuICBPbmx5IGluc3RhbGwKLQkkKERFTUFOR0xFUl9QUk9HKS4xIGlmICQoREVNQU5HTEVSX1BST0cpIGlzIG5vdCBlbXB0eS4KLQotV2VkIE5vdiAgMSAxNTowNDo1NyAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKHN5c2xleC5vKTogYWRkIC1JJChzcmNkaXIpIGlmIGNvbXBpbGluZyBpbiBhCi0Jc2VwYXJhdGUgZGlyZWN0b3J5LgotCi1Nb24gT2N0IDMwIDE0OjI0OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X3ZhbHVlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIGl0LiAgSWYgd2UgbmVlZCB0aGUgcmlnaHQgc2VjdGlvbiBmb3IKLQl0aGUgc3ltYm9sLCBhbmQgd2UgY2FuJ3QgZmluZCBpdCwgcHJpbnQgYW4gb2Zmc2V0IGZyb20gdGhlIHNlY3Rpb24KLQlyYXRoZXIgdGhhbiB1c2luZyBhIHN5bWJvbCBmcm9tIHNvbWUgb3RoZXIgc2VjdGlvbi4KLQotVGh1IE9jdCAyNiAxMDoyMzoxNCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG5vX2lkYXRhNCwgbm9faWRhdGE1KTogTmV3LgotCShhcm1fanRhYik6IFVzZSBjb3JyZWN0IGVuY29kaW5nIG9mIGp1bXAgaW5zdHJ1Y3Rpb24uCi0JKHVzYWdlLCBtYWluLCBtYWtlX2hlYWQsIG1ha2VfdGFpbCk6IEFjdCBvbiBub19pZGF0YTQsIG5vX2lkYXRhNS4KLQotV2VkIE9jdCAyNSAxMjoxMDowNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBwYXRocyB0byBnZW5lcmF0ZWQgeS50YWIuW2NoXSBmaWxlcy4KLQotRnJpIE9jdCAyMCAxODo0MDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLnRleGk6IENoYW5nZSAtLXdpdGgtdGFyZ2V0cyB0byAtLWVuYWJsZS10YXJnZXRzLgotCi1UaHUgT2N0IDE5IDE3OjQ3OjQxIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogIFJlbW92ZSBleHRyYW5lb3VzIHRhYiBvbiBvdGhlcndpc2UgZW1wdHkgbGluZSwKLQl3aGljaCBjb25mdXNlcyBtYW55IG5vbi1HTlUgdmVyc2lvbnMgb2YgIm1ha2UiLgotCi1XZWQgT2N0IDE4IDE2OjMxOjU4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoaTM4Nl9qdGFiLCBhcm1fanRhYik6IE5ldwotCShnZW5fbGliX2ZpbGUpOiBSZXdyaXR0ZW4gdG8gdXNlIGJmZC4KLQotRnJpIE9jdCAxMyAxNjoxMDowNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgZ2l2ZSBlcnJvciBtZXNzYWdlIGlmIGRsbHRvb2wKLQl3YXNuJ3QgYnVpbHQuCi0KLUZyaSBPY3QgMTMgMTE6MDQ6MzcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGVmbGV4Lmw6IEFsbG93IHF1b3Rpbmcgb2YgSURzLgotCSogZGVmcGFyc2UueSAoJXVuaW9uKTogc3RyaW5nIGRlbGV0ZWQuCi0JKGNvbW1hbmQpOiBERVNDUklQVElPTiB0YWtlcyBJRC4KLQkqIGRsbHRvb2wuYyAoZ2VuX2RlZl9maWxlKTogUXVvdGUgb3V0Z29pbmcgbmFtZSBpZgotCW5lY2Vzc2FyeS4gIFByZXNlcnZlIE5PTkFNRS4KLQkoZ2VuX2xpYl9maWxlKTogUnVuIHJhbmxpYi4KLQkod29ya291dF9wcmVmaXgpOiBEZWxldGVkLgotCShtYWluLCB1c2FnZSwgbG9uZ19vcHRpb25zKTogQWRkIC0tYXMsIC0tcmFubGliLCAtLWFyIG9wdGlvbnMuCi0KLVdlZCBPY3QgMTEgMTM6MzY6MTMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChtdGFibGUpOiBIT1dfQUxJR05fTE9ORywgbmV3LgotCShkX29yZCk6IERlbGV0ZWQuCi0JKGRfbG93X29yZCwgZF9oaWdoX29yZCwgZF9uYW1lZF9mdW5jcyk6IE5ldy4KLQkoZ2VuX2V4cF9maWxlKTogQ3JlYXRlIG5vbmFtZSBlbnRyaWVzIGNvcnJlY3RseS4KLQkoZ2VuX2xpYl9maWxlKTogRHVtcCBleHBvcnRzIGFscGhhYmV0aWNhbGx5LgotCShwcm9jZXNzX2R1cGxpY2F0ZXMpOiAgQ291bnQgbm9uYW1lZCBmdW5jdGlvbnMuCi0JKGZpbGxfb3JkaW5hbHMpOiBLZWVwIHRyYWNrIG9mIGhpZ2hlc3Qgb3JkIHRvby4KLQkobWFuZ2xlX2RlZnMpOiBDcmVhdGUgYWxwaGFiZXRpY2FsbHkgb3JkZXJlZCBsaXN0IG9mIG5hbWVzLgotCi1UdWUgT2N0IDEwIDA5OjM5OjA5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChUT09MX1BST0dTKTogSW5jbHVkZSBETExUT09MX1BST0cuCi0KLU1vbiBPY3QgIDkgMTM6MDY6MzEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChhZGRfdW5kZXJzY29yZSk6IE5ldy4KLQkoeGxhdGUpOiBVc2UgbmV3IG5hbWUuCi0JKG1haW4sIHVzYWdlKTogVXBkYXRlLgotCi1GcmkgT2N0ICA2IDE0OjA4OjUxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzeXNpbmZvLnk6IEVsaW1pbmF0ZSB1bnVzZWQgdGVybWluYWxzICJbIiBhbmQgIl0iIGFuZCB1bnVzZWQKLQlub250ZXJtaW5hbCAibmFtZSIuICBPbmUgcy9yIGNvbmZsaWN0IHJlbWFpbnMuCi0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBubS5jIChwcmludF9zeW1uYW1lKTogRG9uJ3QgdHJ5IHRvIGRlbWFuZ2xlIGFuIGVtcHR5Ci0JbmFtZS4KLQkqIG9iamR1bXAuYyAoc2x1cnBfc3ltdGFiKTogUmVzZXQgc3ltY291bnQgaWYgdGhlcmUgYXJlCi0Jbm8gc3ltYm9scy4KLQkoc2x1cnBfZHluYW1pY19zeW10YWIpOiBMaWtld2lzZSwgZm9yIGR5bnN5bWNvdW50LgotCShkaXNhc3NlbWJsZV9kYXRhKTogRml4IG1lbW9yeSBsZWFrOiBmcmVlIHNvcnRlZF9zeW1zIHdoZW4gZG9uZS4KLQkoZGlzcGxheV9iZmQpOiBMaWtld2lzZSwgZm9yIHN5bXMgYW5kIGR5bnN5bXMuCi0JKGR1bXBfcmVsb2NzKTogRG9uJ3QgcHJpbnQgaGVhZGVyIGJlZm9yZSBwb3NzaWJseSBnZW5lcmF0aW5nIGFuCi0JZXJyb3IgbWVzc2FnZS4KLQkoZHVtcF9keW5hbWljX3JlbG9jcyk6IExpa2V3aXNlLgotCi0JKiBhci4xLCBubS4xLCBvYmpkdW1wLjEsIHNpemUuMSwgc3RyaW5ncy4xLCBzdHJpcC4xOiBGaXggdHlwb3MgYW5kCi0JZm9ybWF0dGluZyBidWdzLgotCi1GcmkgT2N0ICA2IDEyOjAwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXIuYyAoZG9fcXVpY2tfYXBwZW5kKTogQ29tbWVudCBvdXQuCi0JKHJlcGxhY2VfbWVtYmVycyk6IEFkZCBxdWljayBhcmd1bWVudC4KLQkobWFpbik6IERvbid0IGNhbGwgZG9fcXVpY2tfYXBwZW5kLgotCShvcGVuX2luYXJjaCk6IERvbid0IGNhbGwgcXVpY2tfYXBwZW5kIHRvIGNyZWF0ZSBhbiBlbXB0eSBhcmNoaXZlLgotCUluc3RlYWQgY2FsbCBiZmRfb3BlbncvYmZkX3NldF9mb3JtYXQvYmZkX2Nsb3NlLgotCi1UaHUgT2N0ICA1IDIwOjUzOjA4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBidWNvbW0uYzogQWx3YXlzIGluY2x1ZGUgdGltZS5oLgotCi1UaHUgT2N0ICA1IDE3OjI1OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3N5bWJvbHMpOiBTb3J0IGdudV9jb21waWxlZCBhbmQgZ2NjMl9jb21waWxlZAotCXN5bWJvbHMgYWZ0ZXIgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLiAgTGlrZXdpc2UgZm9yCi0Jc3ltYm9scyB3aGljaCBsb29rIGxpa2UgZmlsZSBuYW1lcy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogQWx3YXlzIGNob3NlIHRoZSBmaXJzdCByZWFzb25hYmxlIHN5bWJvbAotCXdpdGggYSBnaXZlbiB2YWx1ZS4KLQotVHVlIE9jdCAgMyAyMjozODo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFyc3VwLmMgKGFyX3NhdmUpOiBVc2UgcmVuYW1lLCBub3QgdW5saW5rL2xpbmsvdW5saW5rLgotCi1Nb24gT2N0ICAyIDEyOjEwOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jIChtYWluKTogRXhpdCB3aXRoIHplcm8gc3RhdHVzIGlmIG5vIGZpbGVzIGFyZSBnaXZlbgotCWFuZCBzdGFuZGFyZCBpbnB1dCBpcyByZWFkLgotCi1UaHUgU2VwIDI4IDIwOjAzOjA3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQ2FsY3VsYXRlIHVuZGVyc2NvcmUgYW5kIHB1dCBpbnRvIG1ha2VmaWxlCi0JZnJhZ21lbnQsIGdlbmVyYXRlIGNvbmZpZy5oLgotCSogbXB3LW1ha2Uuc2VkOiBOZXcgZmlsZSwgc2VkIGNvbW1hbmRzIHRvIGVkaXQgVW5peCBtYWtlZmlsZQotCWludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtYWMtYmludXRpbHMucjogTmV3IGZpbGUsIE1hYyByZXNvdXJjZXMuCi0KLVRodSBTZXAgMjggMTU6NDk6MDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiAoZ2VuX2V4cF9maWxlKTogQWx3YXlzIGVtaXQgYSAucmVsb2Mgc2VjdGlvbiBpZgotCXJlbG9jYXRhYmxlLgotCShpbXBfbmFtZV9sYWIpOiBOZXcuCi0JKGdlbl9kZWZfZmlsZSk6IE5ldy4KLQkoZ2VuX2xpYl9maWxlKTogVXNlIGltcF9uYW1lX2xhYi4KLQkobWFpbik6IEluaXRpYWxpemUgaW1wX25hbWVfbGFiLgotCi1Nb24gU2VwIDI1IDEyOjA1OjM0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0hFQURFUl9TWVNfV0FJVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy5pbjogUmVidWlsZC4KLQkqIGRsbHRvb2wuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiIGFuZCAiYnVjb21tLmgiLiAgRG9uJ3QgaW5jbHVkZQotCTxzdGRpby5oPiwgPHN0ZGxpYi5oPiwgb3IgPHN0cmluZy5oPi4gIERvbid0IGluY2x1ZGUgPHdhaXQuaD4uCi0JSW5jbHVkZSA8c3lzL3R5cGVzLmg+LiAgVXNlIEhBVkVfU1lTX1dBSVRfSCB0byBjb250cm9sIHdoZXRoZXIgdG8KLQlpbmNsdWRlIDxzeXMvd2FpdC5oPiBvciBkZWZpbmUgdGhlIHdhaXQgbWFjcm9zIGJ5IGhhbmQuICBEb24ndAotCWRlY2xhcmUgeG1hbGxvYy4KLQkoZ2VuX2xpYl9maWxlKTogRG9uJ3QgYXNzdW1lIHRoYXQgc3ByaW50ZiByZXR1cm5zIHRoZSBudW1iZXIgb2YKLQljaGFyYWN0ZXJzOyB1c2Ugc3RybGVuIGluc3RlYWQuCi0KLUZyaSBTZXAgMjIgMTc6MTY6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBEb24ndCB1c2UgdGhlIG9sZCBCRkQgYmFzZWQKLQlkaXNhc3NlbWJsZXIgaW50ZXJmYWNlLiAgTWFrZSBpbmZvIGEgY29uc3QgcG9pbnRlci4KLQotV2VkIFNlcCAxMyAxODozMzo0NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoc3RhcnRfYWRkcmVzcyk6IE5ldyB2YXJpYWJsZS4KLQkoc3RvcF9hZGRyZXNzKTogTmV3IHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLS1zdGFydC1hZGRyZXNzIGFuZCAtLXN0b3AtYWRkcmVzcy4KLQkoT1BUSU9OX1NUQVJUX0FERFJFU1MsIE9QVElPTl9TVE9QX0FERFJFU1MpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAic3RhcnQtYWRkcmVzcyIgYW5kICJzdG9wLWFkZHJlc3MiLgotCShkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHN0YXJ0X2FkZHJlc3MgYW5kIHN0b3BfYWRkcmVzcy4KLQkoZHVtcF9kYXRhLCBkdW1wX3JlbG9jX3NldCk6IExpa2V3aXNlLgotCShtYWluKTogRG9uJ3Qgc2V0IHNlZW5mbGFnIGZvciAtbC4gIEhhbmRsZSBPUFRJT05fU1RBUlRfQUREUkVTUwotCWFuZCBPUFRJT05fU1RPUF9BRERSRVNTLgotCSogb2JqY29weS5jIChwYXJzZV92bWEpOiBNb3ZlIHRvIGJ1Y29tbS5jLgotCSogYnVjb21tLmMgKHBhcnNlX3ZtYSk6IE5ldyBmdW5jdGlvbiwgbW92ZWQgaW4gZnJvbSBvYmpjb3B5LmMuCi0JKiBidWNvbW0uaCAocGFyc2Vfdm1hKTogRGVjbGFyZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamR1bXAuMTogRG9jdW1lbnQgbmV3IG9iamR1bXAgb3B0aW9ucy4KLQotVHVlIFNlcCAxMiAxMjozNzozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldC4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogRG9uJ3QgY2FsbCB3cml0ZV9hcmNoaXZlIGlmIG5vdGhpbmcKLQljaGFuZ2VkLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBBZGQgY2FzdHMgdG8gYXZvaWQgZ2NjIHdhcm5pbmdzLgotCi1UaHUgU2VwICA3IDEyOjEyOjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLmluOiBSZW5hbWUgZnJvbSBjb25maWcuaC5pbi4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIHdpdGggY29uZmlnLmg6Y29uZmlnLmluLgotCUNoZWNrIGZvciBjb25maWcuaDpjb25maWcuaW4gd2hlbiBjcmVhdGluZyBzdGFtcC1oLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWgpOiBEZXBlbmQgdXBvbiBjb25maWcuaW4gcmF0aGVyIHRoYW4KLQljb25maWcuaC5pbi4gIFNldCBDT05GSUdfSEVBREVSUyB0byBjb25maWcuaDpjb25maWcuaW4gd2hlbgotCWNhbGxpbmcgY29uZmlnLnN0YXR1cy4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuaCwgc3RhbXAtaCwgYW5kCi0gICAgICAgIGNvbmZpZy5sb2cuCi0KLQkqIG5tLmMgKHZhbHVlX2Zvcm1hdCk6IEluaXRpYWxpemUgYmFzZWQgb24gQkZENjQgYW5kCi0JQkZEX0hPU1RfNjRCSVRfTE9ORy4KLQkocHJpbnRfcmFkaXgpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzZXRfcHJpbnRfcmFkaXgpOiBTZXQgcHJpbnRfcmFkaXguICBBZGp1c3QgY2hhbmdlcyB0bwotCXZhbHVlX2Zvcm1hdC4KLQkocHJpbnRfdmFsdWUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCB0byBwcmludCA2NCBiaXQgb2N0YWwgYW5kCi0JZGVjaW1hbCB2YWx1ZXMgY29ycmVjdGx5LgotCShwcmludF9zeW1ib2xfaW5mb19ic2QpOiBDaGVjayBCRkQ2NCwgbm90IEJGRF9IT1NUXzY0X0JJVC4gIFVzZQotCXByaW50X3ZhbHVlLgotCShwcmludF9zeW1ib2xfaW5mb19zeXN2KTogVXNlIHByaW50X3ZhbHVlLgotCShwcmludF9zeW1ib2xfaW5mb19wb3NpeCk6IExpa2V3aXNlLgotCi1XZWQgU2VwICA2IDE1OjAyOjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKCoubyk6IFJlbW92ZSBpbmNvcnJlY3QgZGVwZW5kZW5jaWVzIG9uCi0JJChCRkRESVIpL2hvc3RzL3N0ZC1ob3N0LmguCi0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMX0RBVEEpOiBBZGQgLW0gNjQ0LgotCShJTlNUQUxMX1hGT1JNMSk6IExpa2V3aXNlLgotCShDQ19GT1JfQlVJTEQpOiBTZXQgdG8gQENDX0ZPUl9CVUlMREAgcmF0aGVyIHRoYW4gJChDQykuCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIGNvbmZpZy5sb2cuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfQ0NfRk9SX0JVSUxEIGFuZCBCRkRfQklOQVJZX0ZPUEVOLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwICA1IDIwOjIyOjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIHRvIHVzZSBhdXRvY29uZi4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2NvbmYuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy5oLmluOiBOZXcgZmlsZSwgYnVpbHQgYnkgYXV0b2hlYWRlci4KLQkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgZm9yIG5ldyBjb25maWd1cmUgc2NyaXB0LiAgQWxzbzoKLQkoUFJPR1MpOiBSZW1vdmUgJChTWVNJTkZPX1BST0cpLgotCShBTExfQ0ZMQUdTKTogUmVtb3ZlICQoVERFRklORVMpLgotCSh2ZXJzaW9uLm8pOiBVc2UgJChBTExfQ0ZMQUdTKS4KLQkoY3BsdXMtZGVtLm8sIGRsbHRvb2wubywgbmxtY29udi5vKTogTGlrZXdpc2UuCi0JKHN5c2R1bXAubyk6IERlcGVuZCB1cG9uIGJ1Y29tbS5oIGFuZCBjb25maWcuaC4KLQkoc3Jjb252Lm8sIGFyc3VwLm8sIHN0cmluZ3Mubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCShmaWxlbW9kZS5vKTogRG9uJ3QgZGVwZW5kIHVwb24gLi4vYmZkL3N5c2RlcC5oLgotCShidWNvbW0ubyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLCBub3QgLi4vYmZkL3N5c2RlcC5oLgotCShzaXplLm8sIG9iamR1bXAubywgbm0ubywgYXIubywgb2JqY29weS5vKTogTGlrZXdpc2UuCi0JKG5sbWhlYWRlci5vLCBubG1jb252Lm8pOiBMaWtld2lzZS4KLQkoZGlzdGNsZWFuKTogRG9uJ3QgcmVtb3ZlIHN5c2RlcC5oLgotCSogYnVjb21tLmg6IEluY2x1ZGUgImFuc2lkZWNsLmgiLCA8c3RkaW8uaD4sIGFuZCAiY29uZmlnLmgiLgotICAJSW5jbHVkZSAiZm9wZW4tc2FtZS5oIiBvciAiZm9wZW4tYmluLmgiLCBiYXNlZCBvbgotIAlVU0VfQklOQVJZX0ZPUEVOLiAgSW5jbHVkZSA8ZXJybm8uaD4sIGFuZCBkZWNsYXJlIGVycm5vIGlmIGl0IGlzCi0gCW5vdCBhIG1hY3JvLiAgSW5jbHVkZSA8dW5pc3RkLmg+LCA8c3RyaW5nLmg+LCA8c3RyaW5ncy5oPiwKLSAJPHN0ZGxpYi5oPiwgYW5kIDxmY250bC5oPiBpZiB0aGV5IGFyZSBwcmVzZW50LiAgRGVjbGFyZSBzdHJjaHIsCi0gCXN0cnJjaHIsIGFuZCBzdHJzdHIgaWYgbm8gc3RyaW5nIGhlYWRlciBmaWxlIGV4aXN0cy4gIEluY2x1ZGUKLQk8c3lzL2ZpbGUuaD4gaWYgaXQgZXhpc3RzIGFuZCA8ZmNudGwuaD4gZG9lcyBub3QuICBEZWZpbmUKLQlPX1JET05MWSBhbmQgT19SRFdSIGlmIG5lY2Vzc2FyeS4KLQkqIGFyLmM6ICBEb24ndCBpbmNsdWRlICJzeXNkZXAuaCIuICBEbyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gYW5kCi0JPHN5cy9zdGF0Lmg+LiAgVXNlIEhBVkVfR09PRF9VVElNRV9IIHJhdGhlciB0aGFuIFBPU0lYX1VUSU1FLiAgVXNlCi0JSEFWRV9VVElNRVMgcmF0aGVyIHRoYW4gIVVTRV9VVElNRS4gIERvbid0IGluY2x1ZGUgPGVycm5vLmg+LCBhbmQKLQlkb24ndCBkZWNsYXJlIGVycm5vLgotCSogYXJzdXAuYzogRG9uJ3QgaW5jbHVkZSA8c3lzZGVwLmg+LgotCSogYnVjb21tLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIEluY2x1ZGUgPHN0ZGlvLmg+LAotCTxzeXMvdHlwZXMuaD4sIGFuZCA8c3lzL3N0YXQuaD4uICBJbmNsdWRlIDx0aW1lLmg+IGlmIGl0IGRlZmluZXMKLQl0aW1lX3QuICBEZWZpbmUgdGltZV90IGlmIG5lY2Vzc2FyeS4KLQkqIGNvZmZkdW1wLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4KLQkqIGNvZmZncm9rLmMsIGZpbGVtb2RlLmMsIG5sbWNvbnYuYywgc2l6ZS5jOiBMaWtld2lzZS4KLQkqIHNyY29udi5jLCBzdHJpbmdzLmM6IExpa2V3aXNlLgotCSogbm0uYzogRG9uJ3QgaW5jbHVkZSAic3lzZGVwLmgiLiAgRG9uJ3QgdHJ5IHRvIGRlZmluZSBIQVZFX1NCUksuCi0JKiBvYmpjb3B5LmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIEluY2x1ZGUgPHN5cy90eXBlcy5oPiBhbmQKLQk8c3lzL3N0YXQuaD4uCi0JKHNpbXBsZV9jb3B5KTogVXNlIGNyZWF0IHJhdGhlciB0aGFuIGFzc3VtaW5nIHRoYXQgT19DUkVBVCBpcwotCWRlZmluZWQuCi0JKiBvYmpkdW1wLmM6IERvbid0IGluY2x1ZGUgInN5c2RlcC5oIi4gIFVzZQotCU5FRURfREVDTEFSQVRJT05fUFJJTlRGIHJhdGhlciB0aGFuICFGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQuCi0JKiBzeXNkdW1wLmM6IEluY2x1ZGUgImJmZC5oIiBhbmQgImJ1Y29tbS5oIi4gIERvbid0IGluY2x1ZGUKLQkic3lzZGVwLmgiIG9yIDxzdGRsaWIuaD4uCi0JKGR1bXBfc3ltYm9sX2luZm8pOiBSZW5hbWUgZnJvbSBzeW1ib2xfaW5mby4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotTW9uIFNlcCAgNCAxNDozMDowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogRG9uJ3Qgc2V0LiAgU3Vic3RpdHV0ZSBmb3IKLQlAQ0NALCBAQ0ZMQUdTQCwgQEhERUZJTkVTQCBhbmQgQExERkxBR1NAIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFSX0ZMQUdTKTogU2V0IHRvIHJjIHJhdGhlciB0aGFuIHF2LgotCShDQyk6IERlZmluZSBhcyBAQ0NALgotCShDRkxBR1MpOiBTZXQgdG8gQENGTEFHU0AuCi0JKExERkxBR1MpOiBEZWZpbmUgYXMgQExERkxBR1NALgotCShBTExfQ0ZMQUdTKTogVXNlIEBIREVGSU5FU0AgcmF0aGVyIHRoYW4gJChIREVGSU5FUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYm90aGVyIHRvIGNhbGwgY29uZmlnLmJmZCBmb3IgZWFjaCB0YXJnZXQuCi0JSnVzdCBjYWxsIGl0IGZvciB0aGUgZGVmYXVsdCB0YXJnZXQsIGFuZCB1c2UgdGhlIHNoZWxsIHZhcmlhYmxlIHRvCi0JZGVjaWRlIHdoZXRoZXIgdW5kZXJzY29yZXMgYXJlIHVzZWQuCi0KLVRodSBBdWcgMzEgMTk6MjE6NDggMTk5NSAgSmFzb24gTW9sZW5kYSAgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBtYXRjaCBpWzMtNl04Ni0qLXdpbjMyLCBub3QganVzdCBpMzg2LSotd2luMzIuCi0KLVRodSBBdWcgMzEgMTY6MzA6MjIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChhZGRfaW5kaXJlY3QpOiBOZXcuCi0JKGFzbV9wcmVmaXgpOiBOZXcKLQkoZ2VuX2V4cF9maWxlKTogVGltZXN0YW1wIHNob3VsZCBiZSAwLiBJbnNlcnQgcHJlZml4IHdoZW4KLQluZWVkZWQuIE5ldyBjb2RlIGZvciBpbmRpcmVjdGlvbi4KLQkoZ2VuX2xpYl9maWxlKTogVGltZXN0YW1wIHNob3VsZCBiZSAwLiBJbnNlcnQgcHJlZml4Ci0Jd2hlbiBuZWVkZWQuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1hZGQtaW5kaXJlY3QuCi0JKG1haW4pOiBDb3BlIHdpdGggbmV3IG9wdGlvbi4KLQotCSogb2JqZHVtcC5jIChkdW1wX3ByaXZhdGVfaGVhZGVycyk6IE5ldy4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9uLgotCShsb25nX29wdGlvbik6IEFkZCBwcml2YXRlLWhlYWRlcnMuCi0JKGR1bXBfYmZkX3ByaXZhdGVfaGVhZGVyKTogTmV3LgotCShtYWluKTogQ29wZSB3aXRoIG5ldyBvcHRpb24uCi0KLVRodSBBdWcgMzEgMDQ6MDk6MTYgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChydW4pOiBBZGQgbWlzc2luZyAzcmQgYXJnIHRvIHdhaXRwaWQuCi0KLVdlZCBBdWcgMzAgMTE6MDI6MTEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRPT0xfUFJPR1MpOiBJbmNsdWRlIGRsbHRvb2wgaWYgbmVlZGVkLgotCi1UdWUgQXVnIDI5IDEzOjI1OjIxIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAocnZhKTogRGVsZXRlZC4KLQkocnZhYWZ0ZXIsIHJ2YV9iZWZvcmUpOiBVc2UgbmV3IGFzc2VtYmxlciBwc2V1ZG8uCi0JKGZsdXNoX3BhZ2UsIGdlbl9leHBfZmlsZSwgZ2VuX2xpYl9maWxlKTogVXNlIG5ldyB3YXkgb2YgUlZBaW5nLgotCShnZW5fZXhwX2ZpbGUpOiBEb24ndCBnZW5lcmF0ZSAuZWRhdGEgaWYgbm8gbmVlZC4KLQkoZ2VuX2xpYl9maWxlKTogRG9uJ3QgbWFrZSB0aW1lc3RhbXAuCi0JUHV0IF9pbmFtZSBpbiBpZGF0YSQ3LgotCSh3b3Jrb3V0X3ByZWZpeCk6IEZpeCBtZW1vcnkgaW5pdGlhbGl6YXRpb24gYnVnLgotCSh1c2FnZSk6IFRpZHkgdXAsIGRlbGV0ZSBtYW55IHNpbmdsZSBjaGFyIG9wdGlvbnMuCi0JKG1haW4pOiBydmEgb3B0aW9uIGlzIGdvbmUuCi0KLU1vbiBBdWcgMjEgMTg6NDE6MjggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jIChvcHRpb25zKTogaW1hZ2UtYmFzZSBpcyBhIHN5bm9ueW0gZm9yIHJ2YS4KLQkoZ2VuX2xpYl9maWxlKTogUHV0IGRsbCBuYW1lIGludG8gaWJhc2UkNy4KLQotU3VuIEF1ZyAyMCAwOTo1OTowMCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JTW9kaWZpZWQgdG8gZ2VuZXJhdGUgYXJjaGl2ZXMgYW5kIG9iamVjdHMgcmF0aGVyIHRoYW4gLnMgZmlsZXMuCi0JKiBkbGx0b29sLmMgKHJ1bikgTmV3IGZ1bmN0aW9uLgotIAkoZ2VuX2V4cF9maWxlLCBnZW5fbGliX2ZpbGUpOiBVc2UgcnVuLgotCSh3b3Jrb3V0X3ByZWZpeCk6IE5ldy4KLQkodXNhZ2UpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQkobWFpbik6IFBhcnNlIG5ldyBvcHRpb25zLgotCi1XZWQgQXVnIDE2IDE2OjI2OjUyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAoZ2VuX2V4cF9maWxlKTogRml4IFJWQSBoYW5kbGluZy4KLQkocnZhX3MsIHJ2YV9uKTogRGVsZXRlLgotCi1GcmkgQXVnIDExIDE4OjI3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbm0uYyAobWFpbik6IElnbm9yZSAtZS4KLQotVGh1IEF1ZyAxMCAxNzozNTowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy50ZXhpKTogTmV3IHRhcmdldC4gIFdyaXRlIG91dCBhIHNldHRpbmcgZm9yCi0JdGV4aW5mbyB2YXJpYWJsZSBWRVJTSU9OLgotCShiaW51dGlscy5kdmksIGJpbnV0aWxzLmluZm8pOiBEZXBlbmQgb24gaXQuCi0JKiBiaW51dGlscy50ZXhpOiBJbmNsdWRlIGl0LCBhbmQgcmVmZXJlbmNlIEB2YWx1ZXtWRVJTSU9OfSBpbnN0ZWFkCi0Jb2YgZXhwbGljaXRseSBzcGVjaWZ5aW5nIDIuMighKS4KLQotVGh1IEF1ZyAxMCAxNjowNzo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvZmZncm9rLmMgKGRvX3R5cGUpOiBIYW5kbGUgYXJyYXkgZGltZW5zaW9ucyB0aGUgc2FtZSB3YXkgZ2RiCi0JZG9lcy4KLQotVHVlIEF1ZyAgOCAxNzoxMDo0MiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBkbGx0b29sLmMgKG10YWJsZSk6IE5ldyBmaWVsZHMuCi0JKEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSKTogTmV3LgotCShmbHVzaF9wYWdlKTogVXNlIG5ldyBtYWNyb3MuCi0KLVNhdCBBdWcgIDUgMDA6MTY6MzcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBIYW5kbGUgc2VjdGlvbnMKLQl3aXRoIG5vIHJlbG9jYXRpb25zLgotCSogY29mZmdyb2suYyAoZG9fc2VjdGlvbnNfcDEpOiBMaWtld2lzZS4KLQotTW9uIEp1bCAzMSAxMjo1MTowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IEZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcKLQlzdHJpbmdzIHByb2dyYW1zLCBwcmludCBzdHJpbmdzIHdoaWNoIGFyZSBub3QgdGVybWluYXRlZCB3aXRoIGEKLQludWxsIGJ5dGUgb3IgYSBuZXdsaW5lLgotCSogYmludXRpbHMudGV4aSwgc3RyaW5ncy4xOiBVcGRhdGUgZG9jdW1lbnRhdGlvbiBhY2NvcmRpbmdseS4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBhcgotCXByb2dyYW1zLCBwZXJtaXQgdXNlcnMgdG8gYWRkIHRoZSBzYW1lIGZpbGUgbXVsdGlwbGUgdGltZXMuCi0KLVR1ZSBKdWwgMjUgMTE6MjE6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJpbmdzLmMgKERBVEFfRkxBR1MpOiBSZW1vdmUgU0VDX0RBVEEuCi0JKG1haW4pOiBJZiBubyBmaWxlIG5hbWVzIGFyZSBnaXZlbiwgc2NhbiBzdGFuZGFyZCBpbnB1dC4KLQkqIGJpbnV0aWxzLnRleGksIHN0cmluZ3MuMTogc3RyaW5ncyBub3cgc2NhbnMgbm9uLWRhdGEgc2VjdGlvbnMgYnkKLQlkZWZhdWx0LgotCi1Nb24gSnVsIDI0IDEzOjUyOjI4IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3Jjb252LmMgKHdyX2hkKTogU2V0IGFmbCBmaWVsZCB0byA0IGZvciBiZmRfYXJjaF9zaC4KLQkod3JpdGVJTlQpOiBXaGVuIHNpemUgPT0gLTIsIHVzZSAyIGJ5dGVzIGZvciB0aGUgaDgzMDAgYW5kIDQgYnl0ZXMKLQlmb3IgdGhlCXNoLgotCi0JKiBzeXNkdW1wLmMgKGZpbGx1cCk6IFJldHVybiBzaXplIC0gMSwgdGhlIGxhc3QgYnl0ZSBpcyBhIGNoZWNrc3VtCi0JYW5kIHNob3VsZG4ndCBiZSBjb3VudGVkLgotCSogc3lzcm9mZi5pbmZvIChoZCk6IENoYW5nZWQgc2VnbWVudCBpZGVudGlmaWVyIGZyb20gYSBieXRlIHRvIGEgMQotCWJpdCBmaWVsZC4gIFRoZSBzeXNyb2ZmIDIuMC0wMSBzcGVjaWZpY2F0aW9uIHNlZW1zIHRvIGJlIGluIGVycm9yCi0JaGVyZS4gIFJlZHVjZSB3aWR0aCBvZiBmb2xsb3dpbmcgInNwYXJlIiBmaWVsZCBmcm9tIDQgdG8gMyBiaXRzLgotCShybCk6IENoYW5nZWQgb3JkZXIgYW5kIHdpZHRoIG9mIGZpcnN0IDQgYml0ZmllbGRzIHRvIGNvcnJlc3BvbmQKLQl0byBzeXNyb2ZmIHNwZWNpZmljYXRpb24uCi0JKGRsbl9oZWFkLCBkbG5faW5zaWRlLCBkbG5fdGFpbCk6IFJlbW92ZWQuCi0KLVR1ZSBKdWwgMTggMjM6MDA6MDMgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG5tLmMgKHNvcnRfc3ltYm9sc19ieV9zaXplKTogIEVuY2xvc2UgZXhwcmVzc2lvbiBiZWluZyBjYXN0ZWQKLQlpbiBwYXJlbnMgc28gcmVzdWx0IGlzIGNhc3RlZCwgbm90IGp1c3QgZmlyc3Qgb3BlcmFuZC4gIENhbid0Ci0JZG8gcG9pbnRlciBhcml0aG1ldGljIG9uIHZvaWQqIHBvaW50ZXJzLgotCi1GcmkgSnVsIDE0IDEzOjQyOjQyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jIChkaCk6IENoYW5nZWQgZm9ybWF0IG9mIG91dHB1dCB0byBiZSAxNiBoZXggZGlnaXRzCi0JZm9sbG93ZWQgYnkgMTYgYXNjaWkgY2hhcmFjdGVycywgc2ltaWxhciB0byBFbWFjcycgaGV4bC1tb2RlLAotCXRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlYWQuCi0JKHhjYWxsb2MpOiBmaXggdHlwby4KLQotVGh1IEp1bCAxMyAxNToyNzo0NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jICh3cl90cik6IFdyaXRlIG91dCBoYW5kY3JhZnRlZCB0ciBibG9jay4KLQkod2Fsa190cmVlX3N5bWJvbCk6IFVzZSBldmFsbGVuIGFuZCBldmFsdWUgaW5zdGVhZCBvZgotCXZhbGxlbiAmIHZhbHVlIGJlY2F1c2Ugb2YgY29ycmVzcG9uZGluZyBjaGFuZ2VzIGluCi0Jc3lzcm9mZi5pbmZvLgotCi0JKiBzeXNkdW1wLmMgKHN5c3JvZmZfc3dhcF90cl9pbiwgc3lzcm9mZl9wcmludF90cl9vdXQpOiBOZXcKLQlmdW5jdGlvbnMuCi0KLQkqIHN5c3JvZmYuaW5mbyAodHIpOiB0aGUgdHIgYmxvY2sgaXMgYSBzcGVjaWFsIGNhc2UgLS0tIGEgYmxvY2sKLQl3aXRob3V0IGNvbnRlbnRzIC0tLSB3aGljaCBjYW4ndCBiZSBoYW5kbGVkIGJ5IGdlbmVyYXRlZCBjb2RlLgotCShkZW4sIGRwcCk6IG9ubHkgZmlyc3QgYnl0ZSBpcyBwcmVzZW50IGZvciBERU5lbmQsIERQUGVuZC4KLQkoZHN5KTogZGVzY3JpYmUgYSBjb25kaXRpb25hbCBwb3J0aW9uIG9mIGJsb2NrLCByZW5hbWUgc29tZSBmaWVsZHMuCi0JKGRwcyk6IGRlc2NyaWJlIGEgY29uZGl0aW9uYWwgcG9ydGlvbiBvZiBibG9jay4KLQkoZGZsKTogcmVtb3ZlZC4KLQotCSogc3lzaW5mby55ICh5eWVycm9yKTogd3JpdGUgZXJyb3IgbWVzc2FnZSB0byBzdGFuZGFyZCBlcnJvci4KLQotVGh1IEp1bCAxMyAxMDo0Mzo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgYXJwYXJzZS5oIGFuZCBzeXNpbmZvLmguCi0JKG1vc3RseWNsZWFuKTogUmVtb3ZlIHkub3V0cHV0LgotCShjbGVhbik6IFJlbW92ZSBzeXNyb2ZmLCBzeXNyb2ZmLmMsIHN5c3JvZmYuaCwgYW5kIHN5c2luZm8uCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogQ2FzdCBtZW1zZXQgYXJnIHRvIHNpemVfdC4KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBMaWtld2lzZS4KLQotCSogbm0uYyAoSEFWRV9TQlJLKTogRGVmaW5lIGV4ZWNwdCBvbiBhbWlnYWRvcyBhbmQgV0lORE9XU19OVC4KLQkoc3RydWN0IHNpemVfc3ltKTogRGVmaW5lLgotCShzaG93X3N0YXRzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkIHVuZG9jdW1lbnRlZCBvcHRpb24gInN0YXRzIi4KLQkobWFpbik6IFByaW50IG1lbW9yeSBzdGF0cyBpZiByZXF1ZXN0ZWQuCi0JKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIHNvcnRfeCwgc29ydF95KTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG51bWVyaWNfZm9yd2FyZCk6IFVzZSBtaW5pc3ltYm9scyByYXRoZXIgdGhhbiBhc3ltYm9scy4KLQkobm9uX251bWVyaWNfZm9yd2FyZCk6IExpa2V3aXNlLgotCShzaXplX2ZvcndhcmQxKTogUmVuYW1lIGZyb20gc2l6ZV9mb3J3YXJkLiAgVXNlIG1pbmlzeW1ib2xzLgotCShzaXplX2ZvcndhcmQyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc29ydF9zeW1ib2xzX2J5X3NpemUpOiBUYWtlIG5ldyBhcmd1bWVudHMgZHluYW1pYywgc2l6ZSwgYW5kCi0Jc3ltc2l6ZXAuICBVc2UgbWluaXN5bWJvbHMuICBEb24ndCBzdG9yZSB0aGUgc2l6ZSBiYWNrIGluIHRoZQotCXN5bWJvbDsgc3RvcmUgaW4gYSBuZXdseSBhbGxvY2F0ZSBzdHJ1Y3Qgc2l6ZV9zeW0gYXJyYXkuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBSZWFkIG1pbmlzeW1ib2xzIHJhdGhlciB0aGFuIGFzeW1ib2xzLiAgU2V0Ci0Jc29ydF8qIHZhcmlhYmxlcy4gIENhbGwgcHJpbnRfc2l6ZV9zeW1ib2xzIGlmIHNvcnRpbmcgYnkgc2l6ZS4KLQkoZmlsdGVyX3N5bWJvbHMpOiBUYWtlIG5ldyBhcmd1bWVudHMgZHluYW1pYyBhbmQgc2l6ZS4gIFVzZQotCW1pbmlzeW1ib2xzLgotCShwcmludF9zeW1ib2xzKTogTGlrZXdpc2UuICBDYWxsIHByaW50X3N5bWJvbCBmb3IgYWN0dWFsIHByaW50aW5nLgotCShwcmludF9zaXplX3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1XZWQgSnVsIDEyIDEwOjQzOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25fc3RhYnMpOiBPbmx5IHByaW50IGVhY2ggc3RhYnMgc2VjdGlvbgotCW9uY2UuCi0JKGNvbXBhcmVfcmVsb2NzKTogTWFrZSBpdCBjbGVhciB0byBnY2MgdGhhdCB0aGlzIGFsd2F5cyByZXR1cm5zIGEKLQl2YWx1ZS4KLQotV2VkIEp1bCAxMiAxMDo0MDoyMyAxOTk1ICBILkouIEx1ICA8aGpsQG55bmV4c3QuY29tPgotCi0JKiBvYmpjb3B5LmMgKHNpbXBsZV9jb3B5KTogUHJlc2VydmUgZXJybm8gb24gZmFpbHVyZS4KLQkoc21hcnRfcmVuYW1lKTogUHJpbnQgZXJyb3IgbWVzYWdlIGlmIHNpbXBsZV9jb3B5IGZhaWxzLgotCi1UdWUgSnVsIDExIDEzOjEwOjUyIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jOiByZS1pbmRlbnRlZCBmaWxlLgotCShtb2R1bGUpOiByZWFkIGJsb2NrcyBzZXF1ZW50aWFsbHkgaW5zdGVhZCBvZiB0cnlpbmcgdG8gcGFyc2UKLQl0aGVtLCBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgY2hhbmdpbmcgdGhlIHBhcnNlciByZWNvZ25pemUgdGhlCi0JZGlmZmVyZW5jZSBiZXR3ZWVuIGEgRFBTc3RhcnQgYW5kIERQU2VuZCBibG9jay4KLQkoZ2V0b25lKTogQWRkIGJyZWFrJ3MgYmV0d2VlbiBzd2l0Y2ggYmxvY2tzIGFzIGFwcHJvcHJpYXRlLgotCShvYmplY3RfYm9keV9saXN0KTogcGFyc2UgYmxvY2tzIGFjY29yZGluZyB0byBzeXNyb2ZmIHNwZWMuCi0KLU1vbiBKdWwgMTAgMTI6Mzc6MjUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHBvc2VpZG9uLmN5Z251cy5jb20+Ci0KLQkqIHN5c3JvZmYuaW5mbzogcmUtaW5kZW50ZWQgZmlsZSwgcHJpb3IgZm9ybWF0dGluZyB3YXMgY29uZnVzaW5nCi0JYmVjYXVzZSBpdCB3YXMgaW5kZW50YXRpb24gZGlkIG5vdCByZWZsZWN0IG5lc3Rpbmcgb2YgY29uZGl0aW9uYWwKLQlyZWNvcmRzLiAgQ2hhbmdlICJzcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IiByZWNvcmQgaW4gaGQgcmVjb3JkCi0JZnJvbSBiaXQgdG8gYnl0ZS4KLQotCSogc3lzaW5mby55IChjb25kX2l0X2ZpZWxkKTogVXNlIHhjYWxsb2MgaW5zdGVhZCBvZiBjYWxsb2MuCi0KLQkqIHNyY29udi5jICh3cl9jcyk6IFJlZm9ybWF0dGVkIGNzIGhlYWRlciBhcnJheSwgdGFnIGVhY2ggYnl0ZQotCXdpdGggYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGZpZWxkLgotCSh3cl91bml0X2luZm8pOiBVc2UgU0VFS19TRVQgbWFjcm8gaW5zdGVhZCBvZiBjb25zdGFudCAwLgotCShtYWluKTogVXNlIEZPUEVOX1dCIG1hY3JvIGluc3RlYWQgb2YgbGl0ZXJhbCAid2IiLgotCSogc3lzcm9mZi5pbmZvOiBSZW1vdmUgZmRsIChkZmwpIGZpZWxkIGZyb20gY3MgYmxvY2suICBDb21wYXJlCi0JcHRyLT50eXBlIHdpdGggRURfVFlQRV9DT05TVCBpbnN0ZWFkIG9mIGNvbnN0YW50IDIgaW4gZWQgYmxvY2suCi0KLVR1ZSBKdWwgIDQgMTQ6NDg6NDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBubS5jIChzaXplX2ZvcndhcmQpOiBDaGVjayB5ZiBhZ2FpbnN0IHluLCBub3QgeG4uCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogUmVjb3JkIGFsbCBvdXRwdXQgQkZEJ3MsIGFuZCBjbG9zZQotCXRoZW0gYmVmb3JlIHVubGlua2luZyB0aGVtIGFuZCByZW1vdmluZyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQl0byBhdm9pZCBORlMgcHJvYmxlbXMuCi0KLQkqIGFyLmMgKHJlcGxhY2VfbWVtYmVycyk6IEluIHZlcmJvc2UgbWVzc2FnZXMsIHVzZSAncicgd2hlbgotICAgICAgICByZXBsYWNpbmcgYSBtZW1iZXIsIGFuZCAnYScgd2hlbiBhZGRpbmcgb25lLgotCi0JKiBhci5jIChhcl90cnVuY2F0ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG5vcm1hbGl6ZSk6IENoYW5nZSByZXR1cm4gdHlwZSB0byBjb25zdCBjaGFyICouICBBZGQgYWJmZAotCWFyZ3VtZW50LiAgQ2hhbmdlIGFsbCBjYWxsZXJzLiAgSWYgYXJfdHJ1bmNhdGUsIGNob3AgdGhlIGZpbGVuYW1lCi0JdG8gYWJmZC0+YXJfbWF4X25hbWVsZW4uCi0JKG1haW4pOiBGb3IgdGhlICdmJyBtb2RpZmllciwgc2V0IGFyX3RydW5jYXRlIHRvIHRydWUuICBEb24ndAotCWNoYW5nZSBxdWlja19hcHBlbmQgdG8gcmVwbGFjZSBpZiBhcl90cnVuY2F0ZSBpcyB0cnVlLgotCShkb19xdWlja19hcHBlbmQpOiBJZiBhcl90cnVuY2F0ZSwgc2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQuCi0JKHdyaXRlX2FyY2hpdmUpOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIGFyLjE6IERvY3VtZW50ICdmJyBtb2RpZmllci4KLQotCSogb2JqY29weS5jIChlbnVtIHN0cmlwX2FjdGlvbik6IERlZmluZSBzdHJpcF91bm5lZWRlZC4KLQkoT1BUSU9OX1NUUklQX1VOTkVFREVEKTogRGVmaW5lLgotCShzdHJpcF9vcHRpb25zKTogQWRkICJzdHJpcC11bm5lZWRlZCIuCi0JKGNvcHlfb3B0aW9ucyk6IExpa2V3aXNlLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXN0cmlwLXVubmVlZGVkLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCShpc19zdHJpcF9zZWN0aW9uKTogU3RyaXAgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHN0cmlwX3VubmVlZGVkLgotCShmaWx0ZXJfc3ltYm9scyk6IElmIHN0cmlwX3VubmVlZGVkLCBvbmx5IGtlZXAgQlNGX0tFRVAgc3ltYm9scy4KLQkoY29weV9vYmplY3QpOiBJZiBzdHJpcF9hbGwsIGRpc2NhcmQgc3ltYm9scyB3aXRob3V0IGNoZWNraW5nCi0JZGlzY2FyZF9sb2NhbHMuCi0JKGNvcHlfb2JqZWN0KTogQ2FsbCBmaWx0ZXJfc3ltYm9scyBpZiBzdHJpcF91bm5lZWRlZC4KLQkoc2V0dXBfc2VjdGlvbik6IFN0cmlwIGRlYnVnZ2luZyBzZWN0aW9ucyBpZiBzdHJpcF91bm5lZWRlZC4KLQkoY29weV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4pOiBIYW5kbGUgT1BUSU9OX1NUUklQX1VOTkVFREVELgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgLS1zdHJpcC11bm5lZWRlZC4KLQotTW9uIEp1bCAgMyAxNDoxNjo0NyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi13aW4zMik6IE5ldyBjb25maWd1cmF0aW9uLgotCSogZGxsdG9vbC5jIChraWxsYXQsIHhsYXRlLCB1c2FnZSwgbG9uZ19vcHRpb25zLCBtYWluKToKLQlVbmRlcnN0YW5kIGFuZCBjb3BlIHdpdGggLWsgb3B0aW9uLgotCi1TYXQgSnVsICAxIDEyOjI1OjE1IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBhci5jOiAoZXh0cmFjdF9maWxlKTogIENoYW5nZSAiI2lmIFBPU0lYX1VUSU1FIiB0bwotCSIjaWZkZWYgUE9TSVhfVVRJTUUiIHRvIG1hdGNoIG90aGVyIHRlc3RzIG9mIFBPU0lYX1VUSU1FCi0JYW5kIGF2b2lkIGxvc3NhZ2Ugd2hlbiBQT1NJWF9VVElNRSBpcyBub3QgZGVmaW5lZCBhdCBhbGwuCi0KLVdlZCBKdW4gMjggMTc6NTE6MjQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYXIuYzogKHByaW50X2NvbnRlbnRzLmMsIGV4dHJhY3RfZmlsZSwgZG9fcXVpY2tfYXBwZW5kKToKLQlNYWxsb2MgYnVmZmVycyByYXRoZXIgdGhhbiBhbGxvY2F0ZSBvbiBzdGFjayAoc28gaXQgd29ya3MKLQlvbiBOVCkuCi0JKiBkZWZsZXgubDogTmFtZXMgY2FuIGhhdmUgYW4gQCBpbiB0aGVtLgotCSogZGxsdG9vbC5jOiBMb2FkcyBvZiBzdHVmZi4gQ2FuIG5vdyBnZW5lcmF0ZSAuaW1wIGZpbGVzIHdoaWNoCi0Jd29yayB3aXRoIE5UIC5kbGxzLgotCi1UaHUgSnVuIDIyIDE5OjEwOjUwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2UuaW4gKGRlbWFuZ2xlLmMubyk6IFJlbW92ZS4KLQkoYXJwYXJzZS5oKTogRGVwZW5kIG9uIGFycGFyc2UuYyBpbnN0ZWFkIG9mIGFycGFyc2UueS4KLQotV2VkIEp1biAyMSAxNzozMjo0NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogRG9uJ3QgaW5jbHVkZSBpbmZvIGhlcmUuCi0JKGRpc3RzdHVmZik6IEluY2x1ZGUgaXQgaGVyZS4KLQkocmVhbGNsZWFuKTogUmVtb3ZlICouaW5mby4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3JlbG9jcyk6IElmIHJlbG9jYXRpb24gZW50cmllcyBoYXZlIHRoZSBzYW1lCi0JYWRkcmVzcywga2VlcCB0aGVtIGluIGZpbGUgb3JkZXIuCi0KLU1vbiBKdW4gMTkgMDk6MDY6NDkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZGxsdG9vbC5jOiBDaGFuZ2UgbmFtZXMgb2YgZ2VuZXJhdGVkIGZpbGVzLiAuKi5zLT4gLSoucwotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc2VjdGlvbl9zdGFicyk6ICBDaGVjayBmb3IgbmFtZXMKLQl3aGljaCBhcmUgc3VwZXJzZXRzIG9mIHNlbGVjdGVkIG5hbWVzLgotCi1XZWQgSnVuIDE0IDE5OjQzOjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRsbHRvb2wuYyAobXRhYmxlLCBBUk0ganVtcCk6IE11c3QgcmVkaXJlY3QgdmlhIHBjIG9mZnNldGFibGUgcHRyLgotCi1XZWQgSnVuIDE0IDEzOjI3OjIyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRlZmxleC5sLCBkZWZwYXJzZS55LCBkbGx0b29sLmM6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IFN1cHBvcnQgZm9yIHRoZW0uCi0KLU1vbiBKdW4gMTIgMTE6Mjc6NTQgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc3lzZHVtcC5jOiBJbmNsdWRlIHN5c2RlcC5oCi0JKG1haW4pOiBPcGVuIGlucHV0IHdpdGggRk9QRU5fUkIuCi0KLUZyaSBKdW4gIDkgMTc6MjY6MTEgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHdpZGVfb3V0cHV0KTogTmV3IGZsYWcgdmFyaWFibGUuCi0JKHVzYWdlKTogUHJpbnQgbmV3IC13LCAtLXdpZGUgb3B0aW9ucy4KLQkobG9uZ19vcHRpb25zKTogQWRkIC0td2lkZSBzdXBwb3J0LgotCShkdW1wX3NlY3Rpb25faGVhZGVyKTogSWYgLS13aWRlLCBkb24ndCBwcmludCBhIG5ld2xpbmUgYmV0d2VlbgotCXRoZSBzZWN0aW9uJ3MgZmlyc3QgbGluZSBhbmQgdGhlIGZsYWdzLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBVc2UgdW5zaWduZWQgY29tcGFyaXNvbnMgZm9yIHRoZSBiaW5hcnkKLQlzZWFyY2gsIG5vdCBzaWduZWQuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBJZiAtLXdpZGUsIGRvbid0IHB1dCBhIFxuIGJldHdlZW4gdGhlCi0JZGlzYXNzZW1ibHkgb3V0cHV0IGFuZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uLgotCShtYWluKTogU3VwcG9ydCAtdyBvcHRpb24gYmVpbmcgdGhlIHNhbWUgYXMgLS13aWRlLgotCi1UaHUgSnVuICAxIDE3OjA5OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTYXQgTWF5ICA2IDA4OjUyOjI0IDE5OTUgIEguSi4gTHUgKGhqbEBueW5leHN0LmNvbSkKLQotCSogb2JqY29weS5jIChzbWFydF9yZW5hbWUpOiBtYWtlIGl0IHNtYXJ0ZXIsIGNsZWFuIHVwCi0JICBpZiByZW5hbWUgKCkgZmFpbHMuCi0KLVR1ZSBNYXkgMzAgMTQ6MjQ6MTUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IERlbGV0ZSBsaW5lcyB3aXRoIGxvdHMgb2YgIyMjIyBiZWNhdXNlIGZvdXIgb3IgbW9yZQotCWluZGljYXRlIGEgcG9pbnQgZm9yIG1ha2VmaWxlIGZyYWdtZW50IHN1YnN0aXR1dGlvbi4KLQotVHVlIE1heSAgOSAxNzoxNzowNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbmxtY29udiBvbiBQb3dlclBDIGVhYmkgYW55IG1vcmUsIGl0Ci0JaXMgbm90IG5lZWRlZC4KLQotVGh1IEFwciAyNyAyMDoyMToyNCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNUKTogRGVmaW5lLgotCShSVU5URVNUKTogVXNlIG9uZSBpbiBzb3VyY2UgdHJlZSBpZiBwcmVzZW50LgotCShjaGVjayk6IFNldCBgcm9vdG1lJyBmb3IgJChFWFBFQ1QpLgotCi1XZWQgQXByIDI2IDE4OjI2OjIxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNyY29udi5jIChtYWluKTogQWRkIHN1cHBvcnQgZm9yIC1uIG9wdGlvbiB3aGljaCBkaXNhYmxlcwotCXByZXNjYW4gb2YgY29tbW9uIHN5bWJvbHMuCi0JKHdyX29iKTogSWYgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLCBmaWxsIHdpdGggemVyb3MuCi0KLVR1ZSBBcHIgMjUgMTk6MTQ6MzcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChkdW1wX3NlY3Rpb25faGVhZGVyKTogRGlzcGxheSBsb2FkIGFkZHJlc3MgYWZ0ZXIKLQl2aXJ0dWFsIG1lbW9yeSAocnVuLXRpbWUpIGFkZHJlc3MuCi0KLVdlZCBBcHIgMTkgMDk6NDQ6MDYgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjcGx1cy1kZW0ubyk6IFBhc3MgLURWRVJTSU9OPSciJChWRVJTSU9OKSInIHRvIHRoZQotICAgICAgICBjb21waWxlLgotCShERU1BTkdMRVJfUFJPRyk6IE5vIGxvbmdlciB1c2VzIHZlcnNpb24uby4KLQotTW9uIEFwciAxMCAxMzoyOTo0OSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQlNZXJnZSBpbiBzdXBwb3J0IGZvciBNYWMgTVBXIGFzIGEgaG9zdC4KLQkoT2xkIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCi0JKiBtcHctY29uZmlnLmluIChUREVGSU5FUyk6IERlZmluZSBhcyBlbXB0eSBpbiBtYWtlZmlsZSBmcmFnLgotCi0JKiBtcHctY29uZmlnLmluOiBDcmVhdGUgbWsudG1wLCBkZWZpbmUgQVJDSERFRlMgaW4gaXQuCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgY29uZmlndXJlIGZyYWdtZW50IGZvciBiaW51dGlscy4KLQkqIG1wdy1tYWtlLmluIChpbnN0YWxsLW9ubHkpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogQWxzbyBkZXBlbmQgb24gaW5zdGFsbC1vbmx5LgotCi0JKiBtcHctbWFrZS5pbiAoY3BsdXNmaWx0KTogUmVuYW1lZCBmcm9tIGMrK2ZpbHQuCi0JKElOQ0xVREVTKTogQWRkIG1vcmUgcGF0aHMuCi0KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIG1ha2VmaWxlIGZyYWdtZW50IGZvciBiaW51dGlscy4KLQkoTm9ybWFsbHkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbi4pCi0KLU1vbiBNYXIgMjcgMTE6NTI6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhci5jICh3cml0ZV9hcmNoaXZlKTogQ2FsbCBtYWtlX3RlbXBuYW1lIHRvIGdldCBvdXRwdXQgZmlsZQotCW5hbWUsIHJhdGhlciB0aGFuIHVzaW5nIGEgZml4ZWQgbmFtZSBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZS4KLQotCSogb2JqY29weS5jIChtYWtlX3RlbXBuYW1lKTogQ29weSBmcm9tIGhlcmUuLi4KLQkqIGJ1Y29tbS5jIChtYWtlX3RlbXBuYW1lKTogLi4udG8gaGVyZSwgYW5kIG1ha2UgZ2xvYmFsLgotCSogYnVjb21tLmggKG1ha2VfdGVtcG5hbWUpOiBEZWNsYXJlLgotCi1GcmkgTWFyIDI0IDExOjQ3OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RyaW5ncy5jOiBJbmNsdWRlICJiZmQuaCIgYmVmb3JlIG90aGVyIGhlYWRlcnMuICBJbmNsdWRlCi0JInN5c2RlcC5oIi4KLQkqIGJ1Y29tbS5jIChwcmludF9hcmVsdF9kZXNjcik6IENhc3Qgc3RfdWlkIGFuZCBzdF9naWQgdG8gbG9uZywKLQlhbmQgcHJpbnQgdGhlbSB3aXRoICVsZC4KLQotRnJpIE1hciAxMCAxMzowOTo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoc3RyaXBfb3B0aW9ucyk6IEFkZCAtLWtlZXAtc3ltYm9sLgotCShjb3B5X29wdGlvbnMpOiBMaWtld2lzZS4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1rZWVwLXN5bWJvbCBhbmQgLUsuCi0JKHN0cmlwX3VzYWdlKTogTGlrZXdpc2UuCi0JKGtlZXBfc3ltYm9scyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGlzX3N0cmlwX3N5bWJvbCk6IEFkanVzdCB0aGUgcmV0dXJuIHZhbHVlIGFjY29yZGluZyB0bwotCWtlZXBfc3ltYm9scy4KLQkoc3RyaXBfbWFpbik6IEhhbmRsZSAtSy4gIEZvciAtTiwgY2hlY2sgdGhhdCAtSyB3YXMgbm90IGdpdmVuLgotCShjb3B5X21haW4pOiBMaWtld2lzZS4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMSwgc3RyaXAuMTogRG9jdW1lbnQgLUsuCi0KLU1vbiBNYXIgIDYgMTM6MzM6NDcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfYXJjaGl2ZSk6IENoZWNrIHJlc3VsdCBvZiBta2Rpci4KLQkoY29weV9tYWluKTogQ2FzdCBhbiB4bWFsbG9jIHJlc3VsdC4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IEJyZWFrIGxvbmcgZm9ybWF0IHN0cmluZyBpbnRvIHNob3J0ZXIgb25lcy4KLQotTW9uIE1hciAgNiAxMzo0NjoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJ1Y29tbS5jIChsaXN0X3N1cHBvcnRlZF90YXJnZXRzKTogTmV3IGZ1bmN0aW9uLgotCSogYnVjb21tLmggKGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMpOiBEZWNsYXJlLgotCSogYXIuYyAodXNhZ2UpOiBDYWxsIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMuCi0JKiBubS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChjb3B5X3VzYWdlLCBzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc2l6ZS5jICh1c2FnZSk6IExpa2V3aXNlLgotCSogc3RyaW5ncy5jICh1c2FnZSk6IExpa2V3aXNlLgotCi1UdWUgRmViIDI4IDE1OjEzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogQ2FzdCBzdF9zaXplIHRvIGxvbmcgYmVmb3JlCi0JcGFzc2luZyBpdCB0byBmcHJpbnRmLgotCi1GcmkgRmViIDE3IDEzOjM2OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChzdHJ1Y3Qgc2VjdGlvbl9saXN0KTogQWRkIGZpZWxkcyByZW1vdmUsIHNldF9mbGFncywKLQlhbmQgZmxhZ3MuICBDaGFuZ2UgYWRqdXN0IGZyb20gYm9vbGVhbiB0byBlbnVtLgotCShyZW1vdmVfc2VjdGlvbnMpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShzZWN0aW9uc19yZW1vdmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29weV9vcHRpb25zKTogQWRkIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKHBhcnNlX2ZsYWdzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZmluZF9zZWN0aW9uX2xpc3QpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShpc19zdHJpcF9zeW1ib2wpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgZnJvbSBpbnQgdG8gYm9vbGVhbi4KLQkoaXNfc3RyaXBfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZpbHRlcl9zeW1ib2xzKTogQ2FsbCBpc19zdHJpcF9zZWN0aW9uLgotCShjb3B5X29iamVjdCk6IFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBjaGVjayBmb3Igc3BlY2lmaWVkIGZsYWdzIG9yCi0JVk1BLiAgQ2FsbCBmaWx0ZXJfc3ltYm9scyBpZiBhbnkgc2VjdGlvbnMgYXJlIGJlaW5nIHJlbW92ZWQuCi0JKHNldHVwX3NlY3Rpb24pOiBVc2UgZmluZF9zZWN0aW9uX2xpc3QgZnVuY3Rpb24gcmF0aGVyIHRoYW4KLQlsb29raW5nIHRocm91Z2ggcmVtb3ZlX3NlY3Rpb25zIGFuZCBhZGp1c3Rfc2VjdGlvbnMuICBIYW5kbGUKLQktLXNldC1zZWN0aW9uLWZsYWdzLgotCShjb3B5X3NlY3Rpb24pOiBVc2UgZmluZF9zZWN0aW9uX2xpc3QgcmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoCi0JcmVtb3ZlX3NlY3Rpb25zLgotCShzdHJpcF9tYWluKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGluc3RlYWQgb2YgYWRkaW5nIGl0ZW1zIHRvCi0Jc2VjdGlvbnNfcmVtb3ZlZC4KLQkoY29weV9tYWluKTogVXNlIGZpbmRfc2VjdGlvbl9saXN0IGluc3RlYWQgb2YgYWRkaW5nIGl0ZW1zIHRvCi0Jc2VjdGlvbnNfcmVtb3ZlZCBhbmQgYWRqdXN0X3NlY3Rpb25zLiAgSGFuZGxlIC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IERvY3VtZW50IC0tc2V0LXNlY3Rpb24tZmxhZ3MuCi0KLVR1ZSBGZWIgMTQgMTg6MDM6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKHdpdGhfc291cmNlX2NvZGUpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCSh1c2FnZSk6IE1lbnRpb24gLVMvLS1zb3VyY2UuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXNvdXJjZS4KLQkocHJldl9mdW5jdGlvbm5hbWUsIHByZXZfbGluZSk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3QgcHJpbnRfZmlsZV9saXN0KTogRGVmaW5lLgotCShwcmludF9maWxlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNraXBfdG9fbGluZSwgc2hvd19saW5lKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYWxsIHNob3dfbGluZSB0byBoYW5kbGUgLWwgYW5kIC1TLgotCShtYWluKTogSGFuZGxlIC1TLgotCSogYmludXRpbHMudGV4aSwgb2JqZHVtcC4xOiBEb2N1bWVudCAtUy8tLXNvdXJjZS4KLQotVGh1IEZlYiAgOSAxNjoxMTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV91c2FnZSk6IFJlbmFtZSBwYXJhbWV0ZXIgdG8gYXZvaWQgc2hhZG93aW5nLgotCShzdHJpcF91c2FnZSk6IExpa2V3aXNlLgotCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2FkZCk6IERlZmluZS4KLQkoYWRkX3NlY3Rpb25zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tYWRkLXNlY3Rpb24uCi0JKGNvcHlfdXNhZ2UpOiBNZW50aW9uIC0tYWRkLXNlY3Rpb24uCi0JKGNvcHlfb2JqZWN0KTogQWRkIHNlY3Rpb25zIGZyb20gdGhlIGFkZF9zZWN0aW9ucyBsaXN0LgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1hZGQtc2VjdGlvbi4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1hZGQtc2VjdGlvbi4KLQotV2VkIEZlYiAgMSAxNTowNDo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBQYXNzIHNlY3Rpb24gb2Zmc2V0LCBub3QgYWJzb2x1dGUKLQlhZGRyZXNzLCB0byBiZmRfZmluZF9uZWFyZXN0X2xpbmUuCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogRG9uJ3QgdXNlIGNvbnN0IHdpdGgKLQlyZWxvY19ob3d0b190eXBlLgotCi1UaHUgSmFuIDI2IDE4OjUwOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqZHVtcC5jIChjb21wYXJlX3N5bWJvbHMpOiBVc2UgYmZkX2FzeW1ib2xfdmFsdWUgKFZBUikgcmF0aGVyCi0JdGhhbiBWQVItPnZhbHVlLgotCShvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBMaWtld2lzZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IERvbid0IGNoYW5nZSB0aGUgc3ltYm9sIHZhbHVlcy4gIEl0IGNhbgotCWNvbmZ1c2UgYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQotVGh1IEphbiAyNiAxMjowMzo1NiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgZm9yIHBvd2VycGMtKi1lYmFpLgotCi1XZWQgSmFuIDE4IDEwOjAyOjEyIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBjb2ZmZHVtcC5jOiBJbmNsdWRlIHN5c2RlcC5oLgotCShkdW1wX2NvZmZfdHlwZSk6IEhhbmRsZSBjb2ZmX3NlY2RlZl90eXBlLgotCSogY29mZmdyb2suYyA6IEluY2x1ZGUgc3lzZGVwLmguCi0JKiBzcmNvbnYuYzogSW5jbHVkZSBsaWJpYmVydHkuaAotCShhYnNvbHV0ZV9wLCBkdHlfc3RhcnQsIGR0eV9lbmQsIGR1bXBfdHJlZV9zdHJ1Y3R1cmUpOiBSZW1vdmUuCi0KLVdlZCBKYW4gMTggMTI6MjQ6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb2ZmZHVtcC5jIChkdW1wX2NvZmZfc2NvcGUpOiBDYXN0IHBvaW50ZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IKLQlwcmludGYuCi0JKiBjb2ZmZ3Jvay5jOiBJbmNsdWRlIGJ1Y29tbS5oLiAgRG9uJ3QgZGVjbGFyZSB4bWFsbG9jLgotCShwdXNoX3Njb3BlKTogRGVjbGFyZSB0eXBlIG9mIHBhcmFtZXRlciBsaW5rLgotCSogc2l6ZS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSogc3Jjb252LmM6IEluY2x1ZGUgYnVjb21tLmguCi0JKGZpbmRfYmFzZSk6IERlY2xhcmUgYXQgdG9wIG9mIGZpbGUuCi0JKHdyX2hkKTogQWRkIGRlZmF1bHQgY2FzZSB0byBhcmNoaXRlY3R1cmUgc3dpdGNoLgotCSh3cl9kcHNfc3RhcnQpOiBEZWNsYXJlIHR5cGUgb2YgcGFyYW1ldGVyIG5lc3QuCi0JKHdyX2R1KTogQ29tbWVudCBvdXQgdmFyaWFibGVzIHVzZWQgb25seSBpbiBjb21tZW50ZWQgb3V0IGJsb2Nrcy4KLQkod3JfZHVzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCSh3cl9zYyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIG15aW5mbywgbG93LCBhbmQgaGlnaC4KLQkqIHN0cmluZ3MuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkqIHN5c2R1bXAuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0KLVR1ZSBEZWMgMjAgMTk6MTM6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogSWdub3JlICdmJyBtb2RpZmllciB1c2VkIG9uIEhQL1VYIDkuCi0KLVRodSBEZWMgMTUgMTc6MzQ6MTIgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBhci5jLCBubS5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYzogSW5jbHVkZSBwcm9ncmVzcy5oLgotCSogYXIuYywgbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMgKG1haW4pOiBBZGQgU1RBUlRfUFJPR1JFU1MKLQlhbmQgRU5EX1BST0dSRVNTLgotCSogYXIuYyAobWFwX292ZXJfbWVtYmVycywgb3Blbl9pbmFyY2gpOiBDYWxsIFBST0dSRVNTLgotCSogbm0uYyAobWFpbiwgZGlzcGxheV9hcmNoaXZlLCBmaWx0ZXJfc3ltYm9scywgcHJpbnRfc3ltYm9scyk6Ci0JQ2FsbCBQUk9HUkVTUy4KLQotCSogb2JqY29weS5jIChjb3B5X3VzYWdlKTogQnJlYWsgdXAgbG9uZyB1c2FnZSBzdHJpbmcuCi0KLVdlZCBEZWMgMTQgMTU6NTE6NTYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IERvbid0IGJvdGhlciBzZXR0aW5nIHN0YXR1cyBhZnRlcgotCW5vbmZhdGFsKCkgImNhbGwiLCBiZWNhdXNlIGl0IHdvbid0IHJldHVybi4KLQotRnJpIERlYyAgOSAwMDoyMjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogRG9uJ3Qgc3dpdGNoIGEgcmVsb2MgdG8gdXNlCi0JdGhlIHNlY3Rpb24gc3ltYm9sIGlmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLgotCi1UaHUgRGVjICA4IDE0OjQ1OjUwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoYWRkX3N0cmlwX3N5bWJvbCk6IENhc3QgcmV0dXJuIHZhbHVlIG9mIHhtYWxsb2MuCi0KLVdlZCBOb3YgMzAgMTE6MDU6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBydGwuY3lnbnVzLmNvbT4KLQotCSogYXIuYyAocmVwbGFjZV9tZW1iZXJzKTogUGFzcyBjdXJyZW50LT5maWxlbmFtZSB0byBub3JtYWxpemUgd2hlbgotCWNoZWNraW5nIGZvciBkdXBsaWNhdGVzLCBiZWNhdXNlIHRoZSBmaWxlbmFtZSBvZiBhIG5ld2x5IGFkZGVkCi0JZmlsZSB3aWxsIG5vdCBoYXZlIGJlZW4gbm9ybWFsaXplZCB5ZXQuCi0KLVRodSBOb3YgMTcgMTU6MDA6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogRG9uJ3QgY2FsbCBkb19xdWlja19hcHBlbmQgaWYgYW55IG9mIHRoZSBhcmNoaXZlCi0JbmFtZXMgYXJlIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuCi0KLQkqIG9iamNvcHkuYyAobWFpbik6IEZpeCBpc19zdHJpcCB0ZXN0LiAgRnJvbQotCXBpcmtlckBlaXVuaXgudHV3aWVuLmFjLmF0IChNYXJ0aW4gUGlya2VyKS4KLQotVGh1IE5vdiAxNyAxNTozNzoxOSAxOTk0ICBNYXJrIFcuIEVpY2hpbiAgPGVpY2hpbkBjeWdudXMuY29tPgotCi0JKiBvYmpjb3B5LmMgKGFkZF9zdHJpcF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24sIGFkZHMgYSBuYW1lIHRvIGFuCi0JZXhwbGljaXQgbGlzdCBvZiBzeW1ib2xzIHRvIHN0cmlwLgotCShpc19zdHJpcF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24sIHJlcG9ydHMgd2hldGhlciB0aGUgbmFtZSBhcmd1bWVudAotCWlzIGluIHRoZSBleHBsaWNpdCBsaXN0LgotCShmaWx0ZXJfc3ltYm9scyk6IENoZWNrIGFnYWluc3QgaXNfc3RyaXBfc3ltYm9sIGFib3ZlIGFsbC4KLQkoc3RyaXBfbWFpbik6IFJlY29nbml6ZSAtTiBvcHRpb24uIElmIHVzZWQsIGRvbid0IGRlZmF1bHQgdG8KLQlzdHJpcF9hbGwuCi0JKGNvcHlfbWFpbik6IFJlY29nbml6ZSAtTiBvcHRpb24uCi0JKHN0cmlwX3VzYWdlKTogRG9jdW1lbnQgLU4gYW5kIC0tc3RyaXAtc3ltYm9sIG9wdGlvbnMuCi0JKGNvcHlfdXNhZ2UpOiBEaXR0by4KLQkqIG9iamNvcHkuMSwgc3RyaXAuMSwgYmludXRpbHMudGV4aTogRG9jdW1lbnQgLU4gYW5kCi0JLS1zdHJpcC1zeW1ib2wgb3B0aW9ucy4KLQotVHVlIE5vdiAgOCAxMzoxMjo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCwgZGlzcGxheV9pbmZvX3RhYmxlKTogUGFzcyBhbgotCWFycmF5IHRvIHRtcGFyZywgcmF0aGVyIHRoYW4gTlVMTCwgc2luY2Ugc29tZSBzeXN0ZW1zIGNhbid0IGhhbmRsZQotCU5VTEwuCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogS2VlcCBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRoZQotICAgICAgICB0ZW1wb3JhcnkgZmlsZXMgd2UgY3JlYXRlZC4gIENsb3NlIGVhY2ggaW5wdXQgQkZEIGFmdGVyIHdlIG9wZW4KLSAgICAgICAgaXRzIHN1Y2Nlc3Nvci4KLQotTW9uIE5vdiAgNyAxNTo0ODozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdG8gMi41LjMuCi0KLVRodSBOb3YgIDMgMTk6MDQ6MzQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IEluc3RhbGwgaW5mbyBmaWxlcyBmcm9tIHdoYXRldmVyCi0JZGlyZWN0b3J5IHRoZXkgd2VyZSBmb3VuZCBpbi4KLQotCVBhdGNoIGZyb20gREogRGVsb3JpZToKLQkqIGNvbmZpZ3VyZS5iYXQ6IGRvIGMrK2ZpbHQgLT4gY3h4ZmlsdCByaWdodAotCi0JKiBzeXNpbmZvLnk6IEluY2x1ZGUgc3lzdGVtIGhlYWRlciBmaWxlcyBlYXJseSwgc28gYW55IHBvdGVudGlhbAotCWRlY2xhcmF0aW9uIG9mIGFib3J0KCkgb2NjdXJzIGJlZm9yZSBpdHMgdXNlLgotCi0JKiBzdHJpbmdzLmMgKHN0cmluZ3NfZmlsZSk6IFRyeSBvcGVuaW5nIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlCi0JZmlyc3QuCi0KLVdlZCBOb3YgIDIgMTU6NDQ6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhci5jIChtYWluKTogVHJlYXQgYXIgcXMgbGlrZSBhciBycy4KLQotVHVlIE9jdCAyNSAxNjoxOToyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoZ2FwX2ZpbGwpOiBFeHBsaWNpdGx5IGluaXRpYWxpemUsIGZvciBjbGFyaXR5LgotCShwYWRfdG9fc2V0LCBwYWRfdG8pOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoY29weV9vcHRpb25zKTogQWNjZXB0IC0tcGFkLXRvLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiAtLXBhZC10by4KLQkoY29weV9vYmplY3QpOiBTdXBwb3J0IC0tcGFkLXRvLgotCShjb21wYXJlX3NlY3Rpb25fdm1hKTogU29ydCBub24gbG9hZGFibGUgc2VjdGlvbnMgdG8gdGhlIGZyb250LgotCVNvcnQgc2VjdGlvbnMgd2l0aCB0aGUgc2FtZSBWTUEgYnkgc2l6ZS4KLQkoY29weV9tYWluKTogSGFuZGxlIC0tcGFkLXRvLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBEb2N1bWVudCAtLXBhZC10by4KLQotVGh1IE9jdCAyMCAxMzo1MTozMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoZ2FwX2ZpbGxfc2V0LCBnYXBfZmlsbCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb3B5X29wdGlvbnMpOiBBY2NlcHQgLS1nYXAtZmlsbC4KLQkoY29weV91c2FnZSk6IE1lbnRpb24gLS1nYXAtZmlsbC4KLQkoY29weV9vYmplY3QpOiBTdXBwb3J0IC0tZ2FwLWZpbGwuCi0JKGdldF9zZWN0aW9ucywgY29tcGFyZV9zZWN0aW9uX3ZtYSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShjb3B5X21haW4pOiBIYW5kbGUgLS1nYXAtZmlsbC4KLQkqIGJpbnV0aWxzLnRleGksIG9iamNvcHkuMTogRG9jdW1lbnQgLS1nYXAtZmlsbC4KLQotV2VkIE9jdCAxOSAxNDowOToxNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IEFkZCBhIGR1bW15IGVsc2UgY2xhdXNlIHRvIHRoZSBpZgotCXN0YXRlbWVudC4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0JKiBiaW51dGlscy50ZXhpLCBvYmpjb3B5LjE6IFJlbW92ZSBzcGVjaWFsIG1lbnRpb24gb2YgLS1zZXQtc3RhcnQKLQlhbmQgYGJpbmFyeScgb3V0cHV0IGZvcm1hdC4KLQotVHVlIE9jdCAxOCAxMToxMjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBJZiB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0IGlzIGBiaW5hcnknLAotCWFuZCB0aGUgc3RhcnQgYWRkcmVzcyB3YXMgbm90IHNldCB1c2luZyAtLXNldC1zdGFydCwgZGVmYXVsdCB0aGUKLQlzdGFydCBhZGRyZXNzIHRvIHplcm8uICBUaGlzIGhhY2sgaXMgYmVjYXVzZSB0aGUgYGJpbmFyeScgb3V0cHV0Ci0JZmlsZSBmb3JtYXQgdXNlcyB0aGUgc3RhcnQgYWRkcmVzcyB0byBzZXQgdGhlIHZpcnR1YWwgYWRkcmVzcyBvZgotCXRoZSBmaXJzdCBieXRlIGluIHRoZSBmaWxlLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xOiBBZGQgc29tZSBub3RlcyBvbiBnZW5lcmF0aW5nIFMtcmVjb3JkcwotCWFuZCBiaW5hcnkgZmlsZXMuCi0KLQkqIG5tLmMgKHByaW50X3N5bWRlZl9lbnRyeSk6IENhbGwgcHJpbnRfc3ltbmFtZSB0byBwcmludCB0aGUKLQlzeW1ib2wgbmFtZSwgc28gdGhhdCAtLWRlbWFuZ2xlIHdvcmtzLgotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBSZW1vdmUgdG1wZGlyLgotCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2xpc3QpOiBBZGQgZmllbGRzIHVzZWQsIGFkanVzdCwgdmFsLgotCShhZGp1c3Rfc3RhcnQsIHNldF9zdGFydF9zZXQsIHNldF9zdGFydCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShhZGp1c3Rfc2VjdGlvbl92bWEsIGFkanVzdF9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShjb3B5X29wdGlvbnMpOiBBZGQgLS1hZGp1c3Qtc3RhcnQsIC0tYWRqdXN0LXZtYSwKLQktLWFkanVzdC1zZWN0aW9uLXZtYSwgLS1hZGp1c3Qtd2FybmluZ3MsIC0tbm8tYWRqdXN0LXdhcm5pbmdzLAotCS0tc2V0LXN0YXJ0LgotCShwYXJzZV92bWEpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb3B5X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkoY29weV9vYmplY3QpOiBIYW5kbGUgLS1zZXQtc3RhcnQgYW5kIC0tYWRqdXN0LXN0YXJ0LgotCShzZXR1cF9zZWN0aW9uKTogQ29ycmVjdCB0eXBlIG9mIGxhc3QgYXJndW1lbnQgdG8gUFRSLiAgU2V0IHVzZWQKLQlmaWVsZCBpZiBzZWN0aW9uIGlzIHJlbW92ZWQuICBIYW5kbGUgLS1hZGp1c3Qtdm1hIGFuZAotCS0tYWRqdXN0LXNlY3Rpb24tdm1hLgotCShjb3B5X3NlY3Rpb24pOiBDb3JyZWN0IHR5cGUgb2YgbGFzdCBhcmd1bWVudCB0byBQVFIuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogTGlrZXdpc2UuCi0JKHN0cmlwX21haW4pOiBDbGVhciB1c2VkIGZpZWxkIHdoZW4gaGFuZGxpbmcgLVIuCi0JKGNvcHlfbWFpbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQkqIGJpbnV0aWxzLnRleGkgKG9iamNvcHkpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQkqIG9iamNvcHkuMTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLUZyaSBPY3QgMTQgMTQ6Mzg6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGNvbmZpZ2RpcnMpOiBSZW1vdmUgZGVmaW5pdGlvbi0tdGVzdHN1aXRlIGlzIG5vCi0JbG9uZ2VyIGNvbmZpZ3VyZWQuCi0JKiBNYWtlZmlsZS5pbiAodGVzdHN1aXRlKTogUmVtb3ZlIHRhcmdldC4KLQkoc2l0ZS5leHApOiBOZXcgdGFyZ2V0LgotCShjaGVjayk6IFJld3JpdGUuCi0JKGNsZWFuLCBkaXN0Y2xlYW4pOiBEb24ndCByZWN1ciBpbnRvIHRlc3RzdWl0ZSBkaXJlY3RvcnkuCi0KLVRodSBPY3QgMTMgMTk6MjQ6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNS4KLQkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgotCi1UdWUgT2N0IDExIDE1OjI2OjQyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKHN5c2R1bXAubyk6IERlcGVuZHMgdXBvbiBzeXNyb2ZmLmMuCi0KLU1vbiBPY3QgMTAgMTM6NTA6MzAgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGxpbmtfaW5wdXRzKTogUGFzcyAtVXIgZmxhZyB0byBsZCBzbyB0aGF0IHRoZQotCSAgY3Rvci9kdG9yIHRhYmxlcyBuZWVkZWQgYnkgQysrIHByb2dyYW1zIGFyZSBidWlsdC4KLQotU3VuIE9jdCAgOSAxODowNDowMCAxOTk0ICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzcmNvbnYubyk6IEFkZCBkZXBlbmRlbmNlIG9uIHN5c3JvZmYuYy4KLQotVHVlIE9jdCAgNCAxMjoxOTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICR7Y29uZmlnX3NoZWxsfSB3aGVuIHJ1bm5pbmcgY29uZmlnLmJmZC4KLQotCSogTWFrZWZpbGUuaW4gKHN5c3JvZmYuaCk6IFNwbGl0IHRhcmdldCBhd2F5IGZyb20gc3lzcm9mZi5jLgotCShzcmNvbnYubywgc3lzZHVtcC5vKTogTmV3IHRhcmdldHMuCi0JKHNyY29udiwgc3lzZHVtcCk6IERvbid0IGRlcGVuZCB1cG9uIHN5c3JvZmYuYy4KLQotV2VkIFNlcCAyOCAxMzowNDozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcnBhcnNlLmMpOiBEb24ndCBpZ25vcmUgZXJyb3JzIGZyb20gbXYuCi0JKHN5c2luZm8uYyk6IExpa2V3aXNlLiAgQWxzbywgZGVwZW5kIHVwb24gYXJwYXJzZS5jLCB0byBwcmV2ZW50IGEKLQlwYXJhbGxlbCBtYWtlIGZyb20gdHJ5aW5nIHRvIGJ1aWxkIGJvdGggYXJwYXJzZS5jIGFuZCBzeXNpbmZvLmMKLQlzaW11bHRhbmVvdXNseS4KLQkobmxtaGVhZGVyLmMpOiBTaW1pbGFyIGNoYW5nZS4KLQkoYXJwYXJzZS5oKTogU2VwYXJhdGUgdGFyZ2V0IGZyb20gYXJwYXJzZS5jLCBzbyB0aGF0IGEgcGFyYWxsZWwKLQltYWtlIGRvZXMgbm90IHRyeSB0byBidWlsZCBib3RoIGF0IG9uY2UuICBEZXBlbmQgdXBvbiBhcnBhcnNlLmMuCi0JKHN5c2luZm8uaCk6IFNpbWlsYXIgY2hhbmdlLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBQYXNzIHRoZSByZWxvYyBidWZmZXIgdG8gZnJlZSwgbm90Ci0JdGhlIHBvaW50ZXIgdXNlZCB0byBsb29wIG92ZXIgdGhlIHJlbG9jcy4KLQotU2F0IFNlcCAyNCAxNjoxNjo1NyAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IENhc3QgcmVzdWx0IG9mIHhtYWxsb2MuCi0KLVdlZCBTZXAgMjEgMTk6MzA6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHNvcnRlZF9zeW1zLCBzb3J0ZWRfc3ltY291bnQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlcy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogVXNlIHNvcnRlZF9zeW1zIGFuZCBzb3J0ZWRfc3ltY291bnQKLQlpbnN0ZWFkIG9mIHN5bXMgYW5kIHN5bWNvdW50LgotCShkaXNhc3NlbWJsZV9kYXRhKTogRG9uJ3QgYm90aGVyIHRvIGdldCB0aGUgcmVsb2NzIGJlZm9yZSBsb29waW5nCi0Jb3ZlciB0aGUgc2VjdGlvbnMuICBCZWZvcmUgZmlsdGVyaW5nIGFuZCBzb3J0aW5nIHRoZSBzeW1ib2wgdGFibGUsCi0JY29weSBpdCBpbnRvIHNvcnRlZF9zeW1zLgotCi1GcmkgU2VwIDE2IDExOjI3OjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyk6IEFkZCBmaWVsZCByZXF1aXJlX3NlYy4KLQkob2JqZHVtcF9wcmludF9hZGRyZXNzKTogSWYgYXV4LT5yZXF1aXJlX3NlYywgcmVxdWlyZSB0aGF0IHRoZQotCXN5bWJvbCBiZSBpbiBhdXgtPnNlYyBldmVuIGlmIEhBU19SRUxPQyBpcyBub3Qgc2V0LiAgSWYgd2UgY2FuJ3QKLQlmaW5kIGEgc21hbGxlciBzeW1ib2wgaW4gdGhlIHJpZ2h0IHNlY3Rpb24sIGxvb2sgZm9yIGEgbGFyZ2VyIG9uZS4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFNldCBhdXgucmVxdWlyZV9zZWMgYXJvdW5kIHRoZQotCW9iamR1bXBfcHJpbnRfYWRkcmVzcyBjYWxsIGZvciB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4KLQotVGh1IFNlcCAxNSAyMTo0MzoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmM6IENhbGwgeGV4aXQgcmF0aGVyIHRoYW4gZXhpdC4KLQkob3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfZmlsZSwgb3V0cHV0X2JmZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShyZW1vdmVfb3V0cHV0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgeGF0ZXhpdCAocmVtb3ZlX291dHB1dCkuICBDYWxsIHhleGl0IHJhdGhlciB0aGFuCi0JcmV0dXJuaW5nLgotCShleHRyYWN0X2ZpbGUpOiBTZXQgb3V0cHV0X2ZpbGVuYW1lIGFuZCBvdXRwdXRfZmlsZSB3aGlsZSBvdXRwdXQKLQlmaWxlIGlzIG9wZW4uCi0JKHdyaXRlX2FyY2hpdmUpOiBMaWtld2lzZSwgYnV0IHVzZSBvdXRwdXRfYmZkLCBub3Qgb3V0cHV0X2ZpbGUuCi0JKiBhcnN1cC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLiAgQ2FsbCB4ZXhpdCByYXRoZXIgdGhhbiBleGl0LgotCSogYnVjb21tLmM6IExpa2V3aXNlLgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2FsbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHVzYWdlKTogRG9jdW1lbnQgLS1kaXNhc3NlbWJsZS1hbGwuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCBkaXNhc3NlbWJsZS1hbGwgYXMgYSBzeW5vbnltIGZvciAtRC4KLQkoY29tcGFyZV9zeW1ib2xzKTogTWFrZSBwb2ludGVycyBjb25zdC4KLQkoY29tcGFyZV9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShkaXNhc3NlbWJsZV9kYXRhKTogUmVuYW1lIGRpc2Fzc2VtYmxlIHRvIGRpc2Fzc2VtYmxlX2ZuIHRvIGF2b2lkCi0Jc2hhZG93aW5nLiAgSWYgZHVtcF9yZWxvY19pbmZvLCBwcmludCByZWxvY3MgYWxvbmcgd2l0aAotCWRpc2Fzc2VtYmx5LiAgU2tpcCBzZWN0aW9ucyB3aGljaCBhcmUgbm90IFNFQ19DT0RFIHVubGVzcwotCWRpc2Fzc2VtYmxlX2FsbCBvciBvbmx5IGlzIHNldC4KLQkoZGlzcGxheV9iZmQpOiBEb24ndCBjYWxsIGR1bXBfcmVsb2NzIGlmIGRpc2Fzc2VtYmxlIGlzIHNldC4KLQkobWFpbik6IEFjY2VwdCBhbmQgaGFuZGxlIC1ELgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgLUQvLS1kaXNhc3NlbWJsZS1hbGwuCi0JKiBvYmpkdW1wLjE6IExpa2V3aXNlLgotCi1XZWQgU2VwIDE0IDEyOjE5OjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSW5pdGlhbGl6ZSBwcmV2bGluZSB0byAwLiAgTWFrZQotCXByZXZfZnVuY3Rpb24gbm9uIGNvbnN0LiAgQ29weSBmdW5jdGlvbm5hbWUgaW50byBhbiBtYWxsb2MgYnVmZmVyCi0Jd2hlbiBzZXR0aW5nIHByZXZfZnVuY3Rpb24sIGluc3RlYWQgb2YgYXNzdW1pbmcgdGhhdCB0aGUgc3RyaW5nCi0Jd2lsbCBsYXN0IGZvcmV2ZXIuCi0KLQkqIG5tLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHNvcnRfYnlfc2l6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAtLXNpemUtc29ydC4KLQkodXNhZ2UpOiBNZW50aW9uIC0tc2l6ZS1zb3J0LgotCShudW1lcmljX2ZvcndhcmQpOiBNYWtlIHN0YXRpYy4gIENoYW5nZSBmcm9tIHZvaWQgKiB0byBQVFIuCi0JKG51bWVyaWNfcmV2ZXJzZSk6IExpa2V3aXNlLgotCShub25fbnVtZXJpY19mb3J3YXJkLCBub25fbnVtZXJpY19yZXZlcnNlKTogTGlrZXdpc2UuCi0JKHNvcnRlcnMpOiBDaGFuZ2UgZGVjbGFyYXRpb24gZnJvbSB2b2lkICogdG8gUFRSLgotCShzaXplX2ZvcndhcmQsIHNvcnRfc3ltYm9sX2J5X3NpemUpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoZGlzcGxheV9yZWxfZmlsZSk6IEhhbmRsZSBzb3J0X2J5X3NpemUuCi0JKGZpbHRlcl9zeW1ib2xzKTogSWYgc29ydF9ieV9zaXplLCBkaXNjYXJkIGFic29sdXRlIGFuZCB1bmRlZmluZWQKLQlzeW1ib2xzLgotCSogYmludXRpbHMudGV4aSAobm0pOiBEb2N1bWVudCAtLXNpemUtc29ydC4KLQkqIG5tLjE6IERvY3VtZW50IC0tc2l6ZS1zb3J0LgotCi1UdWUgU2VwIDEzIDIxOjA2OjA2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfbWFpbik6IEluaXRpYWxpemUgaW5wdXRfZmlsZW5hbWUgYW5kCi0Jb3V0cHV0X2ZpbGVuYW1lIHRvIE5VTEwuCi0KLVR1ZSBTZXAgMTMgMTQ6MTc6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAodmVyc2lvbi5vKTogRGVwZW5kIHVwb24gTWFrZWZpbGUsIHNvIHRoYXQgdmVyc2lvbi5vCi0JZ2V0cyByZWJ1aWx0IHdoZW4gbWFrZSB2YXJpYWJsZSBWRVJTSU9OIGlzIGNoYW5nZWQuCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX2hlYWRlcik6IFByaW50IHRoZSBTRUNfTkVWRVJfTE9BRCBmbGFnLgotCi1XZWQgQXVnIDI0IDEyOjQwOjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQotVHVlIEF1ZyAyMyAxMTowMDo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHJhbmxpYl90b3VjaCk6IERvbid0IHVwZGF0ZSB0aGUgYXJjaGl2ZSBtYXAgaWYgdGhlcmUgaXNuJ3QKLQlvbmUuCi0KLU1vbiBBdWcgMjIgMTY6MDI6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBhci5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShpbmFyY2gpOiBSZW1vdmUgdmFyaWFibGUuCi0JKG1hcF9vdmVyX21lbWJlcnMpOiBNYWtlIHN0YXRpYy4gIEFkZCBhcmNoIGFyZ3VtZW50LCBhbmQgdXNlIGl0Ci0JaW5zdGVhZCBvZiBpbmFyY2guICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKG1haW4pOiBUcmVhdCAtLXZlcnNpb24gYXMgLXYuICBBY2NlcHQgLXQgYXJndW1lbnQuICBBY2NlcHQgYW55Ci0JbnVtYmVyIG9mIGFyY2hpdmUgYXJndW1lbnRzLiAgQ2F0Y2ggYW5kIHVzZSBvcGVuX2luYXJjaCByZXR1cm4KLQl2YWx1ZSwgcmF0aGVyIHRoYW4gdXNpbmcgaW5hcmNoLgotCShvcGVuX2luYXJjaCk6IFJldHVybiBuZXdseSBvcGVuZWQgQkZELCByYXRoZXIgdGhhbiB1c2luZyBpbmFyY2guCi0JKGRvX3F1aWNrX2FwcGVuZCk6IE1ha2UgYXJjaGl2ZV9maWxlbmFtZSBjb25zdC4KLQkod3JpdGVfYXJjaGl2ZSk6IEFkZCBpYXJjaCBhcmd1bWVudCwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGluYXJjaC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGRlbGV0ZV9tZW1iZXJzLCBtb3ZlX21lbWJlcnMsIHJlcGxhY2VfbWVtYmVycyk6IExpa2V3aXNlLgotCShyYW5saWJfb25seSk6IERvbid0IGV4aXQgb24gc3VjY2Vzcy4gIENhdGNoIGFuZCB1c2Ugb3Blbl9pbmFyY2gKLQlyZXR1cm4gdmFsdWUuCi0JKHJhbmxpYl90b3VjaCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFyc3VwLmggKG1hcF9vdmVyX21lbWJlcnMpOiBEb24ndCBkZWNsYXJlLgotCShhcl9lbmQsIGFyX2V4dHJhY3QpOiBEZWNsYXJlLgotCShvcGVuX2luYXJjaCk6IENoYW5nZSByZXR1cm4gdmFsdWUgaW4gZGVjbGFyYXRpb24gdG8gYmZkICouCi0JKiBhcnN1cC5jIChtYXBfb3Zlcl9saXN0KTogTWFrZSBzdGF0aWMuIEFsd2F5cyBwYXNzIHR3byBhcmd1bWVudHMKLQl0byBmdW5jdGlvbi4gIEFkZCBhcmNoIGFyZ3VtZW50LCBhbmQgdXNlIGl0IGluc3RlYWQgb2YgaW5hcmNoLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoYXJfZGlyZWN0b3J5X2RvZXIpOiBNYWtlIHN0YXRpYy4gIEFkZCBpZ25vcmVkIHNlY29uZCBhcmd1bWVudC4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGFyX2RpcmVjdG9yeSk6IFVzZSBvcGVuX2luYXJjaCByZXR1cm4gdmFsdWUgcmF0aGVyIHRoYW4gaW5hcmNoLgotCShhcl9hZGRsaWJfZG9lcik6IE1ha2Ugc3RhdGljLgotCShhcl9hZGRsaWIpOiBVc2Ugb3Blbl9pbmFyY2ggcmV0dXJuIHZhbHVlIHJhdGhlciB0aGFuIGluYXJjaC4KLQkoYXJfZXh0cmFjdCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgdmFyaWFibGUgYWJmZC4KLQotVGh1IEF1ZyAxMSAxNDo1NTo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgcmVtb3ZpbmcgbmFtZWQgc2VjdGlvbnMgdG8gb2JqY29weSBhbmQgc3RyaXAuCi0JKiBvYmpjb3B5LmMgKHN0cnVjdCBzZWN0aW9uX2xpc3QpOiBEZWZpbmUuCi0JKHJlbW92ZV9zZWN0aW9ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHN0cmlwX29wdGlvbnMsIGNvcHlfb3B0aW9ucyk6IEFkZCByZW1vdmUtc2VjdGlvbi4KLQkoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBNZW50aW9uIC1SIGFuZCAtLXJlbW92ZS1zZWN0aW9uLgotCShzZXR1cF9zZWN0aW9uKTogSWYgc2VjdGlvbiBpcyBpbiByZW1vdmVfc2VjdGlvbnMgbGlzdCwgaWdub3JlIGl0LgotCShjb3B5X3NlY3Rpb24pOiBMaWtld2lzZS4KLQkoc3RyaXBfbWFpbiwgY29weV9tYWluKTogSGFuZGxlIC1SLgotCSogYmludXRpbHMudGV4aSwgb2JqY29weS4xLCBzdHJpcC4xOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotV2VkIEF1ZyAxMCAxMDoxOTo1NSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19tYW5nbGVfcmVsb2NzKTogUmVuYW1lIHN5bXZhbHVlIHRvIHN5bV92YWx1ZSwKLQlzbyBhcyBub3QgdG8gY29uZmxpY3Qgd2l0aCB0aGUgc3ltdmFsdWUgdHlwZWRlZiBpbiBiZmQuaC4KLQotTW9uIEF1ZyAgMSAxMzoxOTowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55OiBQZXIgY3VycmVudCBOZXRXYXJlIGRvY3MsIGFjY2VwdCBhIHJldmlzaW9uIG51bWJlcgotCW9mIDAgYW5kIHRyZWF0IGEgcmV2aXNpb24gbnVtYmVyIGdyZWF0ZXIgdGhhbiAyNiBhcyAwLgotCi1Nb24gSnVsIDI1IDEyOjU4OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGVuZCBvZgotCXN5bWJvbHMgd2hlbiBsb29raW5nIGZvciBuZXh0IHN5bWJvbCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLgotCi1GcmkgSnVsIDIyIDE2OjQ4OjM0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5tLmMgKG51bWVyaWNfZm9yd2FyZCk6IFRyZWF0IHVuZGVmaW5lZCBzeW1ib2xzIGFzICJsZXNzIHRoYW4iCi0JZGVmaW5lZCBzeW1ib2xzIHdpdGggemVybyB2YWx1ZXMuICBJZiBudW1lcmljIHZhbHVlcyBhcmUgZXF1YWwsIG9yCi0JYm90aCBzeW1ib2xzIGFyZSB1bmRlZmluZWQsIHNvcnQgYWxwaGFiZXRpY2FsbHkuICBEb24ndCBhc3N1bWUKLQl0aGF0IHRoZSBkaWZmZXJlbmNlIG9mIHR3byBiZmRfdm1hIHZhbHVlcyB3aWxsIHRydW5jYXRlIHRvICJpbnQiCi0JYW5kIHN0aWxsIGhhdmUgdGhlIHNhbWUgc2lnbi4KLQkobnVtZXJpY19yZXZlcnNlKTogQ2FsbCBudW1lcmljX2ZvcndhcmQgYW5kIG5lZ2F0ZSB0aGUgcmVzdWx0LgotCShwcmludF9zeW1ib2xfaW5mb19ic2QpOiBGb3IgdW5kZWZpbmVkIHN5bWJvbHMsIHByaW50IGxlYWRpbmcKLQlzcGFjZXMgZXF1aXZhbGVudCB0byB0aGUgd2lkdGggb2YgYSBwcmludGVkIGJmZF92bWEsIHJhdGhlciB0aGFuCi0JYXNzdW1pbmcgdGhhdCA4IHdpbGwgbG9vayByaWdodC4KLQotRnJpIEp1bCAyMiAxMDozNjo1MCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5jIChkb2l0KTogIFplcm8gYWxsIGZpZWxkcyBvZiBuZXcgc3RydWN0dXJlLgotCSogc3Jjb252LmMgKHN5c3JvZmZfc3dhcF8qX291dCk6IFJlbW92ZSByZWR1bmRhbnQgdHJhaWxpbmcgYXJnLgotCSogc3lzaW5mby55OiBHZW5lcmF0ZSBzeXNyb2ZmX3N3YXBfKl9vdXQgd2l0aG91dCByZXF1aXJpbmcgZXh0cmEKLQlhcmcuCi0KLUZyaSBKdWwgMjIgMTA6MDk6NTMgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueTogTWFrZSAic3RhY2siIGFuZCAic3RhY2tzaXplIiBzeW5vbnltcyBpbiB0aGUgbGV4ZXIKLQkgIHJhdGhlciB0aGFuIHRoZSBwYXJzZXIuCi0KLVRodSBKdWwgMjEgMTA6MjU6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtYWxwaGFvc2YsIGNvbmZpZy9taC1hcG9sbG82OHYsIGNvbmZpZy9taC1kZWx0YTg4OgotCVJlbW92ZTsgb2Jzb2xldGUuCi0KLVNhdCBKdWwgMTYgMjI6MzQ6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHNsdXJwX2R5bmFtaWNfc3ltdGFiKTogVHJ5IHRvIGdldCB0aGUgZHluYW1pYyBzeW1ib2xzCi0JZXZlbiBpZiB0aGUgYmZkIGlzIG5vdCBtYXJrZWQgRFlOQU1JQy4gIEVMRiBleGVjdXRhYmxlcyBhcmUgbm90Ci0JbWFya2VkIERZTkFNSUMsIGJ1dCBkbyBoYXZlIGR5bmFtaWMgc3ltYm9scy4KLQotRnJpIEp1bCAxNSAwMTo0MTozNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5jIChkb193aGVyZSk6IE1ha2UgZGF0YSB3aXRoIG5vIHR5cGUgJ2ludCcuCi0JKGRvX2RlZmluZSk6ICBLZWVwIGluZm8gb24gc291cmNlIGZpbGUgb2YgYSBzeW1ib2wuCi0JKiBjb2ZmZ3Jvay5oIChjb2ZmX3N5bWJvbCk6IE5ldyBmaWVsZC4KLQkqIHNyY29udi5jIChQUk9HUkFNX1ZFUlNJT04pOiBOb3cgMS4zCi0JKHdyX3JsKTogVXNlIGV4dGVybmFsIHJlZiBudW1iZXIgZm9yIHN5bWJvbC4KLQkod3JfZHVzKTogT25seSBrZWVwIG9uZSBzb3VyY2UgZmlsZSBwZXIgZGVidWcgdW5pdC4KLQkod3JfZGxuKTogQWx3YXlzIGVtaXQgbGluZSBudW1iZXJzIGZvciBmaXJzdCBzb3VyY2UgZmlsZSwKLQkod3JfZ2xvYmFscyk6ICBFbWl0IGdsb2JhbHMgaW4gdGhlIGR1IG9mIHRoZWlyIG93bmluZyBzb3VyY2UgZmlsZS4KLQotTW9uIEp1bCAxMSAxNTo1OTowMyAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIG5sbWhlYWRlci55OiBOdWxsIHRlcm1pbmF0ZSB2YXJfaGRyLT50aHJlYWROYW1lLgotCi1GcmkgSnVsICA4IDE3OjMzOjIyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzeXNsZXgubywgc3lzaW5mby5vKTogUGVybWl0IEMgc291cmNlIGZpbGVzIHRvIGJlCi0JaW4gJChzcmNkaXIpLCBhcyB0aGV5IHdpbGwgYmUgZm9yIEZTRiByZWxlYXNlcy4KLQotV2VkIEp1bCAgNiAwMToxMzoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBQcmVzZXJ2ZSBleGlzdGluZyBzZWN0aW9uIGZsYWdzIHdoZW4KLQljb3B5aW5nIGluIGZsYWdzIGZyb20gYSBuZXcgc2VjdGlvbi4KLQotVHVlIEp1bCAgNSAxNTo1NjowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoY29weV9maWxlKTogSWYgb3V0cHV0X3RhcmdldCBpcyBOVUxMLCBzZXQgaXQgdG8gdGhlIHRhcmdldCBvZiB0aGUKLQlpbnB1dCBmaWxlLgotCi1XZWQgSnVuIDI5IDE3OjE3OjE0IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChsaW5rX2lucHV0cyk6IEZpeGVkIG1lbW9yeSBhbGxvY2F0aW9uIGJ1Zy4KLQotVGh1IEp1biAyMyAxMjo1Mjo0NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC0td2l0aC10YXJnZXRzIHRvIC0tZW5hYmxlLXRhcmdldHMuCi0KLVR1ZSBKdW4gMjEgMTI6NTM6MjEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoc3lzaW5mbyk6IERvZXMgbm90IGRlcGVuZCB1cG9uICQoQURETF9MSUJTKS4KLQotCSogbmxtY29udi5jIChwb3dlcnBjX2J1aWxkX3N0dWJzKTogRG9uJ3QgZ2VuZXJhdGUgdGhlIFBvd2VyUEMKLQlOZXRXYXJlIGN1c3RvbSBoZWFkZXI7IG5vIGxvbmdlciBuZWVkZWQuCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENvbnZlcnQgcmVsb2NzIGFnYWluc3QgdGhlIHVuaW5pdGlhbGl6ZWQKLQlkYXRhIHNlY3Rpb24gaW50byByZWxvY3MgYWdhaW5zdCB0aGUgZGF0YSBzZWN0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBubG1jb252X2RlZnMgdG8gLUROTE1DT05WX2NwdXR5cGUgZm9yIGFsbCB0aGUKLQluZXR3YXJlIHRhcmdldHMuICBXcml0ZSBpdCBpbnRvIE1ha2VmaWxlIGFzIE5MTUNPTlZfREVGUy4KLQkqIE1ha2VmaWxlLmluIChubG1jb252Lm8pOiBQYXNzICQoTkxNQ09OVl9ERUZTKSB0byAkKENDKS4KLQkqIG5sbWNvbnYuYzogT25seSBjb21waWxlIGNvZGUgZm9yIHNwZWNpZmljIENQVSB0eXBlcyBpZgotCU5MTUNPTlZfY3B1dHlwZSBpcyBkZWZpbmVkLgotCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgdXNlcyBvZiBiZmRfYWJzX3NlY3Rpb24sIGV0Yy4sIHRvIHVzZQotCWJmZF9hYnNfc2VjdGlvbl9wdHIgb3IgYmZkX2lzX2Fic19zZWN0aW9uLCBldGMuCi0JKGkzODZfbWFuZ2xlX3JlbG9jcywgYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgotCShwb3dlcnBjX2J1aWxkX3N0dWJzKTogTGlrZXdpc2UuCi0JKiBubS5jIChmaWx0ZXJfc3ltYm9scywgcHJpbnRfc3ltYm9scyk6IExpa2V3aXNlLgotCSogb2JqY29weS5jIChmaWx0ZXJfc3ltYm9scyk6IExpa2V3aXNlLgotCShtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyk6IExpa2V3aXNlLgotCSogb2JqZHVtcC5jIChyZW1vdmVfdXNlbGVzc19zeW1ib2xzLCBkdW1wX3JlbG9jcyk6IExpa2V3aXNlLgotCSogc2l6ZS5jIChzeXN2X2ludGVybmFsX3ByaW50ZXIpOiBMaWtld2lzZS4KLQotTW9uIEp1biAyMCAxNjo0MzowMyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTUFOUEFHRVMpOiBSZW1vdmUgJChERU1BTkdMRVJfUFJPRykuCi0JKGluc3RhbGwpOiBJbnN0YWxsIGl0IGV4cGxpY2l0bHksIGZyb20gYnVpbGQgZGlyLCBub3Qgc3JjZGlyLgotCi1Nb24gSnVuIDIwIDE2OjI5OjU0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBEb24ndCBpbmNsdWRlIGVsZi9pbnRlcm5hbC5oLgotCShiZmRfZWxmX2ZpbmRfc2VjdGlvbik6IERvbid0IGRlY2xhcmUuCi0JKHJlYWRfc2VjdGlvbl9zdGFicyk6IE5vIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEVMRi4gIEFsd2F5cyByZWFkCi0JdXNpbmcgQkZEIHNlY3Rpb25zLgotCi1UaHUgSnVuIDE2IDE3OjI1OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTZXQgVU5ERVJTQ09SRSBpbiBNYWtlZmlsZSBiYXNlZCBvbiByZXN1bHQgb2YKLQlpbnZva2luZyBjb25maWcuYmZkIHdpdGggYSBzZWNvbmQgYXJndW1lbnQgb2YgYGBfJycuCi0JKiBNYWtlZmlsZS5pbiAodW5kZXJzY29yZS5jKTogRGVwZW5kIHVwb24gTWFrZWZpbGUuICBEb24ndCB0cnkgdG8KLQlydW4gJChDQykgYW5kICQoTk0pLCBqdXN0IHVzZSAkKFVOREVSU0NPUkUpLiAgQ3JlYXRlIHZpYSB0ZW1wb3JhcnkKLQlmaWxlLgotCShkZW1hbmdsZS5vKTogUmVtb3ZlIHRhcmdldC4KLQkoJChOTV9QUk9HKSk6IERvbid0IGRlcGVuZCB1cG9uIGRlbWFuZ2xlLm8sIGFuZAlkb24ndCBsaW5rIGFnYWluc3QKLQlkZW1hbmdsZS5vLiAgSXQncyBpbiBsaWJpYmVydHkgYW55aG93LgotCShjcGx1cy1kZW0ubyk6IERvbid0IGRlcGVuZCB1cG9uIGRlbWFuZ2xlLm8uCi0JKiBiaW51dGlscy50ZXhpOiBNZW50aW9uIC1uIGFuZCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzIGFyZ3VtZW50cwotCXRvIGMrK2ZpbHQuCi0KLVdlZCBKdW4gMTUgMTI6MTA6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubS5jIChsb25nX29wdGlvbnMpOiBBZGQgLS1uby1kZW1hbmdsZSB0byB0dXJuIG9mZiAtLWRlbWFuZ2xlLAotCWFuZCAtLW5vLWNwbHVzIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCSh1c2FnZSk6IE1lbnRpb24gLS1uby1kZW1hbmdsZS4KLQkqIGJpbnV0aWxzLnRleGk6IERvY3VtZW50IC0tbm8tZGVtYW5nbGUuCi0KLUZyaSBKdW4gMTAgMTU6NDE6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubS5jOiBIT1NUXzY0X0JJVCB3YXMgcmVuYW1lZCB0byBCRkRfSE9TVF82NF9CSVQuCi0KLQkqIG9iamNvcHkuYyAoY29weV9hcmNoaXZlKTogTWFrZSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiB0aGUKLQlzYW1lIGRpcmVjdG9yeSBhcyB0aGUgb3V0cHV0IEJGRCwgc2luY2Ugd2UgbWF5IG5vdCBoYXZlIHdyaXRlCi0JcGVybWlzc2lvbiBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBTZXQgdGhlIHBlcm1pc3Npb25zIG9mIHRoZQotCW5ldyBkaXJlY3RvcnkgdG8gMDcwMCwgbm90IDA3NzcuCi0KLU1vbiBKdW4gIDYgMjE6MzY6NDMgMTk5NCAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGlmIHRoaXMgaXMgYW4gcnM2MDAwIChhbmQgd2UncmUgbm90IGJ1aWxkaW5nIGZvcgotCWFueSBvdGhlciBiZmQgdGFyZ2V0cykgdGhlbiBidWlsZCBvbmx5IG5tIChjb2xsZWN0IG5lZWRzIGl0IG9uCi0JcnM2MDAwLWx5bngpLgotCi0JKiBNYWtlZmlsZS5pbjogZGVmaW5lIFRPT0xfUFJPR1Mgd2hpY2ggdGhlIGxpc3Qgb2YgcHJvZ3JhbWVzIHRvCi0JaW5zdGFsbCBpbiAkdG9vbGRpciAtLSByZXBsYWNlcyBhIGhhcmQtY29kZWQgbGlzdC4KLQotRnJpIEp1biAgMyAxMDo1OToxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgb2suCi0KLVRodSBNYXkgMjYgMTg6MDU6NTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFscGhhb3NmIChDRkxBR1MpOiBEb24ndCBzcGVjaWZ5IGJvdGggLWcgYW5kIC1POwotCXRoZXkncmUgbm90IGNvbXBhdGlibGUgdW5kZXIgbmF0aXZlIGNjLiAgVXNlIC1PMSBpbnN0ZWFkLgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuNC4xLgotCi0JQ2hhbmdlcyBmcm9tIGJpbnV0aWxzLTIuNCBuZXQgcmVsZWFzZToKLQotCSogTWFrZWZpbGUuaW4gKE1BTlBBR0VTKTogVXNlICQoREVNQU5HTEVSX1BST0cpLgotCSgkKERFTUFOR0xFUl9QUk9HKS4xKTogQnVpbGQgZnJvbSBjeHhmaWx0Lm1hbiwgdXNpbmcgc2VkLgotCSogY3h4ZmlsdC5tYW46IFJlbmFtZWQgZnJvbSBjKytmaWx0LjEsIHJlcGxhY2VkICJjKytmaWx0IiB3aXRoCi0JbWFnaWMgdG9rZW4gdG8gYmUgcmVwbGFjZWQgYnkgc2VkLgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSBmb3IgbGF0ZXN0IG1ha2VmaWxlLmluCi0KLUZyaSBNYXkgMTMgMjM6MjU6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uYzogQ2hlY2sgQU5TSV9QUk9UT1RZUEVTIHJhdGhlciB0aGFuIF9fU1REQ19fLgotCi1UdWUgTWF5IDEwIDE4OjIyOjA2IDE5OTQgIEphc29uIE1vbGVuZGEgICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfc2VjdGlvbik6IFNldCBzZWN0aW9uIHNpemUgY29ycmVjdGx5IGlmIHVzaW5nCi0JaW50ZXJsZWF2ZS4KLQotU2F0IE1heSAgNyAxNjo0OTozNiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHJ1bGUgZm9yIHN5c2luZm8uaAotCi1GcmkgTWF5ICA2IDEyOjE4OjMzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChTUkNPTlZfUFJPRyk6IERlZmluZS4KLQkoUFJPR1MpOiBVc2UgJChTUkNPTlZfUFJPRykgdG9vLgotCi1UaHUgTWF5ICA1IDE5OjQxOjQzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBBZGQgc3lzaW5mby5jLCBzeXNsZXguYywgaW4gY2FzZQotCXNvbWVvbmUgY29uZmlndXJlcyB3aXRoIGB0YXJnZXRzPWFsbCcuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSB5LiouCi0JKHN5c2xleC5vKTogRGVwZW5kIG9uIHN5c2luZm8uaC4KLQkoc3lzaW5mby5jKTogUmVuYW1lIHkudGFiLmggdG8gc3lzaW5mby5oLgotCShpbnN0YWxsLWluZm8pOiBEb24ndCB0cnkgdG8gaW5zdGFsbCBpbnRvICQoaW5mb2RpcikvJChzcmNkaXIpLgotCSogc3lzbGV4Lmw6IEluY2x1ZGUgc3lzaW5mby5oLCBub3QgeS50YWIuaC4KLQotVGh1IE1heSAgNSAxMTo1MDo1NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogc3lzbGV4LmwgKHl5d3JhcCk6IERlZmluZSBhcyBmdW5jdGlvbiBpZiBub3QgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JKiBNYWtlZmlsZS5pbiAob2JqZHVtcC5vKTogRGVsZXRlZCBzcGVjaWFsIHJ1bGUuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciBidWlsZGluZyBBUkNIREVGUyB2YXJpYWJsZSBmb3IKLQlNYWtlZmlsZS4KLQkqIG9iamR1bXAuYyAoQVJDSF8qKTogRGVsZXRlZCBoYW5kbGluZy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IENhbGwgYGRpc2Fzc2VtYmxlcicgZnJvbSBvcGNvZGVzIGxpYnJhcnkuCi0KLVRodSBNYXkgIDUgMTM6Mjg6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IENvcnJlY3QgaGFuZGxpbmcgb2YgJCh0b29sZGlyKSBhbmQKLQkkKGJpbmRpcikgYmVpbmcgb24gZGlmZmVyZW50IGRldmljZXMuCi0KLUZyaSBBcHIgMjkgMDk6NTA6MzggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogc3lzZHVtcC5jIChoODMwMCwgc2gpOiBBZGQgZGVjbGFyYXRpb25zLgotCi1XZWQgQXByIDI3IDExOjI1OjE4IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzeXNsZXgsIHN5c2luZm8pOiBVc2UgQ0NfRk9SX0JVSUxELgotCSogY29mZmR1bXAuYywgY29mZmdyb2MuYywgY29mZmdyb2cuaCwgc3Jjb252LmMsIHN5c2R1bXAuYywKLQlzeXNyb2ZmLmluZm86IE1ham9yIGNoYW5nZXMuCi0KLVR1ZSBBcHIgMjYgMTg6MTg6MjQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHByaW50X3NlY3Rpb25fc3RhYnMpOiBJbmRpY2F0ZSB0aGUgc3RhYiBoZWFkZXIgc3ltYm9sCi0JbW9yZSBjbGVhcmx5LCBwcmludCBudW1iZXJzIG9mIHVucmVjb2duaXplZCBzdGFiIG5fdHlwZSB2YWx1ZXMuCi0KLVR1ZSBBcHIgMjYgMTY6MjI6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBubG1jb252LmMgKGNvcHlfc2VjdGlvbnMpOiBDb3B5IGFyZWxlbnQgcG9pbnRlcnMsIG5vdCBhcmVsZW50cy4KLQotTW9uIEFwciAyNSAxNjoxNDozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgJChQUk9HUykgYW5kIHVuZGVyc2NvcmUuYy4KLQotRnJpIEFwciAyMiAxMToxNDoxOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBSZW1vdmUgc3BlY2lhbCBoYW5kbGluZyBvZiAucmVnaW5mbwotCXNlY3Rpb24uCi0JKGNvcHlfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IFVzZSBiZmRfZWNvZmZfZ2V0X2dwX3ZhbHVlIHJhdGhlciB0aGFuIHRoZQotCXNwZWNpYWwgRUNPRkYgLnJlZ2luZm8gc2VjdGlvbi4KLQotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6IENhbGwgYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSBhZnRlcgotCWNvcHlpbmcgZXZlcnl0aGluZyBlbHNlLCB0byBsZXQgaXQgZmlkZGxlIHdpdGggdGhlIGZpbGUgaW4gaXRzCi0JZmluYWwgc3RhdGUuCi0KLQkqIG9iamR1bXAuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoZGlzcGxheV90YXJnZXRfbGlzdCk6IElmIGEgZm9ybWF0IGZhaWxzLCBqdXN0IGdvIG9uIHRvIHRoZSBuZXh0Ci0Jb25lLiAgQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGJmZF9zZXRfZm9ybWF0LgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBMaWtld2lzZS4gIERvbid0IGluY3JlbWVudCBsb29wIHZhcmlhYmxlIGluCi0JZm9yIGxvb3AgdGVzdCwgc2luY2UgdGhhdCBza2lwcyB0aGUgZmlyc3QgZWxlbWVudC4KLQkoZGlzcGxheV90YXJnZXRfdGFibGVzKTogUmV3cml0ZSBsb29wIGZvciBjbGFyaXR5LiAgRW5zdXJlIHRoYXQgaXQKLQlhbHdheXMgcHJpbnRzIGF0IGxlYXN0IG9uZSBlbGVtZW50LgotCi0JKiBubG1jb252LmMgKG1haW4pOiBVc2UgQ3lHblVzRXggcmF0aGVyIHRoYW4gQ3lHblVzU2VDcyBmb3IKLQlzZWN0aW9ucyBoZWFkZXIuICBSZW5hbWUgZnJvbSBjeWdudXNfc2VjdGlvbnMgdG8gY3lnbnVzX2V4dC4KLQotVGh1IEFwciAyMSAxMjoxMjoyNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoX0RVTU1ZX05BTUVfKTogRG9uJ3QgZGVmaW5lLgotCShkaXNwbGF5X3RhcmdldF9saXN0KTogVXNlIHRtcG5hbSB0byBnZXQgYSBmaWxlIG5hbWUgcmF0aGVyIHRoYW4KLQl1c2luZyBfRFVNTVlfTkFNRV8uICBVbmxpbmsgaXQgd2hlbiBkb25lLgotCShkaXNwbGF5X2luZm9fdGFibGUpOiBMaWtld2lzZS4KLQotCSogbmxtY29udi5jIChzZWNzZWMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtYWluKTogQ3JlYXRlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIGluIG91dHB1dCBCRkQuICBTdG9yZQotCWluZm9ybWF0aW9uIGFib3V0IGl0IGluIHNlY3Rpb25zIGhlYWRlci4KLQkoc2V0dXBfc2VjdGlvbnMpOiBBbGxvY2F0ZSBzcGFjZSBpbiBzZWN0aW9ucyBoZWFkZXIuCi0JKGNvcHlfc2VjdGlvbnMpOiBDb3B5IHplcm8gc2l6ZWQgc2VjdGlvbnMuICBQdXQgaW5mb3JtYXRpb24gYWJvdXQKLQllYWNoIHNlY3Rpb24gaW4gdGhlIHNlY3Rpb25zIGhlYWRlci4KLQotV2VkIEFwciAyMCAxNDozNDo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IFRha2UgbmV3IG91dGJmZCBhcmd1bWVudC4KLQlDaGFuZ2UgY2FsbGVyLiAgQ3JlYXRlIGN1c3RvbSBoZWFkZXIgZm9yIG5ldyBQb3dlclBDIE5ldFdhcmUKLQlmb3JtYXQuCi0KLQkqIE1ha2VmaWxlLmluIChubG1oZWFkZXIubywgbmxtY29udi5vKTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIG5sbWNvbnYuYzogSW5jbHVkZSBiZmQuaCBhbmQgbGliaWJlcnR5Lmggd2l0aCAiIiwgbm90IDw+LgotCSogbmxtaGVhZGVyLnk6IEluY2x1ZGUgYmZkLmggd2l0aCAiIiwgbm90IDw+LgotCi1XZWQgQXByIDEzIDEwOjUyOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBEbyBhbiBpZmRlZiBvbiBfX0dPMzJfXywgbm90IHVuaXguCi0KLVdlZCBBcHIgIDYgMjE6NTQ6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JQWRkZWQgLUQgKC0tZHluYW1pYykgb3B0aW9uIHRvIG5tIGFuZCAtVCAoLS1keW5hbWljLXN5bXMpIGFuZCAtUgotCSgtLWR5bmFtaWMtcmVsb2MpIGFyZ3VtZW50cyB0byBvYmpkdW1wLgotCSogbm0uYyAoZHluYW1pYyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZGVkICJkeW5hbWljIi4KLQkodXNhZ2UpOiBNZW50aW9uIC1EIGFuZCAtLWR5bmFtaWMuCi0JKG1haW4pOiBBZGQgRCB0byBnZXRvcHQgc3RyaW5nLiAgSGFuZGxlIC1EIGJ5IHNldHRpbmcgZHluYW1pYy4KLQkoZGlzcGxheV9yZWxfZmlsZSk6IElmIGR5bmFtaWMgaXMgbm9uLXplcm8sIHJlYWQgZHluYW1pYyBzeW1ib2xzCi0JcmF0aGVyIHRoYW4gbm9ybWFsIHN5bWJvbHMuCi0JKiBubS4xOiBVcGRhdGVkIGZvciAtRCAoLS1keW5hbWljKSBvcHRpb24uCi0JKiBvYmpkdW1wLmMgKGR1bXBfZHluYW1pY19zeW10YWIpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGR5bnN5bXMsIGR5bnN5bWNvdW50KTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKHVzYWdlKTogTWVudGlvbiAtUiwgLVQsIC0tZHluYW1pYy1zeW1zIGFuZCAtLWR5bmFtaWMtcmVsb2MuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZGVkICJkeW5hbWljLXJlbG9jIiBhbmQgImR5bmFtaWMtc3ltcyIuCi0JKHNsdXJwX3N5bXRhYik6IElmIG5vIHN5bWJvbHMsIHJldHVybiByYXRoZXIgdGhhbiBleGl0LgotCShzbHVycF9keW5hbWljX3N5bXRhYik6IE5ldyBmdW5jdGlvbi4KLQkoZGlzcGxheV9iZmQpOiBIYW5kbGUgZHVtcF9keW5hbWljX3N5bXRhYiBhbmQKLQlkdW1wX2R5bmFtaWNfcmVsb2NfaW5mby4KLQkoZHVtcF9zeW1ib2xzKTogVGFrZSBuZXcgZHluYW1pYyBhcmd1bWVudCwgaW5kaWNhdGluZyB3aGV0aGVyIHRvCi0JZGlzcGxheSBkeW5hbWljIHN5bWJvbHMuCi0JKGR1bXBfcmVsb2NzKTogTW92ZSBtb3N0IHByaW50aW5nIGludG8gZHVtcF9yZWxvY19zZXQuCi0JKGR1bXBfZHluYW1pY19yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKGR1bXBfcmVsb2Nfc2V0KTogTmV3IGZ1bmN0aW9uLCBleHRyYWN0ZWQgZnJvbSBkdW1wX3JlbG9jcy4KLQkobWFpbik6IEFkZCBSIGFuZCBUIHRvIGdldG9wdCBzdHJpbmcuICBIYW5kbGUgLVQgYnkgc2V0dGluZwotCWR1bXBfZHluYW1pY19zeW10YWIgYW5kIC1SIGJ5IHNldHRpbmcgZHVtcF9keW5hbWljX3JlbG9jX2luZm8uCi0JKiBvYmpkdW1wLjE6IFVwZGF0ZWQgZm9yIC1SICgtLWR5bmFtaWMtcmVsb2MpIGFuZCAtVAotCSgtLWR5bmFtaWMtc3ltcykgb3B0aW9ucy4KLQkqIGJpbnV0aWxzLnRleGk6IFVwZGF0ZWQgZm9yIG5ldyBubSBhbmQgb2JqZHVtcCBvcHRpb25zLgotCi1XZWQgTWFyIDMwIDE1OjUyOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVVwZGF0ZSBmb3IgcmVjZW50IEJGRCBjaGFuZ2VzIHRvIHN5bWJvbCBhbmQgcmVsb2MgcmVhZGluZy4gIFJlbmFtZQotCWFsbCB1c2VzIG9mIGdldF9zeW10YWJfdXBwZXJfYm91bmQgdG8gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQuCi0JQWxzbzoKLQkqIGNvZmZncm9rLmMgKHN5bWNvdW50KTogQ2hhbmdlIHRvIGxvbmcuCi0JKGRvX3NlY3Rpb25zX3AxKTogQ2hlY2sgZm9yIGVycm9yIHJldHVybiBmcm9tCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZC4gIENoYW5nZSByZWxjb3VudCB0byBsb25nLCBhbmQgY2hlY2sgZm9yCi0JZXJyb3IgZnJvbSBiZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShjb2ZmX2dyb2spOiBDaGFuZ2Ugc3RvcmFnZSB0byBsb25nLiAgQ2hlY2sgZm9yIGVycm9yIGZyb20KLQliZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCBhbmQgYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2Ugc3ltY291bnQsIG5ld3N5bWFsbG9jLCBuZXdzeW1jb3VudCwgYW5kCi0JaSB0byBsb25nLiAgQ2hlY2sgZm9yIGVycm9yIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKGNvcHlfc2VjdGlvbnMpOiBDaGFuZ2UgcmVsb2Nfc2l6ZSBhbmQgcmVsb2NfY291bnQgdG8gbG9uZy4gIENoZWNrCi0JZm9yIGVycm9yIGZyb20gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCBhbmQKLQliZmRfY2Fub25pY2FsaXplX3JlbG9jLgotCShtYW5nbGVfcmVsb2NzLCBpMzg2X21hbmdsZV9yZWxvY3MsIGFscGhhX21hbmdsZV9yZWxvY3MpOiBDaGFuZ2UKLQlyZWxvY19jb3VudF9wdHIgYXJndW1lbnQgdG8gbG9uZyAqLiAgTWFrZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8KLQl2YXJpYWJsZXMgbG9hZGVkIGZyb20gKnJlbG9jX2NvdW50X3B0ci4KLQkqIG5tLmMgKGRpc3BsYXlfcmVsX2ZpbGUpOiBDaGFuZ2Ugc3RvcmFnZSBhbmQgc3ltY291bnQgdG8gbG9uZy4KLQlDaGVjayBmb3IgZXJyb3JzIGZyb20gYmZkX2dldF9zeW10YWJfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIuCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogQ2hhbmdlIHN5bWNvdW50LCBzcmNfY291bnQgYW5kCi0JZHN0X2NvdW50IHRvIGxvbmcuCi0JKGNvcHlfb2JqZWN0KTogQ2hhbmdlIHN5bWNvdW50IHRvIGxvbmcuICBQYXNzIGFub3RoZXIgYXJndW1lbnQgdG8KLQlmcHJpbnRmLiAgQ2hlY2sgZm9yIGVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCShjb3B5X3NlY3Rpb24pOiBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKG1hcmtfc3ltYm9sc191c2VkX2luX3JlbG9jYXRpb25zKTogQ2hhbmdlIHJlbGNvdW50IGFuZCBpIHRvIGxvbmcuCi0JQ2hlY2sgZm9yIGVycm9ycyBmb3JtIGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kCi0JYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYy4KLQkqIG9iamR1bXAuYyAoc3RvcmFnZSk6IFJlbW92ZSBnbG9iYWwgdmFyaWFibGUuCi0JKHN5bWNvdW50KTogQ2hhbmdlZCB0byBsb25nLgotCShzbHVycF9zeW10YWIpOiBOZXcgbG9jYWwgdmFyaWFibGUgc3RvcmFnZS4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZCBiZmRfY2Fub25pY2FsaXplX3N5bXRhYi4KLQkocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6IENoYW5nZSByZXR1cm4gdmFsdWUgYW5kIGNvdW50IHRvIGxvbmcuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IENoYW5nZSBtaW4sIG1heCwgdGhpc3BsYWNlIGFuZCBpIHRvIGxvbmcuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDaGFuZ2UgaSB0byBsb25nLgotCShkdW1wX3N5bWJvbHMpOiBDaGFuZ2UgY291bnQgdG8gbG9uZy4KLQkoZHVtcF9yZWxvY3MpOiBDaGFuZ2UgcmVsY291bnQgdG8gbG9uZy4gIENoZWNrIGZvciBlcnJvcnMgZnJvbQotCWJmZF9yZXRfcmVsb2NfdXBwZXJfYm91bmQgYW5kIGJmZF9jYW5vbmljYWxpemVfcmVsb2MuCi0JKGRpc3BsYXlfaW5mb190YWJsZSk6IEFkZCBjYXN0cyB3aGVuIHBhc3NpbmcgTE9OR0VTVF9BUkNIIGZvcgotCXByaW50ZiAlKiBhcmd1bWVudC4KLQotVHVlIE1hciAyOSAxNDo1OTowNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5tLmMgKGRpc3BsYXlfYXJjaGl2ZSk6IENsb3NlIGVhY2ggYXJjaGl2ZSBlbGVtZW50IGFmdGVyIGl0IGhhcwotCWJlZW4gZGlzcGxheWVkLgotCSogb2JqZHVtcC5jIChkaXNwbGF5X2ZpbGUpOiBMaWtld2lzZS4KLQotTW9uIE1hciAyOCAxMzowNDowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIGVycm9yIG1lc3NhZ2UgdG8gcmVmZXIgdG8gYmZkL2NvbmZpZy5iZmQKLQlyYXRoZXIgdGhhbiBiZmQvY29uZmlndXJlLmluLgotCi1TdW4gTWFyIDI3IDE2OjIzOjM5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNb3JlIGZpeGVzIGZvciBvYmplY3QgZm9ybWF0cyB3aGljaCBhbGxvdyBtdWx0aXBsZSBzZWN0aW9ucwotCXdpdGggdGhlIHNhbWUgbmFtZToKLQkqIG9iamNvcHkuYyAoc2V0dXBfc2VjdGlvbik6IE1ha2UgYSBuZXcgb3V0cHV0IHNlY3Rpb24gZXZlbiBpZgotCW9uZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCShjb3B5X3NlY3Rpb24pOiBVc2UgaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uIHJhdGhlciB0aGFuIHRyeWluZwotCXRvIGxvb2sgdGhlIG91dHB1dCBzZWN0aW9uIHVwIGJ5IGl0cyAocG9zc2libHkgbm9uLXVuaXF1ZSkgbmFtZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IExvb2sgZm9yIGJpbnV0aWxzLmluZm8gaW4gdGhlCi0JY3VycmVudCBkaXJlY3RvcnksIHRoZW4gaW4gJChzcmNkaXIpLiAgRG9uJ3QgdXNlICQ8LgotCi1Nb24gTWFyIDIxIDEyOjU1OjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBNYWtlIHN0YXRpYy4gIERlY2xhcmUgd2l0aAotCXByb3RvdHlwZS4gIENoYW5nZSB2YXJkaWZmIGZyb20gaW50IHRvIGJmZF9zaWduZWRfdm1hLiAgQ29ycmVjdAotCWJpbmFyeSBzZWFyY2ggdGVybWluYXRpb24gY29uZGl0aW9uLiAgV2hlbiBsb29raW5nIGZvciBzYW1lCi0Jc2VjdGlvbiBzeW1ib2wgaW4gcmVsb2NhdGFibGUgZmlsZSwgaGFuZGxlIGZpbmFsIHN5bWJvbCBjb3JyZWN0bHkuCi0KLVN1biBNYXIgMjAgMTE6MjY6MzYgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiBBdm9pZCBidWcgaW4gaHB1eCBzZWQuCi0KLQkqIG9iamNvcHkuYzogQ2hhbmdlcyB0byBrZWVwIGl0IGZyb20gc3RyaXBwaW5nIHN5bWJvbHMgdXNlZAotCWluIG91dHB1dCByZWxvY2F0aW9ucy4KLQkobWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMpOiBOZXcgZnVuY3Rpb24uICBNYXJrIHN5bWJvbHMKLQl1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyB3aXRoIEJTRl9LRUVQLgotCShmaWx0ZXJfc3ltYm9scyk6IERvIG5vdCBzdHJpcCBzeW1ib2xzIG1hcmtlZCB3aXRoIEJTRl9LRUVQLgotCShjb3B5X29iamVjdCk6IFJlb3JkZXIgYWN0aW9ucy4gIEZpcnN0IHNldHVwIHNlY3Rpb25zLCB0aGVuCi0JYnVpbGQgdGhlIG91dHB1dCBzeW1ib2wgdGFibGUsIHRoZW4gY29weSB0aGUgc2VjdGlvbiBjb250ZW50cy4KLQotRnJpIE1hciAxOCAxMDo1Mzo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUpOiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG51bGwgYnl0ZS4gIEZyb20KLQlSb2JlcnQgTGlwZSA8cm9iZXJ0bEBhcm5ldC5jb20+LgotCi1UaHUgTWFyIDE3IDE2OjIwOjI4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEJ1aWx0IG5tLm5ldyBhbmQgc3RyaXAubmV3IHRvIGF2b2lkIHByb2JsZW1zIHdpdGgKLQljb2xsZWN0IHdoZW4gLiBpcyBpbiBQQVRILgotCShTVFJJUF9QUk9HKTogQ2hhbmdlIGZyb20gc3RyaXAgdG8gc3RyaXAubmV3LgotCShOTV9QUk9HKTogQ2hhbmdlIGZyb20gbm0gdG8gbm0ubmV3LgotCShpbnN0YWxsKTogUmVtb3ZlIHRoZSAubmV3IHdoZW4gaW5zdGFsbGluZy4KLQotV2VkIE1hciAxNiAxNjoyNzowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAocG93ZXJwY19idWlsZF9zdHVicyk6IFNldCBCU0ZfRFlOQU1JQyBmbGFnIGZvciBlYWNoCi0Jc3ltYm9sIGZvciB3aGljaCB3ZSBidWlsZCBhIHN0dWIuCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IE9ubHkgcmVzZXQgVE9DIHBvaW50ZXIgZm9yIGEgY2FsbCB0byBhCi0Jc3ltYm9sIHdpdGggQlNGX0RZTkFNSUMgZmxhZyBzZXQuCi0KLVR1ZSBNYXIgMTUgMjM6MDQ6MTMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamNvcHkuYyAoZmlsdGVyX3N5bWJvbHMpOiBVc2UgYmZkX2lzX2xvY2FsX2xhYmVsIHRvIGRldGVybWluZQotCWlmIGEgc3ltYm9sIHJlcHJlc2VudHMgYSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgbGFiZWwuCi0JKGNvcHlfb2JqZWN0KTogR2l2ZSB0aGUgQkZEIGJhY2tlbmRzIGEgY2hhbmNlIHRvIGNvcHkgYW55IHByaXZhdGUKLQliZmQgZGF0YSBmcm9tIHRoZSBpbnB1dCBCRkQgdG8gdGhlIG91dHB1dCBCRkQuCi0JKHNldHVwX3NlY3Rpb24pOiBHaXZlIHRoZSBCRkQgYmFja2VuZHMgYSBjaGFuY2UgdG8gY29weSBhbnkgcHJpdmF0ZQotCXNlY3Rpb24gZGF0YSBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4KLQotTW9uIE1hciAxNCAxMToxNTo1OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogb2JqY29weS5jIChtYW5nbGVfc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKHNldHVwX3NlY3Rpb24pOiBTZXQgb3NlY3Rpb24gaGVyZSBpbnN0ZWFkIG9mIGNhbGxpbmcKLQltYW5nbGUgc2VjdGlvbiB0byBkbyBpdC4KLQotTW9uIE1hciAxNCAxMjoxMTowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKHdyaXRlX2FyY2hpdmUpOiBDbG9zZSBpbmFyY2ggYmVmb3JlIHVubGlua2luZyBpdC4KLQotRnJpIE1hciAxMSAyMjoyMDo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvciBQb3dlclBDLCBjYWxsIHBvd2VycGNfYnVpbGRfc3R1YnMgYW5kCi0JcG93ZXJwY19yZXNvbHZlX3N0dWJzLiAgVXNlIF9fR09UMCwgbm90IF9fdG9jX3N0YXJ0LiAgSGFuZGxlIGl0IGlmCi0JdGhlIHN0YXJ0IGFuZCBlbmQgc3ltYm9scyBhcmUgbm90IGluIHRoZSB0ZXh0IHNlY3Rpb24uCi0JKHN0cnVjdCBwb3dlcnBjX3N0dWIpOiBOZXcgc3RydWN0IGRlZmluaXRpb24uCi0JKHBvd2VycGNfc3R1YnMsIHBvd2VycGNfc3R1Yl9pbnNucyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShwb3dlcnBjX2luaXRpYWxfZ290X3NpemUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwb3dlcnBjX2J1aWxkX3N0dWJzKTogTmV3IGZ1bmN0aW9uLgotCShwb3dlcnBjX3Jlc29sdmVfc3R1YnMpOiBOZXcgZnVuY3Rpb24uCi0JKHBvd2VycGNfbWFuZ2xlX3JlbG9jcyk6IENsZWFyIGV4dHJhbmVvdXMgZGF0YSBpbiAuZ290IHNlY3Rpb24uCi0JUmVhcnJhbmdlIHJlbG9jIGhhbmRsaW5nIHRvIGhhbmRsZSBFTEYgcmVsb2NzIHRoYXQgYXJlIG5vdAotCXBhcnRpYWxfaW5wbGFjZS4gIFJlc29sdmUgUEMgcmVsYXRpdmUgcmVsb2NzLgotCi1XZWQgTWFyICA5IDEzOjQ4OjExIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1vdmVfbWVtYmVycyk6IEZpeCBpdCBzbyB0aGF0IHRoZSBhYmkgcG9zaXRpb25hbCBtb2RpZmllcnMKLQlkb24ndCBkZWxldGUgYWxsIGFyY2hpdmUgbWVtYmVycyBmb2xsb3dpbmcgdGhlIGluc2VydCBwb2ludC4KLQotVHVlIE1hciAgOCAxMzoxNDo0MyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb2ZmZ3Jvay5bY2hdOiBOZXcgZmlsZXMsIHVuZGVyc3RhbmQgY29mZiBvYmplY3RzLgotCSogY29mZmR1bXAuYzogVXNlcyBjb2ZmZ3JvayB0byBkdW1wIG91dCB0aGUgZGVidWcgaW5mbyBvZiBhIGNvZmYKLQlmaWxlLgotCSogc3lzcm9mZi5pbmZvOiBEZXNjcmlwdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGUuCi0JKiBzeXNpbmZvLnksIHN5c2xleC5sOiBQYXJzZSBpbmZvIGZpbGUsIGdlbmVyYXRlIGEgcmVhZGVyLCB3cml0ZXIsCi0JaGVhZGVyIGZpbGVzIGFuZCBhIHByaW50ZXIuCi0JKiBzcmNvbnYuYzogVXNlcyBjb2ZmZ3Jvay5jIGFuZCBzeXNyb2ZmLmluZm8gdG8gY29udmVydCBhIGNvZmYKLQlmaWxlIHRvIGEgU1lTUk9GRiBmaWxlLgotCi1TYXQgRmViIDI2IDEzOjM1OjI2IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYXIuYyAoZG9fcXVpY2tfYXBwZW5kKTogUGFkIHdpdGggYSBnZW51aW5lIGNoYXJhY3RlciAxMCwKLQlyYXRoZXIgdGhhbiB3aGF0ZXZlciAnXG4nIG1pZ2h0IGhhcHBlbiB0byBiZS4KLQotVHVlIEZlYiAyMiAxODoyNTo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IElnbm9yZSBkZWJ1Z2dpbmcgc3ltYm9scyB3aGVuIGxvb2tpbmcgZm9yCi0Jc3BlY2lhbCBzeW1ib2xzIGJ5IG5hbWUuCi0KLVN1biBGZWIgMjAgMTg6NDc6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotCVN1cHBvcnQgZm9yIFBvd2VyUEMgTmV0V2FyZS4KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvciBQb3dlclBDIE5ldFdhcmUsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHRoZQotCXNwZWNpYWwgc3ltYm9scyBfX3RvY19zdGFydC4KLQkoc2VsZWN0X291dHB1dF9mb3JtYXQpOiBIYW5kbGUgYmZkX2FyY2hfcG93ZXJwYy4KLQkobWFuZ2xlX3JlbG9jcyk6IExpa2V3aXNlLgotCShwb3dlcnBjX21hbmdsZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBGZWIgMTcgMDk6Mjg6MjMgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jLCBidWNvbW0uYywgbmxtY29udi5jLCBubS5jLCBvYmpjb3B5LmMsIG9iamR1bXAuYywKLQlzaXplLmM6IFVzZSBiZmRfZ2V0X2Vycm9yIGFuZCBiZmRfc2V0X2Vycm9yIGFuZCBuZXcgZXJyb3IgbmFtZXMuCi0KLUZyaSBGZWIgMTEgMTU6NTQ6NTEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IEFkZCBtaXNzaW5nICdicmVhaycgaW4gc3dpdGNoLgotCi1Nb24gRmViICA3IDE5OjQ1OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIGJmZF9hcmNoX3Bvd2VycGMuCi0KLVN1biBGZWIgIDYgMjI6MDg6MjAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLmMgb2JqZHVtcC5jIG5sbWNvbnYuYyBvYmpjb3B5LmMgbm0uYyBhci5jIHNpemUuYyAobWFpbik6Ci0JQ2FsbCB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUuCi0KLUZyaSBGZWIgIDQgMTA6NDY6MDEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9ieXRlcyk6IE1ha2UgTUVNSFVOSyBhIGNoYXIgKiwgbm90IFBUUiwgc28gd2UKLQljYW4gZG8gYXJpdGhtZXRpYyBvbiBpdC4KLQotVGh1IEZlYiAgMyAxNDowNjo0MSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9zZWN0aW9uX3N0YWJzLCByZWFkX3NlY3Rpb25fc3RhYnMsCi0JcHJpbnRfc2VjdGlvbl9zdGFicyk6IEZ1bmN0aW9ucyBicm9rZW4gb3V0IG9mIGR1bXBfc3RhYnNfMS4KLQlGcmVlIHRoZSBzdGFicyBhbmQgc3RyaW5ncyB3aGVuIGRvbmUgd2l0aCB0aGVtLgotCi1XZWQgRmViICAyIDEzOjQyOjIzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogVXNlIGJmZF9nZXRfZmxhdm91ciBpbnN0ZWFkIG9mIHN0cnVjdCBtZW1iZXIuCi0JKiBhci5jIChwcmludF9jb250ZW50cywgZXh0cmFjdF9maWxlKSwgc2l6ZS5jCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCwgcHJpbnRfc3lzdl9mb3JtYXQpOiBVc2UgYmZkX2dldF9maWxlbmFtZSBhbmQKLQliZmRfbXlfYXJjaGl2ZSBpbnN0ZWFkIG9mIGRlcmVmZXJlbmNpbmcgdGhlIHN0cnVjdHMgZGlyZWN0bHkuCi0KLQkqIGFyLmM6IFVzZSBiZmRfZmF0YWwgYW5kIGJmZF9ub25mYXRhbCBpbnN0ZWFkIG9mIGJmZF9wZXJyb3IgYW5kIGV4aXQuCi0JSW5kZW50LiAgUmVtb3ZlIERFRlVOcy4KLQotCSogbmxtY29udi5jIChtYWluKSwgb2JqY29weS5jIChjb3B5X2ZpbGUpOiBQcmludCBtYXRjaGluZyBmb3JtYXRzCi0JaWYgYW1iaWd1b3VzIG1hdGNoLgotCSogbm0uYyAoZGlzcGxheV9maWxlLCBkaXNwbGF5X2FyY2hpdmUpLCBzaXplLmMgKGRpc3BsYXlfYmZkKToKLQlFbGltaW5hdGUgZ290b3MuCi0JUHJpbnQgbWF0Y2hpbmcgZm9ybWF0cyBpZiB0aGVyZSBpcyBhbiBhbWJpZ3VvdXMgbWF0Y2guICBVc2UKLQliZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBoYXJkY29kZWQgZXJyb3IgbWVzc2FnZSBpZiBub3RoaW5nIG1hdGNoZXMuCi0KLQkqIGFyc3VwLmMsIGFyLmMsIG9iamR1bXAuYzogVXNlIGJmZF9nZXRfZmlsZW5hbWUgaW5zdGVhZCBvZgotCWFiZmQtPmZpbGVuYW1lLgotCi0JKiBubS5jIChkaXNwbGF5X2FyY2hpdmUpOiBOZXcgZnVuY3Rpb24sIGZyb20gY29kZSBpbiBkaXNwbGF5X2ZpbGUuCi0JKGRpc3BsYXlfcmVsX2ZpbGUpOiBSZW5hbWVkIGZyb20gZG9fb25lX3JlbF9maWxlLgotCi0JKiBzaXplLmM6IEluZGVudC4KLQkoZGlzcGxheV9hcmNoaXZlKTogTmV3IGZ1bmN0aW9uIGZyb20gY29kZSBpbiBkaXNwbGF5X2ZpbGUuCi0JKGRpc3BsYXlfZmlsZSk6IENoZWNrIGJmZF9jbG9zZSBlcnJvciByZXR1cm4uCi0KLQkqIHN0cmluZ3MuYyAoc3RyaW5nc19vYmplY3RfZmlsZSk6IENoZWNrIGJmZF9jaGVja19mb3JtYXQKLQllcnJvciByZXR1cm4uCi0KLQkqIHN0cmluZ3MuYywgb2JqZHVtcC5jLCBzaXplLmM6IFVzZSBiZmRfbm9uZmF0YWwgaW5zdGVhZCBvZiBiZmRfcGVycm9yLgotCi0JKiBidWNvbW0uYzogRGVsZXRlIHJlZmVyZW5jZXMgdG8gZXhpdF9oYW5kbGVyLiAgSXQgd2Fzbid0IHNldAotCWFueXdoZXJlLCBhbmQgbm93IHRoYXQgd2UncmUgdXNpbmcgdGhlIGxpYmliZXJ0eSB4bWFsbG9jLCBpdAotCXdvdWxkbid0IGFsd2F5cyBnZXQgY2FsbGVkIGJlZm9yZSBleGl0aW5nLgotCShsaXN0X21hdGNoaW5nX2Zvcm1hdHMpOiBGdW5jdGlvbiBtb3ZlZCBmcm9tIG9iamR1bXAuYy4KLQkqIGJ1Y29tbS5oOiBEZWNsYXJlIGl0LgotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBNb3ZlIHNvbWUgdmFyaWFibGUgZGVjbHMgY2xvc2VyIHRvCi0JdGhlaXIgdXNlLiAgQWRkIHNvbWUgY29tbWVudHMuICBSZXBsYWNlIGEgbmVzdGVkIGJsb2NrIHdpdGggYQotCXJldHVybi4KLQotTW9uIEphbiAzMSAxODo1MDo0MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfbGlzdCwgZGlzcGxheV9pbmZvX3RhYmxlKTogQ2hlY2sgdGhhdAotCXRoZSBiZmQgb2YgdGhlIGR1bW15IG91dHB1dCBmaWxlIGlzIG5vdCBudWxsLgotCi1XZWQgSmFuIDI2IDEzOjEzOjE4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChmaWx0ZXJfYnl0ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKGNvcHlfc2VjdGlvbik6IENhbGwgaXQuCi0JKGNvcHlfb3B0aW9ucywgY29weV91c2FnZSwgY29weV9tYWluKTogQWRkIC0tYnl0ZSBvcHRpb24gdG8KLQlhY3RpdmF0ZSBpdC4gIEFwcHJvcHJpYXRlIHRoZSAtYiBvcHRpb24gKHdoaWNoIHdhcyBhbiB1bmRvY3VtZW50ZWQKLQlzeW5vbnltIGZvciAtRikgZm9yIGl0LCBhbHNvLiAgQWRkIC0taW50ZXJsZWF2ZSwgLWkgb3B0aW9uIGZvcgotCWFkZGl0aW9uYWwgY29udHJvbC4KLQkoc2V0dXBfc2VjdGlvbiwgY29weV9zZWN0aW9uLCBtYW5nbGVfc2VjdGlvbik6IFJlbmFtZWQgd2l0aCBubyBgcycKLQlvbiB0aGUgZW5kLgotCSogb2JqY29weS4xLCBiaW51dGlscy50ZXhpOiBEb2N1bWVudCB0aGUgbmV3IG9wdGlvbnMuCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV90YXJnZXRfdGFibGVzLCBkaXNwbGF5X3RhcmdldF9saXN0KToKLQlOZXcgZnVuY3Rpb25zIGJyb2tlbiBvdXQgb2YgZGlzcGxheV9pbmZvLgotCUVsaW1pbmF0ZSBzb21lIG1hZ2ljIGNvbnN0YW50cy4gIFVzZSBtb3JlIG1lYW5pbmdmdWwgdmFyaWFibGUgbmFtZXMuCi0JKGR1bXBfYmZkX2hlYWRlcik6IE5ldyBmdW5jdGlvbiBicm9rZW4gb3V0IG9mIGRpc3BsYXlfYmZkLgotCShkdW1wX3NlY3Rpb25faGVhZGVyKTogTmV3IGZ1bmN0aW9uIGJyb2tlbiBvdXQgb2YgZHVtcF9oZWFkZXJzLgotCShyZW1vdmVfdXNlbGVzc19zeW1ib2xzKTogRG9uJ3Qgc2hhZG93IGdsb2JhbCB2YXJpYWJsZSBuYW1lIHdpdGgKLQlwYXJhbWV0ZXIuCi0JKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IEZpeCBiYWNrd2FyZCB0ZXN0LgotCi1UdWUgSmFuIDI1IDE5OjQwOjU0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogYnVjb21tLmMgKHByaW50X2FyZWx0X2Rlc2NyKTogQ2hhbmdlIGRlY2wgb2YgYHdoZW4nIHRvIHRpbWVfdC4KLQkqIG9iamR1bXAuaDogUmVtb3ZlZC4KLQotTW9uIEphbiAyNCAxMzoyOTowMiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9maWxlKTogUmVtb3ZlIGNhbGwgdG8gbGlzdF9tYXRjaGluZ19mb3JtYXRzLgotCUl0IHdvdWxkIG5ldmVyIGJlIGNhbGxlZC4KLQkobGlzdF9tYXRjaGluZ19mb3JtYXRzKTogVGFrZSBhbiBhcmcgZ2l2aW5nIHRoZSBsaXN0IG9mIG1hdGNoaW5nCi0JZm9ybWF0cy4KLQkoZGlzcGxheV9iZmQpOiBQYXNzIHRoZSBhcmcsIGFuZCBnZXQgaXQgZmlsbGVkIGluIGJ5IGNhbGxpbmcKLQliZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgaW5zdGVhZCBvZiBiZmRfY2hlY2tfZm9ybWF0LgotCShkaXNwbGF5X2luZm8sIGRpc3BsYXlfaW5mb190YWJsZSk6IHRhcmdldF92ZWN0b3Igd2FzIHJlbmFtZWQgdG8KLQliZmRfdGFyZ2V0X3ZlY3Rvci4KLQotCSogYmludXRpbHMudGV4aSAob2JqZHVtcCk6IE5vdGUgc29tZSBsaW1pdGF0aW9ucyBvZiAtaCBzZWN0aW9uCi0JYWRkcmVzcyBwcmludGluZy4KLQotU2F0IEphbiAyMiAxNjoyMDo0NiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChNQUxMT0MpOiBTZXQgdG8gZW1wdGluZXNzIGJ5IGRlZmF1bHQuCi0JKEFMTF9DRkxBR1MpOiBBZGQgYW5kIHVzZS4KLQkoYXJwYXJzZS5oKTogTWFrZSBpdCBkZXBlbmQgb24gYXJwYXJzZS55LgotCSogYXIuYyAobGliYmZkLmgpOiBEb24ndCByZXF1aXJlIHRvIGJlIGluIC4uL2JmZC4KLQkqIG9iamR1bXAuYyAoY29tcCk6IFJlbmFtZSB0byBjb21wYXJlX3N5bWJvbHMuCi0KLUZyaSBKYW4gMjEgMjA6MjI6MzAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyk6IElmIHRoZSBmaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMsCi0JcHJpbnQgdGhlIG1hdGNoaW5nIG5hbWVzIHNvIHRoZSB1c2VyIGNhbiBjaG9vc2Ugb25lLgotCShkaXNwbGF5X2JmZCk6IENhbGwgaXQuCi0JKGRpc3BsYXlfZmlsZSk6IENhbGwgaXQuCi0KLUZyaSBKYW4gMjEgMTk6MTc6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBTdXBwb3J0IGJmZF9hcmNoX3JzNjAwMC4KLQotTW9uIEphbiAxNyAxMzo1NzoyNSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoc3RhYl9uYW1lKTogQWxsb2NhdGUgZHluYW1pY2FsbHkuCi0JKHN0YWJfcHJpbnQpOiBVc2UgcG9pbnRlcnMgdG8gc3RyaW5ncyBpbnN0ZWFkIG9mIGNoYXIgYXJyYXlzLgotCShkdW1wX3N0YWJzKTogQ2hhbmdlIGFsbG9jIGFuZCBpbml0IG9mIGFycmF5cyBhcHByb3ByaWF0ZWx5LgotCShkdW1wX3N0YWJzXzEpOiBBbHdheXMgZGVjaWRlIHdoZXRoZXIgdG8gcHJpbnQgc3RhYl9uYW1lIG9yCi0JdGhlIHN0YWIncyB0eXBlIG51bWJlciwgaWYgdW5uYW1lZC4KLQotRnJpIEphbiAxNCAxNDo0Mjo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc3RyaXBfbWFpbiwgY29weV9tYWluKTogRG9uJ3QgY2xvYmJlciB0aGUgaW5wdXQgZmlsZQotCWlmIGNvcHlfZmlsZSBmYWlscy4KLQotCSogbmxtY29udi5jIChtYWluKTogV2FybiBhYm91dCBhbiBhdHRlbXB0IHRvIHVzZSBhIHNoYXJlZCBsaWJyYXJ5Ci0Jd2l0aCB1bmluaXRpYWxpemVkIGRhdGEuCi0KLQkqIG5sbWNvbnYuYyAoc2V0dXBfc2VjdGlvbnMpOiBNYWtlIHN1cmUgdGhhdCB3ZSBhbGlnbiB0aGUKLQlvdXRwdXRfb2Zmc2V0IG9mIGVhY2ggaW5wdXQgc2VjdGlvbiBhcHByb3ByaWF0ZWx5LgotCi1UaHUgSmFuIDEzIDE3OjMyOjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX3JlbG9jcyk6IERvbid0IGNyYXNoIGlmIHNlY3Rpb24gbmFtZSBpcyBOVUxMLgotCi1UdWUgSmFuIDExIDE5OjQ2OjMzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZmlsZW1vZGUuYyAoZmlsZW1vZGVzdHJpbmcpOiBDb21tZW50ZWQgb3V0OyBub3QgdXNlZC4KLQkobW9kZV9zdHJpbmcpOiBVc2UgUE9TSVggZGVmaW5pdGlvbnMuCi0JKGZ0eXBlbGV0KTogTGlrZXdpc2UuCi0JKHJ3eCk6IFJlbW92ZWQ7IG5vIGxvbmdlciB1c2VkLgotCSogYnVjb21tLmM6IEluY2x1ZGUgYnVjb21tLmguCi0JKGJmZF9ub25mYXRhbCwgYmZkX2ZhdGFsKTogQXJndW1lbnQgaXMgY29uc3QuCi0JKGZhdGFsKTogTWFrZSBfX1NURENfXyB2ZXJzaW9uLgotCSogYnVjb21tLmggKG1vZGVfc3RyaW5nKTogRGVjbGFyZS4KLQkqIE1ha2VmaWxlLmluIChidWNvbW0ubyk6IERlcGVuZCB1cG9uIGJ1Y29tbS5oCi0KLVN1biBKYW4gIDkgMTI6MDM6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBidWNvbW0uYyAoeG1hbGxvYywgeHJlYWxsb2MpOiBEZWxldGVkLgotCSogYnVjb21tLmggKHhtYWxsb2MsIHhyZWFsbG9jKTogRml4IHByb3RvdHlwZXMsIHRvIGNvcnJlc3BvbmQgdG8KLQlsaWJpYmVydHkgdmVyc2lvbiBvZiBmdW5jdGlvbnMuCi0KLVRodSBKYW4gIDYgMDY6MTg6MTUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpOiBBZGQgYSBjaGFwdGVyIHN1bW1hcml6aW5nIHRoZSB3YXlzIHRvIHNlbGVjdAotCWFzcGVjdHMgb2YgdGhlIHRhcmdldCBmb3IgZWFjaCBwcm9ncmFtLgotCi0JKiBvYmpkdW1wLmMgKGxvbmdfb3B0aW9ucywgdXNhZ2UpOiBBZGQgbG9uZyBlcXVpdmFsZW50cyBmb3IgYWxsCi0JcmVtYWluaW5nIHNob3J0IG9wdGlvbnMgdGhhdCBsYWNrZWQgdGhlbS4KLQkqIGJpbnV0aWxzLnRleGkgb2JqZHVtcC4xOiBEb2N1bWVudCB0aGVtLgotCi0JKiBzaXplLmMgKHVzYWdlKTogVHdlYWsgdXNhZ2UgbWVzc2FnZS4KLQkqIHNpemUuMTogQWRkIG1pc3NpbmcgYD0nIGluIGV4YW1wbGVzLgotCi0JKiBiaW51dGlscy50ZXhpIHN0cmlwLjEgb2JqY29weS4xIG5sbWNvbnYuMSBvYmpjb3B5LmMgbmxtY29udi5jOgotCVVzZSAiLS10YXJnZXQ9YmZkbmFtZSIgYXMgdGhlIG9wdGlvbiB0byBzZWxlY3QgdGhlIEJGRCB0YXJnZXQsCi0JbGlrZSBubSBhbmQgc2l6ZSBhbHJlYWR5IGRvLgotCVJlc2VydmUgIi0tZm9ybWF0PWZvcm1hdCIgZm9yIHRleHR1YWwgb3V0cHV0IHNlbGVjdGlvbiBvcHRpb25zLCBidXQKLQlmb3Igbm93IGtlZXAgb2xkIG9wdGlvbiBuYW1lcyBhcyBvYnNvbGV0ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLQotCSogc3RyaW5ncy5jIChtYWluLCBzdHJpbmdzX29iamVjdF9maWxlLCB1c2FnZSk6IEFkZCAtLXRhcmdldCBvcHRpb24uCi0JKiBiaW51dGlscy50ZXhpIHN0cmluZ3MuMTogRG9jdW1lbnQgaXQuCi0KLVNhdCBKYW4gIDEgMTM6NTg6MjQgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYWluKTogQWRkIFxuIGluIGVycm9yIG1lc3NhZ2UuCi0KLVRodSBEZWMgMjMgMTI6MjM6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBhci5jIChtYWluKTogUHV0IHBhcmVucyBhcm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlLgotCSogb2JqY29weS5jIChzdHJpcF9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBSZXR1cm4gMC4KLQkoY29weV9tYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuICBSZXR1cm4gMC4KLQkqIG9iamR1bXAuYyAoZGlzcGxheV9iZmQpOiBEZWNsYXJlIHJldHVybiB2YWx1ZSBhcyB2b2lkLgotCShzdGFiX3ByaW50KTogVXNlICIiIGluc3RlYWQgb2YgMCB0byBpbml0aWFsaXplIGFycmF5LgotCShkdW1wX3N0YWJzXzEpOiBQcmludCB2bWEgdXNpbmcgcHJpbnRmX3ZtYS4KLQkoZGlzcGxheV9pbmZvKTogUHV0IHBhcmVucyBhcm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlLgotCSogc3RyaW5ncy5jIChwcmludF9zdHJpbmdzKTogQ2FzdCBwcmludGYgYXJndW1lbnRzLgotCi0JKiBvYmpjb3B5LmMgKGNvcHlfbWFpbik6IFVzZSBjb3B5X29wdGlvbnMsIG5vdCBzdHJpcF9vcHRpb25zLgotCi0JKiBubG1oZWFkZXIueSAoY29tbWFuZCk6IFdhcm4gYWJvdXQgaWxsZWdhbCBkYXRlIHZhbHVlcy4KLQotV2VkIERlYyAxNSAxMToxODowMyAxOTkzICBEYXZpZCBKLiBNYWNLZW56aWUgIChkam1AZnJvc3R5LmVuZy51bWQuZWR1KQotCi0JKiBidWNvbW0uYyBidWNvbW0uaDogUnVuIHRocm91Z2ggaW5kZW50LiAgRGUtYW5zaWRlY2wtaWZ5LgotCShiZmRfbm9uZmF0YWwpOiBOZXcgZnVuY3Rpb24uCi0JKGJmZF9mYXRhbCk6IENhbGwgaXQuCi0KLQkqIG9iamNvcHkuYyAoc21hcnRfcmVuYW1lKTogRG8gYSBjb3B5IGlmIHRoZSBkZXN0IGZpbGUgaGFzCi0JbXVsdGlwbGUgaGFyZCBsaW5rcy4gIFJlbW92ZSBzb3VyY2UgZmlsZSBvbiBzdWNjZXNzZnVsIGNvcHkuCi0JVHJ5IHRvIHByZXNlcnZlIG1vZGUgYW5kIG93bmVyIG9uIHN1Y2Nlc3NmdWwgcmVuYW1lLgotCi0JKiBvYmpjb3B5LmM6IFJ1biB0aHJvdWdoIGluZGVudC4gIENsZWFuIHVwIGEgYml0LgotCU1ha2UgZ2xvYmFsIHZhcmlhYmxlcyBzdGF0aWMuCi0JTWFrZSB7aW5wdXQsb3V0cHV0fV97dGFyZ2V0LGZpbGVuYW1lfSwgc2hvd192ZXJzaW9uIGxvY2FsCi0JdG8gdmFyaW91cyBmdW5jdGlvbnMuCi0JTmV3IGdsb2JhbCB2YXJpYWJsZSBgc3RhdHVzJyBmb3IgZXhpdCBzdGF0dXMuCi0JKHN0cmlwX21haW4sIGNvcHlfbWFpbik6IE5ldyBmdW5jdGlvbnMgd2l0aCBjb2RlIGZyb20gbWFpbi4KLQkobm9uZmF0YWwpOiBOZXcgbWFjcm8uICBVc2UgaXQgZ2xvYmFsbHkgaW5zdGVhZCBvZiBiZmRfcGVycm9yIGFuZAotCWJmZF9mYXRhbC4KLQotCShjb3B5X29iamVjdCk6IENhbGwgbWFuZ2xlX3NlY3Rpb25zIHdpdGggYmZkX21hcF9vdmVyX3NlY3Rpb25zLgotCShtYW5nbGVfc2VjdGlvbnMpOiBBZGp1c3QgZm9yIG5ldyBjYWxsaW5nIGNvbnZlbnRpb24uCi0KLUZyaSBEZWMgMTAgMTE6Mjg6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueSAoY29tbWFuZCk6IEFjY2VwdCBNQVAgYW5kIEZVTExNQVAgd2l0aG91dCBhcmd1bWVudHMuCi0JKiBubG1jb252LmMgKG1haW4pOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZSBmb3IgTUFQIGFuZCBGVUxMTUFQLgotCi1UaHUgRGVjICA5IDE3OjQ3OjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogV2FybiBhYm91dCBpbXBvcnRlZCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBpbgotCXRoZSBJTVBPUlQgbGlzdCBldmVuIGlmIHRoZSBJTVBPUlQga2V5d29yZCBpcyBub3QgdXNlZC4KLQotCSogbmxtY29udi5jIChkZWJ1ZywgdW5saW5rX29uX2V4aXQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobG9uZ19vcHRpb25zKTogQWRkICJkZWJ1ZyIgYW5kICJsaW5rZXIiLgotCShtYWluKTogSGFuZGxlIC1kIGFuZCAtbCBhcmd1bWVudHMuICBNYWtlIGNvbW1hbmQgbGluZSBpbnB1dCBhbmQKLQlvdXRwdXQgZmlsZXMgb3B0aW9uYWwuICBQYXJzZSB0aGUgY29tbWFuZCBmaWxlIGJlZm9yZSBvcGVuaW5nIHRoZQotCUJGRCdzLCB3aGljaCByZXF1aXJlcyBzdG9yaW5nIG1vcmUgaW5mb3JtYXRpb24gaW4gbG9jYWwgdmFyaWFibGVzLgotCUlmIElOUFVUIG5hbWVzIG11bHRpcGxlIGZpbGVzLCBsaW5rIHRoZW0gdG9nZXRoZXIuICBVc2UgT1VUUFVUIGZvcgotCXRoZSBvdXRwdXQgZmlsZSBuYW1lIGlmIG5vdCBuYW1lZCBvbiBjb21tYW5kIGxpbmUuCi0JKHNob3dfdXNhZ2UpOiBDaGFuZ2VkIGZvciBuZXcgb3B0aW9ucy4KLQkobGlua19pbnB1dHMpOiBOZXcgZnVuY3Rpb24gdG8gYXV0b21hdGljYWxseSBpbnZva2UgbGlua2VyIHRvCi0JaGFuZGxlIG11bHRpcGxlIElOUFVUIGZpbGVzLgotCShjaG9vc2VfdGVtcF9iYXNlX3RyeSwgY2hvb3NlX3RlbXBfYmFzZSwgcGV4ZWN1dGUpOiBOZXcgZnVuY3Rpb25zLAotCW1vc3RseSBjb3BpZWQgZnJvbSBnY2MvZ2NjLmMuCi0JKiBubG1jb252LmggKGlucHV0X2ZpbGVzLCBvdXRwdXRfZmlsZSk6IERlY2xhcmUuCi0JKiBubG1oZWFkZXIueSAoaW5wdXRfZmlsZXMsIG91dHB1dF9maWxlKTogRGVmaW5lLgotCShjb21tYW5kKTogU3VwcG9ydCBJTlBVVCB3aXRoIGEgc3RyaW5nX2xpc3QgYXJndW1lbnQuICBTdXBwb3J0Ci0JT1VUUFVULgotCShzdHJpbmdfbGlzdCk6IFJlbmFtZWQgZnJvbSBtb2R1bGVfbGlzdC4KLQkqIE1ha2VmaWxlLmluIChubG1jb252Lm8pOiBEZWZpbmUgTERfTkFNRSBiYXNlZCBvbgotCXByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLVdlZCBEZWMgIDggMTA6MDk6MDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBubG1oZWFkZXIueSAobmxtaGVhZGVyX2lkZW50aWZ5KTogTmV3IGZ1bmN0aW9uLiAgVXNlIGl0IHRvIHByaW50Ci0JdGhlIHByb2dyYW0gbmFtZSBqdXN0IG9uY2UsIGluc3RlYWQgb2Ygd2l0aCBldmVyeSBlcnJvciBtZXNzYWdlLgotCi1Nb24gRGVjICA2IDE2OjExOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChsb25nX29wdGlvbnMpOiBDaGFuZ2VkIC0taGVhZGVyLWluZm8gdG8gLS1oZWFkZXItZmlsZQotCXRvIG1hdGNoIGRvY3VtZW50YXRpb24gYW5kIHVzYWdlIG1lc3NhZ2UuCi0KLVN1biBEZWMgIDUgMDE6MzE6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIG9iamR1bXAuYyAoZHVtcF9yZWxvY3MpOiBBdm9pZCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBzeW1fcHRyX3B0cgotCWluIGEgcmVsb2NhdGlvbi4KLQotVGh1IERlYyAgMiAxNjowMDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IENoYW5nZSB2YXJpb3VzIHR5cGVzIGZyb20gYmZkX3NpemVfdHlwZSB0bwotCXNpemVfdCwgc2luY2UgdGhleSBoYXZlIHRvIGJlIGFyZ3VtZW50cyB0byBmcmVhZCBhbmQgZndyaXRlLgotCUNoYW5nZSBzZXQgZnJvbSBjaGFyICogdG8gdW5zaWduZWQgY2hhciAqLgotCShzZWxlY3Rfb3V0cHV0X2Zvcm1hdCk6IE1ha2UgbWFjaCBhcmd1bWVudCB1bnNpZ25lZC4gIEhhbmRsZQotCWJmZF9hcmNoX2FscGhhLgotCShzZXR1cF9zZWN0aW9ucyk6IERvbid0IGNvcHkgdGhlIC5yZWdpbmZvIHNlY3Rpb24gb2YgYW4gRUNPRkYKLQlmaWxlLiAgQ2FsbCBiZmRfc2V0X3JlbG9jIHRvIGluaXRpYWxpemUgdGhlIHJlbG9jYXRpb24gZmllbGRzLgotCShjb3B5X3NlY3Rpb25zKTogRG9uJ3QgY29weSB0aGUgLnJlZ2luZm8gc2VjdGlvbiBvZiBhbiBFQ09GRiBmaWxlLgotCUNvbWJpbmUgYWxsIHJlbG9jcyBmb3IgYSBzZWN0aW9uLgotCShtYW5nbGVfcmVsb2NzKTogQ2hhbmdlIHR5cGUgb2YgcmVsb2NzIHRvIHBlcm1pdCBzcGVjaWZpYwotCWZ1bmN0aW9ucyB0byBjaGFuZ2UgaXQuICBDYWxsIGFscGhhX21hbmdsZV9yZWxvY3MgZm9yIGFscGhhLAotCWRlZmF1bHRfbWFuZ2xlX3JlbG9jcyBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcy4KLQkoZGVmYXVsdF9tYW5nbGVfcmVsb2NzKTogTmV3IGZ1bmN0aW9uLiAgQWRqdXN0IHRoZSBhZGRyZXNzIG9mIGFsbAotCXJlbG9jcyBieSB0aGUgb3V0cHV0X29mZnNldC4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogQ2hhbmdlIHR5cGUgb2YgcmVsb2NzIGFyZ3VtZW50LiAgQ2FzdCBsZW5ndGgKLQlhcmd1bWVudCB0byBtZW1tb3ZlIHRvIHNpemVfdC4KLQkoYWxwaGFfbWFuZ2xlX3JlbG9jcyk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE5vdiAxNyAxNzozODo1OCAxOTkzICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChzZWxlY3Rfb3V0cHV0X2Zvcm1hdCk6IFVzZSBubG0zMi1zcGFyYyBmb3IKLQliZmRfYXJjaF9zcGFyYy4KLQotV2VkIE5vdiAxNyAxNDo0MTozNSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIG5sbWNvbnYuMTogICBhZGRlZCBtYW4gcGFnZQotCSogb2JqY29weS4xOiAgIGZpeGVkIGZvcm1hdCBlcnJvcnMKLQotV2VkIE5vdiAxNyAxMjowMzo0MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVc2UgQ0ZMQUdTIGFzIHdlbGwgYXMgTERGTEFHUyB3aGVuIGxpbmtpbmcuCi0KLVdlZCBOb3YgMTcgMDQ6NTA6NTUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLjE6IEZpeCB0eXBvLgotCi1Nb24gTm92IDE1IDEyOjAzOjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEJ1aWxkICJpbmZvIi4KLQkoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuMy4xOyAyLjMgaGFzIGdvbmUgb3V0LgotCi1TdW4gTm92IDE0IDAwOjI3OjI0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfc3RhYnMpOiBIYW5kbGUgc3RhYnMtaW4tc29tIGFzIGltcGxlbWVudGVkCi0JYnkgdGhlIG5ldyBCRkQgU09NIGFzc2VtYmxlci4KLQotU2F0IE5vdiAxMyAwNzoxNDowNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFyLjEgYysrZmlsdC4xIG5tLjEgb2JqY29weS4xIG9iamR1bXAuMSByYW5saWIuMSBzaXplLjEKLQlzdHJpbmdzLjEgc3RyaXAuMTogUmVwbGFjZSBcKGVtIGluIE5BTUUgc2VjdGlvbiB3aXRoIFwtIHNvCi0JbWFrZXdoYXRpcyBjYW4gZ3JvayBpdC4KLQotVHVlIE5vdiAgOSAxNToyMjoxMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoaTM4Nl9tYW5nbGVfcmVsb2NzKTogQWRqdXN0IHJlbG9jIGFkZHJlc3MgYnkKLQlzZWN0aW9uIG91dHB1dF9vZmZzZXQuCi0KLUZyaSBOb3YgIDUgMTI6MTE6NTIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLnRleGk6ICBhZGRlZCBubG1jb252IGNoYXB0ZXIKLQotV2VkIE5vdiAgMyAxNjoxMDo1MCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVdlZCBOb3YgIDMgMTU6MDk6MjMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCBnZXQgcmlkIG9mIGR2aSBvciBpbmZvIGZpbGVzLgotCi1UdWUgTm92ICAyIDEzOjI5OjU5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChTX0lTTE5LKTogRGVmaW5lIGFzIDAgaWYgdGhlcmUncyBubyBTX0lGTE5LLgotCi1GcmkgT2N0IDI5IDE2OjAyOjM0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogTW92ZSBvYmpjb3B5IGRvY3MgaW50byBhbHBoYWJldGljYWwgb3JkZXIuCi0KLQkqIG9iamR1bXAuYzogVXNlIHhtYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuCi0KLUZyaSBPY3QgMjkgMTE6MTE6MTQgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGluZm8pOiBSZW5hbWUgdG8gZm9ybWF0c19pbmZvLgotCShkdW1wX3N0YWJzXzEpOiBCZXR0ZXIgY29tbWVudHMgYW5kIGZvcm1hdHRpbmcuCi0KLVRodSBPY3QgMjggMTk6NDM6MTYgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYWluKTogQWx3YXlzIGNyZWF0ZSB0aGUgYXJjaGl2ZSB3aGVuIHF1aWNrIGFwcGVuZGluZywKLQlldmVuIGlmIG5vIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBnaXZlbi4KLQotV2VkIE9jdCAyNyAxMjowMzowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IFNldCBzaGFyZWREZWJ1Z1JlY29yZE9mZnNldCBhbmQKLQlzaGFyZWREZWJ1Z1JlY29yZENvdW50IGZpZWxkcyBpbiBleHRlbmRlZCBoZWFkZXIuCi0KLQkqIG5sbWNvbnYuYyAobWFpbik6IEZvcmNlIG1vZHVsZU5hbWUgZmllbGQgdG8gdXBwZXIgY2FzZS4KLQotTW9uIE9jdCAyNSAxNjo0NTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAobWFpbik6IEdpdmUgYSB1c2FnZSBtZXNzYWdlIGlmIHRoZXJlIGFyZSB0b28gbWFueQotCWFyZ3VtZW50cy4KLQotTW9uIE9jdCAyNSAxMDozNzowOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Acm92ZXIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtaW5mbyk6IFJld3JpdGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgVlBBVEgsCi0Jc28gRlNGIGRpc3RyaWJ1dGlvbnMgKHdpdGggaW5mbyBmaWxlcyBpbiAkKHNyY2RpcikpIGluc3RhbGwKLQlwcm9wZXJseS4KLQkoRElTVFNUVUZGKTogQnVpbGQgbmxtaGVhZGVyLmMgdG9vLgotCi1GcmkgT2N0IDIyIDExOjQzOjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBhci5jIChwcm9ncmFtX25hbWUpOiBEb24ndCBkZWZpbmUgaGVyZS4KLQkqIG9iamR1bXAuYzogSW5jbHVkZSAiYnVjb21tLmgiLgotCSh4bWFsbG9jKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgotCShwcm9ncmFtX25hbWUpOiBEb24ndCBkZWZpbmUgaGVyZS4KLQkocHJvZ3JhbV92ZXJzaW9uKTogRml4ZWQgdHlwZSBpbiBkZWNsYXJhdGlvbi4KLQkqIHNpemUuYzogSW5jbHVkZSAiYnVjb21tLmgiLgotCShwcm9ncmFtX25hbWUpOiBEb24ndCBkZWNsYXJlIGhlcmUuCi0KLUZyaSBPY3QgMjIgMTQ6MTA6NDEgMTk5MyAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogaGlkZSBkZWNsYXJhdGlvbiBpbiBGUFJJTlRGX0FMUkVBRFlfREVDTEFSRUQKLQotRnJpIE9jdCAgMSAxMjo0MzowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG5sbWNvbnYuYyAoaTM4Nl9tYW5nbGVfcmVsb2NzKTogUmVzb2x2ZSBhbmQgcmVtb3ZlIFBDIHJlbGF0aXZlCi0JcmVsb2NzIGFnYWluc3QgZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBzYW1lIHNlY3Rpb24uCi0KLVRodSBTZXAgMzAgMTY6NDY6MjYgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGJpbnV0aWxzLmR2aSk6IHVzZSBURVhJRElSIHRvIGZpbmQgdGV4aW5mby50ZXgKLQotU2F0IFNlcCAyNSAxODowOToyOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc2ltcGxlX2NvcHksIHNtYXJ0X3JlbmFtZSk6IE5ldyBmdW5jdGlvbnMuCi0JKG1haW4pOiBVc2UgdGhlbS4KLQotRnJpIFNlcCAyNCAxNTozODoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbiwgZGlzdGNsZWFuKTogUmVjdXJzZSBpbnRvIHRlc3RzdWl0ZS4KLQotVGh1IFNlcCAyMyAwMTowNTowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoc2V0dXBfc2VjdGlvbnMsIGNvcHlfc2VjdGlvbnMpOiBJZiBzdHJpcHBpbmcsIGRvbid0Ci0JY29weSBTRUNfREVCVUdHSU5HIHNlY3Rpb25zLgotCSogb2JqZHVtcC5jIChkdW1wX2hlYWRlcnMpOiBQcmludCBTRUNfREVCVUdHSU5HIGZsYWcuCi0KLQkqIG9iamR1bXAuYyAodXNhZ2UpOiBNZW50aW9uIC0tc3RhYnMuCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiBDb3B5IGFsbCBhcHBsaWNhYmxlIGZpbGUgZmxhZ3MuCi0JKGNvcHlfZmlsZSk6IERvbid0IGNvcHkgRVhFQ19QIHNwZWNpYWxseSBoZXJlLgotCi1Nb24gU2VwIDIwIDE5OjI4OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogQWRqdXN0IGRhdGEgc2VjdGlvbiBzaXplIHRvIGNvcnJlc3BvbmQgdG8gYnNzCi0JYWxpZ25tZW50IGFkanVzdG1lbnQuICBDbGVhciBCU0ZfU0VDVElPTl9TWU0gaWYgc3ltYm9sIGlzIG1vdmVkIHRvCi0JYSBkaWZmZXJlbnQgc2VjdGlvbi4gIFVzZSB0aW1lX3QgZm9yIHRpbWUgdmFyaWFibGUuCi0JKHNldHVwX3NlY3Rpb25zKTogT25seSBwdXQgc2VjdGlvbnMgd2l0aCBjb250ZW50cyBpbiBvdXRwdXQgTkxNLgotCShpMzg2X21hbmdsZV9yZWxvY3MpOiBObyBzeW1ib2xzIGFyZSBjb21tb24gYXQgdGhpcyBwb2ludC4gIEFkZAotCWNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCi1GcmkgU2VwIDEwIDExOjAwOjQwIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jOiBNYWRlIHRoZSAtLXN0YWJzIG9wdGlvbiB3b3JrIGZvciBzdGFicy1pbi1jb2ZmLgotCShFTEZfU1RBQl9ESVNQTEFZKTogUmVtb3ZlZC4KLQkoZHVtcF9lbGZfc3RhYnMpOiBSZW5hbWVkIHRvIGR1bXBfc3RhYnMsIGNoYW5nZWQgdG8gcnVuIGZvcgotCWFueSBvYmplY3QgZmlsZSBmb3JtYXQuCi0JKGR1bXBfZWxmX3N0YWJzXzEpOiBSZW5hbWVkIHRvIGR1bXBfc3RhYnNfMSwgYWRkZWQgY2FsbHMgdG8KLQlnZW5lcmljIEJGRCByb3V0aW5lcyBmb3Igbm9uLUVMRiBjYXNlLCBjaGFuZ2VkIGZvcm1hdCBvZiBtZXNzYWdlCi0JZm9yIG5vLXNlY3Rpb24tZm91bmQgY2FzZS4KLQkoZGlzcGxheV9iZmQpOiBBbHdheXMgY2FsbCBkdW1wX3N0YWJzIGlmIHJlcXVlc3RlZC4KLQkoZHVtcF9kYXRhKTogQ2FsbCBiZmRfc2VjdGlvbl9zaXplIHRvIGdldCBzZWN0aW9uIHNpemUuCi0KLUZyaSBTZXAgMTAgMDg6MTI6MjMgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IHB1dCBzdHJpbmdzIGluIHRvb2xkaXIvYmluLgotCi1Nb24gU2VwICA2IDE1OjM5OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jICh0b3RhbF9ic3Nfc2l6ZSk6IFJlbW92ZWQuCi0JKG1haW4pOiBTZXQgdGhlIGJzcyB2bWEgdG8gYWx3YXlzIGZvbGxvdyB0aGUgZGF0YSBzZWN0aW9uLiAgTW92ZQotCXN5bWJvbHMgaW50byBuZXcgc2VjdGlvbnMsIGFuZCBhZGp1c3QgdmFsdWVzIGJ5IG91dHB1dF9vZmZzZXQuCi0JKHNldHVwX3NlY3Rpb25zKTogRG9uJ3QgY29weSBhbGwgc2VjdGlvbnMsIGJ1dCBpbnN0ZWFkIHBvaW50IGFsbAotCXRleHQgc2VjdGlvbnMgdG8gLnRleHQsIGFsbCBkYXRhIHNlY3Rpb25zIHRvIC5kYXRhLCBhbmQgYWxsIGJzcwotCXNlY3Rpb25zIHRvIC5ic3MuCi0JKGNvcHlfc2VjdGlvbnMpOiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVRodSBTZXAgIDIgMTI6MzQ6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JT25seSBidWlsZCBubG1jb252IGlmIGNvbmZpZ3VyZWQgZm9yIGEgTmV0V2FyZSB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW46IElmIHdlIGhhdmUgc29tZSAqLSotbmV0d2FyZSogdGFyZ2V0LCBvciBhcmUgdXNpbmcKLQlhbGwgdGFyZ2V0cywgc2V0IEJVSUxEX05MTUNPTlYgdG8gJChOTE1DT05WX1BST0cpIGluIE1ha2VmaWxlLgotCSogTWFrZWZpbGUuaW4gKFBST0dTKTogVXNlICQoQlVJTERfTkxNQ09OVikgcmF0aGVyIHRoYW4KLQkkKE5MTUNPTlZfUFJPRykuCi0KLVR1ZSBBdWcgMzEgMTQ6MTM6MzUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKEFSQ0hfYWxsKTogRGVmaW5lIEFSQ0hfaHBwYSB0b28uCi0JKGR1bXBfaGVhZGVycyk6IERvbid0IHRlc3QgZm9yIFNFQ19CQUxJR04gaWYgaXQncyBub3QgZGVmaW5lZCBieQotCWJmZC5oLgotCi1UdWUgQXVnIDMxIDEzOjI5OjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jIChtYWluKTogRm9yY2UgY3JlYXRpb24gb2YgLmJzcyBzZWN0aW9uLiAgU2V0IHVwIHRoZQotCXNlY3Rpb25zIGJlZm9yZSBsb29raW5nIGF0IHRoZSBzeW1ib2xzLiAgTW92ZSBhbGwgY29tbW9uIHN5bWJvbHMKLQlpbnRvIC5ic3Mgc2VjdGlvbi4gIEF1dG9tYXRpY2FsbHkgZGVmaW5lIF9lZGF0YSBhbmQgX2VuZC4gIE9ubHkKLQlleHBvcnQgc3ltYm9scyBpbiB0aGUgZXhwb3J0IGxpc3QsIHdpdGggbXVsdGlwbGUgcHJlZml4ZXMgaWYKLQluZWNlc3NhcnkuICBXYXJuIGlmIG5vIHZlcnNpb24uICBBbHdheXMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlci4KLQlTZXQgZGF0ZSBhdXRvbWF0aWNhbGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KLQkoc2V0dXBfc2VjdGlvbnMpOiBDb3VudCBzaXplIG9mIGJzcyBzZWN0aW9ucy4KLQkobWFuZ2xlX3JlbG9jcywgaTM4Nl9tYW5nbGVfcmVsb2NzKTogQWNjZXB0IHNlY3Rpb24gYXJndW1lbnQsIGFuZAotCXRha2UgcmVsb2NfY291bnQgYXMgYSBjaGFuZ2VhYmxlIHBvaW50ZXI7IGNoYW5nZWQgY2FsbGVycy4KLQkoaTM4Nl9tYW5nbGVfcmVsb2NzKTogUmVtb3ZlIFBDIHJlbGF0aXZlIHJlbG9jcyB3aXRoaW4gYSBzZWN0aW9uLAotCWFzIHRoZXkgcmVxdWlyZSBubyBhZGp1c3RtZW50LgotCSogbmxtaGVhZGVyLnk6IEZpeGVkIG1lbW9yeSBhbGxvY2F0aW9uIHRocm91Z2hvdXQ6IHRva2VuIFNUUklORyBpcwotCW5vdyBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIGFuZCBmcmVlZCBpZiBub3QgbmVlZGVkLiAgTnVsbAotCXRlcm1pbmF0ZWQgY29weXJpZ2h0IG1lc3NhZ2UuICBBY2NlcHQgdmVyc2lvbiB3aXRoIG9ubHkgdHdvCi0Jc3RyaW5ncy4KLQkoc3ltYm9sX2xpc3Rfb3B0KTogTmV3IG5vbnRlcm1pbmFsLCBlaXRoZXIgc3ltYm9sX2xpc3Qgb3IgZW1wdHkuCi0JKHN5bWJvbF9saXN0KTogVXNlIGxlZnQgcmVjdXJzaW9uIHRvIGF2b2lkIG92ZXJmbG93aW5nIHBhcnNlcgotCXN0YWNrLgotCSh5eWxleCk6IFJlYXJyYW5nZWQgYmVnaW5uaW5nIG9mIGxpbmUgY2hlY2suICBBY2NlcHQgcXVvdGVkCi0Jc3RyaW5ncyB1c2luZyBzaW5nbGUgcXVvdGVzLiAgRW5kIGdlbmVyaWMgYXJndW1lbnQgYXQgY29tbWVudAotCWNoYXJhY3RlciBvciBwYXJlbnRoZXNlcy4KLQkoc3RyaW5nX2xpc3RfYXBwZW5kKTogRml4ZWQuCi0JKHN0cmluZ19saXN0X2FwcGVuZDEpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGJ1Y29tbS5oOiBUaGUgZmlyc3QgYXJndW1lbnQgdG8geHJlYWxsb2MgaXMgUFRSLCBub3QgY2hhciAqLgotCSogYnVjb21tLmMgKHhyZWFsbG9jKTogVXNlIFBUUiByYXRoZXIgdGhhbiBjaGFyICouCi0JKiBNYWtlZmlsZS5pbiAob2JqZHVtcC5vKTogRGVwZW5kIHVwb24gY29uZmlnLnN0YXR1cyB0byBub3RpY2UKLQktLXdpdGgtdGFyZ2V0cyBjaGFuZ2VzLgotCShubG1jb252Lm8pOiBEZXBlbmQgdXBvbiBidWNvbW0uaC4KLQotVHVlIEF1ZyAxNyAwOTo0NjowMSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcGFzcyBjcHUgdG8gY29uZmlnLmJmZC4KLQotVGh1IEF1ZyAxMiAxNjo0MzowNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgkKE5NX1BST0cpKTogRGVwZW5kIG9uIGRlbWFuZ2xlLm8uCi0JKGRlbWFuZ2xlLm8pOiBOZXcgdGFyZ2V0LgotCShjcGx1cy1kZW0ubyk6IERlcGVuZCBvbiBpdCwgdG8gZm9yY2UgY29tcGlsYXRpb24gb3JkZXIgd2hlbiBkb2luZwotCXBhcmFsbGVsIGNvbXBpbGVzLgotCi0JKiBubS5jIChwcmludF9zeW1ib2xfaW5mb197YnNkLHN5c3YscG9zaXh9KTogVGFrZSBhIGJmZCBhcmcuCi0JKHN0cnVjdCBvdXRwdXRfZm5zIHByaW50X3N5bWJvbF9pbmZvKTogRGl0dG8uCi0JKGxvbmdfb3B0aW9ucywgdXNhZ2UsIG1haW4pOiBBZGQgLUMgLS1kZW1hbmdsZSBvcHRpb24uCi0JKHByaW50X3N5bW5hbWUpOiBOZXcgZnVuY3Rpb24sIGRlbWFuZ2xpbmcgaWYgcmVxdWVzdGVkLgotCShwcmludF9zeW1ib2xzLCBwcmludF9zeW1ib2xfaW5mb197YnNkLHN5c3YscG9zaXh9KTogVXNlIGl0LgotCi1XZWQgQXVnIDExIDIyOjU3OjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFB1dCBDRkxBR1MgbGFzdCBpbiBjb21waWxhdGlvbiBydWxlcyBhbmQgb21pdCBmcm9tCi0JbGlua2luZyBydWxlcy4gIFVzZSBBUkNIREVGUyB0byBjb21waWxlIG9iamR1bXAuYy4KLQlVcGRhdGUgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLmluOiBDb25zdHJ1Y3QgQVJDSERFRlMgYmFzZWQgb24gdGhlIEJGRCB0YXJnZXQgbWFrZWZpbGUKLQlmcmFnbWVudHMuCi0JKiBvYmpkdW1wLmM6IENvbmRpdGlvbmFsaXplIGNhbGxzIHRvIHRoZSBwcmludF9pbnNuX0FSQ0ggZnVuY3Rpb25zCi0JYWNjb3JkaW5nIHRvIEFSQ0hERUZTLgotCi1UaHUgQXVnIDEyIDA4OjA2OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXIuYzogUmVtb3ZlZCBvYnNvbGV0ZSBhbmQgbm9uLWZ1bmN0aW9uYWwgR05VOTYwIGNvZGUuCi0KLVdlZCBBdWcgMTEgMTM6MDg6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzaXplLmMgKGJlcmtlbGV5X3N1bSk6IE5ldyBmdW5jdGlvbi4KLQkoYnNzc2l6ZSwgZGF0YXNpemUsIHRleHRzaXplKTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKGJzc19zZWN0aW9uX25hbWUsIGRhdGFfc2VjdGlvbl9uYW1lLCB0ZXh0X3NlY3Rpb25fbmFtZSk6IFJlbW92ZWQuCi0JKHByaW50X2JlcmtlbGV5X2Zvcm1hdCk6IE1hcCBiZXJrZWxleV9zdW0gb3ZlciBhbGwgdGhlIHNlY3Rpb25zLAotCXJhdGhlciB0aGFuIG9ubHkgcmVwb3J0aW5nIHNpemVzIG9mIHNwZWNpZmljYWxseSBuYW1lZCBzZWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluICgkKE9CSkRVTVBfUFJPRykpOiBSZW1vdmVkIGRlcGVuZGVuY3kgb24gc2l6ZS5vLgotCi1UdWUgQXVnIDEwIDEwOjQ2OjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbmxtY29udi5jLCBubG1jb252LmgsIG5sbWhlYWRlci55OiBOZXcgZmlsZXMgZm9yIHByb2dyYW0gdG8KLQljb252ZXJ0IG9iamVjdCBmaWxlcyBpbnRvIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlcy4KLQkqIE1ha2VmaWxlLmluIChOTE1DT05WX1BST0cpOiBOZXcgbWFjcm8sIGRlZmluZSB0byBiZSBubG1jb252LgotCShQUk9HUyk6IEFkZCBOTE1DT05WX1BST0cuCi0JKG5sbWhlYWRlci5jLCBubG1oZWFkZXIubywgbmxtY29udi5vLCAkKE5MTUNPTlZfUFJPRykpOiBOZXcKLQl0YXJnZXRzLgotCi1UaHUgQXVnICA1IDE1OjQ4OjMyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSBNQUtFT1ZFUlJJREVTIHRvIGFuIGVtcHR5IHN0cmluZwotCi1XZWQgQXVnICA0IDE3OjA4OjA4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqY29weS5jIChjb3B5X2ZpbGUpOiBNYWtlIGZhaWx1cmVzIHRvIHByb2Nlc3MgYSBmaWxlIG5vbmZhdGFsLgotCi1Nb24gQXVnICAyIDExOjI4OjIzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogQWRkIC1CIG9wdGlvbiwgbGlrZSAtLWZvcm1hdD1ic2QuCi0KLVR1ZSBKdWwgMjcgMTY6Mjk6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGNvcHlfZmlsZSk6IElmIHRoZSBmaWxlIGlzIG5laXRoZXIgYW4gb2JqZWN0IG5vciBhbgotCWFyY2hpdmUsIGdpdmUgYW4gZXJyb3IgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHN1Y2Nlc3MuCi0KLU1vbiBKdWwgMTkgMTY6MTM6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6IFByZWZlciBub24tbG9jYWwgc3ltYm9scyBvdmVyCi0JbG9jYWwgb25lcywgYW5kIGVzcGVjaWFsbHkgZGlzY3JpbWluYXRlIGFnYWluc3QgZGVidWdnaW5nIHN5bWJvbHMuCi0JQWxzbywgZm9yIHJlbG9jYXRlYWJsZSBmaWxlcywgdHJ5IHRvIGZpbmQgYSBzeW1ib2wgaW4gdGhlIGN1cnJlbnQKLQlzZWN0aW9uLCBpbnN0ZWFkIG9mIHBpY2tpbmcgb25lIGZyb20gc29tZSByYW5kb20gc2VjdGlvbiB3aXRoIGEKLQljb252ZW5pZW50IHZhbHVlIChyZWFkLCBzZWN0aW9uIG9mZnNldCkuCi0JKGRpc2Fzc2VtYmxlX2RhdGEpOiBDYXN0IGFyZ3VtZW50IHRvIG1hbGxvYyB0byBzaXplX3QgZmlyc3QuCi0JKGR1bXBfZGF0YSk6IExpa2V3aXNlLgotCShkdW1wX3JlbG9jcyk6IElmIGEgc2luZ2xlIHNlY3Rpb24gbmFtZSBpcyBzcGVjaWZpZWQsIHNob3cgcmVsb2NzCi0Jb25seSBmb3IgdGhhdCBzZWN0aW9uLiAgT3RoZXJ3aXNlLCBzaWxlbnRseSBvbWl0IHNlY3Rpb25zIHdpdGhvdXQKLQlyZWxvY3MuICBGb3JtYXQgdGFibGUgbmljZWx5IGV2ZW4gaWYgdmFsdWVzIGFyZSBwcmludGVkIHVzaW5nIDE2Ci0JZGlnaXRzIGluc3RlYWQgb2YgOC4KLQotRnJpIEp1bCAxNiAxNToxOTo1OSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG5tLmM6IENoYW5nZXMgZm9yIGZpbmFsIHZlcnNpb24gb2YgUE9TSVguMi4KLQkocHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3tic2Qsc3lzdixwb3NpeH0pOiBOZXcgZnVuY3Rpb25zLgotCShmb3JtYXRzKTogQWRkIGFuIGVsZW1lbnQgZm9yIGEgcG9pbnRlciB0byB0aGVtLgotCShwcmludF9zeW1ib2xzKTogQ2FsbCBpdC4KLQkocHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4LCBwcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCk6IFByb2R1Y2UKLQlvdXRwdXQgYWNjb3JkaW5nIHRvIG5ldyBQT1NJWC4yIHNwZWMuCi0KLQkqIHN0cmluZ3MuYyAocHJpbnRfc3RyaW5ncyk6IEhhbmRsZSBTVFJFQU0gYmVpbmcgTlVMTC4KLQkoc3RyaW5nc19hX3NlY3Rpb24pOiBQYXNzIGEgTlVMTC4KLQkobWFpbik6IERvbid0IG9wZW4gL2Rldi9udWxsLgotCi1UaHUgSnVsIDE1IDEyOjQ0OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogSGFuZGxlIHRoZSBtODhrLgotCShkaXNwbGF5X2JmZCk6IFVzZSBiZmRfZXJybXNnLCByYXRoZXIgdGhhbiBqdXN0IGNsYWltaW5nIHRoYXQgdGhlCi0JYmZkIGlzIG5vdCBhbiBvYmplY3QgZmlsZS4KLQotTW9uIEp1bCAxMiAxNzo1NTozNCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBtYWtlIHdvcmsgYWdhaW4gYnkgbmFtaW5nIGRpcmVjdG9yaWVzCi0JICBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGRlcGVuZGluZyBvbiB1bmRlZmluZWQgbWFjcm9zLgotCSAgKElOU1RBTExfWEZPUk0pOiBjb3JyZWN0IGJhZCBpbnN0YWxsIHRhcmdldC4KLQotRnJpIEp1bCAgMiAxNjo1ODozNCAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN0cmluZ3MuYzogRG9jIGZpeGVzLgotCi1TdW4gSnVuIDI3IDEzOjM1OjI0IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IE5vdGUgZGVwZW5kZW5jaWVzIG9uIGJ1Y29tbS5oLgotCShjcGx1cy1kZW0ubyk6IExpbmsgYysrZmlsdCB3aXRoIHZlcnNpb24uby4KLQotCSogc3RyaW5ncy5jOiBJbmNsdWRlIGJ1Y29tbS5oIGFuZCBhZGQgcHJvdG90eXBlcyB0byBvdGhlciBkZWNscy4KLQlSZW1vdmUgLWggb3B0aW9uLgotCi0JKiBidWNvbW0uaDogRGVjbGFyZSB4cmVhbGxvYy4KLQotCSogbm0uYywgb2JqY29weS5jLCBvYmpkdW1wLmMsIHNpemUuYywgc3RyaW5ncy5jIChtYWluLCB1c2FnZSk6IEFkZAotCS0taGVscCBvcHRpb24uICBQdXQgIkdOVSIgaW4gdGhlIHZlcnNpb24gbWVzc2FnZS4KLQkodXNhZ2UpOiBUYWtlIHN0cmVhbSBhbmQgZXhpdCBzdGF0dXMgYXMgYXJncy4KLQkobWFpbik6IFBhc3MgbmV3IGFyZ3MgdG8gdXNhZ2UuCi0KLUZyaSBKdW4gMjUgMjM6MTI6MTIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzdHJpbmdzLmMsIHN0cmluZ3MuMTogTmV3IGZpbGVzLgotCSogYmludXRpbHMudGV4aTogRG9jdW1lbnQgc3RyaW5ncy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgcnVsZXMgZm9yIGl0LgotCi1GcmkgSnVuIDI1IDIwOjQ0OjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6IFVzZSBzaXplLWluZGVwZW5kZW50IGJmZCBlbGYgc2VjdGlvbiBuYW1lcy4KLQotU3VuIEp1biAyMCAyMzowOTowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiBIYW5kbGUgd2lkZSBvZmZzZXRzIGJ5Ci0JY2FsbGluZyBzcHJpbnRmX3ZtYS4KLQotRnJpIEp1biAxOCAxNDoyOToxMiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzeW1zMik6ICBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZS4KLQkqIG9iamR1bXAuYyAocmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyk6ICBOZXcgZnVuY3Rpb24uCi0JKiBvYmpkdW1wLmMgKGNvbXApOiAgU2ltcGxpZnkuCi0JKiBvYmpkdW1wLmMgKGRpcy1hc3NlbWJsZV9kYXRhKTogIE1ha2Ugc2ltcGxlciBhbmQgbW9yZQotCWVmZmljaWVudCBob3cgd2UgZmlsdGVyIG91dCB1c2VsZXNzIHN5bWJvbHM6ICBKdXN0IGZpbHRlcgotCUJFRk9SRSB0aGUgc29ydCAodXNpbmcgcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scykuCi0JKiBvYmpkdW1wLmMgKG9iamR1bXBfcHJpbnRfYWRkcmVzcyk6ICBTaW1wbGlmeS4KLQlDaGFuZ2Ugb3V0cHV0IHN5bnRheCB0byBtYXRjaCBnZGIuCi0KLVRodSBKdW4gMTcgMTY6NTM6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICh6b29AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNhbm9uaWNhbGl6ZSBpbnN0YWxsLnNoOyBmb3IgdXNlIHdpdGhpbgotCXRoaXMgZGlyZWN0b3J5IChhbmQgc3ViZGlycykKLQotTW9uIEp1biAxNCAxMjoxMzoyMiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLCBpbnN0YWxsLWluZm8pOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQsCi0JdXNlIElOU1RBTExfWEZPUk07IGRlZmluZSBJTlNUQUxMX1hGT1JNCi0KLVRodSBKdW4gMTAgMTc6Mjk6MjEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgRml4IGJhZCBzaXplIHBhc3NlZCB0byB4bWFsbG9jKCkuCi0KLU1vbiBKdW4gIDcgMTI6NDE6MTIgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiAgQWRkIC1JLi4vYmZkIGZvciBzeXNkZXAuaCBhbmQgYmZkLmguCi0JKiBjb25maWd1cmUuaW46ICBObyBsb25nZXIgbmVlZCB0byBjb25maWd1cmUgdG8gZ2V0IHN5c2RlcC5oLgotCSogb2JqY29weS5jIChjb3B5X29iamVjdCk6ICBGaXggc3ltYm9sIHRhYmxlIGhhbmRsaW5nLgotCi1GcmkgSnVuICA0IDE3OjIwOjAzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBvYmpjb3B5LmMgKGZpbHRlcl9zeW1ib2xzKTogIENhbm5vdCBmaWx0ZXIgdGhlIHN5bWJvbHMKLQlpbiBwbGFjZSwgYmVjYXVzZSB0aGF0IGNvbmZ1c2VzIHRoZSByZWxvY3MsIHNvIHRha2Ugc2VwYXJhdGUKLQlwYXJhbWV0ZXIgZm9yIG91dHB1dCBhcnJheS4KLQkqIG9iamNvcHkuYyAoc3ltcHApOiAgTWFrZSB0d28gdmFyaWFibGVzOiBpc3ltcHAgYW5kIG9zeW1wcC4KLQkqIG9iamNvcHkuYyAoY29weV9vYmplY3QpOiAgQWxsb2NhdGUgc2VwYXJhdGUgYXJyYXkgKG9zeW1wcCkKLQlmb3IgZmlsdGVyZWQgc3ltYm9scy4KLQotRnJpIEp1biAgNCAxMDo1MTo0NCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGFuZ2UgcmVjdXJzaW9uIHRlc3QgdG8gcHJlc2VuY2Ugb2YgYSBjb25maWd1cmVkCi0JdGVzdHN1aXRlIGRpcmVjdG9yeQotCi1UaHUgSnVuICAzIDE0OjA1OjU3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHVuZGVyc2NvcmUuYyk6IEhhY2sgdGhlIGJhY2txdW90ZWQgY29tbWFuZCBzbyBpdAotCWRvZXNuJ3QgY2F1c2UgU29sYXJpcyBtYWtlIHRvIGJvbWIuCi0KLVRodSBKdW4gIDMgMTA6NDA6MTkgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBhZGRlZCBjKytmaWx0IGFuZCBvYmpjb3B5IHRvIE1BTlBBR0VTIHZhcmlhYmxlCi0KLVRodSBKdW4gIDMgMDA6MzI6NTIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVuYW1lIExPQURMSUJFUyB0byBFWFRSQUxJQlMKLQotV2VkIEp1biAgMiAxODozMDoyNCAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBjKytmaWx0LjEsIG9iamNvcHkuMTogIG5ldyBtYW4gcGFnZXMKLQotRnJpIE1heSAyOCAxNTowMToyNCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogIEFsc28gaW5zdGFsbCBhciBhbmQgcmFubGliIGluCi0JJCh0b29sZGlyKS9iaW47ICBuZWVkZWQgZm9yIGJ1aWxkaW5nIGxpYmdjYy5hLgotCSogb2JqZHVtcC5jIChvYmpkdW1wX3ByaW50X2FkZHJlc3MpOiAgRml4IHRoZSBjaGVjawotCSJjb2luY2lkZW50YWwiIGxhYmVsIG1hdGNoZXMgYnkgZGlzLWFsbG93aW5nIHVuZGVmaW5lZAotCW9yIGNvbSBzeW1ib2xzLgotCi1UaHUgTWF5IDI3IDE2OjU4OjMxIDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBiaXV0aWxzLnRleGk6ICByZXZpc2VkIGMrK2ZpbHQgY2hhcHRlcgotCi1XZWQgTWF5IDI2IDE3OjI0OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0MgYW5kIENGTEFHUy4KLQotVHVlIE1heSAyNSAwMDoyNjo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChzbHVycF9zeW10YWIpOiBQcmludCB3YXJuaW5nIGZvciBiYWQgc3ltYm9sIHRhYmxlLgotCShiZmRfZWxmMzJfZmluZF9zZWN0aW9uLCBFbGYzMl9JbnRlcm5hbF9TaGRyKTogVXBkYXRlZAotCWRlY2xhcmF0aW9ucyBhbmQgdXNlcy4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IERvbid0IGJ1aWxkIGJpbnV0aWxzLm1tLgotCi1GcmkgTWF5IDIxIDEwOjUxOjE5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbm0uYzogQWRkIC1mLy0tZm9ybWF0LCAtUC8tLXBvcnRhYmlsaXR5LCAtdC8tLXJhZGl4IG9wdGlvbnMuCi0JTWFrZSBnbG9iYWwgdmFyaWFibGVzIHN0YXRpYy4KLQkobWFpbik6IE1ha2UgLXYgbGlrZSAtbiwgbm90IC1WLCBhbmQgbWFrZSAtQSBsaWtlIC1vLCBmb3IgUE9TSVguMi4KLQkoc2V0X3ByaW50X3JhZGl4LCBzZXRfb3V0cHV0X2Zvcm1hdCwKLQlwcmludF97b2JqZWN0X2ZpbGVuYW1lLGFyY2hpdmVfZmlsZW5hbWUsYXJjaGl2ZV9tZW1iZXIsc3ltYm9sX2luZm99Ci0Je2JzZCxzeXN2LHBvc2l4fSk6IE5ldyBmdW5jdGlvbnMuCi0JKGRpc3BsYXlfZmlsZSwgcHJpbnRfc3ltYm9scyk6IENhbGwgdGhlbS4KLQotCSogYXIuYzogSW1wcm92ZSBlcnJvciBtZXNzYWdlcy4KLQotCSogbm0uYyAobWFpbik6IEhhbmRsZSBsb25nIG9wdGlvbnMgdGhhdCBqdXN0IHNldCBhIGZsYWcuCi0KLQkqIG5tLmMgKG1haW4pLCBhci5jIChkb19zaG93X3ZlcnNpb24pLCBvYmpjb3B5LmMgKG1haW4pLCBzaXplLmMKLQkobWFpbik6IEV4aXQgYWZ0ZXIgcHJpbnRpbmcgdGhlIHZlcnNpb24gbnVtYmVyLCBwZXIgdGhlIEdOVSBjb2RpbmcKLQlzdGFuZGFyZHMuCi0KLU1vbiBNYXkgMTcgMTM6MjA6MjUgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIFJFQURNRSwgTWFrZWZpbGUuaW46ICBNaW5vciB1cGRhdGVzIGZvciAyLjIuCi0KLUZyaSBNYXkgMTQgMTE6MTI6MjYgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICh1bmRlcnNjb3JlLmMpOiAgQXV0b21hdGljYWxseSBnZW5lcmF0ZQotCSh1c2luZyBubSkgYSBmaWxlIHdpdGggdGhlIHZhcmlhYmxlIHByZXBlbmRzX3VuZGVyc2NvcmUuCi0JKiBNYWtlZmlsZS5pbiAoYysrZmlsdCk6ICBMaW5rIHVuZGVyc2NvcmUubyB3aXRoIGNwbHVzLWRlbS5vCi0Jc28gdGhhdCBpbml0aWFsIHVuZGVyc2NvcmVzIGdldCByZW1vdmVkIGlmZiBhcHByb3ByaWF0ZS4KLQkqIGJpbnV0aWxzLnRleGk6ICBQcmVsaW1pbmFyeSBkb2N1bWVudGF0aW9uIGZvciBjKytmaWx0LgotCSogTWFrZWZpbGUuaW4sIGJpbnV0aWxzLnRleGk6ICBTZXQgdG8gdmVyc2lvbiAyLjIuCi0KLQkqIE5FV1M6ICBNZW50aW9uIGNvcHktPm9iamNvcHkgcmVuYW1pbmcgYW5kIG5ldyBjKytmaWx0IHByb2dyYW0uCi0KLVdlZCBNYXkgMTIgMTI6MDU6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY3BsdXMtZGVtLm8sICQoREVNQU5HTEVSX1BST0cpKTogQnVpbGQgdGhlCi0JZGVtYW5nbGVyIHZpYSBjcGx1cy1kZW0ubywgcmF0aGVyIHRoYW4gZGlyZWN0bHkgZnJvbSB0aGUgLmMgZmlsZS4KLQotCSogb2JqY29weS5jOiBSZW5hbWVkIGZyb20gY29weS5jLCB1cGRhdGVkIGNvbW1lbnRzIGFjY29yZGluZ2x5LgotCSogTWFrZWZpbGUuaW4sIGJpbnV0aWxzLnRleGk6IFJlbmFtZWQgY29weSB0byBvYmpjb3B5LgotCSogaXMtc3RyaXAuYywgbWF5YmUtc3RyaXAuYywgbm90LXN0cmlwLmM6IFVwZGF0ZWQgY29tbWVudHMgZm9yCi0JcmVuYW1lIG9mIGNvcHkgdG8gb2JqY29weS4KLQotTW9uIE1heSAxMCAxNzoyMDoxOCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aSAoc3RyaXAsIC12IG9wdGlvbik6ICBGaXggdHlwby4KLQotRnJpIE1heSAgNyAxMzo1Nzo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogRGVmaW5lLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBkb3duIFJVTlRFU1QuCi0KLVR1ZSBNYXkgIDQgMTA6MDY6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoREVNQU5HTEVSX1BST0cpOiBOYW1lIGl0IGMrK2ZpbHQuCi0JKFBST0cpOiBBbHNvIGJ1aWxkIGFuZCBpbnN0YWxsIENPUFlfUFJPRy4KLQotTW9uIE1heSAgMyAxOToxMTo0OCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgZGVmaW5pdGlvbiBvZiAkKHRvb2xkaXIpIHRvIG1hdGNoIEZTRi4KLQotV2VkIEFwciAyOCAyMzo0MTozMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHNpemUuYyAodXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCShtYWluKTogQ2xlYW4gdXAgb3B0aW9uIHBhcnNlci4KLQotCSogb2JqZHVtcC5jICh1c2FnZSk6IEFkZCBtaXNzaW5nIG9wdGlvbnMuCi0JKGRpc3BsYXlfZmlsZSk6IFByaW50IHByb2dyYW0gbmFtZSBiZWZvcmUgY2FsbGluZwotCWJkZl9wZXJyb3IuCi0KLQkqIG5tLmMgKHVzYWdlKTogQWRkIG1pc3Npbmcgb3B0aW9ucy4KLQkobWFpbik6IENsZWFuIHVwIG9wdGlvbiBwYXJzZXIuCi0JKGRpc3BsYXlfZmlsZSk6IFByaW50IHByb2dyYW0gbmFtZSBiZWZvcmUgY2FsbGluZwotCWJkZl9wZXJyb3IuCi0KLQkqIGNvcHkuYyAoY29weV91c2FnZSwgc3RyaXBfdXNhZ2UpOiBBZGQgbWlzc2luZyBvcHRpb25zLgotCi0JKiBhci5jICh1c2FnZSk6IE5ldyBmdW5jdGlvbi4KLQkobWFpbik6IENhbGwgaXQuCi0JKG9wZW5faW5hcmNoLCBkb19xdWlja19hcHBlbmQpOiBQcmludCBwcm9ncmFtIG5hbWUgYmVmb3JlIGNhbGxpbmcKLQliZGZfcGVycm9yLgotCi1UaHUgQXByIDIyIDE1OjAxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbm0uYyAobWFpbik6IEFjY2VwdCBhbmQgaWdub3JlIC1BIGFuZCAtQiBmb3IgTUlQUyBjb21wYXRpYmlsaXR5LgotCi1Nb24gQXByIDE5IDE0OjA2OjU5IDE5OTMgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZGVkIEZMQUdTX1RPX1BBU1Mgc28gdGVzdHMgZ2V0IHJ1biBvbiBmcmVzaGx5Ci0JYnVpbHQgYmluYXJpZXMgaWYgdGhleSBleGlzdC4gKG90aGVyd2lzZSB0aGUgcGF0aCkKLQotV2VkIEFwciAgNyAyMjoyMjo1MCAxOTkzICBSb2IgU2F2b3llICAocm9iQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGNoZWNrIHRhcmdldCB0byB1c2UgRGVqYUdudS4KLQotVGh1IEFwciAgMSAxMjozNzoxMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBhbTI5ay1waW5zbi5jLCBpOTYwLXBpbnNuLmMuCi0Jb2JqZHVtcC5jOiBhMjlrIGFuZCBpOTYwIGFyZSBgZGlzYXNzZW1ibGUnIG5vdCBgcHJpbnQnLgotCi0JKiBvYmpkdW1wLmM6IFJlbmFtZSBwcmludF9hZGRyZXNzIHRvIG9iamR1bXBfcHJpbnRfYWRkcmVzcwotCWFuZCBjaGFuZ2UgcGFyYW1ldGVycy4KLQkoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBvYmpkdW1wX3ByaW50X2FkZHJlc3MuCi0KLVdlZCBNYXIgMzEgMTA6MjU6MjkgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IHByaW50X2luc25fc3BhcmMgaXMgbm93IGEKLQlgZGlzYXNzZW1ibGUnIG5vdCBhIGBwcmludCcuCi0JTWFrZWZpbGUuaW46IFJlbW92ZSBzcGFyYy1waW5zbi5jIChub3cgaW4gbGlib3Bjb2Rlcy5hKS4KLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogVXNlIG5ldyByZWFkX21lbW9yeV9mdW5jIHN0dWZmLgotCi1UaHUgTWFyIDI1IDEwOjM4OjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChmcHJpbnRmKTogRGVjbGFyYXRpb24gb2YgdmFyaWFkaWMgZnVuY3Rpb24gaGFkIGJldHRlcgotCWJlIGEgcHJvdG90eXBlIGZvciBBTlNJIEMgc3lzdGVtcy4KLQotTW9uIE1hciAyMiAyMzoxOTo0NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW5hbWUgdGVzdC1pbnN0YWxsIHRvIGluc3RhbGwtY2hlY2sKLQotRnJpIE1hciAxOSAxNDo0MDowOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNhc3NlbWJsZV9kYXRhKTogQWRkIEg4NTAwLgotCi1GcmkgTWFyIDE5IDEwOjU2OjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKHVzYWdlKTogTWVudGlvbiBsb25nIG9wdGlvbnMuCi0KLVRodSBNYXIgMTggMTQ6MjI6MTcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBubS5jOiAgTW9kaWZ5IGJlaGF2aW9yIG9mIC1vIGZsYWcgZm9yIGFyY2hpdmVzIHRvIG1hdGNoCi0JQlNENC40IGFuZCBTdW5vcyA0OiAgUHJlZml4IGFyY2hpdmUgbmFtZSBiZWZvcmUgZWFjaCBsaW5lLgotCi0JKiBtNjhrLXBpbnNuLmM6ICBSZW1vdmVkLiAgU3Vic3VtZWQgYnkgLi4vb3Bjb2Rlcy9tNjhrLWRpcy5jLgotCSogaTM4Ni1waW5zbi5jOiAgUmVtb3ZlZC4gIFN1YnN1bWVkIGJ5IC4uL29wY29kZXMvaTM4Ni1kaXMuYy4KLQkqIE1ha2VmaWxlLmluOiAgQWRqdXN0IGFjY29yZGluZ2x5LgotCSogb2JqZHVtcC5jOiAgU3VwcG9ydCBuZXctc3R5bGUgZGlzYXNzZW1ibGVycyAob25lcyB0aGF0IHVzZQotCXRoZSBpbnRlcmZhY2Ugb2YgLi4vaW5jbHVkZS9kaXMtYXNtLmgpLgotCi1UaHUgRmViIDI1IDE1OjU3OjAwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBXaGVuIG1ha2luZyB0YXIgZmlsZSwgcmVtb3ZlIHRleGluZm8vKiwKLQlleGNlcHQgZm9yIHRleGluZm8vdGV4aW5mby50ZXguCi0JKiBhcmR1cC5jOiAgQWRkIGV4dGVybiBkZWNsYXJhdGlvbiBvZiBzdHJkdXAuCi0JKiBNYWtlZmlsZS5pbiAodGVzdHN1aXRlKTogIEFkZCAnZWxzZSB0cnVlJyBzaW5jZSBvdGhlcndpc2UKLQlVbHRyaXggL2Jpbi9zaCBjb21wbGFpbnMuCi0KLVdlZCBGZWIgMjQgMTk6NDQ6MTggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFNldCBWRVJTSU9OIHRvIDIuMS4KLQkqIFJFQURNRSwgTkVXUzogVXBkYXRlcy4KLQkqIG5tLmM6ICBBZGQgLXYgYXMgYSBzeW5vbnltIGZvciAtVi4KLQotVHVlIEZlYiAyMyAxOTowMDo1MCAxOTkzICBNaWtlIFdlcm5lciAgKG10d0Bwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIHRlc3RzdWl0ZSB0byBjb25maWdkaXJzLgotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHRlc3RzdWl0ZS4KLQotTW9uIEZlYiAyMiAyMjo1MjoxMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6ICBQcmludCBmdW5jdGlvbiBuYW1lcyB3aGVuCi0JZ2l2ZW4gYnkgYmZkX2ZpbmRfbmVhcmVzdF9saW5lLiAgSWYgbm90IC0gc3RpbGwgcHJpbnQKLQlsaW5lIG51bWJlcnMuCi0KLU1vbiBGZWIgMjIgMDc6NTQ6MDMgMTk5MyAgTWlrZSBXZXJuZXIgIChtdHdAcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMvdGVzdHN1aXRlOiBtYWRlIG1vZGlmaWNhdGlvbnMgdG8gdGVzdGNhc2VzLCBldGMuLCB0byBhbGxvdwotICAgICAgICB0aGVtIHRvIHdvcmsgcHJvcGVybHkgIGdpdmVuIHRoZSByZW9yZ2FuaXphdGlvbiBvZiBkZWphLWdudSBhbmQgdGhlCi0JcmVsb2NhdGlvbiBvZiB0aGUgdGVzdGNhc2VzIGZyb20gZGVqYS1nbnUgdG8gYSAidG9vbCIgc3ViZGlyZWN0b3J5LgotCi1Nb24gRmViIDIyIDEwOjI3OjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX2RhdGEpOiBGcmVlIHVwIHNlY3Rpb24gY29udGVudHMgZWFjaCB0aW1lCi0JdGhyb3VnaCB0aGUgbG9vcC4gIFJlcG9ydGVkIGJ5IG1pbnlhcmRAYm5yLmNhLgotCi1TdW4gRmViIDIxIDEwOjU1OjU1IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogSW5pdGlhbCBjcmVhdGlvbiBvZiBiaW51dGlscy90ZXN0c3VpdGUuCi0JTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgbm0gdG8KLQliaW51dGlscy90ZXN0c3VpdGUgZnJvbSBkZWphLWdudS4gIFRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgotCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4JVGhpcyBtaWdyYXRpb24gaXMgcGFydCBvZiBhIG1ham9yIG92ZXJoYXVsCi0Jb2YgZGVqYWdudS4gIFRoZSBtb2RpZmljYXRpb25zIHRvIHRoZXNlIHRlc3RjYXNlcywgZXRjLiwgd2hpY2gKLQl3aWxsIGFsbG93IHRoZW0gdG8gd29yayB3aXRoIHRoZSBuZXcgdmVyc2lvbiBvZiBkZWphZ251IHdpbGwgYmUKLQltYWRlIGluIGEgZnV0dXJlIHVwZGF0ZS4KLQotRnJpIEZlYiAxMiAxMDowNToyMCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExJQklCRVJUWV9TUkNfRElSLCBMSUJJQkVSVFlfQklOX0RJUik6IE5ldyBtYWNyb3MuCi0JKiBNYWtlZmlsZS5pbiAoTElCSUJFUlRZKTogIFVzZSBMSUJJQkVSVFlfQklOX0RJUi4KLQkqIE1ha2VmaWxlLmluIChERU1BTkdMRVJfUFJPRyk6ICBOZXcgcHJvZ3JhbSB0byBidWlsZC4gIEFkZCBtYWNybwotCWFuZCBydWxlLgotCSogTWFrZWZpbGUuaW4gKFBST0dTKTogIEFkZCBERU1BTkdMRVJfUFJPRy4KLQotVHVlIEphbiAyNiAxMTo1NjozMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvcHkuYywgbm0uYywgb2JqZHVtcC5jLCBzaXplLmM6IFVzZSBuZXcgYmZkX2lzX2NvbV9zZWN0aW9uCi0JbWFjcm8gcmF0aGVyIHRoYW4gY2hlY2tpbmcgZm9yIGVxdWFsaXR5IHRvIGJmZF9jb21fc2VjdGlvbi4KLQotRnJpIEphbiAgOCAxNTo1MDowNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IEZpeCBjb2RlIHRvIGZpbmQgZmlyc3QgdXNlbGVzcwotCXN5bWJvbC4KLQotVGh1IEphbiAgNyAxMzoxMzozMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAoZGlzYXNzZW1ibGVfZGF0YSk6IFVzZSBtaXBzX3ByaW50X2luc24gZm9yIE1JUFMuCi0JRG9uJ3QgY29yZSBkdW1wIGlmIGJmZF9maW5kX25lYXJlc3RfbGluZSByZXR1cm5zIGZhbHNlLgotCi1XZWQgSmFuICA2IDE3OjE0OjAxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBrbm93IGhvdyB0byBkaXNhc3NlbWJsZSB6ODAwMHMKLQl0b28uCi0KLVdlZCBKYW4gIDYgMTU6MTY6MjcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyc3VwLmggKGludGVyYWN0aXZlKSwgYnVjb21tLmggKHByb2dyYW1fbmFtZSk6ICBQcmVmaXgKLQl3aXRoICdleHRlcm4nLCB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIHNvbWUgY29tcGlsZXJzLgotCi1XZWQgSmFuICA2IDE1OjE0OjExIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogYXJwYXJzZS55OiBmaXggdW5uZWNlc3Nhcnkgc2hpZnQvcmVkdWNlCi0KLVR1ZSBEZWMgMjIgMTU6NDY6NTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIE1ha2UgY2hlY2sgZGVwZW5kIG9uIGFsbC4KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc3lzZGVwLmguCi0JKiBzaXplLmM6ICBVc2UgJXUgZm9ybWF0IHdoZXJlIGFwcHJvcHJpYXRlLgotCSogb2JqZHVtcC5jOiAgU3RhbmRhcmRpemU6ICBMX1NFVCAtPiBTRUVLX1NFVC4KLQkqIG9iamR1bXAuYzogIFVzZSBuZXcgbWFjcm8gYmZkX2FzeW1ib2xfYmZkLgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgc3RkLWhvc3QgYXMgdGhlIGRlZmF1bHQgJHtteXNfaG9zdH0uCi0KLVRodSBEZWMgMTcgMTk6Mzg6MTkgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHZpIHRhcmdldCwgZGVmaW5lIGFuZCB1c2UgVEVYSTJEVkkKLQotVHVlIERlYyAxNSAxODowNTowNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiAgRml4IHBlcm1pc3Npb25zIGJlZm9yZSByZWxlYXNlLgotCSogc2l6ZS5jOiAgVXNlIGJmZF9zaXplX3R5cGUgKGFuZCBsb25nKSB3aGVyZSBhcHByb3ByaWF0ZS4KLQkqIGFyLmM6ICBNYWtlIHdyaXRpbmcgYSBtYXAgdGhlIGRlZmF1bHQsIHRvIGJlIGNvbXBhdGlibGUKLQl3aXRoIFNZU1YgYW5kIFBvc2l4LjIuICBSZW1vdmUgc29tZSBib2d1cyBrbHVkZ2VzIHRoYXQKLQloYW5kbGVkIF9fLlNZTURFRiBkaXJlY3RseS4KLQkqIE5FV1M6ICBOZXcgZmlsZS4KLQotTW9uIE5vdiAgOSAxMzozNjo1MyAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmbGV4IG5vIGxvbmdlciBuZWVkcyB0aGUgLVMgZmxhZwotCi1TYXQgTm92ICA3IDE1OjA2OjEzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotICAgICAgICAqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IHV0aW1lIG5lZWRzIGEgcG9pbnRlciB0byBhIHV0aW1idWYKLQotCSogTWFrZWZpbGUuaW46IGhhbmRsZSAtSSBpbmNsdWRlcyBiZXR0ZXIsIGFkZGluZyAkKEJBU0VESVIpL2JmZCB0bwotCXRoZSBsaXN0IChzaW5jZSBzb21lIG9mIHRoZSBiZmQvaG9zdHMvKi5oIGZpbGVzIGluY2x1ZGUgb3RoZXIKLQlmaWxlcyBmcm9tIHRoYXQgZGlyZWN0b3J5KQotCi1GcmkgTm92ICA2IDAwOjEyOjUxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBpOTYwLXBpbnNuLmMgKE1FTV9NQVgsIE1FTV9TSVopOiAgU2V0IHVwcGVyIGJvdW5kIHByb3Blcmx5LgotCi1UaHUgTm92ICA1IDAzOjM3OjE1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JQ2xlYW4gdXAgc29tZSBvbGQgQkZEIGFuc2lmaWNhdGlvbiBtYWNyb3MuCi0KLQkqIGFyc3VwLmgsIGJ1Y29tbS5oLCBvYmpkdW1wLmg6ICBSZW1vdmUgRVhGVU4gZnJvbSBiaW51dGlscy4KLQlJdCBzdGlsbCByZW1haW5zIGFzIGEgbG9jYWwgbWFjcm8gaW4gZ21hbGxvYy5jLCB3aGljaCBpcyBkZXJpdmVkCi0JZnJvbSBzb21lIG90aGVyIGNvcHkgb2YgR05VIE1hbGxvYyBzb21ld2hlcmUgKEZJWE1FKS4KLQotCSogYXIuYywgb2JqZHVtcC5jLCBzaXplLmM6ICBSZXBsYWNlIEVYRlVOIHdpdGggUFJPVE8uICBNYWtlIHN0YXRpYwotCWZucyByZWFsbHkgc3RhdGljLgotCSogYXJzdXAuaDogIERlY2xhcmUgZXh0cmFjdF9maWxlcy4KLQotTW9uIE5vdiAgMiAxMjo0MjoxMSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKGV4dHJhY3RfZmlsZSk6IGluc3RlYWQgb2YgY2hlY2tpbmcgVVNHOiBpZiBQT1NJWF9VVElNRSwKLQl1c2UgdXRpbWUgYW5kIHV0aW1idWYgc3RydWN0dXJlLCBvdGhlcndpc2UgaWYgVVNFX1VUSU1FIHVzZSB1dGltZQotCWFuZCBhcnJheSBvZiB0d28gbG9uZ3MsIG90aGVyd2lzZSB1c2UgdXRpbWVzLgotCi1UaHUgT2N0IDE1IDEzOjU3OjM1IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXg6ICBEb2N1bWVudCB5ZXN0ZXJkYXkncyBjaGFuZ2VzIHRvIHN0cmlwIGFuZCBjb3B5LgotCi1XZWQgT2N0IDE0IDEzOjIyOjE0IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBjb3B5LmM6ICBSZS1kbyBjb21tYW5kLWxpbmUgcGFyc2luZyB0byB1c2UgZ2V0b3B0X2xvbmcoKS4KLQlBZGQgbG9uZyBvcHRpb24gbmFtZXMuICBSZS10aGluayBvcHRpb24gbGV0dGVycyB0byBiZSBtb3JlCi0JY29uc2lzdGVudC4KLQkqIGNvcHkuYzogIE5ldyBmdW5jdGlvbiBmaWx0ZXJfc3ltYm9scygpIGZvciBzdHJpcHBpbmcgb25seQotCWRlYnVnLXN5bWJvbHMgYW5kL29yIGxvY2FsIHN5bWJvbHMuICBVc2UgdGhlc2UgdG8gc3VwcG9ydAotCXRoZSBwcmV2aW91c2x5LW1pc3Npbmcgb3B0aW9ucyBvZiB0aGUgb2xkIEZTRiBzdHJpcC4KLQotVHVlIE9jdCAxMyAwMToyNDoyMCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChob3N0KTogIFVzZSAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0IHJhdGhlcgotCXRoYW4gcmVwZWF0aW5nIGEgY29weSBvZiBpdCBoZXJlLgotCi1XZWQgT2N0ICA3IDEyOjUzOjUyIDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb3B5LmMgKG1haW4pOiBFdmVuIGlmIGlzX3N0cmlwLCBhY2NlcHQgLWQgYXJndW1lbnQgaW5kaWNhdGluZwotCWFsdGVybmF0ZSBvdXRwdXQgZm9ybWF0LiAgTmVlZGVkIGJ5IGdkYiBmb3IgTmluZHkuCi0KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3ICJgIiBvcGVyYW5kIHR5cGUuCi0KLVR1ZSBPY3QgIDYgMTY6MzM6NTYgMTk5MiAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogIGFkZGVkIGRvY3VtZW50YXRpb24gZm9yICJjb3B5IgotCi1UdWUgT2N0ICA2IDE0OjIyOjU2IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBQZXJzU29ueSkKLQotCSogTWFrZWZpbGUuaW4gKCpjbGVhbiBydWxlcyk6IFNvbWUgY2xlYW5pbmcgdXAuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IE1ha2UgZGlzdHN0dWZmIGluIGdwcm9mIGZvciBhIGRpc3QuCi0KLQkqIGFyLmMgKGRvX3Nob3dfdmVyc2lvbik6ICBOZXcgZnVuY3Rpb24uCi0JKiBhci5jIChtYWluKTogIEZpeCBzbyAiYXIgLVYiIHdvcmtzLgotCi1UaHUgT2N0ICAxIDIyOjQ0OjQ1IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBub3cgdXNlcyB0aGUgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZgotCW5lc3RlZCBjYXNlcy4KLQotRnJpIFNlcCAyNSAyMjo0MTowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogaTk2MC1waW5zbi5jOiAgQ2hhbmdlIGJ6ZXJvIHRvIG1lbXNldC4KLQkqIHNwYXJjLXBpbnNuLmM6ICBDaGFuZ2UgaW5kZXggdG8gc3RyY2hyLgotCi1Nb24gU2VwIDIxIDE0OjM5OjU2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1waW5zbiAocHJpbnRfaW5zbl9hcmcsIGZldGNoX2FyZyk6IGFkZGVkIHN1cHBvcnQgZm9yCi0Jb3BlcmFuZHMgdG8gbWVtb3J5IG1hbmFnZW1lbnQgaW5zdHJ1Y3Rpb25zLCBmcm9tIFdSUy4KLQotVHVlIFNlcCAxNSAxNToyNjozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaWYgJCh0b29sZGlyKSBleGlzdHMsIGluc3RhbGwgbm0gYW5kCi0Jc3RyaXAgaW4gJCh0b29sZGlyKS9iaW4uCi0KLVRodSBTZXAgIDMgMTE6NTc6NDAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIExldCdzIGNhbGwgaXQgdmVyc2lvbiAyLjAuCi0KLVdlZCBTZXAgIDIgMDA6MjU6MTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAwLjk4LgotCSogVE9ETywgUkVBRE1FOiAgTWlub3IgdXBkYXRlcy4KLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBtb3N0bHljbGVhbiwgZGlzdGNsZWFuIHJ1bGVzLAotCWFuZCBjbGVhbmVkIHVwIGNsZWFuLCByZWFsY2xlYW4uCi0KLVN1biBBdWcgMzAgMjE6MTg6NTkgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFwIHByb2dyYW0gbmFtZXMgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0Jd2hlbiBpbnN0YWxsaW5nLgotCi1TdW4gQXVnIDMwIDE4OjA5OjAzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb25zIDEuOTcuOTAuCi0JKiBjcGx1cy1kZW0uYzogIFJlbW92ZWQuICBXYXMgbm93aGVyZSB1c2VkIC0gYW5kIGlmIHNvbWUKLQlwcm9ncmFtcyBhcmUgY2hhbmdlZCB0byB0byBkZW1hbmdsaW5nIHNob3VsZCBub3cgdXNlIHRoZQotCXZlcnNpb25zIGluIGxpYmliZXJ0eS4KLQotVGh1IEF1ZyAyNyAxMjo1ODowOSAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZCB3ZTMyawotCi1Nb24gQXVnIDI0IDE0OjUzOjQyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhci5jIChtYXBfb3Zlcl9tZW1iZXJzKTogaWYgdGhlIGVsZW1lbnQgb2YgdGhlIGFyY2hpdmUgaGFzIGEKLQludWxsIG5hbWUsIGZpbGwgaXQgaW4uCi0KLQkqIG5tLmMgKGRvX29uZV9yZWxfZmlsZSk6IG9ubHkgd2FybiBpZiBhIGJmZCdzIGZsYWdzIHNheSB0aGVyZQotCXdpbGwgYmUgc3ltYm9scyBhbmQgdGhlcmUgYXJlbid0IGFueS4KLQotV2VkIEF1ZyAxOSAxMToyMDoyNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24uYzogaGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgJ3InLCBpbnRyb2R1Y2VkIGZvciBjYXMyLgotCi1UdWUgQXVnIDE4IDIwOjQ1OjQ4IDE5OTIgIFJvYiBTYXZveWUgIChyb2JAY3lnbnVzLmNvbSkKLQotCSogbm0uYyBvYmpkdW1wLmM6IEFkZGVkIHN1cHBvcnQgZm9yIGEgK3ZlcnNpb24gKC1WKQotCXRvIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlci4KLQotCSogYXIuYywgY29weS5jOiBBZGRlZCBzdXBwb3J0IGZvciBhIC1WIG9wdGlvbiB0byBwcmludAotCXRoZSB2ZXJzaW9uIG51bWJlci4KLQotVHVlIEF1ZyAxOCAxMzoyODo0NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1hcG9sbG82OHY6IHJlbW92ZWQgLWcgZnJvbSBDQyBkZWZpbml0aW9uLgotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLU1vbiBBdWcgMTcgMTg6MzM6NDEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtNjhrLXBpbnNuLmM6ICBNaW5vciBmaXggaW4gc3R5bGUgb2Ygb3V0cHV0IChkb24ndCB1c2UKLQlyYW5nZSB0byBpbmRpY2F0ZSBmbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVycykuCi0KLVR1ZSBBdWcgMTEgMjM6NDI6MjEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGFyLmMgKG1haW4pOiAgRG9uJ3QgKmFsd2F5cyogc2V0IHRoZSB2ZXJib3NlIGZsYWchCi0KLVdlZCBBdWcgIDUgMTE6MjU6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb3B5LmM6ICBXaGVuIGlzX3N0cmlwIChiZWNhdXNlIGl0IGlzIGludm9rZWQgYXMgdGhlIHN0cmlwCi0JcHJvZ3JhbSksIGZvbGxvdyB0cmFkaXRpb25hbCBhcmd2IHByb2Nlc3Npbmc6Ci0JJ3N0cmlwIGZpbGUxIGZpbGUyJyBub3cgc3RyaXBzIGZpbGUxIGFuZCBmaWxlMiwgcmF0aGVyCi0JdGhhbiBzdHJpcHBpbmcgZmlsZTEgKGFzIGlucHV0KSwgbGVhdmluZyBvdXRwdXQgaW4gZmlsZTIuCi0KLU1vbiBKdWwgMjcgMTY6Mjg6MDggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc3BsYXlfaW5mbywgZGlzcGxheV9pbmZvX3RhYmxlKTogIENhbGwKLQliZmRfc2V0X2Zvcm1hdCgpIG9uIGR1bW15IGJmZCBiZWZvcmUgdXNpbmcgaXQgKHR3aWNlKS4KLQkqIGFyLmM6ICBNYWtlIHN1cmUgYXJjaGl2ZSBpcyBjcmVhdGVkIG9uIGNvbW1hbmQgJ3InCi0JZXZlbiB3aGVuIG5vIGVsZW1lbnRzIGFyZSBpbnNlcnRlZC4gIChDbGVhbiB1cCBhbmQKLQlzaW1wbGlmeSBzb21lIG5vbi13b3JraW5nIHJlbGF0ZWQgY29kZS4pCi0KLU1vbiBKdWwgMjAgMDI6NDg6MzggMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGhwcGEgc3VwcG9ydCBkb2Vzbid0IGFzc3VtZSBocCBPUyAoZnJvbSBzZWYpLgotCi1TYXQgSnVsIDE4IDE0OjM1OjIyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgaHBwYSBob3N0cyAoYnNkICYgaHB1eCksIGVycm9yIG1lc3NhZ2VzCi0JdG8gc3RkZXJyLCBub3Qgc3Rkb3V0Ci0KLUZyaSBKdWwgMTcgMTg6Mzk6NDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhci4xLCBiaW51dGlscy50ZXhpLCBpOTYwLXBpbnNuLmMsIG5tLjEsIG9iamR1bXAuMSwgcmFubGliLjEsCi0JICBzaXplLjEsIHNwYXJjLXBpbnNuLmMsIHN0cmlwLjE6IHJlbW92ZWQgcmNzaWQncy4KLQotVGh1IEp1bCAxNiAxNjo1NToyNCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmRvczogcmVtb3ZlZCByY3NpZC4KLQotVGh1IEp1bCAxNiAwODoyMzowNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2JmZCk6IHByaW50IHN0YXRlIG9mIEJGRF9JU19SRUxBWEFCTEUgdG9vCi0KLVR1ZSBKdW4gMzAgMjA6MjY6MTUgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHByb2dyYW1fc3VmZml4IChwYXJhbGxlbCB0byBwcm9ncmFtX3ByZWZpeCkKLQotVGh1IEp1biAyNSAwNDo1Mjo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogbm0uYyAoc29ydGVycyk6ICBMaW50LiAgUmVtb3ZlIGV4Y2VzcyB3aGl0ZXNwYWNlLgotCi1XZWQgSnVuIDI0IDEzOjQ4OjA3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBubS5jICh2YWx1ZW9mIG1hY3JvKTogIEFkZCBtaXNzaW5nIHBhcmVudGhlc2VzLgotCShUaGVpciBsYWNrIHNjcmV3ZWQgdXAgbnVtZXJpY19mb3J3YXJkKCkuKQotCi1TdW4gSnVuIDE0IDEwOjMzOjI3IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGR1bXBfZWxmX3N0YWJzKTogIEFsc28gZHVtcCAuc3RhYi5pbmRleCBhbmQKLQkuc3RhYi5leGNsIHNlY3Rpb25zLgotCShkdW1wX2VsZl9zdGFic18xKTogIFNwbGl0IG91dCBtYWluIGJvZHkgb2Ygb2xkIGR1bXBfZWxmX3N0YWJzLgotCSogb2JqZHVtcC4xLCBiaW51dGlscy50ZXhpOiAgRG9jdW1lbnQgbmV3IHNlY3Rpb25zIGR1bXBlZC4KLQotRnJpIEp1biAxMiAyMjoyMzozNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc2l6ZS5jLCBvYmpkdW1wLmMsIGJ1Y29tbS5jOiAgTGludC4KLQotVGh1IEp1biAxMSAwMToxOTowNiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkdW1wX2VsZl9zdGFicyk6IE5ldyBmZWF0dXJlOiAtLXN0YWJzIHByaW50cyBvdXQgYQotCS5zdGFiIHNlY3Rpb24gZnJvbSBhbiBFTEYgZmlsZS4gIEluc3RhbGxlZCB1bmRlciAjaWZkZWYKLQlFTEZfU1RBQl9ESVNQTEFZIHNvIGl0IGNhbiBiZSBlYXNpbHkgZGlzYWJsZWQsIHNpbmNlIGl0IHJlcXVpcmVzCi0JYmZkLWludGVybmFscyBoZWFkZXIgZmlsZXMgYW5kIHN1Y2guCi0JKiBvYmpkdW1wLjEsIGJpbnV0aWxzLnRleGk6ICBVcGRhdGUgZm9yIC0tc3RhYnMuICBBbHNvIGZpeAotCW9iamR1bXAncyBkb2MgdG8gdXNlIC0tIHJhdGhlciB0aGFuICsgZm9yIGxvbmcgb3B0aW9ucy4KLQkoRklYTUU6ICBOb3QgeWV0IGZpeGVkIGV2ZXJ5d2hlcmUgaW4gYmludXRpbHMudGV4aW5mby4pCi0KLVdlZCBKdW4gMTAgMDc6NTM6MjQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyhkaXNwbGF5X2luZm8pLCBwYXRjaGVzIGZyb20KLQltb2hyaW5nQGluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUgdG8gcHJpbnQgdGhlIHRhYmxlIG11Y2ggbW9yZQotCW5pY2VseS4KLQotVGh1IE1heSAyOCAxMzozNjoxNiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYzogIEFkZCBhbm90aGVyIGVudW0tPmludCBjYXN0LCBmb3IgdGhlIHNha2Ugb2YKLQlvbGQgY29tcGlsZXJzIChzdWNoIGFzIFBDQykuCi0KLVdlZCBNYXkgMjcgMTM6MDE6NDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcmxleC5sOiAgRG9uJ3QgaW5jbHVkZSA8c3lzZGVwLmg+ICh1bm5lZWRlZCBjb25mbGljdHMpLgotCUFkZCBkZWNsYXJhdGlvbiBvZiBzdHJkdXAoKS4KLQotRnJpIE1heSAyMiAxMzo0MDozNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBVc2Ugc3JjZGlyIGluc3RlYWQgb2YgVlBBVEggaW4gbGRncmFtL2xkbGV4Ci0JcnVsZXMsIHNpbmNlIHRoZXNlIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgYSBkaXN0cmlidXRpb24uCi0JKiBNYWtlZmlsZS5pbiAoYXJsZXguYyk6ICBEb24ndCByZS1kaXJlY3Qgb3V0cHV0LCBzaW5jZSB0aGF0Ci0JbGVhdmVzIGEgYm9ndXMgb3V0cHV0IGZpbGVzIGlmIGl0IGZhaWxzLgotCi0JKiBhcmxleC5sOiAgTWFrZSB3b3JrIHdpdGggbGV4LCBmb3Igd2hhdCBpdCdzIHdvcnRoLgotCSogTWFrZWZpbGUuaW46ICBCZXR0ZXIgbGV4IHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6ICBHZW5lcmF0ZSBmbGV4IGFuZCBiaXNvbiBvdXRwdXRzCi0JZm9yIGRpc3RyaWJ1dGlvbi4KLQotVGh1IE1heSAxNCAxNzoxNzo1OSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBnZXQgQklTT04gZGVmaW5pdGlvbiByaWdodC4KLQotRnJpIE1heSAgOCAwNzo0NzowOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogc2FuaXR5LnNoOiBkZWZhdWx0IFRNUERJUiB0byAiLiIuCi0KLVRodSBNYXkgIDcgMTI6MzQ6NTAgMTk5MiAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMudGV4aTogYWRkIGRvYyBmb3IgYXIgY29tbWFuZCBsYW5ndWFnZS4KLQotV2VkIE1heSAgNiAxODowNTozNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogYXJwYXJzZS55OiBtYWtlIEVORCBjYWxsIGFyX2VuZAotCSogYXJzdXAuYyAoYXJfZW5kKTogYWRkZWQsIGRlbGV0ZXMgdGVtcCBmaWxlIGlmIGFyY2hpdmUgc2Vzc2lvbgotCWFib3J0ZWQuCi0KLQotV2VkIE1heSAgNiAxMTowODo1MyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgYmlzb24gJiBmbGV4IGZyb20gLi4vIGlmIHRoZXkgZXhpc3QuICBBbHNvLAotCSAgRkxFWC0+TEVYLgotCi0JKiBzYW5pdHkuc2g6IHJlbW92ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdoZW4gZmluaXNoZWQuCi0KLVR1ZSBNYXkgIDUgMTI6MDA6NTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdG8gdmVyc2lvbiAxLjk3LgotCSogYXIuYzogIERlY2xhcmUgZXJybm8gZm9yIG1hY2hpbmVzIHRoYXQgbmVlZCBpdC4KLQotTW9uIE1heSAgNCAyMzoyOTo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8pOiAgSGFuZGxlIGVycm9yIGNhc2VzIHdpdGhvdXQgY29yZWR1bXAuCi0JQ2xvc2UgdGhlIGR1bW15IHRlbXBvcmFyeSBmaWxlIHdlIG9wZW4gaW4gdGhlIGxvb3AuCi0JKiBNYWtlZmlsZS5pbiAoYXJzdXAubyk6ICBBZGQga2x1ZGdlIHRvIGJ1aWxkIHdpdGggU3VuIE1ha2UuCi0KLUZyaSBNYXkgIDEgMTY6MjA6MjMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCB0ZXN0LWluc3RhbGwgdGFyZ2V0LgotCi0JKiBzYW5pdHkuc2g6IG5ldyBmaWxlLgotCi0JKiBNYWtlZmlsZS5pbjogdXNlIHNhbml0eSB0ZXN0IG9uIG1ha2UgY2hlY2suCi0KLVR1ZSBBcHIgMjEgMTM6Mzg6MzcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgdGhleSBjYW4gYmUgcGFzc2VkIG9uIHRoZQotCSAgY29tbWFuZCBsaW5lIHRvIG1ha2UuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1XZWQgQXByIDE1IDE0OjMzOjA3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcnN1cC5jLCBhcnN1cC5oLCBhcnBhcnNlLnksIGFybGV4Lmw6IHN1cHBvcnQgZm9yIGFyY2hpdmUKLQlzY3JpcHRpbmcgbGFuZ3VhZ2UuCi0KLUZyaSBNYXIgIDYgMjE6NTQ6NTMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVRodSBNYXIgIDUgMjE6MzU6NDkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjbGVhbi1pbmZvIHRhcmdldC4KLQotVHVlIE1hciAgMyAxNTozNjozNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgJChDT1BZX1BST0cpIGZyb20gUFJPR1MuICBJdCBzaG91bGRuJ3QgYmUKLQkgIGluc3RhbGxlZC4gYWRkZWQgdG9vbGRpciBhbmQgcHJvZ3JhbV9wcmVmaXguCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1TdW4gRmViIDE2IDEyOjUzOjAyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEJ1bXAgdmVyc2lvbiB0byAxLjk2LCBhbmQgcmVtb3ZlIC1iZXRhCi0Jc3VmZml4IGZyb20gZGlzdHJpYnV0aW9uIG5hbWUuCi0JKiBtNjhrLXBpbnNuLmM6ICBOZXcgbWFjcm8gQ09FUkNFX1NJR05FRF9DSEFSIHRvIGV4dHJhY3QKLQl0aGUgc2lnbmVkIHZhbHVlIG9mIGEgY2hhcmFjdGVyIChldmVuIGlmIGNoYXJzIGFyZSB1bnNpZ25lZCkuCi0JKiBzcGFyYy1waW5zbi5jOiAgQWRkIG5ldyBvcGVyYW5kIHR5cGVzLgotCi1UaHUgRmViICA2IDEyOjE0OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmMgKGRpc2Fzc2VtYmxlX2RhdGEpOiBkb24ndCBwcmludCBhIHNlY3Rpb24ncyBjb250ZW50cwotCWlmIGl0J3Mgbm90IGxvYWRhYmxlIChlZyBic3MpCi0KLVR1ZSBKYW4gMjggMTE6MTE6MDYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiBmaXhlZCBzbyB0aGF0IC12ZSBicmFuY2gKLQlkaXNwbGFjZW1lbnRzIGRvbid0IGdldCBwcmludGVkIGFzIGxhcmdlICt2ZSBvbmVzLgotCi1GcmkgSmFuIDI0IDE0OjQ3OjUzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb3B5LmMsIG5tLmMsIG9iamR1bXAuYywgc2l6ZS5jIDogY2hhbmdlZCB0byB1c2UgdGhlCi0JbmV3IHJlbG9jIHNjaGVtZS4KLQotCi1Nb24gRGVjIDMwIDE4OjM0OjQxIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBidWNvbW0uYyAocHJpbnRfYXJlbHRfZGVzY3IpOiAgVHdlZWsgdGhlIG91dHB1dCBmb3JtYXQKLQlzbyB0aGF0ICdhciB0dicgb3V0cHV0IGZvbGxvd3MgUG9zaXggMTAwMy4yL0QxMS4KLQlPdXRwdXQgaXMgbm93IGFsc28gaWRlbnRpY2FsIHRvIFN1bidzIChleGNlcHQgX18uU1lNREVGKS4KLQotTW9uIERlYyAzMCAwNjowOTo1MyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBNYWtlIGBtYWtlJyBvdXRwdXQgbW9yZSByZWFkYWJsZS4KLQotV2VkIERlYyAxOCAxNTowNDo0NSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBCdW1wIHRvIHZlcnNpb24gMS45NC4KLQotV2VkIERlYyAxMSAxNjo0ODowOSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBjeWdudXMuY29tKQotCi0JKiBhci5jOiBhZGRlZCAiYiIgdG8gZm9wZW5zIGZvciBkb3MKLQkqIGNvbmZpZ2RqLmJhdCwgbWFrZWZpbGUuZG9zIG5ldyBmaWxlcyBmcm9tIERKCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLVNhdCBEZWMgIDcgMTc6MDk6MzcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGJ1Y29tbS5oOiBjcmVhdGVkIHRvIGhvbGQgcHJvdG90eXBlcyBvZiBidWNvbW0uYwotCSogb2JqZHVtcC5oOiBjcmVhdGVkIHRvIGhvbGQgcHJvdG90eWVzIG9mIG9iamR1bXAuYwotCSogYW0yOWstcGluc24uYzogaW5jbHVkZSBvYmpkdW1wLmgKLQkqIGFyLmM6IGluY2x1ZGUgYnVjb21tLmgsIGdldCBhci5oIGZyb20gdGhlIHJpZ2h0IHBsYWNlIGFuZAotCWluY2x1ZGUgbGliYmZkLmgKLQkqIGJ1Y29tbS5jOiBkZWZ1bml6ZSBiZmRfZmF0YWwKLQkqIGNvcHkuYzogaW5jbHVkZSBidWNvbW0uaCwgbGludC4KLQkqIGk5NjAtcGluc24uaDogaW5jbHVkZSBidWNvbW0uaAotCSogbTY4ay1waW5zbi5oOiBsaW50Ci0JKiBubS5jOiBpbmNsdWRlIGJ1Y29tbS5oLCBsaW50Ci0JKiBvYmpkdW1wLmM6IGxpbnQKLQkqIHNwYXJjLXBpbnNuLmM6IGluY2x1ZGUgb2JqZHVtcC5oCi0KLQotCi1GcmkgRGVjICA2IDIzOjAyOjE0IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuICBpbnN0YWxsIHVzaW5nCi0JICBJTlNUQUxMX1BST0dSQU0gYW5kIElOU1RBTExfREFUQS4KLQotCSogY29uZmlndXJlLmluOiBjb25maWd1cmUgbm93IGRvZXMgYWxsIG9mIGl0J3Mgd29yayBmcm9tIG9iamRpciBzbwotCSAgbWFrZSBmaWxlIGV4aXN0ZW5jZSB0ZXN0cyBhZ2FpbnN0ICR7c3JjZGlyfS4KLQotVGh1IERlYyAgNSAyMjo0NjoyMiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLVdlZCBEZWMgIDQgMjI6NDI6MDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTMuCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBtYWtlLXN0cmlwLm86bWF5YmUtc3RyaXAuYyBkZXBlbmRlbmN5Ci0JZm9yIG1ha2UgdmVyc2lvbnMgdGhhdCBwcm92aWRlIGhhbGYtYmFrZWQgVlBBVEgtc3VwcG9ydCAoZS5nLiBTdW4ncykuCi0JKiBzaXplLmM6ICBJbXByb3ZlbWVudHMgc3VnZ2VzdGVkIGJ5Ci0JImRhdmlkIGQgW3pvb10genVobiIgPHpvb0BhcHMxLnNwYS51bW4uZWR1PjoKLQktIERvbid0IGVtaXQgKEJlcmtlbGV5KSBoZWFkZXJzIGlmIG5vIGZpbGVzIHdlcmUgZm91bmQuCi0JLSBSZXR1cm4gYSBub24temVybyByZXR1cm4gY29kZSBvbiBmYWlsdXJlLgotCi1TYXQgTm92IDMwIDIxOjM0OjE5IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JQ2hhbmdlcyBkdWUgdG8gaW5jbHVkZSBmaWxlIHJlbmFtaW5nOgotCSogYW0yOWstcGluc24uYzogYTI5ay1vcGNvZGUuaAktPiBvcGNvZGUvYTI5ay5oCi0JKiBzcGFyYy1waW5zbi5jOiBzcGFyYy1vcGNvZGUuaAktPiBvcGNvZGUvc3BhcmMuaAotCSogbTY4ay1waW5zbi5jOgkgbTY4ay1vcGNvZGUuaAktPiBvcGNvZGUvbTY4ay5oCi0JKiBubS5jOgkJIHN0YWIuZ251LmgJLT4gYW91dC9zdGFiX2dudS5oCi0KLVR1ZSBOb3YgMTkgMTk6MjA6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogIE1lbnRpb24gTUlOSU1JWkUgZmxhZyBmb3IgYmZkJ3MgbWFrZS4KLQotTW9uIE5vdiAxOCAxMjowNTozNyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogUkVBRE1FOiAgVmFyaW91cyBpbXByb3ZlbWVudHMuCi0KLVN1biBOb3YgMTcgMjM6NDA6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTIuCi0JKiB2ZXJzaW9uLmMsIE1ha2VmaWxlLmluOiAgR2V0IHZlcnNpb24gc3RyaW5nIGZyb20gTWFrZWZpbGUuCi0JKiBjb3B5LmMsIGlzLXN0cmlwLmMsIG5vdC1zdHJpcC5jLCBtYXliZS1zdHJpcC5jLCBNYWtlZmlsZS5pbjoKLQlNYWtlIHRoZSBzYW1lIGNoYW5nZSB0aGF0IHdlIGVhcmxpZXIgZGlkIGZvciBhci9yYW5saWI6Ci0JR2VuZXJhdGUgdHdvIGRpZmZlcmVudCBiaW5hcmllcyBmb3Igc3RyaXAgYW5kIGNvcHkgYW5kIHVzZQotCWEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggZGlmZmVyZW50IHZhbHVlcyB0byBkaXN0aW5ndWlzaAotCW9zdHJpcCBmcm9tIGNvcHkuICAoLTEgbWVhbnMgdG8gdXNlIGFyZ3ZbMF0gdG8gZGVjaWRlLAotCXNvIHlvdSBjYW4gZ2V0IHRoZSBvbGQgYmVoYXZpb3IsIGJ1dCBpdCBpcyBubyBsb25nZXIgdGhlIGRlZmF1bHQpLgotCSogY29weS5jIChjb3B5X2ZpbGUpOiAgU2V0IEVYRUNfUCBvZiBvdXRwdXQgYmZkIGlmIGlucHV0IGlzIHNvLgotCSogY29weS5jIChtYWluKTogIElmIGlzX3N0cmlwPT0tMSwgY29tcGFyZSBsYXN0IDUgY2hhcnMKLQlvZiBhcmd2WzBdLCBub3QgdGhlIHdob2xlIHBhdGguCi0JKiBjb3B5LmMgKG1haW4pOiBSZXR1cm4gMCwgbm90IDEuCi0JKiBjb3B5LmMgKHNldHVwX3NlY3Rpb25zKTogIEZpeCBkdWUgdG8gY2hhbmdlIGluIGJmZF9tYWtlX3NlY3Rpb24KLQlub3cgZmFpbGluZyBpZiBhc2tlZCBmb3IgYSBkdXBsaWNhdGUgc2VjdGlvbi4KLQkqIHN0cmlwLmMsIG9zdHJpcC5jOiAgUmVtb3ZlZCBvYnNvbGV0ZSBmaWxlcy4KLQkqIGFyLmMsIG5vdC1yYW5saWIuYywgbWF5YmUtcmFubGliLmM6Ci0JQ2hhbmdlIGVuY29kaW5nIG9mIGlzX3JhbmxpYiB2YXJpYWJsZSB0byBiZSBjb25zaXN0ZW50Ci0Jd2l0aCBpc19zdHJpcCBmb3Igc3RyaXAuY29weSAoaS5lIC0xIHRvIG1lYW5zIHVzZSBhcmd2WzBdKS4KLQotVGh1IE5vdiAxNCAyMDoxMTowMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jIChwcm9ncmFtX3ZlcnNpb24pOiBVcGRhdGUgdG8gdmVyc2lvbiAxLjkyLgotCi1UdWUgTm92IDEyIDE2OjE3OjUzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhci5jIChnZXRfcG9zX2JmZCk6ICBQcmV2aW91cyBmaXggd2FzIG1pc3NpbmcgYSAiYnJlYWsiLgotCi1UaHUgTm92ICA3IDA4OjU1OjU2IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGFtMjlrLXBpbnNuLmM6IEZpeGVkIGJ1ZyBpbiBtdGFjYywgZG1hYyBhbmQgZm1hYyBpbnN0cnVjdGlvbgotCWVuY29kaW5ncy4gKFRoYWtzIHRvIERhdmlkIFdvb2QpCi0KLVN1biBOb3YgIDMgMTQ6NTA6MjMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgkKERJU1RfTkFNRSkudGFyLlopLCBUT0RPOiAgVmFyaW91cyBmaXhlcy4KLQkqIGFyLmMgKGdldF9wb3NfYmZkKTogRml4IHRvIGhhbmRsaW5nIG9mIGJlZm9yZS9hZnRlcgotCXBvc2l0aW9uaW5nIG9wdGlvbnMuCi0JKiBidWNvbW0uYyAoZmF0YWwpOiAgTUlTU0lOR19WRlBSSU5URiBpcyBubyBsb25nZXIgYW4gaXNzdWUsCi0Jc2luY2UgbGliaWJlcnR5IGNvbnRhaW5zIHZmcHJpbnRmIGV0YyBpZiBvdGhlcndpc2UgbWlzc2luZy4KLQkqIG02OGstcGluc24uYyAocHJpbnRfaW5zbl9hcmcpOiAgU3VwcG9ydCBCQi9CVy9CTAotCXR5cGUgb3BlcmFuZHMsIGFzIHVzZWQgYnkgYnJhbmNoIGluc3RydWN0aW9ucy4KLQkqIG5tLmM6ICBEZWxlZ2F0ZSBwcmludGluZyBvZiBzeW1ib2xzIHRvIEJGRCwKLQlieSB1c2luZyBiZmRfcHJpbnRfc3ltYm9sIHRvIGRvIHRoZSBmb3JtYXR0aW5nLgotCi1Nb24gT2N0IDI4IDExOjIwOjQ3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYyAod3JpdGVfYXJjaGl2ZS5jKTogYWRkZWQgdW5saW5rIGJlZm9yZSByZW5hbWUgc2luY2Ugc29tZQotCXN5c3RlbXMgY2FuJ3QgcmVuYW1lIG9udG8gYW4gZXhpc3RhbnQgZmlsZS4KLQotTW9uIE9jdCAyMSAwOTo0NzoyMyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBubS5jOiBub3cgZG9lc24ndCBjcmFzaCBpZiBhIHN5bWJvbCB3aXRoIG5vIHNlY3Rpb24gYW5kIG5vCi0JU0VDX0FCUyBhcHBlYXJzLgotCi1UaHUgT2N0IDE3IDE1OjI1OjUwIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgdmVyc2lvbi5jOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTEuCi0KLVdlZCBPY3QgMTYgMTE6NDU6MzYgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhci5jLCBidWNvbW0uYywgY29weS5jLCBjcGx1cy1kZW0uYywgZmlsZW1vZGUuYywKLQlpOTYwLXBpbnNuLmMsIG02OGstcGluc24uYywgbm0uYywgb2JqZHVtcC5jLCBzaXplLmMsIHNwYXJjLXBpbnNuLmMsCi0JKiBzdHJpcC5jOiBBZGQgb3IgdXBkYXRlIENvcHlyaWdodCBub3RpY2UuCi0JKiBUT0RPOiAgQWRkIG5vdGUgb24gJ25tIC1hJy4KLQkqIHZlcnNpb24uYzogVXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDEuOTAuCi0JKiBNYWtlZmlsZS5pbjogRml4IG1ha2luZyBvZiBkb2N1bWVudGF0aW9uIGZvciBkaXN0LgotCi1UdWUgT2N0IDE1IDAwOjE3OjE3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46IE5ldyBrbHVkZ3kgcnVsZXMgZm9yIG1ha2luZyBhIHRhcmZpbGUuCi0JKiBNYWtlZmlsZS5pbjogRml4IGJpbmRpciBwYXRoLgotCi1Nb24gT2N0IDE0IDE3OjM0OjI5IDE5OTEgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgdGFyZ2V0cyBiaW51dGlscy5tbSwgYmludXRpbHMubWUKLQotRnJpIE9jdCAxMSAyMjo0NDoyMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCBTdW4gTWFrZSBWUEFUSCBidWdzIGJ5IGFkZGluZyBkZXBlbmRlbmNpZXMuCi0KLUZyaSBPY3QgMTEgMTI6NTE6MzMgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCB0YXJnZXQgImJpbnV0aWxzLm1zIgotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBtaW5vciByZXN0cnVjdHVyaW5nIGZvciB0ZXhpMnJvZmYgY29tZm9ydC4KLQotRnJpIE9jdCAxMSAwNDoxMjoyOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJlc3RydWN0dXJlIGNvbmZpZ3VyYXRpb24gc2NoZW1lIGZvciBiZmQsIGJpbnV0aWxzLCBsZC4KLQotCSogaW5jbHVkZS9zeXMvaC0qLmg6ICBNb3ZlIHRvIGJmZC9ob3N0cy9oLSouaC4KLQkqIGNvbmZpZ3VyZS5pbjogIFJldmlzZSB0byBzeW1saW5rIHN5c2RlcC5oIHRvIC4uL2JmZC9ob3N0cy9oLXh4eC5oLgotCUNoYW5nZSBzb21lIGNvbmZpZyBuYW1lcyB0byBtYXRjaCBvdGhlciBkaXJzLgotCSogKi5jOiAgSW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmgsIHNvIGFuc2lkZWNsIGFuZCBQUk9UTygpCi0JZ2V0IGRlZmluZWQgZmlyc3QuCi0JKiBNYWtlZmlsZS5pbjogIFVzZSAtSS4gdG8gZ2V0IHN5c2RlcC5oLgotCi1XZWQgT2N0ICA5IDIyOjQyOjU2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBubS5jIChwcmludF9zeW1ib2xzKTogIEhhbmRsZSBOVUxMIG5hbWUgZmllbGQgb2Ygc3ltYm9sLgotCSogTWFrZWZpbGUuaW46IFJlbW92ZWQgc3B1cmlvdXMgY29tbWVudC4KLQotVHVlIE9jdCAgOCAxNjo1NTowMyAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBtaW5vciB0eXBvcywgcGhyYXNpbmcsIGZvcm1hdHRpbmcgZml4ZXMuCi0KLVR1ZSBPY3QgIDggMTU6MTM6MjAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogR2V0IGhvc3QgZmlsZSBmcm9tIC4uL2JmZC9jb25maWcsIG5vdCBjb25maWcuCi0JKiBjb25maWcvKjogUmVtb3ZlIGNvbmZpZyBkaXJlY3RvcnkgYW5kIGl0cyBmaWxlcy4KLQotVHVlIE9jdCAgOCAxMzo1ODo1OSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgYmludXRpbHMuZHZpLCBiaW51dGlscy5pbmZvCi0KLQkqIGJpbnV0aWxzLnRleGluZm86IHJlbW92ZSBtb3N0IHJlbWFpbmluZyBGSVhNRSdzLCBkZWxldGUKLQlyZWZlcmVuY2VzIHRvIF9fLlNZTURFRiBieSBuYW1lCi0KLQotVHVlIE9jdCAgOCAxMDoyMzo0NCAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIG9iamR1bXAuYyAocHJpbnRfYWRkcmVzcykgUHJpbnQgYWRkcmVzc2VzIG5pY2VseS4KLQotTW9uIE9jdCAgNyAxMTozMTowNSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYXIuYywgTWFrZWZpbGUuaW4sIG5ldyBmaWxlcyB7aXMsbm90LG1heWJlfS1yYW5saWIuYzoKLQlNYWtlIHR3byBkaWZmZXJlbnQgYmluYXJpZXMgZm9yIGFyIGFuZCByYW5saWIsIGluc3RlYWQgb2YKLQlkaXN0aW5ndWlzaGluZyB0aGVtIGF0IHJ1biB0aW1lIHVzaW5nIGFyZ3ZbMF0uCi0JKE9sZCBiZWhhdmlvciBpcyBzdGlsbCBhdmFpbGFibGUgaWYgeW91ICJtYWtlIGFyX3dpdGhfcmFubGliIiwKLQlidXQgaXQgaXMgbm90IHRoZSBkZWZhdWx0LikKLQkqIHJhbmxpYi5zaCAobmV3KTogIEFuIGFsdGVybmF0aXZlIG9uZS1saW5lCi0Jc2hlbGwgaW1wbGVtZW50YXRpb24gb2YgcmFubGliLgotCi1GcmkgT2N0ICA0IDIxOjQ5OjQ0IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBvYmpkdW1wLmM6ICBDb3BlIHdpdGggcmVuYW1lcyBvZiBhIGZldyBCRkQgdHlwZXMgJiBlbnVtcy4KLQotRnJpIE9jdCAgNCAxOTowODowOSAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy50ZXhpbmZvOiBhZGQgbmV3IGZpbGUgKHJ1ZGltZW50YXJ5IGRvY24pCi0KLU1vbiBTZXAgMzAgMTI6MzA6MzkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9obWFrZS1uZXdzOiBBZGQgbmV3IGZpbGUgKGZvciBTb255IE5FV1NPUzMpLgotCSogYnVjb21tLmMgKGZhdGFsKTogIENvbmRpdGlvbmFsbHkgY29tcGlsZSBmYXRhbCgpIGRlcGVuZGluZyBvbgotCU1JU1NJTkdfVkZQUklOVEYsIGFuZCBkb24ndCBjb25mdXNlIHRoZSBpc3N1ZSB3aXRoIE5PX1ZBUkFSR1MuCi0JKiBvYmpkdW1wLmMgKGR1bXBfaGVhZGVycyk6ICBUcml2aWFsIG91dHB1dCBmb3JtYXQgY2hhbmdlLgotCSogb2JqZHVtcC5jIChkaXNwbGF5X2luZm8pOiBMb29wIG92ZXIgaW50ZWdlcnMsIG5vdCBlbnVtcywKLQl0byBhcHBlYXNlIG9sZCBjb21waWxlcnMuCi0KLU1vbiBNYXkgMjAgMTY6MTQ6MDcgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotICAgICAgICAqb2JqZHVtcC5jICpubS5jICpjb3B5LmMgOmhhbmdlZCBzb21lIHR5cGVzIHRvIHdvcmsgd2l0aCA2NCBiaXQgb2JqZWN0IGZpbGVzCi0KLVRodSBNYXkgMTYgMTY6MDY6NTUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLSAgICAgZnJvbSBib3RoZXIKLQkqIG9iamR1bXAuYyAocHJpbnRfYWRkcmVzcyk6IE1ha2UgZGlzYXNlbWJsZWQgb3V0cHV0IG1vcmUKLQljb25zaXN0ZW50IHdpdGggZ2RiIGFuZCBhczogQWRkIDB4IHdoZW4gcHJpbnRpbmcgaGV4LgotCURvbid0IHByaW50IGV4dHJhIGxlYWRpbmcgemVyb3MuCi0JQXR0ZW1wdCB0byBub3QgcHJpbnQgImZpbGVuYW1lLm8iLgotCSogb2JqZHVtcC5jOiBBZGQgc29tZSBlbnVtLXRvLWludCBjYXN0cyB0byBhY2NvbW9kYXRlIG9sZCBjb21waWxlcnMuCi0KLQotRnJpIE1heSAgMyAyMjoyMTo0NCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGNvcHkuYzogIENoYW5nZSA9JiBjb25zdHJ1Y3RzIHRvID0gJiwgc2luY2UgdGhleSBjb25mdXNlIG9sZGVyCi0JQyBjb21waWxlcnMuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL01ha2VmaWxlLmFtIGIvYmludXRpbHMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWY5ZWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi0jIyBGSVhNRTogV29yayBhcm91bmQgYXBwYXJlbnQgYnVnIGluIGF1dG9tYWtlLgotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi0jIyBUaGVzZSBhcmVuJ3Qgc2V0IGJ5IGF1dG9tYWtlLCBiZWNhdXNlIHRoZXkgYXBwZWFyIGluCi0jIyBiZmQvYWNpbmNsdWRlLm00LCB3aGljaCBpcyBpbmNsdWRlZCBieSBiaW51dGlscy9hY2luY2x1ZGUubTQsIGFuZAotIyMgdGh1cyBpcyBub3Qgc2VlbiBieSBhdXRvbWFrZS4KLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRz1hcgotUkFOTElCX1BST0c9cmFubGliCi0KLSMgb2JqY29weSBhbmQgc3RyaXAgc2hvdWxkIGJlIHRoZSBzYW1lIHByb2dyYW0KLU9CSkNPUFlfUFJPRz1vYmpjb3B5Ci1TVFJJUF9QUk9HPXN0cmlwLW5ldwotCi1TVFJJTkdTX1BST0c9c3RyaW5ncwotCi1SRUFERUxGX1BST0c9cmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0c9c2l6ZQotTk1fUFJPRz1ubS1uZXcKLU9CSkRVTVBfUFJPRz1vYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0c9YysrZmlsdAotCi1BRERSMkxJTkVfUFJPRz1hZGRyMmxpbmUKLQotTkxNQ09OVl9QUk9HPW5sbWNvbnYKLURMTFRPT0xfUFJPRz1kbGx0b29sCi1XSU5EUkVTX1BST0c9d2luZHJlcwotRExMV1JBUF9QUk9HPWRsbHdyYXAKLQotU1JDT05WX1BST0c9c3Jjb252JChFWEVFWFQpIHN5c2R1bXAkKEVYRUVYVCkgY29mZmR1bXAkKEVYRUVYVCkgCi0KLW1hbl9NQU5TID0gYXIuMSBubS4xIG9iamR1bXAuMSByYW5saWIuMSBzaXplLjEgc3RyaW5ncy4xIHN0cmlwLjEgb2JqY29weS4xIFwKLQlhZGRyMmxpbmUuMSBubG1jb252LjEgJChERU1BTkdMRVJfUFJPRykuMQotCi1QUk9HUyA9ICQoU0laRV9QUk9HKSAkKE9CSkRVTVBfUFJPRykgJChOTV9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFNUUklQX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi1iaW5fUFJPR1JBTVMgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoQVJfUFJPRykgJChTVFJJTkdTX1BST0cpICQoUkFOTElCX1BST0cpICQoREVNQU5HTEVSX1BST0cpICQoT0JKQ09QWV9QUk9HKSBAQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCAkKEFERFIyTElORV9QUk9HKSAkKFJFQURFTEZfUFJPRykgQEJVSUxEX0RMTFdSQVBAIEBCVUlMRF9NSVNDQAotCi0jIyBXZSBuZWVkIGEgc3BlY2lhbCBydWxlIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIHdoaWNoIGFyZSBidWlsdCB3aXRoIC1uZXcKLW5vaW5zdF9QUk9HUkFNUyA9ICQoTk1fUFJPRykgJChTVFJJUF9QUk9HKQotCi1FWFRSQV9QUk9HUkFNUyA9ICQoTkxNQ09OVl9QUk9HKSBzcmNvbnYgc3lzZHVtcCBjb2ZmZHVtcCAkKERMTFRPT0xfUFJPRykgJChXSU5EUkVTX1BST0cpICQoRExMV1JBUF9QUk9HKQotCi0jIFN0dWZmIHRoYXQgZ29lcyBpbiB0b29sZGlyLyBpZiBhcHByb3ByaWF0ZQotVE9PTF9QUk9HUyA9IG5tLW5ldyBzdHJpcC1uZXcgYXIgcmFubGliIGRsbHRvb2wKLQotQkFTRURJUiA9ICQoc3JjZGlyKS8uLgotQkZERElSID0gJChCQVNFRElSKS9iZmQKLUlOQ0RJUgk9ICQoQkFTRURJUikvaW5jbHVkZQotCi1ERVAgPSBta2RlcAotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIEBIREVGSU5FU0AgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1IRklMRVMgPSBhcnN1cC5oIGJ1Y29tbS5oIGJ1ZGJnLmggY29mZmdyb2suaCBkZWJ1Zy5oIG5sbWNvbnYuaCBkbGx0b29sLmggXAotCXdpbmRyZXMuaCB3aW5kdW5pLmggZHluLXN0cmluZy5oCi0KLUdFTkVSQVRFRF9IRklMRVMgPSBhcnBhcnNlLmggc3lzcm9mZi5oIHN5c2luZm8uaCBkZWZwYXJzZS5oCi0KLUNGSUxFUyA9IGFkZHIybGluZS5jIGFyLmMgYXJzdXAuYyBidWNvbW0uYyBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgZGVidWcuYyBcCi0JZGxsdG9vbC5jIGZpbGVtb2RlLmMgaWVlZS5jIGlzLXJhbmxpYi5jIGlzLXN0cmlwLmMgbWF5YmUtcmFubGliLmMgXAotCW1heWJlLXN0cmlwLmMgbmxtY29udi5jIG5tLmMgbm90LXJhbmxpYi5jIG5vdC1zdHJpcC5jIFwKLQlvYmpjb3B5LmMgb2JqZHVtcC5jIHByZGJnLmMgcmRjb2ZmLmMgcmRkYmcuYyBzaXplLmMgc3Jjb252LmMgXAotCXN0YWJzLmMgc3RyaW5ncy5jIHN5c2R1bXAuYyB2ZXJzaW9uLmMgd3JzdGFicy5jIFwKLQl3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgd2luZHVuaS5jIHJlYWRlbGYuYyBcCi0JcmVzcmVzLmMgZHluLXN0cmluZy5jIGRsbHdyYXAuYyByZW5hbWUuYwotCi1HRU5FUkFURURfQ0ZJTEVTID0gXAotCXVuZGVyc2NvcmUuYyBhcnBhcnNlLmMgYXJsZXguYyBzeXNyb2ZmLmMgc3lzaW5mby5jIHN5c2xleC5jIFwKLQlkZWZwYXJzZS5jIGRlZmxleC5jIG5sbWhlYWRlci5jIHJjcGFyc2UuYyByY2xleC5jCi0KLURFQlVHX1NSQ1MgPSByZGRiZy5jIGRlYnVnLmMgc3RhYnMuYyBpZWVlLmMgcmRjb2ZmLmMKLVdSSVRFX0RFQlVHX1NSQ1MgPSAkKERFQlVHX1NSQ1MpIHdyc3RhYnMuYwotCi0jIENvZGUgc2hhcmVkIGJ5IGFsbCB0aGUgYmludXRpbHMuCi1CVUxJQlMgPSBidWNvbW0uYyB2ZXJzaW9uLmMgZmlsZW1vZGUuYwotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi0KLU9QQ09ERVMgPSAuLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKLQotTElCSUJFUlRZID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLVBPVEZJTEVTID0gJChDRklMRVMpICQoREVCVUdfU1JDUykgJChIRklMRVMpCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHIvLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHIvLi4vZXhwZWN0L2V4cGVjdCA7IFwKLSAgICAgICAgICBlbHNlIGVjaG8gZXhwZWN0IDsgZmlgCi1SVU5URVNUID0gYGlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCi0gICAgICAgICAgIGVjaG8gJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLSAgICAgICAgICAgZWxzZSBlY2hvIHJ1bnRlc3QgOyAgZmlgCi0KLUNDX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDQyk7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0Jc3JjZGlyPWBjZCAkKHNyY2RpcikgJiYgcHdkYDsgZXhwb3J0IHNyY2RpcjsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3JjZGlyfS90ZXN0c3VpdGUgXAotCQlDQ19GT1JfVEFSR0VUPSIkKENDX0ZPUl9UQVJHRVQpIiBcCi0JCUNGTEFHU19GT1JfVEFSR0VUPSIkKENGTEFHUykiICQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotaW5zdGFsbGNoZWNrOgotCS9iaW4vc2ggJChzcmNkaXIpL3Nhbml0eS5zaCAkKGJpbmRpcikKLQotaW5mb19URVhJTkZPUyA9IGJpbnV0aWxzLnRleGkKLQotTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLXNpemVfU09VUkNFUyA9IHNpemUuYyAkKEJVTElCUykKLQotb2JqY29weV9TT1VSQ0VTID0gb2JqY29weS5jIG5vdC1zdHJpcC5jIHJlbmFtZS5jICQoV1JJVEVfREVCVUdfU1JDUykgJChCVUxJQlMpCi0KLXN0cmluZ3NfU09VUkNFUyA9IHN0cmluZ3MuYyAkKEJVTElCUykKLQotcmVhZGVsZl9TT1VSQ0VTID0gcmVhZGVsZi5jIHZlcnNpb24uYwotcmVhZGVsZl9MREFERCAgID0gJChJTlRMTElCUykgJChMSUJJQkVSVFkpCi0KLXN0cmlwX25ld19TT1VSQ0VTID0gb2JqY29weS5jIGlzLXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotbm1fbmV3X1NPVVJDRVMgPSBubS5jICQoQlVMSUJTKQotCi1vYmpkdW1wX1NPVVJDRVMgPSBvYmpkdW1wLmMgcHJkYmcuYyAkKERFQlVHX1NSQ1MpICQoQlVMSUJTKQotb2JqZHVtcF9MREFERCA9ICQoT1BDT0RFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi11bmRlcnNjb3JlLmM6IHN0YW1wLXVuZGVyIDsgQHRydWUKLQotc3RhbXAtdW5kZXI6IE1ha2VmaWxlCi0JZWNobyAnLypXQVJOSU5HOiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQhKi8nID51bmRlcnNjb3JlLnQKLQllY2hvICJpbnQgcHJlcGVuZHNfdW5kZXJzY29yZSA9IEBVTkRFUlNDT1JFQDsiID4+dW5kZXJzY29yZS50Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHVuZGVyc2NvcmUudCB1bmRlcnNjb3JlLmMKLQl0b3VjaCBzdGFtcC11bmRlcgotCi1jcGx1cy1kZW0ubzogJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMgJChJTkNESVIpL2dldG9wdC5oCi0JJChDT01QSUxFKSAtYyAtRE1BSU4gLURWRVJTSU9OPSciJChWRVJTSU9OKSInICQoQkFTRURJUikvbGliaWJlcnR5L2NwbHVzLWRlbS5jCi0KLWNfX2ZpbHRfU09VUkNFUyA9Ci1jX19maWx0X0xEQUREID0gY3BsdXMtZGVtLm8gdW5kZXJzY29yZS5vICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1hcl9TT1VSQ0VTID0gYXJwYXJzZS55IGFybGV4LmwgYXIuYyBub3QtcmFubGliLmMgYXJzdXAuYyByZW5hbWUuYyAkKEJVTElCUykKLWFyX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1yYW5saWJfU09VUkNFUyA9IGFyLmMgaXMtcmFubGliLmMgYXJwYXJzZS55IGFybGV4LmwgYXJzdXAuYyByZW5hbWUuYyAkKEJVTElCUykKLXJhbmxpYl9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotYWRkcjJsaW5lX1NPVVJDRVMgPSBhZGRyMmxpbmUuYyAkKEJVTElCUykKLQotIyBUaGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBjb252ZXJ0aW9uIHRvIGF1dG9tYWtlLgotIyBUaGlzIHJ1bGUgY3JlYXRlcyBhIHNpbmdsZSBiaW5hcnkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWIKLSMgYnkgbG9va2luZyBhdCBhcmd2WzBdLiAgVXNlIHRoaXMga2x1ZGdlIHRvIHNhdmUgc29tZSBkaXNrIHNwYWNlLgotIyBIb3dldmVyLCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoaW5ncyBieSBoYW5kLgotIyAoVGhhdCBpcyBhZnRlciAnbWFrZSBpbnN0YWxsJywgcmVwbGFjZSB0aGUgaW5zdGFsbGVkIHJhbmxpYiBieSBhIGxpbmsgdG8gYXIuKQotIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGluc3RhbGwgcmFubGliLnNoIGFzIHJhbmxpYi4KLSMgYXJfd2l0aF9yYW5saWI6ICQoQURETF9ERVBTKSBhci5vIG1heWJlLXJhbmxpYi5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKEFSX1BST0cpIGFyLm8gbWF5YmUtcmFubGliLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChSQU5MSUJfUFJPRykKLSMJLWxuICQoQVJfUFJPRykgJChSQU5MSUJfUFJPRykKLSMKLSMgb2JqY29weSBhbmQgc3RyaXAgaW4gb25lIGJpbmFyeSB0aGF0IHVzZXMgYXJndlswXSB0byBkZWNpZGUgaXRzIGFjdGlvbi4KLSMKLSNvYmpjb3B5X3dpdGhfc3RyaXA6ICQoQURETF9ERVBTKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChPQkpDT1BZX1BST0cpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoU1RSSVBfUFJPRykKLSMJLWxuICQoT0JKQ09QWV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLXN5c3JvZmYuYzogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvIAotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWMgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWkgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1nIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0KLXN5c3JvZmYuaDogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZCA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5oCi0KLXN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpOiBzeXNpbmZvLm8gc3lzbGV4Lm8KLQkkKENDX0ZPUl9CVUlMRCkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgc3lzaW5mby5vIHN5c2xleC5vIAotCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi0JaWYgWyAtciBzeXNsZXguYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNsZXguYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzbGV4LmMgO1wKLQlmaQotCi1zeXNpbmZvLm86IHN5c2luZm8uYwotCWlmIFsgLXIgc3lzaW5mby5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2luZm8uYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzaW5mby5jIDsgXAotCWZpCi0KLXNyY29udl9TT1VSQ0VTID0gc3Jjb252LmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotZGxsdG9vbF9TT1VSQ0VTID0gZGxsdG9vbC5jIGRlZnBhcnNlLnkgZGVmbGV4LmwgZHluLXN0cmluZy5jICQoQlVMSUJTKQotZGxsdG9vbF9MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotZGxsdG9vbC5vOmRsbHRvb2wuYwotCSQoQ09NUElMRSkgLWMgJChETExUT09MX0RFRlMpICQoc3JjZGlyKS9kbGx0b29sLmMKLQotcmVzY29mZi5vOnJlc2NvZmYuYwotCSQoQ09NUElMRSkgLWMgJChETExUT09MX0RFRlMpICQoc3JjZGlyKS9yZXNjb2ZmLmMKLQotY29mZmR1bXBfU09VUkNFUyA9IGNvZmZkdW1wLmMgY29mZmdyb2suYyAkKEJVTElCUykKLQotc3lzZHVtcF9TT1VSQ0VTID0gc3lzZHVtcC5jICQoQlVMSUJTKQotCi0jIGNvZmYvc3ltLmggYW5kIGNvZmYvZWNvZmYuaCB3b24ndCBiZSBmb3VuZCBieSB0aGUgYXV0b21hdGljIGRlcGVuZGVuY3kKLSMgc2NyaXB0cywgc2luY2UgdGhleSBhcmUgb25seSBpbmNsdWRlZCBjb25kaXRpb25hbGx5LgotbmxtY29udi5vOiBubG1jb252LmMgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCWxkbmFtZT1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQkkKENPTVBJTEUpIC1jIC1ETERfTkFNRT0iXCIkJHtsZG5hbWV9XCIiIEBOTE1DT05WX0RFRlNAICQoc3JjZGlyKS9ubG1jb252LmMKLQotbmxtY29udl9TT1VSQ0VTID0gbmxtY29udi5jIG5sbWhlYWRlci55ICQoQlVMSUJTKQotCi13aW5kcmVzX1NPVVJDRVMgPSB3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgcmNwYXJzZS55IHJjbGV4LmwgXAotCXdpbmR1bmkuYyByZXNyZXMuYyAkKEJVTElCUykKLXdpbmRyZXNfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWRsbHdyYXBfU09VUkNFUyA9IGRsbHdyYXAuYyBkeW4tc3RyaW5nLmMgCi1kbGx3cmFwX0xEQUREID0gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLQotRElTVFNUVUZGID0gYXJwYXJzZS5jIGFycGFyc2UuaCBhcmxleC5jIG5sbWhlYWRlci5jIHN5c2luZm8uYyBzeXNpbmZvLmggXAotCXN5c2xleC5jIGRlZmxleC5jIGRlZnBhcnNlLmggZGVmcGFyc2UuYyByY2xleC5jIHJjcGFyc2UuaCByY3BhcnNlLmMKLQotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi1ESVNUQ0xFQU5GSUxFUyA9IHN0YW1wLXVuZGVyIHN5c2luZm8gdW5kZXJzY29yZS5jIHN5c3JvZmYuYyBzeXNyb2ZmLmggXAotCXNpdGUuZXhwIHNpdGUuYmFrCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwuZGVwMSA+LmRlcAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgLmRlcDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JJChERVApIC1mIC5kZXAyICQoSU5DTFVERVMpICQ/Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCW9iamRpcj1gcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScJXAotCQktZSAicyFAT0JKRElSQCEkJHtvYmpkaXJ9ISIKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyMjCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotY29uZmlnLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgY29uZmlnLnRleGkKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiBjb25maWcudGV4aQotCi1iaW51dGlscy5kdmk6ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLWJpbnV0aWxzLmluZm86ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gY29uZmlnLnRleGkKLQotJChERU1BTkdMRVJfUFJPRykuMTogY3h4ZmlsdC5tYW4gTWFrZWZpbGUKLQlzZWQgLWUgJ3MvQFBST0dSQU1ALyQoREVNQU5HTEVSX1BST0cpLycgPCAkKHNyY2RpcikvY3h4ZmlsdC5tYW4gXAotCQk+ICQoREVNQU5HTEVSX1BST0cpLjEKLQotTU9TVExZQ0xFQU5GSUxFUyA9IHN5c2luZm8gJChERU1BTkdMRVJfUFJPRykuMSBiaW51dGlscy5sb2cgYmludXRpbHMuc3VtIFwKLQlhYmNkZWZnaCoKLW1vc3RseWNsZWFuLWxvY2FsOgotCS1ybSAtcmYgdG1wZGlyCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIC5kZXAgLmRlcDEKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiAkKGJpbl9QUk9HUkFNUykgJChub2luc3RfUFJPR1JBTVMpCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0JJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgotCWZvciBpIGluICQoVE9PTF9QUk9HUyk7IGRvIFwKLQkgIGlmIFsgLWYgJCRpJChFWEVFWFQpIF07IHRoZW4gXAotCSAgICBqPWBlY2hvICQkaSB8IHNlZCAtZSAncy8tbmV3Ly8nYDsgXAotCSAgICBrPWBlY2hvICQkaiB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQkgICAgaWYgWyAiJChiaW5kaXIpLyQkayQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKSIgXTsgdGhlbiBcCi0JICAgICAgcm0gLWYgJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpOyBcCi0JICAgICAgbG4gJChiaW5kaXIpLyQkayQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JCXx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkaSQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCk7IFwKLQkgICAgZmk7IFwKLQkgIGVsc2UgdHJ1ZTsgXAotCSAgZmk7IFwKLQlkb25lCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWFkZHIybGluZS5vOiBhZGRyMmxpbmUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9kZW1hbmdsZS5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotYXIubzogYXIuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FyLmggJChCRkRESVIpL2xpYmJmZC5oIGFyc3VwLmgKLWFyc3VwLm86IGFyc3VwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYXJzdXAuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotYnVjb21tLm86IGJ1Y29tbS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1jb2ZmZHVtcC5vOiBjb2ZmZHVtcC5jIGNvZmZncm9rLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1jb2ZmZ3Jvay5vOiBjb2ZmZ3Jvay5jIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGNvZmZncm9rLmgKLWRlYnVnLm86IGRlYnVnLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oCi1kbGx0b29sLm86IGRsbHRvb2wuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBkeW4tc3RyaW5nLmggXAotICBkbGx0b29sLmgKLWZpbGVtb2RlLm86IGZpbGVtb2RlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotaWVlZS5vOiBpZWVlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9pZWVlLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotaXMtcmFubGliLm86IGlzLXJhbmxpYi5jCi1pcy1zdHJpcC5vOiBpcy1zdHJpcC5jCi1tYXliZS1yYW5saWIubzogbWF5YmUtcmFubGliLmMKLW1heWJlLXN0cmlwLm86IG1heWJlLXN0cmlwLmMKLW5sbWNvbnYubzogbmxtY29udi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChCRkRESVIpL2xpYm5sbS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL25sbS9leHRlcm5hbC5oIG5sbWNvbnYuaAotbm0ubzogbm0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL3Byb2dyZXNzLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9nZXRvcHQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgJChJTkNESVIpL2FvdXQvcmFubGliLmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLW5vdC1yYW5saWIubzogbm90LXJhbmxpYi5jCi1ub3Qtc3RyaXAubzogbm90LXN0cmlwLmMKLW9iamNvcHkubzogb2JqY29weS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1ZGJnLmgKLW9iamR1bXAubzogb2JqZHVtcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCBcCi0gICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCBkZWJ1Zy5oIGJ1ZGJnLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLXByZGJnLm86IHByZGJnLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLXJkY29mZi5vOiByZGNvZmYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2RlbWFuZ2xlLmggZGVidWcuaCBcCi0gIGJ1ZGJnLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1yZGRiZy5vOiByZGRiZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1zaXplLm86IHNpemUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2dldG9wdC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXNyY29udi5vOiBzcmNvbnYuYyBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgc3lzcm9mZi5oIGNvZmZncm9rLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzeXNyb2ZmLmMKLXN0YWJzLm86IHN0YWJzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZGVtYW5nbGUuaCBkZWJ1Zy5oIGJ1ZGJnLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1zdHJpbmdzLm86IHN0cmluZ3MuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3lzZHVtcC5vOiBzeXNkdW1wLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBzeXNyb2ZmLmggXAotICBzeXNyb2ZmLmMKLXZlcnNpb24ubzogdmVyc2lvbi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLXdyc3RhYnMubzogd3JzdGFicy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotd2luZHJlcy5vOiB3aW5kcmVzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL29ic3RhY2suaCB3aW5kcmVzLmggXAotICB3aW5kdW5pLmgKLXJlc3JjLm86IHJlc3JjLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1yZXNjb2ZmLm86IHJlc2NvZmYuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotcmVzYmluLm86IHJlc2Jpbi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotd2luZHVuaS5vOiB3aW5kdW5pLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCB3aW5kdW5pLmgKLXJlYWRlbGYubzogcmVhZGVsZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZHdhcmYyLmggJChJTkNESVIpL2VsZi9pMzg2LmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9lbGYvdjg1MC5oICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9taXBzLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL202OGsuaCBcCi0gICQoSU5DRElSKS9lbGYvc3BhcmMuaCAkKElOQ0RJUikvZWxmL20zMnIuaCAkKElOQ0RJUikvZWxmL2QxMHYuaCBcCi0gICQoSU5DRElSKS9lbGYvZDMwdi5oICQoSU5DRElSKS9lbGYvc2guaCAkKElOQ0RJUikvZWxmL21uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9lbGYvbW4xMDMwMC5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvYXJjLmggXAotICAkKElOQ0RJUikvZWxmL2ZyMzAuaCAkKElOQ0RJUikvZWxmL21jb3JlLmggJChJTkNESVIpL2VsZi9pOTYwLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9nZXRvcHQuaAotcmVzcmVzLm86IHJlc3Jlcy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotZHluLXN0cmluZy5vOiBkeW4tc3RyaW5nLmMgY29uZmlnLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBkeW4tc3RyaW5nLmgKLWRsbHdyYXAubzogZGxsd3JhcC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oIGR5bi1zdHJpbmcuaAotcmVuYW1lLm86IHJlbmFtZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLXVuZGVyc2NvcmUubzogdW5kZXJzY29yZS5jCi1hcnBhcnNlLm86IGFycGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGFyc3VwLmgKLWFybGV4Lm86IGFybGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oIGFycGFyc2UuaAotc3lzcm9mZi5vOiBzeXNyb2ZmLmMKLXN5c2luZm8ubzogc3lzaW5mby5jCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi1kZWZwYXJzZS5vOiBkZWZwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggZGxsdG9vbC5oCi1kZWZsZXgubzogZGVmbGV4LmMgJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgZGVmcGFyc2UuaCBkbGx0b29sLmgKLW5sbWhlYWRlci5vOiBubG1oZWFkZXIuYyAuLi9iZmQvYmZkLmggYnVjb21tLmggY29uZmlnLmggXAotICAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9ubG0vY29tbW9uLmggJChJTkNESVIpL25sbS9pbnRlcm5hbC5oIFwKLSAgbmxtY29udi5oCi1yY3BhcnNlLm86IHJjcGFyc2UuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXJjbGV4Lm86IHJjbGV4LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oIHJjcGFyc2UuaAotCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL01ha2VmaWxlLmluIGIvYmludXRpbHMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzQ4OGYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMzYxICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFSID0gQEFSQAotQVMgPSBAQVNACi1CVUlMRF9ETExUT09MID0gQEJVSUxEX0RMTFRPT0xACi1CVUlMRF9ETExXUkFQID0gQEJVSUxEX0RMTFdSQVBACi1CVUlMRF9NSVNDID0gQEJVSUxEX01JU0NACi1CVUlMRF9OTE1DT05WID0gQEJVSUxEX05MTUNPTlZACi1CVUlMRF9TUkNPTlYgPSBAQlVJTERfU1JDT05WQAotQlVJTERfV0lORFJFUyA9IEBCVUlMRF9XSU5EUkVTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLURMTFRPT0xfREVGUyA9IEBETExUT09MX0RFRlNACi1FWEVFWFQgPSBARVhFRVhUQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTkxNQ09OVl9ERUZTID0gQE5MTUNPTlZfREVGU0AKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVU5ERVJTQ09SRSA9IEBVTkRFUlNDT1JFQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLUNDX0ZPUl9CVUlMRCA9IEBDQ19GT1JfQlVJTERACi1FWEVFWFRfRk9SX0JVSUxEID0gQEVYRUVYVF9GT1JfQlVJTERACi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgdGhlc2UgdHdvIGFyZSBhbG1vc3QgdGhlIHNhbWUgcHJvZ3JhbQotQVJfUFJPRyA9IGFyCi1SQU5MSUJfUFJPRyA9IHJhbmxpYgotCi0jIG9iamNvcHkgYW5kIHN0cmlwIHNob3VsZCBiZSB0aGUgc2FtZSBwcm9ncmFtCi1PQkpDT1BZX1BST0cgPSBvYmpjb3B5Ci1TVFJJUF9QUk9HID0gc3RyaXAtbmV3Ci0KLVNUUklOR1NfUFJPRyA9IHN0cmluZ3MKLQotUkVBREVMRl9QUk9HID0gcmVhZGVsZgotCi0jIFRoZXNlIHNob3VsZCBhbGwgYmUgdGhlIHNhbWUgcHJvZ3JhbSB0b28uCi1TSVpFX1BST0cgPSBzaXplCi1OTV9QUk9HID0gbm0tbmV3Ci1PQkpEVU1QX1BST0cgPSBvYmpkdW1wCi0KLSMgVGhpcyBpcyB0aGUgZGVtYW5nbGVyLCBhcyBhIHN0YW5kYWxvbmUgcHJvZ3JhbS4KLSMgTm90ZTogVGhpcyBvbmUgaXMgdXNlZCBhcyB0aGUgaW5zdGFsbGVkIG5hbWUgdG9vLCB1bmxpa2UgdGhlIGFib3ZlLgotREVNQU5HTEVSX1BST0cgPSBjKytmaWx0Ci0KLUFERFIyTElORV9QUk9HID0gYWRkcjJsaW5lCi0KLU5MTUNPTlZfUFJPRyA9IG5sbWNvbnYKLURMTFRPT0xfUFJPRyA9IGRsbHRvb2wKLVdJTkRSRVNfUFJPRyA9IHdpbmRyZXMKLURMTFdSQVBfUFJPRyA9IGRsbHdyYXAKLQotU1JDT05WX1BST0cgPSBzcmNvbnYkKEVYRUVYVCkgc3lzZHVtcCQoRVhFRVhUKSBjb2ZmZHVtcCQoRVhFRVhUKSAKLQotbWFuX01BTlMgPSBhci4xIG5tLjEgb2JqZHVtcC4xIHJhbmxpYi4xIHNpemUuMSBzdHJpbmdzLjEgc3RyaXAuMSBvYmpjb3B5LjEgXAotCWFkZHIybGluZS4xIG5sbWNvbnYuMSAkKERFTUFOR0xFUl9QUk9HKS4xCi0KLQotUFJPR1MgPSAkKFNJWkVfUFJPRykgJChPQkpEVU1QX1BST0cpICQoTk1fUFJPRykgJChBUl9QUk9HKSAkKFNUUklOR1NfUFJPRykgJChTVFJJUF9QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotYmluX1BST0dSQU1TID0gJChTSVpFX1BST0cpICQoT0JKRFVNUF9QUk9HKSAkKEFSX1BST0cpICQoU1RSSU5HU19QUk9HKSAkKFJBTkxJQl9QUk9HKSAkKERFTUFOR0xFUl9QUk9HKSAkKE9CSkNPUFlfUFJPRykgQEJVSUxEX05MTUNPTlZAIEBCVUlMRF9TUkNPTlZAIEBCVUlMRF9ETExUT09MQCBAQlVJTERfV0lORFJFU0AgJChBRERSMkxJTkVfUFJPRykgJChSRUFERUxGX1BST0cpIEBCVUlMRF9ETExXUkFQQCBAQlVJTERfTUlTQ0AKLQotbm9pbnN0X1BST0dSQU1TID0gJChOTV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLUVYVFJBX1BST0dSQU1TID0gJChOTE1DT05WX1BST0cpIHNyY29udiBzeXNkdW1wIGNvZmZkdW1wICQoRExMVE9PTF9QUk9HKSAkKFdJTkRSRVNfUFJPRykgJChETExXUkFQX1BST0cpCi0KLSMgU3R1ZmYgdGhhdCBnb2VzIGluIHRvb2xkaXIvIGlmIGFwcHJvcHJpYXRlCi1UT09MX1BST0dTID0gbm0tbmV3IHN0cmlwLW5ldyBhciByYW5saWIgZGxsdG9vbAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLURFUCA9IG1rZGVwCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKEJGRERJUikgLUkkKElOQ0RJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLUhGSUxFUyA9IGFyc3VwLmggYnVjb21tLmggYnVkYmcuaCBjb2ZmZ3Jvay5oIGRlYnVnLmggbmxtY29udi5oIGRsbHRvb2wuaCBcCi0Jd2luZHJlcy5oIHdpbmR1bmkuaCBkeW4tc3RyaW5nLmgKLQotCi1HRU5FUkFURURfSEZJTEVTID0gYXJwYXJzZS5oIHN5c3JvZmYuaCBzeXNpbmZvLmggZGVmcGFyc2UuaAotCi1DRklMRVMgPSBhZGRyMmxpbmUuYyBhci5jIGFyc3VwLmMgYnVjb21tLmMgY29mZmR1bXAuYyBjb2ZmZ3Jvay5jIGRlYnVnLmMgXAotCWRsbHRvb2wuYyBmaWxlbW9kZS5jIGllZWUuYyBpcy1yYW5saWIuYyBpcy1zdHJpcC5jIG1heWJlLXJhbmxpYi5jIFwKLQltYXliZS1zdHJpcC5jIG5sbWNvbnYuYyBubS5jIG5vdC1yYW5saWIuYyBub3Qtc3RyaXAuYyBcCi0Jb2JqY29weS5jIG9iamR1bXAuYyBwcmRiZy5jIHJkY29mZi5jIHJkZGJnLmMgc2l6ZS5jIHNyY29udi5jIFwKLQlzdGFicy5jIHN0cmluZ3MuYyBzeXNkdW1wLmMgdmVyc2lvbi5jIHdyc3RhYnMuYyBcCi0Jd2luZHJlcy5jIHJlc3JjLmMgcmVzY29mZi5jIHJlc2Jpbi5jIHdpbmR1bmkuYyByZWFkZWxmLmMgXAotCXJlc3Jlcy5jIGR5bi1zdHJpbmcuYyBkbGx3cmFwLmMgcmVuYW1lLmMKLQotCi1HRU5FUkFURURfQ0ZJTEVTID0gXAotCXVuZGVyc2NvcmUuYyBhcnBhcnNlLmMgYXJsZXguYyBzeXNyb2ZmLmMgc3lzaW5mby5jIHN5c2xleC5jIFwKLQlkZWZwYXJzZS5jIGRlZmxleC5jIG5sbWhlYWRlci5jIHJjcGFyc2UuYyByY2xleC5jCi0KLQotREVCVUdfU1JDUyA9IHJkZGJnLmMgZGVidWcuYyBzdGFicy5jIGllZWUuYyByZGNvZmYuYwotV1JJVEVfREVCVUdfU1JDUyA9ICQoREVCVUdfU1JDUykgd3JzdGFicy5jCi0KLSMgQ29kZSBzaGFyZWQgYnkgYWxsIHRoZSBiaW51dGlscy4KLUJVTElCUyA9IGJ1Y29tbS5jIHZlcnNpb24uYyBmaWxlbW9kZS5jCi0KLUJGRExJQiA9IC4uL2JmZC9saWJiZmQubGEKLQotT1BDT0RFUyA9IC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYQotCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotUE9URklMRVMgPSAkKENGSUxFUykgJChERUJVR19TUkNTKSAkKEhGSUxFUykKLQotRVhQRUNUID0gYGlmIFsgLWYgJCRyLy4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gJCRyLy4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgdGhlbiBcCi0gICAgICAgICAgIGVjaG8gJHtzcmNkaXJ9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLSAgICAgICAgICAgZWxzZSBlY2hvIHJ1bnRlc3QgOyAgZmlgCi0KLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotCi1pbmZvX1RFWElORk9TID0gYmludXRpbHMudGV4aQotCi1MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotc2l6ZV9TT1VSQ0VTID0gc2l6ZS5jICQoQlVMSUJTKQotCi1vYmpjb3B5X1NPVVJDRVMgPSBvYmpjb3B5LmMgbm90LXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotc3RyaW5nc19TT1VSQ0VTID0gc3RyaW5ncy5jICQoQlVMSUJTKQotCi1yZWFkZWxmX1NPVVJDRVMgPSByZWFkZWxmLmMgdmVyc2lvbi5jCi1yZWFkZWxmX0xEQUREID0gJChJTlRMTElCUykgJChMSUJJQkVSVFkpCi0KLXN0cmlwX25ld19TT1VSQ0VTID0gb2JqY29weS5jIGlzLXN0cmlwLmMgcmVuYW1lLmMgJChXUklURV9ERUJVR19TUkNTKSAkKEJVTElCUykKLQotbm1fbmV3X1NPVVJDRVMgPSBubS5jICQoQlVMSUJTKQotCi1vYmpkdW1wX1NPVVJDRVMgPSBvYmpkdW1wLmMgcHJkYmcuYyAkKERFQlVHX1NSQ1MpICQoQlVMSUJTKQotb2JqZHVtcF9MREFERCA9ICQoT1BDT0RFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi1jX19maWx0X1NPVVJDRVMgPSAKLWNfX2ZpbHRfTERBREQgPSBjcGx1cy1kZW0ubyB1bmRlcnNjb3JlLm8gJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLWFyX1NPVVJDRVMgPSBhcnBhcnNlLnkgYXJsZXgubCBhci5jIG5vdC1yYW5saWIuYyBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotYXJfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLXJhbmxpYl9TT1VSQ0VTID0gYXIuYyBpcy1yYW5saWIuYyBhcnBhcnNlLnkgYXJsZXgubCBhcnN1cC5jIHJlbmFtZS5jICQoQlVMSUJTKQotcmFubGliX0xEQUREID0gJChCRkRMSUIpICQoTElCSUJFUlRZKSBATEVYTElCQCAkKElOVExMSUJTKQotCi1hZGRyMmxpbmVfU09VUkNFUyA9IGFkZHIybGluZS5jICQoQlVMSUJTKQotCi1zcmNvbnZfU09VUkNFUyA9IHNyY29udi5jIGNvZmZncm9rLmMgJChCVUxJQlMpCi0KLWRsbHRvb2xfU09VUkNFUyA9IGRsbHRvb2wuYyBkZWZwYXJzZS55IGRlZmxleC5sIGR5bi1zdHJpbmcuYyAkKEJVTElCUykKLWRsbHRvb2xfTERBREQgPSAkKEJGRExJQikgJChMSUJJQkVSVFkpIEBMRVhMSUJAICQoSU5UTExJQlMpCi0KLWNvZmZkdW1wX1NPVVJDRVMgPSBjb2ZmZHVtcC5jIGNvZmZncm9rLmMgJChCVUxJQlMpCi0KLXN5c2R1bXBfU09VUkNFUyA9IHN5c2R1bXAuYyAkKEJVTElCUykKLQotbmxtY29udl9TT1VSQ0VTID0gbmxtY29udi5jIG5sbWhlYWRlci55ICQoQlVMSUJTKQotCi13aW5kcmVzX1NPVVJDRVMgPSB3aW5kcmVzLmMgcmVzcmMuYyByZXNjb2ZmLmMgcmVzYmluLmMgcmNwYXJzZS55IHJjbGV4LmwgXAotCXdpbmR1bmkuYyByZXNyZXMuYyAkKEJVTElCUykKLQotd2luZHJlc19MREFERCA9ICQoQkZETElCKSAkKExJQklCRVJUWSkgQExFWExJQkAgJChJTlRMTElCUykKLQotZGxsd3JhcF9TT1VSQ0VTID0gZGxsd3JhcC5jIGR5bi1zdHJpbmcuYyAKLWRsbHdyYXBfTERBREQgPSAkKExJQklCRVJUWSkgJChJTlRMTElCUykKLQotRElTVFNUVUZGID0gYXJwYXJzZS5jIGFycGFyc2UuaCBhcmxleC5jIG5sbWhlYWRlci5jIHN5c2luZm8uYyBzeXNpbmZvLmggXAotCXN5c2xleC5jIGRlZmxleC5jIGRlZnBhcnNlLmggZGVmcGFyc2UuYyByY2xleC5jIHJjcGFyc2UuaCByY3BhcnNlLmMKLQotCi1ESVNUQ0xFQU5GSUxFUyA9IHN0YW1wLXVuZGVyIHN5c2luZm8gdW5kZXJzY29yZS5jIHN5c3JvZmYuYyBzeXNyb2ZmLmggXAotCXNpdGUuZXhwIHNpdGUuYmFrCi0KLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBjb25maWcudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gc3lzaW5mbyAkKERFTUFOR0xFUl9QUk9HKS4xIGJpbnV0aWxzLmxvZyBiaW51dGlscy5zdW0gXAotCWFiY2RlZmdoKgotCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIC5kZXAgLmRlcDEKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1iaW5fUFJPR1JBTVMgPSAgc2l6ZSQoRVhFRVhUKSBvYmpkdW1wJChFWEVFWFQpIGFyJChFWEVFWFQpIFwKLXN0cmluZ3MkKEVYRUVYVCkgcmFubGliJChFWEVFWFQpIGMrK2ZpbHQkKEVYRUVYVCkgb2JqY29weSQoRVhFRVhUKSBcCi1AQlVJTERfTkxNQ09OVkAgQEJVSUxEX1NSQ09OVkAgQEJVSUxEX0RMTFRPT0xAIEBCVUlMRF9XSU5EUkVTQCBcCi1hZGRyMmxpbmUkKEVYRUVYVCkgcmVhZGVsZiQoRVhFRVhUKSBAQlVJTERfRExMV1JBUEAgQEJVSUxEX01JU0NACi1ub2luc3RfUFJPR1JBTVMgPSAgbm0tbmV3JChFWEVFWFQpIHN0cmlwLW5ldyQoRVhFRVhUKQotUFJPR1JBTVMgPSAgJChiaW5fUFJPR1JBTVMpICQobm9pbnN0X1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1ubG1jb252X09CSkVDVFMgPSAgbmxtY29udi5vIG5sbWhlYWRlci5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1ubG1jb252X0xEQUREID0gJChMREFERCkKLW5sbWNvbnZfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1ubG1jb252X0xERkxBR1MgPSAKLXNyY29udl9PQkpFQ1RTID0gIHNyY29udi5vIGNvZmZncm9rLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXNyY29udl9MREFERCA9ICQoTERBREQpCi1zcmNvbnZfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zcmNvbnZfTERGTEFHUyA9IAotc3lzZHVtcF9PQkpFQ1RTID0gIHN5c2R1bXAubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3lzZHVtcF9MREFERCA9ICQoTERBREQpCi1zeXNkdW1wX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3lzZHVtcF9MREZMQUdTID0gCi1jb2ZmZHVtcF9PQkpFQ1RTID0gIGNvZmZkdW1wLm8gY29mZmdyb2subyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotY29mZmR1bXBfTERBREQgPSAkKExEQUREKQotY29mZmR1bXBfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1jb2ZmZHVtcF9MREZMQUdTID0gCi1kbGx0b29sX09CSkVDVFMgPSAgZGxsdG9vbC5vIGRlZnBhcnNlLm8gZGVmbGV4Lm8gZHluLXN0cmluZy5vIGJ1Y29tbS5vIFwKLXZlcnNpb24ubyBmaWxlbW9kZS5vCi1kbGx0b29sX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZGxsdG9vbF9MREZMQUdTID0gCi13aW5kcmVzX09CSkVDVFMgPSAgd2luZHJlcy5vIHJlc3JjLm8gcmVzY29mZi5vIHJlc2Jpbi5vIHJjcGFyc2UubyBcCi1yY2xleC5vIHdpbmR1bmkubyByZXNyZXMubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotd2luZHJlc19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXdpbmRyZXNfTERGTEFHUyA9IAotZGxsd3JhcF9PQkpFQ1RTID0gIGRsbHdyYXAubyBkeW4tc3RyaW5nLm8KLWRsbHdyYXBfREVQRU5ERU5DSUVTID0gIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotZGxsd3JhcF9MREZMQUdTID0gCi1zaXplX09CSkVDVFMgPSAgc2l6ZS5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zaXplX0xEQUREID0gJChMREFERCkKLXNpemVfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1zaXplX0xERkxBR1MgPSAKLW9iamR1bXBfT0JKRUNUUyA9ICBvYmpkdW1wLm8gcHJkYmcubyByZGRiZy5vIGRlYnVnLm8gc3RhYnMubyBpZWVlLm8gXAotcmRjb2ZmLm8gYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLW9iamR1bXBfREVQRU5ERU5DSUVTID0gIC4uL29wY29kZXMvbGlib3Bjb2Rlcy5sYSAuLi9iZmQvbGliYmZkLmxhIFwKLS4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotb2JqZHVtcF9MREZMQUdTID0gCi1hcl9PQkpFQ1RTID0gIGFycGFyc2UubyBhcmxleC5vIGFyLm8gbm90LXJhbmxpYi5vIGFyc3VwLm8gcmVuYW1lLm8gXAotYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLWFyX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotYXJfTERGTEFHUyA9IAotc3RyaW5nc19PQkpFQ1RTID0gIHN0cmluZ3MubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotc3RyaW5nc19MREFERCA9ICQoTERBREQpCi1zdHJpbmdzX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3RyaW5nc19MREZMQUdTID0gCi1yYW5saWJfT0JKRUNUUyA9ICBhci5vIGlzLXJhbmxpYi5vIGFycGFyc2UubyBhcmxleC5vIGFyc3VwLm8gcmVuYW1lLm8gXAotYnVjb21tLm8gdmVyc2lvbi5vIGZpbGVtb2RlLm8KLXJhbmxpYl9ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXJhbmxpYl9MREZMQUdTID0gCi1jX19maWx0X09CSkVDVFMgPSAKLWNfX2ZpbHRfREVQRU5ERU5DSUVTID0gIGNwbHVzLWRlbS5vIHVuZGVyc2NvcmUubyBcCi0uLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLWNfX2ZpbHRfTERGTEFHUyA9IAotb2JqY29weV9PQkpFQ1RTID0gIG9iamNvcHkubyBub3Qtc3RyaXAubyByZW5hbWUubyByZGRiZy5vIGRlYnVnLm8gXAotc3RhYnMubyBpZWVlLm8gcmRjb2ZmLm8gd3JzdGFicy5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1vYmpjb3B5X0xEQUREID0gJChMREFERCkKLW9iamNvcHlfREVQRU5ERU5DSUVTID0gIC4uL2JmZC9saWJiZmQubGEgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi1vYmpjb3B5X0xERkxBR1MgPSAKLWFkZHIybGluZV9PQkpFQ1RTID0gIGFkZHIybGluZS5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1hZGRyMmxpbmVfTERBREQgPSAkKExEQUREKQotYWRkcjJsaW5lX0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotYWRkcjJsaW5lX0xERkxBR1MgPSAKLXJlYWRlbGZfT0JKRUNUUyA9ICByZWFkZWxmLm8gdmVyc2lvbi5vCi1yZWFkZWxmX0RFUEVOREVOQ0lFUyA9ICAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLXJlYWRlbGZfTERGTEFHUyA9IAotbm1fbmV3X09CSkVDVFMgPSAgbm0ubyBidWNvbW0ubyB2ZXJzaW9uLm8gZmlsZW1vZGUubwotbm1fbmV3X0xEQUREID0gJChMREFERCkKLW5tX25ld19ERVBFTkRFTkNJRVMgPSAgLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLW5tX25ld19MREZMQUdTID0gCi1zdHJpcF9uZXdfT0JKRUNUUyA9ICBvYmpjb3B5Lm8gaXMtc3RyaXAubyByZW5hbWUubyByZGRiZy5vIGRlYnVnLm8gXAotc3RhYnMubyBpZWVlLm8gcmRjb2ZmLm8gd3JzdGFicy5vIGJ1Y29tbS5vIHZlcnNpb24ubyBmaWxlbW9kZS5vCi1zdHJpcF9uZXdfTERBREQgPSAkKExEQUREKQotc3RyaXBfbmV3X0RFUEVOREVOQ0lFUyA9ICAuLi9iZmQvbGliYmZkLmxhIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotc3RyaXBfbmV3X0xERkxBR1MgPSAKLUxFWF9PVVRQVVRfUk9PVCA9IEBMRVhfT1VUUFVUX1JPT1RACi1MRVhMSUIgPSBATEVYTElCQAotWUxXUkFQID0gJCh0b3Bfc3JjZGlyKS8uLi95bHdyYXAKLUNGTEFHUyA9IEBDRkxBR1NACi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1MVENPTVBJTEUgPSAkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotQ0NMRCA9ICQoQ0MpCi1MSU5LID0gJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDTEQpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotVEVYSTJEVkkgPSBgaWYgdGVzdCAtZiAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgdGhlbiBlY2hvICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyBlbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSU5GT19URVggPSAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXgKLUlORk9fREVQUyA9IGJpbnV0aWxzLmluZm8KLURWSVMgPSBiaW51dGlscy5kdmkKLVRFWElORk9TID0gYmludXRpbHMudGV4aQotbWFuMWRpciA9ICQobWFuZGlyKS9tYW4xCi1NQU5TID0gJChtYW5fTUFOUykKLQotTlJPRkYgPSBucm9mZgotRElTVF9DT01NT04gPSAgUkVBRE1FIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gXAotTkVXUyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBhcmxleC5jIGFycGFyc2UuYyBjb25maWcuaW4gY29uZmlndXJlIFwKLWNvbmZpZ3VyZS5pbiBkZWZsZXguYyBkZWZwYXJzZS5jIG5sbWhlYWRlci5jIHJjbGV4LmMgcmNwYXJzZS5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKG5sbWNvbnZfU09VUkNFUykgJChzcmNvbnZfU09VUkNFUykgJChzeXNkdW1wX1NPVVJDRVMpICQoY29mZmR1bXBfU09VUkNFUykgJChkbGx0b29sX1NPVVJDRVMpICQod2luZHJlc19TT1VSQ0VTKSAkKGRsbHdyYXBfU09VUkNFUykgJChzaXplX1NPVVJDRVMpICQob2JqZHVtcF9TT1VSQ0VTKSAkKGFyX1NPVVJDRVMpICQoc3RyaW5nc19TT1VSQ0VTKSAkKHJhbmxpYl9TT1VSQ0VTKSAkKGNfX2ZpbHRfU09VUkNFUykgJChvYmpjb3B5X1NPVVJDRVMpICQoYWRkcjJsaW5lX1NPVVJDRVMpICQocmVhZGVsZl9TT1VSQ0VTKSAkKG5tX25ld19TT1VSQ0VTKSAkKHN0cmlwX25ld19TT1VSQ0VTKQotT0JKRUNUUyA9ICQobmxtY29udl9PQkpFQ1RTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHN5c2R1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9PQkpFQ1RTKSAkKGRsbHRvb2xfT0JKRUNUUykgJCh3aW5kcmVzX09CSkVDVFMpICQoZGxsd3JhcF9PQkpFQ1RTKSAkKHNpemVfT0JKRUNUUykgJChvYmpkdW1wX09CSkVDVFMpICQoYXJfT0JKRUNUUykgJChzdHJpbmdzX09CSkVDVFMpICQocmFubGliX09CSkVDVFMpICQoY19fZmlsdF9PQkpFQ1RTKSAkKG9iamNvcHlfT0JKRUNUUykgJChhZGRyMmxpbmVfT0JKRUNUUykgJChyZWFkZWxmX09CSkVDVFMpICQobm1fbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1iaW5QUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKLQotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCS10ZXN0IC16ICIkKG5vaW5zdF9QUk9HUkFNUykiIHx8IHJtIC1mICQobm9pbnN0X1BST0dSQU1TKQotCi1kaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0ucy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLlMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoubyBjb3JlICouY29yZQotCi1jbGVhbi1jb21waWxlOgotCi1kaXN0Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi50YWIuYwotCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGU6Ci0KLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0ucy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLlMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLW1vc3RseWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1mICoubG8KLQotY2xlYW4tbGlidG9vbDoKLQktcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbi1saWJ0b29sOgotCi1tYWludGFpbmVyLWNsZWFuLWxpYnRvb2w6Ci0KLW5sbWNvbnYkKEVYRUVYVCk6ICQobmxtY29udl9PQkpFQ1RTKSAkKG5sbWNvbnZfREVQRU5ERU5DSUVTKQotCUBybSAtZiBubG1jb252JChFWEVFWFQpCi0JJChMSU5LKSAkKG5sbWNvbnZfTERGTEFHUykgJChubG1jb252X09CSkVDVFMpICQobmxtY29udl9MREFERCkgJChMSUJTKQotCi1zcmNvbnYkKEVYRUVYVCk6ICQoc3Jjb252X09CSkVDVFMpICQoc3Jjb252X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3Jjb252JChFWEVFWFQpCi0JJChMSU5LKSAkKHNyY29udl9MREZMQUdTKSAkKHNyY29udl9PQkpFQ1RTKSAkKHNyY29udl9MREFERCkgJChMSUJTKQotCi1zeXNkdW1wJChFWEVFWFQpOiAkKHN5c2R1bXBfT0JKRUNUUykgJChzeXNkdW1wX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc3lzZHVtcCQoRVhFRVhUKQotCSQoTElOSykgJChzeXNkdW1wX0xERkxBR1MpICQoc3lzZHVtcF9PQkpFQ1RTKSAkKHN5c2R1bXBfTERBREQpICQoTElCUykKLQotY29mZmR1bXAkKEVYRUVYVCk6ICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGNvZmZkdW1wJChFWEVFWFQpCi0JJChMSU5LKSAkKGNvZmZkdW1wX0xERkxBR1MpICQoY29mZmR1bXBfT0JKRUNUUykgJChjb2ZmZHVtcF9MREFERCkgJChMSUJTKQotCi1kbGx0b29sJChFWEVFWFQpOiAkKGRsbHRvb2xfT0JKRUNUUykgJChkbGx0b29sX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZGxsdG9vbCQoRVhFRVhUKQotCSQoTElOSykgJChkbGx0b29sX0xERkxBR1MpICQoZGxsdG9vbF9PQkpFQ1RTKSAkKGRsbHRvb2xfTERBREQpICQoTElCUykKLQotd2luZHJlcyQoRVhFRVhUKTogJCh3aW5kcmVzX09CSkVDVFMpICQod2luZHJlc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHdpbmRyZXMkKEVYRUVYVCkKLQkkKExJTkspICQod2luZHJlc19MREZMQUdTKSAkKHdpbmRyZXNfT0JKRUNUUykgJCh3aW5kcmVzX0xEQUREKSAkKExJQlMpCi0KLWRsbHdyYXAkKEVYRUVYVCk6ICQoZGxsd3JhcF9PQkpFQ1RTKSAkKGRsbHdyYXBfREVQRU5ERU5DSUVTKQotCUBybSAtZiBkbGx3cmFwJChFWEVFWFQpCi0JJChMSU5LKSAkKGRsbHdyYXBfTERGTEFHUykgJChkbGx3cmFwX09CSkVDVFMpICQoZGxsd3JhcF9MREFERCkgJChMSUJTKQotCi1zaXplJChFWEVFWFQpOiAkKHNpemVfT0JKRUNUUykgJChzaXplX0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgc2l6ZSQoRVhFRVhUKQotCSQoTElOSykgJChzaXplX0xERkxBR1MpICQoc2l6ZV9PQkpFQ1RTKSAkKHNpemVfTERBREQpICQoTElCUykKLQotb2JqZHVtcCQoRVhFRVhUKTogJChvYmpkdW1wX09CSkVDVFMpICQob2JqZHVtcF9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIG9iamR1bXAkKEVYRUVYVCkKLQkkKExJTkspICQob2JqZHVtcF9MREZMQUdTKSAkKG9iamR1bXBfT0JKRUNUUykgJChvYmpkdW1wX0xEQUREKSAkKExJQlMpCi0KLWFyJChFWEVFWFQpOiAkKGFyX09CSkVDVFMpICQoYXJfREVQRU5ERU5DSUVTKQotCUBybSAtZiBhciQoRVhFRVhUKQotCSQoTElOSykgJChhcl9MREZMQUdTKSAkKGFyX09CSkVDVFMpICQoYXJfTERBREQpICQoTElCUykKLQotc3RyaW5ncyQoRVhFRVhUKTogJChzdHJpbmdzX09CSkVDVFMpICQoc3RyaW5nc19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHN0cmluZ3MkKEVYRUVYVCkKLQkkKExJTkspICQoc3RyaW5nc19MREZMQUdTKSAkKHN0cmluZ3NfT0JKRUNUUykgJChzdHJpbmdzX0xEQUREKSAkKExJQlMpCi0KLXJhbmxpYiQoRVhFRVhUKTogJChyYW5saWJfT0JKRUNUUykgJChyYW5saWJfREVQRU5ERU5DSUVTKQotCUBybSAtZiByYW5saWIkKEVYRUVYVCkKLQkkKExJTkspICQocmFubGliX0xERkxBR1MpICQocmFubGliX09CSkVDVFMpICQocmFubGliX0xEQUREKSAkKExJQlMpCi0KLWMrK2ZpbHQkKEVYRUVYVCk6ICQoY19fZmlsdF9PQkpFQ1RTKSAkKGNfX2ZpbHRfREVQRU5ERU5DSUVTKQotCUBybSAtZiBjKytmaWx0JChFWEVFWFQpCi0JJChMSU5LKSAkKGNfX2ZpbHRfTERGTEFHUykgJChjX19maWx0X09CSkVDVFMpICQoY19fZmlsdF9MREFERCkgJChMSUJTKQotCi1vYmpjb3B5JChFWEVFWFQpOiAkKG9iamNvcHlfT0JKRUNUUykgJChvYmpjb3B5X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgb2JqY29weSQoRVhFRVhUKQotCSQoTElOSykgJChvYmpjb3B5X0xERkxBR1MpICQob2JqY29weV9PQkpFQ1RTKSAkKG9iamNvcHlfTERBREQpICQoTElCUykKLQotYWRkcjJsaW5lJChFWEVFWFQpOiAkKGFkZHIybGluZV9PQkpFQ1RTKSAkKGFkZHIybGluZV9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGFkZHIybGluZSQoRVhFRVhUKQotCSQoTElOSykgJChhZGRyMmxpbmVfTERGTEFHUykgJChhZGRyMmxpbmVfT0JKRUNUUykgJChhZGRyMmxpbmVfTERBREQpICQoTElCUykKLQotcmVhZGVsZiQoRVhFRVhUKTogJChyZWFkZWxmX09CSkVDVFMpICQocmVhZGVsZl9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIHJlYWRlbGYkKEVYRUVYVCkKLQkkKExJTkspICQocmVhZGVsZl9MREZMQUdTKSAkKHJlYWRlbGZfT0JKRUNUUykgJChyZWFkZWxmX0xEQUREKSAkKExJQlMpCi0KLW5tLW5ldyQoRVhFRVhUKTogJChubV9uZXdfT0JKRUNUUykgJChubV9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBubS1uZXckKEVYRUVYVCkKLQkkKExJTkspICQobm1fbmV3X0xERkxBR1MpICQobm1fbmV3X09CSkVDVFMpICQobm1fbmV3X0xEQUREKSAkKExJQlMpCi0KLXN0cmlwLW5ldyQoRVhFRVhUKTogJChzdHJpcF9uZXdfT0JKRUNUUykgJChzdHJpcF9uZXdfREVQRU5ERU5DSUVTKQotCUBybSAtZiBzdHJpcC1uZXckKEVYRUVYVCkKLQkkKExJTkspICQoc3RyaXBfbmV3X0xERkxBR1MpICQoc3RyaXBfbmV3X09CSkVDVFMpICQoc3RyaXBfbmV3X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChMRVgpIiAkPCAkKExFWF9PVVRQVVRfUk9PVCkuYyAkQCAtLSAkKEFNX0xGTEFHUykgJChMRkxBR1MpCi0ueS5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCi1hcnBhcnNlLmg6IGFycGFyc2UuYwotZGVmcGFyc2UuaDogZGVmcGFyc2UuYwotbmxtaGVhZGVyLmg6IG5sbWhlYWRlci5jCi1yY3BhcnNlLmg6IHJjcGFyc2UuYwotCi0KLWJpbnV0aWxzLmluZm86IGJpbnV0aWxzLnRleGkKLWJpbnV0aWxzLmR2aTogYmludXRpbHMudGV4aQotCi0KLURWSVBTID0gZHZpcHMKLQotLnRleGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udGV4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGkuaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udHhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50eGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLS5kdmkucHM6Ci0JJChEVklQUykgJDwgLW8gJEAKLQotaW5zdGFsbC1pbmZvLWFtOiAkKElORk9fREVQUykKLQlAJChOT1JNQUxfSU5TVEFMTCkKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKGluZm9kaXIpCi0JQGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBpZmlsZSBpbiBgY2QgJCRkICYmIGVjaG8gJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XWA7IGRvIFwKLQkgICAgaWYgdGVzdCAtZiAkJGQvJCRpZmlsZTsgdGhlbiBcCi0JICAgICAgZWNobyAiICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlIjsgXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkJGQvJCRpZmlsZSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGlmaWxlOyBcCi0JICAgIGVsc2UgOiA7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCUAkKFBPU1RfSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBsaXN0PSckKElORk9fREVQUyknOyBcCi0JICBmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgICAgZWNobyAiIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSI7XAotCSAgICBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUgfHwgOjtcCi0JICBkb25lOyBcCi0JZWxzZSA6IDsgZmkKLQotdW5pbnN0YWxsLWluZm86Ci0JJChQUkVfVU5JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGlpPXllczsgXAotCWVsc2UgaWk9OyBmaTsgXAotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgLXogIiRpaSIgXAotCSAgICB8fCBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAtLXJlbW92ZSAkJGZpbGU7IFwKLQlkb25lCi0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAoY2QgJChERVNURElSKSQoaW5mb2RpcikgJiYgcm0gLWYgJCRmaWxlICQkZmlsZS1bMC05XSAkJGZpbGUtWzAtOV1bMC05XSk7IFwKLQlkb25lCi0KLWRpc3QtaW5mbzogJChJTkZPX0RFUFMpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBiYXNlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGJhc2U7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGZpbGUgaW4gYGNkICQkZCAmJiBldmFsIGVjaG8gJCRiYXNlKmA7IGRvIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQotbW9zdGx5Y2xlYW4tYW1pbmZvOgotCS1ybSAtZiBiaW51dGlscy5hdXggYmludXRpbHMuY3AgYmludXRpbHMuY3BzIGJpbnV0aWxzLmR2aSBiaW51dGlscy5mbiBcCi0JICBiaW51dGlscy5mbnMgYmludXRpbHMua3kgYmludXRpbHMua3lzIGJpbnV0aWxzLnBzIFwKLQkgIGJpbnV0aWxzLmxvZyBiaW51dGlscy5wZyBiaW51dGlscy50b2MgYmludXRpbHMudHAgXAotCSAgYmludXRpbHMudHBzIGJpbnV0aWxzLnZyIGJpbnV0aWxzLnZycyBiaW51dGlscy5vcCBiaW51dGlscy50ciBcCi0JICBiaW51dGlscy5jdiBiaW51dGlscy5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9IiQodG9wX2Rpc3RkaXIpIiBkaXN0ZGlyPSIkKGRpc3RkaXIpIiBkaXN0LWluZm8KLQotUlVOVEVTVEZMQUdTID0KLQotREVKQVRPT0wgPSAkKFBBQ0tBR0UpCi0KLVJVTlRFU1RERUZBVUxURkxBR1MgPSAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCRzcmNkaXIKLXNpdGUuZXhwOiBNYWtlZmlsZQotCUBlY2hvICdNYWtpbmcgYSBuZXcgc2l0ZS5leHAgZmlsZS4uLicKLQlAdGVzdCAhIC1mIHNpdGUuYmFrIHx8IHJtIC1mIHNpdGUuYmFrCi0JQGVjaG8gJyMjIHRoZXNlIHZhcmlhYmxlcyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgbWFrZSAjIycgPiAkQC10Ci0JQGVjaG8gJyMgRG8gbm90IGVkaXQgaGVyZS4gIElmIHlvdSB3aXNoIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcycgPj4gJEAtdAotCUBlY2hvICcjIGVkaXQgdGhlIGxhc3Qgc2VjdGlvbicgPj4gJEAtdAotCUBlY2hvICdzZXQgdG9vbCAkKERFSkFUT09MKScgPj4gJEAtdAotCUBlY2hvICdzZXQgc3JjZGlyICQoc3JjZGlyKScgPj4gJEAtdAotCUBlY2hvICdzZXQgb2JqZGlyJyBgcHdkYCA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X2FsaWFzICQoaG9zdF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfdHJpcGxldCAkKGhvc3RfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF9hbGlhcyAkKHRhcmdldF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IHRhcmdldF90cmlwbGV0ICQodGFyZ2V0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF9hbGlhcyAkKGJ1aWxkX2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfdHJpcGxldCAkKGJ1aWxkX3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJyMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlIGdlbmVyYXRlZCBieSBjb25maWd1cmUuIERvIE5vdCBFZGl0ICMjJyA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBzZWQgJzEsL14jIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZS4qIyMvIGQnIHNpdGUuZXhwID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IG12IHNpdGUuZXhwIHNpdGUuYmFrCi0JQG12ICRALXQgc2l0ZS5leHAKLWluZm8tYW06ICQoSU5GT19ERVBTKQotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbTogJChEVklTKQotZHZpOiBkdmktcmVjdXJzaXZlCi1jaGVjay1hbToKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjay1ERUpBR05VCi1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiYXJsZXhsZGVmbGV4bHJjbGV4bGFycGFyc2VoYXJwYXJzZWNkZWZwYXJzZWhkZWZwYXJzZWNubG1oZWFkZXJobmxtaGVhZGVyY3JjcGFyc2VocmNwYXJzZWMkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgYXJsZXhsIGRlZmxleGwgcmNsZXhsIGFycGFyc2VoIGFycGFyc2VjIGRlZnBhcnNlaCBkZWZwYXJzZWMgbmxtaGVhZGVyaCBubG1oZWFkZXJjIHJjcGFyc2VoIHJjcGFyc2VjICQoTUFJTlRBSU5FUkNMRUFORklMRVMpCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIG1vc3RseWNsZWFuLWNvbXBpbGUgXAotCQltb3N0bHljbGVhbi1saWJ0b29sIG1vc3RseWNsZWFuLWFtaW5mbyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1sb2NhbAotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJY2xlYW4tY29tcGlsZSBjbGVhbi1saWJ0b29sIGNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIFwKLQkJY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLWJpblBST0dSQU1TIFwKLQkJZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tdGFncyBcCi0JCWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4tYmluUFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tYmluUFJPR1JBTVMgXAotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5QUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotY2xlYW4tbm9pbnN0UFJPR1JBTVMgbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKLW1vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAotdW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCi1pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY2Rpcj1gY2QgJChzcmNkaXIpICYmIHB3ZGA7IGV4cG9ydCBzcmNkaXI7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJQ0NfRk9SX1RBUkdFVD0iJChDQ19GT1JfVEFSR0VUKSIgXAotCQlDRkxBR1NfRk9SX1RBUkdFVD0iJChDRkxBR1MpIiAkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLWluc3RhbGxjaGVjazoKLQkvYmluL3NoICQoc3JjZGlyKS9zYW5pdHkuc2ggJChiaW5kaXIpCi0KLXVuZGVyc2NvcmUuYzogc3RhbXAtdW5kZXIgOyBAdHJ1ZQotCi1zdGFtcC11bmRlcjogTWFrZWZpbGUKLQllY2hvICcvKldBUk5JTkc6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCEqLycgPnVuZGVyc2NvcmUudAotCWVjaG8gImludCBwcmVwZW5kc191bmRlcnNjb3JlID0gQFVOREVSU0NPUkVAOyIgPj51bmRlcnNjb3JlLnQKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdW5kZXJzY29yZS50IHVuZGVyc2NvcmUuYwotCXRvdWNoIHN0YW1wLXVuZGVyCi0KLWNwbHVzLWRlbS5vOiAkKEJBU0VESVIpL2xpYmliZXJ0eS9jcGx1cy1kZW0uYyAkKElOQ0RJUikvZ2V0b3B0LmgKLQkkKENPTVBJTEUpIC1jIC1ETUFJTiAtRFZFUlNJT049JyIkKFZFUlNJT04pIicgJChCQVNFRElSKS9saWJpYmVydHkvY3BsdXMtZGVtLmMKLQotIyBUaGUgZm9sbG93aW5nIGlzIGNvbW1lbnRlZCBvdXQgZm9yIHRoZSBjb252ZXJ0aW9uIHRvIGF1dG9tYWtlLgotIyBUaGlzIHJ1bGUgY3JlYXRlcyBhIHNpbmdsZSBiaW5hcnkgdGhhdCBzd2l0Y2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWIKLSMgYnkgbG9va2luZyBhdCBhcmd2WzBdLiAgVXNlIHRoaXMga2x1ZGdlIHRvIHNhdmUgc29tZSBkaXNrIHNwYWNlLgotIyBIb3dldmVyLCB5b3UgaGF2ZSB0byBpbnN0YWxsIHRoaW5ncyBieSBoYW5kLgotIyAoVGhhdCBpcyBhZnRlciAnbWFrZSBpbnN0YWxsJywgcmVwbGFjZSB0aGUgaW5zdGFsbGVkIHJhbmxpYiBieSBhIGxpbmsgdG8gYXIuKQotIyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGluc3RhbGwgcmFubGliLnNoIGFzIHJhbmxpYi4KLSMgYXJfd2l0aF9yYW5saWI6ICQoQURETF9ERVBTKSBhci5vIG1heWJlLXJhbmxpYi5vCi0jCSQoSExERU5WKSAkKENDKSAkKEhMREZMQUdTKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkKEFSX1BST0cpIGFyLm8gbWF5YmUtcmFubGliLm8gJChBRERMX0xJQlMpICQoRVhUUkFMSUJTKQotIwktcm0gLWYgJChSQU5MSUJfUFJPRykKLSMJLWxuICQoQVJfUFJPRykgJChSQU5MSUJfUFJPRykKLSMKLSMgb2JqY29weSBhbmQgc3RyaXAgaW4gb25lIGJpbmFyeSB0aGF0IHVzZXMgYXJndlswXSB0byBkZWNpZGUgaXRzIGFjdGlvbi4KLSMKLSNvYmpjb3B5X3dpdGhfc3RyaXA6ICQoQURETF9ERVBTKSBvYmpjb3B5Lm8gbWF5YmUtc3RyaXAubwotIwkkKEhMREVOVikgJChDQykgJChITERGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJChPQkpDT1BZX1BST0cpIG9iamNvcHkubyBtYXliZS1zdHJpcC5vICQoQURETF9MSUJTKSAkKEVYVFJBTElCUykKLSMJLXJtIC1mICQoU1RSSVBfUFJPRykKLSMJLWxuICQoT0JKQ09QWV9QUk9HKSAkKFNUUklQX1BST0cpCi0KLXN5c3JvZmYuYzogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvIAotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWMgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPnN5c3JvZmYuYwotCS4vc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgLWkgPCQoc3JjZGlyKS9zeXNyb2ZmLmluZm8gPj5zeXNyb2ZmLmMKLQkuL3N5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpIC1nIDwkKHNyY2Rpcikvc3lzcm9mZi5pbmZvID4+c3lzcm9mZi5jCi0KLXN5c3JvZmYuaDogc3lzaW5mbyQoRVhFRVhUX0ZPUl9CVUlMRCkgc3lzcm9mZi5pbmZvCi0JLi9zeXNpbmZvJChFWEVFWFRfRk9SX0JVSUxEKSAtZCA8JChzcmNkaXIpL3N5c3JvZmYuaW5mbyA+c3lzcm9mZi5oCi0KLXN5c2luZm8kKEVYRUVYVF9GT1JfQlVJTEQpOiBzeXNpbmZvLm8gc3lzbGV4Lm8KLQkkKENDX0ZPUl9CVUlMRCkgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAgc3lzaW5mby5vIHN5c2xleC5vIAotCi1zeXNsZXgubzogc3lzbGV4LmMgc3lzaW5mby5oCi0JaWYgWyAtciBzeXNsZXguYyBdOyB0aGVuIFwKLQkgICQoQ0NfRk9SX0JVSUxEKSAtYyAtSS4gJChDRkxBR1MpICBzeXNsZXguYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuIC1JJChzcmNkaXIpICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzbGV4LmMgO1wKLQlmaQotCi1zeXNpbmZvLm86IHN5c2luZm8uYwotCWlmIFsgLXIgc3lzaW5mby5jIF07IHRoZW4gXAotCSAgJChDQ19GT1JfQlVJTEQpIC1jIC1JLiAkKENGTEFHUykgIHN5c2luZm8uYyAgOyBcCi0JZWxzZSBcCi0JICAkKENDX0ZPUl9CVUlMRCkgLWMgLUkuICQoQ0ZMQUdTKSAkKHNyY2Rpcikvc3lzaW5mby5jIDsgXAotCWZpCi0KLWRsbHRvb2wubzpkbGx0b29sLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvZGxsdG9vbC5jCi0KLXJlc2NvZmYubzpyZXNjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoRExMVE9PTF9ERUZTKSAkKHNyY2RpcikvcmVzY29mZi5jCi0KLSMgY29mZi9zeW0uaCBhbmQgY29mZi9lY29mZi5oIHdvbid0IGJlIGZvdW5kIGJ5IHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeQotIyBzY3JpcHRzLCBzaW5jZSB0aGV5IGFyZSBvbmx5IGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkuCi1ubG1jb252Lm86IG5sbWNvbnYuYyAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0JbGRuYW1lPWBlY2hvIGxkIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSQoQ09NUElMRSkgLWMgLURMRF9OQU1FPSJcIiQke2xkbmFtZX1cIiIgQE5MTUNPTlZfREVGU0AgJChzcmNkaXIpL25sbWNvbnYuYwotCi1kaXN0c3R1ZmY6ICQoRElTVFNUVUZGKSBpbmZvCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwuZGVwMSA+LmRlcAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgLmRlcDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JJChERVApIC1mIC5kZXAyICQoSU5DTFVERVMpICQ/Ci0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCW9iamRpcj1gcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScJXAotCQktZSAicyFAT0JKRElSQCEkJHtvYmpkaXJ9ISIKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyMjCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotY29uZmlnLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgY29uZmlnLnRleGkKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiBjb25maWcudGV4aQotCi1iaW51dGlscy5kdmk6ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLWJpbnV0aWxzLmluZm86ICQoc3JjZGlyKS9iaW51dGlscy50ZXhpIGNvbmZpZy50ZXhpCi0KLSQoREVNQU5HTEVSX1BST0cpLjE6IGN4eGZpbHQubWFuIE1ha2VmaWxlCi0Jc2VkIC1lICdzL0BQUk9HUkFNQC8kKERFTUFOR0xFUl9QUk9HKS8nIDwgJChzcmNkaXIpL2N4eGZpbHQubWFuIFwKLQkJPiAkKERFTUFOR0xFUl9QUk9HKS4xCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6ICQoYmluX1BST0dSQU1TKSAkKG5vaW5zdF9QUk9HUkFNUykKLQlAbGlzdD0nJChub2luc3RfUFJPR1JBTVMpJzsgZm9yIHAgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkcDsgdGhlbiBcCi0JICAgIGVjaG8gIiAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCSAgZWxzZSA6OyBmaTsgXAotCWRvbmUKLQkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCi0JZm9yIGkgaW4gJChUT09MX1BST0dTKTsgZG8gXAotCSAgaWYgWyAtZiAkJGkkKEVYRUVYVCkgXTsgdGhlbiBcCi0JICAgIGo9YGVjaG8gJCRpIHwgc2VkIC1lICdzLy1uZXcvLydgOyBcCi0JICAgIGs9YGVjaG8gJCRqIHwgc2VkICckKHRyYW5zZm9ybSknYDsgXAotCSAgICBpZiBbICIkKGJpbmRpcikvJCRrJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vJCRqJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgICAgICBybSAtZiAkKHRvb2xkaXIpL2Jpbi8kJGokKEVYRUVYVCk7IFwKLQkgICAgICBsbiAkKGJpbmRpcikvJCRrJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKSA+L2Rldi9udWxsIDI+L2Rldi9udWxsIFwKLQkJfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRpJChFWEVFWFQpICQodG9vbGRpcikvYmluLyQkaiQoRVhFRVhUKTsgXAotCSAgICBmaTsgXAotCSAgZWxzZSB0cnVlOyBcCi0JICBmaTsgXAotCWRvbmUKLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotYWRkcjJsaW5lLm86IGFkZHIybGluZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2RlbWFuZ2xlLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1hci5vOiBhci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2FvdXQvYXIuaCAkKEJGRERJUikvbGliYmZkLmggYXJzdXAuaAotYXJzdXAubzogYXJzdXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBhcnN1cC5oICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1idWNvbW0ubzogYnVjb21tLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWNvZmZkdW1wLm86IGNvZmZkdW1wLmMgY29mZmdyb2suaCBidWNvbW0uaCBjb25maWcuaCBcCi0gICQoSU5DRElSKS9mb3Blbi1zYW1lLmgKLWNvZmZncm9rLm86IGNvZmZncm9rLmMgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgY29mZmdyb2suaAotZGVidWcubzogZGVidWcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmgKLWRsbHRvb2wubzogZGxsdG9vbC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9kZW1hbmdsZS5oIGR5bi1zdHJpbmcuaCBcCi0gIGRsbHRvb2wuaAotZmlsZW1vZGUubzogZmlsZW1vZGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oCi1pZWVlLm86IGllZWUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2llZWUuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgZGVidWcuaCBidWRiZy5oCi1pcy1yYW5saWIubzogaXMtcmFubGliLmMKLWlzLXN0cmlwLm86IGlzLXN0cmlwLmMKLW1heWJlLXJhbmxpYi5vOiBtYXliZS1yYW5saWIuYwotbWF5YmUtc3RyaXAubzogbWF5YmUtc3RyaXAuYwotbmxtY29udi5vOiBubG1jb252LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKEJGRERJUikvbGlibmxtLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvbmxtL2V4dGVybmFsLmggbmxtY29udi5oCi1ubS5vOiBubS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvcHJvZ3Jlc3MuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2dldG9wdC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKElOQ0RJUikvYW91dC9yYW5saWIuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotbm90LXJhbmxpYi5vOiBub3QtcmFubGliLmMKLW5vdC1zdHJpcC5vOiBub3Qtc3RyaXAuYwotb2JqY29weS5vOiBvYmpjb3B5LmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL3Byb2dyZXNzLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9nZXRvcHQuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYnVkYmcuaAotb2JqZHVtcC5vOiBvYmpkdW1wLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9wcm9ncmVzcy5oIGJ1Y29tbS5oIGNvbmZpZy5oIFwKLSAgJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotcHJkYmcubzogcHJkYmcuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIGRlYnVnLmggYnVkYmcuaAotcmRjb2ZmLm86IHJkY29mZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvZGVtYW5nbGUuaCBkZWJ1Zy5oIFwKLSAgYnVkYmcuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLXJkZGJnLm86IHJkZGJnLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmgKLXNpemUubzogc2l6ZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvZ2V0b3B0LmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3Jjb252Lm86IHNyY29udi5jIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBzeXNyb2ZmLmggY29mZmdyb2suaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN5c3JvZmYuYwotc3RhYnMubzogc3RhYnMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGRlYnVnLmggYnVkYmcuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN0cmluZ3Mubzogc3RyaW5ncy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1zeXNkdW1wLm86IHN5c2R1bXAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIHN5c3JvZmYuaCBcCi0gIHN5c3JvZmYuYwotdmVyc2lvbi5vOiB2ZXJzaW9uLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotd3JzdGFicy5vOiB3cnN0YWJzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICBkZWJ1Zy5oIGJ1ZGJnLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi13aW5kcmVzLm86IHdpbmRyZXMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvb2JzdGFjay5oIHdpbmRyZXMuaCBcCi0gIHdpbmR1bmkuaAotcmVzcmMubzogcmVzcmMuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmgKLXJlc2NvZmYubzogcmVzY29mZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1yZXNiaW4ubzogcmVzYmluLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi13aW5kdW5pLm86IHdpbmR1bmkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIHdpbmR1bmkuaAotcmVhZGVsZi5vOiByZWFkZWxmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9kd2FyZjIuaCAkKElOQ0RJUikvZWxmL2kzODYuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2VsZi92ODUwLmggJChJTkNESVIpL2VsZi9wcGMuaCAkKElOQ0RJUikvZWxmL21pcHMuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL2FybS5oICQoSU5DRElSKS9lbGYvbTY4ay5oIFwKLSAgJChJTkNESVIpL2VsZi9zcGFyYy5oICQoSU5DRElSKS9lbGYvbTMyci5oICQoSU5DRElSKS9lbGYvZDEwdi5oIFwKLSAgJChJTkNESVIpL2VsZi9kMzB2LmggJChJTkNESVIpL2VsZi9zaC5oICQoSU5DRElSKS9lbGYvbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2VsZi9tbjEwMzAwLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvZnIzMC5oICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL2k5NjAuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2dldG9wdC5oCi1yZXNyZXMubzogcmVzcmVzLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICB3aW5kcmVzLmggd2luZHVuaS5oCi1keW4tc3RyaW5nLm86IGR5bi1zdHJpbmcuYyBjb25maWcuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGR5bi1zdHJpbmcuaAotZGxsd3JhcC5vOiBkbGx3cmFwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggZHluLXN0cmluZy5oCi1yZW5hbWUubzogcmVuYW1lLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaAotdW5kZXJzY29yZS5vOiB1bmRlcnNjb3JlLmMKLWFycGFyc2UubzogYXJwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggYXJzdXAuaAotYXJsZXgubzogYXJsZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmggYXJwYXJzZS5oCi1zeXNyb2ZmLm86IHN5c3JvZmYuYwotc3lzaW5mby5vOiBzeXNpbmZvLmMKLXN5c2xleC5vOiBzeXNsZXguYyBzeXNpbmZvLmgKLWRlZnBhcnNlLm86IGRlZnBhcnNlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgYnVjb21tLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBkbGx0b29sLmgKLWRlZmxleC5vOiBkZWZsZXguYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBkZWZwYXJzZS5oIGRsbHRvb2wuaAotbmxtaGVhZGVyLm86IG5sbWhlYWRlci5jIC4uL2JmZC9iZmQuaCBidWNvbW0uaCBjb25maWcuaCBcCi0gICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL25sbS9jb21tb24uaCAkKElOQ0RJUikvbmxtL2ludGVybmFsLmggXAotICBubG1jb252LmgKLXJjcGFyc2UubzogcmNwYXJzZS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIGJ1Y29tbS5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgd2luZHJlcy5oIHdpbmR1bmkuaAotcmNsZXgubzogcmNsZXguYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBidWNvbW0uaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gIHdpbmRyZXMuaCB3aW5kdW5pLmggcmNwYXJzZS5oCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9iaW51dGlscy9ORVdTIGIvYmludXRpbHMvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyN2FkNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ORVdTCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS0qLSB0ZXh0IC0qLQotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuMTA6Ci0KLSogTmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8gb2JqZHVtcCAtTSAob3IgLS1kaXNhc3NlbWJsZXItb3B0aW9ucykgd2hpY2ggdGFrZXMKLSAgYSBwYXJhbWV0ZXIgd2hpY2ggY2FuIHRoZW4gYmUgaW50ZXJwcmV0ZWQgb24gYSBwZXItdGFyZ2V0IGJhc2lzIGJ5IHRoZQotICBkaXNhc3NlbWJsZXIuICBVc2VkIGJ5IEFSTSB0YXJnZXRzIHRvIHNlbGVjdCByZWdpc3RlciBuYW1lIHNldHMsIElTQSwgQVBDUyBvcgotICByYXcgdmVyaW9ucy4KLSAgCi0qIG9iamR1bXAgc3VwcG9ydCBmb3IgLW1pMzg2OmludGVsIHdoaWNoIGNhdXNlcyBkaXNhc3NlbWJseSB0byBiZSBkaXNwbGF5ZWQKLSAgd2l0aCBpbnRlbCBzeW50YXguCi0KLSogTmV3IHByb2dyYW06IHJlYWRlbGYuICBUaGlzIGRpc3BsYXlzIHRoZSBjb250ZW50cyBvZiBFTEYgZm9ybWF0IGZpbGVzLAotICByZWdhcmRsZXNzIG9mIHRhcmdldCBtYWNoaW5lLgotCi0qIG9iamNvcHkgbm93IHRha2VzIC0tY2hhbmdlLXNlY3Rpb24tbG1hLCAtLWNoYW5nZS1zZWN0aW9uLXZtYSwgYW5kCi0gIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcyBvcHRpb25zLiAgVGhlIG9sZCAtLWFkanVzdC1zZWN0aW9uLXZtYSBvcHRpb24gaXMKLSAgZXF1aXZhbGVudCB0byAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MuICBUaGUgb3RoZXIgLS1hZGp1c3QtKiBvcHRpb25zIGFyZSBub3cKLSAgcmVuYW1lZCB0byAtLWNoYW5nZS0qLCBhbHRob3VnaCAtLWFkanVzdC0qIGNvbnRpbnVlcyB0byB3b3JrLgotCi0qIGRsbHRvb2wgbm93IHN1cHBvcnRzIHRoZSBJTVBPUlRTIGNvbW1hbmQuCi0KLSogZGxsdG9vbCBub3cgdGFrZXMgLS1leHBvcnQtYWxsLXN5bWJvbHMsIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzLAotICAtLWV4Y2x1ZGUtc3ltYm9scywgYW5kIC0tbm8tZGVmYXVsdC1leGNsdWRlcyBvcHRpb25zLgotCi0qIG9iamNvcHkgbm93IHRha2VzIGEgLWovLS1vbmx5LXNlY3Rpb24gb3B0aW9uIHRvIGNvcHkgb25seSB0aGUgc3BlY2lmaWVkCi0gIHNlY3Rpb25zLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuOToKLQotKiBBZGRlZCB3aW5kcmVzIHByb2dyYW0sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2VzIGluIFdJTjMyCi0gIGZpbGVzIGFzIHVzZWQgb24gV2luZG93cyA5NSBhbmQgV2luZG93cyBOVC4KLQotKiBUaGUgb2JqY29weSAtLWdhcC1maWxsIGFuZCAtLXBhZC10byBvcHRpb25zIG9wZXJhdGUgb24gdGhlIExNQSByYXRoZXIgdGhhbgotICB0aGUgVk1BIG9mIHRoZSBzZWN0aW9ucy4KLQotKiBBZGRlZCBTIG1vZGlmaWVyIHRvIGFyIHRvIG5vdCBidWlsZCBhIHN5bWJvbCB0YWJsZS4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjg6Ci0KLSogVGhlIG9iamR1bXAgZGlzYXNzZW1ibHkgZm9ybWF0IGhhcyBiZWVuIGNoYW5nZWQsIGFuZCBob3BlZnVsbHkgaW1wcm92ZWQuICBVc2UKLSAgdGhlIG5ldyAtLXByZWZpeC1hZGRyZXNzZXMgb3B0aW9uIHRvIGdldCB0aGUgb2xkIGZvcm1hdC4gIFRoZXJlIGFyZSBhbHNvIG5ldwotICAtLWRpc2Fzc2VtYmxlLXplcm9lcyBhbmQgLS1uby1zaG93LXJhdy1pbnNuIG9wdGlvbnMgd2hpY2ggYWZmZWN0IGRpc2Fzc2VtYmxlcgotICBvdXRwdXQuCi0KLSogRm9ybWF0cyBtYXkgbm93IGJlIHNwZWNpZmllZCBhcyBjb25maWd1cmF0aW9uIHRyaXBsZXRzLiAgRm9yIGV4YW1wbGUsCi0gIG9iamR1bXAgLWIgaTM4Ni1wYy1saW51eC4gIFRoZSB0cmlwbGV0cyBhcmUgbm90IHBhc3NlZCB0aHJvdWdoIGNvbmZpZy5zdWIsCi0gIHNvIHRoZXkgbXVzdCBiZSBpbiBjYW5vbmljYWwgZm9ybS4KLQotKiBBZGRlZCBuZXcgYWRkcjJsaW5lIHByb2dyYW0uICBUaGlzIHVzZXMgdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBjb252ZXJ0Ci0gIGFuIGFkZHJlc3MgaW50byBhIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgd2l0aGluIGEgcHJvZ3JhbS4KLQotKiBBZGRlZCAtLWNoYW5nZS1sZWFkaW5nLWNoYXIgYXJndW1lbnQgdG8gb2JqY29weS4KLQotKiBBZGRlZCAtLXdlYWtlbiBhcmd1bWVudCB0byBvYmpjb3B5LgotCi0qIG9iamR1bXAgLS1keW5hbWljLXJlbG9jIG5vdyB3b3JrcyBvbiBFTEYgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZCBsaWJyYXJpZXMuCi0KLSogQWRkZWQgLS1hZGp1c3Qtdm1hIG9wdGlvbiB0byBvYmpkdW1wLgotCi0qIEFkZGVkIC1DLy0tZGVtYW5nbGUgb3B0aW9uIHRvIG9iamR1bXAuCi0KLSogQWRkZWQgLXAvLS1wcmVzZXJ2ZS1kYXRlcyBvcHRpb24gdG8gc3RyaXAgYW5kIG9iamNvcHkuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi43OgotCi0qIEFkZGVkIC0tZW5hYmxlLXNoYXJlZCBhbmQgLS1lbmFibGUtY29tbW9uYmZkbGliIG9wdGlvbnMgdG8gY29uZmlndXJlLgotCi0qIEFkZGVkIC0tZGVidWdnaW5nIGFyZ3VtZW50IHRvIG9iamR1bXAgYW5kIG9iamNvcHkuCi0KLSogQWRkZWQgLS1kZWZpbmVkLW9ubHkgYXJndW1lbnQgdG8gbm0uCi0KLSogQWRkZWQgLS1yZW1vdmUtbGVhZGluZy1jaGFyIGFyZ3VtZW50IHRvIG9iamNvcHkuCi0KLSogVGhlIG9iamR1bXAgLS1saW5lLW51bWJlcnMgb3B0aW9uIGlzIG5vdyBtZWFuaW5nZnVsIHdpdGggLS1yZWxvYy4KLQotKiBBZGRlZCAtLWxpbmUtbnVtYmVycyBvcHRpb24gdG8gbm0uCi0KLSogQWRkZWQgLS1lbmRpYW4vLUVCLy1FTCBvcHRpb24gdG8gb2JqZHVtcC4KLQotKiBBZGRlZCBzdXBwb3J0IGZvciBBbHBoYSBPcGVuVk1TL0FYUC4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjY6Ci0KLSogQWRkZWQgLU4vLS1zdHJpcC1zeW1ib2wgYW5kIC1LLy0ta2VlcC1zeW1ib2wgYXJndW1lbnRzIHRvIHN0cmlwIGFuZCBvYmpjb3B5LgotCi0qIEFkZGVkIHNldmVyYWwgYXJndW1lbnRzIHRvIG9iamNvcHkgdG8gcHJvdmlkZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgdGhlIG5ldwotICBmaWxlIGlzIGxhaWQgb3V0IGluIG1lbW9yeS4gIEFsc28gYWRkZWQgYmluYXJ5IG91dHB1dCBmb3JtYXQgdG8gQkZEIHRvIHBlcm1pdAotICBnZW5lcmF0aW5nIHBsYWluIGJpbmFyeSBmaWxlcy4KLQotKiBBZGRlZCAtLXN0YXJ0LWFkZHJlc3MgYW5kIC0tc3RvcC1hZGRyZXNzIG9wdGlvbnMgdG8gb2JqZHVtcC4KLQotKiBhciBhbmQgcmFubGliIG5vdyB3b3JrIG9uIEFJWC4gIFRoZSB0b29scyBhcmUgbm93IGJ1aWx0IGJ5IGRlZmF1bHQgb24gQUlYLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNToKLQotKiBDaGFuZ2VkIG9iamR1bXAgLWRyIHRvIGR1bXAgdGhlIHJlbG9jcyBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgYXNzZW1ibHkKLSAgbGlzdGluZywgZm9yIGEgbW9yZSB1c2VmdWwgbGlzdGluZyBvZiByZWxvY2F0ZWFibGUgZmlsZXMuCi0KLSogQ2hhbmdlZCBvYmpkdW1wIC1kLy0tZGlzYXNzZW1ibGUgdG8gb25seSBkaXNhc3NlbWJsZSBTRUNfQ09ERSBzZWN0aW9ucy4KLSAgQWRkZWQgLUQvLS1kaXNhc3NlbWJsZS1hbGwgb3B0aW9uIHRvIGRpc2Fzc2VtYmxlIGFsbCBzZWN0aW9ucy4KLQotKiBBZGRlZCAtLXNpemUtc29ydCBvcHRpb24gdG8gbm0uCi0KLSogc3RyaXAgYW5kIG9iamNvcHkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGhhbmRsZSBkeW5hbWljYWxseSBsaW5rZWQgRUxGCi0gIGV4ZWN1dGFibGVzLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuNDoKLQotKiBTdXBwb3J0IGZvciBIUC1QQSAoYnkgSmVmZiBMYXcpLCBpMzg2IE1hY2ggKGJ5IERhdmlkIE1hY2tlbnppZSksIFJTLzYwMDAgYW5kCi0gIFBvd2VyUEMgKGV4Y2VwdCBhciBhbmQgcmFubGliOyBieSBJYW4gVGF5bG9yKS4KLQotKiBTdXBwb3J0IGZvciBJcml4IDUuCi0KLSogUHJvZ3JhbXMgYHN0cmlwJyBhbmQgYG9iamNvcHknIHdpbGwgbm90IGF0dGVtcHQgdG8gd3JpdGUgZHluYW1pY2FsbHkgbGlua2VkCi0gIEVMRiBvdXRwdXQgZmlsZXMsIHNpbmNlIEJGRCBjdXJyZW50bHkgY2FuJ3QgY3JlYXRlIHRoZW0gcHJvcGVybHkuCi0KLUNoYW5nZXMgaW4gYmludXRpbHMgMi4zOgotCi0qIEEgbmV3IC0tc3RhYnMgYXJndW1lbnQgaGFzIGJlZW4gYWRkZWQgdG8gb2JqZHVtcCB0byBkdW1wIHN0YWJzIHNlY3Rpb25zIGluCi0gIEVMRiBhbmQgQ09GRiBmaWxlcy4KLQotKiBBIG5ldyBwcm9ncmFtLCBubG1jb252LCBoYXMgYmVlbiBhZGRlZC4gIEl0IGNhbiBjb252ZXJ0IG9iamVjdCBmaWxlcyBpbnRvCi0gIE5vdmVsbCBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZXMuCi0KLSogVGhlIHN0cmluZ3MgcHJvZ3JhbSBoYXMgYmVlbiBhZGRlZC4KLQotQ2hhbmdlcyBpbiBiaW51dGlscyAyLjI6Ci0KLSogVGhlICdjb3B5JyBwcm9ncmFtIGhhcyBiZWVuIHJlbmFtZWQgdG8gJ29iamNvcHknLCBmb3IgY29uc2lzdGVuY3kgd2l0aAotICAnb2JqZHVtcCcsIGFuZCBiZWNhdXNlICdjb3B5JyBtaWdodCBtb3JlIHBsYXVzaWJseSBiZSB1c2VkIGFzIGEgc3lub255bSBmb3IKLSAgJ2NwJy4KLQotKiBUaGUgbmV3IHN0YW5kLWFsb25lIHByb2dyYW0gYysrZmlsdCBpcyBhIGZpbHRlciB0aGF0IGNvbnZlcnRzIGVuY29kZWQKLSAgKG1hbmdsZWQpIEMrKyBhc3NlbWJseS1sZXZlbCBpZGVudGlmaWVycyB0byB1c2VyLWxldmVsIG5hbWVzLiAgKE5vdGU6IFRoaXMKLSAgbWF5IGdldCBtb3ZlZCB0byB0aGUgZ2NjIGRpc3RyaWJ1dGlvbi4pCi0KLSogbm0gLW8gb24gYW4gYXJjaGl2ZSBub3cgcHJlZml4ZXMgZWFjaCBsaW5lIHdpdGggdGhlIGFyY2hpdmUgbmFtZSwgbWF0Y2hpbmcKLSAgdGhlIG91dHB1dCBmcm9tIEJTRCBubS4KLQotKiBhciAoYW5kIGxkKSBjYW4gbm93IHJlYWQgKGJ1dCBub3Qgd3JpdGUpIEJTRDQuNC1zdHlsZSBhcmNoaXZlcy4KLQotKiBOZXcgc3VwcG9ydCBmb3IgSDg1MDAsIFo4MDAwLCBhbmQgdGhlIEhpdGFjaCBTSC4KLQotKiBEaXMtYXNzZW1ibGVyIGludGVyZmFjZSBjaGFuZ2VkIHRvIGFsbG93IHNoYXJpbmcgd2l0aCBnZGIuCi0KLSogVGhlcmUgaXMgbmV3IEVsZiBjb2RlLCBidXQgaXQgaXMgbm90IHlldCByZWFkeSBmb3IgZ2VuZXJhbCB1c2UuCi0KLSogVGhlcmUgaXMgdGhlIGJlZ2lubmluZ3Mgb2YgYSB0ZXN0IHN1aXRlLgotCi1DaGFuZ2VzIGluIGJpbnV0aWxzIDIuMToKLQotKiBUaGVyZSBpcyBub3cgc3VwcG9ydCBmb3Igd3JpdGluZyBFQ09GRiBmaWxlcywgc28gbGQgYW5kIHRoZSBvdGhlciB1dGlsaXRpZXMKLSAgc2hvdWxkIHdvcmsgb24gUmlzYy9VbHRyaXggYW5kIElyaXguICBQbGVhc2UgbGV0IHVzIGtub3cgaG93IHdlbGwgdGhpcyB3b3Jrcy4KLQotKiBhciBub3cgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgc3ltYm9sIHRhYmxlIChhIF9fLlNZTURFRiBtZW1iZXIsIGluIHRoZSBCU0QKLSAgdmVyc2lvbiksIGlmIHRoZXJlIGFyZSBhbnkgb2JqZWN0IGZpbGVzIGluIHRoZSBhcmNoaXZlLiAgU28gcnVubmluZyByYW5saWIgaXMKLSAgbm93IHJlZHVuZGFudCAodW5sZXNzIHRoZSBub24tc3RhbmRhcmQgcSBjb21tYW5kIGlzIHVzZWQpLiAgVGhpcyBpcyByZXF1aXJlZAotICBmb3IgUG9zaXguMiBjb25mb3JtYW5jZS4KLQotKiBUaGUgYXJjaGl2ZS1yZWFkaW5nIGNvZGUgbm93IHJlYWRzIGJvdGggQlNELXN0eWxlIGFuZCBTWVNWLXN0eWxlIGFyY2hpdmVzCi0gIGluZGVwZW5kZW50bHkgb2YgdGhlIHNlbGVjdGVkIHRhcmdldCBmb3JtYXQuICBUaGlzIGlzIHRvIGVuY291cmFnZSBwZW9wbGUgdG8KLSAgc3dpdGNoIHRvIFNZU1YtZm9ybWF0LCB3aGljaCBoYXMgYSBudW1iZXIgb2YgYWR2YW50YWdlcy4KLQotKiBUaGUgc3RyaXAgYW5kIGNvcHkgcHJvZ3JhbXMgbm93IGhhdmUgb3B0aW9ucyB0byByZW1vdmUgZGVidWctc3ltYm9scyBvbmx5Ci0gIGFuZC9vciBsb2NhbCBzeW1ib2xzIG9ubHkuICBUaGV5IG5vdyBhbHNvIHN1cHBvcnQgbG9uZyBvcHRpb25zLgotCi0MCi1Mb2NhbCB2YXJpYWJsZXM6Ci1maWxsLWNvbHVtbjogNzkKLUVuZDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL1JFQURNRSBiL2JpbnV0aWxzL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyZDI3Ny4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotVGhlc2UgYXJlIHRoZSBHTlUgYmludXRpbHMuICBUaGVzZSBhcmUgdXRpbGl0aWVzIG9mIHVzZSB3aGVuIGRlYWxpbmcKLXdpdGggb2JqZWN0IGZpbGVzLgotCi1UaGUgbGlua2VyIChsZCkgaXMgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHdoaWNoIHNob3VsZCBiZSAuLi9sZC4KLUxpbmtlci1zcGVjaWZpYyBub3RlcyBhcmUgaW4gLi4vbGQvUkVBRE1FLgotCi1BcyBvZiB2ZXJzaW9uIDIuNSwgdGhlIGFzc2VtYmxlciAoYXMpIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCBpbgotLi4vZ2FzLiAgQXNzZW1ibGVyLXNwZWNpZmljIG5vdGVzIGNhbiBiZSBmb3VuZCBpbiAuLi9nYXMvUkVBRE1FLgotCi1SZWNlbnQgY2hhbmdlcyBhcmUgaW4gLi9ORVdTLCAuLi9sZC9ORVdTLCBhbmQgLi4vZ2FzL05FV1MuCi0KLVVucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0tIHF1aWNrIG92ZXJ2aWV3Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaGVuIHlvdSB1bnBhY2sgdGhlIGJpbnV0aWxzLTIuOS50YXIuZ3ogZmlsZSwgeW91J2xsIGdldCBhIGRpcmVjdG9yeQotY2FsbGVkIHNvbWV0aGluZyBsaWtlIGBiaW51dGlscy0yLjknLCB3aGljaCBjb250YWlucyB2YXJpb3VzIGZpbGVzIGFuZAotZGlyZWN0b3JpZXMuICBNb3N0IG9mIHRoZSBmaWxlcyBpbiB0aGUgdG9wIGRpcmVjdG9yeSBhcmUgZm9yCi1pbmZvcm1hdGlvbiBhbmQgZm9yIGNvbmZpZ3VyYXRpb24uICBUaGUgYWN0dWFsIHNvdXJjZSBjb2RlIGlzIGluCi1zdWJkaXJlY3Rvcmllcy4KLQotVG8gYnVpbGQgYmludXRpbHMsIHlvdSBjYW4ganVzdCBkbzoKLQotCWNkIGJpbnV0aWxzLTIuOQotCS4vY29uZmlndXJlIFtvcHRpb25zXQotCW1ha2UKLQltYWtlIGluc3RhbGwgIyBjb3BpZXMgdGhlIHByb2dyYW1zIGZpbGVzIGludG8gL3Vzci9sb2NhbC9iaW4KLQkJICAgICAjIGJ5IGRlZmF1bHQuCi0KLVRoaXMgd2lsbCBjb25maWd1cmUgYW5kIGJ1aWxkIGFsbCB0aGUgbGlicmFyaWVzIGFzIHdlbGwgYXMgdGhlCi1hc3NlbWJsZXIsIHRoZSBiaW51dGlscywgYW5kIHRoZSBsaW5rZXIuCi0KLUlmIHlvdSBoYXZlIEdOVSBtYWtlLCB3ZSByZWNvbW1lbmQgYnVpbGRpbmcgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5OgotCi0JbWtkaXIgb2JqZGlyCi0JY2Qgb2JqZGlyCi0JLi4vYmludXRpbHMtMi45L2NvbmZpZ3VyZSBbb3B0aW9uc10KLQltYWtlCi0JbWFrZSBpbnN0YWxsCi0KLVRoaXMgcmVsaWVzIG9uIHRoZSBWUEFUSCBmZWF0dXJlIG9mIEdOVSBtYWtlLgotCi1CeSBkZWZhdWx0LCB0aGUgYmludXRpbHMgd2lsbCBiZSBjb25maWd1cmVkIHRvIHN1cHBvcnQgdGhlIHN5c3RlbSBvbgotd2hpY2ggdGhleSBhcmUgYnVpbHQuICBXaGVuIGRvaW5nIGNyb3NzIGRldmVsb3BtZW50LCB1c2UgdGhlIC0tdGFyZ2V0Ci1jb25maWd1cmUgb3B0aW9uIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgdGFyZ2V0LgotCi1UaGUgLS1lbmFibGUtdGFyZ2V0cyBvcHRpb24gYWRkcyBzdXBwb3J0IGZvciBtb3JlIGJpbmFyeSBmaWxlIGZvcm1hdHMKLWJlc2lkZXMgdGhlIGRlZmF1bHQuICBMaXN0IHRoZW0gYXMgdGhlIGFyZ3VtZW50IHRvIC0tZW5hYmxlLXRhcmdldHMsCi1zZXBhcmF0ZWQgYnkgY29tbWFzLiAgRm9yIGV4YW1wbGU6Ci0KLQkuL2NvbmZpZ3VyZSAtLWVuYWJsZS10YXJnZXRzPXN1bjMscnM2MDAwLWFpeCxkZWNzdGF0aW9uCi0KLVRoZSBuYW1lICdhbGwnIGNvbXBpbGVzIGluIHN1cHBvcnQgZm9yIGFsbCB2YWxpZCBCRkQgdGFyZ2V0cyAodGhpcyB3YXMKLXRoZSBkZWZhdWx0IGluIHJlbGVhc2VzIGJlZm9yZSAyLjMpOgotCi0JLi9jb25maWd1cmUgLS1lbmFibGUtdGFyZ2V0cz1hbGwKLQotWW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIC0tZW5hYmxlLXNoYXJlZCBvcHRpb24gd2hlbiB5b3UgcnVuCi1jb25maWd1cmUuICBUaGlzIHdpbGwgYnVpbGQgdGhlIEJGRCBhbmQgb3Bjb2RlcyBsaWJyYXJpZXMgYXMgc2hhcmVkCi1saWJyYXJpZXMuICBZb3UgY2FuIHVzZSBhcmd1bWVudHMgd2l0aCB0aGUgLS1lbmFibGUtc2hhcmVkIG9wdGlvbiB0bwotaW5kaWNhdGUgdGhhdCBvbmx5IGNlcnRhaW4gbGlicmFyaWVzIHNob3VsZCBiZSBidWlsdCBzaGFyZWQ7IGZvcgotZXhhbXBsZSwgLS1lbmFibGUtc2hhcmVkPWJmZC4gIFRoZSBvbmx5IHBvdGVudGlhbCBzaGFyZWQgbGlicmFyaWVzIGluCi1hIGJpbnV0aWxzIHJlbGVhc2UgYXJlIGJmZCBhbmQgb3Bjb2Rlcy4KLQotVGhlIGJpbnV0aWxzIHdpbGwgYmUgbGlua2VkIGFnYWluc3QgdGhlIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgYnVpbGQKLXN0ZXAgd2lsbCBhdHRlbXB0IHRvIHBsYWNlIHRoZSBjb3JyZWN0IGxpYnJhcnkgaW4gdGhlIHJ1bnRpbWUgc2VhcmNoCi1wYXRoIGZvciB0aGUgYmluYXJpZXMuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCBhZnRlciB5b3UgaW5zdGFsbCB0aGUKLWJpbmFyaWVzLCB5b3UgbWF5IGhhdmUgdG8gc2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBub3JtYWxseQotTERfTElCUkFSWV9QQVRILCBzbyB0aGF0IHRoZSBzeXN0ZW0gY2FuIGZpbmQgdGhlIGluc3RhbGxlZCBsaWJiZmQKLXNoYXJlZCBsaWJyYXJ5LgotCi1UbyBidWlsZCB1bmRlciBvcGVuVk1TL0FYUCwgc2VlIHRoZSBmaWxlIG1ha2VmaWxlLnZtcyBpbiB0aGUgdG9wIGxldmVsCi1kaXJlY3RvcnkuCi0KLUlmIHlvdSBkb24ndCBoYXZlIGFyCi09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgYW4gYXIgcHJvZ3JhbSwgdGhlIG5vcm1hbAotYmludXRpbHMgYnVpbGQgcHJvY2VzcyB3aWxsIG5vdCB3b3JrLiAgSW4gdGhpcyBjYXNlLCBydW4gY29uZmlndXJlIGFzCi11c3VhbC4gIEJlZm9yZSBydW5uaW5nIG1ha2UsIHJ1biB0aGlzIHNjcmlwdDoKLQotIyEvYmluL3NoCi1NQUtFX1BST0c9IiR7TUFLRS1tYWtlfSIKLU1BS0U9IiR7TUFLRV9QUk9HfSBBUj10cnVlIExJTks9dHJ1ZSIKLWV4cG9ydCBNQUtFCi0ke01BS0V9ICQqIGFsbC1saWJpYmVydHkKLSR7TUFLRX0gJCogYWxsLWludGwKLSR7TUFLRX0gJCogYWxsLWJmZAotY2QgYmludXRpbHMKLU1BS0U9IiR7TUFLRV9QUk9HfSIKLWV4cG9ydCBNQUtFCi0ke01BS0V9ICQqIGFyX0RFUEVOREVOQ0lFUz0gYXJfTERBREQ9Jy4uL2JmZC8qLm8gYGNhdCAuLi9saWJpYmVydHkvcmVxdWlyZWQtbGlzdCAuLi9saWJpYmVydHkvbmVlZGVkLWxpc3QgfCBzZWQgLWUgInMsXChbXiBdW14gXSpcKSwuLi9saWJpYmVydHkvXDEsZyJgIGBpZiB0ZXN0IC1mIC4uL2ludGwvZ2V0dGV4dC5vOyB0aGVuIGVjaG8gJy4uL2ludGwvKi5vJzsgZmlgJyBhcgotCi1UaGlzIHNjcmlwdCB3aWxsIGJ1aWxkIGFuIGFyIHByb2dyYW0gaW4gYmludXRpbHMvYXIuICBNb3ZlIGJpbnV0aWxzL2FyCi1pbnRvIGEgZGlyZWN0b3J5IG9uIHlvdXIgUEFUSC4gIEFmdGVyIGRvaW5nIHRoaXMsIHlvdSBjYW4gcnVuIG1ha2UgYXMKLXVzdWFsIHRvIGJ1aWxkIHRoZSBjb21wbGV0ZSBiaW51dGlscyBkaXN0cmlidXRpb24uICBZb3UgZG8gbm90IG5lZWQKLXRoZSByYW5saWIgcHJvZ3JhbSBpbiBvcmRlciB0byBidWlsZCB0aGUgZGlzdHJpYnV0aW9uLgotCi1Qb3J0aW5nCi09PT09PT09Ci0KLUJpbnV0aWxzLTIuOSBzdXBwb3J0cyBtYW55IGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLCBidXQgdGhlcmUKLWFyZSBtYW55IG1vcmUgbm90IHN1cHBvcnRlZCwgaW5jbHVkaW5nIHNvbWUgdGhhdCB3ZXJlIHN1cHBvcnRlZAotYnkgZWFybGllciB2ZXJzaW9ucy4gIFdlIGFyZSBob3BpbmcgZm9yIHZvbHVudGVlcnMgdG8KLWltcHJvdmUgdGhpcyBzaXR1YXRpb24uCi0KLVRoZSBtYWpvciBlZmZvcnQgaW4gcG9ydGluZyBiaW51dGlscyB0byBhIG5ldyBob3N0IGFuZC9vciB0YXJnZXQKLWFyY2hpdGVjdHVyZSBpbnZvbHZlcyB0aGUgQkZEIGxpYnJhcnkuICBUaGVyZSBpcyBzb21lIGRvY3VtZW50YXRpb24KLWluIC4uL2JmZC9kb2MuICBUaGUgZmlsZSAuLi9nZGIvZG9jL2dkYmludC50ZXhpbmZvIChkaXN0cmlidXRlZAotd2l0aCBnZGItNC54KSBtYXkgYWxzbyBiZSBvZiBoZWxwLgotCi1SZXBvcnRpbmcgYnVncwotPT09PT09PT09PT09PT0KLQotU2VuZCBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcyB0byBidWctZ251LXV0aWxzQGdudS5vcmcuICBBbHdheXMgbWVudGlvbgotdGhlIHZlcnNpb24gbnVtYmVyIHlvdSBhcmUgcnVubmluZzsgdGhpcyBpcyBwcmludGVkIGJ5IHJ1bm5pbmcgYW55IG9mCi10aGUgYmludXRpbHMgd2l0aCB0aGUgLS12ZXJzaW9uIG9wdGlvbi4gIFdlIGFwcHJlY2lhdGUgcmVwb3J0cyBhYm91dAotYnVncywgYnV0IHdlIGRvIG5vdCBwcm9taXNlIHRvIGZpeCB0aGVtLgotCi1WTVMKLT09PQotCi1UaGlzIHNlY3Rpb24gd2FzIHdyaXR0ZW4gYnkgS2xhdXMgSyJhbXBmIDxra2FlbXBmQHJtaS5kZT4uICBJdAotZGVzY3JpYmVzIGhvdyB0byBidWlsZCBhbmQgaW5zdGFsbCB0aGUgYmludXRpbHMgb24gb3BlblZNUyAoQWxwaGEgYW5kCi1WYXgpLiAgKFRoZSBCRkQgbGlicmFyeSBvbmx5IHN1cHBvcnRzIHJlYWRpbmcgVmF4IG9iamVjdCBmaWxlcy4pCi0KLUNvbXBpbGluZyB0aGUgcmVsZWFzZToKLQotVG8gY29tcGlsZSB0aGUgZ251IGJpbmFyeSB1dGlsaXRpZXMgYW5kIHRoZSBnbnUgYXNzZW1ibGVyLCB5b3UnbGwKLW5lZWQgREVDIEMgb3IgR05VIEMgZm9yIG9wZW5WTVMvQWxwaGEuIFlvdSdsbCBuZWVkICpib3RoKiBjb21waWxlcnMKLW9uIG9wZW5WTVMvVmF4LgotCi1Db21waWxpbmcgd2l0aCBlaXRoZXIgREVDIEMgb3IgR05VIEMgd29ya3Mgb24gb3BlblZNUy9BbHBoYSBvbmx5LiBTb21lCi1vZiB0aGUgb3Bjb2RlcyBhbmQgYmludXRpbHMgZmlsZXMgdHJhcCBhIGJ1ZyBpbiB0aGUgREVDIEMgb3B0aW1pemVyLAotc28gdGhlc2UgZmlsZXMgbXVzdCBiZSBjb21waWxlZCB3aXRoIC9ub29wdC4KLQotQ29tcGlsaW5nIG9uIG9wZW5WTVMvVmF4IGlzIGEgYml0IGNvbXBsaWNhdGVkLCBhcyB0aGUgYmZkIGxpYnJhcnkgdHJhcHMKLWEgYnVnIGluIEdOVSBDIGFuZCB0aGUgZ251IGFzc2VtYmxlciBhIGJ1ZyBpbiAobXkgdmVyc2lvbiBvZikgREVDIEMuCi0KLUkgbmV2ZXIgdHJpZWQgY29tcGlsaW5nIHdpdGggVkFYIEMuCi0KLQotWW91IGZ1cnRoZXIgbmVlZCBHTlUgTWFrZSBWZXJzaW9uIDMuNzYgb3IgbGF0ZXIuIFRoaXMgaXMgYXZhaWxhYmxlCi1hdCBmdHAucHJvZ2lzLmRlIG9yIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiBUaGUgbWFrZWZpbGVzIGFzc3VtZSB0aGF0Ci1nbWFrZSBzdGFydHMgZ251IG1ha2UgYXMgYSBmb3JlaWduIGNvbW1hbmQuCi0KLUlmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBERUMgQyBvciBWQVggQywgeW91IG11c3QgcnVuCi0KLSAgJCBAc2V0dXAKLQotYmVmb3JlIHN0YXJ0aW5nIGdudS1tYWtlLiBUaGlzIGlzbid0IG5lZWRlZCB3aXRoIEdOVSBDLgotCi1PbiB0aGUgQWxwaGEgeW91IGNhbiBjaG9vc2UgdGhlIGNvbXBpbGVyIGJ5IGVkaXRpbmcgdGhlIHRvcGxldmVsCi1tYWtlZmlsZS52bXMuIEVpdGhlciBzZWxlY3QgQ0M9Y2MgKGZvciBERUMgQykgb3IgQ0M9Z2NjIChmb3IgR05VIEMpCi0KLQotSW5zdGFsbGluZyB0aGUgcmVsZWFzZQotCi1Qcm92aWRlZCB0aGF0IHlvdXIgZGlyZWN0b3J5IHNldHVwIGNvbmZvcm1zIHRvIHRoZSBHTlUgb24gb3BlblZNUwotc3RhbmRhcmQsIHlvdSBhbHJlYWR5IGhhdmUgYSBjb25jZWFsZWQgZGV2aWNlZCBuYW1lZCAnR05VX1JPT1QnLgotSW4gdGhpcyBjYXNlLCBhIHNpbXBsZQotCi0gJCBnbWFrZSBpbnN0YWxsCi0KLXN1ZmZpY2VzIHRvIGNvcHkgYWxsIHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgdG8gdGhlIHByb3BlciBkaXJlY3Rvcmllcy4KLQotRGVmaW5lIHRoZSBwcm9ncmFtcyBhcyBmb3JlaWduIGNvbW1hbmRzIGJ5IGFkZGluZyB0aGVzZSBsaW5lcyB0byB5b3VyCi1sb2dpbi5jb206Ci0KLSAgJCBnYXMgOj09ICRHTlVfUk9PVDpbYmluXWFzLmV4ZQotICAkIHNpemUgOj09ICRHTlVfUk9PVDpbYmluXXNpemUuZXhlCi0gICQgbm0gOj09ICRHTlVfUk9PVDpbYmluXW5tLmV4ZQotICAkIG9iamR1bXAgOj09ICRHTlVfUk9PVDpbYmluXW9iamR1bXAuZXhlCi0gICQgc3RyaW5ncyA6PT0gJEdOVV9ST09UOltiaW5dc3RyaW5ncy5leGUKLQotSWYgeW91IGhhdmUgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHNldHVwLCBjb3B5IHRoZSBiaW5hcnkgdXRpbGl0aWVzCi0oWy5iaW51dGlsc11zaXplLmV4ZSwgWy5iaW51dGlsc11ubS5leGUsIFsuYmludXRpbHNdb2JqZHVtcC5leGUsCi1hbmQgWy5iaW51dGlsc11zdHJpbmdzLmV4ZSkgYW5kIHRoZSBnbnUgYXNzZW1ibGVyIGFuZCBwcmVwcm9jZXNzb3IKLShbLmdhc11hcy5leGUgYW5kIFsuZ2FzXWdhc3AuZXhlXSkgdG8gYSBkaXJlY3Rvcnkgb2YgeW91ciBjaG9pY2UKLWFuZCBkZWZpbmUgYWxsIHByb2dyYW1zIGFzIGZvcmVpZ24gY29tbWFuZHMuCi0KLQotSWYgeW91J3JlIHNhdGllc2ZpZWQgd2l0aCB0aGUgY29tcGlsYXRpb24sIHlvdSBtYXkgd2FudCB0byByZW1vdmUKLXVubmVlZGVkIG9iamVjdHMgYW5kIGxpYnJhcmllczoKLQotICAkIGdtYWtlIGNsZWFuCi0KLQotSWYgeW91IGhhdmUgYW55IHByb2JsZW1zIG9yIHF1ZXN0aW9ucyBhYm91dCB0aGUgYmludXRpbHMgb24gVk1TLCBmZWVsCi1mcmVlIHRvIG1haWwgbWUgYXQga2thZW1wZkBybWkuZGUuCmRpZmYgLS1naXQgYS9iaW51dGlscy9hY2luY2x1ZGUubTQgYi9iaW51dGlscy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYWNpbmNsdWRlLm00CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2luY2x1ZGUoLi4vYmZkL2FjaW5jbHVkZS5tNCkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FjbG9jYWwubTQgYi9iaW51dGlscy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGExNTY1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FjbG9jYWwubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIwICswLDAgQEAKLWRubCBhY2xvY2FsLm00IGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGFjbG9jYWwgMS40Ci0KLWRubCBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLWRubCBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCi1bQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCi1bQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCi1bQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19TVUJTVChMRCkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1BQ19TVUJTVChOTSkKLV0pCi0KLSMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCi0jIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KLUFDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKLVsjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLWNoYW5nZXF1b3RlKCwpZG5sCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWNoYW5nZXF1b3RlKCwpZG5sCi1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLWNoYW5nZXF1b3RlKFssXSlkbmwKLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0JICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLUFDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKLV0pCi0KLSMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCi1BQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCi1bQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLUFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLV0pCi0KLSMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KLUFDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCi1bYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi1dKQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWwotQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKLUFDX0NIRUNLX0xJQihtLCBjb3MpCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKLSAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KLSAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7Ci0gICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OwotICAgIGVzYWMKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0KLWRubCBBTV9QUk9HX0xFWAotZG5sIExvb2sgZm9yIGZsZXgsIGxleCBvciBtaXNzaW5nLCB0aGVuIHJ1biBBQ19QUk9HX0xFWCBhbmQgQUNfREVDTF9ZWVRFWFQKLUFDX0RFRlVOKEFNX1BST0dfTEVYLAotW21pc3NpbmdfZGlyPWlmZWxzZShbJDFdLCxgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYCwkMSkKLUFDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsICIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IikKLUFDX1BST0dfTEVYCi1BQ19ERUNMX1lZVEVYVF0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYWRkcjJsaW5lLjEgYi9iaW51dGlscy9hZGRyMmxpbmUuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZTEwMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hZGRyMmxpbmUuMQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGFkZHIybGluZSAxICIyNyBNYXJjaCAxOTk3IiAiQ3lnbnVzIFNvbHV0aW9ucyIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1hZGRyMmxpbmUgXC0gY29udmVydCBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lIG51bWJlcnMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIGFkZHIybGluZQotLlJCICJbXHwiICJcLWJcICJcYwotLkkgYmZkbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC10YXJnZXQ9IlxjCi0uSSBiZmRuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1DIHwgXC1cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgIlwtZVwgIlxjCi0uSSBmaWxlbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC1leGU9IlxjCi0uSSBmaWxlbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiIFwtZiB8IFwtXC1mdW5jdGlvbnMgIlx8XSIKLS5SQiAiW1x8IiBcLXMgfCBcLVwtYmFzZW5hbWVzICJcfF0iCi0uUkIgIltcfCIgXC1IIHwgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLVYgfCBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIGFkZHIgYWRkciAuLi4gICJcfF0iCi0uYWQgYgotLmh5IDEKLS5TSCBERVNDUklQVElPTgotXGMKLS5CIGFkZHIybGluZQotdHJhbnNsYXRlcyBwcm9ncmFtIGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycy4gIEdpdmVuCi1hbiBhZGRyZXNzIGFuZCBhbiBleGVjdXRhYmxlLCBpdCB1c2VzIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlCi1leGVjdXRhYmxlIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBhcmUKLWFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGFkZHJlc3MuCi0KLVRoZSBleGVjdXRhYmxlIHRvIHVzZSBpcyBzcGVjaWZpZWQgd2l0aCB0aGUKLS5CIFwtZQotb3B0aW9uLiAgVGhlIGRlZmF1bHQgaXMKLS5CIGEub3V0XGMKLVwmLgotCi0uQiBhZGRyMmxpbmUKLWhhcyB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uLgotCi1JbiB0aGUgZmlyc3QsIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCi1hbmQKLS5CIGFkZHIybGluZQotZGlzcGxheXMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2ggYWRkcmVzcy4KLQotSW4gdGhlIHNlY29uZCwKLS5CIGFkZHIybGluZQotcmVhZHMgaGV4YWRlY2ltYWwgYWRkcmVzc2VzIGZyb20gc3RhbmRhcmQgaW5wdXQsIGFuZCBwcmludHMgdGhlIGZpbGUKLW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBlYWNoIGFkZHJlc3Mgb24gc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcwotbW9kZSwKLS5CIGFkZHIybGluZQotbWF5IGJlIHVzZWQgaW4gYSBwaXBlIHRvIGNvbnZlcnQgZHluYW1pY2FsbHkgY2hvc2VuIGFkZHJlc3Nlcy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGlzIEZJTEVOQU1FOkxJTkVOTy4gIFRoZSBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBmb3IgZWFjaCBhZGRyZXNzIGlzIHByaW50ZWQgb24gYSBzZXBhcmF0ZSBsaW5lLiAgSWYgdGhlCi0uQiBcLWYKLW9wdGlvbiBpcyB1c2VkLCB0aGVuIGVhY2ggRklMRU5BTUU6TElORU5PIGxpbmUgaXMgcHJlY2VkZWQgYnkgYQotRlVOQ1RJT05OQU1FIGxpbmUgd2hpY2ggaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlCi1hZGRyZXNzLgotCi1JZiB0aGUgZmlsZSBuYW1lIG9yIGZ1bmN0aW9uIG5hbWUgY2FuIG5vdCBiZSBkZXRlcm1pbmVkLAotLkIgYWRkcjJsaW5lCi13aWxsIHByaW50IHR3byBxdWVzdGlvbiBtYXJrcyBpbiB0aGVpciBwbGFjZS4gIElmIHRoZSBsaW5lIG51bWJlciBjYW4KLW5vdCBiZSBkZXRlcm1pbmVkLAotLkIgYWRkcjJsaW5lCi13aWxsIHByaW50IDAuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CSSAiXC1iICIgImJmZG5hbWUiXGMKLS5UUAotLkJJICJcLVwtdGFyZ2V0PSIgImJmZG5hbWUiCi1TcGVjaWZ5IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUKLVxjCi0uSSBiZmRuYW1lXGMKLVwmLgotCi0uVFAKLS5CIFwtQwotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLURlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCi0KLS5UUAotLkJJICJcLWUgIiAiZmlsZW5hbWUiXGMKLS5UUAotLkJJICJcLVwtZXhlPSIgImZpbGVuYW1lIgotU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBmb3Igd2hpY2ggYWRkcmVzc2VzIHNob3VsZCBiZQotdHJhbnNsYXRlZC4gIFRoZSBkZWZhdWx0IGZpbGUgaXMKLS5CIGEub3V0XGMKLVwmLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtZnVuY3Rpb25zCi1EaXNwbGF5IGZ1bmN0aW9uIG5hbWVzIGFzIHdlbGwgYXMgZmlsZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1iYXNlbmFtZXMKLURpc3BsYXkgb25seSB0aGUgYmFzZSBvZiBlYWNoIGZpbGUgbmFtZS4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCmRpZmYgLS1naXQgYS9iaW51dGlscy9hZGRyMmxpbmUuYyBiL2JpbnV0aWxzL2FkZHIybGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2VlODY3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FkZHIybGluZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qIGFkZHIybGluZS5jIC0tIGNvbnZlcnQgYWRkcmVzc2VzIHRvIGxpbmUgbnVtYmVyIGFuZCBmdW5jdGlvbiBuYW1lCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBMYXV0aGVyIDxVbHJpY2guTGF1dGhlckB6ZmUuc2llbWVucy5kZT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBEZXJpdmVkIGZyb20gb2JqZHVtcC5jIGFuZCBubS5jIGJ5IFVscmljaC5MYXV0aGVyQHpmZS5zaWVtZW5zLmRlCi0KLSAgIFVzYWdlOiAKLSAgIGFkZHIybGluZSBbb3B0aW9uc10gYWRkciBhZGRyIC4uLgotICAgb3IKLSAgIGFkZHIybGluZSBbb3B0aW9uc10gCi0KLSAgIGJvdGggZm9ybXMgd3JpdGUgcmVzdWx0cyB0byBzdGRvdXQsIHRoZSBzZWNvbmQgZm9ybSByZWFkcyBhZGRyZXNzZXMKLSAgIHRvIGJlIGNvbnZlcnRlZCBmcm9tIHN0ZGluLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV92ZXJzaW9uOwotCi1zdGF0aWMgYm9vbGVhbiB3aXRoX2Z1bmN0aW9uczsJLyogLWYsIHNob3cgZnVuY3Rpb24gbmFtZXMuICAqLwotc3RhdGljIGJvb2xlYW4gZG9fZGVtYW5nbGU7CS8qIC1DLCBkZW1hbmdsZSBuYW1lcy4gICovCi1zdGF0aWMgYm9vbGVhbiBiYXNlX25hbWVzOwkvKiAtcywgc3RyaXAgZGlyZWN0b3J5IG5hbWVzLiAgKi8KLQotc3RhdGljIGludCBuYWRkcjsJCS8qIE51bWJlciBvZiBhZGRyZXNzZXMgdG8gcHJvY2Vzcy4gICovCi1zdGF0aWMgY2hhciAqKmFkZHI7CQkvKiBIZXggYWRkcmVzc2VzIHRvIHByb2Nlc3MuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXM7CQkvKiBTeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiYmFzZW5hbWVzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ0MnfSwKLSAgeyJleGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2UnfSwKLSAgeyJmdW5jdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2InfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdIJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgc2x1cnBfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBmaW5kX2FkZHJlc3NfaW5fc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCB0cmFuc2xhdGVfYWRkcmVzc2VzIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQwKLS8qIFByaW50IGEgdXNhZ2UgbWVzc2FnZSB0byBTVFJFQU0gYW5kIGV4aXQgd2l0aCBTVEFUVVMuICAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstQ2ZzSFZdIFstYiBiZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuXAotICAgICAgIFstLWJhc2VuYW1lc10gWy0tZnVuY3Rpb25zXSBbYWRkciBhZGRyIC4uLl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0MCi0vKiBSZWFkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotc2x1cnBfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgbG9uZyBzeW1jb3VudDsKLQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBIQVNfU1lNUykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc3RvcmFnZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0KLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0gIGlmIChzeW1jb3VudCA8IDApCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0MCi0vKiBUaGVzZSBnbG9iYWwgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmV0d2VlbgotICAgdHJhbnNsYXRlX2FkZHJlc3NlcyBhbmQgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24uICAqLwotCi1zdGF0aWMgYmZkX3ZtYSBwYzsKLXN0YXRpYyBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXN0YXRpYyBjb25zdCBjaGFyICpmdW5jdGlvbm5hbWU7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGxpbmU7Ci1zdGF0aWMgYm9vbGVhbiBmb3VuZDsKLQotLyogTG9vayBmb3IgYW4gYWRkcmVzcyBpbiBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCB2aWEKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1maW5kX2FkZHJlc3NfaW5fc2VjdGlvbiAoYWJmZCwgc2VjdGlvbiwgZGF0YSkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHJldHVybjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjdGlvbikgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHZtYSA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pOwotICBpZiAocGMgPCB2bWEpCi0gICAgcmV0dXJuOwotCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOwotICBpZiAocGMgPj0gdm1hICsgc2l6ZSkKLSAgICByZXR1cm47Ci0KLSAgZm91bmQgPSBiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIHNlY3Rpb24sIHN5bXMsIHBjIC0gdm1hLAotCQkJCSAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKTsKLX0KLQotLyogUmVhZCBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbSBzdGRpbiwgdHJhbnNsYXRlIGludG8KLSAgIGZpbGVfbmFtZTpsaW5lX251bWJlciBhbmQgb3B0aW9uYWxseSBmdW5jdGlvbiBuYW1lLiAgKi8KLQotc3RhdGljIHZvaWQKLXRyYW5zbGF0ZV9hZGRyZXNzZXMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IHJlYWRfc3RkaW4gPSAobmFkZHIgPT0gMCk7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBpZiAocmVhZF9zdGRpbikKLQl7Ci0JICBjaGFyIGFkZHJfaGV4WzEwMF07Ci0KLQkgIGlmIChmZ2V0cyAoYWRkcl9oZXgsIHNpemVvZiBhZGRyX2hleCwgc3RkaW4pID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgcGMgPSBiZmRfc2Nhbl92bWEgKGFkZHJfaGV4LCBOVUxMLCAxNik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChuYWRkciA8PSAwKQotCSAgICBicmVhazsKLQkgIC0tbmFkZHI7Ci0JICBwYyA9IGJmZF9zY2FuX3ZtYSAoKmFkZHIrKywgTlVMTCwgMTYpOwotCX0KLQotICAgICAgZm91bmQgPSBmYWxzZTsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZmluZF9hZGRyZXNzX2luX3NlY3Rpb24sIChQVFIpIE5VTEwpOwotCi0gICAgICBpZiAoISBmb3VuZCkKLQl7Ci0JICBpZiAod2l0aF9mdW5jdGlvbnMpCi0JICAgIHByaW50ZiAoIj8/XG4iKTsKLQkgIHByaW50ZiAoIj8/OjBcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAod2l0aF9mdW5jdGlvbnMpCi0JICAgIHsKLQkgICAgICBpZiAoZnVuY3Rpb25uYW1lID09IE5VTEwgfHwgKmZ1bmN0aW9ubmFtZSA9PSAnXDAnKQotCQlwcmludGYgKCI/P1xuIik7Ci0JICAgICAgZWxzZSBpZiAoISBkb19kZW1hbmdsZSkKLQkJcHJpbnRmICgiJXNcbiIsIGZ1bmN0aW9ubmFtZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqcmVzOwotCi0JCSAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKGZ1bmN0aW9ubmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotCQkgIGlmIChyZXMgPT0gTlVMTCkKLQkJICAgIHByaW50ZiAoIiVzXG4iLCBmdW5jdGlvbm5hbWUpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiJXNcbiIsIHJlcyk7Ci0JCSAgICAgIGZyZWUgKHJlcyk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoYmFzZV9uYW1lcyAmJiBmaWxlbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqaDsKLQotCSAgICAgIGggPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkgICAgICBpZiAoaCAhPSBOVUxMKQotCQlmaWxlbmFtZSA9IGggKyAxOwotCSAgICB9Ci0KLQkgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA/IGZpbGVuYW1lIDogIj8/IiwgbGluZSk7Ci0JfQotCi0gICAgICAvKiBmZmx1c2goKSBpcyBlc3NlbnRpYWwgZm9yIHVzaW5nIHRoaXMgY29tbWFuZCBhcyBhIHNlcnZlcgotICAgICAgICAgY2hpbGQgcHJvY2VzcyB0aGF0IHJlYWRzIGFkZHJlc3NlcyBmcm9tIGEgcGlwZSBhbmQgcmVzcG9uZHMKLSAgICAgICAgIHdpdGggbGluZSBudW1iZXIgaW5mb3JtYXRpb24sIHByb2Nlc3Npbmcgb25lIGFkZHJlc3MgYXQgYQotICAgICAgICAgdGltZS4gICovCi0gICAgICBmZmx1c2ggKHN0ZG91dCk7Ci0gICAgfQotfQotCi0vKiBQcm9jZXNzIGEgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2ZpbGUgKGZpbGVuYW1lLCB0YXJnZXQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGJmZCAqYWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgZmF0YWwgKF8oIiVzOiBjYW4gbm90IGdldCBhZGRyZXNzZXMgZnJvbSBhcmNoaXZlIiksIGZpbGVuYW1lKTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotCSAgZnJlZSAobWF0Y2hpbmcpOwotCX0KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2x1cnBfc3ltdGFiIChhYmZkKTsKLQotICB0cmFuc2xhdGVfYWRkcmVzc2VzIChhYmZkKTsKLQotICBpZiAoc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHN5bXMpOwotICAgICAgc3ltcyA9IE5VTEw7Ci0gICAgfQotCi0gIGJmZF9jbG9zZSAoYWJmZCk7Ci19Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnRhcmdldDsKLSAgaW50IGM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIGZpbGVuYW1lID0gTlVMTDsKLSAgdGFyZ2V0ID0gTlVMTDsKLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOkNlOnNmSFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIGJyZWFrOwkJLyogd2UndmUgYmVlbiBnaXZlbiBhIGxvbmcgb3B0aW9uICovCi0JY2FzZSAnYic6Ci0JICB0YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdDJzoKLQkgIGRvX2RlbWFuZ2xlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGJhc2VfbmFtZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICB3aXRoX2Z1bmN0aW9ucyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIHByaW50X3ZlcnNpb24gKCJhZGRyMmxpbmUiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotICAgIGZpbGVuYW1lID0gImEub3V0IjsKLQotICBhZGRyID0gYXJndiArIG9wdGluZDsKLSAgbmFkZHIgPSBhcmdjIC0gb3B0aW5kOwotCi0gIHByb2Nlc3NfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hci4xIGIvYmludXRpbHMvYXIuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlOGNmZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hci4xCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBhciAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1hciBcLSBjcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQlIgYXIgIiBbXHwiICItIiAiXHxdIlxjCi0uSSB7ZG1wcXJ0eH1bYWJjaWxvc1N1dlZdIFxjCi1bXHxcYwotLkkgbWVtYmVybmFtZVxjCi1cJlx8XSBcYwotLkkgYXJjaGl2ZVxjCi1cJiBcYwotLkkgZmlsZXNcYwotXCYuXHwuXHwuCi0KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIFxjCi0uQiBhclxjCi1cJiBwcm9ncmFtIGNyZWF0ZXMsIG1vZGlmaWVzLCBhbmQgZXh0cmFjdHMgZnJvbQotYXJjaGl2ZXMuICBBbiBcYwotLkkgYXJjaGl2ZVxjCi1cJiBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIFxjCi0uSSBtZW1iZXJzXGMKLVwmIG9mIHRoZSBhcmNoaXZlKS4KLQotVGhlIG9yaWdpbmFsIGZpbGVzJyBjb250ZW50cywgbW9kZSAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBhbmQKLWdyb3VwIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIGFyY2hpdmUsIGFuZCBtYXkgYmUgcmVjb25zdGl0dXRlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1HTlUgXGMKLS5CIGFyXGMKLVwmIGNhbiBtYWludGFpbiBhcmNoaXZlcyB3aG9zZSBtZW1iZXJzIGhhdmUgbmFtZXMgb2YgYW55Ci1sZW5ndGg7IGhvd2V2ZXIsIGRlcGVuZGluZyBvbiBob3cgXGMKLS5CIGFyXGMKLVwmIGlzIGNvbmZpZ3VyZWQgb24geW91cgotc3lzdGVtLCBhIGxpbWl0IG9uIG1lbWJlci1uYW1lIGxlbmd0aCBtYXkgYmUgaW1wb3NlZCAoZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggYXJjaGl2ZSBmb3JtYXRzIG1haW50YWluZWQgd2l0aCBvdGhlciB0b29scykuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotXGMKLS5CIGFyXGMKLVwmIGlzIGNvbnNpZGVyZWQgYSBiaW5hcnkgdXRpbGl0eSBiZWNhdXNlIGFyY2hpdmVzIG9mIHRoaXMgc29ydAotYXJlIG1vc3Qgb2Z0ZW4gdXNlZCBhcyBcYwotLkkgbGlicmFyaWVzXGMKLVwmIGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotXGMKLS5CIGFyXGMKLVwmIHdpbGwgY3JlYXRlIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIGBcfFxjCi0uQiBzXGMKLVx8Jy4KLU9uY2UgY3JlYXRlZCwgdGhpcyBpbmRleCBpcyB1cGRhdGVkIGluIHRoZSBhcmNoaXZlIHdoZW5ldmVyIFxjCi0uQiBhclxjCi1cJgotbWFrZXMgYSBjaGFuZ2UgdG8gaXRzIGNvbnRlbnRzIChzYXZlIGZvciB0aGUgYFx8XGMKLS5CIHFcYwotXHwnIHVwZGF0ZSBvcGVyYXRpb24pLgotQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnksIGFuZAotYWxsb3dzIHJvdXRpbmVzIGluIHRoZSBsaWJyYXJ5IHRvIGNhbGwgZWFjaCBvdGhlciB3aXRob3V0IHJlZ2FyZCB0bwotdGhlaXIgcGxhY2VtZW50IGluIHRoZSBhcmNoaXZlLgotCi1Zb3UgbWF5IHVzZSBgXHxcYwotLkIgbm0gXC1zXGMKLVx8JyBvciBgXHxcYwotLkIgbm0gXC1cLXByaW50XC1hcm1hcFxjCi1cfCcgdG8gbGlzdCB0aGlzIGluZGV4Ci10YWJsZS4gIElmIGFuIGFyY2hpdmUgbGFja3MgdGhlIHRhYmxlLCBhbm90aGVyIGZvcm0gb2YgXGMKLS5CIGFyXGMKLVwmIGNhbGxlZAotXGMKLS5CIHJhbmxpYlxjCi1cJiBjYW4gYmUgdXNlZCB0byBhZGQganVzdCB0aGUgdGFibGUuCi0KLVxjCi0uQiBhclxjCi1cJiBpbnNpc3RzIG9uIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgdG8gZXhlY3V0ZTogb25lCi1rZXlsZXR0ZXIgc3BlY2lmeWluZyB0aGUgXGMKLS5JIG9wZXJhdGlvblxjCi1cJiAob3B0aW9uYWxseSBhY2NvbXBhbmllZCBieSBvdGhlcgota2V5bGV0dGVycyBzcGVjaWZ5aW5nIFxjCi0uSSBtb2RpZmllcnNcYwotXCYpLCBhbmQgdGhlIGFyY2hpdmUgbmFtZSB0byBhY3Qgb24uCi0KLU1vc3Qgb3BlcmF0aW9ucyBjYW4gYWxzbyBhY2NlcHQgZnVydGhlciBcYwotLkkgZmlsZXNcYwotXCYgYXJndW1lbnRzLAotc3BlY2lmeWluZyBwYXJ0aWN1bGFyIGZpbGVzIHRvIG9wZXJhdGUgb24uCi0KLS5TSCBPUFRJT05TCi1HTlUgXGMKLS5CIGFyXGMKLVwmIGFsbG93cyB5b3UgdG8gbWl4IHRoZSBvcGVyYXRpb24gY29kZSBcYwotLkkgcFxjCi1cJiBhbmQgbW9kaWZpZXIKLWZsYWdzIFxjCi0uSSBtb2RcYwotXCYgaW4gYW55IG9yZGVyLCB3aXRoaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudC4KLQotSWYgeW91IHdpc2gsIHlvdSBtYXkgYmVnaW4gdGhlIGZpcnN0IGNvbW1hbmQtbGluZSBhcmd1bWVudCB3aXRoIGEKLWRhc2guCi0KLVRoZSBcYwotLkkgcFxjCi1cJiBrZXlsZXR0ZXIgc3BlY2lmaWVzIHdoYXQgb3BlcmF0aW9uIHRvIGV4ZWN1dGU7IGl0IG1heSBiZQotYW55IG9mIHRoZSBmb2xsb3dpbmcsIGJ1dCB5b3UgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZW06Ci0KLS5UUAotLkIgZAotXGMKLS5JIERlbGV0ZVxjCi1cJiBtb2R1bGVzIGZyb20gdGhlIGFyY2hpdmUuICBTcGVjaWZ5IHRoZSBuYW1lcyBvZiBtb2R1bGVzIHRvCi1iZSBkZWxldGVkIGFzIFxjCi0uSSBmaWxlc1xjCi1cJjsgdGhlIGFyY2hpdmUgaXMgdW50b3VjaGVkIGlmIHlvdQotc3BlY2lmeSBubyBmaWxlcyB0byBkZWxldGUuCi0KLUlmIHlvdSBzcGVjaWZ5IHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIsIFxjCi0uQiBhclxjCi1cJiB3aWxsIGxpc3QgZWFjaCBtb2R1bGUKLWFzIGl0IGlzIGRlbGV0ZWQuCi0KLS5UUAotLkIgbQotVXNlIHRoaXMgb3BlcmF0aW9uIHRvIFxjCi0uSSBtb3ZlXGMKLVwmIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZS4KLQotVGhlIG9yZGVyaW5nIG9mIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZSBjYW4gbWFrZSBhIGRpZmZlcmVuY2UgaW4gaG93Ci1wcm9ncmFtcyBhcmUgbGlua2VkIHVzaW5nIHRoZSBsaWJyYXJ5LCBpZiBhIHN5bWJvbCBpcyBkZWZpbmVkIGluIG1vcmUKLXRoYW4gb25lIG1lbWJlci4gIAotCi1JZiBubyBtb2RpZmllcnMgYXJlIHVzZWQgd2l0aCBcYwotLkIgbVxjCi1cJiwgYW55IG1lbWJlcnMgeW91IG5hbWUgaW4gdGhlCi1cYwotLkkgZmlsZXNcYwotXCYgYXJndW1lbnRzIGFyZSBtb3ZlZCB0byB0aGUgXGMKLS5JIGVuZFxjCi1cJiBvZiB0aGUgYXJjaGl2ZTsKLXlvdSBjYW4gdXNlIHRoZSBgXHxcYwotLkIgYVxjCi1cfCcsIGBcfFxjCi0uQiBiXGMKLVx8Jywgb3IgYFx8XGMKLS5CIGlcYwotXHwnIG1vZGlmaWVycyB0byBtb3ZlIHRoZW0gdG8gYQotc3BlY2lmaWVkIHBsYWNlIGluc3RlYWQuCi0KLS5UUAotLkIgcAotXGMKLS5JIFByaW50XGMKLVwmIHRoZSBzcGVjaWZpZWQgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSwgdG8gdGhlIHN0YW5kYXJkCi1vdXRwdXQgZmlsZS4gIElmIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIgaXMgc3BlY2lmaWVkLCBzaG93IHRoZSBtZW1iZXIKLW5hbWUgYmVmb3JlIGNvcHlpbmcgaXRzIGNvbnRlbnRzIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotSWYgeW91IHNwZWNpZnkgbm8gXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgdGhlIGZpbGVzIGluIHRoZSBhcmNoaXZlIGFyZSBwcmludGVkLgotCi0uVFAKLS5CIHEKLVxjCi0uSSBRdWljayBhcHBlbmRcYwotXCY7IGFkZCBcYwotLkkgZmlsZXNcYwotXCYgdG8gdGhlIGVuZCBvZiBcYwotLkkgYXJjaGl2ZVxjCi1cJiwKLXdpdGhvdXQgY2hlY2tpbmcgZm9yIHJlcGxhY2VtZW50LiAgCi0KLVRoZSBtb2RpZmllcnMgYFx8XGMKLS5CIGFcYwotXHwnLCBgXHxcYwotLkIgYlxjCi1cfCcsIGFuZCBgXHxcYwotLkIgaVxjCi1cfCcgZG8gXGMKLS5JIG5vdFxjCi1cJiBhZmZlY3QgdGhpcwotb3BlcmF0aW9uOyBuZXcgbWVtYmVycyBhcmUgYWx3YXlzIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLgotCi1UaGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIG1ha2VzIFxjCi0uQiBhclxjCi1cJiBsaXN0IGVhY2ggZmlsZSBhcyBpdCBpcyBhcHBlbmRlZC4KLQotU2luY2UgdGhlIHBvaW50IG9mIHRoaXMgb3BlcmF0aW9uIGlzIHNwZWVkLCB0aGUgYXJjaGl2ZSdzIHN5bWJvbCB0YWJsZQotaW5kZXggaXMgbm90IHVwZGF0ZWQsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdGVkOyB5b3UgY2FuIHVzZSBgXHxcYwotLkIgYXIgc1xjCi1cfCcgb3IKLVxjCi0uQiByYW5saWJcYwotXCYgZXhwbGljaXRseSB0byB1cGRhdGUgdGhlIHN5bWJvbCB0YWJsZSBpbmRleC4KLQotSG93ZXZlciwgdG9vIG1hbnkgZGlmZmVyZW50IHN5c3RlbXMgYXNzdW1lIHF1aWNrIGFwcGVuZCByZWJ1aWxkcyB0aGUKLWluZGV4LCBzbyBHTlUKLS5CIGFyCi1pbXBsZW1lbnRzIGBcfFxjCi0uQiBxXGMKLVx8JyBhcyBhIHN5bm9ueW0gZm9yIGBcfFxjCi0uQiByXGMKLVx8Jy4KLQotLlRQCi0uQiByCi1JbnNlcnQgXGMKLS5JIGZpbGVzXGMKLVwmIGludG8gXGMKLS5JIGFyY2hpdmVcYwotXCYgKHdpdGggXGMKLS5JIHJlcGxhY2VtZW50XGMKLVwmKS4gVGhpcwotb3BlcmF0aW9uIGRpZmZlcnMgZnJvbSBgXHxcYwotLkIgcVxjCi1cfCcgaW4gdGhhdCBhbnkgcHJldmlvdXNseSBleGlzdGluZyBtZW1iZXJzCi1hcmUgZGVsZXRlZCBpZiB0aGVpciBuYW1lcyBtYXRjaCB0aG9zZSBiZWluZyBhZGRlZC4KLQotSWYgb25lIG9mIHRoZSBmaWxlcyBuYW1lZCBpbiBcYwotLkkgZmlsZXNcYwotXCYgZG9lc24ndCBleGlzdCwgXGMKLS5CIGFyXGMKLVwmCi1kaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlLCBhbmQgbGVhdmVzIHVuZGlzdHVyYmVkIGFueSBleGlzdGluZyBtZW1iZXJzCi1vZiB0aGUgYXJjaGl2ZSBtYXRjaGluZyB0aGF0IG5hbWUuCi0KLUJ5IGRlZmF1bHQsIG5ldyBtZW1iZXJzIGFyZSBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOyBidXQgeW91IG1heQotdXNlIG9uZSBvZiB0aGUgbW9kaWZpZXJzIGBcfFxjCi0uQiBhXGMKLVx8JywgYFx8XGMKLS5CIGJcYwotXHwnLCBvciBgXHxcYwotLkIgaVxjCi1cfCcgdG8gcmVxdWVzdAotcGxhY2VtZW50IHJlbGF0aXZlIHRvIHNvbWUgZXhpc3RpbmcgbWVtYmVyLgotCi1UaGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIHVzZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBlbGljaXRzIGEgbGluZSBvZgotb3V0cHV0IGZvciBlYWNoIGZpbGUgaW5zZXJ0ZWQsIGFsb25nIHdpdGggb25lIG9mIHRoZSBsZXR0ZXJzIGBcfFxjCi0uQiBhXGMKLVx8JyBvcgotYFx8XGMKLS5CIHJcYwotXHwnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZpbGUgd2FzIGFwcGVuZGVkIChubyBvbGQgbWVtYmVyCi1kZWxldGVkKSBvciByZXBsYWNlZC4KLQotLlRQCi0uQiB0Ci1EaXNwbGF5IGEgXGMKLS5JIHRhYmxlXGMKLVwmIGxpc3RpbmcgdGhlIGNvbnRlbnRzIG9mIFxjCi0uSSBhcmNoaXZlXGMKLVwmLCBvciB0aG9zZQotb2YgdGhlIGZpbGVzIGxpc3RlZCBpbiBcYwotLkkgZmlsZXNcYwotXCYgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUKLWFyY2hpdmUuICBOb3JtYWxseSBvbmx5IHRoZSBtZW1iZXIgbmFtZSBpcyBzaG93bjsgaWYgeW91IGFsc28gd2FudCB0bwotc2VlIHRoZSBtb2RlcyAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLCBncm91cCwgYW5kIHNpemUsIHlvdSBjYW4KLXJlcXVlc3QgdGhhdCBieSBhbHNvIHNwZWNpZnlpbmcgdGhlIGBcfFxjCi0uQiB2XGMKLVx8JyBtb2RpZmllci4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBcYwotLkkgZmlsZXNcYwotXCYsIGFsbCBmaWxlcyBpbiB0aGUgYXJjaGl2ZQotYXJlIGxpc3RlZC4KLQotSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAoc2F5LCBgXHxcYwotLkIgZmllXGMKLVx8JykgaW4KLWFuIGFyY2hpdmUgKHNheSBgXHxcYwotLkIgYi5hXGMKLVx8JyksIGBcfFxjCi0uQiBhciB0IGIuYSBmaWVcYwotXHwnIHdpbGwgbGlzdCBvbmx5IHRoZQotZmlyc3QgaW5zdGFuY2U7IHRvIHNlZSB0aGVtIGFsbCwgeW91IG11c3QgYXNrIGZvciBhIGNvbXBsZXRlCi1saXN0aW5nXChlbVwmaW4gb3VyIGV4YW1wbGUsIGBcfFxjCi0uQiBhciB0IGIuYVxjCi1cfCcuCi0KLS5UUAotLkIgeAotXGMKLS5JIEV4dHJhY3RcYwotXCYgbWVtYmVycyAobmFtZWQgXGMKLS5JIGZpbGVzXGMKLVwmKSBmcm9tIHRoZSBhcmNoaXZlLiAgWW91IGNhbgotdXNlIHRoZSBgXHxcYwotLkIgdlxjCi1cfCcgbW9kaWZpZXIgd2l0aCB0aGlzIG9wZXJhdGlvbiwgdG8gcmVxdWVzdCB0aGF0Ci1cYwotLkIgYXJcYwotXCYgbGlzdCBlYWNoIG5hbWUgYXMgaXQgZXh0cmFjdHMgaXQuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhbnkgXGMKLS5JIGZpbGVzXGMKLVwmLCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBleHRyYWN0ZWQuCi0KLS5QUAotCi1BIG51bWJlciBvZiBtb2RpZmllcnMgKFxjCi0uSSBtb2RcYwotXCYpIG1heSBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIFxjCi0uSSBwXGMKLVwmCi1rZXlsZXR0ZXIsIHRvIHNwZWNpZnkgdmFyaWF0aW9ucyBvbiBhbiBvcGVyYXRpb24ncyBiZWhhdmlvcjoKLQotLlRQCi0uQiBhCi1BZGQgbmV3IGZpbGVzIFxjCi0uSSBhZnRlclxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGFcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLgotCi0uVFAKLS5CIGIKLUFkZCBuZXcgZmlsZXMgXGMKLS5JIGJlZm9yZVxjCi1cJiBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgXGMKLS5CIGJcYwotXCYsIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIFxjCi0uSSBtZW1iZXJuYW1lXGMKLVwmIGFyZ3VtZW50LCBiZWZvcmUgdGhlCi1cYwotLkkgYXJjaGl2ZVxjCi1cJiBzcGVjaWZpY2F0aW9uLiAgKHNhbWUgYXMgYFx8XGMKLS5CIGlcYwotXHwnKS4KLQotLlRQCi0uQiBjCi1cYwotLkkgQ3JlYXRlXGMKLVwmIHRoZSBhcmNoaXZlLiAgVGhlIHNwZWNpZmllZCBcYwotLkkgYXJjaGl2ZVxjCi1cJiBpcyBhbHdheXMKLWNyZWF0ZWQgaWYgaXQgZGlkbid0IGV4aXN0LCB3aGVuIHlvdSByZXF1ZXN0IGFuIHVwZGF0ZS4gIEJ1dCBhIHdhcm5pbmcgaXMKLWlzc3VlZCB1bmxlc3MgeW91IHNwZWNpZnkgaW4gYWR2YW5jZSB0aGF0IHlvdSBleHBlY3QgdG8gY3JlYXRlIGl0LCBieQotdXNpbmcgdGhpcyBtb2RpZmllci4KLQotLlRQCi0uQiBmCi1UcnVuY2F0ZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4gIAotLkIgYXIKLXdpbGwgbm9ybWFsbHkgcGVybWl0IGZpbGUgbmFtZXMgb2YgYW55IGxlbmd0aC4gIFRoaXMgd2lsbCBjYXVzZSBpdCB0bwotY3JlYXRlIGFyY2hpdmVzIHdoaWNoIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBuYXRpdmUgCi0uQiBhcgotcHJvZ3JhbSBvbiBzb21lIHN5c3RlbXMuICBJZiB0aGlzIGlzIGEgY29uY2VybiwgdGhlIAotLkIgZgotbW9kaWZpZXIgbWF5IGJlIHVzZWQgdG8gdHJ1bmNhdGUgZmlsZSBuYW1lcyB3aGVuIHB1dHRpbmcgdGhlbSBpbiB0aGUKLWFyY2hpdmUuCi0KLS5UUAotLkIgaQotSW5zZXJ0IG5ldyBmaWxlcyBcYwotLkkgYmVmb3JlXGMKLVwmIGFuIGV4aXN0aW5nIG1lbWJlciBvZiB0aGUKLWFyY2hpdmUuICBJZiB5b3UgdXNlIHRoZSBtb2RpZmllciBcYwotLkIgaVxjCi1cJiwgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZQotbWVtYmVyIG11c3QgYmUgcHJlc2VudCBhcyB0aGUgXGMKLS5JIG1lbWJlcm5hbWVcYwotXCYgYXJndW1lbnQsIGJlZm9yZSB0aGUKLVxjCi0uSSBhcmNoaXZlXGMKLVwmIHNwZWNpZmljYXRpb24uICAoc2FtZSBhcyBgXHxcYwotLkIgYlxjCi1cfCcpLgotCi0uVFAKLS5CIGwKLVRoaXMgbW9kaWZpZXIgaXMgYWNjZXB0ZWQgYnV0IG5vdCB1c2VkLgotCi0uVFAKLS5CIG8KLVByZXNlcnZlIHRoZSBcYwotLkkgb3JpZ2luYWxcYwotXCYgZGF0ZXMgb2YgbWVtYmVycyB3aGVuIGV4dHJhY3RpbmcgdGhlbS4gIElmCi15b3UgZG8gbm90IHNwZWNpZnkgdGhpcyBtb2RpZmllciwgZmlsZXMgZXh0cmFjdGVkIGZyb20gdGhlIGFyY2hpdmUKLXdpbGwgYmUgc3RhbXBlZCB3aXRoIHRoZSB0aW1lIG9mIGV4dHJhY3Rpb24uCi0KLS5UUAotLkIgcwotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBgXHxcYwotLkIgYXIgc1xjCi1cfCcgb24gYW4KLWFyY2hpdmUgaXMgZXF1aXZhbGVudCB0byBydW5uaW5nIGBcfFxjCi0uQiByYW5saWJcYwotXHwnIG9uIGl0LgotCi0uVFAKLS5CIFMKLURvIG5vdCBnZW5lcmF0ZSBhbiBhcmNoaXZlIHN5bWJvbCB0YWJsZS4gIFRoaXMgY2FuIHNwZWVkIHVwIGJ1aWxkaW5nIGEKLWxhcmdlIGxpYnJhcnkgaW4gc2V2ZXJhbCBzdGVwcy4gIFRoZSByZXN1bHRpbmcgYXJjaGl2ZSBjYW4gbm90IGJlIHVzZWQKLXdpdGggdGhlIGxpbmtlci4gIEluIG9yZGVyIHRvIGJ1aWxkIGEgc3ltYm9sIHRhYmxlLCB5b3UgbXVzdCBvbWl0IHRoZQotYFx8XGMKLS5CIFNcYwotXHwnIG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBgXHxcYwotLkIgYXJcYwotXHwnLCBvciB5b3UgbXVzdCBydW4gYFx8XGMKLS5CIHJhbmxpYlxjCi1cfCcgb24gdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgdQotTm9ybWFsbHksIFxjCi0uQiBhciByXGMKLVwmLlx8Llx8LiBpbnNlcnRzIGFsbCBmaWxlcwotbGlzdGVkIGludG8gdGhlIGFyY2hpdmUuICBJZiB5b3Ugd291bGQgbGlrZSB0byBpbnNlcnQgXGMKLS5JIG9ubHlcYwotXCYgdGhvc2UKLW9mIHRoZSBmaWxlcyB5b3UgbGlzdCB0aGF0IGFyZSBuZXdlciB0aGFuIGV4aXN0aW5nIG1lbWJlcnMgb2YgdGhlIHNhbWUKLW5hbWVzLCB1c2UgdGhpcyBtb2RpZmllci4gIFRoZSBgXHxcYwotLkIgdVxjCi1cfCcgbW9kaWZpZXIgaXMgYWxsb3dlZCBvbmx5IGZvciB0aGUKLW9wZXJhdGlvbiBgXHxcYwotLkIgclxjCi1cfCcgKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIGBcfFxjCi0uQiBxdVxjCi1cfCcgaXMKLW5vdCBhbGxvd2VkLCBzaW5jZSBjaGVja2luZyB0aGUgdGltZXN0YW1wcyB3b3VsZCBsb3NlIGFueSBzcGVlZAotYWR2YW50YWdlIGZyb20gdGhlIG9wZXJhdGlvbiBgXHxcYwotLkIgcVxjCi1cfCcuCi0KLS5UUAotLkIgdgotVGhpcyBtb2RpZmllciByZXF1ZXN0cyB0aGUgXGMKLS5JIHZlcmJvc2VcYwotXCYgdmVyc2lvbiBvZiBhbiBvcGVyYXRpb24uICBNYW55Ci1vcGVyYXRpb25zIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgc3VjaCBhcyBmaWxlbmFtZXMgcHJvY2Vzc2VkLAotd2hlbiB0aGUgbW9kaWZpZXIgYFx8XGMKLS5CIHZcYwotXHwnIGlzIGFwcGVuZGVkLgotCi0uVFAKLS5CIFYKLVRoaXMgbW9kaWZpZXIgc2hvd3MgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQlIgYXIgLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLSwgUm9sYW5kIEguIFBlc2NoIChPY3RvYmVyIDE5OTEpLgotLkJSIG5tICggMSApXGMKLVwmLAotLkJSIHJhbmxpYiAoIDEgKVxjCi1cJi4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXIuYyBiL2JpbnV0aWxzL2FyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOWRjZWYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNDQgKzAsMCBAQAotLyogYXIuYyAtIEFyY2hpdmUgbW9kaWZ5IGFuZCBleHRyYWN0LgotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyoKLSAgIEJ1Z3M6IHNob3VsZCB1c2UgZ2V0b3B0IHRoZSB3YXkgdGFyIGRvZXMgKGNvbXBsZXRlIHcvb3B0aW9uYWwgLSkgYW5kCi0gICBzaG91bGQgaGF2ZSBsb25nIG9wdGlvbnMgdG9vLiBHTlUgYXIgdXNlZCB0byBjaGVjayBmaWxlIGFnYWluc3QgZmlsZXN5c3RlbQotICAgaW4gcXVpY2tfdXBkYXRlIGFuZCByZXBsYWNlIG9wZXJhdGlvbnMgKHdvdWxkIGNoZWNrIG10aW1lKS4gRG9lc24ndCB3YXJuCi0gICB3aGVuIG5hbWUgdHJ1bmNhdGVkLiBObyB3YXkgdG8gc3BlY2lmeSBwb3NfZW5kLiBFcnJvciBtZXNzYWdlcyBzaG91bGQgYmUKLSAgIG1vcmUgY29uc2lzdGFudC4KLSovCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJhb3V0L2FyLmgiCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgX19HTzMyX19fCi0jZGVmaW5lIEVYVF9OQU1FX0xFTiAzCQkvKiBidWZmbGVuIG9mIGFkZGl0aW9uIHRvIG5hbWUgaWYgaXQncyBNUy1ET1MgKi8KLSNlbHNlCi0jZGVmaW5lIEVYVF9OQU1FX0xFTiA2CQkvKiBkaXR0byBmb3IgKk5JWCAqLwotI2VuZGlmCi0KLS8qIFdlIG5lZWQgdG8gb3BlbiBmaWxlcyBpbiBiaW5hcnkgbW9kZXMgb24gc3lzdGVtIHdoZXJlIHRoYXQgbWFrZXMgYQotICAgZGlmZmVyZW5jZS4gICovCi0jaWZuZGVmIE9fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZIDAKLSNlbmRpZgotCi0jZGVmaW5lIEJVRlNJWkUgODE5MgotCi0vKiBLbHVkZ2UgZGVjbGFyYXRpb24gZnJvbSBCRkQhICBUaGlzIGlzIHVnbHkhICBGSVhNRSEgIFhYWCAqLwotCi1zdHJ1Y3QgYXJfaGRyICoKLSAgYmZkX3NwZWNpYWxfdW5kb2N1bWVudGVkX2dsdWUgUEFSQU1TICgoYmZkICogYWJmZCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotLyogU3RhdGljIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAotbXJpX2VtdWwgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcmVtb3ZlX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqKShiZmQgKiksIGNoYXIgKiosIGludCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfY29udGVudHMgUEFSQU1TICgoYmZkICogbWVtYmVyKSk7Ci0KLXN0YXRpYyB2b2lkCi1kZWxldGVfbWVtYmVycyBQQVJBTVMgKChiZmQgKiwgY2hhciAqKmZpbGVzX3RvX2RlbGV0ZSkpOwotCi0jaWYgMAotc3RhdGljIHZvaWQKLWRvX3F1aWNrX2FwcGVuZCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lLAotCQkJIGNoYXIgKipmaWxlc190b19hcHBlbmQpKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotbW92ZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fbW92ZSkpOwotCi1zdGF0aWMgdm9pZAotcmVwbGFjZV9tZW1iZXJzIFBBUkFNUyAoKGJmZCAqLCBjaGFyICoqZmlsZXNfdG9fcmVwbGFjZSwgYm9vbGVhbiBxdWljaykpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGVzY3IgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotd3JpdGVfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcmFubGliX29ubHkgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaG5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXJhbmxpYl90b3VjaCBQQVJBTVMgKChjb25zdCBjaGFyICphcmNobmFtZSkpOwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgUEFSQU1TICgoaW50KSk7Ci0MCi0vKiogR2xvYmFscyBhbmQgZmxhZ3MgKi8KLQotaW50IG1yaV9tb2RlOwotCi0vKiBUaGlzIGZsYWcgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFyIGFuZCByYW5saWI6Ci0gICAxIG1lYW5zIHRoaXMgaXMgJ3JhbmxpYic7IDAgbWVhbnMgdGhpcyBpcyAnYXInLgotICAgLTEgbWVhbnMgaWYgd2Ugc2hvdWxkIHVzZSBhcmd2WzBdIHRvIGRlY2lkZS4gICovCi1leHRlcm4gaW50IGlzX3JhbmxpYjsKLQotLyogTm9uemVybyBtZWFucyBkb24ndCB3YXJuIGFib3V0IGNyZWF0aW5nIHRoZSBhcmNoaXZlIGZpbGUgaWYgbmVjZXNzYXJ5LiAgKi8KLWludCBzaWxlbnRfY3JlYXRlID0gMDsKLQotLyogTm9uemVybyBtZWFucyBkZXNjcmliZSBlYWNoIGFjdGlvbiBwZXJmb3JtZWQuICAqLwotaW50IHZlcmJvc2UgPSAwOwotCi0vKiBOb256ZXJvIG1lYW5zIHByZXNlcnZlIGRhdGVzIG9mIG1lbWJlcnMgd2hlbiBleHRyYWN0aW5nIHRoZW0uICAqLwotaW50IHByZXNlcnZlX2RhdGVzID0gMDsKLQotLyogTm9uemVybyBtZWFucyBkb24ndCByZXBsYWNlIGV4aXN0aW5nIG1lbWJlcnMgd2hvc2UgZGF0ZXMgYXJlIG1vcmUgcmVjZW50Ci0gICB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVzLiAgKi8KLWludCBuZXdlcl9vbmx5ID0gMDsKLQotLyogQ29udHJvbHMgdGhlIHdyaXRpbmcgb2YgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUgKGluIEJTRDogYSBfXy5TWU1ERUYKLSAgIG1lbWJlcikuICAtMSBtZWFucyB3ZSd2ZSBiZWVuIGV4cGxpY2l0bHkgYXNrZWQgdG8gbm90IHdyaXRlIGEgc3ltYm9sIHRhYmxlOwotICAgKzEgbWVhbnMgd2UndmUgYmVlbiBleHBsaWN0bHkgYXNrZWQgdG8gd3JpdGUgaXQ7Ci0gICAwIGlzIHRoZSBkZWZhdWx0LgotICAgVHJhZGl0aW9uYWxseSwgdGhlIGRlZmF1bHQgaW4gQlNEIGhhcyBiZWVuIHRvIG5vdCB3cml0ZSB0aGUgdGFibGUuCi0gICBIb3dldmVyLCBmb3IgUE9TSVguMiBjb21wbGlhbmNlIHRoZSBkZWZhdWx0IGlzIG5vdyB0byB3cml0ZSBhIHN5bWJvbCB0YWJsZQotICAgaWYgYW55IG9mIHRoZSBtZW1iZXJzIGFyZSBvYmplY3QgZmlsZXMuICAqLwotaW50IHdyaXRlX2FybWFwID0gMDsKLQotLyogTm9uemVybyBtZWFucyBpdCdzIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIG1lbWJlcjsgcG9zaXRpb24gbmV3IG9yIG1vdmVkCi0gICBmaWxlcyB3aXRoIHJlc3BlY3QgdG8gdGhpcyBvbmUuICAqLwotY2hhciAqcG9zbmFtZSA9IE5VTEw7Ci0KLS8qIFNleiBob3cgdG8gdXNlIGBwb3NuYW1lJzogcG9zX2JlZm9yZSBtZWFucyBwb3NpdGlvbiBiZWZvcmUgdGhhdCBtZW1iZXIuCi0gICBwb3NfYWZ0ZXIgbWVhbnMgcG9zaXRpb24gYWZ0ZXIgdGhhdCBtZW1iZXIuIHBvc19lbmQgbWVhbnMgYWx3YXlzIGF0IGVuZC4KLSAgIHBvc19kZWZhdWx0IG1lYW5zIGRlZmF1bHQgYXBwcm9wcmlhdGVseS4gRm9yIHRoZSBsYXR0ZXIgdHdvLCBgcG9zbmFtZScKLSAgIHNob3VsZCBhbHNvIGJlIHplcm8uICAqLwotZW51bSBwb3MKLSAgewotICAgIHBvc19kZWZhdWx0LCBwb3NfYmVmb3JlLCBwb3NfYWZ0ZXIsIHBvc19lbmQKLSAgfSBwb3N0eXBlID0gcG9zX2RlZmF1bHQ7Ci0KLXN0YXRpYyBiZmQgKioKLWdldF9wb3NfYmZkIFBBUkFNUyAoKGJmZCAqKiwgZW51bSBwb3MsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBXaGV0aGVyIHRvIHRydW5jYXRlIG5hbWVzIG9mIGZpbGVzIHN0b3JlZCBpbiB0aGUgYXJjaGl2ZS4gICovCi1zdGF0aWMgYm9vbGVhbiBhcl90cnVuY2F0ZSA9IGZhbHNlOwotCi1pbnQgaW50ZXJhY3RpdmUgPSAwOwotCi1zdGF0aWMgdm9pZAotbXJpX2VtdWwgKCkKLXsKLSAgaW50ZXJhY3RpdmUgPSBpc2F0dHkgKGZpbGVubyAoc3RkaW4pKTsKLSAgeXlwYXJzZSAoKTsKLX0KLQotLyogSWYgQ09VTlQgaXMgMCwgdGhlbiBGVU5DVElPTiBpcyBjYWxsZWQgb25jZSBvbiBlYWNoIGVudHJ5LiAgSWYgbm9uemVybywKLSAgIENPVU5UIGlzIHRoZSBsZW5ndGggb2YgdGhlIEZJTEVTIGNoYWluOyBGVU5DVElPTiBpcyBjYWxsZWQgb24gZWFjaCBlbnRyeQotICAgd2hvc2UgbmFtZSBtYXRjaGVzIG9uZSBpbiBGSUxFUy4gICovCi0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9tZW1iZXJzIChhcmNoLCBmdW5jdGlvbiwgZmlsZXMsIGNvdW50KQotICAgICBiZmQgKmFyY2g7Ci0gICAgIHZvaWQgKCpmdW5jdGlvbikgUEFSQU1TICgoYmZkICopKTsKLSAgICAgY2hhciAqKmZpbGVzOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGJmZCAqaGVhZDsKLQotICBpZiAoY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKLQl7Ci0JICBQUk9HUkVTUyAoMSk7Ci0JICBmdW5jdGlvbiAoaGVhZCk7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyogVGhpcyBtYXkgYXBwZWFyIHRvIGJlIGEgYmFyb3F1ZSB3YXkgb2YgYWNjb21wbGlzaGluZyB3aGF0IHdlIHdhbnQuCi0gICAgIEhvd2V2ZXIgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGZpbGVuYW1lcyBpbiBvcmRlciB0byBub3RpY2Ugd2hlcmUKLSAgICAgYSBmaWxlbmFtZSBpcyByZXF1ZXN0ZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhcmNoaXZlLiAgRGl0dG8KLSAgICAgbWFwcGluZyBvdmVyIGVhY2ggZmlsZSBlYWNoIHRpbWUgLS0gd2Ugd2FudCB0byBoYWNrIG11bHRpcGxlCi0gICAgIHJlZmVyZW5jZXMuICAqLwotCi0gIGZvciAoOyBjb3VudCA+IDA7IGZpbGVzKyssIGNvdW50LS0pCi0gICAgewotICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCi0gICAgICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkKLQl7Ci0JICBQUk9HUkVTUyAoMSk7Ci0JICBpZiAoaGVhZC0+ZmlsZW5hbWUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIC8qIFNvbWUgYXJjaGl2ZSBmb3JtYXRzIGRvbid0IGdldCB0aGUgZmlsZW5hbWVzIGZpbGxlZCBpbgotCQkgdW50aWwgdGhlIGVsZW1lbnRzIGFyZSBvcGVuZWQuICAqLwotCSAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLQkgICAgICBiZmRfc3RhdF9hcmNoX2VsdCAoaGVhZCwgJmJ1Zik7Ci0JICAgIH0KLQkgIGlmICgoaGVhZC0+ZmlsZW5hbWUgIT0gTlVMTCkgJiYKLQkgICAgICAoIXN0cmNtcCAoKmZpbGVzLCBoZWFkLT5maWxlbmFtZSkpKQotCSAgICB7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICAgIGZ1bmN0aW9uIChoZWFkKTsKLQkgICAgfQotCX0KLSAgICAgIGlmICghZm91bmQpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmcHJpbnRmIChzdGRlcnIsIF8oIm5vIGVudHJ5ICVzIGluIGFyY2hpdmVcbiIpLCAqZmlsZXMpOwotICAgIH0KLX0KLQwKLWJvb2xlYW4gb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gZmFsc2U7Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoaGVscCkKLSAgICAgaW50IGhlbHA7Ci17Ci0gIEZJTEUgKnM7Ci0KLSAgcyA9IGhlbHAgPyBzdGRvdXQgOiBzdGRlcnI7Ci0gIAotICBpZiAoISBpc19yYW5saWIpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHMsIF8oIlVzYWdlOiAlcyBbLV17ZG1wcXJzdHh9W2FiY2lsb3NTdXZWXSBbbWVtYmVyLW5hbWVdIGFyY2hpdmUtZmlsZSBmaWxlLi4uXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzLCBfKCIgICAgICAgJXMgLU0gWzxtcmktc2NyaXB0XVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgY29tbWFuZHM6XG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIGQgICAgICAgICAgICAtIGRlbGV0ZSBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgbVthYl0gICAgICAgIC0gbW92ZSBmaWxlKHMpIGluIHRoZSBhcmNoaXZlXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIHAgICAgICAgICAgICAtIHByaW50IGZpbGUocykgZm91bmQgaW4gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgcVtmXSAgICAgICAgIC0gcXVpY2sgYXBwZW5kIGZpbGUocykgdG8gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgclthYl1bZl1bdV0gIC0gcmVwbGFjZSBleGlzdGluZyBvciBpbnNlcnQgbmV3IGZpbGUocykgaW50byB0aGUgYXJjaGl2ZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICB0ICAgICAgICAgICAgLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgeFtvXSAgICAgICAgIC0gZXh0cmFjdCBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiBjb21tYW5kIHNwZWNpZmljIG1vZGlmaWVyczpcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW2FdICAgICAgICAgIC0gcHV0IGZpbGUocykgYWZ0ZXIgW21lbWJlci1uYW1lXVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbYl0gICAgICAgICAgLSBwdXQgZmlsZShzKSBiZWZvcmUgW21lbWJlci1uYW1lXSAoc2FtZSBhcyBbaV0pXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtmXSAgICAgICAgICAtIHRydW5jYXRlIGluc2VydGVkIGZpbGUgbmFtZXNcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW29dICAgICAgICAgIC0gcHJlc2VydmUgb3JpZ2luYWwgZGF0ZXNcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW3VdICAgICAgICAgIC0gb25seSByZXBsYWNlIGZpbGVzIHRoYXQgYXJlIG5ld2VyIHRoYW4gY3VycmVudCBhcmNoaXZlIGNvbnRlbnRzXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgZ2VuZXJpYyBtb2RpZmllcnM6XG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtjXSAgICAgICAgICAtIGRvIG5vdCB3YXJuIGlmIHRoZSBsaWJyYXJ5IGhhZCB0byBiZSBjcmVhdGVkXG4iKSk7Ci0gICAgICBmcHJpbnRmIChzLCBfKCIgIFtzXSAgICAgICAgICAtIGNyZWF0ZSBhbiBhcmNoaXZlIGluZGV4IChjZi4gcmFubGliKVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbU10gICAgICAgICAgLSBkbyBub3QgYnVpbGQgYSBzeW1ib2wgdGFibGVcbiIpKTsKLSAgICAgIGZwcmludGYgKHMsIF8oIiAgW3ZdICAgICAgICAgIC0gYmUgdmVyYm9zZVxuIikpOwotICAgICAgZnByaW50ZiAocywgXygiICBbVl0gICAgICAgICAgLSBkaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlclxuIikpOwotICAgIH0KLSAgZWxzZQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZnByaW50ZiAocywgXygiVXNhZ2U6ICVzIFstdlZdIGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotCi0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RkZXJyKTsKLQotICBpZiAoaGVscCkKLSAgICBmcHJpbnRmIChzLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLQotICB4ZXhpdCAoaGVscCA/IDAgOiAxKTsKLX0KLQotLyogTm9ybWFsaXplIGEgZmlsZSBuYW1lIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGludG8gYSBmaWxlCi0gICBuYW1lIHdoaWNoIHdlIHdpbGwgdXNlIGluIGFuIGFyY2hpdmUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ub3JtYWxpemUgKGZpbGUsIGFiZmQpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlLCAnLycpOwotICBpZiAoZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICBmaWxlbmFtZSsrOwotICBlbHNlCi0gICAgZmlsZW5hbWUgPSBmaWxlOwotCi0gIGlmIChhcl90cnVuY2F0ZQotICAgICAgJiYgYWJmZCAhPSBOVUxMCi0gICAgICAmJiBzdHJsZW4gKGZpbGVuYW1lKSA+IGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIC8qIFNwYWNlIGxlYWsuICAqLwotICAgICAgcyA9IChjaGFyICopIHhtYWxsb2MgKGFiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuICsgMSk7Ci0gICAgICBtZW1jcHkgKHMsIGZpbGVuYW1lLCBhYmZkLT54dmVjLT5hcl9tYXhfbmFtZWxlbik7Ci0gICAgICBzW2FiZmQtPnh2ZWMtPmFyX21heF9uYW1lbGVuXSA9ICdcMCc7Ci0gICAgICBmaWxlbmFtZSA9IHM7Ci0gICAgfQotCi0gIHJldHVybiBmaWxlbmFtZTsKLX0KLQotLyogUmVtb3ZlIGFueSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgb25seSBjYWxsZWQgdmlhIHhhdGV4aXQuICAqLwotCi1zdGF0aWMgY2hhciAqb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLXN0YXRpYyBGSUxFICpvdXRwdXRfZmlsZSA9IE5VTEw7Ci1zdGF0aWMgYmZkICpvdXRwdXRfYmZkID0gTlVMTDsKLQotc3RhdGljIHZvaWQKLXJlbW92ZV9vdXRwdXQgKCkKLXsKLSAgaWYgKG91dHB1dF9maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfYmZkICE9IE5VTEwgJiYgb3V0cHV0X2JmZC0+aW9zdHJlYW0gIT0gTlVMTCkKLQlmY2xvc2UgKChGSUxFICopIChvdXRwdXRfYmZkLT5pb3N0cmVhbSkpOwotICAgICAgaWYgKG91dHB1dF9maWxlICE9IE5VTEwpCi0JZmNsb3NlIChvdXRwdXRfZmlsZSk7Ci0gICAgICB1bmxpbmsgKG91dHB1dF9maWxlbmFtZSk7Ci0gICAgfQotfQotCi0vKiBUaGUgb3B0aW9uIHBhcnNpbmcgc2hvdWxkIGJlIGluIGl0cyBvd24gZnVuY3Rpb24uCi0gICBJdCB3aWxsIGJlIHdoZW4gSSBoYXZlIGdldG9wdCB3b3JraW5nLiAgKi8KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGNoYXIgKmFyZ19wdHI7Ci0gIGNoYXIgYzsKLSAgZW51bQotICAgIHsKLSAgICAgIG5vbmUgPSAwLCBkZWxldGUsIHJlcGxhY2UsIHByaW50X3RhYmxlLAotICAgICAgcHJpbnRfZmlsZXMsIGV4dHJhY3QsIG1vdmUsIHF1aWNrX2FwcGVuZAotICAgIH0gb3BlcmF0aW9uID0gbm9uZTsKLSAgaW50IGFyZ19pbmRleDsKLSAgY2hhciAqKmZpbGVzOwotICBjaGFyICppbmFyY2hfZmlsZW5hbWU7Ci0gIGludCBzaG93X3ZlcnNpb247Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgaWYgKGlzX3JhbmxpYiA8IDApCi0gICAgewotICAgICAgY2hhciAqdGVtcDsKLQotICAgICAgdGVtcCA9IHN0cnJjaHIgKHByb2dyYW1fbmFtZSwgJy8nKTsKLSAgICAgIGlmICh0ZW1wID09IE5VTEwpCi0JdGVtcCA9IHByb2dyYW1fbmFtZTsKLSAgICAgIGVsc2UKLQkrK3RlbXA7Ci0gICAgICBpZiAoc3RybGVuICh0ZW1wKSA+PSA2Ci0JICAmJiBzdHJjbXAgKHRlbXAgKyBzdHJsZW4gKHRlbXApIC0gNiwgInJhbmxpYiIpID09IDApCi0JaXNfcmFubGliID0gMTsKLSAgICAgIGVsc2UKLQlpc19yYW5saWIgPSAwOwotICAgIH0KLQotICBpZiAoYXJnYyA+IDEgJiYgYXJndlsxXVswXSA9PSAnLScpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDApCi0JdXNhZ2UgKDEpOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmd2WzFdLCAiLS12ZXJzaW9uIikgPT0gMCkKLQl7Ci0JICBpZiAoaXNfcmFubGliKQotCSAgICBwcmludF92ZXJzaW9uICgicmFubGliIik7Ci0JICBlbHNlCi0JICAgIHByaW50X3ZlcnNpb24gKCJhciIpOwotCX0KLSAgICB9Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSwgMCk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgc2hvd192ZXJzaW9uID0gMDsKLQotICB4YXRleGl0IChyZW1vdmVfb3V0cHV0KTsKLQotICBpZiAoaXNfcmFubGliKQotICAgIHsKLSAgICAgIGJvb2xlYW4gdG91Y2ggPSBmYWxzZTsKLQotICAgICAgaWYgKGFyZ2MgPCAyIHx8IHN0cmNtcCAoYXJndlsxXSwgIi0taGVscCIpID09IDApCi0JdXNhZ2UgKDApOwotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi1WIikgPT0gMAotCSAgfHwgc3RyY21wIChhcmd2WzFdLCAiLXYiKSA9PSAwCi0JICB8fCBzdHJuY21wIChhcmd2WzFdLCAiLS12IiwgMykgPT0gMCkKLQlwcmludF92ZXJzaW9uICgicmFubGliIik7Ci0gICAgICBhcmdfaW5kZXggPSAxOwotICAgICAgaWYgKHN0cmNtcCAoYXJndlsxXSwgIi10IikgPT0gMCkKLQl7Ci0JICArK2FyZ19pbmRleDsKLQkgIHRvdWNoID0gdHJ1ZTsKLQl9Ci0gICAgICB3aGlsZSAoYXJnX2luZGV4IDwgYXJnYykKLQl7Ci0JICBpZiAoISB0b3VjaCkKLQkgICAgcmFubGliX29ubHkgKGFyZ3ZbYXJnX2luZGV4XSk7Ci0JICBlbHNlCi0JICAgIHJhbmxpYl90b3VjaCAoYXJndlthcmdfaW5kZXhdKTsKLQkgICsrYXJnX2luZGV4OwotCX0KLSAgICAgIHhleGl0ICgwKTsKLSAgICB9Ci0KLSAgaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAgKGFyZ3ZbMV0sICItTSIpID09IDApCi0gICAgewotICAgICAgbXJpX2VtdWwgKCk7Ci0gICAgICB4ZXhpdCAoMCk7Ci0gICAgfQotCi0gIGlmIChhcmdjIDwgMikKLSAgICB1c2FnZSAoMCk7Ci0KLSAgYXJnX3B0ciA9IGFyZ3ZbMV07Ci0KLSAgaWYgKCphcmdfcHRyID09ICctJykKLSAgICArK2FyZ19wdHI7CQkJLyogY29tcGF0aWJpbGl0eSAqLwotCi0gIHdoaWxlICgoYyA9ICphcmdfcHRyKyspICE9ICdcMCcpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdkJzoKLQljYXNlICdtJzoKLQljYXNlICdwJzoKLQljYXNlICdxJzoKLQljYXNlICdyJzoKLQljYXNlICd0JzoKLQljYXNlICd4JzoKLQkgIGlmIChvcGVyYXRpb24gIT0gbm9uZSkKLQkgICAgZmF0YWwgKF8oInR3byBkaWZmZXJlbnQgb3BlcmF0aW9uIG9wdGlvbnMgc3BlY2lmaWVkIikpOwotCSAgc3dpdGNoIChjKQotCSAgICB7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIG9wZXJhdGlvbiA9IGRlbGV0ZTsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdtJzoKLQkgICAgICBvcGVyYXRpb24gPSBtb3ZlOwotCSAgICAgIG9wZXJhdGlvbl9hbHRlcnNfYXJjaCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3AnOgotCSAgICAgIG9wZXJhdGlvbiA9IHByaW50X2ZpbGVzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdxJzoKLQkgICAgICBvcGVyYXRpb24gPSBxdWlja19hcHBlbmQ7Ci0JICAgICAgb3BlcmF0aW9uX2FsdGVyc19hcmNoID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncic6Ci0JICAgICAgb3BlcmF0aW9uID0gcmVwbGFjZTsKLQkgICAgICBvcGVyYXRpb25fYWx0ZXJzX2FyY2ggPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd0JzoKLQkgICAgICBvcGVyYXRpb24gPSBwcmludF90YWJsZTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAneCc6Ci0JICAgICAgb3BlcmF0aW9uID0gZXh0cmFjdDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCWNhc2UgJ2wnOgotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBzaWxlbnRfY3JlYXRlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgcHJlc2VydmVfZGF0ZXMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICB3cml0ZV9hcm1hcCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIHdyaXRlX2FybWFwID0gLTE7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIG5ld2VyX29ubHkgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgcG9zdHlwZSA9IHBvc19hZnRlcjsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgcG9zdHlwZSA9IHBvc19iZWZvcmU7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIHBvc3R5cGUgPSBwb3NfYmVmb3JlOwotCSAgYnJlYWs7Ci0JY2FzZSAnTSc6Ci0JICBtcmlfbW9kZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGFyX3RydW5jYXRlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIpLCBwcm9ncmFtX25hbWUsIGMpOwotCSAgdXNhZ2UgKDApOwotCX0KLSAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgiYXIiKTsKLQotICBpZiAoYXJnYyA8IDMpCi0gICAgdXNhZ2UgKDApOwotCi0gIGlmIChtcmlfbW9kZSkKLSAgICB7Ci0gICAgICBtcmlfZW11bCAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmQgKmFyY2g7Ci0KLSAgICAgIC8qIFdlIGNhbid0IHdyaXRlIGFuIGFybWFwIHdoZW4gdXNpbmcgYXIgcSwgc28ganVzdCBkbyBhciByCi0gICAgICAgICBpbnN0ZWFkLiAgKi8KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kICYmIHdyaXRlX2FybWFwKQotCW9wZXJhdGlvbiA9IHJlcGxhY2U7Ci0KLSAgICAgIGlmICgob3BlcmF0aW9uID09IG5vbmUgfHwgb3BlcmF0aW9uID09IHByaW50X3RhYmxlKQotCSAgJiYgd3JpdGVfYXJtYXAgPT0gMSkKLQl7Ci0JICByYW5saWJfb25seSAoYXJndlsyXSk7Ci0JICB4ZXhpdCAoMCk7Ci0JfQotCi0gICAgICBpZiAob3BlcmF0aW9uID09IG5vbmUpCi0JZmF0YWwgKF8oIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiKSk7Ci0KLSAgICAgIGlmIChuZXdlcl9vbmx5ICYmIG9wZXJhdGlvbiAhPSByZXBsYWNlKQotCWZhdGFsIChfKCJgdScgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGByJyBvcHRpb24uIikpOwotCi0gICAgICBhcmdfaW5kZXggPSAyOwotCi0gICAgICBpZiAocG9zdHlwZSAhPSBwb3NfZGVmYXVsdCkKLQlwb3NuYW1lID0gYXJndlthcmdfaW5kZXgrK107Ci0KLSAgICAgIGluYXJjaF9maWxlbmFtZSA9IGFyZ3ZbYXJnX2luZGV4KytdOwotCi0gICAgICBmaWxlcyA9IGFyZ19pbmRleCA8IGFyZ2MgPyBhcmd2ICsgYXJnX2luZGV4IDogTlVMTDsKLQotI2lmIDAKLSAgICAgIC8qIFdlIGRvbid0IHVzZSBkb19xdWlja19hcHBlbmQgYW55IG1vcmUuICBUb28gbWFueSBzeXN0ZW1zCi0gICAgICAgICBleHBlY3QgYXIgdG8gYWx3YXlzIHJlYnVpbGQgdGhlIHN5bWJvbCB0YWJsZSBldmVuIHdoZW4gcSBpcwotICAgICAgICAgdXNlZC4gICovCi0KLSAgICAgIC8qIFdlIGNhbid0IGRvIGEgcXVpY2sgYXBwZW5kIGlmIHdlIG5lZWQgdG8gY29uc3RydWN0IGFuCi0JIGV4dGVuZGVkIG5hbWUgdGFibGUsIGJlY2F1c2UgZG9fcXVpY2tfYXBwZW5kIHdvbid0IGJlIGFibGUgdG8KLQkgcmVidWlsZCB0aGUgbmFtZSB0YWJsZS4gIFVuZm9ydHVuYXRlbHksIGF0IHRoaXMgcG9pbnQgd2UKLQkgZG9uJ3QgYWN0dWFsbHkga25vdyB0aGUgbWF4aW11bSBuYW1lIGxlbmd0aCBwZXJtaXR0ZWQgYnkgdGhpcwotCSBvYmplY3QgZmlsZSBmb3JtYXQuICBTbywgd2UgZ3Vlc3MuICBGSVhNRS4gICovCi0gICAgICBpZiAob3BlcmF0aW9uID09IHF1aWNrX2FwcGVuZCAmJiAhIGFyX3RydW5jYXRlKQotCXsKLQkgIGNoYXIgKipjaGs7Ci0KLQkgIGZvciAoY2hrID0gZmlsZXM7IGNoayAhPSBOVUxMICYmICpjaGsgIT0gJ1wwJzsgY2hrKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybGVuIChub3JtYWxpemUgKCpjaGssIChiZmQgKikgTlVMTCkpID4gMTQpCi0JCXsKLQkJICBvcGVyYXRpb24gPSByZXBsYWNlOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChvcGVyYXRpb24gPT0gcXVpY2tfYXBwZW5kKQotCXsKLQkgIC8qIE5vdGUgdGhhdCBxdWljayBhcHBlbmRpbmcgdG8gYSBub24tZXhpc3RlbnQgYXJjaGl2ZSBjcmVhdGVzIGl0LAotCSAgICAgZXZlbiBpZiB0aGVyZSBhcmUgbm8gZmlsZXMgdG8gYXBwZW5kLiAqLwotCSAgZG9fcXVpY2tfYXBwZW5kIChpbmFyY2hfZmlsZW5hbWUsIGZpbGVzKTsKLQkgIHhleGl0ICgwKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgYXJjaCA9IG9wZW5faW5hcmNoIChpbmFyY2hfZmlsZW5hbWUsCi0JCQkgIGZpbGVzID09IE5VTEwgPyAoY2hhciAqKSBOVUxMIDogZmlsZXNbMF0pOwotCi0gICAgICBzd2l0Y2ggKG9wZXJhdGlvbikKLQl7Ci0JY2FzZSBwcmludF90YWJsZToKLQkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIHByaW50X2Rlc2NyLCBmaWxlcywgYXJnYyAtIDMpOwotCSAgYnJlYWs7Ci0KLQljYXNlIHByaW50X2ZpbGVzOgotCSAgbWFwX292ZXJfbWVtYmVycyAoYXJjaCwgcHJpbnRfY29udGVudHMsIGZpbGVzLCBhcmdjIC0gMyk7Ci0JICBicmVhazsKLQotCWNhc2UgZXh0cmFjdDoKLQkgIG1hcF9vdmVyX21lbWJlcnMgKGFyY2gsIGV4dHJhY3RfZmlsZSwgZmlsZXMsIGFyZ2MgLSAzKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBkZWxldGU6Ci0JICBpZiAoZmlsZXMgIT0gTlVMTCkKLQkgICAgZGVsZXRlX21lbWJlcnMgKGFyY2gsIGZpbGVzKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBtb3ZlOgotCSAgaWYgKGZpbGVzICE9IE5VTEwpCi0JICAgIG1vdmVfbWVtYmVycyAoYXJjaCwgZmlsZXMpOwotCSAgYnJlYWs7Ci0KLQljYXNlIHJlcGxhY2U6Ci0JY2FzZSBxdWlja19hcHBlbmQ6Ci0JICBpZiAoZmlsZXMgIT0gTlVMTCB8fCB3cml0ZV9hcm1hcCA+IDApCi0JICAgIHJlcGxhY2VfbWVtYmVycyAoYXJjaCwgZmlsZXMsIG9wZXJhdGlvbiA9PSBxdWlja19hcHBlbmQpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFNob3VsZG4ndCBoYXBwZW4hICovCi0JZGVmYXVsdDoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnRlcm5hbCBlcnJvciAtLSB0aGlzIG9wdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIpLAotCQkgICBwcm9ncmFtX25hbWUpOwotCSAgeGV4aXQgKDEpOwotCX0KLSAgICB9Ci0KLSAgRU5EX1BST0dSRVNTIChwcm9ncmFtX25hbWUpOwotCi0gIHhleGl0ICgwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWJmZCAqCi1vcGVuX2luYXJjaCAoYXJjaGl2ZV9maWxlbmFtZSwgZmlsZSkKLSAgICAgY29uc3QgY2hhciAqYXJjaGl2ZV9maWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgY29uc3QgY2hhciAqdGFyZ2V0OwotICBiZmQgKipsYXN0X29uZTsKLSAgYmZkICpuZXh0X29uZTsKLSAgc3RydWN0IHN0YXQgc2J1ZjsKLSAgYmZkICphcmNoOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotICB0YXJnZXQgPSBOVUxMOwotCi0gIGlmIChzdGF0IChhcmNoaXZlX2ZpbGVuYW1lLCAmc2J1ZikgIT0gMCkKLSAgICB7Ci0jaWZuZGVmIF9fR08zMl9fCi0KLS8qIEtMVURHRSBBTEVSVCEgVGVtcG9yYXJ5IGZpeCB1bnRpbCBJIGZpZ2dlciB3aHkKLSAqIHN0YXQoKSBpcyB3cm9uZyAuLi4gdGhpbmsgaXQncyBidXJpZWQgaW4gR08zMidzIElEVAotICogLSBKYXgKLSAqLwotICAgICAgaWYgKGVycm5vICE9IEVOT0VOVCkKLQliZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotI2VuZGlmCi0KLSAgICAgIGlmICghb3BlcmF0aW9uX2FsdGVyc19hcmNoKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgcGVycm9yIChhcmNoaXZlX2ZpbGVuYW1lKTsKLQkgIG1heWJlcXVpdCAoKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLQotICAgICAgLyogVHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIHRhcmdldCB0byB1c2UgZm9yIHRoZSBhcmNoaXZlIGZyb20gdGhlCi0gICAgICAgICBmaXJzdCBvYmplY3Qgb24gdGhlIGxpc3QuICAqLwotICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKLQl7Ci0JICBiZmQgKm9iajsKLQotCSAgb2JqID0gYmZkX29wZW5yIChmaWxlLCBOVUxMKTsKLQkgIGlmIChvYmogIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfY2hlY2tfZm9ybWF0IChvYmosIGJmZF9vYmplY3QpKQotCQl0YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAob2JqKTsKLQkgICAgICAodm9pZCkgYmZkX2Nsb3NlIChvYmopOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYW4gZW1wdHkgYXJjaGl2ZS4gICovCi0gICAgICBhcmNoID0gYmZkX29wZW53IChhcmNoaXZlX2ZpbGVuYW1lLCB0YXJnZXQpOwotICAgICAgaWYgKGFyY2ggPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X2Zvcm1hdCAoYXJjaCwgYmZkX2FyY2hpdmUpCi0JICB8fCAhIGJmZF9jbG9zZSAoYXJjaCkpCi0JYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgYXJjaCA9IGJmZF9vcGVuciAoYXJjaGl2ZV9maWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICB7Ci0gICAgYmxvc2VyOgotICAgICAgYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmNoLCBiZmRfYXJjaGl2ZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIGxhc3Rfb25lID0gJihhcmNoLT5uZXh0KTsKLSAgLyogUmVhZCBhbGwgdGhlIGNvbnRlbnRzIHJpZ2h0IGF3YXksIHJlZ2FyZGxlc3MuICAqLwotICBmb3IgKG5leHRfb25lID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoYXJjaCwgTlVMTCk7Ci0gICAgICAgbmV4dF9vbmU7Ci0gICAgICAgbmV4dF9vbmUgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChhcmNoLCBuZXh0X29uZSkpCi0gICAgewotICAgICAgUFJPR1JFU1MgKDEpOwotICAgICAgKmxhc3Rfb25lID0gbmV4dF9vbmU7Ci0gICAgICBsYXN0X29uZSA9ICZuZXh0X29uZS0+bmV4dDsKLSAgICB9Ci0gICpsYXN0X29uZSA9IChiZmQgKikgTlVMTDsKLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpCi0gICAgZ290byBibG9zZXI7Ci0gIHJldHVybiBhcmNoOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfY29udGVudHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaW50IG5jb3BpZWQgPSAwOwotICBjaGFyICpjYnVmID0geG1hbGxvYyAoQlVGU0laRSk7Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgbG9uZyBzaXplOwotICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpICE9IDApCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBwcmludGYgKF8oIlxuPG1lbWJlciAlcz5cblxuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpOwotCi0gIHNpemUgPSBidWYuc3Rfc2l6ZTsKLSAgd2hpbGUgKG5jb3BpZWQgPCBzaXplKQotICAgIHsKLQotICAgICAgaW50IG5yZWFkOwotICAgICAgaW50IHRvY29weSA9IHNpemUgLSBuY29waWVkOwotICAgICAgaWYgKHRvY29weSA+IEJVRlNJWkUpCi0JdG9jb3B5ID0gQlVGU0laRTsKLQotICAgICAgbnJlYWQgPSBiZmRfcmVhZCAoY2J1ZiwgMSwgdG9jb3B5LCBhYmZkKTsJLyogb29wcyAtLSBicm9rZQotCQkJCQkJCSAgIGFic3RyYWN0aW9uISAgKi8KLSAgICAgIGlmIChucmVhZCAhPSB0b2NvcHkpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmYXRhbCAoXygiJXMgaXMgbm90IGEgdmFsaWQgYXJjaGl2ZSIpLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpKTsKLSAgICAgIGZ3cml0ZSAoY2J1ZiwgMSwgbnJlYWQsIHN0ZG91dCk7Ci0gICAgICBuY29waWVkICs9IHRvY29weTsKLSAgICB9Ci0gIGZyZWUgKGNidWYpOwotfQotCi0vKiBFeHRyYWN0IGEgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGludG8gaXRzIG93biBmaWxlLgotCi0gICBXZSBkZWZlciBvcGVuaW5nIHRoZSBuZXcgZmlsZSB1bnRpbCBhZnRlciB3ZSBoYXZlIHJlYWQgYSBCVUZTSVogY2h1bmsgb2YgdGhlCi0gICBvbGQgb25lLCBzaW5jZSB3ZSBrbm93IHdlIGhhdmUganVzdCByZWFkIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhlIG9sZAotICAgb25lLiAgU2luY2UgbW9zdCBtZW1iZXJzIGFyZSBzaG9ydGVyIHRoYW4gQlVGU0laLCB0aGlzIG1lYW5zIHdlIHdpbGwgcmVhZAotICAgdGhlIG9sZCBoZWFkZXIsIHJlYWQgdGhlIG9sZCBkYXRhLCB3cml0ZSBhIG5ldyBpbm9kZSBmb3IgdGhlIG5ldyBmaWxlLCBhbmQKLSAgIHdyaXRlIHRoZSBuZXcgZGF0YSwgYW5kIGJlIGRvbmUuIFRoaXMgJ29wdGltaXphdGlvbicgaXMgd2hhdCBjb21lcyBmcm9tCi0gICBzaXR0aW5nIG5leHQgdG8gYSBiYXJlIGRpc2sgYW5kIGhlYXJpbmcgaXQgZXZlcnkgdGltZSBpdCBzZWVrcy4gIC0tIEdudQotICAgR2lsbW9yZSAgKi8KLQotdm9pZAotZXh0cmFjdF9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIEZJTEUgKm9zdHJlYW07Ci0gIGNoYXIgKmNidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKLSAgaW50IG5yZWFkLCB0b2NvcHk7Ci0gIGxvbmcgbmNvcGllZCA9IDA7Ci0gIGxvbmcgc2l6ZTsKLSAgc3RydWN0IHN0YXQgYnVmOwotICAKLSAgaWYgKGJmZF9zdGF0X2FyY2hfZWx0IChhYmZkLCAmYnVmKSAhPSAwKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oImludGVybmFsIHN0YXQgZXJyb3Igb24gJXMiKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICBzaXplID0gYnVmLnN0X3NpemU7Ci0KLSAgaWYgKHNpemUgPCAwKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oInN0YXQgcmV0dXJucyBuZWdhdGl2ZSBzaXplIGZvciAlcyIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gIAotICBpZiAodmVyYm9zZSkKLSAgICBwcmludGYgKCJ4IC0gJXNcbiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBiZmRfc2VlayAoYWJmZCwgMCwgU0VFS19TRVQpOwotCi0gIG9zdHJlYW0gPSBOVUxMOwotICBpZiAoc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFNlZW1zIGxpa2UgYW4gYWJzdHJhY3Rpb24gdmlvbGF0aW9uLCBlaD8gIFdlbGwgaXQncyBPSyEgKi8KLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpOwotCi0gICAgICBvc3RyZWFtID0gZm9wZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBGT1BFTl9XQik7Ci0gICAgICBpZiAob3N0cmVhbSA9PSBOVUxMKQotCXsKLQkgIHBlcnJvciAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgeGV4aXQgKDEpOwotCX0KLQotICAgICAgb3V0cHV0X2ZpbGUgPSBvc3RyZWFtOwotICAgIH0KLSAgZWxzZQotICAgIHdoaWxlIChuY29waWVkIDwgc2l6ZSkKLSAgICAgIHsKLQl0b2NvcHkgPSBzaXplIC0gbmNvcGllZDsKLQlpZiAodG9jb3B5ID4gQlVGU0laRSkKLQkgIHRvY29weSA9IEJVRlNJWkU7Ci0KLQlucmVhZCA9IGJmZF9yZWFkIChjYnVmLCAxLCB0b2NvcHksIGFiZmQpOwotCWlmIChucmVhZCAhPSB0b2NvcHkpCi0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZmF0YWwgKF8oIiVzIGlzIG5vdCBhIHZhbGlkIGFyY2hpdmUiKSwKLQkJIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChhYmZkKSkpOwotCi0JLyogU2VlIGNvbW1lbnQgYWJvdmU7IHRoaXMgc2F2ZXMgZGlzayBhcm0gbW90aW9uICovCi0JaWYgKG9zdHJlYW0gPT0gTlVMTCkKLQkgIHsKLQkgICAgLyogU2VlbXMgbGlrZSBhbiBhYnN0cmFjdGlvbiB2aW9sYXRpb24sIGVoPyAgV2VsbCBpdCdzIE9LISAqLwotCSAgICBvdXRwdXRfZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKLQotCSAgICBvc3RyZWFtID0gZm9wZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBGT1BFTl9XQik7Ci0JICAgIGlmIChvc3RyZWFtID09IE5VTEwpCi0JICAgICAgewotCQlwZXJyb3IgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkJeGV4aXQgKDEpOwotCSAgICAgIH0KLQotCSAgICBvdXRwdXRfZmlsZSA9IG9zdHJlYW07Ci0JICB9Ci0JZndyaXRlIChjYnVmLCAxLCBucmVhZCwgb3N0cmVhbSk7Ci0JbmNvcGllZCArPSB0b2NvcHk7Ci0gICAgICB9Ci0KLSAgaWYgKG9zdHJlYW0gIT0gTlVMTCkKLSAgICBmY2xvc2UgKG9zdHJlYW0pOwotCi0gIG91dHB1dF9maWxlID0gTlVMTDsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQotICBjaG1vZCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGJ1Zi5zdF9tb2RlKTsKLQotICBpZiAocHJlc2VydmVfZGF0ZXMpCi0gICAgc2V0X3RpbWVzIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSwgJmJ1Zik7Ci0KLSAgZnJlZSAoY2J1Zik7Ci19Ci0KLSNpZiAwCi0KLS8qIFdlIGRvbid0IHVzZSB0aGlzIGFueW1vcmUuICBUb28gbWFueSBzeXN0ZW1zIGV4cGVjdCBhciB0byByZWJ1aWxkCi0gICB0aGUgc3ltYm9sIHRhYmxlIGV2ZW4gd2hlbiBxIGlzIHVzZWQuICAqLwotCi0vKiBKdXN0IGRvIGl0IHF1aWNrbHk7IGRvbid0IHdvcnJ5IGFib3V0IGR1cHMsIGFybWFwLCBvciBhbnl0aGluZyBsaWtlIHRoYXQgKi8KLQotc3RhdGljIHZvaWQKLWRvX3F1aWNrX2FwcGVuZCAoYXJjaGl2ZV9maWxlbmFtZSwgZmlsZXNfdG9fYXBwZW5kKQotICAgICBjb25zdCBjaGFyICphcmNoaXZlX2ZpbGVuYW1lOwotICAgICBjaGFyICoqZmlsZXNfdG9fYXBwZW5kOwotewotICBGSUxFICpvZmlsZSwgKmlmaWxlOwotICBjaGFyICpidWYgPSB4bWFsbG9jIChCVUZTSVpFKTsKLSAgbG9uZyB0b2NvcHksIHRoaXN0aW1lOwotICBiZmQgKnRlbXA7Ci0gIHN0cnVjdCBzdGF0IHNidWY7Ci0gIGJvb2xlYW4gbmV3ZmlsZSA9IGZhbHNlOwotICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfbm9fZXJyb3IpOwotCi0gIGlmIChzdGF0IChhcmNoaXZlX2ZpbGVuYW1lLCAmc2J1ZikgIT0gMCkKLSAgICB7Ci0KLSNpZm5kZWYgX19HTzMyX18KLQotLyogS0xVREdFIEFMRVJUISBUZW1wb3JhcnkgZml4IHVudGlsIEkgZmlnZ2VyIHdoeQotICogc3RhdCgpIGlzIHdyb25nIC4uLiB0aGluayBpdCdzIGJ1cmllZCBpbiBHTzMyJ3MgSURUCi0gKiAtIEpheAotICovCi0KLSAgICAgIGlmIChlcnJubyAhPSBFTk9FTlQpCi0JYmZkX2ZhdGFsIChhcmNoaXZlX2ZpbGVuYW1lKTsKLSNlbmRpZgotCi0gICAgICBuZXdmaWxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgb2ZpbGUgPSBmb3BlbiAoYXJjaGl2ZV9maWxlbmFtZSwgRk9QRU5fQVVCKTsKLSAgaWYgKG9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgcGVycm9yIChwcm9ncmFtX25hbWUpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICB0ZW1wID0gYmZkX29wZW5yIChhcmNoaXZlX2ZpbGVuYW1lLCBOVUxMKTsKLSAgaWYgKHRlbXAgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfZmF0YWwgKGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLSAgaWYgKG5ld2ZpbGUgPT0gZmFsc2UpCi0gICAgewotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHRlbXAsIGJmZF9hcmNoaXZlKSAhPSB0cnVlKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZmF0YWwgKF8oIiVzIGlzIG5vdCBhbiBhcmNoaXZlIiksIGFyY2hpdmVfZmlsZW5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZ3cml0ZSAoQVJNQUcsIDEsIFNBUk1BRywgb2ZpbGUpOwotICAgICAgaWYgKCFzaWxlbnRfY3JlYXRlKQotCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY3JlYXRpbmcgJXNcbiIpLAotCQkgcHJvZ3JhbV9uYW1lLCBhcmNoaXZlX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGFyX3RydW5jYXRlKQotICAgIHRlbXAtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci0KLSAgLyogYXNzdW1lIGl0J3MgYW4gYWNoaXZlLCBnbyBzdHJhaWdodCB0byB0aGUgZW5kLCBzYW5zICQyMDAgKi8KLSAgZnNlZWsgKG9maWxlLCAwLCAyKTsKLQotICBmb3IgKDsgZmlsZXNfdG9fYXBwZW5kICYmICpmaWxlc190b19hcHBlbmQ7ICsrZmlsZXNfdG9fYXBwZW5kKQotICAgIHsKLSAgICAgIHN0cnVjdCBhcl9oZHIgKmhkciA9IGJmZF9zcGVjaWFsX3VuZG9jdW1lbnRlZF9nbHVlICh0ZW1wLCAqZmlsZXNfdG9fYXBwZW5kKTsKLSAgICAgIGlmIChoZHIgPT0gTlVMTCkKLQl7Ci0JICBiZmRfZmF0YWwgKCpmaWxlc190b19hcHBlbmQpOwotCX0KLQotICAgICAgQkZEX1NFTkQgKHRlbXAsIF9iZmRfdHJ1bmNhdGVfYXJuYW1lLCAodGVtcCwgKmZpbGVzX3RvX2FwcGVuZCwgKGNoYXIgKikgaGRyKSk7Ci0KLSAgICAgIGlmaWxlID0gZm9wZW4gKCpmaWxlc190b19hcHBlbmQsIEZPUEVOX1JCKTsKLSAgICAgIGlmIChpZmlsZSA9PSBOVUxMKQotCXsKLQkgIGJmZF9ub25mYXRhbCAoKmZpbGVzX3RvX2FwcGVuZCk7Ci0JfQotCi0gICAgICBpZiAoc3RhdCAoKmZpbGVzX3RvX2FwcGVuZCwgJnNidWYpICE9IDApCi0JewotCSAgYmZkX25vbmZhdGFsICgqZmlsZXNfdG9fYXBwZW5kKTsKLQl9Ci0KLSAgICAgIHRvY29weSA9IHNidWYuc3Rfc2l6ZTsKLQotICAgICAgLyogWFhYIHNob3VsZCBkbyBlcnJvci1jaGVja2luZyEgKi8KLSAgICAgIGZ3cml0ZSAoaGRyLCAxLCBzaXplb2YgKHN0cnVjdCBhcl9oZHIpLCBvZmlsZSk7Ci0KLSAgICAgIHdoaWxlICh0b2NvcHkgPiAwKQotCXsKLQkgIHRoaXN0aW1lID0gdG9jb3B5OwotCSAgaWYgKHRoaXN0aW1lID4gQlVGU0laRSkKLQkgICAgdGhpc3RpbWUgPSBCVUZTSVpFOwotCSAgZnJlYWQgKGJ1ZiwgMSwgdGhpc3RpbWUsIGlmaWxlKTsKLQkgIGZ3cml0ZSAoYnVmLCAxLCB0aGlzdGltZSwgb2ZpbGUpOwotCSAgdG9jb3B5IC09IHRoaXN0aW1lOwotCX0KLSAgICAgIGZjbG9zZSAoaWZpbGUpOwotICAgICAgaWYgKChzYnVmLnN0X3NpemUgJSAyKSA9PSAxKQotCXB1dGMgKCdcMDEyJywgb2ZpbGUpOwotICAgIH0KLSAgZmNsb3NlIChvZmlsZSk7Ci0gIGJmZF9jbG9zZSAodGVtcCk7Ci0gIGZyZWUgKGJ1Zik7Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9hcmNoaXZlIChpYXJjaCkKLSAgICAgYmZkICppYXJjaDsKLXsKLSAgYmZkICpvYmZkOwotICBjaGFyICpvbGRfbmFtZSwgKm5ld19uYW1lOwotICBiZmQgKmNvbnRlbnRzX2hlYWQgPSBpYXJjaC0+bmV4dDsKLQotICBvbGRfbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoaWFyY2gpKSArIDEpOwotICBzdHJjcHkgKG9sZF9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChpYXJjaCkpOwotICBuZXdfbmFtZSA9IG1ha2VfdGVtcG5hbWUgKG9sZF9uYW1lKTsKLQotICBvdXRwdXRfZmlsZW5hbWUgPSBuZXdfbmFtZTsKLQotICBvYmZkID0gYmZkX29wZW53IChuZXdfbmFtZSwgYmZkX2dldF90YXJnZXQgKGlhcmNoKSk7Ci0KLSAgaWYgKG9iZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKLQotICBvdXRwdXRfYmZkID0gb2JmZDsKLQotICBiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2FyY2hpdmUpOwotCi0gIC8qIFJlcXVlc3Qgd3JpdGluZyB0aGUgYXJjaGl2ZSBzeW1ib2wgdGFibGUgdW5sZXNzIHdlJ3ZlCi0gICAgIGJlZW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgbm90IHRvLiAgKi8KLSAgb2JmZC0+aGFzX2FybWFwID0gd3JpdGVfYXJtYXAgPj0gMDsKLQotICBpZiAoYXJfdHJ1bmNhdGUpCi0gICAgewotICAgICAgLyogVGhpcyBzaG91bGQgcmVhbGx5IHVzZSBiZmRfc2V0X2ZpbGVfZmxhZ3MsIGJ1dCB0aGF0IHJlamVjdHMKLSAgICAgICAgIGFyY2hpdmVzLiAgKi8KLSAgICAgIG9iZmQtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci0gICAgfQotCi0gIGlmIChiZmRfc2V0X2FyY2hpdmVfaGVhZCAob2JmZCwgY29udGVudHNfaGVhZCkgIT0gdHJ1ZSkKLSAgICBiZmRfZmF0YWwgKG9sZF9uYW1lKTsKLQotICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCi0gICAgYmZkX2ZhdGFsIChvbGRfbmFtZSk7Ci0KLSAgb3V0cHV0X2JmZCA9IE5VTEw7Ci0gIG91dHB1dF9maWxlbmFtZSA9IE5VTEw7Ci0KLSAgLyogV2UgZG9uJ3QgY2FyZSBpZiB0aGlzIGZhaWxzOyB3ZSBtaWdodCBiZSBjcmVhdGluZyB0aGUgYXJjaGl2ZS4gICovCi0gIGJmZF9jbG9zZSAoaWFyY2gpOwotCi0gIGlmIChzbWFydF9yZW5hbWUgKG5ld19uYW1lLCBvbGRfbmFtZSwgMCkgIT0gMCkKLSAgICB4ZXhpdCAoMSk7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIGVudHJ5IHdoaWNoIHNob3VsZCBiZSBycGxhY2QnZAotICAgaW50byB3aGVuIGFsdGVyaW5nLiAgREVGQVVMVF9QT1Mgc2hvdWxkIGJlIGhvdyB0byBpbnRlcnByZXQgcG9zX2RlZmF1bHQsCi0gICBhbmQgc2hvdWxkIGJlIGEgcG9zIHZhbHVlLiAgKi8KLQotc3RhdGljIGJmZCAqKgotZ2V0X3Bvc19iZmQgKGNvbnRlbnRzLCBkZWZhdWx0X3BvcywgZGVmYXVsdF9wb3NuYW1lKQotICAgICBiZmQgKipjb250ZW50czsKLSAgICAgZW51bSBwb3MgZGVmYXVsdF9wb3M7Ci0gICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfcG9zbmFtZTsKLXsKLSAgYmZkICoqYWZ0ZXJfYmZkID0gY29udGVudHM7Ci0gIGVudW0gcG9zIHJlYWxwb3M7Ci0gIGNvbnN0IGNoYXIgKnJlYWxwb3NuYW1lOwotCi0gIGlmIChwb3N0eXBlID09IHBvc19kZWZhdWx0KQotICAgIHsKLSAgICAgIHJlYWxwb3MgPSBkZWZhdWx0X3BvczsKLSAgICAgIHJlYWxwb3NuYW1lID0gZGVmYXVsdF9wb3NuYW1lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJlYWxwb3MgPSBwb3N0eXBlOwotICAgICAgcmVhbHBvc25hbWUgPSBwb3NuYW1lOwotICAgIH0KLQotICBpZiAocmVhbHBvcyA9PSBwb3NfZW5kKQotICAgIHsKLSAgICAgIHdoaWxlICgqYWZ0ZXJfYmZkKQotCWFmdGVyX2JmZCA9ICYoKCphZnRlcl9iZmQpLT5uZXh0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKDsgKmFmdGVyX2JmZDsgYWZ0ZXJfYmZkID0gJigqYWZ0ZXJfYmZkKS0+bmV4dCkKLQlpZiAoc3RyY21wICgoKmFmdGVyX2JmZCktPmZpbGVuYW1lLCByZWFscG9zbmFtZSkgPT0gMCkKLQkgIHsKLQkgICAgaWYgKHJlYWxwb3MgPT0gcG9zX2FmdGVyKQotCSAgICAgIGFmdGVyX2JmZCA9ICYoKmFmdGVyX2JmZCktPm5leHQ7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgIH0KLSAgcmV0dXJuIGFmdGVyX2JmZDsKLX0KLQotc3RhdGljIHZvaWQKLWRlbGV0ZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19kZWxldGUpCi0gICAgIGJmZCAqYXJjaDsKLSAgICAgY2hhciAqKmZpbGVzX3RvX2RlbGV0ZTsKLXsKLSAgYmZkICoqY3VycmVudF9wdHJfcHRyOwotICBib29sZWFuIGZvdW5kOwotICBib29sZWFuIHNvbWV0aGluZ19jaGFuZ2VkID0gZmFsc2U7Ci0gIGZvciAoOyAqZmlsZXNfdG9fZGVsZXRlICE9IE5VTEw7ICsrZmlsZXNfdG9fZGVsZXRlKQotICAgIHsKLSAgICAgIC8qIEluIGEub3V0IHN5c3RlbXMsIHRoZSBhcm1hcCBpcyBvcHRpb25hbC4gIEl0J3MgYWxzbyBjYWxsZWQKLQkgX18uU1lNREVGLiAgU28gaWYgdGhlIHVzZXIgYXNrZWQgdG8gZGVsZXRlIGl0LCB3ZSBzaG91bGQgcmVtZW1iZXIKLQkgdGhhdCBmYWN0LiBUaGlzIGlzbid0IHF1aXRlIHJpZ2h0IGZvciBDT0ZGIHN5c3RlbXMgKHdoZXJlCi0JIF9fLlNZTURFRiBtaWdodCBiZSByZWd1bGFyIG1lbWJlciksIGJ1dCBpdCdzIHZlcnkgdW5saWtlbHkKLQkgdG8gYmUgYSBwcm9ibGVtLiAgRklYTUUgKi8KLQotICAgICAgaWYgKCFzdHJjbXAgKCpmaWxlc190b19kZWxldGUsICJfXy5TWU1ERUYiKSkKLQl7Ci0JICBhcmNoLT5oYXNfYXJtYXAgPSBmYWxzZTsKLQkgIHdyaXRlX2FybWFwID0gLTE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGZvdW5kID0gZmFsc2U7Ci0gICAgICBjdXJyZW50X3B0cl9wdHIgPSAmKGFyY2gtPm5leHQpOwotICAgICAgd2hpbGUgKCpjdXJyZW50X3B0cl9wdHIpCi0JewotCSAgaWYgKHN0cmNtcCAoKmZpbGVzX3RvX2RlbGV0ZSwgKCpjdXJyZW50X3B0cl9wdHIpLT5maWxlbmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgICBzb21ldGhpbmdfY2hhbmdlZCA9IHRydWU7Ci0JICAgICAgaWYgKHZlcmJvc2UpCi0JCXByaW50ZiAoImQgLSAlc1xuIiwKLQkJCSpmaWxlc190b19kZWxldGUpOwotCSAgICAgICpjdXJyZW50X3B0cl9wdHIgPSAoKCpjdXJyZW50X3B0cl9wdHIpLT5uZXh0KTsKLQkgICAgICBnb3RvIG5leHRfZmlsZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY3VycmVudF9wdHJfcHRyID0gJigoKmN1cnJlbnRfcHRyX3B0ciktPm5leHQpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodmVyYm9zZSAmJiBmb3VuZCA9PSBmYWxzZSkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgcHJpbnRmIChfKCJObyBtZW1iZXIgbmFtZWQgYCVzJ1xuIiksICpmaWxlc190b19kZWxldGUpOwotCX0KLSAgICBuZXh0X2ZpbGU6Ci0gICAgICA7Ci0gICAgfQotCi0gIGlmIChzb21ldGhpbmdfY2hhbmdlZCA9PSB0cnVlKQotICAgIHsKLSAgICAgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotICAgIH0KLX0KLQotCi0vKiBSZXBvc2l0aW9uIGV4aXN0aW5nIG1lbWJlcnMgd2l0aGluIGFuIGFyY2hpdmUgKi8KLQotc3RhdGljIHZvaWQKLW1vdmVfbWVtYmVycyAoYXJjaCwgZmlsZXNfdG9fbW92ZSkKLSAgICAgYmZkICphcmNoOwotICAgICBjaGFyICoqZmlsZXNfdG9fbW92ZTsKLXsKLSAgYmZkICoqYWZ0ZXJfYmZkOwkJLyogTmV3IGVudHJpZXMgZ28gYWZ0ZXIgdGhpcyBvbmUgKi8KLSAgYmZkICoqY3VycmVudF9wdHJfcHRyOwkvKiBjZHIgcG9pbnRlciBpbnRvIGNvbnRlbnRzICovCi0KLSAgZm9yICg7ICpmaWxlc190b19tb3ZlOyArK2ZpbGVzX3RvX21vdmUpCi0gICAgewotICAgICAgY3VycmVudF9wdHJfcHRyID0gJihhcmNoLT5uZXh0KTsKLSAgICAgIHdoaWxlICgqY3VycmVudF9wdHJfcHRyKQotCXsKLQkgIGJmZCAqY3VycmVudF9wdHIgPSAqY3VycmVudF9wdHJfcHRyOwotCSAgaWYgKHN0cmNtcCAobm9ybWFsaXplICgqZmlsZXNfdG9fbW92ZSwgYXJjaCksCi0JCSAgICAgIGN1cnJlbnRfcHRyLT5maWxlbmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIE1vdmUgdGhpcyBmaWxlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgLSBmaXJzdCBjdXQgZnJvbQotCQkgd2hlcmUgaXQgaXMuICAqLwotCSAgICAgIGJmZCAqbGluazsKLQkgICAgICAqY3VycmVudF9wdHJfcHRyID0gY3VycmVudF9wdHItPm5leHQ7Ci0KLQkgICAgICAvKiBOb3cgZ2x1ZSB0byBlbmQgKi8KLQkgICAgICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19lbmQsIE5VTEwpOwotCSAgICAgIGxpbmsgPSAqYWZ0ZXJfYmZkOwotCSAgICAgICphZnRlcl9iZmQgPSBjdXJyZW50X3B0cjsKLQkgICAgICBjdXJyZW50X3B0ci0+bmV4dCA9IGxpbms7Ci0KLQkgICAgICBpZiAodmVyYm9zZSkKLQkJcHJpbnRmICgibSAtICVzXG4iLCAqZmlsZXNfdG9fbW92ZSk7Ci0KLQkgICAgICBnb3RvIG5leHRfZmlsZTsKLQkgICAgfQotCi0JICBjdXJyZW50X3B0cl9wdHIgPSAmKCgqY3VycmVudF9wdHJfcHRyKS0+bmV4dCk7Ci0JfQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGVudHJ5ICVzIGluIGFyY2hpdmUgJXMhXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCAqZmlsZXNfdG9fbW92ZSwgYXJjaC0+ZmlsZW5hbWUpOwotICAgICAgeGV4aXQgKDEpOwotICAgIG5leHRfZmlsZTo7Ci0gICAgfQotCi0gIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotfQotCi0vKiBPdWdodCB0byBkZWZhdWx0IHRvIHJlcGxhY2luZyBpbiBwbGFjZSwgYnV0IHRoaXMgaXMgZXhpc3RpbmcgcHJhY3RpY2UhICAqLwotCi1zdGF0aWMgdm9pZAotcmVwbGFjZV9tZW1iZXJzIChhcmNoLCBmaWxlc190b19tb3ZlLCBxdWljaykKLSAgICAgYmZkICphcmNoOwotICAgICBjaGFyICoqZmlsZXNfdG9fbW92ZTsKLSAgICAgYm9vbGVhbiBxdWljazsKLXsKLSAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gIGJmZCAqKmFmdGVyX2JmZDsJCS8qIE5ldyBlbnRyaWVzIGdvIGFmdGVyIHRoaXMgb25lICovCi0gIGJmZCAqY3VycmVudDsKLSAgYmZkICoqY3VycmVudF9wdHI7Ci0gIGJmZCAqdGVtcDsKLQotICB3aGlsZSAoZmlsZXNfdG9fbW92ZSAmJiAqZmlsZXNfdG9fbW92ZSkKLSAgICB7Ci0gICAgICBpZiAoISBxdWljaykKLQl7Ci0JICBjdXJyZW50X3B0ciA9ICZhcmNoLT5uZXh0OwotCSAgd2hpbGUgKCpjdXJyZW50X3B0cikKLQkgICAgewotCSAgICAgIGN1cnJlbnQgPSAqY3VycmVudF9wdHI7Ci0KLQkgICAgICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGFyIHByb2dyYW1zLCB3ZQotCQkgcGVybWl0IHRoZSBzYW1lIGZpbGUgdG8gYmUgYWRkZWQgbXVsdGlwbGUgdGltZXMuICAqLwotCSAgICAgIGlmIChzdHJjbXAgKG5vcm1hbGl6ZSAoKmZpbGVzX3RvX21vdmUsIGFyY2gpLAotCQkJICBub3JtYWxpemUgKGN1cnJlbnQtPmZpbGVuYW1lLCBhcmNoKSkgPT0gMAotCQkgICYmIGN1cnJlbnQtPmFyZWx0X2RhdGEgIT0gTlVMTCkKLQkJewotCQkgIGlmIChuZXdlcl9vbmx5KQotCQkgICAgewotCQkgICAgICBzdHJ1Y3Qgc3RhdCBmc2J1ZiwgYXNidWY7Ci0KLQkJICAgICAgaWYgKHN0YXQgKCpmaWxlc190b19tb3ZlLCAmZnNidWYpICE9IDApCi0JCQl7Ci0JCQkgIGlmIChlcnJubyAhPSBFTk9FTlQpCi0JCQkgICAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7Ci0JCQkgIGdvdG8gbmV4dF9maWxlOwotCQkJfQotCQkgICAgICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGN1cnJlbnQsICZhc2J1ZikgIT0gMCkKLQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQlmYXRhbCAoXygiaW50ZXJuYWwgc3RhdCBlcnJvciBvbiAlcyIpLCBjdXJyZW50LT5maWxlbmFtZSk7Ci0KLQkJICAgICAgaWYgKGZzYnVmLnN0X210aW1lIDw9IGFzYnVmLnN0X210aW1lKQotCQkJZ290byBuZXh0X2ZpbGU7Ci0JCSAgICB9Ci0KLQkJICBhZnRlcl9iZmQgPSBnZXRfcG9zX2JmZCAoJmFyY2gtPm5leHQsIHBvc19hZnRlciwKLQkJCQkJICAgY3VycmVudC0+ZmlsZW5hbWUpOwotCQkgIHRlbXAgPSAqYWZ0ZXJfYmZkOwotCi0JCSAgKmFmdGVyX2JmZCA9IGJmZF9vcGVuciAoKmZpbGVzX3RvX21vdmUsIE5VTEwpOwotCQkgIGlmICgqYWZ0ZXJfYmZkID09IChiZmQgKikgTlVMTCkKLQkJICAgIHsKLQkJICAgICAgYmZkX2ZhdGFsICgqZmlsZXNfdG9fbW92ZSk7Ci0JCSAgICB9Ci0JCSAgKCphZnRlcl9iZmQpLT5uZXh0ID0gdGVtcDsKLQotCQkgIC8qIHNuaXAgb3V0IHRoaXMgZW50cnkgZnJvbSB0aGUgY2hhaW4gKi8KLQkJICAqY3VycmVudF9wdHIgPSAoKmN1cnJlbnRfcHRyKS0+bmV4dDsKLQotCQkgIGlmICh2ZXJib3NlKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCJyIC0gJXNcbiIsICpmaWxlc190b19tb3ZlKTsKLQkJICAgIH0KLQotCQkgIGNoYW5nZWQgPSB0cnVlOwotCi0JCSAgZ290byBuZXh0X2ZpbGU7Ci0JCX0KLQkgICAgICBjdXJyZW50X3B0ciA9ICYoY3VycmVudC0+bmV4dCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFkZCB0byB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLiAgKi8KLQotICAgICAgYWZ0ZXJfYmZkID0gZ2V0X3Bvc19iZmQgKCZhcmNoLT5uZXh0LCBwb3NfZW5kLCBOVUxMKTsKLSAgICAgIHRlbXAgPSAqYWZ0ZXJfYmZkOwotICAgICAgKmFmdGVyX2JmZCA9IGJmZF9vcGVuciAoKmZpbGVzX3RvX21vdmUsIE5VTEwpOwotICAgICAgaWYgKCphZnRlcl9iZmQgPT0gKGJmZCAqKSBOVUxMKQotCXsKLQkgIGJmZF9mYXRhbCAoKmZpbGVzX3RvX21vdmUpOwotCX0KLSAgICAgIGlmICh2ZXJib3NlKQotCXsKLQkgIHByaW50ZiAoImEgLSAlc1xuIiwgKmZpbGVzX3RvX21vdmUpOwotCX0KLQotICAgICAgKCphZnRlcl9iZmQpLT5uZXh0ID0gdGVtcDsKLQotICAgICAgY2hhbmdlZCA9IHRydWU7Ci0KLSAgICBuZXh0X2ZpbGU6OwotCi0gICAgICBmaWxlc190b19tb3ZlKys7Ci0gICAgfQotCi0gIGlmIChjaGFuZ2VkKQotICAgIHdyaXRlX2FyY2hpdmUgKGFyY2gpOwotfQotCi1zdGF0aWMgdm9pZAotcmFubGliX29ubHkgKGFyY2huYW1lKQotICAgICBjb25zdCBjaGFyICphcmNobmFtZTsKLXsKLSAgYmZkICphcmNoOwotCi0gIHdyaXRlX2FybWFwID0gMTsKLSAgYXJjaCA9IG9wZW5faW5hcmNoIChhcmNobmFtZSwgKGNoYXIgKikgTlVMTCk7Ci0gIGlmIChhcmNoID09IE5VTEwpCi0gICAgeGV4aXQgKDEpOwotICB3cml0ZV9hcmNoaXZlIChhcmNoKTsKLX0KLQotLyogVXBkYXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHN5bWJvbCBtYXAgb2YgYW4gYXJjaGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1yYW5saWJfdG91Y2ggKGFyY2huYW1lKQotICAgICBjb25zdCBjaGFyICphcmNobmFtZTsKLXsKLSNpZmRlZiBfX0dPMzJfXwotICAvKiBJIGRvbid0IHRoaW5rIHVwZGF0aW5nIHdvcmtzIG9uIGdvMzIuICAqLwotICByYW5saWJfb25seSAoYXJjaG5hbWUpOwotI2Vsc2UKLSAgaW50IGY7Ci0gIGJmZCAqYXJjaDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGYgPSBvcGVuIChhcmNobmFtZSwgT19SRFdSIHwgT19CSU5BUlksIDApOwotICBpZiAoZiA8IDApCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGJmZF9mYXRhbCAoYXJjaG5hbWUpOwotICAgIH0KLQotICBhcmNoID0gYmZkX2Zkb3BlbnIgKGFyY2huYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmKTsKLSAgaWYgKGFyY2ggPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGFyY2huYW1lKTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhcmNoLCBiZmRfYXJjaGl2ZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGFyY2huYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoISBiZmRfaGFzX21hcCAoYXJjaCkpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiJXM6IG5vIGFyY2hpdmUgbWFwIHRvIHVwZGF0ZSIpLCBhcmNobmFtZSk7Ci0KLSAgYmZkX3VwZGF0ZV9hcm1hcF90aW1lc3RhbXAgKGFyY2gpOwotCi0gIGlmICghIGJmZF9jbG9zZSAoYXJjaCkpCi0gICAgYmZkX2ZhdGFsIChhcmNobmFtZSk7Ci0jZW5kaWYKLX0KLQotLyogVGhpbmdzIHdoaWNoIGFyZSBpbnRlcmVzdGluZyB0byBtYXAgb3ZlciBhbGwgb3Igc29tZSBvZiB0aGUgZmlsZXM6ICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9kZXNjciAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBwcmludF9hcmVsdF9kZXNjciAoc3Rkb3V0LCBhYmZkLCB2ZXJib3NlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FybGV4LmwgYi9iaW51dGlscy9hcmxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGUxM2QxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2FybGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0lewotLyogYXJsZXgubCAtIFN0cmFuZ2Ugc2NyaXB0IGxhbmd1YWdlIGxleGVyICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJhcnBhcnNlLmgiCi0KLWludCBsaW5lbnVtYmVyOwotJX0KLSUlCi0KLSJBRERMSUIiICAgCXsgcmV0dXJuIEFERExJQjsgfQotIkFERE1PRCIgICAJeyByZXR1cm4gQURETU9EOyB9Ci0iQ0xFQVIiICAgCXsgcmV0dXJuIENMRUFSOyB9Ci0iQ1JFQVRFIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KLSJERUxFVEUiICAgCXsgcmV0dXJuIERFTEVURTsgfQotIkRJUkVDVE9SWSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9Ci0iRU5EIiAgIAl7IHJldHVybiBFTkQ7IH0KLSJFWFRSQUNUIiAgIAl7IHJldHVybiBFWFRSQUNUOyB9Ci0iRlVMTERJUiIgICAJeyByZXR1cm4gRlVMTERJUjsgfQotIkhFTFAiICAgCXsgcmV0dXJuIEhFTFA7IH0KLSJMSVNUIgkJeyByZXR1cm4gTElTVDsgfQotIk9QRU4iICAgCXsgcmV0dXJuIE9QRU47IH0KLSJSRVBMQUNFIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9Ci0iVkVSQk9TRSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQotIlNBVkUiICAgCXsgcmV0dXJuIFNBVkU7IH0KLSJhZGRsaWIiICAgCXsgcmV0dXJuIEFERExJQjsgfQotImFkZG1vZCIgICAJeyByZXR1cm4gQURETU9EOyB9Ci0iY2xlYXIiICAgCXsgcmV0dXJuIENMRUFSOyB9Ci0iY3JlYXRlIiAgIAl7IHJldHVybiBDUkVBVEU7IH0KLSJkZWxldGUiICAgCXsgcmV0dXJuIERFTEVURTsgfQotImRpcmVjdG9yeSIgICAJeyByZXR1cm4gRElSRUNUT1JZOyB9Ci0iZW5kIiAgIAl7IHJldHVybiBFTkQ7IH0KLSJleHRyYWN0IiAgIAl7IHJldHVybiBFWFRSQUNUOyB9Ci0iZnVsbGRpciIgICAJeyByZXR1cm4gRlVMTERJUjsgfQotImhlbHAiICAgCXsgcmV0dXJuIEhFTFA7IH0KLSJsaXN0IgkJeyByZXR1cm4gTElTVDsgfQotIm9wZW4iICAgCXsgcmV0dXJuIE9QRU47IH0KLSJyZXBsYWNlIiAgIAl7IHJldHVybiBSRVBMQUNFOyB9Ci0idmVyYm9zZSIgICAJeyByZXR1cm4gVkVSQk9TRTsgfQotInNhdmUiICAgCXsgcmV0dXJuIFNBVkU7IH0KLSIrXG4iICAgICAgICAgICB7IGxpbmVudW1iZXIgKys7IH0KLSIoIiAgICAgICAgICAgICB7IHJldHVybiAnKCc7IH0KLSIpIiAgICAgICAgICAgICB7IHJldHVybiAnKSc7IH0KLSIsIiAgICAgICAgICAgICB7IHJldHVybiAnLCc7IH0KLVtBLVphLXowLTkvJDouXC1cX10rICB7IAkKLQkJeXlsdmFsLm5hbWUgPSAgeHN0cmR1cCAoeXl0ZXh0KTsKLQkJcmV0dXJuIEZJTEVOQU1FOwotCQl9Ci0iKiIuKiAJCXsgfQotIjsiLiogCQl7IH0KLSIgIgkJeyB9Ci0iXG4iCSAJIHsgbGluZW51bWJlciArKzsgcmV0dXJuIE5FV0xJTkU7IH0JCi0KLSUlCi0jaWZuZGVmIHl5d3JhcAotLyogTmVlZGVkIGZvciBsZXgsIHRob3VnaCBub3QgZmxleC4gKi8KLWludCB5eXdyYXAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2FycGFyc2UueSBiL2JpbnV0aWxzL2FycGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjNzYwMC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotJXsKLS8qIGFycGFyc2UueSAtIFN0YW5nZSBzY3JpcHQgbGFuZ3VhZ2UgcGFyc2VyICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTUsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiYXJzdXAuaCIKLWV4dGVybiBpbnQgdmVyYm9zZTsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqbmFtZTsKLXN0cnVjdCBsaXN0ICpsaXN0IDsKLQotfTsKLQotJXRva2VuIE5FV0xJTkUKLSV0b2tlbiBWRVJCT1NFCi0ldG9rZW4gPG5hbWU+IEZJTEVOQU1FCi0ldG9rZW4gQURETElCCi0ldG9rZW4gTElTVAotJXRva2VuIEFERE1PRAotJXRva2VuIENMRUFSCi0ldG9rZW4gQ1JFQVRFCi0ldG9rZW4gREVMRVRFCi0ldG9rZW4gRElSRUNUT1JZCi0ldG9rZW4gRU5ECi0ldG9rZW4gRVhUUkFDVAotJXRva2VuIEZVTExESVIKLSV0b2tlbiBIRUxQCi0ldG9rZW4gUVVJVAotJXRva2VuIFJFUExBQ0UKLSV0b2tlbiBTQVZFCi0ldG9rZW4gT1BFTgotCi0ldHlwZSA8bGlzdD4gbW9kdWxlbGlzdCAKLSV0eXBlIDxsaXN0PiBtb2R1bGVuYW1lCi0ldHlwZSA8bmFtZT4gb3B0aW9uYWxfZmlsZW5hbWUKLSUlCi0KLXN0YXJ0OgotCXsgcHJvbXB0KCk7IH0gc2Vzc2lvbgotCTsKLQotc2Vzc2lvbjoKLQkgICAgc2Vzc2lvbiBjb21tYW5kX2xpbmUKLQl8Ci0JOwotCi1jb21tYW5kX2xpbmU6Ci0JCWNvbW1hbmQgTkVXTElORSB7IHByb21wdCgpOyB9Ci0KLWNvbW1hbmQ6Ci0JCW9wZW5fY29tbWFuZAkKLQl8CWNyZWF0ZV9jb21tYW5kCQotCXwgCXZlcmJvc2VfY29tbWFuZAotCXwJZGlyZWN0b3J5X2NvbW1hbmQKLQl8CWFkZGxpYl9jb21tYW5kCi0JfAljbGVhcl9jb21tYW5kCi0JfAlhZGRtb2RfY29tbWFuZAotCXwgCXNhdmVfY29tbWFuZAotICAgICAgICB8ICAgICAgIGV4dHJhY3RfY29tbWFuZAotCXwJcmVwbGFjZV9jb21tYW5kCi0JfAlkZWxldGVfY29tbWFuZAotCXwJbGlzdF9jb21tYW5kCi0JfCAJRU5ECSB7IGFyX2VuZCgpOyByZXR1cm4gMDsgfQotCXwgCWVycm9yCi0JfCAgICAgICBGSUxFTkFNRSB7IHl5ZXJyb3IoImZvbyIpOyB9Ci0JfAotCTsKLQotCi1leHRyYWN0X2NvbW1hbmQ6Ci0gICAgICAgICAgICAgICAgRVhUUkFDVCBtb2R1bGVuYW1lCi0JCXsgYXJfZXh0cmFjdCgkMik7IH0KLQk7Ci0KLXJlcGxhY2VfY29tbWFuZDoJCi0JCVJFUExBQ0UgbW9kdWxlbmFtZQotCQl7IGFyX3JlcGxhY2UoJDIpOyB9Ci0JOwotCQotY2xlYXJfY29tbWFuZDoKLQkJQ0xFQVIKLQkJeyBhcl9jbGVhcigpOyB9Ci0JOwotCi1kZWxldGVfY29tbWFuZDoKLQkJREVMRVRFIG1vZHVsZW5hbWUKLQkJeyBhcl9kZWxldGUoJDIpOyB9Ci0JOwotYWRkbW9kX2NvbW1hbmQ6Ci0JQURETU9EIG1vZHVsZW5hbWUKLQkJeyBhcl9hZGRtb2QoJDIpOyB9Ci0JOwotCi1saXN0X2NvbW1hbmQ6CQotCQlMSVNUCi0JCXsgYXJfbGlzdCgpOyB9Ci0JOwotCi1zYXZlX2NvbW1hbmQ6CQotCQlTQVZFCi0JCXsgYXJfc2F2ZSgpOyB9Ci0JOwotCi0KLQotb3Blbl9jb21tYW5kOgotCQlPUEVOIEZJTEVOQU1FIAotCQl7IGFyX29wZW4oJDIsMCk7IH0KLQk7Ci0KLWNyZWF0ZV9jb21tYW5kOgotCQlDUkVBVEUgRklMRU5BTUUgCi0JCXsgYXJfb3BlbigkMiwxKTsgfQotCTsKLQotCi1hZGRsaWJfY29tbWFuZDoKLQkJQURETElCIEZJTEVOQU1FIG1vZHVsZWxpc3QKLQkJeyBhcl9hZGRsaWIoJDIsJDMpOyB9Ci0JOwotZGlyZWN0b3J5X2NvbW1hbmQ6Ci0JCURJUkVDVE9SWSBGSUxFTkFNRSBtb2R1bGVsaXN0IG9wdGlvbmFsX2ZpbGVuYW1lCi0JCXsgYXJfZGlyZWN0b3J5KCQyLCAkMywgJDQpOyB9Ci0JOwotCi0KLQotb3B0aW9uYWxfZmlsZW5hbWU6Ci0JCUZJTEVOQU1FCi0JCXsgJCQgPSAkMTsgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0KLW1vZHVsZWxpc3Q6Ci0JJygnIG1vZHVsZW5hbWUgJyknIAotCQl7ICQkID0gJDI7IH0KLQl8Ci0JCXsgJCQgPSAwOyB9Ci0JOwotCi1tb2R1bGVuYW1lOgotCQltb2R1bGVuYW1lIG9wdGNvbW1hIEZJTEVOQU1FCi0JCXsgCXN0cnVjdCBsaXN0ICpuICA9IChzdHJ1Y3QgbGlzdCAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaXN0KSk7Ci0JCQluLT5uZXh0ID0gJDE7IAotCQkJbi0+bmFtZSA9ICQzOwotCQkJJCQgPSBuOwotCQkgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci0JCi0KLW9wdGNvbW1hOgotCQknLCcKLQl8Ci0JOwotCQotCQkKLXZlcmJvc2VfY29tbWFuZDoKLQlWRVJCT1NFIAotCQl7IHZlcmJvc2UgPSAhdmVyYm9zZTsgfQotCTsKLQotCi0lJQotCi1zdGF0aWMgaW50Ci15eWVycm9yICh4KQotICAgICBjb25zdCBjaGFyICp4OwotewotICBleHRlcm4gaW50IGxpbmVudW1iZXI7Ci0KLSAgcHJpbnRmIChfKCJTeW50YXggZXJyb3IgaW4gYXJjaGl2ZSBzY3JpcHQsIGxpbmUgJWRcbiIpLCBsaW5lbnVtYmVyICsgMSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYXJzdXAuYyBiL2JpbnV0aWxzL2Fyc3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZmQ2OTUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYXJzdXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKiBhcnN1cC5jIC0gQXJjaGl2ZSBzdXBwb3J0IGZvciBNUkkgY29tcGF0aWJpbGl0eQotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGxvb2tzIGFmdGVyIHJlcXVlc3RzIGZyb20gYXJwYXJzZS55LCB0byBwcm92aWRlIHRoZSBNUkkKLXN0eWxlIGxpYnJhcmlhbiBjb21tYW5kIHN5bnRheCArIDEgd29yZCBMSVNUCi0KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhcnN1cC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi1zdGF0aWMgdm9pZCBtYXBfb3Zlcl9saXN0Ci0gIFBBUkFNUyAoKGJmZCAqLCB2b2lkICgqZnVuY3Rpb24pIChiZmQgKiwgYmZkICopLCBzdHJ1Y3QgbGlzdCAqKSk7Ci1zdGF0aWMgdm9pZCBhcl9kaXJlY3RvcnlfZG9lciBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIGFyX2FkZGxpYl9kb2VyIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotCi1leHRlcm4gaW50IHZlcmJvc2U7Ci0KLXN0YXRpYyB2b2lkCi1tYXBfb3Zlcl9saXN0IChhcmNoLCBmdW5jdGlvbiwgbGlzdCkKLSAgICAgYmZkICphcmNoOwotICAgICB2b2lkICgqZnVuY3Rpb24pIFBBUkFNUyAoKGJmZCAqLCBiZmQgKikpOwotICAgICBzdHJ1Y3QgbGlzdCAqbGlzdDsKLXsKLSAgYmZkICpoZWFkOwotCi0gIGlmIChsaXN0ID09IE5VTEwpCi0gICAgewotICAgICAgYmZkICpuZXh0OwotCi0gICAgICBoZWFkID0gYXJjaC0+bmV4dDsKLSAgICAgIHdoaWxlIChoZWFkICE9IE5VTEwpCi0JewotCSAgbmV4dCA9IGhlYWQtPm5leHQ7Ci0JICBmdW5jdGlvbiAoaGVhZCwgKGJmZCAqKSBOVUxMKTsKLQkgIGhlYWQgPSBuZXh0OwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbGlzdCAqcHRyOwotCi0gICAgICAvKiBUaGlzIG1heSBhcHBlYXIgdG8gYmUgYSBiYXJvcXVlIHdheSBvZiBhY2NvbXBsaXNoaW5nIHdoYXQgd2UKLQkgd2FudC4gIGhvd2V2ZXIgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIGZpbGVuYW1lcyBpbiBvcmRlcgotCSB0byBub3RpY2Ugd2hlcmUgYSBmaWxlbmFtZSBpcyByZXF1ZXN0ZWQgYnV0IGRvZXMgbm90IGV4aXN0IGluCi0JIHRoZSBhcmNoaXZlLiAgRGl0dG8gbWFwcGluZyBvdmVyIGVhY2ggZmlsZSBlYWNoIHRpbWUgLS0gd2UKLQkgd2FudCB0byBoYWNrIG11bHRpcGxlIHJlZmVyZW5jZXMuICAqLwotICAgICAgZm9yIChwdHIgPSBsaXN0OyBwdHI7IHB0ciA9IHB0ci0+bmV4dCkKLQl7Ci0JICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JICBiZmQgKnByZXYgPSBhcmNoOwotCi0JICBmb3IgKGhlYWQgPSBhcmNoLT5uZXh0OyBoZWFkOyBoZWFkID0gaGVhZC0+bmV4dCkgCi0JICAgIHsKLQkgICAgICBpZiAoaGVhZC0+ZmlsZW5hbWUgIT0gTlVMTAotCQkgICYmIHN0cmNtcCAocHRyLT5uYW1lLCBoZWFkLT5maWxlbmFtZSkgPT0gMCkKLQkJewotCQkgIGZvdW5kID0gdHJ1ZTsKLQkJICBmdW5jdGlvbiAoaGVhZCwgcHJldik7Ci0JCX0KLQkgICAgICBwcmV2ID0gaGVhZDsKLQkgICAgfQotCSAgaWYgKCEgZm91bmQpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiTm8gZW50cnkgJXMgaW4gYXJjaGl2ZS5cbiIpLCBwdHItPm5hbWUpOwotCX0KLSAgICB9Ci19Ci0KLQotRklMRSAqb3V0ZmlsZTsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotYXJfZGlyZWN0b3J5X2RvZXIgKGFiZmQsIGlnbm9yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBiZmQgKmlnbm9yZTsKLXsKLSAgICBwcmludF9hcmVsdF9kZXNjcihvdXRmaWxlLCBhYmZkLCB2ZXJib3NlKTsKLX0KLQotdm9pZAotYXJfZGlyZWN0b3J5IChhcl9uYW1lLCBsaXN0LCBvdXRwdXQpCi0gICAgIGNoYXIgKmFyX25hbWU7Ci0gICAgIHN0cnVjdCBsaXN0ICpsaXN0OwotICAgICBjaGFyICpvdXRwdXQ7Ci17Ci0gIGJmZCAqYXJjaDsKLQotICBhcmNoID0gb3Blbl9pbmFyY2ggKGFyX25hbWUsIChjaGFyICopIE5VTEwpOwotICBpZiAob3V0cHV0KQotICAgIHsKLSAgICAgIG91dGZpbGUgPSBmb3BlbihvdXRwdXQsInciKTsKLSAgICAgIGlmIChvdXRmaWxlID09IDApCi0JewotCSAgb3V0ZmlsZSA9IHN0ZG91dDsKLQkgIGZwcmludGYgKHN0ZGVycixfKCJDYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBvdXRwdXQpOwotCSAgb3V0cHV0ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIAotICAgIG91dGZpbGUgPSBzdGRvdXQ7Ci0KLSAgbWFwX292ZXJfbGlzdCAoYXJjaCwgYXJfZGlyZWN0b3J5X2RvZXIsIGxpc3QpOwotCi0gIGJmZF9jbG9zZSAoYXJjaCk7Ci0KLSAgaWYgKG91dHB1dCkKLSAgIGZjbG9zZSAob3V0ZmlsZSk7Ci19Ci0KLXZvaWQKLURFRlVOX1ZPSUQocHJvbXB0KQotewotICBleHRlcm4gaW50IGludGVyYWN0aXZlOwotICBpZiAoaW50ZXJhY3RpdmUpIAotICB7Ci0gICAgcHJpbnRmKCJBUiA+Iik7Ci0gICAgZmZsdXNoKHN0ZG91dCk7IAotICB9Ci19Ci0KLXZvaWQKLW1heWJlcXVpdCAoKQotewotICBpZiAoISBpbnRlcmFjdGl2ZSkgCi0gICAgeGV4aXQgKDkpOwotfQotCi0KLWJmZCAqb2JmZDsKLWNoYXIgKnJlYWxfbmFtZSA7IAotdm9pZAotREVGVU4oYXJfb3BlbiwobmFtZSwgdCksCi0gICAgICBjaGFyICpuYW1lIEFORAotICAgICAgaW50IHQpCi0KLXsKLSAgY2hhciAqdG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMTApOwotICByZWFsX25hbWUgPSBuYW1lOwotICBzcHJpbnRmKHRuYW1lLCAiJXMtdG1wIiwgbmFtZSk7Ci0gIG9iZmQgPSBiZmRfb3BlbncodG5hbWUsIE5VTEwpOwotCi0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLF8oIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBhcmNoaXZlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICB0bmFtZSk7Ci0KLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIHsKLSAgICBpZiAoIXQpIHsKLSAgICAgIGJmZCAqKnB0cjsKLSAgICAgIGJmZCAqZWxlbWVudDsKLSAgICAgIGJmZCAqaWJmZDsKLSAgICAgIGliZmQgPSBiZmRfb3BlbnIobmFtZSwgTlVMTCk7Ci0gICAgICBpZiAoIWliZmQpIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBhcmNoaXZlICVzXG4iKSwKLQkJcHJvZ3JhbV9uYW1lLCBuYW1lKTsKLQltYXliZXF1aXQoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoYmZkX2NoZWNrX2Zvcm1hdChpYmZkLCBiZmRfYXJjaGl2ZSkgIT0gdHJ1ZSkgewotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBmaWxlICVzIGlzIG5vdCBhbiBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQluYW1lKTsKLQltYXliZXF1aXQoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0gICAgICBwdHIgPSAmKG9iZmQtPmFyY2hpdmVfaGVhZCk7Ci0gICAgICBlbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShpYmZkLCBOVUxMKTsKLQotICAgICAgd2hpbGUgKGVsZW1lbnQpIHsKLQkqcHRyID0gZWxlbWVudDsKLQlwdHIgPSAmZWxlbWVudC0+bmV4dDsKLQllbGVtZW50ID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZShpYmZkLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBiZmRfc2V0X2Zvcm1hdChvYmZkLCBiZmRfYXJjaGl2ZSk7Ci0KLSAgICBvYmZkLT5oYXNfYXJtYXAgPSAxOwotICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWFyX2FkZGxpYl9kb2VyIChhYmZkLCBwcmV2KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqcHJldjsKLXsKLSAgLyogQWRkIHRoaXMgbW9kdWxlIHRvIHRoZSBvdXRwdXQgYmZkICovCi0gIGlmIChwcmV2ICE9IE5VTEwpCi0gICAgcHJldi0+bmV4dCA9IGFiZmQtPm5leHQ7Ci0gIGFiZmQtPm5leHQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0gIG9iZmQtPmFyY2hpdmVfaGVhZCA9IGFiZmQ7Ci19Ci0KLXZvaWQKLWFyX2FkZGxpYiAobmFtZSwgbGlzdCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGxpc3QgKmxpc3Q7Ci17Ci0gIGlmIChvYmZkID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gb3V0cHV0IGFyY2hpdmUgc3BlY2lmaWVkIHlldFxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgICBtYXliZXF1aXQgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkICphcmNoOwotCi0gICAgICBhcmNoID0gb3Blbl9pbmFyY2ggKG5hbWUsIChjaGFyICopIE5VTEwpOwotICAgICAgaWYgKGFyY2ggIT0gTlVMTCkKLQltYXBfb3Zlcl9saXN0IChhcmNoLCBhcl9hZGRsaWJfZG9lciwgbGlzdCk7Ci0KLSAgICAgIC8qIERvbid0IGNsb3NlIHRoZSBiZmQsIHNpbmNlIGl0IHdpbGwgbWFrZSB0aGUgZWxlbWVudHMgZGlzYXNwcGVhciAqLwotICAgIH0KLX0KLQotdm9pZAotREVGVU4oYXJfYWRkbW9kLCAobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCBOVUxMKTsKLSAgICAgIGlmICghYWJmZCkgIHsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3Qgb3BlbiBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQltYXliZXF1aXQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgewotCWFiZmQtPm5leHQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0Jb2JmZC0+YXJjaGl2ZV9oZWFkID0gYWJmZDsKLSAgICAgIH0KLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotICAgIH0KLSAgfQotfQotCi0KLQotdm9pZAotREVGVU5fVk9JRChhcl9jbGVhcikKLXsKLWlmIChvYmZkKSAKLSBvYmZkLT5hcmNoaXZlX2hlYWQgPSAwOwotfQotCi12b2lkCi1ERUZVTihhcl9kZWxldGUsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgYmZkICoqcHJldiA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyKSB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSB7Ci0JICAqcHJldiA9IG1lbWJlci0+bmV4dDsKLQkgIGZvdW5kID0gMTsKLQl9Ci0JZWxzZSB7Ci0JICBwcmV2ID0gJihtZW1iZXItPm5leHQpOwotCX0KLQkgIG1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JZnByaW50ZihzdGRlcnIsXygiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsCi0JCWxpc3QtPm5hbWUpOwotCW1heWJlcXVpdCgpOwotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLQotdm9pZAotREVGVU5fVk9JRChhcl9zYXZlKQotewotCi0gIGlmICghb2JmZCkgewotICAgIGZwcmludGYoc3RkZXJyLCBfKCIlczogbm8gb3BlbiBvdXRwdXQgYXJjaGl2ZVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gICAgbWF5YmVxdWl0KCk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgY2hhciAqb2ZpbGVuYW1lID0geHN0cmR1cCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotICAgIGJmZF9jbG9zZShvYmZkKTsKLSAgICAKLSAgICByZW5hbWUgKG9maWxlbmFtZSwgcmVhbF9uYW1lKTsKLSAgICBvYmZkID0gMDsKLSAgICBmcmVlKG9maWxlbmFtZSk7Ci0gIH0KLX0KLQotCi0KLXZvaWQKLURFRlVOKGFyX3JlcGxhY2UsIChsaXN0KSwKLSAgICAgIHN0cnVjdCBsaXN0ICpsaXN0KQotewotICBpZiAoIW9iZmQpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICB3aGlsZSAobGlzdCkgewotICAgICAgLyogRmluZCB0aGlzIG5hbWUgaW4gdGhlIGFyY2hpdmUgKi8KLSAgICAgIGJmZCAqbWVtYmVyID0gb2JmZC0+YXJjaGl2ZV9oZWFkOwotICAgICAgYmZkICoqcHJldiA9ICYob2JmZC0+YXJjaGl2ZV9oZWFkKTsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyKSAKLSAgICAgIHsKLQlpZiAoc3RyY21wKG1lbWJlci0+ZmlsZW5hbWUsIGxpc3QtPm5hbWUpID09IDApIAotCXsKLQkgIC8qIEZvdW5kIHRoZSBvbmUgdG8gcmVwbGFjZSAqLwotCSAgYmZkICphYmZkID0gYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCSAgaWYgKCFhYmZkKSAKLQkgIHsKLQkgICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXNcbiIpLCBwcm9ncmFtX25hbWUsIGxpc3QtPm5hbWUpOwotCSAgICBtYXliZXF1aXQoKTsKLQkgIH0KLQkgIGVsc2UgewotCSAgICAqcHJldiA9IGFiZmQ7Ci0JICAgIGFiZmQtPm5leHQgPSBtZW1iZXItPm5leHQ7Ci0JICAgIGZvdW5kID0gMTsKLQkgIH0KLQl9Ci0JZWxzZSB7Ci0JICBwcmV2ID0gJihtZW1iZXItPm5leHQpOwotCX0KLQltZW1iZXIgPSBtZW1iZXItPm5leHQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZvdW5kKSAgewotCWJmZCAqYWJmZCA9IGJmZF9vcGVucihsaXN0LT5uYW1lLCAwKTsKLQlmcHJpbnRmKHN0ZGVycixfKCIlczogY2FuJ3QgZmluZCBtb2R1bGUgZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwKLQkJbGlzdC0+bmFtZSk7Ci0JaWYgKCFhYmZkKSAKLQl7Ci0JICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIiksIHByb2dyYW1fbmFtZSwgbGlzdC0+bmFtZSk7Ci0JICBtYXliZXF1aXQoKTsKLQl9Ci0JZWxzZSAKLQl7Ci0JICAqcHJldiA9IGFiZmQ7Ci0JfQotICAgICAgfQotCi0gICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19Ci0KLS8qIEFuZCBJIGFkZGVkIHRoaXMgb25lICovCi12b2lkCi1ERUZVTl9WT0lEKGFyX2xpc3QpCi17Ci0gIGlmICghb2JmZCkgCi0gIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIG9wZW4gb3V0cHV0IGFyY2hpdmVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgIG1heWJlcXVpdCgpOwotICB9Ci0gIGVsc2UgewotICAgIGJmZCAqYWJmZDsKLSAgICBvdXRmaWxlID0gc3Rkb3V0OwotICAgIHZlcmJvc2UgPTEgOwotICAgIHByaW50ZihfKCJDdXJyZW50IG9wZW4gYXJjaGl2ZSBpcyAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgICBmb3IgKGFiZmQgPSBvYmZkLT5hcmNoaXZlX2hlYWQ7Ci0JIGFiZmQgIT0gKGJmZCAqKU5VTEw7Ci0JIGFiZmQgPSBhYmZkLT5uZXh0KSAKLSAgICB7Ci0gICAgICBhcl9kaXJlY3RvcnlfZG9lciAoYWJmZCwgKGJmZCAqKSBOVUxMKTsKLSAgICB9Ci0gIH0KLX0KLQotCi12b2lkIAotREVGVU5fVk9JRChhcl9lbmQpCi17Ci0gIGlmIChvYmZkKQotICB7Ci0gICAgZmNsb3NlKChGSUxFICopKG9iZmQtPmlvc3RyZWFtKSk7Ci0gICAgdW5saW5rKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgfQotfQotdm9pZAotREVGVU4oYXJfZXh0cmFjdCwobGlzdCksCi0gICAgICBzdHJ1Y3QgbGlzdCAqbGlzdCkKLXsKLSAgaWYgKCFvYmZkKSAKLSAgewotCi0gICAgZnByaW50ZihzdGRlcnIsIF8oIiVzOiBubyBvcGVuICBhcmNoaXZlXG4iKSwgcHJvZ3JhbV9uYW1lKTsKLSAgICBtYXliZXF1aXQoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgd2hpbGUgKGxpc3QpIHsKLSAgICAgIC8qIEZpbmQgdGhpcyBuYW1lIGluIHRoZSBhcmNoaXZlICovCi0gICAgICBiZmQgKm1lbWJlciA9IG9iZmQtPmFyY2hpdmVfaGVhZDsKLSAgICAgIGludCBmb3VuZCA9IDA7Ci0gICAgICB3aGlsZSAobWVtYmVyICYmICFmb3VuZCkgCi0gICAgICB7Ci0JaWYgKHN0cmNtcChtZW1iZXItPmZpbGVuYW1lLCBsaXN0LT5uYW1lKSA9PSAwKSAKLQl7Ci0JICBleHRyYWN0X2ZpbGUobWVtYmVyKTsKLQkgIGZvdW5kID0gMTsKLQkgIH0KLQotCW1lbWJlciA9IG1lbWJlci0+bmV4dDsKLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpICB7Ci0JYmZkX29wZW5yKGxpc3QtPm5hbWUsIDApOwotCWZwcmludGYoc3RkZXJyLF8oIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iKSwgcHJvZ3JhbV9uYW1lLAotCQlsaXN0LT5uYW1lKTsKLQotICAgICAgfQotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9hcnN1cC5oIGIvYmludXRpbHMvYXJzdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU0YTM0Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9hcnN1cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyogYXJzdXAuaCAtIGFyY2hpdmUgc3VwcG9ydCBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGxpc3QgewotCWNoYXIgKm5hbWU7CQotCXN0cnVjdCBsaXN0ICpuZXh0OwotfTsKLQotdm9pZAotbWF5YmVxdWl0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotcHJvbXB0IFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZAotYXJfY2xlYXIgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9yZXBsYWNlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfZGVsZXRlIFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotdm9pZAotYXJfc2F2ZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLWFyX2xpc3QgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9vcGVuIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXZvaWQKLWFyX2RpcmVjdG9yeSBQQVJBTVMgKChjaGFyICosIHN0cnVjdCBsaXN0ICosIGNoYXIgKikpOwotCi12b2lkCi1hcl9hZGRtb2QgUEFSQU1TICgoc3RydWN0IGxpc3QgKikpOwotCi12b2lkCi1hcl9hZGRsaWIgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbGlzdCAqKSk7Ci0KLXZvaWQgCi1hcl9lbmQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi1hcl9leHRyYWN0IFBBUkFNUyAoKHN0cnVjdCBsaXN0ICopKTsKLQotYmZkICoKLW9wZW5faW5hcmNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2hpdmVfZmlsZW5hbWUsIGNvbnN0IGNoYXIgKikpOwotCi1pbnQKLXl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGdW5jdGlvbnMgZnJvbSBhci5jICovCi0KLXZvaWQKLWV4dHJhY3RfZmlsZSBQQVJBTVMgKChiZmQgKiBhYmZkKSk7Ci0KLWV4dGVybiBpbnQgaW50ZXJhY3RpdmU7CmRpZmYgLS1naXQgYS9iaW51dGlscy9iaW51dGlscy50ZXhpIGIvYmludXRpbHMvYmludXRpbHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1ZGYzZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9iaW51dGlscy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjkzMiArMCwwIEBACi1caW5wdXQgdGV4aW5mbyAgICAgICBAYyAgICAgICAgICAgICAgICAgICAgLSotIFRleGluZm8gLSotCi1Ac2V0ZmlsZW5hbWUgYmludXRpbHMuaW5mbwotQGluY2x1ZGUgY29uZmlnLnRleGkKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQmludXRpbHM6IChiaW51dGlscykuICAgICAgICAgVGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzICJhciIsICJvYmpjb3B5IiwKLQkJCQkib2JqZHVtcCIsICJubSIsICJubG1jb252IiwgInNpemUiLCAicmVhZGVsZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MiLCAic3RyaXAiLCAicmFubGliIiBhbmQgImRsbHRvb2wiLgotRU5ELUlORk8tRElSLUVOVFJZCi1AZW5kIGZvcm1hdAotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBhIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgYWxzbyB0aGF0Ci10aGUgZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUBzeW5pbmRleCBreSBjcAotQGMKLUBjIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBiaW5hcnkgdXRpbGl0aWVzICJhciIsICJsZCIsICJvYmpjb3B5IiwKLUBjICAib2JqZHVtcCIsICJubSIsICJzaXplIiwgInN0cmluZ3MiLCAic3RyaXAiLCAicmVhZGVsZiIgYW5kICJyYW5saWIiLgotQGMKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyAKLUBjIFRoaXMgdGV4dCBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi1AYyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotQGMKLQotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQHNldHRpdGxlIEBzY3tnbnV9IEJpbmFyeSBVdGlsaXRpZXMKLUB0aXRsZXBhZ2UKLUBmaW5hbG91dAotQHRpdGxlIFRoZSBAc2N7Z251fSBCaW5hcnkgVXRpbGl0aWVzCi1Ac3VidGl0bGUgVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0KLUBzcCAxCi1Ac3VidGl0bGUgTWF5IDE5OTMKLUBhdXRob3IgUm9sYW5kIEguIFBlc2NoCi1AYXV0aG9yIEplZmZyZXkgTS4gT3NpZXIKLUBhdXRob3IgQ3lnbnVzIFN1cHBvcnQKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQgXGhmaWxsIEN5Z251cyBTdXBwb3J0XHBhciBcaGZpbGwKLVxUZVh7fWluZm8gXHRleGluZm92ZXJzaW9uXHBhciB9Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLQotQG5vZGUgVG9wCi1AdG9wIEludHJvZHVjdGlvbgotCi1AY2luZGV4IHZlcnNpb24KLVRoaXMgYnJpZWYgbWFudWFsIGNvbnRhaW5zIHByZWxpbWluYXJ5IGRvY3VtZW50YXRpb24gZm9yIHRoZSBAc2N7Z251fSBiaW5hcnkKLXV0aWxpdGllcyAoY29sbGVjdGl2ZWx5IHZlcnNpb24gQHZhbHVle1ZFUlNJT059KTogCi0KLUBpZnRleAotQHRhYmxlIEBjb2RlCi1AaXRlbSBhcgotQ3JlYXRlLCBtb2RpZnksIGFuZCBleHRyYWN0IGZyb20gYXJjaGl2ZXMKLQotQGl0ZW0gbm0KLUxpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcwotCi1AaXRlbSBvYmpjb3B5Ci1Db3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCi0KLUBpdGVtIG9iamR1bXAKLURpc3BsYXkgaW5mb3JtYXRpb24gZnJvbSBvYmplY3QgZmlsZXMKLQotQGl0ZW0gcmFubGliCi1HZW5lcmF0ZSBpbmRleCB0byBhcmNoaXZlIGNvbnRlbnRzCi0KLUBpdGVtIHJlYWRlbGYKLURpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIEVMRiBmb3JtYXQgZmlsZXMuCi0KLUBpdGVtIHNpemUKLUxpc3QgZmlsZSBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0KLUBpdGVtIHN0cmluZ3MKLUxpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotCi1AaXRlbSBzdHJpcAotRGlzY2FyZCBzeW1ib2xzCi0KLUBpdGVtIGMrK2ZpbHQKLURlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMKLQotQGl0ZW0gYWRkcjJsaW5lCi1Db252ZXJ0IGFkZHJlc3NlcyBpbnRvIGZpbGUgbmFtZXMgYW5kIGxpbmUgbnVtYmVycwotCi1AaXRlbSBubG1jb252Ci1Db252ZXJ0IG9iamVjdCBjb2RlIGludG8gYSBOZXR3YXJlIExvYWRhYmxlIE1vZHVsZQotCi1AaXRlbSB3aW5kcmVzCi1NYW5pcHVsYXRlIFdpbmRvd3MgcmVzb3VyY2VzCi0KLUBpdGVtIGRsbHRvb2wKLUNyZWF0ZSB0aGUgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIGFuZCB1c2UgRHluYW1pYyBMaW5rIExpYnJhcmllcwotQGVuZCB0YWJsZQotQGVuZCBpZnRleAotCi1AbWVudQotKiBhcjo6ICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUsIG1vZGlmeSwgYW5kIGV4dHJhY3QgZnJvbSBhcmNoaXZlcwotKiBubTo6ICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLSogb2JqY29weTo6CQkJQ29weSBhbmQgdHJhbnNsYXRlIG9iamVjdCBmaWxlcwotKiBvYmpkdW1wOjogICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzCi0qIHJhbmxpYjo6ICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGluZGV4IHRvIGFyY2hpdmUgY29udGVudHMKLSogcmVhZGVsZjo6CQkJRGlzcGxheSB0aGUgY29udGVudHMgb2YgRUxGIGZvcm1hdCBmaWxlcy4KLSogc2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBzZWN0aW9uIHNpemVzIGFuZCB0b3RhbCBzaXplCi0qIHN0cmluZ3M6OiAgICAgICAgICAgICAgICAgICAgIExpc3QgcHJpbnRhYmxlIHN0cmluZ3MgZnJvbSBmaWxlcwotKiBzdHJpcDo6ICAgICAgICAgICAgICAgICAgICAgICBEaXNjYXJkIHN5bWJvbHMKLSogYysrZmlsdDo6CQkJRmlsdGVyIHRvIGRlbWFuZ2xlIGVuY29kZWQgQysrIHN5bWJvbHMKLSogYWRkcjJsaW5lOjoJCQlDb252ZXJ0IGFkZHJlc3NlcyB0byBmaWxlIGFuZCBsaW5lCi0qIG5sbWNvbnY6OiAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRzIG9iamVjdCBjb2RlIGludG8gYW4gTkxNCi0qIHdpbmRyZXM6OgkJCU1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKLSogZGxsdG9vbDo6CQkJQ3JlYXRlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIERMTHMKLSogU2VsZWN0aW5nIFRoZSBUYXJnZXQgU3lzdGVtOjogSG93IHRoZXNlIHV0aWxpdGllcyBkZXRlcm1pbmUgdGhlIHRhcmdldC4KLSogUmVwb3J0aW5nIEJ1Z3M6OiAgICAgICAgICAgICAgUmVwb3J0aW5nIEJ1Z3MKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotCi1Abm9kZSBhcgotQGNoYXB0ZXIgYXIKLQotQGtpbmRleCBhcgotQGNpbmRleCBhcmNoaXZlcwotQGNpbmRleCBjb2xsZWN0aW9ucyBvZiBmaWxlcwotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV1dIEB2YXJ7YXJjaGl2ZX0gW0B2YXJ7bWVtYmVyfUBkb3Rze31dCi1hciAtTSBbIDxtcmktc2NyaXB0IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2N7Z251fSBAY29kZXthcn0gcHJvZ3JhbSBjcmVhdGVzLCBtb2RpZmllcywgYW5kIGV4dHJhY3RzIGZyb20KLWFyY2hpdmVzLiAgQW4gQGRmbnthcmNoaXZlfSBpcyBhIHNpbmdsZSBmaWxlIGhvbGRpbmcgYSBjb2xsZWN0aW9uIG9mCi1vdGhlciBmaWxlcyBpbiBhIHN0cnVjdHVyZSB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHJpZXZlCi10aGUgb3JpZ2luYWwgaW5kaXZpZHVhbCBmaWxlcyAoY2FsbGVkIEBkZm57bWVtYmVyc30gb2YgdGhlIGFyY2hpdmUpLgotCi1UaGUgb3JpZ2luYWwgZmlsZXMnIGNvbnRlbnRzLCBtb2RlIChwZXJtaXNzaW9ucyksIHRpbWVzdGFtcCwgb3duZXIsIGFuZAotZ3JvdXAgYXJlIHByZXNlcnZlZCBpbiB0aGUgYXJjaGl2ZSwgYW5kIGNhbiBiZSByZXN0b3JlZCBvbgotZXh0cmFjdGlvbi4gIAotCi1AY2luZGV4IG5hbWUgbGVuZ3RoCi1Ac2N7Z251fSBAY29kZXthcn0gY2FuIG1haW50YWluIGFyY2hpdmVzIHdob3NlIG1lbWJlcnMgaGF2ZSBuYW1lcyBvZiBhbnkKLWxlbmd0aDsgaG93ZXZlciwgZGVwZW5kaW5nIG9uIGhvdyBAY29kZXthcn0gaXMgY29uZmlndXJlZCBvbiB5b3VyCi1zeXN0ZW0sIGEgbGltaXQgb24gbWVtYmVyLW5hbWUgbGVuZ3RoIG1heSBiZSBpbXBvc2VkIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIGFyY2hpdmUgZm9ybWF0cyBtYWludGFpbmVkIHdpdGggb3RoZXIgdG9vbHMuICBJZiBpdCBleGlzdHMsIHRoZQotbGltaXQgaXMgb2Z0ZW4gMTUgY2hhcmFjdGVycyAodHlwaWNhbCBvZiBmb3JtYXRzIHJlbGF0ZWQgdG8gYS5vdXQpIG9yIDE2Ci1jaGFyYWN0ZXJzICh0eXBpY2FsIG9mIGZvcm1hdHMgcmVsYXRlZCB0byBjb2ZmKS4KLQotQGNpbmRleCBsaWJyYXJpZXMKLUBjb2Rle2FyfSBpcyBjb25zaWRlcmVkIGEgYmluYXJ5IHV0aWxpdHkgYmVjYXVzZSBhcmNoaXZlcyBvZiB0aGlzIHNvcnQKLWFyZSBtb3N0IG9mdGVuIHVzZWQgYXMgQGRmbntsaWJyYXJpZXN9IGhvbGRpbmcgY29tbW9ubHkgbmVlZGVkCi1zdWJyb3V0aW5lcy4KLQotQGNpbmRleCBzeW1ib2wgaW5kZXgKLUBjb2Rle2FyfSBjcmVhdGVzIGFuIGluZGV4IHRvIHRoZSBzeW1ib2xzIGRlZmluZWQgaW4gcmVsb2NhdGFibGUKLW9iamVjdCBtb2R1bGVzIGluIHRoZSBhcmNoaXZlIHdoZW4geW91IHNwZWNpZnkgdGhlIG1vZGlmaWVyIEBzYW1we3N9LgotT25jZSBjcmVhdGVkLCB0aGlzIGluZGV4IGlzIHVwZGF0ZWQgaW4gdGhlIGFyY2hpdmUgd2hlbmV2ZXIgQGNvZGV7YXJ9Ci1tYWtlcyBhIGNoYW5nZSB0byBpdHMgY29udGVudHMgKHNhdmUgZm9yIHRoZSBAc2FtcHtxfSB1cGRhdGUgb3BlcmF0aW9uKS4KLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLQotWW91IG1heSB1c2UgQHNhbXB7bm0gLXN9IG9yIEBzYW1we25tIC0tcHJpbnQtYXJtYXB9IHRvIGxpc3QgdGhpcyBpbmRleAotdGFibGUuICBJZiBhbiBhcmNoaXZlIGxhY2tzIHRoZSB0YWJsZSwgYW5vdGhlciBmb3JtIG9mIEBjb2Rle2FyfSBjYWxsZWQKLUBjb2Rle3JhbmxpYn0gY2FuIGJlIHVzZWQgdG8gYWRkIGp1c3QgdGhlIHRhYmxlLgotCi1AY2luZGV4IGNvbXBhdGliaWxpdHksIEBjb2Rle2FyfQotQGNpbmRleCBAY29kZXthcn0gY29tcGF0aWJpbGl0eQotQHNje2dudX0gQGNvZGV7YXJ9IGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0d28gZGlmZmVyZW50Ci1mYWNpbGl0aWVzLiAgWW91IGNhbiBjb250cm9sIGl0cyBhY3Rpdml0eSB1c2luZyBjb21tYW5kLWxpbmUgb3B0aW9ucywKLWxpa2UgdGhlIGRpZmZlcmVudCB2YXJpZXRpZXMgb2YgQGNvZGV7YXJ9IG9uIFVuaXggc3lzdGVtczsgb3IsIGlmIHlvdQotc3BlY2lmeSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19LCB5b3UgY2FuIGNvbnRyb2wgaXQKLXdpdGggYSBzY3JpcHQgc3VwcGxpZWQgdmlhIHN0YW5kYXJkIGlucHV0LCBsaWtlIHRoZSBNUkkgYGBsaWJyYXJpYW4nJwotcHJvZ3JhbS4KLQotQG1lbnUKLSogYXIgY21kbGluZTo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLSogYXIgc2NyaXB0czo6ICAgICAgICAgICAgICAgICAgQ29udHJvbGxpbmcgQGNvZGV7YXJ9IHdpdGggYSBzY3JpcHQKLUBlbmQgbWVudQotCi1AcGFnZQotQG5vZGUgYXIgY21kbGluZQotQHNlY3Rpb24gQ29udHJvbGxpbmcgQGNvZGV7YXJ9IG9uIHRoZSBjb21tYW5kIGxpbmUKLQotQHNtYWxsZXhhbXBsZQotYXIgWy1dQHZhcntwfVtAdmFye21vZH0gW0B2YXJ7cmVscG9zfV1dIEB2YXJ7YXJjaGl2ZX0gW0B2YXJ7bWVtYmVyfUBkb3Rze31dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IFVuaXggY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1XaGVuIHlvdSB1c2UgQGNvZGV7YXJ9IGluIHRoZSBVbml4IHN0eWxlLCBAY29kZXthcn0gaW5zaXN0cyBvbiBhdCBsZWFzdCB0d28KLWFyZ3VtZW50cyB0byBleGVjdXRlOiBvbmUga2V5bGV0dGVyIHNwZWNpZnlpbmcgdGhlIEBlbXBoe29wZXJhdGlvbn0KLShvcHRpb25hbGx5IGFjY29tcGFuaWVkIGJ5IG90aGVyIGtleWxldHRlcnMgc3BlY2lmeWluZwotQGVtcGh7bW9kaWZpZXJzfSksIGFuZCB0aGUgYXJjaGl2ZSBuYW1lIHRvIGFjdCBvbi4KLQotTW9zdCBvcGVyYXRpb25zIGNhbiBhbHNvIGFjY2VwdCBmdXJ0aGVyIEB2YXJ7bWVtYmVyfSBhcmd1bWVudHMsCi1zcGVjaWZ5aW5nIHBhcnRpY3VsYXIgZmlsZXMgdG8gb3BlcmF0ZSBvbi4KLQotQHNje2dudX0gQGNvZGV7YXJ9IGFsbG93cyB5b3UgdG8gbWl4IHRoZSBvcGVyYXRpb24gY29kZSBAdmFye3B9IGFuZCBtb2RpZmllcgotZmxhZ3MgQHZhcnttb2R9IGluIGFueSBvcmRlciwgd2l0aGluIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQuCi0KLUlmIHlvdSB3aXNoLCB5b3UgbWF5IGJlZ2luIHRoZSBmaXJzdCBjb21tYW5kLWxpbmUgYXJndW1lbnQgd2l0aCBhCi1kYXNoLgotCi1AY2luZGV4IG9wZXJhdGlvbnMgb24gYXJjaGl2ZQotVGhlIEB2YXJ7cH0ga2V5bGV0dGVyIHNwZWNpZmllcyB3aGF0IG9wZXJhdGlvbiB0byBleGVjdXRlOyBpdCBtYXkgYmUKLWFueSBvZiB0aGUgZm9sbG93aW5nLCBidXQgeW91IG11c3Qgc3BlY2lmeSBvbmx5IG9uZSBvZiB0aGVtOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGQKLUBjaW5kZXggZGVsZXRpbmcgZnJvbSBhcmNoaXZlCi1AZW1waHtEZWxldGV9IG1vZHVsZXMgZnJvbSB0aGUgYXJjaGl2ZS4gIFNwZWNpZnkgdGhlIG5hbWVzIG9mIG1vZHVsZXMgdG8KLWJlIGRlbGV0ZWQgYXMgQHZhcnttZW1iZXJ9QGRvdHN7fTsgdGhlIGFyY2hpdmUgaXMgdW50b3VjaGVkIGlmIHlvdQotc3BlY2lmeSBubyBmaWxlcyB0byBkZWxldGUuCi0KLUlmIHlvdSBzcGVjaWZ5IHRoZSBAc2FtcHt2fSBtb2RpZmllciwgQGNvZGV7YXJ9IGxpc3RzIGVhY2ggbW9kdWxlCi1hcyBpdCBpcyBkZWxldGVkLgotCi1AaXRlbSBtCi1AY2luZGV4IG1vdmluZyBpbiBhcmNoaXZlCi1Vc2UgdGhpcyBvcGVyYXRpb24gdG8gQGVtcGh7bW92ZX0gbWVtYmVycyBpbiBhbiBhcmNoaXZlLgotCi1UaGUgb3JkZXJpbmcgb2YgbWVtYmVycyBpbiBhbiBhcmNoaXZlIGNhbiBtYWtlIGEgZGlmZmVyZW5jZSBpbiBob3cKLXByb2dyYW1zIGFyZSBsaW5rZWQgdXNpbmcgdGhlIGxpYnJhcnksIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgaW4gbW9yZQotdGhhbiBvbmUgbWVtYmVyLiAgCi0KLUlmIG5vIG1vZGlmaWVycyBhcmUgdXNlZCB3aXRoIEBjb2Rle219LCBhbnkgbWVtYmVycyB5b3UgbmFtZSBpbiB0aGUKLUB2YXJ7bWVtYmVyfSBhcmd1bWVudHMgYXJlIG1vdmVkIHRvIHRoZSBAZW1waHtlbmR9IG9mIHRoZSBhcmNoaXZlOwoteW91IGNhbiB1c2UgdGhlIEBzYW1we2F9LCBAc2FtcHtifSwgb3IgQHNhbXB7aX0gbW9kaWZpZXJzIHRvIG1vdmUgdGhlbSB0byBhCi1zcGVjaWZpZWQgcGxhY2UgaW5zdGVhZC4KLQotQGl0ZW0gcAotQGNpbmRleCBwcmludGluZyBmcm9tIGFyY2hpdmUKLUBlbXBoe1ByaW50fSB0aGUgc3BlY2lmaWVkIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUsIHRvIHRoZSBzdGFuZGFyZAotb3V0cHV0IGZpbGUuICBJZiB0aGUgQHNhbXB7dn0gbW9kaWZpZXIgaXMgc3BlY2lmaWVkLCBzaG93IHRoZSBtZW1iZXIKLW5hbWUgYmVmb3JlIGNvcHlpbmcgaXRzIGNvbnRlbnRzIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotSWYgeW91IHNwZWNpZnkgbm8gQHZhcnttZW1iZXJ9IGFyZ3VtZW50cywgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhcmUKLXByaW50ZWQuCi0KLUBpdGVtIHEKLUBjaW5kZXggcXVpY2sgYXBwZW5kIHRvIGFyY2hpdmUKLUBlbXBoe1F1aWNrIGFwcGVuZH07IEhpc3RvcmljYWxseSwgYWRkIHRoZSBmaWxlcyBAdmFye21lbWJlcn1AZG90c3t9IHRvIHRoZSBlbmQgb2YKLUB2YXJ7YXJjaGl2ZX0sIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHJlcGxhY2VtZW50LgotCi1UaGUgbW9kaWZpZXJzIEBzYW1we2F9LCBAc2FtcHtifSwgYW5kIEBzYW1we2l9IGRvIEBlbXBoe25vdH0gYWZmZWN0IHRoaXMKLW9wZXJhdGlvbjsgbmV3IG1lbWJlcnMgYXJlIGFsd2F5cyBwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4KLQotVGhlIG1vZGlmaWVyIEBzYW1we3Z9IG1ha2VzIEBjb2Rle2FyfSBsaXN0IGVhY2ggZmlsZSBhcyBpdCBpcyBhcHBlbmRlZC4KLQotU2luY2UgdGhlIHBvaW50IG9mIHRoaXMgb3BlcmF0aW9uIGlzIHNwZWVkLCB0aGUgYXJjaGl2ZSdzIHN5bWJvbCB0YWJsZQotaW5kZXggaXMgbm90IHVwZGF0ZWQsIGV2ZW4gaWYgaXQgYWxyZWFkeSBleGlzdGVkOyB5b3UgY2FuIHVzZSBAc2FtcHthciBzfSBvcgotQGNvZGV7cmFubGlifSBleHBsaWNpdGx5IHRvIHVwZGF0ZSB0aGUgc3ltYm9sIHRhYmxlIGluZGV4LgotCi1Ib3dldmVyLCB0b28gbWFueSBkaWZmZXJlbnQgc3lzdGVtcyBhc3N1bWUgcXVpY2sgYXBwZW5kIHJlYnVpbGRzIHRoZQotaW5kZXgsIHNvIEdOVSBhciBpbXBsZW1lbnRzIEBjb2Rle3F9IGFzIGEgc3lub255bSBmb3IgQGNvZGV7cn0uCi0KLUBpdGVtIHIKLUBjaW5kZXggcmVwbGFjZW1lbnQgaW4gYXJjaGl2ZQotSW5zZXJ0IHRoZSBmaWxlcyBAdmFye21lbWJlcn1AZG90c3t9IGludG8gQHZhcnthcmNoaXZlfSAod2l0aAotQGVtcGh7cmVwbGFjZW1lbnR9KS4gVGhpcyBvcGVyYXRpb24gZGlmZmVycyBmcm9tIEBzYW1we3F9IGluIHRoYXQgYW55Ci1wcmV2aW91c2x5IGV4aXN0aW5nIG1lbWJlcnMgYXJlIGRlbGV0ZWQgaWYgdGhlaXIgbmFtZXMgbWF0Y2ggdGhvc2UgYmVpbmcKLWFkZGVkLgotCi1JZiBvbmUgb2YgdGhlIGZpbGVzIG5hbWVkIGluIEB2YXJ7bWVtYmVyfUBkb3Rze30gZG9lcyBub3QgZXhpc3QsIEBjb2Rle2FyfQotZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIGxlYXZlcyB1bmRpc3R1cmJlZCBhbnkgZXhpc3RpbmcgbWVtYmVycwotb2YgdGhlIGFyY2hpdmUgbWF0Y2hpbmcgdGhhdCBuYW1lLgotCi1CeSBkZWZhdWx0LCBuZXcgbWVtYmVycyBhcmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZTsgYnV0IHlvdSBtYXkKLXVzZSBvbmUgb2YgdGhlIG1vZGlmaWVycyBAc2FtcHthfSwgQHNhbXB7Yn0sIG9yIEBzYW1we2l9IHRvIHJlcXVlc3QKLXBsYWNlbWVudCByZWxhdGl2ZSB0byBzb21lIGV4aXN0aW5nIG1lbWJlci4KLQotVGhlIG1vZGlmaWVyIEBzYW1we3Z9IHVzZWQgd2l0aCB0aGlzIG9wZXJhdGlvbiBlbGljaXRzIGEgbGluZSBvZgotb3V0cHV0IGZvciBlYWNoIGZpbGUgaW5zZXJ0ZWQsIGFsb25nIHdpdGggb25lIG9mIHRoZSBsZXR0ZXJzIEBzYW1we2F9IG9yCi1Ac2FtcHtyfSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmaWxlIHdhcyBhcHBlbmRlZCAobm8gb2xkIG1lbWJlcgotZGVsZXRlZCkgb3IgcmVwbGFjZWQuCi0KLUBpdGVtIHQKLUBjaW5kZXggY29udGVudHMgb2YgYXJjaGl2ZQotRGlzcGxheSBhIEBlbXBoe3RhYmxlfSBsaXN0aW5nIHRoZSBjb250ZW50cyBvZiBAdmFye2FyY2hpdmV9LCBvciB0aG9zZQotb2YgdGhlIGZpbGVzIGxpc3RlZCBpbiBAdmFye21lbWJlcn1AZG90c3t9IHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlCi1hcmNoaXZlLiAgTm9ybWFsbHkgb25seSB0aGUgbWVtYmVyIG5hbWUgaXMgc2hvd247IGlmIHlvdSBhbHNvIHdhbnQgdG8KLXNlZSB0aGUgbW9kZXMgKHBlcm1pc3Npb25zKSwgdGltZXN0YW1wLCBvd25lciwgZ3JvdXAsIGFuZCBzaXplLCB5b3UgY2FuCi1yZXF1ZXN0IHRoYXQgYnkgYWxzbyBzcGVjaWZ5aW5nIHRoZSBAc2FtcHt2fSBtb2RpZmllci4KLQotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGEgQHZhcnttZW1iZXJ9LCBhbGwgZmlsZXMgaW4gdGhlIGFyY2hpdmUKLWFyZSBsaXN0ZWQuCi0KLUBjaW5kZXggcmVwZWF0ZWQgbmFtZXMgaW4gYXJjaGl2ZQotQGNpbmRleCBuYW1lIGR1cGxpY2F0aW9uIGluIGFyY2hpdmUKLUlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKHNheSwgQHNhbXB7ZmllfSkgaW4KLWFuIGFyY2hpdmUgKHNheSBAc2FtcHtiLmF9KSwgQHNhbXB7YXIgdCBiLmEgZmllfSBsaXN0cyBvbmx5IHRoZQotZmlyc3QgaW5zdGFuY2U7IHRvIHNlZSB0aGVtIGFsbCwgeW91IG11c3QgYXNrIGZvciBhIGNvbXBsZXRlCi1saXN0aW5nLS0taW4gb3VyIGV4YW1wbGUsIEBzYW1we2FyIHQgYi5hfS4KLUBjIFdSUyBvbmx5OyBwZXIgR3VtYnksIHRoaXMgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LCBhbmQgaW4gYSBtb3JlCi1AYyByZWNlbnQgY2FzZSBpbiBmYWN0IHdvcmtzIHRoZSBvdGhlciB3YXkuCi0KLUBpdGVtIHgKLUBjaW5kZXggZXh0cmFjdCBmcm9tIGFyY2hpdmUKLUBlbXBoe0V4dHJhY3R9IG1lbWJlcnMgKG5hbWVkIEB2YXJ7bWVtYmVyfSkgZnJvbSB0aGUgYXJjaGl2ZS4gIFlvdSBjYW4KLXVzZSB0aGUgQHNhbXB7dn0gbW9kaWZpZXIgd2l0aCB0aGlzIG9wZXJhdGlvbiwgdG8gcmVxdWVzdCB0aGF0Ci1AY29kZXthcn0gbGlzdCBlYWNoIG5hbWUgYXMgaXQgZXh0cmFjdHMgaXQuCi0KLUlmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIEB2YXJ7bWVtYmVyfSwgYWxsIGZpbGVzIGluIHRoZSBhcmNoaXZlCi1hcmUgZXh0cmFjdGVkLgotCi1AZW5kIHRhYmxlCi0KLUEgbnVtYmVyIG9mIG1vZGlmaWVycyAoQHZhcnttb2R9KSBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBAdmFye3B9Ci1rZXlsZXR0ZXIsIHRvIHNwZWNpZnkgdmFyaWF0aW9ucyBvbiBhbiBvcGVyYXRpb24ncyBiZWhhdmlvcjoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBhCi1AY2luZGV4IHJlbGF0aXZlIHBsYWNlbWVudCBpbiBhcmNoaXZlCi1BZGQgbmV3IGZpbGVzIEBlbXBoe2FmdGVyfSBhbiBleGlzdGluZyBtZW1iZXIgb2YgdGhlCi1hcmNoaXZlLiAgSWYgeW91IHVzZSB0aGUgbW9kaWZpZXIgQHNhbXB7YX0sIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nIGFyY2hpdmUKLW1lbWJlciBtdXN0IGJlIHByZXNlbnQgYXMgdGhlIEB2YXJ7cmVscG9zfSBhcmd1bWVudCwgYmVmb3JlIHRoZQotQHZhcnthcmNoaXZlfSBzcGVjaWZpY2F0aW9uLgotCi1AaXRlbSBiCi1BZGQgbmV3IGZpbGVzIEBlbXBoe2JlZm9yZX0gYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIEBzYW1we2J9LCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBAdmFye3JlbHBvc30gYXJndW1lbnQsIGJlZm9yZSB0aGUKLUB2YXJ7YXJjaGl2ZX0gc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIEBzYW1we2l9KS4KLQotQGl0ZW0gYwotQGNpbmRleCBjcmVhdGluZyBhcmNoaXZlcwotQGVtcGh7Q3JlYXRlfSB0aGUgYXJjaGl2ZS4gIFRoZSBzcGVjaWZpZWQgQHZhcnthcmNoaXZlfSBpcyBhbHdheXMKLWNyZWF0ZWQgaWYgaXQgZGlkIG5vdCBleGlzdCwgd2hlbiB5b3UgcmVxdWVzdCBhbiB1cGRhdGUuICBCdXQgYSB3YXJuaW5nIGlzCi1pc3N1ZWQgdW5sZXNzIHlvdSBzcGVjaWZ5IGluIGFkdmFuY2UgdGhhdCB5b3UgZXhwZWN0IHRvIGNyZWF0ZSBpdCwgYnkKLXVzaW5nIHRoaXMgbW9kaWZpZXIuCi0KLUBpdGVtIGYKLVRydW5jYXRlIG5hbWVzIGluIHRoZSBhcmNoaXZlLiAgQHNje2dudX0gQGNvZGV7YXJ9IHdpbGwgbm9ybWFsbHkgcGVybWl0IGZpbGUKLW5hbWVzIG9mIGFueSBsZW5ndGguICBUaGlzIHdpbGwgY2F1c2UgaXQgdG8gY3JlYXRlIGFyY2hpdmVzIHdoaWNoIGFyZQotbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgbmF0aXZlIEBjb2Rle2FyfSBwcm9ncmFtIG9uIHNvbWUgc3lzdGVtcy4gIElmCi10aGlzIGlzIGEgY29uY2VybiwgdGhlIEBzYW1we2Z9IG1vZGlmaWVyIG1heSBiZSB1c2VkIHRvIHRydW5jYXRlIGZpbGUKLW5hbWVzIHdoZW4gcHV0dGluZyB0aGVtIGluIHRoZSBhcmNoaXZlLgotCi1AaXRlbSBpCi1JbnNlcnQgbmV3IGZpbGVzIEBlbXBoe2JlZm9yZX0gYW4gZXhpc3RpbmcgbWVtYmVyIG9mIHRoZQotYXJjaGl2ZS4gIElmIHlvdSB1c2UgdGhlIG1vZGlmaWVyIEBzYW1we2l9LCB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBhcmNoaXZlCi1tZW1iZXIgbXVzdCBiZSBwcmVzZW50IGFzIHRoZSBAdmFye3JlbHBvc30gYXJndW1lbnQsIGJlZm9yZSB0aGUKLUB2YXJ7YXJjaGl2ZX0gc3BlY2lmaWNhdGlvbi4gIChzYW1lIGFzIEBzYW1we2J9KS4KLQotQGl0ZW0gbAotVGhpcyBtb2RpZmllciBpcyBhY2NlcHRlZCBidXQgbm90IHVzZWQuCi1AYyB3aGFmZm9yIGFyIGwgbW9kaWZpZXI/Pz8gcHJlc3VtYWJseSBjb21wYXQ7IHdpdGgKLUBjIHdoYXQ/Pz8tLS1kb2NAQGN5Z251cy5jb20sIDI1amFuOTEgCi0KLUBpdGVtIG8KLUBjaW5kZXggZGF0ZXMgaW4gYXJjaGl2ZQotUHJlc2VydmUgdGhlIEBlbXBoe29yaWdpbmFsfSBkYXRlcyBvZiBtZW1iZXJzIHdoZW4gZXh0cmFjdGluZyB0aGVtLiAgSWYKLXlvdSBkbyBub3Qgc3BlY2lmeSB0aGlzIG1vZGlmaWVyLCBmaWxlcyBleHRyYWN0ZWQgZnJvbSB0aGUgYXJjaGl2ZQotYXJlIHN0YW1wZWQgd2l0aCB0aGUgdGltZSBvZiBleHRyYWN0aW9uLgotCi1AaXRlbSBzCi1AY2luZGV4IHdyaXRpbmcgYXJjaGl2ZSBpbmRleAotV3JpdGUgYW4gb2JqZWN0LWZpbGUgaW5kZXggaW50byB0aGUgYXJjaGl2ZSwgb3IgdXBkYXRlIGFuIGV4aXN0aW5nIG9uZSwKLWV2ZW4gaWYgbm8gb3RoZXIgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGFyY2hpdmUuICBZb3UgbWF5IHVzZSB0aGlzIG1vZGlmaWVyCi1mbGFnIGVpdGhlciB3aXRoIGFueSBvcGVyYXRpb24sIG9yIGFsb25lLiAgUnVubmluZyBAc2FtcHthciBzfSBvbiBhbgotYXJjaGl2ZSBpcyBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgQHNhbXB7cmFubGlifSBvbiBpdC4KLQotQGl0ZW0gUwotQGNpbmRleCBub3Qgd3JpdGluZyBhcmNoaXZlIGluZGV4Ci1EbyBub3QgZ2VuZXJhdGUgYW4gYXJjaGl2ZSBzeW1ib2wgdGFibGUuICBUaGlzIGNhbiBzcGVlZCB1cCBidWlsZGluZyBhCi1sYXJnZSBsaWJyYXJ5IGluIHNldmVyYWwgc3RlcHMuICBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgY2FuIG5vdCBiZSB1c2VkCi13aXRoIHRoZSBsaW5rZXIuICBJbiBvcmRlciB0byBidWlsZCBhIHN5bWJvbCB0YWJsZSwgeW91IG11c3Qgb21pdCB0aGUKLUBzYW1we1N9IG1vZGlmaWVyIG9uIHRoZSBsYXN0IGV4ZWN1dGlvbiBvZiBAc2FtcHthcn0sIG9yIHlvdSBtdXN0IHJ1bgotQHNhbXB7cmFubGlifSBvbiB0aGUgYXJjaGl2ZS4KLQotQGl0ZW0gdQotQGNpbmRleCB1cGRhdGluZyBhbiBhcmNoaXZlCi1Ob3JtYWxseSwgQHNhbXB7YXIgcn1AZG90c3t9IGluc2VydHMgYWxsIGZpbGVzCi1saXN0ZWQgaW50byB0aGUgYXJjaGl2ZS4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluc2VydCBAZW1waHtvbmx5fSB0aG9zZQotb2YgdGhlIGZpbGVzIHlvdSBsaXN0IHRoYXQgYXJlIG5ld2VyIHRoYW4gZXhpc3RpbmcgbWVtYmVycyBvZiB0aGUgc2FtZQotbmFtZXMsIHVzZSB0aGlzIG1vZGlmaWVyLiAgVGhlIEBzYW1we3V9IG1vZGlmaWVyIGlzIGFsbG93ZWQgb25seSBmb3IgdGhlCi1vcGVyYXRpb24gQHNhbXB7cn0gKHJlcGxhY2UpLiAgSW4gcGFydGljdWxhciwgdGhlIGNvbWJpbmF0aW9uIEBzYW1we3F1fSBpcwotbm90IGFsbG93ZWQsIHNpbmNlIGNoZWNraW5nIHRoZSB0aW1lc3RhbXBzIHdvdWxkIGxvc2UgYW55IHNwZWVkCi1hZHZhbnRhZ2UgZnJvbSB0aGUgb3BlcmF0aW9uIEBzYW1we3F9LgotCi1AaXRlbSB2Ci1UaGlzIG1vZGlmaWVyIHJlcXVlc3RzIHRoZSBAZW1waHt2ZXJib3NlfSB2ZXJzaW9uIG9mIGFuIG9wZXJhdGlvbi4gIE1hbnkKLW9wZXJhdGlvbnMgZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzdWNoIGFzIGZpbGVuYW1lcyBwcm9jZXNzZWQsCi13aGVuIHRoZSBtb2RpZmllciBAc2FtcHt2fSBpcyBhcHBlbmRlZC4KLQotQGl0ZW0gVgotVGhpcyBtb2RpZmllciBzaG93cyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgQGNvZGV7YXJ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBhciBzY3JpcHRzCi1Ac2VjdGlvbiBDb250cm9sbGluZyBAY29kZXthcn0gd2l0aCBhIHNjcmlwdAotCi1Ac21hbGxleGFtcGxlCi1hciAtTSBbIDxAdmFye3NjcmlwdH0gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eSwgQGNvZGV7YXJ9Ci1AY2luZGV4IHNjcmlwdHMsIEBjb2Rle2FyfQotSWYgeW91IHVzZSB0aGUgc2luZ2xlIGNvbW1hbmQtbGluZSBvcHRpb24gQHNhbXB7LU19IHdpdGggQGNvZGV7YXJ9LCB5b3UKLWNhbiBjb250cm9sIGl0cyBvcGVyYXRpb24gd2l0aCBhIHJ1ZGltZW50YXJ5IGNvbW1hbmQgbGFuZ3VhZ2UuICBUaGlzCi1mb3JtIG9mIEBjb2Rle2FyfSBvcGVyYXRlcyBpbnRlcmFjdGl2ZWx5IGlmIHN0YW5kYXJkIGlucHV0IGlzIGNvbWluZwotZGlyZWN0bHkgZnJvbSBhIHRlcm1pbmFsLiAgRHVyaW5nIGludGVyYWN0aXZlIHVzZSwgQGNvZGV7YXJ9IHByb21wdHMgZm9yCi1pbnB1dCAodGhlIHByb21wdCBpcyBAc2FtcHtBUiA+fSksIGFuZCBjb250aW51ZXMgZXhlY3V0aW5nIGV2ZW4gYWZ0ZXIKLWVycm9ycy4gIElmIHlvdSByZWRpcmVjdCBzdGFuZGFyZCBpbnB1dCB0byBhIHNjcmlwdCBmaWxlLCBubyBwcm9tcHRzIGFyZQotaXNzdWVkLCBhbmQgQGNvZGV7YXJ9IGFiYW5kb25zIGV4ZWN1dGlvbiAod2l0aCBhIG5vbnplcm8gZXhpdCBjb2RlKQotb24gYW55IGVycm9yLgotCi1UaGUgQGNvZGV7YXJ9IGNvbW1hbmQgbGFuZ3VhZ2UgaXMgQGVtcGh7bm90fSBkZXNpZ25lZCB0byBiZSBlcXVpdmFsZW50Ci10byB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnM7IGluIGZhY3QsIGl0IHByb3ZpZGVzIHNvbWV3aGF0IGxlc3MgY29udHJvbAotb3ZlciBhcmNoaXZlcy4gIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhlIGNvbW1hbmQgbGFuZ3VhZ2UgaXMgdG8gZWFzZSB0aGUKLXRyYW5zaXRpb24gdG8gQHNje2dudX0gQGNvZGV7YXJ9IGZvciBkZXZlbG9wZXJzIHdobyBhbHJlYWR5IGhhdmUgc2NyaXB0cwotd3JpdHRlbiBmb3IgdGhlIE1SSSBgYGxpYnJhcmlhbicnIHByb2dyYW0uCi0KLVRoZSBzeW50YXggZm9yIHRoZSBAY29kZXthcn0gY29tbWFuZCBsYW5ndWFnZSBpcyBzdHJhaWdodGZvcndhcmQ6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotY29tbWFuZHMgYXJlIHJlY29nbml6ZWQgaW4gdXBwZXIgb3IgbG93ZXIgY2FzZTsgZm9yIGV4YW1wbGUsIEBjb2Rle0xJU1R9Ci1pcyB0aGUgc2FtZSBhcyBAY29kZXtsaXN0fS4gIEluIHRoZSBmb2xsb3dpbmcgZGVzY3JpcHRpb25zLCBjb21tYW5kcyBhcmUKLXNob3duIGluIHVwcGVyIGNhc2UgZm9yIGNsYXJpdHkuCi0KLUBpdGVtCi1hIHNpbmdsZSBjb21tYW5kIG1heSBhcHBlYXIgb24gZWFjaCBsaW5lOyBpdCBpcyB0aGUgZmlyc3Qgd29yZCBvbiB0aGUKLWxpbmUuCi0KLUBpdGVtCi1lbXB0eSBsaW5lcyBhcmUgYWxsb3dlZCwgYW5kIGhhdmUgbm8gZWZmZWN0LgotCi1AaXRlbQotY29tbWVudHMgYXJlIGFsbG93ZWQ7IHRleHQgYWZ0ZXIgZWl0aGVyIG9mIHRoZSBjaGFyYWN0ZXJzIEBzYW1weyp9Ci1vciBAc2FtcHs7fSBpcyBpZ25vcmVkLgotCi1AaXRlbQotV2hlbmV2ZXIgeW91IHVzZSBhIGxpc3Qgb2YgbmFtZXMgYXMgcGFydCBvZiB0aGUgYXJndW1lbnQgdG8gYW4gQGNvZGV7YXJ9Ci1jb21tYW5kLCB5b3UgY2FuIHNlcGFyYXRlIHRoZSBpbmRpdmlkdWFsIG5hbWVzIHdpdGggZWl0aGVyIGNvbW1hcyBvcgotYmxhbmtzLiAgQ29tbWFzIGFyZSBzaG93biBpbiB0aGUgZXhwbGFuYXRpb25zIGJlbG93LCBmb3IgY2xhcml0eS4KLQotQGl0ZW0KLUBzYW1weyt9IGlzIHVzZWQgYXMgYSBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXI7IGlmIEBzYW1weyt9IGFwcGVhcnMKLWF0IHRoZSBlbmQgb2YgYSBsaW5lLCB0aGUgdGV4dCBvbiB0aGUgZm9sbG93aW5nIGxpbmUgaXMgY29uc2lkZXJlZCBwYXJ0Ci1vZiB0aGUgY3VycmVudCBjb21tYW5kLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHRoZSBjb21tYW5kcyB5b3UgY2FuIHVzZSBpbiBAY29kZXthcn0gc2NyaXB0cywgb3Igd2hlbiB1c2luZwotQGNvZGV7YXJ9IGludGVyYWN0aXZlbHkuICBUaHJlZSBvZiB0aGVtIGhhdmUgc3BlY2lhbCBzaWduaWZpY2FuY2U6Ci0KLUBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0gc3BlY2lmeSBhIEBkZm57Y3VycmVudCBhcmNoaXZlfSwgd2hpY2ggaXMKLWEgdGVtcG9yYXJ5IGZpbGUgcmVxdWlyZWQgZm9yIG1vc3Qgb2YgdGhlIG90aGVyIGNvbW1hbmRzLgotCi1AY29kZXtTQVZFfSBjb21taXRzIHRoZSBjaGFuZ2VzIHNvIGZhciBzcGVjaWZpZWQgYnkgdGhlIHNjcmlwdC4gIFByaW9yCi10byBAY29kZXtTQVZFfSwgY29tbWFuZHMgYWZmZWN0IG9ubHkgdGhlIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBjdXJyZW50Ci1hcmNoaXZlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIEFERExJQiBAdmFye2FyY2hpdmV9IAotQGl0ZW14IEFERExJQiBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEB2YXJ7bW9kdWxlfSwgQGRvdHN7fSBAdmFye21vZHVsZX0pCi1BZGQgYWxsIHRoZSBjb250ZW50cyBvZiBAdmFye2FyY2hpdmV9IChvciwgaWYgc3BlY2lmaWVkLCBlYWNoIG5hbWVkCi1AdmFye21vZHVsZX0gZnJvbSBAdmFye2FyY2hpdmV9KSB0byB0aGUgY3VycmVudCBhcmNoaXZlLgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gQURETU9EIEB2YXJ7bWVtYmVyfSwgQHZhcnttZW1iZXJ9LCBAZG90c3t9IEB2YXJ7bWVtYmVyfQotQGMgRklYTUUhIHcvUmVwbGFjZW1lbnQ/PyAgSWYgc28sIGxpa2UgImFyIHIgQHZhcnthcmNoaXZlfSBAdmFye25hbWVzfSIKLUBjICAgICAgICBlbHNlIGxpa2UgImFyIHEuLi4iCi1BZGQgZWFjaCBuYW1lZCBAdmFye21lbWJlcn0gYXMgYSBtb2R1bGUgaW4gdGhlIGN1cnJlbnQgYXJjaGl2ZS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIENMRUFSCi1EaXNjYXJkIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBhcmNoaXZlLCBjYW5jZWxpbmcgdGhlIGVmZmVjdCBvZgotYW55IG9wZXJhdGlvbnMgc2luY2UgdGhlIGxhc3QgQGNvZGV7U0FWRX0uICBNYXkgYmUgZXhlY3V0ZWQgKHdpdGggbm8KLWVmZmVjdCkgZXZlbiBpZiAgbm8gY3VycmVudCBhcmNoaXZlIGlzIHNwZWNpZmllZC4KLQotQGl0ZW0gQ1JFQVRFIEB2YXJ7YXJjaGl2ZX0KLUNyZWF0ZXMgYW4gYXJjaGl2ZSwgYW5kIG1ha2VzIGl0IHRoZSBjdXJyZW50IGFyY2hpdmUgKHJlcXVpcmVkIGZvciBtYW55Ci1vdGhlciBjb21tYW5kcykuICBUaGUgbmV3IGFyY2hpdmUgaXMgY3JlYXRlZCB3aXRoIGEgdGVtcG9yYXJ5IG5hbWU7IGl0Ci1pcyBub3QgYWN0dWFsbHkgc2F2ZWQgYXMgQHZhcnthcmNoaXZlfSB1bnRpbCB5b3UgdXNlIEBjb2Rle1NBVkV9LgotWW91IGNhbiBvdmVyd3JpdGUgZXhpc3RpbmcgYXJjaGl2ZXM7IHNpbWlsYXJseSwgdGhlIGNvbnRlbnRzIG9mIGFueQotZXhpc3RpbmcgZmlsZSBuYW1lZCBAdmFye2FyY2hpdmV9IHdpbGwgbm90IGJlIGRlc3Ryb3llZCB1bnRpbCBAY29kZXtTQVZFfS4KLQotQGl0ZW0gREVMRVRFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRGVsZXRlIGVhY2ggbGlzdGVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmU7IGVxdWl2YWxlbnQgdG8KLUBzYW1we2FyIC1kIEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9IEBkb3Rze30gQHZhcnttb2R1bGV9fS4KLQotUmVxdWlyZXMgcHJpb3IgdXNlIG9mIEBjb2Rle09QRU59IG9yIEBjb2Rle0NSRUFURX0uCi0KLUBpdGVtIERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KQotQGl0ZW14IERJUkVDVE9SWSBAdmFye2FyY2hpdmV9IChAdmFye21vZHVsZX0sIEBkb3Rze30gQHZhcnttb2R1bGV9KSBAdmFye291dHB1dGZpbGV9Ci1MaXN0IGVhY2ggbmFtZWQgQHZhcnttb2R1bGV9IHByZXNlbnQgaW4gQHZhcnthcmNoaXZlfS4gIFRoZSBzZXBhcmF0ZQotY29tbWFuZCBAY29kZXtWRVJCT1NFfSBzcGVjaWZpZXMgdGhlIGZvcm0gb2YgdGhlIG91dHB1dDogd2hlbiB2ZXJib3NlCi1vdXRwdXQgaXMgb2ZmLCBvdXRwdXQgaXMgbGlrZSB0aGF0IG9mIEBzYW1we2FyIC10IEB2YXJ7YXJjaGl2ZX0KLUB2YXJ7bW9kdWxlfUBkb3Rze319LiAgV2hlbiB2ZXJib3NlIG91dHB1dCBpcyBvbiwgdGhlIGxpc3RpbmcgaXMgbGlrZQotQHNhbXB7YXIgLXR2IEB2YXJ7YXJjaGl2ZX0gQHZhcnttb2R1bGV9QGRvdHN7fX0uCi0KLU91dHB1dCBub3JtYWxseSBnb2VzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtOyBob3dldmVyLCBpZiB5b3UKLXNwZWNpZnkgQHZhcntvdXRwdXRmaWxlfSBhcyBhIGZpbmFsIGFyZ3VtZW50LCBAY29kZXthcn0gZGlyZWN0cyB0aGUKLW91dHB1dCB0byB0aGF0IGZpbGUuCi0KLUBpdGVtIEVORAotRXhpdCBmcm9tIEBjb2Rle2FyfSwgd2l0aCBhIEBjb2RlezB9IGV4aXQgY29kZSB0byBpbmRpY2F0ZSBzdWNjZXNzZnVsCi1jb21wbGV0aW9uLiAgVGhpcyBjb21tYW5kIGRvZXMgbm90IHNhdmUgdGhlIG91dHB1dCBmaWxlOyBpZiB5b3UgaGF2ZQotY2hhbmdlZCB0aGUgY3VycmVudCBhcmNoaXZlIHNpbmNlIHRoZSBsYXN0IEBjb2Rle1NBVkV9IGNvbW1hbmQsIHRob3NlCi1jaGFuZ2VzIGFyZSBsb3N0LgotCi1AaXRlbSBFWFRSQUNUIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotRXh0cmFjdCBlYWNoIG5hbWVkIEB2YXJ7bW9kdWxlfSBmcm9tIHRoZSBjdXJyZW50IGFyY2hpdmUsIHdyaXRpbmcgdGhlbQotaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgc2VwYXJhdGUgZmlsZXMuICBFcXVpdmFsZW50IHRvIEBzYW1we2FyIC14Ci1AdmFye2FyY2hpdmV9IEB2YXJ7bW9kdWxlfUBkb3Rze319LgotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGlnbm9yZQotQGMgRklYTUUgVG9rZW5zIGJ1dCBubyBjb21tYW5kcz8/PwotQGl0ZW0gRlVMTERJUgotCi1AaXRlbSBIRUxQCi1AZW5kIGlnbm9yZQotCi1AaXRlbSBMSVNUCi1EaXNwbGF5IGZ1bGwgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYXJjaGl2ZSwgaW4gYGB2ZXJib3NlJycgc3R5bGUKLXJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXRlIG9mIEBjb2Rle1ZFUkJPU0V9LiAgVGhlIGVmZmVjdCBpcyBsaWtlIEBzYW1we2FyCi10diBAdmFye2FyY2hpdmV9fS4gIChUaGlzIHNpbmdsZSBjb21tYW5kIGlzIGEgQHNje2dudX0gQGNvZGV7YXJ9Ci1lbmhhbmNlbWVudCwgcmF0aGVyIHRoYW4gcHJlc2VudCBmb3IgTVJJIGNvbXBhdGliaWxpdHkuKQotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gT1BFTiBAdmFye2FyY2hpdmV9Ci1PcGVucyBhbiBleGlzdGluZyBhcmNoaXZlIGZvciB1c2UgYXMgdGhlIGN1cnJlbnQgYXJjaGl2ZSAocmVxdWlyZWQgZm9yCi1tYW55IG90aGVyIGNvbW1hbmRzKS4gIEFueSBjaGFuZ2VzIGFzIHRoZSByZXN1bHQgb2Ygc3Vic2VxdWVudCBjb21tYW5kcwotd2lsbCBub3QgYWN0dWFsbHkgYWZmZWN0IEB2YXJ7YXJjaGl2ZX0gdW50aWwgeW91IG5leHQgdXNlIEBjb2Rle1NBVkV9LgotCi1AaXRlbSBSRVBMQUNFIEB2YXJ7bW9kdWxlfSwgQHZhcnttb2R1bGV9LCBAZG90c3t9IEB2YXJ7bW9kdWxlfQotSW4gdGhlIGN1cnJlbnQgYXJjaGl2ZSwgcmVwbGFjZSBlYWNoIGV4aXN0aW5nIEB2YXJ7bW9kdWxlfSAobmFtZWQgaW4KLXRoZSBAY29kZXtSRVBMQUNFfSBhcmd1bWVudHMpIGZyb20gZmlsZXMgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi1UbyBleGVjdXRlIHRoaXMgY29tbWFuZCB3aXRob3V0IGVycm9ycywgYm90aCB0aGUgZmlsZSwgYW5kIHRoZSBtb2R1bGUgaW4KLXRoZSBjdXJyZW50IGFyY2hpdmUsIG11c3QgZXhpc3QuIAotCi1SZXF1aXJlcyBwcmlvciB1c2Ugb2YgQGNvZGV7T1BFTn0gb3IgQGNvZGV7Q1JFQVRFfS4KLQotQGl0ZW0gVkVSQk9TRQotVG9nZ2xlIGFuIGludGVybmFsIGZsYWcgZ292ZXJuaW5nIHRoZSBvdXRwdXQgZnJvbSBAY29kZXtESVJFQ1RPUll9LgotV2hlbiB0aGUgZmxhZyBpcyBvbiwgQGNvZGV7RElSRUNUT1JZfSBvdXRwdXQgbWF0Y2hlcyBvdXRwdXQgZnJvbQotQHNhbXB7YXIgLXR2IH1AZG90c3t9LgotCi1AaXRlbSBTQVZFCi1Db21taXQgeW91ciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGFyY2hpdmUsIGFuZCBhY3R1YWxseSBzYXZlIGl0IGFzIGEKLWZpbGUgd2l0aCB0aGUgbmFtZSBzcGVjaWZpZWQgaW4gdGhlIGxhc3QgQGNvZGV7Q1JFQVRFfSBvciBAY29kZXtPUEVOfQotY29tbWFuZC4gCi0KLVJlcXVpcmVzIHByaW9yIHVzZSBvZiBAY29kZXtPUEVOfSBvciBAY29kZXtDUkVBVEV9LgotCi1AZW5kIHRhYmxlCi0KLUBpZnRleAotQG5vZGUgbGQKLUBjaGFwdGVyIGxkCi1AY2luZGV4IGxpbmtlcgotQGtpbmRleCBsZAotVGhlIEBzY3tnbnV9IGxpbmtlciBAY29kZXtsZH0gaXMgbm93IGRlc2NyaWJlZCBpbiBhIHNlcGFyYXRlIG1hbnVhbC4KLUB4cmVme1RvcCwsIE92ZXJ2aWV3LCwgVXNpbmcgTEQ6IHRoZSBAc2N7Z251fSBsaW5rZXJ9LgotQGVuZCBpZnRleAotCi1Abm9kZSBubQotQGNoYXB0ZXIgbm0KLUBjaW5kZXggc3ltYm9scwotQGtpbmRleCBubQotCi1Ac21hbGxleGFtcGxlCi1ubSBbIC1hIHwgLS1kZWJ1Zy1zeW1zIF0gIFsgLWcgfCAtLWV4dGVybi1vbmx5IF0KLSAgIFsgLUIgXSAgWyAtQyB8IC0tZGVtYW5nbGUgXSBbIC1EIHwgLS1keW5hbWljIF0KLSAgIFsgLXMgfCAtLXByaW50LWFybWFwIF0gIFsgLUEgfCAtbyB8IC0tcHJpbnQtZmlsZS1uYW1lIF0KLSAgIFsgLW4gfCAtdiB8IC0tbnVtZXJpYy1zb3J0IF0gIFsgLXAgfCAtLW5vLXNvcnQgXQotICAgWyAtciB8IC0tcmV2ZXJzZS1zb3J0IF0gIFsgLS1zaXplLXNvcnQgXSBbIC11IHwgLS11bmRlZmluZWQtb25seSBdCi0gICBbIC10IEB2YXJ7cmFkaXh9IHwgLS1yYWRpeD1AdmFye3JhZGl4fSBdIFsgLVAgfCAtLXBvcnRhYmlsaXR5IF0KLSAgIFsgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdIFsgLWYgQHZhcntmb3JtYXR9IHwgLS1mb3JtYXQ9QHZhcntmb3JtYXR9IF0KLSAgIFsgLS1kZWZpbmVkLW9ubHkgXSBbLWwgfCAtLWxpbmUtbnVtYmVycyBdCi0gICBbIC0tbm8tZGVtYW5nbGUgXSBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0gIFsgQHZhcntvYmpmaWxlfUBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQHNje2dudX0gQGNvZGV7bm19IGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIEB2YXJ7b2JqZmlsZX1AZG90c3t9LgotSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBsaXN0ZWQgYXMgYXJndW1lbnRzLCBAY29kZXtubX0gYXNzdW1lcwotQGZpbGV7YS5vdXR9LgotCi1Gb3IgZWFjaCBzeW1ib2wsIEBjb2Rle25tfSBzaG93czoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSBzeW1ib2wgdmFsdWUsIGluIHRoZSByYWRpeCBzZWxlY3RlZCBieSBvcHRpb25zIChzZWUgYmVsb3cpLCBvcgotaGV4YWRlY2ltYWwgYnkgZGVmYXVsdC4KLQotQGl0ZW0KLVRoZSBzeW1ib2wgdHlwZS4gIEF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHVzZWQ7IG90aGVycyBhcmUsIGFzCi13ZWxsLCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIElmIGxvd2VyY2FzZSwgdGhlIHN5bWJvbCBpcwotbG9jYWw7IGlmIHVwcGVyY2FzZSwgdGhlIHN5bWJvbCBpcyBnbG9iYWwgKGV4dGVybmFsKS4KLQotQGMgU29tZSBtb3JlIGRldGFpbCBvbiBleGFjdGx5IHdoYXQgdGhlc2Ugc3ltYm9sIHR5cGVzIGFyZSB1c2VkIGZvcgotQGMgd291bGQgYmUgbmljZS4KLUB0YWJsZSBAY29kZQotQGl0ZW0gQQotVGhlIHN5bWJvbCdzIHZhbHVlIGlzIGFic29sdXRlLCBhbmQgd2lsbCBub3QgYmUgY2hhbmdlZCBieSBmdXJ0aGVyCi1saW5raW5nLgotCi1AaXRlbSBCCi1UaGUgc3ltYm9sIGlzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiAoa25vd24gYXMgQlNTKS4KLQotQGl0ZW0gQwotVGhlIHN5bWJvbCBpcyBjb21tb24uICBDb21tb24gc3ltYm9scyBhcmUgdW5pbml0aWFsaXplZCBkYXRhLiAgV2hlbgotbGlua2luZywgbXVsdGlwbGUgY29tbW9uIHN5bWJvbHMgbWF5IGFwcGVhciB3aXRoIHRoZSBzYW1lIG5hbWUuICBJZiB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkIGFueXdoZXJlLCB0aGUgY29tbW9uIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgdW5kZWZpbmVkCi1yZWZlcmVuY2VzLiAgRm9yIG1vcmUgZGV0YWlscyBvbiBjb21tb24gc3ltYm9scywgc2VlIHRoZSBkaXNjdXNzaW9uIG9mCi0tLXdhcm4tY29tbW9uIGluIEByZWZ7T3B0aW9ucywsTGlua2VyIG9wdGlvbnMsbGQuaW5mbyxUaGUgR05VIGxpbmtlcn0uCi0KLUBpdGVtIEQKLVRoZSBzeW1ib2wgaXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4KLQotQGl0ZW0gRwotVGhlIHN5bWJvbCBpcyBpbiBhbiBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gZm9yIHNtYWxsIG9iamVjdHMuICBTb21lCi1vYmplY3QgZmlsZSBmb3JtYXRzIHBlcm1pdCBtb3JlIGVmZmljaWVudCBhY2Nlc3MgdG8gc21hbGwgZGF0YSBvYmplY3RzLAotc3VjaCBhcyBhIGdsb2JhbCBpbnQgdmFyaWFibGUgYXMgb3Bwb3NlZCB0byBhIGxhcmdlIGdsb2JhbCBhcnJheS4KLQotQGl0ZW0gSQotVGhlIHN5bWJvbCBpcyBhbiBpbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wuICBUaGlzIGlzIGEgR05VCi1leHRlbnNpb24gdG8gdGhlIGEub3V0IG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBpcyByYXJlbHkgdXNlZC4KLQotQGl0ZW0gTgotVGhlIHN5bWJvbCBpcyBhIGRlYnVnZ2luZyBzeW1ib2wuCi0KLUBpdGVtIFIKLVRoZSBzeW1ib2wgaXMgaW4gYSByZWFkIG9ubHkgZGF0YSBzZWN0aW9uLgotCi1AaXRlbSBTCi1UaGUgc3ltYm9sIGlzIGluIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGZvciBzbWFsbCBvYmplY3RzLgotCi1AaXRlbSBUCi1UaGUgc3ltYm9sIGlzIGluIHRoZSB0ZXh0IChjb2RlKSBzZWN0aW9uLgotCi1AaXRlbSBVCi1UaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4KLQotQGl0ZW0gVwotVGhlIHN5bWJvbCBpcyB3ZWFrLiAgV2hlbiBhIHdlYWsgZGVmaW5lZCBzeW1ib2wgaXMgbGlua2VkIHdpdGggYSBub3JtYWwKLWRlZmluZWQgc3ltYm9sLCB0aGUgbm9ybWFsIGRlZmluZWQgc3ltYm9sIGlzIHVzZWQgd2l0aCBubyBlcnJvci4gIFdoZW4gYQotd2VhayB1bmRlZmluZWQgc3ltYm9sIGlzIGxpbmtlZCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgZGVmaW5lZCwgdGhlIHZhbHVlCi1vZiB0aGUgd2VhayBzeW1ib2wgYmVjb21lcyB6ZXJvIHdpdGggbm8gZXJyb3IuCi0KLUBpdGVtIC0KLVRoZSBzeW1ib2wgaXMgYSBzdGFicyBzeW1ib2wgaW4gYW4gYS5vdXQgb2JqZWN0IGZpbGUuICBJbiB0aGlzIGNhc2UsIHRoZQotbmV4dCB2YWx1ZXMgcHJpbnRlZCBhcmUgdGhlIHN0YWJzIG90aGVyIGZpZWxkLCB0aGUgc3RhYnMgZGVzYyBmaWVsZCwgYW5kCi10aGUgc3RhYiB0eXBlLiAgU3RhYnMgc3ltYm9scyBhcmUgdXNlZCB0byBob2xkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjsKLWZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgQHJlZntUb3AsU3RhYnMsU3RhYnMgT3ZlcnZpZXcsc3RhYnMuaW5mbywgVGhlCi1gYHN0YWJzJycgZGVidWcgZm9ybWF0fS4KLQotQGl0ZW0gPwotVGhlIHN5bWJvbCB0eXBlIGlzIHVua25vd24sIG9yIG9iamVjdCBmaWxlIGZvcm1hdCBzcGVjaWZpYy4KLUBlbmQgdGFibGUKLQotQGl0ZW0KLVRoZSBzeW1ib2wgbmFtZS4KLUBlbmQgaXRlbWl6ZQotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQQotQGl0ZW14IC1vCi1AaXRlbXggLS1wcmludC1maWxlLW5hbWUgCi1AY2luZGV4IGlucHV0IGZpbGUgbmFtZQotQGNpbmRleCBmaWxlIG5hbWUKLUBjaW5kZXggc291cmNlIGZpbGUgbmFtZQotUHJlY2VkZSBlYWNoIHN5bWJvbCBieSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSAob3IgYXJjaGl2ZSBlbGVtZW50KQotaW4gd2hpY2ggaXQgd2FzIGZvdW5kLCByYXRoZXIgdGhhbiBpZGVudGlmeWluZyB0aGUgaW5wdXQgZmlsZSBvbmNlIG9ubHksCi1iZWZvcmUgYWxsIG9mIGl0cyBzeW1ib2xzLgotCi1AaXRlbSAtYQotQGl0ZW14IC0tZGVidWctc3ltcyAKLUBjaW5kZXggZGVidWdnaW5nIHN5bWJvbHMKLURpc3BsYXkgYWxsIHN5bWJvbHMsIGV2ZW4gZGVidWdnZXItb25seSBzeW1ib2xzOyBub3JtYWxseSB0aGVzZSBhcmUgbm90Ci1saXN0ZWQuCi0KLUBpdGVtIC1CCi1AY2luZGV4IEBjb2Rle25tfSBmb3JtYXQKLUBjaW5kZXggQGNvZGV7bm19IGNvbXBhdGliaWxpdHkKLVRoZSBzYW1lIGFzIEBzYW1wey0tZm9ybWF0PWJzZH0gKGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIE1JUFMgQGNvZGV7bm19KS4KLQotQGl0ZW0gLUMKLUBpdGVteCAtLWRlbWFuZ2xlCi1AY2luZGV4IGRlbWFuZ2xpbmcgaW4gbm0KLURlY29kZSAoQGRmbntkZW1hbmdsZX0pIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuICBAeHJlZntjKytmaWx0fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIGRlbWFuZ2xpbmcuCi0KLUBpdGVtIC0tbm8tZGVtYW5nbGUKLURvIG5vdCBkZW1hbmdsZSBsb3ctbGV2ZWwgc3ltYm9sIG5hbWVzLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLWR5bmFtaWMKLUBjaW5kZXggZHluYW1pYyBzeW1ib2xzCi1EaXNwbGF5IHRoZSBkeW5hbWljIHN5bWJvbHMgcmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBzeW1ib2xzLiAgVGhpcyBpcwotb25seSBtZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotQGl0ZW0gLWYgQHZhcntmb3JtYXR9Ci1AaXRlbXggLS1mb3JtYXQ9QHZhcntmb3JtYXR9Ci1AY2luZGV4IEBjb2Rle25tfSBmb3JtYXQKLUBjaW5kZXggQGNvZGV7bm19IGNvbXBhdGliaWxpdHkKLVVzZSB0aGUgb3V0cHV0IGZvcm1hdCBAdmFye2Zvcm1hdH0sIHdoaWNoIGNhbiBiZSBAY29kZXtic2R9LAotQGNvZGV7c3lzdn0sIG9yIEBjb2Rle3Bvc2l4fS4gIFRoZSBkZWZhdWx0IGlzIEBjb2Rle2JzZH0uCi1Pbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgQHZhcntmb3JtYXR9IGlzIHNpZ25pZmljYW50OyBpdCBjYW4gYmUKLWVpdGhlciB1cHBlciBvciBsb3dlciBjYXNlLgotCi1AaXRlbSAtZwotQGl0ZW14IC0tZXh0ZXJuLW9ubHkgCi1AY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKLURpc3BsYXkgb25seSBleHRlcm5hbCBzeW1ib2xzLgotCi1AaXRlbSAtbAotQGl0ZW14IC0tbGluZS1udW1iZXJzCi1AY2luZGV4IHN5bWJvbCBsaW5lIG51bWJlcnMKLUZvciBlYWNoIHN5bWJvbCwgdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byB0cnkgdG8gZmluZCBhIGZpbGVuYW1lIGFuZAotbGluZSBudW1iZXIuICBGb3IgYSBkZWZpbmVkIHN5bWJvbCwgbG9vayBmb3IgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZQotYWRkcmVzcyBvZiB0aGUgc3ltYm9sLiAgRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lCi1udW1iZXIgb2YgYSByZWxvY2F0aW9uIGVudHJ5IHdoaWNoIHJlZmVycyB0byB0aGUgc3ltYm9sLiAgSWYgbGluZSBudW1iZXIKLWluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCwgcHJpbnQgaXQgYWZ0ZXIgdGhlIG90aGVyIHN5bWJvbCBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLW4KLUBpdGVteCAtdgotQGl0ZW14IC0tbnVtZXJpYy1zb3J0IAotU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IHRoZWlyIGFkZHJlc3NlcywgcmF0aGVyIHRoYW4gYWxwaGFiZXRpY2FsbHkKLWJ5IHRoZWlyIG5hbWVzLiAKLQotQGl0ZW0gLXAKLUBpdGVteCAtLW5vLXNvcnQgCi1AY2luZGV4IHNvcnRpbmcgc3ltYm9scwotRG8gbm90IGJvdGhlciB0byBzb3J0IHRoZSBzeW1ib2xzIGluIGFueSBvcmRlcjsgcHJpbnQgdGhlbSBpbiB0aGUgb3JkZXIKLWVuY291bnRlcmVkLgotCi1AaXRlbSAtUAotQGl0ZW14IC0tcG9ydGFiaWxpdHkKLVVzZSB0aGUgUE9TSVguMiBzdGFuZGFyZCBvdXRwdXQgZm9ybWF0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9ybWF0LgotRXF1aXZhbGVudCB0byBAc2FtcHstZiBwb3NpeH0uCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1wcmludC1hcm1hcAotQGNpbmRleCBzeW1ib2wgaW5kZXgsIGxpc3RpbmcKLVdoZW4gbGlzdGluZyBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzLCBpbmNsdWRlIHRoZSBpbmRleDogYSBtYXBwaW5nCi0oc3RvcmVkIGluIHRoZSBhcmNoaXZlIGJ5IEBjb2Rle2FyfSBvciBAY29kZXtyYW5saWJ9KSBvZiB3aGljaCBtb2R1bGVzCi1jb250YWluIGRlZmluaXRpb25zIGZvciB3aGljaCBuYW1lcy4KLQotQGl0ZW0gLXIKLUBpdGVteCAtLXJldmVyc2Utc29ydCAKLVJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzb3J0ICh3aGV0aGVyIG51bWVyaWMgb3IgYWxwaGFiZXRpYyk7IGxldCB0aGUKLWxhc3QgY29tZSBmaXJzdC4KLQotQGl0ZW0gLS1zaXplLXNvcnQKLVNvcnQgc3ltYm9scyBieSBzaXplLiAgVGhlIHNpemUgaXMgY29tcHV0ZWQgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIHdpdGggdGhlIG5leHQgaGlnaGVyCi12YWx1ZS4gIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgaXMgcHJpbnRlZCwgcmF0aGVyIHRoYW4gdGhlIHZhbHVlLgotCi1AaXRlbSAtdCBAdmFye3JhZGl4fQotQGl0ZW14IC0tcmFkaXg9QHZhcntyYWRpeH0KLVVzZSBAdmFye3JhZGl4fSBhcyB0aGUgcmFkaXggZm9yIHByaW50aW5nIHRoZSBzeW1ib2wgdmFsdWVzLiAgSXQgbXVzdCBiZQotQHNhbXB7ZH0gZm9yIGRlY2ltYWwsIEBzYW1we299IGZvciBvY3RhbCwgb3IgQHNhbXB7eH0gZm9yIGhleGFkZWNpbWFsLgotCi1AaXRlbSAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1AY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAotU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtdQotQGl0ZW14IC0tdW5kZWZpbmVkLW9ubHkgCi1AY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKLUBjaW5kZXggdW5kZWZpbmVkIHN5bWJvbHMKLURpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyAodGhvc2UgZXh0ZXJuYWwgdG8gZWFjaCBvYmplY3QgZmlsZSkuCi0KLUBpdGVtIC0tZGVmaW5lZC1vbmx5Ci1AY2luZGV4IGV4dGVybmFsIHN5bWJvbHMKLUBjaW5kZXggdW5kZWZpbmVkIHN5bWJvbHMKLURpc3BsYXkgb25seSBkZWZpbmVkIHN5bWJvbHMgZm9yIGVhY2ggb2JqZWN0IGZpbGUuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtubX0gYW5kIGV4aXQuCi0KLUBpdGVtIC0taGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7bm19IGFuZCBleGl0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBvYmpjb3B5Ci1AY2hhcHRlciBvYmpjb3B5Ci0KLUBzbWFsbGV4YW1wbGUKLW9iamNvcHkgWyAtRiBAdmFye2JmZG5hbWV9IHwgLS10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLUkgQHZhcntiZmRuYW1lfSB8IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1PIEB2YXJ7YmZkbmFtZX0gfCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICAgIFsgLVMgfCAtLXN0cmlwLWFsbCBdICBbIC1nIHwgLS1zdHJpcC1kZWJ1ZyBdCi0gICAgICAgIFsgLUsgQHZhcntzeW1ib2xuYW1lfSB8IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICAgIFsgLU4gQHZhcntzeW1ib2xuYW1lfSB8IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgICBbIC1MIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLWxvY2FsaXplLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgICAgWyAtVyBAdmFye3N5bWJvbG5hbWV9IHwgLS13ZWFrZW4tc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0gXQotICAgICAgICBbIC14IHwgLS1kaXNjYXJkLWFsbCBdICBbIC1YIHwgLS1kaXNjYXJkLWxvY2FscyBdCi0gICAgICAgIFsgLWIgQHZhcntieXRlfSB8IC0tYnl0ZT1AdmFye2J5dGV9IF0KLSAgICAgICAgWyAtaSBAdmFye2ludGVybGVhdmV9IHwgLS1pbnRlcmxlYXZlPUB2YXJ7aW50ZXJsZWF2ZX0gXQotICAgICAgICBbIC1qIEB2YXJ7c2VjdGlvbm5hbWV9IHwgLS1vbmx5LXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQotICAgICAgICBbIC1SIEB2YXJ7c2VjdGlvbm5hbWV9IHwgLS1yZW1vdmUtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfSBdCi0gICAgICAgIFsgLXAgfCAtLXByZXNlcnZlLWRhdGVzIF0gWyAtLWRlYnVnZ2luZyBdCi0gICAgICAgIFsgLS1nYXAtZmlsbD1AdmFye3ZhbH0gXSBbIC0tcGFkLXRvPUB2YXJ7YWRkcmVzc30gXQotICAgICAgICBbIC0tc2V0LXN0YXJ0PUB2YXJ7dmFsfSBdIFsgLS1hZGp1c3Qtc3RhcnQ9QHZhcntpbmNyfSBdCi0gICAgICAgIFsgLS1jaGFuZ2UtYWRkcmVzc2VzPUB2YXJ7aW5jcn0gXQotICAgICAgICBbIC0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzcz1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLWxtYT1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KLSAgICAgICAgWyAtLWNoYW5nZS1zZWN0aW9uLXZtYT1AdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9IF0KLSAgICAgICAgWyAtLWNoYW5nZS13YXJuaW5ncyBdIFsgLS1uby1jaGFuZ2Utd2FybmluZ3MgXQotICAgICAgICBbIC0tc2V0LXNlY3Rpb24tZmxhZ3M9QHZhcntzZWN0aW9ufT1AdmFye2ZsYWdzfSBdCi0gICAgICAgIFsgLS1hZGQtc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfT1AdmFye2ZpbGVuYW1lfSBdCi0gICAgICAgIFsgLS1jaGFuZ2UtbGVhZGluZy1jaGFyIF0gWyAtLXJlbW92ZS1sZWFkaW5nLWNoYXIgXQotICAgICAgICBbIC0td2Vha2VuIF0KLSAgICAgICAgWyAtdiB8IC0tdmVyYm9zZSBdIFsgLVYgfCAtLXZlcnNpb24gXSAgWyAtLWhlbHAgXQotICAgICAgICBAdmFye2luZmlsZX0gW0B2YXJ7b3V0ZmlsZX1dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQHNje2dudX0gQGNvZGV7b2JqY29weX0gdXRpbGl0eSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdAotZmlsZSB0byBhbm90aGVyLiAgQGNvZGV7b2JqY29weX0gdXNlcyB0aGUgQHNje2dudX0gQHNje2JmZH0gTGlicmFyeSB0bwotcmVhZCBhbmQgd3JpdGUgdGhlIG9iamVjdCBmaWxlcy4gIEl0IGNhbiB3cml0ZSB0aGUgZGVzdGluYXRpb24gb2JqZWN0Ci1maWxlIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YgdGhlIHNvdXJjZSBvYmplY3QgZmlsZS4gIFRoZQotZXhhY3QgYmVoYXZpb3Igb2YgQGNvZGV7b2JqY29weX0gaXMgY29udHJvbGxlZCBieSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KLQotQGNvZGV7b2JqY29weX0gY3JlYXRlcyB0ZW1wb3JhcnkgZmlsZXMgdG8gZG8gaXRzIHRyYW5zbGF0aW9ucyBhbmQKLWRlbGV0ZXMgdGhlbSBhZnRlcndhcmQuICBAY29kZXtvYmpjb3B5fSB1c2VzIEBzY3tiZmR9IHRvIGRvIGFsbCBpdHMKLXRyYW5zbGF0aW9uIHdvcms7IGl0IGhhcyBhY2Nlc3MgdG8gYWxsIHRoZSBmb3JtYXRzIGRlc2NyaWJlZCBpbiBAc2N7YmZkfQotYW5kIHRodXMgaXMgYWJsZSB0byByZWNvZ25pemUgbW9zdCBmb3JtYXRzIHdpdGhvdXQgYmVpbmcgdG9sZAotZXhwbGljaXRseS4gIEB4cmVme0JGRCwsQkZELGxkLmluZm8sVXNpbmcgTER9LgotCi1AY29kZXtvYmpjb3B5fSBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBTLXJlY29yZHMgYnkgdXNpbmcgYW4gb3V0cHV0Ci10YXJnZXQgb2YgQHNhbXB7c3JlY30gKGUuZy4sIHVzZSBAc2FtcHstTyBzcmVjfSkuCi0KLUBjb2Rle29iamNvcHl9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcmF3IGJpbmFyeSBmaWxlIGJ5IHVzaW5nIGFuCi1vdXRwdXQgdGFyZ2V0IG9mIEBzYW1we2JpbmFyeX0gKGUuZy4sIHVzZSBAc2FtcHstTyBiaW5hcnl9KS4gIFdoZW4KLUBjb2Rle29iamNvcHl9IGdlbmVyYXRlcyBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgd2lsbCBlc3NlbnRpYWxseSBwcm9kdWNlCi1hIG1lbW9yeSBkdW1wIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgaW5wdXQgb2JqZWN0IGZpbGUuICBBbGwgc3ltYm9scyBhbmQKLXJlbG9jYXRpb24gaW5mb3JtYXRpb24gd2lsbCBiZSBkaXNjYXJkZWQuICBUaGUgbWVtb3J5IGR1bXAgd2lsbCBzdGFydCBhdAotdGhlIGxvYWQgYWRkcmVzcyBvZiB0aGUgbG93ZXN0IHNlY3Rpb24gY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLgotCi1XaGVuIGdlbmVyYXRpbmcgYW4gUy1yZWNvcmQgb3IgYSByYXcgYmluYXJ5IGZpbGUsIGl0IG1heSBiZSBoZWxwZnVsIHRvCi11c2UgQHNhbXB7LVN9IHRvIHJlbW92ZSBzZWN0aW9ucyBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluCi1zb21lIGNhc2VzIEBzYW1wey1SfSB3aWxsIGJlIHVzZWZ1bCB0byByZW1vdmUgc2VjdGlvbnMgd2hpY2ggY29udGFpbgotaW5mb3JtYXRpb24gd2hpY2ggaXMgbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntpbmZpbGV9Ci1AaXRlbXggQHZhcntvdXRmaWxlfQotVGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZpbGVzLCByZXNwZWN0aXZlbHkuCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgQHZhcntvdXRmaWxlfSwgQGNvZGV7b2JqY29weX0gY3JlYXRlcyBhCi10ZW1wb3JhcnkgZmlsZSBhbmQgZGVzdHJ1Y3RpdmVseSByZW5hbWVzIHRoZSByZXN1bHQgd2l0aAotdGhlIG5hbWUgb2YgQHZhcntpbmZpbGV9LgotCi1AaXRlbSAtSSBAdmFye2JmZG5hbWV9CQotQGl0ZW14IC0taW5wdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUNvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgQHZhcntiZmRuYW1lfSwgcmF0aGVyIHRoYW4KLWF0dGVtcHRpbmcgdG8gZGVkdWNlIGl0LiAgQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtTyBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVdyaXRlIHRoZSBvdXRwdXQgZmlsZSB1c2luZyB0aGUgb2JqZWN0IGZvcm1hdCBAdmFye2JmZG5hbWV9LgotQHhyZWZ7VGFyZ2V0IFNlbGVjdGlvbn0sIGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtRiBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS10YXJnZXQ9QHZhcntiZmRuYW1lfQotVXNlIEB2YXJ7YmZkbmFtZX0gYXMgdGhlIG9iamVjdCBmb3JtYXQgZm9yIGJvdGggdGhlIGlucHV0IGFuZCB0aGUgb3V0cHV0Ci1maWxlOyBpLmUuLCBzaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vCi10cmFuc2xhdGlvbi4gIEB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLWogQHZhcntzZWN0aW9ubmFtZX0KLUBpdGVteCAtLW9ubHktc2VjdGlvbj1AdmFye3NlY3Rpb25uYW1lfQotQ29weSBvbmx5IHRoZSBuYW1lZCBzZWN0aW9uIGZyb20gdGhlIGlucHV0IGZpbGUgdG8gdGhlIG91dHB1dCBmaWxlLgotVGhpcyBvcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uCi1pbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dCBmaWxlIHVudXNhYmxlLgotCi1AaXRlbSAtUiBAdmFye3NlY3Rpb25uYW1lfQotQGl0ZW14IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0KLVJlbW92ZSBhbnkgc2VjdGlvbiBuYW1lZCBAdmFye3NlY3Rpb25uYW1lfSBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24KLWluYXBwcm9wcmlhdGVseSBtYXkgbWFrZSB0aGUgb3V0cHV0IGZpbGUgdW51c2FibGUuCi0KLUBpdGVtIC1TCi1AaXRlbXggLS1zdHJpcC1hbGwKLURvIG5vdCBjb3B5IHJlbG9jYXRpb24gYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLQotQGl0ZW0gLWcKLUBpdGVteCAtLXN0cmlwLWRlYnVnCi1EbyBub3QgY29weSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLQotQGl0ZW0gLS1zdHJpcC11bm5lZWRlZAotU3RyaXAgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotCi1AaXRlbSAtSyBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1rZWVwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1Db3B5IG9ubHkgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuICBUaGlzIG9wdGlvbiBtYXkKLWJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtTiBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1zdHJpcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotRG8gbm90IGNvcHkgc3ltYm9sIEB2YXJ7c3ltYm9sbmFtZX0gZnJvbSB0aGUgc291cmNlIGZpbGUuICBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLgotCi1AaXRlbSAtTCBAdmFye3N5bWJvbG5hbWV9Ci1AaXRlbXggLS1sb2NhbGl6ZS1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotTWFrZSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBsb2NhbCB0byB0aGUgZmlsZSwgc28gdGhhdCBpdCBpcyBub3QKLXZpc2libGUgZXh0ZXJuYWxseS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLVcgQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0td2Vha2VuLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9Ci1NYWtlIHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IHdlYWsuIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWRpc2NhcmQtYWxsCi1EbyBub3QgY29weSBub24tZ2xvYmFsIHN5bWJvbHMgZnJvbSB0aGUgc291cmNlIGZpbGUuCi1AYyBGSVhNRSBhbnkgcmVhc29uIHRvIHByZWZlciAibm9uLWdsb2JhbCIgdG8gImxvY2FsIiBoZXJlPwotCi1AaXRlbSAtWAotQGl0ZW14IC0tZGlzY2FyZC1sb2NhbHMKLURvIG5vdCBjb3B5IGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLgotKFRoZXNlIHVzdWFsbHkgc3RhcnQgd2l0aCBAc2FtcHtMfSBvciBAc2FtcHsufS4pCi0KLUBpdGVtIC1iIEB2YXJ7Ynl0ZX0KLUBpdGVteCAtLWJ5dGU9QHZhcntieXRlfQotS2VlcCBvbmx5IGV2ZXJ5IEB2YXJ7Ynl0ZX10aCBieXRlIG9mIHRoZSBpbnB1dCBmaWxlIChoZWFkZXIgZGF0YSBpcyBub3QKLWFmZmVjdGVkKS4gIEB2YXJ7Ynl0ZX0gY2FuIGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gQHZhcntpbnRlcmxlYXZlfS0xLAotd2hlcmUgQHZhcntpbnRlcmxlYXZlfSBpcyBnaXZlbiBieSB0aGUgQHNhbXB7LWl9IG9yIEBzYW1wey0taW50ZXJsZWF2ZX0KLW9wdGlvbiwgb3IgdGhlIGRlZmF1bHQgb2YgNC4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgZmlsZXMKLXRvIHByb2dyYW0gQHNje3JvbX0uICBJdCBpcyB0eXBpY2FsbHkgdXNlZCB3aXRoIGFuIEBjb2Rle3NyZWN9IG91dHB1dAotdGFyZ2V0LgotCi1AaXRlbSAtaSBAdmFye2ludGVybGVhdmV9Ci1AaXRlbXggLS1pbnRlcmxlYXZlPUB2YXJ7aW50ZXJsZWF2ZX0KLU9ubHkgY29weSBvbmUgb3V0IG9mIGV2ZXJ5IEB2YXJ7aW50ZXJsZWF2ZX0gYnl0ZXMuICBTZWxlY3Qgd2hpY2ggYnl0ZSB0bwotY29weSB3aXRoIHRoZSBAdmFyey1ifSBvciBAc2FtcHstLWJ5dGV9IG9wdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDQuCi1AY29kZXtvYmpjb3B5fSBpZ25vcmVzIHRoaXMgb3B0aW9uIGlmIHlvdSBkbyBub3Qgc3BlY2lmeSBlaXRoZXIgQHNhbXB7LWJ9IG9yCi1Ac2FtcHstLWJ5dGV9LgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJlc2VydmUtZGF0ZXMKLVNldCB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIG91dHB1dCBmaWxlIHRvIGJlIHRoZSBzYW1lCi1hcyB0aG9zZSBvZiB0aGUgaW5wdXQgZmlsZS4KLQotQGl0ZW0gLS1kZWJ1Z2dpbmcKLUNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpZiBwb3NzaWJsZS4gIFRoaXMgaXMgbm90IHRoZSBkZWZhdWx0Ci1iZWNhdXNlIG9ubHkgY2VydGFpbiBkZWJ1Z2dpbmcgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlCi1jb252ZXJzaW9uIHByb2Nlc3MgY2FuIGJlIHRpbWUgY29uc3VtaW5nLgotCi1AaXRlbSAtLWdhcC1maWxsIEB2YXJ7dmFsfQotRmlsbCBnYXBzIGJldHdlZW4gc2VjdGlvbnMgd2l0aCBAdmFye3ZhbH0uICBUaGlzIG9wZXJhdGlvbiBhcHBsaWVzIHRvCi10aGUgQGVtcGh7bG9hZCBhZGRyZXNzfSAoTE1BKSBvZiB0aGUgc2VjdGlvbnMuICBJdCBpcyBkb25lIGJ5IGluY3JlYXNpbmcKLXRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIHdpdGggdGhlIGxvd2VyIGFkZHJlc3MsIGFuZCBmaWxsaW5nIGluIHRoZSBleHRyYQotc3BhY2UgY3JlYXRlZCB3aXRoIEB2YXJ7dmFsfS4KLQotQGl0ZW0gLS1wYWQtdG8gQHZhcnthZGRyZXNzfQotUGFkIHRoZSBvdXRwdXQgZmlsZSB1cCB0byB0aGUgbG9hZCBhZGRyZXNzIEB2YXJ7YWRkcmVzc30uICBUaGlzIGlzCi1kb25lIGJ5IGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIGxhc3Qgc2VjdGlvbi4gIFRoZSBleHRyYSBzcGFjZSBpcwotZmlsbGVkIGluIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZCBieSBAc2FtcHstLWdhcC1maWxsfSAoZGVmYXVsdCB6ZXJvKS4KLQotQGl0ZW0gLS1zZXQtc3RhcnQgQHZhcnt2YWx9Ci1TZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIG5ldyBmaWxlIHRvIEB2YXJ7dmFsfS4gIE5vdCBhbGwgb2JqZWN0IGZpbGUKLWZvcm1hdHMgc3VwcG9ydCBzZXR0aW5nIHRoZSBzdGFydCBhZGRyZXNzLgotCi1AaXRlbSAtLWNoYW5nZS1zdGFydCBAdmFye2luY3J9Ci1AaXRlbXggLS1hZGp1c3Qtc3RhcnQgQHZhcntpbmNyfQotQGNpbmRleCBjaGFuZ2luZyBzdGFydCBhZGRyZXNzCi1DaGFuZ2UgdGhlIHN0YXJ0IGFkZHJlc3MgYnkgYWRkaW5nIEB2YXJ7aW5jcn0uICBOb3QgYWxsIG9iamVjdCBmaWxlCi1mb3JtYXRzIHN1cHBvcnQgc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcy4KLQotQGl0ZW0gLS1jaGFuZ2UtYWRkcmVzc2VzIEB2YXJ7aW5jcn0KLUBpdGVteCAtLWFkanVzdC12bWEgQHZhcntpbmNyfQotQGNpbmRleCBjaGFuZ2luZyBvYmplY3QgYWRkcmVzc2VzCi1DaGFuZ2UgdGhlIFZNQSBhbmQgTE1BIGFkZHJlc3NlcyBvZiBhbGwgc2VjdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN0YXJ0Ci1hZGRyZXNzLCBieSBhZGRpbmcgQHZhcntpbmNyfS4gIFNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBkbyBub3QgcGVybWl0Ci1zZWN0aW9uIGFkZHJlc3NlcyB0byBiZSBjaGFuZ2VkIGFyYml0cmFyaWx5LiAgTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QKLXJlbG9jYXRlIHRoZSBzZWN0aW9uczsgaWYgdGhlIHByb2dyYW0gZXhwZWN0cyBzZWN0aW9ucyB0byBiZSBsb2FkZWQgYXQgYQotY2VydGFpbiBhZGRyZXNzLCBhbmQgdGhpcyBvcHRpb24gaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHNlY3Rpb25zIHN1Y2gKLXRoYXQgdGhleSBhcmUgbG9hZGVkIGF0IGEgZGlmZmVyZW50IGFkZHJlc3MsIHRoZSBwcm9ncmFtIG1heSBmYWlsLiAKLQotQGl0ZW0gLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIEB2YXJ7c2VjdGlvbn1Aez0sKywtQH1AdmFye3ZhbH0KLUBpdGVteCAtLWFkanVzdC1zZWN0aW9uLXZtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gYWRkcmVzcwotU2V0IG9yIGNoYW5nZSBib3RoIHRoZSBWTUEgYWRkcmVzcyBhbmQgdGhlIExNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZAotQHZhcntzZWN0aW9ufS4gIElmIEBzYW1wez19IGlzIHVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvCi1AdmFye3ZhbH0uICBPdGhlcndpc2UsIEB2YXJ7dmFsfSBpcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlCi1zZWN0aW9uIGFkZHJlc3MuICBTZWUgdGhlIGNvbW1lbnRzIHVuZGVyIEBzYW1wey0tY2hhbmdlLWFkZHJlc3Nlc30sCi1hYm92ZS4gSWYgQHZhcntzZWN0aW9ufSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwKLWJlIGlzc3VlZCwgdW5sZXNzIEBzYW1wey0tbm8tY2hhbmdlLXdhcm5pbmdzfSBpcyB1c2VkLgotCi1AaXRlbSAtLWNoYW5nZS1zZWN0aW9uLWxtYSBAdmFye3NlY3Rpb259QHs9LCssLUB9QHZhcnt2YWx9Ci1AY2luZGV4IGNoYW5naW5nIHNlY3Rpb24gTE1BCi1TZXQgb3IgY2hhbmdlIHRoZSBMTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFRoZSBMTUEKLWFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHNlY3Rpb24gd2lsbCBiZSBsb2FkZWQgaW50byBtZW1vcnkgYXQKLXByb2dyYW0gbG9hZCB0aW1lLiAgTm9ybWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgVk1BIGFkZHJlc3MsIHdoaWNoCi1pcyB0aGUgYWRkcmVzcyBvZiB0aGUgc2VjdGlvbiBhdCBwcm9ncmFtIHJ1biB0aW1lLCBidXQgb24gc29tZSBzeXN0ZW1zLAotZXNwZWNpYWxseSB0aG9zZSB3aGVyZSBhIHByb2dyYW0gaXMgaGVsZCBpbiBST00sIHRoZSB0d28gY2FuIGJlCi1kaWZmZXJlbnQuICBJZiBAc2FtcHs9fSBpcyB1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzIGlzIHNldCB0bwotQHZhcnt2YWx9LiAgT3RoZXJ3aXNlLCBAdmFye3ZhbH0gaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZQotc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlciBAc2FtcHstLWNoYW5nZS1hZGRyZXNzZXN9LAotYWJvdmUuICBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcKLXdpbGwgYmUgaXNzdWVkLCB1bmxlc3MgQHNhbXB7LS1uby1jaGFuZ2Utd2FybmluZ3N9IGlzIHVzZWQuICAKLQotQGl0ZW0gLS1jaGFuZ2Utc2VjdGlvbi12bWEgQHZhcntzZWN0aW9ufUB7PSwrLC1AfUB2YXJ7dmFsfQotQGNpbmRleCBjaGFuZ2luZyBzZWN0aW9uIFZNQQotU2V0IG9yIGNoYW5nZSB0aGUgVk1BIGFkZHJlc3Mgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGUgVk1BCi1hZGRyZXNzIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwgYmUgbG9jYXRlZCBvbmNlIHRoZQotcHJvZ3JhbSBoYXMgc3RhcnRlZCBleGVjdXRpbmcuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBMTUEKLWFkZHJlc3MsIHdoaWNoIGlzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBzZWN0aW9uIHdpbGwgYmUgbG9hZGVkIGludG8KLW1lbW9yeSwgYnV0IG9uIHNvbWUgc3lzdGVtcywgZXNwZWNpYWxseSB0aG9zZSB3aGVyZSBhIHByb2dyYW0gaXMgaGVsZCBpbgotUk9NLCB0aGUgdHdvIGNhbiBiZSBkaWZmZXJlbnQuICBJZiBAc2FtcHs9fSBpcyB1c2VkLCB0aGUgc2VjdGlvbiBhZGRyZXNzCi1pcyBzZXQgdG8gQHZhcnt2YWx9LiAgT3RoZXJ3aXNlLCBAdmFye3ZhbH0gaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZAotZnJvbSB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlcgotQHNhbXB7LS1jaGFuZ2UtYWRkcmVzc2VzfSwgYWJvdmUuICBJZiBAdmFye3NlY3Rpb259IGRvZXMgbm90IGV4aXN0IGluCi10aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKLUBzYW1wey0tbm8tY2hhbmdlLXdhcm5pbmdzfSBpcyB1c2VkLiAgIAotCi1AaXRlbSAtLWNoYW5nZS13YXJuaW5ncwotQGl0ZW14IC0tYWRqdXN0LXdhcm5pbmdzCi1JZiBAc2FtcHstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3N9IG9yIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tbG1hfSBvcgotQHNhbXB7LS1jaGFuZ2Utc2VjdGlvbi12bWF9IGlzIHVzZWQsIGFuZCB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdAotZXhpc3QsIGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuIAotCi1AaXRlbSAtLW5vLWNoYW5nZS13YXJuaW5ncwotQGl0ZW14IC0tbm8tYWRqdXN0LXdhcm5pbmdzCi1EbyBub3QgaXNzdWUgYSB3YXJuaW5nIGlmIEBzYW1wey0tY2hhbmdlLXNlY3Rpb24tYWRkcmVzc30gb3IKLUBzYW1wey0tYWRqdXN0LXNlY3Rpb24tbG1hfSBvciBAc2FtcHstLWFkanVzdC1zZWN0aW9uLXZtYX0gaXMgdXNlZCwgZXZlbgotaWYgdGhlIG5hbWVkIHNlY3Rpb24gZG9lcyBub3QgZXhpc3QuIAotCi1AaXRlbSAtLXNldC1zZWN0aW9uLWZsYWdzIEB2YXJ7c2VjdGlvbn09QHZhcntmbGFnc30KLVNldCB0aGUgZmxhZ3MgZm9yIHRoZSBuYW1lZCBzZWN0aW9uLiAgVGhlIEB2YXJ7ZmxhZ3N9IGFyZ3VtZW50IGlzIGEKLWNvbW1hIHNlcGFyYXRlZCBzdHJpbmcgb2YgZmxhZyBuYW1lcy4gIFRoZSByZWNvZ25pemVkIG5hbWVzIGFyZQotQHNhbXB7YWxsb2N9LCBAc2FtcHtjb250ZW50c30sIEBzYW1we2xvYWR9LCBAc2FtcHtyZWFkb25seX0sCi1Ac2FtcHtjb2RlfSwgQHNhbXB7ZGF0YX0sIGFuZCBAc2FtcHtyb219LiAgWW91IGNhbiBzZXQgdGhlCi1Ac2FtcHtjb250ZW50c30gZmxhZyBmb3IgYSBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IGhhdmUgY29udGVudHMsIGJ1dCBpdAotaXMgbm90IG1lYW5pbmdmdWwgdG8gY2xlYXIgdGhlIEBzYW1we2NvbnRlbnRzfSBmbGFnIG9mIGEgc2VjdGlvbiB3aGljaAotZG9lcyBoYXZlIGNvbnRlbnRzLS1qdXN0IHJlbW92ZSB0aGUgc2VjdGlvbiBpbnN0ZWFkLiAgTm90IGFsbCBmbGFncyBhcmUKLW1lYW5pbmdmdWwgZm9yIGFsbCBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AaXRlbSAtLWFkZC1zZWN0aW9uIEB2YXJ7c2VjdGlvbm5hbWV9PUB2YXJ7ZmlsZW5hbWV9Ci1BZGQgYSBuZXcgc2VjdGlvbiBuYW1lZCBAdmFye3NlY3Rpb25uYW1lfSB3aGlsZSBjb3B5aW5nIHRoZSBmaWxlLiAgVGhlCi1jb250ZW50cyBvZiB0aGUgbmV3IHNlY3Rpb24gYXJlIHRha2VuIGZyb20gdGhlIGZpbGUgQHZhcntmaWxlbmFtZX0uICBUaGUKLXNpemUgb2YgdGhlIHNlY3Rpb24gd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG9ubHkKLXdvcmtzIG9uIGZpbGUgZm9ybWF0cyB3aGljaCBjYW4gc3VwcG9ydCBzZWN0aW9ucyB3aXRoIGFyYml0cmFyeSBuYW1lcy4KLQotQGl0ZW0gLS1jaGFuZ2UtbGVhZGluZy1jaGFyCi1Tb21lIG9iamVjdCBmaWxlIGZvcm1hdHMgdXNlIHNwZWNpYWwgY2hhcmFjdGVycyBhdCB0aGUgc3RhcnQgb2YKLXN5bWJvbHMuICBUaGUgbW9zdCBjb21tb24gc3VjaCBjaGFyYWN0ZXIgaXMgdW5kZXJzY29yZSwgd2hpY2ggY29tcGlsZXJzCi1vZnRlbiBhZGQgYmVmb3JlIGV2ZXJ5IHN5bWJvbC4gIFRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle29iamNvcHl9IHRvCi1jaGFuZ2UgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIG9mIGV2ZXJ5IHN5bWJvbCB3aGVuIGl0IGNvbnZlcnRzIGJldHdlZW4KLW9iamVjdCBmaWxlIGZvcm1hdHMuICBJZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0cyB1c2UgdGhlIHNhbWUgbGVhZGluZwotY2hhcmFjdGVyLCB0aGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGFkZCBhCi1jaGFyYWN0ZXIsIG9yIHJlbW92ZSBhIGNoYXJhY3Rlciwgb3IgY2hhbmdlIGEgY2hhcmFjdGVyLCBhcwotYXBwcm9wcmlhdGUuCi0KLUBpdGVtIC0tcmVtb3ZlLWxlYWRpbmctY2hhcgotSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGdsb2JhbCBzeW1ib2wgaXMgYSBzcGVjaWFsIHN5bWJvbCBsZWFkaW5nCi1jaGFyYWN0ZXIgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCByZW1vdmUgdGhlIGNoYXJhY3Rlci4gIFRoZQotbW9zdCBjb21tb24gc3ltYm9sIGxlYWRpbmcgY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUuICBUaGlzIG9wdGlvbiB3aWxsCi1yZW1vdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSBhbGwgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGNhbiBiZSB1c2VmdWwKLWlmIHlvdSB3YW50IHRvIGxpbmsgdG9nZXRoZXIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzIHdpdGgKLWRpZmZlcmVudCBjb252ZW50aW9ucyBmb3Igc3ltYm9sIG5hbWVzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotQGNvZGV7LS1jaGFuZ2UtbGVhZGluZy1jaGFyfSBiZWNhdXNlIGl0IGFsd2F5cyBjaGFuZ2VzIHRoZSBzeW1ib2wgbmFtZQotd2hlbiBhcHByb3ByaWF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQKLWZpbGUuCi0KLUBpdGVtIC0td2Vha2VuCi1DaGFuZ2UgYWxsIGdsb2JhbCBzeW1ib2xzIGluIHRoZSBmaWxlIHRvIGJlIHdlYWsuICBUaGlzIGNhbiBiZSB1c2VmdWwKLXdoZW4gYnVpbGRpbmcgYW4gb2JqZWN0IHdoaWNoIHdpbGwgYmUgbGlua2VkIGFnYWluc3Qgb3RoZXIgb2JqZWN0cyB1c2luZwotdGhlIEBjb2Rley1SfSBvcHRpb24gdG8gdGhlIGxpbmtlci4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgZWZmZWN0aXZlIHdoZW4KLXVzaW5nIGFuIG9iamVjdCBmaWxlIGZvcm1hdCB3aGljaCBzdXBwb3J0cyB3ZWFrIHN5bWJvbHMuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtvYmpjb3B5fS4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcmJvc2UKLVZlcmJvc2Ugb3V0cHV0OiBsaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWQuICBJbiB0aGUgY2FzZSBvZgotYXJjaGl2ZXMsIEBzYW1we29iamNvcHkgLVZ9IGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotCi1AaXRlbSAtLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle29iamNvcHl9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBvYmpkdW1wCi1AY2hhcHRlciBvYmpkdW1wCi0KLUBjaW5kZXggb2JqZWN0IGZpbGUgaW5mb3JtYXRpb24KLUBraW5kZXggb2JqZHVtcAotCi1Ac21hbGxleGFtcGxlCi1vYmpkdW1wIFsgLWEgfCAtLWFyY2hpdmUtaGVhZGVycyBdIAotICAgICAgICBbIC1iIEB2YXJ7YmZkbmFtZX0gfCAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0gWyAtLWRlYnVnZ2luZyBdCi0gICAgICAgIFsgLUMgfCAtLWRlbWFuZ2xlIF0gWyAtZCB8IC0tZGlzYXNzZW1ibGUgXQotICAgICAgICBbIC1EIHwgLS1kaXNhc3NlbWJsZS1hbGwgXSBbIC0tZGlzYXNzZW1ibGUtemVyb2VzIF0KLSAgICAgICAgWyAtRUIgfCAtRUwgfCAtLWVuZGlhbj1Ae2JpZyB8IGxpdHRsZSBAfSBdCi0gICAgICAgIFsgLWYgfCAtLWZpbGUtaGVhZGVycyBdCi0gICAgICAgIFsgLWggfCAtLXNlY3Rpb24taGVhZGVycyB8IC0taGVhZGVycyBdICBbIC1pIHwgLS1pbmZvIF0KLSAgICAgICAgWyAtaiBAdmFye3NlY3Rpb259IHwgLS1zZWN0aW9uPUB2YXJ7c2VjdGlvbn0gXQotICAgICAgICBbIC1sIHwgLS1saW5lLW51bWJlcnMgXSBbIC1TIHwgLS1zb3VyY2UgXQotICAgICAgICBbIC1tIEB2YXJ7bWFjaGluZX0gfCAtLWFyY2hpdGVjdHVyZT1AdmFye21hY2hpbmV9IF0KLSAgICAgICAgWyAtTSBAdmFye29wdGlvbnN9IHwgLS1kaXNhc3NlbWJsZXItb3B0aW9ucz1AdmFye29wdGlvbnN9XQotICAgICAgICBbIC1wIHwgLS1wcml2YXRlLWhlYWRlcnMgXQotICAgICAgICBbIC1yIHwgLS1yZWxvYyBdIFsgLVIgfCAtLWR5bmFtaWMtcmVsb2MgXQotICAgICAgICBbIC1zIHwgLS1mdWxsLWNvbnRlbnRzIF0gIFsgLS1zdGFicyBdCi0gICAgICAgIFsgLXQgfCAtLXN5bXMgXSBbIC1UIHwgLS1keW5hbWljLXN5bXMgXSBbIC14IHwgLS1hbGwtaGVhZGVycyBdCi0gICAgICAgIFsgLXcgfCAtLXdpZGUgXSBbIC0tc3RhcnQtYWRkcmVzcz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXN0b3AtYWRkcmVzcz1AdmFye2FkZHJlc3N9IF0KLSAgICAgICAgWyAtLXByZWZpeC1hZGRyZXNzZXNdIFsgLS1bbm8tXXNob3ctcmF3LWluc24gXQotICAgICAgICBbIC0tYWRqdXN0LXZtYT1AdmFye29mZnNldH0gXQotICAgICAgICBbIC0tdmVyc2lvbiBdICBbIC0taGVscCBdCi0gICAgICAgIEB2YXJ7b2JqZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXtvYmpkdW1wfSBkaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBvbmUgb3IgbW9yZSBvYmplY3QgZmlsZXMuCi1UaGUgb3B0aW9ucyBjb250cm9sIHdoYXQgcGFydGljdWxhciBpbmZvcm1hdGlvbiB0byBkaXNwbGF5LiAgVGhpcwotaW5mb3JtYXRpb24gaXMgbW9zdGx5IHVzZWZ1bCB0byBwcm9ncmFtbWVycyB3aG8gYXJlIHdvcmtpbmcgb24gdGhlCi1jb21waWxhdGlvbiB0b29scywgYXMgb3Bwb3NlZCB0byBwcm9ncmFtbWVycyB3aG8ganVzdCB3YW50IHRoZWlyCi1wcm9ncmFtIHRvIGNvbXBpbGUgYW5kIHdvcmsuCi0KLUB2YXJ7b2JqZmlsZX1AZG90c3t9IGFyZSB0aGUgb2JqZWN0IGZpbGVzIHRvIGJlIGV4YW1pbmVkLiAgV2hlbiB5b3UKLXNwZWNpZnkgYXJjaGl2ZXMsIEBjb2Rle29iamR1bXB9IHNob3dzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIG1lbWJlcgotb2JqZWN0IGZpbGVzLgotCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4gIEF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyBAc2FtcHstbH0gbXVzdCBiZSBnaXZlbi4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYQotQGl0ZW14IC0tYXJjaGl2ZS1oZWFkZXIKLUBjaW5kZXggYXJjaGl2ZSBoZWFkZXJzCi1JZiBhbnkgb2YgdGhlIEB2YXJ7b2JqZmlsZX0gZmlsZXMgYXJlIGFyY2hpdmVzLCBkaXNwbGF5IHRoZSBhcmNoaXZlCi1oZWFkZXIgaW5mb3JtYXRpb24gKGluIGEgZm9ybWF0IHNpbWlsYXIgdG8gQHNhbXB7bHMgLWx9KS4gIEJlc2lkZXMgdGhlCi1pbmZvcm1hdGlvbiB5b3UgY291bGQgbGlzdCB3aXRoIEBzYW1we2FyIHR2fSwgQHNhbXB7b2JqZHVtcCAtYX0gc2hvd3MKLXRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgZWFjaCBhcmNoaXZlIG1lbWJlci4KLQotQGl0ZW0gLS1hZGp1c3Qtdm1hPUB2YXJ7b2Zmc2V0fQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3NlcyBpbiBvYmpkdW1wCi1AY2luZGV4IFZNQSBpbiBvYmpkdW1wCi1XaGVuIGR1bXBpbmcgaW5mb3JtYXRpb24sIGZpcnN0IGFkZCBAdmFye29mZnNldH0gdG8gYWxsIHRoZSBzZWN0aW9uCi1hZGRyZXNzZXMuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgc2VjdGlvbiBhZGRyZXNzZXMgZG8gbm90IGNvcnJlc3BvbmQgdG8KLXRoZSBzeW1ib2wgdGFibGUsIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiBwdXR0aW5nIHNlY3Rpb25zIGF0IHBhcnRpY3VsYXIKLWFkZHJlc3NlcyB3aGVuIHVzaW5nIGEgZm9ybWF0IHdoaWNoIGNhbiBub3QgcmVwcmVzZW50IHNlY3Rpb24gYWRkcmVzc2VzLAotc3VjaCBhcyBhLm91dC4KLQotQGl0ZW0gLWIgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IHRoYXQgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyBpcwotQHZhcntiZmRuYW1lfS4gIFRoaXMgb3B0aW9uIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBAdmFye29iamR1bXB9IGNhbgotYXV0b21hdGljYWxseSByZWNvZ25pemUgbWFueSBmb3JtYXRzLgotCi1Gb3IgZXhhbXBsZSwKLUBleGFtcGxlCi1vYmpkdW1wIC1iIG9hc3lzIC1tIHZheCAtaCBmdS5vCi1AZW5kIGV4YW1wbGUKLUBub2luZGVudAotZGlzcGxheXMgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgKEBzYW1wey1ofSkgb2YKLUBmaWxle2Z1Lm99LCB3aGljaCBpcyBleHBsaWNpdGx5IGlkZW50aWZpZWQgKEBzYW1wey1tfSkgYXMgYSBWQVggb2JqZWN0Ci1maWxlIGluIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgT2FzeXMgY29tcGlsZXJzLiAgWW91IGNhbiBsaXN0IHRoZQotZm9ybWF0cyBhdmFpbGFibGUgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLUMKLUBpdGVteCAtLWRlbWFuZ2xlCi1AY2luZGV4IGRlbWFuZ2xpbmcgaW4gb2JqZHVtcAotRGVjb2RlIChAZGZue2RlbWFuZ2xlfSkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4gIEB4cmVme2MrK2ZpbHR9LCBmb3IgbW9yZSBpbmZvcm1hdGlvbgotb24gZGVtYW5nbGluZy4KLQotQGl0ZW0gLS1kZWJ1Z2dpbmcKLURpc3BsYXkgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBhdHRlbXB0cyB0byBwYXJzZSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgZmlsZSBhbmQgcHJpbnQgaXQgb3V0IHVzaW5nIGEgQyBsaWtlIHN5bnRheC4KLU9ubHkgY2VydGFpbiB0eXBlcyBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZGlzYXNzZW1ibGUKLUBjaW5kZXggZGlzYXNzZW1ibGluZyBvYmplY3QgY29kZQotQGNpbmRleCBtYWNoaW5lIGluc3RydWN0aW9ucwotRGlzcGxheSB0aGUgYXNzZW1ibGVyIG1uZW1vbmljcyBmb3IgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGZyb20KLUB2YXJ7b2JqZmlsZX0uICBUaGlzIG9wdGlvbiBvbmx5IGRpc2Fzc2VtYmxlcyB0aG9zZSBzZWN0aW9ucyB3aGljaCBhcmUKLWV4cGVjdGVkIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zLgotCi1AaXRlbSAtRAotQGl0ZW14IC0tZGlzYXNzZW1ibGUtYWxsCi1MaWtlIEBzYW1wey1kfSwgYnV0IGRpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBhbGwgc2VjdGlvbnMsIG5vdCBqdXN0Ci10aG9zZSBleHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotQGl0ZW0gLS1wcmVmaXgtYWRkcmVzc2VzCi1XaGVuIGRpc2Fzc2VtYmxpbmcsIHByaW50IHRoZSBjb21wbGV0ZSBhZGRyZXNzIG9uIGVhY2ggbGluZS4gIFRoaXMgaXMKLXRoZSBvbGRlciBkaXNhc3NlbWJseSBmb3JtYXQuCi0KLUBpdGVtIC0tZGlzYXNzZW1ibGUtemVyb2VzCi1Ob3JtYWxseSB0aGUgZGlzYXNzZW1ibHkgb3V0cHV0IHdpbGwgc2tpcCBibG9ja3Mgb2YgemVyb2VzLiAgVGhpcwotb3B0aW9uIGRpcmVjdHMgdGhlIGRpc2Fzc2VtYmxlciB0byBkaXNhc3NlbWJsZSB0aG9zZSBibG9ja3MsIGp1c3QgbGlrZQotYW55IG90aGVyIGRhdGEuCi0KLUBpdGVtIC1FQgotQGl0ZW14IC1FTAotQGl0ZW14IC0tZW5kaWFuPUB7YmlnfGxpdHRsZUB9Ci1AY2luZGV4IGVuZGlhbm5lc3MKLUBjaW5kZXggZGlzYXNzZW1ibHkgZW5kaWFubmVzcwotU3BlY2lmeSB0aGUgZW5kaWFubmVzcyBvZiB0aGUgb2JqZWN0IGZpbGVzLiAgVGhpcyBvbmx5IGFmZmVjdHMKLWRpc2Fzc2VtYmx5LiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBhIGZpbGUgZm9ybWF0IHdoaWNoCi1kb2VzIG5vdCBkZXNjcmliZSBlbmRpYW5uZXNzIGluZm9ybWF0aW9uLCBzdWNoIGFzIFMtcmVjb3Jkcy4KLQotQGl0ZW0gLWYKLUBpdGVteCAtLWZpbGUtaGVhZGVyCi1AY2luZGV4IG9iamVjdCBmaWxlIGhlYWRlcgotRGlzcGxheSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIG92ZXJhbGwgaGVhZGVyIG9mCi1lYWNoIG9mIHRoZSBAdmFye29iamZpbGV9IGZpbGVzLgotCi1AaXRlbSAtaAotQGl0ZW14IC0tc2VjdGlvbi1oZWFkZXIKLUBpdGVteCAtLWhlYWRlcgotQGNpbmRleCBzZWN0aW9uIGhlYWRlcnMKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgb2YgdGhlCi1vYmplY3QgZmlsZS4KLQotRmlsZSBzZWdtZW50cyBtYXkgYmUgcmVsb2NhdGVkIHRvIG5vbnN0YW5kYXJkIGFkZHJlc3NlcywgZm9yIGV4YW1wbGUgYnkKLXVzaW5nIHRoZSBAc2FtcHstVHRleHR9LCBAc2FtcHstVGRhdGF9LCBvciBAc2FtcHstVGJzc30gb3B0aW9ucyB0bwotQGNvZGV7bGR9LiAgSG93ZXZlciwgc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBzdWNoIGFzIGEub3V0LCBkbyBub3QKLXN0b3JlIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBmaWxlIHNlZ21lbnRzLiAgSW4gdGhvc2Ugc2l0dWF0aW9ucywKLWFsdGhvdWdoIEBjb2Rle2xkfSByZWxvY2F0ZXMgdGhlIHNlY3Rpb25zIGNvcnJlY3RseSwgdXNpbmcgQHNhbXB7b2JqZHVtcAotLWh9IHRvIGxpc3QgdGhlIGZpbGUgc2VjdGlvbiBoZWFkZXJzIGNhbm5vdCBzaG93IHRoZSBjb3JyZWN0IGFkZHJlc3Nlcy4KLUluc3RlYWQsIGl0IHNob3dzIHRoZSB1c3VhbCBhZGRyZXNzZXMsIHdoaWNoIGFyZSBpbXBsaWNpdCBmb3IgdGhlCi10YXJnZXQuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIEBjb2Rle29iamR1bXB9IGFuZCBleGl0LgotCi1AaXRlbSAtaQotQGl0ZW14IC0taW5mbwotQGNpbmRleCBhcmNoaXRlY3R1cmVzIGF2YWlsYWJsZQotQGNpbmRleCBvYmplY3QgZm9ybWF0cyBhdmFpbGFibGUKLURpc3BsYXkgYSBsaXN0IHNob3dpbmcgYWxsIGFyY2hpdGVjdHVyZXMgYW5kIG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotZm9yIHNwZWNpZmljYXRpb24gd2l0aCBAc2FtcHstYn0gb3IgQHNhbXB7LW19LgotCi1AaXRlbSAtaiBAdmFye25hbWV9Ci1AaXRlbXggLS1zZWN0aW9uPUB2YXJ7bmFtZX0KLUBjaW5kZXggc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheSBpbmZvcm1hdGlvbiBvbmx5IGZvciBzZWN0aW9uIEB2YXJ7bmFtZX0uCi0KLUBpdGVtIC1sCi1AaXRlbXggLS1saW5lLW51bWJlcnMKLUBjaW5kZXggc291cmNlIGZpbGVuYW1lcyBmb3Igb2JqZWN0IGZpbGVzCi1MYWJlbCB0aGUgZGlzcGxheSAodXNpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uKSB3aXRoIHRoZSBmaWxlbmFtZSBhbmQKLXNvdXJjZSBsaW5lIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGNvZGUgb3IgcmVsb2NzIHNob3duLgotT25seSB1c2VmdWwgd2l0aCBAc2FtcHstZH0sIEBzYW1wey1EfSwgb3IgQHNhbXB7LXJ9LgotCi1AaXRlbSAtbSBAdmFye21hY2hpbmV9Ci1AaXRlbXggLS1hcmNoaXRlY3R1cmU9QHZhcnttYWNoaW5lfQotQGNpbmRleCBhcmNoaXRlY3R1cmUKLUBjaW5kZXggZGlzYXNzZW1ibHkgYXJjaGl0ZWN0dXJlCi1TcGVjaWZ5IHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMuICBUaGlzCi1jYW4gYmUgdXNlZnVsIHdoZW4gZGlzYXNzZW1ibGluZyBvYmplY3QgZmlsZXMgd2hpY2ggZG8gbm90IGRlc2NyaWJlCi1hcmNoaXRlY3R1cmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgUy1yZWNvcmRzLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWFyY2hpdGVjdHVyZXMgd2l0aCB0aGUgQHNhbXB7LWl9IG9wdGlvbi4KLQotQGl0ZW0gLU0gQHZhcntvcHRpb25zfQotQGl0ZW14IC0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9QHZhcntvcHRpb25zfQotUGFzcyB0YXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdGhlIGRpc2Fzc2VtYmxlci4gIE9ubHkgc3VwcG9ydGVkIG9uCi1zb21lIHRhcmdldHMuCi0KLUlmIHRoZSB0YXJnZXQgaXMgYW4gQVJNIGFyY2hpdGVjdHVyZSB0aGVuIHRoaXMgc3dpdGNoIGNhbiBiZSB1c2VkIHRvCi1zZWxlY3Qgd2hpY2ggcmVnaXN0ZXIgbmFtZSBzZXQgaXMgdXNlZCBkdXJpbmcgZGlzYXNzZW1ibGVyLiAgU3BlY2lmeWluZwotQHNhbXB7LS1kaXNhc3NlbWJsZXItb3B0aW9ucz1yZWctbmFtZS1zdGR9ICh0aGUgZGVmYXVsdCkgd2lsbCBzZWxlY3QgdGhlCi1yZWdpc3RlciBuYW1lcyBhcyB1c2VkIGluIEFSTSdzIGluc3RydWN0aW9uIHNldCBkb2N1bWVudGF0aW9uLCBidXQgd2l0aAotcmVnaXN0ZXIgMTMgY2FsbGVkICdzcCcsIHJlZ2lzdGVyIDE0IGNhbGxlZCAnbHInIGFuZCByZWdpc3RlciAxNSBjYWxsZWQKLSdwYycuICBTcGVjaWZ5aW5nIEBzYW1wey0tZGlzYXNzZW1ibGVyLW9wdGlvbnM9cmVnLW5hbWVzLWFwY3N9IHdpbGwKLXNlbGVjdCB0aGUgbmFtZSBzZXQgdXNlZCBieSB0aGUgQVJNIFByb2NlZHVyZSBDYWxsIFN0YW5kYXJkLCB3aGlsc3QKLXNwZWNpZnlpbmcgQHNhbXB7LS1kaXNhc3NlbWJsZXItb3B0aW9ucz1yZWctbmFtZXMtcmF3fSB3aWxsIGp1c3QgdXNlCi1Ac2FtcHtyfSBmb2xsb3dlZCBieSB0aGUgcmVnaXN0ZXIgbnVtYmVyLgotCi1AaXRlbSAtcAotQGl0ZW14IC0tcHJpdmF0ZS1oZWFkZXJzCi1QcmludCBpbmZvcm1hdGlvbiB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBUaGUgZXhhY3QKLWluZm9ybWF0aW9uIHByaW50ZWQgZGVwZW5kcyB1cG9uIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQuICBGb3Igc29tZQotb2JqZWN0IGZpbGUgZm9ybWF0cywgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBwcmludGVkLgotCi1AaXRlbSAtcgotQGl0ZW14IC0tcmVsb2MKLUBjaW5kZXggcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQotUHJpbnQgdGhlIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIElmIHVzZWQgd2l0aCBAc2FtcHstZH0gb3IKLUBzYW1wey1EfSwgdGhlIHJlbG9jYXRpb25zIGFyZSBwcmludGVkIGludGVyc3BlcnNlZCB3aXRoIHRoZQotZGlzYXNzZW1ibHkuCi0KLUBpdGVtIC1SCi1AaXRlbXggLS1keW5hbWljLXJlbG9jCi1AY2luZGV4IGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzLCBpbiBvYmplY3QgZmlsZQotUHJpbnQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotQGl0ZW0gLXMKLUBpdGVteCAtLWZ1bGwtY29udGVudHMKLUBjaW5kZXggc2VjdGlvbnMsIGZ1bGwgY29udGVudHMKLUBjaW5kZXggb2JqZWN0IGZpbGUgc2VjdGlvbnMKLURpc3BsYXkgdGhlIGZ1bGwgY29udGVudHMgb2YgYW55IHNlY3Rpb25zIHJlcXVlc3RlZC4KLQotQGl0ZW0gLVMKLUBpdGVteCAtLXNvdXJjZQotQGNpbmRleCBzb3VyY2UgZGlzYXNzZW1ibHkKLUBjaW5kZXggZGlzYXNzZW1ibHksIHdpdGggc291cmNlCi1EaXNwbGF5IHNvdXJjZSBjb2RlIGludGVybWl4ZWQgd2l0aCBkaXNhc3NlbWJseSwgaWYgcG9zc2libGUuICBJbXBsaWVzCi1Ac2FtcHstZH0uCi0KLUBpdGVtIC0tc2hvdy1yYXctaW5zbgotV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgcHJpbnQgdGhlIGluc3RydWN0aW9uIGluIGhleCBhcyB3ZWxsIGFzCi1pbiBzeW1ib2xpYyBmb3JtLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBleGNlcHQgd2hlbgotQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgotCi1AaXRlbSAtLW5vLXNob3ctcmF3LWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIGRvIG5vdCBwcmludCB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZXMuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IHdoZW4gQGNvZGV7LS1wcmVmaXgtYWRkcmVzc2VzfSBpcyB1c2VkLgotCi1AaXRlbSAtLXN0YWJzCi1AY2luZGV4IHN0YWIKLUBjaW5kZXggLnN0YWIKLUBjaW5kZXggZGVidWcgc3ltYm9scwotQGNpbmRleCBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0Ci1EaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9ucyByZXF1ZXN0ZWQuICBEaXNwbGF5IHRoZQotY29udGVudHMgb2YgdGhlIC5zdGFiIGFuZCAuc3RhYi5pbmRleCBhbmQgLnN0YWIuZXhjbCBzZWN0aW9ucyBmcm9tIGFuCi1FTEYgZmlsZS4gIFRoaXMgaXMgb25seSB1c2VmdWwgb24gc3lzdGVtcyAoc3VjaCBhcyBTb2xhcmlzIDIuMCkgaW4gd2hpY2gKLUBjb2Rley5zdGFifSBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlIGNhcnJpZWQgaW4gYW4gRUxGCi1zZWN0aW9uLiAgSW4gbW9zdCBvdGhlciBmaWxlIGZvcm1hdHMsIGRlYnVnZ2luZyBzeW1ib2wtdGFibGUgZW50cmllcyBhcmUKLWludGVybGVhdmVkIHdpdGggbGlua2FnZSBzeW1ib2xzLCBhbmQgYXJlIHZpc2libGUgaW4gdGhlIEBzYW1wey0tc3ltc30KLW91dHB1dC4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHN0YWJzIHN5bWJvbHMsIHNlZSBAcmVme1RvcCxTdGFicyxTdGFicwotT3ZlcnZpZXcsc3RhYnMuaW5mbywgVGhlIGBgc3RhYnMnJyBkZWJ1ZyBmb3JtYXR9LgotCi1AaXRlbSAtLXN0YXJ0LWFkZHJlc3M9QHZhcnthZGRyZXNzfQotQGNpbmRleCBzdGFydC1hZGRyZXNzCi1TdGFydCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZSBAY29kZXstZH0sIEBjb2Rley1yfSBhbmQgQGNvZGV7LXN9IG9wdGlvbnMuCi0KLUBpdGVtIC0tc3RvcC1hZGRyZXNzPUB2YXJ7YWRkcmVzc30KLUBjaW5kZXggc3RvcC1hZGRyZXNzCi1TdG9wIGRpc3BsYXlpbmcgZGF0YSBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MuICBUaGlzIGFmZmVjdHMgdGhlIG91dHB1dAotb2YgdGhlIEBjb2Rley1kfSwgQGNvZGV7LXJ9IGFuZCBAY29kZXstc30gb3B0aW9ucy4KLQotQGl0ZW0gLXQKLUBpdGVteCAtLXN5bXMKLUBjaW5kZXggc3ltYm9sIHRhYmxlIGVudHJpZXMsIHByaW50aW5nCi1QcmludCB0aGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuCi1UaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBAc2FtcHtubX0gcHJvZ3JhbS4KLQotQGl0ZW0gLVQKLUBpdGVteCAtLWR5bmFtaWMtc3ltcwotQGNpbmRleCBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzLCBwcmludGluZwotUHJpbnQgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuICBUaGlzIGlzIG9ubHkKLW1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAotbGlicmFyaWVzLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSB0aGUgQHNhbXB7bm19Ci1wcm9ncmFtIHdoZW4gZ2l2ZW4gdGhlIEBzYW1wey1EfSAoQHNhbXB7LS1keW5hbWljfSkgb3B0aW9uLgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtvYmpkdW1wfSBhbmQgZXhpdC4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWFsbC1oZWFkZXIKLUBjaW5kZXggYWxsIGhlYWRlciBpbmZvcm1hdGlvbiwgb2JqZWN0IGZpbGUKLUBjaW5kZXggaGVhZGVyIGluZm9ybWF0aW9uLCBhbGwKLURpc3BsYXkgYWxsIGF2YWlsYWJsZSBoZWFkZXIgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgc3ltYm9sIHRhYmxlIGFuZAotcmVsb2NhdGlvbiBlbnRyaWVzLiAgVXNpbmcgQHNhbXB7LXh9IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyBhbGwgb2YKLUBzYW1wey1hIC1mIC1oIC1yIC10fS4KLQotQGl0ZW0gLXcKLUBpdGVteCAtLXdpZGUKLUBjaW5kZXggd2lkZSBvdXRwdXQsIHByaW50aW5nCi1Gb3JtYXQgc29tZSBsaW5lcyBmb3Igb3V0cHV0IGRldmljZXMgdGhhdCBoYXZlIG1vcmUgdGhhbiA4MCBjb2x1bW5zLgotQGVuZCB0YWJsZQotCi1Abm9kZSByYW5saWIKLUBjaGFwdGVyIHJhbmxpYgotCi1Aa2luZGV4IHJhbmxpYgotQGNpbmRleCBhcmNoaXZlIGNvbnRlbnRzCi1AY2luZGV4IHN5bWJvbCBpbmRleAotCi1Ac21hbGxleGFtcGxlCi1yYW5saWIgWy12Vl0gQHZhcnthcmNoaXZlfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7cmFubGlifSBnZW5lcmF0ZXMgYW4gaW5kZXggdG8gdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgYW5kCi1zdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCi1tZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKLQotWW91IG1heSB1c2UgQHNhbXB7bm0gLXN9IG9yIEBzYW1we25tIC0tcHJpbnQtYXJtYXB9IHRvIGxpc3QgdGhpcyBpbmRleC4KLQotQW4gYXJjaGl2ZSB3aXRoIHN1Y2ggYW4gaW5kZXggc3BlZWRzIHVwIGxpbmtpbmcgdG8gdGhlIGxpYnJhcnkgYW5kCi1hbGxvd3Mgcm91dGluZXMgaW4gdGhlIGxpYnJhcnkgdG8gY2FsbCBlYWNoIG90aGVyIHdpdGhvdXQgcmVnYXJkIHRvCi10aGVpciBwbGFjZW1lbnQgaW4gdGhlIGFyY2hpdmUuCi0KLVRoZSBAc2N7Z251fSBAY29kZXtyYW5saWJ9IHByb2dyYW0gaXMgYW5vdGhlciBmb3JtIG9mIEBzY3tnbnV9IEBjb2Rle2FyfTsgcnVubmluZwotQGNvZGV7cmFubGlifSBpcyBjb21wbGV0ZWx5IGVxdWl2YWxlbnQgdG8gZXhlY3V0aW5nIEBzYW1we2FyIC1zfS4KLUB4cmVme2FyfS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtdgotQGl0ZW14IC1WCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtyYW5saWJ9LgotQGVuZCB0YWJsZQotCi1Abm9kZSBzaXplCi1AY2hhcHRlciBzaXplCi0KLUBraW5kZXggc2l6ZQotQGNpbmRleCBzZWN0aW9uIHNpemVzCi0KLUBzbWFsbGV4YW1wbGUKLXNpemUgWyAtQSB8IC1CIHwgLS1mb3JtYXQ9QHZhcntjb21wYXRpYmlsaXR5fSBdCi0gICAgIFsgLS1oZWxwIF0gIFsgLWQgfCAtbyB8IC14IHwgLS1yYWRpeD1AdmFye251bWJlcn0gXQotICAgICBbIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXSAgWyAtViB8IC0tdmVyc2lvbiBdICAKLSAgICAgWyBAdmFye29iamZpbGV9QGRvdHN7fSBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQHNje2dudX0gQGNvZGV7c2l6ZX0gdXRpbGl0eSBsaXN0cyB0aGUgc2VjdGlvbiBzaXplcy0tLWFuZCB0aGUgdG90YWwKLXNpemUtLS1mb3IgZWFjaCBvZiB0aGUgb2JqZWN0IG9yIGFyY2hpdmUgZmlsZXMgQHZhcntvYmpmaWxlfSBpbiBpdHMKLWFyZ3VtZW50IGxpc3QuICBCeSBkZWZhdWx0LCBvbmUgbGluZSBvZiBvdXRwdXQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoCi1vYmplY3QgZmlsZSBvciBlYWNoIG1vZHVsZSBpbiBhbiBhcmNoaXZlLgotCi1AdmFye29iamZpbGV9QGRvdHN7fSBhcmUgdGhlIG9iamVjdCBmaWxlcyB0byBiZSBleGFtaW5lZC4KLUlmIG5vbmUgYXJlIHNwZWNpZmllZCwgdGhlIGZpbGUgQGNvZGV7YS5vdXR9IHdpbGwgYmUgdXNlZC4KLQotVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtQQotQGl0ZW14IC1CCi1AaXRlbXggLS1mb3JtYXQ9QHZhcntjb21wYXRpYmlsaXR5fQotQGNpbmRleCBAY29kZXtzaXplfSBkaXNwbGF5IGZvcm1hdAotVXNpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgdGhlIG91dHB1dCBmcm9tIEBzY3tnbnV9Ci1AY29kZXtzaXplfSByZXNlbWJsZXMgb3V0cHV0IGZyb20gU3lzdGVtIFYgQGNvZGV7c2l6ZX0gKHVzaW5nIEBzYW1wey1BfSwKLW9yIEBzYW1wey0tZm9ybWF0PXN5c3Z9KSwgb3IgQmVya2VsZXkgQGNvZGV7c2l6ZX0gKHVzaW5nIEBzYW1wey1CfSwgb3IKLUBzYW1wey0tZm9ybWF0PWJlcmtlbGV5fSkuICBUaGUgZGVmYXVsdCBpcyB0aGUgb25lLWxpbmUgZm9ybWF0IHNpbWlsYXIgdG8KLUJlcmtlbGV5J3MuICAKLUBjIEJvbnVzIGZvciBkb2Mtc291cmNlIHJlYWRlcnM6IHlvdSBjYW4gYWxzbyBzYXkgLS1mb3JtYXQ9c3RyYW5nZSAob3IKLUBjIGFueXRoaW5nIGVsc2UgdGhhdCBzdGFydHMgd2l0aCAncycpIGZvciBzeXN2LCBhbmQgLS1mb3JtYXQ9Ym9yaW5nIChvcgotQGMgYW55dGhpbmcgZWxzZSB0aGF0IHN0YXJ0cyB3aXRoICdiJykgZm9yIEJlcmtlbGV5LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgdGhlIEJlcmtlbGV5IChkZWZhdWx0KSBmb3JtYXQgb2Ygb3V0cHV0IGZyb20KLUBjb2Rle3NpemV9OiAKLUBzbWFsbGV4YW1wbGUKLXNpemUgLS1mb3JtYXQ9QmVya2VsZXkgcmFubGliIHNpemUKLXRleHQgICAgZGF0YSAgICBic3MgICAgIGRlYyAgICAgaGV4ICAgICBmaWxlbmFtZQotMjk0ODgwICA4MTkyMCAgIDExNTkyICAgMzg4MzkyICA1ZWQyOCAgIHJhbmxpYgotMjk0ODgwICA4MTkyMCAgIDExODg4ICAgMzg4Njg4ICA1ZWU1MCAgIHNpemUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBpcyB0aGUgc2FtZSBkYXRhLCBidXQgZGlzcGxheWVkIGNsb3NlciB0byBTeXN0ZW0gViBjb252ZW50aW9uczoKLQotQHNtYWxsZXhhbXBsZQotc2l6ZSAtLWZvcm1hdD1TeXNWIHJhbmxpYiBzaXplCi1yYW5saWIgIDoKLXNlY3Rpb24gICAgICAgICBzaXplICAgICAgICAgYWRkcgotLnRleHQgICAgICAgICAyOTQ4ODAgICAgICAgICA4MTkyICAgICAgIAotLmRhdGEgICAgICAgICAgODE5MjAgICAgICAgMzAzMTA0ICAgICAgIAotLmJzcyAgICAgICAgICAgMTE1OTIgICAgICAgMzg1MDI0ICAgICAgIAotVG90YWwgICAgICAgICAzODgzOTIgICAgCi0KLQotc2l6ZSAgOgotc2VjdGlvbiAgICAgICAgIHNpemUgICAgICAgICBhZGRyCi0udGV4dCAgICAgICAgIDI5NDg4MCAgICAgICAgIDgxOTIgICAgICAgCi0uZGF0YSAgICAgICAgICA4MTkyMCAgICAgICAzMDMxMDQgICAgICAgCi0uYnNzICAgICAgICAgICAxMTg4OCAgICAgICAzODUwMjQgICAgICAgCi1Ub3RhbCAgICAgICAgIDM4ODY4OCAgICAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIC0taGVscAotU2hvdyBhIHN1bW1hcnkgb2YgYWNjZXB0YWJsZSBhcmd1bWVudHMgYW5kIG9wdGlvbnMuCi0KLUBpdGVtIC1kCi1AaXRlbXggLW8KLUBpdGVteCAteAotQGl0ZW14IC0tcmFkaXg9QHZhcntudW1iZXJ9Ci1AY2luZGV4IEBjb2Rle3NpemV9IG51bWJlciBmb3JtYXQKLUBjaW5kZXggcmFkaXggZm9yIHNlY3Rpb24gc2l6ZXMKLVVzaW5nIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGNvbnRyb2wgd2hldGhlciB0aGUgc2l6ZSBvZiBlYWNoCi1zZWN0aW9uIGlzIGdpdmVuIGluIGRlY2ltYWwgKEBzYW1wey1kfSwgb3IgQHNhbXB7LS1yYWRpeD0xMH0pOyBvY3RhbAotKEBzYW1wey1vfSwgb3IgQHNhbXB7LS1yYWRpeD04fSk7IG9yIGhleGFkZWNpbWFsIChAc2FtcHsteH0sIG9yCi1Ac2FtcHstLXJhZGl4PTE2fSkuICBJbiBAc2FtcHstLXJhZGl4PUB2YXJ7bnVtYmVyfX0sIG9ubHkgdGhlIHRocmVlCi12YWx1ZXMgKDgsIDEwLCAxNikgYXJlIHN1cHBvcnRlZC4gIFRoZSB0b3RhbCBzaXplIGlzIGFsd2F5cyBnaXZlbiBpbiB0d28KLXJhZGljZXM7IGRlY2ltYWwgYW5kIGhleGFkZWNpbWFsIGZvciBAc2FtcHstZH0gb3IgQHNhbXB7LXh9IG91dHB1dCwgb3IKLW9jdGFsIGFuZCBoZXhhZGVjaW1hbCBpZiB5b3UncmUgdXNpbmcgQHNhbXB7LW99LgotCi1AaXRlbSAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1AY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAotU3BlY2lmeSB0aGF0IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIEB2YXJ7b2JqZmlsZX0gaXMKLUB2YXJ7YmZkbmFtZX0uICBUaGlzIG9wdGlvbiBtYXkgbm90IGJlIG5lY2Vzc2FyeTsgQGNvZGV7c2l6ZX0gY2FuCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBAY29kZXtzaXplfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgc3RyaW5ncwotQGNoYXB0ZXIgc3RyaW5ncwotQGtpbmRleCBzdHJpbmdzCi1AY2luZGV4IGxpc3RpbmdzIHN0cmluZ3MKLUBjaW5kZXggcHJpbnRpbmcgc3RyaW5ncwotQGNpbmRleCBzdHJpbmdzLCBwcmludGluZwotCi1Ac21hbGxleGFtcGxlCi1zdHJpbmdzIFstYWZvdl0gWy1AdmFye21pbi1sZW59XSBbLW4gQHZhcnttaW4tbGVufV0gWy10IEB2YXJ7cmFkaXh9XSBbLV0KLSAgICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPUB2YXJ7bWluLWxlbn1dCi0gICAgICAgIFstLXJhZGl4PUB2YXJ7cmFkaXh9XSBbLS10YXJnZXQ9QHZhcntiZmRuYW1lfV0KLSAgICAgICAgWy0taGVscF0gWy0tdmVyc2lvbl0gQHZhcntmaWxlfUBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLUZvciBlYWNoIEB2YXJ7ZmlsZX0gZ2l2ZW4sIEBzY3tnbnV9IEBjb2Rle3N0cmluZ3N9IHByaW50cyB0aGUgcHJpbnRhYmxlCi1jaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIGF0IGxlYXN0IDQgY2hhcmFjdGVycyBsb25nIChvciB0aGUgbnVtYmVyCi1naXZlbiB3aXRoIHRoZSBvcHRpb25zIGJlbG93KSBhbmQgYXJlIGZvbGxvd2VkIGJ5IGFuIHVucHJpbnRhYmxlCi1jaGFyYWN0ZXIuICBCeSBkZWZhdWx0LCBpdCBvbmx5IHByaW50cyB0aGUgc3RyaW5ncyBmcm9tIHRoZSBpbml0aWFsaXplZAotYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7IGZvciBvdGhlciB0eXBlcyBvZiBmaWxlcywgaXQgcHJpbnRzCi10aGUgc3RyaW5ncyBmcm9tIHRoZSB3aG9sZSBmaWxlLgotCi1AY29kZXtzdHJpbmdzfSBpcyBtYWlubHkgdXNlZnVsIGZvciBkZXRlcm1pbmluZyB0aGUgY29udGVudHMgb2Ygbm9uLXRleHQKLWZpbGVzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hCi1AaXRlbXggLS1hbGwKLUBpdGVteCAtCi1EbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsKLXNjYW4gdGhlIHdob2xlIGZpbGVzLgotCi1AaXRlbSAtZgotQGl0ZW14IC0tcHJpbnQtZmlsZS1uYW1lCi1QcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcuCi0KLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBwcm9ncmFtIHVzYWdlIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGV4aXQuCi0KLUBpdGVtIC1AdmFye21pbi1sZW59Ci1AaXRlbXggLW4gQHZhcnttaW4tbGVufQotQGl0ZW14IC0tYnl0ZXM9QHZhcnttaW4tbGVufQotUHJpbnQgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgdGhhdCBhcmUgYXQgbGVhc3QgQHZhcnttaW4tbGVufSBjaGFyYWN0ZXJzCi1sb25nLCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDQuCi0KLUBpdGVtIC1vCi1MaWtlIEBzYW1wey10IG99LiAgU29tZSBvdGhlciB2ZXJzaW9ucyBvZiBAY29kZXtzdHJpbmdzfSBoYXZlIEBzYW1wey1vfQotYWN0IGxpa2UgQHNhbXB7LXQgZH0gaW5zdGVhZC4gIFNpbmNlIHdlIGNhbiBub3QgYmUgY29tcGF0aWJsZSB3aXRoIGJvdGgKLXdheXMsIHdlIHNpbXBseSBjaG9zZSBvbmUuCi0KLUBpdGVtIC10IEB2YXJ7cmFkaXh9Ci1AaXRlbXggLS1yYWRpeD1AdmFye3JhZGl4fQotUHJpbnQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLiAgVGhlIHNpbmdsZQotY2hhcmFjdGVyIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgcmFkaXggb2YgdGhlIG9mZnNldC0tLUBzYW1we299IGZvcgotb2N0YWwsIEBzYW1we3h9IGZvciBoZXhhZGVjaW1hbCwgb3IgQHNhbXB7ZH0gZm9yIGRlY2ltYWwuCi0KLUBpdGVtIC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLUBjaW5kZXggb2JqZWN0IGNvZGUgZm9ybWF0Ci1TcGVjaWZ5IGFuIG9iamVjdCBjb2RlIGZvcm1hdCBvdGhlciB0aGFuIHlvdXIgc3lzdGVtJ3MgZGVmYXVsdCBmb3JtYXQuCi1AeHJlZntUYXJnZXQgU2VsZWN0aW9ufSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1QcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlciBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotQGVuZCB0YWJsZQotCi1Abm9kZSBzdHJpcAotQGNoYXB0ZXIgc3RyaXAKLQotQGtpbmRleCBzdHJpcAotQGNpbmRleCByZW1vdmluZyBzeW1ib2xzCi1AY2luZGV4IGRpc2NhcmRpbmcgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCBkaXNjYXJkaW5nCi0KLUBzbWFsbGV4YW1wbGUKLXN0cmlwIFsgLUYgQHZhcntiZmRuYW1lfSB8IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgWyAtSSBAdmFye2JmZG5hbWV9IHwgLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICBbIC1PIEB2YXJ7YmZkbmFtZX0gfCAtLW91dHB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfSBdCi0gICAgICBbIC1zIHwgLS1zdHJpcC1hbGwgXSBbIC1TIHwgLWcgfCAtLXN0cmlwLWRlYnVnIF0KLSAgICAgIFsgLUsgQHZhcntzeW1ib2xuYW1lfSB8IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfSBdCi0gICAgICBbIC1OIEB2YXJ7c3ltYm9sbmFtZX0gfCAtLXN0cmlwLXN5bWJvbD1AdmFye3N5bWJvbG5hbWV9IF0KLSAgICAgIFsgLXggfCAtLWRpc2NhcmQtYWxsIF0gWyAtWCB8IC0tZGlzY2FyZC1sb2NhbHMgXQotICAgICAgWyAtUiBAdmFye3NlY3Rpb25uYW1lfSB8IC0tcmVtb3ZlLXNlY3Rpb249QHZhcntzZWN0aW9ubmFtZX0gXQotICAgICAgWyAtbyBAdmFye2ZpbGV9IF0gWyAtcCB8IC0tcHJlc2VydmUtZGF0ZXMgXQotICAgICAgWyAtdiB8IC0tdmVyYm9zZSBdICBbIC1WIHwgLS12ZXJzaW9uIF0gIFsgLS1oZWxwIF0KLSAgICAgIEB2YXJ7b2JqZmlsZX1AZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Ac2N7Z251fSBAY29kZXtzdHJpcH0gZGlzY2FyZHMgYWxsIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMKLUB2YXJ7b2JqZmlsZX0uICBUaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgbWF5IGluY2x1ZGUgYXJjaGl2ZXMuCi1BdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUgbXVzdCBiZSBnaXZlbi4KLQotQGNvZGV7c3RyaXB9IG1vZGlmaWVzIHRoZSBmaWxlcyBuYW1lZCBpbiBpdHMgYXJndW1lbnQsCi1yYXRoZXIgdGhhbiB3cml0aW5nIG1vZGlmaWVkIGNvcGllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUYgQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tdGFyZ2V0PUB2YXJ7YmZkbmFtZX0KLVRyZWF0IHRoZSBvcmlnaW5hbCBAdmFye29iamZpbGV9IGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IEB2YXJ7YmZkbmFtZX0sIGFuZCByZXdyaXRlIGl0IGluIHRoZSBzYW1lIGZvcm1hdC4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLS1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0byBAY29kZXtzdHJpcH0gYW5kIGV4aXQuCi0KLUBpdGVtIC1JIEB2YXJ7YmZkbmFtZX0JCi1AaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotVHJlYXQgdGhlIG9yaWdpbmFsIEB2YXJ7b2JqZmlsZX0gYXMgYSBmaWxlIHdpdGggdGhlIG9iamVjdAotY29kZSBmb3JtYXQgQHZhcntiZmRuYW1lfS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLU8gQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1SZXBsYWNlIEB2YXJ7b2JqZmlsZX0gd2l0aCBhIGZpbGUgaW4gdGhlIG91dHB1dCBmb3JtYXQgQHZhcntiZmRuYW1lfS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLVIgQHZhcntzZWN0aW9ubmFtZX0KLUBpdGVteCAtLXJlbW92ZS1zZWN0aW9uPUB2YXJ7c2VjdGlvbm5hbWV9Ci1SZW1vdmUgYW55IHNlY3Rpb24gbmFtZWQgQHZhcntzZWN0aW9ubmFtZX0gZnJvbSB0aGUgb3V0cHV0IGZpbGUuICBUaGlzCi1vcHRpb24gbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLiAgTm90ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uCi1pbmFwcHJvcHJpYXRlbHkgbWF5IG1ha2UgdGhlIG91dHB1dCBmaWxlIHVudXNhYmxlLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tc3RyaXAtYWxsCi1SZW1vdmUgYWxsIHN5bWJvbHMuCi0KLUBpdGVtIC1nCi1AaXRlbXggLVMKLUBpdGVteCAtLXN0cmlwLWRlYnVnCi1SZW1vdmUgZGVidWdnaW5nIHN5bWJvbHMgb25seS4KLQotQGl0ZW0gLS1zdHJpcC11bm5lZWRlZAotUmVtb3ZlIGFsbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBuZWVkZWQgZm9yIHJlbG9jYXRpb24gcHJvY2Vzc2luZy4KLQotQGl0ZW0gLUsgQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0ta2VlcC1zeW1ib2w9QHZhcntzeW1ib2xuYW1lfQotS2VlcCBvbmx5IHN5bWJvbCBAdmFye3N5bWJvbG5hbWV9IGZyb20gdGhlIHNvdXJjZSBmaWxlLiAgVGhpcyBvcHRpb24gbWF5Ci1iZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotQGl0ZW0gLU4gQHZhcntzeW1ib2xuYW1lfQotQGl0ZW14IC0tc3RyaXAtc3ltYm9sPUB2YXJ7c3ltYm9sbmFtZX0KLVJlbW92ZSBzeW1ib2wgQHZhcntzeW1ib2xuYW1lfSBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24gbWF5IGJlCi1naXZlbiBtb3JlIHRoYW4gb25jZSwgYW5kIG1heSBiZSBjb21iaW5lZCB3aXRoIHN0cmlwIG9wdGlvbnMgb3RoZXIgdGhhbgotQGNvZGV7LUt9LgotCi1AaXRlbSAtbyBAdmFye2ZpbGV9Ci1QdXQgdGhlIHN0cmlwcGVkIG91dHB1dCBpbiBAdmFye2ZpbGV9LCByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlCi1leGlzdGluZyBmaWxlLiAgV2hlbiB0aGlzIGFyZ3VtZW50IGlzIHVzZWQsIG9ubHkgb25lIEB2YXJ7b2JqZmlsZX0KLWFyZ3VtZW50IG1heSBiZSBzcGVjaWZpZWQuCi0KLUBpdGVtIC1wCi1AaXRlbXggLS1wcmVzZXJ2ZS1kYXRlcwotUHJlc2VydmUgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBmaWxlLgotCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLVJlbW92ZSBub24tZ2xvYmFsIHN5bWJvbHMuCi0KLUBpdGVtIC1YCi1AaXRlbXggLS1kaXNjYXJkLWxvY2FscwotUmVtb3ZlIGNvbXBpbGVyLWdlbmVyYXRlZCBsb2NhbCBzeW1ib2xzLgotKFRoZXNlIHVzdWFsbHkgc3RhcnQgd2l0aCBAc2FtcHtMfSBvciBAc2FtcHsufS4pCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7c3RyaXB9LgotCi1AaXRlbSAtdgotQGl0ZW14IC0tdmVyYm9zZQotVmVyYm9zZSBvdXRwdXQ6IGxpc3QgYWxsIG9iamVjdCBmaWxlcyBtb2RpZmllZC4gIEluIHRoZSBjYXNlIG9mCi1hcmNoaXZlcywgQHNhbXB7c3RyaXAgLXZ9IGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBjKytmaWx0Ci1AY2hhcHRlciBjKytmaWx0Ci0KLUBraW5kZXggYysrZmlsdAotQGNpbmRleCBkZW1hbmdsaW5nIEMrKyBzeW1ib2xzCi0KLUBzbWFsbGV4YW1wbGUKLWMrK2ZpbHQgWyAtXyB8IC0tc3RyaXAtdW5kZXJzY29yZXMgXQotICAgICAgICBbIC1qIHwgLS1qYXZhIF0KLQlbIC1uIHwgLS1uby1zdHJpcC11bmRlcnNjb3JlcyBdCi0gICAgICAgIFsgLXMgQHZhcntmb3JtYXR9IHwgLS1mb3JtYXQ9QHZhcntmb3JtYXR9IF0KLSAgICAgICAgWyAtLWhlbHAgXSAgWyAtLXZlcnNpb24gXSAgWyBAdmFye3N5bWJvbH1AZG90c3t9IF0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBDKysgYW5kIEphdmEgbGFuZ3VhZ2VzIHByb3ZpZGVzIGZ1bmN0aW9uIG92ZXJsb2FkaW5nLCB3aGljaCBtZWFucwotdGhhdCB5b3UgY2FuIHdyaXRlIG1hbnkgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZSAocHJvdmlkaW5nIGVhY2gKLXRha2VzIHBhcmFtZXRlcnMgb2YgZGlmZmVyZW50IHR5cGVzKS4gIEFsbCBDKysgYW5kIEphdmEgZnVuY3Rpb24gbmFtZXMKLWFyZSBlbmNvZGVkIGludG8gYSBsb3ctbGV2ZWwgYXNzZW1ibHkgbGFiZWwgKHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcwotQGRmbnttYW5nbGluZ30pLiBUaGUgQGNvZGV7YysrZmlsdH0gcHJvZ3JhbSBkb2VzIHRoZSBpbnZlcnNlIG1hcHBpbmc6IGl0Ci1kZWNvZGVzIChAZGZue2RlbWFuZ2xlc30pIGxvdy1sZXZlbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMgc28gdGhhdAotdGhlIGxpbmtlciBjYW4ga2VlcCB0aGVzZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBmcm9tIGNsYXNoaW5nLgotCi1FdmVyeSBhbHBoYW51bWVyaWMgd29yZCAoY29uc2lzdGluZyBvZiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLAotZG9sbGFycywgb3IgcGVyaW9kcykgc2VlbiBpbiB0aGUgaW5wdXQgaXMgYSBwb3RlbnRpYWwgbGFiZWwuICBJZiB0aGUKLWxhYmVsIGRlY29kZXMgaW50byBhIEMrKyBuYW1lLCB0aGUgQysrIG5hbWUgcmVwbGFjZXMgdGhlIGxvdy1sZXZlbAotbmFtZSBpbiB0aGUgb3V0cHV0LgotCi1Zb3UgY2FuIHVzZSBAY29kZXtjKytmaWx0fSB0byBkZWNpcGhlciBpbmRpdmlkdWFsIHN5bWJvbHM6Ci0KLUBleGFtcGxlCi1jKytmaWx0IEB2YXJ7c3ltYm9sfQotQGVuZCBleGFtcGxlCi0KLUlmIG5vIEB2YXJ7c3ltYm9sfSBhcmd1bWVudHMgYXJlIGdpdmVuLCBAY29kZXtjKytmaWx0fSByZWFkcyBzeW1ib2wKLW5hbWVzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZXMgdGhlIGRlbWFuZ2xlZCBuYW1lcyB0byB0aGUKLXN0YW5kYXJkIG91dHB1dC4gIEFsbCByZXN1bHRzIGFyZSBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLV8KLUBpdGVteCAtLXN0cmlwLXVuZGVyc2NvcmVzCi1PbiBzb21lIHN5c3RlbXMsIGJvdGggdGhlIEMgYW5kIEMrKyBjb21waWxlcnMgcHV0IGFuIHVuZGVyc2NvcmUgaW4gZnJvbnQKLW9mIGV2ZXJ5IG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlIEMgbmFtZSBAY29kZXtmb299IGdldHMgdGhlIGxvdy1sZXZlbAotbmFtZSBAY29kZXtfZm9vfS4gIFRoaXMgb3B0aW9uIHJlbW92ZXMgdGhlIGluaXRpYWwgdW5kZXJzY29yZS4gIFdoZXRoZXIKLUBjb2Rle2MrK2ZpbHR9IHJlbW92ZXMgdGhlIHVuZGVyc2NvcmUgYnkgZGVmYXVsdCBpcyB0YXJnZXQgZGVwZW5kZW50LgotCi1AaXRlbSAtagotQGl0ZW14IC0tamF2YQotUHJpbnRzIGRlbWFuZ2xlZCBuYW1lcyB1c2luZyBKYXZhIHN5bnRheC4gIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSBDKysKLXN5bnRheC4KLQotQGl0ZW0gLW4KLUBpdGVteCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzCi1EbyBub3QgcmVtb3ZlIHRoZSBpbml0aWFsIHVuZGVyc2NvcmUuCi0KLUBpdGVtIC1zIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQHNje2dudX0gQGNvZGV7bm19IGNhbiBkZWNvZGUgdGhyZWUgZGlmZmVyZW50IG1ldGhvZHMgb2YgbWFuZ2xpbmcsIHVzZWQgYnkKLWRpZmZlcmVudCBDKysgY29tcGlsZXJzLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMgb3B0aW9uIHNlbGVjdHMgd2hpY2gKLW1ldGhvZCBpdCB1c2VzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGdudQotdGhlIG9uZSB1c2VkIGJ5IHRoZSBAc2N7Z251fSBjb21waWxlciAodGhlIGRlZmF1bHQgbWV0aG9kKQotQGl0ZW0gbHVjaWQKLXRoZSBvbmUgdXNlZCBieSB0aGUgTHVjaWQgY29tcGlsZXIKLUBpdGVtIGFybQotdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIEMrKyBBbm5vdGF0ZWQgUmVmZXJlbmNlIE1hbnVhbAotQGl0ZW0gaHAKLXRoZSBvbmUgdXNlZCBieSB0aGUgSFAgY29tcGlsZXIKLUBpdGVtIGVkZwotdGhlIG9uZSB1c2VkIGJ5IHRoZSBFREcgY29tcGlsZXIKLUBlbmQgdGFibGUKLQotQGl0ZW0gLS1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gQGNvZGV7YysrZmlsdH0gYW5kIGV4aXQuCi0KLUBpdGVtIC0tdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBjb2Rle2MrK2ZpbHR9IGFuZCBleGl0LgotQGVuZCB0YWJsZQotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gQGNvZGV7YysrZmlsdH0gaXMgYSBuZXcgdXRpbGl0eSwgYW5kIHRoZSBkZXRhaWxzIG9mIGl0cwotdXNlciBpbnRlcmZhY2UgYXJlIHN1YmplY3QgdG8gY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcy4gIEluIHBhcnRpY3VsYXIsCi1hIGNvbW1hbmQtbGluZSBvcHRpb24gbWF5IGJlIHJlcXVpcmVkIGluIHRoZSB0aGUgZnV0dXJlIHRvIGRlY29kZSBhIG5hbWUKLXBhc3NlZCBhcyBhbiBhcmd1bWVudCBvbiB0aGUgY29tbWFuZCBsaW5lOyBpbiBvdGhlciB3b3JkcywgCi0KLUBleGFtcGxlCi1jKytmaWx0IEB2YXJ7c3ltYm9sfQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotbWF5IGluIGEgZnV0dXJlIHJlbGVhc2UgYmVjb21lCi0KLUBleGFtcGxlCi1jKytmaWx0IEB2YXJ7b3B0aW9ufSBAdmFye3N5bWJvbH0KLUBlbmQgZXhhbXBsZQotQGVuZCBxdW90YXRpb24KLQotQG5vZGUgYWRkcjJsaW5lCi1AY2hhcHRlciBhZGRyMmxpbmUKLQotQGtpbmRleCBhZGRyMmxpbmUKLUBjaW5kZXggYWRkcmVzcyB0byBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCi0KLUBzbWFsbGV4YW1wbGUKLWFkZHIybGluZSBbIC1iIEB2YXJ7YmZkbmFtZX0gfCAtLXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgICBbIC1DIHwgLS1kZW1hbmdsZSBdCi0gICAgICAgICAgWyAtZSBAdmFye2ZpbGVuYW1lfSB8IC0tZXhlPUB2YXJ7ZmlsZW5hbWV9IF0KLSAgICAgICAgICBbIC1mIHwgLS1mdW5jdGlvbnMgXSBbIC1zIHwgLS1iYXNlbmFtZSBdCi0gICAgICAgICAgWyAtSCB8IC0taGVscCBdIFsgLVYgfCAtLXZlcnNpb24gXQotICAgICAgICAgIFsgYWRkciBhZGRyIC4uLiBdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY29kZXthZGRyMmxpbmV9IHRyYW5zbGF0ZXMgcHJvZ3JhbSBhZGRyZXNzZXMgaW50byBmaWxlIG5hbWVzIGFuZCBsaW5lCi1udW1iZXJzLiAgR2l2ZW4gYW4gYWRkcmVzcyBhbmQgYW4gZXhlY3V0YWJsZSwgaXQgdXNlcyB0aGUgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBpbiB0aGUgZXhlY3V0YWJsZSB0byBmaWd1cmUgb3V0IHdoaWNoIGZpbGUgbmFtZSBhbmQgbGluZQotbnVtYmVyIGFyZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBhZGRyZXNzLgotCi1UaGUgZXhlY3V0YWJsZSB0byB1c2UgaXMgc3BlY2lmaWVkIHdpdGggdGhlIEBjb2Rley1lfSBvcHRpb24uICBUaGUKLWRlZmF1bHQgaXMgQGZpbGV7YS5vdXR9LgotCi1AY29kZXthZGRyMmxpbmV9IGhhcyB0d28gbW9kZXMgb2Ygb3BlcmF0aW9uLgotCi1JbiB0aGUgZmlyc3QsIGhleGFkZWNpbWFsIGFkZHJlc3NlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCi1hbmQgQGNvZGV7YWRkcjJsaW5lfSBkaXNwbGF5cyB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBmb3IgZWFjaAotYWRkcmVzcy4KLQotSW4gdGhlIHNlY29uZCwgQGNvZGV7YWRkcjJsaW5lfSByZWFkcyBoZXhhZGVjaW1hbCBhZGRyZXNzZXMgZnJvbQotc3RhbmRhcmQgaW5wdXQsIGFuZCBwcmludHMgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgZm9yIGVhY2gKLWFkZHJlc3Mgb24gc3RhbmRhcmQgb3V0cHV0LiAgSW4gdGhpcyBtb2RlLCBAY29kZXthZGRyMmxpbmV9IG1heSBiZSB1c2VkCi1pbiBhIHBpcGUgdG8gY29udmVydCBkeW5hbWljYWxseSBjaG9zZW4gYWRkcmVzc2VzLgotCi1UaGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgaXMgQHNhbXB7RklMRU5BTUU6TElORU5PfS4gIFRoZSBmaWxlIG5hbWUgYW5kCi1saW5lIG51bWJlciBmb3IgZWFjaCBhZGRyZXNzIGlzIHByaW50ZWQgb24gYSBzZXBhcmF0ZSBsaW5lLiAgSWYgdGhlCi1AY29kZXstZn0gb3B0aW9uIGlzIHVzZWQsIHRoZW4gZWFjaCBAc2FtcHtGSUxFTkFNRTpMSU5FTk99IGxpbmUgaXMKLXByZWNlZGVkIGJ5IGEgQHNhbXB7RlVOQ1RJT05OQU1FfSBsaW5lIHdoaWNoIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgotY29udGFpbmluZyB0aGUgYWRkcmVzcy4KLQotSWYgdGhlIGZpbGUgbmFtZSBvciBmdW5jdGlvbiBuYW1lIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwKLUBjb2Rle2FkZHIybGluZX0gd2lsbCBwcmludCB0d28gcXVlc3Rpb24gbWFya3MgaW4gdGhlaXIgcGxhY2UuICBJZiB0aGUKLWxpbmUgbnVtYmVyIGNhbiBub3QgYmUgZGV0ZXJtaW5lZCwgQGNvZGV7YWRkcjJsaW5lfSB3aWxsIHByaW50IDAuCi0KLVRoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCi1lcXVpdmFsZW50LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1iIEB2YXJ7YmZkbmFtZX0KLUBpdGVteCAtLXRhcmdldD1AdmFye2JmZG5hbWV9Ci1AY2luZGV4IG9iamVjdCBjb2RlIGZvcm1hdAotU3BlY2lmeSB0aGF0IHRoZSBvYmplY3QtY29kZSBmb3JtYXQgZm9yIHRoZSBvYmplY3QgZmlsZXMgaXMKLUB2YXJ7YmZkbmFtZX0uCi0KLUBpdGVtIC1DCi1AaXRlbXggLS1kZW1hbmdsZQotQGNpbmRleCBkZW1hbmdsaW5nIGluIG9iamR1bXAKLURlY29kZSAoQGRmbntkZW1hbmdsZX0pIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuICBAeHJlZntjKytmaWx0fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIGRlbWFuZ2xpbmcuCi0KLUBpdGVtIC1lIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1leGU9QHZhcntmaWxlbmFtZX0KLVNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgZm9yIHdoaWNoIGFkZHJlc3NlcyBzaG91bGQgYmUKLXRyYW5zbGF0ZWQuICBUaGUgZGVmYXVsdCBmaWxlIGlzIEBmaWxle2Eub3V0fS4KLQotQGl0ZW0gLWYKLUBpdGVteCAtLWZ1bmN0aW9ucwotRGlzcGxheSBmdW5jdGlvbiBuYW1lcyBhcyB3ZWxsIGFzIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tYmFzZW5hbWVzCi1EaXNwbGF5IG9ubHkgdGhlIGJhc2Ugb2YgZWFjaCBmaWxlIG5hbWUuCi1AZW5kIHRhYmxlCi0KLUBub2RlIG5sbWNvbnYKLUBjaGFwdGVyIG5sbWNvbnYKLQotQGNvZGV7bmxtY29udn0gY29udmVydHMgYSByZWxvY2F0YWJsZSBvYmplY3QgZmlsZSBpbnRvIGEgTmV0V2FyZQotTG9hZGFibGUgTW9kdWxlLgotCi1AaWdub3JlCi1AY29kZXtubG1jb252fSBjdXJyZW50bHkgd29ya3Mgd2l0aCBAc2FtcHtpMzg2fSBvYmplY3QKLWZpbGVzIGluIEBjb2Rle2NvZmZ9LCBAc2N7ZWxmfSwgb3IgQGNvZGV7YS5vdXR9IGZvcm1hdCwgYW5kIEBzY3tTUEFSQ30KLW9iamVjdCBmaWxlcyBpbiBAc2N7ZWxmfSwgb3IgQGNvZGV7YS5vdXR9IGZvcm1hdEBmb290bm90ZXsKLUBjb2Rle25sbWNvbnZ9IHNob3VsZCB3b3JrIHdpdGggYW55IEBzYW1we2kzODZ9IG9yIEBzY3tzcGFyY30gb2JqZWN0Ci1mb3JtYXQgaW4gdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4gIEl0IGhhcyBvbmx5IGJlZW4gdGVzdGVkCi13aXRoIHRoZSBhYm92ZSBmb3JtYXRzLn0uCi1AZW5kIGlnbm9yZQotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gQGNvZGV7bmxtY29udn0gaXMgbm90IGFsd2F5cyBidWlsdCBhcyBwYXJ0IG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcywgc2luY2UgaXQgaXMgb25seSB1c2VmdWwgZm9yIE5MTSB0YXJnZXRzLgotQGVuZCBxdW90YXRpb24KLQotQHNtYWxsZXhhbXBsZQotbmxtY29udiBbIC1JIEB2YXJ7YmZkbmFtZX0gfCAtLWlucHV0LXRhcmdldD1AdmFye2JmZG5hbWV9IF0KLSAgICAgICAgWyAtTyBAdmFye2JmZG5hbWV9IHwgLS1vdXRwdXQtdGFyZ2V0PUB2YXJ7YmZkbmFtZX0gXQotICAgICAgICBbIC1UIEB2YXJ7aGVhZGVyZmlsZX0gfCAtLWhlYWRlci1maWxlPUB2YXJ7aGVhZGVyZmlsZX0gXQotICAgICAgICBbIC1kIHwgLS1kZWJ1Z10gIFsgLWwgQHZhcntsaW5rZXJ9IHwgLS1saW5rZXI9QHZhcntsaW5rZXJ9IF0KLSAgICAgICAgWyAtaCB8IC0taGVscCBdICBbIC1WIHwgLS12ZXJzaW9uIF0KLSAgICAgICAgQHZhcntpbmZpbGV9IEB2YXJ7b3V0ZmlsZX0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle25sbWNvbnZ9IGNvbnZlcnRzIHRoZSByZWxvY2F0YWJsZSBAc2FtcHtpMzg2fSBvYmplY3QgZmlsZQotQHZhcntpbmZpbGV9IGludG8gdGhlIE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlIEB2YXJ7b3V0ZmlsZX0sIG9wdGlvbmFsbHkKLXJlYWRpbmcgQHZhcntoZWFkZXJmaWxlfSBmb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMKLW9uIHdyaXRpbmcgdGhlIE5MTSBjb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZSB0aGUKLUBzYW1we2xpbmtlcnN9IHNlY3Rpb24sIEBzYW1we05MTUxJTkt9IGluIHBhcnRpY3VsYXIsIG9mIHRoZSBAY2l0ZXtOTE0KLURldmVsb3BtZW50IGFuZCBUb29scyBPdmVydmlld30sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIE5MTSBTb2Z0d2FyZQotRGV2ZWxvcGVyJ3MgS2l0IChgYE5MTSBTREsnJyksIGF2YWlsYWJsZSBmcm9tIE5vdmVsbCwgSW5jLgotQGNvZGV7bmxtY29udn0gdXNlcyB0aGUgQHNje2dudX0gQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5IHRvIHJlYWQKLUB2YXJ7aW5maWxlfTsgc2VlIEByZWZ7QkZELCxCRkQsbGQuaW5mbyxVc2luZyBMRH0sIGZvcgotbW9yZSBpbmZvcm1hdGlvbi4KLQotQGNvZGV7bmxtY29udn0gY2FuIHBlcmZvcm0gYSBsaW5rIHN0ZXAuICBJbiBvdGhlciB3b3JkcywgeW91IGNhbiBsaXN0Ci1tb3JlIHRoYW4gb25lIG9iamVjdCBmaWxlIGZvciBpbnB1dCBpZiB5b3UgbGlzdCB0aGVtIGluIHRoZSBkZWZpbml0aW9ucwotZmlsZSAocmF0aGVyIHRoYW4gc2ltcGx5IHNwZWNpZnlpbmcgb25lIGlucHV0IGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZSkuCi1JbiB0aGlzIGNhc2UsIEBjb2Rle25sbWNvbnZ9IGNhbGxzIHRoZSBsaW5rZXIgZm9yIHlvdS4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtSSBAdmFye2JmZG5hbWV9Ci1AaXRlbXggLS1pbnB1dC10YXJnZXQ9QHZhcntiZmRuYW1lfQotT2JqZWN0IGZvcm1hdCBvZiB0aGUgaW5wdXQgZmlsZS4gIEBjb2Rle25sbWNvbnZ9IGNhbiB1c3VhbGx5IGRldGVybWluZQotdGhlIGZvcm1hdCBvZiBhIGdpdmVuIGZpbGUgKHNvIG5vIGRlZmF1bHQgaXMgbmVjZXNzYXJ5KS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLU8gQHZhcntiZmRuYW1lfQotQGl0ZW14IC0tb3V0cHV0LXRhcmdldD1AdmFye2JmZG5hbWV9Ci1PYmplY3QgZm9ybWF0IG9mIHRoZSBvdXRwdXQgZmlsZS4gIEBjb2Rle25sbWNvbnZ9IGluZmVycyB0aGUgb3V0cHV0Ci1mb3JtYXQgYmFzZWQgb24gdGhlIGlucHV0IGZvcm1hdCwgZS5nLiBmb3IgYSBAc2FtcHtpMzg2fSBpbnB1dCBmaWxlIHRoZQotb3V0cHV0IGZvcm1hdCBpcyBAc2FtcHtubG0zMi1pMzg2fS4KLUB4cmVme1RhcmdldCBTZWxlY3Rpb259LCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQGl0ZW0gLVQgQHZhcntoZWFkZXJmaWxlfQotQGl0ZW14IC0taGVhZGVyLWZpbGU9QHZhcntoZWFkZXJmaWxlfQotUmVhZHMgQHZhcntoZWFkZXJmaWxlfSBmb3IgTkxNIGhlYWRlciBpbmZvcm1hdGlvbi4gIEZvciBpbnN0cnVjdGlvbnMgb24KLXdyaXRpbmcgdGhlIE5MTSBjb21tYW5kIGZpbGUgbGFuZ3VhZ2UgdXNlZCBpbiBoZWFkZXIgZmlsZXMsIHNlZUAgc2VlIHRoZQotQHNhbXB7bGlua2Vyc30gc2VjdGlvbiwgb2YgdGhlIEBjaXRle05MTSBEZXZlbG9wbWVudCBhbmQgVG9vbHMKLU92ZXJ2aWV3fSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgTkxNIFNvZnR3YXJlIERldmVsb3BlcidzIEtpdCwgYXZhaWxhYmxlCi1mcm9tIE5vdmVsbCwgSW5jLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZGVidWcKLURpc3BsYXlzIChvbiBzdGFuZGFyZCBlcnJvcikgdGhlIGxpbmtlciBjb21tYW5kIGxpbmUgdXNlZCBieSBAY29kZXtubG1jb252fS4KLQotQGl0ZW0gLWwgQHZhcntsaW5rZXJ9Ci1AaXRlbXggLS1saW5rZXI9QHZhcntsaW5rZXJ9Ci1Vc2UgQHZhcntsaW5rZXJ9IGZvciBhbnkgbGlua2luZy4gIEB2YXJ7bGlua2VyfSBjYW4gYmUgYW4gYWJzb2x1dGUgb3IgYQotcmVsYXRpdmUgcGF0aG5hbWUuCi0KLUBpdGVtIC1oCi1AaXRlbXggLS1oZWxwCi1QcmludHMgYSB1c2FnZSBzdW1tYXJ5LgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotUHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgQGNvZGV7bmxtY29udn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIHdpbmRyZXMKLUBjaGFwdGVyIHdpbmRyZXMKLQotQGNvZGV7d2luZHJlc30gbWF5IGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBXaW5kb3dzIHJlc291cmNlcy4KLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IEBjb2Rle3dpbmRyZXN9IGlzIG5vdCBhbHdheXMgYnVpbHQgYXMgcGFydCBvZiB0aGUgYmluYXJ5Ci11dGlsaXRpZXMsIHNpbmNlIGl0IGlzIG9ubHkgdXNlZnVsIGZvciBXaW5kb3dzIHRhcmdldHMuCi1AZW5kIHF1b3RhdGlvbgotCi1Ac21hbGxleGFtcGxlCi13aW5kcmVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7d2luZHJlc30gcmVhZHMgcmVzb3VyY2VzIGZyb20gYW4gaW5wdXQgZmlsZSBhbmQgY29waWVzIHRoZW0gaW50bwotYW4gb3V0cHV0IGZpbGUuICBFaXRoZXIgZmlsZSBtYXkgYmUgaW4gb25lIG9mIHRocmVlIGZvcm1hdHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcmMKLUEgdGV4dCBmb3JtYXQgcmVhZCBieSB0aGUgUmVzb3VyY2UgQ29tcGlsZXIuCi0KLUBpdGVtIHJlcwotQSBiaW5hcnkgZm9ybWF0IGdlbmVyYXRlZCBieSB0aGUgUmVzb3VyY2UgQ29tcGlsZXIuCi0KLUBpdGVtIGNvZmYKLUEgQ09GRiBvYmplY3Qgb3IgZXhlY3V0YWJsZS4KLUBlbmQgdGFibGUKLQotVGhlIGV4YWN0IGRlc2NyaXB0aW9uIG9mIHRoZXNlIGRpZmZlcmVudCBmb3JtYXRzIGlzIGF2YWlsYWJsZSBpbgotZG9jdW1lbnRhdGlvbiBmcm9tIE1pY3Jvc29mdC4KLQotV2hlbiBAY29kZXt3aW5kcmVzfSBjb252ZXJ0cyBmcm9tIHRoZSBAY29kZXtyY30gZm9ybWF0IHRvIHRoZSBAY29kZXtyZXN9Ci1mb3JtYXQsIGl0IGlzIGFjdGluZyBsaWtlIHRoZSBXaW5kb3dzIFJlc291cmNlIENvbXBpbGVyLiAgV2hlbgotQGNvZGV7d2luZHJlc30gY29udmVydHMgZnJvbSB0aGUgQGNvZGV7cmVzfSBmb3JtYXQgdG8gdGhlIEBjb2Rle2NvZmZ9Ci1mb3JtYXQsIGl0IGlzIGFjdGluZyBsaWtlIHRoZSBXaW5kb3dzIEBjb2Rle0NWVFJFU30gcHJvZ3JhbS4KLQotV2hlbiBAY29kZXt3aW5kcmVzfSBnZW5lcmF0ZXMgYW4gQGNvZGV7cmN9IGZpbGUsIHRoZSBvdXRwdXQgaXMgc2ltaWxhcgotYnV0IG5vdCBpZGVudGljYWwgdG8gdGhlIGZvcm1hdCBleHBlY3RlZCBmb3IgdGhlIGlucHV0LiAgV2hlbiBhbiBpbnB1dAotQGNvZGV7cmN9IGZpbGUgcmVmZXJzIHRvIGFuIGV4dGVybmFsIGZpbGVuYW1lLCBhbiBvdXRwdXQgQGNvZGV7cmN9IGZpbGUKLXdpbGwgaW5zdGVhZCBpbmNsdWRlIHRoZSBmaWxlIGNvbnRlbnRzLgotCi1JZiB0aGUgaW5wdXQgb3Igb3V0cHV0IGZvcm1hdCBpcyBub3Qgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsCi1ndWVzcyBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lLCBvciwgZm9yIHRoZSBpbnB1dCBmaWxlLCB0aGUgZmlsZSBjb250ZW50cy4KLUEgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsucmN9IHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBAY29kZXtyY30KLWZpbGUsIGEgZmlsZSB3aXRoIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsucmVzfSB3aWxsIGJlIHRyZWF0ZWQgYXMgYQotQGNvZGV7cmVzfSBmaWxlLCBhbmQgYSBmaWxlIHdpdGggYW4gZXh0ZW5zaW9uIG9mIEBmaWxley5vfSBvcgotQGZpbGV7LmV4ZX0gd2lsbCBiZSB0cmVhdGVkIGFzIGEgQGNvZGV7Y29mZn0gZmlsZS4KLQotSWYgbm8gb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkLCBAY29kZXt3aW5kcmVzfSB3aWxsIHByaW50IHRoZSByZXNvdXJjZXMKLWluIEBjb2Rle3JjfSBmb3JtYXQgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi1UaGUgbm9ybWFsIHVzZSBpcyBmb3IgeW91IHRvIHdyaXRlIGFuIEBjb2Rle3JjfSBmaWxlLCB1c2UgQGNvZGV7d2luZHJlc30KLXRvIGNvbnZlcnQgaXQgdG8gYSBDT0ZGIG9iamVjdCBmaWxlLCBhbmQgdGhlbiBsaW5rIHRoZSBDT0ZGIGZpbGUgaW50bwoteW91ciBhcHBsaWNhdGlvbi4gIFRoaXMgd2lsbCBtYWtlIHRoZSByZXNvdXJjZXMgZGVzY3JpYmVkIGluIHRoZQotQGNvZGV7cmN9IGZpbGUgYXZhaWxhYmxlIHRvIFdpbmRvd3MuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWkgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLWlucHV0IEB2YXJ7ZmlsZW5hbWV9Ci1UaGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGVuCi1AY29kZXt3aW5kcmVzfSB3aWxsIHVzZSB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudCBhcyB0aGUgaW5wdXQgZmlsZQotbmFtZS4gIElmIHRoZXJlIGFyZSBubyBub24tb3B0aW9uIGFyZ3VtZW50cywgdGhlbiBAY29kZXt3aW5kcmVzfSB3aWxsCi1yZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQuICBAY29kZXt3aW5kcmVzfSBjYW4gbm90IHJlYWQgYSBDT0ZGIGZpbGUgZnJvbQotc3RhbmRhcmQgaW5wdXQuCi0KLUBpdGVtIC1vIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQgQHZhcntmaWxlbmFtZX0KLVRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLCB0aGVuCi1AY29kZXt3aW5kcmVzfSB3aWxsIHVzZSB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudCwgYWZ0ZXIgYW55IHVzZWQKLWZvciB0aGUgaW5wdXQgZmlsZSBuYW1lLCBhcyB0aGUgb3V0cHV0IGZpbGUgbmFtZS4gIElmIHRoZXJlIGlzIG5vCi1ub24tb3B0aW9uIGFyZ3VtZW50LCB0aGVuIEBjb2Rle3dpbmRyZXN9IHdpbGwgd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0LgotQGNvZGV7d2luZHJlc30gY2FuIG5vdCB3cml0ZSBhIENPRkYgZmlsZSB0byBzdGFuZGFyZCBvdXRwdXQuCi0KLUBpdGVtIC1JIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0taW5wdXQtZm9ybWF0IEB2YXJ7Zm9ybWF0fQotVGhlIGlucHV0IGZvcm1hdCB0byByZWFkLiAgQHZhcntmb3JtYXR9IG1heSBiZSBAc2FtcHtyZXN9LCBAc2FtcHtyY30sIG9yCi1Ac2FtcHtjb2ZmfS4gIElmIG5vIGlucHV0IGZvcm1hdCBpcyBzcGVjaWZpZWQsIEBjb2Rle3dpbmRyZXN9IHdpbGwKLWd1ZXNzLCBhcyBkZXNjcmliZWQgYWJvdmUuCi0KLUBpdGVtIC1PIEB2YXJ7Zm9ybWF0fQotQGl0ZW14IC0tb3V0cHV0LWZvcm1hdCBAdmFye2Zvcm1hdH0KLVRoZSBvdXRwdXQgZm9ybWF0IHRvIGdlbmVyYXRlLiAgQHZhcntmb3JtYXR9IG1heSBiZSBAc2FtcHtyZXN9LAotQHNhbXB7cmN9LCBvciBAc2FtcHtjb2ZmfS4gIElmIG5vIG91dHB1dCBmb3JtYXQgaXMgc3BlY2lmaWVkLAotQGNvZGV7d2luZHJlc30gd2lsbCBndWVzcywgYXMgZGVzY3JpYmVkIGFib3ZlLgotCi1AaXRlbSAtRiBAdmFye3RhcmdldH0KLUBpdGVteCAtLXRhcmdldCBAdmFye3RhcmdldH0KLVNwZWNpZnkgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIGZvciBhIENPRkYgZmlsZSBhcyBpbnB1dCBvciBvdXRwdXQuICBUaGlzCi1pcyBhIEJGRCB0YXJnZXQgbmFtZTsgeW91IGNhbiB1c2UgdGhlIEBjb2Rley0taGVscH0gb3B0aW9uIHRvIHNlZSBhIGxpc3QKLW9mIHN1cHBvcnRlZCB0YXJnZXRzLiAgTm9ybWFsbHkgQGNvZGV7d2luZHJlc30gd2lsbCB1c2UgdGhlIGRlZmF1bHQKLWZvcm1hdCwgd2hpY2ggaXMgdGhlIGZpcnN0IG9uZSBsaXN0ZWQgYnkgdGhlIEBjb2Rley0taGVscH0gb3B0aW9uLgotQHJlZntUYXJnZXQgU2VsZWN0aW9ufS4KLQotQGl0ZW0gLS1wcmVwcm9jZXNzb3IgQHZhcntwcm9ncmFtfQotV2hlbiBAY29kZXt3aW5kcmVzfSByZWFkcyBhbiBAY29kZXtyY30gZmlsZSwgaXQgcnVucyBpdCB0aHJvdWdoIHRoZSBDCi1wcmVwcm9jZXNzb3IgZmlyc3QuICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBwcmVwcm9jZXNzb3IKLXRvIHVzZSwgaW5jbHVkaW5nIGFueSBsZWFkaW5nIGFyZ3VtZW50cy4gIFRoZSBkZWZhdWx0IHByZXByb2Nlc3NvcgotYXJndW1lbnQgaXMgQGNvZGV7Z2NjIC1FIC14Yy1oZWFkZXIgLURSQ19JTlZPS0VEfS4KLQotQGl0ZW0gLS1pbmNsdWRlLWRpciBAdmFye2RpcmVjdG9yeX0KLVNwZWNpZnkgYW4gaW5jbHVkZSBkaXJlY3RvcnkgdG8gdXNlIHdoZW4gcmVhZGluZyBhbiBAY29kZXtyY30gZmlsZS4KLUBjb2Rle3dpbmRyZXN9IHdpbGwgcGFzcyB0aGlzIHRvIHRoZSBwcmVwcm9jZXNzb3IgYXMgYW4gQGNvZGV7LUl9Ci1vcHRpb24uICBAY29kZXt3aW5kcmVzfSB3aWxsIGFsc28gc2VhcmNoIHRoaXMgZGlyZWN0b3J5IHdoZW4gbG9va2luZyBmb3IKLWZpbGVzIG5hbWVkIGluIHRoZSBAY29kZXtyY30gZmlsZS4KLQotQGl0ZW0gLUQgQHZhcnt0YXJnZXR9Ci1AaXRlbXggLS1kZWZpbmUgQHZhcntzeW1bPXZhbF19Ci1TcGVjaWZ5IGEgQGNvZGV7LUR9IG9wdGlvbiB0byBwYXNzIHRvIHRoZSBwcmVwcm9jZXNzb3Igd2hlbiByZWFkaW5nIGFuCi1AY29kZXtyY30gZmlsZS4KLQotQGl0ZW0gLXYKLUVuYWJsZSB2ZXJib3NlIG1vZGUuICBUaGlzIHRlbGxzIHlvdSB3aGF0IHRoZSBwcmVwcm9jZXNzb3IgaXMgaWYgeW91Ci1kaWRuJ3Qgc3BlY2lmeSBvbmUuCi0KLUBpdGVtIC0tbGFuZ3VhZ2UgQHZhcnt2YWx9Ci1TcGVjaWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIHRvIHVzZSB3aGVuIHJlYWRpbmcgYW4gQGNvZGV7cmN9IGZpbGUuCi1AdmFye3ZhbH0gc2hvdWxkIGJlIGEgaGV4YWRlY2ltYWwgbGFuZ3VhZ2UgY29kZS4gIFRoZSBsb3cgZWlnaHQgYml0cyBhcmUKLXRoZSBsYW5ndWFnZSwgYW5kIHRoZSBoaWdoIGVpZ2h0IGJpdHMgYXJlIHRoZSBzdWJsYW5ndWFnZS4KLQotQGl0ZW0gLS1oZWxwCi1QcmludHMgYSB1c2FnZSBzdW1tYXJ5LgotCi1AaXRlbSAtLXZlcnNpb24KLVByaW50cyB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle3dpbmRyZXN9LgotCi1AaXRlbSAtLXl5ZGVidWcKLUlmIEBjb2Rle3dpbmRyZXN9IGlzIGNvbXBpbGVkIHdpdGggQGNvZGV7WVlERUJVR30gZGVmaW5lZCBhcyBAY29kZXsxfSwKLXRoaXMgd2lsbCB0dXJuIG9uIHBhcnNlciBkZWJ1Z2dpbmcuCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgZGxsdG9vbAotQGNoYXB0ZXIgQ3JlYXRlIGZpbGVzIG5lZWRlZCB0byBidWlsZCBhbmQgdXNlIERMTHMKLUBjaW5kZXggRExMCi1Aa2luZGV4IGRsbHRvb2wKLQotQGNvZGV7ZGxsdG9vbH0gbWF5IGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBmaWxlcyBuZWVkZWQgdG8gYnVpbGQgYW5kIHVzZQotZHluYW1pYyBsaW5rIGxpYnJhcmllcyAoRExMcykuCi0KLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXtkbGx0b29sfSBpcyBub3QgYWx3YXlzIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIGJpbmFyeQotdXRpbGl0aWVzLCBzaW5jZSBpdCBpcyBvbmx5IHVzZWZ1bCBmb3IgdGhvc2UgdGFyZ2V0cyB3aGljaCBzdXBwb3J0IERMTHMuCi1AZW5kIHF1b3RhdGlvbgotCi1Ac21hbGxleGFtcGxlCi1kbGx0b29sIFstZHwtLWlucHV0LWRlZiBAdmFye2RlZi1maWxlLW5hbWV9XQotICAgICAgICBbLWJ8LS1iYXNlLWZpbGUgQHZhcntiYXNlLWZpbGUtbmFtZX1dCi0gICAgICAgIFstZXwtLW91dHB1dC1leHAgQHZhcntleHBvcnRzLWZpbGUtbmFtZX1dCi0gICAgICAgIFstenwtLW91dHB1dC1kZWYgQHZhcntkZWYtZmlsZS1uYW1lfV0KLSAgICAgICAgWy1sfC0tb3V0cHV0LWxpYiBAdmFye2xpYnJhcnktZmlsZS1uYW1lfV0gICAgICAgIAotICAgICAgICBbLS1leHBvcnQtYWxsLXN5bWJvbHNdIFstLW5vLWV4cG9ydC1hbGwtc3ltYm9sc10KLSAgICAgICAgWy0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7bGlzdH1dCi0gICAgICAgIFstLW5vLWRlZmF1bHQtZXhjbHVkZXNdCi0gICAgICAgIFstU3wtLWFzIEB2YXJ7cGF0aC10by1hc3NlbWJsZXJ9XSBbLWZ8LS1hcy1mbGFncyBAdmFye29wdGlvbnN9XQotICAgICAgICBbLUR8LS1kbGxuYW1lIEB2YXJ7bmFtZX1dIFstbXwtLW1hY2hpbmUgQHZhcnttYWNoaW5lfV0KLSAgICAgICAgWy1hfC0tYWRkLWluZGlyZWN0XSBbLVV8LS1hZGQtdW5kZXJzY29yZV0gWy1rfC0ta2lsbC1hdF0KLSAgICAgICAgWy1BfC0tYWRkLXN0ZGNhbGwtYWxpYXNdCi0gICAgICAgIFsteHwtLW5vLWlkYXRhNF0gWy1jfC0tbm8taWRhdGE1XSBbLWl8LS1pbnRlcndvcmtdCi0gICAgICAgIFstbnwtLW5vZGVsZXRlXSBbLXZ8LS12ZXJib3NlXSBbLWh8LS1oZWxwXSBbLVZ8LS12ZXJzaW9uXQotICAgICAgICBbb2JqZWN0LWZpbGUgQGRvdHN7fV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle2RsbHRvb2x9IHJlYWRzIGl0cyBpbnB1dHMsIHdoaWNoIGNhbiBjb21lIGZyb20gdGhlIEBzYW1wey1kfSBhbmQKLUBzYW1wey1ifSBvcHRpb25zIGFzIHdlbGwgYXMgb2JqZWN0IGZpbGVzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZAotbGluZS4gIEl0IHRoZW4gcHJvY2Vzc2VzIHRoZXNlIGlucHV0cyBhbmQgaWYgdGhlIEBzYW1wey1lfSBvcHRpb24gaGFzCi1iZWVuIHNwZWNpZmllZCBpdCBjcmVhdGVzIGEgZXhwb3J0cyBmaWxlLiAgSWYgdGhlIEBzYW1wey1sfSBvcHRpb24KLWhhcyBiZWVuIHNwZWNpZmllZCBpdCBjcmVhdGVzIGEgbGlicmFyeSBmaWxlIGFuZCBpZiB0aGUgQHNhbXB7LXp9IG9wdGlvbgotaGFzIGJlZW4gc3BlY2lmaWVkIGl0IGNyZWF0ZXMgYSBkZWYgZmlsZS4gIEFueSBvciBhbGwgb2YgdGhlIC1lLCAtbAotYW5kIC16IG9wdGlvbnMgY2FuIGJlIHByZXNlbnQgaW4gb25lIGludm9jYXRpb24gb2YgZGxsdG9vbC4KLQotV2hlbiBjcmVhdGluZyBhIERMTCwgYWxvbmcgd2l0aCB0aGUgc291cmNlIGZvciB0aGUgRExMLCBpdCBpcyBuZWNlc3NhcnkKLXRvIGhhdmUgdGhyZWUgb3RoZXIgZmlsZXMuICBAY29kZXtkbGx0b29sfSBjYW4gaGVscCB3aXRoIHRoZSBjcmVhdGlvbiBvZgotdGhlc2UgZmlsZXMuCi0KLVRoZSBmaXJzdCBmaWxlIGlzIGEgQHNhbXB7LmRlZn0gZmlsZSB3aGljaCBzcGVjaWZpZXMgd2hpY2ggZnVuY3Rpb25zIGFyZQotZXhwb3J0ZWQgZnJvbSB0aGUgRExMLCB3aGljaCBmdW5jdGlvbnMgdGhlIERMTCBpbXBvcnRzLCBhbmQgc28gb24uICBUaGlzCi1pcyBhIHRleHQgZmlsZSBhbmQgY2FuIGJlIGNyZWF0ZWQgYnkgaGFuZCwgb3IgQGNvZGV7ZGxsdG9vbH0gY2FuIGJlIHVzZWQKLXRvIGNyZWF0ZSBpdCB1c2luZyB0aGUgQHNhbXB7LXp9IG9wdGlvbi4gIEluIHRoaXMgY2FzZSBAY29kZXtkbGx0b29sfQotd2lsbCBzY2FuIHRoZSBvYmplY3QgZmlsZXMgc3BlY2lmaWVkIG9uIGl0cyBjb21tYW5kIGxpbmUgbG9va2luZyBmb3IKLXRob3NlIGZ1bmN0aW9ucyB3aGljaCBoYXZlIGJlZW4gc3BlY2lhbGx5IG1hcmtlZCBhcyBiZWluZyBleHBvcnRlZCBhbmQKLXB1dCBlbnRyaWVzIGZvciB0aGVtIGluIHRoZSAuZGVmIGZpbGUgaXQgY3JlYXRlcy4KLQotSW4gb3JkZXIgdG8gbWFyayBhIGZ1bmN0aW9uIGFzIGJlaW5nIGV4cG9ydGVkIGZyb20gYSBETEwsIGl0IG5lZWRzIHRvCi1oYXZlIGFuIEBzYW1wey1leHBvcnQ6PG5hbWVfb2ZfZnVuY3Rpb24+fSBlbnRyeSBpbiB0aGUgQHNhbXB7LmRyZWN0dmV9Ci1zZWN0aW9uIG9mIHRoZSBvYmplY3QgZmlsZS4gIFRoaXMgY2FuIGJlIGRvbmUgaW4gQyBieSB1c2luZyB0aGUKLWFzbSgpIG9wZXJhdG9yOgotCi1Ac21hbGxleGFtcGxlCi0gIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlIik7ICAKLSAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpteV9mdW5jXCIiKTsKLQotICBpbnQgbXlfZnVuYyAodm9pZCkgQHsgQGRvdHN7fSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHNlY29uZCBmaWxlIG5lZWRlZCBmb3IgRExMIGNyZWF0aW9uIGlzIGFuIGV4cG9ydHMgZmlsZS4gIFRoaXMgZmlsZQotaXMgbGlua2VkIHdpdGggdGhlIG9iamVjdCBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIGJvZHkgb2YgdGhlIERMTCBhbmQgaXQKLWhhbmRsZXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBETEwgYW5kIHRoZSBvdXRzaWRlIHdvcmxkLiAgVGhpcyBpcyBhCi1iaW5hcnkgZmlsZSBhbmQgaXQgY2FuIGJlIGNyZWF0ZWQgYnkgZ2l2aW5nIHRoZSBAc2FtcHstZX0gb3B0aW9uIHRvCi1AY29kZXtkbGx0b29sfSB3aGVuIGl0IGlzIGNyZWF0aW5nIG9yIHJlYWRpbmcgaW4gYSAuZGVmIGZpbGUuIAotCi1UaGUgdGhpcmQgZmlsZSBuZWVkZWQgZm9yIERMTCBjcmVhdGlvbiBpcyB0aGUgbGlicmFyeSBmaWxlIHRoYXQgcHJvZ3JhbXMKLXdpbGwgbGluayB3aXRoIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUgZnVuY3Rpb25zIGluIHRoZSBETEwuICBUaGlzIGZpbGUKLWNhbiBiZSBjcmVhdGVkIGJ5IGdpdmluZyB0aGUgQHNhbXB7LWx9IG9wdGlvbiB0byBkbGx0b29sIHdoZW4gaXQKLWlzIGNyZWF0aW5nIG9yIHJlYWRpbmcgaW4gYSAuZGVmIGZpbGUuCi0KLUBjb2Rle2RsbHRvb2x9IGJ1aWxkcyB0aGUgbGlicmFyeSBmaWxlIGJ5IGhhbmQsIGJ1dCBpdCBidWlsZHMgdGhlCi1leHBvcnRzIGZpbGUgYnkgY3JlYXRpbmcgdGVtcG9yYXJ5IGZpbGVzIGNvbnRhaW5pbmcgYXNzZW1ibGVyIHN0YXRlbWVudHMKLWFuZCB0aGVuIGFzc2VtYmxpbmcgdGhlc2UuICBUaGUgQHNhbXB7LVN9IGNvbW1hbmQgbGluZSBvcHRpb24gY2FuIGJlCi11c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIGFzc2VtYmxlciB0aGF0IGRsbHRvb2wgd2lsbCB1c2UsCi1hbmQgdGhlIEBzYW1wey1mfSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcGFzcyBzcGVjaWZpYyBmbGFncyB0byB0aGF0Ci1hc3NlbWJsZXIuICBUaGUgQHNhbXB7LW59IGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgZGxsdG9vbCBmcm9tIGRlbGV0aW5nCi10aGVzZSB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGVzIHdoZW4gaXQgaXMgZG9uZSwgYW5kIGlmIEBzYW1wey1ufSBpcwotc3BlY2lmaWVkIHR3aWNlIHRoZW4gdGhpcyB3aWxsIHByZXZlbnQgZGxsdG9vbCBmcm9tIGRlbGV0aW5nIHRoZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlcyBpdCB1c2VkIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgY3JlYXRpbmcgYSBETEwgZnJvbSBhIHNvdXJjZSBmaWxlIEBzYW1we2RsbC5jfSBhbmQKLWFsc28gY3JlYXRpbmcgYSBwcm9ncmFtIChmcm9tIGFuIG9iamVjdCBmaWxlIGNhbGxlZCBAc2FtcHtwcm9ncmFtLm99KQotdGhhdCB1c2VzIHRoYXQgRExMOgotCi1Ac21hbGxleGFtcGxlCi0gIGdjYyAtYyBkbGwuYwotICBkbGx0b29sIC1lIGV4cG9ydHMubyAtbCBkbGwubGliIGRsbC5vCi0gIGdjYyBkbGwubyBleHBvcnRzLm8gLW8gZGxsLmRsbAotICBnY2MgcHJvZ3JhbS5vIGRsbC5saWIgLW8gcHJvZ3JhbQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGNvbW1hbmQgbGluZSBvcHRpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1kIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1pbnB1dC1kZWYgQHZhcntmaWxlbmFtZX0KLUBjaW5kZXggaW5wdXQgLmRlZiBmaWxlCi1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbiBhbmQgcHJvY2Vzc2VkLgotCi1AaXRlbSAtYiBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tYmFzZS1maWxlIEB2YXJ7ZmlsZW5hbWV9Ci1AY2luZGV4IGJhc2UgZmlsZXMKLVNwZWNpZmllcyB0aGUgbmFtZSBvZiBhIGJhc2UgZmlsZSB0byBiZSByZWFkIGluIGFuZCBwcm9jZXNzZWQuICBUaGUKLWNvbnRlbnRzIG9mIHRoaXMgZmlsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gaW4gdGhlCi1leHBvcnRzIGZpbGUgZ2VuZXJhdGVkIGJ5IGRsbHRvb2wuCi0KLUBpdGVtIC1lIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbXggLS1vdXRwdXQtZXhwIEB2YXJ7ZmlsZW5hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGV4cG9ydCBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLXogQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLW91dHB1dC1kZWYgQHZhcntmaWxlbmFtZX0KLVNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgLmRlZiBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLWwgQHZhcntmaWxlbmFtZX0KLUBpdGVteCAtLW91dHB1dC1saWIgQHZhcntmaWxlbmFtZX0KLVNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSBmaWxlIHRvIGJlIGNyZWF0ZWQgYnkgZGxsdG9vbC4KLQotQGl0ZW0gLS1leHBvcnQtYWxsLXN5bWJvbHMKLVRyZWF0IGFsbCBnbG9iYWwgYW5kIHdlYWsgZGVmaW5lZCBzeW1ib2xzIGZvdW5kIGluIHRoZSBpbnB1dCBvYmplY3QKLWZpbGVzIGFzIHN5bWJvbHMgdG8gYmUgZXhwb3J0ZWQuICBUaGVyZSBpcyBhIHNtYWxsIGxpc3Qgb2Ygc3ltYm9scyB3aGljaAotYXJlIG5vdCBleHBvcnRlZCBieSBkZWZhdWx0OyBzZWUgdGhlIEBjb2Rley0tbm8tZGVmYXVsdC1leGNsdWRlc30KLW9wdGlvbi4gIFlvdSBtYXkgYWRkIHRvIHRoZSBsaXN0IG9mIHN5bWJvbHMgdG8gbm90IGV4cG9ydCBieSB1c2luZyB0aGUKLUBjb2Rley0tZXhjbHVkZS1zeW1ib2xzfSBvcHRpb24uCi0KLUBpdGVtIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzCi1Pbmx5IGV4cG9ydCBzeW1ib2xzIGV4cGxpY2l0bHkgbGlzdGVkIGluIGFuIGlucHV0IC5kZWYgZmlsZSBvciBpbgotQHNhbXB7LmRyZWN0dmV9IHNlY3Rpb25zIGluIHRoZSBpbnB1dCBvYmplY3QgZmlsZXMuICBUaGlzIGlzIHRoZSBkZWZhdWx0Ci1iZWhhdmlvdXIuICBUaGUgQHNhbXB7LmRyZWN0dmV9IHNlY3Rpb25zIGFyZSBjcmVhdGVkIGJ5IEBzYW1we2RsbGV4cG9ydH0KLWF0dHJpYnV0ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLgotCi1AaXRlbSAtLWV4Y2x1ZGUtc3ltYm9scyBAdmFye2xpc3R9Ci1EbyBub3QgZXhwb3J0IHRoZSBzeW1ib2xzIGluIEB2YXJ7bGlzdH0uICBUaGlzIGlzIGEgbGlzdCBvZiBzeW1ib2wgbmFtZXMKLXNlcGFyYXRlZCBieSBjb21tYSBvciBjb2xvbiBjaGFyYWN0ZXJzLiAgVGhlIHN5bWJvbCBuYW1lcyBzaG91bGQgbm90Ci1jb250YWluIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbgotQGNvZGV7LS1leHBvcnQtYWxsLXN5bWJvbHN9IGlzIHVzZWQuCi0KLUBpdGVtIC0tbm8tZGVmYXVsdC1leGNsdWRlcwotV2hlbiBAY29kZXstLWV4cG9ydC1hbGwtc3ltYm9sc30gaXMgdXNlZCwgaXQgd2lsbCBieSBkZWZhdWx0IGF2b2lkCi1leHBvcnRpbmcgY2VydGFpbiBzcGVjaWFsIHN5bWJvbHMuICBUaGUgY3VycmVudCBsaXN0IG9mIHN5bWJvbHMgdG8gYXZvaWQKLWV4cG9ydGluZyBpcyBAc2FtcHtEbGxNYWluQEAxMn0sIEBzYW1we0RsbEVudHJ5UG9pbnRAQDB9LAotQHNhbXB7aW1wdXJlX3B0cn0uICBZb3UgbWF5IHVzZSB0aGUgQGNvZGV7LS1uby1kZWZhdWx0LWV4Y2x1ZGVzfSBvcHRpb24KLXRvIGdvIGFoZWFkIGFuZCBleHBvcnQgdGhlc2Ugc3BlY2lhbCBzeW1ib2xzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwKLXdoZW4gQGNvZGV7LS1leHBvcnQtYWxsLXN5bWJvbHN9IGlzIHVzZWQuCi0KLUBpdGVtIC1TIEB2YXJ7cGF0aH0KLUBpdGVteCAtLWFzIEB2YXJ7cGF0aH0KLVNwZWNpZmllcyB0aGUgcGF0aCwgaW5jbHVkaW5nIHRoZSBmaWxlbmFtZSwgb2YgdGhlIGFzc2VtYmxlciB0byBiZSB1c2VkCi10byBjcmVhdGUgdGhlIGV4cG9ydHMgZmlsZS4KLQotQGl0ZW0gLWYgQHZhcntzd2l0Y2hlc30KLUBpdGVteCAtLWFzLWZsYWdzIEB2YXJ7c3dpdGNoZXN9Ci1TcGVjaWZpZXMgYW55IHNwZWNpZmljIGNvbW1hbmQgbGluZSBzd2l0Y2hlcyB0byBiZSBwYXNzZWQgdG8gdGhlCi1hc3NlbWJsZXIgd2hlbiBidWlsZGluZyB0aGUgZXhwb3J0cyBmaWxlLiAgVGhpcyBvcHRpb24gd2lsbCB3b3JrIGV2ZW4gaWYKLXRoZSBAc2FtcHstU30gb3B0aW9uIGlzIG5vdCB1c2VkLiAgVGhpcyBvcHRpb24gb25seSB0YWtlcyBvbmUgYXJndW1lbnQsCi1hbmQgaWYgaXQgb2NjdXJzIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4gbGF0ZXIKLW9jY3VycmVuY2VzIHdpbGwgb3ZlcnJpZGUgZWFybGllciBvY2N1cnJlbmNlcy4gIFNvIGlmIGl0IGlzIG5lY2Vzc2FyeSB0bwotcGFzcyBtdWx0aXBsZSBzd2l0Y2hlcyB0byB0aGUgYXNzZW1ibGVyIHRoZXkgc2hvdWxkIGJlIGVuY2xvc2VkIGluCi1kb3VibGUgcXVvdGVzLgotCi1AaXRlbSAtRCBAdmFye25hbWV9Ci1AaXRlbXggLS1kbGwtbmFtZSBAdmFye25hbWV9Ci1TcGVjaWZpZXMgdGhlIG5hbWUgdG8gYmUgc3RvcmVkIGluIHRoZSAuZGVmIGZpbGUgYXMgdGhlIG5hbWUgb2YgdGhlIERMTAotd2hlbiB0aGUgQHNhbXB7LWV9IG9wdGlvbiBpcyB1c2VkLiAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHByZXNlbnQsIHRoZW4KLXRoZSBmaWxlbmFtZSBnaXZlbiB0byB0aGUgQHNhbXB7LWV9IG9wdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YKLXRoZSBETEwuCi0KLUBpdGVtIC1tIEB2YXJ7bWFjaGluZX0KLUBpdGVteCAtbWFjaGluZSBAdmFye21hY2hpbmV9Ci1TcGVjaWZpZXMgdGhlIHR5cGUgb2YgbWFjaGluZSBmb3Igd2hpY2ggdGhlIGxpYnJhcnkgZmlsZSBzaG91bGQgYmUKLWJ1aWx0LiAgQGNvZGV7ZGxsdG9vbH0gaGFzIGEgYnVpbHQgaW4gZGVmYXVsdCB0eXBlLCBkZXBlbmRpbmcgdXBvbiBob3cKLWl0IHdhcyBjcmVhdGVkLCBidXQgdGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhhdC4gIFRoaXMgaXMKLW5vcm1hbGx5IG9ubHkgdXNlZnVsIHdoZW4gY3JlYXRpbmcgRExMcyBmb3IgYW4gQVJNIHByb2Nlc3Nvciwgd2hlbiB0aGUKLWNvbnRlbnRzIG9mIHRoZSBETEwgYXJlIGFjdHVhbGx5IGVuY29kZSB1c2luZyBUSFVNQiBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC1hCi1AaXRlbXggLS1hZGQtaW5kaXJlY3QKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIGFkZCBhIHNlY3Rpb24gd2hpY2ggYWxsb3dzIHRoZSBleHBvcnRlZCBmdW5jdGlvbnMgdG8gYmUKLXJlZmVyZW5jZWQgd2l0aG91dCB1c2luZyB0aGUgaW1wb3J0IGxpYnJhcnkuICBXaGF0ZXZlciB0aGUgaGVsbCB0aGF0Ci1tZWFucyEgCi0KLUBpdGVtIC1VCi1AaXRlbXggLS1hZGQtdW5kZXJzY29yZQotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBmaWxlIGl0Ci1zaG91bGQgcHJlcGVuZCBhbiB1bmRlcnNjb3JlIHRvIHRoZSBuYW1lcyBvZiB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zLiAKLQotQGl0ZW0gLWsKLUBpdGVteCAtLWtpbGwtYXQKLVNwZWNpZmllcyB0aGF0IHdoZW4gQGNvZGV7ZGxsdG9vbH0gaXMgY3JlYXRpbmcgdGhlIGV4cG9ydHMgZmlsZSBpdAotc2hvdWxkIG5vdCBhcHBlbmQgdGhlIHN0cmluZyBAc2FtcHtAQCA8bnVtYmVyPn0uICBUaGVzZSBudW1iZXJzIGFyZQotY2FsbGVkIG9yZGluYWwgbnVtYmVycyBhbmQgdGhleSByZXByZXNlbnQgYW5vdGhlciB3YXkgb2YgYWNjZXNzaW5nIHRoZQotZnVuY3Rpb24gaW4gYSBETEwsIG90aGVyIHRoYW4gYnkgbmFtZS4KLQotQGl0ZW0gLUEKLUBpdGVteCAtLWFkZC1zdGRjYWxsLWFsaWFzCi1TcGVjaWZpZXMgdGhhdCB3aGVuIEBjb2Rle2RsbHRvb2x9IGlzIGNyZWF0aW5nIHRoZSBleHBvcnRzIGZpbGUgaXQKLXNob3VsZCBhZGQgYWxpYXNlcyBmb3Igc3RkY2FsbCBzeW1ib2xzIHdpdGhvdXQgQHNhbXB7QEAgPG51bWJlcj59Ci1pbiBhZGRpdGlvbiB0byB0aGUgc3ltYm9scyB3aXRoIEBzYW1we0BAIDxudW1iZXI+fS4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLW5vLWlkYXRhNAotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBhbmQgbGlicmFyeQotZmlsZXMgaXQgc2hvdWxkIG9taXQgdGhlIC5pZGF0YTQgc2VjdGlvbi4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotQGl0ZW0gLWMKLUBpdGVteCAtLW5vLWlkYXRhNQotU3BlY2lmaWVzIHRoYXQgd2hlbiBAY29kZXtkbGx0b29sfSBpcyBjcmVhdGluZyB0aGUgZXhwb3J0cyBhbmQgbGlicmFyeQotZmlsZXMgaXQgc2hvdWxkIG9taXQgdGhlIC5pZGF0YTUgc2VjdGlvbi4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotQGl0ZW0gLWkKLUBpdGVteCAtLWludGVyd29yawotU3BlY2lmaWVzIHRoYXQgQGNvZGV7ZGxsdG9vbH0gc2hvdWxkIG1hcmsgdGhlIG9iamVjdHMgaW4gdGhlIGxpYnJhcnkKLWZpbGUgYW5kIGV4cG9ydHMgZmlsZSB0aGF0IGl0IHByb2R1Y2VzIGFzIHN1cHBvcnRpbmcgaW50ZXJ3b3JraW5nCi1iZXR3ZWVuIEFSTSBhbmQgVEhVTUIgY29kZS4KLQotQGl0ZW0gLW4KLUBpdGVteCAtLW5vZGVsZXRlCi1NYWtlcyBAY29kZXtkbGx0b29sfSBwcmVzZXJ2ZSB0aGUgdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlcyBpdCB1c2VkIHRvCi1jcmVhdGUgdGhlIGV4cG9ydHMgZmlsZS4gIElmIHRoaXMgb3B0aW9uIGlzIHJlcGVhdGVkIHRoZW4gZGxsdG9vbCB3aWxsCi1hbHNvIHByZXNlcnZlIHRoZSB0ZW1wb3Jhcnkgb2JqZWN0IGZpbGVzIGl0IHVzZXMgdG8gY3JlYXRlIHRoZSBsaWJyYXJ5Ci1maWxlLiAKLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcmJvc2UKLU1ha2UgZGxsdG9vbCBkZXNjcmliZSB3aGF0IGl0IGlzIGRvaW5nLgotCi1AaXRlbSAtaAotQGl0ZW14IC0taGVscAotRGlzcGxheXMgYSBsaXN0IG9mIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCB0aGVuIGV4aXRzLgotCi1AaXRlbSAtVgotQGl0ZW14IC0tdmVyc2lvbgotRGlzcGxheXMgZGxsdG9vbCdzIHZlcnNpb24gbnVtYmVyIGFuZCB0aGVuIGV4aXRzLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIHJlYWRlbGYKLUBjaGFwdGVyIHJlYWRlbGYKLQotQGNpbmRleCBFTEYgZmlsZSBpbmZvcm1hdGlvbgotQGtpbmRleCByZWFkZWxmCi0KLUBzbWFsbGV4YW1wbGUKLXJlYWRlbGYgWyAtYSB8IC0tYWxsIF0gCi0gICAgICAgIFsgLWggfCAtLWZpbGUtaGVhZGVyXQotICAgICAgICBbIC1sIHwgLS1wcm9ncmFtLWhlYWRlcnMgfCAtLXNlZ21lbnRzXQotICAgICAgICBbIC1TIHwgLS1zZWN0aW9uLWhlYWRlcnMgfCAtLXNlY3Rpb25zXQotICAgICAgICBbIC1lIHwgLS1oZWFkZXJzXQotICAgICAgICBbIC1zIHwgLS1zeW1zIHwgLS1zeW1ib2xzXQotICAgICAgICBbIC1yIHwgLS1yZWxvY3NdCi0gICAgICAgIFsgLWQgfCAtLWR5bmFtaWNdCi0gICAgICAgIFsgLVYgfCAtLXZlcnNpb24taW5mb10KLSAgICAgICAgWyAtRCB8IC0tdXNlLWR5bmFtaWNdCi0gICAgICAgIFsgLXggPG51bWJlcj4gfCAtLWhleC1kdW1wPTxudW1iZXI+XQotICAgICAgICBbIC13W2xpYXByXSB8IC0tZGVidWctZHVtcFs9aW5mbyw9bGluZSw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXV0KLSAgICAgICAgWyAgICAgIC0taGlzdG9ncmFtXQotICAgICAgICBbIC12IHwgLS12ZXJzaW9uXQotICAgICAgICBbIC1IIHwgLS1oZWxwXQotICAgICAgICBAdmFye2VsZmZpbGV9QGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7cmVhZGVsZn0gZGlzcGxheXMgaW5mb3JtYXRpb24gYWJvdXQgb25lIG9yIG1vcmUgRUxGIGZvcm1hdCBvYmplY3QKLWZpbGVzLiAgVGhlIG9wdGlvbnMgY29udHJvbCB3aGF0IHBhcnRpY3VsYXIgaW5mb3JtYXRpb24gdG8gZGlzcGxheS4KLQotQHZhcntlbGZmaWxlfUBkb3Rze30gYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuICBBdCB0aGUKLW1vbWVudCwgQGNvZGV7cmVhZGVsZn0gZG9lcyBub3Qgc3VwcG9ydCBleGFtaW5pbmcgYXJjaGl2ZXMsIG5vciBkb2VzIGl0Ci1zdXBwb3J0IGV4YW1pbmcgNjQgYml0IEVMRiBmaWxlcy4KLQotVGhlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIG9wdGlvbnMsIHNob3duIGhlcmUgYXMgYWx0ZXJuYXRpdmVzLCBhcmUKLWVxdWl2YWxlbnQuICBBdCBsZWFzdCBvbmUgb3B0aW9uIGJlc2lkZXMgQHNhbXB7LXZ9IG9yIEBzYW1wey1IfSBtdXN0IGJlCi1naXZlbi4gCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLWEKLUBpdGVteCAtLWFsbAotRXF1aXZhbGVudCB0byBzcGVjaWZpeWluZyBAc2FtcHstLWZpbGUtaGVhZGVyfSwKLUBzYW1wey0tcHJvZ3JhbS1oZWFkZXJzfSwgQHNhbXB7LS1zZWN0aW9uc30sIEBzYW1wey0tc3ltYm9sc30sCi1Ac2FtcHstLXJlbG9jc30sIEBzYW1wey0tZHluYW1pY30gYW5kIEBzYW1wey0tdmVyc2lvbi1pbmZvfS4KLQotQGl0ZW0gLWgKLUBpdGVteCAtLWZpbGUtaGVhZGVyCi1AY2luZGV4IEVMRiBmaWxlIGhlYWRlciBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgRUxGIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgdGhlCi1maWxlLgotCi1AaXRlbSAtbAotQGl0ZW14IC0tcHJvZ3JhbS1oZWFkZXJzCi1AaXRlbXggLS1zZWdtZW50cwotQGNpbmRleCBFTEYgcHJvZ3JhbSBoZWFkZXIgaW5mb3JtYXRpb24KLUBjaW5kZXggRUxGIHNlZ21lbnQgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW4gdGhlIGZpbGUncyBzZWdtZW50IGhlYWRlcnMsIGlmIGl0Ci1oYXMgYW55LgotCi1AaXRlbSAtUwotQGl0ZW14IC0tc2VjdGlvbnMKLUBpdGVteCAtLXNlY3Rpb24taGVhZGVycwotQGNpbmRleCBFTEYgc2VjdGlvbiBpbmZvcm1hdGlvbgotRGlzcGxheXMgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSdzIHNlY3Rpb24gaGVhZGVycywgaWYgaXQKLWhhcyBhbnkuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1zeW1ib2xzCi1AaXRlbXggLS1zeW1zCi1AY2luZGV4IEVMRiBzeW1ib2wgdGFibGUgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBlbnRyaWVzIGluIHN5bWJvbCB0YWJsZSBzZWN0aW9uIG9mIHRoZSBmaWxlLCBpZiBpdCBoYXMgb25lLgotCi1AaXRlbSAtZQotQGl0ZW14IC0taGVhZGVycwotRGlzcGxheSBhbGwgdGhlIGhlYWRlcnMgaW4gdGhlIGZpbGUuICBFcXVpdmFsZW50IHRvIEBzYW1wey1oIC1sIC1TfS4KLQotQGl0ZW0gLXIKLUBpdGVteCAtLXJlbG9jcwotQGNpbmRleCBFTEYgcmVsb2MgaW5mb3JtYXRpb24KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSdzIHJlbG9jYXRpb24gc2VjdGlvbiwgaWYgaXQgaGEgb25lLgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZHluYW1pYwotQGNpbmRleCBFTEYgZHluYW1pYyBzZWN0aW9uIGluZm9ybWF0aW9uCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUncyBkeW5hbWljIHNlY3Rpb24sIGlmIGl0IGhhcyBvbmUuCi0KLUBpdGVtIC1WCi1AaXRlbXggLS12ZXJzaW9uLWluZm8KLUBjaW5kZXggRUxGIHZlcnNpb24gc2VjdGlvbnMgaW5mb3JtYXRpb25zCi1EaXNwbGF5cyB0aGUgY29udGVudHMgb2YgdGhlIHZlcnNpb24gc2VjdGlvbnMgaW4gdGhlIGZpbGUsIGl0IHRoZXkKLWV4aXN0LgotCi1AaXRlbSAtRAotQGl0ZW14IC0tdXNlLWR5bmFtaWMKLVdoZW4gZGlzcGxheWluZyBzeW1ib2xzLCB0aGlzIG9wdGlvbiBtYWtlcyBAY29kZXtyZWFkZWxmfSB1c2UgdGhlCi1zeW1ibG9sIHRhYmxlIGluIHRoZSBmaWxlJ3MgZHluYW1pYyBzZWN0aW9uLCByYXRoZXIgdGhhbiB0aGUgb25lIGluIHRoZQotc3ltYm9scyBzZWN0aW9uLgotCi1AaXRlbSAteCA8bnVtYmVyPgotQGl0ZW14IC0taGV4LWR1bXA9PG51bWJlcj4KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kaWNhdGVkIHNlY3Rpb24gYXMgYSBoZXhhZGVjaW1hbCBkdW1wLgotCi1AaXRlbSAtd1tsaWFwcl0KLUBpdGVteCAtLWRlYnVnLWR1bXBbPWxpbmUsPWluZm8sPWFiYnJldiw9cHVibmFtZXMsPXJhbmdlc10KLURpc3BsYXlzIHRoZSBjb250ZW50cyBvZiB0aGUgZGVidWcgc2VjdGlvbnMgaW4gdGhlIGZpbGUsIGlmIGFueSBhcmUKLXByZXNlbnQuICBJZiBvbmUgb2YgdGhlIG9wdGlvbmFsIGxldHRlcnMgb3Igd29yZHMgZm9sbG93cyB0aGUgc3dpdGNoCi10aGVuIG9ubHkgZGF0YSBmb3VuZCBpbiB0aG9zZSBzcGVjaWZpYyBzZWN0aW9ucyB3aWxsIGJlIGR1bXBlZC4KLQotQGl0ZW0gLS1oaXN0b2dyYW0KLURpc3BsYXkgYSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3RocyB3aGVuIGRpc3BsYXlpbmcgdGhlIGNvbnRlbnRzCi1vZiB0aGUgc3ltYm9sIHRhYmxlcy4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGYuCi0KLUBpdGVtIC1ICi1AaXRlbXggLS1oZWxwCi1EaXNwbGF5IHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB1bmRlcnN0b29kIGJ5IEBjb2Rle3JlYWRlbGZ9LgotCi1AZW5kIHRhYmxlCi0KLQotQG5vZGUgU2VsZWN0aW5nIFRoZSBUYXJnZXQgU3lzdGVtCi1AY2hhcHRlciBTZWxlY3RpbmcgdGhlIHRhcmdldCBzeXN0ZW0KLQotWW91IGNhbiBzcGVjaWZ5IHRocmVlIGFzcGVjdHMgb2YgdGhlIHRhcmdldCBzeXN0ZW0gdG8gdGhlIEBzY3tnbnV9Ci1iaW5hcnkgZmlsZSB1dGlsaXRpZXMsIGVhY2ggaW4gc2V2ZXJhbCB3YXlzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIHRhcmdldAotCi1AaXRlbQotdGhlIGFyY2hpdGVjdHVyZQotCi1AaXRlbQotdGhlIGxpbmtlciBlbXVsYXRpb24gKHdoaWNoIGFwcGxpZXMgdG8gdGhlIGxpbmtlciBvbmx5KQotQGVuZCBpdGVtaXplCi0KLUluIHRoZSBmb2xsb3dpbmcgc3VtbWFyaWVzLCB0aGUgbGlzdHMgb2Ygd2F5cyB0byBzcGVjaWZ5IHZhbHVlcyBhcmUgaW4KLW9yZGVyIG9mIGRlY3JlYXNpbmcgcHJlY2VkZW5jZS4gIFRoZSB3YXlzIGxpc3RlZCBmaXJzdCBvdmVycmlkZSB0aG9zZQotbGlzdGVkIGxhdGVyLgotCi1UaGUgY29tbWFuZHMgdG8gbGlzdCB2YWxpZCB2YWx1ZXMgb25seSBsaXN0IHRoZSB2YWx1ZXMgZm9yIHdoaWNoIHRoZQotcHJvZ3JhbXMgeW91IGFyZSBydW5uaW5nIHdlcmUgY29uZmlndXJlZC4gIElmIHRoZXkgd2VyZSBjb25maWd1cmVkIHdpdGgKLUBzYW1wey0tZW5hYmxlLXRhcmdldHM9YWxsfSwgdGhlIGNvbW1hbmRzIGxpc3QgbW9zdCBvZiB0aGUgYXZhaWxhYmxlCi12YWx1ZXMsIGJ1dCBhIGZldyBhcmUgbGVmdCBvdXQ7IG5vdCBhbGwgdGFyZ2V0cyBjYW4gYmUgY29uZmlndXJlZCBpbiBhdAotb25jZSBiZWNhdXNlIHNvbWUgb2YgdGhlbSBjYW4gb25seSBiZSBjb25maWd1cmVkIEBkZm57bmF0aXZlfSAob24gaG9zdHMKLXdpdGggdGhlIHNhbWUgdHlwZSBhcyB0aGUgdGFyZ2V0IHN5c3RlbSkuCi0KLUBtZW51Ci0qIFRhcmdldCBTZWxlY3Rpb246OiAgICAgICAgICAgIAotKiBBcmNoaXRlY3R1cmUgU2VsZWN0aW9uOjogICAgICAKLSogTGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb246OiAgCi1AZW5kIG1lbnUKLQotQG5vZGUgVGFyZ2V0IFNlbGVjdGlvbgotQHNlY3Rpb24gVGFyZ2V0IFNlbGVjdGlvbgotCi1BIEBkZm57dGFyZ2V0fSBpcyBhbiBvYmplY3QgZmlsZSBmb3JtYXQuICBBIGdpdmVuIHRhcmdldCBtYXkgYmUKLXN1cHBvcnRlZCBmb3IgbXVsdGlwbGUgYXJjaGl0ZWN0dXJlcyAoQHB4cmVme0FyY2hpdGVjdHVyZSBTZWxlY3Rpb259KS4KLUEgdGFyZ2V0IHNlbGVjdGlvbiBtYXkgYWxzbyBoYXZlIHZhcmlhdGlvbnMgZm9yIGRpZmZlcmVudCBvcGVyYXRpbmcKLXN5c3RlbXMgb3IgYXJjaGl0ZWN0dXJlcy4KLQotVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCB0YXJnZXQgdmFsdWVzIGlzIEBzYW1we29iamR1bXAgLWl9Ci0odGhlIGZpcnN0IGNvbHVtbiBvZiBvdXRwdXQgY29udGFpbnMgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uKS4KLQotU29tZSBzYW1wbGUgdmFsdWVzIGFyZTogQHNhbXB7YS5vdXQtaHAzMDBic2R9LCBAc2FtcHtlY29mZi1saXR0bGVtaXBzfSwKLUBzYW1we2Eub3V0LXN1bm9zLWJpZ30uCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgdGFyZ2V0IHVzaW5nIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0LiAgVGhpcyBpcwotdGhlIHNhbWUgc29ydCBvZiBuYW1lIHRoYXQgaXMgcGFzc2VkIHRvIGNvbmZpZ3VyZSB0byBzcGVjaWZ5IGEgdGFyZ2V0LgotV2hlbiB5b3UgdXNlIGEgY29uZmlndXJhdGlvbiB0cmlwbGV0IGFzIGFuIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGZ1bGx5Ci1jYW5vbmljYWxpemVkLiAgWW91IGNhbiBzZWUgdGhlIGNhbm9uaWNhbCB2ZXJzaW9uIG9mIGEgdHJpcGxldCBieQotcnVubmluZyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2NvbmZpZy5zdWJ9IHdoaWNoIGlzIGluY2x1ZGVkIHdpdGggdGhlCi1zb3VyY2VzLgotCi1Tb21lIHNhbXBsZSBjb25maWd1cmF0aW9uIHRyaXBsZXRzIGFyZTogQHNhbXB7bTY4ay1ocC1ic2R9LAotQHNhbXB7bWlwcy1kZWMtdWx0cml4fSwgQHNhbXB7c3BhcmMtc3VuLXN1bm9zfS4KLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqZHVtcH0gVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb246IEBzYW1wey1ifSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbnM6IEBzYW1wey1JfSBvciBAc2FtcHstLWlucHV0LXRhcmdldH0sIG9yIEBzYW1wey1GfSBvciBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBPdXRwdXQgVGFyZ2V0Ci0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWNvbW1hbmQgbGluZSBvcHRpb25zOiBAc2FtcHstT30gb3IgQHNhbXB7LS1vdXRwdXQtdGFyZ2V0fSwgb3IgQHNhbXB7LUZ9IG9yIEBzYW1wey0tdGFyZ2V0fQotCi1AaXRlbQotdGhlIGlucHV0IHRhcmdldCAoc2VlIGBgQGNvZGV7b2JqY29weX0gYW5kIEBjb2Rle3N0cmlwfSBJbnB1dCBUYXJnZXQnJyBhYm92ZSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgQGNvZGV7bm19LCBAY29kZXtzaXplfSwgYW5kIEBjb2Rle3N0cmluZ3N9IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstLXRhcmdldH0KLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0dOVVRBUkdFVH0KLQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIElucHV0IFRhcmdldAotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstYn0gb3IgQHNhbXB7LS1mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtUQVJHRVR9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7R05VVEFSR0VUfQotKEBweHJlZntFbnZpcm9ubWVudCwsRW52aXJvbm1lbnQsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi10aGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIHNlbGVjdGVkIGxpbmtlciBlbXVsYXRpb24KLShAcHhyZWZ7TGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBUYXJnZXQKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotY29tbWFuZCBsaW5lIG9wdGlvbjogQHNhbXB7LW9mb3JtYXR9Ci0oQHB4cmVme09wdGlvbnMsLE9wdGlvbnMsbGQuaW5mbyxVc2luZyBMRH0pCi0KLUBpdGVtCi1zY3JpcHQgY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfQotKEBweHJlZntPcHRpb24gQ29tbWFuZHMsLE9wdGlvbiBDb21tYW5kcyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLXRoZSBsaW5rZXIgaW5wdXQgdGFyZ2V0IChzZWUgYGBMaW5rZXIgSW5wdXQgVGFyZ2V0JycgYWJvdmUpCi1AZW5kIGVudW1lcmF0ZQotCi1Abm9kZSBBcmNoaXRlY3R1cmUgU2VsZWN0aW9uCi1Ac2VjdGlvbiBBcmNoaXRlY3R1cmUgc2VsZWN0aW9uCi0KLUFuIEBkZm57YXJjaGl0ZWN0dXJlfSBpcyBhIHR5cGUgb2YgQHNje2NwdX0gb24gd2hpY2ggYW4gb2JqZWN0IGZpbGUgaXMKLXRvIHJ1bi4gIEl0cyBuYW1lIG1heSBjb250YWluIGEgY29sb24sIHNlcGFyYXRpbmcgdGhlIG5hbWUgb2YgdGhlCi1wcm9jZXNzb3IgZmFtaWx5IGZyb20gdGhlIG5hbWUgb2YgdGhlIHBhcnRpY3VsYXIgQHNje2NwdX0uCi0KLVRoZSBjb21tYW5kIHRvIGxpc3QgdmFsaWQgYXJjaGl0ZWN0dXJlIHZhbHVlcyBpcyBAc2FtcHtvYmpkdW1wIC1pfSAodGhlCi1zZWNvbmQgY29sdW1uIGNvbnRhaW5zIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbikuCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we202OGs6NjgwMjB9LCBAc2FtcHttaXBzOjMwMDB9LCBAc2FtcHtzcGFyY30uCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamR1bXB9IEFyY2hpdGVjdHVyZQotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0gb3IgQHNhbXB7LS1hcmNoaXRlY3R1cmV9Ci0KLUBpdGVtCi1kZWR1Y2VkIGZyb20gdGhlIGlucHV0IGZpbGUKLUBlbmQgZW51bWVyYXRlCi0KLUBzdWJoZWFkaW5nIEBjb2Rle29iamNvcHl9LCBAY29kZXtubX0sIEBjb2Rle3NpemV9LCBAY29kZXtzdHJpbmdzfSBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotZGVkdWNlZCBmcm9tIHRoZSBpbnB1dCBmaWxlCi1AZW5kIGVudW1lcmF0ZQotCi1Ac3ViaGVhZGluZyBMaW5rZXIgSW5wdXQgQXJjaGl0ZWN0dXJlCi0KLVdheXMgdG8gc3BlY2lmeToKLQotQGVudW1lcmF0ZQotQGl0ZW0KLWRlZHVjZWQgZnJvbSB0aGUgaW5wdXQgZmlsZQotQGVuZCBlbnVtZXJhdGUKLQotQHN1YmhlYWRpbmcgTGlua2VyIE91dHB1dCBBcmNoaXRlY3R1cmUKLQotV2F5cyB0byBzcGVjaWZ5OgotCi1AZW51bWVyYXRlCi1AaXRlbQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7T1VUUFVUX0FSQ0h9Ci0oQHB4cmVme09wdGlvbiBDb21tYW5kcywsT3B0aW9uIENvbW1hbmRzLGxkLmluZm8sVXNpbmcgTER9KQotCi1AaXRlbQotdGhlIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGZyb20gdGhlIGxpbmtlciBvdXRwdXQgdGFyZ2V0Ci0oQHB4cmVme1RhcmdldCBTZWxlY3Rpb259KQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgTGlua2VyIEVtdWxhdGlvbiBTZWxlY3Rpb24KLUBzZWN0aW9uIExpbmtlciBlbXVsYXRpb24gc2VsZWN0aW9uCi0KLUEgbGlua2VyIEBkZm57ZW11bGF0aW9ufSBpcyBhIGBgcGVyc29uYWxpdHknJyBvZiB0aGUgbGlua2VyLCB3aGljaCBnaXZlcwotdGhlIGxpbmtlciBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIG90aGVyIGFzcGVjdHMgb2YgdGhlIHRhcmdldCBzeXN0ZW0uCi1JbiBwYXJ0aWN1bGFyLCBpdCBjb25zaXN0cyBvZgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotdGhlIGxpbmtlciBzY3JpcHQKLQotQGl0ZW0KLXRoZSB0YXJnZXQKLQotQGl0ZW0KLXNldmVyYWwgYGBob29rJycgZnVuY3Rpb25zIHRoYXQgYXJlIHJ1biBhdCBjZXJ0YWluIHN0YWdlcyBvZiB0aGUgbGlua2luZwotcHJvY2VzcyB0byBkbyBzcGVjaWFsIHRoaW5ncyB0aGF0IHNvbWUgdGFyZ2V0cyByZXF1aXJlCi1AZW5kIGl0ZW1pemUKLQotVGhlIGNvbW1hbmQgdG8gbGlzdCB2YWxpZCBsaW5rZXIgZW11bGF0aW9uIHZhbHVlcyBpcyBAc2FtcHtsZCAtVn0uCi0KLVNhbXBsZSB2YWx1ZXM6IEBzYW1we2hwMzAwYnNkfSwgQHNhbXB7bWlwc2xpdH0sIEBzYW1we3N1bjR9LgotCi1XYXlzIHRvIHNwZWNpZnk6Ci0KLUBlbnVtZXJhdGUKLUBpdGVtCi1jb21tYW5kIGxpbmUgb3B0aW9uOiBAc2FtcHstbX0KLShAcHhyZWZ7T3B0aW9ucywsT3B0aW9ucyxsZC5pbmZvLFVzaW5nIExEfSkKLQotQGl0ZW0KLWVudmlyb25tZW50IHZhcmlhYmxlIEBjb2Rle0xERU1VTEFUSU9OfQotCi1AaXRlbQotY29tcGlsZWQtaW4gQGNvZGV7REVGQVVMVF9FTVVMQVRJT059IGZyb20gQGZpbGV7TWFrZWZpbGV9LAotd2hpY2ggY29tZXMgZnJvbSBAY29kZXtFTVVMfSBpbiBAZmlsZXtjb25maWcvQHZhcnt0YXJnZXR9Lm10fQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgUmVwb3J0aW5nIEJ1Z3MKLUBjaGFwdGVyIFJlcG9ydGluZyBCdWdzCi1AY2luZGV4IGJ1Z3MKLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MKLQotWW91ciBidWcgcmVwb3J0cyBwbGF5IGFuIGVzc2VudGlhbCByb2xlIGluIG1ha2luZyB0aGUgYmluYXJ5IHV0aWxpdGllcwotcmVsaWFibGUuCi0KLVJlcG9ydGluZyBhIGJ1ZyBtYXkgaGVscCB5b3UgYnkgYnJpbmdpbmcgYSBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0sIG9yCi1pdCBtYXkgbm90LiAgQnV0IGluIGFueSBjYXNlIHRoZSBwcmluY2lwYWwgZnVuY3Rpb24gb2YgYSBidWcgcmVwb3J0IGlzCi10byBoZWxwIHRoZSBlbnRpcmUgY29tbXVuaXR5IGJ5IG1ha2luZyB0aGUgbmV4dCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkKLXV0aWxpdGllcyB3b3JrIGJldHRlci4gIEJ1ZyByZXBvcnRzIGFyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byB0aGVpcgotbWFpbnRlbmFuY2UuCi0KLUluIG9yZGVyIGZvciBhIGJ1ZyByZXBvcnQgdG8gc2VydmUgaXRzIHB1cnBvc2UsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1pbmZvcm1hdGlvbiB0aGF0IGVuYWJsZXMgdXMgdG8gZml4IHRoZSBidWcuCi0KLUBtZW51Ci0qIEJ1ZyBDcml0ZXJpYTo6ICAgICAgICAgICAgICAgIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotKiBCdWcgUmVwb3J0aW5nOjogICAgICAgICAgICAgICBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBlbmQgbWVudQotCi1Abm9kZSBCdWcgQ3JpdGVyaWEKLUBzZWN0aW9uIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotQGNpbmRleCBidWcgY3JpdGVyaWEKLQotSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdSBoYXZlIGZvdW5kIGEgYnVnLCBoZXJlIGFyZSBzb21lIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggZmF0YWwgc2lnbmFsCi1AY2luZGV4IGNyYXNoCi1AaXRlbQotSWYgYSBiaW5hcnkgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzCi1hIGJ1Zy4gIFJlbGlhYmxlIHV0aWxpdGllcyBuZXZlciBjcmFzaC4KLQotQGNpbmRleCBlcnJvciBvbiB2YWxpZCBpbnB1dAotQGl0ZW0KLUlmIGEgYmluYXJ5IHV0aWxpdHkgcHJvZHVjZXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdmFsaWQgaW5wdXQsIHRoYXQgaXMgYQotYnVnLgotCi1AaXRlbQotSWYgeW91IGFyZSBhbiBleHBlcmllbmNlZCB1c2VyIG9mIGJpbmFyeSB1dGlsaXRpZXMsIHlvdXIgc3VnZ2VzdGlvbnMgZm9yCi1pbXByb3ZlbWVudCBhcmUgd2VsY29tZSBpbiBhbnkgY2FzZS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBCdWcgUmVwb3J0aW5nCi1Ac2VjdGlvbiBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBjaW5kZXggYnVnIHJlcG9ydHMKLUBjaW5kZXggYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIHRoZSBiaW5hcnkgdXRpbGl0aWVzIGZyb20gYSBzdXBwb3J0Ci1vcmdhbml6YXRpb24sIHdlIHJlY29tbWVuZCB5b3UgY29udGFjdCB0aGF0IG9yZ2FuaXphdGlvbiBmaXJzdC4KLQotWW91IGNhbiBmaW5kIGNvbnRhY3QgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3VwcG9ydCBjb21wYW5pZXMgYW5kCi1pbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBAZmlsZXtldGMvU0VSVklDRX0gaW4gdGhlIEBzY3tnbnV9IEVtYWNzCi1kaXN0cmlidXRpb24uCi0KLUluIGFueSBldmVudCwgd2UgYWxzbyByZWNvbW1lbmQgdGhhdCB5b3Ugc2VuZCBidWcgcmVwb3J0cyBmb3IgdGhlIGJpbmFyeQotdXRpbGl0aWVzIHRvIEBzYW1we2J1Zy1nbnUtdXRpbHNAQGdudS5vcmd9LgotCi1UaGUgZnVuZGFtZW50YWwgcHJpbmNpcGxlIG9mIHJlcG9ydGluZyBidWdzIHVzZWZ1bGx5IGlzIHRoaXM6Ci1Ac3Ryb25ne3JlcG9ydCBhbGwgdGhlIGZhY3RzfS4gIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB0byBzdGF0ZSBhCi1mYWN0IG9yIGxlYXZlIGl0IG91dCwgc3RhdGUgaXQhCi0KLU9mdGVuIHBlb3BsZSBvbWl0IGZhY3RzIGJlY2F1c2UgdGhleSB0aGluayB0aGV5IGtub3cgd2hhdCBjYXVzZXMgdGhlCi1wcm9ibGVtIGFuZCBhc3N1bWUgdGhhdCBzb21lIGRldGFpbHMgZG8gbm90IG1hdHRlci4gIFRodXMsIHlvdSBtaWdodAotYXNzdW1lIHRoYXQgdGhlIG5hbWUgb2YgYSBmaWxlIHlvdSB1c2UgaW4gYW4gZXhhbXBsZSBkb2VzIG5vdCBtYXR0ZXIuCi1XZWxsLCBwcm9iYWJseSBpdCBkb2VzIG5vdCwgYnV0IG9uZSBjYW5ub3QgYmUgc3VyZS4gIFBlcmhhcHMgdGhlIGJ1ZyBpcwotYSBzdHJheSBtZW1vcnkgcmVmZXJlbmNlIHdoaWNoIGhhcHBlbnMgdG8gZmV0Y2ggZnJvbSB0aGUgbG9jYXRpb24gd2hlcmUKLXRoYXQgcGF0aG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIHBhdGhuYW1lIHdlcmUKLWRpZmZlcmVudCwgdGhlIGNvbnRlbnRzIG9mIHRoYXQgbG9jYXRpb24gd291bGQgZm9vbCB0aGUgdXRpbGl0eSBpbnRvCi1kb2luZyB0aGUgcmlnaHQgdGhpbmcgZGVzcGl0ZSB0aGUgYnVnLiAgUGxheSBpdCBzYWZlIGFuZCBnaXZlIGEKLXNwZWNpZmljLCBjb21wbGV0ZSBleGFtcGxlLiAgVGhhdCBpcyB0aGUgZWFzaWVzdCB0aGluZyBmb3IgeW91IHRvIGRvLAotYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIHRoZSB1dGlsaXR5LiAgRWFjaCB1dGlsaXR5IGFubm91bmNlcyBpdCBpZiB5b3Ugc3RhcnQgaXQKLXdpdGggdGhlIEBzYW1wey0tdmVyc2lvbn0gYXJndW1lbnQuCi0KLVdpdGhvdXQgdGhpcywgd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHRoZXJlIGlzIGFueSBwb2ludCBpbiBsb29raW5nIGZvcgotdGhlIGJ1ZyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBiaW5hcnkgdXRpbGl0aWVzLgotCi1AaXRlbQotQW55IHBhdGNoZXMgeW91IG1heSBoYXZlIGFwcGxpZWQgdG8gdGhlIHNvdXJjZSwgaW5jbHVkaW5nIGFueSBwYXRjaGVzCi1tYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgdGhlIHV0aWxpdGllcy0tLWUuZy4KLWBgQGNvZGV7Z2NjLTIuN30nJy4KLQotQGl0ZW0KLVRoZSBjb21tYW5kIGFyZ3VtZW50cyB5b3UgZ2F2ZSB0aGUgdXRpbGl0eSB0byBvYnNlcnZlIHRoZSBidWcuICBUbwotZ3VhcmFudGVlIHlvdSB3aWxsIG5vdCBvbWl0IHNvbWV0aGluZyBpbXBvcnRhbnQsIGxpc3QgdGhlbSBhbGwuICBBIGNvcHkKLW9mIHRoZSBNYWtlZmlsZSAob3IgdGhlIG91dHB1dCBmcm9tIG1ha2UpIGlzIHN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIElmIHRoZSB1dGlsaXR5IGlzIHJlYWRpbmcgYW4gb2JqZWN0IGZpbGUgb3IgZmlsZXMsIHRoZW4gaXQgaXMKLWdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywgdXVlbmNvZGVkIGlmCi1uZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBNYWtpbmcgdGhlbSBhdmFpbGFibGUKLWZvciBhbm9ueW1vdXMgRlRQIGlzIG5vdCBhcyBnb29kLCBidXQgbWF5IGJlIHRoZSBvbmx5IHJlYXNvbmFibGUgY2hvaWNlCi1mb3IgbGFyZ2Ugb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgcHJvZHVjZWQgZXhjbHVzaXZlbHkgdXNpbmcgQHNje2dudX0gcHJvZ3JhbXMKLShlLmcuLCBAY29kZXtnY2N9LCBAY29kZXtnYXN9LCBhbmQvb3IgdGhlIEBzY3tnbnV9IEBjb2Rle2xkfSksIHRoZW4gaXQKLW1heSBiZSBPSyB0byBzZW5kIHRoZSBzb3VyY2UgZmlsZXMgcmF0aGVyIHRoYW4gdGhlIG9iamVjdCBmaWxlcy4gIEluCi10aGlzIGNhc2UsIGJlIHN1cmUgdG8gc2F5IGV4YWN0bHkgd2hhdCB2ZXJzaW9uIG9mIEBjb2Rle2djY30sIG9yCi13aGF0ZXZlciwgd2FzIHVzZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0IGZpbGVzLiAgQWxzbyBzYXkgaG93Ci1AY29kZXtnY2N9LCBvciB3aGF0ZXZlciwgd2FzIGNvbmZpZ3VyZWQuCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCB0aGUgdXRpbGl0eSBnZXRzIGEgZmF0YWwgc2lnbmFsLCB0aGVuIHdlCi13aWxsIGNlcnRhaW5seSBub3RpY2UgaXQuICBCdXQgaWYgdGhlIGJ1ZyBpcyBpbmNvcnJlY3Qgb3V0cHV0LCB3ZSBtaWdodAotbm90IG5vdGljZSB1bmxlc3MgaXQgaXMgZ2xhcmluZ2x5IHdyb25nLiAgWW91IG1pZ2h0IGFzIHdlbGwgbm90IGdpdmUgdXMKLWEgY2hhbmNlIHRvIG1ha2UgYSBtaXN0YWtlLgotCi1FdmVuIGlmIHRoZSBwcm9ibGVtIHlvdSBleHBlcmllbmNlIGlzIGEgZmF0YWwgc2lnbmFsLCB5b3Ugc2hvdWxkIHN0aWxsCi1zYXkgc28gZXhwbGljaXRseS4gIFN1cHBvc2Ugc29tZXRoaW5nIHN0cmFuZ2UgaXMgZ29pbmcgb24sIHN1Y2ggYXMsIHlvdXIKLWNvcHkgb2YgdGhlIHV0aWxpdHkgaXMgb3V0IG9mIHN5bmNoLCBvciB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGJ1ZyBpbgotdGhlIEMgbGlicmFyeSBvbiB5b3VyIHN5c3RlbS4gIChUaGlzIGhhcyBoYXBwZW5lZCEpICBZb3VyIGNvcHkgbWlnaHQKLWNyYXNoIGFuZCBvdXJzIHdvdWxkIG5vdC4gIElmIHlvdSB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdoZW4KLW91cnMgZmFpbHMgdG8gY3Jhc2gsIHdlIHdvdWxkIGtub3cgdGhhdCB0aGUgYnVnIHdhcyBub3QgaGFwcGVuaW5nIGZvcgotdXMuICBJZiB5b3UgaGFkIG5vdCB0b2xkIHVzIHRvIGV4cGVjdCBhIGNyYXNoLCB0aGVuIHdlIHdvdWxkIG5vdCBiZSBhYmxlCi10byBkcmF3IGFueSBjb25jbHVzaW9uIGZyb20gb3VyIG9ic2VydmF0aW9ucy4KLQotQGl0ZW0KLUlmIHlvdSB3aXNoIHRvIHN1Z2dlc3QgY2hhbmdlcyB0byB0aGUgc291cmNlLCBzZW5kIHVzIGNvbnRleHQgZGlmZnMsIGFzCi1nZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yIEBzYW1wey1wfQotb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLiAgSWYgeW91Ci1ldmVuIGRpc2N1c3Mgc29tZXRoaW5nIGluIHRoZSBAY29kZXtsZH0gc291cmNlLCByZWZlciB0byBpdCBieSBjb250ZXh0LAotbm90IGJ5IGxpbmUgbnVtYmVyLgotCi1UaGUgbGluZSBudW1iZXJzIGluIG91ciBkZXZlbG9wbWVudCBzb3VyY2VzIHdpbGwgbm90IG1hdGNoIHRob3NlIGluIHlvdXIKLXNvdXJjZXMuICBZb3VyIGxpbmUgbnVtYmVycyB3b3VsZCBjb252ZXkgbm8gdXNlZnVsIGluZm9ybWF0aW9uIHRvIHVzLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgYXJlIG5vdCBuZWNlc3Nhcnk6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHRoZSBlbnZlbG9wZSBvZiB0aGUgYnVnLgotCi1PZnRlbiBwZW9wbGUgd2hvIGVuY291bnRlciBhIGJ1ZyBzcGVuZCBhIGxvdCBvZiB0aW1lIGludmVzdGlnYXRpbmcKLXdoaWNoIGNoYW5nZXMgdG8gdGhlIGlucHV0IGZpbGUgd2lsbCBtYWtlIHRoZSBidWcgZ28gYXdheSBhbmQgd2hpY2gKLWNoYW5nZXMgd2lsbCBub3QgYWZmZWN0IGl0LgotCi1UaGlzIGlzIG9mdGVuIHRpbWUgY29uc3VtaW5nIGFuZCBub3QgdmVyeSB1c2VmdWwsIGJlY2F1c2UgdGhlIHdheSB3ZQotd2lsbCBmaW5kIHRoZSBidWcgaXMgYnkgcnVubmluZyBhIHNpbmdsZSBleGFtcGxlIHVuZGVyIHRoZSBkZWJ1Z2dlcgotd2l0aCBicmVha3BvaW50cywgbm90IGJ5IHB1cmUgZGVkdWN0aW9uIGZyb20gYSBzZXJpZXMgb2YgZXhhbXBsZXMuCi1XZSByZWNvbW1lbmQgdGhhdCB5b3Ugc2F2ZSB5b3VyIHRpbWUgZm9yIHNvbWV0aGluZyBlbHNlLgotCi1PZiBjb3Vyc2UsIGlmIHlvdSBjYW4gZmluZCBhIHNpbXBsZXIgZXhhbXBsZSB0byByZXBvcnQgQGVtcGh7aW5zdGVhZH0KLW9mIHRoZSBvcmlnaW5hbCBvbmUsIHRoYXQgaXMgYSBjb252ZW5pZW5jZSBmb3IgdXMuICBFcnJvcnMgaW4gdGhlCi1vdXRwdXQgd2lsbCBiZSBlYXNpZXIgdG8gc3BvdCwgcnVubmluZyB1bmRlciB0aGUgZGVidWdnZXIgd2lsbCB0YWtlCi1sZXNzIHRpbWUsIGFuZCBzbyBvbi4KLQotSG93ZXZlciwgc2ltcGxpZmljYXRpb24gaXMgbm90IHZpdGFsOyBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcywKLXJlcG9ydCB0aGUgYnVnIGFueXdheSBhbmQgc2VuZCB1cyB0aGUgZW50aXJlIHRlc3QgY2FzZSB5b3UgdXNlZC4KLQotQGl0ZW0KLUEgcGF0Y2ggZm9yIHRoZSBidWcuCi0KLUEgcGF0Y2ggZm9yIHRoZSBidWcgZG9lcyBoZWxwIHVzIGlmIGl0IGlzIGEgZ29vZCBvbmUuICBCdXQgZG8gbm90IG9taXQKLXRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHRlc3QgY2FzZSwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAotYSBwYXRjaCBpcyBhbGwgd2UgbmVlZC4gIFdlIG1pZ2h0IHNlZSBwcm9ibGVtcyB3aXRoIHlvdXIgcGF0Y2ggYW5kIGRlY2lkZQotdG8gZml4IHRoZSBwcm9ibGVtIGFub3RoZXIgd2F5LCBvciB3ZSBtaWdodCBub3QgdW5kZXJzdGFuZCBpdCBhdCBhbGwuCi0KLVNvbWV0aW1lcyB3aXRoIHByb2dyYW1zIGFzIGNvbXBsaWNhdGVkIGFzIHRoZSBiaW5hcnkgdXRpbGl0aWVzIGl0IGlzCi12ZXJ5IGhhcmQgdG8gY29uc3RydWN0IGFuIGV4YW1wbGUgdGhhdCB3aWxsIG1ha2UgdGhlIHByb2dyYW0gZm9sbG93IGEKLWNlcnRhaW4gcGF0aCB0aHJvdWdoIHRoZSBjb2RlLiAgSWYgeW91IGRvIG5vdCBzZW5kIHVzIHRoZSBleGFtcGxlLCB3ZQotd2lsbCBub3QgYmUgYWJsZSB0byBjb25zdHJ1Y3Qgb25lLCBzbyB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHZlcmlmeSB0aGF0Ci10aGUgYnVnIGlzIGZpeGVkLgotCi1BbmQgaWYgd2UgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBidWcgeW91IGFyZSB0cnlpbmcgdG8gZml4LCBvciB3aHkgeW91cgotcGF0Y2ggc2hvdWxkIGJlIGFuIGltcHJvdmVtZW50LCB3ZSB3aWxsIG5vdCBpbnN0YWxsIGl0LiAgQSB0ZXN0IGNhc2Ugd2lsbAotaGVscCB1cyB0byB1bmRlcnN0YW5kLgotCi1AaXRlbQotQSBndWVzcyBhYm91dCB3aGF0IHRoZSBidWcgaXMgb3Igd2hhdCBpdCBkZXBlbmRzIG9uLgotCi1TdWNoIGd1ZXNzZXMgYXJlIHVzdWFsbHkgd3JvbmcuICBFdmVuIHdlIGNhbm5vdCBndWVzcyByaWdodCBhYm91dCBzdWNoCi10aGluZ3Mgd2l0aG91dCBmaXJzdCB1c2luZyB0aGUgZGVidWdnZXIgdG8gZmluZCB0aGUgZmFjdHMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgSW5kZXgKLUB1bm51bWJlcmVkIEluZGV4Ci0KLUBwcmludGluZGV4IGNwCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYnVjb21tLmMgYi9iaW51dGlscy9idWNvbW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViMDA1NC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9idWNvbW0uYworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKiBidWNvbW0uYyAtLSBCaW4gVXRpbHMgQ09NbW9uIGNvZGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogV2UgbWlnaHQgcHV0IHRoaXMgaW4gYSBsaWJyYXJ5IHNvbWVkYXkgc28gaXQgY291bGQgYmUgZHluYW1pY2FsbHkKLSAgIGxvYWRlZCwgYnV0IGZvciBub3cgaXQncyBub3QgbmVjZXNzYXJ5LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDx0aW1lLmg+CQkvKiBjdGltZSwgbWF5YmUgdGltZV90ICovCi0KLSNpZm5kZWYgSEFWRV9USU1FX1RfSU5fVElNRV9ICi0jaWZuZGVmIEhBVkVfVElNRV9UX0lOX1RZUEVTX0gKLXR5cGVkZWYgbG9uZyB0aW1lX3Q7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotDAotLyogRXJyb3IgcmVwb3J0aW5nICovCi0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotdm9pZAotYmZkX25vbmZhdGFsIChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgQ09OU1QgY2hhciAqZXJybXNnID0gYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSk7Ci0KLSAgaWYgKHN0cmluZykKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cmluZywgZXJybXNnKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBlcnJtc2cpOwotfQotCi12b2lkCi1iZmRfZmF0YWwgKHN0cmluZykKLSAgICAgQ09OU1QgY2hhciAqc3RyaW5nOwotewotICBiZmRfbm9uZmF0YWwgKHN0cmluZyk7Ci0gIHhleGl0ICgxKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlcG9ydCAoZm9ybWF0LCBhcmdzKQotICAgICBjb25zdCBjaGFyICogZm9ybWF0OwotICAgICB2YV9saXN0IGFyZ3M7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICB2ZnByaW50ZiAoc3RkZXJyLCBmb3JtYXQsIGFyZ3MpOwotICBwdXRjICgnXG4nLCBzdGRlcnIpOwotfQotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi12b2lkCi1mYXRhbCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmVwb3J0IChmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLXZvaWQKLW5vbl9mYXRhbCAoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncywgZm9ybWF0KTsKLSAgcmVwb3J0IChmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotfQotI2Vsc2UKLXZvaWQgCi1mYXRhbCAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotewotICBjaGFyICpGb3JtYXQ7Ci0gIHZhX2xpc3QgYXJnczsKLQotICB2YV9zdGFydCAoYXJncyk7Ci0gIEZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSAgcmVwb3J0IChGb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoMSk7Ci19Ci0KLXZvaWQgCi1ub25fZmF0YWwgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqRm9ybWF0OwotICB2YV9saXN0IGFyZ3M7Ci0KLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBGb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNoYXIgKik7Ci0gIHJlcG9ydCAoRm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLX0KLSNlbmRpZgotCi0vKiBTZXQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCB0YXJnZXQuICBEb2luZwotICAgdGhpcyBwZXJtaXRzIHRoZSBiaW51dGlscyB0byBiZSBjb25maWd1cmVkIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0LAotICAgYW5kIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIEJGRCBsaWJyYXJ5IHdoaWNoIHdhcyBjb25maWd1cmVkIGZvciBhCi0gICBkaWZmZXJlbnQgdGFyZ2V0LiAgKi8KLQotdm9pZAotc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKQotewotICAvKiBUaGUgbWFjcm8gVEFSR0VUIGlzIGRlZmluZWQgYnkgTWFrZWZpbGUuICAqLwotICBjb25zdCBjaGFyICp0YXJnZXQgPSBUQVJHRVQ7Ci0KLSAgaWYgKCEgYmZkX3NldF9kZWZhdWx0X3RhcmdldCAodGFyZ2V0KSkKLSAgICBmYXRhbCAoXygiY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlcyIpLAotCSAgIHRhcmdldCwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotfQotCi0vKiBBZnRlciBhIGZhbHNlIHJldHVybiBmcm9tIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyB3aXRoCi0gICBiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQsIHByaW50Ci0gICB0aGUgcG9zc2libGUgbWF0Y2hpbmcgdGFyZ2V0cy4gICovCi0KLXZvaWQKLWxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAocCkKLSAgICAgY2hhciAqKnA7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IE1hdGNoaW5nIGZvcm1hdHM6IiksIHByb2dyYW1fbmFtZSk7Ci0gIHdoaWxlICgqcCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgJXMiLCAqcCsrKTsKLSAgZnB1dGMgKCdcbicsIHN0ZGVycik7Ci19Ci0KLS8qIExpc3QgdGhlIHN1cHBvcnRlZCB0YXJnZXRzLiAgKi8KLQotdm9pZAotbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAobmFtZSwgZikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgRklMRSAqZjsKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGludCB0OwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgZnByaW50ZiAoZiwgXygiU3VwcG9ydGVkIHRhcmdldHM6IikpOwotICBlbHNlCi0gICAgZnByaW50ZiAoZiwgXygiJXM6IHN1cHBvcnRlZCB0YXJnZXRzOiIpLCBuYW1lKTsKLSAgZm9yICh0ID0gMDsgYmZkX3RhcmdldF92ZWN0b3JbdF0gIT0gTlVMTDsgdCsrKQotICAgIGZwcmludGYgKGYsICIgJXMiLCBiZmRfdGFyZ2V0X3ZlY3Rvclt0XS0+bmFtZSk7Ci0gIGZwcmludGYgKGYsICJcbiIpOwotfQotDAotLyogRGlzcGxheSB0aGUgYXJjaGl2ZSBoZWFkZXIgZm9yIGFuIGVsZW1lbnQgYXMgaWYgaXQgd2VyZSBhbiBscyAtbCBsaXN0aW5nOgotCi0gICBNb2RlICAgICAgIFVzZXJcdEdyb3VwXHRTaXplXHREYXRlICAgICAgICAgICAgICAgTmFtZSAqLwotCi12b2lkCi1wcmludF9hcmVsdF9kZXNjciAoZmlsZSwgYWJmZCwgdmVyYm9zZSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHZlcmJvc2U7Ci17Ci0gIHN0cnVjdCBzdGF0IGJ1ZjsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX3N0YXRfYXJjaF9lbHQgKGFiZmQsICZidWYpID09IDApCi0JewotCSAgY2hhciBtb2RlYnVmWzExXTsKLQkgIGNoYXIgdGltZWJ1Zls0MF07Ci0JICB0aW1lX3Qgd2hlbiA9IGJ1Zi5zdF9tdGltZTsKLQkgIENPTlNUIGNoYXIgKmN0aW1lX3Jlc3VsdCA9IChDT05TVCBjaGFyICopIGN0aW1lICgmd2hlbik7Ci0KLQkgIC8qIFBPU0lYIGZvcm1hdDogIHNraXAgd2Vla2RheSBhbmQgc2Vjb25kcyBmcm9tIGN0aW1lIG91dHB1dC4gICovCi0JICBzcHJpbnRmICh0aW1lYnVmLCAiJS4xMnMgJS40cyIsIGN0aW1lX3Jlc3VsdCArIDQsIGN0aW1lX3Jlc3VsdCArIDIwKTsKLQotCSAgbW9kZV9zdHJpbmcgKGJ1Zi5zdF9tb2RlLCBtb2RlYnVmKTsKLQkgIG1vZGVidWZbMTBdID0gJ1wwJzsKLQkgIC8qIFBPU0lYIDEwMDMuMi9EMTEgc2F5cyB0byBza2lwIGZpcnN0IGNoYXJhY3RlciAoZW50cnkgdHlwZSkuICAqLwotCSAgZnByaW50ZiAoZmlsZSwgIiVzICVsZC8lbGQgJTZsZCAlcyAiLCBtb2RlYnVmICsgMSwKLQkJICAgKGxvbmcpIGJ1Zi5zdF91aWQsIChsb25nKSBidWYuc3RfZ2lkLAotCQkgICAobG9uZykgYnVmLnN0X3NpemUsIHRpbWVidWYpOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsZSwgIiVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBhIHRlbXBvcmFyeSBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBGSUxFTkFNRS4gICovCi0KLWNoYXIgKgotbWFrZV90ZW1wbmFtZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBzdGF0aWMgY2hhciB0ZW1wbGF0ZVtdID0gInN0WFhYWFhYIjsKLSAgY2hhciAqdG1wbmFtZTsKLSAgY2hhciAqc2xhc2ggPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQotI2lmIGRlZmluZWQgKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19HTzMyX18pIHx8IGRlZmluZWQgKF9XSU4zMikKLSAgaWYgKHNsYXNoID09IE5VTEwpCi0gICAgc2xhc2ggPSBzdHJyY2hyIChmaWxlbmFtZSwgJ1xcJyk7Ci0jZW5kaWYKLQotICBpZiAoc2xhc2ggIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGMgPSAqc2xhc2g7Ci0gICAgICAqc2xhc2ggPSAwOwotICAgICAgdG1wbmFtZSA9IHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpICsgc2l6ZW9mICh0ZW1wbGF0ZSkgKyAxKTsKLSAgICAgIHN0cmNweSAodG1wbmFtZSwgZmlsZW5hbWUpOwotICAgICAgc3RyY2F0ICh0bXBuYW1lLCAiLyIpOwotICAgICAgc3RyY2F0ICh0bXBuYW1lLCB0ZW1wbGF0ZSk7Ci0gICAgICBta3RlbXAgKHRtcG5hbWUpOwotICAgICAgKnNsYXNoID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB0bXBuYW1lID0geG1hbGxvYyAoc2l6ZW9mICh0ZW1wbGF0ZSkpOwotICAgICAgc3RyY3B5ICh0bXBuYW1lLCB0ZW1wbGF0ZSk7Ci0gICAgICBta3RlbXAgKHRtcG5hbWUpOwotICAgIH0KLSAgcmV0dXJuIHRtcG5hbWU7Ci19Ci0KLS8qIFBhcnNlIGEgc3RyaW5nIGludG8gYSBWTUEsIHdpdGggYSBmYXRhbCBlcnJvciBpZiBpdCBjYW4ndCBiZQotICAgcGFyc2VkLiAgKi8KLQotYmZkX3ZtYQotcGFyc2Vfdm1hIChzLCBhcmcpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKmFyZzsKLXsKLSAgYmZkX3ZtYSByZXQ7Ci0gIGNvbnN0IGNoYXIgKmVuZDsKLQotICByZXQgPSBiZmRfc2Nhbl92bWEgKHMsICZlbmQsIDApOwotICAKLSAgaWYgKCplbmQgIT0gJ1wwJykKLSAgICBmYXRhbCAoXygiJXM6IGJhZCBudW1iZXI6ICVzIiksIGFyZywgcyk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2J1Y29tbS5oIGIvYmludXRpbHMvYnVjb21tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTZhNzkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYnVjb21tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyogYnVjb21tLmggLS0gYmludXRpbHMgY29tbW9uIGluY2x1ZGUgZmlsZS4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLSNpZm5kZWYgX0JVQ09NTV9ICi0jZGVmaW5lIF9CVUNPTU1fSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZm5kZWYgZXJybm8KLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbHNlCi1leHRlcm4gY2hhciAqc3RyY2hyICgpOwotZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0ZDTlRMX0gKLSNpbmNsdWRlIDxmY250bC5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NZU19GSUxFX0gKLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NCUksKLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLWV4dGVybiBjaGFyICpzYnJrICgpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi1leHRlcm4gY2hhciAqZ2V0ZW52ICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLSNlbmRpZgotCi0jaWZuZGVmIE9fUkRPTkxZCi0jZGVmaW5lIE9fUkRPTkxZIDAKLSNlbmRpZgotCi0jaWZuZGVmIE9fUkRXUgotI2RlZmluZSBPX1JEV1IgMgotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0jaWZuZGVmIFNFRUtfQ1VSCi0jZGVmaW5lIFNFRUtfQ1VSIDEKLSNlbmRpZgotI2lmbmRlZiBTRUVLX0VORAotI2RlZmluZSBTRUVLX0VORCAyCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyB1bmRlZiBhbGxvY2EKLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZiBkZWZpbmVkKEhBVkVfQUxMT0NBX0gpICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi0jICAgaWYgIWRlZmluZWQgKF9fU1REQ19fKSAmJiAhZGVmaW5lZCAoX19ocHV4KQotY2hhciAqYWxsb2NhICgpOwotIyAgIGVsc2UKLXZvaWQgKmFsbG9jYSAoKTsKLSMgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICBlbmRpZiAvKiBhbGxvY2EgKi8KLSMgZW5kaWYgLyogSEFWRV9BTExPQ0FfSCAqLwotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLQotLyogYnVjb21tLmMgKi8KLXZvaWQgYmZkX25vbmZhdGFsIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwotCi12b2lkIGJmZF9mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKLQotdm9pZCBmYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICosIC4uLikpOwotCi12b2lkIG5vbl9mYXRhbCBQQVJBTVMgKChDT05TVCBjaGFyICosIC4uLikpOwotCi12b2lkIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgUEFSQU1TICgodm9pZCkpOwotCi12b2lkIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyBQQVJBTVMgKChjaGFyICoqcCkpOwotCi12b2lkIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBGSUxFICopKTsKLQotdm9pZCBwcmludF9hcmVsdF9kZXNjciBQQVJBTVMgKChGSUxFICpmaWxlLCBiZmQgKmFiZmQsIGJvb2xlYW4gdmVyYm9zZSkpOwotCi1jaGFyICptYWtlX3RlbXBuYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi1iZmRfdm1hIHBhcnNlX3ZtYSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBmaWxlbW9kZS5jICovCi12b2lkIG1vZGVfc3RyaW5nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbW9kZSwgY2hhciAqYnVmKSk7Ci0KLS8qIHZlcnNpb24uYyAqLwotZXh0ZXJuIHZvaWQgcHJpbnRfdmVyc2lvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogcmVuYW1lLmMgKi8KLWV4dGVybiB2b2lkIHNldF90aW1lcyBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCBzdGF0ICopKTsKLQotZXh0ZXJuIGludCBzbWFydF9yZW5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi0vKiBsaWJpYmVydHkgKi8KLVBUUiB4bWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotCi1QVFIgeHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLQotI2VuZGlmIC8qIF9CVUNPTU1fSCAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvYnVkYmcuaCBiL2JpbnV0aWxzL2J1ZGJnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZWU4ODkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvYnVkYmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIGJ1ZGJnLmMgLS0gSW50ZXJmYWNlcyB0byB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcm91dGluZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBCVURCR19ICi0jZGVmaW5lIEJVREJHX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIFJvdXRpbmUgdXNlZCB0byByZWFkIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIFBUUiByZWFkX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nKSk7Ci0KLS8qIFJvdXRpbmUgdXNlZCB0byBwcmludCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIHByaW50X2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKEZJTEUgKiwgUFRSKSk7Ci0KLS8qIFJvdXRpbmVzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgc3RhYnMgaW5mb3JtYXRpb24uICAqLwotCi1leHRlcm4gUFRSIHN0YXJ0X3N0YWIgUEFSQU1TICgoUFRSLCBiZmQgKiwgYm9vbGVhbiwgYXN5bWJvbCAqKiwgbG9uZykpOwotCi1leHRlcm4gYm9vbGVhbiBmaW5pc2hfc3RhYiBQQVJBTVMgKChQVFIsIFBUUikpOwotCi1leHRlcm4gYm9vbGVhbiBwYXJzZV9zdGFiIFBBUkFNUyAoKFBUUiwgUFRSLCBpbnQsIGludCwgYmZkX3ZtYSwgY29uc3QgY2hhciAqKSk7Ci0KLWV4dGVybiBib29sZWFuIHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGJmZF9ieXRlICoqLCBiZmRfc2l6ZV90eXBlICosIGJmZF9ieXRlICoqLAotCSAgIGJmZF9zaXplX3R5cGUgKikpOwotCi0vKiBSb3V0aW5lcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gcGFyc2VfaWVlZQotICBQQVJBTVMgKChQVFIsIGJmZCAqLCBjb25zdCBiZmRfYnl0ZSAqLCBiZmRfc2l6ZV90eXBlKSk7Ci0KLWV4dGVybiBib29sZWFuIHdyaXRlX2llZWVfZGVidWdnaW5nX2luZm8gUEFSQU1TICgoYmZkICosIFBUUikpOwotCi0vKiBSb3V0aW5lIHVzZWQgdG8gcmVhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLWV4dGVybiBib29sZWFuIHBhcnNlX2NvZmYgUEFSQU1TICgoYmZkICosIGFzeW1ib2wgKiosIGxvbmcsIFBUUikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvZmZkdW1wLmMgYi9iaW51dGlscy9jb2ZmZHVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzg0ZDUwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvZmZkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyogQ29mZiBmaWxlIGR1bXBlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBtb2R1bGUgcmVhZHMgYSB0eXBlIHRyZWUgZ2VuZXJhdGVkIGJ5IGNvZmZncm9rIGFuZCBwcmludHMKLSAgIGl0IG91dCBzbyB3ZSBjYW4gdGVzdCB0aGUgZ3Jva2tlci4KLSovCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLQotI2luY2x1ZGUgImNvZmZncm9rLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNkZWZpbmUgUFJPR1JBTV9WRVJTSU9OICIxLjAiCi0KLXN0YXRpYyBpbnQgYXRubDsKLXN0YXRpYyB2b2lkIGR1bXBfY29mZl9zY29wZSAoKTsKLQotc3RhdGljIHZvaWQKLXRhYiAoeCkKLWludCB4OwotewotICBzdGF0aWMgaW50IGluZGVudDsKLSAgaW50IGk7Ci0KLSAgaWYgKGF0bmwpCi0gICAgewotICAgICAgaWYgKHggPCAwKQotCXsKLQkgIHByaW50ZiAoIikiKTsKLQkgIGluZGVudCArPSB4OwotCi0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIlxuIik7Ci0JICBhdG5sID0gMDsKLQl9Ci0gICAgfQotCi0gIGlmICh4ID09IC0xKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLQlwcmludGYgKCIgICAiKTsKLQotICAgICAgaW5kZW50ICs9IHg7Ci0gICAgICBwcmludGYgKCIpIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluZGVudCArPSB4OwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICBwcmludGYgKCIgICAiKTsKLQotICBpZiAoeCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIoIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBubCAoKQotewotICBhdG5sID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9saW5lcyAocCkKLSAgICAgc3RydWN0IGNvZmZfbGluZSAqcDsKLXsKLSAgaW50IGk7Ci0gIGludCBvbmxpbmUgPSAwOwotICB0YWIoMSk7Ci0gIHByaW50ZihfKCIjbGluZXMgJWQgIikscC0+bmxpbmVzKTsKLSAgZm9yIChpID0gMDsgaSA8IHAtPm5saW5lczsgaSsrKSAKLSAgICB7Ci0gICAgICBwcmludGYoIiglZCAweCV4KSIsIHAtPmxpbmVzW2ldLCBwLT5hZGRyZXNzZXNbaV0pOwotICAgICAgb25saW5lKys7Ci0gICAgICBpZiAob25saW5lID4gNikKLQl7Ci0JICBubCgpOwotCSAgdGFiKDApOwotCSAgb25saW5lID0gMDsKLQl9Ci0gICAgfQotICBubCgpOwotICB0YWIoLTEpOwotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3R5cGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoInNpemUgJWQgIiwgcC0+c2l6ZSk7Ci0gIHN3aXRjaCAocC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBjb2ZmX3NlY2RlZl90eXBlOgotICAgICAgcHJpbnRmICgic2VjdGlvbiBkZWZpbml0aW9uIGF0ICV4IHNpemUgJXhcbiIsIAotCSAgICAgIHAtPnUuYXNlY2RlZi5hZGRyZXNzLAotCSAgICAgIHAtPnUuYXNlY2RlZi5zaXplKTsKLSAgICAgIG5sKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfcG9pbnRlcl90eXBlOgotICAgICAgcHJpbnRmICgicG9pbnRlciB0byIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dS5wb2ludGVyLnBvaW50c190byk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKLSAgICAgIHByaW50ZiAoImFycmF5IFslZF0gb2YiLCBwLT51LmFycmF5LmRpbSk7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl90eXBlIChwLT51LmFycmF5LmFycmF5X29mKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9mdW5jdGlvbl90eXBlOgotICAgICAgcHJpbnRmICgiZnVuY3Rpb24gcmV0dXJuaW5nIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl90eXBlIChwLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMpOwotICAgICAgZHVtcF9jb2ZmX2xpbmVzIChwLT51LmZ1bmN0aW9uLmxpbmVzKTsKLSAgICAgIHByaW50ZiAoImFyZ3VtZW50cyIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuZnVuY3Rpb24ucGFyYW1ldGVycyk7Ci0gICAgICB0YWIgKDApOwotICAgICAgcHJpbnRmICgiY29kZSIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuZnVuY3Rpb24uY29kZSk7Ci0gICAgICB0YWIoMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0ZGVmX3R5cGU6Ci0gICAgICBwcmludGYgKCJzdHJ1Y3R1cmUgZGVmaW5pdGlvbiIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnUuYXN0cnVjdGRlZi5lbGVtZW50cyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0cmVmX3R5cGU6Ci0gICAgICBpZiAoIXAtPnUuYWVudW1yZWYucmVmKQotCXByaW50ZiAoInN0cnVjdHVyZSByZWYgdG8gVU5LTk9XTiBzdHJ1Y3QiKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKCJzdHJ1Y3R1cmUgcmVmIHRvICVzIiwgcC0+dS5hZW51bXJlZi5yZWYtPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX2VudW1yZWZfdHlwZToKLSAgICAgIHByaW50ZiAoImVudW0gcmVmIHRvICVzIiwgcC0+dS5hc3RydWN0cmVmLnJlZi0+bmFtZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZW51bWRlZl90eXBlOgotICAgICAgcHJpbnRmICgiZW51bSBkZWZpbml0aW9uIik7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zY29wZSAocC0+dS5hZW51bWRlZi5lbGVtZW50cyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfYmFzaWNfdHlwZToKLSAgICAgIHN3aXRjaCAocC0+dS5iYXNpYykKLQl7Ci0JY2FzZSBUX05VTEw6Ci0JICBwcmludGYgKCJOVUxMIik7Ci0JICBicmVhazsKLQljYXNlIFRfVk9JRDoKLQkgIHByaW50ZiAoIlZPSUQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9DSEFSOgotCSAgcHJpbnRmICgiQ0hBUiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1NIT1JUOgotCSAgcHJpbnRmICgiU0hPUlQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9JTlQ6Ci0JICBwcmludGYgKCJJTlQgIik7Ci0JICBicmVhazsKLQljYXNlIFRfTE9ORzoKLQkgIHByaW50ZiAoIkxPTkciKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9GTE9BVDoKLQkgIHByaW50ZiAoIkZMT0FUIik7Ci0JICBicmVhazsKLQljYXNlIFRfRE9VQkxFOgotCSAgcHJpbnRmICgiRE9VQkxFIik7Ci0JICBicmVhazsKLQljYXNlIFRfU1RSVUNUOgotCSAgcHJpbnRmICgiU1RSVUNUIik7Ci0JICBicmVhazsKLQljYXNlIFRfVU5JT046Ci0JICBwcmludGYgKCJVTklPTiIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX0VOVU06Ci0JICBwcmludGYgKCJFTlVNIik7Ci0JICBicmVhazsKLQljYXNlIFRfTU9FOgotCSAgcHJpbnRmICgiTU9FICIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VDSEFSOgotCSAgcHJpbnRmICgiVUNIQVIiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VU0hPUlQ6Ci0JICBwcmludGYgKCJVU0hPUlQiKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9VSU5UOgotCSAgcHJpbnRmICgiVUlOVCIpOwotCSAgYnJlYWs7Ci0JY2FzZSBUX1VMT05HOgotCSAgcHJpbnRmICgiVUxPTkciKTsKLQkgIGJyZWFrOwotCWNhc2UgVF9MTkdEQkw6Ci0JICBwcmludGYgKCJMTkdEQkwiKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBubCAoKTsKLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfd2hlcmUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX3doZXJlICpwOwotewotICB0YWIgKDEpOwotICBzd2l0Y2ggKHAtPndoZXJlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RhY2s6Ci0gICAgICBwcmludGYgKCJTdGFjayBvZmZzZXQgJXgiLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbW9yeToKLSAgICAgIHByaW50ZiAoIk1lbW9yeSBzZWN0aW9uICVzKyV4IiwgcC0+c2VjdGlvbi0+bmFtZSwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9yZWdpc3RlcjoKLSAgICAgIHByaW50ZiAoIlJlZ2lzdGVyICVkIiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OgotICAgICAgcHJpbnRmICgiU3RydWN0IE1lbWJlciBvZmZzZXQgJXgiLCBwLT5vZmZzZXQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOgotICAgICAgcHJpbnRmICgiRW51bSBNZW1iZXIgb2Zmc2V0ICV4IiwgcC0+b2Zmc2V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV91bmtub3duOgotICAgICAgcHJpbnRmICgiVW5kZWZpbmVkIHN5bWJvbCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0cnRhZzoKLSAgICAgIHByaW50ZiAoIlNUUlRBRyIpOwotICAgIGNhc2UgY29mZl93aGVyZV9lbnRhZzoKLSAgICAgIHByaW50ZiAoIkVOVEFHIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfdHlwZWRlZjoKLSAgICAgIHByaW50ZiAoIlRZUEVERUYiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl92aXNpYmxlIChwKQotICAgICBzdHJ1Y3QgY29mZl92aXNpYmxlICpwOwotewotICB0YWIgKDEpOwotICBzd2l0Y2ggKHAtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2V4dF9kZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfZXh0X3JlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2V4dF9yZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfaW50X2RlZjoKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2ludF9kZWYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfY29tbW9uOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfY29tbW9uIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG86Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19hdXRvIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG9wYXJhbToKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX2F1dG9wYXJhbSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKLSAgICAgIHByaW50ZiAoImNvZmZfdmlzX3JlZ3BhcmFtIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX3JlZ2lzdGVyOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfcmVnaXN0ZXIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfdGFnOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfdGFnIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgICBwcmludGYgKCJjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9lbnVtOgotICAgICAgcHJpbnRmICgiY29mZl92aXNfbWVtYmVyX29mX2VudW0iKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5sICgpOwotICB0YWIgKC0xKTsKLX0KLQotCi12b2lkCi1kdW1wX2NvZmZfc3ltYm9sIChwKQotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnA7Ci17Ci0gIHRhYiAoMSk7Ci0gIHByaW50ZiAoIkxpc3Qgb2Ygc3ltYm9scyIpOwotICBubCAoKTsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFiICgxKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJTeW1ib2wgICVzLCB0YWcgJWQsIG51bWJlciAlZCIsIHAtPm5hbWUsIHAtPnRhZywgcC0+bnVtYmVyKTsKLSAgICAgIG5sICgpOwotICAgICAgdGFiICgtMSk7Ci0gICAgICB0YWIgKDEpOwotICAgICAgcHJpbnRmICgiVHlwZSIpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfdHlwZSAocC0+dHlwZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJXaGVyZSIpOwotICAgICAgZHVtcF9jb2ZmX3doZXJlIChwLT53aGVyZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHRhYiAoMSk7Ci0gICAgICBwcmludGYgKCJWaXNpYmxlIik7Ci0gICAgICBkdW1wX2NvZmZfdmlzaWJsZSAocC0+dmlzaWJsZSk7Ci0gICAgICB0YWIgKC0xKTsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgICAgdGFiICgtMSk7Ci0gICAgfQotICB0YWIgKC0xKTsKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfY29mZl9zY29wZSAocCkKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnA7Ci17Ci1pZiAocCkgewotICB0YWIgKDEpOwotICBwcmludGYgKCJMaXN0IG9mIGJsb2NrcyAlbHggIiwodW5zaWduZWQgbG9uZykgcCk7Ci0KLSAgaWYgKHAtPnNlYykgewotICAgIHByaW50ZiggIiAgJXMgJXguLiV4IiwgIHAtPnNlYy0+bmFtZSxwLT5vZmZzZXQsIHAtPm9mZnNldCArIHAtPnNpemUgLTEpOwotICB9Ci0gIG5sICgpOwotICB0YWIgKDApOwotICBwcmludGYgKCIqKioqKioqKioqKioqKioqKiIpOwotICBubCAoKTsKLSAgd2hpbGUgKHApCi0gICAgewotICAgICAgdGFiICgwKTsKLSAgICAgIHByaW50ZiAoInZhcnMgJWQiLCBwLT5udmFycyk7Ci0gICAgICBubCAoKTsKLSAgICAgIGR1bXBfY29mZl9zeW1ib2wgKHAtPnZhcnNfaGVhZCk7Ci0gICAgICBwcmludGYgKCJibG9ja3MiKTsKLSAgICAgIG5sICgpOwotICAgICAgZHVtcF9jb2ZmX3Njb3BlIChwLT5saXN0X2hlYWQpOwotICAgICAgbmwgKCk7Ci0gICAgICBwID0gcC0+bmV4dDsKLSAgICB9Ci0KLSAgdGFiICgwKTsKLSAgcHJpbnRmICgiKioqKioqKioqKioqKioqKioiKTsKLSAgbmwgKCk7Ci0gIHRhYiAoLTEpOwotfQotfQotCi1zdGF0aWMgdm9pZAotZHVtcF9jb2ZmX3NmaWxlIChwKQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqcDsKLXsKLSAgdGFiICgxKTsKLSAgcHJpbnRmICgiTGlzdCBvZiBzb3VyY2UgZmlsZXMiKTsKLSAgbmwgKCk7Ci0gIHdoaWxlIChwKQotICAgIHsKLSAgICAgIHRhYiAoMCk7Ci0gICAgICBwcmludGYgKCJTb3VyY2UgZmlsZSAlcyIsIHAtPm5hbWUpOwotICAgICAgbmwgKCk7Ci0gICAgICBkdW1wX2NvZmZfc2NvcGUgKHAtPnNjb3BlKTsKLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLSAgdGFiICgtMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2NvZmZfc2VjdGlvbihwdHIpCi1zdHJ1Y3QgY29mZl9zZWN0aW9uICpwdHI7Ci17Ci0gIGludCBpOwotICB0YWIoMSk7Ci0gIHByaW50Zigic2VjdGlvbiAlcyAlZCAlZCBhZGRyZXNzICV4IHNpemUgJXggbnVtYmVyICVkIG5yZWxvY3MgJWQiLCAKLQkgcHRyLT5uYW1lLCBwdHItPmNvZGUsIHB0ci0+ZGF0YSwgcHRyLT5hZGRyZXNzLHB0ci0+c2l6ZSwgcHRyLT5udW1iZXIsIHB0ci0+bnJlbG9jcyk7Ci0gIG5sKCk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHB0ci0+bnJlbG9jczsgaSsrKSAKLSAgICB7Ci0gICAgICB0YWIoMCk7ICAgIAotICAgICAgcHJpbnRmKCIoJXggJXMgJXgpIiwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLm9mZnNldCwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLnN5bWJvbC0+bmFtZSwKLQkgICAgIHB0ci0+cmVsb2NzW2ldLmFkZGVuZCk7Ci0gICAgICBubCgpOwotICAgIH0KLSAgdGFiKC0xKTsKLQotfQotCi12b2lkCi1jb2ZmX2R1bXAgKHB0cikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIHByaW50ZiAoIkNvZmYgZHVtcCIpOwotICBubCAoKTsKLSAgcHJpbnRmICgiI3NvdWNlcyAlZCIsIHB0ci0+bnNvdXJjZXMpOwotICBubCAoKTsKLSAgZHVtcF9jb2ZmX3NmaWxlIChwdHItPnNvdXJjZV9oZWFkKTsKLSAgZm9yIChpID0gMDsgaSA8IHB0ci0+bnNlY3Rpb25zOyBpKyspCi0gICAgZHVtcF9jb2ZmX3NlY3Rpb24ocHRyLT5zZWN0aW9ucyArIGkpOwotfQotCi0KLQotY2hhciAqIHByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgIlVzYWdlOiAlcyBbLWhWXSBpbi1maWxlXG4iLCAgIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogUHJpbnQgYSBodW1hbiByZWFkYWJsZSBpbnRlcnByZXRhdGlvbiBvZiBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICphdltdOwotewotICBiZmQgKmFiZmQ7Ci0gIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0gIGNoYXIgKmlucHV0X2ZpbGUgPSBOVUxMOwotICBpbnQgb3B0OwotICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci0gICAgewotICAgICAgeyAiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCcgfSwKLSAgICAgIHsgInZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnIH0sCi0gICAgICB7IE5VTEwsIG5vX2FyZ3VtZW50LCAwLCAwIH0KLSAgICB9OwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICB3aGlsZSAoKG9wdCA9IGdldG9wdF9sb25nIChhYywgYXYsICJoViIsIGxvbmdfb3B0aW9ucywKLQkJCSAgICAgKGludCAqKSBOVUxMKSkKLQkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0KQotCXsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAnVic6Ci0JICBwcmludGYgKF8oIkdOVSAlcyB2ZXJzaW9uICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBQUk9HUkFNX1ZFUlNJT04pOwotCSAgZXhpdCAoMCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgMDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgLypOT1RSRUFDSEVEKi8KLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhYykKLSAgICB7Ci0gICAgICBpbnB1dF9maWxlID0gYXZbb3B0aW5kXTsKLSAgICB9Ci0KLSAgaWYgKCFpbnB1dF9maWxlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVycixfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gIGFiZmQgPSBiZmRfb3BlbnIgKGlucHV0X2ZpbGUsIDApOwotCi0gIGlmICghYWJmZCkKLSAgICBiZmRfZmF0YWwgKGlucHV0X2ZpbGUpOwotCi0gIGlmICghIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgdHJlZSA9IGNvZmZfZ3JvayAoYWJmZCk7Ci0KLSAgY29mZl9kdW1wKHRyZWUpOwotICBwcmludGYoIlxuIik7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmdyb2suYyBiL2JpbnV0aWxzL2NvZmZncm9rLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGU2YzkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29mZmdyb2suYworKysgL2Rldi9udWxsCkBAIC0xLDczNyArMCwwIEBACi0vKiBjb2ZmZ3Jvay5jCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLQotICAgVGhpcyBtb2R1bGUgcmVhZHMgYSBjb2ZmIGZpbGUgYW5kIGJ1aWxkcyBhIHJlYWxseSBzaW1wbGUgdHlwZSB0cmVlCi0gICB3aGljaCBjYW4gYmUgcmVhZCBieSBvdGhlciBwcm9ncmFtcy4gIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiBpcyBhCi0gICBjb2ZmLT5zeXNyb2ZmIGNvbnZlcnRlci4gIEl0IGNhbiBiZSB0ZXN0ZWQgd2l0aCBjb2ZmZHVtcC5jLgotCi0qLwotCi0jaW5jbHVkZSA8YmZkLmg+Ci0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKLSNpbmNsdWRlICJjb2ZmZ3Jvay5oIgotaW50IGxvZmlsZSA9IDE7Ci1zdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKnRvcF9zY29wZTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9zY29wZSAqZmlsZV9zY29wZTsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9vZmlsZSAqb2ZpbGU7Ci0KLXN0cnVjdCBjb2ZmX3N5bWJvbCAqbGFzdF9mdW5jdGlvbl9zeW1ib2w7Ci1zdHJ1Y3QgY29mZl90eXBlICpsYXN0X2Z1bmN0aW9uX3R5cGU7Ci1zdHJ1Y3QgY29mZl90eXBlICpsYXN0X3N0cnVjdDsKLXN0cnVjdCBjb2ZmX3R5cGUgKmxhc3RfZW51bTsKLXN0cnVjdCBjb2ZmX3NmaWxlICpjdXJfc2ZpbGU7Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl9zeW1ib2wgKip0aW5kZXg7Ci0KLQotc3RhdGljIGFzeW1ib2wgKipzeW1zOwotc3RhdGljIGxvbmcgc3ltY291bnQ7Ci0KLSNkZWZpbmUgTih4KSAoKHgpLT5fbi5fbl9ucHRyWzFdKQotCi1zdGF0aWMgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcmF3c3ltczsKLXN0YXRpYyBpbnQgcmF3Y291bnQ7Ci1zdGF0aWMgYmZkICphYmZkOwotZXh0ZXJuIGNoYXIgKnhjYWxsb2MgKCk7Ci0jZGVmaW5lIFBUUl9TSVpFIAk0Ci0jZGVmaW5lIFNIT1JUX1NJWkUgCTIKLSNkZWZpbmUgSU5UX1NJWkUgCTQKLSNkZWZpbmUgTE9OR19TSVpFIAk0Ci0jZGVmaW5lIEZMT0FUX1NJWkUgCTQKLSNkZWZpbmUgRE9VQkxFX1NJWkUgCTgKLQotI2RlZmluZSBJTkRFWE9GKHApICAoKHN0cnVjdCBjb2ZmX3B0cl9zdHJ1Y3QgKikocCktKHJhd3N5bXMpKQotCi1zdGF0aWMgc3RydWN0IGNvZmZfc2NvcGUgKgotZW1wdHlfc2NvcGUgKCkKLXsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKmw7Ci0gIGwgPSAoc3RydWN0IGNvZmZfc2NvcGUgKikgKHhjYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfc2NvcGUpLCAxKSk7Ci0gIHJldHVybiBsOwotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfc3ltYm9sICoKLWVtcHR5X3N5bWJvbCAoKQotewotICByZXR1cm4gKHN0cnVjdCBjb2ZmX3N5bWJvbCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1ib2wpLCAxKSk7Ci19Ci0KLS8qaW50IGw7Ki8KLXN0YXRpYyB2b2lkCi1wdXNoX3Njb3BlIChsaW5rKQotICAgICBpbnQgbGluazsKLXsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKm4gPSBlbXB0eV9zY29wZSAoKTsKLSAgaWYgKGxpbmspCi0gICAgewotICAgICAgaWYgKHRvcF9zY29wZSkKLQl7Ci0JICBpZiAodG9wX3Njb3BlLT5saXN0X3RhaWwpCi0JICAgIHsKLQkgICAgICB0b3Bfc2NvcGUtPmxpc3RfdGFpbC0+bmV4dCA9IG47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHRvcF9zY29wZS0+bGlzdF9oZWFkID0gbjsKLQkgICAgfQotCSAgdG9wX3Njb3BlLT5saXN0X3RhaWwgPSBuOwotCX0KLSAgICB9Ci0gIG4tPnBhcmVudCA9IHRvcF9zY29wZTsKLQotICB0b3Bfc2NvcGUgPSBuOwotfQotCi1zdGF0aWMgdm9pZAotcG9wX3Njb3BlICgpCi17Ci0gIHRvcF9zY29wZSA9IHRvcF9zY29wZS0+cGFyZW50OwotfQotCi1zdGF0aWMgdm9pZAotZG9fc2VjdGlvbnNfcDEgKGhlYWQpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgaW50IGlkeDsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqYWxsID0gKHN0cnVjdCBjb2ZmX3NlY3Rpb24gKikgKHhjYWxsb2MgKGFiZmQtPnNlY3Rpb25fY291bnQgKyAxLAotCQkJCQkgICAgIHNpemVvZiAoc3RydWN0IGNvZmZfc2VjdGlvbikpKTsKLSAgaGVhZC0+bnNlY3Rpb25zID0gYWJmZC0+c2VjdGlvbl9jb3VudCArIDE7Ci0gIGhlYWQtPnNlY3Rpb25zID0gYWxsOwotCi0gIGZvciAoaWR4ID0gMCwgc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uOyBzZWN0aW9uID0gc2VjdGlvbi0+bmV4dCwgaWR4KyspCi0gICAgewotICAgICAgbG9uZyByZWxzaXplOwotICAgICAgaW50IGkgPSBzZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0gICAgICBhcmVsZW50ICoqcmVscHA7Ci0gICAgICBsb25nIHJlbGNvdW50OwotCi0gICAgICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbik7Ci0gICAgICBpZiAocmVsc2l6ZSA8IDApCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBpZiAocmVsc2l6ZSA9PSAwKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIHJlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWN0aW9uLCByZWxwcCwgc3ltcyk7Ci0gICAgICBpZiAocmVsY291bnQgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5uYW1lID0gKGNoYXIgKikgKHNlY3Rpb24tPm5hbWUpOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uY29kZSA9IHNlY3Rpb24tPmZsYWdzICYgU0VDX0NPREU7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5kYXRhID0gc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfREFUQTsKLSAgICAgIGlmIChzdHJjbXAgKHNlY3Rpb24tPm5hbWUsICIuYnNzIikgPT0gMCkKLQloZWFkLT5zZWN0aW9uc1tpXS5kYXRhID0gMTsKLSAgICAgIGhlYWQtPnNlY3Rpb25zW2ldLmFkZHJlc3MgPSBzZWN0aW9uLT5sbWE7Ci0gICAgICBoZWFkLT5zZWN0aW9uc1tpXS5zaXplID0gc2VjdGlvbi0+X3Jhd19zaXplOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubnVtYmVyID0gaWR4OwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ubnJlbG9jcyA9IHNlY3Rpb24tPnJlbG9jX2NvdW50OwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0ucmVsb2NzID0KLQkoc3RydWN0IGNvZmZfcmVsb2MgKikgKHhjYWxsb2MgKHNlY3Rpb24tPnJlbG9jX2NvdW50LAotCQkJCQlzaXplb2YgKHN0cnVjdCBjb2ZmX3JlbG9jKSkpOwotICAgICAgaGVhZC0+c2VjdGlvbnNbaV0uYmZkX3NlY3Rpb24gPSBzZWN0aW9uOwotICAgIH0KLSAgaGVhZC0+c2VjdGlvbnNbMF0ubmFtZSA9ICJBQlNPTFVURSI7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLmNvZGUgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5kYXRhID0gMDsKLSAgaGVhZC0+c2VjdGlvbnNbMF0uYWRkcmVzcyA9IDA7Ci0gIGhlYWQtPnNlY3Rpb25zWzBdLnNpemUgPSAwOwotICBoZWFkLT5zZWN0aW9uc1swXS5udW1iZXIgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotZG9fc2VjdGlvbnNfcDIgKGhlYWQpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgZm9yIChzZWN0aW9uID0gYWJmZC0+c2VjdGlvbnM7IHNlY3Rpb247IHNlY3Rpb24gPSBzZWN0aW9uLT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgc2VjdGlvbi0+cmVsb2NfY291bnQ7IGorKykKLQl7Ci0JICBpbnQgaWR4OwotCSAgaW50IGkgPSBzZWN0aW9uLT50YXJnZXRfaW5kZXg7Ci0JICBzdHJ1Y3QgY29mZl9yZWxvYyAqciA9IGhlYWQtPnNlY3Rpb25zW2ldLnJlbG9jcyArIGo7Ci0JICBhcmVsZW50ICpzciA9IHNlY3Rpb24tPnJlbG9jYXRpb24gKyBqOwotCSAgci0+b2Zmc2V0ID0gc3ItPmFkZHJlc3M7Ci0JICByLT5hZGRlbmQgPSBzci0+YWRkZW5kOwotCSAgaWR4ID0gKChjb2ZmX3N5bWJvbF90eXBlICopIChzci0+c3ltX3B0cl9wdHJbMF0pKS0+bmF0aXZlIC0gcmF3c3ltczsKLQkgIHItPnN5bWJvbCA9IHRpbmRleFtpZHhdOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY29mZl93aGVyZSAqCi1kb193aGVyZSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKnN5bSA9ICZyYXdzeW1zW2ldLnUuc3ltZW50OwotICBzdHJ1Y3QgY29mZl93aGVyZSAqd2hlcmUgPQotICAgIChzdHJ1Y3QgY29mZl93aGVyZSAqKSAoeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl93aGVyZSkpKTsKLSAgd2hlcmUtPm9mZnNldCA9IHN5bS0+bl92YWx1ZTsKLQotICBpZiAoc3ltLT5uX3NjbnVtID09IC0xKQotICAgIHN5bS0+bl9zY251bSA9IDA7Ci0KLSAgc3dpdGNoIChzeW0tPm5fc2NsYXNzKQotICAgIHsKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3Q7Ci0gICAgICB3aGVyZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlIC8gODsKLSAgICAgIHdoZXJlLT5iaXRvZmZzZXQgPSBzeW0tPm5fdmFsdWUgJSA4OwotICAgICAgd2hlcmUtPmJpdHNpemUgPSByYXdzeW1zW2kgKyAxXS51LmF1eGVudC54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19NT0U6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX01PUzoKLSAgICBjYXNlIENfTU9VOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0FVVE86Ci0gICAgY2FzZSBDX0FSRzoKLSAgICAgIHdoZXJlLT53aGVyZSA9IGNvZmZfd2hlcmVfc3RhY2s7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfRVhUOgotICAgIGNhc2UgQ19TVEFUOgotICAgIGNhc2UgQ19FWFRERUY6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9tZW1vcnk7Ci0gICAgICB3aGVyZS0+c2VjdGlvbiA9ICZvZmlsZS0+c2VjdGlvbnNbc3ltLT5uX3NjbnVtXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9lbnRhZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgICAgd2hlcmUtPndoZXJlID0gY29mZl93aGVyZV9zdHJ0YWc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB3aGVyZS0+d2hlcmUgPSBjb2ZmX3doZXJlX3R5cGVkZWY7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB3aGVyZTsKLX0KLQotc3RhdGljCi1zdHJ1Y3QgY29mZl9saW5lICoKLWRvX2xpbmVzIChpLCBuYW1lKQotICAgICBpbnQgaTsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGNvZmZfbGluZSAqcmVzID0gKHN0cnVjdCBjb2ZmX2xpbmUgKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9saW5lKSwgMSk7Ci0gIGFzZWN0aW9uICpzOwotICB1bnNpZ25lZCBpbnQgbDsKLQotICAvKiBGaW5kIG91dCBpZiB0aGlzIGZ1bmN0aW9uIGhhcyBhbnkgbGluZSBudW1iZXJzIGluIHRoZSB0YWJsZSAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgZm9yIChsID0gMDsgbCA8IHMtPmxpbmVub19jb3VudDsgbCsrKQotCXsKLQkgIGlmIChzLT5saW5lbm9bbF0ubGluZV9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChyYXdzeW1zICsgaSA9PSAoKGNvZmZfc3ltYm9sX3R5cGUgKikgKCYocy0+bGluZW5vW2xdLnUuc3ltWzBdKSkpLT5uYXRpdmUpCi0JCXsKLQkJICAvKiBUaGVzZSBsaW5lcyBhcmUgZm9yIHRoaXMgZnVuY3Rpb24gLSBzbyBjb3VudCB0aGVtIGFuZCBzdGljayB0aGVtIG9uICovCi0JCSAgaW50IGMgPSAwOwotCQkgIC8qIEZpbmQgdGhlIGxpbmVudW1iZXIgb2YgdGhlIHRvcCBvZiB0aGUgZnVuY3Rpb24sIHNpbmNlIGNvZmYgbGluZW51bWJlcnMKLQkJICAgICBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4gKi8KLQkJICBpbnQgc3RhcnRfbGluZSA9IHJhd3N5bXNbaSArIDNdLnUuYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vOwotCi0JCSAgbCsrOwotCQkgIGZvciAoYyA9IDA7IHMtPmxpbmVub1tsICsgYyArIDFdLmxpbmVfbnVtYmVyOyBjKyspCi0JCSAgICA7Ci0KLQkJICAvKiBBZGQgdHdvIGV4dHJhIHJlY29yZHMsIG9uZSBmb3IgdGhlIHByb2xvZ3VlIGFuZCBvbmUgZm9yIHRoZSBlcGlsb2d1ZSAqLwotCQkgIGMgKz0gMTsKLQkJICByZXMtPm5saW5lcyA9IGM7Ci0JCSAgcmVzLT5saW5lcyA9IChpbnQgKikgKHhjYWxsb2MgKHNpemVvZiAoaW50KSwgYykpOwotCQkgIHJlcy0+YWRkcmVzc2VzID0gKGludCAqKSAoeGNhbGxvYyAoc2l6ZW9mIChpbnQpLCBjKSk7Ci0JCSAgcmVzLT5saW5lc1swXSA9IHN0YXJ0X2xpbmU7Ci0JCSAgcmVzLT5hZGRyZXNzZXNbMF0gPSByYXdzeW1zW2ldLnUuc3ltZW50Lm5fdmFsdWUgLSBzLT52bWE7Ci0JCSAgZm9yIChjID0gMDsgcy0+bGluZW5vW2wgKyBjICsgMV0ubGluZV9udW1iZXI7IGMrKykKLQkJICAgIHsKLQkJICAgICAgcmVzLT5saW5lc1tjICsgMV0gPSBzLT5saW5lbm9bbCArIGNdLmxpbmVfbnVtYmVyICsgc3RhcnRfbGluZSAtIDE7Ci0JCSAgICAgIHJlcy0+YWRkcmVzc2VzW2MgKyAxXSA9IHMtPmxpbmVub1tsICsgY10udS5vZmZzZXQ7Ci0JCSAgICB9Ci0JCSAgcmV0dXJuIHJlczsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljCi1zdHJ1Y3QgY29mZl90eXBlICoKLWRvX3R5cGUgKGkpCi0gICAgIGludCBpOwotewotICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphdXggPSAmcmF3c3ltc1tpICsgMV0udS5hdXhlbnQ7Ci0gIHN0cnVjdCBjb2ZmX3R5cGUgKnJlcyA9Ci0gICAgKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7Ci0gIGludCB0eXBlID0gc3ltLT5uX3R5cGU7Ci0gIGludCB3aGljaF9kdCA9IDA7Ci0gIGludCBkaW1pbmQgPSAwOwotCi0gIHJlcy0+dHlwZSA9IGNvZmZfYmFzaWNfdHlwZTsKLSAgcmVzLT51LmJhc2ljID0gdHlwZSAmIDB4ZjsKLQotICBzd2l0Y2ggKHR5cGUgJiAweGYpCi0gICAgewotICAgIGNhc2UgVF9OVUxMOgotICAgIGNhc2UgVF9WT0lEOgotICAgICAgaWYgKHN5bS0+bl9udW1hdXggJiYgc3ltLT5uX3NjbGFzcyA9PSBDX1NUQVQpCi0JewotCSAgLyogVGhpcyBpcyBwcm9iYWJseSBhIHNlY3Rpb24gZGVmaW5pdGlvbiAqLwotCSAgcmVzLT50eXBlID0gY29mZl9zZWNkZWZfdHlwZTsKLQkgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zY24ueF9zY25sZW47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICh0eXBlID09IDApCi0JICAgIHsKLQkgICAgICAvKiBEb24ndCBrbm93IHdoYXQgdGhpcyBpcywgbGV0J3MgbWFrZSBpdCBhIHNpbXBsZSBpbnQgKi8KLQkgICAgICByZXMtPnNpemUgPSBJTlRfU0laRTsKLQkgICAgICByZXMtPnUuYmFzaWMgPSBUX1VJTlQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEVsc2UgaXQgY291bGQgYmUgYSBmdW5jdGlvbiBvciBwb2ludGVyIHRvIHZvaWQgKi8KLQkgICAgICByZXMtPnNpemUgPSAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUX1VDSEFSOgotICAgIGNhc2UgVF9DSEFSOgotICAgICAgcmVzLT5zaXplID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VU0hPUlQ6Ci0gICAgY2FzZSBUX1NIT1JUOgotICAgICAgcmVzLT5zaXplID0gU0hPUlRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VSU5UOgotICAgIGNhc2UgVF9JTlQ6Ci0gICAgICByZXMtPnNpemUgPSBJTlRfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9VTE9ORzoKLSAgICBjYXNlIFRfTE9ORzoKLSAgICAgIHJlcy0+c2l6ZSA9IExPTkdfU0laRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9GTE9BVDoKLSAgICAgIHJlcy0+c2l6ZSA9IEZMT0FUX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgcmVzLT5zaXplID0gRE9VQkxFX1NJWkU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfU1RSVUNUOgotICAgIGNhc2UgVF9VTklPTjoKLSAgICAgIGlmIChzeW0tPm5fbnVtYXV4KQotCXsKLQkgIGlmIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApCi0JICAgIHsKLQkgICAgICAvKiBSZWZlcmluZyB0byBhIHN0cnVjdCBkZWZpbmVkIGVsc2V3aGVyZSAqLwotCSAgICAgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0cmVmX3R5cGU7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RyZWYucmVmID0gdGluZGV4W0lOREVYT0YgKGF1eC0+eF9zeW0ueF90YWduZHgucCldOwotCSAgICAgIHJlcy0+c2l6ZSA9IHJlcy0+dS5hc3RydWN0cmVmLnJlZiA/Ci0JCXJlcy0+dS5hc3RydWN0cmVmLnJlZi0+dHlwZS0+c2l6ZSA6IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEEgZGVmaW5pdGlvbiBvZiBhIHN0cnVjdCAqLwotCSAgICAgIGxhc3Rfc3RydWN0ID0gcmVzOwotCSAgICAgIHJlcy0+dHlwZSA9IGNvZmZfc3RydWN0ZGVmX3R5cGU7Ci0JICAgICAgcmVzLT51LmFzdHJ1Y3RkZWYuZWxlbWVudHMgPSBlbXB0eV9zY29wZSAoKTsKLQkgICAgICByZXMtPnUuYXN0cnVjdGRlZi5pZHggPSAwOwotCSAgICAgIHJlcy0+dS5hc3RydWN0ZGVmLmlzc3RydWN0ID0gKHR5cGUgJiAweGYpID09IFRfU1RSVUNUOwotCSAgICAgIHJlcy0+c2l6ZSA9IGF1eC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTm8gYXV4ZW50cyAtIGl0J3MgYW5vbnlubW91cyAqLwotCSAgcmVzLT50eXBlID0gY29mZl9zdHJ1Y3RyZWZfdHlwZTsKLQkgIHJlcy0+dS5hc3RydWN0cmVmLnJlZiA9IDA7Ci0JICByZXMtPnNpemUgPSAwOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVF9FTlVNOgotICAgICAgaWYgKGF1eC0+eF9zeW0ueF90YWduZHgucCkKLQl7Ci0JICAvKiBSZWZlcmluZyB0byBhIGVudW0gZGVmaW5lZCBlbHNld2hlcmUgKi8KLQkgIHJlcy0+dHlwZSA9IGNvZmZfZW51bXJlZl90eXBlOwotCSAgcmVzLT51LmFlbnVtcmVmLnJlZiA9IHRpbmRleFtJTkRFWE9GIChhdXgtPnhfc3ltLnhfdGFnbmR4LnApXTsKLQkgIHJlcy0+c2l6ZSA9IHJlcy0+dS5hZW51bXJlZi5yZWYtPnR5cGUtPnNpemU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgZGVmaW5pdGlvbiBvZiBhbiBlbnVtICovCi0JICBsYXN0X2VudW0gPSByZXM7Ci0JICByZXMtPnR5cGUgPSBjb2ZmX2VudW1kZWZfdHlwZTsKLQkgIHJlcy0+dS5hZW51bWRlZi5lbGVtZW50cyA9IGVtcHR5X3Njb3BlICgpOwotCSAgcmVzLT5zaXplID0gYXV4LT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRfTU9FOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGZvciAod2hpY2hfZHQgPSA1OyB3aGljaF9kdCA+PSAwOyB3aGljaF9kdC0tKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKHR5cGUgPj4gKCh3aGljaF9kdCAqIDIpICsgNCkpICYgMHgzKQotCXsKLQljYXNlIDA6Ci0JICBicmVhazsKLQljYXNlIERUX0FSWToKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyID0gKChzdHJ1Y3QgY29mZl90eXBlICopCi0JCQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKSk7Ci0JICAgIGludCBlbHMgPSAoZGltaW5kIDwgRElNTlVNCi0JCSAgICAgICA/IGF1eC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbltkaW1pbmRdCi0JCSAgICAgICA6IDApOwotCSAgICArK2RpbWluZDsKLQkgICAgcHRyLT50eXBlID0gY29mZl9hcnJheV90eXBlOwotCSAgICBwdHItPnNpemUgPSBlbHMgKiByZXMtPnNpemU7Ci0JICAgIHB0ci0+dS5hcnJheS5kaW0gPSBlbHM7Ci0JICAgIHB0ci0+dS5hcnJheS5hcnJheV9vZiA9IHJlczsKLQkgICAgcmVzID0gcHRyOwotCSAgICBicmVhazsKLQkgIH0KLQljYXNlIERUX1BUUjoKLQkgIHsKLQkgICAgc3RydWN0IGNvZmZfdHlwZSAqcHRyID0KLQkgICAgICAoc3RydWN0IGNvZmZfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3R5cGUpKTsKLQkgICAgcHRyLT5zaXplID0gUFRSX1NJWkU7Ci0JICAgIHB0ci0+dHlwZSA9IGNvZmZfcG9pbnRlcl90eXBlOwotCSAgICBwdHItPnUucG9pbnRlci5wb2ludHNfdG8gPSByZXM7Ci0JICAgIHJlcyA9IHB0cjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JY2FzZSBEVF9GQ046Ci0JICB7Ci0JICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnB0cgotCSAgICAgID0gKHN0cnVjdCBjb2ZmX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl90eXBlKSk7Ci0JICAgIHB0ci0+c2l6ZSA9IDA7Ci0JICAgIHB0ci0+dHlwZSA9IGNvZmZfZnVuY3Rpb25fdHlwZTsKLQkgICAgcHRyLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMgPSByZXM7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5wYXJhbWV0ZXJzID0gZW1wdHlfc2NvcGUgKCk7Ci0JICAgIHB0ci0+dS5mdW5jdGlvbi5saW5lcyA9IGRvX2xpbmVzIChpLCBzeW0tPl9uLl9uX25wdHJbMV0pOwotCSAgICBwdHItPnUuZnVuY3Rpb24uY29kZSA9IDA7Ci0JICAgIGxhc3RfZnVuY3Rpb25fdHlwZSA9IHB0cjsKLQkgICAgcmVzID0gcHRyOwotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgc3RydWN0IGNvZmZfdmlzaWJsZSAqCi1kb192aXNpYmxlIChpKQotICAgICBpbnQgaTsKLXsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0gIHN0cnVjdCBjb2ZmX3Zpc2libGUgKnZpc2libGUgPQotICAgIChzdHJ1Y3QgY29mZl92aXNpYmxlICopICh4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3Zpc2libGUpKSk7Ci0gIGVudW0gY29mZl92aXNfdHlwZSB0OwotICBzd2l0Y2ggKHN5bS0+bl9zY2xhc3MpCi0gICAgewotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PVToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICB0ID0gY29mZl92aXNfbWVtYmVyX29mX3N0cnVjdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19NT0U6Ci0gICAgICB0ID0gY29mZl92aXNfbWVtYmVyX29mX2VudW07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgICAgdCA9IGNvZmZfdmlzX3JlZ3BhcmFtOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfUkVHOgotICAgICAgdCA9IGNvZmZfdmlzX3JlZ2lzdGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX1NUUlRBRzoKLSAgICBjYXNlIENfVU5UQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19UUERFRjoKLSAgICAgIHQgPSBjb2ZmX3Zpc190YWc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfQVVUT0FSRzoKLSAgICBjYXNlIENfQVJHOgotICAgICAgdCA9IGNvZmZfdmlzX2F1dG9wYXJhbTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ19BVVRPOgotCi0KLSAgICAgIHQgPSBjb2ZmX3Zpc19hdXRvOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgIGNhc2UgQ19TVEFUOgotICAgICAgdCA9IGNvZmZfdmlzX2ludF9kZWY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENfRVhUOgotICAgICAgaWYgKHN5bS0+bl9zY251bSA9PSBOX1VOREVGKQotCXsKLQkgIGlmIChzeW0tPm5fdmFsdWUpCi0JICAgIHQgPSBjb2ZmX3Zpc19jb21tb247Ci0JICBlbHNlCi0JICAgIHQgPSBjb2ZmX3Zpc19leHRfcmVmOwotCX0KLSAgICAgIGVsc2UKLQl0ID0gY29mZl92aXNfZXh0X2RlZjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgfQotICB2aXNpYmxlLT50eXBlID0gdDsKLSAgcmV0dXJuIHZpc2libGU7Ci19Ci0KLXN0YXRpYyBpbnQKLWRvX2RlZmluZSAoaSwgYikKLSAgICAgaW50IGk7Ci0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpiOwotewotICBzdGF0aWMgaW50IHN5bWJvbF9pbmRleDsKLSAgc3RydWN0IGludGVybmFsX3N5bWVudCAqc3ltID0gJnJhd3N5bXNbaV0udS5zeW1lbnQ7Ci0KLSAgLyogRGVmaW5lIGEgc3ltYm9sIGFuZCBhdHRhY2ggdG8gYmxvY2sgYiAqLwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnMgPSBlbXB0eV9zeW1ib2wgKCk7Ci0KLSAgcy0+bnVtYmVyID0gKytzeW1ib2xfaW5kZXg7Ci0gIHMtPm5hbWUgPSBzeW0tPl9uLl9uX25wdHJbMV07Ci0gIHMtPnNmaWxlID0gY3VyX3NmaWxlOwotICAvKiBHbHVlIG9udG8gdGhlIG9maWxlIGxpc3QgKi8KLSAgaWYgKGxvZmlsZSA+PSAwKQotICAgIHsKLSAgICAgIGlmIChvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbCkKLQlvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbC0+bmV4dF9pbl9vZmlsZV9saXN0ID0gczsKLSAgICAgIGVsc2UKLQlvZmlsZS0+c3ltYm9sX2xpc3RfaGVhZCA9IHM7Ci0gICAgICBvZmlsZS0+c3ltYm9sX2xpc3RfdGFpbCA9IHM7Ci0gICAgICAvKiBBbmQgdGhlIGJsb2NrIGxpc3QgKi8KLSAgICB9Ci0gIGlmIChiLT52YXJzX3RhaWwpCi0gICAgYi0+dmFyc190YWlsLT5uZXh0ID0gczsKLSAgZWxzZQotICAgIGItPnZhcnNfaGVhZCA9IHM7Ci0KLSAgYi0+dmFyc190YWlsID0gczsKLSAgYi0+bnZhcnMrKzsKLSAgcy0+dHlwZSA9IGRvX3R5cGUgKGkpOwotICBzLT53aGVyZSA9IGRvX3doZXJlIChpKTsKLSAgcy0+dmlzaWJsZSA9IGRvX3Zpc2libGUgKGkpOwotCi0gIHRpbmRleFtpXSA9IHM7Ci0KLSAgLyogV2UgcmVtZW1iZXIgdGhlIGxvd2VzdCBhZGRyZXNzIGluIGVhY2ggc2VjdGlvbiBmb3IgZWFjaCBzb3VyY2UgZmlsZSAqLwotCi0gIGlmIChzLT53aGVyZS0+d2hlcmUgPT0gY29mZl93aGVyZV9tZW1vcnkKLSAgICAgICYmIHMtPnR5cGUtPnR5cGUgPT0gY29mZl9zZWNkZWZfdHlwZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9pc2VjdGlvbiAqaXMgPSBjdXJfc2ZpbGUtPnNlY3Rpb24gKyBzLT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCi0gICAgICBpZiAoIWlzLT5pbml0KQotCXsKLQkgIGlzLT5sb3cgPSBzLT53aGVyZS0+b2Zmc2V0OwotCSAgaXMtPmhpZ2ggPSBzLT53aGVyZS0+b2Zmc2V0ICsgcy0+dHlwZS0+c2l6ZTsKLQkgIGlzLT5pbml0ID0gMTsKLQkgIGlzLT5wYXJlbnQgPSBzLT53aGVyZS0+c2VjdGlvbjsKLQl9Ci0KLSAgICB9Ci0KLSAgaWYgKHMtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotICAgIGxhc3RfZnVuY3Rpb25fc3ltYm9sID0gczsKLQotICByZXR1cm4gaSArIHN5bS0+bl9udW1hdXggKyAxOwotfQotCi0KLXN0YXRpYwotc3RydWN0IGNvZmZfb2ZpbGUgKgotZG9pdCAoKQotewotICBpbnQgaTsKLSAgaW50IGluZmlsZSA9IDA7Ci0gIHN0cnVjdCBjb2ZmX29maWxlICpoZWFkID0KLSAgKHN0cnVjdCBjb2ZmX29maWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGNvZmZfb2ZpbGUpKTsKLSAgb2ZpbGUgPSBoZWFkOwotICBoZWFkLT5zb3VyY2VfaGVhZCA9IDA7Ci0gIGhlYWQtPnNvdXJjZV90YWlsID0gMDsKLSAgaGVhZC0+bnNvdXJjZXMgPSAwOwotICBoZWFkLT5zeW1ib2xfbGlzdF90YWlsID0gMDsKLSAgaGVhZC0+c3ltYm9sX2xpc3RfaGVhZCA9IDA7Ci0gIGRvX3NlY3Rpb25zX3AxIChoZWFkKTsKLSAgcHVzaF9zY29wZSAoMSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJhd2NvdW50OykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50ICpzeW0gPSAmcmF3c3ltc1tpXS51LnN5bWVudDsKLSAgICAgIHN3aXRjaCAoc3ltLT5uX3NjbGFzcykKLQl7Ci0JY2FzZSBDX0ZJTEU6Ci0JICB7Ci0JICAgIC8qIG5ldyBzb3VyY2UgZmlsZSBhbm5vdW5jZWQgKi8KLQkgICAgc3RydWN0IGNvZmZfc2ZpbGUgKm4gPQotCSAgICAgIChzdHJ1Y3QgY29mZl9zZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjb2ZmX3NmaWxlKSk7Ci0JICAgIG4tPnNlY3Rpb24gPSAoc3RydWN0IGNvZmZfaXNlY3Rpb24gKikgeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9pc2VjdGlvbiksIGFiZmQtPnNlY3Rpb25fY291bnQgKyAxKTsKLQkgICAgY3VyX3NmaWxlID0gbjsKLQkgICAgbi0+bmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLQkgICAgbi0+bmV4dCA9IDA7Ci0KLQkgICAgaWYgKGluZmlsZSkKLQkgICAgICB7Ci0JCXBvcF9zY29wZSAoKTsKLQkgICAgICB9Ci0JICAgIGluZmlsZSA9IDE7Ci0JICAgIHB1c2hfc2NvcGUgKDEpOwotCSAgICBmaWxlX3Njb3BlID0gbi0+c2NvcGUgPSB0b3Bfc2NvcGU7Ci0KLQkgICAgaWYgKGhlYWQtPnNvdXJjZV90YWlsKQotCSAgICAgIGhlYWQtPnNvdXJjZV90YWlsLT5uZXh0ID0gbjsKLQkgICAgZWxzZQotCSAgICAgIGhlYWQtPnNvdXJjZV9oZWFkID0gbjsKLQkgICAgaGVhZC0+c291cmNlX3RhaWwgPSBuOwotCSAgICBoZWFkLT5uc291cmNlcysrOwotCSAgICBpICs9IHN5bS0+bl9udW1hdXggKyAxOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDX0ZDTjoKLQkgIHsKLQkgICAgY2hhciAqbmFtZSA9IHN5bS0+X24uX25fbnB0clsxXTsKLQkgICAgaWYgKG5hbWVbMV0gPT0gJ2InKQotCSAgICAgIHsKLQkJLyogRnVuY3Rpb24gc3RhcnQgKi8KLQkJcHVzaF9zY29wZSAoMCk7Ci0JCWxhc3RfZnVuY3Rpb25fdHlwZS0+dS5mdW5jdGlvbi5jb2RlID0gdG9wX3Njb3BlOwotCQl0b3Bfc2NvcGUtPnNlYyA9IG9maWxlLT5zZWN0aW9ucyArIHN5bS0+bl9zY251bTsKLQkJdG9wX3Njb3BlLT5vZmZzZXQgPSBzeW0tPm5fdmFsdWU7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl0b3Bfc2NvcGUtPnNpemUgPSBzeW0tPm5fdmFsdWUgLSB0b3Bfc2NvcGUtPm9mZnNldCArIDE7Ci0JCXBvcF9zY29wZSAoKTsKLQotCSAgICAgIH0KLQkgICAgaSArPSBzeW0tPm5fbnVtYXV4ICsgMTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBDX0JMT0NLOgotCSAgewotCSAgICBjaGFyICpuYW1lID0gc3ltLT5fbi5fbl9ucHRyWzFdOwotCSAgICBpZiAobmFtZVsxXSA9PSAnYicpCi0JICAgICAgewotCQkvKiBCbG9jayBzdGFydCAqLwotCQlwdXNoX3Njb3BlICgxKTsKLQkJdG9wX3Njb3BlLT5zZWMgPSBvZmlsZS0+c2VjdGlvbnMgKyBzeW0tPm5fc2NudW07Ci0JCXRvcF9zY29wZS0+b2Zmc2V0ID0gc3ltLT5uX3ZhbHVlOwotCi0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl0b3Bfc2NvcGUtPnNpemUgPSBzeW0tPm5fdmFsdWUgLSB0b3Bfc2NvcGUtPm9mZnNldCArIDE7Ci0JCXBvcF9zY29wZSAoKTsKLQkgICAgICB9Ci0JICAgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIENfUkVHUEFSTToKLQljYXNlIENfQVJHOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9mdW5jdGlvbl9zeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24ucGFyYW1ldGVycyk7Ci0JICBicmVhazsKLQljYXNlIENfTU9TOgotCWNhc2UgQ19NT1U6Ci0JY2FzZSBDX0ZJRUxEOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9zdHJ1Y3QtPnUuYXN0cnVjdGRlZi5lbGVtZW50cyk7Ci0JICBicmVhazsKLQljYXNlIENfTU9FOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgbGFzdF9lbnVtLT51LmFlbnVtZGVmLmVsZW1lbnRzKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19TVFJUQUc6Ci0JY2FzZSBDX0VOVEFHOgotCWNhc2UgQ19VTlRBRzoKLQkgIC8qIFZhcmlvdXMgZGVmaW5pdGlvbiAqLwotCSAgaSA9IGRvX2RlZmluZSAoaSwgdG9wX3Njb3BlKTsKLQkgIGJyZWFrOwotCWNhc2UgQ19FWFQ6Ci0JY2FzZSBDX0xBQkVMOgotCSAgaSA9IGRvX2RlZmluZSAoaSwgZmlsZV9zY29wZSk7Ci0JICBicmVhazsKLQljYXNlIENfU1RBVDoKLQljYXNlIENfVFBERUY6Ci0JY2FzZSBDX0FVVE86Ci0JY2FzZSBDX1JFRzoKLQkgIGkgPSBkb19kZWZpbmUgKGksIHRvcF9zY29wZSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JY2FzZSBDX0VPUzoKLQkgIGkgKz0gc3ltLT5uX251bWF1eCArIDE7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBkb19zZWN0aW9uc19wMiAoaGVhZCk7Ci0gIHJldHVybiBoZWFkOwotfQotCi1zdHJ1Y3QgY29mZl9vZmlsZSAqCi1jb2ZmX2dyb2sgKGluYWJmZCkKLSAgICAgYmZkICppbmFiZmQ7Ci17Ci0gIGxvbmcgc3RvcmFnZTsKLSAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gIGFiZmQgPSBpbmFiZmQ7Ci0gIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0KLSAgaWYgKHN0b3JhZ2UgPCAwKQotICAgIGJmZF9mYXRhbCAoYWJmZC0+ZmlsZW5hbWUpOwotCi0gIHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc3RvcmFnZSk7Ci0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5bXMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYWJmZC0+ZmlsZW5hbWUpOwotICByYXdzeW1zID0gb2JqX3Jhd19zeW1lbnRzIChhYmZkKTsKLSAgcmF3Y291bnQgPSBvYmpfcmF3X3N5bWVudF9jb3VudCAoYWJmZCk7OwotICB0aW5kZXggPSAoc3RydWN0IGNvZmZfc3ltYm9sICoqKSAoeGNhbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgY29mZl9zeW1ib2wgKiksIHJhd2NvdW50KSk7Ci0KLSAgcCA9IGRvaXQgKCk7Ci0gIHJldHVybiBwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29mZmdyb2suaCBiL2JpbnV0aWxzL2NvZmZncm9rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWRlNDIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY29mZmdyb2suaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0jZGVmaW5lIFRfTlVMTAkJMAotI2RlZmluZSBUX1ZPSUQJCTEJLyogZnVuY3Rpb24gYXJndW1lbnQgKG9ubHkgdXNlZCBieSBjb21waWxlcikgKi8KLSNkZWZpbmUgVF9DSEFSCQkyCS8qIGNoYXJhY3RlcgkJKi8KLSNkZWZpbmUgVF9TSE9SVAkJMwkvKiBzaG9ydCBpbnRlZ2VyCSovCi0jZGVmaW5lIFRfSU5UCQk0CS8qIGludGVnZXIJCSovCi0jZGVmaW5lIFRfTE9ORwkJNQkvKiBsb25nIGludGVnZXIJCSovCi0jZGVmaW5lIFRfRkxPQVQJCTYJLyogZmxvYXRpbmcgcG9pbnQJKi8KLSNkZWZpbmUgVF9ET1VCTEUJNwkvKiBkb3VibGUgd29yZAkJKi8KLSNkZWZpbmUgVF9TVFJVQ1QJOAkvKiBzdHJ1Y3R1cmUgCQkqLwotI2RlZmluZSBUX1VOSU9OCQk5CS8qIHVuaW9uIAkJKi8KLSNkZWZpbmUgVF9FTlVNCQkxMAkvKiBlbnVtZXJhdGlvbiAJCSovCi0jZGVmaW5lIFRfTU9FCQkxMQkvKiBtZW1iZXIgb2YgZW51bWVyYXRpb24qLwotI2RlZmluZSBUX1VDSEFSCQkxMgkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIJKi8KLSNkZWZpbmUgVF9VU0hPUlQJMTMJLyogdW5zaWduZWQgc2hvcnQJKi8KLSNkZWZpbmUgVF9VSU5UCQkxNAkvKiB1bnNpZ25lZCBpbnRlZ2VyCSovCi0jZGVmaW5lIFRfVUxPTkcJCTE1CS8qIHVuc2lnbmVkIGxvbmcJKi8KLSNkZWZpbmUgVF9MTkdEQkwJMTYJLyogbG9uZyBkb3VibGUJCSovCi0KLQotIHN0cnVjdCBjb2ZmX3JlbG9jCi0gewotICAgaW50IG9mZnNldDsKLSAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgaW50IGFkZGVuZDsKLSB9OwotCi0gc3RydWN0IGNvZmZfc2VjdGlvbiAKLSB7Ci0gICBjaGFyICpuYW1lOwotICAgaW50IGNvZGU7Ci0gICBpbnQgZGF0YTsKLSAgIGludCBhZGRyZXNzOwotICAgaW50IG51bWJlcjsgIC8qIDAuLm4sIC50ZXh0ID0gMCAqLwotICAgaW50IG5yZWxvY3M7Ci0gICBpbnQgc2l6ZTsKLSAgIHN0cnVjdCBjb2ZmX3JlbG9jICpyZWxvY3M7Ci0gICBzdHJ1Y3Qgc2VjICpiZmRfc2VjdGlvbjsKLSB9OwotCi1zdHJ1Y3QgY29mZl9vZmlsZQotewotICBpbnQgbnNvdXJjZXM7Ci0gIHN0cnVjdCBjb2ZmX3NmaWxlICpzb3VyY2VfaGVhZDsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKnNvdXJjZV90YWlsOwotICBpbnQgbnNlY3Rpb25zOwotICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uczsKLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2xfbGlzdF9oZWFkOwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbF9saXN0X3RhaWw7Ci19OwotCi1zdHJ1Y3QgY29mZl9pc2VjdGlvbiB7Ci0gIGludCBsb3c7Ci0gIGludCBoaWdoOwotICBpbnQgaW5pdDsKLSAgc3RydWN0IGNvZmZfc2VjdGlvbiAqcGFyZW50OwotfTsKLQotc3RydWN0IGNvZmZfc2ZpbGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOwotICBzdHJ1Y3QgY29mZl9zZmlsZSAqbmV4dDsKLQotICAvKiBWZWN0b3Igd2hpY2ggbWFwcyB3aGVyZSBpbiBlYWNoIG91dHB1dCBzZWN0aW9uCi0gICAgIHRoZSBpbnB1dCBmaWxlIGhhcyBpdCdzIGRhdGEgKi8KLSAgc3RydWN0IGNvZmZfaXNlY3Rpb24gKnNlY3Rpb247IAotCi19OwotCi0KLSBzdHJ1Y3QgY29mZl90eXBlCi17Ci0gIGludCBzaXplOwotICBlbnVtCi0gICAgewotICAgICAgY29mZl9wb2ludGVyX3R5cGUsIGNvZmZfZnVuY3Rpb25fdHlwZSwgY29mZl9hcnJheV90eXBlLCBjb2ZmX3N0cnVjdGRlZl90eXBlLCBjb2ZmX2Jhc2ljX3R5cGUsCi0gICAgICBjb2ZmX3N0cnVjdHJlZl90eXBlLCBjb2ZmX2VudW1yZWZfdHlwZSwgY29mZl9lbnVtZGVmX3R5cGUsIGNvZmZfc2VjZGVmX3R5cGUKLSAgICAgIH0gdHlwZTsKLSAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QgCi0JewotCWludCBhZGRyZXNzOwotCWludCBzaXplOwotICAgICAgfSBhc2VjZGVmOwotCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBpbnQgaXNzdHJ1Y3Q7Ci0JICBzdHJ1Y3QgY29mZl9zY29wZSAqZWxlbWVudHM7Ci0JICBpbnQgaWR4OwotCX0KLSAgICAgIGFzdHJ1Y3RkZWY7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnJlZjsKLQl9IGFzdHJ1Y3RyZWY7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICplbGVtZW50czsKLQkgIGludCBpZHg7Ci0JfSBhZW51bWRlZjsKLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqcmVmOwotCX0gYWVudW1yZWY7Ci0KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKnBvaW50c190bzsKLQl9IHBvaW50ZXI7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICBpbnQgZGltOwotCSAgc3RydWN0IGNvZmZfdHlwZSAqYXJyYXlfb2Y7Ci0JfSBhcnJheTsKLQotICAgICAgc3RydWN0Ci0JewotCSAgc3RydWN0IGNvZmZfdHlwZSAqZnVuY3Rpb25fcmV0dXJuczsKLQkgIHN0cnVjdCBjb2ZmX3Njb3BlICpwYXJhbWV0ZXJzOwotCSAgc3RydWN0IGNvZmZfc2NvcGUgKmNvZGU7Ci0JICBzdHJ1Y3QgY29mZl9saW5lICpsaW5lczsKLQl9IGZ1bmN0aW9uOwotICAgICAgaW50IGJhc2ljOwkJLyogT25lIG9mIFRfVk9JRC4uIFRfVUlOVCAqLwotICAgIH0gIHU7Ci19OwotCi0KLSBzdHJ1Y3QgY29mZl9saW5lIAotIHsKLSAgIGludCBubGluZXM7Ci0gICBpbnQgKmxpbmVzOwotICAgaW50ICphZGRyZXNzZXM7Ci0gfTsKLQotCi0gc3RydWN0IGNvZmZfc2NvcGUKLSAgIHsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjOyAvKiBXaGF0IHNlY3Rpb24gKi8KLSAgICAgaW50IG9mZnNldDsgLyogd2hlcmUgKi8KLSAgICAgaW50IHNpemU7IC8qIEhvdyBiaWcgKi8KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnBhcmVudDsJLyogb25lIHVwICovCi0KLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKm5leHQ7CS8qbmV4dCBhbG9uZyAqLwotCi0gICAgIGludCBudmFyczsKLQotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnNfaGVhZDsJLyogc3ltYm9scyAqLwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnNfdGFpbDsKLQotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqbGlzdF9oZWFkOwkvKiBjaGlsZHJlbiAqLwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqbGlzdF90YWlsOwotCi0gICB9OwotCi0KLSBzdHJ1Y3QgY29mZl92aXNpYmxlCi0gICB7Ci0gICAgIGVudW0gY29mZl92aXNfdHlwZQotICAgICAgIHsKLQkgY29mZl92aXNfZXh0X2RlZiwKLQkgY29mZl92aXNfZXh0X3JlZiwKLQkgY29mZl92aXNfaW50X2RlZiwKLQkgY29mZl92aXNfY29tbW9uLAotCSBjb2ZmX3Zpc19hdXRvLAotCSBjb2ZmX3Zpc19yZWdpc3RlciwKLQkgY29mZl92aXNfdGFnLAotCSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0LAotCSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bSwKLQkgY29mZl92aXNfYXV0b3BhcmFtLAkKLQkgY29mZl92aXNfcmVncGFyYW0sCi0gICAgICAgfSB0eXBlOwotICAgfTsKLQotIHN0cnVjdCBjb2ZmX3doZXJlCi0gICB7Ci0gICAgIGVudW0KLSAgICAgICB7Ci0JIGNvZmZfd2hlcmVfc3RhY2ssIGNvZmZfd2hlcmVfbWVtb3J5LCBjb2ZmX3doZXJlX3JlZ2lzdGVyLCBjb2ZmX3doZXJlX3Vua25vd24sCi0JIGNvZmZfd2hlcmVfc3RydGFnLCBjb2ZmX3doZXJlX21lbWJlcl9vZl9zdHJ1Y3QsCi0JIGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW0sIGNvZmZfd2hlcmVfZW50YWcsIGNvZmZfd2hlcmVfdHlwZWRlZgotCi0gICAgICAgfSB3aGVyZTsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGJpdG9mZnNldDsKLSAgICAgaW50IGJpdHNpemU7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICB9OwotCi0gc3RydWN0IGNvZmZfc3ltYm9sCi0gICB7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGludCB0YWc7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGUgKnR5cGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3doZXJlICp3aGVyZTsKLSAgICAgc3RydWN0IGNvZmZfdmlzaWJsZSAqdmlzaWJsZTsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpuZXh0OwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKm5leHRfaW5fb2ZpbGVfbGlzdDsgLyogRm9yIHRoZSBvZmlsZSBsaXN0ICovCi0gICAgIGludCBudW1iZXI7Ci0gICAgIGludCBlcl9udW1iZXI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgfTsKLQotc3RydWN0IGNvZmZfb2ZpbGUgKmNvZmZfZ3JvaygpOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvY29uZmlnLmluIGIvYmludXRpbHMvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI2YzVjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxzeXMvd2FpdC5oPiB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfV0FJVF9ICi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgaWYgbGV4IGRlY2xhcmVzIHl5dGV4dCBhcyBhIGNoYXIgKiBieSBkZWZhdWx0LCBub3QgYSBjaGFyW10uICAqLwotI3VuZGVmIFlZVEVYVF9QT0lOVEVSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TQlJLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHV0aW1lcyBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9VVElNRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfRkNOVExfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERMSUJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0ZJTEVfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEb2VzIHRoZSBwbGF0Zm9ybSB1c2UgYW4gZXhlY3V0YWJsZSBzdWZmaXg/ICovCi0jdW5kZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotCi0vKiBTdWZmaXggdXNlZCBmb3IgZXhlY3V0YWJsZXMsIGlmIGFueS4gKi8KLSN1bmRlZiBFWEVDVVRBQkxFX1NVRkZJWAotCi0vKiBJcyB0aGUgdHlwZSB0aW1lX3QgZGVmaW5lZCBpbiA8dGltZS5oPj8gKi8KLSN1bmRlZiBIQVZFX1RJTUVfVF9JTl9USU1FX0gKLQotLyogSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPj8gKi8KLSN1bmRlZiBIQVZFX1RJTUVfVF9JTl9UWVBFU19ICi0KLS8qIERvZXMgPHV0aW1lLmg+IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1Zj8gKi8KLSN1bmRlZiBIQVZFX0dPT0RfVVRJTUVfSAotCi0vKiBEZWZpbmUgaWYgZnByaW50ZiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZQUklOVEYKLQotLyogRGVmaW5lIGlmIHN0cnN0ciBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotCi0vKiBEZWZpbmUgaWYgZW52aXJvbiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLQotLyogVXNlIGIgbW9kaWZpZXIgd2hlbiBvcGVuaW5nIGJpbmFyeSBmaWxlcz8gKi8KLSN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOCi0KLS8qIENvbmZpZ3VyZWQgdGFyZ2V0IG5hbWUuICovCi0jdW5kZWYgVEFSR0VUCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZSBiL2JpbnV0aWxzL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDkxNTgyYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw1NjYxICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTMgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zaGFyZWRbPVBLR1NdICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zaXRlZmlsZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS1zaXRlLWZpbGU9RklMRSAgICAgICAgdXNlIEZJTEUgYXMgdGhlIHNpdGUgZmlsZQotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWwgfCAtLXNpdGUtZmkgfCAtLXNpdGUtZikKLSAgICBhY19wcmV2PXNpdGVmaWxlIDs7Ci0gIC1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsPSogfCAtLXNpdGUtZmk9KiB8IC0tc2l0ZS1mPSopCi0gICAgc2l0ZWZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIgotICAgIGV4aXQgMCA7OwotCi0gIC13aXRoLSogfCAtLXdpdGgtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aC0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGhvdXQtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfcGFja2FnZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX3BhY2thZ2U6IGludmFsaWQgcGFja2FnZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAid2l0aF8ke2FjX3BhY2thZ2V9PW5vIiA7OwotCi0gIC0teCkKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLXguCi0gICAgd2l0aF94PXllcyA7OwotCi0gIC14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGVzIHwgLS14LWluY2x1ZGUgfCAtLXgtaW5jbHVkIHwgLS14LWluY2x1IFwKLSAgfCAtLXgtaW5jbCB8IC0teC1pbmMgfCAtLXgtaW4gfCAtLXgtaSkKLSAgICBhY19wcmV2PXhfaW5jbHVkZXMgOzsKLSAgLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGU9KiB8IC0teC1pbmNsdWQ9KiB8IC0teC1pbmNsdT0qIFwKLSAgfCAtLXgtaW5jbD0qIHwgLS14LWluYz0qIHwgLS14LWluPSogfCAtLXgtaT0qKQotICAgIHhfaW5jbHVkZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKLSAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCi0gICAgYWNfcHJldj14X2xpYnJhcmllcyA7OwotICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCi0gIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQotICAgIHhfbGlicmFyaWVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19vcHRpb246IGludmFsaWQgb3B0aW9uOyB1c2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UiIDE+JjI7IGV4aXQgMTsgfQotICAgIDs7Ci0KLSAgKikKLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfb3B0aW9ufCBzZWQgJ3MvWy1hLXowLTkuXS8vZydgIjsgdGhlbgotICAgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiAkYWNfb3B0aW9uOiBpbnZhbGlkIGhvc3QgdHlwZSIgMT4mMgotICAgIGZpCi0gICAgaWYgdGVzdCAieCRub25vcHQiICE9IHhOT05FOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIG5vbm9wdD0iJGFjX29wdGlvbiIKLSAgICA7OwotCi0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbWlzc2luZyBhcmd1bWVudCB0byAtLWBlY2hvICRhY19wcmV2IHwgc2VkICdzL18vLS9nJ2AiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotIyBGaWxlIGRlc2NyaXB0b3IgdXNhZ2U6Ci0jIDAgc3RhbmRhcmQgaW5wdXQKLSMgMSBmaWxlIGNyZWF0aW9uCi0jIDIgZXJyb3JzIGFuZCB3YXJuaW5ncwotIyAzIHNvbWUgc3lzdGVtcyBtYXkgb3BlbiBpdCB0byAvZGV2L3R0eQotIyA0IHVzZWQgb24gdGhlIEt1Ym90YSBUaXRhbgotIyA2IGNoZWNraW5nIGZvci4uLiBtZXNzYWdlcyBhbmQgcmVzdWx0cwotIyA1IGNvbXBpbGVyIG1lc3NhZ2VzIHNhdmVkIGluIGNvbmZpZy5sb2cKLWlmIHRlc3QgIiRzaWxlbnQiID0geWVzOyB0aGVuCi0gIGV4ZWMgNj4vZGV2L251bGwKLWVsc2UKLSAgZXhlYyA2PiYxCi1maQotZXhlYyA1Pi4vY29uZmlnLmxvZwotCi1lY2hvICJcCi1UaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQotcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KLSIgMT4mNQotCi0jIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KLSMgQWxzbyBxdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotYWNfY29uZmlndXJlX2FyZ3M9Ci1mb3IgYWNfYXJnCi1kbwotICBjYXNlICIkYWNfYXJnIiBpbgotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpIDs7Ci0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikgOzsKLSAgKiIgIip8KiIJIip8KltcW1xdXH5cI1wkXF5cJlwqXChcKVx7XH1cXFx8XDtcPFw+XD9dKikKLSAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAnJGFjX2FyZyciIDs7Ci0gICopIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJGFjX2FyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIE5MUyBudWlzYW5jZXMuCi0jIE9ubHkgc2V0IHRoZXNlIHRvIEMgaWYgYWxyZWFkeSBzZXQuICBUaGVzZSBtdXN0IG5vdCBiZSBzZXQgdW5jb25kaXRpb25hbGx5Ci0jIGJlY2F1c2Ugbm90IGFsbCBzeXN0ZW1zIHVuZGVyc3RhbmQgZS5nLiBMQU5HPUMgKG5vdGFibHkgU0NPKS4KLSMgRml4aW5nIExDX01FU1NBR0VTIHByZXZlbnRzIFNvbGFyaXMgc2ggZnJvbSB0cmFuc2xhdGluZyB2YXIgdmFsdWVzIGluIGBzZXQnIQotIyBOb24tQyBMQ19DVFlQRSB2YWx1ZXMgYnJlYWsgdGhlIGN0eXBlIGNoZWNrLgotaWYgdGVzdCAiJHtMQU5HK3NldH0iICAgPSBzZXQ7IHRoZW4gTEFORz1DOyAgIGV4cG9ydCBMQU5HOyAgIGZpCi1pZiB0ZXN0ICIke0xDX0FMTCtzZXR9IiA9IHNldDsgdGhlbiBMQ19BTEw9QzsgZXhwb3J0IExDX0FMTDsgZmkKLWlmIHRlc3QgIiR7TENfTUVTU0FHRVMrc2V0fSIgPSBzZXQ7IHRoZW4gTENfTUVTU0FHRVM9QzsgZXhwb3J0IExDX01FU1NBR0VTOyBmaQotaWYgdGVzdCAiJHtMQ19DVFlQRStzZXR9IiAgICA9IHNldDsgdGhlbiBMQ19DVFlQRT1DOyAgICBleHBvcnQgTENfQ1RZUEU7ICAgIGZpCi0KLSMgY29uZmRlZnMuaCBhdm9pZHMgT1MgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgdGhhdCBERUZTIGNhbiBleGNlZWQuCi1ybSAtcmYgY29uZnRlc3QqIGNvbmZkZWZzLmgKLSMgQUlYIGNwcCBsb3NlcyBvbiBhbiBlbXB0eSBmaWxlLCBzbyBtYWtlIHN1cmUgaXQgY29udGFpbnMgYXQgbGVhc3QgYSBuZXdsaW5lLgotZWNobyA+IGNvbmZkZWZzLmgKLQotIyBBIGZpbGVuYW1lIHVuaXF1ZSB0byB0aGlzIHBhY2thZ2UsIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgdGhhdAotIyBjb25maWd1cmUgaXMgaW4sIHdoaWNoIHdlIGNhbiBsb29rIGZvciB0byBmaW5kIG91dCBpZiBzcmNkaXIgaXMgY29ycmVjdC4KLWFjX3VuaXF1ZV9maWxlPWFyLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRzaXRlZmlsZSI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICAgIGlmIHRlc3QgIngkcHJlZml4IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZWxzZQotICAgICAgQ09ORklHX1NJVEU9IiRhY19kZWZhdWx0X3ByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkYWNfZGVmYXVsdF9wcmVmaXgvZXRjL2NvbmZpZy5zaXRlIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIENPTkZJR19TSVRFPSIkc2l0ZWZpbGUiCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjA1OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYyNjogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQ0OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3OTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MzI6IGNoZWNraW5nIHdoZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZSIgPiY1Ci0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIiQqIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiJCoiICE9ICJYICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSIgXAotICAgICAgJiYgdGVzdCAiJCoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50IiAxPiYyOyBleGl0IDE7IH0KLSAgIGZpCi0KLSAgIHRlc3QgIiQyIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9jayIgMT4mMjsgZXhpdCAxOyB9Ci1maQotcm0gLWYgY29uZnRlc3QqCi1lY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1pZiB0ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBzLHgseCw7IHRoZW4KLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0KLWVsc2UKLSAgIyBEb3VibGUgYW55IFwgb3IgJC4gIGVjaG8gbWlnaHQgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotICBjYXQgPDxcRU9GX1NFRCA+IGNvbmZ0ZXN0c2VkCi1zLFxcLFxcXFwsZzsgcyxcJCwkJCxnCi1FT0ZfU0VECi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9ImBlY2hvICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfHNlZCAtZiBjb25mdGVzdHNlZGAiCi0gIHJtIC1mIGNvbmZ0ZXN0c2VkCi1maQotdGVzdCAiJHByb2dyYW1fcHJlZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXiwke3Byb2dyYW1fcHJlZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotIyBVc2UgYSBkb3VibGUgJCBzbyBtYWtlIGlnbm9yZXMgaXQuCi10ZXN0ICIkcHJvZ3JhbV9zdWZmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxcJFwkLCR7cHJvZ3JhbV9zdWZmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0KLSMgc2VkIHdpdGggbm8gZmlsZSBhcmdzIHJlcXVpcmVzIGEgcHJvZ3JhbS4KLXRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9ICIiICYmIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMseCx4LCIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzg5OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1iaW51dGlscwotCi1WRVJTSU9OPTIuOS40Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODM1OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NjE6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODg3OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTczOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDAzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDMzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExNjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTEyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE1ODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjM6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5MTogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzQ6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI1ODogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjYxOiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5NzogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxMzogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNTE6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTQ6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTg6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1lY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUxNjogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyNTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTI4OiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2Ci1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NTQ6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE1OTYgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYxODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfY2NfbmVlZHNfYmVsZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MjMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MzA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjUzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIERMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzIwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgbmVlZF9sb2Nrcz0kZW5hYmxldmFsCi1lbHNlCi0gIG5lZWRfbG9ja3M9eWVzCi1maQotCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi0KLQotCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1pZiB0ZXN0IC16ICIkaG9zdCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkxNzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk0NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDIwNDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDQ2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzI6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDc3OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDg2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDU6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLQotZm9yIGFjX3Byb2cgaW4gJ2Jpc29uIC15JyBieWFjYwotZG8KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNDI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ZQUNDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfWUFDQz0iJFlBQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1lBQ0M9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ZQUNDPSIkYWNfY3ZfcHJvZ19ZQUNDIgotaWYgdGVzdCAtbiAiJFlBQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWUFDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLXRlc3QgLW4gIiRZQUNDIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJFlBQ0MiIHx8IFlBQ0M9InlhY2MiCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTczOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIxOTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMjIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIyMjg6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotbWlzc2luZ19kaXI9YGNkICRhY19hdXhfZGlyICYmIHB3ZGAKLWZvciBhY19wcm9nIGluIGZsZXggbGV4Ci1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI1ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9IiRhY19wcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJExFWCIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRMRVgiIHx8IExFWD0iIiRtaXNzaW5nX2Rpci9taXNzaW5nIGZsZXgiIgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImZsZXgiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGZsZXg7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI5MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGFjX2N2X3Byb2dfTEVYPSIkTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19MRVg9ImZsZXgiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0xFWCIgJiYgYWNfY3ZfcHJvZ19MRVg9ImxleCIKLWZpCi1maQotTEVYPSIkYWNfY3ZfcHJvZ19MRVgiCi1pZiB0ZXN0IC1uICIkTEVYIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExFWCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRMRVhMSUIiCi10aGVuCi0gIGNhc2UgIiRMRVgiIGluCi0gIGZsZXgqKSBhY19saWI9ZmwgOzsKLSAgKikgYWNfbGliPWwgOzsKLSAgZXNhYwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMyNTogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQotYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbCRhY19saWIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHl5d3JhcCgpOwotCi1pbnQgbWFpbigpIHsKLXl5d3JhcCgpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjM0NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTEVYTElCPSItbCRhY19saWIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjc6IGNoZWNraW5nIGxleCBvdXRwdXQgZmlsZSByb290IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2xleF9yb290JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGUgbWluaW1hbCBsZXggcHJvZ3JhbSBpcyBqdXN0IGEgc2luZ2xlIGxpbmU6ICUlLiAgQnV0IHNvbWUgYnJva2VuIGxleGVzCi0jIChTb2xhcmlzLCBJIHRoaW5rIGl0IHdhcykgd2FudCB0d28gJSUgbGluZXMsIHNvIGFjY29tbW9kYXRlIHRoZW0uCi1lY2hvICclJQotJSUnIHwgJExFWAotaWYgdGVzdCAtZiBsZXgueXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleC55eQotZWxpZiB0ZXN0IC1mIGxleHl5LmM7IHRoZW4KLSAgYWNfY3ZfcHJvZ19sZXhfcm9vdD1sZXh5eQotZWxzZQotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbm5vdCBmaW5kIG91dHB1dCBmcm9tICRMRVg7IGdpdmluZyB1cCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF9yb290IiAxPiY2Ci1MRVhfT1VUUFVUX1JPT1Q9JGFjX2N2X3Byb2dfbGV4X3Jvb3QKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB5eXRleHQgaXMgYSBwb2ludGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzg4OiBjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBQT1NJWCBzYXlzIGxleCBjYW4gZGVjbGFyZSB5eXRleHQgZWl0aGVyIGFzIGEgcG9pbnRlciBvciBhbiBhcnJheTsgdGhlCi0jIGRlZmF1bHQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBGaWd1cmUgb3V0IHdoaWNoIGl0IGlzLCBzaW5jZQotIyBub3QgYWxsIGltcGxlbWVudGF0aW9ucyBwcm92aWRlIHRoZSAlcG9pbnRlciBhbmQgJWFycmF5IGRlY2xhcmF0aW9ucy4KLWFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyPW5vCi1lY2hvICdleHRlcm4gY2hhciAqeXl0ZXh0OycgPj4kTEVYX09VVFBVVF9ST09ULmMKLWFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSIkTElCUyAkTEVYTElCIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1gY2F0ICRMRVhfT1VUUFVUX1JPT1QuY2AKLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLXJtIC1mICIke0xFWF9PVVRQVVRfUk9PVH0uYyIKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXIgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFlZVEVYVF9QT0lOVEVSIDEKLUVPRgotCi1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MzE6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NTI6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ4MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTU2OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYxMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjMxOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjQ1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY3MTogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY3NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzA0OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3Mzk6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzQ0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3NTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzcyOiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NzcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Mzc6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg2NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MjI6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NDk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk3NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI5NzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI5ODQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAxMzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzAxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDQxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDY2OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDc0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjE0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI0MjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNDcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMyNTI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjgyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMzk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNDQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDAxOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDEzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQzNDogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDU0OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NzM6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ4MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MDA6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUxMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTI4OiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUzNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1NjM6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1NzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjAzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjM3OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzI4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3NjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODAwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzgzNDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NjA6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5ODg6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzk5ODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDYxOiBjaGVja2luZyB3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlcyIgPiY1Ci0gICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvciAtLWRpc2FibGUtbWFpbnRhaW5lci1tb2RlIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX21haW50YWluZXJfbW9kZStzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbWFpbnRhaW5lcl9tb2RlIgotICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX01BSU5UQUlORVJfTU9ERT1ubwotZmkKLQotICBlY2hvICIkYWNfdCIiJFVTRV9NQUlOVEFJTkVSX01PREUiIDE+JjYKLSAgCi0KLWlmIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXM7IHRoZW4KLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9Ci0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0nIycKLWVsc2UKLSAgTUFJTlRBSU5FUl9NT0RFX1RSVUU9JyMnCi0gIE1BSU5UQUlORVJfTU9ERV9GQUxTRT0KLWZpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA4NDogY2hlY2tpbmcgZm9yIEN5Z3dpbiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY3lnd2luJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDA4OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0jaWZuZGVmIF9fQ1lHV0lOX18KLSNkZWZpbmUgX19DWUdXSU5fXyBfX0NZR1dJTjMyX18KLSNlbmRpZgotcmV0dXJuIF9fQ1lHV0lOX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDEwMDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2N5Z3dpbj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY3lnd2luIiAxPiY2Ci1DWUdXSU49Ci10ZXN0ICIkYWNfY3ZfY3lnd2luIiA9IHllcyAmJiBDWUdXSU49eWVzCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDExNzogY2hlY2tpbmcgZm9yIG1pbmd3MzIgZW52aXJvbm1lbnQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X21pbmd3MzInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gX19NSU5HVzMyX187Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDEyOTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X21pbmd3MzI9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9taW5ndzMyIiAxPiY2Ci1NSU5HVzMyPQotdGVzdCAiJGFjX2N2X21pbmd3MzIiID0geWVzICYmIE1JTkdXMzI9eWVzCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGV4ZWN1dGFibGUgc3VmZml4IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTQ4OiBjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRDWUdXSU4iID0geWVzIHx8IHRlc3QgIiRNSU5HVzMyIiA9IHllczsgdGhlbgotICBhY19jdl9leGVleHQ9LmV4ZQotZWxzZQotICBybSAtZiBjb25mdGVzdCoKLSAgZWNobyAnaW50IG1haW4gKCkgeyByZXR1cm4gMDsgfScgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGFjX2N2X2V4ZWV4dD0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTU4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9OyB0aGVuCi0gICAgZm9yIGZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICAgIGNhc2UgJGZpbGUgaW4KLSAgICAgICouYyB8ICoubyB8ICoub2JqIHwgKi5pbGsgfCAqLnBkYikgOzsKLSAgICAgICopIGFjX2N2X2V4ZWV4dD1gZWNobyAkZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Ly9gIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGZpCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICB0ZXN0IHgiJHthY19jdl9leGVleHR9IiA9IHggJiYgYWNfY3ZfZXhlZXh0PW5vCi1maQotZmkKLQotRVhFRVhUPSIiCi10ZXN0IHgiJHthY19jdl9leGVleHR9IiAhPSB4bm8gJiYgRVhFRVhUPSR7YWNfY3ZfZXhlZXh0fQotZWNobyAiJGFjX3QiIiR7YWNfY3ZfZXhlZXh0fSIgMT4mNgotYWNfZXhlZXh0PSRFWEVFWFQKLQotaWYgdGVzdCAtbiAiJEVYRUVYVCI7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVggMQotRU9GCi0KLWZpCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBFWEVDVVRBQkxFX1NVRkZJWCAiJHtFWEVFWFR9IgotRU9GCi0KLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi1IREVGSU5FUz0KLQotLiAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLQotQVI9JHtBUi1hcn0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjAxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MjQwOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi0KLSMgUHV0IGEgcGxhdXNpYmxlIGRlZmF1bHQgZm9yIENDX0ZPUl9CVUlMRCBpbiBNYWtlZmlsZS4KLWlmIHRlc3QgLXogIiRDQ19GT1JfQlVJTEQiOyB0aGVuCi0gIGlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gICAgQ0NfRk9SX0JVSUxEPSckKENDKScKLSAgZWxzZQotICAgIENDX0ZPUl9CVUlMRD1nY2MKLSAgZmkKLWZpCi0KLSMgQWxzbyBzZXQgRVhFRVhUX0ZPUl9CVUlMRC4KLWlmIHRlc3QgIngkY3Jvc3NfY29tcGlsaW5nIiA9ICJ4bm8iOyB0aGVuCi0gIEVYRUVYVF9GT1JfQlVJTEQ9JyQoRVhFRVhUKScKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMwNzogY2hlY2tpbmcgZm9yIGJ1aWxkIHN5c3RlbSBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2J1aWxkX2V4ZWV4dCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGFjX2NfdGVzdC5jIDw8ICdFT0YnCi1pbnQgbWFpbigpIHsKLS8qIE5vdGhpbmcgbmVlZGVkIGhlcmUgKi8KLX0KLUVPRgotICAgICR7Q0NfRk9SX0JVSUxEfSAtbyBhY19jX3Rlc3QgYW1fY190ZXN0LmMgMT4mNSAyPiY1Ci0gICAgYmZkX2N2X2J1aWxkX2V4ZWV4dD1gZWNobyBhY19jX3Rlc3QuKiB8IGdyZXAgLXYgYWNfY190ZXN0LmMgfCBzZWQgLWUgcy9hY19jX3Rlc3QvL2AKLSAgICBybSAtZiBhY19jX3Rlc3QqCi0gICAgdGVzdCB4IiR7YmZkX2N2X2J1aWxkX2V4ZWV4dH0iID0geCAmJiBiZmRfY3ZfYnVpbGRfZXhlZXh0PW5vCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9idWlsZF9leGVleHQiIDE+JjYKLSAgRVhFRVhUX0ZPUl9CVUlMRD0iIgotICB0ZXN0IHgiJHtiZmRfY3ZfYnVpbGRfZXhlZXh0fSIgIT0geG5vICYmIEVYRUVYVF9GT1JfQlVJTEQ9JHtiZmRfY3ZfYnVpbGRfZXhlZXh0fQotZmkKLQotCi1mb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB1bmlzdGQuaCBmY250bC5oIHN5cy9maWxlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzMyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDMzNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM0MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MzY5OiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N5c193YWl0X2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Mzc0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCkoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWludCBzOwotd2FpdCAoJnMpOwotcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQzOTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0MTM6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDE4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDQ2OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0NTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQ3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MTE6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDU0MTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDU0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTY5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1OTY6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NjA0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ2MjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfZnVuYyBpbiBzYnJrIHV0aW1lcwotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDY0NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDY1MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Njc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgU29tZSBzeXN0ZW1zIGhhdmUgZnJleHAgb25seSBpbiAtbG0sIG5vdCBpbiAtbGMuCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZnJleHAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ3MDM6IGNoZWNraW5nIGZvciBsaWJyYXJ5IGNvbnRhaW5pbmcgZnJleHAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3NlYXJjaF9mcmV4cCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0iJExJQlMiCi1hY19jdl9zZWFyY2hfZnJleHA9Im5vIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDcxMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGZyZXhwKCk7Ci0KLWludCBtYWluKCkgewotZnJleHAoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3MjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3NlYXJjaF9mcmV4cD0ibm9uZSByZXF1aXJlZCIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi10ZXN0ICIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiA9ICJubyIgJiYgZm9yIGkgaW4gLWxtOyBkbwotTElCUz0iLWwkaSAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ3MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBmcmV4cCgpOwotCi1pbnQgbWFpbigpIHsKLWZyZXhwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzQzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9zZWFyY2hfZnJleHA9Ii1sJGkiCi1icmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLUxJQlM9IiRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMiCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3NlYXJjaF9mcmV4cCIgMT4mNgotaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9mcmV4cCIgIT0gIm5vIjsgdGhlbgotICB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2ZyZXhwIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfY3Zfc2VhcmNoX2ZyZXhwICRMSUJTIgotICAKLWVsc2UgOgotICAKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB0aW1lX3QgaW4gdGltZS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NzY1OiBjaGVja2luZyBmb3IgdGltZV90IGluIHRpbWUuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc3MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8dGltZS5oPgotaW50IG1haW4oKSB7Ci10aW1lX3QgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0Nzc3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBidV9jdl9kZWNsX3RpbWVfdF90aW1lX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVElNRV9UX0lOX1RJTUVfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc5ODogY2hlY2tpbmcgZm9yIHRpbWVfdCBpbiBzeXMvdHlwZXMuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotaW50IG1haW4oKSB7Ci10aW1lX3QgaTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODEwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9UWVBFU19IIDEKLUVPRgotCi1maQotCi0jIFVuZGVyIE5leHQgMy4yIDx1dGltZS5oPiBhcHBhcmVudGx5IGRvZXMgbm90IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1ZgotIyBieSBkZWZhdWx0LgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHV0aW1lLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4MzM6IGNoZWNraW5nIGZvciB1dGltZS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydidV9jdl9oZWFkZXJfdXRpbWVfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIEhBVkVfVElNRV9ICi0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dXRpbWUuaD4KLWludCBtYWluKCkgewotc3RydWN0IHV0aW1idWYgczsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODQ5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYnVfY3ZfaGVhZGVyX3V0aW1lX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJ1X2N2X2hlYWRlcl91dGltZV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJ1X2N2X2hlYWRlcl91dGltZV9oIiAxPiY2Ci1pZiB0ZXN0ICRidV9jdl9oZWFkZXJfdXRpbWVfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HT09EX1VUSU1FX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZnByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODcwOiBjaGVja2luZyB3aGV0aGVyIGZwcmludGYgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODc1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGZwcmludGYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODk2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGY9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2ZwcmludGY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9mcHJpbnRmIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZnByaW50ZiA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTE3OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDkyMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0OTQzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBzYnJrIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5NjQ6IGNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5NjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgc2JyawotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5OTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUwMTE6IGNoZWNraW5nIHdoZXRoZXIgZ2V0ZW52IG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIGdldGVudgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwMzc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnY9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9nZXRlbnYgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fR0VURU5WIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGVudmlyb24gbXVzdCBiZSBkZWNsYXJlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTA1ODogY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2JmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTA2MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBlbnZpcm9uCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTA4NDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbiIgMT4mNgotaWYgdGVzdCAkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24gPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTiAxCi1FT0YKLQotZmkKLQotCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotbXNkb3MqIHwgKi0qLWdvMzIqIHwgKi0qLW1pbmd3MzIqIHwgKi0qLWN5Z3dpbiogfCAqLSotd2luZG93cykKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFVTRV9CSU5BUllfRk9QRU4gMQotRU9GCi0gOzsKLWVzYWMKLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIjsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiOyB0aGVuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICRyZXN1bHQiCi0JZWxzZQotCSAgICAjIEFsbG93IHRhcmdldHMgdGhhdCBjb25maWcuc3ViIGRvZXNuJ3QgcmVjb2duaXplLCBsaWtlICJhbGwiLgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdGFyZyIKLQlmaQotICAgIGRvbmUKLWZpCi0KLWFsbF90YXJnZXRzPWZhbHNlCi1CVUlMRF9OTE1DT05WPQotTkxNQ09OVl9ERUZTPQotQlVJTERfU1JDT05WPQotQlVJTERfRExMVE9PTD0KLURMTFRPT0xfREVGUz0KLUJVSUxEX1dJTkRSRVM9Ci1CVUlMRF9ETExXUkFQPQotQlVJTERfTUlTQz0KLQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLQlCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScKLQlOTE1DT05WX0RFRlM9Ii1ETkxNQ09OVl9JMzg2IC1ETkxNQ09OVl9BTFBIQSAtRE5MTUNPTlZfUE9XRVJQQyAtRE5MTUNPTlZfU1BBUkMiCi0gICAgZWxzZQotCWNhc2UgJHRhcmcgaW4KLQlpWzM0NTZdODYqLSotbmV0d2FyZSopIAotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9JMzg2IgotCSAgOzsKLQlhbHBoYSotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfQUxQSEEiCi0JICA7OwotCXBvd2VycGMqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX1BPV0VSUEMiCi0JICA7OwotCXNwYXJjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9TUEFSQyIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQkqLSotaG1zKikgQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScgOzsKLQllc2FjCi0JY2FzZSAkdGFyZyBpbgotCWFybS0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQl0aHVtYi0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQlpWzMtNl04Ni0qcGUqIHwgaVszLTZdODYtKi1jeWd3aW4qIHwgaVszLTZdODYtKi1taW5ndzMyKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9JMzg2IgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSAgQlVJTERfRExMV1JBUD0nJChETExXUkFQX1BST0cpJChFWEVFWFQpJwotCSA7OwotCXBvd2VycGMqLSotKnBlKiB8IHBvd2VycGMqLSotY3lnd2luKikKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9QUEMiCi0JICBCVUlMRF9XSU5EUkVTPSckKFdJTkRSRVNfUFJPRykkKEVYRUVYVCknCi0JIDs7Ci0JbWNvcmUtKnBlKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01DT1JFIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSA7OwotCW1jb3JlLSplbGYpCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfTUNPUkVfRUxGIgotCSA7OwotCWVzYWMKLSAgICBmaQotZG9uZQotCi0KLQotCi0KLQotCi0KLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVQgIiR7dGFyZ2V0fSIKLUVPRgotCi0KLXRhcmc9JHRhcmdldAotLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi1pZiB0ZXN0ICJ4JHRhcmdfdW5kZXJzY29yZSIgPSAieHllcyI7IHRoZW4KLSAgICBVTkRFUlNDT1JFPTEKLWVsc2UKLSAgICBVTkRFUlNDT1JFPTAKLWZpCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAWUFDQ0AlJFlBQ0MlZwotcyVATEVYQCUkTEVYJWcKLXMlQExFWExJQkAlJExFWExJQiVnCi1zJUBDUFBAJSRDUFAlZwotcyVATEVYX09VVFBVVF9ST09UQCUkTEVYX09VVFBVVF9ST09UJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQVJAJSRBUiVnCi1zJUBDQ19GT1JfQlVJTERAJSRDQ19GT1JfQlVJTEQlZwotcyVARVhFRVhUX0ZPUl9CVUlMREAlJEVYRUVYVF9GT1JfQlVJTEQlZwotcyVATkxNQ09OVl9ERUZTQCUkTkxNQ09OVl9ERUZTJWcKLXMlQEJVSUxEX05MTUNPTlZAJSRCVUlMRF9OTE1DT05WJWcKLXMlQEJVSUxEX1NSQ09OVkAlJEJVSUxEX1NSQ09OViVnCi1zJUBCVUlMRF9ETExUT09MQCUkQlVJTERfRExMVE9PTCVnCi1zJUBETExUT09MX0RFRlNAJSRETExUT09MX0RFRlMlZwotcyVAQlVJTERfV0lORFJFU0AlJEJVSUxEX1dJTkRSRVMlZwotcyVAQlVJTERfRExMV1JBUEAlJEJVSUxEX0RMTFdSQVAlZwotcyVAQlVJTERfTUlTQ0AlJEJVSUxEX01JU0MlZwotcyVAVU5ERVJTQ09SRUAlJFVOREVSU0NPUkUlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi0KLWNhc2UgIngkQ09ORklHX0ZJTEVTIiBpbgotKikgc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlIDs7Ci1lc2FjCi0KLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9iaW51dGlscy9jb25maWd1cmUuYmF0IGIvYmludXRpbHMvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZjdkNzBmMS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotQGVjaG8gb2ZmDQotaWYgIiUxIiA9PSAiaDgvMzAwIiBnb3RvIGg4MzAwDQotDQotZWNobyBDb25maWd1cmluZyBiaW51dGlscyBmb3IgZ28zMg0KLXVwZGF0ZSAuLi9iZmQvaG9zdHMvZ28zMi5oIHN5c2RlcC5oDQotZ290byBjb21tb24NCi0NCi06aDgzMDANCi1lY2hvIENvbmZpZ3VyaW5nIGJpbnV0aWxzIGZvciBIOC8zMDANCi11cGRhdGUgLi5cYmZkXGhvc3RzXGgtZ28zMi5oIHN5c2RlcC5oDQotDQotOmNvbW1vbg0KLQ0KLWVjaG8gIyBNYWtlZmlsZSBnZW5lcmF0ZWQgYnkgImNvbmZpZ3VyZS5iYXQiPiBNYWtlZmlsZQ0KLQ0KLWlmIGV4aXN0IGNvbmZpZy5zZWQgZGVsIGNvbmZpZy5zZWQNCi0NCi1zZWQgLW4gIi9eVkVSU0lPTj0vIHAiIE1ha2VmaWxlLmluIHwgc2VkIC1lICJzL14vc14vIiAtZSAicy89L15cIi8iIC1lICJzLyQvXCJeLyIgPiBjb25maWcuc2VkDQotc2VkIC1mIGNvbmZpZy5zZWQgdmVyc2lvbi5jID4gdmVyc2lvbjIuYw0KLQ0KLWlmIGV4aXN0IGNvbmZpZy5zZWQgZGVsIGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL3ZlcnNpb25cLi92ZXJzaW9uMlwuL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzLy1EVkVSU0lPTj1bXiBdKiAvLwkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvXglcJChzcmNkaXIpXC9tb3ZlLWlmLWNoYW5nZS8JdXBkYXRlLwkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIi9eIyMjJC8gaVwJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiQ0MgPSBnY2MJCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvOlwoW14gCV1cKS86IFwxL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL14JXCAqXC5cLy8JZ28zMiAvCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL2BlY2hvIFwkKHNyY2RpcilcLy8vZwkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvIHwgc2VkICdzLFxeXFxcLlwvLCwnYC8vZwkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9eCWNkIFwkKHNyY2RpcilbIAldKjsvLwkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL15hcnBhcnNlXC5jLyBpXAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJhcnBhcnNlLm86IGFycGFyc2UuY1wJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIJJChDQykgLWMgJChDRkxBR1MpICQoSU5DTFVERVMpICQoSERFRklORVMpICQoVERFRklORVMpIGFycGFyc2UuYyAiPj4gY29uZmlnLnNlZA0KLWVjaG8gIi9cJChCSVNPTikvIGNcCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIgliaXNvbiAkKEJJU09ORkxBR1MpIC1vICRAIGFycGFyc2UueQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIveVwudGFiXC4vIGQJCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAiL15hcmxleC5jLyB7CQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIiBpXAkJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiYXJsZXgubzogYXJsZXguYwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgaVwJCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIgkkKENDKSAtYyAkKENGTEFHUykgJChJTkNMVURFUykgJChIREVGSU5FUykgJChUREVGSU5FUykgYXJsZXguYyAiPj4gY29uZmlnLnNlZA0KLWVjaG8gIn0JCQkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIvXCQoTEVYKS8gY1wJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiCWZsZXggJChMRVhfT1BUSU9OUykgYXJsZXgubAkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9sZXhcLnl5XC4vbGV4eXkuL2cJCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzLyciL1xcIi9nCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvIicvXFwiL2cJCQkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAicy9jKytmaWx0L2N4eGZpbHQvZwkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLXNlZCAtZSAicy9eXCIvLyIgLWUgInMvXCIkLy8iIC1lICJzL1sgCV0qJC8vIiBjb25maWcuc2VkID4gY29uZmlnMi5zZWQNCi1zZWQgLWYgY29uZmlnMi5zZWQgTWFrZWZpbGUuaW4gPj4gTWFrZWZpbGUNCi1kZWwgY29uZmlnLnNlZA0KLWRlbCBjb25maWcyLnNlZA0KLQ0KLWVjaG8gaW50IHByZXBlbmRzX3VuZGVyc2NvcmUgPSAxOyA+IHVuZGVyc2NvcmUuYw0KLQ0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5jb20gYi9iaW51dGlscy9jb25maWd1cmUuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTQ2M2Q1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5jb20KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0kIQotJCEgVGhpcyBmaWxlIGNvbmZpZ3VyZXMgYmludXRpbHMgZm9yIHVzZSB3aXRoIG9wZW5WTVMvQWxwaGEKLSQhIFdlIGRvIG5vdCB1c2UgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIHNpbmNlIHdlIGRvIG5vdCBoYXZlIC9iaW4vc2gKLSQhIHRvIGV4ZWN1dGUgaXQuCi0kIQotJCEgV3JpdHRlbiBieSBLbGF1cyBLImFtcGYgKGtrYWVtcGZAcm1pLmRlKQotJCEKLSRhcmNoX2luZHggPSAxICsgKChmJGdldHN5aSgiQ1BVIikuZ2UuMTI4KS5hbmQuMSkgICAgICAhIHZheD09MSwgYWxwaGE9PTIKLSRhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQhCi0kIQotJCEgR2VuZXJhdGUgY29uZmlnLmgKLSQhCi0kIGNyZWF0ZSBbXWNvbmZpZy5oCi0vKiBjb25maWcuaC4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovCi0vKiBjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDx0aW1lLmg+PyAgKi8KLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVElNRV9IIDEKLS8qIElzIHRoZSB0eXBlIHRpbWVfdCBkZWZpbmVkIGluIDxzeXMvdHlwZXMuaD4/ICAqLwotI2RlZmluZSBIQVZFX1RJTUVfVF9JTl9UWVBFU19IIDEKLS8qIERvZXMgPHV0aW1lLmg+IGRlZmluZSBzdHJ1Y3QgdXRpbWJ1Zj8gICovCi0jZGVmaW5lIEhBVkVfR09PRF9VVElNRV9IIDEKLS8qIFdoZXRoZXIgZnByaW50ZiBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHN0ZGlvLmg+IGlzIGluY2x1ZGVkLiAgKi8KLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGIDEKLS8qIFdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIGV2ZW4gaWYgPHVuaXN0ZC5oPiBpcyBpbmNsdWRlZC4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0vKiBEbyB3ZSBuZWVkIHRvIHVzZSB0aGUgYiBtb2RpZmllciB3aGVuIG9wZW5pbmcgYmluYXJ5IGZpbGVzPyAgKi8KLS8qICN1bmRlZiBVU0VfQklOQVJZX0ZPUEVOICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotLyogI3VuZGVmIEhBVkVfU0JSSyAxICovCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHV0aW1lcyBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfVVRJTUVTIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NZU19GSUxFX0ggMQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0kIHdyaXRlIHN5cyRvdXRwdXQgIkdlbmVyYXRlZCBgY29uZmlnLmgnIgotJCEKLSQhCi0kISBFZGl0IFZFUlNJT04gaW4gbWFrZWZpbGUudm1zLWluCi0kIQotJCBlZGl0L3RwdS9ub2pvdXJuYWwvbm9zZWN0aW9uL25vZGlzcGxheS9jb21tYW5kPXN5cyRpbnB1dCAtCi0gICAgICAgIFtdbWFrZWZpbGUudm1zLWluIC9vdXRwdXQ9W11tYWtlZmlsZS52bXMKLSRERUNLCi0hCi0hIEdldCBWRVJTSU9OIGZyb20gY29uZmlndXJlLmluCi0hCi0gICBtZmlsZSA6PSBDUkVBVEVfQlVGRkVSKCJtZmlsZSIsICJDT05GSUdVUkUuSU4iKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihtZmlsZSksIEVORF9PRihtZmlsZSkpOwotICAgbWF0Y2hfcG9zIDo9IFNFQVJDSF9RVUlFVExZKCdBTV9JTklUX0FVVE9NQUtFKGJpbnV0aWxzLCAnLCBGT1JXQVJELCBFWEFDVCwgcmFuZyk7Ci0gICBJRiBtYXRjaF9wb3MgPD4gMCBUSEVOOwotICAgICBQT1NJVElPTihCRUdJTk5JTkdfT0YobWF0Y2hfcG9zKSk7Ci0gICAgIEVSQVNFKG1hdGNoX3Bvcyk7Ci0gICAgIHZlcnMgOj0gQ1VSUkVOVF9MSU5FLSIpIjsKLSAgIEVMU0U7Ci0gICAgIHZlcnMgOj0gInVua25vd24iOwotICAgRU5ESUY7Ci0KLSAgIGZpbGUgOj0gQ1JFQVRFX0JVRkZFUigiZmlsZSIsIEdFVF9JTkZPKENPTU1BTkRfTElORSwgImZpbGVfbmFtZSIpKTsKLSAgIHJhbmcgOj0gQ1JFQVRFX1JBTkdFKEJFR0lOTklOR19PRihmaWxlKSwgRU5EX09GKGZpbGUpKTsKLSAgIG1hdGNoX3BvcyA6PSBTRUFSQ0hfUVVJRVRMWSgnQFZFUlNJT05AJywgRk9SV0FSRCwgRVhBQ1QsIHJhbmcpOwotICAgUE9TSVRJT04oQkVHSU5OSU5HX09GKG1hdGNoX3BvcykpOwotICAgRVJBU0UobWF0Y2hfcG9zKTsKLSAgIENPUFlfVEVYVCh2ZXJzKTsKLSAgIFdSSVRFX0ZJTEUoZmlsZSwgR0VUX0lORk8oQ09NTUFORF9MSU5FLCAib3V0cHV0X2ZpbGUiKSk7Ci0gICBRVUlUCi0kICBFT0QKLSQgd3JpdGUgc3lzJG91dHB1dCAiQ3JlYXRlZCBgbWFrZWZpbGUudm1zJyIKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2NvbmZpZ3VyZS5pbiBiL2JpbnV0aWxzL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzN2NlYy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwKLUFDX1BSRVJFUSgyLjEzKQotQUNfSU5JVChhci5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi0KLUFNX0lOSVRfQVVUT01BS0UoYmludXRpbHMsIDIuOS40KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgLS1lbmFibGUtdGFyZ2V0cyAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcyB8ICIiKSBBQ19FUlJPUihlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJykKLSAgICAgICAgICAgIDs7Ci0gIG5vKSAgICAgICBlbmFibGVfdGFyZ2V0cz0gOzsKLSAgKikgICAgICAgIGVuYWJsZV90YXJnZXRzPSRlbmFibGV2YWwgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRShjb21tb25iZmRsaWIsCi1bICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBjb21tb25iZmRsaWI9dHJ1ZSA7OwotICBubykgIGNvbW1vbmJmZGxpYj1mYWxzZSA7OwotICAqKSAgIEFDX01TR19FUlJPUihbYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgQkZEIGNvbW1vbmJmZGxpYiBvcHRpb25dKSA7OwotZXNhY10pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi0KLUFDX1BST0dfQ0MKLQotQUNfUFJPR19ZQUNDCi1BTV9QUk9HX0xFWAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi1pZiB0ZXN0IC1uICIkRVhFRVhUIjsgdGhlbgotICBBQ19ERUZJTkUoSEFWRV9FWEVDVVRBQkxFX1NVRkZJWCwgMSwKLQkgICAgW0RvZXMgdGhlIHBsYXRmb3JtIHVzZSBhbiBleGVjdXRhYmxlIHN1ZmZpeD9dKQotZmkKLUFDX0RFRklORV9VTlFVT1RFRChFWEVDVVRBQkxFX1NVRkZJWCwgIiR7RVhFRVhUfSIsCi0JCSAgIFtTdWZmaXggdXNlZCBmb3IgZXhlY3V0YWJsZXMsIGlmIGFueS5dKQotCi0jIGhvc3Qtc3BlY2lmaWMgc3R1ZmY6Ci0KLUhERUZJTkVTPQotCi0uICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmhvc3QKLQotQUNfU1VCU1QoSERFRklORVMpCi1BUj0ke0FSLWFyfQotQUNfU1VCU1QoQVIpCi1BQ19QUk9HX1JBTkxJQgotQUNfUFJPR19JTlNUQUxMCi0KLUJGRF9DQ19GT1JfQlVJTEQKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdHJpbmdzLmggc3RkbGliLmggdW5pc3RkLmggZmNudGwuaCBzeXMvZmlsZS5oKQotQUNfSEVBREVSX1NZU19XQUlUCi1BQ19GVU5DX0FMTE9DQQotQUNfQ0hFQ0tfRlVOQ1Moc2JyayB1dGltZXMpCi0KLSMgU29tZSBzeXN0ZW1zIGhhdmUgZnJleHAgb25seSBpbiAtbG0sIG5vdCBpbiAtbGMuCi1BQ19TRUFSQ0hfTElCUyhmcmV4cCwgLWxtKQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRpbWVfdCBpbiB0aW1lLmgpCi1BQ19DQUNIRV9WQUwoYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8dGltZS5oPl0sIFt0aW1lX3QgaTtdLAotYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPXllcywgYnVfY3ZfZGVjbF90aW1lX3RfdGltZV9oPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2gpCi1pZiB0ZXN0ICRidV9jdl9kZWNsX3RpbWVfdF90aW1lX2ggPSB5ZXM7IHRoZW4KLSAgQUNfREVGSU5FKFtIQVZFX1RJTUVfVF9JTl9USU1FX0hdLCAxLAotCSAgICBbSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHRpbWUuaD4/XSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgdGltZV90IGluIHN5cy90eXBlcy5oKQotQUNfQ0FDSEVfVkFMKGJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2gsCi1bQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLCBbdGltZV90IGk7XSwKLWJ1X2N2X2RlY2xfdGltZV90X3R5cGVzX2g9eWVzLCBidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oPW5vKV0pCi1BQ19NU0dfUkVTVUxUKCRidV9jdl9kZWNsX3RpbWVfdF90eXBlc19oKQotaWYgdGVzdCAkYnVfY3ZfZGVjbF90aW1lX3RfdHlwZXNfaCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoW0hBVkVfVElNRV9UX0lOX1RZUEVTX0hdLCAxLAotCSAgICBbSXMgdGhlIHR5cGUgdGltZV90IGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPj9dKQotZmkKLQotIyBVbmRlciBOZXh0IDMuMiA8dXRpbWUuaD4gYXBwYXJlbnRseSBkb2VzIG5vdCBkZWZpbmUgc3RydWN0IHV0aW1idWYKLSMgYnkgZGVmYXVsdC4KLUFDX01TR19DSEVDS0lORyhbZm9yIHV0aW1lLmhdKQotQUNfQ0FDSEVfVkFMKGJ1X2N2X2hlYWRlcl91dGltZV9oLAotW0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9USU1FX0gKLSNpbmNsdWRlIDx0aW1lLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx1dGltZS5oPl0sCi1bc3RydWN0IHV0aW1idWYgcztdLAotYnVfY3ZfaGVhZGVyX3V0aW1lX2g9eWVzLCBidV9jdl9oZWFkZXJfdXRpbWVfaD1ubyldKQotQUNfTVNHX1JFU1VMVCgkYnVfY3ZfaGVhZGVyX3V0aW1lX2gpCi1pZiB0ZXN0ICRidV9jdl9oZWFkZXJfdXRpbWVfaCA9IHllczsgdGhlbgotICBBQ19ERUZJTkUoSEFWRV9HT09EX1VUSU1FX0gsIDEsIFtEb2VzIDx1dGltZS5oPiBkZWZpbmUgc3RydWN0IHV0aW1idWY/XSkKLWZpCi0KLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKGZwcmludGYpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzdHJzdHIpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihzYnJrKQotQkZEX05FRURfREVDTEFSQVRJT04oZ2V0ZW52KQotQkZEX05FRURfREVDTEFSQVRJT04oZW52aXJvbikKLQotQkZEX0JJTkFSWV9GT1BFTgotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiOyB0aGVuCi0gICAgZm9yIHRhcmcgaW4gYGVjaG8gJGVuYWJsZV90YXJnZXRzIHwgc2VkICdzLywvIC9nJ2AKLSAgICBkbwotCXJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmcgMj4vZGV2L251bGxgCi0JaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLQllbHNlCi0JICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgotCWZpCi0gICAgZG9uZQotZmkKLQotYWxsX3RhcmdldHM9ZmFsc2UKLUJVSUxEX05MTUNPTlY9Ci1OTE1DT05WX0RFRlM9Ci1CVUlMRF9TUkNPTlY9Ci1CVUlMRF9ETExUT09MPQotRExMVE9PTF9ERUZTPQotQlVJTERfV0lORFJFUz0KLUJVSUxEX0RMTFdSQVA9Ci1CVUlMRF9NSVNDPQotCi1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCI7IHRoZW4KLSAgICAgICAgYWxsX3RhcmdldHM9dHJ1ZQotCUJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQlCVUlMRF9TUkNPTlY9JyQoU1JDT05WX1BST0cpJwotCU5MTUNPTlZfREVGUz0iLUROTE1DT05WX0kzODYgLUROTE1DT05WX0FMUEhBIC1ETkxNQ09OVl9QT1dFUlBDIC1ETkxNQ09OVl9TUEFSQyIKLSAgICBlbHNlCi0JY2FzZSAkdGFyZyBpbgotY2hhbmdlcXVvdGUoLClkbmwKLQlpWzM0NTZdODYqLSotbmV0d2FyZSopIAotY2hhbmdlcXVvdGUoWyxdKWRubAotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9JMzg2IgotCSAgOzsKLQlhbHBoYSotKi1uZXR3YXJlKikKLQkgIEJVSUxEX05MTUNPTlY9JyQoTkxNQ09OVl9QUk9HKSQoRVhFRVhUKScKLQkgIE5MTUNPTlZfREVGUz0iJE5MTUNPTlZfREVGUyAtRE5MTUNPTlZfQUxQSEEiCi0JICA7OwotCXBvd2VycGMqLSotbmV0d2FyZSopCi0JICBCVUlMRF9OTE1DT05WPSckKE5MTUNPTlZfUFJPRykkKEVYRUVYVCknCi0JICBOTE1DT05WX0RFRlM9IiROTE1DT05WX0RFRlMgLUROTE1DT05WX1BPV0VSUEMiCi0JICA7OwotCXNwYXJjKi0qLW5ldHdhcmUqKQotCSAgQlVJTERfTkxNQ09OVj0nJChOTE1DT05WX1BST0cpJChFWEVFWFQpJwotCSAgTkxNQ09OVl9ERUZTPSIkTkxNQ09OVl9ERUZTIC1ETkxNQ09OVl9TUEFSQyIKLQkgIDs7Ci0JZXNhYwotCWNhc2UgJHRhcmcgaW4KLQkqLSotaG1zKikgQlVJTERfU1JDT05WPSckKFNSQ09OVl9QUk9HKScgOzsKLQllc2FjCi0JY2FzZSAkdGFyZyBpbgotCWFybS0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQl0aHVtYi0qcGUqKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX0FSTSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLWNoYW5nZXF1b3RlKCwpZG5sCi0JaVszLTZdODYtKnBlKiB8IGlbMy02XTg2LSotY3lnd2luKiB8IGlbMy02XTg2LSotbWluZ3czMiopCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfSTM4NiIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgIEJVSUxEX0RMTFdSQVA9JyQoRExMV1JBUF9QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQlwb3dlcnBjKi0qLSpwZSogfCBwb3dlcnBjKi0qLWN5Z3dpbiopCi0gIAkgIEJVSUxEX0RMTFRPT0w9JyQoRExMVE9PTF9QUk9HKSQoRVhFRVhUKScKLQkgIERMTFRPT0xfREVGUz0iJERMTFRPT0xfREVGUyAtRERMTFRPT0xfUFBDIgotCSAgQlVJTERfV0lORFJFUz0nJChXSU5EUkVTX1BST0cpJChFWEVFWFQpJwotCSA7OwotCW1jb3JlLSpwZSkKLSAgCSAgQlVJTERfRExMVE9PTD0nJChETExUT09MX1BST0cpJChFWEVFWFQpJwotCSAgRExMVE9PTF9ERUZTPSIkRExMVE9PTF9ERUZTIC1ERExMVE9PTF9NQ09SRSIKLQkgIEJVSUxEX1dJTkRSRVM9JyQoV0lORFJFU19QUk9HKSQoRVhFRVhUKScKLQkgOzsKLQltY29yZS0qZWxmKQotICAJICBCVUlMRF9ETExUT09MPSckKERMTFRPT0xfUFJPRykkKEVYRUVYVCknCi0JICBETExUT09MX0RFRlM9IiRETExUT09MX0RFRlMgLURETExUT09MX01DT1JFX0VMRiIKLQkgOzsKLQllc2FjCi0gICAgZmkKLWRvbmUKLQotQUNfU1VCU1QoTkxNQ09OVl9ERUZTKQotQUNfU1VCU1QoQlVJTERfTkxNQ09OVikKLUFDX1NVQlNUKEJVSUxEX1NSQ09OVikKLUFDX1NVQlNUKEJVSUxEX0RMTFRPT0wpCi1BQ19TVUJTVChETExUT09MX0RFRlMpCi1BQ19TVUJTVChCVUlMRF9XSU5EUkVTKQotQUNfU1VCU1QoQlVJTERfRExMV1JBUCkKLUFDX1NVQlNUKEJVSUxEX01JU0MpCi0KLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVQsICIke3RhcmdldH0iLCBbQ29uZmlndXJlZCB0YXJnZXQgbmFtZS5dKQotCi10YXJnPSR0YXJnZXQKLS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAotaWYgdGVzdCAieCR0YXJnX3VuZGVyc2NvcmUiID0gInh5ZXMiOyB0aGVuCi0gICAgVU5ERVJTQ09SRT0xCi1lbHNlCi0gICAgVU5ERVJTQ09SRT0wCi1maQotQUNfU1VCU1QoVU5ERVJTQ09SRSkKLQotQUNfT1VUUFVUKE1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4sCi1bCi1jYXNlICJ4JENPTkZJR19GSUxFUyIgaW4KLSopIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZSA7OwotZXNhYwotXSkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2N4eGZpbHQubWFuIGIvYmludXRpbHMvY3h4ZmlsdC5tYW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDVkNDUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvY3h4ZmlsdC5tYW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIEBQUk9HUkFNQCAxICJKdW5lIDE5OTMiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1AUFJPR1JBTUAgXC0gZGVtYW5nbGUgQysrIHN5bWJvbHMKLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIEBQUk9HUkFNQAotLlJCICJbXHwiIFwtXyB8IFwtXC1zdHJpcC11bmRlcnNjb3JlcyAiXHxdIgotLlJCICJbXHwiICJcLXMge2dudSxsdWNpZCxhcm19ICIgfCAiIFwtXC1mb3JtYXQ9e2dudSxsdWNpZCxhcm19IiAiXHxdIgotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBzeW1ib2wgIi4uLlx8XSIKLS5TSCBERVNDUklQVElPTgotVGhlIEMrKyBsYW5ndWFnZSBwcm92aWRlcyBmdW5jdGlvbiBvdmVybG9hZGluZywgd2hpY2ggbWVhbnMgdGhhdCB5b3UgY2FuCi13cml0ZSBtYW55IGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgKHByb3ZpZGluZyBlYWNoIHRha2VzIHBhcmFtZXRlcnMKLW9mIGRpZmZlcmVudCB0eXBlcykuICBBbGwgQysrIGZ1bmN0aW9uIG5hbWVzIGFyZSBlbmNvZGVkIGludG8gYQotbG93LWxldmVsIGFzc2VtYmx5IGxhYmVsICh0aGlzIHByb2Nlc3MgaXMga25vd24gYXMKLS5JIG1hbmdsaW5nXGMKLSkuICBUaGUgCi0uQiBAUFJPR1JBTUAKLXByb2dyYW0gZG9lcyB0aGUgaW52ZXJzZSBtYXBwaW5nOiBpdCBkZWNvZGVzIChcZklkZW1hbmdsZXNcZlIpCi1sb3ctbGV2ZWwgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4ga2VlcAotdGhlc2Ugb3ZlcmxvYWRlZCBmdW5jdGlvbnMgZnJvbSBjbGFzaGluZy4KLS5QUAotRXZlcnkgYWxwaGFudW1lcmljIHdvcmQgKGNvbnNpc3Rpbmcgb2YgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywKLWRvbGxhcnMsIG9yIHBlcmlvZHMpIHNlZW4gaW4gdGhlIGlucHV0IGlzIGEgcG90ZW50aWFsIGxhYmVsLiAgSWYgdGhlCi1sYWJlbCBkZWNvZGVzIGludG8gYSBDKysgbmFtZSwgdGhlIEMrKyBuYW1lIHJlcGxhY2VzIHRoZSBsb3ctbGV2ZWwKLW5hbWUgaW4gdGhlIG91dHB1dC4KLS5QUAotWW91IGNhbiB1c2UKLS5CIEBQUk9HUkFNQAotdG8gZGVjaXBoZXIgaW5kaXZpZHVhbCBzeW1ib2xzIGJ5IHNwZWNpZnlpbmcgdGhlc2Ugc3ltYm9scyBvbiB0aGUKLWNvbW1hbmQgbGluZS4KLS5QUAotSWYgbm8KLS5CIHN5bWJvbAotYXJndW1lbnRzIGFyZSBnaXZlbiwKLS5CIEBQUk9HUkFNQAotcmVhZHMgc3ltYm9sIG5hbWVzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZXMgdGhlIGRlbWFuZ2xlZAotbmFtZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gIEFsbCByZXN1bHRzIGFyZSBwcmludGVkIG9uIHRoZSBzdGFuZGFyZAotb3V0cHV0LgotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1fCi0uVFAKLS5CIFwtXC1zdHJpcFwtdW5kZXJzY29yZXMKLU9uIHNvbWUgc3lzdGVtcywgYm90aCB0aGUgQyBhbmQgQysrIGNvbXBpbGVycyBwdXQgYW4KLXVuZGVyc2NvcmUgaW4gZnJvbnQgb2YgZXZlcnkgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgQyBuYW1lIAotLkIgZm9vCi1nZXRzIHRoZSBsb3ctbGV2ZWwgbmFtZSAKLS5CUiBfZm9vIC4KLVRoaXMgb3B0aW9uIHJlbW92ZXMgdGhlIGxlYWRpbmcgdW5kZXJzY29yZS4KLQotLlRQCi0uQiAiXC1zIHtnbnUsbHVjaWQsYXJtfSIKLS5UUAotLkIgXC1cLWZvcm1hdD17Z251LGx1Y2lkLGFybX0KLUdOVQotLkIgbm0KLWNhbiBkZWNvZGUgdGhyZWUgZGlmZmVyZW50IG1ldGhvZHMgb2YgbWFuZ2xpbmcsIHVzZWQgYnkgZGlmZmVyZW50IEMrKwotY29tcGlsZXJzLiAgVGhpcyBvcHRpb24gc2VsZWN0cyB3aGljaCBtZXRob2QgaXQgdXNlczogdGhlIG9uZSB1c2VkIGJ5Ci10aGUgR05VIGNvbXBpbGVyLCB0aGUgb25lIHVzZWQgYnkgdGhlIEx1Y2lkIGNvbXBpbGVyLCBvciB0aGUgb25lCi1zcGVjaWZpZWQgYnkgdGhlIEMrKyBBbm5vdGF0ZWQgUmVmZXJlbmNlIE1hbnVhbC4gIFRoZSBkZWZhdWx0IGlzIHRoZQotR05VIHN0eWxlLgotCi0uVFAKLS5CIFwtXC1oZWxwCi1QcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIEBQUk9HUkFNQAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC1cLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgQFBST0dSQU1ACi1hbmQgZXhpdC4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkIKLWluZm9cYwotXCY7IAotLkkKLVRoZSBHTlUgQmluYXJ5IFV0aWxpdGllc1xjCi1cJiwgUm9sYW5kIEguIFBlc2NoIChKdW5lIDE5OTMpLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9kZWJ1Zy5jIGIvYmludXRpbHMvZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczZDYyNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU2OCArMCwwIEBACi0vKiBkZWJ1Zy5jIC0tIEhhbmRsZSBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGdlbmVyaWMgZGVidWdnaW5nIGZvcm1hdC4gIFdlIG1heSBldmVudHVhbGx5Ci0gICBoYXZlIHJlYWRlcnMgd2hpY2ggY29udmVydCBkaWZmZXJlbnQgZm9ybWF0cyBpbnRvIHRoaXMgZ2VuZXJpYwotICAgZm9ybWF0LCBhbmQgd3JpdGVycyB3aGljaCB3cml0ZSBpdCBvdXQuICBUaGUgaW5pdGlhbCBpbXBldHVzIGZvcgotICAgdGhpcyB3YXMgd3JpdGluZyBhIGNvbnZlcnRvciBmcm9tIHN0YWJzIHRvIEhQIElFRUUtNjk1IGRlYnVnZ2luZwotICAgZm9ybWF0LiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotCi0vKiBHbG9iYWwgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgZGVidWdnaW5nLiAgQSBwb2ludGVyIHRvIHRoaXMKLSAgIHN0cnVjdHVyZSBpcyB0aGUgZGVidWdnaW5nIGhhbmRsZSBwYXNzZWQgdG8gYWxsIHRoZSByb3V0aW5lcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19oYW5kbGUKLXsKLSAgLyogQSBsaW5rZWQgbGlzdCBvZiBjb21waWxhdGlvbiB1bml0cy4gICovCi0gIHN0cnVjdCBkZWJ1Z191bml0ICp1bml0czsKLSAgLyogVGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z191bml0ICpjdXJyZW50X3VuaXQ7Ci0gIC8qIFRoZSBjdXJyZW50IHNvdXJjZSBmaWxlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmN1cnJlbnRfZmlsZTsKLSAgLyogVGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb24gKmN1cnJlbnRfZnVuY3Rpb247Ci0gIC8qIFRoZSBjdXJyZW50IGJsb2NrLiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpjdXJyZW50X2Jsb2NrOwotICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgdW5pdC4gICovCi0gIHN0cnVjdCBkZWJ1Z19saW5lbm8gKmN1cnJlbnRfbGluZW5vOwotICAvKiBNYXJrLiAgVGhpcyBpcyB1c2VkIGJ5IGRlYnVnX3dyaXRlLiAgKi8KLSAgdW5zaWduZWQgaW50IG1hcms7Ci0gIC8qIEEgc3RydWN0L2NsYXNzIElEIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgY2xhc3NfaWQ7Ci0gIC8qIFRoZSBiYXNlIGZvciBjbGFzc19pZCBmb3IgdGhpcyBjYWxsIHRvIGRlYnVnX3dyaXRlLiAgKi8KLSAgdW5zaWduZWQgaW50IGJhc2VfaWQ7Ci0gIC8qIFRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGluIGRlYnVnX3dyaXRlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqY3VycmVudF93cml0ZV9saW5lbm87Ci0gIHVuc2lnbmVkIGludCBjdXJyZW50X3dyaXRlX2xpbmVub19pbmRleDsKLSAgLyogQSBsaXN0IG9mIGNsYXNzZXMgd2hpY2ggaGF2ZSBhc3NpZ25lZCBJRCdzIGR1cmluZyBkZWJ1Z193cml0ZS4KLSAgICAgVGhpcyBpcyBsaW5rZWQgdGhyb3VnaCB0aGUgbmV4dF9pZCBmaWVsZCBvZiBkZWJ1Z19jbGFzc190eXBlLiAgKi8KLSAgc3RydWN0IGRlYnVnX2NsYXNzX2lkICppZF9saXN0OwotICAvKiBBIGxpc3QgdXNlZCB0byBhdm9pZCByZWN1cnNpb24gZHVyaW5nIGRlYnVnX3R5cGVfc2FtZXAuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKmNvbXBhcmVfbGlzdDsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdHJ1Y3QgZGVidWdfdW5pdAotewotICAvKiBUaGUgbmV4dCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3VuaXQgKm5leHQ7Ci0gIC8qIEEgbGlzdCBvZiBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICBUaGUgZmlyc3QKLSAgICAgZmlsZSBpcyBhbHdheXMgdGhlIG1haW4gb25lLCBhbmQgdGhhdCBpcyB3aGVyZSB0aGUgbWFpbiBmaWxlIG5hbWUKLSAgICAgaXMgc3RvcmVkLiAgKi8KLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmZpbGVzOwotICAvKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21waWxhdGlvbiB1bml0LiAgVGhpcyBpcyBub3QKLSAgICAgc3RvcmVkIGJ5IGZ1bmN0aW9uLCBiZWNhdXNlIGFzc2VtYmxlciBjb2RlIG1heSBoYXZlIGxpbmUgbnVtYmVyCi0gICAgIGluZm9ybWF0aW9uIHdpdGhvdXQgZnVuY3Rpb24gaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZGVidWdfbGluZW5vICpsaW5lbm9zOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBzaW5nbGUgc291cmNlIGZpbGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfZmlsZQotewotICAvKiBUaGUgbmV4dCBzb3VyY2UgZmlsZSBpbiB0aGlzIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqbmV4dDsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLiAgKi8KLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIC8qIEdsb2JhbCBmdW5jdGlvbnMsIHZhcmlhYmxlcywgdHlwZXMsIGV0Yy4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKmdsb2JhbHM7Ci19OwotCi0vKiBBIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfdHlwZQotewotICAvKiBLaW5kIG9mIHR5cGUuICAqLwotICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAvKiBTaXplIG9mIHR5cGUgKDAgaWYgbm90IGtub3duKS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotICAvKiBUeXBlIHdoaWNoIGlzIGEgcG9pbnRlciB0byB0aGlzIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHBvaW50ZXI7Ci0gIC8qIFRhZ2dlZCB1bmlvbiB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIERFQlVHX0tJTkRfSU5ESVJFQ1QuICAqLwotICAgICAgc3RydWN0IGRlYnVnX2luZGlyZWN0X3R5cGUgKmtpbmRpcmVjdDsKLSAgICAgIC8qIERFQlVHX0tJTkRfSU5ULiAgKi8KLSAgICAgIC8qIFdoZXRoZXIgdGhlIGludGVnZXIgaXMgdW5zaWduZWQuICAqLwotICAgICAgYm9vbGVhbiBraW50OwotICAgICAgLyogREVCVUdfS0lORF9TVFJVQ1QsIERFQlVHX0tJTkRfVU5JT04sIERFQlVHX0tJTkRfQ0xBU1MsCi0gICAgICAgICBERUJVR19LSU5EX1VOSU9OX0NMQVNTLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICprY2xhc3M7Ci0gICAgICAvKiBERUJVR19LSU5EX0VOVU0uICAqLwotICAgICAgc3RydWN0IGRlYnVnX2VudW1fdHlwZSAqa2VudW07Ci0gICAgICAvKiBERUJVR19LSU5EX1BPSU5URVIuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtwb2ludGVyOwotICAgICAgLyogREVCVUdfS0lORF9GVU5DVElPTi4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSAqa2Z1bmN0aW9uOwotICAgICAgLyogREVCVUdfS0lORF9SRUZFUkVOQ0UuICAqLwotICAgICAgc3RydWN0IGRlYnVnX3R5cGUgKmtyZWZlcmVuY2U7Ci0gICAgICAvKiBERUJVR19LSU5EX1JBTkdFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlICprcmFuZ2U7Ci0gICAgICAvKiBERUJVR19LSU5EX0FSUkFZLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z19hcnJheV90eXBlICprYXJyYXk7Ci0gICAgICAvKiBERUJVR19LSU5EX1NFVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfc2V0X3R5cGUgKmtzZXQ7Ci0gICAgICAvKiBERUJVR19LSU5EX09GRlNFVC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUgKmtvZmZzZXQ7Ci0gICAgICAvKiBERUJVR19LSU5EX01FVEhPRC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUgKmttZXRob2Q7Ci0gICAgICAvKiBERUJVR19LSU5EX0NPTlNULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICprY29uc3Q7Ci0gICAgICAvKiBERUJVR19LSU5EX1ZPTEFUSUxFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICprdm9sYXRpbGU7Ci0gICAgICAvKiBERUJVR19LSU5EX05BTUVELCBERUJVR19LSU5EX1RBR0dFRC4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqa25hbWVkOwotICAgIH0gdTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGluZGlyZWN0IHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfaW5kaXJlY3RfdHlwZQotewotICAvKiBTbG90IHdoZXJlIHRoZSBmaW5hbCB0eXBlIHdpbGwgYXBwZWFyLiAgKi8KLSAgZGVidWdfdHlwZSAqc2xvdDsKLSAgLyogVGFnLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBzdHJ1Y3QsIHVuaW9uLCBvciBjbGFzcy4gICovCi0KLXN0cnVjdCBkZWJ1Z19jbGFzc190eXBlCi17Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBmaWVsZHMuICAqLwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICAvKiBBIG1hcmsgZmllbGQgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0cnVjdCBoYXMgYWxyZWFkeSBiZWVuCi0gICAgIHByaW50ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogVGhpcyBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHVubmFtZWQgc3RydWN0cyB3aGVuIHByaW50aW5nLiAgKi8KLSAgdW5zaWduZWQgaW50IGlkOwotICAvKiBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgb25seSB1c2VkIGZvciBERUJVR19LSU5EX0NMQVNTIGFuZAotICAgICBERUJVR19LSU5EX1VOSU9OX0NMQVNTLiAgKi8KLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGJhc2UgY2xhc3Nlcy4gICovCi0gIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBtZXRob2RzLiAgKi8KLSAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgY2xhc3MgcHJvdmlkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGZvcgotICAgICB0aGlzIGNsYXNzLiAgVGhpcyBtYXkgcG9pbnQgdG8gdGhlIHR5cGUgaXRzZWxmLiAgKi8KLSAgZGVidWdfdHlwZSB2cHRyYmFzZTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGVudW0uICAqLwotCi1zdHJ1Y3QgZGVidWdfZW51bV90eXBlCi17Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBuYW1lcy4gICovCi0gIGNvbnN0IGNoYXIgKipuYW1lczsKLSAgLyogQXJyYXkgb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuICAqLwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBmdW5jdGlvbi4gIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0bwotICAgcmVjb3JkIHRoZSBwYXJhbWV0ZXIgdHlwZXMuICAqLwotCi1zdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZQotewotICAvKiBSZXR1cm4gdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gIC8qIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLSAgLyogV2hldGhlciB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgYm9vbGVhbiB2YXJhcmdzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSByYW5nZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlCi17Ci0gIC8qIFJhbmdlIGJhc2UgdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogTG93ZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgLyogVXBwZXIgYm91bmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGFuIGFycmF5LiAgKi8KLQotc3RydWN0IGRlYnVnX2FycmF5X3R5cGUKLXsKLSAgLyogRWxlbWVudCB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSBlbGVtZW50X3R5cGU7Ci0gIC8qIFJhbmdlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHJhbmdlX3R5cGU7Ci0gIC8qIExvd2VyIGJvdW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gIC8qIFVwcGVyIGJvdW5kLiAgKi8KLSAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gIC8qIFdoZXRoZXIgdGhpcyBhcnJheSBpcyByZWFsbHkgYSBzdHJpbmcuICAqLwotICBib29sZWFuIHN0cmluZ3A7Ci19OwotCi0vKiBJbmZvcm1hdGlvbiBrZXB0IGZvciBhIHNldC4gICovCi0KLXN0cnVjdCBkZWJ1Z19zZXRfdHlwZQotewotICAvKiBCYXNlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZXQgaXMgcmVhbGx5IGEgYml0c3RyaW5nLiAgKi8KLSAgYm9vbGVhbiBiaXRzdHJpbmdwOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYW4gb2Zmc2V0IHR5cGUgKGEgYmFzZWQgcG9pbnRlcikuICAqLwotCi1zdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUKLXsKLSAgLyogVGhlIHR5cGUgdGhlIHBvaW50ZXIgaXMgYW4gb2Zmc2V0IGZyb20uICAqLwotICBkZWJ1Z190eXBlIGJhc2VfdHlwZTsKLSAgLyogVGhlIHR5cGUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvLiAgKi8KLSAgZGVidWdfdHlwZSB0YXJnZXRfdHlwZTsKLX07Ci0KLS8qIEluZm9ybWF0aW9uIGtlcHQgZm9yIGEgbWV0aG9kIHR5cGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUKLXsKLSAgLyogVGhlIHJldHVybiB0eXBlLiAgKi8KLSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgLyogVGhlIG9iamVjdCB0eXBlIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGZvci4gICovCi0gIGRlYnVnX3R5cGUgZG9tYWluX3R5cGU7Ci0gIC8qIEEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAvKiBXaGV0aGVyIHRoZSBtZXRob2QgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgYm9vbGVhbiB2YXJhcmdzOwotfTsKLQotLyogSW5mb3JtYXRpb24ga2VwdCBmb3IgYSBuYW1lZCB0eXBlLiAgKi8KLQotc3RydWN0IGRlYnVnX25hbWVkX3R5cGUKLXsKLSAgLyogTmFtZS4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuYW1lOwotICAvKiBSZWFsIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci19OwotCi0vKiBBIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX2ZpZWxkCi17Ci0gIC8qIE5hbWUgb2YgdGhlIGZpZWxkLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZSBvZiB0aGUgZmllbGQuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgLyogVmlzaWJpbGl0eSBvZiB0aGUgZmllbGQuICAqLwotICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGEgc3RhdGljIG1lbWJlci4gICovCi0gIGJvb2xlYW4gc3RhdGljX21lbWJlcjsKLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBJZiBzdGF0aWNfbWVtYmVyIGlzIGZhbHNlLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIEJpdCBwb3NpdGlvbiBvZiB0aGUgZmllbGQgaW4gdGhlIHN0cnVjdC4gICovCi0JICB1bnNpZ25lZCBpbnQgYml0cG9zOwotCSAgLyogU2l6ZSBvZiB0aGUgZmllbGQgaW4gYml0cy4gICovCi0JICB1bnNpZ25lZCBpbnQgYml0c2l6ZTsKLQl9IGY7Ci0gICAgICAvKiBJZiBzdGF0aWNfbWVtYmVyIGlzIHRydWUuICAqLwotICAgICAgc3RydWN0Ci0JewotCSAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0JfSBzOwotICAgIH0gdTsKLX07Ci0KLS8qIEEgYmFzZSBjbGFzcyBmb3IgYW4gb2JqZWN0LiAgKi8KLQotc3RydWN0IGRlYnVnX2Jhc2VjbGFzcwotewotICAvKiBUeXBlIG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIEJpdCBwb3NpdGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBpbiB0aGUgb2JqZWN0LiAgKi8KLSAgdW5zaWduZWQgaW50IGJpdHBvczsKLSAgLyogV2hldGhlciB0aGUgYmFzZSBjbGFzcyBpcyB2aXJ0dWFsLiAgKi8KLSAgYm9vbGVhbiB2aXJ0dWFsOwotICAvKiBWaXNpYmlsaXR5IG9mIHRoZSBiYXNlIGNsYXNzLiAgKi8KLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci19OwotCi0vKiBBIG1ldGhvZCBvZiBhbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgZGVidWdfbWV0aG9kCi17Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBBIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBkaWZmZXJlbnQgdHlwZXMgb2YgdmFyaWFudHMuICAqLwotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKip2YXJpYW50czsKLX07Ci0KLS8qIFRoZSB2YXJpYW50cyBvZiBhIG1ldGhvZCBmdW5jdGlvbiBvZiBhbiBvYmplY3QuICBUaGVzZSBpbmRpY2F0ZQotICAgd2hpY2ggbWV0aG9kIHRvIHJ1bi4gICovCi0KLXN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudAotewotICAvKiBUaGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICAqLwotICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgLyogVGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyBjb25zdC4gICovCi0gIGJvb2xlYW4gY29uc3RwOwotICAvKiBXaGV0aGVyIHRoZSBmdW5jdGlvbiBpcyB2b2xhdGlsZS4gICovCi0gIGJvb2xlYW4gdm9sYXRpbGVwOwotICAvKiBUaGUgb2Zmc2V0IHRvIHRoZSBmdW5jdGlvbiBpbiB0aGUgdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCi0gIGJmZF92bWEgdm9mZnNldDsKLSAgLyogSWYgdm9mZnNldCBpcyBWT0ZGU0VUX1NUQVRJQ19NRVRIT0QsIHRoaXMgaXMgYSBzdGF0aWMgbWV0aG9kLiAgKi8KLSNkZWZpbmUgVk9GRlNFVF9TVEFUSUNfTUVUSE9EICgoYmZkX3ZtYSkgLTEpCi0gIC8qIENvbnRleHQgb2YgYSB2aXJ0dWFsIG1ldGhvZCBmdW5jdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICpjb250ZXh0OwotfTsKLQotLyogQSB2YXJpYWJsZS4gIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHdlIGtlZXAgZm9yIGEgdmFyaWFibGUgb2JqZWN0LgotICAgVGhpcyBoYXMgbm8gbmFtZTsgYSBuYW1lIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHZhcmlhYmxlIGluIGEKLSAgIGRlYnVnX25hbWUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGRlYnVnX3ZhcmlhYmxlCi17Ci0gIC8qIEtpbmQgb2YgdmFyaWFibGUuICAqLwotICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFZhbHVlLiAgVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIHVwb24ga2luZC4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogQSBmdW5jdGlvbi4gIFRoaXMgaGFzIG5vIG5hbWU7IGEgbmFtZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBmdW5jdGlvbgotICAgaW4gYSBkZWJ1Z19uYW1lIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBkZWJ1Z19mdW5jdGlvbgotewotICAvKiBSZXR1cm4gdHlwZS4gICovCi0gIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gIC8qIFBhcmFtZXRlciBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKnBhcmFtZXRlcnM7Ci0gIC8qIEJsb2NrIGluZm9ybWF0aW9uLiAgVGhlIGZpcnN0IHN0cnVjdHVyZSBvbiB0aGUgbGlzdCBpcyB0aGUgbWFpbgotICAgICBibG9jayBvZiB0aGUgZnVuY3Rpb24sIGFuZCBkZXNjcmliZXMgZnVuY3Rpb24gbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpibG9ja3M7Ci19OwotCi0vKiBBIGZ1bmN0aW9uIHBhcmFtZXRlci4gICovCi0KLXN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIKLXsKLSAgLyogTmV4dCBwYXJhbWV0ZXIuICAqLwotICBzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICpuZXh0OwotICAvKiBOYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogS2luZC4gICovCi0gIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gIC8qIFZhbHVlIChtZWFuaW5nIGRlcGVuZHMgdXBvbiBraW5kKS4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogQSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudAotewotICAvKiBUeXBlLiAgKi8KLSAgZGVidWdfdHlwZSB0eXBlOwotICAvKiBWYWx1ZS4gIEZJWE1FOiBXZSBtYXkgZXZlbnR1YWxseSBuZWVkIHRvIHN1cHBvcnQgbm9uLWludGVncmFsCi0gICAgIHZhbHVlcy4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogSW5mb3JtYXRpb24gYWJvdXQgYSBibG9jayB3aXRoaW4gYSBmdW5jdGlvbi4gICovCi0KLXN0cnVjdCBkZWJ1Z19ibG9jawotewotICAvKiBOZXh0IGJsb2NrIHdpdGggdGhlIHNhbWUgcGFyZW50LiAgKi8KLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpuZXh0OwotICAvKiBQYXJlbnQgYmxvY2suICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKnBhcmVudDsKLSAgLyogTGlzdCBvZiBjaGlsZCBibG9ja3MuICAqLwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmNoaWxkcmVuOwotICAvKiBTdGFydCBhZGRyZXNzIG9mIHRoZSBibG9jay4gICovCi0gIGJmZF92bWEgc3RhcnQ7Ci0gIC8qIEVuZCBhZGRyZXNzIG9mIHRoZSBibG9jay4gICovCi0gIGJmZF92bWEgZW5kOwotICAvKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZXNwYWNlICpsb2NhbHM7Ci19OwotCi0vKiBMaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQuICBGSVhNRToKLSAgIFRoaXMgc3RydWN0dXJlIGlzIGVhc3kgdG8gY3JlYXRlLCBidXQgY2FuIGJlIHZlcnkgc3BhY2UKLSAgIGluZWZmaWNpZW50LiAgKi8KLQotc3RydWN0IGRlYnVnX2xpbmVubwotewotICAvKiBNb3JlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciB0aGlzIGJsb2NrLiAgKi8KLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqbmV4dDsKLSAgLyogU291cmNlIGZpbGUuICAqLwotICBzdHJ1Y3QgZGVidWdfZmlsZSAqZmlsZTsKLSAgLyogTGluZSBudW1iZXJzLCB0ZXJtaW5hdGVkIGJ5IGEgLTEgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXkuICAqLwotI2RlZmluZSBERUJVR19MSU5FTk9fQ09VTlQgMTAKLSAgdW5zaWduZWQgbG9uZyBsaW5lbm9zW0RFQlVHX0xJTkVOT19DT1VOVF07Ci0gIC8qIEFkZHJlc3NlcyBmb3IgdGhlIGxpbmUgbnVtYmVycy4gICovCi0gIGJmZF92bWEgYWRkcnNbREVCVUdfTElORU5PX0NPVU5UXTsKLX07Ci0KLS8qIEEgbmFtZXNwYWNlLiAgVGhpcyBpcyBhIG1hcHBpbmcgZnJvbSBuYW1lcyB0byBvYmplY3RzLiAgRklYTUU6IFRoaXMKLSAgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZXNwYWNlCi17Ci0gIC8qIExpc3Qgb2YgaXRlbXMgaW4gdGhpcyBuYW1lc3BhY2UuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbGlzdDsKLSAgLyogUG9pbnRlciB0byB3aGVyZSB0aGUgbmV4dCBpdGVtIGluIHRoaXMgbmFtZXNwYWNlIHNob3VsZCBnby4gICovCi0gIHN0cnVjdCBkZWJ1Z19uYW1lICoqdGFpbDsKLX07Ci0KLS8qIEtpbmRzIG9mIG9iamVjdHMgdGhhdCBhcHBlYXIgaW4gYSBuYW1lc3BhY2UuICAqLwotCi1lbnVtIGRlYnVnX29iamVjdF9raW5kCi17Ci0gIC8qIEEgdHlwZS4gICovCi0gIERFQlVHX09CSkVDVF9UWVBFLAotICAvKiBBIHRhZ2dlZCB0eXBlIChyZWFsbHkgYSBkaWZmZXJlbnQgc29ydCBvZiBuYW1lc3BhY2UpLiAgKi8KLSAgREVCVUdfT0JKRUNUX1RBRywKLSAgLyogQSB2YXJpYWJsZS4gICovCi0gIERFQlVHX09CSkVDVF9WQVJJQUJMRSwKLSAgLyogQSBmdW5jdGlvbi4gICovCi0gIERFQlVHX09CSkVDVF9GVU5DVElPTiwKLSAgLyogQW4gaW50ZWdlciBjb25zdGFudC4gICovCi0gIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQsCi0gIC8qIEEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotICBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQsCi0gIC8qIEEgdHlwZWQgY29uc3RhbnQuICAqLwotICBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQKLX07Ci0KLS8qIExpbmthZ2Ugb2YgYW4gb2JqZWN0IHRoYXQgYXBwZWFycyBpbiBhIG5hbWVzcGFjZS4gICovCi0KLWVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UKLXsKLSAgLyogTG9jYWwgdmFyaWFibGUuICAqLwotICBERUJVR19MSU5LQUdFX0FVVE9NQVRJQywKLSAgLyogU3RhdGljLS1laXRoZXIgZmlsZSBzdGF0aWMgb3IgZnVuY3Rpb24gc3RhdGljLCBkZXBlbmRpbmcgdXBvbiB0aGUKLSAgICAgbmFtZXNwYWNlIGlzLiAgKi8KLSAgREVCVUdfTElOS0FHRV9TVEFUSUMsCi0gIC8qIEdsb2JhbC4gICovCi0gIERFQlVHX0xJTktBR0VfR0xPQkFMLAotICAvKiBObyBsaW5rYWdlLiAgKi8KLSAgREVCVUdfTElOS0FHRV9OT05FCi19OwotCi0vKiBBIG5hbWUgaW4gYSBuYW1lc3BhY2UuICAqLwotCi1zdHJ1Y3QgZGVidWdfbmFtZQotewotICAvKiBOZXh0IG5hbWUgaW4gdGhpcyBuYW1lc3BhY2UuICAqLwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbmV4dDsKLSAgLyogTmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIE1hcmsuICBUaGlzIGlzIHVzZWQgYnkgZGVidWdfd3JpdGUuICAqLwotICB1bnNpZ25lZCBpbnQgbWFyazsKLSAgLyogS2luZCBvZiBvYmplY3QuICAqLwotICBlbnVtIGRlYnVnX29iamVjdF9raW5kIGtpbmQ7Ci0gIC8qIExpbmthZ2Ugb2Ygb2JqZWN0LiAgKi8KLSAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotICAvKiBUYWdnZWQgdW5pb24gd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvYmplY3QuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9UWVBFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0eXBlOwotICAgICAgLyogREVCVUdfT0JKRUNUX1RBRy4gICovCi0gICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdGFnOwotICAgICAgLyogREVCVUdfT0JKRUNUX1ZBUklBQkxFLiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z192YXJpYWJsZSAqdmFyaWFibGU7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfRlVOQ1RJT04uICAqLwotICAgICAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICpmdW5jdGlvbjsKLSAgICAgIC8qIERFQlVHX09CSkVDVF9JTlRfQ09OU1RBTlQuICAqLwotICAgICAgYmZkX3ZtYSBpbnRfY29uc3RhbnQ7Ci0gICAgICAvKiBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQuICAqLwotICAgICAgZG91YmxlIGZsb2F0X2NvbnN0YW50OwotICAgICAgLyogREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5ULiAgKi8KLSAgICAgIHN0cnVjdCBkZWJ1Z190eXBlZF9jb25zdGFudCAqdHlwZWRfY29uc3RhbnQ7Ci0gICAgfSB1OwotfTsKLQotLyogRHVyaW5nIGRlYnVnX3dyaXRlLCBhIGxpbmtlZCBsaXN0IG9mIHRoZXNlIHN0cnVjdHVyZXMgaXMgdXNlZCB0bwotICAga2VlcCB0cmFjayBvZiBJRCBudW1iZXJzIHRoYXQgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGNsYXNzZXMuICAqLwotCi1zdHJ1Y3QgZGVidWdfY2xhc3NfaWQKLXsKLSAgLyogTmV4dCBJRCBudW1iZXIuICAqLwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKm5leHQ7Ci0gIC8qIFRoZSB0eXBlIHdpdGggdGhlIElELiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gIC8qIFRoZSB0YWc7IE5VTEwgaWYgbm8gdGFnLiAgKi8KLSAgY29uc3QgY2hhciAqdGFnOwotfTsKLQotLyogRHVyaW5nIGRlYnVnX3R5cGVfc2FtZXAsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBrZXB0Ci0gICBvbiB0aGUgc3RhY2sgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0Ci17Ci0gIC8qIE5leHQgdHlwZSBvbiBsaXN0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGVfY29tcGFyZV9saXN0ICpuZXh0OwotICAvKiBUaGUgdHlwZXMgd2UgYXJlIGNvbXBhcmluZy4gICovCi0gIHN0cnVjdCBkZWJ1Z190eXBlICp0MTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQyOwotfTsKLQotLyogRHVyaW5nIGRlYnVnX2dldF9yZWFsX3R5cGUsIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcwotICAga2VwdCBvbiB0aGUgc3RhY2sgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLiAgKi8KLQotc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0Ci17Ci0gIC8qIE5leHQgdHlwZSBvbiBsaXN0LiAgKi8KLSAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICpuZXh0OwotICAvKiBUaGUgdHlwZSB3ZSBhcmUgY2hlY2tpbmcuICAqLwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLX07Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGRlYnVnX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z19uYW1lICpkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKiwgY29uc3QgY2hhciAqLAotCSAgIGVudW0gZGVidWdfb2JqZWN0X2tpbmQsIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UpKTsKLXN0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX29iamVjdF9raW5kLAotCSAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UpKTsKLXN0YXRpYyBzdHJ1Y3QgZGVidWdfdHlwZSAqZGVidWdfbWFrZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgZW51bSBkZWJ1Z190eXBlX2tpbmQsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICpkZWJ1Z19nZXRfcmVhbF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGRlYnVnX3dyaXRlX25hbWUKLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBzdHJ1Y3QgZGVidWdfbmFtZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX25hbWUgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfY2xhc3NfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z190eXBlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfd3JpdGVfZnVuY3Rpb24KLSAgUEFSQU1TICgoc3RydWN0IGRlYnVnX2hhbmRsZSAqLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUiwKLQkgICBjb25zdCBjaGFyICosIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UsIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9ibG9jawotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKiwgUFRSLAotCSAgIHN0cnVjdCBkZWJ1Z19ibG9jayAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z193cml0ZV9saW5lbm9zCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqLCBQVFIsCi0JICAgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfc2V0X2NsYXNzX2lkCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGVidWdfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkZWJ1Z190eXBlX3NhbWVwCi0gIFBBUkFNUyAoKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKiwgc3RydWN0IGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZGVidWdfY2xhc3NfdHlwZV9zYW1lcAotICBQQVJBTVMgKChzdHJ1Y3QgZGVidWdfaGFuZGxlICosIHN0cnVjdCBkZWJ1Z190eXBlICosIHN0cnVjdCBkZWJ1Z190eXBlICopKTsKLQwKLS8qIElzc3VlIGFuIGVycm9yIG1lc3NhZ2UuICAqLwotCi1zdGF0aWMgdm9pZAotZGVidWdfZXJyb3IgKG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzXG4iLCBtZXNzYWdlKTsKLX0KLQotLyogQWRkIGFuIG9iamVjdCB0byBhIG5hbWVzcGFjZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZGVidWdfbmFtZSAqCi1kZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCBuc3AsIG5hbWUsIGtpbmQsIGxpbmthZ2UpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKipuc3A7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2tpbmQga2luZDsKLSAgICAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotewotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqbnM7Ci0KLSAgbiA9IChzdHJ1Y3QgZGVidWdfbmFtZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+bmFtZSA9IG5hbWU7Ci0gIG4tPmtpbmQgPSBraW5kOwotICBuLT5saW5rYWdlID0gbGlua2FnZTsKLQotICBucyA9ICpuc3A7Ci0gIGlmIChucyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5zID0gKHN0cnVjdCBkZWJ1Z19uYW1lc3BhY2UgKikgeG1hbGxvYyAoc2l6ZW9mICpucyk7Ci0gICAgICBtZW1zZXQgKG5zLCAwLCBzaXplb2YgKm5zKTsKLQotICAgICAgbnMtPnRhaWwgPSAmbnMtPmxpc3Q7Ci0KLSAgICAgICpuc3AgPSBuczsKLSAgICB9Ci0KLSAgKm5zLT50YWlsID0gbjsKLSAgbnMtPnRhaWwgPSAmbi0+bmV4dDsKLQotICByZXR1cm4gbjsKLX0KLQotLyogQWRkIGFuIG9iamVjdCB0byB0aGUgY3VycmVudCBuYW1lc3BhY2UuICAqLwotCi1zdGF0aWMgc3RydWN0IGRlYnVnX25hbWUgKgotZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBraW5kLCBsaW5rYWdlKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9raW5kIGtpbmQ7Ci0gICAgIGVudW0gZGVidWdfb2JqZWN0X2xpbmthZ2UgbGlua2FnZTsKLXsKLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKm5zcDsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19hZGRfdG9fY3VycmVudF9uYW1lc3BhY2U6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoaW5mby0+Y3VycmVudF9ibG9jayAhPSBOVUxMKQotICAgIG5zcCA9ICZpbmZvLT5jdXJyZW50X2Jsb2NrLT5sb2NhbHM7Ci0gIGVsc2UKLSAgICBuc3AgPSAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzOwotCi0gIHJldHVybiBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCBuc3AsIG5hbWUsIGtpbmQsIGxpbmthZ2UpOwotfQotDAotLyogUmV0dXJuIGEgaGFuZGxlIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1QVFIKLWRlYnVnX2luaXQgKCkKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgbWVtc2V0IChyZXQsIDAsIHNpemVvZiAqcmV0KTsKLSAgcmV0dXJuIChQVFIpIHJldDsKLX0KLQotLyogU2V0IHRoZSBzb3VyY2UgZmlsZW5hbWUuICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgbmV3IGNvbXBpbGF0aW9uCi0gICB1bml0LiAgKi8KLQotYm9vbGVhbgotZGVidWdfc2V0X2ZpbGVuYW1lIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19maWxlICpuZmlsZTsKLSAgc3RydWN0IGRlYnVnX3VuaXQgKm51bml0OwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgbmFtZSA9ICIiOwotCi0gIG5maWxlID0gKHN0cnVjdCBkZWJ1Z19maWxlICopIHhtYWxsb2MgKHNpemVvZiAqbmZpbGUpOwotICBtZW1zZXQgKG5maWxlLCAwLCBzaXplb2YgKm5maWxlKTsKLQotICBuZmlsZS0+ZmlsZW5hbWUgPSBuYW1lOwotCi0gIG51bml0ID0gKHN0cnVjdCBkZWJ1Z191bml0ICopIHhtYWxsb2MgKHNpemVvZiAqbnVuaXQpOwotICBtZW1zZXQgKG51bml0LCAwLCBzaXplb2YgKm51bml0KTsKLQotICBudW5pdC0+ZmlsZXMgPSBuZmlsZTsKLSAgaW5mby0+Y3VycmVudF9maWxlID0gbmZpbGU7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCAhPSBOVUxMKQotICAgIGluZm8tPmN1cnJlbnRfdW5pdC0+bmV4dCA9IG51bml0OwotICBlbHNlCi0gICAgewotICAgICAgYXNzZXJ0IChpbmZvLT51bml0cyA9PSBOVUxMKTsKLSAgICAgIGluZm8tPnVuaXRzID0gbnVuaXQ7Ci0gICAgfQotCi0gIGluZm8tPmN1cnJlbnRfdW5pdCA9IG51bml0OwotCi0gIGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPSBOVUxMOwotICBpbmZvLT5jdXJyZW50X2Jsb2NrID0gTlVMTDsKLSAgaW5mby0+Y3VycmVudF9saW5lbm8gPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDaGFuZ2Ugc291cmNlIGZpbGVzIHRvIHRoZSBnaXZlbiBmaWxlIG5hbWUuICBUaGlzIGlzIHVzZWQgZm9yCi0gICBpbmNsdWRlIGZpbGVzIGluIGEgc2luZ2xlIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19zdGFydF9zb3VyY2UgKGhhbmRsZSwgbmFtZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2ZpbGUgKmYsICoqcGY7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19zdGFydF9zb3VyY2U6IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmb3IgKGYgPSBpbmZvLT5jdXJyZW50X3VuaXQtPmZpbGVzOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChmLT5maWxlbmFtZVswXSA9PSBuYW1lWzBdCi0JICAmJiBmLT5maWxlbmFtZVsxXSA9PSBuYW1lWzFdCi0JICAmJiBzdHJjbXAgKGYtPmZpbGVuYW1lLCBuYW1lKSA9PSAwKQotCXsKLQkgIGluZm8tPmN1cnJlbnRfZmlsZSA9IGY7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICpmKTsKLSAgbWVtc2V0IChmLCAwLCBzaXplb2YgKmYpOwotCi0gIGYtPmZpbGVuYW1lID0gbmFtZTsKLQotICBmb3IgKHBmID0gJmluZm8tPmN1cnJlbnRfZmlsZS0+bmV4dDsKLSAgICAgICAqcGYgIT0gTlVMTDsKLSAgICAgICBwZiA9ICYoKnBmKS0+bmV4dCkKLSAgICA7Ci0gICpwZiA9IGY7Ci0KLSAgaW5mby0+Y3VycmVudF9maWxlID0gZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoaXMgaW1wbGljaXRseSBzdGFydHMgYSBmdW5jdGlvbgotICAgYmxvY2suICBUaGUgZGVidWdfdHlwZSBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlLgotICAgVGhlIGJvb2xlYW4gaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGdsb2JhbGx5IHZpc2libGUuCi0gICBUaGUgYmZkX3ZtYSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgQ3VycmVudGx5Ci0gICB0aGUgcGFyYW1ldGVyIHR5cGVzIGFyZSBzcGVjaWZpZWQgYnkgY2FsbHMgdG8KLSAgIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIuICBGSVhNRTogVGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgbmVzdGVkCi0gICBmdW5jdGlvbnMuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGhhbmRsZSwgbmFtZSwgcmV0dXJuX3R5cGUsIGdsb2JhbCwgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgICAgYm9vbGVhbiBnbG9iYWw7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2Z1bmN0aW9uICpmOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgbmFtZSA9ICIiOwotICBpZiAocmV0dXJuX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfZnVuY3Rpb246IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBmID0gKHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+cmV0dXJuX3R5cGUgPSByZXR1cm5fdHlwZTsKLQotICBiID0gKHN0cnVjdCBkZWJ1Z19ibG9jayAqKSB4bWFsbG9jIChzaXplb2YgKmIpOwotICBtZW1zZXQgKGIsIDAsIHNpemVvZiAqYik7Ci0KLSAgYi0+c3RhcnQgPSBhZGRyOwotICBiLT5lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgZi0+YmxvY2tzID0gYjsKLQotICBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID0gZjsKLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IGI7Ci0KLSAgLyogRklYTUU6IElmIHdlIGNvdWxkIGhhbmRsZSBuZXN0ZWQgZnVuY3Rpb25zLCB0aGlzIHdvdWxkIGJlIHRoZQotICAgICBwbGFjZTogd2Ugd291bGQgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbmFtZXNwYWNlLiAgKi8KLSAgbiA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sCi0JCQkgICAgICAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzLAotCQkJICAgICAgbmFtZSwKLQkJCSAgICAgIERFQlVHX09CSkVDVF9GVU5DVElPTiwKLQkJCSAgICAgIChnbG9iYWwKLQkJCSAgICAgICA/IERFQlVHX0xJTktBR0VfR0xPQkFMCi0JCQkgICAgICAgOiBERUJVR19MSU5LQUdFX1NUQVRJQykpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuLT51LmZ1bmN0aW9uID0gZjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgcGFyYW1ldGVyIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGhhbmRsZSwgbmFtZSwgdHlwZSwga2luZCwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfcGFybV9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICpwLCAqKnBwOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZnVuY3Rpb24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX3BhcmFtZXRlcjogbm8gY3VycmVudCBmdW5jdGlvbiIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcCA9IChzdHJ1Y3QgZGVidWdfcGFyYW1ldGVyICopIHhtYWxsb2MgKHNpemVvZiAqcCk7Ci0gIG1lbXNldCAocCwgMCwgc2l6ZW9mICpwKTsKLQotICBwLT5uYW1lID0gbmFtZTsKLSAgcC0+dHlwZSA9IHR5cGU7Ci0gIHAtPmtpbmQgPSBraW5kOwotICBwLT52YWwgPSB2YWw7Ci0KLSAgZm9yIChwcCA9ICZpbmZvLT5jdXJyZW50X2Z1bmN0aW9uLT5wYXJhbWV0ZXJzOwotICAgICAgICpwcCAhPSBOVUxMOwotICAgICAgIHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gcDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIGEgZnVuY3Rpb24uICBGSVhNRTogVGhpcyBzaG91bGQgaGFuZGxlIGZ1bmN0aW9uIG5lc3RpbmcuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19lbmRfZnVuY3Rpb24gKGhhbmRsZSwgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTAotICAgICAgfHwgaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9mdW5jdGlvbjogbm8gY3VycmVudCBmdW5jdGlvbiIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfYmxvY2stPnBhcmVudCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfZnVuY3Rpb246IHNvbWUgYmxvY2tzIHdlcmUgbm90IGNsb3NlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+Y3VycmVudF9ibG9jay0+ZW5kID0gYWRkcjsKLQotICBpbmZvLT5jdXJyZW50X2Z1bmN0aW9uID0gTlVMTDsKLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIEFsbCBsb2NhbCBpbmZvcm1hdGlvbiB3aWxsIGJlCi0gICByZWNvcmRlZCBpbiB0aGlzIGJsb2NrLCB1bnRpbCB0aGUgbWF0Y2hpbmcgY2FsbCB0byBkZWJ1Z19lbmRfYmxvY2suCi0gICBkZWJ1Z19zdGFydF9ibG9jayBhbmQgZGVidWdfZW5kX2Jsb2NrIG1heSBiZSBuZXN0ZWQuICBUaGUgYmZkX3ZtYQotICAgYXJndW1lbnQgaXMgdGhlIGFkZHJlc3MgYXQgd2hpY2ggdGhpcyBibG9jayBzdGFydHMuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19zdGFydF9ibG9jayAoaGFuZGxlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYiwgKipwYjsKLQotICAvKiBXZSBtdXN0IGFsd2F5cyBoYXZlIGEgY3VycmVudCBibG9jazogZGVidWdfcmVjb3JkX2Z1bmN0aW9uIHNldHMKLSAgICAgb25lIHVwLiAgKi8KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3N0YXJ0X2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiID0gKHN0cnVjdCBkZWJ1Z19ibG9jayAqKSB4bWFsbG9jIChzaXplb2YgKmIpOwotICBtZW1zZXQgKGIsIDAsIHNpemVvZiAqYik7Ci0KLSAgYi0+cGFyZW50ID0gaW5mby0+Y3VycmVudF9ibG9jazsKLSAgYi0+c3RhcnQgPSBhZGRyOwotICBiLT5lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgLyogVGhpcyBuZXcgYmxvY2sgaXMgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBibG9jay4gICovCi0gIGZvciAocGIgPSAmaW5mby0+Y3VycmVudF9ibG9jay0+Y2hpbGRyZW47Ci0gICAgICAgKnBiICE9IE5VTEw7Ci0gICAgICAgcGIgPSAmKCpwYiktPm5leHQpCi0gICAgOwotICAqcGIgPSBiOwotCi0gIGluZm8tPmN1cnJlbnRfYmxvY2sgPSBiOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggYSBibG9jayBpbiBhIGZ1bmN0aW9uLiAgVGhpcyBtYXRjaGVzIHRoZSBjYWxsIHRvCi0gICBkZWJ1Z19zdGFydF9ibG9jay4gIFRoZSBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGlzIGJsb2NrCi0gICBlbmRzLiAgKi8KLQotYm9vbGVhbgotZGVidWdfZW5kX2Jsb2NrIChoYW5kbGUsIGFkZHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2Jsb2NrICpwYXJlbnQ7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMCi0gICAgICB8fCBpbmZvLT5jdXJyZW50X2Jsb2NrID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9ibG9jazogbm8gY3VycmVudCBibG9jayIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcGFyZW50ID0gaW5mby0+Y3VycmVudF9ibG9jay0+cGFyZW50OwotICBpZiAocGFyZW50ID09IE5VTEwpCi0gICAgewotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX2VuZF9ibG9jazogYXR0ZW1wdCB0byBjbG9zZSB0b3AgbGV2ZWwgYmxvY2siKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPmN1cnJlbnRfYmxvY2stPmVuZCA9IGFkZHI7Ci0KLSAgaW5mby0+Y3VycmVudF9ibG9jayA9IHBhcmVudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXNzb2NpYXRlIGEgbGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgYW5kIGZ1bmN0aW9uCi0gICB3aXRoIGEgZ2l2ZW4gYWRkcmVzcy4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9saW5lIChoYW5kbGUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX2xpbmVubyAqbDsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKGluZm8tPmN1cnJlbnRfdW5pdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfbGluZTogbm8gY3VycmVudCB1bml0IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBsID0gaW5mby0+Y3VycmVudF9saW5lbm87Ci0gIGlmIChsICE9IE5VTEwgJiYgbC0+ZmlsZSA9PSBpbmZvLT5jdXJyZW50X2ZpbGUpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IERFQlVHX0xJTkVOT19DT1VOVDsgaSsrKQotCXsKLQkgIGlmIChsLT5saW5lbm9zW2ldID09ICh1bnNpZ25lZCBsb25nKSAtMSkKLQkgICAgewotCSAgICAgIGwtPmxpbmVub3NbaV0gPSBsaW5lbm87Ci0JICAgICAgbC0+YWRkcnNbaV0gPSBhZGRyOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiBlaXRoZXIgMSkgdGhlcmUgaXMgbm8gY3VycmVudF9saW5lbm8KLSAgICAgc3RydWN0dXJlLCB3aGljaCBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdCBsaW5lIG51bWJlciBpbiB0aGlzCi0gICAgIGNvbXBpbGF0aW9uIHVuaXQsIDIpIHRoZSBjdXJyZW50X2xpbmVubyBzdHJ1Y3R1cmUgaXMgZm9yIGEKLSAgICAgZGlmZmVyZW50IGZpbGUsIG9yIDMpIHRoZSBjdXJyZW50X2xpbmVubyBzdHJ1Y3R1cmUgaXMgZnVsbC4KLSAgICAgUmVnYXJkbGVzcywgd2Ugd2FudCB0byBhbGxvY2F0ZSBhIG5ldyBkZWJ1Z19saW5lbm8gc3RydWN0dXJlLCBwdXQKLSAgICAgaXQgaW4gdGhlIHJpZ2h0IHBsYWNlLCBhbmQgbWFrZSBpdCB0aGUgbmV3IGN1cnJlbnRfbGluZW5vCi0gICAgIHN0cnVjdHVyZS4gICovCi0KLSAgbCA9IChzdHJ1Y3QgZGVidWdfbGluZW5vICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIG1lbXNldCAobCwgMCwgc2l6ZW9mICpsKTsKLQotICBsLT5maWxlID0gaW5mby0+Y3VycmVudF9maWxlOwotICBsLT5saW5lbm9zWzBdID0gbGluZW5vOwotICBsLT5hZGRyc1swXSA9IGFkZHI7Ci0gIGZvciAoaSA9IDE7IGkgPCBERUJVR19MSU5FTk9fQ09VTlQ7IGkrKykKLSAgICBsLT5saW5lbm9zW2ldID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X2xpbmVubyAhPSBOVUxMKQotICAgIGluZm8tPmN1cnJlbnRfbGluZW5vLT5uZXh0ID0gbDsKLSAgZWxzZQotICAgIGluZm8tPmN1cnJlbnRfdW5pdC0+bGluZW5vcyA9IGw7Ci0KLSAgaW5mby0+Y3VycmVudF9saW5lbm8gPSBsOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIG5hbWVkIGNvbW1vbiBibG9jay4gIFRoaXMgaXMgYSBibG9jayBvZiB2YXJpYWJsZXMgdGhhdCBtYXkKLSAgIG1vdmUgaW4gbWVtb3J5LiAgKi8KLQotYm9vbGVhbgotZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIEZJWE1FICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19zdGFydF9jb21tb25fYmxvY2s6IG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBFbmQgYSBuYW1lZCBjb21tb24gYmxvY2suICAqLwotCi1ib29sZWFuCi1kZWJ1Z19lbmRfY29tbW9uX2Jsb2NrIChoYW5kbGUsIG5hbWUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIEZJWE1FICovCi0gIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogUmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9pbnRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19jdXJyZW50X25hbWVzcGFjZSAoaW5mbywgbmFtZSwgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVCwKLQkJCQkgICAgICBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuLT51LmludF9jb25zdGFudCA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1ib29sZWFuCi1kZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgKGhhbmRsZSwgbmFtZSwgdmFsKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkb3VibGUgdmFsOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfRkxPQVRfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbi0+dS5mbG9hdF9jb25zdGFudCA9IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGEgdHlwZWQgY29uc3RhbnQgd2l0aCBhbiBpbnRlZ3JhbCB2YWx1ZS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF90eXBlZF9jb25zdCAoaGFuZGxlLCBuYW1lLCB0eXBlLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotICBzdHJ1Y3QgZGVidWdfdHlwZWRfY29uc3RhbnQgKnRjOwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlIChpbmZvLCBuYW1lLCBERUJVR19PQkpFQ1RfVFlQRURfQ09OU1RBTlQsCi0JCQkJICAgICAgREVCVUdfTElOS0FHRV9OT05FKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdGMgPSAoc3RydWN0IGRlYnVnX3R5cGVkX2NvbnN0YW50ICopIHhtYWxsb2MgKHNpemVvZiAqdGMpOwotICBtZW1zZXQgKHRjLCAwLCBzaXplb2YgKnRjKTsKLQotICB0Yy0+dHlwZSA9IHR5cGU7Ci0gIHRjLT52YWwgPSB2YWw7Ci0KLSAgbi0+dS50eXBlZF9jb25zdGFudCA9IHRjOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSBsYWJlbC4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF9sYWJlbCAoaGFuZGxlLCBuYW1lLCB0eXBlLCBhZGRyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgLyogRklYTUUuICAqLwotICBkZWJ1Z19lcnJvciAoXygiZGVidWdfcmVjb3JkX2xhYmVsIG5vdCBpbXBsZW1lbnRlZCIpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBSZWNvcmQgYSB2YXJpYWJsZS4gICovCi0KLWJvb2xlYW4KLWRlYnVnX3JlY29yZF92YXJpYWJsZSAoaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX25hbWVzcGFjZSAqKm5zcDsKLSAgZW51bSBkZWJ1Z19vYmplY3RfbGlua2FnZSBsaW5rYWdlOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLSAgc3RydWN0IGRlYnVnX3ZhcmlhYmxlICp2OwotCi0gIGlmIChuYW1lID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGtpbmQgPT0gREVCVUdfR0xPQkFMIHx8IGtpbmQgPT0gREVCVUdfU1RBVElDKQotICAgIHsKLSAgICAgIG5zcCA9ICZpbmZvLT5jdXJyZW50X2ZpbGUtPmdsb2JhbHM7Ci0gICAgICBpZiAoa2luZCA9PSBERUJVR19HTE9CQUwpCi0JbGlua2FnZSA9IERFQlVHX0xJTktBR0VfR0xPQkFMOwotICAgICAgZWxzZQotCWxpbmthZ2UgPSBERUJVR19MSU5LQUdFX1NUQVRJQzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5mby0+Y3VycmVudF9ibG9jayA9PSBOVUxMKQotCXsKLQkgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19yZWNvcmRfdmFyaWFibGU6IG5vIGN1cnJlbnQgYmxvY2siKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgbnNwID0gJmluZm8tPmN1cnJlbnRfYmxvY2stPmxvY2FsczsKLSAgICAgIGxpbmthZ2UgPSBERUJVR19MSU5LQUdFX0FVVE9NQVRJQzsKLSAgICB9Ci0KLSAgbiA9IGRlYnVnX2FkZF90b19uYW1lc3BhY2UgKGluZm8sIG5zcCwgbmFtZSwgREVCVUdfT0JKRUNUX1ZBUklBQkxFLCBsaW5rYWdlKTsKLSAgaWYgKG4gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdiA9IChzdHJ1Y3QgZGVidWdfdmFyaWFibGUgKikgeG1hbGxvYyAoc2l6ZW9mICp2KTsKLSAgbWVtc2V0ICh2LCAwLCBzaXplb2YgKnYpOwotCi0gIHYtPmtpbmQgPSBraW5kOwotICB2LT50eXBlID0gdHlwZTsKLSAgdi0+dmFsID0gdmFsOwotCi0gIG4tPnUudmFyaWFibGUgPSB2OwotCi0gIHJldHVybiB0cnVlOyAgCi19Ci0KLS8qIE1ha2UgYSB0eXBlIHdpdGggYSBnaXZlbiBraW5kIGFuZCBzaXplLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgc3RydWN0IGRlYnVnX3R5cGUgKgotZGVidWdfbWFrZV90eXBlIChpbmZvLCBraW5kLCBzaXplKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgdCA9IChzdHJ1Y3QgZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnQpOwotICBtZW1zZXQgKHQsIDAsIHNpemVvZiAqdCk7Ci0KLSAgdC0+a2luZCA9IGtpbmQ7Ci0gIHQtPnNpemUgPSBzaXplOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIGluZGlyZWN0IHR5cGUgd2hpY2ggbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgYSB0eXBlCi0gICB3aGljaCBpcyByZWZlcmVuY2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChoYW5kbGUsIHNsb3QsIHRhZykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSAqc2xvdDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2luZGlyZWN0X3R5cGUgKmk7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9JTkRJUkVDVCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpID0gKHN0cnVjdCBkZWJ1Z19pbmRpcmVjdF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqaSk7Ci0gIG1lbXNldCAoaSwgMCwgc2l6ZW9mICppKTsKLQotICBpLT5zbG90ID0gc2xvdDsKLSAgaS0+dGFnID0gdGFnOwotCi0gIHQtPnUua2luZGlyZWN0ID0gaTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gIFRoZXJlIGlzIG9ubHkgb25lIG9mIHRoZXNlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV92b2lkX3R5cGUgKGhhbmRsZSkKLSAgICAgUFRSIGhhbmRsZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLQotICByZXR1cm4gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1ZPSUQsIDApOwotfQotCi0vKiBNYWtlIGFuIGludGVnZXIgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBUaGUgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlCi0gICBpZiB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfaW50X3R5cGUgKGhhbmRsZSwgc2l6ZSwgdW5zaWduZWRwKQotICAgICBQVFIgaGFuZGxlOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfSU5ULCBzaXplKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua2ludCA9IHVuc2lnbmVkcDsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIGZsb2F0aW5nIHBvaW50IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgRklYTUU6IE9uIHNvbWUKLSAgIHBsYXRmb3JtcywgbGlrZSBhbiBBbHBoYSwgeW91IHByb2JhYmx5IG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5Ci0gICB0aGUgZm9ybWF0LiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9mbG9hdF90eXBlIChoYW5kbGUsIHNpemUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfRkxPQVQsIHNpemUpOwotfQotCi0vKiBNYWtlIGEgYm9vbGVhbiB0eXBlIG9mIGEgZ2l2ZW4gc2l6ZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfYm9vbF90eXBlIChoYW5kbGUsIHNpemUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfQk9PTCwgc2l6ZSk7Ci19Ci0KLS8qIE1ha2UgYSBjb21wbGV4IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9jb21wbGV4X3R5cGUgKGhhbmRsZSwgc2l6ZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9DT01QTEVYLCBzaXplKTsKLX0KLQotLyogTWFrZSBhIHN0cnVjdHVyZSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0cnVlIGZvciBhIHN0cnVjdCwKLSAgIGZhbHNlIGZvciBhIHVuaW9uLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QuCi0gICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGZpZWxkcy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGhhbmRsZSwgc3RydWN0cCwgc2l6ZSwgZmllbGRzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIGJmZF92bWEgc2l6ZTsKLSAgICAgZGVidWdfZmllbGQgKmZpZWxkczsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sCi0JCSAgICAgICBzdHJ1Y3RwID8gREVCVUdfS0lORF9TVFJVQ1QgOiBERUJVR19LSU5EX1VOSU9OLAotCQkgICAgICAgc2l6ZSk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBjID0gKHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqYyk7Ci0gIG1lbXNldCAoYywgMCwgc2l6ZW9mICpjKTsKLQotICBjLT5maWVsZHMgPSBmaWVsZHM7Ci0KLSAgdC0+dS5rY2xhc3MgPSBjOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIG9iamVjdCB0eXBlLiAgVGhlIGZpcnN0IHRocmVlIGFyZ3VtZW50cyBhZnRlciB0aGUgaGFuZGxlCi0gICBhcmUgdGhlIHNhbWUgYXMgZm9yIGRlYnVnX21ha2Vfc3RydWN0X3R5cGUuICBUaGUgbmV4dCBhcmd1bWVudHMgYXJlCi0gICBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBiYXNlIGNsYXNzZXMsIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mCi0gICBtZXRob2RzLCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGhvbGRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUKLSAgIGlmIGl0IGlzIG5vdCB0aGlzIG9iamVjdCwgYW5kIGEgYm9vbGVhbiB3aGljaCBpcyB0cnVlIGlmIHRoaXMKLSAgIG9iamVjdCBoYXMgaXRzIG93biB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9vYmplY3RfdHlwZSAoaGFuZGxlLCBzdHJ1Y3RwLCBzaXplLCBmaWVsZHMsIGJhc2VjbGFzc2VzLAotCQkJbWV0aG9kcywgdnB0cmJhc2UsIG93bnZwdHIpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgYmZkX3ZtYSBzaXplOwotICAgICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICAgICBkZWJ1Z19iYXNlY2xhc3MgKmJhc2VjbGFzc2VzOwotICAgICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gICAgIGRlYnVnX3R5cGUgdnB0cmJhc2U7Ci0gICAgIGJvb2xlYW4gb3dudnB0cjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjOwotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sCi0JCSAgICAgICBzdHJ1Y3RwID8gREVCVUdfS0lORF9DTEFTUyA6IERFQlVHX0tJTkRfVU5JT05fQ0xBU1MsCi0JCSAgICAgICBzaXplKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGMgPSAoc3RydWN0IGRlYnVnX2NsYXNzX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpjKTsKLSAgbWVtc2V0IChjLCAwLCBzaXplb2YgKmMpOwotCi0gIGMtPmZpZWxkcyA9IGZpZWxkczsKLSAgYy0+YmFzZWNsYXNzZXMgPSBiYXNlY2xhc3NlczsKLSAgYy0+bWV0aG9kcyA9IG1ldGhvZHM7Ci0gIGlmIChvd252cHRyKQotICAgIGMtPnZwdHJiYXNlID0gdDsKLSAgZWxzZQotICAgIGMtPnZwdHJiYXNlID0gdnB0cmJhc2U7Ci0KLSAgdC0+dS5rY2xhc3MgPSBjOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGFuIGVudW1lcmF0aW9uIHR5cGUuICBUaGUgYXJndW1lbnRzIGFyZSBhIG51bGwgdGVybWluYXRlZAotICAgYXJyYXkgb2Ygc3RyaW5ncywgYW5kIGFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9lbnVtX3R5cGUgKGhhbmRsZSwgbmFtZXMsIHZhbHVlcykKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX2VudW1fdHlwZSAqZTsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0VOVU0sIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgZSA9IChzdHJ1Y3QgZGVidWdfZW51bV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqZSk7Ci0gIG1lbXNldCAoZSwgMCwgc2l6ZW9mICplKTsKLQotICBlLT5uYW1lcyA9IG5hbWVzOwotICBlLT52YWx1ZXMgPSB2YWx1ZXM7Ci0KLSAgdC0+dS5rZW51bSA9IGU7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBwb2ludGVyIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICh0eXBlLT5wb2ludGVyICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gdHlwZS0+cG9pbnRlcjsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1BPSU5URVIsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5rcG9pbnRlciA9IHR5cGU7Ci0KLSAgdHlwZS0+cG9pbnRlciA9IHQ7Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBnaXZlbiB0eXBlLiAgRklYTUU6IFdlIHNob3VsZCBiZSBhYmxlCi0gICB0byByZWNvcmQgdGhlIHBhcmFtZXRlciB0eXBlcy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoaGFuZGxlLCB0eXBlLCBhcmdfdHlwZXMsIHZhcmFyZ3MpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgZGVidWdfdHlwZSAqYXJnX3R5cGVzOwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfZnVuY3Rpb25fdHlwZSAqZjsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9GVU5DVElPTiwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBmID0gKHN0cnVjdCBkZWJ1Z19mdW5jdGlvbl90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5yZXR1cm5fdHlwZSA9IHR5cGU7Ci0gIGYtPmFyZ190eXBlcyA9IGFyZ190eXBlczsKLSAgZi0+dmFyYXJncyA9IHZhcmFyZ3M7Ci0KLSAgdC0+dS5rZnVuY3Rpb24gPSBmOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgcmVmZXJlbmNlIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9SRUZFUkVOQ0UsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdC0+dS5rcmVmZXJlbmNlID0gdHlwZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHJhbmdlIG9mIGEgZ2l2ZW4gdHlwZSBmcm9tIGEgbG93ZXIgdG8gYW4gdXBwZXIgYm91bmQuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX3JhbmdlX3R5cGUgKGhhbmRsZSwgdHlwZSwgbG93ZXIsIHVwcGVyKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvd2VyOwotICAgICBiZmRfc2lnbmVkX3ZtYSB1cHBlcjsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19yYW5nZV90eXBlICpyOwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1JBTkdFLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHIgPSAoc3RydWN0IGRlYnVnX3JhbmdlX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKLSAgbWVtc2V0IChyLCAwLCBzaXplb2YgKnIpOwotCi0gIHItPnR5cGUgPSB0eXBlOwotICByLT5sb3dlciA9IGxvd2VyOwotICByLT51cHBlciA9IHVwcGVyOwotCi0gIHQtPnUua3JhbmdlID0gcjsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50Ci0gICBvZiB0aGUgYXJyYXkuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYSByYW5nZSBvZiB0aGUKLSAgIGFycmF5LiAgVGhlIGZvdXJ0aCBhbmQgZmlmdGggYXJndW1lbnQgYXJlIHRoZSBsb3dlciBhbmQgdXBwZXIKLSAgIGJvdW5kcywgcmVzcGVjdGl2ZWx5LiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhpcyBhcnJheSBpcwotICAgYWN0dWFsbHkgYSBzdHJpbmcsIGFzIGluIEMuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGhhbmRsZSwgZWxlbWVudF90eXBlLCByYW5nZV90eXBlLCBsb3dlciwgdXBwZXIsCi0JCSAgICAgICBzdHJpbmdwKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIGVsZW1lbnRfdHlwZTsKLSAgICAgZGVidWdfdHlwZSByYW5nZV90eXBlOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19hcnJheV90eXBlICphOwotCi0gIGlmIChlbGVtZW50X3R5cGUgPT0gTlVMTCB8fCByYW5nZV90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0FSUkFZLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGEgPSAoc3RydWN0IGRlYnVnX2FycmF5X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICphKTsKLSAgbWVtc2V0IChhLCAwLCBzaXplb2YgKmEpOwotCi0gIGEtPmVsZW1lbnRfdHlwZSA9IGVsZW1lbnRfdHlwZTsKLSAgYS0+cmFuZ2VfdHlwZSA9IHJhbmdlX3R5cGU7Ci0gIGEtPmxvd2VyID0gbG93ZXI7Ci0gIGEtPnVwcGVyID0gdXBwZXI7Ci0gIGEtPnN0cmluZ3AgPSBzdHJpbmdwOwotCi0gIHQtPnUua2FycmF5ID0gYTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHNldCBvZiBhIGdpdmVuIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBQYXNjYWwgc2V0IHR5cGUuICBUaGUKLSAgIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIHNldCBpcyBhY3R1YWxseSBhIGJpdHN0cmluZywgYXMgaW4KLSAgIENISUxMLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV9zZXRfdHlwZSAoaGFuZGxlLCB0eXBlLCBiaXRzdHJpbmdwKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJvb2xlYW4gYml0c3RyaW5ncDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19zZXRfdHlwZSAqczsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9TRVQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgcyA9IChzdHJ1Y3QgZGVidWdfc2V0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpzKTsKLSAgbWVtc2V0IChzLCAwLCBzaXplb2YgKnMpOwotCi0gIHMtPnR5cGUgPSB0eXBlOwotICBzLT5iaXRzdHJpbmdwID0gYml0c3RyaW5ncDsKLQotICB0LT51LmtzZXQgPSBzOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBwb2ludGVyIHdoaWNoIGlzIHJlbGF0aXZlIHRvIGFuIG9iamVjdC4gIFRoZQotICAgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgdG8gd2hpY2ggdGhlIHBvaW50ZXIgaXMKLSAgIHJlbGF0aXZlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIHRoYXQgdGhlIHBvaW50ZXIgcG9pbnRzCi0gICB0by4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUgKGhhbmRsZSwgYmFzZV90eXBlLCB0YXJnZXRfdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSBiYXNlX3R5cGU7Ci0gICAgIGRlYnVnX3R5cGUgdGFyZ2V0X3R5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotICBzdHJ1Y3QgZGVidWdfb2Zmc2V0X3R5cGUgKm87Ci0KLSAgaWYgKGJhc2VfdHlwZSA9PSBOVUxMIHx8IHRhcmdldF90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX09GRlNFVCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBvID0gKHN0cnVjdCBkZWJ1Z19vZmZzZXRfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm8pOwotICBtZW1zZXQgKG8sIDAsIHNpemVvZiAqbyk7Ci0KLSAgby0+YmFzZV90eXBlID0gYmFzZV90eXBlOwotICBvLT50YXJnZXRfdHlwZSA9IHRhcmdldF90eXBlOwotCi0gIHQtPnUua29mZnNldCA9IG87Ci0KLSAgcmV0dXJuIHQ7Ci19Ci0KLS8qIE1ha2UgYSB0eXBlIGZvciBhIG1ldGhvZCBmdW5jdGlvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICByZXR1cm4gdHlwZSwgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBkb21haW4sIGFuZCB0aGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGhhbmRsZSwgcmV0dXJuX3R5cGUsIGRvbWFpbl90eXBlLCBhcmdfdHlwZXMsIHZhcmFyZ3MpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0gICAgIGRlYnVnX3R5cGUgZG9tYWluX3R5cGU7Ci0gICAgIGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX21ldGhvZF90eXBlICptOwotCi0gIGlmIChyZXR1cm5fdHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9NRVRIT0QsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPnJldHVybl90eXBlID0gcmV0dXJuX3R5cGU7Ci0gIG0tPmRvbWFpbl90eXBlID0gZG9tYWluX3R5cGU7Ci0gIG0tPmFyZ190eXBlcyA9IGFyZ190eXBlczsKLSAgbS0+dmFyYXJncyA9IHZhcmFyZ3M7Ci0KLSAgdC0+dS5rbWV0aG9kID0gbTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2VfY29uc3RfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX0NPTlNULCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua2NvbnN0ID0gdHlwZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm8gPSAoc3RydWN0IGRlYnVnX2hhbmRsZSAqKSBoYW5kbGU7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlICp0OwotCi0gIGlmICh0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICB0ID0gZGVidWdfbWFrZV90eXBlIChpbmZvLCBERUJVR19LSU5EX1ZPTEFUSUxFLCAwKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHQtPnUua3ZvbGF0aWxlID0gdHlwZTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogTWFrZSBhbiB1bmRlZmluZWQgdGFnZ2VkIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBzdHJ1Y3Qgd2hpY2ggaGFzCi0gICBiZWVuIG1lbnRpb25lZCwgYnV0IG5vdCBkZWZpbmVkLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUgKGhhbmRsZSwgbmFtZSwga2luZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfRU5VTToKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19tYWtlX3VuZGVmaW5lZF90eXBlOiB1bnN1cHBvcnRlZCBraW5kIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywga2luZCwgMCk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICByZXR1cm4gZGVidWdfdGFnX3R5cGUgKGhhbmRsZSwgbmFtZSwgdCk7Ci19Ci0KLS8qIE1ha2UgYSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBiYXNlCi0gICBjbGFzcyB0eXBlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhpcyBiYXNlCi0gICBjbGFzcyBpbiB0aGUgb2JqZWN0IChhbHdheXMgMCB1bmxlc3MgZG9pbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2UpLgotICAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYSB2aXJ0dWFsIGNsYXNzLiAgVGhlIGZpZnRoCi0gICBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYmFzZSBjbGFzcy4gICovCi0KLS8qQVJHU1VTRUQqLwotZGVidWdfYmFzZWNsYXNzCi1kZWJ1Z19tYWtlX2Jhc2VjbGFzcyAoaGFuZGxlLCB0eXBlLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJvb2xlYW4gdmlydHVhbDsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17ICAgICAKLSAgc3RydWN0IGRlYnVnX2Jhc2VjbGFzcyAqYjsKLQotICBiID0gKHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKikgeG1hbGxvYyAoc2l6ZW9mICpiKTsKLSAgbWVtc2V0IChiLCAwLCBzaXplb2YgKmIpOwotCi0gIGItPnR5cGUgPSB0eXBlOwotICBiLT5iaXRwb3MgPSBiaXRwb3M7Ci0gIGItPnZpcnR1YWwgPSB2aXJ0dWFsOwotICBiLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLQotICByZXR1cm4gYjsKLX0KLQotLyogTWFrZSBhIGZpZWxkIGZvciBhIHN0cnVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUuICBUaGUKLSAgIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZC4gIFRoZSBmb3VydGggYXJndW1lbnQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhlIGZpZWxkLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBzaXplIG9mCi0gICB0aGUgZmllbGQgKGl0IG1heSBiZSB6ZXJvKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eQotICAgb2YgdGhlIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19maWVsZAotZGVidWdfbWFrZV9maWVsZCAoaGFuZGxlLCBuYW1lLCB0eXBlLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJmZF92bWEgYml0c2l6ZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotICBmID0gKHN0cnVjdCBkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChzaXplb2YgKmYpOwotICBtZW1zZXQgKGYsIDAsIHNpemVvZiAqZik7Ci0KLSAgZi0+bmFtZSA9IG5hbWU7Ci0gIGYtPnR5cGUgPSB0eXBlOwotICBmLT5zdGF0aWNfbWVtYmVyID0gZmFsc2U7Ci0gIGYtPnUuZi5iaXRwb3MgPSBiaXRwb3M7Ci0gIGYtPnUuZi5iaXRzaXplID0gYml0c2l6ZTsKLSAgZi0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWVtYmVyIG9mIGFuIG9iamVjdC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlCi0gICBuYW1lLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXIuICBUaGUgZm91cnRoCi0gICBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgbWVtYmVyIChpLmUuLCB0aGUgbmFtZSBhcyBhCi0gICBnbG9iYWwgdmFyaWFibGUpLiAgVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSB2aXNpYmlsaXR5IG9mIHRoZQotICAgbWVtYmVyLiAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19maWVsZAotZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChoYW5kbGUsIG5hbWUsIHR5cGUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0gIGYgPSAoc3RydWN0IGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKHNpemVvZiAqZik7Ci0gIG1lbXNldCAoZiwgMCwgc2l6ZW9mICpmKTsKLQotICBmLT5uYW1lID0gbmFtZTsKLSAgZi0+dHlwZSA9IHR5cGU7Ci0gIGYtPnN0YXRpY19tZW1iZXIgPSB0cnVlOwotICBmLT51LnMucGh5c25hbWUgPSBwaHlzbmFtZTsKLSAgZi0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIGY7Ci19Ci0KLS8qIE1ha2UgYSBtZXRob2QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLCBhbmQgdGhlIHRoaXJkCi0gICBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBtZXRob2QgdmFyaWFudHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX21ldGhvZAotZGVidWdfbWFrZV9tZXRob2QgKGhhbmRsZSwgbmFtZSwgdmFyaWFudHMpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX21ldGhvZF92YXJpYW50ICp2YXJpYW50czsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTsKLQotICBtID0gKHN0cnVjdCBkZWJ1Z19tZXRob2QgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPm5hbWUgPSBuYW1lOwotICBtLT52YXJpYW50cyA9IHZhcmlhbnRzOwotCi0gIHJldHVybiBtOwotfQotCi0vKiBNYWtlIGEgbWV0aG9kIGFyZ3VtZW50LiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcmVhbCBuYW1lIG9mCi0gICB0aGUgZnVuY3Rpb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhlCi0gICBmb3VydGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgd2hldGhlcgotICAgdGhpcyBpcyBhIGNvbnN0IGZ1bmN0aW9uLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhCi0gICB2b2xhdGlsZSBmdW5jdGlvbi4gIFRoZSBzZXZlbnRoIGFyZ3VtZW50IGlzIHRoZSBvZmZzZXQgaW4gdGhlCi0gICB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLCBpZiBhbnkuICBUaGUgZWlnaHRoIGFyZ3VtZW50IGlzIHRoZSB2aXJ0dWFsCi0gICBmdW5jdGlvbiBjb250ZXh0LiAgRklYTUU6IEFyZSB0aGUgY29uc3QgYW5kIHZvbGF0aWxlIGFyZ3VtZW50cwotICAgbmVjZXNzYXJ5PyAgQ291bGQgd2UganVzdCB1c2UgZGVidWdfbWFrZV9jb25zdF90eXBlPyAgKi8KLQotLypBUkdTVVNFRCovCi1kZWJ1Z19tZXRob2RfdmFyaWFudAotZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoaGFuZGxlLCBwaHlzbmFtZSwgdHlwZSwgdmlzaWJpbGl0eSwgY29uc3RwLAotCQkJICAgdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGRlYnVnX3R5cGUgY29udGV4dDsKLXsKLSAgc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICptOwotCi0gIG0gPSAoc3RydWN0IGRlYnVnX21ldGhvZF92YXJpYW50ICopIHhtYWxsb2MgKHNpemVvZiAqbSk7Ci0gIG1lbXNldCAobSwgMCwgc2l6ZW9mICptKTsKLQotICBtLT5waHlzbmFtZSA9IHBoeXNuYW1lOwotICBtLT50eXBlID0gdHlwZTsKLSAgbS0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0gIG0tPmNvbnN0cCA9IGNvbnN0cDsKLSAgbS0+dm9sYXRpbGVwID0gdm9sYXRpbGVwOwotICBtLT52b2Zmc2V0ID0gdm9mZnNldDsKLSAgbS0+Y29udGV4dCA9IGNvbnRleHQ7Ci0KLSAgcmV0dXJuIG07Ci19Ci0KLS8qIE1ha2UgYSBzdGF0aWMgbWV0aG9kIGFyZ3VtZW50LiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yCi0gICBkZWJ1Z19tYWtlX21ldGhvZF92YXJpYW50LCBleGNlcHQgdGhhdCB0aGUgbGFzdCB0d28gYXJlIG9taXR0ZWQKLSAgIHNpbmNlIGEgc3RhdGljIG1ldGhvZCBjYW4gbm90IGFsc28gYmUgdmlydHVhbC4gICovCi0KLWRlYnVnX21ldGhvZF92YXJpYW50Ci1kZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCAoaGFuZGxlLCBwaHlzbmFtZSwgdHlwZSwgdmlzaWJpbGl0eSwKLQkJCQkgIGNvbnN0cCwgdm9sYXRpbGVwKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotewotICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKm07Ci0KLSAgbSA9IChzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikgeG1hbGxvYyAoc2l6ZW9mICptKTsKLSAgbWVtc2V0IChtLCAwLCBzaXplb2YgKm0pOwotCi0gIG0tPnBoeXNuYW1lID0gcGh5c25hbWU7Ci0gIG0tPnR5cGUgPSB0eXBlOwotICBtLT52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKLSAgbS0+Y29uc3RwID0gY29uc3RwOwotICBtLT52b2xhdGlsZXAgPSB2b2xhdGlsZXA7Ci0gIG0tPnZvZmZzZXQgPSBWT0ZGU0VUX1NUQVRJQ19NRVRIT0Q7Ci0KLSAgcmV0dXJuIG07Ci19Ci0KLS8qIE5hbWUgYSB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfbmFtZV90eXBlIChoYW5kbGUsIG5hbWUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnQ7Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lZF90eXBlICpuOwotICBzdHJ1Y3QgZGVidWdfbmFtZSAqbm07Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAoaW5mby0+Y3VycmVudF91bml0ID09IE5VTEwKLSAgICAgIHx8IGluZm8tPmN1cnJlbnRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGRlYnVnX2Vycm9yIChfKCJkZWJ1Z19uYW1lX3R5cGU6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIHQgPSBkZWJ1Z19tYWtlX3R5cGUgKGluZm8sIERFQlVHX0tJTkRfTkFNRUQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgbiA9IChzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+dHlwZSA9IHR5cGU7Ci0KLSAgdC0+dS5rbmFtZWQgPSBuOwotCi0gIC8qIFdlIGFsd2F5cyBhZGQgdGhlIG5hbWUgdG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBUaGlzIGlzIHByb2JhYmx5Ci0gICAgIHdyb25nIGluIHNvbWUgY2FzZXMsIGJ1dCBpdCBzZWVtcyB0byBiZSByaWdodCBmb3Igc3RhYnMuICBGSVhNRS4gICovCi0KLSAgbm0gPSBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzLCBuYW1lLAotCQkJICAgICAgIERFQlVHX09CSkVDVF9UWVBFLCBERUJVR19MSU5LQUdFX05PTkUpOwotICBpZiAobm0gPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbm0tPnUudHlwZSA9IHQ7Ci0KLSAgbi0+bmFtZSA9IG5tOwotCi0gIHJldHVybiB0OwotfQotCi0vKiBUYWcgYSB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfdGFnX3R5cGUgKGhhbmRsZSwgbmFtZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDsKLSAgc3RydWN0IGRlYnVnX25hbWVkX3R5cGUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19uYW1lICpubTsKLQotICBpZiAobmFtZSA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmIChpbmZvLT5jdXJyZW50X2ZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfdGFnX3R5cGU6IG5vIGN1cnJlbnQgZmlsZSIpKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lLCBuYW1lKSA9PSAwKQotCXJldHVybiB0eXBlOwotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3RhZ190eXBlOiBleHRyYSB0YWcgYXR0ZW1wdGVkIikpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0KLSAgdCA9IGRlYnVnX21ha2VfdHlwZSAoaW5mbywgREVCVUdfS0lORF9UQUdHRUQsIDApOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgbiA9IChzdHJ1Y3QgZGVidWdfbmFtZWRfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+dHlwZSA9IHR5cGU7Ci0KLSAgdC0+dS5rbmFtZWQgPSBuOwotCi0gIC8qIFdlIGtlZXAgYSBnbG9iYWwgbmFtZXNwYWNlIG9mIHRhZ3MgZm9yIGVhY2ggY29tcGlsYXRpb24gdW5pdC4gIEkKLSAgICAgZG9uJ3Qga25vdyBpZiB0aGF0IGlzIHRoZSByaWdodCB0aGluZyB0byBkby4gICovCi0KLSAgbm0gPSBkZWJ1Z19hZGRfdG9fbmFtZXNwYWNlIChpbmZvLCAmaW5mby0+Y3VycmVudF9maWxlLT5nbG9iYWxzLCBuYW1lLAotCQkJICAgICAgIERFQlVHX09CSkVDVF9UQUcsIERFQlVHX0xJTktBR0VfTk9ORSk7Ci0gIGlmIChubSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBubS0+dS50YWcgPSB0OwotCi0gIG4tPm5hbWUgPSBubTsKLQotICByZXR1cm4gdDsKLX0KLQotLyogUmVjb3JkIHRoZSBzaXplIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotYm9vbGVhbgotZGVidWdfcmVjb3JkX3R5cGVfc2l6ZSAoaGFuZGxlLCB0eXBlLCBzaXplKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBpZiAodHlwZS0+c2l6ZSAhPSAwICYmIHR5cGUtPnNpemUgIT0gc2l6ZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIldhcm5pbmc6IGNoYW5naW5nIHR5cGUgc2l6ZSBmcm9tICVkIHRvICVkXG4iKSwKLQkgICAgIHR5cGUtPnNpemUsIHNpemUpOwotCi0gIHR5cGUtPnNpemUgPSBzaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5kIGEgbmFtZWQgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAoaGFuZGxlLCBuYW1lKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfYmxvY2sgKmI7Ci0gIHN0cnVjdCBkZWJ1Z19maWxlICpmOwotCi0gIC8qIFdlIG9ubHkgc2VhcmNoIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICBJIGRvbid0IGtub3cgaWYKLSAgICAgdGhpcyBpcyByaWdodCBvciBub3QuICAqLwotCi0gIGlmIChpbmZvLT5jdXJyZW50X3VuaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBkZWJ1Z19lcnJvciAoXygiZGVidWdfZmluZF9uYW1lZF90eXBlOiBubyBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQiKSk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBmb3IgKGIgPSBpbmZvLT5jdXJyZW50X2Jsb2NrOyBiICE9IE5VTEw7IGIgPSBiLT5wYXJlbnQpCi0gICAgewotICAgICAgaWYgKGItPmxvY2FscyAhPSBOVUxMKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBmb3IgKG4gPSBiLT5sb2NhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAobi0+a2luZCA9PSBERUJVR19PQkpFQ1RfVFlQRQotCQkgICYmIG4tPm5hbWVbMF0gPT0gbmFtZVswXQotCQkgICYmIHN0cmNtcCAobi0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJcmV0dXJuIG4tPnUudHlwZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgZm9yIChmID0gaW5mby0+Y3VycmVudF91bml0LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZi0+Z2xvYmFscyAhPSBOVUxMKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotCi0JICBmb3IgKG4gPSBmLT5nbG9iYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKG4tPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RZUEUKLQkJICAmJiBuLT5uYW1lWzBdID09IG5hbWVbMF0KLQkJICAmJiBzdHJjbXAgKG4tPm5hbWUsIG5hbWUpID09IDApCi0JCXJldHVybiBuLT51LnR5cGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiBERUJVR19UWVBFX05VTEw7CSAgCi19Ci0KLS8qIEZpbmQgYSB0YWdnZWQgdHlwZS4gICovCi0KLWRlYnVnX3R5cGUKLWRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGhhbmRsZSwgbmFtZSwga2luZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLXsKLSAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgZGVidWdfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IGRlYnVnX3VuaXQgKnU7Ci0KLSAgLyogV2Ugc2VhcmNoIHRoZSBnbG9iYWxzIG9mIGFsbCB0aGUgY29tcGlsYXRpb24gdW5pdHMuICBJIGRvbid0IGtub3cKLSAgICAgaWYgdGhpcyBpcyBjb3JyZWN0IG9yIG5vdC4gIEl0IHdvdWxkIGJlIGVhc3kgdG8gY2hhbmdlLiAgKi8KLQotICBmb3IgKHUgPSBpbmZvLT51bml0czsgdSAhPSBOVUxMOyB1ID0gdS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfZmlsZSAqZjsKLQotICAgICAgZm9yIChmID0gdS0+ZmlsZXM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JewotCSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0KLQkgIGlmIChmLT5nbG9iYWxzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBmb3IgKG4gPSBmLT5nbG9iYWxzLT5saXN0OyBuICE9IE5VTEw7IG4gPSBuLT5uZXh0KQotCQl7Ci0JCSAgaWYgKG4tPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RBRwotCQkgICAgICAmJiAoa2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwKLQkJCSAgfHwgbi0+dS50YWctPmtpbmQgPT0ga2luZCkKLQkJICAgICAgJiYgbi0+bmFtZVswXSA9PSBuYW1lWzBdCi0JCSAgICAgICYmIHN0cmNtcCAobi0+bmFtZSwgbmFtZSkgPT0gMCkKLQkJICAgIHJldHVybiBuLT51LnRhZzsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotfQotCi0vKiBHZXQgYSBiYXNlIHR5cGUuICBXZSBidWlsZCBhIGxpbmtlZCBsaXN0IG9uIHRoZSBzdGFjayB0byBhdm9pZAotICAgY3Jhc2hpbmcgaWYgdGhlIHR5cGUgaXMgZGVmaW5lZCBjaXJjdWxhcmx5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBkZWJ1Z190eXBlICoKLWRlYnVnX2dldF9yZWFsX3R5cGUgKGhhbmRsZSwgdHlwZSwgbGlzdCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZV9yZWFsX2xpc3QgKmxpc3Q7Ci17Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX3JlYWxfbGlzdCAqbDsKLSAgc3RydWN0IGRlYnVnX3R5cGVfcmVhbF9saXN0IHJsOwotCi0gIHN3aXRjaCAodHlwZS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0eXBlOwotCi0gICAgY2FzZSBERUJVR19LSU5EX0lORElSRUNUOgotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGZvciAobCA9IGxpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPnQgPT0gdHlwZSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgIF8oImRlYnVnX2dldF9yZWFsX3R5cGU6IGNpcmN1bGFyIGRlYnVnIGluZm9ybWF0aW9uIGZvciAlc1xuIiksCi0JCSAgIGRlYnVnX2dldF90eXBlX25hbWUgKGhhbmRsZSwgdHlwZSkpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgIH0KLQotICBybC5uZXh0ID0gbGlzdDsKLSAgcmwudCA9IHR5cGU7Ci0KLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICAgIC8qIFRoZSBkZWZhdWx0IGNhc2UgaXMganVzdCBoZXJlIHRvIGF2b2lkIHdhcm5pbmdzLiAgKi8KLSAgICBkZWZhdWx0OgotICAgIGNhc2UgREVCVUdfS0lORF9JTkRJUkVDVDoKLSAgICAgIGlmICgqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QgIT0gTlVMTCkKLQlyZXR1cm4gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCAqdHlwZS0+dS5raW5kaXJlY3QtPnNsb3QsICZybCk7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfTkFNRUQ6Ci0gICAgY2FzZSBERUJVR19LSU5EX1RBR0dFRDoKLSAgICAgIHJldHVybiBkZWJ1Z19nZXRfcmVhbF90eXBlIChoYW5kbGUsIHR5cGUtPnUua25hbWVkLT50eXBlLCAmcmwpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSBraW5kIG9mIGEgdHlwZS4gICovCi0KLWVudW0gZGVidWdfdHlwZV9raW5kCi1kZWJ1Z19nZXRfdHlwZV9raW5kIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfS0lORF9JTExFR0FMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfS0lORF9JTExFR0FMOwotICByZXR1cm4gdHlwZS0+a2luZDsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgdHlwZS4gICovCi0KLWNvbnN0IGNoYXIgKgotZGVidWdfZ2V0X3R5cGVfbmFtZSAoaGFuZGxlLCB0eXBlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci17Ci0gIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgaWYgKCp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCAhPSBOVUxMKQotCXJldHVybiBkZWJ1Z19nZXRfdHlwZV9uYW1lIChoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCk7Ci0gICAgICByZXR1cm4gdHlwZS0+dS5raW5kaXJlY3QtPnRhZzsKLSAgICB9Ci0gIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQpCi0gICAgcmV0dXJuIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2V0IHRoZSBzaXplIG9mIGEgdHlwZS4gICovCi0KLWJmZF92bWEKLWRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIGRvbid0IGNhbGwgZGVidWdfZ2V0X3JlYWxfdHlwZSwgYmVjYXVzZSBzb21lYm9keSBtaWdodCBoYXZlCi0gICAgIGNhbGxlZCBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIG9uIGEgbmFtZWQgb3IgaW5kaXJlY3QgdHlwZS4gICovCi0KLSAgaWYgKHR5cGUtPnNpemUgIT0gMCkKLSAgICByZXR1cm4gdHlwZS0+c2l6ZTsKLQotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6Ci0gICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ICE9IE5VTEwpCi0JcmV0dXJuIGRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgKnR5cGUtPnUua2luZGlyZWN0LT5zbG90KTsKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgREVCVUdfS0lORF9OQU1FRDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVEFHR0VEOgotICAgICAgcmV0dXJuIGRlYnVnX2dldF90eXBlX3NpemUgKGhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUpOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLiAgKi8KLQotZGVidWdfdHlwZQotZGVidWdfZ2V0X3JldHVybl90eXBlIChoYW5kbGUsIHR5cGUpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgIHJldHVybiB0eXBlLT51LmtmdW5jdGlvbi0+cmV0dXJuX3R5cGU7Ci0gICAgY2FzZSBERUJVR19LSU5EX01FVEhPRDoKLSAgICAgIHJldHVybiB0eXBlLT51LmttZXRob2QtPnJldHVybl90eXBlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8gICAgICAKLX0KLQotLyogR2V0IHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZSAoZXhjZXB0IHRoYXQKLSAgIHdlIGRvbid0IGN1cnJlbnRseSBzdG9yZSB0aGUgcGFyYW1ldGVyIHR5cGVzIG9mIGEgZnVuY3Rpb24pLiAgKi8KLQotY29uc3QgZGVidWdfdHlwZSAqCi1kZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIChoYW5kbGUsIHR5cGUsIHB2YXJhcmdzKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGJvb2xlYW4gKnB2YXJhcmdzOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX0ZVTkNUSU9OOgotICAgICAgKnB2YXJhcmdzID0gdHlwZS0+dS5rZnVuY3Rpb24tPnZhcmFyZ3M7Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlczsKLSAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgotICAgICAgKnB2YXJhcmdzID0gdHlwZS0+dS5rbWV0aG9kLT52YXJhcmdzOwotICAgICAgcmV0dXJuIHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSB0YXJnZXQgdHlwZSBvZiBhIHR5cGUuICAqLwotCi1kZWJ1Z190eXBlCi1kZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX1BPSU5URVI6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rcG9pbnRlcjsKLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgcmV0dXJuIHR5cGUtPnUua3JlZmVyZW5jZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICByZXR1cm4gdHlwZS0+dS5rY29uc3Q7Ci0gICAgY2FzZSBERUJVR19LSU5EX1ZPTEFUSUxFOgotICAgICAgcmV0dXJuIHR5cGUtPnUua3ZvbGF0aWxlOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzIGZvciBhIHN0cnVjdCwgdW5pb24sIG9yCi0gICBjbGFzcy4gICovCi0KLWNvbnN0IGRlYnVnX2ZpZWxkICoKLWRlYnVnX2dldF9maWVsZHMgKGhhbmRsZSwgdHlwZSkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfdHlwZSB0eXBlOwotewotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICB0eXBlID0gZGVidWdfZ2V0X3JlYWxfdHlwZSAoaGFuZGxlLCB0eXBlLCBOVUxMKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3dpdGNoICh0eXBlLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIHJldHVybiB0eXBlLT51LmtjbGFzcy0+ZmllbGRzOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2V0IHRoZSB0eXBlIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWRlYnVnX3R5cGUKLWRlYnVnX2dldF9maWVsZF90eXBlIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBmaWVsZC0+dHlwZTsKLX0KLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWNvbnN0IGNoYXIgKgotZGVidWdfZ2V0X2ZpZWxkX25hbWUgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIGZpZWxkLT5uYW1lOwotfQotCi0vKiBHZXQgdGhlIGJpdCBwb3NpdGlvbiBvZiBhIGZpZWxkLiAgKi8KLQotLypBUkdTVVNFRCovCi1iZmRfdm1hCi1kZWJ1Z19nZXRfZmllbGRfYml0cG9zIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwgfHwgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSAgcmV0dXJuIGZpZWxkLT51LmYuYml0cG9zOwotfQotCi0vKiBHZXQgdGhlIGJpdCBzaXplIG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWJmZF92bWEKLWRlYnVnX2dldF9maWVsZF9iaXRzaXplIChoYW5kbGUsIGZpZWxkKQotICAgICBQVFIgaGFuZGxlOwotICAgICBkZWJ1Z19maWVsZCBmaWVsZDsKLXsKLSAgaWYgKGZpZWxkID09IE5VTEwgfHwgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIChiZmRfdm1hKSAtMTsKLSAgcmV0dXJuIGZpZWxkLT51LmYuYml0c2l6ZTsKLX0KLQotLyogR2V0IHRoZSB2aXNpYmlsaXR5IG9mIGEgZmllbGQuICAqLwotCi0vKkFSR1NVU0VEKi8KLWVudW0gZGVidWdfdmlzaWJpbGl0eQotZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkgKGhhbmRsZSwgZmllbGQpCi0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotewotICBpZiAoZmllbGQgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVklTSUJJTElUWV9JR05PUkU7Ci0gIHJldHVybiBmaWVsZC0+dmlzaWJpbGl0eTsKLX0KLQotLyogR2V0IHRoZSBwaHlzaWNhbCBuYW1lIG9mIGEgZmllbGQuICAqLwotCi1jb25zdCBjaGFyICoKLWRlYnVnX2dldF9maWVsZF9waHlzbmFtZSAoaGFuZGxlLCBmaWVsZCkKLSAgICAgUFRSIGhhbmRsZTsKLSAgICAgZGVidWdfZmllbGQgZmllbGQ7Ci17Ci0gIGlmIChmaWVsZCA9PSBOVUxMIHx8ICEgZmllbGQtPnN0YXRpY19tZW1iZXIpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBmaWVsZC0+dS5zLnBoeXNuYW1lOwotfQotDAotLyogV3JpdGUgb3V0IHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGlzIGdpdmVuIGEgaGFuZGxlIHRvCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGFuZCBhIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyB0byBjYWxsLiAgKi8KLQotYm9vbGVhbgotZGVidWdfd3JpdGUgKGhhbmRsZSwgZm5zLCBmaGFuZGxlKQotICAgICBQVFIgaGFuZGxlOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotewotICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvID0gKHN0cnVjdCBkZWJ1Z19oYW5kbGUgKikgaGFuZGxlOwotICBzdHJ1Y3QgZGVidWdfdW5pdCAqdTsKLQotICAvKiBXZSB1c2UgYSBtYXJrIHRvIHRlbGwgd2hldGhlciB3ZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXQgYQotICAgICBwYXJ0aWN1bGFyIG5hbWUuICBXZSB1c2UgYW4gaW50ZWdlciwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvCi0gICAgIGNsZWFyIHRoZSBtYXJrIGZpZWxkcyBpZiB3ZSBoYXBwZW4gdG8gd3JpdGUgb3V0IHRoZSBzYW1lCi0gICAgIGluZm9ybWF0aW9uIG1vcmUgdGhhbiBvbmNlLiAgKi8KLSAgKytpbmZvLT5tYXJrOwotCi0gIC8qIFRoZSBiYXNlX2lkIGZpZWxkIGhvbGRzIGFuIElEIHZhbHVlIHdoaWNoIHdpbGwgbmV2ZXIgYmUgdXNlZCwgc28KLSAgICAgdGhhdCB3ZSBjYW4gdGVsbCB3aGV0aGVyIHdlIGhhdmUgYXNzaWduZWQgYW4gSUQgZHVyaW5nIHRoaXMgY2FsbAotICAgICB0byBkZWJ1Z193cml0ZS4gICovCi0gIGluZm8tPmJhc2VfaWQgPSBpbmZvLT5jbGFzc19pZDsKLQotICAvKiBXZSBrZWVwIGEgbGlua2VkIGxpc3Qgb2YgY2xhc3NlcyBmb3Igd2hpY2ggd2FzIGhhdmUgYXNzaWduZWQgSUQncwotICAgICBkdXJpbmcgdGhpcyBjYWxsIHRvIGRlYnVnX3dyaXRlLiAgKi8KLSAgaW5mby0+aWRfbGlzdCA9IE5VTEw7Ci0KLSAgZm9yICh1ID0gaW5mby0+dW5pdHM7IHUgIT0gTlVMTDsgdSA9IHUtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGRlYnVnX2ZpbGUgKmY7Ci0gICAgICBib29sZWFuIGZpcnN0X2ZpbGU7Ci0KLSAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vID0gdS0+bGluZW5vczsKLSAgICAgIGluZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4ID0gMDsKLQotICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X2NvbXBpbGF0aW9uX3VuaXQpIChmaGFuZGxlLCB1LT5maWxlcy0+ZmlsZW5hbWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZmlyc3RfZmlsZSA9IHRydWU7Ci0gICAgICBmb3IgKGYgPSB1LT5maWxlczsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfbmFtZSAqbjsKLQotCSAgaWYgKGZpcnN0X2ZpbGUpCi0JICAgIGZpcnN0X2ZpbGUgPSBmYWxzZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmICghICgqZm5zLT5zdGFydF9zb3VyY2UpIChmaGFuZGxlLCBmLT5maWxlbmFtZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoZi0+Z2xvYmFscyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm9yIChuID0gZi0+Z2xvYmFscy0+bGlzdDsgbiAhPSBOVUxMOyBuID0gbi0+bmV4dCkKLQkJewotCQkgIGlmICghIGRlYnVnX3dyaXRlX25hbWUgKGluZm8sIGZucywgZmhhbmRsZSwgbikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogT3V0cHV0IGFueSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aGljaCBoYXNuJ3QgYWxyZWFkeSBiZWVuCi0gICAgICAgICBoYW5kbGVkLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgKGJmZF92bWEpIC0xKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gZWxlbWVudCBpbiBhIG5hbWVzcGFjZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9uYW1lIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4pCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgKmZuczsKLSAgICAgUFRSIGZoYW5kbGU7Ci0gICAgIHN0cnVjdCBkZWJ1Z19uYW1lICpuOwotewotICBzd2l0Y2ggKG4tPmtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RZUEU6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudHlwZSwgbikKLQkgIHx8ICEgKCpmbnMtPnR5cGRlZikgKGZoYW5kbGUsIG4tPm5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RBRzoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgbi0+dS50YWcsIG4pKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+dGFnKSAoZmhhbmRsZSwgbi0+bmFtZSk7Ci0gICAgY2FzZSBERUJVR19PQkpFQ1RfVkFSSUFCTEU6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIG4tPnUudmFyaWFibGUtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT52YXJpYWJsZSkgKGZoYW5kbGUsIG4tPm5hbWUsIG4tPnUudmFyaWFibGUtPmtpbmQsCi0JCQkgICAgICAgbi0+dS52YXJpYWJsZS0+dmFsKTsKLSAgICBjYXNlIERFQlVHX09CSkVDVF9GVU5DVElPTjoKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV9mdW5jdGlvbiAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT5uYW1lLAotCQkJCSAgIG4tPmxpbmthZ2UsIG4tPnUuZnVuY3Rpb24pOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX0lOVF9DT05TVEFOVDoKLSAgICAgIHJldHVybiAoKmZucy0+aW50X2NvbnN0YW50KSAoZmhhbmRsZSwgbi0+bmFtZSwgbi0+dS5pbnRfY29uc3RhbnQpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX0ZMT0FUX0NPTlNUQU5UOgotICAgICAgcmV0dXJuICgqZm5zLT5mbG9hdF9jb25zdGFudCkgKGZoYW5kbGUsIG4tPm5hbWUsIG4tPnUuZmxvYXRfY29uc3RhbnQpOwotICAgIGNhc2UgREVCVUdfT0JKRUNUX1RZUEVEX0NPTlNUQU5UOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuLT51LnR5cGVkX2NvbnN0YW50LT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+dHlwZWRfY29uc3RhbnQpIChmaGFuZGxlLCBuLT5uYW1lLAotCQkJCSAgICAgbi0+dS50eXBlZF9jb25zdGFudC0+dmFsKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotCi0vKiBXcml0ZSBvdXQgYSB0eXBlLiAgSWYgdGhlIHR5cGUgaXMgREVCVUdfS0lORF9OQU1FRCBvcgotICAgREVCVUdfS0lORF9UQUdHRUQsIHRoZW4gdGhlIG5hbWUgYXJndW1lbnQgaXMgdGhlIG5hbWUgZm9yIHdoaWNoIHdlCi0gICBhcmUgYWJvdXQgdG8gY2FsbCB0eXBlZGVmIG9yIHRhZy4gIElmIHRoZSB0eXBlIGlzIGFueXRoaW5nIGVsc2UsCi0gICB0aGVuIHRoZSBuYW1lIGFyZ3VtZW50IGlzIGEgdGFnIGZyb20gYSBERUJVR19LSU5EX1RBR0dFRCB0eXBlIHdoaWNoCi0gICBwb2ludHMgdG8gdGhpcyBvbmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLCBuYW1lKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdHlwZTsKLSAgICAgc3RydWN0IGRlYnVnX25hbWUgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBpbnQgaXM7Ci0gIGNvbnN0IGNoYXIgKnRhZzsKLQotICAvKiBJZiB3ZSBoYXZlIGEgbmFtZSBmb3IgdGhpcyB0eXBlLCBqdXN0IG91dHB1dCBpdC4gIFdlIG9ubHkgb3V0cHV0Ci0gICAgIHR5cGVkZWYgbmFtZXMgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZGVmaW5lZC4gIFdlIG91dHB1dCB0eXBlIHRhZ3MKLSAgICAgd2hlbmV2ZXIgd2UgYXJlIG5vdCBhY3R1YWxseSBkZWZpbmluZyB0aGVtLiAgKi8KLSAgaWYgKCh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgICAgJiYgKHR5cGUtPnUua25hbWVkLT5uYW1lLT5tYXJrID09IGluZm8tPm1hcmsKLQkgIHx8ICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VECi0JICAgICAgJiYgdHlwZS0+dS5rbmFtZWQtPm5hbWUgIT0gbmFtZSkpKQotICAgIHsKLSAgICAgIGlmICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQpCi0JcmV0dXJuICgqZm5zLT50eXBlZGVmX3R5cGUpIChmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGRlYnVnX3R5cGUgKnJlYWw7Ci0JICB1bnNpZ25lZCBpbnQgaWQ7Ci0KLQkgIHJlYWwgPSBkZWJ1Z19nZXRfcmVhbF90eXBlICgoUFRSKSBpbmZvLCB0eXBlLCBOVUxMKTsKLQkgIGlmIChyZWFsID09IE5VTEwpCi0JICAgIHJldHVybiAoKmZucy0+ZW1wdHlfdHlwZSkgKGZoYW5kbGUpOwotCSAgaWQgPSAwOwotCSAgaWYgKChyZWFsLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNUCi0JICAgICAgIHx8IHJlYWwtPmtpbmQgPT0gREVCVUdfS0lORF9VTklPTgotCSAgICAgICB8fCByZWFsLT5raW5kID09IERFQlVHX0tJTkRfQ0xBU1MKLQkgICAgICAgfHwgcmVhbC0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OX0NMQVNTKQotCSAgICAgICYmIHJlYWwtPnUua2NsYXNzICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAocmVhbC0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JCXsKLQkJICBpZiAoISBkZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sCi0JCQkJCSAgICB0eXBlLT51LmtuYW1lZC0+bmFtZS0+bmFtZSwKLQkJCQkJICAgIHJlYWwpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgaWQgPSByZWFsLT51LmtjbGFzcy0+aWQ7Ci0JICAgIH0KLQotCSAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua25hbWVkLT5uYW1lLT5uYW1lLCBpZCwKLQkJCQkgICByZWFsLT5raW5kKTsKLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgdGhlIG5hbWUgYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IGxvb2tlZCBmb3IgYSBrbm93biBuYW1lLCBzbwotICAgICB0aGF0IHdlIGRvbid0IGp1c3QgZGVmaW5lIGEgdHlwZSBpbiB0ZXJtcyBvZiBpdHNlbGYuICBXZSBuZWVkIHRvCi0gICAgIG1hcmsgdGhlIG5hbWUgaGVyZSBzbyB0aGF0IGEgc3RydWN0IGNvbnRhaW5pbmcgYSBwb2ludGVyIHRvCi0gICAgIGl0c2VsZiB3aWxsIHdvcmsuICAqLwotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIG5hbWUtPm1hcmsgPSBpbmZvLT5tYXJrOwotCi0gIHRhZyA9IE5VTEw7Ci0gIGlmIChuYW1lICE9IE5VTEwKLSAgICAgICYmIHR5cGUtPmtpbmQgIT0gREVCVUdfS0lORF9OQU1FRAotICAgICAgJiYgdHlwZS0+a2luZCAhPSBERUJVR19LSU5EX1RBR0dFRCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKG5hbWUtPmtpbmQgPT0gREVCVUdfT0JKRUNUX1RBRyk7Ci0gICAgICB0YWcgPSBuYW1lLT5uYW1lOwotICAgIH0KLQotICBzd2l0Y2ggKHR5cGUtPmtpbmQpCi0gICAgewotICAgIGNhc2UgREVCVUdfS0lORF9JTExFR0FMOgotICAgICAgZGVidWdfZXJyb3IgKF8oImRlYnVnX3dyaXRlX3R5cGU6IGlsbGVnYWwgdHlwZSBlbmNvdW50ZXJlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIERFQlVHX0tJTkRfSU5ESVJFQ1Q6Ci0gICAgICBpZiAoKnR5cGUtPnUua2luZGlyZWN0LT5zbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gKCpmbnMtPmVtcHR5X3R5cGUpIChmaGFuZGxlKTsKLSAgICAgIHJldHVybiBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsICp0eXBlLT51LmtpbmRpcmVjdC0+c2xvdCwKLQkJCSAgICAgICBuYW1lKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfVk9JRDoKLSAgICAgIHJldHVybiAoKmZucy0+dm9pZF90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX0lOVDoKLSAgICAgIHJldHVybiAoKmZucy0+aW50X3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplLCB0eXBlLT51LmtpbnQpOwotICAgIGNhc2UgREVCVUdfS0lORF9GTE9BVDoKLSAgICAgIHJldHVybiAoKmZucy0+ZmxvYXRfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnNpemUpOwotICAgIGNhc2UgREVCVUdfS0lORF9DT01QTEVYOgotICAgICAgcmV0dXJuICgqZm5zLT5jb21wbGV4X3R5cGUpIChmaGFuZGxlLCB0eXBlLT5zaXplKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQk9PTDoKLSAgICAgIHJldHVybiAoKmZucy0+Ym9vbF90eXBlKSAoZmhhbmRsZSwgdHlwZS0+c2l6ZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTCkKLQl7Ci0JICBpZiAodHlwZS0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z19zZXRfY2xhc3NfaWQgKGluZm8sIHRhZywgdHlwZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAoaW5mby0+bWFyayA9PSB0eXBlLT51LmtjbGFzcy0+bWFyaykKLQkgICAgewotCSAgICAgIC8qIFdlIGFyZSBjdXJyZW50bHkgb3V0cHV0dGluZyB0aGlzIHN0cnVjdCwgb3Igd2UgaGF2ZQotCQkgYWxyZWFkeSBvdXRwdXQgaXQuICBJIGRvbid0IGtub3cgaWYgdGhpcyBjYW4gaGFwcGVuLAotCQkgYnV0IGl0IGNhbiBoYXBwZW4gZm9yIGEgY2xhc3MuICAqLwotCSAgICAgIGFzc2VydCAodHlwZS0+dS5rY2xhc3MtPmlkID4gaW5mby0+YmFzZV9pZCk7Ci0JICAgICAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rY2xhc3MtPmlkLAotCQkJCSAgICAgICB0eXBlLT5raW5kKTsKLQkgICAgfQotCSAgdHlwZS0+dS5rY2xhc3MtPm1hcmsgPSBpbmZvLT5tYXJrOwotCX0KLQotICAgICAgaWYgKCEgKCpmbnMtPnN0YXJ0X3N0cnVjdF90eXBlKSAoZmhhbmRsZSwgdGFnLAotCQkJCSAgICAgICAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTAotCQkJCQk/IHR5cGUtPnUua2NsYXNzLT5pZAotCQkJCQk6IDApLAotCQkJCSAgICAgICB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNULAotCQkJCSAgICAgICB0eXBlLT5zaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MgIT0gTlVMTAotCSAgJiYgdHlwZS0+dS5rY2xhc3MtPmZpZWxkcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV0gIT0gTlVMTDsgaSsrKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGRlYnVnX2ZpZWxkICpmOwotCi0JICAgICAgZiA9IHR5cGUtPnUua2NsYXNzLT5maWVsZHNbaV07Ci0JICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBmLT50eXBlLAotCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCQkgIHx8ICEgKCpmbnMtPnN0cnVjdF9maWVsZCkgKGZoYW5kbGUsIGYtPm5hbWUsIGYtPnUuZi5iaXRwb3MsCi0JCQkJCSAgICAgZi0+dS5mLmJpdHNpemUsIGYtPnZpc2liaWxpdHkpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gKCpmbnMtPmVuZF9zdHJ1Y3RfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9DTEFTUzoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfY2xhc3NfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLCB0YWcpOwotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgaWYgKHR5cGUtPnUua2VudW0gPT0gTlVMTCkKLQlyZXR1cm4gKCpmbnMtPmVudW1fdHlwZSkgKGZoYW5kbGUsIHRhZywgKGNvbnN0IGNoYXIgKiopIE5VTEwsCi0JCQkJICAoYmZkX3NpZ25lZF92bWEgKikgTlVMTCk7Ci0gICAgICByZXR1cm4gKCpmbnMtPmVudW1fdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rZW51bS0+bmFtZXMsCi0JCQkJdHlwZS0+dS5rZW51bS0+dmFsdWVzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfUE9JTlRFUjoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rcG9pbnRlciwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gKCpmbnMtPnBvaW50ZXJfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9GVU5DVElPTjoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCSAgICAgIHR5cGUtPnUua2Z1bmN0aW9uLT5yZXR1cm5fdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCWlzID0gLTE7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpcyA9IDA7IHR5cGUtPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXNbaXNdICE9IE5VTEw7IGlzKyspCi0JICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgICAgdHlwZS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlc1tpc10sCi0JCQkJICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgcmV0dXJuICgqZm5zLT5mdW5jdGlvbl90eXBlKSAoZmhhbmRsZSwgaXMsCi0JCQkJICAgIHR5cGUtPnUua2Z1bmN0aW9uLT52YXJhcmdzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtyZWZlcmVuY2UsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5yZWZlcmVuY2VfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9SQU5HRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rcmFuZ2UtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5yYW5nZV90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rcmFuZ2UtPmxvd2VyLAotCQkJCSB0eXBlLT51LmtyYW5nZS0+dXBwZXIpOwotICAgIGNhc2UgREVCVUdfS0lORF9BUlJBWToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rYXJyYXktPmVsZW1lbnRfdHlwZSwKLQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKQotCSAgfHwgISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJIHR5cGUtPnUua2FycmF5LT5yYW5nZV90eXBlLAotCQkJCSAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5hcnJheV90eXBlKSAoZmhhbmRsZSwgdHlwZS0+dS5rYXJyYXktPmxvd2VyLAotCQkJCSB0eXBlLT51LmthcnJheS0+dXBwZXIsCi0JCQkJIHR5cGUtPnUua2FycmF5LT5zdHJpbmdwKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfU0VUOgotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtzZXQtPnR5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5zZXRfdHlwZSkgKGZoYW5kbGUsIHR5cGUtPnUua3NldC0+Yml0c3RyaW5ncCk7Ci0gICAgY2FzZSBERUJVR19LSU5EX09GRlNFVDoKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rb2Zmc2V0LT5iYXNlX3R5cGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkKLQkgIHx8ICEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLAotCQkJCSB0eXBlLT51LmtvZmZzZXQtPnRhcmdldF90eXBlLAotCQkJCSAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT5vZmZzZXRfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9NRVRIT0Q6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkgICAgICB0eXBlLT51LmttZXRob2QtPnJldHVybl90eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICh0eXBlLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKQotCWlzID0gLTE7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpcyA9IDA7IHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzW2lzXSAhPSBOVUxMOyBpcysrKQotCSAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsCi0JCQkJICAgIHR5cGUtPnUua21ldGhvZC0+YXJnX3R5cGVzW2lzXSwKLQkJCQkgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAodHlwZS0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSAhPSBOVUxMKQotCXsKLQkgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwKLQkJCQkgIHR5cGUtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUsCi0JCQkJICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICByZXR1cm4gKCpmbnMtPm1ldGhvZF90eXBlKSAoZmhhbmRsZSwKLQkJCQkgIHR5cGUtPnUua21ldGhvZC0+ZG9tYWluX3R5cGUgIT0gTlVMTCwKLQkJCQkgIGlzLAotCQkJCSAgdHlwZS0+dS5rbWV0aG9kLT52YXJhcmdzKTsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUtPnUua2NvbnN0LAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiAoKmZucy0+Y29uc3RfdHlwZSkgKGZoYW5kbGUpOwotICAgIGNhc2UgREVCVUdfS0lORF9WT0xBVElMRToKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rdm9sYXRpbGUsCi0JCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuICgqZm5zLT52b2xhdGlsZV90eXBlKSAoZmhhbmRsZSk7Ci0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgICAgcmV0dXJuIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgdHlwZS0+dS5rbmFtZWQtPnR5cGUsCi0JCQkgICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpOwotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICByZXR1cm4gZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB0eXBlLT51LmtuYW1lZC0+dHlwZSwKLQkJCSAgICAgICB0eXBlLT51LmtuYW1lZC0+bmFtZSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogV3JpdGUgb3V0IGEgY2xhc3MgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9jbGFzc190eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHR5cGUsIHRhZykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBpZDsKLSAgc3RydWN0IGRlYnVnX3R5cGUgKnZwdHJiYXNlOwotCi0gIGlmICh0eXBlLT51LmtjbGFzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlkID0gMDsKLSAgICAgIHZwdHJiYXNlID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPmlkIDw9IGluZm8tPmJhc2VfaWQpCi0JewotCSAgaWYgKCEgZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLCB0YWcsIHR5cGUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoaW5mby0+bWFyayA9PSB0eXBlLT51LmtjbGFzcy0+bWFyaykKLQl7Ci0JICAvKiBXZSBhcmUgY3VycmVudGx5IG91dHB1dHRpbmcgdGhpcyBjbGFzcywgb3Igd2UgaGF2ZQotCSAgICAgYWxyZWFkeSBvdXRwdXQgaXQuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGVyZSBhcmUKLQkgICAgIG1ldGhvZHMgZm9yIGFuIGFub255bW91cyBjbGFzcy4gICovCi0JICBhc3NlcnQgKHR5cGUtPnUua2NsYXNzLT5pZCA+IGluZm8tPmJhc2VfaWQpOwotCSAgcmV0dXJuICgqZm5zLT50YWdfdHlwZSkgKGZoYW5kbGUsIHRhZywgdHlwZS0+dS5rY2xhc3MtPmlkLAotCQkJCSAgIHR5cGUtPmtpbmQpOwotCX0KLSAgICAgIHR5cGUtPnUua2NsYXNzLT5tYXJrID0gaW5mby0+bWFyazsKLSAgICAgIGlkID0gdHlwZS0+dS5rY2xhc3MtPmlkOwotCi0gICAgICB2cHRyYmFzZSA9IHR5cGUtPnUua2NsYXNzLT52cHRyYmFzZTsKLSAgICAgIGlmICh2cHRyYmFzZSAhPSBOVUxMICYmIHZwdHJiYXNlICE9IHR5cGUpCi0JewotCSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCB2cHRyYmFzZSwKLQkJCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgKCpmbnMtPnN0YXJ0X2NsYXNzX3R5cGUpIChmaGFuZGxlLCB0YWcsIGlkLAotCQkJCSAgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX0NMQVNTLAotCQkJCSAgdHlwZS0+c2l6ZSwKLQkJCQkgIHZwdHJiYXNlICE9IE5VTEwsCi0JCQkJICB2cHRyYmFzZSA9PSB0eXBlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHR5cGUtPnUua2NsYXNzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5maWVsZHMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19maWVsZCAqZjsKLQotCSAgICAgIGYgPSB0eXBlLT51LmtjbGFzcy0+ZmllbGRzW2ldOwotCSAgICAgIGlmICghIGRlYnVnX3dyaXRlX3R5cGUgKGluZm8sIGZucywgZmhhbmRsZSwgZi0+dHlwZSwKLQkJCQkgICAgICAoc3RydWN0IGRlYnVnX25hbWUgKikgTlVMTCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoZi0+c3RhdGljX21lbWJlcikKLQkJewotCQkgIGlmICghICgqZm5zLT5jbGFzc19zdGF0aWNfbWVtYmVyKSAoZmhhbmRsZSwgZi0+bmFtZSwKLQkJCQkJCSAgICAgZi0+dS5zLnBoeXNuYW1lLAotCQkJCQkJICAgICBmLT52aXNpYmlsaXR5KSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmICghICgqZm5zLT5zdHJ1Y3RfZmllbGQpIChmaGFuZGxlLCBmLT5uYW1lLCBmLT51LmYuYml0cG9zLAotCQkJCQkgICAgICBmLT51LmYuYml0c2l6ZSwgZi0+dmlzaWJpbGl0eSkpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQotCXsKLQkgIGZvciAoaSA9IDA7IHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3Nlc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfYmFzZWNsYXNzICpiOwotCi0JICAgICAgYiA9IHR5cGUtPnUua2NsYXNzLT5iYXNlY2xhc3Nlc1tpXTsKLQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIGItPnR5cGUsCi0JCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX2Jhc2VjbGFzcykgKGZoYW5kbGUsIGItPmJpdHBvcywgYi0+dmlydHVhbCwKLQkJCQkJICAgICBiLT52aXNpYmlsaXR5KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodHlwZS0+dS5rY2xhc3MtPm1ldGhvZHMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyB0eXBlLT51LmtjbGFzcy0+bWV0aG9kc1tpXSAhPSBOVUxMOyBpKyspCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kICptOwotCSAgICAgIHVuc2lnbmVkIGludCBqOwotCi0JICAgICAgbSA9IHR5cGUtPnUua2NsYXNzLT5tZXRob2RzW2ldOwotCSAgICAgIGlmICghICgqZm5zLT5jbGFzc19zdGFydF9tZXRob2QpIChmaGFuZGxlLCBtLT5uYW1lKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGZvciAoaiA9IDA7IG0tPnZhcmlhbnRzW2pdICE9IE5VTEw7IGorKykKLQkJewotCQkgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqdjsKLQotCQkgIHYgPSBtLT52YXJpYW50c1tqXTsKLQkJICBpZiAodi0+Y29udGV4dCAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHYtPmNvbnRleHQsCi0JCQkJCSAgICAgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJICBpZiAoISBkZWJ1Z193cml0ZV90eXBlIChpbmZvLCBmbnMsIGZoYW5kbGUsIHYtPnR5cGUsCi0JCQkJCSAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpKQotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIGlmICh2LT52b2Zmc2V0ICE9IFZPRkZTRVRfU1RBVElDX01FVEhPRCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgKCpmbnMtPmNsYXNzX21ldGhvZF92YXJpYW50KSAoZmhhbmRsZSwgdi0+cGh5c25hbWUsCi0JCQkJCQkJICB2LT52aXNpYmlsaXR5LAotCQkJCQkJCSAgdi0+Y29uc3RwLAotCQkJCQkJCSAgdi0+dm9sYXRpbGVwLAotCQkJCQkJCSAgdi0+dm9mZnNldCwKLQkJCQkJCQkgIHYtPmNvbnRleHQgIT0gTlVMTCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KSAoZmhhbmRsZSwKLQkJCQkJCQkJIHYtPnBoeXNuYW1lLAotCQkJCQkJCQkgdi0+dmlzaWJpbGl0eSwKLQkJCQkJCQkJIHYtPmNvbnN0cCwKLQkJCQkJCQkJIHYtPnZvbGF0aWxlcCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoISAoKmZucy0+Y2xhc3NfZW5kX21ldGhvZCkgKGZoYW5kbGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAoKmZucy0+ZW5kX2NsYXNzX3R5cGUpIChmaGFuZGxlKTsKLX0KLQotLyogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZvciBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2Z1bmN0aW9uIChpbmZvLCBmbnMsIGZoYW5kbGUsIG5hbWUsIGxpbmthZ2UsIGZ1bmN0aW9uKQotICAgICBzdHJ1Y3QgZGVidWdfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICpmbnM7Ci0gICAgIFBUUiBmaGFuZGxlOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX29iamVjdF9saW5rYWdlIGxpbmthZ2U7Ci0gICAgIHN0cnVjdCBkZWJ1Z19mdW5jdGlvbiAqZnVuY3Rpb247Ci17Ci0gIHN0cnVjdCBkZWJ1Z19wYXJhbWV0ZXIgKnA7Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLQotICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGZ1bmN0aW9uLT5ibG9ja3MtPnN0YXJ0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBmdW5jdGlvbi0+cmV0dXJuX3R5cGUsCi0JCQkgIChzdHJ1Y3QgZGVidWdfbmFtZSAqKSBOVUxMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgKCpmbnMtPnN0YXJ0X2Z1bmN0aW9uKSAoZmhhbmRsZSwgbmFtZSwKLQkJCQlsaW5rYWdlID09IERFQlVHX0xJTktBR0VfR0xPQkFMKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChwID0gZnVuY3Rpb24tPnBhcmFtZXRlcnM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfd3JpdGVfdHlwZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBwLT50eXBlLAotCQkJICAgICAgKHN0cnVjdCBkZWJ1Z19uYW1lICopIE5VTEwpCi0JICB8fCAhICgqZm5zLT5mdW5jdGlvbl9wYXJhbWV0ZXIpIChmaGFuZGxlLCBwLT5uYW1lLCBwLT5raW5kLCBwLT52YWwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yIChiID0gZnVuY3Rpb24tPmJsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z193cml0ZV9ibG9jayAoaW5mbywgZm5zLCBmaGFuZGxlLCBiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiAoKmZucy0+ZW5kX2Z1bmN0aW9uKSAoZmhhbmRsZSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z193cml0ZV9ibG9jayAoaW5mbywgZm5zLCBmaGFuZGxlLCBibG9jaykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgc3RydWN0IGRlYnVnX2Jsb2NrICpibG9jazsKLXsKLSAgc3RydWN0IGRlYnVnX25hbWUgKm47Ci0gIHN0cnVjdCBkZWJ1Z19ibG9jayAqYjsKLQotICBpZiAoISBkZWJ1Z193cml0ZV9saW5lbm9zIChpbmZvLCBmbnMsIGZoYW5kbGUsIGJsb2NrLT5zdGFydCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEkgY2FuJ3Qgc2VlIGFueSBwb2ludCB0byB3cml0aW5nIG91dCBhIGJsb2NrIHdpdGggbm8gbG9jYWwKLSAgICAgdmFyaWFibGVzLCBzbyB3ZSBkb24ndCBib3RoZXIsIGV4Y2VwdCBmb3IgdGhlIHRvcCBsZXZlbCBibG9jay4gICovCi0gIGlmIChibG9jay0+bG9jYWxzICE9IE5VTEwgfHwgYmxvY2stPnBhcmVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghICgqZm5zLT5zdGFydF9ibG9jaykgKGZoYW5kbGUsIGJsb2NrLT5zdGFydCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmxvY2stPmxvY2FscyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAobiA9IGJsb2NrLT5sb2NhbHMtPmxpc3Q7IG4gIT0gTlVMTDsgbiA9IG4tPm5leHQpCi0JewotCSAgaWYgKCEgZGVidWdfd3JpdGVfbmFtZSAoaW5mbywgZm5zLCBmaGFuZGxlLCBuKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgZm9yIChiID0gYmxvY2stPmNoaWxkcmVuOyBiICE9IE5VTEw7IGIgPSBiLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGRlYnVnX3dyaXRlX2Jsb2NrIChpbmZvLCBmbnMsIGZoYW5kbGUsIGIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGVfbGluZW5vcyAoaW5mbywgZm5zLCBmaGFuZGxlLCBibG9jay0+ZW5kKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJsb2NrLT5sb2NhbHMgIT0gTlVMTCB8fCBibG9jay0+cGFyZW50ID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgKCpmbnMtPmVuZF9ibG9jaykgKGZoYW5kbGUsIGJsb2NrLT5lbmQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIG91dCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB1cCB0byBBRERSRVNTLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX3dyaXRlX2xpbmVub3MgKGluZm8sIGZucywgZmhhbmRsZSwgYWRkcmVzcykKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyAqZm5zOwotICAgICBQVFIgZmhhbmRsZTsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICB3aGlsZSAoaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm8gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfbGluZW5vICpsOwotCi0gICAgICBsID0gaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm87Ci0KLSAgICAgIHdoaWxlIChpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleCA8IERFQlVHX0xJTkVOT19DT1VOVCkKLQl7Ci0JICBpZiAobC0+bGluZW5vc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0KLQkgICAgICA9PSAodW5zaWduZWQgbG9uZykgLTEpCi0JICAgIGJyZWFrOwotCi0JICBpZiAobC0+YWRkcnNbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdID49IGFkZHJlc3MpCi0JICAgIHJldHVybiB0cnVlOwotCi0JICBpZiAoISAoKmZucy0+bGluZW5vKSAoZmhhbmRsZSwgbC0+ZmlsZS0+ZmlsZW5hbWUsCi0JCQkJbC0+bGluZW5vc1tpbmZvLT5jdXJyZW50X3dyaXRlX2xpbmVub19pbmRleF0sCi0JCQkJbC0+YWRkcnNbaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXhdKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICArK2luZm8tPmN1cnJlbnRfd3JpdGVfbGluZW5vX2luZGV4OwotCX0KLQotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm8gPSBsLT5uZXh0OwotICAgICAgaW5mby0+Y3VycmVudF93cml0ZV9saW5lbm9faW5kZXggPSAwOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogR2V0IHRoZSBJRCBudW1iZXIgZm9yIGEgY2xhc3MuICBJZiBkdXJpbmcgdGhlIHNhbWUgY2FsbCB0bwotICAgZGVidWdfd3JpdGUgd2UgZmluZCBhIHN0cnVjdCB3aXRoIHRoZSBzYW1lIGRlZmluaXRpb24gd2l0aCB0aGUgc2FtZQotICAgbmFtZSwgd2UgdXNlIHRoZSBzYW1lIElELiAgVGhpcyB0eXBlIG9mIHRoaW5ncyBoYXBwZW5zIGJlY2F1c2UgdGhlCi0gICBzYW1lIHN0cnVjdCB3aWxsIGJlIGRlZmluZWQgYnkgbXVsdGlwbGUgY29tcGlsYXRpb24gdW5pdHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZGVidWdfc2V0X2NsYXNzX2lkIChpbmZvLCB0YWcsIHR5cGUpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnR5cGU7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjOwotICBzdHJ1Y3QgZGVidWdfY2xhc3NfaWQgKmw7Ci0KLSAgYXNzZXJ0ICh0eXBlLT5raW5kID09IERFQlVHX0tJTkRfU1RSVUNUCi0JICB8fCB0eXBlLT5raW5kID09IERFQlVHX0tJTkRfVU5JT04KLQkgIHx8IHR5cGUtPmtpbmQgPT0gREVCVUdfS0lORF9DTEFTUwotCSAgfHwgdHlwZS0+a2luZCA9PSBERUJVR19LSU5EX1VOSU9OX0NMQVNTKTsKLQotICBjID0gdHlwZS0+dS5rY2xhc3M7Ci0KLSAgaWYgKGMtPmlkID4gaW5mby0+YmFzZV9pZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKGwgPSBpbmZvLT5pZF9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50eXBlLT5raW5kICE9IHR5cGUtPmtpbmQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICh0YWcgPT0gTlVMTCkKLQl7Ci0JICBpZiAobC0+dGFnICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobC0+dGFnID09IE5VTEwKLQkgICAgICB8fCBsLT50YWdbMF0gIT0gdGFnWzBdCi0JICAgICAgfHwgc3RyY21wIChsLT50YWcsIHRhZykgIT0gMCkKLQkgICAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgbC0+dHlwZSwgdHlwZSkpCi0JewotCSAgYy0+aWQgPSBsLT50eXBlLT51LmtjbGFzcy0+aWQ7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZXJlIGFyZSBubyBpZGVudGljYWwgdHlwZXMuICBVc2UgYSBuZXcgSUQsIGFuZCBhZGQgaXQgdG8gdGhlCi0gICAgIGxpc3QuICAqLwotICArK2luZm8tPmNsYXNzX2lkOwotICBjLT5pZCA9IGluZm8tPmNsYXNzX2lkOwotCi0gIGwgPSAoc3RydWN0IGRlYnVnX2NsYXNzX2lkICopIHhtYWxsb2MgKHNpemVvZiAqbCk7Ci0gIG1lbXNldCAobCwgMCwgc2l6ZW9mICpsKTsKLQotICBsLT50eXBlID0gdHlwZTsKLSAgbC0+dGFnID0gdGFnOwotCi0gIGwtPm5leHQgPSBpbmZvLT5pZF9saXN0OwotICBpbmZvLT5pZF9saXN0ID0gbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU2VlIGlmIHR3byB0eXBlcyBhcmUgdGhlIHNhbWUuICBBdCB0aGlzIHBvaW50LCB3ZSBkb24ndCBjYXJlIGFib3V0Ci0gICB0YWdzIGFuZCB0aGUgbGlrZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1kZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDIpCi0gICAgIHN0cnVjdCBkZWJ1Z19oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBkZWJ1Z190eXBlICp0MTsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQyOwotewotICBzdHJ1Y3QgZGVidWdfdHlwZV9jb21wYXJlX2xpc3QgKmw7Ci0gIHN0cnVjdCBkZWJ1Z190eXBlX2NvbXBhcmVfbGlzdCB0b3A7Ci0gIGJvb2xlYW4gcmV0OwotCi0gIGlmICh0MSA9PSBOVUxMKQotICAgIHJldHVybiB0MiA9PSBOVUxMOwotICBpZiAodDIgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hpbGUgKHQxLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgdDEgPSAqdDEtPnUua2luZGlyZWN0LT5zbG90OwotICAgICAgaWYgKHQxID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgd2hpbGUgKHQyLT5raW5kID09IERFQlVHX0tJTkRfSU5ESVJFQ1QpCi0gICAgewotICAgICAgdDIgPSAqdDItPnUua2luZGlyZWN0LT5zbG90OwotICAgICAgaWYgKHQyID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodDEgPT0gdDIpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogQXMgYSBzcGVjaWFsIGNhc2UsIHBlcm1pdCBhIHR5cGVkZWYgdG8gbWF0Y2ggYSB0YWcsIHNpbmNlIEMrKwotICAgICBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgc29tZXRpbWVzIGFkZCBhIHR5cGVkZWYgd2hlcmUgQyBkZWJ1Z2dpbmcKLSAgICAgb3V0cHV0IHdpbGwgbm90LiAgKi8KLSAgaWYgKHQxLT5raW5kID09IERFQlVHX0tJTkRfTkFNRUQKLSAgICAgICYmIHQyLT5raW5kID09IERFQlVHX0tJTkRfVEFHR0VEKQotICAgIHJldHVybiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbmFtZWQtPnR5cGUsIHQyKTsKLSAgZWxzZSBpZiAodDEtPmtpbmQgPT0gREVCVUdfS0lORF9UQUdHRUQKLQkgICAmJiB0Mi0+a2luZCA9PSBERUJVR19LSU5EX05BTUVEKQotICAgIHJldHVybiBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MSwgdDItPnUua25hbWVkLT50eXBlKTsKLQotICBpZiAodDEtPmtpbmQgIT0gdDItPmtpbmQKLSAgICAgIHx8IHQxLT5zaXplICE9IHQyLT5zaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgcmlkIG9mIHRoZSB0cml2aWFsIGNhc2VzIGZpcnN0LiAgKi8KLSAgc3dpdGNoICh0MS0+a2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9WT0lEOgotICAgIGNhc2UgREVCVUdfS0lORF9GTE9BVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfQ09NUExFWDoKLSAgICBjYXNlIERFQlVHX0tJTkRfQk9PTDoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgREVCVUdfS0lORF9JTlQ6Ci0gICAgICByZXR1cm4gdDEtPnUua2ludCA9PSB0Mi0+dS5raW50OwotICAgIH0KLQotICAvKiBXZSBoYXZlIHRvIGF2b2lkIGFuIGluZmluaXRlIHJlY3Vyc2lvbi4gIFdlIGRvIHRoaXMgYnkga2VlcGluZyBhCi0gICAgIGxpc3Qgb2YgdHlwZXMgd2hpY2ggd2UgYXJlIGNvbXBhcmluZy4gIFdlIGp1c3Qga2VlcCB0aGUgbGlzdCBvbgotICAgICB0aGUgc3RhY2suICBJZiB3ZSBlbmNvdW50ZXIgYSBwYWlyIG9mIHR5cGVzIHdlIGFyZSBjdXJyZW50bHkKLSAgICAgY29tcGFyaW5nLCB3ZSBqdXN0IGFzc3VtZSB0aGF0IHRoZXkgYXJlIGVxdWFsLiAgKi8KLSAgZm9yIChsID0gaW5mby0+Y29tcGFyZV9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChsLT50MSA9PSB0MSAmJiBsLT50MiA9PSB0MikKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgdG9wLnQxID0gdDE7Ci0gIHRvcC50MiA9IHQyOwotICB0b3AubmV4dCA9IGluZm8tPmNvbXBhcmVfbGlzdDsKLSAgaW5mby0+Y29tcGFyZV9saXN0ID0gJnRvcDsKLQotICBzd2l0Y2ggKHQxLT5raW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXQgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1NUUlVDVDoKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT046Ci0gICAgY2FzZSBERUJVR19LSU5EX0NMQVNTOgotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTl9DTEFTUzoKLSAgICAgIGlmICh0MS0+dS5rY2xhc3MgPT0gTlVMTCkKLQlyZXQgPSB0Mi0+dS5rY2xhc3MgPT0gTlVMTDsKLSAgICAgIGVsc2UgaWYgKHQyLT51LmtjbGFzcyA9PSBOVUxMKQotCXJldCA9IGZhbHNlOwotICAgICAgZWxzZSBpZiAodDEtPnUua2NsYXNzLT5pZCA+IGluZm8tPmJhc2VfaWQKLQkgICAgICAgJiYgdDEtPnUua2NsYXNzLT5pZCA9PSB0Mi0+dS5rY2xhc3MtPmlkKQotCXJldCA9IHRydWU7Ci0gICAgICBlbHNlCi0JcmV0ID0gZGVidWdfY2xhc3NfdHlwZV9zYW1lcCAoaW5mbywgdDEsIHQyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX0VOVU06Ci0gICAgICBpZiAodDEtPnUua2VudW0gPT0gTlVMTCkKLQlyZXQgPSB0Mi0+dS5rZW51bSA9PSBOVUxMOwotICAgICAgZWxzZSBpZiAodDItPnUua2VudW0gPT0gTlVMTCkKLQlyZXQgPSBmYWxzZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICoqcG4xLCAqKnBuMjsKLQkgIGJmZF9zaWduZWRfdm1hICpwdjEsICpwdjI7Ci0KLQkgIHBuMSA9IHQxLT51LmtlbnVtLT5uYW1lczsKLQkgIHBuMiA9IHQyLT51LmtlbnVtLT5uYW1lczsKLQkgIHB2MSA9IHQxLT51LmtlbnVtLT52YWx1ZXM7Ci0JICBwdjIgPSB0Mi0+dS5rZW51bS0+dmFsdWVzOwotCSAgd2hpbGUgKCpwbjEgIT0gTlVMTCAmJiAqcG4yICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoKipwbjEgIT0gKipwbjIKLQkJICB8fCAqcHYxICE9ICpwdjIKLQkJICB8fCBzdHJjbXAgKCpwbjEsICpwbjIpICE9IDApCi0JCWJyZWFrOwotCSAgICAgICsrcG4xOwotCSAgICAgICsrcG4yOwotCSAgICAgICsrcHYxOwotCSAgICAgICsrcHYyOwotCSAgICB9Ci0JICByZXQgPSAqcG4xID09IE5VTEwgJiYgKnBuMiA9PSBOVUxMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1BPSU5URVI6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rcG9pbnRlciwgdDItPnUua3BvaW50ZXIpOwotICAgICAgYnJlYWs7Ci0JICAgICAKLSAgICBjYXNlIERFQlVHX0tJTkRfRlVOQ1RJT046Ci0gICAgICBpZiAodDEtPnUua2Z1bmN0aW9uLT52YXJhcmdzICE9IHQyLT51LmtmdW5jdGlvbi0+dmFyYXJncwotCSAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlLAotCQkJCSB0Mi0+dS5rZnVuY3Rpb24tPnJldHVybl90eXBlKQotCSAgfHwgKCh0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCSAgICAgICE9ICh0Mi0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKSkpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICh0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlcyA9PSBOVUxMKQotCXJldCA9IHRydWU7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGRlYnVnX3R5cGUgKiphMSwgKiphMjsKLQotCSAgYTEgPSB0MS0+dS5rZnVuY3Rpb24tPmFyZ190eXBlczsKLQkgIGEyID0gdDItPnUua2Z1bmN0aW9uLT5hcmdfdHlwZXM7Ci0JICB3aGlsZSAoKmExICE9IE5VTEwgJiYgKmEyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCAqYTEsICphMikpCi0JCWJyZWFrOwotCSAgICAgICsrYTE7Ci0JICAgICAgKythMjsKLQkgICAgfQotCSAgcmV0ID0gKmExID09IE5VTEwgJiYgKmEyID09IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfUkVGRVJFTkNFOgotICAgICAgcmV0ID0gZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3JlZmVyZW5jZSwgdDItPnUua3JlZmVyZW5jZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9SQU5HRToKLSAgICAgIHJldCA9ICh0MS0+dS5rcmFuZ2UtPmxvd2VyID09IHQyLT51LmtyYW5nZS0+bG93ZXIKLQkgICAgICYmIHQxLT51LmtyYW5nZS0+dXBwZXIgPT0gdDItPnUua3JhbmdlLT51cHBlcgotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua3JhbmdlLT50eXBlLAotCQkJCSAgdDItPnUua3JhbmdlLT50eXBlKSk7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfQVJSQVk6Ci0gICAgICByZXQgPSAodDEtPnUua2FycmF5LT5sb3dlciA9PSB0Mi0+dS5rYXJyYXktPmxvd2VyCi0JICAgICAmJiB0MS0+dS5rYXJyYXktPnVwcGVyID09IHQyLT51LmthcnJheS0+dXBwZXIKLQkgICAgICYmIHQxLT51LmthcnJheS0+c3RyaW5ncCA9PSB0Mi0+dS5rYXJyYXktPnN0cmluZ3AKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmthcnJheS0+ZWxlbWVudF90eXBlLAotCQkJCSAgdDItPnUua2FycmF5LT5lbGVtZW50X3R5cGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX1NFVDoKLSAgICAgIHJldCA9ICh0MS0+dS5rc2V0LT5iaXRzdHJpbmdwID09IHQyLT51LmtzZXQtPmJpdHN0cmluZ3AKLQkgICAgICYmIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmtzZXQtPnR5cGUsIHQyLT51LmtzZXQtPnR5cGUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX09GRlNFVDoKLSAgICAgIHJldCA9IChkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rb2Zmc2V0LT5iYXNlX3R5cGUsCi0JCQkgICAgICAgdDItPnUua29mZnNldC0+YmFzZV90eXBlKQotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua29mZnNldC0+dGFyZ2V0X3R5cGUsCi0JCQkJICB0Mi0+dS5rb2Zmc2V0LT50YXJnZXRfdHlwZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfTUVUSE9EOgotICAgICAgaWYgKHQxLT51LmttZXRob2QtPnZhcmFyZ3MgIT0gdDItPnUua21ldGhvZC0+dmFyYXJncwotCSAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rbWV0aG9kLT5yZXR1cm5fdHlwZSwKLQkJCQkgdDItPnUua21ldGhvZC0+cmV0dXJuX3R5cGUpCi0JICB8fCAhIGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51LmttZXRob2QtPmRvbWFpbl90eXBlLAotCQkJCSB0Mi0+dS5rbWV0aG9kLT5kb21haW5fdHlwZSkKLQkgIHx8ICgodDEtPnUua21ldGhvZC0+YXJnX3R5cGVzID09IE5VTEwpCi0JICAgICAgIT0gKHQyLT51LmttZXRob2QtPmFyZ190eXBlcyA9PSBOVUxMKSkpCi0JcmV0ID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICh0MS0+dS5rbWV0aG9kLT5hcmdfdHlwZXMgPT0gTlVMTCkKLQlyZXQgPSB0cnVlOwotICAgICAgZWxzZQotCXsKLQkgIHN0cnVjdCBkZWJ1Z190eXBlICoqYTEsICoqYTI7Ci0KLQkgIGExID0gdDEtPnUua21ldGhvZC0+YXJnX3R5cGVzOwotCSAgYTIgPSB0Mi0+dS5rbWV0aG9kLT5hcmdfdHlwZXM7Ci0JICB3aGlsZSAoKmExICE9IE5VTEwgJiYgKmEyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCAqYTEsICphMikpCi0JCWJyZWFrOwotCSAgICAgICsrYTE7Ci0JICAgICAgKythMjsKLQkgICAgfQotCSAgcmV0ID0gKmExID09IE5VTEwgJiYgKmEyID09IE5VTEw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0tJTkRfQ09OU1Q6Ci0gICAgICByZXQgPSBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCB0MS0+dS5rY29uc3QsIHQyLT51Lmtjb25zdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfS0lORF9WT0xBVElMRToKLSAgICAgIHJldCA9IGRlYnVnX3R5cGVfc2FtZXAgKGluZm8sIHQxLT51Lmt2b2xhdGlsZSwgdDItPnUua3ZvbGF0aWxlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19LSU5EX05BTUVEOgotICAgIGNhc2UgREVCVUdfS0lORF9UQUdHRUQ6Ci0gICAgICByZXQgPSAoc3RyY21wICh0MS0+dS5rbmFtZWQtPm5hbWUtPm5hbWUsIHQyLT51LmtuYW1lZC0+bmFtZS0+bmFtZSkgPT0gMAotCSAgICAgJiYgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdDEtPnUua25hbWVkLT50eXBlLAotCQkJCSAgdDItPnUua25hbWVkLT50eXBlKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaW5mby0+Y29tcGFyZV9saXN0ID0gdG9wLm5leHQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU2VlIGlmIHR3byBjbGFzc2VzIGFyZSB0aGUgc2FtZS4gIFRoaXMgaXMgYSBzdWJyb3V0aW5lIG9mCi0gICBkZWJ1Z190eXBlX3NhbWVwLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWRlYnVnX2NsYXNzX3R5cGVfc2FtZXAgKGluZm8sIHQxLCB0MikKLSAgICAgc3RydWN0IGRlYnVnX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGRlYnVnX3R5cGUgKnQxOwotICAgICBzdHJ1Y3QgZGVidWdfdHlwZSAqdDI7Ci17Ci0gIHN0cnVjdCBkZWJ1Z19jbGFzc190eXBlICpjMSwgKmMyOwotCi0gIGMxID0gdDEtPnUua2NsYXNzOwotICBjMiA9IHQyLT51LmtjbGFzczsKLQotICBpZiAoKGMxLT5maWVsZHMgPT0gTlVMTCkgIT0gKGMyLT5maWVsZHMgPT0gTlVMTCkKLSAgICAgIHx8IChjMS0+YmFzZWNsYXNzZXMgPT0gTlVMTCkgIT0gKGMyLT5iYXNlY2xhc3NlcyA9PSBOVUxMKQotICAgICAgfHwgKGMxLT5tZXRob2RzID09IE5VTEwpICE9IChjMi0+bWV0aG9kcyA9PSBOVUxMKQotICAgICAgfHwgKGMxLT52cHRyYmFzZSA9PSBOVUxMKSAhPSAoYzItPnZwdHJiYXNlID09IE5VTEwpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYzEtPmZpZWxkcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19maWVsZCAqKnBmMSwgKipwZjI7Ci0KLSAgICAgIGZvciAocGYxID0gYzEtPmZpZWxkcywgcGYyID0gYzItPmZpZWxkczsKLQkgICAqcGYxICE9IE5VTEwgJiYgKnBmMiAhPSBOVUxMOwotCSAgIHBmMSsrLCBwZjIrKykKLQl7Ci0JICBzdHJ1Y3QgZGVidWdfZmllbGQgKmYxLCAqZjI7Ci0KLQkgIGYxID0gKnBmMTsKLQkgIGYyID0gKnBmMjsKLQkgIGlmIChmMS0+bmFtZVswXSAhPSBmMi0+bmFtZVswXQotCSAgICAgIHx8IGYxLT52aXNpYmlsaXR5ICE9IGYyLT52aXNpYmlsaXR5Ci0JICAgICAgfHwgZjEtPnN0YXRpY19tZW1iZXIgIT0gZjItPnN0YXRpY19tZW1iZXIpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChmMS0+c3RhdGljX21lbWJlcikKLQkgICAgewotCSAgICAgIGlmIChzdHJjbXAgKGYxLT51LnMucGh5c25hbWUsIGYyLT51LnMucGh5c25hbWUpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGYxLT51LmYuYml0cG9zICE9IGYyLT51LmYuYml0cG9zCi0JCSAgfHwgZjEtPnUuZi5iaXRzaXplICE9IGYyLT51LmYuYml0c2l6ZSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICAvKiBXZSBkbyB0aGUgY2hlY2tzIHdoaWNoIHJlcXVpcmUgZnVuY3Rpb24gY2FsbHMgbGFzdC4gIFdlCi0gICAgICAgICAgICAgZG9uJ3QgcmVxdWlyZSB0aGF0IHRoZSB0eXBlcyBvZiBmaWVsZHMgaGF2ZSB0aGUgc2FtZQotICAgICAgICAgICAgIG5hbWVzLCBzaW5jZSB0aGF0IHNvbWV0aW1lcyBmYWlscyBpbiB0aGUgcHJlc2VuY2Ugb2YKLSAgICAgICAgICAgICB0eXBlZGVmcyBhbmQgd2UgcmVhbGx5IGRvbid0IGNhcmUuICAqLwotCSAgaWYgKHN0cmNtcCAoZjEtPm5hbWUsIGYyLT5uYW1lKSAhPSAwCi0JICAgICAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLAotCQkJCSAgICAgZGVidWdfZ2V0X3JlYWxfdHlwZSAoKFBUUikgaW5mbywKLQkJCQkJCQkgIGYxLT50eXBlLCBOVUxMKSwKLQkJCQkgICAgIGRlYnVnX2dldF9yZWFsX3R5cGUgKChQVFIpIGluZm8sCi0JCQkJCQkJICBmMi0+dHlwZSwgTlVMTCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpwZjEgIT0gTlVMTCB8fCAqcGYyICE9IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYzEtPnZwdHJiYXNlICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgYzEtPnZwdHJiYXNlLCBjMi0+dnB0cmJhc2UpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGMxLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKipwYjEsICoqcGIyOwotCi0gICAgICBmb3IgKHBiMSA9IGMxLT5iYXNlY2xhc3NlcywgcGIyID0gYzItPmJhc2VjbGFzc2VzOwotCSAgICpwYjEgIT0gTlVMTCAmJiAqcGIyICE9IE5VTEw7Ci0JICAgKytwYjEsICsrcGIyKQotCXsKLQkgIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmIxLCAqYjI7Ci0KLQkgIGIxID0gKnBiMTsKLQkgIGIyID0gKnBiMjsKLQkgIGlmIChiMS0+Yml0cG9zICE9IGIyLT5iaXRwb3MKLQkgICAgICB8fCBiMS0+dmlydHVhbCAhPSBiMi0+dmlydHVhbAotCSAgICAgIHx8IGIxLT52aXNpYmlsaXR5ICE9IGIyLT52aXNpYmlsaXR5Ci0JICAgICAgfHwgISBkZWJ1Z190eXBlX3NhbWVwIChpbmZvLCBiMS0+dHlwZSwgYjItPnR5cGUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCpwYjEgIT0gTlVMTCB8fCAqcGIyICE9IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYzEtPm1ldGhvZHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZGVidWdfbWV0aG9kICoqcG0xLCAqKnBtMjsKLQotICAgICAgZm9yIChwbTEgPSBjMS0+bWV0aG9kcywgcG0yID0gYzItPm1ldGhvZHM7Ci0JICAgKnBtMSAhPSBOVUxMICYmICpwbTIgIT0gTlVMTDsKLQkgICArK3BtMSwgKytwbTIpCi0JewotCSAgc3RydWN0IGRlYnVnX21ldGhvZCAqbTEsICptMjsKLQotCSAgbTEgPSAqcG0xOwotCSAgbTIgPSAqcG0yOwotCSAgaWYgKG0xLT5uYW1lWzBdICE9IG0yLT5uYW1lWzBdCi0JICAgICAgfHwgc3RyY21wIChtMS0+bmFtZSwgbTItPm5hbWUpICE9IDAKLQkgICAgICB8fCAobTEtPnZhcmlhbnRzID09IE5VTEwpICE9IChtMi0+dmFyaWFudHMgPT0gTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChtMS0+dmFyaWFudHMgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKnB2MSwgKipwdjI7Ci0KLQkgICAgICBmb3IgKHB2MSA9IG0xLT52YXJpYW50cywgcHYyID0gbTItPnZhcmlhbnRzOwotCQkgICAqcHYxICE9IE5VTEwgJiYgKnB2MiAhPSBOVUxMOwotCQkgICArK3B2MSwgKytwdjIpCi0JCXsKLQkJICBzdHJ1Y3QgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnYxLCAqdjI7Ci0KLQkJICB2MSA9ICpwdjE7Ci0JCSAgdjIgPSAqcHYyOwotCQkgIGlmICh2MS0+cGh5c25hbWVbMF0gIT0gdjItPnBoeXNuYW1lWzBdCi0JCSAgICAgIHx8IHYxLT52aXNpYmlsaXR5ICE9IHYyLT52aXNpYmlsaXR5Ci0JCSAgICAgIHx8IHYxLT5jb25zdHAgIT0gdjItPmNvbnN0cAotCQkgICAgICB8fCB2MS0+dm9sYXRpbGVwICE9IHYyLT52b2xhdGlsZXAKLQkJICAgICAgfHwgdjEtPnZvZmZzZXQgIT0gdjItPnZvZmZzZXQKLQkJICAgICAgfHwgKHYxLT5jb250ZXh0ID09IE5VTEwpICE9ICh2Mi0+Y29udGV4dCA9PSBOVUxMKQotCQkgICAgICB8fCBzdHJjbXAgKHYxLT5waHlzbmFtZSwgdjItPnBoeXNuYW1lKSAhPSAwCi0JCSAgICAgIHx8ICEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdjEtPnR5cGUsIHYyLT50eXBlKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBpZiAodjEtPmNvbnRleHQgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgaWYgKCEgZGVidWdfdHlwZV9zYW1lcCAoaW5mbywgdjEtPmNvbnRleHQsCi0JCQkJCSAgICAgIHYyLT5jb250ZXh0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGlmICgqcHYxICE9IE5VTEwgfHwgKnB2MiAhPSBOVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoKnBtMSAhPSBOVUxMIHx8ICpwbTIgIT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVidWcuaCBiL2JpbnV0aWxzL2RlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODkwYjIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5OCArMCwwIEBACi0vKiBkZWJ1Zy5oIC0tIERlc2NyaWJlIGdlbmVyaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgREVCVUdfSAotI2RlZmluZSBERUJVR19ICi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgZGVzY3JpYmVzIGEgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotICAgV2UgbWF5IGV2ZW50dWFsbHkgaGF2ZSByZWFkZXJzIHdoaWNoIGNvbnZlcnQgZGlmZmVyZW50IGZvcm1hdHMgaW50bwotICAgdGhpcyBnZW5lcmljIGZvcm1hdCwgYW5kIHdyaXRlcnMgd2hpY2ggd3JpdGUgaXQgb3V0LiAgVGhlIGluaXRpYWwKLSAgIGltcGV0dXMgZm9yIHRoaXMgd2FzIHdyaXRpbmcgYSBjb252ZXJ0b3IgZnJvbSBzdGFicyB0byBIUCBJRUVFLTY5NQotICAgZGVidWdnaW5nIGZvcm1hdC4gICovCi0KLS8qIERpZmZlcmVudCBraW5kcyBvZiB0eXBlcy4gICovCi0KLWVudW0gZGVidWdfdHlwZV9raW5kCi17Ci0gIC8qIE5vdCB1c2VkLiAgKi8KLSAgREVCVUdfS0lORF9JTExFR0FMLAotICAvKiBJbmRpcmVjdCB2aWEgYSBwb2ludGVyLiAgKi8KLSAgREVCVUdfS0lORF9JTkRJUkVDVCwKLSAgLyogVm9pZC4gICovCi0gIERFQlVHX0tJTkRfVk9JRCwKLSAgLyogSW50ZWdlci4gICovCi0gIERFQlVHX0tJTkRfSU5ULAotICAvKiBGbG9hdGluZyBwb2ludC4gICovCi0gIERFQlVHX0tJTkRfRkxPQVQsCi0gIC8qIENvbXBsZXguICAqLwotICBERUJVR19LSU5EX0NPTVBMRVgsCi0gIC8qIEJvb2xlYW4uICAqLwotICBERUJVR19LSU5EX0JPT0wsCi0gIC8qIFN0cnVjdC4gICovCi0gIERFQlVHX0tJTkRfU1RSVUNULAotICAvKiBVbmlvbi4gICovCi0gIERFQlVHX0tJTkRfVU5JT04sCi0gIC8qIENsYXNzLiAgKi8KLSAgREVCVUdfS0lORF9DTEFTUywKLSAgLyogVW5pb24gY2xhc3MgKGNhbiB0aGlzIHJlYWxseSBoYXBwZW4/KS4gICovCi0gIERFQlVHX0tJTkRfVU5JT05fQ0xBU1MsCi0gIC8qIEVudW1lcmF0aW9uIHR5cGUuICAqLwotICBERUJVR19LSU5EX0VOVU0sCi0gIC8qIFBvaW50ZXIuICAqLwotICBERUJVR19LSU5EX1BPSU5URVIsCi0gIC8qIEZ1bmN0aW9uLiAgKi8KLSAgREVCVUdfS0lORF9GVU5DVElPTiwKLSAgLyogUmVmZXJlbmNlLiAgKi8KLSAgREVCVUdfS0lORF9SRUZFUkVOQ0UsCi0gIC8qIFJhbmdlLiAgKi8KLSAgREVCVUdfS0lORF9SQU5HRSwKLSAgLyogQXJyYXkuICAqLwotICBERUJVR19LSU5EX0FSUkFZLAotICAvKiBTZXQuICAqLwotICBERUJVR19LSU5EX1NFVCwKLSAgLyogQmFzZWQgcG9pbnRlci4gICovCi0gIERFQlVHX0tJTkRfT0ZGU0VULAotICAvKiBNZXRob2QuICAqLwotICBERUJVR19LSU5EX01FVEhPRCwKLSAgLyogQ29uc3QgcXVhbGlmaWVkIHR5cGUuICAqLwotICBERUJVR19LSU5EX0NPTlNULAotICAvKiBWb2xhdGlsZSBxdWFsaWZpZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfVk9MQVRJTEUsCi0gIC8qIE5hbWVkIHR5cGUuICAqLwotICBERUJVR19LSU5EX05BTUVELAotICAvKiBUYWdnZWQgdHlwZS4gICovCi0gIERFQlVHX0tJTkRfVEFHR0VECi19OwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgdmFyaWFibGVzLiAgKi8KLQotZW51bSBkZWJ1Z192YXJfa2luZAotewotICAvKiBOb3QgdXNlZC4gICovCi0gIERFQlVHX1ZBUl9JTExFR0FMLAotICAvKiBBIGdsb2JhbCB2YXJpYWJsZS4gICovCi0gIERFQlVHX0dMT0JBTCwKLSAgLyogQSBzdGF0aWMgdmFyaWFibGUuICAqLwotICBERUJVR19TVEFUSUMsCi0gIC8qIEEgbG9jYWwgc3RhdGljIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfTE9DQUxfU1RBVElDLAotICAvKiBBIGxvY2FsIHZhcmlhYmxlLiAgKi8KLSAgREVCVUdfTE9DQUwsCi0gIC8qIEEgcmVnaXN0ZXIgdmFyaWFibGUuICAqLwotICBERUJVR19SRUdJU1RFUgotfTsKLQotLyogRGlmZmVyZW50IGtpbmRzIG9mIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1lbnVtIGRlYnVnX3Bhcm1fa2luZAotewotICAvKiBOb3QgdXNlZC4gICovCi0gIERFQlVHX1BBUk1fSUxMRUdBTCwKLSAgLyogQSBzdGFjayBiYXNlZCBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1NUQUNLLAotICAvKiBBIHJlZ2lzdGVyIHBhcmFtZXRlci4gICovCi0gIERFQlVHX1BBUk1fUkVHLAotICAvKiBBIHN0YWNrIGJhc2VkIHJlZmVyZW5jZSBwYXJhbWV0ZXIuICAqLwotICBERUJVR19QQVJNX1JFRkVSRU5DRSwKLSAgLyogQSByZWdpc3RlciByZWZlcmVuY2UgcGFyYW1ldGVyLiAgKi8KLSAgREVCVUdfUEFSTV9SRUZfUkVHCi19OwotCi0vKiBEaWZmZXJlbnQga2luZHMgb2YgdmlzaWJpbGl0eS4gICovCi0KLWVudW0gZGVidWdfdmlzaWJpbGl0eQotewotICAvKiBBIHB1YmxpYyBmaWVsZCAoZS5nLiwgYSBmaWVsZCBpbiBhIEMgc3RydWN0KS4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDLAotICAvKiBBIHByb3RlY3RlZCBmaWVsZC4gICovCi0gIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVELAotICAvKiBBIHByaXZhdGUgZmllbGQuICAqLwotICBERUJVR19WSVNJQklMSVRZX1BSSVZBVEUsCi0gIC8qIEEgZmllbGQgd2hpY2ggc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICBERUJVR19WSVNJQklMSVRZX0lHTk9SRQotfTsKLQotLyogQSB0eXBlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfdHlwZSAqZGVidWdfdHlwZTsKLQotI2RlZmluZSBERUJVR19UWVBFX05VTEwgKChkZWJ1Z190eXBlKSBOVUxMKQotCi0vKiBBIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfZmllbGQgKmRlYnVnX2ZpZWxkOwotCi0jZGVmaW5lIERFQlVHX0ZJRUxEX05VTEwgKChkZWJ1Z19maWVsZCkgTlVMTCkKLQotLyogQSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19iYXNlY2xhc3MgKmRlYnVnX2Jhc2VjbGFzczsKLQotI2RlZmluZSBERUJVR19CQVNFQ0xBU1NfTlVMTCAoKGRlYnVnX2Jhc2VjbGFzcykgTlVMTCkKLQotLyogQSBtZXRob2Qgb2YgYW4gb2JqZWN0LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVidWdfbWV0aG9kICpkZWJ1Z19tZXRob2Q7Ci0KLSNkZWZpbmUgREVCVUdfTUVUSE9EX05VTEwgKChkZWJ1Z19tZXRob2QpIE5VTEwpCi0KLS8qIFRoZSBhcmd1bWVudHMgdG8gYSBtZXRob2QgZnVuY3Rpb24gb2YgYW4gb2JqZWN0LiAgVGhlc2UgaW5kaWNhdGUKLSAgIHdoaWNoIG1ldGhvZCB0byBydW4uICAqLwotCi10eXBlZGVmIHN0cnVjdCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqZGVidWdfbWV0aG9kX3ZhcmlhbnQ7Ci0KLSNkZWZpbmUgREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTCAoKGRlYnVnX21ldGhvZF92YXJpYW50KSBOVUxMKQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyBwYXNzZWQgdG8gZGVidWdfd3JpdGUuICBJdCBob2xkcyBmdW5jdGlvbgotICAgcG9pbnRlcnMgdGhhdCBkZWJ1Z193cml0ZSB3aWxsIGNhbGwgYmFzZWQgb24gdGhlIGFjY3VtdWxhdGVkCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZGVidWdfd3JpdGVfZm5zCi17Ci0gIC8qIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIG5ldyBjb21waWxhdGlvbiB1bml0IHdpdGggdGhlCi0gICAgIG5hbWUgb2YgdGhlIG1haW4gZmlsZSBpbiB0aGUgbmV3IHVuaXQuICAqLwotICBib29sZWFuICgqc3RhcnRfY29tcGlsYXRpb25fdW5pdCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB3aXRoaW4gYQotICAgICBjb21waWxhdGlvbiB1bml0LCBiZWZvcmUgb3V0cHV0dGluZyBhbnkgZ2xvYmFsIGluZm9ybWF0aW9uIGZvcgotICAgICB0aGF0IGZpbGUuICBUaGUgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBib29sZWFuICgqc3RhcnRfc291cmNlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIEVhY2ggd3JpdGVyIG11c3Qga2VlcCBhIHN0YWNrIG9mIHR5cGVzLiAgKi8KLQotICAvKiBQdXNoIGFuIGVtcHR5IHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gIFRoaXMgdHlwZSBjYW4gYXBwZWFyIGlmCi0gICAgIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgdHlwZSB3aGljaCBpcyBuZXZlciBkZWZpbmVkLiAgKi8KLSAgYm9vbGVhbiAoKmVtcHR5X3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYSB2b2lkIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp2b2lkX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYW4gaW50ZWdlciB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplIGFuZAotICAgICB3aGV0aGVyIGl0IGlzIHVuc2lnbmVkLiAgKi8KLSAgYm9vbGVhbiAoKmludF90eXBlKSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotCi0gIC8qIFB1c2ggYSBmbG9hdGluZyB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2ssIGdpdmVuIHRoZSBzaXplLiAgKi8KLSAgYm9vbGVhbiAoKmZsb2F0X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhIGNvbXBsZXggdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpjb21wbGV4X3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhIGJvb2xlYW4gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLCBnaXZlbiB0aGUgc2l6ZS4gICovCi0gIGJvb2xlYW4gKCpib29sX3R5cGUpIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLSAgLyogUHVzaCBhbiBlbnVtIHR5cGUgb250byB0aGUgdHlwZSBzdGFjaywgZ2l2ZW4gdGhlIHRhZywgYSBOVUxMCi0gICAgIHRlcm1pbmF0ZWQgYXJyYXkgb2YgbmFtZXMgYW5kIHRoZSBhc3NvY2lhdGVkIHZhbHVlcy4gIElmIHRoZXJlIGlzCi0gICAgIG5vIHRhZywgdGhlIHRhZyBhcmd1bWVudCB3aWxsIGJlIE5VTEwuICBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZAotICAgICBlbnVtLCB0aGUgbmFtZXMgYW5kIHZhbHVlcyBhcmd1bWVudHMgd2lsbCBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKmVudW1fdHlwZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCi0JCQkJYmZkX3NpZ25lZF92bWEgKikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgcG9pbnRlciB0byB0aGF0Ci0gICAgIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpwb2ludGVyX3R5cGUpIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFB1c2ggYSBmdW5jdGlvbiB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50IHR5cGVzIHRoYXQgaGF2ZSBiZWVuIHB1c2hlZCBvbnRvCi0gICAgIHRoZSBzdGFjay4gIElmIHRoZSBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXMgaXMgcGFzc2VkIGFzIC0xLCB0aGVuCi0gICAgIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgZnVuY3Rpb24gYXJlIHVua25vd24sIGFuZCBubyB0eXBlcyBoYXZlCi0gICAgIGJlZW4gcHVzaGVkIG9udG8gdGhlIHN0YWNrLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlCi0gICAgIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSByZXR1cm4gdHlwZQotICAgICBvZiB0aGUgZnVuY3Rpb24gaXMgcHVzaGVkIG9udG8gdGhlIHR5cGUgc3RhY2sgYmVsb3cgdGhlIGFyZ3VtZW50Ci0gICAgIHR5cGVzLCBpZiBhbnkuICAqLwotICBib29sZWFuICgqZnVuY3Rpb25fdHlwZSkgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLQotICAvKiBQb3AgdGhlIHRvcCB0eXBlIG9uIHRoZSB0eXBlIHN0YWNrLCBhbmQgcHVzaCBhIHJlZmVyZW5jZSB0byB0aGF0Ci0gICAgIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpyZWZlcmVuY2VfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvbiB0aGUgdHlwZSBzdGFjaywgYW5kIHB1c2ggYSByYW5nZSBvZiB0aGF0IHR5cGUKLSAgICAgd2l0aCB0aGUgZ2l2ZW4gbG93ZXIgYW5kIHVwcGVyIGJvdW5kcyBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnJhbmdlX3R5cGUpIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci0KLSAgLyogUHVzaCBhbiBhcnJheSB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgdG9wIHR5cGUgb24gdGhlIHR5cGUKLSAgICAgc3RhY2sgaXMgdGhlIHJhbmdlLCBhbmQgdGhlIG5leHQgdHlwZSBvbiB0aGUgdHlwZSBzdGFjayBpcyB0aGUKLSAgICAgZWxlbWVudCB0eXBlLiAgVGhlc2Ugc2hvdWxkIGJlIHBvcHBlZCBiZWZvcmUgdGhlIGFycmF5IHR5cGUgaXMKLSAgICAgcHVzaGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIGxvd2VyIGJvdW5kLCB0aGUgdXBwZXIgYm91bmQsIGFuZAotICAgICB3aGV0aGVyIHRoZSBhcnJheSBpcyBhIHN0cmluZy4gICovCi0gIGJvb2xlYW4gKCphcnJheV90eXBlKSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwKLQkJCQkgYm9vbGVhbikpOwotCi0gIC8qIFBvcCB0aGUgdG9wIHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgc2V0IG9mIHRoYXQgdHlwZQotICAgICBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50IGluZGljYXRlcyB3aGV0aGVyIHRoaXMgc2V0IGlzCi0gICAgIGEgYml0c3RyaW5nLiAgKi8KLSAgYm9vbGVhbiAoKnNldF90eXBlKSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLQotICAvKiBQdXNoIGFuIG9mZnNldCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBUaGUgdG9wIHR5cGUgb24gdGhlCi0gICAgIHR5cGUgc3RhY2sgaXMgdGhlIHRhcmdldCB0eXBlLCBhbmQgdGhlIG5leHQgdHlwZSBvbiB0aGUgdHlwZQotICAgICBzdGFjayBpcyB0aGUgYmFzZSB0eXBlLiAgVGhlc2Ugc2hvdWxkIGJlIHBvcHBlZCBiZWZvcmUgdGhlIG9mZnNldAotICAgICB0eXBlIGlzIHB1c2hlZC4gICovCi0gIGJvb2xlYW4gKCpvZmZzZXRfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIG1ldGhvZCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgIGlzIHRydWUsIHRoZSB0b3AgdHlwZSBvbiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzIHRvIHdoaWNoIHRoZQotICAgICBtZXRob2QgYmVsb25nczsgb3RoZXJ3aXNlLCB0aGUgY2xhc3MgbXVzdCBiZSBkZXRlcm1pbmVkIGJ5IHRoZQotICAgICBjbGFzcyB0byB3aGljaCB0aGUgbWV0aG9kIGlzIGF0dGFjaGVkLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZQotICAgICBudW1iZXIgb2YgYXJndW1lbnQgdHlwZXM7IHRoZXNlIGFyZSBwdXNoZWQgb250byB0aGUgdHlwZSBzdGFjayBpbgotICAgICByZXZlcnNlIG9yZGVyICh0aGUgZmlyc3QgdHlwZSBwb3BwZWQgaXMgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlCi0gICAgIG1ldGhvZCkuICBBIHZhbHVlIG9mIC0xIGZvciB0aGUgdGhpcmQgYXJndW1lbnQgbWVhbnMgdGhhdCBubwotICAgICBhcmd1bWVudCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUKLSAgICAgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gIFRoZSBuZXh0Ci0gICAgIHR5cGUgb24gdGhlIHR5cGUgc3RhY2sgYmVsb3cgdGhlIGRvbWFpbiBhbmQgdGhlIGFyZ3VtZW50IHR5cGVzIGlzCi0gICAgIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kLiAgQWxsIHRoZXNlIHR5cGVzIG11c3QgYmUgcG9wcGVkLAotICAgICBhbmQgdGhlbiB0aGUgbWV0aG9kIHR5cGUgbXVzdCBiZSBwdXNoZWQuICAqLwotICBib29sZWFuICgqbWV0aG9kX3R5cGUpIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgY29uc3QgcXVhbGlmaWVkCi0gICAgIHZlcnNpb24gb2YgdGhhdCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqY29uc3RfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUG9wIHRoZSB0b3AgdHlwZSBvZmYgdGhlIHR5cGUgc3RhY2ssIGFuZCBwdXNoIGEgdm9sYXRpbGUKLSAgICAgcXVhbGlmaWVkIHZlcnNpb24gb2YgdGhhdCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqdm9sYXRpbGVfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogU3RhcnQgYnVpbGRpbmcgYSBzdHJ1Y3QuICBUaGlzIGlzIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIHRoZQotICAgICBzdHJ1Y3RfZmllbGQgZnVuY3Rpb24sIGFuZCBmaW5pc2hlZCBieSBhIGNhbGwgdG8gdGhlCi0gICAgIGVuZF9zdHJ1Y3RfdHlwZSBmdW5jdGlvbi4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHRhZzsgdGhpcwotICAgICB3aWxsIGJlIE5VTEwgaWYgdGhlcmUgaXNuJ3Qgb25lLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBOVUxMLAotICAgICB0aGUgdGhpcmQgYXJndW1lbnQgaXMgYSBjb25zdGFudCBpZGVudGlmeWluZyB0aGlzIHN0cnVjdCBmb3IgdXNlCi0gICAgIHdpdGggdGFnX3R5cGUuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LCBmYWxzZQotICAgICBmb3IgYSB1bmlvbi4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZS4gIElmIHRoaXMgaXMgYW4KLSAgICAgdW5kZWZpbmVkIHN0cnVjdCBvciB1bmlvbiwgdGhlIHNpemUgd2lsbCBiZSAwIGFuZCBzdHJ1Y3RfZmllbGQKLSAgICAgd2lsbCBub3QgYmUgY2FsbGVkIGJlZm9yZSBlbmRfc3RydWN0X3R5cGUgaXMgY2FsbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X3N0cnVjdF90eXBlKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCQkJCQlib29sZWFuLCB1bnNpZ25lZCBpbnQpKTsKLQotICAvKiBBZGQgYSBmaWVsZCB0byB0aGUgc3RydWN0IHR5cGUgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhlIHR5cGUKLSAgICAgb2YgdGhlIGZpZWxkIHNob3VsZCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50cwotICAgICBhcmUgdGhlIG5hbWUsIHRoZSBiaXQgcG9zaXRpb24sIHRoZSBiaXQgc2l6ZSAobWF5IGJlIHplcm8gaWYgdGhlCi0gICAgIGZpZWxkIGlzIG5vdCBwYWNrZWQpLCBhbmQgdGhlIHZpc2liaWxpdHkuICAqLwotICBib29sZWFuICgqc3RydWN0X2ZpZWxkKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwKLQkJCQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotICAvKiBGaW5pc2ggYnVpbGRpbmcgYSBzdHJ1Y3QsIGFuZCBwdXNoIGl0IG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqZW5kX3N0cnVjdF90eXBlKSBQQVJBTVMgKChQVFIpKTsKLQotICAvKiBTdGFydCBidWlsZGluZyBhIGNsYXNzLiAgVGhpcyBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBzZXZlcmFsCi0gICAgIGZ1bmN0aW9uczogc3RydWN0X2ZpZWxkLCBjbGFzc19zdGF0aWNfbWVtYmVyLCBjbGFzc19iYXNlY2xhc3MsCi0gICAgIGNsYXNzX3N0YXJ0X21ldGhvZCwgY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gICAgIGNsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwgYW5kIGNsYXNzX2VuZF9tZXRob2QuICBUaGUgY2xhc3MgaXMKLSAgICAgZmluaXNoZWQgYnkgYSBjYWxsIHRvIGVuZF9jbGFzc190eXBlLiAgVGhlIGZpcnN0IGZpdmUgYXJndW1lbnRzCi0gICAgIGFyZSB0aGUgc2FtZSBhcyBmb3Igc3RhcnRfc3RydWN0X3R5cGUuICBUaGUgc2l4dGggYXJndW1lbnQgaXMKLSAgICAgdHJ1ZSBpZiB0aGVyZSBpcyBhIHZpcnR1YWwgZnVuY3Rpb24gdGFibGU7IGlmIHRoZXJlIGlzLCB0aGUKLSAgICAgc2V2ZW50aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIGNhbiBiZQotICAgICBmb3VuZCBpbiB0aGUgdHlwZSBpdHNlbGYsIGFuZCBpcyBmYWxzZSBpZiB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0Ci0gICAgIGhvbGRpbmcgdGhlIHZpcnR1YWwgZnVuY3Rpb24gdGFibGUgc2hvdWxkIGJlIHBvcHBlZCBmcm9tIHRoZSB0eXBlCi0gICAgIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnN0YXJ0X2NsYXNzX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJICAgICAgIGJvb2xlYW4sIHVuc2lnbmVkIGludCwgYm9vbGVhbiwKLQkJCQkgICAgICAgYm9vbGVhbikpOwotCi0gIC8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZQotICAgICBhcmd1bWVudHMgYXJlIHRoZSBmaWVsZCBuYW1lLCB0aGUgcGh5c2ljYWwgbmFtZSwgYW5kIHRoZQotICAgICB2aXNpYmlsaXR5LiAgVGhlIHR5cGUgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX3N0YXRpY19tZW1iZXIpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCi0JCQkJCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0gIAotICAvKiBBZGQgYSBiYXNlY2xhc3MgdG8gdGhlIGNsYXNzIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFRoZSB0eXBlIG9mCi0gICAgIHRoZSBiYXNlY2xhc3MgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGFyZ3VtZW50cwotICAgICBhcmUgdGhlIGJpdCBwb3NpdGlvbiwgd2hldGhlciB0aGUgY2xhc3MgaXMgdmlydHVhbCwgYW5kIHRoZQotICAgICB2aXNpYmlsaXR5LiAgKi8KLSAgYm9vbGVhbiAoKmNsYXNzX2Jhc2VjbGFzcykgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLAotCQkJCSAgICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0gIC8qIFN0YXJ0IGFkZGluZyBhIG1ldGhvZCB0byB0aGUgY2xhc3MgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVGhpcwotICAgICBpcyBmb2xsb3dlZCBieSBjYWxscyB0byBjbGFzc19tZXRob2RfdmFyaWFudCBhbmQKLSAgICAgY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IHRvIGRlc2NyaWJlIGRpZmZlcmVudCB2YXJpYW50cyBvZiB0aGUKLSAgICAgbWV0aG9kIHdoaWNoIHRha2UgZGlmZmVyZW50IGFyZ3VtZW50cy4gIFRoZSBtZXRob2QgaXMgZmluaXNoZWQKLSAgICAgd2l0aCBhIGNhbGwgdG8gY2xhc3NfZW5kX21ldGhvZC4gIFRoZSBhcmd1bWVudCBpcyB0aGUgbWV0aG9kCi0gICAgIG5hbWUuICAqLwotICBib29sZWFuICgqY2xhc3Nfc3RhcnRfbWV0aG9kKSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0gIC8qIERlc2NyaWJlIGEgdmFyaWFudCB0byB0aGUgY2xhc3MgbWV0aG9kIGN1cnJlbnRseSBiZWluZyBidWlsdC4KLSAgICAgVGhlIHR5cGUgb2YgdGhlIHZhcmlhbnQgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlCi0gICAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcGh5c2ljYWwgbmFtZSBvZiB0aGUgZnVuY3Rpb24uICBUaGUKLSAgICAgZm9sbG93aW5nIGFyZ3VtZW50cyBhcmUgdGhlIHZpc2liaWxpdHksIHdoZXRoZXIgdGhlIHZhcmlhbnQgaXMKLSAgICAgY29uc3QsIHdoZXRoZXIgdGhlIHZhcmlhbnQgaXMgdm9sYXRpbGUsIHRoZSBvZmZzZXQgaW4gdGhlIHZpcnR1YWwKLSAgICAgZnVuY3Rpb24gdGFibGUsIGFuZCB3aGV0aGVyIHRoZSBjb250ZXh0IGlzIG9uIHRoZSB0eXBlIHN0YWNrCi0gICAgIChiZWxvdyB0aGUgdmFyaWFudCB0eXBlKS4gICovCi0gIGJvb2xlYW4gKCpjbGFzc19tZXRob2RfdmFyaWFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosCi0JCQkJCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSwKLQkJCQkJICAgYm9vbGVhbiwgYm9vbGVhbiwKLQkJCQkJICAgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi0gIC8qIERlc2NyaWJlIGEgc3RhdGljIHZhcmlhbnQgdG8gdGhlIGNsYXNzIG1ldGhvZCBjdXJyZW50bHkgYmVpbmcKLSAgICAgYnVpbHQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gICAgIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmd1bWVudHMgYXJlIG9taXR0ZWQuICBUaGUgdHlwZSBvZiB0aGUKLSAgICAgdmFyaWFudCBtdXN0IGJlIHBvcHBlZCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotICBib29sZWFuICgqY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwKLQkJCQkJCSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5LAotCQkJCQkJICBib29sZWFuLCBib29sZWFuKSk7Ci0KLSAgLyogRmluaXNoIGRlc2NyaWJpbmcgYSBjbGFzcyBtZXRob2QuICAqLwotICBib29sZWFuICgqY2xhc3NfZW5kX21ldGhvZCkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogRmluaXNoIGRlc2NyaWJpbmcgYSBjbGFzcywgYW5kIHB1c2ggaXQgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCplbmRfY2xhc3NfdHlwZSkgUEFSQU1TICgoUFRSKSk7Ci0KLSAgLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHdoaWNoIHdhcyBnaXZlbiBhIG5hbWUgYnkgYW4gZWFybGllcgotICAgICBjYWxsIHRvIHR5cGRlZi4gICovCi0gIGJvb2xlYW4gKCp0eXBlZGVmX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogUHVzaCBhIHRhZ2dlZCB0eXBlIG9uIHRoZSBzdGFjayB3aGljaCB3YXMgZGVmaW5lZCBlYXJsaWVyLiAgSWYKLSAgICAgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QgTlVMTCwgdGhlIHR5cGUgd2FzIGRlZmluZWQgYnkgYSBjYWxsCi0gICAgIHRvIHRhZy4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgTlVMTCwgdGhlIHR5cGUgd2FzIGRlZmluZWQgYnkKLSAgICAgYSBjYWxsIHRvIHN0YXJ0X3N0cnVjdF90eXBlIG9yIHN0YXJ0X2NsYXNzX3R5cGUgd2l0aCBhIHRhZyBvZgotICAgICBOVUxMIGFuZCB0aGUgbnVtYmVyIG9mIHRoZSB0aGlyZCBhcmd1bWVudC4gIEVpdGhlciB3YXksIHRoZQotICAgICBmb3VydGggYXJndW1lbnQgaXMgdGhlIHRhZyBraW5kLiAgTm90ZSB0aGF0IHRoaXMgbWF5IGJlIGNhbGxlZAotICAgICBmb3IgYSBzdHJ1Y3QgKGNsYXNzKSBiZWluZyBkZWZpbmVkLCBpbiBiZXR3ZWVuIHRoZSBjYWxsIHRvCi0gICAgIHN0YXJ0X3N0cnVjdF90eXBlIChzdGFydF9jbGFzc190eXBlKSBhbmQgdGhlIGNhbGwgdG8KLSAgICAgZW5kX3N0cnVjdF90eXBlIChlbmRfY2xhc3NfdHlwZSkuICAqLwotICBib29sZWFuICgqdGFnX3R5cGUpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLQotICAvKiBQb3AgdGhlIHR5cGUgc3RhY2ssIGFuZCB0eXBlZGVmIGl0IHRvIHRoZSBnaXZlbiBuYW1lLiAgKi8KLSAgYm9vbGVhbiAoKnR5cGRlZikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBQb3AgdGhlIHR5cGUgc3RhY2ssIGFuZCBkZWNsYXJlIGl0IGFzIGEgdGFnZ2VkIHN0cnVjdCBvciB1bmlvbiBvcgotICAgICBlbnVtIG9yIHdoYXRldmVyLiAgVGhlIHRhZyBwYXNzZWQgZG93biBoZXJlIGlzIHJlZHVuZGFudCwgc2luY2UKLSAgICAgd2FzIGFsc28gcGFzc2VkIHdoZW4gZW51bV90eXBlLCBzdGFydF9zdHJ1Y3RfdHlwZSwgb3IKLSAgICAgc3RhcnRfY2xhc3NfdHlwZSB3YXMgY2FsbGVkLiAgKi8KLSAgYm9vbGVhbiAoKnRhZykgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSBuYW1lZCBpbnRlZ2VyIGNvbnN0YW50LiAgKi8KLSAgYm9vbGVhbiAoKmludF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLQotICAvKiBUaGlzIGlzIGNhbGxlZCB0byByZWNvcmQgYSBuYW1lZCBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0gIGJvb2xlYW4gKCpmbG9hdF9jb25zdGFudCkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIHR5cGVkIGludGVnZXIgY29uc3RhbnQuICBUaGUgdHlwZSBpcwotICAgICBwb3BwZWQgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLSAgYm9vbGVhbiAoKnR5cGVkX2NvbnN0YW50KSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotCi0gIC8qIFRoaXMgaXMgY2FsbGVkIHRvIHJlY29yZCBhIHZhcmlhYmxlLiAgVGhlIHR5cGUgaXMgcG9wcGVkIG9mZiB0aGUKLSAgICAgdHlwZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCp2YXJpYWJsZSkgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsCi0JCQkgICAgICAgYmZkX3ZtYSkpOwotCi0gIC8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgZnVuY3Rpb24uICBUaGUgcmV0dXJuIHR5cGUgbXVzdCBiZSBwb3BwZWQgb2ZmCi0gICAgIHRoZSBzdGFjay4gIFRoZSBib29sZWFuIGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGlzIGdsb2JhbC4gIFRoaXMKLSAgICAgaXMgZm9sbG93ZWQgYnkgY2FsbHMgdG8gZnVuY3Rpb25fcGFyYW1ldGVyLCBmb2xsb3dlZCBieSBibG9jawotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIGJvb2xlYW4gKCpzdGFydF9mdW5jdGlvbikgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLQotICAvKiBSZWNvcmQgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIHR5cGUKLSAgICAgbXVzdCBiZSBwb3BwZWQgb2ZmIHRoZSBzdGFjay4gICovCi0gIGJvb2xlYW4gKCpmdW5jdGlvbl9wYXJhbWV0ZXIpIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLAotCQkJCQkgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLQotICAvKiBTdGFydCB3cml0aW5nIG91dCBhIGJsb2NrLiAgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRvcCBsZXZlbCBibG9jawotICAgICBwZXIgZnVuY3Rpb24uICBCbG9ja3MgbWF5IGJlIG5lc3RlZC4gIFRoZSBhcmd1bWVudCBpcyB0aGUKLSAgICAgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgYmxvY2suICAqLwotICBib29sZWFuICgqc3RhcnRfYmxvY2spIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotCi0gIC8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGJsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBlbmRpbmcgYWRkcmVzcwotICAgICBvZiB0aGUgYmxvY2suICAqLwotICBib29sZWFuICgqZW5kX2Jsb2NrKSBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLQotICAvKiBGaW5pc2ggd3JpdGluZyBvdXQgYSBmdW5jdGlvbi4gICovCi0gIGJvb2xlYW4gKCplbmRfZnVuY3Rpb24pIFBBUkFNUyAoKFBUUikpOwotCi0gIC8qIFJlY29yZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIGJvb2xlYW4gKCpsaW5lbm8pIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBiZmRfdm1hKSk7Ci19OwotCi0vKiBFeHBvcnRlZCBmdW5jdGlvbnMuICAqLwotCi0vKiBUaGUgZmlyc3QgYXJndW1lbnQgdG8gbW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMgaXMgYSBoYW5kbGUuICBUaGlzCi0gICBoYW5kbGUgaXMgcmV0dXJuZWQgYnkgdGhlIGRlYnVnX2luaXQgZnVuY3Rpb24uICBUaGUgcHVycG9zZSBvZiB0aGUKLSAgIGhhbmRsZSBpcyB0byBwZXJtaXQgdGhlIGRlYnVnZ2luZyByb3V0aW5lcyB0byBub3QgdXNlIHN0YXRpYwotICAgdmFyaWFibGVzLCBhbmQgaGVuY2UgdG8gYmUgcmVlbnRyYW50LiAgVGhpcyB3b3VsZCBiZSB1c2VmdWwgZm9yIGEKLSAgIHByb2dyYW0gd2hpY2ggd2FudGVkIHRvIGhhbmRsZSB0d28gZXhlY3V0YWJsZXMgc2ltdWx0YW5lb3VzbHkuICAqLwotCi0vKiBSZXR1cm4gYSBkZWJ1Z2dpbmcgaGFuZGxlLiAgKi8KLQotZXh0ZXJuIFBUUiBkZWJ1Z19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogU2V0IHRoZSBzb3VyY2UgZmlsZW5hbWUuICBUaGlzIGltcGxpY2l0bHkgc3RhcnRzIGEgbmV3IGNvbXBpbGF0aW9uCi0gICB1bml0LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc2V0X2ZpbGVuYW1lIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIENoYW5nZSBzb3VyY2UgZmlsZXMgdG8gdGhlIGdpdmVuIGZpbGUgbmFtZS4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIGluY2x1ZGUgZmlsZXMgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3N0YXJ0X3NvdXJjZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWNvcmQgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhpcyBpbXBsaWNpdGx5IHN0YXJ0cyBhIGZ1bmN0aW9uCi0gICBibG9jay4gIFRoZSBkZWJ1Z190eXBlIGFyZ3VtZW50IGlzIHRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUuCi0gICBUaGUgYm9vbGVhbiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZnVuY3Rpb24gaXMgZ2xvYmFsbHkgdmlzaWJsZS4KLSAgIFRoZSBiZmRfdm1hIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICBDdXJyZW50bHkKLSAgIHRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHNwZWNpZmllZCBieSBjYWxscyB0bwotICAgZGVidWdfcmVjb3JkX3BhcmFtZXRlci4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9mdW5jdGlvbgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgYm9vbGVhbiwgYmZkX3ZtYSkpOwotCi0vKiBSZWNvcmQgYSBwYXJhbWV0ZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLQotLyogRW5kIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZSBhcmd1bWVudCBpcyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUKLSAgIGZ1bmN0aW9uIGVuZHMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIFN0YXJ0IGEgYmxvY2sgaW4gYSBmdW5jdGlvbi4gIEFsbCBsb2NhbCBpbmZvcm1hdGlvbiB3aWxsIGJlCi0gICByZWNvcmRlZCBpbiB0aGlzIGJsb2NrLCB1bnRpbCB0aGUgbWF0Y2hpbmcgY2FsbCB0byBkZWJ1Z19lbmRfYmxvY2suCi0gICBkZWJ1Z19zdGFydF9ibG9jayBhbmQgZGVidWdfZW5kX2Jsb2NrIG1heSBiZSBuZXN0ZWQuICBUaGUgYXJndW1lbnQKLSAgIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sgc3RhcnRzLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIEZpbmlzaCBhIGJsb2NrIGluIGEgZnVuY3Rpb24uICBUaGlzIG1hdGNoZXMgdGhlIGNhbGwgdG8KLSAgIGRlYnVnX3N0YXJ0X2Jsb2NrLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoaXMgYmxvY2sKLSAgIGVuZHMuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19lbmRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci0KLS8qIEFzc29jaWF0ZSBhIGxpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdpdGggYSBnaXZlbgotICAgYWRkcmVzcy4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9saW5lIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi0vKiBTdGFydCBhIG5hbWVkIGNvbW1vbiBibG9jay4gIFRoaXMgaXMgYSBibG9jayBvZiB2YXJpYWJsZXMgdGhhdCBtYXkKLSAgIG1vdmUgaW4gbWVtb3J5LiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEVuZCBhIG5hbWVkIGNvbW1vbiBibG9jay4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX2VuZF9jb21tb25fYmxvY2sgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLQotLyogUmVjb3JkIGEgbmFtZWQgaW50ZWdlciBjb25zdGFudC4gICovCi0KLWV4dGVybiBib29sZWFuIGRlYnVnX3JlY29yZF9pbnRfY29uc3QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLQotLyogUmVjb3JkIGEgbmFtZWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfZmxvYXRfY29uc3QgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRvdWJsZSkpOwotCi0vKiBSZWNvcmQgYSB0eXBlZCBjb25zdGFudCB3aXRoIGFuIGludGVncmFsIHZhbHVlLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3R5cGVkX2NvbnN0Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIGxhYmVsLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX2xhYmVsCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hKSk7Ci0KLS8qIFJlY29yZCBhIHZhcmlhYmxlLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci0KLS8qIE1ha2UgYW4gaW5kaXJlY3QgdHlwZS4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gdGhlCi0gICBsb2NhdGlvbiB3aGVyZSB0aGUgcmVhbCB0eXBlIHdpbGwgYmUgcGxhY2VkLiAgVGhlIHNlY29uZCBhcmd1bWVudAotICAgaXMgdGhlIHR5cGUgdGFnLCBpZiB0aGVyZSBpcyBvbmU7IHRoaXMgbWF5IGJlIE5VTEw7IHRoZSBvbmx5Ci0gICBwdXJwb3NlIG9mIHRoaXMgYXJndW1lbnQgaXMgc28gdGhhdCBkZWJ1Z19nZXRfdHlwZV9uYW1lIGNhbiByZXR1cm4KLSAgIHNvbWV0aGluZyB1c2VmdWwuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHdoZW4gYSB0eXBlIGlzCi0gICByZWZlcmVuY2VkIGJlZm9yZSBpdCBpcyBkZWZpbmVkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSAqLCBjb25zdCBjaGFyICopKTsKLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOwotCi0vKiBNYWtlIGFuIGludGVnZXIgdHlwZSBvZiBhIGdpdmVuIHNpemUuICBUaGUgYm9vbGVhbiBhcmd1bWVudCBpcyB0cnVlCi0gICBpZiB0aGUgaW50ZWdlciBpcyB1bnNpZ25lZC4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIGZsb2F0aW5nIHBvaW50IHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgRklYTUU6IE9uIHNvbWUKLSAgIHBsYXRmb3JtcywgbGlrZSBhbiBBbHBoYSwgeW91IHByb2JhYmx5IG5lZWQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5Ci0gICB0aGUgZm9ybWF0LiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9mbG9hdF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIE1ha2UgYSBib29sZWFuIHR5cGUgb2YgYSBnaXZlbiBzaXplLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLQotLyogTWFrZSBhIGNvbXBsZXggdHlwZSBvZiBhIGdpdmVuIHNpemUuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotCi0vKiBNYWtlIGEgc3RydWN0dXJlIHR5cGUuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRydWUgZm9yIGEgc3RydWN0LAotICAgZmFsc2UgZm9yIGEgdW5pb24uICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHNpemUgb2YgdGhlIHN0cnVjdC4KLSAgIFRoZSBmb3VydGggYXJndW1lbnQgaXMgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChQVFIsIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX2ZpZWxkICopKTsKLQotLyogTWFrZSBhbiBvYmplY3QgdHlwZS4gIFRoZSBmaXJzdCB0aHJlZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIGhhbmRsZQotICAgYXJlIHRoZSBzYW1lIGFzIGZvciBkZWJ1Z19tYWtlX3N0cnVjdF90eXBlLiAgVGhlIG5leHQgYXJndW1lbnRzIGFyZQotICAgYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgYmFzZSBjbGFzc2VzLCBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZgotICAgbWV0aG9kcywgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBob2xkaW5nIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlCi0gICBpZiBpdCBpcyBub3QgdGhpcyBvYmplY3QsIGFuZCBhIGJvb2xlYW4gd2hpY2ggaXMgdHJ1ZSBpZiB0aGlzCi0gICBvYmplY3QgaGFzIGl0cyBvd24gdmlydHVhbCBmdW5jdGlvbiB0YWJsZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfb2JqZWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBib29sZWFuLCBiZmRfdm1hLCBkZWJ1Z19maWVsZCAqLCBkZWJ1Z19iYXNlY2xhc3MgKiwKLQkgICBkZWJ1Z19tZXRob2QgKiwgZGVidWdfdHlwZSwgYm9vbGVhbikpOwotCi0vKiBNYWtlIGFuIGVudW1lcmF0aW9uIHR5cGUuICBUaGUgYXJndW1lbnRzIGFyZSBhIG51bGwgdGVybWluYXRlZAotICAgYXJyYXkgb2Ygc3RyaW5ncywgYW5kIGFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9lbnVtX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICoqLCBiZmRfc2lnbmVkX3ZtYSAqKSk7Ci0KLS8qIE1ha2UgYSBwb2ludGVyIHRvIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfcG9pbnRlcl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgZnVuY3Rpb24gdHlwZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHJldHVybiB0eXBlLiAgVGhlCi0gICB0aGlyZCBhcmd1bWVudCBpcyBhIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBhcmd1bWVudCB0eXBlcy4gIFRoZQotICAgZm91cnRoIGFyZ3VtZW50IGlzIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHRha2VzIGEgdmFyaWFibGUgbnVtYmVyIG9mCi0gICBhcmd1bWVudHMuICBJZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgTlVMTCwgdGhlbiB0aGUgYXJndW1lbnQgdHlwZXMKLSAgIGFyZSB1bmtub3duLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSAqLCBib29sZWFuKSk7Ci0KLS8qIE1ha2UgYSByZWZlcmVuY2UgdG8gYSBnaXZlbiB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHJhbmdlIG9mIGEgZ2l2ZW4gdHlwZSBmcm9tIGEgbG93ZXIgdG8gYW4gdXBwZXIgYm91bmQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX3JhbmdlX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgVGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiBhbiBlbGVtZW50Ci0gICBvZiB0aGUgYXJyYXkuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIHR5cGUgb2YgYSByYW5nZSBvZiB0aGUKLSAgIGFycmF5LiAgVGhlIGZvdXJ0aCBhbmQgZmlmdGggYXJndW1lbnQgYXJlIHRoZSBsb3dlciBhbmQgdXBwZXIKLSAgIGJvdW5kcywgcmVzcGVjdGl2ZWx5IChpZiB0aGUgYm91bmRzIGFyZSBub3Qga25vd24sIGxvd2VyIHNob3VsZCBiZQotICAgMCBhbmQgdXBwZXIgc2hvdWxkIGJlIC0xKS4gIFRoZSBzaXh0aCBhcmd1bWVudCBpcyB0cnVlIGlmIHRoaXMKLSAgIGFycmF5IGlzIGFjdHVhbGx5IGEgc3RyaW5nLCBhcyBpbiBDLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLAotCSAgIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIHNldCBvZiBhIGdpdmVuIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBQYXNjYWwgc2V0IHR5cGUuICBUaGUKLSAgIGJvb2xlYW4gYXJndW1lbnQgaXMgdHJ1ZSBpZiB0aGlzIHNldCBpcyBhY3R1YWxseSBhIGJpdHN0cmluZywgYXMgaW4KLSAgIENISUxMLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUsIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIHR5cGUgZm9yIGEgcG9pbnRlciB3aGljaCBpcyByZWxhdGl2ZSB0byBhbiBvYmplY3QuICBUaGUKLSAgIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIHdoaWNoIHRoZSBwb2ludGVyIGlzCi0gICByZWxhdGl2ZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSB0aGF0IHRoZSBwb2ludGVyIHBvaW50cwotICAgdG8uICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19tYWtlX29mZnNldF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgZGVidWdfdHlwZSkpOwotCi0vKiBNYWtlIGEgdHlwZSBmb3IgYSBtZXRob2QgZnVuY3Rpb24uICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQotICAgcmV0dXJuIHR5cGUuICBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGRvbWFpbi4gIFRoZSBmb3VydGgKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgVGhlIGZpZnRoCi0gICBhcmd1bWVudCBpcyB0cnVlIGlmIHRoZSBmdW5jdGlvbiB0YWtlcyBhIHZhcmlhYmxlIG51bWJlciBvZgotICAgYXJndW1lbnRzLCBpbiB3aGljaCBjYXNlIHRoZSBhcnJheSBvZiBhcmd1bWVudCB0eXBlcyBpbmRpY2F0ZXMgdGhlCi0gICB0eXBlcyBvZiB0aGUgZmlyc3QgYXJndW1lbnRzLiAgVGhlIGRvbWFpbiBhbmQgdGhlIGFyZ3VtZW50IGFycmF5Ci0gICBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSB0aGlzIGlzIGEgc3R1YiBtZXRob2QgYW5kIHRoYXQKLSAgIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUuICBTdGFicyBkZWJ1Z2dpbmcgdXNlcyB0aGlzLCBhbmQgZ2V0cwotICAgdGhlIGFyZ3VtZW50IHR5cGVzIGZyb20gdGhlIG1hbmdsZWQgbmFtZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlLCBkZWJ1Z190eXBlICosIGJvb2xlYW4pKTsKLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2VfY29uc3RfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHZvbGF0aWxlIHF1YWxpZmllZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhbiB1bmRlZmluZWQgdGFnZ2VkIHR5cGUuICBGb3IgZXhhbXBsZSwgYSBzdHJ1Y3Qgd2hpY2ggaGFzCi0gICBiZWVuIG1lbnRpb25lZCwgYnV0IG5vdCBkZWZpbmVkLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci0KLS8qIE1ha2UgYSBiYXNlIGNsYXNzIGZvciBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBiYXNlCi0gICBjbGFzcyB0eXBlLiAgVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBiaXQgcG9zaXRpb24gb2YgdGhpcyBiYXNlCi0gICBjbGFzcyBpbiB0aGUgb2JqZWN0LiAgVGhlIGZvdXJ0aCBhcmd1bWVudCBpcyB3aGV0aGVyIHRoaXMgaXMgYQotICAgdmlydHVhbCBjbGFzcy4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgYmFzZQotICAgY2xhc3MuICAqLwotCi1leHRlcm4gZGVidWdfYmFzZWNsYXNzIGRlYnVnX21ha2VfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci0KLS8qIE1ha2UgYSBmaWVsZCBmb3IgYSBzdHJ1Y3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lLiAgVGhlCi0gICB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZmllbGQuICBUaGUgZm91cnRoIGFyZ3VtZW50IGlzCi0gICB0aGUgYml0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZC4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgc2l6ZSBvZgotICAgdGhlIGZpZWxkIChpdCBtYXkgYmUgemVybykuICBUaGUgc2l4dGggYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkKLSAgIG9mIHRoZSBmaWVsZC4gICovCi0KLWV4dGVybiBkZWJ1Z19maWVsZCBkZWJ1Z19tYWtlX2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBiZmRfdm1hLCBiZmRfdm1hLAotCSAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi0vKiBNYWtlIGEgc3RhdGljIG1lbWJlciBvZiBhbiBvYmplY3QuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZQotICAgbmFtZS4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgbWVtYmVyLiAgVGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIG1lbWJlciAoaS5lLiwgdGhlIG5hbWUgYXMgYQotICAgZ2xvYmFsIHZhcmlhYmxlKS4gIFRoZSBmaWZ0aCBhcmd1bWVudCBpcyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUKLSAgIG1lbWJlci4gICovCi0KLWV4dGVybiBkZWJ1Z19maWVsZCBkZWJ1Z19tYWtlX3N0YXRpY19tZW1iZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsIGNvbnN0IGNoYXIgKiwKLQkgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLQotLyogTWFrZSBhIG1ldGhvZC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUsIGFuZCB0aGUgdGhpcmQKLSAgIGFyZ3VtZW50IGlzIGEgTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIG1ldGhvZCB2YXJpYW50cy4gIEVhY2gKLSAgIG1ldGhvZCB2YXJpYW50IGlzIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIGJ1dCB3aXRoIGRpZmZlcmVudAotICAgYXJndW1lbnQgdHlwZXMuICAqLwotCi1leHRlcm4gZGVidWdfbWV0aG9kIGRlYnVnX21ha2VfbWV0aG9kCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z19tZXRob2RfdmFyaWFudCAqKSk7Ci0KLS8qIE1ha2UgYSBtZXRob2QgdmFyaWFudC4gIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHBoeXNpY2FsIG5hbWUgb2YKLSAgIHRoZSBmdW5jdGlvbi4gIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24sCi0gICBwcm9iYWJseSBjb25zdHJ1Y3RlZCBieSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlLiAgVGhlIGZvdXJ0aAotICAgYXJndW1lbnQgaXMgdGhlIHZpc2liaWxpdHkuICBUaGUgZmlmdGggYXJndW1lbnQgaXMgd2hldGhlciB0aGlzIGlzCi0gICBhIGNvbnN0IGZ1bmN0aW9uLiAgVGhlIHNpeHRoIGFyZ3VtZW50IGlzIHdoZXRoZXIgdGhpcyBpcyBhIHZvbGF0aWxlCi0gICBmdW5jdGlvbi4gIFRoZSBzZXZlbnRoIGFyZ3VtZW50IGlzIHRoZSBpbmRleCBpbiB0aGUgdmlydHVhbAotICAgZnVuY3Rpb24gdGFibGUsIGlmIGFueS4gIFRoZSBlaWdodGggYXJndW1lbnQgaXMgdGhlIHZpcnR1YWwKLSAgIGZ1bmN0aW9uIGNvbnRleHQuICAqLwotCi1leHRlcm4gZGVidWdfbWV0aG9kX3ZhcmlhbnQgZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLAotCSAgIGJvb2xlYW4sIGJmZF92bWEsIGRlYnVnX3R5cGUpKTsKLQotLyogTWFrZSBhIHN0YXRpYyBtZXRob2QgYXJndW1lbnQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IKLSAgIGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IHR3byBhcmUgb21pdHRlZAotICAgc2luY2UgYSBzdGF0aWMgbWV0aG9kIGNhbiBub3QgYWxzbyBiZSB2aXJ0dWFsLiAgKi8KLQotZXh0ZXJuIGRlYnVnX21ldGhvZF92YXJpYW50IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotCi0vKiBOYW1lIGEgdHlwZS4gIFRoaXMgcmV0dXJucyBhIG5ldyB0eXBlIHdpdGggYW4gYXR0YWNoZWQgbmFtZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX25hbWVfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZGVidWdfdHlwZSkpOwotCi0vKiBHaXZlIGEgdGFnIHRvIGEgdHlwZSwgc3VjaCBhcyBhIHN0cnVjdCBvciB1bmlvbi4gIFRoaXMgcmV0dXJucyBhCi0gICBuZXcgdHlwZSB3aXRoIGFuIGF0dGFjaGVkIHRhZy4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX3RhZ190eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkZWJ1Z190eXBlKSk7Ci0KLS8qIFJlY29yZCB0aGUgc2l6ZSBvZiBhIGdpdmVuIHR5cGUuICAqLwotCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSwgdW5zaWduZWQgaW50KSk7Ci0KLS8qIEZpbmQgYSBuYW1lZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZmluZF9uYW1lZF90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIEZpbmQgYSB0YWdnZWQgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci0KLS8qIEdldCB0aGUga2luZCBvZiBhIHR5cGUuICAqLwotCi1leHRlcm4gZW51bSBkZWJ1Z190eXBlX2tpbmQgZGVidWdfZ2V0X3R5cGVfa2luZCBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSBuYW1lIG9mIGEgdHlwZS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpkZWJ1Z19nZXRfdHlwZV9uYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIHNpemUgb2YgYSB0eXBlLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X3R5cGVfc2l6ZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSByZXR1cm4gdHlwZSBvZiBhIGZ1bmN0aW9uIG9yIG1ldGhvZCB0eXBlLiAgKi8KLQotZXh0ZXJuIGRlYnVnX3R5cGUgZGVidWdfZ2V0X3JldHVybl90eXBlIFBBUkFNUyAoKFBUUiwgZGVidWdfdHlwZSkpOwotCi0vKiBHZXQgdGhlIE5VTEwgdGVybWluYXRlZCBhcnJheSBvZiBwYXJhbWV0ZXIgdHlwZXMgZm9yIGEgZnVuY3Rpb24gb3IKLSAgIG1ldGhvZCB0eXBlIChhY3R1YWxseSwgcGFyYW1ldGVyIHR5cGVzIGFyZSBub3QgY3VycmVudGx5IHN0b3JlZCBmb3IKLSAgIGZ1bmN0aW9uIHR5cGVzKS4gIFRoaXMgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtZXRob2QKLSAgIHR5cGUgaXMgYSBzdHViIG1ldGhvZCBvciBub3QuICBUaGUgbGFzdCBhcmd1bWVudCBwb2ludHMgdG8gYQotICAgYm9vbGVhbiB3aGljaCBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZQotICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0KLWV4dGVybiBjb25zdCBkZWJ1Z190eXBlICpkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIFBBUkFNUyAoKFBUUiwKLQkJCQkJCQkgICAgZGVidWdfdHlwZSwKLQkJCQkJCQkgICAgYm9vbGVhbiAqKSk7Ci0KLS8qIEdldCB0aGUgdGFyZ2V0IHR5cGUgb2YgYSBwb2ludGVyIG9yIHJlZmVyZW5jZSBvciBjb25zdCBvciB2b2xhdGlsZQotICAgdHlwZS4gICovCi0KLWV4dGVybiBkZWJ1Z190eXBlIGRlYnVnX2dldF90YXJnZXRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgb2YgZmllbGRzIGZvciBhIHN0cnVjdCwgdW5pb24sIG9yCi0gICBjbGFzcy4gICovCi0KLWV4dGVybiBjb25zdCBkZWJ1Z19maWVsZCAqZGVidWdfZ2V0X2ZpZWxkcyBQQVJBTVMgKChQVFIsIGRlYnVnX3R5cGUpKTsKLQotLyogR2V0IHRoZSB0eXBlIG9mIGEgZmllbGQuICAqLwotCi1leHRlcm4gZGVidWdfdHlwZSBkZWJ1Z19nZXRfZmllbGRfdHlwZSBQQVJBTVMgKChQVFIsIGRlYnVnX2ZpZWxkKSk7Ci0KLS8qIEdldCB0aGUgbmFtZSBvZiBhIGZpZWxkLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlYnVnX2dldF9maWVsZF9uYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBiaXQgcG9zaXRpb24gb2YgYSBmaWVsZCB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlLgotICAgSWYgdGhlIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciwgdGhpcyB3aWxsIHJldHVybiAoYmZkX3ZtYSkgLTEuICAqLwotCi1leHRlcm4gYmZkX3ZtYSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogR2V0IHRoZSBiaXQgc2l6ZSBvZiBhIGZpZWxkLiAgSWYgdGhlIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciwgdGhpcwotICAgd2lsbCByZXR1cm4gKGJmZF92bWEpIC0xLiAgKi8KLQotZXh0ZXJuIGJmZF92bWEgZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZC4gICovCi0KLWV4dGVybiBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgZGVidWdfZ2V0X2ZpZWxkX3Zpc2liaWxpdHkKLSAgUEFSQU1TICgoUFRSLCBkZWJ1Z19maWVsZCkpOwotCi0vKiBHZXQgdGhlIHBoeXNpY2FsIG5hbWUgb2YgYSBmaWVsZCwgaWYgaXQgaXMgYSBzdGF0aWMgbWVtYmVyLiAgSWYgdGhlCi0gICBmaWVsZCBpcyBub3QgYSBzdGF0aWMgbWVtYmVyLCB0aGlzIHdpbGwgcmV0dXJuIE5VTEwuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqZGVidWdfZ2V0X2ZpZWxkX3BoeXNuYW1lIFBBUkFNUyAoKFBUUiwgZGVidWdfZmllbGQpKTsKLQotLyogV3JpdGUgb3V0IHRoZSByZWNvcmRlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIHRha2VzIGEgc2V0IG9mCi0gICBmdW5jdGlvbiBwb2ludGVycyB3aGljaCBhcmUgY2FsbGVkIHRvIGRvIHRoZSBhY3R1YWwgd3JpdGluZy4gIFRoZQotICAgZmlyc3QgUFRSIGlzIHRoZSBkZWJ1Z2dpbmcgaGFuZGxlLiAgVGhlIHNlY29uZCBQVFIgaXMgYSBoYW5kbGUKLSAgIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAgKi8KLQotZXh0ZXJuIGJvb2xlYW4gZGVidWdfd3JpdGUgUEFSQU1TICgoUFRSLCBjb25zdCBzdHJ1Y3QgZGVidWdfd3JpdGVfZm5zICosIFBUUikpOwotCi0jZW5kaWYgLyogREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGVmbGV4LmwgYi9iaW51dGlscy9kZWZsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhNDNjMC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZWZsZXgubAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSV7LyogZGVmbGV4LmwgLSBMZXhlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlIENoYW1iZXJsYWluCi0gICAJCSAgc2FjQGN5Z251cy5jb20KLQotKi8KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZGVmcGFyc2UuaCIKLSNpbmNsdWRlICJkbGx0b29sLmgiCi0KLWludCBsaW5lbnVtYmVyOwotCi0lfQotJSUKLSJOQU1FIiAJCXsgcmV0dXJuIE5BTUU7fQotIkxJQlJBUlkiCXsgcmV0dXJuIExJQlJBUlk7fQotIkRFU0NSSVBUSU9OIiAJeyByZXR1cm4gREVTQ1JJUFRJT047fQotIlNUQUNLU0laRSIJeyByZXR1cm4gU1RBQ0tTSVpFO30KLSJIRUFQU0laRSIgCXsgcmV0dXJuIEhFQVBTSVpFO30KLSJDT0RFIiAJCXsgcmV0dXJuIENPREU7fQotIkRBVEEiCQl7IHJldHVybiBEQVRBO30KLSJTRUNUSU9OUyIJeyByZXR1cm4gU0VDVElPTlM7fQotIkVYUE9SVFMiCXsgcmV0dXJuIEVYUE9SVFM7fQotIklNUE9SVFMiCXsgcmV0dXJuIElNUE9SVFM7fQotIlZFUlNJT04iCXsgcmV0dXJuIFZFUlNJT05LO30KLSJCQVNFIgkJeyByZXR1cm4gQkFTRTt9Ci0iQ09OU1RBTlQiCXsgcmV0dXJuIENPTlNUQU5UOyB9Ci0iTk9OQU1FIgl7IHJldHVybiBOT05BTUU7IH0KLSJSRUFEIgkJeyByZXR1cm4gUkVBRDt9Ci0iV1JJVEUiCQl7IHJldHVybiBXUklURTt9Ci0iRVhFQ1VURSIJeyByZXR1cm4gRVhFQ1VURTt9Ci0iU0hBUkVEIgl7IHJldHVybiBTSEFSRUQ7fQotIk5PTlNIQVJFRCIJeyByZXR1cm4gTk9OU0hBUkVEO30KLSJTSU5HTEUiCXsgcmV0dXJuIFNJTkdMRTt9Ci0iTVVMVElQTEUiCXsgcmV0dXJuIE1VTFRJUExFO30KLSJJTklUSU5TVEFOQ0UiCXsgcmV0dXJuIElOSVRJTlNUQU5DRTt9Ci0iSU5JVEdMT0JBTCIJeyByZXR1cm4gSU5JVEdMT0JBTDt9Ci0iVEVSTUlOU1RBTkNFIgl7IHJldHVybiBURVJNSU5TVEFOQ0U7fQotIlRFUk1HTE9CQUwiCXsgcmV0dXJuIFRFUk1HTE9CQUw7fQotCi1bMC05XVt4MC05QS1GYS1mXSogeyB5eWx2YWwubnVtYmVyID0gc3RydG9sICh5eXRleHQsMCwwKTsgCi0JCXJldHVybiBOVU1CRVI7IH0KLQotW0EtWmEteiQ6XC1cXz9dW0EtWmEtejAtOS8kOlwtXF9AP10qIHsgCQotCQl5eWx2YWwuaWQgPSAgeHN0cmR1cCAoeXl0ZXh0KTsKLQkJcmV0dXJuIElEOwotCQl9Ci0KLSJcIiJbXlwiXSoiXCIiIHsKLQkJeXlsdmFsLmlkID0geHN0cmR1cCAoeXl0ZXh0KzEpOwotCQl5eWx2YWwuaWRbeXlsZW5nLTJdID0gMDsKLQkJcmV0dXJuIElEOwotCQl9Ci0KLSJcJyJbXlwnXSoiXCciIHsKLQkJeXlsdmFsLmlkID0geHN0cmR1cCAoeXl0ZXh0KzEpOwotCQl5eWx2YWwuaWRbeXlsZW5nLTJdID0gMDsKLQkJcmV0dXJuIElEOwotCQl9Ci0iKiIuKiAJCXsgfQotIjsiLiogCQl7IH0KLSIgIgkJeyB9Ci0iXHQiCQl7IH0KLSJcbiIJIAl7IGxpbmVudW1iZXIgKysgO30KLSI9IiAJCXsgcmV0dXJuICc9Jzt9Ci0iLiIgCQl7IHJldHVybiAnLic7fQotIkAiCSAJeyByZXR1cm4gJ0AnO30KLSIsIgkJeyByZXR1cm4gJywnO30KLSUlCi0jaWZuZGVmIHl5d3JhcAotLyogTmVlZGVkIGZvciBsZXgsIHRob3VnaCBub3QgZmxleC4gKi8KLWludCB5eXdyYXAoKSB7IHJldHVybiAxOyB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2RlZnBhcnNlLnkgYi9iaW51dGlscy9kZWZwYXJzZS55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzE4ZDQ2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RlZnBhcnNlLnkKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotJXsgLyogZGVmcGFyc2UueSAtIHBhcnNlciBmb3IgLmRlZiBmaWxlcyAqLwotCi0vKiAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAiZGxsdG9vbC5oIgotJX0KLQotJXVuaW9uIHsKLSAgY2hhciAqaWQ7Ci0gIGludCBudW1iZXI7Ci19OwotCi0ldG9rZW4gTkFNRSwgTElCUkFSWSwgREVTQ1JJUFRJT04sIFNUQUNLU0laRSwgSEVBUFNJWkUsIENPREUsIERBVEEKLSV0b2tlbiBTRUNUSU9OUywgRVhQT1JUUywgSU1QT1JUUywgVkVSU0lPTkssIEJBU0UsIENPTlNUQU5UCi0ldG9rZW4gUkVBRCBXUklURSBFWEVDVVRFIFNIQVJFRCBOT05TSEFSRUQgTk9OQU1FCi0ldG9rZW4gU0lOR0xFIE1VTFRJUExFIElOSVRJTlNUQU5DRSBJTklUR0xPQkFMIFRFUk1JTlNUQU5DRSBURVJNR0xPQkFMCi0ldG9rZW4gPGlkPiBJRAotJXRva2VuIDxudW1iZXI+IE5VTUJFUgotJXR5cGUgIDxudW1iZXI+IG9wdF9iYXNlIG9wdF9vcmRpbmFsIG9wdF9OT05BTUUgb3B0X0NPTlNUQU5UIG9wdF9EQVRBCi0ldHlwZSAgPG51bWJlcj4gYXR0ciBhdHRyX2xpc3Qgb3B0X251bWJlcgotJXR5cGUgIDxpZD4gb3B0X25hbWUgb3B0X2VxdWFsX25hbWUgCi0KLSUlCi0KLXN0YXJ0OiBzdGFydCBjb21tYW5kCi0JfCBjb21tYW5kCi0JOwotCi1jb21tYW5kOiAKLQkJTkFNRSBvcHRfbmFtZSBvcHRfYmFzZSB7IGRlZl9uYW1lICgkMiwgJDMpOyB9Ci0JfAlMSUJSQVJZIG9wdF9uYW1lIG9wdF9iYXNlIG9wdGlvbl9saXN0IHsgZGVmX2xpYnJhcnkgKCQyLCAkMyk7IH0KLQl8CUVYUE9SVFMgZXhwbGlzdCAKLQl8CURFU0NSSVBUSU9OIElEIHsgZGVmX2Rlc2NyaXB0aW9uICgkMik7fQotCXwJU1RBQ0tTSVpFIE5VTUJFUiBvcHRfbnVtYmVyIHsgZGVmX3N0YWNrc2l6ZSAoJDIsICQzKTt9Ci0JfAlIRUFQU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9oZWFwc2l6ZSAoJDIsICQzKTt9Ci0JfAlDT0RFIGF0dHJfbGlzdCB7IGRlZl9jb2RlICgkMik7fQotCXwJREFUQSBhdHRyX2xpc3QgIHsgZGVmX2RhdGEgKCQyKTt9Ci0JfAlTRUNUSU9OUyBzZWNsaXN0Ci0JfAlJTVBPUlRTIGltcGxpc3QKLQl8CVZFUlNJT05LIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwwKTt9Ci0JfAlWRVJTSU9OSyBOVU1CRVIgJy4nIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwkNCk7fQotCTsKLQotCi1leHBsaXN0OgotCQkvKiBFTVBUWSAqLwotCXwJZXhwbGlzdCBleHBsaW5lCi0JOwotCi1leHBsaW5lOgotCQlJRCBvcHRfZXF1YWxfbmFtZSBvcHRfb3JkaW5hbCBvcHRfTk9OQU1FIG9wdF9DT05TVEFOVCBvcHRfREFUQQotCQkJeyBkZWZfZXhwb3J0cyAoJDEsICQyLCAkMywgJDQsICQ1LCAkNik7fQotCTsKLWltcGxpc3Q6CQotCQlpbXBsaXN0IGltcGxpbmUKLQl8CWltcGxpbmUKLQk7Ci0KLWltcGxpbmU6Ci0gICAgICAgICAgICAgICBJRCAnPScgSUQgJy4nIElEICcuJyBJRCAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywkNSwkNywgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgSUQgJy4nIE5VTUJFUiB7IGRlZl9pbXBvcnQgKCQxLCQzLCQ1LCAwLCQ3KTsgfQotICAgICAgIHwgICAgICAgSUQgJz0nIElEICcuJyBJRCAgICAgICAgICAgIHsgZGVmX2ltcG9ydCAoJDEsJDMsIDAsJDUsIDApOyB9Ci0gICAgICAgfCAgICAgICBJRCAnPScgSUQgJy4nIE5VTUJFUiAgICAgICAgeyBkZWZfaW1wb3J0ICgkMSwkMywgMCwgMCwkNSk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBJRCAnLicgSUQgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCQzLCQ1LCAwKTsgfQotICAgICAgIHwgICAgICAgSUQgJy4nIElEICcuJyBOVU1CRVIgICAgICAgIHsgZGVmX2ltcG9ydCAoIDAsJDEsJDMsIDAsJDUpOyB9Ci0gICAgICAgfCAgICAgICBJRCAnLicgSUQgICAgICAgICAgICAgICAgICAgeyBkZWZfaW1wb3J0ICggMCwkMSwgMCwkMywgMCk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBOVU1CRVIgICAgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCQxLCAwLCAwLCQzKTsgfQotOwotCi1zZWNsaXN0OgotCQlzZWNsaXN0IHNlY2xpbmUKLQl8CXNlY2xpbmUKLQk7Ci0KLXNlY2xpbmU6Ci0JSUQgYXR0cl9saXN0IHsgZGVmX3NlY3Rpb24gKCQxLCQyKTt9Ci0JOwotCi1hdHRyX2xpc3Q6Ci0JYXR0cl9saXN0IG9wdF9jb21tYSBhdHRyCi0JfCBhdHRyCi0JOwotCi1vcHRfY29tbWE6Ci0JJywnCi0JfCAKLQk7Ci1vcHRfbnVtYmVyOiAnLCcgTlVNQkVSIHsgJCQ9JDI7fQotCXwJICAgeyAkJD0tMTt9Ci0JOwotCQotYXR0cjoKLQkJUkVBRCB7ICQkID0gMTsgfQotCXwJV1JJVEUgeyAkJCA9IDI7IH0KLQl8CUVYRUNVVEUgeyAkJCA9IDQ7IH0KLQl8CVNIQVJFRCB7ICQkID0gODsgfQotCXwJTk9OU0hBUkVEIHsgJCQgPSAwOyB9Ci0JfAlTSU5HTEUgeyAkJCA9IDA7IH0KLQl8CU1VTFRJUExFIHsgJCQgPSAwOyB9Ci0JOwotCi1vcHRfQ09OU1RBTlQ6Ci0JCUNPTlNUQU5UIHskJD0xO30KLQl8CQkgeyQkPTA7fQotCTsKLQotb3B0X05PTkFNRToKLQkJTk9OQU1FIHskJD0xO30KLQl8CQkgeyQkPTA7fQotCTsKLQotb3B0X0RBVEE6Ci0JCURBVEEgeyAkJCA9IDE7IH0KLQl8CSAgICAgeyAkJCA9IDA7IH0KLQk7Ci0KLW9wdF9uYW1lOiBJRAkJeyAkJCA9JDE7IH0KLQl8IElEICcuJyBJRAkKLQkgIHsgCi0JICAgIGNoYXIgKm5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKCQxKSArIDEgKyBzdHJsZW4gKCQzKSArIDEpOwotCSAgICBzcHJpbnRmIChuYW1lLCAiJXMuJXMiLCAkMSwgJDMpOwotCSAgICAkJCA9IG5hbWU7Ci0JICB9Ci0JfAkJeyAkJD0iIjsgfQotCTsKLQotb3B0X29yZGluYWw6IAotCSAgJ0AnIE5VTUJFUiAgICAgeyAkJD0kMjt9Ci0JfCAgICAgICAgICAgICAgICB7ICQkPS0xO30KLQk7Ci0KLW9wdF9lcXVhbF9uYW1lOgotICAgICAgICAgICc9JyBJRAl7ICQkID0gJDI7IH0KLSAgICAgICAgfCAJCXsgJCQgPSAgMDsgfQkJCSAKLQk7Ci0KLW9wdF9iYXNlOiBCQVNFCSc9JyBOVU1CRVIJeyAkJD0gJDM7fQotCXwJeyAkJD0tMTt9Ci0JOwotCi1vcHRpb25fbGlzdDoKLQkJLyogZW1wdHkgKi8KLQl8CW9wdGlvbl9saXN0IG9wdF9jb21tYSBvcHRpb24KLQk7Ci0KLW9wdGlvbjoKLQkJSU5JVElOU1RBTkNFCi0JfAlJTklUR0xPQkFMCi0JfAlURVJNSU5TVEFOQ0UKLQl8CVRFUk1HTE9CQUwKLQk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9kZXAtaW4uc2VkIGIvYmludXRpbHMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYxOTIxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC8hIWcKLXMhQE9CSkRJUkAvISFnCi0KLXMvXFxcbiAqLyAvZwotCi1zLyAqJC8vCi1zLyAgKi8gL2cKLS86JC9kCi0KLXMvXCguXHs1MFx9W14gXSpcKSAvXDEgXFxcCi0gIC9nCmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx0b29sLmMgYi9iaW51dGlscy9kbGx0b29sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOGEyNmMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsdG9vbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU2NSArMCwwIEBACi0vKiBkbGx0b29sLmMgLS0gdG9vbCB0byBnZW5lcmF0ZSBzdHVmZiBmb3IgUEUgc3R5bGUgRExMcwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qCi0gICBUaGlzIHByb2dyYW0gYWxsb3dzIHlvdSB0byBidWlsZCB0aGUgZmlsZXMgbmVjZXNzYXJ5IHRvIGNyZWF0ZQotICAgRExMcyB0byBydW4gb24gYSBzeXN0ZW0gd2hpY2ggdW5kZXJzdGFuZHMgUEUgZm9ybWF0IGltYWdlIGZpbGVzLgotICAgKGVnLCBXaW5kb3dzIE5UKQotCi0gICBTZWUgIlBlZXJpbmcgSW5zaWRlIHRoZSBQRTogQSBUb3VyIG9mIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlCi0gICBGaWxlIEZvcm1hdCIsIE1TSiAxOTk0LCBWb2x1bWUgOSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgIEFsc28gc2VlICJNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZSBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdCwKLSAgIFNwZWNpZmljYXRpb24gNC4xIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgQSBETEwgY29udGFpbnMgYW4gZXhwb3J0IHRhYmxlIHdoaWNoIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbgotICAgd2hpY2ggdGhlIHJ1bnRpbWUgbG9hZGVyIG5lZWRzIHRvIHRpZSB1cCByZWZlcmVuY2VzIGZyb20gYQotICAgcmVmZXJlbmNpbmcgcHJvZ3JhbS4KLQotICAgVGhlIGV4cG9ydCB0YWJsZSBpcyBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtIGJ5IHJlYWRpbmcKLSAgIGluIGEgLkRFRiBmaWxlIG9yIHNjYW5uaW5nIHRoZSAuYSBhbmQgLm8gZmlsZXMgd2hpY2ggd2lsbCBiZSBpbiB0aGUKLSAgIERMTC4gIEEgLm8gZmlsZSBjYW4gY29udGFpbiBpbmZvcm1hdGlvbiBpbiBzcGVjaWFsICAiLmRyZWN0dmUiIHNlY3Rpb25zCi0gICB3aXRoIGV4cG9ydCBpbmZvcm1hdGlvbi4KLQotICAgQSBERUYgZmlsZSBjb250YWlucyBhbnkgbnVtYmVyIG9mIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6Ci0KLQotICAgTkFNRSA8bmFtZT4gWyAsIDxiYXNlPiBdCi0gICBUaGUgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIDxuYW1lPi5FWEUKLQotICAgTElCUkFSWSA8bmFtZT4gWyAsIDxiYXNlPiBdCi0gICBUaGUgcmVzdWx0IGlzIGdvaW5nIHRvIGJlIDxuYW1lPi5ETEwKLQotICAgRVhQT1JUUyAgKCA8bmFtZTE+IFsgPSA8bmFtZTI+IF0gWyBAIDxpbnRlZ2VyPiBdIFsgTk9OQU1FIF0gW0NPTlNUQU5UXSBbREFUQV0gKSAqCi0gICBEZWNsYXJlcyBuYW1lMSBhcyBhbiBleHBvcnRlZCBzeW1ib2wgZnJvbSB0aGUKLSAgIERMTCwgd2l0aCBvcHRpb25hbCBvcmRpbmFsIG51bWJlciA8aW50ZWdlcj4KLQotICAgSU1QT1JUUyAgKCAgKCAgIDxpbnRlcm5hbC1uYW1lPiA9ICAgPG1vZHVsZS1uYW1lPiAuIDxpbnRlZ2VyPiApCi0gICAgICAgICAgICAgfCAoIFsgPGludGVybmFsLW5hbWU+ID0gXSA8bW9kdWxlLW5hbWU+IC4gPGV4dGVybmFsLW5hbWU+ICkpICoKLSAgIERlY2xhcmVzIHRoYXQgPGV4dGVybmFsLW5hbWU+IG9yIHRoZSBleHBvcnRlZCBmdW5jdGlvbiB3aG9lcyBvcmRpbmFsIG51bWJlcgotICAgaXMgPGludGVnZXI+IGlzIHRvIGJlIGltcG9ydGVkIGZyb20gdGhlIGZpbGUgPG1vZHVsZS1uYW1lPi4gIElmCi0gICA8aW50ZXJuYWwtbmFtZT4gaXMgc3BlY2lmaWVkIHRoZW4gdGhpcyBpcyB0aGUgbmFtZSB0aGF0IHRoZSBpbXBvcnRlZAotICAgZnVuY3Rpb24gd2lsbCBiZSByZWZlcmVkIHRvIGluIHRoZSBib2R5IG9mIHRoZSBETEwuCi0KLSAgIERFU0NSSVBUSU9OIDxzdHJpbmc+Ci0gICBQdXRzIDxzdHJpbmc+IGludG8gb3V0cHV0IC5leHAgZmlsZSBpbiB0aGUgLnJkYXRhIHNlY3Rpb24KLQotICAgW1NUQUNLU0laRXxIRUFQU0laRV0gPG51bWJlci1yZXNlcnZlPiBbICwgPG51bWJlci1jb21taXQ+IF0KLSAgIEdlbmVyYXRlcyAtLXN0YWNrfC0taGVhcCA8bnVtYmVyLXJlc2VydmU+LDxudW1iZXItY29tbWl0PgotICAgaW4gdGhlIG91dHB1dCAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGxpbmtlciB3aWxsCi0gICBzZWUgdGhpcyBhbmQgYWN0IHVwb24gaXQuCi0KLSAgIFtDT0RFfERBVEFdIDxhdHRyPisKLSAgIFNFQ1RJT05TICggPHNlY3Rpb25uYW1lPiA8YXR0cj4rICkqCi0gICA8YXR0cj4gPSBSRUFEIHwgV1JJVEUgfCBFWEVDVVRFIHwgU0hBUkVECi0gICBHZW5lcmF0ZXMgLS1hdHRyIDxzZWN0aW9ubmFtZT4gPGF0dHI+IGluIHRoZSBvdXRwdXQKLSAgIC5kcmVjdHZlIHNlY3Rpb24uICBUaGUgbGlua2VyIHdpbGwgc2VlIHRoaXMgYW5kIGFjdAotICAgdXBvbiBpdC4KLQotCi0gICBBIC1leHBvcnQ6PG5hbWU+IGluIGEgLmRyZWN0dmUgc2VjdGlvbiBpbiBhbiBpbnB1dCAubyBvciAuYQotICAgZmlsZSB0byB0aGlzIHByb2dyYW0gaXMgZXF1aXZhbGVudCB0byBhIEVYUE9SVFMgPG5hbWU+Ci0gICBpbiBhIC5ERUYgZmlsZS4KLQotCi0KLSAgIFRoZSBwcm9ncmFtIGdlbmVyYXRlcyBvdXRwdXQgZmlsZXMgd2l0aCB0aGUgcHJlZml4IHN1cHBsaWVkCi0gICBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciBpbiB0aGUgZGVmIGZpbGUsIG9yIHRha2VuIGZyb20gdGhlIGZpcnN0Ci0gICBzdXBwbGllZCBhcmd1bWVudC4KLQotICAgVGhlIC5leHAucyBmaWxlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gZXhwb3J0Ci0gICB0aGUgcm91dGluZXMgaW4gdGhlIERMTC4gIFRoZSAubGliLnMgZmlsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24KLSAgIG5lY2Vzc2FyeSB0byB1c2UgdGhlIERMTCdzIHJvdXRpbmVzIGZyb20gYSByZWZlcmVuY2luZyBwcm9ncmFtLgotCi0KLQotICAgRXhhbXBsZToKLQotIGZpbGUxLmM6Ci0gICBhc20gKCIuc2VjdGlvbiAuZHJlY3R2ZSIpOwotICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDphZGVmXCIiKTsKLQotICAgdm9pZCBhZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsICVzXG4iLCBzKTsKLSAgIH0KLQotICAgdm9pZCBiZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsIGFuZCB0aGUgb3RoZXIgZW50cnkgcG9pbnQgJXNcbiIsIHMpOwotICAgfQotCi0gZmlsZTIuYzoKLSAgIGFzbSAoIi5zZWN0aW9uIC5kcmVjdHZlIik7Ci0gICBhc20gKCIuYXNjaWkgXCItZXhwb3J0OmNkZWZcIiIpOwotICAgYXNtICgiLmFzY2lpIFwiLWV4cG9ydDpkZGVmXCIiKTsKLSAgIAotICAgdm9pZCBjZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsICVzXG4iLCBzKTsKLSAgIH0KLQotICAgdm9pZCBkZGVmIChjaGFyICogcykKLSAgIHsKLSAgICAgcHJpbnRmICgiaGVsbG8gZnJvbSB0aGUgZGxsIGFuZCB0aGUgb3RoZXIgZW50cnkgcG9pbnQgJXNcbiIsIHMpOwotICAgfQotCi0gICBpbnQgcHJpbnRmICh2b2lkKQotICAgewotICAgICByZXR1cm4gOTsKLSAgIH0KLQotIHRoZW1haW4uYzoKLSAgIGludCBtYWluICh2b2lkKQotICAgewotICAgICBjZGVmICgpOwotICAgICByZXR1cm4gMDsKLSAgIH0KLQotIHRoZWRsbC5kZWYKLQotICAgTElCUkFSWSB0aGVkbGwKLSAgIEhFQVBTSVpFIDB4NDAwMDAsIDB4MjAwMAotICAgRVhQT1JUUyBiZGVmIEAgMjAKLSAgICAgICAgICAgY2RlZiBAIDMwIE5PTkFNRQotCi0gICBTRUNUSU9OUyBkb25rZXkgUkVBRCBXUklURQotICAgYWFyZHZhcmsgRVhFQ1VURQotCi0gIyBjb21waWxlIHVwIHRoZSBwYXJ0cyBvZiB0aGUgZGxsCi0KLSAgIGdjYyAtYyBmaWxlMS5jCi0gICBnY2MgLWMgZmlsZTIuYwotCi0gIyBwdXQgdGhlbSBpbiBhIGxpYnJhcnkgKHlvdSBkb24ndCBoYXZlIHRvLCB5b3UKLSAjIGNvdWxkIG5hbWUgYWxsIHRoZSAub3Mgb24gdGhlIGRsbHRvb2wgbGluZSkKLQotICAgYXIgIHFjdiB0aGVkbGwuaW4gZmlsZTEubyBmaWxlMi5vCi0gICByYW5saWIgdGhlZGxsLmluCi0KLSAjIHJ1biB0aGlzIHRvb2wgb3ZlciB0aGUgbGlicmFyeSBhbmQgdGhlIGRlZiBmaWxlCi0gICAuL2RsbHRvb2wgLS1kZWYgdGhlZGxsLmRlZiAtLW91dHB1dC1leHAgdGhlZGxsLm8gLS1vdXRwdXQtbGliIHRoZWRsbC5hCi0KLSAjIGJ1aWxkIHRoZSBkbGwgd2l0aCB0aGUgbGlicmFyeSB3aXRoIGZpbGUxLm8sIGZpbGUyLm8gYW5kIHRoZSBleHBvcnQgdGFibGUKLSAgIGxkIC1vIHRoZWRsbC5kbGwgdGhlZGxsLm8gdGhlZGxsLmluCi0KLSAjIGJ1aWxkIHRoZSBtYWlubGluZQotICAgZ2NjIC1jIHRoZW1haW4uYwotCi0gIyBsaW5rIHRoZSBleGVjdXRhYmxlIHdpdGggdGhlIGltcG9ydCBsaWJyYXJ5Ci0gICBnY2MgLW8gdGhlbWFpbi5leGUgdGhlbWFpbi5vIHRoZWRsbC5hCi0KLSAqLwotCi0vKiAuaWRhdGEgc2VjdGlvbiBkZXNjcmlwdGlvbgotCi0gICBUaGUgLmlkYXRhIHNlY3Rpb24gaXMgdGhlIGltcG9ydCB0YWJsZS4gIEl0IGlzIGEgY29sbGVjdGlvbiBvZiBzZXZlcmFsCi0gICBzdWJzZWN0aW9ucyB1c2VkIHRvIGtlZXAgdGhlIHBpZWNlcyBmb3IgZWFjaCBkbGwgdG9nZXRoZXI6IC5pZGF0YSRbMjM0NTY3XS4KLSAgIElFOiBFYWNoIGRsbCdzIC5pZGF0YSQyJ3MgYXJlIGNhdGVuYXRlZCB0b2dldGhlciwgZWFjaCAuaWRhdGEkMydzLCBldGMuCi0KLSAgIC5pZGF0YSQyID0gSW1wb3J0IERpcmVjdG9yeSBUYWJsZQotICAgPSBhcnJheSBvZiBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUidzLgotCi0JRFdPUkQgICBJbXBvcnQgTG9va3VwIFRhYmxlOyAgLSBwb2ludGVyIHRvIC5pZGF0YSQ0Ci0JRFdPUkQgICBUaW1lRGF0ZVN0YW1wOyAgICAgICAgLSBjdXJyZW50bHkgYWx3YXlzIDAKLQlEV09SRCAgIEZvcndhcmRlckNoYWluOyAgICAgICAtIGN1cnJlbnRseSBhbHdheXMgMAotCURXT1JEICAgTmFtZTsgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBkbGwncyBuYW1lCi0JUElNQUdFX1RIVU5LX0RBVEEgRmlyc3RUaHVuazsgLSBwb2ludGVyIHRvIC5pZGF0YSQ1Ci0KLSAgIC5pZGF0YSQzID0gbnVsbCB0ZXJtaW5hdGluZyBlbnRyeSBmb3IgLmlkYXRhJDIuCi0KLSAgIC5pZGF0YSQ0ID0gSW1wb3J0IExvb2t1cCBUYWJsZQotICAgPSBhcnJheSBvZiBhcnJheSBvZiBwb2ludGVycyB0byBoaW50IG5hbWUgdGFibGUuCi0gICBUaGVyZSBpcyBvbmUgZm9yIGVhY2ggZGxsIGJlaW5nIGltcG9ydGVkIGZyb20sIGFuZCBlYWNoIGRsbCdzIHNldCBpcwotICAgdGVybWluYXRlZCBieSBhIHRyYWlsaW5nIE5VTEwuCi0KLSAgIC5pZGF0YSQ1ID0gSW1wb3J0IEFkZHJlc3MgVGFibGUKLSAgID0gYXJyYXkgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gaGludCBuYW1lIHRhYmxlLgotICAgVGhlcmUgaXMgb25lIGZvciBlYWNoIGRsbCBiZWluZyBpbXBvcnRlZCBmcm9tLCBhbmQgZWFjaCBkbGwncyBzZXQgaXMKLSAgIHRlcm1pbmF0ZWQgYnkgYSB0cmFpbGluZyBOVUxMLgotICAgSW5pdGlhbGx5LCB0aGlzIHRhYmxlIGlzIGlkZW50aWNhbCB0byB0aGUgSW1wb3J0IExvb2t1cCBUYWJsZS4gIEhvd2V2ZXIsCi0gICBhdCBsb2FkIHRpbWUsIHRoZSBsb2FkZXIgb3ZlcndyaXRlcyB0aGUgZW50cmllcyB3aXRoIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgZnVuY3Rpb24uCi0KLSAgIC5pZGF0YSQ2ID0gSGludCBOYW1lIFRhYmxlCi0gICA9IEFycmF5IG9mIHsgc2hvcnQsIGFzY2l6IH0gZW50cmllcywgb25lIGZvciBlYWNoIGltcG9ydGVkIGZ1bmN0aW9uLgotICAgVGhlIGBzaG9ydCcgaXMgdGhlIGZ1bmN0aW9uJ3Mgb3JkaW5hbCBudW1iZXIuCi0KLSAgIC5pZGF0YSQ3ID0gZGxsIG5hbWUgKGVnOiAia2VybmVsMzIuZGxsIikuICguaWRhdGEkNiBmb3IgcHBjKQotKi8KLQotLyogQUlYIHJlcXVpcmVzIHRoaXMgdG8gYmUgdGhlIGZpcnN0IHRoaW5nIGluIHRoZSBmaWxlLiAgKi8KLSNpZm5kZWYgX19HTlVDX18KLSMgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIHNob3dfYWxsbmFtZXMgMAotCi0jZGVmaW5lIFBBR0VfU0laRSA0MDk2Ci0jZGVmaW5lIFBBR0VfTUFTSyAoLVBBR0VfU0laRSkKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLSNpbmNsdWRlICJkbGx0b29sLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSNpbmNsdWRlICJjb2ZmL2FybS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNlbmRpZgotCi0vKiBGb3J3YXJkIHJlZmVyZW5jZXMuICAqLwotc3RhdGljIGNoYXIgKmxvb2tfZm9yX3Byb2cgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGNoYXIgKmRlZHVjZV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9jYWNoZV9maWxlbmFtZSAoY2hhciAqKTsKLXN0YXRpYyB2b2lkIG1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUgKHZvaWQpOwotI2VuZGlmCi0gICAgIAotI2lmZGVmIEhBVkVfU1lTX1dBSVRfSAotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jZWxzZSAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTjMyX18pCi0jaWZuZGVmIFdJRkVYSVRFRAotI2RlZmluZSBXSUZFWElURUQodykJKCgodykmMDM3NykgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSYwMzc3KSAhPSAwMTc3ICYmICgodykmfjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDAxNzcpCi0jZW5kaWYKLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgPj4gOCkgJiAwMzc3KQotI2VuZGlmCi0jZWxzZSAvKiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSAqLwotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpICYgMHhmZikgPT0gMCkKLSNlbmRpZgotI2lmbmRlZiBXSUZTSUdOQUxFRAotI2RlZmluZSBXSUZTSUdOQUxFRCh3KQkoKCh3KSAmIDB4ZmYpICE9IDAgJiYgKCh3KSAmIDB4ZmYpICE9IDB4N2YpCi0jZW5kaWYKLSNpZm5kZWYgV1RFUk1TSUcKLSNkZWZpbmUgV1RFUk1TSUcodykJKCh3KSAmIDB4N2YpCi0jZW5kaWYKLSNpZm5kZWYgV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgJiAweGZmMDApID4+IDgpCi0jZW5kaWYKLSNlbmRpZiAvKiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSAqLwotI2VuZGlmIC8qICEgSEFWRV9TWVNfV0FJVF9IICovCi0KLS8qIGlmdW5jIGFuZCBpaGVhZCBkYXRhIHN0cnVjdHVyZXM6IHR0a0BjeWdudXMuY29tIDE5OTcKLQotICAgV2hlbiBJTVBPUlQgZGVjbGFyYXRpb25zIGFyZSBlbmNvdW50ZXJlZCBpbiBhIC5kZWYgZmlsZSB0aGUKLSAgIGZ1bmN0aW9uIGltcG9ydCBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gYSBzdHJ1Y3R1cmUgcmVmZXJlbmNlZCBieQotICAgdGhlIGdsb2JhbCB2YXJpYWJsZSBJTVBPUlRfTElTVC4gIFRoZSBzdHJ1Y3R1cmUgaXMgYSBsaW5rZWQgbGlzdAotICAgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgdGhlIGRsbCBmaWxlcyBlYWNoIGZ1bmN0aW9uIGlzIGltcG9ydGVkCi0gICBmcm9tIGFuZCBhIGxpbmtlZCBsaXN0IG9mIGZ1bmN0aW9ucyBiZWluZyBpbXBvcnRlZCBmcm9tIHRoYXQgZGxsCi0gICBmaWxlLiAgVGhpcyByb3VnaGx5IHBhcmFsbGVscyB0aGUgc3RydWN0dXJlIG9mIHRoZSAuaWRhdGEgc2VjdGlvbgotICAgaW4gdGhlIFBFIG9iamVjdCBmaWxlLgotCi0gICBUaGUgY29udGVudHMgb2YgLmRlZiBmaWxlIGFyZSBpbnRlcnByZXRlZCBmcm9tIHdpdGhpbiB0aGUKLSAgIHByb2Nlc3NfZGVmX2ZpbGUgZnVuY3Rpb24uICBFdmVyeSB0aW1lIGFuIElNUE9SVCBkZWNsYXJhdGlvbiBpcwotICAgZW5jb3VudGVyZWQsIGl0IGlzIGJyb2tlbiB1cCBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMgYW5kIHBhc3NlZCB0bwotICAgZGVmX2ltcG9ydC4gIElNUE9SVF9MSVNUIGlzIGluaXRpYWxpemVkIHRvIE5VTEwgaW4gZnVuY3Rpb24gbWFpbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGlmdW5jdAotewotICBjaGFyICAgICAgICAgICpuYW1lOyAgIC8qIG5hbWUgb2YgZnVuY3Rpb24gYmVpbmcgaW1wb3J0ZWQgKi8KLSAgaW50ICAgICAgICAgICAgb3JkOyAgICAvKiB0d28tYnl0ZSBvcmRpbmFsIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBmdW5jdGlvbiAqLwotICBzdHJ1Y3QgaWZ1bmN0ICpuZXh0OwotfSBpZnVuY3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGloZWFkdAotewotICBjaGFyICAgICAgICAgICpkbGxuYW1lOyAgLyogbmFtZSBvZiBkbGwgZmlsZSBpbXBvcnRlZCBmcm9tICovCi0gIGxvbmcgICAgICAgICAgIG5mdW5jczsgICAvKiBudW1iZXIgb2YgZnVuY3Rpb25zIGluIGxpc3QgKi8KLSAgc3RydWN0IGlmdW5jdCAqZnVuY2hlYWQ7IC8qIGZpcnN0IGZ1bmN0aW9uIGluIGxpc3QgKi8KLSAgc3RydWN0IGlmdW5jdCAqZnVuY3RhaWw7IC8qIGxhc3QgIGZ1bmN0aW9uIGluIGxpc3QgKi8KLSAgc3RydWN0IGloZWFkdCAqbmV4dDsgICAgIC8qIG5leHQgZGxsIGZpbGUgaW4gbGlzdCAqLwotfSBpaGVhZHR5cGU7Ci0KLS8qIFN0cnVjdHVyZSBjb250YWluaW5nIGFsbCBpbXBvcnQgaW5mb3JtYXRpb24gYXMgZGVmaW5lZCBpbiAuZGVmIGZpbGUKLSAgIChxdiAiaWhlYWQgc3RydWN0dXJlIikuICAqLwotCi1zdGF0aWMgaWhlYWR0eXBlICppbXBvcnRfbGlzdCA9IE5VTEw7Ci0KLXN0YXRpYyBjaGFyICphc19uYW1lID0gTlVMTDsKLXN0YXRpYyBjaGFyICogYXNfZmxhZ3MgPSAiIjsKLQotc3RhdGljIGludCBub19pZGF0YTQ7Ci1zdGF0aWMgaW50IG5vX2lkYXRhNTsKLXN0YXRpYyBjaGFyICpleHBfbmFtZTsKLXN0YXRpYyBjaGFyICppbXBfbmFtZTsKLXN0YXRpYyBjaGFyICpoZWFkX2xhYmVsOwotc3RhdGljIGNoYXIgKmltcF9uYW1lX2xhYjsKLXN0YXRpYyBjaGFyICpkbGxfbmFtZTsKLQotc3RhdGljIGludCBhZGRfaW5kaXJlY3QgPSAwOwotc3RhdGljIGludCBhZGRfdW5kZXJzY29yZSA9IDA7Ci1zdGF0aWMgaW50IGRvbnRkZWx0ZW1wcyA9IDA7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGV4cG9ydCBhbGwgc3ltYm9scy4gIE90aGVyd2lzZSwgd2Ugb25seSBleHBvcnQKLSAgIHN5bWJvbHMgbGlzdGVkIGluIC5kcmVjdHZlIHNlY3Rpb25zIG9yIGluIHRoZSBkZWYgZmlsZS4gICovCi1zdGF0aWMgYm9vbGVhbiBleHBvcnRfYWxsX3N5bWJvbHM7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGV4Y2x1ZGUgdGhlIHN5bWJvbHMgaW4gREVGQVVMVF9FWENMVURFUyB3aGVuCi0gICBleHBvcnRpbmcgYWxsIHN5bWJvbHMuICAqLwotc3RhdGljIGJvb2xlYW4gZG9fZGVmYXVsdF9leGNsdWRlczsKLQotLyogRGVmYXVsdCBzeW1ib2xzIHRvIGV4Y2x1ZGUgd2hlbiBleHBvcnRpbmcgYWxsIHRoZSBzeW1ib2xzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X2V4Y2x1ZGVzID0gIkRsbE1haW5AMTIsRGxsRW50cnlQb2ludEAwLGltcHVyZV9wdHIiOwotCi1zdGF0aWMgY2hhciAqZGVmX2ZpbGU7Ci0KLWV4dGVybiBjaGFyICogcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgaW50IG1hY2hpbmU7Ci1zdGF0aWMgaW50IGtpbGxhdDsKLXN0YXRpYyBpbnQgYWRkX3N0ZGNhbGxfYWxpYXM7Ci1zdGF0aWMgaW50IHZlcmJvc2U7Ci1zdGF0aWMgRklMRSAqb3V0cHV0X2RlZjsKLXN0YXRpYyBGSUxFICpiYXNlX2ZpbGU7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gImFybSI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfSTM4Ngotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gImkzODYiOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX1BQQwotc3RhdGljIGNvbnN0IGNoYXIgKm1uYW1lID0gInBwYyI7Ci0jZW5kaWYKLQotI2lmZGVmIERMTFRPT0xfTUNPUkUKLXN0YXRpYyBjb25zdCBjaGFyICogbW5hbWUgPSAibWNvcmUiOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotc3RhdGljIGNvbnN0IGNoYXIgKiBtbmFtZSA9ICJtY29yZS1lbGYiOwotc3RhdGljIGNoYXIgKiBtY29yZV9lbGZfb3V0X2ZpbGUgPSBOVUxMOwotc3RhdGljIGNoYXIgKiBtY29yZV9lbGZfbGlua2VyICAgPSBOVUxMOwotc3RhdGljIGNoYXIgKiBtY29yZV9lbGZfbGlua2VyX2ZsYWdzID0gTlVMTDsKLQotI2RlZmluZSBEUkVDVFZFX1NFQ1RJT05fTkFNRSAoKG1hY2hpbmUgPT0gTU1DT1JFX0VMRiB8fCBtYWNoaW5lID09IE1NQ09SRV9FTEZfTEUpID8gIi5leHBvcnRzIiA6ICIuZHJlY3R2ZSIpCi0jZW5kaWYKLQotI2lmbmRlZiBEUkVDVFZFX1NFQ1RJT05fTkFNRQotI2RlZmluZSBEUkVDVFZFX1NFQ1RJT05fTkFNRSAiLmRyZWN0dmUiCi0jZW5kaWYKLQotI2RlZmluZSBQQVRITUFYIDI1MAkJLyogV2hhdCdzIHRoZSByaWdodCBuYW1lIGZvciB0aGlzID8gKi8KLQotI2RlZmluZSBUTVBfQVNNCQkiZGMucyIKLSNkZWZpbmUgVE1QX0hFQURfUwkiZGgucyIKLSNkZWZpbmUgVE1QX0hFQURfTwkiZGgubyIKLSNkZWZpbmUgVE1QX1RBSUxfUwkiZHQucyIKLSNkZWZpbmUgVE1QX1RBSUxfTwkiZHQubyIKLSNkZWZpbmUgVE1QX1NUVUIJImRzIgotCi0vKiBUaGlzIGJpdCBvZiBhc3NlbWx5IGRvZXMgam1wICogLi4uLiAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaTM4Nl9qdGFiW10gPQotewotICAweGZmLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDkwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhcm1fanRhYltdID0KLXsKLSAgMHgwMCwgMHhjMCwgMHg5ZiwgMHhlNSwJLyogbGRyICBpcCwgW3BjXSAqLwotICAweDAwLCAweGYwLCAweDljLCAweGU1LAkvKiBsZHIgIHBjLCBbaXBdICovCi0gIDAsICAgIDAsICAgIDAsICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFybV9pbnRlcndvcmtfanRhYltdID0KLXsKLSAgMHgwNCwgMHhjMCwgMHg5ZiwgMHhlNSwJLyogbGRyICBpcCwgW3BjXSAqLwotICAweDAwLCAweGMwLCAweDljLCAweGU1LAkvKiBsZHIgIGlwLCBbaXBdICovCi0gIDB4MWMsIDB4ZmYsIDB4MmYsIDB4ZTEsCS8qIGJ4ICAgaXAgICAgICAgKi8KLSAgMCwgICAgMCwgICAgMCwgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGh1bWJfanRhYltdID0KLXsKLSAgMHg0MCwgMHhiNCwgICAgICAgICAgIC8qIHB1c2gge3I2fSAgICAgICAgICovCi0gIDB4MDIsIDB4NGUsICAgICAgICAgICAvKiBsZHIgIHI2LCBbcGMsICM4XSAqLwotICAweDM2LCAweDY4LCAgICAgICAgICAgLyogbGRyICByNiwgW3I2XSAgICAgKi8KLSAgMHhiNCwgMHg0NiwgICAgICAgICAgIC8qIG1vdiAgaXAsIHI2ICAgICAgICovCi0gIDB4NDAsIDB4YmMsICAgICAgICAgICAvKiBwb3AgIHtyNn0gICAgICAgICAqLwotICAweDYwLCAweDQ3LCAgICAgICAgICAgLyogYnggICBpcCAgICAgICAgICAgKi8KLSAgMCwgICAgMCwgICAgMCwgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWNvcmVfYmVfanRhYltdID0KLXsKLSAgMHg3MCwgMHgwMSwgICAgICAgICAgICAvKiBqbXBpIDEgICAgICovCi0gIDB4MTIsIDB4MTEsICAgICAgICAgICAgLyogbm9wICovCi0gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgLyogPGFkZHJlc3M+ICAqLyAgCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtY29yZV9sZV9qdGFiW10gPQotewotICAweDAxLCAweDcwLCAgICAgICAgICAgIC8qIGptcGkgMSAgICAgKi8KLSAgMHgxMSwgMHgxMiwgICAgICAgICAgICAvKiBub3AgKi8KLSAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCAvKiA8YWRkcmVzcz4gICovICAKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIGdsdWUgc2VxdWVuY2UgZm9yIFBvd2VyUEMgUEUuIFRoZXJlIGlzIGEgICovCi0vKiB0b2NyZWwxNi10b2NkZWZuIHJlbG9jIGFnYWluc3QgdGhlIGZpcnN0IGluc3RydWN0aW9uLiAqLwotLyogV2UgYWxzbyBuZWVkIGEgSU1HTFVFIHJlbG9jIGFnYWluc3QgdGhlIGdsdWUgZnVuY3Rpb24gKi8KLS8qIHRvIHJlc3RvcmUgdGhlIHRvYyBzYXZlZCBieSB0aGUgdGhpcmQgaW5zdHJ1Y3Rpb24gaW4gICovCi0vKiB0aGUgZ2x1ZS4gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBwY19qdGFiW10gPQotewotICAweDAwLCAweDAwLCAweDYyLCAweDgxLCAvKiBsd3ogcjExLDAocjIpICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBSZWxvYyBUT0NSRUwxNiBfX2ltcF94eHggICovCi0gIDB4MDAsIDB4MDAsIDB4OEIsIDB4ODEsIC8qIGx3eiByMTIsMChyMTEpICAgICAgICAgICAgICAqLwotICAweDA0LCAweDAwLCAweDQxLCAweDkwLCAvKiBzdHcgcjIsNChyMSkgICAgICAgICAgICAgICAgKi8KLSAgMHhBNiwgMHgwMywgMHg4OSwgMHg3RCwgLyogbXRjdHIgcjEyICAgICAgICAgICAgICAgICAgICovCi0gIDB4MDQsIDB4MDAsIDB4NEIsIDB4ODAsIC8qIGx3eiByMiw0KHIxMSkgICAgICAgICAgICAgICAqLwotICAweDIwLCAweDA0LCAweDgwLCAweDRFICAvKiBiY3RyICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLSNpZmRlZiBETExUT09MX1BQQwotLyogdGhlIGdsdWUgaW5zdHJ1Y3Rpb24sIHBpY2tzIHVwIHRoZSB0b2MgZnJvbSB0aGUgc3R3IGluICovCi0vKiB0aGUgYWJvdmUgY29kZTogImx3eiByMiw0KHIxKSIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBiZmRfdm1hIHBwY19nbHVlX2luc24gPSAweDgwNDEwMDA0OwotI2VuZGlmCi0KLXN0cnVjdCBtYWMKLSAgewotICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci0gICAgY29uc3QgY2hhciAqaG93X2J5dGU7Ci0gICAgY29uc3QgY2hhciAqaG93X3Nob3J0OwotICAgIGNvbnN0IGNoYXIgKmhvd19sb25nOwotICAgIGNvbnN0IGNoYXIgKmhvd19hc2NpejsKLSAgICBjb25zdCBjaGFyICpob3dfY29tbWVudDsKLSAgICBjb25zdCBjaGFyICpob3dfanVtcDsKLSAgICBjb25zdCBjaGFyICpob3dfZ2xvYmFsOwotICAgIGNvbnN0IGNoYXIgKmhvd19zcGFjZTsKLSAgICBjb25zdCBjaGFyICpob3dfYWxpZ25fc2hvcnQ7Ci0gICAgY29uc3QgY2hhciAqaG93X2FsaWduX2xvbmc7Ci0gICAgY29uc3QgY2hhciAqaG93X2JmZF90YXJnZXQ7Ci0gICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGhvd19iZmRfYXJjaDsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpob3dfanRhYjsKLSAgICBpbnQgaG93X2p0YWJfc2l6ZTsgLyogc2l6ZSBvZiB0aGUganRhYiBlbnRyeSAqLwotICAgIGludCBob3dfanRhYl9yb2ZmOyAvKiBvZmZzZXQgaW50byBpdCBmb3IgdGhlIGluZCAzMiByZWxvYyBpbnRvIGlkYXRhIDUgKi8KLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtYWMKLW10YWJsZVtdID0KLXsKLSAgewotI2RlZmluZSBNQVJNIDAKLSAgICAiYXJtIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdHBjLFtpcF1cblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCJwZS1hcm0tbGl0dGxlIiwgYmZkX2FyY2hfYXJtLAotICAgIGFybV9qdGFiLCBzaXplb2YgKGFybV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNMzg2IDEKLSAgICAiaTM4NiIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIiMiLCAiam1wICoiLCAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtaTM4NiIsYmZkX2FyY2hfaTM4NiwKLSAgIGkzODZfanRhYiwgc2l6ZW9mIChpMzg2X2p0YWIpLCAyCi0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1QUEMgMgotICAgICJwcGMiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIjIiwgImptcCAqIiwgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsInBlLXBvd2VycGNsZSIsYmZkX2FyY2hfcG93ZXJwYywKLSAgIHBwY19qdGFiLCBzaXplb2YgKHBwY19qdGFiKSwgMAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNVEhVTUIgMwotICAgICJ0aHVtYiIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIkAiLAotICAgICJwdXNoXHR7cjZ9XG5cdGxkclx0cjYsIFtwYywgIzhdXG5cdGxkclx0cjYsIFtyNl1cblx0bW92XHRpcCwgcjZcblx0cG9wXHR7cjZ9XG5cdGJ4XHRpcCIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsInBlLWFybS1saXR0bGUiLCBiZmRfYXJjaF9hcm0sCi0gICAgdGh1bWJfanRhYiwgc2l6ZW9mICh0aHVtYl9qdGFiKSwgMTIKLSAgfQotICAsCi0jZGVmaW5lIE1BUk1fSU5URVJXT1JLIDQKLSAgewotICAgICJhcm1faW50ZXJ3b3JrIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiQCIsCi0gICAgImxkclx0aXAsW3BjXVxuXHRsZHJcdGlwLFtpcF1cblx0YnhcdGlwXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtYXJtLWxpdHRsZSIsIGJmZF9hcmNoX2FybSwKLSAgICBhcm1faW50ZXJ3b3JrX2p0YWIsIHNpemVvZiAoYXJtX2ludGVyd29ya19qdGFiKSwgMTIKLSAgfQotICAsCi0gIHsKLSNkZWZpbmUgTU1DT1JFX0JFIDUKLSAgICAibWNvcmUiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImptcGlcdDFcblx0bm9wXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwicGUtbWNvcmUtYmlnIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfYmVfanRhYiwgc2l6ZW9mIChtY29yZV9iZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfTEUgNgotICAgICJtY29yZS1sZSIsICIuYnl0ZSIsICIuc2hvcnQiLCAiLmxvbmciLCAiLmFzY2l6IiwgIi8vIiwKLSAgICAiam1waVx0MVxuXHRub3Bcblx0LmxvbmciLAotICAgICIuZ2xvYmFsIiwgIi5zcGFjZSIsICIuYWxpZ25cdDIiLCIuYWxpZ25cdDQiLCJwZS1tY29yZS1saXR0bGUiLCBiZmRfYXJjaF9tY29yZSwKLSAgICBtY29yZV9sZV9qdGFiLCBzaXplb2YgKG1jb3JlX2xlX2p0YWIpLCA4Ci0gIH0KLSAgLAotICB7Ci0jZGVmaW5lIE1NQ09SRV9FTEYgNwotICAgICJtY29yZS1lbGYiLCAiLmJ5dGUiLCAiLnNob3J0IiwgIi5sb25nIiwgIi5hc2NpeiIsICIvLyIsCi0gICAgImptcGlcdDFcblx0bm9wXG5cdC5sb25nIiwKLSAgICAiLmdsb2JhbCIsICIuc3BhY2UiLCAiLmFsaWduXHQyIiwiLmFsaWduXHQ0IiwiZWxmMzItbWNvcmUtYmlnIiwgYmZkX2FyY2hfbWNvcmUsCi0gICAgbWNvcmVfYmVfanRhYiwgc2l6ZW9mIChtY29yZV9iZV9qdGFiKSwgOAotICB9Ci0gICwKLSAgewotI2RlZmluZSBNTUNPUkVfRUxGX0xFIDgKLSAgICAibWNvcmUtZWxmLWxlIiwgIi5ieXRlIiwgIi5zaG9ydCIsICIubG9uZyIsICIuYXNjaXoiLCAiLy8iLAotICAgICJqbXBpXHQxXG5cdG5vcFxuXHQubG9uZyIsCi0gICAgIi5nbG9iYWwiLCAiLnNwYWNlIiwgIi5hbGlnblx0MiIsIi5hbGlnblx0NCIsImVsZjMyLW1jb3JlLWxpdHRsZSIsIGJmZF9hcmNoX21jb3JlLAotICAgIG1jb3JlX2xlX2p0YWIsIHNpemVvZiAobWNvcmVfbGVfanRhYiksIDgKLSAgfQotICAsCi0geyAgICAwfQotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZGxpc3QKLXsKLSAgY2hhciAqdGV4dDsKLSAgc3RydWN0IGRsaXN0ICpuZXh0OwotfQotZGxpc3RfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgZXhwb3J0Ci0gIHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgaW50IG9yZGluYWw7Ci0gICAgaW50IGNvbnN0YW50OwotICAgIGludCBub25hbWU7Ci0gICAgaW50IGRhdGE7Ci0gICAgaW50IGhpbnQ7Ci0gICAgc3RydWN0IGV4cG9ydCAqbmV4dDsKLSAgfQotZXhwb3J0X3R5cGU7Ci0KLS8qIEEgbGlzdCBvZiBzeW1ib2xzIHdoaWNoIHdlIHNob3VsZCBub3QgZXhwb3J0LiAgKi8KLSAKLXN0cnVjdCBzdHJpbmdfbGlzdAotewotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHQ7Ci0gIGNoYXIgKnN0cmluZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmV4Y2x1ZGVzOwotCi1zdGF0aWMgY29uc3QgY2hhciAqcnZhYWZ0ZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqcnZhYmVmb3JlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKmFzbV9wcmVmaXggUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfaW1wb3J0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHJ1biBQQVJBTVMgKChjb25zdCBjaGFyICosIGNoYXIgKikpOwotc3RhdGljIHZvaWQgc2Nhbl9kcmVjdHZlX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fZmlsdGVyZWRfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGFkZF9leGNsdWRlcyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIG1hdGNoX2V4Y2x1ZGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9leGNsdWRlcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgbG9uZyBmaWx0ZXJfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNjYW5fYWxsX3N5bWJvbHMgUEFSQU1TICgoYmZkICopKTsKLXN0YXRpYyB2b2lkIHNjYW5fb3Blbl9vYmpfZmlsZSBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgc2Nhbl9vYmpfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGR1bXBfZGVmX2luZm8gUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50IHNmdW5jIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7Ci1zdGF0aWMgdm9pZCBmbHVzaF9wYWdlIFBBUkFNUyAoKEZJTEUgKiwgbG9uZyAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZ2VuX2RlZl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdlbmVyYXRlX2lkYXRhX29maWxlIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIHZvaWQgZ2VuX2V4cF9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICp4bGF0ZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLSNpZiAwCi1zdGF0aWMgdm9pZCBkdW1wX2lhdCBQQVJBTVMgKChGSUxFICosIGV4cG9ydF90eXBlICopKTsKLSNlbmRpZgotc3RhdGljIGNoYXIgKm1ha2VfbGFiZWwgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBiZmQgKm1ha2Vfb25lX2xpYl9maWxlIFBBUkFNUyAoKGV4cG9ydF90eXBlICosIGludCkpOwotc3RhdGljIGJmZCAqbWFrZV9oZWFkIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBiZmQgKm1ha2VfdGFpbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnZW5fbGliX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBwZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIGludCBuZnVuYyBQQVJBTVMgKChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOwotc3RhdGljIHZvaWQgcmVtb3ZlX251bGxfbmFtZXMgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyB2b2lkIGR0YWIgUEFSQU1TICgoZXhwb3J0X3R5cGUgKiopKTsKLXN0YXRpYyB2b2lkIHByb2Nlc3NfZHVwbGljYXRlcyBQQVJBTVMgKChleHBvcnRfdHlwZSAqKikpOwotc3RhdGljIHZvaWQgZmlsbF9vcmRpbmFscyBQQVJBTVMgKChleHBvcnRfdHlwZSAqKikpOwotc3RhdGljIGludCBhbHBoYWZ1bmMgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKTsKLXN0YXRpYyB2b2lkIG1hbmdsZV9kZWZzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCkpOwotc3RhdGljIHZvaWQgaW5mb3JtIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1zdGF0aWMgdm9pZCB3YXJuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5IChtZXNzYWdlLCBhcmdzKQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfbGlzdCAgICAgIGFyZ3M7Ci17Ci0gIGlmIChwcm9ncmFtX25hbWUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLQotICBpZiAobWVzc2FnZSBbc3RybGVuIChtZXNzYWdlKSAtIDFdICE9ICdcbicpCi0gICAgZnB1dGMgKCdcbicsIHN0ZGVycik7Ci19ICAKLQotCi1zdGF0aWMgdm9pZAotI2lmZGVmIF9fU1REQ19fCi1pbmZvcm0gKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi0jZWxzZQotaW5mb3JtIChtZXNzYWdlLCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqIG1lc3NhZ2U7Ci0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgCi0gIGlmICghdmVyYm9zZSkKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBfX1NURENfXwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLQotICBkaXNwbGF5IChtZXNzYWdlLCBhcmdzKTsKLSAgCi0gIHZhX2VuZCAoYXJncyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi0jaWZkZWYgX19TVERDX18KLXdhcm4gKGNvbnN0IGNoYXIgKiBtZXNzYWdlLCAuLi4pCi0jZWxzZQotd2FybiAobWVzc2FnZSwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0gIAotI2lmZGVmIF9fU1REQ19fCi0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSNlbmRpZgotICAKLSAgZGlzcGxheSAobWVzc2FnZSwgYXJncyk7Ci0KLSAgdmFfZW5kIChhcmdzKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcnZhYWZ0ZXIgKG1hY2hpbmUpCi0gICAgIGludCBtYWNoaW5lOwotewotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgTUFSTToKLSAgICBjYXNlIE0zODY6Ci0gICAgY2FzZSBNUFBDOgotICAgIGNhc2UgTVRIVU1COgotICAgIGNhc2UgTUFSTV9JTlRFUldPUks6Ci0gICAgY2FzZSBNTUNPUkVfQkU6Ci0gICAgY2FzZSBNTUNPUkVfTEU6Ci0gICAgY2FzZSBNTUNPUkVfRUxGOgotICAgIGNhc2UgTU1DT1JFX0VMRl9MRToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmtub3duIG1hY2hpbmUgdHlwZTogJWRcbiIpLCBtYWNoaW5lKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuICIiOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ydmFiZWZvcmUgKG1hY2hpbmUpCi0gICAgIGludCBtYWNoaW5lOwotewotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgTUFSTToKLSAgICBjYXNlIE0zODY6Ci0gICAgY2FzZSBNUFBDOgotICAgIGNhc2UgTVRIVU1COgotICAgIGNhc2UgTUFSTV9JTlRFUldPUks6Ci0gICAgY2FzZSBNTUNPUkVfQkU6Ci0gICAgY2FzZSBNTUNPUkVfTEU6Ci0gICAgY2FzZSBNTUNPUkVfRUxGOgotICAgIGNhc2UgTU1DT1JFX0VMRl9MRToKLSAgICAgIHJldHVybiAiLnJ2YVx0IjsKLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iKSwgbWFjaGluZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAiIjsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotYXNtX3ByZWZpeCAobWFjaGluZSkKLSAgICAgaW50IG1hY2hpbmU7Ci17Ci0gIHN3aXRjaCAobWFjaGluZSkKLSAgICB7Ci0gICAgY2FzZSBNQVJNOgotICAgIGNhc2UgTVBQQzoKLSAgICBjYXNlIE1USFVNQjoKLSAgICBjYXNlIE1BUk1fSU5URVJXT1JLOgotICAgIGNhc2UgTU1DT1JFX0JFOgotICAgIGNhc2UgTU1DT1JFX0xFOgotICAgIGNhc2UgTU1DT1JFX0VMRjoKLSAgICBjYXNlIE1NQ09SRV9FTEZfTEU6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zODY6Ci0gICAgICByZXR1cm4gIl8iOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZmF0YWwgKF8oIkludGVybmFsIGVycm9yOiBVbmtub3duIG1hY2hpbmUgdHlwZTogJWRcbiIpLCBtYWNoaW5lKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuICIiOwotfQotCi0jZGVmaW5lIEFTTV9CWVRFIAltdGFibGVbbWFjaGluZV0uaG93X2J5dGUKLSNkZWZpbmUgQVNNX1NIT1JUIAltdGFibGVbbWFjaGluZV0uaG93X3Nob3J0Ci0jZGVmaW5lIEFTTV9MT05HCW10YWJsZVttYWNoaW5lXS5ob3dfbG9uZwotI2RlZmluZSBBU01fVEVYVAltdGFibGVbbWFjaGluZV0uaG93X2FzY2l6Ci0jZGVmaW5lIEFTTV9DIAkJbXRhYmxlW21hY2hpbmVdLmhvd19jb21tZW50Ci0jZGVmaW5lIEFTTV9KVU1QIAltdGFibGVbbWFjaGluZV0uaG93X2p1bXAKLSNkZWZpbmUgQVNNX0dMT0JBTAltdGFibGVbbWFjaGluZV0uaG93X2dsb2JhbAotI2RlZmluZSBBU01fU1BBQ0UJbXRhYmxlW21hY2hpbmVdLmhvd19zcGFjZQotI2RlZmluZSBBU01fQUxJR05fU0hPUlQgbXRhYmxlW21hY2hpbmVdLmhvd19hbGlnbl9zaG9ydAotI2RlZmluZSBBU01fUlZBX0JFRk9SRSAJcnZhYmVmb3JlKG1hY2hpbmUpCi0jZGVmaW5lIEFTTV9SVkFfQUZURVIgIAlydmFhZnRlcihtYWNoaW5lKQotI2RlZmluZSBBU01fUFJFRklYCWFzbV9wcmVmaXgobWFjaGluZSkKLSNkZWZpbmUgQVNNX0FMSUdOX0xPTkcgIG10YWJsZVttYWNoaW5lXS5ob3dfYWxpZ25fbG9uZwotI2RlZmluZSBIT1dfQkZEX1RBUkdFVCAgMCAgLyogYWx3YXlzIGRlZmF1bHQqLwotI2RlZmluZSBIT1dfQkZEX0FSQ0ggICAgbXRhYmxlW21hY2hpbmVdLmhvd19iZmRfYXJjaAotI2RlZmluZSBIT1dfSlRBQiAgICAgICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiCi0jZGVmaW5lIEhPV19KVEFCX1NJWkUgICBtdGFibGVbbWFjaGluZV0uaG93X2p0YWJfc2l6ZQotI2RlZmluZSBIT1dfSlRBQl9ST0ZGICAgbXRhYmxlW21hY2hpbmVdLmhvd19qdGFiX3JvZmYKLXN0YXRpYyBjaGFyICoqb2F2OwotCi12b2lkCi1wcm9jZXNzX2RlZl9maWxlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBGSUxFICpmID0gZm9wZW4gKG5hbWUsIEZPUEVOX1JUKTsKLSAgCi0gIGlmICghZikKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJDYW4ndCBvcGVuIGRlZiBmaWxlOiAlcyIpLCBuYW1lKTsKLQotICB5eWluID0gZjsKLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIlByb2Nlc3NpbmcgZGVmIGZpbGU6ICVzIiksIG5hbWUpOwotICAKLSAgeXlwYXJzZSAoKTsKLQotICBpbmZvcm0gKF8oIlByb2Nlc3NlZCBkZWYgZmlsZSIpKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENvbW11bmljYXRpb25zIHdpdGggdGhlIHBhcnNlciAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqZF9uYW1lOwkvKiBBcmcgdG8gTkFNRSBvciBMSUJSQVJZICovCi1zdGF0aWMgaW50IGRfbmZ1bmNzOwkJLyogTnVtYmVyIG9mIGZ1bmN0aW9ucyBleHBvcnRlZCAqLwotc3RhdGljIGludCBkX25hbWVkX25mdW5jczsJLyogTnVtYmVyIG9mIG5hbWVkIGZ1bmN0aW9ucyBleHBvcnRlZCAqLwotc3RhdGljIGludCBkX2xvd19vcmQ7CQkvKiBMb3dlc3Qgb3JkaW5hbCBpbmRleCAqLwotc3RhdGljIGludCBkX2hpZ2hfb3JkOwkJLyogSGlnaGVzdCBvcmRpbmFsIGluZGV4ICovCi1zdGF0aWMgZXhwb3J0X3R5cGUgKmRfZXhwb3J0czsJLypsaXN0IG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotc3RhdGljIGV4cG9ydF90eXBlICoqZF9leHBvcnRzX2xleGljYWxseTsJLyogdmVjdG9yIG9mIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBhbHBoYSBvcmRlciAqLwotc3RhdGljIGRsaXN0X3R5cGUgKmRfbGlzdDsJLyogRGVzY3JpcHRpb25zICovCi1zdGF0aWMgZGxpc3RfdHlwZSAqYV9saXN0OwkvKiBTdHVmZiB0byBnbyBpbiBkaXJlY3RpdmVzICovCi0KLXN0YXRpYyBpbnQgZF9pc19kbGw7Ci1zdGF0aWMgaW50IGRfaXNfZXhlOwotCi1pbnQKLXl5ZXJyb3IgKGVycikKLSAgICAgY29uc3QgY2hhciAqZXJyOwotewotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICB3YXJuIChfKCJTeW50YXggZXJyb3IgaW4gZGVmIGZpbGUgJXM6JWRcbiIpLCBkZWZfZmlsZSwgbGluZW51bWJlcik7Ci0gIAotICByZXR1cm4gMDsKLX0KLQotdm9pZAotZGVmX2V4cG9ydHMgKG5hbWUsIGludGVybmFsX25hbWUsIG9yZGluYWwsIG5vbmFtZSwgY29uc3RhbnQsIGRhdGEpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmludGVybmFsX25hbWU7Ci0gICAgIGludCBvcmRpbmFsOwotICAgICBpbnQgbm9uYW1lOwotICAgICBpbnQgY29uc3RhbnQ7Ci0gICAgIGludCBkYXRhOwotewotICBzdHJ1Y3QgZXhwb3J0ICpwID0gKHN0cnVjdCBleHBvcnQgKikgeG1hbGxvYyAoc2l6ZW9mICgqcCkpOwotCi0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT5pbnRlcm5hbF9uYW1lID0gaW50ZXJuYWxfbmFtZSA/IGludGVybmFsX25hbWUgOiBuYW1lOwotICBwLT5vcmRpbmFsID0gb3JkaW5hbDsKLSAgcC0+Y29uc3RhbnQgPSBjb25zdGFudDsKLSAgcC0+bm9uYW1lID0gbm9uYW1lOwotICBwLT5kYXRhID0gZGF0YTsKLSAgcC0+bmV4dCA9IGRfZXhwb3J0czsKLSAgZF9leHBvcnRzID0gcDsKLSAgZF9uZnVuY3MrKzsKLX0KLQotdm9pZAotZGVmX25hbWUgKG5hbWUsIGJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBiYXNlOwotewotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIk5BTUU6ICVzIGJhc2U6ICV4IiksIG5hbWUsIGJhc2UpOwotICAKLSAgaWYgKGRfaXNfZGxsKQotICAgIHdhcm4gKF8oIkNhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIikpOwotICAKLSAgZF9uYW1lID0gbmFtZTsKLSAgLyogaWYgLS1kbGxuYW1lIG5vdCBwcm92aWRlZCwgdXNlIHRoZSBvbmUgaW4gdGhlIERFRiBmaWxlLgotICAgICBGSVhNRTogSXMgdGhpcyBhcHByb3ByaWF0ZSBmb3IgZXhlY3V0YWJsZXM/ICovCi0gIGlmICghIGRsbF9uYW1lKQotICAgIGRsbF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRfaXNfZXhlID0gMTsKLX0KLQotdm9pZAotZGVmX2xpYnJhcnkgKG5hbWUsIGJhc2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBiYXNlOwotewotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkxJQlJBUlk6ICVzIGJhc2U6ICV4IiksIG5hbWUsIGJhc2UpOwotICAKLSAgaWYgKGRfaXNfZXhlKQotICAgIHdhcm4gKF8oIiVzOiBDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAKLSAgZF9uYW1lID0gbmFtZTsKLSAgLyogaWYgLS1kbGxuYW1lIG5vdCBwcm92aWRlZCwgdXNlIHRoZSBvbmUgaW4gdGhlIERFRiBmaWxlLiAqLwotICBpZiAoISBkbGxfbmFtZSkKLSAgICBkbGxfbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBkX2lzX2RsbCA9IDE7Ci19Ci0KLXZvaWQKLWRlZl9kZXNjcmlwdGlvbiAoZGVzYykKLSAgICAgY29uc3QgY2hhciAqZGVzYzsKLXsKLSAgZGxpc3RfdHlwZSAqZCA9IChkbGlzdF90eXBlICopIHhtYWxsb2MgKHNpemVvZiAoZGxpc3RfdHlwZSkpOwotICBkLT50ZXh0ID0geHN0cmR1cCAoZGVzYyk7Ci0gIGQtPm5leHQgPSBkX2xpc3Q7Ci0gIGRfbGlzdCA9IGQ7Ci19Ci0KLXZvaWQKLW5ld19kaXJlY3RpdmUgKGRpcikKLSAgICAgY2hhciAqZGlyOwotewotICBkbGlzdF90eXBlICpkID0gKGRsaXN0X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChkbGlzdF90eXBlKSk7Ci0gIGQtPnRleHQgPSB4c3RyZHVwIChkaXIpOwotICBkLT5uZXh0ID0gYV9saXN0OwotICBhX2xpc3QgPSBkOwotfQotCi12b2lkCi1kZWZfaGVhcHNpemUgKHJlc2VydmUsIGNvbW1pdCkKLSAgICAgaW50IHJlc2VydmU7Ci0gICAgIGludCBjb21taXQ7Ci17Ci0gIGNoYXIgYlsyMDBdOwotICBpZiAoY29tbWl0ID4gMCkKLSAgICBzcHJpbnRmIChiLCAiLWhlYXAgMHgleCwweCV4ICIsIHJlc2VydmUsIGNvbW1pdCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChiLCAiLWhlYXAgMHgleCAiLCByZXNlcnZlKTsKLSAgbmV3X2RpcmVjdGl2ZSAoeHN0cmR1cCAoYikpOwotfQotCi12b2lkCi1kZWZfc3RhY2tzaXplIChyZXNlcnZlLCBjb21taXQpCi0gICAgIGludCByZXNlcnZlOwotICAgICBpbnQgY29tbWl0OwotewotICBjaGFyIGJbMjAwXTsKLSAgaWYgKGNvbW1pdCA+IDApCi0gICAgc3ByaW50ZiAoYiwgIi1zdGFjayAweCV4LDB4JXggIiwgcmVzZXJ2ZSwgY29tbWl0KTsKLSAgZWxzZQotICAgIHNwcmludGYgKGIsICItc3RhY2sgMHgleCAiLCByZXNlcnZlKTsKLSAgbmV3X2RpcmVjdGl2ZSAoeHN0cmR1cCAoYikpOwotfQotCi0vKiBhcHBlbmRfaW1wb3J0IHNpbXBseSBhZGRzIHRoZSBnaXZlbiBpbXBvcnQgZGVmaW5pdGlvbiB0byB0aGUgZ2xvYmFsCi0gICBpbXBvcnRfbGlzdC4gIEl0IGlzIHVzZWQgYnkgZGVmX2ltcG9ydC4gICovCi0KLXN0YXRpYyB2b2lkCi1hcHBlbmRfaW1wb3J0IChzeW1ib2xfbmFtZSwgZGxsX25hbWUsIGZ1bmNfb3JkaW5hbCkKLSAgICAgY29uc3QgY2hhciAqc3ltYm9sX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRsbF9uYW1lOwotICAgICBpbnQgZnVuY19vcmRpbmFsOwotewotICBpaGVhZHR5cGUgKipwcTsKLSAgaWhlYWR0eXBlICpxOwotCi0gIGZvciAocHEgPSAmaW1wb3J0X2xpc3Q7ICpwcSAhPSBOVUxMOyBwcSA9ICYoKnBxKS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wICgoKnBxKS0+ZGxsbmFtZSwgZGxsX25hbWUpID09IDApCi0JewotCSAgcSA9ICpwcTsKLQkgIHEtPmZ1bmN0YWlsLT5uZXh0ID0geG1hbGxvYyAoc2l6ZW9mIChpZnVuY3R5cGUpKTsKLQkgIHEtPmZ1bmN0YWlsID0gcS0+ZnVuY3RhaWwtPm5leHQ7Ci0JICBxLT5mdW5jdGFpbC0+b3JkICA9IGZ1bmNfb3JkaW5hbDsKLQkgIHEtPmZ1bmN0YWlsLT5uYW1lID0geHN0cmR1cCAoc3ltYm9sX25hbWUpOwotCSAgcS0+ZnVuY3RhaWwtPm5leHQgPSBOVUxMOwotCSAgcS0+bmZ1bmNzKys7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBxID0geG1hbGxvYyAoc2l6ZW9mIChpaGVhZHR5cGUpKTsKLSAgcS0+ZGxsbmFtZSA9IHhzdHJkdXAgKGRsbF9uYW1lKTsKLSAgcS0+bmZ1bmNzID0gMTsKLSAgcS0+ZnVuY2hlYWQgPSB4bWFsbG9jIChzaXplb2YgKGlmdW5jdHlwZSkpOwotICBxLT5mdW5jdGFpbCA9IHEtPmZ1bmNoZWFkOwotICBxLT5uZXh0ID0gTlVMTDsKLSAgcS0+ZnVuY3RhaWwtPm5hbWUgPSB4c3RyZHVwIChzeW1ib2xfbmFtZSk7Ci0gIHEtPmZ1bmN0YWlsLT5vcmQgID0gZnVuY19vcmRpbmFsOwotICBxLT5mdW5jdGFpbC0+bmV4dCA9IE5VTEw7Ci0KLSAgKnBxID0gcTsKLX0KLQotLyogZGVmX2ltcG9ydCBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gZGVmcGFyc2UueSB3aGVuIGFuIElNUE9SVAotICAgZGVjbGFyYXRpb24gaXMgZW5jb3VudGVyZWQuICBEZXBlbmRpbmcgb24gdGhlIGZvcm0gb2YgdGhlCi0gICBkZWNsYXJhdGlvbiwgdGhlIG1vZHVsZSBuYW1lIG1heSBvciBtYXkgbm90IG5lZWQgIi5kbGwiIHRvIGJlCi0gICBhcHBlbmRlZCB0byBpdCwgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIG1heSBiZSBzdG9yZWQgaW4gaW50ZXJuYWwKLSAgIG9yIGVudHJ5LCBhbmQgdGhlcmUgbWF5IG9yIG1heSBub3QgYmUgYW4gb3JkaW5hbCB2YWx1ZSBhc3NvY2lhdGVkCi0gICB3aXRoIGl0LiAgKi8KLQotLyogQSBub3RlIHJlZ2FyZGluZyB0aGUgcGFyc2UgbW9kZXM6Ci0gICBJbiBkZWZwYXJzZS55IHdlIGhhdmUgdG8gYWNjZXB0IGltcG9ydCBkZWNsYXJhdGlvbnMgd2hpY2ggZm9sbG93Ci0gICBhbnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6Ci0gICAgIDxmdW5jX25hbWVfaW5fYXBwPiA9IDxkbGxfbmFtZT4uPGZ1bmNfbmFtZV9pbl9kbGw+Ci0gICAgIDxmdW5jX25hbWVfaW5fYXBwPiA9IDxkbGxfbmFtZT4uPG51bWJlcj4KLSAgICAgPGRsbF9uYW1lPi48ZnVuY19uYW1lX2luX2RsbD4KLSAgICAgPGRsbF9uYW1lPi48bnVtYmVyPgotICAgRnVydGhlcm1vcmUsIHRoZSBkbGwncyBuYW1lIG1heSBvciBtYXkgbm90IGVuZCB3aXRoICIuZGxsIiwgd2hpY2gKLSAgIGNvbXBsaWNhdGVzIHRoZSBwYXJzaW5nIGEgbGl0dGxlLiAgTm9ybWFsbHkgdGhlIGRsbCdzIG5hbWUgaXMKLSAgIHBhc3NlZCB0byBkZWZfaW1wb3J0KCkgaW4gdGhlICJtb2R1bGUiIHBhcmFtZXRlciwgYnV0IHdoZW4gaXQgZW5kcwotICAgd2l0aCAiLmRsbCIgaXQgZ2V0cyBwYXNzZWQgaW4gIm1vZHVsZSIgc2FucyAiLmRsbCIgYW5kIHRoYXQgbmVlZHMKLSAgIHRvIGJlIHJlYXBwZW5kZWQuCi0KLSAgZGVmX2ltcG9ydCBnZXRzIGZpdmUgcGFyYW1ldGVyczoKLSAgQVBQX05BTUUgLSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGFwcGxpY2F0aW9uLCBpZgotICAgICAgICAgICAgIHByZXNlbnQsIG9yIE5VTEwgaWYgbm90IHByZXNlbnQuCi0gIE1PRFVMRSAgIC0gdGhlIG5hbWUgb2YgdGhlIGRsbCwgcG9zc2libHkgc2FucyBleHRlbnNpb24gKGllLCAnLmRsbCcpLgotICBETExFWFQgICAtIHRoZSBleHRlbnNpb24gb2YgdGhlIGRsbCwgaWYgcHJlc2VudCwgTlVMTCBpZiBub3QgcHJlc2VudC4KLSAgRU5UUlkgICAgLSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGRsbCwgaWYgcHJlc2VudCwgb3IgTlVMTC4KLSAgT1JEX1ZBTCAgLSB0aGUgbnVtZXJpY2FsIHRhZyBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGRsbCwgaWYgcHJlc2VudCwKLSAgICAgICAgICAgICBvciBOVUxMLiAgRXhhY3RseSBvbmUgb2YgPGVudHJ5PiBvciA8b3JkX3ZhbD4gbXVzdCBiZQotICAgICAgICAgICAgIHByZXNlbnQgKGkuZS4sIG5vdCBOVUxMKS4gICovCi0KLXZvaWQKLWRlZl9pbXBvcnQgKGFwcF9uYW1lLCBtb2R1bGUsIGRsbGV4dCwgZW50cnksIG9yZF92YWwpCi0gICAgIGNvbnN0IGNoYXIgKmFwcF9uYW1lOwotICAgICBjb25zdCBjaGFyICptb2R1bGU7Ci0gICAgIGNvbnN0IGNoYXIgKmRsbGV4dDsKLSAgICAgY29uc3QgY2hhciAqZW50cnk7Ci0gICAgIGludCBvcmRfdmFsOwotewotICBjb25zdCBjaGFyICphcHBsaWNhdGlvbl9uYW1lOwotICBjaGFyICpidWY7Ci0KLSAgaWYgKGVudHJ5ICE9IE5VTEwpCi0gICAgYXBwbGljYXRpb25fbmFtZSA9IGVudHJ5OwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGFwcF9uYW1lICE9IE5VTEwpCi0JYXBwbGljYXRpb25fbmFtZSA9IGFwcF9uYW1lOwotICAgICAgZWxzZQotCWFwcGxpY2F0aW9uX25hbWUgPSAiIjsKLSAgICB9Ci0gIAotICBpZiAoZGxsZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKG1vZHVsZSkgKyBzdHJsZW4gKGRsbGV4dCkgKyAyKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzLiVzIiwgbW9kdWxlLCBkbGxleHQpOwotICAgICAgbW9kdWxlID0gYnVmOwotICAgIH0KLQotICBhcHBlbmRfaW1wb3J0IChhcHBsaWNhdGlvbl9uYW1lLCBtb2R1bGUsIG9yZF92YWwpOwotfQotCi12b2lkCi1kZWZfdmVyc2lvbiAobWFqb3IsIG1pbm9yKQotICAgICBpbnQgbWFqb3I7Ci0gICAgIGludCBtaW5vcjsKLXsKLSAgcHJpbnRmICgiVkVSU0lPTiAlZC4lZFxuIiwgbWFqb3IsIG1pbm9yKTsKLX0KLQotdm9pZAotZGVmX3NlY3Rpb24gKG5hbWUsIGF0dHIpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBhdHRyOwotewotICBjaGFyIGJ1ZlsyMDBdOwotICBjaGFyIGF0dHNbNV07Ci0gIGNoYXIgKmQgPSBhdHRzOwotICBpZiAoYXR0ciAmIDEpCi0gICAgKmQrKyA9ICdSJzsKLQotICBpZiAoYXR0ciAmIDIpCi0gICAgKmQrKyA9ICdXJzsKLSAgaWYgKGF0dHIgJiA0KQotICAgICpkKysgPSAnWCc7Ci0gIGlmIChhdHRyICYgOCkKLSAgICAqZCsrID0gJ1MnOwotICAqZCsrID0gMDsKLSAgc3ByaW50ZiAoYnVmLCAiLWF0dHIgJXMgJXMiLCBuYW1lLCBhdHRzKTsKLSAgbmV3X2RpcmVjdGl2ZSAoeHN0cmR1cCAoYnVmKSk7Ci19Ci0KLXZvaWQKLWRlZl9jb2RlIChhdHRyKQotICAgICBpbnQgYXR0cjsKLXsKLQotICBkZWZfc2VjdGlvbiAoIkNPREUiLCBhdHRyKTsKLX0KLQotdm9pZAotZGVmX2RhdGEgKGF0dHIpCi0gICAgIGludCBhdHRyOwotewotICBkZWZfc2VjdGlvbiAoIkRBVEEiLCBhdHRyKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1ydW4gKHdoYXQsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKndoYXQ7Ci0gICAgIGNoYXIgKmFyZ3M7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBwaWQsIHdhaXRfc3RhdHVzOwotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqKmFyZ3Y7Ci0gIGNoYXIgKmVycm1zZ19mbXQsICplcnJtc2dfYXJnOwotICBjaGFyICp0ZW1wX2Jhc2UgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotCi0gIGluZm9ybSAoInJ1bjogJXMgJXNcbiIsIHdoYXQsIGFyZ3MpOwotCi0gIC8qIENvdW50IHRoZSBhcmdzICovCi0gIGkgPSAwOwotICBmb3IgKHMgPSBhcmdzOyAqczsgcysrKQotICAgIGlmICgqcyA9PSAnICcpCi0gICAgICBpKys7Ci0gIGkrKzsKLSAgYXJndiA9IGFsbG9jYSAoc2l6ZW9mIChjaGFyICopICogKGkgKyAzKSk7Ci0gIGkgPSAwOwotICBhcmd2W2krK10gPSB3aGF0OwotICBzID0gYXJnczsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgd2hpbGUgKCpzID09ICcgJykKLQkrK3M7Ci0gICAgICBhcmd2W2krK10gPSBzOwotICAgICAgd2hpbGUgKCpzICE9ICcgJyAmJiAqcyAhPSAwKQotCXMrKzsKLSAgICAgIGlmICgqcyA9PSAwKQotCWJyZWFrOwotICAgICAgKnMrKyA9IDA7Ci0gICAgfQotICBhcmd2W2krK10gPSBOVUxMOwotCi0gIHBpZCA9IHBleGVjdXRlIChhcmd2WzBdLCAoY2hhciAqIGNvbnN0ICopIGFyZ3YsIHByb2dyYW1fbmFtZSwgdGVtcF9iYXNlLAotCQkgICZlcnJtc2dfZm10LCAmZXJybXNnX2FyZywgUEVYRUNVVEVfT05FIHwgUEVYRUNVVEVfU0VBUkNIKTsKLQotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIGluZm9ybSAoc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICAKLSAgICAgIGZhdGFsIChlcnJtc2dfZm10LCBlcnJtc2dfYXJnKTsKLSAgICB9Ci0KLSAgcGlkID0gcHdhaXQgKHBpZCwgJiB3YWl0X3N0YXR1cywgMCk7Ci0gIAotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmYXRhbCAoXygid2FpdDogJXMiKSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgfQotICBlbHNlIGlmIChXSUZTSUdOQUxFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmYXRhbCAoXygic3VicHJvY2VzcyBnb3QgZmF0YWwgc2lnbmFsICVkIiksIFdURVJNU0lHICh3YWl0X3N0YXR1cykpOwotICAgIH0KLSAgZWxzZSBpZiAoV0lGRVhJVEVEICh3YWl0X3N0YXR1cykpCi0gICAgewotICAgICAgaWYgKFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykgIT0gMCkKLQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCXdhcm4gKF8oIiVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiksCi0JICAgICAgd2hhdCwgV0VYSVRTVEFUVVMgKHdhaXRfc3RhdHVzKSk7Ci0gICAgfQotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci19Ci0KLS8qIExvb2sgZm9yIGEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cG9ydCBpbiB0aGUgLmRyZWN0dmUgc2VjdGlvbiBvZgotICAgQUJGRC4gIFBhc3MgZWFjaCBvbmUgdG8gZGVmX2V4cG9ydHMuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9kcmVjdHZlX3N5bWJvbHMgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXNlY3Rpb24gKiBzOwotICBpbnQgICAgICAgIHNpemU7Ci0gIGNoYXIgKiAgICAgYnVmOwotICBjaGFyICogICAgIHA7Ci0gIGNoYXIgKiAgICAgZTsKLQotICAvKiBMb29rIGZvciAuZHJlY3R2ZSdzICovCi0gIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgRFJFQ1RWRV9TRUNUSU9OX05BTUUpOwotICAKLSAgaWYgKHMgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gICAgICAKLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAocyk7Ci0gIGJ1ZiAgPSB4bWFsbG9jIChzaXplKTsKLQotICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHMsIGJ1ZiwgMCwgc2l6ZSk7Ci0gICAgICAKLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJTdWNraW5nIGluIGluZm8gZnJvbSAlcyBzZWN0aW9uIGluICVzXG4iKSwKLQkgIERSRUNUVkVfU0VDVElPTl9OQU1FLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgLyogU2VhcmNoIGZvciAtZXhwb3J0OiBzdHJpbmdzICovCi0gIHAgPSBidWY7Ci0gIGUgPSBidWYgKyBzaXplOwotICB3aGlsZSAocCA8IGUpCi0gICAgewotICAgICAgaWYgKHBbMF0gPT0gJy0nCi0JICAmJiBzdHJuY21wIChwLCAiLWV4cG9ydDoiLCA4KSA9PSAwKQotCXsKLQkgIGNoYXIgKiBuYW1lOwotCSAgY2hhciAqIGM7Ci0JICAKLQkgIHAgKz0gODsKLQkgIG5hbWUgPSBwOwotCSAgd2hpbGUgKHAgPCBlICYmICpwICE9ICcgJyAmJiAqcCAhPSAnLScpCi0JICAgIHArKzsKLQkgIGMgPSB4bWFsbG9jIChwIC0gbmFtZSArIDEpOwotCSAgbWVtY3B5IChjLCBuYW1lLCBwIC0gbmFtZSk7Ci0JICBjW3AgLSBuYW1lXSA9IDA7Ci0KLQkgIC8qIEZJWE1FOiBUaGUgNXRoIGFyZyBpcyBmb3IgdGhlIGBjb25zdGFudCcgZmllbGQuCi0JICAgICBXaGF0IHNob3VsZCBpdCBiZT8gIE5vdCB0aGF0IGl0IG1hdHRlcnMgc2luY2UgaXQncyBub3QKLQkgICAgIGN1cnJlbnRseSB1c2VmdWwuICAqLwotCSAgZGVmX2V4cG9ydHMgKGMsIDAsIC0xLCAwLCAwLCAwKTsKLQotCSAgaWYgKGFkZF9zdGRjYWxsX2FsaWFzICYmIHN0cmNociAoYywgJ0AnKSkKLQkgICAgewotCSAgICAgIGNoYXIgKmV4cG9ydGVkX25hbWUgPSB4c3RyZHVwIChjKTsKLQkgICAgICBjaGFyICphdHN5bSA9IHN0cmNociAoZXhwb3J0ZWRfbmFtZSwgJ0AnKTsKLQkgICAgICAqYXRzeW0gPSAnXDAnOwotCSAgICAgIGRlZl9leHBvcnRzIChleHBvcnRlZF9uYW1lLCB4c3RyZHVwIChjKSwgLTEsIDAsIDAsIDApOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXArKzsKLSAgICB9Ci0gIGZyZWUgKGJ1Zik7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCB0aGUgc3ltYm9scyBpbiBNSU5JU1lNUywgYW5kIGFkZCBlYWNoIG9uZSB0byBsaXN0IG9mCi0gICBzeW1ib2xzIHRvIGV4cG9ydC4gICovCi0KLXN0YXRpYyB2b2lkCi1zY2FuX2ZpbHRlcmVkX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBhc3ltYm9sICpzdG9yZTsKLSAgYmZkX2J5dGUgKmZyb20sICpmcm9tZW5kOwotCi0gIHN0b3JlID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgaWYgKHN0b3JlID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgZnJvbSA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudCAqIHNpemU7Ci0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bWJvbF9uYW1lOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGZhbHNlLCBmcm9tLCBzdG9yZSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0KLSAgICAgIHN5bWJvbF9uYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IHN5bWJvbF9uYW1lWzBdKQotCSsrc3ltYm9sX25hbWU7Ci0KLSAgICAgIGRlZl9leHBvcnRzICh4c3RyZHVwIChzeW1ib2xfbmFtZSkgLCAwLCAtMSwgMCwgMCwgMCk7Ci0KLSAgICAgIGlmIChhZGRfc3RkY2FsbF9hbGlhcyAmJiBzdHJjaHIgKHN5bWJvbF9uYW1lLCAnQCcpKQotICAgICAgICB7Ci0JICBjaGFyICpleHBvcnRlZF9uYW1lID0geHN0cmR1cCAoc3ltYm9sX25hbWUpOwotCSAgY2hhciAqYXRzeW0gPSBzdHJjaHIgKGV4cG9ydGVkX25hbWUsICdAJyk7Ci0JICAqYXRzeW0gPSAnXDAnOwotCSAgZGVmX2V4cG9ydHMgKGV4cG9ydGVkX25hbWUsIHhzdHJkdXAgKHN5bWJvbF9uYW1lKSwgLTEsIDAsIDAsIDApOwotCX0KLSAgICB9Ci19Ci0KLS8qIEFkZCBhIGxpc3Qgb2Ygc3ltYm9scyB0byBleGNsdWRlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9leGNsdWRlcyAobmV3X2V4Y2x1ZGVzKQotICAgICBjb25zdCBjaGFyICpuZXdfZXhjbHVkZXM7Ci17Ci0gIGNoYXIgKmxvY2FsX2NvcHk7Ci0gIGNoYXIgKmV4Y2x1ZGVfc3RyaW5nOwotCi0gIGxvY2FsX2NvcHkgPSB4c3RyZHVwIChuZXdfZXhjbHVkZXMpOwotCi0gIGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChsb2NhbF9jb3B5LCAiLDoiKTsKLSAgZm9yICg7IGV4Y2x1ZGVfc3RyaW5nOyBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAoTlVMTCwgIiw6IikpCi0gICAgewotICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpuZXdfZXhjbHVkZTsKLSAgICAgIAotICAgICAgbmV3X2V4Y2x1ZGUgPSAoKHN0cnVjdCBzdHJpbmdfbGlzdCAqKQotCQkgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ19saXN0KSkpOwotICAgICAgbmV3X2V4Y2x1ZGUtPnN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZXhjbHVkZV9zdHJpbmcpICsgMik7Ci0gICAgICAvKiBGSVhNRTogSXMgaXQgYWx3YXlzIHJpZ2h0IHRvIGFkZCBhIGxlYWRpbmcgdW5kZXJzY29yZT8gICovCi0gICAgICBzcHJpbnRmIChuZXdfZXhjbHVkZS0+c3RyaW5nLCAiXyVzIiwgZXhjbHVkZV9zdHJpbmcpOwotICAgICAgbmV3X2V4Y2x1ZGUtPm5leHQgPSBleGNsdWRlczsKLSAgICAgIGV4Y2x1ZGVzID0gbmV3X2V4Y2x1ZGU7Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBpbmZvcm0gKF8oIkV4Y2x1ZGluZyBzeW1ib2w6ICVzXG4iKSwgZXhjbHVkZV9zdHJpbmcpOwotICAgIH0KLQotICBmcmVlIChsb2NhbF9jb3B5KTsKLX0KLQotLyogU2VlIGlmIFNUUklORyBpcyBvbiB0aGUgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotbWF0Y2hfZXhjbHVkZSAoc3RyaW5nKQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqZXhjbF9pdGVtOwotCi0gIGZvciAoZXhjbF9pdGVtID0gZXhjbHVkZXM7IGV4Y2xfaXRlbTsgZXhjbF9pdGVtID0gZXhjbF9pdGVtLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHN0cmluZywgZXhjbF9pdGVtLT5zdHJpbmcpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgdGhlIGRlZmF1bHQgbGlzdCBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2RlZmF1bHRfZXhjbHVkZXMgKHZvaWQpCi17Ci0gIGFkZF9leGNsdWRlcyAoZGVmYXVsdF9leGNsdWRlcyk7Ci19Ci0KLS8qIENob29zZSB3aGljaCBzeW1ib2xzIHRvIGV4cG9ydC4gICovCi0KLXN0YXRpYyBsb25nCi1maWx0ZXJfc3ltYm9scyAoYWJmZCwgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGJmZF9ieXRlICpmcm9tLCAqZnJvbWVuZCwgKnRvOwotICBhc3ltYm9sICpzdG9yZTsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotICB0byA9IChiZmRfYnl0ZSAqKSBtaW5pc3ltczsKLQotICBmb3IgKDsgZnJvbSA8IGZyb21lbmQ7IGZyb20gKz0gc2l6ZSkKLSAgICB7Ci0gICAgICBpbnQga2VlcCA9IDA7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0KLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZmFsc2UsIChjb25zdCBQVFIpIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgLyogQ2hlY2sgZm9yIGV4dGVybmFsIGFuZCBkZWZpbmVkIG9ubHkgc3ltYm9scy4gICovCi0gICAgICBrZWVwID0gKCgoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkgICAgICAgfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpCi0JICAgICAgJiYgISBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikpOwotICAgICAgCi0gICAgICBrZWVwID0ga2VlcCAmJiAhIG1hdGNoX2V4Y2x1ZGUgKHN5bS0+bmFtZSk7Ci0KLSAgICAgIGlmIChrZWVwKQotCXsKLQkgIG1lbWNweSAodG8sIGZyb20sIHNpemUpOwotCSAgdG8gKz0gc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodG8gLSAoYmZkX2J5dGUgKikgbWluaXN5bXMpIC8gc2l6ZTsKLX0KLQotLyogRXhwb3J0IGFsbCBzeW1ib2xzIGluIEFCRkQsIGV4Y2VwdCBmb3Igb25lcyB3ZSB3ZXJlIHRvbGQgbm90IHRvCi0gICBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9hbGxfc3ltYm9scyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIHN5bWNvdW50OwotICBQVFIgbWluaXN5bXM7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotCi0gIC8qIElnbm9yZSBiZmRzIHdpdGggYW4gaW1wb3J0IGRlc2NyaXB0b3IgdGFibGUuICBXZSBhc3N1bWUgdGhhdCBhbnkKLSAgICAgc3VjaCBCRkQgY29udGFpbnMgc3ltYm9scyB3aGljaCBhcmUgZXhwb3J0ZWQgZnJvbSBhbm90aGVyIERMTCwKLSAgICAgYW5kIHdlIGRvbid0IHdhbnQgdG8gcmVleHBvcnQgdGhlbSBmcm9tIGhlcmUuICAqLwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuaWRhdGEkNCIpKQotICAgIHJldHVybjsKLQotICBpZiAoISAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEhBU19TWU1TKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgd2FybiAoXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gYmZkX3JlYWRfbWluaXN5bWJvbHMgKGFiZmQsIGZhbHNlLCAmbWluaXN5bXMsICZzaXplKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgd2FybiAoXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERpc2NhcmQgdGhlIHN5bWJvbHMgd2UgZG9uJ3Qgd2FudCB0byBleHBvcnQuICBJdCdzIE9LIHRvIGRvIHRoaXMKLSAgICAgaW4gcGxhY2U7IHdlJ2xsIGZyZWUgdGhlIHN0b3JhZ2UgYW55d2F5LiAgKi8KLQotICBzeW1jb3VudCA9IGZpbHRlcl9zeW1ib2xzIChhYmZkLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpOwotICBzY2FuX2ZpbHRlcmVkX3N5bWJvbHMgKGFiZmQsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSk7Ci0KLSAgZnJlZSAobWluaXN5bXMpOwotfQotCi0vKiBMb29rIGF0IHRoZSBvYmplY3QgZmlsZSB0byBkZWNpZGUgd2hpY2ggc3ltYm9scyB0byBleHBvcnQuICAqLwotCi1zdGF0aWMgdm9pZAotc2Nhbl9vcGVuX29ial9maWxlIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChleHBvcnRfYWxsX3N5bWJvbHMpCi0gICAgc2Nhbl9hbGxfc3ltYm9scyAoYWJmZCk7Ci0gIGVsc2UKLSAgICBzY2FuX2RyZWN0dmVfc3ltYm9scyAoYWJmZCk7Ci0gCi0gIC8qIEZJWE1FOiB3ZSBvdWdodCB0byByZWFkIGluIGFuZCBibG9jayBvdXQgdGhlIGJhc2UgcmVsb2NhdGlvbnMgKi8KLQotICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICBpbmZvcm0gKF8oIkRvbmUgcmVhZGluZyAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLX0KLQotc3RhdGljIHZvaWQKLXNjYW5fb2JqX2ZpbGUgKGZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgYmZkICogZiA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIDApOwotCi0gIGlmICghZikKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGZhdGFsIChfKCJVbmFibGUgdG8gb3BlbiBvYmplY3QgZmlsZTogJXMiKSwgZmlsZW5hbWUpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiU2Nhbm5pbmcgb2JqZWN0IGZpbGUgJXMiKSwgZmlsZW5hbWUpOwotICAKLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGYsIGJmZF9hcmNoaXZlKSkKLSAgICB7Ci0gICAgICBiZmQgKmFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYsIDApOwotICAgICAgd2hpbGUgKGFyZmlsZSkKLQl7Ci0JICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYXJmaWxlLCBiZmRfb2JqZWN0KSkKLQkgICAgc2Nhbl9vcGVuX29ial9maWxlIChhcmZpbGUpOwotCSAgYmZkX2Nsb3NlIChhcmZpbGUpOwotCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZiwgYXJmaWxlKTsKLQl9Ci0gICAgICAKLSNpZmRlZiBETExUT09MX01DT1JFX0VMRgotICAgICAgaWYgKG1jb3JlX2VsZl9vdXRfZmlsZSkKLQlpbmZvcm0gKF8oIkNhbm5vdCBwcm9kdWNlIG1jb3JlLWVsZiBkbGwgZnJvbSBhcmNoaXZlIGZpbGU6ICVzIiksIGZpbGVuYW1lKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZSBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZiwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgc2Nhbl9vcGVuX29ial9maWxlIChmKTsKLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gICAgICBpZiAobWNvcmVfZWxmX291dF9maWxlKQotCW1jb3JlX2VsZl9jYWNoZV9maWxlbmFtZSAoKGNoYXIgKikgZmlsZW5hbWUpOwotI2VuZGlmCi0gICAgfQotCi0gIGJmZF9jbG9zZSAoZik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9kZWZfaW5mbyAoZikKLSAgICAgRklMRSAqZjsKLXsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0gIGZwcmludGYgKGYsICIlcyAiLCBBU01fQyk7Ci0gIGZvciAoaSA9IDA7IG9hdltpXTsgaSsrKQotICAgIGZwcmludGYgKGYsICIlcyAiLCBvYXZbaV0pOwotICBmcHJpbnRmIChmLCAiXG4iKTsKLSAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICIlcyAgJWQgPSAlcyAlcyBAICVkICVzJXMlc1xuIiwKLQkgICAgICAgQVNNX0MsCi0JICAgICAgIGksCi0JICAgICAgIGV4cC0+bmFtZSwKLQkgICAgICAgZXhwLT5pbnRlcm5hbF9uYW1lLAotCSAgICAgICBleHAtPm9yZGluYWwsCi0JICAgICAgIGV4cC0+bm9uYW1lID8gIk5PTkFNRSAiIDogIiIsCi0JICAgICAgIGV4cC0+Y29uc3RhbnQgPyAiQ09OU1RBTlQiIDogIiIsCi0JICAgICAgIGV4cC0+ZGF0YSA/ICJEQVRBIiA6ICIiKTsKLSAgICB9Ci19Ci0KLS8qIEdlbmVyYXRlIHRoZSAuZXhwIGZpbGUgKi8KLQotc3RhdGljIGludAotc2Z1bmMgKGEsIGIpCi0gICAgIGNvbnN0IHZvaWQgKmE7Ci0gICAgIGNvbnN0IHZvaWQgKmI7Ci17Ci0gIHJldHVybiAqKGNvbnN0IGxvbmcgKikgYSAtICooY29uc3QgbG9uZyAqKSBiOwotfQotCi1zdGF0aWMgdm9pZAotZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKQotICAgICBGSUxFICpmOwotICAgICBsb25nICpuZWVkOwotICAgICBpbnQgcGFnZV9hZGRyOwotICAgICBpbnQgb25fcGFnZTsKLXsKLSAgaW50IGk7Ci0KLSAgLyogRmx1c2ggdGhpcyBwYWdlICovCi0gIGZwcmludGYgKGYsICJcdCVzXHQweCUwOHhcdCVzIFN0YXJ0aW5nIFJWQSBmb3IgY2h1bmtcbiIsCi0JICAgQVNNX0xPTkcsCi0JICAgcGFnZV9hZGRyLAotCSAgIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JXhcdCVzIFNpemUgb2YgYmxvY2tcbiIsCi0JICAgQVNNX0xPTkcsCi0JICAgKG9uX3BhZ2UgKiAyKSArIChvbl9wYWdlICYgMSkgKiAyICsgOCwKLQkgICBBU01fQyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBvbl9wYWdlOyBpKyspCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JWx4XG4iLCBBU01fU0hPUlQsIChuZWVkW2ldIC0gcGFnZV9hZGRyKSB8IDB4MzAwMCk7Ci0gICAgfQotICAvKiBBbmQgcGFkZGluZyAqLwotICBpZiAob25fcGFnZSAmIDEpCi0gICAgZnByaW50ZiAoZiwgIlx0JXNcdDB4JXhcbiIsIEFTTV9TSE9SVCwgMCB8IDB4MDAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZGVmX2ZpbGUgKCkKLXsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0KLSAgaW5mb3JtIChfKCJBZGRpbmcgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIpKTsKLSAgCi0gIGZwcmludGYgKG91dHB1dF9kZWYsICI7Iik7Ci0gIGZvciAoaSA9IDA7IG9hdltpXTsgaSsrKQotICAgIGZwcmludGYgKG91dHB1dF9kZWYsICIgJXMiLCBvYXZbaV0pOwotCi0gIGZwcmludGYgKG91dHB1dF9kZWYsICJcbkVYUE9SVFNcbiIpOwotCi0gIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyICpxdW90ZSA9IHN0cmNociAoZXhwLT5uYW1lLCAnLicpID8gIlwiIiA6ICIiOwotICAgICAgY2hhciAqcmVzID0gY3BsdXNfZGVtYW5nbGUgKGV4cC0+aW50ZXJuYWxfbmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotCi0gICAgICBpZiAoc3RyY21wIChleHAtPm5hbWUsIGV4cC0+aW50ZXJuYWxfbmFtZSkgPT0gMCkKLSAgICAgICAgewotCi0JICBmcHJpbnRmIChvdXRwdXRfZGVmLCAiXHQlcyVzJXMgQCAlZCVzJXMgOyAlc1xuIiwKLQkJICAgcXVvdGUsCi0JCSAgIGV4cC0+bmFtZSwKLQkJICAgcXVvdGUsCi0JCSAgIGV4cC0+b3JkaW5hbCwKLQkJICAgZXhwLT5ub25hbWUgPyAiIE5PTkFNRSIgOiAiIiwKLQkJICAgZXhwLT5kYXRhID8gIiBEQVRBIiA6ICIiLAotCQkgICByZXMgPyByZXMgOiAiIik7Ci0JfQotICAgICAgZWxzZSAKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKnF1b3RlMSA9IHN0cmNociAoZXhwLT5pbnRlcm5hbF9uYW1lLCAnLicpID8gIlwiIiA6ICIiOwotCSAgLyogY2hhciAqYWxpYXMgPSAgKi8KLQkgIGZwcmludGYgKG91dHB1dF9kZWYsICJcdCVzJXMlcyA9ICVzJXMlcyBAICVkJXMlcyA7ICVzXG4iLAotCQkgICBxdW90ZSwKLQkJICAgZXhwLT5uYW1lLAotCQkgICBxdW90ZSwKLQkJICAgcXVvdGUxLAotCQkgICBleHAtPmludGVybmFsX25hbWUsCi0JCSAgIHF1b3RlMSwKLQkJICAgZXhwLT5vcmRpbmFsLAotCQkgICBleHAtPm5vbmFtZSA/ICIgTk9OQU1FIiA6ICIiLAotCQkgICBleHAtPmRhdGEgPyAiIERBVEEiIDogIiIsCi0JCSAgIHJlcyA/IHJlcyA6ICIiKTsKLQl9Ci0gICAgICBpZiAocmVzKQotICAgICAgICBmcmVlIChyZXMpOwotICAgIH0KLSAgCi0gIGluZm9ybSAoXygiQWRkZWQgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIpKTsKLX0KLQotLyogZ2VuZXJhdGVfaWRhdGFfb2ZpbGUgZ2VuZXJhdGVzIHRoZSBwb3J0YWJsZSBhc3NlbWJseSBzb3VyY2UgY29kZQotICAgZm9yIHRoZSBpZGF0YSBzZWN0aW9ucy4gIEl0IGFwcGVuZHMgdGhlIHNvdXJjZSBjb2RlIHRvIHRoZSBlbmQgb2YKLSAgIHRoZSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2lkYXRhX29maWxlIChmaWx2YXIpCi0gICAgIEZJTEUgKmZpbHZhcjsKLXsKLSAgaWhlYWR0eXBlICpoZWFkcHRyOwotICBpZnVuY3R5cGUgKmZ1bmNwdHI7Ci0gIGludCAgICAgICAgaGVhZGluZGV4OwotICBpbnQgICAgICAgIGZ1bmNpbmRleDsKLSAgaW50CSAgICAgbmhlYWRzOwotCi0gIGlmIChpbXBvcnRfbGlzdCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmcHJpbnRmIChmaWx2YXIsICIlcyBJbXBvcnQgZGF0YSBzZWN0aW9uc1xuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQyXG4iKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0ZG9pX2lkYXRhXG4iLCBBU01fR0xPQkFMKTsKLSAgZnByaW50ZiAoZmlsdmFyLCAiZG9pX2lkYXRhOlxuIik7Ci0KLSAgbmhlYWRzID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc2xpc3RvbmUlZCVzXHQlcyAlc1xuIiwKLQkgICAgICAgQVNNX1JWQV9CRUZPUkUsIG5oZWFkcywgQVNNX1JWQV9BRlRFUiwKLQkgICAgICAgQVNNX0MsIGhlYWRwdHItPmRsbG5hbWUpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc2RsbG5hbWUlZCVzXG4iLAotCSAgICAgICBBU01fUlZBX0JFRk9SRSwgbmhlYWRzLCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgIlx0JXNsaXN0dHdvJWQlc1xuXG4iLAotCSAgICAgICBBU01fUlZBX0JFRk9SRSwgbmhlYWRzLCBBU01fUlZBX0FGVEVSKTsKLSAgICAgIG5oZWFkcysrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7IC8qIE5VTEwgcmVjb3JkIGF0ICovCi0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogZW5kIG9mIGlkYXRhJDIgKi8KLSAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBzZWN0aW9uICAgICAgICAqLwotICBmcHJpbnRmIChmaWx2YXIsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gIGZwcmludGYgKGZpbHZhciwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ0XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsdmFyLCAibGlzdG9uZSVkOlxuIiwgaGVhZGluZGV4KTsKLSAgICAgIGZvciAoIGZ1bmNpbmRleCA9IDA7IGZ1bmNpbmRleCA8IGhlYWRwdHItPm5mdW5jczsgZnVuY2luZGV4KysgKQotCWZwcmludGYgKGZpbHZhciwgIlx0JXNmdW5jcHRyJWRfJWQlc1xuIiwKLQkJIEFTTV9SVkFfQkVGT1JFLCBoZWFkaW5kZXgsIGZ1bmNpbmRleCwgQVNNX1JWQV9BRlRFUik7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsgLyogTlVMTCB0ZXJtaW5hdGluZyBsaXN0ICovCi0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZmlsdmFyLCAiXG5cdC5zZWN0aW9uXHQuaWRhdGEkNVxuIik7Ci0gIGhlYWRpbmRleCA9IDA7Ci0gIGZvciAoaGVhZHB0ciA9IGltcG9ydF9saXN0OyBoZWFkcHRyICE9IE5VTEw7IGhlYWRwdHIgPSBoZWFkcHRyLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbHZhciwgImxpc3R0d28lZDpcbiIsIGhlYWRpbmRleCk7Ci0gICAgICBmb3IgKCBmdW5jaW5kZXggPSAwOyBmdW5jaW5kZXggPCBoZWFkcHRyLT5uZnVuY3M7IGZ1bmNpbmRleCsrICkKLQlmcHJpbnRmIChmaWx2YXIsICJcdCVzZnVuY3B0ciVkXyVkJXNcbiIsCi0JCSBBU01fUlZBX0JFRk9SRSwgaGVhZGluZGV4LCBmdW5jaW5kZXgsIEFTTV9SVkFfQUZURVIpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOyAvKiBOVUxMIHRlcm1pbmF0aW5nIGxpc3QgKi8KLSAgICAgIGhlYWRpbmRleCsrOwotICAgIH0KLQotICBmcHJpbnRmIChmaWx2YXIsICJcblx0LnNlY3Rpb25cdC5pZGF0YSQ2XG4iKTsKLSAgaGVhZGluZGV4ID0gMDsKLSAgZm9yIChoZWFkcHRyID0gaW1wb3J0X2xpc3Q7IGhlYWRwdHIgIT0gTlVMTDsgaGVhZHB0ciA9IGhlYWRwdHItPm5leHQpCi0gICAgewotICAgICAgZnVuY2luZGV4ID0gMDsKLSAgICAgIGZvciAoZnVuY3B0ciA9IGhlYWRwdHItPmZ1bmNoZWFkOyBmdW5jcHRyICE9IE5VTEw7Ci0JICAgZnVuY3B0ciA9IGZ1bmNwdHItPm5leHQpCi0JewotCSAgZnByaW50ZiAoZmlsdmFyLCJmdW5jcHRyJWRfJWQ6XG4iLCBoZWFkaW5kZXgsIGZ1bmNpbmRleCk7Ci0JICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdCVkXG4iLCBBU01fU0hPUlQsCi0JCSAgICgoZnVuY3B0ci0+b3JkKSAmIDB4RkZGRikpOwotCSAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHRcIiVzXCJcbiIsIEFTTV9URVhULCBmdW5jcHRyLT5uYW1lKTsKLQkgIGZwcmludGYgKGZpbHZhciwiXHQlc1x0MFxuIiwgQVNNX0JZVEUpOwotCSAgZnVuY2luZGV4Kys7Ci0JfQotICAgICAgaGVhZGluZGV4Kys7Ci0gICAgfQotCi0gIGZwcmludGYgKGZpbHZhciwgIlxuXHQuc2VjdGlvblx0LmlkYXRhJDdcbiIpOwotICBoZWFkaW5kZXggPSAwOwotICBmb3IgKGhlYWRwdHIgPSBpbXBvcnRfbGlzdDsgaGVhZHB0ciAhPSBOVUxMOyBoZWFkcHRyID0gaGVhZHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsImRsbG5hbWUlZDpcbiIsIGhlYWRpbmRleCk7Ci0gICAgICBmcHJpbnRmIChmaWx2YXIsIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIGhlYWRwdHItPmRsbG5hbWUpOwotICAgICAgZnByaW50ZiAoZmlsdmFyLCJcdCVzXHQwXG4iLCBBU01fQllURSk7Ci0gICAgICBoZWFkaW5kZXgrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZXhwX2ZpbGUgKCkKLXsKLSAgRklMRSAqZjsKLSAgaW50IGk7Ci0gIGV4cG9ydF90eXBlICpleHA7Ci0gIGRsaXN0X3R5cGUgKmRsOwotICBjaGFyICpjbWQ7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJHZW5lcmF0aW5nIGV4cG9ydCBmaWxlOiAlc1xuIiksIGV4cF9uYW1lKTsKLSAgCi0gIGYgPSBmb3BlbiAoVE1QX0FTTSwgRk9QRU5fV1QpOwotICBpZiAoIWYpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiVW5hYmxlIHRvIG9wZW4gdGVtcG9yYXJ5IGFzc2VtYmxlciBmaWxlOiAlcyIpLCBUTVBfQVNNKTsKLSAgCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiT3BlbmVkIHRlbXBvcmFyeSBmaWxlOiAlcyIpLCBUTVBfQVNNKTsKLQotICBkdW1wX2RlZl9pbmZvIChmKTsKLSAgCi0gIGlmIChkX2V4cG9ydHMpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmVkYXRhXG5cbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXMJMAklcyBBbGx3YXlzIDBcbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwkweCVseAklcyBUaW1lIGFuZCBkYXRlXG4iLCBBU01fTE9ORywgKGxvbmcpIHRpbWUoMCksCi0JICAgICAgIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzCTAJJXMgTWFqb3IgYW5kIE1pbm9yIHZlcnNpb25cbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc25hbWUlcwklcyBQdHIgdG8gbmFtZSBvZiBkbGxcbiIsIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBTdGFydGluZyBvcmRpbmFsIG9mIGV4cG9ydHNcbiIsIEFTTV9MT05HLCBkX2xvd19vcmQsIEFTTV9DKTsKLQotCi0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBOdW1iZXIgb2YgZnVuY3Rpb25zXG4iLCBBU01fTE9ORywgZF9oaWdoX29yZCAtIGRfbG93X29yZCArIDEsIEFTTV9DKTsKLSAgICAgIGZwcmludGYoZiwiXHQlcyBuYW1lZCBmdW5jcyAlZCwgbG93IG9yZCAlZCwgaGlnaCBvcmQgJWRcbiIsCi0JICAgICAgQVNNX0MsCi0JICAgICAgZF9uYW1lZF9uZnVuY3MsIGRfbG93X29yZCwgZF9oaWdoX29yZCk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlcwklZAklcyBOdW1iZXIgb2YgbmFtZXNcbiIsIEFTTV9MT05HLAotCSAgICAgICBzaG93X2FsbG5hbWVzID8gZF9oaWdoX29yZCAtIGRfbG93X29yZCArIDEgOiBkX25hbWVkX25mdW5jcywgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNhZnVuY3MlcyAgJXMgQWRkcmVzcyBvZiBmdW5jdGlvbnNcbiIsIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzYW5hbWVzJXMJJXMgQWRkcmVzcyBvZiBOYW1lIFBvaW50ZXIgVGFibGVcbiIsCi0JICAgICAgIEFTTV9SVkFfQkVGT1JFLCBBU01fUlZBX0FGVEVSLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzYW5vcmRzJXMJJXMgQWRkcmVzcyBvZiBvcmRpbmFsc1xuIiwgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICAgICAgZnByaW50ZiAoZiwgIm5hbWU6CSVzCVwiJXNcIlxuIiwgQVNNX1RFWFQsIGRsbF9uYW1lKTsKLQotCi0gICAgICBmcHJpbnRmKGYsIiVzIEV4cG9ydCBhZGRyZXNzIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmKGYsIlx0JXNcbiIsIEFTTV9BTElHTl9MT05HKTsKLSAgICAgIGZwcmludGYgKGYsICJhZnVuY3M6XG4iKTsKLSAgICAgIGkgPSBkX2xvd19vcmQ7Ci0KLSAgICAgIGZvciAoZXhwID0gZF9leHBvcnRzOyBleHA7IGV4cCA9IGV4cC0+bmV4dCkKLQl7Ci0JICBpZiAoZXhwLT5vcmRpbmFsICE9IGkpCi0JICAgIHsKLSNpZiAwCi0JICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdCVkXHQlcyAlZC4uJWQgbWlzc2luZ1xuIiwKLQkJICAgICAgIEFTTV9TUEFDRSwKLQkJICAgICAgIChleHAtPm9yZGluYWwgLSBpKSAqIDQsCi0JCSAgICAgICBBU01fQywKLQkJICAgICAgIGksIGV4cC0+b3JkaW5hbCAtIDEpOwotCSAgICAgIGkgPSBleHAtPm9yZGluYWw7Ci0jZW5kaWYKLQkgICAgICB3aGlsZSAoaSA8IGV4cC0+b3JkaW5hbCkKLQkJewotCQkgIGZwcmludGYoZiwiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotCQkgIGkrKzsKLQkJfQotCSAgICB9Ci0JICBmcHJpbnRmIChmLCAiXHQlcyVzJXMlc1x0JXMgJWRcbiIsIEFTTV9SVkFfQkVGT1JFLAotICAgICAgICAgICAgICAgICAgIEFTTV9QUkVGSVgsCi0gICAgICAgICAgICAgICAgICAgZXhwLT5pbnRlcm5hbF9uYW1lLCBBU01fUlZBX0FGVEVSLCBBU01fQywgZXhwLT5vcmRpbmFsKTsKLQkgIGkrKzsKLQl9Ci0KLSAgICAgIGZwcmludGYgKGYsIiVzIEV4cG9ydCBOYW1lIFBvaW50ZXIgVGFibGVcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJhbmFtZXM6XG4iKTsKLQotICAgICAgZm9yIChpID0gMDsgKGV4cCA9IGRfZXhwb3J0c19sZXhpY2FsbHlbaV0pOyBpKyspCi0JewotCSAgaWYgKCFleHAtPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCSAgICBmcHJpbnRmIChmLCAiXHQlc24lZCVzXG4iLAotCQkgICAgIEFTTV9SVkFfQkVGT1JFLCBleHAtPm9yZGluYWwsIEFTTV9SVkFfQUZURVIpOwotCX0KLQotICAgICAgZnByaW50ZiAoZiwiJXMgRXhwb3J0IE9yaWRpbmFsIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmcHJpbnRmIChmLCAiYW5vcmRzOlxuIik7Ci0gICAgICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLQl7Ci0JICBpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICAgIGZwcmludGYgKGYsICJcdCVzCSVkXG4iLCBBU01fU0hPUlQsIGV4cC0+b3JkaW5hbCAtIGRfbG93X29yZCk7Ci0JfQotCi0gICAgICBmcHJpbnRmKGYsIiVzIEV4cG9ydCBOYW1lIFRhYmxlXG4iLCBBU01fQyk7Ci0gICAgICBmb3IgKGkgPSAwOyAoZXhwID0gZF9leHBvcnRzX2xleGljYWxseVtpXSk7IGkrKykKLQlpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICBmcHJpbnRmIChmLCAibiVkOgklcwlcIiVzXCJcbiIsCi0JCSAgIGV4cC0+b3JkaW5hbCwgQVNNX1RFWFQsIGV4cC0+bmFtZSk7Ci0KLSAgICAgIGlmIChhX2xpc3QpCi0JewotCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24gJXNcbiIsIERSRUNUVkVfU0VDVElPTl9OQU1FKTsKLQkgIGZvciAoZGwgPSBhX2xpc3Q7IGRsOyBkbCA9IGRsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIGRsLT50ZXh0KTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgaWYgKGRfbGlzdCkKLQl7Ci0JICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbiAucmRhdGFcbiIpOwotCSAgZm9yIChkbCA9IGRfbGlzdDsgZGw7IGRsID0gZGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBjaGFyICpwOwotCSAgICAgIGludCBsOwotCSAgICAgIC8qIFdlIGRvbnQgb3V0cHV0IGFzIGFzY2lpICdjYXVzZSB0aGVyZSBjYW4KLQkgICAgICAgICBiZSBxdW90ZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgKi8KLQotCSAgICAgIGwgPSAwOwotCSAgICAgIGZvciAocCA9IGRsLT50ZXh0OyAqcDsgcCsrKQotCQl7Ci0JCSAgaWYgKGwgPT0gMCkKLQkJICAgIGZwcmludGYgKGYsICJcdCVzXHQiLCBBU01fQllURSk7Ci0JCSAgZWxzZQotCQkgICAgZnByaW50ZiAoZiwgIiwiKTsKLQkJICBmcHJpbnRmIChmLCAiJWQiLCAqcCk7Ci0JCSAgaWYgKHBbMV0gPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZiwgIiwwXG4iKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgaWYgKCsrbCA9PSAxMCkKLQkJICAgIHsKLQkJICAgICAgZnByaW50ZiAoZiwgIlxuIik7Ci0JCSAgICAgIGwgPSAwOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0KLSAgLyogQWRkIHRvIHRoZSBvdXRwdXQgZmlsZSBhIHdheSBvZiBnZXR0aW5nIHRvIHRoZSBleHBvcnRlZCBuYW1lcwotICAgICB3aXRob3V0IHVzaW5nIHRoZSBpbXBvcnQgbGlicmFyeS4gKi8KLSAgaWYgKGFkZF9pbmRpcmVjdCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LnJkYXRhXG4iKTsKLSAgICAgIGZvciAoaSA9IDAsIGV4cCA9IGRfZXhwb3J0czsgZXhwOyBpKyssIGV4cCA9IGV4cC0+bmV4dCkKLQlpZiAoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JICB7Ci0JICAgIC8qIFdlIHVzZSBhIHNpbmdsZSB1bmRlcnNjb3JlIGZvciBNUyBjb21wYXRpYmlsaXR5LCBhbmQgYQotICAgICAgICAgICAgICAgZG91YmxlIHVuZGVyc2NvcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQKLSAgICAgICAgICAgICAgIGN5Z3dpbiByZWxlYXNlcy4gICovCi0JICAgIGZwcmludGYgKGYsICJcdCVzXHRfX2ltcF8lc1xuIiwgQVNNX0dMT0JBTCwgZXhwLT5uYW1lKTsKLQkgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9pbXBfXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotCSAgICBmcHJpbnRmIChmLCAiX19pbXBfJXM6XG4iLCBleHAtPm5hbWUpOwotCSAgICBmcHJpbnRmIChmLCAiX2ltcF9fJXM6XG4iLCBleHAtPm5hbWUpOwotCSAgICBmcHJpbnRmIChmLCAiXHQlc1x0JXNcbiIsIEFTTV9MT05HLCBleHAtPm5hbWUpOwotCSAgfQotICAgIH0KLQotICAvKiBEdW1wIHRoZSByZWxvYyBzZWN0aW9uIGlmIGEgYmFzZSBmaWxlIGlzIHByb3ZpZGVkICovCi0gIGlmIChiYXNlX2ZpbGUpCi0gICAgewotICAgICAgaW50IGFkZHI7Ci0gICAgICBsb25nIG5lZWRbUEFHRV9TSVpFXTsKLSAgICAgIGxvbmcgcGFnZV9hZGRyOwotICAgICAgaW50IG51bWJ5dGVzOwotICAgICAgaW50IG51bV9lbnRyaWVzOwotICAgICAgbG9uZyAqY29weTsKLSAgICAgIGludCBqOwotICAgICAgaW50IG9uX3BhZ2U7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvblx0LmluaXRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgImxhYjpcbiIpOwotCi0gICAgICBmc2VlayAoYmFzZV9maWxlLCAwLCBTRUVLX0VORCk7Ci0gICAgICBudW1ieXRlcyA9IGZ0ZWxsIChiYXNlX2ZpbGUpOwotICAgICAgZnNlZWsgKGJhc2VfZmlsZSwgMCwgU0VFS19TRVQpOwotICAgICAgY29weSA9IHhtYWxsb2MgKG51bWJ5dGVzKTsKLSAgICAgIGZyZWFkIChjb3B5LCAxLCBudW1ieXRlcywgYmFzZV9maWxlKTsKLSAgICAgIG51bV9lbnRyaWVzID0gbnVtYnl0ZXMgLyBzaXplb2YgKGxvbmcpOwotCi0KLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQucmVsb2NcbiIpOwotICAgICAgaWYgKG51bV9lbnRyaWVzKQotCXsKLQkgIGludCBzcmM7Ci0JICBpbnQgZHN0ID0gMDsKLQkgIGludCBsYXN0ID0gLTE7Ci0JICBxc29ydCAoY29weSwgbnVtX2VudHJpZXMsIHNpemVvZiAobG9uZyksIHNmdW5jKTsKLQkgIC8qIERlbGV0ZSBkdXBsY2F0ZXMgKi8KLQkgIGZvciAoc3JjID0gMDsgc3JjIDwgbnVtX2VudHJpZXM7IHNyYysrKQotCSAgICB7Ci0JICAgICAgaWYgKGxhc3QgIT0gY29weVtzcmNdKQotCQlsYXN0ID0gY29weVtkc3QrK10gPSBjb3B5W3NyY107Ci0JICAgIH0KLQkgIG51bV9lbnRyaWVzID0gZHN0OwotCSAgYWRkciA9IGNvcHlbMF07Ci0JICBwYWdlX2FkZHIgPSBhZGRyICYgUEFHRV9NQVNLOwkJLyogd29yayBvdXQgdGhlIHBhZ2UgYWRkciAqLwotCSAgb25fcGFnZSA9IDA7Ci0JICBmb3IgKGogPSAwOyBqIDwgbnVtX2VudHJpZXM7IGorKykKLQkgICAgewotCSAgICAgIGFkZHIgPSBjb3B5W2pdOwotCSAgICAgIGlmICgoYWRkciAmIFBBR0VfTUFTSykgIT0gcGFnZV9hZGRyKQotCQl7Ci0JCSAgZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKTsKLQkJICBvbl9wYWdlID0gMDsKLQkJICBwYWdlX2FkZHIgPSBhZGRyICYgUEFHRV9NQVNLOwotCQl9Ci0JICAgICAgbmVlZFtvbl9wYWdlKytdID0gYWRkcjsKLQkgICAgfQotCSAgZmx1c2hfcGFnZSAoZiwgbmVlZCwgcGFnZV9hZGRyLCBvbl9wYWdlKTsKLQotLyoJICBmcHJpbnRmIChmLCAiXHQlc1x0MCwwXHQlcyBFbmRcbiIsIEFTTV9MT05HLCBBU01fQyk7Ki8KLQl9Ci0gICAgfQotCi0gIGdlbmVyYXRlX2lkYXRhX29maWxlIChmKTsKLQotICBmY2xvc2UgKGYpOwotCi0gIC8qIGFzc2VtYmxlIHRoZSBmaWxlICovCi0gIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChhc19mbGFncykgKyBzdHJsZW4gKGV4cF9uYW1lKQotCQkJICsgc2l6ZW9mIFRNUF9BU00gKyA1MCk7Ci0gIHNwcmludGYgKGNtZCwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIGV4cF9uYW1lLCBUTVBfQVNNKTsKLQotI2lmZGVmIERMTFRPT0xfQVJNCi0gIGlmIChtYWNoaW5lID09IE1BUk1fSU5URVJXT1JLIHx8IG1hY2hpbmUgPT0gTVRIVU1CKQotICAgIHN0cmNhdCAoY21kLCAiIC1tdGh1bWItaW50ZXJ3b3JrIik7Ci0jZW5kaWYKLQotICBydW4gKGFzX25hbWUsIGNtZCk7Ci0KLSAgaWYgKGRvbnRkZWx0ZW1wcyA9PSAwKQotICAgIHVubGluayAoVE1QX0FTTSk7Ci0gIAotICBpbmZvcm0gKF8oIkdlbmVyYXRlZCBleHBvcnRzIGZpbGUiKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXhsYXRlIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpZiAoYWRkX3VuZGVyc2NvcmUpCi0gICAgewotICAgICAgY2hhciAqY29weSA9IHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAyKTsKLSAgICAgIGNvcHlbMF0gPSAnXyc7Ci0gICAgICBzdHJjcHkgKGNvcHkgKyAxLCBuYW1lKTsKLSAgICAgIG5hbWUgPSBjb3B5OwotICAgIH0KLQotICBpZiAoa2lsbGF0KQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBwID0gc3RyY2hyIChuYW1lLCAnQCcpOwotICAgICAgaWYgKHApCi0JKnAgPSAwOwotICAgIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgMAotCi1zdGF0aWMgdm9pZAotZHVtcF9pYXQgKGYsIGV4cCkKLSAgICAgRklMRSAqZjsKLSAgICAgZXhwb3J0X3R5cGUgKmV4cDsKLXsKLSAgaWYgKGV4cC0+bm9uYW1lICYmICFzaG93X2FsbG5hbWVzICkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MHglMDh4XG4iLAotCSAgICAgICBBU01fTE9ORywKLQkgICAgICAgZXhwLT5vcmRpbmFsIHwgMHg4MDAwMDAwMCk7IC8qIGhpbnQgb3Igb3JpbmRhbCA/PyAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzSUQlZCVzXG4iLCBBU01fUlZBX0JFRk9SRSwKLQkgICAgICAgZXhwLT5vcmRpbmFsLAotCSAgICAgICBBU01fUlZBX0FGVEVSKTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdAotewotICBpbnQgaWQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGludCBmbGFnczsKLSAgaW50IGFsaWduOwotICBhc2VjdGlvbiAqc2VjOwotICBhc3ltYm9sICpzeW07Ci0gIGFzeW1ib2wgKipzeW1wcDsKLSAgaW50IHNpemU7Ci0gIHVuc2lnbmVkICAgY2hhciAqZGF0YTsKLX0gc2luZm87Ci0KLSNpZm5kZWYgRExMVE9PTF9QUEMKLQotI2RlZmluZSBURVhUIDAKLSNkZWZpbmUgREFUQSAxCi0jZGVmaW5lIEJTUyAyCi0jZGVmaW5lIElEQVRBNyAzCi0jZGVmaW5lIElEQVRBNSA0Ci0jZGVmaW5lIElEQVRBNCA1Ci0jZGVmaW5lIElEQVRBNiA2Ci0KLSNkZWZpbmUgTlNFQ1MgNwotCi1zdGF0aWMgc2luZm8gc2VjZGF0YVtOU0VDU10gPQotewotICB7IFRFWFQsICAgIi50ZXh0IiwgICAgU0VDX0NPREUgfCBTRUNfSEFTX0NPTlRFTlRTLCAyfSwKLSAgeyBEQVRBLCAgICIuZGF0YSIsICAgIFNFQ19EQVRBLCAgICAgICAgICAgICAgICAgICAgMn0sCi0gIHsgQlNTLCAgICAiLmJzcyIsICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNywgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTUsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNiwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAxfQotfTsKLQotI2Vsc2UKLQotLyogU2VjdGlvbnMgbnVtYmVyZWQgdG8gbWFrZSB0aGUgb3JkZXIgdGhlIHNhbWUgYXMgb3RoZXIgUG93ZXJQQyBOVCAgICAqLwotLyogY29tcGlsZXJzLiBUaGlzIGFsc28ga2VlcHMgZnVubnkgYWxpZ25tZW50IHRoaW5naWVzIGZyb20gaGFwcGVuaW5nLiAqLwotI2RlZmluZSBURVhUICAgMAotI2RlZmluZSBQREFUQSAgMQotI2RlZmluZSBSREFUQSAgMgotI2RlZmluZSBJREFUQTUgMwotI2RlZmluZSBJREFUQTQgNAotI2RlZmluZSBJREFUQTYgNQotI2RlZmluZSBJREFUQTcgNgotI2RlZmluZSBEQVRBICAgNwotI2RlZmluZSBCU1MgICAgOAotCi0jZGVmaW5lIE5TRUNTIDkKLQotc3RhdGljIHNpbmZvIHNlY2RhdGFbTlNFQ1NdID0KLXsKLSAgeyBURVhULCAgICIudGV4dCIsICAgIFNFQ19DT0RFIHwgU0VDX0hBU19DT05URU5UUywgM30sCi0gIHsgUERBVEEsICAiLnBkYXRhIiwgICBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IFJEQVRBLCAgIi5yZWxkYXRhIiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAyfSwKLSAgeyBJREFUQTUsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgSURBVEE0LCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAgICAgICAgICAgIDJ9LAotICB7IElEQVRBNiwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgICAgICAgICAgICAxfSwKLSAgeyBJREFUQTcsICIuaWRhdGEkNyIsIFNFQ19IQVNfQ09OVEVOVFMsICAgICAgICAgICAgMn0sCi0gIHsgREFUQSwgICAiLmRhdGEiLCAgICBTRUNfREFUQSwgICAgICAgICAgICAgICAgICAgIDJ9LAotICB7IEJTUywgICAgIi5ic3MiLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAyfQotfTsKLQotI2VuZGlmCi0KLS8qCi1UaGlzIGlzIHdoYXQgd2UncmUgdHJ5aW5nIHRvIG1ha2UuICBXZSBnZW5lcmF0ZSB0aGUgaW1wIHN5bWJvbHMgd2l0aAotYm90aCBzaW5nbGUgYW5kIGRvdWJsZSB1bmRlcnNjb3JlcywgZm9yIGNvbXBhdGliaWxpdHkuCi0KLQkudGV4dAotCS5nbG9iYWwJX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLQkuZ2xvYmFsCV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLV9HZXRGaWxlVmVyc2lvbkluZm9TaXplV0A4OgotCWptcCAqCV9faW1wX0dldEZpbGVWZXJzaW9uSW5mb1NpemVXQDgKLQkuc2VjdGlvbgkuaWRhdGEkNwkjIFRvIGZvcmNlIGxvYWRpbmcgb2YgaGVhZAotCS5sb25nCV9fdmVyc2lvbl9hX2hlYWQKLSMgSW1wb3J0IEFkZHJlc3MgVGFibGUKLQkuc2VjdGlvbgkuaWRhdGEkNQotX19pbXBfR2V0RmlsZVZlcnNpb25JbmZvU2l6ZVdAODoKLQkucnZhCUlEMgotCi0jIEltcG9ydCBMb29rdXAgVGFibGUKLQkuc2VjdGlvbgkuaWRhdGEkNAotCS5ydmEJSUQyCi0jIEhpbnQvTmFtZSB0YWJsZQotCS5zZWN0aW9uCS5pZGF0YSQ2Ci1JRDI6CS5zaG9ydAkyCi0JLmFzY2l6CSJHZXRGaWxlVmVyc2lvbkluZm9TaXplVyIKLQotCi1Gb3IgdGhlIFBvd2VyUEMsIGhlcmUncyB0aGUgdmFyaWF0aW9uIG9uIHRoZSBhYm92ZSBzY2hlbWU6Ci0KLSMgUmF0aGVyIHRoYW4gYSBzaW1wbGUgImptcCAqIiwgdGhlIGNvZGUgdG8gZ2V0IHRvIHRoZSBkbGwgZnVuY3Rpb24KLSMgbG9va3MgbGlrZToKLSAgICAgICAgIC50ZXh0Ci0gICAgICAgICBsd3oJcjExLFt0b2N2XV9faW1wX2Z1bmN0aW9uX25hbWUocjIpCi0jCQkgICBSRUxPQzogMDAwMDAwMDAgVE9DUkVMMTYsVE9DREVGTiBfX2ltcF9mdW5jdGlvbl9uYW1lCi0gICAgICAgICBsd3oJcjEyLDAocjExKQotCSBzdHcJcjIsNChyMSkKLQkgbXRjdHIJcjEyCi0JIGx3eglyMiw0KHIxMSkKLQkgYmN0cgotKi8KLQotc3RhdGljIGNoYXIgKgotbWFrZV9sYWJlbCAocHJlZml4LCBuYW1lKQotICAgICBjb25zdCBjaGFyICpwcmVmaXg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBsZW4gPSBzdHJsZW4gKEFTTV9QUkVGSVgpICsgc3RybGVuIChwcmVmaXgpICsgc3RybGVuIChuYW1lKTsKLSAgY2hhciAqY29weSA9IHhtYWxsb2MgKGxlbiArMSApOwotICBzdHJjcHkgKGNvcHksIEFTTV9QUkVGSVgpOwotICBzdHJjYXQgKGNvcHksIHByZWZpeCk7Ci0gIHN0cmNhdCAoY29weSwgbmFtZSk7Ci0gIHJldHVybiBjb3B5OwotfQotCi1zdGF0aWMgYmZkICoKLW1ha2Vfb25lX2xpYl9maWxlIChleHAsIGkpCi0gICAgIGV4cG9ydF90eXBlICpleHA7Ci0gICAgIGludCBpOwotewotI2lmIDAKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgRklMRSAqZjsKLSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICJkIjsKLSAgICAgIGNoYXIgKmNtZDsKLQotICAgICAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChwcmVmaXgpICsgMTApOwotICAgICAgc3ByaW50ZiAobmFtZSwgIiVzcyUwNWQucyIsIHByZWZpeCwgaSk7Ci0gICAgICBmID0gZm9wZW4gKG5hbWUsIEZPUEVOX1dUKTsKLSAgICAgIGZwcmludGYgKGYsICJcdC50ZXh0XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQlcyVzXG4iLCBBU01fR0xPQkFMLCBBU01fUFJFRklYLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9faW1wXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdF9pbXBfXyVzXG4iLCBBU01fR0xPQkFMLCBleHAtPm5hbWUpOwotICAgICAgZnByaW50ZiAoZiwgIiVzJXM6XG5cdCVzXHRfX2ltcF8lc1xuIiwgQVNNX1BSRUZJWCwKLQkgICAgICAgZXhwLT5uYW1lLCBBU01fSlVNUCwgZXhwLT5uYW1lKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb25cdC5pZGF0YSQ3XHQlcyBUbyBmb3JjZSBsb2FkaW5nIG9mIGhlYWRcbiIsIEFTTV9DKTsKLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQlc1xuIiwgQVNNX0xPTkcsIGhlYWRfbGFiZWwpOwotCi0KLSAgICAgIGZwcmludGYgKGYsIiVzIEltcG9ydCBBZGRyZXNzIFRhYmxlXG4iLCBBU01fQyk7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uCS5pZGF0YSQ1XG4iKTsKLSAgICAgIGZwcmludGYgKGYsICJfX2ltcF8lczpcbiIsIGV4cC0+bmFtZSk7Ci0gICAgICBmcHJpbnRmIChmLCAiX2ltcF9fJXM6XG4iLCBleHAtPm5hbWUpOwotCi0gICAgICBkdW1wX2lhdCAoZiwgZXhwKTsKLQotICAgICAgZnByaW50ZiAoZiwgIlxuJXMgSW1wb3J0IExvb2t1cCBUYWJsZVxuIiwgQVNNX0MpOwotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotCi0gICAgICBkdW1wX2lhdCAoZiwgZXhwKTsKLQotICAgICAgaWYoIWV4cC0+bm9uYW1lIHx8IHNob3dfYWxsbmFtZXMpCi0JewotCSAgZnByaW50ZiAoZiwgIiVzIEhpbnQvTmFtZSB0YWJsZVxuIiwgQVNNX0MpOwotCSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDZcbiIpOwotCSAgZnByaW50ZiAoZiwgIklEJWQ6XHQlc1x0JWRcbiIsIGV4cC0+b3JkaW5hbCwgQVNNX1NIT1JULCBleHAtPmhpbnQpOwotCSAgZnByaW50ZiAoZiwgIlx0JXNcdFwiJXNcIlxuIiwgQVNNX1RFWFQsIHhsYXRlIChleHAtPm5hbWUpKTsKLQl9Ci0KLSAgICAgIGZjbG9zZSAoZik7Ci0KLSAgICAgIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChhc19mbGFncykgKyAyICogc3RybGVuIChwcmVmaXgpICsgNTApOwotICAgICAgc3ByaW50ZiAoY21kLCAiJXMgLW8gJXNzJTA1ZC5vICVzcyVkLnMiLAotCSAgICAgICBhc19mbGFncywgcHJlZml4LCBpLCBwcmVmaXgsIGkpOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSAgICAgIGlmIChtYWNoaW5lID09IE1BUk1fSU5URVJXT1JLIHx8IG1hY2hpbmUgPT0gTVRIVU1CKQotCXN0cmNhdCAoY21kLCAiIC1tdGh1bWItaW50ZXJ3b3JrIik7Ci0jZW5kaWYKLSAgCi0gICAgICBydW4gKGFzX25hbWUsIGNtZCk7Ci0gICAgfQotI2Vsc2UgLyogaWYgMCAqLwotICAgIHsKLSAgICAgIGJmZCAqICAgICAgYWJmZDsKLSAgICAgIGFzeW1ib2wgKiAgZXhwX2xhYmVsOwotICAgICAgYXN5bWJvbCAqICBpbmFtZTsKLSAgICAgIGFzeW1ib2wgKiAgaW5hbWUyOwotICAgICAgYXN5bWJvbCAqICBpbmFtZV9sYWI7Ci0gICAgICBhc3ltYm9sICoqIGluYW1lX2xhYl9wcDsKLSAgICAgIGFzeW1ib2wgKiogaW5hbWVfcHA7Ci0jaWZkZWYgRExMVE9PTF9QUEMKLSAgICAgIGFzeW1ib2wgKiogZm5fcHA7Ci0gICAgICBhc3ltYm9sICoqIHRvY19wcDsKLSNkZWZpbmUgRVhUUkEJIDIKLSNlbmRpZgotI2lmbmRlZiBFWFRSQQotI2RlZmluZSBFWFRSQSAgICAwCi0jZW5kaWYKLSAgICAgIGFzeW1ib2wgKiAgcHRyc1tOU0VDUyArIDQgKyBFWFRSQSArIDFdOwotCi0gICAgICBjaGFyICogICAgIG91dG5hbWUgPSB4bWFsbG9jICgxMCk7Ci0gICAgICBpbnQgICAgICAgIG9pZHggPSAwOwotCi0gICAgICAKLSAgICAgIHNwcmludGYgKG91dG5hbWUsICIlcyUwNWQubyIsIFRNUF9TVFVCLCBpKTsKLSAgICAgIAotICAgICAgYWJmZCA9IGJmZF9vcGVudyAob3V0bmFtZSwgSE9XX0JGRF9UQVJHRVQpOwotICAgICAgCi0gICAgICBpZiAoIWFiZmQpCi0JLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQlmYXRhbCAoXygiYmZkX29wZW4gZmFpbGVkIG9wZW4gc3R1YiBmaWxlOiAlcyIpLCBvdXRuYW1lKTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGluZm9ybSAoXygiQ3JlYXRpbmcgc3R1YiBmaWxlOiAlcyIpLCBvdXRuYW1lKTsKLSAgICAgIAotICAgICAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICAgICAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIEhPV19CRkRfQVJDSCwgMCk7Ci0KLSNpZmRlZiBETExUT09MX0FSTQotICAgICAgaWYgKG1hY2hpbmUgPT0gTUFSTV9JTlRFUldPUksgfHwgbWFjaGluZSA9PSBNVEhVTUIpCi0JYmZkX3NldF9wcml2YXRlX2ZsYWdzIChhYmZkLCBGX0lOVEVSV09SSyk7Ci0jZW5kaWYKLSAgICAgIAotICAgICAgLyogRmlyc3QgbWFrZSBzeW1ib2xzIGZvciB0aGUgc2VjdGlvbnMgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCXsKLQkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCSAgaWYgKHNpLT5pZCAhPSBpKQotCSAgICBhYm9ydCgpOwotCSAgc2ktPnNlYyA9IGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSAoYWJmZCwgc2ktPm5hbWUpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLAotCQkJCSBzaS0+c2VjLAotCQkJCSBzaS0+ZmxhZ3MpOwotCi0JICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KGFiZmQsIHNpLT5zZWMsIHNpLT5hbGlnbik7Ci0JICBzaS0+c2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNpLT5zZWM7Ci0JICBzaS0+c3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sKGFiZmQpOwotCSAgc2ktPnN5bS0+bmFtZSA9IHNpLT5zZWMtPm5hbWU7Ci0JICBzaS0+c3ltLT5zZWN0aW9uID0gc2ktPnNlYzsKLQkgIHNpLT5zeW0tPmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgc2ktPnN5bS0+dmFsdWUgPSAwOwotCSAgcHRyc1tvaWR4XSA9IHNpLT5zeW07Ci0JICBzaS0+c3ltcHAgPSBwdHJzICsgb2lkeDsKLQkgIHNpLT5zaXplID0gMDsKLQkgIHNpLT5kYXRhID0gTlVMTDsKLQotCSAgb2lkeCsrOwotCX0KLQotICAgICAgaWYgKCEgZXhwLT5kYXRhKQotCXsKLQkgIGV4cF9sYWJlbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0JICBleHBfbGFiZWwtPm5hbWUgPSBtYWtlX2xhYmVsICgiIiwgZXhwLT5uYW1lKTsKLQotCSAgLyogT24gUG93ZXJQQywgdGhlIGZ1bmN0aW9uIG5hbWUgcG9pbnRzIHRvIGEgZGVzY3JpcHRvciBpbgotCSAgICAgdGhlIHJkYXRhIHNlY3Rpb24sIHRoZSBmaXJzdCBlbGVtZW50IG9mIHdoaWNoIGlzIGEKLQkgICAgIHBvaW50ZXIgdG8gdGhlIGNvZGUgKC4uZnVuY3Rpb25fbmFtZSksIGFuZCB0aGUgc2Vjb25kCi0JICAgICBwb2ludHMgdG8gdGhlIC50b2MgKi8KLSNpZmRlZiBETExUT09MX1BQQwotCSAgaWYgKG1hY2hpbmUgPT0gTVBQQykKLQkgICAgZXhwX2xhYmVsLT5zZWN0aW9uID0gc2VjZGF0YVtSREFUQV0uc2VjOwotCSAgZWxzZQotI2VuZGlmCi0JICAgIGV4cF9sYWJlbC0+c2VjdGlvbiA9IHNlY2RhdGFbVEVYVF0uc2VjOwotCi0JICBleHBfbGFiZWwtPmZsYWdzID0gQlNGX0dMT0JBTDsKLQkgIGV4cF9sYWJlbC0+dmFsdWUgPSAwOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLQkgIGlmIChtYWNoaW5lID09IE1USFVNQikKLQkgICAgYmZkX2NvZmZfc2V0X3N5bWJvbF9jbGFzcyAoYWJmZCwgZXhwX2xhYmVsLCBDX1RIVU1CRVhURlVOQyk7Ci0jZW5kaWYKLQkgIHB0cnNbb2lkeCsrXSA9IGV4cF9sYWJlbDsKLQl9Ci0KLSAgICAgIC8qIEdlbmVyYXRlIGltcCBzeW1ib2xzIHdpdGggb25lIHVuZGVyc2NvcmUgZm9yIE1pY3Jvc29mdAotICAgICAgICAgY29tcGF0aWJpbGl0eSwgYW5kIHdpdGggdHdvIHVuZGVyc2NvcmVzIGZvciBiYWNrd2FyZAotICAgICAgICAgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBjeWd3aW4uICAqLwotICAgICAgaW5hbWUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0gICAgICBpbmFtZS0+bmFtZSA9IG1ha2VfbGFiZWwgKCJfX2ltcF8iLCBleHAtPm5hbWUpOwotICAgICAgaW5hbWUtPnNlY3Rpb24gPSBzZWNkYXRhW0lEQVRBNV0uc2VjOwotICAgICAgaW5hbWUtPmZsYWdzID0gQlNGX0dMT0JBTDsKLSAgICAgIGluYW1lLT52YWx1ZSA9IDA7Ci0KLSAgICAgIGluYW1lMiA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLSAgICAgIGluYW1lMi0+bmFtZSA9IG1ha2VfbGFiZWwgKCJfaW1wX18iLCBleHAtPm5hbWUpOwotICAgICAgaW5hbWUyLT5zZWN0aW9uID0gc2VjZGF0YVtJREFUQTVdLnNlYzsKLSAgICAgIGluYW1lMi0+ZmxhZ3MgPSBCU0ZfR0xPQkFMOwotICAgICAgaW5hbWUyLT52YWx1ZSA9IDA7Ci0KLSAgICAgIGluYW1lX2xhYiA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbChhYmZkKTsKLQotICAgICAgaW5hbWVfbGFiLT5uYW1lID0gaGVhZF9sYWJlbDsKLSAgICAgIGluYW1lX2xhYi0+c2VjdGlvbiA9IChhc2VjdGlvbiAqKSZiZmRfdW5kX3NlY3Rpb247Ci0gICAgICBpbmFtZV9sYWItPmZsYWdzID0gMDsKLSAgICAgIGluYW1lX2xhYi0+dmFsdWUgPSAwOwotCi0KLSAgICAgIGluYW1lX3BwID0gcHRycyArIG9pZHg7Ci0gICAgICBwdHJzW29pZHgrK10gPSBpbmFtZTsKLSAgICAgIHB0cnNbb2lkeCsrXSA9IGluYW1lMjsKLQotICAgICAgaW5hbWVfbGFiX3BwID0gcHRycyArIG9pZHg7Ci0gICAgICBwdHJzW29pZHgrK10gPSBpbmFtZV9sYWI7Ci0KLSNpZmRlZiBETExUT09MX1BQQwotICAgICAgLyogVGhlIHN5bWJvbCByZWZlcmluZyB0byB0aGUgY29kZSAoLnRleHQpICovCi0gICAgICB7Ci0JYXN5bWJvbCAqZnVuY3Rpb25fbmFtZTsKLQotCWZ1bmN0aW9uX25hbWUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2woYWJmZCk7Ci0JZnVuY3Rpb25fbmFtZS0+bmFtZSA9IG1ha2VfbGFiZWwgKCIuLiIsIGV4cC0+bmFtZSk7Ci0JZnVuY3Rpb25fbmFtZS0+c2VjdGlvbiA9IHNlY2RhdGFbVEVYVF0uc2VjOwotCWZ1bmN0aW9uX25hbWUtPmZsYWdzID0gQlNGX0dMT0JBTDsKLQlmdW5jdGlvbl9uYW1lLT52YWx1ZSA9IDA7Ci0KLQlmbl9wcCA9IHB0cnMgKyBvaWR4OwotCXB0cnNbb2lkeCsrXSA9IGZ1bmN0aW9uX25hbWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFRoZSAudG9jIHN5bWJvbCAqLwotICAgICAgewotCWFzeW1ib2wgKnRvY19zeW1ib2w7ICAgIC8qIFRoZSAudG9jIHN5bWJvbCAqLwotCi0JdG9jX3N5bWJvbCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0JdG9jX3N5bWJvbC0+bmFtZSA9IG1ha2VfbGFiZWwgKCIuIiwgInRvYyIpOwotCXRvY19zeW1ib2wtPnNlY3Rpb24gPSAoYXNlY3Rpb24gKikmYmZkX3VuZF9zZWN0aW9uOwotCXRvY19zeW1ib2wtPmZsYWdzID0gQlNGX0dMT0JBTDsKLQl0b2Nfc3ltYm9sLT52YWx1ZSA9IDA7Ci0KLQl0b2NfcHAgPSBwdHJzICsgb2lkeDsKLQlwdHJzW29pZHgrK10gPSB0b2Nfc3ltYm9sOwotICAgICAgfQotI2VuZGlmCi0gICAgICAKLSAgICAgIHB0cnNbb2lkeF0gPSAwOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKLQl7Ci0JICBzaW5mbyAqc2kgPSBzZWNkYXRhICsgaTsKLQkgIGFzZWN0aW9uICpzZWMgPSBzaS0+c2VjOwotCSAgYXJlbGVudCAqcmVsOwotCSAgYXJlbGVudCAqKnJwcDsKLQotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgVEVYVDoKLQkgICAgICBpZiAoISBleHAtPmRhdGEpCi0JCXsKLQkJICBzaS0+c2l6ZSA9IEhPV19KVEFCX1NJWkU7Ci0JCSAgc2ktPmRhdGEgPSB4bWFsbG9jIChIT1dfSlRBQl9TSVpFKTsKLQkJICBtZW1jcHkgKHNpLT5kYXRhLCBIT1dfSlRBQiwgSE9XX0pUQUJfU0laRSk7Ci0KLQkJICAvKiBhZGQgdGhlIHJlbG9jIGludG8gaWRhdGEkNSAqLwotCQkgIHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQkgIAotCQkgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDIpOwotCQkgIHJwcFswXSA9IHJlbDsKLQkJICBycHBbMV0gPSAwOwotCQkgIAotCQkgIHJlbC0+YWRkcmVzcyA9IEhPV19KVEFCX1JPRkY7Ci0JCSAgcmVsLT5hZGRlbmQgPSAwOwotCi0JCSAgaWYgKG1hY2hpbmUgPT0gTVBQQykKLQkJICAgIHsKLQkJICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwKLQkJCQkJCQkgIEJGRF9SRUxPQ18xNl9HT1RPRkYpOwotCQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gaW5hbWVfcHA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gc2VjZGF0YVtJREFUQTVdLnN5bXBwOwotCQkgICAgfQotCQkgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JCSAgc2VjLT5yZWxvY19jb3VudCA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJREFUQTQ6Ci0JICAgIGNhc2UgSURBVEE1OgotCSAgICAgIC8qIEFuIGlkYXRhJDQgb3IgaWRhdGEkNSBpcyBvbmUgd29yZCBsb25nLCBhbmQgaGFzIGFuCi0JCSBydmEgdG8gaWRhdGEkNiAqLwotCi0JICAgICAgc2ktPmRhdGEgPSB4bWFsbG9jICg0KTsKLQkgICAgICBzaS0+c2l6ZSA9IDQ7Ci0KLQkgICAgICBpZiAoZXhwLT5ub25hbWUpCi0JCXsKLQkJICBzaS0+ZGF0YVswXSA9IGV4cC0+b3JkaW5hbCA7Ci0JCSAgc2ktPmRhdGFbMV0gPSBleHAtPm9yZGluYWwgPj4gODsKLQkJICBzaS0+ZGF0YVsyXSA9IGV4cC0+b3JkaW5hbCA+PiAxNjsKLQkJICBzaS0+ZGF0YVszXSA9IDB4ODA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzZWMtPnJlbG9jX2NvdW50ID0gMTsKLQkJICBtZW1zZXQgKHNpLT5kYXRhLCAwLCBzaS0+c2l6ZSk7Ci0JCSAgcmVsID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCSAgcnBwID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50ICopICogMik7Ci0JCSAgcnBwWzBdID0gcmVsOwotCQkgIHJwcFsxXSA9IDA7Ci0JCSAgcmVsLT5hZGRyZXNzID0gMDsKLQkJICByZWwtPmFkZGVuZCA9IDA7Ci0JCSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DX1JWQSk7Ci0JCSAgcmVsLT5zeW1fcHRyX3B0ciA9IHNlY2RhdGFbSURBVEE2XS5zeW1wcDsKLQkJICBzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCQl9Ci0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIElEQVRBNjoKLQkgICAgICBpZiAoIWV4cC0+bm9uYW1lKQotCQl7Ci0JCSAgLyogVGhpcyB1c2VkIHRvIGFkZCAxIHRvIGV4cC0+aGludC4gIEkgZG9uJ3Qga25vdwotICAgICAgICAgICAgICAgICAgICAgd2h5IGl0IGRpZCB0aGF0LCBhbmQgaXQgZG9lcyBub3QgbWF0Y2ggd2hhdCBJIHNlZQotICAgICAgICAgICAgICAgICAgICAgaW4gcHJvZ3JhbXMgY29tcGlsZWQgd2l0aCB0aGUgTVMgdG9vbHMuICAqLwotCQkgIGludCBpZHggPSBleHAtPmhpbnQ7Ci0JCSAgc2ktPnNpemUgPSBzdHJsZW4gKHhsYXRlIChleHAtPm5hbWUpKSArIDM7Ci0JCSAgc2ktPmRhdGEgPSB4bWFsbG9jIChzaS0+c2l6ZSk7Ci0JCSAgc2ktPmRhdGFbMF0gPSBpZHggJiAweGZmOwotCQkgIHNpLT5kYXRhWzFdID0gaWR4ID4+IDg7Ci0JCSAgc3RyY3B5IChzaS0+ZGF0YSArIDIsIHhsYXRlIChleHAtPm5hbWUpKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElEQVRBNzoKLQkgICAgICBzaS0+c2l6ZSA9IDQ7Ci0JICAgICAgc2ktPmRhdGEgPXhtYWxsb2MoNCk7Ci0JICAgICAgbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOwotCSAgICAgIHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCSAgICAgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDIpOwotCSAgICAgIHJwcFswXSA9IHJlbDsKLQkgICAgICByZWwtPmFkZHJlc3MgPSAwOwotCSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfUlZBKTsKLQkgICAgICByZWwtPnN5bV9wdHJfcHRyID0gaW5hbWVfbGFiX3BwOwotCSAgICAgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JICAgICAgc2VjLT5yZWxvY19jb3VudCA9IDE7Ci0JICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBETExUT09MX1BQQwotCSAgICBjYXNlIFBEQVRBOgotCSAgICAgIHsKLQkJLyogVGhlIC5wZGF0YSBzZWN0aW9uIGlzIDUgd29yZHMgbG9uZy4gKi8KLQkJLyogVGhpbmsgb2YgaXQgYXM6ICAgICAgICAgICAgICAgICAgICAgKi8KLQkJLyogc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJLyogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkJLyogICBiZmRfdm1hIEJlZ2luQWRkcmVzcywgICAgIFsweDAwXSAgKi8KLQkJLyogICAgICAgICAgIEVuZEFkZHJlc3MsICAgICAgIFsweDA0XSAgKi8KLQkJLyoJICAgICBFeGNlcHRpb25IYW5kbGVyLCBbMHgwOF0gICovCi0JCS8qCSAgICAgSGFuZGxlckRhdGEsICAgICAgWzB4MGNdICAqLwotCQkvKgkgICAgIFByb2xvZ0VuZEFkZHJlc3M7IFsweDEwXSAgKi8KLQkJLyogfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCQkvKiBTbyB0aGlzIHBkYXRhIHNlY3Rpb24gc2V0dXBzIHVwIHRoaXMgYXMgYSBnbHVlIGxpbmthZ2UgdG8KLQkJICAgYSBkbGwgcm91dGluZS4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhvdXNlIGtlZXBpbmcgdGhpbmdzCi0JCSAgIHdlIG5lZWQgdG8gZG86Ci0KLQkJICAgMS4gSW4gdGhlIG5hbWUgb2YgZ2x1ZSB0cmlja2VyeSwgdGhlIEFERFIzMiByZWxvY3MgZm9yIDAsCi0JCSAgICAgIDQsIGFuZCAweDEwIGFyZSBzZXQgdG8gcG9pbnQgdG8gdGhlIHNhbWUgcGxhY2U6Ci0JCSAgICAgICIuLmZ1bmN0aW9uX25hbWUiLgotCQkgICAyLiBUaGVyZSBpcyBvbmUgbW9yZSByZWxvYyBuZWVkZWQgaW4gdGhlIHBkYXRhIHNlY3Rpb24uCi0JCSAgICAgIFRoZSBhY3R1YWwgZ2x1ZSBpbnN0cnVjdGlvbiB0byByZXN0b3JlIHRoZSB0b2Mgb24KLQkJICAgICAgcmV0dXJuIGlzIHNhdmVkIGFzIHRoZSBvZmZzZXQgaW4gYW4gSU1HTFVFIHJlbG9jLgotCQkgICAgICBTbyB3ZSBuZWVkIGEgdG90YWwgb2YgZm91ciByZWxvY3MgZm9yIHRoaXMgc2VjdGlvbi4KLQotCQkgICAzLiBMYXN0bHksIHRoZSBIYW5kbGVyRGF0YSBmaWVsZCBpcyBzZXQgdG8gMHgwMywgdG8gaW5kaWNhdGUKLQkJICAgICAgdGhhdCB0aGlzIGlzIGEgZ2x1ZSByb3V0aW5lLgotCQkqLwotCQlhcmVsZW50ICppbWdsdWUsICpiYV9yZWwsICplYV9yZWwsICpwZWFfcmVsOwotCi0JCS8qIGFsaWdubWVudCBtdXN0IGJlIHNldCB0byAyKioyIG9yIHlvdSBnZXQgZXh0cmEgc3R1ZmYgKi8KLQkJYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudChhYmZkLCBzZWMsIDIpOwotCi0JCXNpLT5zaXplID0gNCAqIDU7Ci0JCXNpLT5kYXRhID14bWFsbG9jKDQgKiA1KTsKLQkJbWVtc2V0IChzaS0+ZGF0YSwgMCwgc2ktPnNpemUpOwotCQlycHAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiA1KTsKLQkJcnBwWzBdID0gaW1nbHVlICA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQlycHBbMV0gPSBiYV9yZWwgID0geG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JCXJwcFsyXSA9IGVhX3JlbCAgPSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQkJcnBwWzNdID0gcGVhX3JlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCQlycHBbNF0gPSAwOwotCi0JCS8qIHN0aWNrIHRoZSB0b2MgcmVsb2FkIGluc3RydWN0aW9uIGluIHRoZSBnbHVlIHJlbG9jICovCi0JCWJmZF9wdXRfMzIoYWJmZCwgcHBjX2dsdWVfaW5zbiwgKGNoYXIgKikgJmltZ2x1ZS0+YWRkcmVzcyk7Ci0KLQkJaW1nbHVlLT5hZGRlbmQgPSAwOwotCQlpbWdsdWUtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLAotCQkJCQkJICAgICAgIEJGRF9SRUxPQ18zMl9HT1RPRkYpOwotCQlpbWdsdWUtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkJYmFfcmVsLT5hZGRyZXNzID0gMDsKLQkJYmFfcmVsLT5hZGRlbmQgPSAwOwotCQliYV9yZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCQliYV9yZWwtPnN5bV9wdHJfcHRyID0gZm5fcHA7Ci0KLQkJYmZkX3B1dF8zMihhYmZkLCAweDE4LCBzaS0+ZGF0YSArIDB4MDQpOwotCQllYV9yZWwtPmFkZHJlc3MgPSA0OwotCQllYV9yZWwtPmFkZGVuZCA9IDA7Ci0JCWVhX3JlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JCWVhX3JlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCQkvKiBtYXJrIGl0IGFzIGdsdWUgKi8KLQkJYmZkX3B1dF8zMihhYmZkLCAweDAzLCBzaS0+ZGF0YSArIDB4MGMpOwotCi0JCS8qIG1hcmsgdGhlIHByb2xvZyBlbmQgYWRkcmVzcyAqLwotCQliZmRfcHV0XzMyKGFiZmQsIDB4MEQsIHNpLT5kYXRhICsgMHgxMCk7Ci0JCXBlYV9yZWwtPmFkZHJlc3MgPSAweDEwOwotCQlwZWFfcmVsLT5hZGRlbmQgPSAwOwotCQlwZWFfcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoYWJmZCwgQkZEX1JFTE9DXzMyKTsKLQkJcGVhX3JlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCQlzZWMtPm9yZWxvY2F0aW9uID0gcnBwOwotCQlzZWMtPnJlbG9jX2NvdW50ID0gNDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBjYXNlIFJEQVRBOgotCSAgICAgIC8qIEVhY2ggZXh0ZXJuYWwgZnVuY3Rpb24gaW4gYSBQb3dlclBDIFBFIGZpbGUgaGFzIGEgdHdvIHdvcmQKLQkJIGRlc2NyaXB0b3IgY29uc2lzdGluZyBvZjoKLQkJIDEuIFRoZSBhZGRyZXNzIG9mIHRoZSBjb2RlLgotCQkgMi4gVGhlIGFkZHJlc3Mgb2YgdGhlIGFwcHJvcHJpYXRlIC50b2MKLQkgICAgICAgICBXZSB1c2UgcmVsb2NzIHRvIGJ1aWxkIHRoaXMuCi0JICAgICAgKi8KLQotCSAgICAgIHNpLT5zaXplID0gODsKLQkgICAgICBzaS0+ZGF0YSA9IHhtYWxsb2MgKDgpOwotCSAgICAgIG1lbXNldCAoc2ktPmRhdGEsIDAsIHNpLT5zaXplKTsKLQotCSAgICAgIHJwcCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCAqKSAqIDMpOwotCSAgICAgIHJwcFswXSA9IHJlbCA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCSAgICAgIHJwcFsxXSA9IHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCSAgICAgIHJwcFsyXSA9IDA7Ci0KLQkgICAgICByZWwtPmFkZHJlc3MgPSAwOwotCSAgICAgIHJlbC0+YWRkZW5kID0gMDsKLQkgICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCBCRkRfUkVMT0NfMzIpOwotCSAgICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBmbl9wcDsKLQotCSAgICAgIHJlbCA9IHJwcFsxXTsKLQotCSAgICAgIHJlbC0+YWRkcmVzcyA9IDQ7Ci0JICAgICAgcmVsLT5hZGRlbmQgPSAwOwotCSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ18zMik7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IHRvY19wcDsKLQotCSAgICAgIHNlYy0+b3JlbG9jYXRpb24gPSBycHA7Ci0JICAgICAgc2VjLT5yZWxvY19jb3VudCA9IDI7Ci0JICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogRExMVE9PTF9QUEMgKi8KLQkgICAgfQotCX0KLQotICAgICAgewotCWJmZF92bWEgdm1hID0gMDsKLQkvKiBTaXplIHVwIGFsbCB0aGUgc2VjdGlvbnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlNFQ1M7IGkrKykKLQkgIHsKLQkgICAgc2luZm8gKnNpID0gc2VjZGF0YSArIGk7Ci0KLQkgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHNpLT5zZWMsIHNpLT5zaXplKTsKLQkgICAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2ktPnNlYywgdm1hKTsKLQotLyoJICAgIHZtYSArPSBzaS0+c2l6ZTsqLwotCSAgfQotICAgICAgfQotICAgICAgLyogV3JpdGUgdGhlbSBvdXQgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOU0VDUzsgaSsrKQotCXsKLQkgIHNpbmZvICpzaSA9IHNlY2RhdGEgKyBpOwotCi0JICBpZiAoaSA9PSBJREFUQTUgJiYgbm9faWRhdGE1KQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGkgPT0gSURBVEE0ICYmIG5vX2lkYXRhNCkKLQkgICAgY29udGludWU7Ci0KLQkgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2ktPnNlYywKLQkJCQkgICAgc2ktPmRhdGEsIDAsCi0JCQkJICAgIHNpLT5zaXplKTsKLQl9Ci0KLSAgICAgIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBwdHJzLCBvaWR4KTsKLSAgICAgIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICBhYmZkID0gYmZkX29wZW5yIChvdXRuYW1lLCBIT1dfQkZEX1RBUkdFVCk7Ci0gICAgICByZXR1cm4gYWJmZDsKLSAgICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGJmZCAqCi1tYWtlX2hlYWQgKCkKLXsKLSAgRklMRSAqZiA9IGZvcGVuIChUTVBfSEVBRF9TLCBGT1BFTl9XVCk7Ci0gIGNoYXIgKmNtZDsKLQotICBpZiAoZiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZhdGFsIChfKCJmYWlsZWQgdG8gb3BlbiB0ZW1wb3JhcnkgaGVhZCBmaWxlOiAlcyIpLCBUTVBfSEVBRF9TKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgCi0gIGZwcmludGYgKGYsICIlcyBJTUFHRV9JTVBPUlRfREVTQ1JJUFRPUlxuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkMlxuIik7Ci0KLSAgZnByaW50ZihmLCJcdCVzXHQlc1xuIiwgQVNNX0dMT0JBTCxoZWFkX2xhYmVsKTsKLQotICBmcHJpbnRmIChmLCAiJXM6XG4iLCBoZWFkX2xhYmVsKTsKLQotICBmcHJpbnRmIChmLCAiXHQlc2huYW1lJXNcdCVzUHRyIHRvIGltYWdlIGltcG9ydCBieSBuYW1lIGxpc3RcbiIsCi0JICAgQVNNX1JWQV9CRUZPUkUsIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICBmcHJpbnRmIChmLCAiXHQlc3RoaXMgc2hvdWxkIGJlIHRoZSB0aW1lc3RhbXAsIGJ1dCBOVCBzb21ldGltZXNcbiIsIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNkb2Vzbid0IGxvYWQgRExMcyB3aGVuIHRoaXMgaXMgc2V0LlxuIiwgQVNNX0MpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFx0JXMgbG9hZGVkIHRpbWVcbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzXHQwXHQlcyBGb3J3YXJkZXIgY2hhaW5cbiIsIEFTTV9MT05HLCBBU01fQyk7Ci0gIGZwcmludGYgKGYsICJcdCVzX18lc19pbmFtZSVzXHQlcyBpbXBvcnRlZCBkbGwncyBuYW1lXG4iLAotCSAgIEFTTV9SVkFfQkVGT1JFLAotCSAgIGltcF9uYW1lX2xhYiwKLQkgICBBU01fUlZBX0FGVEVSLAotCSAgIEFTTV9DKTsKLSAgZnByaW50ZiAoZiwgIlx0JXNmdGh1bmslc1x0JXMgcG9pbnRlciB0byBmaXJzdHRodW5rXG4iLAotCSAgIEFTTV9SVkFfQkVGT1JFLAotCSAgIEFTTV9SVkFfQUZURVIsIEFTTV9DKTsKLQotICBmcHJpbnRmIChmLCAiJXNTdHVmZiBmb3IgY29tcGF0aWJpbGl0eVxuIiwgQVNNX0MpOwotCi0gIGlmICghbm9faWRhdGE1KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaWRhdGEkNVxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgICAgZnByaW50ZiAoZiwgImZ0aHVuazpcbiIpOwotICAgIH0KLSAgCi0gIGlmICghbm9faWRhdGE0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICJcdC5zZWN0aW9uXHQuaWRhdGEkNFxuIik7Ci0KLSAgICAgIGZwcmludGYgKGYsICJcdCVzXHQwXG4iLCBBU01fTE9ORyk7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNFxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiaG5hbWU6XG4iKTsKLSAgICB9Ci0gIAotICBmY2xvc2UgKGYpOwotCi0gIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChhc19mbGFncykgKyBzaXplb2YgVE1QX0hFQURfTwotCQkJICsgc2l6ZW9mIFRNUF9IRUFEX1MgKyA1MCk7Ci0gIHNwcmludGYgKGNtZCwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIFRNUF9IRUFEX08sIFRNUF9IRUFEX1MpOwotICAKLSNpZmRlZiBETExUT09MX0FSTQotICBpZiAobWFjaGluZSA9PSBNQVJNX0lOVEVSV09SSyB8fCBtYWNoaW5lID09IE1USFVNQikKLSAgICBzdHJjYXQgKGNtZCwgIiAtbXRodW1iLWludGVyd29yayIpOwotI2VuZGlmCi0gIAotICBydW4gKGFzX25hbWUsIGNtZCk7Ci0KLSAgcmV0dXJuIGJmZF9vcGVuciAoVE1QX0hFQURfTywgSE9XX0JGRF9UQVJHRVQpOwotfQotCi1zdGF0aWMgYmZkICoKLW1ha2VfdGFpbCAoKQotewotICBGSUxFICpmID0gZm9wZW4gKFRNUF9UQUlMX1MsIEZPUEVOX1dUKTsKLSAgY2hhciAqY21kOwotCi0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgZmF0YWwgKF8oImZhaWxlZCB0byBvcGVuIHRlbXBvcmFyeSB0YWlsIGZpbGU6ICVzIiksIFRNUF9UQUlMX1MpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAKLSAgaWYgKCFub19pZGF0YTQpCi0gICAgewotICAgICAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDRcbiIpOwotICAgICAgZnByaW50ZiAoZiwgIlx0JXNcdDBcbiIsIEFTTV9MT05HKTsKLSAgICB9Ci0gIAotICBpZiAoIW5vX2lkYXRhNSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNVxuIik7Ci0gICAgICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICAgIH0KLQotI2lmZGVmIERMTFRPT0xfUFBDCi0gIC8qIE5vcm1hbGx5LCB3ZSBuZWVkIHRvIHNlZSBhIG51bGwgZGVzY3JpcHRvciBidWlsdCBpbiBpZGF0YSQzIHRvCi0gICAgIGFjdCBhcyB0aGUgdGVybWluYXRvciBmb3IgdGhlIGxpc3QuIFRoZSBpZGVhbCB3YXksIEkgc3VwcG9zZSwKLSAgICAgd291bGQgYmUgdG8gbWFyayB0aGlzIHNlY3Rpb24gYXMgYSBjb21kYXQgdHlwZSAyIHNlY3Rpb24sIHNvCi0gICAgIG9ubHkgb25lIHdvdWxkIGFwcGVhciBpbiB0aGUgZmluYWwgLmV4ZSAoaWYgb3VyIGxpbmtlciBzdXBwb3J0ZWQKLSAgICAgY29tZGF0LCB0aGF0IGlzKSBvciBjYXVzZSBpdCB0byBiZSBpbnNlcnRlZCBieSBzb21ldGhpbmcgZWxzZSAoc2F5Ci0gICAgIGNydDApCi0gICovCi0KLSAgZnByaW50ZiAoZiwgIlx0LnNlY3Rpb24JLmlkYXRhJDNcbiIpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotICBmcHJpbnRmIChmLCAiXHQlc1x0MFxuIiwgQVNNX0xPTkcpOwotI2VuZGlmCi0KLSNpZmRlZiBETExUT09MX1BQQwotICAvKiBPdGhlciBQb3dlclBDIE5UIGNvbXBpbGVycyB1c2UgaWRhdGEkNiBmb3IgdGhlIGRsbG5hbWUsIHNvIEkKLSAgICAgZG8gdG9vLiBPcmlnaW5hbCwgaHVoPyAqLwotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkNlxuIik7Ci0jZWxzZQotICBmcHJpbnRmIChmLCAiXHQuc2VjdGlvbgkuaWRhdGEkN1xuIik7Ci0jZW5kaWYKLQotICBmcHJpbnRmIChmLCAiXHQlc1x0X18lc19pbmFtZVxuIiwgQVNNX0dMT0JBTCwgaW1wX25hbWVfbGFiKTsKLSAgZnByaW50ZiAoZiwgIl9fJXNfaW5hbWU6XHQlc1x0XCIlc1wiXG4iLAotCSAgIGltcF9uYW1lX2xhYiwgQVNNX1RFWFQsIGRsbF9uYW1lKTsKLQotICBmY2xvc2UgKGYpOwotCi0gIGNtZCA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChhc19mbGFncykgKyBzaXplb2YgVE1QX1RBSUxfTwotCQkJICsgc2l6ZW9mIFRNUF9UQUlMX1MgKyA1MCk7Ci0gIHNwcmludGYgKGNtZCwgIiVzIC1vICVzICVzIiwgYXNfZmxhZ3MsIFRNUF9UQUlMX08sIFRNUF9UQUlMX1MpOwotICAKLSNpZmRlZiBETExUT09MX0FSTQotICBpZiAobWFjaGluZSA9PSBNQVJNX0lOVEVSV09SSyB8fCBNVEhVTUIpCi0gICAgc3RyY2F0IChjbWQsICIgLW10aHVtYi1pbnRlcndvcmsiKTsKLSNlbmRpZgotICAKLSAgcnVuIChhc19uYW1lLCBjbWQpOwotICAKLSAgcmV0dXJuICBiZmRfb3BlbnIgKFRNUF9UQUlMX08sIEhPV19CRkRfVEFSR0VUKTsKLX0KLQotc3RhdGljIHZvaWQKLWdlbl9saWJfZmlsZSAoKQotewotICBpbnQgaTsKLSAgZXhwb3J0X3R5cGUgKmV4cDsKLSAgYmZkICphcl9oZWFkOwotICBiZmQgKmFyX3RhaWw7Ci0gIGJmZCAqb3V0YXJjaDsKLSAgYmZkICogaGVhZCAgPSAwOwotCi0gIHVubGluayAoaW1wX25hbWUpOwotCi0gIG91dGFyY2ggPSBiZmRfb3BlbncgKGltcF9uYW1lLCBIT1dfQkZEX1RBUkdFVCk7Ci0KLSAgaWYgKCFvdXRhcmNoKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgZmF0YWwgKF8oIkNhbid0IG9wZW4gLmxpYiBmaWxlOiAlcyIpLCBpbXBfbmFtZSk7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJDcmVhdGluZyBsaWJyYXJ5IGZpbGU6ICVzXG4iKSwgaW1wX25hbWUpOwotICAKLSAgYmZkX3NldF9mb3JtYXQgKG91dGFyY2gsIGJmZF9hcmNoaXZlKTsKLSAgb3V0YXJjaC0+aGFzX2FybWFwID0gMTsKLQotICAvKiBXb3JrIG91dCBhIHJlYXNvbmFibGUgc2l6ZSBvZiB0aGluZ3MgdG8gcHV0IG9udG8gb25lIGxpbmUuICovCi0KLSAgYXJfaGVhZCA9IG1ha2VfaGVhZCAoKTsKLSAgYXJfdGFpbCA9IG1ha2VfdGFpbCgpOwotCi0gIGlmIChhcl9oZWFkID09IE5VTEwgfHwgYXJfdGFpbCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgCi0gIGZvciAoaSA9IDA7IChleHAgPSBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldKTsgaSsrKQotICAgIHsKLSAgICAgIGJmZCAqbiA9IG1ha2Vfb25lX2xpYl9maWxlIChleHAsIGkpOwotICAgICAgbi0+bmV4dCA9IGhlYWQ7Ci0gICAgICBoZWFkID0gbjsKLSAgICB9Ci0KLSAgLyogTm93IHN0aWNrIHRoZW0gYWxsIGludG8gdGhlIGFyY2hpdmUgKi8KLQotICBhcl9oZWFkLT5uZXh0ID0gaGVhZDsKLSAgYXJfdGFpbC0+bmV4dCA9IGFyX2hlYWQ7Ci0gIGhlYWQgPSBhcl90YWlsOwotCi0gIGlmICghIGJmZF9zZXRfYXJjaGl2ZV9oZWFkIChvdXRhcmNoLCBoZWFkKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2FyY2hpdmVfaGVhZCIpOwotICAKLSAgaWYgKCEgYmZkX2Nsb3NlIChvdXRhcmNoKSkKLSAgICBiZmRfZmF0YWwgKGltcF9uYW1lKTsKLQotICB3aGlsZSAoaGVhZCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJmZCAqbiA9IGhlYWQtPm5leHQ7Ci0gICAgICBiZmRfY2xvc2UgKGhlYWQpOwotICAgICAgaGVhZCA9IG47Ci0gICAgfQotCi0gIC8qIERlbGV0ZSBhbGwgdGhlIHRlbXAgZmlsZXMgKi8KLQotICBpZiAoZG9udGRlbHRlbXBzID09IDApCi0gICAgewotICAgICAgdW5saW5rIChUTVBfSEVBRF9PKTsKLSAgICAgIHVubGluayAoVE1QX0hFQURfUyk7Ci0gICAgICB1bmxpbmsgKFRNUF9UQUlMX08pOwotICAgICAgdW5saW5rIChUTVBfVEFJTF9TKTsKLSAgICB9Ci0KLSAgaWYgKGRvbnRkZWx0ZW1wcyA8IDIpCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc2l6ZW9mIFRNUF9TVFVCICsgMTApOwotICAgICAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotCXsKLQkgIHNwcmludGYgKG5hbWUsICIlcyUwNWQubyIsIFRNUF9TVFVCLCBpKTsKLQkgIGlmICh1bmxpbmsgKG5hbWUpIDwgMCkKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgd2FybiAoXygiY2Fubm90IGRlbGV0ZSAlczogJXNcbiIpLCBuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLQl9Ci0gICAgfQotICAKLSAgaW5mb3JtIChfKCJDcmVhdGVkIGxpYiBmaWxlIikpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUnVuIHRocm91Z2ggdGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gdGhlIC5vIGZpbGVzIGFuZCB0aGUKLSAgIC5kZWYgZmlsZSBhbmQgd29yayBvdXQgdGhlIGJlc3Qgc3R1ZmYgKi8KLXN0YXRpYyBpbnQKLXBmdW5jIChhLCBiKQotICAgICBjb25zdCB2b2lkICphOwotICAgICBjb25zdCB2b2lkICpiOwotewotICBleHBvcnRfdHlwZSAqYXAgPSAqKGV4cG9ydF90eXBlICoqKSBhOwotICBleHBvcnRfdHlwZSAqYnAgPSAqKGV4cG9ydF90eXBlICoqKSBiOwotICBpZiAoYXAtPm9yZGluYWwgPT0gYnAtPm9yZGluYWwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogdW5zZXQgb3JkaW5hbHMgZ28gdG8gdGhlIGJvdHRvbSAqLwotICBpZiAoYXAtPm9yZGluYWwgPT0gLTEpCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChicC0+b3JkaW5hbCA9PSAtMSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAoYXAtPm9yZGluYWwgLSBicC0+b3JkaW5hbCk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5mdW5jIChhLCBiKQotICAgICBjb25zdCB2b2lkICphOwotICAgICBjb25zdCB2b2lkICpiOwotewotICBleHBvcnRfdHlwZSAqYXAgPSAqKGV4cG9ydF90eXBlICoqKSBhOwotICBleHBvcnRfdHlwZSAqYnAgPSAqKGV4cG9ydF90eXBlICoqKSBiOwotCi0gIHJldHVybiAoc3RyY21wIChhcC0+bmFtZSwgYnAtPm5hbWUpKTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbW92ZV9udWxsX25hbWVzIChwdHIpCi0gICAgIGV4cG9ydF90eXBlICoqcHRyOwotewotICBpbnQgc3JjOwotICBpbnQgZHN0OwotICBmb3IgKGRzdCA9IHNyYyA9IDA7IHNyYyA8IGRfbmZ1bmNzOyBzcmMrKykKLSAgICB7Ci0gICAgICBpZiAocHRyW3NyY10pCi0JewotCSAgcHRyW2RzdF0gPSBwdHJbc3JjXTsKLQkgIGRzdCsrOwotCX0KLSAgICB9Ci0gIGRfbmZ1bmNzID0gZHN0OwotfQotCi1zdGF0aWMgdm9pZAotZHRhYiAocHRyKQotICAgICBleHBvcnRfdHlwZSAqKnB0cjsKLXsKLSNpZmRlZiBTQUNERUJVRwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKHB0cltpXSkKLQl7Ci0JICBwcmludGYgKCIlZCAlcyBAICVkICVzJXMlc1xuIiwKLQkJICBpLCBwdHJbaV0tPm5hbWUsIHB0cltpXS0+b3JkaW5hbCwKLQkJICBwdHJbaV0tPm5vbmFtZSA/ICJOT05BTUUgIiA6ICIiLAotCQkgIHB0cltpXS0+Y29uc3RhbnQgPyAiQ09OU1RBTlQiIDogIiIsCi0JCSAgcHRyW2ldLT5kYXRhID8gIkRBVEEiIDogIiIpOwotCX0KLSAgICAgIGVsc2UKLQlwcmludGYgKCJlbXB0eVxuIik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2R1cGxpY2F0ZXMgKGRfZXhwb3J0X3ZlYykKLSAgICAgZXhwb3J0X3R5cGUgKipkX2V4cG9ydF92ZWM7Ci17Ci0gIGludCBtb3JlID0gMTsKLSAgaW50IGk7Ci0gIHdoaWxlIChtb3JlKQotICAgIHsKLQotICAgICAgbW9yZSA9IDA7Ci0gICAgICAvKiBSZW1vdmUgZHVwbGljYXRlcyAqLwotICAgICAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIG5mdW5jKTsKLQotICAgICAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jcyAtIDE7IGkrKykKLQl7Ci0JICBpZiAoc3RyY21wIChkX2V4cG9ydF92ZWNbaV0tPm5hbWUsCi0JCSAgICAgIGRfZXhwb3J0X3ZlY1tpICsgMV0tPm5hbWUpID09IDApCi0JICAgIHsKLQotCSAgICAgIGV4cG9ydF90eXBlICphID0gZF9leHBvcnRfdmVjW2ldOwotCSAgICAgIGV4cG9ydF90eXBlICpiID0gZF9leHBvcnRfdmVjW2kgKyAxXTsKLQotCSAgICAgIG1vcmUgPSAxOwotCSAgICAgIAotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgaW5mb3JtIChfKCJXYXJuaW5nLCBpZ25vcmluZyBkdXBsaWNhdGUgRVhQT1JUICVzICVkLCVkXG4iKSwKLQkJICAgICAgYS0+bmFtZSwgYS0+b3JkaW5hbCwgYi0+b3JkaW5hbCk7Ci0JICAgICAgCi0JICAgICAgaWYgKGEtPm9yZGluYWwgIT0gLTEKLQkJICAmJiBiLT5vcmRpbmFsICE9IC0xKQotCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQlmYXRhbCAoXygiRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzIiksCi0JCSAgICAgIGEtPm5hbWUpOwotCi0JICAgICAgLyogTWVyZ2UgYXR0cmlidXRlcyAqLwotCSAgICAgIGItPm9yZGluYWwgPSBhLT5vcmRpbmFsID4gMCA/IGEtPm9yZGluYWwgOiBiLT5vcmRpbmFsOwotCSAgICAgIGItPmNvbnN0YW50IHw9IGEtPmNvbnN0YW50OwotCSAgICAgIGItPm5vbmFtZSB8PSBhLT5ub25hbWU7Ci0JICAgICAgYi0+ZGF0YSB8PSBhLT5kYXRhOwotCSAgICAgIGRfZXhwb3J0X3ZlY1tpXSA9IDA7Ci0JICAgIH0KLQotCSAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLQkgIHJlbW92ZV9udWxsX25hbWVzIChkX2V4cG9ydF92ZWMpOwotCSAgZHRhYiAoZF9leHBvcnRfdmVjKTsKLQl9Ci0gICAgfQotCi0KLSAgLyogQ291bnQgdGhlIG5hbWVzICovCi0gIGZvciAoaSA9IDA7IGkgPCBkX25mdW5jczsgaSsrKQotICAgIHsKLSAgICAgIGlmICghZF9leHBvcnRfdmVjW2ldLT5ub25hbWUpCi0JZF9uYW1lZF9uZnVuY3MrKzsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1maWxsX29yZGluYWxzIChkX2V4cG9ydF92ZWMpCi0gICAgIGV4cG9ydF90eXBlICoqZF9leHBvcnRfdmVjOwotewotICBpbnQgbG93ZXN0ID0gLTE7Ci0gIGludCBpOwotICBjaGFyICpwdHI7Ci0gIGludCBzaXplID0gNjU1MzY7Ci0KLSAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIHBmdW5jKTsKLQotICAvKiBmaWxsIGluIHRoZSB1bnNldCBvcmRpbmFscyB3aXRoIG9uZXMgZnJvbSBvdXIgcmFuZ2UgKi8KLQotICBwdHIgPSAoY2hhciAqKSB4bWFsbG9jIChzaXplKTsKLQotICBtZW1zZXQgKHB0ciwgMCwgc2l6ZSk7Ci0KLSAgLyogTWFyayBpbiBvdXIgbGFyZ2UgdmVjdG9yIGFsbCB0aGUgbnVtYmVycyB0aGF0IGFyZSB0YWtlbiAqLwotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsICE9IC0xKQotCXsKLQkgIHB0cltkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWxdID0gMTsKLQkgIGlmIChsb3dlc3QgPT0gLTEgfHwgZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsIDwgbG93ZXN0KQotCSAgICB7Ci0JICAgICAgbG93ZXN0ID0gZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBTdGFydCBhdCAxIGZvciBjb21wYXRpYmlsaXR5IHdpdGggTVMgdG9vbGNoYWluLiAgKi8KLSAgaWYgKGxvd2VzdCA9PSAtMSkKLSAgICBsb3dlc3QgPSAxOwotCi0gIC8qIE5vdyBmaWxsIGluIG9yZGluYWxzIHdoZXJlIHRoZSB1c2VyIHdhbnRzIHVzIHRvIGNob29zZS4gKi8KLSAgZm9yIChpID0gMDsgaSA8IGRfbmZ1bmNzOyBpKyspCi0gICAgewotICAgICAgaWYgKGRfZXhwb3J0X3ZlY1tpXS0+b3JkaW5hbCA9PSAtMSkKLQl7Ci0JICByZWdpc3RlciBpbnQgajsKLQotCSAgLyogRmlyc3QgdHJ5IHdpdGhpbiBvciBhZnRlciBhbnkgdXNlciBzdXBwbGllZCByYW5nZS4gKi8KLQkgIGZvciAoaiA9IGxvd2VzdDsgaiA8IHNpemU7IGorKykKLQkgICAgaWYgKHB0cltqXSA9PSAwKQotCSAgICAgIHsKLQkJcHRyW2pdID0gMTsKLQkJZF9leHBvcnRfdmVjW2ldLT5vcmRpbmFsID0gajsKLQkJZ290byBkb25lOwotCSAgICAgIH0KLQotCSAgLyogVGhlbiB0cnkgYmVmb3JlIHRoZSByYW5nZS4gKi8KLQkgIGZvciAoaiA9IGxvd2VzdDsgaiA+MDsgai0tKQotCSAgICBpZiAocHRyW2pdID09IDApCi0JICAgICAgewotCQlwdHJbal0gPSAxOwotCQlkX2V4cG9ydF92ZWNbaV0tPm9yZGluYWwgPSBqOwotCQlnb3RvIGRvbmU7Ci0JICAgICAgfQotCWRvbmU6OwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocHRyKTsKLQotICAvKiBBbmQgcmVzb3J0ICovCi0KLSAgcXNvcnQgKGRfZXhwb3J0X3ZlYywgZF9uZnVuY3MsIHNpemVvZiAoZXhwb3J0X3R5cGUgKiksIHBmdW5jKTsKLQotICAvKiBXb3JrIG91dCB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IG9yZGluYWwgbnVtYmVycy4gICovCi0gIGlmIChkX25mdW5jcykKLSAgICB7Ci0gICAgICBpZiAoZF9leHBvcnRfdmVjWzBdKQotCWRfbG93X29yZCA9IGRfZXhwb3J0X3ZlY1swXS0+b3JkaW5hbDsKLSAgICAgIGlmIChkX2V4cG9ydF92ZWNbZF9uZnVuY3MtMV0pCi0JZF9oaWdoX29yZCA9IGRfZXhwb3J0X3ZlY1tkX25mdW5jcy0xXS0+b3JkaW5hbDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWFscGhhZnVuYyAoYXYsYnYpCi0gICAgIGNvbnN0IHZvaWQgKmF2OwotICAgICBjb25zdCB2b2lkICpidjsKLXsKLSAgY29uc3QgZXhwb3J0X3R5cGUgKiphID0gKGNvbnN0IGV4cG9ydF90eXBlICoqKSBhdjsKLSAgY29uc3QgZXhwb3J0X3R5cGUgKipiID0gKGNvbnN0IGV4cG9ydF90eXBlICoqKSBidjsKLQotICByZXR1cm4gc3RyY21wICgoKmEpLT5uYW1lLCAoKmIpLT5uYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLW1hbmdsZV9kZWZzICgpCi17Ci0gIC8qIEZpcnN0IHdvcmsgb3V0IHRoZSBtaW5pbXVtIG9yZGluYWwgY2hvc2VuICovCi0KLSAgZXhwb3J0X3R5cGUgKmV4cDsKLQotICBpbnQgaTsKLSAgaW50IGhpbnQgPSAwOwotICBleHBvcnRfdHlwZSAqKmRfZXhwb3J0X3ZlYwotICA9IChleHBvcnRfdHlwZSAqKikgeG1hbGxvYyAoc2l6ZW9mIChleHBvcnRfdHlwZSAqKSAqIGRfbmZ1bmNzKTsKLQotICBpbmZvcm0gKF8oIlByb2Nlc3NpbmcgZGVmaW5pdGlvbnMiKSk7Ci0gIAotICBmb3IgKGkgPSAwLCBleHAgPSBkX2V4cG9ydHM7IGV4cDsgaSsrLCBleHAgPSBleHAtPm5leHQpCi0gICAgewotICAgICAgZF9leHBvcnRfdmVjW2ldID0gZXhwOwotICAgIH0KLQotICBwcm9jZXNzX2R1cGxpY2F0ZXMgKGRfZXhwb3J0X3ZlYyk7Ci0gIGZpbGxfb3JkaW5hbHMgKGRfZXhwb3J0X3ZlYyk7Ci0KLSAgLyogUHV0IGJhY2sgdGhlIGxpc3QgaW4gdGhlIG5ldyBvcmRlciAqLwotICBkX2V4cG9ydHMgPSAwOwotICBmb3IgKGkgPSBkX25mdW5jcyAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGRfZXhwb3J0X3ZlY1tpXS0+bmV4dCA9IGRfZXhwb3J0czsKLSAgICAgIGRfZXhwb3J0cyA9IGRfZXhwb3J0X3ZlY1tpXTsKLSAgICB9Ci0KLSAgLyogQnVpbGQgbGlzdCBpbiBhbHBoYSBvcmRlciAqLwotICBkX2V4cG9ydHNfbGV4aWNhbGx5ID0gKGV4cG9ydF90eXBlICoqKQotICAgIHhtYWxsb2MgKHNpemVvZiAoZXhwb3J0X3R5cGUgKikgKiAoZF9uZnVuY3MgKyAxKSk7Ci0KLSAgZm9yIChpID0gMCwgZXhwID0gZF9leHBvcnRzOyBleHA7IGkrKywgZXhwID0gZXhwLT5uZXh0KQotICAgIHsKLSAgICAgIGRfZXhwb3J0c19sZXhpY2FsbHlbaV0gPSBleHA7Ci0gICAgfQotICBkX2V4cG9ydHNfbGV4aWNhbGx5W2ldID0gMDsKLQotICBxc29ydCAoZF9leHBvcnRzX2xleGljYWxseSwgaSwgc2l6ZW9mIChleHBvcnRfdHlwZSAqKSwgYWxwaGFmdW5jKTsKLQotICAvKiBGaWxsIGV4cCBlbnRyaWVzIHdpdGggdGhlaXIgaGludCB2YWx1ZXMgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgZF9uZnVuY3M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIWRfZXhwb3J0c19sZXhpY2FsbHlbaV0tPm5vbmFtZSB8fCBzaG93X2FsbG5hbWVzKQotCWRfZXhwb3J0c19sZXhpY2FsbHlbaV0tPmhpbnQgPSBoaW50Kys7Ci0gICAgfQotICAKLSAgaW5mb3JtIChfKCJQcm9jZXNzZWQgZGVmaW5pdGlvbnMiKSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgLyogeGdldGV4dDpjLWZvcm1hdCAqLwotICBmcHJpbnRmIChmaWxlLCBfKCJVc2FnZSAlcyA8b3B0aW9ucz4gPG9iamVjdC1maWxlcz5cbiIpLCBwcm9ncmFtX25hbWUpOwotICAvKiB4Z2V0ZXh0OmMtZm9ybWF0ICovCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1tIC0tbWFjaGluZSA8bWFjaGluZT4gICAgQ3JlYXRlIGFzIERMTCBmb3IgPG1hY2hpbmU+LiAgW2RlZmF1bHQ6ICVzXVxuIiksIG1uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgICAgICBwb3NzaWJsZSA8bWFjaGluZT46IGFybVtfaW50ZXJ3b3JrXSwgaTM4NiwgbWNvcmVbLWVsZl1bLWxlXSwgcHBjLCB0aHVtYlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtZSAtLW91dHB1dC1leHAgPG91dG5hbWU+IEdlbmVyYXRlIGFuIGV4cG9ydCBmaWxlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtbCAtLW91dHB1dC1saWIgPG91dG5hbWU+IEdlbmVyYXRlIGFuIGludGVyZmFjZSBsaWJyYXJ5LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtYSAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtRCAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIGludGVyZmFjZSBsaWIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1kIC0taW5wdXQtZGVmIDxkZWZmaWxlPiAgTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLXogLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG9mIC5kZWYgZmlsZSB0byBiZSBjcmVhdGVkLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCBsaXN0ZWQgc3ltYm9sc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLWV4Y2x1ZGUtc3ltYm9scyA8bGlzdD4gRG9uJ3QgZXhwb3J0IDxsaXN0PlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAgICAtLW5vLWRlZmF1bHQtZXhjbHVkZXMgIENsZWFyIGRlZmF1bHQgZXhjbHVkZSBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1iIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLXggLS1uby1pZGF0YTQgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ0IHNlY3Rpb24uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1jIC0tbm8taWRhdGE1ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtVSAtLWFkZC11bmRlcnNjb3JlICAgICAgIEFkZCB1bmRlcnNjb3JlcyB0byBzeW1ib2xzIGluIGludGVyZmFjZSBsaWJyYXJ5LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtayAtLWtpbGwtYXQgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzLlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtQSAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPi5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLVMgLS1hcyA8bmFtZT4gICAgICAgICAgICBVc2UgPG5hbWU+IGZvciBhc3NlbWJsZXIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1mIC0tYXMtZmxhZ3MgPGZsYWdzPiAgICAgUGFzcyA8ZmxhZ3M+IHRvIHRoZSBhc3NlbWJsZXIuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1uIC0tbm8tZGVsZXRlICAgICAgICAgICAgS2VlcCB0ZW1wIGZpbGVzIChyZXBlYXQgZm9yIGV4dHJhIHByZXNlcnZhdGlvbikuXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC12IC0tdmVyYm9zZSAgICAgICAgICAgICAgQmUgdmVyYm9zZS5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLVYgLS12ZXJzaW9uICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBwcm9ncmFtIHZlcnNpb24uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1oIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uLlxuIikpOwotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gIGZwcmludGYgKGZpbGUsIF8oIiAgIC1NIC0tbWNvcmUtZWxmIDxvdXRuYW1lPiAgUHJvY2VzcyBtY29yZS1lbGYgb2JqZWN0IGZpbGVzIGludG8gPG91dG5hbWU+LlxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgICAtTCAtLWxpbmtlciA8bmFtZT4gICAgICAgIFVzZSA8bmFtZT4gYXMgdGhlIGxpbmtlci5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAgLUYgLS1saW5rZXItZmxhZ3MgPGZsYWdzPiBQYXNzIDxmbGFncz4gdG8gdGhlIGxpbmtlci5cbiIpKTsKLSNlbmRpZgotICBleGl0IChzdGF0dXMpOwotfQotCi0jZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJCTE1MAotI2RlZmluZSBPUFRJT05fTk9fRVhQT1JUX0FMTF9TWU1TCShPUFRJT05fRVhQT1JUX0FMTF9TWU1TICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYQ0xVREVfU1lNUwkJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUwkoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJuby1kZWxldGUiLCBub19hcmd1bWVudCwgTlVMTCwgJ24nfSwKLSAgeyJkbGxuYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdEJ30sCi0gIHsibm8taWRhdGE0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICd4J30sCi0gIHsibm8taWRhdGE1Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdjJ30sCi0gIHsib3V0cHV0LWV4cCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7Im91dHB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3onfSwKLSAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTExfU1lNU30sCi0gIHsibm8tZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVN9LAotICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1TfSwKLSAgeyJuby1kZWZhdWx0LWV4Y2x1ZGVzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTfSwKLSAgeyJvdXRwdXQtbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gIHsiZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdkJ30sIC8qIGZvciBjb21wYXRpYmxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyAqLwotICB7ImlucHV0LWRlZiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAotICB7ImFkZC11bmRlcnNjb3JlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdVJ30sCi0gIHsia2lsbC1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnayd9LAotICB7ImFkZC1zdGRjYWxsLWFsaWFzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdBJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgJ1YnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsibWFjaGluZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbSd9LAotICB7ImFkZC1pbmRpcmVjdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7ImJhc2UtZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICB7ImFzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdTJ30sCi0gIHsiYXMtZmxhZ3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJtY29yZS1lbGYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ00nfSwKLSAgezB9Ci19OwotCi1pbnQKLW1haW4gKGFjLCBhdikKLSAgICAgaW50IGFjOwotICAgICBjaGFyICoqYXY7Ci17Ci0gIGludCBjOwotICBpbnQgaTsKLSAgY2hhciAqZmlyc3RhcmcgPSAwOwotICBwcm9ncmFtX25hbWUgPSBhdlswXTsKLSAgb2F2ID0gYXY7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LAotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCQkJICAgCi0JCQkgICAibTplOmw6YUQ6ZDp6OmI6eGN1VWtBUzpmOm52VmhNOkw6RjoiLAotI2Vsc2UKLQkJCSAgICJtOmU6bDphRDpkOno6Yjp4Y3VVa0FTOmY6bnZWaCIsCi0jZW5kaWYKLQkJCSAgIGxvbmdfb3B0aW9ucywgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgT1BUSU9OX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGxfc3ltYm9scyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVM6Ci0JICBleHBvcnRfYWxsX3N5bWJvbHMgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYQ0xVREVfU1lNUzoKLQkgIGFkZF9leGNsdWRlcyAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFRkFVTFRfRVhDTFVERVM6Ci0JICBkb19kZWZhdWx0X2V4Y2x1ZGVzID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIG5vX2lkYXRhNCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIG5vX2lkYXRhNSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGFzX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIGFzX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQkgIC8qIGlnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgKi8KLQljYXNlICd1JzoKLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgYWRkX2luZGlyZWN0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3onOgotCSAgb3V0cHV0X2RlZiA9IGZvcGVuIChvcHRhcmcsIEZPUEVOX1dUKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZGxsX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGltcF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnZSc6Ci0JICBleHBfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQljYXNlICdtJzoKLQkgIG1uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgcHJpbnRfdmVyc2lvbiAocHJvZ3JhbV9uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1UnOgotCSAgYWRkX3VuZGVyc2NvcmUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnayc6Ci0JICBraWxsYXQgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBhZGRfc3RkY2FsbF9hbGlhcyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRlZl9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBkb250ZGVsdGVtcHMrKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgYmFzZV9maWxlID0gZm9wZW4gKG9wdGFyZywgRk9QRU5fUkIpOwotCSAgCi0JICBpZiAoIWJhc2VfZmlsZSkKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgZmF0YWwgKF8oIlVuYWJsZSB0byBvcGVuIGJhc2UtZmlsZTogJXMiKSwgb3B0YXJnKTsKLQotCSAgYnJlYWs7Ci0jaWZkZWYgRExMVE9PTF9NQ09SRV9FTEYKLQljYXNlICdNJzoKLQkgIG1jb3JlX2VsZl9vdXRfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0wnOgotCSAgbWNvcmVfZWxmX2xpbmtlciA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgbWNvcmVfZWxmX2xpbmtlcl9mbGFncyA9IG9wdGFyZzsKLQkgIGJyZWFrOwotI2VuZGlmCi0JZGVmYXVsdDoKLQkgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBmb3IgKGkgPSAwOyBtdGFibGVbaV0udHlwZTsgaSsrKQotICAgIGlmIChzdHJjbXAgKG10YWJsZVtpXS50eXBlLCBtbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmICghbXRhYmxlW2ldLnR5cGUpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBmYXRhbCAoXygiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiKSwgbW5hbWUpOwotCi0gIG1hY2hpbmUgPSBpOwotCi0gIGlmICghZGxsX25hbWUgJiYgZXhwX25hbWUpCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoZXhwX25hbWUpICsgNTsKLSAgICAgIGRsbF9uYW1lID0geG1hbGxvYyAobGVuKTsKLSAgICAgIHN0cmNweSAoZGxsX25hbWUsIGV4cF9uYW1lKTsKLSAgICAgIHN0cmNhdCAoZGxsX25hbWUsICIuZGxsIik7Ci0gICAgfQotCi0gIGlmIChhc19uYW1lID09IE5VTEwpCi0gICAgYXNfbmFtZSA9IGRlZHVjZV9uYW1lICgiYXMiKTsKLSAgCi0gIC8qIERvbid0IHVzZSB0aGUgZGVmYXVsdCBleGNsdWRlIGxpc3QgaWYgd2UncmUgcmVhZGluZyBvbmx5IHRoZQotICAgICBzeW1ib2xzIGluIHRoZSAuZHJlY3R2ZSBzZWN0aW9uLiAgVGhlIGRlZmF1bHQgZXhjbHVkZXMgYXJlIG1lYW50Ci0gICAgIHRvIGF2b2lkIGV4cG9ydGluZyBETEwgZW50cnkgcG9pbnQgYW5kIEN5Z3dpbjMyIGltcHVyZV9wdHIuICAqLwotICBpZiAoISBleHBvcnRfYWxsX3N5bWJvbHMpCi0gICAgZG9fZGVmYXVsdF9leGNsdWRlcyA9IGZhbHNlOwotICAKLSAgaWYgKGRvX2RlZmF1bHRfZXhjbHVkZXMpCi0gICAgc2V0X2RlZmF1bHRfZXhjbHVkZXMgKCk7Ci0KLSAgaWYgKGRlZl9maWxlKQotICAgIHByb2Nlc3NfZGVmX2ZpbGUgKGRlZl9maWxlKTsKLQotICB3aGlsZSAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaWYgKCFmaXJzdGFyZykKLQlmaXJzdGFyZyA9IGF2W29wdGluZF07Ci0gICAgICBzY2FuX29ial9maWxlIChhdltvcHRpbmRdKTsKLSAgICAgIG9wdGluZCsrOwotICAgIH0KLQotICBtYW5nbGVfZGVmcyAoKTsKLQotICBpZiAoZXhwX25hbWUpCi0gICAgZ2VuX2V4cF9maWxlICgpOwotICAKLSAgaWYgKGltcF9uYW1lKQotICAgIHsKLSAgICAgIC8qIE1ha2UgaW1wX25hbWUgc2FmZSBmb3IgdXNlIGFzIGEgbGFiZWwuICovCi0gICAgICBjaGFyICpwOwotCi0gICAgICBpbXBfbmFtZV9sYWIgPSB4c3RyZHVwIChpbXBfbmFtZSk7Ci0gICAgICBmb3IgKHAgPSBpbXBfbmFtZV9sYWI7ICpwOyBwKyspCi0JewotCSAgaWYgKCFpc2FscGhhICgodW5zaWduZWQgY2hhcikgKnApICYmICFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApKQotCSAgICAqcCA9ICdfJzsKLQl9Ci0gICAgICBoZWFkX2xhYmVsID0gbWFrZV9sYWJlbCgiX2hlYWRfIiwgaW1wX25hbWVfbGFiKTsKLSAgICAgIGdlbl9saWJfZmlsZSAoKTsKLSAgICB9Ci0gIAotICBpZiAob3V0cHV0X2RlZikKLSAgICBnZW5fZGVmX2ZpbGUgKCk7Ci0gIAotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi0gIGlmIChtY29yZV9lbGZfb3V0X2ZpbGUpCi0gICAgbWNvcmVfZWxmX2dlbl9vdXRfZmlsZSAoKTsKLSNlbmRpZgotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIExvb2sgZm9yIHRoZSBwcm9ncmFtIGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIFBST0dfTkFNRSBhbmQgdGhlCi0gICBzdHJpbmcgcnVubmluZyBmcm9tIFBSRUZJWCB0byBFTkRfUFJFRklYLiAgSWYgdGhlIGNvbmNhdGVuYXRlZAotICAgc3RyaW5nIGNvbnRhaW5zIGEgJy8nLCB0cnkgYXBwZW5kaW5nIEVYRUNVVEFCTEVfU1VGRklYIGlmIGl0IGlzCi0gICBhcHByb3ByaWF0ZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWxvb2tfZm9yX3Byb2cgKHByb2dfbmFtZSwgcHJlZml4LCBlbmRfcHJlZml4KQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgICAgaW50IGVuZF9wcmVmaXg7Ci17Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIGNoYXIgKmNtZDsKLQotICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByZWZpeCkgCi0gICAgICAgICAgICAgICAgICsgc3RybGVuIChwcm9nX25hbWUpIAotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKEVYRUNVVEFCTEVfU1VGRklYKSAKLSNlbmRpZgotCQkgKyAxMCk7Ci0gIHN0cmNweSAoY21kLCBwcmVmaXgpOwotCi0gIHNwcmludGYgKGNtZCArIGVuZF9wcmVmaXgsICIlcyIsIHByb2dfbmFtZSk7Ci0KLSAgaWYgKHN0cmNociAoY21kLCAnLycpICE9IE5VTEwpCi0gICAgewotICAgICAgaW50IGZvdW5kOwotCi0gICAgICBmb3VuZCA9IChzdGF0IChjbWQsICZzKSA9PSAwCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgfHwgc3RhdCAoc3RyY2F0IChjbWQsIEVYRUNVVEFCTEVfU1VGRklYKSwgJnMpID09IDAKLSNlbmRpZgotCSAgICAgICApOwotCi0gICAgICBpZiAoISBmb3VuZCkKLSAgICAgICAgewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGluZm9ybSAoXygiVHJpZWQgZmlsZTogJXMiKSwgY21kKTsKLQkgIGZyZWUgKGNtZCk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGluZm9ybSAoXygiVXNpbmcgZmlsZTogJXMiKSwgY21kKTsKLQotICByZXR1cm4gY21kOwotfQotCi0vKiBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gd2UgYXJlIHdhbnQgdG8gaW52b2tlLgotICAgUFJPR19OQU1FIGlzIHRoZSBiYXNpYyBuYW1lIG9mIHRoZSBwcm9ncmFtIHdlIHdhbnQgdG8gcnVuLAotICAgZWcgImFzIiBvciAibGQiLiAgVGhlIGNhdGNoIGlzIHRoYXQgd2UgbWlnaHQgd2FudCBhY3R1YWxseQotICAgcnVuICJpMzg2LXBlLWFzIiBvciAicHBjLXBlLWxkIi4gIAotCi0gICBJZiBhcmd2WzBdIGNvbnRhaW5zIHRoZSBmdWxsIHBhdGgsIHRoZW4gdHJ5IHRvIGZpbmQgdGhlIHByb2dyYW0KLSAgIGluIHRoZSBzYW1lIHBsYWNlLCB3aXRoIGFuZCB0aGVuIHdpdGhvdXQgYSB0YXJnZXQtbGlrZSBwcmVmaXguCi0KLSAgIEdpdmVuLCBhcmd2WzBdID0gL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1kbGx0b29sLAotICAgZGVkdWNlX25hbWUoImFzIikgdXNlcyB0aGUgZm9sbG93aW5nIHNlYXJjaCBvcmRlcjogCi0KLSAgICAgL3Vzci9sb2NhbC9iaW4vaTU4Ni1jeWd3aW4zMi1hcwotICAgICAvdXNyL2xvY2FsL2Jpbi9hcwotICAgICBhcwotICAgCi0gICBJZiB0aGVyZSdzIGFuIEVYRUNVVEFCTEVfU1VGRklYLCBpdCdsbCB1c2UgdGhhdCBhcyB3ZWxsOyBmb3IgZWFjaAotICAgbmFtZSwgaXQnbGwgdHJ5IHdpdGhvdXQgYW5kIHRoZW4gd2l0aCBFWEVDVVRBQkxFX1NVRkZJWC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSBpNTg2LWN5Z3dpbjMyLWRsbHRvb2wsIGl0IHdpbGwgbm90IGV2ZW4gdHJ5ICJhcyIKLSAgIGFzIHRoZSBmYWxsYmFjaywgYnV0IHJhdGhlciByZXR1cm4gaTU4Ni1jeWd3aW4zMi1hcy4KLSAgICAgCi0gICBPaCwgYW5kIGdpdmVuLCBhcmd2WzBdID0gZGxsdG9vbCwgaXQnbGwgcmV0dXJuICJhcyIuCi0KLSAgIFJldHVybnMgYSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZGVkdWNlX25hbWUgKHByb2dfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcHJvZ19uYW1lOwotewotICBjaGFyICpjbWQ7Ci0gIGNoYXIgKmRhc2gsICpzbGFzaCwgKmNwOwotCi0gIGRhc2ggPSBOVUxMOwotICBzbGFzaCA9IE5VTEw7Ci0gIGZvciAoY3AgPSBwcm9ncmFtX25hbWU7ICpjcCAhPSAnXDAnOyArK2NwKQotICAgIHsKLSAgICAgIGlmICgqY3AgPT0gJy0nKQotCWRhc2ggPSBjcDsKLSAgICAgIGlmICgKLSNpZiBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX1dJTjMyX18pCi0JICAqY3AgPT0gJzonIHx8ICpjcCA9PSAnXFwnIHx8Ci0jZW5kaWYKLQkgICpjcCA9PSAnLycpCi0JewotCSAgc2xhc2ggPSBjcDsKLQkgIGRhc2ggPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgY21kID0gTlVMTDsKLQotICBpZiAoZGFzaCAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEZpcnN0LCB0cnkgbG9va2luZyBmb3IgYSBwcmVmaXhlZCBQUk9HX05BTUUgaW4gdGhlCi0gICAgICAgICBQUk9HUkFNX05BTUUgZGlyZWN0b3J5LCB3aXRoIHRoZSBzYW1lIHByZWZpeCBhcyBQUk9HUkFNX05BTUUuICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIGRhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKHNsYXNoICE9IE5VTEwgJiYgY21kID09IE5VTEwpCi0gICAgewotICAgICAgLyogTmV4dCwgdHJ5IGxvb2tpbmcgZm9yIGEgUFJPR19OQU1FIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcwotICAgICAgICAgdGhhdCBvZiB0aGlzIHByb2dyYW0uICAqLwotICAgICAgY21kID0gbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcm9ncmFtX25hbWUsIHNsYXNoIC0gcHJvZ3JhbV9uYW1lICsgMSk7Ci0gICAgfQotCi0gIGlmIChjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBKdXN0IHJldHVybiBQUk9HX05BTUUgYXMgaXMuICAqLwotICAgICAgY21kID0geHN0cmR1cCAocHJvZ19uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNtZDsKLX0KLQotI2lmZGVmIERMTFRPT0xfTUNPUkVfRUxGCi10eXBlZGVmIHN0cnVjdCBmbmFtZV9jYWNoZQotewotICBjaGFyICogICAgICAgICAgICAgICBmaWxlbmFtZTsKLSAgc3RydWN0IGZuYW1lX2NhY2hlICogbmV4dDsKLX0KLWZuYW1lX2NhY2hlOwotCi1zdGF0aWMgZm5hbWVfY2FjaGUgZm5hbWVzOwotCi1zdGF0aWMgdm9pZAotbWNvcmVfZWxmX2NhY2hlX2ZpbGVuYW1lIChjaGFyICogZmlsZW5hbWUpCi17Ci0gIGZuYW1lX2NhY2hlICogcHRyOwotCi0gIHB0ciA9ICYgZm5hbWVzOwotCi0gIHdoaWxlIChwdHItPm5leHQgIT0gTlVMTCkKLSAgICBwdHIgPSBwdHItPm5leHQ7Ci0KLSAgcHRyLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBwdHItPm5leHQgICAgID0gKGZuYW1lX2NhY2hlICopIG1hbGxvYyAoc2l6ZW9mIChmbmFtZV9jYWNoZSkpOwotICBpZiAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgcHRyLT5uZXh0LT5uZXh0ID0gTlVMTDsKLX0KLQotI2RlZmluZSBNQ09SRV9FTEZfVE1QX09CSiAibWNvcmVlbGYubyIKLSNkZWZpbmUgTUNPUkVfRUxGX1RNUF9FWFAgIm1jb3JlZWxmLmV4cCIKLSNkZWZpbmUgTUNPUkVfRUxGX1RNUF9MSUIgIm1jb3JlZWxmLmxpYiIKLQotc3RhdGljIHZvaWQKLW1jb3JlX2VsZl9nZW5fb3V0X2ZpbGUgKHZvaWQpCi17Ci0gIGZuYW1lX2NhY2hlICogcHRyOwotICBkeW5fc3RyaW5nX3QgZHM7Ci0KLSAgLyogU3RlcCBvbmUuICBSdW4gJ2xkIC1yJyBvbiB0aGUgaW5wdXQgb2JqZWN0IGZpbGVzIGluIG9yZGVyIHRvIHJlc29sdmUKLSAgICAgYW55IGludGVybmFsIHJlZmVyZW5jZXMgYW5kIHRvIGdlbmVyYXRlIGEgc2luZ2xlIC5leHBvcnRzIHNlY3Rpb24uICAqLwotICBwdHIgPSAmIGZuYW1lczsKLQotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICItciAiKTsKLQotICBpZiAobWNvcmVfZWxmX2xpbmtlcl9mbGFncyAhPSBOVUxMKQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgbWNvcmVfZWxmX2xpbmtlcl9mbGFncyk7Ci0gIAotICB3aGlsZSAocHRyLT5uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBwdHItPmZpbGVuYW1lKTsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAiKTsKLQotICAgICAgcHRyID0gcHRyLT5uZXh0OwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICItbyAiKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXIgPT0gTlVMTCkKLSAgICBtY29yZV9lbGZfbGlua2VyID0gZGVkdWNlX25hbWUgKCJsZCIpOwotICAKLSAgcnVuIChtY29yZV9lbGZfbGlua2VyLCBkcy0+cyk7Ci0KLSAgZHluX3N0cmluZ19kZWxldGUgKGRzKTsKLQotICAvKiBTdGVwIHR3by4gQ3JlYXRlIGEgLmV4cCBmaWxlIGFuZCBhIC5saWIgZmlsZSBmcm9tIHRoZSB0ZW1wb3JhcnkgZmlsZS4gCi0gICAgIERvIHRoaXMgYnkgcmVjdXJzaXZlbHkgaW52b2tpbmcgZGxsdG9vbC4uLi4qLwotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1TICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIGFzX25hbWUpOwotICAKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1lICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfRVhQKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC1sICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsIE1DT1JFX0VMRl9UTVBfTElCKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiICIgKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBNQ09SRV9FTEZfVE1QX09CSik7Ci0KLSAgaWYgKHZlcmJvc2UpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCAiIC12Iik7Ci0gIAotICBpZiAoZG9udGRlbHRlbXBzKQotICAgIHsKLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbiIpOwotICAKLSAgICAgIGlmIChkb250ZGVsdGVtcHMgPiAxKQotCWR5bl9zdHJpbmdfYXBwZW5kIChkcywgIiAtbiIpOwotICAgIH0KLQotICAvKiBYWFggLSBGSU1FOiBvdWdodCB0byBjaGVjay9jb3B5IG90aGVyIGNvbW1hbmQgbGluZSBvcHRpb25zIGFzIHdlbGwuICAqLwotICAKLSAgcnVuIChwcm9ncmFtX25hbWUsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIC8qIFN0ZXAgZm91ci4gRmVlZCB0aGUgLmV4cCBhbmQgb2JqZWN0IGZpbGVzIHRvIGxkIC1zaGFyZWQgdG8gY3JlYXRlIHRoZSBkbGwuICAqLwotICBkcyA9IGR5bl9zdHJpbmdfbmV3ICgxMDApOwotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgIi1zaGFyZWQgIik7Ci0KLSAgaWYgKG1jb3JlX2VsZl9saW5rZXJfZmxhZ3MpCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKGRzLCBtY29yZV9lbGZfbGlua2VyX2ZsYWdzKTsKLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9FWFApOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgTUNPUkVfRUxGX1RNUF9PQkopOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHMsICIgLW8gIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcywgbWNvcmVfZWxmX291dF9maWxlKTsKLQotICBydW4gKG1jb3JlX2VsZl9saW5rZXIsIGRzLT5zKTsKLQotICBkeW5fc3RyaW5nX2RlbGV0ZSAoZHMpOwotCi0gIGlmIChkb250ZGVsdGVtcHMgPT0gMCkKLSAgICB1bmxpbmsgKE1DT1JFX0VMRl9UTVBfRVhQKTsKLQotICBpZiAoZG9udGRlbHRlbXBzIDwgMikKLSAgICB1bmxpbmsgKE1DT1JFX0VMRl9UTVBfT0JKKTsKLX0KLSNlbmRpZiAvKiBETExUT09MX01DT1JFX0VMRiAqLwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZGxsdG9vbC5oIGIvYmludXRpbHMvZGxsdG9vbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE2N2M4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2RsbHRvb2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIGRsbHRvb2wuaCAtLSBoZWFkZXIgZmlsZSBmb3IgZGxsdG9vbAotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1leHRlcm4gdm9pZCBkZWZfY29kZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9kYXRhIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2Rlc2NyaXB0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmX2V4cG9ydHMKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQsIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX2hlYXBzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfaW1wb3J0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfbGlicmFyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgZGVmX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZl9zZWN0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfc3RhY2tzaXplIFBBUkFNUyAoKGludCwgaW50KSk7Ci1leHRlcm4gdm9pZCBkZWZfdmVyc2lvbiBQQVJBTVMgKChpbnQsIGludCkpOwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBpbnQgeXlkZWJ1ZzsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIEZJTEUgKnl5aW47Ci1leHRlcm4gaW50IGxpbmVudW1iZXI7CmRpZmYgLS1naXQgYS9iaW51dGlscy9kbGx3cmFwLmMgYi9iaW51dGlscy9kbGx3cmFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjA2ZmIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvZGxsd3JhcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzMyArMCwwIEBACi0vKiBkbGx3cmFwLmMgLS0gd3JhcHBlciBmb3IgRExMVE9PTCBhbmQgR0NDIHRvIGdlbmVyYXRlIFBFIHN0eWxlIERMTHMKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE11bWl0IEtoYW4gKGtoYW5AeHJheWxpdGgud2lzYy5lZHUpLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBSVggcmVxdWlyZXMgdGhpcyB0byBiZSB0aGUgZmlyc3QgdGhpbmcgaW4gdGhlIGZpbGUuICAqLwotI2lmbmRlZiBfX0dOVUNfXwotIyBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NZU19XQUlUX0gKLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2Vsc2UgLyogISBIQVZFX1NZU19XQUlUX0ggKi8KLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2lmbmRlZiBXSUZFWElURUQKLSNkZWZpbmUgV0lGRVhJVEVEKHcpCSgoKHcpJjAzNzcpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAwMTc3KQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpID4+IDgpICYgMDM3NykKLSNlbmRpZgotI2Vsc2UgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSAmIDB4ZmYpID09IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykgJiAweGZmKSAhPSAwICYmICgodykgJiAweGZmKSAhPSAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdURVJNU0lHCi0jZGVmaW5lIFdURVJNU0lHKHcpCSgodykgJiAweDdmKQotI2VuZGlmCi0jaWZuZGVmIFdFWElUU1RBVFVTCi0jZGVmaW5lIFdFWElUU1RBVFVTKHcpCSgoKHcpICYgMHhmZjAwKSA+PiA4KQotI2VuZGlmCi0jZW5kaWYgLyogZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykgKi8KLSNlbmRpZiAvKiAhIEhBVkVfU1lTX1dBSVRfSCAqLwotCi1zdGF0aWMgY2hhciAqcHJvZ3JhbV92ZXJzaW9uID0gIjAuMi40IjsKLXN0YXRpYyBjaGFyICpkcml2ZXJfbmFtZSA9IE5VTEw7Ci1zdGF0aWMgY2hhciAqY3lnd2luX2RyaXZlcl9mbGFncyA9IAotICAiLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMiOwotc3RhdGljIGNoYXIgKm1pbmd3MzJfZHJpdmVyX2ZsYWdzID0gIi1tZGxsIjsKLXN0YXRpYyBjaGFyICpnZW5lcmljX2RyaXZlcl9mbGFncyA9ICItV2wsLS1kbGwiOwotCi1zdGF0aWMgY2hhciAqZW50cnlfcG9pbnQ7Ci0KLXN0YXRpYyBjaGFyICpkbGx0b29sX25hbWUgPSBOVUxMOwotCi1zdGF0aWMgY2hhciAqdGFyZ2V0ID0gVEFSR0VUOwotCi10eXBlZGVmIGVudW0gewotICBVTktOT1dOX1RBUkdFVCwgCi0gIENZR1dJTl9UQVJHRVQsIAotICBNSU5HVzMyX1RBUkdFVAotfSAKLXRhcmdldF90eXBlOwotCi1zdGF0aWMgdGFyZ2V0X3R5cGUgd2hpY2hfdGFyZ2V0ID0gVU5LTk9XTl9UQVJHRVQ7Ci0KLXN0YXRpYyBpbnQgZG9udGRlbHRlbXBzID0gMDsKLXN0YXRpYyBpbnQgZHJ5X3J1biA9IDA7Ci0KLXN0YXRpYyBjaGFyICpwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyBpbnQgdmVyYm9zZSA9IDA7Ci0KLXN0YXRpYyBjaGFyICpkbGxfZmlsZV9uYW1lOwotc3RhdGljIGNoYXIgKmRsbF9uYW1lOwotc3RhdGljIGNoYXIgKmJhc2VfZmlsZV9uYW1lOwotc3RhdGljIGNoYXIgKmV4cF9maWxlX25hbWU7Ci1zdGF0aWMgY2hhciAqZGVmX2ZpbGVfbmFtZTsKLXN0YXRpYyBpbnQgZGVsZXRlX2Jhc2VfZmlsZSA9IDE7Ci1zdGF0aWMgaW50IGRlbGV0ZV9leHBfZmlsZSA9IDE7Ci1zdGF0aWMgaW50IGRlbGV0ZV9kZWZfZmlsZSA9IDE7Ci0KLXN0YXRpYyBpbnQgcnVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheSBQQVJBTVMgKChjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluZm9ybSBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIGNoYXIgKmxvb2tfZm9yX3Byb2cgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGNoYXIgKmRlZHVjZV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZGVsZXRlX3RlbXBfZmlsZXMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgY2xlYW51cF9hbmRfZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQbGVhc2Uga2VlcCB0aGUgZm9sbG93aW5nIDQgcm91dGluZXMgaW4gc3luYyB3aXRoIGRsbHRvb2wuYzoKLSAgICAgZGlzcGxheSAoKQotICAgICBpbmZvcm0gKCkKLSAgICAgbG9va19mb3JfcHJvZyAoKQotICAgICBkZWR1Y2VfbmFtZSAoKQotICAgSXQncyBub3Qgd29ydGggdGhlIGhhc3NsZSB0byBicmVhayB0aGVzZSBvdXQgc2luY2UgZGxsd3JhcCB3aWxsCi0gICAoaG9wZWZ1bGx5KSBzb29uIGJlIHJldGlyZWQgaW4gZmF2b3Igb2YgYGxkIC0tc2hhcmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlOwotICAgICB2YV9saXN0ICAgICAgYXJnczsKLXsKLSAgaWYgKHByb2dyYW1fbmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCi0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotCi0gIGlmIChtZXNzYWdlIFtzdHJsZW4gKG1lc3NhZ2UpIC0gMV0gIT0gJ1xuJykKLSAgICBmcHV0YyAoJ1xuJywgc3RkZXJyKTsKLX0gIAotCi0KLXN0YXRpYyB2b2lkCi0jaWZkZWYgX19TVERDX18KLWluZm9ybSAoY29uc3QgY2hhciAqIG1lc3NhZ2UsIC4uLikKLSNlbHNlCi1pbmZvcm0gKG1lc3NhZ2UsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICogbWVzc2FnZTsKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmdzOwotICAKLSAgaWYgKCF2ZXJib3NlKQotICAgIHJldHVybjsKLQotI2lmZGVmIF9fU1REQ19fCi0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSNlbmRpZgotCi0gIGRpc3BsYXkgKG1lc3NhZ2UsIGFyZ3MpOwotICAKLSAgdmFfZW5kIChhcmdzKTsKLX0KLQotLyogTG9vayBmb3IgdGhlIHByb2dyYW0gZm9ybWVkIGJ5IGNvbmNhdGVuYXRpbmcgUFJPR19OQU1FIGFuZCB0aGUKLSAgIHN0cmluZyBydW5uaW5nIGZyb20gUFJFRklYIHRvIEVORF9QUkVGSVguICBJZiB0aGUgY29uY2F0ZW5hdGVkCi0gICBzdHJpbmcgY29udGFpbnMgYSAnLycsIHRyeSBhcHBlbmRpbmcgRVhFQ1VUQUJMRV9TVUZGSVggaWYgaXQgaXMKLSAgIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotbG9va19mb3JfcHJvZyAocHJvZ19uYW1lLCBwcmVmaXgsIGVuZF9wcmVmaXgpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJlZml4OwotICAgICBpbnQgZW5kX3ByZWZpeDsKLXsKLSAgc3RydWN0IHN0YXQgczsKLSAgY2hhciAqY21kOwotCi0gIGNtZCA9IHhtYWxsb2MgKHN0cmxlbiAocHJlZml4KSAKLSAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKHByb2dfbmFtZSkgCi0jaWZkZWYgSEFWRV9FWEVDVVRBQkxFX1NVRkZJWAotICAgICAgICAgICAgICAgICArIHN0cmxlbiAoRVhFQ1VUQUJMRV9TVUZGSVgpIAotI2VuZGlmCi0JCSArIDEwKTsKLSAgc3RyY3B5IChjbWQsIHByZWZpeCk7Ci0KLSAgc3ByaW50ZiAoY21kICsgZW5kX3ByZWZpeCwgIiVzIiwgcHJvZ19uYW1lKTsKLQotICBpZiAoc3RyY2hyIChjbWQsICcvJykgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgZm91bmQ7Ci0KLSAgICAgIGZvdW5kID0gKHN0YXQgKGNtZCwgJnMpID09IDAKLSNpZmRlZiBIQVZFX0VYRUNVVEFCTEVfU1VGRklYCi0gICAgICAgICAgICAgICB8fCBzdGF0IChzdHJjYXQgKGNtZCwgRVhFQ1VUQUJMRV9TVUZGSVgpLCAmcykgPT0gMAotI2VuZGlmCi0JICAgICAgICk7Ci0KLSAgICAgIGlmICghIGZvdW5kKQotICAgICAgICB7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgaW5mb3JtIChfKCJUcmllZCBmaWxlOiAlcyIpLCBjbWQpOwotCSAgZnJlZSAoY21kKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgaW5mb3JtIChfKCJVc2luZyBmaWxlOiAlcyIpLCBjbWQpOwotCi0gIHJldHVybiBjbWQ7Ci19Ci0KLS8qIERlZHVjZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB3ZSBhcmUgd2FudCB0byBpbnZva2UuCi0gICBQUk9HX05BTUUgaXMgdGhlIGJhc2ljIG5hbWUgb2YgdGhlIHByb2dyYW0gd2Ugd2FudCB0byBydW4sCi0gICBlZyAiYXMiIG9yICJsZCIuICBUaGUgY2F0Y2ggaXMgdGhhdCB3ZSBtaWdodCB3YW50IGFjdHVhbGx5Ci0gICBydW4gImkzODYtcGUtYXMiIG9yICJwcGMtcGUtbGQiLiAgCi0KLSAgIElmIGFyZ3ZbMF0gY29udGFpbnMgdGhlIGZ1bGwgcGF0aCwgdGhlbiB0cnkgdG8gZmluZCB0aGUgcHJvZ3JhbQotICAgaW4gdGhlIHNhbWUgcGxhY2UsIHdpdGggYW5kIHRoZW4gd2l0aG91dCBhIHRhcmdldC1saWtlIHByZWZpeC4KLQotICAgR2l2ZW4sIGFyZ3ZbMF0gPSAvdXNyL2xvY2FsL2Jpbi9pNTg2LWN5Z3dpbjMyLWRsbHRvb2wsCi0gICBkZWR1Y2VfbmFtZSgiYXMiKSB1c2VzIHRoZSBmb2xsb3dpbmcgc2VhcmNoIG9yZGVyOiAKLQotICAgICAvdXNyL2xvY2FsL2Jpbi9pNTg2LWN5Z3dpbjMyLWFzCi0gICAgIC91c3IvbG9jYWwvYmluL2FzCi0gICAgIGFzCi0gICAKLSAgIElmIHRoZXJlJ3MgYW4gRVhFQ1VUQUJMRV9TVUZGSVgsIGl0J2xsIHVzZSB0aGF0IGFzIHdlbGw7IGZvciBlYWNoCi0gICBuYW1lLCBpdCdsbCB0cnkgd2l0aG91dCBhbmQgdGhlbiB3aXRoIEVYRUNVVEFCTEVfU1VGRklYLgotCi0gICBHaXZlbiwgYXJndlswXSA9IGk1ODYtY3lnd2luMzItZGxsdG9vbCwgaXQgd2lsbCBub3QgZXZlbiB0cnkgImFzIgotICAgYXMgdGhlIGZhbGxiYWNrLCBidXQgcmF0aGVyIHJldHVybiBpNTg2LWN5Z3dpbjMyLWFzLgotICAgICAKLSAgIE9oLCBhbmQgZ2l2ZW4sIGFyZ3ZbMF0gPSBkbGx0b29sLCBpdCdsbCByZXR1cm4gImFzIi4KLQotICAgUmV0dXJucyBhIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBzdHJpbmcuICAqLwotCi1zdGF0aWMgY2hhciAqCi1kZWR1Y2VfbmFtZSAocHJvZ19uYW1lKQotICAgICBjb25zdCBjaGFyICpwcm9nX25hbWU7Ci17Ci0gIGNoYXIgKmNtZDsKLSAgY2hhciAqZGFzaCwgKnNsYXNoLCAqY3A7Ci0KLSAgZGFzaCA9IE5VTEw7Ci0gIHNsYXNoID0gTlVMTDsKLSAgZm9yIChjcCA9IHByb2dyYW1fbmFtZTsgKmNwICE9ICdcMCc7ICsrY3ApCi0gICAgewotICAgICAgaWYgKCpjcCA9PSAnLScpCi0JZGFzaCA9IGNwOwotICAgICAgaWYgKAotI2lmIGRlZmluZWQoX19ESkdQUF9fKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykKLQkgICpjcCA9PSAnOicgfHwgKmNwID09ICdcXCcgfHwKLSNlbmRpZgotCSAgKmNwID09ICcvJykKLQl7Ci0JICBzbGFzaCA9IGNwOwotCSAgZGFzaCA9IE5VTEw7Ci0JfQotICAgIH0KLQotICBjbWQgPSBOVUxMOwotCi0gIGlmIChkYXNoICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRmlyc3QsIHRyeSBsb29raW5nIGZvciBhIHByZWZpeGVkIFBST0dfTkFNRSBpbiB0aGUKLSAgICAgICAgIFBST0dSQU1fTkFNRSBkaXJlY3RvcnksIHdpdGggdGhlIHNhbWUgcHJlZml4IGFzIFBST0dSQU1fTkFNRS4gICovCi0gICAgICBjbWQgPSBsb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByb2dyYW1fbmFtZSwgZGFzaCAtIHByb2dyYW1fbmFtZSArIDEpOwotICAgIH0KLQotICBpZiAoc2xhc2ggIT0gTlVMTCAmJiBjbWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBOZXh0LCB0cnkgbG9va2luZyBmb3IgYSBQUk9HX05BTUUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzCi0gICAgICAgICB0aGF0IG9mIHRoaXMgcHJvZ3JhbS4gICovCi0gICAgICBjbWQgPSBsb29rX2Zvcl9wcm9nIChwcm9nX25hbWUsIHByb2dyYW1fbmFtZSwgc2xhc2ggLSBwcm9ncmFtX25hbWUgKyAxKTsKLSAgICB9Ci0KLSAgaWYgKGNtZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIEp1c3QgcmV0dXJuIFBST0dfTkFNRSBhcyBpcy4gICovCi0gICAgICBjbWQgPSB4c3RyZHVwIChwcm9nX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gY21kOwotfQotCi1zdGF0aWMgdm9pZAotZGVsZXRlX3RlbXBfZmlsZXMgKCkKLXsKLSAgaWYgKGRlbGV0ZV9iYXNlX2ZpbGUgJiYgYmFzZV9maWxlX25hbWUpCi0gICAgewotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGJhc2UgZmlsZSAlc1xuIiwKLQkJIGRvbnRkZWx0ZW1wcyA/ICJLZWVwaW5nIiA6ICJEZWxldGluZyIsCi0JICAgICAgICAgYmFzZV9maWxlX25hbWUpOwotICAgICAgaWYgKCEgZG9udGRlbHRlbXBzKQotICAgICAgICB7Ci0gICAgICAgICAgdW5saW5rIChiYXNlX2ZpbGVfbmFtZSk7Ci0JICBmcmVlIChiYXNlX2ZpbGVfbmFtZSk7Ci0JfQotICAgIH0KLSAgCi0gIGlmIChkZWxldGVfZXhwX2ZpbGUgJiYgZXhwX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBpZiAodmVyYm9zZSkKLQlmcHJpbnRmIChzdGRlcnIsICIlcyB0ZW1wb3JhcnkgZXhwIGZpbGUgJXNcbiIsCi0JCSBkb250ZGVsdGVtcHMgPyAiS2VlcGluZyIgOiAiRGVsZXRpbmciLAotCSAgICAgICAgIGV4cF9maWxlX25hbWUpOwotICAgICAgaWYgKCEgZG9udGRlbHRlbXBzKQotICAgICAgICB7Ci0gICAgICAgICAgdW5saW5rIChleHBfZmlsZV9uYW1lKTsKLSAgICAgICAgICBmcmVlIChleHBfZmlsZV9uYW1lKTsKLQl9Ci0gICAgfQotICBpZiAoZGVsZXRlX2RlZl9maWxlICYmIGRlZl9maWxlX25hbWUpCi0gICAgewotICAgICAgaWYgKHZlcmJvc2UpCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgdGVtcG9yYXJ5IGRlZiBmaWxlICVzXG4iLAotCQkgZG9udGRlbHRlbXBzID8gIktlZXBpbmciIDogIkRlbGV0aW5nIiwKLQkgICAgICAgICBkZWZfZmlsZV9uYW1lKTsKLSAgICAgIGlmICghIGRvbnRkZWx0ZW1wcykKLSAgICAgICAgewotICAgICAgICAgIHVubGluayAoZGVmX2ZpbGVfbmFtZSk7Ci0gICAgICAgICAgZnJlZSAoZGVmX2ZpbGVfbmFtZSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgCi1jbGVhbnVwX2FuZF9leGl0IChpbnQgc3RhdHVzKQotewotICBkZWxldGVfdGVtcF9maWxlcyAoKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLSAgCi1zdGF0aWMgaW50Ci1ydW4gKHdoYXQsIGFyZ3MpCi0gICAgIGNvbnN0IGNoYXIgKndoYXQ7Ci0gICAgIGNoYXIgKmFyZ3M7Ci17Ci0gIGNoYXIgKnM7Ci0gIGludCBwaWQsIHdhaXRfc3RhdHVzLCByZXRjb2RlOwotICBpbnQgaTsKLSAgY29uc3QgY2hhciAqKmFyZ3Y7Ci0gIGNoYXIgKmVycm1zZ19mbXQsICplcnJtc2dfYXJnOwotICBjaGFyICp0ZW1wX2Jhc2UgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBpbnQgaW5fcXVvdGU7Ci0gIGNoYXIgc2VwOwotCi0gIGlmICh2ZXJib3NlIHx8IGRyeV9ydW4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXMgJXNcbiIsIHdoYXQsIGFyZ3MpOwotCi0gIC8qIENvdW50IHRoZSBhcmdzICovCi0gIGkgPSAwOwotICBmb3IgKHMgPSBhcmdzOyAqczsgcysrKQotICAgIGlmICgqcyA9PSAnICcpCi0gICAgICBpKys7Ci0gIGkrKzsKLSAgYXJndiA9IGFsbG9jYSAoc2l6ZW9mIChjaGFyICopICogKGkgKyAzKSk7Ci0gIGkgPSAwOwotICBhcmd2W2krK10gPSB3aGF0OwotICBzID0gYXJnczsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgd2hpbGUgKCpzID09ICcgJyAmJiAqcyAhPSAwKQotCXMrKzsKLSAgICAgIGlmICgqcyA9PSAwKQotCWJyZWFrOwotICAgICAgaW5fcXVvdGUgPSAoKnMgPT0gJ1wnJyB8fCAqcyA9PSAnIicpOwotICAgICAgc2VwID0gKGluX3F1b3RlKSA/ICpzKysgOiAnICc7Ci0gICAgICBhcmd2W2krK10gPSBzOwotICAgICAgd2hpbGUgKCpzICE9IHNlcCAmJiAqcyAhPSAwKQotCXMrKzsKLSAgICAgIGlmICgqcyA9PSAwKQotCWJyZWFrOwotICAgICAgKnMrKyA9IDA7Ci0gICAgICBpZiAoaW5fcXVvdGUpCi0gICAgICAgIHMrKzsKLSAgICB9Ci0gIGFyZ3ZbaSsrXSA9IE5VTEw7Ci0KLSAgaWYgKGRyeV9ydW4pCi0gICAgcmV0dXJuIDA7Ci0KLSAgcGlkID0gcGV4ZWN1dGUgKGFyZ3ZbMF0sIChjaGFyICogY29uc3QgKikgYXJndiwgcHJvZ3JhbV9uYW1lLCB0ZW1wX2Jhc2UsCi0JCSAgJmVycm1zZ19mbXQsICZlcnJtc2dfYXJnLCBQRVhFQ1VURV9PTkUgfCBQRVhFQ1VURV9TRUFSQ0gpOwotCi0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgaW50IGVycm5vX3ZhbCA9IGVycm5vOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6ICVzXG4iLCBzdHJlcnJvciAoZXJybm9fdmFsKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0Y29kZSA9IDA7Ci0gIHBpZCA9IHB3YWl0IChwaWQsICZ3YWl0X3N0YXR1cywgMCk7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHdhaXQ6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgICAgcmV0Y29kZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChXSUZTSUdOQUxFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiBzdWJwcm9jZXNzIGdvdCBmYXRhbCBzaWduYWwgJWRcbiIsCi0JICAgICAgIHByb2dyYW1fbmFtZSwgV1RFUk1TSUcgKHdhaXRfc3RhdHVzKSk7Ci0gICAgICByZXRjb2RlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFdJRkVYSVRFRCAod2FpdF9zdGF0dXMpKQotICAgIHsKLSAgICAgIGlmIChXRVhJVFNUQVRVUyAod2FpdF9zdGF0dXMpICE9IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIiwKLQkgIAkgICBwcm9ncmFtX25hbWUsIHdoYXQsIFdFWElUU1RBVFVTICh3YWl0X3N0YXR1cykpOwotCSAgcmV0Y29kZSA9IDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHJldGNvZGUgPSAxOwotICAKLSAgcmV0dXJuIHJldGNvZGU7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLW15YmFzZW5hbWUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKmJhc2UgPSBuYW1lOwotCi0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUgPT0gJy8nIHx8ICpuYW1lID09ICdcXCcpCi0JewotCSAgYmFzZSA9IG5hbWUgKyAxOwotCX0KLSAgICAgICsrbmFtZTsKLSAgICB9Ci0gIHJldHVybiAoY2hhciAqKSBiYXNlOwotfQotCi1zdGF0aWMgaW50IAotc3RyaGFzaCAoY29uc3QgY2hhciAqc3RyKQotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzOwotICB1bnNpZ25lZCBsb25nIGhhc2g7Ci0gIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgbGVuOwotCi0gIGhhc2ggPSAwOwotICBsZW4gPSAwOwotICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyOwotICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggKz0gYyArIChjIDw8IDE3KTsKLSAgICAgIGhhc2ggXj0gaGFzaCA+PiAyOwotICAgICAgKytsZW47Ci0gICAgfQotICBoYXNoICs9IGxlbiArIChsZW4gPDwgMTcpOwotICBoYXNoIF49IGhhc2ggPj4gMjsKLQotICByZXR1cm4gaGFzaDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLXByaW50X3ZlcnNpb24gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoIkdOVSAlcyAlc1xuIiwgbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKLSAgcHJpbnRmICgiQ29weXJpZ2h0IDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKTsKLSAgcHJpbnRmICgiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuXAotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhpcyBwcm9ncmFtIGhhcyBhYnNvbHV0ZWx5IG5vIHdhcnJhbnR5LlxuIik7Ci0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIiwgcHJvZ3JhbV9uYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgR2VuZXJpYyBvcHRpb25zOlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXF1aWV0LCAtcSAgICAgICAgICAgIFdvcmsgcXVpZXRseVxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLXZlcmJvc2UsIC12ICAgICAgICAgIFZlcmJvc2VcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS12ZXJzaW9uICAgICAgICAgICAgICBQcmludCBkbGx3cmFwIHZlcnNpb25cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1pbXBsaWIgPG91dG5hbWU+ICAgICBTeW5vbnltIGZvciAtLW91dHB1dC1saWJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICBPcHRpb25zIGZvciAlczpcbiIsIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRyaXZlci1uYW1lIDxkcml2ZXI+IERlZmF1bHRzIHRvIFwiZ2NjXCJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcml2ZXItZmxhZ3MgPGZsYWdzPiBPdmVycmlkZSBkZWZhdWx0IGxkIGZsYWdzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGxsdG9vbC1uYW1lIDxkbGx0b29sPiBEZWZhdWx0cyB0byBcImRsbHRvb2xcIlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWVudHJ5IDxlbnRyeT4gICAgICAgIFNwZWNpZnkgYWx0ZXJuYXRlIERMTCBlbnRyeSBwb2ludFxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWltYWdlLWJhc2UgPGJhc2U+ICAgIFNwZWNpZnkgaW1hZ2UgYmFzZSBhZGRyZXNzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tdGFyZ2V0IDxtYWNoaW5lPiAgICAgaTM4Ni1jeWd3aW4zMiBvciBpMzg2LW1pbmd3MzJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1kcnktcnVuICAgICAgICAgICAgICBTaG93IHdoYXQgbmVlZHMgdG8gYmUgcnVuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbW5vLWN5Z3dpbiAgICAgICAgICAgQ3JlYXRlIE1pbmd3IERMTFxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgIE9wdGlvbnMgcGFzc2VkIHRvIERMTFRPT0w6XG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbWFjaGluZSA8bWFjaGluZT5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBleHBvcnQgZmlsZS5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtbGliIDxvdXRuYW1lPiBHZW5lcmF0ZSBpbnB1dCBsaWJyYXJ5LlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWRsbG5hbWUgPG5hbWU+ICAgICAgIE5hbWUgb2YgaW5wdXQgZGxsIHRvIHB1dCBpbnRvIG91dHB1dCBsaWIuXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZGVmIDxkZWZmaWxlPiAgICAgICAgTmFtZSBpbnB1dCAuZGVmIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1vdXRwdXQtZGVmIDxkZWZmaWxlPiBOYW1lIG91dHB1dCAuZGVmIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgIEV4cG9ydCBhbGwgc3ltYm9scyB0byAuZGVmXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCAuZHJlY3R2ZSBzeW1ib2xzXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC0tZXhjbHVkZS1zeW1ib2xzIDxsaXN0PiBFeGNsdWRlIDxsaXN0PiBmcm9tIC5kZWZcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1kZWZhdWx0LWV4Y2x1ZGVzICAgIFphcCBkZWZhdWx0IGV4Y2x1ZGUgc3ltYm9sc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWJhc2UtZmlsZSA8YmFzZWZpbGU+IFJlYWQgbGlua2VyIGdlbmVyYXRlZCBiYXNlIGZpbGVcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLS1uby1pZGF0YTQgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGlkYXRhJDQgc2VjdGlvblxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vLWlkYXRhNSAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNSBzZWN0aW9uXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIiAgIC1VICAgICAgICAgICAgICAgICAgICAgQWRkIHVuZGVyc2NvcmVzIHRvIC5saWJcbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICAgLWsgICAgICAgICAgICAgICAgICAgICBLaWxsIEA8bj4gZnJvbSBleHBvcnRlZCBuYW1lc1xuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFkZC1zdGRjYWxsLWFsaWFzICAgIEFkZCBhbGlhc2VzIHdpdGhvdXQgQDxuPlxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlclxuIik7Ci0gIGZwcmludGYgKGZpbGUsICIgICAtLW5vZGVsZXRlICAgICAgICAgICAgIEtlZXAgdGVtcCBmaWxlcy5cbiIpOwotICBmcHJpbnRmIChmaWxlLCAiICBSZXN0IGFyZSBwYXNzZWQgdW5tb2RpZmllZCB0byB0aGUgbGFuZ3VhZ2UgZHJpdmVyXG4iKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuXG4iKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotI2RlZmluZSBPUFRJT05fU1RBUlQJCTE0OQotCi0vKiBHRU5FUklDIG9wdGlvbnMuICovCi0jZGVmaW5lIE9QVElPTl9RVUlFVAkJKE9QVElPTl9TVEFSVCArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJCT1NFCQkoT1BUSU9OX1FVSUVUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCShPUFRJT05fVkVSQk9TRSArIDEpCi0KLS8qIERMTFdSQVAgb3B0aW9ucy4gKi8KLSNkZWZpbmUgT1BUSU9OX0RSWV9SVU4JCShPUFRJT05fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9EUklWRVJfTkFNRQkoT1BUSU9OX0RSWV9SVU4gKyAxKQotI2RlZmluZSBPUFRJT05fRFJJVkVSX0ZMQUdTCShPUFRJT05fRFJJVkVSX05BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fRExMVE9PTF9OQU1FCShPUFRJT05fRFJJVkVSX0ZMQUdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VOVFJZCQkoT1BUSU9OX0RMTFRPT0xfTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCShPUFRJT05fRU5UUlkgKyAxKQotI2RlZmluZSBPUFRJT05fVEFSR0VUCQkoT1BUSU9OX0lNQUdFX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fTU5PX0NZR1dJTgkoT1BUSU9OX1RBUkdFVCArIDEpCi0KLS8qIERMTFRPT0wgb3B0aW9ucy4gKi8KLSNkZWZpbmUgT1BUSU9OX05PREVMRVRFCQkoT1BUSU9OX01OT19DWUdXSU4gKyAxKQotI2RlZmluZSBPUFRJT05fRExMTkFNRQkJKE9QVElPTl9OT0RFTEVURSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19JREFUQTQgCShPUFRJT05fRExMTkFNRSArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19JREFUQTUJKE9QVElPTl9OT19JREFUQTQgKyAxKQotI2RlZmluZSBPUFRJT05fT1VUUFVUX0VYUAkoT1BUSU9OX05PX0lEQVRBNSArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfREVGCShPUFRJT05fT1VUUFVUX0VYUCArIDEpCi0jZGVmaW5lIE9QVElPTl9FWFBPUlRfQUxMX1NZTVMJKE9QVElPTl9PVVRQVVRfREVGICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0VYUE9SVF9BTExfU1lNUyAoT1BUSU9OX0VYUE9SVF9BTExfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9FWENMVURFX1NZTVMJKE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVMgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyAoT1BUSU9OX0VYQ0xVREVfU1lNUyArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRQVVRfTElCCShPUFRJT05fTk9fREVGQVVMVF9FWENMVURFUyArIDEpCi0jZGVmaW5lIE9QVElPTl9ERUYJCShPUFRJT05fT1VUUFVUX0xJQiArIDEpCi0jZGVmaW5lIE9QVElPTl9BRERfVU5ERVJTQ09SRQkoT1BUSU9OX0RFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9LSUxMQVQJCShPUFRJT05fQUREX1VOREVSU0NPUkUgKyAxKQotI2RlZmluZSBPUFRJT05fSEVMUAkJKE9QVElPTl9LSUxMQVQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFDSElORQkJKE9QVElPTl9IRUxQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FERF9JTkRJUkVDVAkoT1BUSU9OX01BQ0hJTkUgKyAxKQotI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCShPUFRJT05fQUREX0lORElSRUNUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0FTCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgLyogZ2VuZXJpYyBvcHRpb25zLiAqLwotICB7InF1aWV0Iiwgbm9fYXJndW1lbnQsIE5VTEwsICdxJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAotICB7ImltcGxpYiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fT1VUUFVUX0xJQn0sCi0KLSAgLyogZGxsd3JhcCBvcHRpb25zLiAqLwotICB7ImRyeS1ydW4iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RSWV9SVU59LAotICB7ImRyaXZlci1uYW1lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfTkFNRX0sCi0gIHsiZHJpdmVyLWZsYWdzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9EUklWRVJfRkxBR1N9LAotICB7ImRsbHRvb2wtbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMVE9PTF9OQU1FfSwKLSAgeyJlbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZSd9LAotICB7ImltYWdlLWJhc2UiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lNQUdFX0JBU0V9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEFSR0VUfSwKLQotICAvKiBkbGx0b29sIG9wdGlvbnMuICovCi0gIHsibm8tZGVsZXRlIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsiZGxsbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMTkFNRX0sCi0gIHsibm8taWRhdGE0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19JREFUQTR9LAotICB7Im5vLWlkYXRhNSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fSURBVEE1fSwKLSAgeyJvdXRwdXQtZXhwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfRVhQfSwKLSAgeyJvdXRwdXQtZGVmIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfREVGfSwKLSAgeyJleHBvcnQtYWxsLXN5bWJvbHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVF9BTExfU1lNU30sCi0gIHsibm8tZXhwb3J0LWFsbC1zeW1ib2xzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19FWFBPUlRfQUxMX1NZTVN9LAotICB7ImV4Y2x1ZGUtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhDTFVERV9TWU1TfSwKLSAgeyJuby1kZWZhdWx0LWV4Y2x1ZGVzIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19ERUZBVUxUX0VYQ0xVREVTfSwKLSAgeyJvdXRwdXQtbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PVVRQVVRfTElCfSwKLSAgeyJkZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRn0sCi0gIHsiYWRkLXVuZGVyc2NvcmUiLCBub19hcmd1bWVudCwgTlVMTCwgJ1UnfSwKLSAgeyJraWxsYXQiLCBub19hcmd1bWVudCwgTlVMTCwgJ2snfSwKLSAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnQSd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKLSAgeyJtYWNoaW5lIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUNISU5FfSwKLSAgeyJhZGQtaW5kaXJlY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0FERF9JTkRJUkVDVH0sCi0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAotICB7ImFzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU30sCi0gIHswfQotfTsKLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgaTsKLQotICBjaGFyICoqc2F2ZWRfYXJndiA9IDA7Ci0gIGludCBjbWRsaW5lX2xlbiA9IDA7Ci0KLSAgaW50IGV4cG9ydF9hbGwgPSAwOwotCi0gIGludCAqZGxsdG9vbF9hcmdfaW5kaWNlczsKLSAgaW50ICpkcml2ZXJfYXJnX2luZGljZXM7Ci0KLSAgY2hhciAqZHJpdmVyX2ZsYWdzID0gMDsKLSAgY2hhciAqb3V0cHV0X2xpYl9maWxlX25hbWUgPSAwOwotCi0gIGR5bl9zdHJpbmdfdCBkbGx0b29sX2NtZGxpbmU7Ci0gIGR5bl9zdHJpbmdfdCBkcml2ZXJfY21kbGluZTsKLQotICBpbnQgZGVmX2ZpbGVfc2VlbiA9IDA7Ci0KLSAgY2hhciAqaW1hZ2VfYmFzZV9zdHIgPSAwOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgc2F2ZWRfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChjaGFyKikpOwotICBkbGx0b29sX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKLSAgZHJpdmVyX2FyZ19pbmRpY2VzID0gKGludCAqKSB4bWFsbG9jIChhcmdjICogc2l6ZW9mIChpbnQpKTsKLSAgZm9yIChpID0gMDsgaSA8IGFyZ2M7ICsraSkgCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJndltpXSk7Ci0gICAgICBjaGFyICphcmcgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cmNweSAoYXJnLCBhcmd2W2ldKTsKLSAgICAgIGNtZGxpbmVfbGVuICs9IGxlbjsKLSAgICAgIHNhdmVkX2FyZ3ZbaV0gPSBhcmc7Ci0gICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW2ldID0gMDsKLSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tpXSA9IDE7Ci0gICAgfQotICBjbWRsaW5lX2xlbisrOwotCi0gIC8qIFdlIHJlY29nbml6ZSBkbGx3cmFwIGFuZCBkbGx0b29sIG9wdGlvbnMsIGFuZCBldmVyeXRoaW5nIGVsc2UgaXMKLSAgICAgcGFzc2VkIG9udG8gdGhlIGxhbmd1YWdlIGRyaXZlciAoZWcuLCB0byBHQ0MpLiBXZSBjb2xsZWN0IG9wdGlvbnMKLSAgICAgdG8gZGxsdG9vbCBhbmQgZHJpdmVyIGluIGRsbHRvb2xfYXJncyBhbmQgZHJpdmVyX2FyZ3MuICovCi0gICAKLSAgb3B0ZXJyID0gMDsKLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIm5rQXF2ZTpVaG86bDpMOkk6IiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGludCBkbGx0b29sX2FyZzsKLSAgICAgIGludCBkcml2ZXJfYXJnOwotICAgICAgaW50IHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyOwotCi0gICAgICBkbGx0b29sX2FyZyA9IDA7Ci0gICAgICBkcml2ZXJfYXJnID0gMTsKLSAgICAgIHNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMDsKLQotICAgICAgaWYgKGMgIT0gJz8nKQotICAgICAgICB7Ci0JICAvKiBXZSByZWNvZ25pemUgdGhpcyBvcHRpb24sIHNvIGl0IGhhcyB0byBiZSBlaXRoZXIgZGxsd3JhcCBvcgotCSAgICAgZGxsdG9vbCBvcHRpb24uIERvIG5vdCBwYXNzIHRvIGRyaXZlciB1bmxlc3MgaXQncyBvbmUgb2YgdGhlCi0JICAgICBnZW5lcmljIG9wdGlvbnMgdGhhdCBhcmUgcGFzc2VkIHRvIGFsbCB0aGUgdG9vbHMgKHN1Y2ggYXMgLXYpCi0JICAgICB3aGljaCBhcmUgZGVhbHQgd2l0aCBsYXRlci4gKi8KLQkgIGRyaXZlcl9hcmcgPSAwOwotCX0KLQotICAgICAgLyogZGVhbCB3aXRoIGdlbmVyaWMgYW5kIGRsbHdyYXAgb3B0aW9ucyBmaXJzdC4gKi8KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgdmVyYm9zZSA9IDA7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIHByaW50X3ZlcnNpb24gKHByb2dyYW1fbmFtZSk7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGVudHJ5X3BvaW50ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fSU1BR0VfQkFTRToKLQkgIGltYWdlX2Jhc2Vfc3RyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVGOgotCSAgZGVmX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGRlZl9maWxlX3NlZW4gPSAxOwotCSAgZGVsZXRlX2RlZl9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgZG9udGRlbHRlbXBzID0gMTsKLQkgIGRsbHRvb2xfYXJnID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgZGxsX2ZpbGVfbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCWNhc2UgJ2wnOgotCWNhc2UgJ0wnOgotCSAgZHJpdmVyX2FyZyA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ETExOQU1FOgotCSAgZGxsX25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUllfUlVOOgotCSAgZHJ5X3J1biA9IDE7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9EUklWRVJfTkFNRToKLQkgIGRyaXZlcl9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRFJJVkVSX0ZMQUdTOgotCSAgZHJpdmVyX2ZsYWdzID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRExMVE9PTF9OQU1FOgotCSAgZGxsdG9vbF9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEFSR0VUOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTU5PX0NZR1dJTjoKLQkgIHRhcmdldCA9ICJpMzg2LW1pbmd3MzIiOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQkFTRV9GSUxFOgotCSAgYmFzZV9maWxlX25hbWUgPSBvcHRhcmc7Ci0JICBkZWxldGVfYmFzZV9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX09VVFBVVF9FWFA6Ci0JICBleHBfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgZGVsZXRlX2V4cF9maWxlID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYUE9SVF9BTExfU1lNUzoKLQkgIGV4cG9ydF9hbGwgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fT1VUUFVUX0xJQjoKLQkgIG91dHB1dF9saWJfZmlsZV9uYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnPyc6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgZGxsdG9vbF9hcmcgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgICAgCi0gICAgICAvKiBIYW5kbGUgcGFzc2luZyB0aHJvdWdoIC0tb3B0aW9uPXZhbHVlIGNhc2UuICovCi0gICAgICBpZiAob3B0YXJnIAotICAgICAgICAgICYmIHNhdmVkX2FyZ3Zbb3B0aW5kLTFdWzBdID09ICctJyAKLSAgICAgICAgICAmJiBzYXZlZF9hcmd2W29wdGluZC0xXVsxXSA9PSAnLScgCi0JICAmJiBzdHJjaHIgKHNhdmVkX2FyZ3Zbb3B0aW5kLTFdLCAnPScpKQotCXNpbmdsZV93b3JkX29wdGlvbl92YWx1ZV9wYWlyID0gMTsKLQotICAgICAgaWYgKGRsbHRvb2xfYXJnKQotICAgICAgICB7Ci0JICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0xXSA9IDE7Ci0JICBpZiAob3B0YXJnICYmICEgc2luZ2xlX3dvcmRfb3B0aW9uX3ZhbHVlX3BhaXIpCi0JICAgIHsKLQkgICAgICBkbGx0b29sX2FyZ19pbmRpY2VzW29wdGluZC0yXSA9IDE7Ci0JICAgIH0gCi0JfQotCi0gICAgICBpZiAoISBkcml2ZXJfYXJnKQotICAgICAgICB7Ci0JICBkcml2ZXJfYXJnX2luZGljZXNbb3B0aW5kLTFdID0gMDsKLQkgIGlmIChvcHRhcmcgJiYgISBzaW5nbGVfd29yZF9vcHRpb25fdmFsdWVfcGFpcikKLQkgICAgewotCSAgICAgIGRyaXZlcl9hcmdfaW5kaWNlc1tvcHRpbmQtMl0gPSAwOwotCSAgICB9IAotCX0KLSAgICB9Ci0KLSAgLyogc2FuaXR5IGNoZWNrcy4gKi8KLSAgaWYgKCEgZGxsX25hbWUgJiYgISBkbGxfZmlsZV9uYW1lKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgICAgICIlczogTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBvZiAtbyBvciAtLWRsbG5hbWUgb3B0aW9uc1xuIiwKLSAgICAgICAgICAgICAgIHByb2dyYW1fbmFtZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZGxsX25hbWUpCi0gICAgewotICAgICAgZGxsX25hbWUgPSB4c3RyZHVwIChteWJhc2VuYW1lIChkbGxfZmlsZV9uYW1lKSk7Ci0gICAgfQotICBlbHNlIGlmICghIGRsbF9maWxlX25hbWUpCi0gICAgewotICAgICAgZGxsX2ZpbGVfbmFtZSA9IHhzdHJkdXAgKGRsbF9uYW1lKTsKLSAgICB9Ci0KLSAgLyogRGVkdWNlIGRyaXZlci1uYW1lIGFuZCBkbGx0b29sLW5hbWUgZnJvbSBvdXIgb3duLiAqLwotICBpZiAoZHJpdmVyX25hbWUgPT0gTlVMTCkKLSAgICBkcml2ZXJfbmFtZSA9IGRlZHVjZV9uYW1lICgiZ2NjIik7Ci0KLSAgaWYgKGRsbHRvb2xfbmFtZSA9PSBOVUxMKQotICAgIGRsbHRvb2xfbmFtZSA9IGRlZHVjZV9uYW1lICgiZGxsdG9vbCIpOwotCi0gIGlmICghIGRlZl9maWxlX3NlZW4pCi0gICAgewotICAgICAgY2hhciAqZmlsZXByZWZpeCA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gICAgICBkZWZfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDUpOwotICAgICAgc3ByaW50ZiAoZGVmX2ZpbGVfbmFtZSwgIiVzLmRlZiIsIAotICAgICAgICAgICAgICAgKGRvbnRkZWx0ZW1wcykgPyBteWJhc2VuYW1lIChmaWxlcHJlZml4KSA6IGZpbGVwcmVmaXgpOwotICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgICAgZGVsZXRlX2RlZl9maWxlID0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6IG5vIGV4cG9ydCBkZWZpbml0aW9uIGZpbGUgcHJvdmlkZWRcbiIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAKLSAgICAgICAgICAgICAgICJkbGx3cmFwIHdpbGwgY3JlYXRlIG9uZSwgYnV0IG1heSBub3QgYmUgd2hhdCB5b3Ugd2FudFxuIik7Ci0gICAgfQotICAKLSAgLyogc2V0IHRoZSB0YXJnZXQgcGxhdGZvcm0uICovCi0gIGlmIChzdHJzdHIgKHRhcmdldCwgImN5Z3dpbjMyIikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gQ1lHV0lOX1RBUkdFVDsKLSAgZWxzZSBpZiAoc3Ryc3RyICh0YXJnZXQsICJtaW5ndzMyIikpCi0gICAgd2hpY2hfdGFyZ2V0ID0gTUlOR1czMl9UQVJHRVQ7Ci0gIGVsc2UgCi0gICAgd2hpY2hfdGFyZ2V0ID0gVU5LTk9XTl9UQVJHRVQ7Ci0KLSAgLyogcmUtY3JlYXRlIHRoZSBjb21tYW5kIGxpbmVzIGFzIGEgc3RyaW5nLCB0YWtpbmcgY2FyZSB0byBxdW90ZSBzdHVmZi4gKi8KLSAgZGxsdG9vbF9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKLSAgaWYgKHZlcmJvc2UpCi0gICAgewotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtdiIpOwotICAgIH0KLSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgIiAtLWRsbG5hbWUgIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGRsbF9uYW1lKTsKLQotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKQotICAgIHsKLSAgICAgIGlmIChkbGx0b29sX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRsbHRvb2xfY21kbGluZSwgCi0JICAgICAgICAgICAgICAgICAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkgIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIGFyZyk7Ci0JICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotCi0gIGRyaXZlcl9jbWRsaW5lID0gZHluX3N0cmluZ19uZXcgKGNtZGxpbmVfbGVuKTsKLSAgaWYgKCEgZHJpdmVyX2ZsYWdzIHx8IHN0cmxlbiAoZHJpdmVyX2ZsYWdzKSA9PSAwKQotICAgIHsKLSAgICAgIHN3aXRjaCAod2hpY2hfdGFyZ2V0KQotICAgICAgICB7Ci0JY2FzZSBDWUdXSU5fVEFSR0VUOgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IGN5Z3dpbl9kcml2ZXJfZmxhZ3M7Ci0JICBicmVhazsKLQkKLQljYXNlIE1JTkdXMzJfVEFSR0VUOgotICAgICAgICAgIGRyaXZlcl9mbGFncyA9IG1pbmd3MzJfZHJpdmVyX2ZsYWdzOwotCSAgYnJlYWs7Ci0JCi0JZGVmYXVsdDoKLSAgICAgICAgICBkcml2ZXJfZmxhZ3MgPSBnZW5lcmljX2RyaXZlcl9mbGFnczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZHJpdmVyX2ZsYWdzKTsKLSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAiIC1vICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGRsbF9maWxlX25hbWUpOwotCi0gIGlmICghIGVudHJ5X3BvaW50IHx8IHN0cmxlbiAoZW50cnlfcG9pbnQpID09IDApCi0gICAgewotICAgICAgc3dpdGNoICh3aGljaF90YXJnZXQpCi0gICAgICAgIHsKLQljYXNlIENZR1dJTl9UQVJHRVQ6Ci0JICBlbnRyeV9wb2ludCA9ICJfX2N5Z3dpbl9kbGxfZW50cnlAMTIiOwotCSAgYnJlYWs7Ci0JCi0JY2FzZSBNSU5HVzMyX1RBUkdFVDoKLQkgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQ1JUU3RhcnR1cEAxMiI7Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotICAgICAgICAgIGVudHJ5X3BvaW50ID0gIl9EbGxNYWluQDEyIjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLWUsIik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgZW50cnlfcG9pbnQpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZXhjbHVkZS1zeW1ib2w9Iik7Ci0gIGR5bl9zdHJpbmdfYXBwZW5kIChkbGx0b29sX2NtZGxpbmUsIAotICAgICAgICAgICAgICAgICAgICAgKGVudHJ5X3BvaW50WzBdID09ICdfJykgPyBlbnRyeV9wb2ludCsxIDogZW50cnlfcG9pbnQpOwotCi0gIGlmICghIGltYWdlX2Jhc2Vfc3RyIHx8IHN0cmxlbiAoaW1hZ2VfYmFzZV9zdHIpID09IDApCi0gICAgewotICAgICAgY2hhciAqdG1wYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc2l6ZW9mICgiMHgxMjM0NTY3OCIpICsgMSk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGhhc2ggPSBzdHJoYXNoIChkbGxfZmlsZV9uYW1lKTsKLSAgICAgIHNwcmludGYgKHRtcGJ1ZiwgIjB4JS44bFgiLCAweDYwMDAwMDAwfCgoaGFzaDw8MTYpJjB4RkZDMDAwMCkpOwotICAgICAgaW1hZ2VfYmFzZV9zdHIgPSB0bXBidWY7Ci0gICAgfQotCi0gIGR5bl9zdHJpbmdfYXBwZW5kIChkcml2ZXJfY21kbGluZSwgIiAtV2wsLS1pbWFnZS1iYXNlLCIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsIGltYWdlX2Jhc2Vfc3RyKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoZHJpdmVyX2NtZGxpbmUsICIgLXYiKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkKLSAgICB7Ci0gICAgICBpZiAoZHJpdmVyX2FyZ19pbmRpY2VzW2ldKQotICAgICAgICB7Ci0JICBjaGFyICphcmcgPSBzYXZlZF9hcmd2W2ldOwotICAgICAgICAgIGludCBxdW90ZSA9IChzdHJjaHIgKGFyZywgJyAnKSB8fCBzdHJjaHIgKGFyZywgJ1x0JykpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIiBcIiIgOiAiICIpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCBhcmcpOwotCSAgZHluX3N0cmluZ19hcHBlbmQgKGRyaXZlcl9jbWRsaW5lLCAKLQkgICAgICAgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQl9Ci0gICAgfQotICAKLSAgLyoKLSAgICogU3RlcCBwcmUtMS4gSWYgbm8gLS1kZWYgPEVYUE9SVF9ERUY+IGlzIHNwZWNpZmllZCwgdGhlbiBjcmVhdGUgaXQKLSAgICogYW5kIHRoZW4gcGFzcyBpdCBvbi4KLSAgICovCi0gIAotICBpZiAoISBkZWZfZmlsZV9zZWVuKSAKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGR5bl9zdHJpbmdfdCBzdGVwX3ByZTE7Ci0KLSAgICAgIHN0ZXBfcHJlMSA9IGR5bl9zdHJpbmdfbmV3ICgxMDI0KTsKLQotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIGlmIChleHBvcnRfYWxsKQotCXsKLSAgICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCAiIC0tZXhwb3J0LWFsbCAtLWV4Y2x1ZGUtc3ltYm9sPSIpOwotICAgICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsIAotCSAgIl9jeWd3aW5fZGxsX2VudHJ5QDEyLERsbE1haW5DUlRTdGFydHVwQDEyLERsbE1haW5AMTIsRGxsRW50cnlQb2ludEAxMiIpOwotCX0KLSAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsICIgLS1vdXRwdXQtZGVmICIpOwotICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXBfcHJlMSwgZGVmX2ZpbGVfbmFtZSk7Ci0KLSAgICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyArK2kpCi0JewotCSAgaWYgKGRyaXZlcl9hcmdfaW5kaWNlc1tpXSkKLQkgICAgewotCSAgICAgIGNoYXIgKmFyZyA9IHNhdmVkX2FyZ3ZbaV07Ci0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYXJnKTsKLQkgICAgICBpZiAobGVuID49IDIgJiYgYXJnW2xlbi0yXSA9PSAnLicgCi0JICAgICAgICAgICYmIChhcmdbbGVuLTFdID09ICdvJyB8fCBhcmdbbGVuLTFdID09ICdhJykpCi0JCXsKLQkJICBpbnQgcXVvdGUgPSAoc3RyY2hyIChhcmcsICcgJykgfHwgc3RyY2hyIChhcmcsICdcdCcpKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLAotCQkJCSAgICAgKHF1b3RlKSA/ICIgXCIiIDogIiAiKTsKLQkJICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcF9wcmUxLCBhcmcpOwotCQkgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwX3ByZTEsCi0JCQkJICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXBfcHJlMS0+cykpCi0JY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgICAKLSAgICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwX3ByZTEpOwotICAgIH0KLQotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCAiIC0tZGVmICIpOwotICBkeW5fc3RyaW5nX2FwcGVuZCAoZGxsdG9vbF9jbWRsaW5lLCBkZWZfZmlsZV9uYW1lKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJETExUT09MIG5hbWUgICAgOiAlc1xuIiwgZGxsdG9vbF9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRMTFRPT0wgb3B0aW9ucyA6ICVzXG4iLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRFJJVkVSIG5hbWUgICAgIDogJXNcbiIsIGRyaXZlcl9uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIkRSSVZFUiBvcHRpb25zICA6ICVzXG4iLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgfQotIAotICAvKgotICAgKiBTdGVwIDEuIENhbGwgR0NDL0xEIHRvIGNyZWF0ZSBiYXNlIHJlbG9jYXRpb24gZmlsZS4gSWYgdXNpbmcgR0NDLCB0aGUKLSAgICogZHJpdmVyIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBnY2MgLVdsLC0tZGxsIC0tV2wsLS1iYXNlLWZpbGUsZm9vLmJhc2UgW3Jlc3Qgb2YgY29tbWFuZCBsaW5lXQotICAgKgotICAgKiBJZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGEgYmFzZSBuYW1lLCBjcmVhdGUgdGVtcG9yYXJ5IG9uZSB0aGF0Ci0gICAqIGlzIGRlbGV0ZWQgYXQgZXhpdC4KLSAgICoKLSAgICovCi0gIAotICBpZiAoISBiYXNlX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpmaWxlcHJlZml4ID0gY2hvb3NlX3RlbXBfYmFzZSAoKTsKLSAgICAgIGJhc2VfZmlsZV9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlcHJlZml4KSArIDYpOwotICAgICAgc3ByaW50ZiAoYmFzZV9maWxlX25hbWUsICIlcy5iYXNlIiwgCi0gICAgICAgICAgICAgICAoZG9udGRlbHRlbXBzKSA/IG15YmFzZW5hbWUgKGZpbGVwcmVmaXgpIDogZmlsZXByZWZpeCk7Ci0gICAgICBkZWxldGVfYmFzZV9maWxlID0gMTsKLSAgICAgIGZyZWUgKGZpbGVwcmVmaXgpOwotICAgIH0KLSAgCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDEgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGJhc2VfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIi1XbCwtLWJhc2UtZmlsZSwiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDEsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAxLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDEtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAxKTsKLSAgfQotCi0KLQotICAvKgotICAgKiBTdGVwIDIuIGdlbmVyYXRlIHRoZSBleHAgZmlsZSBieSBydW5uaW5nIGRsbHRvb2wuIAotICAgKiBkbGx0b29sIGNvbW1hbmQgbGluZSB3aWxsIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOgotICAgKiAgICAKLSAgICogICAgJSBkbGx0b29sIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIFtyZXN0IG9mIGNvbW1hbmQgbGluZV0KLSAgICoKLSAgICogSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3BlY2lmeSBhIGJhc2UgbmFtZSwgY3JlYXRlIHRlbXBvcmFyeSBvbmUgdGhhdAotICAgKiBpcyBkZWxldGVkIGF0IGV4aXQuCi0gICAqCi0gICAqLwotICAKLSAgaWYgKCEgZXhwX2ZpbGVfbmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpwID0gc3RycmNociAoZGxsX25hbWUsICcuJyk7Ci0gICAgICBzaXplX3QgcHJlZml4X2xlbiA9IChwKSA/IHAgLSBkbGxfbmFtZSA6IHN0cmxlbiAoZGxsX25hbWUpOwotICAgICAgZXhwX2ZpbGVfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHByZWZpeF9sZW4gKyA0ICsgMSk7Ci0gICAgICBzdHJuY3B5IChleHBfZmlsZV9uYW1lLCBkbGxfbmFtZSwgcHJlZml4X2xlbik7Ci0gICAgICBleHBfZmlsZV9uYW1lW3ByZWZpeF9sZW5dID0gJ1wwJzsKLSAgICAgIHN0cmNhdCAoZXhwX2ZpbGVfbmFtZSwgIi5leHAiKTsKLSAgICAgIGRlbGV0ZV9leHBfZmlsZSA9IDE7Ci0gICAgfQotICAKLSAgewotICAgIGludCBxdW90ZTsKLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDIgPSBkeW5fc3RyaW5nX25ldyAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChiYXNlX2ZpbGVfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsICItLWJhc2UtZmlsZSAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoYmFzZV9maWxlX25hbWUsICdcdCcpKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgYmFzZV9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiAiIDogIiAiKTsKLQotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIi0tb3V0cHV0LWV4cCAiKTsKLSAgICBxdW90ZSA9IChzdHJjaHIgKGV4cF9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDIsIGV4cF9maWxlX25hbWUpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0KLSAgICBpZiAoZGxsdG9vbF9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMiwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAyLCBkbGx0b29sX2NtZGxpbmUtPnMpOwotICAgICAgfQotCi0gICAgaWYgKHJ1biAoZGxsdG9vbF9uYW1lLCBzdGVwMi0+cykpCi0gICAgICBjbGVhbnVwX2FuZF9leGl0ICgxKTsKLSAgICAKLSAgICBkeW5fc3RyaW5nX2RlbGV0ZSAoc3RlcDIpOwotICB9Ci0KLSAgLyoKLSAgICogU3RlcCAzLiBDYWxsIEdDQy9MRCB0byBhZ2FpbiwgYWRkaW5nIHRoZSBleHAgZmlsZSB0aGlzIHRpbWUuCi0gICAqIGRyaXZlciBjb21tYW5kIGxpbmUgd2lsbCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKLSAgICogICAgCi0gICAqICAgICUgZ2NjIC1XbCwtLWRsbCAtLVdsLC0tYmFzZS1maWxlLGZvby5iYXNlIGZvby5leHAgW3Jlc3QgLi4uXQotICAgKi8KLQotICB7Ci0gICAgaW50IHF1b3RlOwotCi0gICAgZHluX3N0cmluZ190IHN0ZXAzID0gZHluX3N0cmluZ19uZXcgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAiLVdsLC0tYmFzZS1maWxlLCIpOwotICAgIHF1b3RlID0gKHN0cmNociAoYmFzZV9maWxlX25hbWUsICcgJykgCi0gICAgICAgICAgICAgfHwgc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBiYXNlX2ZpbGVfbmFtZSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiICIgOiAiICIpOwotCi0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDMsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwMywgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXAzLCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDMtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXAzKTsKLSAgfQotCi0KLSAgLyoKLSAgICogU3RlcCA0LiBSdW4gRExMVE9PTCBhZ2FpbiB1c2luZyB0aGUgc2FtZSBjb21tYW5kIGxpbmUuCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0gICAgZHluX3N0cmluZ190IHN0ZXA0ID0gZHluX3N0cmluZ19uZXcgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cmxlbiAoYmFzZV9maWxlX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RybGVuIChleHBfZmlsZV9uYW1lKQotCQkJCSAgICAgICAgICsgMjApOwotCi0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiLS1iYXNlLWZpbGUgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChiYXNlX2ZpbGVfbmFtZSwgJyAnKSAKLSAgICAgICAgICAgICB8fCBzdHJjaHIgKGJhc2VfZmlsZV9uYW1lLCAnXHQnKSk7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAKLQkgICAgICAgICAgICAgICAocXVvdGUpID8gIlwiIiA6ICIiKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIGJhc2VfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIgIiA6ICIgIik7Ci0KLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICItLW91dHB1dC1leHAgIik7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRsbHRvb2xfY21kbGluZS0+bGVuZ3RoKQotICAgICAgewotICAgICAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDQsICIgIik7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNCwgZGxsdG9vbF9jbWRsaW5lLT5zKTsKLSAgICAgIH0KLQotICAgIGlmIChvdXRwdXRfbGliX2ZpbGVfbmFtZSkKLSAgICAgIHsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCAiIC0tb3V0cHV0LWxpYiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA0LCBvdXRwdXRfbGliX2ZpbGVfbmFtZSk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkbGx0b29sX25hbWUsIHN0ZXA0LT5zKSkKLSAgICAgIGNsZWFudXBfYW5kX2V4aXQgKDEpOwotICAgIAotICAgIGR5bl9zdHJpbmdfZGVsZXRlIChzdGVwNCk7Ci0gIH0KLSAgCi0KLSAgLyoKLSAgICogU3RlcCA1LiBMaW5rIGl0IGFsbCB0b2dldGhlciBhbmQgYmUgZG9uZSB3aXRoIGl0LgotICAgKiBkcml2ZXIgY29tbWFuZCBsaW5lIHdpbGwgbG9vayBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0gICAqICAgIAotICAgKiAgICAlIGdjYyAtV2wsLS1kbGwgZm9vLmV4cCBbcmVzdCAuLi5dCi0gICAqCi0gICAqLwotCi0gIHsKLSAgICBpbnQgcXVvdGU7Ci0KLSAgICBkeW5fc3RyaW5nX3Qgc3RlcDUgPSBkeW5fc3RyaW5nX25ldyAoZHJpdmVyX2NtZGxpbmUtPmxlbmd0aCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdHJsZW4gKGV4cF9maWxlX25hbWUpCi0JCQkJICAgICAgICAgKyAyMCk7Ci0gICAgcXVvdGUgPSAoc3RyY2hyIChleHBfZmlsZV9uYW1lLCAnICcpIAotICAgICAgICAgICAgIHx8IHN0cmNociAoZXhwX2ZpbGVfbmFtZSwgJ1x0JykpOwotICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgCi0JICAgICAgICAgICAgICAgKHF1b3RlKSA/ICJcIiIgOiAiIik7Ci0gICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBleHBfZmlsZV9uYW1lKTsKLSAgICBkeW5fc3RyaW5nX2FwcGVuZCAoc3RlcDUsIAotCSAgICAgICAgICAgICAgIChxdW90ZSkgPyAiXCIiIDogIiIpOwotCi0gICAgaWYgKGRyaXZlcl9jbWRsaW5lLT5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIGR5bl9zdHJpbmdfYXBwZW5kIChzdGVwNSwgIiAiKTsKLSAgICAgICAgZHluX3N0cmluZ19hcHBlbmQgKHN0ZXA1LCBkcml2ZXJfY21kbGluZS0+cyk7Ci0gICAgICB9Ci0KLSAgICBpZiAocnVuIChkcml2ZXJfbmFtZSwgc3RlcDUtPnMpKQotICAgICAgY2xlYW51cF9hbmRfZXhpdCAoMSk7Ci0gICAgCi0gICAgZHluX3N0cmluZ19kZWxldGUgKHN0ZXA1KTsKLSAgfQotCi0gIGNsZWFudXBfYW5kX2V4aXQgKDApOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5jIGIvYmludXRpbHMvZHluLXN0cmluZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGEzMDQzLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKiBBbiBhYnN0cmFjdCBzdHJpbmcgZGF0YXR5cGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLSAgIEdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBhdCBsZWFzdCB0d28gcGxhY2VzOiBiaW51dGlscyBhbmQgZ2NjLgotICAgRG9uJ3QgY2hhbmdlIG9uZSB3aXRob3V0IHRoZSBvdGhlci4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpZmRlZiBJTl9HQ0MKLSNpbmNsdWRlICJzeXN0ZW0uaCIKLSNpbmNsdWRlICJnYW5zaWRlY2wuaCIKLSNlbHNlCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNlbmRpZgotI2luY2x1ZGUgImR5bi1zdHJpbmcuaCIKLQotZXh0ZXJuIGNoYXIgKnhtYWxsb2MgKCk7Ci1leHRlcm4gY2hhciAqeHJlYWxsb2MgKCk7Ci0KLS8qIENyZWF0ZSBhIG5ldyBkeW5hbWljIHN0cmluZyBjYXBhYmxlIG9mIGhvbGRpbmcgYXQgbGVhc3QgU1BBQ0UKLSAgIGNoYXJhY3RlcnMsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLiAgSWYgU1BBQ0UgaXMgMCwgaXQKLSAgIHdpbGwgYmUgc2lsZW50bHkgaW5jcmVhc2VkIHRvIDEuICAqLwotCi1keW5fc3RyaW5nX3QgCi1keW5fc3RyaW5nX25ldyAoc3BhY2UpCi0gICAgIGludCBzcGFjZTsKLXsKLSAgZHluX3N0cmluZ190IHJlc3VsdCA9IChkeW5fc3RyaW5nX3QpIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGR5bl9zdHJpbmcpKTsKLSAKLSAgaWYgKHNwYWNlID09IDApCi0gICAgLyogV2UgbmVlZCBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdGVybWluYXRpbmcKLSAgICAgICBOVUwuICAqLwotICAgIHNwYWNlID0gMTsKLQotICByZXN1bHQtPmFsbG9jYXRlZCA9IHNwYWNlOwotICByZXN1bHQtPnMgPSAoY2hhciopIHhtYWxsb2MgKHNwYWNlKTsKLSAgcmVzdWx0LT5sZW5ndGggPSAwOwotICByZXN1bHQtPnNbMF0gPSAnXDAnOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIEZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IERTLiAgKi8KLQotdm9pZCAKLWR5bl9zdHJpbmdfZGVsZXRlIChkcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotewotICBmcmVlIChkcy0+cyk7Ci0gIGZyZWUgKGRzKTsKLX0KLQotLyogQXBwZW5kIHRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgUyB0byBEUywgcmVzaXppbmcgRFMgaWYKLSAgIG5lY2Vzc2FyeS4gICovCi0KLWR5bl9zdHJpbmdfdCAKLWR5bl9zdHJpbmdfYXBwZW5kIChkcywgcykKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBjaGFyICpzOwotewotICBpbnQgbGVuID0gc3RybGVuIChzKTsKLSAgZHluX3N0cmluZ19yZXNpemUgKGRzLCBkcy0+bGVuZ3RoICsgbGVuICsgMSAvKiAnXDAnICovKTsKLSAgc3RyY3B5IChkcy0+cyArIGRzLT5sZW5ndGgsIHMpOwotICBkcy0+bGVuZ3RoICs9IGxlbjsKLQotICByZXR1cm4gZHM7Ci19Ci0KLS8qIEluY3JlYXNlIHRoZSBjYXBhY2l0eSBvZiBEUyBzbyB0aGF0IGl0IGNhbiBob2xkIGF0IGxlYXN0IFNQQUNFCi0gICBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC4gIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QKLSAgIChhdCBwcmVzZW50KSByZWR1Y2UgdGhlIGNhcGFjaXR5IG9mIERTLiAgKi8KLQotZHluX3N0cmluZ190IAotZHluX3N0cmluZ19yZXNpemUgKGRzLCBzcGFjZSkKLSAgICAgZHluX3N0cmluZ190IGRzOwotICAgICBpbnQgc3BhY2U7Ci17Ci0gIGludCBuZXdfYWxsb2NhdGVkID0gZHMtPmFsbG9jYXRlZDsKLQotICB3aGlsZSAoc3BhY2UgPiBuZXdfYWxsb2NhdGVkKQotICAgIG5ld19hbGxvY2F0ZWQgKj0gMjsKLSAgICAKLSAgaWYgKG5ld19hbGxvY2F0ZWQgIT0gZHMtPmFsbG9jYXRlZCkKLSAgICB7Ci0gICAgICAvKiBXZSBhY3R1YWxseSBuZWVkIG1vcmUgc3BhY2UuICAqLwotICAgICAgZHMtPmFsbG9jYXRlZCA9IG5ld19hbGxvY2F0ZWQ7Ci0gICAgICBkcy0+cyA9IChjaGFyKikgeHJlYWxsb2MgKGRzLT5zLCBkcy0+YWxsb2NhdGVkKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRzOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvZHluLXN0cmluZy5oIGIvYmludXRpbHMvZHluLXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjJiYmJmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2R5bi1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qIEFuIGFic3RyYWN0IHN0cmluZyBkYXRhdHlwZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotICAgR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGxpdmVzIGluIGF0IGxlYXN0IHR3byBwbGFjZXM6IGJpbnV0aWxzIGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZHluX3N0cmluZwotewotICBpbnQgYWxsb2NhdGVkOyAvKiBUaGUgYW1vdW50IG9mIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGhlIHN0cmluZy4gICovCi0gIGludCBsZW5ndGg7IC8qIFRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICAqLwotICBjaGFyICpzOyAvKiBUaGUgc3RyaW5nIGl0c2VsZiwgTlVMLXRlcm1pbmF0ZWQuICAqLwotfSogZHluX3N0cmluZ190OwotCi1leHRlcm4gZHluX3N0cmluZ190IGR5bl9zdHJpbmdfbmV3ICAgICAgUEFSQU1TKChpbnQpKTsKLWV4dGVybiB2b2lkIGR5bl9zdHJpbmdfZGVsZXRlICAgICAgICAgICBQQVJBTVMoKGR5bl9zdHJpbmdfdCkpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX2FwcGVuZCAgIFBBUkFNUygoZHluX3N0cmluZ190LCBjaGFyKikpOwotZXh0ZXJuIGR5bl9zdHJpbmdfdCBkeW5fc3RyaW5nX3Jlc2l6ZSAgIFBBUkFNUygoZHluX3N0cmluZ190LCBpbnQpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMgYi9iaW51dGlscy9maWxlbW9kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI1MmJhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL2ZpbGVtb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogZmlsZW1vZGUuYyAtLSBtYWtlIGEgc3RyaW5nIGRlc2NyaWJpbmcgZmlsZSBtb2RlcwotICAgQ29weXJpZ2h0IChDKSAxOTg1LCA5MCwgOTEsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0KLXN0YXRpYyBjaGFyIGZ0eXBlbGV0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHNldHN0IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGNoYXIgKikpOwotCi0vKiBmaWxlbW9kZXN0cmluZyAtIGZpbGwgaW4gc3RyaW5nIFNUUiB3aXRoIGFuIGxzLXN0eWxlIEFTQ0lJCi0gICByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3RfbW9kZSBmaWVsZCBvZiBmaWxlIHN0YXRzIGJsb2NrIFNUQVRQLgotICAgMTAgY2hhcmFjdGVycyBhcmUgc3RvcmVkIGluIFNUUjsgbm8gdGVybWluYXRpbmcgbnVsbCBpcyBhZGRlZC4KLSAgIFRoZSBjaGFyYWN0ZXJzIHN0b3JlZCBpbiBTVFIgYXJlOgotCi0gICAwCUZpbGUgdHlwZS4gICdkJyBmb3IgZGlyZWN0b3J5LCAnYycgZm9yIGNoYXJhY3RlcgotCXNwZWNpYWwsICdiJyBmb3IgYmxvY2sgc3BlY2lhbCwgJ20nIGZvciBtdWx0aXBsZXgsCi0JJ2wnIGZvciBzeW1ib2xpYyBsaW5rLCAncycgZm9yIHNvY2tldCwgJ3AnIGZvciBmaWZvLAotCSctJyBmb3IgYW55IG90aGVyIGZpbGUgdHlwZQotCi0gICAxCSdyJyBpZiB0aGUgb3duZXIgbWF5IHJlYWQsICctJyBvdGhlcndpc2UuCi0KLSAgIDIJJ3cnIGlmIHRoZSBvd25lciBtYXkgd3JpdGUsICctJyBvdGhlcndpc2UuCi0KLSAgIDMJJ3gnIGlmIHRoZSBvd25lciBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCi0Jc2V0LXVzZXItaWQsICctJyBvdGhlcndpc2UuCi0JJ1MnIGlmIHRoZSBmaWxlIGlzIHNldC11c2VyLWlkLCBidXQgdGhlIGV4ZWN1dGUKLQliaXQgaXNuJ3Qgc2V0LgotCi0gICA0CSdyJyBpZiBncm91cCBtZW1iZXJzIG1heSByZWFkLCAnLScgb3RoZXJ3aXNlLgotCi0gICA1CSd3JyBpZiBncm91cCBtZW1iZXJzIG1heSB3cml0ZSwgJy0nIG90aGVyd2lzZS4KLQotICAgNgkneCcgaWYgZ3JvdXAgbWVtYmVycyBtYXkgZXhlY3V0ZSwgJ3MnIGlmIHRoZSBmaWxlIGlzCi0Jc2V0LWdyb3VwLWlkLCAnLScgb3RoZXJ3aXNlLgotCSdTJyBpZiBpdCBpcyBzZXQtZ3JvdXAtaWQgYnV0IG5vdCBleGVjdXRhYmxlLgotCi0gICA3CSdyJyBpZiBhbnkgdXNlciBtYXkgcmVhZCwgJy0nIG90aGVyd2lzZS4KLQotICAgOAkndycgaWYgYW55IHVzZXIgbWF5IHdyaXRlLCAnLScgb3RoZXJ3aXNlLgotCi0gICA5CSd4JyBpZiBhbnkgdXNlciBtYXkgZXhlY3V0ZSwgJ3QnIGlmIHRoZSBmaWxlIGlzICJzdGlja3kiCi0JKHdpbGwgYmUgcmV0YWluZWQgaW4gc3dhcCBzcGFjZSBhZnRlciBleGVjdXRpb24pLCAnLScKLQlvdGhlcndpc2UuCi0JJ1QnIGlmIHRoZSBmaWxlIGlzIHN0aWNreSBidXQgbm90IGV4ZWN1dGFibGUuICovCi0KLSNpZiAwCi0KLS8qIFRoaXMgaXMgbm90IHVzZWQ7IG9ubHkgbW9kZV9zdHJpbmcgaXMgdXNlZC4gICovCi0KLXZvaWQKLWZpbGVtb2Rlc3RyaW5nIChzdGF0cCwgc3RyKQotICAgICBzdHJ1Y3Qgc3RhdCAqc3RhdHA7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgbW9kZV9zdHJpbmcgKCh1bnNpZ25lZCBsb25nKSBzdGF0cC0+c3RfbW9kZSwgc3RyKTsKLX0KLQotI2VuZGlmCi0KLS8qIEdldCBkZWZpbml0aW9ucyBmb3IgdGhlIGZpbGUgcGVybWlzc2lvbiBiaXRzLiAgKi8KLQotI2lmbmRlZiBTX0lSV1hVCi0jZGVmaW5lIFNfSVJXWFUgMDcwMAotI2VuZGlmCi0jaWZuZGVmIFNfSVJVU1IKLSNkZWZpbmUgU19JUlVTUiAwNDAwCi0jZW5kaWYKLSNpZm5kZWYgU19JV1VTUgotI2RlZmluZSBTX0lXVVNSIDAyMDAKLSNlbmRpZgotI2lmbmRlZiBTX0lYVVNSCi0jZGVmaW5lIFNfSVhVU1IgMDEwMAotI2VuZGlmCi0KLSNpZm5kZWYgU19JUldYRwotI2RlZmluZSBTX0lSV1hHIDAwNzAKLSNlbmRpZgotI2lmbmRlZiBTX0lSR1JQCi0jZGVmaW5lIFNfSVJHUlAgMDA0MAotI2VuZGlmCi0jaWZuZGVmIFNfSVdHUlAKLSNkZWZpbmUgU19JV0dSUCAwMDIwCi0jZW5kaWYKLSNpZm5kZWYgU19JWEdSUAotI2RlZmluZSBTX0lYR1JQIDAwMTAKLSNlbmRpZgotCi0jaWZuZGVmIFNfSVJXWE8KLSNkZWZpbmUgU19JUldYTyAwMDA3Ci0jZW5kaWYKLSNpZm5kZWYgU19JUk9USAotI2RlZmluZSBTX0lST1RIIDAwMDQKLSNlbmRpZgotI2lmbmRlZiBTX0lXT1RICi0jZGVmaW5lIFNfSVdPVEggMDAwMgotI2VuZGlmCi0jaWZuZGVmIFNfSVhPVEgKLSNkZWZpbmUgU19JWE9USCAwMDAxCi0jZW5kaWYKLQotLyogTGlrZSBmaWxlbW9kZXN0cmluZywgYnV0IG9ubHkgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGBzdHJ1Y3Qgc3RhdCcKLSAgIGlzIGdpdmVuIGFzIGFuIGFyZ3VtZW50LiAqLwotCi12b2lkCi1tb2RlX3N0cmluZyAobW9kZSwgc3RyKQotICAgICB1bnNpZ25lZCBsb25nIG1vZGU7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RyWzBdID0gZnR5cGVsZXQgKCh1bnNpZ25lZCBsb25nKSBtb2RlKTsKLSAgc3RyWzFdID0gKG1vZGUgJiBTX0lSVVNSKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbMl0gPSAobW9kZSAmIFNfSVdVU1IpICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0clszXSA9IChtb2RlICYgU19JWFVTUikgIT0gMCA/ICd4JyA6ICctJzsKLSAgc3RyWzRdID0gKG1vZGUgJiBTX0lSR1JQKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbNV0gPSAobW9kZSAmIFNfSVdHUlApICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0cls2XSA9IChtb2RlICYgU19JWEdSUCkgIT0gMCA/ICd4JyA6ICctJzsKLSAgc3RyWzddID0gKG1vZGUgJiBTX0lST1RIKSAhPSAwID8gJ3InIDogJy0nOwotICBzdHJbOF0gPSAobW9kZSAmIFNfSVdPVEgpICE9IDAgPyAndycgOiAnLSc7Ci0gIHN0cls5XSA9IChtb2RlICYgU19JWE9USCkgIT0gMCA/ICd4JyA6ICctJzsKLSAgc2V0c3QgKCh1bnNpZ25lZCBsb25nKSBtb2RlLCBzdHIpOwotfQotCi0vKiBSZXR1cm4gYSBjaGFyYWN0ZXIgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBmaWxlIGRlc2NyaWJlZCBieQotICAgZmlsZSBtb2RlIEJJVFM6Ci0gICAnZCcgZm9yIGRpcmVjdG9yaWVzCi0gICAnYicgZm9yIGJsb2NrIHNwZWNpYWwgZmlsZXMKLSAgICdjJyBmb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZXMKLSAgICdtJyBmb3IgbXVsdGlwbGV4b3IgZmlsZXMKLSAgICdsJyBmb3Igc3ltYm9saWMgbGlua3MKLSAgICdzJyBmb3Igc29ja2V0cwotICAgJ3AnIGZvciBmaWZvcwotICAgJy0nIGZvciBhbnkgb3RoZXIgZmlsZSB0eXBlLiAqLwotCi0jaWZuZGVmIFNfSVNESVIKLSNpZmRlZiBTX0lGRElSCi0jZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZESVIpICovCi0jZGVmaW5lIFNfSVNESVIoaSkgKCgoaSkgJiAwMTcwMDAwKSA9PSAwNDAwMDApCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGRElSKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0RJUikgKi8KLQotI2lmbmRlZiBTX0lTQkxLCi0jaWZkZWYgU19JRkJMSwotI2RlZmluZSBTX0lTQkxLKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGQkxLKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGQkxLKSAqLwotI2RlZmluZSBTX0lTQkxLKGkpIDAKLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSUZCTEspICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lTQkxLKSAqLwotCi0jaWZuZGVmIFNfSVNDSFIKLSNpZmRlZiBTX0lGQ0hSCi0jZGVmaW5lIFNfSVNDSFIoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZDSFIpCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZDSFIpICovCi0jZGVmaW5lIFNfSVNDSFIoaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkNIUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNDSFIpICovCi0KLSNpZm5kZWYgU19JU0ZJRk8KLSNpZmRlZiBTX0lGSUZPCi0jZGVmaW5lIFNfSVNGSUZPKGkpICgoKGkpICYgU19JRk1UKSA9PSBTX0lGSUZPKQotI2Vsc2UgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLwotI2RlZmluZSBTX0lTRklGTyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGSUZPKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JU0ZJRk8pICovCi0KLSNpZm5kZWYgU19JU1NPQ0sKLSNpZmRlZiBTX0lGU09DSwotI2RlZmluZSBTX0lTU09DSyhpKSAoKChpKSAmIFNfSUZNVCkgPT0gU19JRlNPQ0spCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZTT0NLKSAqLwotI2RlZmluZSBTX0lTU09DSyhpKSAwCi0jZW5kaWYgLyogISBkZWZpbmVkIChTX0lGU09DSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNTT0NLKSAqLwotCi0jaWZuZGVmIFNfSVNMTksKLSNpZmRlZiBTX0lGTE5LCi0jZGVmaW5lIFNfSVNMTksoaSkgKCgoaSkgJiBTX0lGTVQpID09IFNfSUZMTkspCi0jZWxzZSAvKiAhIGRlZmluZWQgKFNfSUZMTkspICovCi0jZGVmaW5lIFNfSVNMTksoaSkgMAotI2VuZGlmIC8qICEgZGVmaW5lZCAoU19JRkxOSykgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKFNfSVNMTkspICovCi0KLXN0YXRpYyBjaGFyCi1mdHlwZWxldCAoYml0cykKLSAgICAgdW5zaWduZWQgbG9uZyBiaXRzOwotewotICBpZiAoU19JU0RJUiAoYml0cykpCi0gICAgcmV0dXJuICdkJzsKLSAgaWYgKFNfSVNMTksgKGJpdHMpKQotICAgIHJldHVybiAnbCc7Ci0gIGlmIChTX0lTQkxLIChiaXRzKSkKLSAgICByZXR1cm4gJ2InOwotICBpZiAoU19JU0NIUiAoYml0cykpCi0gICAgcmV0dXJuICdjJzsKLSAgaWYgKFNfSVNTT0NLIChiaXRzKSkKLSAgICByZXR1cm4gJ3MnOwotICBpZiAoU19JU0ZJRk8gKGJpdHMpKQotICAgIHJldHVybiAncCc7Ci0KLSNpZmRlZiBTX0lGTVQKLSNpZmRlZiBTX0lGTVBDCi0gIGlmICgoYml0cyAmIFNfSUZNVCkgPT0gU19JRk1QQwotICAgICAgfHwgKGJpdHMgJiBTX0lGTVQpID09IFNfSUZNUEIpCi0gICAgcmV0dXJuICdtJzsKLSNlbmRpZgotI2lmZGVmIFNfSUZOV0sKLSAgaWYgKChiaXRzICYgU19JRk1UKSA9PSBTX0lGTldLKQotICAgIHJldHVybiAnbic7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIHJldHVybiAnLSc7Ci19Ci0KLS8qIFNldCB0aGUgJ3MnIGFuZCAndCcgZmxhZ3MgaW4gZmlsZSBhdHRyaWJ1dGVzIHN0cmluZyBDSEFSUywKLSAgIGFjY29yZGluZyB0byB0aGUgZmlsZSBtb2RlIEJJVFMuICovCi0KLXN0YXRpYyB2b2lkCi1zZXRzdCAoYml0cywgY2hhcnMpCi0gICAgIHVuc2lnbmVkIGxvbmcgYml0czsKLSAgICAgY2hhciAqY2hhcnM7Ci17Ci0jaWZkZWYgU19JU1VJRAotICBpZiAoYml0cyAmIFNfSVNVSUQpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzNdICE9ICd4JykKLQkvKiBTZXQtdWlkLCBidXQgbm90IGV4ZWN1dGFibGUgYnkgb3duZXIuICovCi0JY2hhcnNbM10gPSAnUyc7Ci0gICAgICBlbHNlCi0JY2hhcnNbM10gPSAncyc7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgU19JU0dJRAotICBpZiAoYml0cyAmIFNfSVNHSUQpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzZdICE9ICd4JykKLQkvKiBTZXQtZ2lkLCBidXQgbm90IGV4ZWN1dGFibGUgYnkgZ3JvdXAuICovCi0JY2hhcnNbNl0gPSAnUyc7Ci0gICAgICBlbHNlCi0JY2hhcnNbNl0gPSAncyc7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgU19JU1ZUWAotICBpZiAoYml0cyAmIFNfSVNWVFgpCi0gICAgewotICAgICAgaWYgKGNoYXJzWzldICE9ICd4JykKLQkvKiBTdGlja3ksIGJ1dCBub3QgZXhlY3V0YWJsZSBieSBvdGhlcnMuICovCi0JY2hhcnNbOV0gPSAnVCc7Ci0gICAgICBlbHNlCi0JY2hhcnNbOV0gPSAndCc7Ci0gICAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9iaW51dGlscy9pZWVlLmMgYi9iaW51dGlscy9pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTViODguLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvaWVlZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYwOSArMCwwIEBACi0vKiBpZWVlLmMgLS0gUmVhZCBhbmQgd3JpdGUgSUVFRS02OTUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSByZWFkcyBhbmQgd3JpdGVzIElFRUUtNjk1IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiaWVlZS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYW4gZW50cnkgb24gdGhlIGJsb2NrIHN0YWNrLiAgKi8KLQotc3RydWN0IGllZWVfYmxvY2sKLXsKLSAgLyogVGhlIGtpbmQgb2YgYmxvY2suICAqLwotICBpbnQga2luZDsKLSAgLyogVGhlIHNvdXJjZSBmaWxlIG5hbWUsIGZvciBhIEJCNSBibG9jay4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBUaGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIHR5cGUsIGZvciBhIEJCNCBvciBCQjYgYmxvY2suICAqLwotICB1bnNpZ25lZCBpbnQgZm5pbmR4OwotICAvKiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gaXMgYmVpbmcgc2tpcHBlZC4gICovCi0gIGJvb2xlYW4gc2tpcDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHRoZSBibG9jayBzdGFjay4gICovCi0KLSNkZWZpbmUgQkxPQ0tTVEFDS19TSVpFICgxNikKLQotc3RydWN0IGllZWVfYmxvY2tzdGFjawotewotICAvKiBUaGUgc3RhY2sgcG9pbnRlci4gICovCi0gIHN0cnVjdCBpZWVlX2Jsb2NrICpic3A7Ci0gIC8qIFRoZSBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX2Jsb2NrIHN0YWNrW0JMT0NLU1RBQ0tfU0laRV07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBmb3IgYSB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBpZWVlX3ZhcgotewotICAvKiBTdGFydCBvZiBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTGVuZ3RoIG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLSAgLyogVHlwZS4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogU2xvdCBpZiB3ZSBtYWtlIGFuIGluZGlyZWN0IHR5cGUuICAqLwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgLyogS2luZCBvZiB2YXJpYWJsZSBvciBmdW5jdGlvbi4gICovCi0gIGVudW0KLSAgICB7Ci0gICAgICBJRUVFX1VOS05PV04sCi0gICAgICBJRUVFX0VYVEVSTkFMLAotICAgICAgSUVFRV9HTE9CQUwsCi0gICAgICBJRUVFX1NUQVRJQywKLSAgICAgIElFRUVfTE9DQUwsCi0gICAgICBJRUVFX0ZVTkNUSU9OCi0gICAgfSBraW5kOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSB2YXJpYWJsZXMuICAqLwotCi1zdHJ1Y3QgaWVlZV92YXJzCi17Ci0gIC8qIE51bWJlciBvZiBzbG90cyBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gIC8qIFZhcmlhYmxlcy4gICovCi0gIHN0cnVjdCBpZWVlX3ZhciAqdmFyczsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGZvciBhIHR5cGUuICBXZSBuZWVkIHRoaXMgYmVjYXVzZQotICAgd2UgZG9uJ3Qgd2FudCB0byByZXByZXNlbnQgYml0ZmllbGRzIGFzIHJlYWwgdHlwZXMuICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlCi17Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIFNsb3QgaWYgdGhpcyBpcyB0eXBlIGlzIHJlZmVyZW5jZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuICAqLwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgLyogU2xvdHMgZm9yIGFyZ3VtZW50cyBpZiB3ZSBtYWtlIGluZGlyZWN0IHR5cGVzIGZvciB0aGVtLiAgKi8KLSAgZGVidWdfdHlwZSAqYXJnX3Nsb3RzOwotICAvKiBJZiB0aGlzIGlzIGEgYml0ZmllbGQsIHRoaXMgaXMgdGhlIHNpemUgaW4gYml0cy4gIElmIHRoaXMgaXMgbm90Ci0gICAgIGEgYml0ZmllbGQsIHRoaXMgaXMgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgYml0c2l6ZTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCB0aGUgdHlwZSBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBpZWVlX3R5cGVzCi17Ci0gIC8qIE51bWJlciBvZiBzbG90cyBhbGxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gIC8qIFR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZSAqdHlwZXM7Ci0gIC8qIEJ1aWx0aW4gdHlwZXMuICAqLwotI2RlZmluZSBCVUlMVElOX1RZUEVfQ09VTlQgKDYwKQotICBkZWJ1Z190eXBlIGJ1aWx0aW5zW0JVSUxUSU5fVFlQRV9DT1VOVF07Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhIGxpbmtlZCBsYXN0IG9mIHN0cnVjdHMgd2l0aCB0aGVpciB0YWcgbmFtZXMsCi0gICBzbyB0aGF0IHdlIGNhbiBjb252ZXJ0IHRoZW0gdG8gQysrIGNsYXNzZXMgaWYgbmVjZXNzYXJ5LiAgKi8KLQotc3RydWN0IGllZWVfdGFnCi17Ci0gIC8qIE5leHQgdGFnLiAgKi8KLSAgc3RydWN0IGllZWVfdGFnICpuZXh0OwotICAvKiBUaGlzIHRhZyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVGhlIHR5cGUgb2YgdGhlIHRhZy4gICovCi0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgLyogVGhlIHRhZ2dlZCB0eXBlIGlzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgYXQgdGhpcyBzbG90LiAgKi8KLSAgZGVidWdfdHlwZSBzbG90OwotICAvKiBUaGlzIGlzIGFuIGFycmF5IG9mIHNsb3RzIHVzZWQgd2hlbiBhIGZpZWxkIHR5cGUgaXMgY29udmVydGVkCi0gICAgIGludG8gYSBpbmRpcmVjdCB0eXBlLCBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIGxhdGVyIGNvbnZlcnRlZCBpbnRvCi0gICAgIGEgcmVmZXJlbmNlIHR5cGUuICAqLwotICBkZWJ1Z190eXBlICpmc2xvdHM7Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgaW5mb3JtYXRpb24gd2UgcGFzcyBhcm91bmQgdG8gdGhlIHBhcnNpbmcKLSAgIGZ1bmN0aW9ucy4gICovCi0KLXN0cnVjdCBpZWVlX2luZm8KLXsKLSAgLyogVGhlIGRlYnVnZ2luZyBoYW5kbGUuICAqLwotICBQVFIgZGhhbmRsZTsKLSAgLyogVGhlIEJGRC4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogVGhlIHN0YXJ0IG9mIHRoZSBieXRlcyB0byBiZSBwYXJzZWQuICAqLwotICBjb25zdCBiZmRfYnl0ZSAqYnl0ZXM7Ci0gIC8qIFRoZSBlbmQgb2YgdGhlIGJ5dGVzIHRvIGJlIHBhcnNlZC4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpwZW5kOwotICAvKiBUaGUgYmxvY2sgc3RhY2suICAqLwotICBzdHJ1Y3QgaWVlZV9ibG9ja3N0YWNrIGJsb2Nrc3RhY2s7Ci0gIC8qIFdoZXRoZXIgd2UgaGF2ZSBzZWVuIGEgQkIxIG9yIEJCMi4gICovCi0gIGJvb2xlYW4gc2F3X2ZpbGVuYW1lOwotICAvKiBUaGUgdmFyaWFibGVzLiAgKi8KLSAgc3RydWN0IGllZWVfdmFycyB2YXJzOwotICAvKiBUaGUgZ2xvYmFsIHZhcmlhYmxlcywgYWZ0ZXIgYSBnbG9iYWwgdHlwZWRlZiBibG9jay4gICovCi0gIHN0cnVjdCBpZWVlX3ZhcnMgKmdsb2JhbF92YXJzOwotICAvKiBUaGUgdHlwZXMuICAqLwotICBzdHJ1Y3QgaWVlZV90eXBlcyB0eXBlczsKLSAgLyogVGhlIGdsb2JhbCB0eXBlcywgYWZ0ZXIgYSBnbG9iYWwgdHlwZWRlZiBibG9jay4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVzICpnbG9iYWxfdHlwZXM7Ci0gIC8qIFRoZSBsaXN0IG9mIHRhZ2dlZCBzdHJ1Y3RzLiAgKi8KLSAgc3RydWN0IGllZWVfdGFnICp0YWdzOwotfTsKLQotLyogQmFzaWMgYnVpbHRpbiB0eXBlcywgbm90IGluY2x1ZGluZyB0aGUgcG9pbnRlcnMuICAqLwotCi1lbnVtIGJ1aWx0aW5fdHlwZXMKLXsKLSAgYnVpbHRpbl91bmtub3duID0gMCwKLSAgYnVpbHRpbl92b2lkID0gMSwKLSAgYnVpbHRpbl9zaWduZWRfY2hhciA9IDIsCi0gIGJ1aWx0aW5fdW5zaWduZWRfY2hhciA9IDMsCi0gIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludCA9IDQsCi0gIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50ID0gNSwKLSAgYnVpbHRpbl9zaWduZWRfbG9uZyA9IDYsCi0gIGJ1aWx0aW5fdW5zaWduZWRfbG9uZyA9IDcsCi0gIGJ1aWx0aW5fc2lnbmVkX2xvbmdfbG9uZyA9IDgsCi0gIGJ1aWx0aW5fdW5zaWduZWRfbG9uZ19sb25nID0gOSwKLSAgYnVpbHRpbl9mbG9hdCA9IDEwLAotICBidWlsdGluX2RvdWJsZSA9IDExLAotICBidWlsdGluX2xvbmdfZG91YmxlID0gMTIsCi0gIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZSA9IDEzLAotICBidWlsdGluX3F1b3RlZF9zdHJpbmcgPSAxNCwKLSAgYnVpbHRpbl9pbnN0cnVjdGlvbl9hZGRyZXNzID0gMTUsCi0gIGJ1aWx0aW5faW50ID0gMTYsCi0gIGJ1aWx0aW5fdW5zaWduZWQgPSAxNywKLSAgYnVpbHRpbl91bnNpZ25lZF9pbnQgPSAxOCwKLSAgYnVpbHRpbl9jaGFyID0gMTksCi0gIGJ1aWx0aW5fbG9uZyA9IDIwLAotICBidWlsdGluX3Nob3J0ID0gMjEsCi0gIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQgPSAyMiwKLSAgYnVpbHRpbl9zaG9ydF9pbnQgPSAyMywKLSAgYnVpbHRpbl9zaWduZWRfc2hvcnQgPSAyNCwKLSAgYnVpbHRpbl9iY2RfZmxvYXQgPSAyNQotfTsKLQotLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm91bmQgaW4gdGhlIGRlcml2YXRpb24gZmxhZ3Mgb2YgYSAnYicKLSAgIGNvbXBvbmVudCByZWNvcmQgb2YgYSAnVCcgdHlwZSBleHRlbnNpb24gcmVjb3JkIGluIGEgQysrIHBtaXNjCi0gICByZWNvcmQuICBUaGVzZSBhcmUgYml0bWFza3MuICAqLwotCi0vKiBTZXQgZm9yIGEgcHJpdmF0ZSBiYXNlIGNsYXNzLCBjbGVhciBmb3IgYSBwdWJsaWMgYmFzZSBjbGFzcy4KLSAgIFByb3RlY3RlZCBiYXNlIGNsYXNzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuICAqLwotI2RlZmluZSBCQVNFRkxBR1NfUFJJVkFURSAoMHgxKQotLyogU2V0IGZvciBhIHZpcnR1YWwgYmFzZSBjbGFzcy4gICovCi0jZGVmaW5lIEJBU0VGTEFHU19WSVJUVUFMICgweDIpCi0vKiBTZXQgZm9yIGEgZnJpZW5kIGNsYXNzLCBjbGVhciBmb3IgYSBiYXNlIGNsYXNzLiAgKi8KLSNkZWZpbmUgQkFTRUZMQUdTX0ZSSUVORCAoMHgxMCkKLQotLyogVGhlc2UgYXJlIHRoZSB2YWx1ZXMgZm91bmQgaW4gdGhlIHNwZWNzIGZsYWdzIG9mIGEgJ2QnLCAnbScsIG9yICd2JwotICAgY29tcG9uZW50IHJlY29yZCBvZiBhICdUJyB0eXBlIGV4dGVuc2lvbiByZWNvcmQgaW4gYSBDKysgcG1pc2MKLSAgIHJlY29yZC4gIFRoZSBzYW1lIGZsYWdzIGFyZSB1c2VkIGZvciBhICdNJyByZWNvcmQgaW4gYSBDKysgcG1pc2MKLSAgIHJlY29yZC4gICovCi0KLS8qIFRoZSBsb3dlciB0d28gYml0cyBob2xkIHZpc2liaWxpdHkgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19WSVNJQklMSVRZICgweDMpCi0vKiBUaGlzIHZhbHVlIGluIHRoZSBsb3dlciB0d28gYml0cyBpbmRpY2F0ZXMgYSBwdWJsaWMgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QVUJMSUMgKDB4MCkKLS8qIFRoaXMgdmFsdWUgaW4gdGhlIGxvd2VyIHR3byBiaXRzIGluZGljYXRlcyBhIHByaXZhdGUgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFICgweDEpCi0vKiBUaGlzIHZhbHVlIGluIHRoZSBsb3dlciB0d28gYml0cyBpbmRpY2F0ZXMgYSBwcm90ZWN0ZWQgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQgKDB4MikKLS8qIFNldCBmb3IgYSBzdGF0aWMgbWVtYmVyLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfU1RBVElDICgweDQpCi0vKiBTZXQgZm9yIGEgdmlydHVhbCBvdmVycmlkZS4gICovCi0jZGVmaW5lIENYWEZMQUdTX09WRVJSSURFICgweDgpCi0vKiBTZXQgZm9yIGEgZnJpZW5kIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfRlJJRU5EICgweDEwKQotLyogU2V0IGZvciBhIGNvbnN0IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfQ09OU1QgKDB4MjApCi0vKiBTZXQgZm9yIGEgdm9sYXRpbGUgZnVuY3Rpb24uICAqLwotI2RlZmluZSBDWFhGTEFHU19WT0xBVElMRSAoMHg0MCkKLS8qIFNldCBmb3IgYW4gb3ZlcmxvYWRlZCBmdW5jdGlvbi4gICovCi0jZGVmaW5lIENYWEZMQUdTX09WRVJMT0FERUQgKDB4ODApCi0vKiBTZXQgZm9yIGFuIG9wZXJhdG9yIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfT1BFUkFUT1IgKDB4MTAwKQotLyogU2V0IGZvciBhIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IuICAqLwotI2RlZmluZSBDWFhGTEFHU19DVE9SRFRPUiAoMHg0MDApCi0vKiBTZXQgZm9yIGEgY29uc3RydWN0b3IuICAqLwotI2RlZmluZSBDWFhGTEFHU19DVE9SICgweDIwMCkKLS8qIFNldCBmb3IgYW4gaW5saW5lIGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgQ1hYRkxBR1NfSU5MSU5FICgweDgwMCkKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgaWVlZV9lcnJvcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgaWVlZV9lb2YgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqKSk7Ci1zdGF0aWMgY2hhciAqc2F2ZXN0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9udW1iZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGJmZF92bWEgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfaWQKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgY29uc3QgY2hhciAqKiwKLQkgICB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9vcHRpb25hbF9pZAotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBjb25zdCBjaGFyICoqLAotCSAgIHVuc2lnbmVkIGxvbmcgKiwgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfZXhwcmVzc2lvbgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCBiZmRfdm1hICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIGllZWVfYnVpbHRpbl90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FsbG9jX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF90eXBlX2luZGV4Ci0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGludCBpZWVlX3JlZ25vX3RvX2dlbnJlZyBQQVJBTVMgKChiZmQgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGllZWVfZ2VucmVnX3RvX3JlZ25vIFBBUkFNUyAoKGJmZCAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfYmIgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9iZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9pZWVlX25uIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX2llZWVfdHkgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2VfaWVlZV9hdG4gUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9taXNjCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhZF9jeHhfY2xhc3MKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9yZWFkX2N4eF9kZWZhdWx0cwotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9pbmZvICosIGNvbnN0IGJmZF9ieXRlICoqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlYWRfcmVmZXJlbmNlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2luZm8gKiwgY29uc3QgYmZkX2J5dGUgKiopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVxdWlyZV9hc24KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgYmZkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JlcXVpcmVfYXRuNjUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaW5mbyAqLCBjb25zdCBiZmRfYnl0ZSAqKiwgY29uc3QgY2hhciAqKiwKLQkgICB1bnNpZ25lZCBsb25nICopKTsKLQotLyogUmVwb3J0IGFuIGVycm9yIGluIHRoZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1pZWVlX2Vycm9yIChpbmZvLCBwLCBzKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaWYgKHAgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlczogMHglbHg6ICVzICgweCV4KVxuIiwgYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksCi0JICAgICAodW5zaWduZWQgbG9uZykgKHAgLSBpbmZvLT5ieXRlcyksIHMsICpwKTsKLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIHMpOwotfQotCi0vKiBSZXBvcnQgYW4gdW5leHBlY3RlZCBFT0YgaW4gdGhlIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfZW9mIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotewotICBpZWVlX2Vycm9yIChpbmZvLCAoY29uc3QgYmZkX2J5dGUgKikgTlVMTCwKLQkgICAgICBfKCJ1bmV4cGVjdGVkIGVuZCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSk7Ci19Ci0KLS8qIFNhdmUgYSBzdHJpbmcgaW4gbWVtb3J5LiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2F2ZXN0cmluZyAoc3RhcnQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuOwotewotICBjaGFyICpyZXQ7Ci0KLSAgcmV0ID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAocmV0LCBzdGFydCwgbGVuKTsKLSAgcmV0W2xlbl0gPSAnXDAnOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBSZWFkIGEgbnVtYmVyIHdoaWNoIG11c3QgYmUgcHJlc2VudCBpbiBhbiBJRUVFIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsIHB2KQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBiZmRfdm1hICpwdjsKLXsKLSAgcmV0dXJuIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCBwdiwgKGJvb2xlYW4gKikgTlVMTCk7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgaW4gYW4gSUVFRSBmaWxlLiAgSWYgcHByZXNlbnQgaXMgbm90IE5VTEwsIHRoZSBudW1iZXIKLSAgIG5lZWQgbm90IGJlIHRoZXJlLiAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsIHB2LCBwcHJlc2VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci0gICAgIGJvb2xlYW4gKnBwcmVzZW50OwotewotICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYjsKLQotICBpZiAoKnBwID49IGluZm8tPnBlbmQpCi0gICAgewotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JewotCSAgKnBwcmVzZW50ID0gZmFsc2U7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBpZWVlX2VvZiAoaW5mbyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGIgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotICArKypwcDsKLQotICBpZiAoYiA8PSBpZWVlX251bWJlcl9lbmRfZW51bSkKLSAgICB7Ci0gICAgICAqcHYgPSAoYmZkX3ZtYSkgYjsKLSAgICAgIGlmIChwcHJlc2VudCAhPSBOVUxMKQotCSpwcHJlc2VudCA9IHRydWU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGIgPj0gaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gJiYgYiA8PSBpZWVlX251bWJlcl9yZXBlYXRfZW5kX2VudW0pCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICAgIGkgPSAoaW50KSBiIC0gKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW07Ci0gICAgICBpZiAoKnBwICsgaSAtIDEgPj0gaW5mby0+cGVuZCkKLQl7Ci0JICBpZWVlX2VvZiAoaW5mbyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAqcHYgPSAwOwotICAgICAgZm9yICg7IGkgPiAwOyBpLS0pCi0JewotCSAgKnB2IDw8PSA4OwotCSAgKnB2ICs9ICoqcHA7Ci0JICArKypwcDsKLQl9Ci0KLSAgICAgIGlmIChwcHJlc2VudCAhPSBOVUxMKQotCSpwcHJlc2VudCA9IHRydWU7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAocHByZXNlbnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAtLSpwcDsKLSAgICAgICpwcHJlc2VudCA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGllZWVfZXJyb3IgKGluZm8sICpwcCAtIDEsIF8oImludmFsaWQgbnVtYmVyIikpOwotICByZXR1cm4gZmFsc2U7ICAKLX0KLQotLyogUmVhZCBhIHJlcXVpcmVkIHN0cmluZyBmcm9tIGFuIElFRUUgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3JlYWRfaWQgKGluZm8sIHBwLCBwbmFtZSwgcG5hbWxlbikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBuYW1lOwotICAgICB1bnNpZ25lZCBsb25nICpwbmFtbGVuOwotewotICByZXR1cm4gaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4sIChib29sZWFuICopIE5VTEwpOwotfQotCi0vKiBSZWFkIGEgc3RyaW5nIGZyb20gYW4gSUVFRSBmaWxlLiAgSWYgcHByZXNlbnQgaXMgbm90IE5VTEwsIHRoZQotICAgc3RyaW5nIGlzIG9wdGlvbmFsLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuLCBwcHJlc2VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBuYW1lOwotICAgICB1bnNpZ25lZCBsb25nICpwbmFtbGVuOwotICAgICBib29sZWFuICpwcHJlc2VudDsKLXsKLSAgYmZkX2J5dGUgYjsKLSAgdW5zaWduZWQgbG9uZyBsZW47Ci0KLSAgaWYgKCpwcCA+PSBpbmZvLT5wZW5kKQotICAgIHsKLSAgICAgIGllZWVfZW9mIChpbmZvKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgYiA9ICoqcHA7Ci0gICsrKnBwOwotCi0gIGlmIChiIDw9IDB4N2YpCi0gICAgbGVuID0gYjsKLSAgZWxzZSBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgYiA9PSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtKQotICAgIHsKLSAgICAgIGxlbiA9ICoqcHA7Ci0gICAgICArKypwcDsKLSAgICB9Ci0gIGVsc2UgaWYgKChpZWVlX3JlY29yZF9lbnVtX3R5cGUpIGIgPT0gaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSkKLSAgICB7Ci0gICAgICBsZW4gPSAoKipwcCA8PCA4KSArICgqcHApWzFdOwotICAgICAgKnBwICs9IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHBwcmVzZW50ICE9IE5VTEwpCi0JewotCSAgLS0qcHA7Ci0JICAqcHByZXNlbnQgPSBmYWxzZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCAtIDEsIF8oImludmFsaWQgc3RyaW5nIGxlbmd0aCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCh1bnNpZ25lZCBsb25nKSAoaW5mby0+cGVuZCAtICpwcCkgPCBsZW4pCi0gICAgewotICAgICAgaWVlZV9lb2YgKGluZm8pOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqcG5hbWUgPSAoY29uc3QgY2hhciAqKSAqcHA7Ci0gICpwbmFtbGVuID0gbGVuOwotICAqcHAgKz0gbGVuOwotCi0gIGlmIChwcHJlc2VudCAhPSBOVUxMKQotICAgICpwcHJlc2VudCA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYW4gZXhwcmVzc2lvbiBmcm9tIGFuIElFRUUgZmlsZS4gIFNpbmNlIHRoaXMgY29kZSBpcyBvbmx5IHVzZWQKLSAgIHRvIHBhcnNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiwgSSBoYXZlbid0IGJvdGhlcmVkIHRvIHdyaXRlIGEgZnVsbAotICAgYmxvd24gSUVFRSBleHByZXNzaW9uIHBhcnNlci4gIEkndmUgb25seSB0aHJvd24gaW4gdGhlIHRoaW5ncyBJJ3ZlCi0gICBzZWVuIGluIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgY2FuIGJlIGVhc2lseSBleHRlbmRlZCBpZgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgcHYpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIGJmZF92bWEgKnB2OwotewotICBjb25zdCBiZmRfYnl0ZSAqZXhwcl9zdGFydDsKLSNkZWZpbmUgRVhQUl9TVEFDS19TSVpFICgxMCkKLSAgYmZkX3ZtYSBleHByX3N0YWNrW0VYUFJfU1RBQ0tfU0laRV07Ci0gIGJmZF92bWEgKmVzcDsKLQotICBleHByX3N0YXJ0ID0gKnBwOwotCi0gIGVzcCA9IGV4cHJfc3RhY2s7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICBib29sZWFuIHByZXNlbnQ7Ci0gICAgICBpZWVlX3JlY29yZF9lbnVtX3R5cGUgYzsKLQotICAgICAgc3RhcnQgPSAqcHA7Ci0KLSAgICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdmFsLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAocHJlc2VudCkKLQl7Ci0JICBpZiAoZXNwIC0gZXhwcl9zdGFjayA+PSBFWFBSX1NUQUNLX1NJWkUpCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBvdmVyZmxvdyIpKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgICplc3ArKyA9IHZhbDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHA7Ci0KLSAgICAgIGlmIChjID49IGllZWVfbW9kdWxlX2JlZ2lubmluZ19lbnVtKQotCWJyZWFrOwotCi0gICAgICArKypwcDsKLQotICAgICAgaWYgKGMgPT0gaWVlZV9jb21tYSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQlkZWZhdWx0OgotCSAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuc3VwcG9ydGVkIElFRUUgZXhwcmVzc2lvbiBvcGVyYXRvciIpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX3ZhcmlhYmxlX1JfZW51bToKLQkgIHsKLQkgICAgYmZkX3ZtYSBpbmR4OwotCSAgICBhc2VjdGlvbiAqczsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmluZHgpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgZm9yIChzID0gaW5mby0+YWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JICAgICAgaWYgKChiZmRfdm1hKSBzLT50YXJnZXRfaW5kZXggPT0gaW5keCkKLQkJYnJlYWs7Ci0JICAgIGlmIChzID09IE5VTEwpCi0JICAgICAgewotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5rbm93biBzZWN0aW9uIikpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICAKLQkgICAgaWYgKGVzcCAtIGV4cHJfc3RhY2sgPj0gRVhQUl9TVEFDS19TSVpFKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oImV4cHJlc3Npb24gc3RhY2sgb3ZlcmZsb3ciKSk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgKmVzcCsrID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcyk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9mdW5jdGlvbl9wbHVzX2VudW06Ci0JY2FzZSBpZWVlX2Z1bmN0aW9uX21pbnVzX2VudW06Ci0JICB7Ci0JICAgIGJmZF92bWEgdjEsIHYyOwotCi0JICAgIGlmIChlc3AgLSBleHByX3N0YWNrIDwgMikKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJleHByZXNzaW9uIHN0YWNrIHVuZGVyZmxvdyIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICB2MSA9ICotLWVzcDsKLQkgICAgdjIgPSAqLS1lc3A7Ci0JICAgICplc3ArKyA9IHYxICsgdjI7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChlc3AgLSAxICE9IGV4cHJfc3RhY2spCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgZXhwcl9zdGFydCwgXygiZXhwcmVzc2lvbiBzdGFjayBtaXNtYXRjaCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgKnB2ID0gKi0tZXNwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gYW4gSUVFRSBidWlsdGluIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsIGluZHgpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpwOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLXsKLSAgUFRSIGRoYW5kbGU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoaW5keCA8IEJVSUxUSU5fVFlQRV9DT1VOVAotICAgICAgJiYgaW5mby0+dHlwZXMuYnVpbHRpbnNbaW5keF0gIT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XTsKLQotICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLQotICBpZiAoaW5keCA+PSAzMiAmJiBpbmR4IDwgNjQpCi0gICAgewotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBwLCBpbmR4IC0gMzIpKTsKLSAgICAgIGFzc2VydCAoaW5keCA8IEJVSUxUSU5fVFlQRV9DT1VOVCk7Ci0gICAgICBpbmZvLT50eXBlcy5idWlsdGluc1tpbmR4XSA9IHR5cGU7Ci0gICAgICByZXR1cm4gdHlwZTsKLSAgICB9Ci0KLSAgc3dpdGNoICgoZW51bSBidWlsdGluX3R5cGVzKSBpbmR4KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgcCwgXygidW5rbm93biBidWlsdGluIHR5cGUiKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgYnVpbHRpbl91bmtub3duOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSBOVUxMOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdm9pZDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBuYW1lID0gInZvaWQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fc2lnbmVkX2NoYXI6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgY2hhciI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9jaGFyOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9zaG9ydF9pbnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgc2hvcnQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0X2ludDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgc2hvcnQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3NpZ25lZF9sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIGxvbmciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZzoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2lnbmVkIGxvbmcgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl91bnNpZ25lZF9sb25nX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmcgbG9uZyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9mbG9hdDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgbmFtZSA9ICJmbG9hdCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9kb3VibGU6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2xvbmdfZG91YmxlOgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDEyKTsKLSAgICAgIG5hbWUgPSAibG9uZyBkb3VibGUiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fbG9uZ19sb25nX2RvdWJsZToKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDE2KTsKLSAgICAgIG5hbWUgPSAibG9uZyBsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9xdW90ZWRfc3RyaW5nOgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHAsCi0JCQkJCQkgICAgICAgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJYnVpbHRpbl9jaGFyKSksCi0JCQkJICAgIGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBwLAotCQkJCQkJICAgICAgICgodW5zaWduZWQgaW50KQotCQkJCQkJCWJ1aWx0aW5faW50KSksCi0JCQkJICAgIDAsIC0xLCB0cnVlKTsKLSAgICAgIG5hbWUgPSAiUVVPVEVEIFNUUklORyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9pbnN0cnVjdGlvbl9hZGRyZXNzOgotICAgICAgLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIGEgY29kZSBhZGRyZXNzLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAiaW5zdHJ1Y3Rpb24gYWRkcmVzcyI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9pbnQ6Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgZm9yIHRoaXMgdHlwZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlCi0gICAgICAgICBwcm9jZXNzb3IuICAqLwotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAiaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Vuc2lnbmVkOgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfaW50OgotICAgICAgLyogRklYTUU6IFRoZSBzaXplIGZvciB0aGlzIHR5cGUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZQotICAgICAgICAgcHJvY2Vzc29yLiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgaW50IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2NoYXI6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX2xvbmc6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Nob3J0OgotICAgICAgdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIG5hbWUgPSAic2hvcnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIHNob3J0IjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBidWlsdGluX3Nob3J0X2ludDoKLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBuYW1lID0gInNob3J0IGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYnVpbHRpbl9zaWduZWRfc2hvcnQ6Ci0gICAgICB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaWduZWQgc2hvcnQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJ1aWx0aW5fYmNkX2Zsb2F0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgcCwgXygiQkNEIGZsb2F0IHR5cGUgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCB0eXBlKTsKLQotICBhc3NlcnQgKGluZHggPCBCVUlMVElOX1RZUEVfQ09VTlQpOwotCi0gIGluZm8tPnR5cGVzLmJ1aWx0aW5zW2luZHhdID0gdHlwZTsKLQotICByZXR1cm4gdHlwZTsKLX0KLQotLyogQWxsb2NhdGUgbW9yZSBzcGFjZSBpbiB0aGUgdHlwZSB0YWJsZS4gIElmIHJlZiBpcyB0cnVlLCB0aGlzIGlzIGEKLSAgIHJlZmVyZW5jZSB0byB0aGUgdHlwZTsgaWYgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZCwgd2Ugc2hvdWxkIHNldAotICAgdXAgYW4gaW5kaXJlY3QgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2FsbG9jX3R5cGUgKGluZm8sIGluZHgsIHJlZikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci0gICAgIGJvb2xlYW4gcmVmOwotewotICB1bnNpZ25lZCBpbnQgbmFsbG9jOwotICByZWdpc3RlciBzdHJ1Y3QgaWVlZV90eXBlICp0OwotICBzdHJ1Y3QgaWVlZV90eXBlICp0ZW5kOwotCi0gIGlmIChpbmR4ID49IGluZm8tPnR5cGVzLmFsbG9jKQotICAgIHsKLSAgICAgIG5hbGxvYyA9IGluZm8tPnR5cGVzLmFsbG9jOwotICAgICAgaWYgKG5hbGxvYyA9PSAwKQotCW5hbGxvYyA9IDQ7Ci0gICAgICB3aGlsZSAoaW5keCA+PSBuYWxsb2MpCi0JbmFsbG9jICo9IDI7Ci0KLSAgICAgIGluZm8tPnR5cGVzLnR5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlICopCi0JCQkgICB4cmVhbGxvYyAoaW5mby0+dHlwZXMudHlwZXMsCi0JCQkJICAgICBuYWxsb2MgKiBzaXplb2YgKmluZm8tPnR5cGVzLnR5cGVzKSk7Ci0KLSAgICAgIG1lbXNldCAoaW5mby0+dHlwZXMudHlwZXMgKyBpbmZvLT50eXBlcy5hbGxvYywgMCwKLQkgICAgICAobmFsbG9jIC0gaW5mby0+dHlwZXMuYWxsb2MpICogc2l6ZW9mICppbmZvLT50eXBlcy50eXBlcyk7Ci0KLSAgICAgIHRlbmQgPSBpbmZvLT50eXBlcy50eXBlcyArIG5hbGxvYzsKLSAgICAgIGZvciAodCA9IGluZm8tPnR5cGVzLnR5cGVzICsgaW5mby0+dHlwZXMuYWxsb2M7IHQgPCB0ZW5kOyB0KyspCi0JdC0+dHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgaW5mby0+dHlwZXMuYWxsb2MgPSBuYWxsb2M7Ci0gICAgfQotCi0gIGlmIChyZWYpCi0gICAgewotICAgICAgdCA9IGluZm8tPnR5cGVzLnR5cGVzICsgaW5keDsKLSAgICAgIGlmICh0LT50eXBlID09IE5VTEwpCi0JewotCSAgdC0+cHNsb3QgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKnQtPnBzbG90KTsKLQkgICp0LT5wc2xvdCA9IERFQlVHX1RZUEVfTlVMTDsKLQkgIHQtPnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGluZm8tPmRoYW5kbGUsIHQtPnBzbG90LAotCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIGlmICh0LT50eXBlID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgdHlwZSBpbmRleCBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgYmZkX3ZtYSBpbmR4OwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChpbmR4IDwgMjU2KQotICAgIHsKLSAgICAgICpwdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCBzdGFydCwgaW5keCk7Ci0gICAgICBpZiAoKnB0eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZHggLT0gMjU2OwotICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIGluZHgsIHRydWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqcHR5cGUgPSBpbmZvLT50eXBlcy50eXBlc1tpbmR4XS50eXBlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBmaWxlLiAgVGhpcyBpcyBwYXNzZWQgdGhlCi0gICBieXRlcyB3aGljaCBjb21wb3NlIHRoZSBEZWJ1ZyBJbmZvcm1hdGlvbiBQYXJ0IG9mIGFuIElFRUUgZmlsZS4gICovCi0KLWJvb2xlYW4KLXBhcnNlX2llZWUgKGRoYW5kbGUsIGFiZmQsIGJ5dGVzLCBsZW4pCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGJmZF9ieXRlICpieXRlczsKLSAgICAgYmZkX3NpemVfdHlwZSBsZW47Ci17Ci0gIHN0cnVjdCBpZWVlX2luZm8gaW5mbzsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNvbnN0IGJmZF9ieXRlICpwLCAqcGVuZDsKLQotICBpbmZvLmRoYW5kbGUgPSBkaGFuZGxlOwotICBpbmZvLmFiZmQgPSBhYmZkOwotICBpbmZvLmJ5dGVzID0gYnl0ZXM7Ci0gIGluZm8ucGVuZCA9IGJ5dGVzICsgbGVuOwotICBpbmZvLmJsb2Nrc3RhY2suYnNwID0gaW5mby5ibG9ja3N0YWNrLnN0YWNrOwotICBpbmZvLnNhd19maWxlbmFtZSA9IGZhbHNlOwotICBpbmZvLnZhcnMuYWxsb2MgPSAwOwotICBpbmZvLnZhcnMudmFycyA9IE5VTEw7Ci0gIGluZm8uZ2xvYmFsX3ZhcnMgPSBOVUxMOwotICBpbmZvLnR5cGVzLmFsbG9jID0gMDsKLSAgaW5mby50eXBlcy50eXBlcyA9IE5VTEw7Ci0gIGluZm8uZ2xvYmFsX3R5cGVzID0gTlVMTDsKLSAgaW5mby50YWdzID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IEJVSUxUSU5fVFlQRV9DT1VOVDsgaSsrKQotICAgIGluZm8udHlwZXMuYnVpbHRpbnNbaV0gPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgcCA9IGJ5dGVzOwotICBwZW5kID0gaW5mby5wZW5kOwotICB3aGlsZSAocCA8IHBlbmQpCi0gICAgewotICAgICAgY29uc3QgYmZkX2J5dGUgKnJlY29yZF9zdGFydDsKLSAgICAgIGllZWVfcmVjb3JkX2VudW1fdHlwZSBjOwotCi0gICAgICByZWNvcmRfc3RhcnQgPSBwOwotCi0gICAgICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKnArKzsKLQotICAgICAgaWYgKGMgPT0gaWVlZV9hdF9yZWNvcmRfZW51bSkKLQljID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKCgodW5zaWduZWQgaW50KSBjIDw8IDgpIHwgKnArKyk7Ci0KLSAgICAgIGlmIChjIDw9IGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bSkKLQl7Ci0JICBpZWVlX2Vycm9yICgmaW5mbywgcmVjb3JkX3N0YXJ0LCBfKCJ1bmV4cGVjdGVkIG51bWJlciIpKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JZGVmYXVsdDoKLQkgIGllZWVfZXJyb3IgKCZpbmZvLCByZWNvcmRfc3RhcnQsIF8oInVuZXhwZWN0ZWQgcmVjb3JkIHR5cGUiKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQljYXNlIGllZWVfYmJfcmVjb3JkX2VudW06Ci0JICBpZiAoISBwYXJzZV9pZWVlX2JiICgmaW5mbywgJnApKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgaWVlZV9iZV9yZWNvcmRfZW51bToKLQkgIGlmICghIHBhcnNlX2llZWVfYmUgKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX25uX3JlY29yZDoKLQkgIGlmICghIHBhcnNlX2llZWVfbm4gKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBpZWVlX3R5X3JlY29yZF9lbnVtOgotCSAgaWYgKCEgcGFyc2VfaWVlZV90eSAoJmluZm8sICZwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGllZWVfYXRuX3JlY29yZF9lbnVtOgotCSAgaWYgKCEgcGFyc2VfaWVlZV9hdG4gKCZpbmZvLCAmcCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGluZm8uYmxvY2tzdGFjay5ic3AgIT0gaW5mby5ibG9ja3N0YWNrLnN0YWNrKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKCZpbmZvLCAoY29uc3QgYmZkX2J5dGUgKikgTlVMTCwKLQkJICBfKCJibG9ja3MgbGVmdCBvbiBzdGFjayBhdCBlbmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYW4gSUVFRSBCQiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9iYiAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpibG9ja19zdGFydDsKLSAgYmZkX2J5dGUgYjsKLSAgYmZkX3ZtYSBzaXplOwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLSAgY2hhciAqbmFtY29weSA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBmbmluZHg7Ci0gIGJvb2xlYW4gc2tpcDsKLQotICBibG9ja19zdGFydCA9ICpwcDsKLQotICBiID0gKipwcDsKLSAgKysqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKQotICAgICAgfHwgISBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZuaW5keCA9ICh1bnNpZ25lZCBpbnQpIC0xOwotICBza2lwID0gZmFsc2U7Ci0KLSAgc3dpdGNoIChiKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBCQjE6IFR5cGUgZGVmaW5pdGlvbnMgbG9jYWwgdG8gYSBtb2R1bGUuICAqLwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAobmFtY29weSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3NldF9maWxlbmFtZSAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby0+c2F3X2ZpbGVuYW1lID0gdHJ1ZTsKLQotICAgICAgLyogRGlzY2FyZCBhbnkgdmFyaWFibGVzIG9yIHR5cGVzIHdlIG1heSBoYXZlIHNlZW4gYmVmb3JlLiAgKi8KLSAgICAgIGlmIChpbmZvLT52YXJzLnZhcnMgIT0gTlVMTCkKLQlmcmVlIChpbmZvLT52YXJzLnZhcnMpOwotICAgICAgaW5mby0+dmFycy52YXJzID0gTlVMTDsKLSAgICAgIGluZm8tPnZhcnMuYWxsb2MgPSAwOwotICAgICAgaWYgKGluZm8tPnR5cGVzLnR5cGVzICE9IE5VTEwpCi0JZnJlZSAoaW5mby0+dHlwZXMudHlwZXMpOwotICAgICAgaW5mby0+dHlwZXMudHlwZXMgPSBOVUxMOwotICAgICAgaW5mby0+dHlwZXMuYWxsb2MgPSAwOwotCi0gICAgICAvKiBJbml0aWFsaXplIHRoZSB0eXBlcyB0byB0aGUgZ2xvYmFsIHR5cGVzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5nbG9iYWxfdHlwZXMgIT0gTlVMTCkKLQl7Ci0JICBpbmZvLT50eXBlcy5hbGxvYyA9IGluZm8tPmdsb2JhbF90eXBlcy0+YWxsb2M7Ci0JICBpbmZvLT50eXBlcy50eXBlcyA9ICgoc3RydWN0IGllZWVfdHlwZSAqKQotCQkJICAgICAgIHhtYWxsb2MgKGluZm8tPnR5cGVzLmFsbG9jCi0JCQkJCSogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKSk7Ci0JICBtZW1jcHkgKGluZm8tPnR5cGVzLnR5cGVzLCBpbmZvLT5nbG9iYWxfdHlwZXMtPnR5cGVzLAotCQkgIGluZm8tPnR5cGVzLmFsbG9jICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgLyogQkIyOiBHbG9iYWwgdHlwZSBkZWZpbml0aW9ucy4gIFRoZSBuYW1lIGlzIHN1cHBvc2VkIHRvIGJlCi0JIGVtcHR5LCBidXQgd2UgZG9uJ3QgY2hlY2suICovCi0gICAgICBpZiAoISBkZWJ1Z19zZXRfZmlsZW5hbWUgKGluZm8tPmRoYW5kbGUsICIqZ2xvYmFsKiIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnNhd19maWxlbmFtZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIEJCMzogSGlnaCBsZXZlbCBtb2R1bGUgYmxvY2sgYmVnaW4uICBXZSBkb24ndCBoYXZlIHRvIGRvCi0JIGFueXRoaW5nIGhlcmUuICBUaGUgbmFtZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBhcyBmb3IKLQkgdGhlIEJCMSwgYnV0IHdlIGRvbid0IGNoZWNrLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgLyogQkI0OiBHbG9iYWwgZnVuY3Rpb24uICAqLwotICAgICAgewotCWJmZF92bWEgc3RhY2tzcGFjZSwgdHlwaW5keCwgb2Zmc2V0OwotCWRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnN0YWNrc3BhY2UpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0eXBpbmR4KQotCSAgICB8fCAhIGllZWVfcmVhZF9leHByZXNzaW9uIChpbmZvLCBwcCwgJm9mZnNldCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBXZSBoYXZlIG5vIHdheSB0byByZWNvcmQgdGhlIHN0YWNrIHNwYWNlLiAgRklYTUUuICAqLwotCi0JaWYgKHR5cGluZHggPCAyNTYpCi0JICB7Ci0JICAgIHJldHVybl90eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIGJsb2NrX3N0YXJ0LCB0eXBpbmR4KTsKLQkgICAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICB0eXBpbmR4IC09IDI1NjsKLQkgICAgaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCB0eXBpbmR4LCB0cnVlKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGZuaW5keCA9IHR5cGluZHg7Ci0JICAgIHJldHVybl90eXBlID0gaW5mby0+dHlwZXMudHlwZXNbdHlwaW5keF0udHlwZTsKLQkgICAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsIHJldHVybl90eXBlKQotCQk9PSBERUJVR19LSU5EX0ZVTkNUSU9OKQotCSAgICAgIHJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChpbmZvLT5kaGFuZGxlLAotCQkJCQkJICAgcmV0dXJuX3R5cGUpOwotCSAgfQotCi0JbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQkgIHJldHVybiBmYWxzZTsKLQlpZiAoISBkZWJ1Z19yZWNvcmRfZnVuY3Rpb24gKGluZm8tPmRoYW5kbGUsIG5hbWNvcHksIHJldHVybl90eXBlLAotCQkJCSAgICAgdHJ1ZSwgb2Zmc2V0KSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA1OgotICAgICAgLyogQkI1OiBGaWxlIG5hbWUgZm9yIHNvdXJjZSBsaW5lIG51bWJlcnMuICAqLwotICAgICAgewotCXVuc2lnbmVkIGludCBpOwotCi0JLyogV2UgaWdub3JlIHRoZSBkYXRlIGFuZCB0aW1lLiAgRklYTUUuICAqLwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JICB7Ci0JICAgIGJmZF92bWEgaWdub3JlOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZpZ25vcmUsICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0KLQluYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQlpZiAobmFtY29weSA9PSBOVUxMKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNjoKLSAgICAgIC8qIEJCNjogTG9jYWwgZnVuY3Rpb24gb3IgYmxvY2suICAqLwotICAgICAgewotCWJmZF92bWEgc3RhY2tzcGFjZSwgdHlwaW5keCwgb2Zmc2V0OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzdGFja3NwYWNlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdHlwaW5keCkKLQkgICAgfHwgISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBzdGFjayBzcGFjZS4gIEZJWE1FLiAgKi8KLQotCWlmIChuYW1sZW4gPT0gMCkKLQkgIHsKLQkgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGluZm8tPmRoYW5kbGUsIG9mZnNldCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICAvKiBDaGFuZ2UgYiB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgaXMgYSBibG9jawotCSAgICAgICByYXRoZXIgdGhhbiBhIGZ1bmN0aW9uLiAgKi8KLQkgICAgYiA9IDB4ODY7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBUaGUgTVJJIEMrKyBjb21waWxlciB3aWxsIG91dHB1dCBhIGZha2UgZnVuY3Rpb24gbmFtZWQKLQkgICAgICAgX19YUllDUFAgdG8gaG9sZCBDKysgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgV2Ugc2tpcAotCSAgICAgICB0aGF0IGZ1bmN0aW9uLiAgVGhpcyBpcyBub3QgY3J1Y2lhbCwgYnV0IGl0IG1ha2VzCi0JICAgICAgIGNvbnZlcnRpbmcgZnJvbSBJRUVFIHRvIG90aGVyIGRlYnVnIGZvcm1hdHMgd29yawotCSAgICAgICBiZXR0ZXIuICAqLwotCSAgICBpZiAoc3RybmNtcCAobmFtZSwgIl9fWFJZQ1BQIiwgbmFtbGVuKSA9PSAwKQotCSAgICAgIHNraXAgPSB0cnVlOwotCSAgICBlbHNlCi0JICAgICAgewotCQlkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCi0JCWlmICh0eXBpbmR4IDwgMjU2KQotCQkgIHsKLQkJICAgIHJldHVybl90eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIGJsb2NrX3N0YXJ0LAotCQkJCQkJICAgICB0eXBpbmR4KTsKLQkJICAgIGlmIChyZXR1cm5fdHlwZSA9PSBOVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgdHlwaW5keCAtPSAyNTY7Ci0JCSAgICBpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHR5cGluZHgsIHRydWUpKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBmbmluZHggPSB0eXBpbmR4OwotCQkgICAgcmV0dXJuX3R5cGUgPSBpbmZvLT50eXBlcy50eXBlc1t0eXBpbmR4XS50eXBlOwotCQkgICAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsIHJldHVybl90eXBlKQotCQkJPT0gREVCVUdfS0lORF9GVU5DVElPTikKLQkJICAgICAgcmV0dXJuX3R5cGUgPSBkZWJ1Z19nZXRfcmV0dXJuX3R5cGUgKGluZm8tPmRoYW5kbGUsCi0JCQkJCQkJICAgcmV0dXJuX3R5cGUpOwotCQkgIH0KLQotCQluYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLQkJaWYgKG5hbWNvcHkgPT0gTlVMTCkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCWlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoaW5mby0+ZGhhbmRsZSwgbmFtY29weSwKLQkJCQkJICAgICByZXR1cm5fdHlwZSwgZmFsc2UsIG9mZnNldCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxMDoKLSAgICAgIC8qIEJCMTA6IEFzc2VtYmxlciBtb2R1bGUgc2NvcGUuICBJbiB0aGUgbm9ybWFsIGNhc2UsIHdlCi0JIGNvbXBsZXRlbHkgaWdub3JlIGFsbCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgewotCWNvbnN0IGNoYXIgKmluYW0sICp2c3RyOwotCXVuc2lnbmVkIGxvbmcgaW5hbWxlbiwgdnN0cmxlbjsKLQliZmRfdm1hIHRvb2xfdHlwZTsKLQlib29sZWFuIHByZXNlbnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlpZiAoISBpbmZvLT5zYXdfZmlsZW5hbWUpCi0JICB7Ci0JICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCSAgICBpZiAobmFtY29weSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChpbmZvLT5kaGFuZGxlLCBuYW1jb3B5KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGluZm8tPnNhd19maWxlbmFtZSA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoISBpZWVlX3JlYWRfaWQgKGluZm8sIHBwLCAmaW5hbSwgJmluYW1sZW4pCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0b29sX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJnZzdHIsICZ2c3RybGVuLCAmcHJlc2VudCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkgIHsKLQkgICAgYmZkX3ZtYSBpZ25vcmU7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZpZ25vcmUsICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMTE6Ci0gICAgICAvKiBCQjExOiBNb2R1bGUgc2VjdGlvbi4gIFdlIGNvbXBsZXRlbHkgaWdub3JlIGFsbCB0aGlzCi0JIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgewotCWJmZF92bWEgc2VjdHlwZSwgc2VjaW5keCwgb2Zmc2V0LCBtYXA7Ci0JYm9vbGVhbiBwcmVzZW50OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzZWN0eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2VjaW5keCkKLQkgICAgfHwgISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZtYXAsICZwcmVzZW50KSkKLQkgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGJsb2NrX3N0YXJ0LCBfKCJ1bmtub3duIEJCIHR5cGUiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0KLSAgLyogUHVzaCB0aGlzIGJsb2NrIG9uIHRoZSBibG9jayBzdGFjay4gICovCi0KLSAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwID49IGluZm8tPmJsb2Nrc3RhY2suc3RhY2sgKyBCTE9DS1NUQUNLX1NJWkUpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgKGNvbnN0IGJmZF9ieXRlICopIE5VTEwsIF8oInN0YWNrIG92ZXJmbG93IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+a2luZCA9IGI7Ci0gIGlmIChiID09IDUpCi0gICAgaW5mby0+YmxvY2tzdGFjay5ic3AtPmZpbGVuYW1lID0gbmFtY29weTsKLSAgaW5mby0+YmxvY2tzdGFjay5ic3AtPmZuaW5keCA9IGZuaW5keDsKLSAgaW5mby0+YmxvY2tzdGFjay5ic3AtPnNraXAgPSBza2lwOwotICArK2luZm8tPmJsb2Nrc3RhY2suYnNwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIYW5kbGUgYW4gSUVFRSBCRSByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9iZSAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGJmZF92bWEgb2Zmc2V0OwotCi0gIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygic3RhY2sgdW5kZXJmbG93IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLS1pbmZvLT5ibG9ja3N0YWNrLmJzcDsKLQotICBzd2l0Y2ggKGluZm8tPmJsb2Nrc3RhY2suYnNwLT5raW5kKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICAvKiBXaGVuIHdlIGVuZCB0aGUgZ2xvYmFsIHR5cGVkZWZzIGJsb2NrLCB3ZSBjb3B5IG91dCB0aGUgdGhlCi0gICAgICAgICBjb250ZW50cyBvZiBpbmZvLT52YXJzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSB2YXJpYWJsZSBpbmRpY2VzCi0gICAgICAgICBtYXkgYmUgcmV1c2VkIGluIHRoZSBsb2NhbCBibG9ja3MuICBIb3dldmVyLCB3ZSBuZWVkIHRvCi0gICAgICAgICBwcmVzZXJ2ZSB0aGVtIHNvIHRoYXQgd2UgY2FuIGxvY2F0ZSBhIGZ1bmN0aW9uIHJldHVybmluZyBhCi0gICAgICAgICByZWZlcmVuY2UgdmFyaWFibGUgd2hvc2UgdHlwZSBpcyBuYW1lZCBpbiB0aGUgZ2xvYmFsIHR5cGVkZWYKLSAgICAgICAgIGJsb2NrLiAgKi8KLSAgICAgIGluZm8tPmdsb2JhbF92YXJzID0gKChzdHJ1Y3QgaWVlZV92YXJzICopCi0JCQkgICB4bWFsbG9jIChzaXplb2YgKmluZm8tPmdsb2JhbF92YXJzKSk7Ci0gICAgICBpbmZvLT5nbG9iYWxfdmFycy0+YWxsb2MgPSBpbmZvLT52YXJzLmFsbG9jOwotICAgICAgaW5mby0+Z2xvYmFsX3ZhcnMtPnZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhciAqKQotCQkJCSB4bWFsbG9jIChpbmZvLT52YXJzLmFsbG9jCi0JCQkJCSAgKiBzaXplb2YgKCppbmZvLT52YXJzLnZhcnMpKSk7Ci0gICAgICBtZW1jcHkgKGluZm8tPmdsb2JhbF92YXJzLT52YXJzLCBpbmZvLT52YXJzLnZhcnMsCi0JICAgICAgaW5mby0+dmFycy5hbGxvYyAqIHNpemVvZiAoKmluZm8tPnZhcnMudmFycykpOwotCi0gICAgICAvKiBXZSBhbHNvIGNvcHkgb3V0IHRoZSBub24gYnVpbHRpbiBwYXJ0cyBvZiBpbmZvLT50eXBlcywgc2luY2UKLSAgICAgICAgIHRoZSB0eXBlcyBhcmUgZGlzY2FyZGVkIHdoZW4gd2Ugc3RhcnQgYSBuZXcgYmxvY2suICAqLwotICAgICAgaW5mby0+Z2xvYmFsX3R5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlcyAqKQotCQkJICAgIHhtYWxsb2MgKHNpemVvZiAqaW5mby0+Z2xvYmFsX3R5cGVzKSk7Ci0gICAgICBpbmZvLT5nbG9iYWxfdHlwZXMtPmFsbG9jID0gaW5mby0+dHlwZXMuYWxsb2M7Ci0gICAgICBpbmZvLT5nbG9iYWxfdHlwZXMtPnR5cGVzID0gKChzdHJ1Y3QgaWVlZV90eXBlICopCi0JCQkJICAgeG1hbGxvYyAoaW5mby0+dHlwZXMuYWxsb2MKLQkJCQkJICAgICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKSk7Ci0gICAgICBtZW1jcHkgKGluZm8tPmdsb2JhbF90eXBlcy0+dHlwZXMsIGluZm8tPnR5cGVzLnR5cGVzLAotCSAgICAgIGluZm8tPnR5cGVzLmFsbG9jICogc2l6ZW9mICgqaW5mby0+dHlwZXMudHlwZXMpKTsKLSAgICAgIG1lbXNldCAoaW5mby0+Z2xvYmFsX3R5cGVzLT5idWlsdGlucywgMCwKLQkgICAgICBzaXplb2YgKGluZm8tPmdsb2JhbF90eXBlcy0+YnVpbHRpbnMpKTsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6Ci0gICAgY2FzZSA2OgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBpbmZvLT5ibG9ja3N0YWNrLmJzcC0+c2tpcCkKLQl7Ci0JICBpZiAoISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGluZm8tPmRoYW5kbGUsIG9mZnNldCArIDEpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4ODY6Ci0gICAgICAvKiBUaGlzIGlzIEJFNiB3aGVuIEJCNiBzdGFydGVkIGEgYmxvY2sgcmF0aGVyIHRoYW4gYSBsb2NhbAotCSBmdW5jdGlvbi4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfZXhwcmVzc2lvbiAoaW5mbywgcHAsICZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX2VuZF9ibG9jayAoaW5mby0+ZGhhbmRsZSwgb2Zmc2V0ICsgMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDU6Ci0gICAgICAvKiBXaGVuIHdlIGVuZCBhIEJCNSwgd2UgbG9vayB1cCB0aGUgc3RhY2sgZm9yIHRoZSBsYXN0IEJCNSwgaWYKLSAgICAgICAgIHRoZXJlIGlzIG9uZSwgc28gdGhhdCB3ZSBjYW4gY2FsbCBkZWJ1Z19zdGFydF9zb3VyY2UuICAqLwotICAgICAgaWYgKGluZm8tPmJsb2Nrc3RhY2suYnNwID4gaW5mby0+YmxvY2tzdGFjay5zdGFjaykKLQl7Ci0JICBzdHJ1Y3QgaWVlZV9ibG9jayAqYmw7Ci0KLQkgIGJsID0gaW5mby0+YmxvY2tzdGFjay5ic3A7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgLS1ibDsKLQkgICAgICBpZiAoYmwtPmtpbmQgPT0gNSkKLQkJewotCQkgIGlmICghIGRlYnVnX3N0YXJ0X3NvdXJjZSAoaW5mby0+ZGhhbmRsZSwgYmwtPmZpbGVuYW1lKSkKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JICB3aGlsZSAoYmwgIT0gaW5mby0+YmxvY2tzdGFjay5zdGFjayk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDExOgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCAmb2Zmc2V0KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgbW9kdWxlIHNpemUuICBGSVhNRS4gICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBPdGhlciBibG9jayB0eXBlcyBkbyBub3QgaGF2ZSBhbnkgdHJhaWxpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhbiBOTiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2VfaWVlZV9ubiAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpubl9zdGFydDsKLSAgYmZkX3ZtYSB2YXJpbmR4OwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQotICBubl9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpCi0gICAgICB8fCAhIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZhcmluZHggPCAzMikKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBubl9zdGFydCwgXygiaWxsZWdhbCB2YXJpYWJsZSBpbmRleCIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIHZhcmluZHggLT0gMzI7Ci0KLSAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgICAgIGFsbG9jID0gaW5mby0+dmFycy5hbGxvYzsKLSAgICAgIGlmIChhbGxvYyA9PSAwKQotCWFsbG9jID0gNDsKLSAgICAgIHdoaWxlICh2YXJpbmR4ID49IGFsbG9jKQotCWFsbG9jICo9IDI7Ci0gICAgICBpbmZvLT52YXJzLnZhcnMgPSAoKHN0cnVjdCBpZWVlX3ZhciAqKQotCQkJIHhyZWFsbG9jIChpbmZvLT52YXJzLnZhcnMsCi0JCQkJICAgYWxsb2MgKiBzaXplb2YgKmluZm8tPnZhcnMudmFycykpOwotICAgICAgbWVtc2V0IChpbmZvLT52YXJzLnZhcnMgKyBpbmZvLT52YXJzLmFsbG9jLCAwLAotCSAgICAgIChhbGxvYyAtIGluZm8tPnZhcnMuYWxsb2MpICogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpOwotICAgICAgaW5mby0+dmFycy5hbGxvYyA9IGFsbG9jOwotICAgIH0KLQotICBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtZSA9IG5hbWU7Ci0gIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1sZW4gPSBuYW1sZW47Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgVFkgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2llZWVfdHkgKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqdHlfc3RhcnQsICp0eV92YXJfc3RhcnQsICp0eV9jb2RlX3N0YXJ0OwotICBiZmRfdm1hIHR5cGVpbmR4LCB2YXJpbmR4LCB0YzsKLSAgUFRSIGRoYW5kbGU7Ci0gIGJvb2xlYW4gdGFnLCB0eXBkZWY7Ci0gIGRlYnVnX3R5cGUgKmFyZ19zbG90czsKLSAgdW5zaWduZWQgbG9uZyB0eXBlX2JpdHNpemU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLQotICB0eV9zdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGVpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHR5cGVpbmR4IDwgMjU2KQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X3N0YXJ0LCBfKCJpbGxlZ2FsIHR5cGUgaW5kZXgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHR5cGVpbmR4IC09IDI1NjsKLSAgaWYgKCEgaWVlZV9hbGxvY190eXBlIChpbmZvLCB0eXBlaW5keCwgZmFsc2UpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoKipwcCAhPSAweGNlKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygidW5rbm93biBUWSBjb2RlIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgdHlfdmFyX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2YXJpbmR4IDwgMzIpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfdmFyX3N0YXJ0LCBfKCJpbGxlZ2FsIHZhcmlhYmxlIGluZGV4IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgdmFyaW5keCAtPSAzMjsKLQotICBpZiAodmFyaW5keCA+PSBpbmZvLT52YXJzLmFsbG9jIHx8IGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgdHlfdmFyX3N0YXJ0LCBfKCJ1bmRlZmluZWQgdmFyaWFibGUgaW4gVFkiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHR5X2NvZGVfc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ0YykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIHRhZyA9IGZhbHNlOwotICB0eXBkZWYgPSBmYWxzZTsKLSAgYXJnX3Nsb3RzID0gTlVMTDsKLSAgdHlwZV9iaXRzaXplID0gMDsKLSAgc3dpdGNoICh0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X2NvZGVfc3RhcnQsIF8oInVua25vd24gVFkgY29kZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgJyEnOgotICAgICAgLyogVW5rbm93biB0eXBlLCB3aXRoIHNpemUuICBXZSB0cmVhdCBpdCBhcyBpbnQuICBGSVhNRS4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBzaXplOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaXplKSkKLQkgIHJldHVybiBmYWxzZTsKLQl0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgc2l6ZSwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdBJzogLyogQXJyYXkuICAqLwotICAgIGNhc2UgJ2EnOiAvKiBGT1JUUkFOIGFycmF5IGluIGNvbHVtbi9yb3cgb3JkZXIuICBGSVhNRTogTm90Ci0JCSBkaXN0aW5ndWlzaGVkIGZyb20gbm9ybWFsIGFycmF5LiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGVsZV90eXBlOwotCWJmZF92bWEgbG93ZXIsIHVwcGVyOwotCi0JaWYgKCEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmZWxlX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZsb3dlcikKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnVwcGVyKSkKLQkgIHJldHVybiBmYWxzZTsKLQl0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLCBlbGVfdHlwZSwKLQkJCQkgICAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgdHlfY29kZV9zdGFydCwKLQkJCQkJCQkgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJICBidWlsdGluX2ludCkpLAotCQkJCSAgICAgIChiZmRfc2lnbmVkX3ZtYSkgbG93ZXIsCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSB1cHBlciwKLQkJCQkgICAgICBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0UnOgotICAgICAgLyogU2ltcGxlIGVudW1lcmF0aW9uLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWNvbnN0IGNoYXIgKipuYW1lczsKLQl1bnNpZ25lZCBpbnQgYzsKLQliZmRfc2lnbmVkX3ZtYSAqdmFsczsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JLyogRklYTUU6IHdlIGlnbm9yZSB0aGUgZW51bWVyYXRpb24gc2l6ZS4gICovCi0KLQlhbGxvYyA9IDEwOwotCW5hbWVzID0gKGNvbnN0IGNoYXIgKiopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpuYW1lcyk7Ci0JbWVtc2V0IChuYW1lcywgMCwgYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLQljID0gMDsKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgaWYgKCEgcHJlc2VudCkKLQkgICAgICBicmVhazsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCQkgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkgICAgICB9Ci0KLQkgICAgbmFtZXNbY10gPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotCSAgICBpZiAobmFtZXNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCW5hbWVzW2NdID0gTlVMTDsKLQotCXZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYyAqIHNpemVvZiAqdmFscyk7Ci0JZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQkgIHZhbHNbaV0gPSBpOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfZW51bV90eXBlIChkaGFuZGxlLCBuYW1lcywgdmFscyk7Ci0JdGFnID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICAvKiBTdHJ1Y3Qgd2l0aCBiaXQgZmllbGRzLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JYWxsb2MgPSAxMDsKLQlmaWVsZHMgPSAoZGVidWdfZmllbGQgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmZpZWxkcyk7Ci0JYyA9IDA7Ci0Jd2hpbGUgKDEpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0JICAgIGRlYnVnX3R5cGUgZnR5cGU7Ci0JICAgIGJmZF92bWEgYml0cG9zLCBiaXRzaXplOwotCi0JICAgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuLCAmcHJlc2VudCkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICBpZiAoISBwcmVzZW50KQotCSAgICAgIGJyZWFrOwotCSAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZmdHlwZSkKLQkJfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmJpdHBvcykKLQkJfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmJpdHNpemUpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkJICB4cmVhbGxvYyAoZmllbGRzLCBhbGxvYyAqIHNpemVvZiAqZmllbGRzKSk7Ci0JICAgICAgfQotCi0JICAgIGZpZWxkc1tjXSA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbiksCi0JCQkJCSAgZnR5cGUsIGJpdHBvcywgYml0c2l6ZSwKLQkJCQkJICBERUJVR19WSVNJQklMSVRZX1BVQkxJQyk7Ci0JICAgIGlmIChmaWVsZHNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCWZpZWxkc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdHJ1ZSwgc2l6ZSwgZmllbGRzKTsKLQl0YWcgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdOJzoKLSAgICAgIC8qIEVudW1lcmF0aW9uLiAgKi8KLSAgICAgIHsKLQl1bnNpZ25lZCBpbnQgYWxsb2M7Ci0JY29uc3QgY2hhciAqKm5hbWVzOwotCWJmZF9zaWduZWRfdm1hICp2YWxzOwotCXVuc2lnbmVkIGludCBjOwotCi0JYWxsb2MgPSAxMDsKLQluYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotCXZhbHMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKm5hbWVzKTsKLQljID0gMDsKLQl3aGlsZSAoMSkKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZTsKLQkgICAgdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0JICAgIGJvb2xlYW4gcHJlc2VudDsKLQkgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFsKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgLyogSWYgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZSBpcyB6ZXJvLCB0aGVuIHRoZSB2YWx1ZSBpcwotICAgICAgICAgICAgICAgYWN0dWFsbHkgdGhlIHNpemUgb2YgdGhlIGVudW0uICBXZSBpZ25vcmUgdGhpcwotICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0JICAgIGlmIChuYW1sZW4gPT0gMCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCQkgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkJdmFscyA9ICgoYmZkX3NpZ25lZF92bWEgKikKLQkJCXhyZWFsbG9jICh2YWxzLCBhbGxvYyAqIHNpemVvZiAqdmFscykpOwotCSAgICAgIH0KLQotCSAgICBuYW1lc1tjXSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0JICAgIGlmIChuYW1lc1tjXSA9PSBOVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgdmFsc1tjXSA9IChiZmRfc2lnbmVkX3ZtYSkgdmFsOwotCSAgICArK2M7Ci0JICB9Ci0KLQluYW1lc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWxzKTsKLQl0YWcgPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdPJzogLyogU21hbGwgcG9pbnRlci4gIFdlIGRvbid0IGRpc3Rpbmd1aXNoIHNtYWxsIGFuZCBsYXJnZQotCQkgcG9pbnRlcnMuICBGSVhNRS4gICovCi0gICAgY2FzZSAnUCc6IC8qIExhcmdlIHBvaW50ZXIuICAqLwotICAgICAgewotCWRlYnVnX3R5cGUgdDsKLQotCWlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCXR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwgdCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgLyogUmFuZ2UuICAqLwotICAgICAgewotCWJmZF92bWEgbG93LCBoaWdoLCBzaWduZWRwLCBzaXplOwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZsb3cpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZoaWdoKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2lnbmVkcCkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JdHlwZSA9IGRlYnVnX21ha2VfcmFuZ2VfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgICBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCBzaXplLAotCQkJCQkJCSAgICEgc2lnbmVkcCksCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSBsb3csCi0JCQkJICAgICAgKGJmZF9zaWduZWRfdm1hKSBoaWdoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6IC8qIFN0cnVjdC4gICovCi0gICAgY2FzZSAnVSc6IC8qIFVuaW9uLiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jOwotCWRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0JdW5zaWduZWQgaW50IGM7Ci0KLQlpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnNpemUpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JYWxsb2MgPSAxMDsKLQlmaWVsZHMgPSAoZGVidWdfZmllbGQgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKmZpZWxkcyk7Ci0JYyA9IDA7Ci0Jd2hpbGUgKDEpCi0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCSAgICBib29sZWFuIHByZXNlbnQ7Ci0JICAgIGJmZF92bWEgdGluZHg7Ci0JICAgIGJmZF92bWEgb2Zmc2V0OwotCSAgICBkZWJ1Z190eXBlIGZ0eXBlOwotCSAgICBiZmRfdm1hIGJpdHNpemU7Ci0KLQkgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGlmICghIHByZXNlbnQpCi0JICAgICAgYnJlYWs7Ci0JICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdGluZHgpCi0JCXx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZvZmZzZXQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAodGluZHggPCAyNTYpCi0JICAgICAgewotCQlmdHlwZSA9IGllZWVfYnVpbHRpbl90eXBlIChpbmZvLCB0eV9jb2RlX3N0YXJ0LCB0aW5keCk7Ci0JCWJpdHNpemUgPSAwOwotCQlvZmZzZXQgKj0gODsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cnVjdCBpZWVlX3R5cGUgKnQ7Ci0KLQkJdGluZHggLT0gMjU2OwotCQlpZiAoISBpZWVlX2FsbG9jX3R5cGUgKGluZm8sIHRpbmR4LCB0cnVlKSkKLQkJICByZXR1cm4gZmFsc2U7Ci0JCXQgPSBpbmZvLT50eXBlcy50eXBlcyArIHRpbmR4OwotCQlmdHlwZSA9IHQtPnR5cGU7Ci0JCWJpdHNpemUgPSB0LT5iaXRzaXplOwotCQlpZiAoYml0c2l6ZSA9PSAwKQotCQkgIG9mZnNldCAqPSA4OwotCSAgICAgIH0KLQotCSAgICBpZiAoYyArIDEgPj0gYWxsb2MpCi0JICAgICAgewotCQlhbGxvYyArPSAxMDsKLQkJZmllbGRzID0gKChkZWJ1Z19maWVsZCAqKQotCQkJICB4cmVhbGxvYyAoZmllbGRzLCBhbGxvYyAqIHNpemVvZiAqZmllbGRzKSk7Ci0JICAgICAgfQotCi0JICAgIGZpZWxkc1tjXSA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbiksCi0JCQkJCSAgZnR5cGUsIG9mZnNldCwgYml0c2l6ZSwKLQkJCQkJICBERUJVR19WSVNJQklMSVRZX1BVQkxJQyk7Ci0JICAgIGlmIChmaWVsZHNbY10gPT0gTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgICsrYzsKLQkgIH0KLQotCWZpZWxkc1tjXSA9IE5VTEw7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdGMgPT0gJ1MnLCBzaXplLCBmaWVsZHMpOwotCXRhZyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogVHlwZWRlZi4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICB0eXBkZWYgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgIC8qIFByb2NlZHVyZS4gIEZJWE1FOiBUaGlzIGlzIGFuIGV4dGVybiBkZWNsYXJhdGlvbiwgd2hpY2ggd2UKLSAgICAgICAgIGhhdmUgbm8gd2F5IG9mIHJlcHJlc2VudGluZy4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBhdHRyOwotCWRlYnVnX3R5cGUgcnR5cGU7Ci0JYmZkX3ZtYSBuYXJnczsKLQlib29sZWFuIHByZXNlbnQ7Ci0Jc3RydWN0IGllZWVfdmFyICpwdjsKLQotCS8qIEZJWE1FOiBXZSBpZ25vcmUgdGhlIGF0dHJpYnV0ZSBhbmQgdGhlIGFyZ3VtZW50IG5hbWVzLiAgKi8KLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXR0cikKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZydHlwZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJm5hcmdzKSkKLQkgIHJldHVybiBmYWxzZTsKLQlkbwotCSAgewotCSAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbjsKLQotCSAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfaWQgKGluZm8sIHBwLCAmbmFtZSwgJm5hbWxlbiwgJnByZXNlbnQpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl3aGlsZSAocHJlc2VudCk7Ci0KLQlwdiA9IGluZm8tPnZhcnMudmFycyArIHZhcmluZHg7Ci0JcHYtPmtpbmQgPSBJRUVFX0VYVEVSTkFMOwotCWlmIChwdi0+bmFtbGVuID4gMAotCSAgICAmJiBkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBydHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotCSAgewotCSAgICAvKiBTZXQgdXAgdGhlIHJldHVybiB0eXBlIGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcgdG8KLSAgICAgICAgICAgICAgIHRoZSB2YXJpYWJsZSBzbG90LCBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UgaXQgdG8gYQotICAgICAgICAgICAgICAgcmVmZXJlbmNlIGxhdGVyIGlmIGFwcHJvcHJpYXRlLiAgKi8KLQkgICAgcHYtPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpwdi0+cHNsb3QpOwotCSAgICAqcHYtPnBzbG90ID0gcnR5cGU7Ci0JICAgIHJ0eXBlID0gZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlIChkaGFuZGxlLCBwdi0+cHNsb3QsCi0JCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgfQotCi0JdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgcnR5cGUsIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkJCSBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgLyogVm9pZC4gIFRoaXMgaXMgbm90IGRvY3VtZW50ZWQsIGJ1dCB0aGUgTVJJIGNvbXBpbGVyIGVtaXRzIGl0LiAgKi8KLSAgICAgIHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1onOgotICAgICAgLyogQXJyYXkgd2l0aCAwIGxvd2VyIGJvdW5kLiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGV0eXBlOwotCWJmZF92bWEgaGlnaDsKLQotCWlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJmV0eXBlKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmaGlnaCkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQl0eXBlID0gZGVidWdfbWFrZV9hcnJheV90eXBlIChkaGFuZGxlLCBldHlwZSwKLQkJCQkgICAgICBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgdHlfY29kZV9zdGFydCwKLQkJCQkJCQkgKCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJICBidWlsdGluX2ludCkpLAotCQkJCSAgICAgIDAsIChiZmRfc2lnbmVkX3ZtYSkgaGlnaCwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzogLyogQ29tcGxleC4gICovCi0gICAgY2FzZSAnZCc6IC8qIERvdWJsZSBjb21wbGV4LiAgKi8KLSAgICAgIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGxvbmcgbmFtbGVuOwotCi0JLyogRklYTUU6IEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBuYW1lIG1lYW5zLiAgKi8KLQotCWlmICghIGllZWVfcmVhZF9pZCAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKSkKLQkgIHJldHVybiBmYWxzZTsKLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoZGhhbmRsZSwgdGMgPT0gJ2MnID8gNCA6IDgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICAgIC8qIFBhc2NhbCBmaWxlIG5hbWUuICBGSVhNRS4gICovCi0gICAgICBpZWVlX2Vycm9yIChpbmZvLCB0eV9jb2RlX3N0YXJ0LCBfKCJQYXNjYWwgZmlsZSBuYW1lIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlICdnJzoKLSAgICAgIC8qIEJpdGZpZWxkIHR5cGUuICAqLwotICAgICAgewotCWJmZF92bWEgc2lnbmVkcCwgYml0c2l6ZSwgZHVtbXk7Ci0JY29uc3QgYmZkX2J5dGUgKmhvbGQ7Ci0JYm9vbGVhbiBwcmVzZW50OwotCi0JaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZzaWduZWRwKQotCSAgICB8fCAhIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYml0c2l6ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBJIHRoaW5rIHRoZSBkb2N1bWVudGF0aW9uIHNheXMgdGhhdCB0aGVyZSBpcyBhIHR5cGUgaW5kZXgsCi0gICAgICAgICAgIGJ1dCBzb21lIGFjdHVhbCBmaWxlcyBkbyBub3QgaGF2ZSBvbmUuICAqLwotCWhvbGQgPSAqcHA7Ci0JaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZkdW1teSwgJnByZXNlbnQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICghIHByZXNlbnQpCi0JICB7Ci0JICAgIC8qIEZJWE1FOiBUaGlzIGlzIGp1c3QgYSBndWVzcy4gICovCi0JICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LAotCQkJCQlzaWduZWRwID8gZmFsc2UgOiB0cnVlKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgICpwcCA9IGhvbGQ7Ci0JICAgIGlmICghIGllZWVfcmVhZF90eXBlX2luZGV4IChpbmZvLCBwcCwgJnR5cGUpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQl0eXBlX2JpdHNpemUgPSBiaXRzaXplOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICduJzoKLSAgICAgIC8qIFF1YWxpZmllci4gICovCi0gICAgICB7Ci0JYmZkX3ZtYSBraW5kOwotCWRlYnVnX3R5cGUgdDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAma2luZCkKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZ0KSkKLQkgIHJldHVybiBmYWxzZTsKLQotCXN3aXRjaCAoa2luZCkKLQkgIHsKLQkgIGRlZmF1bHQ6Ci0JICAgIGllZWVfZXJyb3IgKGluZm8sIHR5X3N0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBxdWFsaWZlciIpKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBjYXNlIDE6Ci0JICAgIHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKGRoYW5kbGUsIHQpOwotCSAgICBicmVhazsKLQotCSAgY2FzZSAyOgotCSAgICB0eXBlID0gZGVidWdfbWFrZV92b2xhdGlsZV90eXBlIChkaGFuZGxlLCB0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgLyogU2V0LiAgKi8KLSAgICAgIHsKLQliZmRfdm1hIHNpemU7Ci0JZGVidWdfdHlwZSBldHlwZTsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmc2l6ZSkKLQkgICAgfHwgISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsICZldHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBGSVhNRTogV2UgaWdub3JlIHRoZSBzaXplLiAgKi8KLQotCXR5cGUgPSBkZWJ1Z19tYWtlX3NldF90eXBlIChkaGFuZGxlLCBldHlwZSwgZmFsc2UpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICAgIC8qIFByb2NlZHVyZSB3aXRoIGNvbXBpbGVyIGRlcGVuZGVuY2llcy4gICovCi0gICAgICB7Ci0Jc3RydWN0IGllZWVfdmFyICpwdjsKLQliZmRfdm1hIGF0dHIsIGZyYW1lX3R5cGUsIHB1c2hfbWFzaywgbmFyZ3MsIGxldmVsLCBmYXRoZXI7Ci0JZGVidWdfdHlwZSBydHlwZTsKLQlkZWJ1Z190eXBlICphcmdfdHlwZXM7Ci0JYm9vbGVhbiB2YXJhcmdzOwotCWJvb2xlYW4gcHJlc2VudDsKLQotCS8qIEZJWE1FOiBXZSBpZ25vcmUgc29tZSBvZiB0aGlzIGluZm9ybWF0aW9uLiAgKi8KLQotCXB2ID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKLQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXR0cikKLQkgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJmZyYW1lX3R5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZwdXNoX21hc2spCi0JICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmcnR5cGUpCi0JICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZuYXJncykpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKG5hcmdzID09IChiZmRfdm1hKSAtMSkKLQkgIHsKLQkgICAgYXJnX3R5cGVzID0gTlVMTDsKLQkgICAgdmFyYXJncyA9IGZhbHNlOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IGk7Ci0KLQkgICAgYXJnX3R5cGVzID0gKChkZWJ1Z190eXBlICopCi0JCQkgeG1hbGxvYyAoKG5hcmdzICsgMSkgKiBzaXplb2YgKmFyZ190eXBlcykpOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgbmFyZ3M7IGkrKykKLQkgICAgICBpZiAoISBpZWVlX3JlYWRfdHlwZV9pbmRleCAoaW5mbywgcHAsIGFyZ190eXBlcyArIGkpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkgICAgLyogSWYgdGhlIGxhc3QgdHlwZSBpcyBwb2ludGVyIHRvIHZvaWQsIHRoaXMgaXMgcmVhbGx5IGEKLSAgICAgICAgICAgICAgIHZhcmFyZ3MgZnVuY3Rpb24uICAqLwotCSAgICB2YXJhcmdzID0gZmFsc2U7Ci0JICAgIGlmIChuYXJncyA+IDApCi0JICAgICAgewotCQlkZWJ1Z190eXBlIGxhc3Q7Ci0KLQkJbGFzdCA9IGFyZ190eXBlc1tuYXJncyAtIDFdOwotCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgbGFzdCkgPT0gREVCVUdfS0lORF9QT0lOVEVSCi0JCSAgICAmJiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwKLQkJCQkJICAgICBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQkJCSAgICBsYXN0KSkKLQkJCT09IERFQlVHX0tJTkRfVk9JRCkpCi0JCSAgewotCQkgICAgLS1uYXJnczsKLQkJICAgIHZhcmFyZ3MgPSB0cnVlOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogSWYgdGhlcmUgYXJlIGFueSBwb2ludGVyIGFyZ3VtZW50cywgdHVybiB0aGVtIGludG8KLSAgICAgICAgICAgICAgIGluZGlyZWN0IHR5cGVzIGluIGNhc2Ugd2UgbGF0ZXIgbmVlZCB0byBjb252ZXJ0IHRoZW0gdG8KLSAgICAgICAgICAgICAgIHJlZmVyZW5jZSB0eXBlcy4gICovCi0JICAgIGZvciAoaSA9IDA7IGkgPCBuYXJnczsgaSsrKQotCSAgICAgIHsKLQkJaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGFyZ190eXBlc1tpXSkKLQkJICAgID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkJICB7Ci0JCSAgICBpZiAoYXJnX3Nsb3RzID09IE5VTEwpCi0JCSAgICAgIHsKLQkJCWFyZ19zbG90cyA9ICgoZGVidWdfdHlwZSAqKQotCQkJCSAgICAgeG1hbGxvYyAobmFyZ3MgKiBzaXplb2YgKmFyZ19zbG90cykpOwotCQkJbWVtc2V0IChhcmdfc2xvdHMsIDAsIG5hcmdzICogc2l6ZW9mICphcmdfc2xvdHMpOwotCQkgICAgICB9Ci0JCSAgICBhcmdfc2xvdHNbaV0gPSBhcmdfdHlwZXNbaV07Ci0JCSAgICBhcmdfdHlwZXNbaV0gPQotCQkgICAgICBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQlhcmdfc2xvdHMgKyBpLAotCQkJCQkJKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBhcmdfdHlwZXNbbmFyZ3NdID0gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCWlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbGV2ZWwpCi0JICAgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZmYXRoZXIsICZwcmVzZW50KSkKLQkgIHJldHVybiBmYWxzZTsKLQotCS8qIFdlIGNhbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gYSBnbG9iYWwgZnVuY3Rpb24gYW5kIGEgc3RhdGljCi0gICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQlwdi0+a2luZCA9IElFRUVfRlVOQ1RJT047Ci0KLQlpZiAocHYtPm5hbWxlbiA+IDAKLQkgICAgJiYgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgcnR5cGUpID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkgIHsKLQkgICAgLyogU2V0IHVwIHRoZSByZXR1cm4gdHlwZSBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nIHRvCi0gICAgICAgICAgICAgICB0aGUgdmFyaWFibGUgc2xvdCwgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIGl0IHRvIGEKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZSBsYXRlciBpZiBhcHByb3ByaWF0ZS4gICovCi0JICAgIHB2LT5wc2xvdCA9IChkZWJ1Z190eXBlICopIHhtYWxsb2MgKHNpemVvZiAqcHYtPnBzbG90KTsKLQkgICAgKnB2LT5wc2xvdCA9IHJ0eXBlOwotCSAgICBydHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgcHYtPnBzbG90LAotCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgIH0KLQotCXR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHJ0eXBlLCBhcmdfdHlwZXMsIHZhcmFyZ3MpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFJlY29yZCB0aGUgdHlwZSBpbiB0aGUgdGFibGUuICAqLwotCi0gIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+dmFycy52YXJzW3ZhcmluZHhdLnR5cGUgPSB0eXBlOwotCi0gIGlmICgodGFnIHx8IHR5cGRlZikKLSAgICAgICYmIGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1sZW4gPiAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIG5hbWUgPSBzYXZlc3RyaW5nIChpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtZSwKLQkJCSBpbmZvLT52YXJzLnZhcnNbdmFyaW5keF0ubmFtbGVuKTsKLSAgICAgIGlmICh0eXBkZWYpCi0JdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7Ci0gICAgICBlbHNlIGlmICh0YyA9PSAnRScgfHwgdGMgPT0gJ04nKQotCXR5cGUgPSBkZWJ1Z190YWdfdHlwZSAoZGhhbmRsZSwgbmFtZSwgdHlwZSk7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGllZWVfdGFnICppdDsKLQotCSAgLyogV2UgbXVzdCBhbGxvY2F0ZSBhbGwgc3RydWN0IHRhZ3MgYXMgaW5kaXJlY3QgdHlwZXMsIHNvCi0gICAgICAgICAgICAgdGhhdCBpZiB3ZSBsYXRlciBzZWUgYSBkZWZpbml0aW9uIG9mIHRoZSB0YWcgYXMgYSBDKysKLSAgICAgICAgICAgICByZWNvcmQgd2UgY2FuIHVwZGF0ZSB0aGUgaW5kaXJlY3Qgc2xvdCBhbmQgYXV0b21hdGljYWxseQotICAgICAgICAgICAgIGNoYW5nZSBhbGwgdGhlIGV4aXN0aW5nIHJlZmVyZW5jZXMuICAqLwotCSAgaXQgPSAoc3RydWN0IGllZWVfdGFnICopIHhtYWxsb2MgKHNpemVvZiAqaXQpOwotCSAgbWVtc2V0IChpdCwgMCwgc2l6ZW9mICppdCk7Ci0JICBpdC0+bmV4dCA9IGluZm8tPnRhZ3M7Ci0JICBpbmZvLT50YWdzID0gaXQ7Ci0JICBpdC0+bmFtZSA9IG5hbWU7Ci0JICBpdC0+c2xvdCA9IHR5cGU7Ci0KLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsICZpdC0+c2xvdCwgbmFtZSk7Ci0JICB0eXBlID0gZGVidWdfdGFnX3R5cGUgKGRoYW5kbGUsIG5hbWUsIHR5cGUpOwotCi0JICBpdC0+dHlwZSA9IHR5cGU7Ci0JfQotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPnR5cGVzLnR5cGVzW3R5cGVpbmR4XS50eXBlID0gdHlwZTsKLSAgaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLmFyZ19zbG90cyA9IGFyZ19zbG90czsKLSAgaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLmJpdHNpemUgPSB0eXBlX2JpdHNpemU7Ci0KLSAgLyogV2UgbWF5IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgdHlwZSBhcyBhbiBpbmRpcmVjdCB0eXBlIHBvaW50aW5nCi0gICAgIHRvIHNsb3QuICBJdCBkb2VzIG5vIGhhcm0gdG8gcmVwbGFjZSB0aGUgaW5kaXJlY3QgdHlwZSB3aXRoIHRoZQotICAgICByZWFsIHR5cGUuICBGaWxsaW5nIGluIHNsb3QgYXMgd2VsbCBoYW5kbGVzIHRoZSBpbmRpcmVjdCB0eXBlcwotICAgICB3aGljaCBhcmUgYWxyZWFkeSBoYW5naW5nIGFyb3VuZC4gICovCi0gIGlmIChpbmZvLT50eXBlcy50eXBlc1t0eXBlaW5keF0ucHNsb3QgIT0gTlVMTCkKLSAgICAqaW5mby0+dHlwZXMudHlwZXNbdHlwZWluZHhdLnBzbG90ID0gdHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUGFyc2UgYW4gQVROIHJlY29yZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9pZWVlX2F0biAoaW5mbywgcHApCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICphdG5fc3RhcnQsICphdG5fY29kZV9zdGFydDsKLSAgYmZkX3ZtYSB2YXJpbmR4OwotICBzdHJ1Y3QgaWVlZV92YXIgKnB2YXI7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBhdG5fY29kZTsKLSAgUFRSIGRoYW5kbGU7Ci0gIGJmZF92bWEgdiwgdjIsIHYzLCB2NCwgdjU7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICBjaGFyICpuYW1jb3B5OwotICBib29sZWFuIHByZXNlbnQ7Ci0gIGludCBibG9ja3R5cGU7Ci0KLSAgYXRuX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdmFyaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX3R5cGVfaW5kZXggKGluZm8sIHBwLCAmdHlwZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF0bl9jb2RlX3N0YXJ0ID0gKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmYXRuX2NvZGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmFyaW5keCA9PSAwKQotICAgIHsKLSAgICAgIHB2YXIgPSBOVUxMOwotICAgICAgbmFtZSA9ICIiOwotICAgICAgbmFtbGVuID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHZhcmluZHggPCAzMikKLSAgICB7Ci0gICAgICAvKiBUaGUgTVJJIGNvbXBpbGVyIHJlcG9ydGVkbHkgc29tZXRpbWVzIGVtaXRzIHZhcmlhYmxlIGxpZmV0aW1lCi0gICAgICAgICBpbmZvcm1hdGlvbiBmb3IgYSByZWdpc3Rlci4gIFdlIGp1c3QgaWdub3JlIGl0LiAgKi8KLSAgICAgIGlmIChhdG5fY29kZSA9PSA5KQotCXJldHVybiBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpOwotCi0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fc3RhcnQsIF8oImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFyaW5keCAtPSAzMjsKLSAgICAgIGlmICh2YXJpbmR4ID49IGluZm8tPnZhcnMuYWxsb2MKLQkgIHx8IGluZm8tPnZhcnMudmFyc1t2YXJpbmR4XS5uYW1lID09IE5VTEwpCi0JewotCSAgLyogVGhlIE1SSSBjb21waWxlciBvciBsaW5rZXIgc29tZXRpbWVzIG9taXRzIHRoZSBOTiByZWNvcmQKLSAgICAgICAgICAgICBmb3IgYSBwbWlzYyByZWNvcmQuICAqLwotCSAgaWYgKGF0bl9jb2RlID09IDYyKQotCSAgICB7Ci0JICAgICAgaWYgKHZhcmluZHggPj0gaW5mby0+dmFycy5hbGxvYykKLQkJewotCQkgIHVuc2lnbmVkIGludCBhbGxvYzsKLQotCQkgIGFsbG9jID0gaW5mby0+dmFycy5hbGxvYzsKLQkJICBpZiAoYWxsb2MgPT0gMCkKLQkJICAgIGFsbG9jID0gNDsKLQkJICB3aGlsZSAodmFyaW5keCA+PSBhbGxvYykKLQkJICAgIGFsbG9jICo9IDI7Ci0JCSAgaW5mby0+dmFycy52YXJzID0gKChzdHJ1Y3QgaWVlZV92YXIgKikKLQkJCQkgICAgIHhyZWFsbG9jIChpbmZvLT52YXJzLnZhcnMsCi0JCQkJCSAgICAgICAoYWxsb2MKLQkJCQkJCSogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpKSk7Ci0JCSAgbWVtc2V0IChpbmZvLT52YXJzLnZhcnMgKyBpbmZvLT52YXJzLmFsbG9jLCAwLAotCQkJICAoKGFsbG9jIC0gaW5mby0+dmFycy5hbGxvYykKLQkJCSAgICogc2l6ZW9mICppbmZvLT52YXJzLnZhcnMpKTsKLQkJICBpbmZvLT52YXJzLmFsbG9jID0gYWxsb2M7Ci0JCX0KLQotCSAgICAgIHB2YXIgPSBpbmZvLT52YXJzLnZhcnMgKyB2YXJpbmR4OwotCSAgICAgIHB2YXItPm5hbWUgPSAiIjsKLQkgICAgICBwdmFyLT5uYW1sZW4gPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fc3RhcnQsIF8oInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBBVE4iKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBwdmFyID0gaW5mby0+dmFycy52YXJzICsgdmFyaW5keDsKLQotICAgICAgcHZhci0+dHlwZSA9IHR5cGU7Ci0KLSAgICAgIG5hbWUgPSBwdmFyLT5uYW1lOwotICAgICAgbmFtbGVuID0gcHZhci0+bmFtbGVuOwotICAgIH0KLQotICBkaGFuZGxlID0gaW5mby0+ZGhhbmRsZTsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgd2l0aCBhIHBvaW50ZXIKLSAgICAgdHlwZSwgY2hhbmdlIHRoZSB0eXBlIHRvIGFuIGluZGlyZWN0IHR5cGUgc28gdGhhdCB3ZSBjYW4gbGF0ZXIKLSAgICAgY2hhbmdlIGl0IHRvIGEgcmVmZXJlbmNlIHR5cGUgaWYgd2UgZW5jb3VudGVyIGEgQysrIHBtaXNjICdSJwotICAgICByZWNvcmQuICAqLwotICBpZiAocHZhciAhPSBOVUxMCi0gICAgICAmJiB0eXBlICE9IERFQlVHX1RZUEVfTlVMTAotICAgICAgJiYgZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgdHlwZSkgPT0gREVCVUdfS0lORF9QT0lOVEVSKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYXRuX2NvZGUpCi0JewotCWNhc2UgMToKLQljYXNlIDI6Ci0JY2FzZSAzOgotCWNhc2UgNToKLQljYXNlIDg6Ci0JY2FzZSAxMDoKLQkgIHB2YXItPnBzbG90ID0gKGRlYnVnX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpwdmFyLT5wc2xvdCk7Ci0JICAqcHZhci0+cHNsb3QgPSB0eXBlOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgcHZhci0+cHNsb3QsCi0JCQkJCSAgIChjb25zdCBjaGFyICopIE5VTEwpOwotCSAgcHZhci0+dHlwZSA9IHR5cGU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAoYXRuX2NvZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBhdG5fY29kZV9zdGFydCwgXygidW5rbm93biBBVE4gdHlwZSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgMToKLSAgICAgIC8qIEF1dG9tYXRpYyB2YXJpYWJsZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX0xPQ0FMLCB2KTsKLQotICAgIGNhc2UgMjoKLSAgICAgIC8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgbmFtY29weSA9IHNhdmVzdHJpbmcgKG5hbWUsIG5hbWxlbik7Ci0gICAgICBpZiAodHlwZSA9PSBOVUxMKQotCXR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXB2YXItPmtpbmQgPSBJRUVFX0xPQ0FMOwotICAgICAgcmV0dXJuIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgbmFtY29weSwgdHlwZSwgREVCVUdfUkVHSVNURVIsCi0JCQkJICAgIGllZWVfcmVnbm9fdG9fZ2VucmVnIChpbmZvLT5hYmZkLCB2KSk7Ci0KLSAgICBjYXNlIDM6Ci0gICAgICAvKiBTdGF0aWMgdmFyaWFibGUuICAqLwotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBuYW1jb3B5ID0gc2F2ZXN0cmluZyAobmFtZSwgbmFtbGVuKTsKLSAgICAgIGlmICh0eXBlID09IE5VTEwpCi0JdHlwZSA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrKQotCWJsb2NrdHlwZSA9IDA7Ci0gICAgICBlbHNlCi0JYmxvY2t0eXBlID0gaW5mby0+YmxvY2tzdGFjay5ic3BbLTFdLmtpbmQ7Ci0gICAgICBpZiAocHZhciAhPSBOVUxMKQotCXsKLQkgIGlmIChibG9ja3R5cGUgPT0gNCB8fCBibG9ja3R5cGUgPT0gNikKLQkgICAgcHZhci0+a2luZCA9IElFRUVfTE9DQUw7Ci0JICBlbHNlCi0JICAgIHB2YXItPmtpbmQgPSBJRUVFX1NUQVRJQzsKLQl9Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLAotCQkJCSAgICAoYmxvY2t0eXBlID09IDQgfHwgYmxvY2t0eXBlID09IDYKLQkJCQkgICAgID8gREVCVUdfTE9DQUxfU1RBVElDCi0JCQkJICAgICA6IERFQlVHX1NUQVRJQyksCi0JCQkJICAgIHYpOwotCi0gICAgY2FzZSA0OgotICAgICAgLyogRXh0ZXJuYWwgZnVuY3Rpb24uICBXZSBkb24ndCBjdXJyZW50bHkgcmVjb3JkIHRoZXNlLiAgRklYTUUuICAqLwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9FWFRFUk5BTDsKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSA1OgotICAgICAgLyogRXh0ZXJuYWwgdmFyaWFibGUuICBXZSBkb24ndCBjdXJyZW50bHkgcmVjb3JkIHRoZXNlLiAgRklYTUUuICAqLwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9FWFRFUk5BTDsKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSA3OgotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KQotCSAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYyKQotCSAgfHwgISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYzLCAmcHJlc2VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHByZXNlbnQpCi0JewotCSAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2NCwgJnByZXNlbnQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgdHdvIG9wdGlvbmFsIGZpZWxkcyBpbiB2MyBhbmQgdjQsIHNpbmNlCi0gICAgICAgICB0aGV5IGFyZSBub3QgZGVmaW5lZC4gICovCi0KLSAgICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBjb2x1bW4gbnVtYmVyLiAgRklYTUUuICAqLwotCi0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX2xpbmUgKGRoYW5kbGUsIHYsIHYzKTsKLQotICAgIGNhc2UgODoKLSAgICAgIC8qIEdsb2JhbCB2YXJpYWJsZS4gICovCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9HTE9CQUw7Ci0gICAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1jb3B5LCB0eXBlLCBERUJVR19HTE9CQUwsIHYpOwotCi0gICAgY2FzZSA5OgotICAgICAgLyogVmFyaWFibGUgbGlmZXRpbWUgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCB0aGlzIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDEwOgotICAgICAgLyogTG9ja2VkIHJlZ2lzdGVyLiAgVGhlIHNwZWMgc2F5cyB0aGF0IHRoZXJlIGFyZSB0d28gcmVxdWlyZWQKLSAgICAgICAgIGZpZWxkcywgYnV0IGF0IGxlYXN0IG9uIG9jY2FzaW9uIHRoZSBNUkkgY29tcGlsZXIgb25seSBlbWl0cwotICAgICAgICAgb25lLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogSSB0aGluayB0aGlzIG1lYW5zIGEgdmFyaWFibGUgdGhhdCBpcyBib3RoIGluIGEgcmVnaXN0ZXIgYW5kCi0gICAgICAgICBhIGZyYW1lIHNsb3QuICBXZSBpZ25vcmUgdGhlIGZyYW1lIHNsb3QuICBGSVhNRS4gICovCi0KLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgaWYgKHR5cGUgPT0gTlVMTCkKLQl0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgaWYgKHB2YXIgIT0gTlVMTCkKLQlwdmFyLT5raW5kID0gSUVFRV9MT0NBTDsKLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksIHR5cGUsIERFQlVHX1JFR0lTVEVSLCB2KTsKLQotICAgIGNhc2UgMTE6Ci0gICAgICAvKiBSZXNlcnZlZCBmb3IgRk9SVFJBTiBjb21tb24uICAqLwotICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsIF8oInVuc3VwcG9ydGVkIEFUTjExIikpOwotCi0gICAgICAvKiBSZXR1cm4gdHJ1ZSB0byBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgY2FzZSAxMjoKLSAgICAgIC8qIEJhc2VkIHZhcmlhYmxlLiAgKi8KLSAgICAgIHYzID0gMDsKLSAgICAgIHY0ID0gMHg4MDsKLSAgICAgIHY1ID0gMDsKLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2MikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MywgJnByZXNlbnQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwcmVzZW50KQotCXsKLQkgIGlmICghIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjQsICZwcmVzZW50KSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKHByZXNlbnQpCi0JICAgIHsKLQkgICAgICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnY1LCAmcHJlc2VudCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4gICovCi0KLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIGF0bl9jb2RlX3N0YXJ0LCBfKCJ1bnN1cHBvcnRlZCBBVE4xMiIpKTsKLQotICAgICAgLyogUmV0dXJuIHRydWUgdG8ga2VlcCBnb2luZy4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGNhc2UgMTY6Ci0gICAgICAvKiBDb25zdGFudC4gIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHRoYXQgSSBoYXZlIGlzIGFtYmlndW91cywKLSAgICAgICAgIHNvIEknbSBub3QgZ29pbmcgdG8gdHJ5IHRvIGltcGxlbWVudCBpdC4gICovCi0gICAgICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnYpCi0JICB8fCAhIGllZWVfcmVhZF9vcHRpb25hbF9udW1iZXIgKGluZm8sIHBwLCAmdjIsICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHJlc2VudCkKLQl7Ci0JICBpZiAoISBpZWVlX3JlYWRfb3B0aW9uYWxfbnVtYmVyIChpbmZvLCBwcCwgJnYyLCAmcHJlc2VudCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmIChwcmVzZW50KQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcCA9PSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bSkKLQl7Ci0JICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBjYXNlIDE5OgotICAgICAgLyogU3RhdGljIHZhcmlhYmxlIGZyb20gYXNzZW1ibGVyLiAgKi8KLSAgICAgIHYyID0gMDsKLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX251bWJlciAoaW5mbywgcHAsICZ2MiwgJnByZXNlbnQpCi0JICB8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdjMpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChuYW1lLCBuYW1sZW4pOwotICAgICAgLyogV2UgZG9uJ3QgcmVhbGx5IGhhbmRsZSB0aGlzIGNvcnJlY3RseS4gIEZJWE1FLiAgKi8KLSAgICAgIHJldHVybiBkZWJ1Z19yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIG5hbWNvcHksCi0JCQkJICAgIGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKSwKLQkJCQkgICAgdjIgIT0gMCA/IERFQlVHX0dMT0JBTCA6IERFQlVHX1NUQVRJQywKLQkJCQkgICAgdjMpOwotCi0gICAgY2FzZSA2MjoKLSAgICAgIC8qIFByb2NlZHVyZSBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uLiAgKi8KLSAgICBjYXNlIDYzOgotICAgICAgLyogVmFyaWFibGUgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbi4gICovCi0gICAgY2FzZSA2NDoKLSAgICAgIC8qIE1vZHVsZSBtaXNjZWxsYW5lb3VzIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmdikKLQkgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZ2MikKLQkgIHx8ICEgaWVlZV9yZWFkX29wdGlvbmFsX2lkIChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4sICZwcmVzZW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChhdG5fY29kZSA9PSA2MiAmJiB2ID09IDgwKQotCXsKLQkgIGlmIChwcmVzZW50KQotCSAgICB7Ci0JICAgICAgaWVlZV9lcnJvciAoaW5mbywgYXRuX2NvZGVfc3RhcnQsCi0JCQkgIF8oInVuZXhwZWN0ZWQgc3RyaW5nIGluIEMrKyBtaXNjIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgcmV0dXJuIGllZWVfcmVhZF9jeHhfbWlzYyAoaW5mbywgcHAsIHYyKTsKLQl9Ci0KLSAgICAgIC8qIFdlIGp1c3QgaWdub3JlIGFsbCBvZiB0aGlzIHN0dWZmLiAgRklYTUUuICAqLwotCi0gICAgICBmb3IgKDsgdjIgPiAwOyAtLXYyKQotCXsKLQkgIHN3aXRjaCAoKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcCkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGllZWVfZXJyb3IgKGluZm8sICpwcCwgXygiYmFkIG1pc2MgcmVjb3JkIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBjYXNlIGllZWVfYXRfcmVjb3JkX2VudW06Ci0JICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBpZWVlX2UyX2ZpcnN0X2J5dGVfZW51bToKLQkgICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnYzKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogSGFuZGxlIEMrKyBkZWJ1Z2dpbmcgbWlzY2VsbGFuZW91cyByZWNvcmRzLiAgVGhpcyBpcyBjYWxsZWQgZm9yCi0gICBwcm9jZWR1cmUgbWlzY2VsbGFuZW91cyByZWNvcmRzIG9mIHR5cGUgODAuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9yZWFkX2N4eF9taXNjIChpbmZvLCBwcCwgY291bnQpCi0gICAgIHN0cnVjdCBpZWVlX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGJmZF9ieXRlICoqcHA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgYmZkX3ZtYSBjYXRlZ29yeTsKLQotICBzdGFydCA9ICpwcDsKLQotICAvKiBHZXQgdGhlIGNhdGVnb3J5IG9mIEMrKyBtaXNjIHJlY29yZC4gICovCi0gIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmY2F0ZWdvcnkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLS1jb3VudDsKLQotICBzd2l0Y2ggKGNhdGVnb3J5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgbWlzYyByZWNvcmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIGlmICghIGllZWVfcmVhZF9jeHhfY2xhc3MgKGluZm8sIHBwLCBjb3VudCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIHsKLQliZmRfdm1hIGZsYWdzOwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdW5zaWduZWQgbG9uZyBuYW1sZW47Ci0KLQkvKiBUaGUgSUVFRSBzcGVjIGluZGljYXRlcyB0aGF0IHRoZSAnTScgcmVjb3JkIG9ubHkgaGFzIGEKLSAgICAgICAgICAgZmxhZ3MgZmllbGQuICBUaGUgTVJJIGNvbXBpbGVyIGFsc28gZW1pdHMgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgICAgIGZ1bmN0aW9uLiAgKi8KLQotCWlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmICgqcHAgPCBpbmZvLT5wZW5kCi0JICAgICYmIChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICoqcHAgPT0gaWVlZV9hdF9yZWNvcmRfZW51bSkKLQkgIHsKLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQotCS8qIFRoaXMgaXMgZW1pdHRlZCBmb3IgbWV0aG9kIGZ1bmN0aW9ucywgYnV0IEkgZG9uJ3QgdGhpbmsgd2UKLSAgICAgICAgICAgY2FyZSB2ZXJ5IG11Y2guICBJdCBtaWdodCBoZWxwIGlmIGl0IHRvbGQgdXMgdXNlZnVsCi0gICAgICAgICAgIGluZm9ybWF0aW9uIGxpa2UgdGhlIGNsYXNzIHdpdGggd2hpY2ggdGhpcyBmdW5jdGlvbiBpcwotICAgICAgICAgICBhc3NvY2lhdGVkLCBidXQgaXQgZG9lc24ndCwgc28gaXQgaXNuJ3QgaGVscGZ1bC4gICovCi0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgaWYgKCEgaWVlZV9yZWFkX2N4eF9kZWZhdWx0cyAoaW5mbywgcHAsIGNvdW50KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3onOgotICAgICAgewotCWNvbnN0IGNoYXIgKm5hbWUsICptYW5nbGVkLCAqY2xhc3M7Ci0JdW5zaWduZWQgbG9uZyBuYW1sZW4sIG1hbmdsZWRsZW4sIGNsYXNzbGVuOwotCWJmZF92bWEgY29udHJvbDsKLQotCS8qIFBvaW50ZXIgdG8gbWVtYmVyLiAgKi8KLQotCWlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZuYW1lLCAmbmFtbGVuKQotCSAgICB8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkLCAmbWFuZ2xlZGxlbikKLQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmY2xhc3MsICZjbGFzc2xlbikKLQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNvbnRyb2wpKQotCSAgcmV0dXJuIGZhbHNlOwotCi0JLyogRklYTUU6IFdlIHNob3VsZCBub3cgdHJhY2sgZG93biBuYW1lIGFuZCBjaGFuZ2UgaXRzIHR5cGUuICAqLwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdSJzoKLSAgICAgIGlmICghIGllZWVfcmVhZF9yZWZlcmVuY2UgKGluZm8sIHBwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgYSBDKysgY2xhc3MgZGVmaW5pdGlvbi4gIFRoaXMgaXMgYSBwbWlzYyB0eXBlIDgwIHJlY29yZCBvZgotICAgY2F0ZWdvcnkgJ1QnLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9jeHhfY2xhc3MgKGluZm8sIHBwLCBjb3VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBiZmRfdm1hIGNsYXNzOwotICBjb25zdCBjaGFyICp0YWc7Ci0gIHVuc2lnbmVkIGxvbmcgdGFnbGVuOwotICBzdHJ1Y3QgaWVlZV90YWcgKml0OwotICBQVFIgZGhhbmRsZTsKLSAgZGVidWdfZmllbGQgKmZpZWxkczsKLSAgdW5zaWduZWQgaW50IGZpZWxkX2NvdW50LCBmaWVsZF9hbGxvYzsKLSAgZGVidWdfYmFzZWNsYXNzICpiYXNlY2xhc3NlczsKLSAgdW5zaWduZWQgaW50IGJhc2VjbGFzc2VzX2NvdW50LCBiYXNlY2xhc3Nlc19hbGxvYzsKLSAgY29uc3QgZGVidWdfZmllbGQgKnN0cnVjdGZpZWxkczsKLSAgc3RydWN0IGllZWVfbWV0aG9kCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbmFtbGVuOwotICAgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnZhcmlhbnRzOwotICAgICAgdW5zaWduZWQgY291bnQ7Ci0gICAgICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0gICAgfSAqbWV0aG9kczsKLSAgdW5zaWduZWQgaW50IG1ldGhvZHNfY291bnQsIG1ldGhvZHNfYWxsb2M7Ci0gIGRlYnVnX3R5cGUgdnB0cmJhc2U7Ci0gIGJvb2xlYW4gb3dudnB0cjsKLSAgZGVidWdfbWV0aG9kICpkbWV0aG9kczsKLQotICBzdGFydCA9ICpwcDsKLQotICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNsYXNzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC0tY291bnQ7Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJnRhZywgJnRhZ2xlbikpCi0gICAgcmV0dXJuIGZhbHNlOwotICAtLWNvdW50OwotCi0gIC8qIEZpbmQgdGhlIEMgc3RydWN0IHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgZm9yIChpdCA9IGluZm8tPnRhZ3M7IGl0ICE9IE5VTEw7IGl0ID0gaXQtPm5leHQpCi0gICAgaWYgKGl0LT5uYW1lWzBdID09IHRhZ1swXQotCSYmIHN0cm5jbXAgKGl0LT5uYW1lLCB0YWcsIHRhZ2xlbikgPT0gMAotCSYmIHN0cmxlbiAoaXQtPm5hbWUpID09IHRhZ2xlbikKLSAgICAgIGJyZWFrOwotICBpZiAoaXQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5kZWZpbmVkIEMrKyBvYmplY3QiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGRoYW5kbGUgPSBpbmZvLT5kaGFuZGxlOwotCi0gIGZpZWxkcyA9IE5VTEw7Ci0gIGZpZWxkX2NvdW50ID0gMDsKLSAgZmllbGRfYWxsb2MgPSAwOwotICBiYXNlY2xhc3NlcyA9IE5VTEw7Ci0gIGJhc2VjbGFzc2VzX2NvdW50ID0gMDsKLSAgYmFzZWNsYXNzZXNfYWxsb2MgPSAwOwotICBtZXRob2RzID0gTlVMTDsKLSAgbWV0aG9kc19jb3VudCA9IDA7Ci0gIG1ldGhvZHNfYWxsb2MgPSAwOwotICB2cHRyYmFzZSA9IERFQlVHX1RZUEVfTlVMTDsKLSAgb3dudnB0ciA9IGZhbHNlOwotCi0gIHN0cnVjdGZpZWxkcyA9IGRlYnVnX2dldF9maWVsZHMgKGRoYW5kbGUsIGl0LT50eXBlKTsKLQotICB3aGlsZSAoY291bnQgPiAwKQotICAgIHsKLSAgICAgIGJmZF92bWEgaWQ7Ci0gICAgICBjb25zdCBiZmRfYnl0ZSAqc3BlY19zdGFydDsKLQotICAgICAgc3BlY19zdGFydCA9ICpwcDsKLQotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZpZCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgLS1jb3VudDsKLQotICAgICAgc3dpdGNoIChpZCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGllZWVfZXJyb3IgKGluZm8sIHNwZWNfc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgb2JqZWN0IHNwZWMiKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0KLQljYXNlICdiJzoKLQkgIHsKLQkgICAgYmZkX3ZtYSBmbGFncywgY2lubGluZTsKLQkgICAgY29uc3QgY2hhciAqYmFzZW5hbWUsICpmaWVsZG5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgYmFzZWxlbiwgZmllbGRsZW47Ci0JICAgIGNoYXIgKmJhc2Vjb3B5OwotCSAgICBkZWJ1Z190eXBlIGJhc2V0eXBlOwotCSAgICBiZmRfdm1hIGJpdHBvczsKLQkgICAgYm9vbGVhbiB2aXJ0dWFscDsKLQkgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0JICAgIGRlYnVnX2Jhc2VjbGFzcyBiYXNlY2xhc3M7Ci0KLQkgICAgLyogVGhpcyByZXByZXNlbnRzIGEgYmFzZSBvciBmcmllbmQgY2xhc3MuICAqLwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmJhc2VuYW1lLCAmYmFzZWxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNpbmxpbmUpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmZpZWxkbmFtZSwgJmZpZWxkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDQ7Ci0KLQkgICAgLyogV2UgaGF2ZSBubyB3YXkgb2YgcmVjb3JkaW5nIGZyaWVuZCBpbmZvcm1hdGlvbiwgc28gd2UKLSAgICAgICAgICAgICAgIGp1c3QgaWdub3JlIGl0LiAgKi8KLQkgICAgaWYgKChmbGFncyAmIEJBU0VGTEFHU19GUklFTkQpICE9IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSSBhc3N1bWUgdGhhdCBlaXRoZXIgYWxsIG9mIHRoZSBtZW1iZXJzIG9mIHRoZQotICAgICAgICAgICAgICAgYmFzZWNsYXNzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0LCBzdGFydGluZyBhdCB0aGUKLSAgICAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgb2JqZWN0LCBvciB0aGF0IG5vbmUgb2YgdGhlbSBhcmUKLSAgICAgICAgICAgICAgIGluY2x1ZGVkLiAgKi8KLQotCSAgICBpZiAoKGZpZWxkbGVuID09IDApID09IChjaW5saW5lID09IDApKQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVuc3VwcG9ydGVkIEMrKyBvYmplY3QgdHlwZSIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBiYXNlY29weSA9IHNhdmVzdHJpbmcgKGJhc2VuYW1lLCBiYXNlbGVuKTsKLQkgICAgYmFzZXR5cGUgPSBkZWJ1Z19maW5kX3RhZ2dlZF90eXBlIChkaGFuZGxlLCBiYXNlY29weSwKLQkJCQkJICAgICAgIERFQlVHX0tJTkRfSUxMRUdBTCk7Ci0JICAgIGZyZWUgKGJhc2Vjb3B5KTsKLQkgICAgaWYgKGJhc2V0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICB7Ci0JCWllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgYmFzZSBjbGFzcyBub3QgZGVmaW5lZCIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQotCSAgICBpZiAoZmllbGRsZW4gPT0gMCkKLQkgICAgICBiaXRwb3MgPSAwOwotCSAgICBlbHNlCi0JICAgICAgewotCQljb25zdCBkZWJ1Z19maWVsZCAqcGY7Ci0KLQkJaWYgKHN0cnVjdGZpZWxkcyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCWZvciAocGYgPSBzdHJ1Y3RmaWVsZHM7ICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOyBwZisrKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotCi0JCSAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChkaGFuZGxlLCAqcGYpOwotCQkgICAgaWYgKGZuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmIChmbmFtZVswXSA9PSBmaWVsZG5hbWVbMF0KLQkJCSYmIHN0cm5jbXAgKGZuYW1lLCBmaWVsZG5hbWUsIGZpZWxkbGVuKSA9PSAwCi0JCQkmJiBzdHJsZW4gKGZuYW1lKSA9PSBmaWVsZGxlbikKLQkJICAgICAgYnJlYWs7Ci0JCSAgfQotCQlpZiAoKnBmID09IERFQlVHX0ZJRUxEX05VTEwpCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJXygiQysrIGJhc2UgY2xhc3Mgbm90IGZvdW5kIGluIGNvbnRhaW5lciIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJYml0cG9zID0gZGVidWdfZ2V0X2ZpZWxkX2JpdHBvcyAoZGhhbmRsZSwgKnBmKTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKChmbGFncyAmIEJBU0VGTEFHU19WSVJUVUFMKSAhPSAwKQotCSAgICAgIHZpcnR1YWxwID0gdHJ1ZTsKLQkgICAgZWxzZQotCSAgICAgIHZpcnR1YWxwID0gZmFsc2U7Ci0JICAgIGlmICgoZmxhZ3MgJiBCQVNFRkxBR1NfUFJJVkFURSkgIT0gMCkKLQkgICAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCSAgICBlbHNlCi0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCi0JICAgIGJhc2VjbGFzcyA9IGRlYnVnX21ha2VfYmFzZWNsYXNzIChkaGFuZGxlLCBiYXNldHlwZSwgYml0cG9zLAotCQkJCQkgICAgICB2aXJ0dWFscCwgdmlzaWJpbGl0eSk7Ci0JICAgIGlmIChiYXNlY2xhc3MgPT0gREVCVUdfQkFTRUNMQVNTX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIGlmIChiYXNlY2xhc3Nlc19jb3VudCArIDEgPj0gYmFzZWNsYXNzZXNfYWxsb2MpCi0JICAgICAgewotCQliYXNlY2xhc3Nlc19hbGxvYyArPSAxMDsKLQkJYmFzZWNsYXNzZXMgPSAoKGRlYnVnX2Jhc2VjbGFzcyAqKQotCQkJICAgICAgIHhyZWFsbG9jIChiYXNlY2xhc3NlcywKLQkJCQkJIChiYXNlY2xhc3Nlc19hbGxvYwotCQkJCQkgICogc2l6ZW9mICpiYXNlY2xhc3NlcykpKTsKLQkgICAgICB9Ci0KLQkgICAgYmFzZWNsYXNzZXNbYmFzZWNsYXNzZXNfY291bnRdID0gYmFzZWNsYXNzOwotCSAgICArK2Jhc2VjbGFzc2VzX2NvdW50OwotCSAgICBiYXNlY2xhc3Nlc1tiYXNlY2xhc3Nlc19jb3VudF0gPSBERUJVR19CQVNFQ0xBU1NfTlVMTDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6Ci0JICB7Ci0JICAgIGJmZF92bWEgZmxhZ3M7Ci0JICAgIGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgKm1hbmdsZWRuYW1lOwotCSAgICB1bnNpZ25lZCBsb25nIGZpZWxkbGVuLCBtYW5nbGVkbGVuOwotCSAgICBjaGFyICpmaWVsZGNvcHk7Ci0JICAgIGJvb2xlYW4gc3RhdGljcDsKLQkgICAgZGVidWdfdHlwZSBmdHlwZTsKLQkgICAgY29uc3QgZGVidWdfZmllbGQgKnBmID0gTlVMTDsKLQkgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0JICAgIGRlYnVnX2ZpZWxkIGZpZWxkOwotCi0JICAgIC8qIFRoaXMgcmVwcmVzZW50cyBhIGRhdGEgbWVtYmVyLiAgKi8KLQotCSAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmZsYWdzKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmaWVsZG5hbWUsICZmaWVsZGxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmbWFuZ2xlZG5hbWUsICZtYW5nbGVkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDM7Ci0KLQkgICAgZmllbGRjb3B5ID0gc2F2ZXN0cmluZyAoZmllbGRuYW1lLCBmaWVsZGxlbik7Ci0KLQkgICAgc3RhdGljcCA9IChmbGFncyAmIENYWEZMQUdTX1NUQVRJQykgIT0gMCA/IHRydWUgOiBmYWxzZTsKLQotCSAgICBpZiAoc3RhdGljcCkKLQkgICAgICB7Ci0JCXN0cnVjdCBpZWVlX3ZhciAqcHYsICpwdmVuZDsKLQotCQkvKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBkZWZpbml0aW9uIGZvciB0aGlzIHZhcmlhYmxlLiAgKi8KLQkJcHYgPSBpbmZvLT52YXJzLnZhcnM7Ci0JCXB2ZW5kID0gcHYgKyBpbmZvLT52YXJzLmFsbG9jOwotCQlmb3IgKDsgcHYgPCBwdmVuZDsgcHYrKykKLQkJICBpZiAocHYtPm5hbWxlbiA9PSBtYW5nbGVkbGVuCi0JCSAgICAgICYmIHN0cm5jbXAgKHB2LT5uYW1lLCBtYW5nbGVkbmFtZSwgbWFuZ2xlZGxlbikgPT0gMCkKLQkJICAgIGJyZWFrOwotCQlpZiAocHYgPCBwdmVuZCkKLQkJICBmdHlwZSA9IHB2LT50eXBlOwotCQllbHNlCi0JCSAgewotCQkgICAgLyogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB2YXJpYWJsZSBpcyBuZXZlciB1c2VkLiAgKi8KLQkJICAgIGZ0eXBlID0gaWVlZV9idWlsdGluX3R5cGUgKGluZm8sIHN0YXJ0LAotCQkJCQkgICAgICAgKHVuc2lnbmVkIGludCkgYnVpbHRpbl92b2lkKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgZmluZHg7Ci0KLQkJaWYgKHN0cnVjdGZpZWxkcyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgb2JqZWN0IGhhcyBubyBmaWVsZHMiKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCWZvciAocGYgPSBzdHJ1Y3RmaWVsZHMsIGZpbmR4ID0gMDsKLQkJICAgICAqcGYgIT0gREVCVUdfRklFTERfTlVMTDsKLQkJICAgICBwZisrLCBmaW5keCsrKQotCQkgIHsKLQkJICAgIGNvbnN0IGNoYXIgKmZuYW1lOwotCi0JCSAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChkaGFuZGxlLCAqcGYpOwotCQkgICAgaWYgKGZuYW1lID09IE5VTEwpCi0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIGlmIChmbmFtZVswXSA9PSBtYW5nbGVkbmFtZVswXQotCQkJJiYgc3RybmNtcCAoZm5hbWUsIG1hbmdsZWRuYW1lLCBtYW5nbGVkbGVuKSA9PSAwCi0JCQkmJiBzdHJsZW4gKGZuYW1lKSA9PSBtYW5nbGVkbGVuKQotCQkgICAgICBicmVhazsKLQkJICB9Ci0JCWlmICgqcGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQlfKCJDKysgZGF0YSBtZW1iZXIgbm90IGZvdW5kIGluIGNvbnRhaW5lciIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0KLQkJZnR5cGUgPSBkZWJ1Z19nZXRfZmllbGRfdHlwZSAoZGhhbmRsZSwgKnBmKTsKLQotCQlpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgZnR5cGUpID09IERFQlVHX0tJTkRfUE9JTlRFUikKLQkJICB7Ci0JCSAgICAvKiBXZSBtaWdodCBuZWVkIHRvIGNvbnZlcnQgdGhpcyBmaWVsZCBpbnRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlIHR5cGUgbGF0ZXIgb24sIHNvIG1ha2UgaXQgYW4gaW5kaXJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZS4gICovCi0JCSAgICBpZiAoaXQtPmZzbG90cyA9PSBOVUxMKQotCQkgICAgICB7Ci0JCQl1bnNpZ25lZCBpbnQgZmNudDsKLQkJCWNvbnN0IGRlYnVnX2ZpZWxkICpwZmNudDsKLQotCQkJZmNudCA9IDA7Ci0JCQlmb3IgKHBmY250ID0gc3RydWN0ZmllbGRzOwotCQkJICAgICAqcGZjbnQgIT0gREVCVUdfRklFTERfTlVMTDsKLQkJCSAgICAgcGZjbnQrKykKLQkJCSAgKytmY250OwotCQkJaXQtPmZzbG90cyA9ICgoZGVidWdfdHlwZSAqKQotCQkJCSAgICAgIHhtYWxsb2MgKGZjbnQgKiBzaXplb2YgKml0LT5mc2xvdHMpKTsKLQkJCW1lbXNldCAoaXQtPmZzbG90cywgMCwKLQkJCQlmY250ICogc2l6ZW9mICppdC0+ZnNsb3RzKTsKLQkJICAgICAgfQotCi0JCSAgICBpZiAoZnR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgICAgICByZXR1cm4gZmFsc2U7Ci0JCSAgICBpdC0+ZnNsb3RzW2ZpbmR4XSA9IGZ0eXBlOwotCQkgICAgZnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsCi0JCQkJCQkgICAgICBpdC0+ZnNsb3RzICsgZmluZHgsCi0JCQkJCQkgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoZnR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBzd2l0Y2ggKGZsYWdzICYgQ1hYRkxBR1NfVklTSUJJTElUWSkKLQkgICAgICB7Ci0JICAgICAgZGVmYXVsdDoKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVua25vd24gQysrIHZpc2liaWxpdHkiKSk7Ci0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QVUJMSUM6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJJVkFURToKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIENYWEZMQUdTX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBpZiAoc3RhdGljcCkKLQkgICAgICB7Ci0JCWNoYXIgKm1hbmdsZWRjb3B5OwotCi0JCW1hbmdsZWRjb3B5ID0gc2F2ZXN0cmluZyAobWFuZ2xlZG5hbWUsIG1hbmdsZWRsZW4pOwotCi0JCWZpZWxkID0gZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChkaGFuZGxlLCBmaWVsZGNvcHksCi0JCQkJCQkgIGZ0eXBlLCBtYW5nbGVkY29weSwKLQkJCQkJCSAgdmlzaWJpbGl0eSk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQliZmRfdm1hIGJpdHBvcywgYml0c2l6ZTsKLQotCQliaXRwb3MgPSBkZWJ1Z19nZXRfZmllbGRfYml0cG9zIChkaGFuZGxlLCAqcGYpOwotCQliaXRzaXplID0gZGVidWdfZ2V0X2ZpZWxkX2JpdHNpemUgKGRoYW5kbGUsICpwZik7Ci0JCWlmIChiaXRwb3MgPT0gKGJmZF92bWEpIC0xIHx8IGJpdHNpemUgPT0gKGJmZF92bWEpIC0xKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJiYWQgQysrIGZpZWxkIGJpdCBwb3Mgb3Igc2l6ZSIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JCWZpZWxkID0gZGVidWdfbWFrZV9maWVsZCAoZGhhbmRsZSwgZmllbGRjb3B5LCBmdHlwZSwgYml0cG9zLAotCQkJCQkgIGJpdHNpemUsIHZpc2liaWxpdHkpOwotCSAgICAgIH0KLQotCSAgICBpZiAoZmllbGQgPT0gREVCVUdfRklFTERfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgaWYgKGZpZWxkX2NvdW50ICsgMSA+PSBmaWVsZF9hbGxvYykKLQkgICAgICB7Ci0JCWZpZWxkX2FsbG9jICs9IDEwOwotCQlmaWVsZHMgPSAoKGRlYnVnX2ZpZWxkICopCi0JCQkgIHhyZWFsbG9jIChmaWVsZHMsIGZpZWxkX2FsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgICB9Ci0KLQkgICAgZmllbGRzW2ZpZWxkX2NvdW50XSA9IGZpZWxkOwotCSAgICArK2ZpZWxkX2NvdW50OwotCSAgICBmaWVsZHNbZmllbGRfY291bnRdID0gREVCVUdfRklFTERfTlVMTDsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnbSc6Ci0JY2FzZSAndic6Ci0JICB7Ci0JICAgIGJmZF92bWEgZmxhZ3MsIHZvZmZzZXQsIGNvbnRyb2w7Ci0JICAgIGNvbnN0IGNoYXIgKm5hbWUsICptYW5nbGVkOwotCSAgICB1bnNpZ25lZCBsb25nIG5hbWxlbiwgbWFuZ2xlZGxlbjsKLQkgICAgc3RydWN0IGllZWVfdmFyICpwdiwgKnB2ZW5kOwotCSAgICBkZWJ1Z190eXBlIHR5cGU7Ci0JICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotCSAgICBib29sZWFuIGNvbnN0cCwgdm9sYXRpbGVwOwotCSAgICBjaGFyICptYW5nbGVkY29weTsKLQkgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgbXY7Ci0JICAgIHN0cnVjdCBpZWVlX21ldGhvZCAqbWV0aDsKLQkgICAgdW5zaWduZWQgaW50IGltOwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmZmxhZ3MpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm1hbmdsZWQsICZtYW5nbGVkbGVuKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIGNvdW50IC09IDM7Ci0JICAgIGlmIChpZCAhPSAndicpCi0JICAgICAgdm9mZnNldCA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdm9mZnNldCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQktLWNvdW50OwotCSAgICAgIH0KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZjb250cm9sKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIC0tY291bnQ7Ci0KLQkgICAgLyogV2UganVzdCBpZ25vcmUgdGhlIGNvbnRyb2wgaW5mb3JtYXRpb24uICAqLwotCi0JICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHJlcHJlc2VudCBmcmllbmQgaW5mb3JtYXRpb24sIHNvIHdlCi0gICAgICAgICAgICAgICBqdXN0IGlnbm9yZSBpdC4gICovCi0JICAgIGlmICgoZmxhZ3MgJiBDWFhGTEFHU19GUklFTkQpICE9IDApCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogV2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBzZWVuIGEgdHlwZSBmb3IgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgICAgcHYgPSBpbmZvLT52YXJzLnZhcnM7Ci0JICAgIHB2ZW5kID0gcHYgKyBpbmZvLT52YXJzLmFsbG9jOwotCSAgICBmb3IgKDsgcHYgPCBwdmVuZDsgcHYrKykKLQkgICAgICBpZiAocHYtPm5hbWxlbiA9PSBtYW5nbGVkbGVuCi0JCSAgJiYgc3RybmNtcCAocHYtPm5hbWUsIG1hbmdsZWQsIG1hbmdsZWRsZW4pID09IDApCi0JCWJyZWFrOwotCi0JICAgIGlmIChwdiA+PSBwdmVuZCkKLQkgICAgICB7Ci0JCS8qIFdlIHdvbid0IGhhdmUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBmdW5jdGlvbiBpZgotCQkgICBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBmaWxlLiAgV2UgZG9uJ3QgdHJ5IHRvCi0JCSAgIGhhbmRsZSB0aGlzIGNhc2UuICBGSVhNRS4gICovCi0JCXR5cGUgPSAoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0JCQkoZGhhbmRsZSwKLQkJCSBpZWVlX2J1aWx0aW5fdHlwZSAoaW5mbywgc3RhcnQsCi0JCQkJCSAgICAodW5zaWduZWQgaW50KSBidWlsdGluX3ZvaWQpLAotCQkJIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkgZmFsc2UpKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRlYnVnX3R5cGUgcmV0dXJuX3R5cGU7Ci0JCWNvbnN0IGRlYnVnX3R5cGUgKmFyZ190eXBlczsKLQkJYm9vbGVhbiB2YXJhcmdzOwotCi0JCWlmIChkZWJ1Z19nZXRfdHlwZV9raW5kIChkaGFuZGxlLCBwdi0+dHlwZSkKLQkJICAgICE9IERFQlVHX0tJTkRfRlVOQ1RJT04pCi0JCSAgewotCQkgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkJXygiYmFkIHR5cGUgZm9yIEMrKyBtZXRob2QgZnVuY3Rpb24iKSk7Ci0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCSAgfQotCi0JCXJldHVybl90eXBlID0gZGVidWdfZ2V0X3JldHVybl90eXBlIChkaGFuZGxlLCBwdi0+dHlwZSk7Ci0JCWFyZ190eXBlcyA9IGRlYnVnX2dldF9wYXJhbWV0ZXJfdHlwZXMgKGRoYW5kbGUsIHB2LT50eXBlLAotCQkJCQkJICAgICAgICZ2YXJhcmdzKTsKLQkJaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCB8fCBhcmdfdHlwZXMgPT0gTlVMTCkKLQkJICB7Ci0JCSAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCQlfKCJubyB0eXBlIGluZm9ybWF0aW9uIGZvciBDKysgbWV0aG9kIGZ1bmN0aW9uIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQotCQl0eXBlID0gZGVidWdfbWFrZV9tZXRob2RfdHlwZSAoZGhhbmRsZSwgcmV0dXJuX3R5cGUsIGl0LT50eXBlLAotCQkJCQkgICAgICAgKGRlYnVnX3R5cGUgKikgYXJnX3R5cGVzLAotCQkJCQkgICAgICAgdmFyYXJncyk7Ci0JICAgICAgfQotCSAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCi0JICAgIHN3aXRjaCAoZmxhZ3MgJiBDWFhGTEFHU19WSVNJQklMSVRZKQotCSAgICAgIHsKLQkgICAgICBkZWZhdWx0OgotCQlpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygidW5rbm93biBDKysgdmlzaWJpbGl0eSIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgY2FzZSBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQzoKLQkJdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUklWQVRFOgotCQl2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQ1hYRkxBR1NfVklTSUJJTElUWV9QUk9URUNURUQ6Ci0JCXZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGNvbnN0cCA9IChmbGFncyAmIENYWEZMQUdTX0NPTlNUKSAhPSAwID8gdHJ1ZSA6IGZhbHNlOwotCSAgICB2b2xhdGlsZXAgPSAoZmxhZ3MgJiBDWFhGTEFHU19WT0xBVElMRSkgIT0gMCA/IHRydWUgOiBmYWxzZTsKLQotCSAgICBtYW5nbGVkY29weSA9IHNhdmVzdHJpbmcgKG1hbmdsZWQsIG1hbmdsZWRsZW4pOwotCi0JICAgIGlmICgoZmxhZ3MgJiBDWFhGTEFHU19TVEFUSUMpICE9IDApCi0JICAgICAgewotCQlpZiAoaWQgPT0gJ3YnKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgc3RhdGljIHZpcnR1YWwgbWV0aG9kIikpOwotCQkgICAgcmV0dXJuIGZhbHNlOwotCQkgIH0KLQkJbXYgPSBkZWJ1Z19tYWtlX3N0YXRpY19tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwgbWFuZ2xlZGNvcHksCi0JCQkJCQkgICAgICAgdHlwZSwgdmlzaWJpbGl0eSwKLQkJCQkJCSAgICAgICBjb25zdHAsIHZvbGF0aWxlcCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlkZWJ1Z190eXBlIHZjb250ZXh0OwotCi0JCWlmIChpZCAhPSAndicpCi0JCSAgdmNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICAvKiBGSVhNRTogSG93IGNhbiB3ZSBjYWxjdWxhdGUgdGhpcyBjb3JyZWN0bHk/ICAqLwotCQkgICAgdmNvbnRleHQgPSBpdC0+dHlwZTsKLQkJICB9Ci0JCW12ID0gZGVidWdfbWFrZV9tZXRob2RfdmFyaWFudCAoZGhhbmRsZSwgbWFuZ2xlZGNvcHksIHR5cGUsCi0JCQkJCQl2aXNpYmlsaXR5LCBjb25zdHAsCi0JCQkJCQl2b2xhdGlsZXAsIHZvZmZzZXQsCi0JCQkJCQl2Y29udGV4dCk7Ci0JICAgICAgfQotCSAgICBpZiAobXYgPT0gREVCVUdfTUVUSE9EX1ZBUklBTlRfTlVMTCkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICAgZm9yIChtZXRoID0gbWV0aG9kcywgaW0gPSAwOyBpbSA8IG1ldGhvZHNfY291bnQ7IG1ldGgrKywgaW0rKykKLQkgICAgICBpZiAobWV0aC0+bmFtbGVuID09IG5hbWxlbgotCQkgICYmIHN0cm5jbXAgKG1ldGgtPm5hbWUsIG5hbWUsIG5hbWxlbikgPT0gMCkKLQkJYnJlYWs7Ci0JICAgIGlmIChpbSA+PSBtZXRob2RzX2NvdW50KQotCSAgICAgIHsKLQkJaWYgKG1ldGhvZHNfY291bnQgPj0gbWV0aG9kc19hbGxvYykKLQkJICB7Ci0JCSAgICBtZXRob2RzX2FsbG9jICs9IDEwOwotCQkgICAgbWV0aG9kcyA9ICgoc3RydWN0IGllZWVfbWV0aG9kICopCi0JCQkgICAgICAgeHJlYWxsb2MgKG1ldGhvZHMsCi0JCQkJCSBtZXRob2RzX2FsbG9jICogc2l6ZW9mICptZXRob2RzKSk7Ci0JCSAgfQotCQltZXRob2RzW21ldGhvZHNfY291bnRdLm5hbWUgPSBuYW1lOwotCQltZXRob2RzW21ldGhvZHNfY291bnRdLm5hbWxlbiA9IG5hbWxlbjsKLQkJbWV0aG9kc1ttZXRob2RzX2NvdW50XS52YXJpYW50cyA9IE5VTEw7Ci0JCW1ldGhvZHNbbWV0aG9kc19jb3VudF0uY291bnQgPSAwOwotCQltZXRob2RzW21ldGhvZHNfY291bnRdLmFsbG9jID0gMDsKLQkJbWV0aCA9IG1ldGhvZHMgKyBtZXRob2RzX2NvdW50OwotCQkrK21ldGhvZHNfY291bnQ7Ci0JICAgICAgfQotCi0JICAgIGlmIChtZXRoLT5jb3VudCArIDEgPj0gbWV0aC0+YWxsb2MpCi0JICAgICAgewotCQltZXRoLT5hbGxvYyArPSAxMDsKLQkJbWV0aC0+dmFyaWFudHMgPSAoKGRlYnVnX21ldGhvZF92YXJpYW50ICopCi0JCQkJICB4cmVhbGxvYyAobWV0aC0+dmFyaWFudHMsCi0JCQkJCSAgICAobWV0aC0+YWxsb2MKLQkJCQkJICAgICAqIHNpemVvZiAqbWV0aC0+dmFyaWFudHMpKSk7Ci0JICAgICAgfQotCi0JICAgIG1ldGgtPnZhcmlhbnRzW21ldGgtPmNvdW50XSA9IG12OwotCSAgICArK21ldGgtPmNvdW50OwotCSAgICBtZXRoLT52YXJpYW50c1ttZXRoLT5jb3VudF0gPSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdvJzoKLQkgIHsKLQkgICAgYmZkX3ZtYSBzcGVjOwotCi0JICAgIC8qIFdlIGhhdmUgbm8gd2F5IHRvIHN0b3JlIHRoaXMgaW5mb3JtYXRpb24sIHNvIHdlIGp1c3QKLQkgICAgICAgaWdub3JlIGl0LiAgKi8KLQkgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZzcGVjKSkKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIC0tY291bnQ7Ci0JICAgIGlmICgoc3BlYyAmIDQpICE9IDApCi0JICAgICAgewotCQljb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJdW5zaWduZWQgbG9uZyBmaWxlbmFtbGVuOwotCQliZmRfdm1hIGxpbmVubzsKLQotCQlpZiAoISBpZWVlX3JlcXVpcmVfYXRuNjUgKGluZm8sIHBwLCAmZmlsZW5hbWUsICZmaWxlbmFtbGVuKQotCQkgICAgfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmxpbmVubykpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQljb3VudCAtPSAyOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKHNwZWMgJiA4KSAhPSAwKQotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbWFuZ2xlZDsKLQkJdW5zaWduZWQgbG9uZyBtYW5nbGVkbGVuOwotCi0JCWlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZtYW5nbGVkLCAmbWFuZ2xlZGxlbikpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQktLWNvdW50OwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsCi0JCQkgICAgXygidW5yZWNvZ25pemVkIEMrKyBvYmplY3Qgb3ZlcmhlYWQgc3BlYyIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAneic6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnZuYW1lLCAqYmFzZW5hbWU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdm5hbWVsZW4sIGJhc2VsZW47Ci0JICAgIGJmZF92bWEgdnNpemUsIGNvbnRyb2w7Ci0KLQkgICAgLyogQSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIuICAqLwotCi0JICAgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZ2bmFtZSwgJnZuYW1lbGVuKQotCQl8fCAhIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdnNpemUpCi0JCXx8ICEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmJhc2VuYW1lLCAmYmFzZWxlbikKLQkJfHwgISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJmNvbnRyb2wpKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgY291bnQgLT0gNDsKLQotCSAgICAvKiBXZSBqdXN0IGlnbm9yZSB0aGUgY29udHJvbCBudW1iZXIuICBXZSBkb24ndCBjYXJlIHdoYXQKLQkgICAgICAgdGhlIHZpcnR1YWwgdGFibGUgbmFtZSBpcy4gIFdlIGhhdmUgbm8gd2F5IHRvIHN0b3JlIHRoZQotCSAgICAgICB2aXJ0dWFsIHRhYmxlIHNpemUsIGFuZCBJIGRvbid0IHRoaW5rIHdlIGNhcmUgYW55aG93LiAgKi8KLQotCSAgICAvKiBGSVhNRTogV2UgY2FuJ3QgaGFuZGxlIG11bHRpcGxlIHZpcnR1YWwgdGFibGUgcG9pbnRlcnMuICAqLwotCi0JICAgIGlmIChiYXNlbGVuID09IDApCi0JICAgICAgb3dudnB0ciA9IHRydWU7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWNoYXIgKmJhc2Vjb3B5OwotCi0JCWJhc2Vjb3B5ID0gc2F2ZXN0cmluZyAoYmFzZW5hbWUsIGJhc2VsZW4pOwotCQl2cHRyYmFzZSA9IGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIGJhc2Vjb3B5LAotCQkJCQkJICAgREVCVUdfS0lORF9JTExFR0FMKTsKLQkJZnJlZSAoYmFzZWNvcHkpOwotCQlpZiAodnB0cmJhc2UgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgIHsKLQkJICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJ1bmRlZmluZWQgQysrIHZ0YWJsZSIpKTsKLQkJICAgIHJldHVybiBmYWxzZTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgdGhhdCB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBtZXRob2QgdmFyaWFudHMsIHdlIGNhbiBjYWxsCi0gICAgIGRlYnVnX21ha2VfbWV0aG9kIGZvciBlYWNoIG9uZS4gICovCi0KLSAgaWYgKG1ldGhvZHNfY291bnQgPT0gMCkKLSAgICBkbWV0aG9kcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZG1ldGhvZHMgPSAoKGRlYnVnX21ldGhvZCAqKQotCQkgIHhtYWxsb2MgKChtZXRob2RzX2NvdW50ICsgMSkgKiBzaXplb2YgKmRtZXRob2RzKSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbWV0aG9kc19jb3VudDsgaSsrKQotCXsKLQkgIGNoYXIgKm5hbWNvcHk7Ci0KLQkgIG5hbWNvcHkgPSBzYXZlc3RyaW5nIChtZXRob2RzW2ldLm5hbWUsIG1ldGhvZHNbaV0ubmFtbGVuKTsKLQkgIGRtZXRob2RzW2ldID0gZGVidWdfbWFrZV9tZXRob2QgKGRoYW5kbGUsIG5hbWNvcHksCi0JCQkJCSAgIG1ldGhvZHNbaV0udmFyaWFudHMpOwotCSAgaWYgKGRtZXRob2RzW2ldID09IERFQlVHX01FVEhPRF9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgZG1ldGhvZHNbaV0gPSBERUJVR19NRVRIT0RfTlVMTDsKLSAgICAgIGZyZWUgKG1ldGhvZHMpOwotICAgIH0KLQotICAvKiBUaGUgc3RydWN0IHR5cGUgd2FzIGNyZWF0ZWQgYXMgYW4gaW5kaXJlY3QgdHlwZSBwb2ludGluZyBhdAotICAgICBpdC0+c2xvdC4gIFdlIHVwZGF0ZSBpdC0+c2xvdCB0byBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBhbGwKLSAgICAgcmVmZXJlbmNlcyB0byB0aGlzIHN0cnVjdC4gICovCi0gIGl0LT5zbG90ID0gZGVidWdfbWFrZV9vYmplY3RfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgIGNsYXNzICE9ICd1JywKLQkJCQkgICAgIGRlYnVnX2dldF90eXBlX3NpemUgKGRoYW5kbGUsCi0JCQkJCQkJICBpdC0+c2xvdCksCi0JCQkJICAgICBmaWVsZHMsIGJhc2VjbGFzc2VzLCBkbWV0aG9kcywKLQkJCQkgICAgIHZwdHJiYXNlLCBvd252cHRyKTsKLSAgaWYgKGl0LT5zbG90ID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgQysrIGRlZmF1bHQgYXJndW1lbnQgdmFsdWUgYW5kIHJlZmVyZW5jZSB0eXBlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9jeHhfZGVmYXVsdHMgKGluZm8sIHBwLCBjb3VudCkKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLXsKLSAgY29uc3QgYmZkX2J5dGUgKnN0YXJ0OwotICBjb25zdCBjaGFyICpmbm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgZm5sZW47Ci0gIGJmZF92bWEgZGVmY291bnQ7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgLyogR2l2aW5nIHRoZSBmdW5jdGlvbiBuYW1lIGJlZm9yZSB0aGUgYXJndW1lbnQgY291bnQgaXMgYW4gYWRkZW5kdW0KLSAgICAgdG8gdGhlIHNwZWMuICBUaGUgZnVuY3Rpb24gbmFtZSBpcyBkZW1hbmdsZWQsIHRob3VnaCwgc28gdGhpcwotICAgICByZWNvcmQgbXVzdCBhbHdheXMgcmVmZXIgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotCi0gIGlmIChpbmZvLT5ibG9ja3N0YWNrLmJzcCA8PSBpbmZvLT5ibG9ja3N0YWNrLnN0YWNrCi0gICAgICB8fCBpbmZvLT5ibG9ja3N0YWNrLmJzcFstMV0uZm5pbmR4ID09ICh1bnNpZ25lZCBpbnQpIC0xKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgZGVmYXVsdCB2YWx1ZXMgbm90IGluIGEgZnVuY3Rpb24iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZmbm5hbWUsICZmbmxlbikKLSAgICAgIHx8ICEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZkZWZjb3VudCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb3VudCAtPSAyOwotCi0gIHdoaWxlIChkZWZjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHR5cGUsIHZhbDsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cnZhbDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RydmFsbGVuOwotCi0gICAgICBpZiAoISBpZWVlX3JlcXVpcmVfYXNuIChpbmZvLCBwcCwgJnR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC0tY291bnQ7Ci0KLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSAwOgotCWNhc2UgNDoKLQkgIGJyZWFrOwotCi0JY2FzZSAxOgotCWNhc2UgMjoKLQkgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmdmFsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLS1jb3VudDsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCWNhc2UgNzoKLQkgIGlmICghIGllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsICZzdHJ2YWwsICZzdHJ2YWxsZW4pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICAtLWNvdW50OwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oInVucmVjb2duaXplZCBDKysgZGVmYXVsdCB0eXBlIikpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcywgc28gd2UKLSAgICAgICAgIGp1c3QgaWdub3JlIHRoZW0uICBGSVhNRS4gICovCi0gICAgfQotCi0gIC8qIEFueSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBpbmRpY2VzIG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgcmVhbGx5Ci0gICAgIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgaWYgKGNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBQVFIgZGhhbmRsZTsKLSAgICAgIGRlYnVnX3R5cGUgKmFyZ19zbG90czsKLQotICAgICAgZGhhbmRsZSA9IGluZm8tPmRoYW5kbGU7Ci0gICAgICBhcmdfc2xvdHMgPSBpbmZvLT50eXBlcy50eXBlc1tpbmZvLT5ibG9ja3N0YWNrLmJzcFstMV0uZm5pbmR4XS5hcmdfc2xvdHM7Ci0gICAgICB3aGlsZSAoY291bnQtLSA+IDApCi0JewotCSAgYmZkX3ZtYSBpbmR4OwotCSAgZGVidWdfdHlwZSB0YXJnZXQ7Ci0KLQkgIGlmICghIGllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCAmaW5keCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIC8qIFRoZSBpbmRleCBpcyAxIGJhc2VkLiAgKi8KLQkgIC0taW5keDsKLQkgIGlmIChhcmdfc2xvdHMgPT0gTlVMTAotCSAgICAgIHx8IGFyZ19zbG90c1tpbmR4XSA9PSBERUJVR19UWVBFX05VTEwKLQkgICAgICB8fCAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgYXJnX3Nsb3RzW2luZHhdKQotCQkgICE9IERFQlVHX0tJTkRfUE9JTlRFUikpCi0JICAgIHsKLQkgICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygicmVmZXJlbmNlIHBhcmFtZXRlciBpcyBub3QgYSBwb2ludGVyIikpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICB0YXJnZXQgPSBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGRoYW5kbGUsIGFyZ19zbG90c1tpbmR4XSk7Ci0JICBhcmdfc2xvdHNbaW5keF0gPSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChkaGFuZGxlLCB0YXJnZXQpOwotCSAgaWYgKGFyZ19zbG90c1tpbmR4XSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIGEgQysrIHJlZmVyZW5jZSBkZWZpbml0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhZF9yZWZlcmVuY2UgKGluZm8sIHBwKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotewotICBjb25zdCBiZmRfYnl0ZSAqc3RhcnQ7Ci0gIGJmZF92bWEgZmxhZ3M7Ci0gIGNvbnN0IGNoYXIgKmNsYXNzLCAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBjbGFzc2xlbiwgbmFtbGVuOwotICBkZWJ1Z190eXBlICpwc2xvdDsKLSAgZGVidWdfdHlwZSB0YXJnZXQ7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2FzbiAoaW5mbywgcHAsICZmbGFncykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdpdmluZyB0aGUgY2xhc3MgbmFtZSBiZWZvcmUgdGhlIG1lbWJlciBuYW1lIGlzIGluIGFuIGFkZGVuZHVtIHRvCi0gICAgIHRoZSBzcGVjLiAgKi8KLSAgaWYgKGZsYWdzID09IDMpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJmNsYXNzLCAmY2xhc3NsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9yZXF1aXJlX2F0bjY1IChpbmZvLCBwcCwgJm5hbWUsICZuYW1sZW4pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwc2xvdCA9IE5VTEw7Ci0gIGlmIChmbGFncyAhPSAzKQotICAgIHsKLSAgICAgIGludCBwYXNzOwotCi0gICAgICAvKiBXZSBzZWFyY2ggZnJvbSB0aGUgbGFzdCB2YXJpYWJsZSBpbmRpY2VzIHRvIHRoZSBmaXJzdCBpbgotCSBob3BlcyBvZiBmaW5kaW5nIGxvY2FsIHZhcmlhYmxlcyBjb3JyZWN0bHkuICBXZSBzZWFyY2ggdGhlCi0JIGxvY2FsIHZhcmlhYmxlcyBvbiB0aGUgZmlyc3QgcGFzcywgYW5kIHRoZSBnbG9iYWwgdmFyaWFibGVzCi0JIG9uIHRoZSBzZWNvbmQuICBGSVhNRTogVGhpcyBwcm9iYWJseSB3b24ndCB3b3JrIGluIGFsbCBjYXNlcy4KLQkgT24gdGhlIG90aGVyIGhhbmQsIEkgZG9uJ3Qga25vdyB3aGF0IHdpbGwuICAqLwotICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykKLQl7Ci0JICBzdHJ1Y3QgaWVlZV92YXJzICp2YXJzOwotCSAgaW50IGk7Ci0JICBzdHJ1Y3QgaWVlZV92YXIgKnB2ID0gTlVMTDsKLQotCSAgaWYgKHBhc3MgPT0gMCkKLQkgICAgdmFycyA9ICZpbmZvLT52YXJzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFycyA9IGluZm8tPmdsb2JhbF92YXJzOwotCSAgICAgIGlmICh2YXJzID09IE5VTEwpCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IChpbnQpIHZhcnMtPmFsbG9jIC0gMTsgaSA+PSAwOyBpLS0pCi0JICAgIHsKLQkgICAgICBib29sZWFuIGZvdW5kOwotCi0JICAgICAgcHYgPSB2YXJzLT52YXJzICsgaTsKLQotCSAgICAgIGlmIChwdi0+cHNsb3QgPT0gTlVMTAotCQkgIHx8IHB2LT5uYW1sZW4gIT0gbmFtbGVuCi0JCSAgfHwgc3RybmNtcCAocHYtPm5hbWUsIG5hbWUsIG5hbWxlbikgIT0gMCkKLQkJY29udGludWU7Ci0KLQkgICAgICBmb3VuZCA9IGZhbHNlOwotCSAgICAgIHN3aXRjaCAoZmxhZ3MpCi0JCXsKLQkJZGVmYXVsdDoKLQkJICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwKLQkJCSAgICAgIF8oInVucmVjb2duaXplZCBDKysgcmVmZXJlbmNlIHR5cGUiKSk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCi0JCWNhc2UgMDoKLQkJICAvKiBHbG9iYWwgdmFyaWFibGUgb3IgZnVuY3Rpb24uICAqLwotCQkgIGlmIChwdi0+a2luZCA9PSBJRUVFX0dMT0JBTAotCQkgICAgICB8fCBwdi0+a2luZCA9PSBJRUVFX0VYVEVSTkFMCi0JCSAgICAgIHx8IHB2LT5raW5kID09IElFRUVfRlVOQ1RJT04pCi0JCSAgICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAxOgotCQkgIC8qIEdsb2JhbCBzdGF0aWMgdmFyaWFibGUgb3IgZnVuY3Rpb24uICAqLwotCQkgIGlmIChwdi0+a2luZCA9PSBJRUVFX1NUQVRJQwotCQkgICAgICB8fCBwdi0+a2luZCA9PSBJRUVFX0ZVTkNUSU9OKQotCQkgICAgZm91bmQgPSB0cnVlOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgMjoKLQkJICAvKiBMb2NhbCB2YXJpYWJsZS4gICovCi0JCSAgaWYgKHB2LT5raW5kID09IElFRUVfTE9DQUwpCi0JCSAgICBmb3VuZCA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIGlmIChmb3VuZCkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGkgPj0gMCkKLQkgICAgewotCSAgICAgIHBzbG90ID0gcHYtPnBzbG90OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBpZWVlX3RhZyAqaXQ7Ci0KLSAgICAgIGZvciAoaXQgPSBpbmZvLT50YWdzOyBpdCAhPSBOVUxMOyBpdCA9IGl0LT5uZXh0KQotCXsKLQkgIGlmIChpdC0+bmFtZVswXSA9PSBjbGFzc1swXQotCSAgICAgICYmIHN0cm5jbXAgKGl0LT5uYW1lLCBjbGFzcywgY2xhc3NsZW4pID09IDAKLQkgICAgICAmJiBzdHJsZW4gKGl0LT5uYW1lKSA9PSBjbGFzc2xlbikKLQkgICAgewotCSAgICAgIGlmIChpdC0+ZnNsb3RzICE9IE5VTEwpCi0JCXsKLQkJICBjb25zdCBkZWJ1Z19maWVsZCAqcGY7Ci0JCSAgdW5zaWduZWQgaW50IGZpbmR4OwotCi0JCSAgcGYgPSBkZWJ1Z19nZXRfZmllbGRzIChpbmZvLT5kaGFuZGxlLCBpdC0+dHlwZSk7Ci0JCSAgaWYgKHBmID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LAotCQkJCSAgIkMrKyByZWZlcmVuY2UgaW4gY2xhc3Mgd2l0aCBubyBmaWVsZHMiKTsKLQkJICAgICAgcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCi0JCSAgZm9yIChmaW5keCA9IDA7ICpwZiAhPSBERUJVR19GSUVMRF9OVUxMOyBwZisrLCBmaW5keCsrKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpmbmFtZTsKLQotCQkgICAgICBmbmFtZSA9IGRlYnVnX2dldF9maWVsZF9uYW1lIChpbmZvLT5kaGFuZGxlLCAqcGYpOwotCQkgICAgICBpZiAoZm5hbWUgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKGZuYW1lLCBuYW1lLCBuYW1sZW4pID09IDAKLQkJCSAgJiYgc3RybGVuIChmbmFtZSkgPT0gbmFtbGVuKQotCQkJewotCQkJICBwc2xvdCA9IGl0LT5mc2xvdHMgKyBmaW5keDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocHNsb3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygiQysrIHJlZmVyZW5jZSBub3QgZm91bmQiKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlIGFsbG9jYXRlZCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGFzIGFuIGluZGlyZWN0IHR5cGUgcG9pbnRpbmcKLSAgICAgdG8gKnBzbG90LCB3aGljaCB3ZSBjYW4gbm93IHVwZGF0ZSB0byBiZSBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgaWYgKGRlYnVnX2dldF90eXBlX2tpbmQgKGluZm8tPmRoYW5kbGUsICpwc2xvdCkgIT0gREVCVUdfS0lORF9QT0lOVEVSKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJDKysgcmVmZXJlbmNlIGlzIG5vdCBwb2ludGVyIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICB0YXJnZXQgPSBkZWJ1Z19nZXRfdGFyZ2V0X3R5cGUgKGluZm8tPmRoYW5kbGUsICpwc2xvdCk7Ci0gICpwc2xvdCA9IGRlYnVnX21ha2VfcmVmZXJlbmNlX3R5cGUgKGluZm8tPmRoYW5kbGUsIHRhcmdldCk7Ci0gIGlmICgqcHNsb3QgPT0gREVCVUdfVFlQRV9OVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVxdWlyZSBhbiBBU04gcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVxdWlyZV9hc24gKGluZm8sIHBwLCBwdikKLSAgICAgc3RydWN0IGllZWVfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgYmZkX2J5dGUgKipwcDsKLSAgICAgYmZkX3ZtYSAqcHY7Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0gIGJmZF92bWEgdmFyaW5keDsKLQotICBzdGFydCA9ICpwcDsKLQotICBjID0gKGllZWVfcmVjb3JkX2VudW1fdHlwZSkgKipwcDsKLSAgaWYgKGMgIT0gaWVlZV9lMl9maXJzdF9ieXRlX2VudW0pCi0gICAgewotICAgICAgaWVlZV9lcnJvciAoaW5mbywgc3RhcnQsIF8oIm1pc3NpbmcgcmVxdWlyZWQgQVNOIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICoqcHApOwotICBpZiAoYyAhPSBpZWVlX2Fzbl9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBU04iKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBKdXN0IGlnbm9yZSB0aGUgdmFyaWFibGUgaW5kZXguICAqLwotICBpZiAoISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnZhcmluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gaWVlZV9yZWFkX2V4cHJlc3Npb24gKGluZm8sIHBwLCBwdik7Ci19Ci0KLS8qIFJlcXVpcmUgYW4gQVRONjUgcmVjb3JkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVxdWlyZV9hdG42NSAoaW5mbywgcHAsIHBuYW1lLCBwbmFtbGVuKQotICAgICBzdHJ1Y3QgaWVlZV9pbmZvICppbmZvOwotICAgICBjb25zdCBiZmRfYnl0ZSAqKnBwOwotICAgICBjb25zdCBjaGFyICoqcG5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnBuYW1sZW47Ci17Ci0gIGNvbnN0IGJmZF9ieXRlICpzdGFydDsKLSAgaWVlZV9yZWNvcmRfZW51bV90eXBlIGM7Ci0gIGJmZF92bWEgbmFtZV9pbmR4LCB0eXBlX2luZHgsIGF0bl9jb2RlOwotCi0gIHN0YXJ0ID0gKnBwOwotCi0gIGMgPSAoaWVlZV9yZWNvcmRfZW51bV90eXBlKSAqKnBwOwotICBpZiAoYyAhPSBpZWVlX2F0X3JlY29yZF9lbnVtKQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJtaXNzaW5nIHJlcXVpcmVkIEFUTjY1IikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYyA9IChpZWVlX3JlY29yZF9lbnVtX3R5cGUpICgoKHVuc2lnbmVkIGludCkgYyA8PCA4KSB8ICoqcHApOwotICBpZiAoYyAhPSBpZWVlX2F0bl9yZWNvcmRfZW51bSkKLSAgICB7Ci0gICAgICBpZWVlX2Vycm9yIChpbmZvLCBzdGFydCwgXygibWlzc2luZyByZXF1aXJlZCBBVE42NSIpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGlmICghIGllZWVfcmVhZF9udW1iZXIgKGluZm8sIHBwLCAmbmFtZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3JlYWRfbnVtYmVyIChpbmZvLCBwcCwgJnR5cGVfaW5keCkKLSAgICAgIHx8ICEgaWVlZV9yZWFkX251bWJlciAoaW5mbywgcHAsICZhdG5fY29kZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEp1c3QgaWdub3JlIG5hbWVfaW5keC4gICovCi0KLSAgaWYgKHR5cGVfaW5keCAhPSAwIHx8IGF0bl9jb2RlICE9IDY1KQotICAgIHsKLSAgICAgIGllZWVfZXJyb3IgKGluZm8sIHN0YXJ0LCBfKCJiYWQgQVRONjUgcmVjb3JkIikpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9yZWFkX2lkIChpbmZvLCBwcCwgcG5hbWUsIHBuYW1sZW4pOwotfQotDAotLyogQ29udmVydCBhIHJlZ2lzdGVyIG51bWJlciBpbiBJRUVFIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEKLSAgIGdlbmVyaWMgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLQotc3RhdGljIGludAotaWVlZV9yZWdub190b19nZW5yZWcgKGFiZmQsIHIpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgaW50IHI7Ci17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChhYmZkKSkKLSAgICB7Ci0gICAgY2FzZSBiZmRfYXJjaF9tNjhrOgotICAgICAgLyogRm9yIHNvbWUgcmVhc29ucyBzdGFicyBhZGRzIDIgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAgICAgICBudW1iZXJzLiAgKi8KLSAgICAgIGlmIChyID49IDE2KQotCXIgKz0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgLyogU3RhYnMgdXNlcyAwIHRvIDE1IGZvciByMCB0byByMTUsIDE2IHRvIDMxIGZvciBnMCB0byBnMTUsIGFuZAotICAgICAgICAgMzIgdG8gMzUgZm9yIGZwMCB0byBmcDMuICAqLwotICAgICAgLS1yOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZ2VuZXJpYyByZWdpc3RlciBudW1iZXIgdG8gYW4gSUVFRSBzcGVjaWZpYyBvbmUuICAqLwotCi1zdGF0aWMgaW50Ci1pZWVlX2dlbnJlZ190b19yZWdubyAoYWJmZCwgcikKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgcjsKLXsKLSAgc3dpdGNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX202OGs6Ci0gICAgICAvKiBGb3Igc29tZSByZWFzb24gc3RhYnMgYWRkIDIgdG8gdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyCi0gICAgICAgICBudW1iZXJzLiAgKi8KLSAgICAgIGlmIChyID49IDE4KQotCXIgLT0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9pOTYwOgotICAgICAgLyogU3RhYnMgdXNlcyAwIHRvIDE1IGZvciByMCB0byByMTUsIDE2IHRvIDMxIGZvciBnMCB0byBnMTUsIGFuZAotICAgICAgICAgMzIgdG8gMzUgZm9yIGZwMCB0byBmcDMuICAqLwotICAgICAgKytyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotDAotLyogVGhlc2Ugcm91dGluZXMgYnVpbGQgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIHRoZSBnZW5lcmljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi0vKiBXZSBidWlsZCB0aGUgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnl0ZSBieSBieXRlLiAgUmF0aGVyIHRoYW4KLSAgIHdhc3RlIHRpbWUgY29weWluZyBkYXRhIGFyb3VuZCwgd2UgdXNlIGEgbGlua2VkIGxpc3Qgb2YgYnVmZmVycyB0bwotICAgaG9sZCB0aGUgZGF0YS4gICovCi0KLSNkZWZpbmUgSUVFRV9CVUZTSVpFICg0OTApCi0KLXN0cnVjdCBpZWVlX2J1ZgotewotICAvKiBOZXh0IGJ1ZmZlci4gICovCi0gIHN0cnVjdCBpZWVlX2J1ZiAqbmV4dDsKLSAgLyogTnVtYmVyIG9mIGRhdGEgYnl0ZXMgaW4gdGhpcyBidWZmZXIuICAqLwotICB1bnNpZ25lZCBpbnQgYzsKLSAgLyogQnl0ZXMuICAqLwotICBiZmRfYnl0ZSBidWZbSUVFRV9CVUZTSVpFXTsKLX07Ci0KLS8qIEEgbGlzdCBvZiBidWZmZXJzLiAgKi8KLQotc3RydWN0IGllZWVfYnVmbGlzdAotewotICAvKiBIZWFkIG9mIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKmhlYWQ7Ci0gIC8qIFRhaWwtLWxhc3QgYnVmZmVyIG9uIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWYgKnRhaWw7Ci19OwotCi0vKiBJbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUgQkIxMSBibG9ja3MgcmVxdWlyZWQgYnkgdGhlIEhQIGVtdWxhdG9yLAotICAgd2Uga2VlcCB0cmFjayBvZiByYW5nZXMgb2YgYWRkcmVzc2VzIHdoaWNoIGNvcnJlc3BvbmQgdG8gYSBnaXZlbgotICAgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0cnVjdCBpZWVlX3JhbmdlCi17Ci0gIC8qIE5leHQgcmFuZ2UuICAqLwotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqbmV4dDsKLSAgLyogTG93IGFkZHJlc3MuICAqLwotICBiZmRfdm1hIGxvdzsKLSAgLyogSGlnaCBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBoaWdoOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgY2xhc3Mgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdHJ1Y3QgaWVlZV90eXBlX2NsYXNzCi17Ci0gIC8qIFRoZSBuYW1lIGluZGV4IGluIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgLyogVGhlIHBtaXNjIHJlY29yZHMgZm9yIHRoZSBjbGFzcy4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgcG1pc2NidWY7Ci0gIC8qIFRoZSBudW1iZXIgb2YgcG1pc2MgcmVjb3Jkcy4gICovCi0gIHVuc2lnbmVkIGludCBwbWlzY2NvdW50OwotICAvKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgaG9sZGluZyB0aGUgdmlydHVhbCB0YWJsZSwgaWYgbm90IHRoaXMKLSAgICAgY2xhc3MuICAqLwotICBjb25zdCBjaGFyICp2Y2xhc3M7Ci0gIC8qIFdoZXRoZXIgdGhpcyBjbGFzcyBob2xkcyBpdHMgb3duIHZpcnR1YWwgdGFibGUuICAqLwotICBib29sZWFuIG93bnZwdHI7Ci0gIC8qIFRoZSBsYXJnZXN0IHZpcnR1YWwgdGFibGUgb2Zmc2V0IHNlZW4gc28gZmFyLiAgKi8KLSAgYmZkX3ZtYSB2b2Zmc2V0OwotICAvKiBUaGUgY3VycmVudCBtZXRob2QuICAqLwotICBjb25zdCBjaGFyICptZXRob2Q7Ci0gIC8qIEFkZGl0aW9uYWwgcG1pc2MgcmVjb3JkcyB1c2VkIHRvIHJlY29yZCBmaWVsZHMgb2YgcmVmZXJlbmNlIHR5cGUuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHJlZnM7Ci19OwotCi0vKiBUaGlzIGlzIGhvdyB3ZSBzdG9yZSB0eXBlcyBmb3IgdGhlIHdyaXRpbmcgcm91dGluZXMuICBNb3N0IHR5cGVzCi0gICBhcmUgc2ltcGx5IHJlcHJlc2VudGVkIGJ5IGEgdHlwZSBpbmRleC4gICovCi0KLXN0cnVjdCBpZWVlX3dyaXRlX3R5cGUKLXsKLSAgLyogVHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBpbmR4OwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdHlwZSwgaWYga25vd24uICAqLwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIHR5cGUsIGlmIGFueS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIElmIHRoaXMgaXMgYSBmdW5jdGlvbiBvciBtZXRob2QgdHlwZSwgd2UgYnVpbGQgdGhlIHR5cGUgaGVyZSwgYW5kCi0gICAgIG9ubHkgYWRkIGl0IHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpZiB3ZSBuZWVkIGl0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmRlZjsKLSAgLyogSWYgdGhpcyBpcyBhIHN0cnVjdCwgdGhpcyBpcyB3aGVyZSB0aGUgc3RydWN0IGRlZmluaXRpb24gaXMKLSAgICAgYnVpbHQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHN0cmRlZjsKLSAgLyogSWYgdGhpcyBpcyBhIGNsYXNzLCB0aGlzIGlzIHdoZXJlIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiBpcyBidWlsdC4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKmNsYXNzZGVmOwotICAvKiBXaGV0aGVyIHRoZSB0eXBlIGlzIHVuc2lnbmVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHVuc2lnbmVkcCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBpcyBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHJlZmVyZW5jZXAgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgaXMgaW4gdGhlIGxvY2FsIHR5cGUgYmxvY2suICAqLwotICB1bnNpZ25lZCBpbnQgbG9jYWxwIDogMTsKLSAgLyogV2hldGhlciB0aGlzIGlzIGEgZHVwbGljYXRlIHN0cnVjdCBkZWZpbml0aW9uIHdoaWNoIHdlIGFyZQotICAgICBpZ25vcmluZy4gICovCi0gIHVuc2lnbmVkIGludCBpZ25vcmVwIDogMTsKLX07Ci0KLS8qIFRoaXMgaXMgdGhlIHR5cGUgc3RhY2sgdXNlZCBieSB0aGUgZGVidWcgd3JpdGluZyByb3V0aW5lcy4gIEZJWE1FOgotICAgV2UgY291bGQgZ2VuZXJhdGUgbW9yZSBlZmZpY2llbnQgb3V0cHV0IGlmIHdlIHJlbWVtYmVyZWQgd2hlbiB3ZQotICAgaGF2ZSBvdXRwdXQgYSBwYXJ0aWN1bGFyIHR5cGUgYmVmb3JlLiAgKi8KLQotc3RydWN0IGllZWVfdHlwZV9zdGFjawotewotICAvKiBOZXh0IGVudHJ5IG9uIHN0YWNrLiAgKi8KLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqbmV4dDsKLSAgLyogVHlwZSBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLX07Ci0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGEgbmFtZSBhbmQgc29tZSB0eXBlcy4KLSAgIFRoZXNlIGFyZSB1c2VkIGZvciB0eXBlZGVmcyBhbmQgdGFncy4gICovCi0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZQotewotICAvKiBOZXh0IHR5cGUgZm9yIHRoaXMgbmFtZS4gICovCi0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbmV4dDsKLSAgLyogSUQgbnVtYmVyLiAgRm9yIGEgdHlwZWRlZiwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIHR5cGUgdG8gd2hpY2gKLSAgICAgdGhpcyBuYW1lIGlzIHR5cGVkZWZlZC4gICovCi0gIHVuc2lnbmVkIGludCBpZDsKLSAgLyogVHlwZS4gICovCi0gIHN0cnVjdCBpZWVlX3dyaXRlX3R5cGUgdHlwZTsKLSAgLyogSWYgdGhpcyBpcyBhIHRhZyB3aGljaCBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQsIHRoaXMgaXMgdGhlCi0gICAgIGtpbmQuICBJZiB0aGUgdGFnIGhhcyBiZWVuIGRlZmluZWQsIHRoaXMgaXMgREVCVUdfS0lORF9JTExFR0FMLiAgKi8KLSAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLX07Ci0KLS8qIFdlIHVzZSBhIGhhc2ggdGFibGUgdG8gYXNzb2NpYXRlIG5hbWVzIGFuZCB0eXBlcy4gICovCi0KLXN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSByb290OwotfTsKLQotc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkKLXsKLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIEluZm9ybWF0aW9uIGZvciB0aGlzIG5hbWUuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKnR5cGVzOwotfTsKLQotLyogVGhpcyBpcyBhIGxpc3Qgb2YgZW51bXMuICAqLwotCi1zdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0KLXsKLSAgLyogTmV4dCBlbnVtLiAgKi8KLSAgc3RydWN0IGllZWVfZGVmaW5lZF9lbnVtICpuZXh0OwotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIFdoZXRoZXIgdGhpcyBlbnVtIGhhcyBiZWVuIGRlZmluZWQuICAqLwotICBib29sZWFuIGRlZmluZWQ7Ci0gIC8qIFRhZy4gICovCi0gIGNvbnN0IGNoYXIgKnRhZzsKLSAgLyogTmFtZXMuICAqLwotICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gIC8qIFZhbHVlcy4gICovCi0gIGJmZF9zaWduZWRfdm1hICp2YWxzOwotfTsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdHlwZXMsIHNvIHRoYXQgd2UgZG9uJ3QKLSAgIG91dHB1dCB0aGVtIG1vcmUgdGhhbiBvbmNlLiAgKi8KLQotc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZQotewotICAvKiBQb2ludGVyIHRvIHRoaXMgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBwb2ludGVyOwotICAvKiBGdW5jdGlvbiB3aXRoIHVua25vd24gYXJndW1lbnRzIHJldHVybmluZyB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgZnVuY3Rpb247Ci0gIC8qIENvbnN0IHZlcnNpb24gb2YgdGhpcyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbnN0X3F1YWxpZmllZDsKLSAgLyogVm9sYXRpbGUgdmVyc2lvbiBvZiB0aGlzIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgdm9sYXRpbGVfcXVhbGlmaWVkOwotICAvKiBMaXN0IG9mIGFycmF5cyBvZiB0aGlzIHR5cGUgb2YgdmFyaW91cyBib3VuZHMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICphcnJheXM7Ci19OwotCi0vKiBBIGxpc3Qgb2YgYXJyYXlzIGJvdW5kcy4gICovCi0KLXN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUKLXsKLSAgLyogTmV4dCBhcnJheSBib3VuZHMuICAqLwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF9hcnJheV90eXBlICpuZXh0OwotICAvKiBUeXBlIGluZGV4IHdpdGggdGhlc2UgYm91bmRzLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIC8qIExvdyBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGxvdzsKLSAgLyogSGlnaCBib3VuZC4gICovCi0gIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci19OwotCi0vKiBUaGlzIGlzIGEgbGlzdCBvZiBwZW5kaW5nIGZ1bmN0aW9uIHBhcmFtZXRlciBpbmZvcm1hdGlvbi4gIFdlIGRvbid0Ci0gICBvdXRwdXQgdGhlbSB1bnRpbCB3ZSBzZWUgdGhlIGZpcnN0IGJsb2NrLiAgKi8KLQotc3RydWN0IGllZWVfcGVuZGluZ19wYXJtCi17Ci0gIC8qIE5leHQgcGVuZGluZyBwYXJhbWV0ZXIuICAqLwotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm5leHQ7Ci0gIC8qIE5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIC8qIFdoZXRoZXIgdGhlIHR5cGUgaXMgYSByZWZlcmVuY2UuICAqLwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIC8qIEtpbmQuICAqLwotICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAvKiBWYWx1ZS4gICovCi0gIGJmZF92bWEgdmFsOwotfTsKLQotLyogVGhpcyBpcyB0aGUgaGFuZGxlIHBhc3NlZCBkb3duIGJ5IGRlYnVnX3dyaXRlLiAgKi8KLQotc3RydWN0IGllZWVfaGFuZGxlCi17Ci0gIC8qIEJGRCB3ZSBhcmUgd3JpdGluZyB0by4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogV2hldGhlciB3ZSBnb3QgYW4gZXJyb3IgaW4gYSBzdWJyb3V0aW5lIGNhbGxlZCB2aWEgdHJhdmVyc2Ugb3IKLSAgICAgbWFwX292ZXJfc2VjdGlvbnMuICAqLwotICBib29sZWFuIGVycm9yOwotICAvKiBDdXJyZW50IGRhdGEgYnVmZmVyIGxpc3QuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICpjdXJyZW50OwotICAvKiBDdXJyZW50IGRhdGEgYnVmZmVyLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmICpjdXJidWY7Ci0gIC8qIEZpbGVuYW1lIG9mIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBNb2R1bGUgbmFtZSBvZiBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBjb25zdCBjaGFyICptb2RuYW1lOwotICAvKiBMaXN0IG9mIGJ1ZmZlciBmb3IgZ2xvYmFsIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBnbG9iYWxfdHlwZXM7Ci0gIC8qIExpc3Qgb2YgZmluaXNoZWQgZGF0YSBidWZmZXJzLiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBkYXRhOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHR5cGVkZWZzIGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHR5cGVzOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBjdXJyZW50Ci0gICAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHZhcnM7Ci0gIC8qIExpc3Qgb2YgYnVmZmVycyBmb3IgQysrIGNsYXNzIGRlZmluaXRpb25zIGluIHRoZSBjdXJyZW50Ci0gICAgIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IGN4eDsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciBsaW5lIG51bWJlcnMgaW4gdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgbGluZW5vczsKLSAgLyogUmFuZ2VzIGZvciB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0LiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKnJhbmdlczsKLSAgLyogUmFuZ2VzIGZvciBhbGwgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IGllZWVfcmFuZ2UgKmdsb2JhbF9yYW5nZXM7Ci0gIC8qIE5lc3RlZCBwZW5kaW5nIHJhbmdlcy4gICovCi0gIHN0cnVjdCBpZWVlX3JhbmdlICpwZW5kaW5nX3JhbmdlczsKLSAgLyogVHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBpZWVlX3R5cGVfc3RhY2sgKnR5cGVfc3RhY2s7Ci0gIC8qIE5leHQgdW5hbGxvY2F0ZWQgdHlwZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIC8qIE5leHQgdW5hbGxvY2F0ZWQgbmFtZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIC8qIFR5cGVkZWZzLiAgKi8KLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfdGFibGUgdHlwZWRlZnM7Ci0gIC8qIFRhZ3MuICAqLwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF90YWJsZSB0YWdzOwotICAvKiBFbnVtcy4gICovCi0gIHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqZW51bXM7Ci0gIC8qIE1vZGlmaWVkIHZlcnNpb25zIG9mIHR5cGVzLiAgKi8KLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbW9kaWZpZWQ7Ci0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBpbiBtb2RpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCBtb2RpZmllZF9hbGxvYzsKLSAgLyogNCBieXRlIGNvbXBsZXggdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBjb21wbGV4X2Zsb2F0X2luZGV4OwotICAvKiA4IGJ5dGUgY29tcGxleCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbXBsZXhfZG91YmxlX2luZGV4OwotICAvKiBUaGUgZGVwdGggb2YgYmxvY2sgbmVzdGluZy4gIFRoaXMgaXMgMCBvdXRzaWRlIGEgZnVuY3Rpb24sIGFuZCAxCi0gICAgIGp1c3QgYWZ0ZXIgc3RhcnRfZnVuY3Rpb24gaXMgY2FsbGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IGJsb2NrX2RlcHRoOwotICAvKiBUaGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmZubmFtZTsKLSAgLyogTGlzdCBvZiBidWZmZXJzIGZvciB0aGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24gd2UgYXJlIGN1cnJlbnRseQotICAgICB3cml0aW5nIG91dC4gICovCi0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgZm50eXBlOwotICAvKiBMaXN0IG9mIGJ1ZmZlcnMgZm9yIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBmdW5jdGlvbiB3ZSBhcmUKLSAgICAgY3VycmVudGx5IHdyaXRpbmcgb3V0LiAgKi8KLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmFyZ3M7Ci0gIC8qIE51bWJlciBvZiBhcmd1bWVudHMgd3JpdHRlbiB0byBmbmFyZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgZm5hcmdjb3VudDsKLSAgLyogUGVuZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICpwZW5kaW5nX3Bhcm1zOwotICAvKiBDdXJyZW50IGxpbmUgbnVtYmVyIGZpbGVuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbGluZW5vX2ZpbGVuYW1lOwotICAvKiBMaW5lIG51bWJlciBuYW1lIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgaW50IGxpbmVub19uYW1lX2luZHg7Ci0gIC8qIEZpbGVuYW1lIG9mIHBlbmRpbmcgbGluZSBudW1iZXIuICAqLwotICBjb25zdCBjaGFyICpwZW5kaW5nX2xpbmVub19maWxlbmFtZTsKLSAgLyogUGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgcGVuZGluZ19saW5lbm87Ci0gIC8qIEFkZHJlc3Mgb2YgcGVuZGluZyBsaW5lIG51bWJlci4gICovCi0gIGJmZF92bWEgcGVuZGluZ19saW5lbm9fYWRkcjsKLSAgLyogSGlnaGVzdCBhZGRyZXNzIHNlZW4gYXQgZW5kIG9mIHByb2NlZHVyZS4gICovCi0gIGJmZF92bWEgaGlnaGFkZHI7Ci19OwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX2luaXRfYnVmZmVyCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2hhbmdlX2J1ZmZlcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgc3RydWN0IGllZWVfYnVmbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2FwcGVuZF9idWZmZXIKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKiwKLQkgICBzdHJ1Y3QgaWVlZV9idWZsaXN0ICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVhbF93cml0ZV9ieXRlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfMmJ5dGVzIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfbnVtYmVyIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3dyaXRlX2lkIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYXNuCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfd3JpdGVfYXRuNjUKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3B1c2hfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3BvcF90eXBlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBpZWVlX3BvcF91bnVzZWRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3BvcF90eXBlX3VzZWQKLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYWRkX3JhbmdlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBib29sZWFuLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3JhbmdlIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9yYW5nZSBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9kZWZpbmVfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2RlZmluZV9uYW1lZF90eXBlCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgIGJvb2xlYW4sIGJvb2xlYW4sIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikpOwotc3RhdGljIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKmllZWVfZ2V0X21vZGlmaWVkX2luZm8KLSAgUEFSQU1TICgoc3RydWN0IGllZWVfaGFuZGxlICosIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYwotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKiwgc3RydWN0IGJmZF9oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV93cml0ZV91bmRlZmluZWRfdGFnCi0gIFBBUkFNUyAoKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHZvaWQgaWVlZV9hZGRfYmIxMV9ibG9ja3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9hZGRfYmIxMQotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikpOwotc3RhdGljIHVuc2lnbmVkIGludCBpZWVlX3Zpc190b19mbGFncyBQQVJBTVMgKChlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfbWV0aG9kX3ZhcgotICBQQVJBTVMgKChzdHJ1Y3QgaWVlZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sCi0JICAgYm9vbGVhbiwgYm9vbGVhbiwgYmZkX3ZtYSwgYm9vbGVhbikpOwotCi1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfc291cmNlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZvaWRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfaW50X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jb21wbGV4X3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYm9vbF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9wb2ludGVyX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Z1bmN0aW9uX3R5cGUgUEFSQU1TICgoUFRSLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3JhbmdlX3R5cGUgUEFSQU1TICgoUFRSLCBiZmRfc2lnbmVkX3ZtYSwgYmZkX3NpZ25lZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfb2Zmc2V0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX21ldGhvZF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbiwgaW50LCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZvbGF0aWxlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9lbmRfc3RydWN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2NsYXNzX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50LCBib29sZWFuLAotCSAgIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfYmFzZWNsYXNzCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSwgYm9vbGVhbiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2NsYXNzX3N0YXJ0X21ldGhvZCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIGllZWVfY2xhc3NfZW5kX21ldGhvZCBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGVkZWZfdHlwZSBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90YWdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBlbnVtIGRlYnVnX3R5cGVfa2luZCkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIGllZWVfdGFnIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2ludF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3R5cGVkX2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3ZhcmlhYmxlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zhcl9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2Z1bmN0aW9uX3BhcmFtZXRlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z19wYXJtX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfc3RhcnRfYmxvY2sgUEFSQU1TICgoUFRSLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBpZWVlX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGllZWVfZW5kX2Z1bmN0aW9uIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gaWVlZV9saW5lbm8KLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEpKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z193cml0ZV9mbnMgaWVlZV9mbnMgPQotewotICBpZWVlX3N0YXJ0X2NvbXBpbGF0aW9uX3VuaXQsCi0gIGllZWVfc3RhcnRfc291cmNlLAotICBpZWVlX2VtcHR5X3R5cGUsCi0gIGllZWVfdm9pZF90eXBlLAotICBpZWVlX2ludF90eXBlLAotICBpZWVlX2Zsb2F0X3R5cGUsCi0gIGllZWVfY29tcGxleF90eXBlLAotICBpZWVlX2Jvb2xfdHlwZSwKLSAgaWVlZV9lbnVtX3R5cGUsCi0gIGllZWVfcG9pbnRlcl90eXBlLAotICBpZWVlX2Z1bmN0aW9uX3R5cGUsCi0gIGllZWVfcmVmZXJlbmNlX3R5cGUsCi0gIGllZWVfcmFuZ2VfdHlwZSwKLSAgaWVlZV9hcnJheV90eXBlLAotICBpZWVlX3NldF90eXBlLAotICBpZWVlX29mZnNldF90eXBlLAotICBpZWVlX21ldGhvZF90eXBlLAotICBpZWVlX2NvbnN0X3R5cGUsCi0gIGllZWVfdm9sYXRpbGVfdHlwZSwKLSAgaWVlZV9zdGFydF9zdHJ1Y3RfdHlwZSwKLSAgaWVlZV9zdHJ1Y3RfZmllbGQsCi0gIGllZWVfZW5kX3N0cnVjdF90eXBlLAotICBpZWVlX3N0YXJ0X2NsYXNzX3R5cGUsCi0gIGllZWVfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgaWVlZV9jbGFzc19iYXNlY2xhc3MsCi0gIGllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kLAotICBpZWVlX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBpZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCwKLSAgaWVlZV9jbGFzc19lbmRfbWV0aG9kLAotICBpZWVlX2VuZF9jbGFzc190eXBlLAotICBpZWVlX3R5cGVkZWZfdHlwZSwKLSAgaWVlZV90YWdfdHlwZSwKLSAgaWVlZV90eXBkZWYsCi0gIGllZWVfdGFnLAotICBpZWVlX2ludF9jb25zdGFudCwKLSAgaWVlZV9mbG9hdF9jb25zdGFudCwKLSAgaWVlZV90eXBlZF9jb25zdGFudCwKLSAgaWVlZV92YXJpYWJsZSwKLSAgaWVlZV9zdGFydF9mdW5jdGlvbiwKLSAgaWVlZV9mdW5jdGlvbl9wYXJhbWV0ZXIsCi0gIGllZWVfc3RhcnRfYmxvY2ssCi0gIGllZWVfZW5kX2Jsb2NrLAotICBpZWVlX2VuZF9mdW5jdGlvbiwKLSAgaWVlZV9saW5lbm8KLX07Ci0KLS8qIEluaXRpYWxpemUgYSBidWZmZXIgdG8gYmUgZW1wdHkuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1pZWVlX2luaXRfYnVmZmVyIChpbmZvLCBidWZsaXN0KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKmJ1Zmxpc3Q7Ci17Ci0gIGJ1Zmxpc3QtPmhlYWQgPSBOVUxMOwotICBidWZsaXN0LT50YWlsID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGEgYnVmZmVyIGxpc3QgaGFzIGFueSBkYXRhLiAgKi8KLQotI2RlZmluZSBpZWVlX2J1ZmZlcl9lbXB0eXAoYnVmbGlzdCkgKChidWZsaXN0KS0+aGVhZCA9PSBOVUxMKQotCi0vKiBDaGFuZ2UgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIGEgc3BlY2lmaWVkIGJ1ZmZlciBjaGFpbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sIGJ1Zmxpc3QpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLXsKLSAgaWYgKGJ1Zmxpc3QtPmhlYWQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9idWYgKmJ1ZjsKLQotICAgICAgYnVmID0gKHN0cnVjdCBpZWVlX2J1ZiAqKSB4bWFsbG9jIChzaXplb2YgKmJ1Zik7Ci0gICAgICBidWYtPm5leHQgPSBOVUxMOwotICAgICAgYnVmLT5jID0gMDsKLSAgICAgIGJ1Zmxpc3QtPmhlYWQgPSBidWY7Ci0gICAgICBidWZsaXN0LT50YWlsID0gYnVmOwotICAgIH0KLQotICBpbmZvLT5jdXJyZW50ID0gYnVmbGlzdDsKLSAgaW5mby0+Y3VyYnVmID0gYnVmbGlzdC0+dGFpbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXBwZW5kIGEgYnVmZmVyIGNoYWluLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCBtYWluYnVmLCBuZXdidWYpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqbWFpbmJ1ZjsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqbmV3YnVmOwotewotICBpZiAobmV3YnVmLT5oZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKG1haW5idWYtPmhlYWQgPT0gTlVMTCkKLQltYWluYnVmLT5oZWFkID0gbmV3YnVmLT5oZWFkOwotICAgICAgZWxzZQotCW1haW5idWYtPnRhaWwtPm5leHQgPSBuZXdidWYtPmhlYWQ7Ci0gICAgICBtYWluYnVmLT50YWlsID0gbmV3YnVmLT50YWlsOwotICAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlIGEgYnl0ZSBpbnRvIHRoZSBidWZmZXIuICBXZSB1c2UgYSBtYWNybyBmb3Igc3BlZWQgYW5kIGEKLSAgIGZ1bmN0aW9uIGZvciB0aGUgY29tcGxleCBjYXNlcy4gICovCi0KLSNkZWZpbmUgaWVlZV93cml0ZV9ieXRlKGluZm8sIGIpCQkJCVwKLSAgKChpbmZvKS0+Y3VyYnVmLT5jIDwgSUVFRV9CVUZTSVpFCQkJCVwKLSAgID8gKChpbmZvKS0+Y3VyYnVmLT5idWZbKGluZm8pLT5jdXJidWYtPmMrK10gPSAoYiksIHRydWUpCVwKLSAgIDogaWVlZV9yZWFsX3dyaXRlX2J5dGUgKChpbmZvKSwgKGIpKSkKLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVhbF93cml0ZV9ieXRlIChpbmZvLCBiKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCBiOwotewotICBpZiAoaW5mby0+Y3VyYnVmLT5jID49IElFRUVfQlVGU0laRSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9idWYgKm47Ci0KLSAgICAgIG4gPSAoc3RydWN0IGllZWVfYnVmICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgIG4tPmMgPSAwOwotICAgICAgaWYgKGluZm8tPmN1cnJlbnQtPmhlYWQgPT0gTlVMTCkKLQlpbmZvLT5jdXJyZW50LT5oZWFkID0gbjsKLSAgICAgIGVsc2UKLQlpbmZvLT5jdXJyZW50LT50YWlsLT5uZXh0ID0gbjsKLSAgICAgIGluZm8tPmN1cnJlbnQtPnRhaWwgPSBuOwotICAgICAgaW5mby0+Y3VyYnVmID0gbjsKLSAgICB9Ci0KLSAgaW5mby0+Y3VyYnVmLT5idWZbaW5mby0+Y3VyYnVmLT5jXSA9IGI7Ci0gICsraW5mby0+Y3VyYnVmLT5jOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZSBvdXQgdHdvIGJ5dGVzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfMmJ5dGVzIChpbmZvLCBpKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGludCBpOwotewotICByZXR1cm4gKGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgaSA+PiA4KQotCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBpICYgMHhmZikpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gaW50ZWdlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3dyaXRlX251bWJlciAoaW5mbywgdikKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBiZmRfdm1hIHY7Ci17Ci0gIGJmZF92bWEgdDsKLSAgYmZkX2J5dGUgYWJbMjBdOwotICBiZmRfYnl0ZSAqcDsKLSAgdW5zaWduZWQgaW50IGM7Ci0KLSAgaWYgKHYgPD0gKGJmZF92bWEpIGllZWVfbnVtYmVyX2VuZF9lbnVtKQotICAgIHJldHVybiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIHYpOwotCi0gIHQgPSB2OwotICBwID0gYWIgKyBzaXplb2YgYWI7Ci0gIHdoaWxlICh0ICE9IDApCi0gICAgewotICAgICAgKi0tcCA9IHQgJiAweGZmOwotICAgICAgdCA+Pj0gODsKLSAgICB9Ci0gIGMgPSAoYWIgKyAyMCkgLSBwOwotCi0gIGlmIChjID4gKHVuc2lnbmVkIGludCkgKGllZWVfbnVtYmVyX3JlcGVhdF9lbmRfZW51bQotCQkJICAtIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIklFRUUgbnVtZXJpYyBvdmVyZmxvdzogMHgiKSk7Ci0gICAgICBmcHJpbnRmX3ZtYSAoc3RkZXJyLCB2KTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9udW1iZXJfcmVwZWF0X3N0YXJ0X2VudW0gKyBjKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAoOyBjID4gMDsgLS1jLCArK3ApCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAqcCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfaWQgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgdW5zaWduZWQgaW50IGxlbjsKLQotICBsZW4gPSBzdHJsZW4gKHMpOwotICBpZiAobGVuIDw9IDB4N2YpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA8PSAweGZmKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzFfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCBsZW4pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlbiA8PSAweGZmZmYpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMl9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgbGVuKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHN0cmluZyBsZW5ndGggb3ZlcmZsb3c6ICV1XG4iKSwgbGVuKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZm9yICg7ICpzICE9ICdcMCc7IHMrKykKLSAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sICpzKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGFuIEFTTiByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9hc24gKGluZm8sIGluZHgsIHZhbCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHJldHVybiAoaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXNuX3JlY29yZF9lbnVtKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdmFsKSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhbiBBVE42NSByZWNvcmQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV93cml0ZV9hdG42NSAoaW5mbywgaW5keCwgcykKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgcmV0dXJuIChpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDY1KQotCSAgJiYgaWVlZV93cml0ZV9pZCAoaW5mbywgcykpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBpbmRleCBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcHVzaF90eXBlIChpbmZvLCBpbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLXsKLSAgc3RydWN0IGllZWVfdHlwZV9zdGFjayAqdHM7Ci0KLSAgdHMgPSAoc3RydWN0IGllZWVfdHlwZV9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKnRzKTsKLSAgbWVtc2V0ICh0cywgMCwgc2l6ZW9mICp0cyk7Ci0KLSAgdHMtPnR5cGUuaW5keCA9IGluZHg7Ci0gIHRzLT50eXBlLnNpemUgPSBzaXplOwotICB0cy0+dHlwZS51bnNpZ25lZHAgPSB1bnNpZ25lZHA7Ci0gIHRzLT50eXBlLmxvY2FscCA9IGxvY2FscDsKLQotICB0cy0+bmV4dCA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGluZm8tPnR5cGVfc3RhY2sgPSB0czsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUG9wIGEgdHlwZSBpbmRleCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pZWVlX3BvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci17Ci0gIHJldHVybiBpZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIHRydWUpOwotfQotCi0vKiBQb3AgYW4gdW51c2VkIHR5cGUgaW5kZXggb2ZmIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci17Ci0gICh2b2lkKSBpZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIGZhbHNlKTsKLX0KLQotLyogUG9wIGEgdXNlZCBvciB1bnVzZWQgdHlwZSBpbmRleCBvZmYgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1pZWVlX3BvcF90eXBlX3VzZWQgKGluZm8sIHVzZWQpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYm9vbGVhbiB1c2VkOwotewotICBzdHJ1Y3QgaWVlZV90eXBlX3N0YWNrICp0czsKLSAgdW5zaWduZWQgaW50IHJldDsKLQotICB0cyA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGFzc2VydCAodHMgIT0gTlVMTCk7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIHR5cGUsIGFuZCB3ZSBuZWVkIGl0LCB3ZSBuZWVkIHRvIGFwcGVuZCB0aGUKLSAgICAgYWN0dWFsIGRlZmluaXRpb24gdG8gdGhlIHR5cGVkZWYgYmxvY2sgbm93LiAgKi8KLSAgaWYgKHVzZWQgJiYgISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZ0cy0+dHlwZS5mbmRlZikpCi0gICAgewotICAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLQotICAgICAgaWYgKHRzLT50eXBlLmxvY2FscCkKLQl7Ci0JICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBzdGFydGVkIHRoZSB0eXBlcyBibG9jay4gICovCi0JICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0JCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkJICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJ1Zmxpc3QgPSAmaW5mby0+dHlwZXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE1ha2Ugc3VyZSB3ZSBzdGFydGVkIHRoZSBnbG9iYWwgdHlwZSBibG9jay4gICovCi0JICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKLQkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQkgIGJ1Zmxpc3QgPSAmaW5mby0+Z2xvYmFsX3R5cGVzOwotCX0KLQotICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCBidWZsaXN0LCAmdHMtPnR5cGUuZm5kZWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0ID0gdHMtPnR5cGUuaW5keDsKLSAgaW5mby0+dHlwZV9zdGFjayA9IHRzLT5uZXh0OwotICBmcmVlICh0cyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFkZCBhIHJhbmdlIG9mIGJ5dGVzIGluY2x1ZGVkIGluIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGdsb2JhbCwgbG93LCBoaWdoKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJvb2xlYW4gZ2xvYmFsOwotICAgICBiZmRfdm1hIGxvdzsKLSAgICAgYmZkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqKnBsaXN0LCAqciwgKipwcjsKLQotICBpZiAobG93ID09IChiZmRfdm1hKSAtMSB8fCBoaWdoID09IChiZmRfdm1hKSAtMSB8fCBsb3cgPT0gaGlnaCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoZ2xvYmFsKQotICAgIHBsaXN0ID0gJmluZm8tPmdsb2JhbF9yYW5nZXM7Ci0gIGVsc2UKLSAgICBwbGlzdCA9ICZpbmZvLT5yYW5nZXM7Ci0KLSAgZm9yIChyID0gKnBsaXN0OyByICE9IE5VTEw7IHIgPSByLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChoaWdoID49IHItPmxvdyAmJiBsb3cgPD0gci0+aGlnaCkKLQl7Ci0JICAvKiBUaGUgbmV3IHJhbmdlIG92ZXJsYXBzIHIuICAqLwotCSAgaWYgKGxvdyA8IHItPmxvdykKLQkgICAgci0+bG93ID0gbG93OwotCSAgaWYgKGhpZ2ggPiByLT5oaWdoKQotCSAgICByLT5oaWdoID0gaGlnaDsKLQkgIHByID0gJnItPm5leHQ7Ci0JICB3aGlsZSAoKnByICE9IE5VTEwgJiYgKCpwciktPmxvdyA8PSByLT5oaWdoKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGllZWVfcmFuZ2UgKm47Ci0KLQkgICAgICBpZiAoKCpwciktPmhpZ2ggPiByLT5oaWdoKQotCQlyLT5oaWdoID0gKCpwciktPmhpZ2g7Ci0JICAgICAgbiA9ICgqcHIpLT5uZXh0OwotCSAgICAgIGZyZWUgKCpwcik7Ci0JICAgICAgKnByID0gbjsKLQkgICAgfQotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICByID0gKHN0cnVjdCBpZWVlX3JhbmdlICopIHhtYWxsb2MgKHNpemVvZiAqcik7Ci0gIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKLQotICByLT5sb3cgPSBsb3c7Ci0gIHItPmhpZ2ggPSBoaWdoOwotCi0gIC8qIFN0b3JlIHRoZSByYW5nZXMgc29ydGVkIGJ5IGFkZHJlc3MuICAqLwotICBmb3IgKHByID0gcGxpc3Q7ICpwciAhPSBOVUxMOyBwciA9ICYoKnByKS0+bmV4dCkKLSAgICBpZiAoKCpwciktPmxvdyA+IGhpZ2gpCi0gICAgICBicmVhazsKLSAgci0+bmV4dCA9ICpwcjsKLSAgKnByID0gcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYSBuZXcgcmFuZ2UgZm9yIHdoaWNoIHdlIG9ubHkgaGF2ZSB0aGUgbG93IGFkZHJlc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9yYW5nZSAoaW5mbywgbG93KQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJmZF92bWEgbG93OwotewotICBzdHJ1Y3QgaWVlZV9yYW5nZSAqcjsKLQotICByID0gKHN0cnVjdCBpZWVlX3JhbmdlICopIHhtYWxsb2MgKHNpemVvZiAqcik7Ci0gIG1lbXNldCAociwgMCwgc2l6ZW9mICpyKTsKLSAgci0+bG93ID0gbG93OwotICByLT5uZXh0ID0gaW5mby0+cGVuZGluZ19yYW5nZXM7Ci0gIGluZm8tPnBlbmRpbmdfcmFuZ2VzID0gcjsKLSAgcmV0dXJuIHRydWU7Ci19ICAKLQotLyogRmluaXNoIGEgcmFuZ2Ugc3RhcnRlZCBieSBpZWVlX3N0YXJ0X3JhbmdlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX3JhbmdlIChpbmZvLCBoaWdoKQotICAgICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm87Ci0gICAgIGJmZF92bWEgaGlnaDsKLXsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKnI7Ci0gIGJmZF92bWEgbG93OwotCi0gIGFzc2VydCAoaW5mby0+cGVuZGluZ19yYW5nZXMgIT0gTlVMTCk7Ci0gIHIgPSBpbmZvLT5wZW5kaW5nX3JhbmdlczsKLSAgbG93ID0gci0+bG93OwotICBpbmZvLT5wZW5kaW5nX3JhbmdlcyA9IHItPm5leHQ7Ci0gIGZyZWUgKHIpOwotICByZXR1cm4gaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCBsb3csIGhpZ2gpOwotfQotCi0vKiBTdGFydCBkZWZpbmluZyBhIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLXsKLSAgcmV0dXJuIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICh1bnNpZ25lZCBpbnQpIC0xLCBzaXplLCB1bnNpZ25lZHAsCi0JCQkJIGxvY2FscCwgKHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikgTlVMTCk7Ci19Ci0KLS8qIFN0YXJ0IGRlZmluaW5nIGEgbmFtZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCBpbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCwgYnVmbGlzdCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotICAgICBib29sZWFuIGxvY2FscDsKLSAgICAgc3RydWN0IGllZWVfYnVmbGlzdCAqYnVmbGlzdDsKLXsKLSAgdW5zaWduZWQgaW50IHR5cGVfaW5keDsKLSAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKLQotICBpZiAoaW5keCAhPSAodW5zaWduZWQgaW50KSAtMSkKLSAgICB0eXBlX2luZHggPSBpbmR4OwotICBlbHNlCi0gICAgewotICAgICAgdHlwZV9pbmR4ID0gaW5mby0+dHlwZV9pbmR4OwotICAgICAgKytpbmZvLT50eXBlX2luZHg7Ci0gICAgfQotCi0gIG5hbWVfaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICBuYW1lID0gIiI7Ci0KLSAgLyogSWYgd2Ugd2VyZSBnaXZlbiBhIGJ1ZmZlciwgdXNlIGl0OyBvdGhlcndpc2UsIHVzZSBlaXRoZXIgdGhlCi0gICAgIGxvY2FsIG9yIHRoZSBnbG9iYWwgdHlwZSBpbmZvcm1hdGlvbiwgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSB0eXBlCi0gICAgIGJsb2NrIGlzIHN0YXJ0ZWQuICAqLwotICBpZiAoYnVmbGlzdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgYnVmbGlzdCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZSBpZiAobG9jYWxwKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDEpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogUHVzaCB0aGUgbmV3IHR5cGUgb24gdGhlIHR5cGUgc3RhY2ssIHdyaXRlIG91dCBhbiBOTiByZWNvcmQsIGFuZAotICAgICB3cml0ZSBvdXQgdGhlIHN0YXJ0IG9mIGEgVFkgcmVjb3JkLiAgVGhlIGNhbGxlciB3aWxsIHRoZW4gZmluaXNoCi0gICAgIHRoZSBUWSByZWNvcmQuICAqLwotICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgdHlwZV9pbmR4LCBzaXplLCB1bnNpZ25lZHAsIGxvY2FscCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiAoaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCi0JICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotCSAgJiYgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX3R5X3JlY29yZF9lbnVtKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHR5cGVfaW5keCkKLQkgICYmIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMHhjZSkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpKTsKLX0KLQotLyogR2V0IGFuIGVudHJ5IHRvIHRoZSBsaXN0IG9mIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgdHlwZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICoKLWllZWVfZ2V0X21vZGlmaWVkX2luZm8gKGluZm8sIGluZHgpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgdW5zaWduZWQgaW50IGluZHg7Ci17Ci0gIGlmIChpbmR4ID49IGluZm8tPm1vZGlmaWVkX2FsbG9jKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuYWxsb2M7Ci0KLSAgICAgIG5hbGxvYyA9IGluZm8tPm1vZGlmaWVkX2FsbG9jOwotICAgICAgaWYgKG5hbGxvYyA9PSAwKQotCW5hbGxvYyA9IDE2OwotICAgICAgd2hpbGUgKGluZHggPj0gbmFsbG9jKQotCW5hbGxvYyAqPSAyOwotICAgICAgaW5mby0+bW9kaWZpZWQgPSAoKHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKikKLQkJCXhyZWFsbG9jIChpbmZvLT5tb2RpZmllZCwKLQkJCQkgIG5hbGxvYyAqIHNpemVvZiAqaW5mby0+bW9kaWZpZWQpKTsKLSAgICAgIG1lbXNldCAoaW5mby0+bW9kaWZpZWQgKyBpbmZvLT5tb2RpZmllZF9hbGxvYywgMCwKLQkgICAgICAobmFsbG9jIC0gaW5mby0+bW9kaWZpZWRfYWxsb2MpICogc2l6ZW9mICppbmZvLT5tb2RpZmllZCk7Ci0gICAgICBpbmZvLT5tb2RpZmllZF9hbGxvYyA9IG5hbGxvYzsKLSAgICB9Ci0KLSAgcmV0dXJuIGluZm8tPm1vZGlmaWVkICsgaW5keDsKLX0KLQwKLS8qIFJvdXRpbmVzIGZvciB0aGUgaGFzaCB0YWJsZSBtYXBwaW5nIG5hbWVzIHRvIHR5cGVzLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKgotaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYyAoZW50cnksIHRhYmxlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqZW50cnk7Ci0gICAgIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKnJldCA9Ci0gICAgKHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICopIGVudHJ5OwotCi0gIC8qIEFsbG9jYXRlIHRoZSBzdHJ1Y3R1cmUgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGJ5IGEKLSAgICAgc3ViY2xhc3MuICAqLwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mICpyZXQpKTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGVfaGFzaF9lbnRyeSAqKQotCSBiZmRfaGFzaF9uZXdmdW5jICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldCwgdGFibGUsIHN0cmluZykpOwotICBpZiAocmV0KQotICAgIHsKLSAgICAgIC8qIFNldCBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT50eXBlcyA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KSBcCi0gICgoc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHRhYmxlKS0+cm9vdCwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBUcmF2ZXJzZSB0aGUgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgaWVlZV9uYW1lX3R5cGVfaGFzaF90cmF2ZXJzZSh0YWJsZSwgZnVuYywgaW5mbykJCQlcCi0gIChiZmRfaGFzaF90cmF2ZXJzZQkJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotDAotLyogVGhlIGdlbmVyYWwgcm91dGluZSB0byB3cml0ZSBvdXQgSUVFRSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1ib29sZWFuCi13cml0ZV9pZWVlX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgaW5mbzsKLSAgYXNlY3Rpb24gKnM7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgc3RydWN0IGllZWVfYnVmICpiOwotCi0gIG1lbXNldCAoJmluZm8sIDAsIHNpemVvZiBpbmZvKTsKLSAgaW5mby5hYmZkID0gYWJmZDsKLSAgaW5mby50eXBlX2luZHggPSAyNTY7Ci0gIGluZm8ubmFtZV9pbmR4ID0gMzI7Ci0KLSAgaWYgKCEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8udHlwZWRlZnMucm9vdCwgaWVlZV9uYW1lX3R5cGVfbmV3ZnVuYykKLSAgICAgIHx8ICEgYmZkX2hhc2hfdGFibGVfaW5pdCAoJmluZm8udGFncy5yb290LCBpZWVlX25hbWVfdHlwZV9uZXdmdW5jKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmdsb2JhbF90eXBlcykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLmRhdGEpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby50eXBlcykKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoJmluZm8sICZpbmZvLnZhcnMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5jeHgpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby5saW5lbm9zKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZm50eXBlKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyICgmaW5mbywgJmluZm8uZm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgZGVidWdfd3JpdGUgKGRoYW5kbGUsICZpZWVlX2ZucywgKFBUUikgJmluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby5maWxlbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQgKCZpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFB1dCBhbnkgdW5kZWZpbmVkIHRhZ3MgaW4gdGhlIGdsb2JhbCB0eXBlZGVmIGluZm9ybWF0aW9uLiAgKi8KLSAgaW5mby5lcnJvciA9IGZhbHNlOwotICBpZWVlX25hbWVfdHlwZV9oYXNoX3RyYXZlcnNlICgmaW5mby50YWdzLAotCQkJCWllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZywKLQkJCQkoUFRSKSAmaW5mbyk7Ci0gIGlmIChpbmZvLmVycm9yKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBQcmVwZW5kIHRoZSBnbG9iYWwgdHlwZWRlZiBpbmZvcm1hdGlvbiB0byB0aGUgb3RoZXIgZGF0YS4gICovCi0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8uZ2xvYmFsX3R5cGVzKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgSFAgZGVidWdnZXIgc2VlbXMgdG8gaGF2ZSBhIGJ1ZyBpbiB3aGljaCBpdCBpZ25vcmVzIHRoZQotICAgICAgICAgbGFzdCBlbnRyeSBpbiB0aGUgZ2xvYmFsIHR5cGVzLCBzbyB3ZSBhZGQgYSBkdW1teSBlbnRyeS4gICovCi0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKCZpbmZvLCAmaW5mby5nbG9iYWxfdHlwZXMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sIGluZm8ubmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkICgmaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfdHlfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgaW5mby50eXBlX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIDB4Y2UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgaW5mby5uYW1lX2luZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyICgmaW5mbywgJ1AnKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoJmluZm8sIChpbnQpIGJ1aWx0aW5fdm9pZCArIDMyKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKCZpbmZvLCAoaW50KSBpZWVlX2JlX3JlY29yZF9lbnVtKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoJmluZm8sICZpbmZvLmdsb2JhbF90eXBlcywgJmluZm8uZGF0YSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW5mby5kYXRhID0gaW5mby5nbG9iYWxfdHlwZXM7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgZGVjbGFyZSBCQjExIGJsb2NrcyBmb3IgZWFjaCByYW5nZSBpbiB0aGUKLSAgICAgZmlsZS4gIFRoZXkgYXJlIGFkZGVkIHRvIGluZm8tPnZhcnMuICAqLwotICBpbmZvLmVycm9yID0gZmFsc2U7Ci0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKCZpbmZvLCAmaW5mby52YXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgaWVlZV9hZGRfYmIxMV9ibG9ja3MsIChQVFIpICZpbmZvKTsKLSAgaWYgKGluZm8uZXJyb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLnZhcnMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoJmluZm8sICZpbmZvLnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoJmluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyICgmaW5mbywgJmluZm8uZGF0YSwgJmluZm8udmFycykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOb3cgYWxsIHRoZSBkYXRhIGlzIGluIGluZm8uZGF0YS4gIFdyaXRlIGl0IG91dCB0byB0aGUgQkZELiAgV2UKLSAgICAgbm9ybWFsbHkgd291bGQgbmVlZCB0byB3b3JyeSBhYm91dCB3aGV0aGVyIGFsbCB0aGUgb3RoZXIgc2VjdGlvbnMKLSAgICAgYXJlIHNldCB1cCB5ZXQsIGJ1dCB0aGUgSUVFRSBiYWNrZW5kIHdpbGwgaGFuZGxlIHRoaXMgcGFydGljdWxhcgotICAgICBjYXNlIGNvcnJlY3RseSByZWdhcmRsZXNzLiAgKi8KLSAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8uZGF0YSkpCi0gICAgewotICAgICAgLyogVGhlcmUgaXMgbm8gZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZXJyID0gTlVMTDsKLSAgcyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIuZGVidWciKTsKLSAgaWYgKHMgPT0gTlVMTCkKLSAgICBlcnIgPSAiYmZkX21ha2Vfc2VjdGlvbiI7Ci0gIGlmIChlcnIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHMsIFNFQ19ERUJVR0dJTkcgfCBTRUNfSEFTX0NPTlRFTlRTKSkKLQllcnIgPSAiYmZkX3NldF9zZWN0aW9uX2ZsYWdzIjsKLSAgICB9Ci0gIGlmIChlcnIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0KLSAgICAgIHNpemUgPSAwOwotICAgICAgZm9yIChiID0gaW5mby5kYXRhLmhlYWQ7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0Jc2l6ZSArPSBiLT5jOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHMsIHNpemUpKQotCWVyciA9ICJiZmRfc2V0X3NlY3Rpb25fc2l6ZSI7Ci0gICAgfQotICBpZiAoZXJyID09IE5VTEwpCi0gICAgewotICAgICAgZmlsZV9wdHIgb2Zmc2V0OwotCi0gICAgICBvZmZzZXQgPSAwOwotICAgICAgZm9yIChiID0gaW5mby5kYXRhLmhlYWQ7IGIgIT0gTlVMTDsgYiA9IGItPm5leHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzLCBiLT5idWYsIG9mZnNldCwgYi0+YykpCi0JICAgIHsKLQkgICAgICBlcnIgPSAiYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgb2Zmc2V0ICs9IGItPmM7Ci0JfQotICAgIH0KLQotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIGVyciwKLQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBiZmRfaGFzaF90YWJsZV9mcmVlICgmaW5mby50eXBlZGVmcy5yb290KTsKLSAgYmZkX2hhc2hfdGFibGVfZnJlZSAoJmluZm8udGFncy5yb290KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGluZm9ybWF0aW9uIGZvciBhbiB1bmRlZmluZWQgdGFnLiAgVGhpcyBpcyBjYWxsZWQgdmlhCi0gICBpZWVlX25hbWVfdHlwZV9oYXNoX3RyYXZlcnNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfd3JpdGVfdW5kZWZpbmVkX3RhZyAoaCwgcCkKLSAgICAgc3RydWN0IGllZWVfbmFtZV90eXBlX2hhc2hfZW50cnkgKmg7Ci0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqbnQ7Ci0KLSAgZm9yIChudCA9IGgtPnR5cGVzOyBudCAhPSBOVUxMOyBudCA9IG50LT5uZXh0KQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gICAgICBjaGFyIGNvZGU7Ci0KLSAgICAgIGlmIChudC0+a2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCXsKLQkgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmdsb2JhbF90eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMikKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotCSAgICB7Ci0JICAgICAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5nbG9iYWxfdHlwZXMpKQotCSAgICB7Ci0JICAgICAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLQotICAgICAgbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBudC0+dHlwZS5uYW1lKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfdHlfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBudC0+dHlwZS5pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDB4Y2UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpKQotCXsKLQkgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAobnQtPmtpbmQpCi0JewotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgIHJldHVybiBmYWxzZTsKLQljYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotCWNhc2UgREVCVUdfS0lORF9DTEFTUzoKLQkgIGNvZGUgPSAnUyc7Ci0JICBicmVhazsKLQljYXNlIERFQlVHX0tJTkRfVU5JT046Ci0JY2FzZSBERUJVR19LSU5EX1VOSU9OX0NMQVNTOgotCSAgY29kZSA9ICdVJzsKLQkgIGJyZWFrOwotCWNhc2UgREVCVUdfS0lORF9FTlVNOgotCSAgY29kZSA9ICdFJzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBjb2RlKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkpCi0JewotCSAgaW5mby0+ZXJyb3IgPSB0cnVlOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGluZm9ybWF0aW9uIGZvciBhIGNvbXBpbGF0aW9uIHVuaXQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGNvbnN0IGNoYXIgKm1vZG5hbWU7Ci0gIGNoYXIgKmMsICpzOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgaWYgKGluZm8tPmZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9maW5pc2hfY29tcGlsYXRpb25fdW5pdCAoaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpbmZvLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICBtb2RuYW1lID0gc3RycmNociAoZmlsZW5hbWUsICcvJyk7Ci0gIGlmIChtb2RuYW1lICE9IE5VTEwpCi0gICAgKyttb2RuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgbW9kbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnXFwnKTsKLSAgICAgIGlmIChtb2RuYW1lICE9IE5VTEwpCi0JKyttb2RuYW1lOwotICAgICAgZWxzZQotCW1vZG5hbWUgPSBmaWxlbmFtZTsKLSAgICB9Ci0gIGMgPSB4c3RyZHVwIChtb2RuYW1lKTsKLSAgcyA9IHN0cnJjaHIgKGMsICcuJyk7Ci0gIGlmIChzICE9IE5VTEwpCi0gICAgKnMgPSAnXDAnOwotICBpbmZvLT5tb2RuYW1lID0gYzsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KQotICAgICAgfHwgISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+bGluZW5vcykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT5yYW5nZXMgPSBOVUxMOwotCi0gIC8qIEFsd2F5cyBpbmNsdWRlIGEgQkIxIGFuZCBhIEJCMyBibG9jay4gIFRoYXQgaXMgd2hhdCB0aGUgb3V0cHV0IG9mCi0gICAgIHRoZSBNUkkgbGlua2VyIHNlZW1zIHRvIGxvb2sgbGlrZS4gICovCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmluaXNoX2NvbXBpbGF0aW9uX3VuaXQgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IGllZWVfcmFuZ2UgKnI7Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Y3h4KSkKLSAgICB7Ci0gICAgICAvKiBBcHBlbmQgYW55IEMrKyBpbmZvcm1hdGlvbiB0byB0aGUgZ2xvYmFsIGZ1bmN0aW9uIGFuZAotICAgICAgICAgdmFyaWFibGUgaW5mb3JtYXRpb24uICAqLwotICAgICAgYXNzZXJ0ICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnZhcnMpKTsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogV2UgcHV0IHRoZSBwbWlzYyByZWNvcmRzIGluIGEgZHVtbXkgcHJvY2VkdXJlLCBqdXN0IGFzIHRoZQotICAgICAgICAgTVJJIGNvbXBpbGVyIGRvZXMuICAqLwotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDYpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiX19YUllDUFAiKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5oaWdoYWRkciAtIDEpCi0JICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMsICZpbmZvLT5jeHgpCi0JICB8fCAhIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmhpZ2hhZGRyIC0gMSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgLyogRm9yY2Ugb3V0IHRoZSBwZW5kaW5nIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGllZWVfbGluZW5vICgoUFRSKSBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAoYmZkX3ZtYSkgLTEpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmxpbmVub3MpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmxpbmVub3MpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPmxpbmVub19maWxlbmFtZSkgIT0gMCkKLQl7Ci0JICAvKiBXZSB3ZXJlIG5vdCBpbiB0aGUgbWFpbiBmaWxlLiAgV2UganVzdCBjbG9zZWQgdGhlCi0gICAgICAgICAgICAgaW5jbHVkZWQgbGluZSBudW1iZXIgYmxvY2ssIGFuZCBub3cgd2UgbXVzdCBjbG9zZSB0aGUKLSAgICAgICAgICAgICBtYWluIGxpbmUgbnVtYmVyIGJsb2NrLiAgKi8KLQkgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmRhdGEsICZpbmZvLT50eXBlcykKLSAgICAgIHx8ICEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSwgJmluZm8tPnZhcnMpCi0gICAgICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPmRhdGEsICZpbmZvLT5saW5lbm9zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQnVpbGQgQkIxMC9CQjExIGJsb2NrcyBiYXNlZCBvbiB0aGUgcmFuZ2VzIHdlIHJlY29yZGVkLiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+ZGF0YSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIkdOVSBvYmpjb3B5IikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAociA9IGluZm8tPnJhbmdlczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIGxvdywgaGlnaDsKLSAgICAgIGFzZWN0aW9uICpzOwotICAgICAgaW50IGtpbmQ7Ci0KLSAgICAgIGxvdyA9IHItPmxvdzsKLSAgICAgIGhpZ2ggPSByLT5oaWdoOwotCi0gICAgICAvKiBGaW5kIHRoZSBzZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByYW5nZS4gICovCi0gICAgICBmb3IgKHMgPSBpbmZvLT5hYmZkLT5zZWN0aW9uczsgcyAhPSBOVUxMOyBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykgPD0gbG93Ci0JICAgICAgJiYgaGlnaCA8PSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykKLQkJCSAgKyBiZmRfc2VjdGlvbl9zaXplIChpbmZvLT5hYmZkLCBzKSkpCi0JICAgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICAvKiBKdXN0IGlnbm9yZSB0aGlzIHJhbmdlLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogQ29hbGVzY2UgcmFuZ2VzIGlmIGl0IHNlZW1zIHJlYXNvbmFibGUuICAqLwotICAgICAgd2hpbGUgKHItPm5leHQgIT0gTlVMTAotCSAgICAgJiYgaGlnaCArIDB4MTAwMCA+PSByLT5uZXh0LT5sb3cKLQkgICAgICYmIChyLT5uZXh0LT5oaWdoCi0JCSA8PSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5mby0+YWJmZCwgcykKLQkJICAgICArIGJmZF9zZWN0aW9uX3NpemUgKGluZm8tPmFiZmQsIHMpKSkpCi0JewotCSAgciA9IHItPm5leHQ7Ci0JICBoaWdoID0gci0+aGlnaDsKLQl9Ci0KLSAgICAgIGlmICgocy0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQlraW5kID0gMTsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLQlraW5kID0gMzsKLSAgICAgIGVsc2UKLQlraW5kID0gMjsKLQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIDExKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBraW5kKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgcy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggLSBsb3cpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogQWRkIHRoaXMgcmFuZ2UgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIHJhbmdlcy4gICovCi0gICAgICBpZiAoISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgdHJ1ZSwgbG93LCBoaWdoKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgQkIxMSBibG9ja3MgZGVzY3JpYmluZyBlYWNoIHJhbmdlIHRoYXQgd2UgaGF2ZSBub3QgYWxyZWFkeQotICAgZGVzY3JpYmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWllZWVfYWRkX2JiMTFfYmxvY2tzIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgZGF0YTsKLSAgYmZkX3ZtYSBsb3csIGhpZ2g7Ci0gIHN0cnVjdCBpZWVlX3JhbmdlICpyOwotCi0gIGxvdyA9IGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlYyk7Ci0gIGhpZ2ggPSBsb3cgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpOwotCi0gIC8qIEZpbmQgdGhlIGZpcnN0IHJhbmdlIGF0IG9yIGFmdGVyIHRoaXMgc2VjdGlvbi4gIFRoZSByYW5nZXMgYXJlCi0gICAgIHNvcnRlZCBieSBhZGRyZXNzLiAgKi8KLSAgZm9yIChyID0gaW5mby0+Z2xvYmFsX3JhbmdlczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICBpZiAoci0+aGlnaCA+IGxvdykKLSAgICAgIGJyZWFrOwotCi0gIHdoaWxlIChsb3cgPCBoaWdoKQotICAgIHsKLSAgICAgIGlmIChyID09IE5VTEwgfHwgci0+bG93ID49IGhpZ2gpCi0JewotCSAgaWYgKCEgaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIGhpZ2gpKQotCSAgICBpbmZvLT5lcnJvciA9IHRydWU7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAobG93IDwgci0+bG93Ci0JICAmJiByLT5sb3cgLSBsb3cgPiAweDEwMCkKLQl7Ci0JICBpZiAoISBpZWVlX2FkZF9iYjExIChpbmZvLCBzZWMsIGxvdywgci0+bG93KSkKLQkgICAgewotCSAgICAgIGluZm8tPmVycm9yID0gdHJ1ZTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBsb3cgPSByLT5oaWdoOwotCi0gICAgICByID0gci0+bmV4dDsKLSAgICB9Ci19Ci0KLS8qIEFkZCBhIHNpbmdsZSBCQjExIGJsb2NrIGZvciBhIHJhbmdlLiAgV2UgYWRkIGl0IHRvIGluZm8tPnZhcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hZGRfYmIxMSAoaW5mbywgc2VjLCBsb3csIGhpZ2gpCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSBsb3c7Ci0gICAgIGJmZF92bWEgaGlnaDsKLXsKLSAgaW50IGtpbmQ7Ci0KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dmFycykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqbW9kbmFtZTsKLSAgICAgIGNoYXIgKmMsICpzOwotCi0gICAgICAvKiBTdGFydCB0aGUgZW5jbG9zaW5nIEJCMTAgYmxvY2suICAqLwotICAgICAgZmlsZW5hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChpbmZvLT5hYmZkKTsKLSAgICAgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChtb2RuYW1lICE9IE5VTEwpCi0JKyttb2RuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG1vZG5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJ1xcJyk7Ci0JICBpZiAobW9kbmFtZSAhPSBOVUxMKQotCSAgICArK21vZG5hbWU7Ci0JICBlbHNlCi0JICAgIG1vZG5hbWUgPSBmaWxlbmFtZTsKLQl9Ci0gICAgICBjID0geHN0cmR1cCAobW9kbmFtZSk7Ci0gICAgICBzID0gc3RycmNociAoYywgJy4nKTsKLSAgICAgIGlmIChzICE9IE5VTEwpCi0JKnMgPSAnXDAnOwotCi0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMTApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBjKQotCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICJHTlUgb2JqY29weSIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgZnJlZSAoYyk7Ci0gICAgfQotCi0gIGlmICgoc2VjLT5mbGFncyAmIFNFQ19DT0RFKSAhPSAwKQotICAgIGtpbmQgPSAxOwotICBlbHNlIGlmICgoc2VjLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLSAgICBraW5kID0gMzsKLSAgZWxzZQotICAgIGtpbmQgPSAyOwotCi0gIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAxMSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywga2luZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNlYy0+aW5kZXggKyBJRUVFX1NFQ1RJT05fTlVNQkVSX0JBU0UpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBsb3cpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGhpZ2ggLSBsb3cpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgcmVjb3JkaW5nIGluZm9ybWF0aW9uIGZyb20gYSBwYXJ0aWN1bGFyIHNvdXJjZSBmaWxlLiAgVGhpcyBpcwotICAgdXNlZCB0byByZWNvcmQgd2hpY2ggZmlsZSBkZWZpbmVkIHdoaWNoIHR5cGVzLCB2YXJpYWJsZXMsIGV0Yy4gIEl0Ci0gICBpcyBub3QgdXNlZCBmb3IgbGluZSBudW1iZXJzLCBzaW5jZSB0aGUgbGluZW5vIGVudHJ5IHBvaW50IHBhc3NlcwotICAgZG93biB0aGUgZmlsZSBuYW1lIGFueWhvdy4gIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGRvZXNuJ3Qgc2VlbQotICAgdG8gc3RvcmUgdGhpcyBpbmZvcm1hdGlvbiBhbnl3aGVyZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RhcnRfc291cmNlIChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhbiBlbXB0eSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW1wdHlfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIChpbnQpIGJ1aWx0aW5fdW5rbm93biwgMCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhIHZvaWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIChpbnQpIGJ1aWx0aW5fdm9pZCwgMCwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyogTWFrZSBhbiBpbnRlZ2VyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9pbnRfdHlwZSAocCwgc2l6ZSwgdW5zaWduZWRwKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdW5zaWduZWRwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnRfaW50OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fc2lnbmVkX2xvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICBpbmR4ID0gKGludCkgYnVpbHRpbl9zaWduZWRfbG9uZ19sb25nOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAodW5zaWduZWRwKQotICAgICsraW5keDsKLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIHVuc2lnbmVkcCwgZmFsc2UpOwotfQotCi0vKiBNYWtlIGEgZmxvYXRpbmcgcG9pbnQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Zsb2F0X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2Zsb2F0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgaW5keCA9IChpbnQpIGJ1aWx0aW5fZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHNpemUgcmVhbGx5IGRlcGVuZHMgdXBvbiB0aGUgcHJvY2Vzc29yLiAgKi8KLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2xvbmdfZG91YmxlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGluZHggPSAoaW50KSBidWlsdGluX2xvbmdfbG9uZ19kb3VibGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJRUVFIHVuc3VwcG9ydGVkIGZsb2F0IHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGluZHgsIHNpemUsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLS8qIE1ha2UgYSBjb21wbGV4IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jb21wbGV4X3R5cGUgKHAsIHNpemUpCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjaGFyIGNvZGU7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCAhPSAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5mby0+Y29tcGxleF9mbG9hdF9pbmRleCwgc2l6ZSAqIDIsCi0JCQkgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGNvZGUgPSAnYyc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTY6Ci0gICAgICAvKiBUaGVzZSBjYXNlcyBjYW4gYmUgb3V0cHV0IGJ5IGdjYyAtZ3N0YWJzLiAgT3V0cHV0dGluZyB0aGUKLSAgICAgICAgIHdyb25nIHR5cGUgaXMgYmV0dGVyIHRoYW4gY3Jhc2hpbmcuICAqLwotICAgIGNhc2UgODoKLSAgICAgIGlmIChpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCAhPSAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5mby0+Y29tcGxleF9kb3VibGVfaW5kZXgsIHNpemUgKiAyLAotCQkJICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBjb2RlID0gJ2QnOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiSUVFRSB1bnN1cHBvcnRlZCBjb21wbGV4IHR5cGUgc2l6ZSAldVxuIiksIHNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBGSVhNRTogSSBkb24ndCBrbm93IHdoYXQgdGhlIHN0cmluZyBpcyBmb3IuICAqLwotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplICogMiwgZmFsc2UsIGZhbHNlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgY29kZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoc2l6ZSA9PSA0KQotICAgIGluZm8tPmNvbXBsZXhfZmxvYXRfaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0gIGVsc2UKLSAgICBpbmZvLT5jb21wbGV4X2RvdWJsZV9pbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGJvb2xlYW4gdHlwZS4gIElFRUUgZG9lc24ndCBzdXBwb3J0IHRoZXNlLCBzbyB3ZSBqdXN0IG1ha2UKLSAgIGFuIGludGVnZXIgdHlwZSBpbnN0ZWFkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfYm9vbF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHJldHVybiBpZWVlX2ludF90eXBlIChwLCBzaXplLCB0cnVlKTsKLX0KLQotLyogTWFrZSBhbiBlbnVtZXJhdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFscykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgY29uc3QgY2hhciAqKm5hbWVzOwotICAgICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKmU7Ci0gIGJvb2xlYW4gbG9jYWxwLCBzaW1wbGU7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBpbnQgaSA9IDA7Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0gIGluZHggPSAodW5zaWduZWQgaW50KSAtMTsKLSAgZm9yIChlID0gaW5mby0+ZW51bXM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQpCi0gICAgewotICAgICAgaWYgKHRhZyA9PSBOVUxMKQotCXsKLQkgIGlmIChlLT50YWcgIT0gTlVMTCkKLQkgICAgY29udGludWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlLT50YWcgPT0gTlVMTAotCSAgICAgIHx8IHRhZ1swXSAhPSBlLT50YWdbMF0KLQkgICAgICB8fCBzdHJjbXAgKHRhZywgZS0+dGFnKSAhPSAwKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghIGUtPmRlZmluZWQpCi0JewotCSAgLyogVGhpcyBlbnVtIHRhZyBoYXMgYmVlbiBzZWVuIGJ1dCBub3QgZGVmaW5lZC4gICovCi0JICBpbmR4ID0gZS0+aW5keDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKG5hbWVzICE9IE5VTEwgJiYgZS0+bmFtZXMgIT0gTlVMTCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMICYmIGUtPm5hbWVzW2ldICE9IE5VTEw7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChuYW1lc1tpXVswXSAhPSBlLT5uYW1lc1tpXVswXQotCQkgIHx8IHZhbHNbaV0gIT0gZS0+dmFsc1tpXQotCQkgIHx8IHN0cmNtcCAobmFtZXNbaV0sIGUtPm5hbWVzW2ldKSAhPSAwKQotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKChuYW1lcyA9PSBOVUxMICYmIGUtPm5hbWVzID09IE5VTEwpCi0JICB8fCAobmFtZXMgIT0gTlVMTAotCSAgICAgICYmIGUtPm5hbWVzICE9IE5VTEwKLQkgICAgICAmJiBuYW1lc1tpXSA9PSBOVUxMCi0JICAgICAgJiYgZS0+bmFtZXNbaV0gPT0gTlVMTCkpCi0JewotCSAgLyogV2UndmUgc2VlbiB0aGlzIGVudW0gYmVmb3JlLiAgKi8KLQkgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgZS0+aW5keCwgMCwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotICAgICAgaWYgKHRhZyAhPSBOVUxMKQotCXsKLQkgIC8qIFdlJ3ZlIGFscmVhZHkgc2VlbiBhbiBlbnVtIG9mIHRoZSBzYW1lIG5hbWUsIHNvIHdlIG11c3QgbWFrZQotCSAgICAgc3VyZSB0byBvdXRwdXQgdGhpcyBvbmUgbG9jYWxseS4gICovCi0JICBsb2NhbHAgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB0aGlzIGlzIGEgc2ltcGxlIGVudW1lcmF0aW9uLCBpbiB3aGljaCB0aGUgdmFsdWVzIHN0YXJ0IGF0IDAKLSAgICAgYW5kIGFsd2F5cyBpbmNyZW1lbnQgYnkgMSwgd2UgY2FuIHVzZSB0eXBlIEUuICBPdGhlcndpc2Ugd2UgbXVzdAotICAgICB1c2UgdHlwZSBOLiAgKi8KLQotICBzaW1wbGUgPSB0cnVlOwotICBpZiAobmFtZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBuYW1lc1tpXSAhPSBOVUxMOyBpKyspCi0JewotCSAgaWYgKHZhbHNbaV0gIT0gaSkKLQkgICAgewotCSAgICAgIHNpbXBsZSA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCB0YWcsIGluZHgsIDAsIHRydWUsIGxvY2FscCwKLQkJCQkoc3RydWN0IGllZWVfYnVmbGlzdCAqKSBOVUxMKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc2ltcGxlID8gJ0UnIDogJ04nKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzaW1wbGUpCi0gICAgewotICAgICAgLyogRklYTUU6IFRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIGVudW1lcmF0aW9uIHNpemUsIGJ1dCB3ZQotICAgICAgICAgZG9uJ3Qgc3RvcmUgdGhhdC4gICovCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKG5hbWVzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWVzW2ldKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCEgc2ltcGxlKQotCSAgICB7Ci0JICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHZhbHNbaV0pKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBpZiAoaW5keCA9PSAodW5zaWduZWQgaW50KSAtMSkKLQl7Ci0JICBlID0gKHN0cnVjdCBpZWVlX2RlZmluZWRfZW51bSAqKSB4bWFsbG9jIChzaXplb2YgKmUpOwotCSAgbWVtc2V0IChlLCAwLCBzaXplb2YgKmUpOwotCSAgZS0+aW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQkgIGUtPnRhZyA9IHRhZzsKLQotCSAgZS0+bmV4dCA9IGluZm8tPmVudW1zOwotCSAgaW5mby0+ZW51bXMgPSBlOwotCX0KLQotICAgICAgZS0+bmFtZXMgPSBuYW1lczsKLSAgICAgIGUtPnZhbHMgPSB2YWxzOwotICAgICAgZS0+ZGVmaW5lZCA9IHRydWU7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBNYWtlIGEgcG9pbnRlciB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcG9pbnRlcl90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGxvY2FscDsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX21vZGlmaWVkX3R5cGUgKm0gPSBOVUxMOwotCi0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQSBwb2ludGVyIHRvIGEgc2ltcGxlIGJ1aWx0aW4gdHlwZSBjYW4gYmUgb2J0YWluZWQgYnkgYWRkaW5nIDMyLgotICAgICBGSVhNRTogV2lsbCB0aGlzIGJlIGEgc2hvcnQgcG9pbnRlciwgYW5kIHdpbGwgdGhhdCBtYXR0ZXI/ICAqLwotICBpZiAoaW5keCA8IDMyKQotICAgIHJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgaW5keCArIDMyLCAwLCB0cnVlLCBmYWxzZSk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChwLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICAgICAgaWYgKG0tPnBvaW50ZXIgPiAwKQotCXJldHVybiBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+cG9pbnRlciwgNCwgdHJ1ZSwgZmFsc2UpOwotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCA0LCB0cnVlLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnUCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIG0tPnBvaW50ZXIgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBmdW5jdGlvbiB0eXBlLiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3IgYSBtZXRob2QsIGJ1dCB3ZQotICAgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBhZGQgaXQgdG8gdGhlIHR5cGUgdGFibGUgaW4gdGhhdCBjYXNlLiAgV2UKLSAgIGhhbmRsZSB0aGlzIGJ5IGRlZmluaW5nIHRoZSB0eXBlIGluIGEgcHJpdmF0ZSBidWZmZXIsIGFuZCBvbmx5Ci0gICBhZGRpbmcgdGhhdCBidWZmZXIgdG8gdGhlIHR5cGVkZWYgYmxvY2sgaWYgd2UgYXJlIGdvaW5nIHRvIHVzZSBpdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2Z1bmN0aW9uX3R5cGUgKHAsIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCAqYXJncyA9IE5VTEw7Ci0gIGludCBpOwotICB1bnNpZ25lZCBpbnQgcmV0aW5keDsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCBmbmRlZjsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbTsKLQotICBsb2NhbHAgPSBmYWxzZTsKLQotICBpZiAoYXJnY291bnQgPiAwKQotICAgIHsKLSAgICAgIGFyZ3MgPSAodW5zaWduZWQgaW50ICopIHhtYWxsb2MgKGFyZ2NvdW50ICogc2l6ZW9mICphcmdzKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotCSAgICBsb2NhbHAgPSB0cnVlOwotCSAgYXJnc1tpXSA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGFyZ2NvdW50IDwgMCkKLSAgICB2YXJhcmdzID0gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwKQotICAgIGxvY2FscCA9IHRydWU7Ci0gIHJldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBtID0gTlVMTDsKLSAgaWYgKGFyZ2NvdW50IDwgMCAmJiAhIGxvY2FscCkKLSAgICB7Ci0gICAgICBtID0gaWVlZV9nZXRfbW9kaWZpZWRfaW5mbyAocCwgcmV0aW5keCk7Ci0gICAgICBpZiAobSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKG0tPmZ1bmN0aW9uID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPmZ1bmN0aW9uLCAwLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gIC8qIEFuIGF0dHJpYnV0ZSBvZiAweDQxIG1lYW5zIHRoYXQgdGhlIGZyYW1lIGFuZCBwdXNoIG1hc2sgYXJlCi0gICAgIHVua25vd24uICAqLwotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmZm5kZWYpCi0gICAgICB8fCAhIGllZWVfZGVmaW5lX25hbWVkX3R5cGUgKGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgKHVuc2lnbmVkIGludCkgLTEsIDAsIHRydWUsIGxvY2FscCwKLQkJCQkgICAmZm5kZWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAneCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAweDQxKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZXRpbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgKGJmZF92bWEpIGFyZ2NvdW50ICsgKHZhcmFyZ3MgPyAxIDogMCkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGFyZ2NvdW50ID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLQlpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYXJnc1tpXSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICBmcmVlIChhcmdzKTsKLSAgICB9Ci0gIGlmICh2YXJhcmdzKQotICAgIHsKLSAgICAgIC8qIEEgdmFyYXJncyBmdW5jdGlvbiBpcyByZXByZXNlbnRlZCBieSB3cml0aW5nIG91dCB0aGUgbGFzdAotICAgICAgICAgYXJndW1lbnQgYXMgdHlwZSB2b2lkICosIGFsdGhvdWdoIHRoaXMgbWFrZXMgbGl0dGxlIHNlbnNlLiAgKi8KLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgYnVpbHRpbl92b2lkICsgMzIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBXZSB3cm90ZSB0aGUgaW5mb3JtYXRpb24gaW50byBmbmRlZiwgaW4gY2FzZSB3ZSBkb24ndCBuZWVkIGl0LgotICAgICBJdCB3aWxsIGJlIGFwcGVuZGVkIHRvIGluZm8tPnR5cGVzIGJ5IGllZWVfcG9wX3R5cGUuICAqLwotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmZuZGVmID0gZm5kZWY7Ci0KLSAgaWYgKG0gIT0gTlVMTCkKLSAgICBtLT5mdW5jdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIHJlZmVyZW5jZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmVmZXJlbmNlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogSUVFRSBhcHBlYXJzIHRvIHJlY29yZCBhIG5vcm1hbCBwb2ludGVyIHR5cGUsIGFuZCB0aGVuIHVzZSBhCi0gICAgIHBtaXNjIHJlY29yZCB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIHJlYWxseSBhIHJlZmVyZW5jZS4gICovCi0KLSAgaWYgKCEgaWVlZV9wb2ludGVyX3R5cGUgKHApKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSByYW5nZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfcmFuZ2VfdHlwZSAocCwgbG93LCBoaWdoKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93OwotICAgICBiZmRfc2lnbmVkX3ZtYSBoaWdoOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotCi0gIHNpemUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnNpemU7Ci0gIHVuc2lnbmVkcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUudW5zaWduZWRwOwotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICByZXR1cm4gKGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIHNpemUsIHVuc2lnbmVkcCwgbG9jYWxwKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdSJykKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAoYmZkX3ZtYSkgbG93KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIChiZmRfdm1hKSBoaWdoKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHVuc2lnbmVkcCA/IDAgOiAxKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNpemUpKTsKLX0KLQotLyogTWFrZSBhbiBhcnJheSB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9hcnJheV90eXBlIChwLCBsb3csIGhpZ2gsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3c7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGhpZ2g7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgZWxlaW5keDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzdHJ1Y3QgaWVlZV9tb2RpZmllZF90eXBlICptID0gTlVMTDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfYXJyYXlfdHlwZSAqYTsKLQotICAvKiBJRUVFIGRvZXMgbm90IHN0b3JlIHRoZSByYW5nZSwgc28gd2UganVzdCBpZ25vcmUgaXQuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICBlbGVpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogSWYgd2UgZG9uJ3Qga25vdyB0aGUgcmFuZ2UsIHRyZWF0IHRoZSBzaXplIGFzIGV4YWN0bHkgb25lCi0gICAgIGVsZW1lbnQuICAqLwotICBpZiAobG93IDwgaGlnaCkKLSAgICBzaXplICo9IChoaWdoIC0gbG93KSArIDE7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBlbGVpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKGEgPSBtLT5hcnJheXM7IGEgIT0gTlVMTDsgYSA9IGEtPm5leHQpCi0JewotCSAgaWYgKGEtPmxvdyA9PSBsb3cgJiYgYS0+aGlnaCA9PSBoaWdoKQotCSAgICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGEtPmluZHgsIHNpemUsIGZhbHNlLCBmYWxzZSk7Ci0JfQotICAgIH0KLQotICBpZiAoISBpZWVlX2RlZmluZV90eXBlIChpbmZvLCBzaXplLCBmYWxzZSwgbG9jYWxwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93ID09IDAgPyAnWicgOiAnQycpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBlbGVpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChsb3cgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbG93KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBoaWdoICsgMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICB7Ci0gICAgICBhID0gKHN0cnVjdCBpZWVlX21vZGlmaWVkX2FycmF5X3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICphKTsKLSAgICAgIG1lbXNldCAoYSwgMCwgc2l6ZW9mICphKTsKLQotICAgICAgYS0+aW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaW5keDsKLSAgICAgIGEtPmxvdyA9IGxvdzsKLSAgICAgIGEtPmhpZ2ggPSBoaWdoOwotCi0gICAgICBhLT5uZXh0ID0gbS0+YXJyYXlzOwotICAgICAgbS0+YXJyYXlzID0gYTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgZWxlaW5keDsKLQotICBsb2NhbHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscDsKLSAgZWxlaW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEZJWE1FOiBXZSBkb24ndCBrbm93IHRoZSBzaXplLCBzbyB3ZSBqdXN0IHVzZSA0LiAgKi8KLQotICByZXR1cm4gKGllZWVfZGVmaW5lX3R5cGUgKGluZm8sIDAsIHRydWUsIGxvY2FscCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAncycpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBlbGVpbmR4KSk7Ci19Ci0KLS8qIE1ha2UgYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9vZmZzZXRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IHRhcmdldGluZHgsIGJhc2VpbmR4OwotCi0gIHRhcmdldGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLSAgYmFzZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBGSVhNRTogVGhlIE1SSSBDKysgY29tcGlsZXIgZG9lcyBub3QgYXBwZWFyIHRvIGdlbmVyYXRlIGFueQotICAgICB1c2VmdWwgdHlwZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBvZmZzZXQgdHlwZS4gIEl0IGp1c3QgcmVjb3JkcyBhCi0gICAgIHBvaW50ZXIgdG8gbWVtYmVyIGFzIGFuIGludGVnZXIuICBUaGUgTVJJL0hQIElFRUUgc3BlYyBkb2VzCi0gICAgIGRlc2NyaWJlIGEgcG1pc2MgcmVjb3JkIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBhIHBvaW50ZXIgdG8KLSAgICAgbWVtYmVyLiAgVW5mb3J0dW5hdGVseSwgaXQgZG9lcyBub3QgZGVzY3JpYmUgdGhlIHRhcmdldCB0eXBlLAotICAgICB3aGljaCBzZWVtcyBwcmV0dHkgaW1wb3J0YW50LiAgSSdtIGdvaW5nIHRvIHB1bnQgdGhpcyBmb3Igbm93LiAgKi8KLQotICByZXR1cm4gaWVlZV9pbnRfdHlwZSAocCwgNCwgdHJ1ZSk7Ci19ICAKLQotLyogTWFrZSBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbWV0aG9kX3R5cGUgKHAsIGRvbWFpbiwgYXJnY291bnQsIHZhcmFyZ3MpCi0gICAgIFBUUiBwOwotICAgICBib29sZWFuIGRvbWFpbjsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIE1SSS9IUCBJRUVFIHNwZWMgZGVmaW5lcyBhIHBtaXNjIHJlY29yZCB0byB1c2UgZm9yIGEKLSAgICAgbWV0aG9kLCBidXQgdGhlIGRlZmluaXRpb24gaXMgaW5jb21wbGV0ZS4gIFdlIGp1c3Qgb3V0cHV0IGFuICd4JwotICAgICB0eXBlLiAgKi8KLQotICBpZiAoZG9tYWluKQotICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLQotICByZXR1cm4gaWVlZV9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncyk7Ci19Ci0KLS8qIE1ha2UgYSBjb25zdCBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAobS0+Y29uc3RfcXVhbGlmaWVkID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPmNvbnN0X3F1YWxpZmllZCwgc2l6ZSwgdW5zaWduZWRwLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnbicpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAxKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICBtLT5jb25zdF9xdWFsaWZpZWQgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSB2b2xhdGlsZSBxdWFsaWZpZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZvbGF0aWxlX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHVuc2lnbmVkcCwgbG9jYWxwOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgc3RydWN0IGllZWVfbW9kaWZpZWRfdHlwZSAqbSA9IE5VTEw7Ci0KLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuc2l6ZTsKLSAgdW5zaWduZWRwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS51bnNpZ25lZHA7Ci0gIGxvY2FscCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwOwotICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgaWYgKCEgbG9jYWxwKQotICAgIHsKLSAgICAgIG0gPSBpZWVlX2dldF9tb2RpZmllZF9pbmZvIChpbmZvLCBpbmR4KTsKLSAgICAgIGlmIChtID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAobS0+dm9sYXRpbGVfcXVhbGlmaWVkID4gMCkKLQlyZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIG0tPnZvbGF0aWxlX3F1YWxpZmllZCwgc2l6ZSwgdW5zaWduZWRwLAotCQkJICAgICAgIGZhbHNlKTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgc2l6ZSwgdW5zaWduZWRwLCBsb2NhbHApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnbicpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAyKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGxvY2FscCkKLSAgICBtLT52b2xhdGlsZV9xdWFsaWZpZWQgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmluZHg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIENvbnZlcnQgYW4gZW51bSBkZWJ1Z192aXNpYmlsaXR5IGludG8gYSBDWFhGTEFHUyB2YWx1ZS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KQotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzoKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BVQkxJQzsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BSSVZBVEU7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHJldHVybiBDWFhGTEFHU19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFN0YXJ0IGRlZmluaW5nIGEgc3RydWN0IHR5cGUuICBXZSBidWlsZCBpdCBpbiB0aGUgc3RyZGVmIGZpZWxkIG9uCi0gICB0aGUgc3RhY2ssIHRvIGF2b2lkIGNvbmZ1c2luZyB0eXBlIGRlZmluaXRpb25zIHJlcXVpcmVkIGJ5IHRoZQotICAgZmllbGRzIHdpdGggdGhlIHN0cnVjdCB0eXBlIGl0c2VsZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHAsIGlnbm9yZXA7Ci0gIGJvb2xlYW4gY29weTsKLSAgY2hhciBhYlsyMF07Ci0gIGNvbnN0IGNoYXIgKmxvb2s7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50LCAqbnRsb29rOwotICBzdHJ1Y3QgaWVlZV9idWZsaXN0IHN0cmRlZjsKLQotICBsb2NhbHAgPSBmYWxzZTsKLSAgaWdub3JlcCA9IGZhbHNlOwotCi0gIC8qIFdlIG5lZWQgdG8gY3JlYXRlIGEgdGFnIGZvciBpbnRlcm5hbCB1c2UgZXZlbiBpZiB3ZSBkb24ndCB3YW50Ci0gICAgIG9uZSBmb3IgZXh0ZXJuYWwgdXNlLiAgVGhpcyB3aWxsIGxldCB1cyByZWZlciB0byBhbiBhbm9ueW1vdXMKLSAgICAgc3RydWN0LiAgKi8KLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxvb2sgPSB0YWc7Ci0gICAgICBjb3B5ID0gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ByaW50ZiAoYWIsICJfX2Fub24ldSIsIGlkKTsKLSAgICAgIGxvb2sgPSBhYjsKLSAgICAgIGNvcHkgPSB0cnVlOwotICAgIH0KLQotICAvKiBJZiB3ZSBhbHJlYWR5IGhhdmUgcmVmZXJlbmNlcyB0byB0aGUgdGFnLCB3ZSBtdXN0IHVzZSB0aGUKLSAgICAgZXhpc3RpbmcgdHlwZSBpbmRleC4gICovCi0gIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnRhZ3MsIGxvb2ssIHRydWUsIGNvcHkpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBudCA9IE5VTEw7Ci0gIGZvciAobnRsb29rID0gaC0+dHlwZXM7IG50bG9vayAhPSBOVUxMOyBudGxvb2sgPSBudGxvb2stPm5leHQpCi0gICAgewotICAgICAgaWYgKG50bG9vay0+aWQgPT0gaWQpCi0JbnQgPSBudGxvb2s7Ci0gICAgICBlbHNlIGlmICghIG50bG9vay0+dHlwZS5sb2NhbHApCi0JewotCSAgLyogV2UgYXJlIGNyZWF0aW5nIGEgZHVwbGljYXRlIGRlZmluaXRpb24gb2YgYSBnbG9iYWxseQotCSAgICAgZGVmaW5lZCB0YWcuICBGb3JjZSBpdCB0byBiZSBsb2NhbCB0byBhdm9pZAotCSAgICAgY29uZnVzaW9uLiAgKi8KLQkgIGxvY2FscCA9IHRydWU7Ci0JfQotICAgIH0KLQotICBpZiAobnQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGxvY2FscCA9PSBudC0+dHlwZS5sb2NhbHApOwotICAgICAgaWYgKG50LT5raW5kID09IERFQlVHX0tJTkRfSUxMRUdBTCAmJiAhIGxvY2FscCkKLQl7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IHNlZW4gYSBnbG9iYWwgZGVmaW5pdGlvbiBvZiB0aGUgdHlwZS4KLSAgICAgICAgICAgICBJZ25vcmUgdGhpcyBuZXcgZGVmaW5pdGlvbi4gICovCi0JICBpZ25vcmVwID0gdHJ1ZTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnQgPSAoc3RydWN0IGllZWVfbmFtZV90eXBlICopIHhtYWxsb2MgKHNpemVvZiAqbnQpOwotICAgICAgbWVtc2V0IChudCwgMCwgc2l6ZW9mICpudCk7Ci0gICAgICBudC0+aWQgPSBpZDsKLSAgICAgIG50LT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLSAgICAgIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gICAgICBoLT50eXBlcyA9IG50OwotICAgICAgbnQtPnR5cGUuaW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgICAgICsraW5mby0+dHlwZV9pbmR4OwotICAgIH0KLQotICBudC0+a2luZCA9IERFQlVHX0tJTkRfSUxMRUdBTDsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmc3RyZGVmKQotICAgICAgfHwgISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCB0YWcsIG50LT50eXBlLmluZHgsIHNpemUsIHRydWUsCi0JCQkJICAgbG9jYWxwLCAmc3RyZGVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgc3RydWN0cCA/ICdTJyA6ICdVJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBpZ25vcmVwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmhvbGQ7Ci0KLSAgICAgIC8qIFdlIG5ldmVyIHdhbnQgbnQtPnR5cGUubmFtZSB0byBiZSBOVUxMLiAgV2Ugd2FudCB0aGUgcmVzdCBvZgotCSB0aGUgdHlwZSB0byBiZSB0aGUgb2JqZWN0IHNldCB1cCBvbiB0aGUgdHlwZSBzdGFjazsgaXQgd2lsbAotCSBoYXZlIGEgTlVMTCBuYW1lIGlmIHRhZyBpcyBOVUxMLiAgKi8KLSAgICAgIGhvbGQgPSBudC0+dHlwZS5uYW1lOwotICAgICAgbnQtPnR5cGUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlOwotICAgICAgbnQtPnR5cGUubmFtZSA9IGhvbGQ7Ci0gICAgfQotCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSA9IHRhZzsKLSAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYgPSBzdHJkZWY7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaWdub3JlcCA9IGlnbm9yZXA7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGZpZWxkIHRvIGEgc3RydWN0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfc3RydWN0X2ZpZWxkIChwLCBuYW1lLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gIGJvb2xlYW4gcmVmZXJlbmNlcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBpbmR4OwotICBiZmRfdm1hIG9mZnNldDsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+bmV4dCAhPSBOVUxMCi0JICAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPm5leHQtPnR5cGUuc3RyZGVmKSk7Ci0KLSAgLyogSWYgd2UgYXJlIGlnbm9yaW5nIHRoaXMgc3RydWN0IGRlZmluaXRpb24sIGp1c3QgcG9wIGFuZCBpZ25vcmUKLSAgICAgdGhlIHR5cGUuICAqLwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5pZ25vcmVwKQotICAgIHsKLSAgICAgIGllZWVfcG9wX3VudXNlZF90eXBlIChpbmZvKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICB1bnNpZ25lZHAgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnVuc2lnbmVkcDsKLSAgcmVmZXJlbmNlcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcDsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAobG9jYWxwKQotICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubG9jYWxwID0gdHJ1ZTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBmbGFnczsKLSAgICAgIHVuc2lnbmVkIGludCBuaW5keDsKLQotICAgICAgLyogVGhpcyBpcyBhIGNsYXNzLiAgV2UgbXVzdCBhZGQgYSBkZXNjcmlwdGlvbiBvZiB0aGlzIGZpZWxkIHRvCi0gICAgICAgICB0aGUgY2xhc3MgcmVjb3JkcyB3ZSBhcmUgYnVpbGRpbmcuICAqLwotCi0gICAgICBmbGFncyA9IGllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KTsKLSAgICAgIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywKLQkJCQkmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2QnKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotCSAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNDsKLQotICAgICAgaWYgKHJlZmVyZW5jZXApCi0JewotCSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0JICAvKiBXZSBuZWVkIHRvIG91dHB1dCBhIHJlY29yZCByZWNvcmRpbmcgdGhhdCB0aGlzIGZpZWxkIGlzCi0gICAgICAgICAgICAgcmVhbGx5IG9mIHJlZmVyZW5jZSB0eXBlLiAgV2UgcHV0IHRoaXMgb24gdGhlIHJlZnMgZmllbGQKLSAgICAgICAgICAgICBvZiBjbGFzc2RlZiwgc28gdGhhdCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIEMrKwotICAgICAgICAgICAgIHJlY29yZHMgYWZ0ZXIgdGhlIGNsYXNzIGlzIGRlZmluZWQuICAqLwotCi0JICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLQkgICsraW5mby0+bmFtZV9pbmR4OwotCi0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCi0JCQkJICAgICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5yZWZzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgODApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ1InKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogSWYgdGhlIGJpdHNpemUgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgc2l6ZSwgd2UgbmVlZCB0byBvdXRwdXQKLSAgICAgYSBiaXRmaWVsZCB0eXBlLiAgKi8KLSAgaWYgKHNpemUgPT0gMCB8fCBiaXRzaXplID09IDAgfHwgYml0c2l6ZSA9PSBzaXplICogOCkKLSAgICBvZmZzZXQgPSBiaXRwb3MgLyA4OwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9kZWZpbmVfdHlwZSAoaW5mbywgMCwgdW5zaWduZWRwLAotCQkJICAgICAgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAnZycpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB1bnNpZ25lZHAgPyAwIDogMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGJpdHNpemUpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmR4KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBvZmZzZXQgPSBiaXRwb3M7Ci0gICAgfQotCi0gIC8qIFN3aXRjaCB0byB0aGUgc3RydWN0IHdlIGFyZSBidWlsZGluZyBpbiBvcmRlciB0byBvdXRwdXQgdGhpcwotICAgICBmaWVsZCBkZWZpbml0aW9uLiAgKi8KLSAgcmV0dXJuIChpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikKLQkgICYmIGllZWVfd3JpdGVfaWQgKGluZm8sIG5hbWUpCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5keCkKLQkgICYmIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBvZmZzZXQpKTsKLX0KLQotLyogRmluaXNoIHVwIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfc3RydWN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX2J1Zmxpc3QgKnBiOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiAhIGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuc3RyZGVmKSk7Ci0KLSAgLyogSWYgd2Ugd2VyZSBpZ25vcmluZyB0aGlzIHN0cnVjdCBkZWZpbml0aW9uIGJlY2F1c2UgaXQgd2FzIGEKLSAgICAgZHVwbGljYXRlIGRlZmludGlvbiwganVzdCB0aHJvdWdoIGF3YXkgd2hhdGV2ZXIgYnl0ZXMgd2UgaGF2ZQotICAgICBhY2N1bXVsYXRlZC4gIExlYXZlIHRoZSB0eXBlIG9uIHRoZSBzdGFjay4gKi8KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnR5cGUuaWdub3JlcCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBhIGR1cGxpY2F0ZSBkZWZpbml0aW9uIG9mIHRoaXMgdGFnLCB0aGVuIGxvY2FscAotICAgICB3aWxsIGJlIGZhbHNlLCBhbmQgd2UgY2FuIHB1dCBpdCBpbiB0aGUgZ2xvYmFsIHR5cGUgYmxvY2suCi0gICAgIEZJWE1FOiBXZSBzaG91bGQgYXZvaWQgb3V0cHV0dGluZyBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgd2hpY2ggYXJlCi0gICAgIHRoZSBzYW1lLiAgKi8KLSAgaWYgKCEgaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHApCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgc3RhcnRlZCB0aGUgZ2xvYmFsIHR5cGUgYmxvY2suICAqLwotICAgICAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPmdsb2JhbF90eXBlcykpCi0JewotCSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Z2xvYmFsX3R5cGVzKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAyKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwYiA9ICZpbmZvLT5nbG9iYWxfdHlwZXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgc3RhcnRlZCB0aGUgdHlwZXMgYmxvY2suICAqLwotICAgICAgaWYgKGllZWVfYnVmZmVyX2VtcHR5cCAoJmluZm8tPnR5cGVzKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlcykKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+bW9kbmFtZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwYiA9ICZpbmZvLT50eXBlczsKLSAgICB9Ci0KLSAgLyogQXBwZW5kIHRoZSBzdHJ1Y3QgZGVmaW5pdGlvbiB0byB0aGUgdHlwZXMuICAqLwotICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sIHBiLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpCi0gICAgICB8fCAhIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLnN0cmRlZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExlYXZlIHRoZSBzdHJ1Y3Qgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGNsYXNzIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9jbGFzc190eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplLCB2cHRyLCBvd252cHRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJvb2xlYW4gdnB0cjsKLSAgICAgYm9vbGVhbiBvd252cHRyOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIGNvbnN0IGNoYXIgKnZjbGFzczsKLSAgc3RydWN0IGllZWVfYnVmbGlzdCBwbWlzY2J1ZjsKLSAgdW5zaWduZWQgaW50IGluZHg7Ci0gIHN0cnVjdCBpZWVlX3R5cGVfY2xhc3MgKmNsYXNzZGVmOwotCi0gIC8qIEEgQysrIGNsYXNzIGlzIG91dHB1dCBhcyBhIEMrKyBzdHJ1Y3QgYWxvbmcgd2l0aCBhIHNldCBvZiBwbWlzYwotICAgICByZWNvcmRzIGRlc2NyaWJpbmcgdGhlIGNsYXNzLiAgKi8KLQotICAvKiBXZSBuZWVkIHRvIGhhdmUgYSBuYW1lIHNvIHRoYXQgd2UgY2FuIGFzc29jaWF0ZSB0aGUgc3RydWN0IGFuZAotICAgICB0aGUgY2xhc3MuICAqLwotICBpZiAodGFnID09IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqdDsKLQotICAgICAgdCA9IChjaGFyICopIHhtYWxsb2MgKDIwKTsKLSAgICAgIHNwcmludGYgKHQsICJfX2Fub24ldSIsIGlkKTsKLSAgICAgIHRhZyA9IHQ7Ci0gICAgfQotCi0gIC8qIFdlIGNhbid0IHdyaXRlIG91dCB0aGUgdmlydHVhbCB0YWJsZSBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBoYXZlCi0gICAgIGZpbmlzaGVkIHRoZSBjbGFzcywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHRoZSB2aXJ0dWFsIHRhYmxlIHNpemUuCi0gICAgIFdlIGdldCB0aGUgc2l6ZSBmcm9tIHRoZSBsYXJnZXN0IHZvZmZzZXQgd2Ugc2VlLiAgKi8KLSAgdmNsYXNzID0gTlVMTDsKLSAgaWYgKHZwdHIgJiYgISBvd252cHRyKQotICAgIHsKLSAgICAgIHZjbGFzcyA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZTsKLSAgICAgIGFzc2VydCAodmNsYXNzICE9IE5VTEwpOwotICAgICAgLyogV2UgZG9uJ3QgY2FsbCBpZWVlX3BvcF91bnVzZWRfdHlwZSwgc2luY2UgdGhlIGNsYXNzIHNob3VsZAotICAgICAgICAgZ2V0IGRlZmluZWQuICAqLwotICAgICAgKHZvaWQpIGllZWVfcG9wX3R5cGUgKGluZm8pOwotICAgIH0KLQotICBpZiAoISBpZWVlX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgLyogV2Ugd3JpdGUgb3V0IHBtaXNjIHJlY29yZHMgaW50byB0aGUgY2xhc3NkZWYgZmllbGQuICBXZSB3aWxsCi0gICAgIHdyaXRlIG91dCB0aGUgcG1pc2Mgc3RhcnQgYWZ0ZXIgd2Uga25vdyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgd2UKLSAgICAgbmVlZC4gICovCi0gIGlmICghIGllZWVfaW5pdF9idWZmZXIgKGluZm8sICZwbWlzY2J1ZikKLSAgICAgIHx8ICEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmcG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmR4LCAnVCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmR4LCBzdHJ1Y3RwID8gJ28nIDogJ3UnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBpbmR4LCB0YWcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjbGFzc2RlZiA9IChzdHJ1Y3QgaWVlZV90eXBlX2NsYXNzICopIHhtYWxsb2MgKHNpemVvZiAqY2xhc3NkZWYpOwotICBtZW1zZXQgKGNsYXNzZGVmLCAwLCBzaXplb2YgKmNsYXNzZGVmKTsKLQotICBjbGFzc2RlZi0+aW5keCA9IGluZHg7Ci0gIGNsYXNzZGVmLT5wbWlzY2J1ZiA9IHBtaXNjYnVmOwotICBjbGFzc2RlZi0+cG1pc2Njb3VudCA9IDM7Ci0gIGNsYXNzZGVmLT52Y2xhc3MgPSB2Y2xhc3M7Ci0gIGNsYXNzZGVmLT5vd252cHRyID0gb3dudnB0cjsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmID0gY2xhc3NkZWY7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX3N0YXRpY19tZW1iZXIgKHAsIG5hbWUsIHBoeXNuYW1lLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gIC8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHR5cGUuICBIb3BlZnVsbHkgdGhlcmUgd2lsbCBiZSBhIGNhbGwgdG8KLSAgICAgaWVlZV92YXJpYWJsZSBkZWNsYXJpbmcgdGhlIHBoeXNpY2FsIG5hbWUgYW5kIHRoZSB0eXBlLCBzaW5jZQotICAgICB0aGF0IGlzIHdoZXJlIGFuIElFRUUgY29uc3VtZXIgbXVzdCBnZXQgdGhlIHR5cGUuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTCk7Ci0KLSAgZmxhZ3MgPSBpZWVlX3Zpc190b19mbGFncyAodmlzaWJpbGl0eSk7Ci0gIGZsYWdzIHw9IENYWEZMQUdTX1NUQVRJQzsKLQotICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2QnKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgbmFtZSkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIHBoeXNuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgYmFzZSBjbGFzcyB0byBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3NfYmFzZWNsYXNzIChwLCBiaXRwb3MsIHZpcnR1YWwsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBjb25zdCBjaGFyICpibmFtZTsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHVuc2lnbmVkIGludCBiaW5keDsKLSAgY2hhciAqZm5hbWU7Ci0gIHVuc2lnbmVkIGludCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWUgIT0gTlVMTAotCSAgJiYgaW5mby0+dHlwZV9zdGFjay0+bmV4dCAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT5uZXh0LT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmICEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZV9zdGFjay0+bmV4dC0+dHlwZS5zdHJkZWYpKTsKLQotICBibmFtZSA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUubmFtZTsKLSAgbG9jYWxwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5sb2NhbHA7Ci0gIGJpbmR4ID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogV2UgYXJlIGN1cnJlbnRseSBkZWZpbmluZyBib3RoIGEgc3RydWN0IGFuZCBhIGNsYXNzLiAgV2UgbXVzdAotICAgICB3cml0ZSBvdXQgYSBmaWVsZCBkZWZpbml0aW9uIGluIHRoZSBzdHJ1Y3Qgd2hpY2ggaG9sZHMgdGhlIGJhc2UKLSAgICAgY2xhc3MuICBUaGUgc3RhYnMgZGVidWdnaW5nIHJlYWRlciB3aWxsIGNyZWF0ZSBhIGZpZWxkIG5hbWVkCi0gICAgIF92YiRDTEFTUyBmb3IgYSB2aXJ0dWFsIGJhc2UgY2xhc3MsIHNvIHdlIGp1c3QgdXNlIHRoYXQuICBGSVhNRToKLSAgICAgd2Ugc2hvdWxkIG5vdCBkZXBlbmQgdXBvbiBhIGRldGFpbCBvZiBzdGFicyBkZWJ1Z2dpbmcuICAqLwotICBpZiAodmlydHVhbCkKLSAgICB7Ci0gICAgICBmbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYm5hbWUpICsgc2l6ZW9mICJfdmIkIik7Ci0gICAgICBzcHJpbnRmIChmbmFtZSwgIl92YiQlcyIsIGJuYW1lKTsKLSAgICAgIGZsYWdzID0gQkFTRUZMQUdTX1ZJUlRVQUw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGxvY2FscCkKLQlpbmZvLT50eXBlX3N0YWNrLT50eXBlLmxvY2FscCA9IHRydWU7Ci0KLSAgICAgIGZuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChibmFtZSkgKyBzaXplb2YgIl9iJCIpOwotICAgICAgc3ByaW50ZiAoZm5hbWUsICJfYiQlcyIsIGJuYW1lKTsKLQotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zdHJkZWYpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGZuYW1lKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBiaXRwb3MgLyA4KSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmbGFncyA9IDA7Ci0gICAgfQotCi0gIGlmICh2aXNpYmlsaXR5ID09IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURSkKLSAgICBmbGFncyB8PSBCQVNFRkxBR1NfUFJJVkFURTsKLQotICBuaW5keCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPmluZHg7Ci0KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+cG1pc2NidWYpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgJ2InKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIGZsYWdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2F0bjY1IChpbmZvLCBuaW5keCwgYm5hbWUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGZuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjY291bnQgKz0gNTsKLQotICBmcmVlIChmbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGJ1aWxkaW5nIGEgbWV0aG9kIGZvciBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3Nfc3RhcnRfbWV0aG9kIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCA9PSBOVUxMKTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgPSBuYW1lOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZWZpbmUgYSBuZXcgbWV0aG9kIHZhcmlhbnQsIGVpdGhlciBzdGF0aWMgb3Igbm90LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIHN0YXRpY3AsIGNvbnN0cCwKLQkJICAgICAgIHZvbGF0aWxlcCwgdm9mZnNldCwgY29udGV4dCkKLSAgICAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gc3RhdGljcDsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dDsKLXsKLSAgdW5zaWduZWQgaW50IGZsYWdzOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0gIGJvb2xlYW4gdmlydHVhbDsKLQotICAvKiBXZSBkb24ndCBuZWVkIHRoZSB0eXBlIG9mIHRoZSBtZXRob2QuICBBbiBJRUVFIGNvbnN1bWVyIHdoaWNoCi0gICAgIHdhbnRzIHRoZSB0eXBlIG11c3QgdHJhY2sgZG93biB0aGUgZnVuY3Rpb24gYnkgdGhlIHBoeXNpY2FsIG5hbWUKLSAgICAgYW5kIGdldCB0aGUgdHlwZSBmcm9tIHRoYXQuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0KLSAgLyogV2UgZG9uJ3QgdXNlIHRoZSBjb250ZXh0LiAgRklYTUU6IFdlIHByb2JhYmx5IG91Z2h0IHRvIHVzZSBpdCB0bwotICAgICBhZGp1c3QgdGhlIHZvZmZzZXQgc29tZWhvdywgYnV0IEkgZG9uJ3QgcmVhbGx5IGtub3cgaG93LiAgKi8KLSAgaWYgKGNvbnRleHQpCi0gICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCAhPSBOVUxMKTsKLQotICBmbGFncyA9IGllZWVfdmlzX3RvX2ZsYWdzICh2aXNpYmlsaXR5KTsKLQotICAvKiBGSVhNRTogV2UgbmV2ZXIgc2V0IENYWEZMQUdTX09WRVJSSURFLCBDWFhGTEFHU19PUEVSQVRPUiwKLSAgICAgQ1hYRkxBR1NfQ1RPUkRUT1IsIENYWEZMQUdTX0NUT1IsIG9yIENYWEZMQUdTX0lOTElORS4gICovCi0KLSAgaWYgKHN0YXRpY3ApCi0gICAgZmxhZ3MgfD0gQ1hYRkxBR1NfU1RBVElDOwotICBpZiAoY29uc3RwKQotICAgIGZsYWdzIHw9IENYWEZMQUdTX0NPTlNUOwotICBpZiAodm9sYXRpbGVwKQotICAgIGZsYWdzIHw9IENYWEZMQUdTX1ZPTEFUSUxFOwotCi0gIG5pbmR4ID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+aW5keDsKLQotICB2aXJ0dWFsID0gY29udGV4dCB8fCB2b2Zmc2V0ID4gMDsKLQotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sCi0JCQkgICAgJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnBtaXNjYnVmKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIHZpcnR1YWwgPyAndicgOiAnbScpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZmxhZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LAotCQkJICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBwaHlzbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2aXJ0dWFsKQotICAgIHsKLSAgICAgIGlmICh2b2Zmc2V0ID4gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dm9mZnNldCkKLQlpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52b2Zmc2V0ID0gdm9mZnNldDsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgdm9mZnNldCkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgKytpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50OwotICAgIH0KLQotICBpZiAoISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlZmluZSBhIG5ldyBtZXRob2QgdmFyaWFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXAsCi0JCQkgICB2b2Zmc2V0LCBjb250ZXh0KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgYm9vbGVhbiBjb250ZXh0OwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIGllZWVfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIGZhbHNlLCBjb25zdHAsCi0JCQkJdm9sYXRpbGVwLCB2b2Zmc2V0LCBjb250ZXh0KTsKLX0KLQotLyogRGVmaW5lIGEgbmV3IHN0YXRpYyBtZXRob2QgdmFyaWFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudCAocCwgcGh5c25hbWUsIHZpc2liaWxpdHksIGNvbnN0cCwgdm9sYXRpbGVwKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gaWVlZV9jbGFzc19tZXRob2RfdmFyIChpbmZvLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgdHJ1ZSwgY29uc3RwLAotCQkJCXZvbGF0aWxlcCwgMCwgZmFsc2UpOwotfQotCi0vKiBGaW5pc2ggdXAgYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9jbGFzc19lbmRfbWV0aG9kIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjayAhPSBOVUxMCi0JICAmJiBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm1ldGhvZCAhPSBOVUxMKTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5tZXRob2QgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2VuZF9jbGFzc190eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwKLQkgICYmIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYgIT0gTlVMTCk7Ci0KLSAgLyogSWYgd2Ugd2VyZSBpZ25vcmluZyB0aGlzIGNsYXNzIGRlZmluaXRpb24gYmVjYXVzZSBpdCB3YXMgYQotICAgICBkdXBsaWNhdGUgZGVmaW5pdGlvbiwganVzdCB0aHJvdWdoIGF3YXkgd2hhdGV2ZXIgYnl0ZXMgd2UgaGF2ZQotICAgICBhY2N1bXVsYXRlZC4gIExlYXZlIHRoZSB0eXBlIG9uIHRoZSBzdGFjay4gICovCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmlnbm9yZXApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgbmluZHggPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5pbmR4OwotCi0gIC8qIElmIHdlIGhhdmUgYSB2aXJ0dWFsIHRhYmxlLCB3ZSBjYW4gd3JpdGUgb3V0IHRoZSBpbmZvcm1hdGlvbiBub3cuICAqLwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dHlwZS5jbGFzc2RlZi0+dmNsYXNzICE9IE5VTEwKLSAgICAgIHx8IGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPm93bnZwdHIpCi0gICAgewotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLAotCQkJCSZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAneicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCAiIikKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LAotCQkJICAgICAgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnZvZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5vd252cHRyKQotCXsKLQkgIGlmICghIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsCi0JCQkJICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT52Y2xhc3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50ICs9IDU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGF0IHdlIGtub3cgdGhlIG51bWJlciBvZiBwbWlzYyByZWNvcmRzLCB3ZSBjYW4gd3JpdGUgb3V0Ci0gICAgIHRoZSBhdG42MiB3aGljaCBzdGFydHMgdGhlIHBtaXNjIHJlY29yZHMsIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUKLSAgICAgQysrIGJ1ZmZlcnMuICAqLwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPmN4eCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIG5pbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikKLSAgICAgIHx8ICEgaWVlZV93cml0ZV8yYnl0ZXMgKGluZm8sIChpbnQpIGllZWVfYXRuX3JlY29yZF9lbnVtKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgNjIpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA4MCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sCi0JCQkgICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2NvdW50KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4LAotCQkJICAgICZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5wbWlzY2J1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT50eXBlX3N0YWNrLT50eXBlLmNsYXNzZGVmLT5yZWZzKSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX2FwcGVuZF9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgsCi0JCQkJJmluZm8tPnR5cGVfc3RhY2stPnR5cGUuY2xhc3NkZWYtPnJlZnMpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGllZWVfZW5kX3N0cnVjdF90eXBlIChwKTsKLX0KLQotLyogUHVzaCBhIHByZXZpb3VzbHkgc2VlbiB0eXBlZGVmIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90eXBlZGVmX3R5cGUgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIGggPSBpZWVlX25hbWVfdHlwZV9oYXNoX2xvb2t1cCAoJmluZm8tPnR5cGVkZWZzLCBuYW1lLCBmYWxzZSwgZmFsc2UpOwotCi0gIC8qIGggc2hvdWxkIG5ldmVyIGJlIE5VTEwsIHNpbmNlIHRoYXQgd291bGQgaW1wbHkgdGhhdCB0aGUgZ2VuZXJpYwotICAgICBkZWJ1Z2dpbmcgY29kZSBoYXMgYXNrZWQgZm9yIGEgdHlwZWRlZiB3aGljaCBpdCBoYXMgbm90IHlldAotICAgICBkZWZpbmVkLiAgKi8KLSAgYXNzZXJ0IChoICE9IE5VTEwpOwotCi0gIC8qIFdlIGFsd2F5cyB1c2UgdGhlIG1vc3QgcmVjZW50bHkgZGVmaW5lZCB0eXBlIGZvciB0aGlzIG5hbWUsIHdoaWNoCi0gICAgIHdpbGwgYmUgdGhlIGZpcnN0IG9uZSBvbiB0aGUgbGlzdC4gICovCi0KLSAgbnQgPSBoLT50eXBlczsKLSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG50LT50eXBlLmluZHgsIG50LT50eXBlLnNpemUsCi0JCQludC0+dHlwZS51bnNpZ25lZHAsIG50LT50eXBlLmxvY2FscCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENvcHkgb3ZlciBhbnkgb3RoZXIgdHlwZSBpbmZvcm1hdGlvbiB3ZSBtYXkgaGF2ZS4gICovCi0gIGluZm8tPnR5cGVfc3RhY2stPnR5cGUgPSBudC0+dHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHRhZ2dlZCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90YWdfdHlwZSAocCwgbmFtZSwgaWQsIGtpbmQpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIGJvb2xlYW4gY29weTsKLSAgY2hhciBhYlsyMF07Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIGlmIChraW5kID09IERFQlVHX0tJTkRfRU5VTSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKmU7Ci0KLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JYWJvcnQgKCk7Ci0gICAgICBmb3IgKGUgPSBpbmZvLT5lbnVtczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLQlpZiAoZS0+dGFnICE9IE5VTEwgJiYgc3RyY21wIChlLT50YWcsIG5hbWUpID09IDApCi0JICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGUtPmluZHgsIDAsIHRydWUsIGZhbHNlKTsKLQotICAgICAgZSA9IChzdHJ1Y3QgaWVlZV9kZWZpbmVkX2VudW0gKikgeG1hbGxvYyAoc2l6ZW9mICplKTsKLSAgICAgIG1lbXNldCAoZSwgMCwgc2l6ZW9mICplKTsKLQotICAgICAgZS0+aW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgICAgICsraW5mby0+dHlwZV9pbmR4OwotICAgICAgZS0+dGFnID0gbmFtZTsKLSAgICAgIGUtPmRlZmluZWQgPSBmYWxzZTsKLQotICAgICAgZS0+bmV4dCA9IGluZm8tPmVudW1zOwotICAgICAgaW5mby0+ZW51bXMgPSBlOwotCi0gICAgICByZXR1cm4gaWVlZV9wdXNoX3R5cGUgKGluZm8sIGUtPmluZHgsIDAsIHRydWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgbG9jYWxwID0gZmFsc2U7Ci0KLSAgY29weSA9IGZhbHNlOwotICBpZiAobmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHNwcmludGYgKGFiLCAiX19hbm9uJXUiLCBpZCk7Ci0gICAgICBuYW1lID0gYWI7Ci0gICAgICBjb3B5ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaCA9IGllZWVfbmFtZV90eXBlX2hhc2hfbG9va3VwICgmaW5mby0+dGFncywgbmFtZSwgdHJ1ZSwgY29weSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAobnQgPSBoLT50eXBlczsgbnQgIT0gTlVMTDsgbnQgPSBudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobnQtPmlkID09IGlkKQotCXsKLQkgIGlmICghIGllZWVfcHVzaF90eXBlIChpbmZvLCBudC0+dHlwZS5pbmR4LCBudC0+dHlwZS5zaXplLAotCQkJCW50LT50eXBlLnVuc2lnbmVkcCwgbnQtPnR5cGUubG9jYWxwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgLyogQ29weSBvdmVyIGFueSBvdGhlciB0eXBlIGluZm9ybWF0aW9uIHdlIG1heSBoYXZlLiAgKi8KLQkgIGluZm8tPnR5cGVfc3RhY2stPnR5cGUgPSBudC0+dHlwZTsKLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgaWYgKCEgbnQtPnR5cGUubG9jYWxwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgYSBnbG9iYWwgdHlwZSwgc28gaXQgbXVzdCBiZQotICAgICAgICAgICAgIGxvY2FsLiAqLwotCSAgbG9jYWxwID0gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gIG50ID0gKHN0cnVjdCBpZWVlX25hbWVfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKm50KTsKLSAgbWVtc2V0IChudCwgMCwgc2l6ZW9mICpudCk7Ci0KLSAgbnQtPmlkID0gaWQ7Ci0gIG50LT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLSAgbnQtPnR5cGUuaW5keCA9IGluZm8tPnR5cGVfaW5keDsKLSAgbnQtPnR5cGUubG9jYWxwID0gbG9jYWxwOwotICArK2luZm8tPnR5cGVfaW5keDsKLSAgbnQtPmtpbmQgPSBraW5kOwotCi0gIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gIGgtPnR5cGVzID0gbnQ7Ci0KLSAgaWYgKCEgaWVlZV9wdXNoX3R5cGUgKGluZm8sIG50LT50eXBlLmluZHgsIDAsIGZhbHNlLCBsb2NhbHApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLm5hbWUgPSBoLT5yb290LnN0cmluZzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWRlZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3R5cGRlZiAocCwgbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgc3RydWN0IGllZWVfd3JpdGVfdHlwZSB0eXBlOwotICB1bnNpZ25lZCBpbnQgaW5keDsKLSAgYm9vbGVhbiBmb3VuZDsKLSAgYm9vbGVhbiBsb2NhbHA7Ci0gIHN0cnVjdCBpZWVlX25hbWVfdHlwZV9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKm50OwotCi0gIHR5cGUgPSBpbmZvLT50eXBlX3N0YWNrLT50eXBlOwotICBpbmR4ID0gdHlwZS5pbmR4OwotCi0gIC8qIElmIHRoaXMgaXMgYSBzaW1wbGUgYnVpbHRpbiB0eXBlIHVzaW5nIGEgYnVpbHRpbiBuYW1lLCB3ZSBkb24ndAotICAgICB3YW50IHRvIG91dHB1dCB0aGUgdHlwZWRlZiBpdHNlbGYuICBXZSBhbHNvIHdhbnQgdG8gY2hhbmdlIHRoZQotICAgICB0eXBlIGluZGV4IHRvIGNvcnJlc3BvbmQgdG8gdGhlIG5hbWUgYmVpbmcgdXNlZC4gIFdlIHJlY29nbml6ZQotICAgICBuYW1lcyB1c2VkIGluIHN0YWJzIGRlYnVnZ2luZyBvdXRwdXQgZXZlbiBpZiB0aGV5IGRvbid0IGV4YWN0bHkKLSAgICAgY29ycmVzcG9uZCB0byB0aGUgbmFtZXMgdXNlZCBmb3IgdGhlIElFRUUgYnVpbHRpbiB0eXBlcy4gICovCi0gIGZvdW5kID0gZmFsc2U7Ci0gIGlmIChpbmR4IDw9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fYmNkX2Zsb2F0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoKGVudW0gYnVpbHRpbl90eXBlcykgaW5keCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3ZvaWQ6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAidm9pZCIpID09IDApCi0JICAgIGZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3NpZ25lZF9jaGFyOgotCWNhc2UgYnVpbHRpbl9jaGFyOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBjaGFyIikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3NpZ25lZF9jaGFyOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiY2hhciIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9jaGFyOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfY2hhcjoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJ1bnNpZ25lZCBjaGFyIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDoKLQljYXNlIGJ1aWx0aW5fc2hvcnQ6Ci0JY2FzZSBidWlsdGluX3Nob3J0X2ludDoKLQljYXNlIGJ1aWx0aW5fc2lnbmVkX3Nob3J0OgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBzaG9ydCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9ICh1bnNpZ25lZCBpbnQpIGJ1aWx0aW5fc2lnbmVkX3Nob3J0X2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNob3J0IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3Nob3J0OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAic2hvcnQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSAodW5zaWduZWQgaW50KSBidWlsdGluX3Nob3J0X2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInNpZ25lZCBzaG9ydCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gKHVuc2lnbmVkIGludCkgYnVpbHRpbl9zaWduZWRfc2hvcnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9zaG9ydF9pbnQ6Ci0JY2FzZSBidWlsdGluX3Vuc2lnbmVkX3Nob3J0OgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIHNob3J0IGludCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJzaG9ydCB1bnNpZ25lZCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfc2hvcnRfaW50OwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgc2hvcnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfc2hvcnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9zaWduZWRfbG9uZzoKLQljYXNlIGJ1aWx0aW5faW50OiAvKiBGSVhNRTogU2l6ZSBkZXBlbmRzIHVwb24gYXJjaGl0ZWN0dXJlLiAgKi8KLQljYXNlIGJ1aWx0aW5fbG9uZzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICJzaWduZWQgbG9uZyIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9zaWduZWRfbG9uZzsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9pbnQ7Ci0JICAgICAgZm91bmQgPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJsb25nIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGludCIpID09IDApCi0JICAgIHsKLQkgICAgICBpbmR4ID0gYnVpbHRpbl9sb25nOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZzoKLQljYXNlIGJ1aWx0aW5fdW5zaWduZWQ6IC8qIEZJWE1FOiBTaXplIGRlcGVuZHMgdXBvbiBhcmNoaXRlY3R1cmUuICAqLwotCWNhc2UgYnVpbHRpbl91bnNpZ25lZF9pbnQ6IC8qIEZJWE1FOiBMaWtlIGJ1aWx0aW5fdW5zaWduZWQuICAqLwotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGxvbmciKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChuYW1lLCAibG9uZyB1bnNpZ25lZCBpbnQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaW5keCA9IGJ1aWx0aW5fdW5zaWduZWRfbG9uZzsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkOwotCSAgICAgIGZvdW5kID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAidW5zaWduZWQgaW50IikgPT0gMCkKLQkgICAgewotCSAgICAgIGluZHggPSBidWlsdGluX3Vuc2lnbmVkX2ludDsKLQkgICAgICBmb3VuZCA9IHRydWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBidWlsdGluX3NpZ25lZF9sb25nX2xvbmc6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAic2lnbmVkIGxvbmcgbG9uZyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGxvbmcgaW50IikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fdW5zaWduZWRfbG9uZ19sb25nOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgInVuc2lnbmVkIGxvbmcgbG9uZyIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKG5hbWUsICJsb25nIGxvbmcgdW5zaWduZWQgaW50IikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fZmxvYXQ6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiZmxvYXQiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9kb3VibGU6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiZG91YmxlIikgPT0gMCkKLQkgICAgZm91bmQgPSB0cnVlOwotCSAgYnJlYWs7Ci0KLQljYXNlIGJ1aWx0aW5fbG9uZ19kb3VibGU6Ci0JICBpZiAoc3RyY21wIChuYW1lLCAibG9uZyBkb3VibGUiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgYnVpbHRpbl9sb25nX2xvbmdfZG91YmxlOgotCSAgaWYgKHN0cmNtcCAobmFtZSwgImxvbmcgbG9uZyBkb3VibGUiKSA9PSAwKQotCSAgICBmb3VuZCA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChmb3VuZCkKLQl0eXBlLmluZHggPSBpbmR4OwotICAgIH0KLQotICBoID0gaWVlZV9uYW1lX3R5cGVfaGFzaF9sb29rdXAgKCZpbmZvLT50eXBlZGVmcywgbmFtZSwgdHJ1ZSwgZmFsc2UpOwotICBpZiAoaCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGRlZmluZWQgdGhpcyB0eXBlIHdpdGggdGhpcyBuYW1lLiAgKi8KLSAgbG9jYWxwID0gdHlwZS5sb2NhbHA7Ci0gIGZvciAobnQgPSBoLT50eXBlczsgbnQgIT0gTlVMTDsgbnQgPSBudC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobnQtPmlkID09IGluZHgpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIGdsb2JhbCBkZWZpbml0aW9uLCB0aGVuIHdlIGRvbid0IG5lZWQgdG8KLQkgICAgIGRvIGFueXRoaW5nIGhlcmUuICAqLwotCSAgaWYgKCEgbnQtPnR5cGUubG9jYWxwKQotCSAgICB7Ci0JICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotCSAgICAgIHJldHVybiB0cnVlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgZGVmaW5pdGlvbiwgc28gbWFrZSB0aGlzIG9uZSBsb2NhbC4gICovCi0JICBsb2NhbHAgPSB0cnVlOwotCX0KLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBhZGQgYSBuZXcgdHlwZWRlZiBmb3IgdGhpcyB0eXBlLiAgKi8KLQotICBudCA9IChzdHJ1Y3QgaWVlZV9uYW1lX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICpudCk7Ci0gIG1lbXNldCAobnQsIDAsIHNpemVvZiAqbnQpOwotICBudC0+aWQgPSBpbmR4OwotICBudC0+dHlwZSA9IHR5cGU7Ci0gIG50LT50eXBlLm5hbWUgPSBuYW1lOwotICBudC0+dHlwZS5sb2NhbHAgPSBsb2NhbHA7Ci0gIG50LT5raW5kID0gREVCVUdfS0lORF9JTExFR0FMOwotCi0gIG50LT5uZXh0ID0gaC0+dHlwZXM7Ci0gIGgtPnR5cGVzID0gbnQ7Ci0KLSAgaWYgKGZvdW5kKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgb25lIG9mIHRoZSBidWlsdGluIHR5cGVkZWZzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgICAgICBhY3R1YWxseSBkZWZpbmUgaXQuICAqLwotICAgICAgaWVlZV9wb3BfdW51c2VkX3R5cGUgKGluZm8pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBpZWVlX2RlZmluZV9uYW1lZF90eXBlIChpbmZvLCBuYW1lLCAodW5zaWduZWQgaW50KSAtMSwgdHlwZS5zaXplLAotCQkJCXR5cGUudW5zaWduZWRwLAlsb2NhbHAsCi0JCQkJKHN0cnVjdCBpZWVlX2J1Zmxpc3QgKikgTlVMTCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sICdUJykKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZHgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBSZW1vdmUgdGhlIHR5cGUgd2UganVzdCBhZGRlZCB0byB0aGUgdHlwZSBzdGFjay4gIFRoaXMgc2hvdWxkIG5vdAotICAgICBiZSBpZWVlX3BvcF91bnVzZWRfdHlwZSwgc2luY2UgdGhlIHR5cGUgaXMgdXNlZCwgd2UganVzdCBkb24ndAotICAgICBuZWVkIGl0IG5vdy4gICovCi0gICh2b2lkKSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdGFnIGZvciBhIHR5cGUuICBXZSBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV90YWcgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogVGhpcyBzaG91bGQgbm90IGJlIGllZWVfcG9wX3VudXNlZF90eXBlLCBzaW5jZSB3ZSB3YW50IHRoZSB0eXBlCi0gICAgIHRvIGJlIGRlZmluZWQuICAqLwotICAodm9pZCkgaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYW4gaW50ZWdlciBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX2ludF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIC8qIEZJWE1FLiAgKi8KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE91dHB1dCBhIHR5cGVkIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfdHlwZWRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUUuICAqLwotICBpZWVlX3BvcF91bnVzZWRfdHlwZSAoaW5mbyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pZWVlX3ZhcmlhYmxlIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0gIHVuc2lnbmVkIGludCBuYW1lX2luZHg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBib29sZWFuIHJlZmVyZW5jZXA7Ci0gIHVuc2lnbmVkIGludCB0eXBlX2luZHg7Ci0gIGJvb2xlYW4gYXNuOwotICBpbnQgcmVmZmxhZzsKLQotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5zaXplOwotICByZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOwotICB0eXBlX2luZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBhc3NlcnQgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dmFycykpOwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICArK2luZm8tPm5hbWVfaW5keDsKLQotICAvKiBXcml0ZSBvdXQgYW4gTk4gYW5kIGFuIEFUTiByZWNvcmQgZm9yIHRoaXMgdmFyaWFibGUuICAqLwotICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmFtZV9pbmR4KQotICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotICAgICAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuYW1lX2luZHgpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCB0eXBlX2luZHgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBERUJVR19HTE9CQUw6Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgOCkKLQkgIHx8ICEgaWVlZV9hZGRfcmFuZ2UgKGluZm8sIGZhbHNlLCB2YWwsIHZhbCArIHNpemUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIHJlZmZsYWcgPSAwOwotICAgICAgYXNuID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfU1RBVElDOgotICAgICAgaWYgKCEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDMpCi0JICB8fCAhIGllZWVfYWRkX3JhbmdlIChpbmZvLCBmYWxzZSwgdmFsLCB2YWwgKyBzaXplKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMTsKLSAgICAgIGFzbiA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0xPQ0FMX1NUQVRJQzoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAzKQotCSAgfHwgISBpZWVlX2FkZF9yYW5nZSAoaW5mbywgZmFsc2UsIHZhbCwgdmFsICsgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgcmVmZmxhZyA9IDI7Ci0gICAgICBhc24gPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19MT0NBTDoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAxKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdmFsKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMjsKLSAgICAgIGFzbiA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19SRUdJU1RFUjoKLSAgICAgIGlmICghIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAyKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywKLQkJCQkgIGllZWVfZ2VucmVnX3RvX3JlZ25vIChpbmZvLT5hYmZkLCB2YWwpKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICByZWZmbGFnID0gMjsKLSAgICAgIGFzbiA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChhc24pCi0gICAgewotICAgICAgaWYgKCEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5hbWVfaW5keCwgdmFsKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgcmVhbGx5IGEgcmVmZXJlbmNlIHR5cGUsIHRoZW4gd2UganVzdCBvdXRwdXQgaXQgd2l0aAotICAgICBwb2ludGVyIHR5cGUsIGFuZCBtdXN0IG5vdyBvdXRwdXQgYSBDKysgcmVjb3JkIGluZGljYXRpbmcgdGhhdCBpdAotICAgICBpcyByZWFsbHkgcmVmZXJlbmNlIHR5cGUuICAqLwotICBpZiAocmVmZXJlbmNlcCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbmluZHg7Ci0KLSAgICAgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgdmFyaWFibGUsIHdlIHdhbnQgdG8gb3V0cHV0IHRoZSBtaXNjCi0gICAgICAgICByZWNvcmQgaW4gdGhlIEMrKyBtaXNjIHJlY29yZCBibG9jay4gIE90aGVyd2lzZSwgd2Ugd2FudCB0bwotICAgICAgICAgb3V0cHV0IGl0IGp1c3QgYWZ0ZXIgdGhlIHZhcmlhYmxlIGRlZmluaXRpb24sIHdoaWNoIGlzIHdoZXJlCi0gICAgICAgICB0aGUgY3VycmVudCBidWZmZXIgaXMuICAqLwotICAgICAgaWYgKHJlZmZsYWcgIT0gMikKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5jeHgpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnUicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgcmVmZmxhZykKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9mdW5jdGlvbiAocCwgbmFtZSwgZ2xvYmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBnbG9iYWw7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiByZWZlcmVuY2VwOwotICB1bnNpZ25lZCBpbnQgcmV0aW5keCwgdHlwZWluZHg7Ci0KLSAgcmVmZXJlbmNlcCA9IGluZm8tPnR5cGVfc3RhY2stPnR5cGUucmVmZXJlbmNlcDsKLSAgcmV0aW5keCA9IGllZWVfcG9wX3R5cGUgKGluZm8pOwotCi0gIC8qIEJlc2lkZXMgcmVjb3JkaW5nIGEgQkI0IG9yIEJCNiBibG9jaywgd2UgcmVjb3JkIHRoZSB0eXBlIG9mIHRoZQotICAgICBmdW5jdGlvbiBpbiB0aGUgQkIxIHR5cGVkZWYgYmxvY2suICBXZSBjYW4ndCB3cml0ZSBvdXQgdGhlIGZ1bGwKLSAgICAgdHlwZSB1bnRpbCB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBwYXJhbWV0ZXJzLCBzbyB3ZSBhY2N1bXVsYXRlIGl0Ci0gICAgIGluIGluZm8tPmZudHlwZSBhbmQgaW5mby0+Zm5hcmdzLiAgKi8KLSAgaWYgKCEgaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+Zm50eXBlKSkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhpcyBtaWdodCBoYXBwZW4gc29tZWRheSBpZiB3ZSBzdXBwb3J0IG5lc3RlZAotICAgICAgICAgZnVuY3Rpb25zLiAgKi8KLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpbmZvLT5mbm5hbWUgPSBuYW1lOwotCi0gIC8qIEFuIGF0dHJpYnV0ZSBvZiAweDQwIG1lYW5zIHRoYXQgdGhlIHB1c2ggbWFzayBpcyB1bmtub3duLiAgKi8KLSAgaWYgKCEgaWVlZV9kZWZpbmVfbmFtZWRfdHlwZSAoaW5mbywgbmFtZSwgKHVuc2lnbmVkIGludCkgLTEsIDAsIGZhbHNlLCB0cnVlLAotCQkJCSZpbmZvLT5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAneCcpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAweDQwKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCByZXRpbmR4KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdHlwZWluZHggPSBpZWVlX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoISBpZWVlX2luaXRfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGluZm8tPmZuYXJnY291bnQgPSAwOwotCi0gIC8qIElmIHRoZSBmdW5jdGlvbiByZXR1cm4gdmFsdWUgaXMgYWN0dWFsbHkgYSByZWZlcmVuY2UgdHlwZSwgd2UKLSAgICAgbXVzdCBhZGQgYSByZWNvcmQgaW5kaWNhdGluZyB0aGF0LiAgKi8KLSAgaWYgKHJlZmVyZW5jZXApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG5pbmR4OwotCi0gICAgICBuaW5keCA9IGluZm8tPm5hbWVfaW5keDsKLSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotICAgICAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Y3h4KQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMykKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAnUicpCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgZ2xvYmFsID8gMCA6IDEpCi0JICB8fCAhIGllZWVfd3JpdGVfYXRuNjUgKGluZm8sIG5pbmR4LCBuYW1lKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGFzc2VydCAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT52YXJzKSk7Ci0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBUaGUgYWRkcmVzcyBpcyB3cml0dGVuIG91dCBhcyB0aGUgZmlyc3QgYmxvY2suICAqLwotCi0gICsraW5mby0+YmxvY2tfZGVwdGg7Ci0KLSAgcmV0dXJuIChpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICAmJiBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIGdsb2JhbCA/IDQgOiA2KQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAmJiBpZWVlX3dyaXRlX2lkIChpbmZvLCBuYW1lKQotCSAgJiYgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAmJiBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgdHlwZWluZHgpKTsKLX0KLQotLyogQWRkIGEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlIGNhbGxlZCBiZWZvcmUgdGhlCi0gICBmaXJzdCBibG9jaywgc28gd2UgcG9zdHBvbmUgdGhlbSB1bnRpbCB3ZSBzZWUgdGhlIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZnVuY3Rpb25fcGFyYW1ldGVyIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3QgaWVlZV9wZW5kaW5nX3Bhcm0gKm0sICoqcG07Ci0KLSAgYXNzZXJ0IChpbmZvLT5ibG9ja19kZXB0aCA9PSAxKTsKLQotICBtID0gKHN0cnVjdCBpZWVlX3BlbmRpbmdfcGFybSAqKSB4bWFsbG9jIChzaXplb2YgKm0pOwotICBtZW1zZXQgKG0sIDAsIHNpemVvZiAqbSk7Ci0KLSAgbS0+bmV4dCA9IE5VTEw7Ci0gIG0tPm5hbWUgPSBuYW1lOwotICBtLT5yZWZlcmVuY2VwID0gaW5mby0+dHlwZV9zdGFjay0+dHlwZS5yZWZlcmVuY2VwOwotICBtLT50eXBlID0gaWVlZV9wb3BfdHlwZSAoaW5mbyk7Ci0gIG0tPmtpbmQgPSBraW5kOwotICBtLT52YWwgPSB2YWw7Ci0KLSAgZm9yIChwbSA9ICZpbmZvLT5wZW5kaW5nX3Bhcm1zOyAqcG0gIT0gTlVMTDsgcG0gPSAmKCpwbSktPm5leHQpCi0gICAgOwotICAqcG0gPSBtOwotCi0gIC8qIEFkZCB0aGUgdHlwZSB0byB0aGUgZm5hcmdzIGxpc3QuICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5mbmFyZ3MpCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBtLT50eXBlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICsraW5mby0+Zm5hcmdjb3VudDsKLQotICByZXR1cm4gdHJ1ZTsgIAotfQotCi0vKiBPdXRwdXQgcGVuZGluZyBmdW5jdGlvbiBwYXJhbWV0ZXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfb3V0cHV0X3BlbmRpbmdfcGFybXMgKGluZm8pCi0gICAgIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICptOwotICB1bnNpZ25lZCBpbnQgcmVmY291bnQ7Ci0KLSAgcmVmY291bnQgPSAwOwotICBmb3IgKG0gPSBpbmZvLT5wZW5kaW5nX3Bhcm1zOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KQotICAgIHsKLSAgICAgIGVudW0gZGVidWdfdmFyX2tpbmQgdmtpbmQ7Ci0KLSAgICAgIHN3aXRjaCAobS0+a2luZCkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgcmV0dXJuIGZhbHNlOwotCWNhc2UgREVCVUdfUEFSTV9TVEFDSzoKLQljYXNlIERFQlVHX1BBUk1fUkVGRVJFTkNFOgotCSAgdmtpbmQgPSBERUJVR19MT0NBTDsKLQkgIGJyZWFrOwotCWNhc2UgREVCVUdfUEFSTV9SRUc6Ci0JY2FzZSBERUJVR19QQVJNX1JFRl9SRUc6Ci0JICB2a2luZCA9IERFQlVHX1JFR0lTVEVSOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3B1c2hfdHlwZSAoaW5mbywgbS0+dHlwZSwgMCwgZmFsc2UsIGZhbHNlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT50eXBlLnJlZmVyZW5jZXAgPSBtLT5yZWZlcmVuY2VwOwotICAgICAgaWYgKG0tPnJlZmVyZW5jZXApCi0JKytyZWZjb3VudDsKLSAgICAgIGlmICghIGllZWVfdmFyaWFibGUgKChQVFIpIGluZm8sIG0tPm5hbWUsIHZraW5kLCBtLT52YWwpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlcmUgYXJlIGFueSByZWZlcmVuY2UgcGFyYW1ldGVycywgd2UgbmVlZCB0byBvdXRwdXQgYQotICAgICBtaXNjZWxsYW5lb3VzIHJlY29yZCBpbmRpY2F0aW5nIHRoZW0uICAqLwotICBpZiAocmVmY291bnQgPiAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBuaW5keCwgdmFyaW5keDsKLQotICAgICAgLyogRklYTUU6IFRoZSBNUkkgY29tcGlsZXIgb3V0cHV0cyB0aGUgZGVtYW5nbGVkIGZ1bmN0aW9uIG5hbWUKLSAgICAgICAgIGhlcmUsIGJ1dCB3ZSBhcmUgb3V0cHV0dGluZyB0aGUgbWFuZ2xlZCBuYW1lLiAgKi8KLSAgICAgIG5pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotICAgICAgKytpbmZvLT5uYW1lX2luZHg7Ci0gICAgICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgbmluZHgpCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKQotCSAgfHwgISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBuaW5keCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCA2MikKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDgwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgcmVmY291bnQgKyAzKQotCSAgfHwgISBpZWVlX3dyaXRlX2FzbiAoaW5mbywgbmluZHgsICdCJykKLQkgIHx8ICEgaWVlZV93cml0ZV9hdG42NSAoaW5mbywgbmluZHgsIGluZm8tPmZubmFtZSkKLQkgIHx8ICEgaWVlZV93cml0ZV9hc24gKGluZm8sIG5pbmR4LCAwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBmb3IgKG0gPSBpbmZvLT5wZW5kaW5nX3Bhcm1zLCB2YXJpbmR4ID0gMTsKLQkgICBtICE9IE5VTEw7Ci0JICAgbSA9IG0tPm5leHQsIHZhcmluZHgrKykKLQl7Ci0JICBpZiAobS0+cmVmZXJlbmNlcCkKLQkgICAgewotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYXNuIChpbmZvLCBuaW5keCwgdmFyaW5keCkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgbSA9IGluZm8tPnBlbmRpbmdfcGFybXM7Ci0gIHdoaWxlIChtICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IGllZWVfcGVuZGluZ19wYXJtICpuZXh0OwotCi0gICAgICBuZXh0ID0gbS0+bmV4dDsKLSAgICAgIGZyZWUgKG0pOwotICAgICAgbSA9IG5leHQ7Ci0gICAgfQotCi0gIGluZm8tPnBlbmRpbmdfcGFybXMgPSBOVUxMOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGJsb2NrLiAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgYmxvY2ssIHdlIG91dHB1dCB0aGUgYWRkcmVzcwotICAgdG8gZmluaXNoIHRoZSBCQjQgb3IgQkI2LCBhbmQgdGhlbiBvdXRwdXQgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9zdGFydF9ibG9jayAocCwgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IGllZWVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBpZWVlX2hhbmRsZSAqKSBwOwotCi0gIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnZhcnMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaW5mby0+YmxvY2tfZGVwdGggPT0gMSkKLSAgICB7Ci0gICAgICBpZiAoISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgYWRkcikKLQkgIHx8ICEgaWVlZV9vdXRwdXRfcGVuZGluZ19wYXJtcyAoaW5mbykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA2KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgIiIpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGFkZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9zdGFydF9yYW5nZSAoaW5mbywgYWRkcikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICsraW5mby0+YmxvY2tfZGVwdGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEVuZCBhIGJsb2NrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgd2UgYXJlIGdpdmVuIGlzIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBidXQgSUVFRSBzZWVtcwotICAgICB0byB3YW50IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBsYXN0IGJ5dGUgaW4gdGhlIGJsb2NrLCBzbyB3ZQotICAgICBzdWJ0cmFjdCBvbmUuICAqLwotICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT52YXJzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmVfcmVjb3JkX2VudW0pCi0gICAgICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBhZGRyIC0gMSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGllZWVfZW5kX3JhbmdlIChpbmZvLCBhZGRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLS1pbmZvLT5ibG9ja19kZXB0aDsKLQotICBpZiAoYWRkciA+IGluZm8tPmhpZ2hhZGRyKQotICAgIGluZm8tPmhpZ2hhZGRyID0gYWRkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaWVlZV9lbmRfZnVuY3Rpb24gKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgaWVlZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IGllZWVfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5ibG9ja19kZXB0aCA9PSAxKTsKLQotICAtLWluZm8tPmJsb2NrX2RlcHRoOwotCi0gIC8qIE5vdyB3ZSBjYW4gZmluaXNoIHVwIGZudHlwZSwgYW5kIGFkZCBpdCB0byB0aGUgdHlwZGVmIHNlY3Rpb24uCi0gICAgIEF0IHRoaXMgcG9pbnQsIGZudHlwZSBpcyB0aGUgJ3gnIHR5cGUgdXAgdG8gdGhlIGFyZ3VtZW50IGNvdW50LAotICAgICBhbmQgZm5hcmdzIGlzIHRoZSBhcmd1bWVudCB0eXBlcy4gIFdlIG11c3QgYWRkIHRoZSBhcmd1bWVudAotICAgICBjb3VudCwgYW5kIHdlIG11c3QgYWRkIHRoZSBsZXZlbC4gIEZJWE1FOiBXZSBkb24ndCByZWNvcmQgdmFyYXJncwotICAgICBmdW5jdGlvbnMgY29ycmVjdGx5LiAgSW4gZmFjdCwgc3RhYnMgZGVidWdnaW5nIGRvZXMgbm90IGdpdmUgdXMKLSAgICAgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGRvIHNvLiAgKi8KLSAgaWYgKCEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm50eXBlKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+Zm5hcmdjb3VudCkKLSAgICAgIHx8ICEgaWVlZV9jaGFuZ2VfYnVmZmVyIChpbmZvLCAmaW5mby0+Zm5hcmdzKQotICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGUgdHlwZGVmIGJsb2NrIGhhcyBiZWVuIHN0YXJ0ZWQuICAqLwotICBpZiAoaWVlZV9idWZmZXJfZW1wdHlwICgmaW5mby0+dHlwZXMpKQotICAgIHsKLSAgICAgIGlmICghIGllZWVfY2hhbmdlX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzKQotCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfYmJfcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgMSkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sIGluZm8tPm1vZG5hbWUpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgaWVlZV9hcHBlbmRfYnVmZmVyIChpbmZvLCAmaW5mby0+dHlwZXMsICZpbmZvLT5mbnR5cGUpCi0gICAgICB8fCAhIGllZWVfYXBwZW5kX2J1ZmZlciAoaW5mbywgJmluZm8tPnR5cGVzLCAmaW5mby0+Zm5hcmdzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+Zm5uYW1lID0gTlVMTDsKLSAgaWYgKCEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmZudHlwZSkKLSAgICAgIHx8ICEgaWVlZV9pbml0X2J1ZmZlciAoaW5mbywgJmluZm8tPmZuYXJncykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpbmZvLT5mbmFyZ2NvdW50ID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVjb3JkIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWllZWVfbGluZW5vIChwLCBmaWxlbmFtZSwgbGluZW5vLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGluZW5vOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBpZWVlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgaWVlZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmZpbGVuYW1lICE9IE5VTEwpOwotCi0gIC8qIFRoZSBIUCBzaW11bGF0b3Igc2VlbXMgdG8gZ2V0IGNvbmZ1c2VkIHdoZW4gbW9yZSB0aGFuIG9uZSBsaW5lIGlzCi0gICAgIGxpc3RlZCBmb3IgdGhlIHNhbWUgYWRkcmVzcywgYXQgbGVhc3QgaWYgdGhleSBhcmUgaW4gZGlmZmVyZW50Ci0gICAgIGZpbGVzLiAgV2UgaGFuZGxlIHRoaXMgYnkgYWx3YXlzIGxpc3RpbmcgdGhlIGxhc3QgbGluZSBmb3IgYQotICAgICBnaXZlbiBhZGRyZXNzLCBzaW5jZSB0aGF0IHNlZW1zIHRvIGJlIHRoZSBvbmUgdGhhdCBnZGIgdXNlcy4gICovCi0gIGlmIChpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBhZGRyICE9IGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIpCi0gICAgewotICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBsaW5lIG51bWJlciBibG9jay4gICovCi0gICAgICBpZiAoISBpZWVlX2J1ZmZlcl9lbXB0eXAgKCZpbmZvLT5saW5lbm9zKSkKLQl7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbmZvLT5saW5lbm9fbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotCSAgKytpbmZvLT5uYW1lX2luZHg7Ci0JICBpZiAoISBpZWVlX2NoYW5nZV9idWZmZXIgKGluZm8sICZpbmZvLT5saW5lbm9zKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX2JiX3JlY29yZF9lbnVtKQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCA1KQotCSAgICAgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCBpbmZvLT5maWxlbmFtZSkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9ubl9yZWNvcmQpCi0JICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKLQkgICAgICB8fCAhIGllZWVfd3JpdGVfaWQgKGluZm8sICIiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gaW5mby0+ZmlsZW5hbWU7Ci0JfQotCi0gICAgICBpZiAoc3RyY21wIChpbmZvLT5wZW5kaW5nX2xpbmVub19maWxlbmFtZSwgaW5mby0+bGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotCXsKLQkgIGlmIChzdHJjbXAgKGluZm8tPmZpbGVuYW1lLCBpbmZvLT5saW5lbm9fZmlsZW5hbWUpICE9IDApCi0JICAgIHsKLQkgICAgICAvKiBXZSB3ZXJlIG5vdCBpbiB0aGUgbWFpbiBmaWxlLiAgQ2xvc2UgdGhlIGJsb2NrIGZvciB0aGUKLQkJIGluY2x1ZGVkIGZpbGUuICAqLwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iZV9yZWNvcmRfZW51bSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoc3RyY21wIChpbmZvLT5maWxlbmFtZSwgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUpID09IDApCi0JCXsKLQkJICAvKiBXZSBuZWVkIGEgbmV3IE5OIHJlY29yZCwgYW5kIHdlIGFyZW4ndCBhYm91dCB0bwotCQkgICAgIG91dHB1dCBvbmUuICAqLwotCQkgIGluZm8tPmxpbmVub19uYW1lX2luZHggPSBpbmZvLT5uYW1lX2luZHg7Ci0JCSAgKytpbmZvLT5uYW1lX2luZHg7Ci0JCSAgaWYgKCEgaWVlZV93cml0ZV9ieXRlIChpbmZvLCAoaW50KSBpZWVlX25uX3JlY29yZCkKLQkJICAgICAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgaW5mby0+bGluZW5vX25hbWVfaW5keCkKLQkJICAgICAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JCSAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgfQotCSAgaWYgKHN0cmNtcCAoaW5mby0+ZmlsZW5hbWUsIGluZm8tPnBlbmRpbmdfbGluZW5vX2ZpbGVuYW1lKSAhPSAwKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIG5vdCBjaGFuZ2luZyB0byB0aGUgbWFpbiBmaWxlLiAgT3BlbiBhIGJsb2NrIGZvcgotCQkgdGhlIG5ldyBpbmNsdWRlZCBmaWxlLiAgKi8KLQkgICAgICBpbmZvLT5saW5lbm9fbmFtZV9pbmR4ID0gaW5mby0+bmFtZV9pbmR4OwotCSAgICAgICsraW5mby0+bmFtZV9pbmR4OwotCSAgICAgIGlmICghIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgKGludCkgaWVlZV9iYl9yZWNvcmRfZW51bSkKLQkJICB8fCAhIGllZWVfd3JpdGVfYnl0ZSAoaW5mbywgNSkKLQkJICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCAwKQotCQkgIHx8ICEgaWVlZV93cml0ZV9pZCAoaW5mbywgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2J5dGUgKGluZm8sIChpbnQpIGllZWVfbm5fcmVjb3JkKQotCQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIGluZm8tPmxpbmVub19uYW1lX2luZHgpCi0JCSAgfHwgISBpZWVlX3dyaXRlX2lkIChpbmZvLCAiIikpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaW5mby0+bGluZW5vX2ZpbGVuYW1lID0gaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWU7Ci0JfQotCi0gICAgICBpZiAoISBpZWVlX3dyaXRlXzJieXRlcyAoaW5mbywgKGludCkgaWVlZV9hdG5fcmVjb3JkX2VudW0pCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4KQotCSAgfHwgISBpZWVlX3dyaXRlX251bWJlciAoaW5mbywgMCkKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDcpCi0JICB8fCAhIGllZWVfd3JpdGVfbnVtYmVyIChpbmZvLCBpbmZvLT5wZW5kaW5nX2xpbmVubykKLQkgIHx8ICEgaWVlZV93cml0ZV9udW1iZXIgKGluZm8sIDApCi0JICB8fCAhIGllZWVfd3JpdGVfYXNuIChpbmZvLCBpbmZvLT5saW5lbm9fbmFtZV9pbmR4LAotCQkJICAgICAgIGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaW5mby0+cGVuZGluZ19saW5lbm9fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgaW5mby0+cGVuZGluZ19saW5lbm8gPSBsaW5lbm87Ci0gIGluZm8tPnBlbmRpbmdfbGluZW5vX2FkZHIgPSBhZGRyOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvaXMtcmFubGliLmMgYi9iaW51dGlscy9pcy1yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlNzJhNC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9pcy1yYW5saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogTGlua2VkIHdpdGggYXIubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdyYW5saWInIChub3QgJ2FyJykuICovCi0KLWludCBpc19yYW5saWIgPSAxOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvaXMtc3RyaXAuYyBiL2JpbnV0aWxzL2lzLXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTM0MWEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvaXMtc3RyaXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotLyogTGlua2VkIHdpdGggb2JqY29weS5vIHRvIGZsYWcgdGhhdCB0aGlzIHByb2dyYW0gaXMgJ3N0cmlwJyAobm90Ci0gICAnb2JqY29weScpLiAqLwotCi1pbnQgaXNfc3RyaXAgPSAxOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbWFjLWJpbnV0aWxzLnIgYi9iaW51dGlscy9tYWMtYmludXRpbHMucgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxYTMwMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tYWMtYmludXRpbHMucgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJlc291cmNlcyBmb3IgR05VIGJpbnV0aWxzLiAqLwotCi0jaW5jbHVkZSAiU3lzVHlwZXMuciIKLQotLyogVmVyc2lvbiByZXNvdXJjZXMuICovCi0KLXJlc291cmNlICd2ZXJzJyAoMSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKLX07Ci0KLXJlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JImJpbnV0aWxzICIgVkVSU0lPTl9TVFJJTkcgIiBmb3IgTVBXIgotfTsKLQotI2lmZGVmIFdBTlRfQ0ZSRwotCi0jaW5jbHVkZSAiQ29kZUZyYWdtZW50VHlwZXMuciIKLQotcmVzb3VyY2UgJ2NmcmcnICgwKSB7Ci0JewotCQlrUG93ZXJQQywKLQkJa0Z1bGxMaWIsCi0JCWtOb1ZlcnNpb25OdW0sIGtOb1ZlcnNpb25OdW0sCi0JCTAsMCwKLQkJa0lzQXBwLCBrT25EaXNrRmxhdCwga1plcm9PZmZzZXQsIGtXaG9sZUZvcmssCi0JCVBST0dfTkFNRQotCX0KLX07Ci0KLSNlbmRpZiAvKiBXQU5UX0NGUkcgKi8KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21ha2VmaWxlLnZtcy1pbiBiL2JpbnV0aWxzL21ha2VmaWxlLnZtcy1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwOWQxYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tYWtlZmlsZS52bXMtaW4KKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBiaW51dGlscyB1bmRlciBvcGVuVk1TIChBbHBoYSBhbmQgVmF4KQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBybWkuZGUKLSMKLSMKLQotIyBEaXN0cmlidXRpb24gdmVyc2lvbiwgZmlsbGVkIGluIGJ5IGNvbmZpZ3VyZS5jb20KLVZFUlNJT049QFZFUlNJT05ACi0KLWlmZXEgKCQoQVJDSCksQUxQSEEpCi1UQVJHRVQ9IiJ2bXMtYWxwaGEiIgotZWxzZQotVEFSR0VUPSIidm1zLXZheCIiCi1lbmRpZgotCi1pZmVxICgkKENDKSxnY2MpCi1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdLFstLmJmZF0pJChERUZTKQotREVGUz0vZGVmaW5lPSgiVEFSR0VUPSQoVEFSR0VUKSIpCi1MSUJTPSxnbnVfY2NfbGlicmFyeTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsZ251X2NjX2xpYnJhcnk6Y3J0MC5vYmoKLWVsc2UKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1ERUZTPS9kZWZpbmU9KCJUQVJHRVQ9JChUQVJHRVQpIiwiY29uc3Q9IiwidW5saW5rPXJlbW92ZSIpCi1MSUJTPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbmRpZgotCi1CRkRMSUIgPSBbLS5iZmRdbGliYmZkLm9sYi9saWIKLUJGRExJQl9ERVAgPSBbLS5iZmRdbGliYmZkLm9sYgotTElCSUJFUlRZX0RFUCA9IFstLmxpYmliZXJ0eV1saWJpYmVydHkub2xiCi1MSUJJQkVSVFkgPSBbLS5saWJpYmVydHldbGliaWJlcnR5Lm9sYi9saWIKLU9QQ09ERVNfREVQID0gWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYgotT1BDT0RFUyA9IFstLm9wY29kZXNdbGlib3Bjb2Rlcy5vbGIvbGliCi0KLURFQlVHX09CSlMgPSByZGRiZy5vYmosZGVidWcub2JqLHN0YWJzLm9iaixpZWVlLm9iaixyZGNvZmYub2JqCi0KLVdSSVRFX0RFQlVHX09CSlMgPSAkKERFQlVHX09CSlMpLHdyc3RhYnMub2JqCi0KLUJVTElCUyA9IFtdYnVjb21tLm9iaix2ZXJzaW9uLm9iaixmaWxlbW9kZS5vYmoKLQotQURETF9ERVBTID0gJChCVUxJQlMpLCQoQkZETElCX0RFUCksJChMSUJJQkVSVFlfREVQKQotQURETF9MSUJTID0gJChCVUxJQlMpLCQoQkZETElCKSwkKExJQklCRVJUWSkKLQotU0laRU9CSlMgPSAkKEFERExfREVQUyksc2l6ZS5vYmoKLQotU1RSSU5HU09CSlMgPSAkKEFERExfREVQUyksc3RyaW5ncy5vYmoKLQotTk1PQkpTID0gJChBRERMX0RFUFMpLG5tLm9iagotCi1PQkpEVU1QT0JKUyA9ICQoQURETF9ERVBTKSxvYmpkdW1wLm9iaixwcmRiZy5vYmosJChERUJVR19PQkpTKSwkKE9QQ09ERVNfREVQKQotCi1hbGw6IGNvbmZpZy5oIHNpemUuZXhlIHN0cmluZ3MuZXhlIG9iamR1bXAuZXhlIG5tLmV4ZQotCi1zaXplLmV4ZTogJChTSVpFT0JKUykKLQlsaW5rL2V4ZT0kQCBzaXplLm9iaiwkKEFERExfTElCUykkKExJQlMpCi0KLXN0cmluZ3MuZXhlOiAkKFNUUklOR1NPQkpTKQotCWxpbmsvZXhlPSRAIHN0cmluZ3Mub2JqLCQoQURETF9MSUJTKSQoTElCUykKLQotbm0uZXhlOiAkKE5NT0JKUykKLQlsaW5rL2V4ZT0kQCBubS5vYmosJChBRERMX0xJQlMpJChMSUJTKQotCi1vYmpkdW1wLmV4ZTogJChPQkpEVU1QT0JKUykKLQlsaW5rL2V4ZT0kQCBvYmpkdW1wLm9iaixwcmRiZy5vYmosJChERUJVR19PQkpTKSwkKEJGRExJQiksJChPUENPREVTKSwkKEFERExfTElCUykkKExJQlMpCi0KLQotdmVyc2lvbi5vYmo6IHZlcnNpb24uYwotCSQoQ0MpICQoQ0ZMQUdTKS9kZWZpbmU9KFZFUlNJT049IiIiJChWRVJTSU9OKSIiIikgJDwKLQotY29uZmlnLmg6Ci0JJCQgQGNvbmZpZ3VyZQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQotWy0uYmZkXWxpYmJmZC5vbGI6Ci0JJChDRCkgWy0uYmZkXQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGI6Ci0JJChDRCkgWy0ubGliaWJlcnR5XQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYjoKLQkkKENEKSBbLS5vcGNvZGVzXQotCSQoTUFLRSkgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5iaW51dGlsc10KLQotY2xlYW46Ci0JJCQgcHVyZ2UKLQkkKFJNKSAqLm9iajsKLQkkKFJNKSAqLmV4ZTsKLQotZGlzdGNsZWFuOiBjbGVhbgotCSQoUk0pIGNvbmZpZy5oOwotCSQoUk0pIG1ha2VmaWxlLnZtczsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21heWJlLXJhbmxpYi5jIGIvYmludXRpbHMvbWF5YmUtcmFubGliLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzN2JjMGYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbWF5YmUtcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBkZWNpZGVzIGF0IHJ1bnRpbWUKLSAgICh1c2luZyBhcmd2WzBdIGlmIGl0IGlzIGlzICdhcicgb3IgJ3JhbmxpYicuICovCi0KLWludCBpc19yYW5saWIgPSAtMTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21heWJlLXN0cmlwLmMgYi9iaW51dGlscy9tYXliZS1zdHJpcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDY3Yzk5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL21heWJlLXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIG9iamNvcHkubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGRlY2lkZXMgYXQgcnVudGltZQotICAgKHVzaW5nIGFyZ3ZbMF0gaWYgaXQgaXMgaXMgJ3N0cmlwJyBvciAnb2JqY29weScuICovCi0KLWludCBpc19zdHJpcCA9IC0xOwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbXB3LWNvbmZpZy5pbiBiL2JpbnV0aWxzL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTA2N2QuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgYmludXRpbHMuCi0KLVNldCB0YXJnZXRfYXJjaCBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLS4qLS4qLy8nYAotCi0jIChzaG91bGQgY2Fub25pY2FsaXplIGFyY2ggbmFtZSkgKi8KLQotU2V0IGFyY2huYW1lIEFSQ0hfe3RhcmdldF9hcmNofQotCi1TZXQgdW5kZXJzY29yZSAwCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9zaC1oaXRhY2hpLWhtcy8KLQlTZXQgdW5kZXJzY29yZSAxCi1FbmQgSWYKLQotRWNobyAnIyBGcm9tIG1wdy1jb25maWcuaW4nCQkJCSA+ICJ7b30ibWsudG1wCi1FY2hvICJBUkNIREVGUyA9IC1kIiB7YXJjaG5hbWV9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJVTkRFUlNDT1JFID0gIiB7dW5kZXJzY29yZX0JCQk+PiAie299Im1rLnRtcAotRWNobyAiQlVJTERfTkxNQ09OViA9ICIJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJCVUlMRF9TUkNPTlYgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAiU1lTSU5GT19QUk9HID0gIgkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gIkJVSUxEX0RMTFRPT0wgPSAiCQkJCQk+PiAie299Im1rLnRtcAotRWNobyAnIyBFbmQgZnJvbSBtcHctY29uZmlnLmluJwkJCQk+PiAie299Im1rLnRtcAotCi1FY2hvICcvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nCSA+ICJ7b30iY29uZmlnLm5ldwotRWNobyAnI2luY2x1ZGUgIm1wdy5oIicJCQkJCT4+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL21wdy1tYWtlLnNlZCBiL2JpbnV0aWxzL21wdy1tYWtlLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhYmZmZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBiaW51dGlscyBVbml4IG1ha2VmaWxlIGludG8gTVBXIHN5bnRheC4KLQotIyBBZGQgYSBydWxlLgotL14jIyMjIC4qL2FcCi1cCi0ie299InVuZGVyc2NvcmUuYy5vIFxcT3B0aW9uLWYgIntvfSJ1bmRlcnNjb3JlLmNcCi0KLSMgQ29tbWVudCBvdXQgYW55IGFsaWFzIHNldHRpbmdzLgotL15ob3N0X2FsaWFzID0vcy9eLyMvCi0vXnRhcmdldF9hbGlhcyA9L3MvXi8jLwotCi0jIFdoYWNrIG91dCB1bnVzZWQgaG9zdCBkZWZpbmUgYml0cy4KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotCi0jIERvbid0IGJ1aWxkIHNwZWNpYWxpemVkIHRvb2xzLgotL0JVSUxEX05MTUNPTlYvcy9AQlVJTERfTkxNQ09OVkAvLwotL0JVSUxEX1NSQ09OVi9zL0BCVUlMRF9TUkNPTlZALy8KLS9CVUlMRF9ETExUT09ML3MvQEJVSUxEX0RMTFRPT0xALy8KLQotL1VOREVSU0NPUkUvcy9AVU5ERVJTQ09SRUAve1VOREVSU0NPUkV9LwotCi0jIERvbid0IG5lZWQgdGhpcy4KLS9ASExERkxBR1NAL3MvQEhMREZMQUdTQC8vCi0KLSMgUG9pbnQgYXQgdGhlIGxpYnJhcmllcyBkaXJlY3RseS4KLS9AQkZETElCQC9zL0BCRkRMSUJALzo6YmZkOmxpYmJmZC5vLwotL0BPUENPREVTQC9zL0BPUENPREVTQC86Om9wY29kZXM6bGlib3Bjb2Rlcy5vLwotCi0jIFdoYWNrIG91dCB0YXJnZXQgbWFrZWZpbGUgZnJhZ21lbnQuCi0vdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50L3MvdGFyZ2V0X21ha2VmaWxlX2ZyYWdtZW50QC8vCi0KLSMgRml4IGFuZCBhZGQgdG8gdGhlIGluY2x1ZGUgcGF0aHMuCi0vXklOQ0xVREVTID0gLiokL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0vQkZERElSL3MvLWkge0JGRERJUn0gLy1pICJ7QkZERElSfSI6IC8KLS9JTkNESVIvcy8taSB7SU5DRElSfSAvLWkgIntJTkNESVJ9IjogLwotCi0jIFVzZSBieWFjYyBpbnN0ZWFkIG9mIGJpc29uIChmb3Igbm93IGFueXdheSkuCi0vQklTT04vcy9eQklTT04gPS4qJC9CSVNPTiA9IGJ5YWNjLwotIy9CSVNPTkZMQUdTL3MvXkJJU09ORkxBR1MgPS4qJC9CSVNPTkZMQUdTID0gLwotCi0jIEVtYmVkIHRoZSB2ZXJzaW9uIGluIHN5bWJvbGljIGRvdWJsZXF1b3RlcyB0aGF0IHdpbGwgZXhwYW5kIHRvCi0jIHRoZSByaWdodCB0aGluZyBmb3IgZWFjaCBjb21waWxlci4KLS9WRVJTSU9OL3MvJyJ7VkVSU0lPTn0iJy97ZHF9e1ZFUlNJT059e2RxfS8KLQotIyAnKycgaXMgYSBzcGVjaWFsIGNoYXIgdG8gTVBXLCBkb24ndCB1c2UgaXQgZXZlci4KLS9jKytmaWx0L3MvYysrZmlsdC9jcGx1c2ZpbHQvCi0KLSMgQWxsIG9mIHRoZSBiaW51dGlscyB1c2UgdGhlIHNhbWUgUmV6IGZpbGUsIGNoYW5nZSBuYW1lcyB0byByZWZlciB0byBpdC4KLS9ee1tBLVpdKl9QUk9HfS9zLyQvICJ7c30ibWFjLWJpbnV0aWxzLnIvCi0ve1tBLVpdKl9QUk9HfVwuci9zL3tbQS1aXSpfUFJPR31cLnIvbWFjLWJpbnV0aWxzLnIvCi0KLSMgVGhlcmUgYXJlIGF1dG8tZ2VuZXJhdGVkIHJlZmVyZW5jZXMgdG8gQkZEIC5oIGZpbGVzIHRoYXQgYXJlIG5vdAotIyBpbiB0aGUgb2JqZGlyIChsaWtlIGJmZC5oKSBidXQgYXJlIGluIHRoZSBzb3VyY2UgZGlyLgotLzo6YmZkOmxpYi9zLzo6YmZkOmxpYlwoW2Etel0qXClcLmgve0JGRERJUn06bGliXDEuaC9nCi0KLSMgRml4IHRoZSBsb2NhdGlvbnMgb2YgZ2VuZXJhdGVkIGZpbGVzLgotL2NvbmZpZy9zLyJ7c30iY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvZwotL2NvbmZpZy9zL15jb25maWdcLmgvIntvfSJjb25maWdcLmgvCi0vdW5kZXJzY29yZS9zLyJ7c30idW5kZXJzY29yZVwuYy8ie299InVuZGVyc2NvcmUuYy9nCi0vdW5kZXJzY29yZS9zL151bmRlcnNjb3JlXC5jLyJ7b30idW5kZXJzY29yZVwuYy8KLQotIyBGaXggcGF0aHMgdG8gZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcy4KLS9sZXgueXkuYy9zLyJ7c30ibGV4XC55eVwuYy8ie299ImxleC55eS5jL2cKLS9sZXgueXkuYy9zL15sZXhcLnl5XC5jLyJ7b30ibGV4Lnl5LmMvCi0vYXJsZXguYy9zLyJ7c30iYXJsZXhcLmMvIntvfSJhcmxleC5jL2cKLS9hcmxleC5jL3MvXmFybGV4XC5jLyJ7b30iYXJsZXguYy8KLS95LnRhYi5jL3MvIntzfSJ5XC50YWJcLmMvIntvfSJ5LnRhYi5jL2cKLS95LnRhYi5jL3MvXnlcLnRhYlwuYy8ie299InkudGFiLmMvCi0vYXJwYXJzZS5jL3MvIntzfSJhcnBhcnNlXC5jLyJ7b30iYXJwYXJzZS5jL2cKLS9hcnBhcnNlLmMvcy9eYXJwYXJzZVwuYy8ie299ImFycGFyc2UuYy8KLS95LnRhYi5oL3MvIntzfSJ5XC50YWJcLmgvIntvfSJ5LnRhYi5oL2cKLS95LnRhYi5oL3MvXnlcLnRhYlwuaC8ie299InkudGFiLmgvCi0vYXJwYXJzZS5oL3MvIntzfSJhcnBhcnNlXC5oLyJ7b30iYXJwYXJzZS5oL2cKLS9hcnBhcnNlLmgvcy9eYXJwYXJzZVwuaC8ie299ImFycGFyc2UuaC8KLQotLyJ7c30ie0lOQ0RJUn0vcy8ie3N9IntJTkNESVJ9LyJ7SU5DRElSfSIvZwotCi0jIFRoZSBnZW5lcmF0ZWQgbGV4ZXIgbWF5IGluY2x1ZGUgYW4gaWZkZWYgZm9yIG9sZGVyIE1hYyBjb21waWxlcnMgdGhhdAotIyBuZWVkcyB0byB3b3JrIHdpdGggbmV3ZXIgY29tcGlsZXJzIGFsc28uCi0vbGV4Lnl5LmMvcy9SZW5hbWUgLXkgXChbXiBdKlwpIFwoW14gXSpcKSQvc2VkIC1lICdzLGlmZGVmIG1hY2ludG9zaCxpZiBkZWZpbmVkKG1hY2ludG9zaCkgfHwgZGVmaW5lZChfX01XRVJLU19fKSwnIFwxID4gXDIvCi0KLSMgRml4IGFuIG92ZXItZWFnZXJuZXNzLgotL2VjaG8uKldBUk5JTkcuKlRoaXMgZmlsZS9zLycuKicvJyAnLwotCi0jIEFkZCBhICJzdGFtcHMiIHRhcmdldC4KLSRhXAotc3RhbXBzIFxcT3B0aW9uLWYgc3RhbXAtdW5kZXJcCi0KLS9eaW5zdGFsbCBcXE9wdGlvbi1mIC8sL14kL2NcCi1pbnN0YWxsIFxcT3B0aW9uLWYgIGFsbCBpbnN0YWxsLW9ubHlcCi1cCi1pbnN0YWxsLW9ubHkgXFxPcHRpb24tZlwKLQlOZXdGb2xkZXJSZWN1cnNpdmUgIntiaW5kaXJ9IlwKLQkjIE5lZWQgdG8gY29weSBhbGwgdGhlIHRvb2xzXAotCUZvciBwcm9nIGluIHtQUk9HU31cCi0JCVNldCBwcm9nbmFtZSBgZWNobyB7cHJvZ30gfCBzZWQgLWUgJ3MvLm5ldy8vJ2BcCi0JCUR1cGxpY2F0ZSAteSA6e3Byb2d9ICJ7YmluZGlyfSJ7cHJvZ25hbWV9XAotCUVuZCBGb3JcCi0KLQotL3RydWUvcy8gOyBAdHJ1ZSQvLwotCi0jIGRvdCBmaWxlcyBhcmUgdHJvdWJsZSwgcmVtb3ZlIHRoZW0gYW5kIHRoZWlyIGFjdGlvbnMuCi0vXlwuZGVwLywvXiQvZAotCi0jIFJlbW92ZSB1bi11c2VmdWwgdGFyZ2V0cy4KLS9eTWFrZWZpbGUgXFxPcHRpb24tZi8sL14kL2QKLS9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mLywvXiQvZAotL15jb25maWcuc3RhdHVzIFxcT3B0aW9uLWYvLC9eJC9kCi0KLSMgRG9uJ3QgdHJ5IHRvIG1ha2UgdGhlIGRlbWFuZ2xlcidzIG1hbiBwYWdlLCBpdCdzIHVzZWxlc3MuCi0vXntERU1BTkdMRVJfUFJPR31cLjEgXFxPcHRpb24tZi8sL14kL2QKLSMgRG9uJ3QgZGVwZW5kIG9uIGl0IGVpdGhlci4KLS97REVNQU5HTEVSX1BST0d9L3MvIHtERU1BTkdMRVJfUFJPR31cLjEvLwotCmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1jb252LjEgYi9iaW51dGlscy9ubG1jb252LjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzNhZWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbmxtY29udi4xCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTYgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotLlwiIFNlZSBzZWN0aW9uIENPUFlJTkcgZm9yIGNvbmRpdGlvbnMgZm9yIHJlZGlzdHJpYnV0aW9uCi0uVEggbmxtY29udiAxICJNYXJjaCAxOTk2IiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotbmxtY29udiBcLSBjb252ZXJ0cyBvYmplY3QgY29kZSBpbnRvIGFuIE5MTQotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgbmxtY29udgotLlJCICJbXHwiIFwtSVwgXGZJYmZkbmFtZVxmQlwgfFwgXC1cLWlucHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU9cIFxmSWJmZG5hbWVcZkJcIHxcIFwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVFwgXGZJaGVhZGVyZmlsZVxmQlwgfFwgXC1cLWhlYWRlclwtZmlsZT1cZkloZWFkZXJmaWxlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVlwgfFwgXC1cLXZlcnNpb25cZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWhlbHBcZlIgIlx8XSIgCi0uQiBpbmZpbGUKLS5CIG91dGZpbGUKLS5TSCBERVNDUklQVElPTgotLkIgbmxtY29udgotY29udmVydHMgdGhlIHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlIAotLkIgaW5maWxlCi1pbnRvIHRoZSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSAKLS5CUiBvdXRmaWxlICwKLW9wdGlvbmFsbHkgcmVhZGluZyAKLS5JIGhlYWRlcmZpbGUKLWZvciBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgRm9yIGluc3RydWN0aW9ucyBvbiB3cml0aW5nIHRoZSBOTE0KLWNvbW1hbmQgZmlsZSBsYW5ndWFnZSB1c2VkIGluIGhlYWRlciBmaWxlcywgc2VlIAotLklSICJUaGUgTmV0V2FyZSBUb29sIE1ha2VyIFNwZWNpZmljYXRpb24gTWFudWFsIiAsCi1hdmFpbGFibGUgZnJvbSBOb3ZlbGwsIEluYy4KLS5CIG5sbWNvbnYKLWN1cnJlbnRseSB3b3JrcyB3aXRoIGkzODYgb2JqZWN0IGZpbGVzIGluIAotLkJSIENPRkYgLAotLkJSIEVMRiAsCi1vcgotLkIgYS5vdXQKLWZvcm1hdCwgYW5kIHdpdGggU1BBUkMgb2JqZWN0IGZpbGVzIGluCi0uQiBFTEYKLW9yCi0uQiBhLm91dAotZm9ybWF0LgotLmJyCi0uQiBubG1jb252Ci11c2VzIHRoZSBHTlUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5IHRvIHJlYWQgCi0uSVIgaW5maWxlIC4KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtSSBcZkliZmRuYW1lXGZSLCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Db25zaWRlciB0aGUgc291cmNlIGZpbGUncyBvYmplY3QgZm9ybWF0IHRvIGJlIAotLklSIGJmZG5hbWUgLAotcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byBkZWR1Y2UgaXQuCi0uVFAKLS5CIFwtTyBcZkliZmRuYW1lXGZSLCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZQotV3JpdGUgdGhlIG91dHB1dCBmaWxlIHVzaW5nIHRoZSBvYmplY3QgZm9ybWF0IAotLklSIGJmZG5hbWUgLgotLkIgbmxtY29udgotaW5mZXJzIHRoZSBvdXRwdXQgZm9ybWF0IGJhc2VkIG9uIHRoZSBpbnB1dCBmb3JtYXQsIGUuZy4gZm9yIGFuIGkzODYKLWlucHV0IGZpbGUgdGhlIG91dHB1dCBmb3JtYXQgaXMKLS5JUiBubG0zMlwtaTM4NiAuCi0uVFAKLS5CIFwtVCBcZkloZWFkZXJmaWxlXGZSLCBcZkJcLVwtaGVhZGVyXC1maWxlPVxmSWhlYWRlcmZpbGUKLVJlYWRzIAotLkkgaGVhZGVyZmlsZQotZm9yIE5MTSBoZWFkZXIgaW5mb3JtYXRpb24uICBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHdyaXRpbmcgdGhlIE5MTQotY29tbWFuZCBmaWxlIGxhbmd1YWdlIHVzZWQgaW4gaGVhZGVyIGZpbGVzLCBzZWUgCi0uSVIgIlRoZSBOZXRXYXJlIFRvb2wgTWFrZXIgU3BlY2lmaWNhdGlvbiBNYW51YWwiICwKLWF2YWlsYWJsZSBmcm9tIE5vdmVsbCwgSW5jLgotLlRQCi0uQiBcLVZcZlIsIFxmQlwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgbmxtY29udgotYW5kIGV4aXQuCi0uVFAKLS5CIFwtaFxmUiwgXGZCXC1cLWhlbHAKLVNob3cgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBubG1jb252Ci1hbmQgZXhpdC4KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoSnVuZSAxOTkzKS4KLQotLlNIIENPUFlJTkcKLUNvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbmxtY29udi5jIGIvYmludXRpbHMvbmxtY29udi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM4YjZjLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWNvbnYuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMTIgKzAsMCBAQAotLyogbmxtY29udi5jIC0tIE5MTSBjb252ZXJzaW9uIHByb2dyYW0KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gY29udmVydCBhbnkgYXBwcm9wcmlhdGUgb2JqZWN0IGZpbGUKLSAgIGludG8gYSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZSAoYW4gTkxNKS4gIEl0IHdpbGwgYWNjZXB0IGEgbGlua2VyCi0gICBzcGVjaWZpY2F0aW9uIGZpbGUgd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoYXQgYWNjZXB0ZWQgYnkgdGhlCi0gICBOZXRXYXJlIGxpbmtlciwgTkxNTElOSy4gICovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZuZGVmIF9fR05VQ19fCi0jIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0KLS8qIEludGVybmFsIEJGRCBOTE0gaGVhZGVyLiAgKi8KLSNpbmNsdWRlICJsaWJubG0uaCIKLSNpbmNsdWRlICJubG1jb252LmgiCi0KLSNpZmRlZiBOTE1DT05WX0FMUEhBCi0jaW5jbHVkZSAiY29mZi9zeW0uaCIKLSNpbmNsdWRlICJjb2ZmL2Vjb2ZmLmgiCi0jZW5kaWYKLQotLyogSWYgc3RyZXJyb3IgaXMganVzdCBhIG1hY3JvLCB3ZSB3YW50IHRvIHVzZSB0aGUgb25lIGZyb20gbGliaWJlcnR5Ci0gICBzaW5jZSBpdCB3aWxsIGhhbmRsZSB1bmRlZmluZWQgdmFsdWVzLiAgKi8KLSN1bmRlZiBzdHJlcnJvcgotZXh0ZXJuIGNoYXIgKnN0cmVycm9yICgpOwotCi0jaWZuZGVmIGxvY2FsdGltZQotZXh0ZXJuIHN0cnVjdCB0bSAqbG9jYWx0aW1lICgpOwotI2VuZGlmCi0KLSNpZm5kZWYgU0VFS19TRVQKLSNkZWZpbmUgU0VFS19TRVQgMAotI2VuZGlmCi0KLSNpZm5kZWYgUl9PSwotI2RlZmluZSBSX09LIDQKLSNkZWZpbmUgV19PSyAyCi0jZGVmaW5lIFhfT0sgMQotI2VuZGlmCi0MCi0vKiBHbG9iYWwgdmFyaWFibGVzLiAgKi8KLQotLyogVGhlIG5hbWUgdXNlZCB0byBpbnZva2UgdGhlIHByb2dyYW0uICAqLwotY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBMb2NhbCB2YXJpYWJsZXMuICAqLwotCi0vKiBXaGV0aGVyIHRvIHByaW50IG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKGN1cnJlbnRseSBqdXN0IGNvbnRyb2xzCi0gICB3aGV0aGVyIGl0IHByaW50cyB0aGUgbGlua2VyIGNvbW1hbmQgaWYgdGhlcmUgaXMgb25lKS4gICovCi1zdGF0aWMgaW50IGRlYnVnOwotCi0vKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqc3ltYm9sczsKLQotLyogQSBzZWN0aW9uIHdlIGNyZWF0ZSBpbiB0aGUgb3V0cHV0IGZpbGUgdG8gaG9sZCBwb2ludGVycyB0byB3aGVyZQotICAgdGhlIHNlY3Rpb25zIG9mIHRoZSBpbnB1dCBmaWxlIGVuZCB1cC4gIFdlIHdpbGwgcHV0IGEgcG9pbnRlciB0bwotICAgdGhpcyBzZWN0aW9uIGluIHRoZSBOTE0gaGVhZGVyLiAgVGhlc2UgaXMgYW4gZW50cnkgZm9yIGVhY2ggaW5wdXQKLSAgIHNlY3Rpb24uICBUaGUgZm9ybWF0IGlzCi0gICAgICAgbnVsbCB0ZXJtaW5hdGVkIHNlY3Rpb24gbmFtZQotICAgICAgIHplcm9lcyB0byBhZGp1c3QgdG8gNCBieXRlIGJvdW5kYXJ5Ci0gICAgICAgNCBieXRlIHNlY3Rpb24gZGF0YSBmaWxlIHBvaW50ZXIKLSAgICAgICA0IGJ5dGUgc2VjdGlvbiBzaXplCi0gICBXZSBkb24ndCBuZWVkIGEgdmVyc2lvbiBudW1iZXIuICBUaGUgd2F5IHdlIGZpbmQgdGhpcyBpbmZvcm1hdGlvbgotICAgaXMgYnkgZmluZGluZyBhIHN0YW1wIGluIHRoZSBOTE0gaGVhZGVyIGluZm9ybWF0aW9uLiAgSWYgd2UgbmVlZCB0bwotICAgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiwgd2UgY2FuIHNpbXBseSBjaGFuZ2UgdGhlCi0gICBzdGFtcC4gICovCi1zdGF0aWMgYXNlY3Rpb24gKnNlY3NlYzsKLQotLyogQSB0ZW1wb3JhcnkgZmlsZSBuYW1lIHRvIGJlIHVubGlua2VkIG9uIGV4aXQuICBBY3R1YWxseSwgZm9yIG1vc3QKLSAgIGVycm9ycywgd2UgbGVhdmUgaXQgYXJvdW5kLiAgSXQncyBub3QgY2xlYXIgd2hldGhlciB0aGF0IGlzIGhlbHBmdWwKLSAgIG9yIG5vdC4gICovCi1zdGF0aWMgY2hhciAqdW5saW5rX29uX2V4aXQ7Ci0KLS8qIFRoZSBsaXN0IG9mIGxvbmcgb3B0aW9ucy4gICovCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsgImRlYnVnIiwgbm9fYXJndW1lbnQsIDAsICdkJyB9LAotICB7ICJoZWFkZXItZmlsZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnVCcgfSwKLSAgeyAiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCcgfSwKLSAgeyAiaW5wdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LAotICB7ICJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knIH0sIC8qIE9ic29sZXRlICovCi0gIHsgImxpbmtlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbCcgfSwKLSAgeyAib3V0cHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTycgfSwKLSAgeyAib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTycgfSwgLyogT2Jzb2xldGUgKi8KLSAgeyAidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVicgfSwKLSAgeyBOVUxMLCBub19hcmd1bWVudCwgMCwgMCB9Ci19OwotCi0vKiBMb2NhbCByb3V0aW5lcy4gICovCi0KLXN0YXRpYyB2b2lkIHNob3dfaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzaG93X3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqc2VsZWN0X291dHB1dF9mb3JtYXQgUEFSQU1TICgoZW51bSBiZmRfYXJjaGl0ZWN0dXJlLAotCQkJCQkJIHVuc2lnbmVkIGxvbmcsIGJvb2xlYW4pKTsKLXN0YXRpYyB2b2lkIHNldHVwX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvcHlfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJICAgbG9uZyAqLCBjaGFyICosCi0JCQkJICAgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHZvaWQgZGVmYXVsdF9tYW5nbGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBhcmVsZW50ICoqKiwKLQkJCQkJICAgbG9uZyAqLCBjaGFyICosCi0JCQkJCSAgIGJmZF9zaXplX3R5cGUpKTsKLXN0YXRpYyBjaGFyICpsaW5rX2lucHV0cyBQQVJBTVMgKChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiwgY2hhciAqKSk7Ci0KLSNpZmRlZiBOTE1DT05WX0kzODYKLXN0YXRpYyB2b2lkIGkzODZfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJCWxvbmcgKiwgY2hhciAqLAotCQkJCQliZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLXN0YXRpYyB2b2lkIGFscGhhX21hbmdsZV9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKioqLAotCQkJCQkgbG9uZyAqLCBjaGFyICosCi0JCQkJCSBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotc3RhdGljIHZvaWQgcG93ZXJwY19idWlsZF9zdHVicyBQQVJBTVMgKChiZmQgKiwgYmZkICosIGFzeW1ib2wgKioqLCBsb25nICopKTsKLXN0YXRpYyB2b2lkIHBvd2VycGNfcmVzb2x2ZV9zdHVicyBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIHBvd2VycGNfbWFuZ2xlX3JlbG9jcyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXJlbGVudCAqKiosCi0JCQkJCSAgIGxvbmcgKiwgY2hhciAqLAotCQkJCQkgICBiZmRfc2l6ZV90eXBlKSk7Ci0jZW5kaWYKLQwKLS8qIFRoZSBtYWluIHJvdXRpbmUuICAqLwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG9wdDsKLSAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKmlucHV0X2Zvcm1hdCA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKm91dHB1dF9mb3JtYXQgPSBOVUxMOwotICBjb25zdCBjaGFyICpoZWFkZXJfZmlsZSA9IE5VTEw7Ci0gIGNoYXIgKmxkX2FyZyA9IE5VTEw7Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgZml4ZWRfaGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX1ZhcmlhYmxlX0hlYWRlciB2YXJfaGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIHZlcnNpb25faGRyX3N0cnVjdDsKLSAgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgY29weXJpZ2h0X2hkcl9zdHJ1Y3Q7Ci0gIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIgZXh0ZW5kZWRfaGRyX3N0cnVjdDsKLSAgYmZkICppbmJmZDsKLSAgYmZkICpvdXRiZmQ7Ci0gIGFzeW1ib2wgKipuZXdzeW1zLCAqKm91dHN5bXM7Ci0gIGxvbmcgc3ltY291bnQsIG5ld3N5bWFsbG9jLCBuZXdzeW1jb3VudDsKLSAgbG9uZyBzeW1zaXplOwotICBhc2VjdGlvbiAqdGV4dF9zZWMsICpic3Nfc2VjLCAqZGF0YV9zZWM7Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfc2l6ZV90eXBlIGFsaWduOwotICBhc3ltYm9sICplbmRzeW07Ci0gIGxvbmcgaTsKLSAgY2hhciBpbmxlYWQsIG91dGxlYWQ7Ci0gIGJvb2xlYW4gZ290c3RhcnQsIGdvdGV4aXQsIGdvdGNoZWNrOwotICBzdHJ1Y3Qgc3RhdCBzdDsKLSAgRklMRSAqY3VzdG9tX2RhdGEgPSBOVUxMOwotICBGSUxFICpoZWxwX2RhdGEgPSBOVUxMOwotICBGSUxFICptZXNzYWdlX2RhdGEgPSBOVUxMOwotICBGSUxFICpycGNfZGF0YSA9IE5VTEw7Ci0gIEZJTEUgKnNoYXJlZF9kYXRhID0gTlVMTDsKLSAgc2l6ZV90IGN1c3RvbV9zaXplID0gMDsKLSAgc2l6ZV90IGhlbHBfc2l6ZSA9IDA7Ci0gIHNpemVfdCBtZXNzYWdlX3NpemUgPSAwOwotICBzaXplX3QgbW9kdWxlX3NpemUgPSAwOwotICBzaXplX3QgcnBjX3NpemUgPSAwOwotICBhc2VjdGlvbiAqY3VzdG9tX3NlY3Rpb24gPSBOVUxMOwotICBhc2VjdGlvbiAqaGVscF9zZWN0aW9uID0gTlVMTDsKLSAgYXNlY3Rpb24gKm1lc3NhZ2Vfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICptb2R1bGVfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICpycGNfc2VjdGlvbiA9IE5VTEw7Ci0gIGFzZWN0aW9uICpzaGFyZWRfc2VjdGlvbiA9IE5VTEw7Ci0gIGJmZCAqc2hhcmVkYmZkOwotICBzaXplX3Qgc2hhcmVkX29mZnNldCA9IDA7Ci0gIHNpemVfdCBzaGFyZWRfc2l6ZSA9IDA7Ci0gIE5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgc2hhcmVkaGRyOwotICBpbnQgbGVuOwotICBjaGFyICptb2RuYW1lOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImRoSTpsOk86VDpWIiwgbG9uZ19vcHRpb25zLAotCQkJICAgICAoaW50ICopIE5VTEwpKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ2QnOgotCSAgZGVidWcgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ0knOgotCSAgaW5wdXRfZm9ybWF0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICBsZF9hcmcgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIG91dHB1dF9mb3JtYXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGhlYWRlcl9maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBwcmludF92ZXJzaW9uICgibmxtY29udiIpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIG91dHB1dF9maWxlID0gTlVMTDsKLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgaW5wdXRfZmlsZSA9IGFyZ3Zbb3B0aW5kXTsKLSAgICAgICsrb3B0aW5kOwotICAgICAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JewotCSAgb3V0cHV0X2ZpbGUgPSBhcmd2W29wdGluZF07Ci0JICArK29wdGluZDsKLQkgIGlmIChvcHRpbmQgPCBhcmdjKQotCSAgICBzaG93X3VzYWdlIChzdGRlcnIsIDEpOwotCSAgaWYgKHN0cmNtcCAoaW5wdXRfZmlsZSwgb3V0cHV0X2ZpbGUpID09IDApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCSAgICAgICBfKCIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gdG8gZGVmYXVsdCB2YWx1ZXMuICAqLwotICBmaXhlZF9oZHIgPSAmZml4ZWRfaGRyX3N0cnVjdDsKLSAgbWVtc2V0ICgoUFRSKSAmZml4ZWRfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIGZpeGVkX2hkcl9zdHJ1Y3QpOwotICB2YXJfaGRyID0gJnZhcl9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZ2YXJfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIHZhcl9oZHJfc3RydWN0KTsKLSAgdmVyc2lvbl9oZHIgPSAmdmVyc2lvbl9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZ2ZXJzaW9uX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiB2ZXJzaW9uX2hkcl9zdHJ1Y3QpOwotICBjb3B5cmlnaHRfaGRyID0gJmNvcHlyaWdodF9oZHJfc3RydWN0OwotICBtZW1zZXQgKChQVFIpICZjb3B5cmlnaHRfaGRyX3N0cnVjdCwgMCwgc2l6ZW9mIGNvcHlyaWdodF9oZHJfc3RydWN0KTsKLSAgZXh0ZW5kZWRfaGRyID0gJmV4dGVuZGVkX2hkcl9zdHJ1Y3Q7Ci0gIG1lbXNldCAoKFBUUikgJmV4dGVuZGVkX2hkcl9zdHJ1Y3QsIDAsIHNpemVvZiBleHRlbmRlZF9oZHJfc3RydWN0KTsKLSAgY2hlY2tfcHJvY2VkdXJlID0gTlVMTDsKLSAgY3VzdG9tX2ZpbGUgPSBOVUxMOwotICBkZWJ1Z19pbmZvID0gZmFsc2U7Ci0gIGV4aXRfcHJvY2VkdXJlID0gIl9TdG9wIjsKLSAgZXhwb3J0X3N5bWJvbHMgPSBOVUxMOwotICBtYXBfZmlsZSA9IE5VTEw7Ci0gIGZ1bGxfbWFwID0gZmFsc2U7Ci0gIGhlbHBfZmlsZSA9IE5VTEw7Ci0gIGltcG9ydF9zeW1ib2xzID0gTlVMTDsKLSAgbWVzc2FnZV9maWxlID0gTlVMTDsKLSAgbW9kdWxlcyA9IE5VTEw7Ci0gIHNoYXJlbGliX2ZpbGUgPSBOVUxMOwotICBzdGFydF9wcm9jZWR1cmUgPSAiX1ByZWx1ZGUiOwotICB2ZXJib3NlID0gZmFsc2U7Ci0gIHJwY19maWxlID0gTlVMTDsKLQotICBwYXJzZV9lcnJvcnMgPSAwOwotCi0gIC8qIFBhcnNlIHRoZSBoZWFkZXIgZmlsZSAoaWYgdGhlcmUgaXMgb25lKS4gICovCi0gIGlmIChoZWFkZXJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIG5sbWxleF9maWxlIChoZWFkZXJfZmlsZSkKLQkgIHx8IHl5cGFyc2UgKCkgIT0gMAotCSAgfHwgcGFyc2VfZXJyb3JzICE9IDApCi0JZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmIChpbnB1dF9maWxlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChpbnB1dF9maWxlICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCIlczogaW5wdXQgZmlsZSBuYW1lZCBib3RoIG9uIGNvbW1hbmQgbGluZSBhbmQgd2l0aCBJTlBVVFxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSk7Ci0JICBleGl0ICgxKTsKLQl9Ci0gICAgICBpZiAoaW5wdXRfZmlsZXMtPm5leHQgPT0gTlVMTCkKLQlpbnB1dF9maWxlID0gaW5wdXRfZmlsZXMtPnN0cmluZzsKLSAgICAgIGVsc2UKLQlpbnB1dF9maWxlID0gbGlua19pbnB1dHMgKGlucHV0X2ZpbGVzLCBsZF9hcmcpOwotICAgIH0KLSAgZWxzZSBpZiAoaW5wdXRfZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIGlucHV0IGZpbGVcbiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLSAgICB9Ci0KLSAgaW5iZmQgPSBiZmRfb3BlbnIgKGlucHV0X2ZpbGUsIGlucHV0X2Zvcm1hdCk7Ci0gIGlmIChpbmJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChpbmJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGlucHV0X2ZpbGUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9mb3JtYXQgPT0gTlVMTCkKLSAgICBvdXRwdXRfZm9ybWF0ID0gc2VsZWN0X291dHB1dF9mb3JtYXQgKGJmZF9nZXRfYXJjaCAoaW5iZmQpLAotCQkJCQkgIGJmZF9nZXRfbWFjaCAoaW5iZmQpLAotCQkJCQkgIGJmZF9iaWdfZW5kaWFuIChpbmJmZCkpOwotCi0gIGFzc2VydCAob3V0cHV0X2Zvcm1hdCAhPSBOVUxMKTsKLQotICAvKiBVc2UgdGhlIG91dHB1dCBmaWxlIG5hbWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgaWYgaXQgZXhpc3RzLgotICAgICBPdGhlcndpc2UgdXNlIHRoZSBmaWxlIG5hbWVkIGluIHRoZSBPVVRQVVQgc3RhdGVtZW50LiAgKi8KLSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLSAgICB9Ci0KLSAgb3V0YmZkID0gYmZkX29wZW53IChvdXRwdXRfZmlsZSwgb3V0cHV0X2Zvcm1hdCk7Ci0gIGlmIChvdXRiZmQgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKG91dHB1dF9maWxlKTsKLSAgaWYgKCEgYmZkX3NldF9mb3JtYXQgKG91dGJmZCwgYmZkX29iamVjdCkpCi0gICAgYmZkX2ZhdGFsIChvdXRwdXRfZmlsZSk7Ci0KLSAgYXNzZXJ0IChiZmRfZ2V0X2ZsYXZvdXIgKG91dGJmZCkgPT0gYmZkX3RhcmdldF9ubG1fZmxhdm91cik7Ci0KLSAgaWYgKGJmZF9hcmNoX2dldF9jb21wYXRpYmxlIChpbmJmZCwgb3V0YmZkKSA9PSBOVUxMKQotICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgIF8oIiVzOiB3YXJuaW5nOmlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgbm90IGNvbXBhdGlibGVcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lKTsKLQotICAvKiBNb3ZlIHRoZSB2YWx1ZXMgcmVhZCBmcm9tIHRoZSBjb21tYW5kIGZpbGUgaW50byBvdXRiZmQuICAqLwotICAqbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKSA9IGZpeGVkX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fdmFyaWFibGVfaGVhZGVyIChvdXRiZmQpID0gdmFyX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCkgPSB2ZXJzaW9uX2hkcl9zdHJ1Y3Q7Ci0gICpubG1fY29weXJpZ2h0X2hlYWRlciAob3V0YmZkKSA9IGNvcHlyaWdodF9oZHJfc3RydWN0OwotICAqbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKSA9IGV4dGVuZGVkX2hkcl9zdHJ1Y3Q7Ci0KLSAgLyogU3RhcnQgY29weWluZyB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELiAgKi8KLSAgaWYgKCEgYmZkX3NldF9maWxlX2ZsYWdzIChvdXRiZmQsIGJmZF9nZXRfZmlsZV9mbGFncyAoaW5iZmQpKSkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKG91dGJmZCkpOwotCi0gIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoaW5iZmQpOwotICBpZiAoc3ltc2l6ZSA8IDApCi0gICAgYmZkX2ZhdGFsIChpbnB1dF9maWxlKTsKLSAgc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaW5iZmQsIHN5bWJvbHMpOwotICBpZiAoc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSAuYnNzIHNlY3Rpb24uICAqLwotICBic3Nfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dGJmZCwgTkxNX1VOSU5JVElBTElaRURfREFUQV9OQU1FKTsKLSAgaWYgKGJzc19zZWMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBic3Nfc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICAgICAgaWYgKGJzc19zZWMgPT0gTlVMTAotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgYnNzX3NlYywgU0VDX0FMTE9DKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChvdXRiZmQsIGJzc19zZWMsIDEpKQotCWJmZF9mYXRhbCAoXygibWFrZSAuYnNzIHNlY3Rpb24iKSk7Ci0gICAgfQotCi0gIC8qIFdlIHN0b3JlIHRoZSBvcmlnaW5hbCBzZWN0aW9uIG5hbWVzIGluIHRoZSAubmxtc2VjdGlvbnMgc2VjdGlvbiwKLSAgICAgc28gdGhhdCBwcm9ncmFtcyB3aGljaCB1bmRlcnN0YW5kIGl0IGNhbiByZXN1cnJlY3QgdGhlIG9yaWdpbmFsCi0gICAgIHNlY3Rpb25zIGZyb20gdGhlIE5MTS4gIFdlIHdpbGwgcHV0IGEgcG9pbnRlciB0byAubmxtc2VjdGlvbnMgaW4KLSAgICAgdGhlIE5MTSBoZWFkZXIgYXJlYS4gICovCi0gIHNlY3NlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1zZWN0aW9ucyIpOwotICBpZiAoc2Vjc2VjID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChfKCJtYWtlIC5ubG1zZWN0aW9ucyBzZWN0aW9uIikpOwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgc2Vjc2VjLCBTRUNfSEFTX0NPTlRFTlRTKSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbnMgZmxhZ3MiKSk7Ci0KLSNpZmRlZiBOTE1DT05WX1BPV0VSUEMKLSAgLyogRm9yIFBvd2VyUEMgTmV0V2FyZSB3ZSBuZWVkIHRvIGJ1aWxkIHN0dWJzIGZvciBjYWxscyB0byB1bmRlZmluZWQKLSAgICAgc3ltYm9scy4gIEJlY2F1c2UgZWFjaCBzdHViIHJlcXVpcmVzIGFuIGVudHJ5IGluIHRoZSBUT0Mgc2VjdGlvbgotICAgICB3aGljaCBtdXN0IGJlIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzIG90aGVyIGVudHJpZXMgaW4gdGhlIFRPQwotICAgICBzZWN0aW9uLCB3ZSBtdXN0IGRvIHRoaXMgYmVmb3JlIGRldGVybWluaW5nIHdoZXJlIHRoZSBUT0Mgc2VjdGlvbgotICAgICBnb2VzIGluIHNldHVwX3NlY3Rpb25zLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcG93ZXJwY19idWlsZF9zdHVicyAoaW5iZmQsIG91dGJmZCwgJnN5bWJvbHMsICZzeW1jb3VudCk7Ci0jZW5kaWYKLQotICAvKiBTZXQgdXAgdGhlIHNlY3Rpb25zLiAgKi8KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChpbmJmZCwgc2V0dXBfc2VjdGlvbnMsIChQVFIpIG91dGJmZCk7Ci0KLSAgdGV4dF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBOTE1fQ09ERV9OQU1FKTsKLQotICAvKiBUaGUgLmJzcyBzZWN0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIC5kYXRhIHNlY3Rpb24uICAqLwotICBkYXRhX3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsIE5MTV9JTklUSUFMSVpFRF9EQVRBX05BTUUpOwotICBpZiAoZGF0YV9zZWMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGFkZDsKLQotICAgICAgdm1hID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChkYXRhX3NlYyk7Ci0gICAgICBhbGlnbiA9IDEgPDwgYnNzX3NlYy0+YWxpZ25tZW50X3Bvd2VyOwotICAgICAgYWRkID0gKCh2bWEgKyBhbGlnbiAtIDEpICZ+IChhbGlnbiAtIDEpKSAtIHZtYTsKLSAgICAgIHZtYSArPSBhZGQ7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChvdXRiZmQsIGJzc19zZWMsIHZtYSkpCi0JYmZkX2ZhdGFsIChfKCJzZXQgLmJzcyB2bWEiKSk7Ci0gICAgICBpZiAoYWRkICE9IDApCi0JewotCSAgYmZkX3NpemVfdHlwZSBkYXRhX3NpemU7Ci0KLQkgIGRhdGFfc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoZGF0YV9zZWMpOwotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgZGF0YV9zZWMsIGRhdGFfc2l6ZSArIGFkZCkpCi0JICAgIGJmZF9mYXRhbCAoXygic2V0IC5kYXRhIHNpemUiKSk7Ci0JfQotICAgIH0KLQotICAvKiBBZGp1c3Qgc3ltYm9sIGluZm9ybWF0aW9uLiAgKi8KLSAgaW5sZWFkID0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChpbmJmZCk7Ci0gIG91dGxlYWQgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG91dGJmZCk7Ci0gIGdvdHN0YXJ0ID0gZmFsc2U7Ci0gIGdvdGV4aXQgPSBmYWxzZTsKLSAgZ290Y2hlY2sgPSBmYWxzZTsKLSAgbmV3c3ltYWxsb2MgPSAxMDsKLSAgbmV3c3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChuZXdzeW1hbGxvYyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG5ld3N5bWNvdW50ID0gMDsKLSAgZW5kc3ltID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8IHN5bWNvdW50OyBpKyspCi0gICAgewotICAgICAgcmVnaXN0ZXIgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBzeW1ib2xzW2ldOwotCi0gICAgICAvKiBBZGQgb3IgcmVtb3ZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIGlmIChpbmxlYWQgIT0gb3V0bGVhZCkKLQl7Ci0JICBpZiAoaW5sZWFkICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKVswXSA9PSBpbmxlYWQpCi0JCXsKLQkJICBpZiAob3V0bGVhZCA9PSAnXDAnKQotCQkgICAgKytzeW0tPm5hbWU7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBjaGFyICpuZXc7Ci0KLQkJICAgICAgbmV3ID0geG1hbGxvYyAoc3RybGVuIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSArIDEpOwotCQkgICAgICBuZXdbMF0gPSBvdXRsZWFkOwotCQkgICAgICBzdHJjcHkgKG5ldyArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgKyAxKTsKLQkJICAgICAgc3ltLT5uYW1lID0gbmV3OwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm5ldzsKLQotCSAgICAgIG5ldyA9IHhtYWxsb2MgKHN0cmxlbiAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgKyAyKTsKLQkgICAgICBuZXdbMF0gPSBvdXRsZWFkOwotCSAgICAgIHN0cmNweSAobmV3ICsgMSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSk7Ci0JICAgICAgc3ltLT5uYW1lID0gbmV3OwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOTE0ncyBoYXZlIGFuIHVuaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uLCBidXQgdGhleSBkbyBub3QKLQkgaGF2ZSBhIGNvbW1vbiBzZWN0aW9uIGluIHRoZSBVbml4IHNlbnNlLiAgTW92ZSBhbGwgY29tbW9uCi0JIHN5bWJvbHMgaW50byB0aGUgLmJzcyBzZWN0aW9uLCBhbmQgbWFyayB0aGVtIGFzIGV4cG9ydGVkLiAgKi8KLSAgICAgIGlmIChiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgYmZkX3ZtYSBzaXplOwotCi0JICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgc2l6ZSA9IHN5bS0+dmFsdWU7Ci0JICBzeW0tPnZhbHVlID0gYnNzX3NlYy0+X3Jhd19zaXplOwotCSAgYnNzX3NlYy0+X3Jhd19zaXplICs9IHNpemU7Ci0JICBhbGlnbiA9IDEgPDwgYnNzX3NlYy0+YWxpZ25tZW50X3Bvd2VyOwotCSAgYnNzX3NlYy0+X3Jhd19zaXplID0gKGJzc19zZWMtPl9yYXdfc2l6ZSArIGFsaWduIC0gMSkgJn4gKGFsaWduIC0gMSk7Ci0JICBzeW0tPmZsYWdzIHw9IEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICAvKiBNb3ZlIHRoZSBzeW1ib2wgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24uICAqLwotCSAgc3ltLT52YWx1ZSArPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm91dHB1dF9vZmZzZXQ7Ci0JICBzeW0tPnNlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPm91dHB1dF9zZWN0aW9uOwotCSAgLyogVGhpcyBpcyBubyBsb25nZXIgYSBzZWN0aW9uIHN5bWJvbC4gICovCi0JICBzeW0tPmZsYWdzICY9fiBCU0ZfU0VDVElPTl9TWU07Ci0JfQotCi0gICAgICAvKiBGb3JjZSBfZWRhdGEgYW5kIF9lbmQgdG8gYmUgZGVmaW5lZC4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUKLQkgZG9uZSBieSB0aGUgbGlua2VyLCBidXQgdGhlIG1hbmlwdWxhdGlvbiBvZiB0aGUgY29tbW9uCi0JIHN5bWJvbHMgd2lsbCBjb25mdXNlIGl0LiAgKi8KLSAgICAgIGlmICgoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpID09IDAKLQkgICYmIGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gPT0gJ18nCi0JICAmJiBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JewotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgIl9lZGF0YSIpID09IDApCi0JICAgIHsKLQkgICAgICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgICAgIHN5bS0+dmFsdWUgPSAwOwotCSAgICB9Ci0JICBpZiAoc3RyY21wIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiX2VuZCIpID09IDApCi0JICAgIHsKLQkgICAgICBzeW0tPnNlY3Rpb24gPSBic3Nfc2VjOwotCSAgICAgIGVuZHN5bSA9IHN5bTsKLQkgICAgfQotCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0JICAvKiBGb3IgUG93ZXJQQyBOZXRXYXJlLCB3ZSBkZWZpbmUgX19HT1QwLiAgVGhpcyBpcyB0aGUgc3RhcnQKLQkgICAgIG9mIHRoZSAuZ290IHNlY3Rpb24uICAqLwotCSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMKLQkgICAgICAmJiBzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksICJfX0dPVDAiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKmdvdF9zZWM7Ci0KLQkgICAgICBnb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCAiLmdvdCIpOwotCSAgICAgIGFzc2VydCAoZ290X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCk7Ci0JICAgICAgc3ltLT52YWx1ZSA9IGdvdF9zZWMtPm91dHB1dF9vZmZzZXQ7Ci0JICAgICAgc3ltLT5zZWN0aW9uID0gZ290X3NlYy0+b3V0cHV0X3NlY3Rpb247Ci0JICAgIH0KLSNlbmRpZgotIAl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSBnbG9iYWwgc3ltYm9sLCBjaGVjayB0aGUgZXhwb3J0IGxpc3QuICAqLwotICAgICAgaWYgKChzeW0tPmZsYWdzICYgKEJTRl9FWFBPUlQgfCBCU0ZfR0xPQkFMKSkgIT0gMCkKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0JICBpbnQgZm91bmRfc2ltcGxlOwotCi0JICAvKiBVbmZvcnR1bmF0ZWx5LCBhIHN5bWJvbCBjYW4gYXBwZWFyIG11bHRpcGxlIHRpbWVzIG9uIHRoZQotCSAgICAgZXhwb3J0IGxpc3QsIHdpdGggYW5kIHdpdGhvdXQgcHJlZml4ZXMuICAqLwotCSAgZm91bmRfc2ltcGxlID0gMDsKLQkgIGZvciAobCA9IGV4cG9ydF9zeW1ib2xzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobC0+c3RyaW5nLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQotCQlmb3VuZF9zaW1wbGUgPSAxOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgKnpiYXNlOwotCi0JCSAgemJhc2UgPSBzdHJjaHIgKGwtPnN0cmluZywgJ0AnKTsKLQkJICBpZiAoemJhc2UgIT0gTlVMTAotCQkgICAgICAmJiBzdHJjbXAgKHpiYXNlICsgMSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSkgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgLyogV2UgbXVzdCBhZGQgYSBzeW1ib2wgd2l0aCB0aGlzIHByZWZpeC4gICovCi0JCSAgICAgIGlmIChuZXdzeW1jb3VudCA+PSBuZXdzeW1hbGxvYykKLQkJCXsKLQkJCSAgbmV3c3ltYWxsb2MgKz0gMTA7Ci0JCQkgIG5ld3N5bXMgPSAoKGFzeW1ib2wgKiopCi0JCQkJICAgICB4cmVhbGxvYyAoKFBUUikgbmV3c3ltcywKLQkJCQkJICAgICAgIChuZXdzeW1hbGxvYwotCQkJCQkJKiBzaXplb2YgKGFzeW1ib2wgKikpKSk7Ci0JCQl9Ci0JCSAgICAgIG5ld3N5bXNbbmV3c3ltY291bnRdID0KLQkJCShhc3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCkpOwotCQkgICAgICAqbmV3c3ltc1tuZXdzeW1jb3VudF0gPSAqc3ltOwotCQkgICAgICBuZXdzeW1zW25ld3N5bWNvdW50XS0+bmFtZSA9IGwtPnN0cmluZzsKLQkJICAgICAgKytuZXdzeW1jb3VudDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBpZiAoISBmb3VuZF9zaW1wbGUpCi0JICAgIHsKLQkgICAgICAvKiBUaGUgdW5tb2RpZmllZCBzeW1ib2wgaXMgYWN0dWFsbHkgbm90IGV4cG9ydGVkIGF0Ci0JCSBhbGwuICAqLwotCSAgICAgIHN5bS0+ZmxhZ3MgJj1+IChCU0ZfR0xPQkFMIHwgQlNGX0VYUE9SVCk7Ci0JICAgICAgc3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIElmIGl0J3MgYW4gdW5kZWZpbmVkIHN5bWJvbCwgc2VlIGlmIGl0J3Mgb24gdGhlIGltcG9ydCBsaXN0LgotCSBDaGFuZ2UgdGhlIHByZWZpeCBpZiBuZWNlc3NhcnkuICAqLwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0KLQkgIGZvciAobCA9IGltcG9ydF9zeW1ib2xzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAobC0+c3RyaW5nLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKSA9PSAwKQotCQlicmVhazsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICp6YmFzZTsKLQotCQkgIHpiYXNlID0gc3RyY2hyIChsLT5zdHJpbmcsICdAJyk7Ci0JCSAgaWYgKHpiYXNlICE9IE5VTEwKLQkJICAgICAgJiYgc3RyY21wICh6YmFzZSArIDEsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN5bS0+bmFtZSA9IGwtPnN0cmluZzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgaWYgKGwgPT0gTlVMTCkKLQkgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgIF8oIiVzOiB3YXJuaW5nOiBzeW1ib2wgJXMgaW1wb3J0ZWQgYnV0IG5vdCBpbiBpbXBvcnQgbGlzdFxuIiksCi0JCSAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKLQl9Ci0JCi0gICAgICAvKiBTZWUgaWYgaXQncyBvbmUgb2YgdGhlIHNwZWNpYWwgbmFtZWQgc3ltYm9scy4gICovCi0gICAgICBpZiAoKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSA9PSAwKQotCXsKLQkgIGJmZF92bWEgdmFsOwotCi0JICAvKiBGSVhNRTogSWYgdGhlc2Ugc3ltYm9scyBhcmUgbm90IGluIHRoZSAudGV4dCBzZWN0aW9uLCB3ZQotCSAgICAgYWRkIHRoZSAudGV4dCBzZWN0aW9uIHNpemUgdG8gdGhlIHZhbHVlLiAgVGhpcyBtYXkgbm90IGJlCi0JICAgICBjb3JyZWN0IGZvciBhbGwgdGFyZ2V0cy4gIEknbSBub3Qgc3VyZSBob3cgdGhpcyBzaG91bGQKLQkgICAgIHJlYWxseSBiZSBoYW5kbGVkLiAgKi8KLQkgIGlmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHN0YXJ0X3Byb2NlZHVyZSkgPT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gZGF0YV9zZWMKLQkJICAmJiB0ZXh0X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJdmFsICs9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgdGV4dF9zZWMpOwotCSAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0YmZkLCB2YWwpKQotCQliZmRfZmF0YWwgKF8oInNldCBzdGFydCBhZGRyZXNzIikpOwotCSAgICAgIGdvdHN0YXJ0ID0gdHJ1ZTsKLQkgICAgfQotCSAgaWYgKHN0cmNtcCAoYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgZXhpdF9wcm9jZWR1cmUpID09IDApCi0JICAgIHsKLQkgICAgICB2YWwgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pID09IGRhdGFfc2VjCi0JCSAgJiYgdGV4dF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JCXZhbCArPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHRleHRfc2VjKTsKLQkgICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5leGl0UHJvY2VkdXJlT2Zmc2V0ID0gdmFsOwotCSAgICAgIGdvdGV4aXQgPSB0cnVlOwotCSAgICB9Ci0JICBpZiAoY2hlY2tfcHJvY2VkdXJlICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGNoZWNrX3Byb2NlZHVyZSkgPT0gMCkKLQkgICAgewotCSAgICAgIHZhbCA9IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pOwotCSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb24gKHN5bSkgPT0gZGF0YV9zZWMKLQkJICAmJiB0ZXh0X3NlYyAhPSAoYXNlY3Rpb24gKikgTlVMTCkKLQkJdmFsICs9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgdGV4dF9zZWMpOwotCSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0ID0gdmFsOwotCSAgICAgIGdvdGNoZWNrID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGVuZHN5bSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGVuZHN5bS0+dmFsdWUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGJzc19zZWMpOwotCi0gICAgICAvKiBGSVhNRTogSWYgYW55IHJlbG9jcyByZWZlcnJpbmcgdG8gX2VuZCB1c2UgaW5wbGFjZSBhZGRlbmRzLAotCSB0aGVuIEkgdGhpbmsgdGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkKLQkgaTM4Nl9tYW5nbGVfcmVsb2NzLiAgSXMgaXQgbmVlZGVkIGZvciBhbnkgb3RoZXIgb2JqZWN0Ci0JIGZvcm1hdHM/ICAqLwotICAgIH0KLQotICBpZiAobmV3c3ltY291bnQgPT0gMCkKLSAgICBvdXRzeW1zID0gc3ltYm9sczsKLSAgZWxzZQotICAgIHsKLSAgICAgIG91dHN5bXMgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoKHN5bWNvdW50ICsgbmV3c3ltY291bnQgKyAxKQotCQkJCSAgICAgICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIG1lbWNweSAob3V0c3ltcywgc3ltYm9scywgc3ltY291bnQgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgbWVtY3B5IChvdXRzeW1zICsgc3ltY291bnQsIG5ld3N5bXMsIG5ld3N5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgIG91dHN5bXNbc3ltY291bnQgKyBuZXdzeW1jb3VudF0gPSBOVUxMOwotICAgIH0KLQotICBiZmRfc2V0X3N5bXRhYiAob3V0YmZkLCBvdXRzeW1zLCBzeW1jb3VudCArIG5ld3N5bWNvdW50KTsKLSAgICAKLSAgaWYgKCEgZ290c3RhcnQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogU1RBUlQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgc3RhcnRfcHJvY2VkdXJlKTsKLSAgaWYgKCEgZ290ZXhpdCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBFWElUIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIGV4aXRfcHJvY2VkdXJlKTsKLSAgaWYgKGNoZWNrX3Byb2NlZHVyZSAhPSBOVUxMCi0gICAgICAmJiAhIGdvdGNoZWNrKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6IENIRUNLIHByb2NlZHVyZSAlcyBub3QgZGVmaW5lZFxuIiksCi0JICAgICBwcm9ncmFtX25hbWUsIGNoZWNrX3Byb2NlZHVyZSk7Ci0KLSAgLyogQWRkIGFkZGl0aW9uYWwgc2VjdGlvbnMgcmVxdWlyZWQgZm9yIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uICAqLwotICBpZiAoY3VzdG9tX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjdXN0b21fZGF0YSA9IGZvcGVuIChjdXN0b21fZmlsZSwgInIiKTsKLSAgICAgIGlmIChjdXN0b21fZGF0YSA9PSBOVUxMCi0JICB8fCBmc3RhdCAoZmlsZW5vIChjdXN0b21fZGF0YSksICZzdCkgPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBjdXN0b21fZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBjdXN0b21fZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGN1c3RvbV9zaXplID0gc3Quc3Rfc2l6ZTsKLQkgIGN1c3RvbV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbWN1c3RvbSIpOwotCSAgaWYgKGN1c3RvbV9zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIGN1c3RvbV9zZWN0aW9uLCBjdXN0b21fc2l6ZSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBjdXN0b21fc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJjdXN0b20gc2VjdGlvbiIpKTsKLQl9Ci0gICAgfQotICBpZiAoaGVscF9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgaGVscF9kYXRhID0gZm9wZW4gKGhlbHBfZmlsZSwgInIiKTsKLSAgICAgIGlmIChoZWxwX2RhdGEgPT0gTlVMTAotCSAgfHwgZnN0YXQgKGZpbGVubyAoaGVscF9kYXRhKSwgJnN0KSA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIGhlbHBfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBoZWxwX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBoZWxwX3NpemUgPSBzdC5zdF9zaXplOwotCSAgaGVscF9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbWhlbHAiKTsKLQkgIGlmIChoZWxwX3NlY3Rpb24gPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgaGVscF9zZWN0aW9uLCBoZWxwX3NpemUpCi0JICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgaGVscF9zZWN0aW9uLAotCQkJCQkgIFNFQ19IQVNfQ09OVEVOVFMpKQotCSAgICBiZmRfZmF0YWwgKF8oImhlbHAgc2VjdGlvbiIpKTsKLQkgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQl9Ci0gICAgfQotICBpZiAobWVzc2FnZV9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgbWVzc2FnZV9kYXRhID0gZm9wZW4gKG1lc3NhZ2VfZmlsZSwgInIiKTsKLSAgICAgIGlmIChtZXNzYWdlX2RhdGEgPT0gTlVMTAotCSAgfHwgZnN0YXQgKGZpbGVubyAobWVzc2FnZV9kYXRhKSwgJnN0KSA8IDApCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIG1lc3NhZ2VfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBtZXNzYWdlX2ZpbGUgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZXNzYWdlX3NpemUgPSBzdC5zdF9zaXplOwotCSAgbWVzc2FnZV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbW1lc3NhZ2VzIik7Ci0JICBpZiAobWVzc2FnZV9zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG1lc3NhZ2Vfc2VjdGlvbiwgbWVzc2FnZV9zaXplKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG1lc3NhZ2Vfc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJtZXNzYWdlIHNlY3Rpb24iKSk7Ci0JICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0JfQotICAgIH0KLSAgaWYgKG1vZHVsZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0KLSAgICAgIG1vZHVsZV9zaXplID0gMDsKLSAgICAgIGZvciAobCA9IG1vZHVsZXM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JbW9kdWxlX3NpemUgKz0gc3RybGVuIChsLT5zdHJpbmcpICsgMTsKLSAgICAgIG1vZHVsZV9zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbW1vZHVsZXMiKTsKLSAgICAgIGlmIChtb2R1bGVfc2VjdGlvbiA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG1vZHVsZV9zZWN0aW9uLCBtb2R1bGVfc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG1vZHVsZV9zZWN0aW9uLAotCQkJCSAgICAgIFNFQ19IQVNfQ09OVEVOVFMpKQotCWJmZF9mYXRhbCAoXygibW9kdWxlIHNlY3Rpb24iKSk7Ci0gICAgfQotICBpZiAocnBjX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBycGNfZGF0YSA9IGZvcGVuIChycGNfZmlsZSwgInIiKTsKLSAgICAgIGlmIChycGNfZGF0YSA9PSBOVUxMCi0JICB8fCBmc3RhdCAoZmlsZW5vIChycGNfZGF0YSksICZzdCkgPCAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBycGNfZmlsZSwKLQkJICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0JICBycGNfZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJwY19zaXplID0gc3Quc3Rfc2l6ZTsKLQkgIHJwY19zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0YmZkLCAiLm5sbXJwYyIpOwotCSAgaWYgKHJwY19zZWN0aW9uID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHJwY19zZWN0aW9uLCBycGNfc2l6ZSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob3V0YmZkLCBycGNfc2VjdGlvbiwKLQkJCQkJICBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgICAgYmZkX2ZhdGFsIChfKCJycGMgc2VjdGlvbiIpKTsKLQkgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQl9Ci0gICAgfQotICBpZiAoc2hhcmVsaWJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNoYXJlZGJmZCA9IGJmZF9vcGVuciAoc2hhcmVsaWJfZmlsZSwgb3V0cHV0X2Zvcm1hdCk7Ci0gICAgICBpZiAoc2hhcmVkYmZkID09IE5VTEwKLQkgIHx8ICEgYmZkX2NoZWNrX2Zvcm1hdCAoc2hhcmVkYmZkLCBiZmRfb2JqZWN0KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczolczogJXNcbiIsIHByb2dyYW1fbmFtZSwgc2hhcmVsaWJfZmlsZSwKLQkJICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgc2hhcmVsaWJfZmlsZSA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNoYXJlZGhkciA9ICpubG1fZml4ZWRfaGVhZGVyIChzaGFyZWRiZmQpOwotCSAgYmZkX2Nsb3NlIChzaGFyZWRiZmQpOwotCSAgc2hhcmVkX2RhdGEgPSBmb3BlbiAoc2hhcmVsaWJfZmlsZSwgInIiKTsKLQkgIGlmIChzaGFyZWRfZGF0YSA9PSBOVUxMCi0JICAgICAgfHwgKGZzdGF0IChmaWxlbm8gKHNoYXJlZF9kYXRhKSwgJnN0KSA8IDApKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUsCi0JCSAgICAgICBzdHJlcnJvciAoZXJybm8pKTsKLQkgICAgICBzaGFyZWxpYl9maWxlID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogSWYgd2Ugd2VyZSBjbGV2ZXIsIHdlIGNvdWxkIGp1c3QgY29weSBvdXQgdGhlCi0JCSBzZWN0aW9ucyBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgd2hpY2ggd2UgYWN0dWFsbHkKLQkJIG5lZWQuICBIb3dldmVyLCB3ZSB3b3VsZCBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlIHNpemVzCi0JCSBvZiB0aGUgZXh0ZXJuYWwgYW5kIHB1YmxpYyBpbmZvcm1hdGlvbiwgYW5kIHRoYXQgY2FuCi0JCSBub3QgYmUgZG9uZSB3aXRob3V0IHJlYWRpbmcgdGhyb3VnaCB0aGVtLiAgKi8KLQkgICAgICBpZiAoc2hhcmVkaGRyLnVuaW5pdGlhbGl6ZWREYXRhU2l6ZSA+IDApCi0JCXsKLQkJICAvKiBUaGVyZSBpcyBubyBwbGFjZSB0byByZWNvcmQgdGhpcyBpbmZvcm1hdGlvbi4gICovCi0JCSAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgXygiJXM6JXM6IHdhcm5pbmc6IHNoYXJlZCBsaWJyYXJpZXMgY2FuIG5vdCBoYXZlIHVuaW5pdGlhbGl6ZWQgZGF0YVxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHNoYXJlbGliX2ZpbGUpOwotCQl9Ci0JICAgICAgc2hhcmVkX29mZnNldCA9IHN0LnN0X3NpemU7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIuY29kZUltYWdlT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLmNvZGVJbWFnZU9mZnNldDsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5kYXRhSW1hZ2VPZmZzZXQpCi0JCXNoYXJlZF9vZmZzZXQgPSBzaGFyZWRoZHIuZGF0YUltYWdlT2Zmc2V0OwotCSAgICAgIGlmIChzaGFyZWRfb2Zmc2V0ID4gKHNpemVfdCkgc2hhcmVkaGRyLnJlbG9jYXRpb25GaXh1cE9mZnNldCkKLQkJc2hhcmVkX29mZnNldCA9IHNoYXJlZGhkci5yZWxvY2F0aW9uRml4dXBPZmZzZXQ7Ci0JICAgICAgaWYgKHNoYXJlZF9vZmZzZXQgPiAoc2l6ZV90KSBzaGFyZWRoZHIuZXh0ZXJuYWxSZWZlcmVuY2VzT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLmV4dGVybmFsUmVmZXJlbmNlc09mZnNldDsKLQkgICAgICBpZiAoc2hhcmVkX29mZnNldCA+IChzaXplX3QpIHNoYXJlZGhkci5wdWJsaWNzT2Zmc2V0KQotCQlzaGFyZWRfb2Zmc2V0ID0gc2hhcmVkaGRyLnB1YmxpY3NPZmZzZXQ7Ci0JICAgICAgc2hhcmVkX3NpemUgPSBzdC5zdF9zaXplIC0gc2hhcmVkX29mZnNldDsKLQkgICAgICBzaGFyZWRfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgIi5ubG1zaGFyZWQiKTsKLQkgICAgICBpZiAoc2hhcmVkX3NlY3Rpb24gPT0gTlVMTAotCQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2hhcmVkX3NlY3Rpb24sCi0JCQkJCSAgICAgc2hhcmVkX3NpemUpCi0JCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG91dGJmZCwgc2hhcmVkX3NlY3Rpb24sCi0JCQkJCSAgICAgIFNFQ19IQVNfQ09OVEVOVFMpKQotCQliZmRfZmF0YWwgKF8oInNoYXJlZCBzZWN0aW9uIikpOwotCSAgICAgIHN0cm5jcHkgKG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnN0YW1wLCAiTWVTc0FnRXMiLCA4KTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogQ2hlY2sgd2hldGhlciBhIHZlcnNpb24gd2FzIGdpdmVuLiAgKi8KLSAgaWYgKHN0cm5jbXAgKHZlcnNpb25faGRyLT5zdGFtcCwgIlZlUnNJb04jIiwgOCkgIT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB3YXJuaW5nOiBObyB2ZXJzaW9uIG51bWJlciBnaXZlblxuIiksCi0JICAgICBwcm9ncmFtX25hbWUpOwotCi0gIC8qIEF0IGxlYXN0IGZvciBub3csIGFsd2F5cyBjcmVhdGUgYW4gZXh0ZW5kZWQgaGVhZGVyLCBiZWNhdXNlIHRoYXQKLSAgICAgaXMgd2hhdCBOTE1MSU5LIGRvZXMuICAqLwotICBzdHJuY3B5IChubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIk1lU3NBZ0VzIiwgOCk7Ci0KLSAgc3RybmNweSAobmxtX2N5Z251c19leHRfaGVhZGVyIChvdXRiZmQpLT5zdGFtcCwgIkN5R25Vc0V4IiwgOCk7Ci0KLSAgLyogSWYgdGhlIGRhdGUgd2FzIG5vdCBnaXZlbiwgZm9yY2UgaXQgaW4uICAqLwotICBpZiAobmxtX3ZlcnNpb25faGVhZGVyIChvdXRiZmQpLT5tb250aCA9PSAwCi0gICAgICAmJiBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPmRheSA9PSAwCi0gICAgICAmJiBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPnllYXIgPT0gMCkKLSAgICB7Ci0gICAgICB0aW1lX3Qgbm93OwotICAgICAgc3RydWN0IHRtICpwdG07Ci0KLSAgICAgIHRpbWUgKCZub3cpOwotICAgICAgcHRtID0gbG9jYWx0aW1lICgmbm93KTsKLSAgICAgIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+bW9udGggPSBwdG0tPnRtX21vbiArIDE7Ci0gICAgICBubG1fdmVyc2lvbl9oZWFkZXIgKG91dGJmZCktPmRheSA9IHB0bS0+dG1fbWRheTsKLSAgICAgIG5sbV92ZXJzaW9uX2hlYWRlciAob3V0YmZkKS0+eWVhciA9IHB0bS0+dG1feWVhciArIDE5MDA7Ci0gICAgICBzdHJuY3B5ICh2ZXJzaW9uX2hkci0+c3RhbXAsICJWZVJzSW9OIyIsIDgpOwotICAgIH0KLQotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotICAvKiBSZXNvbHZlIHRoZSBzdHVicyB3ZSBidWlsZCBmb3IgUG93ZXJQQyBOZXRXYXJlLiAgKi8KLSAgaWYgKGJmZF9nZXRfYXJjaCAoaW5iZmQpID09IGJmZF9hcmNoX3Bvd2VycGMpCi0gICAgcG93ZXJwY19yZXNvbHZlX3N0dWJzIChpbmJmZCwgb3V0YmZkKTsKLSNlbmRpZgotCi0gIC8qIENvcHkgb3ZlciB0aGUgc2VjdGlvbnMuICAqLwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGluYmZkLCBjb3B5X3NlY3Rpb25zLCAoUFRSKSBvdXRiZmQpOwotCi0gIC8qIEZpbmlzaCB1cCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGN1c3RvbV9maWxlICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChjdXN0b21fc2l6ZSk7Ci0gICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIGN1c3RvbV9zaXplLCBjdXN0b21fZGF0YSkgIT0gY3VzdG9tX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIGN1c3RvbV9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIGN1c3RvbV9zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgY3VzdG9tX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oImN1c3RvbSBzZWN0aW9uIikpOwotCSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+Y3VzdG9tRGF0YU9mZnNldCA9Ci0JICAgIGN1c3RvbV9zZWN0aW9uLT5maWxlcG9zOwotCSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+Y3VzdG9tRGF0YVNpemUgPSBjdXN0b21fc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmICghIGRlYnVnX2luZm8pCi0gICAgewotICAgICAgLyogQXMgYSBzcGVjaWFsIGhhY2ssIHRoZSBiYWNrZW5kIHJlY29nbml6ZXMgYSBkZWJ1Z0luZm9PZmZzZXQKLQkgb2YgLTEgdG8gbWVhbiB0aGF0IGl0IHNob3VsZCBub3Qgb3V0cHV0IGFueSBkZWJ1Z2dpbmcKLQkgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBub3QgYmUgaGFuZGxpbmcgYnkgZmlkZGxpbmcgd2l0aCB0aGUKLQkgc3ltYm9sIHRhYmxlIGJlY2F1c2UgZXhwb3J0ZWQgc3ltYm9scyBhcHBlYXIgaW4gYm90aCB0aGUKLQkgZXhwb3J0IGluZm9ybWF0aW9uIGFuZCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgICAgIG5sbV9maXhlZF9oZWFkZXIgKG91dGJmZCktPmRlYnVnSW5mb09mZnNldCA9IChmaWxlX3B0cikgLTE7Ci0gICAgfQotICBpZiAobWFwX2ZpbGUgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICBfKCIlczogd2FybmluZzogTUFQIGFuZCBGVUxMTUFQIGFyZSBub3Qgc3VwcG9ydGVkOyB0cnkgbGQgLU1cbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lKTsKLSAgaWYgKGhlbHBfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAoaGVscF9zaXplKTsKLSAgICAgIGlmIChmcmVhZCAoZGF0YSwgMSwgaGVscF9zaXplLCBoZWxwX2RhdGEpICE9IGhlbHBfc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgaGVscF9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIGhlbHBfc2VjdGlvbiwgZGF0YSwKLQkJCQkJICAoZmlsZV9wdHIpIDAsIGhlbHBfc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygiaGVscCBzZWN0aW9uIikpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+aGVscEZpbGVPZmZzZXQgPQotCSAgICBoZWxwX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5oZWxwRmlsZUxlbmd0aCA9IGhlbHBfc2l6ZTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmIChtZXNzYWdlX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKG1lc3NhZ2Vfc2l6ZSk7Ci0gICAgICBpZiAoZnJlYWQgKGRhdGEsIDEsIG1lc3NhZ2Vfc2l6ZSwgbWVzc2FnZV9kYXRhKSAhPSBtZXNzYWdlX3NpemUpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczolczogcmVhZDogJXNcbiIpLCBwcm9ncmFtX25hbWUsIG1lc3NhZ2VfZmlsZSwKLQkJIHN0cmVycm9yIChlcnJubykpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBtZXNzYWdlX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBtZXNzYWdlX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oIm1lc3NhZ2Ugc2VjdGlvbiIpKTsKLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPm1lc3NhZ2VGaWxlT2Zmc2V0ID0KLQkgICAgbWVzc2FnZV9zZWN0aW9uLT5maWxlcG9zOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+bWVzc2FnZUZpbGVMZW5ndGggPSBtZXNzYWdlX3NpemU7Ci0KLQkgIC8qIEZJWE1FOiBBcmUgdGhlc2Ugb2Zmc2V0cyBjb3JyZWN0IG9uIGFsbCBwbGF0Zm9ybXM/ICBBcmUKLQkgICAgIHRoZXkgMzIgYml0cyBvbiBhbGwgcGxhdGZvcm1zPyAgV2hhdCBlbmRpYW5uZXNzPyAgKi8KLQkgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPmxhbmd1YWdlSUQgPQotCSAgICBiZmRfaF9nZXRfMzIgKG91dGJmZCwgKGJmZF9ieXRlICopIGRhdGEgKyAxMDYpOwotCSAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+bWVzc2FnZUNvdW50ID0KLQkgICAgYmZkX2hfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBkYXRhICsgMTEwKTsKLQl9Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGlmIChtb2R1bGVzICE9IE5VTEwpCi0gICAgewotICAgICAgUFRSIGRhdGE7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpzZXQ7Ci0gICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGM7Ci0KLSAgICAgIGRhdGEgPSB4bWFsbG9jIChtb2R1bGVfc2l6ZSk7Ci0gICAgICBjID0gMDsKLSAgICAgIHNldCA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGE7Ci0gICAgICBmb3IgKGwgPSBtb2R1bGVzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLQkgICpzZXQgPSBzdHJsZW4gKGwtPnN0cmluZyk7Ci0JICBzdHJuY3B5IChzZXQgKyAxLCBsLT5zdHJpbmcsICpzZXQpOwotCSAgc2V0ICs9ICpzZXQgKyAxOwotCSAgKytjOwotCX0KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBtb2R1bGVfc2VjdGlvbiwgZGF0YSwKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIG1vZHVsZV9zaXplKSkKLQliZmRfZmF0YWwgKF8oIm1vZHVsZSBzZWN0aW9uIikpOwotICAgICAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlRGVwZW5kZW5jeU9mZnNldCA9Ci0JbW9kdWxlX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5udW1iZXJPZk1vZHVsZURlcGVuZGVuY2llcyA9IGM7Ci0gICAgfQotICBpZiAocnBjX2ZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBQVFIgZGF0YTsKLQotICAgICAgZGF0YSA9IHhtYWxsb2MgKHJwY19zaXplKTsKLSAgICAgIGlmIChmcmVhZCAoZGF0YSwgMSwgcnBjX3NpemUsIHJwY19kYXRhKSAhPSBycGNfc2l6ZSkKLQlmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVzOiByZWFkOiAlc1xuIiksIHByb2dyYW1fbmFtZSwgcnBjX2ZpbGUsCi0JCSBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgcnBjX3NlY3Rpb24sIGRhdGEsCi0JCQkJCSAgKGZpbGVfcHRyKSAwLCBycGNfc2l6ZSkpCi0JICAgIGJmZF9mYXRhbCAoXygicnBjIHNlY3Rpb24iKSk7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5SUENEYXRhT2Zmc2V0ID0KLQkgICAgcnBjX3NlY3Rpb24tPmZpbGVwb3M7Ci0JICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5SUENEYXRhTGVuZ3RoID0gcnBjX3NpemU7Ci0JfQotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgfQotICBpZiAoc2hhcmVsaWJfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIFBUUiBkYXRhOwotCi0gICAgICBkYXRhID0geG1hbGxvYyAoc2hhcmVkX3NpemUpOwotICAgICAgaWYgKGZzZWVrIChzaGFyZWRfZGF0YSwgc2hhcmVkX29mZnNldCwgU0VFS19TRVQpICE9IDAKLQkgIHx8IGZyZWFkIChkYXRhLCAxLCBzaGFyZWRfc2l6ZSwgc2hhcmVkX2RhdGEpICE9IHNoYXJlZF9zaXplKQotCWZwcmludGYgKHN0ZGVyciwgXygiJXM6JXM6IHJlYWQ6ICVzXG4iKSwgcHJvZ3JhbV9uYW1lLCBzaGFyZWxpYl9maWxlLAotCQkgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNoYXJlZF9zZWN0aW9uLCBkYXRhLAotCQkJCQkgIChmaWxlX3B0cikgMCwgc2hhcmVkX3NpemUpKQotCSAgICBiZmRfZmF0YWwgKF8oInNoYXJlZCBzZWN0aW9uIikpOwotCX0KLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZENvZGVPZmZzZXQgPQotCXNoYXJlZGhkci5jb2RlSW1hZ2VPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRDb2RlTGVuZ3RoID0KLQlzaGFyZWRoZHIuY29kZUltYWdlU2l6ZTsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZERhdGFPZmZzZXQgPQotCXNoYXJlZGhkci5kYXRhSW1hZ2VPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREYXRhTGVuZ3RoID0KLQlzaGFyZWRoZHIuZGF0YUltYWdlU2l6ZTsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldCA9Ci0JKHNoYXJlZGhkci5yZWxvY2F0aW9uRml4dXBPZmZzZXQKLQkgLSBzaGFyZWRfb2Zmc2V0Ci0JICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3MpOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUmVsb2NhdGlvbkZpeHVwQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZlJlbG9jYXRpb25GaXh1cHM7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldCA9Ci0JKHNoYXJlZGhkci5leHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQKLQkgLSBzaGFyZWRfb2Zmc2V0Ci0JICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3MpOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudCA9Ci0Jc2hhcmVkaGRyLm51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzOwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+c2hhcmVkUHVibGljc09mZnNldCA9Ci0Jc2hhcmVkaGRyLnB1YmxpY3NPZmZzZXQgLSBzaGFyZWRfb2Zmc2V0ICsgc2hhcmVkX3NlY3Rpb24tPmZpbGVwb3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWRQdWJsaWNzQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZlB1YmxpY3M7Ci0gICAgICBubG1fZXh0ZW5kZWRfaGVhZGVyIChvdXRiZmQpLT5zaGFyZWREZWJ1Z1JlY29yZE9mZnNldCA9Ci0Jc2hhcmVkaGRyLmRlYnVnSW5mb09mZnNldCAtIHNoYXJlZF9vZmZzZXQgKyBzaGFyZWRfc2VjdGlvbi0+ZmlsZXBvczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPnNoYXJlZERlYnVnUmVjb3JkQ291bnQgPQotCXNoYXJlZGhkci5udW1iZXJPZkRlYnVnUmVjb3JkczsKLSAgICAgIG5sbV9leHRlbmRlZF9oZWFkZXIgKG91dGJmZCktPlNoYXJlZEluaXRpYWxpemF0aW9uT2Zmc2V0ID0KLQlzaGFyZWRoZHIuY29kZVN0YXJ0T2Zmc2V0OwotICAgICAgbmxtX2V4dGVuZGVkX2hlYWRlciAob3V0YmZkKS0+U2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldCA9Ci0Jc2hhcmVkaGRyLmV4aXRQcm9jZWR1cmVPZmZzZXQ7Ci0gICAgICBmcmVlIChkYXRhKTsKLSAgICB9Ci0gIGxlbiA9IHN0cmxlbiAob3V0cHV0X2ZpbGUpOwotICBpZiAobGVuID4gTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAyKQotICAgIGxlbiA9IE5MTV9NT0RVTEVfTkFNRV9TSVpFIC0gMjsKLSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZVswXSA9IGxlbjsKLQotICBzdHJuY3B5IChubG1fZml4ZWRfaGVhZGVyIChvdXRiZmQpLT5tb2R1bGVOYW1lICsgMSwgb3V0cHV0X2ZpbGUsCi0JICAgTkxNX01PRFVMRV9OQU1FX1NJWkUgLSAyKTsKLSAgbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZVtOTE1fTU9EVUxFX05BTUVfU0laRSAtIDFdID0gJ1wwJzsKLSAgZm9yIChtb2RuYW1lID0gbmxtX2ZpeGVkX2hlYWRlciAob3V0YmZkKS0+bW9kdWxlTmFtZTsKLSAgICAgICAqbW9kbmFtZSAhPSAnXDAnOwotICAgICAgIG1vZG5hbWUrKykKLSAgICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICptb2RuYW1lKSkKLSAgICAgICptb2RuYW1lID0gdG91cHBlciAoKm1vZG5hbWUpOwotCi0gIHN0cm5jcHkgKG5sbV92YXJpYWJsZV9oZWFkZXIgKG91dGJmZCktPm9sZFRocmVhZE5hbWUsICIgTE9ORyIsCi0JICAgTkxNX09MRF9USFJFQURfTkFNRV9MRU5HVEgpOwotCi0gIG5sbV9jeWdudXNfZXh0X2hlYWRlciAob3V0YmZkKS0+b2Zmc2V0ID0gc2Vjc2VjLT5maWxlcG9zOwotICBubG1fY3lnbnVzX2V4dF9oZWFkZXIgKG91dGJmZCktPmxlbmd0aCA9IGJmZF9zZWN0aW9uX3NpemUgKG91dGJmZCwgc2Vjc2VjKTsKLQotICBpZiAoISBiZmRfY2xvc2UgKG91dGJmZCkpCi0gICAgYmZkX2ZhdGFsIChvdXRwdXRfZmlsZSk7Ci0gIGlmICghIGJmZF9jbG9zZSAoaW5iZmQpKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKHVubGlua19vbl9leGl0ICE9IE5VTEwpCi0gICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBEaXNwbGF5IGEgaGVscCBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNob3dfaGVscCAoKQotewotICBwcmludGYgKF8oIiVzOiBDb252ZXJ0IGFuIG9iamVjdCBmaWxlIGludG8gYSBOZXRXYXJlIExvYWRhYmxlIE1vZHVsZVxuIiksCi0JICBwcm9ncmFtX25hbWUpOwotICBzaG93X3VzYWdlIChzdGRvdXQsIDApOwotfQotCi0vKiBTaG93IGEgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlwKLVVzYWdlOiAlcyBbLWRoVl0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLVQgaGVhZGVyLWZpbGVdIFstbCBsaW5rZXJdXG5cCi0gICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLS1oZWFkZXItZmlsZT1maWxlXSBbLS1saW5rZXI9bGlua2VyXSBbLS1kZWJ1Z11cblwKLSAgICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXVxuXAotICAgICAgIFtpbi1maWxlIFtvdXQtZmlsZV1dXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoZmlsZSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0MCi0vKiBTZWxlY3QgdGhlIG91dHB1dCBmb3JtYXQgYmFzZWQgb24gdGhlIGlucHV0IGFyY2hpdGVjdHVyZSwgbWFjaGluZSwKLSAgIGFuZCBlbmRpYW5uZXNzLiAgVGhpcyBjaG9vc2VzIHRoZSBhcHByb3ByaWF0ZSBOTE0gdGFyZ2V0LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotc2VsZWN0X291dHB1dF9mb3JtYXQgKGFyY2gsIG1hY2gsIGJpZ2VuZGlhbikKLSAgICAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLSAgICAgYm9vbGVhbiBiaWdlbmRpYW47Ci17Ci0gIHN3aXRjaCAoYXJjaCkKLSAgICB7Ci0jaWZkZWYgTkxNQ09OVl9JMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgcmV0dXJuICJubG0zMi1pMzg2IjsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfU1BBUkMKLSAgICBjYXNlIGJmZF9hcmNoX3NwYXJjOgotICAgICAgcmV0dXJuICJubG0zMi1zcGFyYyI7Ci0jZW5kaWYKLSNpZmRlZiBOTE1DT05WX0FMUEhBCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIHJldHVybiAibmxtMzItYWxwaGEiOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgcmV0dXJuICJubG0zMi1wb3dlcnBjIjsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBzdXBwb3J0IG5vdCBjb21waWxlZCBpbiBmb3IgJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhcmNoLCBtYWNoKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICAgIC8qIEF2b2lkIHdhcm5pbmcuICAqLwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAvKk5PVFJFQUNIRUQqLwotfQotDAotLyogVGhlIEJGRCBzZWN0aW9ucyBhcmUgY29waWVkIGluIHR3byBwYXNzZXMuICBUaGlzIGZ1bmN0aW9uIHNlbGVjdHMKLSAgIHRoZSBvdXRwdXQgc2VjdGlvbiBmb3IgZWFjaCBpbnB1dCBzZWN0aW9uLCBhbmQgc2V0cyB1cCB0aGUgc2VjdGlvbgotICAgbmFtZSwgc2l6ZSwgZXRjLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldHVwX3NlY3Rpb25zIChpbmJmZCwgaW5zZWMsIGRhdGFfcHRyKQotICAgICBiZmQgKmluYmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIFBUUiBkYXRhX3B0cjsKLXsKLSAgYmZkICpvdXRiZmQgPSAoYmZkICopIGRhdGFfcHRyOwotICBmbGFnd29yZCBmOwotICBjb25zdCBjaGFyICpvdXRuYW1lOwotICBhc2VjdGlvbiAqb3V0c2VjOwotICBiZmRfdm1hIG9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBhbGlnbjsKLSAgYmZkX3NpemVfdHlwZSBhZGQ7Ci0gIGJmZF9zaXplX3R5cGUgc2Vjc2Vjc2l6ZTsKLQotICBmID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChpbmJmZCwgaW5zZWMpOwotICBpZiAoZiAmIFNFQ19DT0RFKQotICAgIG91dG5hbWUgPSBOTE1fQ09ERV9OQU1FOwotICBlbHNlIGlmICgoZiAmIFNFQ19MT0FEKSAmJiAoZiAmIFNFQ19IQVNfQ09OVEVOVFMpKQotICAgIG91dG5hbWUgPSBOTE1fSU5JVElBTElaRURfREFUQV9OQU1FOwotICBlbHNlIGlmIChmICYgU0VDX0FMTE9DKQotICAgIG91dG5hbWUgPSBOTE1fVU5JTklUSUFMSVpFRF9EQVRBX05BTUU7Ci0gIGVsc2UKLSAgICBvdXRuYW1lID0gYmZkX3NlY3Rpb25fbmFtZSAoaW5iZmQsIGluc2VjKTsKLQotICBvdXRzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0YmZkLCBvdXRuYW1lKTsKLSAgaWYgKG91dHNlYyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG91dHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dGJmZCwgb3V0bmFtZSk7Ci0gICAgICBpZiAob3V0c2VjID09IE5VTEwpCi0JYmZkX2ZhdGFsIChfKCJtYWtlIHNlY3Rpb24iKSk7Ci0gICAgfQotCi0gIGluc2VjLT5vdXRwdXRfc2VjdGlvbiA9IG91dHNlYzsKLQotICBvZmZzZXQgPSBiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYyk7Ci0gIGFsaWduID0gMSA8PCBiZmRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBpbnNlYyk7Ci0gIGFkZCA9ICgob2Zmc2V0ICsgYWxpZ24gLSAxKSAmfiAoYWxpZ24gLSAxKSkgLSBvZmZzZXQ7Ci0gIGluc2VjLT5vdXRwdXRfb2Zmc2V0ID0gb2Zmc2V0ICsgYWRkOwotCi0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYywKLQkJCSAgICAgIChiZmRfc2VjdGlvbl9zaXplIChvdXRiZmQsIG91dHNlYykKLQkJCSAgICAgICArIGJmZF9zZWN0aW9uX3NpemUgKGluYmZkLCBpbnNlYykKLQkJCSAgICAgICArIGFkZCkpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IHNlY3Rpb24gc2l6ZSIpKTsKLQotICBpZiAoKGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGluc2VjKQotICAgICAgID4gYmZkX3NlY3Rpb25fYWxpZ25tZW50IChvdXRiZmQsIG91dHNlYykpCi0gICAgICAmJiAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKG91dGJmZCwgb3V0c2VjLAotCQkJCSAgICAgIGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGluc2VjKSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgc2VjdGlvbiBhbGlnbm1lbnQiKSk7Ci0KLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG91dHNlYywKLQkJCSAgICAgICBmIHwgYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChvdXRiZmQsIG91dHNlYykpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IHNlY3Rpb24gZmxhZ3MiKSk7Ci0KLSAgYmZkX3NldF9yZWxvYyAob3V0YmZkLCBvdXRzZWMsIChhcmVsZW50ICoqKSBOVUxMLCAwKTsKLQotICAvKiBGb3IgZWFjaCBpbnB1dCBzZWN0aW9uIHdlIGFsbG9jYXRlIHNwYWNlIGZvciBhbiBlbnRyeSBpbgotICAgICAubmxtc2VjdGlvbnMuICAqLwotICBzZWNzZWNzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAob3V0YmZkLCBzZWNzZWMpOwotICBzZWNzZWNzaXplICs9IHN0cmxlbiAoYmZkX3NlY3Rpb25fbmFtZSAoaW5iZmQsIGluc2VjKSkgKyAxOwotICBzZWNzZWNzaXplID0gKHNlY3NlY3NpemUgKyAzKSAmfiAzOwotICBzZWNzZWNzaXplICs9IDg7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvdXRiZmQsIHNlY3NlYywgc2Vjc2Vjc2l6ZSkpCi0gICAgYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb25zIHNpemUiKSk7Ci19Ci0KLS8qIENvcHkgdGhlIHNlY3Rpb24gY29udGVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9zZWN0aW9ucyAoaW5iZmQsIGluc2VjLCBkYXRhX3B0cikKLSAgICAgYmZkICppbmJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICBQVFIgZGF0YV9wdHI7Ci17Ci0gIHN0YXRpYyBiZmRfc2l6ZV90eXBlIHNlY3NlY29mZiA9IDA7Ci0gIGJmZCAqb3V0YmZkID0gKGJmZCAqKSBkYXRhX3B0cjsKLSAgY29uc3QgY2hhciAqaW5uYW1lOwotICBhc2VjdGlvbiAqb3V0c2VjOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIFBUUiBjb250ZW50czsKLSAgbG9uZyByZWxvY19zaXplOwotICBiZmRfYnl0ZSBidWZbNF07Ci0gIGJmZF9zaXplX3R5cGUgYWRkOwotCi0gIGlubmFtZSA9IGJmZF9zZWN0aW9uX25hbWUgKGluYmZkLCBpbnNlYyk7Ci0KLSAgb3V0c2VjID0gaW5zZWMtPm91dHB1dF9zZWN0aW9uOwotICBhc3NlcnQgKG91dHNlYyAhPSBOVUxMKTsKLQotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChpbnNlYyk7Ci0KLSAgLyogRklYTUU6IFdoeSBhcmUgdGhlc2UgbmVjZXNzYXJ5PyAgKi8KLSAgaW5zZWMtPl9jb29rZWRfc2l6ZSA9IGluc2VjLT5fcmF3X3NpemU7Ci0gIGluc2VjLT5yZWxvY19kb25lID0gdHJ1ZTsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIGluc2VjKSAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDApCi0gICAgY29udGVudHMgPSBOVUxMOwotICBlbHNlCi0gICAgewotICAgICAgY29udGVudHMgPSB4bWFsbG9jIChzaXplKTsKLSAgICAgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaW5iZmQsIGluc2VjLCBjb250ZW50cywKLQkJCQkgICAgICAoZmlsZV9wdHIpIDAsIHNpemUpKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaW5iZmQpKTsKLSAgICB9Ci0KLSAgcmVsb2Nfc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGluYmZkLCBpbnNlYyk7Ci0gIGlmIChyZWxvY19zaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGluYmZkKSk7Ci0gIGlmIChyZWxvY19zaXplICE9IDApCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbG9jczsKLSAgICAgIGxvbmcgcmVsb2NfY291bnQ7Ci0KLSAgICAgIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxvY19zaXplKTsKLSAgICAgIHJlbG9jX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoaW5iZmQsIGluc2VjLCByZWxvY3MsIHN5bWJvbHMpOwotICAgICAgaWYgKHJlbG9jX2NvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGluYmZkKSk7Ci0gICAgICBtYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCAmcmVsb2NzLCAmcmVsb2NfY291bnQsIChjaGFyICopIGNvbnRlbnRzLAotCQkgICAgIHNpemUpOwotCi0gICAgICAvKiBGSVhNRTogcmVmZXJzIHRvIGludGVybmFsIEJGRCBmaWVsZHMuICAqLwotICAgICAgaWYgKG91dHNlYy0+b3JlbG9jYXRpb24gIT0gKGFyZWxlbnQgKiopIE5VTEwpCi0JewotCSAgYmZkX3NpemVfdHlwZSB0b3RhbF9jb3VudDsKLQkgIGFyZWxlbnQgKipjb21iaW5lZDsKLQotCSAgdG90YWxfY291bnQgPSByZWxvY19jb3VudCArIG91dHNlYy0+cmVsb2NfY291bnQ7Ci0JICBjb21iaW5lZCA9IChhcmVsZW50ICoqKSB4bWFsbG9jICh0b3RhbF9jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0JICBtZW1jcHkgKGNvbWJpbmVkLCBvdXRzZWMtPm9yZWxvY2F0aW9uLAotCQkgIG91dHNlYy0+cmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotCSAgbWVtY3B5IChjb21iaW5lZCArIG91dHNlYy0+cmVsb2NfY291bnQsIHJlbG9jcywKLQkJICAoc2l6ZV90KSAocmVsb2NfY291bnQgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGZyZWUgKG91dHNlYy0+b3JlbG9jYXRpb24pOwotCSAgcmVsb2NfY291bnQgPSB0b3RhbF9jb3VudDsKLQkgIHJlbG9jcyA9IGNvbWJpbmVkOwotCX0KLQotICAgICAgYmZkX3NldF9yZWxvYyAob3V0YmZkLCBvdXRzZWMsIHJlbG9jcywgcmVsb2NfY291bnQpOwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgb3V0c2VjLCBjb250ZW50cywKLQkJCQkgICAgICBpbnNlYy0+b3V0cHV0X29mZnNldCwgc2l6ZSkpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChvdXRiZmQpKTsKLSAgICAgIGZyZWUgKGNvbnRlbnRzKTsKLSAgICB9Ci0KLSAgLyogQWRkIHRoaXMgc2VjdGlvbiB0byAubmxtc2VjdGlvbnMuICAqLwotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKG91dGJmZCwgc2Vjc2VjLCAoUFRSKSBpbm5hbWUsIHNlY3NlY29mZiwKLQkJCQkgIHN0cmxlbiAoaW5uYW1lKSArIDEpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOwotICBzZWNzZWNvZmYgKz0gc3RybGVuIChpbm5hbWUpICsgMTsKLQotICBhZGQgPSAoKHNlY3NlY29mZiArIDMpICZ+IDMpIC0gc2Vjc2Vjb2ZmOwotICBpZiAoYWRkICE9IDApCi0gICAgewotICAgICAgYmZkX2hfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSAwLCBidWYpOwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgYnVmLCBzZWNzZWNvZmYsIGFkZCkpCi0JYmZkX2ZhdGFsIChfKCJzZXQgLm5sbXNlY3Rpb24gY29udGVudHMiKSk7Ci0gICAgICBzZWNzZWNvZmYgKz0gYWRkOwotICAgIH0KLQotICBpZiAoY29udGVudHMgIT0gTlVMTCkKLSAgICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIG91dHNlYy0+ZmlsZXBvcywgYnVmKTsKLSAgZWxzZQotICAgIGJmZF9oX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgMCwgYnVmKTsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsIHNlY3NlYywgYnVmLCBzZWNzZWNvZmYsIDQpKQotICAgIGJmZF9mYXRhbCAoXygic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIikpOwotICBzZWNzZWNvZmYgKz0gNDsKLQotICBiZmRfaF9wdXRfMzIgKG91dGJmZCwgKGJmZF92bWEpIHNpemUsIGJ1Zik7Ci0gIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob3V0YmZkLCBzZWNzZWMsIGJ1Ziwgc2Vjc2Vjb2ZmLCA0KSkKLSAgICBiZmRfZmF0YWwgKF8oInNldCAubmxtc2VjdGlvbiBjb250ZW50cyIpKTsKLSAgc2Vjc2Vjb2ZmICs9IDQ7Ci19Ci0KLS8qIFNvbWUsIHBlcmhhcHMgYWxsLCBOZXRXYXJlIHRhcmdldHMgcmVxdWlyZSBjaGFuZ2luZyB0aGUgcmVsb2NzIHVzZWQKLSAgIGJ5IHRoZSBpbnB1dCBmb3JtYXRzLiAgKi8KLQotc3RhdGljIHZvaWQKLW1hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwgY29udGVudHMsCi0JICAgICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAob3V0YmZkKSkKLSAgICB7Ci0jaWZkZWYgTkxNQ09OVl9JMzg2Ci0gICAgY2FzZSBiZmRfYXJjaF9pMzg2OgotICAgICAgaTM4Nl9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCi0JCQkgIGNvbnRlbnRzLCBjb250ZW50c19zaXplKTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTkxNQ09OVl9BTFBIQQotICAgIGNhc2UgYmZkX2FyY2hfYWxwaGE6Ci0gICAgICBhbHBoYV9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsCi0JCQkgICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE5MTUNPTlZfUE9XRVJQQwotICAgIGNhc2UgYmZkX2FyY2hfcG93ZXJwYzoKLSAgICAgIHBvd2VycGNfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLAotCQkJICAgICBjb250ZW50cywgY29udGVudHNfc2l6ZSk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotICAgIGRlZmF1bHQ6Ci0gICAgICBkZWZhdWx0X21hbmdsZV9yZWxvY3MgKG91dGJmZCwgaW5zZWMsIHJlbG9jc19wdHIsIHJlbG9jX2NvdW50X3B0ciwKLQkJCSAgICAgY29udGVudHMsIGNvbnRlbnRzX3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBCeSBkZWZhdWx0IGFsbCB3ZSBuZWVkIHRvIGRvIGZvciByZWxvY3MgaXMgY2hhbmdlIHRoZSBhZGRyZXNzIGJ5Ci0gICB0aGUgb3V0cHV0X29mZnNldC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLWRlZmF1bHRfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkJICAgICAgIGNvbnRlbnRzX3NpemUpCi0gICAgIGJmZCAqb3V0YmZkOwotICAgICBhc2VjdGlvbiAqaW5zZWM7Ci0gICAgIGFyZWxlbnQgKioqcmVsb2NzX3B0cjsKLSAgICAgbG9uZyAqcmVsb2NfY291bnRfcHRyOwotICAgICBjaGFyICpjb250ZW50czsKLSAgICAgYmZkX3NpemVfdHlwZSBjb250ZW50c19zaXplOwotewotICBpZiAoaW5zZWMtPm91dHB1dF9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBsb25nIHJlbG9jX2NvdW50OwotICAgICAgcmVnaXN0ZXIgYXJlbGVudCAqKnJlbG9jczsKLSAgICAgIHJlZ2lzdGVyIGxvbmcgaTsKLQotICAgICAgcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOwotICAgICAgcmVsb2NzID0gKnJlbG9jc19wdHI7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcmVsb2NfY291bnQ7IGkrKywgcmVsb2NzKyspCi0JKCpyZWxvY3MpLT5hZGRyZXNzICs9IGluc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLX0KLQwKLSNpZmRlZiBOTE1DT05WX0kzODYKLQotLyogTmV0V2FyZSBvbiB0aGUgaTM4NiBzdXBwb3J0cyBhIHJlc3RyaWN0ZWQgc2V0IG9mIHJlbG9jcywgd2hpY2ggYXJlCi0gICBkaWZmZXJlbnQgZnJvbSB0aG9zZSB1c2VkIG9uIG90aGVyIGkzODYgdGFyZ2V0cy4gIFRoaXMgcm91dGluZQotICAgY29udmVydHMgdGhlIHJlbG9jcy4gIEl0IGlzLCBvYnZpb3VzbHksIHZlcnkgdGFyZ2V0IGRlcGVuZGVudC4gIEF0Ci0gICB0aGUgbW9tZW50LCB0aGUgbmxtMzItaTM4NiBiYWNrZW5kIHBlcmZvcm1zIHNpbWlsYXIgdHJhbnNsYXRpb25zOwotICAgaG93ZXZlciwgaXQgaXMgbW9yZSByZWxpYWJsZSBhbmQgZWZmaWNpZW50IHRvIGRvIHRoZW0gaGVyZS4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbV9pMzg2X3BjcmVsX2hvd3RvID0KLSAgSE9XVE8gKDEsCQkJLyogdHlwZSAqLwotCSAwLAkJCS8qIHJpZ2h0c2hpZnQgKi8KLQkgMiwJCQkvKiBzaXplICgwID0gYnl0ZSwgMSA9IHNob3J0LCAyID0gbG9uZykgKi8KLQkgMzIsCQkJLyogYml0c2l6ZSAqLwotCSB0cnVlLAkJCS8qIHBjX3JlbGF0aXZlICovCi0JIDAsCQkJLyogYml0cG9zICovCi0JIGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCwgLyogY29tcGxhaW5fb25fb3ZlcmZsb3cgKi8KLQkgMCwJCQkvKiBzcGVjaWFsX2Z1bmN0aW9uICovCi0JICJESVNQMzIiLAkJLyogbmFtZSAqLwotCSB0cnVlLAkJCS8qIHBhcnRpYWxfaW5wbGFjZSAqLwotCSAweGZmZmZmZmZmLAkJLyogc3JjX21hc2sgKi8KLQkgMHhmZmZmZmZmZiwJCS8qIGRzdF9tYXNrICovCi0JIHRydWUpOwkJCS8qIHBjcmVsX29mZnNldCAqLwotCi1zdGF0aWMgdm9pZAotaTM4Nl9tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCQkgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIGxvbmcgcmVsb2NfY291bnQsIGk7Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0KLSAgcmVsb2NfY291bnQgPSAqcmVsb2NfY291bnRfcHRyOwotICByZWxvY3MgPSAqcmVsb2NzX3B0cjsKLSAgZm9yIChpID0gMDsgaSA8IHJlbG9jX2NvdW50OyBpKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsOwotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgYmZkX3NpemVfdHlwZSBhZGRyZXNzOwotICAgICAgYmZkX3ZtYSBhZGRlbmQ7Ci0KLSAgICAgIHJlbCA9ICpyZWxvY3MrKzsKLSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCi0gICAgICAvKiBXZSdyZSBtb3ZpbmcgdGhlIHJlbG9jcyBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQKLQkgc2VjdGlvbiwgc28gd2UgbXVzdCBhZGp1c3QgdGhlIGFkZHJlc3MgYWNjb3JkaW5nbHkuICAqLwotICAgICAgYWRkcmVzcyA9IHJlbC0+YWRkcmVzczsKLSAgICAgIHJlbC0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKLQotICAgICAgLyogTm90ZSB0aGF0IG5vIHNlcmlvdXMgaGFybSB3aWxsIGVuc3VlIGlmIHdlIGZhaWwgdG8gY2hhbmdlIGEKLQkgcmVsb2MuICBUaGUgYmFja2VuZCB3aWxsIGZhaWwgd2hlbiB3cml0aW5nIG91dCB0aGUgcmVsb2MuICAqLwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhpcyByZWxvYyBpcyB3aXRoaW4gdGhlIGRhdGEgd2UgaGF2ZS4gIFdlIHVzZSBvbmx5Ci0JIDQgYnl0ZSByZWxvY3MgaGVyZSwgc28gd2UgaW5zaXN0IG9uIGhhdmluZyA0IGJ5dGVzLiAgKi8KLSAgICAgIGlmIChhZGRyZXNzICsgNCA+IGNvbnRlbnRzX3NpemUpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIEEgUEMgcmVsYXRpdmUgcmVsb2MgZW50aXJlbHkgd2l0aGluIGEgc2luZ2xlIHNlY3Rpb24gaXMKLQkgY29tcGxldGVseSB1bm5lY2Vzc2FyeS4gIFRoaXMgY2FuIGJlIGdlbmVyYXRlZCBieSBsZCAtci4gICovCi0gICAgICBpZiAoc3ltID09IGluc2VjLT5zeW1ib2wKLQkgICYmIHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmICEgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCXsKLQkgIC0tKnJlbG9jX2NvdW50X3B0cjsKLQkgIC0tcmVsb2NzOwotCSAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAotCQkgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gaSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2V0IHRoZSBhbW91bnQgdGhlIHJlbG9jYXRpb24gd2lsbCBhZGQgaW4uICAqLwotICAgICAgYWRkZW5kID0gcmVsLT5hZGRlbmQgKyBzeW0tPnZhbHVlOwotCi0gICAgICAvKiBOZXRXYXJlIGRvZXNuJ3Qgc3VwcG9ydCBQQyByZWxhdGl2ZSByZWxvY3MgYWdhaW5zdCBkZWZpbmVkCi0JIHN5bWJvbHMsIHNvIHdlIGhhdmUgdG8gZWxpbWluYXRlIHRoZW0gYnkgZG9pbmcgdGhlIHJlbG9jYXRpb24KLQkgbm93LiAgV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB0aGUgcmVsb2MgaXMgd2l0aGluIGEgc2luZ2xlCi0JIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gIT0gTlVMTAotCSAgJiYgcmVsLT5ob3d0by0+cGNfcmVsYXRpdmUKLQkgICYmIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSA9PSBpbnNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIGlmIChyZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQpCi0JICAgIGFkZGVuZCAtPSBhZGRyZXNzOwotCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCSAgdmFsICs9IGFkZGVuZDsKLQkgIGJmZF9wdXRfMzIgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQotCSAgLS0qcmVsb2NfY291bnRfcHRyOwotCSAgLS1yZWxvY3M7Ci0JICBtZW1tb3ZlIChyZWxvY3MsIHJlbG9jcyArIDEsCi0JCSAgIChzaXplX3QpICgocmVsb2NfY291bnQgLSBpKSAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBOZXRXYXJlIGRvZXNuJ3Qgc3VwcG9ydCByZWxvYyBhZGRlbmRzLCBzbyB3ZSBnZXQgcmlkIG9mIHRoZW0KLQkgaGVyZSBieSBzaW1wbHkgYWRkaW5nIHRoZW0gaW50byB0aGUgb2JqZWN0IGRhdGEuICBXZSBoYW5kbGUKLQkgdGhlIHN5bWJvbCB2YWx1ZSwgaWYgYW55LCB0aGUgc2FtZSB3YXkuICAqLwotICAgICAgaWYgKGFkZGVuZCAhPSAwCi0JICAmJiByZWwtPmhvd3RvICE9IE5VTEwKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgdmFsID0gYmZkX2dldF8zMiAob3V0YmZkLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyBhZGRyZXNzKTsKLQkgIHZhbCArPSBhZGRlbmQ7Ci0JICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0KLQkgIC8qIEFkanVzdCB0aGUgcmVsb2MgZm9yIHRoZSBjaGFuZ2VzIHdlIGp1c3QgbWFkZS4gICovCi0JICByZWwtPmFkZGVuZCA9IDA7Ci0JICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAgIHJlbC0+c3ltX3B0cl9wdHIgPSBiZmRfZ2V0X3NlY3Rpb24gKHN5bSktPnN5bWJvbF9wdHJfcHRyOwotCX0KLQotICAgICAgLyogTmV0V2FyZSB1c2VzIGEgcmVsb2Mgd2l0aCBwY3JlbF9vZmZzZXQgc2V0LiAgV2UgYWRqdXN0Ci0JIHBjX3JlbGF0aXZlIHJlbG9jcyBhY2NvcmRpbmdseS4gIFdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlCi0JIGhvd3RvIGZpZWxkLCBzbyB3ZSBjYW4gb25seSBkbyB0aGlzIGlmIHRoZSBjdXJyZW50IG9uZSBpcwotCSBjb21wYXRpYmxlLiAgV2Ugc2hvdWxkIGNoZWNrIHRoYXQgc3BlY2lhbF9mdW5jdGlvbiBpcyBOVUxMCi0JIGhlcmUsIGJ1dCBhdCB0aGUgbW9tZW50IGNvZmYtaTM4NiB1c2VzIGEgc3BlY2lhbF9mdW5jdGlvbgotCSB3aGljaCBkb2VzIG5vdCBhZmZlY3Qgd2hhdCB3ZSBhcmUgZG9pbmcgaGVyZS4gICovCi0gICAgICBpZiAocmVsLT5ob3d0byAhPSBOVUxMCi0JICAmJiByZWwtPmhvd3RvLT5wY19yZWxhdGl2ZQotCSAgJiYgISByZWwtPmhvd3RvLT5wY3JlbF9vZmZzZXQKLQkgICYmIHJlbC0+aG93dG8tPnJpZ2h0c2hpZnQgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c2l6ZSA9PSAyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRzaXplID09IDMyCi0JICAmJiByZWwtPmhvd3RvLT5iaXRwb3MgPT0gMAotCSAgJiYgcmVsLT5ob3d0by0+c3JjX21hc2sgPT0gMHhmZmZmZmZmZgotCSAgJiYgcmVsLT5ob3d0by0+ZHN0X21hc2sgPT0gMHhmZmZmZmZmZikKLQl7Ci0JICBiZmRfdm1hIHZhbDsKLQotCSAgLyogV2hlbiBwY3JlbF9vZmZzZXQgaXMgbm90IHNldCwgaXQgbWVhbnMgdGhhdCB0aGUgbmVnYXRpdmUKLQkgICAgIG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgbG9jYXRpb24gaXMgc3RvcmVkIGluIHRoZQotCSAgICAgbWVtb3J5IGxvY2F0aW9uLiAgV2UgbXVzdCBhZGQgaXQgYmFjayBpbi4gICovCi0JICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIGFkZHJlc3MpOwotCSAgdmFsICs9IGFkZHJlc3M7Ci0JICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgYWRkcmVzcyk7Ci0KLQkgIC8qIFdlIG11c3QgY2hhbmdlIHRvIGEgbmV3IGhvd3RvLiAgKi8KLQkgIHJlbC0+aG93dG8gPSAmbmxtX2kzODZfcGNyZWxfaG93dG87Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmIC8qIE5MTUNPTlZfSTM4NiAqLwotDAotI2lmZGVmIE5MTUNPTlZfQUxQSEEKLQotLyogT24gdGhlIEFscGhhIHRoZSBmaXJzdCByZWxvYyBmb3IgZXZlcnkgc2VjdGlvbiBtdXN0IGJlIGEgc3BlY2lhbAotICAgcmVsb2NzIHdoaWNoIGhvbGQgdGhlIEdQIGFkZHJlc3MuICBBbHNvLCB0aGUgZmlyc3QgcmVsb2MgaW4gdGhlCi0gICBmaWxlIG11c3QgYmUgYSBzcGVjaWFsIHJlbG9jIHdoaWNoIGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSAubGl0YQotICAgc2VjdGlvbi4gICovCi0KLXN0YXRpYyByZWxvY19ob3d0b190eXBlIG5sbTMyX2FscGhhX253X2hvd3RvID0KLSAgSE9XVE8gKEFMUEhBX1JfTldfUkVMT0MsCS8qIHR5cGUgKi8KLQkgMCwJCQkvKiByaWdodHNoaWZ0ICovCi0JIDAsCQkJLyogc2l6ZSAoMCA9IGJ5dGUsIDEgPSBzaG9ydCwgMiA9IGxvbmcpICovCi0JIDAsCQkJLyogYml0c2l6ZSAqLwotCSBmYWxzZSwJCQkvKiBwY19yZWxhdGl2ZSAqLwotCSAwLAkJCS8qIGJpdHBvcyAqLwotCSBjb21wbGFpbl9vdmVyZmxvd19kb250LCAvKiBjb21wbGFpbl9vbl9vdmVyZmxvdyAqLwotCSAwLAkJCS8qIHNwZWNpYWxfZnVuY3Rpb24gKi8KLQkgIk5XX1JFTE9DIiwJCS8qIG5hbWUgKi8KLQkgZmFsc2UsCQkJLyogcGFydGlhbF9pbnBsYWNlICovCi0JIDAsCQkJLyogc3JjX21hc2sgKi8KLQkgMCwJCQkvKiBkc3RfbWFzayAqLwotCSBmYWxzZSk7CQkvKiBwY3JlbF9vZmZzZXQgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotYWxwaGFfbWFuZ2xlX3JlbG9jcyAob3V0YmZkLCBpbnNlYywgcmVsb2NzX3B0ciwgcmVsb2NfY291bnRfcHRyLCBjb250ZW50cywKLQkJICAgICBjb250ZW50c19zaXplKQotICAgICBiZmQgKm91dGJmZDsKLSAgICAgYXNlY3Rpb24gKmluc2VjOwotICAgICByZWdpc3RlciBhcmVsZW50ICoqKnJlbG9jc19wdHI7Ci0gICAgIGxvbmcgKnJlbG9jX2NvdW50X3B0cjsKLSAgICAgY2hhciAqY29udGVudHM7Ci0gICAgIGJmZF9zaXplX3R5cGUgY29udGVudHNfc2l6ZTsKLXsKLSAgbG9uZyBvbGRfcmVsb2NfY291bnQ7Ci0gIGFyZWxlbnQgKipvbGRfcmVsb2NzOwotICByZWdpc3RlciBhcmVsZW50ICoqcmVsb2NzOwotCi0gIG9sZF9yZWxvY19jb3VudCA9ICpyZWxvY19jb3VudF9wdHI7Ci0gIG9sZF9yZWxvY3MgPSAqcmVsb2NzX3B0cjsKLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKChvbGRfcmVsb2NfY291bnQgKyAzKSAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gICpyZWxvY3NfcHRyID0gcmVsb2NzOwotCi0gIGlmIChubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3MgPT0gMCkKLSAgICB7Ci0gICAgICBiZmQgKmluYmZkOwotICAgICAgYXNlY3Rpb24gKmxpdGFfc2VjdGlvbjsKLQotICAgICAgaW5iZmQgPSBpbnNlYy0+b3duZXI7Ci0gICAgICBsaXRhX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5iZmQsIF9MSVRBKTsKLSAgICAgIGlmIChsaXRhX3NlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEwpCi0JewotCSAgbmxtX2FscGhhX2JhY2tlbmRfZGF0YSAob3V0YmZkKS0+bGl0YV9hZGRyZXNzID0KLQkgICAgYmZkX2dldF9zZWN0aW9uX3ZtYSAoaW5iZmQsIGxpdGFfc2VjdGlvbik7Ci0JICBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX3NpemUgPQotCSAgICBiZmRfc2VjdGlvbl9zaXplIChpbmJmZCwgbGl0YV9zZWN0aW9uKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQXZvaWQgb3V0cHV0dGluZyB0aGlzIHJlbG9jIGFnYWluLiAgKi8KLQkgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfYWRkcmVzcyA9IDQ7Ci0JfQotCi0gICAgICAqcmVsb2NzID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICAoKnJlbG9jcyktPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICAgICAoKnJlbG9jcyktPmFkZHJlc3MgPSBubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5saXRhX2FkZHJlc3M7Ci0gICAgICAoKnJlbG9jcyktPmFkZGVuZCA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmxpdGFfc2l6ZSArIDE7Ci0gICAgICAoKnJlbG9jcyktPmhvd3RvID0gJm5sbTMyX2FscGhhX253X2hvd3RvOwotICAgICAgKytyZWxvY3M7Ci0gICAgICArKygqcmVsb2NfY291bnRfcHRyKTsKLSAgICB9Ci0KLSAgLyogR2V0IHRoZSBHUCB2YWx1ZSBmcm9tIGJmZC4gICovCi0gIGlmIChubG1fYWxwaGFfYmFja2VuZF9kYXRhIChvdXRiZmQpLT5ncCA9PSAwKQotICAgIG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmdwID0KLSAgICAgIGJmZF9lY29mZl9nZXRfZ3BfdmFsdWUgKGluc2VjLT5vd25lcik7Ci0KLSAgKnJlbG9jcyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAoKnJlbG9jcyktPnN5bV9wdHJfcHRyID0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sX3B0cl9wdHI7Ci0gICgqcmVsb2NzKS0+YWRkcmVzcyA9IG5sbV9hbHBoYV9iYWNrZW5kX2RhdGEgKG91dGJmZCktPmdwOwotICAoKnJlbG9jcyktPmFkZGVuZCA9IDA7Ci0gICgqcmVsb2NzKS0+aG93dG8gPSAmbmxtMzJfYWxwaGFfbndfaG93dG87Ci0gICsrcmVsb2NzOwotICArKygqcmVsb2NfY291bnRfcHRyKTsKLQotICBtZW1jcHkgKChQVFIpIHJlbG9jcywgKFBUUikgb2xkX3JlbG9jcywKLQkgIChzaXplX3QpIG9sZF9yZWxvY19jb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gIHJlbG9jc1tvbGRfcmVsb2NfY291bnRdID0gKGFyZWxlbnQgKikgTlVMTDsKLQotICBmcmVlIChvbGRfcmVsb2NzKTsKLQotICBpZiAoaW5zZWMtPm91dHB1dF9vZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBiZmRfc2l6ZV90eXBlIGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCAoYmZkX3NpemVfdHlwZSkgb2xkX3JlbG9jX2NvdW50OyBpKyssIHJlbG9jcysrKQotCSgqcmVsb2NzKS0+YWRkcmVzcyArPSBpbnNlYy0+b3V0cHV0X29mZnNldDsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBOTE1DT05WX0FMUEhBICovCi0MCi0jaWZkZWYgTkxNQ09OVl9QT1dFUlBDCi0KLS8qIFdlIGtlZXAgYSBsaW5rZWQgbGlzdCBvZiBzdHVicyB3aGljaCB3ZSBtdXN0IGJ1aWxkLiAgQmVjYXVzZSBCRkQKLSAgIHJlcXVpcmVzIHVzIHRvIGtub3cgdGhlIHNpemVzIG9mIGFsbCBzZWN0aW9ucyBiZWZvcmUgd2UgY2FuIHNldCB0aGUKLSAgIGNvbnRlbnRzIG9mIGFueSwgd2UgbXVzdCBmaWd1cmUgb3V0IHdoaWNoIHN0dWJzIHdlIHdhbnQgdG8gYnVpbGQKLSAgIGJlZm9yZSB3ZSBjYW4gYWN0dWFsbHkgYnVpbGQgYW55IG9mIHRoZW0uICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19zdHViCi17Ci0gIC8qIE5leHQgc3R1YiBpbiBsaW5rZWQgbGlzdC4gICovCi0gIHN0cnVjdCBwb3dlcnBjX3N0dWIgKm5leHQ7Ci0KLSAgLyogU3ltYm9sIHdob3NlIHZhbHVlIGlzIHRoZSBzdGFydCBvZiB0aGUgc3R1Yi4gIFRoaXMgaXMgYSBzeW1ib2wKLSAgICAgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBgLicuICAqLwotICBhc3ltYm9sICpzdGFydDsKLQotICAvKiBTeW1ib2wgd2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBhIHJlbG9jIGFnYWluc3QuICBUaGlzIGlzIGEgc3ltYm9sCi0gICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBTVEFSVCBidXQgd2l0aG91dCB0aGUgbGVhZGluZyBgLicuICAqLwotICBhc3ltYm9sICpyZWxvYzsKLQotICAvKiBUaGUgVE9DIGluZGV4IGZvciB0aGlzIHN0dWIuICBUaGlzIGlzIHRoZSBpbmRleCBpbnRvIHRoZSBUT0MKLSAgICAgc2VjdGlvbiBhdCB3aGljaCB0aGUgcmVsb2MgaXMgY3JlYXRlZC4gICovCi0gIHVuc2lnbmVkIGludCB0b2NfaW5kZXg7Ci19OwotCi0vKiBUaGUgbGlua2VkIGxpc3Qgb2Ygc3R1YnMuICAqLwotCi1zdGF0aWMgc3RydWN0IHBvd2VycGNfc3R1YiAqcG93ZXJwY19zdHViczsKLQotLyogVGhpcyBpcyB3aGF0IGEgc3R1YiBsb29rcyBsaWtlLiAgVGhlIGZpcnN0IGluc3RydWN0aW9uIHdpbGwgZ2V0Ci0gICBhZGp1c3RlZCB3aXRoIHRoZSBjb3JyZWN0IFRPQyBpbmRleC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VycGNfc3R1Yl9pbnNuc1tdID0KLXsKLSAgMHg4MTgyMDAwMCwJCS8qIGx3egkgcjEyLDAocjIpICovCi0gIDB4OTA0MTAwMTQsCQkvKiBzdHcJIHIyLDIwKHIxKSAqLwotICAweDgwMGMwMDAwLAkJLyogbHd6CSByMCwwKHIxMikgKi8KLSAgMHg4MDRjMDAwNCwJCS8qIGx3egkgcjIscihyMTIpICovCi0gIDB4N2MwOTAzYTYsCQkvKiBtdGN0ciByMCAqLwotICAweDRlODAwNDIwLAkJLyogYmN0ciAqLwotICAwLAkJCS8qIFRyYWNlYmFjayB0YWJsZS4gICovCi0gIDB4YzgwMDAsCi0gIDAKLX07Ci0KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX0lOU05fQ09VTlQgXAotICAoc2l6ZW9mIHBvd2VycGNfc3R1Yl9pbnNucyAvIHNpemVvZiBwb3dlcnBjX3N0dWJfaW5zbnNbMF0pCi0KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX1NJWkUgKDQgKiBQT1dFUlBDX1NUVUJfSU5TTl9DT1VOVCkKLQotLyogRWFjaCBzdHViIHVzZXMgYSBmb3VyIGJ5dGUgVE9DIGVudHJ5LiAgKi8KLSNkZWZpbmUgUE9XRVJQQ19TVFVCX1RPQ19FTlRSWV9TSVpFICg0KQotCi0vKiBUaGUgb3JpZ2luYWwgc2l6ZSBvZiB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZTsKLQotLyogTG9vayBmb3IgYWxsIHVuZGVmaW5lZCBzeW1ib2xzIGJlZ2lubmluZyB3aXRoIGAuJywgYW5kIHByZXBhcmUgdG8KLSAgIGJ1aWxkIGEgc3R1YiBmb3IgZWFjaCBvbmUuICAqLwotCi1zdGF0aWMgdm9pZAotcG93ZXJwY19idWlsZF9zdHVicyAoaW5iZmQsIG91dGJmZCwgc3ltYm9sc19wdHIsIHN5bWNvdW50X3B0cikKLSAgICAgYmZkICppbmJmZDsKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzeW1ib2wgKioqc3ltYm9sc19wdHI7Ci0gICAgIGxvbmcgKnN5bWNvdW50X3B0cjsKLXsKLSAgYXNlY3Rpb24gKnN0dWJfc2VjOwotICBhc2VjdGlvbiAqZ290X3NlYzsKLSAgdW5zaWduZWQgaW50IGdvdF9iYXNlOwotICBsb25nIGk7Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIGxvbmcgc3R1YmNvdW50OwotCi0gIC8qIE1ha2UgYSBzZWN0aW9uIHRvIGhvbGQgc3R1YnMuICBXZSBkb24ndCBzZXQgU0VDX0hBU19DT05URU5UUyBmb3IKLSAgICAgdGhlIHNlY3Rpb24gdG8gcHJldmVudCBjb3B5X3NlY3Rpb25zIGZyb20gcmVhZGluZyBmcm9tIGl0LiAgKi8KLSAgc3R1Yl9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChpbmJmZCwgIi5zdHVicyIpOwotICBpZiAoc3R1Yl9zZWMgPT0gKGFzZWN0aW9uICopIE5VTEwKLSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChpbmJmZCwgc3R1Yl9zZWMsCi0JCQkJICAoU0VDX0NPREUKLQkJCQkgICB8IFNFQ19SRUxPQwotCQkJCSAgIHwgU0VDX0FMTE9DCi0JCQkJICAgfCBTRUNfTE9BRCkpCi0gICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGluYmZkLCBzdHViX3NlYywgMikpCi0gICAgYmZkX2ZhdGFsICgiLnN0dWJzIik7Ci0KLSAgLyogR2V0IHRoZSBUT0Mgc2VjdGlvbiwgd2hpY2ggaXMgbmFtZWQgLmdvdC4gICovCi0gIGdvdF9zZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaW5iZmQsICIuZ290Iik7Ci0gIGlmIChnb3Rfc2VjID09IChhc2VjdGlvbiAqKSBOVUxMKQotICAgIHsKLSAgICAgIGdvdF9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChpbmJmZCwgIi5nb3QiKTsKLSAgICAgIGlmIChnb3Rfc2VjID09IChhc2VjdGlvbiAqKSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoaW5iZmQsIGdvdF9zZWMsCi0JCQkJICAgICAgKFNFQ19EQVRBCi0JCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJICAgICAgIHwgU0VDX0FMTE9DCi0JCQkJICAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoaW5iZmQsIGdvdF9zZWMsIDIpKQotCWJmZF9mYXRhbCAoIi5nb3QiKTsKLSAgICB9Ci0KLSAgcG93ZXJwY19pbml0aWFsX2dvdF9zaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoaW5iZmQsIGdvdF9zZWMpOwotICBnb3RfYmFzZSA9IHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZTsKLSAgZ290X2Jhc2UgPSAoZ290X2Jhc2UgKyAzKSAmfiAzOwotCi0gIHN0dWJjb3VudCA9IDA7Ci0KLSAgc3ltY291bnQgPSAqc3ltY291bnRfcHRyOwotICBmb3IgKGkgPSAwOyBpIDwgc3ltY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBhc3ltYm9sICpzeW07Ci0gICAgICBhc3ltYm9sICpuZXdzeW07Ci0gICAgICBjaGFyICpuZXduYW1lOwotICAgICAgc3RydWN0IHBvd2VycGNfc3R1YiAqaXRlbTsKLQotICAgICAgc3ltID0gKCpzeW1ib2xzX3B0cilbaV07Ci0KLSAgICAgIC8qIFdlIG11c3QgbWFrZSBhIHN0dWIgZm9yIGV2ZXJ5IHVuZGVmaW5lZCBzeW1ib2wgd2hvc2UgbmFtZQotCSBzdGFydHMgd2l0aCAnLicuICAqLwotICAgICAgaWYgKGJmZF9hc3ltYm9sX25hbWUgKHN5bSlbMF0gIT0gJy4nCi0JICB8fCAhIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSBhIG5ldyB1bmRlZmluZWQgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgd2l0aG91dAotCSB0aGUgbGVhZGluZyBgLicuICAqLwotICAgICAgbmV3c3ltID0gKGFzeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sKSk7Ci0gICAgICAqbmV3c3ltID0gKnN5bTsKLSAgICAgIG5ld25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpKTsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSArIDEpOwotICAgICAgbmV3c3ltLT5uYW1lID0gbmV3bmFtZTsKLQotICAgICAgLyogRGVmaW5lIHRoZSBgLicgc3ltYm9sIHRvIGJlIGluIHRoZSBzdHViIHNlY3Rpb24uICAqLwotICAgICAgc3ltLT5zZWN0aW9uID0gc3R1Yl9zZWM7Ci0gICAgICBzeW0tPnZhbHVlID0gc3R1YmNvdW50ICogUE9XRVJQQ19TVFVCX1NJWkU7Ci0gICAgICAvKiBXZSBzZXQgdGhlIEJTRl9EWU5BTUlDIGZsYWcgaGVyZSBzbyB0aGF0IHdlIGNhbiBjaGVjayBpdCB3aGVuCi0JIHdlIGFyZSBtYW5nbGluZyByZWxvY3MuICBGSVhNRTogVGhpcyBpcyBhIGhhY2suICAqLwotICAgICAgc3ltLT5mbGFncyA9IEJTRl9MT0NBTCB8IEJTRl9EWU5BTUlDOwotCi0gICAgICAvKiBBZGQgdGhpcyBzdHViIHRvIHRoZSBsaW5rZWQgbGlzdC4gICovCi0gICAgICBpdGVtID0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcG93ZXJwY19zdHViKSk7Ci0gICAgICBpdGVtLT5zdGFydCA9IHN5bTsKLSAgICAgIGl0ZW0tPnJlbG9jID0gbmV3c3ltOwotICAgICAgaXRlbS0+dG9jX2luZGV4ID0gZ290X2Jhc2UgKyBzdHViY291bnQgKiBQT1dFUlBDX1NUVUJfVE9DX0VOVFJZX1NJWkU7Ci0KLSAgICAgIGl0ZW0tPm5leHQgPSBwb3dlcnBjX3N0dWJzOwotICAgICAgcG93ZXJwY19zdHVicyA9IGl0ZW07Ci0gICAgICAKLSAgICAgICsrc3R1YmNvdW50OwotICAgIH0KLQotICBpZiAoc3R1YmNvdW50ID4gMCkKLSAgICB7Ci0gICAgICBhc3ltYm9sICoqczsKLSAgICAgIHN0cnVjdCBwb3dlcnBjX3N0dWIgKmw7Ci0KLSAgICAgIC8qIEFkZCB0aGUgbmV3IHN5bWJvbHMgd2UganVzdCBjcmVhdGVkIHRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgKnN5bWJvbHNfcHRyID0gKGFzeW1ib2wgKiopIHhyZWFsbG9jICgoY2hhciAqKSAqc3ltYm9sc19wdHIsCi0JCQkJCSAgICAoKHN5bWNvdW50ICsgc3R1YmNvdW50KQotCQkJCQkgICAgICogc2l6ZW9mIChhc3ltYm9sKSkpOwotICAgICAgKnN5bWNvdW50X3B0ciArPSBzdHViY291bnQ7Ci0gICAgICBzID0gJigqc3ltYm9sc19wdHIpW3N5bWNvdW50XTsKLSAgICAgIGZvciAobCA9IHBvd2VycGNfc3R1YnM7IGwgIT0gKHN0cnVjdCBwb3dlcnBjX3N0dWIgKikgTlVMTDsgbCA9IGwtPm5leHQpCi0JKnMrKyA9IGwtPnJlbG9jOwotCi0gICAgICAvKiBTZXQgdGhlIHNpemUgb2YgdGhlIC5zdHVicyBzZWN0aW9uIGFuZCBpbmNyZWFzZSB0aGUgc2l6ZSBvZgotCSB0aGUgLmdvdCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChpbmJmZCwgc3R1Yl9zZWMsCi0JCQkJICBzdHViY291bnQgKiBQT1dFUlBDX1NUVUJfU0laRSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGluYmZkLCBnb3Rfc2VjLAotCQkJCSAgICAgKGdvdF9iYXNlCi0JCQkJICAgICAgKyAoc3R1YmNvdW50Ci0JCQkJCSAqIFBPV0VSUENfU1RVQl9UT0NfRU5UUllfU0laRSkpKSkKLQliZmRfZmF0YWwgKF8oInN0dWIgc2VjdGlvbiBzaXplcyIpKTsKLSAgICB9Ci19Ci0KLS8qIFJlc29sdmUgYWxsIHRoZSBzdHVicyBmb3IgUG93ZXJQQyBOZXRXYXJlLiAgV2UgZmlsbCBpbiB0aGUgY29udGVudHMKLSAgIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiwgYW5kIGNyZWF0ZSBuZXcgcmVsb2NzIGluIHRoZSBUT0MuICAqLwotCi1zdGF0aWMgdm9pZAotcG93ZXJwY19yZXNvbHZlX3N0dWJzIChpbmJmZCwgb3V0YmZkKQotICAgICBiZmQgKmluYmZkOwotICAgICBiZmQgKm91dGJmZDsKLXsKLSAgYmZkX2J5dGUgYnVmW1BPV0VSUENfU1RVQl9TSVpFXTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBzdHViY291bnQ7Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIGFzZWN0aW9uICpnb3Rfc2VjOwotICBhcmVsZW50ICoqcjsKLSAgc3RydWN0IHBvd2VycGNfc3R1YiAqbDsKLQotICBpZiAocG93ZXJwY19zdHVicyA9PSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKGkgPSAwOyBpIDwgUE9XRVJQQ19TVFVCX0lOU05fQ09VTlQ7IGkrKykKLSAgICBiZmRfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBwb3dlcnBjX3N0dWJfaW5zbnNbaV0sIGJ1ZiArIGkgKiA0KTsKLQotICBnb3Rfc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGluYmZkLCAiLmdvdCIpOwotICBhc3NlcnQgKGdvdF9zZWMgIT0gKGFzZWN0aW9uICopIE5VTEwpOwotICBhc3NlcnQgKGdvdF9zZWMtPm91dHB1dF9zZWN0aW9uLT5vcmVsb2NhdGlvbiA9PSAoYXJlbGVudCAqKikgTlVMTCk7Ci0KLSAgc3R1YmNvdW50ID0gMDsKLSAgZm9yIChsID0gcG93ZXJwY19zdHViczsgbCAhPSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICArK3N0dWJjb3VudDsKLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHN0dWJjb3VudCAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0KLSAgciA9IHJlbG9jczsKLSAgZm9yIChsID0gcG93ZXJwY19zdHViczsgbCAhPSAoc3RydWN0IHBvd2VycGNfc3R1YiAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWxvYzsKLQotICAgICAgLyogQWRqdXN0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byB1c2UgdGhlIHJpZ2h0IFRPQyBpbmRleC4gICovCi0gICAgICBiZmRfcHV0XzMyIChvdXRiZmQsIChiZmRfdm1hKSBwb3dlcnBjX3N0dWJfaW5zbnNbMF0gKyBsLT50b2NfaW5kZXgsIGJ1Zik7Ci0KLSAgICAgIC8qIFdyaXRlIHRoaXMgc3R1YiBvdXQuICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvdXRiZmQsCi0JCQkJICAgICAgYmZkX2dldF9zZWN0aW9uIChsLT5zdGFydCksCi0JCQkJICAgICAgYnVmLAotCQkJCSAgICAgIGwtPnN0YXJ0LT52YWx1ZSwKLQkJCQkgICAgICBQT1dFUlBDX1NUVUJfU0laRSkpCi0JYmZkX2ZhdGFsIChfKCJ3cml0aW5nIHN0dWIiKSk7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIG5ldyByZWxvYyBmb3IgdGhlIFRPQyBlbnRyeS4gICovCi0gICAgICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgcmVsb2MtPnN5bV9wdHJfcHRyID0gJmwtPnJlbG9jOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBsLT50b2NfaW5kZXggKyBnb3Rfc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgICAgcmVsb2MtPmFkZGVuZCA9IDA7Ci0gICAgICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGluYmZkLCBCRkRfUkVMT0NfMzIpOwotCQkJCSAgICAgIAotICAgICAgKnIrKyA9IHJlbG9jOwotICAgIH0KLQotICBiZmRfc2V0X3JlbG9jIChvdXRiZmQsIGdvdF9zZWMtPm91dHB1dF9zZWN0aW9uLCByZWxvY3MsIHN0dWJjb3VudCk7Ci19Ci0KLS8qIEFkanVzdCByZWxvY2F0aW9uIGVudHJpZXMgZm9yIFBvd2VyUEMgTmV0V2FyZS4gIFdlIGRvIG5vdCBvdXRwdXQKLSAgIFRPQyByZWxvY2F0aW9ucy4gIFRoZSBvYmplY3QgY29kZSBhbHJlYWR5IGNvbnRhaW5zIHRoZSBvZmZzZXQgZnJvbQotICAgdGhlIFRPQyBwb2ludGVyLiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgVE9DIHJlZ2lzdGVyLAotICAgcjIsIHdpbGwgYmUgc2V0IHRvIHRoZSBjb3JyZWN0IFRPQyB2YWx1ZSwgc28gdGhlcmUgaXMgbm8gbmVlZCBmb3IKLSAgIGFueSBmdXJ0aGVyIHJlbG9jLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdm9pZAotcG93ZXJwY19tYW5nbGVfcmVsb2NzIChvdXRiZmQsIGluc2VjLCByZWxvY3NfcHRyLCByZWxvY19jb3VudF9wdHIsIGNvbnRlbnRzLAotCQkgICAgICAgY29udGVudHNfc2l6ZSkKLSAgICAgYmZkICpvdXRiZmQ7Ci0gICAgIGFzZWN0aW9uICppbnNlYzsKLSAgICAgcmVnaXN0ZXIgYXJlbGVudCAqKipyZWxvY3NfcHRyOwotICAgICBsb25nICpyZWxvY19jb3VudF9wdHI7Ci0gICAgIGNoYXIgKmNvbnRlbnRzOwotICAgICBiZmRfc2l6ZV90eXBlIGNvbnRlbnRzX3NpemU7Ci17Ci0gIHJlbG9jX2hvd3RvX3R5cGUgKnRvY19ob3d0bzsKLSAgbG9uZyByZWxvY19jb3VudDsKLSAgcmVnaXN0ZXIgYXJlbGVudCAqKnJlbG9jczsKLSAgcmVnaXN0ZXIgbG9uZyBpOwotCi0gIHRvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoaW5zZWMtPm93bmVyLCBCRkRfUkVMT0NfUFBDX1RPQzE2KTsKLSAgaWYgKHRvY19ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIC5nb3Qgc2VjdGlvbiwgY2xlYXIgb3V0IGFsbCB0aGUgY29udGVudHMgYmV5b25kCi0gICAgIHRoZSBpbml0aWFsIHNpemUuICBXZSBtdXN0IGRvIHRoaXMgaGVyZSBiZWNhdXNlIGNvcHlfc2VjdGlvbnMgaXMKLSAgICAgZ29pbmcgdG8gd3JpdGUgb3V0IHdoYXRldmVyIHdlIHJldHVybiBpbiB0aGUgY29udGVudHMgZmllbGQuICAqLwotICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoaW5zZWMtPm93bmVyLCBpbnNlYyksICIuZ290IikgPT0gMCkKLSAgICBtZW1zZXQgKGNvbnRlbnRzICsgcG93ZXJwY19pbml0aWFsX2dvdF9zaXplLCAwLAotCSAgICAoc2l6ZV90KSAoYmZkX2dldF9zZWN0aW9uX3NpemVfYWZ0ZXJfcmVsb2MgKGluc2VjKQotCQkgICAgICAtIHBvd2VycGNfaW5pdGlhbF9nb3Rfc2l6ZSkpOwotCi0gIHJlbG9jX2NvdW50ID0gKnJlbG9jX2NvdW50X3B0cjsKLSAgcmVsb2NzID0gKnJlbG9jc19wdHI7Ci0gIGZvciAoaSA9IDA7IGkgPCByZWxvY19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnJlbDsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGJmZF92bWEgc3ltX3ZhbHVlOwotCi0gICAgICByZWwgPSAqcmVsb2NzKys7Ci0gICAgICBzeW0gPSAqcmVsLT5zeW1fcHRyX3B0cjsKLQotICAgICAgLyogQ29udmVydCBhbnkgcmVsb2NzIGFnYWluc3QgdGhlIC5ic3Mgc2VjdGlvbiBpbnRvIHJlbG9jcwotICAgICAgICAgYWdhaW5zdCB0aGUgLmRhdGEgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc3RyY21wIChiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob3V0YmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpLAotCQkgIE5MTV9VTklOSVRJQUxJWkVEX0RBVEFfTkFNRSkgPT0gMCkKLQl7Ci0JICBhc2VjdGlvbiAqZGF0YXNlYzsKLQotCSAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRiZmQsCi0JCQkJCSAgICAgTkxNX0lOSVRJQUxJWkVEX0RBVEFfTkFNRSk7Ci0JICBpZiAoZGF0YXNlYyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgcmVsLT5hZGRlbmQgKz0gKGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dGJmZCwKLQkJCQkJCSAgIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkJCSAgICAgICsgc3ltLT52YWx1ZSk7Ci0JICAgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGRhdGFzZWMtPnN5bWJvbF9wdHJfcHRyOwotCSAgICAgIHN5bSA9ICpyZWwtPnN5bV9wdHJfcHRyOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBtdXN0IGJlIGFibGUgdG8gcmVzb2x2ZSBhbGwgUEMgcmVsYXRpdmUgcmVsb2NzIGF0IHRoaXMKLQkgcG9pbnQuICBJZiB3ZSBnZXQgYSBicmFuY2ggdG8gYW4gdW5kZWZpbmVkIHN5bWJvbCB3ZSBidWlsZCBhCi0JIHN0dWIsIHNpbmNlIE5ldFdhcmUgd2lsbCByZXNvbHZlIHVuZGVmaW5lZCBzeW1ib2xzIGludG8gYQotCSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gZGVzY3JpcHRvci4gICovCi0gICAgICBpZiAocmVsLT5ob3d0by0+cGNfcmVsYXRpdmUpCi0JewotCSAgLyogVGhpcyBjaGVjayBmb3Igd2hldGhlciBhIHN5bWJvbCBpcyBpbiB0aGUgc2FtZSBzZWN0aW9uIGFzCi0JICAgICB0aGUgcmVsb2Mgd2lsbCBiZSB3cm9uZyBpZiB0aGVyZSBpcyBhIFBDIHJlbGF0aXZlIHJlbG9jCi0JICAgICBiZXR3ZWVuIHR3byBzZWN0aW9ucyBib3RoIG9mIHdoaWNoIHdlcmUgcGxhY2VkIGluIHRoZQotCSAgICAgc2FtZSBvdXRwdXQgc2VjdGlvbi4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uICAqLwotCSAgaWYgKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSAhPSBpbnNlYy0+b3V0cHV0X3NlY3Rpb24pCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVzb2x2ZWQgUEMgcmVsYXRpdmUgcmVsb2MgYWdhaW5zdCAlc1xuIiksCi0JCSAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGJmZF92bWEgdmFsOwotCi0JICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvLT5zaXplID09IDIgJiYgcmVsLT5ob3d0by0+cGNyZWxfb2Zmc2V0KTsKLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgdmFsID0gKCh2YWwgJn4gcmVsLT5ob3d0by0+ZHN0X21hc2spCi0JCSAgICAgfCAoKCh2YWwgJiByZWwtPmhvd3RvLT5zcmNfbWFzaykKLQkJCSArIChzeW0tPnZhbHVlIC0gcmVsLT5hZGRyZXNzKQotCQkJICsgcmVsLT5hZGRlbmQpCi0JCQkmIHJlbC0+aG93dG8tPmRzdF9tYXNrKSk7Ci0JICAgICAgYmZkX3B1dF8zMiAob3V0YmZkLCB2YWwsIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHJlbG9jIGlzIGFnYWluc3QgYW4gc3R1YmJlZCBzeW1ib2wgYW5kIHRoZQotCQkgbmV4dCBpbnN0cnVjdGlvbiBpcwotCQkgICAgIGNyb3IgMzEsMzEsMzEKLQkJIHRoZW4gd2UgcmVwbGFjZSB0aGUgbmV4dCBpbnN0cnVjdGlvbiB3aXRoCi0JCSAgICAgbHd6ICByMiwyMChyMSkKLQkJIFRoaXMgcmVsb2FkcyB0aGUgVE9DIHBvaW50ZXIgYWZ0ZXIgYSBzdHViIGNhbGwuICAqLwotCSAgICAgIGlmIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pWzBdID09ICcuJwotCQkgICYmIChzeW0tPmZsYWdzICYgQlNGX0RZTkFNSUMpICE9IDAKLQkJICAmJiAoYmZkX2dldF8zMiAob3V0YmZkLAotCQkJCSAgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzICsgNCkKLQkJICAgICAgPT0gMHg0ZmZmZmI4MikpIC8qIGNyb3IgMzEsMzEsMzEgKi8KLQkJYmZkX3B1dF8zMiAob3V0YmZkLCAoYmZkX3ZtYSkgMHg4MDQxMDAxNCwgLyogbHd6IHIyLDIwKHIxKSAqLwotCQkJICAgIChiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyArIDQpOwotCi0JICAgICAgLS0qcmVsb2NfY291bnRfcHRyOwotCSAgICAgIC0tcmVsb2NzOwotCSAgICAgIG1lbW1vdmUgKHJlbG9jcywgcmVsb2NzICsgMSwKLQkJICAgICAgIChzaXplX3QpICgocmVsb2NfY291bnQgLSAxKSAqIHNpemVvZiAoYXJlbGVudCAqKSkpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXaGVuIGNvbnNpZGVyaW5nIGEgVE9DIHJlbG9jLCB3ZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHRoZQotCSBzeW1ib2wgdmFsdWUuICBUaGUgc3ltYm9sIHdpbGwgYmUgc3RhcnQgb2YgdGhlIFRPQyBzZWN0aW9uCi0JICh3aGljaCBpcyBuYW1lZCAuZ290KS4gIFdlIGRvIHdhbnQgdG8gaW5jbHVkZSB0aGUgYWRkZW5kLiAgKi8KLSAgICAgIGlmIChyZWwtPmhvd3RvID09IHRvY19ob3d0bykKLQlzeW1fdmFsdWUgPSAwOwotICAgICAgZWxzZQotCXN5bV92YWx1ZSA9IHN5bS0+dmFsdWU7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgd2l0aCBhIHZhbHVlLCBvcgotCSB0aGVyZSBpcyBhIHJlbG9jIGFkZGVuZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGFkZGVuZCBpbiB0aGUKLQkgb2JqZWN0IGZpbGUuICAqLwotICAgICAgaWYgKHN5bV92YWx1ZSArIHJlbC0+YWRkZW5kICE9IDApCi0JewotCSAgYmZkX3ZtYSB2YWw7Ci0KLQkgIHN3aXRjaCAocmVsLT5ob3d0by0+c2l6ZSkKLQkgICAgewotCSAgICBjYXNlIDE6Ci0JICAgICAgdmFsID0gYmZkX2dldF8xNiAob3V0YmZkLAotCQkJCShiZmRfYnl0ZSAqKSBjb250ZW50cyArIHJlbC0+YWRkcmVzcyk7Ci0JICAgICAgdmFsID0gKCh2YWwgJn4gcmVsLT5ob3d0by0+ZHN0X21hc2spCi0JCSAgICAgfCAoKCh2YWwgJiByZWwtPmhvd3RvLT5zcmNfbWFzaykKLQkJCSArIHN5bV92YWx1ZQotCQkJICsgcmVsLT5hZGRlbmQpCi0JCQkmIHJlbC0+aG93dG8tPmRzdF9tYXNrKSk7Ci0JICAgICAgaWYgKChiZmRfc2lnbmVkX3ZtYSkgdmFsIDwgLSAweDgwMDAKLQkJICB8fCAoYmZkX3NpZ25lZF92bWEpIHZhbCA+PSAweDgwMDApCi0JCWZwcmludGYgKHN0ZGVyciwKLQkJCSBfKCIlczogb3ZlcmZsb3cgd2hlbiBhZGp1c3RpbmcgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzXG4iKSwKLQkJCSBwcm9ncmFtX25hbWUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSkpOwotCSAgICAgIGJmZF9wdXRfMTYgKG91dGJmZCwgdmFsLCAoYmZkX2J5dGUgKikgY29udGVudHMgKyByZWwtPmFkZHJlc3MpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgMjoKLQkgICAgICB2YWwgPSBiZmRfZ2V0XzMyIChvdXRiZmQsCi0JCQkJKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICB2YWwgPSAoKHZhbCAmfiByZWwtPmhvd3RvLT5kc3RfbWFzaykKLQkJICAgICB8ICgoKHZhbCAmIHJlbC0+aG93dG8tPnNyY19tYXNrKQotCQkJICsgc3ltX3ZhbHVlCi0JCQkgKyByZWwtPmFkZGVuZCkKLQkJCSYgcmVsLT5ob3d0by0+ZHN0X21hc2spKTsKLQkgICAgICBiZmRfcHV0XzMyIChvdXRiZmQsIHZhbCwgKGJmZF9ieXRlICopIGNvbnRlbnRzICsgcmVsLT5hZGRyZXNzKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0KLQkgIGlmICghIGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQkgICAgcmVsLT5zeW1fcHRyX3B0ciA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKS0+c3ltYm9sX3B0cl9wdHI7Ci0JICByZWwtPmFkZGVuZCA9IDA7Ci0JfQotCi0gICAgICAvKiBOb3cgdGhhdCB3ZSBoYXZlIGluY29ycG9yYXRlZCB0aGUgYWRkZW5kLCByZW1vdmUgYW55IFRPQwotCSByZWxvY3MuICAqLwotICAgICAgaWYgKHJlbC0+aG93dG8gPT0gdG9jX2hvd3RvKQotCXsKLQkgIC0tKnJlbG9jX2NvdW50X3B0cjsKLQkgIC0tcmVsb2NzOwotCSAgbWVtbW92ZSAocmVsb2NzLCByZWxvY3MgKyAxLAotCQkgICAoc2l6ZV90KSAoKHJlbG9jX2NvdW50IC0gaSkgKiBzaXplb2YgKGFyZWxlbnQgKikpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgcmVsLT5hZGRyZXNzICs9IGluc2VjLT5vdXRwdXRfb2Zmc2V0OwotICAgIH0KLX0KLQotI2VuZGlmIC8qIE5MTUNPTlZfUE9XRVJQQyAqLwotDAotLyogTmFtZSBvZiBsaW5rZXIuICAqLwotI2lmbmRlZiBMRF9OQU1FCi0jZGVmaW5lIExEX05BTUUgImxkIgotI2VuZGlmCi0KLS8qIFRlbXBvcmFyeSBmaWxlIG5hbWUgYmFzZS4gICovCi1zdGF0aWMgY2hhciAqdGVtcF9maWxlbmFtZTsKLQotLyogVGhlIHVzZXIgaGFzIHNwZWNpZmllZCBzZXZlcmFsIGlucHV0IGZpbGVzLiAgSW52b2tlIHRoZSBsaW5rZXIgdG8KLSAgIGxpbmsgdGhlbSBhbGwgdG9nZXRoZXIsIGFuZCBjb252ZXJ0IGFuZCBkZWxldGUgdGhlIHJlc3VsdGluZyBvdXRwdXQKLSAgIGZpbGUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1saW5rX2lucHV0cyAoaW5wdXRzLCBsZCkKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICppbnB1dHM7Ci0gICAgIGNoYXIgKmxkOwotewotICBzaXplX3QgYzsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpxOwotICBjaGFyICoqYXJndjsKLSAgc2l6ZV90IGk7Ci0gIGludCBwaWQ7Ci0gIGludCBzdGF0dXM7Ci0gIGNoYXIgKmVycmZtdDsKLSAgY2hhciAqZXJyYXJnOwotCi0gIGMgPSAwOwotICBmb3IgKHEgPSBpbnB1dHM7IHEgIT0gTlVMTDsgcSA9IHEtPm5leHQpCi0gICAgKytjOwotCi0gIGFyZ3YgPSAoY2hhciAqKikgYWxsb2NhICgoYyArIDUpICogc2l6ZW9mKGNoYXIgKikpOwotCi0jaWZuZGVmIF9fTVNET1NfXwotICBpZiAobGQgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICpwOwotCi0gICAgICAvKiBGaW5kIHRoZSBsaW5rZXIgdG8gaW52b2tlIGJhc2VkIG9uIGhvdyBubG1jb252IHdhcyBydW4uICAqLwotICAgICAgcCA9IHByb2dyYW1fbmFtZSArIHN0cmxlbiAocHJvZ3JhbV9uYW1lKTsKLSAgICAgIHdoaWxlIChwICE9IHByb2dyYW1fbmFtZSkKLQl7Ci0JICBpZiAocFstMV0gPT0gJy8nKQotCSAgICB7Ci0JICAgICAgbGQgPSAoY2hhciAqKSB4bWFsbG9jIChwIC0gcHJvZ3JhbV9uYW1lICsgc3RybGVuIChMRF9OQU1FKSArIDEpOwotCSAgICAgIG1lbWNweSAobGQsIHByb2dyYW1fbmFtZSwgcCAtIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgc3RyY3B5IChsZCArIChwIC0gcHJvZ3JhbV9uYW1lKSwgTERfTkFNRSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIC0tcDsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKGxkID09IE5VTEwpCi0gICAgbGQgPSAoY2hhciAqKSBMRF9OQU1FOwotCi0gIHRlbXBfZmlsZW5hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotCi0gIHVubGlua19vbl9leGl0ID0geG1hbGxvYyAoc3RybGVuICh0ZW1wX2ZpbGVuYW1lKSArIDMpOwotICBzcHJpbnRmICh1bmxpbmtfb25fZXhpdCwgIiVzLk8iLCB0ZW1wX2ZpbGVuYW1lKTsKLQotICBhcmd2WzBdID0gbGQ7Ci0gIGFyZ3ZbMV0gPSAoY2hhciAqKSAiLVVyIjsKLSAgYXJndlsyXSA9IChjaGFyICopICItbyI7Ci0gIGFyZ3ZbM10gPSB1bmxpbmtfb25fZXhpdDsKLSAgaSA9IDQ7Ci0gIGZvciAocSA9IGlucHV0czsgcSAhPSBOVUxMOyBxID0gcS0+bmV4dCwgaSsrKQotICAgIGFyZ3ZbaV0gPSBxLT5zdHJpbmc7Ci0gIGFyZ3ZbaV0gPSBOVUxMOwotCi0gIGlmIChkZWJ1ZykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBhcmd2W2ldICE9IE5VTEw7IGkrKykKLQlmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBhcmd2W2ldKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotCi0gIHBpZCA9IHBleGVjdXRlIChsZCwgYXJndiwgcHJvZ3JhbV9uYW1lLCAoY2hhciAqKSBOVUxMLCAmZXJyZm10LCAmZXJyYXJnLAotCQkgIFBFWEVDVVRFX1NFQVJDSCB8IFBFWEVDVVRFX09ORSk7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZXhlY3V0aW9uIG9mICVzIGZhaWxlZDogIiksIHByb2dyYW1fbmFtZSwgbGQpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBlcnJmbXQsIGVycmFyZyk7Ci0gICAgICB1bmxpbmsgKHVubGlua19vbl9leGl0KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocHdhaXQgKHBpZCwgJnN0YXR1cywgMCkgPCAwKQotICAgIHsKLSAgICAgIHBlcnJvciAoInB3YWl0Iik7Ci0gICAgICB1bmxpbmsgKHVubGlua19vbl9leGl0KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogRXhlY3V0aW9uIG9mICVzIGZhaWxlZFxuIiksIHByb2dyYW1fbmFtZSwgbGQpOwotICAgICAgdW5saW5rICh1bmxpbmtfb25fZXhpdCk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHVubGlua19vbl9leGl0OwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvbmxtY29udi5oIGIvYmludXRpbHMvbmxtY29udi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTJhNTU3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWNvbnYuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qIG5sbWNvbnYuaCAtLSBoZWFkZXIgZmlsZSBmb3IgTkxNIGNvbnZlcnNpb24gcHJvZ3JhbQotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBiZmQuaCwgbmxtL2NvbW1vbi5oIGFuZCBubG0vaW50ZXJuYWwuaCBtdXN0IGJlIGluY2x1ZGVkIGJlZm9yZSB0aGlzCi0gICBmaWxlLiAgKi8KLQotLyogQSBsaW5rZWQgbGlzdCBvZiBzdHJpbmdzLiAgKi8KLQotc3RydWN0IHN0cmluZ19saXN0Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqbmV4dDsKLSAgY2hhciAqc3RyaW5nOwotfTsKLQotLyogVGhlIE5MTSBoZWFkZXIgcGFyc2VyIGluIG5sbWhlYWRlci55IHN0b3JlcyBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgIGZvbGxvd2luZyB2YXJpYWJsZXMuICAqLwotCi1leHRlcm4gTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlciAqZml4ZWRfaGRyOwotZXh0ZXJuIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgKnZhcl9oZHI7Ci1leHRlcm4gTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyICp2ZXJzaW9uX2hkcjsKLWV4dGVybiBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlciAqY29weXJpZ2h0X2hkcjsKLWV4dGVybiBObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyICpleHRlbmRlZF9oZHI7Ci0KLS8qIFByb2NlZHVyZSBuYW1lZCBieSBDSEVDSy4gICovCi1leHRlcm4gY2hhciAqY2hlY2tfcHJvY2VkdXJlOwotLyogRmlsZSBuYW1lZCBieSBDVVNUT00uICAqLwotZXh0ZXJuIGNoYXIgKmN1c3RvbV9maWxlOwotLyogV2hldGhlciB0byBnZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKERFQlVHKS4gICovCi1leHRlcm4gYm9vbGVhbiBkZWJ1Z19pbmZvOwotLyogUHJvY2VkdXJlIG5hbWVkIGJ5IEVYSVQuICAqLwotZXh0ZXJuIGNoYXIgKmV4aXRfcHJvY2VkdXJlOwotLyogRXhwb3J0ZWQgc3ltYm9scyAoRVhQT1JUKS4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICpleHBvcnRfc3ltYm9sczsKLS8qIExpc3Qgb2YgZmlsZXMgZnJvbSBJTlBVVC4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICppbnB1dF9maWxlczsKLS8qIE1hcCBmaWxlIG5hbWUgKE1BUCwgRlVMTE1BUCkuICAqLwotZXh0ZXJuIGNoYXIgKm1hcF9maWxlOwotLyogV2hldGhlciBhIGZ1bGwgbWFwIGhhcyBiZWVuIHJlcXVlc3RlZCAoRlVMTE1BUCkuICAqLwotZXh0ZXJuIGJvb2xlYW4gZnVsbF9tYXA7Ci0vKiBGaWxlIG5hbWVkIGJ5IEhFTFAuICAqLwotZXh0ZXJuIGNoYXIgKmhlbHBfZmlsZTsKLS8qIEltcG9ydGVkIHN5bWJvbHMgKElNUE9SVCkuICAqLwotZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqaW1wb3J0X3N5bWJvbHM7Ci0vKiBGaWxlIG5hbWVkIGJ5IE1FU1NBR0VTLiAgKi8KLWV4dGVybiBjaGFyICptZXNzYWdlX2ZpbGU7Ci0vKiBBdXRvbG9hZCBtb2R1bGUgbGlzdCAoTU9EVUxFKS4gICovCi1leHRlcm4gc3RydWN0IHN0cmluZ19saXN0ICptb2R1bGVzOwotLyogRmlsZSBuYW1lZCBieSBPVVRQVVQuICAqLwotZXh0ZXJuIGNoYXIgKm91dHB1dF9maWxlOwotLyogRmlsZSBuYW1lZCBieSBTSEFSRUxJQi4gICovCi1leHRlcm4gY2hhciAqc2hhcmVsaWJfZmlsZTsKLS8qIFN0YXJ0IHByb2NlZHVyZSBuYW1lIChTVEFSVCkuICAqLwotZXh0ZXJuIGNoYXIgKnN0YXJ0X3Byb2NlZHVyZTsKLS8qIFZFUkJPU0UuICAqLwotZXh0ZXJuIGJvb2xlYW4gdmVyYm9zZTsKLS8qIFJQQyBkZXNjcmlwdGlvbiBmaWxlIChYRENEQVRBKS4gICovCi1leHRlcm4gY2hhciAqcnBjX2ZpbGU7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygc2VyaW91cyBwYXJzZSBlcnJvcnMuICAqLwotZXh0ZXJuIGludCBwYXJzZV9lcnJvcnM7Ci0KLS8qIFRoZSBwYXJzZXIuICAqLwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGVsbCB0aGUgbGV4ZXIgd2hhdCBmaWxlIHRvIHJlYWQuICAqLwotZXh0ZXJuIGJvb2xlYW4gbmxtbGV4X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy9ubG1oZWFkZXIueSBiL2JpbnV0aWxzL25sbWhlYWRlci55CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjFlMjJhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25sbWhlYWRlci55CisrKyAvZGV2L251bGwKQEAgLTEsOTc4ICswLDAgQEAKLSV7LyogbmxtaGVhZGVyLnkgLSBwYXJzZSBOTE0gaGVhZGVyIHNwZWNpZmljYXRpb24ga2V5d29yZHMuCi0gICAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBiaXNvbiBmaWxlIHBhcnNlcyB0aGUgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgTmV0V2FyZSBOTE0KLSAgIGxpbmtlciwgZXhjZXB0IGZvciBsaXN0cyBvZiBvYmplY3QgZmlsZXMuICBJdCBzdG9yZXMgdGhlCi0gICBpbmZvcm1hdGlvbiBpbiBnbG9iYWwgdmFyaWFibGVzLgotCi0gICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgTmV0V2FyZSBUb29sCi0gICBNYWtlciBTcGVjaWZpY2F0aW9uIG1hbnVhbCwgZWRpdGlvbiAxLjAuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibmxtL2NvbW1vbi5oIgotI2luY2x1ZGUgIm5sbS9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIm5sbWNvbnYuaCIKLQotLyogSW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIHRoZSBzdHJ1Y3R1cmVzIHBvaW50ZWQgdG8gYnkgdGhlc2UKLSAgIHZhcmlhYmxlcy4gICovCi0KLU5sbV9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgKmZpeGVkX2hkcjsKLU5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIgKnZhcl9oZHI7Ci1ObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIgKnZlcnNpb25faGRyOwotTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgKmNvcHlyaWdodF9oZHI7Ci1ObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyICpleHRlbmRlZF9oZHI7Ci0KLS8qIFByb2NlZHVyZSBuYW1lZCBieSBDSEVDSy4gICovCi1jaGFyICpjaGVja19wcm9jZWR1cmU7Ci0vKiBGaWxlIG5hbWVkIGJ5IENVU1RPTS4gICovCi1jaGFyICpjdXN0b21fZmlsZTsKLS8qIFdoZXRoZXIgdG8gZ2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIChERUJVRykuICAqLwotYm9vbGVhbiBkZWJ1Z19pbmZvOwotLyogUHJvY2VkdXJlIG5hbWVkIGJ5IEVYSVQuICAqLwotY2hhciAqZXhpdF9wcm9jZWR1cmU7Ci0vKiBFeHBvcnRlZCBzeW1ib2xzIChFWFBPUlQpLiAgKi8KLXN0cnVjdCBzdHJpbmdfbGlzdCAqZXhwb3J0X3N5bWJvbHM7Ci0vKiBMaXN0IG9mIGZpbGVzIGZyb20gSU5QVVQuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICppbnB1dF9maWxlczsKLS8qIE1hcCBmaWxlIG5hbWUgKE1BUCwgRlVMTE1BUCkuICAqLwotY2hhciAqbWFwX2ZpbGU7Ci0vKiBXaGV0aGVyIGEgZnVsbCBtYXAgaGFzIGJlZW4gcmVxdWVzdGVkIChGVUxMTUFQKS4gICovCi1ib29sZWFuIGZ1bGxfbWFwOwotLyogRmlsZSBuYW1lZCBieSBIRUxQLiAgKi8KLWNoYXIgKmhlbHBfZmlsZTsKLS8qIEltcG9ydGVkIHN5bWJvbHMgKElNUE9SVCkuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICppbXBvcnRfc3ltYm9sczsKLS8qIEZpbGUgbmFtZWQgYnkgTUVTU0FHRVMuICAqLwotY2hhciAqbWVzc2FnZV9maWxlOwotLyogQXV0b2xvYWQgbW9kdWxlIGxpc3QgKE1PRFVMRSkuICAqLwotc3RydWN0IHN0cmluZ19saXN0ICptb2R1bGVzOwotLyogRmlsZSBuYW1lZCBieSBPVVRQVVQuICAqLwotY2hhciAqb3V0cHV0X2ZpbGU7Ci0vKiBGaWxlIG5hbWVkIGJ5IFNIQVJFTElCLiAgKi8KLWNoYXIgKnNoYXJlbGliX2ZpbGU7Ci0vKiBTdGFydCBwcm9jZWR1cmUgbmFtZSAoU1RBUlQpLiAgKi8KLWNoYXIgKnN0YXJ0X3Byb2NlZHVyZTsKLS8qIFZFUkJPU0UuICAqLwotYm9vbGVhbiB2ZXJib3NlOwotLyogUlBDIGRlc2NyaXB0aW9uIGZpbGUgKFhEQ0RBVEEpLiAgKi8KLWNoYXIgKnJwY19maWxlOwotCi0vKiBUaGUgbnVtYmVyIG9mIHNlcmlvdXMgZXJyb3JzIHRoYXQgaGF2ZSBvY2N1cnJlZC4gICovCi1pbnQgcGFyc2VfZXJyb3JzOwotCi0vKiBUaGUgY3VycmVudCBzeW1ib2wgcHJlZml4IHdoZW4gcmVhZGluZyBhIGxpc3Qgb2YgaW1wb3J0IG9yIGV4cG9ydAotICAgc3ltYm9scy4gICovCi1zdGF0aWMgY2hhciAqc3ltYm9sX3ByZWZpeDsKLQotLyogUGFyc2VyIGVycm9yIG1lc3NhZ2UgaGFuZGxlci4gICovCi0jZGVmaW5lIHl5ZXJyb3IobXNnKSBubG1oZWFkZXJfZXJyb3IgKG1zZyk7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG5sbWxleF9maWxlX3B1c2ggUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBubG1sZXhfZmlsZV9vcGVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBubG1sZXhfYnVmX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgbmxtbGV4X2J1Zl9hZGQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgbG9uZyBubG1sZXhfZ2V0X251bWJlciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIG5sbWhlYWRlcl9pZGVudGlmeSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBubG1oZWFkZXJfd2FybiBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgbmxtaGVhZGVyX2Vycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqIHN0cmluZ19saXN0X2NvbnMgUEFSQU1TICgoY2hhciAqLAotCQkJCQkJICAgICAgc3RydWN0IHN0cmluZ19saXN0ICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiBzdHJpbmdfbGlzdF9hcHBlbmQgUEFSQU1TICgoc3RydWN0IHN0cmluZ19saXN0ICosCi0JCQkJCQkJc3RydWN0IHN0cmluZ19saXN0ICopKTsKLXN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiBzdHJpbmdfbGlzdF9hcHBlbmQxIFBBUkFNUyAoKHN0cnVjdCBzdHJpbmdfbGlzdCAqLAotCQkJCQkJCSBjaGFyICopKTsKLXN0YXRpYyBjaGFyICp4c3RyZHVwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0lfQotCi0ldW5pb24KLXsKLSAgY2hhciAqc3RyaW5nOwotICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmxpc3Q7Ci19OwotCi0vKiBUaGUgcmVzZXJ2ZWQgd29yZHMuICAqLwotCi0ldG9rZW4gQ0hFQ0sgQ09ERVNUQVJUIENPUFlSSUdIVCBDVVNUT00gREFURSBERUJVRyBERVNDUklQVElPTiBFWElUCi0ldG9rZW4gRVhQT1JUIEZMQUdfT04gRkxBR19PRkYgRlVMTE1BUCBIRUxQIElNUE9SVCBJTlBVVCBNQVAgTUVTU0FHRVMKLSV0b2tlbiBNT0RVTEUgTVVMVElQTEUgT1NfRE9NQUlOIE9VVFBVVCBQU0VVRE9QUkVFTVBUSU9OIFJFRU5UUkFOVAotJXRva2VuIFNDUkVFTk5BTUUgU0hBUkVMSUIgU1RBQ0sgU1RBUlQgU1lOQ0hST05JWkUKLSV0b2tlbiBUSFJFQUROQU1FIFRZUEUgVkVSQk9TRSBWRVJTSU9OSyBYRENEQVRBCi0KLS8qIEFyZ3VtZW50cy4gICovCi0KLSV0b2tlbiA8c3RyaW5nPiBTVFJJTkcKLSV0b2tlbiA8c3RyaW5nPiBRVU9URURfU1RSSU5HCi0KLS8qIFR5cGVkIG5vbi10ZXJtaW5hbHMuICAqLwotJXR5cGUgPGxpc3Q+IHN5bWJvbF9saXN0X29wdCBzeW1ib2xfbGlzdCBzdHJpbmdfbGlzdAotJXR5cGUgPHN0cmluZz4gc3ltYm9sCi0KLSUlCi0KLS8qIEtleXdvcmRzIG11c3Qgc3RhcnQgaW4gdGhlIGxlZnRtb3N0IGNvbHVtbiBvZiB0aGUgZmlsZS4gIEFyZ3VtZW50cwotICAgbWF5IGFwcGVhciBhbnl3aGVyZSBlbHNlLiAgVGhlIGxleGVyIHVzZXMgdGhpcyB0byBkZXRlcm1pbmUgd2hhdAotICAgdG9rZW4gdG8gcmV0dXJuLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0IGhlcmUuICAqLwotCi0vKiBUaGUgZW50aXJlIGZpbGUgaXMganVzdCBhIGxpc3Qgb2YgY29tbWFuZHMuICAqLwotCi1maWxlOgkKLQkgIGNvbW1hbmRzCi0JOwotCi0vKiBBIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2YgY29tbWFuZHMuICAqLwotCi1jb21tYW5kczoKLQkgIC8qIE1heSBiZSBlbXB0eS4gICovCi0JfCBjb21tYW5kIGNvbW1hbmRzCi0JOwotCi0vKiBBIHNpbmdsZSBjb21tYW5kLiAgVGhlcmUgaXMgd2hlcmUgbW9zdCBvZiB0aGUgd29yayB0YWtlcyBwbGFjZS4gICovCi0KLWNvbW1hbmQ6Ci0JICBDSEVDSyBTVFJJTkcKLQkgIHsKLQkgICAgY2hlY2tfcHJvY2VkdXJlID0gJDI7Ci0JICB9Ci0JfCBDT0RFU1RBUlQgU1RSSU5HCi0JICB7Ci0JICAgIG5sbWhlYWRlcl93YXJuIChfKCJDT0RFU1RBUlQgaXMgbm90IGltcGxlbWVudGVkOyBzb3JyeSIpLCAtMSk7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IENPUFlSSUdIVCBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgc3RybmNweSAoY29weXJpZ2h0X2hkci0+c3RhbXAsICJDb1B5UmlHaFQ9IiwgMTApOwotCSAgICBsZW4gPSBzdHJsZW4gKCQyKTsKLQkgICAgaWYgKGxlbiA+PSBOTE1fTUFYX0NPUFlSSUdIVF9NRVNTQUdFX0xFTkdUSCkKLQkgICAgICB7Ci0JCW5sbWhlYWRlcl93YXJuIChfKCJjb3B5cmlnaHQgc3RyaW5nIGlzIHRvbyBsb25nIiksCi0JCQkJTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEggLSAxKTsKLQkJbGVuID0gTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEggLSAxOwotCSAgICAgIH0KLQkgICAgY29weXJpZ2h0X2hkci0+Y29weXJpZ2h0TWVzc2FnZUxlbmd0aCA9IGxlbjsKLQkgICAgc3RybmNweSAoY29weXJpZ2h0X2hkci0+Y29weXJpZ2h0TWVzc2FnZSwgJDIsIGxlbik7Ci0JICAgIGNvcHlyaWdodF9oZHItPmNvcHlyaWdodE1lc3NhZ2VbbGVuXSA9ICdcMCc7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IENVU1RPTSBTVFJJTkcKLQkgIHsKLQkgICAgY3VzdG9tX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IERBVEUgU1RSSU5HIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgLyogV2UgZG9uJ3Qgc2V0IHRoZSB2ZXJzaW9uIHN0YW1wIGhlcmUsIGJlY2F1c2Ugd2UgdXNlIHRoZQotCSAgICAgICB2ZXJzaW9uIHN0YW1wIHRvIGRldGVjdCB3aGV0aGVyIHRoZSByZXF1aXJlZCBWRVJTSU9OCi0JICAgICAgIGtleXdvcmQgd2FzIGdpdmVuLiAgKi8KLQkgICAgdmVyc2lvbl9oZHItPm1vbnRoID0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgdmVyc2lvbl9oZHItPmRheSA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIHZlcnNpb25faGRyLT55ZWFyID0gbmxtbGV4X2dldF9udW1iZXIgKCQ0KTsKLQkgICAgZnJlZSAoJDIpOwotCSAgICBmcmVlICgkMyk7Ci0JICAgIGZyZWUgKCQ0KTsKLQkgICAgaWYgKHZlcnNpb25faGRyLT5tb250aCA8IDEgfHwgdmVyc2lvbl9oZHItPm1vbnRoID4gMTIpCi0JICAgICAgbmxtaGVhZGVyX3dhcm4gKF8oImlsbGVnYWwgbW9udGgiKSwgLTEpOwotCSAgICBpZiAodmVyc2lvbl9oZHItPmRheSA8IDEgfHwgdmVyc2lvbl9oZHItPmRheSA+IDMxKQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIGRheSIpLCAtMSk7Ci0JICAgIGlmICh2ZXJzaW9uX2hkci0+eWVhciA8IDE5MDAgfHwgdmVyc2lvbl9oZHItPnllYXIgPiAzMDAwKQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIHllYXIiKSwgLTEpOwotCSAgfQotCXwgREVCVUcKLQkgIHsKLQkgICAgZGVidWdfaW5mbyA9IHRydWU7Ci0JICB9Ci0JfCBERVNDUklQVElPTiBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuICgkMik7Ci0JICAgIGlmIChsZW4gPiBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCkKLQkgICAgICB7Ci0JCW5sbWhlYWRlcl93YXJuIChfKCJkZXNjcmlwdGlvbiBzdHJpbmcgaXMgdG9vIGxvbmciKSwKLQkJCQlOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCk7Ci0JCWxlbiA9IE5MTV9NQVhfREVTQ1JJUFRJT05fTEVOR1RIOwotCSAgICAgIH0KLQkgICAgdmFyX2hkci0+ZGVzY3JpcHRpb25MZW5ndGggPSBsZW47Ci0JICAgIHN0cm5jcHkgKHZhcl9oZHItPmRlc2NyaXB0aW9uVGV4dCwgJDIsIGxlbik7Ci0JICAgIHZhcl9oZHItPmRlc2NyaXB0aW9uVGV4dFtsZW5dID0gJ1wwJzsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgRVhJVCBTVFJJTkcKLQkgIHsKLQkgICAgZXhpdF9wcm9jZWR1cmUgPSAkMjsKLQkgIH0KLQl8IEVYUE9SVAotCSAgewotCSAgICBzeW1ib2xfcHJlZml4ID0gTlVMTDsKLQkgIH0KLQkgIHN5bWJvbF9saXN0X29wdAotCSAgewotCSAgICBleHBvcnRfc3ltYm9scyA9IHN0cmluZ19saXN0X2FwcGVuZCAoZXhwb3J0X3N5bWJvbHMsICQzKTsKLQkgIH0KLQl8IEZMQUdfT04gU1RSSU5HCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gbmxtbGV4X2dldF9udW1iZXIgKCQyKTsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgRkxBR19PRkYgU1RSSU5HCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgJj1+IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIGZyZWUgKCQyKTsKLQkgIH0KLQl8IEZVTExNQVAKLQkgIHsKLQkgICAgbWFwX2ZpbGUgPSAiIjsKLQkgICAgZnVsbF9tYXAgPSB0cnVlOwotCSAgfQotCXwgRlVMTE1BUCBTVFJJTkcKLQkgIHsKLQkgICAgbWFwX2ZpbGUgPSAkMjsKLQkgICAgZnVsbF9tYXAgPSB0cnVlOwotCSAgfQotCXwgSEVMUCBTVFJJTkcKLQkgIHsKLQkgICAgaGVscF9maWxlID0gJDI7Ci0JICB9Ci0JfCBJTVBPUlQKLQkgIHsKLQkgICAgc3ltYm9sX3ByZWZpeCA9IE5VTEw7Ci0JICB9Ci0JICBzeW1ib2xfbGlzdF9vcHQKLQkgIHsKLQkgICAgaW1wb3J0X3N5bWJvbHMgPSBzdHJpbmdfbGlzdF9hcHBlbmQgKGltcG9ydF9zeW1ib2xzLCAkMyk7Ci0JICB9Ci0JfCBJTlBVVCBzdHJpbmdfbGlzdAotCSAgewotCSAgICBpbnB1dF9maWxlcyA9IHN0cmluZ19saXN0X2FwcGVuZCAoaW5wdXRfZmlsZXMsICQyKTsKLQkgIH0KLQl8IE1BUAotCSAgewotCSAgICBtYXBfZmlsZSA9ICIiOwotCSAgfQotCXwgTUFQIFNUUklORwotCSAgewotCSAgICBtYXBfZmlsZSA9ICQyOwotCSAgfQotCXwgTUVTU0FHRVMgU1RSSU5HCi0JICB7Ci0JICAgIG1lc3NhZ2VfZmlsZSA9ICQyOwotCSAgfQotCXwgTU9EVUxFIHN0cmluZ19saXN0Ci0JICB7Ci0JICAgIG1vZHVsZXMgPSBzdHJpbmdfbGlzdF9hcHBlbmQgKG1vZHVsZXMsICQyKTsKLQkgIH0KLQl8IE1VTFRJUExFCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgyOwotCSAgfQotCXwgT1NfRE9NQUlOCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgxMDsKLQkgIH0KLQl8IE9VVFBVVCBTVFJJTkcKLQkgIHsKLQkgICAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0JICAgICAgb3V0cHV0X2ZpbGUgPSAkMjsKLQkgICAgZWxzZQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpZ25vcmluZyBkdXBsaWNhdGUgT1VUUFVUIHN0YXRlbWVudCIpLCAtMSk7Ci0JICB9Ci0JfCBQU0VVRE9QUkVFTVBUSU9OCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHg4OwotCSAgfQotCXwgUkVFTlRSQU5UCi0JICB7Ci0JICAgIGZpeGVkX2hkci0+ZmxhZ3MgfD0gMHgxOwotCSAgfQotCXwgU0NSRUVOTkFNRSBRVU9URURfU1RSSU5HCi0JICB7Ci0JICAgIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuICgkMik7Ci0JICAgIGlmIChsZW4gPj0gTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEgpCi0JICAgICAgewotCQlubG1oZWFkZXJfd2FybiAoXygic2NyZWVuIG5hbWUgaXMgdG9vIGxvbmciKSwKLQkJCQlOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSCk7Ci0JCWxlbiA9IE5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIOwotCSAgICAgIH0KLQkgICAgdmFyX2hkci0+c2NyZWVuTmFtZUxlbmd0aCA9IGxlbjsKLQkgICAgc3RybmNweSAodmFyX2hkci0+c2NyZWVuTmFtZSwgJDIsIGxlbik7Ci0JICAgIHZhcl9oZHItPnNjcmVlbk5hbWVbTkxNX01BWF9TQ1JFRU5fTkFNRV9MRU5HVEhdID0gJ1wwJzsKLQkgICAgZnJlZSAoJDIpOwotCSAgfQotCXwgU0hBUkVMSUIgU1RSSU5HCi0JICB7Ci0JICAgIHNoYXJlbGliX2ZpbGUgPSAkMjsKLQkgIH0KLQl8IFNUQUNLIFNUUklORwotCSAgewotCSAgICB2YXJfaGRyLT5zdGFja1NpemUgPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBTVEFSVCBTVFJJTkcKLQkgIHsKLQkgICAgc3RhcnRfcHJvY2VkdXJlID0gJDI7Ci0JICB9Ci0JfCBTWU5DSFJPTklaRQotCSAgewotCSAgICBmaXhlZF9oZHItPmZsYWdzIHw9IDB4NDsKLQkgIH0KLQl8IFRIUkVBRE5BTUUgUVVPVEVEX1NUUklORwotCSAgewotCSAgICBpbnQgbGVuOwotCi0JICAgIGxlbiA9IHN0cmxlbiAoJDIpOwotCSAgICBpZiAobGVuID49IE5MTV9NQVhfVEhSRUFEX05BTUVfTEVOR1RIKQotCSAgICAgIHsKLQkJbmxtaGVhZGVyX3dhcm4gKF8oInRocmVhZCBuYW1lIGlzIHRvbyBsb25nIiksCi0JCQkJTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgpOwotCQlsZW4gPSBOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSDsKLQkgICAgICB9Ci0JICAgIHZhcl9oZHItPnRocmVhZE5hbWVMZW5ndGggPSBsZW47Ci0JICAgIHN0cm5jcHkgKHZhcl9oZHItPnRocmVhZE5hbWUsICQyLCBsZW4pOwotCSAgICB2YXJfaGRyLT50aHJlYWROYW1lW2xlbl0gPSAnXDAnOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBUWVBFIFNUUklORwotCSAgewotCSAgICBmaXhlZF9oZHItPm1vZHVsZVR5cGUgPSBubG1sZXhfZ2V0X251bWJlciAoJDIpOwotCSAgICBmcmVlICgkMik7Ci0JICB9Ci0JfCBWRVJCT1NFCi0JICB7Ci0JICAgIHZlcmJvc2UgPSB0cnVlOwotCSAgfQotCXwgVkVSU0lPTksgU1RSSU5HIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0KLQkgICAgc3RybmNweSAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKLQkgICAgdmVyc2lvbl9oZHItPm1ham9yVmVyc2lvbiA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIHZhbCA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDk5KQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIG1pbm9yIHZlcnNpb24gbnVtYmVyIChtdXN0IGJlIGJldHdlZW4gMCBhbmQgOTkpIiksCi0JCQkgICAgICAtMSk7Ci0JICAgIGVsc2UKLQkgICAgICB2ZXJzaW9uX2hkci0+bWlub3JWZXJzaW9uID0gdmFsOwotCSAgICB2YWwgPSBubG1sZXhfZ2V0X251bWJlciAoJDQpOwotCSAgICBpZiAodmFsIDwgMCkKLQkgICAgICBubG1oZWFkZXJfd2FybiAoXygiaWxsZWdhbCByZXZpc2lvbiBudW1iZXIgKG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNikiKSwKLQkJCSAgICAgIC0xKTsKLQkgICAgZWxzZSBpZiAodmFsID4gMjYpCi0JICAgICAgdmVyc2lvbl9oZHItPnJldmlzaW9uID0gMDsKLQkgICAgZWxzZQotCSAgICAgIHZlcnNpb25faGRyLT5yZXZpc2lvbiA9IHZhbDsKLQkgICAgZnJlZSAoJDIpOwotCSAgICBmcmVlICgkMyk7Ci0JICAgIGZyZWUgKCQ0KTsKLQkgIH0KLQl8IFZFUlNJT05LIFNUUklORyBTVFJJTkcKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0KLQkgICAgc3RybmNweSAodmVyc2lvbl9oZHItPnN0YW1wLCAiVmVSc0lvTiMiLCA4KTsKLQkgICAgdmVyc2lvbl9oZHItPm1ham9yVmVyc2lvbiA9IG5sbWxleF9nZXRfbnVtYmVyICgkMik7Ci0JICAgIHZhbCA9IG5sbWxleF9nZXRfbnVtYmVyICgkMyk7Ci0JICAgIGlmICh2YWwgPCAwIHx8IHZhbCA+IDk5KQotCSAgICAgIG5sbWhlYWRlcl93YXJuIChfKCJpbGxlZ2FsIG1pbm9yIHZlcnNpb24gbnVtYmVyIChtdXN0IGJlIGJldHdlZW4gMCBhbmQgOTkpIiksCi0JCQkgICAgICAtMSk7Ci0JICAgIGVsc2UKLQkgICAgICB2ZXJzaW9uX2hkci0+bWlub3JWZXJzaW9uID0gdmFsOwotCSAgICB2ZXJzaW9uX2hkci0+cmV2aXNpb24gPSAwOwotCSAgICBmcmVlICgkMik7Ci0JICAgIGZyZWUgKCQzKTsKLQkgIH0KLQl8IFhEQ0RBVEEgU1RSSU5HCi0JICB7Ci0JICAgIHJwY19maWxlID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHBvc3NpYmx5IGVtcHR5IGxpc3Qgb2Ygc3ltYm9scy4gICovCi0KLXN5bWJvbF9saXN0X29wdDoKLQkgIC8qIEVtcHR5LiAgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgc3ltYm9sX2xpc3QKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEEgbGlzdCBvZiBzeW1ib2xzIGluIGFuIGltcG9ydCBvciBleHBvcnQgbGlzdC4gIFByZWZpeGVzIG1heSBhcHBlYXIKLSAgIGluIHBhcmVudGhlc2VzLiAgV2UgbmVlZCB0byB1c2UgbGVmdCByZWN1cnNpb24gaGVyZSB0byBhdm9pZAotICAgYnVpbGRpbmcgdXAgYSBsYXJnZSBpbXBvcnQgbGlzdCBvbiB0aGUgcGFyc2VyIHN0YWNrLiAgKi8KLQotc3ltYm9sX2xpc3Q6Ci0JICBzeW1ib2wKLQkgIHsKLQkgICAgJCQgPSBzdHJpbmdfbGlzdF9jb25zICgkMSwgTlVMTCk7Ci0JICB9Ci0JfCBzeW1ib2xfcHJlZml4Ci0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IHN5bWJvbF9saXN0IHN5bWJvbAotCSAgewotCSAgICAkJCA9IHN0cmluZ19saXN0X2FwcGVuZDEgKCQxLCAkMik7Ci0JICB9Ci0JfCBzeW1ib2xfbGlzdCBzeW1ib2xfcHJlZml4Ci0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBBIHByZWZpeCBmb3Igc3Vic2VxdWVudCBzeW1ib2xzLiAgKi8KLQotc3ltYm9sX3ByZWZpeDoKLQkgICcoJyBTVFJJTkcgJyknCi0JICB7Ci0JICAgIGlmIChzeW1ib2xfcHJlZml4ICE9IE5VTEwpCi0JICAgICAgZnJlZSAoc3ltYm9sX3ByZWZpeCk7Ci0JICAgIHN5bWJvbF9wcmVmaXggPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEEgc2luZ2xlIHN5bWJvbC4gICovCi0KLXN5bWJvbDoKLQkgIFNUUklORwotCSAgewotCSAgICBpZiAoc3ltYm9sX3ByZWZpeCA9PSBOVUxMKQotCSAgICAgICQkID0gJDE7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSQkID0geG1hbGxvYyAoc3RybGVuIChzeW1ib2xfcHJlZml4KSArIHN0cmxlbiAoJDEpICsgMik7Ci0JCXNwcmludGYgKCQkLCAiJXNAJXMiLCBzeW1ib2xfcHJlZml4LCAkMSk7Ci0JCWZyZWUgKCQxKTsKLQkgICAgICB9Ci0JICB9Ci0JOwotCi0vKiBBIGxpc3Qgb2Ygc3RyaW5ncy4gICovCi0KLXN0cmluZ19saXN0OgotCSAgLyogTWF5IGJlIGVtcHR5LiAgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgU1RSSU5HIHN0cmluZ19saXN0Ci0JICB7Ci0JICAgICQkID0gc3RyaW5nX2xpc3RfY29ucyAoJDEsICQyKTsKLQkgIH0KLQk7Ci0KLSUlCi0KLS8qIElmIHN0cmVycm9yIGlzIGp1c3QgYSBtYWNybywgd2Ugd2FudCB0byB1c2UgdGhlIG9uZSBmcm9tIGxpYmliZXJ0eQotICAgc2luY2UgaXQgd2lsbCBoYW5kbGUgdW5kZWZpbmVkIHZhbHVlcy4gICovCi0jdW5kZWYgc3RyZXJyb3IKLWV4dGVybiBjaGFyICpzdHJlcnJvciAoKTsKLQotLyogVGhlIGxleGVyIGlzIHNpbXBsZSwgdG9vIHNpbXBsZSBmb3IgZmxleC4gIEtleXdvcmRzIGFyZSBvbmx5Ci0gICByZWNvZ25pemVkIGF0IHRoZSBzdGFydCBvZiBsaW5lcy4gIEV2ZXJ5dGhpbmcgZWxzZSBtdXN0IGJlIGFuCi0gICBhcmd1bWVudC4gIEEgY29tbWEgaXMgdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLiAgKi8KLQotLyogVGhlIHN0YXRlcyB0aGUgbGV4ZXIgY2FuIGJlIGluLiAgKi8KLQotZW51bSBsZXhfc3RhdGUKLXsKLSAgLyogQXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotICBCRUdJTk5JTkdfT0ZfTElORSwKLSAgLyogSW4gdGhlIG1pZGRsZSBvZiBhIGxpbmUuICAqLwotICBJTl9MSU5FCi19OwotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBzdGFjayBvZiBmaWxlcyB0byBoYW5kbGUgZmlsZSBpbmNsdXNpb24uICAqLwotCi1zdHJ1Y3QgaW5wdXQKLXsKLSAgLyogVGhlIGZpbGUgdG8gcmVhZCBmcm9tLiAgKi8KLSAgRklMRSAqZmlsZTsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIGZpbGUuICAqLwotICBjaGFyICpuYW1lOwotICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlci4gICovCi0gIGludCBsaW5lbm87Ci0gIC8qIFRoZSBjdXJyZW50IHN0YXRlLiAgKi8KLSAgZW51bSBsZXhfc3RhdGUgc3RhdGU7Ci0gIC8qIFRoZSBuZXh0IGZpbGUgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IGlucHV0ICpuZXh0OwotfTsKLQotLyogVGhlIGN1cnJlbnQgaW5wdXQgZmlsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaW5wdXQgY3VycmVudDsKLQotLyogVGhlIGNoYXJhY3RlciB3aGljaCBpbnRyb2R1Y2VzIGNvbW1lbnRzLiAgKi8KLSNkZWZpbmUgQ09NTUVOVF9DSEFSICcjJwotDAotLyogU3RhcnQgdGhlIGxleGVyIGdvaW5nIG9uIHRoZSBtYWluIGlucHV0IGZpbGUuICAqLwotCi1ib29sZWFuCi1ubG1sZXhfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY3VycmVudC5uZXh0ID0gTlVMTDsKLSAgcmV0dXJuIG5sbWxleF9maWxlX29wZW4gKG5hbWUpOwotfQotCi0vKiBTdGFydCB0aGUgbGV4ZXIgZ29pbmcgb24gYSBzdWJzaWRpYXJ5IGlucHV0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotbmxtbGV4X2ZpbGVfcHVzaCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGlucHV0ICpwdXNoOwotCi0gIHB1c2ggPSAoc3RydWN0IGlucHV0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGlucHV0KSk7Ci0gICpwdXNoID0gY3VycmVudDsKLSAgaWYgKG5sbWxleF9maWxlX29wZW4gKG5hbWUpKQotICAgIGN1cnJlbnQubmV4dCA9IHB1c2g7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjdXJyZW50ID0gKnB1c2g7Ci0gICAgICBmcmVlIChwdXNoKTsKLSAgICB9Ci19Ci0KLS8qIFN0YXJ0IGxleGluZyBmcm9tIGEgZmlsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1ubG1sZXhfZmlsZV9vcGVuIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjdXJyZW50LmZpbGUgPSBmb3BlbiAobmFtZSwgInIiKTsKLSAgaWYgKGN1cnJlbnQuZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsKLSAgICAgICsrcGFyc2VfZXJyb3JzOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgY3VycmVudC5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGN1cnJlbnQubGluZW5vID0gMTsKLSAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotICByZXR1cm4gdHJ1ZTsKLX0KLQwKLS8qIFRhYmxlIHVzZWQgdG8gdHVybiBrZXl3b3JkcyBpbnRvIHRva2Vucy4gICovCi0KLXN0cnVjdCBrZXl3b3JkX3Rva2Vuc19zdHJ1Y3QKLXsKLSAgY29uc3QgY2hhciAqa2V5d29yZDsKLSAgaW50IHRva2VuOwotfTsKLQotc3RydWN0IGtleXdvcmRfdG9rZW5zX3N0cnVjdCBrZXl3b3JkX3Rva2Vuc1tdID0KLXsKLSAgeyAiQ0hFQ0siLCBDSEVDSyB9LAotICB7ICJDT0RFU1RBUlQiLCBDT0RFU1RBUlQgfSwKLSAgeyAiQ09QWVJJR0hUIiwgQ09QWVJJR0hUIH0sCi0gIHsgIkNVU1RPTSIsIENVU1RPTSB9LAotICB7ICJEQVRFIiwgREFURSB9LAotICB7ICJERUJVRyIsIERFQlVHIH0sCi0gIHsgIkRFU0NSSVBUSU9OIiwgREVTQ1JJUFRJT04gfSwKLSAgeyAiRVhJVCIsIEVYSVQgfSwKLSAgeyAiRVhQT1JUIiwgRVhQT1JUIH0sCi0gIHsgIkZMQUdfT04iLCBGTEFHX09OIH0sCi0gIHsgIkZMQUdfT0ZGIiwgRkxBR19PRkYgfSwKLSAgeyAiRlVMTE1BUCIsIEZVTExNQVAgfSwKLSAgeyAiSEVMUCIsIEhFTFAgfSwKLSAgeyAiSU1QT1JUIiwgSU1QT1JUIH0sCi0gIHsgIklOUFVUIiwgSU5QVVQgfSwKLSAgeyAiTUFQIiwgTUFQIH0sCi0gIHsgIk1FU1NBR0VTIiwgTUVTU0FHRVMgfSwKLSAgeyAiTU9EVUxFIiwgTU9EVUxFIH0sCi0gIHsgIk1VTFRJUExFIiwgTVVMVElQTEUgfSwKLSAgeyAiT1NfRE9NQUlOIiwgT1NfRE9NQUlOIH0sCi0gIHsgIk9VVFBVVCIsIE9VVFBVVCB9LAotICB7ICJQU0VVRE9QUkVFTVBUSU9OIiwgUFNFVURPUFJFRU1QVElPTiB9LAotICB7ICJSRUVOVFJBTlQiLCBSRUVOVFJBTlQgfSwKLSAgeyAiU0NSRUVOTkFNRSIsIFNDUkVFTk5BTUUgfSwKLSAgeyAiU0hBUkVMSUIiLCBTSEFSRUxJQiB9LAotICB7ICJTVEFDSyIsIFNUQUNLIH0sCi0gIHsgIlNUQUNLU0laRSIsIFNUQUNLIH0sCi0gIHsgIlNUQVJUIiwgU1RBUlQgfSwKLSAgeyAiU1lOQ0hST05JWkUiLCBTWU5DSFJPTklaRSB9LAotICB7ICJUSFJFQUROQU1FIiwgVEhSRUFETkFNRSB9LAotICB7ICJUWVBFIiwgVFlQRSB9LAotICB7ICJWRVJCT1NFIiwgVkVSQk9TRSB9LAotICB7ICJWRVJTSU9OIiwgVkVSU0lPTksgfSwKLSAgeyAiWERDREFUQSIsIFhEQ0RBVEEgfQotfTsKLQotI2RlZmluZSBLRVlXT1JEX0NPVU5UIChzaXplb2YgKGtleXdvcmRfdG9rZW5zKSAvIHNpemVvZiAoa2V5d29yZF90b2tlbnNbMF0pKQotDAotLyogVGhlIGxleGVyIGFjY3VtdWxhdGVzIHN0cmluZ3MgaW4gdGhlc2UgdmFyaWFibGVzLiAgKi8KLXN0YXRpYyBjaGFyICpsZXhfYnVmOwotc3RhdGljIGludCBsZXhfc2l6ZTsKLXN0YXRpYyBpbnQgbGV4X3BvczsKLQotLyogU3RhcnQgYWNjdW11bGF0aW5nIHN0cmluZ3MgaW50byB0aGUgYnVmZmVyLiAgKi8KLSNkZWZpbmUgQlVGX0lOSVQoKSBcCi0gICgodm9pZCkgKGxleF9idWYgIT0gTlVMTCA/IGxleF9wb3MgPSAwIDogbmxtbGV4X2J1Zl9pbml0ICgpKSkKLQotc3RhdGljIGludAotbmxtbGV4X2J1Zl9pbml0ICgpCi17Ci0gIGxleF9zaXplID0gMTA7Ci0gIGxleF9idWYgPSB4bWFsbG9jIChsZXhfc2l6ZSArIDEpOwotICBsZXhfcG9zID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZpbmlzaCBhIHN0cmluZyBpbiB0aGUgYnVmZmVyLiAgKi8KLSNkZWZpbmUgQlVGX0ZJTklTSCgpICgodm9pZCkgKGxleF9idWZbbGV4X3Bvc10gPSAnXDAnKSkKLQotLyogQWNjdW11bGF0ZSBhIGNoYXJhY3RlciBpbnRvIHRoZSBidWZmZXIuICAqLwotI2RlZmluZSBCVUZfQUREKGMpIFwKLSAgKCh2b2lkKSAobGV4X3BvcyA8IGxleF9zaXplIFwKLQkgICA/IGxleF9idWZbbGV4X3BvcysrXSA9IChjKSBcCi0JICAgOiBubG1sZXhfYnVmX2FkZCAoYykpKQotCi1zdGF0aWMgY2hhcgotbmxtbGV4X2J1Zl9hZGQgKGMpCi0gICAgIGludCBjOwotewotICBpZiAobGV4X3BvcyA+PSBsZXhfc2l6ZSkKLSAgICB7Ci0gICAgICBsZXhfc2l6ZSAqPSAyOwotICAgICAgbGV4X2J1ZiA9IHhyZWFsbG9jIChsZXhfYnVmLCBsZXhfc2l6ZSArIDEpOwotICAgIH0KLQotICByZXR1cm4gbGV4X2J1ZltsZXhfcG9zKytdID0gYzsKLX0KLQwKLS8qIFRoZSBsZXhlciBwcm9wZXIuICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmlzb24gZ2VuZXJhdGVkIHBhcnNpbmcKLSAgIGNvZGUuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBpbnQgYzsKLQotdGFpbF9yZWN1cnNlOgotCi0gIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCi0gIC8qIENvbW1hcyBhcmUgdHJlYXRlZCBhcyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpIHx8IGMgPT0gJywnKQotICAgIHsKLSAgICAgIGN1cnJlbnQuc3RhdGUgPSBJTl9MSU5FOwotICAgICAgaWYgKGMgPT0gJ1xuJykKLQl7Ci0JICArK2N1cnJlbnQubGluZW5vOwotCSAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotCX0KLSAgICAgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotICAgIH0KLQotICAvKiBBdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdlIGVpdGhlciBwb3AgdG8gdGhlIHByZXZpb3VzIGZpbGUgb3IKLSAgICAgZmluaXNoIHVwLiAgKi8KLSAgaWYgKGMgPT0gRU9GKQotICAgIHsKLSAgICAgIGZjbG9zZSAoY3VycmVudC5maWxlKTsKLSAgICAgIGZyZWUgKGN1cnJlbnQubmFtZSk7Ci0gICAgICBpZiAoY3VycmVudC5uZXh0ID09IE5VTEwpCi0JcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0JewotCSAgc3RydWN0IGlucHV0ICpuZXh0OwotCi0JICBuZXh0ID0gY3VycmVudC5uZXh0OwotCSAgY3VycmVudCA9ICpuZXh0OwotCSAgZnJlZSAobmV4dCk7Ci0JICBnb3RvIHRhaWxfcmVjdXJzZTsKLQl9Ci0gICAgfQotCi0gIC8qIEEgY29tbWVudCBjaGFyYWN0ZXIgYWx3YXlzIG1lYW5zIHRvIGRyb3AgZXZlcnl0aGluZyB1bnRpbCB0aGUKLSAgICAgbmV4dCBuZXdsaW5lLiAgKi8KLSAgaWYgKGMgPT0gQ09NTUVOVF9DSEFSKQotICAgIHsKLSAgICAgIGRvCi0JewotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JfQotICAgICAgd2hpbGUgKGMgIT0gJ1xuJyk7Ci0gICAgICArK2N1cnJlbnQubGluZW5vOwotICAgICAgY3VycmVudC5zdGF0ZSA9IEJFR0lOTklOR19PRl9MSU5FOwotICAgICAgZ290byB0YWlsX3JlY3Vyc2U7Ci0gICAgfQotCi0gIC8qIEFuICdAJyBpbnRyb2R1Y2VzIGFuIGluY2x1ZGUgZmlsZS4gICovCi0gIGlmIChjID09ICdAJykKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotCSAgaWYgKGMgPT0gJ1xuJykKLQkgICAgKytjdXJyZW50LmxpbmVubzsKLQl9Ci0gICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpKTsKLSAgICAgIEJVRl9JTklUICgpOwotICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGMpICYmIGMgIT0gRU9GKQotCXsKLQkgIEJVRl9BREQgKGMpOwotCSAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0JfQotICAgICAgQlVGX0ZJTklTSCAoKTsKLQotICAgICAgdW5nZXRjIChjLCBjdXJyZW50LmZpbGUpOwotICAgICAgCi0gICAgICBubG1sZXhfZmlsZV9wdXNoIChsZXhfYnVmKTsKLSAgICAgIGdvdG8gdGFpbF9yZWN1cnNlOwotICAgIH0KLQotICAvKiBBIG5vbi1zcGFjZSBjaGFyYWN0ZXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBtdXN0IGJlIHRoZSBzdGFydCBvZgotICAgICBhIGtleXdvcmQuICAqLwotICBpZiAoY3VycmVudC5zdGF0ZSA9PSBCRUdJTk5JTkdfT0ZfTElORSkKLSAgICB7Ci0gICAgICBCVUZfSU5JVCAoKTsKLSAgICAgIHdoaWxlIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgYykgfHwgYyA9PSAnXycpCi0JewotCSAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgQlVGX0FERCAodG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpKTsKLQkgIGVsc2UKLQkgICAgQlVGX0FERCAoYyk7Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQl9Ci0gICAgICBCVUZfRklOSVNIICgpOwotCi0gICAgICBpZiAoYyAhPSBFT0YgJiYgISBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgYykgJiYgYyAhPSAnLCcpCi0JewotCSAgbmxtaGVhZGVyX2lkZW50aWZ5ICgpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczolZDogaWxsZWdhbCBjaGFyYWN0ZXIgaW4ga2V5d29yZDogJWNcbiIpLAotCQkgICBjdXJyZW50Lm5hbWUsIGN1cnJlbnQubGluZW5vLCBjKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBLRVlXT1JEX0NPVU5UOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAobGV4X2J1ZlswXSA9PSBrZXl3b3JkX3Rva2Vuc1tpXS5rZXl3b3JkWzBdCi0JCSAgJiYgc3RyY21wIChsZXhfYnVmLCBrZXl3b3JkX3Rva2Vuc1tpXS5rZXl3b3JkKSA9PSAwKQotCQl7Ci0JCSAgLyogUHVzaGluZyBiYWNrIHRoZSBmaW5hbCB3aGl0ZXNwYWNlIGF2b2lkcyB3b3JyeWluZwotCQkgICAgIGFib3V0IFxuIGhlcmUuICAqLwotCQkgIHVuZ2V0YyAoYywgY3VycmVudC5maWxlKTsKLQkJICBjdXJyZW50LnN0YXRlID0gSU5fTElORTsKLQkJICByZXR1cm4ga2V5d29yZF90b2tlbnNbaV0udG9rZW47Ci0JCX0KLQkgICAgfQotCSAgCi0JICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiVkOiB1bnJlY29nbml6ZWQga2V5d29yZDogJXNcbiIpLAotCQkgICBjdXJyZW50Lm5hbWUsIGN1cnJlbnQubGluZW5vLCBsZXhfYnVmKTsKLQl9Ci0KLSAgICAgICsrcGFyc2VfZXJyb3JzOwotICAgICAgLyogVHJlYXQgdGhlIHJlc3Qgb2YgdGhpcyBsaW5lIGFzIGEgY29tbWVudC4gICovCi0gICAgICB1bmdldGMgKENPTU1FTlRfQ0hBUiwgY3VycmVudC5maWxlKTsKLSAgICAgIGdvdG8gdGFpbF9yZWN1cnNlOwotICAgIH0KLQotICAvKiBQYXJlbnRoZXNlcyBqdXN0IHJlcHJlc2VudCB0aGVtc2VsdmVzLiAgKi8KLSAgaWYgKGMgPT0gJygnIHx8IGMgPT0gJyknKQotICAgIHJldHVybiBjOwotCi0gIC8qIEhhbmRsZSBxdW90ZWQgc3RyaW5ncy4gICovCi0gIGlmIChjID09ICciJyB8fCBjID09ICdcJycpCi0gICAgewotICAgICAgaW50IHF1b3RlOwotICAgICAgaW50IHN0YXJ0X2xpbmVubzsKLQotICAgICAgcXVvdGUgPSBjOwotICAgICAgc3RhcnRfbGluZW5vID0gY3VycmVudC5saW5lbm87Ci0KLSAgICAgIGMgPSBnZXRjIChjdXJyZW50LmZpbGUpOwotICAgICAgQlVGX0lOSVQgKCk7Ci0gICAgICB3aGlsZSAoYyAhPSBxdW90ZSAmJiBjICE9IEVPRikKLQl7Ci0JICBCVUZfQUREIChjKTsKLQkgIGlmIChjID09ICdcbicpCi0JICAgICsrY3VycmVudC5saW5lbm87Ci0JICBjID0gZ2V0YyAoY3VycmVudC5maWxlKTsKLQl9Ci0gICAgICBCVUZfRklOSVNIICgpOwotCi0gICAgICBpZiAoYyA9PSBFT0YpCi0JewotCSAgbmxtaGVhZGVyX2lkZW50aWZ5ICgpOwotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczolZDogZW5kIG9mIGZpbGUgaW4gcXVvdGVkIHN0cmluZ1xuIiksCi0JCSAgIGN1cnJlbnQubmFtZSwgc3RhcnRfbGluZW5vKTsKLQkgICsrcGFyc2VfZXJyb3JzOwotCX0KLQotICAgICAgLyogRklYTUU6IFBvc3NpYmxlIG1lbW9yeSBsZWFrLiAgKi8KLSAgICAgIHl5bHZhbC5zdHJpbmcgPSB4c3RyZHVwIChsZXhfYnVmKTsKLSAgICAgIHJldHVybiBRVU9URURfU1RSSU5HOwotICAgIH0KLQotICAvKiBHYXRoZXIgYSBnZW5lcmljIGFyZ3VtZW50LiAgKi8KLSAgQlVGX0lOSVQgKCk7Ci0gIHdoaWxlICghIGlzc3BhY2UgKGMpCi0JICYmIGMgIT0gJywnCi0JICYmIGMgIT0gQ09NTUVOVF9DSEFSCi0JICYmIGMgIT0gJygnCi0JICYmIGMgIT0gJyknKQotICAgIHsKLSAgICAgIEJVRl9BREQgKGMpOwotICAgICAgYyA9IGdldGMgKGN1cnJlbnQuZmlsZSk7Ci0gICAgfQotICBCVUZfRklOSVNIICgpOwotCi0gIHVuZ2V0YyAoYywgY3VycmVudC5maWxlKTsKLQotICAvKiBGSVhNRTogUG9zc2libGUgbWVtb3J5IGxlYWsuICAqLwotICB5eWx2YWwuc3RyaW5nID0geHN0cmR1cCAobGV4X2J1Zik7Ci0gIHJldHVybiBTVFJJTkc7Ci19Ci0MCi0vKiBHZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZy4gICovCi0KLXN0YXRpYyBsb25nCi1ubG1sZXhfZ2V0X251bWJlciAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgbG9uZyByZXQ7Ci0gIGNoYXIgKnNlbmQ7Ci0KLSAgcmV0ID0gc3RydG9sIChzLCAmc2VuZCwgMTApOwotICBpZiAoKnNlbmQgIT0gJ1wwJykKLSAgICBubG1oZWFkZXJfd2FybiAoXygiYmFkIG51bWJlciIpLCAtMSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFByZWZpeCB0aGUgbmxtY29udiB3YXJuaW5ncyB3aXRoIGEgbm90ZSBhcyB0byB3aGVyZSB0aGV5IGNvbWUgZnJvbS4KLSAgIFdlIGRvbid0IHVzZSBwcm9ncmFtX25hbWUgb24gZXZlcnkgd2FybmluZywgYmVjYXVzZSB0aGVuIHNvbWUKLSAgIHZlcnNpb25zIG9mIHRoZSBlbWFjcyBuZXh0LWVycm9yIGZ1bmN0aW9uIGNhbid0IHJlY29nbml6ZSB0aGUgbGluZQotICAgbnVtYmVyLiAgKi8KLQotc3RhdGljIHZvaWQKLW5sbWhlYWRlcl9pZGVudGlmeSAoKQotewotICBzdGF0aWMgaW50IGRvbmU7Ci0KLSAgaWYgKCEgZG9uZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBwcm9ibGVtcyBpbiBOTE0gY29tbWFuZCBsYW5ndWFnZSBpbnB1dDpcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZG9uZSA9IDE7Ci0gICAgfQotfQotCi0vKiBJc3N1ZSBhIHdhcm5pbmcuICAqLwotCi1zdGF0aWMgdm9pZAotbmxtaGVhZGVyX3dhcm4gKHMsIGltYXgpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBpbWF4OwotewotICBubG1oZWFkZXJfaWRlbnRpZnkgKCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiVkOiAlcyIsIGN1cnJlbnQubmFtZSwgY3VycmVudC5saW5lbm8sIHMpOwotICBpZiAoaW1heCAhPSAtMSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgKG1heCAlZCkiLCBpbWF4KTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotLyogUmVwb3J0IGFuIGVycm9yLiAgKi8KLQotc3RhdGljIHZvaWQKLW5sbWhlYWRlcl9lcnJvciAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgbmxtaGVhZGVyX3dhcm4gKHMsIC0xKTsKLSAgKytwYXJzZV9lcnJvcnM7Ci19Ci0KLS8qIEFkZCBhIHN0cmluZyB0byBhIHN0cmluZyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqCi1zdHJpbmdfbGlzdF9jb25zIChzLCBsKQotICAgICBjaGFyICpzOwotICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmw7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfbGlzdCAqcmV0OwotCi0gIHJldCA9IChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3RyaW5nX2xpc3QpKTsKLSAgcmV0LT5uZXh0ID0gbDsKLSAgcmV0LT5zdHJpbmcgPSBzOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBBcHBlbmQgYSBzdHJpbmcgbGlzdCB0byBhbm90aGVyIHN0cmluZyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzdHJpbmdfbGlzdCAqCi1zdHJpbmdfbGlzdF9hcHBlbmQgKGwxLCBsMikKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsMTsKLSAgICAgc3RydWN0IHN0cmluZ19saXN0ICpsMjsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHN0cmluZ19saXN0ICoqcHA7Ci0KLSAgZm9yIChwcCA9ICZsMTsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gbDI7Ci0gIHJldHVybiBsMTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIGEgc3RyaW5nIGxpc3QuICAqLwotCi1zdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICoKLXN0cmluZ19saXN0X2FwcGVuZDEgKGwsIHMpCi0gICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbDsKLSAgICAgY2hhciAqczsKLXsKLSAgc3RydWN0IHN0cmluZ19saXN0ICpuOwotICByZWdpc3RlciBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwcDsKLQotICBuID0gKHN0cnVjdCBzdHJpbmdfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzdHJpbmdfbGlzdCkpOwotICBuLT5uZXh0ID0gTlVMTDsKLSAgbi0+c3RyaW5nID0gczsKLSAgZm9yIChwcCA9ICZsOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBuOwotICByZXR1cm4gbDsKLX0KLQotLyogRHVwbGljYXRlIGEgc3RyaW5nIGluIG1lbW9yeS4gICovCi0KLXN0YXRpYyBjaGFyICoKLXhzdHJkdXAgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgbGVuOwotICBjaGFyICpyZXQ7Ci0KLSAgbGVuID0gc3RybGVuIChzKTsKLSAgcmV0ID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIHN0cmNweSAocmV0LCBzKTsKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25tLjEgYi9iaW51dGlscy9ubS4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFkOTllLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25tLjEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG5tIDEgIjUgTm92ZW1iZXIgMTk5MSIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLW5tIFwtIGxpc3Qgc3ltYm9scyBmcm9tIG9iamVjdCBmaWxlcy4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uVFAKLS5CIG5tCi0uUkIgIltcfCIgXC1hIHwgXC1cLWRlYnVnXC1zeW1zICJcfF0iIAotLlJCICJbXHwiIFwtZyB8IFwtXC1leHRlcm5cLW9ubHkgIlx8XSIKLS5SQiAiW1x8IiBcLUIgIlx8XSIgIAotLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLUQgfCBcLVwtZHluYW1pYyAiXHxdIiAKLS5SQiAiW1x8IiBcLXMgfCBcLVwtcHJpbnRcLWFybWFwICJcfF0iIAotLlJCICJbXHwiIFwtbyB8IFwtXC1wcmludFwtZmlsZVwtbmFtZSAiXHxdIiAgCi0uUkIgIltcfCIgXC1uIHwgXC1cLW51bWVyaWNcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC1wIHwgXC1cLW5vXC1zb3J0ICJcfF0iCi0uUkIgIltcfCIgXC1yIHwgXC1cLXJldmVyc2VcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXNpemVcLXNvcnQgIlx8XSIgCi0uUkIgIltcfCIgXC11IHwgXC1cLXVuZGVmaW5lZFwtb25seSAiXHxdIiAgCi0uUkIgIltcfCIgXC1sIHwgXC1cLWxpbmVcLW51bWJlcnMgIlx8XSIKLS5SQiAiW1x8IiBcLVwtaGVscCAiXHxdIiAgCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIgIAotLlJCICJbXHwiICJcLXQgXGZJcmFkaXgiIHwgXC1cLXJhZGl4PVxmSXJhZGl4ICJcfF0iCi0uUkIgIltcfCIgXC1QIHwgLS1wb3J0YWJpbGl0eSAiXHxdIgotLlJCICJbXHwiICJcLWYgXGZJZm9ybWF0IiB8IFwtXC1mb3JtYXQ9XGZJZm9ybWF0ICJcfF0iCi0uUkIgIltcfCIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIgIlx8XSIKLS5SQiAiW1x8IiBcYwotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC5cfF0KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1HTlUgXGMKLS5CIG5tXGMKLVwmIGxpc3RzIHRoZSBzeW1ib2xzIGZyb20gb2JqZWN0IGZpbGVzIFxjCi0uSSBvYmpmaWxlXGMKLVwmLiAgSWYgbm8gb2JqZWN0IGZpbGVzIGFyZSBnaXZlbiBhcyBhcmd1bWVudHMsIFxjCi0uQiBubVxjCi1cJiBhc3N1bWVzIGBcfFxjCi0uQiBhLm91dFxjCi1cfCcuCi0KLS5TSCBPUFRJT05TCi1UaGUgbG9uZyBhbmQgc2hvcnQgZm9ybXMgb2Ygb3B0aW9ucywgc2hvd24gaGVyZSBhcyBhbHRlcm5hdGl2ZXMsIGFyZQotZXF1aXZhbGVudC4KLQotLlRQCi0uQiBcLUEKLS5UUAotLkIgXC1vCi0uVFAKLS5CIFwtXC1wcmludFwtZmlsZVwtbmFtZSAKLVByZWNlZGUgZWFjaCBzeW1ib2wgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgd2hlcmUgaXQgd2FzIGZvdW5kLAotcmF0aGVyIHRoYW4gaWRlbnRpZnlpbmcgdGhlIGlucHV0IGZpbGUgb25jZSBvbmx5IGJlZm9yZSBhbGwgb2YgaXRzCi1zeW1ib2xzLiAKLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWRlYnVnXC1zeW1zIAotRGlzcGxheSBkZWJ1Z2dlci1vbmx5IHN5bWJvbHM7IG5vcm1hbGx5IHRoZXNlIGFyZSBub3QgbGlzdGVkLgotCi0uVFAKLS5CIFwtQgotVGhlIHNhbWUgYXMKLS5CIFwtXC1mb3JtYXQ9YnNkCi0oZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTUlQUyBcZkJubVxmUCkuCi0KLS5UUAotLkIgXC1DCi0uVFAKLS5CIFwtXC1kZW1hbmdsZQotRGVjb2RlIChcZklkZW1hbmdsZVxmUCkgbG93LWxldmVsIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXItbGV2ZWwgbmFtZXMuCi1CZXNpZGVzIHJlbW92aW5nIGFueSBpbml0aWFsIHVuZGVyc2NvcmUgcHJlcGVuZGVkIGJ5IHRoZSBzeXN0ZW0sIHRoaXMKLW1ha2VzIEMrKyBmdW5jdGlvbiBuYW1lcyByZWFkYWJsZS4KLQotLlRQCi0uQiBcLUQKLS5UUAotLkIgXC1cLWR5bmFtaWMKLURpc3BsYXkgdGhlIGR5bmFtaWMgc3ltYm9scyByYXRoZXIgdGhhbiB0aGUgbm9ybWFsIHN5bWJvbHMuICBUaGlzIGlzCi1vbmx5IG1lYW5pbmdmdWwgZm9yIGR5bmFtaWMgb2JqZWN0cywgc3VjaCBhcyBjZXJ0YWluIHR5cGVzIG9mIHNoYXJlZAotbGlicmFyaWVzLgotCi0uVFAKLS5CICJcLWYgXGZJZm9ybWF0IgotVXNlIHRoZSBvdXRwdXQgZm9ybWF0IFxmSWZvcm1hdFxmUCwgd2hpY2ggY2FuIGJlIGBgYnNkJycsCi1gYHN5c3YnJywgb3IgYGBwb3NpeCcnLiAgVGhlIGRlZmF1bHQgaXMgYGBic2QnJy4KLU9ubHkgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBcZklmb3JtYXRcZlAgaXMgc2lnbmlmaWNhbnQ7IGl0IGNhbiBiZQotZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UuCi0KLS5UUAotLkIgXC1nCi0uVFAKLS5CIFwtXC1leHRlcm5cLW9ubHkgCi1EaXNwbGF5IG9ubHkgZXh0ZXJuYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLW4KLS5UUAotLkIgXC12Ci0uVFAKLS5CIFwtXC1udW1lcmljXC1zb3J0IAotU29ydCBzeW1ib2xzIG51bWVyaWNhbGx5IGJ5IHRoZWlyIGFkZHJlc3Nlcywgbm90IGFscGhhYmV0aWNhbGx5IGJ5IHRoZWlyCi1uYW1lcy4gCi0KLS5UUAotLkIgXC1wCi0uVFAKLS5CIFwtXC1ub1wtc29ydCAKLURvbid0IGJvdGhlciB0byBzb3J0IHRoZSBzeW1ib2xzIGluIGFueSBvcmRlcjsganVzdCBwcmludCB0aGVtIGluIHRoZQotb3JkZXIgZW5jb3VudGVyZWQuCi0KLS5UUAotLkIgXC1QCi0uVFAKLS5CIFwtXC1wb3J0YWJpbGl0eQotVXNlIHRoZSBQT1NJWC4yIHN0YW5kYXJkIG91dHB1dCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBmb3JtYXQuCi1FcXVpdmFsZW50IHRvIGBgXC1mIHBvc2l4JycuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1wcmludFwtYXJtYXAKLVdoZW4gbGlzdGluZyBzeW1ib2xzIGZyb20gYXJjaGl2ZSBtZW1iZXJzLCBpbmNsdWRlIHRoZSBpbmRleDogYSBtYXBwaW5nCi0oc3RvcmVkIGluIHRoZSBhcmNoaXZlIGJ5IFxjCi0uQiBhclxjCi1cJiBvciBcYwotLkIgcmFubGliXGMKLVwmKSBvZiB3aGF0IG1vZHVsZXMKLWNvbnRhaW4gZGVmaW5pdGlvbnMgZm9yIHdoYXQgbmFtZXMuCi0KLS5UUAotLkIgXC1yCi0uVFAKLS5CIFwtXC1yZXZlcnNlXC1zb3J0IAotUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIHNvcnQgKHdoZXRoZXIgbnVtZXJpYyBvciBhbHBoYWJldGljKTsgbGV0IHRoZQotbGFzdCBjb21lIGZpcnN0LgotCi0uVFAKLS5CIFwtXC1zaXplXC1zb3J0IAotU29ydCBzeW1ib2xzIGJ5IHNpemUuICBUaGUgc2l6ZSBpcyBjb21wdXRlZCBhcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi10aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgd2l0aCB0aGUgbmV4dCBoaWdoZXIKLXZhbHVlLiAgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBpcyBwcmludGVkLCByYXRoZXIgdGhhbiB0aGUgdmFsdWUuCi0KLS5UUAotLkIgIlwtdCBcZklyYWRpeCIKLS5UUAotLkIgIlwtXC1yYWRpeD1cZklyYWRpeCIKLVVzZSBcZklyYWRpeFxmUCBhcyB0aGUgcmFkaXggZm9yIHByaW50aW5nIHRoZSBzeW1ib2wgdmFsdWVzLiAgSXQgbXVzdCBiZQotYGBkJycgZm9yIGRlY2ltYWwsIGBgbycnIGZvciBvY3RhbCwgb3IgYGB4JycgZm9yIGhleGFkZWNpbWFsLgotCi0uVFAKLS5CSSAiXC1cLXRhcmdldD0iICJiZmRuYW1lIgotU3BlY2lmeSBhbiBvYmplY3QgY29kZSBmb3JtYXQgb3RoZXIgdGhhbiB5b3VyIHN5c3RlbSdzIGRlZmF1bHQgZm9ybWF0LgotU2VlIAotLkJSIG9iamR1bXAgKCAxICksCi1mb3IgaW5mb3JtYXRpb24gb24gbGlzdGluZyBhdmFpbGFibGUgZm9ybWF0cy4KLQotLlRQCi0uQiBcLXUKLS5UUAotLkIgXC1cLXVuZGVmaW5lZFwtb25seSAKLURpc3BsYXkgb25seSB1bmRlZmluZWQgc3ltYm9scyAodGhvc2UgZXh0ZXJuYWwgdG8gZWFjaCBvYmplY3QgZmlsZSkuCi0KLS5UUAotLkIgXC1sCi0uVFAKLS5CIFwtXC1saW5lXC1udW1iZXJzCi1Gb3IgZWFjaCBzeW1ib2wsIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gdHJ5IHRvIGZpbmQgYSBmaWxlbmFtZSBhbmQKLWxpbmUgbnVtYmVyLiAgRm9yIGEgZGVmaW5lZCBzeW1ib2wsIGxvb2sgZm9yIHRoZSBsaW5lIG51bWJlciBvZiB0aGUKLWFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIEZvciBhbiB1bmRlZmluZWQgc3ltYm9sLCBsb29rIGZvciB0aGUgbGluZQotbnVtYmVyIG9mIGEgcmVsb2NhdGlvbiBlbnRyeSB3aGljaCByZWZlcnMgdG8gdGhlIHN5bWJvbC4gIElmIGxpbmUgbnVtYmVyCi1pbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQsIHByaW50IGl0IGFmdGVyIHRoZSBvdGhlciBzeW1ib2wgaW5mb3JtYXRpb24uCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgbm0KLWFuZCBleGl0LgotCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgbm0KLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKLS5CUiBhciAiKCIgMSAiKSwiCi0uQlIgb2JqZHVtcCAoIDEgKSwKLS5CUiByYW5saWIgIigiIDEgIikuIgotCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25tLmMgYi9iaW51dGlscy9ubS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTFiN2ZiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL25tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU4ICswLDAgQEAKLS8qIG5tLmMgLS0gRGVzY3JpYmUgc3ltYm9sIHRhYmxlIG9mIGEgcmVsIGZpbGUuCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0jaW5jbHVkZSAiYW91dC9yYW5saWIuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0vKiBXaGVuIHNvcnRpbmcgYnkgc2l6ZSwgd2UgdXNlIHRoaXMgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHNpemUgYW5kIGEKLSAgIHBvaW50ZXIgdG8gdGhlIG1pbmlzeW1ib2wuICAqLwotCi1zdHJ1Y3Qgc2l6ZV9zeW0KLXsKLSAgY29uc3QgUFRSIG1pbmlzeW07Ci0gIGJmZF92bWEgc2l6ZTsKLX07Ci0KLS8qIFdoZW4gZmV0Y2hpbmcgcmVsb2NzLCB3ZSB1c2UgdGhpcyBzdHJ1Y3R1cmUgdG8gcGFzcyBpbmZvcm1hdGlvbiB0bwotICAgZ2V0X3JlbG9jcy4gICovCi0KLXN0cnVjdCBnZXRfcmVsb2NzX2luZm8KLXsKLSAgYXNlY3Rpb24gKipzZWNzOwotICBhcmVsZW50ICoqKnJlbG9jczsKLSAgbG9uZyAqcmVsY291bnQ7Ci0gIGFzeW1ib2wgKipzeW1zOwotfTsKLQotc3RhdGljIHZvaWQKLXVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcHJpbnRfcmFkaXggUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zZXRfb3V0cHV0X2Zvcm1hdCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3JlbF9maWxlIFBBUkFNUyAoKGJmZCAqIGZpbGUsIGJmZCAqIGFyY2hpdmUpKTsKLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCkpOwotCi1zdGF0aWMgbG9uZwotc29ydF9zeW1ib2xzX2J5X3NpemUgUEFSQU1TICgoYmZkICosIGJvb2xlYW4sIFBUUiwgbG9uZywgdW5zaWduZWQgaW50LAotCQkJICAgICAgc3RydWN0IHNpemVfc3ltICoqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xzIFBBUkFNUyAoKGJmZCAqLCBib29sZWFuLCBQVFIsIGxvbmcsIHVuc2lnbmVkIGludCwgYmZkICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3NpemVfc3ltYm9scyBQQVJBTVMgKChiZmQgKiwgYm9vbGVhbiwgc3RydWN0IHNpemVfc3ltICosIGxvbmcsIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICosIGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1kZWZfZW50cnkgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi0vKiBUaGUgc29ydGluZyBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbnVtZXJpY19yZXZlcnNlIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX2ZvcndhcmQgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotc3RhdGljIGludAotbm9uX251bWVyaWNfcmV2ZXJzZSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1zaXplX2ZvcndhcmQxIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyBpbnQKLXNpemVfZm9yd2FyZDIgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogVGhlIG91dHB1dCBmb3JtYXR0aW5nIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vYmplY3RfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3N5c3YgUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfcG9zaXggUEFSQU1TICgoY2hhciAqZmlsZW5hbWUpKTsKLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9tZW1iZXJfYnNkIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9zeXN2IFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX21lbWJlcl9wb3NpeCBQQVJBTVMgKChjaGFyICphcmNoaXZlLCBDT05TVCBjaGFyICpmaWxlbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkIFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX3Bvc2l4IFBBUkFNUyAoKGJmZCAqIGFyY2hpdmVfYmZkLCBiZmQgKiBhYmZkKSk7Ci0KLQotc3RhdGljIHZvaWQKLXByaW50X3ZhbHVlIFBBUkFNUyAoKGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX2JzZCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLXByaW50X3N5bWJvbF9pbmZvX3N5c3YgUEFSQU1TICgoc3ltYm9sX2luZm8gKiBpbmZvLCBiZmQgKiBhYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19wb3NpeCBQQVJBTVMgKChzeW1ib2xfaW5mbyAqIGluZm8sIGJmZCAqIGFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWdldF9yZWxvY3MgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBTdXBwb3J0IGZvciBkaWZmZXJlbnQgb3V0cHV0IGZvcm1hdHMuICAqLwotc3RydWN0IG91dHB1dF9mbnMKLSAgewotICAgIC8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotICAgIHZvaWQgKCpwcmludF9vYmplY3RfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gICAgdm9pZCAoKnByaW50X2FyY2hpdmVfZmlsZW5hbWUpIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfYXJjaGl2ZV9tZW1iZXIpIFBBUkFNUyAoKGNoYXIgKmFyY2hpdmUsIENPTlNUIGNoYXIgKmZpbGVuYW1lKSk7Ci0KLSAgICAvKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKLSAgICAgICBjb250YWluaW5nIGEgc3ltYm9sLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2ZpbGVuYW1lKSBQQVJBTVMgKChiZmQgKiBhcmNoaXZlX2JmZCwgYmZkICogYWJmZCkpOwotCi0gICAgLyogUHJpbnQgYSBsaW5lIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc3ltYm9sLiAgKi8KLSAgICB2b2lkICgqcHJpbnRfc3ltYm9sX2luZm8pIFBBUkFNUyAoKHN5bWJvbF9pbmZvICogaW5mbywgYmZkICogYWJmZCkpOwotICB9Owotc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zIGZvcm1hdHNbXSA9Ci17Ci0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9ic2QsCi0gICBwcmludF9hcmNoaXZlX21lbWJlcl9ic2QsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfYnNkLAotICAgcHJpbnRfc3ltYm9sX2luZm9fYnNkfSwKLSAge3ByaW50X29iamVjdF9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfc3lzdiwKLSAgIHByaW50X3N5bWJvbF9maWxlbmFtZV9zeXN2LAotICAgcHJpbnRfc3ltYm9sX2luZm9fc3lzdn0sCi0gIHtwcmludF9vYmplY3RfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4LAotICAgcHJpbnRfYXJjaGl2ZV9tZW1iZXJfcG9zaXgsCi0gICBwcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXgsCi0gICBwcmludF9zeW1ib2xfaW5mb19wb3NpeH0KLX07Ci0KLS8qIEluZGljZXMgaW4gYGZvcm1hdHMnLiAgKi8KLSNkZWZpbmUgRk9STUFUX0JTRCAwCi0jZGVmaW5lIEZPUk1BVF9TWVNWIDEKLSNkZWZpbmUgRk9STUFUX1BPU0lYIDIKLSNkZWZpbmUgRk9STUFUX0RFRkFVTFQgRk9STUFUX0JTRAotCi0vKiBUaGUgb3V0cHV0IGZvcm1hdCB0byB1c2UuICAqLwotc3RhdGljIHN0cnVjdCBvdXRwdXRfZm5zICpmb3JtYXQgPSAmZm9ybWF0c1tGT1JNQVRfREVGQVVMVF07Ci0KLQotLyogQ29tbWFuZCBvcHRpb25zLiAgKi8KLQotc3RhdGljIGludCBkb19kZW1hbmdsZSA9IDA7CS8qIFByZXR0eSBwcmludCBDKysgc3ltYm9sIG5hbWVzLiAgKi8KLXN0YXRpYyBpbnQgZXh0ZXJuYWxfb25seSA9IDA7CS8qIHByaW50IGV4dGVybmFsIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBkZWZpbmVkX29ubHkgPSAwOwkvKiBQcmludCBkZWZpbmVkIHN5bWJvbHMgb25seSAqLwotc3RhdGljIGludCBub19zb3J0ID0gMDsJCS8qIGRvbid0IHNvcnQ7IHByaW50IHN5bXMgaW4gb3JkZXIgZm91bmQgKi8KLXN0YXRpYyBpbnQgcHJpbnRfZGVidWdfc3ltcyA9IDA7CS8qIHByaW50IGRlYnVnZ2VyLW9ubHkgc3ltYm9scyB0b28gKi8KLXN0YXRpYyBpbnQgcHJpbnRfYXJtYXAgPSAwOwkvKiBkZXNjcmliZSBfXy5TWU1ERUYgZGF0YSBpbiBhcmNoaXZlIGZpbGVzLiAgKi8KLXN0YXRpYyBpbnQgcmV2ZXJzZV9zb3J0ID0gMDsJLyogc29ydCBpbiBkb3dud2FyZChhbHBoYSBvciBudW1lcmljKSBvcmRlciAqLwotc3RhdGljIGludCBzb3J0X251bWVyaWNhbGx5ID0gMDsJLyogc29ydCBpbiBudW1lcmljIHJhdGhlciB0aGFuIGFscGhhIG9yZGVyICovCi1zdGF0aWMgaW50IHNvcnRfYnlfc2l6ZSA9IDA7CS8qIHNvcnQgYnkgc2l6ZSBvZiBzeW1ib2wgKi8KLXN0YXRpYyBpbnQgdW5kZWZpbmVkX29ubHkgPSAwOwkvKiBwcmludCB1bmRlZmluZWQgc3ltYm9scyBvbmx5ICovCi1zdGF0aWMgaW50IGR5bmFtaWMgPSAwOwkJLyogcHJpbnQgZHluYW1pYyBzeW1ib2xzLiAgKi8KLXN0YXRpYyBpbnQgc2hvd192ZXJzaW9uID0gMDsJLyogc2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLXN0YXRpYyBpbnQgc2hvd19zdGF0cyA9IDA7CS8qIHNob3cgc3RhdGlzdGljcyAqLwotc3RhdGljIGludCBsaW5lX251bWJlcnMgPSAwOwkvKiBwcmludCBsaW5lIG51bWJlcnMgZm9yIHN5bWJvbHMgKi8KLQotLyogV2hlbiB0byBwcmludCB0aGUgbmFtZXMgb2YgZmlsZXMuICBOb3QgbXV0dWFsbHkgZXhjbHVzaXZlIGluIFNZU1YgZm9ybWF0LiAgKi8KLXN0YXRpYyBpbnQgZmlsZW5hbWVfcGVyX2ZpbGUgPSAwOwkvKiBPbmNlIHBlciBmaWxlLCBvbiBpdHMgb3duIGxpbmUuICAqLwotc3RhdGljIGludCBmaWxlbmFtZV9wZXJfc3ltYm9sID0gMDsJLyogT25jZSBwZXIgc3ltYm9sLCBhdCBzdGFydCBvZiBsaW5lLiAgKi8KLQotLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgYSBzeW1ib2wgdmFsdWUuICAqLwotI2lmbmRlZiBCRkQ2NAotc3RhdGljIGNoYXIgdmFsdWVfZm9ybWF0W10gPSAiJTA4bHgiOwotI2Vsc2UKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi1zdGF0aWMgY2hhciB2YWx1ZV9mb3JtYXRbXSA9ICIlMDE2bHgiOwotI2Vsc2UKLS8qIFdlIGRvbid0IHVzZSB2YWx1ZV9mb3JtYXQgZm9yIHRoaXMgY2FzZS4gICovCi0jZW5kaWYKLSNlbmRpZgotc3RhdGljIGludCBwcmludF9yYWRpeCA9IDE2OwotLyogUHJpbnQgZm9ybWF0cyBmb3IgcHJpbnRpbmcgc3RhYiBpbmZvLiAgKi8KLXN0YXRpYyBjaGFyIG90aGVyX2Zvcm1hdFtdID0gIiUwMngiOwotc3RhdGljIGNoYXIgZGVzY19mb3JtYXRbXSA9ICIlMDR4IjsKLQotc3RhdGljIGNoYXIgKnRhcmdldCA9IE5VTEw7Ci0KLS8qIFVzZWQgdG8gY2FjaGUgdGhlIGxpbmUgbnVtYmVycyBmb3IgYSBCRkQuICAqLwotc3RhdGljIGJmZCAqbGluZW5vX2NhY2hlX2JmZDsKLXN0YXRpYyBiZmQgKmxpbmVub19jYWNoZV9yZWxfYmZkOwotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci17Ci0gIHsiZGVidWctc3ltcyIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfZGVidWdfc3ltcywgMX0sCi0gIHsiZGVtYW5nbGUiLCBub19hcmd1bWVudCwgJmRvX2RlbWFuZ2xlLCAxfSwKLSAgeyJkeW5hbWljIiwgbm9fYXJndW1lbnQsICZkeW5hbWljLCAxfSwKLSAgeyJleHRlcm4tb25seSIsIG5vX2FyZ3VtZW50LCAmZXh0ZXJuYWxfb25seSwgMX0sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdmJ30sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImxpbmUtbnVtYmVycyIsIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7Im5vLWNwbHVzIiwgbm9fYXJndW1lbnQsICZkb19kZW1hbmdsZSwgMH0sICAvKiBMaW51eCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgeyJuby1kZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDB9LAotICB7Im5vLXNvcnQiLCBub19hcmd1bWVudCwgJm5vX3NvcnQsIDF9LAotICB7Im51bWVyaWMtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9udW1lcmljYWxseSwgMX0sCi0gIHsicG9ydGFiaWxpdHkiLCBub19hcmd1bWVudCwgMCwgJ1AnfSwKLSAgeyJwcmludC1hcm1hcCIsIG5vX2FyZ3VtZW50LCAmcHJpbnRfYXJtYXAsIDF9LAotICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCAwLCAnbyd9LAotICB7InJhZGl4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCi0gIHsicmV2ZXJzZS1zb3J0Iiwgbm9fYXJndW1lbnQsICZyZXZlcnNlX3NvcnQsIDF9LAotICB7InNpemUtc29ydCIsIG5vX2FyZ3VtZW50LCAmc29ydF9ieV9zaXplLCAxfSwKLSAgeyJzdGF0cyIsIG5vX2FyZ3VtZW50LCAmc2hvd19zdGF0cywgMX0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMH0sCi0gIHsiZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZkZWZpbmVkX29ubHksIDF9LAotICB7InVuZGVmaW5lZC1vbmx5Iiwgbm9fYXJndW1lbnQsICZ1bmRlZmluZWRfb25seSwgMX0sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAmc2hvd192ZXJzaW9uLCAxfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQwKLS8qIFNvbWUgZXJyb3ItcmVwb3J0aW5nIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdm9pZAotdXNhZ2UgKHN0cmVhbSwgc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstYUFCQ0RnbG5vcFByc3V2Vl0gWy10IHJhZGl4XSBbLS1yYWRpeD1yYWRpeF0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCi0gICAgICAgWy0tZGVidWctc3ltc10gWy0tZXh0ZXJuLW9ubHldIFstLXByaW50LWFybWFwXSBbLS1wcmludC1maWxlLW5hbWVdXG5cCi0gICAgICAgWy0tbnVtZXJpYy1zb3J0XSBbLS1uby1zb3J0XSBbLS1yZXZlcnNlLXNvcnRdIFstLXNpemUtc29ydF1cblwKLSAgICAgICBbLS11bmRlZmluZWQtb25seV0gWy0tcG9ydGFiaWxpdHldIFstZiB7YnNkLHN5c3YscG9zaXh9XVxuXAotICAgICAgIFstLWZvcm1hdD17YnNkLHN5c3YscG9zaXh9XSBbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdIFstLWR5bmFtaWNdXG5cCi0gICAgICAgWy0tZGVmaW5lZC1vbmx5XSBbLS1saW5lLW51bWJlcnNdXG5cCi0gICAgICAgWy0tdmVyc2lvbl0gWy0taGVscF1cblwKLSAgICAgICBbZmlsZS4uLl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLS8qIFNldCB0aGUgcmFkaXggZm9yIHRoZSBzeW1ib2wgdmFsdWUgYW5kIHNpemUgYWNjb3JkaW5nIHRvIFJBRElYLiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9wcmludF9yYWRpeCAocmFkaXgpCi0gICAgIGNoYXIgKnJhZGl4OwotewotICBzd2l0Y2ggKCpyYWRpeCkKLSAgICB7Ci0gICAgY2FzZSAneCc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdvJzoKLSAgICAgIGlmICgqcmFkaXggPT0gJ2QnKQotCXByaW50X3JhZGl4ID0gMTA7Ci0gICAgICBlbHNlCi0JcHJpbnRfcmFkaXggPSA4OwotI2lmbmRlZiBCRkQ2NAotICAgICAgdmFsdWVfZm9ybWF0WzRdID0gKnJhZGl4OwotI2Vsc2UKLSNpZiBCRkRfSE9TVF82NEJJVF9MT05HCi0gICAgICB2YWx1ZV9mb3JtYXRbNV0gPSAqcmFkaXg7Ci0jZWxzZQotICAgICAgLyogVGhpcyBjYXNlIHJlcXVpcmVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIG9jdGFsIGFuZCBkZWNpbWFsCi0gICAgICAgICBwcmludGluZy4gICovCi0jZW5kaWYKLSNlbmRpZgotICAgICAgb3RoZXJfZm9ybWF0WzNdID0gZGVzY19mb3JtYXRbM10gPSAqcmFkaXg7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgcmFkaXhcbiIpLCBwcm9ncmFtX25hbWUsIHJhZGl4KTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNldF9vdXRwdXRfZm9ybWF0IChmKQotICAgICBjaGFyICpmOwotewotICBpbnQgaTsKLQotICBzd2l0Y2ggKCpmKQotICAgIHsKLSAgICBjYXNlICdiJzoKLSAgICBjYXNlICdCJzoKLSAgICAgIGkgPSBGT1JNQVRfQlNEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBpID0gRk9STUFUX1BPU0lYOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBpID0gRk9STUFUX1NZU1Y7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IGludmFsaWQgb3V0cHV0IGZvcm1hdFxuIiksIHByb2dyYW1fbmFtZSwgZik7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0gIGZvcm1hdCA9ICZmb3JtYXRzW2ldOwotfQotDAotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBjOwotICBpbnQgcmV0dmFsOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFBQkNEZWY6Z2xub3BQcnN0OnV2ViIsIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnYSc6Ci0JICBwcmludF9kZWJ1Z19zeW1zID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotCWNhc2UgJ28nOgotCSAgZmlsZW5hbWVfcGVyX3N5bWJvbCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdCJzoJCS8qIEZvciBNSVBTIGNvbXBhdGliaWxpdHkuICAqLwotCSAgc2V0X291dHB1dF9mb3JtYXQgKCJic2QiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0MnOgotCSAgZG9fZGVtYW5nbGUgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnRCc6Ci0JICBkeW5hbWljID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgLyogSWdub3JlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gICovCi0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIHNldF9vdXRwdXRfZm9ybWF0IChvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBleHRlcm5hbF9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JY2FzZSAnbCc6Ci0JICBsaW5lX251bWJlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JY2FzZSAndic6Ci0JICBzb3J0X251bWVyaWNhbGx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgbm9fc29ydCA9IDE7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLQkgIHNldF9vdXRwdXRfZm9ybWF0ICgicG9zaXgiKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgcmV2ZXJzZV9zb3J0ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgcHJpbnRfYXJtYXAgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBzZXRfcHJpbnRfcmFkaXggKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIHVuZGVmaW5lZF9vbmx5ID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAyMDA6CQkvKiAtLXRhcmdldCAqLwotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlIDA6CQkvKiBBIGxvbmcgb3B0aW9uIHRoYXQganVzdCBzZXRzIGEgZmxhZy4gICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoIm5tIik7Ci0KLSAgLyogT0ssIGFsbCBvcHRpb25zIG5vdyBwYXJzZWQuICBJZiBubyBmaWxlbmFtZSBzcGVjaWZpZWQsIGRvIGEub3V0LiAgKi8KLSAgaWYgKG9wdGluZCA9PSBhcmdjKQotICAgIHJldHVybiAhZGlzcGxheV9maWxlICgiYS5vdXQiKTsKLQotICByZXR2YWwgPSAwOwotCi0gIGlmIChhcmdjIC0gb3B0aW5kID4gMSkKLSAgICBmaWxlbmFtZV9wZXJfZmlsZSA9IDE7Ci0KLSAgLyogV2Ugd2VyZSBnaXZlbiBzZXZlcmFsIGZpbGVuYW1lcyB0byBkby4gICovCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIGlmICghZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSkpCi0JcmV0dmFsKys7Ci0gICAgfQotCi0gIEVORF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lKTsKLQotI2lmZGVmIEhBVkVfU0JSSwotICBpZiAoc2hvd19zdGF0cykKLSAgICB7Ci0gICAgICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksIHByb2dyYW1fbmFtZSwKLQkgICAgICAgKGxvbmcpIChsaW0gLSAoY2hhciAqKSAmZW52aXJvbikpOwotICAgIH0KLSNlbmRpZgotCi0gIGV4aXQgKHJldHZhbCk7Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZGlzcGxheV9hcmNoaXZlIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGJmZCAqYXJmaWxlID0gTlVMTDsKLSAgYmZkICpsYXN0X2FyZmlsZSA9IE5VTEw7Ci0gIGNoYXIgKiptYXRjaGluZzsKLQotICAoKmZvcm1hdC0+cHJpbnRfYXJjaGl2ZV9maWxlbmFtZSkgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQotICBpZiAocHJpbnRfYXJtYXApCi0gICAgcHJpbnRfc3ltZGVmX2VudHJ5IChmaWxlKTsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLQotICAgICAgaWYgKGFyZmlsZSA9PSBOVUxMKQotCXsKLQkgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoYXJmaWxlLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotCXsKLQkgICgqZm9ybWF0LT5wcmludF9hcmNoaXZlX21lbWJlcikgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpLAotCQkJCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChhcmZpbGUpKTsKLQkgIGRpc3BsYXlfcmVsX2ZpbGUgKGFyZmlsZSwgZmlsZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYXJmaWxlKSk7Ci0JICBpZiAoYmZkX2dldF9lcnJvciAoKSA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCSAgICB7Ci0JICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICAgICAgZnJlZSAobWF0Y2hpbmcpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQl7Ci0JICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLQkgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotCSAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotCX0KLSAgICAgIGxhc3RfYXJmaWxlID0gYXJmaWxlOwotICAgIH0KLQotICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLSAgICAgIGxpbmVub19jYWNoZV9iZmQgPSBOVUxMOwotICAgICAgbGluZW5vX2NhY2hlX3JlbF9iZmQgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGJvb2xlYW4KLWRpc3BsYXlfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBib29sZWFuIHJldHZhbCA9IHRydWU7Ci0gIGJmZCAqZmlsZTsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGZpbGUgPSBiZmRfb3BlbnIgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZmlsZSwgYmZkX2FyY2hpdmUpKQotICAgIHsKLSAgICAgIGRpc3BsYXlfYXJjaGl2ZSAoZmlsZSk7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGZpbGUsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgKCpmb3JtYXQtPnByaW50X29iamVjdF9maWxlbmFtZSkgKGZpbGVuYW1lKTsKLSAgICAgIGRpc3BsYXlfcmVsX2ZpbGUgKGZpbGUsIE5VTEwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoZmlsZW5hbWUpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICByZXR2YWwgPSBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGJmZF9jbG9zZSAoZmlsZSkgPT0gZmFsc2UpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgbGluZW5vX2NhY2hlX2JmZCA9IE5VTEw7Ci0gIGxpbmVub19jYWNoZV9yZWxfYmZkID0gTlVMTDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogVGhlc2UgZ2xvYmFscyBhcmUgdXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIGludG8gdGhlIHNvcnRpbmcKLSAgIHJvdXRpbmVzLiAgKi8KLXN0YXRpYyBiZmQgKnNvcnRfYmZkOwotc3RhdGljIGJvb2xlYW4gc29ydF9keW5hbWljOwotc3RhdGljIGFzeW1ib2wgKnNvcnRfeDsKLXN0YXRpYyBhc3ltYm9sICpzb3J0X3k7Ci0KLS8qIFN5bWJvbC1zb3J0aW5nIHByZWRpY2F0ZXMgKi8KLSNkZWZpbmUgdmFsdWVvZih4KSAoKHgpLT5zZWN0aW9uLT52bWEgKyAoeCktPnZhbHVlKQotCi0vKiBOdW1lcmljIHNvcnRzLiAgVW5kZWZpbmVkIHN5bWJvbHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkICJsZXNzIHRoYW4iCi0gICBkZWZpbmVkIHN5bWJvbHMgd2l0aCB6ZXJvIHZhbHVlcy4gIENvbW1vbiBzeW1ib2xzIGFyZSBub3QgdHJlYXRlZAotICAgc3BlY2lhbGx5IC0tIGkuZS4sIHRoZWlyIHNpemVzIGFyZSB1c2VkIGFzIHRoZWlyICJ2YWx1ZXMiLiAgKi8KLQotc3RhdGljIGludAotbnVtZXJpY19mb3J3YXJkIChQX3gsIFBfeSkKLSAgICAgY29uc3QgUFRSIFBfeDsKLSAgICAgY29uc3QgUFRSIFBfeTsKLXsKLSAgYXN5bWJvbCAqeCwgKnk7Ci0gIGFzZWN0aW9uICp4cywgKnlzOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9ICBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhzID0gYmZkX2dldF9zZWN0aW9uICh4KTsKLSAgeXMgPSBiZmRfZ2V0X3NlY3Rpb24gKHkpOwotCi0gIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHhzKSkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHlzKSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAodmFsdWVvZiAoeCkgIT0gdmFsdWVvZiAoeSkpCi0gICAgcmV0dXJuIHZhbHVlb2YgKHgpIDwgdmFsdWVvZiAoeSkgPyAtMSA6IDE7Ci0KLSAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKLX0KLQotc3RhdGljIGludAotbnVtZXJpY19yZXZlcnNlICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHJldHVybiAtIG51bWVyaWNfZm9yd2FyZCAoeCwgeSk7Ci19Ci0KLXN0YXRpYyBpbnQKLW5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KQotICAgICBjb25zdCBQVFIgUF94OwotICAgICBjb25zdCBQVFIgUF95OwotewotICBhc3ltYm9sICp4LCAqeTsKLSAgY29uc3QgY2hhciAqeG4sICp5bjsKLQotICB4ID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChzb3J0X2JmZCwgc29ydF9keW5hbWljLCBQX3gsIHNvcnRfeCk7Ci0gIHkgPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeSwgc29ydF95KTsKLSAgaWYgKHggPT0gTlVMTCB8fCB5ID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChzb3J0X2JmZCkpOwotCi0gIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7Ci0gIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7Ci0KLSAgcmV0dXJuICgoeG4gPT0gTlVMTCkgPyAoKHluID09IE5VTEwpID8gMCA6IC0xKSA6Ci0JICAoKHluID09IE5VTEwpID8gMSA6IHN0cmNtcCAoeG4sIHluKSkpOwotfQotCi1zdGF0aWMgaW50Ci1ub25fbnVtZXJpY19yZXZlcnNlICh4LCB5KQotICAgICBjb25zdCBQVFIgeDsKLSAgICAgY29uc3QgUFRSIHk7Ci17Ci0gIHJldHVybiAtIG5vbl9udW1lcmljX2ZvcndhcmQgKHgsIHkpOwotfQotCi1zdGF0aWMgaW50ICgqKHNvcnRlcnNbMl1bMl0pKSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpID0KLXsKLSAgeyBub25fbnVtZXJpY19mb3J3YXJkLCBub25fbnVtZXJpY19yZXZlcnNlIH0sCi0gIHsgbnVtZXJpY19mb3J3YXJkLCBudW1lcmljX3JldmVyc2UgfQotfTsKLQotLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNpbWlsYXIKLSAgIHRvIG51bWVyaWNfZm9yd2FyZCwgYnV0IHdoZW4gc3ltYm9scyBoYXZlIHRoZSBzYW1lIHZhbHVlIGl0IHNvcnRzCi0gICBieSBzZWN0aW9uIFZNQS4gIFRoaXMgc2ltcGxpZmllcyB0aGUgc29ydF9zeW1ib2xzX2J5X3NpemUgY29kZQotICAgd2hpY2ggaGFuZGxlcyBzeW1ib2xzIGF0IHRoZSBlbmQgb2Ygc2VjdGlvbnMuICBBbHNvLCB0aGlzIHJvdXRpbmUKLSAgIHRyaWVzIHRvIHNvcnQgZmlsZSBuYW1lcyBiZWZvcmUgb3RoZXIgc3ltYm9scyB3aXRoIHRoZSBzYW1lIHZhbHVlLgotICAgVGhhdCB3aWxsIG1ha2UgdGhlIGZpbGUgbmFtZSBoYXZlIGEgemVybyBzaXplLCB3aGljaCB3aWxsIG1ha2UKLSAgIHNvcnRfc3ltYm9sc19ieV9zaXplIGNob29zZSB0aGUgbm9uIGZpbGUgbmFtZSBzeW1ib2wsIGxlYWRpbmcgdG8KLSAgIG1vcmUgbWVhbmluZ2Z1bCBvdXRwdXQuICBGb3Igc2ltaWxhciByZWFzb25zLCB0aGlzIGNvZGUgc29ydHMKLSAgIGdudV9jb21waWxlZF8qIGFuZCBnY2MyX2NvbXBpbGVkIGJlZm9yZSBvdGhlciBzeW1ib2xzIHdpdGggdGhlIHNhbWUKLSAgIHZhbHVlLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMSAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGFzeW1ib2wgKngsICp5OwotICBhc2VjdGlvbiAqeHMsICp5czsKLSAgY29uc3QgY2hhciAqeG4sICp5bjsKLSAgc2l6ZV90IHhubCwgeW5sOwotICBpbnQgeGYsIHlmOwotCi0gIHggPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKHNvcnRfYmZkLCBzb3J0X2R5bmFtaWMsIFBfeCwgc29ydF94KTsKLSAgeSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoc29ydF9iZmQsIHNvcnRfZHluYW1pYywgUF95LCBzb3J0X3kpOwotICBpZiAoeCA9PSBOVUxMIHx8IHkgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKHNvcnRfYmZkKSk7Ci0KLSAgeHMgPSBiZmRfZ2V0X3NlY3Rpb24gKHgpOwotICB5cyA9IGJmZF9nZXRfc2VjdGlvbiAoeSk7Ci0KLSAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoeHMpKQotICAgIGFib3J0ICgpOwotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uICh5cykpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHZhbHVlb2YgKHgpICE9IHZhbHVlb2YgKHkpKQotICAgIHJldHVybiB2YWx1ZW9mICh4KSA8IHZhbHVlb2YgKHkpID8gLTEgOiAxOwotCi0gIGlmICh4cy0+dm1hICE9IHlzLT52bWEpCi0gICAgcmV0dXJuIHhzLT52bWEgPCB5cy0+dm1hID8gLTEgOiAxOwotCi0gIHhuID0gYmZkX2FzeW1ib2xfbmFtZSAoeCk7Ci0gIHluID0gYmZkX2FzeW1ib2xfbmFtZSAoeSk7Ci0gIHhubCA9IHN0cmxlbiAoeG4pOwotICB5bmwgPSBzdHJsZW4gKHluKTsKLQotICAvKiBUaGUgc3ltYm9scyBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQgY29udmV5IGV2ZW4gbGVzcwotICAgICBpbmZvcm1hdGlvbiB0aGFuIHRoZSBmaWxlIG5hbWUsIHNvIHNvcnQgdGhlbSBvdXQgZmlyc3QuICAqLwotCi0gIHhmID0gKHN0cnN0ciAoeG4sICJnbnVfY29tcGlsZWQiKSAhPSBOVUxMCi0JfHwgc3Ryc3RyICh4biwgImdjYzJfY29tcGlsZWQiKSAhPSBOVUxMKTsKLSAgeWYgPSAoc3Ryc3RyICh5biwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKHluLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotCi0gIGlmICh4ZiAmJiAhIHlmKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgeGYgJiYgeWYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogV2UgdXNlIGEgaGV1cmlzdGljIGZvciB0aGUgZmlsZSBuYW1lLiAgSXQgbWF5IG5vdCB3b3JrIG9uIG5vbgotICAgICBVbml4IHN5c3RlbXMsIGJ1dCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXI7IHRoZSBvbmx5IGRpZmZlcmVuY2UKLSAgICAgaXMgcHJlY2lzZWx5IHdoaWNoIHN5bWJvbCBuYW1lcyBnZXQgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUgZmlsZV9zeW1ib2wocywgc24sIHNubCkJCQlcCi0gICgoKHMpLT5mbGFncyAmIEJTRl9GSUxFKSAhPSAwCQkJXAotICAgfHwgKChzbilbKHNubCkgLSAyXSA9PSAnLicJCQlcCi0gICAgICAgJiYgKChzbilbKHNubCkgLSAxXSA9PSAnbycJCVwKLQkgICB8fCAoc24pWyhzbmwpIC0gMV0gPT0gJ2EnKSkpCi0KLSAgeGYgPSBmaWxlX3N5bWJvbCAoeCwgeG4sIHhubCk7Ci0gIHlmID0gZmlsZV9zeW1ib2wgKHksIHluLCB5bmwpOwotCi0gIGlmICh4ZiAmJiAhIHlmKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgeGYgJiYgeWYpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIG5vbl9udW1lcmljX2ZvcndhcmQgKFBfeCwgUF95KTsKLX0KLQotLyogVGhpcyBzb3J0IHJvdXRpbmUgaXMgdXNlZCBieSBzb3J0X3N5bWJvbHNfYnlfc2l6ZS4gIEl0IGlzIHNvcnRpbmcKLSAgIGFuIGFycmF5IG9mIHNpemVfc3ltIHN0cnVjdHVyZXMgaW50byBzaXplIG9yZGVyLiAgKi8KLQotc3RhdGljIGludAotc2l6ZV9mb3J3YXJkMiAoUF94LCBQX3kpCi0gICAgIGNvbnN0IFBUUiBQX3g7Ci0gICAgIGNvbnN0IFBUUiBQX3k7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzaXplX3N5bSAqeCA9IChjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKikgUF94OwotICBjb25zdCBzdHJ1Y3Qgc2l6ZV9zeW0gKnkgPSAoY29uc3Qgc3RydWN0IHNpemVfc3ltICopIFBfeTsKLQotICBpZiAoeC0+c2l6ZSA8IHktPnNpemUpCi0gICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IDEgOiAtMTsKLSAgZWxzZSBpZiAoeC0+c2l6ZSA+IHktPnNpemUpCi0gICAgcmV0dXJuIHJldmVyc2Vfc29ydCA/IC0xIDogMTsKLSAgZWxzZQotICAgIHJldHVybiBzb3J0ZXJzWzBdW3JldmVyc2Vfc29ydF0gKHgtPm1pbmlzeW0sIHktPm1pbmlzeW0pOwotfQotCi0vKiBTb3J0IHRoZSBzeW1ib2xzIGJ5IHNpemUuICBXZSBndWVzcyB0aGUgc2l6ZSBieSBhc3N1bWluZyB0aGF0IHRoZQotICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIG5leHQgaGlnaGVyIHN5bWJvbCBpcyB0aGUgc2l6ZS4gIEZJWE1FOiBFTEYgYWN0dWFsbHkgc3RvcmVzIGEgc2l6ZQotICAgd2l0aCBlYWNoIHN5bWJvbC4gIFdlIHNob3VsZCB1c2UgaXQuICAqLwotCi1zdGF0aWMgbG9uZwotc29ydF9zeW1ib2xzX2J5X3NpemUgKGFiZmQsIGR5bmFtaWMsIG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc3ltc2l6ZXNwKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJvb2xlYW4gZHluYW1pYzsKLSAgICAgUFRSIG1pbmlzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgc3RydWN0IHNpemVfc3ltICoqc3ltc2l6ZXNwOwotewotICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0gIGFzeW1ib2wgKnN5bSA9IE5VTEw7Ci0gIGFzeW1ib2wgKnN0b3JlX3N5bSwgKnN0b3JlX25leHQ7Ci0KLSAgcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwgc2l6ZV9mb3J3YXJkMSk7Ci0KLSAgLyogV2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIHNwZWNpYWwgc2V0IG9mIHN5bWJvbHMgYW5kIHNpemVzIHRvCi0gICAgIHByaW50LiAgKi8KLSAgc3ltc2l6ZXMgPSAoc3RydWN0IHNpemVfc3ltICopIHhtYWxsb2MgKHN5bWNvdW50ICogc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pKTsKLSAgKnN5bXNpemVzcCA9IHN5bXNpemVzOwotCi0gIC8qIE5vdGUgdGhhdCBmaWx0ZXJfc3ltYm9scyBoYXMgYWxyZWFkeSByZW1vdmVkIGFsbCBhYnNvbHV0ZSBhbmQKLSAgICAgdW5kZWZpbmVkIHN5bWJvbHMuICBIZXJlIHdlIHJlbW92ZSBhbGwgc3ltYm9scyB3aG9zZSBzaXplIHdpbmRzCi0gICAgIHVwIGFzIHplcm8uICAqLwotCi0gIGZyb20gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0gIGZyb21lbmQgPSBmcm9tICsgc3ltY291bnQgKiBzaXplOwotCi0gIHN0b3JlX3N5bSA9IHNvcnRfeDsKLSAgc3RvcmVfbmV4dCA9IHNvcnRfeTsKLQotICBpZiAoZnJvbSA8IGZyb21lbmQpCi0gICAgewotICAgICAgc3ltID0gYmZkX21pbmlzeW1ib2xfdG9fc3ltYm9sIChhYmZkLCBkeW5hbWljLCAoY29uc3QgUFRSKSBmcm9tLAotCQkJCSAgICAgIHN0b3JlX3N5bSk7Ci0gICAgICBpZiAoc3ltID09IE5VTEwpCi0JYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgfQotCi0gIGZvciAoOyBmcm9tIDwgZnJvbWVuZDsgZnJvbSArPSBzaXplKQotICAgIHsKLSAgICAgIGFzeW1ib2wgKm5leHQ7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotICAgICAgYmZkX3ZtYSBzejsKLSAgICAgIGFzeW1ib2wgKnRlbXA7Ci0KLSAgICAgIGlmIChmcm9tICsgc2l6ZSA8IGZyb21lbmQpCi0JewotCSAgbmV4dCA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwKLQkJCQkJICAgZHluYW1pYywKLQkJCQkJICAgKGNvbnN0IFBUUikgKGZyb20gKyBzaXplKSwKLQkJCQkJICAgc3RvcmVfbmV4dCk7Ci0JICBpZiAobmV4dCA9PSBOVUxMKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQl9Ci0gICAgICBlbHNlCi0JbmV4dCA9IE5VTEw7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbiAoc3ltKTsKLQotICAgICAgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjKSkKLQlzeiA9IHN5bS0+dmFsdWU7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGZyb20gKyBzaXplIDwgZnJvbWVuZAotCSAgICAgICYmIHNlYyA9PSBiZmRfZ2V0X3NlY3Rpb24gKG5leHQpKQotCSAgICBzeiA9IHZhbHVlb2YgKG5leHQpIC0gdmFsdWVvZiAoc3ltKTsKLQkgIGVsc2UKLQkgICAgc3ogPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICsgYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKQotCQkgIC0gdmFsdWVvZiAoc3ltKSk7Ci0JfQotCi0gICAgICBpZiAoc3ogIT0gMCkKLQl7Ci0JICBzeW1zaXplcy0+bWluaXN5bSA9IChjb25zdCBQVFIpIGZyb207Ci0JICBzeW1zaXplcy0+c2l6ZSA9IHN6OwotCSAgKytzeW1zaXplczsKLQl9Ci0KLSAgICAgIHN5bSA9IG5leHQ7Ci0KLSAgICAgIHRlbXAgPSBzdG9yZV9zeW07Ci0gICAgICBzdG9yZV9zeW0gPSBzdG9yZV9uZXh0OwotICAgICAgc3RvcmVfbmV4dCA9IHRlbXA7Ci0gICAgfQotCi0gIHN5bWNvdW50ID0gc3ltc2l6ZXMgLSAqc3ltc2l6ZXNwOwotCi0gIC8qIFdlIG11c3Qgbm93IHNvcnQgYWdhaW4gYnkgc2l6ZS4gICovCi0gIHFzb3J0ICgoUFRSKSAqc3ltc2l6ZXNwLCBzeW1jb3VudCwgc2l6ZW9mIChzdHJ1Y3Qgc2l6ZV9zeW0pLCBzaXplX2ZvcndhcmQyKTsKLQotICByZXR1cm4gc3ltY291bnQ7Ci19Ci0MCi0vKiBJZiBBUkNISVZFX0JGRCBpcyBub24tTlVMTCwgaXQgaXMgdGhlIGFyY2hpdmUgY29udGFpbmluZyBBQkZELiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfcmVsX2ZpbGUgKGFiZmQsIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGxvbmcgc3ltY291bnQ7Ci0gIFBUUiBtaW5pc3ltczsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHN0cnVjdCBzaXplX3N5bSAqc3ltc2l6ZXM7Ci0KLSAgaWYgKCEgZHluYW1pYykKLSAgICB7Ci0gICAgICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgSEFTX1NZTVMpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG5vIHN5bWJvbHNcbiIpLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBzeW1jb3VudCA9IGJmZF9yZWFkX21pbmlzeW1ib2xzIChhYmZkLCBkeW5hbWljLCAmbWluaXN5bXMsICZzaXplKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3ltY291bnQgPT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBEaXNjYXJkIHRoZSBzeW1ib2xzIHdlIGRvbid0IHdhbnQgdG8gcHJpbnQuCi0gICAgIEl0J3MgT0sgdG8gZG8gdGhpcyBpbiBwbGFjZTsgd2UnbGwgZnJlZSB0aGUgc3RvcmFnZSBhbnl3YXkKLSAgICAgKGFmdGVyIHByaW50aW5nKS4gICovCi0KLSAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplKTsKLQotICBzeW1zaXplcyA9IE5VTEw7Ci0gIGlmICghIG5vX3NvcnQpCi0gICAgewotICAgICAgc29ydF9iZmQgPSBhYmZkOwotICAgICAgc29ydF9keW5hbWljID0gZHluYW1pYzsKLSAgICAgIHNvcnRfeCA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gICAgICBzb3J0X3kgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICAgICAgaWYgKHNvcnRfeCA9PSBOVUxMIHx8IHNvcnRfeSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBpZiAoISBzb3J0X2J5X3NpemUpCi0JcXNvcnQgKG1pbmlzeW1zLCBzeW1jb3VudCwgc2l6ZSwKLQkgICAgICAgc29ydGVyc1tzb3J0X251bWVyaWNhbGx5XVtyZXZlcnNlX3NvcnRdKTsKLSAgICAgIGVsc2UKLQlzeW1jb3VudCA9IHNvcnRfc3ltYm9sc19ieV9zaXplIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsCi0JCQkJCSBzaXplLCAmc3ltc2l6ZXMpOwotICAgIH0KLQotICBpZiAoISBzb3J0X2J5X3NpemUpCi0gICAgcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCk7Ci0gIGVsc2UKLSAgICBwcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpOwotCi0gIGZyZWUgKG1pbmlzeW1zKTsKLX0KLQwKLS8qIENob29zZSB3aGljaCBzeW1ib2wgZW50cmllcyB0byBwcmludDsKLSAgIGNvbXBhY3QgdGhlbSBkb3dud2FyZCB0byBnZXQgcmlkIG9mIHRoZSByZXN0LgotICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBiZSBwcmludGVkLiAgKi8KLQotc3RhdGljIGxvbmcKLWZpbHRlcl9zeW1ib2xzIChhYmZkLCBkeW5hbWljLCBtaW5pc3ltcywgc3ltY291bnQsIHNpemUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBQVFIgbWluaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQsICp0bzsKLSAgYXN5bWJvbCAqc3RvcmU7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgdG8gPSAoYmZkX2J5dGUgKikgbWluaXN5bXM7Ci0KLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgaW50IGtlZXAgPSAwOwotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBQUk9HUkVTUyAoMSk7Ci0gICAgICAKLSAgICAgIHN5bSA9IGJmZF9taW5pc3ltYm9sX3RvX3N5bWJvbCAoYWJmZCwgZHluYW1pYywgKGNvbnN0IFBUUikgZnJvbSwgc3RvcmUpOwotICAgICAgaWYgKHN5bSA9PSBOVUxMKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBpZiAodW5kZWZpbmVkX29ubHkpCi0Ja2VlcCA9IGJmZF9pc191bmRfc2VjdGlvbiAoc3ltLT5zZWN0aW9uKTsKLSAgICAgIGVsc2UgaWYgKGV4dGVybmFsX29ubHkpCi0Ja2VlcCA9ICgoc3ltLT5mbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkJfHwgKHN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMAotCQl8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkJfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKTsKLSAgICAgIGVsc2UKLQlrZWVwID0gMTsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmICEgcHJpbnRfZGVidWdfc3ltcwotCSAgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQotCWtlZXAgPSAwOwotCi0gICAgICBpZiAoa2VlcAotCSAgJiYgc29ydF9ieV9zaXplCi0JICAmJiAoYmZkX2lzX2Fic19zZWN0aW9uIChzeW0tPnNlY3Rpb24pCi0JICAgICAgfHwgYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKSkKLQlrZWVwID0gMDsKLQotICAgICAgaWYgKGtlZXAKLQkgICYmIGRlZmluZWRfb25seSkKLQl7Ci0JICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzeW0tPnNlY3Rpb24pKQotCSAgICBrZWVwID0gMDsKLQl9Ci0KLSAgICAgIGlmIChrZWVwKQotCXsKLQkgIG1lbWNweSAodG8sIGZyb20sIHNpemUpOwotCSAgdG8gKz0gc2l6ZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAodG8gLSAoYmZkX2J5dGUgKikgbWluaXN5bXMpIC8gc2l6ZTsKLX0KLQwKLS8qIFByaW50IHN5bWJvbCBuYW1lIE5BTUUsIHJlYWQgZnJvbSBBQkZELCB3aXRoIHByaW50ZiBmb3JtYXQgRk9STUFULAotICAgZGVtYW5nbGluZyBpdCBpZiByZXF1ZXN0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltbmFtZSAoZm9ybWF0LCBuYW1lLCBhYmZkKQotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgaWYgKGRvX2RlbWFuZ2xlICYmICpuYW1lKQotICAgIHsKLSAgICAgIGNoYXIgKnJlczsKLQotICAgICAgLyogSW4gdGhpcyBtb2RlLCBnaXZlIGEgdXNlci1sZXZlbCB2aWV3IG9mIHRoZSBzeW1ib2wgbmFtZQotCSBldmVuIGlmIGl0J3Mgbm90IG1hbmdsZWQ7IHN0cmlwIG9mZiBhbnkgbGVhZGluZwotCSB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09IG5hbWVbMF0pCi0JbmFtZSsrOwotCi0gICAgICByZXMgPSBjcGx1c19kZW1hbmdsZSAobmFtZSwgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICAgICAgaWYgKHJlcykKLQl7Ci0JICBwcmludGYgKGZvcm1hdCwgcmVzKTsKLQkgIGZyZWUgKHJlcyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBwcmludGYgKGZvcm1hdCwgbmFtZSk7Ci19Ci0KLS8qIFByaW50IHRoZSBzeW1ib2xzLiAgSWYgQVJDSElWRV9CRkQgaXMgbm9uLU5VTEwsIGl0IGlzIHRoZSBhcmNoaXZlCi0gICBjb250YWluaW5nIEFCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9scyAoYWJmZCwgZHluYW1pYywgbWluaXN5bXMsIHN5bWNvdW50LCBzaXplLCBhcmNoaXZlX2JmZCkKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIGR5bmFtaWM7Ci0gICAgIFBUUiBtaW5pc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0gICAgIGJmZCAqYXJjaGl2ZV9iZmQ7Ci17Ci0gIGFzeW1ib2wgKnN0b3JlOwotICBiZmRfYnl0ZSAqZnJvbSwgKmZyb21lbmQ7Ci0KLSAgc3RvcmUgPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBpZiAoc3RvcmUgPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBmcm9tID0gKGJmZF9ieXRlICopIG1pbmlzeW1zOwotICBmcm9tZW5kID0gZnJvbSArIHN5bWNvdW50ICogc2l6ZTsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tICs9IHNpemUpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IHRoZSBzeW1ib2xzIHdoZW4gc29ydGluZyBieSBzaXplLiAgKi8KLQotc3RhdGljIHZvaWQgCi1wcmludF9zaXplX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMsIHN5bXNpemVzLCBzeW1jb3VudCwgYXJjaGl2ZV9iZmQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotICAgICBzdHJ1Y3Qgc2l6ZV9zeW0gKnN5bXNpemVzOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBiZmQgKmFyY2hpdmVfYmZkOwotewotICBhc3ltYm9sICpzdG9yZTsKLSAgc3RydWN0IHNpemVfc3ltICpmcm9tLCAqZnJvbWVuZDsKLQotICBzdG9yZSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoYWJmZCk7Ci0gIGlmIChzdG9yZSA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGZyb20gPSBzeW1zaXplczsKLSAgZnJvbWVuZCA9IGZyb20gKyBzeW1jb3VudDsKLSAgZm9yICg7IGZyb20gPCBmcm9tZW5kOyBmcm9tKyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotCi0gICAgICBzeW0gPSBiZmRfbWluaXN5bWJvbF90b19zeW1ib2wgKGFiZmQsIGR5bmFtaWMsIGZyb20tPm1pbmlzeW0sIHN0b3JlKTsKLSAgICAgIGlmIChzeW0gPT0gTlVMTCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICAgICAgLyogU2V0IHRoZSBzeW1ib2wgdmFsdWUgc28gdGhhdCB3ZSBhY3R1YWxseSBkaXNwbGF5IHRoZSBzeW1ib2wKLSAgICAgICAgIHNpemUuICAqLwotICAgICAgc3ltLT52YWx1ZSA9IGZyb20tPnNpemUgLSBiZmRfc2VjdGlvbl92bWEgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSk7Ci0KLSAgICAgIHByaW50X3N5bWJvbCAoYWJmZCwgc3ltLCBhcmNoaXZlX2JmZCk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhIHNpbmdsZSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sIChhYmZkLCBzeW0sIGFyY2hpdmVfYmZkKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkICphcmNoaXZlX2JmZDsKLXsKLSAgUFJPR1JFU1MgKDEpOwotCi0gICgqZm9ybWF0LT5wcmludF9zeW1ib2xfZmlsZW5hbWUpIChhcmNoaXZlX2JmZCwgYWJmZCk7Ci0KLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JcHJpbnRfc3ltbmFtZSAoIiVzIiwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgYWJmZCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3ltYm9sX2luZm8gc3ltaW5mbzsKLQotICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgc3ltLCAmc3ltaW5mbyk7Ci0gICAgICAoKmZvcm1hdC0+cHJpbnRfc3ltYm9sX2luZm8pICgmc3ltaW5mbywgYWJmZCk7Ci0gICAgfQotCi0gIGlmIChsaW5lX251bWJlcnMpCi0gICAgewotICAgICAgc3RhdGljIGFzeW1ib2wgKipzeW1zOwotICAgICAgc3RhdGljIGxvbmcgc3ltY291bnQ7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKmZ1bmN0aW9ubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lbm87Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZ2V0IHRoZSBjYW5vbmljYWwgc3ltYm9scyBpbiBvcmRlciB0byBjYWxsCi0gICAgICAgICBiZmRfZmluZF9uZWFyZXN0X2xpbmUuICBUaGlzIGlzIGluZWZmaWNpZW50LCBidXQsIHRoZW4sIHlvdQotICAgICAgICAgZG9uJ3QgaGF2ZSB0byB1c2UgLS1saW5lLW51bWJlcnMuICAqLwotICAgICAgaWYgKGFiZmQgIT0gbGluZW5vX2NhY2hlX2JmZCAmJiBzeW1zICE9IE5VTEwpCi0JewotCSAgZnJlZSAoc3ltcyk7Ci0JICBzeW1zID0gTlVMTDsKLQl9Ci0gICAgICBpZiAoc3ltcyA9PSBOVUxMKQotCXsKLQkgIGxvbmcgc3ltc2l6ZTsKLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQkgIGlmIChzeW1zaXplIDwgMCkKLQkgICAgYmZkX2ZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBzeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYWJmZCwgc3ltcyk7Ci0JICBpZiAoc3ltY291bnQgPCAwKQotCSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQkgIGxpbmVub19jYWNoZV9iZmQgPSBhYmZkOwotCX0KLQotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKSkKLQl7Ci0JICBzdGF0aWMgYXNlY3Rpb24gKipzZWNzOwotCSAgc3RhdGljIGFyZWxlbnQgKioqcmVsb2NzOwotCSAgc3RhdGljIGxvbmcgKnJlbGNvdW50OwotCSAgc3RhdGljIHVuc2lnbmVkIGludCBzZWNjb3VudDsKLQkgIHVuc2lnbmVkIGludCBpOwotCSAgY29uc3QgY2hhciAqc3ltbmFtZTsKLQotCSAgLyogRm9yIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHdlIHRyeSB0byBmaW5kIGEgcmVsb2MgZm9yIHRoZQotICAgICAgICAgICAgIHN5bWJvbCwgYW5kIHByaW50IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgcmVsb2MuICAqLwotCi0JICBpZiAoYWJmZCAhPSBsaW5lbm9fY2FjaGVfcmVsX2JmZCAmJiByZWxvY3MgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQotCQlpZiAocmVsb2NzW2ldICE9IE5VTEwpCi0JCSAgZnJlZSAocmVsb2NzW2ldKTsKLQkgICAgICBmcmVlIChzZWNzKTsKLQkgICAgICBmcmVlIChyZWxvY3MpOwotCSAgICAgIGZyZWUgKHJlbGNvdW50KTsKLQkgICAgICBzZWNzID0gTlVMTDsKLQkgICAgICByZWxvY3MgPSBOVUxMOwotCSAgICAgIHJlbGNvdW50ID0gTlVMTDsKLQkgICAgfQotCi0JICBpZiAocmVsb2NzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvIGluZm87Ci0KLQkgICAgICBzZWNjb3VudCA9IGJmZF9jb3VudF9zZWN0aW9ucyAoYWJmZCk7Ci0KLQkgICAgICBzZWNzID0gKGFzZWN0aW9uICoqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqc2Vjcyk7Ci0JICAgICAgcmVsb2NzID0gKGFyZWxlbnQgKioqKSB4bWFsbG9jIChzZWNjb3VudCAqIHNpemVvZiAqcmVsb2NzKTsKLQkgICAgICByZWxjb3VudCA9IChsb25nICopIHhtYWxsb2MgKHNlY2NvdW50ICogc2l6ZW9mICpyZWxjb3VudCk7Ci0KLQkgICAgICBpbmZvLnNlY3MgPSBzZWNzOwotCSAgICAgIGluZm8ucmVsb2NzID0gcmVsb2NzOwotCSAgICAgIGluZm8ucmVsY291bnQgPSByZWxjb3VudDsKLQkgICAgICBpbmZvLnN5bXMgPSBzeW1zOwotCSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZ2V0X3JlbG9jcywgKFBUUikgJmluZm8pOwotCSAgICAgIGxpbmVub19jYWNoZV9yZWxfYmZkID0gYWJmZDsKLQkgICAgfQotCi0JICBzeW1uYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzZWNjb3VudDsgaSsrKQotCSAgICB7Ci0JICAgICAgbG9uZyBqOwotCi0JICAgICAgZm9yIChqID0gMDsgaiA8IHJlbGNvdW50W2ldOyBqKyspCi0JCXsKLQkJICBhcmVsZW50ICpyOwotCi0JCSAgciA9IHJlbG9jc1tpXVtqXTsKLQkJICBpZiAoci0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCQkgICAgICAmJiAoKnItPnN5bV9wdHJfcHRyKS0+c2VjdGlvbiA9PSBzeW0tPnNlY3Rpb24KLQkJICAgICAgJiYgKCpyLT5zeW1fcHRyX3B0ciktPnZhbHVlID09IHN5bS0+dmFsdWUKLQkJICAgICAgJiYgc3RyY21wIChzeW1uYW1lLAotCQkJCSBiZmRfYXN5bWJvbF9uYW1lICgqci0+c3ltX3B0cl9wdHIpKSA9PSAwCi0JCSAgICAgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2Vjc1tpXSwgc3ltcywKLQkJCQkJCXItPmFkZHJlc3MsICZmaWxlbmFtZSwKLQkJCQkJCSZmdW5jdGlvbm5hbWUsICZsaW5lbm8pKQotCQkgICAgewotCQkgICAgICAvKiBXZSBvbmx5IHByaW50IHRoZSBmaXJzdCBvbmUgd2UgZmluZC4gICovCi0JCSAgICAgIHByaW50ZiAoIlx0JXM6JXUiLCBmaWxlbmFtZSwgbGluZW5vKTsKLQkJICAgICAgaSA9IHNlY2NvdW50OwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2dldF9zZWN0aW9uIChzeW0pLT5vd25lciA9PSBhYmZkKQotCXsKLQkgIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSwgc3ltcywKLQkJCQkgICAgIHN5bS0+dmFsdWUsICZmaWxlbmFtZSwgJmZ1bmN0aW9ubmFtZSwKLQkJCQkgICAgICZsaW5lbm8pCi0JICAgICAgJiYgZmlsZW5hbWUgIT0gTlVMTAotCSAgICAgICYmIGxpbmVubyAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXHQlczoldSIsIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBwdXRjaGFyICgnXG4nKTsKLX0KLQwKLS8qIFRoZSBmb2xsb3dpbmcgMyBncm91cHMgb2YgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdW5jb25kaXRpb25hbGx5LAotICAgb25jZSBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBlYWNoIGZpbGUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCi0gICBUaGV5IHNob3VsZCBjaGVjayBgZmlsZW5hbWVfcGVyX2ZpbGUnIGFuZCBgZmlsZW5hbWVfcGVyX3N5bWJvbCcsCi0gICBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlaXIgb3V0cHV0IGZvcm1hdCwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8KLSAgIHByaW50IGFueXRoaW5nLiAgKi8KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIG9iamVjdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX2JzZCAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoZmlsZW5hbWVfcGVyX2ZpbGUgJiYgIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X29iamVjdF9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICh1bmRlZmluZWRfb25seSkKLSAgICBwcmludGYgKF8oIlxuXG5VbmRlZmluZWQgc3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzOlxuXG4iKSwgZmlsZW5hbWUpOwotICBwcmludGYgKF8oIlwKLU5hbWUgICAgICAgICAgICAgICAgICBWYWx1ZSAgIENsYXNzICAgICAgICBUeXBlICAgICAgICAgU2l6ZSAgIExpbmUgIFNlY3Rpb25cblxuIikpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb2JqZWN0X2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSAmJiAhZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCIlczpcbiIsIGZpbGVuYW1lKTsKLX0KLQwKLS8qIFByaW50IHRoZSBuYW1lIG9mIGFuIGFyY2hpdmUgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfZmlsZW5hbWVfYnNkIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmIChmaWxlbmFtZV9wZXJfZmlsZSkKLSAgICBwcmludGYgKCJcbiVzOlxuIiwgZmlsZW5hbWUpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXJjaGl2ZV9maWxlbmFtZV9zeXN2IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9hcmNoaXZlX2ZpbGVuYW1lX3Bvc2l4IChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiBhbiBhcmNoaXZlIG1lbWJlciBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX2JzZCAoYXJjaGl2ZSwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKmFyY2hpdmU7Ci0gICAgIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoIWZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgcHJpbnRmICgiXG4lczpcbiIsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3N5c3YgKGFyY2hpdmUsIGZpbGVuYW1lKQotICAgICBjaGFyICphcmNoaXZlOwotICAgICBDT05TVCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgaWYgKHVuZGVmaW5lZF9vbmx5KQotICAgIHByaW50ZiAoXygiXG5cblVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXNbJXNdOlxuXG4iKSwgYXJjaGl2ZSwgZmlsZW5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcblxuU3ltYm9scyBmcm9tICVzWyVzXTpcblxuIiksIGFyY2hpdmUsIGZpbGVuYW1lKTsKLSAgcHJpbnRmIChfKCJcCi1OYW1lICAgICAgICAgICAgICAgICAgVmFsdWUgICBDbGFzcyAgICAgICAgVHlwZSAgICAgICAgIFNpemUgICBMaW5lICBTZWN0aW9uXG5cbiIpKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2FyY2hpdmVfbWVtYmVyX3Bvc2l4IChhcmNoaXZlLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqYXJjaGl2ZTsKLSAgICAgQ09OU1QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGlmICghZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICBwcmludGYgKCIlc1slc106XG4iLCBhcmNoaXZlLCBmaWxlbmFtZSk7Ci19Ci0MCi0vKiBQcmludCB0aGUgbmFtZSBvZiB0aGUgZmlsZSAoYW5kIGFyY2hpdmUsIGlmIHRoZXJlIGlzIG9uZSkKLSAgIGNvbnRhaW5pbmcgYSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2ZpbGVuYW1lX2JzZCAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKLSAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfc3lzdiAoYXJjaGl2ZV9iZmQsIGFiZmQpCi0gICAgIGJmZCAqYXJjaGl2ZV9iZmQsICphYmZkOwotewotICBpZiAoZmlsZW5hbWVfcGVyX3N5bWJvbCkKLSAgICB7Ci0gICAgICBpZiAoYXJjaGl2ZV9iZmQpCi0JcHJpbnRmICgiJXM6IiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpKTsKLSAgICAgIHByaW50ZiAoIiVzOiIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfZmlsZW5hbWVfcG9zaXggKGFyY2hpdmVfYmZkLCBhYmZkKQotICAgICBiZmQgKmFyY2hpdmVfYmZkLCAqYWJmZDsKLXsKLSAgaWYgKGZpbGVuYW1lX3Blcl9zeW1ib2wpCi0gICAgewotICAgICAgaWYgKGFyY2hpdmVfYmZkKQotCXByaW50ZiAoIiVzWyVzXTogIiwgYmZkX2dldF9maWxlbmFtZSAoYXJjaGl2ZV9iZmQpLAotCQliZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICBlbHNlCi0JcHJpbnRmICgiJXM6ICIsIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci19Ci0MCi0vKiBQcmludCBhIHN5bWJvbCB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF92YWx1ZSAodmFsKQotICAgICBiZmRfdm1hIHZhbDsKLXsKLSNpZiAhIGRlZmluZWQgKEJGRDY0KSB8fCBCRkRfSE9TVF82NEJJVF9MT05HCi0gIHByaW50ZiAodmFsdWVfZm9ybWF0LCB2YWwpOwotI2Vsc2UKLSAgLyogV2UgaGF2ZSBhIDY0IGJpdCB2YWx1ZSB0byBwcmludCwgYnV0IHRoZSBob3N0IGlzIG9ubHkgMzIgYml0LiAgKi8KLSAgaWYgKHByaW50X3JhZGl4ID09IDE2KQotICAgIGZwcmludGZfdm1hIChzdGRvdXQsIHZhbCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlszMF07Ci0gICAgICBjaGFyICpzOwotCi0gICAgICBzID0gYnVmICsgc2l6ZW9mIGJ1ZjsKLSAgICAgICotLXMgPSAnXDAnOwotICAgICAgd2hpbGUgKHZhbCA+IDApCi0JewotCSAgKi0tcyA9ICh2YWwgJSBwcmludF9yYWRpeCkgKyAnMCc7Ci0JICB2YWwgLz0gcHJpbnRfcmFkaXg7Ci0JfQotICAgICAgd2hpbGUgKChidWYgKyBzaXplb2YgYnVmIC0gMSkgLSBzIDwgMTYpCi0JKi0tcyA9ICcwJzsKLSAgICAgIHByaW50ZiAoIiVzIiwgcyk7Ci0gICAgfQotI2VuZGlmCi19Ci0KLS8qIFByaW50IGEgbGluZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19ic2QgKGluZm8sIGFiZmQpCi0gICAgIHN5bWJvbF9pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGlmIChpbmZvLT50eXBlID09ICdVJykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlKnMiLAotI2lmZGVmIEJGRDY0Ci0JICAgICAgMTYsCi0jZWxzZQotCSAgICAgIDgsCi0jZW5kaWYKLQkgICAgICAiIik7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgcHJpbnRmICgiICVjIiwgaW5mby0+dHlwZSk7Ci0gIGlmIChpbmZvLT50eXBlID09ICctJykKLSAgICB7Ci0gICAgICAvKiBBIHN0YWIuICAqLwotICAgICAgcHJpbnRmICgiICIpOwotICAgICAgcHJpbnRmIChvdGhlcl9mb3JtYXQsIGluZm8tPnN0YWJfb3RoZXIpOwotICAgICAgcHJpbnRmICgiICIpOwotICAgICAgcHJpbnRmIChkZXNjX2Zvcm1hdCwgaW5mby0+c3RhYl9kZXNjKTsKLSAgICAgIHByaW50ZiAoIiAlNXMiLCBpbmZvLT5zdGFiX25hbWUpOwotICAgIH0KLSAgcHJpbnRfc3ltbmFtZSAoIiAlcyIsIGluZm8tPm5hbWUsIGFiZmQpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3ltYm9sX2luZm9fc3lzdiAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfc3ltbmFtZSAoIiUtMjBzfCIsIGluZm8tPm5hbWUsIGFiZmQpOwkvKiBOYW1lICovCi0gIGlmIChpbmZvLT50eXBlID09ICdVJykKLSAgICBwcmludGYgKCIgICAgICAgICIpOwkvKiBWYWx1ZSAqLwotICBlbHNlCi0gICAgcHJpbnRfdmFsdWUgKGluZm8tPnZhbHVlKTsKLSAgcHJpbnRmICgifCAgICVjICB8IiwgaW5mby0+dHlwZSk7CS8qIENsYXNzICovCi0gIGlmIChpbmZvLT50eXBlID09ICctJykKLSAgICB7Ci0gICAgICAvKiBBIHN0YWIuICAqLwotICAgICAgcHJpbnRmICgiJTE4c3wgICIsIGluZm8tPnN0YWJfbmFtZSk7CS8qIChDKSBUeXBlICovCi0gICAgICBwcmludGYgKGRlc2NfZm9ybWF0LCBpbmZvLT5zdGFiX2Rlc2MpOwkvKiBTaXplICovCi0gICAgICBwcmludGYgKCJ8ICAgICB8Iik7CS8qIExpbmUsIFNlY3Rpb24gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICBwcmludGYgKCIgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgICAgfCIpOwkvKiBUeXBlLCBTaXplLCBMaW5lLCBTZWN0aW9uICovCi19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9zeW1ib2xfaW5mb19wb3NpeCAoaW5mbywgYWJmZCkKLSAgICAgc3ltYm9sX2luZm8gKmluZm87Ci0gICAgIGJmZCAqYWJmZDsKLXsKLSAgcHJpbnRfc3ltbmFtZSAoIiVzICIsIGluZm8tPm5hbWUsIGFiZmQpOwotICBwcmludGYgKCIlYyAiLCBpbmZvLT50eXBlKTsKLSAgaWYgKGluZm8tPnR5cGUgPT0gJ1UnKQotICAgIHByaW50ZiAoIiAgICAgICAgIik7Ci0gIGVsc2UKLSAgICBwcmludF92YWx1ZSAoaW5mby0+dmFsdWUpOwotICAvKiBQT1NJWC4yIHdhbnRzIHRoZSBzeW1ib2wgc2l6ZSBwcmludGVkIGhlcmUsIHdoZW4gYXBwbGljYWJsZTsKLSAgICAgQkZEIGN1cnJlbnRseSBkb2Vzbid0IHByb3ZpZGUgaXQsIHNvIHdlIHRha2UgdGhlIGVhc3kgd2F5IG91dCBieQotICAgICBjb25zaWRlcmluZyBpdCB0byBuZXZlciBiZSBhcHBsaWNhYmxlLiAgKi8KLX0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9zeW1kZWZfZW50cnkgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgc3ltaW5kZXggaWR4ID0gQkZEX05PX01PUkVfU1lNQk9MUzsKLSAgY2Fyc3ltICp0aGVzeW07Ci0gIGJvb2xlYW4gZXZlcnByaW50ZWQgPSBmYWxzZTsKLQotICBmb3IgKGlkeCA9IGJmZF9nZXRfbmV4dF9tYXBlbnQgKGFiZmQsIGlkeCwgJnRoZXN5bSk7Ci0gICAgICAgaWR4ICE9IEJGRF9OT19NT1JFX1NZTUJPTFM7Ci0gICAgICAgaWR4ID0gYmZkX2dldF9uZXh0X21hcGVudCAoYWJmZCwgaWR4LCAmdGhlc3ltKSkKLSAgICB7Ci0gICAgICBiZmQgKmVsdDsKLSAgICAgIGlmICghZXZlcnByaW50ZWQpCi0JewotCSAgcHJpbnRmIChfKCJcbkFyY2hpdmUgaW5kZXg6XG4iKSk7Ci0JICBldmVycHJpbnRlZCA9IHRydWU7Ci0JfQotICAgICAgZWx0ID0gYmZkX2dldF9lbHRfYXRfaW5kZXggKGFiZmQsIGlkeCk7Ci0gICAgICBpZiAoZWx0ID09IE5VTEwpCi0JYmZkX2ZhdGFsICgiYmZkX2dldF9lbHRfYXRfaW5kZXgiKTsKLSAgICAgIGlmICh0aGVzeW0tPm5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLQl7Ci0JICBwcmludF9zeW1uYW1lICgiJXMiLCB0aGVzeW0tPm5hbWUsIGFiZmQpOwotCSAgcHJpbnRmICgiIGluICVzXG4iLCBiZmRfZ2V0X2ZpbGVuYW1lIChlbHQpKTsKLQl9Ci0gICAgfQotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgcmVsb2NzIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbi4KLSAgIEl0IGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9yZWxvY3MgKGFiZmQsIHNlYywgZGF0YWFyZykKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgZGF0YWFyZzsKLXsKLSAgc3RydWN0IGdldF9yZWxvY3NfaW5mbyAqZGF0YSA9IChzdHJ1Y3QgZ2V0X3JlbG9jc19pbmZvICopIGRhdGFhcmc7Ci0KLSAgKmRhdGEtPnNlY3MgPSBzZWM7Ci0KLSAgaWYgKChzZWMtPmZsYWdzICYgU0VDX1JFTE9DKSA9PSAwKQotICAgIHsKLSAgICAgICpkYXRhLT5yZWxvY3MgPSBOVUxMOwotICAgICAgKmRhdGEtPnJlbGNvdW50ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIHJlbHNpemU7Ci0KLSAgICAgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICAqZGF0YS0+cmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotICAgICAgKmRhdGEtPnJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCAqZGF0YS0+cmVsb2NzLAotCQkJCQkJZGF0YS0+c3ltcyk7Ci0gICAgICBpZiAoKmRhdGEtPnJlbGNvdW50IDwgMCkKLQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICB9Ci0KLSAgKytkYXRhLT5zZWNzOwotICArK2RhdGEtPnJlbG9jczsKLSAgKytkYXRhLT5yZWxjb3VudDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1yYW5saWIuYyBiL2JpbnV0aWxzL25vdC1yYW5saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiOWNlYi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9ub3QtcmFubGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIGFyLm8gdG8gZmxhZyB0aGF0IHRoaXMgcHJvZ3JhbSBpcyAnYXInIChub3QgJ3JhbmxpYicpLiAqLwotCi1pbnQgaXNfcmFubGliID0gMDsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL25vdC1zdHJpcC5jIGIvYmludXRpbHMvbm90LXN0cmlwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDkzY2UuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvbm90LXN0cmlwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIExpbmtlZCB3aXRoIG9iamNvcHkubyB0byBmbGFnIHRoYXQgdGhpcyBwcm9ncmFtIGlzICdvYmpjb3B5JyAobm90Ci0gICAnc3RyaXAnKS4gKi8KLQotaW50IGlzX3N0cmlwID0gMDsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamNvcHkuMSBiL2JpbnV0aWxzL29iamNvcHkuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhiOThkMy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpjb3B5LjEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG9iamNvcHkgMSAiT2N0b2JlciAxOTk0IiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotb2JqY29weSBcLSBjb3B5IGFuZCB0cmFuc2xhdGUgb2JqZWN0IGZpbGVzCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBvYmpjb3B5Ci0uUkIgIltcfCIgXC1GXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtT1wgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLW91dHB1dFwtdGFyZ2V0PVxmSWJmZG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1qXCBcZklzZWN0aW9ubmFtZVxmUlwgfFwgXGZCXC1cLW9ubHlcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVJcIFxmSXNlY3Rpb25uYW1lXGZSXCB8XCBcZkJcLVwtcmVtb3ZlXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLVwtc3RyaXBcLWFsbFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWdcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXN0cmlwXC11bm5lZWRlZFxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLUtcIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1rZWVwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZVxmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLU5cIFxmSXN5bWJvbG5hbWVcZlJcIHxcIFxmQlwtXC1zdHJpcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1MXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtbG9jYWxpemVcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iIAotLlJCICJbXHwiIFwtV1wgXGZJc3ltYm9sbmFtZVxmUlwgfFwgXGZCXC1cLXdlYWtlblwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsXGZSICJcfF0iIAotLlJCICJbXHwiIFwtWFxmUlwgfFwgXGZCXC1cLWRpc2NhcmRcLWxvY2Fsc1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLWJcIFxmSWJ5dGVcZlJcIHxcIFxmQlwtXC1ieXRlPVxmSWJ5dGVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1pXCBcZklpbnRlcmxlYXZlXGZSXCB8XCBcZkJcLVwtaW50ZXJsZWF2ZT1cZklpbnRlcmxlYXZlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlc1xmUiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGVidWdnaW5nICJcfF0iCi0uUkIgIltcfCIgXC1cLWdhcFwtZmlsbD1cZkl2YWxcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtcGFkXC10bz1cZklhZGRyZXNzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXNldFwtc3RhcnQ9XGZJdmFsXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc3RhcnQ9XGZJaW5jclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLWFkZHJlc3Nlcz1cZklpbmNyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLWNoYW5nZVwtc2VjdGlvblwtYWRkcmVzcz1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLWxtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbFxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXNldFwtc2VjdGlvblwtZmxhZ3M9XGZJc2VjdGlvbj1mbGFnc1xmUiAiXHxdIgotLlJCICJbXHwiIFwtXC1hZGRcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWU9ZmlsZW5hbWVcZlIgIlx8XSIKLS5SQiAiW1x8IiBcLVwtY2hhbmdlXC1sZWFkaW5nXC1jaGFyXGZSICJcfF0iCi0uUkIgIltcfCIgXC1cLXJlbW92ZVwtbGVhZGluZ1wtY2hhclxmUiAiXHxdIgotLlJCICJbXHwiIFwtXC13ZWFrZW5cZlIgIlx8XSIKLS5SQiAiW1x8IiBcLXZcIHxcIFwtXC12ZXJib3NlXGZSICJcfF0iIAotLlJCICJbXHwiIFwtVlwgfFwgXC1cLXZlcnNpb25cZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1cLWhlbHBcZlIgIlx8XSIgCi0uQiBpbmZpbGUKLS5SQiAiW1x8IiBvdXRmaWxlXGZSICJcfF0iIAotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIAotLkIgb2JqY29weQotdXRpbGl0eSBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIG9iamVjdCBmaWxlIHRvIGFub3RoZXIuICAKLS5CIG9iamNvcHkgCi11c2VzIHRoZSBHTlUgQkZEIExpYnJhcnkgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIG9iamVjdCBmaWxlcy4gIEl0IGNhbgotd3JpdGUgdGhlIGRlc3RpbmF0aW9uIG9iamVjdCBmaWxlIGluIGEgZm9ybWF0IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YKLXRoZSBzb3VyY2Ugb2JqZWN0IGZpbGUuICBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgCi0uQiBvYmpjb3B5Ci1pcyBjb250cm9sbGVkIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zLgotLlBQCi0uQiBvYmpjb3B5Ci1jcmVhdGVzIHRlbXBvcmFyeSBmaWxlcyB0byBkbyBpdHMgdHJhbnNsYXRpb25zIGFuZCBkZWxldGVzIHRoZW0KLWFmdGVyd2FyZC4KLS5CIG9iamNvcHkKLXVzZXMgQkZEIHRvIGRvIGFsbCBpdHMgdHJhbnNsYXRpb24gd29yazsgaXQga25vd3MgYWJvdXQgYWxsIHRoZQotZm9ybWF0cyBCRkQga25vd3MgYWJvdXQsIGFuZCB0aHVzIGlzIGFibGUgdG8gcmVjb2duaXplIG1vc3QgZm9ybWF0cwotd2l0aG91dCBiZWluZyB0b2xkIGV4cGxpY2l0bHkuCi0uUFAKLS5CIG9iamNvcHkKLWNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFMtcmVjb3JkcyBieSB1c2luZyBhbiBvdXRwdXQgdGFyZ2V0IG9mCi0uQiBzcmVjCi0oZS5nLiwgdXNlCi0uQiAtTyBzcmVjKS4KLS5QUAotLkIgb2JqY29weQotY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSByYXcgYmluYXJ5IGZpbGUgYnkgdXNpbmcgYW4gb3V0cHV0IHRhcmdldCBvZgotLkIgYmluYXJ5Ci0oZS5nLiwgdXNlCi0uQiAtTyBiaW5hcnkpLgotV2hlbgotLkIgb2JqY29weQotZ2VuZXJhdGVzIGEgcmF3IGJpbmFyeSBmaWxlLCBpdCB3aWxsIGVzc2VudGlhbGx5IHByb2R1Y2UgYSBtZW1vcnkgZHVtcAotb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBvYmplY3QgZmlsZS4gIEFsbCBzeW1ib2xzIGFuZCByZWxvY2F0aW9uCi1pbmZvcm1hdGlvbiB3aWxsIGJlIGRpc2NhcmRlZC4gIFRoZSBtZW1vcnkgZHVtcCB3aWxsIHN0YXJ0IGF0IHRoZQotdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBsb3dlc3Qgc2VjdGlvbiBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuCi0uUFAKLVdoZW4gZ2VuZXJhdGluZyBhbiBTLXJlY29yZCBvciBhIHJhdyBiaW5hcnkgZmlsZSwgaXQgbWF5IGJlIGhlbHBmdWwgdG8KLXVzZQotLkIgLVMKLXRvIHJlbW92ZSBzZWN0aW9ucyBjb250YWluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIEluIHNvbWUgY2FzZXMKLS5CIC1SCi13aWxsIGJlIHVzZWZ1bCB0byByZW1vdmUgc2VjdGlvbnMgd2hpY2ggY29udGFpbiBpbmZvcm1hdGlvbiB3aGljaCBpcwotbm90IG5lZWRlZCBieSB0aGUgYmluYXJ5IGZpbGUuCi0uUFAKLS5JIGluZmlsZQotYW5kCi0uSSBvdXRmaWxlCi1hcmUgdGhlIHNvdXJjZSBhbmQgb3V0cHV0IGZpbGVzIHJlc3BlY3RpdmVseS4gIElmIHlvdSBkbyBub3Qgc3BlY2lmeQotLklSIG91dGZpbGUgLAotLkIgb2JqY29weQotY3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGFuZCBkZXN0cnVjdGl2ZWx5IHJlbmFtZXMgdGhlIHJlc3VsdCB3aXRoIHRoZQotbmFtZSBvZiB0aGUgaW5wdXQgZmlsZS4KLQotLlNIIE9QVElPTlMKLS5UUAotLkIgXC1JIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUKLUNvbnNpZGVyIHRoZSBzb3VyY2UgZmlsZSdzIG9iamVjdCBmb3JtYXQgdG8gYmUgCi0uSVIgYmZkbmFtZSAsCi1yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZHVjZSBpdC4KLS5UUAotLkIgXC1PIFxmSWJmZG5hbWVcZlIsIFxmQlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lCi1Xcml0ZSB0aGUgb3V0cHV0IGZpbGUgdXNpbmcgdGhlIG9iamVjdCBmb3JtYXQgCi0uSVIgYmZkbmFtZSAuCi0uVFAKLS5CIFwtRiBcZkliZmRuYW1lXGZSLCBcZkJcLVwtdGFyZ2V0PVxmSWJmZG5hbWUKLVVzZSAKLS5JIGJmZG5hbWUKLWFzIHRoZSBvYmplY3QgZm9ybWF0IGZvciBib3RoIHRoZSBpbnB1dCBhbmQgdGhlIG91dHB1dCBmaWxlOyBpLmUuCi1zaW1wbHkgdHJhbnNmZXIgZGF0YSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiB3aXRoIG5vIHRyYW5zbGF0aW9uLgotLlRQCi0uQiBcLWogXGZJc2VjdGlvbm5hbWVcZlIsIFxmQlwtXC1vbmx5XC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lCi1Db3B5IG9ubHkgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgaW5wdXQgZmlsZSB0byB0aGUgb3V0cHV0IGZpbGUsCi1kaXNjYXJkaW5nIGFsbCBvdGhlciBzZWN0aW9ucy4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlIHRoYW4KLW9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZSBvdXRwdXQKLWZpbGUgdW51c2FibGUuCi0uVFAKLS5CIFwtUiBcZklzZWN0aW9ubmFtZVxmUiwgXGZCXC1cLXJlbW92ZS1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lCi1SZW1vdmUgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlCi10aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZQotb3V0cHV0IGZpbGUgdW51c2FibGUuCi0uVFAKLS5CIFwtU1xmUiwgXGZCXC1cLXN0cmlwXC1hbGwKLURvIG5vdCBjb3B5IHJlbG9jYXRpb24gYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1nXGZSLCBcZkJcLVwtc3RyaXBcLWRlYnVnCi1EbyBub3QgY29weSBkZWJ1Z2dpbmcgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1cLXN0cmlwXC11bm5lZWRlZAotU3RyaXAgYWxsIHN5bWJvbHMgdGhhdCBhcmUgbm90IG5lZWRlZCBmb3IgcmVsb2NhdGlvbiBwcm9jZXNzaW5nLgotLlRQCi0uQiBcLUsgXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLWtlZXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1Db3B5IG9ubHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwtTiBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lCi1EbyBub3QgY29weSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLS5UUAotLkIgXC1MIFxmSXN5bWJvbG5hbWVcZlIsIFxmQlwtXC1sb2NhbGl6ZVwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLU1ha2Ugc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgbG9jYWwgdG8gdGhlIGZpbGUsIHNvIHRoYXQgaXQgaXMgbm90Ci12aXNpYmxlIGV4dGVybmFsbHkuICBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwtVyBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwtd2Vha2VuXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotTWFrZSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCB3ZWFrLiBUaGlzIG9wdGlvbiBtYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UuCi0uVFAKLS5CIFwteFxmUiwgXGZCIFwtXC1kaXNjYXJkXC1hbGwKLURvIG5vdCBjb3B5IG5vbi1nbG9iYWwgc3ltYm9scyBmcm9tIHRoZSBzb3VyY2UgZmlsZS4KLS5UUAotLkIgXC1YXGZSLCBcZkJcLVwtZGlzY2FyZFwtbG9jYWxzCi1EbyBub3QgY29weSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4gKFRoZXNlIHVzdWFsbHkgc3RhcnQKLXdpdGggIkwiIG9yICIuIikuCi0uVFAKLS5CIFwtYiBcZklieXRlXGZSLCBcZkJcLVwtYnl0ZT1cZklieXRlCi1LZWVwIG9ubHkgZXZlcnkgXGZJYnl0ZVxmUHRoIGJ5dGUgb2YgdGhlIGlucHV0IGZpbGUgKGhlYWRlciBkYXRhIGlzCi1ub3QgYWZmZWN0ZWQpLiAgXGZJYnl0ZVxmUCBjYW4gYmUgaW4gdGhlIHJhbmdlIGZyb20gMCB0byB0aGUKLWludGVybGVhdmUtMS4gIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcgZmlsZXMgdG8gcHJvZ3JhbQotUk9Ncy4gIEl0IGlzIHR5cGljYWxseSB1c2VkIHdpdGggYW4gc3JlYyBvdXRwdXQgdGFyZ2V0LgotLlRQCi0uQiBcLWkgXGZJaW50ZXJsZWF2ZVxmUiwgXGZCXC1cLWludGVybGVhdmU9XGZJaW50ZXJsZWF2ZQotT25seSBjb3B5IG9uZSBvdXQgb2YgZXZlcnkgXGZJaW50ZXJsZWF2ZVxmUCBieXRlcy4gIFdoaWNoIG9uZSB0byBjb3B5IGlzCi1zZWxlY3RlZCBieSB0aGUgXGZCXC1iXGZQIG9yIFxmQlwtXC1ieXRlXGZQIG9wdGlvbi4gIFRoZSBkZWZhdWx0IGlzIDQuCi1UaGUgaW50ZXJsZWF2ZSBpcyBpZ25vcmVkIGlmIG5laXRoZXIgXGZCXC1iXGZQIG5vciBcZkJcLVwtYnl0ZVxmUCBpcyBnaXZlbi4KLS5UUAotLkIgXC1wXGZSLCBcZkJcLVwtcHJlc2VydmVcLWRhdGVzCi1TZXQgdGhlIGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIGRhdGVzIG9mIHRoZSBvdXRwdXQgZmlsZSB0byBiZSB0aGUgc2FtZQotYXMgdGhvc2Ugb2YgdGhlIGlucHV0IGZpbGUuCi0uVFAKLS5CIFwtXC1kZWJ1Z2dpbmcKLUNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpZiBwb3NzaWJsZS4gIFRoaXMgaXMgbm90IHRoZSBkZWZhdWx0Ci1iZWNhdXNlIG9ubHkgY2VydGFpbiBkZWJ1Z2dpbmcgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlCi1jb252ZXJzaW9uIHByb2Nlc3MgY2FuIGJlIHRpbWUgY29uc3VtaW5nLgotLlRQCi0uQiBcLVwtZ2FwXC1maWxsPVxmSXZhbAotRmlsbCBnYXBzIGJldHdlZW4gc2VjdGlvbnMgd2l0aCBcZkl2YWxcZlAuICBUaGlzIG9wZXJhdGlvbiBhcHBsaWVzIHRvCi10aGUgXGZJbG9hZCBhZGRyZXNzXGZQIChMTUEpIG9mIHRoZSBzZWN0aW9ucy4gIEl0IGlzIGRvbmUgYnkgaW5jcmVhc2luZwotdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gd2l0aCB0aGUgbG93ZXIgYWRkcmVzcywgYW5kIGZpbGxpbmcgaW4gdGhlIGV4dHJhCi1zcGFjZSBjcmVhdGVkIHdpdGggXGZJdmFsXGZQLgotLlRQCi0uQiBcLVwtcGFkXC10bz1cZklhZGRyZXNzCi1QYWQgdGhlIG91dHB1dCBmaWxlIHVwIHRvIHRoZSBsb2FkIGFkZHJlc3MgXGZJYWRkcmVzc1xmUC4gIFRoaXMgaXMKLWRvbmUgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBzZWN0aW9uLiAgVGhlIGV4dHJhIHNwYWNlIGlzCi1maWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IFxmQlwtXC1nYXBcLWZpbGxcZlAgKGRlZmF1bHQKLXplcm8pLgotLlRQCi0uQiBcZkJcLVwtc2V0XC1zdGFydD1cZkl2YWwKLVNldCB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV3IGZpbGUgdG8gXGZJdmFsXGZQLiAgTm90IGFsbCBvYmplY3QKLWZpbGUgZm9ybWF0cyBzdXBwb3J0IHNldHRpbmcgdGhlIHN0YXJ0IGFkZHJlc3MuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXN0YXJ0PVxmSWluY3JcZlIsIFxmQlwtXC1hZGp1c3RcLXN0YXJ0PVxmSWluY3IKLUNoYW5nZXMgdGhlIHN0YXJ0IGFkZHJlc3MgYnkgYWRkaW5nIFxmSWluY3JcZlAuICBOb3QgYWxsIG9iamVjdCBmaWxlCi1mb3JtYXRzIHN1cHBvcnQgc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcy4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzPVxmSWluY3JcZlIsIFxmQlwtXC1hZGp1c3RcLXZtYT1cZklpbmNyCi1DaGFuZ2VzIHRoZSBhZGRyZXNzIG9mIGFsbCBzZWN0aW9ucywgYXMgd2VsbCBhcyB0aGUgc3RhcnQgYWRkcmVzcywgYnkKLWFkZGluZyBcZklpbmNyXGZQLiAgU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIGRvIG5vdCBwZXJtaXQgc2VjdGlvbgotYWRkcmVzc2VzIHRvIGJlIGNoYW5nZWQgYXJiaXRyYXJpbHkuICBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCByZWxvY2F0ZQotdGhlIHNlY3Rpb25zOyBpZiB0aGUgcHJvZ3JhbSBleHBlY3RzIHNlY3Rpb25zIHRvIGJlIGxvYWRlZCBhdCBhCi1jZXJ0YWluIGFkZHJlc3MsIGFuZCB0aGlzIG9wdGlvbiBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgc2VjdGlvbnMgc3VjaAotdGhhdCB0aGV5IGFyZSBsb2FkZWQgYXQgYSBkaWZmZXJlbnQgYWRkcmVzcywgdGhlIHByb2dyYW0gbWF5IGZhaWwuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLWFkZHJlc3M9XGZJc2VjdGlvbns9LCssLX12YWxcZlIsIFxmQlwtXC1hZGp1c3RcLXNlY3Rpb25cLXZtYT1cZklzZWN0aW9uez0sKywtfXZhbAotU2V0IG9yIGNoYW5nZXMgdGhlIFZNQSBhbmQgTE1BIGFkZHJlc3NlcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4KLUlmIFxmST1cZlAgaXMgdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8gXGZJdmFsXGZQLgotT3RoZXJ3aXNlLCBcZkl2YWxcZlAgaXMgYWRkZWQgdG8gb3Igc3VidHJhY3RlZCBmcm9tIHRoZSBzZWN0aW9uCi1hZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cyB1bmRlciBcZkJcLVwtY2hhbmdlXC1hZGRyZXNzZXNcZlAsIGFib3ZlLiAgSWYKLVxmSXNlY3Rpb25cZlAgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGlucHV0IGZpbGUsIGEgd2FybmluZyB3aWxsIGJlCi1pc3N1ZWQsIHVubGVzcyBcZkJcLVwtbm9cLWNoYW5nZVwtd2FybmluZ3NcZlAgaXMgdXNlZC4KLS5UUAotLkIgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtbG1hPVxmSXNlY3Rpb257PSwrLC19dmFsCi1TZXQgb3IgY2hhbmdlIHRoZSBMTUEgYWRkcmVzcyBvZiB0aGUgbmFtZWQgXGZJc2VjdGlvblxmUC4gIElmIFxmST1cZlAgaXMKLXVzZWQsIHRoZSBzZWN0aW9uIGFkZHJlc3MgaXMgc2V0IHRvIFxmSXZhbFxmUC4gIE90aGVyd2lzZSwgXGZJdmFsXGZQCi1pcyBhZGRlZCB0byBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHNlY3Rpb24gYWRkcmVzcy4gIFNlZSB0aGUgY29tbWVudHMKLXVuZGVyIFxmQlwtXC1jaGFuZ2VcLWFkZHJlc3Nlc1xmUCwgYWJvdmUuICBJZiBcZklzZWN0aW9uXGZQIGRvZXMgbm90IGV4aXN0Ci1pbiB0aGUgaW5wdXQgZmlsZSwgYSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkLCB1bmxlc3MKLVxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUCBpcyB1c2VkLgotLlRQCi0uQiBcZkJcLVwtY2hhbmdlXC1zZWN0aW9uXC12bWE9XGZJc2VjdGlvbns9LCssLX12YWwKLVNldCBvciBjaGFuZ2UgdGhlIFZNQSBhZGRyZXNzIG9mIHRoZSBuYW1lZCBcZklzZWN0aW9uXGZQLiAgSWYgXGZJPVxmUCBpcwotdXNlZCwgdGhlIHNlY3Rpb24gYWRkcmVzcyBpcyBzZXQgdG8gXGZJdmFsXGZQLiAgT3RoZXJ3aXNlLCBcZkl2YWxcZlAKLWlzIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSB0aGUgc2VjdGlvbiBhZGRyZXNzLiAgU2VlIHRoZSBjb21tZW50cwotdW5kZXIgXGZCXC1cLWNoYW5nZVwtYWRkcmVzc2VzXGZQLCBhYm92ZS4gIElmIFxmSXNlY3Rpb25cZlAgZG9lcyBub3QgZXhpc3QKLWluIHRoZSBpbnB1dCBmaWxlLCBhIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQsIHVubGVzcwotXGZCXC1cLW5vXC1jaGFuZ2VcLXdhcm5pbmdzXGZQIGlzIHVzZWQuCi0uVFAKLS5CIFxmQlwtXC1jaGFuZ2VcLXdhcm5pbmdzXGZSLCBcZkJcLVwtYWRqdXN0XC13YXJuaW5ncwotSWYgXGZCXC1cLWNoYW5nZVwtc2VjdGlvblwtWFhYXGZQIGlzIHVzZWQsIGFuZCB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzCi1ub3QgZXhpc3QsIGlzc3VlIGEgd2FybmluZy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0uVFAKLS5CIFxmQlwtXC1ub1wtY2hhbmdlXC13YXJuaW5nc1xmUiwgXGZCXC1cLW5vXC1hZGp1c3RcLXdhcm5pbmdzCi1EbyBub3QgaXNzdWUgYSB3YXJuaW5nIGlmIFxmQlwtXC1jaGFuZ2VcLXNlY3Rpb25cLVhYWFxmUCBpcyB1c2VkLCBldmVuCi1pZiB0aGUgbmFtZWQgc2VjdGlvbiBkb2VzIG5vdCBleGlzdC4KLS5UUAotLkIgXGZCXC1cLXNldFwtc2VjdGlvblwtZmxhZ3M9XGZJc2VjdGlvbj1mbGFncwotU2V0IHRoZSBmbGFncyBmb3IgdGhlIG5hbWVkIHNlY3Rpb24uICBUaGUgXGZJZmxhZ3NcZlAgYXJndW1lbnQgaXMgYQotY29tbWEgc2VwYXJhdGVkIHN0cmluZyBvZiBmbGFnIG5hbWVzLiAgVGhlIHJlY29nbml6ZWQgbmFtZXMgYXJlCi1cZklhbGxvY1xmUCwgXGZJbG9hZFxmUCwgXGZJcmVhZG9ubHlcZlAsIFxmSWNvZGVcZlAsIFxmSWRhdGFcZlAsIGFuZAotXGZJcm9tXGZQLiAgTm90IGFsbCBmbGFncyBhcmUgbWVhbmluZ2Z1bCBmb3IgYWxsIG9iamVjdCBmaWxlCi1mb3JtYXRzLgotLlRQCi0uQiBcZkJcLVwtYWRkXC1zZWN0aW9uPVxmSXNlY3Rpb25uYW1lPWZpbGVuYW1lCi1BZGQgYSBuZXcgc2VjdGlvbiBuYW1lZCBcZklzZWN0aW9ubmFtZVxmUiB3aGlsZSBjb3B5aW5nIHRoZSBmaWxlLiAgVGhlCi1jb250ZW50cyBvZiB0aGUgbmV3IHNlY3Rpb24gYXJlIHRha2VuIGZyb20gdGhlIGZpbGUgXGZJZmlsZW5hbWVcZlIuCi1UaGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBmaWxlLiAgVGhpcyBvcHRpb24KLW9ubHkgd29ya3Mgb24gZmlsZSBmb3JtYXRzIHdoaWNoIGNhbiBzdXBwb3J0IHNlY3Rpb25zIHdpdGggYXJiaXRyYXJ5Ci1uYW1lcy4KLS5UUAotLkIgXC1cLWNoYW5nZVwtbGVhZGluZ1wtY2hhcgotU29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mCi1zeW1ib2xzLiAgVGhlIG1vc3QgY29tbW9uIHN1Y2ggY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUsIHdoaWNoIGNvbXBpbGVycwotb2Z0ZW4gYWRkIGJlZm9yZSBldmVyeSBzeW1ib2wuICBUaGlzIG9wdGlvbiB0ZWxscyAKLS5CIG9iamNvcHkKLXRvIGNoYW5nZSB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgb2YgZXZlcnkgc3ltYm9sIHdoZW4gaXQgY29udmVydHMKLWJldHdlZW4gb2JqZWN0IGZpbGUgZm9ybWF0cy4gIElmIHRoZSBvYmplY3QgZmlsZSBmb3JtYXRzIHVzZSB0aGUgc2FtZQotbGVhZGluZyBjaGFyYWN0ZXIsIHRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QuICBPdGhlcndpc2UsIGl0IHdpbGwgYWRkCi1hIGNoYXJhY3Rlciwgb3IgcmVtb3ZlIGEgY2hhcmFjdGVyLCBvciBjaGFuZ2UgYSBjaGFyYWN0ZXIsIGFzCi1hcHByb3ByaWF0ZS4KLS5UUAotLkIgXC1cLXJlbW92ZVwtbGVhZGluZ1wtY2hhcgotSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGdsb2JhbCBzeW1ib2wgaXMgYSBzcGVjaWFsIHN5bWJvbCBsZWFkaW5nCi1jaGFyYWN0ZXIgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCByZW1vdmUgdGhlIGNoYXJhY3Rlci4gIFRoZQotbW9zdCBjb21tb24gc3ltYm9sIGxlYWRpbmcgY2hhcmFjdGVyIGlzIHVuZGVyc2NvcmUuICBUaGlzIG9wdGlvbiB3aWxsCi1yZW1vdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSBhbGwgZ2xvYmFsIHN5bWJvbHMuICBUaGlzIGNhbiBiZQotdXNlZnVsIGlmIHlvdSB3YW50IHRvIGxpbmsgdG9nZXRoZXIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgZmlsZSBmb3JtYXRzCi13aXRoIGRpZmZlcmVudCBjb252ZW50aW9ucyBmb3Igc3ltYm9sIG5hbWVzLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotXGZCXC1cLWNoYW5nZVwtbGVhZGluZ1wtY2hhclxmUCBiZWNhdXNlIGl0IGFsd2F5cyBjaGFuZ2VzIHRoZSBzeW1ib2wgbmFtZQotd2hlbiBhcHByb3ByaWF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQKLS5UUAotLkIgXC1cLXdlYWtlbgotQ2hhbmdlIGFsbCBnbG9iYWwgc3ltYm9scyBpbiB0aGUgZmlsZSB0byBiZSB3ZWFrLgotLlRQCi0uQiBcLXZcZlIsIFxmQlwtXC12ZXJib3NlCi1WZXJib3NlIG91dHB1dDogbGlzdCBhbGwgb2JqZWN0IGZpbGVzIG1vZGlmaWVkLiAgSW4gdGhlIGNhc2Ugb2YKLWFyY2hpdmVzLCAiXGZCb2JqY29weSBcLVZcZlIiIGxpc3RzIGFsbCBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlLgotLlRQCi0uQiBcLVZcZlIsIFxmQlwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgb2JqY29weQotYW5kIGV4aXQuCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiB0aGUgb3B0aW9ucyB0bwotLkIgb2JqY29weQotYW5kIGV4aXQuCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciIAotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzXGMKLVwmLCBSb2xhbmQgSC4gUGVzY2ggKEp1bmUgMTk5MykuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvb2JqY29weS5jIGIvYmludXRpbHMvb2JqY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2JkOTk2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL29iamNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDIwNjcgKzAsMCBAQAotLyogb2JqY29weS5jIC0tIGNvcHkgb2JqZWN0IGZpbGUgZnJvbSBpbnB1dCB0byBvdXRwdXQsIG9wdGlvbmFsbHkgbWFzc2FnaW5nIGl0LgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0MCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJidWRiZy5oIgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLS8qIEEgbGlzdCBvZiBzeW1ib2xzIHRvIGV4cGxpY2l0bHkgc3RyaXAgb3V0LCBvciB0byBrZWVwLiAgQSBsaW5rZWQKLSAgIGxpc3QgaXMgZ29vZCBlbm91Z2ggZm9yIGEgc21hbGwgbnVtYmVyIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgYnV0Ci0gICB0aGlzIHdpbGwgc2xvdyB0aGluZ3MgZG93biBhIGxvdCBpZiBtYW55IHN5bWJvbHMgYXJlIGJlaW5nCi0gICBkZWxldGVkLiAqLwotCi1zdHJ1Y3Qgc3ltbGlzdAotewotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3Qgc3ltbGlzdCAqbmV4dDsKLX07Ci0KLXN0YXRpYyB2b2lkIGNvcHlfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHN0cmlwX3VzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgZmxhZ3dvcmQgcGFyc2VfZmxhZ3MgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbGlzdCAqZmluZF9zZWN0aW9uX2xpc3QgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBzZXR1cF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNvcHlfc2VjdGlvbiBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBnZXRfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIGludCBjb21wYXJlX3NlY3Rpb25fbG1hIFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBhZGRfc3BlY2lmaWNfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IHN5bWxpc3QgKiopKTsKLXN0YXRpYyBib29sZWFuIGlzX3NwZWNpZmllZF9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3ltbGlzdCAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBpc19zdHJpcF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGZpbHRlcl9zeW1ib2xzCi0gIFBBUkFNUyAoKGJmZCAqLCBiZmQgKiwgYXN5bWJvbCAqKiwgYXN5bWJvbCAqKiwgbG9uZykpOwotc3RhdGljIHZvaWQgbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgZmlsdGVyX2J5dGVzIFBBUkFNUyAoKGNoYXIgKiwgYmZkX3NpemVfdHlwZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiB3cml0ZV9kZWJ1Z2dpbmdfaW5mbyBQQVJBTVMgKChiZmQgKiwgUFRSLCBsb25nICosIGFzeW1ib2wgKioqKSk7Ci1zdGF0aWMgdm9pZCBjb3B5X29iamVjdCBQQVJBTVMgKChiZmQgKiwgYmZkICopKTsKLXN0YXRpYyB2b2lkIGNvcHlfYXJjaGl2ZSBQQVJBTVMgKChiZmQgKiwgYmZkICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgY29weV9maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBzdHJpcF9tYWluIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIGludCBjb3B5X21haW4gUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci0KLSNkZWZpbmUgUkVUVVJOX05PTkZBVEFMKHMpIHtiZmRfbm9uZmF0YWwgKHMpOyBzdGF0dXMgPSAxOyByZXR1cm47fQotCi1zdGF0aWMgYXN5bWJvbCAqKmlzeW1wcCA9IE5VTEw7CS8qIElucHV0IHN5bWJvbHMgKi8KLXN0YXRpYyBhc3ltYm9sICoqb3N5bXBwID0gTlVMTDsJLyogT3V0cHV0IHN5bWJvbHMgdGhhdCBzdXJ2aXZlIHN0cmlwcGluZyAqLwotCi0vKiBJZiBgY29weV9ieXRlJyA+PSAwLCBjb3B5IG9ubHkgdGhhdCBieXRlIG9mIGV2ZXJ5IGBpbnRlcmxlYXZlJyBieXRlcy4gICovCi1zdGF0aWMgaW50IGNvcHlfYnl0ZSA9IC0xOwotc3RhdGljIGludCBpbnRlcmxlYXZlID0gNDsKLQotc3RhdGljIGJvb2xlYW4gdmVyYm9zZTsJCS8qIFByaW50IGZpbGUgYW5kIHRhcmdldCBuYW1lcy4gKi8KLXN0YXRpYyBib29sZWFuIHByZXNlcnZlX2RhdGVzOwkvKiBQcmVzZXJ2ZSBpbnB1dCBmaWxlIHRpbWVzdGFtcC4gICovCi1zdGF0aWMgaW50IHN0YXR1cyA9IDA7CQkvKiBFeGl0IHN0YXR1cy4gICovCi0KLWVudW0gc3RyaXBfYWN0aW9uCi0gIHsKLSAgICBTVFJJUF9VTkRFRiwKLSAgICBTVFJJUF9OT05FLAkJCS8qIGRvbid0IHN0cmlwICovCi0gICAgU1RSSVBfREVCVUcsCQkvKiBzdHJpcCBhbGwgZGVidWdnZXIgc3ltYm9scyAqLwotICAgIFNUUklQX1VOTkVFREVELAkJLyogc3RyaXAgdW5uZWNlc3Nhcnkgc3ltYm9scyAqLwotICAgIFNUUklQX0FMTAkJCS8qIHN0cmlwIGFsbCBzeW1ib2xzICovCi0gIH07Ci0KLS8qIFdoaWNoIHN5bWJvbHMgdG8gcmVtb3ZlLiAqLwotc3RhdGljIGVudW0gc3RyaXBfYWN0aW9uIHN0cmlwX3N5bWJvbHM7Ci0KLWVudW0gbG9jYWxzX2FjdGlvbgotICB7Ci0gICAgTE9DQUxTX1VOREVGLAotICAgIExPQ0FMU19TVEFSVF9MLAkJLyogZGlzY2FyZCBsb2NhbHMgc3RhcnRpbmcgd2l0aCBMICovCi0gICAgTE9DQUxTX0FMTAkJCS8qIGRpc2NhcmQgYWxsIGxvY2FscyAqLwotICB9OwotCi0vKiBXaGljaCBsb2NhbCBzeW1ib2xzIHRvIHJlbW92ZS4gIE92ZXJyaWRlcyBTVFJJUF9BTEwuICAqLwotc3RhdGljIGVudW0gbG9jYWxzX2FjdGlvbiBkaXNjYXJkX2xvY2FsczsKLQotLyogV2hhdCBraW5kIG9mIGNoYW5nZSB0byBwZXJmb3JtLiAgKi8KLWVudW0gY2hhbmdlX2FjdGlvbgotewotICBDSEFOR0VfSUdOT1JFLAotICBDSEFOR0VfTU9ESUZZLAotICBDSEFOR0VfU0VUCi19OwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGxpc3RzIG9mIHNlY3Rpb25zIGFuZCBhY3Rpb25zIHRvIHRha2UuICAqLwotc3RydWN0IHNlY3Rpb25fbGlzdAotewotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICogbmV4dDsgICAgICAvKiBOZXh0IHNlY3Rpb24gdG8gY2hhbmdlLiAgKi8KLSAgY29uc3QgY2hhciAqICAgICAgICAgIG5hbWU7ICAgICAgLyogU2VjdGlvbiBuYW1lLiAgKi8KLSAgYm9vbGVhbiAgICAgICAgICAgICAgIHVzZWQ7ICAgICAgLyogV2hldGhlciB0aGlzIGVudHJ5IHdhcyB1c2VkLiAgKi8KLSAgYm9vbGVhbiAgICAgICAgICAgICAgIHJlbW92ZTsgICAgLyogV2hldGhlciB0byByZW1vdmUgdGhpcyBzZWN0aW9uLiAgKi8KLSAgYm9vbGVhbgkJY29weTsgICAgICAvKiBXaGV0aGVyIHRvIGNvcHkgdGhpcyBzZWN0aW9uLiAgKi8KLSAgZW51bSBjaGFuZ2VfYWN0aW9uICAgIGNoYW5nZV92bWE7LyogV2hldGhlciB0byBjaGFuZ2Ugb3Igc2V0IFZNQS4gICovCi0gIGJmZF92bWEgCQl2bWFfdmFsOyAgIC8qIEFtb3VudCB0byBjaGFuZ2UgYnkgb3Igc2V0IHRvLiAgKi8KLSAgZW51bSBjaGFuZ2VfYWN0aW9uICAgIGNoYW5nZV9sbWE7LyogV2hldGhlciB0byBjaGFuZ2Ugb3Igc2V0IExNQS4gICovCi0gIGJmZF92bWEgCQlsbWFfdmFsOyAgIC8qIEFtb3VudCB0byBjaGFuZ2UgYnkgb3Igc2V0IHRvLiAgKi8KLSAgYm9vbGVhbiAJCXNldF9mbGFnczsgLyogV2hldGhlciB0byBzZXQgdGhlIHNlY3Rpb24gZmxhZ3MuICAqLwotICBmbGFnd29yZCAJCWZsYWdzOyAgICAgLyogV2hhdCB0byBzZXQgdGhlIHNlY3Rpb24gZmxhZ3MgdG8uICAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QgKmNoYW5nZV9zZWN0aW9uczsKLXN0YXRpYyBib29sZWFuIHNlY3Rpb25zX3JlbW92ZWQ7Ci1zdGF0aWMgYm9vbGVhbiBzZWN0aW9uc19jb3BpZWQ7Ci0KLS8qIENoYW5nZXMgdG8gdGhlIHN0YXJ0IGFkZHJlc3MuICAqLwotc3RhdGljIGJmZF92bWEgY2hhbmdlX3N0YXJ0ID0gMDsKLXN0YXRpYyBib29sZWFuIHNldF9zdGFydF9zZXQgPSBmYWxzZTsKLXN0YXRpYyBiZmRfdm1hIHNldF9zdGFydDsKLQotLyogQ2hhbmdlcyB0byBzZWN0aW9uIGFkZHJlc3Nlcy4gICovCi1zdGF0aWMgYmZkX3ZtYSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzID0gMDsKLQotLyogRmlsbGluZyBnYXBzIGJldHdlZW4gc2VjdGlvbnMuICAqLwotc3RhdGljIGJvb2xlYW4gZ2FwX2ZpbGxfc2V0ID0gZmFsc2U7Ci1zdGF0aWMgYmZkX2J5dGUgZ2FwX2ZpbGwgPSAwOwotCi0vKiBQYWQgdG8gYSBnaXZlbiBhZGRyZXNzLiAgKi8KLXN0YXRpYyBib29sZWFuIHBhZF90b19zZXQgPSBmYWxzZTsKLXN0YXRpYyBiZmRfdm1hIHBhZF90bzsKLQotLyogTGlzdCBvZiBzZWN0aW9ucyB0byBhZGQuICAqLwotCi1zdHJ1Y3Qgc2VjdGlvbl9hZGQKLXsKLSAgLyogTmV4dCBzZWN0aW9uIHRvIGFkZC4gICovCi0gIHN0cnVjdCBzZWN0aW9uX2FkZCAqbmV4dDsKLSAgLyogTmFtZSBvZiBzZWN0aW9uIHRvIGFkZC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIE5hbWUgb2YgZmlsZSBob2xkaW5nIHNlY3Rpb24gY29udGVudHMuICAqLwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgLyogU2l6ZSBvZiBmaWxlLiAgKi8KLSAgc2l6ZV90IHNpemU7Ci0gIC8qIENvbnRlbnRzIG9mIGZpbGUuICAqLwotICBiZmRfYnl0ZSAqY29udGVudHM7Ci0gIC8qIEJGRCBzZWN0aW9uLCBhZnRlciBpdCBoYXMgYmVlbiBhZGRlZC4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotfTsKLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2FkZCAqYWRkX3NlY3Rpb25zOwotCi0vKiBXaGV0aGVyIHRvIGNvbnZlcnQgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY29udmVydF9kZWJ1Z2dpbmcgPSBmYWxzZTsKLQotLyogV2hldGhlciB0byBjaGFuZ2UgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGluIHN5bWJvbCBuYW1lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIGNoYW5nZV9sZWFkaW5nX2NoYXIgPSBmYWxzZTsKLQotLyogV2hldGhlciB0byByZW1vdmUgdGhlIGxlYWRpbmcgY2hhcmFjdGVyIGZyb20gZ2xvYmFsIHN5bWJvbCBuYW1lcy4gICovCi0KLXN0YXRpYyBib29sZWFuIHJlbW92ZV9sZWFkaW5nX2NoYXIgPSBmYWxzZTsKLQotLyogTGlzdCBvZiBzeW1ib2xzIHRvIHN0cmlwLCBrZWVwLCBsb2NhbGl6ZSwgYW5kIHdlYWtlbi4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgc3ltbGlzdCAqc3RyaXBfc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKmtlZXBfc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci1zdGF0aWMgc3RydWN0IHN5bWxpc3QgKmxvY2FsaXplX3NwZWNpZmljX2xpc3QgPSBOVUxMOwotc3RhdGljIHN0cnVjdCBzeW1saXN0ICp3ZWFrZW5fc3BlY2lmaWNfbGlzdCA9IE5VTEw7Ci0KLS8qIElmIHRoaXMgaXMgdHJ1ZSwgd2Ugd2Vha2VuIGdsb2JhbCBzeW1ib2xzIChzZXQgQlNGX1dFQUspLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gd2Vha2VuID0gZmFsc2U7Ci0KLS8qIDE1MCBpc24ndCBzcGVjaWFsOyBpdCdzIGp1c3QgYW4gYXJiaXRyYXJ5IG5vbi1BU0NJSSBjaGFyIHZhbHVlLiAgKi8KLQotI2RlZmluZSBPUFRJT05fQUREX1NFQ1RJT04gMTUwCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTIChPUFRJT05fQUREX1NFQ1RJT04gKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUiAoT1BUSU9OX0NIQU5HRV9BRERSRVNTRVMgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NUQVJUIChPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUiArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTIChPUFRJT05fQ0hBTkdFX1NUQVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQSAoT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1MgKyAxKQotI2RlZmluZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fVk1BIChPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NIQU5HRV9XQVJOSU5HUyAoT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQSArIDEpCi0jZGVmaW5lIE9QVElPTl9ERUJVR0dJTkcgKE9QVElPTl9DSEFOR0VfV0FSTklOR1MgKyAxKQotI2RlZmluZSBPUFRJT05fR0FQX0ZJTEwgKE9QVElPTl9ERUJVR0dJTkcgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTIChPUFRJT05fR0FQX0ZJTEwgKyAxKQotI2RlZmluZSBPUFRJT05fUEFEX1RPIChPUFRJT05fTk9fQ0hBTkdFX1dBUk5JTkdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVIgKE9QVElPTl9QQURfVE8gKyAxKQotI2RlZmluZSBPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1MgKE9QVElPTl9SRU1PVkVfTEVBRElOR19DSEFSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NFVF9TVEFSVCAoT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NUUklQX1VOTkVFREVEIChPUFRJT05fU0VUX1NUQVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dFQUtFTiAoT1BUSU9OX1NUUklQX1VOTkVFREVEICsgMSkKLQotLyogT3B0aW9ucyB0byBoYW5kbGUgaWYgcnVubmluZyBhcyAic3RyaXAiLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvcHRpb24gc3RyaXBfb3B0aW9uc1tdID0KLXsKLSAgeyJkaXNjYXJkLWFsbCIsIG5vX2FyZ3VtZW50LCAwLCAneCd9LAotICB7ImRpc2NhcmQtbG9jYWxzIiwgbm9fYXJndW1lbnQsIDAsICdYJ30sCi0gIHsiZm9ybWF0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sIC8qIE9ic29sZXRlICovCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICB7ImlucHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LCAvKiBPYnNvbGV0ZSAqLwotICB7ImlucHV0LXRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7ImtlZXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdLJ30sCi0gIHsib3V0cHV0LWZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTyd9LAkvKiBPYnNvbGV0ZSAqLwotICB7Im91dHB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJwcmVzZXJ2ZS1kYXRlcyIsIG5vX2FyZ3VtZW50LCAwLCAncCd9LAotICB7InJlbW92ZS1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdSJ30sCi0gIHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0gIHsic3RyaXAtZGVidWciLCBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzdHJpcC11bm5lZWRlZCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fU1RSSVBfVU5ORUVERUR9LAotICB7InN0cmlwLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnTid9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICdWJ30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0KLS8qIE9wdGlvbnMgdG8gaGFuZGxlIGlmIHJ1bm5pbmcgYXMgIm9iamNvcHkiLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvcHRpb24gY29weV9vcHRpb25zW10gPQotewotICB7ImFkZC1zZWN0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9BRERfU0VDVElPTn0sCi0gIHsiYWRqdXN0LXN0YXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU1RBUlR9LAotICB7ImFkanVzdC12bWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9BRERSRVNTRVN9LAotICB7ImFkanVzdC1zZWN0aW9uLXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTU30sCi0gIHsiYWRqdXN0LXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfV0FSTklOR1N9LAotICB7ImJ5dGUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2InfSwKLSAgeyJjaGFuZ2UtYWRkcmVzc2VzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTfSwKLSAgeyJjaGFuZ2UtbGVhZGluZy1jaGFyIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfTEVBRElOR19DSEFSfSwKLSAgeyJjaGFuZ2Utc2VjdGlvbi1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9BRERSRVNTfSwKLSAgeyJjaGFuZ2Utc2VjdGlvbi1sbWEiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQX0sCi0gIHsiY2hhbmdlLXNlY3Rpb24tdm1hIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUF9LAotICB7ImNoYW5nZS1zdGFydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fQ0hBTkdFX1NUQVJUfSwKLSAgeyJjaGFuZ2Utd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsiZGVidWdnaW5nIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ERUJVR0dJTkd9LAotICB7ImRpc2NhcmQtYWxsIiwgbm9fYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgMCwgJ1gnfSwKLSAgeyJvbmx5LXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2onfSwKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0YnfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJnYXAtZmlsbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fR0FQX0ZJTEx9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgeyJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwgLyogT2Jzb2xldGUgKi8KLSAgeyJpbnB1dC10YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJpbnRlcmxlYXZlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdpJ30sCi0gIHsia2VlcC1zeW1ib2wiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0snfSwKLSAgeyJuby1hZGp1c3Qtd2FybmluZ3MiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HU30sCi0gIHsibm8tY2hhbmdlLXdhcm5pbmdzIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9OT19DSEFOR0VfV0FSTklOR1N9LAotICB7Im91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwJLyogT2Jzb2xldGUgKi8KLSAgeyJvdXRwdXQtdGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdPJ30sCi0gIHsicGFkLXRvIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIE9QVElPTl9QQURfVE99LAotICB7InByZXNlcnZlLWRhdGVzIiwgbm9fYXJndW1lbnQsIDAsICdwJ30sCi0gIHsibG9jYWxpemUtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdMJ30sCi0gIHsicmVtb3ZlLWxlYWRpbmctY2hhciIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fUkVNT1ZFX0xFQURJTkdfQ0hBUn0sCi0gIHsicmVtb3ZlLXNlY3Rpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1InfSwKLSAgeyJzZXQtc2VjdGlvbi1mbGFncyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fU0VUX1NFQ1RJT05fRkxBR1N9LAotICB7InNldC1zdGFydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fU0VUX1NUQVJUfSwKLSAgeyJzdHJpcC1hbGwiLCBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCAwLCAnZyd9LAotICB7InN0cmlwLXVubmVlZGVkIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9TVFJJUF9VTk5FRURFRH0sCi0gIHsic3RyaXAtc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdOJ30sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgeyJ3ZWFrZW4iLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1dFQUtFTn0sCi0gIHsid2Vha2VuLXN5bWJvbCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnVyd9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBJTVBPUlRTICovCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBUaGlzIGZsYWcgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIHN0cmlwIGFuZCBvYmpjb3B5OgotICAgMSBtZWFucyB0aGlzIGlzICdzdHJpcCc7IDAgbWVhbnMgdGhpcyBpcyAnb2JqY29weScuCi0gICAtMSBtZWFucyBpZiB3ZSBzaG91bGQgdXNlIGFyZ3ZbMF0gdG8gZGVjaWRlLiAqLwotZXh0ZXJuIGludCBpc19zdHJpcDsKLQotCi1zdGF0aWMgdm9pZAotY29weV91c2FnZSAoc3RyZWFtLCBleGl0X3N0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgZXhpdF9zdGF0dXM7Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVXNhZ2U6ICVzIFstdlZTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1iIGJ5dGVdXG5cCi0gICAgICAgWy1qIHNlY3Rpb25dIFstUiBzZWN0aW9uXVxuXAotICAgICAgIFstaSBpbnRlcmxlYXZlXSBbLS1pbnRlcmxlYXZlPWludGVybGVhdmVdIFstLWJ5dGU9Ynl0ZV1cblwKLSAgICAgICBbLS1pbnB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tb3V0cHV0LXRhcmdldD1iZmRuYW1lXSBbLS10YXJnZXQ9YmZkbmFtZV1cblwKLSAgICAgICBbLS1zdHJpcC1hbGxdIFstLXN0cmlwLWRlYnVnXSBbLS1zdHJpcC11bm5lZWRlZF0gWy0tZGlzY2FyZC1hbGxdXG5cCi0gICAgICAgWy0tZGlzY2FyZC1sb2NhbHNdIFstLWRlYnVnZ2luZ11cblwKLSAgICAgICBbLS1vbmx5LXNlY3Rpb249c2VjdGlvbl0gWy0tcmVtb3ZlLXNlY3Rpb249c2VjdGlvbl1cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAgICAgIFstLWdhcC1maWxsPXZhbF0gWy0tcGFkLXRvPWFkZHJlc3NdIFstLXByZXNlcnZlLWRhdGVzXVxuXAotICAgICAgIFstLXNldC1zdGFydD12YWxdIFxuXAotICAgICAgIFstLWNoYW5nZS1zdGFydD1pbmNyXSBbLS1jaGFuZ2UtYWRkcmVzc2VzPWluY3JdIFxuXAotICAgICAgICgtLWFkanVzdC1zdGFydCAgIGFuZCAgLS1hZGp1c3Qtdm1hIGFyZSBhbGlhc2VzIGZvciB0aGVzZSB0d28pIFxuXAotICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3M9c2VjdGlvbns9LCssLX12YWxdXG5cCi0gICAgICAgKC0tYWRqdXN0LXNlY3Rpb24tdm1hIGlzIGFuIGFsaWFzIGZvciAtLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MpXG5cCi0gICAgICAgWy0tY2hhbmdlLXNlY3Rpb24tbG1hPXNlY3Rpb257PSwrLC19dmFsXVxuXAotICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLXZtYT1zZWN0aW9uez0sKywtfXZhbF1cblwKLSAgICAgICBbLS1hZGp1c3Qtd2FybmluZ3NdIFstLW5vLWFkanVzdC13YXJuaW5nc11cblwKLSAgICAgICBbLS1jaGFuZ2Utd2FybmluZ3NdIFstLW5vLWNoYW5nZS13YXJuaW5nc11cblwKLSAgICAgICBbLS1zZXQtc2VjdGlvbi1mbGFncz1zZWN0aW9uPWZsYWdzXSBbLS1hZGQtc2VjdGlvbj1zZWN0aW9ubmFtZT1maWxlbmFtZV1cblwKLSAgICAgICBbLS1rZWVwLXN5bWJvbCBzeW1ib2xdIFstSyBzeW1ib2xdIFstLXN0cmlwLXN5bWJvbCBzeW1ib2xdIFstTiBzeW1ib2xdXG5cCi0gICAgICAgWy0tbG9jYWxpemUtc3ltYm9sIHN5bWJvbF0gWy1MIHN5bWJvbF0gWy0td2Vha2VuLXN5bWJvbCBzeW1ib2xdXG5cCi0gICAgICAgWy1XIHN5bWJvbF0gWy0tY2hhbmdlLWxlYWRpbmctY2hhcl0gWy0tcmVtb3ZlLWxlYWRpbmctY2hhcl0gWy0td2Vha2VuXVxuXAotICAgICAgIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdIGluLWZpbGUgW291dC1maWxlXVxuIikpOwotICBsaXN0X3N1cHBvcnRlZF90YXJnZXRzIChwcm9ncmFtX25hbWUsIHN0cmVhbSk7Ci0gIGlmIChleGl0X3N0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKGV4aXRfc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmlwX3VzYWdlIChzdHJlYW0sIGV4aXRfc3RhdHVzKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGludCBleGl0X3N0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy12VnNTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1SIHNlY3Rpb25dXG5cCi0gICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV0gWy0tdGFyZ2V0PWJmZG5hbWVdXG5cCi0gICAgICAgWy0tc3RyaXAtYWxsXSBbLS1zdHJpcC1kZWJ1Z10gWy0tc3RyaXAtdW5uZWVkZWRdIFstLWRpc2NhcmQtYWxsXVxuXAotICAgICAgIFstLWRpc2NhcmQtbG9jYWxzXSBbLS1rZWVwLXN5bWJvbCBzeW1ib2xdIFstSyBzeW1ib2xdXG5cCi0gICAgICAgWy0tc3RyaXAtc3ltYm9sIHN5bWJvbF0gWy1OIHN5bWJvbF0gWy0tcmVtb3ZlLXNlY3Rpb249c2VjdGlvbl1cblwKLSAgICAgICBbLW8gZmlsZV0gWy0tcHJlc2VydmUtZGF0ZXNdIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdIGZpbGUuLi5cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKGV4aXRfc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoZXhpdF9zdGF0dXMpOwotfQotCi0vKiBQYXJzZSBzZWN0aW9uIGZsYWdzIGludG8gYSBmbGFnd29yZCwgd2l0aCBhIGZhdGFsIGVycm9yIGlmIHRoZQotICAgc3RyaW5nIGNhbid0IGJlIHBhcnNlZC4gICovCi0KLXN0YXRpYyBmbGFnd29yZAotcGFyc2VfZmxhZ3MgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGZsYWd3b3JkIHJldDsKLSAgY29uc3QgY2hhciAqc25leHQ7Ci0gIGludCBsZW47Ci0KLSAgcmV0ID0gU0VDX05PX0ZMQUdTOwotCi0gIGRvCi0gICAgewotICAgICAgc25leHQgPSBzdHJjaHIgKHMsICcsJyk7Ci0gICAgICBpZiAoc25leHQgPT0gTlVMTCkKLQlsZW4gPSBzdHJsZW4gKHMpOwotICAgICAgZWxzZQotCXsKLQkgIGxlbiA9IHNuZXh0IC0gczsKLQkgICsrc25leHQ7Ci0JfQotCi0gICAgICBpZiAoMCkgOwotI2RlZmluZSBQQVJTRV9GTEFHKGZuYW1lLGZ2YWwpIFwKLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGZuYW1lLCBzLCBsZW4pID09IDApIHJldCB8PSBmdmFsCi0gICAgICBQQVJTRV9GTEFHICgiYWxsb2MiLCBTRUNfQUxMT0MpOwotICAgICAgUEFSU0VfRkxBRyAoImxvYWQiLCBTRUNfTE9BRCk7Ci0gICAgICBQQVJTRV9GTEFHICgicmVhZG9ubHkiLCBTRUNfUkVBRE9OTFkpOwotICAgICAgUEFSU0VfRkxBRyAoImNvZGUiLCBTRUNfQ09ERSk7Ci0gICAgICBQQVJTRV9GTEFHICgiZGF0YSIsIFNFQ19EQVRBKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJyb20iLCBTRUNfUk9NKTsKLSAgICAgIFBBUlNFX0ZMQUcgKCJjb250ZW50cyIsIFNFQ19IQVNfQ09OVEVOVFMpOwotI3VuZGVmIFBBUlNFX0ZMQUcKLSAgICAgIGVsc2UKLQl7Ci0JICBjaGFyICpjb3B5OwotCi0JICBjb3B5ID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICBzdHJuY3B5IChjb3B5LCBzLCBsZW4pOwotCSAgY29weVtsZW5dID0gJ1wwJzsKLQkgIG5vbl9mYXRhbCAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gZmxhZyBgJXMnIiksIGNvcHkpOwotCSAgZmF0YWwgKF8oInN1cHBvcnRlZCBmbGFnczogYWxsb2MsIGxvYWQsIHJlYWRvbmx5LCBjb2RlLCBkYXRhLCByb20sIGNvbnRlbnRzIikpOwotCX0KLQotICAgICAgcyA9IHNuZXh0OwotICAgIH0KLSAgd2hpbGUgKHMgIT0gTlVMTCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRmluZCBhbmQgb3B0aW9uYWxseSBhZGQgYW4gZW50cnkgaW4gdGhlIGNoYW5nZV9zZWN0aW9ucyBsaXN0LiAgKi8KLQotc3RhdGljIHN0cnVjdCBzZWN0aW9uX2xpc3QgKgotZmluZF9zZWN0aW9uX2xpc3QgKG5hbWUsIGFkZCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBhZGQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0KLSAgZm9yIChwID0gY2hhbmdlX3NlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHAtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICByZXR1cm4gcDsKLQotICBpZiAoISBhZGQpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgcCA9IChzdHJ1Y3Qgc2VjdGlvbl9saXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNlY3Rpb25fbGlzdCkpOwotICBwLT5uYW1lID0gbmFtZTsKLSAgcC0+dXNlZCA9IGZhbHNlOwotICBwLT5yZW1vdmUgPSBmYWxzZTsKLSAgcC0+Y29weSA9IGZhbHNlOwotICBwLT5jaGFuZ2Vfdm1hID0gQ0hBTkdFX0lHTk9SRTsKLSAgcC0+Y2hhbmdlX2xtYSA9IENIQU5HRV9JR05PUkU7Ci0gIHAtPnZtYV92YWwgPSAwOwotICBwLT5sbWFfdmFsID0gMDsKLSAgcC0+c2V0X2ZsYWdzID0gZmFsc2U7Ci0gIHAtPmZsYWdzID0gMDsKLQotICBwLT5uZXh0ID0gY2hhbmdlX3NlY3Rpb25zOwotICBjaGFuZ2Vfc2VjdGlvbnMgPSBwOwotCi0gIHJldHVybiBwOwotfQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gc3RyaXBfc3BlY2lmaWNfbGlzdC4gICovCi0KLXN0YXRpYyB2b2lkIAotYWRkX3NwZWNpZmljX3N5bWJvbCAobmFtZSwgbGlzdCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHN5bWxpc3QgKipsaXN0OwotewotICBzdHJ1Y3Qgc3ltbGlzdCAqdG1wX2xpc3Q7Ci0KLSAgdG1wX2xpc3QgPSAoc3RydWN0IHN5bWxpc3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3ltbGlzdCkpOwotICB0bXBfbGlzdC0+bmFtZSA9IG5hbWU7Ci0gIHRtcF9saXN0LT5uZXh0ID0gKmxpc3Q7Ci0gICpsaXN0ID0gdG1wX2xpc3Q7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIGEgc3ltYm9sIHNob3VsZCBiZSBzdHJpcHBlZCBvciBrZXB0IGJhc2VkIG9uCi0gICBzdHJpcF9zcGVjaWZpY19saXN0IGFuZCBrZWVwX3N5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgbGlzdCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IHN5bWxpc3QgKmxpc3Q7Ci17Ci0gIHN0cnVjdCBzeW1saXN0ICp0bXBfbGlzdDsKLQotICBmb3IgKHRtcF9saXN0ID0gbGlzdDsgdG1wX2xpc3Q7IHRtcF9saXN0ID0gdG1wX2xpc3QtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgdG1wX2xpc3QtPm5hbWUpID09IDApCi0JcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFNlZSBpZiBhIHNlY3Rpb24gaXMgYmVpbmcgcmVtb3ZlZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pc19zdHJpcF9zZWN0aW9uIChhYmZkLCBzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgc3RydWN0IHNlY3Rpb25fbGlzdCAqcDsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19ERUJVR0dJTkcpICE9IDAKLSAgICAgICYmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0RFQlVHCi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0JICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTAotCSAgfHwgZGlzY2FyZF9sb2NhbHMgPT0gTE9DQUxTX0FMTAotCSAgfHwgY29udmVydF9kZWJ1Z2dpbmcpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghIHNlY3Rpb25zX3JlbW92ZWQgJiYgISBzZWN0aW9uc19jb3BpZWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX2dldF9zZWN0aW9uX25hbWUgKGFiZmQsIHNlYyksIGZhbHNlKTsKLSAgaWYgKHNlY3Rpb25zX3JlbW92ZWQgJiYgcCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKHNlY3Rpb25zX2NvcGllZCAmJiAocCA9PSBOVUxMIHx8ICEgcC0+Y29weSkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogQ2hvb3NlIHdoaWNoIHN5bWJvbCBlbnRyaWVzIHRvIGNvcHk7IHB1dCB0aGUgcmVzdWx0IGluIE9TWU1TLgotICAgV2UgZG9uJ3QgY29weSBpbiBwbGFjZSwgYmVjYXVzZSB0aGF0IGNvbmZ1c2VzIHRoZSByZWxvY3MuCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBzeW1ib2xzIHRvIHByaW50LiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZmlsdGVyX3N5bWJvbHMgKGFiZmQsIG9iZmQsIG9zeW1zLCBpc3ltcywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYmZkICpvYmZkOwotICAgICBhc3ltYm9sICoqb3N5bXMsICoqaXN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGFzeW1ib2wgKipmcm9tID0gaXN5bXMsICoqdG8gPSBvc3ltczsKLSAgbG9uZyBzcmNfY291bnQgPSAwLCBkc3RfY291bnQgPSAwOwotCi0gIGZvciAoOyBzcmNfY291bnQgPCBzeW1jb3VudDsgc3JjX2NvdW50KyspCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gZnJvbVtzcmNfY291bnRdOwotICAgICAgZmxhZ3dvcmQgZmxhZ3MgPSBzeW0tPmZsYWdzOwotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSk7Ci0gICAgICBpbnQga2VlcDsKLQotICAgICAgaWYgKGNoYW5nZV9sZWFkaW5nX2NoYXIKLQkgICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpCi0JICAgICAgIT0gYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChvYmZkKSkKLQkgICYmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdcMCcKLQkgICAgICB8fCAobmFtZVswXSA9PSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpKSkpCi0JewotCSAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob2JmZCkgPT0gJ1wwJykKLQkgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgPSBuYW1lICsgMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBuID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDIpOwotCSAgICAgIG5bMF0gPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKG9iZmQpOwotCSAgICAgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpID09ICdcMCcpCi0JCXN0cmNweSAobiArIDEsIG5hbWUpOwotCSAgICAgIGVsc2UKLQkJc3RyY3B5IChuICsgMSwgbmFtZSArIDEpOwotCSAgICAgIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pID0gbjsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJlbW92ZV9sZWFkaW5nX2NoYXIKLQkgICYmICgoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwCi0JICAgICAgfHwgKGZsYWdzICYgQlNGX1dFQUspICE9IDAKLQkgICAgICB8fCBiZmRfaXNfdW5kX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkKLQkgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0JICAmJiBuYW1lWzBdID09IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkpCi0JbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKHN5bSkgPSBuYW1lICsgMTsKLQotICAgICAgaWYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMKQotCWtlZXAgPSAwOwotICAgICAgZWxzZSBpZiAoKGZsYWdzICYgQlNGX0tFRVApICE9IDAJCS8qIFVzZWQgaW4gcmVsb2NhdGlvbi4gICovCi0JICAgICAgIHx8ICgoZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pICE9IDAKLQkJICAgJiYgKCgqYmZkX2dldF9zZWN0aW9uIChzeW0pLT5zeW1ib2xfcHRyX3B0ciktPmZsYWdzCi0JCSAgICAgICAmIEJTRl9LRUVQKSAhPSAwKSkKLQlrZWVwID0gMTsKLSAgICAgIGVsc2UgaWYgKChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDAJLyogR2xvYmFsIHN5bWJvbC4gICovCi0JICAgICAgIHx8IChmbGFncyAmIEJTRl9XRUFLKSAhPSAwCi0JICAgICAgIHx8IGJmZF9pc191bmRfc2VjdGlvbiAoYmZkX2dldF9zZWN0aW9uIChzeW0pKQotCSAgICAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0Ja2VlcCA9IHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfVU5ORUVERUQ7Ci0gICAgICBlbHNlIGlmICgoZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSAhPSAwKQkvKiBEZWJ1Z2dpbmcgc3ltYm9sLiAgKi8KLQlrZWVwID0gKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfREVCVUcKLQkJJiYgc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9VTk5FRURFRAotCQkmJiAhIGNvbnZlcnRfZGVidWdnaW5nKTsKLSAgICAgIGVsc2UJCQkvKiBMb2NhbCBzeW1ib2wuICAqLwotCWtlZXAgPSAoc3RyaXBfc3ltYm9scyAhPSBTVFJJUF9VTk5FRURFRAotCQkmJiAoZGlzY2FyZF9sb2NhbHMgIT0gTE9DQUxTX0FMTAotCQkgICAgJiYgKGRpc2NhcmRfbG9jYWxzICE9IExPQ0FMU19TVEFSVF9MCi0JCQl8fCAhIGJmZF9pc19sb2NhbF9sYWJlbCAoYWJmZCwgc3ltKSkpKTsKLQotICAgICAgaWYgKGtlZXAgJiYgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgc3RyaXBfc3BlY2lmaWNfbGlzdCkpCi0Ja2VlcCA9IDA7Ci0gICAgICBpZiAoIWtlZXAgJiYgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwga2VlcF9zcGVjaWZpY19saXN0KSkKLQlrZWVwID0gMTsKLSAgICAgIGlmIChrZWVwICYmIGlzX3N0cmlwX3NlY3Rpb24gKGFiZmQsIGJmZF9nZXRfc2VjdGlvbiAoc3ltKSkpCi0Ja2VlcCA9IDA7Ci0KLSAgICAgIGlmIChrZWVwICYmIChmbGFncyAmIEJTRl9HTE9CQUwpICE9IDAKLQkgICYmICh3ZWFrZW4gfHwgaXNfc3BlY2lmaWVkX3N5bWJvbCAobmFtZSwgd2Vha2VuX3NwZWNpZmljX2xpc3QpKSkKLQl7Ci0JICBzeW0tPmZsYWdzICY9fiBCU0ZfR0xPQkFMOwotCSAgc3ltLT5mbGFncyB8PSBCU0ZfV0VBSzsKLQl9Ci0gICAgICBpZiAoa2VlcCAmJiAoZmxhZ3MgJiAoQlNGX0dMT0JBTCB8IEJTRl9XRUFLKSkKLQkgICYmIGlzX3NwZWNpZmllZF9zeW1ib2wgKG5hbWUsIGxvY2FsaXplX3NwZWNpZmljX2xpc3QpKQotCXsKLQkgIHN5bS0+ZmxhZ3MgJj0gfihCU0ZfR0xPQkFMIHwgQlNGX1dFQUspOwotCSAgc3ltLT5mbGFncyB8PSBCU0ZfTE9DQUw7Ci0JfQotCi0gICAgICBpZiAoa2VlcCkKLQl0b1tkc3RfY291bnQrK10gPSBzeW07Ci0gICAgfQotCi0gIHRvW2RzdF9jb3VudF0gPSBOVUxMOwotCi0gIHJldHVybiBkc3RfY291bnQ7Ci19Ci0KLS8qIEtlZXAgb25seSBldmVyeSBgY29weV9ieXRlJ3RoIGJ5dGUgaW4gTUVNSFVOSywgd2hpY2ggaXMgKlNJWkUgYnl0ZXMgbG9uZy4KLSAgIEFkanVzdCAqU0laRS4gICovCi0KLXN0YXRpYyB2b2lkCi1maWx0ZXJfYnl0ZXMgKG1lbWh1bmssIHNpemUpCi0gICAgIGNoYXIgKm1lbWh1bms7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnNpemU7Ci17Ci0gIGNoYXIgKmZyb20gPSBtZW1odW5rICsgY29weV9ieXRlLCAqdG8gPSBtZW1odW5rLCAqZW5kID0gbWVtaHVuayArICpzaXplOwotCi0gIGZvciAoOyBmcm9tIDwgZW5kOyBmcm9tICs9IGludGVybGVhdmUpCi0gICAgKnRvKysgPSAqZnJvbTsKLSAgaWYgKCpzaXplICUgaW50ZXJsZWF2ZSA+IGNvcHlfYnl0ZSkKLSAgICAqc2l6ZSA9ICgqc2l6ZSAvIGludGVybGVhdmUpICsgMTsKLSAgZWxzZQotICAgICpzaXplIC89IGludGVybGVhdmU7Ci19Ci0KLS8qIENvcHkgb2JqZWN0IGZpbGUgSUJGRCBvbnRvIE9CRkQuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9vYmplY3QgKGliZmQsIG9iZmQpCi0gICAgIGJmZCAqaWJmZDsKLSAgICAgYmZkICpvYmZkOwotewotICBiZmRfdm1hIHN0YXJ0OwotICBsb25nIHN5bWNvdW50OwotICBhc2VjdGlvbiAqKm9zZWN0aW9ucyA9IE5VTEw7Ci0gIGJmZF9zaXplX3R5cGUgKmdhcHMgPSBOVUxMOwotICBiZmRfc2l6ZV90eXBlIG1heF9nYXAgPSAwOwotICBsb25nIHN5bXNpemU7Ci0gIFBUUiBkaGFuZGxlOwotCi0KLSAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICBwcmludGYgKF8oImNvcHkgZnJvbSAlcyglcykgdG8gJXMoJXMpXG4iKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAoaWJmZCksIGJmZF9nZXRfdGFyZ2V0IChpYmZkKSwKLQkgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksIGJmZF9nZXRfdGFyZ2V0IChvYmZkKSk7Ci0KLSAgaWYgKHNldF9zdGFydF9zZXQpCi0gICAgc3RhcnQgPSBzZXRfc3RhcnQ7Ci0gIGVsc2UKLSAgICBzdGFydCA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoaWJmZCk7Ci0gIHN0YXJ0ICs9IGNoYW5nZV9zdGFydDsKLQotICBpZiAoIWJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob2JmZCwgc3RhcnQpCi0gICAgICB8fCAhYmZkX3NldF9maWxlX2ZsYWdzIChvYmZkLAotCQkJICAgICAgKGJmZF9nZXRfZmlsZV9mbGFncyAoaWJmZCkKLQkJCSAgICAgICAmIGJmZF9hcHBsaWNhYmxlX2ZpbGVfZmxhZ3MgKG9iZmQpKSkpCi0gICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgLyogQ29weSBhcmNoaXRlY3R1cmUgb2YgaW5wdXQgZmlsZSB0byBvdXRwdXQgZmlsZSAqLwotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChvYmZkLCBiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJICBiZmRfZ2V0X21hY2ggKGliZmQpKSkKLSAgICBub25fZmF0YWwgKF8oIldhcm5pbmc6IE91dHB1dCBmaWxlIGNhbm5vdCByZXByZXNlbnQgYXJjaGl0ZWN0dXJlICVzIiksCi0JICAgICAgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGliZmQpLAotCQkJCQliZmRfZ2V0X21hY2ggKGliZmQpKSk7Ci0gIAotICBpZiAoIWJmZF9zZXRfZm9ybWF0IChvYmZkLCBiZmRfZ2V0X2Zvcm1hdCAoaWJmZCkpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIGlmIChpc3ltcHApCi0gICAgZnJlZSAoaXN5bXBwKTsKLSAgCi0gIGlmIChvc3ltcHAgIT0gaXN5bXBwKQotICAgIGZyZWUgKG9zeW1wcCk7Ci0KLSAgLyogQkZEIG1hbmRhdGVzIHRoYXQgYWxsIG91dHB1dCBzZWN0aW9ucyBiZSBjcmVhdGVkIGFuZCBzaXplcyBzZXQgYmVmb3JlCi0gICAgIGFueSBvdXRwdXQgaXMgZG9uZS4gIFRodXMsIHdlIHRyYXZlcnNlIGFsbCBzZWN0aW9ucyBtdWx0aXBsZSB0aW1lcy4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwgc2V0dXBfc2VjdGlvbiwgKHZvaWQgKikgb2JmZCk7Ci0KLSAgaWYgKGFkZF9zZWN0aW9ucyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX2FkZCAqcGFkZDsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnBzZXQ7Ci0KLSAgICAgIGZvciAocGFkZCA9IGFkZF9zZWN0aW9uczsgcGFkZCAhPSBOVUxMOyBwYWRkID0gcGFkZC0+bmV4dCkKLQl7Ci0JICBwYWRkLT5zZWN0aW9uID0gYmZkX21ha2Vfc2VjdGlvbiAob2JmZCwgcGFkZC0+bmFtZSk7Ci0JICBpZiAocGFkZC0+c2VjdGlvbiA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgbm9uX2ZhdGFsIChfKCJjYW4ndCBjcmVhdGUgc2VjdGlvbiBgJXMnOiAlcyIpLAotCQkgICAgICAgcGFkZC0+bmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHN0YXR1cyA9IDE7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmbGFnd29yZCBmbGFnczsKLQkgICAgICAKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgcGFkZC0+c2VjdGlvbiwgcGFkZC0+c2l6ZSkpCi0JCVJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0JICAgICAgcHNldCA9IGZpbmRfc2VjdGlvbl9saXN0IChwYWRkLT5uYW1lLCBmYWxzZSk7Ci0JICAgICAgaWYgKHBzZXQgIT0gTlVMTCkKLQkJcHNldC0+dXNlZCA9IHRydWU7Ci0KLQkgICAgICBpZiAocHNldCAhPSBOVUxMICYmIHBzZXQtPnNldF9mbGFncykKLQkJZmxhZ3MgPSBwc2V0LT5mbGFncyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0JICAgICAgZWxzZQotCQlmbGFncyA9IFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQTsKLQkgICAgICAKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKG9iZmQsIHBhZGQtPnNlY3Rpb24sIGZsYWdzKSkKLQkJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkgICAgICBpZiAocHNldCAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKHBzZXQtPmNoYW5nZV92bWEgIT0gQ0hBTkdFX0lHTk9SRSkKLQkJICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl92bWEgKG9iZmQsIHBhZGQtPnNlY3Rpb24sIHBzZXQtPnZtYV92YWwpKQotCQkgICAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQkJICAKLQkJICBpZiAocHNldC0+Y2hhbmdlX2xtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQkgICAgewotCQkgICAgICBwYWRkLT5zZWN0aW9uLT5sbWEgPSBwc2V0LT5sbWFfdmFsOwotCQkgICAgICAKLQkJICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudAotCQkJICAob2JmZCwgcGFkZC0+c2VjdGlvbiwKLQkJCSAgIGJmZF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgcGFkZC0+c2VjdGlvbikpKQotCQkJUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGdhcF9maWxsX3NldCB8fCBwYWRfdG9fc2V0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICoqc2V0OwotICAgICAgdW5zaWduZWQgaW50IGMsIGk7Ci0KLSAgICAgIC8qIFdlIG11c3QgZmlsbCBpbiBnYXBzIGJldHdlZW4gdGhlIHNlY3Rpb25zIGFuZC9vciB3ZSBtdXN0IHBhZAotCSB0aGUgbGFzdCBzZWN0aW9uIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MuICBXZSBkbyB0aGlzIGJ5Ci0JIGdyYWJiaW5nIGEgbGlzdCBvZiB0aGUgc2VjdGlvbnMsIHNvcnRpbmcgdGhlbSBieSBWTUEsIGFuZAotCSBpbmNyZWFzaW5nIHRoZSBzZWN0aW9uIHNpemVzIGFzIHJlcXVpcmVkIHRvIGZpbGwgdGhlIGdhcHMuCi0JIFdlIHdyaXRlIG91dCB0aGUgZ2FwIGNvbnRlbnRzIGJlbG93LiAgKi8KLQotICAgICAgYyA9IGJmZF9jb3VudF9zZWN0aW9ucyAob2JmZCk7Ci0gICAgICBvc2VjdGlvbnMgPSAoYXNlY3Rpb24gKiopIHhtYWxsb2MgKGMgKiBzaXplb2YgKGFzZWN0aW9uICopKTsKLSAgICAgIHNldCA9IG9zZWN0aW9uczsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAob2JmZCwgZ2V0X3NlY3Rpb25zLCAodm9pZCAqKSAmc2V0KTsKLQotICAgICAgcXNvcnQgKG9zZWN0aW9ucywgYywgc2l6ZW9mIChhc2VjdGlvbiAqKSwgY29tcGFyZV9zZWN0aW9uX2xtYSk7Ci0KLSAgICAgIGdhcHMgPSAoYmZkX3NpemVfdHlwZSAqKSB4bWFsbG9jIChjICogc2l6ZW9mIChiZmRfc2l6ZV90eXBlKSk7Ci0gICAgICBtZW1zZXQgKGdhcHMsIDAsIGMgKiBzaXplb2YgKGJmZF9zaXplX3R5cGUpKTsKLQotICAgICAgaWYgKGdhcF9maWxsX3NldCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgYyAtIDE7IGkrKykKLQkgICAgewotCSAgICAgIGZsYWd3b3JkIGZsYWdzOwotCSAgICAgIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQkgICAgICBiZmRfdm1hIGdhcF9zdGFydCwgZ2FwX3N0b3A7Ci0KLQkgICAgICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgb3NlY3Rpb25zW2ldKTsKLQkgICAgICBpZiAoKGZsYWdzICYgU0VDX0hBU19DT05URU5UUykgPT0gMAotCQkgIHx8IChmbGFncyAmIFNFQ19MT0FEKSA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICAgIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbaV0pOwotCSAgICAgIGdhcF9zdGFydCA9IGJmZF9zZWN0aW9uX2xtYSAob2JmZCwgb3NlY3Rpb25zW2ldKSArIHNpemU7Ci0JICAgICAgZ2FwX3N0b3AgPSBiZmRfc2VjdGlvbl9sbWEgKG9iZmQsIG9zZWN0aW9uc1tpICsgMV0pOwotCSAgICAgIGlmIChnYXBfc3RhcnQgPCBnYXBfc3RvcCkKLQkJewotCQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBvc2VjdGlvbnNbaV0sCi0JCQkJCSAgICAgIHNpemUgKyAoZ2FwX3N0b3AgLSBnYXBfc3RhcnQpKSkKLQkJICAgIHsKLQkJICAgICAgbm9uX2ZhdGFsIChfKCJDYW4ndCBmaWxsIGdhcCBhZnRlciAlczogJXMiKSwKLQkJCSAgICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAob2JmZCwgb3NlY3Rpb25zW2ldKSwKLQkJCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JCSAgICAgIHN0YXR1cyA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGdhcHNbaV0gPSBnYXBfc3RvcCAtIGdhcF9zdGFydDsKLQkJICBpZiAobWF4X2dhcCA8IGdhcF9zdG9wIC0gZ2FwX3N0YXJ0KQotCQkgICAgbWF4X2dhcCA9IGdhcF9zdG9wIC0gZ2FwX3N0YXJ0OwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChwYWRfdG9fc2V0KQotCXsKLQkgIGJmZF92bWEgbG1hOwotCSAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0JICBsbWEgPSBiZmRfc2VjdGlvbl9sbWEgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0pOwotCSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tjIC0gMV0pOwotCSAgaWYgKGxtYSArIHNpemUgPCBwYWRfdG8pCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgb3NlY3Rpb25zW2MgLSAxXSwKLQkJCQkJICBwYWRfdG8gLSBsbWEpKQotCQl7Ci0JCSAgbm9uX2ZhdGFsIChfKCJDYW4ndCBhZGQgcGFkZGluZyB0byAlczogJXMiKSwKLQkJCSAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvYmZkLCBvc2VjdGlvbnNbYyAtIDFdKSwKLQkJCSAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkJICBzdGF0dXMgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZ2Fwc1tjIC0gMV0gPSBwYWRfdG8gLSAobG1hICsgc2l6ZSk7Ci0JCSAgaWYgKG1heF9nYXAgPCBwYWRfdG8gLSAobG1hICsgc2l6ZSkpCi0JCSAgICBtYXhfZ2FwID0gcGFkX3RvIC0gKGxtYSArIHNpemUpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFN5bWJvbCBmaWx0ZXJpbmcgbXVzdCBoYXBwZW4gYWZ0ZXIgdGhlIG91dHB1dCBzZWN0aW9ucyBoYXZlCi0gICAgIGJlZW4gY3JlYXRlZCwgYnV0IGJlZm9yZSB0aGVpciBjb250ZW50cyBhcmUgc2V0LiAgKi8KLSAgZGhhbmRsZSA9IE5VTEw7Ci0gIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoaWJmZCk7Ci0gIGlmIChzeW1zaXplIDwgMCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgCi0gIG9zeW1wcCA9IGlzeW1wcCA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLSAgc3ltY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoaWJmZCwgaXN5bXBwKTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLSAgCi0gIGlmIChjb252ZXJ0X2RlYnVnZ2luZykKLSAgICBkaGFuZGxlID0gcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoaWJmZCwgaXN5bXBwLCBzeW1jb3VudCk7Ci0gIAotICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9ERUJVRyAKLSAgICAgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0gICAgICB8fCBzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOTkVFREVECi0gICAgICB8fCBkaXNjYXJkX2xvY2FscyAhPSBMT0NBTFNfVU5ERUYKLSAgICAgIHx8IHN0cmlwX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwga2VlcF9zcGVjaWZpY19saXN0ICE9IE5VTEwKLSAgICAgIHx8IGxvY2FsaXplX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwgd2Vha2VuX3NwZWNpZmljX2xpc3QgIT0gTlVMTAotICAgICAgfHwgc2VjdGlvbnNfcmVtb3ZlZAotICAgICAgfHwgc2VjdGlvbnNfY29waWVkCi0gICAgICB8fCBjb252ZXJ0X2RlYnVnZ2luZwotICAgICAgfHwgY2hhbmdlX2xlYWRpbmdfY2hhcgotICAgICAgfHwgcmVtb3ZlX2xlYWRpbmdfY2hhcgotICAgICAgfHwgd2Vha2VuKQotICAgIHsKLSAgICAgIC8qIE1hcmsgc3ltYm9scyB1c2VkIGluIG91dHB1dCByZWxvY2F0aW9ucyBzbyB0aGF0IHRoZXkKLQkgYXJlIGtlcHQsIGV2ZW4gaWYgdGhleSBhcmUgbG9jYWwgbGFiZWxzIG9yIHN0YXRpYyBzeW1ib2xzLgotCSAKLQkgTm90ZSB3ZSBpdGVyYXRlIG92ZXIgdGhlIGlucHV0IHNlY3Rpb25zIGV4YW1pbmluZyB0aGVpcgotCSByZWxvY2F0aW9ucyBzaW5jZSB0aGUgcmVsb2NhdGlvbnMgZm9yIHRoZSBvdXRwdXQgc2VjdGlvbnMKLQkgaGF2ZW4ndCBiZWVuIHNldCB5ZXQuICBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucyB3aWxsCi0JIGlnbm9yZSBpbnB1dCBzZWN0aW9ucyB3aGljaCBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci0JIHNlY3Rpb24uICAqLwotICAgICAgaWYgKHN0cmlwX3N5bWJvbHMgIT0gU1RSSVBfQUxMKQotCWJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwKLQkJCSAgICAgICBtYXJrX3N5bWJvbHNfdXNlZF9pbl9yZWxvY2F0aW9ucywKLQkJCSAgICAgICAoUFRSKWlzeW1wcCk7Ci0gICAgICBvc3ltcHAgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoKHN5bWNvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgc3ltY291bnQgPSBmaWx0ZXJfc3ltYm9scyAoaWJmZCwgb2JmZCwgb3N5bXBwLCBpc3ltcHAsIHN5bWNvdW50KTsKLSAgICB9Ci0KLSAgaWYgKGNvbnZlcnRfZGVidWdnaW5nICYmIGRoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISB3cml0ZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSwgJnN5bWNvdW50LCAmb3N5bXBwKSkKLQl7Ci0JICBzdGF0dXMgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKG9iZmQsIG9zeW1wcCwgc3ltY291bnQpOwotCi0gIC8qIFRoaXMgaGFzIHRvIGhhcHBlbiBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIHNldC4gICovCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoaWJmZCwgY29weV9zZWN0aW9uLCAodm9pZCAqKSBvYmZkKTsKLQotICBpZiAoYWRkX3NlY3Rpb25zICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IHNlY3Rpb25fYWRkICpwYWRkOwotCi0gICAgICBmb3IgKHBhZGQgPSBhZGRfc2VjdGlvbnM7IHBhZGQgIT0gTlVMTDsgcGFkZCA9IHBhZGQtPm5leHQpCi0JewotCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBwYWRkLT5zZWN0aW9uLAotCQkJCQkgIChQVFIpIHBhZGQtPmNvbnRlbnRzLAotCQkJCQkgIChmaWxlX3B0cikgMCwKLQkJCQkJICAoYmZkX3NpemVfdHlwZSkgcGFkZC0+c2l6ZSkpCi0JICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGdhcF9maWxsX3NldCB8fCBwYWRfdG9fc2V0KQotICAgIHsKLSAgICAgIGJmZF9ieXRlICpidWY7Ci0gICAgICBpbnQgYywgaTsKLQotICAgICAgLyogRmlsbCBpbiB0aGUgZ2Fwcy4gICovCi0KLSAgICAgIGlmIChtYXhfZ2FwID4gODE5MikKLQltYXhfZ2FwID0gODE5MjsKLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChtYXhfZ2FwKTsKLSAgICAgIG1lbXNldCAoYnVmLCBnYXBfZmlsbCwgKHNpemVfdCkgbWF4X2dhcCk7Ci0KLSAgICAgIGMgPSBiZmRfY291bnRfc2VjdGlvbnMgKG9iZmQpOwotICAgICAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLQl7Ci0JICBpZiAoZ2Fwc1tpXSAhPSAwKQotCSAgICB7Ci0JICAgICAgYmZkX3NpemVfdHlwZSBsZWZ0OwotCSAgICAgIGZpbGVfcHRyIG9mZjsKLQotCSAgICAgIGxlZnQgPSBnYXBzW2ldOwotCSAgICAgIG9mZiA9IGJmZF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uc1tpXSkgLSBsZWZ0OwotCSAgICAgIHdoaWxlIChsZWZ0ID4gMCkKLQkJewotCQkgIGJmZF9zaXplX3R5cGUgbm93OwotCi0JCSAgaWYgKGxlZnQgPiA4MTkyKQotCQkgICAgbm93ID0gODE5MjsKLQkJICBlbHNlCi0JCSAgICBub3cgPSBsZWZ0OwotCi0JCSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbnNbaV0sIGJ1ZiwKLQkJCQkJCSAgb2ZmLCBub3cpKQotCQkgICAgUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLQkJICBsZWZ0IC09IG5vdzsKLQkJICBvZmYgKz0gbm93OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBCRkQgYmFja2VuZCB0byBjb3B5IGFueSBwcml2YXRlIGRhdGEgaXQgdW5kZXJzdGFuZHMKLSAgICAgZnJvbSB0aGUgaW5wdXQgQkZEIHRvIHRoZSBvdXRwdXQgQkZELiAgVGhpcyBpcyBkb25lIGxhc3QgdG8KLSAgICAgcGVybWl0IHRoZSByb3V0aW5lIHRvIGxvb2sgYXQgdGhlIGZpbHRlcmVkIHN5bWJvbCB0YWJsZSwgd2hpY2ggaXMKLSAgICAgaW1wb3J0YW50IGZvciB0aGUgRUNPRkYgY29kZSBhdCBsZWFzdC4gICovCi0gIGlmICghYmZkX2NvcHlfcHJpdmF0ZV9iZmRfZGF0YSAoaWJmZCwgb2JmZCkpCi0gICAgewotICAgICAgbm9uX2ZhdGFsIChfKCIlczogZXJyb3IgY29weWluZyBwcml2YXRlIEJGRCBkYXRhOiAlcyIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBzdGF0dXMgPSAxOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogUmVhZCBlYWNoIGFyY2hpdmUgZWxlbWVudCBpbiB0dXJuIGZyb20gSUJGRCwgY29weSB0aGUKLSAgIGNvbnRlbnRzIHRvIHRlbXAgZmlsZSwgYW5kIGtlZXAgdGhlIHRlbXAgZmlsZSBoYW5kbGUuICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9hcmNoaXZlIChpYmZkLCBvYmZkLCBvdXRwdXRfdGFyZ2V0KQotICAgICBiZmQgKmliZmQ7Ci0gICAgIGJmZCAqb2JmZDsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X3RhcmdldDsKLXsKLSAgc3RydWN0IG5hbWVfbGlzdAotICAgIHsKLSAgICAgIHN0cnVjdCBuYW1lX2xpc3QgKm5leHQ7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgYmZkICpvYmZkOwotICAgIH0gKmxpc3QsICpsOwotICBiZmQgKipwdHIgPSAmb2JmZC0+YXJjaGl2ZV9oZWFkOwotICBiZmQgKnRoaXNfZWxlbWVudDsKLSAgY2hhciAqZGlyID0gbWFrZV90ZW1wbmFtZSAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIC8qIE1ha2UgYSB0ZW1wIGRpcmVjdG9yeSB0byBob2xkIHRoZSBjb250ZW50cy4gICovCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotICBpZiAobWtkaXIgKGRpcikgIT0gMCkKLSNlbHNlCi0gIGlmIChta2RpciAoZGlyLCAwNzAwKSAhPSAwKQotI2VuZGlmCi0gICAgewotICAgICAgZmF0YWwgKF8oImNhbm5vdCBta2RpciAlcyBmb3IgYXJjaGl2ZSBjb3B5aW5nIChlcnJvcjogJXMpIiksCi0JICAgICBkaXIsIHN0cmVycm9yIChlcnJubykpOwotICAgIH0KLSAgb2JmZC0+aGFzX2FybWFwID0gaWJmZC0+aGFzX2FybWFwOwotCi0gIGxpc3QgPSBOVUxMOwotCi0gIHRoaXNfZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGliZmQsIE5VTEwpOwotICB3aGlsZSAoIXN0YXR1cyAmJiB0aGlzX2VsZW1lbnQgIT0gKGJmZCAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhbiBvdXRwdXQgZmlsZSBmb3IgdGhpcyBtZW1iZXIuICAqLwotICAgICAgY2hhciAqb3V0cHV0X25hbWUgPSBjb25jYXQgKGRpciwgIi8iLCBiZmRfZ2V0X2ZpbGVuYW1lICh0aGlzX2VsZW1lbnQpLAotCQkJCSAgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBiZmQgKm91dHB1dF9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9uYW1lLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGJmZCAqbGFzdF9lbGVtZW50OwotICAgICAgc3RydWN0IHN0YXQgYnVmOwotICAgICAgaW50IHN0YXRfc3RhdHVzID0gMDsKLQotICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQotCXsKLQkgIHN0YXRfc3RhdHVzID0gYmZkX3N0YXRfYXJjaF9lbHQgKHRoaXNfZWxlbWVudCwgJmJ1Zik7Ci0JICBpZiAoc3RhdF9zdGF0dXMgIT0gMCkKLQkgICAgbm9uX2ZhdGFsIChfKCJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIiksCi0JCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lICh0aGlzX2VsZW1lbnQpKTsKLQl9Ci0KLSAgICAgIGwgPSAoc3RydWN0IG5hbWVfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBuYW1lX2xpc3QpKTsKLSAgICAgIGwtPm5hbWUgPSBvdXRwdXRfbmFtZTsKLSAgICAgIGwtPm5leHQgPSBsaXN0OwotICAgICAgbGlzdCA9IGw7Ci0KLSAgICAgIGlmIChvdXRwdXRfYmZkID09IChiZmQgKikgTlVMTCkKLQlSRVRVUk5fTk9ORkFUQUwgKG91dHB1dF9uYW1lKTsKLQotICAgICAgaWYgKCFiZmRfc2V0X2Zvcm1hdCAob2JmZCwgYmZkX2dldF9mb3JtYXQgKGliZmQpKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLQotICAgICAgaWYgKGJmZF9jaGVja19mb3JtYXQgKHRoaXNfZWxlbWVudCwgYmZkX29iamVjdCkgPT0gdHJ1ZSkKLQljb3B5X29iamVjdCAodGhpc19lbGVtZW50LCBvdXRwdXRfYmZkKTsKLQotICAgICAgaWYgKCFiZmRfY2xvc2UgKG91dHB1dF9iZmQpKQotCXsKLQkgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAob3V0cHV0X2JmZCkpOwotCSAgLyogRXJyb3IgaW4gbmV3IG9iamVjdCBmaWxlLiBEb24ndCBjaGFuZ2UgYXJjaGl2ZS4gKi8KLQkgIHN0YXR1cyA9IDE7Ci0JfQotCi0gICAgICBpZiAocHJlc2VydmVfZGF0ZXMgJiYgc3RhdF9zdGF0dXMgPT0gMCkKLQlzZXRfdGltZXMgKG91dHB1dF9uYW1lLCAmYnVmKTsKLQotICAgICAgLyogT3BlbiB0aGUgbmV3bHkgb3V0cHV0IGZpbGUgYW5kIGF0dGFjaCB0byBvdXIgbGlzdC4gICovCi0gICAgICBvdXRwdXRfYmZkID0gYmZkX29wZW5yIChvdXRwdXRfbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0KLSAgICAgIGwtPm9iZmQgPSBvdXRwdXRfYmZkOwotCi0gICAgICAqcHRyID0gb3V0cHV0X2JmZDsKLSAgICAgIHB0ciA9ICZvdXRwdXRfYmZkLT5uZXh0OwotCi0gICAgICBsYXN0X2VsZW1lbnQgPSB0aGlzX2VsZW1lbnQ7Ci0KLSAgICAgIHRoaXNfZWxlbWVudCA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGliZmQsIGxhc3RfZWxlbWVudCk7Ci0KLSAgICAgIGJmZF9jbG9zZSAobGFzdF9lbGVtZW50KTsKLSAgICB9Ci0gICpwdHIgPSAoYmZkICopIE5VTEw7Ci0KLSAgaWYgKCFiZmRfY2xvc2UgKG9iZmQpKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAob2JmZCkpOwotCi0gIGlmICghYmZkX2Nsb3NlIChpYmZkKSkKLSAgICBSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICAvKiBEZWxldGUgYWxsIHRoZSBmaWxlcyB0aGF0IHdlIG9wZW5lZC4gICovCi0gIGZvciAobCA9IGxpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChsLT5vYmZkKTsKLSAgICAgIHVubGluayAobC0+bmFtZSk7Ci0gICAgfQotICBybWRpciAoZGlyKTsKLX0KLQotLyogVGhlIHRvcC1sZXZlbCBjb250cm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KQotICAgICBjb25zdCBjaGFyICppbnB1dF9maWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqb3V0cHV0X2ZpbGVuYW1lOwotICAgICBjb25zdCBjaGFyICppbnB1dF90YXJnZXQ7Ci0gICAgIGNvbnN0IGNoYXIgKm91dHB1dF90YXJnZXQ7Ci17Ci0gIGJmZCAqaWJmZDsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIC8qIFRvIGFsbG93IHVzIHRvIGRvICJzdHJpcCAqIiB3aXRob3V0IGR5aW5nIG9uIHRoZSBmaXJzdAotICAgICBub24tb2JqZWN0IGZpbGUsIGZhaWx1cmVzIGFyZSBub25mYXRhbC4gICovCi0KLSAgaWJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZW5hbWUsIGlucHV0X3RhcmdldCk7Ci0gIGlmIChpYmZkID09IE5VTEwpCi0gICAgUkVUVVJOX05PTkZBVEFMIChpbnB1dF9maWxlbmFtZSk7Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGliZmQsIGJmZF9hcmNoaXZlKSkKLSAgICB7Ci0gICAgICBiZmQgKm9iZmQ7Ci0KLSAgICAgIC8qIGJmZF9nZXRfdGFyZ2V0IGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB1bnRpbAotICAgICAgICAgYmZkX2NoZWNrX2Zvcm1hdCBzdWNjZWVkcy4gICovCi0gICAgICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCW91dHB1dF90YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAoaWJmZCk7Ci0KLSAgICAgIG9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAob2JmZCA9PSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9hcmNoaXZlIChpYmZkLCBvYmZkLCBvdXRwdXRfdGFyZ2V0KTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoaWJmZCwgYmZkX29iamVjdCwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBiZmQgKm9iZmQ7Ci0KLSAgICAgIC8qIGJmZF9nZXRfdGFyZ2V0IGRvZXMgbm90IHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB1bnRpbAotICAgICAgICAgYmZkX2NoZWNrX2Zvcm1hdCBzdWNjZWVkcy4gICovCi0gICAgICBpZiAob3V0cHV0X3RhcmdldCA9PSBOVUxMKQotCW91dHB1dF90YXJnZXQgPSBiZmRfZ2V0X3RhcmdldCAoaWJmZCk7Ci0KLSAgICAgIG9iZmQgPSBiZmRfb3BlbncgKG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0gICAgICBpZiAob2JmZCA9PSBOVUxMKQotCVJFVFVSTl9OT05GQVRBTCAob3V0cHV0X2ZpbGVuYW1lKTsKLQotICAgICAgY29weV9vYmplY3QgKGliZmQsIG9iZmQpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAob2JmZCkpCi0JUkVUVVJOX05PTkZBVEFMIChvdXRwdXRfZmlsZW5hbWUpOwotCi0gICAgICBpZiAoIWJmZF9jbG9zZSAoaWJmZCkpCi0JUkVUVVJOX05PTkZBVEFMIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlbmFtZSk7Ci0gICAgICAKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgCi0gICAgICBzdGF0dXMgPSAxOwotICAgIH0KLX0KLQotLyogQ3JlYXRlIGEgc2VjdGlvbiBpbiBPQkZEIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgYXR0cmlidXRlcwotICAgYXMgSVNFQ1RJT04gaW4gSUJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi1zZXR1cF9zZWN0aW9uIChpYmZkLCBpc2VjdGlvbiwgb2JmZGFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgb2JmZGFyZzsKLXsKLSAgYmZkICpvYmZkID0gKGJmZCAqKSBvYmZkYXJnOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBzZWNfcHRyIG9zZWN0aW9uOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF92bWEgdm1hOwotICBiZmRfdm1hIGxtYTsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGNoYXIgKmVycjsKLQotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0RFQlVHR0lORykgIT0gMAotICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0JICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCi0JICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCi0gICAgcmV0dXJuOwotCi0gIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAoYmZkX3NlY3Rpb25fbmFtZSAoaWJmZCwgaXNlY3Rpb24pLCBmYWxzZSk7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgcC0+dXNlZCA9IHRydWU7Ci0KLSAgaWYgKHNlY3Rpb25zX3JlbW92ZWQgJiYgcCAhPSBOVUxMICYmIHAtPnJlbW92ZSkKLSAgICByZXR1cm47Ci0gIGlmIChzZWN0aW9uc19jb3BpZWQgJiYgKHAgPT0gTlVMTCB8fCAhIHAtPmNvcHkpKQotICAgIHJldHVybjsKLQotICBvc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChvYmZkLCBiZmRfc2VjdGlvbl9uYW1lIChpYmZkLCBpc2VjdGlvbikpOwotICAKLSAgaWYgKG9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgZXJyID0gIm1ha2luZyI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAoY29weV9ieXRlID49IDApCi0gICAgc2l6ZSA9IChzaXplICsgaW50ZXJsZWF2ZSAtIDEpIC8gaW50ZXJsZWF2ZTsKLSAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX3NpemUgKG9iZmQsIG9zZWN0aW9uLCBzaXplKSkKLSAgICB7Ci0gICAgICBlcnIgPSAic2l6ZSI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLSAgCi0gIHZtYSA9IGJmZF9zZWN0aW9uX3ZtYSAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocCAhPSBOVUxMICYmIHAtPmNoYW5nZV92bWEgPT0gQ0hBTkdFX01PRElGWSkKLSAgICB2bWEgKz0gcC0+dm1hX3ZhbDsKLSAgZWxzZSBpZiAocCAhPSBOVUxMICYmIHAtPmNoYW5nZV92bWEgPT0gQ0hBTkdFX1NFVCkKLSAgICB2bWEgPSBwLT52bWFfdmFsOwotICBlbHNlCi0gICAgdm1hICs9IGNoYW5nZV9zZWN0aW9uX2FkZHJlc3M7Ci0gIAotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fdm1hIChvYmZkLCBvc2VjdGlvbiwgdm1hKSkKLSAgICB7Ci0gICAgICBlcnIgPSAidm1hIjsKLSAgICAgIGdvdG8gbG9zZXI7Ci0gICAgfQotCi0gIGxtYSA9IGlzZWN0aW9uLT5sbWE7Ci0gIGlmICgocCAhPSBOVUxMKSAmJiBwLT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCi0gICAgewotICAgICAgaWYgKHAtPmNoYW5nZV9sbWEgPT0gQ0hBTkdFX01PRElGWSkKLQlsbWEgKz0gcC0+bG1hX3ZhbDsKLSAgICAgIGVsc2UgaWYgKHAtPmNoYW5nZV9sbWEgPT0gQ0hBTkdFX1NFVCkKLQlsbWEgPSBwLT5sbWFfdmFsOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotICAgIH0KLSAgZWxzZQotICAgIGxtYSArPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOwotICAKLSAgb3NlY3Rpb24tPmxtYSA9IGxtYTsKLQotICAvKiBGSVhNRTogVGhpcyBpcyBwcm9iYWJseSBub3QgZW5vdWdoLiAgSWYgd2UgY2hhbmdlIHRoZSBMTUEgd2UKLSAgICAgbWF5IGhhdmUgdG8gcmVjb21wdXRlIHRoZSBoZWFkZXIgZm9yIHRoZSBmaWxlIGFzIHdlbGwuICAqLwotICBpZiAoYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwKLQkJCQkgb3NlY3Rpb24sCi0JCQkJIGJmZF9zZWN0aW9uX2FsaWdubWVudCAoaWJmZCwgaXNlY3Rpb24pKQotICAgICAgPT0gZmFsc2UpCi0gICAgewotICAgICAgZXJyID0gImFsaWdubWVudCI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pOwotICBpZiAocCAhPSBOVUxMICYmIHAtPnNldF9mbGFncykKLSAgICBmbGFncyA9IHAtPmZsYWdzIHwgKGZsYWdzICYgU0VDX0hBU19DT05URU5UUyk7Ci0gIGlmICghYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBvc2VjdGlvbiwgZmxhZ3MpKQotICAgIHsKLSAgICAgIGVyciA9ICJmbGFncyI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICAvKiBUaGlzIHVzZWQgdG8gYmUgbWFuZ2xlX3NlY3Rpb247IHdlIGRvIGhlcmUgdG8gYXZvaWQgdXNpbmcKLSAgICAgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgc2luY2Ugc29tZSBmb3JtYXRzIGFsbG93IG11bHRpcGxlCi0gICAgIHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgbmFtZS4gICovCi0gIGlzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IG9zZWN0aW9uOwotICBpc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IDA7Ci0KLSAgLyogQWxsb3cgdGhlIEJGRCBiYWNrZW5kIHRvIGNvcHkgYW55IHByaXZhdGUgZGF0YSBpdCB1bmRlcnN0YW5kcwotICAgICBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uIHRvIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGlmICghYmZkX2NvcHlfcHJpdmF0ZV9zZWN0aW9uX2RhdGEgKGliZmQsIGlzZWN0aW9uLCBvYmZkLCBvc2VjdGlvbikpCi0gICAgewotICAgICAgZXJyID0gInByaXZhdGUgZGF0YSI7Ci0gICAgICBnb3RvIGxvc2VyOwotICAgIH0KLQotICAvKiBBbGwgd2VudCB3ZWxsICovCi0gIHJldHVybjsKLQotbG9zZXI6Ci0gIG5vbl9mYXRhbCAoXygiJXM6IHNlY3Rpb24gYCVzJzogZXJyb3IgaW4gJXM6ICVzIiksCi0JICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSwKLQkgICAgIGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSwKLQkgICAgIGVyciwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICBzdGF0dXMgPSAxOwotfQotCi0vKiBDb3B5IHRoZSBkYXRhIG9mIGlucHV0IHNlY3Rpb24gSVNFQ1RJT04gb2YgSUJGRAotICAgdG8gYW4gb3V0cHV0IHNlY3Rpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGluIE9CRkQuCi0gICBJZiBzdHJpcHBpbmcgdGhlbiBkb24ndCBjb3B5IGFueSByZWxvY2F0aW9uIGluZm8uICAqLwotCi1zdGF0aWMgdm9pZAotY29weV9zZWN0aW9uIChpYmZkLCBpc2VjdGlvbiwgb2JmZGFyZykKLSAgICAgYmZkICppYmZkOwotICAgICBzZWNfcHRyIGlzZWN0aW9uOwotICAgICBQVFIgb2JmZGFyZzsKLXsKLSAgYmZkICpvYmZkID0gKGJmZCAqKSBvYmZkYXJnOwotICBzdHJ1Y3Qgc2VjdGlvbl9saXN0ICpwOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIHNlY19wdHIgb3NlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgbG9uZyByZWxzaXplOwotCi0gIC8qIElmIHdlIGhhdmUgYWxyZWFkeSBmYWlsZWQgZWFybGllciBvbiwgZG8gbm90IGtlZXAgb24gZ2VuZXJhdGluZwotICAgICBjb21wbGFpbnRzIG5vdy4gICovCi0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICByZXR1cm47Ci0gIAotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0RFQlVHR0lORykgIT0gMAotICAgICAgJiYgKHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfREVCVUcKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfVU5ORUVERUQKLQkgIHx8IHN0cmlwX3N5bWJvbHMgPT0gU1RSSVBfQUxMCi0JICB8fCBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfQUxMCi0JICB8fCBjb252ZXJ0X2RlYnVnZ2luZykpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKGJmZF9zZWN0aW9uX25hbWUgKGliZmQsIGlzZWN0aW9uKSwgZmFsc2UpOwotCi0gIGlmIChzZWN0aW9uc19yZW1vdmVkICYmIHAgIT0gTlVMTCAmJiBwLT5yZW1vdmUpCi0gICAgcmV0dXJuOwotICBpZiAoc2VjdGlvbnNfY29waWVkICYmIChwID09IE5VTEwgfHwgISBwLT5jb3B5KSkKLSAgICByZXR1cm47Ci0KLSAgb3NlY3Rpb24gPSBpc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKGlzZWN0aW9uKTsKLQotICBpZiAoc2l6ZSA9PSAwIHx8IG9zZWN0aW9uID09IDApCi0gICAgcmV0dXJuOwotCi0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGliZmQsIGlzZWN0aW9uKTsKLSAgaWYgKHJlbHNpemUgPCAwKQotICAgIFJFVFVSTl9OT05GQVRBTCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotICAKLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICBiZmRfc2V0X3JlbG9jIChvYmZkLCBvc2VjdGlvbiwgKGFyZWxlbnQgKiopIE5VTEwsIDApOwotICBlbHNlCi0gICAgewotICAgICAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gICAgICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGliZmQsIGlzZWN0aW9uLCByZWxwcCwgaXN5bXBwKTsKLSAgICAgIGlmIChyZWxjb3VudCA8IDApCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0gICAgICAKLSAgICAgIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX0FMTCkKLQl7Ci0JICAvKiBSZW1vdmUgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIG5vdCBpbgotCSAgICAga2VlcF9zdHJpcF9zcGVjaWZpY19saXN0LiAqLwotCSAgYXJlbGVudCAqKnRlbXBfcmVscHA7Ci0JICBsb25nIHRlbXBfcmVsY291bnQgPSAwOwotCSAgbG9uZyBpOwotCSAgCi0JICB0ZW1wX3JlbHBwID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotCSAgZm9yIChpID0gMDsgaSA8IHJlbGNvdW50OyBpKyspCi0JICAgIGlmIChpc19zcGVjaWZpZWRfc3ltYm9sCi0JCShiZmRfYXN5bWJvbF9uYW1lICgqcmVscHAgW2ldLT5zeW1fcHRyX3B0ciksCi0JCSBrZWVwX3NwZWNpZmljX2xpc3QpKQotCSAgICAgIHRlbXBfcmVscHAgW3RlbXBfcmVsY291bnQrK10gPSByZWxwcCBbaV07Ci0JICByZWxjb3VudCA9IHRlbXBfcmVsY291bnQ7Ci0JICBmcmVlIChyZWxwcCk7Ci0JICByZWxwcCA9IHRlbXBfcmVscHA7Ci0JfQotICAgICAgYmZkX3NldF9yZWxvYyAob2JmZCwgb3NlY3Rpb24sCi0JCSAgICAgKHJlbGNvdW50ID09IDAgPyAoYXJlbGVudCAqKikgTlVMTCA6IHJlbHBwKSwgcmVsY291bnQpOwotICAgIH0KLSAgCi0gIGlzZWN0aW9uLT5fY29va2VkX3NpemUgPSBpc2VjdGlvbi0+X3Jhd19zaXplOwotICBpc2VjdGlvbi0+cmVsb2NfZG9uZSA9IHRydWU7Ci0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoaWJmZCwgaXNlY3Rpb24pICYgU0VDX0hBU19DT05URU5UUykKLSAgICB7Ci0gICAgICBQVFIgbWVtaHVuayA9IChQVFIpIHhtYWxsb2MgKCh1bnNpZ25lZCkgc2l6ZSk7Ci0KLSAgICAgIGlmICghYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpYmZkLCBpc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgc2l6ZSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChpYmZkKSk7Ci0KLSAgICAgIGlmIChjb3B5X2J5dGUgPj0gMCkgCi0JZmlsdGVyX2J5dGVzIChtZW1odW5rLCAmc2l6ZSk7Ci0KLSAgICAgIGlmICghYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBvc2VjdGlvbiwgbWVtaHVuaywgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAgc2l6ZSkpCi0JUkVUVVJOX05PTkZBVEFMIChiZmRfZ2V0X2ZpbGVuYW1lIChvYmZkKSk7Ci0KLSAgICAgIGZyZWUgKG1lbWh1bmspOwotICAgIH0KLSAgZWxzZSBpZiAocCAhPSBOVUxMICYmIHAtPnNldF9mbGFncyAmJiAocC0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotICAgIHsKLSAgICAgIFBUUiBtZW1odW5rID0gKFBUUikgeG1hbGxvYyAoKHVuc2lnbmVkKSBzaXplKTsKLQotICAgICAgLyogV2UgZG9uJ3QgcGVybWl0IHRoZSB1c2VyIHRvIHR1cm4gb2ZmIHRoZSBTRUNfSEFTX0NPTlRFTlRTCi0JIGZsYWctLXRoZXkgY2FuIGp1c3QgcmVtb3ZlIHRoZSBzZWN0aW9uIGVudGlyZWx5IGFuZCBhZGQgaXQKLQkgYmFjayBhZ2Fpbi4gIEhvd2V2ZXIsIHdlIGRvIHBlcm1pdCB0aGVtIHRvIHR1cm4gb24gdGhlCi0JIFNFQ19IQVNfQ09OVEVOVFMgZmxhZywgYW5kIHRha2UgaXQgdG8gbWVhbiB0aGF0IHRoZSBzZWN0aW9uCi0JIGNvbnRlbnRzIHNob3VsZCBiZSB6ZXJvZWQgb3V0LiAgKi8KLQotICAgICAgbWVtc2V0IChtZW1odW5rLCAwLCBzaXplKTsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAob2JmZCwgb3NlY3Rpb24sIG1lbWh1bmssIChmaWxlX3B0cikgMCwKLQkJCQkgICAgICBzaXplKSkKLQlSRVRVUk5fTk9ORkFUQUwgKGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpKTsKLSAgICAgIGZyZWUgKG1lbWh1bmspOwotICAgIH0KLX0KLQotLyogR2V0IGFsbCB0aGUgc2VjdGlvbnMuICBUaGlzIGlzIHVzZWQgd2hlbiAtLWdhcC1maWxsIG9yIC0tcGFkLXRvIGlzCi0gICB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdldF9zZWN0aW9ucyAob2JmZCwgb3NlY3Rpb24sIHNlY3BwcGFyZykKLSAgICAgYmZkICpvYmZkOwotICAgICBhc2VjdGlvbiAqb3NlY3Rpb247Ci0gICAgIFBUUiBzZWNwcHBhcmc7Ci17Ci0gIGFzZWN0aW9uICoqKnNlY3BwcCA9IChhc2VjdGlvbiAqKiopIHNlY3BwcGFyZzsKLQotICAqKnNlY3BwcCA9IG9zZWN0aW9uOwotICArKygqc2VjcHBwKTsKLX0KLQotLyogU29ydCBzZWN0aW9ucyBieSBWTUEuICBUaGlzIGlzIGNhbGxlZCB2aWEgcXNvcnQsIGFuZCBpcyB1c2VkIHdoZW4KLSAgIC0tZ2FwLWZpbGwgb3IgLS1wYWQtdG8gaXMgdXNlZC4gIFdlIGZvcmNlIG5vbiBsb2FkYWJsZSBvciBlbXB0eQotICAgc2VjdGlvbnMgdG8gdGhlIGZyb250LCB3aGVyZSB0aGV5IGFyZSBlYXNpZXIgdG8gaWdub3JlLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9zZWN0aW9uX2xtYSAoYXJnMSwgYXJnMikKLSAgICAgY29uc3QgUFRSIGFyZzE7Ci0gICAgIGNvbnN0IFBUUiBhcmcyOwotewotICBjb25zdCBhc2VjdGlvbiAqKnNlYzEgPSAoY29uc3QgYXNlY3Rpb24gKiopIGFyZzE7Ci0gIGNvbnN0IGFzZWN0aW9uICoqc2VjMiA9IChjb25zdCBhc2VjdGlvbiAqKikgYXJnMjsKLSAgZmxhZ3dvcmQgZmxhZ3MxLCBmbGFnczI7Ci0KLSAgLyogU29ydCBub24gbG9hZGFibGUgc2VjdGlvbnMgdG8gdGhlIGZyb250LiAgKi8KLSAgZmxhZ3MxID0gKCpzZWMxKS0+ZmxhZ3M7Ci0gIGZsYWdzMiA9ICgqc2VjMiktPmZsYWdzOwotICBpZiAoKGZsYWdzMSAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLSAgICAgIHx8IChmbGFnczEgJiBTRUNfTE9BRCkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKGZsYWdzMiAmIFNFQ19IQVNfQ09OVEVOVFMpICE9IDAKLQkgICYmIChmbGFnczIgJiBTRUNfTE9BRCkgIT0gMCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChmbGFnczIgJiBTRUNfSEFTX0NPTlRFTlRTKSA9PSAwCi0JICB8fCAoZmxhZ3MyICYgU0VDX0xPQUQpID09IDApCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIC8qIFNvcnQgc2VjdGlvbnMgYnkgTE1BLiAgKi8KLSAgaWYgKCgqc2VjMSktPmxtYSA+ICgqc2VjMiktPmxtYSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoKCpzZWMxKS0+bG1hIDwgKCpzZWMyKS0+bG1hKQotICAgIHJldHVybiAtMTsKLQotICAvKiBTb3J0IHNlY3Rpb25zIHdpdGggdGhlIHNhbWUgTE1BIGJ5IHNpemUuICAqLwotICBpZiAoKCpzZWMxKS0+X3Jhd19zaXplID4gKCpzZWMyKS0+X3Jhd19zaXplKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmICgoKnNlYzEpLT5fcmF3X3NpemUgPCAoKnNlYzIpLT5fcmF3X3NpemUpCi0gICAgcmV0dXJuIC0xOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBNYXJrIGFsbCB0aGUgc3ltYm9scyB3aGljaCB3aWxsIGJlIHVzZWQgaW4gb3V0cHV0IHJlbG9jYXRpb25zIHdpdGgKLSAgIHRoZSBCU0ZfS0VFUCBmbGFnIHNvIHRoYXQgdGhvc2Ugc3ltYm9scyB3aWxsIG5vdCBiZSBzdHJpcHBlZC4KLQotICAgSWdub3JlIHJlbG9jYXRpb25zIHdoaWNoIHdpbGwgbm90IGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotbWFya19zeW1ib2xzX3VzZWRfaW5fcmVsb2NhdGlvbnMgKGliZmQsIGlzZWN0aW9uLCBzeW1ib2xzYXJnKQotICAgICBiZmQgKmliZmQ7Ci0gICAgIHNlY19wdHIgaXNlY3Rpb247Ci0gICAgIFBUUiBzeW1ib2xzYXJnOwotewotICBhc3ltYm9sICoqc3ltYm9scyA9IChhc3ltYm9sICoqKSBzeW1ib2xzYXJnOwotICBsb25nIHJlbHNpemU7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudCwgaTsKLQotICAvKiBJZ25vcmUgYW4gaW5wdXQgc2VjdGlvbiB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHNlY3Rpb24uICAqLwotICBpZiAoaXNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChpYmZkLCBpc2VjdGlvbik7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGliZmQpKTsKLQotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChpYmZkLCBpc2VjdGlvbiwgcmVscHAsIHN5bWJvbHMpOwotICBpZiAocmVsY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoaWJmZCkpOwotCi0gIC8qIEV4YW1pbmUgZWFjaCBzeW1ib2wgdXNlZCBpbiBhIHJlbG9jYXRpb24uICBJZiBpdCdzIG5vdCBvbmUgb2YgdGhlCi0gICAgIHNwZWNpYWwgYmZkIHNlY3Rpb24gc3ltYm9scywgdGhlbiBtYXJrIGl0IHdpdGggQlNGX0tFRVAuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgcmVsY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciAhPSBiZmRfY29tX3NlY3Rpb25fcHRyLT5zeW1ib2wKLQkgICYmICpyZWxwcFtpXS0+c3ltX3B0cl9wdHIgIT0gYmZkX2Fic19zZWN0aW9uX3B0ci0+c3ltYm9sCi0JICAmJiAqcmVscHBbaV0tPnN5bV9wdHJfcHRyICE9IGJmZF91bmRfc2VjdGlvbl9wdHItPnN5bWJvbCkKLQkoKnJlbHBwW2ldLT5zeW1fcHRyX3B0ciktPmZsYWdzIHw9IEJTRl9LRUVQOwotICAgIH0KLQotICBpZiAocmVscHAgIT0gTlVMTCkKLSAgICBmcmVlIChyZWxwcCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotd3JpdGVfZGVidWdnaW5nX2luZm8gKG9iZmQsIGRoYW5kbGUsIHN5bWNvdW50cCwgc3ltcHBwKQotICAgICBiZmQgKm9iZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBsb25nICpzeW1jb3VudHA7Ci0gICAgIGFzeW1ib2wgKioqc3ltcHBwOwotewotICBpZiAoYmZkX2dldF9mbGF2b3VyIChvYmZkKSA9PSBiZmRfdGFyZ2V0X2llZWVfZmxhdm91cikKLSAgICByZXR1cm4gd3JpdGVfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAob2JmZCwgZGhhbmRsZSk7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIKLSAgICAgIHx8IGJmZF9nZXRfZmxhdm91ciAob2JmZCkgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICB7Ci0gICAgICBiZmRfYnl0ZSAqc3ltcywgKnN0cmluZ3M7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN5bXNpemUsIHN0cmluZ3NpemU7Ci0gICAgICBhc2VjdGlvbiAqc3RhYnNlYywgKnN0YWJzdHJzZWM7Ci0KLSAgICAgIGlmICghIHdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvIChvYmZkLCBkaGFuZGxlLCAmc3ltcywKLQkJCQkJCSAgICAmc3ltc2l6ZSwgJnN0cmluZ3MsCi0JCQkJCQkgICAgJnN0cmluZ3NpemUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgc3RhYnNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsICIuc3RhYiIpOwotICAgICAgc3RhYnN0cnNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKG9iZmQsICIuc3RhYnN0ciIpOwotICAgICAgaWYgKHN0YWJzZWMgPT0gTlVMTAotCSAgfHwgc3RhYnN0cnNlYyA9PSBOVUxMCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChvYmZkLCBzdGFic2VjLCBzeW1zaXplKQotCSAgfHwgISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAob2JmZCwgc3RhYnN0cnNlYywgc3RyaW5nc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgc3RhYnNlYywgMikKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAob2JmZCwgc3RhYnN0cnNlYywgMCkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChvYmZkLCBzdGFic2VjLAotCQkJCSAgIChTRUNfSEFTX0NPTlRFTlRTCi0JCQkJICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJICAgIHwgU0VDX0RFQlVHR0lORykpCi0JICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAob2JmZCwgc3RhYnN0cnNlYywKLQkJCQkgICAgICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgICB8IFNFQ19ERUJVR0dJTkcpKSkKLQl7Ci0JICBub25fZmF0YWwgKF8oIiVzOiBjYW4ndCBjcmVhdGUgZGVidWdnaW5nIHNlY3Rpb246ICVzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgLyogV2UgY2FuIGdldCBhd2F5IHdpdGggc2V0dGluZyB0aGUgc2VjdGlvbiBjb250ZW50cyBub3cgYmVjYXVzZQotICAgICAgICAgdGhlIG5leHQgdGhpbmcgdGhlIGNhbGxlciBpcyBnb2luZyB0byBkbyBpcyBjb3B5IG92ZXIgdGhlCi0gICAgICAgICByZWFsIHNlY3Rpb25zLiAgV2UgbWF5IHNvbWVkYXkgaGF2ZSB0byBzcGxpdCB0aGUgY29udGVudHMKLSAgICAgICAgIHNldHRpbmcgb3V0IG9mIHRoaXMgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBzdGFic2VjLCBzeW1zLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgICAgc3ltc2l6ZSkKLQkgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChvYmZkLCBzdGFic3Ryc2VjLCBzdHJpbmdzLAotCQkJCQkgKGZpbGVfcHRyKSAwLCBzdHJpbmdzaXplKSkKLQl7Ci0JICBub25fZmF0YWwgKF8oIiVzOiBjYW4ndCBzZXQgZGVidWdnaW5nIHNlY3Rpb24gY29udGVudHM6ICVzIiksCi0JCSAgICAgYmZkX2dldF9maWxlbmFtZSAob2JmZCksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIG5vbl9mYXRhbCAoXygiJXM6IGRvbid0IGtub3cgaG93IHRvIHdyaXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgJXMiKSwKLQkgICAgIGJmZF9nZXRfZmlsZW5hbWUgKG9iZmQpLCBiZmRfZ2V0X3RhcmdldCAob2JmZCkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQKLXN0cmlwX21haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0gIGNoYXIgKmlucHV0X3RhcmdldCA9IE5VTEwsICpvdXRwdXRfdGFyZ2V0ID0gTlVMTDsKLSAgYm9vbGVhbiBzaG93X3ZlcnNpb24gPSBmYWxzZTsKLSAgaW50IGMsIGk7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIGNoYXIgKm91dHB1dF9maWxlID0gTlVMTDsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIkk6TzpGOks6TjpSOm86c1NwZ3hYVnYiLAotCQkJICAgc3RyaXBfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnSSc6Ci0JICBpbnB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIGlucHV0X3RhcmdldCA9IG91dHB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdSJzoKLQkgIHAgPSBmaW5kX3NlY3Rpb25fbGlzdCAob3B0YXJnLCB0cnVlKTsKLQkgIHAtPnJlbW92ZSA9IHRydWU7Ci0JICBzZWN0aW9uc19yZW1vdmVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0FMTDsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCWNhc2UgJ2cnOgotCSAgc3RyaXBfc3ltYm9scyA9IFNUUklQX0RFQlVHOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fU1RSSVBfVU5ORUVERUQ6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfVU5ORUVERUQ7Ci0JICBicmVhazsKLQljYXNlICdLJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmtlZXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJnN0cmlwX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnbyc6Ci0JICBvdXRwdXRfZmlsZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgcHJlc2VydmVfZGF0ZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19BTEw7Ci0JICBicmVhazsKLQljYXNlICdYJzoKLQkgIGRpc2NhcmRfbG9jYWxzID0gTE9DQUxTX1NUQVJUX0w7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHZlcmJvc2UgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVic6Ci0JICBzaG93X3ZlcnNpb24gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KLQljYXNlICdoJzoKLQkgIHN0cmlwX3VzYWdlIChzdGRvdXQsIDApOwotCWRlZmF1bHQ6Ci0JICBzdHJpcF91c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoInN0cmlwIik7Ci0KLSAgLyogRGVmYXVsdCBpcyB0byBzdHJpcCBhbGwgc3ltYm9scy4gICovCi0gIGlmIChzdHJpcF9zeW1ib2xzID09IFNUUklQX1VOREVGCi0gICAgICAmJiBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfVU5ERUYKLSAgICAgICYmIHN0cmlwX3NwZWNpZmljX2xpc3QgPT0gTlVMTCkKLSAgICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOwotCi0gIGlmIChvdXRwdXRfdGFyZ2V0ID09IChjaGFyICopIE5VTEwpCi0gICAgb3V0cHV0X3RhcmdldCA9IGlucHV0X3RhcmdldDsKLQotICBpID0gb3B0aW5kOwotICBpZiAoaSA9PSBhcmdjCi0gICAgICB8fCAob3V0cHV0X2ZpbGUgIT0gTlVMTCAmJiAoaSArIDEpIDwgYXJnYykpCi0gICAgc3RyaXBfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgZm9yICg7IGkgPCBhcmdjOyBpKyspCi0gICAgewotICAgICAgaW50IGhvbGRfc3RhdHVzID0gc3RhdHVzOwotICAgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKLSAgICAgIGNoYXIgKnRtcG5hbWU7Ci0KLSAgICAgIGlmIChwcmVzZXJ2ZV9kYXRlcykKLQl7Ci0JICBpZiAoc3RhdCAoYXJndltpXSwgJnN0YXRidWYpIDwgMCkKLQkgICAgewotCSAgICAgIG5vbl9mYXRhbCAoXygiJXM6IGNhbm5vdCBzdGF0OiAlcyIpLCBhcmd2W2ldLCBzdHJlcnJvciAoZXJybm8pKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKG91dHB1dF9maWxlICE9IE5VTEwpCi0JdG1wbmFtZSA9IG91dHB1dF9maWxlOwotICAgICAgZWxzZQotCXRtcG5hbWUgPSBtYWtlX3RlbXBuYW1lIChhcmd2W2ldKTsKLSAgICAgIHN0YXR1cyA9IDA7Ci0KLSAgICAgIGNvcHlfZmlsZSAoYXJndltpXSwgdG1wbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCkKLQl7Ci0JICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JICAgIHNldF90aW1lcyAodG1wbmFtZSwgJnN0YXRidWYpOwotCSAgaWYgKG91dHB1dF9maWxlID09IE5VTEwpCi0JICAgIHNtYXJ0X3JlbmFtZSAodG1wbmFtZSwgYXJndltpXSwgcHJlc2VydmVfZGF0ZXMpOwotCSAgc3RhdHVzID0gaG9sZF9zdGF0dXM7Ci0JfQotICAgICAgZWxzZQotCXVubGluayAodG1wbmFtZSk7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGUgPT0gTlVMTCkKLQlmcmVlICh0bXBuYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvcHlfbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSAgY2hhciAqaW5wdXRfZmlsZW5hbWUgPSBOVUxMLCAqb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLSAgY2hhciAqaW5wdXRfdGFyZ2V0ID0gTlVMTCwgKm91dHB1dF90YXJnZXQgPSBOVUxMOwotICBib29sZWFuIHNob3dfdmVyc2lvbiA9IGZhbHNlOwotICBib29sZWFuIGNoYW5nZV93YXJuID0gdHJ1ZTsKLSAgaW50IGM7Ci0gIHN0cnVjdCBzZWN0aW9uX2xpc3QgKnA7Ci0gIHN0cnVjdCBzdGF0IHN0YXRidWY7Ci0KLSAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJiOmk6STpqOks6TjpzOk86ZDpGOkw6UjpTcGd4WFZ2VzoiLAotCQkJICAgY29weV9vcHRpb25zLCAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdiJzoKLQkgIGNvcHlfYnl0ZSA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAoY29weV9ieXRlIDwgMCkKLQkgICAgZmF0YWwgKF8oImJ5dGUgbnVtYmVyIG11c3QgYmUgbm9uLW5lZ2F0aXZlIikpOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JICBpbnRlcmxlYXZlID0gYXRvaSAob3B0YXJnKTsKLQkgIGlmIChpbnRlcmxlYXZlIDwgMSkKLQkgICAgZmF0YWwgKF8oImludGVybGVhdmUgbXVzdCBiZSBwb3NpdGl2ZSIpKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCWNhc2UgJ3MnOgkJLyogInNvdXJjZSIgLSAnSScgaXMgcHJlZmVycmVkICovCi0JICBpbnB1dF90YXJnZXQgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQljYXNlICdkJzoJCS8qICJkZXN0aW5hdGlvbiIgLSAnTycgaXMgcHJlZmVycmVkICovCi0JICBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnRic6Ci0JICBpbnB1dF90YXJnZXQgPSBvdXRwdXRfdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG9wdGFyZywgdHJ1ZSk7Ci0JICBpZiAocC0+cmVtb3ZlKQotCSAgICBmYXRhbCAoXygiJXMgYm90aCBjb3BpZWQgYW5kIHJlbW92ZWQiKSwgb3B0YXJnKTsKLQkgIHAtPmNvcHkgPSB0cnVlOwotCSAgc2VjdGlvbnNfY29waWVkID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChvcHRhcmcsIHRydWUpOwotCSAgaWYgKHAtPmNvcHkpCi0JICAgIGZhdGFsIChfKCIlcyBib3RoIGNvcGllZCBhbmQgcmVtb3ZlZCIpLCBvcHRhcmcpOwotCSAgcC0+cmVtb3ZlID0gdHJ1ZTsKLQkgIHNlY3Rpb25zX3JlbW92ZWQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnZyc6Ci0JICBzdHJpcF9zeW1ib2xzID0gU1RSSVBfREVCVUc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVFJJUF9VTk5FRURFRDoKLQkgIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTk5FRURFRDsKLQkgIGJyZWFrOwotCWNhc2UgJ0snOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAma2VlcF9zcGVjaWZpY19saXN0KTsKLQkgIGJyZWFrOwotCWNhc2UgJ04nOgotCSAgYWRkX3NwZWNpZmljX3N5bWJvbCAob3B0YXJnLCAmc3RyaXBfc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLQkgIGFkZF9zcGVjaWZpY19zeW1ib2wgKG9wdGFyZywgJmxvY2FsaXplX3NwZWNpZmljX2xpc3QpOwotCSAgYnJlYWs7Ci0JY2FzZSAnVyc6Ci0JICBhZGRfc3BlY2lmaWNfc3ltYm9sIChvcHRhcmcsICZ3ZWFrZW5fc3BlY2lmaWNfbGlzdCk7Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIHByZXNlcnZlX2RhdGVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfQUxMOwotCSAgYnJlYWs7Ci0JY2FzZSAnWCc6Ci0JICBkaXNjYXJkX2xvY2FscyA9IExPQ0FMU19TVEFSVF9MOwotCSAgYnJlYWs7Ci0JY2FzZSAndic6Ci0JICB2ZXJib3NlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dFQUtFTjoKLQkgIHdlYWtlbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9BRERfU0VDVElPTjoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgc3RydWN0IHN0YXQgc3Q7Ci0JICAgIHN0cnVjdCBzZWN0aW9uX2FkZCAqcGE7Ci0JICAgIGludCBsZW47Ci0JICAgIGNoYXIgKm5hbWU7Ci0JICAgIEZJTEUgKmY7Ci0KLQkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOwotCSAgICAKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgLS1hZGQtc2VjdGlvbiBOQU1FPUZJTEVOQU1FIikpOwotCi0JICAgIGlmIChzdGF0IChzICsgMSwgJiBzdCkgPCAwKQotCSAgICAgIGZhdGFsIChfKCJjYW5ub3Qgc3RhdDogJXM6ICVzIiksIHMgKyAxLCBzdHJlcnJvciAoZXJybm8pKTsKLQotCSAgICBwYSA9IChzdHJ1Y3Qgc2VjdGlvbl9hZGQgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2VjdGlvbl9hZGQpKTsKLQotCSAgICBsZW4gPSBzIC0gb3B0YXJnOwotCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0JICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKLQkgICAgbmFtZVtsZW5dID0gJ1wwJzsKLQkgICAgcGEtPm5hbWUgPSBuYW1lOwotCi0JICAgIHBhLT5maWxlbmFtZSA9IHMgKyAxOwotCi0JICAgIHBhLT5zaXplID0gc3Quc3Rfc2l6ZTsKLQotCSAgICBwYS0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAocGEtPnNpemUpOwotCSAgICBmID0gZm9wZW4gKHBhLT5maWxlbmFtZSwgRk9QRU5fUkIpOwotCSAgICAKLQkgICAgaWYgKGYgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiY2Fubm90IG9wZW46ICVzOiAlcyIpLCBwYS0+ZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCSAgICAKLQkgICAgaWYgKGZyZWFkIChwYS0+Y29udGVudHMsIDEsIHBhLT5zaXplLCBmKSA9PSAwCi0JCXx8IGZlcnJvciAoZikpCi0JICAgICAgZmF0YWwgKF8oIiVzOiBmcmVhZCBmYWlsZWQiKSwgcGEtPmZpbGVuYW1lKTsKLQotCSAgICBmY2xvc2UgKGYpOwotCi0JICAgIHBhLT5uZXh0ID0gYWRkX3NlY3Rpb25zOwotCSAgICBhZGRfc2VjdGlvbnMgPSBwYTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9TVEFSVDoKLQkgIGNoYW5nZV9zdGFydCA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1jaGFuZ2Utc3RhcnQiKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fTE1BOgotCWNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQToKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqczsKLQkgICAgaW50IGxlbjsKLQkgICAgY2hhciAqbmFtZTsKLQkgICAgY2hhciAqb3B0aW9uOwotCSAgICBiZmRfdm1hIHZhbDsKLQkgICAgZW51bSBjaGFuZ2VfYWN0aW9uIHdoYXQ7Ci0JICAgIAotCSAgICBzd2l0Y2ggKGMpCi0JICAgICAgewotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0FERFJFU1M6IG9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3MiOyBicmVhazsKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9MTUE6IG9wdGlvbiA9ICItLWNoYW5nZS1zZWN0aW9uLWxtYSI7IGJyZWFrOwotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX1ZNQTogb3B0aW9uID0gIi0tY2hhbmdlLXNlY3Rpb24tdm1hIjsgYnJlYWs7Ci0JICAgICAgfQotCSAgICAKLQkgICAgcyA9IHN0cmNociAob3B0YXJnLCAnPScpOwotCSAgICBpZiAocyA9PSBOVUxMKQotCSAgICAgIHsKLQkJcyA9IHN0cmNociAob3B0YXJnLCAnKycpOwotCQlpZiAocyA9PSBOVUxMKQotCQkgIHsKLQkJICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJy0nKTsKLQkJICAgIGlmIChzID09IE5VTEwpCi0JCSAgICAgIGZhdGFsIChfKCJiYWQgZm9ybWF0IGZvciAlcyIpLCBvcHRpb24pOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgbGVuID0gcyAtIG9wdGFyZzsKLQkgICAgbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKGxlbiArIDEpOwotCSAgICBzdHJuY3B5IChuYW1lLCBvcHRhcmcsIGxlbik7Ci0JICAgIG5hbWVbbGVuXSA9ICdcMCc7Ci0KLQkgICAgcCA9IGZpbmRfc2VjdGlvbl9saXN0IChuYW1lLCB0cnVlKTsKLQotCSAgICB2YWwgPSBwYXJzZV92bWEgKHMgKyAxLCBvcHRpb24pOwotCi0JICAgIHN3aXRjaCAoKnMpCi0JICAgICAgewotCSAgICAgIGNhc2UgJz0nOiB3aGF0ID0gQ0hBTkdFX1NFVDsgYnJlYWs7Ci0JICAgICAgY2FzZSAnLSc6IHZhbCAgPSAtIHZhbDsgLyogRHJvcCB0aHJvdWdoLiAgKi8KLQkgICAgICBjYXNlICcrJzogd2hhdCA9IENIQU5HRV9NT0RJRlk7IGJyZWFrOwotCSAgICAgIH0KLQkgICAgCi0JICAgIHN3aXRjaCAoYykKLQkgICAgICB7Ci0JICAgICAgY2FzZSBPUFRJT05fQ0hBTkdFX1NFQ1RJT05fQUREUkVTUzoKLQkJcC0+Y2hhbmdlX3ZtYSA9IHdoYXQ7Ci0JCXAtPnZtYV92YWwgICAgPSB2YWw7Ci0JCS8qIERyb3AgdGhyb3VnaC4gICovCi0JCQotCSAgICAgIGNhc2UgT1BUSU9OX0NIQU5HRV9TRUNUSU9OX0xNQToKLQkJcC0+Y2hhbmdlX2xtYSA9IHdoYXQ7Ci0JCXAtPmxtYV92YWwgICAgPSB2YWw7Ci0JCWJyZWFrOwotCQkKLQkgICAgICBjYXNlIE9QVElPTl9DSEFOR0VfU0VDVElPTl9WTUE6Ci0JCXAtPmNoYW5nZV92bWEgPSB3aGF0OwotCQlwLT52bWFfdmFsICAgID0gdmFsOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DSEFOR0VfQUREUkVTU0VTOgotCSAgY2hhbmdlX3NlY3Rpb25fYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1jaGFuZ2UtYWRkcmVzc2VzIik7Ci0JICBjaGFuZ2Vfc3RhcnQgPSBjaGFuZ2Vfc2VjdGlvbl9hZGRyZXNzOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX1dBUk5JTkdTOgotCSAgY2hhbmdlX3dhcm4gPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQ0hBTkdFX0xFQURJTkdfQ0hBUjoKLQkgIGNoYW5nZV9sZWFkaW5nX2NoYXIgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVCVUdHSU5HOgotCSAgY29udmVydF9kZWJ1Z2dpbmcgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fR0FQX0ZJTEw6Ci0JICB7Ci0JICAgIGJmZF92bWEgZ2FwX2ZpbGxfdm1hOwotCi0JICAgIGdhcF9maWxsX3ZtYSA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1nYXAtZmlsbCIpOwotCSAgICBnYXBfZmlsbCA9IChiZmRfYnl0ZSkgZ2FwX2ZpbGxfdm1hOwotCSAgICBpZiAoKGJmZF92bWEpIGdhcF9maWxsICE9IGdhcF9maWxsX3ZtYSkKLQkgICAgICB7Ci0JCWNoYXIgYnVmZlsyMF07Ci0JCQotCQlzcHJpbnRmX3ZtYSAoYnVmZiwgZ2FwX2ZpbGxfdm1hKTsKLQkJCi0JCW5vbl9mYXRhbCAoXygiV2FybmluZzogdHJ1bmNhdGluZyBnYXAtZmlsbCBmcm9tIDB4JXMgdG8gMHgleCIpLAotCQkJICAgYnVmZiwgZ2FwX2ZpbGwpOwotCSAgICAgIH0KLQkgICAgZ2FwX2ZpbGxfc2V0ID0gdHJ1ZTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0NIQU5HRV9XQVJOSU5HUzoKLQkgIGNoYW5nZV93YXJuID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9QQURfVE86Ci0JICBwYWRfdG8gPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tcGFkLXRvIik7Ci0JICBwYWRfdG9fc2V0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JFTU9WRV9MRUFESU5HX0NIQVI6Ci0JICByZW1vdmVfbGVhZGluZ19jaGFyID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NFVF9TRUNUSU9OX0ZMQUdTOgotCSAgewotCSAgICBjb25zdCBjaGFyICpzOwotCSAgICBpbnQgbGVuOwotCSAgICBjaGFyICpuYW1lOwotCi0JICAgIHMgPSBzdHJjaHIgKG9wdGFyZywgJz0nKTsKLQkgICAgaWYgKHMgPT0gTlVMTCkKLQkgICAgICBmYXRhbCAoXygiYmFkIGZvcm1hdCBmb3IgLS1zZXQtc2VjdGlvbi1mbGFncyIpKTsKLQotCSAgICBsZW4gPSBzIC0gb3B0YXJnOwotCSAgICBuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgMSk7Ci0JICAgIHN0cm5jcHkgKG5hbWUsIG9wdGFyZywgbGVuKTsKLQkgICAgbmFtZVtsZW5dID0gJ1wwJzsKLQotCSAgICBwID0gZmluZF9zZWN0aW9uX2xpc3QgKG5hbWUsIHRydWUpOwotCi0JICAgIHAtPnNldF9mbGFncyA9IHRydWU7Ci0JICAgIHAtPmZsYWdzID0gcGFyc2VfZmxhZ3MgKHMgKyAxKTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NFVF9TVEFSVDoKLQkgIHNldF9zdGFydCA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zZXQtc3RhcnQiKTsKLQkgIHNldF9zdGFydF9zZXQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAwOgotCSAgYnJlYWs7CQkvKiB3ZSd2ZSBiZWVuIGdpdmVuIGEgbG9uZyBvcHRpb24gKi8KLQljYXNlICdoJzoKLQkgIGNvcHlfdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JZGVmYXVsdDoKLQkgIGNvcHlfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JfQotICAgIH0KLQotICBpZiAoc2hvd192ZXJzaW9uKQotICAgIHByaW50X3ZlcnNpb24gKCJvYmpjb3B5Iik7Ci0KLSAgaWYgKGNvcHlfYnl0ZSA+PSBpbnRlcmxlYXZlKQotICAgIGZhdGFsIChfKCJieXRlIG51bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcmxlYXZlIikpOwotCi0gIGlmIChvcHRpbmQgPT0gYXJnYyB8fCBvcHRpbmQgKyAyIDwgYXJnYykKLSAgICBjb3B5X3VzYWdlIChzdGRlcnIsIDEpOwotCi0gIGlucHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICBpZiAob3B0aW5kICsgMSA8IGFyZ2MpCi0gICAgb3V0cHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmQgKyAxXTsKLQotICAvKiBEZWZhdWx0IGlzIHRvIHN0cmlwIG5vIHN5bWJvbHMuICAqLwotICBpZiAoc3RyaXBfc3ltYm9scyA9PSBTVFJJUF9VTkRFRiAmJiBkaXNjYXJkX2xvY2FscyA9PSBMT0NBTFNfVU5ERUYpCi0gICAgc3RyaXBfc3ltYm9scyA9IFNUUklQX05PTkU7Ci0KLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gKGNoYXIgKikgTlVMTCkKLSAgICBvdXRwdXRfdGFyZ2V0ID0gaW5wdXRfdGFyZ2V0OwotCi0gIGlmIChwcmVzZXJ2ZV9kYXRlcykKLSAgICB7Ci0gICAgICBpZiAoc3RhdCAoaW5wdXRfZmlsZW5hbWUsICZzdGF0YnVmKSA8IDApCi0JZmF0YWwgKF8oIkNhbm5vdCBzdGF0OiAlczogJXMiKSwgaW5wdXRfZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBubyBkZXN0aW5hdGlvbiBmaWxlIHRoZW4gY3JlYXRlIGEgdGVtcCBhbmQgcmVuYW1lCi0gICAgIHRoZSByZXN1bHQgaW50byB0aGUgaW5wdXQuICAqLwotCi0gIGlmIChvdXRwdXRfZmlsZW5hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICp0bXBuYW1lID0gbWFrZV90ZW1wbmFtZSAoaW5wdXRfZmlsZW5hbWUpOwotCi0gICAgICBjb3B5X2ZpbGUgKGlucHV0X2ZpbGVuYW1lLCB0bXBuYW1lLCBpbnB1dF90YXJnZXQsIG91dHB1dF90YXJnZXQpOwotICAgICAgaWYgKHN0YXR1cyA9PSAwKQotCXsJCi0JICBpZiAocHJlc2VydmVfZGF0ZXMpCi0JICAgIHNldF90aW1lcyAodG1wbmFtZSwgJnN0YXRidWYpOwotCSAgc21hcnRfcmVuYW1lICh0bXBuYW1lLCBpbnB1dF9maWxlbmFtZSwgcHJlc2VydmVfZGF0ZXMpOwotCX0KLSAgICAgIGVsc2UKLQl1bmxpbmsgKHRtcG5hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNvcHlfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIG91dHB1dF9maWxlbmFtZSwgaW5wdXRfdGFyZ2V0LCBvdXRwdXRfdGFyZ2V0KTsKLSAgICAgIGlmIChzdGF0dXMgPT0gMCAmJiBwcmVzZXJ2ZV9kYXRlcykKLQlzZXRfdGltZXMgKG91dHB1dF9maWxlbmFtZSwgJnN0YXRidWYpOwotICAgIH0KLQotICBpZiAoY2hhbmdlX3dhcm4pCi0gICAgewotICAgICAgZm9yIChwID0gY2hhbmdlX3NlY3Rpb25zOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmICghIHAtPnVzZWQpCi0JICAgIHsKLQkgICAgICBpZiAocC0+Y2hhbmdlX3ZtYSAhPSBDSEFOR0VfSUdOT1JFKQotCQl7Ci0JCSAgY2hhciBidWZmIFsyMF07Ci0KLQkJICBzcHJpbnRmX3ZtYSAoYnVmZiwgcC0+dm1hX3ZhbCk7Ci0JCSAgCi0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBub25fZmF0YWwgKF8oIldhcm5pbmc6IC0tY2hhbmdlLXNlY3Rpb24tdm1hICVzJWMweCVzIG5ldmVyIHVzZWQiKSwKLQkJCSAgICAgcC0+bmFtZSwKLQkJCSAgICAgcC0+Y2hhbmdlX3ZtYSA9PSBDSEFOR0VfU0VUID8gJz0nIDogJysnLAotCQkJICAgICBidWZmKTsKLQkJfQotCSAgICAgIAotCSAgICAgIGlmIChwLT5jaGFuZ2VfbG1hICE9IENIQU5HRV9JR05PUkUpCi0JCXsKLQkJICBjaGFyIGJ1ZmYgWzIwXTsKLQotCQkgIHNwcmludGZfdm1hIChidWZmLCBwLT5sbWFfdmFsKTsKLQkJICAKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIG5vbl9mYXRhbCAoXygiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi1sbWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIpLAotCQkJICAgICBwLT5uYW1lLAotCQkJICAgICBwLT5jaGFuZ2VfbG1hID09IENIQU5HRV9TRVQgPyAnPScgOiAnKycsCi0JCQkgICAgIGJ1ZmYpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICphcmd2W107Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIHN0cmlwX3N5bWJvbHMgPSBTVFJJUF9VTkRFRjsKLSAgZGlzY2FyZF9sb2NhbHMgPSBMT0NBTFNfVU5ERUY7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgaWYgKGlzX3N0cmlwIDwgMCkKLSAgICB7Ci0gICAgICBpbnQgaSA9IHN0cmxlbiAocHJvZ3JhbV9uYW1lKTsKLSAgICAgIGlzX3N0cmlwID0gKGkgPj0gNSAmJiBzdHJjbXAgKHByb2dyYW1fbmFtZSArIGkgLSA1LCAic3RyaXAiKSA9PSAwKTsKLSAgICB9Ci0KLSAgaWYgKGlzX3N0cmlwKQotICAgIHN0cmlwX21haW4gKGFyZ2MsIGFyZ3YpOwotICBlbHNlCi0gICAgY29weV9tYWluIChhcmdjLCBhcmd2KTsKLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL29iamR1bXAuMSBiL2JpbnV0aWxzL29iamR1bXAuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjMTUzZS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9vYmpkdW1wLjEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIG9iamR1bXAgMSAiNSBOb3ZlbWJlciAxOTkxIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotb2JqZHVtcCBcLSBkaXNwbGF5IGluZm9ybWF0aW9uIGZyb20gb2JqZWN0IGZpbGVzLgotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgb2JqZHVtcAotLlJCICJbXHwiIFwtYSB8IFwtXC1hcmNoaXZlXC1oZWFkZXJzICJcfF0iIAotLlJCICJbXHwiICJcLWJcICJcYwotLkkgYmZkbmFtZVxjCi0uUkIgIiB8ICIgIlwtXC10YXJnZXQ9IlxjCi0uSSBiZmRuYW1lXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtQyB8IFwtXC1kZW1hbmdsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtZGVidWdnaW5nICJcfF0iIAotLlJCICJbXHwiIFwtZCB8IFwtXC1kaXNhc3NlbWJsZSAiXHxdIiAKLS5SQiAiW1x8IiBcLUQgfCBcLVwtZGlzYXNzZW1ibGUtYWxsICJcfF0iIAotLlJCICJbXHwiIFwtXC1kaXNhc3NlbWJsZVwtemVyb2VzICJcfF0iIAotLlJCICJbXHwiIFwtRUIgfCBcLUVMIHwgXC1cLWVuZGlhbj1cYwotLkkge2JpZ3xsaXR0bGV9XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1mIHwgXC1cLWZpbGVcLWhlYWRlcnMgIlx8XSIKLS5SQiAiW1x8IiBcLWggfCBcLVwtc2VjdGlvblwtaGVhZGVycwotLlJCICJ8ICIgXC1cLWhlYWRlcnMgIlx8XSIgCi0uUkIgIltcfCIgXC1pIHwgXC1cLWluZm8gIlx8XSIgCi0uUkIgIltcfCIgIlwtalwgIlxjCi0uSSBzZWN0aW9uXGMKLS5SQiAiIHwgIiAiXC1cLXNlY3Rpb249IlxjCi0uSSBzZWN0aW9uXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtbCB8IFwtXC1saW5lXC1udW1iZXJzICJcfF0iCi0uUkIgIltcfCIgIlwtbVwgIlxjCi0uSSBtYWNoaW5lXGMKLS5SQiAiIHwgIiAiXC1cLWFyY2hpdGVjdHVyZT0iXGMKLS5JIG1hY2hpbmVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1wIHwgXC1cLXByaXZhdGVcLWhlYWRlcnMgIlx8XSIgCi0uUkIgIltcfCIgXC1cLXByZWZpeFwtYWRkcmVzc2VzICJcfF0iIAotLlJCICJbXHwiIFwtciB8IFwtXC1yZWxvYyAiXHxdIiAKLS5SQiAiW1x8IiBcLVIgfCBcLVwtZHluYW1pY1wtcmVsb2MgIlx8XSIgCi0uUkIgIltcfCIgXC1zIHwgXC1cLWZ1bGxcLWNvbnRlbnRzICJcfF0iCi0uUkIgIltcfCIgXC1TIHwgXC1cLXNvdXJjZSAiXHxdIgotLlJCICJbXHwiIFwtXC1bbm9cLV1zaG93XC1yYXdcLWluc24gIlx8XSIgCi0uUkIgIltcfCIgXC1cLXN0YWJzICJcfF0iCi0uUkIgIltcfCIgXC10IHwgXC1cLXN5bXMgIlx8XSIgCi0uUkIgIltcfCIgXC1UIHwgXC1cLWR5bmFtaWNcLXN5bXMgIlx8XSIgCi0uUkIgIltcfCIgXC14IHwgXC1cLWFsbFwtaGVhZGVycyAiXHxdIgotLlJCICJbXHwiICJcLVwtc3RhcnRcLWFkZHJlc3M9IlxjCi0uSSBhZGRyZXNzXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1zdG9wXC1hZGRyZXNzPSJcYwotLkkgYWRkcmVzc1xjCi1cJlx8XQotLlJCICJbXHwiICJcLVwtYWRqdXN0XC12bWE9IlxjCi0uSSBvZmZzZXRcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtdmVyc2lvbiAiXHxdIgotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLVxjCi0uQiBvYmpkdW1wXGMKLVwmIGRpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIG9iamVjdCBmaWxlcy4KLVRoZSBvcHRpb25zIGNvbnRyb2wgd2hhdCBwYXJ0aWN1bGFyIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkuICBUaGlzCi1pbmZvcm1hdGlvbiBpcyBtb3N0bHkgdXNlZnVsIHRvIHByb2dyYW1tZXJzIHdobyBhcmUgd29ya2luZyBvbiB0aGUKLWNvbXBpbGF0aW9uIHRvb2xzLCBhcyBvcHBvc2VkIHRvIHByb2dyYW1tZXJzIHdobyBqdXN0IHdhbnQgdGhlaXIKLXByb2dyYW0gdG8gY29tcGlsZSBhbmQgd29yay4KLS5QUAotLklSICAib2JqZmlsZSIgLlx8Llx8LgotYXJlIHRoZSBvYmplY3QgZmlsZXMgdG8gYmUgZXhhbWluZWQuICBXaGVuIHlvdSBzcGVjaWZ5IGFyY2hpdmVzLAotXGMKLS5CIG9iamR1bXBcYwotXCYgc2hvd3MgaW5mb3JtYXRpb24gb24gZWFjaCBvZiB0aGUgbWVtYmVyIG9iamVjdCBmaWxlcy4KLQotLlNIIE9QVElPTlMKLVdoZXJlIGxvbmcgYW5kIHNob3J0IGZvcm1zIG9mIGFuIG9wdGlvbiBhcmUgc2hvd24gdG9nZXRoZXIsIHRoZXkgYXJlCi1lcXVpdmFsZW50LiAgQXQgbGVhc3Qgb25lIG9wdGlvbiBiZXNpZGVzCi0uQiBcLWwKLShcZkJcLVwtbGluZVwtbnVtYmVyc1xmUCkgbXVzdCBiZSBnaXZlbi4KLQotLlRQCi0uQiBcLWEKLS5UUAotLkIgXC1cLWFyY2hpdmVcLWhlYWRlcnMKLUlmIGFueSBmaWxlcyBmcm9tIFxjCi0uSSBvYmpmaWxlXGMKLVwmIGFyZSBhcmNoaXZlcywgZGlzcGxheSB0aGUgYXJjaGl2ZQotaGVhZGVyIGluZm9ybWF0aW9uIChpbiBhIGZvcm1hdCBzaW1pbGFyIHRvIGBcfFxjCi0uQiBscyBcLWxcYwotXHwnKS4gIEJlc2lkZXMgdGhlCi1pbmZvcm1hdGlvbiB5b3UgY291bGQgbGlzdCB3aXRoIGBcfFxjCi0uQiBhciB0dlxjCi1cfCcsIGBcfFxjCi0uQiBvYmpkdW1wIFwtYVxjCi1cfCcgc2hvd3MKLXRoZSBvYmplY3QgZmlsZSBmb3JtYXQgb2YgZWFjaCBhcmNoaXZlIG1lbWJlci4KLQotLlRQCi0uQkkgIlwtXC1hZGp1c3RcLXZtYT0iICJvZmZzZXQiCi1XaGVuIGR1bXBpbmcgaW5mb3JtYXRpb24sIGZpcnN0IGFkZAotLkkgb2Zmc2V0Ci10byBhbGwgdGhlIHNlY3Rpb24gYWRkcmVzc2VzLiAgVGhpcyBpcyB1c2VmdWwgaWYgdGhlIHNlY3Rpb24gYWRkcmVzc2VzCi1kbyBub3QgY29ycmVzcG9uZCB0byB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCBjYW4gaGFwcGVuIHdoZW4gcHV0dGluZwotc2VjdGlvbnMgYXQgcGFydGljdWxhciBhZGRyZXNzZXMgd2hlbiB1c2luZyBhIGZvcm1hdCB3aGljaCBjYW4gbm90Ci1yZXByZXNlbnQgc2VjdGlvbiBhZGRyZXNzZXMsIHN1Y2ggYXMgYS5vdXQuCi0KLS5UUAotLkJJICJcLWIgIiAiYmZkbmFtZSJcYwotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgdGhlIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgdGhlIG9iamVjdCBmaWxlcyB0byBiZQotXGMKLS5JIGJmZG5hbWVcYwotXCYuICBUaGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBcYwotLkkgb2JqZHVtcFxjCi1cJiBjYW4KLWF1dG9tYXRpY2FsbHkgcmVjb2duaXplIG1hbnkgZm9ybWF0cy4gIEZvciBleGFtcGxlLAotLnNwCi0uYnIKLW9iamR1bXBcIFwtYlwgb2FzeXNcIFwtbVwgdmF4XCBcLWhcIGZ1Lm8KLS5icgotLnNwCi1kaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VjdGlvbiBoZWFkZXJzIChgXHxcYwotLkIgXC1oXGMKLVx8Jykgb2YKLWBcfFxjCi0uQiBmdS5vXGMKLVx8Jywgd2hpY2ggaXMgZXhwbGljaXRseSBpZGVudGlmaWVkIChgXHxcYwotLkIgXC1tXGMKLVx8JykgYXMgYSBWYXggb2JqZWN0Ci1maWxlIGluIHRoZSBmb3JtYXQgcHJvZHVjZWQgYnkgT2FzeXMgY29tcGlsZXJzLiAgWW91IGNhbiBsaXN0IHRoZQotZm9ybWF0cyBhdmFpbGFibGUgd2l0aCB0aGUgYFx8XGMKLS5CIFwtaVxjCi1cfCcgb3B0aW9uLgotCi0uVFAKLS5CIFwtQwotLlRQCi0uQiBcLVwtZGVtYW5nbGUKLURlY29kZSAoXGZJZGVtYW5nbGVcZlApIGxvdy1sZXZlbCBzeW1ib2wgbmFtZXMgaW50byB1c2VyLWxldmVsIG5hbWVzLgotQmVzaWRlcyByZW1vdmluZyBhbnkgaW5pdGlhbCB1bmRlcnNjb3JlIHByZXBlbmRlZCBieSB0aGUgc3lzdGVtLCB0aGlzCi1tYWtlcyBDKysgZnVuY3Rpb24gbmFtZXMgcmVhZGFibGUuCi0KLS5UUAotLkIgXC1cLWRlYnVnZ2luZwotRGlzcGxheSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGF0dGVtcHRzIHRvIHBhcnNlIGRlYnVnZ2luZwotaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBmaWxlIGFuZCBwcmludCBpdCBvdXQgdXNpbmcgYSBDIGxpa2Ugc3ludGF4LgotT25seSBjZXJ0YWluIHR5cGVzIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBoYXZlIGJlZW4gaW1wbGVtZW50ZWQuCi0KLS5UUAotLkIgXC1kCi0uVFAKLS5CIFwtXC1kaXNhc3NlbWJsZQotRGlzcGxheSB0aGUgYXNzZW1ibGVyIG1uZW1vbmljcyBmb3IgdGhlIG1hY2hpbmUKLWluc3RydWN0aW9ucyBmcm9tIFxjCi0uSSBvYmpmaWxlXGMKLVwmLgotVGhpcyBvcHRpb24gb25seSBkaXNhc3NlbWJsZXMgdGhvc2Ugc2VjdGlvbnMgd2hpY2ggYXJlCi1leHBlY3RlZCB0byBjb250YWluIGluc3RydWN0aW9ucy4KLQotLlRQCi0uQiBcLUQKLS5UUAotLkIgXC1cLWRpc2Fzc2VtYmxlLWFsbAotTGlrZSBcZkJcLWRcZlAsIGJ1dCBkaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2YgYWxsIHNlY3Rpb25zLCBub3QganVzdAotdGhvc2UgZXhwZWN0ZWQgdG8gY29udGFpbiBpbnN0cnVjdGlvbnMuCi0KLS5UUAotLkIgXC1cLXByZWZpeFwtYWRkcmVzc2VzCi1XaGVuIGRpc2Fzc2VtYmxpbmcsIHByaW50IHRoZSBjb21wbGV0ZSBhZGRyZXNzIG9uIGVhY2ggbGluZS4gIFRoaXMgaXMKLXRoZSBvbGRlciBkaXNhc3NlbWJseSBmb3JtYXQuCi0KLS5UUAotLkIgXC1cLWRpc2Fzc2VtYmxlXC16ZXJvZXMKLU5vcm1hbGx5IHRoZSBkaXNhc3NlbWJseSBvdXRwdXQgd2lsbCBza2lwIGJsb2NrcyBvZiB6ZXJvZXMuICBUaGlzCi1vcHRpb24gZGlyZWN0cyB0aGUgZGlzYXNzZW1ibGVyIHRvIGRpc2Fzc2VtYmxlIHRob3NlIGJsb2NrcywganVzdCBsaWtlCi1hbnkgb3RoZXIgZGF0YS4KLQotLlRQCi0uQiBcLUVCCi0uVFAKLS5CIFwtRUwKLS5UUAotLkJJICJcLVwtZW5kaWFuPSIgIntiaWd8bGl0dGxlfSIKLVNwZWNpZnkgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIG9iamVjdCBmaWxlcy4gIFRoaXMgb25seSBhZmZlY3RzCi1kaXNhc3NlbWJseS4gIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRpc2Fzc2VtYmxpbmcgYSBmaWxlIGZvcm1hdCB3aGljaAotZG9lcyBub3QgZGVzY3JpYmUgZW5kaWFubmVzcyBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuCi0KLS5UUAotLkIgXC1mCi0uVFAKLS5CIFwtXC1maWxlXC1oZWFkZXJzCi1EaXNwbGF5IHN1bW1hcnkgaW5mb3JtYXRpb24gZnJvbSB0aGUgb3ZlcmFsbCBoZWFkZXIgb2YKLWVhY2ggZmlsZSBpbiBcYwotLkkgb2JqZmlsZVxjCi1cJi4KLQotLlRQCi0uQiBcLWgKLS5UUAotLkIgXC1cLXNlY3Rpb25cLWhlYWRlcnMKLS5UUAotLkIgXC1cLWhlYWRlcnMKLURpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzZWN0aW9uIGhlYWRlcnMgb2YgdGhlCi1vYmplY3QgZmlsZS4KLQotLlRQCi0uQiBcLVwtaGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBvYmpkdW1wCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLWkKLS5UUAotLkIgXC1cLWluZm8KLURpc3BsYXkgYSBsaXN0IHNob3dpbmcgYWxsIGFyY2hpdGVjdHVyZXMgYW5kIG9iamVjdCBmb3JtYXRzIGF2YWlsYWJsZQotZm9yIHNwZWNpZmljYXRpb24gd2l0aCBcYwotLkIgXC1iXGMKLVwmIG9yIFxjCi0uQiBcLW1cYwotXCYuCi0KLS5UUAotLkJJICJcLWogIiAibmFtZSJcYwotLlRQCi0uQkkgIlwtXC1zZWN0aW9uPSIgIm5hbWUiCi1EaXNwbGF5IGluZm9ybWF0aW9uIG9ubHkgZm9yIHNlY3Rpb24gXGMKLS5JIG5hbWVcYwotXCYuCi0KLS5UUAotLkIgXC1sCi0uVFAKLS5CIFwtXC1saW5lXC1udW1iZXJzCi1MYWJlbCB0aGUgZGlzcGxheSAodXNpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uKSB3aXRoIHRoZSBmaWxlbmFtZQotYW5kIHNvdXJjZSBsaW5lIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGNvZGUgc2hvd24uCi1Pbmx5IHVzZWZ1bCB3aXRoIFxmQlwtZFxmUCwgXGZCXC1EXGZQLCBvciBcZkJcLXJcZlAuCi0KLS5UUAotLkJJICJcLW0gIiAibWFjaGluZSJcYwotLlRQCi0uQkkgIlwtXC1hcmNoaXRlY3R1cmU9IiAibWFjaGluZSIKLVNwZWNpZnkgdGhlIGFyY2hpdGVjdHVyZSB0byB1c2Ugd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcy4gIFRoaXMKLWNhbiBiZSB1c2VmdWwgd2hlbiBkaXNhc3NlbWJsaW5nIG9iamVjdCBmaWxlcyB3aGljaCBkbyBub3QgZGVzY3JpYmUKLWFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBTLXJlY29yZHMuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZQotYXJjaGl0ZWN0dXJlcyB3aXRoIHRoZSBcZkJcLWlcZlAgb3B0aW9uLiAKLQotLlRQCi0uQiBcLXAKLS5UUAotLkIgXC1cLXByaXZhdGVcLWhlYWRlcnMKLVByaW50IGluZm9ybWF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIFRoZQotZXhhY3QgaW5mb3JtYXRpb24gcHJpbnRlZCBkZXBlbmRzIHVwb24gdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4gIEZvcgotc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLCBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIHByaW50ZWQuCi0KLS5UUAotLkIgXC1yCi0uVFAKLS5CIFwtXC1yZWxvYwotUHJpbnQgdGhlIHJlbG9jYXRpb24gZW50cmllcyBvZiB0aGUgZmlsZS4gIElmIHVzZWQgd2l0aCBcZkJcLWRcZlAgb3IKLVxmQlwtRFxmUCwgdGhlIHJlbG9jYXRpb25zIGFyZSBwcmludGVkIGludGVyc3BlcnNlZCB3aXRoIHRoZQotZGlzYXNzZW1ibHkuCi0KLS5UUAotLkIgXC1SCi0uVFAKLS5CIFwtXC1keW5hbWljXC1yZWxvYwotUHJpbnQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBlbnRyaWVzIG9mIHRoZSBmaWxlLiAgVGhpcyBpcyBvbmx5Ci1tZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbiB0eXBlcyBvZiBzaGFyZWQKLWxpYnJhcmllcy4KLQotLlRQCi0uQiBcLXMKLS5UUAotLkIgXC1cLWZ1bGxcLWNvbnRlbnRzCi1EaXNwbGF5IHRoZSBmdWxsIGNvbnRlbnRzIG9mIGFueSBzZWN0aW9ucyByZXF1ZXN0ZWQuCi0KLS5UUAotLkIgXC1TCi0uVFAKLS5CIFwtXC1zb3VyY2UKLURpc3BsYXkgc291cmNlIGNvZGUgaW50ZXJtaXhlZCB3aXRoIGRpc2Fzc2VtYmx5LCBpZiBwb3NzaWJsZS4gIEltcGxpZXMKLVxmQi1kXGZQLgotCi0uVFAKLS5CIFwtXC1zaG93XC1yYXdcLWluc24KLVdoZW4gZGlzYXNzZW1ibGluZyBpbnN0cnVjdGlvbnMsIHByaW50IHRoZSBpbnN0cnVjdGlvbiBpbiBoZXggYXMgd2VsbCBhcwotaW4gc3ltYm9saWMgZm9ybS4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgZXhjZXB0IHdoZW4KLS5CIFwtXC1wcmVmaXhcLWFkZHJlc3NlcwotaXMgdXNlZC4KLQotLlRQCi0uQiBcLVwtbm9cLXNob3dcLXJhd1wtaW5zbgotV2hlbiBkaXNhc3NlbWJsaW5nIGluc3RydWN0aW9ucywgZG8gbm90IHByaW50IHRoZSBpbnN0cnVjdGlvbiBieXRlcy4KLVRoaXMgaXMgdGhlIGRlZmF1bHQgd2hlbgotLkIgXC1cLXByZWZpeFwtYWRkcmVzc2VzCi1pcyB1c2VkLgotCi0uVFAKLS5CIFwtXC1zdGFicwotRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIC5zdGFiLCAuc3RhYi5pbmRleCwgYW5kIC5zdGFiLmV4Y2wKLXNlY3Rpb25zIGZyb20gYW4gRUxGIGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZnVsIG9uIHN5c3RlbXMgKHN1Y2ggYXMKLVNvbGFyaXMgMi4wKSBpbiB3aGljaCAuc3RhYiBkZWJ1Z2dpbmcgc3ltYm9sLXRhYmxlIGVudHJpZXMgYXJlIGNhcnJpZWQKLWluIGFuIEVMRiBzZWN0aW9uLiAgSW4gbW9zdCBvdGhlciBmaWxlIGZvcm1hdHMsIGRlYnVnZ2luZyBzeW1ib2wtdGFibGUKLWVudHJpZXMgYXJlIGludGVybGVhdmVkIHdpdGggbGlua2FnZSBzeW1ib2xzLCBhbmQgYXJlIHZpc2libGUgaW4gdGhlCi0uQiBcLVwtc3ltcwotb3V0cHV0LgotCi0uVFAKLS5CSSAiXC1cLXN0YXJ0XC1hZGRyZXNzPSIgImFkZHJlc3MiCi1TdGFydCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZQotLkIgXC1kXGMKLSwKLS5CIFwtcgotYW5kCi0uQiBcLXMKLW9wdGlvbnMuCi0KLS5UUAotLkJJICJcLVwtc3RvcFwtYWRkcmVzcz0iICJhZGRyZXNzIgotU3RvcCBkaXNwbGF5aW5nIGRhdGEgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLiAgVGhpcyBhZmZlY3RzIHRoZSBvdXRwdXQKLW9mIHRoZQotLkIgXC1kXGMKLSwKLS5CIFwtcgotYW5kCi0uQiBcLXMKLW9wdGlvbnMuCi0KLS5UUAotLkIgXC10Ci0uVFAKLS5CIFwtXC1zeW1zCi1TeW1ib2wgVGFibGUuICBQcmludCB0aGUgc3ltYm9sIHRhYmxlIGVudHJpZXMgb2YgdGhlIGZpbGUuCi1UaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBgXHxcYwotLkIgbm1cYwotXHwnIHByb2dyYW0uCi0KLS5UUAotLkIgXC1UCi0uVFAKLS5CIFwtXC1keW5hbWljXC1zeW1zCi1EeW5hbWljIFN5bWJvbCBUYWJsZS4gIFByaW50IHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBlbnRyaWVzIG9mIHRoZQotZmlsZS4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBkeW5hbWljIG9iamVjdHMsIHN1Y2ggYXMgY2VydGFpbgotdHlwZXMgb2Ygc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgaW5mb3JtYXRpb24KLXByb3ZpZGVkIGJ5IHRoZSBgXHxcYwotLkIgbm1cYwotXHwnIHByb2dyYW0gd2hlbiBnaXZlbiB0aGUKLS5CIFwtRCAoXC1cLWR5bmFtaWMpCi1vcHRpb24uCi0KLS5UUAotLkIgXC1cLXZlcnNpb24KLVByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZgotLkIgb2JqZHVtcAotYW5kIGV4aXQuCi0KLS5UUAotLkIgXC14Ci0uVFAKLS5CIFwtXC1hbGxcLWhlYWRlcnMKLURpc3BsYXkgYWxsIGF2YWlsYWJsZSBoZWFkZXIgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgc3ltYm9sIHRhYmxlIGFuZAotcmVsb2NhdGlvbiBlbnRyaWVzLiAgVXNpbmcgYFx8XGMKLS5CIFwteFxjCi1cfCcgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIGFsbCBvZgotYFx8XGMKLS5CIFwtYSBcLWYgXC1oIFwtciBcLXRcYwotXHwnLgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgbm0gIigiIDEgIikuIgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlCi1lbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcwotbWFudWFsIGludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkCi12ZXJzaW9ucywgZXhjZXB0IHRoYXQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBtYXkgYmUgaW5jbHVkZWQgaW4KLXRyYW5zbGF0aW9ucyBhcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGluc3RlYWQgb2YgaW4KLXRoZSBvcmlnaW5hbCBFbmdsaXNoLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvb2JqZHVtcC5jIGIvYmludXRpbHMvb2JqZHVtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2VlNWQ2Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL29iamR1bXAuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NDcgKzAsMCBAQAotLyogb2JqZHVtcC5jIC0tIGR1bXAgaW5mb3JtYXRpb24gYWJvdXQgYW4gb2JqZWN0IGZpbGUuCi0gICBDb3B5cmlnaHQgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAicHJvZ3Jlc3MuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotLyogSW50ZXJuYWwgaGVhZGVycyBmb3IgdGhlIEVMRiAuc3RhYi1kdW1wIGNvZGUgLSBzb3JyeS4gICovCi0jZGVmaW5lCUJZVEVTX0lOX1dPUkQJMzIKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUFJJTlRGCi0vKiBUaGlzIGlzIG5lZWRlZCBieSBJTklUX0RJU0FTU0VNQkxFX0lORk8uICAqLwotZXh0ZXJuIGludCBmcHJpbnRmIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqLCAuLi4pKTsKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqZGVmYXVsdF90YXJnZXQgPSBOVUxMOwkvKiBkZWZhdWx0IGF0IHJ1bnRpbWUgKi8KLQotc3RhdGljIGludCBzaG93X3ZlcnNpb24gPSAwOwkJLyogc2hvdyB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLXN0YXRpYyBpbnQgZHVtcF9zZWN0aW9uX2NvbnRlbnRzOwkvKiAtcyAqLwotc3RhdGljIGludCBkdW1wX3NlY3Rpb25faGVhZGVyczsJLyogLWggKi8KLXN0YXRpYyBib29sZWFuIGR1bXBfZmlsZV9oZWFkZXI7CS8qIC1mICovCi1zdGF0aWMgaW50IGR1bXBfc3ltdGFiOwkJCS8qIC10ICovCi1zdGF0aWMgaW50IGR1bXBfZHluYW1pY19zeW10YWI7CQkvKiAtVCAqLwotc3RhdGljIGludCBkdW1wX3JlbG9jX2luZm87CQkvKiAtciAqLwotc3RhdGljIGludCBkdW1wX2R5bmFtaWNfcmVsb2NfaW5mbzsJLyogLVIgKi8KLXN0YXRpYyBpbnQgZHVtcF9hcl9oZHJzOwkJLyogLWEgKi8KLXN0YXRpYyBpbnQgZHVtcF9wcml2YXRlX2hlYWRlcnM7CS8qIC1wICovCi1zdGF0aWMgaW50IHByZWZpeF9hZGRyZXNzZXM7CQkvKiAtLXByZWZpeC1hZGRyZXNzZXMgKi8KLXN0YXRpYyBpbnQgd2l0aF9saW5lX251bWJlcnM7CQkvKiAtbCAqLwotc3RhdGljIGJvb2xlYW4gd2l0aF9zb3VyY2VfY29kZTsJLyogLVMgKi8KLXN0YXRpYyBpbnQgc2hvd19yYXdfaW5zbjsJCS8qIC0tc2hvdy1yYXctaW5zbiAqLwotc3RhdGljIGludCBkdW1wX3N0YWJfc2VjdGlvbl9pbmZvOwkvKiAtLXN0YWJzICovCi1zdGF0aWMgaW50IGRvX2RlbWFuZ2xlOwkJCS8qIC1DLCAtLWRlbWFuZ2xlICovCi1zdGF0aWMgYm9vbGVhbiBkaXNhc3NlbWJsZTsJCS8qIC1kICovCi1zdGF0aWMgYm9vbGVhbiBkaXNhc3NlbWJsZV9hbGw7CQkvKiAtRCAqLwotc3RhdGljIGludCBkaXNhc3NlbWJsZV96ZXJvZXM7CQkvKiAtLWRpc2Fzc2VtYmxlLXplcm9lcyAqLwotc3RhdGljIGJvb2xlYW4gZm9ybWF0c19pbmZvOwkJLyogLWkgKi8KLXN0YXRpYyBjaGFyICpvbmx5OwkJCS8qIC1qIHNlY25hbWUgKi8KLXN0YXRpYyBpbnQgd2lkZV9vdXRwdXQ7CQkJLyogLXcgKi8KLXN0YXRpYyBiZmRfdm1hIHN0YXJ0X2FkZHJlc3MgPSAoYmZkX3ZtYSkgLTE7IC8qIC0tc3RhcnQtYWRkcmVzcyAqLwotc3RhdGljIGJmZF92bWEgc3RvcF9hZGRyZXNzID0gKGJmZF92bWEpIC0xOyAgLyogLS1zdG9wLWFkZHJlc3MgKi8KLXN0YXRpYyBpbnQgZHVtcF9kZWJ1Z2dpbmc7CQkvKiAtLWRlYnVnZ2luZyAqLwotc3RhdGljIGJmZF92bWEgYWRqdXN0X3NlY3Rpb25fdm1hID0gMDsJLyogLS1hZGp1c3Qtdm1hICovCi0KLS8qIEV4dHJhIGluZm8gdG8gcGFzcyB0byB0aGUgZGlzYXNzZW1ibGVyIGFkZHJlc3MgcHJpbnRpbmcgZnVuY3Rpb24uICAqLwotc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gewotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJvb2xlYW4gcmVxdWlyZV9zZWM7Ci19OwotCi0vKiBBcmNoaXRlY3R1cmUgdG8gZGlzYXNzZW1ibGUgZm9yLCBvciBkZWZhdWx0IGlmIE5VTEwuICAqLwotc3RhdGljIGNoYXIgKm1hY2hpbmUgPSAoY2hhciAqKSBOVUxMOwotCi0vKiBUYXJnZXQgc3BlY2lmaWMgb3B0aW9ucyB0byB0aGUgZGlzYXNzZW1ibGVyLiAgKi8KLXN0YXRpYyBjaGFyICpkaXNhc3NlbWJsZXJfb3B0aW9ucyA9IChjaGFyICopIE5VTEw7Ci0KLS8qIEVuZGlhbm5lc3MgdG8gZGlzYXNzZW1ibGUgZm9yLCBvciBkZWZhdWx0IGlmIEJGRF9FTkRJQU5fVU5LTk9XTi4gICovCi1zdGF0aWMgZW51bSBiZmRfZW5kaWFuIGVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTjsKLQotLyogVGhlIHN5bWJvbCB0YWJsZS4gICovCi1zdGF0aWMgYXN5bWJvbCAqKnN5bXM7Ci0KLS8qIE51bWJlciBvZiBzeW1ib2xzIGluIGBzeW1zJy4gICovCi1zdGF0aWMgbG9uZyBzeW1jb3VudCA9IDA7Ci0KLS8qIFRoZSBzb3J0ZWQgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqc29ydGVkX3N5bXM7Ci0KLS8qIE51bWJlciBvZiBzeW1ib2xzIGluIGBzb3J0ZWRfc3ltcycuICAqLwotc3RhdGljIGxvbmcgc29ydGVkX3N5bWNvdW50ID0gMDsKLQotLyogVGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlLiAgKi8KLXN0YXRpYyBhc3ltYm9sICoqZHluc3ltczsKLQotLyogTnVtYmVyIG9mIHN5bWJvbHMgaW4gYGR5bnN5bXMnLiAgKi8KLXN0YXRpYyBsb25nIGR5bnN5bWNvdW50ID0gMDsKLQotLyogU3RhdGljIGRlY2xhcmF0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lLCBjaGFyICp0YXJnZXQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc2VjdGlvbl9oZWFkZXIgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9oZWFkZXJzIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2RhdGEgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jcyBQQVJBTVMgKChiZmQgKmFiZmQpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfZHluYW1pY19yZWxvY3MgUEFSQU1TICgoYmZkICogYWJmZCkpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9yZWxvY19zZXQgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGFyZWxlbnQgKiosIGxvbmcpKTsKLQotc3RhdGljIHZvaWQKLWR1bXBfc3ltYm9scyBQQVJBTVMgKChiZmQgKmFiZmQsIGJvb2xlYW4gZHluYW1pYykpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfaGVhZGVyIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX2JmZF9wcml2YXRlX2hlYWRlciBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9iZmQgUEFSQU1TICgoYmZkICphYmZkKSk7Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X3RhcmdldF9saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mb190YWJsZSBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV90YXJnZXRfdGFibGVzIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfaW5mbyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3ZhbHVlIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfc3ltbmFtZSBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYXN5bWJvbCAqKSk7Ci0KLXN0YXRpYyBhc3ltYm9sICoKLWZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hLCBib29sZWFuLCBsb25nICopKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcl93aXRoX3N5bSBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgYXN5bWJvbCAqLCBiZmRfdm1hLAotCQkJCSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYm9vbGVhbikpOwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcmVzcyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2xpbmUgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX2J5dGVzIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGRpc2Fzc2VtYmxlcl9mdHlwZSwKLQkJCSAgIGJvb2xlYW4sIGJmZF9ieXRlICosIGJmZF92bWEsIGJmZF92bWEsCi0JCQkgICBhcmVsZW50ICoqKiwgYXJlbGVudCAqKikpOwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfZGF0YSBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1lbmRpYW5fc3RyaW5nIFBBUkFNUyAoKGVudW0gYmZkX2VuZGlhbikpOwotCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfc3ltdGFiIFBBUkFNUyAoKGJmZCAqKSk7Ci0KLXN0YXRpYyBhc3ltYm9sICoqCi1zbHVycF9keW5hbWljX3N5bXRhYiBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgbG9uZwotcmVtb3ZlX3VzZWxlc3Nfc3ltYm9scyBQQVJBTVMgKChhc3ltYm9sICoqLCBsb25nKSk7Ci0KLXN0YXRpYyBpbnQKLWNvbXBhcmVfc3ltYm9scyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3JlbG9jcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zdGFicyBQQVJBTVMgKChiZmQgKikpOwotCi1zdGF0aWMgYm9vbGVhbgotcmVhZF9zZWN0aW9uX3N0YWJzIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc2VjdGlvbl9zdGFicyBQQVJBTVMgKChiZmQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLQwKLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1haGlmQ2REcHJSdFR4c1Nsd10gWy1iIGJmZG5hbWVdIFstbSBtYWNoaW5lXSBcblwKLSAgICAgICBbLWogc2VjdGlvbi1uYW1lXSBbLU0gZGlzYXNzZW1ibGVyLW9wdGlvbnNdXG5cCi0gICAgICAgWy0tYXJjaGl2ZS1oZWFkZXJzXSBbLS10YXJnZXQ9YmZkbmFtZV0gWy0tZGVidWdnaW5nXSBbLS1kaXNhc3NlbWJsZV1cblwKLSAgICAgICBbLS1kaXNhc3NlbWJsZS1hbGxdIFstLWRpc2Fzc2VtYmxlLXplcm9lc10gWy0tZmlsZS1oZWFkZXJzXVxuXAotICAgICAgIFstLXNlY3Rpb24taGVhZGVyc10gWy0taGVhZGVyc11cblwKLSAgICAgICBbLS1pbmZvXSBbLS1zZWN0aW9uPXNlY3Rpb24tbmFtZV0gWy0tbGluZS1udW1iZXJzXSBbLS1zb3VyY2VdXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgICAgICBbLS1hcmNoaXRlY3R1cmU9bWFjaGluZV0gWy0tcmVsb2NdIFstLWZ1bGwtY29udGVudHNdIFstLXN0YWJzXVxuXAotICAgICAgIFstLXN5bXNdIFstLWFsbC1oZWFkZXJzXSBbLS1keW5hbWljLXN5bXNdIFstLWR5bmFtaWMtcmVsb2NdXG5cCi0gICAgICAgWy0td2lkZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gWy0tcHJpdmF0ZS1oZWFkZXJzXVxuXAotICAgICAgIFstLXN0YXJ0LWFkZHJlc3M9YWRkcl0gWy0tc3RvcC1hZGRyZXNzPWFkZHJdXG5cCi0gICAgICAgWy0tcHJlZml4LWFkZHJlc3Nlc10gWy0tW25vLV1zaG93LXJhdy1pbnNuXSBbLS1kZW1hbmdsZV1cblwKLSAgICAgICBbLS1hZGp1c3Qtdm1hPW9mZnNldF0gWy1FQnwtRUxdIFstLWVuZGlhbj17YmlnfGxpdHRsZX1dIG9iamZpbGUuLi5cblwKLWF0IGxlYXN0IG9uZSBvcHRpb24gYmVzaWRlcyAtbCAoLS1saW5lLW51bWJlcnMpIG11c3QgYmUgZ2l2ZW5cbiIpKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotCi0jZGVmaW5lIE9QVElPTl9FTkRJQU4gKDE1MCkKLSNkZWZpbmUgT1BUSU9OX1NUQVJUX0FERFJFU1MgKE9QVElPTl9FTkRJQU4gKyAxKQotI2RlZmluZSBPUFRJT05fU1RPUF9BRERSRVNTIChPUFRJT05fU1RBUlRfQUREUkVTUyArIDEpCi0jZGVmaW5lIE9QVElPTl9BREpVU1RfVk1BIChPUFRJT05fU1RPUF9BRERSRVNTICsgMSkKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW109Ci17Ci0gIHsiYWRqdXN0LXZtYSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQURKVVNUX1ZNQX0sCi0gIHsiYWxsLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKLSAgeyJwcml2YXRlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3AnfSwKLSAgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ20nfSwKLSAgeyJhcmNoaXZlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2EnfSwKLSAgeyJkZWJ1Z2dpbmciLCBub19hcmd1bWVudCwgJmR1bXBfZGVidWdnaW5nLCAxfSwKLSAgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCAmZG9fZGVtYW5nbGUsIDF9LAotICB7ImRpc2Fzc2VtYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gIHsiZGlzYXNzZW1ibGUtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdEJ30sCi0gIHsiZGlzYXNzZW1ibGVyLW9wdGlvbnMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ00nfSwKLSAgeyJkaXNhc3NlbWJsZS16ZXJvZXMiLCBub19hcmd1bWVudCwgJmRpc2Fzc2VtYmxlX3plcm9lcywgMX0sCi0gIHsiZHluYW1pYy1yZWxvYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUid9LAotICB7ImR5bmFtaWMtc3ltcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVCd9LAotICB7ImVuZGlhbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5ESUFOfSwKLSAgeyJmaWxlLWhlYWRlcnMiLCBub19hcmd1bWVudCwgTlVMTCwgJ2YnfSwKLSAgeyJmdWxsLWNvbnRlbnRzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gIHsiaGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ0gnfSwKLSAgeyJpbmZvIiwgbm9fYXJndW1lbnQsIE5VTEwsICdpJ30sCi0gIHsibGluZS1udW1iZXJzIiwgbm9fYXJndW1lbnQsIE5VTEwsICdsJ30sCi0gIHsibm8tc2hvdy1yYXctaW5zbiIsIG5vX2FyZ3VtZW50LCAmc2hvd19yYXdfaW5zbiwgLTF9LAotICB7InByZWZpeC1hZGRyZXNzZXMiLCBub19hcmd1bWVudCwgJnByZWZpeF9hZGRyZXNzZXMsIDF9LAotICB7InJlbG9jIiwgbm9fYXJndW1lbnQsIE5VTEwsICdyJ30sCi0gIHsic2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnaid9LAotICB7InNlY3Rpb24taGVhZGVycyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCd9LAotICB7InNob3ctcmF3LWluc24iLCBub19hcmd1bWVudCwgJnNob3dfcmF3X2luc24sIDF9LAotICB7InNvdXJjZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICB7InN0YWJzIiwgbm9fYXJndW1lbnQsICZkdW1wX3N0YWJfc2VjdGlvbl9pbmZvLCAxfSwKLSAgeyJzdGFydC1hZGRyZXNzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVEFSVF9BRERSRVNTfSwKLSAgeyJzdG9wLWFkZHJlc3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUT1BfQUREUkVTU30sCi0gIHsic3ltcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndCd9LAotICB7InRhcmdldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgJnNob3dfdmVyc2lvbiwgMX0sCi0gIHsid2lkZSIsIG5vX2FyZ3VtZW50LCAmd2lkZV9vdXRwdXQsICd3J30sCi0gIHswLCBub19hcmd1bWVudCwgMCwgMH0KLX07Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9zZWN0aW9uX2hlYWRlciAoYWJmZCwgc2VjdGlvbiwgaWdub3JlZCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgUFRSIGlnbm9yZWQ7Ci17Ci0gIGNoYXIgKmNvbW1hID0gIiI7Ci0KLSAgcHJpbnRmICgiJTNkICUtMTNzICUwOGx4ICAiLCBzZWN0aW9uLT5pbmRleCwKLQkgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWN0aW9uKSwKLQkgICh1bnNpZ25lZCBsb25nKSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0gIHByaW50Zl92bWEgKGJmZF9nZXRfc2VjdGlvbl92bWEgKGFiZmQsIHNlY3Rpb24pKTsKLSAgcHJpbnRmICgiICAiKTsKLSAgcHJpbnRmX3ZtYSAoc2VjdGlvbi0+bG1hKTsKLSAgcHJpbnRmICgiICAlMDhseCAgMioqJXUiLCBzZWN0aW9uLT5maWxlcG9zLAotCSAgYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjdGlvbikpOwotICBpZiAoISB3aWRlX291dHB1dCkKLSAgICBwcmludGYgKCJcbiAgICAgICAgICAgICAgICAiKTsKLSAgcHJpbnRmICgiICAiKTsKLQotI2RlZmluZSBQRih4LCB5KSBcCi0gIGlmIChzZWN0aW9uLT5mbGFncyAmIHgpIHsgcHJpbnRmICgiJXMlcyIsIGNvbW1hLCB5KTsgY29tbWEgPSAiLCAiOyB9Ci0KLSAgUEYgKFNFQ19IQVNfQ09OVEVOVFMsICJDT05URU5UUyIpOwotICBQRiAoU0VDX0FMTE9DLCAiQUxMT0MiKTsKLSAgUEYgKFNFQ19DT05TVFJVQ1RPUiwgIkNPTlNUUlVDVE9SIik7Ci0gIFBGIChTRUNfQ09OU1RSVUNUT1JfVEVYVCwgIkNPTlNUUlVDVE9SIFRFWFQiKTsKLSAgUEYgKFNFQ19DT05TVFJVQ1RPUl9EQVRBLCAiQ09OU1RSVUNUT1IgREFUQSIpOwotICBQRiAoU0VDX0NPTlNUUlVDVE9SX0JTUywgIkNPTlNUUlVDVE9SIEJTUyIpOwotICBQRiAoU0VDX0xPQUQsICJMT0FEIik7Ci0gIFBGIChTRUNfUkVMT0MsICJSRUxPQyIpOwotI2lmZGVmIFNFQ19CQUxJR04KLSAgUEYgKFNFQ19CQUxJR04sICJCQUxJR04iKTsKLSNlbmRpZgotICBQRiAoU0VDX1JFQURPTkxZLCAiUkVBRE9OTFkiKTsKLSAgUEYgKFNFQ19DT0RFLCAiQ09ERSIpOwotICBQRiAoU0VDX0RBVEEsICJEQVRBIik7Ci0gIFBGIChTRUNfUk9NLCAiUk9NIik7Ci0gIFBGIChTRUNfREVCVUdHSU5HLCAiREVCVUdHSU5HIik7Ci0gIFBGIChTRUNfTkVWRVJfTE9BRCwgIk5FVkVSX0xPQUQiKTsKLSAgUEYgKFNFQ19FWENMVURFLCAiRVhDTFVERSIpOwotICBQRiAoU0VDX1NPUlRfRU5UUklFUywgIlNPUlRfRU5UUklFUyIpOwotCi0gIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTElOS19PTkNFKSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmxzOwotCi0gICAgICBzd2l0Y2ggKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xJTktfRFVQTElDQVRFUykKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOgotCSAgbHMgPSAiTElOS19PTkNFX0RJU0NBUkQiOwotCSAgYnJlYWs7Ci0JY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOgotCSAgbHMgPSAiTElOS19PTkNFX09ORV9PTkxZIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU6Ci0JICBscyA9ICJMSU5LX09OQ0VfU0FNRV9TSVpFIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOgotCSAgbHMgPSAiTElOS19PTkNFX1NBTUVfQ09OVEVOVFMiOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJpbnRmICgiJXMlcyIsIGNvbW1hLCBscyk7Ci0gICAgICBjb21tYSA9ICIsICI7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0jdW5kZWYgUEYKLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfaGVhZGVycyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBwcmludGYgKF8oIlNlY3Rpb25zOlxuIikpOwotI2lmbmRlZiBCRkQ2NAotICBwcmludGYgKF8oIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgTE1BICAgICAgIEZpbGUgb2ZmICBBbGduXG4iKSk7Ci0jZWxzZQotICBwcmludGYgKF8oIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgICAgICAgICBMTUEgICAgICAgICAgICAgICBGaWxlIG9mZiAgQWxnblxuIikpOwotI2VuZGlmCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgZHVtcF9zZWN0aW9uX2hlYWRlciwgKFBUUikgTlVMTCk7Ci19Ci0MCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfc3ltdGFiIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGFzeW1ib2wgKipzeSA9IChhc3ltYm9sICoqKSBOVUxMOwotICBsb25nIHN0b3JhZ2U7Ci0KLSAgaWYgKCEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEhBU19TWU1TKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBubyBzeW1ib2xzXG4iKSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgc3ltY291bnQgPSAwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN0b3JhZ2UgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBpZiAoc3RvcmFnZSkKLSAgICB7Ci0gICAgICBzeSA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzdG9yYWdlKTsKLSAgICB9Ci0gIHN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIHN5KTsKLSAgaWYgKHN5bWNvdW50IDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgaWYgKHN5bWNvdW50ID09IDApCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gc3ltYm9sc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgcmV0dXJuIHN5OwotfQotCi0vKiBSZWFkIGluIHRoZSBkeW5hbWljIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYXN5bWJvbCAqKgotc2x1cnBfZHluYW1pY19zeW10YWIgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgYXN5bWJvbCAqKnN5ID0gKGFzeW1ib2wgKiopIE5VTEw7Ci0gIGxvbmcgc3RvcmFnZTsKLQotICBzdG9yYWdlID0gYmZkX2dldF9keW5hbWljX3N5bXRhYl91cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChzdG9yYWdlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoIShiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRFlOQU1JQykpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IG5vdCBhIGR5bmFtaWMgb2JqZWN0XG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBkeW5zeW1jb3VudCA9IDA7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0KLSAgICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgIH0KLQotICBpZiAoc3RvcmFnZSkKLSAgICB7Ci0gICAgICBzeSA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzdG9yYWdlKTsKLSAgICB9Ci0gIGR5bnN5bWNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3N5bXRhYiAoYWJmZCwgc3kpOwotICBpZiAoZHluc3ltY291bnQgPCAwKQotICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICBpZiAoZHluc3ltY291bnQgPT0gMCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogTm8gZHluYW1pYyBzeW1ib2xzXG4iKSwKLQkgICAgIHByb2dyYW1fbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICByZXR1cm4gc3k7Ci19Ci0KLS8qIEZpbHRlciBvdXQgKGluIHBsYWNlKSBzeW1ib2xzIHRoYXQgYXJlIHVzZWxlc3MgZm9yIGRpc2Fzc2VtYmx5LgotICAgQ09VTlQgaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBTWU1CT0xTLgotICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlZnVsIHN5bWJvbHMuICovCi0KLXN0YXRpYyBsb25nCi1yZW1vdmVfdXNlbGVzc19zeW1ib2xzIChzeW1ib2xzLCBjb3VudCkKLSAgICAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0gICAgIGxvbmcgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGFzeW1ib2wgKippbl9wdHIgPSBzeW1ib2xzLCAqKm91dF9wdHIgPSBzeW1ib2xzOwotCi0gIHdoaWxlICgtLWNvdW50ID49IDApCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gKmluX3B0cisrOwotCi0gICAgICBpZiAoc3ltLT5uYW1lID09IE5VTEwgfHwgc3ltLT5uYW1lWzBdID09ICdcMCcpCi0JY29udGludWU7Ci0gICAgICBpZiAoc3ltLT5mbGFncyAmIChCU0ZfREVCVUdHSU5HKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChiZmRfaXNfdW5kX3NlY3Rpb24gKHN5bS0+c2VjdGlvbikKLQkgIHx8IGJmZF9pc19jb21fc2VjdGlvbiAoc3ltLT5zZWN0aW9uKSkKLQljb250aW51ZTsKLQotICAgICAgKm91dF9wdHIrKyA9IHN5bTsKLSAgICB9Ci0gIHJldHVybiBvdXRfcHRyIC0gc3ltYm9sczsKLX0KLQotLyogU29ydCBzeW1ib2xzIGludG8gdmFsdWUgb3JkZXIuICAqLwotCi1zdGF0aWMgaW50IAotY29tcGFyZV9zeW1ib2xzIChhcCwgYnApCi0gICAgIGNvbnN0IFBUUiBhcDsKLSAgICAgY29uc3QgUFRSIGJwOwotewotICBjb25zdCBhc3ltYm9sICphID0gKihjb25zdCBhc3ltYm9sICoqKWFwOwotICBjb25zdCBhc3ltYm9sICpiID0gKihjb25zdCBhc3ltYm9sICoqKWJwOwotICBjb25zdCBjaGFyICphbiwgKmJuOwotICBzaXplX3QgYW5sLCBibmw7Ci0gIGJvb2xlYW4gYWYsIGJmOwotICBmbGFnd29yZCBhZmxhZ3MsIGJmbGFnczsKLQotICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKGEpID4gYmZkX2FzeW1ib2xfdmFsdWUgKGIpKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChiZmRfYXN5bWJvbF92YWx1ZSAoYSkgPCBiZmRfYXN5bWJvbF92YWx1ZSAoYikpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChhLT5zZWN0aW9uID4gYi0+c2VjdGlvbikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAoYS0+c2VjdGlvbiA8IGItPnNlY3Rpb24pCi0gICAgcmV0dXJuIC0xOwotCi0gIGFuID0gYmZkX2FzeW1ib2xfbmFtZSAoYSk7Ci0gIGJuID0gYmZkX2FzeW1ib2xfbmFtZSAoYik7Ci0gIGFubCA9IHN0cmxlbiAoYW4pOwotICBibmwgPSBzdHJsZW4gKGJuKTsKLQotICAvKiBUaGUgc3ltYm9scyBnbnVfY29tcGlsZWQgYW5kIGdjYzJfY29tcGlsZWQgY29udmV5IG5vIHJlYWwKLSAgICAgaW5mb3JtYXRpb24sIHNvIHB1dCB0aGVtIGFmdGVyIG90aGVyIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZS4gICovCi0KLSAgYWYgPSAoc3Ryc3RyIChhbiwgImdudV9jb21waWxlZCIpICE9IE5VTEwKLQl8fCBzdHJzdHIgKGFuLCAiZ2NjMl9jb21waWxlZCIpICE9IE5VTEwpOwotICBiZiA9IChzdHJzdHIgKGJuLCAiZ251X2NvbXBpbGVkIikgIT0gTlVMTAotCXx8IHN0cnN0ciAoYm4sICJnY2MyX2NvbXBpbGVkIikgIT0gTlVMTCk7Ci0KLSAgaWYgKGFmICYmICEgYmYpCi0gICAgcmV0dXJuIDE7Ci0gIGlmICghIGFmICYmIGJmKQotICAgIHJldHVybiAtMTsKLQotICAvKiBXZSB1c2UgYSBoZXVyaXN0aWMgZm9yIHRoZSBmaWxlIG5hbWUsIHRvIHRyeSB0byBzb3J0IGl0IGFmdGVyCi0gICAgIG1vcmUgdXNlZnVsIHN5bWJvbHMuICBJdCBtYXkgbm90IHdvcmsgb24gbm9uIFVuaXggc3lzdGVtcywgYnV0IGl0Ci0gICAgIGRvZXNuJ3QgcmVhbGx5IG1hdHRlcjsgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyBwcmVjaXNlbHkgd2hpY2gKLSAgICAgc3ltYm9sIG5hbWVzIGdldCBwcmludGVkLiAgKi8KLQotI2RlZmluZSBmaWxlX3N5bWJvbChzLCBzbiwgc25sKQkJCVwKLSAgKCgocyktPmZsYWdzICYgQlNGX0ZJTEUpICE9IDAJCQlcCi0gICB8fCAoKHNuKVsoc25sKSAtIDJdID09ICcuJwkJCVwKLSAgICAgICAmJiAoKHNuKVsoc25sKSAtIDFdID09ICdvJwkJXAotCSAgIHx8IChzbilbKHNubCkgLSAxXSA9PSAnYScpKSkKLQotICBhZiA9IGZpbGVfc3ltYm9sIChhLCBhbiwgYW5sKTsKLSAgYmYgPSBmaWxlX3N5bWJvbCAoYiwgYm4sIGJubCk7Ci0KLSAgaWYgKGFmICYmICEgYmYpCi0gICAgcmV0dXJuIDE7Ci0gIGlmICghIGFmICYmIGJmKQotICAgIHJldHVybiAtMTsKLQotICAvKiBUcnkgdG8gc29ydCBnbG9iYWwgc3ltYm9scyBiZWZvcmUgbG9jYWwgc3ltYm9scyBiZWZvcmUgZnVuY3Rpb24KLSAgICAgc3ltYm9scyBiZWZvcmUgZGVidWdnaW5nIHN5bWJvbHMuICAqLwotCi0gIGFmbGFncyA9IGEtPmZsYWdzOwotICBiZmxhZ3MgPSBiLT5mbGFnczsKLQotICBpZiAoKGFmbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IChiZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKSkKLSAgICB7Ci0gICAgICBpZiAoKGFmbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKChhZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pICE9IChiZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pKQotICAgIHsKLSAgICAgIGlmICgoYWZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCXJldHVybiAtMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGlmICgoYWZsYWdzICYgQlNGX0xPQ0FMKSAhPSAoYmZsYWdzICYgQlNGX0xPQ0FMKSkKLSAgICB7Ci0gICAgICBpZiAoKGFmbGFncyAmIEJTRl9MT0NBTCkgIT0gMCkKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoKGFmbGFncyAmIEJTRl9HTE9CQUwpICE9IChiZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKLSAgICB7Ci0gICAgICBpZiAoKGFmbGFncyAmIEJTRl9HTE9CQUwpICE9IDApCi0JcmV0dXJuIC0xOwotICAgICAgZWxzZQotCXJldHVybiAxOwotICAgIH0KLQotICAvKiBTeW1ib2xzIHRoYXQgc3RhcnQgd2l0aCAnLicgbWlnaHQgYmUgc2VjdGlvbiBuYW1lcywgc28gc29ydCB0aGVtCi0gICAgIGFmdGVyIHN5bWJvbHMgdGhhdCBkb24ndCBzdGFydCB3aXRoICcuJy4gICovCi0gIGlmIChhblswXSA9PSAnLicgJiYgYm5bMF0gIT0gJy4nKQotICAgIHJldHVybiAxOwotICBpZiAoYW5bMF0gIT0gJy4nICYmIGJuWzBdID09ICcuJykKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogRmluYWxseSwgaWYgd2UgY2FuJ3QgZGlzdGluZ3Vpc2ggdGhlbSBpbiBhbnkgb3RoZXIgd2F5LCB0cnkgdG8KLSAgICAgZ2V0IGNvbnNpc3RlbnQgcmVzdWx0cyBieSBzb3J0aW5nIHRoZSBzeW1ib2xzIGJ5IG5hbWUuICAqLwotICByZXR1cm4gc3RyY21wIChhbiwgYm4pOwotfQotCi0vKiBTb3J0IHJlbG9jcyBpbnRvIGFkZHJlc3Mgb3JkZXIuICAqLwotCi1zdGF0aWMgaW50Ci1jb21wYXJlX3JlbG9jcyAoYXAsIGJwKQotICAgICBjb25zdCBQVFIgYXA7Ci0gICAgIGNvbnN0IFBUUiBicDsKLXsKLSAgY29uc3QgYXJlbGVudCAqYSA9ICooY29uc3QgYXJlbGVudCAqKilhcDsKLSAgY29uc3QgYXJlbGVudCAqYiA9ICooY29uc3QgYXJlbGVudCAqKilicDsKLQotICBpZiAoYS0+YWRkcmVzcyA+IGItPmFkZHJlc3MpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGEtPmFkZHJlc3MgPCBiLT5hZGRyZXNzKQotICAgIHJldHVybiAtMTsKLQotICAvKiBTbyB0aGF0IGFzc29jaWF0ZWQgcmVsb2NhdGlvbnMgdGllZCB0byB0aGUgc2FtZSBhZGRyZXNzIHNob3cgdXAKLSAgICAgaW4gdGhlIGNvcnJlY3Qgb3JkZXIsIHdlIGRvbid0IGRvIGFueSBmdXJ0aGVyIHNvcnRpbmcuICAqLwotICBpZiAoYSA+IGIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKGEgPCBiKQotICAgIHJldHVybiAtMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBQcmludCBWTUEgdG8gU1RSRUFNLiAgSWYgU0tJUF9aRVJPRVMgaXMgdHJ1ZSwgb21pdCBsZWFkaW5nIHplcm9lcy4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEsIGluZm8sIHNraXBfemVyb2VzKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gc2tpcF96ZXJvZXM7Ci17Ci0gIGNoYXIgYnVmWzMwXTsKLSAgY2hhciAqcDsKLQotICBzcHJpbnRmX3ZtYSAoYnVmLCB2bWEpOwotICBpZiAoISBza2lwX3plcm9lcykKLSAgICBwID0gYnVmOwotICBlbHNlCi0gICAgewotICAgICAgZm9yIChwID0gYnVmOyAqcCA9PSAnMCc7ICsrcCkKLQk7Ci0gICAgICBpZiAoKnAgPT0gJ1wwJykKLQktLXA7Ci0gICAgfQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcCk7Ci19Ci0KLS8qIFByaW50IHRoZSBuYW1lIG9mIGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfc3ltbmFtZSAoYWJmZCwgaW5mbywgc3ltKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBhc3ltYm9sICpzeW07Ci17Ci0gIGNoYXIgKmFsbG9jOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICpwcmludDsKLQotICBhbGxvYyA9IE5VTEw7Ci0gIG5hbWUgPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOwotICBpZiAoISBkb19kZW1hbmdsZSB8fCBuYW1lWzBdID09ICdcMCcpCi0gICAgcHJpbnQgPSBuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgLyogRGVtYW5nbGUgdGhlIG5hbWUuICAqLwotICAgICAgaWYgKGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoYWJmZCkgPT0gbmFtZVswXSkKLQkrK25hbWU7Ci0KLSAgICAgIGFsbG9jID0gY3BsdXNfZGVtYW5nbGUgKG5hbWUsIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLSAgICAgIGlmIChhbGxvYyA9PSBOVUxMKQotCXByaW50ID0gbmFtZTsKLSAgICAgIGVsc2UKLQlwcmludCA9IGFsbG9jOwotICAgIH0KLQotICBpZiAoaW5mbyAhPSBOVUxMKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBwcmludCk7Ci0gIGVsc2UKLSAgICBwcmludGYgKCIlcyIsIHByaW50KTsKLQotICBpZiAoYWxsb2MgIT0gTlVMTCkKLSAgICBmcmVlIChhbGxvYyk7Ci19Ci0KLS8qIExvY2F0ZSBhIHN5bWJvbCBnaXZlbiBhIGJmZCwgYSBzZWN0aW9uLCBhbmQgYSBWTUEuICBJZiBSRVFVSVJFX1NFQwotICAgaXMgdHJ1ZSwgdGhlbiBhbHdheXMgcmVxdWlyZSB0aGUgc3ltYm9sIHRvIGJlIGluIHRoZSBzZWN0aW9uLiAgVGhpcwotICAgcmV0dXJucyBOVUxMIGlmIHRoZXJlIGlzIG5vIHN1aXRhYmxlIHN5bWJvbC4gIElmIFBMQUNFIGlzIG5vdCBOVUxMLAotICAgdGhlbiAqUExBQ0UgaXMgc2V0IHRvIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sIGluIHNvcnRlZF9zeW1zLiAgKi8KLQotc3RhdGljIGFzeW1ib2wgKgotZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGFiZmQsIHNlYywgdm1hLCByZXF1aXJlX3NlYywgcGxhY2UpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGJvb2xlYW4gcmVxdWlyZV9zZWM7Ci0gICAgIGxvbmcgKnBsYWNlOwotewotICAvKiBAQCBXb3VsZCBpdCBzcGVlZCB0aGluZ3MgdXAgdG8gY2FjaGUgdGhlIGxhc3QgdHdvIHN5bWJvbHMgcmV0dXJuZWQsCi0gICAgIGFuZCBtYXliZSB0aGVpciBhZGRyZXNzIHJhbmdlcz8gIEZvciBtYW55IHByb2Nlc3NvcnMsIG9ubHkgb25lIG1lbW9yeQotICAgICBvcGVyYW5kIGNhbiBiZSBwcmVzZW50IGF0IGEgdGltZSwgc28gdGhlIDItZW50cnkgY2FjaGUgd291bGRuJ3QgYmUKLSAgICAgY29uc3RhbnRseSBjaHVybmVkIGJ5IGNvZGUgZG9pbmcgaGVhdnkgbWVtb3J5IGFjY2Vzc2VzLiAgKi8KLQotICAvKiBJbmRpY2VzIGluIGBzb3J0ZWRfc3ltcycuICAqLwotICBsb25nIG1pbiA9IDA7Ci0gIGxvbmcgbWF4ID0gc29ydGVkX3N5bWNvdW50OwotICBsb25nIHRoaXNwbGFjZTsKLQotICBpZiAoc29ydGVkX3N5bWNvdW50IDwgMSkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBQZXJmb3JtIGEgYmluYXJ5IHNlYXJjaCBsb29raW5nIGZvciB0aGUgY2xvc2VzdCBzeW1ib2wgdG8gdGhlCi0gICAgIHJlcXVpcmVkIHZhbHVlLiAgV2UgYXJlIHNlYXJjaGluZyB0aGUgcmFuZ2UgKG1pbiwgbWF4XS4gICovCi0gIHdoaWxlIChtaW4gKyAxIDwgbWF4KQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLQotICAgICAgdGhpc3BsYWNlID0gKG1heCArIG1pbikgLyAyOwotICAgICAgc3ltID0gc29ydGVkX3N5bXNbdGhpc3BsYWNlXTsKLQotICAgICAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gdm1hKQotCW1heCA9IHRoaXNwbGFjZTsKLSAgICAgIGVsc2UgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIDwgdm1hKQotCW1pbiA9IHRoaXNwbGFjZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtaW4gPSB0aGlzcGxhY2U7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBzeW1ib2wgd2Ugd2FudCBpcyBub3cgaW4gbWluLCB0aGUgbG93IGVuZCBvZiB0aGUgcmFuZ2Ugd2UKLSAgICAgd2VyZSBzZWFyY2hpbmcuICBJZiB0aGVyZSBhcmUgc2V2ZXJhbCBzeW1ib2xzIHdpdGggdGhlIHNhbWUKLSAgICAgdmFsdWUsIHdlIHdhbnQgdGhlIGZpcnN0IG9uZS4gICovCi0gIHRoaXNwbGFjZSA9IG1pbjsKLSAgd2hpbGUgKHRoaXNwbGFjZSA+IDAKLQkgJiYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1t0aGlzcGxhY2VdKQotCSAgICAgPT0gYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZSAtIDFdKSkpCi0gICAgLS10aGlzcGxhY2U7Ci0KLSAgLyogSWYgdGhlIGZpbGUgaXMgcmVsb2NhdGVhYmxlLCBhbmQgdGhlIHN5bWJvbCBjb3VsZCBiZSBmcm9tIHRoaXMKLSAgICAgc2VjdGlvbiwgcHJlZmVyIGEgc3ltYm9sIGZyb20gdGhpcyBzZWN0aW9uIG92ZXIgc3ltYm9scyBmcm9tCi0gICAgIG90aGVycywgZXZlbiBpZiB0aGUgb3RoZXIgc3ltYm9sJ3MgdmFsdWUgbWlnaHQgYmUgY2xvc2VyLgotICAgICAgIAotICAgICBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgd3JvbmcgZm9yIHNvbWUgc3ltYm9sIHJlZmVyZW5jZXMgaWYgdGhlCi0gICAgIHNlY3Rpb25zIGhhdmUgb3ZlcmxhcHBpbmcgbWVtb3J5IHJhbmdlcywgYnV0IGluIHRoYXQgY2FzZSB0aGVyZSdzCi0gICAgIG5vIHdheSB0byB0ZWxsIHdoYXQncyBkZXNpcmVkIHdpdGhvdXQgbG9va2luZyBhdCB0aGUgcmVsb2NhdGlvbgotICAgICB0YWJsZS4gICovCi0KLSAgaWYgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0tPnNlY3Rpb24gIT0gc2VjCi0gICAgICAmJiAocmVxdWlyZV9zZWMKLQkgIHx8ICgoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpICE9IDAKLQkgICAgICAmJiB2bWEgPj0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCSAgICAgICYmIHZtYSA8IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCQkrIGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYykpKSkpCi0gICAgewotICAgICAgbG9uZyBpOwotCi0gICAgICBmb3IgKGkgPSB0aGlzcGxhY2UgKyAxOyBpIDwgc29ydGVkX3N5bWNvdW50OyBpKyspCi0JewotCSAgaWYgKGJmZF9hc3ltYm9sX3ZhbHVlIChzb3J0ZWRfc3ltc1tpXSkKLQkgICAgICAhPSBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIC0taTsKLSAgICAgIGZvciAoOyBpID49IDA7IGktLSkKLQl7Ci0JICBpZiAoc29ydGVkX3N5bXNbaV0tPnNlY3Rpb24gPT0gc2VjCi0JICAgICAgJiYgKGkgPT0gMAotCQkgIHx8IHNvcnRlZF9zeW1zW2kgLSAxXS0+c2VjdGlvbiAhPSBzZWMKLQkJICB8fCAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW2ldKQotCQkgICAgICAhPSBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbaSAtIDFdKSkpKQotCSAgICB7Ci0JICAgICAgdGhpc3BsYWNlID0gaTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHNvcnRlZF9zeW1zW3RoaXNwbGFjZV0tPnNlY3Rpb24gIT0gc2VjKQotCXsKLQkgIC8qIFdlIGRpZG4ndCBmaW5kIGEgZ29vZCBzeW1ib2wgd2l0aCBhIHNtYWxsZXIgdmFsdWUuCi0JICAgICBMb29rIGZvciBvbmUgd2l0aCBhIGxhcmdlciB2YWx1ZS4gICovCi0JICBmb3IgKGkgPSB0aGlzcGxhY2UgKyAxOyBpIDwgc29ydGVkX3N5bWNvdW50OyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc29ydGVkX3N5bXNbaV0tPnNlY3Rpb24gPT0gc2VjKQotCQl7Ci0JCSAgdGhpc3BsYWNlID0gaTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc29ydGVkX3N5bXNbdGhpc3BsYWNlXS0+c2VjdGlvbiAhPSBzZWMKLQkgICYmIChyZXF1aXJlX3NlYwotCSAgICAgIHx8ICgoYWJmZC0+ZmxhZ3MgJiBIQVNfUkVMT0MpICE9IDAKLQkJICAmJiB2bWEgPj0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICYmIHZtYSA8IChiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBzZWMpCi0JCQkgICAgKyBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpKSkpKQotCXsKLQkgIC8qIFRoZXJlIGlzIG5vIHN1aXRhYmxlIHN5bWJvbC4gICovCi0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmIChwbGFjZSAhPSBOVUxMKQotICAgICpwbGFjZSA9IHRoaXNwbGFjZTsKLQotICByZXR1cm4gc29ydGVkX3N5bXNbdGhpc3BsYWNlXTsKLX0KLQotLyogUHJpbnQgYW4gYWRkcmVzcyB0byBJTkZPIHN5bWJvbGljYWxseS4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0gKGFiZmQsIHNlYywgc3ltLCB2bWEsIGluZm8sIHNraXBfemVyb2VzKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBib29sZWFuIHNraXBfemVyb2VzOwotewotICBvYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEsIGluZm8sIHNraXBfemVyb2VzKTsKLQotICBpZiAoc3ltID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3ZtYSBzZWNhZGRyOwotCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiA8JXMiLAotCQkJICAgICBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci0gICAgICBzZWNhZGRyID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKTsKLSAgICAgIGlmICh2bWEgPCBzZWNhZGRyKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLTB4Iik7Ci0JICBvYmpkdW1wX3ByaW50X3ZhbHVlIChzZWNhZGRyIC0gdm1hLCBpbmZvLCB0cnVlKTsKLQl9Ci0gICAgICBlbHNlIGlmICh2bWEgPiBzZWNhZGRyKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKzB4Iik7Ci0JICBvYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEgLSBzZWNhZGRyLCBpbmZvLCB0cnVlKTsKLQl9Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIj4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiA8Iik7Ci0gICAgICBvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIGluZm8sIHN5bSk7Ci0gICAgICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiB2bWEpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItMHgiKTsKLQkgIG9iamR1bXBfcHJpbnRfdmFsdWUgKGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pIC0gdm1hLCBpbmZvLCB0cnVlKTsKLQl9Ci0gICAgICBlbHNlIGlmICh2bWEgPiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisweCIpOwotCSAgb2JqZHVtcF9wcmludF92YWx1ZSAodm1hIC0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSksIGluZm8sIHRydWUpOwotCX0KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPiIpOwotICAgIH0KLX0KLQotLyogUHJpbnQgVk1BIHRvIElORk8sIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gIElmIFNLSVBfWkVST0VTIGlzCi0gICB0cnVlLCBkb24ndCBvdXRwdXQgbGVhZGluZyB6ZXJvZXMuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqZHVtcF9wcmludF9hZGRyICh2bWEsIGluZm8sIHNraXBfemVyb2VzKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJvb2xlYW4gc2tpcF96ZXJvZXM7Ci17Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICphdXg7Ci0gIGFzeW1ib2wgKnN5bTsKLQotICBpZiAoc29ydGVkX3N5bWNvdW50IDwgMSkKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4Iik7Ci0gICAgICBvYmpkdW1wX3ByaW50X3ZhbHVlICh2bWEsIGluZm8sIHNraXBfemVyb2VzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXV4ID0gKHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvICopIGluZm8tPmFwcGxpY2F0aW9uX2RhdGE7Ci0gIHN5bSA9IGZpbmRfc3ltYm9sX2Zvcl9hZGRyZXNzIChhdXgtPmFiZmQsIGF1eC0+c2VjLCB2bWEsIGF1eC0+cmVxdWlyZV9zZWMsCi0JCQkJIChsb25nICopIE5VTEwpOwotICBvYmpkdW1wX3ByaW50X2FkZHJfd2l0aF9zeW0gKGF1eC0+YWJmZCwgYXV4LT5zZWMsIHN5bSwgdm1hLCBpbmZvLAotCQkJICAgICAgIHNraXBfemVyb2VzKTsKLX0KLQotLyogUHJpbnQgVk1BIHRvIElORk8uICBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byB0aGUgZGlzYXNzZW1ibGVyCi0gICByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamR1bXBfcHJpbnRfYWRkcmVzcyAodm1hLCBpbmZvKQotICAgICBiZmRfdm1hIHZtYTsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIG9iamR1bXBfcHJpbnRfYWRkciAodm1hLCBpbmZvLCAhIHByZWZpeF9hZGRyZXNzZXMpOwotfQotCi0vKiBEZXRlcm1pbmUgb2YgdGhlIGdpdmVuIGFkZHJlc3MgaGFzIGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBpdC4gICovCi0KLXN0YXRpYyBpbnQKLW9iamR1bXBfc3ltYm9sX2F0X2FkZHJlc3MgKHZtYSwgaW5mbykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKiBhdXg7Ci0gIGFzeW1ib2wgKiBzeW07Ci0KLSAgLyogTm8gc3ltYm9scyAtIGRvIG5vdCBib3RoZXIgY2hlY2tpbmcuICAqLwotICBpZiAoc29ydGVkX3N5bWNvdW50IDwgMSkKLSAgICByZXR1cm4gMDsKLQotICBhdXggPSAoc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKikgaW5mby0+YXBwbGljYXRpb25fZGF0YTsKLSAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGF1eC0+YWJmZCwgYXV4LT5zZWMsIHZtYSwgYXV4LT5yZXF1aXJlX3NlYywKLQkJCQkgKGxvbmcgKikgTlVMTCk7Ci0KLSAgcmV0dXJuIChzeW0gIT0gTlVMTCAmJiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPT0gdm1hKSk7Ci19Ci0KLS8qIEhvbGQgdGhlIGxhc3QgZnVuY3Rpb24gbmFtZSBhbmQgdGhlIGxhc3QgbGluZSBudW1iZXIgd2UgZGlzcGxheWVkCi0gICBpbiBhIGRpc2Fzc2VtYmx5LiAgKi8KLQotc3RhdGljIGNoYXIgKnByZXZfZnVuY3Rpb25uYW1lOwotc3RhdGljIHVuc2lnbmVkIGludCBwcmV2X2xpbmU7Ci0KLS8qIFdlIGtlZXAgYSBsaXN0IG9mIGFsbCBmaWxlcyB0aGF0IHdlIGhhdmUgc2VlbiB3aGVuIGRvaW5nIGEKLSAgIGRpc3Nhc3NlbWJseSB3aXRoIHNvdXJjZSwgc28gdGhhdCB3ZSBrbm93IGhvdyBtdWNoIG9mIHRoZSBmaWxlIHRvCi0gICBkaXNwbGF5LiAgVGhpcyBjYW4gYmUgaW1wb3J0YW50IGZvciBpbmxpbmVkIGZ1bmN0aW9ucy4gICovCi0KLXN0cnVjdCBwcmludF9maWxlX2xpc3QKLXsKLSAgc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqbmV4dDsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotICBGSUxFICpmOwotfTsKLQotc3RhdGljIHN0cnVjdCBwcmludF9maWxlX2xpc3QgKnByaW50X2ZpbGVzOwotCi0vKiBUaGUgbnVtYmVyIG9mIHByZWNlZGluZyBjb250ZXh0IGxpbmVzIHRvIHNob3cgd2hlbiB3ZSBzdGFydAotICAgZGlzcGxheWluZyBhIGZpbGUgZm9yIHRoZSBmaXJzdCB0aW1lLiAgKi8KLQotI2RlZmluZSBTSE9XX1BSRUNFRElOR19DT05URVhUX0xJTkVTICg1KQotCi0vKiBTa2lwIGFoZWFkIHRvIGEgZ2l2ZW4gbGluZSBpbiBhIGZpbGUsIG9wdGlvbmFsbHkgcHJpbnRpbmcgZWFjaAotICAgbGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1za2lwX3RvX2xpbmUgUEFSQU1TICgoc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4pKTsKLQotc3RhdGljIHZvaWQKLXNraXBfdG9fbGluZSAocCwgbGluZSwgc2hvdykKLSAgICAgc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqcDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGJvb2xlYW4gc2hvdzsKLXsKLSAgd2hpbGUgKHAtPmxpbmUgPCBsaW5lKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgIGlmIChmZ2V0cyAoYnVmLCBzaXplb2YgYnVmLCBwLT5mKSA9PSBOVUxMKQotCXsKLQkgIGZjbG9zZSAocC0+Zik7Ci0JICBwLT5mID0gTlVMTDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNob3cpCi0JcHJpbnRmICgiJXMiLCBidWYpOwotCi0gICAgICBpZiAoc3RyY2hyIChidWYsICdcbicpICE9IE5VTEwpCi0JKytwLT5saW5lOwotICAgIH0KLX0gIAotCi0vKiBTaG93IHRoZSBsaW5lIG51bWJlciwgb3IgdGhlIHNvdXJjZSBsaW5lLCBpbiBhIGRpc3Nhc3NlbWJseQotICAgbGlzdGluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1zaG93X2xpbmUgKGFiZmQsIHNlY3Rpb24sIG9mZikKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBvZmY7Ci17Ci0gIENPTlNUIGNoYXIgKmZpbGVuYW1lOwotICBDT05TVCBjaGFyICpmdW5jdGlvbm5hbWU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotCi0gIGlmICghIHdpdGhfbGluZV9udW1iZXJzICYmICEgd2l0aF9zb3VyY2VfY29kZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBzeW1zLCBvZmYsICZmaWxlbmFtZSwKLQkJCSAgICAgICAmZnVuY3Rpb25uYW1lLCAmbGluZSkpCi0gICAgcmV0dXJuOwotCi0gIGlmIChmaWxlbmFtZSAhPSBOVUxMICYmICpmaWxlbmFtZSA9PSAnXDAnKQotICAgIGZpbGVuYW1lID0gTlVMTDsKLSAgaWYgKGZ1bmN0aW9ubmFtZSAhPSBOVUxMICYmICpmdW5jdGlvbm5hbWUgPT0gJ1wwJykKLSAgICBmdW5jdGlvbm5hbWUgPSBOVUxMOwotCi0gIGlmICh3aXRoX2xpbmVfbnVtYmVycykKLSAgICB7Ci0gICAgICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKLQkgICYmIChwcmV2X2Z1bmN0aW9ubmFtZSA9PSBOVUxMCi0JICAgICAgfHwgc3RyY21wIChmdW5jdGlvbm5hbWUsIHByZXZfZnVuY3Rpb25uYW1lKSAhPSAwKSkKLQlwcmludGYgKCIlcygpOlxuIiwgZnVuY3Rpb25uYW1lKTsKLSAgICAgIGlmIChsaW5lID4gMCAmJiBsaW5lICE9IHByZXZfbGluZSkKLQlwcmludGYgKCIlczoldVxuIiwgZmlsZW5hbWUgPT0gTlVMTCA/ICI/Pz8iIDogZmlsZW5hbWUsIGxpbmUpOwotICAgIH0KLQotICBpZiAod2l0aF9zb3VyY2VfY29kZQotICAgICAgJiYgZmlsZW5hbWUgIT0gTlVMTAotICAgICAgJiYgbGluZSA+IDApCi0gICAgewotICAgICAgc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqKnBwLCAqcDsKLQotICAgICAgZm9yIChwcCA9ICZwcmludF9maWxlczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCWlmIChzdHJjbXAgKCgqcHApLT5maWxlbmFtZSwgZmlsZW5hbWUpID09IDApCi0JICBicmVhazsKLSAgICAgIHAgPSAqcHA7Ci0KLSAgICAgIGlmIChwICE9IE5VTEwpCi0JewotCSAgaWYgKHAgIT0gcHJpbnRfZmlsZXMpCi0JICAgIHsKLQkgICAgICBpbnQgbDsKLQotCSAgICAgIC8qIFdlIGhhdmUgcmVlbmNvdW50ZXJlZCBhIGZpbGUgbmFtZSB3aGljaCB3ZSBzYXcKLQkJIGVhcmxpZXIuICBUaGlzIGltcGxpZXMgdGhhdCBlaXRoZXIgd2UgYXJlIGR1bXBpbmcgb3V0Ci0JCSBjb2RlIGZyb20gYW4gaW5jbHVkZWQgZmlsZSwgb3IgdGhlIHNhbWUgZmlsZSB3YXMKLQkJIGxpbmtlZCBpbiBtb3JlIHRoYW4gb25jZS4gIFRoZXJlIGFyZSB0d28gY29tbW9uIGNhc2VzCi0JCSBvZiBhbiBpbmNsdWRlZCBmaWxlOiBpbmxpbmUgZnVuY3Rpb25zIGluIGEgaGVhZGVyCi0JCSBmaWxlLCBhbmQgYSBiaXNvbiBvciBmbGV4IHNrZWxldG9uIGZpbGUuICBJbiB0aGUKLQkJIGZvcm1lciBjYXNlIHdlIHdhbnQgdG8ganVzdCBzdGFydCBwcmludGluZyAoYnV0IHdlCi0JCSBiYWNrIHVwIGEgZmV3IGxpbmVzIHRvIGdpdmUgY29udGV4dCk7IGluIHRoZSBsYXR0ZXIKLQkJIGNhc2Ugd2Ugd2FudCB0byBjb250aW51ZSBmcm9tIHdoZXJlIHdlIGxlZnQgb2ZmLiAgSQotCQkgY2FuJ3QgdGhpbmsgb2YgYSBnb29kIHdheSB0byBkaXN0aW5ndWlzaCB0aGUgY2FzZXMsCi0JCSBzbyBJIHVzZWQgYSBoZXVyaXN0aWMgYmFzZWQgb24gdGhlIGZpbGUgbmFtZS4gICovCi0JICAgICAgaWYgKHN0cmNtcCAocC0+ZmlsZW5hbWUgKyBzdHJsZW4gKHAtPmZpbGVuYW1lKSAtIDIsICIuaCIpICE9IDApCi0JCWwgPSBwLT5saW5lOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGwgPSBsaW5lIC0gU0hPV19QUkVDRURJTkdfQ09OVEVYVF9MSU5FUzsKLQkJICBpZiAobCA8PSAwKQotCQkgICAgbCA9IDE7Ci0JCX0KLQotCSAgICAgIGlmIChwLT5mID09IE5VTEwpCi0JCXsKLQkJICBwLT5mID0gZm9wZW4gKHAtPmZpbGVuYW1lLCAiciIpOwotCQkgIHAtPmxpbmUgPSAwOwotCQl9Ci0JICAgICAgaWYgKHAtPmYgIT0gTlVMTCkKLQkJc2tpcF90b19saW5lIChwLCBsLCBmYWxzZSk7Ci0KLQkgICAgICBpZiAocHJpbnRfZmlsZXMtPmYgIT0gTlVMTCkKLQkJewotCQkgIGZjbG9zZSAocHJpbnRfZmlsZXMtPmYpOwotCQkgIHByaW50X2ZpbGVzLT5mID0gTlVMTDsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChwLT5mICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBza2lwX3RvX2xpbmUgKHAsIGxpbmUsIHRydWUpOwotCSAgICAgICpwcCA9IHAtPm5leHQ7Ci0JICAgICAgcC0+bmV4dCA9IHByaW50X2ZpbGVzOwotCSAgICAgIHByaW50X2ZpbGVzID0gcDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBGSUxFICpmOwotCi0JICBmID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGludCBsOwotCi0JICAgICAgcCA9ICgoc3RydWN0IHByaW50X2ZpbGVfbGlzdCAqKQotCQkgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBwcmludF9maWxlX2xpc3QpKSk7Ci0JICAgICAgcC0+ZmlsZW5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKSArIDEpOwotCSAgICAgIHN0cmNweSAocC0+ZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQkgICAgICBwLT5saW5lID0gMDsKLQkgICAgICBwLT5mID0gZjsKLQotCSAgICAgIGlmIChwcmludF9maWxlcyAhPSBOVUxMICYmIHByaW50X2ZpbGVzLT5mICE9IE5VTEwpCi0JCXsKLQkJICBmY2xvc2UgKHByaW50X2ZpbGVzLT5mKTsKLQkJICBwcmludF9maWxlcy0+ZiA9IE5VTEw7Ci0JCX0KLQkgICAgICBwLT5uZXh0ID0gcHJpbnRfZmlsZXM7Ci0JICAgICAgcHJpbnRfZmlsZXMgPSBwOwotCi0JICAgICAgbCA9IGxpbmUgLSBTSE9XX1BSRUNFRElOR19DT05URVhUX0xJTkVTOwotCSAgICAgIGlmIChsIDw9IDApCi0JCWwgPSAxOwotCSAgICAgIHNraXBfdG9fbGluZSAocCwgbCwgZmFsc2UpOwotCSAgICAgIGlmIChwLT5mICE9IE5VTEwpCi0JCXNraXBfdG9fbGluZSAocCwgbGluZSwgdHJ1ZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmdW5jdGlvbm5hbWUgIT0gTlVMTAotICAgICAgJiYgKHByZXZfZnVuY3Rpb25uYW1lID09IE5VTEwKLQkgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBwcmV2X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCi0gICAgewotICAgICAgaWYgKHByZXZfZnVuY3Rpb25uYW1lICE9IE5VTEwpCi0JZnJlZSAocHJldl9mdW5jdGlvbm5hbWUpOwotICAgICAgcHJldl9mdW5jdGlvbm5hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGZ1bmN0aW9ubmFtZSkgKyAxKTsKLSAgICAgIHN0cmNweSAocHJldl9mdW5jdGlvbm5hbWUsIGZ1bmN0aW9ubmFtZSk7Ci0gICAgfQotCi0gIGlmIChsaW5lID4gMCAmJiBsaW5lICE9IHByZXZfbGluZSkKLSAgICBwcmV2X2xpbmUgPSBsaW5lOwotfQotCi0vKiBQc2V1ZG8gRklMRSBvYmplY3QgZm9yIHN0cmluZ3MuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY2hhciAqYnVmZmVyOwotICBzaXplX3Qgc2l6ZTsKLSAgY2hhciAqY3VycmVudDsKLX0gU0ZJTEU7Ci0KLS8qIHNwcmludGYgdG8gYSAic3RyZWFtIiAqLwotCi1zdGF0aWMgaW50Ci0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1vYmpkdW1wX3NwcmludGYgKFNGSUxFICpmLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKLSNlbHNlCi1vYmpkdW1wX3NwcmludGYgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotI2lmbmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgU0ZJTEUgKmY7Ci0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSNlbmRpZgotICBjaGFyICpidWY7Ci0gIHZhX2xpc3QgYXJnczsKLSAgc2l6ZV90IG47Ci0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0gIGYgPSB2YV9hcmcgKGFyZ3MsIFNGSUxFICopOwotICBmb3JtYXQgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLQotICB2YXNwcmludGYgKCZidWYsIGZvcm1hdCwgYXJncyk7Ci0KLSAgdmFfZW5kIChhcmdzKTsKLQotICBpZiAoYnVmID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJPdXQgb2YgdmlydHVhbCBtZW1vcnlcbiIpKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBuID0gc3RybGVuIChidWYpOwotCi0gIHdoaWxlICgoZi0+YnVmZmVyICsgZi0+c2l6ZSkgLSBmLT5jdXJyZW50IDwgbiArIDEpCi0gICAgewotICAgICAgc2l6ZV90IGN1cnJvZmY7Ci0KLSAgICAgIGN1cnJvZmYgPSBmLT5jdXJyZW50IC0gZi0+YnVmZmVyOwotICAgICAgZi0+c2l6ZSAqPSAyOwotICAgICAgZi0+YnVmZmVyID0geHJlYWxsb2MgKGYtPmJ1ZmZlciwgZi0+c2l6ZSk7Ci0gICAgICBmLT5jdXJyZW50ID0gZi0+YnVmZmVyICsgY3Vycm9mZjsKLSAgICB9Ci0KLSAgbWVtY3B5IChmLT5jdXJyZW50LCBidWYsIG4pOwotICBmLT5jdXJyZW50ICs9IG47Ci0gIGYtPmN1cnJlbnRbMF0gPSAnXDAnOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIG47Ci19Ci0KLS8qIFRoZSBudW1iZXIgb2YgemVyb2VzIHdlIHdhbnQgdG8gc2VlIGJlZm9yZSB3ZSBzdGFydCBza2lwcGluZyB0aGVtLgotICAgVGhlIG51bWJlciBpcyBhcmJpdHJhcmlseSBjaG9zZW4uICAqLwotCi0jZGVmaW5lIFNLSVBfWkVST0VTICg4KQotCi0vKiBUaGUgbnVtYmVyIG9mIHplcm9lcyB0byBza2lwIGF0IHRoZSBlbmQgb2YgYSBzZWN0aW9uLiAgSWYgdGhlCi0gICBudW1iZXIgb2YgemVyb2VzIGF0IHRoZSBlbmQgaXMgYmV0d2VlbiBTS0lQX1pFUk9FU19BVF9FTkQgYW5kCi0gICBTS0lQX1pFUk9FUywgdGhleSB3aWxsIGJlIGRpc2Fzc2VtYmxlZC4gIElmIHRoZXJlIGFyZSBmZXdlciB0aGFuCi0gICBTS0lQX1pFUk9FU19BVF9FTkQsIHRoZXkgd2lsbCBiZSBza2lwcGVkLiAgVGhpcyBpcyBhIGhldXJpc3RpYwotICAgYXR0ZW1wdCB0byBhdm9pZCBkaXNhc3NlbWJsaW5nIHplcm9lcyBpbnNlcnRlZCBieSBzZWN0aW9uCi0gICBhbGlnbm1lbnQuICAqLwotCi0jZGVmaW5lIFNLSVBfWkVST0VTX0FUX0VORCAoMykKLQotLyogRGlzYXNzZW1ibGUgc29tZSBkYXRhIGluIG1lbW9yeSBiZXR3ZWVuIGdpdmVuIHZhbHVlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1kaXNhc3NlbWJsZV9ieXRlcyAoaW5mbywgZGlzYXNzZW1ibGVfZm4sIGluc25zLCBkYXRhLCBzdGFydCwgc3RvcCwgcmVscHBwLAotCQkgICByZWxwcGVuZCkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZV9mbjsKLSAgICAgYm9vbGVhbiBpbnNuczsKLSAgICAgYmZkX2J5dGUgKmRhdGE7Ci0gICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgIGJmZF92bWEgc3RvcDsKLSAgICAgYXJlbGVudCAqKipyZWxwcHA7Ci0gICAgIGFyZWxlbnQgKipyZWxwcGVuZDsKLXsKLSAgc3RydWN0IG9iamR1bXBfZGlzYXNtX2luZm8gKmF1eDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGludCBieXRlc19wZXJfbGluZTsKLSAgYm9vbGVhbiBkb25lX2RvdDsKLSAgaW50IHNraXBfYWRkcl9jaGFyczsKLSAgYmZkX3ZtYSBpOwotCi0gIGF1eCA9IChzdHJ1Y3Qgb2JqZHVtcF9kaXNhc21faW5mbyAqKSBpbmZvLT5hcHBsaWNhdGlvbl9kYXRhOwotICBzZWN0aW9uID0gYXV4LT5zZWM7Ci0KLSAgaWYgKGluc25zKQotICAgIGJ5dGVzX3Blcl9saW5lID0gNDsKLSAgZWxzZQotICAgIGJ5dGVzX3Blcl9saW5lID0gMTY7Ci0KLSAgLyogRmlndXJlIG91dCBob3cgbWFueSBjaGFyYWN0ZXJzIHRvIHNraXAgYXQgdGhlIHN0YXJ0IG9mIGFuCi0gICAgIGFkZHJlc3MsIHRvIG1ha2UgdGhlIGRpc2Fzc2VtYmx5IGxvb2sgbmljZXIuICBXZSBkaXNjYXJkIGxlYWRpbmcKLSAgICAgemVyb2VzIGluIGNodW5rcyBvZiA0LCBlbnN1cmluZyB0aGF0IHRoZXJlIGlzIGFsd2F5cyBhIGxlYWRpbmcKLSAgICAgemVybyByZW1haW5pbmcuICAqLwotICBza2lwX2FkZHJfY2hhcnMgPSAwOwotICBpZiAoISBwcmVmaXhfYWRkcmVzc2VzKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzMwXTsKLSAgICAgIGNoYXIgKnM7Ci0KLSAgICAgIHNwcmludGZfdm1hIChidWYsCi0JCSAgIHNlY3Rpb24tPnZtYSArIGJmZF9zZWN0aW9uX3NpemUgKHNlY3Rpb24tPm93bmVyLCBzZWN0aW9uKSk7Ci0gICAgICBzID0gYnVmOwotICAgICAgd2hpbGUgKHNbMF0gPT0gJzAnICYmIHNbMV0gPT0gJzAnICYmIHNbMl0gPT0gJzAnICYmIHNbM10gPT0gJzAnCi0JICAgICAmJiBzWzRdID09ICcwJykKLQl7Ci0JICBza2lwX2FkZHJfY2hhcnMgKz0gNDsKLQkgIHMgKz0gNDsKLQl9Ci0gICAgfQotCi0gIGluZm8tPmluc25faW5mb192YWxpZCA9IDA7Ci0KLSAgZG9uZV9kb3QgPSBmYWxzZTsKLSAgaSA9IHN0YXJ0OwotICB3aGlsZSAoaSA8IHN0b3ApCi0gICAgewotICAgICAgYmZkX3ZtYSB6OwotICAgICAgaW50IGJ5dGVzID0gMDsKLSAgICAgIGJvb2xlYW4gbmVlZF9ubCA9IGZhbHNlOwotCi0gICAgICAvKiBJZiB3ZSBzZWUgbW9yZSB0aGFuIFNLSVBfWkVST0VTIGJ5dGVzIG9mIHplcm9lcywgd2UganVzdAotICAgICAgICAgcHJpbnQgYC4uLicuICAqLwotICAgICAgZm9yICh6ID0gaTsgeiA8IHN0b3A7IHorKykKLQlpZiAoZGF0YVt6XSAhPSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoISBkaXNhc3NlbWJsZV96ZXJvZXMKLQkgICYmIChpbmZvLT5pbnNuX2luZm9fdmFsaWQgPT0gMAotCSAgICAgIHx8IGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9PSAwKQotCSAgJiYgKHogLSBpID49IFNLSVBfWkVST0VTCi0JICAgICAgfHwgKHogPT0gc3RvcCAmJiB6IC0gaSA8IFNLSVBfWkVST0VTX0FUX0VORCkpKQotCXsKLQkgIHByaW50ZiAoIlx0Li4uXG4iKTsKLQotCSAgLyogSWYgdGhlcmUgYXJlIG1vcmUgbm9uemVybyBieXRlcyB0byBmb2xsb3csIHdlIG9ubHkgc2tpcAotICAgICAgICAgICAgIHplcm9lcyBpbiBtdWx0aXBsZXMgb2YgNCwgdG8gdHJ5IHRvIGF2b2lkIHJ1bm5pbmcgb3ZlcgotICAgICAgICAgICAgIHRoZSBzdGFydCBvZiBhbiBpbnN0cnVjdGlvbiB3aGljaCBoYXBwZW5zIHRvIHN0YXJ0IHdpdGgKLSAgICAgICAgICAgICB6ZXJvLiAgKi8KLQkgIGlmICh6ICE9IHN0b3ApCi0JICAgIHogPSBpICsgKCh6IC0gaSkgJn4gMyk7Ci0KLQkgIGJ5dGVzID0geiAtIGk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgYnVmWzUwXTsKLQkgIFNGSUxFIHNmaWxlOwotCSAgaW50IGJwYyA9IDA7Ci0JICBpbnQgcGIgPSAwOwotCi0JICBkb25lX2RvdCA9IGZhbHNlOwotCi0JICBpZiAod2l0aF9saW5lX251bWJlcnMgfHwgd2l0aF9zb3VyY2VfY29kZSkKLQkgICAgc2hvd19saW5lIChhdXgtPmFiZmQsIHNlY3Rpb24sIGkpOwotCi0JICBpZiAoISBwcmVmaXhfYWRkcmVzc2VzKQotCSAgICB7Ci0JICAgICAgY2hhciAqczsKLQotCSAgICAgIHNwcmludGZfdm1hIChidWYsIHNlY3Rpb24tPnZtYSArIGkpOwotCSAgICAgIGZvciAocyA9IGJ1ZiArIHNraXBfYWRkcl9jaGFyczsgKnMgPT0gJzAnOyBzKyspCi0JCSpzID0gJyAnOwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQkqLS1zID0gJzAnOwotCSAgICAgIHByaW50ZiAoIiVzOlx0IiwgYnVmICsgc2tpcF9hZGRyX2NoYXJzKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXV4LT5yZXF1aXJlX3NlYyA9IHRydWU7Ci0JICAgICAgb2JqZHVtcF9wcmludF9hZGRyZXNzIChzZWN0aW9uLT52bWEgKyBpLCBpbmZvKTsKLQkgICAgICBhdXgtPnJlcXVpcmVfc2VjID0gZmFsc2U7Ci0JICAgICAgcHV0Y2hhciAoJyAnKTsKLQkgICAgfQotCi0JICBpZiAoaW5zbnMpCi0JICAgIHsKLQkgICAgICBzZmlsZS5zaXplID0gMTIwOwotCSAgICAgIHNmaWxlLmJ1ZmZlciA9IHhtYWxsb2MgKHNmaWxlLnNpemUpOwotCSAgICAgIHNmaWxlLmN1cnJlbnQgPSBzZmlsZS5idWZmZXI7Ci0JICAgICAgaW5mby0+ZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpIG9iamR1bXBfc3ByaW50ZjsKLQkgICAgICBpbmZvLT5zdHJlYW0gPSAoRklMRSAqKSAmc2ZpbGU7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSAwOwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDA7Ci0KLQkgICAgICAvKiBGSVhNRTogVGhpcyBpcyB3cm9uZy4gIEl0IHRlc3RzIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgICAgICAgICAgICAgaW4gdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUgY3VycmVudCBvbmUuICAqLwotCSAgICAgIGlmICgqcmVscHBwIDwgcmVscHBlbmQKLQkJICAmJiAoKipyZWxwcHApLT5hZGRyZXNzID49IGkKLQkJICAmJiAoKipyZWxwcHApLT5hZGRyZXNzIDwgaSArIGJ5dGVzKQotCQlpbmZvLT5mbGFncyA9IElOU05fSEFTX1JFTE9DOwotCSAgICAgIGVsc2UKLQkJaW5mby0+ZmxhZ3MgPSAwOwotCi0JICAgICAgYnl0ZXMgPSAoKmRpc2Fzc2VtYmxlX2ZuKSAoc2VjdGlvbi0+dm1hICsgaSwgaW5mbyk7Ci0JICAgICAgaW5mby0+ZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpIGZwcmludGY7Ci0JICAgICAgaW5mby0+c3RyZWFtID0gc3Rkb3V0OwotCSAgICAgIGlmIChpbmZvLT5ieXRlc19wZXJfbGluZSAhPSAwKQotCQlieXRlc19wZXJfbGluZSA9IGluZm8tPmJ5dGVzX3Blcl9saW5lOwotCSAgICAgIGlmIChieXRlcyA8IDApCi0JCXsKLQkJICBpZiAoc2ZpbGUuY3VycmVudCAhPSBzZmlsZS5idWZmZXIpCi0JCSAgICBwcmludGYgKCIlc1xuIiwgc2ZpbGUuYnVmZmVyKTsKLQkJICBmcmVlIChzZmlsZS5idWZmZXIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxvbmcgajsKLQotCSAgICAgIGJ5dGVzID0gYnl0ZXNfcGVyX2xpbmU7Ci0JICAgICAgaWYgKGkgKyBieXRlcyA+IHN0b3ApCi0JCWJ5dGVzID0gc3RvcCAtIGk7Ci0KLQkgICAgICBmb3IgKGogPSBpOyBqIDwgaSArIGJ5dGVzOyArK2opCi0JCXsKLQkJICBpZiAoaXNwcmludCAoZGF0YVtqXSkpCi0JCSAgICBidWZbaiAtIGldID0gZGF0YVtqXTsKLQkJICBlbHNlCi0JCSAgICBidWZbaiAtIGldID0gJy4nOwotCQl9Ci0JICAgICAgYnVmW2ogLSBpXSA9ICdcMCc7Ci0JICAgIH0KLQotCSAgaWYgKHByZWZpeF9hZGRyZXNzZXMKLQkgICAgICA/IHNob3dfcmF3X2luc24gPiAwCi0JICAgICAgOiBzaG93X3Jhd19pbnNuID49IDApCi0JICAgIHsKLQkgICAgICBsb25nIGo7Ci0KLQkgICAgICAvKiBJZiAhIHByZWZpeF9hZGRyZXNzZXMgYW5kICEgd2lkZV9vdXRwdXQsIHdlIHByaW50Ci0gICAgICAgICAgICAgICAgIGJ5dGVzX3Blcl9saW5lIGJ5dGVzIHBlciBsaW5lLiAgKi8KLQkgICAgICBwYiA9IGJ5dGVzOwotCSAgICAgIGlmIChwYiA+IGJ5dGVzX3Blcl9saW5lICYmICEgcHJlZml4X2FkZHJlc3NlcyAmJiAhIHdpZGVfb3V0cHV0KQotCQlwYiA9IGJ5dGVzX3Blcl9saW5lOwotCi0JICAgICAgaWYgKGluZm8tPmJ5dGVzX3Blcl9jaHVuaykKLQkJYnBjID0gaW5mby0+Ynl0ZXNfcGVyX2NodW5rOwotCSAgICAgIGVsc2UKLQkJYnBjID0gMTsKLQotCSAgICAgIGZvciAoaiA9IGk7IGogPCBpICsgcGI7IGogKz0gYnBjKQotCQl7Ci0JCSAgaW50IGs7Ci0JCSAgaWYgKGJwYyA+IDEgJiYgaW5mby0+ZGlzcGxheV9lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0JCSAgICB7Ci0JCSAgICAgIGZvciAoayA9IGJwYyAtIDE7IGsgPj0gMDsgay0tKQotCQkJcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOwotCQkgICAgICBwdXRjaGFyICgnICcpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgZm9yIChrID0gMDsgayA8IGJwYzsgaysrKQotCQkJcHJpbnRmICgiJTAyeCIsICh1bnNpZ25lZCkgZGF0YVtqICsga10pOwotCQkgICAgICBwdXRjaGFyICgnICcpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmb3IgKDsgcGIgPCBieXRlc19wZXJfbGluZTsgcGIgKz0gYnBjKQotCQl7Ci0JCSAgaW50IGs7Ci0KLQkJICBmb3IgKGsgPSAwOyBrIDwgYnBjOyBrKyspCi0JCSAgICBwcmludGYgKCIgICIpOwotCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCX0KLQotCSAgICAgIC8qIFNlcGFyYXRlIHJhdyBkYXRhIGZyb20gaW5zdHJ1Y3Rpb24gYnkgZXh0cmEgc3BhY2UuICAqLwotCSAgICAgIGlmIChpbnNucykKLQkJcHV0Y2hhciAoJ1x0Jyk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCIgICAgIik7Ci0JICAgIH0KLQotCSAgaWYgKCEgaW5zbnMpCi0JICAgIHByaW50ZiAoIiVzIiwgYnVmKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzIiwgc2ZpbGUuYnVmZmVyKTsKLQkgICAgICBmcmVlIChzZmlsZS5idWZmZXIpOwotCSAgICB9Ci0KLQkgIGlmIChwcmVmaXhfYWRkcmVzc2VzCi0JICAgICAgPyBzaG93X3Jhd19pbnNuID4gMAotCSAgICAgIDogc2hvd19yYXdfaW5zbiA+PSAwKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKHBiIDwgYnl0ZXMpCi0JCXsKLQkJICBsb25nIGo7Ci0JCSAgY2hhciAqczsKLQotCQkgIHB1dGNoYXIgKCdcbicpOwotCQkgIGogPSBpICsgcGI7Ci0KLQkJICBzcHJpbnRmX3ZtYSAoYnVmLCBzZWN0aW9uLT52bWEgKyBqKTsKLQkJICBmb3IgKHMgPSBidWYgKyBza2lwX2FkZHJfY2hhcnM7ICpzID09ICcwJzsgcysrKQotCQkgICAgKnMgPSAnICc7Ci0JCSAgaWYgKCpzID09ICdcMCcpCi0JCSAgICAqLS1zID0gJzAnOwotCQkgIHByaW50ZiAoIiVzOlx0IiwgYnVmICsgc2tpcF9hZGRyX2NoYXJzKTsKLQotCQkgIHBiICs9IGJ5dGVzX3Blcl9saW5lOwotCQkgIGlmIChwYiA+IGJ5dGVzKQotCQkgICAgcGIgPSBieXRlczsKLQkJICBmb3IgKDsgaiA8IGkgKyBwYjsgaiArPSBicGMpCi0JCSAgICB7Ci0JCSAgICAgIGludCBrOwotCi0JCSAgICAgIGlmIChicGMgPiAxICYmIGluZm8tPmRpc3BsYXlfZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCQkJewotCQkJICBmb3IgKGsgPSBicGMgLSAxOyBrID49IDA7IGstLSkKLQkJCSAgICBwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSBkYXRhW2ogKyBrXSk7Ci0JCQkgIHB1dGNoYXIgKCcgJyk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgZm9yIChrID0gMDsgayA8IGJwYzsgaysrKQotCQkJICAgIHByaW50ZiAoIiUwMngiLCAodW5zaWduZWQpIGRhdGFbaiArIGtdKTsKLQkJCSAgcHV0Y2hhciAoJyAnKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmICghd2lkZV9vdXRwdXQpCi0JICAgIHB1dGNoYXIgKCdcbicpOwotCSAgZWxzZQotCSAgICBuZWVkX25sID0gdHJ1ZTsKLQl9Ci0KLSAgICAgIGlmIChkdW1wX3JlbG9jX2luZm8KLQkgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19SRUxPQykgIT0gMCkKLQl7Ci0JICB3aGlsZSAoKCpyZWxwcHApIDwgcmVscHBlbmQKLQkJICYmICgoKipyZWxwcHApLT5hZGRyZXNzID49IChiZmRfdm1hKSBpCi0JCSAgICAgJiYgKCoqcmVscHBwKS0+YWRkcmVzcyA8IChiZmRfdm1hKSBpICsgYnl0ZXMpKQotCSAgICB7Ci0JICAgICAgYXJlbGVudCAqcTsKLQotCSAgICAgIHEgPSAqKnJlbHBwcDsKLQotCSAgICAgIGlmICh3aWRlX291dHB1dCkKLQkJcHV0Y2hhciAoJ1x0Jyk7Ci0JICAgICAgZWxzZQotCQlwcmludGYgKCJcdFx0XHQiKTsKLQotCSAgICAgIG9iamR1bXBfcHJpbnRfdmFsdWUgKHNlY3Rpb24tPnZtYSArIHEtPmFkZHJlc3MsIGluZm8sIHRydWUpOwotCi0JICAgICAgcHJpbnRmICgiOiAlc1x0IiwgcS0+aG93dG8tPm5hbWUpOwotCi0JICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyID09IE5VTEwgfHwgKnEtPnN5bV9wdHJfcHRyID09IE5VTEwpCi0JCXByaW50ZiAoIip1bmtub3duKiIpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotCi0JCSAgc3ltX25hbWUgPSBiZmRfYXN5bWJvbF9uYW1lICgqcS0+c3ltX3B0cl9wdHIpOwotCQkgIGlmIChzeW1fbmFtZSAhPSBOVUxMICYmICpzeW1fbmFtZSAhPSAnXDAnKQotCQkgICAgb2JqZHVtcF9wcmludF9zeW1uYW1lIChhdXgtPmFiZmQsIGluZm8sICpxLT5zeW1fcHRyX3B0cik7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBhc2VjdGlvbiAqc3ltX3NlYzsKLQotCQkgICAgICBzeW1fc2VjID0gYmZkX2dldF9zZWN0aW9uICgqcS0+c3ltX3B0cl9wdHIpOwotCQkgICAgICBzeW1fbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhdXgtPmFiZmQsIHN5bV9zZWMpOwotCQkgICAgICBpZiAoc3ltX25hbWUgPT0gTlVMTCB8fCAqc3ltX25hbWUgPT0gJ1wwJykKLQkJCXN5bV9uYW1lID0gIip1bmtub3duKiI7Ci0JCSAgICAgIHByaW50ZiAoIiVzIiwgc3ltX25hbWUpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAocS0+YWRkZW5kKQotCQl7Ci0JCSAgcHJpbnRmICgiKzB4Iik7Ci0JCSAgb2JqZHVtcF9wcmludF92YWx1ZSAocS0+YWRkZW5kLCBpbmZvLCB0cnVlKTsKLQkJfQotCi0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgICBuZWVkX25sID0gZmFsc2U7Ci0JICAgICAgKysoKnJlbHBwcCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChuZWVkX25sKQotCXByaW50ZiAoIlxuIik7Ci0KLSAgICAgIGkgKz0gYnl0ZXM7Ci0gICAgfQotfQotCi0vKiBEaXNhc3NlbWJsZSB0aGUgY29udGVudHMgb2YgYW4gb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGVfZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBsb25nIGk7Ci0gIGRpc2Fzc2VtYmxlcl9mdHlwZSBkaXNhc3NlbWJsZV9mbjsKLSAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gZGlzYXNtX2luZm87Ci0gIHN0cnVjdCBvYmpkdW1wX2Rpc2FzbV9pbmZvIGF1eDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgcHJpbnRfZmlsZXMgPSBOVUxMOwotICBwcmV2X2Z1bmN0aW9ubmFtZSA9IE5VTEw7Ci0gIHByZXZfbGluZSA9IC0xOwotCi0gIC8qIFdlIG1ha2UgYSBjb3B5IG9mIHN5bXMgdG8gc29ydC4gIFdlIGRvbid0IHdhbnQgdG8gc29ydCBzeW1zCi0gICAgIGJlY2F1c2UgdGhhdCB3aWxsIHNjcmV3IHVwIHRoZSByZWxvY3MuICAqLwotICBzb3J0ZWRfc3ltcyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1jb3VudCAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIG1lbWNweSAoc29ydGVkX3N5bXMsIHN5bXMsIHN5bWNvdW50ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLQotICBzb3J0ZWRfc3ltY291bnQgPSByZW1vdmVfdXNlbGVzc19zeW1ib2xzIChzb3J0ZWRfc3ltcywgc3ltY291bnQpOwotCi0gIC8qIFNvcnQgdGhlIHN5bWJvbHMgaW50byBzZWN0aW9uIGFuZCBzeW1ib2wgb3JkZXIgKi8KLSAgcXNvcnQgKHNvcnRlZF9zeW1zLCBzb3J0ZWRfc3ltY291bnQsIHNpemVvZiAoYXN5bWJvbCAqKSwgY29tcGFyZV9zeW1ib2xzKTsKLQotICBJTklUX0RJU0FTU0VNQkxFX0lORk8oZGlzYXNtX2luZm8sIHN0ZG91dCwgZnByaW50Zik7Ci0gIGRpc2FzbV9pbmZvLmFwcGxpY2F0aW9uX2RhdGEgPSAoUFRSKSAmYXV4OwotICBhdXguYWJmZCA9IGFiZmQ7Ci0gIGF1eC5yZXF1aXJlX3NlYyA9IGZhbHNlOwotICBkaXNhc21faW5mby5wcmludF9hZGRyZXNzX2Z1bmMgPSBvYmpkdW1wX3ByaW50X2FkZHJlc3M7Ci0gIGRpc2FzbV9pbmZvLnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgPSBvYmpkdW1wX3N5bWJvbF9hdF9hZGRyZXNzOwotCi0gIGlmIChtYWNoaW5lICE9IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICppbmZvID0gYmZkX3NjYW5fYXJjaCAobWFjaGluZSk7Ci0gICAgICBpZiAoaW5mbyA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IHVzZSBzdXBwbGllZCBtYWNoaW5lICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLAotCQkgICBtYWNoaW5lKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIGFiZmQtPmFyY2hfaW5mbyA9IGluZm87Ci0gICAgfQotCi0gIGlmIChlbmRpYW4gIT0gQkZEX0VORElBTl9VTktOT1dOKQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfdGFyZ2V0ICp4dmVjOwotCi0gICAgICB4dmVjID0gKHN0cnVjdCBiZmRfdGFyZ2V0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF90YXJnZXQpKTsKLSAgICAgIG1lbWNweSAoeHZlYywgYWJmZC0+eHZlYywgc2l6ZW9mIChzdHJ1Y3QgYmZkX3RhcmdldCkpOwotICAgICAgeHZlYy0+Ynl0ZW9yZGVyID0gZW5kaWFuOwotICAgICAgYWJmZC0+eHZlYyA9IHh2ZWM7Ci0gICAgfQotCi0gIGRpc2Fzc2VtYmxlX2ZuID0gZGlzYXNzZW1ibGVyIChhYmZkKTsKLSAgaWYgKCFkaXNhc3NlbWJsZV9mbikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBkaXNhc3NlbWJsZSBmb3IgYXJjaGl0ZWN0dXJlICVzXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLAotCSAgICAgICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoYmZkX2dldF9hcmNoIChhYmZkKSwgMCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkaXNhc21faW5mby5mbGF2b3VyID0gYmZkX2dldF9mbGF2b3VyIChhYmZkKTsKLSAgZGlzYXNtX2luZm8uYXJjaCA9IGJmZF9nZXRfYXJjaCAoYWJmZCk7Ci0gIGRpc2FzbV9pbmZvLm1hY2ggPSBiZmRfZ2V0X21hY2ggKGFiZmQpOwotICBkaXNhc21faW5mby5kaXNhc3NlbWJsZXJfb3B0aW9ucyA9IGRpc2Fzc2VtYmxlcl9vcHRpb25zOwotICAKLSAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLSAgICBkaXNhc21faW5mby5kaXNwbGF5X2VuZGlhbiA9IGRpc2FzbV9pbmZvLmVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotICBlbHNlIGlmIChiZmRfbGl0dGxlX2VuZGlhbiAoYWJmZCkpCi0gICAgZGlzYXNtX2luZm8uZGlzcGxheV9lbmRpYW4gPSBkaXNhc21faW5mby5lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLSAgZWxzZQotICAgIC8qID8/PyBBYm9ydGluZyBoZXJlIHNlZW1zIHRvbyBkcmFzdGljLiAgV2UgY291bGQgZGVmYXVsdCB0byBiaWcgb3IgbGl0dGxlCi0gICAgICAgaW5zdGVhZC4gICovCi0gICAgZGlzYXNtX2luZm8uZW5kaWFuID0gQkZEX0VORElBTl9VTktOT1dOOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIHNlY3Rpb24gIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0gICAgICAgc2VjdGlvbiA9IHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgYmZkX2J5dGUgKmRhdGEgPSBOVUxMOwotICAgICAgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZSA9IDA7Ci0gICAgICBhcmVsZW50ICoqcmVsYnVmID0gTlVMTDsKLSAgICAgIGFyZWxlbnQgKipyZWxwcCA9IE5VTEw7Ci0gICAgICBhcmVsZW50ICoqcmVscHBlbmQgPSBOVUxMOwotICAgICAgbG9uZyBzdG9wOwotICAgICAgYXN5bWJvbCAqc3ltID0gTlVMTDsKLSAgICAgIGxvbmcgcGxhY2UgPSAwOwotCi0gICAgICBpZiAoKHNlY3Rpb24tPmZsYWdzICYgU0VDX0xPQUQpID09IDAKLQkgIHx8ICghIGRpc2Fzc2VtYmxlX2FsbAotCSAgICAgICYmIG9ubHkgPT0gTlVMTAotCSAgICAgICYmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChvbmx5ICE9IChjaGFyICopIE5VTEwgJiYgc3RyY21wIChvbmx5LCBzZWN0aW9uLT5uYW1lKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZHVtcF9yZWxvY19pbmZvCi0JICAmJiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVMT0MpICE9IDApCi0JewotCSAgbG9uZyByZWxzaXplOwotCi0JICByZWxzaXplID0gYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCAoYWJmZCwgc2VjdGlvbik7Ci0JICBpZiAocmVsc2l6ZSA8IDApCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0JICBpZiAocmVsc2l6ZSA+IDApCi0JICAgIHsKLQkgICAgICBsb25nIHJlbGNvdW50OwotCi0JICAgICAgcmVsYnVmID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKHJlbHNpemUpOwotCSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjdGlvbiwgcmVsYnVmLCBzeW1zKTsKLQkgICAgICBpZiAocmVsY291bnQgPCAwKQotCQliZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotCSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jcyBieSBhZGRyZXNzLiAgKi8KLQkgICAgICBxc29ydCAocmVsYnVmLCByZWxjb3VudCwgc2l6ZW9mIChhcmVsZW50ICopLCBjb21wYXJlX3JlbG9jcyk7Ci0KLQkgICAgICByZWxwcCA9IHJlbGJ1ZjsKLQkgICAgICByZWxwcGVuZCA9IHJlbHBwICsgcmVsY291bnQ7Ci0KLQkgICAgICAvKiBTa2lwIG92ZXIgdGhlIHJlbG9jcyBiZWxvbmdpbmcgdG8gYWRkcmVzc2VzIGJlbG93IHRoZQotCQkgc3RhcnQgYWRkcmVzcy4gICovCi0JICAgICAgaWYgKHN0YXJ0X2FkZHJlc3MgIT0gKGJmZF92bWEpIC0xKQotCQl7Ci0JCSAgd2hpbGUgKHJlbHBwIDwgcmVscHBlbmQKLQkJCSAmJiAoKnJlbHBwKS0+YWRkcmVzcyA8IHN0YXJ0X2FkZHJlc3MpCi0JCSAgICArK3JlbHBwOwotCQl9Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAlczpcbiIpLCBzZWN0aW9uLT5uYW1lKTsKLQotICAgICAgZGF0YXNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlY3Rpb24pOwotICAgICAgaWYgKGRhdGFzaXplID09IDApCi0JY29udGludWU7Ci0KLSAgICAgIGRhdGEgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoKHNpemVfdCkgZGF0YXNpemUpOwotCi0gICAgICBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlY3Rpb24sIGRhdGEsIDAsIGRhdGFzaXplKTsKLQotICAgICAgYXV4LnNlYyA9IHNlY3Rpb247Ci0gICAgICBkaXNhc21faW5mby5idWZmZXIgPSBkYXRhOwotICAgICAgZGlzYXNtX2luZm8uYnVmZmVyX3ZtYSA9IHNlY3Rpb24tPnZtYTsKLSAgICAgIGRpc2FzbV9pbmZvLmJ1ZmZlcl9sZW5ndGggPSBkYXRhc2l6ZTsKLSAgICAgIGlmIChzdGFydF9hZGRyZXNzID09IChiZmRfdm1hKSAtMQotCSAgfHwgc3RhcnRfYWRkcmVzcyA8IGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWEpCi0JaSA9IDA7Ci0gICAgICBlbHNlCi0JaSA9IHN0YXJ0X2FkZHJlc3MgLSBkaXNhc21faW5mby5idWZmZXJfdm1hOwotICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCi0Jc3RvcCA9IGRhdGFzaXplOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChzdG9wX2FkZHJlc3MgPCBkaXNhc21faW5mby5idWZmZXJfdm1hKQotCSAgICBzdG9wID0gMDsKLQkgIGVsc2UKLQkgICAgc3RvcCA9IHN0b3BfYWRkcmVzcyAtIGRpc2FzbV9pbmZvLmJ1ZmZlcl92bWE7Ci0JICBpZiAoc3RvcCA+IGRpc2FzbV9pbmZvLmJ1ZmZlcl9sZW5ndGgpCi0JICAgIHN0b3AgPSBkaXNhc21faW5mby5idWZmZXJfbGVuZ3RoOwotCX0KLQotICAgICAgc3ltID0gZmluZF9zeW1ib2xfZm9yX2FkZHJlc3MgKGFiZmQsIHNlY3Rpb24sIHNlY3Rpb24tPnZtYSArIGksCi0JCQkJICAgICB0cnVlLCAmcGxhY2UpOwotCi0gICAgICB3aGlsZSAoaSA8IHN0b3ApCi0JewotCSAgYXN5bWJvbCAqbmV4dHN5bTsKLQkgIGxvbmcgbmV4dHN0b3A7Ci0JICBib29sZWFuIGluc25zOwotCSAgCi0JICBpZiAoc3ltICE9IE5VTEwgJiYgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPD0gc2VjdGlvbi0+dm1hICsgaSkKLQkgICAgewotCSAgICAgIGludCB4OwotCi0JICAgICAgZm9yICh4ID0gcGxhY2U7Ci0JCSAgICh4IDwgc29ydGVkX3N5bWNvdW50Ci0JCSAgICAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc29ydGVkX3N5bXNbeF0pIDw9IHNlY3Rpb24tPnZtYSArIGkpOwotCQkgICArK3gpCi0JCWNvbnRpbnVlOwotCSAgICAgIGRpc2FzbV9pbmZvLnN5bWJvbHMgPSAmIHNvcnRlZF9zeW1zW3BsYWNlXTsKLQkgICAgICBkaXNhc21faW5mby5udW1fc3ltYm9scyA9IHggLSBwbGFjZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBkaXNhc21faW5mby5zeW1ib2xzID0gTlVMTDsKLQotCSAgaWYgKCEgcHJlZml4X2FkZHJlc3NlcykKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgb2JqZHVtcF9wcmludF9hZGRyX3dpdGhfc3ltIChhYmZkLCBzZWN0aW9uLCBzeW0sCi0JCQkJCSAgIHNlY3Rpb24tPnZtYSArIGksCi0JCQkJCSAgICZkaXNhc21faW5mbywKLQkJCQkJICAgZmFsc2UpOwotCSAgICAgIHByaW50ZiAoIjpcbiIpOwotCSAgICB9Ci0JICAKLQkgIGlmIChzeW0gIT0gTlVMTCAmJiBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSA+IHNlY3Rpb24tPnZtYSArIGkpCi0JICAgIG5leHRzeW0gPSBzeW07Ci0JICBlbHNlIGlmIChzeW0gPT0gTlVMTCkKLQkgICAgbmV4dHN5bSA9IE5VTEw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aGlsZSAocGxhY2UgPCBzb3J0ZWRfc3ltY291bnQKLQkJICAgICAvKiA/Pz8gV2h5IHRoZSB0ZXN0IGZvciAhPSBzZWN0aW9uPyAgKi8KLQkJICAgICAmJiAoc29ydGVkX3N5bXNbcGxhY2VdLT5zZWN0aW9uICE9IHNlY3Rpb24KLQkJCSB8fCAoYmZkX2FzeW1ib2xfdmFsdWUgKHNvcnRlZF9zeW1zW3BsYWNlXSkKLQkJCSAgICAgPD0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKSkKLQkJKytwbGFjZTsKLQkgICAgICBpZiAocGxhY2UgPj0gc29ydGVkX3N5bWNvdW50KQotCQluZXh0c3ltID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCW5leHRzeW0gPSBzb3J0ZWRfc3ltc1twbGFjZV07Ci0JICAgIH0KLQkgIAotCSAgaWYgKHN5bSAhPSBOVUxMICYmIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gc2VjdGlvbi0+dm1hICsgaSkKLQkgICAgewotCSAgICAgIG5leHRzdG9wID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgaWYgKG5leHRzdG9wID4gc3RvcCkKLQkJbmV4dHN0b3AgPSBzdG9wOwotCSAgICB9Ci0JICBlbHNlIGlmIChuZXh0c3ltID09IE5VTEwpCi0JICAgIG5leHRzdG9wID0gc3RvcDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG5leHRzdG9wID0gYmZkX2FzeW1ib2xfdmFsdWUgKG5leHRzeW0pIC0gc2VjdGlvbi0+dm1hOwotCSAgICAgIGlmIChuZXh0c3RvcCA+IHN0b3ApCi0JCW5leHRzdG9wID0gc3RvcDsKLQkgICAgfQotCSAgCi0JICAvKiBJZiBhIHN5bWJvbCBpcyBleHBsaWNpdGx5IG1hcmtlZCBhcyBiZWluZyBhbiBvYmplY3QKLQkgICAgIHJhdGhlciB0aGFuIGEgZnVuY3Rpb24sIGp1c3QgZHVtcCB0aGUgYnl0ZXMgd2l0aG91dAotCSAgICAgZGlzYXNzZW1ibGluZyB0aGVtLiAgKi8KLQkgIGlmIChkaXNhc3NlbWJsZV9hbGwKLQkgICAgICB8fCBzeW0gPT0gTlVMTAotCSAgICAgIHx8IGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pID4gc2VjdGlvbi0+dm1hICsgaQotCSAgICAgIHx8ICgoc3ltLT5mbGFncyAmIEJTRl9PQkpFQ1QpID09IDAKLQkJICAmJiAoc3Ryc3RyIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiZ251X2NvbXBpbGVkIikKLQkJICAgICAgPT0gTlVMTCkKLQkJICAmJiAoc3Ryc3RyIChiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCAiZ2NjMl9jb21waWxlZCIpCi0JCSAgICAgID09IE5VTEwpKQotCSAgICAgIHx8IChzeW0tPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwKQotCSAgICBpbnNucyA9IHRydWU7Ci0JICBlbHNlCi0JICAgIGluc25zID0gZmFsc2U7Ci0JICAKLQkgIGRpc2Fzc2VtYmxlX2J5dGVzICgmZGlzYXNtX2luZm8sIGRpc2Fzc2VtYmxlX2ZuLCBpbnNucywgZGF0YSwgaSwKLQkJCSAgICAgbmV4dHN0b3AsICZyZWxwcCwgcmVscHBlbmQpOwotCSAgCi0JICBpID0gbmV4dHN0b3A7Ci0JICBzeW0gPSBuZXh0c3ltOwotCX0KLSAgICAgIAotICAgICAgZnJlZSAoZGF0YSk7Ci0gICAgICBpZiAocmVsYnVmICE9IE5VTEwpCi0JZnJlZSAocmVsYnVmKTsKLSAgICB9Ci0gIGZyZWUgKHNvcnRlZF9zeW1zKTsKLX0KLQwKLQotLyogRGVmaW5lIGEgdGFibGUgb2Ygc3RhYiB2YWx1ZXMgYW5kIHByaW50LXN0cmluZ3MuICBXZSB3aXNoIHRoZSBpbml0aWFsaXplcgotICAgY291bGQgYmUgYSBkaXJlY3QtbWFwcGVkIHRhYmxlLCBidXQgaW5zdGVhZCB3ZSBidWlsZCBvbmUgdGhlIGZpcnN0Ci0gICB0aW1lIHdlIG5lZWQgaXQuICAqLwotCi1zdGF0aWMgdm9pZCBkdW1wX3NlY3Rpb25fc3RhYnMgUEFSQU1TICgoYmZkICphYmZkLCBjaGFyICpzdGFic2VjdF9uYW1lLAotCQkJCQljaGFyICpzdHJzZWN0X25hbWUpKTsKLQotLyogRHVtcCB0aGUgc3RhYnMgc2VjdGlvbnMgZnJvbSBhbiBvYmplY3QgZmlsZSB0aGF0IGhhcyBhIHNlY3Rpb24gdGhhdAotICAgdXNlcyBTdW4gc3RhYnMgZW5jb2RpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9zdGFicyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsICIuc3RhYiIsICIuc3RhYnN0ciIpOwotICBkdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsICIuc3RhYi5leGNsIiwgIi5zdGFiLmV4Y2xzdHIiKTsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiLnN0YWIuaW5kZXgiLCAiLnN0YWIuaW5kZXhzdHIiKTsKLSAgZHVtcF9zZWN0aW9uX3N0YWJzIChhYmZkLCAiJEdEQl9TWU1CT0xTJCIsICIkR0RCX1NUUklOR1MkIik7Ci19Ci0KLXN0YXRpYyBiZmRfYnl0ZSAqc3RhYnM7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBzdGFiX3NpemU7Ci0KLXN0YXRpYyBjaGFyICpzdHJ0YWI7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBzdGFic3RyX3NpemU7Ci0KLS8qIFJlYWQgQUJGRCdzIHN0YWJzIHNlY3Rpb24gU1RBQlNFQ1RfTkFNRSBpbnRvIGBzdGFicycKLSAgIGFuZCBzdHJpbmcgdGFibGUgc2VjdGlvbiBTVFJTRUNUX05BTUUgaW50byBgc3RydGFiJy4KLSAgIElmIHRoZSBzZWN0aW9uIGV4aXN0cyBhbmQgd2FzIHJlYWQsIGFsbG9jYXRlIHRoZSBzcGFjZSBhbmQgcmV0dXJuIHRydWUuCi0gICBPdGhlcndpc2UgcmV0dXJuIGZhbHNlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc2VjdGlvbl9zdGFicyAoYWJmZCwgc3RhYnNlY3RfbmFtZSwgc3Ryc2VjdF9uYW1lKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YWJzZWN0X25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cnNlY3RfbmFtZTsKLXsKLSAgYXNlY3Rpb24gKnN0YWJzZWN0LCAqc3RhYnN0cnNlY3Q7Ci0KLSAgc3RhYnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3RhYnNlY3RfbmFtZSk7Ci0gIGlmICgwID09IHN0YWJzZWN0KQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiTm8gJXMgc2VjdGlvbiBwcmVzZW50XG5cbiIpLCBzdGFic2VjdF9uYW1lKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3RhYnN0cnNlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgc3Ryc2VjdF9uYW1lKTsKLSAgaWYgKDAgPT0gc3RhYnN0cnNlY3QpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXMgaGFzIG5vICVzIHNlY3Rpb25cbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdHJzZWN0X25hbWUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAKLSAgc3RhYl9zaXplICAgID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3RhYnNlY3QpOwotICBzdGFic3RyX3NpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzdGFic3Ryc2VjdCk7Ci0KLSAgc3RhYnMgID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0YWJfc2l6ZSk7Ci0gIHN0cnRhYiA9IChjaGFyICopIHhtYWxsb2MgKHN0YWJzdHJfc2l6ZSk7Ci0gIAotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0YWJzZWN0LCAoUFRSKSBzdGFicywgMCwgc3RhYl9zaXplKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBSZWFkaW5nICVzIHNlY3Rpb24gb2YgJXMgZmFpbGVkOiAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgc3RhYnNlY3RfbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIGZyZWUgKHN0YWJzKTsKLSAgICAgIGZyZWUgKHN0cnRhYik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc3RhYnN0cnNlY3QsIChQVFIpIHN0cnRhYiwgMCwKLQkJCQkgIHN0YWJzdHJfc2l6ZSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogUmVhZGluZyAlcyBzZWN0aW9uIG9mICVzIGZhaWxlZDogJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIHN0cnNlY3RfbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIGZyZWUgKHN0YWJzKTsKLSAgICAgIGZyZWUgKHN0cnRhYik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFicyBlbnRyaWVzIHVzZSBhIDEyIGJ5dGUgZm9ybWF0OgotICAgICA0IGJ5dGUgc3RyaW5nIHRhYmxlIGluZGV4Ci0gICAgIDEgYnl0ZSBzdGFiIHR5cGUKLSAgICAgMSBieXRlIHN0YWIgb3RoZXIgZmllbGQKLSAgICAgMiBieXRlIHN0YWIgZGVzYyBmaWVsZAotICAgICA0IGJ5dGUgc3RhYiB2YWx1ZQotICAgRklYTUU6IFRoaXMgd2lsbCBoYXZlIHRvIGNoYW5nZSBmb3IgYSA2NCBiaXQgb2JqZWN0IGZvcm1hdC4gICovCi0KLSNkZWZpbmUgU1RSRFhPRkYgKDApCi0jZGVmaW5lIFRZUEVPRkYgKDQpCi0jZGVmaW5lIE9USEVST0ZGICg1KQotI2RlZmluZSBERVNDT0ZGICg2KQotI2RlZmluZSBWQUxPRkYgKDgpCi0jZGVmaW5lIFNUQUJTSVpFICgxMikKLQotLyogUHJpbnQgQUJGRCdzIHN0YWJzIHNlY3Rpb24gU1RBQlNFQ1RfTkFNRSAoaW4gYHN0YWJzJyksCi0gICB1c2luZyBzdHJpbmcgdGFibGUgc2VjdGlvbiBTVFJTRUNUX05BTUUgKGluIGBzdHJ0YWInKS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzdGFic2VjdF9uYW1lLCBzdHJzZWN0X25hbWUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqc3RhYnNlY3RfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqc3Ryc2VjdF9uYW1lOwotewotICBpbnQgaTsKLSAgdW5zaWduZWQgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gMCwgbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQgPSAwOwotICBiZmRfYnl0ZSAqc3RhYnAsICpzdGFic19lbmQ7Ci0KLSAgc3RhYnAgPSBzdGFiczsKLSAgc3RhYnNfZW5kID0gc3RhYnAgKyBzdGFiX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuXG4iKSwgc3RhYnNlY3RfbmFtZSk7Ci0gIHByaW50ZiAoIlN5bW51bSBuX3R5cGUgbl9vdGhyIG5fZGVzYyBuX3ZhbHVlICBuX3N0cnggU3RyaW5nXG4iKTsKLQotICAvKiBMb29wIHRocm91Z2ggYWxsIHN5bWJvbHMgYW5kIHByaW50IHRoZW0uCi0KLSAgICAgV2Ugc3RhcnQgdGhlIGluZGV4IGF0IC0xIGJlY2F1c2UgdGhlcmUgaXMgYSBkdW1teSBzeW1ib2wgb24KLSAgICAgdGhlIGZyb250IG9mIHN0YWJzLWluLXtjb2ZmLGVsZn0gc2VjdGlvbnMgdGhhdCBzdXBwbGllcyBzaXplcy4gICovCi0KLSAgZm9yIChpID0gLTE7IHN0YWJwIDwgc3RhYnNfZW5kOyBzdGFicCArPSBTVEFCU0laRSwgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICB1bnNpZ25lZCBsb25nIHN0cng7Ci0gICAgICB1bnNpZ25lZCBjaGFyIHR5cGUsIG90aGVyOwotICAgICAgdW5zaWduZWQgc2hvcnQgZGVzYzsKLSAgICAgIGJmZF92bWEgdmFsdWU7Ci0KLSAgICAgIHN0cnggPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgU1RSRFhPRkYpOwotICAgICAgdHlwZSA9IGJmZF9oX2dldF84IChhYmZkLCBzdGFicCArIFRZUEVPRkYpOwotICAgICAgb3RoZXIgPSBiZmRfaF9nZXRfOCAoYWJmZCwgc3RhYnAgKyBPVEhFUk9GRik7Ci0gICAgICBkZXNjID0gYmZkX2hfZ2V0XzE2IChhYmZkLCBzdGFicCArIERFU0NPRkYpOwotICAgICAgdmFsdWUgPSBiZmRfaF9nZXRfMzIgKGFiZmQsIHN0YWJwICsgVkFMT0ZGKTsKLQotICAgICAgcHJpbnRmICgiXG4lLTZkICIsIGkpOwotICAgICAgLyogRWl0aGVyIHByaW50IHRoZSBzdGFiIG5hbWUsIG9yLCBpZiB1bm5hbWVkLCBwcmludCBpdHMgbnVtYmVyCi0JIGFnYWluIChtYWtlcyBjb25zaXN0ZW50IGZvcm1hdHRpbmcgZm9yIHRvb2xzIGxpa2UgYXdrKS4gKi8KLSAgICAgIG5hbWUgPSBiZmRfZ2V0X3N0YWJfbmFtZSAodHlwZSk7Ci0gICAgICBpZiAobmFtZSAhPSBOVUxMKQotCXByaW50ZiAoIiUtNnMiLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gTl9VTkRGKQotCXByaW50ZiAoIkhkclN5bSIpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiUtNmQiLCB0eXBlKTsKLSAgICAgIHByaW50ZiAoIiAlLTZkICUtNmQgIiwgb3RoZXIsIGRlc2MpOwotICAgICAgcHJpbnRmX3ZtYSAodmFsdWUpOwotICAgICAgcHJpbnRmICgiICUtNmx1Iiwgc3RyeCk7Ci0KLSAgICAgIC8qIFN5bWJvbHMgd2l0aCB0eXBlID09IDAgKE5fVU5ERikgc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIHRoZQotCSBzdHJpbmcgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZmlsZS4gIFdlIHVzZSB0aGF0IGluZm8KLQkgdG8ga25vdyBob3cgdG8gcmVsb2NhdGUgdGhlICpuZXh0KiBmaWxlJ3Mgc3RyaW5nIHRhYmxlIGluZGljZXMuICAqLwotCi0gICAgICBpZiAodHlwZSA9PSBOX1VOREYpCi0JewotCSAgZmlsZV9zdHJpbmdfdGFibGVfb2Zmc2V0ID0gbmV4dF9maWxlX3N0cmluZ190YWJsZV9vZmZzZXQ7Ci0JICBuZXh0X2ZpbGVfc3RyaW5nX3RhYmxlX29mZnNldCArPSB2YWx1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVXNpbmcgdGhlIChwb3NzaWJseSB1cGRhdGVkKSBzdHJpbmcgdGFibGUgb2Zmc2V0LCBwcmludCB0aGUKLQkgICAgIHN0cmluZyAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBzeW1ib2wuICAqLwotCi0JICBpZiAoKHN0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXQpIDwgc3RhYnN0cl9zaXplKQotCSAgICBwcmludGYgKCIgJXMiLCAmc3RydGFiW3N0cnggKyBmaWxlX3N0cmluZ190YWJsZV9vZmZzZXRdKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiICoiKTsKLQl9Ci0gICAgfQotICBwcmludGYgKCJcblxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25fc3RhYnMgKGFiZmQsIHN0YWJzZWN0X25hbWUsIHN0cnNlY3RfbmFtZSkKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpzdGFic2VjdF9uYW1lOwotICAgICBjaGFyICpzdHJzZWN0X25hbWU7Ci17Ci0gIGFzZWN0aW9uICpzOwotCi0gIC8qIENoZWNrIGZvciBzZWN0aW9uIG5hbWVzIGZvciB3aGljaCBzdGFic2VjdF9uYW1lIGlzIGEgcHJlZml4LCB0bwotICAgICBoYW5kbGUgLnN0YWIwLCBldGMuICAqLwotICBmb3IgKHMgPSBhYmZkLT5zZWN0aW9uczsKLSAgICAgICBzICE9IE5VTEw7Ci0gICAgICAgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgaW50IGxlbjsKLQotICAgICAgbGVuID0gc3RybGVuIChzdGFic2VjdF9uYW1lKTsKLQotICAgICAgLyogSWYgdGhlIHByZWZpeCBtYXRjaGVzLCBhbmQgdGhlIGZpbGVzIHNlY3Rpb24gbmFtZSBlbmRzIHdpdGggYQotCSBudWwgb3IgYSBkaWdpdCwgdGhlbiB3ZSBtYXRjaC4gIEkuZS4sIHdlIHdhbnQgZWl0aGVyIGFuIGV4YWN0Ci0JIG1hdGNoIG9yIGEgc2VjdGlvbiBmb2xsb3dlZCBieSBhIG51bWJlci4gICovCi0gICAgICBpZiAoc3RybmNtcCAoc3RhYnNlY3RfbmFtZSwgcy0+bmFtZSwgbGVuKSA9PSAwCi0JICAmJiAocy0+bmFtZVtsZW5dID09ICdcMDAwJwotCSAgICAgIHx8IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzLT5uYW1lW2xlbl0pKSkKLQl7Ci0JICBpZiAocmVhZF9zZWN0aW9uX3N0YWJzIChhYmZkLCBzLT5uYW1lLCBzdHJzZWN0X25hbWUpKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc2VjdGlvbl9zdGFicyAoYWJmZCwgcy0+bmFtZSwgc3Ryc2VjdF9uYW1lKTsKLQkgICAgICBmcmVlIChzdGFicyk7Ci0JICAgICAgZnJlZSAoc3RydGFiKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfaGVhZGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGNoYXIgKmNvbW1hID0gIiI7Ci0KLSAgcHJpbnRmIChfKCJhcmNoaXRlY3R1cmU6ICVzLCAiKSwKLQkgIGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChiZmRfZ2V0X2FyY2ggKGFiZmQpLAotCQkJCSAgIGJmZF9nZXRfbWFjaCAoYWJmZCkpKTsKLSAgcHJpbnRmIChfKCJmbGFncyAweCUwOHg6XG4iKSwgYWJmZC0+ZmxhZ3MpOwotCi0jZGVmaW5lIFBGKHgsIHkpICAgIGlmIChhYmZkLT5mbGFncyAmIHgpIHtwcmludGYoIiVzJXMiLCBjb21tYSwgeSk7IGNvbW1hPSIsICI7fQotICBQRiAoSEFTX1JFTE9DLCAiSEFTX1JFTE9DIik7Ci0gIFBGIChFWEVDX1AsICJFWEVDX1AiKTsKLSAgUEYgKEhBU19MSU5FTk8sICJIQVNfTElORU5PIik7Ci0gIFBGIChIQVNfREVCVUcsICJIQVNfREVCVUciKTsKLSAgUEYgKEhBU19TWU1TLCAiSEFTX1NZTVMiKTsKLSAgUEYgKEhBU19MT0NBTFMsICJIQVNfTE9DQUxTIik7Ci0gIFBGIChEWU5BTUlDLCAiRFlOQU1JQyIpOwotICBQRiAoV1BfVEVYVCwgIldQX1RFWFQiKTsKLSAgUEYgKERfUEFHRUQsICJEX1BBR0VEIik7Ci0gIFBGIChCRkRfSVNfUkVMQVhBQkxFLCAiQkZEX0lTX1JFTEFYQUJMRSIpOwotICBwcmludGYgKF8oIlxuc3RhcnQgYWRkcmVzcyAweCIpKTsKLSAgcHJpbnRmX3ZtYSAoYWJmZC0+c3RhcnRfYWRkcmVzcyk7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZHVtcF9iZmRfcHJpdmF0ZV9oZWFkZXIgKGFiZmQpCi1iZmQgKmFiZmQ7Ci17Ci0gIGJmZF9wcmludF9wcml2YXRlX2JmZF9kYXRhIChhYmZkLCBzdGRvdXQpOwotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9iZmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQl7Ci0JICBsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLQkgIGZyZWUgKG1hdGNoaW5nKTsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIHdlIGFyZSBhZGp1c3Rpbmcgc2VjdGlvbiBWTUEncywgY2hhbmdlIHRoZW0gYWxsIG5vdy4gIENoYW5naW5nCi0gICAgIHRoZSBCRkQgaW5mb3JtYXRpb24gaXMgYSBoYWNrLiAgSG93ZXZlciwgd2UgbXVzdCBkbyBpdCwgb3IKLSAgICAgYmZkX2ZpbmRfbmVhcmVzdF9saW5lIHdpbGwgbm90IGRvIHRoZSByaWdodCB0aGluZy4gICovCi0gIGlmIChhZGp1c3Rfc2VjdGlvbl92bWEgIT0gMCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgcy0+dm1hICs9IGFkanVzdF9zZWN0aW9uX3ZtYTsKLQkgIHMtPmxtYSArPSBhZGp1c3Rfc2VjdGlvbl92bWE7Ci0JfQotICAgIH0KLQotICBwcmludGYgKF8oIlxuJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLAotCSAgYWJmZC0+eHZlYy0+bmFtZSk7Ci0gIGlmIChkdW1wX2FyX2hkcnMpCi0gICAgcHJpbnRfYXJlbHRfZGVzY3IgKHN0ZG91dCwgYWJmZCwgdHJ1ZSk7Ci0gIGlmIChkdW1wX2ZpbGVfaGVhZGVyKQotICAgIGR1bXBfYmZkX2hlYWRlciAoYWJmZCk7Ci0gIGlmIChkdW1wX3ByaXZhdGVfaGVhZGVycykKLSAgICBkdW1wX2JmZF9wcml2YXRlX2hlYWRlciAoYWJmZCk7Ci0gIHB1dGNoYXIgKCdcbicpOwotICBpZiAoZHVtcF9zZWN0aW9uX2hlYWRlcnMpCi0gICAgZHVtcF9oZWFkZXJzIChhYmZkKTsKLSAgaWYgKGR1bXBfc3ltdGFiIHx8IGR1bXBfcmVsb2NfaW5mbyB8fCBkaXNhc3NlbWJsZSB8fCBkdW1wX2RlYnVnZ2luZykKLSAgICB7Ci0gICAgICBzeW1zID0gc2x1cnBfc3ltdGFiIChhYmZkKTsKLSAgICB9Ci0gIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiIHx8IGR1bXBfZHluYW1pY19yZWxvY19pbmZvKQotICAgIHsKLSAgICAgIGR5bnN5bXMgPSBzbHVycF9keW5hbWljX3N5bXRhYiAoYWJmZCk7Ci0gICAgfQotICBpZiAoZHVtcF9zeW10YWIpCi0gICAgZHVtcF9zeW1ib2xzIChhYmZkLCBmYWxzZSk7Ci0gIGlmIChkdW1wX2R5bmFtaWNfc3ltdGFiKQotICAgIGR1bXBfc3ltYm9scyAoYWJmZCwgdHJ1ZSk7Ci0gIGlmIChkdW1wX3N0YWJfc2VjdGlvbl9pbmZvKQotICAgIGR1bXBfc3RhYnMgKGFiZmQpOwotICBpZiAoZHVtcF9yZWxvY19pbmZvICYmICEgZGlzYXNzZW1ibGUpCi0gICAgZHVtcF9yZWxvY3MgKGFiZmQpOwotICBpZiAoZHVtcF9keW5hbWljX3JlbG9jX2luZm8pCi0gICAgZHVtcF9keW5hbWljX3JlbG9jcyAoYWJmZCk7Ci0gIGlmIChkdW1wX3NlY3Rpb25fY29udGVudHMpCi0gICAgZHVtcF9kYXRhIChhYmZkKTsKLSAgaWYgKGRpc2Fzc2VtYmxlKQotICAgIGRpc2Fzc2VtYmxlX2RhdGEgKGFiZmQpOwotICBpZiAoZHVtcF9kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgUFRSIGRoYW5kbGU7Ci0KLSAgICAgIGRoYW5kbGUgPSByZWFkX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCk7Ci0gICAgICBpZiAoZGhhbmRsZSAhPSBOVUxMKQotCXsKLQkgIGlmICghIHByaW50X2RlYnVnZ2luZ19pbmZvIChzdGRvdXQsIGRoYW5kbGUpKQotCSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBwcmludGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmFpbGVkXG4iKSwKLQkJICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JfQotICAgIH0KLSAgaWYgKHN5bXMpCi0gICAgewotICAgICAgZnJlZSAoc3ltcyk7Ci0gICAgICBzeW1zID0gTlVMTDsKLSAgICB9Ci0gIGlmIChkeW5zeW1zKQotICAgIHsKLSAgICAgIGZyZWUgKGR5bnN5bXMpOwotICAgICAgZHluc3ltcyA9IE5VTEw7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9maWxlIChmaWxlbmFtZSwgdGFyZ2V0KQotICAgICBjaGFyICpmaWxlbmFtZTsKLSAgICAgY2hhciAqdGFyZ2V0OwotewotICBiZmQgKmZpbGUsICphcmZpbGUgPSAoYmZkICopIE5VTEw7Ci0KLSAgZmlsZSA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChmaWxlID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChmaWxlLCBiZmRfYXJjaGl2ZSkgPT0gdHJ1ZSkKLSAgICB7Ci0gICAgICBiZmQgKmxhc3RfYXJmaWxlID0gTlVMTDsKLQotICAgICAgcHJpbnRmIChfKCJJbiBhcmNoaXZlICVzOlxuIiksIGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLSAgICAgIGZvciAoOzspCi0JewotCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vX2Vycm9yKTsKLQotCSAgYXJmaWxlID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZmlsZSwgYXJmaWxlKTsKLQkgIGlmIChhcmZpbGUgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9ub19tb3JlX2FyY2hpdmVkX2ZpbGVzKQotCQl7Ci0JCSAgYmZkX25vbmZhdGFsIChiZmRfZ2V0X2ZpbGVuYW1lIChmaWxlKSk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBkaXNwbGF5X2JmZCAoYXJmaWxlKTsKLQotCSAgaWYgKGxhc3RfYXJmaWxlICE9IE5VTEwpCi0JICAgIGJmZF9jbG9zZSAobGFzdF9hcmZpbGUpOwotCSAgbGFzdF9hcmZpbGUgPSBhcmZpbGU7Ci0JfQotCi0gICAgICBpZiAobGFzdF9hcmZpbGUgIT0gTlVMTCkKLQliZmRfY2xvc2UgKGxhc3RfYXJmaWxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBkaXNwbGF5X2JmZCAoZmlsZSk7Ci0KLSAgYmZkX2Nsb3NlIChmaWxlKTsKLX0KLQwKLS8qIEFjdHVhbGx5IGRpc3BsYXkgdGhlIHZhcmlvdXMgcmVxdWVzdGVkIHJlZ2lvbnMgKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfZGF0YSAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgYmZkX2J5dGUgKmRhdGEgPSAwOwotICBiZmRfc2l6ZV90eXBlIGRhdGFzaXplID0gMDsKLSAgYmZkX3NpemVfdHlwZSBpOwotICBiZmRfc2l6ZV90eXBlIHN0YXJ0LCBzdG9wOwotCi0gIGZvciAoc2VjdGlvbiA9IGFiZmQtPnNlY3Rpb25zOyBzZWN0aW9uICE9IE5VTEw7IHNlY3Rpb24gPQotICAgICAgIHNlY3Rpb24tPm5leHQpCi0gICAgewotICAgICAgaW50IG9uYWxpbmUgPSAxNjsKLQotICAgICAgaWYgKG9ubHkgPT0gKGNoYXIgKikgTlVMTCB8fAotCSAgc3RyY21wIChvbmx5LCBzZWN0aW9uLT5uYW1lKSA9PSAwKQotCXsKLQkgIGlmIChzZWN0aW9uLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkNvbnRlbnRzIG9mIHNlY3Rpb24gJXM6XG4iKSwgc2VjdGlvbi0+bmFtZSk7Ci0KLQkgICAgICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjdGlvbikgPT0gMCkKLQkJY29udGludWU7Ci0JICAgICAgZGF0YSA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jICgoc2l6ZV90KSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0JICAgICAgZGF0YXNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQotCi0JICAgICAgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0aW9uLCAoUFRSKSBkYXRhLCAwLCBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKSk7Ci0KLQkgICAgICBpZiAoc3RhcnRfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEKLQkJICB8fCBzdGFydF9hZGRyZXNzIDwgc2VjdGlvbi0+dm1hKQotCQlzdGFydCA9IDA7Ci0JICAgICAgZWxzZQotCQlzdGFydCA9IHN0YXJ0X2FkZHJlc3MgLSBzZWN0aW9uLT52bWE7Ci0JICAgICAgaWYgKHN0b3BfYWRkcmVzcyA9PSAoYmZkX3ZtYSkgLTEpCi0JCXN0b3AgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWN0aW9uKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoc3RvcF9hZGRyZXNzIDwgc2VjdGlvbi0+dm1hKQotCQkgICAgc3RvcCA9IDA7Ci0JCSAgZWxzZQotCQkgICAgc3RvcCA9IHN0b3BfYWRkcmVzcyAtIHNlY3Rpb24tPnZtYTsKLQkJICBpZiAoc3RvcCA+IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pKQotCQkgICAgc3RvcCA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlY3Rpb24pOwotCQl9Ci0JICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdG9wOyBpICs9IG9uYWxpbmUpCi0JCXsKLQkJICBiZmRfc2l6ZV90eXBlIGo7Ci0KLQkJICBwcmludGYgKCIgJTA0bHggIiwgKHVuc2lnbmVkIGxvbmcgaW50KSAoaSArIHNlY3Rpb24tPnZtYSkpOwotCQkgIGZvciAoaiA9IGk7IGogPCBpICsgb25hbGluZTsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoaiA8IHN0b3ApCi0JCQlwcmludGYgKCIlMDJ4IiwgKHVuc2lnbmVkKSAoZGF0YVtqXSkpOwotCQkgICAgICBlbHNlCi0JCQlwcmludGYgKCIgICIpOwotCQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQotCQkJcHJpbnRmICgiICIpOwotCQkgICAgfQotCi0JCSAgcHJpbnRmICgiICIpOwotCQkgIGZvciAoaiA9IGk7IGogPCBpICsgb25hbGluZTsgaisrKQotCQkgICAgewotCQkgICAgICBpZiAoaiA+PSBzdG9wKQotCQkJcHJpbnRmICgiICIpOwotCQkgICAgICBlbHNlCi0JCQlwcmludGYgKCIlYyIsIGlzcHJpbnQgKGRhdGFbal0pID8gZGF0YVtqXSA6ICcuJyk7Ci0JCSAgICB9Ci0JCSAgcHV0Y2hhciAoJ1xuJyk7Ci0JCX0KLQkgICAgICBmcmVlIChkYXRhKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFNob3VsZCBwZXJoYXBzIHNoYXJlIGNvZGUgYW5kIGRpc3BsYXkgd2l0aCBubT8gKi8KLXN0YXRpYyB2b2lkCi1kdW1wX3N5bWJvbHMgKGFiZmQsIGR5bmFtaWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYm9vbGVhbiBkeW5hbWljOwotewotICBhc3ltYm9sICoqY3VycmVudDsKLSAgbG9uZyBtYXg7Ci0gIGxvbmcgY291bnQ7Ci0KLSAgaWYgKGR5bmFtaWMpCi0gICAgewotICAgICAgY3VycmVudCA9IGR5bnN5bXM7Ci0gICAgICBtYXggPSBkeW5zeW1jb3VudDsKLSAgICAgIGlmIChtYXggPT0gMCkKLQlyZXR1cm47Ci0gICAgICBwcmludGYgKCJEWU5BTUlDIFNZTUJPTCBUQUJMRTpcbiIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGN1cnJlbnQgPSBzeW1zOwotICAgICAgbWF4ID0gc3ltY291bnQ7Ci0gICAgICBpZiAobWF4ID09IDApCi0JcmV0dXJuOwotICAgICAgcHJpbnRmICgiU1lNQk9MIFRBQkxFOlxuIik7Ci0gICAgfQotCi0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IG1heDsgY291bnQrKykKLSAgICB7Ci0gICAgICBpZiAoKmN1cnJlbnQpCi0JewotCSAgYmZkICpjdXJfYmZkID0gYmZkX2FzeW1ib2xfYmZkICgqY3VycmVudCk7Ci0KLQkgIGlmIChjdXJfYmZkICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCSAgICAgIGNoYXIgKmFsbG9jOwotCi0JICAgICAgbmFtZSA9IGJmZF9hc3ltYm9sX25hbWUgKCpjdXJyZW50KTsKLQkgICAgICBhbGxvYyA9IE5VTEw7Ci0JICAgICAgaWYgKGRvX2RlbWFuZ2xlICYmIG5hbWUgIT0gTlVMTCAmJiAqbmFtZSAhPSAnXDAnKQotCQl7Ci0JCSAgY29uc3QgY2hhciAqbjsKLQotCQkgIC8qIElmIHdlIHdhbnQgdG8gZGVtYW5nbGUgdGhlIG5hbWUsIHdlIGRlbWFuZ2xlIGl0Ci0gICAgICAgICAgICAgICAgICAgICBoZXJlLCBhbmQgdGVtcG9yYXJpbHkgY2xvYmJlciBpdCB3aGlsZSBjYWxsaW5nCi0gICAgICAgICAgICAgICAgICAgICBiZmRfcHJpbnRfc3ltYm9sLiAgRklYTUU6IFRoaXMgaXMgYSBncm9zcyBoYWNrLiAgKi8KLQotCQkgIG4gPSBuYW1lOwotCQkgIGlmIChiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGN1cl9iZmQpID09ICpuKQotCQkgICAgKytuOwotCQkgIGFsbG9jID0gY3BsdXNfZGVtYW5nbGUgKG4sIERNR0xfQU5TSSB8IERNR0xfUEFSQU1TKTsKLQkJICBpZiAoYWxsb2MgIT0gTlVMTCkKLQkJICAgICgqY3VycmVudCktPm5hbWUgPSBhbGxvYzsKLQkJICBlbHNlCi0JCSAgICAoKmN1cnJlbnQpLT5uYW1lID0gbjsKLQkJfQotCi0JICAgICAgYmZkX3ByaW50X3N5bWJvbCAoY3VyX2JmZCwgc3Rkb3V0LCAqY3VycmVudCwKLQkJCQliZmRfcHJpbnRfc3ltYm9sX2FsbCk7Ci0KLQkgICAgICAoKmN1cnJlbnQpLT5uYW1lID0gbmFtZTsKLQkgICAgICBpZiAoYWxsb2MgIT0gTlVMTCkKLQkJZnJlZSAoYWxsb2MpOwotCi0JICAgICAgcHJpbnRmICgiXG4iKTsKLQkgICAgfQotCX0KLSAgICAgIGN1cnJlbnQrKzsKLSAgICB9Ci0gIHByaW50ZiAoIlxuIik7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jcyAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0gIGFzZWN0aW9uICphOwotCi0gIGZvciAoYSA9IGFiZmQtPnNlY3Rpb25zOyBhICE9IChhc2VjdGlvbiAqKSBOVUxMOyBhID0gYS0+bmV4dCkKLSAgICB7Ci0gICAgICBsb25nIHJlbHNpemU7Ci0KLSAgICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGEpKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoYSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoYmZkX2lzX2NvbV9zZWN0aW9uIChhKSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKG9ubHkpCi0JewotCSAgaWYgKHN0cmNtcCAob25seSwgYS0+bmFtZSkpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKChhLT5mbGFncyAmIFNFQ19SRUxPQykgPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIGEpOwotICAgICAgaWYgKHJlbHNpemUgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gICAgICBwcmludGYgKCJSRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFslc106IiwgYS0+bmFtZSk7Ci0KLSAgICAgIGlmIChyZWxzaXplID09IDApCi0JewotCSAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0JICByZWxjb3VudCA9IGJmZF9jYW5vbmljYWxpemVfcmVsb2MgKGFiZmQsIGEsIHJlbHBwLCBzeW1zKTsKLQkgIGlmIChyZWxjb3VudCA8IDApCi0JICAgIGJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgZWxzZSBpZiAocmVsY291bnQgPT0gMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAobm9uZSlcblxuIik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgZHVtcF9yZWxvY19zZXQgKGFiZmQsIGEsIHJlbHBwLCByZWxjb3VudCk7Ci0JICAgICAgcHJpbnRmICgiXG5cbiIpOwotCSAgICB9Ci0JICBmcmVlIChyZWxwcCk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWR1bXBfZHluYW1pY19yZWxvY3MgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgbG9uZyByZWxzaXplOwotICBhcmVsZW50ICoqcmVscHA7Ci0gIGxvbmcgcmVsY291bnQ7Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfZHluYW1pY19yZWxvY191cHBlcl9ib3VuZCAoYWJmZCk7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBiZmRfZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQotICBwcmludGYgKCJEWU5BTUlDIFJFTE9DQVRJT04gUkVDT1JEUyIpOwotCi0gIGlmIChyZWxzaXplID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiIChub25lKVxuXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgICAgIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9keW5hbWljX3JlbG9jIChhYmZkLCByZWxwcCwgZHluc3ltcyk7Ci0gICAgICBpZiAocmVsY291bnQgPCAwKQotCWJmZF9mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgZWxzZSBpZiAocmVsY291bnQgPT0gMCkKLQl7Ci0JICBwcmludGYgKCIgKG5vbmUpXG5cbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCJcbiIpOwotCSAgZHVtcF9yZWxvY19zZXQgKGFiZmQsIChhc2VjdGlvbiAqKSBOVUxMLCByZWxwcCwgcmVsY291bnQpOwotCSAgcHJpbnRmICgiXG5cbiIpOwotCX0KLSAgICAgIGZyZWUgKHJlbHBwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3JlbG9jX3NldCAoYWJmZCwgc2VjLCByZWxwcCwgcmVsY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgYXJlbGVudCAqKnJlbHBwOwotICAgICBsb25nIHJlbGNvdW50OwotewotICBhcmVsZW50ICoqcDsKLSAgY2hhciAqbGFzdF9maWxlbmFtZSwgKmxhc3RfZnVuY3Rpb25uYW1lOwotICB1bnNpZ25lZCBpbnQgbGFzdF9saW5lOwotCi0gIC8qIEdldCBjb2x1bW4gaGVhZGVycyBsaW5lZCB1cCByZWFzb25hYmx5LiAgKi8KLSAgewotICAgIHN0YXRpYyBpbnQgd2lkdGg7Ci0gICAgaWYgKHdpZHRoID09IDApCi0gICAgICB7Ci0JY2hhciBidWZbMzBdOwotCXNwcmludGZfdm1hIChidWYsIChiZmRfdm1hKSAtMSk7Ci0Jd2lkdGggPSBzdHJsZW4gKGJ1ZikgLSA3OwotICAgICAgfQotICAgIHByaW50ZiAoIk9GRlNFVCAlKnMgVFlQRSAlKnMgVkFMVUUgXG4iLCB3aWR0aCwgIiIsIDEyLCAiIik7Ci0gIH0KLQotICBsYXN0X2ZpbGVuYW1lID0gTlVMTDsKLSAgbGFzdF9mdW5jdGlvbm5hbWUgPSBOVUxMOwotICBsYXN0X2xpbmUgPSAwOwotCi0gIGZvciAocCA9IHJlbHBwOyByZWxjb3VudCAmJiAqcCAhPSAoYXJlbGVudCAqKSBOVUxMOyBwKyssIHJlbGNvdW50LS0pCi0gICAgewotICAgICAgYXJlbGVudCAqcSA9ICpwOwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICpmdW5jdGlvbm5hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN5bV9uYW1lOwotICAgICAgY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lOwotCi0gICAgICBpZiAoc3RhcnRfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEKLQkgICYmIHEtPmFkZHJlc3MgPCBzdGFydF9hZGRyZXNzKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN0b3BfYWRkcmVzcyAhPSAoYmZkX3ZtYSkgLTEKLQkgICYmIHEtPmFkZHJlc3MgPiBzdG9wX2FkZHJlc3MpCi0JY29udGludWU7Ci0KLSAgICAgIGlmICh3aXRoX2xpbmVfbnVtYmVycwotCSAgJiYgc2VjICE9IE5VTEwKLQkgICYmIGJmZF9maW5kX25lYXJlc3RfbGluZSAoYWJmZCwgc2VjLCBzeW1zLCBxLT5hZGRyZXNzLAotCQkJCSAgICAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsICZsaW5lKSkKLQl7Ci0JICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwKLQkgICAgICAmJiAobGFzdF9mdW5jdGlvbm5hbWUgPT0gTlVMTAotCQkgIHx8IHN0cmNtcCAoZnVuY3Rpb25uYW1lLCBsYXN0X2Z1bmN0aW9ubmFtZSkgIT0gMCkpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlcygpOlxuIiwgZnVuY3Rpb25uYW1lKTsKLQkgICAgICBpZiAobGFzdF9mdW5jdGlvbm5hbWUgIT0gTlVMTCkKLQkJZnJlZSAobGFzdF9mdW5jdGlvbm5hbWUpOwotCSAgICAgIGxhc3RfZnVuY3Rpb25uYW1lID0geHN0cmR1cCAoZnVuY3Rpb25uYW1lKTsKLQkgICAgfQotCSAgaWYgKGxpbmUgPiAwCi0JICAgICAgJiYgKGxpbmUgIT0gbGFzdF9saW5lCi0JCSAgfHwgKGZpbGVuYW1lICE9IE5VTEwKLQkJICAgICAgJiYgbGFzdF9maWxlbmFtZSAhPSBOVUxMCi0JCSAgICAgICYmIHN0cmNtcCAoZmlsZW5hbWUsIGxhc3RfZmlsZW5hbWUpICE9IDApKSkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiVzOiV1XG4iLCBmaWxlbmFtZSA9PSBOVUxMID8gIj8/PyIgOiBmaWxlbmFtZSwgbGluZSk7Ci0JICAgICAgbGFzdF9saW5lID0gbGluZTsKLQkgICAgICBpZiAobGFzdF9maWxlbmFtZSAhPSBOVUxMKQotCQlmcmVlIChsYXN0X2ZpbGVuYW1lKTsKLQkgICAgICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLQkJbGFzdF9maWxlbmFtZSA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQlsYXN0X2ZpbGVuYW1lID0geHN0cmR1cCAoZmlsZW5hbWUpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocS0+c3ltX3B0cl9wdHIgJiYgKnEtPnN5bV9wdHJfcHRyKQotCXsKLQkgIHN5bV9uYW1lID0gKCoocS0+c3ltX3B0cl9wdHIpKS0+bmFtZTsKLQkgIHNlY3Rpb25fbmFtZSA9ICgqKHEtPnN5bV9wdHJfcHRyKSktPnNlY3Rpb24tPm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bV9uYW1lID0gTlVMTDsKLQkgIHNlY3Rpb25fbmFtZSA9IE5VTEw7Ci0JfQotICAgICAgaWYgKHN5bV9uYW1lKQotCXsKLQkgIHByaW50Zl92bWEgKHEtPmFkZHJlc3MpOwotCSAgaWYgKHEtPmhvd3RvLT5uYW1lKQotCSAgICBwcmludGYgKCIgJS0xNnMgICIsIHEtPmhvd3RvLT5uYW1lKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiICUtMTZkICAiLCBxLT5ob3d0by0+dHlwZSk7Ci0JICBvYmpkdW1wX3ByaW50X3N5bW5hbWUgKGFiZmQsIChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSBOVUxMLAotCQkJCSAqcS0+c3ltX3B0cl9wdHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoc2VjdGlvbl9uYW1lID09IChDT05TVCBjaGFyICopIE5VTEwpCi0JICAgIHNlY3Rpb25fbmFtZSA9ICIqdW5rbm93bioiOwotCSAgcHJpbnRmX3ZtYSAocS0+YWRkcmVzcyk7Ci0JICBwcmludGYgKCIgJS0xNnMgIFslc10iLAotCQkgIHEtPmhvd3RvLT5uYW1lLAotCQkgIHNlY3Rpb25fbmFtZSk7Ci0JfQotICAgICAgaWYgKHEtPmFkZGVuZCkKLQl7Ci0JICBwcmludGYgKCIrMHgiKTsKLQkgIHByaW50Zl92bWEgKHEtPmFkZGVuZCk7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0MCi0vKiBUaGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGFyY2hpdGVjdHVyZSBuYW1lICsgMS4gICovCi0jZGVmaW5lIExPTkdFU1RfQVJDSCBzaXplb2YoInJzNjAwMDo2MDAwIikKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZW5kaWFuX3N0cmluZyAoZW5kaWFuKQotICAgICBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuOwotewotICBpZiAoZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIHJldHVybiAiYmlnIGVuZGlhbiI7Ci0gIGVsc2UgaWYgKGVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLSAgICByZXR1cm4gImxpdHRsZSBlbmRpYW4iOwotICBlbHNlCi0gICAgcmV0dXJuICJlbmRpYW5uZXNzIHVua25vd24iOwotfQotCi0vKiBMaXN0IHRoZSB0YXJnZXRzIHRoYXQgQkZEIGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCwgZWFjaCBmb2xsb3dlZAotICAgYnkgaXRzIGVuZGlhbm5lc3MgYW5kIHRoZSBhcmNoaXRlY3R1cmVzIGl0IHN1cHBvcnRzLiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X2xpc3QgKCkKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGNoYXIgKmR1bW15X25hbWU7Ci0gIGludCB0OwotCi0gIGR1bW15X25hbWUgPSBjaG9vc2VfdGVtcF9iYXNlICgpOwotICBmb3IgKHQgPSAwOyBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQotICAgIHsKLSAgICAgIGJmZF90YXJnZXQgKnAgPSBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsKLSAgICAgIGJmZCAqYWJmZCA9IGJmZF9vcGVudyAoZHVtbXlfbmFtZSwgcC0+bmFtZSk7Ci0gICAgICBpbnQgYTsKLQotICAgICAgcHJpbnRmICgiJXNcbiAoaGVhZGVyICVzLCBkYXRhICVzKVxuIiwgcC0+bmFtZSwKLQkgICAgICBlbmRpYW5fc3RyaW5nIChwLT5oZWFkZXJfYnl0ZW9yZGVyKSwKLQkgICAgICBlbmRpYW5fc3RyaW5nIChwLT5ieXRlb3JkZXIpKTsKLQotICAgICAgaWYgKGFiZmQgPT0gTlVMTCkKLQl7Ci0JICBiZmRfbm9uZmF0YWwgKGR1bW15X25hbWUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoISBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX2ludmFsaWRfb3BlcmF0aW9uKQotCSAgICBiZmRfbm9uZmF0YWwgKHAtPm5hbWUpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBmb3IgKGEgPSAoaW50KSBiZmRfYXJjaF9vYnNjdXJlICsgMTsgYSA8IChpbnQpIGJmZF9hcmNoX2xhc3Q7IGErKykKLQlpZiAoYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIChlbnVtIGJmZF9hcmNoaXRlY3R1cmUpIGEsIDApKQotCSAgcHJpbnRmICgiICAlc1xuIiwKLQkJICBiZmRfcHJpbnRhYmxlX2FyY2hfbWFjaCAoKGVudW0gYmZkX2FyY2hpdGVjdHVyZSkgYSwgMCkpOwotICAgIH0KLSAgdW5saW5rIChkdW1teV9uYW1lKTsKLSAgZnJlZSAoZHVtbXlfbmFtZSk7Ci19Ci0KLS8qIFByaW50IGEgdGFibGUgc2hvd2luZyB3aGljaCBhcmNoaXRlY3R1cmVzIGFyZSBzdXBwb3J0ZWQgZm9yIGVudHJpZXMKLSAgIEZJUlNUIHRocm91Z2ggTEFTVC0xIG9mIGJmZF90YXJnZXRfdmVjdG9yICh0YXJnZXRzIGFjcm9zcywKLSAgIGFyY2hpdGVjdHVyZXMgZG93bikuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9pbmZvX3RhYmxlIChmaXJzdCwgbGFzdCkKLSAgICAgaW50IGZpcnN0OwotICAgICBpbnQgbGFzdDsKLXsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGludCB0LCBhOwotICBjaGFyICpkdW1teV9uYW1lOwotCi0gIC8qIFByaW50IGhlYWRpbmcgb2YgdGFyZ2V0IG5hbWVzLiAgKi8KLSAgcHJpbnRmICgiXG4lKnMiLCAoaW50KSBMT05HRVNUX0FSQ0gsICIgIik7Ci0gIGZvciAodCA9IGZpcnN0OyB0IDwgbGFzdCAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XTsgdCsrKQotICAgIHByaW50ZiAoIiVzICIsIGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKTsKLSAgcHV0Y2hhciAoJ1xuJyk7Ci0KLSAgZHVtbXlfbmFtZSA9IGNob29zZV90ZW1wX2Jhc2UgKCk7Ci0gIGZvciAoYSA9IChpbnQpIGJmZF9hcmNoX29ic2N1cmUgKyAxOyBhIDwgKGludCkgYmZkX2FyY2hfbGFzdDsgYSsrKQotICAgIGlmIChzdHJjbXAgKGJmZF9wcmludGFibGVfYXJjaF9tYWNoIChhLCAwKSwgIlVOS05PV04hIikgIT0gMCkKLSAgICAgIHsKLQlwcmludGYgKCIlKnMgIiwgKGludCkgTE9OR0VTVF9BUkNIIC0gMSwKLQkJYmZkX3ByaW50YWJsZV9hcmNoX21hY2ggKGEsIDApKTsKLQlmb3IgKHQgPSBmaXJzdDsgdCA8IGxhc3QgJiYgYmZkX3RhcmdldF92ZWN0b3JbdF07IHQrKykKLQkgIHsKLQkgICAgYmZkX3RhcmdldCAqcCA9IGJmZF90YXJnZXRfdmVjdG9yW3RdOwotCSAgICBib29sZWFuIG9rID0gdHJ1ZTsKLQkgICAgYmZkICphYmZkID0gYmZkX29wZW53IChkdW1teV9uYW1lLCBwLT5uYW1lKTsKLQotCSAgICBpZiAoYWJmZCA9PSBOVUxMKQotCSAgICAgIHsKLQkJYmZkX25vbmZhdGFsIChwLT5uYW1lKTsKLQkJb2sgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG9rKQotCSAgICAgIHsKLQkJaWYgKCEgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotCQkgIHsKLQkJICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpICE9IGJmZF9lcnJvcl9pbnZhbGlkX29wZXJhdGlvbikKLQkJICAgICAgYmZkX25vbmZhdGFsIChwLT5uYW1lKTsKLQkJICAgIG9rID0gZmFsc2U7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAob2spCi0JICAgICAgewotCQlpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYSwgMCkpCi0JCSAgb2sgPSBmYWxzZTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG9rKQotCSAgICAgIHByaW50ZiAoIiVzICIsIHAtPm5hbWUpOwotCSAgICBlbHNlCi0JICAgICAgewotCQlpbnQgbCA9IHN0cmxlbiAocC0+bmFtZSk7Ci0JCXdoaWxlIChsLS0pCi0JCSAgcHV0Y2hhciAoJy0nKTsKLQkJcHV0Y2hhciAoJyAnKTsKLQkgICAgICB9Ci0JICB9Ci0JcHV0Y2hhciAoJ1xuJyk7Ci0gICAgICB9Ci0gIHVubGluayAoZHVtbXlfbmFtZSk7Ci0gIGZyZWUgKGR1bW15X25hbWUpOwotfQotCi0vKiBQcmludCB0YWJsZXMgb2YgYWxsIHRoZSB0YXJnZXQtYXJjaGl0ZWN0dXJlIGNvbWJpbmF0aW9ucyB0aGF0Ci0gICBCRkQgaGFzIGJlZW4gY29uZmlndXJlZCB0byBzdXBwb3J0LiAgKi8KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfdGFyZ2V0X3RhYmxlcyAoKQotewotICBpbnQgdCwgY29sdW1uczsKLSAgZXh0ZXJuIGJmZF90YXJnZXQgKmJmZF90YXJnZXRfdmVjdG9yW107Ci0gIGNoYXIgKmNvbHVtOwotCi0gIGNvbHVtbnMgPSAwOwotICBjb2x1bSA9IGdldGVudiAoIkNPTFVNTlMiKTsKLSAgaWYgKGNvbHVtICE9IE5VTEwpCi0gICAgY29sdW1ucyA9IGF0b2kgKGNvbHVtKTsKLSAgaWYgKGNvbHVtbnMgPT0gMCkKLSAgICBjb2x1bW5zID0gODA7Ci0KLSAgdCA9IDA7Ci0gIHdoaWxlIChiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCBvbGR0ID0gdCwgd2lkOwotCi0gICAgICB3aWQgPSBMT05HRVNUX0FSQ0ggKyBzdHJsZW4gKGJmZF90YXJnZXRfdmVjdG9yW3RdLT5uYW1lKSArIDE7Ci0gICAgICArK3Q7Ci0gICAgICB3aGlsZSAod2lkIDwgY29sdW1ucyAmJiBiZmRfdGFyZ2V0X3ZlY3Rvclt0XSAhPSBOVUxMKQotCXsKLQkgIGludCBuZXd3aWQ7Ci0KLQkgIG5ld3dpZCA9IHdpZCArIHN0cmxlbiAoYmZkX3RhcmdldF92ZWN0b3JbdF0tPm5hbWUpICsgMTsKLQkgIGlmIChuZXd3aWQgPj0gY29sdW1ucykKLQkgICAgYnJlYWs7Ci0JICB3aWQgPSBuZXd3aWQ7Ci0JICArK3Q7Ci0JfQotICAgICAgZGlzcGxheV9pbmZvX3RhYmxlIChvbGR0LCB0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2luZm8gKCkKLXsKLSAgcHJpbnRmIChfKCJCRkQgaGVhZGVyIGZpbGUgdmVyc2lvbiAlc1xuIiksIEJGRF9WRVJTSU9OKTsKLSAgZGlzcGxheV90YXJnZXRfbGlzdCAoKTsKLSAgZGlzcGxheV90YXJnZXRfdGFibGVzICgpOwotfQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgKnRhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotICBib29sZWFuIHNlZW5mbGFnID0gZmFsc2U7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSAqYXJndjsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIFNUQVJUX1BST0dSRVNTIChwcm9ncmFtX25hbWUsIDApOwotCi0gIGJmZF9pbml0ICgpOwotICBzZXRfZGVmYXVsdF9iZmRfdGFyZ2V0ICgpOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAicGliOm06TTpWQ2REbGZhaHJSdFR4c1NqOndFOiIsCi0JCQkgICBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBpZiAoYyAhPSAnbCcgJiYgYyAhPSBPUFRJT05fU1RBUlRfQUREUkVTUyAmJiBjICE9IE9QVElPTl9TVE9QX0FERFJFU1MpCi0Jc2VlbmZsYWcgPSB0cnVlOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlIDA6Ci0JICBicmVhazsJCS8qIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBsb25nIG9wdGlvbiAqLwotCWNhc2UgJ20nOgotCSAgbWFjaGluZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdqJzoKLQkgIG9ubHkgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIHdpdGhfbGluZV9udW1iZXJzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2InOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBkdW1wX2ZpbGVfaGVhZGVyID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgZm9ybWF0c19pbmZvID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgZHVtcF9wcml2YXRlX2hlYWRlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkdW1wX3ByaXZhdGVfaGVhZGVycyA9IDE7Ci0JICBkdW1wX3N5bXRhYiA9IDE7Ci0JICBkdW1wX3JlbG9jX2luZm8gPSAxOwotCSAgZHVtcF9maWxlX2hlYWRlciA9IHRydWU7Ci0JICBkdW1wX2FyX2hkcnMgPSAxOwotCSAgZHVtcF9zZWN0aW9uX2hlYWRlcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICBkdW1wX3N5bXRhYiA9IDE7Ci0JICBicmVhazsKLQljYXNlICdUJzoKLQkgIGR1bXBfZHluYW1pY19zeW10YWIgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICBkb19kZW1hbmdsZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGRpc2Fzc2VtYmxlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZGlzYXNzZW1ibGUgPSBkaXNhc3NlbWJsZV9hbGwgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUyc6Ci0JICBkaXNhc3NlbWJsZSA9IHRydWU7Ci0JICB3aXRoX3NvdXJjZV9jb2RlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgZHVtcF9zZWN0aW9uX2NvbnRlbnRzID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgZHVtcF9yZWxvY19pbmZvID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgZHVtcF9keW5hbWljX3JlbG9jX2luZm8gPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICBkdW1wX2FyX2hkcnMgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnaCc6Ci0JICBkdW1wX3NlY3Rpb25faGVhZGVycyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdIJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCWNhc2UgJ1YnOgotCSAgc2hvd192ZXJzaW9uID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ3cnOgotCSAgd2lkZV9vdXRwdXQgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fQURKVVNUX1ZNQToKLQkgIGFkanVzdF9zZWN0aW9uX3ZtYSA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1hZGp1c3Qtdm1hIik7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVEFSVF9BRERSRVNTOgotCSAgc3RhcnRfYWRkcmVzcyA9IHBhcnNlX3ZtYSAob3B0YXJnLCAiLS1zdGFydC1hZGRyZXNzIik7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TVE9QX0FERFJFU1M6Ci0JICBzdG9wX2FkZHJlc3MgPSBwYXJzZV92bWEgKG9wdGFyZywgIi0tc3RvcC1hZGRyZXNzIik7Ci0JICBicmVhazsKLQljYXNlICdFJzoKLQkgIGlmIChzdHJjbXAgKG9wdGFyZywgIkIiKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiTCIpID09IDApCi0JICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fTElUVExFOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIC1FIG9wdGlvblxuIiksIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VORElBTjoKLQkgIGlmIChzdHJuY21wIChvcHRhcmcsICJiaWciLCBzdHJsZW4gKG9wdGFyZykpID09IDApCi0JICAgIGVuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotCSAgZWxzZSBpZiAoc3RybmNtcCAob3B0YXJnLCAibGl0dGxlIiwgc3RybGVuIChvcHRhcmcpKSA9PSAwKQotCSAgICBlbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCAtLWVuZGlhbiB0eXBlIGAlcydcbiIpLAotCQkgICAgICBwcm9ncmFtX25hbWUsIG9wdGFyZyk7Ci0JICAgICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzaG93X3ZlcnNpb24pCi0gICAgcHJpbnRfdmVyc2lvbiAoIm9iamR1bXAiKTsKLQotICBpZiAoc2VlbmZsYWcgPT0gZmFsc2UpCi0gICAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLSAgaWYgKGZvcm1hdHNfaW5mbykKLSAgICB7Ci0gICAgICBkaXNwbGF5X2luZm8gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG9wdGluZCA9PSBhcmdjKQotCWRpc3BsYXlfZmlsZSAoImEub3V0IiwgdGFyZ2V0KTsKLSAgICAgIGVsc2UKLQlmb3IgKDsgb3B0aW5kIDwgYXJnYzspCi0JICBkaXNwbGF5X2ZpbGUgKGFyZ3Zbb3B0aW5kKytdLCB0YXJnZXQpOwotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9wby9NYWtlLWluIGIvYmludXRpbHMvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3BvL1BPVEZJTEVTLmluIGIvYmludXRpbHMvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYTA1ODYuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1hZGRyMmxpbmUuYwotYXIuYwotYXJzdXAuYwotYXJzdXAuaAotYnVjb21tLmMKLWJ1Y29tbS5oCi1idWRiZy5oCi1jb2ZmZHVtcC5jCi1jb2ZmZ3Jvay5jCi1jb2ZmZ3Jvay5oCi1kZWJ1Zy5jCi1kZWJ1Zy5jCi1kZWJ1Zy5oCi1kbGx0b29sLmMKLWRsbHRvb2wuaAotZGxsd3JhcC5jCi1keW4tc3RyaW5nLmMKLWR5bi1zdHJpbmcuaAotZmlsZW1vZGUuYwotaWVlZS5jCi1pZWVlLmMKLWlzLXJhbmxpYi5jCi1pcy1zdHJpcC5jCi1tYXliZS1yYW5saWIuYwotbWF5YmUtc3RyaXAuYwotbmxtY29udi5jCi1ubG1jb252LmgKLW5tLmMKLW5vdC1yYW5saWIuYwotbm90LXN0cmlwLmMKLW9iamNvcHkuYwotb2JqZHVtcC5jCi1wcmRiZy5jCi1yZGNvZmYuYwotcmRjb2ZmLmMKLXJkZGJnLmMKLXJkZGJnLmMKLXJlYWRlbGYuYwotcmVuYW1lLmMKLXJlc2Jpbi5jCi1yZXNjb2ZmLmMKLXJlc3JjLmMKLXJlc3Jlcy5jCi1zaXplLmMKLXNyY29udi5jCi1zdGFicy5jCi1zdGFicy5jCi1zdHJpbmdzLmMKLXN5c2R1bXAuYwotdmVyc2lvbi5jCi13aW5kcmVzLmMKLXdpbmRyZXMuaAotd2luZHVuaS5jCi13aW5kdW5pLmgKLXdyc3RhYnMuYwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcG8vYmludXRpbHMucG90IGIvYmludXRpbHMvcG8vYmludXRpbHMucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzc5NWNiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3BvL2JpbnV0aWxzLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ODMgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDYtMDMgMDI6NTgtMDcwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFkZHIybGluZS5jOjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1DZnNIVl0gWy1iIGJmZG5hbWVdIFstLXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLWUgZXhlY3V0YWJsZV0gWy0tZXhlPWV4ZWN1dGFibGVdIFstLWRlbWFuZ2xlXVxuIgotIiAgICAgICBbLS1iYXNlbmFtZXNdIFstLWZ1bmN0aW9uc10gW2FkZHIgYWRkciAuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogYWRkcjJsaW5lLmM6ODMgYXIuYzoyNTUgbmxtY29udi5jOjExNDEgbm0uYzozMDQgb2JqY29weS5jOjMxOCBvYmpjb3B5LmM6MzM3Ci0jOiBvYmpkdW1wLmM6MjM2IHJlYWRlbGYuYzoxMTY4IHNpemUuYzo4OSBzdHJpbmdzLmM6NTEyIHdpbmRyZXMuYzo3MzAKLW1zZ2lkICJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBhZGRyMmxpbmUuYzoyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbiBub3QgZ2V0IGFkZHJlc3NlcyBmcm9tIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gZW50cnkgJXMgaW4gYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1de2RtcHFyc3R4fVthYmNpbG9zU3V2Vl0gW21lbWJlci1uYW1lXSBhcmNoaXZlLWZpbGUgZmlsZS4uLlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgICAgICAlcyAtTSBbPG1yaS1zY3JpcHRdXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMjcKLW1zZ2lkICIgY29tbWFuZHM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMjgKLW1zZ2lkICIgIGQgICAgICAgICAgICAtIGRlbGV0ZSBmaWxlKHMpIGZyb20gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIyOQotbXNnaWQgIiAgbVthYl0gICAgICAgIC0gbW92ZSBmaWxlKHMpIGluIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzAKLW1zZ2lkICIgIHAgICAgICAgICAgICAtIHByaW50IGZpbGUocykgZm91bmQgaW4gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMQotbXNnaWQgIiAgcVtmXSAgICAgICAgIC0gcXVpY2sgYXBwZW5kIGZpbGUocykgdG8gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMgotbXNnaWQgIiIKLSIgIHJbYWJdW2ZdW3VdICAtIHJlcGxhY2UgZXhpc3Rpbmcgb3IgaW5zZXJ0IG5ldyBmaWxlKHMpIGludG8gdGhlIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzMwotbXNnaWQgIiAgdCAgICAgICAgICAgIC0gZGlzcGxheSBjb250ZW50cyBvZiBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzQKLW1zZ2lkICIgIHhbb10gICAgICAgICAtIGV4dHJhY3QgZmlsZShzKSBmcm9tIHRoZSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzUKLW1zZ2lkICIgY29tbWFuZCBzcGVjaWZpYyBtb2RpZmllcnM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzYKLW1zZ2lkICIgIFthXSAgICAgICAgICAtIHB1dCBmaWxlKHMpIGFmdGVyIFttZW1iZXItbmFtZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjIzNwotbXNnaWQgIiAgW2JdICAgICAgICAgIC0gcHV0IGZpbGUocykgYmVmb3JlIFttZW1iZXItbmFtZV0gKHNhbWUgYXMgW2ldKVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjM4Ci1tc2dpZCAiICBbZl0gICAgICAgICAgLSB0cnVuY2F0ZSBpbnNlcnRlZCBmaWxlIG5hbWVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyMzkKLW1zZ2lkICIgIFtvXSAgICAgICAgICAtIHByZXNlcnZlIG9yaWdpbmFsIGRhdGVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDAKLW1zZ2lkICIiCi0iICBbdV0gICAgICAgICAgLSBvbmx5IHJlcGxhY2UgZmlsZXMgdGhhdCBhcmUgbmV3ZXIgdGhhbiBjdXJyZW50IGFyY2hpdmUgIgotImNvbnRlbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDEKLW1zZ2lkICIgZ2VuZXJpYyBtb2RpZmllcnM6XG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDIKLW1zZ2lkICIgIFtjXSAgICAgICAgICAtIGRvIG5vdCB3YXJuIGlmIHRoZSBsaWJyYXJ5IGhhZCB0byBiZSBjcmVhdGVkXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzoyNDMKLW1zZ2lkICIgIFtzXSAgICAgICAgICAtIGNyZWF0ZSBhbiBhcmNoaXZlIGluZGV4IChjZi4gcmFubGliKVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQ0Ci1tc2dpZCAiICBbU10gICAgICAgICAgLSBkbyBub3QgYnVpbGQgYSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjI0NQotbXNnaWQgIiAgW3ZdICAgICAgICAgIC0gYmUgdmVyYm9zZVxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjQ2Ci1tc2dpZCAiICBbVl0gICAgICAgICAgLSBkaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlclxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbLXZWXSBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXIuYzo0MzEKLW1zZ2lkICJ0d28gZGlmZmVyZW50IG9wZXJhdGlvbiBvcHRpb25zIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjUwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaWxsZWdhbCBvcHRpb24gLS0gJWNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjUzMgotbXNnaWQgIm5vIG9wZXJhdGlvbiBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo1MzUKLW1zZ2lkICJgdScgaXMgb25seSBtZWFuaW5nZnVsIHdpdGggdGhlIGByJyBvcHRpb24uIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NjE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnRlcm5hbCBlcnJvciAtLSB0aGlzIG9wdGlvbiBub3QgaW1wbGVtZW50ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjczMCBhci5jOjc4MiBhci5jOjEyMTIgb2JqY29weS5jOjk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBzdGF0IGVycm9yIG9uICVzIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSI8bWVtYmVyICVzPlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6NzUxIGFyLmM6ODE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGlzIG5vdCBhIHZhbGlkIGFyY2hpdmUiCi1tc2dzdHIgIiIKLQotIzogYXIuYzo3ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhdCByZXR1cm5zIG5lZ2F0aXZlIHNpemUgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6OTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIGlzIG5vdCBhbiBhcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6OTE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjcmVhdGluZyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MTExMAotIywgYy1mb3JtYXQKLW1zZ2lkICJObyBtZW1iZXIgbmFtZWQgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGFyLmM6MTE2MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gZW50cnkgJXMgaW4gYXJjaGl2ZSAlcyFcbiIKLW1zZ3N0ciAiIgotCi0jOiBhci5jOjEzMjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIGFyY2hpdmUgbWFwIHRvIHVwZGF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIGVudHJ5ICVzIGluIGFyY2hpdmUuXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxMTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gb3V0cHV0IGFyY2hpdmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjE3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBpbnB1dCBhcmNoaXZlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoxODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgJXMgaXMgbm90IGFuIGFyY2hpdmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gb3V0cHV0IGFyY2hpdmUgc3BlY2lmaWVkIHlldFxuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MjQ1IGFyc3VwLmM6MjgwIGFyc3VwLmM6MzE2IGFyc3VwLmM6MzM2IGFyc3VwLmM6Mzk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBvcGVuIG91dHB1dCBhcmNoaXZlXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzoyNTMgYXJzdXAuYzozNTQgYXJzdXAuYzozNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IG9wZW4gZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFyc3VwLmM6MzAxIGFyc3VwLmM6MzcwIGFyc3VwLmM6NDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjYW4ndCBmaW5kIG1vZHVsZSBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXJzdXAuYzo0MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3VycmVudCBvcGVuIGFyY2hpdmUgaXMgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcnN1cC5jOjQyOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gb3BlbiAgYXJjaGl2ZVxuIgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBzZXQgQkZEIGRlZmF1bHQgdGFyZ2V0IHRvIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjE1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogTWF0Y2hpbmcgZm9ybWF0czoiCi1tc2dzdHIgIiIKLQotIzogYnVjb21tLmM6MTY4Ci1tc2dpZCAiU3VwcG9ydGVkIHRhcmdldHM6IgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjE3MAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3VwcG9ydGVkIHRhcmdldHM6IgotbXNnc3RyICIiCi0KLSM6IGJ1Y29tbS5jOjI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmFkIG51bWJlcjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIjbGluZXMgJWQgIgotbXNnc3RyICIiCi0KLSM6IGNvZmZkdW1wLmM6NDU2IHN5c2R1bXAuYzo3MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo0OTggc3Jjb252LmM6MTk0MCBzeXNkdW1wLmM6NzU1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdOVSAlcyB2ZXJzaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29mZmR1bXAuYzo1MTYgc3Jjb252LmM6MTk3NyBzeXNkdW1wLmM6Nzc1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZFxuIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6NjUzCi1tc2dpZCAiZGVidWdfYWRkX3RvX2N1cnJlbnRfbmFtZXNwYWNlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo3MzYKLW1zZ2lkICJkZWJ1Z19zdGFydF9zb3VyY2U6IG5vIGRlYnVnX3NldF9maWxlbmFtZSBjYWxsIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6Nzk1Ci1tc2dpZCAiZGVidWdfcmVjb3JkX2Z1bmN0aW9uOiBubyBkZWJ1Z19zZXRfZmlsZW5hbWUgY2FsbCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjg1MQotbXNnaWQgImRlYnVnX3JlY29yZF9wYXJhbWV0ZXI6IG5vIGN1cnJlbnQgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo4ODUKLW1zZ2lkICJkZWJ1Z19lbmRfZnVuY3Rpb246IG5vIGN1cnJlbnQgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzo4OTEKLW1zZ2lkICJkZWJ1Z19lbmRfZnVuY3Rpb246IHNvbWUgYmxvY2tzIHdlcmUgbm90IGNsb3NlZCIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjkyMQotbXNnaWQgImRlYnVnX3N0YXJ0X2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTU5Ci1tc2dpZCAiZGVidWdfZW5kX2Jsb2NrOiBubyBjdXJyZW50IGJsb2NrIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6OTY2Ci1tc2dpZCAiZGVidWdfZW5kX2Jsb2NrOiBhdHRlbXB0IHRvIGNsb3NlIHRvcCBsZXZlbCBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjk5MgotbXNnaWQgImRlYnVnX3JlY29yZF9saW5lOiBubyBjdXJyZW50IHVuaXQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUUKLSM6IGRlYnVnLmM6MTA0NgotbXNnaWQgImRlYnVnX3N0YXJ0X2NvbW1vbl9ibG9jazogbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSMuIEZJWE1FCi0jOiBkZWJ1Zy5jOjEwNTgKLW1zZ2lkICJkZWJ1Z19lbmRfY29tbW9uX2Jsb2NrOiBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUUuCi0jOiBkZWJ1Zy5jOjExNTIKLW1zZ2lkICJkZWJ1Z19yZWNvcmRfbGFiZWwgbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTE3OAotbXNnaWQgImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTE5NAotbXNnaWQgImRlYnVnX3JlY29yZF92YXJpYWJsZTogbm8gY3VycmVudCBibG9jayIKLW1zZ3N0ciAiIgotCi0jOiBkZWJ1Zy5jOjE3NjQKLW1zZ2lkICJkZWJ1Z19tYWtlX3VuZGVmaW5lZF90eXBlOiB1bnN1cHBvcnRlZCBraW5kIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MTk3MAotbXNnaWQgImRlYnVnX25hbWVfdHlwZTogbm8gY3VycmVudCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjAxOAotbXNnaWQgImRlYnVnX3RhZ190eXBlOiBubyBjdXJyZW50IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDI2Ci1tc2dpZCAiZGVidWdfdGFnX3R5cGU6IGV4dHJhIHRhZyBhdHRlbXB0ZWQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IGNoYW5naW5nIHR5cGUgc2l6ZSBmcm9tICVkIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMDkwCi1tc2dpZCAiZGVidWdfZmluZF9uYW1lZF90eXBlOiBubyBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQiCi1tc2dzdHIgIiIKLQotIzogZGVidWcuYzoyMTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnX2dldF9yZWFsX3R5cGU6IGNpcmN1bGFyIGRlYnVnIGluZm9ybWF0aW9uIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRlYnVnLmM6MjY2MwotbXNnaWQgImRlYnVnX3dyaXRlX3R5cGU6IGlsbGVnYWwgdHlwZSBlbmNvdW50ZXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6NzExIGRsbHRvb2wuYzo3MzUgZGxsdG9vbC5jOjc2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogVW5rbm93biBtYWNoaW5lIHR5cGU6ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjc5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGRlZiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Nzk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NpbmcgZGVmIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4MDMKLW1zZ2lkICJQcm9jZXNzZWQgZGVmIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjgyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW50YXggZXJyb3IgaW4gZGVmIGZpbGUgJXM6JWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5BTUU6ICVzIGJhc2U6ICV4IgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4NjQKLW1zZ2lkICJDYW4ndCBoYXZlIExJQlJBUlkgYW5kIE5BTUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6ODgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxJQlJBUlk6ICVzIGJhc2U6ICV4IgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzo4ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IGhhdmUgTElCUkFSWSBhbmQgTkFNRVxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMTM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndhaXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxMTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgInN1YnByb2Nlc3MgZ290IGZhdGFsIHNpZ25hbCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTE0OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlcyBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTE4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJTdWNraW5nIGluIGluZm8gZnJvbSAlcyBzZWN0aW9uIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjEyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXhjbHVkaW5nIHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTM4NiBkbGx0b29sLmM6MTM5NyBubS5jOjkwMiBubS5jOjkxMyBvYmpkdW1wLmM6Mzc5IG9iamR1bXAuYzozOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogd2Ugb3VnaHQgdG8gcmVhZCBpbiBhbmQgYmxvY2sgb3V0IHRoZSBiYXNlIHJlbG9jYXRpb25zCi0jOiBkbGx0b29sLmM6MTQyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJEb25lIHJlYWRpbmcgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTQzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gb3BlbiBvYmplY3QgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU2Nhbm5pbmcgb2JqZWN0IGZpbGUgJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHByb2R1Y2UgbWNvcmUtZWxmIGRsbCBmcm9tIGFyY2hpdmUgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE1MzgKLW1zZ2lkICJBZGRpbmcgZXhwb3J0cyB0byBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTU4MwotbXNnaWQgIkFkZGVkIGV4cG9ydHMgdG8gb3V0cHV0IGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE2OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR2VuZXJhdGluZyBleHBvcnQgZmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MTY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gb3BlbiB0ZW1wb3JhcnkgYXNzZW1ibGVyIGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoxNjk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9wZW5lZCB0ZW1wb3JhcnkgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjE5MTgKLW1zZ2lkICJHZW5lcmF0ZWQgZXhwb3J0cyBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyMTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImJmZF9vcGVuIGZhaWxlZCBvcGVuIHN0dWIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjIxNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3JlYXRpbmcgc3R1YiBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjU1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gb3BlbiB0ZW1wb3JhcnkgaGVhZCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjYyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJmYWlsZWQgdG8gb3BlbiB0ZW1wb3JhcnkgdGFpbCBmaWxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MjY5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIC5saWIgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI3MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ3JlYXRpbmcgbGlicmFyeSBmaWxlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyNzU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBkZWxldGUgJXM6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI3NjEKLW1zZ2lkICJDcmVhdGVkIGxpYiBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzoyODYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmcsIGlnbm9yaW5nIGR1cGxpY2F0ZSBFWFBPUlQgJXMgJWQsJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6Mjg2OAotIywgYy1mb3JtYXQKLW1zZ2lkICJFcnJvciwgZHVwbGljYXRlIEVYUE9SVCB3aXRoIG9yaWRpbmFsczogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjI5OTUKLW1zZ2lkICJQcm9jZXNzaW5nIGRlZmluaXRpb25zIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDMzCi1tc2dpZCAiUHJvY2Vzc2VkIGRlZmluaXRpb25zIgotbXNnc3RyICIiCi0KLSMuIHhnZXRleHQ6Yy1mb3JtYXQKLSM6IGRsbHRvb2wuYzozMDQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlICVzIDxvcHRpb25zPiA8b2JqZWN0LWZpbGVzPlxuIgotbXNnc3RyICIiCi0KLSMuIHhnZXRleHQ6Yy1mb3JtYXQKLSM6IGRsbHRvb2wuYzozMDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIgICAtbSAtLW1hY2hpbmUgPG1hY2hpbmU+ICAgIENyZWF0ZSBhcyBETEwgZm9yIDxtYWNoaW5lPi4gIFtkZWZhdWx0OiAlc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA0NwotbXNnaWQgIiIKLSIgICAgICAgIHBvc3NpYmxlIDxtYWNoaW5lPjogYXJtW19pbnRlcndvcmtdLCBpMzg2LCBtY29yZVstZWxmXVstbGVdLCBwcGMsICIKLSJ0aHVtYlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDQ4Ci1tc2dpZCAiICAgLWUgLS1vdXRwdXQtZXhwIDxvdXRuYW1lPiBHZW5lcmF0ZSBhbiBleHBvcnQgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA0OQotbXNnaWQgIiAgIC1sIC0tb3V0cHV0LWxpYiA8b3V0bmFtZT4gR2VuZXJhdGUgYW4gaW50ZXJmYWNlIGxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNTAKLW1zZ2lkICIgICAtYSAtLWFkZC1pbmRpcmVjdCAgICAgICAgIEFkZCBkbGwgaW5kaXJlY3RzIHRvIGV4cG9ydCBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDUxCi1tc2dpZCAiIgotIiAgIC1EIC0tZGxsbmFtZSA8bmFtZT4gICAgICAgTmFtZSBvZiBpbnB1dCBkbGwgdG8gcHV0IGludG8gaW50ZXJmYWNlIGxpYi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1MgotbXNnaWQgIiAgIC1kIC0taW5wdXQtZGVmIDxkZWZmaWxlPiAgTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgcmVhZCBpbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1MwotbXNnaWQgIiAgIC16IC0tb3V0cHV0LWRlZiA8ZGVmZmlsZT4gTmFtZSBvZiAuZGVmIGZpbGUgdG8gYmUgY3JlYXRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NAotbXNnaWQgIiAgICAgIC0tZXhwb3J0LWFsbC1zeW1ib2xzICAgRXhwb3J0IGFsbCBzeW1ib2xzIHRvIC5kZWZcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NQotbXNnaWQgIiAgICAgIC0tbm8tZXhwb3J0LWFsbC1zeW1ib2xzICBPbmx5IGV4cG9ydCBsaXN0ZWQgc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDU2Ci1tc2dpZCAiICAgICAgLS1leGNsdWRlLXN5bWJvbHMgPGxpc3Q+IERvbid0IGV4cG9ydCA8bGlzdD5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1NwotbXNnaWQgIiAgICAgIC0tbm8tZGVmYXVsdC1leGNsdWRlcyAgQ2xlYXIgZGVmYXVsdCBleGNsdWRlIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1OAotbXNnaWQgIiAgIC1iIC0tYmFzZS1maWxlIDxiYXNlZmlsZT4gUmVhZCBsaW5rZXIgZ2VuZXJhdGVkIGJhc2UgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA1OQotbXNnaWQgIiAgIC14IC0tbm8taWRhdGE0ICAgICAgICAgICAgRG9uJ3QgZ2VuZXJhdGUgaWRhdGEkNCBzZWN0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDYwCi1tc2dpZCAiICAgLWMgLS1uby1pZGF0YTUgICAgICAgICAgICBEb24ndCBnZW5lcmF0ZSBpZGF0YSQ1IHNlY3Rpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjEKLW1zZ2lkICIiCi0iICAgLVUgLS1hZGQtdW5kZXJzY29yZSAgICAgICBBZGQgdW5kZXJzY29yZXMgdG8gc3ltYm9scyBpbiBpbnRlcmZhY2UgIgotImxpYnJhcnkuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjIKLW1zZ2lkICIgICAtayAtLWtpbGwtYXQgICAgICAgICAgICAgIEtpbGwgQDxuPiBmcm9tIGV4cG9ydGVkIG5hbWVzLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDYzCi1tc2dpZCAiICAgLUEgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICBBZGQgYWxpYXNlcyB3aXRob3V0IEA8bj4uXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjQKLW1zZ2lkICIgICAtUyAtLWFzIDxuYW1lPiAgICAgICAgICAgIFVzZSA8bmFtZT4gZm9yIGFzc2VtYmxlci5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA2NQotbXNnaWQgIiAgIC1mIC0tYXMtZmxhZ3MgPGZsYWdzPiAgICAgUGFzcyA8ZmxhZ3M+IHRvIHRoZSBhc3NlbWJsZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjYKLW1zZ2lkICIiCi0iICAgLW4gLS1uby1kZWxldGUgICAgICAgICAgICBLZWVwIHRlbXAgZmlsZXMgKHJlcGVhdCBmb3IgZXh0cmEgIgotInByZXNlcnZhdGlvbikuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjcKLW1zZ2lkICIgICAtdiAtLXZlcmJvc2UgICAgICAgICAgICAgIEJlIHZlcmJvc2UuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNjgKLW1zZ2lkICIgICAtViAtLXZlcnNpb24gICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gdmVyc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBkbGx0b29sLmM6MzA2OQotbXNnaWQgIiAgIC1oIC0taGVscCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGluZm9ybWF0aW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDcxCi1tc2dpZCAiIgotIiAgIC1NIC0tbWNvcmUtZWxmIDxvdXRuYW1lPiAgUHJvY2VzcyBtY29yZS1lbGYgb2JqZWN0IGZpbGVzIGludG8gPG91dG5hbWU+LlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMDcyCi1tc2dpZCAiICAgLUwgLS1saW5rZXIgPG5hbWU+ICAgICAgICBVc2UgPG5hbWU+IGFzIHRoZSBsaW5rZXIuXG4iCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMwNzMKLW1zZ2lkICIgICAtRiAtLWxpbmtlci1mbGFncyA8ZmxhZ3M+IFBhc3MgPGZsYWdzPiB0byB0aGUgbGlua2VyLlxuIgotbXNnc3RyICIiCi0KLSM6IGRsbHRvb2wuYzozMjE2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBvcGVuIGJhc2UtZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTWFjaGluZSAnJXMnIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogZGxsdG9vbC5jOjMzODUKLW1zZ2lkICJidWZmZXIgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzE2Ci1tc2dpZCAidW5leHBlY3RlZCBlbmQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo0MTEKLW1zZ2lkICJpbnZhbGlkIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDcwCi1tc2dpZCAiaW52YWxpZCBzdHJpbmcgbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1MjcgaWVlZS5jOjU2OAotbXNnaWQgImV4cHJlc3Npb24gc3RhY2sgb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjU0NwotbXNnaWQgInVuc3VwcG9ydGVkIElFRUUgZXhwcmVzc2lvbiBvcGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTYyCi1tc2dpZCAidW5rbm93biBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1ODMKLW1zZ2lkICJleHByZXNzaW9uIHN0YWNrIHVuZGVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NTk3Ci1tc2dpZCAiZXhwcmVzc2lvbiBzdGFjayBtaXNtYXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NjM2Ci1tc2dpZCAidW5rbm93biBidWlsdGluIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjc4MQotbXNnaWQgIkJDRCBmbG9hdCB0eXBlIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjkyNwotbXNnaWQgInVuZXhwZWN0ZWQgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo5MzQKLW1zZ2lkICJ1bmV4cGVjdGVkIHJlY29yZCB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo5NjcKLW1zZ2lkICJibG9ja3MgbGVmdCBvbiBzdGFjayBhdCBlbmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEyMzIKLW1zZ2lkICJ1bmtub3duIEJCIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjEyNDEKLW1zZ2lkICJzdGFjayBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTI2NgotbXNnaWQgInN0YWNrIHVuZGVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MTM4MCBpZWVlLmM6MTQ1MiBpZWVlLmM6MjE1MQotbXNnaWQgImlsbGVnYWwgdmFyaWFibGUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0MzAKLW1zZ2lkICJpbGxlZ2FsIHR5cGUgaW5kZXgiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0NDAgaWVlZS5jOjE0NzcKLW1zZ2lkICJ1bmtub3duIFRZIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE0NTkKLW1zZ2lkICJ1bmRlZmluZWQgdmFyaWFibGUgaW4gVFkiCi1tc2dzdHIgIiIKLQotIy4gUGFzY2FsIGZpbGUgbmFtZS4gIEZJWE1FLgotIzogaWVlZS5jOjE4NzAKLW1zZ2lkICJQYXNjYWwgZmlsZSBuYW1lIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjE5MTgKLW1zZ2lkICJ1bnN1cHBvcnRlZCBxdWFsaWZlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjE4OQotbXNnaWQgInVuZGVmaW5lZCB2YXJpYWJsZSBpbiBBVE4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjIyMzIKLW1zZ2lkICJ1bmtub3duIEFUTiB0eXBlIgotbXNnc3RyICIiCi0KLSMuIFJlc2VydmVkIGZvciBGT1JUUkFOIGNvbW1vbi4KLSM6IGllZWUuYzoyMzU0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgQVROMTEiCi1tc2dzdHIgIiIKLQotIy4gV2UgaGF2ZSBubyB3YXkgdG8gcmVjb3JkIHRoaXMgaW5mb3JtYXRpb24uICBGSVhNRS4KLSM6IGllZWUuYzoyMzgxCi1tc2dpZCAidW5zdXBwb3J0ZWQgQVROMTIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI0NDEKLW1zZ2lkICJ1bmV4cGVjdGVkIHN0cmluZyBpbiBDKysgbWlzYyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjQ1NAotbXNnaWQgImJhZCBtaXNjIHJlY29yZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjQ5NwotbXNnaWQgInVucmVjb2duaXplZCBDKysgbWlzYyByZWNvcmQiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2MTQKLW1zZ2lkICJ1bmRlZmluZWQgQysrIG9iamVjdCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjY0OAotbXNnaWQgInVucmVjb2duaXplZCBDKysgb2JqZWN0IHNwZWMiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2ODQKLW1zZ2lkICJ1bnN1cHBvcnRlZCBDKysgb2JqZWN0IHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI2OTQKLW1zZ2lkICJDKysgYmFzZSBjbGFzcyBub3QgZGVmaW5lZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjcwNiBpZWVlLmM6MjgxMQotbXNnaWQgIkMrKyBvYmplY3QgaGFzIG5vIGZpZWxkcyIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MjcyNQotbXNnaWQgIkMrKyBiYXNlIGNsYXNzIG5vdCBmb3VuZCBpbiBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI4MzIKLW1zZ2lkICJDKysgZGF0YSBtZW1iZXIgbm90IGZvdW5kIGluIGNvbnRhaW5lciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjg3MyBpZWVlLmM6MzAyMwotbXNnaWQgInVua25vd24gQysrIHZpc2liaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjI5MDcKLW1zZ2lkICJiYWQgQysrIGZpZWxkIGJpdCBwb3Mgb3Igc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6Mjk5OQotbXNnaWQgImJhZCB0eXBlIGZvciBDKysgbWV0aG9kIGZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMDA5Ci1tc2dpZCAibm8gdHlwZSBpbmZvcm1hdGlvbiBmb3IgQysrIG1ldGhvZCBmdW5jdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzA0OAotbXNnaWQgIkMrKyBzdGF0aWMgdmlydHVhbCBtZXRob2QiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMxNDMKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIG9iamVjdCBvdmVyaGVhZCBzcGVjIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzozMTgyCi1tc2dpZCAidW5kZWZpbmVkIEMrKyB2dGFibGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMyNTMKLW1zZ2lkICJDKysgZGVmYXVsdCB2YWx1ZXMgbm90IGluIGEgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjMyOTMKLW1zZ2lkICJ1bnJlY29nbml6ZWQgQysrIGRlZmF1bHQgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzMyNAotbXNnaWQgInJlZmVyZW5jZSBwYXJhbWV0ZXIgaXMgbm90IGEgcG9pbnRlciIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzQwOQotbXNnaWQgInVucmVjb2duaXplZCBDKysgcmVmZXJlbmNlIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM0OTEKLW1zZ2lkICJDKysgcmVmZXJlbmNlIG5vdCBmb3VuZCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzQ5OQotbXNnaWQgIkMrKyByZWZlcmVuY2UgaXMgbm90IHBvaW50ZXIiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM1MjggaWVlZS5jOjM1MzYKLW1zZ2lkICJtaXNzaW5nIHJlcXVpcmVkIEFTTiIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6MzU2NiBpZWVlLmM6MzU3NAotbXNnaWQgIm1pc3NpbmcgcmVxdWlyZWQgQVRONjUiCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjM1ODgKLW1zZ2lkICJiYWQgQVRONjUgcmVjb3JkIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo0MjM1Ci1tc2dpZCAiSUVFRSBudW1lcmljIG92ZXJmbG93OiAweCIKLW1zZ3N0ciAiIgotCi0jOiBpZWVlLmM6NDI4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJRUVFIHN0cmluZyBsZW5ndGggb3ZlcmZsb3c6ICV1XG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjUzMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSB1bnN1cHBvcnRlZCBpbnRlZ2VyIHR5cGUgc2l6ZSAldVxuIgotbXNnc3RyICIiCi0KLSM6IGllZWUuYzo1MzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIklFRUUgdW5zdXBwb3J0ZWQgZmxvYXQgdHlwZSBzaXplICV1XG4iCi1tc2dzdHIgIiIKLQotIzogaWVlZS5jOjUzODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSUVFRSB1bnN1cHBvcnRlZCBjb21wbGV4IHR5cGUgc2l6ZSAldVxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyNzUgc3Jjb252LmM6MTk2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtdXN0IGJlIGRpZmZlcmVudFxuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzozMjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGlucHV0IGZpbGUgbmFtZWQgYm90aCBvbiBjb21tYW5kIGxpbmUgYW5kIHdpdGggSU5QVVRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBpbnB1dCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjM2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogbm8gbmFtZSBmb3Igb3V0cHV0IGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOmlucHV0IGFuZCBvdXRwdXQgZm9ybWF0cyBhcmUgbm90IGNvbXBhdGlibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDExCi1tc2dpZCAibWFrZSAuYnNzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQyMAotbXNnaWQgIm1ha2UgLm5sbXNlY3Rpb25zIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQyMgotbXNnaWQgInNldCAubmxtc2VjdGlvbnMgZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjQ1MAotbXNnaWQgInNldCAuYnNzIHZtYSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NDU3Ci1tc2dpZCAic2V0IC5kYXRhIHNpemUiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjYzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogc3ltYm9sICVzIGltcG9ydGVkIGJ1dCBub3QgaW4gaW1wb3J0IGxpc3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NjU4Ci1tc2dpZCAic2V0IHN0YXJ0IGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjcwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogU1RBUlQgcHJvY2VkdXJlICVzIG5vdCBkZWZpbmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjcxMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogRVhJVCBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBDSEVDSyBwcm9jZWR1cmUgJXMgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzM2IG5sbWNvbnYuYzo5MjgKLW1zZ2lkICJjdXN0b20gc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6NzU3IG5sbWNvbnYuYzo5NjAKLW1zZ2lkICJoZWxwIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjc3OSBubG1jb252LmM6OTc5Ci1tc2dpZCAibWVzc2FnZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo3OTUgbmxtY29udi5jOjEwMTIKLW1zZ2lkICJtb2R1bGUgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6ODE1IG5sbWNvbnYuYzoxMDI5Ci1tc2dpZCAicnBjIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjg1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolczogd2FybmluZzogc2hhcmVkIGxpYnJhcmllcyBjYW4gbm90IGhhdmUgdW5pbml0aWFsaXplZCBkYXRhXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjg3MyBubG1jb252LmM6MTA0OQotbXNnaWQgInNoYXJlZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzo4ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHdhcm5pbmc6IE5vIHZlcnNpb24gbnVtYmVyIGdpdmVuXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjkyMiBubG1jb252LmM6OTU0IG5sbWNvbnYuYzo5NzMgbmxtY29udi5jOjEwMjMgbmxtY29udi5jOjEwNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6JXM6IHJlYWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjk0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogTUFQIGFuZCBGVUxMTUFQIGFyZSBub3Qgc3VwcG9ydGVkOyB0cnkgbGQgLU1cbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ29udmVydCBhbiBvYmplY3QgZmlsZSBpbnRvIGEgTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFstZGhWXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstVCBoZWFkZXItZmlsZV0gWy1sIGxpbmtlcl1cbiIKLSIgICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0taGVhZGVyLWZpbGU9ZmlsZV0gWy0tbGlua2VyPWxpbmtlcl0gWy0tZGVidWddXG4iCi0iICAgICAgIFstLWhlbHBdIFstLXZlcnNpb25dXG4iCi0iICAgICAgIFtpbi1maWxlIFtvdXQtZmlsZV1dXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjExNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHN1cHBvcnQgbm90IGNvbXBpbGVkIGluIGZvciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjE2Ci1tc2dpZCAibWFrZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjMwCi1tc2dpZCAic2V0IHNlY3Rpb24gc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTIzNgotbXNnaWQgInNldCBzZWN0aW9uIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MTI0MAotbXNnaWQgInNldCBzZWN0aW9uIGZsYWdzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMjUxCi1tc2dpZCAic2V0IC5ubG1zZWN0aW9ucyBzaXplIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxMzM5IG5sbWNvbnYuYzoxMzQ3IG5sbWNvbnYuYzoxMzU2IG5sbWNvbnYuYzoxMzYxCi1tc2dpZCAic2V0IC5ubG1zZWN0aW9uIGNvbnRlbnRzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxODY0Ci1tc2dpZCAic3R1YiBzZWN0aW9uIHNpemVzIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoxOTEzCi1tc2dpZCAid3JpdGluZyBzdHViIgotbXNnc3RyICIiCi0KLSM6IG5sbWNvbnYuYzoyMDAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlc29sdmVkIFBDIHJlbGF0aXZlIHJlbG9jIGFnYWluc3QgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjA2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogb3ZlcmZsb3cgd2hlbiBhZGp1c3RpbmcgcmVsb2NhdGlvbiBhZ2FpbnN0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbmxtY29udi5jOjIxOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGV4ZWN1dGlvbiBvZiAlcyBmYWlsZWQ6ICIKLW1zZ3N0ciAiIgotCi0jOiBubG1jb252LmM6MjIwNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRXhlY3V0aW9uIG9mICVzIGZhaWxlZFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MjkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy1hQUJDRGdsbm9wUHJzdXZWXSBbLXQgcmFkaXhdIFstLXJhZGl4PXJhZGl4XSBbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0tZGVidWctc3ltc10gWy0tZXh0ZXJuLW9ubHldIFstLXByaW50LWFybWFwXSBbLS1wcmludC1maWxlLW5hbWVdXG4iCi0iICAgICAgIFstLW51bWVyaWMtc29ydF0gWy0tbm8tc29ydF0gWy0tcmV2ZXJzZS1zb3J0XSBbLS1zaXplLXNvcnRdXG4iCi0iICAgICAgIFstLXVuZGVmaW5lZC1vbmx5XSBbLS1wb3J0YWJpbGl0eV0gWy1mIHtic2Qsc3lzdixwb3NpeH1dXG4iCi0iICAgICAgIFstLWZvcm1hdD17YnNkLHN5c3YscG9zaXh9XSBbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdIFstLWR5bmFtaWNdXG4iCi0iICAgICAgIFstLWRlZmluZWQtb25seV0gWy0tbGluZS1udW1iZXJzXVxuIgotIiAgICAgICBbLS12ZXJzaW9uXSBbLS1oZWxwXVxuIgotIiAgICAgICBbZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IGludmFsaWQgcmFkaXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjM2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJXM6IGludmFsaWQgb3V0cHV0IGZvcm1hdFxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6NDkwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkYXRhIHNpemUgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogbm0uYzoxMjgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJVbmRlZmluZWQgc3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTI4MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTI4NCBubS5jOjEzMzgKLW1zZ2lkICIiCi0iTmFtZSAgICAgICAgICAgICAgICAgIFZhbHVlICAgQ2xhc3MgICAgICAgIFR5cGUgICAgICAgICBTaXplICAgTGluZSAgIgotIlNlY3Rpb25cbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjEzMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlVuZGVmaW5lZCBzeW1ib2xzIGZyb20gJXNbJXNdOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG5tLmM6MTMzNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iXG4iCi0iU3ltYm9scyBmcm9tICVzWyVzXTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBubS5jOjE1MDgKLW1zZ2lkICIiCi0iXG4iCi0iQXJjaGl2ZSBpbmRleDpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy12VlNwZ3hYXSBbLUkgYmZkbmFtZV0gWy1PIGJmZG5hbWVdIFstRiBiZmRuYW1lXSBbLWIgYnl0ZV1cbiIKLSIgICAgICAgWy1SIHNlY3Rpb25dIFstaSBpbnRlcmxlYXZlXSBbLS1pbnRlcmxlYXZlPWludGVybGVhdmVdIFstLWJ5dGU9Ynl0ZV1cbiIKLSIgICAgICAgWy0taW5wdXQtdGFyZ2V0PWJmZG5hbWVdIFstLW91dHB1dC10YXJnZXQ9YmZkbmFtZV0gIgotIlstLXRhcmdldD1iZmRuYW1lXVxuIgotIiAgICAgICBbLS1zdHJpcC1hbGxdIFstLXN0cmlwLWRlYnVnXSBbLS1zdHJpcC11bm5lZWRlZF0gWy0tZGlzY2FyZC1hbGxdXG4iCi0iICAgICAgIFstLWRpc2NhcmQtbG9jYWxzXSBbLS1kZWJ1Z2dpbmddIFstLXJlbW92ZS1zZWN0aW9uPXNlY3Rpb25dXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjMwMAotbXNnaWQgIiIKLSIgICAgICAgWy0tZ2FwLWZpbGw9dmFsXSBbLS1wYWQtdG89YWRkcmVzc10gWy0tcHJlc2VydmUtZGF0ZXNdXG4iCi0iICAgICAgIFstLXNldC1zdGFydD12YWxdIFxuIgotIiAgICAgICBbLS1jaGFuZ2Utc3RhcnQ9aW5jcl0gWy0tY2hhbmdlLWFkZHJlc3Nlcz1pbmNyXSBcbiIKLSIgICAgICAgKC0tYWRqdXN0LXN0YXJ0ICAgYW5kICAtLWFkanVzdC12bWEgYXJlIGFsaWFzZXMgZm9yIHRoZXNlIHR3bykgXG4iCi0iICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLWFkZHJlc3M9c2VjdGlvbns9LCssLX12YWxdXG4iCi0iICAgICAgICgtLWFkanVzdC1zZWN0aW9uLXZtYSBpcyBhbiBhbGlhcyBmb3IgLS1jaGFuZ2Utc2VjdGlvbi1hZGRyZXNzKVxuIgotIiAgICAgICBbLS1jaGFuZ2Utc2VjdGlvbi1sbWE9c2VjdGlvbns9LCssLX12YWxdXG4iCi0iICAgICAgIFstLWNoYW5nZS1zZWN0aW9uLXZtYT1zZWN0aW9uez0sKywtfXZhbF1cbiIKLSIgICAgICAgWy0tYWRqdXN0LXdhcm5pbmdzXSBbLS1uby1hZGp1c3Qtd2FybmluZ3NdXG4iCi0iICAgICAgIFstLWNoYW5nZS13YXJuaW5nc10gWy0tbm8tY2hhbmdlLXdhcm5pbmdzXVxuIgotIiAgICAgICBbLS1zZXQtc2VjdGlvbi1mbGFncz1zZWN0aW9uPWZsYWdzXSAiCi0iWy0tYWRkLXNlY3Rpb249c2VjdGlvbm5hbWU9ZmlsZW5hbWVdXG4iCi0iICAgICAgIFstLWtlZXAtc3ltYm9sIHN5bWJvbF0gWy1LIHN5bWJvbF0gWy0tc3RyaXAtc3ltYm9sIHN5bWJvbF0gWy1OICIKLSJzeW1ib2xdXG4iCi0iICAgICAgIFstLWxvY2FsaXplLXN5bWJvbCBzeW1ib2xdIFstTCBzeW1ib2xdIFstLXdlYWtlbi1zeW1ib2wgc3ltYm9sXVxuIgotIiAgICAgICBbLVcgc3ltYm9sXSBbLS1jaGFuZ2UtbGVhZGluZy1jaGFyXSBbLS1yZW1vdmUtbGVhZGluZy1jaGFyXSAiCi0iWy0td2Vha2VuXVxuIgotIiAgICAgICBbLS12ZXJib3NlXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBpbi1maWxlIFtvdXQtZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MzI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJVc2FnZTogJXMgWy12VnNTcGd4WF0gWy1JIGJmZG5hbWVdIFstTyBiZmRuYW1lXSBbLUYgYmZkbmFtZV0gWy1SIHNlY3Rpb25dXG4iCi0iICAgICAgIFstLWlucHV0LXRhcmdldD1iZmRuYW1lXSBbLS1vdXRwdXQtdGFyZ2V0PWJmZG5hbWVdICIKLSJbLS10YXJnZXQ9YmZkbmFtZV1cbiIKLSIgICAgICAgWy0tc3RyaXAtYWxsXSBbLS1zdHJpcC1kZWJ1Z10gWy0tc3RyaXAtdW5uZWVkZWRdIFstLWRpc2NhcmQtYWxsXVxuIgotIiAgICAgICBbLS1kaXNjYXJkLWxvY2Fsc10gWy0ta2VlcC1zeW1ib2wgc3ltYm9sXSBbLUsgc3ltYm9sXVxuIgotIiAgICAgICBbLS1zdHJpcC1zeW1ib2wgc3ltYm9sXSBbLU4gc3ltYm9sXSBbLS1yZW1vdmUtc2VjdGlvbj1zZWN0aW9uXVxuIgotIiAgICAgICBbLW8gZmlsZV0gWy0tcHJlc2VydmUtZGF0ZXNdIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdICIKLSJmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjM4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgc2VjdGlvbiBmbGFnIGAlcyciCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjM4NAotbXNnaWQgInN1cHBvcnRlZCBmbGFnczogYWxsb2MsIGxvYWQsIHJlYWRvbmx5LCBjb2RlLCBkYXRhLCByb20sIGNvbnRlbnRzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo2MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29weSBmcm9tICVzKCVzKSB0byAlcyglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6NjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IE91dHB1dCBmaWxlIGNhbm5vdCByZXByZXNlbnQgYXJjaGl0ZWN0dXJlICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzo2NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuJ3QgY3JlYXRlIHNlY3Rpb24gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjc1NQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBmaWxsIGdhcCBhZnRlciAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjc4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBhZGQgcGFkZGluZyB0byAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjkxNgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZXJyb3IgY29weWluZyBwcml2YXRlIEJGRCBkYXRhOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6OTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBta2RpciAlcyBmb3IgYXJjaGl2ZSBjb3B5aW5nIChlcnJvcjogJXMpIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxMjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzZWN0aW9uIGAlcyc6IGVycm9yIGluICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3QgY3JlYXRlIGRlYnVnZ2luZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTUwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2FuJ3Qgc2V0IGRlYnVnZ2luZyBzZWN0aW9uIGNvbnRlbnRzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTUxMwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZG9uJ3Qga25vdyBob3cgdG8gd3JpdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTYxOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogY2Fubm90IHN0YXQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNjY4Ci1tc2dpZCAiYnl0ZSBudW1iZXIgbXVzdCBiZSBub24tbmVnYXRpdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE2NzMKLW1zZ2lkICJpbnRlcmxlYXZlIG11c3QgYmUgcG9zaXRpdmUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NDIKLW1zZ2lkICJiYWQgZm9ybWF0IGZvciAtLWFkZC1zZWN0aW9uIE5BTUU9RklMRU5BTUUiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE3NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fubm90IHN0YXQ6ICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTc2MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3Qgb3BlbjogJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxNzY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBmcmVhZCBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGZvcm1hdCBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE4NjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogdHJ1bmNhdGluZyBnYXAtZmlsbCBmcm9tIDB4JXMgdG8gMHgleCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTg5MgotbXNnaWQgImJhZCBmb3JtYXQgZm9yIC0tc2V0LXNlY3Rpb24tZmxhZ3MiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5MjIKLW1zZ2lkICJieXRlIG51bWJlciBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcmxlYXZlIgotbXNnc3RyICIiCi0KLSM6IG9iamNvcHkuYzoxOTQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBzdGF0OiAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogb2JqY29weS5jOjE5ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogLS1jaGFuZ2Utc2VjdGlvbi12bWEgJXMlYzB4JXMgbmV2ZXIgdXNlZCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpjb3B5LmM6MTk5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJXYXJuaW5nOiAtLWNoYW5nZS1zZWN0aW9uLWxtYSAlcyVjMHglcyBuZXZlciB1c2VkIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWFoaWZDZERwclJ0VHhzU2x3XSBbLWIgYmZkbmFtZV0gWy1tIG1hY2hpbmVdIFstaiBzZWN0aW9uLW5hbWVdXG4iCi0iICAgICAgIFstLWFyY2hpdmUtaGVhZGVyc10gWy0tdGFyZ2V0PWJmZG5hbWVdIFstLWRlYnVnZ2luZ10gWy0tZGlzYXNzZW1ibGVdXG4iCi0iICAgICAgIFstLWRpc2Fzc2VtYmxlLWFsbF0gWy0tZGlzYXNzZW1ibGUtemVyb2VzXSBbLS1maWxlLWhlYWRlcnNdXG4iCi0iICAgICAgIFstLXNlY3Rpb24taGVhZGVyc10gWy0taGVhZGVyc11cbiIKLSIgICAgICAgWy0taW5mb10gWy0tc2VjdGlvbj1zZWN0aW9uLW5hbWVdIFstLWxpbmUtbnVtYmVyc10gWy0tc291cmNlXVxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMjYKLW1zZ2lkICIiCi0iICAgICAgIFstLWFyY2hpdGVjdHVyZT1tYWNoaW5lXSBbLS1yZWxvY10gWy0tZnVsbC1jb250ZW50c10gWy0tc3RhYnNdXG4iCi0iICAgICAgIFstLXN5bXNdIFstLWFsbC1oZWFkZXJzXSBbLS1keW5hbWljLXN5bXNdIFstLWR5bmFtaWMtcmVsb2NdXG4iCi0iICAgICAgIFstLXdpZGVdIFstLXZlcnNpb25dIFstLWhlbHBdIFstLXByaXZhdGUtaGVhZGVyc11cbiIKLSIgICAgICAgWy0tc3RhcnQtYWRkcmVzcz1hZGRyXSBbLS1zdG9wLWFkZHJlc3M9YWRkcl1cbiIKLSIgICAgICAgWy0tcHJlZml4LWFkZHJlc3Nlc10gWy0tW25vLV1zaG93LXJhdy1pbnNuXSBbLS1kZW1hbmdsZV1cbiIKLSIgICAgICAgWy0tYWRqdXN0LXZtYT1vZmZzZXRdIFstRUJ8LUVMXSBbLS1lbmRpYW49e2JpZ3xsaXR0bGV9XSBvYmpmaWxlLi4uXG4iCi0iYXQgbGVhc3Qgb25lIG9wdGlvbiBiZXNpZGVzIC1sICgtLWxpbmUtbnVtYmVycykgbXVzdCBiZSBnaXZlblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzozNjEKLW1zZ2lkICJTZWN0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MzYzCi1tc2dpZCAiSWR4IE5hbWUgICAgICAgICAgU2l6ZSAgICAgIFZNQSAgICAgICBMTUEgICAgICAgRmlsZSBvZmYgIEFsZ25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MzY1Ci1tc2dpZCAiIgotIklkeCBOYW1lICAgICAgICAgIFNpemUgICAgICBWTUEgICAgICAgICAgICAgICBMTUEgICAgICAgICAgICAgICBGaWxlIG9mZiAgIgotIkFsZ25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogbm90IGEgZHluYW1pYyBvYmplY3RcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6NDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogTm8gZHluYW1pYyBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjExMzEKLW1zZ2lkICJPdXQgb2YgdmlydHVhbCBtZW1vcnlcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTUzMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgdXNlIHN1cHBsaWVkIG1hY2hpbmUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTU1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3QgZGlzYXNzZW1ibGUgZm9yIGFyY2hpdGVjdHVyZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxNjI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIk5vICVzIHNlY3Rpb24gcHJlc2VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlcyBoYXMgbm8gJXMgc2VjdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODE4IG9iamR1bXAuYzoxODI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBSZWFkaW5nICVzIHNlY3Rpb24gb2YgJXMgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJDb250ZW50cyBvZiAlcyBzZWN0aW9uOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoxOTcxCi0jLCBjLWZvcm1hdAotbXNnaWQgImFyY2hpdGVjdHVyZTogJXMsICIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MTk3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJmbGFncyAweCUwOHg6XG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjE5ODcKLW1zZ2lkICIiCi0iXG4iCi0ic3RhcnQgYWRkcmVzcyAweCIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjAzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iJXM6ICAgICBmaWxlIGZvcm1hdCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyMDcxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBwcmludGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjIxMDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW4gYXJjaGl2ZSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjE1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDb250ZW50cyBvZiBzZWN0aW9uICVzOlxuIgotbXNnc3RyICIiCi0KLSM6IG9iamR1bXAuYzoyNjY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJGRCBoZWFkZXIgZmlsZSB2ZXJzaW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogb2JqZHVtcC5jOjI3ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVucmVjb2duaXplZCAtRSBvcHRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBvYmpkdW1wLmM6MjgwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5yZWNvZ25pemVkIC0tZW5kaWFuIHR5cGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjIwNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcGFyc2VfY29mZl90eXBlOiBCYWQgdHlwZSBjb2RlIDB4JXhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZGNvZmYuYzo0MjMgcmRjb2ZmLmM6NTMxIHJkY29mZi5jOjcxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6NDM5IHJkY29mZi5jOjczMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogYmZkX2NvZmZfZ2V0X2F1eGVudCBmYWlsZWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmRjb2ZmLmM6Nzk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlbGQ6IC5iZiB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IHJkY29mZi5jOjg0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogJWxkOiB1bmV4cGVjdGVkIC5lZlxuIgotbXNnc3RyICIiCi0KLSM6IHJkZGJnLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vIHJlY29nbml6ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmRkYmcuYzo0MDAKLW1zZ2lkICJMYXN0IHN0YWJzIGVudHJpZXMgYmVmb3JlIGVycm9yOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMzcgcmVhZGVsZi5jOjI2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRXJyb3I6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQ5IHJlYWRlbGYuYzoyNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IFdhcm5pbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA4IHJlYWRlbGYuYzozMzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzIKLW1zZ2lkICJEb24ndCBrbm93IGFib3V0IHJlbG9jYXRpb25zIG9uIHRoaXMgbWFjaGluZSBhcmNoaXRlY3R1cmVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDEwIHJlYWRlbGYuYzo0MzkKLW1zZ2lkICJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NTYKLW1zZ2lkICIiCi0iICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lICAgICAgICAgICIKLSJBZGRlbmRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDU5Ci1tc2dpZCAiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbmlzZWQ6ICUtN2x4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3BlcmF0aW5nIFN5c3RlbSBzcGVjaWZpYzogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NDQgcmVhZGVsZi5jOjk5NgotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93bj46ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzU4Ci1tc2dpZCAiTk9ORSAoTm9uZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc1OQotbXNnaWQgIlJFTCAoUmVsb2NhdGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2MAotbXNnaWQgIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc2MQotbXNnaWQgIkRZTiAoU2hhcmVkIG9iamVjdCBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzYyCi1tc2dpZCAiQ09SRSAoQ29yZSBmaWxlKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlByb2Nlc3NvciBTcGVjaWZpYzogKCV4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk9TIFNwZWNpZmljOiAoJXgpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo3NzAgcmVhZGVsZi5jOjgyOSByZWFkZWxmLmM6OTMyIHJlYWRlbGYuYzoxMTA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjx1bmtub3duPjogJXgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjc4MwotbXNnaWQgIk5vbmUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjkyOQotbXNnaWQgIkVMRkRBVEEyTFNCIChsaXR0bGUgZW5kaWFuKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6OTMwCi1tc2dpZCAiRUxGREFUQTJNU0IgKGJpZyBlbmRpYW4pIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQzCi1tc2dpZCAiVXNhZ2U6IHJlYWRlbGYge29wdGlvbnN9IGVsZi1maWxlKHMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDQKLW1zZ2lkICIgIE9wdGlvbnMgYXJlOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ1Ci1tc2dpZCAiIgotIiAgLWEgb3IgLS1hbGwgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvOiAtaCAtbCAtUyAtcyAtciAtZCAtViAtLWhpc3RvZ3JhbVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ2Ci1tc2dpZCAiICAtaCBvciAtLWZpbGUtaGVhZGVyICAgICAgIERpc3BsYXkgdGhlIEVMRiBmaWxlIGhlYWRlclxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTQ3Ci1tc2dpZCAiICAtbCBvciAtLXByb2dyYW0taGVhZGVycyBvciAtLXNlZ21lbnRzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDgKLW1zZ2lkICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgcHJvZ3JhbSBoZWFkZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNDkKLW1zZ2lkICIgIC1TIG9yIC0tc2VjdGlvbi1oZWFkZXJzIG9yIC0tc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MAotbXNnaWQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVyXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTEKLW1zZ2lkICIgIC1lIG9yIC0taGVhZGVycyAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MgotbXNnaWQgIiAgLXMgb3IgLS1zeW1zIG9yIC0tc3ltYm9scyBEaXNwbGF5IHRoZSBzeW1ib2wgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1MwotbXNnaWQgIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NAotbXNnaWQgIiAgLWQgb3IgLS1keW5hbWljICAgICAgICAgICBEaXNwbGF5IHRoZSBkeW5hbWljIHNlZ21lbnQgKGlmIHByZXNlbnQpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNTUKLW1zZ2lkICIgIC1WIG9yIC0tdmVyc2lvbi1pbmZvICAgICAgRGlzcGxheSB0aGUgdmVyc2lvbiBzZWN0aW9ucyAoaWYgcHJlc2VudClcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NgotbXNnaWQgIiIKLSIgIC1EIG9yIC0tdXNlLWR5bmFtaWMgICAgICAgVXNlIHRoZSBkeW5hbWljIHNlY3Rpb24gaW5mbyB3aGVuIGRpc3BsYXlpbmcgIgotInN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1NwotbXNnaWQgIiAgLXggPG51bWJlcj4gb3IgLS1oZXgtZHVtcD08bnVtYmVyPlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTU4Ci1tc2dpZCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXAgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE1OQotbXNnaWQgIiAgLXdbbGlhcHJdIG9yIC0tZGVidWctZHVtcFs9bGluZSw9aW5mbyw9YWJicmV2LD1wdWJuYW1lcyw9cmFuZ2VzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTYwCi1tc2dpZCAiIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiBEV0FSRjIgZGVidWcgc2VjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE2MgotbXNnaWQgIiAgLWkgPG51bWJlcj4gb3IgLS1pbnN0cnVjdGlvbi1kdW1wPTxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjMKLW1zZ2lkICIiCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjExNjUKLW1zZ2lkICIgICAgICAgIC0taGlzdG9ncmFtICAgICAgICAgRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3Roc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMTY2Ci1tc2dpZCAiICAtdiBvciAtLXZlcnNpb24gICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHJlYWRlbGZcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE2NwotbXNnaWQgIiAgLUggb3IgLS1oZWxwICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTE4NQotbXNnaWQgIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkdW1wIHJlcXVlc3QgdGFibGUuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBkZWJ1ZyBvcHRpb24gJyVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3B0aW9uICctJWMnXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNDcKLW1zZ2lkICJOb3RoaW5nIHRvIGRvLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzYwIHJlYWRlbGYuYzoxMzc3IHJlYWRlbGYuYzoyNTMxCi1tc2dpZCAibm9uZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM2MQotbXNnaWQgIkVMRjMyIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzYyCi1tc2dpZCAiRUxGNjQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNjQgcmVhZGVsZi5jOjEzODEgcmVhZGVsZi5jOjEzOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd246ICVseD4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjEzNzgKLW1zZ2lkICIyJ3MgY29tcGxlbWVudCwgbGl0dGxlIGVuZGlhbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTM3OQotbXNnaWQgIjIncyBjb21wbGVtZW50LCBiaWcgZW5kaWFuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk0Ci1tc2dpZCAiVU5JWCAtIFN5c3RlbSBWIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk1Ci1tc2dpZCAiVU5JWCAtIEhQLVVYIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxMzk2Ci1tc2dpZCAiU3RhbmRhbG9uZSBBcHAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0MTMKLW1zZ2lkICJOb3QgYW4gRUxGIGZpbGUgLSBpdCBoYXMgdGhlIHdyb25nIG1hZ2ljIGJ5dGVzIGF0IHRoZSBzdGFydFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDIxCi1tc2dpZCAiRUxGIEhlYWRlcjpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQyMgotbXNnaWQgIiAgTWFnaWM6ICAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDI4IHJlYWRlbGYuYzoxNDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAlZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQUJJIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweCVseFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDQ5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAlbGQgKGJ5dGVzIGludG8gZmlsZSlcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFN0YXJ0IG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBGbGFnczogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4JXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgdGhpcyBoZWFkZXI6ICAgICAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ1OAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ2MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE51bWJlciBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAgICVsZCAoYnl0ZXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBOdW1iZXIgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2VjdGlvbiBoZWFkZXIgc3RyaW5nIHRhYmxlIGluZGV4OiAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTQ3NgotbXNnaWQgIk5vdCBhIDMyIGJpdCBFTEYgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNDk2Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBwcm9ncmFtIGhlYWRlcnMgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFbGYgZmlsZSBpcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkVudHJ5IHBvaW50IDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhlcmUgYXJlICVkIHByb2dyYW0gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0ICVseDpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTUxNyByZWFkZWxmLmM6MTY2OCByZWFkZWxmLmM6MTcxMSByZWFkZWxmLmM6MjA5MCByZWFkZWxmLmM6MjIxNAotIzogcmVhZGVsZi5jOjMxMTUgcmVhZGVsZi5jOjMxMjkKLW1zZ2lkICJPdXQgb2YgbWVtb3J5XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlByb2dyYW0gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE1NDIKLW1zZ2lkICIiCi0iICBUeXBlICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiBNZW1TaXogIEZsZyBBbGlnblxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTc4Ci1tc2dpZCAibW9yZSB0aGFuIG9uZSBkeW5hbWljIHNlZ21lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTU4NgotbXNnaWQgIlVuYWJsZSB0byBmaW5kIHByb2dyYW0gaW50ZXJwcmV0ZXIgbmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSIgICAgICBbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc10iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE2MTEKLW1zZ2lkICIiCi0iXG4iCi0iIFNlY3Rpb24gdG8gU2VnbWVudCBtYXBwaW5nOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNjEyCi1tc2dpZCAiICBTZWdtZW50IFNlY3Rpb25zLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE3NDYKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHNlY3Rpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTc1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxNzg2Ci1tc2dpZCAiRmlsZSBjb250YWlucyBtdWx0aXBsZSBkeW5hbWljIHN5bWJvbCB0YWJsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTc5OQotbXNnaWQgIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzdHJpbmcgdGFibGVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gSGVhZGVyJXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE4MjgKLW1zZ2lkICIiCi0iICBbTnJdIE5hbWUgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBZGRyICAgICBPZmYgICAgU2l6ZSAgIEVTIEZsZyBMayAiCi0iSW5mIEFsXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlJlbG9jYXRpb24gc2VjdGlvbiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWxkIGJ5dGVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTE2Ci1tc2dpZCAiIgotIlxuIgotIlRoZXJlIGFyZSBubyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MTk0MwotbXNnaWQgIiIKLSJcbiIKLSJSZWxvY2F0aW9uIHNlY3Rpb24gIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoxOTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWx1IGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjE5ODIKLW1zZ2lkICIiCi0iXG4iCi0iVGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjA3MAotbXNnaWQgIiIKLSJcbiIKLSJUaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTI4Ci1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGUhIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTM0Ci1tc2dpZCAiVW5hYmxlIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgdG8gbG9hZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMTY0Ci1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjE3MAotbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjIzMQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyMzQKLW1zZ2lkICIgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAweCUtOC44bHggKCVzKSUqcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjI1NAotbXNnaWQgIkF1eGlsaWFyeSBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyMjU2Ci1tc2dpZCAiRmlsdGVyIGxpYnJhcnkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNjggcmVhZGVsZi5jOjIyODkgcmVhZGVsZi5jOjIzMTUKLW1zZ2lkICJGbGFnczoiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjIyNzAgcmVhZGVsZi5jOjIyOTEgcmVhZGVsZi5jOjIzMTcKLW1zZ2lkICIgTm9uZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNoYXJlZCBsaWJyYXJ5OiBbJXNdIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDI1Ci1tc2dpZCAiIHByb2dyYW0gaW50ZXJwcmV0ZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQyOQotIywgYy1mb3JtYXQKLW1zZ2lkICJMaWJyYXJ5IHNvbmFtZTogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkxpYnJhcnkgcnBhdGg6IFslc11cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjQ4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJOb3QgbmVlZGVkIG9iamVjdDogWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJWZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNTgwCi1tc2dpZCAiICBBZGRyOiAweCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjU4MiByZWFkZWxmLmM6Mjc3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjEyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFJldjogJWQgIEZsYWdzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjYxNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEluZGV4OiAlZCAgQ250OiAlZCAgIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5hbWU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTmFtZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlIzA2eDogUGFyZW50ICVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IFBhcmVudCAlZCwgbmFtZSBpbmRleDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjI2NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlZlcnNpb24gbmVlZHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjY4Ci1tc2dpZCAiIEFkZHI6IDB4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNjcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgT2Zmc2V0OiAlIzA4bHggIExpbmsgdG8gc2VjdGlvbjogJWxkICglcylcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICUjMDZ4OiBWZXJzaW9uOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjY5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgRmlsZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQ250OiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWU6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzI0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgJSMwNng6IE5hbWUgaW5kZXg6ICVseCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjcyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjc2NgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iVmVyc2lvbiBzeW1ib2xzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzoyNzY5Ci1tc2dpZCAiIEFkZHI6ICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mjc5OAotbXNnaWQgIiAgIDAgKCpsb2NhbCopICAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MjgwMgotbXNnaWQgIiAgIDEgKCpnbG9iYWwqKSAgICIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzAyNQotbXNnaWQgIiIKLSJcbiIKLSJObyB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvdW5kIGluIHRoaXMgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzAzOAotbXNnaWQgIkxPQ0FMIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDM5Ci1tc2dpZCAiR0xPQkFMIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDQwCi1tc2dpZCAiV0VBSyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA0MyByZWFkZWxmLmM6MzA2NwotIywgYy1mb3JtYXQKLW1zZ2lkICI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNDUgcmVhZGVsZi5jOjMwNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPE9TIHNwZWNpZmljPjogJWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNDcgcmVhZGVsZi5jOjMwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPHVua25vd24+OiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MAotbXNnaWQgIk5PVFlQRSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MQotbXNnaWQgIk9CSkVDVCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzA2MgotbXNnaWQgIkZVTkMiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMwNjMKLW1zZ2lkICJTRUNUSU9OIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMDY0Ci1tc2dpZCAiRklMRSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzEyMQotbXNnaWQgIlVuYWJsZSB0byByZWFkIGluIGR5bmFtaWMgZGF0YVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMTYzCi1tc2dpZCAiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE2OQotbXNnaWQgIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxNzUKLW1zZ2lkICJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjMxOTUKLW1zZ2lkICIiCi0iXG4iCi0iU3ltYm9sIHRhYmxlIGZvciBpbWFnZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzE5NgotbXNnaWQgIiAgTnVtIEJ1YzogICAgVmFsdWUgIFNpemUgICBUeXBlICAgQmluZCBPdCBOZHggTmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozMjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTeW1ib2wgdGFibGUgJyVzJyBjb250YWlucyAlbHUgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzI0NAotbXNnaWQgIiAgTnVtOiAgICBWYWx1ZSAgU2l6ZSBUeXBlICAgIEJpbmQgICBPdCAgTmR4IE5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzM1NgotbXNnaWQgImJhZCBkeW5hbWljIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzQxNQotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIHN5bWJvbCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGZvciBkaXNwbGF5aW5nIHN5bWJvbHMuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM0MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhpc3RvZ3JhbSBmb3IgYnVja2V0IGxpc3QgbGVuZ3RoICh0b3RhbCBvZiAlZCBidWNrZXRzKTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzQyOQotbXNnaWQgIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM0MzQgcmVhZGVsZi5jOjM0NTMgcmVhZGVsZi5jOjUzMzYgcmVhZGVsZi5jOjU1MjYKLW1zZ2lkICJPdXQgb2YgbWVtb3J5IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNDk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJEeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzUwMgotbXNnaWQgIiBOdW06IE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3VuZFRvICAgICBGbGFnc1xuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNTUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJBc3NlbWJseSBkdW1wIG9mIHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzU3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iU2VjdGlvbiAnJXMnIGhhcyBubyBkYXRhIHRvIGR1bXAuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM1NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzcyOAotbXNnaWQgImJhZGx5IGZvcm1lZCBleHRlbmRlZCBsaW5lIG9wIGVuY291bnRlcmVkISIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzczNQotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEV4dGVuZGVkIG9wY29kZSAlZDogIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzQwCi1tc2dpZCAiIgotIkVuZCBvZiBTZXF1ZW5jZVxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNldCBBZGRyZXNzIHRvIDB4JWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NTIKLW1zZ2lkICIgIGRlZmluZSBuZXcgRmlsZSBUYWJsZSBlbnRyeVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozNzUzIHJlYWRlbGYuYzozODcxCi1tc2dpZCAiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJWRcdCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzc1OCByZWFkZWxmLmM6Mzc2MCByZWFkZWxmLmM6Mzc2MiByZWFkZWxmLmM6Mzg4MyByZWFkZWxmLmM6Mzg4NQotIzogcmVhZGVsZi5jOjM4ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJWx1XHQiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVU5LTk9XTjogbGVuZ3RoICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM3ODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIkR1bXAgb2YgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlczpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzgwMQotbXNnaWQgIlRoZSBsaW5lIGluZm8gYXBwZWFycyB0byBiZSBjb3JydXB0IC0gdGhlIHNlY3Rpb24gaXMgdG9vIHNtYWxsXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MDkKLW1zZ2lkICJPbmx5IERXQVJGIHZlcnNpb24gMiBsaW5lIGluZm8gaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzgyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBEV0FSRiBWZXJzaW9uOiAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBQcm9sZ3VlIExlbmd0aDogICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBNaW5pbXVtIEluc3RydWN0aW9uIExlbmd0aDogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBJbml0aWFsIHZhbHVlIG9mICdpc19zdG10JzogICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMaW5lIEJhc2U6ICAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBMaW5lIFJhbmdlOiAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPcGNvZGUgQmFzZTogICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NDAKLW1zZ2lkICIiCi0iXG4iCi0iIE9wY29kZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPcGNvZGUgJWQgaGFzICVkIGFyZ3NcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg0OQotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIERpcmVjdG9yeSBUYWJsZSBpcyBlbXB0eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg1MgotbXNnaWQgIiIKLSJcbiIKLSIgVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzg1NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NjcKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBGaWxlIE5hbWUgVGFibGUgaXMgZW1wdHkuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NzAKLW1zZ2lkICIiCi0iXG4iCi0iIFRoZSBGaWxlIE5hbWUgVGFibGU6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM4NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAlZFx0IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozODg5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzXG4iCi1tc2dzdHIgIiIKLQotIy4gTm93IGRpc3BsYXkgdGhlIHN0YXRlbWVudHMuCi0jOiByZWFkZWxmLmM6Mzg5NwotbXNnaWQgIiIKLSJcbiIKLSIgTGluZSBOdW1iZXIgU3RhdGVtZW50czpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkxNQotbXNnaWQgIiAgQ29weVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgQWR2YW5jZSBQQyBieSAlZCB0byAlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6MzkzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgTGluZSBieSAlZCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgU2V0IEZpbGUgTmFtZSB0byBlbnRyeSAlZCBpbiB0aGUgRmlsZSBOYW1lIFRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgY29sdW1uIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5NTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZXQgaXNfc3RtdCB0byAlZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzozOTU3Ci1tc2dpZCAiICBTZXQgYmFzaWMgYmxvY2tcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk2NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgY29uc3RhbnQgJWQgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIEFkdmFuY2UgUEMgYnkgZml4ZWQgc2l6ZSBhbW91bnQgJWQgdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6Mzk4MAotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFNwZWNpYWwgb3Bjb2RlICVkOiBhZHZhbmNlIEFkZHJlc3MgYnkgJWQgdG8gMHglbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjM5ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIGFuZCBMaW5lIGJ5ICVkIHRvICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMDcgcmVhZGVsZi5jOjQ0MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkNvbnRlbnRzIG9mIHRoZSAlcyBzZWN0aW9uOlxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDI2Ci1tc2dpZCAiT25seSBEV0FSRiAyIHB1Ym5hbWVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbyBzZWN0aW9uOiAgICAgJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTaXplIG9mIGFyZWEgaW4gLmRlYnVnX2luZm8gc2VjdGlvbjogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQwMzkKLW1zZ2lkICIiCi0iXG4iCi0iICAgIE9mZnNldFx0TmFtZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gVEFHIHZhbHVlOiAlbHgiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQyMTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBBVCB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gRk9STSB2YWx1ZTogJWx4IgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDMyCi1tc2dpZCAiICBOdW1iZXIgVEFHXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgJWxkICAgICAgJXMgICAgWyVzXVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDQxCi1tc2dpZCAiaGFzIGNoaWxkcmVuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NDQxCi1tc2dpZCAibm8gY2hpbGRyZW4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0NDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgICUtMThzICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICVsdSBieXRlIGJsb2NrOiAiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ2MzMKLW1zZ2lkICIoVXNlciBkZWZpbmVkIGxvY2F0aW9uIG9wKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDYzNQotbXNnaWQgIihVbmtub3duIGxvY2F0aW9uIG9wKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmFibGUgdG8gaGFuZGxlIEZPUk06ICVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBmb3JtOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc2OQotbXNnaWQgIihub3QgaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NzAKLW1zZ2lkICIoaW5saW5lZCkiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ3NzEKLW1zZ2lkICIoZGVjbGFyZWQgYXMgaW5saW5lIGJ1dCBpZ25vcmVkKSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDc3MgotbXNnaWQgIihkZWNsYXJlZCBhcyBpbmxpbmUgYW5kIGlubGluZWQpIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0NzczCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgKFVua25vd24gaW5saW5lIGF0dHJpYnV0ZSB2YWx1ZTogJWx4KSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDkwMyByZWFkZWxmLmM6NTAyNwotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVGhlIHNlY3Rpb24gJXMgY29udGFpbnM6XG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MjUKLW1zZ2lkICJPbmx5IHZlcnNpb24gMiBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTI5Ci1tc2dpZCAiICBDb21waWxhdGlvbiBVbml0OlxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIExlbmd0aDogICAgICAgICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiAgIFZlcnNpb246ICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgQWJicmV2IE9mZnNldDogJWxkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjQ5MzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICAgUG9pbnRlciBTaXplOiAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NDk1MwotbXNnaWQgIlVuYWJsZSB0byBsb2NhdGUgLmRlYnVnX2FiYnJldiBzZWN0aW9uIVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBsb2NhdGUgZW50cnkgJWQgaW4gdGhlIGFiYnJldmlhdGlvbiB0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo0OTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiA8JWQ+PCV4PjogQWJicmV2IE51bWJlcjogJWQgKCVzKVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTA0NgotIywgYy1mb3JtYXQKLW1zZ2lkICIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTA0NwotIywgYy1mb3JtYXQKLW1zZ2lkICIgIE9mZnNldCBpbnRvIC5kZWJ1Z19pbmZvOiAgJWx4XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBQb2ludGVyIFNpemU6ICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiICBTZWdtZW50IFNpemU6ICAgICAgICAgICAgICVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUwNTEKLW1zZ2lkICIiCi0iXG4iCi0iICAgIEFkZHJlc3MgIExlbmd0aFxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MDg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkRpc3BsYXlpbmcgdGhlIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlNlY3Rpb24gJyVzJyBoYXMgbm8gZGVidWdnaW5nIGRhdGEuXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pc2VkIGRlYnVnIHNlY3Rpb246ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjUxODMKLW1zZ2lkICJTb21lIHNlY3Rpb25zIHdlcmUgbm90IGR1bXBlZCBiZWNhdXNlIHRoZXkgZG8gbm90IGV4aXN0IVxuIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1MzU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICclcycgY29udGFpbnMgJWQgZW50cmllczpcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTUxOQotbXNnaWQgImNvbmZsaWN0IGxpc3Qgd2l0aCB3aXRob3V0IHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IHJlYWRlbGYuYzo1NTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJTZWN0aW9uICcuY29uZmxpY3QnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU1NDgKLW1zZ2lkICIgIE51bTogICAgSW5kZXggICAgICAgVmFsdWUgIE5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVhZGVsZi5jOjU2MjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHN0YXQgaW5wdXQgZmlsZSAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTYzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTYzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkZWxmLmM6NTY1MgotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iXG4iCi0iRmlsZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiByZW5hbWUuYzoxMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBzZXQgdGltZTogJXMiCi1tc2dzdHIgIiIKLQotIy4gV2UgaGF2ZSB0byBjbGVhbiB1cCBoZXJlLgotIzogcmVuYW1lLmM6MTYwIHJlbmFtZS5jOjE5MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcmVuYW1lOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZW5hbWUuYzoyMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHNpbXBsZV9jb3B5OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMzAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG5vdCBlbm91Z2ggYmluYXJ5IGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTQ5Ci1tc2dpZCAibnVsbCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjE3OSByZXNiaW4uYzoxODUKLW1zZ2lkICJyZXNvdXJjZSBJRCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyMjkKLW1zZ2lkICJjdXJzb3IiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MjYzIHJlc2Jpbi5jOjI3MAotbXNnaWQgIm1lbnUgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjI4MAotbXNnaWQgIm1lbnVleCBoZWFkZXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6Mjg0Ci1tc2dpZCAibWVudWV4IG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoyOTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgbWVudSB2ZXJzaW9uICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjMxOSByZXNiaW4uYzozMzQgcmVzYmluLmM6NDAwCi1tc2dpZCAibWVudWl0ZW0gaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQzMAotbXNnaWQgIm1lbnVpdGVtIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQ3MSByZXNiaW4uYzo0OTkKLW1zZ2lkICJkaWFsb2cgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjQ4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGRpYWxvZyBzaWduYXR1cmUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NTMxCi1tc2dpZCAiZGlhbG9nIGZvbnQgcG9pbnQgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1MzkKLW1zZ2lkICJkaWFsb2dleCBmb250IGluZm9ybWF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjU2NCByZXNiaW4uYzo1ODIKLW1zZ2lkICJkaWFsb2cgY29udHJvbCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo1NzQKLW1zZ2lkICJkaWFsb2dleCBjb250cm9sIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjYwMwotbXNnaWQgImRpYWxvZyBjb250cm9sIGVuZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo2MTUKLW1zZ2lkICJkaWFsb2cgY29udHJvbCBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjY1OAotbXNnaWQgInN0cmluZ3RhYmxlIHN0cmluZyBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NjY4Ci1tc2dpZCAic3RyaW5ndGFibGUgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjcwMQotbXNnaWQgImZvbnRkaXIgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjcxNAotbXNnaWQgImZvbnRkaXIiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6NzMwCi1tc2dpZCAiZm9udGRpciBkZXZpY2UgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3MzYKLW1zZ2lkICJmb250ZGlyIGZhY2UgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo3NzkKLW1zZ2lkICJhY2NlbGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo4NDMKLW1zZ2lkICJncm91cCBjdXJzb3IgaGVhZGVyIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGdyb3VwIGN1cnNvciB0eXBlICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjg2MgotbXNnaWQgImdyb3VwIGN1cnNvciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MDEKLW1zZ2lkICJncm91cCBpY29uIGhlYWRlciIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBncm91cCBpY29uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6OTIwCi1tc2dpZCAiZ3JvdXAgaWNvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzo5OTEgcmVzYmluLmM6MTIxMAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTAyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJ2ZXJzaW9uIGxlbmd0aCAlZCBkb2VzIG5vdCBtYXRjaCByZXNvdXJjZSBsZW5ndGggJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwMjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24gbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwNDQKLW1zZ2lkICJmaXhlZCB2ZXJzaW9uIGluZm8iCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTA0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gc2lnbmF0dXJlICVsdSIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgZml4ZWQgdmVyc2lvbiBpbmZvIHZlcnNpb24gJWx1IgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwODEKLW1zZ2lkICJ2ZXJzaW9uIHZhciBpbmZvIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjEwOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzdHJpbmdmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTEwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5ndGFibGUgdmFsdWUgbGVuZ3RoICVkIgotbXNnc3RyICIiCi0KLSM6IHJlc2Jpbi5jOjExNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgIT0gJWQgKyAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTUzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmcgbGVuZ3RoICVkIDwgJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzYmluLmM6MTE3MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmV4cGVjdGVkIHZhcmZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMTg5Ci1tc2dpZCAidmVyc2lvbiB2YXJmaWxlaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiByZXNiaW4uYzoxMjA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZXhwZWN0ZWQgdmVyc2lvbiB2YWx1ZSBsZW5ndGggJWQiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjEyOAotbXNnaWQgImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIGlucHV0IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxNDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBubyByZXNvdXJjZSBzZWN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjE1NAotbXNnaWQgImNhbid0IHJlYWQgcmVzb3VyY2Ugc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MTgwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogYWRkcmVzcyBvdXQgb2YgYm91bmRzIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzoxOTkKLW1zZ2lkICJkaXJlY3RvcnkiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjIyNwotbXNnaWQgIm5hbWVkIGRpcmVjdG9yeSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjM2Ci1tc2dpZCAiZGlyZWN0b3J5IGVudHJ5IG5hbWUiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI1NgotbXNnaWQgIm5hbWVkIHN1YmRpcmVjdG9yeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MjY0Ci1tc2dpZCAibmFtZWQgcmVzb3VyY2UiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjI3OQotbXNnaWQgIklEIGRpcmVjdG9yeSBlbnRyeSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6Mjk2Ci1tc2dpZCAiSUQgc3ViZGlyZWN0b3J5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMDQKLW1zZ2lkICJJRCByZXNvdXJjZSIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6MzMwCi1tc2dpZCAicmVzb3VyY2UgdHlwZSB1bmtub3duIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozMzMKLW1zZ2lkICJkYXRhIGVudHJ5IgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozNDEKLW1zZ2lkICJyZXNvdXJjZSBkYXRhIgotbXNnc3RyICIiCi0KLSM6IHJlc2NvZmYuYzozNDYKLW1zZ2lkICJyZXNvdXJjZSBkYXRhIHNpemUiCi1tc2dzdHIgIiIKLQotIzogcmVzY29mZi5jOjQ0MQotbXNnaWQgImZpbGVuYW1lIHJlcXVpcmVkIGZvciBDT0ZGIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiByZXNjb2ZmLmM6NzM0Ci1tc2dpZCAiY2FuJ3QgZ2V0IEJGRF9SRUxPQ19SVkEgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MjUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IHBvcGVuIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MjY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiBwcmVwcm9jZXNzb3IgZmFpbGVkXG4iCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzozMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuZXhwZWN0ZWQgRU9GIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6MzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByZWFkIG9mICVsdSByZXR1cm5lZCAlbHUiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzo0MTAgcmVzcmMuYzo2NDEgcmVzcmMuYzo5MTQgcmVzcmMuYzoxMDY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlc3JjLmM6NDYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImN1cnNvciBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBjdXJzb3IgZGF0YSIKLW1zZ3N0ciAiIgotCi0jOiByZXNyYy5jOjQ5NSByZXNyYy5jOjc4NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZnNlZWsgdG8gJWx1IGZhaWxlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzo3NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWNvbiBmaWxlIGAlcycgZG9lcyBub3QgY29udGFpbiBpY29uIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogcmVzcmMuYzoxMjczCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6NzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLUFCZG94Vl0gWy0tZm9ybWF0PWJlcmtlbGV5fHN5c3ZdIFstLXJhZGl4PTh8MTB8MTZdXG4iCi0iICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBbZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBzaXplLmM6ODMKLW1zZ2lkICJkZWZhdWx0IGlzIC0tZm9ybWF0PWJlcmtlbGV5XG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjg1Ci1tc2dpZCAiZGVmYXVsdCBpcyAtLWZvcm1hdD1zeXN2XG4iCi1tc2dzdHIgIiIKLQotIzogc2l6ZS5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyZ3VtZW50IHRvIC0tZm9ybWF0OiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHNpemUuYzoxNjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCByYWRpeDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcmNvbnYuYzoxODc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVzYWdlOiAlcyBbLWRoVnFdIGluLWZpbGUgW291dC1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IHNyY29udi5jOjE4ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENvbnZlcnQgYSBDT0ZGIG9iamVjdCBmaWxlIGludG8gYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogc3Jjb252LmM6MjAyNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM0OSBzdGFicy5jOjE3NjIKLW1zZ2lkICJudW1lcmljIG92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCBzdGFiOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6ICVzOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NDkyCi1tc2dpZCAiTl9MQlJBQyBub3Qgd2l0aGluIGZ1bmN0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzo1MzEKLW1zZ2lkICJUb28gbWFueSBOX1JCUkFDc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6NzgwCi1tc2dpZCAidW5rbm93biBDKysgZW5jb2RlZCBuYW1lIgotbXNnc3RyICIiCi0KLSMuIENvbXBsYWluIGFuZCBrZWVwIGdvaW5nLCBzbyBjb21waWxlcnMgY2FuIGludmVudCBuZXcKLSMuIGNyb3NzLXJlZmVyZW5jZSB0eXBlcy4KLSM6IHN0YWJzLmM6MTMwNgotbXNnaWQgInVucmVjb2duaXplZCBjcm9zcyByZWZlcmVuY2UgdHlwZSIKLW1zZ3N0ciAiIgotCi0jLiBEb2VzIHRoaXMgYWN0dWFsbHkgZXZlciBoYXBwZW4/ICBJcyB0aGF0IHdoeSB3ZSBhcmUgd29ycnlpbmcKLSMuIGFib3V0IGRlYWxpbmcgd2l0aCBpdCByYXRoZXIgdGhhbiBqdXN0IGNhbGxpbmcgZXJyb3JfdHlwZT8KLSM6IHN0YWJzLmM6MTg1NAotbXNnaWQgIm1pc3NpbmcgaW5kZXggdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjIxODEKLW1zZ2lkICJ1bmtub3duIHZpcnR1YWwgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMTk5Ci1tc2dpZCAidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjM5MQotbXNnaWQgInVubmFtZWQgJHZiIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyMzk3Ci1tc2dpZCAidW5yZWNvZ25pemVkIEMrKyBhYmJyZXZpYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyNDc3Ci1tc2dpZCAidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyNzMzCi1tc2dpZCAiY29uc3Qvdm9sYXRpbGUgaW5kaWNhdG9yIG1pc3NpbmciCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzoyOTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIk5vIG1hbmdsaW5nIGZvciBcIiVzXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjMyODYKLW1zZ2lkICJVbmRlZmluZWQgTl9FWENMIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzM3NAotIywgYy1mb3JtYXQKLW1zZ2lkICJUeXBlIGZpbGUgbnVtYmVyICVkIG91dCBvZiByYW5nZVxuIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MzM3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJUeXBlIGluZGV4IG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM0NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIFhDT0ZGIHR5cGUgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdGFicy5jOjM3NjUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIG1hbmdsZWQgbmFtZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzozODYxCi1tc2dpZCAibm8gYXJndW1lbnQgdHlwZXMgaW4gbWFuZ2xlZCBzdHJpbmdcbiIKLW1zZ3N0ciAiIgotCi0jOiBzdHJpbmdzLmM6MTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBpbnZhbGlkIG51bWJlciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0cmluZ3MuYzo0OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGludmFsaWQgaW50ZWdlciBhcmd1bWVudCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHN0cmluZ3MuYzo1MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLWFmb3ZdIFstbiBtaW4tbGVuXSBbLW1pbi1sZW5dIFstdCB7byx4LGR9XSBbLV1cbiIKLSIgICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPW1pbi1sZW5dIFstLXJhZGl4PXtvLHgsZH1dXG4iCi0iICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS1oZWxwXSBbLS12ZXJzaW9uXSBmaWxlLi4uXG4iCi1tc2dzdHIgIiIKLQotIzogc3lzZHVtcC5jOjcxMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgWy1oVl0gaW4tZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IHN5c2R1bXAuYzo3ODMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiB2ZXJzaW9uLmM6MzkKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiB2ZXJzaW9uLmM6NDAKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuIgotInRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6MjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IG9wZW4gJXMgYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQxMgotbXNnaWQgIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NDI0Ci1tc2dpZCAiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NDMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB3YXJuaW5nOiAiCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjQzNQotbXNnaWQgIjogZHVwbGljYXRlIHZhbHVlXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5rbm93biBmb3JtYXQgdHlwZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjU5OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc3VwcG9ydGVkIGZvcm1hdHM6IgotbXNnc3RyICIiCi0KLSMuIE90aGVyd2lzZSwgd2UgZ2l2ZSB1cC4KLSM6IHdpbmRyZXMuYzo2ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2FuIG5vdCBkZXRlcm1pbmUgdHlwZSBvZiBmaWxlIGAlcyc7IHVzZSB0aGUgLUkgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo3MDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNhZ2U6ICVzIFtvcHRpb25zXSBbaW5wdXQtZmlsZV0gW291dHB1dC1maWxlXVxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo3MDIKLW1zZ2lkICIiCi0iT3B0aW9uczpcbiIKLSIgIC1pIEZJTEUsIC0taW5wdXQgRklMRSAgICAgICBOYW1lIGlucHV0IGZpbGVcbiIKLSIgIC1vIEZJTEUsIC0tb3V0cHV0IEZJTEUgICAgICBOYW1lIG91dHB1dCBmaWxlXG4iCi0iICAtSSBGT1JNQVQsIC0taW5wdXQtZm9ybWF0IEZPUk1BVFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgaW5wdXQgZm9ybWF0XG4iCi0iICAtTyBGT1JNQVQsIC0tb3V0cHV0LWZvcm1hdCBGT1JNQVRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IG91dHB1dCBmb3JtYXRcbiIKLSIgIC1GIFRBUkdFVCwgLS10YXJnZXQgVEFSR0VUICBTcGVjaWZ5IENPRkYgdGFyZ2V0XG4iCi0iICAtLXByZXByb2Nlc3NvciBQUk9HUkFNICAgICAgUHJvZ3JhbSB0byB1c2UgdG8gcHJlcHJvY2VzcyByYyBmaWxlXG4iCi0iICAtLWluY2x1ZGUtZGlyIERJUiAgICAgICAgICAgSW5jbHVkZSBkaXJlY3Rvcnkgd2hlbiBwcmVwcm9jZXNzaW5nIHJjIGZpbGVcbiIKLSIgIC1EU1lNWz1WQUxdLCAtLWRlZmluZSBTWU1bPVZBTF1cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgU1lNIHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG4iCi0iICAtdiAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyYm9zZSAtIHRlbGxzIHlvdSB3aGF0IGl0J3MgZG9pbmdcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzE4Ci1tc2dpZCAiICAtLXl5ZGVidWcgICAgICAgICAgICAgICAgICAgVHVybiBvbiBwYXJzZXIgZGVidWdnaW5nXG4iCi1tc2dzdHIgIiIKLQotIzogd2luZHJlcy5jOjcyMQotbXNnaWQgIiIKLSIgIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuIgotIiAgLS12ZXJzaW9uICAgICAgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiB3aW5kcmVzLmM6NzI0Ci1tc2dpZCAiIgotIkZPUk1BVCBpcyBvbmUgb2YgcmMsIHJlcywgb3IgY29mZiwgYW5kIGlzIGRlZHVjZWQgZnJvbSB0aGUgZmlsZSBuYW1lXG4iCi0iZXh0ZW5zaW9uIGlmIG5vdCBzcGVjaWZpZWQuICBBIHNpbmdsZSBmaWxlIG5hbWUgaXMgYW4gaW5wdXQgZmlsZS5cbiIKLSJObyBpbnB1dC1maWxlIGlzIHN0ZGluLCBkZWZhdWx0IHJjLiAgTm8gb3V0cHV0LWZpbGUgaXMgc3Rkb3V0LCBkZWZhdWx0IHJjLlxuIgotbXNnc3RyICIiCi0KLSM6IHdpbmRyZXMuYzo5NjMKLW1zZ2lkICJubyByZXNvdXJjZXMiCi1tc2dzdHIgIiIKLQotIzogd3JzdGFicy5jOjM2NiB3cnN0YWJzLmM6MjAyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJzdHJpbmdfaGFzaF9sb29rdXAgZmFpbGVkOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHdyc3RhYnMuYzo2NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3RhYl9pbnRfdHlwZTogYmFkIHNpemUgJXVcbiIKLW1zZ3N0ciAiIgotCi0jOiB3cnN0YWJzLmM6MTQ2OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogdW5rbm93biBzaXplIGZvciBmaWVsZCBgJXMnIGluIHN0cnVjdFxuIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9iaW51dGlscy9wcmRiZy5jIGIvYmludXRpbHMvcHJkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4Y2JkMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9wcmRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2MiArMCwwIEBACi0vKiBwcmRiZy5jIC0tIFByaW50IG91dCBnZW5lcmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgcHJpbnRzIG91dCB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGJ5Ci0gICBzdXBwbHlpbmcgYSBzZXQgb2Ygcm91dGluZXMgdG8gZGVidWdfd3JpdGUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdlIHVzZSBhcyBhIGhhbmRsZSBmb3IgdGhlc2Ugcm91dGluZXMuICAqLwotCi1zdHJ1Y3QgcHJfaGFuZGxlCi17Ci0gIC8qIEZpbGUgdG8gcHJpbnQgaW5mb3JtYXRpb24gdG8uICAqLwotICBGSUxFICpmOwotICAvKiBDdXJyZW50IGluZGVudGF0aW9uIGxldmVsLiAgKi8KLSAgdW5zaWduZWQgaW50IGluZGVudDsKLSAgLyogVHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBwcl9zdGFjayAqc3RhY2s7Ci0gIC8qIFBhcmFtZXRlciBudW1iZXIgd2UgYXJlIGFib3V0IHRvIG91dHB1dC4gICovCi0gIGludCBwYXJhbWV0ZXI7Ci19OwotCi0vKiBUaGUgdHlwZSBzdGFjay4gICovCi0KLXN0cnVjdCBwcl9zdGFjawotewotICAvKiBOZXh0IGVsZW1lbnQgb24gdGhlIHN0YWNrLiAgKi8KLSAgc3RydWN0IHByX3N0YWNrICpuZXh0OwotICAvKiBUaGlzIGVsZW1lbnQuICAqLwotICBjaGFyICp0eXBlOwotICAvKiBDdXJyZW50IHZpc2liaWxpdHkgb2YgZmllbGRzIGlmIHRoaXMgaXMgYSBjbGFzcy4gICovCi0gIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAvKiBOYW1lIG9mIHRoZSBjdXJyZW50IG1ldGhvZCB3ZSBhcmUgaGFuZGxpbmcuICAqLwotICBjb25zdCBjaGFyICptZXRob2Q7Ci19OwotCi1zdGF0aWMgdm9pZCBpbmRlbnQgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwdXNoX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByZXBlbmRfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gYXBwZW5kX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN1YnN0aXR1dGVfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gaW5kZW50X3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgY2hhciAqcG9wX3R5cGUgUEFSQU1TICgoc3RydWN0IHByX2hhbmRsZSAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF92bWEgUEFSQU1TICgoYmZkX3ZtYSwgY2hhciAqLCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9maXhfdmlzaWJpbGl0eQotICBQQVJBTVMgKChzdHJ1Y3QgcHJfaGFuZGxlICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotCi1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9jb21waWxhdGlvbl91bml0IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX2VtcHR5X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl92b2lkX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfZmxvYXRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gcHJfY29tcGxleF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHByX2VudW1fdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgYmZkX3NpZ25lZF92bWEgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfcG9pbnRlcl90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfcmVmZXJlbmNlX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9yYW5nZV90eXBlIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zZXRfdHlwZSBQQVJBTVMgKChQVFIsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX29mZnNldF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfbWV0aG9kX3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NvbnN0X3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl92b2xhdGlsZV90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdHJ1Y3RfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEsIGJmZF92bWEsIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gcHJfZW5kX3N0cnVjdF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfc3RhcnRfY2xhc3NfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3Nfc3RhdGljX21lbWJlcgotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX2Jhc2VjbGFzcwotICBQQVJBTVMgKChQVFIsIGJmZF92bWEsIGJvb2xlYW4sIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gcHJfY2xhc3Nfc3RhcnRfbWV0aG9kIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuLAotCSAgIGJmZF92bWEsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHByX2NsYXNzX3N0YXRpY19tZXRob2RfdmFyaWFudAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZW51bSBkZWJ1Z192aXNpYmlsaXR5LCBib29sZWFuLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9jbGFzc19lbmRfbWV0aG9kIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gcHJfZW5kX2NsYXNzX3R5cGUgUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBlZGVmX3R5cGUgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX3RhZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBkZWYgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHByX3RhZyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gcHJfaW50X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9mbG9hdF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgZG91YmxlKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl90eXBlZF9jb25zdGFudCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcHJfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX3N0YXJ0X2Z1bmN0aW9uIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9mdW5jdGlvbl9wYXJhbWV0ZXIKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfcGFybV9raW5kLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBwcl9zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHByX2VuZF9mdW5jdGlvbiBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHByX2xpbmVubyBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyBwcl9mbnMgPQotewotICBwcl9zdGFydF9jb21waWxhdGlvbl91bml0LAotICBwcl9zdGFydF9zb3VyY2UsCi0gIHByX2VtcHR5X3R5cGUsCi0gIHByX3ZvaWRfdHlwZSwKLSAgcHJfaW50X3R5cGUsCi0gIHByX2Zsb2F0X3R5cGUsCi0gIHByX2NvbXBsZXhfdHlwZSwKLSAgcHJfYm9vbF90eXBlLAotICBwcl9lbnVtX3R5cGUsCi0gIHByX3BvaW50ZXJfdHlwZSwKLSAgcHJfZnVuY3Rpb25fdHlwZSwKLSAgcHJfcmVmZXJlbmNlX3R5cGUsCi0gIHByX3JhbmdlX3R5cGUsCi0gIHByX2FycmF5X3R5cGUsCi0gIHByX3NldF90eXBlLAotICBwcl9vZmZzZXRfdHlwZSwKLSAgcHJfbWV0aG9kX3R5cGUsCi0gIHByX2NvbnN0X3R5cGUsCi0gIHByX3ZvbGF0aWxlX3R5cGUsCi0gIHByX3N0YXJ0X3N0cnVjdF90eXBlLAotICBwcl9zdHJ1Y3RfZmllbGQsCi0gIHByX2VuZF9zdHJ1Y3RfdHlwZSwKLSAgcHJfc3RhcnRfY2xhc3NfdHlwZSwKLSAgcHJfY2xhc3Nfc3RhdGljX21lbWJlciwKLSAgcHJfY2xhc3NfYmFzZWNsYXNzLAotICBwcl9jbGFzc19zdGFydF9tZXRob2QsCi0gIHByX2NsYXNzX21ldGhvZF92YXJpYW50LAotICBwcl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQsCi0gIHByX2NsYXNzX2VuZF9tZXRob2QsCi0gIHByX2VuZF9jbGFzc190eXBlLAotICBwcl90eXBlZGVmX3R5cGUsCi0gIHByX3RhZ190eXBlLAotICBwcl90eXBkZWYsCi0gIHByX3RhZywKLSAgcHJfaW50X2NvbnN0YW50LAotICBwcl9mbG9hdF9jb25zdGFudCwKLSAgcHJfdHlwZWRfY29uc3RhbnQsCi0gIHByX3ZhcmlhYmxlLAotICBwcl9zdGFydF9mdW5jdGlvbiwKLSAgcHJfZnVuY3Rpb25fcGFyYW1ldGVyLAotICBwcl9zdGFydF9ibG9jaywKLSAgcHJfZW5kX2Jsb2NrLAotICBwcl9lbmRfZnVuY3Rpb24sCi0gIHByX2xpbmVubwotfTsKLQwKLS8qIFByaW50IG91dCB0aGUgZ2VuZXJpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gcmVjb3JkZWQgaW4gZGhhbmRsZS4gICovCi0KLWJvb2xlYW4KLXByaW50X2RlYnVnZ2luZ19pbmZvIChmLCBkaGFuZGxlKQotICAgICBGSUxFICpmOwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSBpbmZvOwotCi0gIGluZm8uZiA9IGY7Ci0gIGluZm8uaW5kZW50ID0gMDsKLSAgaW5mby5zdGFjayA9IE5VTEw7Ci0gIGluZm8ucGFyYW1ldGVyID0gMDsKLQotICByZXR1cm4gZGVidWdfd3JpdGUgKGRoYW5kbGUsICZwcl9mbnMsIChQVFIpICZpbmZvKTsKLX0KLQwKLS8qIEluZGVudCB0byB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1pbmRlbnQgKGluZm8pCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5pbmRlbnQ7IGkrKykKLSAgICBwdXRjICgnICcsIGluZm8tPmYpOwotfQotCi0vKiBQdXNoIGEgdHlwZSBvbiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wdXNoX3R5cGUgKGluZm8sIHR5cGUpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnR5cGU7Ci17Ci0gIHN0cnVjdCBwcl9zdGFjayAqbjsKLQotICBpZiAodHlwZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gKHN0cnVjdCBwcl9zdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBtZW1zZXQgKG4sIDAsIHNpemVvZiAqbik7Ci0KLSAgbi0+dHlwZSA9IHhzdHJkdXAgKHR5cGUpOwotICBuLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9JR05PUkU7Ci0gIG4tPm1ldGhvZCA9IE5VTEw7Ci0gIG4tPm5leHQgPSBpbmZvLT5zdGFjazsKLSAgaW5mby0+c3RhY2sgPSBuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQcmVwZW5kIGEgc3RyaW5nIG9udG8gdGhlIHR5cGUgb24gdGhlIHRvcCBvZiB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcmVwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGNoYXIgKm47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIHN0cmxlbiAoaW5mby0+c3RhY2stPnR5cGUpICsgMSk7Ci0gIHNwcmludGYgKG4sICIlcyVzIiwgcywgaW5mby0+c3RhY2stPnR5cGUpOwotICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSB0eXBlIG9uIHRoZSB0b3Agb2YgdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotYXBwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgIHN0cnVjdCBwcl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgaWYgKHMgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBsZW4gPSBzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgaW5mby0+c3RhY2stPnR5cGUgPSAoY2hhciAqKSB4cmVhbGxvYyAoaW5mby0+c3RhY2stPnR5cGUsCi0JCQkJCSBsZW4gKyBzdHJsZW4gKHMpICsgMSk7Ci0gIHN0cmNweSAoaW5mby0+c3RhY2stPnR5cGUgKyBsZW4sIHMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXZSB1c2UgYW4gdW5kZXJzY29yZSB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgbmFtZSBzaG91bGQgZ28gaW4gYSB0eXBlCi0gICBzdHJpbmcuICBUaGlzIGZ1bmN0aW9uIHN1YnN0aXR1dGVzIGEgc3RyaW5nIGZvciB0aGUgdW5kZXJzY29yZS4gIElmCi0gICB0aGVyZSBpcyBubyB1bmRlcnNjb3JlLCB0aGUgbmFtZSBmb2xsb3dzIHRoZSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN1YnN0aXR1dGVfdHlwZSAoaW5mbywgcykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgY2hhciAqdTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIHUgPSBzdHJjaHIgKGluZm8tPnN0YWNrLT50eXBlLCAnfCcpOwotICBpZiAodSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKm47Ci0KLSAgICAgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnN0YWNrLT50eXBlKSArIHN0cmxlbiAocykpOwotCi0gICAgICBtZW1jcHkgKG4sIGluZm8tPnN0YWNrLT50eXBlLCB1IC0gaW5mby0+c3RhY2stPnR5cGUpOwotICAgICAgc3RyY3B5IChuICsgKHUgLSBpbmZvLT5zdGFjay0+dHlwZSksIHMpOwotICAgICAgc3RyY2F0IChuLCB1ICsgMSk7Ci0KLSAgICAgIGZyZWUgKGluZm8tPnN0YWNrLT50eXBlKTsKLSAgICAgIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChzdHJjaHIgKHMsICd8JykgIT0gTlVMTAotICAgICAgJiYgKHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICd7JykgIT0gTlVMTAotCSAgfHwgc3RyY2hyIChpbmZvLT5zdGFjay0+dHlwZSwgJygnKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICIoIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIpIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoKnMgPT0gJ1wwJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICByZXR1cm4gKGFwcGVuZF90eXBlIChpbmZvLCAiICIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgcykpOwotfQotCi0vKiBJbmRlbnQgdGhlIHR5cGUgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sgYnkgYXBwZW5kaW5nIHNwYWNlcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1pbmRlbnRfdHlwZSAoaW5mbykKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGluZm8tPmluZGVudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBvcCBhIHR5cGUgZnJvbSB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBjaGFyICoKLXBvcF90eXBlIChpbmZvKQotICAgICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgcHJfc3RhY2sgKm87Ci0gIGNoYXIgKnJldDsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIG8gPSBpbmZvLT5zdGFjazsKLSAgaW5mby0+c3RhY2sgPSBvLT5uZXh0OwotICByZXQgPSBvLT50eXBlOwotICBmcmVlIChvKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBQcmludCBhIFZNQSB2YWx1ZSBpbnRvIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3ZtYSAodm1hLCBidWYsIHVuc2lnbmVkcCwgaGV4cCkKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci0gICAgIGJvb2xlYW4gaGV4cDsKLXsKLSAgaWYgKHNpemVvZiAodm1hKSA8PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotICAgIHsKLSAgICAgIGlmIChoZXhwKQotCXNwcmludGYgKGJ1ZiwgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci0gICAgICBlbHNlIGlmICh1bnNpZ25lZHApCi0Jc3ByaW50ZiAoYnVmLCAiJWx1IiwgKHVuc2lnbmVkIGxvbmcpIHZtYSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmLCAiJWxkIiwgKGxvbmcpIHZtYSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYnVmWzBdID0gJzAnOwotICAgICAgYnVmWzFdID0gJ3gnOwotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiArIDIsIHZtYSk7Ci0gICAgfQotfQotDAotLyogU3RhcnQgYSBuZXcgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9jb21waWxhdGlvbl91bml0IChwLCBmaWxlbmFtZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPmluZGVudCA9PSAwKTsKLQotICBmcHJpbnRmIChpbmZvLT5mLCAiJXM6XG4iLCBmaWxlbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgc291cmNlIGZpbGUgd2l0aGluIGEgY29tcGlsYXRpb24gdW5pdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9zdGFydF9zb3VyY2UgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+aW5kZW50ID09IDApOwotCi0gIGZwcmludGYgKGluZm8tPmYsICIgJXM6XG4iLCBmaWxlbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYW4gZW1wdHkgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VtcHR5X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCAiPHVuZGVmaW5lZD4iKTsKLX0KLQotLyogUHVzaCBhIHZvaWQgdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3ZvaWRfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJ2b2lkIik7Ci19Ci0KLS8qIFB1c2ggYW4gaW50ZWdlciB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfaW50X3R5cGUgKHAsIHNpemUsIHVuc2lnbmVkcCkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHVuc2lnbmVkcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMTBdOwotCi0gIHNwcmludGYgKGFiLCAiJXNpbnQlZCIsIHVuc2lnbmVkcCA/ICJ1IiA6ICIiLCBzaXplICogOCk7Ci0gIHJldHVybiBwdXNoX3R5cGUgKGluZm8sIGFiKTsKLX0KLQotLyogUHVzaCBhIGZsb2F0aW5nIHR5cGUgb250byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mbG9hdF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzEwXTsKLQotICBpZiAoc2l6ZSA9PSA0KQotICAgIHJldHVybiBwdXNoX3R5cGUgKGluZm8sICJmbG9hdCIpOwotICBlbHNlIGlmIChzaXplID09IDgpCi0gICAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgImRvdWJsZSIpOwotCi0gIHNwcmludGYgKGFiLCAiZmxvYXQlZCIsIHNpemUgKiA4KTsKLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgYWIpOwotfQotCi0vKiBQdXNoIGEgY29tcGxleCB0eXBlIG9udG8gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY29tcGxleF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGlmICghIHByX2Zsb2F0X3R5cGUgKHAsIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gcHJlcGVuZF90eXBlIChpbmZvLCAiY29tcGxleCAiKTsKLX0KLQotLyogUHVzaCBhIGJvb2xlYW4gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Jvb2xfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsxMF07Ci0KLSAgc3ByaW50ZiAoYWIsICJib29sJWQiLCBzaXplICogOCk7Ci0KLSAgcmV0dXJuIHB1c2hfdHlwZSAoaW5mbywgYWIpOwotfQotCi0vKiBQdXNoIGFuIGVudW0gdHlwZSBvbnRvIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VudW1fdHlwZSAocCwgdGFnLCBuYW1lcywgdmFsdWVzKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWx1ZXM7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgYmZkX3NpZ25lZF92bWEgdmFsOwotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgImVudW0gIikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAodGFnICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHRhZykKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJ7ICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIi8qIHVuZGVmaW5lZCAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAwOwotICAgICAgZm9yIChpID0gMDsgbmFtZXNbaV0gIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiLCAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBuYW1lc1tpXSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKHZhbHVlc1tpXSAhPSB2YWwpCi0JICAgIHsKLQkgICAgICBjaGFyIGFiWzIwXTsKLQotCSAgICAgIHByaW50X3ZtYSAodmFsdWVzW2ldLCBhYiwgZmFsc2UsIGZhbHNlKTsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiA9ICIpCi0JCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgYWIpKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgdmFsID0gdmFsdWVzW2ldOwotCSAgICB9Ci0KLQkgICsrdmFsOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGFwcGVuZF90eXBlIChpbmZvLCAiIH0iKTsKLX0KLQotLyogVHVybiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGludG8gYSBwb2ludGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3BvaW50ZXJfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgcyA9IHN0cmNociAoaW5mby0+c3RhY2stPnR5cGUsICd8Jyk7Ci0gIGlmIChzICE9IE5VTEwgJiYgc1sxXSA9PSAnWycpCi0gICAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIigqfCkiKTsKLSAgcmV0dXJuIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIip8Iik7Ci19Ci0KLS8qIFR1cm4gdGhlIHRvcCB0eXBlIG9uIHRoZSBzdGFjayBpbnRvIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoYXQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9mdW5jdGlvbl90eXBlIChwLCBhcmdjb3VudCwgdmFyYXJncykKLSAgICAgUFRSIHA7Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqKmFyZ190eXBlczsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqczsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrICE9IE5VTEwpOwotCi0gIGxlbiA9IDEwOwotCi0gIGlmIChhcmdjb3VudCA8PSAwKQotICAgIHsKLSAgICAgIGFyZ190eXBlcyA9IE5VTEw7Ci0gICAgICBsZW4gKz0gMTU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGFyZ190eXBlcyA9IChjaGFyICoqKSB4bWFsbG9jIChhcmdjb3VudCAqIHNpemVvZiAqYXJnX3R5cGVzKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGFyZ190eXBlc1tpXSA9IHBvcF90eXBlIChpbmZvKTsKLQkgIGlmIChhcmdfdHlwZXNbaV0gPT0gTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgbGVuICs9IHN0cmxlbiAoYXJnX3R5cGVzW2ldKSArIDI7Ci0JfQotICAgICAgaWYgKHZhcmFyZ3MpCi0JbGVuICs9IDU7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgcmV0dXJuIHR5cGUgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCi0gIHMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBzdHJjcHkgKHMsICIofCkgKCIpOwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgc3RyY2F0IChzLCAiLyogdW5rbm93biAqLyIpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgc3RyY2F0IChzLCAiLCAiKTsKLQkgIHN0cmNhdCAocywgYXJnX3R5cGVzW2ldKTsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsICIuLi4iKTsKLQl9Ci0gICAgICBpZiAoYXJnY291bnQgPiAwKQotCWZyZWUgKGFyZ190eXBlcyk7Ci0gICAgfQotCi0gIHN0cmNhdCAocywgIikiKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVHVybiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrIGludG8gYSByZWZlcmVuY2UgdG8gdGhhdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3JlZmVyZW5jZV90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiJnwiKTsKLX0KLQotLyogTWFrZSBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfcmFuZ2VfdHlwZSAocCwgbG93ZXIsIHVwcGVyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3NpZ25lZF92bWEgbG93ZXI7Ci0gICAgIGJmZF9zaWduZWRfdm1hIHVwcGVyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYmxbMjBdLCBhYnVbMjBdOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiIikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHByaW50X3ZtYSAobG93ZXIsIGFibCwgZmFsc2UsIGZhbHNlKTsKLSAgcHJpbnRfdm1hICh1cHBlciwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotCi0gIHJldHVybiAocHJlcGVuZF90eXBlIChpbmZvLCAicmFuZ2UgKCIpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIik6IikKLQkgICYmIGFwcGVuZF90eXBlIChpbmZvLCBhYmwpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIjoiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIGFidSkpOwotfQotCi0vKiBNYWtlIGFuIGFycmF5IHR5cGUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl9hcnJheV90eXBlIChwLCBsb3dlciwgdXBwZXIsIHN0cmluZ3ApCi0gICAgIFBUUiBwOwotICAgICBiZmRfc2lnbmVkX3ZtYSBsb3dlcjsKLSAgICAgYmZkX3NpZ25lZF92bWEgdXBwZXI7Ci0gICAgIGJvb2xlYW4gc3RyaW5ncDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnJhbmdlX3R5cGU7Ci0gIGNoYXIgYWJsWzIwXSwgYWJ1WzIwXSwgYWJbNTBdOwotCi0gIHJhbmdlX3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmIChyYW5nZV90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChsb3dlciA9PSAwKQotICAgIHsKLSAgICAgIGlmICh1cHBlciA9PSAtMSkKLQlzcHJpbnRmIChhYiwgInxbXSIpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50X3ZtYSAodXBwZXIgKyAxLCBhYnUsIGZhbHNlLCBmYWxzZSk7Ci0JICBzcHJpbnRmIChhYiwgInxbJXNdIiwgYWJ1KTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfdm1hIChsb3dlciwgYWJsLCBmYWxzZSwgZmFsc2UpOwotICAgICAgcHJpbnRfdm1hICh1cHBlciwgYWJ1LCBmYWxzZSwgZmFsc2UpOwotICAgICAgc3ByaW50ZiAoYWIsICJ8WyVzOiVzXSIsIGFibCwgYWJ1KTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBhYikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChzdHJjbXAgKHJhbmdlX3R5cGUsICJpbnQiKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiOiIpCi0JICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCByYW5nZV90eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdwKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiIC8qIHN0cmluZyAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYSBzZXQgdHlwZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXByX3NldF90eXBlIChwLCBiaXRzdHJpbmdwKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBiaXRzdHJpbmdwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic2V0IHsgIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgfSIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0c3RyaW5ncCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIi8qIGJpdHN0cmluZyAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIE1ha2UgYW4gb2Zmc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfb2Zmc2V0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKQotCSAgJiYgcHJlcGVuZF90eXBlIChpbmZvLCAiICIpCi0JICAmJiBwcmVwZW5kX3R5cGUgKGluZm8sIHQpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIjo6fCIpKTsKLX0KLQotLyogTWFrZSBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX21ldGhvZF90eXBlIChwLCBkb21haW4sIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBkb21haW47Ci0gICAgIGludCBhcmdjb3VudDsKLSAgICAgYm9vbGVhbiB2YXJhcmdzOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgY2hhciAqZG9tYWluX3R5cGU7Ci0gIGNoYXIgKiphcmdfdHlwZXM7Ci0gIGNoYXIgKnM7Ci0KLSAgbGVuID0gMTA7Ci0KLSAgaWYgKCEgZG9tYWluKQotICAgIGRvbWFpbl90eXBlID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGRvbWFpbl90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICAgICAgaWYgKGRvbWFpbl90eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHN0cm5jbXAgKGRvbWFpbl90eXBlLCAiY2xhc3MgIiwgc2l6ZW9mICJjbGFzcyAiIC0gMSkgPT0gMAotCSAgJiYgc3RyY2hyIChkb21haW5fdHlwZSArIHNpemVvZiAiY2xhc3MgIiAtIDEsICcgJykgPT0gTlVMTCkKLQlkb21haW5fdHlwZSArPSBzaXplb2YgImNsYXNzICIgLSAxOwotICAgICAgZWxzZSBpZiAoc3RybmNtcCAoZG9tYWluX3R5cGUsICJ1bmlvbiBjbGFzcyAiLAotCQkJc2l6ZW9mICJ1bmlvbiBjbGFzcyAiKSA9PSAwCi0JICAgICAgICYmIChzdHJjaHIgKGRvbWFpbl90eXBlICsgc2l6ZW9mICJ1bmlvbiBjbGFzcyAiIC0gMSwgJyAnKQotCQkgICA9PSBOVUxMKSkKLQlkb21haW5fdHlwZSArPSBzaXplb2YgInVuaW9uIGNsYXNzICIgLSAxOwotICAgICAgbGVuICs9IHN0cmxlbiAoZG9tYWluX3R5cGUpOwotICAgIH0KLQotICBpZiAoYXJnY291bnQgPD0gMCkKLSAgICB7Ci0gICAgICBhcmdfdHlwZXMgPSBOVUxMOwotICAgICAgbGVuICs9IDE1OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBhcmdfdHlwZXMgPSAoY2hhciAqKikgeG1hbGxvYyAoYXJnY291bnQgKiBzaXplb2YgKmFyZ190eXBlcyk7Ci0gICAgICBmb3IgKGkgPSBhcmdjb3VudCAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgIiIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBhcmdfdHlwZXNbaV0gPSBwb3BfdHlwZSAoaW5mbyk7Ci0JICBpZiAoYXJnX3R5cGVzW2ldID09IE5VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGxlbiArPSBzdHJsZW4gKGFyZ190eXBlc1tpXSkgKyAyOwotCX0KLSAgICAgIGlmICh2YXJhcmdzKQotCWxlbiArPSA1OwotICAgIH0KLQotICAvKiBOb3cgdGhlIHJldHVybiB0eXBlIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAgKi8KLQotICBzID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgaWYgKCEgZG9tYWluKQotICAgICpzID0gJ1wwJzsKLSAgZWxzZQotICAgIHN0cmNweSAocywgZG9tYWluX3R5cGUpOwotICBzdHJjYXQgKHMsICI6OnwgKCIpOwotCi0gIGlmIChhcmdjb3VudCA8IDApCi0gICAgc3RyY2F0IChzLCAiLyogdW5rbm93biAqLyIpOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotCXsKLQkgIGlmIChpID4gMCkKLQkgICAgc3RyY2F0IChzLCAiLCAiKTsKLQkgIHN0cmNhdCAocywgYXJnX3R5cGVzW2ldKTsKLQl9Ci0gICAgICBpZiAodmFyYXJncykKLQl7Ci0JICBpZiAoaSA+IDApCi0JICAgIHN0cmNhdCAocywgIiwgIik7Ci0JICBzdHJjYXQgKHMsICIuLi4iKTsKLQl9Ci0gICAgICBpZiAoYXJnY291bnQgPiAwKQotCWZyZWUgKGFyZ190eXBlcyk7Ci0gICAgfQotCi0gIHN0cmNhdCAocywgIikiKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIHMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogTWFrZSBhIGNvbnN0IHF1YWxpZmllZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NvbnN0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3Vic3RpdHV0ZV90eXBlIChpbmZvLCAiY29uc3QgfCIpOwotfQotCi0vKiBNYWtlIGEgdm9sYXRpbGUgcXVhbGlmaWVkIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdm9sYXRpbGVfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICJ2b2xhdGlsZSB8Iik7Ci19Ci0KLS8qIFN0YXJ0IGFjY3VtdWxhdGluZyBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGJvb2xlYW4gc3RydWN0cDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZm8tPmluZGVudCArPSAyOwotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgc3RydWN0cCA/ICJzdHJ1Y3QgIiA6ICJ1bmlvbiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdGFnKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciBpZGJ1ZlsyMF07Ci0KLSAgICAgIHNwcmludGYgKGlkYnVmLCAiJSVhbm9uJXUiLCBpZCk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgaWRidWYpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgeyIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHNpemUgIT0gMCB8fCB0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyIGFiWzMwXTsKLQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyoiKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzaXplICE9IDApCi0JewotCSAgc3ByaW50ZiAoYWIsICIgc2l6ZSAldSIsIHNpemUpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGlmICh0YWcgIT0gTlVMTCkKLQl7Ci0JICBzcHJpbnRmIChhYiwgIiBpZCAldSIsIGlkKTsKLQkgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBhYikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiXG4iKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQotICByZXR1cm4gaW5kZW50X3R5cGUgKGluZm8pOwotfQotCi0vKiBPdXRwdXQgdGhlIHZpc2liaWxpdHkgb2YgYSBmaWVsZCBpbiBhIHN0cnVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkKLSAgICAgc3RydWN0IHByX2hhbmRsZSAqaW5mbzsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIGNoYXIgKnQ7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLQotICBpZiAoaW5mby0+c3RhY2stPnZpc2liaWxpdHkgPT0gdmlzaWJpbGl0eSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBhc3NlcnQgKGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ICE9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFKTsKLQotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICBzID0gInB1YmxpYyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURToKLSAgICAgIHMgPSAicHJpdmF0ZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgcyA9ICJwcm90ZWN0ZWQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX0lHTk9SRToKLSAgICAgIHMgPSAiLyogaWdub3JlICovIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVHJpbSBvZmYgYSB0cmFpbGluZyBzcGFjZSBpbiB0aGUgc3RydWN0IHN0cmluZywgdG8gbWFrZSB0aGUKLSAgICAgb3V0cHV0IGxvb2sgYSBiaXQgYmV0dGVyLCB0aGVuIHN0aWNrIG9uIHRoZSB2aXNpYmlsaXR5IHN0cmluZy4gICovCi0KLSAgdCA9IGluZm8tPnN0YWNrLT50eXBlOwotICBsZW4gPSBzdHJsZW4gKHQpOwotICBhc3NlcnQgKHRbbGVuIC0gMV0gPT0gJyAnKTsKLSAgdFtsZW4gLSAxXSA9ICdcMCc7Ci0KLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIHMpCi0gICAgICB8fCAhIGFwcGVuZF90eXBlIChpbmZvLCAiOlxuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmZvLT5zdGFjay0+dmlzaWJpbGl0eSA9IHZpc2liaWxpdHk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIGZpZWxkIHRvIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RydWN0X2ZpZWxkIChwLCBuYW1lLCBiaXRwb3MsIGJpdHNpemUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgYmZkX3ZtYSBiaXRzaXplOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotICBjaGFyICp0OwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAiOyAvKiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJpdHNpemUgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF92bWEgKGJpdHNpemUsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgImJpdHNpemUgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiwgIikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBwcmludF92bWEgKGJpdHBvcywgYWIsIHRydWUsIGZhbHNlKTsKLSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJiaXRwb3MgIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqL1xuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgdCk7Ci19Ci0KLS8qIEZpbmlzaCBhIHN0cnVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9zdHJ1Y3RfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICpzOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+aW5kZW50ID49IDIpOwotCi0gIGluZm8tPmluZGVudCAtPSAyOwotCi0gIC8qIENoYW5nZSB0aGUgdHJhaWxpbmcgaW5kZW50YXRpb24gdG8gaGF2ZSBhIGNsb3NlIGJyYWNlLiAgKi8KLSAgcyA9IGluZm8tPnN0YWNrLT50eXBlICsgc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgLSAyOwotICBhc3NlcnQgKHNbMF0gPT0gJyAnICYmIHNbMV0gPT0gJyAnICYmIHNbMl0gPT0gJ1wwJyk7Ci0KLSAgKnMrKyA9ICd9JzsKLSAgKnMgPSAnXDAnOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCBhIGNsYXNzIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfY2xhc3NfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSwgdnB0ciwgb3dudnB0cikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHZwdHI7Ci0gICAgIGJvb2xlYW4gb3dudnB0cjsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnR2ID0gTlVMTDsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICBpZiAodnB0ciAmJiAhIG93bnZwdHIpCi0gICAgewotICAgICAgdHYgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBpZiAodHYgPT0gTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgc3RydWN0cCA/ICJjbGFzcyAiIDogInVuaW9uIGNsYXNzICIpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHRhZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGlkYnVmWzIwXTsKLQotICAgICAgc3ByaW50ZiAoaWRidWYsICIlJWFub24ldSIsIGlkKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBpZGJ1ZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB7IikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoc2l6ZSAhPSAwIHx8IHZwdHIgfHwgb3dudnB0ciB8fCB0YWcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiIpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKHNpemUgIT0gMCkKLQl7Ci0JICBjaGFyIGFiWzIwXTsKLQotCSAgc3ByaW50ZiAoYWIsICIldSIsIHNpemUpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgc2l6ZSAiKQotCSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKHZwdHIpCi0JewotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgdnRhYmxlICIpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAob3dudnB0cikKLQkgICAgewotCSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCAic2VsZiAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgdHYpCi0JCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAodGFnICE9IE5VTEwpCi0JewotCSAgY2hhciBhYlszMF07Ci0KLQkgIHNwcmludGYgKGFiLCAiIGlkICV1IiwgaWQpOwotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgKi8iKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8tPnN0YWNrLT52aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCi0gIHJldHVybiAoYXBwZW5kX3R5cGUgKGluZm8sICJcbiIpCi0JICAmJiBpbmRlbnRfdHlwZSAoaW5mbykpOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgbWVtYmVyIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhdGljX21lbWJlciAocCwgbmFtZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHByZXBlbmRfdHlwZSAoaW5mbywgInN0YXRpYyAiKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIjsgLyogIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqL1xuIikKLSAgICAgIHx8ICEgaW5kZW50X3R5cGUgKGluZm8pKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBhcHBlbmRfdHlwZSAoaW5mbywgdCk7Ci19Ci0KLS8qIEFkZCBhIGJhc2UgY2xhc3MgdG8gYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl9jbGFzc19iYXNlY2xhc3MgKHAsIGJpdHBvcywgdmlydHVhbCwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBib29sZWFuIHZpcnR1YWw7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLSAgY29uc3QgY2hhciAqcHJlZml4OwotICBjaGFyIGFiWzIwXTsKLSAgY2hhciAqcywgKmwsICpuOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCAmJiBpbmZvLT5zdGFjay0+bmV4dCAhPSBOVUxMKTsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sICIiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN0cm5jbXAgKHQsICJjbGFzcyAiLCBzaXplb2YgImNsYXNzICIgLSAxKSA9PSAwKQotICAgIHQgKz0gc2l6ZW9mICJjbGFzcyAiIC0gMTsKLQotICAvKiBQdXNoIGl0IGJhY2sgb24gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIHByZXBlbmRfdHlwZSBhbmQKLSAgICAgYXBwZW5kX3R5cGUgcm91dGluZXMuICAqLwotICBpZiAoISBwdXNoX3R5cGUgKGluZm8sIHQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmlydHVhbCkKLSAgICB7Ci0gICAgICBpZiAoISBwcmVwZW5kX3R5cGUgKGluZm8sICJ2aXJ0dWFsICIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgcHJlZml4ID0gInB1YmxpYyAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHByZWZpeCA9ICJwcm90ZWN0ZWQgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgcHJlZml4ID0gInByaXZhdGUgIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmVmaXggPSAiLyogdW5rbm93biB2aXNpYmlsaXR5ICovICI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCBwcmVmaXgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYml0cG9zICE9IDApCi0gICAgewotICAgICAgcHJpbnRfdm1hIChiaXRwb3MsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiBiaXRwb3MgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKQotCSAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAqLyIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogTm93IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGlzIHNvbWV0aGluZyBsaWtlICJwdWJsaWMgQSAvICogYml0cG9zCi0gICAgIDEwICogLyIuICBUaGUgbmV4dCBlbGVtZW50IG9uIHRoZSBzdGFjayBpcyBzb21ldGhpbmcgbGlrZSAiY2xhc3MKLSAgICAgeHggeyAvICogc2l6ZSA4ICogL1xuLi4uIi4gIFdlIHdhbnQgdG8gc3Vic3RpdHV0ZSB0aGUgdG9wIG9mIHRoZQotICAgICBzdGFjayBpbiBiZWZvcmUgdGhlIHsuICAqLwotICBzID0gc3RyY2hyIChpbmZvLT5zdGFjay0+bmV4dC0+dHlwZSwgJ3snKTsKLSAgYXNzZXJ0IChzICE9IE5VTEwpOwotICAtLXM7Ci0KLSAgLyogSWYgdGhlcmUgaXMgYWxyZWFkeSBhICc6JywgdGhlbiB3ZSBhbHJlYWR5IGhhdmUgYSBiYXNlY2xhc3MsIGFuZAotICAgICB3ZSBtdXN0IGFwcGVuZCB0aGlzIG9uZSBhZnRlciBhIGNvbW1hLiAgKi8KLSAgZm9yIChsID0gaW5mby0+c3RhY2stPm5leHQtPnR5cGU7IGwgIT0gczsgbCsrKQotICAgIGlmICgqbCA9PSAnOicpCi0gICAgICBicmVhazsKLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCBsID09IHMgPyAiIDogIiA6ICIsICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT5zdGFjay0+dHlwZSkgKyBzdHJsZW4gKHQpICsgMSk7Ci0gIG1lbWNweSAobiwgaW5mby0+c3RhY2stPnR5cGUsIHMgLSBpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIHN0cmNweSAobiArIChzIC0gaW5mby0+c3RhY2stPnR5cGUpLCB0KTsKLSAgc3RyY2F0IChuLCBzKTsKLQotICBmcmVlIChpbmZvLT5zdGFjay0+dHlwZSk7Ci0gIGluZm8tPnN0YWNrLT50eXBlID0gbjsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgYWRkaW5nIGEgbWV0aG9kIHRvIGEgY2xhc3MuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhcnRfbWV0aG9kIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgaW5mby0+c3RhY2stPm1ldGhvZCA9IG5hbWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSB2YXJpYW50IHRvIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXAsIHZvZmZzZXQsCi0JCQkgY29udGV4dCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotICAgICBiZmRfdm1hIHZvZmZzZXQ7Ci0gICAgIGJvb2xlYW4gY29udGV4dDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKm1ldGhvZF90eXBlOwotICBjaGFyICpjb250ZXh0X3R5cGU7Ci0KLSAgYXNzZXJ0IChpbmZvLT5zdGFjayAhPSBOVUxMKTsKLSAgYXNzZXJ0IChpbmZvLT5zdGFjay0+bmV4dCAhPSBOVUxMKTsKLQotICAvKiBQdXQgdGhlIGNvbnN0IGFuZCB2b2xhdGlsZSBxdWFsaWZpZXJzIG9uIHRoZSB0eXBlLiAgKi8KLSAgaWYgKHZvbGF0aWxlcCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB2b2xhdGlsZSIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb25zdHApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgY29uc3QiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFN0aWNrIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgaW50byBpdHMgdHlwZS4gICovCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywKLQkJCSAoY29udGV4dAotCQkJICA/IGluZm8tPnN0YWNrLT5uZXh0LT5uZXh0LT5tZXRob2QKLQkJCSAgOiBpbmZvLT5zdGFjay0+bmV4dC0+bWV0aG9kKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIEdldCB0aGUgdHlwZS4gICovCi0gIG1ldGhvZF90eXBlID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAobWV0aG9kX3R5cGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogUHVsbCBvZmYgdGhlIGNvbnRleHQgdHlwZSBpZiB0aGVyZSBpcyBvbmUuICAqLwotICBpZiAoISBjb250ZXh0KQotICAgIGNvbnRleHRfdHlwZSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb250ZXh0X3R5cGUgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gICAgICBpZiAoY29udGV4dF90eXBlID09IE5VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBOb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgaXMgdGhlIGNsYXNzLiAgKi8KLQotICBpZiAoISBwcl9maXhfdmlzaWJpbGl0eSAoaW5mbywgdmlzaWJpbGl0eSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBtZXRob2RfdHlwZSkKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgLyogIikKLSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgIiAiKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChjb250ZXh0IHx8IHZvZmZzZXQgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyIGFiWzIwXTsKLQotICAgICAgaWYgKGNvbnRleHQpCi0JewotCSAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICJjb250ZXh0ICIpCi0JICAgICAgfHwgISBhcHBlbmRfdHlwZSAoaW5mbywgY29udGV4dF90eXBlKQotCSAgICAgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sICIgIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBwcmludF92bWEgKHZvZmZzZXQsIGFiLCB0cnVlLCBmYWxzZSk7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgInZvZmZzZXQgIikKLQkgIHx8ICEgYXBwZW5kX3R5cGUgKGluZm8sIGFiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiAoYXBwZW5kX3R5cGUgKGluZm8sICIgKi87XG4iKQotCSAgJiYgaW5kZW50X3R5cGUgKGluZm8pKTsKLX0KLQotLyogQWRkIGEgc3RhdGljIHZhcmlhbnQgdG8gYSBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50IChwLCBwaHlzbmFtZSwgdmlzaWJpbGl0eSwgY29uc3RwLCB2b2xhdGlsZXApCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKm1ldGhvZF90eXBlOwotCi0gIGFzc2VydCAoaW5mby0+c3RhY2sgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+c3RhY2stPm5leHQgIT0gTlVMTCk7Ci0gIGFzc2VydCAoaW5mby0+c3RhY2stPm5leHQtPm1ldGhvZCAhPSBOVUxMKTsKLQotICAvKiBQdXQgdGhlIGNvbnN0IGFuZCB2b2xhdGlsZSBxdWFsaWZpZXJzIG9uIHRoZSB0eXBlLiAgKi8KLSAgaWYgKHZvbGF0aWxlcCkKLSAgICB7Ci0gICAgICBpZiAoISBhcHBlbmRfdHlwZSAoaW5mbywgIiB2b2xhdGlsZSIpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmIChjb25zdHApCi0gICAgewotICAgICAgaWYgKCEgYXBwZW5kX3R5cGUgKGluZm8sICIgY29uc3QiKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIE1hcmsgaXQgYXMgc3RhdGljLiAgKi8KLSAgaWYgKCEgcHJlcGVuZF90eXBlIChpbmZvLCAic3RhdGljICIpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBTdGljayB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGludG8gaXRzIHR5cGUuICAqLwotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIGluZm8tPnN0YWNrLT5uZXh0LT5tZXRob2QpKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBHZXQgdGhlIHR5cGUuICAqLwotICBtZXRob2RfdHlwZSA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKG1ldGhvZF90eXBlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE5vdyB0aGUgdG9wIG9mIHRoZSBzdGFjayBpcyB0aGUgY2xhc3MuICAqLwotCi0gIGlmICghIHByX2ZpeF92aXNpYmlsaXR5IChpbmZvLCB2aXNpYmlsaXR5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChhcHBlbmRfdHlwZSAoaW5mbywgbWV0aG9kX3R5cGUpCi0JICAmJiBhcHBlbmRfdHlwZSAoaW5mbywgIiAvKiAiKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sIHBoeXNuYW1lKQotCSAgJiYgYXBwZW5kX3R5cGUgKGluZm8sICIgKi87XG4iKQotCSAgJiYgaW5kZW50X3R5cGUgKGluZm8pKTsKLX0KLQotLyogRmluaXNoIHVwIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2NsYXNzX2VuZF9tZXRob2QgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICBpbmZvLT5zdGFjay0+bWV0aG9kID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2VuZF9jbGFzc190eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgcmV0dXJuIHByX2VuZF9zdHJ1Y3RfdHlwZSAocCk7Ci19Ci0KLS8qIFB1c2ggYSB0eXBlIG9uIHRoZSBzdGFjayB1c2luZyBhIHR5cGVkZWYgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBlZGVmX3R5cGUgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gcHVzaF90eXBlIChpbmZvLCBuYW1lKTsKLX0KLQotLyogUHVzaCBhIHR5cGUgb24gdGhlIHN0YWNrIHVzaW5nIGEgdGFnIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfdGFnX3R5cGUgKHAsIG5hbWUsIGlkLCBraW5kKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY29uc3QgY2hhciAqdCwgKnRhZzsKLSAgY2hhciBpZGJ1ZlsyMF07Ci0KLSAgc3dpdGNoIChraW5kKQotICAgIHsKLSAgICBjYXNlIERFQlVHX0tJTkRfU1RSVUNUOgotICAgICAgdCA9ICJzdHJ1Y3QgIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9VTklPTjoKLSAgICAgIHQgPSAidW5pb24gIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfS0lORF9FTlVNOgotICAgICAgdCA9ICJlbnVtICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfQ0xBU1M6Ci0gICAgICB0ID0gImNsYXNzICI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0tJTkRfVU5JT05fQ0xBU1M6Ci0gICAgICB0ID0gInVuaW9uIGNsYXNzICI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICghIHB1c2hfdHlwZSAoaW5mbywgdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHRhZyA9IG5hbWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiUlYW5vbiV1IiwgaWQpOwotICAgICAgdGFnID0gaWRidWY7Ci0gICAgfQotCi0gIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCB0YWcpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG5hbWUgIT0gTlVMTCAmJiBraW5kICE9IERFQlVHX0tJTkRfRU5VTSkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChpZGJ1ZiwgIiAvKiBpZCAldSAqLyIsIGlkKTsKLSAgICAgIGlmICghIGFwcGVuZF90eXBlIChpbmZvLCBpZGJ1ZikpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgdHlwZWRlZi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBkZWYgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqczsKLQotICBpZiAoISBzdWJzdGl0dXRlX3R5cGUgKGluZm8sIG5hbWUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAocyA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAidHlwZWRlZiAlcztcbiIsIHMpOwotCi0gIGZyZWUgKHMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0YWcuICBUaGUgdGFnIHNob3VsZCBhbHJlYWR5IGJlIGluIHRoZSBzdHJpbmcgb24gdGhlCi0gICBzdGFjaywgc28gYWxsIHdlIGhhdmUgdG8gZG8gaGVyZSBpcyBwcmludCBpdCBvdXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1wcl90YWcgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciAqdDsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXM7XG4iLCB0KTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGFuIGludGVnZXIgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfaW50X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHByaW50X3ZtYSAodmFsLCBhYiwgZmFsc2UsIGZhbHNlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgImNvbnN0IGludCAlcyA9ICVzO1xuIiwgbmFtZSwgYWIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZmxvYXRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGRvdWJsZSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCBkb3VibGUgJXMgPSAlZztcbiIsIG5hbWUsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB0eXBlZCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl90eXBlZF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICB0ID0gcG9wX3R5cGUgKGluZm8pOwotICBpZiAodCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKHZhbCwgYWIsIGZhbHNlLCBmYWxzZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJjb25zdCAlcyAlcyA9ICVzO1xuIiwgdCwgbmFtZSwgYWIpOwotCi0gIGZyZWUgKHQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wcl92YXJpYWJsZSAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192YXJfa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgYWJbMjBdOwotCi0gIGlmICghIHN1YnN0aXR1dGVfdHlwZSAoaW5mbywgbmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHQgPSBwb3BfdHlwZSAoaW5mbyk7Ci0gIGlmICh0ID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZGVudCAoaW5mbyk7Ci0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgY2FzZSBERUJVR19TVEFUSUM6Ci0gICAgY2FzZSBERUJVR19MT0NBTF9TVEFUSUM6Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAic3RhdGljICIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19SRUdJU1RFUjoKLSAgICAgIGZwcmludGYgKGluZm8tPmYsICJyZWdpc3RlciAiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHByaW50X3ZtYSAodmFsLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICIlcyAvKiAlcyAqLztcbiIsIHQsIGFiKTsKLQotICBmcmVlICh0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBhIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX3N0YXJ0X2Z1bmN0aW9uIChwLCBuYW1lLCBnbG9iYWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGdsb2JhbDsKLXsKLSAgc3RydWN0IHByX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3QgcHJfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnQ7Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgaWYgKCEgZ2xvYmFsKQotICAgIGZwcmludGYgKGluZm8tPmYsICJzdGF0aWMgIik7Ci0gIGZwcmludGYgKGluZm8tPmYsICIlcyAoIiwgdCk7Ci0KLSAgaW5mby0+cGFyYW1ldGVyID0gMTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2Z1bmN0aW9uX3BhcmFtZXRlciAocCwgbmFtZSwga2luZCwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgZW51bSBkZWJ1Z19wYXJtX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyICp0OwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoa2luZCA9PSBERUJVR19QQVJNX1JFRkVSRU5DRQotICAgICAgfHwga2luZCA9PSBERUJVR19QQVJNX1JFRl9SRUcpCi0gICAgewotICAgICAgaWYgKCEgcHJfcmVmZXJlbmNlX3R5cGUgKHApKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKCEgc3Vic3RpdHV0ZV90eXBlIChpbmZvLCBuYW1lKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdCA9IHBvcF90eXBlIChpbmZvKTsKLSAgaWYgKHQgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGluZm8tPnBhcmFtZXRlciAhPSAxKQotICAgIGZwcmludGYgKGluZm8tPmYsICIsICIpOwotCi0gIGlmIChraW5kID09IERFQlVHX1BBUk1fUkVHIHx8IGtpbmQgPT0gREVCVUdfUEFSTV9SRUZfUkVHKQotICAgIGZwcmludGYgKGluZm8tPmYsICJyZWdpc3RlciAiKTsKLQotICBwcmludF92bWEgKHZhbCwgYWIsIHRydWUsIHRydWUpOwotICBmcHJpbnRmIChpbmZvLT5mLCAiJXMgLyogJXMgKi8iLCB0LCBhYik7Ci0KLSAgZnJlZSAodCk7Ci0KLSAgKytpbmZvLT5wYXJhbWV0ZXI7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfc3RhcnRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBwcl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHByX2hhbmRsZSAqKSBwOwotICBjaGFyIGFiWzIwXTsKLQotICBpZiAoaW5mby0+cGFyYW1ldGVyID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChpbmZvLT5mLCAiKVxuIik7Ci0gICAgICBpbmZvLT5wYXJhbWV0ZXIgPSAwOwotICAgIH0KLQotICBpbmRlbnQgKGluZm8pOwotICBwcmludF92bWEgKGFkZHIsIGFiLCB0cnVlLCB0cnVlKTsKLSAgZnByaW50ZiAoaW5mby0+ZiwgInsgLyogJXMgKi9cbiIsIGFiKTsKLQotICBpbmZvLT5pbmRlbnQgKz0gMjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogV3JpdGUgb3V0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXByX2xpbmVubyAocCwgZmlsZW5hbWUsIGxpbmVubywgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICB1bnNpZ25lZCBsb25nIGxpbmVubzsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICIvKiBmaWxlICVzIGxpbmUgJWx1IGFkZHIgJXMgKi9cbiIsIGZpbGVuYW1lLCBsaW5lbm8sIGFiKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHdyaXRpbmcgb3V0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2Jsb2NrIChwLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgYmZkX3ZtYSBhZGRyOwotewotICBzdHJ1Y3QgcHJfaGFuZGxlICppbmZvID0gKHN0cnVjdCBwcl9oYW5kbGUgKikgcDsKLSAgY2hhciBhYlsyMF07Ci0KLSAgaW5mby0+aW5kZW50IC09IDI7Ci0KLSAgaW5kZW50IChpbmZvKTsKLSAgcHJpbnRfdm1hIChhZGRyLCBhYiwgdHJ1ZSwgdHJ1ZSk7Ci0gIGZwcmludGYgKGluZm8tPmYsICJ9IC8qICVzICovXG4iLCBhYik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB3cml0aW5nIG91dCBhIGZ1bmN0aW9uLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcHJfZW5kX2Z1bmN0aW9uIChwKQotICAgICBQVFIgcDsKLXsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuMSBiL2JpbnV0aWxzL3JhbmxpYi4xCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZiNWM4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JhbmxpYi4xCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHJhbmxpYiAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1yYW5saWIgXC0gZ2VuZXJhdGUgaW5kZXggdG8gYXJjaGl2ZS4KLQotLlNIIFNZTk9QU0lTCi0uaHkgMAotLm5hCi0uQiByYW5saWIgXGMKLS5SQiAiW1x8IiBcLXYgfCBcLVYgIlx8XSIKLS5JIGFyY2hpdmVcYwotXCYKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi0uQiByYW5saWIKLWdlbmVyYXRlcyBhbiBpbmRleCB0byB0aGUgY29udGVudHMgb2YgYW4gYXJjaGl2ZSwgYW5kCi1zdG9yZXMgaXQgaW4gdGhlIGFyY2hpdmUuICBUaGUgaW5kZXggbGlzdHMgZWFjaCBzeW1ib2wgZGVmaW5lZCBieSBhCi1tZW1iZXIgb2YgYW4gYXJjaGl2ZSB0aGF0IGlzIGEgcmVsb2NhdGFibGUgb2JqZWN0IGZpbGUuICAKLS5QUAotWW91IG1heSB1c2UKLS5SQiBgICJubSBcLXMiICcKLW9yCi0uUkIgYCAibm0gXC1cLXByaW50LWFybWFwIiAnCi10byBsaXN0IHRoaXMgaW5kZXguCi0uUFAKLUFuIGFyY2hpdmUgd2l0aCBzdWNoIGFuIGluZGV4IHNwZWVkcyB1cCBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBhbmQKLWFsbG93cyByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSB0byBjYWxsIGVhY2ggb3RoZXIgd2l0aG91dCByZWdhcmQgdG8KLXRoZWlyIHBsYWNlbWVudCBpbiB0aGUgYXJjaGl2ZS4KLS5QUAotVGhlIEdOVQotLkIgcmFubGliCi1wcm9ncmFtIGlzIGFub3RoZXIgZm9ybSBvZiBHTlUKLS5CUiBhciA7Ci1ydW5uaW5nCi0uQiByYW5saWIKLWlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0byBleGVjdXRpbmcKLS5SQiBgICJhciBcLXMiICcuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CIFwtdgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mCi0uQiByYW5saWIKLWFuZCBleGl0LgotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsgCi0uQlIgYXIgIigiIDEgIiksIgotLkJSIG5tICIoIiAxICIpLiIKLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9yYW5saWIuc2ggYi9iaW51dGlscy9yYW5saWIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiNmZiYzQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmFubGliLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgQSBzaW1wbGUgcmFubGliIHNjcmlwdCwgdG8gdXNlIGxlc3MgZGlzayBzcGFjZSB0aGFuIGEgcmFubGliIHByb2dyYW0uCi1hciBzICQxCmRpZmYgLS1naXQgYS9iaW51dGlscy9yY2xleC5sIGIvYmludXRpbHMvcmNsZXgubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiNDc5Yi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yY2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLSV7IC8qIHJjbGV4LmwgLS0gbGV4ZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMgcGFyc2VyICAqLwotLyogQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGlzIGEgbGV4IGlucHV0IGZpbGUgd2hpY2ggZ2VuZXJhdGVzIGEgbGV4ZXIgdXNlZCBieSB0aGUKLSAgIFdpbmRvd3MgcmMgZmlsZSBwYXJzZXIuICBJdCBiYXNpY2FsbHkganVzdCByZWNvZ25pemVkIGEgYnVuY2ggb2YKLSAgIGtleXdvcmRzLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIndpbmRyZXMuaCIKLSNpbmNsdWRlICJyY3BhcnNlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGFzc2VydC5oPgotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiByY2RhdGEgbW9kZSwgaW4gd2hpY2ggd2UgcmV0dXJucyB0aGUgbGVuZ3RocyBvZgotICAgc3RyaW5ncy4gICovCi0KLXN0YXRpYyBpbnQgcmNkYXRhX21vZGU7Ci0KLS8qIFdoZXRoZXIgd2UgYXJlIHN1cHJlc3NpbmcgbGluZXMgZnJvbSBjcHAgKGluY2x1ZGluZyB3aW5kb3dzLmggb3IKLSAgIGhlYWRlcnMgZnJvbSB5b3VyIEMgc291cmNlcyBtYXkgYnJpbmcgaW4gZXh0ZXJucyBhbmQgdHlwZWRlZnMpLgotICAgV2hlbiBhY3RpdmUsIHdlIHJldHVybiBJR05PUkVEX1RPS0VOLCB3aGljaCBsZXRzIHVzIGlnbm9yZSB0aGVzZQotICAgb3V0c2lkZSBvZiByZXNvdXJjZSBjb25zdHJ1Y3RzLiAgVGh1cywgaXQgaXNuJ3QgcmVxdWlyZWQgdG8gcHJvdGVjdAotICAgYWxsIHRoZSBub24tcHJlcHJvY2Vzc29yIGxpbmVzIGluIHlvdXIgaGVhZGVyIGZpbGVzIHdpdGggI2lmZGVmCi0gICBSQ19JTlZPS0VELiAgSXQgYWxzbyBtZWFucyB5b3VyIFJDIGZpbGUgY2FuJ3QgaW5jbHVkZSBvdGhlciBSQwotICAgZmlsZXMgaWYgdGhleSdyZSBuYW1lZCAiKi5oIi4gIFNvcnJ5LiAgTmFtZSB0aGVtICoucmNoIG9yIHdoYXRldmVyLiAgKi8KLQotc3RhdGljIGludCBzdXBwcmVzc19jcHBfZGF0YTsKLQotI2RlZmluZSBNQVlCRV9SRVRVUk4oeCkgcmV0dXJuIHN1cHByZXNzX2NwcF9kYXRhID8gSUdOT1JFRF9UT0tFTiA6ICh4KQotCi0vKiBUaGUgZmlyc3QgZmlsZW5hbWUgd2UgZGV0ZWN0IGluIHRoZSBjcHAgb3V0cHV0LiAgV2UgdXNlIHRoaXMgdG8KLSAgIHRlbGwgaW5jbHVkZWQgZmlsZXMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICppbml0aWFsX2ZuOwotCi0vKiBMaXN0IG9mIGFsbG9jYXRlZCBzdHJpbmdzLiAgKi8KLQotc3RydWN0IGFsbG9jX3N0cmluZwotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICpuZXh0OwotICBjaGFyICpzOwotfTsKLQotc3RhdGljIHN0cnVjdCBhbGxvY19zdHJpbmcgKnN0cmluZ3M7Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGNwcF9saW5lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGNoYXIgKmhhbmRsZV9xdW90ZXMgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBjaGFyICpnZXRfc3RyaW5nIFBBUkFNUyAoKGludCkpOwotCi0lfQotCi0lJQotCi0iQkVHSU4iCQkJeyBNQVlCRV9SRVRVUk4gKEJFRyk7IH0KLSJ7IgkJCXsgTUFZQkVfUkVUVVJOIChCRUcpOyB9Ci0iRU5EIgkJCXsgTUFZQkVfUkVUVVJOIChFTkQpOyB9Ci0ifSIJCQl7IE1BWUJFX1JFVFVSTiAoRU5EKTsgfQotIkFDQ0VMRVJBVE9SUyIJCXsgTUFZQkVfUkVUVVJOIChBQ0NFTEVSQVRPUlMpOyB9Ci0iVklSVEtFWSIJCXsgTUFZQkVfUkVUVVJOIChWSVJUS0VZKTsgfQotIkFTQ0lJIgkJCXsgTUFZQkVfUkVUVVJOIChBU0NJSSk7IH0KLSJOT0lOVkVSVCIJCXsgTUFZQkVfUkVUVVJOIChOT0lOVkVSVCk7IH0KLSJTSElGVCIJCQl7IE1BWUJFX1JFVFVSTiAoU0hJRlQpOyB9Ci0iQ09OVFJPTCIJCXsgTUFZQkVfUkVUVVJOIChDT05UUk9MKTsgfQotIkFMVCIJCQl7IE1BWUJFX1JFVFVSTiAoQUxUKTsgfQotIkJJVE1BUCIJCXsgTUFZQkVfUkVUVVJOIChCSVRNQVApOyB9Ci0iQ1VSU09SIgkJeyBNQVlCRV9SRVRVUk4gKENVUlNPUik7IH0KLSJESUFMT0ciCQl7IE1BWUJFX1JFVFVSTiAoRElBTE9HKTsgfQotIkRJQUxPR0VYIgkJeyBNQVlCRV9SRVRVUk4gKERJQUxPR0VYKTsgfQotIkVYU1RZTEUiCQl7IE1BWUJFX1JFVFVSTiAoRVhTVFlMRSk7IH0KLSJDQVBUSU9OIgkJeyBNQVlCRV9SRVRVUk4gKENBUFRJT04pOyB9Ci0iQ0xBU1MiCQkJeyBNQVlCRV9SRVRVUk4gKENMQVNTKTsgfQotIlNUWUxFIgkJCXsgTUFZQkVfUkVUVVJOIChTVFlMRSk7IH0KLSJBVVRPM1NUQVRFIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE8zU1RBVEUpOyB9Ci0iQVVUT0NIRUNLQk9YIgkJeyBNQVlCRV9SRVRVUk4gKEFVVE9DSEVDS0JPWCk7IH0KLSJBVVRPUkFESU9CVVRUT04iCXsgTUFZQkVfUkVUVVJOIChBVVRPUkFESU9CVVRUT04pOyB9Ci0iQ0hFQ0tCT1giCQl7IE1BWUJFX1JFVFVSTiAoQ0hFQ0tCT1gpOyB9Ci0iQ09NQk9CT1giCQl7IE1BWUJFX1JFVFVSTiAoQ09NQk9CT1gpOyB9Ci0iQ1RFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKENURVhUKTsgfQotIkRFRlBVU0hCVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoREVGUFVTSEJVVFRPTik7IH0KLSJFRElUVEVYVCIJCXsgTUFZQkVfUkVUVVJOIChFRElUVEVYVCk7IH0KLSJHUk9VUEJPWCIJCXsgTUFZQkVfUkVUVVJOIChHUk9VUEJPWCk7IH0KLSJMSVNUQk9YIgkJeyBNQVlCRV9SRVRVUk4gKExJU1RCT1gpOyB9Ci0iTFRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKExURVhUKTsgfQotIlBVU0hCT1giCQl7IE1BWUJFX1JFVFVSTiAoUFVTSEJPWCk7IH0KLSJQVVNIQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFBVU0hCVVRUT04pOyB9Ci0iUkFESU9CVVRUT04iCQl7IE1BWUJFX1JFVFVSTiAoUkFESU9CVVRUT04pOyB9Ci0iUlRFWFQiCQkJeyBNQVlCRV9SRVRVUk4gKFJURVhUKTsgfQotIlNDUk9MTEJBUiIJCXsgTUFZQkVfUkVUVVJOIChTQ1JPTExCQVIpOyB9Ci0iU1RBVEUzIgkJeyBNQVlCRV9SRVRVUk4gKFNUQVRFMyk7IH0KLSJVU0VSQlVUVE9OIgkJeyBNQVlCRV9SRVRVUk4gKFVTRVJCVVRUT04pOyB9Ci0iQkVESVQiCQkJeyBNQVlCRV9SRVRVUk4gKEJFRElUKTsgfQotIkhFRElUIgkJCXsgTUFZQkVfUkVUVVJOIChIRURJVCk7IH0KLSJJRURJVCIJCQl7IE1BWUJFX1JFVFVSTiAoSUVESVQpOyB9Ci0iRk9OVCIJCQl7IE1BWUJFX1JFVFVSTiAoRk9OVCk7IH0KLSJJQ09OIgkJCXsgTUFZQkVfUkVUVVJOIChJQ09OKTsgfQotIkxBTkdVQUdFIgkJeyBNQVlCRV9SRVRVUk4gKExBTkdVQUdFKTsgfQotIkNIQVJBQ1RFUklTVElDUyIJeyBNQVlCRV9SRVRVUk4gKENIQVJBQ1RFUklTVElDUyk7IH0KLSJWRVJTSU9OIgkJeyBNQVlCRV9SRVRVUk4gKFZFUlNJT05LKTsgfQotIk1FTlUiCQkJeyBNQVlCRV9SRVRVUk4gKE1FTlUpOyB9Ci0iTUVOVUVYIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVFWCk7IH0KLSJNRU5VSVRFTSIJCXsgTUFZQkVfUkVUVVJOIChNRU5VSVRFTSk7IH0KLSJTRVBBUkFUT1IiCQl7IE1BWUJFX1JFVFVSTiAoU0VQQVJBVE9SKTsgfQotIlBPUFVQIgkJCXsgTUFZQkVfUkVUVVJOIChQT1BVUCk7IH0KLSJDSEVDS0VEIgkJeyBNQVlCRV9SRVRVUk4gKENIRUNLRUQpOyB9Ci0iR1JBWUVEIgkJeyBNQVlCRV9SRVRVUk4gKEdSQVlFRCk7IH0KLSJIRUxQIgkJCXsgTUFZQkVfUkVUVVJOIChIRUxQKTsgfQotIklOQUNUSVZFIgkJeyBNQVlCRV9SRVRVUk4gKElOQUNUSVZFKTsgfQotIk1FTlVCQVJCUkVBSyIJCXsgTUFZQkVfUkVUVVJOIChNRU5VQkFSQlJFQUspOyB9Ci0iTUVOVUJSRUFLIgkJeyBNQVlCRV9SRVRVUk4gKE1FTlVCUkVBSyk7IH0KLSJNRVNTQUdFVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoTUVTU0FHRVRBQkxFKTsgfQotIlJDREFUQSIJCXsgTUFZQkVfUkVUVVJOIChSQ0RBVEEpOyB9Ci0iU1RSSU5HVEFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoU1RSSU5HVEFCTEUpOyB9Ci0iVkVSU0lPTklORk8iCQl7IE1BWUJFX1JFVFVSTiAoVkVSU0lPTklORk8pOyB9Ci0iRklMRVZFUlNJT04iCQl7IE1BWUJFX1JFVFVSTiAoRklMRVZFUlNJT04pOyB9Ci0iUFJPRFVDVFZFUlNJT04iCXsgTUFZQkVfUkVUVVJOIChQUk9EVUNUVkVSU0lPTik7IH0KLSJGSUxFRkxBR1NNQVNLIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHU01BU0spOyB9Ci0iRklMRUZMQUdTIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVGTEFHUyk7IH0KLSJGSUxFT1MiCQl7IE1BWUJFX1JFVFVSTiAoRklMRU9TKTsgfQotIkZJTEVUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVUWVBFKTsgfQotIkZJTEVTVUJUWVBFIgkJeyBNQVlCRV9SRVRVUk4gKEZJTEVTVUJUWVBFKTsgfQotIlZBTFVFIgkJCXsgTUFZQkVfUkVUVVJOIChWQUxVRSk7IH0KLSJNT1ZFQUJMRSIJCXsgTUFZQkVfUkVUVVJOIChNT1ZFQUJMRSk7IH0KLSJGSVhFRCIJCQl7IE1BWUJFX1JFVFVSTiAoRklYRUQpOyB9Ci0iUFVSRSIJCQl7IE1BWUJFX1JFVFVSTiAoUFVSRSk7IH0KLSJJTVBVUkUiCQl7IE1BWUJFX1JFVFVSTiAoSU1QVVJFKTsgfQotIlBSRUxPQUQiCQl7IE1BWUJFX1JFVFVSTiAoUFJFTE9BRCk7IH0KLSJMT0FET05DQUxMIgkJeyBNQVlCRV9SRVRVUk4gKExPQURPTkNBTEwpOyB9Ci0iRElTQ0FSREFCTEUiCQl7IE1BWUJFX1JFVFVSTiAoRElTQ0FSREFCTEUpOyB9Ci0iTk9UIgkJCXsgTUFZQkVfUkVUVVJOIChOT1QpOyB9Ci0KLSJCTE9DSyJbIFx0XG5dKiJcIiJbXlwjXG5dKiJcIiIgewotCQkJICBjaGFyICpzLCAqc2VuZDsKLQotCQkJICAvKiBUaGlzIGlzIGEgaGFjayB0byBsZXQgdXMgcGFyc2UgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBlYXNpbHkuICAqLwotCi0JCQkgIHMgPSBzdHJjaHIgKHl5dGV4dCwgJyInKTsKLQkJCSAgKytzOwotCQkJICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotCQkJICBpZiAoc3RybmNtcCAocywgIlN0cmluZ0ZpbGVJbmZvIiwKLQkJCQkgICAgICAgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxKSA9PSAwCi0JCQkgICAgICAmJiBzICsgc2l6ZW9mICJTdHJpbmdGaWxlSW5mbyIgLSAxID09IHNlbmQpCi0JCQkgICAgTUFZQkVfUkVUVVJOIChCTE9DS1NUUklOR0ZJTEVJTkZPKTsKLQkJCSAgZWxzZSBpZiAoc3RybmNtcCAocywgIlZhckZpbGVJbmZvIiwKLQkJCQkJICAgIHNpemVvZiAiVmFyRmlsZUluZm8iIC0gMSkgPT0gMAotCQkJCSAgICYmIHMgKyBzaXplb2YgIlZhckZpbGVJbmZvIiAtIDEgPT0gc2VuZCkKLQkJCSAgICBNQVlCRV9SRVRVUk4gKEJMT0NLVkFSRklMRUlORk8pOwotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgY2hhciAqcjsKLQotCQkJICAgICAgciA9IGdldF9zdHJpbmcgKHNlbmQgLSBzICsgMSk7Ci0JCQkgICAgICBzdHJuY3B5IChyLCBzLCBzZW5kIC0gcyk7Ci0JCQkgICAgICByW3NlbmQgLSBzXSA9ICdcMCc7Ci0JCQkgICAgICB5eWx2YWwucyA9IHI7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKEJMT0NLKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLSIjIlteXG5dKgkJewotCQkJICBjcHBfbGluZSAoeXl0ZXh0KTsKLQkJCX0KLQotWzAtOV1beDAtOUEtRmEtZl0qTAl7Ci0JCQkgIHl5bHZhbC5pLnZhbCA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0JCQkgIHl5bHZhbC5pLmR3b3JkID0gMTsKLQkJCSAgTUFZQkVfUkVUVVJOIChOVU1CRVIpOwotCQkJfQotCi1bMC05XVt4MC05QS1GYS1mXSoJewotCQkJICB5eWx2YWwuaS52YWwgPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotCQkJICB5eWx2YWwuaS5kd29yZCA9IDA7Ci0JCQkgIE1BWUJFX1JFVFVSTiAoTlVNQkVSKTsKLQkJCX0KLQotKCJcIiJbXlwiXG5dKiJcIiJbIFx0XSopKyB7Ci0JCQkgIGNoYXIgKnM7Ci0JCQkgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotCi0JCQkgIHMgPSBoYW5kbGVfcXVvdGVzICh5eXRleHQsICZsZW5ndGgpOwotCQkJICBpZiAoISByY2RhdGFfbW9kZSkKLQkJCSAgICB7Ci0JCQkgICAgICB5eWx2YWwucyA9IHM7Ci0JCQkgICAgICBNQVlCRV9SRVRVUk4gKFFVT1RFRFNUUklORyk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgeXlsdmFsLnNzLmxlbmd0aCA9IGxlbmd0aDsKLQkJCSAgICAgIHl5bHZhbC5zcy5zID0gczsKLQkJCSAgICAgIE1BWUJFX1JFVFVSTiAoU0laRURTVFJJTkcpOwotCQkJICAgIH0KLQkJCX0KLQotW0EtWmEtel1bXiAsXHRcclxuXSoJewotCQkJICBjaGFyICpzOwotCi0JCQkgIC8qIEkgcmVqZWN0ZWQgY29tbWEgaW4gYSBzdHJpbmcgaW4gb3JkZXIgdG8KLQkJCSAgICAgaGFuZGxlIFZJUlRLRVksIENPTlRST0wgaW4gYW4gYWNjZWxlcmF0b3IKLQkJCSAgICAgcmVzb3VyY2UuICBUaGlzIG1lYW5zIHRoYXQgYW4gdW5xdW90ZWQKLQkJCSAgICAgZmlsZSBuYW1lIGNhbiBub3QgY29udGFpbiBhIGNvbW1hLiAgSQotCQkJICAgICBkb24ndCBrbm93IHdoYXQgcmMgcGVybWl0cy4gICovCi0KLQkJCSAgcyA9IGdldF9zdHJpbmcgKHN0cmxlbiAoeXl0ZXh0KSArIDEpOwotCQkJICBzdHJjcHkgKHMsIHl5dGV4dCk7Ci0JCQkgIHl5bHZhbC5zID0gczsKLQkJCSAgTUFZQkVfUkVUVVJOIChTVFJJTkcpOwotCQkJfQotCi1bXG5dCQkJeyArK3JjX2xpbmVubzsgfQotWyBcdFxyXSsJCXsgLyogaWdub3JlIHdoaXRlc3BhY2UgKi8gfQotLgkJCXsgTUFZQkVfUkVUVVJOICgqeXl0ZXh0KTsgfQotCi0lJQotI2lmbmRlZiB5eXdyYXAKLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBzb21lIHZlcnNpb25zIG9mIGxleC4gICovCi1pbnQgeXl3cmFwICgpCi17Ci0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIEMgcHJlcHJvY2Vzc29yIGxpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotY3BwX2xpbmUgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIGludCBsaW5lOwotICBjaGFyICpzZW5kLCAqZm47Ci0KLSAgKytzOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0gIAotICBsaW5lID0gc3RydG9sIChzLCAmc2VuZCwgMCk7Ci0gIGlmICgqc2VuZCAhPSAnXDAnICYmICEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzZW5kKSkKLSAgICByZXR1cm47Ci0KLSAgLyogU3VidHJhY3QgMSBiZWNhdXNlIHdlIGFyZSBhYm91dCB0byBjb3VudCB0aGUgbmV3bGluZS4gICovCi0gIHJjX2xpbmVubyA9IGxpbmUgLSAxOwotCi0gIHMgPSBzZW5kOwotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICArK3M7Ci0KLSAgaWYgKCpzICE9ICciJykKLSAgICByZXR1cm47Ci0KLSAgKytzOwotICBzZW5kID0gc3RyY2hyIChzLCAnIicpOwotICBpZiAoc2VuZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmbiA9IChjaGFyICopIHhtYWxsb2MgKHNlbmQgLSBzICsgMSk7Ci0gIHN0cm5jcHkgKGZuLCBzLCBzZW5kIC0gcyk7Ci0gIGZuW3NlbmQgLSBzXSA9ICdcMCc7Ci0KLSAgZnJlZSAocmNfZmlsZW5hbWUpOwotICByY19maWxlbmFtZSA9IGZuOwotCi0gIGlmICghaW5pdGlhbF9mbikKLSAgICB7Ci0gICAgICBpbml0aWFsX2ZuID0geG1hbGxvYyAoc3RybGVuIChmbikgKyAxKTsKLSAgICAgIHN0cmNweShpbml0aWFsX2ZuLCBmbik7Ci0gICAgfQotCi0gIC8qIEFsbG93IHRoZSBpbml0aWFsIGZpbGUsIHJlZ2FyZGxlc3Mgb2YgbmFtZS4gIFN1cHByZXNzIGFsbCBvdGhlcgotICAgICBmaWxlcyBpZiB0aGV5IGVuZCBpbiAiLmgiICh0aGlzIGFsbG93cyBpbmNsdWRlZCAiKi5yYyIpICovCi0gIGlmIChzdHJjbXAgKGluaXRpYWxfZm4sIGZuKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKGZuICsgc3RybGVuIChmbikgLSAyLCAiLmgiKSAhPSAwKQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMDsKLSAgZWxzZQotICAgIHN1cHByZXNzX2NwcF9kYXRhID0gMTsKLX0KLQotLyogSGFuZGxlIGEgcXVvdGVkIHN0cmluZy4gIFRoZSBxdW90ZXMgYXJlIHN0cmlwcGVkLiAgQSBwYWlyIG9mIHF1b3RlcwotICAgaW4gYSBzdHJpbmcgYXJlIHR1cm5lZCBpbnRvIGEgc2luZ2xlIHF1b3RlLiAgQWRqYWNlbnQgc3RyaW5ncyBhcmUKLSAgIG1lcmdlZCBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhcmUgbWVyZ2VkLCBhcyBpbiBDLiAgKi8KLQotc3RhdGljIGNoYXIgKgotaGFuZGxlX3F1b3RlcyAoaW5wdXQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqaW5wdXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmxlbjsKLXsKLSAgY2hhciAqcmV0LCAqczsKLSAgY29uc3QgY2hhciAqdDsKLSAgaW50IGNoOwotCi0gIHJldCA9IGdldF9zdHJpbmcgKHN0cmxlbiAoaW5wdXQpICsgMSk7Ci0KLSAgcyA9IHJldDsKLSAgdCA9IGlucHV0OwotICBpZiAoKnQgPT0gJyInKQotICAgICsrdDsKLSAgd2hpbGUgKCp0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCp0ID09ICdcXCcpCi0JewotCSAgKyt0OwotCSAgc3dpdGNoICgqdCkKLQkgICAgewotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgiYmFja3NsYXNoIGF0IGVuZCBvZiBzdHJpbmciKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcIic6Ci0JICAgICAgcmNwYXJzZV93YXJuaW5nICgidXNlIFwiXCIgdG8gcHV0IFwiIGluIGEgc3RyaW5nIik7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9BOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdiJzoKLQkgICAgICAqcysrID0gRVNDQVBFX0I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2YnOgotCSAgICAgICpzKysgPSBFU0NBUEVfRjsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnbic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9OOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdyJzoKLQkgICAgICAqcysrID0gRVNDQVBFX1I7Ci0JICAgICAgKyt0OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3QnOgotCSAgICAgICpzKysgPSBFU0NBUEVfVDsKLQkgICAgICArK3Q7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAndic6Ci0JICAgICAgKnMrKyA9IEVTQ0FQRV9WOwotCSAgICAgICsrdDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcXCc6Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6Ci0JICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOgotCSAgICAgIGNoID0gKnQgLSAnMCc7Ci0JICAgICAgKyt0OwotCSAgICAgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzcnKQotCQl7Ci0JCSAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOwotCQkgICsrdDsKLQkJICBpZiAoKnQgPj0gJzAnICYmICp0IDw9ICc3JykKLQkJICAgIHsKLQkJICAgICAgY2ggPSAoY2ggPDwgMykgfCAoKnQgLSAnMCcpOwotCQkgICAgICArK3Q7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAqcysrID0gY2g7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgKyt0OwotCSAgICAgIGNoID0gMDsKLQkgICAgICB3aGlsZSAoMSkKLQkJewotCQkgIGlmICgqdCA+PSAnMCcgJiYgKnQgPD0gJzknKQotCQkgICAgY2ggPSAoY2ggPDwgNCkgfCAoKnQgLSAnMCcpOwotCQkgIGVsc2UgaWYgKCp0ID49ICdhJyAmJiAqdCA8PSAnZicpCi0JCSAgICBjaCA9IChjaCA8PCA0KSB8ICgqdCAtICdhJyk7Ci0JCSAgZWxzZSBpZiAoKnQgPj0gJ0EnICYmICp0IDw9ICdGJykKLQkJICAgIGNoID0gKGNoIDw8IDQpIHwgKCp0IC0gJ0EnKTsKLQkJICBlbHNlCi0JCSAgICBicmVhazsKLQkJICArK3Q7Ci0JCX0KLQkgICAgICAqcysrID0gY2g7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKCJ1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlIik7Ci0JICAgICAgKnMrKyA9ICdcXCc7Ci0JICAgICAgKnMrKyA9ICp0Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmICgqdCAhPSAnIicpCi0JKnMrKyA9ICp0Kys7Ci0gICAgICBlbHNlIGlmICh0WzFdID09ICdcMCcpCi0JYnJlYWs7Ci0gICAgICBlbHNlIGlmICh0WzFdID09ICciJykKLQl7Ci0JICAqcysrID0gJyInOwotCSAgdCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK3Q7Ci0JICBhc3NlcnQgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpOwotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqdCkpCi0JICAgICsrdDsKLQkgIGlmICgqdCA9PSAnXDAnKQotCSAgICBicmVhazsKLQkgIGFzc2VydCAoKnQgPT0gJyInKTsKLQkgICsrdDsKLQl9Ci0gICAgfQotCi0gICpzID0gJ1wwJzsKLQotICAqbGVuID0gcyAtIHJldDsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBBbGxvY2F0ZSBhIHN0cmluZyBvZiBhIGdpdmVuIGxlbmd0aC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9zdHJpbmcgKGxlbikKLSAgICAgaW50IGxlbjsKLXsKLSAgc3RydWN0IGFsbG9jX3N0cmluZyAqYXM7Ci0KLSAgYXMgPSAoc3RydWN0IGFsbG9jX3N0cmluZyAqKSB4bWFsbG9jIChzaXplb2YgKmFzKTsKLSAgYXMtPnMgPSB4bWFsbG9jIChsZW4pOwotCi0gIGFzLT5uZXh0ID0gc3RyaW5nczsKLSAgc3RyaW5ncyA9IGFzLT5uZXh0OwotCi0gIHJldHVybiBhcy0+czsKLX0KLQotLyogRGlzY2FyZCBhbGwgdGhlIHN0cmluZ3Mgd2UgaGF2ZSBhbGxvY2F0ZWQuICBUaGUgcGFyc2VyIGNhbGxzIHRoaXMKLSAgIHdoZW4gaXQgbm8gbG9uZ2VyIG5lZWRzIHRoZW0uICAqLwotCi12b2lkCi1yY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKQotewotICBzdHJ1Y3QgYWxsb2Nfc3RyaW5nICphczsKLQotICBhcyA9IHN0cmluZ3M7Ci0gIHdoaWxlIChhcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBhbGxvY19zdHJpbmcgKm47Ci0KLSAgICAgIGZyZWUgKGFzLT5zKTsKLSAgICAgIG4gPSBhcy0+bmV4dDsKLSAgICAgIGZyZWUgKGFzKTsKLSAgICAgIGFzID0gbjsKLSAgICB9Ci0KLSAgc3RyaW5ncyA9IE5VTEw7Ci19Ci0KLS8qIEVudGVyIHJjZGF0YSBtb2RlLiAgKi8KLQotdm9pZAotcmNwYXJzZV9yY2RhdGEgKCkKLXsKLSAgcmNkYXRhX21vZGUgPSAxOwotfQotCi0vKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlIGZyb20gcmNkYXRhIG1vZGUuICAqLwotCi12b2lkCi1yY3BhcnNlX25vcm1hbCAoKQotewotICByY2RhdGFfbW9kZSA9IDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yY3BhcnNlLnkgYi9iaW51dGlscy9yY3BhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzY2JiZGMuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmNwYXJzZS55CisrKyAvZGV2L251bGwKQEAgLTEsMTYxOSArMCwwIEBACi0leyAvKiByY3BhcnNlLnkgLS0gcGFyc2VyIGZvciBXaW5kb3dzIHJjIGZpbGVzCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaXMgYSBwYXJzZXIgZm9yIFdpbmRvd3MgcmMgZmlsZXMuICBJdCBpcyBiYXNlZCBvbiB0aGUgcGFyc2VyCi0gICBieSBHdW50aGVyIEViZXJ0IDxndW50aGVyLmViZXJ0QGl4b3MtbGVpcHppZy5kZT4uICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogVGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbGFuZ3VhZ2U7Ci0KLS8qIFRoZSByZXNvdXJjZSBpbmZvcm1hdGlvbiBkdXJpbmcgYSBzdWIgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzX2luZm8gc3ViX3Jlc19pbmZvOwotCi0vKiBEaWFsb2cgaW5mb3JtYXRpb24uICBUaGlzIGlzIGJ1aWx0IGJ5IHRoZSBub250ZXJtaW5hbHMgc3R5bGVzIGFuZAotICAgY29udHJvbHMuICAqLwotCi1zdGF0aWMgc3RydWN0IGRpYWxvZyBkaWFsb2c7Ci0KLS8qIFRoaXMgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgc3R5bGUuICBJdCBpcyBtb2RpZmllZCBieSB0aGUKLSAgIG5vbnRlcm1pbmFsIHN0eWxlZXhwci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHN0eWxlOwotCi0vKiBUaGVzZSBhcmUgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgY29udHJvbC4gIFRoZXkgYXJlIHNldCBiZWZvcmUgdXNpbmcKLSAgIGNvbnRyb2xfcGFyYW1zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmFzZV9zdHlsZTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRfc3R5bGU7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbGFzczsKLQotJX0KLQotJXVuaW9uCi17Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciBhY2M7Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciAqcGFjYzsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkaWFsb2dfY29udHJvbDsKLSAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbTsKLSAgc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmZpcnN0OwotICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqbGFzdDsKLSAgfSByY2RhdGE7Ci0gIHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhX2l0ZW07Ci0gIHN0cnVjdCBzdHJpbmd0YWJsZV9kYXRhICpzdHJpbmd0YWJsZTsKLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaXh2ZXI7Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmVyaW5mbzsKLSAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2ZXJzdHJpbmc7Ci0gIHN0cnVjdCB2ZXJfdmFyaW5mbyAqdmVydmFyOwotICBzdHJ1Y3QgcmVzX2lkIGlkOwotICBzdHJ1Y3QgcmVzX3Jlc19pbmZvIHJlc19pbmZvOwotICBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIHNob3J0IG9uOwotICAgIHVuc2lnbmVkIHNob3J0IG9mZjsKLSAgfSBtZW1mbGFnczsKLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbDsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgbnVtYmVyIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhcyBsb25nLiAgKi8KLSAgICBpbnQgZHdvcmQ7Ci0gIH0gaTsKLSAgdW5zaWduZWQgbG9uZyBpbDsKLSAgdW5zaWduZWQgc2hvcnQgaXM7Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgY29uc3QgY2hhciAqczsKLSAgfSBzczsKLX07Ci0KLSV0b2tlbiBCRUcgRU5ECi0ldG9rZW4gQUNDRUxFUkFUT1JTIFZJUlRLRVkgQVNDSUkgTk9JTlZFUlQgU0hJRlQgQ09OVFJPTCBBTFQKLSV0b2tlbiBCSVRNQVAKLSV0b2tlbiBDVVJTT1IKLSV0b2tlbiBESUFMT0cgRElBTE9HRVggRVhTVFlMRSBDQVBUSU9OIENMQVNTIFNUWUxFCi0ldG9rZW4gQVVUTzNTVEFURSBBVVRPQ0hFQ0tCT1ggQVVUT1JBRElPQlVUVE9OIENIRUNLQk9YIENPTUJPQk9YIENURVhUCi0ldG9rZW4gREVGUFVTSEJVVFRPTiBFRElUVEVYVCBHUk9VUEJPWCBMSVNUQk9YIExURVhUIFBVU0hCT1ggUFVTSEJVVFRPTgotJXRva2VuIFJBRElPQlVUVE9OIFJURVhUIFNDUk9MTEJBUiBTVEFURTMgVVNFUkJVVFRPTgotJXRva2VuIEJFRElUIEhFRElUIElFRElUCi0ldG9rZW4gRk9OVAotJXRva2VuIElDT04KLSV0b2tlbiBMQU5HVUFHRSBDSEFSQUNURVJJU1RJQ1MgVkVSU0lPTksKLSV0b2tlbiBNRU5VIE1FTlVFWCBNRU5VSVRFTSBTRVBBUkFUT1IgUE9QVVAgQ0hFQ0tFRCBHUkFZRUQgSEVMUCBJTkFDVElWRQotJXRva2VuIE1FTlVCQVJCUkVBSyBNRU5VQlJFQUsKLSV0b2tlbiBNRVNTQUdFVEFCTEUKLSV0b2tlbiBSQ0RBVEEKLSV0b2tlbiBTVFJJTkdUQUJMRQotJXRva2VuIFZFUlNJT05JTkZPIEZJTEVWRVJTSU9OIFBST0RVQ1RWRVJTSU9OIEZJTEVGTEFHU01BU0sgRklMRUZMQUdTCi0ldG9rZW4gRklMRU9TIEZJTEVUWVBFIEZJTEVTVUJUWVBFIEJMT0NLU1RSSU5HRklMRUlORk8gQkxPQ0tWQVJGSUxFSU5GTwotJXRva2VuIFZBTFVFCi0ldG9rZW4gPHM+IEJMT0NLCi0ldG9rZW4gTU9WRUFCTEUgRklYRUQgUFVSRSBJTVBVUkUgUFJFTE9BRCBMT0FET05DQUxMIERJU0NBUkRBQkxFCi0ldG9rZW4gTk9UCi0ldG9rZW4gPHM+IFFVT1RFRFNUUklORyBTVFJJTkcKLSV0b2tlbiA8aT4gTlVNQkVSCi0ldG9rZW4gPHNzPiBTSVpFRFNUUklORwotJXRva2VuIElHTk9SRURfVE9LRU4KLQotJXR5cGUgPHBhY2M+IGFjY19lbnRyaWVzCi0ldHlwZSA8YWNjPiBhY2NfZW50cnkgYWNjX2V2ZW50Ci0ldHlwZSA8ZGlhbG9nX2NvbnRyb2w+IGNvbnRyb2wgY29udHJvbF9wYXJhbXMKLSV0eXBlIDxtZW51aXRlbT4gbWVudWl0ZW1zIG1lbnVpdGVtIG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KLSV0eXBlIDxyY2RhdGE+IG9wdHJjZGF0YV9kYXRhIG9wdHJjZGF0YV9kYXRhX2ludCByY2RhdGFfZGF0YQotJXR5cGUgPHJjZGF0YV9pdGVtPiBvcHRfY29udHJvbF9kYXRhCi0ldHlwZSA8Zml4dmVyPiBmaXhlZHZlcmluZm8KLSV0eXBlIDx2ZXJpbmZvPiB2ZXJibG9ja3MKLSV0eXBlIDx2ZXJzdHJpbmc+IHZlcnZhbHMKLSV0eXBlIDx2ZXJ2YXI+IHZlcnRyYW5zCi0ldHlwZSA8cmVzX2luZm8+IHN1Ym9wdGlvbnMgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWdzX21vdmUKLSV0eXBlIDxtZW1mbGFncz4gbWVtZmxhZwotJXR5cGUgPGlkPiBpZAotJXR5cGUgPGlsPiBleHN0eWxlIHBhcmVubnVtYmVyCi0ldHlwZSA8aWw+IG51bWV4cHIgcG9zbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBjcG9zbnVtZXhwcgotJXR5cGUgPGlzPiBhY2Nfb3B0aW9ucyBhY2Nfb3B0aW9uIG1lbnVpdGVtX2ZsYWdzIG1lbnVpdGVtX2ZsYWcKLSV0eXBlIDxzPiBvcHRzdHJpbmdjIGZpbGVfbmFtZQotJXR5cGUgPGk+IHNpemVkbnVtZXhwciBzaXplZHBvc251bWV4cHIKLQotJWxlZnQgJ3wnCi0lbGVmdCAnXicKLSVsZWZ0ICcmJwotJWxlZnQgJysnICctJwotJWxlZnQgJyonICcvJyAnJScKLSVyaWdodCAnficgTkVHCi0KLSUlCi0KLWlucHV0OgotCSAgLyogZW1wdHkgKi8KLQl8IGlucHV0IG5ld2NtZCBhY2NlbGVyYXRvcgotCXwgaW5wdXQgbmV3Y21kIGJpdG1hcAotCXwgaW5wdXQgbmV3Y21kIGN1cnNvcgotCXwgaW5wdXQgbmV3Y21kIGRpYWxvZwotCXwgaW5wdXQgbmV3Y21kIGZvbnQKLQl8IGlucHV0IG5ld2NtZCBpY29uCi0JfCBpbnB1dCBuZXdjbWQgbGFuZ3VhZ2UKLQl8IGlucHV0IG5ld2NtZCBtZW51Ci0JfCBpbnB1dCBuZXdjbWQgbWVudWV4Ci0JfCBpbnB1dCBuZXdjbWQgbWVzc2FnZXRhYmxlCi0JfCBpbnB1dCBuZXdjbWQgcmNkYXRhCi0JfCBpbnB1dCBuZXdjbWQgc3RyaW5ndGFibGUKLQl8IGlucHV0IG5ld2NtZCB1c2VyCi0JfCBpbnB1dCBuZXdjbWQgdmVyc2lvbmluZm8KLQl8IGlucHV0IG5ld2NtZCBJR05PUkVEX1RPS0VOCi0JOwotCi1uZXdjbWQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICByY3BhcnNlX2Rpc2NhcmRfc3RyaW5ncyAoKTsKLQkgIH0KLQk7Ci0KLS8qIEFjY2VsZXJhdG9yIHJlc291cmNlcy4gICovCi0KLWFjY2VsZXJhdG9yOgotCSAgaWQgQUNDRUxFUkFUT1JTIHN1Ym9wdGlvbnMgQkVHIGFjY19lbnRyaWVzIEVORAotCSAgewotCSAgICBkZWZpbmVfYWNjZWxlcmF0b3IgKCQxLCAmJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLWFjY19lbnRyaWVzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgYWNjX2VudHJpZXMgYWNjX2VudHJ5Ci0JICB7Ci0JICAgIHN0cnVjdCBhY2NlbGVyYXRvciAqYTsKLQotCSAgICBhID0gKHN0cnVjdCBhY2NlbGVyYXRvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYSk7Ci0JICAgICphID0gJDI7Ci0JICAgIGlmICgkMSA9PSBOVUxMKQotCSAgICAgICQkID0gYTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IGFjY2VsZXJhdG9yICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gYTsKLQkJJCQgPSAkMTsKLQkgICAgICB9Ci0JICB9Ci0JOwotCi1hY2NfZW50cnk6Ci0JICBhY2NfZXZlbnQgY3Bvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuaWQgPSAkMjsKLQkgIH0KLQl8IGFjY19ldmVudCBjcG9zbnVtZXhwciAnLCcgYWNjX29wdGlvbnMKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQuaWQgPSAkMjsKLQkgICAgJCQuZmxhZ3MgfD0gJDQ7Ci0JICAgIGlmICgoJCQuZmxhZ3MgJiBBQ0NfVklSVEtFWSkgPT0gMAotCQkmJiAoJCQuZmxhZ3MgJiAoQUNDX1NISUZUIHwgQUNDX0NPTlRST0wgfCBBQ0NfQUxUKSkgIT0gMCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImluYXBwcm9wcmlhdGUgbW9kaWZpZXJzIGZvciBub24tVklSVEtFWSIpKTsKLQkgIH0KLQk7Ci0KLWFjY19ldmVudDoKLQkgIFFVT1RFRFNUUklORwotCSAgewotCSAgICBjb25zdCBjaGFyICpzID0gJDE7Ci0JICAgIGNoYXIgY2g7Ci0KLQkgICAgJCQubmV4dCA9IE5VTEw7Ci0JICAgICQkLmlkID0gMDsKLQkgICAgY2ggPSAqczsKLQkgICAgaWYgKGNoICE9ICdeJykKLQkgICAgICAkJC5mbGFncyA9IDA7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSQkLmZsYWdzID0gQUNDX0NPTlRST0wgfCBBQ0NfVklSVEtFWTsKLQkJKytzOwotCQljaCA9ICpzOwotCQljaCA9IHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBjaCk7Ci0JICAgICAgfQotCSAgICAkJC5rZXkgPSBjaDsKLQkgICAgaWYgKHNbMV0gIT0gJ1wwJykKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImFjY2VsZXJhdG9yIHNob3VsZCBvbmx5IGJlIG9uZSBjaGFyYWN0ZXIiKSk7Ci0JICB9Ci0JfCBwb3NudW1leHByCi0JICB7Ci0JICAgICQkLm5leHQgPSBOVUxMOwotCSAgICAkJC5mbGFncyA9IDA7Ci0JICAgICQkLmlkID0gMDsKLQkgICAgJCQua2V5ID0gJDE7Ci0JICB9Ci0JOwotCi1hY2Nfb3B0aW9uczoKLQkgIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGFjY19vcHRpb25zICcsJyBhY2Nfb3B0aW9uCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMzsKLQkgIH0KLQkvKiBJJ3ZlIGhhZCBvbmUgcmVwb3J0IHRoYXQgdGhlIGNvbW1hIGlzIG9wdGlvbmFsLiAgKi8KLQl8IGFjY19vcHRpb25zIGFjY19vcHRpb24KLQkgIHsKLQkgICAgJCQgPSAkMSB8ICQyOwotCSAgfQotCTsKLQotYWNjX29wdGlvbjoKLQkgIFZJUlRLRVkKLQkgIHsKLQkgICAgJCQgPSBBQ0NfVklSVEtFWTsKLQkgIH0KLQl8IEFTQ0lJCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMganVzdCB0aGUgYWJzZW5jZSBvZiBWSVJUS0VZLiAgKi8KLQkgICAgJCQgPSAwOwotCSAgfQotCXwgTk9JTlZFUlQKLQkgIHsKLQkgICAgJCQgPSBBQ0NfTk9JTlZFUlQ7Ci0JICB9Ci0JfCBTSElGVAotCSAgewotCSAgICAkJCA9IEFDQ19TSElGVDsKLQkgIH0KLQl8IENPTlRST0wKLQkgIHsKLQkgICAgJCQgPSBBQ0NfQ09OVFJPTDsKLQkgIH0KLQl8IEFMVAotCSAgewotCSAgICAkJCA9IEFDQ19BTFQ7Ci0JICB9Ci0JOwotCi0vKiBCaXRtYXAgcmVzb3VyY2VzLiAgKi8KLQotYml0bWFwOgotCSAgaWQgQklUTUFQIG1lbWZsYWdzX21vdmUgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV9iaXRtYXAgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIEN1cnNvciByZXNvdXJjZXMuICAqLwotCi1jdXJzb3I6Ci0JICBpZCBDVVJTT1IgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfY3Vyc29yICgkMSwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBEaWFsb2cgcmVzb3VyY2VzLiAgKi8KLQotZGlhbG9nOgotCSAgaWQgRElBTE9HIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9IE5VTEw7Ci0JICAgICAgZGlhbG9nLmNvbnRyb2xzID0gTlVMTDsKLQkgICAgICBzdWJfcmVzX2luZm8gPSAkMzsKLQkgICAgfQotCSAgICBzdHlsZXMgQkVHIGNvbnRyb2xzIEVORAotCSAgewotCSAgICBkZWZpbmVfZGlhbG9nICgkMSwgJnN1Yl9yZXNfaW5mbywgJmRpYWxvZyk7Ci0JICB9Ci0JfCBpZCBESUFMT0dFWCBtZW1mbGFnc19tb3ZlIGV4c3R5bGUgcG9zbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwcgotCSAgICB7Ci0JICAgICAgbWVtc2V0ICgmZGlhbG9nLCAwLCBzaXplb2YgZGlhbG9nKTsKLQkgICAgICBkaWFsb2cueCA9ICQ1OwotCSAgICAgIGRpYWxvZy55ID0gJDY7Ci0JICAgICAgZGlhbG9nLndpZHRoID0gJDc7Ci0JICAgICAgZGlhbG9nLmhlaWdodCA9ICQ4OwotCSAgICAgIGRpYWxvZy5zdHlsZSA9IFdTX1BPUFVQIHwgV1NfQk9SREVSIHwgV1NfU1lTTUVOVTsKLQkgICAgICBkaWFsb2cuZXhzdHlsZSA9ICQ0OwotCSAgICAgIGRpYWxvZy5tZW51Lm5hbWVkID0gMTsKLQkgICAgICBkaWFsb2cuY2xhc3MubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5mb250ID0gTlVMTDsKLQkgICAgICBkaWFsb2cuZXggPSAoKHN0cnVjdCBkaWFsb2dfZXggKikKLQkJCSAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlhbG9nX2V4KSkpOwotCSAgICAgIG1lbXNldCAoZGlhbG9nLmV4LCAwLCBzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKTsKLQkgICAgICBkaWFsb2cuY29udHJvbHMgPSBOVUxMOwotCSAgICAgIHN1Yl9yZXNfaW5mbyA9ICQzOwotCSAgICB9Ci0JICAgIHN0eWxlcyBCRUcgY29udHJvbHMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9kaWFsb2cgKCQxLCAmc3ViX3Jlc19pbmZvLCAmZGlhbG9nKTsKLQkgIH0KLQl8IGlkIERJQUxPR0VYIG1lbWZsYWdzX21vdmUgZXhzdHlsZSBwb3NudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGNudW1leHByIGNudW1leHByCi0JICAgIHsKLQkgICAgICBtZW1zZXQgKCZkaWFsb2csIDAsIHNpemVvZiBkaWFsb2cpOwotCSAgICAgIGRpYWxvZy54ID0gJDU7Ci0JICAgICAgZGlhbG9nLnkgPSAkNjsKLQkgICAgICBkaWFsb2cud2lkdGggPSAkNzsKLQkgICAgICBkaWFsb2cuaGVpZ2h0ID0gJDg7Ci0JICAgICAgZGlhbG9nLnN0eWxlID0gV1NfUE9QVVAgfCBXU19CT1JERVIgfCBXU19TWVNNRU5VOwotCSAgICAgIGRpYWxvZy5leHN0eWxlID0gJDQ7Ci0JICAgICAgZGlhbG9nLm1lbnUubmFtZWQgPSAxOwotCSAgICAgIGRpYWxvZy5jbGFzcy5uYW1lZCA9IDE7Ci0JICAgICAgZGlhbG9nLmZvbnQgPSBOVUxMOwotCSAgICAgIGRpYWxvZy5leCA9ICgoc3RydWN0IGRpYWxvZ19leCAqKQotCQkJICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCBkaWFsb2dfZXgpKSk7Ci0JICAgICAgbWVtc2V0IChkaWFsb2cuZXgsIDAsIHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOwotCSAgICAgIGRpYWxvZy5leC0+aGVscCA9ICQ5OwotCSAgICAgIGRpYWxvZy5jb250cm9scyA9IE5VTEw7Ci0JICAgICAgc3ViX3Jlc19pbmZvID0gJDM7Ci0JICAgIH0KLQkgICAgc3R5bGVzIEJFRyBjb250cm9scyBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX2RpYWxvZyAoJDEsICZzdWJfcmVzX2luZm8sICZkaWFsb2cpOwotCSAgfQotCTsKLQotZXhzdHlsZToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gMDsKLQkgIH0KLQl8IEVYU1RZTEUgJz0nIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQk7Ci0KLXN0eWxlczoKLQkgIC8qIGVtcHR5ICovCi0JfCBzdHlsZXMgQ0FQVElPTiBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZkaWFsb2cuY2FwdGlvbiwgJDMpOwotCSAgfQotCXwgc3R5bGVzIENMQVNTIGlkCi0JICB7Ci0JICAgIGRpYWxvZy5jbGFzcyA9ICQzOwotCSAgfQotCXwgc3R5bGVzIFNUWUxFCi0JICAgIHsgc3R5bGUgPSBkaWFsb2cuc3R5bGU7IH0KLQkgICAgc3R5bGVleHByCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSA9IHN0eWxlOwotCSAgfQotCXwgc3R5bGVzIEVYU1RZTEUgbnVtZXhwcgotCSAgewotCSAgICBkaWFsb2cuZXhzdHlsZSA9ICQzOwotCSAgfQotCXwgc3R5bGVzIEZPTlQgbnVtZXhwciAnLCcgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRpYWxvZy5zdHlsZSB8PSBEU19TRVRGT05UOwotCSAgICBkaWFsb2cucG9pbnRzaXplID0gJDM7Ci0JICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmZGlhbG9nLmZvbnQsICQ1KTsKLQkgIH0KLQl8IHN0eWxlcyBGT05UIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBkaWFsb2cuc3R5bGUgfD0gRFNfU0VURk9OVDsKLQkgICAgZGlhbG9nLnBvaW50c2l6ZSA9ICQzOwotCSAgICB1bmljb2RlX2Zyb21fYXNjaWkgKChpbnQgKikgTlVMTCwgJmRpYWxvZy5mb250LCAkNSk7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oImV4dGVuZGVkIEZPTlQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWRpYWxvZy5leC0+d2VpZ2h0ID0gJDY7Ci0JCWRpYWxvZy5leC0+aXRhbGljID0gJDc7Ci0JICAgICAgfQotCSAgfQotCXwgc3R5bGVzIE1FTlUgaWQKLQkgIHsKLQkgICAgZGlhbG9nLm1lbnUgPSAkMzsKLQkgIH0KLQl8IHN0eWxlcyBDSEFSQUNURVJJU1RJQ1MgbnVtZXhwcgotCSAgewotCSAgICBzdWJfcmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzID0gJDM7Ci0JICB9Ci0JfCBzdHlsZXMgTEFOR1VBR0UgbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICBzdWJfcmVzX2luZm8ubGFuZ3VhZ2UgPSAkMyB8ICgkNCA8PCA4KTsKLQkgIH0KLQl8IHN0eWxlcyBWRVJTSU9OSyBudW1leHByCi0JICB7Ci0JICAgIHN1Yl9yZXNfaW5mby52ZXJzaW9uID0gJDM7Ci0JICB9Ci0JOwotCi1jb250cm9sczoKLQkgIC8qIGVtcHR5ICovCi0JfCBjb250cm9scyBjb250cm9sCi0JICB7Ci0JICAgIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKnBwOwotCi0JICAgIGZvciAocHAgPSAmZGlhbG9nLmNvbnRyb2xzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgICAgOwotCSAgICAqcHAgPSAkMjsKLQkgIH0KLQk7Ci0KLWNvbnRyb2w6Ci0JICBBVVRPM1NUQVRFCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQVVUTzNTVEFURSB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEJTX0FVVE8zU1RBVEU7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBBVVRPQ0hFQ0tCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPQ0hFQ0tCT1g7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBBVVRPUkFESU9CVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT04gfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19BVVRPUkFESU9CVVRUT047Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBCRURJVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICAgIGlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkgICAgICByY3BhcnNlX3dhcm5pbmcgKF8oIklFRElUIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCSAgICByZXNfc3RyaW5nX3RvX2lkICgmJCQtPmNsYXNzLCAiQkVESVQiKTsKLQkgIH0KLQl8IENIRUNLQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gQlNfQ0hFQ0tCT1ggfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19DSEVDS0JPWCB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBDT01CT0JPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IENCU19TSU1QTEUgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSAwOwotCSAgICAgIGNsYXNzID0gQ1RMX0NPTUJPQk9YOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKLQkgICAgaWYgKCQxMSAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQxMTsKLQkgICAgICB9Ci0JICB9Ci0JfCBDT05UUk9MIG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjb250cm9sX3N0eWxlZXhwciBjbnVtZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDYsICQ3LCAkOCwgJDksICQ0LCBzdHlsZSwgJDEwKTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkMTE7Ci0JICAgICQkLT5kYXRhID0gJDEyOwotCSAgfQotCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKLQkgICAgaWYgKCQxMiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpOwotCQkkJC0+ZGF0YSA9ICQxMjsKLQkgICAgICB9Ci0JICAgICQkLT5jbGFzcy5uYW1lZCA9IDE7Ci0gIAkgICAgdW5pY29kZV9mcm9tX2FzY2lpKCYkJC0+Y2xhc3MudS5uLmxlbmd0aCwgJiQkLT5jbGFzcy51Lm4ubmFtZSwgJDUpOwotCSAgfQotCXwgQ09OVFJPTCBvcHRzdHJpbmdjIG51bWV4cHIgJywnIFFVT1RFRFNUUklORyBjb250cm9sX3N0eWxlZXhwcgotCSAgICBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRfY29udHJvbF9kYXRhCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDcsICQ4LCAkOSwgJDEwLCAwLCBzdHlsZSwgJDExKTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoImhlbHAgSUQgcmVxdWlyZXMgRElBTE9HRVgiKTsKLQkgICAgJCQtPmhlbHAgPSAkMTI7Ci0JICAgICQkLT5kYXRhID0gJDEzOwotCSAgICAkJC0+Y2xhc3MubmFtZWQgPSAxOwotICAJICAgIHVuaWNvZGVfZnJvbV9hc2NpaSgmJCQtPmNsYXNzLnUubi5sZW5ndGgsICYkJC0+Y2xhc3MudS5uLm5hbWUsICQ1KTsKLQkgIH0KLQl8IENURVhUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU1NfQ0VOVEVSIHwgV1NfR1JPVVA7Ci0JICAgICAgYmFzZV9zdHlsZSA9IFNTX0NFTlRFUjsKLQkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IERFRlBVU0hCVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19ERUZQVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfREVGUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBFRElUVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBjbGFzcyA9IENUTF9FRElUOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBHUk9VUEJPWAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX0dST1VQQk9YOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU19HUk9VUEJPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IEhFRElUCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgYmFzZV9zdHlsZSA9IEVTX0xFRlQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QOwotCSAgICAgIGNsYXNzID0gQ1RMX0VESVQ7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiSUVESVQgcmVxdWlyZXMgRElBTE9HRVgiKSk7Ci0JICAgIHJlc19zdHJpbmdfdG9faWQgKCYkJC0+Y2xhc3MsICJIRURJVCIpOwotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMiwgJDMsICQ0LCAkNSwgMCwgMCwgQ1RMX1NUQVRJQywKLQkJCQkgU1NfSUNPTiB8IFdTX0NISUxEIHwgV1NfVklTSUJMRSwgMCk7Ci0JICAgIGlmICgkNiAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ2OwotCSAgICAgIH0KLQkgIH0KLQl8IElDT04gb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIGljb25fc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLSAgICAJICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkMywgJDQsICQ1LCAkNiwgJDcsIENUTF9TVEFUSUMsCi0JCQkJIHN0eWxlLCAkOSk7Ci0JICAgIGlmICgkMTAgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkJJCQtPmRhdGEgPSAkMTA7Ci0JICAgICAgfQotCSAgfQotCXwgSUNPTiBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgaWNvbl9zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotICAgIAkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgQ1RMX1NUQVRJQywKLQkJCQkgc3R5bGUsICQ5KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkMTA7Ci0JICAgICQkLT5kYXRhID0gJDExOwotCSAgfQotCXwgSUVESVQKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBFU19MRUZUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gRVNfTEVGVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfRURJVDsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgICBpZiAoZGlhbG9nLmV4ID09IE5VTEwpCi0JICAgICAgcmNwYXJzZV93YXJuaW5nIChfKCJJRURJVCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLT5jbGFzcywgIklFRElUIik7Ci0JICB9Ci0JfCBMSVNUQk9YCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKLQkgICAgICBiYXNlX3N0eWxlID0gTEJTX05PVElGWSB8IFdTX0JPUkRFUjsKLQkgICAgICBjbGFzcyA9IENUTF9MSVNUQk9YOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBMVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX0xFRlQgfCBXU19HUk9VUDsKLQkgICAgICBiYXNlX3N0eWxlID0gU1NfTEVGVDsKLQkgICAgICBjbGFzcyA9IENUTF9TVEFUSUM7Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFBVU0hCT1gKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQk9YIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJPWDsKLQkgICAgICBjbGFzcyA9IENUTF9CVVRUT047Ci0JICAgIH0KLQkgICAgY29udHJvbF9wYXJhbXMKLQkgIHsKLQkgICAgJCQgPSAkMzsKLQkgIH0KLQl8IFBVU0hCVVRUT04KLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU19QVVNIQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUFVTSEJVVFRPTiB8IFdTX1RBQlNUT1A7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBSQURJT0JVVFRPTgotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IEJTX1JBRElPQlVUVE9OIHwgV1NfVEFCU1RPUDsKLQkgICAgICBiYXNlX3N0eWxlID0gQlNfUkFESU9CVVRUT047Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBSVEVYVAotCSAgICB7Ci0JICAgICAgZGVmYXVsdF9zdHlsZSA9IFNTX1JJR0hUIHwgV1NfR1JPVVA7Ci0JICAgICAgYmFzZV9zdHlsZSA9IFNTX1JJR0hUOwotCSAgICAgIGNsYXNzID0gQ1RMX1NUQVRJQzsKLQkgICAgfQotCSAgICBjb250cm9sX3BhcmFtcwotCSAgewotCSAgICAkJCA9ICQzOwotCSAgfQotCXwgU0NST0xMQkFSCi0JICAgIHsKLQkgICAgICBkZWZhdWx0X3N0eWxlID0gU0JTX0hPUlo7Ci0JICAgICAgYmFzZV9zdHlsZSA9IDA7Ci0JICAgICAgY2xhc3MgPSBDVExfU0NST0xMQkFSOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBTVEFURTMKLQkgICAgewotCSAgICAgIGRlZmF1bHRfc3R5bGUgPSBCU18zU1RBVEUgfCBXU19UQUJTVE9QOwotCSAgICAgIGJhc2Vfc3R5bGUgPSBCU18zU1RBVEU7Ci0JICAgICAgY2xhc3MgPSBDVExfQlVUVE9OOwotCSAgICB9Ci0JICAgIGNvbnRyb2xfcGFyYW1zCi0JICB7Ci0JICAgICQkID0gJDM7Ci0JICB9Ci0JfCBVU0VSQlVUVE9OIFFVT1RFRFNUUklORyAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcKLQkgICAgbnVtZXhwciAnLCcgbnVtZXhwciAnLCcgCi0JICAgIHsgc3R5bGUgPSBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KLQkgICAgc3R5bGVleHByIG9wdGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX2NvbnRyb2wgKCQyLCAkNCwgJDYsICQ4LCAkMTAsICQxMiwgQ1RMX0JVVFRPTiwKLQkJCQkgc3R5bGUsICQxNik7Ci0JICB9Ci0JOwotCi0vKiBQYXJhbWV0ZXJzIGZvciBhIGNvbnRyb2wuICBUaGUgc3RhdGljIHZhcmlhYmxlcyBERUZBVUxUX1NUWUxFLAotICAgQkFTRV9TVFlMRSwgYW5kIENMQVNTIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgbm9udGVybWluYWwKLSAgIGlzIHVzZWQuICBERUZBVUxUX1NUWUxFIGlzIHRoZSBzdHlsZSB0byB1c2UgaWYgbm8gc3R5bGUgZXhwcmVzc2lvbgotICAgaXMgc3BlY2lmaWVkLiAgQkFTRV9TVFlMRSBpcyB0aGUgYmFzZSBzdHlsZSB0byB1c2UgaWYgYSBzdHlsZQotICAgZXhwcmVzc2lvbiBpcyBzcGVjaWZpZWQ7IHRoZSBzdHlsZSBleHByZXNzaW9uIG1vZGlmaWVzIHRoZSBiYXNlCi0gICBzdHlsZS4gIENMQVNTIGlzIHRoZSBjbGFzcyBvZiB0aGUgY29udHJvbC4gICovCi0KLWNvbnRyb2xfcGFyYW1zOgotCSAgb3B0c3RyaW5nYyBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICAgIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsCi0JCQkJIGRlZmF1bHRfc3R5bGUgfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUsIDApOwotCSAgICBpZiAoJDcgIT0gTlVMTCkKLQkgICAgICB7Ci0JCWlmIChkaWFsb2cuZXggPT0gTlVMTCkKLQkJICByY3BhcnNlX3dhcm5pbmcgKF8oImNvbnRyb2wgZGF0YSByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkJJCQtPmRhdGEgPSAkNzsKLQkgICAgICB9Ci0JICB9Ci0JfCBvcHRzdHJpbmdjIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgICAgY29udHJvbF9wYXJhbXNfc3R5bGVleHByIG9wdGNudW1leHByIG9wdF9jb250cm9sX2RhdGEKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfY29udHJvbCAoJDEsICQyLCAkMywgJDQsICQ1LCAkNiwgY2xhc3MsIHN0eWxlLCAkOCk7Ci0JICAgIGlmICgkOSAhPSBOVUxMKQotCSAgICAgIHsKLQkJaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCQkgIHJjcGFyc2Vfd2FybmluZyAoXygiY29udHJvbCBkYXRhIHJlcXVpcmVzIERJQUxPR0VYIikpOwotCQkkJC0+ZGF0YSA9ICQ5OwotCSAgICAgIH0KLQkgIH0KLQl8IG9wdHN0cmluZ2MgbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwcgotCSAgICBjb250cm9sX3BhcmFtc19zdHlsZWV4cHIgY251bWV4cHIgY251bWV4cHIgb3B0X2NvbnRyb2xfZGF0YQotCSAgewotCSAgICAkJCA9IGRlZmluZV9jb250cm9sICgkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCBjbGFzcywgc3R5bGUsICQ4KTsKLQkgICAgaWYgKGRpYWxvZy5leCA9PSBOVUxMKQotCSAgICAgIHJjcGFyc2Vfd2FybmluZyAoXygiaGVscCBJRCByZXF1aXJlcyBESUFMT0dFWCIpKTsKLQkgICAgJCQtPmhlbHAgPSAkOTsKLQkgICAgJCQtPmRhdGEgPSAkMTA7Ci0JICB9Ci0JOwotCi1vcHRzdHJpbmdjOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgUVVPVEVEU1RSSU5HICcsJwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotb3B0X2NvbnRyb2xfZGF0YToKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgJCQgPSAkMi5maXJzdDsKLQkgIH0KLQk7Ci0KLS8qIFRoZXNlIG9ubHkgZXhpc3QgdG8gcGFyc2UgYSByZWR1Y3Rpb24gb3V0IG9mIGEgY29tbW9uIGNhc2UuICAqLwotCi1jb250cm9sX3N0eWxlZXhwcjoKLQkgICcsJwotCSAgeyBzdHlsZSA9IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi1pY29uX3N0eWxlZXhwcjoKLQkgICcsJwotCSAgeyBzdHlsZSA9IFNTX0lDT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEU7IH0KLQkgIHN0eWxlZXhwcgotCTsKLQotY29udHJvbF9wYXJhbXNfc3R5bGVleHByOgotCSAgJywnCi0JICB7IHN0eWxlID0gYmFzZV9zdHlsZSB8IFdTX0NISUxEIHwgV1NfVklTSUJMRTsgfQotCSAgc3R5bGVleHByCi0JOwotCi0vKiBGb250IHJlc291cmNlcy4gICovCi0KLWZvbnQ6Ci0JICBpZCBGT05UIG1lbWZsYWdzX21vdmVfZGlzY2FyZCBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX2ZvbnQgKCQxLCAmJDMsICQ0KTsKLQkgIH0KLQk7Ci0KLS8qIEljb24gcmVzb3VyY2VzLiAgKi8KLQotaWNvbjoKLQkgIGlkIElDT04gbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIGZpbGVfbmFtZQotCSAgewotCSAgICBkZWZpbmVfaWNvbiAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogTGFuZ3VhZ2UgY29tbWFuZC4gIFRoaXMgY2hhbmdlcyB0aGUgc3RhdGljIHZhcmlhYmxlIGxhbmd1YWdlLCB3aGljaAotICAgYWZmZWN0cyBhbGwgc3Vic2VxdWVudCByZXNvdXJjZXMuICAqLwotCi1sYW5ndWFnZToKLQkgIExBTkdVQUdFIG51bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgbGFuZ3VhZ2UgPSAkMiB8ICgkMyA8PCA4KTsKLQkgIH0KLQk7Ci0KLS8qIE1lbnUgcmVzb3VyY2VzLiAgKi8KLQotbWVudToKLQkgIGlkIE1FTlUgc3Vib3B0aW9ucyBCRUcgbWVudWl0ZW1zIEVORAotCSAgewotCSAgICBkZWZpbmVfbWVudSAoJDEsICYkMywgJDUpOwotCSAgfQotCTsKLQotbWVudWl0ZW1zOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgbWVudWl0ZW1zIG1lbnVpdGVtCi0JICB7Ci0JICAgIGlmICgkMSA9PSBOVUxMKQotCSAgICAgICQkID0gJDI7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXN0cnVjdCBtZW51aXRlbSAqKnBwOwotCi0JCWZvciAocHAgPSAmJDEtPm5leHQ7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQkJICA7Ci0JCSpwcCA9ICQyOwotCQkkJCA9ICQxOwotCSAgICAgIH0KLQkgIH0KLQk7Ci0KLW1lbnVpdGVtOgotCSAgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIG1lbnVpdGVtX2ZsYWdzCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAwLCAwLCBOVUxMKTsKLQkgIH0KLQl8IE1FTlVJVEVNIFNFUEFSQVRPUgotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoTlVMTCwgMCwgMCwgMCwgMCwgTlVMTCk7Ci0JICB9Ci0JfCBQT1BVUCBRVU9URURTVFJJTkcgbWVudWl0ZW1fZmxhZ3MgQkVHIG1lbnVpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAwLCAkMywgMCwgMCwgJDUpOwotCSAgfQotCTsKLQotbWVudWl0ZW1fZmxhZ3M6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IDA7Ci0JICB9Ci0JfCBtZW51aXRlbV9mbGFncyAnLCcgbWVudWl0ZW1fZmxhZwotCSAgewotCSAgICAkJCA9ICQxIHwgJDM7Ci0JICB9Ci0JfCBtZW51aXRlbV9mbGFncyBtZW51aXRlbV9mbGFnCi0JICB7Ci0JICAgICQkID0gJDEgfCAkMjsKLQkgIH0KLQk7Ci0KLW1lbnVpdGVtX2ZsYWc6Ci0JICBDSEVDS0VECi0JICB7Ci0JICAgICQkID0gTUVOVUlURU1fQ0hFQ0tFRDsKLQkgIH0KLQl8IEdSQVlFRAotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX0dSQVlFRDsKLQkgIH0KLQl8IEhFTFAKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9IRUxQOwotCSAgfQotCXwgSU5BQ1RJVkUKLQkgIHsKLQkgICAgJCQgPSBNRU5VSVRFTV9JTkFDVElWRTsKLQkgIH0KLQl8IE1FTlVCQVJCUkVBSwotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCQVJCUkVBSzsKLQkgIH0KLQl8IE1FTlVCUkVBSwotCSAgewotCSAgICAkJCA9IE1FTlVJVEVNX01FTlVCUkVBSzsKLQkgIH0KLQk7Ci0KLS8qIE1lbnVleCByZXNvdXJjZXMuICAqLwotCi1tZW51ZXg6Ci0JICBpZCBNRU5VRVggc3Vib3B0aW9ucyBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgIGRlZmluZV9tZW51ICgkMSwgJiQzLCAkNSk7Ci0JICB9Ci0JOwotCi1tZW51ZXhpdGVtczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gTlVMTDsKLQkgIH0KLQl8IG1lbnVleGl0ZW1zIG1lbnVleGl0ZW0KLQkgIHsKLQkgICAgaWYgKCQxID09IE5VTEwpCi0JICAgICAgJCQgPSAkMjsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc3RydWN0IG1lbnVpdGVtICoqcHA7Ci0KLQkJZm9yIChwcCA9ICYkMS0+bmV4dDsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotCQkgIDsKLQkJKnBwID0gJDI7Ci0JCSQkID0gJDE7Ci0JICAgICAgfQotCSAgfQotCTsKLQotbWVudWV4aXRlbToKLQkgIE1FTlVJVEVNIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsIDAsIDAsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsIDAsIDAsIDAsIE5VTEwpOwotCSAgfQotCXwgTUVOVUlURU0gUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIG9wdGNudW1leHByCi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgMCwgTlVMTCk7Ci0JICB9Ci0gCXwgTUVOVUlURU0gU0VQQVJBVE9SCi0gCSAgewotIAkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwpOwotIAkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgMCwgMCwgMCwgMCwgJDQpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgMCwgMCwgMCwgJDUpOwotCSAgfQotCXwgUE9QVVAgUVVPVEVEU1RSSU5HIGNudW1leHByIGNudW1leHByIEJFRyBtZW51ZXhpdGVtcyBFTkQKLQkgIHsKLQkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKCQyLCAkMywgJDQsIDAsIDAsICQ2KTsKLQkgIH0KLQl8IFBPUFVQIFFVT1RFRFNUUklORyBjbnVtZXhwciBjbnVtZXhwciBjbnVtZXhwciBvcHRjbnVtZXhwcgotCSAgICBCRUcgbWVudWV4aXRlbXMgRU5ECi0JICB7Ci0JICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgJDYsICQ4KTsKLQkgIH0KLQk7Ci0KLS8qIE1lc3NhZ2V0YWJsZSByZXNvdXJjZXMuICAqLwotCi1tZXNzYWdldGFibGU6Ci0JICBpZCBNRVNTQUdFVEFCTEUgbWVtZmxhZ3NfbW92ZSBmaWxlX25hbWUKLQkgIHsKLQkgICAgZGVmaW5lX21lc3NhZ2V0YWJsZSAoJDEsICYkMywgJDQpOwotCSAgfQotCTsKLQotLyogUmNkYXRhIHJlc291cmNlcy4gICovCi0KLXJjZGF0YToKLQkgIGlkIFJDREFUQSBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX3JjZGF0YSAoJDEsICYkMywgJDUuZmlyc3QpOwotCSAgfQotCTsKLQotLyogV2UgdXNlIGEgZGlmZmVyZW50IGxleGluZyBhbGdvcml0aG0sIGJlY2F1c2UgcmNkYXRhIHN0cmluZ3MgbWF5Ci0gICBjb250YWluIGVtYmVkZGVkIG51bGwgYnl0ZXMsIGFuZCB3ZSBuZWVkIHRvIGtub3cgdGhlIGxlbmd0aCB0byB1c2UuICAqLwotCi1vcHRyY2RhdGFfZGF0YToKLQkgIHsKLQkgICAgcmNwYXJzZV9yY2RhdGEgKCk7Ci0JICB9Ci0JICBvcHRyY2RhdGFfZGF0YV9pbnQKLQkgIHsKLQkgICAgcmNwYXJzZV9ub3JtYWwgKCk7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi1vcHRyY2RhdGFfZGF0YV9pbnQ6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJC5maXJzdCA9IE5VTEw7Ci0JICAgICQkLmxhc3QgPSBOVUxMOwotCSAgfQotCXwgcmNkYXRhX2RhdGEKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLXJjZGF0YV9kYXRhOgotCSAgU0laRURTVFJJTkcKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfc3RyaW5nICgkMS5zLCAkMS5sZW5ndGgpOwotCSAgICAkJC5maXJzdCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCBzaXplZG51bWV4cHIKLQkgIHsKLQkgICAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotCSAgICByaSA9IGRlZmluZV9yY2RhdGFfbnVtYmVyICgkMS52YWwsICQxLmR3b3JkKTsKLQkgICAgJCQuZmlyc3QgPSByaTsKLQkgICAgJCQubGFzdCA9IHJpOwotCSAgfQotCXwgcmNkYXRhX2RhdGEgJywnIFNJWkVEU1RSSU5HCi0JICB7Ci0JICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLQkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX3N0cmluZyAoJDMucywgJDMubGVuZ3RoKTsKLQkgICAgJCQuZmlyc3QgPSAkMS5maXJzdDsKLQkgICAgJDEubGFzdC0+bmV4dCA9IHJpOwotCSAgICAkJC5sYXN0ID0gcmk7Ci0JICB9Ci0JfCByY2RhdGFfZGF0YSAnLCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0KLQkgICAgcmkgPSBkZWZpbmVfcmNkYXRhX251bWJlciAoJDMudmFsLCAkMy5kd29yZCk7Ci0JICAgICQkLmZpcnN0ID0gJDEuZmlyc3Q7Ci0JICAgICQxLmxhc3QtPm5leHQgPSByaTsKLQkgICAgJCQubGFzdCA9IHJpOwotCSAgfQotCTsKLQotLyogU3RyaW5ndGFibGUgcmVzb3VyY2VzLiAgKi8KLQotc3RyaW5ndGFibGU6Ci0JICBTVFJJTkdUQUJMRSBzdWJvcHRpb25zIEJFRyAKLQkgICAgeyBzdWJfcmVzX2luZm8gPSAkMjsgfQotCSAgICBzdHJpbmdfZGF0YSBFTkQKLQk7Ci0KLXN0cmluZ19kYXRhOgotCSAgLyogZW1wdHkgKi8KLQl8IHN0cmluZ19kYXRhIG51bWV4cHIgUVVPVEVEU1RSSU5HCi0JICB7Ci0JICAgIGRlZmluZV9zdHJpbmd0YWJsZSAoJnN1Yl9yZXNfaW5mbywgJDIsICQzKTsKLQkgIH0KLQl8IHN0cmluZ19kYXRhIG51bWV4cHIgJywnIFFVT1RFRFNUUklORwotCSAgewotCSAgICBkZWZpbmVfc3RyaW5ndGFibGUgKCZzdWJfcmVzX2luZm8sICQyLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBVc2VyIGRlZmluZWQgcmVzb3VyY2VzLiAgV2UgYWNjZXB0IGdlbmVyYWwgc3Vib3B0aW9ucyBpbiB0aGUKLSAgIGZpbGVfbmFtZSBjYXNlIHRvIGtlZXAgdGhlIHBhcnNlciBoYXBweS4gICovCi0KLXVzZXI6Ci0JICBpZCBpZCBzdWJvcHRpb25zIEJFRyBvcHRyY2RhdGFfZGF0YSBFTkQKLQkgIHsKLQkgICAgZGVmaW5lX3VzZXJfZGF0YSAoJDEsICQyLCAmJDMsICQ1LmZpcnN0KTsKLQkgIH0KLQl8IGlkIGlkIHN1Ym9wdGlvbnMgZmlsZV9uYW1lCi0JICB7Ci0JICAgIGRlZmluZV91c2VyX2ZpbGUgKCQxLCAkMiwgJiQzLCAkNCk7Ci0JICB9Ci0JOwotCi0vKiBWZXJzaW9uaW5mbyByZXNvdXJjZXMuICAqLwotCi12ZXJzaW9uaW5mbzoKLQkgIGlkIFZFUlNJT05JTkZPIGZpeGVkdmVyaW5mbyBCRUcgdmVyYmxvY2tzIEVORAotCSAgewotCSAgICBkZWZpbmVfdmVyc2lvbmluZm8gKCQxLCBsYW5ndWFnZSwgJDMsICQ1KTsKLQkgIH0KLQk7Ci0KLWZpeGVkdmVyaW5mbzoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgICQkID0gKChzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKikKLQkJICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvKSkpOwotCSAgICBtZW1zZXQgKCQkLCAwLCBzaXplb2YgKHN0cnVjdCBmaXhlZF92ZXJzaW9uaW5mbykpOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVWRVJTSU9OIG51bWV4cHIgY251bWV4cHIgY251bWV4cHIgY251bWV4cHIKLQkgIHsKLQkgICAgJDEtPmZpbGVfdmVyc2lvbl9tcyA9ICgkMyA8PCAxNikgfCAkNDsKLQkgICAgJDEtPmZpbGVfdmVyc2lvbl9scyA9ICgkNSA8PCAxNikgfCAkNjsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBQUk9EVUNUVkVSU0lPTiBudW1leHByIGNudW1leHByIGNudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbXMgPSAoJDMgPDwgMTYpIHwgJDQ7Ci0JICAgICQxLT5wcm9kdWN0X3ZlcnNpb25fbHMgPSAoJDUgPDwgMTYpIHwgJDY7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRUZMQUdTTUFTSyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX2ZsYWdzX21hc2sgPSAkMzsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IGZpeGVkdmVyaW5mbyBGSUxFRkxBR1MgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV9mbGFncyA9ICQzOwotCSAgICAkJCA9ICQxOwotCSAgfQotCXwgZml4ZWR2ZXJpbmZvIEZJTEVPUyBudW1leHByCi0JICB7Ci0JICAgICQxLT5maWxlX29zID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVRZUEUgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV90eXBlID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBmaXhlZHZlcmluZm8gRklMRVNVQlRZUEUgbnVtZXhwcgotCSAgewotCSAgICAkMS0+ZmlsZV9zdWJ0eXBlID0gJDM7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi0vKiBUbyBoYW5kbGUgdmVyYmxvY2tzIHN1Y2Nlc3NmdWxseSwgdGhlIGxleGVyIGhhbmRsZXMgQkxPQ0sKLSAgIHNwZWNpYWxseS4gIEEgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcwotICAgQkxPQ0tTVFJJTkdGSUxFSU5GTy4gIEEgQkxPQ0sgIlZhckZpbGVJbmZvIiBpcyByZXR1cm5lZCBhcwotICAgQkxPQ0tWQVJGSUxFSU5GTy4gIEEgQkxPQ0sgd2l0aCBzb21lIG90aGVyIHN0cmluZyByZXR1cm5zIEJMT0NLCi0gICB3aXRoIHRoZSBzdHJpbmcgYXMgdGhlIHZhbHVlLiAgKi8KLQotdmVyYmxvY2tzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgdmVyYmxvY2tzIEJMT0NLU1RSSU5HRklMRUlORk8gQkVHIEJMT0NLIEJFRyB2ZXJ2YWxzIEVORCBFTkQKLQkgIHsKLQkgICAgJCQgPSBhcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvICgkMSwgJDQsICQ2KTsKLQkgIH0KLQl8IHZlcmJsb2NrcyBCTE9DS1ZBUkZJTEVJTkZPIEJFRyBWQUxVRSBRVU9URURTVFJJTkcgdmVydHJhbnMgRU5ECi0JICB7Ci0JICAgICQkID0gYXBwZW5kX3Zlcl92YXJmaWxlaW5mbyAoJDEsICQ1LCAkNik7Ci0JICB9Ci0JOwotCi12ZXJ2YWxzOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSBOVUxMOwotCSAgfQotCXwgdmVydmFscyBWQUxVRSBRVU9URURTVFJJTkcgJywnIFFVT1RFRFNUUklORwotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJ2YWwgKCQxLCAkMywgJDUpOwotCSAgfQotCTsKLQotdmVydHJhbnM6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICAkJCA9IE5VTEw7Ci0JICB9Ci0JfCB2ZXJ0cmFucyBjbnVtZXhwciBjbnVtZXhwcgotCSAgewotCSAgICAkJCA9IGFwcGVuZF92ZXJ0cmFucyAoJDEsICQyLCAkMyk7Ci0JICB9Ci0JOwotCi0vKiBBIHJlc291cmNlIElELiAgKi8KLQotaWQ6Ci0JICBwb3NudW1leHByCi0JICB7Ci0JICAgICQkLm5hbWVkID0gMDsKLQkgICAgJCQudS5pZCA9ICQxOwotCSAgfQotCXwgU1RSSU5HCi0JICB7Ci0JICAgIGNoYXIgKmNvcHksICpzOwotCi0JICAgIC8qIEl0IHNlZW1zIHRoYXQgcmVzb3VyY2UgSUQncyBhcmUgZm9yY2VkIHRvIHVwcGVyIGNhc2UuICAqLwotCSAgICBjb3B5ID0geHN0cmR1cCAoJDEpOwotCSAgICBmb3IgKHMgPSBjb3B5OyAqcyAhPSAnXDAnOyBzKyspCi0JICAgICAgaWYgKGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSpzID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKLQkgICAgcmVzX3N0cmluZ190b19pZCAoJiQkLCBjb3B5KTsKLQkgICAgZnJlZSAoY29weSk7Ci0JICB9Ci0JOwotCi0vKiBHZW5lcmljIHN1Ym9wdGlvbnMuICBUaGVzZSBtYXkgYXBwZWFyIGJlZm9yZSB0aGUgQkVHSU4gaW4gYW55Ci0gICBtdWx0aWxpbmUgc3RhdGVtZW50LiAgKi8KLQotc3Vib3B0aW9uczoKLQkgIC8qIGVtcHR5ICovCi0JICB7Ci0JICAgIG1lbXNldCAoJiQkLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfcmVzX2luZm8pKTsKLQkgICAgJCQubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQkgICAgLyogRklYTUU6IElzIHRoaXMgdGhlIHJpZ2h0IGRlZmF1bHQ/ICAqLwotCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEU7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIG1lbWZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247Ci0JICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIENIQVJBQ1RFUklTVElDUyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLmNoYXJhY3RlcmlzdGljcyA9ICQzOwotCSAgfQotCXwgc3Vib3B0aW9ucyBMQU5HVUFHRSBudW1leHByIGNudW1leHByCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICAgICQkLmxhbmd1YWdlID0gJDMgfCAoJDQgPDwgOCk7Ci0JICB9Ci0JfCBzdWJvcHRpb25zIFZFUlNJT05LIG51bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQudmVyc2lvbiA9ICQzOwotCSAgfQotCTsKLQotLyogTWVtb3J5IGZsYWdzIHdoaWNoIGRlZmF1bHQgdG8gTU9WRUFCTEUgYW5kIERJU0NBUkRBQkxFLiAgKi8KLQotbWVtZmxhZ3NfbW92ZV9kaXNjYXJkOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgbWVtc2V0ICgmJCQsIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotCSAgICAkJC5sYW5ndWFnZSA9IGxhbmd1YWdlOwotCSAgICAkJC5tZW1mbGFncyA9IE1FTUZMQUdfTU9WRUFCTEUgfCBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgfQotCXwgbWVtZmxhZ3NfbW92ZV9kaXNjYXJkIG1lbWZsYWcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgICAgJCQubWVtZmxhZ3MgfD0gJDIub247Ci0JICAgICQkLm1lbWZsYWdzICY9fiAkMi5vZmY7Ci0JICB9Ci0JOwotCi0vKiBNZW1vcnkgZmxhZ3Mgd2hpY2ggZGVmYXVsdCB0byBNT1ZFQUJMRS4gICovCi0KLW1lbWZsYWdzX21vdmU6Ci0JICAvKiBlbXB0eSAqLwotCSAgewotCSAgICBtZW1zZXQgKCYkJCwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0JICAgICQkLmxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JICAgICQkLm1lbWZsYWdzID0gTUVNRkxBR19NT1ZFQUJMRTsKLQkgIH0KLQl8IG1lbWZsYWdzX21vdmUgbWVtZmxhZwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgICAkJC5tZW1mbGFncyB8PSAkMi5vbjsKLQkgICAgJCQubWVtZmxhZ3MgJj1+ICQyLm9mZjsKLQkgIH0KLQk7Ci0KLS8qIE1lbW9yeSBmbGFncy4gIFRoaXMgcmV0dXJucyBhIHN0cnVjdCB3aXRoIHR3byBpbnRlZ2VycywgYmVjYXVzZSB3ZQotICAgc29tZXRpbWVzIHdhbnQgdG8gc2V0IGJpdHMgYW5kIHdlIHNvbWV0aW1lcyB3YW50IHRvIGNsZWFyIHRoZW0uICAqLwotCi1tZW1mbGFnOgotCSAgTU9WRUFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCXwgRklYRUQKLQkgIHsKLQkgICAgJCQub24gPSAwOwotCSAgICAkJC5vZmYgPSBNRU1GTEFHX01PVkVBQkxFOwotCSAgfQotCXwgUFVSRQotCSAgewotCSAgICAkJC5vbiA9IE1FTUZMQUdfUFVSRTsKLQkgICAgJCQub2ZmID0gMDsKLQkgIH0KLQl8IElNUFVSRQotCSAgewotCSAgICAkJC5vbiA9IDA7Ci0JICAgICQkLm9mZiA9IE1FTUZMQUdfUFVSRTsKLQkgIH0KLQl8IFBSRUxPQUQKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX1BSRUxPQUQ7Ci0JICAgICQkLm9mZiA9IDA7Ci0JICB9Ci0JfCBMT0FET05DQUxMCi0JICB7Ci0JICAgICQkLm9uID0gMDsKLQkgICAgJCQub2ZmID0gTUVNRkxBR19QUkVMT0FEOwotCSAgfQotCXwgRElTQ0FSREFCTEUKLQkgIHsKLQkgICAgJCQub24gPSBNRU1GTEFHX0RJU0NBUkRBQkxFOwotCSAgICAkJC5vZmYgPSAwOwotCSAgfQotCTsKLQotLyogQSBmaWxlIG5hbWUuICAqLwotCi1maWxlX25hbWU6Ci0JICBRVU9URURTVFJJTkcKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQl8IFNUUklORwotCSAgewotCSAgICAkJCA9ICQxOwotCSAgfQotCTsKLQotLyogQSBzdHlsZSBleHByZXNzaW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBzdGF0aWMgdmFyaWFibGUgU1RZTEUuICBXZSBkbwotICAgaXQgdGhpcyB3YXkgYmVjYXVzZSByYyBhcHBlYXJzIHRvIHBlcm1pdCBhIHN0eWxlIHRvIGJlIHNldCB0bwotICAgc29tZXRoaW5nIGxpa2UKLSAgICAgICBXU19HUk9VUCB8IE5PVCBXU19UQUJTVE9QCi0gICB0byBtZWFuIHRoYXQgYSBkZWZhdWx0IG9mIFdTX1RBQlNUT1Agc2hvdWxkIGJlIHJlbW92ZWQuICBBbnl0aGluZwotICAgd2hpY2ggd2FudHMgdG8gYWNjZXB0IGEgc3R5bGUgbXVzdCBmaXJzdCBzZXQgU1RZTEUgdG8gdGhlIGRlZmF1bHQKLSAgIHZhbHVlLiAgVGhlIHN0eWxlZXhwciBub250ZXJtaW5hbCB3aWxsIGNoYW5nZSBTVFlMRSBhcyBzcGVjaWZpZWQgYnkKLSAgIHRoZSB1c2VyLiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBhY2NlcHQgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGhlcmUsCi0gICBqdXN0IG51bWJlcnMgc2VwYXJhdGVkIGJ5ICd8Jy4gICovCi0KLXN0eWxlZXhwcjoKLQkgIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlIHw9ICQxOwotCSAgfQotCXwgTk9UIHBhcmVubnVtYmVyCi0JICB7Ci0JICAgIHN0eWxlICY9fiAkMjsKLQkgIH0KLQl8IHN0eWxlZXhwciAnfCcgcGFyZW5udW1iZXIKLQkgIHsKLQkgICAgc3R5bGUgfD0gJDM7Ci0JICB9Ci0JfCBzdHlsZWV4cHIgJ3wnIE5PVCBwYXJlbm51bWJlcgotCSAgewotCSAgICBzdHlsZSAmPX4gJDQ7Ci0JICB9Ci0JOwotCi1wYXJlbm51bWJlcjoKLQkgIE5VTUJFUgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQl8ICcoJyBudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCTsKLQotLyogQW4gb3B0aW9uYWwgZXhwcmVzc2lvbiB3aXRoIGEgbGVhZGluZyBjb21tYS4gICovCi0KLW9wdGNudW1leHByOgotCSAgLyogZW1wdHkgKi8KLQkgIHsKLQkgICAgJCQgPSAwOwotCSAgfQotCXwgY251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEuICAqLwotCi1jbnVtZXhwcjoKLQkgICcsJyBudW1leHByCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JOwotCi0vKiBBIHBvc3NpYmx5IG5lZ2F0ZWQgbnVtZXJpYyBleHByZXNzaW9uLiAgKi8KLQotbnVtZXhwcjoKLQkgIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEEgcG9zc2libHkgbmVnYXRlZCBleHByZXNzaW9uIHdpdGggYSBzaXplLiAgKi8KLQotc2l6ZWRudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCAnLScgc2l6ZWRudW1leHByICVwcmVjIE5FRwotCSAgewotCSAgICAkJC52YWwgPSAtICQyLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMi5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAqICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAvICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAlICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnKycgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCArICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnLScgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAtICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnJicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCAmICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnXicgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCBeICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQl8IHNpemVkbnVtZXhwciAnfCcgc2l6ZWRudW1leHByCi0JICB7Ci0JICAgICQkLnZhbCA9ICQxLnZhbCB8ICQzLnZhbDsKLQkgICAgJCQuZHdvcmQgPSAkMS5kd29yZCB8fCAkMy5kd29yZDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2l0aCBhIGxlYWRpbmcgY29tbWEgd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5Ci0gICBuZWdhdGlvbi4gICovCi0KLWNwb3NudW1leHByOgotCSAgJywnIHBvc251bWV4cHIKLQkgIHsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgKi8KLQotcG9zbnVtZXhwcjoKLQkgIHNpemVkcG9zbnVtZXhwcgotCSAgewotCSAgICAkJCA9ICQxLnZhbDsKLQkgIH0KLQk7Ci0KLS8qIEFuIGV4cHJlc3Npb24gd2hpY2ggZG9lcyBub3QgdXNlIHVuYXJ5IG5lZ2F0aW9uLiAgV2Ugc2VwYXJhdGUgdW5hcnkKLSAgIG5lZ2F0aW9uIHRvIGF2b2lkIHBhcnNpbmcgY29uZmxpY3RzIHdoZW4gdHdvIG51bWVyaWMgZXhwcmVzc2lvbnMKLSAgIGFwcGVhciBjb25zZWN1dGl2ZWx5LiAgKi8KLQotc2l6ZWRwb3NudW1leHByOgotCSAgTlVNQkVSCi0JICB7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCAnKCcgc2l6ZWRudW1leHByICcpJwotCSAgewotCSAgICAkJCA9ICQyOwotCSAgfQotCXwgJ34nIHNpemVkbnVtZXhwciAlcHJlYyAnficKLQkgIHsKLQkgICAgJCQudmFsID0gfiAkMi52YWw7Ci0JICAgICQkLmR3b3JkID0gJDIuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyonIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy8nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyUnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJysnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgKyAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJy0nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgLSAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJyYnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgJiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ14nIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgXiAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JfCBzaXplZHBvc251bWV4cHIgJ3wnIHNpemVkbnVtZXhwcgotCSAgewotCSAgICAkJC52YWwgPSAkMS52YWwgfCAkMy52YWw7Ci0JICAgICQkLmR3b3JkID0gJDEuZHdvcmQgfHwgJDMuZHdvcmQ7Ci0JICB9Ci0JOwotCi0lJQotCi0vKiBTZXQgdGhlIGxhbmd1YWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLXZvaWQKLXJjcGFyc2Vfc2V0X2xhbmd1YWdlIChsYW5nKQotICAgICBpbnQgbGFuZzsKLXsKLSAgbGFuZ3VhZ2UgPSBsYW5nOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvcmRjb2ZmLmMgYi9iaW51dGlscy9yZGNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2OGJjNi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDg4OSArMCwwIEBACi0vKiBzdGFicy5jIC0tIFBhcnNlIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgd2hpY2ggcGFyc2VzIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogRklYTUU6IFdlIHNob3VsZCBub3QgbmVlZCB0aGlzIEJGRCBpbnRlcm5hbCBmaWxlLiAgV2UgbmVlZCBpdCBmb3IKLSAgIHRoZSBOX0JUTUFTSywgZXRjLiwgdmFsdWVzLiAgKi8KLSNpbmNsdWRlICJsaWJjb2ZmLmgiCi0KLS8qIFRoZXNlIG1hY3JvcyBleHRyYWN0IHRoZSByaWdodCBtYXNrIGFuZCBzaGlmdHMgZm9yIHRoaXMgQkZELiAgVGhleQotICAgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBsb2NhbCB2YXJpYWJsZSBuYW1lZCBBQkZELiAgVGhpcyBpcyBzbyB0aGF0Ci0gICBtYWNyb3MgbGlrZSBJU0ZDTiBhbmQgREVDUkVGLCBmcm9tIGNvZmYvaW50ZXJuYWwuaCwgd2lsbCB3b3JrCi0gICB3aXRob3V0IG1vZGlmaWNhdGlvbi4gICovCi0jZGVmaW5lIE5fQlRNQVNLIChjb2ZmX2RhdGEgKGFiZmQpLT5sb2NhbF9uX2J0bWFzaykKLSNkZWZpbmUJTl9CVFNIRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fYnRzaGZ0KQotI2RlZmluZQlOX1RNQVNLICAoY29mZl9kYXRhIChhYmZkKS0+bG9jYWxfbl90bWFzaykKLSNkZWZpbmUJTl9UU0hJRlQgKGNvZmZfZGF0YSAoYWJmZCktPmxvY2FsX25fdHNoaWZ0KQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgdGhlIHN5bWJvbHMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQKLSAgIGxvY2F0aW9uIHdpdGhpbiB0aGUgc3ltYm9scy4gICovCi0KLXN0cnVjdCBjb2ZmX3N5bWJvbHMKLXsKLSAgLyogVGhlIHN5bWJvbHMuICAqLwotICBhc3ltYm9sICoqc3ltczsKLSAgLyogVGhlIG51bWJlciBvZiBzeW1ib2xzLiAgKi8KLSAgbG9uZyBzeW1jb3VudDsKLSAgLyogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHN5bWJvbC4gICovCi0gIGxvbmcgc3ltbm87Ci0gIC8qIFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzeW1ib2wgaW4gdGhlIENPRkYgc3ltYm9sIHRhYmxlICh3aGVyZQotICAgICBlYWNoIGF1eGVudCBjb3VudHMgYXMgYSBzeW1ib2wpLiAgKi8KLSAgbG9uZyBjb2ZmX3N5bW5vOwotfTsKLQotLyogVGhlIGxhcmdlc3QgYmFzaWMgdHlwZSB3ZSBhcmUgcHJlcGFyZWQgdG8gaGFuZGxlLiAgKi8KLQotI2RlZmluZSBUX01BWCAoVF9MTkdEQkwpCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBzbG90cy4gICovCi0KLXN0cnVjdCBjb2ZmX3Nsb3RzCi17Ci0gIC8qIE5leHQgc2V0IG9mIHNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKm5leHQ7Ci0gIC8qIFNsb3RzLiAgKi8KLSNkZWZpbmUgQ09GRl9TTE9UUyAoMTYpCi0gIGRlYnVnX3R5cGUgc2xvdHNbQ09GRl9TTE9UU107Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1hcCBzeW1ib2wgaW5kaWNlcyB0byB0eXBlcy4gICovCi0KLXN0cnVjdCBjb2ZmX3R5cGVzCi17Ci0gIC8qIFNsb3RzLiAgKi8KLSAgc3RydWN0IGNvZmZfc2xvdHMgKnNsb3RzOwotICAvKiBCYXNpYyB0eXBlcy4gICovCi0gIGRlYnVnX3R5cGUgYmFzaWNbVF9NQVggKyAxXTsKLX07Ci0KLXN0YXRpYyBkZWJ1Z190eXBlICpjb2ZmX2dldF9zbG90IFBBUkFNUyAoKHN0cnVjdCBjb2ZmX3R5cGVzICosIGludCkpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl90eXBlCi0gIFBBUkFNUyAoKGJmZCAqLCBzdHJ1Y3QgY29mZl9zeW1ib2xzICosIHN0cnVjdCBjb2ZmX3R5cGVzICosIGxvbmcsIGludCwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgYm9vbGVhbiwgUFRSKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBwYXJzZV9jb2ZmX2Jhc2VfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBsb25nLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfc3ltYm9scyAqLCBzdHJ1Y3QgY29mZl90eXBlcyAqLCBpbnQsCi0JICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICosIFBUUikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2VfY29mZl9lbnVtX3R5cGUKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwKLQkgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9jb2ZmX3N5bWJvbAotICBQQVJBTVMgKChiZmQgKiwgc3RydWN0IGNvZmZfdHlwZXMgKiwgYXN5bWJvbCAqLCBsb25nLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9zeW1lbnQgKiwgUFRSLCBkZWJ1Z190eXBlLCBib29sZWFuKSk7Ci0MCi0vKiBSZXR1cm4gdGhlIHNsb3QgZm9yIGEgdHlwZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLWNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBpbmR4KQotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGludCBpbmR4OwotewotICBzdHJ1Y3QgY29mZl9zbG90cyAqKnBwczsKLQotICBwcHMgPSAmdHlwZXMtPnNsb3RzOwotCi0gIHdoaWxlIChpbmR4ID49IENPRkZfU0xPVFMpCi0gICAgewotICAgICAgaWYgKCpwcHMgPT0gTlVMTCkKLQl7Ci0JICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0JICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0JfQotICAgICAgcHBzID0gJigqcHBzKS0+bmV4dDsKLSAgICAgIGluZHggLT0gQ09GRl9TTE9UUzsKLSAgICB9Ci0KLSAgaWYgKCpwcHMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcHBzID0gKHN0cnVjdCBjb2ZmX3Nsb3RzICopIHhtYWxsb2MgKHNpemVvZiAqKnBwcyk7Ci0gICAgICBtZW1zZXQgKCpwcHMsIDAsIHNpemVvZiAqKnBwcyk7Ci0gICAgfQotCi0gIHJldHVybiAoKnBwcyktPnNsb3RzICsgaW5keDsKLX0KLQotLyogUGFyc2UgYSBDT0ZGIHR5cGUgY29kZSBpbiBOVFlQRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwgdXNlYXV4LAotCQkgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIGJvb2xlYW4gdXNlYXV4OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgZGVidWdfdHlwZSB0eXBlOwotCi0gIGlmICgobnR5cGUgJiB+Tl9CVE1BU0spICE9IDApCi0gICAgewotICAgICAgaW50IG5ld3R5cGU7Ci0KLSAgICAgIG5ld3R5cGUgPSBERUNSRUYgKG50eXBlKTsKLQotICAgICAgaWYgKElTUFRSIChudHlwZSkpCi0JewotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIGNvZmZfc3ltbm8sIG5ld3R5cGUsCi0JCQkJICBwYXV4ZW50LCB1c2VhdXgsIGRoYW5kbGUpOwotCSAgdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLCB0eXBlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0ZDTiAobnR5cGUpKQotCXsKLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBuZXd0eXBlLAotCQkJCSAgcGF1eGVudCwgdXNlYXV4LCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKGRoYW5kbGUsIHR5cGUsIChkZWJ1Z190eXBlICopIE5VTEwsCi0JCQkJCSAgIGZhbHNlKTsKLQl9Ci0gICAgICBlbHNlIGlmIChJU0FSWSAobnR5cGUpKQotCXsKLQkgIGludCBuOwotCi0JICBpZiAocGF1eGVudCA9PSBOVUxMKQotCSAgICBuID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIHNob3J0ICpkaW07Ci0JICAgICAgaW50IGk7Ci0KLQkgICAgICAvKiBGSVhNRTogSWYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA9PSAwLCBnZGIgc2V0cwotICAgICAgICAgICAgICAgICB0aGUgY19uYXV4IGZpZWxkIG9mIHRoZSBzeW1lbnQgdG8gMC4gICovCi0KLQkgICAgICAvKiBNb3ZlIHRoZSBkaW1lbnNpb25zIGRvd24sIHNvIHRoYXQgdGhlIG5leHQgYXJyYXkKLSAgICAgICAgICAgICAgICAgcGlja3MgdXAgdGhlIG5leHQgb25lLiAgKi8KLQkgICAgICBkaW0gPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuOwotCSAgICAgIG4gPSBkaW1bMF07Ci0JICAgICAgZm9yIChpID0gMDsgKmRpbSAhPSAwICYmIGkgPCBESU1OVU0gLSAxOyBpKyssIGRpbSsrKQotCQkqZGltID0gKihkaW0gKyAxKTsKLQkgICAgICAqZGltID0gMDsKLQkgICAgfQotCi0JICB0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgY29mZl9zeW1ubywgbmV3dHlwZSwKLQkJCQkgIHBhdXhlbnQsIGZhbHNlLCBkaGFuZGxlKTsKLQkgIHR5cGUgPSBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIHR5cGUsCi0JCQkJCXBhcnNlX2NvZmZfYmFzZV90eXBlIChhYmZkLCBzeW1ib2xzLAotCQkJCQkJCSAgICAgIHR5cGVzLAotCQkJCQkJCSAgICAgIGNvZmZfc3ltbm8sCi0JCQkJCQkJICAgICAgVF9JTlQsCi0JCQkJCQkJICAgICAgTlVMTCwgZGhhbmRsZSksCi0JCQkJCTAsIG4gLSAxLCBmYWxzZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHBhcnNlX2NvZmZfdHlwZTogQmFkIHR5cGUgY29kZSAweCV4XG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBudHlwZSk7Ci0JICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCX0KLQotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gIGlmIChwYXV4ZW50ICE9IE5VTEwgJiYgcGF1eGVudC0+eF9zeW0ueF90YWduZHgubCA+IDApCi0gICAgewotICAgICAgZGVidWdfdHlwZSAqc2xvdDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyB0eXBlLiAgRklYTUU6IGdkYiBjaGVja3MKLQkgdGhhdCB0aGUgY2xhc3MgaXMgbm90IENfU1RSVEFHLCBub3IgQ19VTlRBRywgbm9yIENfRU5UQUcuICAqLwotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBwYXV4ZW50LT54X3N5bS54X3RhZ25keC5sKTsKLSAgICAgIGlmICgqc2xvdCAhPSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuICpzbG90OwotICAgICAgZWxzZQotCXJldHVybiBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsIHNsb3QsIChjb25zdCBjaGFyICopIE5VTEwpOwotICAgIH0KLQotICAvKiBJZiB0aGUgYXV4IGVudHJ5IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBmb3Igc29tZXRoaW5nLCB1c2VhdXggd2lsbAotICAgICBoYXZlIGJlZW4gc2V0IHRvIGZhbHNlLCBpbmRpY2F0aW5nIHRoYXQgcGFyc2VfY29mZl9iYXNlX3R5cGUKLSAgICAgc2hvdWxkIG5vdCB1c2UgaXQuICBXZSBuZWVkIHRvIGRvIGl0IHRoaXMgd2F5LCByYXRoZXIgdGhhbiBzaW1wbHkKLSAgICAgcGFzc2luZyBwYXV4ZW50IGFzIE5VTEwsIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIGhhbmRsZQotICAgICBtdWx0aXBsZSBhcnJheSBkaW1lbnNpb25zIHdoaWxlIHN0aWxsIGRpc2NhcmRpbmcgcGF1eGVudCBhZnRlcgotICAgICBoYXZpbmcgaGFuZGxlZCBhbGwgb2YgdGhlbS4gICovCi0gIGlmICghIHVzZWF1eCkKLSAgICBwYXV4ZW50ID0gTlVMTDsKLQotICByZXR1cm4gcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwKLQkJCSAgICAgICBwYXV4ZW50LCBkaGFuZGxlKTsKLX0KLQotLyogUGFyc2UgYSBiYXNpYyBDT0ZGIHR5cGUgaW4gTlRZUEUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9iYXNlX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBjb2ZmX3N5bW5vLCBudHlwZSwgcGF1eGVudCwKLQkJICAgICAgZGhhbmRsZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2xzICpzeW1ib2xzOwotICAgICBzdHJ1Y3QgY29mZl90eXBlcyAqdHlwZXM7Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBkZWJ1Z190eXBlIHJldDsKLSAgYm9vbGVhbiBzZXRfYmFzaWM7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGRlYnVnX3R5cGUgKnNsb3Q7Ci0KLSAgaWYgKG50eXBlID49IDAKLSAgICAgICYmIG50eXBlIDw9IFRfTUFYCi0gICAgICAmJiB0eXBlcy0+YmFzaWNbbnR5cGVdICE9IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gdHlwZXMtPmJhc2ljW250eXBlXTsKLQotICBzZXRfYmFzaWMgPSB0cnVlOwotICBuYW1lID0gTlVMTDsKLQotICBzd2l0Y2ggKG50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0ID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfTlVMTDoKLSAgICBjYXNlIFRfVk9JRDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2Vfdm9pZF90eXBlIChkaGFuZGxlKTsKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9DSEFSOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NIT1JUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9JTlQ6Ci0gICAgICAvKiBGSVhNRTogUGVyaGFwcyB0aGUgc2l6ZSBzaG91bGQgZGVwZW5kIHVwb24gdGhlIGFyY2hpdGVjdHVyZS4gICovCi0gICAgICByZXQgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBuYW1lID0gImludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9MT05HOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgbmFtZSA9ICJsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0ZMT0FUOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIG5hbWUgPSAiZmxvYXQiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRE9VQkxFOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIG5hbWUgPSAiZG91YmxlIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX0xOR0RCTDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgMTIpOwotICAgICAgbmFtZSA9ICJsb25nIGRvdWJsZSI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VQ0hBUjoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDEsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBjaGFyIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1VTSE9SVDoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBzaG9ydCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VSU5UOgotICAgICAgcmV0ID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgdHJ1ZSk7Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGludCI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVF9VTE9ORzoKLSAgICAgIHJldCA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgbmFtZSA9ICJ1bnNpZ25lZCBsb25nIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUX1NUUlVDVDoKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgdHJ1ZSwgMCwKLQkJCQkgICAgICAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfVU5JT046Ci0gICAgICBpZiAocGF1eGVudCA9PSBOVUxMKQotCXJldCA9IGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGZhbHNlLCAwLCAoZGVidWdfZmllbGQgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LAotCQkJCSAgICAgIGRoYW5kbGUpOwotCi0gICAgICBzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotICAgICAgKnNsb3QgPSByZXQ7Ci0KLSAgICAgIHNldF9iYXNpYyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRfRU5VTToKLSAgICAgIGlmIChwYXV4ZW50ID09IE5VTEwpCi0JcmV0ID0gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIChjb25zdCBjaGFyICoqKSBOVUxMLAotCQkJCSAgICAoYmZkX3NpZ25lZF92bWEgKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JcmV0ID0gcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKTsKLQotICAgICAgc2xvdCA9IGNvZmZfZ2V0X3Nsb3QgKHR5cGVzLCBjb2ZmX3N5bW5vKTsKLSAgICAgICpzbG90ID0gcmV0OwotCi0gICAgICBzZXRfYmFzaWMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAobmFtZSAhPSBOVUxMKQotICAgIHJldCA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgcmV0KTsKLQotICBpZiAoc2V0X2Jhc2ljCi0gICAgICAmJiBudHlwZSA+PSAwCi0gICAgICAmJiBudHlwZSA8PSBUX01BWCkKLSAgICB0eXBlcy0+YmFzaWNbbnR5cGVdID0gcmV0OwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFBhcnNlIGEgc3RydWN0IHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9zdHJ1Y3RfdHlwZSAoYWJmZCwgc3ltYm9scywgdHlwZXMsIG50eXBlLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgaW50IG50eXBlOwotICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXhlbnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBsb25nIHN5bWVuZDsKLSAgaW50IGFsbG9jOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICBpbnQgY291bnQ7Ci0gIGJvb2xlYW4gZG9uZTsKLQotICBzeW1lbmQgPSBwYXV4ZW50LT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sOwotCi0gIGFsbG9jID0gMTA7Ci0gIGZpZWxkcyA9IChkZWJ1Z19maWVsZCAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqZmllbGRzKTsKLSAgY291bnQgPSAwOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZQotCSAmJiBzeW1ib2xzLT5jb2ZmX3N5bW5vIDwgc3ltZW5kCi0JICYmIHN5bWJvbHMtPnN5bW5vIDwgc3ltYm9scy0+c3ltY291bnQpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgbG9uZyB0aGlzX2NvZmZfc3ltbm87Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBzdWJhdXg7Ci0gICAgICBiZmRfdm1hIGJpdHBvcyA9IDAsIGJpdHNpemUgPSAwOwotCi0gICAgICBzeW0gPSBzeW1ib2xzLT5zeW1zW3N5bWJvbHMtPnN5bW5vXTsKLQotICAgICAgaWYgKCEgYmZkX2NvZmZfZ2V0X3N5bWVudCAoYWJmZCwgc3ltLCAmc3ltZW50KSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfc3ltZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotCi0gICAgICB0aGlzX2NvZmZfc3ltbm8gPSBzeW1ib2xzLT5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMtPnN5bW5vOwotICAgICAgc3ltYm9scy0+Y29mZl9zeW1ubyArPSAxICsgc3ltZW50Lm5fbnVtYXV4OwotCi0gICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JcHN1YmF1eCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCEgYmZkX2NvZmZfZ2V0X2F1eGVudCAoYWJmZCwgc3ltLCAwLCAmYXV4ZW50KSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9hdXhlbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICBwc3ViYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfTU9TOgotCWNhc2UgQ19NT1U6Ci0JICBiaXRwb3MgPSA4ICogYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJRUxEOgotCSAgYml0cG9zID0gYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSk7Ci0JICBiaXRzaXplID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfRU9TOgotCSAgZG9uZSA9IHRydWU7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmICghIGRvbmUpCi0JewotCSAgZGVidWdfdHlwZSBmdHlwZTsKLQkgIGRlYnVnX2ZpZWxkIGY7Ci0KLQkgIGZ0eXBlID0gcGFyc2VfY29mZl90eXBlIChhYmZkLCBzeW1ib2xzLCB0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgIHN5bWVudC5uX3R5cGUsIHBzdWJhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgZiA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIGZ0eXBlLAotCQkJCWJpdHBvcywgYml0c2l6ZSwgREVCVUdfVklTSUJJTElUWV9QVUJMSUMpOwotCSAgaWYgKGYgPT0gREVCVUdfRklFTERfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgaWYgKGNvdW50ICsgMSA+PSBhbGxvYykKLQkgICAgewotCSAgICAgIGFsbG9jICs9IDEwOwotCSAgICAgIGZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJCXhyZWFsbG9jIChmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQkgICAgfQotCi0JICBmaWVsZHNbY291bnRdID0gZjsKLQkgICsrY291bnQ7Ci0JfQotICAgIH0KLQotICBmaWVsZHNbY291bnRdID0gREVCVUdfRklFTERfTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9zdHJ1Y3RfdHlwZSAoZGhhbmRsZSwgbnR5cGUgPT0gVF9TVFJVQ1QsCi0JCQkJIHBhdXhlbnQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplLAotCQkJCSBmaWVsZHMpOwotfQotCi0vKiBQYXJzZSBhbiBlbnVtIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2VfY29mZl9lbnVtX3R5cGUgKGFiZmQsIHN5bWJvbHMsIHR5cGVzLCBwYXV4ZW50LCBkaGFuZGxlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbHMgKnN5bWJvbHM7Ci0gICAgIHN0cnVjdCBjb2ZmX3R5cGVzICp0eXBlczsKLSAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICpwYXV4ZW50OwotICAgICBQVFIgZGhhbmRsZTsKLXsKLSAgbG9uZyBzeW1lbmQ7Ci0gIGludCBhbGxvYzsKLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsczsKLSAgaW50IGNvdW50OwotICBib29sZWFuIGRvbmU7Ci0KLSAgc3ltZW5kID0gcGF1eGVudC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgubDsKLQotICBhbGxvYyA9IDEwOwotICBuYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotICB2YWxzID0gKGJmZF9zaWduZWRfdm1hICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICp2YWxzKTsKLSAgY291bnQgPSAwOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZQotCSAmJiBzeW1ib2xzLT5jb2ZmX3N5bW5vIDwgc3ltZW5kCi0JICYmIHN5bWJvbHMtPnN5bW5vIDwgc3ltYm9scy0+c3ltY291bnQpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltOwotICAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCBzeW1lbnQ7Ci0KLSAgICAgIHN5bSA9IHN5bWJvbHMtPnN5bXNbc3ltYm9scy0+c3ltbm9dOwotCi0gICAgICBpZiAoISBiZmRfY29mZl9nZXRfc3ltZW50IChhYmZkLCBzeW0sICZzeW1lbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGJmZF9jb2ZmX2dldF9zeW1lbnQgZmFpbGVkOiAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0KLSAgICAgICsrc3ltYm9scy0+c3ltbm87Ci0gICAgICBzeW1ib2xzLT5jb2ZmX3N5bW5vICs9IDEgKyBzeW1lbnQubl9udW1hdXg7Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfTU9FOgotCSAgaWYgKGNvdW50ICsgMSA+PSBhbGxvYykKLQkgICAgewotCSAgICAgIGFsbG9jICs9IDEwOwotCSAgICAgIG5hbWVzID0gKChjb25zdCBjaGFyICoqKQotCQkgICAgICAgeHJlYWxsb2MgKG5hbWVzLCBhbGxvYyAqIHNpemVvZiAqbmFtZXMpKTsKLQkgICAgICB2YWxzID0gKChiZmRfc2lnbmVkX3ZtYSAqKQotCQkgICAgICB4cmVhbGxvYyAodmFscywgYWxsb2MgKiBzaXplb2YgKnZhbHMpKTsKLQkgICAgfQotCi0JICBuYW1lc1tjb3VudF0gPSBiZmRfYXN5bWJvbF9uYW1lIChzeW0pOwotCSAgdmFsc1tjb3VudF0gPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICsrY291bnQ7Ci0JICBicmVhazsKLQotCWNhc2UgQ19FT1M6Ci0JICBkb25lID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgbmFtZXNbY291bnRdID0gTlVMTDsKLQotICByZXR1cm4gZGVidWdfbWFrZV9lbnVtX3R5cGUgKGRoYW5kbGUsIG5hbWVzLCB2YWxzKTsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIENPRkYgc3ltYm9sLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX2NvZmZfc3ltYm9sIChhYmZkLCB0eXBlcywgc3ltLCBjb2ZmX3N5bW5vLCBwc3ltZW50LCBkaGFuZGxlLCB0eXBlLAotCQkgICB3aXRoaW5fZnVuY3Rpb24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGNvZmZfdHlwZXMgKnR5cGVzOwotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIGxvbmcgY29mZl9zeW1ubzsKLSAgICAgc3RydWN0IGludGVybmFsX3N5bWVudCAqcHN5bWVudDsKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLSAgICAgYm9vbGVhbiB3aXRoaW5fZnVuY3Rpb247Ci17Ci0gIHN3aXRjaCAocHN5bWVudC0+bl9zY2xhc3MpCi0gICAgewotICAgIGNhc2UgQ19OVUxMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfQVVUTzoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19MT0NBTCwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19HTE9CQUwsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVEFUOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlLAotCQkJCSAgICh3aXRoaW5fZnVuY3Rpb24KLQkJCQkgICAgPyBERUJVR19MT0NBTF9TVEFUSUMKLQkJCQkgICAgOiBERUJVR19TVEFUSUMpLAotCQkJCSAgIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19SRUc6Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICBERUJVR19SRUdJU1RFUiwgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfQVJHOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgYmZkX2FzeW1ib2xfbmFtZSAoc3ltKSwgdHlwZSwKLQkJCQkgICAgREVCVUdfUEFSTV9TVEFDSywgYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX1JFR1BBUk06Ci0gICAgICAvKiBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY29udmVydCB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX25hbWUgKHN5bSksIHR5cGUsCi0JCQkJICAgIERFQlVHX1BBUk1fUkVHLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICB0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlKTsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX1VOVEFHOgotICAgIGNhc2UgQ19FTlRBRzoKLSAgICAgIHsKLQlkZWJ1Z190eXBlICpzbG90OwotCi0JdHlwZSA9IGRlYnVnX3RhZ190eXBlIChkaGFuZGxlLCBiZmRfYXN5bWJvbF9uYW1lIChzeW0pLCB0eXBlKTsKLQlpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQkvKiBTdG9yZSB0aGUgbmFtZWQgdHlwZSBpbnRvIHRoZSBzbG90LCBzbyB0aGF0IHJlZmVyZW5jZXMgZ2V0Ci0gICAgICAgICAgIHRoZSBuYW1lLiAgKi8KLQlzbG90ID0gY29mZl9nZXRfc2xvdCAodHlwZXMsIGNvZmZfc3ltbm8pOwotCSpzbG90ID0gdHlwZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsJCQkJICAgCi19Ci0KLS8qIFRoaXMgaXMgdGhlIG1haW4gcm91dGluZS4gIEl0IGxvb2tzIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZAotICAgaGFuZGxlcyB0aGVtLiAgKi8KLQotYm9vbGVhbgotcGFyc2VfY29mZiAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2xzIHN5bWJvbHM7Ci0gIHN0cnVjdCBjb2ZmX3R5cGVzIHR5cGVzOwotICBpbnQgaTsKLSAgbG9uZyBuZXh0X2NfZmlsZTsKLSAgY29uc3QgY2hhciAqZm5uYW1lOwotICBpbnQgZm5jbGFzczsKLSAgaW50IGZudHlwZTsKLSAgYmZkX3ZtYSBmbmVuZDsKLSAgYWxlbnQgKmxpbmVub3M7Ci0gIGJvb2xlYW4gd2l0aGluX2Z1bmN0aW9uOwotICBsb25nIHRoaXNfY29mZl9zeW1ubzsKLQotICBzeW1ib2xzLnN5bXMgPSBzeW1zOwotICBzeW1ib2xzLnN5bWNvdW50ID0gc3ltY291bnQ7Ci0gIHN5bWJvbHMuc3ltbm8gPSAwOwotICBzeW1ib2xzLmNvZmZfc3ltbm8gPSAwOwotCi0gIHR5cGVzLnNsb3RzID0gTlVMTDsKLSAgZm9yIChpID0gMDsgaSA8PSBUX01BWDsgaSsrKQotICAgIHR5cGVzLmJhc2ljW2ldID0gREVCVUdfVFlQRV9OVUxMOwotCi0gIG5leHRfY19maWxlID0gLTE7Ci0gIGZubmFtZSA9IE5VTEw7Ci0gIGZuY2xhc3MgPSAwOwotICBmbnR5cGUgPSAwOwotICBmbmVuZCA9IDA7Ci0gIGxpbmVub3MgPSBOVUxMOwotICB3aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQotICB3aGlsZSAoc3ltYm9scy5zeW1ubyA8IHN5bWNvdW50KQotICAgIHsKLSAgICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50IHN5bWVudDsKLSAgICAgIHVuaW9uIGludGVybmFsX2F1eGVudCBhdXhlbnQ7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKnBhdXg7Ci0gICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgICAgIHN5bSA9IHN5bXNbc3ltYm9scy5zeW1ub107Ci0KLSAgICAgIGlmICghIGJmZF9jb2ZmX2dldF9zeW1lbnQgKGFiZmQsIHN5bSwgJnN5bWVudCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogYmZkX2NvZmZfZ2V0X3N5bWVudCBmYWlsZWQ6ICVzXG4iKSwKLQkJICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBuYW1lID0gYmZkX2FzeW1ib2xfbmFtZSAoc3ltKTsKLQotICAgICAgdGhpc19jb2ZmX3N5bW5vID0gc3ltYm9scy5jb2ZmX3N5bW5vOwotCi0gICAgICArK3N5bWJvbHMuc3ltbm87Ci0gICAgICBzeW1ib2xzLmNvZmZfc3ltbm8gKz0gMSArIHN5bWVudC5uX251bWF1eDsKLQotICAgICAgLyogV2Ugb25seSB3b3JyeSBhYm91dCB0aGUgZmlyc3QgYXV4ZW50LCBiZWNhdXNlIHRoYXQgaXMgdGhlCi0JIG9ubHkgb25lIHdoaWNoIGlzIHJlbGV2YW50IGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKHN5bWVudC5uX251bWF1eCA9PSAwKQotCXBhdXggPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghIGJmZF9jb2ZmX2dldF9hdXhlbnQgKGFiZmQsIHN5bSwgMCwgJmF1eGVudCkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfY29mZl9nZXRfYXV4ZW50IGZhaWxlZDogJXNcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBwYXV4ID0gJmF1eGVudDsKLQl9Ci0KLSAgICAgIGlmICh0aGlzX2NvZmZfc3ltbm8gPT0gbmV4dF9jX2ZpbGUgJiYgc3ltZW50Lm5fc2NsYXNzICE9IENfRklMRSkKLQl7Ci0JICAvKiBUaGUgbGFzdCBDX0ZJTEUgc3ltYm9sIHBvaW50cyB0byB0aGUgZmlyc3QgZXh0ZXJuYWwKLSAgICAgICAgICAgICBzeW1ib2wuICAqLwotCSAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCAiKmdsb2JhbHMqIikpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoc3ltZW50Lm5fc2NsYXNzKQotCXsKLQljYXNlIENfRUZDTjoKLQljYXNlIENfRVhUREVGOgotCWNhc2UgQ19VTEFCRUw6Ci0JY2FzZSBDX1VTVEFUSUM6Ci0JY2FzZSBDX0xJTkU6Ci0JY2FzZSBDX0FMSUFTOgotCWNhc2UgQ19ISURERU46Ci0JICAvKiBKdXN0IGlnbm9yZSB0aGVzZSBjbGFzc2VzLiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSBDX0ZJTEU6Ci0JICBuZXh0X2NfZmlsZSA9IHN5bWVudC5uX3ZhbHVlOwotCSAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCBuYW1lKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgYnJlYWs7Ci0KLQljYXNlIENfU1RBVDoKLQkgIC8qIElnbm9yZSBzdGF0aWMgc3ltYm9scyB3aXRoIGEgdHlwZSBvZiBUX05VTEwuICBUaGVzZQotICAgICAgICAgICAgIHJlcHJlc2VudCBzZWN0aW9uIGVudHJpZXMuICAqLwotCSAgaWYgKHN5bWVudC5uX3R5cGUgPT0gVF9OVUxMKQotCSAgICBicmVhazsKLQkgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JY2FzZSBDX0VYVDoKLQkgIGlmIChJU0ZDTiAoc3ltZW50Lm5fdHlwZSkpCi0JICAgIHsKLQkgICAgICBmbm5hbWUgPSBuYW1lOwotCSAgICAgIGZuY2xhc3MgPSBzeW1lbnQubl9zY2xhc3M7Ci0JICAgICAgZm50eXBlID0gc3ltZW50Lm5fdHlwZTsKLQkgICAgICBpZiAoc3ltZW50Lm5fbnVtYXV4ID4gMCkKLQkJZm5lbmQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSArIGF1eGVudC54X3N5bS54X21pc2MueF9mc2l6ZTsKLQkgICAgICBlbHNlCi0JCWZuZW5kID0gMDsKLQkgICAgICBsaW5lbm9zID0gQkZEX1NFTkQgKGFiZmQsIF9nZXRfbGluZW5vLCAoYWJmZCwgc3ltKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgIHN5bWVudC5uX3R5cGUsIHBhdXgsIHRydWUsIGRoYW5kbGUpOwotCSAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBpZiAoISBwYXJzZV9jb2ZmX3N5bWJvbCAoYWJmZCwgJnR5cGVzLCBzeW0sIHRoaXNfY29mZl9zeW1ubywgJnN5bWVudCwKLQkJCQkgICBkaGFuZGxlLCB0eXBlLCB3aXRoaW5fZnVuY3Rpb24pKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgQ19GQ046Ci0JICBpZiAoc3RyY21wIChuYW1lLCAiLmJmIikgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChmbm5hbWUgPT0gTlVMTCkKLQkJewotCQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVsZDogLmJmIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iKSwKLQkJCSAgIHByb2dyYW1fbmFtZSwgdGhpc19jb2ZmX3N5bW5vKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCSAgICAgIHR5cGUgPSBwYXJzZV9jb2ZmX3R5cGUgKGFiZmQsICZzeW1ib2xzLCAmdHlwZXMsIHRoaXNfY29mZl9zeW1ubywKLQkJCQkgICAgICBERUNSRUYgKGZudHlwZSksIHBhdXgsIGZhbHNlLCBkaGFuZGxlKTsKLQkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoZGhhbmRsZSwgZm5uYW1lLCB0eXBlLAotCQkJCQkgICBmbmNsYXNzID09IENfRVhULAotCQkJCQkgICBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCSAgICAgIGlmIChsaW5lbm9zICE9IE5VTEwpCi0JCXsKLQkJICBpbnQgYmFzZTsKLQkJICBiZmRfdm1hIGFkZHI7Ci0KLQkJICBpZiAoc3ltZW50Lm5fbnVtYXV4ID09IDApCi0JCSAgICBiYXNlID0gMDsKLQkJICBlbHNlCi0JCSAgICBiYXNlID0gYXV4ZW50Lnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vIC0gMTsKLQotCQkgIGFkZHIgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChhYmZkLCBiZmRfZ2V0X3NlY3Rpb24gKHN5bSkpOwotCi0JCSAgKytsaW5lbm9zOwotCi0JCSAgd2hpbGUgKGxpbmVub3MtPmxpbmVfbnVtYmVyICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9saW5lIChkaGFuZGxlLAotCQkJCQkgICAgICAgbGluZW5vcy0+bGluZV9udW1iZXIgKyBiYXNlLAotCQkJCQkgICAgICAgbGluZW5vcy0+dS5vZmZzZXQgKyBhZGRyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJICAgICAgKytsaW5lbm9zOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBmbm5hbWUgPSBOVUxMOwotCSAgICAgIGxpbmVub3MgPSBOVUxMOwotCSAgICAgIGZuY2xhc3MgPSAwOwotCSAgICAgIGZudHlwZSA9IDA7Ci0KLQkgICAgICB3aXRoaW5fZnVuY3Rpb24gPSB0cnVlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZWYiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgd2l0aGluX2Z1bmN0aW9uKQotCQl7Ci0JCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJWxkOiB1bmV4cGVjdGVkIC5lZlxuIiksCi0JCQkgICBwcm9ncmFtX25hbWUsIHRoaXNfY29mZl9zeW1ubyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkgICAgICBpZiAoYmZkX2FzeW1ib2xfdmFsdWUgKHN5bSkgPiBmbmVuZCkKLQkJZm5lbmQgPSBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKTsKLQkgICAgICBpZiAoISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGZuZW5kKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JICAgICAgZm5lbmQgPSAwOwotCSAgICAgIHdpdGhpbl9mdW5jdGlvbiA9IGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgQ19CTE9DSzoKLQkgIGlmIChzdHJjbXAgKG5hbWUsICIuYmIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfc3RhcnRfYmxvY2sgKGRoYW5kbGUsIGJmZF9hc3ltYm9sX3ZhbHVlIChzeW0pKSkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuZWIiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChkaGFuZGxlLCBiZmRfYXN5bWJvbF92YWx1ZSAoc3ltKSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgdHlwZSA9IHBhcnNlX2NvZmZfdHlwZSAoYWJmZCwgJnN5bWJvbHMsICZ0eXBlcywgdGhpc19jb2ZmX3N5bW5vLAotCQkJCSAgc3ltZW50Lm5fdHlwZSwgcGF1eCwgdHJ1ZSwgZGhhbmRsZSk7Ci0JICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGlmICghIHBhcnNlX2NvZmZfc3ltYm9sIChhYmZkLCAmdHlwZXMsIHN5bSwgdGhpc19jb2ZmX3N5bW5vLCAmc3ltZW50LAotCQkJCSAgIGRoYW5kbGUsIHR5cGUsIHdpdGhpbl9mdW5jdGlvbikpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZGRiZy5jIGIvYmludXRpbHMvcmRkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyOGMzNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZGRiZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qIHJkZGJnLmMgLS0gUmVhZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50byBhIGdlbmVyaWMgZm9ybS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgOTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIHJlYWRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpbnRvIGEgZ2VuZXJpYyBmb3JtLiAgVGhpcwotICAgZmlsZSBrbm93cyBob3cgdG8gZGlnIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3V0IG9mIGFuIG9iamVjdAotICAgZmlsZS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLXN0YXRpYyBib29sZWFuIHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbwotICBQQVJBTVMgKChiZmQgKiwgYXN5bWJvbCAqKiwgbG9uZywgUFRSLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvCi0gIFBBUkFNUyAoKGJmZCAqLCBhc3ltYm9sICoqLCBsb25nLCBQVFIsIGJvb2xlYW4gKikpOwotc3RhdGljIGJvb2xlYW4gcmVhZF9pZWVlX2RlYnVnZ2luZ19pbmZvIFBBUkFNUyAoKGJmZCAqLCBQVFIsIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgc2F2ZV9zdGFiIFBBUkFNUyAoKGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHN0YWJfY29udGV4dCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3NhdmVkX3N0YWJzIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmVhZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZnJvbSBhIEJGRC4gIFJldHVybnMgYSBnZW5lcmljIGRlYnVnZ2luZwotICAgcG9pbnRlci4gICovCi0KLVBUUgotcmVhZF9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXN5bWJvbCAqKnN5bXM7Ci0gICAgIGxvbmcgc3ltY291bnQ7Ci17Ci0gIFBUUiBkaGFuZGxlOwotICBib29sZWFuIGZvdW5kOwotCi0gIGRoYW5kbGUgPSBkZWJ1Z19pbml0ICgpOwotICBpZiAoZGhhbmRsZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmICghIHJlYWRfc2VjdGlvbl9zdGFic19kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgc3ltcywgc3ltY291bnQsIGRoYW5kbGUsCi0JCQkJCSAgICZmb3VuZCkpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKGJmZF9nZXRfZmxhdm91ciAoYWJmZCkgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0gICAgewotICAgICAgaWYgKCEgcmVhZF9zeW1ib2xfc3RhYnNfZGVidWdnaW5nX2luZm8gKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlLAotCQkJCQkgICAgICAmZm91bmQpKQotCXJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2llZWVfZmxhdm91cikKLSAgICB7Ci0gICAgICBpZiAoISByZWFkX2llZWVfZGVidWdnaW5nX2luZm8gKGFiZmQsIGRoYW5kbGUsICZmb3VuZCkpCi0JcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIC8qIFRyeSByZWFkaW5nIHRoZSBDT0ZGIHN5bWJvbHMgaWYgd2UgZGlkbid0IGZpbmQgYW55IHN0YWJzIGluIENPRkYKLSAgICAgc2VjdGlvbnMuICAqLwotICBpZiAoISBmb3VuZAotICAgICAgJiYgYmZkX2dldF9mbGF2b3VyIChhYmZkKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotICAgICAgJiYgc3ltY291bnQgPiAwKQotICAgIHsKLSAgICAgIGlmICghIHBhcnNlX2NvZmYgKGFiZmQsIHN5bXMsIHN5bWNvdW50LCBkaGFuZGxlKSkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKCEgZm91bmQpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gcmVjb2duaXplZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb25cbiIpLAotCSAgICAgICBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcmV0dXJuIGRoYW5kbGU7Ci19Ci0KLS8qIFJlYWQgc3RhYnMgaW4gc2VjdGlvbnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZyb20gYSBCRkQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcmVhZF9zZWN0aW9uX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBzdGF0aWMgc3RydWN0Ci0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnN0cnNlY25hbWU7Ci0gICAgfSBuYW1lc1tdID0geyB7ICIuc3RhYiIsICIuc3RhYnN0ciIgfSB9OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgUFRSIHNoYW5kbGU7Ci0KLSAgKnBmb3VuZCA9IGZhbHNlOwotICBzaGFuZGxlID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIG5hbWVzIC8gc2l6ZW9mIG5hbWVzWzBdOyBpKyspCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYywgKnN0cnNlYzsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVzW2ldLnNlY25hbWUpOwotICAgICAgc3Ryc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIG5hbWVzW2ldLnN0cnNlY25hbWUpOwotICAgICAgaWYgKHNlYyAhPSBOVUxMICYmIHN0cnNlYyAhPSBOVUxMKQotCXsKLQkgIGJmZF9zaXplX3R5cGUgc3RhYnNpemUsIHN0cnNpemU7Ci0JICBiZmRfYnl0ZSAqc3RhYnMsICpzdHJpbmdzOwotCSAgYmZkX2J5dGUgKnN0YWI7Ci0JICBiZmRfc2l6ZV90eXBlIHN0cm9mZiwgbmV4dF9zdHJvZmY7Ci0KLQkgIHN0YWJzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKTsKLQkgIHN0YWJzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKHN0YWJzaXplKTsKLQkgIGlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBzdGFicywgMCwgc3RhYnNpemUpKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwKLQkJICAgICAgIGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBuYW1lc1tpXS5zZWNuYW1lLAotCQkgICAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzdHJzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLQkgIHN0cmluZ3MgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc3Ryc2l6ZSk7Ci0JICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHN0cnNlYywgc3RyaW5ncywgMCwgc3Ryc2l6ZSkpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogJXM6ICVzXG4iLAotCQkgICAgICAgYmZkX2dldF9maWxlbmFtZSAoYWJmZCksIG5hbWVzW2ldLnN0cnNlY25hbWUsCi0JCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBzaGFuZGxlID0gc3RhcnRfc3RhYiAoZGhhbmRsZSwgYWJmZCwgdHJ1ZSwgc3ltcywgc3ltY291bnQpOwotCSAgICAgIGlmIChzaGFuZGxlID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICAqcGZvdW5kID0gdHJ1ZTsKLQotCSAgc3Ryb2ZmID0gMDsKLQkgIG5leHRfc3Ryb2ZmID0gMDsKLQkgIGZvciAoc3RhYiA9IHN0YWJzOyBzdGFiIDwgc3RhYnMgKyBzdGFic2l6ZTsgc3RhYiArPSAxMikKLQkgICAgewotCSAgICAgIGJmZF9zaXplX3R5cGUgc3RyeDsKLQkgICAgICBpbnQgdHlwZTsKLQkgICAgICBpbnQgb3RoZXI7Ci0JICAgICAgaW50IGRlc2M7Ci0JICAgICAgYmZkX3ZtYSB2YWx1ZTsKLQotCSAgICAgIC8qIFRoaXMgY29kZSBwcmVzdW1lcyAzMiBiaXQgdmFsdWVzLiAgKi8KLQotCSAgICAgIHN0cnggPSBiZmRfZ2V0XzMyIChhYmZkLCBzdGFiKTsKLQkgICAgICB0eXBlID0gYmZkX2dldF84IChhYmZkLCBzdGFiICsgNCk7Ci0JICAgICAgb3RoZXIgPSBiZmRfZ2V0XzggKGFiZmQsIHN0YWIgKyA1KTsKLQkgICAgICBkZXNjID0gYmZkX2dldF8xNiAoYWJmZCwgc3RhYiArIDYpOwotCSAgICAgIHZhbHVlID0gYmZkX2dldF8zMiAoYWJmZCwgc3RhYiArIDgpOwotCi0JICAgICAgaWYgKHR5cGUgPT0gMCkKLQkJewotCQkgIC8qIFNwZWNpYWwgdHlwZSAwIHN0YWJzIGluZGljYXRlIHRoZSBvZmZzZXQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBuZXh0IHN0cmluZyB0YWJsZS4gICovCi0JCSAgc3Ryb2ZmID0gbmV4dF9zdHJvZmY7Ci0JCSAgbmV4dF9zdHJvZmYgKz0gdmFsdWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICpmLCAqczsKLQotCQkgIGYgPSBOVUxMOwotCQkgIHMgPSAoY2hhciAqKSBzdHJpbmdzICsgc3Ryb2ZmICsgc3RyeDsKLQkJICB3aGlsZSAoc1tzdHJsZW4gKHMpIC0gMV0gPT0gJ1xcJwotCQkJICYmIHN0YWIgKyAxMiA8IHN0YWJzICsgc3RhYnNpemUpCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKnA7Ci0KLQkJICAgICAgc3RhYiArPSAxMjsKLQkJICAgICAgcCA9IHMgKyBzdHJsZW4gKHMpIC0gMTsKLQkJICAgICAgKnAgPSAnXDAnOwotCQkgICAgICBzID0gY29uY2F0IChzLAotCQkJCSAgKChjaGFyICopIHN0cmluZ3MKLQkJCQkgICArIHN0cm9mZgotCQkJCSAgICsgYmZkX2dldF8zMiAoYWJmZCwgc3RhYikpLAotCQkJCSAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLQkJICAgICAgLyogV2UgaGF2ZSB0byByZXN0b3JlIHRoZSBiYWNrc2xhc2gsIGJlY2F1c2UsIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxpbmtlciBpcyBoYXNoaW5nIHN0YWJzIHN0cmluZ3MsIHdlIG1heQotICAgICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGUgc2FtZSBzdHJpbmcgbW9yZSB0aGFuIG9uY2UuICAqLwotCQkgICAgICAqcCA9ICdcXCc7Ci0KLQkJICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJCWZyZWUgKGYpOwotCQkgICAgICBmID0gczsKLQkJICAgIH0KLQotCQkgIHNhdmVfc3RhYiAodHlwZSwgZGVzYywgdmFsdWUsIHMpOwotCi0JCSAgaWYgKCEgcGFyc2Vfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSwgdHlwZSwgZGVzYywgdmFsdWUsIHMpKQotCQkgICAgewotCQkgICAgICBzdGFiX2NvbnRleHQgKCk7Ci0JCSAgICAgIGZyZWVfc2F2ZWRfc3RhYnMgKCk7Ci0JCSAgICAgIHJldHVybiBmYWxzZTsKLQkJICAgIH0KLQotCQkgIC8qIERvbid0IGZyZWUgZiwgc2luY2UgSSB0aGluayB0aGUgc3RhYnMgY29kZQotICAgICAgICAgICAgICAgICAgICAgZXhwZWN0cyBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgIHN0cmFpZ2h0ZW5lZCBvdXQuICBGSVhNRS4gICovCi0JCX0KLQkgICAgfQotCi0JICBmcmVlX3NhdmVkX3N0YWJzICgpOwotCSAgZnJlZSAoc3RhYnMpOwotCi0JICAvKiBEb24ndCBmcmVlIHN0cmluZ3MsIHNpbmNlIEkgdGhpbmsgdGhlIHN0YWJzIGNvZGUgZXhwZWN0cwotICAgICAgICAgICAgIHRoZSBzdHJpbmdzIHRvIGhhbmcgYXJvdW5kLiAgVGhpcyBzaG91bGQgYmUgc3RyYWlnaHRlbmVkCi0gICAgICAgICAgICAgb3V0LiAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgaWYgKHNoYW5kbGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISBmaW5pc2hfc3RhYiAoZGhhbmRsZSwgc2hhbmRsZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBzdGFicyBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfc3ltYm9sX3N0YWJzX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBzeW1zLCBzeW1jb3VudCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzeW1ib2wgKipzeW1zOwotICAgICBsb25nIHN5bWNvdW50OwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYm9vbGVhbiAqcGZvdW5kOwotewotICBQVFIgc2hhbmRsZTsKLSAgYXN5bWJvbCAqKnBzLCAqKnN5bWVuZDsKLQotICBzaGFuZGxlID0gTlVMTDsKLSAgc3ltZW5kID0gc3ltcyArIHN5bWNvdW50OwotICBmb3IgKHBzID0gc3ltczsgcHMgPCBzeW1lbmQ7IHBzKyspCi0gICAgewotICAgICAgc3ltYm9sX2luZm8gaTsKLQotICAgICAgYmZkX2dldF9zeW1ib2xfaW5mbyAoYWJmZCwgKnBzLCAmaSk7Ci0KLSAgICAgIGlmIChpLnR5cGUgPT0gJy0nKQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0JICBjaGFyICpmOwotCi0JICBpZiAoc2hhbmRsZSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgc2hhbmRsZSA9IHN0YXJ0X3N0YWIgKGRoYW5kbGUsIGFiZmQsIGZhbHNlLCBzeW1zLCBzeW1jb3VudCk7Ci0JICAgICAgaWYgKHNoYW5kbGUgPT0gTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgICpwZm91bmQgPSB0cnVlOwotCi0JICBzID0gaS5uYW1lOwotCSAgZiA9IE5VTEw7Ci0JICB3aGlsZSAoc1tzdHJsZW4gKHMpIC0gMV0gPT0gJ1xcJwotCQkgJiYgcHMgKyAxIDwgc3ltZW5kKQotCSAgICB7Ci0JICAgICAgY2hhciAqc2MsICpuOwotCi0JICAgICAgKytwczsKLQkgICAgICBzYyA9IHhzdHJkdXAgKHMpOwotCSAgICAgIHNjW3N0cmxlbiAoc2MpIC0gMV0gPSAnXDAnOwotCSAgICAgIG4gPSBjb25jYXQgKHNjLCBiZmRfYXN5bWJvbF9uYW1lICgqcHMpLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLQkgICAgICBmcmVlIChzYyk7Ci0JICAgICAgaWYgKGYgIT0gTlVMTCkKLQkJZnJlZSAoZik7Ci0JICAgICAgZiA9IG47Ci0JICAgICAgcyA9IG47Ci0JICAgIH0KLQotCSAgc2F2ZV9zdGFiIChpLnN0YWJfdHlwZSwgaS5zdGFiX2Rlc2MsIGkudmFsdWUsIHMpOwotCi0JICBpZiAoISBwYXJzZV9zdGFiIChkaGFuZGxlLCBzaGFuZGxlLCBpLnN0YWJfdHlwZSwgaS5zdGFiX2Rlc2MsCi0JCQkgICAgaS52YWx1ZSwgcykpCi0JICAgIHsKLQkgICAgICBzdGFiX2NvbnRleHQgKCk7Ci0JICAgICAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgLyogRG9uJ3QgZnJlZSBmLCBzaW5jZSBJIHRoaW5rIHRoZSBzdGFicyBjb2RlIGV4cGVjdHMKLQkgICAgIHN0cmluZ3MgdG8gaGFuZyBhcm91bmQuICBUaGlzIHNob3VsZCBiZSBzdHJhaWdodGVuZWQgb3V0LgotCSAgICAgRklYTUUuICAqLwotCX0KLSAgICB9Ci0KLSAgZnJlZV9zYXZlZF9zdGFicyAoKTsKLQotICBpZiAoc2hhbmRsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICghIGZpbmlzaF9zdGFiIChkaGFuZGxlLCBzaGFuZGxlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWFkIElFRUUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlYWRfaWVlZV9kZWJ1Z2dpbmdfaW5mbyAoYWJmZCwgZGhhbmRsZSwgcGZvdW5kKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIFBUUiBkaGFuZGxlOwotICAgICBib29sZWFuICpwZm91bmQ7Ci17Ci0gIGFzZWN0aW9uICpkc2VjOwotICBiZmRfc2l6ZV90eXBlIHNpemU7Ci0gIGJmZF9ieXRlICpjb250ZW50czsKLQotICAvKiBUaGUgQkZEIGJhY2tlbmQgcHV0cyB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGludG8gYSBzZWN0aW9uCi0gICAgIG5hbWVkIC5kZWJ1Zy4gICovCi0KLSAgZHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmRlYnVnIik7Ci0gIGlmIChkc2VjID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIGRzZWMpOwotICBjb250ZW50cyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChzaXplKTsKLSAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBkc2VjLCBjb250ZW50cywgMCwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIHBhcnNlX2llZWUgKGRoYW5kbGUsIGFiZmQsIGNvbnRlbnRzLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoY29udGVudHMpOwotCi0gICpwZm91bmQgPSB0cnVlOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogUmVjb3JkIHN0YWJzIHN0cmluZ3MsIHNvIHRoYXQgd2UgY2FuIGdpdmUgc29tZSBjb250ZXh0IGZvciBlcnJvcnMuICAqLwotCi0jZGVmaW5lIFNBVkVfU1RBQlNfQ09VTlQgKDE2KQotCi1zdHJ1Y3Qgc2F2ZWRfc3RhYgotewotICBpbnQgdHlwZTsKLSAgaW50IGRlc2M7Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIGNoYXIgKnN0cmluZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2F2ZWRfc3RhYiBzYXZlZF9zdGFic1tTQVZFX1NUQUJTX0NPVU5UXTsKLXN0YXRpYyBpbnQgc2F2ZWRfc3RhYnNfaW5kZXg7Ci0KLS8qIFNhdmUgYSBzdGFicyBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotc2F2ZV9zdGFiICh0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBpbnQgdHlwZTsKLSAgICAgaW50IGRlc2M7Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgaWYgKHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS5zdHJpbmcgIT0gTlVMTCkKLSAgICBmcmVlIChzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nKTsKLSAgc2F2ZWRfc3RhYnNbc2F2ZWRfc3RhYnNfaW5kZXhdLnR5cGUgPSB0eXBlOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uZGVzYyA9IGRlc2M7Ci0gIHNhdmVkX3N0YWJzW3NhdmVkX3N0YWJzX2luZGV4XS52YWx1ZSA9IHZhbHVlOwotICBzYXZlZF9zdGFic1tzYXZlZF9zdGFic19pbmRleF0uc3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLSAgc2F2ZWRfc3RhYnNfaW5kZXggPSAoc2F2ZWRfc3RhYnNfaW5kZXggKyAxKSAlIFNBVkVfU1RBQlNfQ09VTlQ7Ci19Ci0KLS8qIFByb3ZpZGUgY29udGV4dCBmb3IgYW4gZXJyb3IuICAqLwotCi1zdGF0aWMgdm9pZAotc3RhYl9jb250ZXh0ICgpCi17Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0ZGVyciwgXygiTGFzdCBzdGFicyBlbnRyaWVzIGJlZm9yZSBlcnJvcjpcbiIpKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAibl90eXBlIG5fZGVzYyBuX3ZhbHVlICBzdHJpbmdcbiIpOwotCi0gIGkgPSBzYXZlZF9zdGFic19pbmRleDsKLSAgZG8KLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2F2ZWRfc3RhYiAqc3RhYnA7Ci0KLSAgICAgIHN0YWJwID0gc2F2ZWRfc3RhYnMgKyBpOwotICAgICAgaWYgKHN0YWJwLT5zdHJpbmcgIT0gTlVMTCkKLQl7Ci0JICBjb25zdCBjaGFyICpzOwotCi0JICBzID0gYmZkX2dldF9zdGFiX25hbWUgKHN0YWJwLT50eXBlKTsKLQkgIGlmIChzICE9IE5VTEwpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIiUtNnMiLCBzKTsKLQkgIGVsc2UgaWYgKHN0YWJwLT50eXBlID09IDApCi0JICAgIGZwcmludGYgKHN0ZGVyciwgIkhkclN5bSIpOwotCSAgZWxzZQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIlLTZkIiwgc3RhYnAtPnR5cGUpOwotCSAgZnByaW50ZiAoc3RkZXJyLCAiICUtNmQgIiwgc3RhYnAtPmRlc2MpOwotCSAgZnByaW50Zl92bWEgKHN0ZGVyciwgc3RhYnAtPnZhbHVlKTsKLQkgIGlmIChzdGFicC0+dHlwZSAhPSAwKQotCSAgICBmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBzdGFicC0+c3RyaW5nKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0JfQotICAgICAgaSA9IChpICsgMSkgJSBTQVZFX1NUQUJTX0NPVU5UOwotICAgIH0KLSAgd2hpbGUgKGkgIT0gc2F2ZWRfc3RhYnNfaW5kZXgpOwotfQotCi0vKiBGcmVlIHRoZSBzYXZlZCBzdGFiIHN0cmluZ3MuICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV9zYXZlZF9zdGFicyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0FWRV9TVEFCU19DT1VOVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzYXZlZF9zdGFic1tpXS5zdHJpbmcgIT0gTlVMTCkKLQl7Ci0JICBmcmVlIChzYXZlZF9zdGFic1tpXS5zdHJpbmcpOwotCSAgc2F2ZWRfc3RhYnNbaV0uc3RyaW5nID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIHNhdmVkX3N0YWJzX2luZGV4ID0gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3JlYWRlbGYuYyBiL2JpbnV0aWxzL3JlYWRlbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5ODI0ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9yZWFkZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDE1ICswLDAgQEAKLS8qIHJlYWRlbGYuYyAtLSBkaXNwbGF5IGNvbnRlbnRzIG9mIGFuIEVMRiBmb3JtYXQgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBPcmlnaW5hbGx5IGRldmVsb3BlZCBieSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0gICBNb2RpZmljYXRpb25zIGJ5IE5pY2sgQ2xpZnRvbiA8bmlja2NAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qIERlZmluZSBCRkQ2NCBoZXJlLCBldmVuIGlmIG91ciBkZWZhdWx0IGFyY2hpdGVjdHVyZSBpcyAzMiBiaXQgRUxGCi0gICBhcyB0aGlzIHdpbGwgYWxsb3cgdXMgdG8gcmVhZCBpbiBhbmQgcGFyc2UgNjRiaXQgYW5kIDMyYml0IEVMRiBmaWxlcy4gICovCi0jZGVmaW5lIEJGRDY0Ci0jaW5jbHVkZSAiYmZkLmgiCi0KLSNpbmNsdWRlICJlbGYvY29tbW9uLmgiCi0jaW5jbHVkZSAiZWxmL2V4dGVybmFsLmgiCi0jaW5jbHVkZSAiZWxmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgotCi0vKiBUaGUgZm9sbG93aW5nIGhlYWRlcnMgdXNlIHRoZSBlbGYvcmVsb2MtbWFjcm9zLmggZmlsZSB0bwotICAgYXV0b21hdGljYWxseSBnZW5lcmF0ZSByZWxvY2F0aW9uIHJlY29nbml0aW9uIGZ1bmN0aW9ucwotICAgc3VjaCBhcyBlbGZfbWlwc19yZWxvY190eXBlKCkgICovCi0KLSNkZWZpbmUgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi0KLSNpbmNsdWRlICJlbGYvaTM4Ni5oIgotI2luY2x1ZGUgImVsZi92ODUwLmgiCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotI2luY2x1ZGUgImVsZi9taXBzLmgiCi0jaW5jbHVkZSAiZWxmL2FscGhhLmgiCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2luY2x1ZGUgImVsZi9tNjhrLmgiCi0jaW5jbHVkZSAiZWxmL3NwYXJjLmgiCi0jaW5jbHVkZSAiZWxmL20zMnIuaCIKLSNpbmNsdWRlICJlbGYvZDEwdi5oIgotI2luY2x1ZGUgImVsZi9kMzB2LmgiCi0jaW5jbHVkZSAiZWxmL3NoLmgiCi0jaW5jbHVkZSAiZWxmL21uMTAyMDAuaCIKLSNpbmNsdWRlICJlbGYvbW4xMDMwMC5oIgotI2luY2x1ZGUgImVsZi9ocHBhLmgiCi0jaW5jbHVkZSAiZWxmL2FyYy5oIgotI2luY2x1ZGUgImVsZi9mcjMwLmgiCi0jaW5jbHVkZSAiZWxmL21jb3JlLmgiCi0jaW5jbHVkZSAiZWxmL2k5NjAuaCIKLQotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi1jaGFyICogICAgICAgICAgCXByb2dyYW1fbmFtZSA9ICJyZWFkZWxmIjsKLXVuc2lnbmVkIGludCAgICAJZHluYW1pY19hZGRyOwotYmZkX3NpemVfdHlwZSAgCQlkeW5hbWljX3NpemU7Ci11bnNpZ25lZCBpbnQgICAgCXJlbGFfYWRkcjsKLXVuc2lnbmVkIGludCAgICAJcmVsYV9zaXplOwotY2hhciAqICAgICAgICAgIAlkeW5hbWljX3N0cmluZ3M7Ci1jaGFyICoJCQlzdHJpbmdfdGFibGU7Ci11bnNpZ25lZCBsb25nICAgICAgICAgICBudW1fZHluYW1pY19zeW1zOwotRWxmX0ludGVybmFsX1N5bSAqIAlkeW5hbWljX3N5bWJvbHM7Ci1FbGZfSW50ZXJuYWxfU3ltaW5mbyAqCWR5bmFtaWNfc3ltaW5mbzsKLXVuc2lnbmVkIGxvbmcgICAJZHluYW1pY19zeW1pbmZvX29mZnNldDsKLXVuc2lnbmVkIGludAkJZHluYW1pY19zeW1pbmZvX25lbnQ7Ci1jaGFyICAgICAgICAgICAgCXByb2dyYW1faW50ZXJwcmV0ZXIgWzY0XTsKLWludCAgICAgICAgICAgICAJZHluYW1pY19pbmZvW0RUX0pNUFJFTCArIDFdOwotaW50ICAgICAgICAgICAgIAl2ZXJzaW9uX2luZm9bMTZdOwotaW50ICAgICAgICAgICAgIAlsb2FkYWRkciA9IDA7Ci1FbGZfSW50ZXJuYWxfRWhkciAgICAgICBlbGZfaGVhZGVyOwotRWxmX0ludGVybmFsX1NoZHIgKiAgICAgc2VjdGlvbl9oZWFkZXJzOwotRWxmX0ludGVybmFsX0R5biAqICAgICAgZHluYW1pY19zZWdtZW50OwotaW50IAkJCXNob3dfbmFtZTsKLWludCAJCQlkb19keW5hbWljOwotaW50IAkJCWRvX3N5bXM7Ci1pbnQgCQkJZG9fcmVsb2M7Ci1pbnQgCQkJZG9fc2VjdGlvbnM7Ci1pbnQgCQkJZG9fc2VnbWVudHM7Ci1pbnQgCQkJZG9fdXNpbmdfZHluYW1pYzsKLWludCAJCQlkb19oZWFkZXI7Ci1pbnQgCQkJZG9fZHVtcDsKLWludCAJCQlkb192ZXJzaW9uOwotaW50CQkJZG9faGlzdG9ncmFtOwotaW50CQkJZG9fZGVidWdnaW5nOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfaW5mbzsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX2FiYnJldnM7Ci1pbnQgICAgICAgICAgICAgICAgICAgICBkb19kZWJ1Z19saW5lczsKLWludCAgICAgICAgICAgICAgICAgICAgIGRvX2RlYnVnX3B1Ym5hbWVzOwotaW50ICAgICAgICAgICAgICAgICAgICAgZG9fZGVidWdfYXJhbmdlczsKLWludAkJCWlzXzMyYml0X2VsZjsKLQotLyogQSBkeW5hbWljIGFycmF5IG9mIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggc2VjdGlvbnMgcmVxdWlyZSBkdW1waW5nLiAgKi8KLWNoYXIgKgkJCWR1bXBfc2VjdHMgPSBOVUxMOwotdW5zaWduZWQgaW50CQludW1fZHVtcF9zZWN0cyA9IDA7Ci0KLSNkZWZpbmUgSEVYX0RVTVAJKDEgPDwgMCkKLSNkZWZpbmUgRElTQVNTX0RVTVAJKDEgPDwgMSkKLSNkZWZpbmUgREVCVUdfRFVNUAkoMSA8PCAyKQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZHVtYiBjb21waWxlcnMuICAqLwotc3RhdGljIGJmZF92bWEgKCogICAgICAgICBieXRlX2dldCkgICAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBiZmRfdm1hICAgICAgICAgICAgYnl0ZV9nZXRfbGl0dGxlX2VuZGlhbiAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYmZkX3ZtYSAgICAgICAgICAgIGJ5dGVfZ2V0X2JpZ19lbmRpYW4gICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfbWlwc19keW5hbWljX3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfZHluYW1pY190eXBlICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkdW1wX3JlbG9jYXRpb25zICAgICAgICAgICAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBFbGZfSW50ZXJuYWxfU3ltICosIHVuc2lnbmVkIGxvbmcsIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgY2hhciAqICAgICAgICAgICAgIGdldF9maWxlX3R5cGUgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfbWFjaGluZV9uYW1lICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X21hY2hpbmVfZmxhZ3MgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkLCB1bnNpZ25lZCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfbWlwc19zZWdtZW50X3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfc2VnbWVudF90eXBlICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNvbnN0IGNoYXIgKiAgICAgICBnZXRfbWlwc19zZWN0aW9uX3R5cGVfbmFtZSAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqICAgICAgIGdldF9zZWN0aW9uX3R5cGVfbmFtZSAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3N5bWJvbF9iaW5kaW5nICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfc3ltYm9sX3R5cGUgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIHBhcnNlX2FyZ3MgICAgICAgICAgICAgICAgICBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19maWxlX2hlYWRlciAgICAgICAgIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3NlY3Rpb25faGVhZGVycyAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGR5bmFtaWNfc2VnbWVudF9taXBzX3ZhbCAgICBQQVJBTVMgKChFbGZfSW50ZXJuYWxfRHluICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3N5bWJvbF90YWJsZSAgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgcHJvY2Vzc19maWxlICAgICAgICAgICAgICAgIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX3JlbG9jcyAgICAgICAgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIHByb2Nlc3NfdmVyc2lvbl9zZWN0aW9ucyAgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBjaGFyICogICAgICAgICAgICAgZ2V0X3Zlcl9mbGFncyAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfc3ltYm9sX2luZGV4X3R5cGUgICAgICAgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF8zMmJpdF9zZWN0aW9uX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0XzY0Yml0X3NlY3Rpb25faGVhZGVycyAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIGludAkJICBnZXRfMzJiaXRfcHJvZ3JhbV9oZWFkZXJzICAgUEFSQU1TICgoRklMRSAqLCBFbGZfSW50ZXJuYWxfUGhkciAqKSk7Ci1zdGF0aWMgaW50CQkgIGdldF82NGJpdF9wcm9ncmFtX2hlYWRlcnMgICBQQVJBTVMgKChGSUxFICosIEVsZl9JbnRlcm5hbF9QaGRyICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0X2ZpbGVfaGVhZGVyICAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKikpOwotc3RhdGljIEVsZl9JbnRlcm5hbF9TeW0gKiBnZXRfMzJiaXRfZWxmX3N5bWJvbHMgICAgICAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqIGdldF82NGJpdF9lbGZfc3ltYm9scyAgICAgICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgKiAgICAgICAgICAgICAgZ2V0X2R5bmFtaWNfZGF0YSAgICAgICAgICAgIFBBUkFNUyAoKEZJTEUgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50ICAgICAgICAgICAgICAgIGdldF8zMmJpdF9keW5hbWljX3NlZ21lbnQgICBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAgIFBBUkFNUyAoKEZJTEUgKikpOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLXN0YXRpYyBpbnQgCSAgICAgICAgICBkaXNhc3NlbWJsZV9zZWN0aW9uICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCBGSUxFICopKTsKLSNlbmRpZgotc3RhdGljIGludCAJICAgICAgICAgIGR1bXBfc2VjdGlvbiAgICAgICAgICAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotc3RhdGljIGludCAJICAgICAgICAgIGRpc3BsYXlfZGVidWdfc2VjdGlvbiAgICAgICBQQVJBTVMgKChFbGYzMl9JbnRlcm5hbF9TaGRyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2luZm8gICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2xpbmVzICAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2FiYnJldiAgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBkaXNwbGF5X2RlYnVnX2FyYW5nZXMgICAgICAgUEFSQU1TICgoRWxmMzJfSW50ZXJuYWxfU2hkciAqLCB1bnNpZ25lZCBjaGFyICosIEZJTEUgKikpOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgKiAgICBwcm9jZXNzX2FiYnJldl9zZWN0aW9uICAgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nICAgICAgcmVhZF9sZWIxMjggICAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50ICosIGludCkpOwotc3RhdGljIGludCAgICAgICAgICAgICAgICBwcm9jZXNzX2V4dGVuZGVkX2xpbmVfb3AgICAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgcmVzZXRfc3RhdGVfbWFjaGluZSAgICAgICAgIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfVEFHX25hbWUgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfQVRfbmFtZSAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIGNoYXIgKiAgICAgICAgICAgICBnZXRfRk9STV9uYW1lICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBmcmVlX2FiYnJldnMgICAgICAgICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBhZGRfYWJicmV2ICAgICAgICAgICAgICAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgdm9pZCAgICAgICAgICAgICAgIGFkZF9hYmJyZXZfYXR0ciAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqICAgIHJlYWRfYW5kX2Rpc3BsYXlfYXR0ciAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICogICAgZGlzcGxheV9ibG9jayAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZykpOwotc3RhdGljIHZvaWQgICAgICAgICAgICAgICBkZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbiAgUEFSQU1TICgodW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkCQkgIHJlcXVlc3RfZHVtcCAgICAgICAgICAgICAgICBQQVJBTVMgKCh1bnNpZ25lZCBpbnQsIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X2VsZl9jbGFzcyAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X2RhdGFfZW5jb2RpbmcgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogICAgICAgZ2V0X29zYWJpX25hbWUgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIpKTsKLXN0YXRpYyBpbnQJCSAgZ3Vlc3NfaXNfcmVsYSAgICAgICAgICAgICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcpKTsKLQotdHlwZWRlZiBpbnQgRWxmMzJfV29yZDsKLQotI2lmbmRlZiBUUlVFCi0jZGVmaW5lIFRSVUUgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgMAotI2VuZGlmCi0jZGVmaW5lIFVOS05PV04gLTEKLQotI2RlZmluZSBTRUNUSU9OX05BTUUoWCkgCShzdHJpbmdfdGFibGUgKyAoWCktPnNoX25hbWUpCi0KLSNkZWZpbmUgRFRfVkVSU0lPTlRBR0lEWCh0YWcpCShEVF9WRVJORUVETlVNIC0gKHRhZykpCS8qIFJldmVyc2Ugb3JkZXIhICovCi0KLSNkZWZpbmUgQllURV9HRVQoZmllbGQpIAlieXRlX2dldCAoZmllbGQsIHNpemVvZiAoZmllbGQpKQotI2RlZmluZSBCWVRFX0dFVDgoZmllbGQpIAlieXRlX2dldCAoZmllbGQsIC04KQotCi0jZGVmaW5lIE5VTV9FTEVNKGFycmF5KSAJKHNpemVvZiAoYXJyYXkpIC8gc2l6ZW9mICgoYXJyYXkpWzBdKSkKLQotI2RlZmluZSBHRVRfREFUQV9BTExPQyhvZmZzZXQsIHNpemUsIHZhciwgdHlwZSwgcmVhc29uKQkJCVwKLSAgaWYgKGZzZWVrIChmaWxlLCBvZmZzZXQsIFNFRUtfU0VUKSkJCQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIHN0YXJ0IG9mICVzIGF0ICV4XG4iKSwgcmVhc29uLCBvZmZzZXQpOyBcCi0gICAgICByZXR1cm4gMDsJCQkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotICB2YXIgPSAodHlwZSkgbWFsbG9jIChzaXplKTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0gIGlmICh2YXIgPT0gTlVMTCkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nICVkIGJ5dGVzIGZvciAlc1xuIiksIHNpemUsIHJlYXNvbik7IFwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0gCQkJCQkJCQkJXAotIAkJCQkJCQkJCVwKLSAgaWYgKGZyZWFkICh2YXIsIHNpemUsIDEsIGZpbGUpICE9IDEpIAkJCQkJXAotICAgIHsgCQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGluICVkIGJ5dGVzIG9mICVzXG4iKSwgc2l6ZSwgcmVhc29uKTsgCVwKLSAgICAgIGZyZWUgKHZhcik7IAkJCQkJCQlcCi0gICAgICB2YXIgPSBOVUxMOwkJCQkJCQlcCi0gICAgICByZXR1cm4gMDsgCQkJCQkJCVwKLSAgICB9Ci0KLQotI2RlZmluZSBHRVRfREFUQShvZmZzZXQsIHZhciwgcmVhc29uKSAJCQkJCVwKLSAgaWYgKGZzZWVrIChmaWxlLCBvZmZzZXQsIFNFRUtfU0VUKSkJCQkJCVwKLSAgICB7IAkJCQkJCQkJCVwKLSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gc2VlayB0byAleCBmb3IgJXNcbiIpLCBvZmZzZXQsIHJlYXNvbik7CVwKLSAgICAgIHJldHVybiAwOwkJCQkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIGVsc2UgaWYgKGZyZWFkICgmIHZhciwgc2l6ZW9mICh2YXIpLCAxLCBmaWxlKSAhPSAxKQkJCVwKLSAgICB7CQkJCQkJCQkJXAotICAgICAgZXJyb3IgKF8oIlVuYWJsZSB0byByZWFkIGRhdGEgYXQgJXggZm9yICVzXG4iKSwgb2Zmc2V0LCByZWFzb24pOwlcCi0gICAgICByZXR1cm4gMDsJCQkJCQkJCVwKLSAgICB9Ci0KLSNkZWZpbmUgR0VUX0VMRl9TWU1CT0xTKGZpbGUsIG9mZnNldCwgc2l6ZSkJCQlcCi0gIChpc18zMmJpdF9lbGYgPyBnZXRfMzJiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgc2l6ZSkJXAotICAgOiBnZXRfNjRiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgc2l6ZSkpCi0KLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RhdGljIHZvaWQKLWVycm9yIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogRXJyb3I6ICIpLCBwcm9ncmFtX25hbWUpOwotICB2YV9zdGFydCAoYXJncywgbWVzc2FnZSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIG1lc3NhZ2UsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi13YXJuIChjb25zdCBjaGFyICogbWVzc2FnZSwgLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogV2FybmluZzogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBtZXNzYWdlKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZAotZXJyb3IgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqIG1lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBFcnJvcjogIiksIHByb2dyYW1fbmFtZSk7Ci0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgbWVzc2FnZSA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSAgdmZwcmludGYgKHN0ZGVyciwgbWVzc2FnZSwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXdhcm4gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLXsKLSAgY2hhciAqIG1lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnczsKLQotICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBXYXJuaW5nOiAiKSwgcHJvZ3JhbV9uYW1lKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBtZXNzYWdlID0gdmFfYXJnIChhcmdzLCBjaGFyICopOwotICB2ZnByaW50ZiAoc3RkZXJyLCBtZXNzYWdlLCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLSAgcmV0dXJuOwotfQotI2VuZGlmCi0KLXN0YXRpYyBiZmRfdm1hCi1ieXRlX2dldF9saXR0bGVfZW5kaWFuIChmaWVsZCwgc2l6ZSkKLSAgICAgdW5zaWduZWQgY2hhciAqIGZpZWxkOwotICAgICBpbnQgICAgICAgICAgICAgc2l6ZTsKLXsKLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gKiBmaWVsZDsKLQotICAgIGNhc2UgMjoKLSAgICAgIHJldHVybiAgKCh1bnNpZ25lZCBpbnQpIChmaWVsZCBbMF0pKQotCXwgICAgKCgodW5zaWduZWQgaW50KSAoZmllbGQgWzFdKSkgPDwgOCk7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICAvKiBXZSB3YW50IHRvIGV4dHJhY3QgZGF0YSBmcm9tIGFuIDggYnl0ZSB3aWRlIGZpZWxkIGFuZAotCSBwbGFjZSBpdCBpbnRvIGEgNCBieXRlIHdpZGUgZmllbGQuICBTaW5jZSB0aGlzIGlzIGEgbGl0dGxlCi0JIGVuZGlhbiBzb3VyY2Ugd2UgY2FuIGp1dHMgdXNlIHRoZSA0IGJ5dGUgZXh0cmFjdGlvbiBjb2RlLiAgKi8KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICAoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMF0pKQotCXwgICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFsxXSkpIDw8IDgpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzJdKSkgPDwgMTYpCi0JfCAgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzNdKSkgPDwgMjQpOwotCi0gICAgY2FzZSAtODoKLSAgICAgIC8qIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UsIGdlbmVyYXRlZCBieSB0aGUgQllURV9HRVQ4IG1hY3JvLgotCSBJdCBtZWFucyB0aGF0IHdlIGFyZSBsb2FkaW5nIGFuIDggYnl0ZSB2YWx1ZSBmcm9tIGEgZmllbGQKLQkgaW4gYW4gZXh0ZXJuYWwgc3RydWN0dXJlIGludG8gYW4gOCBieXRlIHZhbHVlIGluIGEgZmllbGQKLQkgaW4gYW4gaW50ZXJuYWwgc3RyY3V0dXJlLiAgKi8KLSAgICAgIHJldHVybiAgKChiZmRfdm1hKSAoZmllbGQgWzBdKSkKLQl8ICAgICgoKGJmZF92bWEpIChmaWVsZCBbMV0pKSA8PCA4KQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFsyXSkpIDw8IDE2KQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFszXSkpIDw8IDI0KQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs0XSkpIDw8IDMyKQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs1XSkpIDw8IDQwKQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs2XSkpIDw8IDQ4KQotCXwgICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs3XSkpIDw8IDU2KTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciAoXygiVW5oYW5kbGVkIGRhdGEgbGVuZ3RoOiAlZFxuIiksIHNpemUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgYmZkX3ZtYQotYnl0ZV9nZXRfYmlnX2VuZGlhbiAoZmllbGQsIHNpemUpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBmaWVsZDsKLSAgICAgaW50ICAgICAgICAgICAgIHNpemU7Ci17Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuICogZmllbGQ7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gKCh1bnNpZ25lZCBpbnQpIChmaWVsZCBbMV0pKSB8ICgoKGludCkgKGZpZWxkIFswXSkpIDw8IDgpOwotCi0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuICgodW5zaWduZWQgbG9uZykgKGZpZWxkIFszXSkpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMl0pKSA8PCA4KQotCXwgICAoKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzFdKSkgPDwgMTYpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbMF0pKSA8PCAyNCk7Ci0KLSAgICBjYXNlIDg6Ci0gICAgICAvKiBBbHRob3VnaCB3ZSBhcmUgZXh0cmFjaW5nIGRhdGEgZnJvbSBhbiA4IGJ5dGUgd2lkZSBmaWVsZCwgd2UKLQkgYXJlIHJldHVybmluZyBvbmx5IDQgYnl0ZXMgb2YgZGF0YS4gICovCi0gICAgICByZXR1cm4gKCh1bnNpZ25lZCBsb25nKSAoZmllbGQgWzddKSkKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFs2XSkpIDw8IDgpCi0JfCAgICgoKHVuc2lnbmVkIGxvbmcpIChmaWVsZCBbNV0pKSA8PCAxNikKLQl8ICAgKCgodW5zaWduZWQgbG9uZykgKGZpZWxkIFs0XSkpIDw8IDI0KTsKLQotICAgIGNhc2UgLTg6Ci0gICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlLCBnZW5lcmF0ZWQgYnkgdGhlIEJZVEVfR0VUOCBtYWNyby4KLQkgSXQgbWVhbnMgdGhhdCB3ZSBhcmUgbG9hZGluZyBhbiA4IGJ5dGUgdmFsdWUgZnJvbSBhIGZpZWxkCi0JIGluIGFuIGV4dGVybmFsIHN0cnVjdHVyZSBpbnRvIGFuIDggYnl0ZSB2YWx1ZSBpbiBhIGZpZWxkCi0JIGluIGFuIGludGVybmFsIHN0cmN1dHVyZS4gICovCi0gICAgICByZXR1cm4gKChiZmRfdm1hKSAoZmllbGQgWzddKSkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs2XSkpIDw8IDgpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbNV0pKSA8PCAxNikKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFs0XSkpIDw8IDI0KQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzNdKSkgPDwgMzIpCi0JfCAgICgoKGJmZF92bWEpIChmaWVsZCBbMl0pKSA8PCA0MCkKLQl8ICAgKCgoYmZkX3ZtYSkgKGZpZWxkIFsxXSkpIDw8IDQ4KQotCXwgICAoKChiZmRfdm1hKSAoZmllbGQgWzBdKSkgPDwgNTYpOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yIChfKCJVbmhhbmRsZWQgZGF0YSBsZW5ndGg6ICVkXG4iKSwgc2l6ZSk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci19Ci0KLQotLyogR3Vlc3MgdGhlIHJlbG9jYXRpb24gc2l6ZWQgYmFzZWQgb24gdGhlIHNpemVkIGNvbW1vbmx5IHVzZWQgYnkgdGhlIHNwZWNpZmljIG1hY2hpbmUuICAqLwotc3RhdGljIGludAotZ3Vlc3NfaXNfcmVsYSAoZV9tYWNoaW5lKQotICAgICB1bnNpZ25lZCBsb25nIGVfbWFjaGluZTsKLXsKLSAgc3dpdGNoIChlX21hY2hpbmUpCi0gICAgewotICAgICAgLyogVGFyZ2V0cyB0aGF0IHVzZSBSRUwgcmVsb2NhdGlvbnMuICAqLwotICAgIGNhc2UgRU1fQVJNOgotICAgIGNhc2UgRU1fMzg2OgotICAgIGNhc2UgRU1fNDg2OgotICAgIGNhc2UgRU1fOTYwOgotICAgIGNhc2UgRU1fQ1lHTlVTX00zMlI6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRDEwVjoKLSAgICBjYXNlIEVNX01JUFM6Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIAotICAgICAgLyogVGFyZ2V0cyB0aGF0IHVzZSBSRUxBIHJlbG9jYXRpb25zLiAgKi8KLSAgICBjYXNlIEVNXzY4SzoKLSAgICBjYXNlIEVNX1NQQVJDOgotICAgIGNhc2UgRU1fUFBDOgotICAgIGNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRDMwVjoKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMjAwOgotICAgIGNhc2UgRU1fQ1lHTlVTX01OMTAzMDA6Ci0gICAgY2FzZSBFTV9DWUdOVVNfRlIzMDoKLSAgICBjYXNlIEVNX1NIOgotICAgIGNhc2UgRU1fQUxQSEE6Ci0gICAgY2FzZSBFTV9NQ09SRToKLSAgICAgIHJldHVybiBUUlVFOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHdhcm4gKF8oIkRvbid0IGtub3cgYWJvdXQgcmVsb2NhdGlvbnMgb24gdGhpcyBtYWNoaW5lIGFyY2hpdGVjdHVyZVxuIikpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIHJlbG9jYXRpb24gZGF0YSBmb3VuZCBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC4gICovCi1zdGF0aWMgaW50Ci1kdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0LCByZWxfc2l6ZSwgc3ltdGFiLCBuc3ltcywgc3RydGFiLCBpc19yZWxhKQotICAgICBGSUxFICogICAgICAgICAgICAgZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgIHJlbF9vZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICAgICByZWxfc2l6ZTsKLSAgICAgRWxmX0ludGVybmFsX1N5bSAqIHN5bXRhYjsKLSAgICAgdW5zaWduZWQgbG9uZyAgICAgIG5zeW1zOwotICAgICBjaGFyICogICAgICAgICAgICAgc3RydGFiOwotICAgICBpbnQgICAgICAgICAgICAgICAgaXNfcmVsYTsKLXsKLSAgdW5zaWduZWQgaW50ICAgICAgICBpOwotICBFbGZfSW50ZXJuYWxfUmVsICogIHJlbHM7Ci0gIEVsZl9JbnRlcm5hbF9SZWxhICogcmVsYXM7Ci0KLSAgCi0gIGlmIChpc19yZWxhID09IFVOS05PV04pCi0gICAgaXNfcmVsYSA9IGd1ZXNzX2lzX3JlbGEgKGVsZl9oZWFkZXIuZV9tYWNoaW5lKTsKLQotICBpZiAoaXNfcmVsYSkKLSAgICB7Ci0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIEVsZjMyX0V4dGVybmFsX1JlbGEgKiBlcmVsYXM7Ci0JICAKLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbGFzLAotCQkJICBFbGYzMl9FeHRlcm5hbF9SZWxhICosICJyZWxvY3MiKTsKLQkgIAotCSAgcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVsYSk7Ci0JICAKLQkgIHJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopCi0JICAgIG1hbGxvYyAocmVsX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7Ci0gICAgICAKLQkgIGlmIChyZWxhcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IoXygib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgCi0JICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgICAgewotCSAgICAgIHJlbGFzW2ldLnJfb2Zmc2V0ID0gQllURV9HRVQgKGVyZWxhc1tpXS5yX29mZnNldCk7Ci0JICAgICAgcmVsYXNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfaW5mbyk7Ci0JICAgICAgcmVsYXNbaV0ucl9hZGRlbmQgPSBCWVRFX0dFVCAoZXJlbGFzW2ldLnJfYWRkZW5kKTsKLQkgICAgfQotICAgICAgCi0JICBmcmVlIChlcmVsYXMpOwotICAgICAgCi0JICByZWxzID0gKEVsZl9JbnRlcm5hbF9SZWwgKikgcmVsYXM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIEVsZjY0X0V4dGVybmFsX1JlbGEgKiBlcmVsYXM7Ci0JICAKLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbGFzLAotCQkJICBFbGY2NF9FeHRlcm5hbF9SZWxhICosICJyZWxvY3MiKTsKLQkgIAotCSAgcmVsX3NpemUgPSByZWxfc2l6ZSAvIHNpemVvZiAoRWxmNjRfRXh0ZXJuYWxfUmVsYSk7Ci0JICAKLQkgIHJlbGFzID0gKEVsZl9JbnRlcm5hbF9SZWxhICopCi0JICAgIG1hbGxvYyAocmVsX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9SZWxhKSk7Ci0gICAgICAKLQkgIGlmIChyZWxhcyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IoXygib3V0IG9mIG1lbW9yeSBwYXJzaW5nIHJlbG9jcyIpKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgCi0JICBmb3IgKGkgPSAwOyBpIDwgcmVsX3NpemU7IGkrKykKLQkgICAgewotCSAgICAgIHJlbGFzW2ldLnJfb2Zmc2V0ID0gQllURV9HRVQ4IChlcmVsYXNbaV0ucl9vZmZzZXQpOwotCSAgICAgIHJlbGFzW2ldLnJfaW5mbyAgID0gQllURV9HRVQ4IChlcmVsYXNbaV0ucl9pbmZvKTsKLQkgICAgICByZWxhc1tpXS5yX2FkZGVuZCA9IEJZVEVfR0VUOCAoZXJlbGFzW2ldLnJfYWRkZW5kKTsKLQkgICAgfQotICAgICAgCi0JICBmcmVlIChlcmVsYXMpOwotICAgICAgCi0JICByZWxzID0gKEVsZl9JbnRlcm5hbF9SZWwgKikgcmVsYXM7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpc18zMmJpdF9lbGYpCi0JewotCSAgRWxmMzJfRXh0ZXJuYWxfUmVsICogZXJlbHM7Ci0KLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbHMsCi0JCQkgIEVsZjMyX0V4dGVybmFsX1JlbCAqLCAicmVsb2NzIik7Ci0JICAKLQkgIHJlbF9zaXplID0gcmVsX3NpemUgLyBzaXplb2YgKEVsZjMyX0V4dGVybmFsX1JlbCk7Ci0JICAKLQkgIHJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKQotCSAgICBtYWxsb2MgKHJlbF9zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsKSk7Ci0JICAKLQkgIGlmIChyZWxzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAKLQkgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgcmVsc1tpXS5yX29mZnNldCA9IEJZVEVfR0VUIChlcmVsc1tpXS5yX29mZnNldCk7Ci0JICAgICAgcmVsc1tpXS5yX2luZm8gICA9IEJZVEVfR0VUIChlcmVsc1tpXS5yX2luZm8pOwotCSAgICB9Ci0JICAKLQkgIGZyZWUgKGVyZWxzKTsKLQkgIAotCSAgcmVsYXMgPSAoRWxmX0ludGVybmFsX1JlbGEgKikgcmVsczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgRWxmNjRfRXh0ZXJuYWxfUmVsICogZXJlbHM7Ci0KLQkgIEdFVF9EQVRBX0FMTE9DIChyZWxfb2Zmc2V0LCByZWxfc2l6ZSwgZXJlbHMsCi0JCQkgIEVsZjY0X0V4dGVybmFsX1JlbCAqLCAicmVsb2NzIik7Ci0JICAKLQkgIHJlbF9zaXplID0gcmVsX3NpemUgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlbCk7Ci0JICAKLQkgIHJlbHMgPSAoRWxmX0ludGVybmFsX1JlbCAqKQotCSAgICBtYWxsb2MgKHJlbF9zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfUmVsKSk7Ci0JICAKLQkgIGlmIChyZWxzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IHBhcnNpbmcgcmVsb2NzIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAKLQkgIGZvciAoaSA9IDA7IGkgPCByZWxfc2l6ZTsgaSsrKQotCSAgICB7Ci0JICAgICAgcmVsc1tpXS5yX29mZnNldCA9IEJZVEVfR0VUOCAoZXJlbHNbaV0ucl9vZmZzZXQpOwotCSAgICAgIHJlbHNbaV0ucl9pbmZvICAgPSBCWVRFX0dFVDggKGVyZWxzW2ldLnJfaW5mbyk7Ci0JICAgIH0KLQkgIAotCSAgZnJlZSAoZXJlbHMpOwotCSAgCi0JICByZWxhcyA9IChFbGZfSW50ZXJuYWxfUmVsYSAqKSByZWxzOwotCX0KLSAgICB9Ci0KLSAgaWYgKGlzX3JlbGEpCi0gICAgcHJpbnRmCi0gICAgICAoXygiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lICAgICAgICAgIEFkZGVuZFxuIikpOwotICBlbHNlCi0gICAgcHJpbnRmCi0gICAgICAoXygiICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lXG4iKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJlbF9zaXplOyBpKyspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIHJ0eXBlOwotICAgICAgYmZkX3ZtYSAgICAgIG9mZnNldDsKLSAgICAgIGJmZF92bWEgICAgICBpbmZvOwotICAgICAgYmZkX3ZtYSAgICAgIHN5bXRhYl9pbmRleDsKLSAgICAgIGJmZF92bWEgICAgICB0eXBlOwotICAgICAgCi0gICAgICBpZiAoaXNfcmVsYSkKLQl7Ci0JICBvZmZzZXQgPSByZWxhcyBbaV0ucl9vZmZzZXQ7Ci0JICBpbmZvICAgPSByZWxhcyBbaV0ucl9pbmZvOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvZmZzZXQgPSByZWxzIFtpXS5yX29mZnNldDsKLQkgIGluZm8gICA9IHJlbHMgW2ldLnJfaW5mbzsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChpc18zMmJpdF9lbGYpCi0JewotCSAgdHlwZSAgICAgICAgID0gRUxGMzJfUl9UWVBFIChpbmZvKTsKLQkgIHN5bXRhYl9pbmRleCA9IEVMRjMyX1JfU1lNICAoaW5mbyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHR5cGUgICAgICAgICA9IEVMRjY0X1JfVFlQRSAoaW5mbyk7Ci0JICBzeW10YWJfaW5kZXggPSBFTEY2NF9SX1NZTSAgKGluZm8pOwotCX0KLQotI2lmZGVmIF9iZmRfaW50NjRfbG93Ci0gICAgICBwcmludGYgKCIgICU4LjhseCAgJTUuNWx4ICIsIF9iZmRfaW50NjRfbG93IChvZmZzZXQpLCBfYmZkX2ludDY0X2xvdyAoaW5mbykpOwotI2Vsc2UKLSAgICAgIHByaW50ZiAoIiAgJTguOGx4ICAlNS41bHggIiwgb2Zmc2V0LCBpbmZvKTsKLSNlbmRpZgotICAgICAgCi0gICAgICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotCXsKLQlkZWZhdWx0OgotCSAgcnR5cGUgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19NMzJSOgotCSAgcnR5cGUgPSBlbGZfbTMycl9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV8zODY6Ci0JY2FzZSBFTV80ODY6Ci0JICBydHlwZSA9IGVsZl9pMzg2X3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNXzY4SzoKLQkgIHJ0eXBlID0gZWxmX202OGtfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fOTYwOgotCSAgcnR5cGUgPSBlbGZfaTk2MF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9PTERfU1BBUkNWOToKLQljYXNlIEVNX1NQQVJDMzJQTFVTOgotCWNhc2UgRU1fU1BBUkNWOToKLQljYXNlIEVNX1NQQVJDOgotCSAgcnR5cGUgPSBlbGZfc3BhcmNfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0JICBydHlwZSA9IHY4NTBfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0QxMFY6Ci0JICBydHlwZSA9IGVsZl9kMTB2X3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19EMzBWOgotCSAgcnR5cGUgPSBlbGZfZDMwdl9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9TSDoKLQkgIHJ0eXBlID0gZWxmX3NoX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX0NZR05VU19NTjEwMzAwOgotCSAgcnR5cGUgPSBlbGZfbW4xMDMwMF9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTU4xMDIwMDoKLQkgIHJ0eXBlID0gZWxmX21uMTAyMDBfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0ZSMzA6Ci0JICBydHlwZSA9IGVsZl9mcjMwX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX01DT1JFOgotCSAgcnR5cGUgPSBlbGZfbWNvcmVfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fUFBDOgotCSAgcnR5cGUgPSBlbGZfcHBjX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVNX01JUFM6Ci0JY2FzZSBFTV9NSVBTX1JTNF9CRToKLQkgIHJ0eXBlID0gZWxmX21pcHNfcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQUxQSEE6Ci0JICBydHlwZSA9IGVsZl9hbHBoYV9yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9BUk06Ci0JICBydHlwZSA9IGVsZl9hcm1fcmVsb2NfdHlwZSAodHlwZSk7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX0FSQzoKLQkgIHJ0eXBlID0gZWxmX2FyY19yZWxvY190eXBlICh0eXBlKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9QQVJJU0M6Ci0JICBydHlwZSA9IGVsZl9ocHBhX3JlbG9jX3R5cGUgKHR5cGUpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocnR5cGUgPT0gTlVMTCkKLSNpZmRlZiBfYmZkX2ludDY0X2xvdwkKLQlwcmludGYgKF8oInVucmVjb2duaXNlZDogJS03bHgiKSwgX2JmZF9pbnQ2NF9sb3cgKHR5cGUpKTsKLSNlbHNlCi0JcHJpbnRmIChfKCJ1bnJlY29nbmlzZWQ6ICUtN2x4IiksIHR5cGUpOwotI2VuZGlmCi0gICAgICBlbHNlCi0JcHJpbnRmICgiJS0yMS4yMXMiLCBydHlwZSk7Ci0KLSAgICAgIGlmIChzeW10YWJfaW5kZXgpCi0JewotCSAgaWYgKHN5bXRhYiAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bXRhYl9pbmRleCA+PSBuc3ltcykKLQkJcHJpbnRmICgiIGJhZCBzeW1ib2wgaW5kZXg6ICUwOGx4IiwgKHVuc2lnbmVkIGxvbmcpIHN5bXRhYl9pbmRleCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgRWxmX0ludGVybmFsX1N5bSAqIHBzeW07Ci0KLQkJICBwc3ltID0gc3ltdGFiICsgc3ltdGFiX2luZGV4OwotCQkgIAotCQkgIHByaW50ZiAoIiAlMDhseCAgIiwgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3ZhbHVlKTsKLQkJICAKLQkJICBpZiAocHN5bS0+c3RfbmFtZSA9PSAwKQotCQkgICAgcHJpbnRmICgiJS0yNS4yNXMiLAotCQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgcHN5bS0+c3Rfc2huZHgpKTsKLQkJICBlbHNlIGlmIChzdHJ0YWIgPT0gTlVMTCkKLQkJICAgIHByaW50ZiAoXygiPHN0cmluZyB0YWJsZSBpbmRleCAlM2xkPiIpLCBwc3ltLT5zdF9uYW1lKTsKLQkJICBlbHNlCi0JCSAgICBwcmludGYgKCIlLTI1LjI1cyIsIHN0cnRhYiArIHBzeW0tPnN0X25hbWUpOwotCQkgIAotCQkgIGlmIChpc19yZWxhKQotCQkgICAgcHJpbnRmICgiICsgJWx4IiwgKHVuc2lnbmVkIGxvbmcpIHJlbGFzIFtpXS5yX2FkZGVuZCk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGlzX3JlbGEpCi0JcHJpbnRmICgiJTM0YyVseCIsICcgJywgKHVuc2lnbmVkIGxvbmcpIHJlbGFzW2ldLnJfYWRkZW5kKTsKLQotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0gICAgfQotCi0gIGZyZWUgKHJlbGFzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X21pcHNfZHluYW1pY190eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOiByZXR1cm4gIk1JUFNfUkxEX1ZFUlNJT04iOwotICAgIGNhc2UgRFRfTUlQU19USU1FX1NUQU1QOiByZXR1cm4gIk1JUFNfVElNRV9TVEFNUCI7Ci0gICAgY2FzZSBEVF9NSVBTX0lDSEVDS1NVTTogcmV0dXJuICJNSVBTX0lDSEVDS1NVTSI7Ci0gICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOiByZXR1cm4gIk1JUFNfSVZFUlNJT04iOwotICAgIGNhc2UgRFRfTUlQU19GTEFHUzogcmV0dXJuICJNSVBTX0ZMQUdTIjsKLSAgICBjYXNlIERUX01JUFNfQkFTRV9BRERSRVNTOiByZXR1cm4gIk1JUFNfQkFTRV9BRERSRVNTIjsKLSAgICBjYXNlIERUX01JUFNfTVNZTTogcmV0dXJuICJNSVBTX01TWU0iOwotICAgIGNhc2UgRFRfTUlQU19DT05GTElDVDogcmV0dXJuICJNSVBTX0NPTkZMSUNUIjsKLSAgICBjYXNlIERUX01JUFNfTElCTElTVDogcmV0dXJuICJNSVBTX0xJQkxJU1QiOwotICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzogcmV0dXJuICJNSVBTX0xPQ0FMX0dPVE5PIjsKLSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzogcmV0dXJuICJNSVBTX0NPTkZMSUNUTk8iOwotICAgIGNhc2UgRFRfTUlQU19MSUJMSVNUTk86IHJldHVybiAiTUlQU19MSUJMSVNUTk8iOwotICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzogcmV0dXJuICJNSVBTX1NZTVRBQk5PIjsKLSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzogcmV0dXJuICJNSVBTX1VOUkVGRVhUTk8iOwotICAgIGNhc2UgRFRfTUlQU19HT1RTWU06IHJldHVybiAiTUlQU19HT1RTWU0iOwotICAgIGNhc2UgRFRfTUlQU19ISVBBR0VOTzogcmV0dXJuICJNSVBTX0hJUEFHRU5PIjsKLSAgICBjYXNlIERUX01JUFNfUkxEX01BUDogcmV0dXJuICJNSVBTX1JMRF9NQVAiOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTUzogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NfTk86IHJldHVybiAiTUlQU19ERUxUQV9DTEFTU19OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFOiByZXR1cm4gIk1JUFNfREVMVEFfSU5TVEFOQ0UiOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTzogcmV0dXJuICJNSVBTX0RFTFRBX0lOU1RBTkNFX05PIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0M6IHJldHVybiAiTUlQU19ERUxUQV9SRUxPQyI7Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1JFTE9DX05POiByZXR1cm4gIk1JUFNfREVMVEFfUkVMT0NfTk8iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9TWU06IHJldHVybiAiTUlQU19ERUxUQV9TWU0iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9TWU1fTk86IHJldHVybiAiTUlQU19ERUxUQV9TWU1fTk8iOwotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9DTEFTU1NZTTogcmV0dXJuICJNSVBTX0RFTFRBX0NMQVNTU1lNIjsKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk86IHJldHVybiAiTUlQU19ERUxUQV9DTEFTU1NZTV9OTyI7Ci0gICAgY2FzZSBEVF9NSVBTX0NYWF9GTEFHUzogcmV0dXJuICJNSVBTX0NYWF9GTEFHUyI7Ci0gICAgY2FzZSBEVF9NSVBTX1BJWElFX0lOSVQ6IHJldHVybiAiTUlQU19QSVhJRV9JTklUIjsKLSAgICBjYXNlIERUX01JUFNfU1lNQk9MX0xJQjogcmV0dXJuICJNSVBTX1NZTUJPTF9MSUIiOwotICAgIGNhc2UgRFRfTUlQU19MT0NBTFBBR0VfR09USURYOiByZXR1cm4gIk1JUFNfTE9DQUxQQUdFX0dPVElEWCI7Ci0gICAgY2FzZSBEVF9NSVBTX0xPQ0FMX0dPVElEWDogcmV0dXJuICJNSVBTX0xPQ0FMX0dPVElEWCI7Ci0gICAgY2FzZSBEVF9NSVBTX0hJRERFTl9HT1RJRFg6IHJldHVybiAiTUlQU19ISURERU5fR09USURYIjsKLSAgICBjYXNlIERUX01JUFNfUFJPVEVDVEVEX0dPVElEWDogcmV0dXJuICJNSVBTX1BST1RFQ1RFRF9HT1RJRFgiOwotICAgIGNhc2UgRFRfTUlQU19PUFRJT05TOiByZXR1cm4gIk1JUFNfT1BUSU9OUyI7Ci0gICAgY2FzZSBEVF9NSVBTX0lOVEVSRkFDRTogcmV0dXJuICJNSVBTX0lOVEVSRkFDRSI7Ci0gICAgY2FzZSBEVF9NSVBTX0RZTlNUUl9BTElHTjogcmV0dXJuICJNSVBTX0RZTlNUUl9BTElHTiI7Ci0gICAgY2FzZSBEVF9NSVBTX0lOVEVSRkFDRV9TSVpFOiByZXR1cm4gIk1JUFNfSU5URVJGQUNFX1NJWkUiOwotICAgIGNhc2UgRFRfTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFI6IHJldHVybiAiTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFIiOwotICAgIGNhc2UgRFRfTUlQU19QRVJGX1NVRkZJWDogcmV0dXJuICJNSVBTX1BFUkZfU1VGRklYIjsKLSAgICBjYXNlIERUX01JUFNfQ09NUEFDVF9TSVpFOiByZXR1cm4gIk1JUFNfQ09NUEFDVF9TSVpFIjsKLSAgICBjYXNlIERUX01JUFNfR1BfVkFMVUU6IHJldHVybiAiTUlQU19HUF9WQUxVRSI7Ci0gICAgY2FzZSBEVF9NSVBTX0FVWF9EWU5BTUlDOiByZXR1cm4gIk1JUFNfQVVYX0RZTkFNSUMiOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9keW5hbWljX3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBEVF9OVUxMOglyZXR1cm4gIk5VTEwiOwotICAgIGNhc2UgRFRfTkVFREVEOglyZXR1cm4gIk5FRURFRCI7Ci0gICAgY2FzZSBEVF9QTFRSRUxTWjoJcmV0dXJuICJQTFRSRUxTWiI7Ci0gICAgY2FzZSBEVF9QTFRHT1Q6CXJldHVybiAiUExUR09UIjsKLSAgICBjYXNlIERUX0hBU0g6CXJldHVybiAiSEFTSCI7Ci0gICAgY2FzZSBEVF9TVFJUQUI6CXJldHVybiAiU1RSVEFCIjsKLSAgICBjYXNlIERUX1NZTVRBQjoJcmV0dXJuICJTWU1UQUIiOwotICAgIGNhc2UgRFRfUkVMQToJcmV0dXJuICJSRUxBIjsKLSAgICBjYXNlIERUX1JFTEFTWjoJcmV0dXJuICJSRUxBU1oiOwotICAgIGNhc2UgRFRfUkVMQUVOVDoJcmV0dXJuICJSRUxBRU5UIjsKLSAgICBjYXNlIERUX1NUUlNaOglyZXR1cm4gIlNUUlNaIjsKLSAgICBjYXNlIERUX1NZTUVOVDoJcmV0dXJuICJTWU1FTlQiOwotICAgIGNhc2UgRFRfSU5JVDoJcmV0dXJuICJJTklUIjsKLSAgICBjYXNlIERUX0ZJTkk6CXJldHVybiAiRklOSSI7Ci0gICAgY2FzZSBEVF9TT05BTUU6CXJldHVybiAiU09OQU1FIjsKLSAgICBjYXNlIERUX1JQQVRIOglyZXR1cm4gIlJQQVRIIjsKLSAgICBjYXNlIERUX1NZTUJPTElDOglyZXR1cm4gIlNZTUJPTElDIjsKLSAgICBjYXNlIERUX1JFTDoJcmV0dXJuICJSRUwiOwotICAgIGNhc2UgRFRfUkVMU1o6CXJldHVybiAiUkVMU1oiOwotICAgIGNhc2UgRFRfUkVMRU5UOglyZXR1cm4gIlJFTEVOVCI7Ci0gICAgY2FzZSBEVF9QTFRSRUw6CXJldHVybiAiUExUUkVMIjsKLSAgICBjYXNlIERUX0RFQlVHOglyZXR1cm4gIkRFQlVHIjsKLSAgICBjYXNlIERUX1RFWFRSRUw6CXJldHVybiAiVEVYVFJFTCI7Ci0gICAgY2FzZSBEVF9KTVBSRUw6CXJldHVybiAiSk1QUkVMIjsKLSAgICBjYXNlIERUX0JJTkRfTk9XOiAgIHJldHVybiAiQklORF9OT1ciOwotICAgIGNhc2UgRFRfSU5JVF9BUlJBWTogcmV0dXJuICJJTklUX0FSUkFZIjsKLSAgICBjYXNlIERUX0ZJTklfQVJSQVk6IHJldHVybiAiRklOSV9BUlJBWSI7Ci0gICAgY2FzZSBEVF9JTklUX0FSUkFZU1o6IHJldHVybiAiSU5JVF9BUlJBWVNaIjsKLSAgICBjYXNlIERUX0ZJTklfQVJSQVlTWjogcmV0dXJuICJGSU5JX0FSUkFZU1oiOwotICAgICAgCi0gICAgY2FzZSBEVF9QTFRQQURTWjoJcmV0dXJuICJQTFRQQURTWiI7Ci0gICAgY2FzZSBEVF9NT1ZFRU5UOglyZXR1cm4gIk1PVkVFTlQiOwotICAgIGNhc2UgRFRfTU9WRVNaOglyZXR1cm4gIk1PVkVTWiI7Ci0gICAgY2FzZSBEVF9GRUFUVVJFXzE6CXJldHVybiAiRkVBVFVSRV8xIjsKLSAgICBjYXNlIERUX1BPU0ZMQUdfMToJcmV0dXJuICJQT1NGTEFHXzEiOwotICAgIGNhc2UgRFRfU1lNSU5TWjoJcmV0dXJuICJTWU1JTlNaIjsKLSAgICBjYXNlIERUX1NZTUlORU5UOglyZXR1cm4gIlNZTUlORU5UIjsgLyogYWthIFZBTFJOR0hJICovCi0gICAgICAKLSAgICBjYXNlIERUX0FERFJSTkdMTzogIHJldHVybiAiQUREUlJOR0xPIjsKLSAgICBjYXNlIERUX1NZTUlORk86CXJldHVybiAiU1lNSU5GTyI7IC8qIGFrYSBBRERSUk5HSEkgKi8KLSAgICAgIAotICAgIGNhc2UgRFRfVkVSU1lNOglyZXR1cm4gIlZFUlNZTSI7Ci0gICAgICAKLSAgICBjYXNlIERUX1JFTEFDT1VOVDoJcmV0dXJuICJSRUxBQ09VTlQiOwotICAgIGNhc2UgRFRfUkVMQ09VTlQ6CXJldHVybiAiUkVMQ09VTlQiOwotICAgIGNhc2UgRFRfRkxBR1NfMToJcmV0dXJuICJGTEFHU18xIjsKLSAgICBjYXNlIERUX1ZFUkRFRjoJcmV0dXJuICJWRVJERUYiOwotICAgIGNhc2UgRFRfVkVSREVGTlVNOglyZXR1cm4gIlZFUkRFRk5VTSI7Ci0gICAgY2FzZSBEVF9WRVJORUVEOglyZXR1cm4gIlZFUk5FRUQiOwotICAgIGNhc2UgRFRfVkVSTkVFRE5VTToJcmV0dXJuICJWRVJORUVETlVNIjsKLSAgICAgIAotICAgIGNhc2UgRFRfQVVYSUxJQVJZOglyZXR1cm4gIkFVWElMQVJZIjsKLSAgICBjYXNlIERUX1VTRUQ6CXJldHVybiAiVVNFRCI7Ci0gICAgY2FzZSBEVF9GSUxURVI6CXJldHVybiAiRklMVEVSIjsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoKHR5cGUgPj0gRFRfTE9QUk9DKSAmJiAodHlwZSA8PSBEVF9ISVBST0MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0JICAKLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9NSVBTOgotCSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgICAgIHJlc3VsdCA9IGdldF9taXBzX2R5bmFtaWNfdHlwZSAodHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcmVzdWx0ID0gTlVMTDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAocmVzdWx0ICE9IE5VTEwpCi0JICAgIHJldHVybiByZXN1bHQ7Ci0KLQkgIHNwcmludGYgKGJ1ZmYsIF8oIlByb2Nlc3NvciBTcGVjaWZpYzogJWx4IiksIHR5cGUpOwotCX0KLSAgICAgIGVsc2UgaWYgKCh0eXBlID49IERUX0xPT1MpICYmICh0eXBlIDw9IERUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsIF8oIk9wZXJhdGluZyBTeXN0ZW0gc3BlY2lmaWM6ICVseCIpLCB0eXBlKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICVseCIpLCB0eXBlKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfZmlsZV90eXBlIChlX3R5cGUpCi0gICAgIHVuc2lnbmVkIGVfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAoZV90eXBlKQotICAgIHsKLSAgICBjYXNlIEVUX05PTkU6CXJldHVybiBfKCJOT05FIChOb25lKSIpOwotICAgIGNhc2UgRVRfUkVMOglyZXR1cm4gXygiUkVMIChSZWxvY2F0YWJsZSBmaWxlKSIpOwotICAgIGNhc2UgRVRfRVhFQzogICAgICAgcmV0dXJuIF8oIkVYRUMgKEV4ZWN1dGFibGUgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0RZTjogICAgICAgIHJldHVybiBfKCJEWU4gKFNoYXJlZCBvYmplY3QgZmlsZSkiKTsKLSAgICBjYXNlIEVUX0NPUkU6ICAgICAgIHJldHVybiBfKCJDT1JFIChDb3JlIGZpbGUpIik7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChlX3R5cGUgPj0gRVRfTE9QUk9DKSAmJiAoZV90eXBlIDw9IEVUX0hJUFJPQykpCi0Jc3ByaW50ZiAoYnVmZiwgXygiUHJvY2Vzc29yIFNwZWNpZmljOiAoJXgpIiksIGVfdHlwZSk7Ci0gICAgICBlbHNlIGlmICgoZV90eXBlID49IEVUX0xPT1MpICYmIChlX3R5cGUgPD0gRVRfSElPUykpCi0Jc3ByaW50ZiAoYnVmZiwgXygiT1MgU3BlY2lmaWM6ICgleCkiKSwgZV90eXBlKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIGVfdHlwZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9tYWNoaW5lX25hbWUgKGVfbWFjaGluZSkKLSAgICAgdW5zaWduZWQgZV9tYWNoaW5lOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgc3dpdGNoIChlX21hY2hpbmUpCi0gICAgewotICAgIGNhc2UgRU1fTk9ORTogICAgICAgIAlyZXR1cm4gXygiTm9uZSIpOwotICAgIGNhc2UgRU1fTTMyOiAgICAgICAgIAlyZXR1cm4gIldFMzIxMDAiOwotICAgIGNhc2UgRU1fU1BBUkM6ICAgICAgIAlyZXR1cm4gIlNwYXJjIjsKLSAgICBjYXNlIEVNXzM4NjogICAgICAgICAJcmV0dXJuICJJbnRlbCA4MDM4NiI7Ci0gICAgY2FzZSBFTV82OEs6ICAgICAgICAgCXJldHVybiAiTUM2ODAwMCI7Ci0gICAgY2FzZSBFTV84OEs6ICAgICAgICAgCXJldHVybiAiTUM4ODAwMCI7Ci0gICAgY2FzZSBFTV80ODY6ICAgICAgICAgCXJldHVybiAiSW50ZWwgODA0ODYiOwotICAgIGNhc2UgRU1fODYwOiAgICAgICAgIAlyZXR1cm4gIkludGVsIDgwODYwIjsKLSAgICBjYXNlIEVNX01JUFM6ICAgICAgICAJcmV0dXJuICJNSVBTIFIzMDAwIGJpZy1lbmRpYW4iOwotICAgIGNhc2UgRU1fUzM3MDogICAgICAgIAlyZXR1cm4gIkFtZGFobCI7Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRTogCXJldHVybiAiTUlQUyBSNDAwMCBiaWctZW5kaWFuIjsKLSAgICBjYXNlIEVNX09MRF9TUEFSQ1Y5OglyZXR1cm4gIlNwYXJjIHY5IChvbGQpIjsKLSAgICBjYXNlIEVNX1BBUklTQzogICAgICAJcmV0dXJuICJIUFBBIjsKLSAgICBjYXNlIEVNX1BQQ19PTEQ6CQlyZXR1cm4gIlBvd2VyIFBDIChvbGQpIjsKLSAgICBjYXNlIEVNX1NQQVJDMzJQTFVTOiAJcmV0dXJuICJTcGFyYyB2OCsiIDsKLSAgICBjYXNlIEVNXzk2MDogICAgICAgICAJcmV0dXJuICJJbnRlbCA5MDg2MCI7Ci0gICAgY2FzZSBFTV9QUEM6ICAgICAgICAgCXJldHVybiAiUG93ZXJQQyI7Ci0gICAgY2FzZSBFTV9WODAwOiAgICAgICAgIAlyZXR1cm4gIk5FQyBWODAwIjsKLSAgICBjYXNlIEVNX0ZSMjA6ICAgICAgICAgCXJldHVybiAiRnVqaXRzdSBGUjIwIjsKLSAgICBjYXNlIEVNX1JIMzI6ICAgICAgICAgCXJldHVybiAiVFJXIFJIMzIiOwotICAgIGNhc2UgRU1fTUNPUkU6CSAgICAgICAgcmV0dXJuICJNQ09SRSI7Ci0gICAgY2FzZSBFTV9BUk06CSAJcmV0dXJuICJBUk0iOwotICAgIGNhc2UgRU1fT0xEX0FMUEhBOgkgCXJldHVybiAiRGlnaXRhbCBBbHBoYSAob2xkKSI7Ci0gICAgY2FzZSBFTV9TSDoJCSAJcmV0dXJuICJIaXRhY2hpIFNIIjsKLSAgICBjYXNlIEVNX1NQQVJDVjk6ICAgICAJcmV0dXJuICJTcGFyYyB2OSI7Ci0gICAgY2FzZSBFTV9UUklDT1JFOiAgICAJcmV0dXJuICJTaWVtZW5zIFRyaWNvcmUiOwotICAgIGNhc2UgRU1fQVJDOgkJcmV0dXJuICJBcmdvbmF1dCBSSVNDIENvcmUiOwotICAgIGNhc2UgRU1fSDhfMzAwOgkJcmV0dXJuICJIaXRhY2hpIEg4LzMwMCI7Ci0gICAgY2FzZSBFTV9IOF8zMDBIOgkJcmV0dXJuICJIaXRhY2hpIEg4LzMwMEgiOwotICAgIGNhc2UgRU1fSDhTOgkJcmV0dXJuICJIaXRhY2hpIEg4UyI7Ci0gICAgY2FzZSBFTV9IOF81MDA6CQlyZXR1cm4gIkhpdGFjaGkgSDgvNTAwIjsKLSAgICBjYXNlIEVNX0lBXzY0OgkJcmV0dXJuICJJbnRlbCBNZXJjZWQiOwotICAgIGNhc2UgRU1fTUlQU19YOgkJcmV0dXJuICJTdGFuZm9yZCBNSVBTLVgiOwotICAgIGNhc2UgRU1fQ09MREZJUkU6CQlyZXR1cm4gIk1vdG9yb2xhIENvbGRmaXJlIjsKLSAgICBjYXNlIEVNXzY4SEMxMjoJCXJldHVybiAiTW90b3JvbGEgTTY4SEMxMiI7Ci0gICAgY2FzZSBFTV9BTFBIQTogICAgICAgCXJldHVybiAiQWxwaGEiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0QxMFY6ICAgICAgICByZXR1cm4gImQxMHYiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0QzMFY6ICAgICAgICByZXR1cm4gImQzMHYiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0FSQzoJCXJldHVybiAiQXJjIjsKLSAgICBjYXNlIEVNX0NZR05VU19NMzJSOglyZXR1cm4gIk1pdHN1YmlzaGkgTTMyciI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfVjg1MDoJcmV0dXJuICJORUMgdjg1MCI7Ci0gICAgY2FzZSBFTV9DWUdOVVNfTU4xMDMwMDoJcmV0dXJuICJtbjEwMzAwIjsKLSAgICBjYXNlIEVNX0NZR05VU19NTjEwMjAwOglyZXR1cm4gIm1uMTAyMDAiOwotICAgIGNhc2UgRU1fQ1lHTlVTX0ZSMzA6CXJldHVybiAiRnVqaXRzdSBGUjMwIjsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICV4IiksIGVfbWFjaGluZSk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9tYWNoaW5lX2ZsYWdzIChlX2ZsYWdzLCBlX21hY2hpbmUpCi0gICAgIHVuc2lnbmVkIGVfZmxhZ3M7Ci0gICAgIHVuc2lnbmVkIGVfbWFjaGluZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmIFsxMDI0XTsKLQotICBidWZbMF0gPSAnXDAnOwotICBpZiAoZV9mbGFncykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGVfbWFjaGluZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRU1fNjhLOgotICAgICAgICAgIGlmIChlX2ZsYWdzICYgRUZfQ1BVMzIpCi0gICAgICAgICAgICBzdHJjYXQgKGJ1ZiwgIiwgY3B1MzIiKTsKLSAgICAgICAgICBicmVhazsKLQotCWNhc2UgRU1fUFBDOgotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfRU1CKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgZW1iIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfUFBDX1JFTE9DQVRBQkxFKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9QUENfUkVMT0NBVEFCTEVfTElCKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgcmVsb2NhdGFibGUtbGliIik7Ci0JICBicmVhazsKLQotCWNhc2UgRU1fQ1lHTlVTX1Y4NTA6Ci0JICBzd2l0Y2ggKGVfZmxhZ3MgJiBFRl9WODUwX0FSQ0gpCi0JICAgIHsKLQkgICAgY2FzZSBFX1Y4NTBFX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTBlIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRV9WODUwRUFfQVJDSDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdjg1MGVhIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRV9WODUwX0FSQ0g6Ci0JICAgICAgc3RyY2F0IChidWYsICIsIHY4NTAiKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzdHJjYXQgKGJ1ZiwgIiwgdW5rbm93biB2ODUwIGFyY2hpdGVjdHVyZSB2YXJpYW50Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9DWUdOVVNfTTMyUjoKLQkgIGlmICgoZV9mbGFncyAmIEVGX00zMlJfQVJDSCkgPT0gRV9NMzJSX0FSQ0gpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtMzJyIik7Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSBFTV9NSVBTOgotCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICBpZiAoZV9mbGFncyAmIEVGX01JUFNfTk9SRU9SREVSKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgbm9yZW9yZGVyIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19QSUMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBwaWMiKTsKLQotCSAgaWYgKGVfZmxhZ3MgJiBFRl9NSVBTX0NQSUMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBjcGljIik7Ci0KLQkgIGlmIChlX2ZsYWdzICYgRUZfTUlQU19BQkkyKQotCSAgICBzdHJjYXQgKGJ1ZiwgIiwgYWJpMiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzEpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMSIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzIpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMiIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzMpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzMyIpOwotCi0JICBpZiAoKGVfZmxhZ3MgJiBFRl9NSVBTX0FSQ0gpID09IEVfTUlQU19BUkNIXzQpCi0JICAgIHN0cmNhdCAoYnVmLCAiLCBtaXBzNCIpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfbWlwc19zZWdtZW50X3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGxvbmcgdHlwZTsKLXsKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX01JUFNfUkVHSU5GTzoKLSAgICAgIHJldHVybiAiUkVHSU5GTyI7Ci0gICAgY2FzZSBQVF9NSVBTX1JUUFJPQzoKLSAgICAgIHJldHVybiAiUlRQUk9DIjsKLSAgICBjYXNlIFBUX01JUFNfT1BUSU9OUzoKLSAgICAgIHJldHVybiAiT1BUSU9OUyI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X3NlZ21lbnRfdHlwZSAocF90eXBlKQotICAgICB1bnNpZ25lZCBsb25nIHBfdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAocF90eXBlKQotICAgIHsKLSAgICBjYXNlIFBUX05VTEw6ICAgICAgIHJldHVybiAiTlVMTCI7Ci0gICAgY2FzZSBQVF9MT0FEOiAgICAgICByZXR1cm4gIkxPQUQiOwotICAgIGNhc2UgUFRfRFlOQU1JQzoJcmV0dXJuICJEWU5BTUlDIjsKLSAgICBjYXNlIFBUX0lOVEVSUDogICAgIHJldHVybiAiSU5URVJQIjsKLSAgICBjYXNlIFBUX05PVEU6ICAgICAgIHJldHVybiAiTk9URSI7Ci0gICAgY2FzZSBQVF9TSExJQjogICAgICByZXR1cm4gIlNITElCIjsKLSAgICBjYXNlIFBUX1BIRFI6ICAgICAgIHJldHVybiAiUEhEUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChwX3R5cGUgPj0gUFRfTE9QUk9DKSAmJiAocF90eXBlIDw9IFBUX0hJUFJPQykpCi0JewotCSAgY29uc3QgY2hhciAqIHJlc3VsdDsKLQkgIAotCSAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkgICAgewotCSAgICBjYXNlIEVNX01JUFM6Ci0JICAgIGNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JICAgICAgcmVzdWx0ID0gZ2V0X21pcHNfc2VnbWVudF90eXBlIChwX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJlc3VsdCA9IE5VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIAotCSAgaWYgKHJlc3VsdCAhPSBOVUxMKQotCSAgICByZXR1cm4gcmVzdWx0OwotCSAgCi0JICBzcHJpbnRmIChidWZmLCAiTE9QUk9DKyVseCIsIHBfdHlwZSAtIFBUX0xPUFJPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHBfdHlwZSA+PSBQVF9MT09TKSAmJiAocF90eXBlIDw9IFBUX0hJT1MpKQotCXNwcmludGYgKGJ1ZmYsICJMT09TKyVseCIsIHBfdHlwZSAtIFBUX0xPT1MpOwotICAgICAgZWxzZQotCXNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duPjogJWx4IiksIHBfdHlwZSk7Ci0KLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotZ2V0X21pcHNfc2VjdGlvbl90eXBlX25hbWUgKHNoX3R5cGUpCi0gICAgIHVuc2lnbmVkIGludCBzaF90eXBlOwotewotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX01JUFNfTElCTElTVDogICAgICAgcmV0dXJuICJNSVBTX0xJQkxJU1QiOwotICAgIGNhc2UgU0hUX01JUFNfTVNZTTogICAgICAgICAgcmV0dXJuICJNSVBTX01TWU0iOwotICAgIGNhc2UgU0hUX01JUFNfQ09ORkxJQ1Q6ICAgICAgcmV0dXJuICJNSVBTX0NPTkZMSUNUIjsKLSAgICBjYXNlIFNIVF9NSVBTX0dQVEFCOiAgICAgICAgIHJldHVybiAiTUlQU19HUFRBQiI7Ci0gICAgY2FzZSBTSFRfTUlQU19VQ09ERTogICAgICAgICByZXR1cm4gIk1JUFNfVUNPREUiOwotICAgIGNhc2UgU0hUX01JUFNfREVCVUc6ICAgICAgICAgcmV0dXJuICJNSVBTX0RFQlVHIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JFR0lORk86ICAgICAgIHJldHVybiAiTUlQU19SRUdJTkZPIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BBQ0tBR0U6ICAgICAgIHJldHVybiAiTUlQU19QQUNLQUdFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1BBQ0tTWU06ICAgICAgIHJldHVybiAiTUlQU19QQUNLU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX1JFTEQ6ICAgICAgICAgIHJldHVybiAiTUlQU19SRUxEIjsKLSAgICBjYXNlIFNIVF9NSVBTX0lGQUNFOiAgICAgICAgIHJldHVybiAiTUlQU19JRkFDRSI7Ci0gICAgY2FzZSBTSFRfTUlQU19DT05URU5UOiAgICAgICByZXR1cm4gIk1JUFNfQ09OVEVOVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19PUFRJT05TOiAgICAgICByZXR1cm4gIk1JUFNfT1BUSU9OUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19TSERSOiAgICAgICAgICByZXR1cm4gIk1JUFNfU0hEUiI7Ci0gICAgY2FzZSBTSFRfTUlQU19GREVTQzogICAgICAgICByZXR1cm4gIk1JUFNfRkRFU0MiOwotICAgIGNhc2UgU0hUX01JUFNfRVhUU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0VYVFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERU5TRTogICAgICAgICByZXR1cm4gIk1JUFNfREVOU0UiOwotICAgIGNhc2UgU0hUX01JUFNfUERFU0M6ICAgICAgICAgcmV0dXJuICJNSVBTX1BERVNDIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xPQ1NZTTogICAgICAgIHJldHVybiAiTUlQU19MT0NTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfQVVYU1lNOiAgICAgICAgcmV0dXJuICJNSVBTX0FVWFNZTSI7Ci0gICAgY2FzZSBTSFRfTUlQU19PUFRTWU06ICAgICAgICByZXR1cm4gIk1JUFNfT1BUU1lNIjsKLSAgICBjYXNlIFNIVF9NSVBTX0xPQ1NUUjogICAgICAgIHJldHVybiAiTUlQU19MT0NTVFIiOwotICAgIGNhc2UgU0hUX01JUFNfTElORTogICAgICAgICAgcmV0dXJuICJNSVBTX0xJTkUiOwotICAgIGNhc2UgU0hUX01JUFNfUkZERVNDOiAgICAgICAgcmV0dXJuICJNSVBTX1JGREVTQyI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQVNZTTogICAgICByZXR1cm4gIk1JUFNfREVMVEFTWU0iOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFJTlNUOiAgICAgcmV0dXJuICJNSVBTX0RFTFRBSU5TVCI7Ci0gICAgY2FzZSBTSFRfTUlQU19ERUxUQUNMQVNTOiAgICByZXR1cm4gIk1JUFNfREVMVEFDTEFTUyI7Ci0gICAgY2FzZSBTSFRfTUlQU19EV0FSRjogICAgICAgICByZXR1cm4gIk1JUFNfRFdBUkYiOwotICAgIGNhc2UgU0hUX01JUFNfREVMVEFERUNMOiAgICAgcmV0dXJuICJNSVBTX0RFTFRBREVDTCI7Ci0gICAgY2FzZSBTSFRfTUlQU19TWU1CT0xfTElCOiAgICByZXR1cm4gIk1JUFNfU1lNQk9MX0xJQiI7Ci0gICAgY2FzZSBTSFRfTUlQU19FVkVOVFM6ICAgICAgICByZXR1cm4gIk1JUFNfRVZFTlRTIjsKLSAgICBjYXNlIFNIVF9NSVBTX1RSQU5TTEFURTogICAgIHJldHVybiAiTUlQU19UUkFOU0xBVEUiOwotICAgIGNhc2UgU0hUX01JUFNfUElYSUU6ICAgICAgICAgcmV0dXJuICJNSVBTX1BJWElFIjsKLSAgICBjYXNlIFNIVF9NSVBTX1hMQVRFOiAgICAgICAgIHJldHVybiAiTUlQU19YTEFURSI7Ci0gICAgY2FzZSBTSFRfTUlQU19YTEFURV9ERUJVRzogICByZXR1cm4gIk1JUFNfWExBVEVfREVCVUciOwotICAgIGNhc2UgU0hUX01JUFNfV0hJUkw6ICAgICAgICAgcmV0dXJuICJNSVBTX1dISVJMIjsKLSAgICBjYXNlIFNIVF9NSVBTX0VIX1JFR0lPTjogICAgIHJldHVybiAiTUlQU19FSF9SRUdJT04iOwotICAgIGNhc2UgU0hUX01JUFNfWExBVEVfT0xEOiAgICAgcmV0dXJuICJNSVBTX1hMQVRFX09MRCI7Ci0gICAgY2FzZSBTSFRfTUlQU19QRFJfRVhDRVBUSU9OOiByZXR1cm4gIk1JUFNfUERSX0VYQ0VQVElPTiI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9zZWN0aW9uX3R5cGVfbmFtZSAoc2hfdHlwZSkKLSAgICAgdW5zaWduZWQgaW50IHNoX3R5cGU7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKHNoX3R5cGUpCi0gICAgewotICAgIGNhc2UgU0hUX05VTEw6CQlyZXR1cm4gIk5VTEwiOwotICAgIGNhc2UgU0hUX1BST0dCSVRTOgkJcmV0dXJuICJQUk9HQklUUyI7Ci0gICAgY2FzZSBTSFRfU1lNVEFCOgkJcmV0dXJuICJTWU1UQUIiOwotICAgIGNhc2UgU0hUX1NUUlRBQjoJCXJldHVybiAiU1RSVEFCIjsKLSAgICBjYXNlIFNIVF9SRUxBOgkJcmV0dXJuICJSRUxBIjsKLSAgICBjYXNlIFNIVF9IQVNIOgkJcmV0dXJuICJIQVNIIjsKLSAgICBjYXNlIFNIVF9EWU5BTUlDOgkJcmV0dXJuICJEWU5BTUlDIjsKLSAgICBjYXNlIFNIVF9OT1RFOgkJcmV0dXJuICJOT1RFIjsKLSAgICBjYXNlIFNIVF9OT0JJVFM6CQlyZXR1cm4gIk5PQklUUyI7Ci0gICAgY2FzZSBTSFRfUkVMOgkJcmV0dXJuICJSRUwiOwotICAgIGNhc2UgU0hUX1NITElCOgkJcmV0dXJuICJTSExJQiI7Ci0gICAgY2FzZSBTSFRfRFlOU1lNOgkJcmV0dXJuICJEWU5TWU0iOwotICAgIGNhc2UgU0hUX0dOVV92ZXJkZWY6CXJldHVybiAiVkVSREVGIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVybmVlZDoJcmV0dXJuICJWRVJORUVEIjsKLSAgICBjYXNlIFNIVF9HTlVfdmVyc3ltOglyZXR1cm4gIlZFUlNZTSI7Ci0gICAgY2FzZSAweDZmZmZmZmYwOgkgICAgICAgIHJldHVybiAiVkVSU1lNIjsKLSAgICBjYXNlIDB4NmZmZmZmZmM6CSAgICAgICAgcmV0dXJuICJWRVJERUYiOwotICAgIGNhc2UgMHg3ZmZmZmZmZDoJCXJldHVybiAiQVVYSUxJQVJZIjsKLSAgICBjYXNlIDB4N2ZmZmZmZmY6CQlyZXR1cm4gIkZJTFRFUiI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChzaF90eXBlID49IFNIVF9MT1BST0MpICYmIChzaF90eXBlIDw9IFNIVF9ISVBST0MpKQotCXsKLQkgIGNvbnN0IGNoYXIgKiByZXN1bHQ7Ci0KLQkgIHN3aXRjaCAoZWxmX2hlYWRlci5lX21hY2hpbmUpCi0JICAgIHsKLQkgICAgY2FzZSBFTV9NSVBTOgotCSAgICBjYXNlIEVNX01JUFNfUlM0X0JFOgotCSAgICAgIHJlc3VsdCA9IGdldF9taXBzX3NlY3Rpb25fdHlwZV9uYW1lIChzaF90eXBlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXN1bHQgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmIChyZXN1bHQgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHJlc3VsdDsKLQotCSAgc3ByaW50ZiAoYnVmZiwgIlNIVF9MT1BST0MrJXgiLCBzaF90eXBlIC0gU0hUX0xPUFJPQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPT1MpICYmIChzaF90eXBlIDw9IFNIVF9ISU9TKSkKLQlzcHJpbnRmIChidWZmLCAiU0hUX0xPT1MrJXgiLCBzaF90eXBlIC0gU0hUX0xPT1MpOwotICAgICAgZWxzZSBpZiAoKHNoX3R5cGUgPj0gU0hUX0xPVVNFUikgJiYgKHNoX3R5cGUgPD0gU0hUX0hJVVNFUikpCi0Jc3ByaW50ZiAoYnVmZiwgIlNIVF9MT1VTRVIrJXgiLCBzaF90eXBlIC0gU0hUX0xPVVNFUik7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAleCIpLCBzaF90eXBlKTsKLSAgICAgIAotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdHJ1Y3Qgb3B0aW9uIG9wdGlvbnMgW10gPQotewotICB7ImFsbCIsICAgICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2EnfSwKLSAgeyJmaWxlLWhlYWRlciIsICAgICAgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsicHJvZ3JhbS1oZWFkZXJzIiwgIG5vX2FyZ3VtZW50LCAwLCAnbCd9LAotICB7ImhlYWRlcnMiLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ2UnfSwKLSAgeyJoaXN0b2dyYW0iLCAgICAgICAgbm9fYXJndW1lbnQsICYgZG9faGlzdG9ncmFtLCAxfSwKLSAgeyJzZWdtZW50cyIsICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsic2VjdGlvbnMiLCAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAnUyd9LAotICB7InNlY3Rpb24taGVhZGVycyIsICBub19hcmd1bWVudCwgMCwgJ1MnfSwKLSAgeyJzeW1ib2xzIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0gIHsic3ltcyIsICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAncyd9LAotICB7InJlbG9jcyIsICAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3InfSwKLSAgeyJkeW5hbWljIiwgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdkJ30sCi0gIHsidmVyc2lvbi1pbmZvIiwgICAgIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICB7InVzZS1keW5hbWljIiwgICAgICBub19hcmd1bWVudCwgMCwgJ0QnfSwKLSAgeyJoZXgtZHVtcCIsICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd4J30sCi0gIHsiZGVidWctZHVtcCIsICAgICAgIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAndyd9LAotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLSAgeyJpbnN0cnVjdGlvbi1kdW1wIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdpJ30sCi0jZW5kaWYKLQotICB7InZlcnNpb24iLCAgICAgICAgICBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgeyJoZWxwIiwgICAgICAgICAgICAgbm9fYXJndW1lbnQsIDAsICdIJ30sCi0gIHswLCAgICAgICAgICAgICAgICAgIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotc3RhdGljIHZvaWQKLXVzYWdlICgpCi17Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiVXNhZ2U6IHJlYWRlbGYge29wdGlvbnN9IGVsZi1maWxlKHMpXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICBPcHRpb25zIGFyZTpcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1hIG9yIC0tYWxsICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLWggLWwgLVMgLXMgLXIgLWQgLVYgLS1oaXN0b2dyYW1cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1oIG9yIC0tZmlsZS1oZWFkZXIgICAgICAgRGlzcGxheSB0aGUgRUxGIGZpbGUgaGVhZGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtbCBvciAtLXByb2dyYW0taGVhZGVycyBvciAtLXNlZ21lbnRzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHByb2dyYW0gaGVhZGVyc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLVMgb3IgLS1zZWN0aW9uLWhlYWRlcnMgb3IgLS1zZWN0aW9uc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZWN0aW9ucycgaGVhZGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtZSBvciAtLWhlYWRlcnMgICAgICAgICAgIEVxdWl2YWxlbnQgdG86IC1oIC1sIC1TXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtcyBvciAtLXN5bXMgb3IgLS1zeW1ib2xzIERpc3BsYXkgdGhlIHN5bWJvbCB0YWJsZVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXIgb3IgLS1yZWxvY3MgICAgICAgICAgICBEaXNwbGF5IHRoZSByZWxvY2F0aW9ucyAoaWYgcHJlc2VudClcbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC1kIG9yIC0tZHluYW1pYyAgICAgICAgICAgRGlzcGxheSB0aGUgZHluYW1pYyBzZWdtZW50IChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLVYgb3IgLS12ZXJzaW9uLWluZm8gICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIHNlY3Rpb25zIChpZiBwcmVzZW50KVxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLUQgb3IgLS11c2UtZHluYW1pYyAgICAgICBVc2UgdGhlIGR5bmFtaWMgc2VjdGlvbiBpbmZvIHdoZW4gZGlzcGxheWluZyBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAteCA8bnVtYmVyPiBvciAtLWhleC1kdW1wPTxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1bXAgdGhlIGNvbnRlbnRzIG9mIHNlY3Rpb24gPG51bWJlcj5cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgIC13W2xpYXByXSBvciAtLWRlYnVnLWR1bXBbPWxpbmUsPWluZm8sPWFiYnJldiw9cHVibmFtZXMsPXJhbmdlc11cbiIpKTsKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGUgY29udGVudHMgb2YgRFdBUkYyIGRlYnVnIHNlY3Rpb25zXG4iKSk7Ci0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLWkgPG51bWJlcj4gb3IgLS1pbnN0cnVjdGlvbi1kdW1wPTxudW1iZXI+XG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2Fzc2VtYmxlIHRoZSBjb250ZW50cyBvZiBzZWN0aW9uIDxudW1iZXI+XG4iKSk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3Rkb3V0LCBfKCIgICAgICAgIC0taGlzdG9ncmFtICAgICAgICAgRGlzcGxheSBoaXN0b2dyYW0gb2YgYnVja2V0IGxpc3QgbGVuZ3Roc1xuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIiAgLXYgb3IgLS12ZXJzaW9uICAgICAgICAgICBEaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBvZiByZWFkZWxmXG4iKSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgXygiICAtSCBvciAtLWhlbHAgICAgICAgICAgICAgIERpc3BsYXkgdGhpcyBpbmZvcm1hdGlvblxuIikpOwotICBmcHJpbnRmIChzdGRvdXQsIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotCi0gIGV4aXQgKDApOwotfQotCi1zdGF0aWMgdm9pZAotcmVxdWVzdF9kdW1wIChzZWN0aW9uLCB0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgc2VjdGlvbjsKLSAgICAgY2hhciAgICAgICAgIHR5cGU7Ci17Ci0gIGlmIChzZWN0aW9uID49IG51bV9kdW1wX3NlY3RzKQotICAgIHsKLSAgICAgIGNoYXIgKiBuZXdfZHVtcF9zZWN0czsKLQotICAgICAgbmV3X2R1bXBfc2VjdHMgPSAoY2hhciAqKSBjYWxsb2MgKHNlY3Rpb24gKyAxLCAxKTsKLQotICAgICAgaWYgKG5ld19kdW1wX3NlY3RzID09IE5VTEwpCi0JZXJyb3IgKF8oIk91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyBkdW1wIHJlcXVlc3QgdGFibGUuIikpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIENvcHkgY3VycmVudCBmbGFnIHNldHRpbmdzLiAgKi8KLQkgIG1lbWNweSAobmV3X2R1bXBfc2VjdHMsIGR1bXBfc2VjdHMsIG51bV9kdW1wX3NlY3RzKTsKLQotCSAgZnJlZSAoZHVtcF9zZWN0cyk7Ci0KLQkgIGR1bXBfc2VjdHMgPSBuZXdfZHVtcF9zZWN0czsKLQkgIG51bV9kdW1wX3NlY3RzID0gc2VjdGlvbiArIDE7Ci0JfQotICAgIH0KLQotICBpZiAoZHVtcF9zZWN0cykKLSAgICBkdW1wX3NlY3RzIFtzZWN0aW9uXSB8PSB0eXBlOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0gIGludCBjOwotCi0gIGlmIChhcmdjIDwgMikKLSAgICB1c2FnZSAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZwotCSAgKGFyZ2MsIGFyZ3YsICJlcnNhaGxkU0R3Ojp4Omk6dlYiLCBvcHRpb25zLCBOVUxMKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGNoYXIgKiAgICBjcDsKLSAgICAgIGludAlzZWN0aW9uOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIC8qIExvbmcgb3B0aW9ucy4gICovCi0JICBicmVhazsKLQljYXNlICdIJzoKLQkgIHVzYWdlICgpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIGRvX3N5bXMgKys7Ci0JICBkb19yZWxvYyArKzsKLQkgIGRvX2R5bmFtaWMgKys7Ci0JICBkb19oZWFkZXIgKys7Ci0JICBkb19zZWN0aW9ucyArKzsKLQkgIGRvX3NlZ21lbnRzICsrOwotCSAgZG9fdmVyc2lvbiArKzsKLQkgIGRvX2hpc3RvZ3JhbSArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgZG9faGVhZGVyICsrOwotCSAgZG9fc2VjdGlvbnMgKys7Ci0JICBkb19zZWdtZW50cyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ0QnOgotCSAgZG9fdXNpbmdfZHluYW1pYyArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgotCSAgZG9fcmVsb2MgKys7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIGRvX2hlYWRlciArKzsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgZG9fc2VnbWVudHMgKys7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGRvX3N5bXMgKys7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGRvX3NlY3Rpb25zICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkb19keW5hbWljICsrOwotCSAgYnJlYWs7Ci0JY2FzZSAneCc6Ci0JICBkb19kdW1wICsrOwotCSAgc2VjdGlvbiA9IHN0cnRvdWwgKG9wdGFyZywgJiBjcCwgMCk7Ci0JICBpZiAoISAqIGNwICYmIHNlY3Rpb24gPj0gMCkKLQkgICAgewotCSAgICAgIHJlcXVlc3RfZHVtcCAoc2VjdGlvbiwgSEVYX0RVTVApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBnb3RvIG9vcHM7Ci0JY2FzZSAndyc6Ci0JICBkb19kdW1wICsrOwotCSAgaWYgKG9wdGFyZyA9PSAwKQotCSAgICBkb19kZWJ1Z2dpbmcgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZG9fZGVidWdnaW5nID0gMDsKLQkgICAgICBzd2l0Y2ggKG9wdGFyZ1swXSkKLQkJewotCQljYXNlICdpJzoKLQkJY2FzZSAnSSc6Ci0JCSAgZG9fZGVidWdfaW5mbyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnYSc6Ci0JCWNhc2UgJ0EnOgotCQkgIGRvX2RlYnVnX2FiYnJldnMgPSAxOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2wnOgotCQljYXNlICdMJzoKLQkJICBkb19kZWJ1Z19saW5lcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncCc6Ci0JCWNhc2UgJ1AnOgotCQkgIGRvX2RlYnVnX3B1Ym5hbWVzID0gMTsKLQkJICBicmVhazsKLQotCQljYXNlICdyJzoKLQkJY2FzZSAnUic6Ci0JCSAgZG9fZGVidWdfYXJhbmdlcyA9IDE7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICB3YXJuIChfKCJVbnJlY29nbmlzZWQgZGVidWcgb3B0aW9uICclcydcbiIpLCBvcHRhcmcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotI2lmZGVmIFNVUFBPUlRfRElTQVNTRU1CTFkKLQljYXNlICdpJzoKLQkgIGRvX2R1bXAgKys7Ci0JICBzZWN0aW9uID0gc3RydG91bCAob3B0YXJnLCAmIGNwLCAwKTsKLQkgIGlmICghICogY3AgJiYgc2VjdGlvbiA+PSAwKQotCSAgICB7Ci0JICAgICAgcmVxdWVzdF9kdW1wIChzZWN0aW9uLCBESVNBU1NfRFVNUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGdvdG8gb29wczsKLSNlbmRpZgotCWNhc2UgJ3YnOgotCSAgcHJpbnRfdmVyc2lvbiAocHJvZ3JhbV9uYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1YnOgotCSAgZG9fdmVyc2lvbiArKzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0Jb29wczoKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlcnJvciAoXygiSW52YWxpZCBvcHRpb24gJy0lYydcbiIpLCBjKTsKLQkgIC8qIERyb3AgdGhyb3VnaC4gICovCi0JY2FzZSAnPyc6Ci0JICB1c2FnZSAoKTsKLQl9Ci0gICAgfQotCi0gIGlmICghZG9fZHluYW1pYyAmJiAhZG9fc3ltcyAmJiAhZG9fcmVsb2MgJiYgIWRvX3NlY3Rpb25zCi0gICAgICAmJiAhZG9fc2VnbWVudHMgJiYgIWRvX2hlYWRlciAmJiAhZG9fZHVtcCAmJiAhZG9fdmVyc2lvbgotICAgICAgJiYgIWRvX2hpc3RvZ3JhbSAmJiAhZG9fZGVidWdnaW5nKQotICAgIHVzYWdlICgpOwotICBlbHNlIGlmIChhcmdjIDwgMykKLSAgICB7Ci0gICAgICB3YXJuIChfKCJOb3RoaW5nIHRvIGRvLlxuIikpOwotICAgICAgdXNhZ2UoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9lbGZfY2xhc3MgKGVsZl9jbGFzcykKLSAgICAgdW5zaWduZWQgY2hhciBlbGZfY2xhc3M7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLSAgCi0gIHN3aXRjaCAoZWxmX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIEVMRkNMQVNTTk9ORTogcmV0dXJuIF8oIm5vbmUiKTsKLSAgICBjYXNlIEVMRkNMQVNTMzI6ICAgcmV0dXJuIF8oIkVMRjMyIik7Ci0gICAgY2FzZSBFTEZDTEFTUzY0OiAgIHJldHVybiBfKCJFTEY2NCIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bjogJXg+IiksIGVsZl9jbGFzcyk7Ci0gICAgICByZXR1cm4gYnVmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWdldF9kYXRhX2VuY29kaW5nIChlbmNvZGluZykKLSAgICAgdW5zaWduZWQgY2hhciBlbmNvZGluZzsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotICAKLSAgc3dpdGNoIChlbmNvZGluZykKLSAgICB7Ci0gICAgY2FzZSBFTEZEQVRBTk9ORTogcmV0dXJuIF8oIm5vbmUiKTsKLSAgICBjYXNlIEVMRkRBVEEyTFNCOiByZXR1cm4gXygiMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4iKTsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOiByZXR1cm4gXygiMidzIGNvbXBsZW1lbnQsIGJpZyBlbmRpYW4iKTsKLSAgICBkZWZhdWx0OiAgICAgICAgICAKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duOiAleD4iKSwgZW5jb2RpbmcpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1nZXRfb3NhYmlfbmFtZSAob3NhYmkpCi0gICAgIHVuc2lnbmVkIGNoYXIgb3NhYmk7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLSAgCi0gIHN3aXRjaCAob3NhYmkpCi0gICAgewotICAgIGNhc2UgRUxGT1NBQklfU1lTVjogICAgICAgcmV0dXJuIF8oIlVOSVggLSBTeXN0ZW0gViIpOwotICAgIGNhc2UgRUxGT1NBQklfSFBVWDogICAgICAgcmV0dXJuIF8oIlVOSVggLSBIUC1VWCIpOwotICAgIGNhc2UgRUxGT1NBQklfU1RBTkRBTE9ORTogcmV0dXJuIF8oIlN0YW5kYWxvbmUgQXBwIik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwcmludGYgKGJ1ZmYsIF8oIjx1bmtub3duOiAleD4iKSwgb3NhYmkpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi0vKiBEZWNvZGUgdGhlIGRhdGEgaGVsZCBpbiAnZWxmX2hlYWRlcicuICAqLwotc3RhdGljIGludAotcHJvY2Vzc19maWxlX2hlYWRlciAoKQotewotICBpZiAoICAgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUcwXSAhPSBFTEZNQUcwCi0gICAgICB8fCBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX01BRzFdICE9IEVMRk1BRzEKLSAgICAgIHx8IGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfTUFHMl0gIT0gRUxGTUFHMgotICAgICAgfHwgZWxmX2hlYWRlci5lX2lkZW50IFtFSV9NQUczXSAhPSBFTEZNQUczKQotICAgIHsKLSAgICAgIGVycm9yCi0JKF8oIk5vdCBhbiBFTEYgZmlsZSAtIGl0IGhhcyB0aGUgd3JvbmcgbWFnaWMgYnl0ZXMgYXQgdGhlIHN0YXJ0XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX2hlYWRlcikKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgcHJpbnRmIChfKCJFTEYgSGVhZGVyOlxuIikpOwotICAgICAgcHJpbnRmIChfKCIgIE1hZ2ljOiAgICIpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBFSV9OSURFTlQ7IGkgKyspCi0JcHJpbnRmICgiJTIuMnggIiwgZWxmX2hlYWRlci5lX2lkZW50IFtpXSk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgICAgcHJpbnRmIChfKCIgIENsYXNzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9lbGZfY2xhc3MgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfQ0xBU1NdKSk7Ci0gICAgICBwcmludGYgKF8oIiAgRGF0YTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X2RhdGFfZW5jb2RpbmcgKGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfREFUQV0pKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICVkICVzXG4iKSwKLQkgICAgICBlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dLAotCSAgICAgIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dID09IEVWX0NVUlJFTlQKLQkgICAgICAgPyAiKGN1cnJlbnQpIgotCSAgICAgICA6IChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX1ZFUlNJT05dICE9IEVWX05PTkUKLQkJICA/ICI8dW5rbm93bjogJWx4PiIKLQkJICA6ICIiKSkpOwotICAgICAgcHJpbnRmIChfKCIgIE9TL0FCSTogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9vc2FiaV9uYW1lIChlbGZfaGVhZGVyLmVfaWRlbnQgW0VJX09TQUJJXSkpOwotICAgICAgcHJpbnRmIChfKCIgIEFCSSBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgJWRcbiIpLAotCSAgICAgIGVsZl9oZWFkZXIuZV9pZGVudCBbRUlfQUJJVkVSU0lPTl0pOwotICAgICAgcHJpbnRmIChfKCIgIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXNcbiIpLAotCSAgICAgIGdldF9maWxlX3R5cGUgKGVsZl9oZWFkZXIuZV90eXBlKSk7Ci0gICAgICBwcmludGYgKF8oIiAgTWFjaGluZTogICAgICAgICAgICAgICAgICAgICAgICAgICAlc1xuIiksCi0JICAgICAgZ2V0X21hY2hpbmVfbmFtZSAoZWxmX2hlYWRlci5lX21hY2hpbmUpKTsKLSAgICAgIHByaW50ZiAoXygiICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4JWx4XG4iKSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgIEVudHJ5IHBvaW50IGFkZHJlc3M6ICAgICAgICAgICAgICAgMHglbHhcbiIpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZW50cnkpOwotICAgICAgcHJpbnRmIChfKCIgIFN0YXJ0IG9mIHByb2dyYW0gaGVhZGVyczogICAgICAgICAgJWxkIChieXRlcyBpbnRvIGZpbGUpXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3Bob2ZmKTsKLSAgICAgIHByaW50ZiAoXygiICBTdGFydCBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICVsZCAoYnl0ZXMgaW50byBmaWxlKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaG9mZik7Ci0gICAgICBwcmludGYgKF8oIiAgRmxhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweCVseCVzXG4iKSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX2ZsYWdzLAotCSAgICAgIGdldF9tYWNoaW5lX2ZsYWdzIChlbGZfaGVhZGVyLmVfZmxhZ3MsIGVsZl9oZWFkZXIuZV9tYWNoaW5lKSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9laHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIFNpemUgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAgJWxkIChieXRlcylcbiIpLAotCSAgICAgIChsb25nKSBlbGZfaGVhZGVyLmVfcGhlbnRzaXplKTsKLSAgICAgIHByaW50ZiAoXygiICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9waG51bSk7Ci0gICAgICBwcmludGYgKF8oIiAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAlbGQgKGJ5dGVzKVxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaGVudHNpemUpOwotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgJWxkXG4iKSwKLQkgICAgICAobG9uZykgZWxmX2hlYWRlci5lX3NobnVtKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6ICVsZFxuIiksCi0JICAgICAgKGxvbmcpIGVsZl9oZWFkZXIuZV9zaHN0cm5keCk7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci17Ci0gIEVsZjMyX0V4dGVybmFsX1BoZHIgKiBwaGRyczsKLSAgRWxmMzJfRXh0ZXJuYWxfUGhkciAqIGV4dGVybmFsOwotICBFbGYzMl9JbnRlcm5hbF9QaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotICAKLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9waG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplICogZWxmX2hlYWRlci5lX3BobnVtLAotCQkgIHBoZHJzLCBFbGYzMl9FeHRlcm5hbF9QaGRyICosICJwcm9ncmFtIGhlYWRlcnMiKTsKLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHByb2dyYW1faGVhZGVycywgZXh0ZXJuYWwgPSBwaGRyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrLCBleHRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+cF90eXBlICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+cF9vZmZzZXQgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfb2Zmc2V0KTsKLSAgICAgIGludGVybmFsLT5wX3ZhZGRyICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF92YWRkcik7Ci0gICAgICBpbnRlcm5hbC0+cF9wYWRkciAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfcGFkZHIpOwotICAgICAgaW50ZXJuYWwtPnBfZmlsZXN6ID0gQllURV9HRVQgKGV4dGVybmFsLT5wX2ZpbGVzeik7Ci0gICAgICBpbnRlcm5hbC0+cF9tZW1zeiAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfbWVtc3opOwotICAgICAgaW50ZXJuYWwtPnBfZmxhZ3MgID0gQllURV9HRVQgKGV4dGVybmFsLT5wX2ZsYWdzKTsKLSAgICAgIGludGVybmFsLT5wX2FsaWduICA9IEJZVEVfR0VUIChleHRlcm5hbC0+cF9hbGlnbik7Ci0gICAgfQotCi0gIGZyZWUgKHBoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZ2V0XzY0Yml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgRWxmX0ludGVybmFsX1BoZHIgKiBwcm9ncmFtX2hlYWRlcnM7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX1BoZHIgKiBwaGRyczsKLSAgRWxmNjRfRXh0ZXJuYWxfUGhkciAqIGV4dGVybmFsOwotICBFbGY2NF9JbnRlcm5hbF9QaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotICAKLSAgR0VUX0RBVEFfQUxMT0MgKGVsZl9oZWFkZXIuZV9waG9mZiwKLQkJICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplICogZWxmX2hlYWRlci5lX3BobnVtLAotCQkgIHBoZHJzLCBFbGY2NF9FeHRlcm5hbF9QaGRyICosICJwcm9ncmFtIGhlYWRlcnMiKTsKLQotICBmb3IgKGkgPSAwLCBpbnRlcm5hbCA9IHByb2dyYW1faGVhZGVycywgZXh0ZXJuYWwgPSBwaGRyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3BobnVtOwotICAgICAgIGkgKyssIGludGVybmFsICsrLCBleHRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+cF90eXBlICAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+cF9mbGFncyAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBfZmxhZ3MpOwotICAgICAgaW50ZXJuYWwtPnBfb2Zmc2V0ID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9vZmZzZXQpOwotICAgICAgaW50ZXJuYWwtPnBfdmFkZHIgID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF92YWRkcik7Ci0gICAgICBpbnRlcm5hbC0+cF9wYWRkciAgPSBCWVRFX0dFVDggKGV4dGVybmFsLT5wX3BhZGRyKTsKLSAgICAgIGludGVybmFsLT5wX2ZpbGVzeiA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfZmlsZXN6KTsKLSAgICAgIGludGVybmFsLT5wX21lbXN6ICA9IEJZVEVfR0VUOCAoZXh0ZXJuYWwtPnBfbWVtc3opOwotICAgICAgaW50ZXJuYWwtPnBfYWxpZ24gID0gQllURV9HRVQ4IChleHRlcm5hbC0+cF9hbGlnbik7Ci0gICAgfQotCi0gIGZyZWUgKHBoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19wcm9ncmFtX2hlYWRlcnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGZfSW50ZXJuYWxfUGhkciAqIHByb2dyYW1faGVhZGVyczsKLSAgRWxmX0ludGVybmFsX1BoZHIgKiBzZWdtZW50OwotICB1bnNpZ25lZCBpbnQJICAgICAgaTsKLQotICBpZiAoZWxmX2hlYWRlci5lX3BobnVtID09IDApCi0gICAgewotICAgICAgaWYgKGRvX3NlZ21lbnRzKQotCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gcHJvZ3JhbSBoZWFkZXJzIGluIHRoaXMgZmlsZS5cbiIpKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoZG9fc2VnbWVudHMgJiYgIWRvX2hlYWRlcikKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuRWxmIGZpbGUgaXMgJXNcbiIpLCBnZXRfZmlsZV90eXBlIChlbGZfaGVhZGVyLmVfdHlwZSkpOwotICAgICAgcHJpbnRmIChfKCJFbnRyeSBwb2ludCAweCVseFxuIiksICh1bnNpZ25lZCBsb25nKSBlbGZfaGVhZGVyLmVfZW50cnkpOwotICAgICAgcHJpbnRmIChfKCJUaGVyZSBhcmUgJWQgcHJvZ3JhbSBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgJWx4OlxuIiksCi0JICAgICAgZWxmX2hlYWRlci5lX3BobnVtLCAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3Bob2ZmKTsKLSAgICB9Ci0KLSAgcHJvZ3JhbV9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9QaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfcGhudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9QaGRyKSk7Ci0KLSAgaWYgKHByb2dyYW1faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICBpID0gZ2V0XzMyYml0X3Byb2dyYW1faGVhZGVycyAoZmlsZSwgcHJvZ3JhbV9oZWFkZXJzKTsKLSAgZWxzZQotICAgIGkgPSBnZXRfNjRiaXRfcHJvZ3JhbV9oZWFkZXJzIChmaWxlLCBwcm9ncmFtX2hlYWRlcnMpOwotCi0gIGlmIChpID09IDApCi0gICAgewotICAgICAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgCi0gIGlmIChkb19zZWdtZW50cykKLSAgICB7Ci0gICAgICBwcmludGYKLQkoXygiXG5Qcm9ncmFtIEhlYWRlciVzOlxuIiksIGVsZl9oZWFkZXIuZV9waG51bSA+IDEgPyAicyIgOiAiIik7Ci0gICAgICBwcmludGYKLQkoXygiICBUeXBlICAgICAgICBPZmZzZXQgICBWaXJ0QWRkciAgIFBoeXNBZGRyICAgRmlsZVNpeiBNZW1TaXogIEZsZyBBbGlnblxuIikpOwotICAgIH0KLQotICBsb2FkYWRkciA9IC0xOwotICBkeW5hbWljX2FkZHIgPSAwOwotICBkeW5hbWljX3NpemUgPSAwOwotCi0gIGZvciAoaSA9IDAsIHNlZ21lbnQgPSBwcm9ncmFtX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9waG51bTsKLSAgICAgICBpICsrLCBzZWdtZW50ICsrKQotICAgIHsKLSAgICAgIGlmIChkb19zZWdtZW50cykKLQl7Ci0JICBwcmludGYgKCIgICUtMTEuMTFzICIsIGdldF9zZWdtZW50X3R5cGUgKHNlZ21lbnQtPnBfdHlwZSkpOwotCSAgcHJpbnRmICgiMHglNi42bHggIiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfb2Zmc2V0KTsKLQkgIHByaW50ZiAoIjB4JTguOGx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX3ZhZGRyKTsKLQkgIHByaW50ZiAoIjB4JTguOGx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX3BhZGRyKTsKLQkgIHByaW50ZiAoIjB4JTUuNWx4ICIsICh1bnNpZ25lZCBsb25nKSBzZWdtZW50LT5wX2ZpbGVzeik7Ci0JICBwcmludGYgKCIweCU1LjVseCAiLCAodW5zaWduZWQgbG9uZykgc2VnbWVudC0+cF9tZW1zeik7Ci0JICBwcmludGYgKCIlYyVjJWMgIiwKLQkJICAoc2VnbWVudC0+cF9mbGFncyAmIFBGX1IgPyAnUicgOiAnICcpLAotCQkgIChzZWdtZW50LT5wX2ZsYWdzICYgUEZfVyA/ICdXJyA6ICcgJyksCi0JCSAgKHNlZ21lbnQtPnBfZmxhZ3MgJiBQRl9YID8gJ0UnIDogJyAnKSk7Ci0JICBwcmludGYgKCIlI2x4IiwgKHVuc2lnbmVkIGxvbmcpIHNlZ21lbnQtPnBfYWxpZ24pOwotCX0KLQotICAgICAgc3dpdGNoIChzZWdtZW50LT5wX3R5cGUpCi0JewotCWNhc2UgUFRfTE9BRDoKLQkgIGlmIChsb2FkYWRkciA9PSAtMSkKLQkgICAgbG9hZGFkZHIgPSAoc2VnbWVudC0+cF92YWRkciAmIDB4ZmZmZmYwMDApCi0JICAgICAgLSAoc2VnbWVudC0+cF9vZmZzZXQgJiAweGZmZmZmMDAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBQVF9EWU5BTUlDOgotCSAgaWYgKGR5bmFtaWNfYWRkcikKLQkgICAgZXJyb3IgKF8oIm1vcmUgdGhhbiBvbmUgZHluYW1pYyBzZWdtZW50XG4iKSk7Ci0KLQkgIGR5bmFtaWNfYWRkciA9IHNlZ21lbnQtPnBfb2Zmc2V0OwotCSAgZHluYW1pY19zaXplID0gc2VnbWVudC0+cF9maWxlc3o7Ci0JICBicmVhazsKLQotCWNhc2UgUFRfSU5URVJQOgotCSAgaWYgKGZzZWVrIChmaWxlLCBzZWdtZW50LT5wX29mZnNldCwgU0VFS19TRVQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIGZpbmQgcHJvZ3JhbSBpbnRlcnByZXRlciBuYW1lXG4iKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcm9ncmFtX2ludGVycHJldGVyWzBdID0gMDsKLQkgICAgICBmc2NhbmYgKGZpbGUsICIlNjNzIiwgcHJvZ3JhbV9pbnRlcnByZXRlcik7Ci0KLQkgICAgICBpZiAoZG9fc2VnbWVudHMpCi0JCXByaW50ZiAoXygiXG4gICAgICBbUmVxdWVzdGluZyBwcm9ncmFtIGludGVycHJldGVyOiAlc10iKSwKLQkJICAgIHByb2dyYW1faW50ZXJwcmV0ZXIpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChkb19zZWdtZW50cykKLQlwdXRjICgnXG4nLCBzdGRvdXQpOwotICAgIH0KLQotICBpZiAobG9hZGFkZHIgPT0gLTEpCi0gICAgewotICAgICAgLyogVmVyeSBzdHJhbmdlLiAqLwotICAgICAgbG9hZGFkZHIgPSAwOwotICAgIH0KLQotICBpZiAoZG9fc2VnbWVudHMgJiYgc2VjdGlvbl9oZWFkZXJzICE9IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcbiBTZWN0aW9uIHRvIFNlZ21lbnQgbWFwcGluZzpcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBTZWdtZW50IFNlY3Rpb25zLi4uXG4iKSk7Ci0KLSAgICAgIGFzc2VydCAoc3RyaW5nX3RhYmxlICE9IE5VTEwpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZWxmX2hlYWRlci5lX3BobnVtOyBpKyspCi0JewotCSAgaW50ICAgICAgICAgICAgICAgICBqOwotCSAgRWxmX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotCi0JICBzZWdtZW50ID0gcHJvZ3JhbV9oZWFkZXJzICsgaTsKLQkgIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0KLQkgIHByaW50ZiAoIiAgICUyLjJkICAgICAiLCBpKTsKLQotCSAgZm9yIChqID0gMDsgaiA8IGVsZl9oZWFkZXIuZV9zaG51bTsgaisrLCBzZWN0aW9uICsrKQotCSAgICB7Ci0JICAgICAgaWYgKHNlY3Rpb24tPnNoX3NpemUgPiAwCi0JCSAgLyogQ29tcGFyZSBhbGxvY2F0ZWQgc2VjdGlvbnMgYnkgVk1BLCB1bmFsbG9jYXRlZAotCQkgICAgIHNlY3Rpb25zIGJ5IGZpbGUgb2Zmc2V0LiAgKi8KLQkJICAmJiAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MKLQkJICAgICAgPyAoc2VjdGlvbi0+c2hfYWRkciA+PSBzZWdtZW50LT5wX3ZhZGRyCi0JCQkgJiYgc2VjdGlvbi0+c2hfYWRkciArIHNlY3Rpb24tPnNoX3NpemUKLQkJCSA8PSBzZWdtZW50LT5wX3ZhZGRyICsgc2VnbWVudC0+cF9tZW1zeikKLQkJICAgICAgOiAoc2VjdGlvbi0+c2hfb2Zmc2V0ID49IHNlZ21lbnQtPnBfb2Zmc2V0Ci0JCQkgJiYgKHNlY3Rpb24tPnNoX29mZnNldCArIHNlY3Rpb24tPnNoX3NpemUKLQkJCSAgICAgPD0gc2VnbWVudC0+cF9vZmZzZXQgKyBzZWdtZW50LT5wX2ZpbGVzeikpKSkKLQkJcHJpbnRmICgiJXMgIiwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0JICAgIH0KLQotCSAgcHV0YyAoJ1xuJyxzdGRvdXQpOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocHJvZ3JhbV9oZWFkZXJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgaW50Ci1nZXRfMzJiaXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfRXh0ZXJuYWxfU2hkciAqIHNoZHJzOwotICBFbGYzMl9JbnRlcm5hbF9TaGRyICogaW50ZXJuYWw7Ci0gIHVuc2lnbmVkIGludCAgICAgICAgICBpOwotCi0gIEdFVF9EQVRBX0FMTE9DIChlbGZfaGVhZGVyLmVfc2hvZmYsCi0JCSAgZWxmX2hlYWRlci5lX3NoZW50c2l6ZSAqIGVsZl9oZWFkZXIuZV9zaG51bSwKLQkJICBzaGRycywgRWxmMzJfRXh0ZXJuYWxfU2hkciAqLCAic2VjdGlvbiBoZWFkZXJzIik7Ci0KLSAgc2VjdGlvbl9oZWFkZXJzID0gKEVsZl9JbnRlcm5hbF9TaGRyICopIG1hbGxvYwotICAgIChlbGZfaGVhZGVyLmVfc2hudW0gKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9TaGRyKSk7Ci0KLSAgaWYgKHNlY3Rpb25faGVhZGVycyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZm9yIChpID0gMCwgaW50ZXJuYWwgPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLSAgICAgICBpICsrLCBpbnRlcm5hbCArKykKLSAgICB7Ci0gICAgICBpbnRlcm5hbC0+c2hfbmFtZSAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX25hbWUpOwotICAgICAgaW50ZXJuYWwtPnNoX3R5cGUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF90eXBlKTsKLSAgICAgIGludGVybmFsLT5zaF9mbGFncyAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfZmxhZ3MpOwotICAgICAgaW50ZXJuYWwtPnNoX2FkZHIgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9hZGRyKTsKLSAgICAgIGludGVybmFsLT5zaF9vZmZzZXQgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfb2Zmc2V0KTsKLSAgICAgIGludGVybmFsLT5zaF9zaXplICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfc2l6ZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfbGluayAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2xpbmspOwotICAgICAgaW50ZXJuYWwtPnNoX2luZm8gICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9pbmZvKTsKLSAgICAgIGludGVybmFsLT5zaF9hZGRyYWxpZ24gPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfYWRkcmFsaWduKTsKLSAgICAgIGludGVybmFsLT5zaF9lbnRzaXplICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfZW50c2l6ZSk7Ci0gICAgfQotCi0gIGZyZWUgKHNoZHJzKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotZ2V0XzY0Yml0X3NlY3Rpb25faGVhZGVycyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZjY0X0V4dGVybmFsX1NoZHIgKiBzaGRyczsKLSAgRWxmNjRfSW50ZXJuYWxfU2hkciAqIGludGVybmFsOwotICB1bnNpZ25lZCBpbnQgICAgICAgICAgaTsKLQotICBHRVRfREFUQV9BTExPQyAoZWxmX2hlYWRlci5lX3Nob2ZmLAotCQkgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgKiBlbGZfaGVhZGVyLmVfc2hudW0sCi0JCSAgc2hkcnMsIEVsZjY0X0V4dGVybmFsX1NoZHIgKiwgInNlY3Rpb24gaGVhZGVycyIpOwotCi0gIHNlY3Rpb25faGVhZGVycyA9IChFbGZfSW50ZXJuYWxfU2hkciAqKSBtYWxsb2MKLSAgICAoZWxmX2hlYWRlci5lX3NobnVtICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU2hkcikpOwotCi0gIGlmIChzZWN0aW9uX2hlYWRlcnMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGludGVybmFsID0gc2VjdGlvbl9oZWFkZXJzOwotICAgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0gICAgICAgaSArKywgaW50ZXJuYWwgKyspCi0gICAgewotICAgICAgaW50ZXJuYWwtPnNoX25hbWUgICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9uYW1lKTsKLSAgICAgIGludGVybmFsLT5zaF90eXBlICAgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfdHlwZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfZmxhZ3MgICAgID0gQllURV9HRVQ4IChzaGRyc1tpXS5zaF9mbGFncyk7Ci0gICAgICBpbnRlcm5hbC0+c2hfYWRkciAgICAgID0gQllURV9HRVQ4IChzaGRyc1tpXS5zaF9hZGRyKTsKLSAgICAgIGludGVybmFsLT5zaF9zaXplICAgICAgPSBCWVRFX0dFVDggKHNoZHJzW2ldLnNoX3NpemUpOwotICAgICAgaW50ZXJuYWwtPnNoX2VudHNpemUgICA9IEJZVEVfR0VUOCAoc2hkcnNbaV0uc2hfZW50c2l6ZSk7Ci0gICAgICBpbnRlcm5hbC0+c2hfbGluayAgICAgID0gQllURV9HRVQgKHNoZHJzW2ldLnNoX2xpbmspOwotICAgICAgaW50ZXJuYWwtPnNoX2luZm8gICAgICA9IEJZVEVfR0VUIChzaGRyc1tpXS5zaF9pbmZvKTsKLSAgICAgIGludGVybmFsLT5zaF9vZmZzZXQgICAgPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfb2Zmc2V0KTsKLSAgICAgIGludGVybmFsLT5zaF9hZGRyYWxpZ24gPSBCWVRFX0dFVCAoc2hkcnNbaV0uc2hfYWRkcmFsaWduKTsKLSAgICB9Ci0KLSAgZnJlZSAoc2hkcnMpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqCi1nZXRfMzJiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgbnVtYmVyKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotewotICBFbGYzMl9FeHRlcm5hbF9TeW0gKiBlc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgaXN5bXM7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKiAgIHBzeW07Ci0gIHVuc2lnbmVkIGludCAgICAgICAgIGo7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKG9mZnNldCwgbnVtYmVyICogc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pLAotCQkgIGVzeW1zLCBFbGYzMl9FeHRlcm5hbF9TeW0gKiwgInN5bWJvbHMiKTsKLQotICBpc3ltcyA9IChFbGZfSW50ZXJuYWxfU3ltICopIG1hbGxvYyAobnVtYmVyICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0KLSAgaWYgKGlzeW1zID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVzeW1zKTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGZvciAoaiA9IDAsIHBzeW0gPSBpc3ltczsKLSAgICAgICBqIDwgbnVtYmVyOwotICAgICAgIGogKyssIHBzeW0gKyspCi0gICAgewotICAgICAgcHN5bS0+c3RfbmFtZSAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfbmFtZSk7Ci0gICAgICBwc3ltLT5zdF92YWx1ZSA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF92YWx1ZSk7Ci0gICAgICBwc3ltLT5zdF9zaXplICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9zaXplKTsKLSAgICAgIHBzeW0tPnN0X3NobmR4ID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3NobmR4KTsKLSAgICAgIHBzeW0tPnN0X2luZm8gID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X2luZm8pOwotICAgICAgcHN5bS0+c3Rfb3RoZXIgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3Rfb3RoZXIpOwotICAgIH0KLQotICBmcmVlIChlc3ltcyk7Ci0KLSAgcmV0dXJuIGlzeW1zOwotfQotCi1zdGF0aWMgRWxmX0ludGVybmFsX1N5bSAqCi1nZXRfNjRiaXRfZWxmX3N5bWJvbHMgKGZpbGUsIG9mZnNldCwgbnVtYmVyKQotICAgICBGSUxFICogZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotewotICBFbGY2NF9FeHRlcm5hbF9TeW0gKiBlc3ltczsKLSAgRWxmX0ludGVybmFsX1N5bSAqICAgaXN5bXM7Ci0gIEVsZl9JbnRlcm5hbF9TeW0gKiAgIHBzeW07Ci0gIHVuc2lnbmVkIGludCAgICAgICAgIGo7Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKG9mZnNldCwgbnVtYmVyICogc2l6ZW9mIChFbGY2NF9FeHRlcm5hbF9TeW0pLAotCQkgIGVzeW1zLCBFbGY2NF9FeHRlcm5hbF9TeW0gKiwgInN5bWJvbHMiKTsKLQotICBpc3ltcyA9IChFbGZfSW50ZXJuYWxfU3ltICopIG1hbGxvYyAobnVtYmVyICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfU3ltKSk7Ci0KLSAgaWYgKGlzeW1zID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVzeW1zKTsKLQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGZvciAoaiA9IDAsIHBzeW0gPSBpc3ltczsKLSAgICAgICBqIDwgbnVtYmVyOwotICAgICAgIGogKyssIHBzeW0gKyspCi0gICAgewotICAgICAgcHN5bS0+c3RfbmFtZSAgPSBCWVRFX0dFVCAoZXN5bXNbal0uc3RfbmFtZSk7Ci0gICAgICBwc3ltLT5zdF9pbmZvICA9IEJZVEVfR0VUIChlc3ltc1tqXS5zdF9pbmZvKTsKLSAgICAgIHBzeW0tPnN0X290aGVyID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X290aGVyKTsKLSAgICAgIHBzeW0tPnN0X3NobmR4ID0gQllURV9HRVQgKGVzeW1zW2pdLnN0X3NobmR4KTsKLSAgICAgIHBzeW0tPnN0X3ZhbHVlID0gQllURV9HRVQ4IChlc3ltc1tqXS5zdF92YWx1ZSk7Ci0gICAgICBwc3ltLT5zdF9zaXplICA9IEJZVEVfR0VUOCAoZXN5bXNbal0uc3Rfc2l6ZSk7Ci0gICAgfQotCi0gIGZyZWUgKGVzeW1zKTsKLQotICByZXR1cm4gaXN5bXM7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICBpbnQgICAgICAgICAgICAgICAgIGk7Ci0KLSAgc2VjdGlvbl9oZWFkZXJzID0gTlVMTDsKLQotICBpZiAoZWxmX2hlYWRlci5lX3NobnVtID09IDApCi0gICAgewotICAgICAgaWYgKGRvX3NlY3Rpb25zKQotCXByaW50ZiAoXygiXG5UaGVyZSBhcmUgbm8gc2VjdGlvbnMgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGRvX3NlY3Rpb25zICYmICFkb19oZWFkZXIpCi0gICAgcHJpbnRmIChfKCJUaGVyZSBhcmUgJWQgc2VjdGlvbiBoZWFkZXJzLCBzdGFydGluZyBhdCBvZmZzZXQgMHglbHg6XG4iKSwKLQkgICAgZWxmX2hlYWRlci5lX3NobnVtLCAodW5zaWduZWQgbG9uZykgZWxmX2hlYWRlci5lX3Nob2ZmKTsKLQotICBpZiAoaXNfMzJiaXRfZWxmKQotICAgIHsKLSAgICAgIGlmICghIGdldF8zMmJpdF9zZWN0aW9uX2hlYWRlcnMgKGZpbGUpKQotCXJldHVybiAwOwotICAgIH0KLSAgZWxzZSBpZiAoISBnZXRfNjRiaXRfc2VjdGlvbl9oZWFkZXJzIChmaWxlKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBSZWFkIGluIHRoZSBzdHJpbmcgdGFibGUsIHNvIHRoYXQgd2UgaGF2ZSBuYW1lcyB0byBkaXNwbGF5LiAgKi8KLSAgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVycyArIGVsZl9oZWFkZXIuZV9zaHN0cm5keDsKLQotICBpZiAoc2VjdGlvbi0+c2hfc2l6ZSAhPSAwKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgc3RyaW5nX3RhYmxlX29mZnNldDsKLQotICAgICAgc3RyaW5nX3RhYmxlX29mZnNldCA9IHNlY3Rpb24tPnNoX29mZnNldDsKLQotICAgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJICAgICAgc3RyaW5nX3RhYmxlLCBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKLSAgICB9Ci0KLSAgLyogU2NhbiB0aGUgc2VjdGlvbnMgZm9yIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZQotICAgICBhbmQgZHluYW1pYyBzdHJpbmcgdGFibGUgYW5kIGRlYnVnIHNlY3Rpb25zLiAqLwotICBkeW5hbWljX3N5bWJvbHMgPSBOVUxMOwotICBkeW5hbWljX3N0cmluZ3MgPSBOVUxMOwotICBkeW5hbWljX3N5bWluZm8gPSBOVUxMOwotICAKLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgY2hhciAqIG5hbWUgPSBTRUNUSU9OX05BTUUgKHNlY3Rpb24pOwotCi0gICAgICBpZiAoc2VjdGlvbi0+c2hfdHlwZSA9PSBTSFRfRFlOU1lNKQotCXsKLQkgIGlmIChkeW5hbWljX3N5bWJvbHMgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJGaWxlIGNvbnRhaW5zIG11bHRpcGxlIGR5bmFtaWMgc3ltYm9sIHRhYmxlc1xuIikpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIG51bV9keW5hbWljX3N5bXMgPSBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgIGR5bmFtaWNfc3ltYm9scyA9Ci0JICAgIEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LCBudW1fZHluYW1pY19zeW1zKTsKLQl9Ci0gICAgICBlbHNlIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9TVFJUQUIKLQkgICAgICAgJiYgc3RyY21wIChuYW1lLCAiLmR5bnN0ciIpID09IDApCi0JewotCSAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZXJyb3IgKF8oIkZpbGUgY29udGFpbnMgbXVsdGlwbGUgZHluYW1pYyBzdHJpbmcgdGFibGVzXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJCSAgZHluYW1pY19zdHJpbmdzLCBjaGFyICosICJkeW5hbWljIHN0cmluZ3MiKTsKLQl9Ci0gICAgICBlbHNlIGlmICgoZG9fZGVidWdnaW5nIHx8IGRvX2RlYnVnX2luZm8gfHwgZG9fZGVidWdfYWJicmV2cwotCQl8fCBkb19kZWJ1Z19saW5lcyB8fCBkb19kZWJ1Z19wdWJuYW1lcyB8fCBkb19kZWJ1Z19hcmFuZ2VzKQotCSAgICAgICAmJiBzdHJuY21wIChuYW1lLCAiLmRlYnVnXyIsIDcpID09IDApCi0JewotCSAgbmFtZSArPSA3OwotCi0JICBpZiAoZG9fZGVidWdnaW5nCi0JICAgICAgfHwgKGRvX2RlYnVnX2luZm8gICAgICYmIChzdHJjbXAgKG5hbWUsICJpbmZvIikgPT0gMCkpCi0JICAgICAgfHwgKGRvX2RlYnVnX2FiYnJldnMgICYmIChzdHJjbXAgKG5hbWUsICJhYmJyZXYiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfbGluZXMgICAgJiYgKHN0cmNtcCAobmFtZSwgImxpbmUiKSA9PSAwKSkKLQkgICAgICB8fCAoZG9fZGVidWdfcHVibmFtZXMgJiYgKHN0cmNtcCAobmFtZSwgInB1Ym5hbWVzIikgPT0gMCkpCi0JICAgICAgfHwgKGRvX2RlYnVnX2FyYW5nZXMgICYmIChzdHJjbXAgKG5hbWUsICJhcmFuZ2VzIikgPT0gMCkpCi0JICAgICAgKQotCSAgICByZXF1ZXN0X2R1bXAgKGksIERFQlVHX0RVTVApOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZG9fc2VjdGlvbnMpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcHJpbnRmIChfKCJcblNlY3Rpb24gSGVhZGVyJXM6XG4iKSwgZWxmX2hlYWRlci5lX3NobnVtID4gMSA/ICJzIiA6ICIiKTsKLSAgcHJpbnRmCi0gICAgKF8oIiAgW05yXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgSW5mIEFsXG4iKSk7Ci0KLSAgZm9yIChpID0gMCwgc2VjdGlvbiA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgICBpIDwgZWxmX2hlYWRlci5lX3NobnVtOwotICAgICAgIGkgKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgcHJpbnRmICgiICBbJTJkXSAlLTE3LjE3cyAlLTE1LjE1cyAiLAotCSAgICAgIGksCi0JICAgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwKLQkgICAgICBnZXRfc2VjdGlvbl90eXBlX25hbWUgKHNlY3Rpb24tPnNoX3R5cGUpKTsKLQotICAgICAgcHJpbnRmICggIiU4LjhseCAlNi42bHggJTYuNmx4ICUyLjJseCIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9hZGRyLAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCSAgICAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfc2l6ZSwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX2VudHNpemUpOwotCi0gICAgICBwcmludGYgKCIgJWMlYyVjICUybGQgJTNseCAlbGRcbiIsCi0JICAgICAgKHNlY3Rpb24tPnNoX2ZsYWdzICYgU0hGX1dSSVRFID8gJ1cnIDogJyAnKSwKLQkgICAgICAoc2VjdGlvbi0+c2hfZmxhZ3MgJiBTSEZfQUxMT0MgPyAnQScgOiAnICcpLAotCSAgICAgIChzZWN0aW9uLT5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIgPyAnWCcgOiAnICcpLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9saW5rLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9pbmZvLAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9hZGRyYWxpZ24pOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogUHJvY2VzcyB0aGUgcmVsb2Mgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3JlbG9jcyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgcmVsX3NpemU7Ci0gIHVuc2lnbmVkIGxvbmcJICAgcmVsX29mZnNldDsKLQotCi0gIGlmICghZG9fcmVsb2MpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKGRvX3VzaW5nX2R5bmFtaWMpCi0gICAgewotICAgICAgaW50IGlzX3JlbGE7Ci0KLSAgICAgIHJlbF9zaXplICAgPSAwOwotICAgICAgcmVsX29mZnNldCA9IDA7Ci0KLSAgICAgIGlmIChkeW5hbWljX2luZm9bRFRfUkVMXSkKLQl7Ci0JICByZWxfb2Zmc2V0ID0gZHluYW1pY19pbmZvW0RUX1JFTF07Ci0JICByZWxfc2l6ZSAgID0gZHluYW1pY19pbmZvW0RUX1JFTFNaXTsKLQkgIGlzX3JlbGEgICAgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlIGlmIChkeW5hbWljX2luZm8gW0RUX1JFTEFdKQotCXsKLQkgIHJlbF9vZmZzZXQgPSBkeW5hbWljX2luZm9bRFRfUkVMQV07Ci0JICByZWxfc2l6ZSAgID0gZHluYW1pY19pbmZvW0RUX1JFTEFTWl07Ci0JICBpc19yZWxhICAgID0gVFJVRTsKLQl9Ci0gICAgICBlbHNlIGlmIChkeW5hbWljX2luZm9bRFRfSk1QUkVMXSkKLQl7Ci0JICByZWxfb2Zmc2V0ID0gZHluYW1pY19pbmZvW0RUX0pNUFJFTF07Ci0JICByZWxfc2l6ZSAgID0gZHluYW1pY19pbmZvW0RUX1BMVFJFTFNaXTsKLQkgIAotCSAgc3dpdGNoIChkeW5hbWljX2luZm9bRFRfUExUUkVMXSkKLQkgICAgewotCSAgICBjYXNlIERUX1JFTDoKLQkgICAgICBpc19yZWxhID0gRkFMU0U7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRfUkVMQToKLQkgICAgICBpc19yZWxhID0gVFJVRTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpc19yZWxhID0gVU5LTk9XTjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJlbF9zaXplKQotCXsKLQkgIHByaW50ZgotCSAgICAoXygiXG5SZWxvY2F0aW9uIHNlY3Rpb24gYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsZCBieXRlczpcbiIpLAotCSAgICAgcmVsX29mZnNldCwgcmVsX3NpemUpOwotCi0JICBkdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0IC0gbG9hZGFkZHIsIHJlbF9zaXplLAotCQkJICAgIGR5bmFtaWNfc3ltYm9scywgbnVtX2R5bmFtaWNfc3ltcywgZHluYW1pY19zdHJpbmdzLCBpc19yZWxhKTsKLQl9Ci0gICAgICBlbHNlCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyBkeW5hbWljIHJlbG9jYXRpb25zIGluIHRoaXMgZmlsZS5cbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICAgIHNlY3Rpb247Ci0gICAgICB1bnNpZ25lZCBsb25nIAkJaTsKLSAgICAgIGludCAgICAgICAgICAgCQlmb3VuZCA9IDA7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLQkgICBpKyssIHNlY3Rpb24gKyspCi0JewotCSAgaWYgKCAgIHNlY3Rpb24tPnNoX3R5cGUgIT0gU0hUX1JFTEEKLQkgICAgICAmJiBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9SRUwpCi0JICAgIGNvbnRpbnVlOwotCi0JICByZWxfb2Zmc2V0ID0gc2VjdGlvbi0+c2hfb2Zmc2V0OwotCSAgcmVsX3NpemUgICA9IHNlY3Rpb24tPnNoX3NpemU7Ci0KLQkgIGlmIChyZWxfc2l6ZSkKLQkgICAgewotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzdHJzZWM7Ci0JICAgICAgRWxmMzJfSW50ZXJuYWxfU2hkciAqIHN5bXNlYzsKLQkgICAgICBFbGZfSW50ZXJuYWxfU3ltICogICAgc3ltdGFiOwotCSAgICAgIGNoYXIgKiAgICAgICAgICAgICAgICBzdHJ0YWI7Ci0JICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGlzX3JlbGE7Ci0JICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgIG5zeW1zOwotCSAgICAgIAotCSAgICAgIHByaW50ZiAoXygiXG5SZWxvY2F0aW9uIHNlY3Rpb24gIikpOwotCi0JICAgICAgaWYgKHN0cmluZ190YWJsZSA9PSBOVUxMKQotCQlwcmludGYgKCIlZCIsIHNlY3Rpb24tPnNoX25hbWUpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiJyVzJyIsIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0JICAgICAgcHJpbnRmIChfKCIgYXQgb2Zmc2V0IDB4JWx4IGNvbnRhaW5zICVsdSBlbnRyaWVzOlxuIiksCi0JCSByZWxfb2Zmc2V0LCAodW5zaWduZWQgbG9uZykgKHJlbF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSkpOwotCi0JICAgICAgc3ltc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluazsKLQotCSAgICAgIG5zeW1zID0gc3ltc2VjLT5zaF9zaXplIC8gc3ltc2VjLT5zaF9lbnRzaXplOwotCSAgICAgIHN5bXRhYiA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc3ltc2VjLT5zaF9vZmZzZXQsIG5zeW1zKTsKLQotCSAgICAgIGlmIChzeW10YWIgPT0gTlVMTCkKLQkJY29udGludWU7Ci0KLQkgICAgICBzdHJzZWMgPSBzZWN0aW9uX2hlYWRlcnMgKyBzeW1zZWMtPnNoX2xpbms7Ci0KLQkgICAgICBHRVRfREFUQV9BTExPQyAoc3Ryc2VjLT5zaF9vZmZzZXQsIHN0cnNlYy0+c2hfc2l6ZSwgc3RydGFiLAotCQkJICAgICAgY2hhciAqLCAic3RyaW5nIHRhYmxlIik7Ci0JICAgICAgCi0JICAgICAgaXNfcmVsYSA9IHNlY3Rpb24tPnNoX3R5cGUgPT0gU0hUX1JFTEE7Ci0KLQkgICAgICBkdW1wX3JlbG9jYXRpb25zIChmaWxlLCByZWxfb2Zmc2V0LCByZWxfc2l6ZSwgc3ltdGFiLCBuc3ltcywgc3RydGFiLCBpc19yZWxhKTsKLQotCSAgICAgIGZyZWUgKHN0cnRhYik7Ci0JICAgICAgZnJlZSAoc3ltdGFiKTsKLQotCSAgICAgIGZvdW5kID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCEgZm91bmQpCi0JcHJpbnRmIChfKCJcblRoZXJlIGFyZSBubyByZWxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB2b2lkCi1keW5hbWljX3NlZ21lbnRfbWlwc192YWwgKGVudHJ5KQotICAgICBFbGZfSW50ZXJuYWxfRHluICogZW50cnk7Ci17Ci0gIHN3aXRjaCAoZW50cnktPmRfdGFnKQotICAgIHsKLSAgICBjYXNlIERUX01JUFNfRkxBR1M6Ci0gICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQlwcmludGYgKCJOT05FXG4iKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciAqIG9wdHNbXSA9Ci0JICB7Ci0JICAgICJRVUlDS1NUQVJUIiwgIk5PVFBPVCIsICJOT19MSUJSQVJZX1JFUExBQ0VNRU5UIiwKLQkgICAgIk5PX01PVkUiLCAiU0dJX09OTFkiLCAiR1VBUkFOVEVFX0lOSVQiLCAiREVMVEFfQ19QTFVTX1BMVVMiLAotCSAgICAiR1VBUkFOVEVFX1NUQVJUX0lOSVQiLCAiUElYSUUiLCAiREVGQVVMVF9ERUxBWV9MT0FEIiwKLQkgICAgIlJFUVVJQ0tTVEFSVCIsICJSRVFVSUNLU1RBUlRFRCIsICJDT1JEIiwgIk5PX1VOUkVTX1VOREVGIiwKLQkgICAgIlJMRF9PUkRFUl9TQUZFIgotCSAgfTsKLQkgIHVuc2lnbmVkIGludCBjbnQ7Ci0JICBpbnQgZmlyc3QgPSAxOwotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fRUxFTSAob3B0cyk7ICsrIGNudCkKLQkgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsICYgKDEgPDwgY250KSkKLQkgICAgICB7Ci0JCXByaW50ZiAoIiVzJXMiLCBmaXJzdCA/ICIiIDogIiAiLCBvcHRzW2NudF0pOwotCQlmaXJzdCA9IDA7Ci0JICAgICAgfQotCSAgcHV0cyAoIiIpOwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBEVF9NSVBTX0lWRVJTSU9OOgotICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotCXByaW50ZiAoIkludGVyZmFjZSBWZXJzaW9uOiAlc1xuIiwKLQkJZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWwpOwotICAgICAgZWxzZQotCXByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBEVF9NSVBTX1RJTUVfU1RBTVA6Ci0gICAgICB7Ci0JY2hhciB0aW1lYnVmWzIwXTsKLQl0aW1lX3QgdGltZSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCXN0cmZ0aW1lICh0aW1lYnVmLCAyMCwgIiVZLSVtLSVkVCVIOiVNOiVTIiwgZ210aW1lICgmdGltZSkpOwotCXByaW50ZiAoIlRpbWUgU3RhbXA6ICVzXG4iLCB0aW1lYnVmKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBEVF9NSVBTX1JMRF9WRVJTSU9OOgotICAgIGNhc2UgRFRfTUlQU19MT0NBTF9HT1ROTzoKLSAgICBjYXNlIERUX01JUFNfQ09ORkxJQ1ROTzoKLSAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgotICAgIGNhc2UgRFRfTUlQU19TWU1UQUJOTzoKLSAgICBjYXNlIERUX01JUFNfVU5SRUZFWFROTzoKLSAgICBjYXNlIERUX01JUFNfSElQQUdFTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05POgotICAgIGNhc2UgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfUkVMT0NfTk86Ci0gICAgY2FzZSBEVF9NSVBTX0RFTFRBX1NZTV9OTzoKLSAgICBjYXNlIERUX01JUFNfREVMVEFfQ0xBU1NTWU1fTk86Ci0gICAgY2FzZSBEVF9NSVBTX0NPTVBBQ1RfU0laRToKLSAgICAgIHByaW50ZiAoIiVsZFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3B0cik7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXRfMzJiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfRXh0ZXJuYWxfRHluICogZWR5bjsKLSAgRWxmX0ludGVybmFsX0R5biAqICAgZW50cnk7Ci0gIGJmZF9zaXplX3R5cGUgICAgICAgIGk7Ci0gIAotICBHRVRfREFUQV9BTExPQyAoZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUsCi0JCSAgZWR5biwgRWxmMzJfRXh0ZXJuYWxfRHluICosICJkeW5hbWljIHNlZ21lbnQiKTsKLSAgCi0gIC8qIFNHSSdzIEVMRiBoYXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBEWU5BTUlDIHNlZ21lbnQuICBEZXRlcm1pbmUKLSAgICAgaG93IGxhcmdlIHRoaXMgLmR5bmFtaWMgaXMgbm93LiAgV2UgY2FuIGRvIHRoaXMgZXZlbiBiZWZvcmUgdGhlIGJ5dGUKLSAgICAgc3dhcHBpbmcgc2luY2UgdGhlIERUX05VTEwgdGFnIGlzIHJlY29nbml6YWJsZS4gICovCi0gIGR5bmFtaWNfc2l6ZSA9IDA7Ci0gIHdoaWxlICgqKEVsZjMyX1dvcmQgKikgZWR5biBbZHluYW1pY19zaXplKytdLmRfdGFnICE9IERUX05VTEwpCi0gICAgOwotCi0gIGR5bmFtaWNfc2VnbWVudCA9IChFbGZfSW50ZXJuYWxfRHluICopCi0gICAgbWFsbG9jIChkeW5hbWljX3NpemUgKiBzaXplb2YgKEVsZl9JbnRlcm5hbF9EeW4pKTsKLQotICBpZiAoZHluYW1pY19zZWdtZW50ID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVkeW4pOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotICAgICAgIGkgPCBkeW5hbWljX3NpemU7Ci0gICAgICAgaSArKywgZW50cnkgKyspCi0gICAgewotICAgICAgZW50cnktPmRfdGFnICAgICAgPSBCWVRFX0dFVCAoZWR5biBbaV0uZF90YWcpOwotICAgICAgZW50cnktPmRfdW4uZF92YWwgPSBCWVRFX0dFVCAoZWR5biBbaV0uZF91bi5kX3ZhbCk7Ci0gICAgfQotCi0gIGZyZWUgKGVkeW4pOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1nZXRfNjRiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmNjRfRXh0ZXJuYWxfRHluICogZWR5bjsKLSAgRWxmX0ludGVybmFsX0R5biAqICAgZW50cnk7Ci0gIGJmZF9zaXplX3R5cGUgICAgICAgIGk7Ci0gIAotICBHRVRfREFUQV9BTExPQyAoZHluYW1pY19hZGRyLCBkeW5hbWljX3NpemUsCi0JCSAgZWR5biwgRWxmNjRfRXh0ZXJuYWxfRHluICosICJkeW5hbWljIHNlZ21lbnQiKTsKLSAgCi0gIC8qIFNHSSdzIEVMRiBoYXMgbW9yZSB0aGFuIG9uZSBzZWN0aW9uIGluIHRoZSBEWU5BTUlDIHNlZ21lbnQuICBEZXRlcm1pbmUKLSAgICAgaG93IGxhcmdlIHRoaXMgLmR5bmFtaWMgaXMgbm93LiAgV2UgY2FuIGRvIHRoaXMgZXZlbiBiZWZvcmUgdGhlIGJ5dGUKLSAgICAgc3dhcHBpbmcgc2luY2UgdGhlIERUX05VTEwgdGFnIGlzIHJlY29nbml6YWJsZS4gICovCi0gIGR5bmFtaWNfc2l6ZSA9IDA7Ci0gIHdoaWxlICgqKGJmZF92bWEgKikgZWR5biBbZHluYW1pY19zaXplICsrXS5kX3RhZyAhPSBEVF9OVUxMKQotICAgIDsKLQotICBkeW5hbWljX3NlZ21lbnQgPSAoRWxmX0ludGVybmFsX0R5biAqKQotICAgIG1hbGxvYyAoZHluYW1pY19zaXplICogc2l6ZW9mIChFbGZfSW50ZXJuYWxfRHluKSk7Ci0KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5XG4iKSk7Ci0gICAgICBmcmVlIChlZHluKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsKLSAgICAgICBpIDwgZHluYW1pY19zaXplOwotICAgICAgIGkgKyssIGVudHJ5ICsrKQotICAgIHsKLSAgICAgIGVudHJ5LT5kX3RhZyAgICAgID0gQllURV9HRVQ4IChlZHluIFtpXS5kX3RhZyk7Ci0gICAgICBlbnRyeS0+ZF91bi5kX3ZhbCA9IEJZVEVfR0VUOCAoZWR5biBbaV0uZF91bi5kX3ZhbCk7Ci0gICAgfQotCi0gIGZyZWUgKGVkeW4pOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQYXJzZSBhbmQgZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIGR5bmFtaWMgc2VnbWVudC4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2R5bmFtaWNfc2VnbWVudCAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLSAgYmZkX3NpemVfdHlwZSAgICAgIGk7Ci0KLSAgaWYgKGR5bmFtaWNfc2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChkb19keW5hbWljKQotCXByaW50ZiAoXygiXG5UaGVyZSBpcyBubyBkeW5hbWljIHNlZ21lbnQgaW4gdGhpcyBmaWxlLlxuIikpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBpZiAoISBnZXRfMzJiaXRfZHluYW1pY19zZWdtZW50IChmaWxlKSkKLQlyZXR1cm4gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKCEgZ2V0XzY0Yml0X2R5bmFtaWNfc2VnbWVudCAoZmlsZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogRmluZCB0aGUgYXBwcm9wcmlhdGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltYm9scyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotCSAgIGkgPCBkeW5hbWljX3NpemU7Ci0JICAgKytpLCArKyBlbnRyeSkKLQl7Ci0JICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkgIGlmIChlbnRyeS0+ZF90YWcgIT0gRFRfU1lNVEFCKQotCSAgICBjb250aW51ZTsKLQotCSAgZHluYW1pY19pbmZvW0RUX1NZTVRBQl0gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgLyogU2luY2Ugd2UgZG8gbm90IGtub3cgaG93IGJpZyB0aGUgc3ltYm9sIHRhYmxlIGlzLAotCSAgICAgd2UgZGVmYXVsdCB0byByZWFkaW5nIGluIHRoZSBlbnRpcmUgZmlsZSAoISkgYW5kCi0JICAgICBwcm9jZXNzaW5nIHRoYXQuICBUaGlzIGlzIG92ZXJraWxsLCBJIGtub3csIGJ1dCBpdAotCSAgICAgc2hvdWxkIHdvcmsuICovCi0JICBvZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCi0JICBpZiAoZnNlZWsgKGZpbGUsIDAsIFNFRUtfRU5EKSkKLQkgICAgZXJyb3IgKF8oIlVuYWJsZSB0byBzZWVrIHRvIGVuZCBvZiBmaWxlISIpKTsKLQotCSAgaWYgKGlzXzMyYml0X2VsZikKLQkgICAgbnVtX2R5bmFtaWNfc3ltcyA9IChmdGVsbCAoZmlsZSkgLSBvZmZzZXQpIC8gc2l6ZW9mIChFbGYzMl9FeHRlcm5hbF9TeW0pOwotCSAgZWxzZQotCSAgICBudW1fZHluYW1pY19zeW1zID0gKGZ0ZWxsIChmaWxlKSAtIG9mZnNldCkgLyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1N5bSk7Ci0KLQkgIGlmIChudW1fZHluYW1pY19zeW1zIDwgMSkKLQkgICAgewotCSAgICAgIGVycm9yIChfKCJVbmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygc3ltYm9scyB0byBsb2FkXG4iKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgZHluYW1pY19zeW1ib2xzID0gR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBvZmZzZXQsIG51bV9keW5hbWljX3N5bXMpOwotCX0KLSAgICB9Ci0KLSAgLyogU2ltaWxhcmx5IGZpbmQgYSBzdHJpbmcgdGFibGUuICAqLwotICBpZiAoZHluYW1pY19zdHJpbmdzID09IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCSAgbG9uZyAgICAgICAgICBzdHJfdGFiX2xlbjsKLQotCSAgaWYgKGVudHJ5LT5kX3RhZyAhPSBEVF9TVFJUQUIpCi0JICAgIGNvbnRpbnVlOwotCi0JICBkeW5hbWljX2luZm9bRFRfU1RSVEFCXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICAvKiBTaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnIHRoZSBzdHJpbmcgdGFibGUgaXMsCi0JICAgICB3ZSBkZWZhdWx0IHRvIHJlYWRpbmcgaW4gdGhlIGVudGlyZSBmaWxlICghKSBhbmQKLQkgICAgIHByb2Nlc3NpbmcgdGhhdC4gIFRoaXMgaXMgb3ZlcmtpbGwsIEkga25vdywgYnV0IGl0Ci0JICAgICBzaG91bGQgd29yay4gKi8KLQotCSAgb2Zmc2V0ID0gZW50cnktPmRfdW4uZF92YWwgLSBsb2FkYWRkcjsKLQkgIGlmIChmc2VlayAoZmlsZSwgMCwgU0VFS19FTkQpKQotCSAgICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gZW5kIG9mIGZpbGVcbiIpKTsKLQkgIHN0cl90YWJfbGVuID0gZnRlbGwgKGZpbGUpIC0gb2Zmc2V0OwotCi0JICBpZiAoc3RyX3RhYl9sZW4gPCAxKQotCSAgICB7Ci0JICAgICAgZXJyb3IKLQkJKF8oIlVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgZHluYW1pYyBzdHJpbmcgdGFibGVcbiIpKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBHRVRfREFUQV9BTExPQyAob2Zmc2V0LCBzdHJfdGFiX2xlbiwgZHluYW1pY19zdHJpbmdzLCBjaGFyICosCi0JCQkgICJkeW5hbWljIHN0cmluZyB0YWJsZSIpOwotCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIEFuZCBmaW5kIHRoZSBzeW1pbmZvIHNlY3Rpb24gaWYgYXZhaWxhYmxlLiAgKi8KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzeW1pbnN6ID0gMDsKLQotICAgICAgZm9yIChpID0gMCwgZW50cnkgPSBkeW5hbWljX3NlZ21lbnQ7Ci0JICAgaSA8IGR5bmFtaWNfc2l6ZTsKLQkgICArK2ksICsrIGVudHJ5KQotCXsKLQkgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5FTlQpCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiB0aGVzZSBicmFjZXMgYXJlIG5lY2Vzc2FyeSB0byBhdm9pZCBhIHN5bnRheAotCQkgZXJyb3IgZnJvbSB0aGUgU3VuT1M0IEMgY29tcGlsZXIuICAqLwotCSAgICAgIGFzc2VydCAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfU3ltaW5mbykgPT0gZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBlbHNlIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfU1lNSU5TWikKLQkgICAgc3ltaW5zeiA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCSAgZWxzZSBpZiAoZW50cnktPmRfdGFnID09IERUX1NZTUlORk8pCi0JICAgIGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCX0KLQotICAgICAgaWYgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQgIT0gMCAmJiBzeW1pbnN6ICE9IDApCi0JewotCSAgRWxmX0V4dGVybmFsX1N5bWluZm8gKiBleHRzeW1pbmZvOwotCSAgRWxmX0ludGVybmFsX1N5bWluZm8gKiBzeW1pbmZvOwotCi0JICAvKiBUaGVyZSBpcyBhIHN5bWluZm8gc2VjdGlvbi4gIFJlYWQgdGhlIGRhdGEuICAqLwotCSAgR0VUX0RBVEFfQUxMT0MgKGR5bmFtaWNfc3ltaW5mb19vZmZzZXQsIHN5bWluc3osIGV4dHN5bWluZm8sCi0JCQkgIEVsZl9FeHRlcm5hbF9TeW1pbmZvICosICJzeW1ib2wgaW5mb3JtYXRpb24iKTsKLQotCSAgZHluYW1pY19zeW1pbmZvID0gKEVsZl9JbnRlcm5hbF9TeW1pbmZvICopIG1hbGxvYyAoc3ltaW5zeik7Ci0JICBpZiAoZHluYW1pY19zeW1pbmZvID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0KLQkgIGR5bmFtaWNfc3ltaW5mb19uZW50ID0gc3ltaW5zeiAvIHNpemVvZiAoRWxmX0V4dGVybmFsX1N5bWluZm8pOwotCSAgZm9yIChpID0gMCwgc3ltaW5mbyA9IGR5bmFtaWNfc3ltaW5mbzsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OwotCSAgICAgICArK2ksICsrc3ltaW5mbykKLQkgICAgewotCSAgICAgIHN5bWluZm8tPnNpX2JvdW5kdG8gPSBCWVRFX0dFVCAoZXh0c3ltaW5mb1tpXS5zaV9ib3VuZHRvKTsKLQkgICAgICBzeW1pbmZvLT5zaV9mbGFncyA9IEJZVEVfR0VUIChleHRzeW1pbmZvW2ldLnNpX2ZsYWdzKTsKLQkgICAgfQotCi0JICBmcmVlIChleHRzeW1pbmZvKTsKLQl9Ci0gICAgfQotCi0gIGlmIChkb19keW5hbWljICYmIGR5bmFtaWNfYWRkcikKLSAgICBwcmludGYgKF8oIlxuRHluYW1pYyBzZWdtZW50IGF0IG9mZnNldCAweCV4IGNvbnRhaW5zICVsZCBlbnRyaWVzOlxuIiksCi0JICAgIGR5bmFtaWNfYWRkciwgKGxvbmcpIGR5bmFtaWNfc2l6ZSk7Ci0gIGlmIChkb19keW5hbWljKQotICAgIHByaW50ZiAoXygiICBUYWcgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZS9WYWx1ZVxuIikpOwotCi0gIGZvciAoaSA9IDAsIGVudHJ5ID0gZHluYW1pY19zZWdtZW50OwotICAgICAgIGkgPCBkeW5hbWljX3NpemU7Ci0gICAgICAgaSsrLCBlbnRyeSArKykKLSAgICB7Ci0gICAgICBpZiAoZG9fZHluYW1pYykKLQlwcmludGYgKF8oIiAgMHglLTguOGx4ICglcyklKnMiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5kX3RhZywKLQkJZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdGFnKSwKLQkJMjcgLSBzdHJsZW4gKGdldF9keW5hbWljX3R5cGUgKGVudHJ5LT5kX3RhZykpLAotCQkiICIpOwotCi0gICAgICBzd2l0Y2ggKGVudHJ5LT5kX3RhZykKLQl7Ci0JY2FzZSBEVF9BVVhJTElBUlk6Ci0JY2FzZSBEVF9GSUxURVI6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGlmIChlbnRyeS0+ZF90YWcgPT0gRFRfQVVYSUxJQVJZKQotCQlwcmludGYgKF8oIkF1eGlsaWFyeSBsaWJyYXJ5IikpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmIChfKCJGaWx0ZXIgbGlicmFyeSIpKTsKLQotCSAgICAgIGlmIChkeW5hbWljX3N0cmluZ3MpCi0JCXByaW50ZiAoIjogWyVzXVxuIiwgZHluYW1pY19zdHJpbmdzICsgZW50cnktPmRfdW4uZF92YWwpOwotCSAgICAgIGVsc2UKLQkJcHJpbnRmICgiOiAlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkVBVFVSRV8xOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIkZsYWdzOiIpKTsKLQkgICAgICBpZiAoZW50cnktPmRfdW4uZF92YWwgPT0gMCkKLQkJcHJpbnRmIChfKCIgTm9uZVxuIikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIHVuc2lnbmVkIGxvbmcgaW50IHZhbCA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCQkgIGlmICh2YWwgJiBEVEZfMV9QQVJJTklUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgUEFSSU5JVCIpOwotCQkgICAgICB2YWwgXj0gRFRGXzFfUEFSSU5JVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICE9IDApCi0JCSAgICBwcmludGYgKCIgJWx4IiwgdmFsKTsKLQkJICBwdXRzICgiIik7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIERUX1BPU0ZMQUdfMToKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQkJICBpZiAodmFsICYgREZfUDFfTEFaWUxPQUQpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBMQVpZTE9BRCIpOwotCQkgICAgICB2YWwgXj0gREZfUDFfTEFaWUxPQUQ7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGX1AxX0dST1VQUEVSTSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdST1VQUEVSTSIpOwotCQkgICAgICB2YWwgXj0gREZfUDFfR1JPVVBQRVJNOwotCQkgICAgfQotCQkgIGlmICh2YWwgIT0gMCkKLQkJICAgIHByaW50ZiAoIiAlbHgiLCB2YWwpOwotCQkgIHB1dHMgKCIiKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfRkxBR1NfMToKLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCJGbGFnczoiKSk7Ci0JICAgICAgaWYgKGVudHJ5LT5kX3VuLmRfdmFsID09IDApCi0JCXByaW50ZiAoXygiIE5vbmVcbiIpKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIGludCB2YWwgPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQkJICBpZiAodmFsICYgREZfMV9OT1cpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBOT1ciKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9XOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0dMT0JBTCkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIEdMT0JBTCIpOwotCQkgICAgICB2YWwgXj0gREZfMV9HTE9CQUw7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfR1JPVVApCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBHUk9VUCIpOwotCQkgICAgICB2YWwgXj0gREZfMV9HUk9VUDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9OT0RFTEVURSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE5PREVMRVRFIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX05PREVMRVRFOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0xPQURGTFRSKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgTE9BREZMVFIiKTsKLQkJICAgICAgdmFsIF49IERGXzFfTE9BREZMVFI7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfSU5JVEZJUlNUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgSU5JVEZJUlNUIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0lOSVRGSVJTVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9OT09QRU4pCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoIiBOT09QRU4iKTsKLQkJICAgICAgdmFsIF49IERGXzFfTk9PUEVOOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX09SSUdJTikKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIE9SSUdJTiIpOwotCQkgICAgICB2YWwgXj0gREZfMV9PUklHSU47Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAmIERGXzFfRElSRUNUKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgRElSRUNUIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX0RJUkVDVDsKLQkJICAgIH0KLQkJICBpZiAodmFsICYgREZfMV9UUkFOUykKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIFRSQU5TIik7Ci0JCSAgICAgIHZhbCBePSBERl8xX1RSQU5TOwotCQkgICAgfQotCQkgIGlmICh2YWwgJiBERl8xX0lOVEVSUE9TRSkKLQkJICAgIHsKLQkJICAgICAgcHJpbnRmICgiIElOVEVSUE9TRSIpOwotCQkgICAgICB2YWwgXj0gREZfMV9JTlRFUlBPU0U7Ci0JCSAgICB9Ci0JCSAgaWYgKHZhbCAhPSAwKQotCQkgICAgcHJpbnRmICgiICVseCIsIHZhbCk7Ci0JCSAgcHV0cyAoIiIpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QTFRSRUw6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgcHV0cyAoZ2V0X2R5bmFtaWNfdHlwZSAoZW50cnktPmRfdW4uZF92YWwpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9OVUxMCToKLQljYXNlIERUX05FRURFRAk6Ci0JY2FzZSBEVF9QTFRHT1QJOgotCWNhc2UgRFRfSEFTSAk6Ci0JY2FzZSBEVF9TVFJUQUIJOgotCWNhc2UgRFRfU1lNVEFCCToKLQljYXNlIERUX1JFTEEJOgotCWNhc2UgRFRfSU5JVAk6Ci0JY2FzZSBEVF9GSU5JCToKLQljYXNlIERUX1NPTkFNRQk6Ci0JY2FzZSBEVF9SUEFUSAk6Ci0JY2FzZSBEVF9TWU1CT0xJQzoKLQljYXNlIERUX1JFTAk6Ci0JY2FzZSBEVF9ERUJVRwk6Ci0JY2FzZSBEVF9URVhUUkVMCToKLQljYXNlIERUX0pNUFJFTAk6Ci0JICBkeW5hbWljX2luZm9bZW50cnktPmRfdGFnXSA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCi0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgewotCSAgICAgIGNoYXIgKiBuYW1lOwotCi0JICAgICAgaWYgKGR5bmFtaWNfc3RyaW5ncyA9PSBOVUxMKQotCQluYW1lID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCW5hbWUgPSBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCSAgICAgIGlmIChuYW1lKQotCQl7Ci0JCSAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERUX05FRURFRDoKLQkJICAgICAgcHJpbnRmIChfKCJTaGFyZWQgbGlicmFyeTogWyVzXSIpLCBuYW1lKTsKLQotCQkgICAgICBpZiAoc3RyY21wIChuYW1lLCBwcm9ncmFtX2ludGVycHJldGVyKSkKLQkJCXByaW50ZiAoIlxuIik7Ci0JCSAgICAgIGVsc2UKLQkJCXByaW50ZiAoXygiIHByb2dyYW0gaW50ZXJwcmV0ZXJcbiIpKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgRFRfU09OQU1FOgotCQkgICAgICBwcmludGYgKF8oIkxpYnJhcnkgc29uYW1lOiBbJXNdXG4iKSwgbmFtZSk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlIERUX1JQQVRIOgotCQkgICAgICBwcmludGYgKF8oIkxpYnJhcnkgcnBhdGg6IFslc11cbiIpLCBuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIHByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiUjbHhcbiIsIChsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9QTFRSRUxTWjoKLQljYXNlIERUX1JFTEFTWgk6Ci0JY2FzZSBEVF9TVFJTWgk6Ci0JY2FzZSBEVF9SRUxTWgk6Ci0JY2FzZSBEVF9SRUxBRU5UCToKLQljYXNlIERUX1NZTUVOVAk6Ci0JY2FzZSBEVF9SRUxFTlQJOgotCWNhc2UgRFRfUExUUEFEU1o6Ci0JY2FzZSBEVF9NT1ZFRU5UCToKLQljYXNlIERUX01PVkVTWgk6Ci0JY2FzZSBEVF9JTklUX0FSUkFZU1o6Ci0JY2FzZSBEVF9GSU5JX0FSUkFZU1o6Ci0JICBpZiAoZG9fZHluYW1pYykKLQkgICAgcHJpbnRmICgiJWx1IChieXRlcylcbiIsICh1bnNpZ25lZCBsb25nKSBlbnRyeS0+ZF91bi5kX3ZhbCk7Ci0JICBicmVhazsKLQotCWNhc2UgRFRfVkVSREVGTlVNOgotCWNhc2UgRFRfVkVSTkVFRE5VTToKLQljYXNlIERUX1JFTEFDT1VOVDoKLQljYXNlIERUX1JFTENPVU5UOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHByaW50ZiAoIiVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpIGVudHJ5LT5kX3VuLmRfdmFsKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBEVF9TWU1JTlNaOgotCWNhc2UgRFRfU1lNSU5FTlQ6Ci0JY2FzZSBEVF9TWU1JTkZPOgotCWNhc2UgRFRfVVNFRDoKLQljYXNlIERUX0lOSVRfQVJSQVk6Ci0JY2FzZSBEVF9GSU5JX0FSUkFZOgotCSAgaWYgKGRvX2R5bmFtaWMpCi0JICAgIHsKLQkgICAgICBpZiAoZHluYW1pY19zdHJpbmdzICE9IE5VTEwgJiYgZW50cnktPmRfdGFnID09IERUX1VTRUQpCi0JCXsKLQkJICBjaGFyICogbmFtZTsKLQotCQkgIG5hbWUgPSBkeW5hbWljX3N0cmluZ3MgKyBlbnRyeS0+ZF91bi5kX3ZhbDsKLQotCQkgIGlmICgqIG5hbWUpCi0JCSAgICB7Ci0JCSAgICAgIHByaW50ZiAoXygiTm90IG5lZWRlZCBvYmplY3Q6IFslc11cbiIpLCBuYW1lKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICAKLQkgICAgICBwcmludGYgKCIlI2x4XG4iLCAobG9uZykgZW50cnktPmRfdW4uZF92YWwpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRFRfQklORF9OT1c6Ci0JICAvKiBUaGUgdmFsdWUgb2YgdGhpcyBlbnRyeSBpcyBpZ25vcmVkLiAgKi8KLQkgIGJyZWFrOwotCSAgCi0JZGVmYXVsdDoKLQkgIGlmICgoZW50cnktPmRfdGFnID49IERUX1ZFUlNZTSkgJiYgKGVudHJ5LT5kX3RhZyA8PSBEVF9WRVJORUVETlVNKSkKLQkgICAgdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChlbnRyeS0+ZF90YWcpXSA9Ci0JICAgICAgZW50cnktPmRfdW4uZF92YWw7Ci0KLQkgIGlmIChkb19keW5hbWljKQotCSAgICB7Ci0JICAgICAgc3dpdGNoIChlbGZfaGVhZGVyLmVfbWFjaGluZSkKLQkJewotCQljYXNlIEVNX01JUFM6Ci0JCWNhc2UgRU1fTUlQU19SUzRfQkU6Ci0JCSAgZHluYW1pY19zZWdtZW50X21pcHNfdmFsIChlbnRyeSk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgcHJpbnRmICgiJSNseFxuIiwgKGxvbmcpIGVudHJ5LT5kX3VuLmRfcHRyKTsKLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfdmVyX2ZsYWdzIChmbGFncykKLSAgICAgdW5zaWduZWQgaW50IGZsYWdzOwotewotICBzdGF0aWMgY2hhciBidWZmIFszMl07Ci0KLSAgYnVmZlswXSA9IDA7Ci0KLSAgaWYgKGZsYWdzID09IDApCi0gICAgcmV0dXJuIF8oIm5vbmUiKTsKLQotICBpZiAoZmxhZ3MgJiBWRVJfRkxHX0JBU0UpCi0gICAgc3RyY2F0IChidWZmLCAiQkFTRSAiKTsKLQotICBpZiAoZmxhZ3MgJiBWRVJfRkxHX1dFQUspCi0gICAgewotICAgICAgaWYgKGZsYWdzICYgVkVSX0ZMR19CQVNFKQotCXN0cmNhdCAoYnVmZiwgInwgIik7Ci0KLSAgICAgIHN0cmNhdCAoYnVmZiwgIldFQUsgIik7Ci0gICAgfQotCi0gIGlmIChmbGFncyAmIH4oVkVSX0ZMR19CQVNFIHwgVkVSX0ZMR19XRUFLKSkKLSAgICBzdHJjYXQgKGJ1ZmYsICJ8IDx1bmtub3duPiIpOwotCi0gIHJldHVybiBidWZmOwotfQotCi0vKiBEaXNwbGF5IHRoZSBjb250ZW50cyBvZiB0aGUgdmVyc2lvbiBzZWN0aW9ucy4gICovCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgdW5zaWduZWQgICBpOwotICBpbnQgICAgICAgIGZvdW5kID0gMDsKLQotICBpZiAoISBkb192ZXJzaW9uKQotICAgIHJldHVybiAxOwotCi0gIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLSAgICAgICBpKyssIHNlY3Rpb24gKyspCi0gICAgewotICAgICAgc3dpdGNoIChzZWN0aW9uLT5zaF90eXBlKQotCXsKLQljYXNlIFNIVF9HTlVfdmVyZGVmOgotCSAgewotCSAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICogZWRlZnM7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICBpZHg7Ci0JICAgIHVuc2lnbmVkIGludCAgICAgICAgICBjbnQ7Ci0KLQkgICAgZm91bmQgPSAxOwotCi0JICAgIHByaW50ZgotCSAgICAgIChfKCJcblZlcnNpb24gZGVmaW5pdGlvbiBzZWN0aW9uICclcycgY29udGFpbnMgJWxkIGVudHJpZXM6XG4iKSwKLQkgICAgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgc2VjdGlvbi0+c2hfaW5mbyk7Ci0KLQkgICAgcHJpbnRmIChfKCIgIEFkZHI6IDB4IikpOwotCSAgICBwcmludGZfdm1hIChzZWN0aW9uLT5zaF9hZGRyKTsKLQkgICAgcHJpbnRmIChfKCIgIE9mZnNldDogJSMwOGx4ICBMaW5rOiAlbHggKCVzKVxuIiksCi0JCSAgICAodW5zaWduZWQgbG9uZykgc2VjdGlvbi0+c2hfb2Zmc2V0LCBzZWN0aW9uLT5zaF9saW5rLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rKSk7Ci0KLQkgICAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfc2l6ZSwKLQkJCSAgICBlZGVmcywgRWxmX0V4dGVybmFsX1ZlcmRlZiAqLAotCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24gc2VjdGlvbiIpOwotCi0JICAgIGZvciAoaWR4ID0gY250ID0gMDsgY250IDwgc2VjdGlvbi0+c2hfaW5mbzsgKysgY250KQotCSAgICAgIHsKLQkJY2hhciAqICAgICAgICAgICAgICAgICB2c3RhcnQ7Ci0JCUVsZl9FeHRlcm5hbF9WZXJkZWYgKiAgZWRlZjsKLQkJRWxmX0ludGVybmFsX1ZlcmRlZiAgICBlbnQ7Ci0JCUVsZl9FeHRlcm5hbF9WZXJkYXV4ICogZWF1eDsKLQkJRWxmX0ludGVybmFsX1ZlcmRhdXggICBhdXg7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgajsKLQkJaW50ICAgICAgICAgICAgICAgICAgICBpc3VtOwotCQkKLQkJdnN0YXJ0ID0gKChjaGFyICopIGVkZWZzKSArIGlkeDsKLQotCQllZGVmID0gKEVsZl9FeHRlcm5hbF9WZXJkZWYgKikgdnN0YXJ0OwotCi0JCWVudC52ZF92ZXJzaW9uID0gQllURV9HRVQgKGVkZWYtPnZkX3ZlcnNpb24pOwotCQllbnQudmRfZmxhZ3MgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9mbGFncyk7Ci0JCWVudC52ZF9uZHggICAgID0gQllURV9HRVQgKGVkZWYtPnZkX25keCk7Ci0JCWVudC52ZF9jbnQgICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2NudCk7Ci0JCWVudC52ZF9oYXNoICAgID0gQllURV9HRVQgKGVkZWYtPnZkX2hhc2gpOwotCQllbnQudmRfYXV4ICAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9hdXgpOwotCQllbnQudmRfbmV4dCAgICA9IEJZVEVfR0VUIChlZGVmLT52ZF9uZXh0KTsKLQotCQlwcmludGYgKF8oIiAgJSMwNng6IFJldjogJWQgIEZsYWdzOiAlcyIpLAotCQkJaWR4LCBlbnQudmRfdmVyc2lvbiwgZ2V0X3Zlcl9mbGFncyAoZW50LnZkX2ZsYWdzKSk7Ci0KLQkJcHJpbnRmIChfKCIgIEluZGV4OiAlZCAgQ250OiAlZCAgIiksCi0JCQllbnQudmRfbmR4LCBlbnQudmRfY250KTsKLQotCQl2c3RhcnQgKz0gZW50LnZkX2F1eDsKLQotCQllYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJkYXV4ICopIHZzdGFydDsKLQotCQlhdXgudmRhX25hbWUgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25hbWUpOwotCQlhdXgudmRhX25leHQgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25leHQpOwotCi0JCWlmIChkeW5hbWljX3N0cmluZ3MpCi0JCSAgcHJpbnRmIChfKCJOYW1lOiAlc1xuIiksIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52ZGFfbmFtZSk7Ci0JCWVsc2UKLQkJICBwcmludGYgKF8oIk5hbWUgaW5kZXg6ICVsZFxuIiksIGF1eC52ZGFfbmFtZSk7Ci0KLQkJaXN1bSA9IGlkeCArIGVudC52ZF9hdXg7Ci0KLQkJZm9yIChqID0gMTsgaiA8IGVudC52ZF9jbnQ7IGogKyspCi0JCSAgewotCQkgICAgaXN1bSAgICs9IGF1eC52ZGFfbmV4dDsKLQkJICAgIHZzdGFydCArPSBhdXgudmRhX25leHQ7Ci0KLQkJICAgIGVhdXggPSAoRWxmX0V4dGVybmFsX1ZlcmRhdXggKikgdnN0YXJ0OwotCi0JCSAgICBhdXgudmRhX25hbWUgPSBCWVRFX0dFVCAoZWF1eC0+dmRhX25hbWUpOwotCQkgICAgYXV4LnZkYV9uZXh0ID0gQllURV9HRVQgKGVhdXgtPnZkYV9uZXh0KTsKLQotCQkgICAgaWYgKGR5bmFtaWNfc3RyaW5ncykKLQkJICAgICAgcHJpbnRmIChfKCIgICUjMDZ4OiBQYXJlbnQgJWQ6ICVzXG4iKSwKLQkJCSAgICAgIGlzdW0sIGosIGR5bmFtaWNfc3RyaW5ncyArIGF1eC52ZGFfbmFtZSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHByaW50ZiAoXygiICAlIzA2eDogUGFyZW50ICVkLCBuYW1lIGluZGV4OiAlbGRcbiIpLAotCQkJICAgICAgaXN1bSwgaiwgYXV4LnZkYV9uYW1lKTsKLQkJICB9Ci0KLQkJaWR4ICs9IGVudC52ZF9uZXh0OwotCSAgICAgIH0KLQotCSAgICBmcmVlIChlZGVmcyk7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgU0hUX0dOVV92ZXJuZWVkOgotCSAgewotCSAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAqICBlbmVlZDsKLQkgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgaWR4OwotCSAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBjbnQ7Ci0KLQkgICAgZm91bmQgPSAxOwotCi0JICAgIHByaW50ZiAoXygiXG5WZXJzaW9uIG5lZWRzIHNlY3Rpb24gJyVzJyBjb250YWlucyAlbGQgZW50cmllczpcbiIpLAotCQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSwgc2VjdGlvbi0+c2hfaW5mbyk7Ci0KLQkgICAgcHJpbnRmIChfKCIgQWRkcjogMHgiKSk7Ci0JICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOwotCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbmsgdG8gc2VjdGlvbjogJWxkICglcylcbiIpLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpIHNlY3Rpb24tPnNoX29mZnNldCwgc2VjdGlvbi0+c2hfbGluaywKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbl9oZWFkZXJzICsgc2VjdGlvbi0+c2hfbGluaykpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX3NpemUsCi0JCQkgICAgZW5lZWQsIEVsZl9FeHRlcm5hbF9WZXJuZWVkICosCi0JCQkgICAgInZlcnNpb24gbmVlZCBzZWN0aW9uIik7Ci0KLQkgICAgZm9yIChpZHggPSBjbnQgPSAwOyBjbnQgPCBzZWN0aW9uLT5zaF9pbmZvOyArK2NudCkKLQkgICAgICB7Ci0JCUVsZl9FeHRlcm5hbF9WZXJuZWVkICogZW50cnk7Ci0JCUVsZl9JbnRlcm5hbF9WZXJuZWVkICAgICBlbnQ7Ci0JCWludCAgICAgICAgICAgICAgICAgICAgICBqOwotCQlpbnQgICAgICAgICAgICAgICAgICAgICAgaXN1bTsKLQkJY2hhciAqICAgICAgICAgICAgICAgICAgIHZzdGFydDsKLQotCQl2c3RhcnQgPSAoKGNoYXIgKikgZW5lZWQpICsgaWR4OwotCi0JCWVudHJ5ID0gKEVsZl9FeHRlcm5hbF9WZXJuZWVkICopIHZzdGFydDsKLQotCQllbnQudm5fdmVyc2lvbiA9IEJZVEVfR0VUIChlbnRyeS0+dm5fdmVyc2lvbik7Ci0JCWVudC52bl9jbnQgICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9jbnQpOwotCQllbnQudm5fZmlsZSAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fZmlsZSk7Ci0JCWVudC52bl9hdXggICAgID0gQllURV9HRVQgKGVudHJ5LT52bl9hdXgpOwotCQllbnQudm5fbmV4dCAgICA9IEJZVEVfR0VUIChlbnRyeS0+dm5fbmV4dCk7Ci0KLQkJcHJpbnRmIChfKCIgICUjMDZ4OiBWZXJzaW9uOiAlZCIpLCBpZHgsIGVudC52bl92ZXJzaW9uKTsKLQotCQlpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgIHByaW50ZiAoXygiICBGaWxlOiAlcyIpLCBkeW5hbWljX3N0cmluZ3MgKyBlbnQudm5fZmlsZSk7Ci0JCWVsc2UKLQkJICBwcmludGYgKF8oIiAgRmlsZTogJWx4IiksIGVudC52bl9maWxlKTsKLQotCQlwcmludGYgKF8oIiAgQ250OiAlZFxuIiksIGVudC52bl9jbnQpOwotCi0JCXZzdGFydCArPSBlbnQudm5fYXV4OwotCi0JCWZvciAoaiA9IDAsIGlzdW0gPSBpZHggKyBlbnQudm5fYXV4OyBqIDwgZW50LnZuX2NudDsgKytqKQotCQkgIHsKLQkJICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICogZWF1eDsKLQkJICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgYXV4OwotCi0JCSAgICBlYXV4ID0gKEVsZl9FeHRlcm5hbF9WZXJuYXV4ICopIHZzdGFydDsKLQotCQkgICAgYXV4LnZuYV9oYXNoICA9IEJZVEVfR0VUIChlYXV4LT52bmFfaGFzaCk7Ci0JCSAgICBhdXgudm5hX2ZsYWdzID0gQllURV9HRVQgKGVhdXgtPnZuYV9mbGFncyk7Ci0JCSAgICBhdXgudm5hX290aGVyID0gQllURV9HRVQgKGVhdXgtPnZuYV9vdGhlcik7Ci0JCSAgICBhdXgudm5hX25hbWUgID0gQllURV9HRVQgKGVhdXgtPnZuYV9uYW1lKTsKLQkJICAgIGF1eC52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZWF1eC0+dm5hX25leHQpOwotCi0JCSAgICBpZiAoZHluYW1pY19zdHJpbmdzKQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IE5hbWU6ICVzIiksCi0JCQkgICAgICBpc3VtLCBkeW5hbWljX3N0cmluZ3MgKyBhdXgudm5hX25hbWUpOwotCQkgICAgZWxzZQotCQkgICAgICBwcmludGYgKF8oIiAgJSMwNng6IE5hbWUgaW5kZXg6ICVseCIpLAotCQkJICAgICAgaXN1bSwgYXV4LnZuYV9uYW1lKTsKLQotCQkgICAgcHJpbnRmIChfKCIgIEZsYWdzOiAlcyAgVmVyc2lvbjogJWRcbiIpLAotCQkJICAgIGdldF92ZXJfZmxhZ3MgKGF1eC52bmFfZmxhZ3MpLCBhdXgudm5hX290aGVyKTsKLQotCQkgICAgaXN1bSAgICs9IGF1eC52bmFfbmV4dDsKLQkJICAgIHZzdGFydCArPSBhdXgudm5hX25leHQ7Ci0JCSAgfQotCi0JCWlkeCArPSBlbnQudm5fbmV4dDsKLQkgICAgICB9Ci0JICAgIAotCSAgICBmcmVlIChlbmVlZCk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgU0hUX0dOVV92ZXJzeW06Ci0JICB7Ci0JICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiAgICAgICBsaW5rX3NlY3Rpb247Ci0JICAgIGludCAgICAgICAgICAgICAgCQl0b3RhbDsKLQkgICAgaW50ICAgICAgICAgICAgICAJCWNudDsKLQkgICAgdW5zaWduZWQgY2hhciAqIAkJZWRhdGE7Ci0JICAgIHVuc2lnbmVkIHNob3J0ICogCQlkYXRhOwotCSAgICBjaGFyICogICAgICAgICAgIAkJc3RydGFiOwotCSAgICBFbGZfSW50ZXJuYWxfU3ltICogCQlzeW1ib2xzOwotCSAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICAgICAgc3RyaW5nX3NlYzsKLQotCSAgICBsaW5rX3NlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnMgKyBzZWN0aW9uLT5zaF9saW5rOwotCSAgICB0b3RhbCA9IHNlY3Rpb24tPnNoX3NpemUgLyBzZWN0aW9uLT5zaF9lbnRzaXplOwotCi0JICAgIGZvdW5kID0gMTsKLQotCSAgICBzeW1ib2xzID0gR0VUX0VMRl9TWU1CT0xTIChmaWxlLCBsaW5rX3NlY3Rpb24tPnNoX29mZnNldCwKLQkJCQkgICAgICAgbGlua19zZWN0aW9uLT5zaF9zaXplIC8gbGlua19zZWN0aW9uLT5zaF9lbnRzaXplKTsKLQotCSAgICBzdHJpbmdfc2VjID0gc2VjdGlvbl9oZWFkZXJzICsgbGlua19zZWN0aW9uLT5zaF9saW5rOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DIChzdHJpbmdfc2VjLT5zaF9vZmZzZXQsIHN0cmluZ19zZWMtPnNoX3NpemUsCi0JCQkgICAgc3RydGFiLCBjaGFyICosICJ2ZXJzaW9uIHN0cmluZyB0YWJsZSIpOwotCi0JICAgIHByaW50ZiAoXygiXG5WZXJzaW9uIHN5bWJvbHMgc2VjdGlvbiAnJXMnIGNvbnRhaW5zICVkIGVudHJpZXM6XG4iKSwKLQkJICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbiksIHRvdGFsKTsKLQotCSAgICBwcmludGYgKF8oIiBBZGRyOiAiKSk7Ci0JICAgIHByaW50Zl92bWEgKHNlY3Rpb24tPnNoX2FkZHIpOwotCSAgICBwcmludGYgKF8oIiAgT2Zmc2V0OiAlIzA4bHggIExpbms6ICVseCAoJXMpXG4iKSwKLQkJICAgICh1bnNpZ25lZCBsb25nKSBzZWN0aW9uLT5zaF9vZmZzZXQsIHNlY3Rpb24tPnNoX2xpbmssCi0JCSAgICBTRUNUSU9OX05BTUUgKGxpbmtfc2VjdGlvbikpOwotCi0JICAgIEdFVF9EQVRBX0FMTE9DICh2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldCi0JCQkgICAgLSBsb2FkYWRkciwKLQkJCSAgICB0b3RhbCAqIHNpemVvZiAoc2hvcnQpLCBlZGF0YSwKLQkJCSAgICB1bnNpZ25lZCBjaGFyICosICJ2ZXJzaW9uIHN5bWJvbCBkYXRhIik7Ci0KLQkgICAgZGF0YSA9ICh1bnNpZ25lZCBzaG9ydCAqKSBtYWxsb2MgKHRvdGFsICogc2l6ZW9mIChzaG9ydCkpOwotCi0JICAgIGZvciAoY250ID0gdG90YWw7IGNudCAtLTspCi0JICAgICAgZGF0YSBbY250XSA9IGJ5dGVfZ2V0IChlZGF0YSArIGNudCAqIHNpemVvZiAoc2hvcnQpLAotCQkJCSAgICAgc2l6ZW9mIChzaG9ydCkpOwotCi0JICAgIGZyZWUgKGVkYXRhKTsKLQotCSAgICBmb3IgKGNudCA9IDA7IGNudCA8IHRvdGFsOyBjbnQgKz0gNCkKLQkgICAgICB7Ci0JCWludCBqLCBubjsKLQotCQlwcmludGYgKCIgICUwM3g6IiwgY250KTsKLQotCQlmb3IgKGogPSAwOyAoaiA8IDQpICYmIChjbnQgKyBqKSA8IHRvdGFsOyArK2opCi0JCSAgc3dpdGNoIChkYXRhIFtjbnQgKyBqXSkKLQkJICAgIHsKLQkJICAgIGNhc2UgMDoKLQkJICAgICAgZnB1dHMgKF8oIiAgIDAgKCpsb2NhbCopICAgICIpLCBzdGRvdXQpOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAxOgotCQkgICAgICBmcHV0cyAoXygiICAgMSAoKmdsb2JhbCopICAgIiksIHN0ZG91dCk7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBubiA9IHByaW50ZiAoIiU0eCVjIiwgZGF0YSBbY250ICsgal0gJiAweDdmZmYsCi0JCQkJICAgZGF0YSBbY250ICsgal0gJiAweDgwMDAgPyAnaCcgOiAnICcpOwotCi0JCSAgICAgIGlmIChzeW1ib2xzIFtjbnQgKyBqXS5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUKLQkJCSAgJiYgc2VjdGlvbl9oZWFkZXJzW3N5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4XS5zaF90eXBlCi0JCQkgID09IFNIVF9OT0JJVFMpCi0JCQl7Ci0JCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KLQkJCSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGl2bjsKLQkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIG9mZnNldDsKLQotCQkJICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXQotCQkJICAgIC0gbG9hZGFkZHI7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgIGV2bjsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICAgZXZuYTsKLQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICAgICBpdm5hOwotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIHZuYV9vZmY7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgICAgICBpdm4udm5fYXV4ICA9IEJZVEVfR0VUIChldm4udm5fYXV4KTsKLQkJCSAgICAgIGl2bi52bl9uZXh0ID0gQllURV9HRVQgKGV2bi52bl9uZXh0KTsKLQotCQkJICAgICAgdm5hX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7Ci0KLQkJCSAgICAgIGRvCi0JCQkJewotCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCi0JCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMSkiKTsKLQotCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7Ci0JCQkJICBpdm5hLnZuYV9vdGhlciA9IEJZVEVfR0VUIChldm5hLnZuYV9vdGhlcik7Ci0KLQkJCQkgIHZuYV9vZmYgKz0gaXZuYS52bmFfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZuYS52bmFfb3RoZXIgIT0gZGF0YSBbY250ICsgal0KLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSBkYXRhIFtjbnQgKyBqXSkKLQkJCQl7Ci0JCQkJICBpdm5hLnZuYV9uYW1lID0gQllURV9HRVQgKGV2bmEudm5hX25hbWUpOwotCi0JCQkJICBubiArPSBwcmludGYgKCIoJXMlLSpzIiwKLQkJCQkJCXN0cnRhYiArIGl2bmEudm5hX25hbWUsCi0JCQkJCQkxMiAtIHN0cmxlbiAoc3RydGFiCi0JCQkJCQkJICAgICArIGl2bmEudm5hX25hbWUpLAotCQkJCQkJIikiKTsKLQkJCQkgIGJyZWFrOwotCQkJCX0KLQkJCSAgICAgIGVsc2UgaWYgKGl2bi52bl9uZXh0ID09IDApCi0JCQkJewotCQkJCSAgaWYgKGRhdGEgW2NudCArIGpdICE9IDB4ODAwMSkKLQkJCQkgICAgewotCQkJCSAgICAgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKLQkJCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVyZGVmICBldmQ7Ci0KLQkJCQkgICAgICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8KLQkJCQkJW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildCi0JCQkJCS0gbG9hZGFkZHI7Ci0KLQkJCQkgICAgICBkbwotCQkJCQl7Ci0JCQkJCSAgR0VUX0RBVEEgKG9mZnNldCwgZXZkLAotCQkJCQkJICAgICJ2ZXJzaW9uIGRlZmluaXRpb24iKTsKLQotCQkJCQkgIGl2ZC52ZF9uZXh0ID0gQllURV9HRVQgKGV2ZC52ZF9uZXh0KTsKLQkJCQkJICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQotCQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCQkJfQotCQkJCSAgICAgIHdoaWxlIChpdmQudmRfbmR4Ci0JCQkJCSAgICAgIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQotCQkJCQkgICAgICYmIGl2ZC52ZF9uZXh0ICE9IDApOwotCi0JCQkJICAgICAgaWYgKGl2ZC52ZF9uZHgKLQkJCQkJICA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQotCQkJCQl7Ci0JCQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRhdXggIGV2ZGE7Ci0JCQkJCSAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7Ci0KLQkJCQkJICBpdmQudmRfYXV4ID0gQllURV9HRVQgKGV2ZC52ZF9hdXgpOwotCi0JCQkJCSAgR0VUX0RBVEEgKG9mZnNldCArIGl2ZC52ZF9hdXgsIGV2ZGEsCi0JCQkJCQkgICAgInZlcnNpb24gZGVmaW5pdGlvbiBhdXgiKTsKLQotCQkJCQkgIGl2ZGEudmRhX25hbWUgPQotCQkJCQkgICAgQllURV9HRVQgKGV2ZGEudmRhX25hbWUpOwotCi0JCQkJCSAgbm4gKz0KLQkJCQkJICAgIHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkJICAgIHN0cnRhYiArIGl2ZGEudmRhX25hbWUsCi0JCQkJCQkgICAgMTIKLQkJCQkJCSAgICAtIHN0cmxlbiAoc3RydGFiCi0JCQkJCQkJICAgICAgKyBpdmRhLnZkYV9uYW1lKSwKLQkJCQkJCSAgICAiKSIpOwotCQkJCQl9Ci0JCQkJICAgIH0KLQotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCW9mZnNldCArPSBpdm4udm5fbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdm4udm5fbmV4dCk7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHN5bWJvbHMgW2NudCArIGpdLnN0X3NobmR4ID09IFNITl9VTkRFRikKLQkJCXsKLQkJCSAgRWxmX0ludGVybmFsX1Zlcm5lZWQgICAgIGl2bjsKLQkJCSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIG9mZnNldDsKLQotCQkJICBvZmZzZXQgPSB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXQotCQkJICAgIC0gbG9hZGFkZHI7Ci0KLQkJICAgICAgICAgIGRvCi0JCQkgICAgewotCQkJICAgICAgRWxmX0ludGVybmFsX1Zlcm5hdXggICAgIGl2bmE7Ci0JCQkgICAgICBFbGZfRXh0ZXJuYWxfVmVybmVlZCAgIGV2bjsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJuYXV4ICAgZXZuYTsKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBhX29mZjsKLQotCQkJICAgICAgR0VUX0RBVEEgKG9mZnNldCwgZXZuLCAidmVyc2lvbiBuZWVkIik7Ci0KLQkJCSAgICAgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOwotCQkJICAgICAgaXZuLnZuX25leHQgPSBCWVRFX0dFVCAoZXZuLnZuX25leHQpOwotCi0JCQkgICAgICBhX29mZiA9IG9mZnNldCArIGl2bi52bl9hdXg7Ci0KLQkJCSAgICAgIGRvCi0JCQkJewotCQkJCSAgR0VUX0RBVEEgKGFfb2ZmLCBldm5hLAotCQkJCQkgICAgInZlcnNpb24gbmVlZCBhdXggKDIpIik7Ci0KLQkJCQkgIGl2bmEudm5hX25leHQgID0gQllURV9HRVQgKGV2bmEudm5hX25leHQpOwotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCi0JCQkJICBhX29mZiArPSBpdm5hLnZuYV9uZXh0OwotCQkJCX0KLQkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSBkYXRhIFtjbnQgKyBqXQotCQkJCSAgICAgJiYgaXZuYS52bmFfbmV4dCAhPSAwKTsKLQotCQkJICAgICAgaWYgKGl2bmEudm5hX290aGVyID09IGRhdGEgW2NudCArIGpdKQotCQkJCXsKLQkJCQkgIGl2bmEudm5hX25hbWUgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmFtZSk7Ci0KLQkJCQkgIG5uICs9IHByaW50ZiAoIiglcyUtKnMiLAotCQkJCQkJc3RydGFiICsgaXZuYS52bmFfbmFtZSwKLQkJCQkJCTEyIC0gc3RybGVuIChzdHJ0YWIKLQkJCQkJCQkgICAgICsgaXZuYS52bmFfbmFtZSksCi0JCQkJCQkiKSIpOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCi0JCQkgICAgICBvZmZzZXQgKz0gaXZuLnZuX25leHQ7Ci0JCQkgICAgfQotCQkJICB3aGlsZSAoaXZuLnZuX25leHQpOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChkYXRhIFtjbnQgKyBqXSAhPSAweDgwMDEpCi0JCQl7Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJkZWYgIGl2ZDsKLQkJCSAgRWxmX0V4dGVybmFsX1ZlcmRlZiAgZXZkOwotCQkJICB1bnNpZ25lZCBsb25nICAgICAgICBvZmZzZXQ7Ci0KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUkRFRildIC0gbG9hZGFkZHI7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmQsICJ2ZXJzaW9uIGRlZiIpOwotCi0JCQkgICAgICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0JCQkgICAgICBpdmQudmRfbmR4ICA9IEJZVEVfR0VUIChldmQudmRfbmR4KTsKLQotCQkJICAgICAgb2Zmc2V0ICs9IGl2ZC52ZF9uZXh0OwotCQkJICAgIH0KLQkJCSAgd2hpbGUgKGl2ZC52ZF9uZHggIT0gKGRhdGEgW2NudCArIGpdICYgMHg3ZmZmKQotCQkJCSAmJiBpdmQudmRfbmV4dCAhPSAwKTsKLQotCQkJICBpZiAoaXZkLnZkX25keCA9PSAoZGF0YSBbY250ICsgal0gJiAweDdmZmYpKQotCQkJICAgIHsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggIGl2ZGE7Ci0KLQkJCSAgICAgIGl2ZC52ZF9hdXggPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7Ci0KLQkJCSAgICAgIEdFVF9EQVRBIChvZmZzZXQgLSBpdmQudmRfbmV4dCArIGl2ZC52ZF9hdXgsCi0JCQkJCWV2ZGEsICJ2ZXJzaW9uIGRlZiBhdXgiKTsKLQotCQkJICAgICAgaXZkYS52ZGFfbmFtZSA9IEJZVEVfR0VUIChldmRhLnZkYV9uYW1lKTsKLQotCQkJICAgICAgbm4gKz0gcHJpbnRmICgiKCVzJS0qcyIsCi0JCQkJCSAgICBzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lLAotCQkJCQkgICAgMTIgLSBzdHJsZW4gKHN0cnRhYgotCQkJCQkJCSArIGl2ZGEudmRhX25hbWUpLAotCQkJCQkgICAgIikiKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgaWYgKG5uIDwgMTgpCi0JCQlwcmludGYgKCIlKmMiLCAxOCAtIG5uLCAnICcpOwotCQkgICAgfQotCi0JCXB1dGNoYXIgKCdcbicpOwotCSAgICAgIH0KLQotCSAgICBmcmVlIChkYXRhKTsKLQkgICAgZnJlZSAoc3RydGFiKTsKLQkgICAgZnJlZSAoc3ltYm9scyk7Ci0JICB9Ci0JICBicmVhazsKLQkKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoISBmb3VuZCkKLSAgICBwcmludGYgKF8oIlxuTm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBmb3VuZCBpbiB0aGlzIGZpbGUuXG4iKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9zeW1ib2xfYmluZGluZyAoYmluZGluZykKLSAgICAgdW5zaWduZWQgaW50IGJpbmRpbmc7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzMyXTsKLQotICBzd2l0Y2ggKGJpbmRpbmcpCi0gICAgewotICAgIGNhc2UgU1RCX0xPQ0FMOiAgcmV0dXJuIF8oIkxPQ0FMIik7Ci0gICAgY2FzZSBTVEJfR0xPQkFMOiByZXR1cm4gXygiR0xPQkFMIik7Ci0gICAgY2FzZSBTVEJfV0VBSzogICByZXR1cm4gXygiV0VBSyIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoYmluZGluZyA+PSBTVEJfTE9QUk9DICYmIGJpbmRpbmcgPD0gU1RCX0hJUFJPQykKLQlzcHJpbnRmIChidWZmLCBfKCI8cHJvY2Vzc29yIHNwZWNpZmljPjogJWQiKSwgYmluZGluZyk7Ci0gICAgICBlbHNlIGlmIChiaW5kaW5nID49IFNUQl9MT09TICYmIGJpbmRpbmcgPD0gU1RCX0hJT1MpCi0Jc3ByaW50ZiAoYnVmZiwgXygiPE9TIHNwZWNpZmljPjogJWQiKSwgYmluZGluZyk7Ci0gICAgICBlbHNlCi0Jc3ByaW50ZiAoYnVmZiwgXygiPHVua25vd24+OiAlZCIpLCBiaW5kaW5nKTsKLSAgICAgIHJldHVybiBidWZmOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3N5bWJvbF90eXBlICh0eXBlKQotICAgICB1bnNpZ25lZCBpbnQgdHlwZTsKLXsKLSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBTVFRfTk9UWVBFOiAgIHJldHVybiBfKCJOT1RZUEUiKTsKLSAgICBjYXNlIFNUVF9PQkpFQ1Q6ICAgcmV0dXJuIF8oIk9CSkVDVCIpOwotICAgIGNhc2UgU1RUX0ZVTkM6ICAgICByZXR1cm4gXygiRlVOQyIpOwotICAgIGNhc2UgU1RUX1NFQ1RJT046ICByZXR1cm4gXygiU0VDVElPTiIpOwotICAgIGNhc2UgU1RUX0ZJTEU6ICAgICByZXR1cm4gXygiRklMRSIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAodHlwZSA+PSBTVFRfTE9QUk9DICYmIHR5cGUgPD0gU1RUX0hJUFJPQykKLQl7Ci0JICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fQVJNICYmIHR5cGUgPT0gU1RUX0FSTV9URlVOQykKLQkgICAgcmV0dXJuIF8oIlRIVU1CX0ZVTkMiKTsKLQkgIAotCSAgc3ByaW50ZiAoYnVmZiwgXygiPHByb2Nlc3NvciBzcGVjaWZpYz46ICVkIiksIHR5cGUpOwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGUgPj0gU1RUX0xPT1MgJiYgdHlwZSA8PSBTVFRfSElPUykKLQlzcHJpbnRmIChidWZmLCBfKCI8T1Mgc3BlY2lmaWM+OiAlZCIpLCB0eXBlKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWZmLCBfKCI8dW5rbm93bj46ICVkIiksIHR5cGUpOwotICAgICAgcmV0dXJuIGJ1ZmY7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfc3ltYm9sX2luZGV4X3R5cGUgKHR5cGUpCi0gICAgIHVuc2lnbmVkIGludCB0eXBlOwotewotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgU0hOX1VOREVGOiAgcmV0dXJuICJVTkQiOwotICAgIGNhc2UgU0hOX0FCUzogICAgcmV0dXJuICJBQlMiOwotICAgIGNhc2UgU0hOX0NPTU1PTjogcmV0dXJuICJDT00iOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAodHlwZSA+PSBTSE5fTE9QUk9DICYmIHR5cGUgPD0gU0hOX0hJUFJPQykKLQlyZXR1cm4gIlBSQyI7Ci0gICAgICBlbHNlIGlmICh0eXBlID49IFNITl9MT1JFU0VSVkUgJiYgdHlwZSA8PSBTSE5fSElSRVNFUlZFKQotCXJldHVybiAiUlNWIjsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPj0gU0hOX0xPT1MgJiYgdHlwZSA8PSBTSE5fSElPUykKLQlyZXR1cm4gIk9TICI7Ci0gICAgICBlbHNlCi0JewotCSAgc3RhdGljIGNoYXIgYnVmZiBbMzJdOwotCi0JICBzcHJpbnRmIChidWZmLCAiJTNkIiwgdHlwZSk7Ci0JICByZXR1cm4gYnVmZjsKLQl9Ci0gICAgfQotfQotCi0KLXN0YXRpYyBpbnQgKgotZ2V0X2R5bmFtaWNfZGF0YSAoZmlsZSwgbnVtYmVyKQotICAgICBGSUxFICogICAgICAgZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IG51bWJlcjsKLXsKLSAgY2hhciAqIGVfZGF0YTsKLSAgaW50ICogIGlfZGF0YTsKLQotICBlX2RhdGEgPSAoY2hhciAqKSBtYWxsb2MgKG51bWJlciAqIDQpOwotCi0gIGlmIChlX2RhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeVxuIikpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGlmIChmcmVhZCAoZV9kYXRhLCA0LCBudW1iZXIsIGZpbGUpICE9IG51bWJlcikKLSAgICB7Ci0gICAgICBlcnJvciAoXygiVW5hYmxlIHRvIHJlYWQgaW4gZHluYW1pYyBkYXRhXG4iKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaV9kYXRhID0gKGludCAqKSBtYWxsb2MgKG51bWJlciAqIHNpemVvZiAoKiBpX2RhdGEpKTsKLQotICBpZiAoaV9kYXRhID09IE5VTEwpCi0gICAgewotICAgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnlcbiIpKTsKLSAgICAgIGZyZWUgKGVfZGF0YSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgd2hpbGUgKG51bWJlci0tKQotICAgIGlfZGF0YSBbbnVtYmVyXSA9IGJ5dGVfZ2V0IChlX2RhdGEgKyBudW1iZXIgKiA0LCA0KTsKLQotICBmcmVlIChlX2RhdGEpOwotCi0gIHJldHVybiBpX2RhdGE7Ci19Ci0KLS8qIER1bXAgdGhlIHN5bWJvbCB0YWJsZSAqLwotc3RhdGljIGludAotcHJvY2Vzc19zeW1ib2xfdGFibGUgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBFbGYzMl9JbnRlcm5hbF9TaGRyICogICBzZWN0aW9uOwotICBjaGFyICAgbmIgWzRdOwotICBjaGFyICAgbmMgWzRdOwotICBpbnQgICAgbmJ1Y2tldHM7Ci0gIGludCAgICBuY2hhaW5zOwotICBpbnQgKiAgYnVja2V0cyA9IE5VTEw7Ci0gIGludCAqICBjaGFpbnMgPSBOVUxMOwotCi0gIGlmICghIGRvX3N5bXMgJiYgIWRvX2hpc3RvZ3JhbSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZHluYW1pY19pbmZvW0RUX0hBU0hdICYmICgoZG9fdXNpbmdfZHluYW1pYyAmJiBkeW5hbWljX3N0cmluZ3MgIT0gTlVMTCkKLQkJCQl8fCBkb19oaXN0b2dyYW0pKQotICAgIHsKLSAgICAgIGlmIChmc2VlayAoZmlsZSwgZHluYW1pY19pbmZvW0RUX0hBU0hdIC0gbG9hZGFkZHIsIFNFRUtfU0VUKSkKLQl7Ci0JICBlcnJvciAoXygiVW5hYmxlIHRvIHNlZWsgdG8gc3RhcnQgb2YgZHluYW1pYyBpbmZvcm1hdGlvbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgaWYgKGZyZWFkIChuYiwgc2l6ZW9mIChuYiksIDEsIGZpbGUpICE9IDEpCi0JewotCSAgZXJyb3IgKF8oIkZhaWxlZCB0byByZWFkIGluIG51bWJlciBvZiBidWNrZXRzXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGlmIChmcmVhZCAobmMsIHNpemVvZiAobmMpLCAxLCBmaWxlKSAhPSAxKQotCXsKLQkgIGVycm9yIChfKCJGYWlsZWQgdG8gcmVhZCBpbiBudW1iZXIgb2YgY2hhaW5zXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIG5idWNrZXRzID0gYnl0ZV9nZXQgKG5iLCA0KTsKLSAgICAgIG5jaGFpbnMgID0gYnl0ZV9nZXQgKG5jLCA0KTsKLQotICAgICAgYnVja2V0cyA9IGdldF9keW5hbWljX2RhdGEgKGZpbGUsIG5idWNrZXRzKTsKLSAgICAgIGNoYWlucyAgPSBnZXRfZHluYW1pY19kYXRhIChmaWxlLCBuY2hhaW5zKTsKLQotICAgICAgaWYgKGJ1Y2tldHMgPT0gTlVMTCB8fCBjaGFpbnMgPT0gTlVMTCkKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGRvX3N5bXMKLSAgICAgICYmIGR5bmFtaWNfaW5mb1tEVF9IQVNIXSAmJiBkb191c2luZ19keW5hbWljICYmIGR5bmFtaWNfc3RyaW5ncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAgICBobjsKLSAgICAgIGludCAgICBzaTsKLQotICAgICAgcHJpbnRmIChfKCJcblN5bWJvbCB0YWJsZSBmb3IgaW1hZ2U6XG4iKSk7Ci0gICAgICBwcmludGYgKF8oIiAgTnVtIEJ1YzogICAgVmFsdWUgIFNpemUgICBUeXBlICAgQmluZCBPdCBOZHggTmFtZVxuIikpOwotCi0gICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgaG4rKykKLQl7Ci0JICBpZiAoISBidWNrZXRzIFtobl0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBmb3IgKHNpID0gYnVja2V0cyBbaG5dOyBzaTsgc2kgPSBjaGFpbnMgW3NpXSkKLQkgICAgewotCSAgICAgIEVsZl9JbnRlcm5hbF9TeW0gKiBwc3ltOwotCi0JICAgICAgcHN5bSA9IGR5bmFtaWNfc3ltYm9scyArIHNpOwotCi0JICAgICAgcHJpbnRmICgiICAlM2QgJTNkOiAlOGx4ICU1bGQgJTZzICU2cyAlMmQgIiwKLQkJICAgICAgc2ksIGhuLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgcHN5bS0+c3RfdmFsdWUsCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF9zaXplLAotCQkgICAgICBnZXRfc3ltYm9sX3R5cGUgKEVMRl9TVF9UWVBFIChwc3ltLT5zdF9pbmZvKSksCi0JCSAgICAgIGdldF9zeW1ib2xfYmluZGluZyAoRUxGX1NUX0JJTkQgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgcHN5bS0+c3Rfb3RoZXIpOwotCi0JICAgICAgcHJpbnRmICgiJTMuM3MiLCBnZXRfc3ltYm9sX2luZGV4X3R5cGUgKHBzeW0tPnN0X3NobmR4KSk7Ci0KLQkgICAgICBwcmludGYgKCIgJXNcbiIsIGR5bmFtaWNfc3RyaW5ncyArIHBzeW0tPnN0X25hbWUpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZG9fc3ltcyAmJiAhZG9fdXNpbmdfZHluYW1pYykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgICAgIGk7Ci0KLSAgICAgIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0JICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bTsKLQkgICBpKyssIHNlY3Rpb24rKykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgICAgICAgICAgc2k7Ci0JICBjaGFyICogICAgICAgICAgICAgICAgc3RydGFiOwotCSAgRWxmX0ludGVybmFsX1N5bSAqICAgIHN5bXRhYjsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKiAgICBwc3ltOwotCi0KLQkgIGlmICggICBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9TWU1UQUIKLQkgICAgICAmJiBzZWN0aW9uLT5zaF90eXBlICE9IFNIVF9EWU5TWU0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBwcmludGYgKF8oIlxuU3ltYm9sIHRhYmxlICclcycgY29udGFpbnMgJWx1IGVudHJpZXM6XG4iKSwKLQkJICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pLAotCQkgICh1bnNpZ25lZCBsb25nKSAoc2VjdGlvbi0+c2hfc2l6ZSAvIHNlY3Rpb24tPnNoX2VudHNpemUpKTsKLQkgIGZwdXRzIChfKCIgIE51bTogICAgVmFsdWUgIFNpemUgVHlwZSAgICBCaW5kICAgT3QgIE5keCBOYW1lXG4iKSwKLQkJIHN0ZG91dCk7Ci0KLQkgIHN5bXRhYiA9IEdFVF9FTEZfU1lNQk9MUyAoZmlsZSwgc2VjdGlvbi0+c2hfb2Zmc2V0LAotCQkJCSAgICBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZSk7Ci0JICBpZiAoc3ltdGFiID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoc2VjdGlvbi0+c2hfbGluayA9PSBlbGZfaGVhZGVyLmVfc2hzdHJuZHgpCi0JICAgIHN0cnRhYiA9IHN0cmluZ190YWJsZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzdHJpbmdfc2VjOwotCi0JICAgICAgc3RyaW5nX3NlYyA9IHNlY3Rpb25faGVhZGVycyArIHNlY3Rpb24tPnNoX2xpbms7Ci0KLQkgICAgICBHRVRfREFUQV9BTExPQyAoc3RyaW5nX3NlYy0+c2hfb2Zmc2V0LCBzdHJpbmdfc2VjLT5zaF9zaXplLAotCQkJICAgICAgc3RydGFiLCBjaGFyICosICJzdHJpbmcgdGFibGUiKTsKLQkgICAgfQotCi0JICBmb3IgKHNpID0gMCwgcHN5bSA9IHN5bXRhYjsKLQkgICAgICAgc2kgPCBzZWN0aW9uLT5zaF9zaXplIC8gc2VjdGlvbi0+c2hfZW50c2l6ZTsKLQkgICAgICAgc2kgKyssIHBzeW0gKyspCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgICUzZDogJThseCAlNWxkICUtN3MgJS02cyAlMmQgIiwKLQkJICAgICAgc2ksCi0JCSAgICAgICh1bnNpZ25lZCBsb25nKSBwc3ltLT5zdF92YWx1ZSwKLQkJICAgICAgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3NpemUsCi0JCSAgICAgIGdldF9zeW1ib2xfdHlwZSAoRUxGX1NUX1RZUEUgKHBzeW0tPnN0X2luZm8pKSwKLQkJICAgICAgZ2V0X3N5bWJvbF9iaW5kaW5nIChFTEZfU1RfQklORCAocHN5bS0+c3RfaW5mbykpLAotCQkgICAgICBwc3ltLT5zdF9vdGhlcik7Ci0KLQkgICAgICBwcmludGYgKCIlNHMiLCBnZXRfc3ltYm9sX2luZGV4X3R5cGUgKHBzeW0tPnN0X3NobmR4KSk7Ci0KLQkgICAgICBwcmludGYgKCIgJXMiLCBzdHJ0YWIgKyBwc3ltLT5zdF9uYW1lKTsKLQotCSAgICAgIGlmIChzZWN0aW9uLT5zaF90eXBlID09IFNIVF9EWU5TWU0gJiYKLQkJICB2ZXJzaW9uX2luZm8gW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUlNZTSldICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBjaGFyICAgZGF0YVsyXTsKLQkJICB1bnNpZ25lZCBzaG9ydCAgdmVyc19kYXRhOwotCQkgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQ7Ci0JCSAgaW50ICAgICAgICAgICAgIGlzX25vYml0czsKLQkJICBpbnQgICAgICAgICAgICAgY2hlY2tfZGVmOwotCi0JCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvIFtEVF9WRVJTSU9OVEFHSURYIChEVF9WRVJTWU0pXQotCQkgICAgLSBsb2FkYWRkcjsKLQotCQkgIEdFVF9EQVRBIChvZmZzZXQgKyBzaSAqIHNpemVvZiAodmVyc19kYXRhKSwgZGF0YSwKLQkJCSAgICAidmVyc2lvbiBkYXRhIik7Ci0KLQkJICB2ZXJzX2RhdGEgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0KLQkJICBpc19ub2JpdHMgPSBwc3ltLT5zdF9zaG5keCA8IFNITl9MT1JFU0VSVkUgPwotCQkgICAgKHNlY3Rpb25faGVhZGVycyBbcHN5bS0+c3Rfc2huZHhdLnNoX3R5cGUgPT0gU0hUX05PQklUUykKLQkJICAgIDogMDsKLQotCQkgIGNoZWNrX2RlZiA9IChwc3ltLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpOwotCi0JCSAgaWYgKCh2ZXJzX2RhdGEgJiAweDgwMDApIHx8IHZlcnNfZGF0YSA+IDEpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpc19ub2JpdHMgfHwgISBjaGVja19kZWYpCi0JCQl7Ci0JCQkgIEVsZl9FeHRlcm5hbF9WZXJuZWVkICBldm47Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuZWVkICBpdm47Ci0JCQkgIEVsZl9JbnRlcm5hbF9WZXJuYXV4ICBpdm5hOwotCi0JCQkgIC8qIFdlIG11c3QgdGVzdCBib3RoLiAgKi8KLQkJCSAgb2Zmc2V0ID0gdmVyc2lvbl9pbmZvCi0JCQkgICAgW0RUX1ZFUlNJT05UQUdJRFggKERUX1ZFUk5FRUQpXSAtIGxvYWRhZGRyOwotCi0JCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2biwgInZlcnNpb24gbmVlZCIpOwotCi0JCQkgIGl2bi52bl9hdXggID0gQllURV9HRVQgKGV2bi52bl9hdXgpOwotCQkJICBpdm4udm5fbmV4dCA9IEJZVEVfR0VUIChldm4udm5fbmV4dCk7Ci0KLQkJCSAgZG8KLQkJCSAgICB7Ci0JCQkgICAgICB1bnNpZ25lZCBsb25nICB2bmFfb2ZmOwotCi0JCQkgICAgICB2bmFfb2ZmID0gb2Zmc2V0ICsgaXZuLnZuX2F1eDsKLQotCQkJICAgICAgZG8KLQkJCQl7Ci0JCQkJICBFbGZfRXh0ZXJuYWxfVmVybmF1eCAgZXZuYTsKLQotCQkJCSAgR0VUX0RBVEEgKHZuYV9vZmYsIGV2bmEsCi0JCQkJCSAgICAidmVyc2lvbiBuZWVkIGF1eCAoMykiKTsKLQotCQkJCSAgaXZuYS52bmFfb3RoZXIgPSBCWVRFX0dFVCAoZXZuYS52bmFfb3RoZXIpOwotCQkJCSAgaXZuYS52bmFfbmV4dCAgPSBCWVRFX0dFVCAoZXZuYS52bmFfbmV4dCk7Ci0JCQkJICBpdm5hLnZuYV9uYW1lICA9IEJZVEVfR0VUIChldm5hLnZuYV9uYW1lKTsKLQotCQkJCSAgdm5hX29mZiArPSBpdm5hLnZuYV9uZXh0OwotCQkJCX0KLQkJCSAgICAgIHdoaWxlIChpdm5hLnZuYV9vdGhlciAhPSB2ZXJzX2RhdGEKLQkJCQkgICAgICYmIGl2bmEudm5hX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIGlmIChpdm5hLnZuYV9vdGhlciA9PSB2ZXJzX2RhdGEpCi0JCQkJYnJlYWs7Ci0KLQkJCSAgICAgIG9mZnNldCArPSBpdm4udm5fbmV4dDsKLQkJCSAgICB9Ci0JCQkgIHdoaWxlIChpdm4udm5fbmV4dCAhPSAwKTsKLQotCQkJICBpZiAoaXZuYS52bmFfb3RoZXIgPT0gdmVyc19kYXRhKQotCQkJICAgIHsKLQkJCSAgICAgIHByaW50ZiAoIkAlcyAoJWQpIiwKLQkJCQkgICAgICBzdHJ0YWIgKyBpdm5hLnZuYV9uYW1lLCBpdm5hLnZuYV9vdGhlcik7Ci0JCQkgICAgICBjaGVja19kZWYgPSAwOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoISBpc19ub2JpdHMpCi0JCQkgICAgZXJyb3IgKF8oImJhZCBkeW5hbWljIHN5bWJvbCIpKTsKLQkJCSAgZWxzZQotCQkJICAgIGNoZWNrX2RlZiA9IDE7Ci0JCQl9Ci0KLQkJICAgICAgaWYgKGNoZWNrX2RlZikKLQkJCXsKLQkJCSAgaWYgKHZlcnNfZGF0YSAhPSAweDgwMDEpCi0JCQkgICAgewotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRlZiAgICAgaXZkOwotCQkJICAgICAgRWxmX0ludGVybmFsX1ZlcmRhdXggICAgaXZkYTsKLQkJCSAgICAgIEVsZl9FeHRlcm5hbF9WZXJkYXV4ICBldmRhOwotCQkJICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgb2Zmc2V0OwotCi0JCQkgICAgICBvZmZzZXQgPQotCQkJCXZlcnNpb25faW5mbyBbRFRfVkVSU0lPTlRBR0lEWCAoRFRfVkVSREVGKV0KLQkJCQktIGxvYWRhZGRyOwotCi0JCQkgICAgICBkbwotCQkJCXsKLQkJCQkgIEVsZl9FeHRlcm5hbF9WZXJkZWYgICBldmQ7Ci0KLQkJCQkgIEdFVF9EQVRBIChvZmZzZXQsIGV2ZCwgInZlcnNpb24gZGVmIik7Ci0KLQkJCQkgIGl2ZC52ZF9uZHggID0gQllURV9HRVQgKGV2ZC52ZF9uZHgpOwotCQkJCSAgaXZkLnZkX2F1eCAgPSBCWVRFX0dFVCAoZXZkLnZkX2F1eCk7Ci0JCQkJICBpdmQudmRfbmV4dCA9IEJZVEVfR0VUIChldmQudmRfbmV4dCk7Ci0KLQkJCQkgIG9mZnNldCArPSBpdmQudmRfbmV4dDsKLQkJCQl9Ci0JCQkgICAgICB3aGlsZSAoaXZkLnZkX25keCAhPSAodmVyc19kYXRhICYgMHg3ZmZmKQotCQkJCSAgICAgJiYgaXZkLnZkX25leHQgIT0gMCk7Ci0KLQkJCSAgICAgIG9mZnNldCAtPSBpdmQudmRfbmV4dDsKLQkJCSAgICAgIG9mZnNldCArPSBpdmQudmRfYXV4OwotCi0JCQkgICAgICBHRVRfREFUQSAob2Zmc2V0LCBldmRhLCAidmVyc2lvbiBkZWYgYXV4Iik7Ci0KLQkJCSAgICAgIGl2ZGEudmRhX25hbWUgPSBCWVRFX0dFVCAoZXZkYS52ZGFfbmFtZSk7Ci0KLQkJCSAgICAgIGlmIChwc3ltLT5zdF9uYW1lICE9IGl2ZGEudmRhX25hbWUpCi0JCQkJcHJpbnRmICgodmVyc19kYXRhICYgMHg4MDAwKQotCQkJCQk/ICJAJXMiIDogIkBAJXMiLAotCQkJCQlzdHJ0YWIgKyBpdmRhLnZkYV9uYW1lKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHB1dGNoYXIgKCdcbicpOwotCSAgICB9Ci0KLQkgIGZyZWUgKHN5bXRhYik7Ci0JICBpZiAoc3RydGFiICE9IHN0cmluZ190YWJsZSkKLQkgICAgZnJlZSAoc3RydGFiKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkb19zeW1zKQotICAgIHByaW50ZgotICAgICAgKF8oIlxuRHluYW1pYyBzeW1ib2wgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgZGlzcGxheWluZyBzeW1ib2xzLlxuIikpOwotCi0gIGlmIChkb19oaXN0b2dyYW0gJiYgYnVja2V0cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGludCAqbGVuZ3RoczsKLSAgICAgIGludCAqY291bnRzOwotICAgICAgaW50IGhuOwotICAgICAgaW50IHNpOwotICAgICAgaW50IG1heGxlbmd0aCA9IDA7Ci0gICAgICBpbnQgbnplcm9fY291bnRzID0gMDsKLSAgICAgIGludCBuc3ltcyA9IDA7Ci0KLSAgICAgIHByaW50ZiAoXygiXG5IaXN0b2dyYW0gZm9yIGJ1Y2tldCBsaXN0IGxlbmd0aCAodG90YWwgb2YgJWQgYnVja2V0cyk6XG4iKSwKLQkgICAgICBuYnVja2V0cyk7Ci0gICAgICBwcmludGYgKF8oIiBMZW5ndGggIE51bWJlciAgICAgJSUgb2YgdG90YWwgIENvdmVyYWdlXG4iKSk7Ci0KLSAgICAgIGxlbmd0aHMgPSAoaW50ICopIGNhbGxvYyAobmJ1Y2tldHMsIHNpemVvZiAoaW50KSk7Ci0gICAgICBpZiAobGVuZ3RocyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZm9yIChobiA9IDA7IGhuIDwgbmJ1Y2tldHM7ICsraG4pCi0JewotCSAgaWYgKCEgYnVja2V0cyBbaG5dKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yIChzaSA9IGJ1Y2tldHNbaG5dOyBzaTsgc2kgPSBjaGFpbnNbc2ldKQotCSAgICB7Ci0JICAgICAgKytuc3ltczsKLQkgICAgICBpZiAobWF4bGVuZ3RoIDwgKytsZW5ndGhzW2huXSkKLQkJKyttYXhsZW5ndGg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGNvdW50cyA9IChpbnQgKikgY2FsbG9jIChtYXhsZW5ndGggKyAxLCBzaXplb2YgKGludCkpOwotICAgICAgaWYgKGNvdW50cyA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBmb3IgKGhuID0gMDsgaG4gPCBuYnVja2V0czsgKytobikKLQkrKyBjb3VudHMgW2xlbmd0aHMgW2huXV07Ci0KLSAgICAgIHByaW50ZiAoIiAgICAgIDAgICUtMTBkICglNS4xZiUlKVxuIiwKLQkgICAgICBjb3VudHNbMF0sIChjb3VudHNbMF0gKiAxMDAuMCkgLyBuYnVja2V0cyk7Ci0gICAgICBmb3IgKHNpID0gMTsgc2kgPD0gbWF4bGVuZ3RoOyArK3NpKQotCXsKLQkgIG56ZXJvX2NvdW50cyArPSBjb3VudHNbc2ldICogc2k7Ci0JICBwcmludGYgKCIlN2QgICUtMTBkICglNS4xZiUlKSAgICAlNS4xZiUlXG4iLAotCQkgIHNpLCBjb3VudHNbc2ldLCAoY291bnRzW3NpXSAqIDEwMC4wKSAvIG5idWNrZXRzLAotCQkgIChuemVyb19jb3VudHMgKiAxMDAuMCkgLyBuc3ltcyk7Ci0JfQotCi0gICAgICBmcmVlIChjb3VudHMpOwotICAgICAgZnJlZSAobGVuZ3Rocyk7Ci0gICAgfQotCi0gIGlmIChidWNrZXRzICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoYnVja2V0cyk7Ci0gICAgICBmcmVlIChjaGFpbnMpOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19zeW1pbmZvIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbyA9PSBOVUxMCi0gICAgICB8fCAhZG9fZHluYW1pYykKLSAgICAvKiBObyBzeW1pbmZvLCB0aGlzIGlzIG9rLiAgKi8KLSAgICByZXR1cm4gMTsKLQotICAvKiBUaGVyZSBiZXR0ZXIgc2hvdWxkIGJlIGEgZHluYW1pYyBzeW1ib2wgc2VjdGlvbi4gICovCi0gIGlmIChkeW5hbWljX3N5bWJvbHMgPT0gTlVMTCB8fCBkeW5hbWljX3N0cmluZ3MgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZHluYW1pY19hZGRyKQotICAgIHByaW50ZiAoXygiXG5EeW5hbWljIGluZm8gc2VnbWVudCBhdCBvZmZzZXQgMHglbHggY29udGFpbnMgJWQgZW50cmllczpcbiIpLAotCSAgICBkeW5hbWljX3N5bWluZm9fb2Zmc2V0LCBkeW5hbWljX3N5bWluZm9fbmVudCk7Ci0KLSAgcHJpbnRmIChfKCIgTnVtOiBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgQm91bmRUbyAgICAgRmxhZ3NcbiIpKTsKLSAgZm9yIChpID0gMDsgaSA8IGR5bmFtaWNfc3ltaW5mb19uZW50OyArK2kpCi0gICAgewotICAgICAgdW5zaWduZWQgc2hvcnQgaW50IGZsYWdzID0gZHluYW1pY19zeW1pbmZvW2ldLnNpX2ZsYWdzOwotCi0gICAgICBwcmludGYgKCIlNGQ6ICUtMzBzICIsIGksCi0JICAgICAgZHluYW1pY19zdHJpbmdzICsgZHluYW1pY19zeW1ib2xzW2ldLnN0X25hbWUpOwotCi0gICAgICBzd2l0Y2ggKGR5bmFtaWNfc3ltaW5mb1tpXS5zaV9ib3VuZHRvKQotCXsKLQljYXNlIFNZTUlORk9fQlRfU0VMRjoKLQkgIGZwdXRzICgiU0VMRiAgICAgICAiLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0JY2FzZSBTWU1JTkZPX0JUX1BBUkVOVDoKLQkgIGZwdXRzICgiUEFSRU5UICAgICAiLCBzdGRvdXQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmIChkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA+IDAKLQkgICAgICAmJiBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byA8IGR5bmFtaWNfc2l6ZSkKLQkgICAgcHJpbnRmICgiJS0xMHMgIiwKLQkJICAgIGR5bmFtaWNfc3RyaW5ncwotCQkgICAgKyBkeW5hbWljX3NlZ21lbnRbZHluYW1pY19zeW1pbmZvW2ldLnNpX2JvdW5kdG9dLmRfdW4uZF92YWwpOwotCSAgZWxzZQotCSAgICBwcmludGYgKCIlLTEwZCAiLCBkeW5hbWljX3N5bWluZm9baV0uc2lfYm91bmR0byk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0RJUkVDVCkKLQlwcmludGYgKCIgRElSRUNUIik7Ci0gICAgICBpZiAoZmxhZ3MgJiBTWU1JTkZPX0ZMR19QQVNTVEhSVSkKLQlwcmludGYgKCIgUEFTU1RIUlUiKTsKLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0NPUFkpCi0JcHJpbnRmICgiIENPUFkiKTsKLSAgICAgIGlmIChmbGFncyAmIFNZTUlORk9fRkxHX0xBWllMT0FEKQotCXByaW50ZiAoIiBMQVpZTE9BRCIpOwotCi0gICAgICBwdXRzICgiIik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0jaWZkZWYgU1VQUE9SVF9ESVNBU1NFTUJMWQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICBGSUxFICogZmlsZTsKLXsKLSAgcHJpbnRmIChfKCJcbkFzc2VtYmx5IGR1bXAgb2Ygc2VjdGlvbiAlc1xuIiksCi0JICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICAvKiBYWFggLS0gdG8gYmUgZG9uZSAtLS0gWFhYICovCi0KLSAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotZHVtcF9zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGJmZF9zaXplX3R5cGUgICBieXRlczsKLSAgYmZkX3ZtYSAgICAgICAgIGFkZHI7Ci0gIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0KLSAgYnl0ZXMgPSBzZWN0aW9uLT5zaF9zaXplOwotCi0gIGlmIChieXRlcyA9PSAwKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5TZWN0aW9uICclcycgaGFzIG5vIGRhdGEgdG8gZHVtcC5cbiIpLAotCSAgICAgIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpbnRmIChfKCJcbkhleCBkdW1wIG9mIHNlY3Rpb24gJyVzJzpcbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICBhZGRyID0gc2VjdGlvbi0+c2hfYWRkcjsKLQotICBHRVRfREFUQV9BTExPQyAoc2VjdGlvbi0+c2hfb2Zmc2V0LCBieXRlcywgc3RhcnQsIHVuc2lnbmVkIGNoYXIgKiwKLQkJICAic2VjdGlvbiBkYXRhIik7Ci0KLSAgZGF0YSA9IHN0YXJ0OwotCi0gIHdoaWxlIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgajsKLSAgICAgIGludCBrOwotICAgICAgaW50IGxieXRlczsKLQotICAgICAgbGJ5dGVzID0gKGJ5dGVzID4gMTYgPyAxNiA6IGJ5dGVzKTsKLQotICAgICAgcHJpbnRmICgiICAweCU4LjhseCAiLCAodW5zaWduZWQgbG9uZykgYWRkcik7Ci0KLSAgICAgIHN3aXRjaCAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkKLQl7Ci0JZGVmYXVsdDoKLQljYXNlIEVMRkRBVEEyTFNCOgotCSAgZm9yIChqID0gMTU7IGogPj0gMDsgaiAtLSkKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoIShqICYgMHgzKSkKLQkJcHJpbnRmICgiICIpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgRUxGREFUQTJNU0I6Ci0JICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkgICAgewotCSAgICAgIGlmIChqIDwgbGJ5dGVzKQotCQlwcmludGYgKCIlMi4yeCIsIGRhdGEgW2pdKTsKLQkgICAgICBlbHNlCi0JCXByaW50ZiAoIiAgIik7Ci0KLQkgICAgICBpZiAoKGogJiAzKSA9PSAzKQotCQlwcmludGYgKCIgIik7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgZm9yIChqID0gMDsgaiA8IGxieXRlczsgaisrKQotCXsKLQkgIGsgPSBkYXRhIFtqXTsKLQkgIGlmIChrID49ICcgJyAmJiBrIDwgMHg4MCkKLQkgICAgcHJpbnRmICgiJWMiLCBrKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiLiIpOwotCX0KLQotICAgICAgcHV0Y2hhciAoJ1xuJyk7Ci0KLSAgICAgIGRhdGEgICs9IGxieXRlczsKLSAgICAgIGFkZHIgICs9IGxieXRlczsKLSAgICAgIGJ5dGVzIC09IGxieXRlczsKLSAgICB9Ci0KLSAgZnJlZSAoc3RhcnQpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGludAotcmVhZF9sZWIxMjggKGRhdGEsIGxlbmd0aF9yZXR1cm4sIHNpZ24pCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICBpbnQgKiAgICAgICAgICAgbGVuZ3RoX3JldHVybjsKLSAgICAgaW50ICAgICAgICAgICAgIHNpZ247Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJlc3VsdCA9IDA7Ci0gIHVuc2lnbmVkIGludCAgICAgIG51bV9yZWFkID0gMDsKLSAgaW50ICAgICAgICAgICAgICAgc2hpZnQgPSAwOwotICB1bnNpZ25lZCBjaGFyICAgICBieXRlOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9ICogZGF0YSArKzsKLSAgICAgIG51bV9yZWFkICsrOwotCi0gICAgICByZXN1bHQgfD0gKGJ5dGUgJiAweDdmKSA8PCBzaGlmdDsKLQotICAgICAgc2hpZnQgKz0gNzsKLQotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICBpZiAobGVuZ3RoX3JldHVybiAhPSBOVUxMKQotICAgICogbGVuZ3RoX3JldHVybiA9IG51bV9yZWFkOwotCi0gIGlmIChzaWduICYmIChzaGlmdCA8IDMyKSAmJiAoYnl0ZSAmIDB4NDApKQotICAgIHJlc3VsdCB8PSAtMSA8PCBzaGlmdDsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi10eXBlZGVmIHN0cnVjdCBTdGF0ZV9NYWNoaW5lX1JlZ2lzdGVycwotewotICB1bnNpZ25lZCBsb25nCWFkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCAgZmlsZTsKLSAgdW5zaWduZWQgaW50ICBsaW5lOwotICB1bnNpZ25lZCBpbnQgIGNvbHVtbjsKLSAgaW50ICAgICAgICAgICBpc19zdG10OwotICBpbnQgICAgICAgICAgIGJhc2ljX2Jsb2NrOwotICBpbnQJICAgICAgICBlbmRfc2VxdWVuY2U7Ci0vKiBUaGlzIHZhcmlhYmxlIGhvbGQgdGhlIG51bWJlciBvZiB0aGUgbGFzdCBlbnRyeSBzZWVuCi0gICBpbiB0aGUgRmlsZSBUYWJsZS4gICovCi0gIHVuc2lnbmVkIGludCAgbGFzdF9maWxlX2VudHJ5OwotfSBTTVI7Ci0KLXN0YXRpYyBTTVIgc3RhdGVfbWFjaGluZV9yZWdzOwotCi1zdGF0aWMgdm9pZAotcmVzZXRfc3RhdGVfbWFjaGluZSAoaXNfc3RtdCkKLSAgICAgaW50IGlzX3N0bXQ7Ci17Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzID0gMDsKLSAgc3RhdGVfbWFjaGluZV9yZWdzLmZpbGUgPSAxOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSA9IDE7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5jb2x1bW4gPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdCA9IGlzX3N0bXQ7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5iYXNpY19ibG9jayA9IDA7Ci0gIHN0YXRlX21hY2hpbmVfcmVncy5lbmRfc2VxdWVuY2UgPSAwOwotICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGFzdF9maWxlX2VudHJ5ID0gMDsKLX0KLQotLyogSGFuZGxlZCBhbiBleHRlbmQgbGluZSBvcC4gIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBlbmQKLSAgIG9mIHNlcXVlbmNlLiAgKi8KLXN0YXRpYyBpbnQKLXByb2Nlc3NfZXh0ZW5kZWRfbGluZV9vcCAoZGF0YSwgaXNfc3RtdCkKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIGludCBpc19zdG10OwotewotICB1bnNpZ25lZCBjaGFyICAgb3BfY29kZTsKLSAgaW50ICAgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gIHVuc2lnbmVkIGludCAgICBsZW47Ci0gIHVuc2lnbmVkIGNoYXIgKiBuYW1lOwotICB1bnNpZ25lZCBsb25nICAgYWRyOwotICAKLSAgbGVuID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQotICBpZiAobGVuID09IDApCi0gICAgewotICAgICAgd2FybiAoXygiYmFkbHkgZm9ybWVkIGV4dGVuZGVkIGxpbmUgb3AgZW5jb3VudGVyZWQhIikpOwotICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7Ci0gICAgfQotCi0gIGxlbiArPSBieXRlc19yZWFkOwotICBvcF9jb2RlID0gKiBkYXRhICsrOwotCi0gIHByaW50ZiAoXygiICBFeHRlbmRlZCBvcGNvZGUgJWQ6ICIpLCBvcF9jb2RlKTsKLSAgCi0gIHN3aXRjaCAob3BfY29kZSkKLSAgICB7Ci0gICAgY2FzZSBEV19MTkVfZW5kX3NlcXVlbmNlOgotICAgICAgcHJpbnRmIChfKCJFbmQgb2YgU2VxdWVuY2VcblxuIikpOwotICAgICAgcmVzZXRfc3RhdGVfbWFjaGluZSAoaXNfc3RtdCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfTE5FX3NldF9hZGRyZXNzOgotICAgICAgLyogWFhYIC0gYXNzdW1wdGlvbiBoZXJlIHRoYXQgYWRkcmVzcyBzaXplIGlzIDQhICovCi0gICAgICBhZHIgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0gICAgICBwcmludGYgKF8oInNldCBBZGRyZXNzIHRvIDB4JWx4XG4iKSwgYWRyKTsKLSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzID0gYWRyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0xORV9kZWZpbmVfZmlsZToKLSAgICAgIHByaW50ZiAoXygiICBkZWZpbmUgbmV3IEZpbGUgVGFibGUgZW50cnlcbiIpKTsKLSAgICAgIHByaW50ZiAoXygiICBFbnRyeVx0RGlyXHRUaW1lXHRTaXplXHROYW1lXG4iKSk7Ci0JIAotICAgICAgcHJpbnRmIChfKCIgICAlZFx0IiksICsrIHN0YXRlX21hY2hpbmVfcmVncy5sYXN0X2ZpbGVfZW50cnkpOwotICAgICAgbmFtZSA9IGRhdGE7Ci0gICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotICAgICAgcHJpbnRmIChfKCIlc1xuXG4iKSwgbmFtZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKF8oIlVOS05PV046IGxlbmd0aCAlZFxuIiksIGxlbiAtIGJ5dGVzX3JlYWQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBsZW47Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19saW5lcyAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOwotewotICBEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm8gKiBleHRlcm5hbDsKLSAgRFdBUkYyX0ludGVybmFsX0xpbmVJbmZvICAgaW5mbzsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgc3RhbmRhcmRfb3Bjb2RlczsKLSAgdW5zaWduZWQgY2hhciAqICAgICAgICAgICAgZGF0YSA9IHN0YXJ0OwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmQgID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmRfb2Zfc2VxdWVuY2U7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0KLSAgcHJpbnRmIChfKCJcbkR1bXAgb2YgZGVidWcgY29udGVudHMgb2Ygc2VjdGlvbiAlczpcblxuIiksCi0JICBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoZGF0YSA8IGVuZCkKLSAgICB7Ci0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfTGluZUluZm8gKikgZGF0YTsKLQotICAgICAgLyogQ2hlY2sgdGhlIGxlbmd0aCBvZiB0aGUgYmxvY2suICAqLwotICAgICAgaW5mby5saV9sZW5ndGggPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2xlbmd0aCk7Ci0gICAgICBpZiAoaW5mby5saV9sZW5ndGggPiBzZWN0aW9uLT5zaF9zaXplKQotCXsKLQkgIHdhcm4KLQkgICAgKF8oIlRoZSBsaW5lIGluZm8gYXBwZWFycyB0byBiZSBjb3JydXB0IC0gdGhlIHNlY3Rpb24gaXMgdG9vIHNtYWxsXG4iKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICAKLSAgICAgIC8qIENoZWNrIGl0cyB2ZXJzaW9uIG51bWJlci4gICovCi0gICAgICBpbmZvLmxpX3ZlcnNpb24gPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX3ZlcnNpb24pOwotICAgICAgaWYgKGluZm8ubGlfdmVyc2lvbiAhPSAyKQotCXsKLQkgIHdhcm4gKF8oIk9ubHkgRFdBUkYgdmVyc2lvbiAyIGxpbmUgaW5mbyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgCi0gICAgICBpbmZvLmxpX3Byb2xvZ3VlX2xlbmd0aCA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfcHJvbG9ndWVfbGVuZ3RoKTsKLSAgICAgIGluZm8ubGlfbWluX2luc25fbGVuZ3RoID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9taW5faW5zbl9sZW5ndGgpOwotICAgICAgaW5mby5saV9kZWZhdWx0X2lzX3N0bXQgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICBpbmZvLmxpX2xpbmVfYmFzZSAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+bGlfbGluZV9iYXNlKTsKLSAgICAgIGluZm8ubGlfbGluZV9yYW5nZSAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9saW5lX3JhbmdlKTsKLSAgICAgIGluZm8ubGlfb3Bjb2RlX2Jhc2UgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5saV9vcGNvZGVfYmFzZSk7Ci0gICAgICAKLSAgICAgIC8qIFNpZ24gZXh0ZW5kIHRoZSBsaW5lIGJhc2UgZmllbGQuICAqLwotICAgICAgaW5mby5saV9saW5lX2Jhc2UgPDw9IDI0OwotICAgICAgaW5mby5saV9saW5lX2Jhc2UgPj49IDI0OwotICAgICAgCi0gICAgICBwcmludGYgKF8oIiAgTGVuZ3RoOiAgICAgICAgICAgICAgICAgICAgICAlbGRcbiIpLCBpbmZvLmxpX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgRFdBUkYgVmVyc2lvbjogICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgUHJvbGd1ZSBMZW5ndGg6ICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfcHJvbG9ndWVfbGVuZ3RoKTsKLSAgICAgIHByaW50ZiAoXygiICBNaW5pbXVtIEluc3RydWN0aW9uIExlbmd0aDogICVkXG4iKSwgaW5mby5saV9taW5faW5zbl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIEluaXRpYWwgdmFsdWUgb2YgJ2lzX3N0bXQnOiAgJWRcbiIpLCBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICBwcmludGYgKF8oIiAgTGluZSBCYXNlOiAgICAgICAgICAgICAgICAgICAlZFxuIiksIGluZm8ubGlfbGluZV9iYXNlKTsKLSAgICAgIHByaW50ZiAoXygiICBMaW5lIFJhbmdlOiAgICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9saW5lX3JhbmdlKTsKLSAgICAgIHByaW50ZiAoXygiICBPcGNvZGUgQmFzZTogICAgICAgICAgICAgICAgICVkXG4iKSwgaW5mby5saV9vcGNvZGVfYmFzZSk7Ci0KLSAgICAgIGVuZF9vZl9zZXF1ZW5jZSA9IGRhdGEgKyBpbmZvLmxpX2xlbmd0aCArIHNpemVvZiAoaW5mby5saV9sZW5ndGgpOwotCi0gICAgICByZXNldF9zdGF0ZV9tYWNoaW5lIChpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0gICAgICAKLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBPcGNvZGVzIHRhYmxlLiAgKi8KLSAgICAgIHN0YW5kYXJkX29wY29kZXMgPSBkYXRhICsgc2l6ZW9mICgqIGV4dGVybmFsKTsKLSAgICAgIAotICAgICAgcHJpbnRmIChfKCJcbiBPcGNvZGVzOlxuIikpOwotICAgICAgCi0gICAgICBmb3IgKGkgPSAxOyBpIDwgaW5mby5saV9vcGNvZGVfYmFzZTsgaSsrKQotCXByaW50ZiAoXygiICBPcGNvZGUgJWQgaGFzICVkIGFyZ3NcbiIpLCBpLCBzdGFuZGFyZF9vcGNvZGVzW2ldKTsKLSAgICAgIAotICAgICAgLyogRGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlIERpcmVjdG9yeSB0YWJsZS4gICovCi0gICAgICBkYXRhID0gc3RhbmRhcmRfb3Bjb2RlcyArIGluZm8ubGlfb3Bjb2RlX2Jhc2UgLSAxOwotICAgICAgCi0gICAgICBpZiAoKiBkYXRhID09IDApCi0JcHJpbnRmIChfKCJcbiBUaGUgRGlyZWN0b3J5IFRhYmxlIGlzIGVtcHR5LlxuIikpOwotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoXygiXG4gVGhlIERpcmVjdG9yeSBUYWJsZTpcbiIpKTsKLQkgIAotCSAgd2hpbGUgKCogZGF0YSAhPSAwKQotCSAgICB7Ci0JICAgICAgcHJpbnRmIChfKCIgICVzXG4iKSwgZGF0YSk7Ci0JICAgICAgCi0JICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgLyogU2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGRhdGEgKys7Ci0gICAgICAKLSAgICAgIC8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBGaWxlIE5hbWUgdGFibGUuICAqLwotICAgICAgaWYgKCogZGF0YSA9PSAwKQotCXByaW50ZiAoXygiXG4gVGhlIEZpbGUgTmFtZSBUYWJsZSBpcyBlbXB0eS5cbiIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIlxuIFRoZSBGaWxlIE5hbWUgVGFibGU6XG4iKSk7Ci0JICBwcmludGYgKF8oIiAgRW50cnlcdERpclx0VGltZVx0U2l6ZVx0TmFtZVxuIikpOwotCSAgCi0JICB3aGlsZSAoKiBkYXRhICE9IDApCi0JICAgIHsKLQkgICAgICBjaGFyICogbmFtZTsKLQkgICAgICBpbnQgYnl0ZXNfcmVhZDsKLQkgICAgICAKLQkgICAgICBwcmludGYgKF8oIiAgJWRcdCIpLCArKyBzdGF0ZV9tYWNoaW5lX3JlZ3MubGFzdF9maWxlX2VudHJ5KTsKLQkgICAgICBuYW1lID0gZGF0YTsKLQkgICAgICAKLQkgICAgICBkYXRhICs9IHN0cmxlbiAoZGF0YSkgKyAxOwotCSAgICAgIAotCSAgICAgIHByaW50ZiAoXygiJWx1XHQiKSwgcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCkpOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiVsdVx0IiksIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgcHJpbnRmIChfKCIlbHVcdCIpLCByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKSk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiJXNcbiIpLCBuYW1lKTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgLyogU2tpcCB0aGUgTlVMIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlLiAgKi8KLSAgICAgIGRhdGEgKys7Ci0gICAgICAKLSAgICAgIC8qIE5vdyBkaXNwbGF5IHRoZSBzdGF0ZW1lbnRzLiAgKi8KLSAgICAgIHByaW50ZiAoXygiXG4gTGluZSBOdW1iZXIgU3RhdGVtZW50czpcbiIpKTsKLSAgICAgIAotICAgICAgCi0gICAgICB3aGlsZSAoZGF0YSA8IGVuZF9vZl9zZXF1ZW5jZSkKLQl7Ci0JICB1bnNpZ25lZCBjaGFyIG9wX2NvZGU7Ci0JICBpbnQgICAgICAgICAgIGFkdjsKLQkgIGludCAgICAgICAgICAgYnl0ZXNfcmVhZDsKLQkgIAotCSAgb3BfY29kZSA9ICogZGF0YSArKzsKLQkgIAotCSAgc3dpdGNoIChvcF9jb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgRFdfTE5TX2V4dGVuZGVkX29wOgotCSAgICAgIGRhdGEgKz0gcHJvY2Vzc19leHRlbmRlZF9saW5lX29wIChkYXRhLCBpbmZvLmxpX2RlZmF1bHRfaXNfc3RtdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgRFdfTE5TX2NvcHk6Ci0JICAgICAgcHJpbnRmIChfKCIgIENvcHlcbiIpKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfYWR2YW5jZV9wYzoKLQkgICAgICBhZHYgPSBpbmZvLmxpX21pbl9pbnNuX2xlbmd0aCAqIHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIEFkdmFuY2UgUEMgYnkgJWQgdG8gJWx4XG4iKSwgYWR2LAotCQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgRFdfTE5TX2FkdmFuY2VfbGluZToKLQkgICAgICBhZHYgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAxKTsKLQkgICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmxpbmUgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIExpbmUgYnkgJWQgdG8gJWRcbiIpLCBhZHYsCi0JCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5saW5lKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfc2V0X2ZpbGU6Ci0JICAgICAgYWR2ID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICAgICAgZGF0YSArPSBieXRlc19yZWFkOwotCSAgICAgIHByaW50ZiAoXygiICBTZXQgRmlsZSBOYW1lIHRvIGVudHJ5ICVkIGluIHRoZSBGaWxlIE5hbWUgVGFibGVcbiIpLAotCQkgICAgICBhZHYpOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5maWxlID0gYWR2OwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19zZXRfY29sdW1uOgotCSAgICAgIGFkdiA9IHJlYWRfbGViMTI4IChkYXRhLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgICAgIGRhdGEgKz0gYnl0ZXNfcmVhZDsKLQkgICAgICBwcmludGYgKF8oIiAgU2V0IGNvbHVtbiB0byAlZFxuIiksIGFkdik7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmNvbHVtbiA9IGFkdjsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfbmVnYXRlX3N0bXQ6Ci0JICAgICAgYWR2ID0gc3RhdGVfbWFjaGluZV9yZWdzLmlzX3N0bXQ7Ci0JICAgICAgYWR2ID0gISBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgIFNldCBpc19zdG10IHRvICVkXG4iKSwgYWR2KTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuaXNfc3RtdCA9IGFkdjsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBEV19MTlNfc2V0X2Jhc2ljX2Jsb2NrOgotCSAgICAgIHByaW50ZiAoXygiICBTZXQgYmFzaWMgYmxvY2tcbiIpKTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MuYmFzaWNfYmxvY2sgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19jb25zdF9hZGRfcGM6Ci0JICAgICAgYWR2ID0gKDI1NSAtIGluZm8ubGlfb3Bjb2RlX2Jhc2UpIC8gaW5mby5saV9saW5lX3JhbmdlOwotCSAgICAgIHN0YXRlX21hY2hpbmVfcmVncy5hZGRyZXNzICs9IGFkdjsKLQkgICAgICBwcmludGYgKF8oIiAgQWR2YW5jZSBQQyBieSBjb25zdGFudCAlZCB0byAweCVseFxuIiksIGFkdiwKLQkJICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MpOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBjYXNlIERXX0xOU19maXhlZF9hZHZhbmNlX3BjOgotCSAgICAgIGFkdiA9IGJ5dGVfZ2V0IChkYXRhLCAyKTsKLQkgICAgICBkYXRhICs9IDI7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBBZHZhbmNlIFBDIGJ5IGZpeGVkIHNpemUgYW1vdW50ICVkIHRvIDB4JWx4XG4iKSwKLQkJICAgICAgYWR2LCBzdGF0ZV9tYWNoaW5lX3JlZ3MuYWRkcmVzcyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgb3BfY29kZSAtPSBpbmZvLmxpX29wY29kZV9iYXNlOwotCSAgICAgIGFkdiAgICAgID0gKG9wX2NvZGUgLyBpbmZvLmxpX2xpbmVfcmFuZ2UpICogaW5mby5saV9taW5faW5zbl9sZW5ndGg7Ci0JICAgICAgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MgKz0gYWR2OwotCSAgICAgIHByaW50ZiAoXygiICBTcGVjaWFsIG9wY29kZSAlZDogYWR2YW5jZSBBZGRyZXNzIGJ5ICVkIHRvIDB4JWx4IiksCi0JCSAgICAgIG9wX2NvZGUsIGFkdiwgc3RhdGVfbWFjaGluZV9yZWdzLmFkZHJlc3MpOwotCSAgICAgIGFkdiAgICArPSAob3BfY29kZSAlIGluZm8ubGlfbGluZV9yYW5nZSkgKyBpbmZvLmxpX2xpbmVfYmFzZTsKLQkgICAgICBzdGF0ZV9tYWNoaW5lX3JlZ3MubGluZSArPSBhZHY7Ci0JICAgICAgcHJpbnRmIChfKCIgYW5kIExpbmUgYnkgJWQgdG8gJWRcbiIpLAotCQkgICAgICBhZHYsIHN0YXRlX21hY2hpbmVfcmVncy5saW5lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfcHVibmFtZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgRFdBUkYyX0V4dGVybmFsX1B1Yk5hbWVzICogZXh0ZXJuYWw7Ci0gIERXQVJGMl9JbnRlcm5hbF9QdWJOYW1lcyAgIHB1Ym5hbWVzOwotICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICBlbmQ7Ci0KLSAgZW5kID0gc3RhcnQgKyBzZWN0aW9uLT5zaF9zaXplOwotCi0gIHByaW50ZiAoXygiQ29udGVudHMgb2YgdGhlICVzIHNlY3Rpb246XG5cbiIpLCBTRUNUSU9OX05BTUUgKHNlY3Rpb24pKTsKLQotICB3aGlsZSAoc3RhcnQgPCBlbmQpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0OwotCi0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfUHViTmFtZXMgKikgc3RhcnQ7Ci0KLSAgICAgIHB1Ym5hbWVzLnBuX2xlbmd0aCAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX2xlbmd0aCk7Ci0gICAgICBwdWJuYW1lcy5wbl92ZXJzaW9uID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl92ZXJzaW9uKTsKLSAgICAgIHB1Ym5hbWVzLnBuX29mZnNldCAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPnBuX29mZnNldCk7Ci0gICAgICBwdWJuYW1lcy5wbl9zaXplICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5wbl9zaXplKTsKLQotICAgICAgZGF0YSAgID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotICAgICAgc3RhcnQgKz0gcHVibmFtZXMucG5fbGVuZ3RoICsgc2l6ZW9mIChleHRlcm5hbC0+cG5fbGVuZ3RoKTsKLQotICAgICAgaWYgKHB1Ym5hbWVzLnBuX3ZlcnNpb24gIT0gMikKLQl7Ci0JICB3YXJuIChfKCJPbmx5IERXQVJGIDIgcHVibmFtZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQiKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiICBMZW5ndGg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWxkXG4iKSwKLQkgICAgICBwdWJuYW1lcy5wbl9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgIFZlcnNpb246ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fdmVyc2lvbik7Ci0gICAgICBwcmludGYgKF8oIiAgT2Zmc2V0IGludG8gLmRlYnVnX2luZm8gc2VjdGlvbjogICAgICVsZFxuIiksCi0JICAgICAgcHVibmFtZXMucG5fb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoXygiICBTaXplIG9mIGFyZWEgaW4gLmRlYnVnX2luZm8gc2VjdGlvbjogJWxkXG4iKSwKLQkgICAgICBwdWJuYW1lcy5wbl9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCJcbiAgICBPZmZzZXRcdE5hbWVcbiIpKTsKLQotICAgICAgZG8KLQl7Ci0JICBvZmZzZXQgPSBieXRlX2dldCAoZGF0YSwgNCk7Ci0KLQkgIGlmIChvZmZzZXQgIT0gMCkKLQkgICAgewotCSAgICAgIGRhdGEgKz0gNDsKLQkgICAgICBwcmludGYgKCIgICAgJWxkXHRcdCVzXG4iLCBvZmZzZXQsIGRhdGEpOwotCSAgICAgIGRhdGEgKz0gc3RybGVuIChkYXRhKSArIDE7Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAob2Zmc2V0ICE9IDApOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X1RBR19uYW1lICh0YWcpCi0gICAgIHVuc2lnbmVkIGxvbmcgdGFnOwotewotICBzd2l0Y2ggKHRhZykKLSAgICB7Ci0gICAgY2FzZSBEV19UQUdfcGFkZGluZzogcmV0dXJuICJEV19UQUdfcGFkZGluZyI7Ci0gICAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZTogcmV0dXJuICJEV19UQUdfYXJyYXlfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZTogcmV0dXJuICJEV19UQUdfY2xhc3NfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfZW50cnlfcG9pbnQ6IHJldHVybiAiRFdfVEFHX2VudHJ5X3BvaW50IjsKLSAgICBjYXNlIERXX1RBR19lbnVtZXJhdGlvbl90eXBlOiByZXR1cm4gIkRXX1RBR19lbnVtZXJhdGlvbl90eXBlIjsKLSAgICBjYXNlIERXX1RBR19mb3JtYWxfcGFyYW1ldGVyOiByZXR1cm4gIkRXX1RBR19mb3JtYWxfcGFyYW1ldGVyIjsKLSAgICBjYXNlIERXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbjogcmV0dXJuICJEV19UQUdfaW1wb3J0ZWRfZGVjbGFyYXRpb24iOwotICAgIGNhc2UgRFdfVEFHX2xhYmVsOiByZXR1cm4gIkRXX1RBR19sYWJlbCI7Ci0gICAgY2FzZSBEV19UQUdfbGV4aWNhbF9ibG9jazogcmV0dXJuICJEV19UQUdfbGV4aWNhbF9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfbWVtYmVyOiByZXR1cm4gIkRXX1RBR19tZW1iZXIiOwotICAgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZTogcmV0dXJuICJEV19UQUdfcG9pbnRlcl90eXBlIjsKLSAgICBjYXNlIERXX1RBR19yZWZlcmVuY2VfdHlwZTogcmV0dXJuICJEV19UQUdfcmVmZXJlbmNlX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX2NvbXBpbGVfdW5pdDogcmV0dXJuICJEV19UQUdfY29tcGlsZV91bml0IjsKLSAgICBjYXNlIERXX1RBR19zdHJpbmdfdHlwZTogcmV0dXJuICJEV19UQUdfc3RyaW5nX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOiByZXR1cm4gIkRXX1RBR19zdHJ1Y3R1cmVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc3Vicm91dGluZV90eXBlOiByZXR1cm4gIkRXX1RBR19zdWJyb3V0aW5lX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3R5cGVkZWY6IHJldHVybiAiRFdfVEFHX3R5cGVkZWYiOwotICAgIGNhc2UgRFdfVEFHX3VuaW9uX3R5cGU6IHJldHVybiAiRFdfVEFHX3VuaW9uX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnM6IHJldHVybiAiRFdfVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMiOwotICAgIGNhc2UgRFdfVEFHX3ZhcmlhbnQ6IHJldHVybiAiRFdfVEFHX3ZhcmlhbnQiOwotICAgIGNhc2UgRFdfVEFHX2NvbW1vbl9ibG9jazogcmV0dXJuICJEV19UQUdfY29tbW9uX2Jsb2NrIjsKLSAgICBjYXNlIERXX1RBR19jb21tb25faW5jbHVzaW9uOiByZXR1cm4gIkRXX1RBR19jb21tb25faW5jbHVzaW9uIjsKLSAgICBjYXNlIERXX1RBR19pbmhlcml0YW5jZTogcmV0dXJuICJEV19UQUdfaW5oZXJpdGFuY2UiOwotICAgIGNhc2UgRFdfVEFHX2lubGluZWRfc3Vicm91dGluZTogcmV0dXJuICJEV19UQUdfaW5saW5lZF9zdWJyb3V0aW5lIjsKLSAgICBjYXNlIERXX1RBR19tb2R1bGU6IHJldHVybiAiRFdfVEFHX21vZHVsZSI7Ci0gICAgY2FzZSBEV19UQUdfcHRyX3RvX21lbWJlcl90eXBlOiByZXR1cm4gIkRXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3NldF90eXBlOiByZXR1cm4gIkRXX1RBR19zZXRfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfc3VicmFuZ2VfdHlwZTogcmV0dXJuICJEV19UQUdfc3VicmFuZ2VfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfd2l0aF9zdG10OiByZXR1cm4gIkRXX1RBR193aXRoX3N0bXQiOwotICAgIGNhc2UgRFdfVEFHX2FjY2Vzc19kZWNsYXJhdGlvbjogcmV0dXJuICJEV19UQUdfYWNjZXNzX2RlY2xhcmF0aW9uIjsKLSAgICBjYXNlIERXX1RBR19iYXNlX3R5cGU6IHJldHVybiAiRFdfVEFHX2Jhc2VfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfY2F0Y2hfYmxvY2s6IHJldHVybiAiRFdfVEFHX2NhdGNoX2Jsb2NrIjsKLSAgICBjYXNlIERXX1RBR19jb25zdF90eXBlOiByZXR1cm4gIkRXX1RBR19jb25zdF90eXBlIjsKLSAgICBjYXNlIERXX1RBR19jb25zdGFudDogcmV0dXJuICJEV19UQUdfY29uc3RhbnQiOwotICAgIGNhc2UgRFdfVEFHX2VudW1lcmF0b3I6IHJldHVybiAiRFdfVEFHX2VudW1lcmF0b3IiOwotICAgIGNhc2UgRFdfVEFHX2ZpbGVfdHlwZTogcmV0dXJuICJEV19UQUdfZmlsZV90eXBlIjsKLSAgICBjYXNlIERXX1RBR19mcmllbmQ6IHJldHVybiAiRFdfVEFHX2ZyaWVuZCI7Ci0gICAgY2FzZSBEV19UQUdfbmFtZWxpc3Q6IHJldHVybiAiRFdfVEFHX25hbWVsaXN0IjsKLSAgICBjYXNlIERXX1RBR19uYW1lbGlzdF9pdGVtOiByZXR1cm4gIkRXX1RBR19uYW1lbGlzdF9pdGVtIjsKLSAgICBjYXNlIERXX1RBR19wYWNrZWRfdHlwZTogcmV0dXJuICJEV19UQUdfcGFja2VkX3R5cGUiOwotICAgIGNhc2UgRFdfVEFHX3N1YnByb2dyYW06IHJldHVybiAiRFdfVEFHX3N1YnByb2dyYW0iOwotICAgIGNhc2UgRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW06IHJldHVybiAiRFdfVEFHX3RlbXBsYXRlX3R5cGVfcGFyYW0iOwotICAgIGNhc2UgRFdfVEFHX3RlbXBsYXRlX3ZhbHVlX3BhcmFtOiByZXR1cm4gIkRXX1RBR190ZW1wbGF0ZV92YWx1ZV9wYXJhbSI7Ci0gICAgY2FzZSBEV19UQUdfdGhyb3duX3R5cGU6IHJldHVybiAiRFdfVEFHX3Rocm93bl90eXBlIjsKLSAgICBjYXNlIERXX1RBR190cnlfYmxvY2s6IHJldHVybiAiRFdfVEFHX3RyeV9ibG9jayI7Ci0gICAgY2FzZSBEV19UQUdfdmFyaWFudF9wYXJ0OiByZXR1cm4gIkRXX1RBR192YXJpYW50X3BhcnQiOwotICAgIGNhc2UgRFdfVEFHX3ZhcmlhYmxlOiByZXR1cm4gIkRXX1RBR192YXJpYWJsZSI7Ci0gICAgY2FzZSBEV19UQUdfdm9sYXRpbGVfdHlwZTogcmV0dXJuICJEV19UQUdfdm9sYXRpbGVfdHlwZSI7Ci0gICAgY2FzZSBEV19UQUdfTUlQU19sb29wOiByZXR1cm4gIkRXX1RBR19NSVBTX2xvb3AiOwotICAgIGNhc2UgRFdfVEFHX2Zvcm1hdF9sYWJlbDogcmV0dXJuICJEV19UQUdfZm9ybWF0X2xhYmVsIjsKLSAgICBjYXNlIERXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZTogcmV0dXJuICJEV19UQUdfZnVuY3Rpb25fdGVtcGxhdGUiOwotICAgIGNhc2UgRFdfVEFHX2NsYXNzX3RlbXBsYXRlOiByZXR1cm4gIkRXX1RBR19jbGFzc190ZW1wbGF0ZSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQlzdGF0aWMgY2hhciBidWZmZXIgWzEwMF07Ci0KLQlzcHJpbnRmIChidWZmZXIsIF8oIlVua25vd24gVEFHIHZhbHVlOiAlbHgiKSwgdGFnKTsKLQlyZXR1cm4gYnVmZmVyOwotICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X0FUX25hbWUgKGF0dHJpYnV0ZSkKLSAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGU7Ci17Ci0gIHN3aXRjaCAoYXR0cmlidXRlKQotICAgIHsKLSAgICBjYXNlIERXX0FUX3NpYmxpbmc6IHJldHVybiAiRFdfQVRfc2libGluZyI7Ci0gICAgY2FzZSBEV19BVF9sb2NhdGlvbjogcmV0dXJuICJEV19BVF9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9uYW1lOiByZXR1cm4gIkRXX0FUX25hbWUiOwotICAgIGNhc2UgRFdfQVRfb3JkZXJpbmc6IHJldHVybiAiRFdfQVRfb3JkZXJpbmciOwotICAgIGNhc2UgRFdfQVRfc3Vic2NyX2RhdGE6IHJldHVybiAiRFdfQVRfc3Vic2NyX2RhdGEiOwotICAgIGNhc2UgRFdfQVRfYnl0ZV9zaXplOiByZXR1cm4gIkRXX0FUX2J5dGVfc2l6ZSI7Ci0gICAgY2FzZSBEV19BVF9iaXRfb2Zmc2V0OiByZXR1cm4gIkRXX0FUX2JpdF9vZmZzZXQiOwotICAgIGNhc2UgRFdfQVRfYml0X3NpemU6IHJldHVybiAiRFdfQVRfYml0X3NpemUiOwotICAgIGNhc2UgRFdfQVRfZWxlbWVudF9saXN0OiByZXR1cm4gIkRXX0FUX2VsZW1lbnRfbGlzdCI7Ci0gICAgY2FzZSBEV19BVF9zdG10X2xpc3Q6IHJldHVybiAiRFdfQVRfc3RtdF9saXN0IjsKLSAgICBjYXNlIERXX0FUX2xvd19wYzogcmV0dXJuICJEV19BVF9sb3dfcGMiOwotICAgIGNhc2UgRFdfQVRfaGlnaF9wYzogcmV0dXJuICJEV19BVF9oaWdoX3BjIjsKLSAgICBjYXNlIERXX0FUX2xhbmd1YWdlOiByZXR1cm4gIkRXX0FUX2xhbmd1YWdlIjsKLSAgICBjYXNlIERXX0FUX21lbWJlcjogcmV0dXJuICJEV19BVF9tZW1iZXIiOwotICAgIGNhc2UgRFdfQVRfZGlzY3I6IHJldHVybiAiRFdfQVRfZGlzY3IiOwotICAgIGNhc2UgRFdfQVRfZGlzY3JfdmFsdWU6IHJldHVybiAiRFdfQVRfZGlzY3JfdmFsdWUiOwotICAgIGNhc2UgRFdfQVRfdmlzaWJpbGl0eTogcmV0dXJuICJEV19BVF92aXNpYmlsaXR5IjsKLSAgICBjYXNlIERXX0FUX2ltcG9ydDogcmV0dXJuICJEV19BVF9pbXBvcnQiOwotICAgIGNhc2UgRFdfQVRfc3RyaW5nX2xlbmd0aDogcmV0dXJuICJEV19BVF9zdHJpbmdfbGVuZ3RoIjsKLSAgICBjYXNlIERXX0FUX2NvbW1vbl9yZWZlcmVuY2U6IHJldHVybiAiRFdfQVRfY29tbW9uX3JlZmVyZW5jZSI7Ci0gICAgY2FzZSBEV19BVF9jb21wX2RpcjogcmV0dXJuICJEV19BVF9jb21wX2RpciI7Ci0gICAgY2FzZSBEV19BVF9jb25zdF92YWx1ZTogcmV0dXJuICJEV19BVF9jb25zdF92YWx1ZSI7Ci0gICAgY2FzZSBEV19BVF9jb250YWluaW5nX3R5cGU6IHJldHVybiAiRFdfQVRfY29udGFpbmluZ190eXBlIjsKLSAgICBjYXNlIERXX0FUX2RlZmF1bHRfdmFsdWU6IHJldHVybiAiRFdfQVRfZGVmYXVsdF92YWx1ZSI7Ci0gICAgY2FzZSBEV19BVF9pbmxpbmU6IHJldHVybiAiRFdfQVRfaW5saW5lIjsKLSAgICBjYXNlIERXX0FUX2lzX29wdGlvbmFsOiByZXR1cm4gIkRXX0FUX2lzX29wdGlvbmFsIjsKLSAgICBjYXNlIERXX0FUX2xvd2VyX2JvdW5kOiByZXR1cm4gIkRXX0FUX2xvd2VyX2JvdW5kIjsKLSAgICBjYXNlIERXX0FUX3Byb2R1Y2VyOiByZXR1cm4gIkRXX0FUX3Byb2R1Y2VyIjsKLSAgICBjYXNlIERXX0FUX3Byb3RvdHlwZWQ6IHJldHVybiAiRFdfQVRfcHJvdG90eXBlZCI7Ci0gICAgY2FzZSBEV19BVF9yZXR1cm5fYWRkcjogcmV0dXJuICJEV19BVF9yZXR1cm5fYWRkciI7Ci0gICAgY2FzZSBEV19BVF9zdGFydF9zY29wZTogcmV0dXJuICJEV19BVF9zdGFydF9zY29wZSI7Ci0gICAgY2FzZSBEV19BVF9zdHJpZGVfc2l6ZTogcmV0dXJuICJEV19BVF9zdHJpZGVfc2l6ZSI7Ci0gICAgY2FzZSBEV19BVF91cHBlcl9ib3VuZDogcmV0dXJuICJEV19BVF91cHBlcl9ib3VuZCI7Ci0gICAgY2FzZSBEV19BVF9hYnN0cmFjdF9vcmlnaW46IHJldHVybiAiRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIjsKLSAgICBjYXNlIERXX0FUX2FjY2Vzc2liaWxpdHk6IHJldHVybiAiRFdfQVRfYWNjZXNzaWJpbGl0eSI7Ci0gICAgY2FzZSBEV19BVF9hZGRyZXNzX2NsYXNzOiByZXR1cm4gIkRXX0FUX2FkZHJlc3NfY2xhc3MiOwotICAgIGNhc2UgRFdfQVRfYXJ0aWZpY2lhbDogcmV0dXJuICJEV19BVF9hcnRpZmljaWFsIjsKLSAgICBjYXNlIERXX0FUX2Jhc2VfdHlwZXM6IHJldHVybiAiRFdfQVRfYmFzZV90eXBlcyI7Ci0gICAgY2FzZSBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb246IHJldHVybiAiRFdfQVRfY2FsbGluZ19jb252ZW50aW9uIjsKLSAgICBjYXNlIERXX0FUX2NvdW50OiByZXR1cm4gIkRXX0FUX2NvdW50IjsKLSAgICBjYXNlIERXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX2RhdGFfbWVtYmVyX2xvY2F0aW9uIjsKLSAgICBjYXNlIERXX0FUX2RlY2xfY29sdW1uOiByZXR1cm4gIkRXX0FUX2RlY2xfY29sdW1uIjsKLSAgICBjYXNlIERXX0FUX2RlY2xfZmlsZTogcmV0dXJuICJEV19BVF9kZWNsX2ZpbGUiOwotICAgIGNhc2UgRFdfQVRfZGVjbF9saW5lOiByZXR1cm4gIkRXX0FUX2RlY2xfbGluZSI7Ci0gICAgY2FzZSBEV19BVF9kZWNsYXJhdGlvbjogcmV0dXJuICJEV19BVF9kZWNsYXJhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9kaXNjcl9saXN0OiByZXR1cm4gIkRXX0FUX2Rpc2NyX2xpc3QiOwotICAgIGNhc2UgRFdfQVRfZW5jb2Rpbmc6IHJldHVybiAiRFdfQVRfZW5jb2RpbmciOwotICAgIGNhc2UgRFdfQVRfZXh0ZXJuYWw6IHJldHVybiAiRFdfQVRfZXh0ZXJuYWwiOwotICAgIGNhc2UgRFdfQVRfZnJhbWVfYmFzZTogcmV0dXJuICJEV19BVF9mcmFtZV9iYXNlIjsKLSAgICBjYXNlIERXX0FUX2ZyaWVuZDogcmV0dXJuICJEV19BVF9mcmllbmQiOwotICAgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOiByZXR1cm4gIkRXX0FUX2lkZW50aWZpZXJfY2FzZSI7Ci0gICAgY2FzZSBEV19BVF9tYWNyb19pbmZvOiByZXR1cm4gIkRXX0FUX21hY3JvX2luZm8iOwotICAgIGNhc2UgRFdfQVRfbmFtZWxpc3RfaXRlbXM6IHJldHVybiAiRFdfQVRfbmFtZWxpc3RfaXRlbXMiOwotICAgIGNhc2UgRFdfQVRfcHJpb3JpdHk6IHJldHVybiAiRFdfQVRfcHJpb3JpdHkiOwotICAgIGNhc2UgRFdfQVRfc2VnbWVudDogcmV0dXJuICJEV19BVF9zZWdtZW50IjsKLSAgICBjYXNlIERXX0FUX3NwZWNpZmljYXRpb246IHJldHVybiAiRFdfQVRfc3BlY2lmaWNhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9zdGF0aWNfbGluazogcmV0dXJuICJEV19BVF9zdGF0aWNfbGluayI7Ci0gICAgY2FzZSBEV19BVF90eXBlOiByZXR1cm4gIkRXX0FUX3R5cGUiOwotICAgIGNhc2UgRFdfQVRfdXNlX2xvY2F0aW9uOiByZXR1cm4gIkRXX0FUX3VzZV9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXI6IHJldHVybiAiRFdfQVRfdmFyaWFibGVfcGFyYW1ldGVyIjsKLSAgICBjYXNlIERXX0FUX3ZpcnR1YWxpdHk6IHJldHVybiAiRFdfQVRfdmlydHVhbGl0eSI7Ci0gICAgY2FzZSBEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbjogcmV0dXJuICJEV19BVF92dGFibGVfZWxlbV9sb2NhdGlvbiI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2ZkZTogcmV0dXJuICJEV19BVF9NSVBTX2ZkZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2xvb3BfYmVnaW46IHJldHVybiAiRFdfQVRfTUlQU19sb29wX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfZXBpbG9nX2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yOiByZXR1cm4gIkRXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yIjsKLSAgICBjYXNlIERXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGg6IHJldHVybiAiRFdfQVRfTUlQU19zb2Z0d2FyZV9waXBlbGluZV9kZXB0aCI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2xpbmthZ2VfbmFtZTogcmV0dXJuICJEV19BVF9NSVBTX2xpbmthZ2VfbmFtZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX3N0cmlkZTogcmV0dXJuICJEV19BVF9NSVBTX3N0cmlkZSI7Ci0gICAgY2FzZSBEV19BVF9NSVBTX2Fic3RyYWN0X25hbWU6IHJldHVybiAiRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lIjsKLSAgICBjYXNlIERXX0FUX01JUFNfY2xvbmVfb3JpZ2luOiByZXR1cm4gIkRXX0FUX01JUFNfY2xvbmVfb3JpZ2luIjsKLSAgICBjYXNlIERXX0FUX01JUFNfaGFzX2lubGluZXM6IHJldHVybiAiRFdfQVRfTUlQU19oYXNfaW5saW5lcyI7Ci0gICAgY2FzZSBEV19BVF9zZl9uYW1lczogcmV0dXJuICJEV19BVF9zZl9uYW1lcyI7Ci0gICAgY2FzZSBEV19BVF9zcmNfaW5mbzogcmV0dXJuICJEV19BVF9zcmNfaW5mbyI7Ci0gICAgY2FzZSBEV19BVF9tYWNfaW5mbzogcmV0dXJuICJEV19BVF9tYWNfaW5mbyI7Ci0gICAgY2FzZSBEV19BVF9zcmNfY29vcmRzOiByZXR1cm4gIkRXX0FUX3NyY19jb29yZHMiOwotICAgIGNhc2UgRFdfQVRfYm9keV9iZWdpbjogcmV0dXJuICJEV19BVF9ib2R5X2JlZ2luIjsKLSAgICBjYXNlIERXX0FUX2JvZHlfZW5kOiByZXR1cm4gIkRXX0FUX2JvZHlfZW5kIjsKLSAgICBkZWZhdWx0OgotICAgICAgewotCXN0YXRpYyBjaGFyIGJ1ZmZlciBbMTAwXTsKLQotCXNwcmludGYgKGJ1ZmZlciwgXygiVW5rbm93biBBVCB2YWx1ZTogJWx4IiksIGF0dHJpYnV0ZSk7Ci0JcmV0dXJuIGJ1ZmZlcjsKLSAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9GT1JNX25hbWUgKGZvcm0pCi0gICAgIHVuc2lnbmVkIGxvbmcgZm9ybTsKLXsKLSAgc3dpdGNoIChmb3JtKQotICAgIHsKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjogcmV0dXJuICJEV19GT1JNX2FkZHIiOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6IHJldHVybiAiRFdfRk9STV9ibG9jazIiOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazQ6IHJldHVybiAiRFdfRk9STV9ibG9jazQiOwotICAgIGNhc2UgRFdfRk9STV9kYXRhMjogcmV0dXJuICJEV19GT1JNX2RhdGEyIjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTQ6IHJldHVybiAiRFdfRk9STV9kYXRhNCI7Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE4OiByZXR1cm4gIkRXX0ZPUk1fZGF0YTgiOwotICAgIGNhc2UgRFdfRk9STV9zdHJpbmc6IHJldHVybiAiRFdfRk9STV9zdHJpbmciOwotICAgIGNhc2UgRFdfRk9STV9ibG9jazogcmV0dXJuICJEV19GT1JNX2Jsb2NrIjsKLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOiByZXR1cm4gIkRXX0ZPUk1fYmxvY2sxIjsKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTE6IHJldHVybiAiRFdfRk9STV9kYXRhMSI7Ci0gICAgY2FzZSBEV19GT1JNX2ZsYWc6IHJldHVybiAiRFdfRk9STV9mbGFnIjsKLSAgICBjYXNlIERXX0ZPUk1fc2RhdGE6IHJldHVybiAiRFdfRk9STV9zZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX3N0cnA6IHJldHVybiAiRFdfRk9STV9zdHJwIjsKLSAgICBjYXNlIERXX0ZPUk1fdWRhdGE6IHJldHVybiAiRFdfRk9STV91ZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOiByZXR1cm4gIkRXX0ZPUk1fcmVmX2FkZHIiOwotICAgIGNhc2UgRFdfRk9STV9yZWYxOiByZXR1cm4gIkRXX0ZPUk1fcmVmMSI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZjI6IHJldHVybiAiRFdfRk9STV9yZWYyIjsKLSAgICBjYXNlIERXX0ZPUk1fcmVmNDogcmV0dXJuICJEV19GT1JNX3JlZjQiOwotICAgIGNhc2UgRFdfRk9STV9yZWY4OiByZXR1cm4gIkRXX0ZPUk1fcmVmOCI7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl91ZGF0YTogcmV0dXJuICJEV19GT1JNX3JlZl91ZGF0YSI7Ci0gICAgY2FzZSBEV19GT1JNX2luZGlyZWN0OiByZXR1cm4gIkRXX0ZPUk1faW5kaXJlY3QiOwotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0Jc3RhdGljIGNoYXIgYnVmZmVyIFsxMDBdOwotCi0Jc3ByaW50ZiAoYnVmZmVyLCBfKCJVbmtub3duIEZPUk0gdmFsdWU6ICVseCIpLCBmb3JtKTsKLQlyZXR1cm4gYnVmZmVyOwotICAgICAgfQotICAgIH0KLX0KLQotLyogRklYTUU6ICBUaGVyZSBhcmUgYmV0dGVyIGFuZCBtb3JlIGVmZmllY2ludCB3YXlzIHRvIGhhbmRsZQotICAgdGhlc2Ugc3RydWN0dXJlcy4gIEZvciBub3cgdGhvdWdoLCBJIGp1c3Qgd2FudCBzb21ldGhpbmcgdGhhdAotICAgaXMgc2ltcGxlIHRvIGltcGxlbWVudC4gICovCi10eXBlZGVmIHN0cnVjdCBhYmJyZXZfYXR0cgotewotICB1bnNpZ25lZCBsb25nICAgICAgICBhdHRyaWJ1dGU7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgIGZvcm07Ci0gIHN0cnVjdCBhYmJyZXZfYXR0ciAqIG5leHQ7Ci19Ci1hYmJyZXZfYXR0cjsKLQotdHlwZWRlZiBzdHJ1Y3QgYWJicmV2X2VudHJ5Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgZW50cnk7Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdGFnOwotICBpbnQgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOwotICBzdHJ1Y3QgYWJicmV2X2F0dHIgKiAgIGZpcnN0X2F0dHI7Ci0gIHN0cnVjdCBhYmJyZXZfYXR0ciAqICAgbGFzdF9hdHRyOwotICBzdHJ1Y3QgYWJicmV2X2VudHJ5ICogIG5leHQ7Ci19Ci1hYmJyZXZfZW50cnk7Ci0KLXN0YXRpYyBhYmJyZXZfZW50cnkgKiBmaXJzdF9hYmJyZXYgPSBOVUxMOwotc3RhdGljIGFiYnJldl9lbnRyeSAqIGxhc3RfYWJicmV2ID0gTlVMTDsKLQotc3RhdGljIHZvaWQKLWZyZWVfYWJicmV2cyBQQVJBTVMgKCh2b2lkKSkKLXsKLSAgYWJicmV2X2VudHJ5ICogYWJicmV2OwotCi0gIGZvciAoYWJicmV2ID0gZmlyc3RfYWJicmV2OyBhYmJyZXY7KQotICAgIHsKLSAgICAgIGFiYnJldl9lbnRyeSAqIG5leHQgPSBhYmJyZXYtPm5leHQ7Ci0gICAgICBhYmJyZXZfYXR0ciAgKiBhdHRyOwotCi0gICAgICBmb3IgKGF0dHIgPSBhYmJyZXYtPmZpcnN0X2F0dHI7IGF0dHI7KQotCXsKLQkgIGFiYnJldl9hdHRyICogbmV4dCA9IGF0dHItPm5leHQ7Ci0KLQkgIGZyZWUgKGF0dHIpOwotCSAgYXR0ciA9IG5leHQ7Ci0JfQotCi0gICAgICBmcmVlIChhYmJyZXYpOwotICAgICAgYWJicmV2ID0gbmV4dDsKLSAgICB9Ci0KLSAgbGFzdF9hYmJyZXYgPSBmaXJzdF9hYmJyZXYgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotYWRkX2FiYnJldiAobnVtYmVyLCB0YWcsIGNoaWxkcmVuKQotICAgICB1bnNpZ25lZCBsb25nIG51bWJlcjsKLSAgICAgdW5zaWduZWQgbG9uZyB0YWc7Ci0gICAgIGludCAgICAgICAgICAgY2hpbGRyZW47Ci17Ci0gIGFiYnJldl9lbnRyeSAqIGVudHJ5OwotCi0gIGVudHJ5ID0gKGFiYnJldl9lbnRyeSAqKSBtYWxsb2MgKHNpemVvZiAoKiBlbnRyeSkpOwotCi0gIGlmIChlbnRyeSA9PSBOVUxMKQotICAgIC8qIHVnZyAqLwotICAgIHJldHVybjsKLQotICBlbnRyeS0+ZW50cnkgICAgICA9IG51bWJlcjsKLSAgZW50cnktPnRhZyAgICAgICAgPSB0YWc7Ci0gIGVudHJ5LT5jaGlsZHJlbiAgID0gY2hpbGRyZW47Ci0gIGVudHJ5LT5maXJzdF9hdHRyID0gTlVMTDsKLSAgZW50cnktPmxhc3RfYXR0ciAgPSBOVUxMOwotICBlbnRyeS0+bmV4dCAgICAgICA9IE5VTEw7Ci0KLSAgaWYgKGZpcnN0X2FiYnJldiA9PSBOVUxMKQotICAgIGZpcnN0X2FiYnJldiA9IGVudHJ5OwotICBlbHNlCi0gICAgbGFzdF9hYmJyZXYtPm5leHQgPSBlbnRyeTsKLQotICBsYXN0X2FiYnJldiA9IGVudHJ5OwotfQotCi1zdGF0aWMgdm9pZAotYWRkX2FiYnJldl9hdHRyIChhdHRyaWJ1dGUsIGZvcm0pCi0gICAgIHVuc2lnbmVkIGxvbmcgYXR0cmlidXRlOwotICAgICB1bnNpZ25lZCBsb25nIGZvcm07Ci17Ci0gIGFiYnJldl9hdHRyICogYXR0cjsKLQotICBhdHRyID0gKGFiYnJldl9hdHRyICopIG1hbGxvYyAoc2l6ZW9mICgqIGF0dHIpKTsKLQotICBpZiAoYXR0ciA9PSBOVUxMKQotICAgIC8qIHVnZyAqLwotICAgIHJldHVybjsKLQotICBhdHRyLT5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGU7Ci0gIGF0dHItPmZvcm0gICAgICA9IGZvcm07Ci0gIGF0dHItPm5leHQgICAgICA9IE5VTEw7Ci0KLSAgaWYgKGxhc3RfYWJicmV2LT5maXJzdF9hdHRyID09IE5VTEwpCi0gICAgbGFzdF9hYmJyZXYtPmZpcnN0X2F0dHIgPSBhdHRyOwotICBlbHNlCi0gICAgbGFzdF9hYmJyZXYtPmxhc3RfYXR0ci0+bmV4dCA9IGF0dHI7Ci0KLSAgbGFzdF9hYmJyZXYtPmxhc3RfYXR0ciA9IGF0dHI7Ci19Ci0KLS8qIFByb2Nlc3NlcyB0aGUgKHBhcnRpYWwpIGNvbnRlbnRzIG9mIGEgLmRlYnVnX2FiYnJldiBzZWN0aW9uLgotICAgUmV0dXJucyBOVUxMIGlmIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gd2FzIGVuY291bnRlcmVkLgotICAgUmV0dXJucyB0aGUgYWRkcmVzcyBhZnRlciB0aGUgbGFzdCBieXRlIHJlYWQgaWYgdGhlIGVuZCBvZgotICAgYW4gYWJicmV2aWF0aW9uIHNldCB3YXMgZm91bmQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1wcm9jZXNzX2FiYnJldl9zZWN0aW9uIChzdGFydCwgZW5kKQotICAgICB1bnNpZ25lZCBjaGFyICogc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKiBlbmQ7Ci17Ci0gIGlmIChmaXJzdF9hYmJyZXYgIT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICB3aGlsZSAoc3RhcnQgPCBlbmQpCi0gICAgewotICAgICAgaW50ICAgICAgICAgICBieXRlc19yZWFkOwotICAgICAgdW5zaWduZWQgbG9uZyBlbnRyeTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdGFnOwotICAgICAgdW5zaWduZWQgbG9uZyBhdHRyaWJ1dGU7Ci0gICAgICBpbnQgICAgICAgICAgIGNoaWxkcmVuOwotCi0gICAgICBlbnRyeSA9IHJlYWRfbGViMTI4IChzdGFydCwgJiBieXRlc19yZWFkLCAwKTsKLSAgICAgIHN0YXJ0ICs9IGJ5dGVzX3JlYWQ7Ci0KLSAgICAgIGlmIChlbnRyeSA9PSAwKQotCXJldHVybiBzdGFydDsKLQotICAgICAgdGFnID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotICAgICAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotICAgICAgY2hpbGRyZW4gPSAqIHN0YXJ0ICsrOwotCi0gICAgICBhZGRfYWJicmV2IChlbnRyeSwgdGFnLCBjaGlsZHJlbik7Ci0KLSAgICAgIGRvCi0JewotCSAgdW5zaWduZWQgbG9uZyBmb3JtOwotCi0JICBhdHRyaWJ1dGUgPSByZWFkX2xlYjEyOCAoc3RhcnQsICYgYnl0ZXNfcmVhZCwgMCk7Ci0JICBzdGFydCArPSBieXRlc19yZWFkOwotCi0JICBmb3JtID0gcmVhZF9sZWIxMjggKHN0YXJ0LCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgc3RhcnQgKz0gYnl0ZXNfcmVhZDsKLQotCSAgaWYgKGF0dHJpYnV0ZSAhPSAwKQotCSAgICBhZGRfYWJicmV2X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSk7Ci0JfQotICAgICAgd2hpbGUgKGF0dHJpYnV0ZSAhPSAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19hYmJyZXYgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgYWJicmV2X2VudHJ5ICogZW50cnk7Ci0gIHVuc2lnbmVkIGNoYXIgKiBlbmQgPSBzdGFydCArIHNlY3Rpb24tPnNoX3NpemU7Ci0KLSAgcHJpbnRmIChfKCJDb250ZW50cyBvZiB0aGUgJXMgc2VjdGlvbjpcblxuIiksIFNFQ1RJT05fTkFNRSAoc2VjdGlvbikpOwotCi0gIGRvCi0gICAgewotICAgICAgc3RhcnQgPSBwcm9jZXNzX2FiYnJldl9zZWN0aW9uIChzdGFydCwgZW5kKTsKLQotICAgICAgcHJpbnRmIChfKCIgIE51bWJlciBUQUdcbiIpKTsKLQotICAgICAgZm9yIChlbnRyeSA9IGZpcnN0X2FiYnJldjsgZW50cnk7IGVudHJ5ID0gZW50cnktPm5leHQpCi0JewotCSAgYWJicmV2X2F0dHIgKiBhdHRyOwotCi0JICBwcmludGYgKF8oIiAgICVsZCAgICAgICVzICAgIFslc11cbiIpLAotCQkgIGVudHJ5LT5lbnRyeSwKLQkJICBnZXRfVEFHX25hbWUgKGVudHJ5LT50YWcpLAotCQkgIGVudHJ5LT5jaGlsZHJlbiA/IF8oImhhcyBjaGlsZHJlbiIpIDogXygibm8gY2hpbGRyZW4iKSk7Ci0KLQkgIGZvciAoYXR0ciA9IGVudHJ5LT5maXJzdF9hdHRyOyBhdHRyOyBhdHRyID0gYXR0ci0+bmV4dCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoXygiICAgICUtMThzICVzXG4iKSwKLQkJICAgICAgZ2V0X0FUX25hbWUgKGF0dHItPmF0dHJpYnV0ZSksCi0JCSAgICAgIGdldF9GT1JNX25hbWUgKGF0dHItPmZvcm0pKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHdoaWxlIChzdGFydCk7Ci0KLSAgcHJpbnRmICgiXG4iKTsKLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1kaXNwbGF5X2Jsb2NrIChkYXRhLCBsZW5ndGgpCi0gICAgIHVuc2lnbmVkIGNoYXIgKiBkYXRhOwotICAgICB1bnNpZ25lZCBsb25nICAgbGVuZ3RoOwotewotICBwcmludGYgKF8oIiAlbHUgYnl0ZSBibG9jazogIiksIGxlbmd0aCk7Ci0KLSAgd2hpbGUgKGxlbmd0aCAtLSkKLSAgICBwcmludGYgKCIlbHggIiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhICsrLCAxKSk7Ci0KLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWNvZGVfbG9jYXRpb25fZXhwcmVzc2lvbiAoZGF0YSwgcG9pbnRlcl9zaXplKQotICAgICB1bnNpZ25lZCBjaGFyICogZGF0YTsKLSAgICAgdW5zaWduZWQgaW50ICAgIHBvaW50ZXJfc2l6ZTsKLXsKLSAgdW5zaWduZWQgY2hhciBvcDsKLSAgaW50ICAgICAgICAgICBieXRlc19yZWFkOwotICB1bnNpZ25lZCBsb25nIHV2YWx1ZTsKLQotICBvcCA9ICogZGF0YSArKzsKLQotICBzd2l0Y2ggKG9wKQotICAgIHsKLSAgICBjYXNlIERXX09QX2FkZHI6Ci0gICAgICBwcmludGYgKCJEV19PUF9hZGRyOiAlbHgiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIHBvaW50ZXJfc2l6ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kZXJlZjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2RlcmVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MXU6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDF1OiAlbHUiLCAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3QxczoKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0MXM6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDJ1OgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3QydTogJWx1IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0MnM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDJzOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3Q0dToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0NHU6ICVsdSIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9jb25zdDRzOgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3Q0czogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0OHU6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDh1OiAlbHUgJWx1IiwgKHVuc2lnbmVkIGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSwKLQkgICAgICAodW5zaWduZWQgbG9uZykgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0OHM6Ci0gICAgICBwcmludGYgKCJEV19PUF9jb25zdDhzOiAlbGQgJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCA0KSwKLQkgICAgICAobG9uZykgYnl0ZV9nZXQgKGRhdGEgKyA0LCA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2NvbnN0dToKLSAgICAgIHByaW50ZiAoIkRXX09QX2NvbnN0dTogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfY29uc3RzOgotICAgICAgcHJpbnRmICgiRFdfT1BfY29uc3RzOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9kdXA6Ci0gICAgICBwcmludGYgKCJEV19PUF9kdXAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZHJvcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2Ryb3AiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfb3ZlcjoKLSAgICAgIHByaW50ZiAoIkRXX09QX292ZXIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGljazoKLSAgICAgIHByaW50ZiAoIkRXX09QX3BpY2s6ICVsZCIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zd2FwOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc3dhcCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yb3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9yb3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfeGRlcmVmOgotICAgICAgcHJpbnRmICgiRFdfT1BfeGRlcmVmIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2FiczoKLSAgICAgIHByaW50ZiAoIkRXX09QX2FicyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9hbmQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9hbmQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZGl2OgotICAgICAgcHJpbnRmICgiRFdfT1BfZGl2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX21pbnVzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbWludXMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbW9kOgotICAgICAgcHJpbnRmICgiRFdfT1BfbW9kIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX211bDoKLSAgICAgIHByaW50ZiAoIkRXX09QX211bCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9uZWc6Ci0gICAgICBwcmludGYgKCJEV19PUF9uZWciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfbm90OgotICAgICAgcHJpbnRmICgiRFdfT1Bfbm90Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX29yOgotICAgICAgcHJpbnRmICgiRFdfT1Bfb3IiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGx1czoKLSAgICAgIHByaW50ZiAoIkRXX09QX3BsdXMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcGx1c191Y29uc3Q6Ci0gICAgICBwcmludGYgKCJEV19PUF9wbHVzX3Vjb25zdDogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2hsOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2hsIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3NocjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3NociIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9zaHJhOgotICAgICAgcHJpbnRmICgiRFdfT1Bfc2hyYSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF94b3I6Ci0gICAgICBwcmludGYgKCJEV19PUF94b3IiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJhOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJhOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZXE6Ci0gICAgICBwcmludGYgKCJEV19PUF9lcSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9nZToKLSAgICAgIHByaW50ZiAoIkRXX09QX2dlIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2d0OgotICAgICAgcHJpbnRmICgiRFdfT1BfZ3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGU6Ci0gICAgICBwcmludGYgKCJEV19PUF9sZSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9sdDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2x0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX25lOgotICAgICAgcHJpbnRmICgiRFdfT1BfbmUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1Bfc2tpcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3NraXA6ICVsZCIsIChsb25nKSBieXRlX2dldCAoZGF0YSwgMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQwOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ0OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ1OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ2OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ3OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0NyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ4OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0OCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQ5OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0OSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDEwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDExOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTI6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxMiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxMzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDEzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE0OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTU6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxNSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxNjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDE3OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MTciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MTg6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQxOCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQxOToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDE5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIwOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjE6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDIyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDIzOgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MjQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyNCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI2OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0Mjc6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQyNyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQyODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDI4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2xpdDI5OgotICAgICAgcHJpbnRmICgiRFdfT1BfbGl0MjkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfbGl0MzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9saXQzMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9saXQzMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2xpdDMxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzM6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWczIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzU6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzY6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc2Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzc6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzg6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzk6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWc5Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzEwOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTAiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTE6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxMSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzEyIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzEzOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTMiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxNCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxNToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE1Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE2OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTYiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMTc6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcxNyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcxODoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzE4Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzE5OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMTkiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjA6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyMCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyMToKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzIxIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzIyOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjIiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjM6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyMyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI1OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjUiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjY6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyNiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWcyNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzI3Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzI4OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMjgiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfcmVnMjk6Ci0gICAgICBwcmludGYgKCJEV19PUF9yZWcyOSIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWczMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX3JlZzMwIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3JlZzMxOgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVnMzEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzA6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzM6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzU6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzY6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzc6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzg6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzk6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnOTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEwOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzEwOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTE6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTE6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxMjoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxMjogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzEzOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzEzOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTQ6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTQ6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxNToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxNTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE2OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE2OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMTc6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMTc6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcxODoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcxODogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzE5OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzE5OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjA6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjA6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyMToKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyMTogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzIyOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzIyOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjM6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjM6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyNDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyNDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI1OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI1OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjY6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjY6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWcyNzoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWcyNzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzI4OgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzI4OiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9icmVnMjk6Ci0gICAgICBwcmludGYgKCJEV19PUF9icmVnMjk6ICVsZCIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2JyZWczMDoKLSAgICAgIHByaW50ZiAoIkRXX09QX2JyZWczMDogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZzMxOgotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZzMxOiAlbGQiLCByZWFkX2xlYjEyOCAoZGF0YSwgTlVMTCwgMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEV19PUF9yZWd4OgotICAgICAgcHJpbnRmICgiRFdfT1BfcmVneDogJWx1IiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDApKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfZmJyZWc6Ci0gICAgICBwcmludGYgKCJEV19PUF9mYnJlZzogJWxkIiwgcmVhZF9sZWIxMjggKGRhdGEsIE5VTEwsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfYnJlZ3g6Ci0gICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJmJ5dGVzX3JlYWQsIDApOwotICAgICAgcHJpbnRmICgiRFdfT1BfYnJlZ3g6ICVsdSAlbGQiLCB1dmFsdWUsCi0JICAgICAgcmVhZF9sZWIxMjggKGRhdGEgKyBieXRlc19yZWFkLCBOVUxMLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX3BpZWNlOgotICAgICAgcHJpbnRmICgiRFdfT1BfcGllY2U6ICVsdSIsIHJlYWRfbGViMTI4IChkYXRhLCBOVUxMLCAwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX2RlcmVmX3NpemU6Ci0gICAgICBwcmludGYgKCJEV19PUF9kZXJlZl9zaXplOiAlbGQiLCAobG9uZykgYnl0ZV9nZXQgKGRhdGEsIDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRFdfT1BfeGRlcmVmX3NpemU6Ci0gICAgICBwcmludGYgKCJEV19PUF94ZGVyZWZfc2l6ZTogJWxkIiwgKGxvbmcpIGJ5dGVfZ2V0IChkYXRhLCAxKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERXX09QX25vcDoKLSAgICAgIHByaW50ZiAoIkRXX09QX25vcCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKG9wID49IERXX09QX2xvX3VzZXIKLQkgICYmIG9wIDw9IERXX09QX2hpX3VzZXIpCi0JcHJpbnRmIChfKCIoVXNlciBkZWZpbmVkIGxvY2F0aW9uIG9wKSIpKTsKLSAgICAgIGVsc2UKLQlwcmludGYgKF8oIihVbmtub3duIGxvY2F0aW9uIG9wKSIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1yZWFkX2FuZF9kaXNwbGF5X2F0dHIgKGF0dHJpYnV0ZSwgZm9ybSwgZGF0YSwgcG9pbnRlcl9zaXplKQotICAgICB1bnNpZ25lZCBsb25nICAgYXR0cmlidXRlOwotICAgICB1bnNpZ25lZCBsb25nICAgZm9ybTsKLSAgICAgdW5zaWduZWQgY2hhciAqIGRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgICBwb2ludGVyX3NpemU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgICB1dmFsdWU7Ci0gIHVuc2lnbmVkIGNoYXIgKiBibG9ja19zdGFydDsKLSAgaW50ICAgICAgICAgICAgIGJ5dGVzX3JlYWQ7Ci0gIGludAkJICBpc19yZWYgPSAwOwotCi0gIHByaW50ZiAoIiAgICAgJS0xOHM6IiwgZ2V0X0FUX25hbWUgKGF0dHJpYnV0ZSkpOwotCi0gIHN3aXRjaCAoZm9ybSkKLSAgICB7Ci0gICAgY2FzZSBEV19GT1JNX3JlZl9hZGRyOgotICAgIGNhc2UgRFdfRk9STV9yZWYxOgotICAgIGNhc2UgRFdfRk9STV9yZWYyOgotICAgIGNhc2UgRFdfRk9STV9yZWY0OgotICAgIGNhc2UgRFdfRk9STV9yZWY4OgotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6Ci0gICAgICBpc19yZWYgPSAxOwotICAgIH0KLQotICBzd2l0Y2ggKGZvcm0pCi0gICAgewotICAgIGNhc2UgRFdfRk9STV9yZWZfYWRkcjoKLSAgICBjYXNlIERXX0ZPUk1fYWRkcjoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCBwb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwleD4iIDogIiAlI3giLCB1dmFsdWUpOwotICAgICAgZGF0YSArPSBwb2ludGVyX3NpemU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWYxOgotICAgIGNhc2UgRFdfRk9STV9mbGFnOgotICAgIGNhc2UgRFdfRk9STV9kYXRhMToKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhICsrLCAxKTsKLSAgICAgIHByaW50ZiAoaXNfcmVmID8gIiA8JXg+IiA6ICIgJWQiLCB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fcmVmMjoKLSAgICBjYXNlIERXX0ZPUk1fZGF0YTI6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0gICAgICBkYXRhICs9IDI7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCV4PiIgOiAiICVkIiwgdXZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3JlZjQ6Ci0gICAgY2FzZSBEV19GT1JNX2RhdGE0OgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDQpOwotICAgICAgZGF0YSArPSA0OwotICAgICAgcHJpbnRmIChpc19yZWYgPyAiIDwleD4iIDogIiAlZCIsIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWY4OgotICAgIGNhc2UgRFdfRk9STV9kYXRhODoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLSAgICAgIHByaW50ZiAoIiAlbHgiLCB1dmFsdWUpOwotICAgICAgcHJpbnRmICgiICVseCIsICh1bnNpZ25lZCBsb25nKSBieXRlX2dldCAoZGF0YSArIDQsIDQpKTsKLSAgICAgIGRhdGEgKz0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3N0cmluZzoKLSAgICAgIHByaW50ZiAoIiAlcyIsIGRhdGEpOwotICAgICAgZGF0YSArPSBzdHJsZW4gKGRhdGEpICsgMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX3NkYXRhOgotICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMSk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKCIgJWxkIiwgKGxvbmcpIHV2YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9yZWZfdWRhdGE6Ci0gICAgY2FzZSBEV19GT1JNX3VkYXRhOgotICAgICAgdXZhbHVlID0gcmVhZF9sZWIxMjggKGRhdGEsICYgYnl0ZXNfcmVhZCwgMCk7Ci0gICAgICBkYXRhICs9IGJ5dGVzX3JlYWQ7Ci0gICAgICBwcmludGYgKGlzX3JlZiA/ICIgPCVseD4iIDogIiAlbGQiLCB1dmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2s6Ci0gICAgICB1dmFsdWUgPSByZWFkX2xlYjEyOCAoZGF0YSwgJiBieXRlc19yZWFkLCAwKTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIGJ5dGVzX3JlYWQ7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fYmxvY2sxOgotICAgICAgdXZhbHVlID0gYnl0ZV9nZXQgKGRhdGEsIDEpOwotICAgICAgYmxvY2tfc3RhcnQgPSBkYXRhICsgMTsKLSAgICAgIGRhdGEgPSBkaXNwbGF5X2Jsb2NrIChibG9ja19zdGFydCwgdXZhbHVlKTsKLSAgICAgIHV2YWx1ZSA9ICogYmxvY2tfc3RhcnQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfRk9STV9ibG9jazI6Ci0gICAgICB1dmFsdWUgPSBieXRlX2dldCAoZGF0YSwgMik7Ci0gICAgICBibG9ja19zdGFydCA9IGRhdGEgKyAyOwotICAgICAgZGF0YSA9IGRpc3BsYXlfYmxvY2sgKGJsb2NrX3N0YXJ0LCB1dmFsdWUpOwotICAgICAgdXZhbHVlID0gKiBibG9ja19zdGFydDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19GT1JNX2Jsb2NrNDoKLSAgICAgIHV2YWx1ZSA9IGJ5dGVfZ2V0IChkYXRhLCA0KTsKLSAgICAgIGJsb2NrX3N0YXJ0ID0gZGF0YSArIDQ7Ci0gICAgICBkYXRhID0gZGlzcGxheV9ibG9jayAoYmxvY2tfc3RhcnQsIHV2YWx1ZSk7Ci0gICAgICB1dmFsdWUgPSAqIGJsb2NrX3N0YXJ0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0ZPUk1fc3RycDoKLSAgICBjYXNlIERXX0ZPUk1faW5kaXJlY3Q6Ci0gICAgICB3YXJuIChfKCJVbmFibGUgdG8gaGFuZGxlIEZPUk06ICVkIiksIGZvcm0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgd2FybiAoXygiVW5yZWNvZ25pc2VkIGZvcm06ICVkIiksIGZvcm0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIEZvciBzb21lIGF0dHJpYnV0ZXMgd2UgY2FuIGRpc3BsYXkgZnV0aGVyIGluZm9ybWF0aW9uLiAgKi8KLQotICBwcmludGYgKCJcdCIpOwotCi0gIHN3aXRjaCAoYXR0cmlidXRlKQotICAgIHsKLSAgICBjYXNlIERXX0FUX2lubGluZToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0lOTF9ub3RfaW5saW5lZDogICAgICAgICAgcHJpbnRmIChfKCIobm90IGlubGluZWQpIikpOyBicmVhazsKLQljYXNlIERXX0lOTF9pbmxpbmVkOiAgICAgICAgICAgICAgcHJpbnRmIChfKCIoaW5saW5lZCkiKSk7IGJyZWFrOwotCWNhc2UgRFdfSU5MX2RlY2xhcmVkX25vdF9pbmxpbmVkOiBwcmludGYgKF8oIihkZWNsYXJlZCBhcyBpbmxpbmUgYnV0IGlnbm9yZWQpIikpOyBicmVhazsKLQljYXNlIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkOiAgICAgcHJpbnRmIChfKCIoZGVjbGFyZWQgYXMgaW5saW5lIGFuZCBpbmxpbmVkKSIpKTsgYnJlYWs7Ci0JZGVmYXVsdDogcHJpbnRmIChfKCIgIChVbmtub3duIGlubGluZSBhdHRyaWJ1dGUgdmFsdWU6ICVseCkiKSwgdXZhbHVlKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2ZyYW1lX2Jhc2U6Ci0gICAgICBpZiAodXZhbHVlID49IERXX09QX3JlZzAgJiYgdXZhbHVlIDw9IERXX09QX3JlZzMxKQotCXByaW50ZiAoIihyZWcgJWxkKSIsIHV2YWx1ZSAtIERXX09QX3JlZzApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2xhbmd1YWdlOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfTEFOR19DOiAgICAgICAgICAgICAgcHJpbnRmICgiKG5vbi1BTlNJIEMpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19DODk6ICAgICAgICAgICAgcHJpbnRmICgiKEFOU0kgQykiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0NfcGx1c19wbHVzOiAgICBwcmludGYgKCIoQysrKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfRm9ydHJhbjc3OiAgICAgIHByaW50ZiAoIihGT1JUUkFOIDc3KSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfRm9ydHJhbjkwOiAgICAgIHByaW50ZiAoIihGb3J0cmFuIDkwKSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfTW9kdWxhMjogICAgICAgIHByaW50ZiAoIihNb2R1bGEgMikiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX1Bhc2NhbDgzOiAgICAgICBwcmludGYgKCIoQU5TSSBQYXNjYWwpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19BZGE4MzogICAgICAgICAgcHJpbnRmICgiKEFkYSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19MQU5HX0NvYm9sNzQ6ICAgICAgICBwcmludGYgKCIoQ29ib2wgNzQpIik7IGJyZWFrOwotCWNhc2UgRFdfTEFOR19Db2JvbDg1OiAgICAgICAgcHJpbnRmICgiKENvYm9sIDg1KSIpOyBicmVhazsKLQljYXNlIERXX0xBTkdfTWlwc19Bc3NlbWJsZXI6IHByaW50ZiAoIihNSVBTIGFzc2VtYmxlcikiKTsgYnJlYWs7Ci0JZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIoVW5rbm93bjogJWx4KSIsIHV2YWx1ZSk7IGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9lbmNvZGluZzoKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0FURV92b2lkOiAgICAgICAgICAgIHByaW50ZiAoIih2b2lkKSIpOyBicmVhazsKLQljYXNlIERXX0FURV9hZGRyZXNzOiAgICAgICAgIHByaW50ZiAoIihtYWNoaW5lIGFkZHJlc3MpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2Jvb2xlYW46ICAgICAgICAgcHJpbnRmICgiKGJvb2xlYW4pIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2NvbXBsZXhfZmxvYXQ6ICAgcHJpbnRmICgiKGNvbXBsZXggZmxvYXQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX2Zsb2F0OiAgICAgICAgICAgcHJpbnRmICgiKGZsb2F0KSIpOyBicmVhazsKLQljYXNlIERXX0FURV9zaWduZWQ6ICAgICAgICAgIHByaW50ZiAoIihzaWduZWQpIik7IGJyZWFrOwotCWNhc2UgRFdfQVRFX3NpZ25lZF9jaGFyOiAgICAgcHJpbnRmICgiKHNpZ25lZCBjaGFyKSIpOyBicmVhazsKLQljYXNlIERXX0FURV91bnNpZ25lZDogICAgICAgIHByaW50ZiAoIih1bnNpZ25lZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BVEVfdW5zaWduZWRfY2hhcjogICBwcmludGYgKCIodW5zaWduZWQgY2hhcikiKTsgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmICh1dmFsdWUgPj0gRFdfQVRFX2xvX3VzZXIKLQkgICAgICAmJiB1dmFsdWUgPD0gRFdfQVRFX2hpX3VzZXIpCi0JICAgIHByaW50ZiAoIih1c2VyIGRlZmluZWQgdHlwZSkiKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiKHVua25vd24gdHlwZSkiKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEV19BVF9hY2Nlc3NpYmlsaXR5OgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfQUNDRVNTX3B1YmxpYzoJCXByaW50ZiAoIihwdWJsaWMpIik7IGJyZWFrOwotCWNhc2UgRFdfQUNDRVNTX3Byb3RlY3RlZDoJcHJpbnRmICgiKHByb3RlY3RlZCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19BQ0NFU1NfcHJpdmF0ZToJCXByaW50ZiAoIihwcml2YXRlKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biBhY2Nlc3NpYmlsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfdmlzaWJpbGl0eToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX1ZJU19sb2NhbDoJcHJpbnRmICgiKGxvY2FsKSIpOyBicmVhazsKLQljYXNlIERXX1ZJU19leHBvcnRlZDoJcHJpbnRmICgiKGV4cG9ydGVkKSIpOyBicmVhazsKLQljYXNlIERXX1ZJU19xdWFsaWZpZWQ6CXByaW50ZiAoIihxdWFsaWZpZWQpIik7IGJyZWFrOwotCWRlZmF1bHQ6CQlwcmludGYgKCIodW5rbm93biB2aXNpYmlsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfdmlydHVhbGl0eToKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX1ZJUlRVQUxJVFlfbm9uZToJcHJpbnRmICgiKG5vbmUpIik7IGJyZWFrOwotCWNhc2UgRFdfVklSVFVBTElUWV92aXJ0dWFsOglwcmludGYgKCIodmlydHVhbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19WSVJUVUFMSVRZX3B1cmVfdmlydHVhbDpwcmludGYgKCIocHVyZV92aXJ0dWFsKSIpOyBicmVhazsKLQlkZWZhdWx0OgkJICAgICAgICBwcmludGYgKCIodW5rbm93biB2aXJ0dWFsaXR5KSIpOyBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfaWRlbnRpZmllcl9jYXNlOgotICAgICAgc3dpdGNoICh1dmFsdWUpCi0JewotCWNhc2UgRFdfSURfY2FzZV9zZW5zaXRpdmU6CXByaW50ZiAoIihjYXNlX3NlbnNpdGl2ZSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19JRF91cF9jYXNlOgkJcHJpbnRmICgiKHVwX2Nhc2UpIik7IGJyZWFrOwotCWNhc2UgRFdfSURfZG93bl9jYXNlOgkJcHJpbnRmICgiKGRvd25fY2FzZSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19JRF9jYXNlX2luc2Vuc2l0aXZlOglwcmludGYgKCIoY2FzZV9pbnNlbnNpdGl2ZSkiKTsgYnJlYWs7Ci0JZGVmYXVsdDoJCSAgICAgICAgcHJpbnRmICgiKHVua25vd24gY2FzZSkiKTsgYnJlYWs7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERXX0FUX2NhbGxpbmdfY29udmVudGlvbjoKLSAgICAgIHN3aXRjaCAodXZhbHVlKQotCXsKLQljYXNlIERXX0NDX25vcm1hbDoJcHJpbnRmICgiKG5vcm1hbCkiKTsgYnJlYWs7Ci0JY2FzZSBEV19DQ19wcm9ncmFtOglwcmludGYgKCIocHJvZ3JhbSkiKTsgYnJlYWs7Ci0JY2FzZSBEV19DQ19ub2NhbGw6CXByaW50ZiAoIihub2NhbGwpIik7IGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpZiAodXZhbHVlID49IERXX0NDX2xvX3VzZXIKLQkgICAgICAmJiB1dmFsdWUgPD0gRFdfQ0NfaGlfdXNlcikKLQkgICAgcHJpbnRmICgiKHVzZXIgZGVmaW5lZCkiKTsKLQkgIGVsc2UKLQkgICAgcHJpbnRmICgiKHVua25vd24gY29udmVudGlvbikiKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRFdfQVRfbG9jYXRpb246Ci0gICAgY2FzZSBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbjoKLSAgICBjYXNlIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uOgotICAgICAgcHJpbnRmICgiKCIpOwotICAgICAgZGVjb2RlX2xvY2F0aW9uX2V4cHJlc3Npb24gKGJsb2NrX3N0YXJ0LCBwb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmICgiKSIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHByaW50ZiAoIlxuIik7Ci0gIHJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX2luZm8gKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLSAgdW5zaWduZWQgY2hhciAqIHNlY3Rpb25fYmVnaW4gPSBzdGFydDsKLQotICBwcmludGYgKF8oIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIERXQVJGMl9FeHRlcm5hbF9Db21wVW5pdCAqIGV4dGVybmFsOwotICAgICAgRFdBUkYyX0ludGVybmFsX0NvbXBVbml0ICAgY29tcHVuaXQ7Ci0gICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgICB0YWdzOwotICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgaTsKLSAgICAgIGludAkJCSBsZXZlbDsKLQotICAgICAgZXh0ZXJuYWwgPSAoRFdBUkYyX0V4dGVybmFsX0NvbXBVbml0ICopIHN0YXJ0OwotCi0gICAgICBjb21wdW5pdC5jdV9sZW5ndGggICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9sZW5ndGgpOwotICAgICAgY29tcHVuaXQuY3VfdmVyc2lvbiAgICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+Y3VfdmVyc2lvbik7Ci0gICAgICBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0ID0gQllURV9HRVQgKGV4dGVybmFsLT5jdV9hYmJyZXZfb2Zmc2V0KTsKLSAgICAgIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSAgPSBCWVRFX0dFVCAoZXh0ZXJuYWwtPmN1X3BvaW50ZXJfc2l6ZSk7Ci0KLSAgICAgIHRhZ3MgPSBzdGFydCArIHNpemVvZiAoKiBleHRlcm5hbCk7Ci0gICAgICBzdGFydCArPSBjb21wdW5pdC5jdV9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5jdV9sZW5ndGgpOwotCi0gICAgICBpZiAoY29tcHVuaXQuY3VfdmVyc2lvbiAhPSAyKQotCXsKLQkgIHdhcm4gKF8oIk9ubHkgdmVyc2lvbiAyIERXQVJGIGRlYnVnIGluZm9ybWF0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4iKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIHByaW50ZiAoXygiICBDb21waWxhdGlvbiBVbml0OlxuIikpOwotICAgICAgcHJpbnRmIChfKCIgICBMZW5ndGg6ICAgICAgICAlbGRcbiIpLCBjb21wdW5pdC5jdV9sZW5ndGgpOwotICAgICAgcHJpbnRmIChfKCIgICBWZXJzaW9uOiAgICAgICAlZFxuIiksIGNvbXB1bml0LmN1X3ZlcnNpb24pOwotICAgICAgcHJpbnRmIChfKCIgICBBYmJyZXYgT2Zmc2V0OiAlbGRcbiIpLCBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0KTsKLSAgICAgIHByaW50ZiAoXygiICAgUG9pbnRlciBTaXplOiAgJWRcbiIpLCBjb21wdW5pdC5jdV9wb2ludGVyX3NpemUpOwotCi0gICAgICBpZiAoZmlyc3RfYWJicmV2ICE9IE5VTEwpCi0JZnJlZV9hYmJyZXZzICgpOwotCi0gICAgICAvKiBSZWFkIGluIHRoZSBhYmJyZXZzIHVzZWQgYnkgdGhpcyBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotICAgICAgewotCUVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWM7Ci0JdW5zaWduZWQgY2hhciAqICAgICAgIGJlZ2luOwotCi0JLyogTG9jYXRlIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24gYW5kIHByb2Nlc3MgaXQuICAqLwotCWZvciAoaSA9IDAsIHNlYyA9IHNlY3Rpb25faGVhZGVyczsKLQkgICAgIGkgPCBlbGZfaGVhZGVyLmVfc2hudW07Ci0JICAgICBpICsrLCBzZWMgKyspCi0JICBpZiAoc3RyY21wIChTRUNUSU9OX05BTUUgKHNlYyksICIuZGVidWdfYWJicmV2IikgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQlpZiAoaSA9PSAtMSB8fCBzZWMtPnNoX3NpemUgPT0gMCkKLQkgIHsKLQkgICAgd2FybiAoXygiVW5hYmxlIHRvIGxvY2F0ZSAuZGVidWdfYWJicmV2IHNlY3Rpb24hXG4iKSk7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCi0JR0VUX0RBVEFfQUxMT0MgKHNlYy0+c2hfb2Zmc2V0LCBzZWMtPnNoX3NpemUsIGJlZ2luLCB1bnNpZ25lZCBjaGFyICosCi0JCQkiZGVidWdfYWJicmV2IHNlY3Rpb24gZGF0YSIpOwotCi0JcHJvY2Vzc19hYmJyZXZfc2VjdGlvbiAoYmVnaW4gKyBjb21wdW5pdC5jdV9hYmJyZXZfb2Zmc2V0LAotCQkJCWJlZ2luICsgc2VjLT5zaF9zaXplKTsKLQotCWZyZWUgKGJlZ2luKTsKLSAgICAgIH0KLQotICAgICAgbGV2ZWwgPSAwOwotICAgICAgd2hpbGUgKHRhZ3MgPCBzdGFydCkKLQl7Ci0JICBpbnQgICAgICAgICAgICBieXRlc19yZWFkOwotCSAgaW50ICAgICAgICAgICAgYWJicmV2X251bWJlcjsKLQkgIGFiYnJldl9lbnRyeSAqIGVudHJ5OwotCSAgYWJicmV2X2F0dHIgICogYXR0cjsKLQotCSAgYWJicmV2X251bWJlciA9IHJlYWRfbGViMTI4ICh0YWdzLCAmIGJ5dGVzX3JlYWQsIDApOwotCSAgdGFncyArPSBieXRlc19yZWFkOwotCi0JICAvKiBBIG51bGwgRElFIG1hcmtzIHRoZSBlbmQgb2YgYSBsaXN0IG9mIGNoaWxkcmVuLiAgKi8KLQkgIGlmIChhYmJyZXZfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICAtLWxldmVsOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFNjYW4gdGhyb3VnaCB0aGUgYWJicmV2aWF0aW9uIGxpc3QgdW50aWwgd2UgcmVhY2ggdGhlCi0JICAgICBjb3JyZWN0IGVudHJ5LiAgKi8KLQkgIGZvciAoZW50cnkgPSBmaXJzdF9hYmJyZXY7Ci0JICAgICAgIGVudHJ5ICYmIGVudHJ5LT5lbnRyeSAhPSBhYmJyZXZfbnVtYmVyOwotCSAgICAgICBlbnRyeSA9IGVudHJ5LT5uZXh0KQotCSAgICBjb250aW51ZTsKLQotCSAgaWYgKGVudHJ5ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICB3YXJuIChfKCJVbmFibGUgdG8gbG9jYXRlIGVudHJ5ICVkIGluIHRoZSBhYmJyZXZpYXRpb24gdGFibGVcbiIpLAotCQkgICAgYWJicmV2X251bWJlcik7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQotCSAgcHJpbnRmIChfKCIgPCVkPjwleD46IEFiYnJldiBOdW1iZXI6ICVkICglcylcbiIpLAotCQkgIGxldmVsLCB0YWdzIC0gc2VjdGlvbl9iZWdpbiAtIGJ5dGVzX3JlYWQsCi0JCSAgYWJicmV2X251bWJlciwKLQkJICBnZXRfVEFHX25hbWUgKGVudHJ5LT50YWcpKTsKLQotCSAgZm9yIChhdHRyID0gZW50cnktPmZpcnN0X2F0dHI7IGF0dHI7IGF0dHIgPSBhdHRyLT5uZXh0KQotCSAgICB0YWdzID0gcmVhZF9hbmRfZGlzcGxheV9hdHRyIChhdHRyLT5hdHRyaWJ1dGUsCi0JCQkJCSAgYXR0ci0+Zm9ybSwKLQkJCQkJICB0YWdzLAotCQkJCQkgIGNvbXB1bml0LmN1X3BvaW50ZXJfc2l6ZSk7Ci0KLQkgIGlmIChlbnRyeS0+Y2hpbGRyZW4pCi0JICAgICsrbGV2ZWw7Ci0JfQotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1kaXNwbGF5X2RlYnVnX2FyYW5nZXMgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgdW5zaWduZWQgY2hhciAqICAgICAgIHN0YXJ0OwotICAgICBGSUxFICogICAgICAgICAgICAgICAgZmlsZTsKLXsKLSAgdW5zaWduZWQgY2hhciAqIGVuZCA9IHN0YXJ0ICsgc2VjdGlvbi0+c2hfc2l6ZTsKLQotICBwcmludGYgKF8oIlRoZSBzZWN0aW9uICVzIGNvbnRhaW5zOlxuXG4iKSwgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kKQotICAgIHsKLSAgICAgIERXQVJGMl9FeHRlcm5hbF9BUmFuZ2UgKiBleHRlcm5hbDsKLSAgICAgIERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UgICBhcmFuZ2U7Ci0gICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgICAgcmFuZ2VzOwotICAgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICBhZGRyZXNzOwotCi0gICAgICBleHRlcm5hbCA9IChEV0FSRjJfRXh0ZXJuYWxfQVJhbmdlICopIHN0YXJ0OwotCi0gICAgICBhcmFuZ2UuYXJfbGVuZ3RoICAgICAgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9sZW5ndGgpOwotICAgICAgYXJhbmdlLmFyX3ZlcnNpb24gICAgICA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfdmVyc2lvbik7Ci0gICAgICBhcmFuZ2UuYXJfaW5mb19vZmZzZXQgID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9pbmZvX29mZnNldCk7Ci0gICAgICBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplID0gQllURV9HRVQgKGV4dGVybmFsLT5hcl9wb2ludGVyX3NpemUpOwotICAgICAgYXJhbmdlLmFyX3NlZ21lbnRfc2l6ZSA9IEJZVEVfR0VUIChleHRlcm5hbC0+YXJfc2VnbWVudF9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCIgIExlbmd0aDogICAgICAgICAgICAgICAgICAgJWxkXG4iKSwgYXJhbmdlLmFyX2xlbmd0aCk7Ci0gICAgICBwcmludGYgKF8oIiAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiICBPZmZzZXQgaW50byAuZGVidWdfaW5mbzogICVseFxuIiksIGFyYW5nZS5hcl9pbmZvX29mZnNldCk7Ci0gICAgICBwcmludGYgKF8oIiAgUG9pbnRlciBTaXplOiAgICAgICAgICAgICAlZFxuIiksIGFyYW5nZS5hcl9wb2ludGVyX3NpemUpOwotICAgICAgcHJpbnRmIChfKCIgIFNlZ21lbnQgU2l6ZTogICAgICAgICAgICAgJWRcbiIpLCBhcmFuZ2UuYXJfc2VnbWVudF9zaXplKTsKLQotICAgICAgcHJpbnRmIChfKCJcbiAgICBBZGRyZXNzICBMZW5ndGhcbiIpKTsKLQotICAgICAgcmFuZ2VzID0gc3RhcnQgKyBzaXplb2YgKCogZXh0ZXJuYWwpOwotCi0gICAgICBmb3IgKDs7KQotCXsKLQkgIGFkZHJlc3MgPSBieXRlX2dldCAocmFuZ2VzLCBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplKTsKLQotCSAgaWYgKGFkZHJlc3MgPT0gMCkKLQkgICAgYnJlYWs7Ci0KLQkgIHJhbmdlcyArPSBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplOwotCi0JICBsZW5ndGggID0gYnl0ZV9nZXQgKHJhbmdlcywgYXJhbmdlLmFyX3BvaW50ZXJfc2l6ZSk7Ci0KLQkgIHJhbmdlcyArPSBhcmFuZ2UuYXJfcG9pbnRlcl9zaXplOwotCi0JICBwcmludGYgKCIgICAgJTguOGx4ICVsdVxuIiwgYWRkcmVzcywgbGVuZ3RoKTsKLQl9Ci0KLSAgICAgIHN0YXJ0ICs9IGFyYW5nZS5hcl9sZW5ndGggKyBzaXplb2YgKGV4dGVybmFsLT5hcl9sZW5ndGgpOwotICAgIH0KLQotICBwcmludGYgKCJcbiIpOwotCi0gIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLWRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCAoc2VjdGlvbiwgc3RhcnQsIGZpbGUpCi0gICAgIEVsZjMyX0ludGVybmFsX1NoZHIgKiBzZWN0aW9uOwotICAgICB1bnNpZ25lZCBjaGFyICogICAgICAgc3RhcnQ7Ci0gICAgIEZJTEUgKiAgICAgICAgICAgICAgICBmaWxlOwotewotICBwcmludGYgKF8oIkRpc3BsYXlpbmcgdGhlIGRlYnVnIGNvbnRlbnRzIG9mIHNlY3Rpb24gJXMgaXMgbm90IHlldCBzdXBwb3J0ZWQuXG4iKSwKLQkgICAgU0VDVElPTl9OQU1FIChzZWN0aW9uKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSAgLyogQSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmFtZSBvZiBhIGRlYnVnIHNlY3Rpb24gYW5kIGEgcG9pbnRlcgotICAgICB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGRlY29kZSBpdC4gICovCi1zdHJ1Y3QKLXsKLSAgY2hhciAqIG5hbWU7Ci0gIGludCAoKiBkaXNwbGF5KSBQQVJBTVMoKEVsZjMyX0ludGVybmFsX1NoZHIgKiwgdW5zaWduZWQgY2hhciAqLCBGSUxFICopKTsKLX0KLWRlYnVnX2Rpc3BsYXlzW10gPQotewotICB7ICIuZGVidWdfaW5mbyIsICAgICAgICBkaXNwbGF5X2RlYnVnX2luZm8gfSwKLSAgeyAiLmRlYnVnX2FiYnJldiIsICAgICAgZGlzcGxheV9kZWJ1Z19hYmJyZXYgfSwKLSAgeyAiLmRlYnVnX2xpbmUiLCAgICAgICAgZGlzcGxheV9kZWJ1Z19saW5lcyB9LAotICB7ICIuZGVidWdfYXJhbmdlcyIsICAgICBkaXNwbGF5X2RlYnVnX2FyYW5nZXMgfSwKLSAgeyAiLmRlYnVnX3B1Ym5hbWVzIiwgICAgZGlzcGxheV9kZWJ1Z19wdWJuYW1lcyB9LAotICB7ICIuZGVidWdfbWFjaW5mbyIsICAgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfSwKLSAgeyAiLmRlYnVnX2ZyYW1lIiwgICAgICAgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0sCi0gIHsgIi5kZWJ1Z19zdHIiLCAgICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCB9LAotICB7ICIuZGVidWdfc3RhdGljX2Z1bmMiLCBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfSwKLSAgeyAiLmRlYnVnX3N0YXRpY192YXJzIiwgZGlzcGxheV9kZWJ1Z19ub3Rfc3VwcG9ydGVkIH0sCi0gIHsgIi5kZWJ1Z190eXBlcyIsICAgICAgIGRpc3BsYXlfZGVidWdfbm90X3N1cHBvcnRlZCB9LAotICB7ICIuZGVidWdfd2Vha25hbWVzIiwgICBkaXNwbGF5X2RlYnVnX25vdF9zdXBwb3J0ZWQgfQotfTsKLQotc3RhdGljIGludAotZGlzcGxheV9kZWJ1Z19zZWN0aW9uIChzZWN0aW9uLCBmaWxlKQotICAgICBFbGYzMl9JbnRlcm5hbF9TaGRyICogc2VjdGlvbjsKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGNoYXIgKiAgICAgICAgICBuYW1lID0gU0VDVElPTl9OQU1FIChzZWN0aW9uKTsKLSAgYmZkX3NpemVfdHlwZSAgIGxlbmd0aDsKLSAgdW5zaWduZWQgY2hhciAqIHN0YXJ0OwotICBpbnQgICAgICAgICAgICAgaTsKLQotICBsZW5ndGggPSBzZWN0aW9uLT5zaF9zaXplOwotICBpZiAobGVuZ3RoID09IDApCi0gICAgewotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJyVzJyBoYXMgbm8gZGVidWdnaW5nIGRhdGEuXG4iKSwgbmFtZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgR0VUX0RBVEFfQUxMT0MgKHNlY3Rpb24tPnNoX29mZnNldCwgbGVuZ3RoLCBzdGFydCwgdW5zaWduZWQgY2hhciAqLAotCQkgICJkZWJ1ZyBzZWN0aW9uIGRhdGEiKTsKLQotICAvKiBTZWUgaWYgd2Uga25vdyBob3cgdG8gZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhpcyBzZWN0aW9uLiAgKi8KLSAgZm9yIChpID0gTlVNX0VMRU0gKGRlYnVnX2Rpc3BsYXlzKTsgaS0tOykKLSAgICBpZiAoc3RyY21wIChkZWJ1Z19kaXNwbGF5c1tpXS5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgewotCWRlYnVnX2Rpc3BsYXlzW2ldLmRpc3BsYXkgKHNlY3Rpb24sIHN0YXJ0LCBmaWxlKTsKLQlicmVhazsKLSAgICAgIH0KLQotICBpZiAoaSA9PSAtMSkKLSAgICBwcmludGYgKF8oIlVucmVjb2duaXNlZCBkZWJ1ZyBzZWN0aW9uOiAlc1xuIiksIG5hbWUpOwotCi0gIGZyZWUgKHN0YXJ0KTsKLQotICAvKiBJZiB3ZSBsb2FkZWQgaW4gdGhlIGFiYnJldiBzZWN0aW9uIGF0IHNvbWUgcG9pbnQsCi0gICAgIHdlIG11c3QgcmVsZWFzZSBpdCBoZXJlLiAgKi8KLSAgaWYgKGZpcnN0X2FiYnJldiAhPSBOVUxMKQotICAgIGZyZWVfYWJicmV2cyAoKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludAotcHJvY2Vzc19zZWN0aW9uX2NvbnRlbnRzIChmaWxlKQotICAgICBGSUxFICogZmlsZTsKLXsKLSAgRWxmMzJfSW50ZXJuYWxfU2hkciAqICAgIHNlY3Rpb247Ci0gIHVuc2lnbmVkIGludCAgaTsKLQotICBpZiAoISBkb19kdW1wKQotICAgIHJldHVybiAxOwotCi0gIGZvciAoaSA9IDAsIHNlY3Rpb24gPSBzZWN0aW9uX2hlYWRlcnM7Ci0gICAgICAgaSA8IGVsZl9oZWFkZXIuZV9zaG51bQotICAgICAgICYmIGkgPCBudW1fZHVtcF9zZWN0czsKLSAgICAgICBpICsrLCBzZWN0aW9uICsrKQotICAgIHsKLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0gICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIERJU0FTU19EVU1QKQotCWRpc2Fzc2VtYmxlX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOwotI2VuZGlmCi0gICAgICBpZiAoZHVtcF9zZWN0c1tpXSAmIEhFWF9EVU1QKQotCWR1bXBfc2VjdGlvbiAoc2VjdGlvbiwgZmlsZSk7Ci0KLSAgICAgIGlmIChkdW1wX3NlY3RzW2ldICYgREVCVUdfRFVNUCkKLQlkaXNwbGF5X2RlYnVnX3NlY3Rpb24gKHNlY3Rpb24sIGZpbGUpOwotICAgIH0KLQotICBpZiAoaSA8IG51bV9kdW1wX3NlY3RzKQotICAgIHdhcm4gKF8oIlNvbWUgc2VjdGlvbnMgd2VyZSBub3QgZHVtcGVkIGJlY2F1c2UgdGhleSBkbyBub3QgZXhpc3QhXG4iKSk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAobWFzaykKLSAgICAgaW50IG1hc2s7Ci17Ci0gIGlmIChtYXNrKQotICAgIHsKLSAgICAgIGludCBmaXJzdCA9IDE7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfSU5FWCkKLQlmcHV0cyAoIklORVgiLCBzdGRvdXQpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfVUZMTykKLQlwcmludGYgKCIlc1VGTE8iLCBmaXJzdCA/ICIiIDogInwiKSwgZmlyc3QgPSAwOwotICAgICAgaWYgKG1hc2sgJiBPRVhfRlBVX09GTE8pCi0JcHJpbnRmICgiJXNPRkxPIiwgZmlyc3QgPyAiIiA6ICJ8IiksIGZpcnN0ID0gMDsKLSAgICAgIGlmIChtYXNrICYgT0VYX0ZQVV9ESVYwKQotCXByaW50ZiAoIiVzRElWMCIsIGZpcnN0ID8gIiIgOiAifCIpLCBmaXJzdCA9IDA7Ci0gICAgICBpZiAobWFzayAmIE9FWF9GUFVfSU5WQUwpCi0JcHJpbnRmICgiJXNJTlZBTCIsIGZpcnN0ID8gIiIgOiAifCIpOwotICAgIH0KLSAgZWxzZQotICAgIGZwdXRzICgiMCIsIHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXByb2Nlc3NfbWlwc19zcGVjaWZpYyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIEVsZl9JbnRlcm5hbF9EeW4gKiBlbnRyeTsKLSAgc2l6ZV90IGxpYmxpc3Rfb2Zmc2V0ID0gMDsKLSAgc2l6ZV90IGxpYmxpc3RubyA9IDA7Ci0gIHNpemVfdCBjb25mbGljdHNubyA9IDA7Ci0gIHNpemVfdCBvcHRpb25zX29mZnNldCA9IDA7Ci0gIHNpemVfdCBjb25mbGljdHNfb2Zmc2V0ID0gMDsKLQotICAvKiBXZSBoYXZlIGEgbG90IG9mIHNwZWNpYWwgc2VjdGlvbnMuICBUaGFua3MgU0dJISAgKi8KLSAgaWYgKGR5bmFtaWNfc2VnbWVudCA9PSBOVUxMKQotICAgIC8qIE5vIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gICovCi0gICAgcmV0dXJuIDA7Ci0KLSAgZm9yIChlbnRyeSA9IGR5bmFtaWNfc2VnbWVudDsgZW50cnktPmRfdGFnICE9IERUX05VTEw7ICsrZW50cnkpCi0gICAgc3dpdGNoIChlbnRyeS0+ZF90YWcpCi0gICAgICB7Ci0gICAgICBjYXNlIERUX01JUFNfTElCTElTVDoKLQlsaWJsaXN0X29mZnNldCA9IGVudHJ5LT5kX3VuLmRfdmFsIC0gbG9hZGFkZHI7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIERUX01JUFNfTElCTElTVE5POgotCWxpYmxpc3RubyA9IGVudHJ5LT5kX3VuLmRfdmFsOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX09QVElPTlM6Ci0Jb3B0aW9uc19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUOgotCWNvbmZsaWN0c19vZmZzZXQgPSBlbnRyeS0+ZF91bi5kX3ZhbCAtIGxvYWRhZGRyOwotCWJyZWFrOwotICAgICAgY2FzZSBEVF9NSVBTX0NPTkZMSUNUTk86Ci0JY29uZmxpY3Rzbm8gPSBlbnRyeS0+ZF91bi5kX3ZhbDsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgaWYgKGxpYmxpc3Rfb2Zmc2V0ICE9IDAgJiYgbGlibGlzdG5vICE9IDAgJiYgZG9fZHluYW1pYykKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9MaWIgKiBlbGliOwotICAgICAgc2l6ZV90IGNudDsKLQotICAgICAgR0VUX0RBVEFfQUxMT0MgKGxpYmxpc3Rfb2Zmc2V0LCBsaWJsaXN0bm8gKiBzaXplb2YgKEVsZjMyX0V4dGVybmFsX0xpYiksCi0JCSAgICAgIGVsaWIsIEVsZjMyX0V4dGVybmFsX0xpYiAqLCAibGlibGlzdCIpOwotCi0gICAgICBwcmludGYgKCJcblNlY3Rpb24gJy5saWJsaXN0JyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiwgbGlibGlzdG5vKTsKLSAgICAgIGZwdXRzICgiICAgICBMaWJyYXJ5ICAgICAgICAgICAgICBUaW1lIFN0YW1wICAgICAgICAgIENoZWNrc3VtICAgVmVyc2lvbiBGbGFnc1xuIiwKLQkgICAgIHN0ZG91dCk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgbGlibGlzdG5vOyArK2NudCkKLQl7Ci0JICBFbGYzMl9MaWIgbGlibGlzdDsKLQkgIHRpbWVfdCB0aW1lOwotCSAgY2hhciB0aW1lYnVmWzIwXTsKLQotCSAgbGlibGlzdC5sX25hbWUgPSBCWVRFX0dFVCAoZWxpYltjbnRdLmxfbmFtZSk7Ci0JICB0aW1lID0gQllURV9HRVQgKGVsaWJbY250XS5sX3RpbWVfc3RhbXApOwotCSAgbGlibGlzdC5sX2NoZWNrc3VtID0gQllURV9HRVQgKGVsaWJbY250XS5sX2NoZWNrc3VtKTsKLQkgIGxpYmxpc3QubF92ZXJzaW9uID0gQllURV9HRVQgKGVsaWJbY250XS5sX3ZlcnNpb24pOwotCSAgbGlibGlzdC5sX2ZsYWdzID0gQllURV9HRVQgKGVsaWJbY250XS5sX2ZsYWdzKTsKLQotCSAgc3RyZnRpbWUgKHRpbWVidWYsIDIwLCAiJVktJW0tJWRUJUg6JU06JVMiLCBnbXRpbWUgKCZ0aW1lKSk7Ci0KLQkgIHByaW50ZiAoIiUzZDogJS0yMHMgJXMgJSMxMGx4ICUtN2xkIiwgY250LAotCQkgIGR5bmFtaWNfc3RyaW5ncyArIGxpYmxpc3QubF9uYW1lLCB0aW1lYnVmLAotCQkgIGxpYmxpc3QubF9jaGVja3N1bSwgbGlibGlzdC5sX3ZlcnNpb24pOwotCi0JICBpZiAobGlibGlzdC5sX2ZsYWdzID09IDApCi0JICAgIHB1dHMgKCIgTk9ORSIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdAotCSAgICAgIHsKLQkJY29uc3QgY2hhciAqbmFtZTsKLQkJaW50IGJpdDsKLQkgICAgICB9IGxfZmxhZ3NfdmFsc1tdID0KLQkJewotCQkgIHsgIiBFWEFDVF9NQVRDSCIsIExMX0VYQUNUX01BVENIIH0sCi0JCSAgeyAiIElHTk9SRV9JTlRfVkVSIiwgTExfSUdOT1JFX0lOVF9WRVIgfSwKLQkJICB7ICIgUkVRVUlSRV9NSU5PUiIsIExMX1JFUVVJUkVfTUlOT1IgfSwKLQkJICB7ICIgRVhQT1JUUyIsIExMX0VYUE9SVFMgfSwKLQkJICB7ICIgREVMQVlfTE9BRCIsIExMX0RFTEFZX0xPQUQgfSwKLQkJICB7ICIgREVMVEEiLCBMTF9ERUxUQSB9Ci0JCX07Ci0JICAgICAgaW50IGZsYWdzID0gbGlibGlzdC5sX2ZsYWdzOwotCSAgICAgIGludCBmY250OwotCi0JICAgICAgZm9yIChmY250ID0gMDsKLQkJICAgZmNudCA8IHNpemVvZiAobF9mbGFnc192YWxzKSAvIHNpemVvZiAobF9mbGFnc192YWxzWzBdKTsKLQkJICAgKytmY250KQotCQlpZiAoKGZsYWdzICYgbF9mbGFnc192YWxzW2ZjbnRdLmJpdCkgIT0gMCkKLQkJICB7Ci0JCSAgICBmcHV0cyAobF9mbGFnc192YWxzW2ZjbnRdLm5hbWUsIHN0ZG91dCk7Ci0JCSAgICBmbGFncyBePSBsX2ZsYWdzX3ZhbHNbZmNudF0uYml0OwotCQkgIH0KLQkgICAgICBpZiAoZmxhZ3MgIT0gMCkKLQkJcHJpbnRmICgiICUjeCIsICh1bnNpZ25lZCBpbnQpIGZsYWdzKTsKLQotCSAgICAgIHB1dHMgKCIiKTsKLQkgICAgfQotCX0KLQotICAgICAgZnJlZSAoZWxpYik7Ci0gICAgfQotCi0gIGlmIChvcHRpb25zX29mZnNldCAhPSAwKQotICAgIHsKLSAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICogZW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9TaGRyICogc2VjdCA9IHNlY3Rpb25faGVhZGVyczsKLSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICogaW9wdDsKLSAgICAgIEVsZl9JbnRlcm5hbF9PcHRpb25zICogb3B0aW9uOwotICAgICAgc2l6ZV90IG9mZnNldDsKLSAgICAgIGludCBjbnQ7Ci0KLSAgICAgIC8qIEZpbmQgdGhlIHNlY3Rpb24gaGVhZGVyIHNvIHRoYXQgd2UgZ2V0IHRoZSBzaXplLiAgKi8KLSAgICAgIHdoaWxlIChzZWN0LT5zaF90eXBlICE9IFNIVF9NSVBTX09QVElPTlMpCi0JKytzZWN0OwotCi0gICAgICBHRVRfREFUQV9BTExPQyAob3B0aW9uc19vZmZzZXQsIHNlY3QtPnNoX3NpemUsIGVvcHQsCi0JCSAgICAgIEVsZl9FeHRlcm5hbF9PcHRpb25zICosICJvcHRpb25zIik7Ci0KLSAgICAgIGlvcHQgPSAoRWxmX0ludGVybmFsX09wdGlvbnMgKikgbWFsbG9jICgoc2VjdC0+c2hfc2l6ZSAvIHNpemVvZiAoZW9wdCkpCi0JCQkJCSAgICAgICogc2l6ZW9mICgqaW9wdCkpOwotICAgICAgaWYgKGlvcHQgPT0gTlVMTCkKLQl7Ci0JICBlcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgb2Zmc2V0ID0gY250ID0gMDsKLSAgICAgIG9wdGlvbiA9IGlvcHQ7Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgc2VjdC0+c2hfc2l6ZSkKLQl7Ci0JICBFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqIGVvcHRpb247Ci0KLQkgIGVvcHRpb24gPSAoRWxmX0V4dGVybmFsX09wdGlvbnMgKikgKChjaGFyICopIGVvcHQgKyBvZmZzZXQpOwotCi0JICBvcHRpb24tPmtpbmQgPSBCWVRFX0dFVCAoZW9wdGlvbi0+a2luZCk7Ci0JICBvcHRpb24tPnNpemUgPSBCWVRFX0dFVCAoZW9wdGlvbi0+c2l6ZSk7Ci0JICBvcHRpb24tPnNlY3Rpb24gPSBCWVRFX0dFVCAoZW9wdGlvbi0+c2VjdGlvbik7Ci0JICBvcHRpb24tPmluZm8gPSBCWVRFX0dFVCAoZW9wdGlvbi0+aW5mbyk7Ci0KLQkgIG9mZnNldCArPSBvcHRpb24tPnNpemU7Ci0JICArK29wdGlvbjsKLQkgICsrY250OwotCX0KLQotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJyVzJyBjb250YWlucyAlZCBlbnRyaWVzOlxuIiksCi0JICAgICAgc3RyaW5nX3RhYmxlICsgc2VjdC0+c2hfbmFtZSwgY250KTsKLQotICAgICAgb3B0aW9uID0gaW9wdDsKLSAgICAgIHdoaWxlIChjbnQtLSA+IDApCi0JewotCSAgc2l6ZV90IGxlbjsKLQotCSAgc3dpdGNoIChvcHRpb24tPmtpbmQpCi0JICAgIHsKLQkgICAgY2FzZSBPREtfTlVMTDoKLQkgICAgICAvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4uICAqLwotCSAgICAgIHByaW50ZiAoIiBOVUxMICAgICAgICVkICVseCIsIG9wdGlvbi0+c2VjdGlvbiwgb3B0aW9uLT5pbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfUkVHSU5GTzoKLQkgICAgICBwcmludGYgKCIgUkVHSU5GTyAgICAiKTsKLQkgICAgICBpZiAoZWxmX2hlYWRlci5lX21hY2hpbmUgPT0gRU1fTUlQUykKLQkJewotCQkgIC8qIDMyYml0IGZvcm0uICAqLwotCQkgIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKmVyZWc7Ci0JCSAgRWxmMzJfUmVnSW5mbyByZWdpbmZvOwotCi0JCSAgZXJlZyA9IChFbGYzMl9FeHRlcm5hbF9SZWdJbmZvICopIChvcHRpb24gKyAxKTsKLQkJICByZWdpbmZvLnJpX2dwcm1hc2sgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BybWFzayk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMF0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1sxXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzFdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMl0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1syXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzNdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbM10pOwotCQkgIHJlZ2luZm8ucmlfZ3BfdmFsdWUgPSBCWVRFX0dFVCAoZXJlZy0+cmlfZ3BfdmFsdWUpOwotCi0JCSAgcHJpbnRmICgiR1BSICUwOGx4ICBHUCAweCVseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9ncHJtYXNrLAotCQkJICAodW5zaWduZWQgbG9uZykgcmVnaW5mby5yaV9ncF92YWx1ZSk7Ci0JCSAgcHJpbnRmICgiICAgICAgICAgICAgQ1BSMCAlMDhseCAgQ1BSMSAlMDhseCAgQ1BSMiAlMDhseCAgQ1BSMyAlMDhseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdLCByZWdpbmZvLnJpX2Nwcm1hc2tbMV0sCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSwgcmVnaW5mby5yaV9jcHJtYXNrWzNdKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIDY0IGJpdCBmb3JtLiAgKi8KLQkJICBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICogZXJlZzsKLQkJICBFbGY2NF9JbnRlcm5hbF9SZWdJbmZvIHJlZ2luZm87Ci0KLQkJICBlcmVnID0gKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8gKikgKG9wdGlvbiArIDEpOwotCQkgIHJlZ2luZm8ucmlfZ3BybWFzayAgICA9IEJZVEVfR0VUIChlcmVnLT5yaV9ncHJtYXNrKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbMF0gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1swXSk7Ci0JCSAgcmVnaW5mby5yaV9jcHJtYXNrWzFdID0gQllURV9HRVQgKGVyZWctPnJpX2Nwcm1hc2tbMV0pOwotCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSA9IEJZVEVfR0VUIChlcmVnLT5yaV9jcHJtYXNrWzJdKTsKLQkJICByZWdpbmZvLnJpX2Nwcm1hc2tbM10gPSBCWVRFX0dFVCAoZXJlZy0+cmlfY3BybWFza1szXSk7Ci0JCSAgcmVnaW5mby5yaV9ncF92YWx1ZSAgID0gQllURV9HRVQ4IChlcmVnLT5yaV9ncF92YWx1ZSk7Ci0KLQkJICBwcmludGYgKCJHUFIgJTA4bHggIEdQIDB4IiwKLQkJCSAgcmVnaW5mby5yaV9ncHJtYXNrKTsKLQkJICBwcmludGZfdm1hIChyZWdpbmZvLnJpX2dwX3ZhbHVlKTsKLQkJICBwcmludGYgKCJcbiIpOwotCi0JCSAgcHJpbnRmICgiICAgICAgICAgICAgQ1BSMCAlMDhseCAgQ1BSMSAlMDhseCAgQ1BSMiAlMDhseCAgQ1BSMyAlMDhseFxuIiwKLQkJCSAgcmVnaW5mby5yaV9jcHJtYXNrWzBdLCByZWdpbmZvLnJpX2Nwcm1hc2tbMV0sCi0JCQkgIHJlZ2luZm8ucmlfY3BybWFza1syXSwgcmVnaW5mby5yaV9jcHJtYXNrWzNdKTsKLQkJfQotCSAgICAgICsrb3B0aW9uOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICBjYXNlIE9ES19FWENFUFRJT05TOgotCSAgICAgIGZwdXRzICgiIEVYQ0VQVElPTlMgZnBlX21pbigiLCBzdGRvdXQpOwotCSAgICAgIHByb2Nlc3NfbWlwc19mcGVfZXhjZXB0aW9uIChvcHRpb24tPmluZm8gJiBPRVhfRlBVX01JTik7Ci0JICAgICAgZnB1dHMgKCIpIGZwZV9tYXgoIiwgc3Rkb3V0KTsKLQkgICAgICBwcm9jZXNzX21pcHNfZnBlX2V4Y2VwdGlvbiAoKG9wdGlvbi0+aW5mbyAmIE9FWF9GUFVfTUFYKSA+PiA4KTsKLQkgICAgICBmcHV0cyAoIikiLCBzdGRvdXQpOwotCi0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9FWF9QQUdFMCkKLQkJZnB1dHMgKCIgUEFHRTAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfU01NKQotCQlmcHV0cyAoIiBTTU0iLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfRlBEQlVHKQotCQlmcHV0cyAoIiBGUERCVUciLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPRVhfRElTTUlTUykKLQkJZnB1dHMgKCIgRElTTUlTUyIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX1BBRDoKLQkgICAgICBmcHV0cyAoIiBQQUQgICAgICAgIiwgc3Rkb3V0KTsKLQkgICAgICBpZiAob3B0aW9uLT5pbmZvICYgT1BBRF9QUkVGSVgpCi0JCWZwdXRzICgiIFBSRUZJWCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfUE9TVEZJWCkKLQkJZnB1dHMgKCIgUE9TVEZJWCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9QQURfU1lNQk9MKQotCQlmcHV0cyAoIiBTWU1CT0wiLCBzdGRvdXQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9ES19IV1BBVENIOgotCSAgICAgIGZwdXRzICgiIEhXUEFUQ0ggICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjRLRU9QKQotCQlmcHV0cyAoIiBSNEtFT1AiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjhLUEZFVENIKQotCQlmcHV0cyAoIiBSOEtQRkVUQ0giLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjVLRU9QKQotCQlmcHV0cyAoIiBSNUtFT1AiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdfUjVLQ1ZUTCkKLQkJZnB1dHMgKCIgUjVLQ1ZUTCIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0ZJTEw6Ci0JICAgICAgZnB1dHMgKCIgRklMTCAgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIC8qIFhYWCBQcmludCBjb250ZW50IG9mIGluZm8gd29yZD8gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX1RBR1M6Ci0JICAgICAgZnB1dHMgKCIgVEFHUyAgICAgICAiLCBzdGRvdXQpOwotCSAgICAgIC8qIFhYWCBQcmludCBjb250ZW50IG9mIGluZm8gd29yZD8gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0hXQU5EOgotCSAgICAgIGZwdXRzICgiIEhXQU5EICAgICAiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0hFQ0tFRCkKLQkJZnB1dHMgKCIgUjRLRU9QX0NIRUNLRUQiLCBzdGRvdXQpOwotCSAgICAgIGlmIChvcHRpb24tPmluZm8gJiBPSFdBMF9SNEtFT1BfQ0xFQU4pCi0JCWZwdXRzICgiIFI0S0VPUF9DTEVBTiIsIHN0ZG91dCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0hXT1I6Ci0JICAgICAgZnB1dHMgKCIgSFdPUiAgICAgICIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DSEVDS0VEKQotCQlmcHV0cyAoIiBSNEtFT1BfQ0hFQ0tFRCIsIHN0ZG91dCk7Ci0JICAgICAgaWYgKG9wdGlvbi0+aW5mbyAmIE9IV0EwX1I0S0VPUF9DTEVBTikKLQkJZnB1dHMgKCIgUjRLRU9QX0NMRUFOIiwgc3Rkb3V0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPREtfR1BfR1JPVVA6Ci0JICAgICAgcHJpbnRmICgiIEdQX0dST1VQICAlIzA2bHggIHNlbGYtY29udGFpbmVkICUjMDZseCIsCi0JCSAgICAgIG9wdGlvbi0+aW5mbyAmIE9HUF9HUk9VUCwKLQkJICAgICAgKG9wdGlvbi0+aW5mbyAmIE9HUF9TRUxGKSA+PiAxNik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT0RLX0lERU5UOgotCSAgICAgIHByaW50ZiAoIiBJREVOVCAgICAgJSMwNmx4ICBzZWxmLWNvbnRhaW5lZCAlIzA2bHgiLAotCQkgICAgICBvcHRpb24tPmluZm8gJiBPR1BfR1JPVVAsCi0JCSAgICAgIChvcHRpb24tPmluZm8gJiBPR1BfU0VMRikgPj4gMTYpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gICovCi0JICAgICAgcHJpbnRmICgiICUzZCA/Pz8gICAgICVkICVseCIsCi0JCSAgICAgIG9wdGlvbi0+a2luZCwgb3B0aW9uLT5zZWN0aW9uLCBvcHRpb24tPmluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGxlbiA9IHNpemVvZiAoKmVvcHQpOwotCSAgd2hpbGUgKGxlbiA8IG9wdGlvbi0+c2l6ZSkKLQkgICAgaWYgKCgoY2hhciAqKSBvcHRpb24pW2xlbl0gPj0gJyAnCi0JCSYmICgoY2hhciAqKSBvcHRpb24pW2xlbl0gPCAweDdmKQotCSAgICAgIHByaW50ZiAoIiVjIiwgKChjaGFyICopIG9wdGlvbilbbGVuKytdKTsKLQkgICAgZWxzZQotCSAgICAgIHByaW50ZiAoIlxcJTAzbyIsICgoY2hhciAqKSBvcHRpb24pW2xlbisrXSk7Ci0KLQkgIGZwdXRzICgiXG4iLCBzdGRvdXQpOwotCSAgKytvcHRpb247Ci0JfQotCi0gICAgICBmcmVlIChlb3B0KTsKLSAgICB9Ci0KLSAgaWYgKGNvbmZsaWN0c19vZmZzZXQgIT0gMCAmJiBjb25mbGljdHNubyAhPSAwKQotICAgIHsKLSAgICAgIEVsZjMyX0V4dGVybmFsX0NvbmZsaWN0ICogZWNvbmYzMjsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0ICogZWNvbmY2NDsKLSAgICAgIEVsZjMyX0NvbmZsaWN0ICogaWNvbmY7Ci0gICAgICBzaXplX3QgY250OwotCi0gICAgICBpZiAoZHluYW1pY19zeW1ib2xzID09IE5VTEwpCi0JewotCSAgZXJyb3IgKF8oImNvbmZsaWN0IGxpc3Qgd2l0aCB3aXRob3V0IHRhYmxlIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpY29uZiA9IChFbGYzMl9Db25mbGljdCAqKSBtYWxsb2MgKGNvbmZsaWN0c25vICogc2l6ZW9mICgqaWNvbmYpKTsKLSAgICAgIGlmIChpY29uZiA9PSBOVUxMKQotCXsKLQkgIGVycm9yIChfKCJPdXQgb2YgbWVtb3J5IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICBpZiAoaXNfMzJiaXRfZWxmKQotCXsKLQkgIEdFVF9EQVRBX0FMTE9DIChjb25mbGljdHNfb2Zmc2V0LCBjb25mbGljdHNubyAqIHNpemVvZiAoKmVjb25mMzIpLAotCQkJICBlY29uZjMyLCBFbGYzMl9FeHRlcm5hbF9Db25mbGljdCAqLCAiY29uZmxpY3QiKTsKLQotCSAgZm9yIChjbnQgPSAwOyBjbnQgPCBjb25mbGljdHNubzsgKytjbnQpCi0JICAgIGljb25mW2NudF0gPSBCWVRFX0dFVCAoZWNvbmYzMltjbnRdKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgR0VUX0RBVEFfQUxMT0MgKGNvbmZsaWN0c19vZmZzZXQsIGNvbmZsaWN0c25vICogc2l6ZW9mICgqZWNvbmY2NCksCi0JCQkgIGVjb25mNjQsIEVsZjY0X0V4dGVybmFsX0NvbmZsaWN0ICosICJjb25mbGljdCIpOwotCi0JICBmb3IgKGNudCA9IDA7IGNudCA8IGNvbmZsaWN0c25vOyArK2NudCkKLQkgICAgaWNvbmZbY250XSA9IEJZVEVfR0VUIChlY29uZjY0W2NudF0pOwotCX0KLQotICAgICAgcHJpbnRmIChfKCJcblNlY3Rpb24gJy5jb25mbGljdCcgY29udGFpbnMgJWQgZW50cmllczpcbiIpLCBjb25mbGljdHNubyk7Ci0gICAgICBwdXRzIChfKCIgIE51bTogICAgSW5kZXggICAgICAgVmFsdWUgIE5hbWUiKSk7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgY250IDwgY29uZmxpY3Rzbm87ICsrY250KQotCXsKLQkgIEVsZl9JbnRlcm5hbF9TeW0gKiBwc3ltID0gJmR5bmFtaWNfc3ltYm9sc1tpY29uZltjbnRdXTsKLQotCSAgcHJpbnRmICgiJTV1OiAlOGx1ICAlIzEwbHggICVzXG4iLAotCQkgIGNudCwgaWNvbmZbY250XSwgKHVuc2lnbmVkIGxvbmcpIHBzeW0tPnN0X3ZhbHVlLAotCQkgIGR5bmFtaWNfc3RyaW5ncyArIHBzeW0tPnN0X25hbWUpOwotCX0KLQotCi0gICAgICBmcmVlIChpY29uZik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX2FyY2hfc3BlY2lmaWMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBzd2l0Y2ggKGVsZl9oZWFkZXIuZV9tYWNoaW5lKQotICAgIHsKLSAgICBjYXNlIEVNX01JUFM6Ci0gICAgY2FzZSBFTV9NSVBTX1JTNF9CRToKLSAgICAgIHJldHVybiBwcm9jZXNzX21pcHNfc3BlY2lmaWMgKGZpbGUpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9maWxlX2hlYWRlciAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIC8qIFJlYWQgaW4gdGhlIGlkZW50aXR5IGFycmF5LiAgKi8KLSAgaWYgKGZyZWFkIChlbGZfaGVhZGVyLmVfaWRlbnQsIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBEZXRlcm1pbmUgaG93IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlci4gICovCi0gIHN3aXRjaCAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9EQVRBXSkKLSAgICB7Ci0gICAgZGVmYXVsdDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBFTEZEQVRBTk9ORTogLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBFTEZEQVRBMkxTQjogYnl0ZV9nZXQgPSBieXRlX2dldF9saXR0bGVfZW5kaWFuOyBicmVhazsKLSAgICBjYXNlIEVMRkRBVEEyTVNCOiBieXRlX2dldCA9IGJ5dGVfZ2V0X2JpZ19lbmRpYW47IGJyZWFrOwotICAgIH0KLQotICAvKiBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCAzMiBiaXQgYW5kIDY0IGJpdCBFTEYgZmlsZXMuICAqLwotICBpc18zMmJpdF9lbGYgPSAoZWxmX2hlYWRlci5lX2lkZW50IFtFSV9DTEFTU10gIT0gRUxGQ0xBU1M2NCk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLiAgKi8KLSAgaWYgKGlzXzMyYml0X2VsZikKLSAgICB7Ci0gICAgICBFbGYzMl9FeHRlcm5hbF9FaGRyIGVoZHIzMjsKLQotICAgICAgaWYgKGZyZWFkIChlaGRyMzIuZV90eXBlLCBzaXplb2YgKGVoZHIzMikgLSBFSV9OSURFTlQsIDEsIGZpbGUpICE9IDEpCi0JcmV0dXJuIDA7Ci0gICAgICAKLSAgICAgIGVsZl9oZWFkZXIuZV90eXBlICAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfdHlwZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfbWFjaGluZSAgID0gQllURV9HRVQgKGVoZHIzMi5lX21hY2hpbmUpOwotICAgICAgZWxmX2hlYWRlci5lX3ZlcnNpb24gICA9IEJZVEVfR0VUIChlaGRyMzIuZV92ZXJzaW9uKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9lbnRyeSAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfZW50cnkpOwotICAgICAgZWxmX2hlYWRlci5lX3Bob2ZmICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9waG9mZik7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hvZmYgICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3Nob2ZmKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9mbGFncyAgICAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfZmxhZ3MpOwotICAgICAgZWxmX2hlYWRlci5lX2Voc2l6ZSAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9laHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3BoZW50c2l6ZSA9IEJZVEVfR0VUIChlaGRyMzIuZV9waGVudHNpemUpOwotICAgICAgZWxmX2hlYWRlci5lX3BobnVtICAgICA9IEJZVEVfR0VUIChlaGRyMzIuZV9waG51bSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hlbnRzaXplID0gQllURV9HRVQgKGVoZHIzMi5lX3NoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfc2hudW0gICAgID0gQllURV9HRVQgKGVoZHIzMi5lX3NobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaHN0cm5keCAgPSBCWVRFX0dFVCAoZWhkcjMyLmVfc2hzdHJuZHgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X0V4dGVybmFsX0VoZHIgZWhkcjY0OwotICAgICAgCi0gICAgICBpZiAoZnJlYWQgKGVoZHI2NC5lX3R5cGUsIHNpemVvZiAoZWhkcjY0KSAtIEVJX05JREVOVCwgMSwgZmlsZSkgIT0gMSkKLQlyZXR1cm4gMDsKLSAgICAgIAotICAgICAgZWxmX2hlYWRlci5lX3R5cGUgICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV90eXBlKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9tYWNoaW5lICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfbWFjaGluZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfdmVyc2lvbiAgID0gQllURV9HRVQgKGVoZHI2NC5lX3ZlcnNpb24pOwotICAgICAgZWxmX2hlYWRlci5lX2VudHJ5ICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfZW50cnkpOwotICAgICAgZWxmX2hlYWRlci5lX3Bob2ZmICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfcGhvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX3Nob2ZmICAgICA9IEJZVEVfR0VUOCAoZWhkcjY0LmVfc2hvZmYpOwotICAgICAgZWxmX2hlYWRlci5lX2ZsYWdzICAgICA9IEJZVEVfR0VUIChlaGRyNjQuZV9mbGFncyk7Ci0gICAgICBlbGZfaGVhZGVyLmVfZWhzaXplICAgID0gQllURV9HRVQgKGVoZHI2NC5lX2Voc2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhlbnRzaXplID0gQllURV9HRVQgKGVoZHI2NC5lX3BoZW50c2l6ZSk7Ci0gICAgICBlbGZfaGVhZGVyLmVfcGhudW0gICAgID0gQllURV9HRVQgKGVoZHI2NC5lX3BobnVtKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaGVudHNpemUgPSBCWVRFX0dFVCAoZWhkcjY0LmVfc2hlbnRzaXplKTsKLSAgICAgIGVsZl9oZWFkZXIuZV9zaG51bSAgICAgPSBCWVRFX0dFVCAoZWhkcjY0LmVfc2hudW0pOwotICAgICAgZWxmX2hlYWRlci5lX3Noc3RybmR4ICA9IEJZVEVfR0VUIChlaGRyNjQuZV9zaHN0cm5keCk7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19maWxlIChmaWxlX25hbWUpCi0gICAgIGNoYXIgKiBmaWxlX25hbWU7Ci17Ci0gIEZJTEUgKiAgICAgICBmaWxlOwotICBzdHJ1Y3Qgc3RhdCAgc3RhdGJ1ZjsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaWYgKHN0YXQgKGZpbGVfbmFtZSwgJiBzdGF0YnVmKSA8IDApCi0gICAgewotICAgICAgZXJyb3IgKF8oIkNhbm5vdCBzdGF0IGlucHV0IGZpbGUgJXMuXG4iKSwgZmlsZV9uYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZmlsZSA9IGZvcGVuIChmaWxlX25hbWUsICJyYiIpOwotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGVycm9yIChfKCJJbnB1dCBmaWxlICVzIG5vdCBmb3VuZC5cbiIpLCBmaWxlX25hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBnZXRfZmlsZV9oZWFkZXIgKGZpbGUpKQotICAgIHsKLSAgICAgIGVycm9yIChfKCIlczogRmFpbGVkIHRvIHJlYWQgZmlsZSBoZWFkZXJcbiIpLCBmaWxlX25hbWUpOwotICAgICAgZmNsb3NlIChmaWxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSW5pdGlhbGlzZSBwZXIgZmlsZSB2YXJpYWJsZXMuICAqLwotICBmb3IgKGkgPSBOVU1fRUxFTSAodmVyc2lvbl9pbmZvKTsgaS0tOykKLSAgICB2ZXJzaW9uX2luZm9baV0gPSAwOwotCi0gIGZvciAoaSA9IE5VTV9FTEVNIChkeW5hbWljX2luZm8pOyBpLS07KQotICAgIGR5bmFtaWNfaW5mb1tpXSA9IDA7Ci0KLSAgLyogUHJvY2VzcyB0aGUgZmlsZS4gICovCi0gIGlmIChzaG93X25hbWUpCi0gICAgcHJpbnRmIChfKCJcbkZpbGU6ICVzXG4iKSwgZmlsZV9uYW1lKTsKLQotICBpZiAoISBwcm9jZXNzX2ZpbGVfaGVhZGVyICgpKQotICAgIHsKLSAgICAgIGZjbG9zZSAoZmlsZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHByb2Nlc3Nfc2VjdGlvbl9oZWFkZXJzIChmaWxlKTsKLQotICBwcm9jZXNzX3Byb2dyYW1faGVhZGVycyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19keW5hbWljX3NlZ21lbnQgKGZpbGUpOwotCi0gIHByb2Nlc3NfcmVsb2NzIChmaWxlKTsKLQotICBwcm9jZXNzX3N5bWJvbF90YWJsZSAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19zeW1pbmZvIChmaWxlKTsKLQotICBwcm9jZXNzX3ZlcnNpb25fc2VjdGlvbnMgKGZpbGUpOwotCi0gIHByb2Nlc3Nfc2VjdGlvbl9jb250ZW50cyAoZmlsZSk7Ci0KLSAgcHJvY2Vzc19hcmNoX3NwZWNpZmljIChmaWxlKTsKLQotICBmY2xvc2UgKGZpbGUpOwotCi0gIGlmIChzZWN0aW9uX2hlYWRlcnMpCi0gICAgewotICAgICAgZnJlZSAoc2VjdGlvbl9oZWFkZXJzKTsKLSAgICAgIHNlY3Rpb25faGVhZGVycyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfdGFibGUpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nX3RhYmxlKTsKLSAgICAgIHN0cmluZ190YWJsZSA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N0cmluZ3MpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zdHJpbmdzKTsKLSAgICAgIGR5bmFtaWNfc3RyaW5ncyA9IE5VTEw7Ci0gICAgfQotCi0gIGlmIChkeW5hbWljX3N5bWJvbHMpCi0gICAgewotICAgICAgZnJlZSAoZHluYW1pY19zeW1ib2xzKTsKLSAgICAgIGR5bmFtaWNfc3ltYm9scyA9IE5VTEw7Ci0gICAgICBudW1fZHluYW1pY19zeW1zID0gMDsKLSAgICB9Ci0KLSAgaWYgKGR5bmFtaWNfc3ltaW5mbykKLSAgICB7Ci0gICAgICBmcmVlIChkeW5hbWljX3N5bWluZm8pOwotICAgICAgZHluYW1pY19zeW1pbmZvID0gTlVMTDsKLSAgICB9Ci19Ci0KLSNpZmRlZiBTVVBQT1JUX0RJU0FTU0VNQkxZCi0vKiBOZWVkZWQgYnkgdGhlIGkzODYgZGlzYXNzZW1ibGVyLiAgRm9yIGV4dHJhIGNyZWRpdCwgc29tZW9uZSBjb3VsZAotICAgZml4IHRoaXMgc28gdGhhdCB3ZSBpbnNlcnQgc3ltYm9saWMgYWRkcmVzc2VzIGhlcmUsIGVzcCBmb3IgR09UL1BMVAotICAgc3ltYm9scyAqLwotCi12b2lkCi1wcmludF9hZGRyZXNzICh1bnNpZ25lZCBpbnQgYWRkciwgRklMRSAqIG91dGZpbGUpCi17Ci0gIGZwcmludGYgKG91dGZpbGUsIjB4JTguOHgiLCBhZGRyKTsKLX0KLQotLyogTmVlZGVkIGJ5IHRoZSBpMzg2IGRpc2Fzc2VtYmxlci4gKi8KLXZvaWQKLWRiX3Rhc2tfcHJpbnRzeW0gKHVuc2lnbmVkIGludCBhZGRyKQotewotICBwcmludF9hZGRyZXNzIChhZGRyLCBzdGRlcnIpOwotfQotI2VuZGlmCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50ICAgICBhcmdjOwotICAgICBjaGFyICoqIGFyZ3Y7Ci17Ci0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcGFyc2VfYXJncyAoYXJnYywgYXJndik7Ci0KLSAgaWYgKG9wdGluZCA8IChhcmdjIC0gMSkpCi0gICAgc2hvd19uYW1lID0gMTsKLQotICB3aGlsZSAob3B0aW5kIDwgYXJnYykKLSAgICBwcm9jZXNzX2ZpbGUgKGFyZ3YgW29wdGluZCArK10pOwotCi0gIGlmIChkdW1wX3NlY3RzICE9IE5VTEwpCi0gICAgZnJlZSAoZHVtcF9zZWN0cyk7Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZW5hbWUuYyBiL2JpbnV0aWxzL3JlbmFtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVhOWZkLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3JlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qIHJlbmFtZS5jIC0tIHJlbmFtZSBhIGZpbGUsIHByZXNlcnZpbmcgc3ltbGlua3MuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBIQVZFX0dPT0RfVVRJTUVfSAotI2luY2x1ZGUgPHV0aW1lLmg+Ci0jZWxzZSAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0jaWZkZWYgSEFWRV9VVElNRVMKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2VuZGlmIC8qIEhBVkVfVVRJTUVTICovCi0jZW5kaWYgLyogISBIQVZFX0dPT0RfVVRJTUVfSCAqLwotCi0vKiBXZSBuZWVkIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5IG1vZGVzIG9uIHN5c3RlbSB3aGVyZSB0aGF0IG1ha2VzCi0gICBhIGRpZmZlcmVuY2UuICAqLwotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYKLQotc3RhdGljIGludCBzaW1wbGVfY29weSBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgYXQgb25jZS4gICovCi0jZGVmaW5lIENPUFlfQlVGIDgxOTIKLQotLyogQ29weSBmaWxlIEZST00gdG8gZmlsZSBUTywgcGVyZm9ybWluZyBubyB0cmFuc2xhdGlvbnMuCi0gICBSZXR1cm4gMCBpZiBvaywgLTEgaWYgZXJyb3IuICAqLwotCi1zdGF0aWMgaW50Ci1zaW1wbGVfY29weSAoZnJvbSwgdG8pCi0gICAgIGNvbnN0IGNoYXIgKmZyb207Ci0gICAgIGNvbnN0IGNoYXIgKnRvOwotewotICBpbnQgZnJvbWZkLCB0b2ZkLCBucmVhZDsKLSAgaW50IHNhdmVkOwotICBjaGFyIGJ1ZltDT1BZX0JVRl07Ci0KLSAgZnJvbWZkID0gb3BlbiAoZnJvbSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0gIGlmIChmcm9tZmQgPCAwKQotICAgIHJldHVybiAtMTsKLSNpZmRlZiBPX0NSRUFUCi0gIHRvZmQgPSBvcGVuICh0bywgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNzc3KTsKLSNlbHNlCi0gIHRvZmQgPSBjcmVhdCAodG8sIDA3NzcpOwotI2VuZGlmCi0gIGlmICh0b2ZkIDwgMCkKLSAgICB7Ci0gICAgICBzYXZlZCA9IGVycm5vOwotICAgICAgY2xvc2UgKGZyb21mZCk7Ci0gICAgICBlcnJubyA9IHNhdmVkOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgd2hpbGUgKChucmVhZCA9IHJlYWQgKGZyb21mZCwgYnVmLCBzaXplb2YgYnVmKSkgPiAwKQotICAgIHsKLSAgICAgIGlmICh3cml0ZSAodG9mZCwgYnVmLCBucmVhZCkgIT0gbnJlYWQpCi0JewotCSAgc2F2ZWQgPSBlcnJubzsKLQkgIGNsb3NlIChmcm9tZmQpOwotCSAgY2xvc2UgKHRvZmQpOwotCSAgZXJybm8gPSBzYXZlZDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBzYXZlZCA9IGVycm5vOwotICBjbG9zZSAoZnJvbWZkKTsKLSAgY2xvc2UgKHRvZmQpOwotICBpZiAobnJlYWQgPCAwKQotICAgIHsKLSAgICAgIGVycm5vID0gc2F2ZWQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogU2V0IHRoZSB0aW1lcyBvZiB0aGUgZmlsZSBERVNUSU5BVElPTiB0byBiZSB0aGUgc2FtZSBhcyB0aG9zZSBpbgotICAgU1RBVEJVRi4gICovCi0KLXZvaWQKLXNldF90aW1lcyAoZGVzdGluYXRpb24sIHN0YXRidWYpCi0gICAgIGNvbnN0IGNoYXIgKmRlc3RpbmF0aW9uOwotICAgICBjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZjsKLXsKLSAgaW50IHJlc3VsdDsKLQotICB7Ci0jaWZkZWYgSEFWRV9HT09EX1VUSU1FX0gKLSAgICBzdHJ1Y3QgdXRpbWJ1ZiB0YjsKLQotICAgIHRiLmFjdGltZSA9IHN0YXRidWYtPnN0X2F0aW1lOwotICAgIHRiLm1vZHRpbWUgPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICByZXN1bHQgPSB1dGltZSAoZGVzdGluYXRpb24sICZ0Yik7Ci0jZWxzZSAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0jaWZuZGVmIEhBVkVfVVRJTUVTCi0gICAgbG9uZyB0YlsyXTsKLQotICAgIHRiWzBdID0gc3RhdGJ1Zi0+c3RfYXRpbWU7Ci0gICAgdGJbMV0gPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICByZXN1bHQgPSB1dGltZSAoZGVzdGluYXRpb24sIHRiKTsKLSNlbHNlIC8qIEhBVkVfVVRJTUVTICovCi0gICAgc3RydWN0IHRpbWV2YWwgdHZbMl07Ci0KLSAgICB0dlswXS50dl9zZWMgPSBzdGF0YnVmLT5zdF9hdGltZTsKLSAgICB0dlswXS50dl91c2VjID0gMDsKLSAgICB0dlsxXS50dl9zZWMgPSBzdGF0YnVmLT5zdF9tdGltZTsKLSAgICB0dlsxXS50dl91c2VjID0gMDsKLSAgICByZXN1bHQgPSB1dGltZXMgKGRlc3RpbmF0aW9uLCB0dik7Ci0jZW5kaWYgLyogSEFWRV9VVElNRVMgKi8KLSNlbmRpZiAvKiAhIEhBVkVfR09PRF9VVElNRV9IICovCi0gIH0KLQotICBpZiAocmVzdWx0ICE9IDApCi0gICAgbm9uX2ZhdGFsIChfKCIlczogY2Fubm90IHNldCB0aW1lOiAlcyIpLCBkZXN0aW5hdGlvbiwgc3RyZXJyb3IgKGVycm5vKSk7Ci19Ci0KLSNpZm5kZWYgU19JU0xOSwotI2lmZGVmIFNfSUZMTksKLSNkZWZpbmUgU19JU0xOSyhtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkxOSykKLSNlbHNlCi0jZGVmaW5lIFNfSVNMTksobSkgMAotI2RlZmluZSBsc3RhdCBzdGF0Ci0jZW5kaWYKLSNlbmRpZgotCi0vKiBSZW5hbWUgRlJPTSB0byBUTywgY29weWluZyBpZiBUTyBpcyBhIGxpbmsuCi0gICBSZXR1cm4gMCBpZiBvaywgLTEgaWYgZXJyb3IuICAqLwotCi1pbnQKLXNtYXJ0X3JlbmFtZSAoZnJvbSwgdG8sIHByZXNlcnZlX2RhdGVzKQotICAgICBjb25zdCBjaGFyICpmcm9tOwotICAgICBjb25zdCBjaGFyICp0bzsKLSAgICAgaW50IHByZXNlcnZlX2RhdGVzOwotewotICBib29sZWFuIGV4aXN0czsKLSAgc3RydWN0IHN0YXQgczsKLSAgaW50IHJldCA9IDA7Ci0KLSAgZXhpc3RzID0gbHN0YXQgKHRvLCAmcykgPT0gMDsKLQotI2lmIGRlZmluZWQgKF9XSU4zMikgJiYgIWRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSAgLyogV2luMzIsIHVubGlrZSB1bml4LCB3aWxsIG5vdCBlcmFzZSBgdG8nIGluIGByZW5hbWUoZnJvbSwgdG8pJyBidXQKLSAgICAgZmFpbCBpbnN0ZWFkLiAgQWxzbywgY2hvd24gaXMgbm90IHByZXNlbnQuICAqLwotCi0gIGlmIChleGlzdHMpCi0gICAgcmVtb3ZlICh0byk7Ci0KLSAgcmV0ID0gcmVuYW1lIChmcm9tLCB0byk7Ci0gIGlmIChyZXQgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuICovCi0gICAgICAKLSAgICAgIG5vbl9mYXRhbCAoXygiJXM6IHJlbmFtZTogJXMiKSwgdG8sIHN0cmVycm9yIChlcnJubykpOwotICAgICAgdW5saW5rIChmcm9tKTsKLSAgICB9Ci0jZWxzZQotICAvKiBVc2UgcmVuYW1lIG9ubHkgaWYgVE8gaXMgbm90IGEgc3ltYm9saWMgbGluayBhbmQgaGFzCi0gICAgIG9ubHkgb25lIGhhcmQgbGluay4gICovCi0gIGlmICghIGV4aXN0cyB8fCAoIVNfSVNMTksgKHMuc3RfbW9kZSkgJiYgcy5zdF9ubGluayA9PSAxKSkKLSAgICB7Ci0gICAgICByZXQgPSByZW5hbWUgKGZyb20sIHRvKTsKLSAgICAgIGlmIChyZXQgPT0gMCkKLQl7Ci0JICBpZiAoZXhpc3RzKQotCSAgICB7Ci0JICAgICAgLyogVHJ5IHRvIHByZXNlcnZlIHRoZSBwZXJtaXNzaW9uIGJpdHMgYW5kIG93bmVyc2hpcCBvZgotCQkgVE8uICBGaXJzdCBnZXQgdGhlIG1vZGUgcmlnaHQgZXhjZXB0IGZvciB0aGUgc2V0dWlkCi0JCSBiaXQuICBUaGVuIGNoYW5nZSB0aGUgb3duZXJzaGlwLiAgVGhlbiBmaXggdGhlIHNldHVpZAotCQkgYml0LiAgV2UgZG8gdGhlIGNobW9kIGJlZm9yZSB0aGUgY2hvd24gYmVjYXVzZSBpZiB0aGUKLQkJIGNob3duIHN1Y2NlZWRzLCBhbmQgd2UgYXJlIGEgbm9ybWFsIHVzZXIsIHdlIHdvbid0IGJlCi0JCSBhYmxlIHRvIGRvIHRoZSBjaG1vZCBhZnRlcndhcmQuICBXZSBkb24ndCBib3RoZXIgdG8KLQkJIGZpeCB0aGUgc2V0dWlkIGJpdCBmaXJzdCBiZWNhdXNlIHRoYXQgbWlnaHQgaW50cm9kdWNlCi0JCSBhIGZsZWV0aW5nIHNlY3VyaXR5IHByb2JsZW0sIGFuZCBiZWNhdXNlIHRoZSBjaG93bgotCQkgd2lsbCBjbGVhciB0aGUgc2V0dWlkIGJpdCBhbnlob3cuICBXZSBvbmx5IGZpeCB0aGUKLQkJIHNldHVpZCBiaXQgaWYgdGhlIGNob3duIHN1Y2NlZWRzLCBiZWNhdXNlIHdlIGRvbid0Ci0JCSB3YW50IHRvIGludHJvZHVjZSBhbiB1bmV4cGVjdGVkIHNldHVpZCBmaWxlIG93bmVkIGJ5Ci0JCSB0aGUgdXNlciBydW5uaW5nIG9iamNvcHkuICAqLwotCSAgICAgIGNobW9kICh0bywgcy5zdF9tb2RlICYgMDc3Nyk7Ci0JICAgICAgaWYgKGNob3duICh0bywgcy5zdF91aWQsIHMuc3RfZ2lkKSA+PSAwKQotCQljaG1vZCAodG8sIHMuc3RfbW9kZSAmIDA3Nzc3KTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBoYXZlIHRvIGNsZWFuIHVwIGhlcmUuICovCi0JICBub25fZmF0YWwgKF8oIiVzOiByZW5hbWU6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKLQkgIHVubGluayAoZnJvbSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldCA9IHNpbXBsZV9jb3B5IChmcm9tLCB0byk7Ci0gICAgICBpZiAocmV0ICE9IDApCi0Jbm9uX2ZhdGFsIChfKCIlczogc2ltcGxlX2NvcHk6ICVzIiksIHRvLCBzdHJlcnJvciAoZXJybm8pKTsKLQotICAgICAgaWYgKHByZXNlcnZlX2RhdGVzKQotCXNldF90aW1lcyAodG8sICZzKTsKLSAgICAgIHVubGluayAoZnJvbSk7Ci0gICAgfQotI2VuZGlmIC8qIF9XSU4zMiAmJiAhX19DWUdXSU4zMl9fICovCi0KLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc2Jpbi5jIGIvYmludXRpbHMvcmVzYmluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzA3ZmIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzYmluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzg3ICswLDAgQEAKLS8qIHJlc2Jpbi5jIC0tIG1hbmlwdWxhdGUgdGhlIFdpbmRvd3MgYmluYXJ5IHJlc291cmNlIGZvcm1hdC4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBjb252ZXJ0IGJldHdlZW4gdGhlIGJpbmFyeSByZXNvdXJjZQotICAgZm9ybWF0IGFuZCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyB0aGF0IHdlIHdhbnQgdG8gdXNlLiAgVGhlIHNhbWUKLSAgIGJpbmFyeSByZXNvdXJjZSBmb3JtYXQgaXMgdXNlZCBpbiBib3RoIHJlcyBhbmQgQ09GRiBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLS8qIE1hY3JvcyB0byBzd2FwIGluIHZhbHVlcy4gICovCi0KLSNkZWZpbmUgZ2V0XzE2KGJlLCBzKSAoKGJlKSA/IGJmZF9nZXRiMTYgKHMpIDogYmZkX2dldGwxNiAocykpCi0jZGVmaW5lIGdldF8zMihiZSwgcykgKChiZSkgPyBiZmRfZ2V0YjMyIChzKSA6IGJmZF9nZXRsMzIgKHMpKQotCi0vKiBMb2NhbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZCB0b29zbWFsbCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB1bmljaGFyICpnZXRfdW5pY29kZQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZ2V0X3Jlc2lkCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQgKiwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2dlbmVyaWMKLSAgUEFSQU1TICgoZW51bSByZXNfdHlwZSwgY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19jdXJzb3IKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX21lbnUKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgbWVudWl0ZW0gKmJpbl90b19yZXNfbWVudWl0ZW1zCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50LCBpbnQgKikpOwotc3RhdGljIHN0cnVjdCBtZW51aXRlbSAqYmluX3RvX3Jlc19tZW51ZXhpdGVtcwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCwgaW50ICopKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX2RpYWxvZwotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfc3RyaW5nCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19mb250ZGlyCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMKLSAgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBsb25nLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzX3JjZGF0YQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKmJpbl90b19yZXNfZ3JvdXBfY3Vyc29yCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc19ncm91cF9pY29uCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc192ZXJzaW9uCi0gIFBBUkFNUyAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqYmluX3RvX3Jlc191c2VyZGF0YQotICBQQVJBTVMgKChjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGludCkpOwotCi0vKiBHaXZlbiBhIHJlc291cmNlIHR5cGUgSUQsIGEgcG9pbnRlciB0byBkYXRhLCBhIGxlbmd0aCwgcmV0dXJuIGEKLSAgIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUgd2hpY2ggcmVwcmVzZW50cyB0aGF0IHJlc291cmNlLiAgVGhlIGNhbGxlcgotICAgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgcmVzX2luZm8gYW5kIGNvZmZfaW5mbyBmaWVsZHMKLSAgIG9mIHRoZSByZXR1cm5lZCBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlICoKLWJpbl90b19yZXMgKHR5cGUsIGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgc3RydWN0IHJlc19pZCB0eXBlOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGlmICh0eXBlLm5hbWVkKQotICAgIHJldHVybiBiaW5fdG9fcmVzX3VzZXJkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoICh0eXBlLnUuaWQpCi0JewotCWRlZmF1bHQ6Ci0JICByZXR1cm4gYmluX3RvX3Jlc191c2VyZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0NVUlNPUjoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0JJVE1BUDoKLQkgIHJldHVybiBiaW5fdG9fcmVzX2dlbmVyaWMgKFJFU19UWVBFX0JJVE1BUCwgZGF0YSwgbGVuZ3RoKTsKLQljYXNlIFJUX0lDT046Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9JQ09OLCBkYXRhLCBsZW5ndGgpOwotCWNhc2UgUlRfTUVOVToKLQkgIHJldHVybiBiaW5fdG9fcmVzX21lbnUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9ESUFMT0c6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19kaWFsb2cgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9TVFJJTkc6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19zdHJpbmcgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9GT05URElSOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZm9udGRpciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX0ZPTlQ6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9GT05ULCBkYXRhLCBsZW5ndGgpOwotCWNhc2UgUlRfQUNDRUxFUkFUT1I6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19hY2NlbGVyYXRvcnMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9SQ0RBVEE6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19yY2RhdGEgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9NRVNTQUdFVEFCTEU6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19nZW5lcmljIChSRVNfVFlQRV9NRVNTQUdFVEFCTEUsIGRhdGEsIGxlbmd0aCk7Ci0JY2FzZSBSVF9HUk9VUF9DVVJTT1I6Ci0JICByZXR1cm4gYmluX3RvX3Jlc19ncm91cF9jdXJzb3IgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbik7Ci0JY2FzZSBSVF9HUk9VUF9JQ09OOgotCSAgcmV0dXJuIGJpbl90b19yZXNfZ3JvdXBfaWNvbiAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKTsKLQljYXNlIFJUX1ZFUlNJT046Ci0JICByZXR1cm4gYmluX3RvX3Jlc192ZXJzaW9uIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pOwotCX0KLSAgICB9Ci19Ci0KLS8qIEdpdmUgYW4gZXJyb3IgaWYgdGhlIGJpbmFyeSBkYXRhIGlzIHRvbyBzbWFsbC4gICovCi0KLXN0YXRpYyB2b2lkCi10b29zbWFsbCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsIChfKCIlczogbm90IGVub3VnaCBiaW5hcnkgZGF0YSIpLCBtc2cpOwotfQotCi0vKiBTd2FwIGluIGEgTlVMTCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nLiAgKi8KLQotc3RhdGljIHVuaWNoYXIgKgotZ2V0X3VuaWNvZGUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgcmV0bGVuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci0gICAgIGludCAqcmV0bGVuOwotewotICBpbnQgYywgaTsKLSAgdW5pY2hhciAqcmV0OwotCi0gIGMgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoIDwgKHVuc2lnbmVkIGxvbmcpIGMgKiAyICsgMikKLQl0b29zbWFsbCAoXygibnVsbCB0ZXJtaW5hdGVkIHVuaWNvZGUgc3RyaW5nIikpOwotICAgICAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIGMgKiAyKSA9PSAwKQotCWJyZWFrOwotICAgICAgKytjOwotICAgIH0KLQotICByZXQgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKChjICsgMSkgKiBzaXplb2YgKHVuaWNoYXIpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHJldFtpXSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIGkgKiAyKTsKLSAgcmV0W2ldID0gMDsKLQotICBpZiAocmV0bGVuICE9IE5VTEwpCi0gICAgKnJldGxlbiA9IGM7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogR2V0IGEgcmVzb3VyY2UgaWRlbnRpZmllci4gIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfcmVzaWQgKGlkLCBkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIHN0cnVjdCByZXNfaWQgKmlkOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBmaXJzdDsKLQotICBpZiAobGVuZ3RoIDwgMikKLSAgICB0b29zbWFsbCAoXygicmVzb3VyY2UgSUQiKSk7Ci0KLSAgZmlyc3QgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICBpZiAoZmlyc3QgPT0gMHhmZmZmKQotICAgIHsKLSAgICAgIGlmIChsZW5ndGggPCA0KQotCXRvb3NtYWxsIChfKCJyZXNvdXJjZSBJRCIpKTsKLSAgICAgIGlkLT5uYW1lZCA9IDA7Ci0gICAgICBpZC0+dS5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWQtPm5hbWVkID0gMTsKLSAgICAgIGlkLT51Lm4ubmFtZSA9IGdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICZpZC0+dS5uLmxlbmd0aCk7Ci0gICAgICByZXR1cm4gaWQtPnUubi5sZW5ndGggKiAyICsgMjsKLSAgICB9Ci19Ci0KLS8qIENvbnZlcnQgYSByZXNvdXJjZSB3aGljaCBqdXN0IHN0b3JlcyB1bmludGVycHJldGVkIGRhdGEgZnJvbQotICAgYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2dlbmVyaWMgKHR5cGUsIGRhdGEsIGxlbmd0aCkKLSAgICAgZW51bSByZXNfdHlwZSB0eXBlOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLXsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gdHlwZTsKLSAgci0+dS5kYXRhLmRhdGEgPSBkYXRhOwotICByLT51LmRhdGEubGVuZ3RoID0gbGVuZ3RoOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgY3Vyc29yIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2N1cnNvciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBjdXJzb3IgKmM7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDQpCi0gICAgdG9vc21hbGwgKF8oImN1cnNvciIpKTsKLQotICBjID0gKHN0cnVjdCBjdXJzb3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmMpOwotICBjLT54aG90c3BvdCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gIGMtPnlob3RzcG90ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gIGMtPmxlbmd0aCA9IGxlbmd0aCAtIDQ7Ci0gIGMtPmRhdGEgPSBkYXRhICsgNDsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfQ1VSU09SOwotICByLT51LmN1cnNvciA9IGM7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIENvbnZlcnQgYSBtZW51IHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX21lbnUgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBzdHJ1Y3QgbWVudSAqbTsKLSAgaW50IHZlcnNpb24sIHJlYWQ7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX01FTlU7Ci0KLSAgbSA9IChzdHJ1Y3QgbWVudSAqKSByZXNfYWxsb2MgKHNpemVvZiAqbSk7Ci0gIHItPnUubWVudSA9IG07Ci0KLSAgaWYgKGxlbmd0aCA8IDIpCi0gICAgdG9vc21hbGwgKF8oIm1lbnUgaGVhZGVyIikpOwotCi0gIHZlcnNpb24gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotCi0gIGlmICh2ZXJzaW9uID09IDApCi0gICAgewotICAgICAgaWYgKGxlbmd0aCA8IDQpCi0JdG9vc21hbGwgKF8oIm1lbnUgaGVhZGVyIikpOwotICAgICAgbS0+aGVscCA9IDA7Ci0gICAgICBtLT5pdGVtcyA9IGJpbl90b19yZXNfbWVudWl0ZW1zIChkYXRhICsgNCwgbGVuZ3RoIC0gNCwgYmlnX2VuZGlhbiwKLQkJCQkgICAgICAgJnJlYWQpOwotICAgIH0KLSAgZWxzZSBpZiAodmVyc2lvbiA9PSAxKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA4KQotCXRvb3NtYWxsIChfKCJtZW51ZXggaGVhZGVyIikpOwotICAgICAgbS0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgb2Zmc2V0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICAgICBpZiAob2Zmc2V0ICsgNCA+PSBsZW5ndGgpCi0JdG9vc21hbGwgKF8oIm1lbnVleCBvZmZzZXQiKSk7Ci0gICAgICBtLT5pdGVtcyA9IGJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEgKyA0ICsgb2Zmc2V0LAotCQkJCQkgbGVuZ3RoIC0gKDQgKyBvZmZzZXQpLAotCQkJCQkgYmlnX2VuZGlhbiwKLQkJCQkJICZyZWFkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmYXRhbCAoXygidW5zdXBwb3J0ZWQgbWVudSB2ZXJzaW9uICVkIiksIHZlcnNpb24pOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IG1lbnUgaXRlbXMgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IG1lbnVpdGVtICoKLWJpbl90b19yZXNfbWVudWl0ZW1zIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sIHJlYWQpCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLSAgICAgaW50ICpyZWFkOwotewotICBzdHJ1Y3QgbWVudWl0ZW0gKmZpcnN0LCAqKnBwOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgKnJlYWQgPSAwOwotCi0gIHdoaWxlIChsZW5ndGggPiAwKQotICAgIHsKLSAgICAgIGludCBmbGFncywgc2xlbiwgaXRlbWxlbjsKLSAgICAgIHVuc2lnbmVkIGludCBzdHJvZmY7Ci0gICAgICBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gICAgICBpZiAobGVuZ3RoIDwgNCkKLQl0b29zbWFsbCAoXygibWVudWl0ZW0gaGVhZGVyIikpOwotCi0gICAgICBtaSA9IChzdHJ1Y3QgbWVudWl0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKm1pKTsKLSAgICAgIG1pLT5zdGF0ZSA9IDA7Ci0gICAgICBtaS0+aGVscCA9IDA7Ci0KLSAgICAgIGZsYWdzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIG1pLT50eXBlID0gZmxhZ3MgJn4gKE1FTlVJVEVNX1BPUFVQIHwgTUVOVUlURU1fRU5ETUVOVSk7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBNRU5VSVRFTV9QT1BVUCkgPT0gMCkKLQlzdHJvZmYgPSA0OwotICAgICAgZWxzZQotCXN0cm9mZiA9IDI7Ci0KLSAgICAgIGlmIChsZW5ndGggPCBzdHJvZmYgKyAyKQotCXRvb3NtYWxsIChfKCJtZW51aXRlbSBoZWFkZXIiKSk7Ci0KLSAgICAgIGlmIChnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBzdHJvZmYpID09IDApCi0JewotCSAgc2xlbiA9IDA7Ci0JICBtaS0+dGV4dCA9IE5VTEw7Ci0JfQotICAgICAgZWxzZQotCW1pLT50ZXh0ID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyBzdHJvZmYsIGxlbmd0aCAtIHN0cm9mZiwgYmlnX2VuZGlhbiwKLQkJCQkmc2xlbik7Ci0KLSAgICAgIGl0ZW1sZW4gPSBzdHJvZmYgKyBzbGVuICogMiArIDI7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiBNRU5VSVRFTV9QT1BVUCkgPT0gMCkKLQl7Ci0JICBtaS0+cG9wdXAgPSBOVUxMOwotCSAgbWktPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBzdWJyZWFkOwotCi0JICBtaS0+aWQgPSAwOwotCSAgbWktPnBvcHVwID0gYmluX3RvX3Jlc19tZW51aXRlbXMgKGRhdGEgKyBpdGVtbGVuLCBsZW5ndGggLSBpdGVtbGVuLAotCQkJCQkgICAgYmlnX2VuZGlhbiwgJnN1YnJlYWQpOwotCSAgaXRlbWxlbiArPSBzdWJyZWFkOwotCX0KLQotICAgICAgbWktPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gbWk7Ci0gICAgICBwcCA9ICZtaS0+bmV4dDsKLQotICAgICAgZGF0YSArPSBpdGVtbGVuOwotICAgICAgbGVuZ3RoIC09IGl0ZW1sZW47Ci0gICAgICAqcmVhZCArPSBpdGVtbGVuOwotCi0gICAgICBpZiAoKGZsYWdzICYgTUVOVUlURU1fRU5ETUVOVSkgIT0gMCkKLQlyZXR1cm4gZmlyc3Q7Ci0gICAgfQotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBtZW51ZXggaXRlbXMgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IG1lbnVpdGVtICoKLWJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgcmVhZCkKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotICAgICBpbnQgKnJlYWQ7Ci17Ci0gIHN0cnVjdCBtZW51aXRlbSAqZmlyc3QsICoqcHA7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICAqcmVhZCA9IDA7Ci0KLSAgd2hpbGUgKGxlbmd0aCA+IDApCi0gICAgewotICAgICAgaW50IGZsYWdzLCBzbGVuOwotICAgICAgdW5zaWduZWQgaW50IGl0ZW1sZW47Ci0gICAgICBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gICAgICBpZiAobGVuZ3RoIDwgMTQpCi0JdG9vc21hbGwgKF8oIm1lbnVpdGVtIGhlYWRlciIpKTsKLQotICAgICAgbWkgPSAoc3RydWN0IG1lbnVpdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICptaSk7Ci0gICAgICBtaS0+dHlwZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBtaS0+c3RhdGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIG1pLT5pZCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDgpOwotCi0gICAgICBmbGFncyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEwKTsKLQotICAgICAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKSA9PSAwKQotCXsKLQkgIHNsZW4gPSAwOwotCSAgbWktPnRleHQgPSBOVUxMOwotCX0KLSAgICAgIGVsc2UKLQltaS0+dGV4dCA9IGdldF91bmljb2RlIChkYXRhICsgMTIsIGxlbmd0aCAtIDEyLCBiaWdfZW5kaWFuLCAmc2xlbik7Ci0KLSAgICAgIGl0ZW1sZW4gPSAxMiArIHNsZW4gKiAyICsgMjsKLSAgICAgIGl0ZW1sZW4gPSAoaXRlbWxlbiArIDMpICZ+IDM7Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiAxKSA9PSAwKQotCXsKLQkgIG1pLT5wb3B1cCA9IE5VTEw7Ci0JICBtaS0+aGVscCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGludCBzdWJyZWFkOwotCi0JICBpZiAobGVuZ3RoIDwgaXRlbWxlbiArIDQpCi0JICAgIHRvb3NtYWxsIChfKCJtZW51aXRlbSIpKTsKLQkgIG1pLT5oZWxwID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgaXRlbWxlbik7Ci0JICBpdGVtbGVuICs9IDQ7Ci0KLQkgIG1pLT5wb3B1cCA9IGJpbl90b19yZXNfbWVudWV4aXRlbXMgKGRhdGEgKyBpdGVtbGVuLAotCQkJCQkgICAgICBsZW5ndGggLSBpdGVtbGVuLAotCQkJCQkgICAgICBiaWdfZW5kaWFuLCAmc3VicmVhZCk7Ci0JICBpdGVtbGVuICs9IHN1YnJlYWQ7Ci0JfQotCi0gICAgICBtaS0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBtaTsKLSAgICAgIHBwID0gJm1pLT5uZXh0OwotCi0gICAgICBkYXRhICs9IGl0ZW1sZW47Ci0gICAgICBsZW5ndGggLT0gaXRlbWxlbjsKLSAgICAgICpyZWFkICs9IGl0ZW1sZW47Ci0KLSAgICAgIGlmICgoZmxhZ3MgJiAweDgwKSAhPSAwKQotCXJldHVybiBmaXJzdDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgZGlhbG9nIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19kaWFsb2cgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdmVyc2lvbjsKLSAgc3RydWN0IGRpYWxvZyAqZDsKLSAgaW50IGMsIHN1YmxlbiwgaTsKLSAgdW5zaWduZWQgaW50IG9mZjsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDE4KQotICAgIHRvb3NtYWxsIChfKCJkaWFsb2cgaGVhZGVyIikpOwotCi0gIGQgPSAoc3RydWN0IGRpYWxvZyAqKSByZXNfYWxsb2MgKHNpemVvZiAqZCk7Ci0KLSAgdmVyc2lvbiA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gIGlmICh2ZXJzaW9uICE9IDEpCi0gICAgewotICAgICAgZC0+ZXggPSBOVUxMOwotICAgICAgZC0+c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgZC0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQpOwotICAgICAgb2ZmID0gODsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc2lnbmF0dXJlOwotCi0gICAgICBzaWduYXR1cmUgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGlmIChzaWduYXR1cmUgIT0gMHhmZmZmKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGRpYWxvZyBzaWduYXR1cmUgJWQiKSwgc2lnbmF0dXJlKTsKLQotICAgICAgZC0+ZXggPSAoc3RydWN0IGRpYWxvZ19leCAqKSByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IGRpYWxvZ19leCkpOwotICAgICAgZC0+ZXgtPmhlbHAgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGQtPmV4c3R5bGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGQtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMTIpOwotICAgICAgb2ZmID0gMTY7Ci0gICAgfQotCi0gIGlmIChsZW5ndGggPCBvZmYgKyAxMCkKLSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGhlYWRlciIpKTsKLQotICBjID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLSAgZC0+eCA9IGdldF8xNiAgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyAyKTsKLSAgZC0+eSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotICBkLT53aWR0aCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDYpOwotICBkLT5oZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKLQotICBvZmYgKz0gMTA7Ci0KLSAgc3VibGVuID0gZ2V0X3Jlc2lkICgmZC0+bWVudSwgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgb2ZmICs9IHN1YmxlbjsKLQotICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkLT5jbGFzcywgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgb2ZmICs9IHN1YmxlbjsKLQotICBkLT5jYXB0aW9uID0gZ2V0X3VuaWNvZGUgKGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbiwgJnN1Ymxlbik7Ci0gIG9mZiArPSBzdWJsZW4gKiAyICsgMjsKLQotICBpZiAoKGQtPnN0eWxlICYgRFNfU0VURk9OVCkgPT0gMCkKLSAgICB7Ci0gICAgICBkLT5wb2ludHNpemUgPSAwOwotICAgICAgZC0+Zm9udCA9IE5VTEw7Ci0gICAgICBpZiAoZC0+ZXggIT0gTlVMTCkKLQl7Ci0JICBkLT5leC0+d2VpZ2h0ID0gMDsKLQkgIGQtPmV4LT5pdGFsaWMgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobGVuZ3RoIDwgb2ZmICsgMikKLQl0b29zbWFsbCAoXygiZGlhbG9nIGZvbnQgcG9pbnQgc2l6ZSIpKTsKLQotICAgICAgZC0+cG9pbnRzaXplID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLSAgICAgIG9mZiArPSAyOwotCi0gICAgICBpZiAoZC0+ZXggIT0gTlVMTCkKLQl7Ci0JICBpZiAobGVuZ3RoIDwgb2ZmICsgNCkKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZ2V4IGZvbnQgaW5mb3JtYXRpb24iKSk7Ci0JICBkLT5leC0+d2VpZ2h0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmKTsKLQkgIGQtPmV4LT5pdGFsaWMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyAyKTsKLQkgIG9mZiArPSA0OwotCX0KLQotICAgICAgZC0+Zm9udCA9IGdldF91bmljb2RlIChkYXRhICsgb2ZmLCBsZW5ndGggLSBvZmYsIGJpZ19lbmRpYW4sICZzdWJsZW4pOwotICAgICAgb2ZmICs9IHN1YmxlbiAqIDIgKyAyOwotICAgIH0KLQotICBkLT5jb250cm9scyA9IE5VTEw7Ci0gIHBwID0gJmQtPmNvbnRyb2xzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkYzsKLSAgICAgIGludCBkYXRhbGVuOwotCi0gICAgICBvZmYgPSAob2ZmICsgMykgJn4gMzsKLQotICAgICAgZGMgPSAoc3RydWN0IGRpYWxvZ19jb250cm9sICopIHJlc19hbGxvYyAoc2l6ZW9mICpkYyk7Ci0KLSAgICAgIGlmIChkLT5leCA9PSBOVUxMKQotCXsKLQkgIGlmIChsZW5ndGggPCBvZmYgKyA4KQotCSAgICB0b29zbWFsbCAoXygiZGlhbG9nIGNvbnRyb2wiKSk7Ci0KLQkgIGRjLT5zdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0JICBkYy0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotCSAgZGMtPmhlbHAgPSAwOwotCSAgb2ZmICs9IDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZW5ndGggPCBvZmYgKyAxMikKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZ2V4IGNvbnRyb2wiKSk7Ci0JICBkYy0+aGVscCA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0JICBkYy0+ZXhzdHlsZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDQpOwotCSAgZGMtPnN0eWxlID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgOCk7Ci0JICBvZmYgKz0gMTI7Ci0JfQotCi0gICAgICBpZiAobGVuZ3RoIDwgb2ZmICsgMTApCi0JdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIikpOwotCi0gICAgICBkYy0+eCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZik7Ci0gICAgICBkYy0+eSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIG9mZiArIDIpOwotICAgICAgZGMtPndpZHRoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNCk7Ci0gICAgICBkYy0+aGVpZ2h0ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgNik7Ci0KLSAgICAgIGlmIChkLT5leCAhPSBOVUxMKQotICAgICAgICBkYy0+aWQgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYgKyA4KTsKLSAgICAgIGVsc2UKLSAgICAgICAgZGMtPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgb2ZmICsgOCk7Ci0KLSAgICAgIG9mZiArPSAxMCArIChkLT5leCAhPSBOVUxMID8gMiA6IDApOwotCi0gICAgICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkYy0+Y2xhc3MsIGRhdGEgKyBvZmYsIGxlbmd0aCAtIG9mZiwgYmlnX2VuZGlhbik7Ci0gICAgICBvZmYgKz0gc3VibGVuOwotCi0gICAgICBzdWJsZW4gPSBnZXRfcmVzaWQgKCZkYy0+dGV4dCwgZGF0YSArIG9mZiwgbGVuZ3RoIC0gb2ZmLCBiaWdfZW5kaWFuKTsKLSAgICAgIG9mZiArPSBzdWJsZW47Ci0KLSAgICAgIGlmIChsZW5ndGggPCBvZmYgKyAyKQotCXRvb3NtYWxsIChfKCJkaWFsb2cgY29udHJvbCBlbmQiKSk7Ci0KLSAgICAgIGRhdGFsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyBvZmYpOwotICAgICAgb2ZmICs9IDI7Ci0KLSAgICAgIGlmIChkYXRhbGVuID09IDApCi0JZGMtPmRhdGEgPSBOVUxMOwotICAgICAgZWxzZQotCXsKLQkgIG9mZiA9IChvZmYgKyAzKSAmfiAzOwotCi0JICBpZiAobGVuZ3RoIDwgb2ZmICsgZGF0YWxlbikKLQkgICAgdG9vc21hbGwgKF8oImRpYWxvZyBjb250cm9sIGRhdGEiKSk7Ci0KLQkgIGRjLT5kYXRhID0gKChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikKLQkJICAgICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCByY2RhdGFfaXRlbSkpKTsKLQkgIGRjLT5kYXRhLT5uZXh0ID0gTlVMTDsKLQkgIGRjLT5kYXRhLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKLQkgIGRjLT5kYXRhLT51LmJ1ZmZlci5sZW5ndGggPSBkYXRhbGVuOwotCSAgZGMtPmRhdGEtPnUuYnVmZmVyLmRhdGEgPSBkYXRhICsgb2ZmOwotCi0JICBvZmYgKz0gZGF0YWxlbjsJICAKLQl9Ci0KLSAgICAgIGRjLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGRjOwotICAgICAgcHAgPSAmZGMtPm5leHQ7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9ESUFMT0c7Ci0gIHItPnUuZGlhbG9nID0gZDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIHN0cmluZ3RhYmxlIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19zdHJpbmcgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0OwotICBpbnQgaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBzdCA9IChzdHJ1Y3Qgc3RyaW5ndGFibGUgKikgcmVzX2FsbG9jIChzaXplb2YgKnN0KTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2xlbjsKLQotICAgICAgaWYgKGxlbmd0aCA8IDIpCi0JdG9vc21hbGwgKF8oInN0cmluZ3RhYmxlIHN0cmluZyBsZW5ndGgiKSk7Ci0gICAgICBzbGVuID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIHN0LT5zdHJpbmdzW2ldLmxlbmd0aCA9IHNsZW47Ci0KLSAgICAgIGlmIChzbGVuID4gMCkKLQl7Ci0JICB1bmljaGFyICpzOwotCSAgdW5zaWduZWQgaW50IGo7Ci0KLQkgIGlmIChsZW5ndGggPCAyICsgMiAqIHNsZW4pCi0JICAgIHRvb3NtYWxsIChfKCJzdHJpbmd0YWJsZSBzdHJpbmciKSk7Ci0KLQkgIHMgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKHNsZW4gKiBzaXplb2YgKHVuaWNoYXIpKTsKLQkgIHN0LT5zdHJpbmdzW2ldLnN0cmluZyA9IHM7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBzbGVuOyBqKyspCi0JICAgIHNbal0gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyICsgaiAqIDIpOwotCX0KLQotICAgICAgZGF0YSArPSAyICsgMiAqIHNsZW47Ci0gICAgICBsZW5ndGggLT0gMiArIDIgKiBzbGVuOwotICAgIH0KLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfU1RSSU5HVEFCTEU7Ci0gIHItPnUuc3RyaW5ndGFibGUgPSBzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGZvbnRkaXIgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2ZvbnRkaXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgYywgaTsKLSAgc3RydWN0IGZvbnRkaXIgKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCAyKQotICAgIHRvb3NtYWxsIChfKCJmb250ZGlyIGhlYWRlciIpKTsKLQotICBjID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgc3RydWN0IGZvbnRkaXIgKmZkOwotICAgICAgdW5zaWduZWQgaW50IG9mZjsKLQotICAgICAgaWYgKGxlbmd0aCA8IDU2KQotCXRvb3NtYWxsIChfKCJmb250ZGlyIikpOwotCi0gICAgICBmZCA9IChzdHJ1Y3QgZm9udGRpciAqKSByZXNfYWxsb2MgKHNpemVvZiAqZmQpOwotICAgICAgZmQtPmluZGV4ID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQotICAgICAgLyogVG8gd29yayBvdXQgdGhlIGxlbmd0aCBvZiB0aGUgZm9udGRpciBkYXRhLCB3ZSBtdXN0IGdldCB0aGUKLSAgICAgICAgIGxlbmd0aCBvZiB0aGUgZGV2aWNlIG5hbWUgYW5kIGZhY2UgbmFtZSBzdHJpbmdzLCBldmVuIHRob3VnaAotICAgICAgICAgd2UgZG9uJ3Qgc3RvcmUgdGhlbSBpbiB0aGUgZm9udGRpciBzdHJ1Y3R1cmUuICBUaGUKLSAgICAgICAgIGRvY3VtZW50YXRpb24gc2F5cyB0aGF0IHRoZXNlIGFyZSBOVUxMIHRlcm1pbmF0ZWQgY2hhcgotICAgICAgICAgc3RyaW5ncywgbm90IFVuaWNvZGUgc3RyaW5ncy4gICovCi0KLSAgICAgIG9mZiA9IDU2OwotCi0gICAgICB3aGlsZSAob2ZmIDwgbGVuZ3RoICYmIGRhdGFbb2ZmXSAhPSAnXDAnKQotCSsrb2ZmOwotICAgICAgaWYgKG9mZiA+PSBsZW5ndGgpCi0JdG9vc21hbGwgKF8oImZvbnRkaXIgZGV2aWNlIG5hbWUiKSk7Ci0gICAgICArK29mZjsKLQotICAgICAgd2hpbGUgKG9mZiA8IGxlbmd0aCAmJiBkYXRhW29mZl0gIT0gJ1wwJykKLQkrK29mZjsKLSAgICAgIGlmIChvZmYgPj0gbGVuZ3RoKQotCXRvb3NtYWxsIChfKCJmb250ZGlyIGZhY2UgbmFtZSIpKTsKLSAgICAgICsrb2ZmOwotCi0gICAgICBmZC0+bGVuZ3RoID0gb2ZmOwotICAgICAgZmQtPmRhdGEgPSBkYXRhOwotCi0gICAgICBmZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBmZDsKLSAgICAgIHBwID0gJmZkLT5uZXh0OwotCi0gICAgICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGFueSByb3VuZGluZyBpcwotICAgICAgICAgcmVxdWlyZWQuICAqLwotCi0gICAgICBkYXRhICs9IG9mZjsKLSAgICAgIGxlbmd0aCAtPSBvZmY7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9GT05URElSOwotICByLT51LmZvbnRkaXIgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhbiBhY2NlbGVyYXRvcnMgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2FjY2VsZXJhdG9ycyAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBhY2NlbGVyYXRvciAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmE7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA4KQotCXRvb3NtYWxsIChfKCJhY2NlbGVyYXRvciIpKTsKLQotICAgICAgYSA9IChzdHJ1Y3QgYWNjZWxlcmF0b3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmEpOwotCi0gICAgICBhLT5mbGFncyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSk7Ci0gICAgICBhLT5rZXkgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGEtPmlkID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0KLSAgICAgIGEtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gYTsKLSAgICAgIHBwID0gJmEtPm5leHQ7Ci0KLSAgICAgIGlmICgoYS0+ZmxhZ3MgJiBBQ0NfTEFTVCkgIT0gMCkKLQlicmVhazsKLQotICAgICAgZGF0YSArPSA4OwotICAgICAgbGVuZ3RoIC09IDg7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjsKLSAgci0+dS5hY2MgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhbiByY2RhdGEgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3JjZGF0YSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCByY2RhdGFfaXRlbSAqcmk7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgcmkgPSAoc3RydWN0IHJjZGF0YV9pdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICpyaSk7Ci0KLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IFJDREFUQV9CVUZGRVI7Ci0gIHJpLT51LmJ1ZmZlci5sZW5ndGggPSBsZW5ndGg7Ci0gIHJpLT51LmJ1ZmZlci5kYXRhID0gZGF0YTsKLQotICByID0gKHN0cnVjdCByZXNfcmVzb3VyY2UgKikgcmVzX2FsbG9jIChzaXplb2YgKnIpOwotICByLT50eXBlID0gUkVTX1RZUEVfUkNEQVRBOwotICByLT51LnJjZGF0YSA9IHJpOwotCi0gIHJldHVybiByOwotfQotCi0vKiBDb252ZXJ0IGEgZ3JvdXAgY3Vyc29yIHJlc291cmNlIGZyb20gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotYmluX3RvX3Jlc19ncm91cF9jdXJzb3IgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdHlwZSwgYywgaTsKLSAgc3RydWN0IGdyb3VwX2N1cnNvciAqZmlyc3QsICoqcHA7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgaWYgKGxlbmd0aCA8IDYpCi0gICAgdG9vc21hbGwgKF8oImdyb3VwIGN1cnNvciBoZWFkZXIiKSk7Ci0KLSAgdHlwZSA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotICBpZiAodHlwZSAhPSAyKQotICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIGdyb3VwIGN1cnNvciB0eXBlICVkIiksIHR5cGUpOwotCi0gIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLQotICBkYXRhICs9IDY7Ci0gIGxlbmd0aCAtPSA2OwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpnYzsKLQotICAgICAgaWYgKGxlbmd0aCA8IDE0KQotCXRvb3NtYWxsIChfKCJncm91cCBjdXJzb3IiKSk7Ci0KLSAgICAgIGdjID0gKHN0cnVjdCBncm91cF9jdXJzb3IgKikgcmVzX2FsbG9jIChzaXplb2YgKmdjKTsKLQotICAgICAgZ2MtPndpZHRoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLSAgICAgIGdjLT5oZWlnaHQgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAyKTsKLSAgICAgIGdjLT5wbGFuZXMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGdjLT5iaXRzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNik7Ci0gICAgICBnYy0+Ynl0ZXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGdjLT5pbmRleCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDEyKTsKLQotICAgICAgZ2MtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZ2M7Ci0gICAgICBwcCA9ICZnYy0+bmV4dDsKLQotICAgICAgZGF0YSArPSAxNDsKLSAgICAgIGxlbmd0aCAtPSAxNDsKLSAgICB9Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0dST1VQX0NVUlNPUjsKLSAgci0+dS5ncm91cF9jdXJzb3IgPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogQ29udmVydCBhIGdyb3VwIGljb24gcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX2dyb3VwX2ljb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdHlwZSwgYywgaTsKLSAgc3RydWN0IGdyb3VwX2ljb24gKmZpcnN0LCAqKnBwOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlmIChsZW5ndGggPCA2KQotICAgIHRvb3NtYWxsIChfKCJncm91cCBpY29uIGhlYWRlciIpKTsKLQotICB0eXBlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gIGlmICh0eXBlICE9IDEpCi0gICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgZ3JvdXAgaWNvbiB0eXBlICVkIiksIHR5cGUpOwotCi0gIGMgPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLQotICBkYXRhICs9IDY7Ci0gIGxlbmd0aCAtPSA2OwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgICAgIGlmIChsZW5ndGggPCAxNCkKLQl0b29zbWFsbCAoXygiZ3JvdXAgaWNvbiIpKTsKLQotICAgICAgZ2kgPSAoc3RydWN0IGdyb3VwX2ljb24gKikgcmVzX2FsbG9jIChzaXplb2YgKmdpKTsKLQotICAgICAgZ2ktPndpZHRoID0gZGF0YVswXTsKLSAgICAgIGdpLT5oZWlnaHQgPSBkYXRhWzFdOwotICAgICAgZ2ktPmNvbG9ycyA9IGRhdGFbMl07Ci0gICAgICBnaS0+cGxhbmVzID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0gICAgICBnaS0+Yml0cyA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDYpOwotICAgICAgZ2ktPmJ5dGVzID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgOCk7Ci0gICAgICBnaS0+aW5kZXggPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7Ci0KLSAgICAgIGdpLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGdpOwotICAgICAgcHAgPSAmZ2ktPm5leHQ7Ci0KLSAgICAgIGRhdGEgKz0gMTQ7Ci0gICAgICBsZW5ndGggLT0gMTQ7Ci0gICAgfQotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9HUk9VUF9JQ09OOwotICByLT51Lmdyb3VwX2ljb24gPSBmaXJzdDsKLQotICByZXR1cm4gcjsKLX0KLQotLyogRXh0cmFjdCBkYXRhIGZyb20gYSB2ZXJzaW9uIGhlYWRlci4gIElmIEtFWSBpcyBub3QgTlVMTCwgdGhlbiB0aGUKLSAgIGtleSBtdXN0IGJlIEtFWTsgb3RoZXJ3aXNlLCB0aGUga2V5IGlzIHJldHVybmVkIGluICpQS0VZLiAgVGhpcwotICAgc2V0cyAqTEVOIHRvIHRoZSB0b3RhbCBsZW5ndGgsICpWQUxMRU4gdG8gdGhlIHZhbHVlIGxlbmd0aCwgKlRZUEUKLSAgIHRvIHRoZSB0eXBlLCBhbmQgKk9GRiB0byB0aGUgb2Zmc2V0IHRvIHRoZSBjaGlsZHJlbi4gICovCi0KLXN0YXRpYyB2b2lkCi1nZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwga2V5LCBwa2V5LCBsZW4sIHZhbGxlbiwgdHlwZSwKLQkJICAgIG9mZikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotICAgICBjb25zdCBjaGFyICprZXk7Ci0gICAgIHVuaWNoYXIgKipwa2V5OwotICAgICBpbnQgKmxlbjsKLSAgICAgaW50ICp2YWxsZW47Ci0gICAgIGludCAqdHlwZTsKLSAgICAgaW50ICpvZmY7Ci17Ci0gIGlmIChsZW5ndGggPCA4KQotICAgIHRvb3NtYWxsIChrZXkpOwotCi0gICpsZW4gPSBnZXRfMTYgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAqdmFsbGVuID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgMik7Ci0gICp0eXBlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNCk7Ci0KLSAgKm9mZiA9IDY7Ci0KLSAgbGVuZ3RoIC09IDY7Ci0gIGRhdGEgKz0gNjsKLQotICBpZiAoa2V5ID09IE5VTEwpCi0gICAgewotICAgICAgaW50IHN1YmxlbjsKLQotICAgICAgKnBrZXkgPSBnZXRfdW5pY29kZSAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAmc3VibGVuKTsKLSAgICAgICpvZmYgKz0gc3VibGVuICogMiArIDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaWYgKGxlbmd0aCA8IDIpCi0JICAgIHRvb3NtYWxsIChrZXkpOwotCSAgaWYgKGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSkgIT0gKHVuc2lnbmVkIGNoYXIpICprZXkpCi0JICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIikpOwotCi0JICAqb2ZmICs9IDI7Ci0JICBsZW5ndGggLT0gMjsKLQkgIGRhdGEgKz0gMjsKLQotCSAgaWYgKCprZXkgPT0gJ1wwJykKLQkgICAgYnJlYWs7Ci0KLQkgICsra2V5OwotCX0KLSAgICB9Ci0KLSAgKm9mZiA9ICgqb2ZmICsgMykgJn4gMzsKLX0KLQotLyogQ29udmVydCBhIHZlcnNpb24gcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3ZlcnNpb24gKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgdmVybGVuLCB2YWxsZW4sIHR5cGUsIG9mZjsKLSAgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaTsKLSAgc3RydWN0IHZlcl9pbmZvICpmaXJzdCwgKipwcDsKLSAgc3RydWN0IHZlcnNpb25pbmZvICp2OwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAiVlNfVkVSU0lPTl9JTkZPIiwKLQkJICAgICAgKHVuaWNoYXIgKikgTlVMTCwgJnZlcmxlbiwgJnZhbGxlbiwgJnR5cGUsICZvZmYpOwotCi0gIGlmICgodW5zaWduZWQgaW50KSB2ZXJsZW4gIT0gbGVuZ3RoKQotICAgIGZhdGFsIChfKCJ2ZXJzaW9uIGxlbmd0aCAlZCBkb2VzIG5vdCBtYXRjaCByZXNvdXJjZSBsZW5ndGggJWx1IiksCi0JICAgdmVybGVuLCBsZW5ndGgpOwotCi0gIGlmICh0eXBlICE9IDApCi0gICAgZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiB0eXBlICVkIiksIHR5cGUpOwotCi0gIGRhdGEgKz0gb2ZmOwotICBsZW5ndGggLT0gb2ZmOwotCi0gIGlmICh2YWxsZW4gPT0gMCkKLSAgICBmaSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIHNpZ25hdHVyZSwgZml2OwotCi0gICAgICBpZiAodmFsbGVuICE9IDUyKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24gbGVuZ3RoICVkIiksIHZhbGxlbik7Ci0KLSAgICAgIGlmIChsZW5ndGggPCA1MikKLQl0b29zbWFsbCAoXygiZml4ZWQgdmVyc2lvbiBpbmZvIikpOwotCi0gICAgICBzaWduYXR1cmUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEpOwotICAgICAgaWYgKHNpZ25hdHVyZSAhPSAweGZlZWYwNGJkKQotCWZhdGFsIChfKCJ1bmV4cGVjdGVkIGZpeGVkIHZlcnNpb24gc2lnbmF0dXJlICVsdSIpLCBzaWduYXR1cmUpOwotCi0gICAgICBmaXYgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0KTsKLSAgICAgIGlmIChmaXYgIT0gMCAmJiBmaXYgIT0gMHgxMDAwMCkKLQlmYXRhbCAoXygidW5leHBlY3RlZCBmaXhlZCB2ZXJzaW9uIGluZm8gdmVyc2lvbiAlbHUiKSwgZml2KTsKLQotICAgICAgZmkgPSAoc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICpmaSk7Ci0KLSAgICAgIGZpLT5maWxlX3ZlcnNpb25fbXMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA4KTsKLSAgICAgIGZpLT5maWxlX3ZlcnNpb25fbHMgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAxMik7Ci0gICAgICBmaS0+cHJvZHVjdF92ZXJzaW9uX21zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMTYpOwotICAgICAgZmktPnByb2R1Y3RfdmVyc2lvbl9scyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDIwKTsKLSAgICAgIGZpLT5maWxlX2ZsYWdzX21hc2sgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyAyNCk7Ci0gICAgICBmaS0+ZmlsZV9mbGFncyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDI4KTsKLSAgICAgIGZpLT5maWxlX29zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgMzIpOwotICAgICAgZmktPmZpbGVfdHlwZSA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDM2KTsKLSAgICAgIGZpLT5maWxlX3N1YnR5cGUgPSBnZXRfMzIgKGJpZ19lbmRpYW4sIGRhdGEgKyA0MCk7Ci0gICAgICBmaS0+ZmlsZV9kYXRlX21zID0gZ2V0XzMyIChiaWdfZW5kaWFuLCBkYXRhICsgNDQpOwotICAgICAgZmktPmZpbGVfZGF0ZV9scyA9IGdldF8zMiAoYmlnX2VuZGlhbiwgZGF0YSArIDQ4KTsKLQotICAgICAgZGF0YSArPSA1MjsKLSAgICAgIGxlbmd0aCAtPSA1MjsKLSAgICB9Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICB3aGlsZSAobGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZpOwotICAgICAgaW50IGNoOwotCi0gICAgICBpZiAobGVuZ3RoIDwgOCkKLQl0b29zbWFsbCAoXygidmVyc2lvbiB2YXIgaW5mbyIpKTsKLQotICAgICAgdmkgPSAoc3RydWN0IHZlcl9pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2aSk7Ci0KLSAgICAgIGNoID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhICsgNik7Ci0KLSAgICAgIGlmIChjaCA9PSAnUycpCi0JewotCSAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICoqcHB2czsKLQotCSAgdmktPnR5cGUgPSBWRVJJTkZPX1NUUklORzsKLQotCSAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICJTdHJpbmdGaWxlSW5mbyIsCi0JCQkgICAgICAodW5pY2hhciAqKSBOVUxMLCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwKLQkJCSAgICAgICZvZmYpOwotCi0JICBpZiAodmFsbGVuICE9IDApCi0JICAgIGZhdGFsIChfKCJ1bmV4cGVjdGVkIHN0cmluZ2ZpbGVpbmZvIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICBkYXRhICs9IG9mZjsKLQkgIGxlbmd0aCAtPSBvZmY7Ci0KLQkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJICAgICAgJnZpLT51LnN0cmluZy5sYW5ndWFnZSwgJnZlcmxlbiwgJnZhbGxlbiwKLQkJCSAgICAgICZ0eXBlLCAmb2ZmKTsKLQotCSAgaWYgKHZhbGxlbiAhPSAwKQotCSAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZ3RhYmxlIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICBkYXRhICs9IG9mZjsKLQkgIGxlbmd0aCAtPSBvZmY7Ci0JICB2ZXJsZW4gLT0gb2ZmOwotCi0JICB2aS0+dS5zdHJpbmcuc3RyaW5ncyA9IE5VTEw7Ci0JICBwcHZzID0gJnZpLT51LnN0cmluZy5zdHJpbmdzOwotCi0JICAvKiBJdCdzIGNvbnZlbmllbnQgdG8gcm91bmQgdmVybGVuIHRvIGEgNCBieXRlIGFsaWdubWVudCwKLSAgICAgICAgICAgICBzaW5jZSB3ZSByb3VuZCB0aGUgc3VidmFyaWFibGVzIGluIHRoZSBsb29wLiAgKi8KLQkgIHZlcmxlbiA9ICh2ZXJsZW4gKyAzKSAmfiAzOwotCi0JICB3aGlsZSAodmVybGVuID4gMCkKLQkgICAgewotCSAgICAgIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqdnM7Ci0JICAgICAgaW50IHN1YnZlcmxlbiwgdnNsZW4sIHZhbG9mZjsKLQotCSAgICAgIHZzID0gKHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnMpOwotCi0JICAgICAgZ2V0X3ZlcnNpb25faGVhZGVyIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sCi0JCQkJICAoY29uc3QgY2hhciAqKSBOVUxMLCAmdnMtPmtleSwgJnN1YnZlcmxlbiwKLQkJCQkgICZ2YWxsZW4sICZ0eXBlLCAmb2ZmKTsKLQotCSAgICAgIHN1YnZlcmxlbiA9IChzdWJ2ZXJsZW4gKyAzKSAmfiAzOwotCi0JICAgICAgZGF0YSArPSBvZmY7Ci0JICAgICAgbGVuZ3RoIC09IG9mZjsKLQotCSAgICAgIHZzLT52YWx1ZSA9IGdldF91bmljb2RlIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4sICZ2c2xlbik7Ci0JICAgICAgdmFsb2ZmID0gdnNsZW4gKiAyICsgMjsKLQkgICAgICB2YWxvZmYgPSAodmFsb2ZmICsgMykgJn4gMzsKLQotCSAgICAgIGlmIChvZmYgKyB2YWxvZmYgIT0gc3VidmVybGVuKQotCQlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHN0cmluZyBsZW5ndGggJWQgIT0gJWQgKyAlZCIpLAotCQkgICAgICAgc3VidmVybGVuLCBvZmYsIHZhbG9mZik7Ci0KLQkgICAgICB2cy0+bmV4dCA9IE5VTEw7Ci0JICAgICAgKnBwdnMgPSB2czsKLQkgICAgICBwcHZzID0gJnZzLT5uZXh0OwotCi0JICAgICAgZGF0YSArPSB2YWxvZmY7Ci0JICAgICAgbGVuZ3RoIC09IHZhbG9mZjsKLQotCSAgICAgIGlmICh2ZXJsZW4gPCBzdWJ2ZXJsZW4pCi0JCWZhdGFsIChfKCJ1bmV4cGVjdGVkIHZlcnNpb24gc3RyaW5nIGxlbmd0aCAlZCA8ICVkIiksCi0JCSAgICAgICB2ZXJsZW4sIHN1YnZlcmxlbik7Ci0KLQkgICAgICB2ZXJsZW4gLT0gc3VidmVybGVuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoY2ggPT0gJ1YnKQotCXsKLQkgIHN0cnVjdCB2ZXJfdmFyaW5mbyAqKnBwdnY7Ci0KLQkgIHZpLT50eXBlID0gVkVSSU5GT19WQVI7Ci0KLQkgIGdldF92ZXJzaW9uX2hlYWRlciAoZGF0YSwgbGVuZ3RoLCBiaWdfZW5kaWFuLCAiVmFyRmlsZUluZm8iLAotCQkJICAgICAgKHVuaWNoYXIgKikgTlVMTCwgJnZlcmxlbiwgJnZhbGxlbiwgJnR5cGUsCi0JCQkgICAgICAmb2ZmKTsKLQotCSAgaWYgKHZhbGxlbiAhPSAwKQotCSAgICBmYXRhbCAoXygidW5leHBlY3RlZCB2YXJmaWxlaW5mbyB2YWx1ZSBsZW5ndGggJWQiKSwgdmFsbGVuKTsKLQotCSAgZGF0YSArPSBvZmY7Ci0JICBsZW5ndGggLT0gb2ZmOwotCi0JICBnZXRfdmVyc2lvbl9oZWFkZXIgKGRhdGEsIGxlbmd0aCwgYmlnX2VuZGlhbiwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCSAgICAgICZ2aS0+dS52YXIua2V5LCAmdmVybGVuLCAmdmFsbGVuLCAmdHlwZSwgJm9mZik7Ci0KLQkgIGRhdGEgKz0gb2ZmOwotCSAgbGVuZ3RoIC09IG9mZjsKLQotCSAgdmktPnUudmFyLnZhciA9IE5VTEw7Ci0JICBwcHZ2ID0gJnZpLT51LnZhci52YXI7Ci0KLQkgIHdoaWxlICh2YWxsZW4gPiAwKQotCSAgICB7Ci0JICAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2djsKLQotCSAgICAgIGlmIChsZW5ndGggPCA0KQotCQl0b29zbWFsbCAoXygidmVyc2lvbiB2YXJmaWxlaW5mbyIpKTsKLQotCSAgICAgIHZ2ID0gKHN0cnVjdCB2ZXJfdmFyaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnYpOwotCi0JICAgICAgdnYtPmxhbmd1YWdlID0gZ2V0XzE2IChiaWdfZW5kaWFuLCBkYXRhKTsKLQkgICAgICB2di0+Y2hhcnNldCA9IGdldF8xNiAoYmlnX2VuZGlhbiwgZGF0YSArIDIpOwotCi0JICAgICAgdnYtPm5leHQgPSBOVUxMOwotCSAgICAgICpwcHZ2ID0gdnY7Ci0JICAgICAgcHB2diA9ICZ2di0+bmV4dDsKLQotCSAgICAgIGRhdGEgKz0gNDsKLQkgICAgICBsZW5ndGggLT0gNDsKLQotCSAgICAgIGlmICh2YWxsZW4gPCA0KQotCQlmYXRhbCAoXygidW5leHBlY3RlZCB2ZXJzaW9uIHZhbHVlIGxlbmd0aCAlZCIpLCB2YWxsZW4pOwotCi0JICAgICAgdmFsbGVuIC09IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JZmF0YWwgKF8oInVuZXhwZWN0ZWQgdmVyc2lvbiBzdHJpbmciKSk7Ci0KLSAgICAgIHZpLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IHZpOwotICAgICAgcHAgPSAmdmktPm5leHQ7ICAgICAgCi0gICAgfQotCi0gIHYgPSAoc3RydWN0IHZlcnNpb25pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2KTsKLSAgdi0+Zml4ZWQgPSBmaTsKLSAgdi0+dmFyID0gZmlyc3Q7Ci0KLSAgciA9IChzdHJ1Y3QgcmVzX3Jlc291cmNlICopIHJlc19hbGxvYyAoc2l6ZW9mICpyKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX1ZFUlNJT05JTkZPOwotICByLT51LnZlcnNpb25pbmZvID0gdjsKLQotICByZXR1cm4gcjsgIAotfQotCi0vKiBDb252ZXJ0IGFuIGFyYml0cmFyeSB1c2VyIGRlZmluZWQgcmVzb3VyY2UgZnJvbSBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqCi1iaW5fdG9fcmVzX3VzZXJkYXRhIChkYXRhLCBsZW5ndGgsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLQotICByaS0+bmV4dCA9IE5VTEw7Ci0gIHJpLT50eXBlID0gUkNEQVRBX0JVRkZFUjsKLSAgcmktPnUuYnVmZmVyLmxlbmd0aCA9IGxlbmd0aDsKLSAgcmktPnUuYnVmZmVyLmRhdGEgPSBkYXRhOwotCi0gIHIgPSAoc3RydWN0IHJlc19yZXNvdXJjZSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcik7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9VU0VSREFUQTsKLSAgci0+dS5yY2RhdGEgPSByaTsKLQotICByZXR1cm4gcjsKLX0KLQwKLS8qIE1hY3JvcyB0byBzd2FwIG91dCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIHB1dF8xNihiZSwgdiwgcykgKChiZSkgPyBiZmRfcHV0YjE2ICgodiksIChzKSkgOiBiZmRfcHV0bDE2ICgodiksIChzKSkpCi0jZGVmaW5lIHB1dF8zMihiZSwgdiwgcykgKChiZSkgPyBiZmRfcHV0YjMyICgodiksIChzKSkgOiBiZmRfcHV0bDMyICgodiksIChzKSkpCi0KLS8qIExvY2FsIGZ1bmN0aW9ucyB1c2VkIHRvIGNvbnZlcnQgcmVzb3VyY2VzIHRvIGJpbmFyeSBmb3JtYXQuICAqLwotCi1zdGF0aWMgdm9pZCBkd29yZF9hbGlnbl9iaW4gUEFSQU1TICgoc3RydWN0IGJpbmRhdGEgKioqLCB1bnNpZ25lZCBsb25nICopKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzaWRfdG9fYmluIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICp1bmljb2RlX3RvX2JpbiBQQVJBTVMgKChjb25zdCB1bmljaGFyICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2FjY2VsZXJhdG9yCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9jdXJzb3IKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGN1cnNvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9ncm91cF9jdXJzb3IKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9kaWFsb2cKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGRpYWxvZyAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9mb250ZGlyCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBmb250ZGlyICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2dyb3VwX2ljb24KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGdyb3VwX2ljb24gKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fbWVudQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWVudSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9tZW51aXRlbXMKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnVpdGVtICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX21lbnVleGl0ZW1zCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqcmVzX3RvX2Jpbl9yY2RhdGEKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX3N0cmluZ3RhYmxlCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqLCBpbnQpKTsKLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqc3RyaW5nX3RvX3VuaWNvZGVfYmluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW5fdmVyc2lvbmluZm8KLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHZlcnNpb25pbmZvICosIGludCkpOwotc3RhdGljIHN0cnVjdCBiaW5kYXRhICpyZXNfdG9fYmluX2dlbmVyaWMKLSAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci0KLS8qIENvbnZlcnQgYSByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluIChyZXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN3aXRjaCAocmVzLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBSRVNfVFlQRV9CSVRNQVA6Ci0gICAgY2FzZSBSRVNfVFlQRV9GT05UOgotICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2dlbmVyaWMgKHJlcy0+dS5kYXRhLmxlbmd0aCwgcmVzLT51LmRhdGEuZGF0YSk7Ci0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2FjY2VsZXJhdG9yIChyZXMtPnUuYWNjLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKLSAgICAgIHJldHVybiByZXNfdG9fYmluX2N1cnNvciAocmVzLT51LmN1cnNvciwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9ncm91cF9jdXJzb3IgKHJlcy0+dS5ncm91cF9jdXJzb3IsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZGlhbG9nIChyZXMtPnUuZGlhbG9nLCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX0ZPTlRESVI6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9mb250ZGlyIChyZXMtPnUuZm9udGRpciwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9JQ09OOgotICAgICAgcmV0dXJuIHJlc190b19iaW5fZ3JvdXBfaWNvbiAocmVzLT51Lmdyb3VwX2ljb24sIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfTUVOVToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX21lbnUgKHJlcy0+dS5tZW51LCBiaWdfZW5kaWFuKTsKLSAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX3JjZGF0YSAocmVzLT51LnJjZGF0YSwgYmlnX2VuZGlhbik7Ci0gICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLSAgICAgIHJldHVybiByZXNfdG9fYmluX3N0cmluZ3RhYmxlIChyZXMtPnUuc3RyaW5ndGFibGUsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl9yY2RhdGEgKHJlcy0+dS5yY2RhdGEsIGJpZ19lbmRpYW4pOwotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICByZXR1cm4gcmVzX3RvX2Jpbl92ZXJzaW9uaW5mbyAocmVzLT51LnZlcnNpb25pbmZvLCBiaWdfZW5kaWFuKTsKLSAgICB9Ci19Ci0KLS8qIEFsaWduIHRvIGEgMzIgYml0IGJvdW5kYXJ5LiAgUFBQIHBvaW50cyB0byB0aGUgb2YgYSBsaXN0IG9mIGJpbmRhdGEKLSAgIHN0cnVjdHVyZXMuICBMRU5HVEggcG9pbnRzIHRvIHRoZSBsZW5ndGggb2YgdGhlIHN0cnVjdHVyZXMuICBJZgotICAgbmVjZXNzYXJ5LCB0aGlzIGFkZHMgYSBuZXcgYmluZGF0YSB0byBicmluZyBsZW5ndGggdXAgdG8gYSAzMiBiaXQKLSAgIGJvdW5kYXJ5LiAgSXQgdXBkYXRlcyAqUFBQIGFuZCAqTEVOR1RILiAgKi8KLQotc3RhdGljIHZvaWQKLWR3b3JkX2FsaWduX2JpbiAocHBwLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBiaW5kYXRhICoqKnBwcDsKLSAgICAgdW5zaWduZWQgbG9uZyAqbGVuZ3RoOwotewotICBpbnQgYWRkOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBpZiAoKCpsZW5ndGggJiAzKSA9PSAwKQotICAgIHJldHVybjsKLQotICBhZGQgPSA0IC0gKCpsZW5ndGggJiAzKTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBhZGQ7Ci0gIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoYWRkKTsKLSAgbWVtc2V0IChkLT5kYXRhLCAwLCBhZGQpOwotCi0gIGQtPm5leHQgPSBOVUxMOwotICAqKnBwcCA9IGQ7Ci0gICpwcHAgPSAmKCoqcHBwKS0+bmV4dDsKLQotICAqbGVuZ3RoICs9IGFkZDsKLX0KLQotLyogQ29udmVydCBhIHJlc291cmNlIElEIHRvIGJpbmFyeS4gIFRoaXMgYWx3YXlzIHJldHVybnMgZXhhY3RseSBvbmUKLSAgIGJpbmRhdGEgc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc2lkX3RvX2JpbiAoaWQsIGJpZ19lbmRpYW4pCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCi0gIGlmICghIGlkLm5hbWVkKQotICAgIHsKLSAgICAgIGQtPmxlbmd0aCA9IDQ7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAweGZmZmYsIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBpZC51LmlkLCBkLT5kYXRhICsgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGQtPmxlbmd0aCA9IGlkLnUubi5sZW5ndGggKiAyICsgMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBpZC51Lm4ubGVuZ3RoOyBpKyspCi0JcHV0XzE2IChiaWdfZW5kaWFuLCBpZC51Lm4ubmFtZVtpXSwgZC0+ZGF0YSArIGkgKiAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIGkgKiAyKTsKLSAgICB9Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7Ci19Ci0KLS8qIENvbnZlcnQgYSBudWxsIHRlcm1pbmF0ZWQgdW5pY29kZSBzdHJpbmcgdG8gYmluYXJ5LiAgVGhpcyBhbHdheXMKLSAgIHJldHVybnMgZXhhY3RseSBvbmUgYmluZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotdW5pY29kZV90b19iaW4gKHN0ciwgYmlnX2VuZGlhbikKLSAgICAgY29uc3QgdW5pY2hhciAqc3RyOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgaW50IGxlbjsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgbGVuID0gMDsKLSAgaWYgKHN0ciAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IHVuaWNoYXIgKnM7Ci0KLSAgICAgIGZvciAocyA9IHN0cjsgKnMgIT0gMDsgcysrKQotCSsrbGVuOwotICAgIH0KLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBsZW4gKiAyICsgMjsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGlmIChzdHIgPT0gTlVMTCkKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgdW5pY2hhciAqczsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKHMgPSBzdHIsIGkgPSAwOyAqcyAhPSAwOyBzKyssIGkrKykKLQlwdXRfMTYgKGJpZ19lbmRpYW4sICpzLCBkLT5kYXRhICsgaSAqIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgaSAqIDIpOwotICAgIH0KLQotICBkLT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsKLX0KLQotLyogQ29udmVydCBhbiBhY2NlbGVyYXRvciByZXNvdXJjZSB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9hY2NlbGVyYXRvciAoYWNjZWxlcmF0b3JzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmFjY2VsZXJhdG9yczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgY29uc3Qgc3RydWN0IGFjY2VsZXJhdG9yICphOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChhID0gYWNjZWxlcmF0b3JzOyBhICE9IE5VTEw7IGEgPSBhLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gODsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoOCk7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwKLQkgICAgICBhLT5mbGFncyB8IChhLT5uZXh0ICE9IE5VTEwgPyAwIDogQUNDX0xBU1QpLAotCSAgICAgIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBhLT5rZXksIGQtPmRhdGEgKyAyKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgYS0+aWQsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIDgpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBjdXJzb3IgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fY3Vyc29yIChjLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgY3Vyc29yICpjOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgZC0+bGVuZ3RoID0gNDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg0KTsKLQotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGMtPnhob3RzcG90LCBkLT5kYXRhKTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLT55aG90c3BvdCwgZC0+ZGF0YSArIDIpOwotCi0gIGQtPm5leHQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPm5leHQtPmxlbmd0aCA9IGMtPmxlbmd0aDsKLSAgZC0+bmV4dC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGMtPmRhdGE7Ci0gIGQtPm5leHQtPm5leHQgPSBOVUxMOwotCi0gIHJldHVybiBkOwotfQotCi0vKiBDb252ZXJ0IGEgZ3JvdXAgY3Vyc29yIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dyb3VwX2N1cnNvciAoZ3JvdXBfY3Vyc29ycywgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IGdyb3VwX2N1cnNvciAqZ3JvdXBfY3Vyc29yczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgaW50IGM7Ci0gIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdjOwotCi0gIGZpcnN0ID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmZpcnN0KTsKLSAgZmlyc3QtPmxlbmd0aCA9IDY7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIDIsIGZpcnN0LT5kYXRhICsgMik7Ci0KLSAgZmlyc3QtPm5leHQgPSBOVUxMOwotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICBjID0gMDsKLSAgZm9yIChnYyA9IGdyb3VwX2N1cnNvcnM7IGdjICE9IE5VTEw7IGdjID0gZ2MtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDE0OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxNCk7Ci0KLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPndpZHRoLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2MtPmhlaWdodCwgZC0+ZGF0YSArIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+cGxhbmVzLCBkLT5kYXRhICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdjLT5iaXRzLCBkLT5kYXRhICsgNik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGdjLT5ieXRlcywgZC0+ZGF0YSArIDgpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBnYy0+aW5kZXgsIGQtPmRhdGEgKyAxMik7Ci0KLSAgICAgIGQtPm5leHQgPSBOVUxMOwotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYywgZmlyc3QtPmRhdGEgKyA0KTsKLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBkaWFsb2cgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZGlhbG9nIChkaWFsb2csIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIGludCBkaWFsb2dleDsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgaW50IG9mZiwgYzsKLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpkYzsKLQotICBkaWFsb2dleCA9IGV4dGVuZGVkX2RpYWxvZyAoZGlhbG9nKTsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSBkaWFsb2dleCA/IDI2IDogMTg7Ci0gIGZpcnN0LT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKGZpcnN0LT5sZW5ndGgpOwotCi0gIGxlbmd0aCA9IGZpcnN0LT5sZW5ndGg7Ci0KLSAgaWYgKCEgZGlhbG9nZXgpCi0gICAgewotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPnN0eWxlLCBmaXJzdC0+ZGF0YSk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXhzdHlsZSwgZmlyc3QtPmRhdGEgKyA0KTsKLSAgICAgIG9mZiA9IDg7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAxLCBmaXJzdC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDB4ZmZmZiwgZmlyc3QtPmRhdGEgKyAyKTsKLQotICAgICAgaWYgKGRpYWxvZy0+ZXggPT0gTlVMTCkKLQlwdXRfMzIgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhICsgNCk7Ci0gICAgICBlbHNlCi0JcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4LT5oZWxwLCBmaXJzdC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4c3R5bGUsIGZpcnN0LT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRpYWxvZy0+c3R5bGUsIGZpcnN0LT5kYXRhICsgMTIpOwotICAgICAgb2ZmID0gMTY7Ci0gICAgfQotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgZGlhbG9nLT54LCBmaXJzdC0+ZGF0YSArIG9mZiArIDIpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+eSwgZmlyc3QtPmRhdGEgKyBvZmYgKyA0KTsKLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPndpZHRoLCBmaXJzdC0+ZGF0YSArIG9mZiArIDYpOwotICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+aGVpZ2h0LCBmaXJzdC0+ZGF0YSArIG9mZiArIDgpOwotCi0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gICpwcCA9IHJlc2lkX3RvX2JpbiAoZGlhbG9nLT5tZW51LCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gICpwcCA9IHJlc2lkX3RvX2JpbiAoZGlhbG9nLT5jbGFzcywgYmlnX2VuZGlhbik7Ci0gIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAqcHAgPSB1bmljb2RlX3RvX2JpbiAoZGlhbG9nLT5jYXB0aW9uLCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gIGlmICgoZGlhbG9nLT5zdHlsZSAmIERTX1NFVEZPTlQpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSBkaWFsb2dleCA/IDYgOiAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+cG9pbnRzaXplLCBkLT5kYXRhKTsKLQotICAgICAgaWYgKGRpYWxvZ2V4KQotCXsKLQkgIGlmIChkaWFsb2ctPmV4ID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyAyKTsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEgKyA0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkaWFsb2ctPmV4LT53ZWlnaHQsIGQtPmRhdGEgKyAyKTsKLQkgICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRpYWxvZy0+ZXgtPml0YWxpYywgZC0+ZGF0YSArIDQpOwotCSAgICB9Ci0JfQotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gdW5pY29kZV90b19iaW4gKGRpYWxvZy0+Zm9udCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotICAgIH0KLQotICBjID0gMDsKLSAgZm9yIChkYyA9IGRpYWxvZy0+Y29udHJvbHM7IGRjICE9IE5VTEw7IGRjID0gZGMtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZGNvZmY7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gZGlhbG9nZXggPyAyNCA6IDE4OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotCi0gICAgICBpZiAoISBkaWFsb2dleCkKLQl7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5zdHlsZSwgZC0+ZGF0YSk7Ci0JICBwdXRfMzIgKGJpZ19lbmRpYW4sIGRjLT5leHN0eWxlLCBkLT5kYXRhICsgNCk7Ci0JICBkY29mZiA9IDg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmhlbHAsIGQtPmRhdGEpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+ZXhzdHlsZSwgZC0+ZGF0YSArIDQpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCBkYy0+c3R5bGUsIGQtPmRhdGEgKyA4KTsKLQkgIGRjb2ZmID0gMTI7Ci0JfQotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT54LCBkLT5kYXRhICsgZGNvZmYpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+eSwgZC0+ZGF0YSArIGRjb2ZmICsgMik7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT53aWR0aCwgZC0+ZGF0YSArIGRjb2ZmICsgNCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGRjLT5oZWlnaHQsIGQtPmRhdGEgKyBkY29mZiArIDYpOwotCi0gICAgICBpZiAoZGlhbG9nZXgpCi0gICAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZGMtPmlkLCBkLT5kYXRhICsgZGNvZmYgKyA4KTsKLSAgICAgIGVsc2UKLSAgICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBkYy0+aWQsIGQtPmRhdGEgKyBkY29mZiArIDgpOwotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gcmVzaWRfdG9fYmluIChkYy0+Y2xhc3MsIGJpZ19lbmRpYW4pOwotICAgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotICAgICAgKnBwID0gcmVzaWRfdG9fYmluIChkYy0+dGV4dCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7Ci0KLSAgICAgIGxlbmd0aCArPSAyOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICBpZiAoZGMtPmRhdGEgPT0gTlVMTCkKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgc3VibGVuOwotCi0JICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0KLQkgICpwcCA9IHJlc190b19iaW5fcmNkYXRhIChkYy0+ZGF0YSwgYmlnX2VuZGlhbik7Ci0JICBzdWJsZW4gPSAwOwotCSAgd2hpbGUgKCpwcCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3VibGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0JICAgIH0KLQotCSAgcHV0XzE2IChiaWdfZW5kaWFuLCBzdWJsZW4sIGQtPmRhdGEpOwotCi0JICBsZW5ndGggKz0gc3VibGVuOwotCX0KLSAgICB9Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgYywgZmlyc3QtPmRhdGEgKyBvZmYpOwotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIGZvbnRkaXIgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fZm9udGRpciAoZm9udGRpcnMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBmb250ZGlyICpmb250ZGlyczsKLSAgICAgaW50IGJpZ19lbmRpYW47Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpmaXJzdCwgKipwcDsKLSAgaW50IGM7Ci0gIGNvbnN0IHN0cnVjdCBmb250ZGlyICpmZDsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSAyOwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgyKTsKLQotICBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gIGMgPSAwOwotICBmb3IgKGZkID0gZm9udGRpcnM7IGZkICE9IE5VTEw7IGZkID0gZmQtPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDIpOwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGZkLT5pbmRleCwgZC0+ZGF0YSk7Ci0KLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gZmQtPmxlbmd0aDsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBmZC0+ZGF0YTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsgICAgICAKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSk7Ci0KLSAgcmV0dXJuIGZpcnN0OyAgCi19Ci0KLS8qIENvbnZlcnQgYSBncm91cCBpY29uIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dyb3VwX2ljb24gKGdyb3VwX2ljb25zLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ3JvdXBfaWNvbnM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGludCBjOwotICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgZmlyc3QgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZmlyc3QpOwotICBmaXJzdC0+bGVuZ3RoID0gNjsKLSAgZmlyc3QtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBmaXJzdC0+ZGF0YSk7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgZmlyc3QtPmRhdGEgKyAyKTsKLQotICBmaXJzdC0+bmV4dCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0LT5uZXh0OwotCi0gIGMgPSAwOwotICBmb3IgKGdpID0gZ3JvdXBfaWNvbnM7IGdpICE9IE5VTEw7IGdpID0gZ2ktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgICAgICsrYzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDE0OwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxNCk7Ci0KLSAgICAgIGQtPmRhdGFbMF0gPSBnaS0+d2lkdGg7Ci0gICAgICBkLT5kYXRhWzFdID0gZ2ktPmhlaWdodDsKLSAgICAgIGQtPmRhdGFbMl0gPSBnaS0+Y29sb3JzOwotICAgICAgZC0+ZGF0YVszXSA9IDA7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdpLT5wbGFuZXMsIGQtPmRhdGEgKyA0KTsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgZ2ktPmJpdHMsIGQtPmRhdGEgKyA2KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZ2ktPmJ5dGVzLCBkLT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIGdpLT5pbmRleCwgZC0+ZGF0YSArIDEyKTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBjLCBmaXJzdC0+ZGF0YSArIDQpOwotCi0gIHJldHVybiBmaXJzdDsKLX0KLQotLyogQ29udmVydCBhIG1lbnUgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fbWVudSAobWVudSwgYmlnX2VuZGlhbikKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBpbnQgbWVudWV4OwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLQotICBtZW51ZXggPSBleHRlbmRlZF9tZW51IChtZW51KTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBtZW51ZXggPyA4IDogNDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGlmICghIG1lbnVleCkKLSAgICB7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGQtPmRhdGEpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCBkLT5kYXRhICsgMik7Ci0KLSAgICAgIGQtPm5leHQgPSByZXNfdG9fYmluX21lbnVpdGVtcyAobWVudS0+aXRlbXMsIGJpZ19lbmRpYW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMSwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDQsIGQtPmRhdGEgKyAyKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWVudS0+aGVscCwgZC0+ZGF0YSArIDQpOwotCi0gICAgICBkLT5uZXh0ID0gcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAobWVudS0+aXRlbXMsIGJpZ19lbmRpYW4pOwotICAgIH0KLQotICByZXR1cm4gZDsKLX0KLQotLyogQ29udmVydCBtZW51IGl0ZW1zIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX21lbnVpdGVtcyAoaXRlbXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgZmlyc3QgPSBOVUxMOwotICBwcCA9ICZmaXJzdDsKLQotICBmb3IgKG1pID0gaXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZmxhZ3M7Ci0KLSAgICAgIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gICAgICBkLT5sZW5ndGggPSBtaS0+cG9wdXAgPT0gTlVMTCA/IDQgOiAyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gICAgICBmbGFncyA9IG1pLT50eXBlOwotICAgICAgaWYgKG1pLT5uZXh0ID09IE5VTEwpCi0JZmxhZ3MgfD0gTUVOVUlURU1fRU5ETUVOVTsKLSAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKLQlmbGFncyB8PSBNRU5VSVRFTV9QT1BVUDsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBmbGFncywgZC0+ZGF0YSk7Ci0KLSAgICAgIGlmIChtaS0+cG9wdXAgPT0gTlVMTCkKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIG1pLT5pZCwgZC0+ZGF0YSArIDIpOwotCi0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLQotICAgICAgKnBwID0gdW5pY29kZV90b19iaW4gKG1pLT50ZXh0LCBiaWdfZW5kaWFuKTsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgKnBwID0gcmVzX3RvX2Jpbl9tZW51aXRlbXMgKG1pLT5wb3B1cCwgYmlnX2VuZGlhbik7Ci0JICB3aGlsZSAoKnBwICE9IE5VTEwpCi0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IG1lbnVleCBpdGVtcyB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAoaXRlbXMsIGJpZ19lbmRpYW4pCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gICAgIGludCBiaWdfZW5kaWFuOwotewotICBzdHJ1Y3QgYmluZGF0YSAqZmlyc3QsICoqcHA7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgbGVuZ3RoID0gMDsKLQotICBmb3IgKG1pID0gaXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICBpbnQgZmxhZ3M7Ci0KLSAgICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDEyOwotICAgICAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICgxMik7Ci0KLSAgICAgIGxlbmd0aCArPSAxMjsKLQotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBtaS0+dHlwZSwgZC0+ZGF0YSk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIG1pLT5zdGF0ZSwgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBtaS0+aWQsIGQtPmRhdGEgKyA4KTsKLQotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKG1pLT5uZXh0ID09IE5VTEwpCi0JZmxhZ3MgfD0gMHg4MDsKLSAgICAgIGlmIChtaS0+cG9wdXAgIT0gTlVMTCkKLQlmbGFncyB8PSAxOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBmbGFncywgZC0+ZGF0YSArIDEwKTsKLQotICAgICAgKnBwID0gZDsKLSAgICAgIHBwID0gJmQtPm5leHQ7Ci0KLSAgICAgICpwcCA9IHVuaWNvZGVfdG9fYmluIChtaS0+dGV4dCwgYmlnX2VuZGlhbik7Ci0gICAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCi0JICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCSAgZC0+bGVuZ3RoID0gNDsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNCk7Ci0KLQkgIHB1dF8zMiAoYmlnX2VuZGlhbiwgbWktPmhlbHAsIGQtPmRhdGEpOwotCi0JICAqcHAgPSBkOwotCSAgcHAgPSAmZC0+bmV4dDsKLQotCSAgKnBwID0gcmVzX3RvX2Jpbl9tZW51ZXhpdGVtcyAobWktPnBvcHVwLCBiaWdfZW5kaWFuKTsKLQkgIHdoaWxlICgqcHAgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICAgIHBwID0gJigqcHApLT5uZXh0OwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYW4gcmNkYXRhIHJlc291cmNlIHRvIGJpbmFyeS4gIFRoaXMgaXMgYWxzbyB1c2VkIHRvIGNvbnZlcnQKLSAgIG90aGVyIGluZm9ybWF0aW9uIHdoaWNoIGhhcHBlbnMgdG8gYmUgc3RvcmVkIGluIHJjZGF0YV9pdGVtIGxpc3RzCi0gICB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotcmVzX3RvX2Jpbl9yY2RhdGEgKGl0ZW1zLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKml0ZW1zOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0KLSAgZm9yIChyaSA9IGl0ZW1zOyByaSAhPSBOVUxMOyByaSA9IHJpLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotCi0gICAgICBzd2l0Y2ggKHJpLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIFJDREFUQV9XT1JEOgotCSAgZC0+bGVuZ3RoID0gMjsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoMik7Ci0JICBwdXRfMTYgKGJpZ19lbmRpYW4sIHJpLT51LndvcmQsIGQtPmRhdGEpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9EV09SRDoKLQkgIGQtPmxlbmd0aCA9IDQ7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotCSAgcHV0XzMyIChiaWdfZW5kaWFuLCByaS0+dS5kd29yZCwgZC0+ZGF0YSk7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX1NUUklORzoKLQkgIGQtPmxlbmd0aCA9IHJpLT51LnN0cmluZy5sZW5ndGg7Ci0JICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmktPnUuc3RyaW5nLnM7Ci0JICBicmVhazsKLQotCWNhc2UgUkNEQVRBX1dTVFJJTkc6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQotCSAgICBkLT5sZW5ndGggPSByaS0+dS53c3RyaW5nLmxlbmd0aCAqIDI7Ci0JICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQkgICAgZm9yIChpID0gMDsgaSA8IHJpLT51LndzdHJpbmcubGVuZ3RoOyBpKyspCi0JICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCByaS0+dS53c3RyaW5nLndbaV0sIGQtPmRhdGEgKyBpICogMik7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSBSQ0RBVEFfQlVGRkVSOgotCSAgZC0+bGVuZ3RoID0gcmktPnUuYnVmZmVyLmxlbmd0aDsKLQkgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByaS0+dS5idWZmZXIuZGF0YTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpcnN0OwotfQotCi0vKiBDb252ZXJ0IGEgc3RyaW5ndGFibGUgcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fc3RyaW5ndGFibGUgKHN0LCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3RyaW5ndGFibGUgKnN0OwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICBpbnQgaTsKLQotICBmaXJzdCA9IE5VTEw7Ci0gIHBwID0gJmZpcnN0OwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIGludCBzbGVuLCBqOwotICAgICAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gICAgICB1bmljaGFyICpzOwotCi0gICAgICBzbGVuID0gc3QtPnN0cmluZ3NbaV0ubGVuZ3RoOwotICAgICAgcyA9IHN0LT5zdHJpbmdzW2ldLnN0cmluZzsKLQotICAgICAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLSAgICAgIGQtPmxlbmd0aCA9IDIgKyBzbGVuICogMjsKLSAgICAgIGQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoZC0+bGVuZ3RoKTsKLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCBzbGVuLCBkLT5kYXRhKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IHNsZW47IGorKykKLQlwdXRfMTYgKGJpZ19lbmRpYW4sIHNbal0sIGQtPmRhdGEgKyAyICsgaiAqIDIpOwotCi0gICAgICBkLT5uZXh0ID0gTlVMTDsKLSAgICAgICpwcCA9IGQ7Ci0gICAgICBwcCA9ICZkLT5uZXh0OyAgICAgIAotICAgIH0KLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYW4gQVNDSUkgc3RyaW5nIHRvIGEgdW5pY29kZSBiaW5hcnkgc3RyaW5nLiAgVGhpcyBhbHdheXMKLSAgIHJldHVybnMgZXhhY3RseSBvbmUgYmluZGF0YSBzdHJ1Y3R1cmUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJpbmRhdGEgKgotc3RyaW5nX3RvX3VuaWNvZGVfYmluIChzLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBjaGFyICpzOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc2l6ZV90IGxlbiwgaTsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgbGVuID0gc3RybGVuIChzKTsKLQotICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICBkLT5sZW5ndGggPSBsZW4gKiAyICsgMjsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChkLT5sZW5ndGgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIHNbaV0sIGQtPmRhdGEgKyBpICogMik7Ci0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZC0+ZGF0YSArIGkgKiAyKTsKLQotICBkLT5uZXh0ID0gTlVMTDsKLQotICByZXR1cm4gZDsgIAotfQotCi0vKiBDb252ZXJ0IGEgdmVyc2lvbmluZm8gcmVzb3VyY2UgdG8gYmluYXJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCBiaW5kYXRhICoKLXJlc190b19iaW5fdmVyc2lvbmluZm8gKHZlcnNpb25pbmZvLCBiaWdfZW5kaWFuKQotICAgICBjb25zdCBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOwotICAgICBpbnQgYmlnX2VuZGlhbjsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmZpcnN0LCAqKnBwOwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgc3RydWN0IHZlcl9pbmZvICp2aTsKLQotICBmaXJzdCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpmaXJzdCk7Ci0gIGZpcnN0LT5sZW5ndGggPSA2OwotICBmaXJzdC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotICBsZW5ndGggPSA2OwotCi0gIGlmICh2ZXJzaW9uaW5mby0+Zml4ZWQgPT0gTlVMTCkKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIGZpcnN0LT5kYXRhICsgMik7Ci0gIGVsc2UKLSAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDUyLCBmaXJzdC0+ZGF0YSArIDIpOwotCi0gIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgZmlyc3QtPmRhdGEgKyA0KTsKLQotICBwcCA9ICZmaXJzdC0+bmV4dDsKLQotICAqcHAgPSBzdHJpbmdfdG9fdW5pY29kZV9iaW4gKCJWU19WRVJTSU9OX0lORk8iLCBiaWdfZW5kaWFuKTsKLSAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0gIHBwID0gJigqcHApLT5uZXh0OwotCi0gIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICBpZiAodmVyc2lvbmluZm8tPmZpeGVkICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICpmaTsKLSAgICAgIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gICAgICBkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKmQpOwotICAgICAgZC0+bGVuZ3RoID0gNTI7Ci0gICAgICBkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDUyKTsKLQotICAgICAgbGVuZ3RoICs9IDUyOwotCi0gICAgICBmaSA9IHZlcnNpb25pbmZvLT5maXhlZDsKLQotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCAweGZlZWYwNGJkLCBkLT5kYXRhKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgMHgxMDAwMCwgZC0+ZGF0YSArIDQpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV92ZXJzaW9uX21zLCBkLT5kYXRhICsgOCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX3ZlcnNpb25fbHMsIGQtPmRhdGEgKyAxMik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5wcm9kdWN0X3ZlcnNpb25fbXMsIGQtPmRhdGEgKyAxNik7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5wcm9kdWN0X3ZlcnNpb25fbHMsIGQtPmRhdGEgKyAyMCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX2ZsYWdzX21hc2ssIGQtPmRhdGEgKyAyNCk7Ci0gICAgICBwdXRfMzIgKGJpZ19lbmRpYW4sIGZpLT5maWxlX2ZsYWdzLCBkLT5kYXRhICsgMjgpOwotICAgICAgcHV0XzMyIChiaWdfZW5kaWFuLCBmaS0+ZmlsZV9vcywgZC0+ZGF0YSArIDMyKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfdHlwZSwgZC0+ZGF0YSArIDM2KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfc3VidHlwZSwgZC0+ZGF0YSArIDQwKTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZGF0ZV9tcywgZC0+ZGF0YSArIDQ0KTsKLSAgICAgIHB1dF8zMiAoYmlnX2VuZGlhbiwgZmktPmZpbGVfZGF0ZV9scywgZC0+ZGF0YSArIDQ4KTsKLQotICAgICAgZC0+bmV4dCA9IE5VTEw7Ci0gICAgICAqcHAgPSBkOwotICAgICAgcHAgPSAmZC0+bmV4dDsKLSAgICB9Ci0KLSAgZm9yICh2aSA9IHZlcnNpb25pbmZvLT52YXI7IHZpICE9IE5VTEw7IHZpID0gdmktPm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGJpbmRhdGEgKnZpZDsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmlsZW47Ci0KLSAgICAgIGR3b3JkX2FsaWduX2JpbiAoJnBwLCAmbGVuZ3RoKTsKLQotICAgICAgdmlkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZpZCk7Ci0gICAgICB2aWQtPmxlbmd0aCA9IDY7Ci0gICAgICB2aWQtPmRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXN3cl9hbGxvYyAoNik7Ci0KLSAgICAgIGxlbmd0aCArPSA2OwotICAgICAgdmlsZW4gPSA2OwotCi0gICAgICBwdXRfMTYgKGJpZ19lbmRpYW4sIDAsIHZpZC0+ZGF0YSArIDIpOwotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2aWQtPmRhdGEgKyA0KTsKLQotICAgICAgKnBwID0gdmlkOwotICAgICAgcHAgPSAmdmlkLT5uZXh0OwotCi0gICAgICBzd2l0Y2ggKHZpLT50eXBlKQotCXsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0KLQljYXNlIFZFUklORk9fU1RSSU5HOgotCSAgewotCSAgICB1bnNpZ25lZCBsb25nIGhvbGQsIHZzbGVuOwotCSAgICBzdHJ1Y3QgYmluZGF0YSAqdnNkOwotCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzOwotCi0JICAgICpwcCA9IHN0cmluZ190b191bmljb2RlX2JpbiAoIlN0cmluZ0ZpbGVJbmZvIiwgYmlnX2VuZGlhbik7Ci0JICAgIGxlbmd0aCArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICB2aWxlbiArPSAoKnBwKS0+bGVuZ3RoOwotCSAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLQotCSAgICBob2xkID0gbGVuZ3RoOwotCSAgICBkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JICAgIHZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkgICAgdnNkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZzZCk7Ci0JICAgIHZzZC0+bGVuZ3RoID0gNjsKLQkgICAgdnNkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDYpOwotCi0JICAgIGxlbmd0aCArPSA2OwotCSAgICB2aWxlbiArPSA2OwotCSAgICB2c2xlbiA9IDY7Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2c2QtPmRhdGEgKyAyKTsKLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCAwLCB2c2QtPmRhdGEgKyA0KTsKLQotCSAgICAqcHAgPSB2c2Q7Ci0JICAgIHBwID0gJnZzZC0+bmV4dDsKLQotCSAgICAqcHAgPSB1bmljb2RlX3RvX2JpbiAodmktPnUuc3RyaW5nLmxhbmd1YWdlLCBiaWdfZW5kaWFuKTsKLQkgICAgbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHZzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JICAgIHBwID0gJigqcHApLT5uZXh0OwotCi0JICAgIGZvciAodnMgPSB2aS0+dS5zdHJpbmcuc3RyaW5nczsgdnMgIT0gTlVMTDsgdnMgPSB2cy0+bmV4dCkKLQkgICAgICB7Ci0JCXN0cnVjdCBiaW5kYXRhICp2c3NkOwotCQl1bnNpZ25lZCBsb25nIHZzc2xlbjsKLQotCQlob2xkID0gbGVuZ3RoOwotCQlkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JCXZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0KLQkJdnNzZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2c3NkKTsKLQkJdnNzZC0+bGVuZ3RoID0gNjsKLQkJdnNzZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotCQlsZW5ndGggKz0gNjsKLQkJdmlsZW4gKz0gNjsKLQkJdnNsZW4gKz0gNjsKLQkJdnNzbGVuID0gNjsKLQotCQlwdXRfMTYgKGJpZ19lbmRpYW4sIDEsIHZzc2QtPmRhdGEgKyA0KTsKLQotCQkqcHAgPSB2c3NkOwotCQlwcCA9ICZ2c3NkLT5uZXh0OwotCi0JCSpwcCA9IHVuaWNvZGVfdG9fYmluICh2cy0+a2V5LCBiaWdfZW5kaWFuKTsKLQkJbGVuZ3RoICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZpbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXZzc2xlbiArPSAoKnBwKS0+bGVuZ3RoOwotCQlwcCA9ICYoKnBwKS0+bmV4dDsKLQotCQlob2xkID0gbGVuZ3RoOwotCQlkd29yZF9hbGlnbl9iaW4gKCZwcCwgJmxlbmd0aCk7Ci0JCXZpbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzbGVuICs9IGxlbmd0aCAtIGhvbGQ7Ci0JCXZzc2xlbiArPSBsZW5ndGggLSBob2xkOwotCi0JCSpwcCA9IHVuaWNvZGVfdG9fYmluICh2cy0+dmFsdWUsIGJpZ19lbmRpYW4pOwotIAkJcHV0XzE2IChiaWdfZW5kaWFuLCAoKnBwKS0+bGVuZ3RoIC8gMiwgdnNzZC0+ZGF0YSArIDIpOwotCQlsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkJdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJdnNsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkJdnNzbGVuICs9ICgqcHApLT5sZW5ndGg7Ci0JCXBwID0gJigqcHApLT5uZXh0OwotCi0JCXB1dF8xNiAoYmlnX2VuZGlhbiwgdnNzbGVuLCB2c3NkLT5kYXRhKTsKLQkgICAgICB9Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2c2xlbiwgdnNkLT5kYXRhKTsKLQotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgVkVSSU5GT19WQVI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaG9sZCwgdnZsZW4sIHZ2dmxlbjsKLQkgICAgc3RydWN0IGJpbmRhdGEgKnZ2ZDsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl92YXJpbmZvICp2djsKLQotCSAgICAqcHAgPSBzdHJpbmdfdG9fdW5pY29kZV9iaW4gKCJWYXJGaWxlSW5mbyIsIGJpZ19lbmRpYW4pOwotCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkgICAgaG9sZCA9IGxlbmd0aDsKLQkgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCSAgICB2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCi0JICAgIHZ2ZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICp2dmQpOwotCSAgICB2dmQtPmxlbmd0aCA9IDY7Ci0JICAgIHZ2ZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jICg2KTsKLQotCSAgICBsZW5ndGggKz0gNjsKLQkgICAgdmlsZW4gKz0gNjsKLQkgICAgdnZsZW4gPSA2OwotCi0JICAgIHB1dF8xNiAoYmlnX2VuZGlhbiwgMCwgdnZkLT5kYXRhICsgNCk7Ci0KLQkgICAgKnBwID0gdnZkOwotCSAgICBwcCA9ICZ2dmQtPm5leHQ7Ci0KLQkgICAgKnBwID0gdW5pY29kZV90b19iaW4gKHZpLT51LnZhci5rZXksIGJpZ19lbmRpYW4pOwotCSAgICBsZW5ndGggKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdmlsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgdnZsZW4gKz0gKCpwcCktPmxlbmd0aDsKLQkgICAgcHAgPSAmKCpwcCktPm5leHQ7Ci0KLQkgICAgaG9sZCA9IGxlbmd0aDsKLQkgICAgZHdvcmRfYWxpZ25fYmluICgmcHAsICZsZW5ndGgpOwotCSAgICB2aWxlbiArPSBsZW5ndGggLSBob2xkOwotCSAgICB2dmxlbiArPSBsZW5ndGggLSBob2xkOwotCi0JICAgIHZ2dmxlbiA9IDA7Ci0KLQkgICAgZm9yICh2diA9IHZpLT51LnZhci52YXI7IHZ2ICE9IE5VTEw7IHZ2ID0gdnYtPm5leHQpCi0JICAgICAgewotCQlzdHJ1Y3QgYmluZGF0YSAqdnZzZDsKLQotCQl2dnNkID0gKHN0cnVjdCBiaW5kYXRhICopIHJlc3dyX2FsbG9jIChzaXplb2YgKnZ2c2QpOwotCQl2dnNkLT5sZW5ndGggPSA0OwotCQl2dnNkLT5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzd3JfYWxsb2MgKDQpOwotCi0JCWxlbmd0aCArPSA0OwotCQl2aWxlbiArPSA0OwotCQl2dmxlbiArPSA0OwotCQl2dnZsZW4gKz0gNDsKLQotCQlwdXRfMTYgKGJpZ19lbmRpYW4sIHZ2LT5sYW5ndWFnZSwgdnZzZC0+ZGF0YSk7Ci0JCXB1dF8xNiAoYmlnX2VuZGlhbiwgdnYtPmNoYXJzZXQsIHZ2c2QtPmRhdGEgKyAyKTsKLQotCQl2dnNkLT5uZXh0ID0gTlVMTDsKLQkJKnBwID0gdnZzZDsKLQkJcHAgPSAmdnZzZC0+bmV4dDsKLQkgICAgICB9Ci0KLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2dmxlbiwgdnZkLT5kYXRhKTsKLQkgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2dnZsZW4sIHZ2ZC0+ZGF0YSArIDIpOwotCi0JICAgIGJyZWFrOwotCSAgfQotCX0KLQotICAgICAgcHV0XzE2IChiaWdfZW5kaWFuLCB2aWxlbiwgdmlkLT5kYXRhKTsKLSAgICB9Ci0KLSAgcHV0XzE2IChiaWdfZW5kaWFuLCBsZW5ndGgsIGZpcnN0LT5kYXRhKTsKLQotICByZXR1cm4gZmlyc3Q7Ci19Ci0KLS8qIENvbnZlcnQgYSBnZW5lcmljIHJlc291cmNlIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmluZGF0YSAqCi1yZXNfdG9fYmluX2dlbmVyaWMgKGxlbmd0aCwgZGF0YSkKLSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci17Ci0gIHN0cnVjdCBiaW5kYXRhICpkOwotCi0gIGQgPSAoc3RydWN0IGJpbmRhdGEgKikgcmVzd3JfYWxsb2MgKHNpemVvZiAqZCk7Ci0gIGQtPmxlbmd0aCA9IGxlbmd0aDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIGRhdGE7Ci0KLSAgZC0+bmV4dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIGQ7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZXNjb2ZmLmMgYi9iaW51dGlscy9yZXNjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjQ4N2EuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvcmVzY29mZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzgxICswLDAgQEAKLS8qIHJlc2NvZmYuYyAtLSByZWFkIGFuZCB3cml0ZSByZXNvdXJjZXMgaW4gV2luZG93cyBDT0ZGIGZpbGVzLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb24gdGhhdCByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJlc291cmNlcwotICAgaW4gQ09GRiBmaWxlcy4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJ3aW5kcmVzLmgiCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotLyogSW4gb3JkZXIgdG8gdXNlIHRoZSBhZGRyZXNzIG9mIGEgcmVzb3VyY2UgZGF0YSBlbnRyeSwgd2UgbmVlZCB0bwotICAgZ2V0IHRoZSBpbWFnZSBiYXNlIG9mIHRoZSBmaWxlLiAgUmlnaHQgbm93IHdlIGV4dHJhY3QgaXQgZnJvbQotICAgaW50ZXJuYWwgQkZEIGluZm9ybWF0aW9uLiAgRklYTUUuICAqLwotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLQotLyogSW5mb3JtYXRpb24gd2UgZXh0cmFjdCBmcm9tIHRoZSBmaWxlLiAgKi8KLQotc3RydWN0IGNvZmZfZmlsZV9pbmZvCi17Ci0gIC8qIEZpbGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBEYXRhIHJlYWQgZnJvbSB0aGUgZmlsZS4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpkYXRhOwotICAvKiBFbmQgb2YgZGF0YSByZWFkIGZyb20gZmlsZS4gICovCi0gIGNvbnN0IGJmZF9ieXRlICpkYXRhX2VuZDsKLSAgLyogQWRkcmVzcyBvZiB0aGUgcmVzb3VyY2Ugc2VjdGlvbiBtaW51cyB0aGUgaW1hZ2UgYmFzZSBvZiB0aGUgZmlsZS4gICovCi0gIGJmZF92bWEgc2VjYWRkcjsKLSAgLyogTm9uLXplcm8gaWYgdGhlIGZpbGUgaXMgYmlnIGVuZGlhbi4gICovCi0gIGludCBiaWdfZW5kaWFuOwotfTsKLQotLyogQSByZXNvdXJjZSBkaXJlY3RvcnkgdGFibGUgaW4gYSBDT0ZGIGZpbGUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkKLXsKLSAgLyogQ2hhcmFjdGVyaXN0aWNzLiAgKi8KLSAgYmZkX2J5dGUgY2hhcmFjdGVyaXN0aWNzWzRdOwotICAvKiBUaW1lIHN0YW1wLiAgKi8KLSAgYmZkX2J5dGUgdGltZVs0XTsKLSAgLyogTWFqb3IgdmVyc2lvbiBudW1iZXIuICAqLwotICBiZmRfYnl0ZSBtYWpvclsyXTsKLSAgLyogTWlub3IgdmVyc2lvbiBudW1iZXIuICAqLwotICBiZmRfYnl0ZSBtaW5vclsyXTsKLSAgLyogTnVtYmVyIG9mIG5hbWVkIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLSAgYmZkX2J5dGUgbmFtZV9jb3VudFsyXTsKLSAgLyogTnVtYmVyIG9mIGRpcmVjdG9yeSBlbnRyaWVzIHdpdGggSURzLiAgKi8KLSAgYmZkX2J5dGUgaWRfY291bnRbMl07Ci19OwotCi0vKiBBIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyeSBpbiBhIENPRkYgZmlsZS4gICovCi0KLXN0cnVjdCBleHRlcm5fcmVzX2VudHJ5Ci17Ci0gIC8qIE5hbWUgb3IgSUQuICAqLwotICBiZmRfYnl0ZSBuYW1lWzRdOwotICAvKiBBZGRyZXNzIG9mIHJlc291cmNlIGVudHJ5IG9yIHN1YmRpcmVjdG9yeS4gICovCi0gIGJmZF9ieXRlIHJ2YVs0XTsKLX07Ci0KLS8qIEEgcmVzb3VyY2UgZGF0YSBlbnRyeSBpbiBhIENPRkYgZmlsZS4gICovCi0KLXN0cnVjdCBleHRlcm5fcmVzX2RhdGEKLXsKLSAgLyogQWRkcmVzcyBvZiByZXNvdXJjZSBkYXRhLiAgVGhpcyBpcyBhcHBhcmVudGx5IGEgZmlsZSByZWxhdGl2ZQotICAgICBhZGRyZXNzLCByYXRoZXIgdGhhbiBhIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgYmZkX2J5dGUgcnZhWzRdOwotICAvKiBTaXplIG9mIHJlc291cmNlIGRhdGEuICAqLwotICBiZmRfYnl0ZSBzaXplWzRdOwotICAvKiBDb2RlIHBhZ2UuICAqLwotICBiZmRfYnl0ZSBjb2RlcGFnZVs0XTsKLSAgLyogUmVzZXJ2ZWQuICAqLwotICBiZmRfYnl0ZSByZXNlcnZlZFs0XTsKLX07Ci0KLS8qIE1hY3JvcyB0byBzd2FwIGluIHZhbHVlcy4gICovCi0KLSNkZWZpbmUgZ2V0ZmlfMTYoZmksIHMpICgoZmkpLT5iaWdfZW5kaWFuID8gYmZkX2dldGIxNiAocykgOiBiZmRfZ2V0bDE2IChzKSkKLSNkZWZpbmUgZ2V0ZmlfMzIoZmksIHMpICgoZmkpLT5iaWdfZW5kaWFuID8gYmZkX2dldGIzMiAocykgOiBiZmRfZ2V0bDMyIChzKSkKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgb3ZlcnJ1biBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgY29mZl9maWxlX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlYWRfY29mZl9yZXNfZGlyCi0gIFBBUkFNUyAoKGNvbnN0IGJmZF9ieXRlICosIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50KSk7Ci1zdGF0aWMgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVhZF9jb2ZmX2RhdGFfZW50cnkKLSAgUEFSQU1TICgoY29uc3QgYmZkX2J5dGUgKiwgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7Ci0MCi0vKiBSZWFkIHRoZSByZXNvdXJjZXMgaW4gYSBDT0ZGIGZpbGUuICAqLwotCi1zdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1yZWFkX2NvZmZfcnNyYyAoZmlsZW5hbWUsIHRhcmdldCkKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRhcmdldDsKLXsKLSAgYmZkICphYmZkOwotICBjaGFyICoqbWF0Y2hpbmc7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgYmZkX2J5dGUgKmRhdGE7Ci0gIHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyBmaW5mbzsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgaW5wdXQiKSk7Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHRhcmdldCk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgYmZkX2ZhdGFsIChmaWxlbmFtZSk7Ci0KLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfb2JqZWN0LCAmbWF0Y2hpbmcpKQotICAgIHsKLSAgICAgIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLQlsaXN0X21hdGNoaW5nX2Zvcm1hdHMgKG1hdGNoaW5nKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIucnNyYyIpOwotICBpZiAoc2VjID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IG5vIHJlc291cmNlIHNlY3Rpb25cbiIpLCBwcm9ncmFtX25hbWUsCi0JICAgICAgIGZpbGVuYW1lKTsKLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0KLSAgc2l6ZSA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHNlYyk7Ci0gIGRhdGEgPSAoYmZkX2J5dGUgKikgcmVzX2FsbG9jIChzaXplKTsKLQotICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywgZGF0YSwgMCwgc2l6ZSkpCi0gICAgYmZkX2ZhdGFsIChfKCJjYW4ndCByZWFkIHJlc291cmNlIHNlY3Rpb24iKSk7Ci0KLSAgZmluZm8uZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgZmluZm8uZGF0YSA9IGRhdGE7Ci0gIGZpbmZvLmRhdGFfZW5kID0gZGF0YSArIHNpemU7Ci0gIGZpbmZvLnNlY2FkZHIgPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAoYWJmZCwgc2VjKQotCQkgICAtIHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlKTsKLSAgZmluZm8uYmlnX2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChhYmZkKTsKLQotICBiZmRfY2xvc2UgKGFiZmQpOwotCi0gIC8qIE5vdyBqdXN0IHJlYWQgaW4gdGhlIHRvcCBsZXZlbCByZXNvdXJjZSBkaXJlY3RvcnkuICBOb3RlIHRoYXQgd2UKLSAgICAgZG9uJ3QgZnJlZSBkYXRhLCBzaW5jZSB3ZSBjcmVhdGUgcmVzb3VyY2UgZW50cmllcyB0aGF0IHBvaW50IGludG8KLSAgICAgaXQuICBJZiB3ZSBldmVyIHdhbnQgdG8gZnJlZSB1cCB0aGUgcmVzb3VyY2UgaW5mb3JtYXRpb24gd2UgcmVhZCwKLSAgICAgdGhpcyB3aWxsIGhhdmUgdG8gYmUgY2xlYW5lZCB1cC4gICovCi0KLSAgcmV0dXJuIHJlYWRfY29mZl9yZXNfZGlyIChkYXRhLCAmZmluZm8sIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsIDApOwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGlmIHdlIGFyZSBvdXQgb2YgYm91bmRzLiAgKi8KLQotc3RhdGljIHZvaWQKLW92ZXJydW4gKGZpbmZvLCBtc2cpCi0gICAgIGNvbnN0IHN0cnVjdCBjb2ZmX2ZpbGVfaW5mbyAqZmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgZmF0YWwgKF8oIiVzOiAlczogYWRkcmVzcyBvdXQgb2YgYm91bmRzIiksIGZpbmZvLT5maWxlbmFtZSwgbXNnKTsKLX0KLQotLyogUmVhZCBhIHJlc291cmNlIGRpcmVjdG9yeS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1yZWFkX2NvZmZfcmVzX2RpciAoZGF0YSwgZmluZm8sIHR5cGUsIGxldmVsKQotICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICpmaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgaW50IGxldmVsOwotewotICBjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkgKmVyZDsKLSAgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOwotICBpbnQgbmFtZV9jb3VudCwgaWRfY291bnQsIGk7Ci0gIHN0cnVjdCByZXNfZW50cnkgKipwcDsKLSAgY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKmVyZTsKLQotICBpZiAoKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGRhdGEpIDwgc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19kaXJlY3RvcnkpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJkaXJlY3RvcnkiKSk7Ci0KLSAgZXJkID0gKGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSAqKSBkYXRhOwotCi0gIHJkID0gKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZCk7Ci0gIHJkLT5jaGFyYWN0ZXJpc3RpY3MgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+Y2hhcmFjdGVyaXN0aWNzKTsKLSAgcmQtPnRpbWUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+dGltZSk7Ci0gIHJkLT5tYWpvciA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5tYWpvcik7Ci0gIHJkLT5taW5vciA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5taW5vcik7Ci0gIHJkLT5lbnRyaWVzID0gTlVMTDsKLQotICBuYW1lX2NvdW50ID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcmQtPm5hbWVfY291bnQpOwotICBpZF9jb3VudCA9IGdldGZpXzE2IChmaW5mbywgZXJkLT5pZF9jb3VudCk7Ci0KLSAgcHAgPSAmcmQtPmVudHJpZXM7Ci0KLSAgLyogVGhlIHJlc291cmNlIGRpcmVjdG9yeSBlbnRyaWVzIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgZGlyZWN0b3J5Ci0gICAgIHRhYmxlLiAgKi8KLSAgZXJlID0gKGNvbnN0IHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5ICopIChlcmQgKyAxKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgbmFtZV9jb3VudDsgaSsrLCBlcmUrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG5hbWUsIHJ2YTsKLSAgICAgIHN0cnVjdCByZXNfZW50cnkgKnJlOwotICAgICAgY29uc3QgYmZkX2J5dGUgKmVyczsKLSAgICAgIGludCBsZW5ndGgsIGo7Ci0KLSAgICAgIGlmICgoY29uc3QgYmZkX2J5dGUgKikgZXJlID49IGZpbmZvLT5kYXRhX2VuZCkKLQlvdmVycnVuIChmaW5mbywgXygibmFtZWQgZGlyZWN0b3J5IGVudHJ5IikpOwotCi0gICAgICBuYW1lID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPm5hbWUpOwotICAgICAgcnZhID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmUtPnJ2YSk7Ci0KLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiB0aGUgaGlnaCBiaXQgaW4gTkFNRSBpcyBzZXQuICAqLwotICAgICAgbmFtZSAmPX4gMHg4MDAwMDAwMDsKLQotICAgICAgaWYgKG5hbWUgPiAoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZmluZm8tPmRhdGEpKQotCW92ZXJydW4gKGZpbmZvLCBfKCJkaXJlY3RvcnkgZW50cnkgbmFtZSIpKTsKLQotICAgICAgZXJzID0gZmluZm8tPmRhdGEgKyBuYW1lOwotCi0gICAgICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0gICAgICByZS0+bmV4dCA9IE5VTEw7Ci0gICAgICByZS0+aWQubmFtZWQgPSAxOwotICAgICAgbGVuZ3RoID0gZ2V0ZmlfMTYgKGZpbmZvLCBlcnMpOwotICAgICAgcmUtPmlkLnUubi5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICByZS0+aWQudS5uLm5hbWUgPSAodW5pY2hhciAqKSByZXNfYWxsb2MgKGxlbmd0aCAqIHNpemVvZiAodW5pY2hhcikpOwotICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aDsgaisrKQotCXJlLT5pZC51Lm4ubmFtZVtqXSA9IGdldGZpXzE2IChmaW5mbywgZXJzICsgaiAqIDIgKyAyKTsKLQotICAgICAgaWYgKGxldmVsID09IDApCi0JdHlwZSA9ICZyZS0+aWQ7Ci0KLSAgICAgIGlmICgocnZhICYgMHg4MDAwMDAwMCkgIT0gMCkKLQl7Ci0JICBydmEgJj1+IDB4ODAwMDAwMDA7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJuYW1lZCBzdWJkaXJlY3RvcnkiKSk7Ci0JICByZS0+c3ViZGlyID0gMTsKLQkgIHJlLT51LmRpciA9IHJlYWRfY29mZl9yZXNfZGlyIChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUsCi0JCQkJCSBsZXZlbCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJuYW1lZCByZXNvdXJjZSIpKTsKLQkgIHJlLT5zdWJkaXIgPSAwOwotCSAgcmUtPnUucmVzID0gcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGZpbmZvLT5kYXRhICsgcnZhLCBmaW5mbywgdHlwZSk7Ci0JfQotCi0gICAgICAqcHAgPSByZTsKLSAgICAgIHBwID0gJnJlLT5uZXh0OwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgaWRfY291bnQ7IGkrKywgZXJlKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBuYW1lLCBydmE7Ci0gICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICpyZTsKLQotICAgICAgaWYgKChjb25zdCBiZmRfYnl0ZSAqKSBlcmUgPj0gZmluZm8tPmRhdGFfZW5kKQotCW92ZXJydW4gKGZpbmZvLCBfKCJJRCBkaXJlY3RvcnkgZW50cnkiKSk7Ci0KLSAgICAgIG5hbWUgPSBnZXRmaV8zMiAoZmluZm8sIGVyZS0+bmFtZSk7Ci0gICAgICBydmEgPSBnZXRmaV8zMiAoZmluZm8sIGVyZS0+cnZhKTsKLQotICAgICAgcmUgPSAoc3RydWN0IHJlc19lbnRyeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmUpOwotICAgICAgcmUtPm5leHQgPSBOVUxMOwotICAgICAgcmUtPmlkLm5hbWVkID0gMDsKLSAgICAgIHJlLT5pZC51LmlkID0gbmFtZTsKLQotICAgICAgaWYgKGxldmVsID09IDApCi0JdHlwZSA9ICZyZS0+aWQ7Ci0KLSAgICAgIGlmICgocnZhICYgMHg4MDAwMDAwMCkgIT0gMCkKLQl7Ci0JICBydmEgJj1+IDB4ODAwMDAwMDA7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJJRCBzdWJkaXJlY3RvcnkiKSk7Ci0JICByZS0+c3ViZGlyID0gMTsKLQkgIHJlLT51LmRpciA9IHJlYWRfY29mZl9yZXNfZGlyIChmaW5mby0+ZGF0YSArIHJ2YSwgZmluZm8sIHR5cGUsCi0JCQkJCSBsZXZlbCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocnZhID49IChzaXplX3QpIChmaW5mby0+ZGF0YV9lbmQgLSBmaW5mby0+ZGF0YSkpCi0JICAgIG92ZXJydW4gKGZpbmZvLCBfKCJJRCByZXNvdXJjZSIpKTsKLQkgIHJlLT5zdWJkaXIgPSAwOwotCSAgcmUtPnUucmVzID0gcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGZpbmZvLT5kYXRhICsgcnZhLCBmaW5mbywgdHlwZSk7Ci0JfQotCi0gICAgICAqcHAgPSByZTsKLSAgICAgIHBwID0gJnJlLT5uZXh0OwotICAgIH0KLQotICByZXR1cm4gcmQ7Ci19Ci0KLS8qIFJlYWQgYSByZXNvdXJjZSBkYXRhIGVudHJ5LiAgKi8KLQotc3RhdGljIHN0cnVjdCByZXNfcmVzb3VyY2UgKgotcmVhZF9jb2ZmX2RhdGFfZW50cnkgKGRhdGEsIGZpbmZvLCB0eXBlKQotICAgICBjb25zdCBiZmRfYnl0ZSAqZGF0YTsKLSAgICAgY29uc3Qgc3RydWN0IGNvZmZfZmlsZV9pbmZvICpmaW5mbzsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLXsKLSAgY29uc3Qgc3RydWN0IGV4dGVybl9yZXNfZGF0YSAqZXJkOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICB1bnNpZ25lZCBsb25nIHNpemUsIHJ2YTsKLSAgY29uc3QgYmZkX2J5dGUgKnJlc2RhdGE7Ci0KLSAgaWYgKHR5cGUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygicmVzb3VyY2UgdHlwZSB1bmtub3duIikpOwotCi0gIGlmICgoc2l6ZV90KSAoZmluZm8tPmRhdGFfZW5kIC0gZGF0YSkgPCBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2RhdGEpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJkYXRhIGVudHJ5IikpOwotCi0gIGVyZCA9IChjb25zdCBzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhICopIGRhdGE7Ci0KLSAgc2l6ZSA9IGdldGZpXzMyIChmaW5mbywgZXJkLT5zaXplKTsKLSAgcnZhID0gZ2V0ZmlfMzIgKGZpbmZvLCBlcmQtPnJ2YSk7Ci0gIGlmIChydmEgPCBmaW5mby0+c2VjYWRkcgotICAgICAgfHwgcnZhIC0gZmluZm8tPnNlY2FkZHIgPj0gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIGZpbmZvLT5kYXRhKSkKLSAgICBvdmVycnVuIChmaW5mbywgXygicmVzb3VyY2UgZGF0YSIpKTsKLQotICByZXNkYXRhID0gZmluZm8tPmRhdGEgKyAocnZhIC0gZmluZm8tPnNlY2FkZHIpOwotCi0gIGlmIChzaXplID4gKHNpemVfdCkgKGZpbmZvLT5kYXRhX2VuZCAtIHJlc2RhdGEpKQotICAgIG92ZXJydW4gKGZpbmZvLCBfKCJyZXNvdXJjZSBkYXRhIHNpemUiKSk7Ci0KLSAgciA9IGJpbl90b19yZXMgKCp0eXBlLCByZXNkYXRhLCBzaXplLCBmaW5mby0+YmlnX2VuZGlhbik7Ci0KLSAgbWVtc2V0ICgmci0+cmVzX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IHJlc19yZXNfaW5mbykpOwotICByLT5jb2ZmX2luZm8uY29kZXBhZ2UgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+Y29kZXBhZ2UpOwotICByLT5jb2ZmX2luZm8ucmVzZXJ2ZWQgPSBnZXRmaV8zMiAoZmluZm8sIGVyZC0+cmVzZXJ2ZWQpOwotCi0gIHJldHVybiByOwotfQotDAotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBidWlsZCBhIGxpc3Qgb2YgYmluZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGJpbmRhdGFfYnVpbGQKLXsKLSAgLyogVGhlIGRhdGEuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgLyogVGhlIGxhc3Qgc3RydWN0dXJlIHdlIGhhdmUgYWRkZWQgdG8gdGhlIGxpc3QuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqbGFzdDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIGxpc3QgYXMgYSB3aG9sZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgdHJhY2sgb2YgaW5mb3JtYXRpb24gYXMgd2UgYnVpbGQgdGhlIGRpcmVjdG9yeQotICAgdHJlZS4gICovCi0KLXN0cnVjdCBjb2ZmX3dyaXRlX2luZm8KLXsKLSAgLyogVGhlc2UgZmllbGRzIGFyZSBiYXNlZCBvbiB0aGUgQkZELiAgKi8KLSAgLyogVGhlIEJGRCBpdHNlbGYuICAqLwotICBiZmQgKmFiZmQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBmaWxlIGlzIGJpZyBlbmRpYW4uICAqLwotICBpbnQgYmlnX2VuZGlhbjsKLSAgLyogUG9pbnRlciB0byBzZWN0aW9uIHN5bWJvbCB1c2VkIHRvIGJ1aWxkIFJWQSByZWxvY3MuICAqLwotICBhc3ltYm9sICoqc3ltcHA7Ci0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBpbml0aWFsbHksIGFuZCB0aGVuIG5vdCBjaGFuZ2VkLiAgKi8KLSAgLyogTGVuZ3RoIG9mIGRpcmVjdG9yeSB0YWJsZXMgYW5kIGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGRpcnNpemU7Ci0gIC8qIExlbmd0aCBvZiBkaXJlY3RvcnkgZW50cnkgc3RyaW5ncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZGlyc3Ryc2l6ZTsKLSAgLyogTGVuZ3RoIG9mIHJlc291cmNlIGRhdGEgZW50cmllcy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZGF0YWVudHNpemU7Ci0KLSAgLyogVGhlc2UgZmllbGRzIGFyZSB1cGRhdGVkIGFzIHdlIGFkZCBkYXRhLiAgKi8KLSAgLyogRGlyZWN0b3J5IHRhYmxlcyBhbmQgZW50cmllcy4gICovCi0gIHN0cnVjdCBiaW5kYXRhX2J1aWxkIGRpcnM7Ci0gIC8qIERpcmVjdG9yeSBlbnRyeSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgZGlyc3RyczsKLSAgLyogUmVzb3VyY2UgZGF0YSBlbnRyaWVzLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgZGF0YWVudHM7Ci0gIC8qIEFjdHVhbCByZXNvdXJjZSBkYXRhLiAgKi8KLSAgc3RydWN0IGJpbmRhdGFfYnVpbGQgcmVzb3VyY2VzOwotICAvKiBSZWxvY2F0aW9ucy4gICovCi0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIC8qIE51bWJlciBvZiByZWxvY2F0aW9ucy4gICovCi0gIHVuc2lnbmVkIGludCByZWxvY19jb3VudDsKLX07Ci0KLS8qIE1hY3JvcyB0byBzd2FwIG91dCB2YWx1ZXMuICAqLwotCi0jZGVmaW5lIHB1dGN3aV8xNihjd2ksIHYsIHMpIFwKLSAgKChjd2ktPmJpZ19lbmRpYW4pID8gYmZkX3B1dGIxNiAoKHYpLCAocykpIDogYmZkX3B1dGwxNiAoKHYpLCAocykpKQotI2RlZmluZSBwdXRjd2lfMzIoY3dpLCB2LCBzKSBcCi0gICgoY3dpLT5iaWdfZW5kaWFuKSA/IGJmZF9wdXRiMzIgKCh2KSwgKHMpKSA6IGJmZF9wdXRsMzIgKCh2KSwgKHMpKSkKLQotc3RhdGljIHZvaWQgY29mZl9iaW5fc2l6ZXMKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqY29mZl9hbGxvYyBQQVJBTVMgKChzdHJ1Y3QgYmluZGF0YV9idWlsZCAqLCBzaXplX3QpKTsKLXN0YXRpYyB2b2lkIGNvZmZfdG9fYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICosIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKikpOwotc3RhdGljIHZvaWQgY29mZl9yZXNfdG9fYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgc3RydWN0IGNvZmZfd3JpdGVfaW5mbyAqKSk7Ci0KLS8qIFdyaXRlIHJlc291cmNlcyB0byBhIENPRkYgZmlsZS4gIFJFU09VUkNFUyBzaG91bGQgYWxyZWFkeSBiZQotICAgc29ydGVkLgotCi0gICBSaWdodCBub3cgd2UgYWx3YXlzIGNyZWF0ZSBhIG5ldyBmaWxlLiAgU29tZWRheSB3ZSBzaG91bGQgYWxzbwotICAgb2ZmZXIgdGhlIGFiaWxpdHkgdG8gbWVyZ2UgcmVzb3VyY2VzIGludG8gYW4gZXhpc3RpbmcgZmlsZS4gIFRoaXMKLSAgIHdvdWxkIHJlcXVpcmUgZG9pbmcgdGhlIGJhc2ljIHdvcmsgb2Ygb2JqY29weSwganVzdCBtb2RpZnlpbmcgb3IKLSAgIGFkZGluZyB0aGUgLnJzcmMgc2VjdGlvbi4gICovCi0KLXZvaWQKLXdyaXRlX2NvZmZfZmlsZSAoZmlsZW5hbWUsIHRhcmdldCwgcmVzb3VyY2VzKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFyZ2V0OwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotewotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gY3dpOwotICBzdHJ1Y3QgYmluZGF0YSAqZDsKLSAgdW5zaWduZWQgbG9uZyBsZW5ndGgsIG9mZnNldDsKLQotICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygiZmlsZW5hbWUgcmVxdWlyZWQgZm9yIENPRkYgb3V0cHV0IikpOwotCi0gIGFiZmQgPSBiZmRfb3BlbncgKGZpbGVuYW1lLCB0YXJnZXQpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoZmlsZW5hbWUpOwotCi0gIGlmICghIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2Zvcm1hdCIpOwotCi0jaWZkZWYgRExMVE9PTF9BUk0KLSAgaWYgKCEgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIGJmZF9hcmNoX2FybSwgMCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoX21hY2goYXJtKSIpOwotI2Vsc2UKLSAgLyogRklYTUU6IFRoaXMgaXMgb2J2aW91c2x5IGkzODYgc3BlY2lmaWMuICAqLwotICBpZiAoISBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgYmZkX2FyY2hfaTM4NiwgMCkpCi0gICAgYmZkX2ZhdGFsICgiYmZkX3NldF9hcmNoX21hY2goaTM4NikiKTsKLSNlbmRpZiAvKiBhcm0gKi8KLQotICBpZiAoISBiZmRfc2V0X2ZpbGVfZmxhZ3MgKGFiZmQsIEhBU19TWU1TIHwgSEFTX1JFTE9DKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X2ZpbGVfZmxhZ3MiKTsKLQotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uIChhYmZkLCAiLnJzcmMiKTsKLSAgaWYgKHNlYyA9PSBOVUxMKQotICAgIGJmZF9mYXRhbCAoImJmZF9tYWtlX3NlY3Rpb24iKTsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywKLQkJCSAgICAgICAoU0VDX0hBU19DT05URU5UUyB8IFNFQ19BTExPQwotCQkJCXwgU0VDX0xPQUQgfCBTRUNfREFUQSkpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9mbGFncyIpOwotCi0gIGlmICghIGJmZF9zZXRfc3ltdGFiIChhYmZkLCBzZWMtPnN5bWJvbF9wdHJfcHRyLCAxKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfc2V0X3N5bXRhYiIpOwotCi0gIC8qIFJlcXVpcmluZyB0aGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIEJGRC4gICovCi0gIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0KLSAgLyogVGhlIG9yZGVyIG9mIGRhdGEgaW4gdGhlIC5yc3JjIHNlY3Rpb24gaXMKLSAgICAgICByZXNvdXJjZSBkaXJlY3RvcnkgdGFibGVzIGFuZCBlbnRyaWVzCi0gICAgICAgcmVzb3VyY2UgZGlyZWN0b3J5IHN0cmluZ3MKLSAgICAgICByZXNvdXJjZSBkYXRhIGVudHJpZXMKLSAgICAgICBhY3R1YWwgcmVzb3VyY2UgZGF0YQotCi0gICAgIFdlIGJ1aWxkIHRoZXNlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIGluIGRpZmZlcmVudCBsaXN0cy4gICovCi0KLSAgY3dpLmFiZmQgPSBhYmZkOwotICBjd2kuYmlnX2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChhYmZkKTsKLSAgY3dpLnN5bXBwID0gc2VjLT5zeW1ib2xfcHRyX3B0cjsKLSAgY3dpLmRpcnNpemUgPSAwOwotICBjd2kuZGlyc3Ryc2l6ZSA9IDA7Ci0gIGN3aS5kYXRhZW50c2l6ZSA9IDA7Ci0gIGN3aS5kaXJzLmQgPSBOVUxMOwotICBjd2kuZGlycy5sYXN0ID0gTlVMTDsKLSAgY3dpLmRpcnMubGVuZ3RoID0gMDsKLSAgY3dpLmRpcnN0cnMuZCA9IE5VTEw7Ci0gIGN3aS5kaXJzdHJzLmxhc3QgPSBOVUxMOwotICBjd2kuZGlyc3Rycy5sZW5ndGggPSAwOwotICBjd2kuZGF0YWVudHMuZCA9IE5VTEw7Ci0gIGN3aS5kYXRhZW50cy5sYXN0ID0gTlVMTDsKLSAgY3dpLmRhdGFlbnRzLmxlbmd0aCA9IDA7Ci0gIGN3aS5yZXNvdXJjZXMuZCA9IE5VTEw7Ci0gIGN3aS5yZXNvdXJjZXMubGFzdCA9IE5VTEw7Ci0gIGN3aS5yZXNvdXJjZXMubGVuZ3RoID0gMDsKLSAgY3dpLnJlbG9jcyA9IE5VTEw7Ci0gIGN3aS5yZWxvY19jb3VudCA9IDA7Ci0KLSAgLyogV29yayBvdXQgdGhlIHNpemVzIG9mIHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgZW50cmllcywgc28gdGhhdCB3ZQotICAgICBrbm93IHRoZSB2YXJpb3VzIG9mZnNldHMgd2Ugd2lsbCBuZWVkLiAgKi8KLSAgY29mZl9iaW5fc2l6ZXMgKHJlc291cmNlcywgJmN3aSk7Ci0KLSAgLyogRm9yY2UgdGhlIGRpcmVjdG9yeSBzdHJpbmdzIHRvIGJlIDMyIGJpdCBhbGlnbmVkLiAgRXZlcnkgb3RoZXIKLSAgICAgc3RydWN0dXJlIGlzIDMyIGJpdCBhbGlnbmVkIGFueWhvdy4gICovCi0gIGN3aS5kaXJzdHJzaXplID0gKGN3aS5kaXJzdHJzaXplICsgMykgJn4gMzsKLQotICAvKiBBY3R1YWxseSBjb252ZXJ0IHRoZSByZXNvdXJjZXMgdG8gYmluYXJ5LiAgKi8KLSAgY29mZl90b19iaW4gKHJlc291cmNlcywgJmN3aSk7Ci0KLSAgLyogQWRkIGFub3RoZXIgMiBieXRlcyB0byB0aGUgZGlyZWN0b3J5IHN0cmluZ3MgaWYgbmVlZGVkIGZvcgotICAgICBhbGlnbm1lbnQuICAqLwotICBpZiAoKGN3aS5kaXJzdHJzLmxlbmd0aCAmIDMpICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqZXg7Ci0KLSAgICAgIGV4ID0gY29mZl9hbGxvYyAoJmN3aS5kaXJzdHJzLCAyKTsKLSAgICAgIGV4WzBdID0gMDsKLSAgICAgIGV4WzFdID0gMDsKLSAgICB9Ci0KLSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgd2UgYnVpbHQgY2FtZSBvdXQgdG8gdGhlIHNhbWUgc2l6ZSBhcyB3ZQotICAgICBjYWxjdWxhdGVkIGluaXRpYWxseS4gICovCi0gIGFzc2VydCAoY3dpLmRpcnMubGVuZ3RoID09IGN3aS5kaXJzaXplKTsKLSAgYXNzZXJ0IChjd2kuZGlyc3Rycy5sZW5ndGggPT0gY3dpLmRpcnN0cnNpemUpOwotICBhc3NlcnQgKGN3aS5kYXRhZW50cy5sZW5ndGggPT0gY3dpLmRhdGFlbnRzaXplKTsKLQotICBsZW5ndGggPSAoY3dpLmRpcnNpemUKLQkgICAgKyBjd2kuZGlyc3Ryc2l6ZQotCSAgICArIGN3aS5kYXRhZW50c2l6ZQotCSAgICArIGN3aS5yZXNvdXJjZXMubGVuZ3RoKTsKLQotICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBsZW5ndGgpKQotICAgIGJmZF9mYXRhbCAoImJmZF9zZXRfc2VjdGlvbl9zaXplIik7Ci0KLSAgYmZkX3NldF9yZWxvYyAoYWJmZCwgc2VjLCBjd2kucmVsb2NzLCBjd2kucmVsb2NfY291bnQpOwotCi0gIG9mZnNldCA9IDA7Ci0gIGZvciAoZCA9IGN3aS5kaXJzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKLQliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7Ci0gICAgfQotICBmb3IgKGQgPSBjd2kuZGlyc3Rycy5kOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjLCBkLT5kYXRhLCBvZmZzZXQsIGQtPmxlbmd0aCkpCi0JYmZkX2ZhdGFsICgiYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIik7Ci0gICAgICBvZmZzZXQgKz0gZC0+bGVuZ3RoOwotICAgIH0KLSAgZm9yIChkID0gY3dpLmRhdGFlbnRzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKLQliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7Ci0gICAgfQotICBmb3IgKGQgPSBjd2kucmVzb3VyY2VzLmQ7IGQgIT0gTlVMTDsgZCA9IGQtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWMsIGQtPmRhdGEsIG9mZnNldCwgZC0+bGVuZ3RoKSkKLQliZmRfZmF0YWwgKCJiZmRfc2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIG9mZnNldCArPSBkLT5sZW5ndGg7Ci0gICAgfQotCi0gIGFzc2VydCAob2Zmc2V0ID09IGxlbmd0aCk7Ci0KLSAgaWYgKCEgYmZkX2Nsb3NlIChhYmZkKSkKLSAgICBiZmRfZmF0YWwgKCJiZmRfY2xvc2UiKTsKLQotICAvKiBXZSBhbGxvY2F0ZWQgdGhlIHJlbG9jcyBhcnJheSB1c2luZyBtYWxsb2MuICAqLwotICBmcmVlIChjd2kucmVsb2NzKTsKLX0KLQotLyogV29yayBvdXQgdGhlIHNpemVzIG9mIHRoZSB2YXJpb3VzIGZpeGVkIHNpemUgcmVzb3VyY2UgZGlyZWN0b3J5Ci0gICBlbnRyaWVzLiAgVGhpcyB1cGRhdGVzIGZpZWxkcyBpbiBDV0kuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9iaW5fc2l6ZXMgKHJlc2RpciwgY3dpKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzZGlyOwotICAgICBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICpjd2k7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKnJlOwotCi0gIGN3aS0+ZGlyc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2RpcmVjdG9yeSk7Ci0KLSAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICB7Ci0gICAgICBjd2ktPmRpcnNpemUgKz0gc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuX3Jlc19lbnRyeSk7Ci0KLSAgICAgIGlmIChyZS0+aWQubmFtZWQpCi0JY3dpLT5kaXJzdHJzaXplICs9IHJlLT5pZC51Lm4ubGVuZ3RoICogMiArIDI7Ci0KLSAgICAgIGlmIChyZS0+c3ViZGlyKQotCWNvZmZfYmluX3NpemVzIChyZS0+dS5kaXIsIGN3aSk7Ci0gICAgICBlbHNlCi0JY3dpLT5kYXRhZW50c2l6ZSArPSBzaXplb2YgKHN0cnVjdCBleHRlcm5fcmVzX2RhdGEpOwotICAgIH0KLX0KLQotLyogQWxsb2NhdGUgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIGxpc3QuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciAqCi1jb2ZmX2FsbG9jIChiYiwgc2l6ZSkKLSAgICAgc3RydWN0IGJpbmRhdGFfYnVpbGQgKmJiOwotICAgICBzaXplX3Qgc2l6ZTsKLXsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0KLSAgZCA9IChzdHJ1Y3QgYmluZGF0YSAqKSByZXN3cl9hbGxvYyAoc2l6ZW9mICpkKTsKLQotICBkLT5uZXh0ID0gTlVMTDsKLSAgZC0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc3dyX2FsbG9jIChzaXplKTsKLSAgZC0+bGVuZ3RoID0gc2l6ZTsKLQotICBpZiAoYmItPmQgPT0gTlVMTCkKLSAgICBiYi0+ZCA9IGQ7Ci0gIGVsc2UKLSAgICBiYi0+bGFzdC0+bmV4dCA9IGQ7Ci0gIGJiLT5sYXN0ID0gZDsKLSAgYmItPmxlbmd0aCArPSBzaXplOwotCi0gIHJldHVybiBkLT5kYXRhOwotfQotCi0vKiBDb252ZXJ0IHRoZSByZXNvdXJjZSBkaXJlY3RvcnkgUkVTRElSIHRvIGJpbmFyeS4gICovCi0KLXN0YXRpYyB2b2lkCi1jb2ZmX3RvX2JpbiAocmVzZGlyLCBjd2kpCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNkaXI7Ci0gICAgIHN0cnVjdCBjb2ZmX3dyaXRlX2luZm8gKmN3aTsKLXsKLSAgc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5ICplcmQ7Ci0gIGludCBjaSwgY247Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKmU7Ci0gIHN0cnVjdCBleHRlcm5fcmVzX2VudHJ5ICplcmU7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBkaXJlY3RvcnkgdGFibGUuICAqLwotCi0gIGVyZCA9ICgoc3RydWN0IGV4dGVybl9yZXNfZGlyZWN0b3J5ICopCi0JIGNvZmZfYWxsb2MgKCZjd2ktPmRpcnMsIHNpemVvZiAoKmVyZCkpKTsKLQotICBwdXRjd2lfMzIgKGN3aSwgcmVzZGlyLT5jaGFyYWN0ZXJpc3RpY3MsIGVyZC0+Y2hhcmFjdGVyaXN0aWNzKTsKLSAgcHV0Y3dpXzMyIChjd2ksIHJlc2Rpci0+dGltZSwgZXJkLT50aW1lKTsKLSAgcHV0Y3dpXzE2IChjd2ksIHJlc2Rpci0+bWFqb3IsIGVyZC0+bWFqb3IpOwotICBwdXRjd2lfMTYgKGN3aSwgcmVzZGlyLT5taW5vciwgZXJkLT5taW5vcik7Ci0KLSAgY2kgPSAwOwotICBjbiA9IDA7Ci0gIGZvciAoZSA9IHJlc2Rpci0+ZW50cmllczsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZS0+aWQubmFtZWQpCi0JKytjbjsKLSAgICAgIGVsc2UKLQkrK2NpOwotICAgIH0KLQotICBwdXRjd2lfMTYgKGN3aSwgY24sIGVyZC0+bmFtZV9jb3VudCk7Ci0gIHB1dGN3aV8xNiAoY3dpLCBjaSwgZXJkLT5pZF9jb3VudCk7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBkYXRhIGVudHJpZXMuICBOb3RlIHRoYXQgd2UgYWxsb2NhdGUgc3BhY2UgZm9yIGFsbAotICAgICB0aGUgZW50cmllcyBiZWZvcmUgd3JpdGluZyB0aGVtIG91dC4gIFRoYXQgcGVybWl0cyBhIHJlY3Vyc2l2ZQotICAgICBjYWxsIHRvIHdvcmsgY29ycmVjdGx5IHdoZW4gd3JpdGluZyBvdXQgc3ViZGlyZWN0b3JpZXMuICAqLwotCi0gIGVyZSA9ICgoc3RydWN0IGV4dGVybl9yZXNfZW50cnkgKikKLQkgY29mZl9hbGxvYyAoJmN3aS0+ZGlycywgKGNpICsgY24pICogc2l6ZW9mICgqZXJlKSkpOwotICBmb3IgKGUgPSByZXNkaXItPmVudHJpZXM7IGUgIT0gTlVMTDsgZSA9IGUtPm5leHQsIGVyZSsrKQotICAgIHsKLSAgICAgIGlmICghIGUtPmlkLm5hbWVkKQotCXB1dGN3aV8zMiAoY3dpLCBlLT5pZC51LmlkLCBlcmUtPm5hbWUpOwotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGNoYXIgKnN0cjsKLQkgIGludCBpOwotCi0JICAvKiBGb3Igc29tZSByZWFzb24gZXhpc3RpbmcgZmlsZXMgc2VlbSB0byBoYXZlIHRoZSBoaWdoIGJpdAotICAgICAgICAgICAgIHNldCBvbiB0aGUgYWRkcmVzcyBvZiB0aGUgbmFtZSwgYWx0aG91Z2ggdGhhdCBpcyBub3QKLSAgICAgICAgICAgICBkb2N1bWVudGVkLiAgKi8KLQkgIHB1dGN3aV8zMiAoY3dpLAotCQkgICAgIDB4ODAwMDAwMDAgfCAoY3dpLT5kaXJzaXplICsgY3dpLT5kaXJzdHJzLmxlbmd0aCksCi0JCSAgICAgZXJlLT5uYW1lKTsKLQotCSAgc3RyID0gY29mZl9hbGxvYyAoJmN3aS0+ZGlyc3RycywgZS0+aWQudS5uLmxlbmd0aCAqIDIgKyAyKTsKLQkgIHB1dGN3aV8xNiAoY3dpLCBlLT5pZC51Lm4ubGVuZ3RoLCBzdHIpOwotCSAgZm9yIChpID0gMDsgaSA8IGUtPmlkLnUubi5sZW5ndGg7IGkrKykKLQkgICAgcHV0Y3dpXzE2IChjd2ksIGUtPmlkLnUubi5uYW1lW2ldLCBzdHIgKyBpICogMiArIDIpOwotCX0KLQotICAgICAgaWYgKGUtPnN1YmRpcikKLQl7Ci0JICBwdXRjd2lfMzIgKGN3aSwgMHg4MDAwMDAwMCB8IGN3aS0+ZGlycy5sZW5ndGgsIGVyZS0+cnZhKTsKLQkgIGNvZmZfdG9fYmluIChlLT51LmRpciwgY3dpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHV0Y3dpXzMyIChjd2ksCi0JCSAgICAgY3dpLT5kaXJzaXplICsgY3dpLT5kaXJzdHJzaXplICsgY3dpLT5kYXRhZW50cy5sZW5ndGgsCi0JCSAgICAgZXJlLT5ydmEpOwotCi0JICBjb2ZmX3Jlc190b19iaW4gKGUtPnUucmVzLCBjd2kpOwotCX0KLSAgICB9Ci19Ci0KLS8qIENvbnZlcnQgdGhlIHJlc291cmNlIFJFUyB0byBiaW5hcnkuICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9yZXNfdG9fYmluIChyZXMsIGN3aSkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBzdHJ1Y3QgY29mZl93cml0ZV9pbmZvICpjd2k7Ci17Ci0gIGFyZWxlbnQgKnI7Ci0gIHN0cnVjdCBleHRlcm5fcmVzX2RhdGEgKmVyZDsKLSAgc3RydWN0IGJpbmRhdGEgKmQ7Ci0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotCi0gIC8qIEZvciBzb21lIHJlYXNvbiwgYWx0aG91Z2ggZXZlcnkgb3RoZXIgYWRkcmVzcyBpcyBhIHNlY3Rpb24KLSAgICAgb2Zmc2V0LCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVzb3VyY2UgZGF0YSBpdHNlbGYgaXMgYW4gUlZBLiAgVGhhdAotICAgICBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSByZWxvY2F0aW9uIGZvciBpdC4gIFdlIGFsbG9jYXRlCi0gICAgIHRoZSByZWxvY3MgYXJyYXkgdXNpbmcgbWFsbG9jIHNvIHRoYXQgd2UgY2FuIHVzZSByZWFsbG9jLiAgRklYTUU6Ci0gICAgIFRoaXMgcmVsb2NhdGlvbiBoYW5kbGluZyBpcyBjb3JyZWN0IGZvciB0aGUgaTM4NiwgYnV0IHByb2JhYmx5Ci0gICAgIG5vdCBmb3IgYW55IG90aGVyIHRhcmdldC4gICovCi0KLSAgciA9IChhcmVsZW50ICopIHJlc3dyX2FsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgci0+c3ltX3B0cl9wdHIgPSBjd2ktPnN5bXBwOwotICByLT5hZGRyZXNzID0gY3dpLT5kaXJzaXplICsgY3dpLT5kaXJzdHJzaXplICsgY3dpLT5kYXRhZW50cy5sZW5ndGg7Ci0gIHItPmFkZGVuZCA9IDA7Ci0gIHItPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChjd2ktPmFiZmQsIEJGRF9SRUxPQ19SVkEpOwotICBpZiAoci0+aG93dG8gPT0gTlVMTCkKLSAgICBiZmRfZmF0YWwgKF8oImNhbid0IGdldCBCRkRfUkVMT0NfUlZBIHJlbG9jYXRpb24gdHlwZSIpKTsKLQotICBjd2ktPnJlbG9jcyA9IHhyZWFsbG9jIChjd2ktPnJlbG9jcywKLQkJCSAgKGN3aS0+cmVsb2NfY291bnQgKyAyKSAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gIGN3aS0+cmVsb2NzW2N3aS0+cmVsb2NfY291bnRdID0gcjsKLSAgY3dpLT5yZWxvY3NbY3dpLT5yZWxvY19jb3VudCArIDFdID0gTlVMTDsKLSAgKytjd2ktPnJlbG9jX2NvdW50OwotCi0gIGVyZCA9IChzdHJ1Y3QgZXh0ZXJuX3Jlc19kYXRhICopIGNvZmZfYWxsb2MgKCZjd2ktPmRhdGFlbnRzLCBzaXplb2YgKCplcmQpKTsKLQotICBwdXRjd2lfMzIgKGN3aSwKLQkgICAgIChjd2ktPmRpcnNpemUKLQkgICAgICArIGN3aS0+ZGlyc3Ryc2l6ZQotCSAgICAgICsgY3dpLT5kYXRhZW50c2l6ZQotCSAgICAgICsgY3dpLT5yZXNvdXJjZXMubGVuZ3RoKSwKLQkgICAgIGVyZC0+cnZhKTsKLSAgcHV0Y3dpXzMyIChjd2ksIHJlcy0+Y29mZl9pbmZvLmNvZGVwYWdlLCBlcmQtPmNvZGVwYWdlKTsKLSAgcHV0Y3dpXzMyIChjd2ksIHJlcy0+Y29mZl9pbmZvLnJlc2VydmVkLCBlcmQtPnJlc2VydmVkKTsKLQotICBkID0gcmVzX3RvX2JpbiAocmVzLCBjd2ktPmJpZ19lbmRpYW4pOwotCi0gIGlmIChjd2ktPnJlc291cmNlcy5kID09IE5VTEwpCi0gICAgY3dpLT5yZXNvdXJjZXMuZCA9IGQ7Ci0gIGVsc2UKLSAgICBjd2ktPnJlc291cmNlcy5sYXN0LT5uZXh0ID0gZDsKLQotICBsZW5ndGggPSAwOwotICBmb3IgKDsgZC0+bmV4dCAhPSBOVUxMOyBkID0gZC0+bmV4dCkKLSAgICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotICBsZW5ndGggKz0gZC0+bGVuZ3RoOwotICBjd2ktPnJlc291cmNlcy5sYXN0ID0gZDsKLSAgY3dpLT5yZXNvdXJjZXMubGVuZ3RoICs9IGxlbmd0aDsKLQotICBwdXRjd2lfMzIgKGN3aSwgbGVuZ3RoLCBlcmQtPnNpemUpOwotCi0gIC8qIEZvcmNlIHRoZSBuZXh0IHJlc291cmNlIHRvIGhhdmUgMzIgYml0IGFsaWdubWVudC4gICovCi0KLSAgaWYgKChsZW5ndGggJiAzKSAhPSAwKQotICAgIHsKLSAgICAgIGludCBhZGQ7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpleDsKLQotICAgICAgYWRkID0gNCAtIChsZW5ndGggJiAzKTsKLQotICAgICAgZXggPSBjb2ZmX2FsbG9jICgmY3dpLT5yZXNvdXJjZXMsIGFkZCk7Ci0gICAgICBtZW1zZXQgKGV4LCAwLCBhZGQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Jlc3JjLmMgYi9iaW51dGlscy9yZXNyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjMzYzJhLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Jlc3JjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzc2ICswLDAgQEAKLS8qIHJlc3JjLmMgLS0gcmVhZCBhbmQgd3JpdGUgV2luZG93cyByYyBmaWxlcy4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB0aGF0IHJlYWQgYW5kIHdyaXRlIFdpbmRvd3MgcmMgZmlsZXMuCi0gICBUaGVzZSBhcmUgdGV4dCBmaWxlcyB0aGF0IHJlcHJlc2VudCByZXNvdXJjZXMuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSNkZWZpbmUgcG9wZW4gX3BvcGVuCi0jZGVmaW5lIHBjbG9zZSBfcGNsb3NlCi0jZW5kaWYKLQotLyogVGhlIGRlZmF1bHQgcHJlcHJvY2Vzc29yLiAgKi8KLQotI2RlZmluZSBERUZBVUxUX1BSRVBST0NFU1NPUiAiZ2NjIC1FIC14Yy1oZWFkZXIgLURSQ19JTlZPS0VEIgotCi0vKiBXZSByZWFkIHRoZSBkaXJlY3RvcnkgZW50cmllcyBpbiBhIGN1cnNvciBvciBpY29uIGZpbGUgaW50bwotICAgaW5zdGFuY2VzIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGljb25kaXIKLXsKLSAgLyogV2lkdGggb2YgaW1hZ2UuICAqLwotICB1bnNpZ25lZCBjaGFyIHdpZHRoOwotICAvKiBIZWlnaHQgb2YgaW1hZ2UuICAqLwotICB1bnNpZ25lZCBjaGFyIGhlaWdodDsKLSAgLyogTnVtYmVyIG9mIGNvbG9ycyBpbiBpbWFnZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgY29sb3Jjb3VudDsKLSAgdW5pb24KLSAgewotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIENvbG9yIHBsYW5lcy4gICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCBwbGFuZXM7Ci0gICAgICAvKiBCaXRzIHBlciBwaXhlbC4gICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCBiaXRzOwotICAgIH0gaWNvbjsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBYIGNvb3JkaW5hdGUgb2YgaG90c3BvdC4gICovCi0gICAgICB1bnNpZ25lZCBzaG9ydCB4aG90c3BvdDsKLSAgICAgIC8qIFkgY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgICAgIHVuc2lnbmVkIHNob3J0IHlob3RzcG90OwotICAgIH0gY3Vyc29yOwotICB9IHU7Ci0gIC8qIEJ5dGVzIGluIGltYWdlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBieXRlczsKLSAgLyogRmlsZSBvZmZzZXQgb2YgaW1hZ2UuICAqLwotICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLX07Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSByYyBmaWxlIHdlIGFyZSByZWFkaW5nLiAgKi8KLQotY2hhciAqcmNfZmlsZW5hbWU7Ci0KLS8qIFRoZSBsaW5lIG51bWJlciBpbiB0aGUgcmMgZmlsZS4gICovCi0KLWludCByY19saW5lbm87Ci0KLS8qIFRoZSBwaXBlIHdlIGFyZSByZWFkaW5nIGZyb20sIHNvIHRoYXQgd2UgY2FuIGNsb3NlIGl0IGlmIHdlIGV4aXQuICAqLwotCi1zdGF0aWMgRklMRSAqY3BwX3BpcGU7Ci0KLS8qIEFzIHdlIHJlYWQgdGhlIHJjIGZpbGUsIHdlIGF0dGFjaCBpbmZvcm1hdGlvbiB0byB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotCi0vKiBUaGUgbnVtYmVyIG9mIGN1cnNvciByZXNvdXJjZXMgd2UgaGF2ZSB3cml0dGVuIG91dC4gICovCi0KLXN0YXRpYyBpbnQgY3Vyc29yczsKLQotLyogVGhlIG51bWJlciBvZiBmb250IHJlc291cmNlcyB3ZSBoYXZlIHdyaXR0ZW4gb3V0LiAgKi8KLQotc3RhdGljIGludCBmb250czsKLQotLyogRm9udCBkaXJlY3RvcnkgaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgZm9udGRpciAqZm9udGRpcnM7Ci0KLS8qIFJlc291cmNlIGluZm8gdG8gdXNlIGZvciBmb250ZGlycy4gICovCi0KLXN0cnVjdCByZXNfcmVzX2luZm8gZm9udGRpcnNfcmVzaW5mbzsKLQotLyogVGhlIG51bWJlciBvZiBpY29uIHJlc291cmNlcyB3ZSBoYXZlIHdyaXR0ZW4gb3V0LiAgKi8KLQotc3RhdGljIGludCBpY29uczsKLQotLyogTG9jYWwgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIEZJTEUgKmxvb2tfZm9yX2RlZmF1bHQgUEFSQU1TICgoY2hhciAqLCBjb25zdCBjaGFyICosIGludCwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGNsb3NlX3BpcGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgdW5leHBlY3RlZF9lb2YgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgaW50IGdldF93b3JkIFBBUkFNUyAoKEZJTEUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbG9uZyBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2V0X2RhdGEKLSAgUEFSQU1TICgoRklMRSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZGVmaW5lX2ZvbnRkaXJzIFBBUkFNUyAoKHZvaWQpKTsKLQwKLS8qIGxvb2sgZm9yIHRoZSBwcmVwcm9jZXNzb3IgcHJvZ3JhbSAqLwotCi1zdGF0aWMgRklMRSAqCi1sb29rX2Zvcl9kZWZhdWx0IChjbWQsIHByZWZpeCwgZW5kX3ByZWZpeCwgcHJlcHJvY2FyZ3MsIGZpbGVuYW1lKQotICAgICBjaGFyICpjbWQ7Ci0gICAgIGNvbnN0IGNoYXIgKnByZWZpeDsKLSAgICAgaW50IGVuZF9wcmVmaXg7Ci0gICAgIGNvbnN0IGNoYXIgKnByZXByb2NhcmdzOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgY2hhciAqc3BhY2U7Ci0gIGludCBmb3VuZDsKLSAgc3RydWN0IHN0YXQgczsKLQotICBzdHJjcHkgKGNtZCwgcHJlZml4KTsKLQotICBzcHJpbnRmIChjbWQgKyBlbmRfcHJlZml4LCAiJXMiLCBERUZBVUxUX1BSRVBST0NFU1NPUik7Ci0gIHNwYWNlID0gc3RyY2hyIChjbWQgKyBlbmRfcHJlZml4LCAnICcpOwotICBpZiAoc3BhY2UpCi0gICAgKnNwYWNlID0gMDsKLQotICBpZiAoc3RyY2hyIChjbWQsICcvJykpCi0gICAgewotICAgICAgZm91bmQgPSAoc3RhdCAoY21kLCAmcykgPT0gMAotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLQkgICAgICAgfHwgc3RhdCAoc3RyY2F0IChjbWQsIEVYRUNVVEFCTEVfU1VGRklYKSwgJnMpID09IDAKLSNlbmRpZgotCSAgICAgICApOwotCi0gICAgICBpZiAoISBmb3VuZCkKLQl7Ci0JICBpZiAodmVyYm9zZSkKLQkgICAgZnByaW50ZiAoc3RkZXJyLCAiVHJpZWQgYCVzJ1xuIiwgY21kKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICB9Ci0KLSAgc3RyY3B5IChjbWQsIHByZWZpeCk7Ci0KLSAgc3ByaW50ZiAoY21kICsgZW5kX3ByZWZpeCwgIiVzICVzICVzIiwKLQkgICBERUZBVUxUX1BSRVBST0NFU1NPUiwgcHJlcHJvY2FyZ3MsIGZpbGVuYW1lKTsKLQotICBpZiAodmVyYm9zZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICJVc2luZyBgJXMnXG4iLCBjbWQpOwotCi0gIGNwcF9waXBlID0gcG9wZW4gKGNtZCwgRk9QRU5fUlQpOwotICByZXR1cm4gY3BwX3BpcGU7Ci19Ci0KLS8qIFJlYWQgYW4gcmMgZmlsZS4gICovCi0KLXN0cnVjdCByZXNfZGlyZWN0b3J5ICoKLXJlYWRfcmNfZmlsZSAoZmlsZW5hbWUsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsIGxhbmd1YWdlKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqcHJlcHJvY2Vzc29yOwotICAgICBjb25zdCBjaGFyICpwcmVwcm9jYXJnczsKLSAgICAgaW50IGxhbmd1YWdlOwotewotICBjaGFyICpjbWQ7Ci0KLSAgaWYgKHByZXByb2NhcmdzID09IE5VTEwpCi0gICAgcHJlcHJvY2FyZ3MgPSAiIjsKLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZmlsZW5hbWUgPSAiLSI7Ci0KLSAgaWYgKHByZXByb2Nlc3NvcikKLSAgICB7Ci0gICAgICBjbWQgPSB4bWFsbG9jIChzdHJsZW4gKHByZXByb2Nlc3NvcikKLQkJICAgICArIHN0cmxlbiAocHJlcHJvY2FyZ3MpCi0JCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQotCQkgICAgICsgMTApOwotICAgICAgc3ByaW50ZiAoY21kLCAiJXMgJXMgJXMiLCBwcmVwcm9jZXNzb3IsIHByZXByb2NhcmdzLCBmaWxlbmFtZSk7Ci0KLSAgICAgIGNwcF9waXBlID0gcG9wZW4gKGNtZCwgRk9QRU5fUlQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmRhc2gsICpzbGFzaCwgKmNwOwotCi0gICAgICBwcmVwcm9jZXNzb3IgPSBERUZBVUxUX1BSRVBST0NFU1NPUjsKLQotICAgICAgY21kID0geG1hbGxvYyAoc3RybGVuIChwcm9ncmFtX25hbWUpCi0JCSAgICAgKyBzdHJsZW4gKHByZXByb2Nlc3NvcikKLQkJICAgICArIHN0cmxlbiAocHJlcHJvY2FyZ3MpCi0JCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQotI2lmZGVmIEhBVkVfRVhFQ1VUQUJMRV9TVUZGSVgKLQkJICAgICArIHN0cmxlbiAoRVhFQ1VUQUJMRV9TVUZGSVgpCi0jZW5kaWYKLQkJICAgICArIDEwKTsKLQotCi0gICAgICBkYXNoID0gc2xhc2ggPSAwOwotICAgICAgZm9yIChjcCA9IHByb2dyYW1fbmFtZTsgKmNwOyBjcCsrKQotCXsKLQkgIGlmICgqY3AgPT0gJy0nKQotCSAgICBkYXNoID0gY3A7Ci0JICBpZiAoCi0jaWYgZGVmaW5lZChfX0RKR1BQX18pIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQoX19XSU4zMl9fKQotCSAgICAgICpjcCA9PSAnOicgfHwgKmNwID09ICdcXCcgfHwKLSNlbmRpZgotCSAgICAgICpjcCA9PSAnLycpCi0JICAgIHsKLQkgICAgICBzbGFzaCA9IGNwOwotCSAgICAgIGRhc2ggPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBjcHBfcGlwZSA9IDA7Ci0KLSAgICAgIGlmIChkYXNoKQotCXsKLQkgIC8qIEZpcnN0LCB0cnkgbG9va2luZyBmb3IgYSBwcmVmaXhlZCBnY2MgaW4gdGhlIHdpbmRyZXMKLQkgICAgIGRpcmVjdG9yeSwgd2l0aCB0aGUgc2FtZSBwcmVmaXggYXMgd2luZHJlcyAqLwotCi0JICBjcHBfcGlwZSA9IGxvb2tfZm9yX2RlZmF1bHQgKGNtZCwgcHJvZ3JhbV9uYW1lLCBkYXNoLXByb2dyYW1fbmFtZSsxLAotCQkJCSAgICAgICBwcmVwcm9jYXJncywgZmlsZW5hbWUpOwotCX0KLQotICAgICAgaWYgKHNsYXNoICYmICFjcHBfcGlwZSkKLQl7Ci0JICAvKiBOZXh0LCB0cnkgbG9va2luZyBmb3IgYSBnY2MgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzCi0gICAgICAgICAgICAgdGhhdCB3aW5kcmVzICovCi0KLQkgIGNwcF9waXBlID0gbG9va19mb3JfZGVmYXVsdCAoY21kLCBwcm9ncmFtX25hbWUsIHNsYXNoLXByb2dyYW1fbmFtZSsxLAotCQkJCSAgICAgICBwcmVwcm9jYXJncywgZmlsZW5hbWUpOwotCX0KLQotICAgICAgaWYgKCFjcHBfcGlwZSkKLQl7Ci0JICAvKiBTaWdoLCB0cnkgdGhlIGRlZmF1bHQgKi8KLQotCSAgY3BwX3BpcGUgPSBsb29rX2Zvcl9kZWZhdWx0IChjbWQsICIiLCAwLCBwcmVwcm9jYXJncywgZmlsZW5hbWUpOwotCX0KLQotICAgIH0KLSAgaWYgKGNwcF9waXBlID09IE5VTEwpCi0gICAgZmF0YWwgKF8oImNhbid0IHBvcGVuIGAlcyc6ICVzIiksIGNtZCwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gIGZyZWUgKGNtZCk7Ci0KLSAgeGF0ZXhpdCAoY2xvc2VfcGlwZSk7Ci0KLSAgcmNfZmlsZW5hbWUgPSB4c3RyZHVwIChmaWxlbmFtZSk7Ci0gIHJjX2xpbmVubyA9IDE7Ci0gIGlmIChsYW5ndWFnZSAhPSAtMSkKLSAgICByY3BhcnNlX3NldF9sYW5ndWFnZSAobGFuZ3VhZ2UpOwotICB5eWluID0gY3BwX3BpcGU7Ci0gIHl5cGFyc2UgKCk7Ci0KLSAgaWYgKHBjbG9zZSAoY3BwX3BpcGUpICE9IDApCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogd2FybmluZzogcHJlcHJvY2Vzc29yIGZhaWxlZFxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGNwcF9waXBlID0gTlVMTDsKLQotICBpZiAoZm9udGRpcnMgIT0gTlVMTCkKLSAgICBkZWZpbmVfZm9udGRpcnMgKCk7Ci0KLSAgZnJlZSAocmNfZmlsZW5hbWUpOwotICByY19maWxlbmFtZSA9IE5VTEw7Ci0KLSAgcmV0dXJuIHJlc291cmNlczsKLX0KLQotLyogQ2xvc2UgdGhlIHBpcGUgaWYgaXQgaXMgb3Blbi4gIFRoaXMgaXMgY2FsbGVkIHZpYSB4YXRleGl0LiAgKi8KLQotdm9pZAotY2xvc2VfcGlwZSAoKQotewotICBpZiAoY3BwX3BpcGUgIT0gTlVMTCkKLSAgICBwY2xvc2UgKGNwcF9waXBlKTsKLX0KLQotLyogUmVwb3J0IGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgYW4gcmMgZmlsZS4gICovCi0KLXZvaWQKLXl5ZXJyb3IgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBmYXRhbCAoIiVzOiVkOiAlcyIsIHJjX2ZpbGVuYW1lLCByY19saW5lbm8sIG1zZyk7Ci19Ci0KLS8qIElzc3VlIGEgd2FybmluZyB3aGlsZSByZWFkaW5nIGFuIHJjIGZpbGUuICAqLwotCi12b2lkCi1yY3BhcnNlX3dhcm5pbmcgKG1zZykKLSAgICAgY29uc3QgY2hhciAqbXNnOwotewotICBmcHJpbnRmIChzdGRlcnIsICIlczolZDogJXNcbiIsIHJjX2ZpbGVuYW1lLCByY19saW5lbm8sIG1zZyk7Ci19Ci0KLS8qIERpZSBpZiB3ZSBnZXQgYW4gdW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi11bmV4cGVjdGVkX2VvZiAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGZhdGFsIChfKCIlczogdW5leHBlY3RlZCBFT0YiKSwgbXNnKTsKLX0KLQotLyogUmVhZCBhIDE2IGJpdCB3b3JkIGZyb20gYSBmaWxlLiAgVGhlIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBsaXR0bGUKLSAgIGVuZGlhbi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF93b3JkIChlLCBtc2cpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZzsKLXsKLSAgaW50IGIxLCBiMjsKLQotICBiMSA9IGdldGMgKGUpOwotICBiMiA9IGdldGMgKGUpOwotICBpZiAoZmVvZiAoZSkpCi0gICAgdW5leHBlY3RlZF9lb2YgKG1zZyk7Ci0gIHJldHVybiAoKGIyICYgMHhmZikgPDwgOCkgfCAoYjEgJiAweGZmKTsKLX0KLQotLyogUmVhZCBhIDMyIGJpdCB3b3JkIGZyb20gYSBmaWxlLiAgVGhlIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBsaXR0bGUKLSAgIGVuZGlhbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1nZXRfbG9uZyAoZSwgbXNnKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBiMSwgYjIsIGIzLCBiNDsKLQotICBiMSA9IGdldGMgKGUpOwotICBiMiA9IGdldGMgKGUpOwotICBiMyA9IGdldGMgKGUpOwotICBiNCA9IGdldGMgKGUpOwotICBpZiAoZmVvZiAoZSkpCi0gICAgdW5leHBlY3RlZF9lb2YgKG1zZyk7Ci0gIHJldHVybiAoKCgoKCgoYjQgJiAweGZmKSA8PCA4KQotCSAgICAgIHwgKGIzICYgMHhmZikpIDw8IDgpCi0JICAgIHwgKGIyICYgMHhmZikpIDw8IDgpCi0JICB8IChiMSAmIDB4ZmYpKTsKLX0KLQotLyogUmVhZCBkYXRhIGZyb20gYSBmaWxlLiAgVGhpcyBpcyBhIHdyYXBwZXIgdG8gZG8gZXJyb3IgY2hlY2tpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotZ2V0X2RhdGEgKGUsIHAsIGMsIG1zZykKLSAgICAgRklMRSAqZTsKLSAgICAgdW5zaWduZWQgY2hhciAqcDsKLSAgICAgdW5zaWduZWQgbG9uZyBjOwotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgZ290OwotCi0gIGdvdCA9IGZyZWFkIChwLCAxLCBjLCBlKTsKLSAgaWYgKGdvdCA9PSBjKQotICAgIHJldHVybjsKLQotICBmYXRhbCAoXygiJXM6IHJlYWQgb2YgJWx1IHJldHVybmVkICVsdSIpLCBtc2csIGMsIGdvdCk7Ci19Ci0MCi0vKiBEZWZpbmUgYW4gYWNjZWxlcmF0b3IgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfYWNjZWxlcmF0b3IgKGlkLCByZXNpbmZvLCBkYXRhKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmRhdGE7Ci17Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfQUNDRUxFUkFUT1IsIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0FDQ0VMRVJBVE9SOwotICByLT51LmFjYyA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGJpdG1hcCByZXNvdXJjZS4gIEJpdG1hcCBkYXRhIGlzIHN0b3JlZCBpbiBhIGZpbGUuICBUaGUKLSAgIGZpcnN0IDE0IGJ5dGVzIG9mIHRoZSBmaWxlIGFyZSBhIHN0YW5kYXJkIGhlYWRlciwgd2hpY2ggaXMgbm90Ci0gICBpbmNsdWRlZCBpbiB0aGUgcmVzb3VyY2UgZGF0YS4gICovCi0KLSNkZWZpbmUgQklUTUFQX1NLSVAgKDE0KQotCi12b2lkCi1kZWZpbmVfYml0bWFwIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBpbnQgaTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBlID0gb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIEZPUEVOX1JCLCAiYml0bWFwIGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplIC0gQklUTUFQX1NLSVApOwotCi0gIGZvciAoaSA9IDA7IGkgPCBCSVRNQVBfU0tJUDsgaSsrKQotICAgIGdldGMgKGUpOwotCi0gIGdldF9kYXRhIChlLCBkYXRhLCBzLnN0X3NpemUgLSBCSVRNQVBfU0tJUCwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfQklUTUFQLCBpZCwKLQkJCQlyZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0KLSAgci0+dHlwZSA9IFJFU19UWVBFX0JJVE1BUDsKLSAgci0+dS5kYXRhLmxlbmd0aCA9IHMuc3Rfc2l6ZSAtIEJJVE1BUF9TS0lQOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGN1cnNvciByZXNvdXJjZS4gIEEgY3Vyc29yIGZpbGUgbWF5IGNvbnRhaW4gYSBzZXQgb2YKLSAgIGJpdG1hcHMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSBzYW1lIGN1cnNvciBhdCB2YXJpb3VzIGRpZmZlcmVudAotICAgcmVzb2x1dGlvbnMuICBUaGV5IGVhY2ggZ2V0IHdyaXR0ZW4gb3V0IHdpdGggYSBkaWZmZXJlbnQgSUQuICBUaGUKLSAgIHJlYWwgY3Vyc29yIHJlc291cmNlIGlzIHRoZW4gYSBncm91cCByZXNvdXJjZSB3aGljaCBjYW4gYmUgdXNlZCB0bwotICAgc2VsZWN0IG9uZSBvZiB0aGUgYWN0dWFsIGN1cnNvcnMuICAqLwotCi12b2lkCi1kZWZpbmVfY3Vyc29yIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBpbnQgdHlwZSwgY291bnQsIGk7Ci0gIHN0cnVjdCBpY29uZGlyICppY29uZGlyczsKLSAgaW50IGZpcnN0X2N1cnNvcjsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgc3RydWN0IGdyb3VwX2N1cnNvciAqZmlyc3QsICoqcHA7Ci0KLSAgZSA9IG9wZW5fZmlsZV9zZWFyY2ggKGZpbGVuYW1lLCBGT1BFTl9SQiwgImN1cnNvciBmaWxlIiwgJnJlYWxfZmlsZW5hbWUpOwotCi0gIC8qIEEgY3Vyc29yIGZpbGUgaXMgYmFzaWNhbGx5IGFuIGljb24gZmlsZS4gIFRoZSBzdGFydCBvZiB0aGUgZmlsZQotICAgICBpcyBhIHRocmVlIHdvcmQgc3RydWN0dXJlLiAgVGhlIGZpcnN0IHdvcmQgaXMgaWdub3JlZC4gIFRoZQotICAgICBzZWNvbmQgd29yZCBpcyB0aGUgdHlwZSBvZiBkYXRhLiAgVGhlIHRoaXJkIHdvcmQgaXMgdGhlIG51bWJlciBvZgotICAgICBlbnRyaWVzLiAgKi8KLQotICBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIHR5cGUgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIGNvdW50ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICBpZiAodHlwZSAhPSAyKQotICAgIGZhdGFsIChfKCJjdXJzb3IgZmlsZSBgJXMnIGRvZXMgbm90IGNvbnRhaW4gY3Vyc29yIGRhdGEiKSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogUmVhZCBpbiB0aGUgaWNvbiBkaXJlY3RvcnkgZW50cmllcy4gICovCi0KLSAgaWNvbmRpcnMgPSAoc3RydWN0IGljb25kaXIgKikgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKmljb25kaXJzKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpY29uZGlyc1tpXS53aWR0aCA9IGdldGMgKGUpOwotICAgICAgaWNvbmRpcnNbaV0uaGVpZ2h0ID0gZ2V0YyAoZSk7Ci0gICAgICBpY29uZGlyc1tpXS5jb2xvcmNvdW50ID0gZ2V0YyAoZSk7Ci0gICAgICBnZXRjIChlKTsKLSAgICAgIGljb25kaXJzW2ldLnUuY3Vyc29yLnhob3RzcG90ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICAgICAgaWNvbmRpcnNbaV0udS5jdXJzb3IueWhvdHNwb3QgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gICAgICBpY29uZGlyc1tpXS5ieXRlcyA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgICAgIGljb25kaXJzW2ldLm9mZnNldCA9IGdldF9sb25nIChlLCByZWFsX2ZpbGVuYW1lKTsKLQotICAgICAgaWYgKGZlb2YgKGUpKQotCXVuZXhwZWN0ZWRfZW9mIChyZWFsX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgLyogRGVmaW5lIGVhY2ggY3Vyc29yIGFzIGEgdW5pcXVlIHJlc291cmNlLiAgKi8KLQotICBmaXJzdF9jdXJzb3IgPSBjdXJzb3JzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gICAgICBzdHJ1Y3QgcmVzX2lkIG5hbWU7Ci0gICAgICBzdHJ1Y3QgY3Vyc29yICpjOwotCi0gICAgICBpZiAoZnNlZWsgKGUsIGljb25kaXJzW2ldLm9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JZmF0YWwgKF8oIiVzOiBmc2VlayB0byAlbHUgZmFpbGVkOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgICAgICBpY29uZGlyc1tpXS5vZmZzZXQsIHN0cmVycm9yIChlcnJubykpOwotCi0gICAgICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChpY29uZGlyc1tpXS5ieXRlcyk7Ci0KLSAgICAgIGdldF9kYXRhIChlLCBkYXRhLCBpY29uZGlyc1tpXS5ieXRlcywgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgIGMgPSAoc3RydWN0IGN1cnNvciAqKSByZXNfYWxsb2MgKHNpemVvZiAqYyk7Ci0gICAgICBjLT54aG90c3BvdCA9IGljb25kaXJzW2ldLnUuY3Vyc29yLnhob3RzcG90OwotICAgICAgYy0+eWhvdHNwb3QgPSBpY29uZGlyc1tpXS51LmN1cnNvci55aG90c3BvdDsKLSAgICAgIGMtPmxlbmd0aCA9IGljb25kaXJzW2ldLmJ5dGVzOwotICAgICAgYy0+ZGF0YSA9IGRhdGE7Ci0KLSAgICAgICsrY3Vyc29yczsKLQotICAgICAgbmFtZS5uYW1lZCA9IDA7Ci0gICAgICBuYW1lLnUuaWQgPSBjdXJzb3JzOwotCi0gICAgICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9DVVJTT1IsIG5hbWUsCi0JCQkJICAgIHJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9DVVJTT1I7Ci0gICAgICByLT51LmN1cnNvciA9IGM7Ci0gICAgICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotICAgIH0KLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBEZWZpbmUgYSBjdXJzb3IgZ3JvdXAgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBncm91cF9jdXJzb3IgKmNnOwotCi0gICAgICBjZyA9IChzdHJ1Y3QgZ3JvdXBfY3Vyc29yICopIHJlc19hbGxvYyAoc2l6ZW9mICpjZyk7Ci0gICAgICBjZy0+bmV4dCA9IE5VTEw7Ci0gICAgICBjZy0+d2lkdGggPSBpY29uZGlyc1tpXS53aWR0aDsKLSAgICAgIGNnLT5oZWlnaHQgPSAyICogaWNvbmRpcnNbaV0uaGVpZ2h0OwotCi0gICAgICAvKiBGSVhNRTogV2hhdCBzaG91bGQgdGhlc2UgYmUgc2V0IHRvPyAgKi8KLSAgICAgIGNnLT5wbGFuZXMgPSAxOwotICAgICAgY2ctPmJpdHMgPSAxOwotCi0gICAgICBjZy0+Ynl0ZXMgPSBpY29uZGlyc1tpXS5ieXRlcyArIDQ7Ci0gICAgICBjZy0+aW5kZXggPSBmaXJzdF9jdXJzb3IgKyBpICsgMTsKLQotICAgICAgKnBwID0gY2c7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoaWNvbmRpcnMpOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0dST1VQX0NVUlNPUiwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfR1JPVVBfQ1VSU09SOwotICByLT51Lmdyb3VwX2N1cnNvciA9IGZpcnN0OwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBkaWFsb2cgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfZGlhbG9nIChpZCwgcmVzaW5mbywgZGlhbG9nKQotICAgICBzdHJ1Y3QgcmVzX2lkIGlkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci17Ci0gIHN0cnVjdCBkaWFsb2cgKmNvcHk7Ci0gIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0KLSAgY29weSA9IChzdHJ1Y3QgZGlhbG9nICopIHJlc19hbGxvYyAoc2l6ZW9mICpjb3B5KTsKLSAgKmNvcHkgPSAqZGlhbG9nOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0RJQUxPRywgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfRElBTE9HOwotICByLT51LmRpYWxvZyA9IGNvcHk7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIGRpYWxvZyBjb250cm9sLiAgVGhpcyBkb2VzIG5vdCBkZWZpbmUgYSByZXNvdXJjZSwgYnV0Ci0gICBtZXJlbHkgYWxsb2NhdGVzIGFuZCBmaWxscyBpbiBhIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBkaWFsb2dfY29udHJvbCAqCi1kZWZpbmVfY29udHJvbCAodGV4dCwgaWQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGNsYXNzLCBzdHlsZSwgZXhzdHlsZSkKLSAgICAgY29uc3QgY2hhciAqdGV4dDsKLSAgICAgdW5zaWduZWQgbG9uZyBpZDsKLSAgICAgdW5zaWduZWQgbG9uZyB4OwotICAgICB1bnNpZ25lZCBsb25nIHk7Ci0gICAgIHVuc2lnbmVkIGxvbmcgd2lkdGg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaGVpZ2h0OwotICAgICB1bnNpZ25lZCBsb25nIGNsYXNzOwotICAgICB1bnNpZ25lZCBsb25nIHN0eWxlOwotICAgICB1bnNpZ25lZCBsb25nIGV4c3R5bGU7Ci17Ci0gIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqbjsKLQotICBuID0gKHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKSByZXNfYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBOVUxMOwotICBuLT5pZCA9IGlkOwotICBuLT5zdHlsZSA9IHN0eWxlOwotICBuLT5leHN0eWxlID0gZXhzdHlsZTsKLSAgbi0+eCA9IHg7Ci0gIG4tPnkgPSB5OwotICBuLT53aWR0aCA9IHdpZHRoOwotICBuLT5oZWlnaHQgPSBoZWlnaHQ7Ci0gIG4tPmNsYXNzLm5hbWVkID0gMDsKLSAgbi0+Y2xhc3MudS5pZCA9IGNsYXNzOwotICBpZiAodGV4dCAhPSBOVUxMKQotICAgIHJlc19zdHJpbmdfdG9faWQgKCZuLT50ZXh0LCB0ZXh0KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG4tPnRleHQubmFtZWQgPSAwOwotICAgICAgbi0+dGV4dC51LmlkID0gMDsKLSAgICB9Ci0gIG4tPmRhdGEgPSBOVUxMOwotICBuLT5oZWxwID0gMDsKLQotICByZXR1cm4gbjsKLX0KLQotLyogRGVmaW5lIGEgZm9udCByZXNvdXJjZS4gICovCi0KLXZvaWQKLWRlZmluZV9mb250IChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBsb25nIG9mZnNldDsKLSAgbG9uZyBmb250ZGF0YWxlbmd0aDsKLSAgdW5zaWduZWQgY2hhciAqZm9udGRhdGE7Ci0gIHN0cnVjdCBmb250ZGlyICpmZDsKLSAgY29uc3QgY2hhciAqZGV2aWNlLCAqZmFjZTsKLSAgc3RydWN0IGZvbnRkaXIgKipwcDsKLQotICBlID0gb3Blbl9maWxlX3NlYXJjaCAoZmlsZW5hbWUsIEZPUEVOX1JCLCAiZm9udCBmaWxlIiwgJnJlYWxfZmlsZW5hbWUpOwotCi0gIGlmIChzdGF0IChyZWFsX2ZpbGVuYW1lLCAmcykgPCAwKQotICAgIGZhdGFsIChfKCJzdGF0IGZhaWxlZCBvbiBiaXRtYXAgZmlsZSBgJXMnOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgIHN0cmVycm9yIChlcnJubykpOwotCi0gIGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKHMuc3Rfc2l6ZSk7Ci0KLSAgZ2V0X2RhdGEgKGUsIGRhdGEsIHMuc3Rfc2l6ZSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfRk9OVCwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotCi0gIHItPnR5cGUgPSBSRVNfVFlQRV9GT05UOwotICByLT51LmRhdGEubGVuZ3RoID0gcy5zdF9zaXplOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci0KLSAgLyogRm9yIGVhY2ggZm9udCByZXNvdXJjZSwgd2UgbXVzdCBhZGQgYW4gZW50cnkgaW4gdGhlIEZPTlRESVIKLSAgICAgcmVzb3VyY2UuICBUaGUgRk9OVERJUiByZXNvdXJjZSBpbmNsdWRlcyBzb21lIHN0cmluZ3MgaW4gdGhlIGZvbnQKLSAgICAgZmlsZS4gIFRvIGZpbmQgdGhlbSwgd2UgaGF2ZSB0byBkbyBzb21lIG1hZ2ljIG9uIHRoZSBkYXRhIHdlIGhhdmUKLSAgICAgcmVhZC4gICovCi0KLSAgb2Zmc2V0ID0gKCgoKCgoZGF0YVs0N10gPDwgOCkKLQkJfCBkYXRhWzQ2XSkgPDwgOCkKLQkgICAgICB8IGRhdGFbNDVdKSA8PCA4KQotCSAgICB8IGRhdGFbNDRdKTsKLSAgaWYgKG9mZnNldCA+IDAgJiYgb2Zmc2V0IDwgcy5zdF9zaXplKQotICAgIGRldmljZSA9IChjaGFyICopIGRhdGEgKyBvZmZzZXQ7Ci0gIGVsc2UKLSAgICBkZXZpY2UgPSAiIjsKLQotICBvZmZzZXQgPSAoKCgoKChkYXRhWzUxXSA8PCA4KQotCQl8IGRhdGFbNTBdKSA8PCA4KQotCSAgICAgIHwgZGF0YVs0OV0pIDw8IDgpCi0JICAgIHwgZGF0YVs0OF0pOwotICBpZiAob2Zmc2V0ID4gMCAmJiBvZmZzZXQgPCBzLnN0X3NpemUpCi0gICAgZmFjZSA9IChjaGFyICopIGRhdGEgKyBvZmZzZXQ7Ci0gIGVsc2UKLSAgICBmYWNlID0gIiI7Ci0KLSAgKytmb250czsKLQotICBmb250ZGF0YWxlbmd0aCA9IDU4ICsgc3RybGVuIChkZXZpY2UpICsgc3RybGVuIChmYWNlKTsKLSAgZm9udGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSByZXNfYWxsb2MgKGZvbnRkYXRhbGVuZ3RoKTsKLSAgbWVtY3B5IChmb250ZGF0YSwgZGF0YSwgNTYpOwotICBzdHJjcHkgKChjaGFyICopIGZvbnRkYXRhICsgNTYsIGRldmljZSk7Ci0gIHN0cmNweSAoKGNoYXIgKikgZm9udGRhdGEgKyA1NyArIHN0cmxlbiAoZGV2aWNlKSwgZmFjZSk7Ci0KLSAgZmQgPSAoc3RydWN0IGZvbnRkaXIgKikgcmVzX2FsbG9jIChzaXplb2YgKmZkKTsKLSAgZmQtPm5leHQgPSBOVUxMOwotICBmZC0+aW5kZXggPSBmb250czsKLSAgZmQtPmxlbmd0aCA9IGZvbnRkYXRhbGVuZ3RoOwotICBmZC0+ZGF0YSA9IGZvbnRkYXRhOwotCi0gIGZvciAocHAgPSAmZm9udGRpcnM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IGZkOwotCi0gIC8qIEZvciB0aGUgc2luZ2xlIGZvbnRkaXJzIHJlc291cmNlLCB3ZSBhbHdheXMgdXNlIHRoZSByZXNvdXJjZQotICAgICBpbmZvcm1hdGlvbiBvZiB0aGUgbGFzdCBmb250LiAgSSBkb24ndCBrbm93IHdoYXQgZWxzZSB0byBkby4gICovCi0gIGZvbnRkaXJzX3Jlc2luZm8gPSAqcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIHRoZSBmb250ZGlycyByZXNvdXJjZS4gIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBlbnRpcmUgcmMKLSAgIGZpbGUgaGFzIGJlZW4gcGFyc2VkLCBpZiBhbnkgZm9udCByZXNvdXJjZXMgd2VyZSBzZWVuLiAgKi8KLQotc3RhdGljIHZvaWQKLWRlZmluZV9mb250ZGlycyAoKQotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotICBzdHJ1Y3QgcmVzX2lkIGlkOwotCi0gIGlkLm5hbWVkID0gMDsKLSAgaWQudS5pZCA9IDE7Ci0KLSAgciA9IGRlZmluZV9zdGFuZGFyZF9yZXNvdXJjZSAoJnJlc291cmNlcywgUlRfRk9OVERJUiwgaWQsIDB4NDA5LCAwKTsKLQotICByLT50eXBlID0gUkVTX1RZUEVfRk9OVERJUjsKLSAgci0+dS5mb250ZGlyID0gZm9udGRpcnM7Ci0gIHItPnJlc19pbmZvID0gZm9udGRpcnNfcmVzaW5mbzsKLX0KLQotLyogRGVmaW5lIGFuIGljb24gcmVzb3VyY2UuICBBbiBpY29uIGZpbGUgbWF5IGNvbnRhaW4gYSBzZXQgb2YKLSAgIGJpdG1hcHMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSBzYW1lIGljb24gYXQgdmFyaW91cyBkaWZmZXJlbnQKLSAgIHJlc29sdXRpb25zLiAgVGhleSBlYWNoIGdldCB3cml0dGVuIG91dCB3aXRoIGEgZGlmZmVyZW50IElELiAgVGhlCi0gICByZWFsIGljb24gcmVzb3VyY2UgaXMgdGhlbiBhIGdyb3VwIHJlc291cmNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi0gICBzZWxlY3Qgb25lIG9mIHRoZSBhY3R1YWwgaWNvbiBiaXRtYXBzLiAgKi8KLQotdm9pZAotZGVmaW5lX2ljb24gKGlkLCByZXNpbmZvLCBmaWxlbmFtZSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIGludCB0eXBlLCBjb3VudCwgaTsKLSAgc3RydWN0IGljb25kaXIgKmljb25kaXJzOwotICBpbnQgZmlyc3RfaWNvbjsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLSAgc3RydWN0IGdyb3VwX2ljb24gKmZpcnN0LCAqKnBwOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJpY29uIGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogVGhlIHN0YXJ0IG9mIGFuIGljb24gZmlsZSBpcyBhIHRocmVlIHdvcmQgc3RydWN0dXJlLiAgVGhlIGZpcnN0Ci0gICAgIHdvcmQgaXMgaWdub3JlZC4gIFRoZSBzZWNvbmQgd29yZCBpcyB0aGUgdHlwZSBvZiBkYXRhLiAgVGhlIHRoaXJkCi0gICAgIHdvcmQgaXMgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgKi8KLQotICBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIHR5cGUgPSBnZXRfd29yZCAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gIGNvdW50ID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICBpZiAodHlwZSAhPSAxKQotICAgIGZhdGFsIChfKCJpY29uIGZpbGUgYCVzJyBkb2VzIG5vdCBjb250YWluIGljb24gZGF0YSIpLCByZWFsX2ZpbGVuYW1lKTsKLQotICAvKiBSZWFkIGluIHRoZSBpY29uIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLQotICBpY29uZGlycyA9IChzdHJ1Y3QgaWNvbmRpciAqKSB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAqaWNvbmRpcnMpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGljb25kaXJzW2ldLndpZHRoID0gZ2V0YyAoZSk7Ci0gICAgICBpY29uZGlyc1tpXS5oZWlnaHQgPSBnZXRjIChlKTsKLSAgICAgIGljb25kaXJzW2ldLmNvbG9yY291bnQgPSBnZXRjIChlKTsKLSAgICAgIGdldGMgKGUpOwotICAgICAgaWNvbmRpcnNbaV0udS5pY29uLnBsYW5lcyA9IGdldF93b3JkIChlLCByZWFsX2ZpbGVuYW1lKTsKLSAgICAgIGljb25kaXJzW2ldLnUuaWNvbi5iaXRzID0gZ2V0X3dvcmQgKGUsIHJlYWxfZmlsZW5hbWUpOwotICAgICAgaWNvbmRpcnNbaV0uYnl0ZXMgPSBnZXRfbG9uZyAoZSwgcmVhbF9maWxlbmFtZSk7Ci0gICAgICBpY29uZGlyc1tpXS5vZmZzZXQgPSBnZXRfbG9uZyAoZSwgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgIGlmIChmZW9mIChlKSkKLQl1bmV4cGVjdGVkX2VvZiAocmVhbF9maWxlbmFtZSk7Ci0gICAgfQotCi0gIC8qIERlZmluZSBlYWNoIGljb24gYXMgYSB1bmlxdWUgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0X2ljb24gPSBpY29uczsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICAgc3RydWN0IHJlc19pZCBuYW1lOwotCi0gICAgICBpZiAoZnNlZWsgKGUsIGljb25kaXJzW2ldLm9mZnNldCwgU0VFS19TRVQpICE9IDApCi0JZmF0YWwgKF8oIiVzOiBmc2VlayB0byAlbHUgZmFpbGVkOiAlcyIpLCByZWFsX2ZpbGVuYW1lLAotCSAgICAgICBpY29uZGlyc1tpXS5vZmZzZXQsIHN0cmVycm9yIChlcnJubykpOwotCi0gICAgICBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgcmVzX2FsbG9jIChpY29uZGlyc1tpXS5ieXRlcyk7Ci0KLSAgICAgIGdldF9kYXRhIChlLCBkYXRhLCBpY29uZGlyc1tpXS5ieXRlcywgcmVhbF9maWxlbmFtZSk7Ci0KLSAgICAgICsraWNvbnM7Ci0KLSAgICAgIG5hbWUubmFtZWQgPSAwOwotICAgICAgbmFtZS51LmlkID0gaWNvbnM7Ci0KLSAgICAgIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0lDT04sIG5hbWUsCi0JCQkJICAgIHJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9JQ09OOwotICAgICAgci0+dS5kYXRhLmxlbmd0aCA9IGljb25kaXJzW2ldLmJ5dGVzOwotICAgICAgci0+dS5kYXRhLmRhdGEgPSBkYXRhOwotICAgICAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLSAgICB9Ci0KLSAgZmNsb3NlIChlKTsKLSAgZnJlZSAocmVhbF9maWxlbmFtZSk7Ci0KLSAgLyogRGVmaW5lIGFuIGljb24gZ3JvdXAgcmVzb3VyY2UuICAqLwotCi0gIGZpcnN0ID0gTlVMTDsKLSAgcHAgPSAmZmlyc3Q7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBncm91cF9pY29uICpjZzsKLQotICAgICAgLyogRm9yIHNvbWUgcmVhc29uLCBhdCBsZWFzdCBpbiBzb21lIGZpbGVzIHRoZSBwbGFuZXMgYW5kIGJpdHMKLSAgICAgICAgIGFyZSB6ZXJvLiAgV2UgaW5zdGVhZCBzZXQgdGhlbSBmcm9tIHRoZSBjb2xvci4gIFRoaXMgaXMKLSAgICAgICAgIGNvcGllZCBmcm9tIHJjbC4gICovCi0KLSAgICAgIGNnID0gKHN0cnVjdCBncm91cF9pY29uICopIHJlc19hbGxvYyAoc2l6ZW9mICpjZyk7Ci0gICAgICBjZy0+bmV4dCA9IE5VTEw7Ci0gICAgICBjZy0+d2lkdGggPSBpY29uZGlyc1tpXS53aWR0aDsKLSAgICAgIGNnLT5oZWlnaHQgPSBpY29uZGlyc1tpXS5oZWlnaHQ7Ci0gICAgICBjZy0+Y29sb3JzID0gaWNvbmRpcnNbaV0uY29sb3Jjb3VudDsKLQotICAgICAgY2ctPnBsYW5lcyA9IDE7Ci0gICAgICBjZy0+Yml0cyA9IDA7Ci0gICAgICB3aGlsZSAoKDEgPDwgY2ctPmJpdHMpIDwgY2ctPmNvbG9ycykKLQkrK2NnLT5iaXRzOwotCi0gICAgICBjZy0+Ynl0ZXMgPSBpY29uZGlyc1tpXS5ieXRlczsKLSAgICAgIGNnLT5pbmRleCA9IGZpcnN0X2ljb24gKyBpICsgMTsKLQotICAgICAgKnBwID0gY2c7Ci0gICAgICBwcCA9ICYoKnBwKS0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoaWNvbmRpcnMpOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX0dST1VQX0lDT04sIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLSAgci0+dHlwZSA9IFJFU19UWVBFX0dST1VQX0lDT047Ci0gIHItPnUuZ3JvdXBfaWNvbiA9IGZpcnN0OwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBtZW51IHJlc291cmNlLiAgKi8KLQotdm9pZAotZGVmaW5lX21lbnUgKGlkLCByZXNpbmZvLCBtZW51aXRlbXMpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIHN0cnVjdCBtZW51aXRlbSAqbWVudWl0ZW1zOwotewotICBzdHJ1Y3QgbWVudSAqbTsKLSAgc3RydWN0IHJlc19yZXNvdXJjZSAqcjsKLQotICBtID0gKHN0cnVjdCBtZW51ICopIHJlc19hbGxvYyAoc2l6ZW9mICptKTsKLSAgbS0+aXRlbXMgPSBtZW51aXRlbXM7Ci0gIG0tPmhlbHAgPSAwOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX01FTlUsIGlkLCByZXNpbmZvLT5sYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9NRU5VOwotICByLT51Lm1lbnUgPSBtOwotICByLT5yZXNfaW5mbyA9ICpyZXNpbmZvOwotfQotCi0vKiBEZWZpbmUgYSBtZW51IGl0ZW0uICBUaGlzIGRvZXMgbm90IGRlZmluZSBhIHJlc291cmNlLCBidXQgbWVyZWx5Ci0gICBhbGxvY2F0ZXMgYW5kIGZpbGxzIGluIGEgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG1lbnVpdGVtICoKLWRlZmluZV9tZW51aXRlbSAodGV4dCwgbWVudWlkLCB0eXBlLCBzdGF0ZSwgaGVscCwgbWVudWl0ZW1zKQotICAgICBjb25zdCBjaGFyICp0ZXh0OwotICAgICBpbnQgbWVudWlkOwotICAgICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3RhdGU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaGVscDsKLSAgICAgc3RydWN0IG1lbnVpdGVtICptZW51aXRlbXM7Ci17Ci0gIHN0cnVjdCBtZW51aXRlbSAqbWk7Ci0KLSAgbWkgPSAoc3RydWN0IG1lbnVpdGVtICopIHJlc19hbGxvYyAoc2l6ZW9mICptaSk7Ci0gIG1pLT5uZXh0ID0gTlVMTDsKLSAgbWktPnR5cGUgPSB0eXBlOwotICBtaS0+c3RhdGUgPSBzdGF0ZTsKLSAgbWktPmlkID0gbWVudWlkOwotICBpZiAodGV4dCA9PSBOVUxMKQotICAgIG1pLT50ZXh0ID0gTlVMTDsKLSAgZWxzZQotICAgIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmbWktPnRleHQsIHRleHQpOwotICBtaS0+aGVscCA9IGhlbHA7Ci0gIG1pLT5wb3B1cCA9IG1lbnVpdGVtczsKLSAgcmV0dXJuIG1pOwotfQotCi0vKiBEZWZpbmUgYSBtZXNzYWdldGFibGUgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfbWVzc2FnZXRhYmxlIChpZCwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKnJlc2luZm87Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICplOwotICBjaGFyICpyZWFsX2ZpbGVuYW1lOwotICBzdHJ1Y3Qgc3RhdCBzOwotICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJtZXNzYWdldGFibGUgZmlsZSIsCi0JCQkmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplKTsKLQotICBnZXRfZGF0YSAoZSwgZGF0YSwgcy5zdF9zaXplLCByZWFsX2ZpbGVuYW1lKTsKLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICByID0gZGVmaW5lX3N0YW5kYXJkX3Jlc291cmNlICgmcmVzb3VyY2VzLCBSVF9NRVNTQUdFVEFCTEUsIGlkLAotCQkJCXJlc2luZm8tPmxhbmd1YWdlLCAwKTsKLQotICByLT50eXBlID0gUkVTX1RZUEVfTUVTU0FHRVRBQkxFOwotICByLT51LmRhdGEubGVuZ3RoID0gcy5zdF9zaXplOwotICByLT51LmRhdGEuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhbiByY2RhdGEgcmVzb3VyY2UuICAqLwotCi12b2lkCi1kZWZpbmVfcmNkYXRhIChpZCwgcmVzaW5mbywgZGF0YSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgc3RydWN0IHJjZGF0YV9pdGVtICpkYXRhOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1JDREFUQSwgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfUkNEQVRBOwotICByLT51LnJjZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIENyZWF0ZSBhbiByY2RhdGEgaXRlbSBob2xkaW5nIGEgc3RyaW5nLiAgKi8KLQotc3RydWN0IHJjZGF0YV9pdGVtICoKLWRlZmluZV9yY2RhdGFfc3RyaW5nIChzdHJpbmcsIGxlbikKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICB1bnNpZ25lZCBsb25nIGxlbjsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLSAgY2hhciAqczsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IFJDREFUQV9TVFJJTkc7Ci0gIHJpLT51LnN0cmluZy5sZW5ndGggPSBsZW47Ci0gIHMgPSAoY2hhciAqKSByZXNfYWxsb2MgKGxlbik7Ci0gIG1lbWNweSAocywgc3RyaW5nLCBsZW4pOwotICByaS0+dS5zdHJpbmcucyA9IHM7Ci0KLSAgcmV0dXJuIHJpOwotfQotCi0vKiBDcmVhdGUgYW4gcmNkYXRhIGl0ZW0gaG9sZGluZyBhIG51bWJlci4gICovCi0KLXN0cnVjdCByY2RhdGFfaXRlbSAqCi1kZWZpbmVfcmNkYXRhX251bWJlciAodmFsLCBkd29yZCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gICAgIGludCBkd29yZDsKLXsKLSAgc3RydWN0IHJjZGF0YV9pdGVtICpyaTsKLQotICByaSA9IChzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikgcmVzX2FsbG9jIChzaXplb2YgKnJpKTsKLSAgcmktPm5leHQgPSBOVUxMOwotICByaS0+dHlwZSA9IGR3b3JkID8gUkNEQVRBX0RXT1JEIDogUkNEQVRBX1dPUkQ7Ci0gIHJpLT51LndvcmQgPSB2YWw7Ci0KLSAgcmV0dXJuIHJpOwotfQotCi0vKiBEZWZpbmUgYSBzdHJpbmd0YWJsZSByZXNvdXJjZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHN0cmluZwotICAgd2hpY2ggYXBwZWFycyBpbiBhIFNUUklOR1RBQkxFIHN0YXRlbWVudC4gICovCi0KLXZvaWQKLWRlZmluZV9zdHJpbmd0YWJsZSAocmVzaW5mbywgc3RyaW5naWQsIHN0cmluZykKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBzdHJpbmdpZDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgcmVzX2lkIGlkOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlkLm5hbWVkID0gMDsKLSAgaWQudS5pZCA9IChzdHJpbmdpZCA+PiA0KSArIDE7Ci0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1NUUklORywgaWQsCi0JCQkJcmVzaW5mby0+bGFuZ3VhZ2UsIDEpOwotCi0gIGlmIChyLT50eXBlID09IFJFU19UWVBFX1VOSU5JVElBTElaRUQpCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIHItPnR5cGUgPSBSRVNfVFlQRV9TVFJJTkdUQUJMRTsKLSAgICAgIHItPnUuc3RyaW5ndGFibGUgPSAoKHN0cnVjdCBzdHJpbmd0YWJsZSAqKQotCQkJICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IHN0cmluZ3RhYmxlKSkpOwotICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JewotCSAgci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5sZW5ndGggPSAwOwotCSAgci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5zdHJpbmcgPSBOVUxMOwotCX0KLQotICAgICAgci0+cmVzX2luZm8gPSAqcmVzaW5mbzsKLSAgICB9Ci0KLSAgdW5pY29kZV9mcm9tX2FzY2lpICgmci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tzdHJpbmdpZCAmIDB4Zl0ubGVuZ3RoLAotCQkgICAgICAmci0+dS5zdHJpbmd0YWJsZS0+c3RyaW5nc1tzdHJpbmdpZCAmIDB4Zl0uc3RyaW5nLAotCQkgICAgICBzdHJpbmcpOwotfQotCi0vKiBEZWZpbmUgYSB1c2VyIGRhdGEgcmVzb3VyY2Ugd2hlcmUgdGhlIGRhdGEgaXMgaW4gdGhlIHJjIGZpbGUuICAqLwotCi12b2lkCi1kZWZpbmVfdXNlcl9kYXRhIChpZCwgdHlwZSwgcmVzaW5mbywgZGF0YSkKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgc3RydWN0IHJlc19pZCB0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotICAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRhdGE7Ci17Ci0gIHN0cnVjdCByZXNfaWQgaWRzWzNdOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGlkc1swXSA9IHR5cGU7Ci0gIGlkc1sxXSA9IGlkOwotICBpZHNbMl0ubmFtZWQgPSAwOwotICBpZHNbMl0udS5pZCA9IHJlc2luZm8tPmxhbmd1YWdlOwotCi0gIHIgPSBkZWZpbmVfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIDMsIGlkcywgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9VU0VSREFUQTsKLSAgci0+dS51c2VyZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIHVzZXIgZGF0YSByZXNvdXJjZSB3aGVyZSB0aGUgZGF0YSBpcyBpbiBhIGZpbGUuICAqLwotCi12b2lkCi1kZWZpbmVfdXNlcl9maWxlIChpZCwgdHlwZSwgcmVzaW5mbywgZmlsZW5hbWUpCi0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIHN0cnVjdCByZXNfaWQgdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIEZJTEUgKmU7Ci0gIGNoYXIgKnJlYWxfZmlsZW5hbWU7Ci0gIHN0cnVjdCBzdGF0IHM7Ci0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci0gIHN0cnVjdCByZXNfaWQgaWRzWzNdOwotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIGUgPSBvcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgRk9QRU5fUkIsICJmb250IGZpbGUiLCAmcmVhbF9maWxlbmFtZSk7Ci0KLSAgaWYgKHN0YXQgKHJlYWxfZmlsZW5hbWUsICZzKSA8IDApCi0gICAgZmF0YWwgKF8oInN0YXQgZmFpbGVkIG9uIGJpdG1hcCBmaWxlIGAlcyc6ICVzIiksIHJlYWxfZmlsZW5hbWUsCi0JICAgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHJlc19hbGxvYyAocy5zdF9zaXplKTsKLQotICBnZXRfZGF0YSAoZSwgZGF0YSwgcy5zdF9zaXplLCByZWFsX2ZpbGVuYW1lKTsKLQotICBmY2xvc2UgKGUpOwotICBmcmVlIChyZWFsX2ZpbGVuYW1lKTsKLQotICBpZHNbMF0gPSB0eXBlOwotICBpZHNbMV0gPSBpZDsKLSAgaWRzWzJdLm5hbWVkID0gMDsKLSAgaWRzWzJdLnUuaWQgPSByZXNpbmZvLT5sYW5ndWFnZTsKLQotICByID0gZGVmaW5lX3Jlc291cmNlICgmcmVzb3VyY2VzLCAzLCBpZHMsIDApOwotICByLT50eXBlID0gUkVTX1RZUEVfVVNFUkRBVEE7Ci0gIHItPnUudXNlcmRhdGEgPSAoKHN0cnVjdCByY2RhdGFfaXRlbSAqKQotCQkgICByZXNfYWxsb2MgKHNpemVvZiAoc3RydWN0IHJjZGF0YV9pdGVtKSkpOwotICByLT51LnVzZXJkYXRhLT5uZXh0ID0gTlVMTDsKLSAgci0+dS51c2VyZGF0YS0+dHlwZSA9IFJDREFUQV9CVUZGRVI7Ci0gIHItPnUudXNlcmRhdGEtPnUuYnVmZmVyLmxlbmd0aCA9IHMuc3Rfc2l6ZTsKLSAgci0+dS51c2VyZGF0YS0+dS5idWZmZXIuZGF0YSA9IGRhdGE7Ci0gIHItPnJlc19pbmZvID0gKnJlc2luZm87Ci19Ci0KLS8qIERlZmluZSBhIHZlcnNpb25pbmZvIHJlc291cmNlLiAgKi8KLQotdm9pZAotZGVmaW5lX3ZlcnNpb25pbmZvIChpZCwgbGFuZ3VhZ2UsIGZpeGVkdmVyaW5mbywgdmVyaW5mbykKLSAgICAgc3RydWN0IHJlc19pZCBpZDsKLSAgICAgaW50IGxhbmd1YWdlOwotICAgICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpeGVkdmVyaW5mbzsKLSAgICAgc3RydWN0IHZlcl9pbmZvICp2ZXJpbmZvOwotewotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHIgPSBkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKCZyZXNvdXJjZXMsIFJUX1ZFUlNJT04sIGlkLCBsYW5ndWFnZSwgMCk7Ci0gIHItPnR5cGUgPSBSRVNfVFlQRV9WRVJTSU9OSU5GTzsKLSAgci0+dS52ZXJzaW9uaW5mbyA9ICgoc3RydWN0IHZlcnNpb25pbmZvICopCi0JCSAgICAgIHJlc19hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdmVyc2lvbmluZm8pKSk7Ci0gIHItPnUudmVyc2lvbmluZm8tPmZpeGVkID0gZml4ZWR2ZXJpbmZvOwotICByLT51LnZlcnNpb25pbmZvLT52YXIgPSB2ZXJpbmZvOwotICByLT5yZXNfaW5mby5sYW5ndWFnZSA9IGxhbmd1YWdlOwotfQotCi0vKiBBZGQgc3RyaW5nIHZlcnNpb24gaW5mbyB0byBhIGxpc3Qgb2YgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfaW5mbyAqCi1hcHBlbmRfdmVyX3N0cmluZ2ZpbGVpbmZvICh2ZXJpbmZvLCBsYW5ndWFnZSwgc3RyaW5ncykKLSAgICAgc3RydWN0IHZlcl9pbmZvICp2ZXJpbmZvOwotICAgICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotewotICBzdHJ1Y3QgdmVyX2luZm8gKnZpLCAqKnBwOwotCi0gIHZpID0gKHN0cnVjdCB2ZXJfaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdmkpOwotICB2aS0+bmV4dCA9IE5VTEw7Ci0gIHZpLT50eXBlID0gVkVSSU5GT19TVFJJTkc7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmdmktPnUuc3RyaW5nLmxhbmd1YWdlLCBsYW5ndWFnZSk7Ci0gIHZpLT51LnN0cmluZy5zdHJpbmdzID0gc3RyaW5nczsKLQotICBmb3IgKHBwID0gJnZlcmluZm87ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZpOwotCi0gIHJldHVybiB2ZXJpbmZvOwotfQotCi0vKiBBZGQgdmFyaWFibGUgdmVyc2lvbiBpbmZvIHRvIGEgbGlzdCBvZiB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl9pbmZvICoKLWFwcGVuZF92ZXJfdmFyZmlsZWluZm8gKHZlcmluZm8sIGtleSwgdmFyKQotICAgICBzdHJ1Y3QgdmVyX2luZm8gKnZlcmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2YXI7Ci17Ci0gIHN0cnVjdCB2ZXJfaW5mbyAqdmksICoqcHA7Ci0KLSAgdmkgPSAoc3RydWN0IHZlcl9pbmZvICopIHJlc19hbGxvYyAoc2l6ZW9mICp2aSk7Ci0gIHZpLT5uZXh0ID0gTlVMTDsKLSAgdmktPnR5cGUgPSBWRVJJTkZPX1ZBUjsKLSAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2aS0+dS52YXIua2V5LCBrZXkpOwotICB2aS0+dS52YXIudmFyID0gdmFyOwotCi0gIGZvciAocHAgPSAmdmVyaW5mbzsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gdmk7Ci0KLSAgcmV0dXJuIHZlcmluZm87Ci19Ci0KLS8qIEFwcGVuZCB2ZXJzaW9uIHN0cmluZyBpbmZvcm1hdGlvbiB0byBhIGxpc3QuICAqLwotCi1zdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKgotYXBwZW5kX3ZlcnZhbCAoc3RyaW5ncywga2V5LCB2YWx1ZSkKLSAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotICAgICBjb25zdCBjaGFyICprZXk7Ci0gICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotewotICBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKnZzLCAqKnBwOwotCi0gIHZzID0gKHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnMpOwotICB2cy0+bmV4dCA9IE5VTEw7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoKGludCAqKSBOVUxMLCAmdnMtPmtleSwga2V5KTsKLSAgdW5pY29kZV9mcm9tX2FzY2lpICgoaW50ICopIE5VTEwsICZ2cy0+dmFsdWUsIHZhbHVlKTsKLQotICBmb3IgKHBwID0gJnN0cmluZ3M7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZzOwotCi0gIHJldHVybiBzdHJpbmdzOwotfQotCi0vKiBBcHBlbmQgdmVyc2lvbiB2YXJpYWJsZSBpbmZvcm1hdGlvbiB0byBhIGxpc3QuICAqLwotCi1zdHJ1Y3QgdmVyX3ZhcmluZm8gKgotYXBwZW5kX3ZlcnRyYW5zICh2YXIsIGxhbmd1YWdlLCBjaGFyc2V0KQotICAgICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZhcjsKLSAgICAgdW5zaWduZWQgbG9uZyBsYW5ndWFnZTsKLSAgICAgdW5zaWduZWQgbG9uZyBjaGFyc2V0OwotewotICBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2LCAqKnBwOwotCi0gIHZ2ID0gKHN0cnVjdCB2ZXJfdmFyaW5mbyAqKSByZXNfYWxsb2MgKHNpemVvZiAqdnYpOwotICB2di0+bmV4dCA9IE5VTEw7Ci0gIHZ2LT5sYW5ndWFnZSA9IGxhbmd1YWdlOwotICB2di0+Y2hhcnNldCA9IGNoYXJzZXQ7Ci0KLSAgZm9yIChwcCA9ICZ2YXI7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLSAgICA7Ci0gICpwcCA9IHZ2OwotCi0gIHJldHVybiB2YXI7Ci19Ci0MCi0vKiBMb2NhbCBmdW5jdGlvbnMgdXNlZCB0byB3cml0ZSBvdXQgYW4gcmMgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGluZGVudCBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZGlyZWN0b3J5Ci0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50ICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfc3ViZGlyCi0gIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosCi0JICAgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19yZXNvdXJjZQotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgaW50ICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2FjY2VsZXJhdG9ycwotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19jdXJzb3IgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgY3Vyc29yICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX2dyb3VwX2N1cnNvcgotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZGlhbG9nIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGRpYWxvZyAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19kaWFsb2dfY29udHJvbAotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBkaWFsb2dfY29udHJvbCAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19mb250ZGlyIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IGZvbnRkaXIgKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfZ3JvdXBfaWNvbiBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX21lbnUgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgbWVudSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3JjX21lbnVpdGVtcwotICBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfcmNkYXRhIFBBUkFNUyAoKEZJTEUgKiwgY29uc3Qgc3RydWN0IHJjZGF0YV9pdGVtICosIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmNfc3RyaW5ndGFibGUKLSAgUEFSQU1TICgoRklMRSAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCBzdHJpbmd0YWJsZSAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY192ZXJzaW9uaW5mbyBQQVJBTVMgKChGSUxFICosIGNvbnN0IHN0cnVjdCB2ZXJzaW9uaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yY19maWxlZGF0YQotICBQQVJBTVMgKChGSUxFICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKikpOwotCi0vKiBJbmRlbnQgYSBnaXZlbiBudW1iZXIgb2Ygc3BhY2VzLiAgKi8KLQotc3RhdGljIHZvaWQKLWluZGVudCAoZSwgYykKLSAgICAgRklMRSAqZTsKLSAgICAgaW50IGM7Ci17Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgcHV0YyAoJyAnLCBlKTsKLX0KLQotLyogRHVtcCB0aGUgcmVzb3VyY2VzIHdlIGhhdmUgcmVhZCBpbiB0aGUgZm9ybWF0IG9mIGFuIHJjIGZpbGUuCi0KLSAgIEFjdHVhbGx5LCB3ZSBkb24ndCB1c2UgdGhlIGZvcm1hdCBvZiBhbiByYyBmaWxlLCBiZWNhdXNlIGl0J3Mgd2F5Ci0gICB0b28gbXVjaCBvZiBhIHBhaW4tLWZvciBleGFtcGxlLCB3ZSdkIGhhdmUgdG8gd3JpdGUgaWNvbiByZXNvdXJjZXMKLSAgIGludG8gYSBmaWxlIGFuZCByZWZlciB0byB0aGF0IGZpbGUuICBXZSBqdXN0IGdlbmVyYXRlIGEgcmVhZGFibGUKLSAgIGZvcm1hdCB0aGF0IGtpbmQgb2YgbG9va3MgbGlrZSBhbiByYyBmaWxlLCBhbmQgaXMgdXNlZnVsIGZvcgotICAgdW5kZXJzdGFuZGluZyB0aGUgY29udGVudHMgb2YgYSByZXNvdXJjZSBmaWxlLiAgU29tZWRheSB3ZSBtYXkgd2FudAotICAgdG8gZ2VuZXJhdGUgYW4gcmMgZmlsZSB3aGljaCB0aGUgcmMgY29tcGlsZXIgY2FuIHJlYWQ7IGlmIHRoYXQgZGF5Ci0gICBjb21lcywgdGhpcyBjb2RlIHdpbGwgaGF2ZSB0byBiZSBmaXhlZCB1cC4gICovCi0KLXZvaWQKLXdyaXRlX3JjX2ZpbGUgKGZpbGVuYW1lLCByZXNvdXJjZXMpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzb3VyY2VzOwotewotICBGSUxFICplOwotICBpbnQgbGFuZ3VhZ2U7Ci0KLSAgaWYgKGZpbGVuYW1lID09IE5VTEwpCi0gICAgZSA9IHN0ZG91dDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGUgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dUKTsKLSAgICAgIGlmIChlID09IE5VTEwpCi0JZmF0YWwgKF8oImNhbid0IG9wZW4gYCVzJyBmb3Igb3V0cHV0OiAlcyIpLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgfQotCi0gIGxhbmd1YWdlID0gLTE7Ci0gIHdyaXRlX3JjX2RpcmVjdG9yeSAoZSwgcmVzb3VyY2VzLCAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLAotCQkgICAgICAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLCAmbGFuZ3VhZ2UsIDEpOwotfQotCi0vKiBXcml0ZSBvdXQgYSBkaXJlY3RvcnkuICBFIGlzIHRoZSBmaWxlIHRvIHdyaXRlIHRvLiAgUkQgaXMgdGhlCi0gICBkaXJlY3RvcnkuICBUWVBFIGlzIGEgcG9pbnRlciB0byB0aGUgbGV2ZWwgMSBJRCB3aGljaCBzZXJ2ZXMgYXMgdGhlCi0gICByZXNvdXJjZSB0eXBlLiAgTkFNRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGxldmVsIDIgSUQgd2hpY2ggc2VydmVzIGFzCi0gICBhbiBpbmRpdmlkdWFsIHJlc291cmNlIG5hbWUuICBMQU5HVUFHRSBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQKLSAgIGxhbmd1YWdlLiAgTEVWRUwgaXMgdGhlIGxldmVsIGluIHRoZSB0cmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2RpcmVjdG9yeSAoZSwgcmQsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBpbnQgKmxhbmd1YWdlOwotICAgICBpbnQgbGV2ZWw7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKnJlOwotCi0gIC8qIFByaW50IG91dCBzb21lIENPRkYgaW5mb3JtYXRpb24gdGhhdCByYyBmaWxlcyBjYW4ndCByZXByZXNlbnQuICAqLwotCi0gIGlmIChyZC0+dGltZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBUaW1lIHN0YW1wOiAlbHVcbiIsIHJkLT50aW1lKTsKLSAgaWYgKHJkLT5jaGFyYWN0ZXJpc3RpY3MgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gQ2hhcmFjdGVyaXN0aWNzOiAlbHVcbiIsIHJkLT5jaGFyYWN0ZXJpc3RpY3MpOwotICBpZiAocmQtPm1ham9yICE9IDAgfHwgcmQtPm1pbm9yICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIFZlcnNpb246ICVkICVkXG4iLCByZC0+bWFqb3IsIHJkLT5taW5vcik7Ci0KLSAgZm9yIChyZSA9IHJkLT5lbnRyaWVzOyAgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGxldmVsKQotCXsKLQljYXNlIDE6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAxLCB0aGUga2V5IG9mIHRoaXMgcmVzb3VyY2UgaXMgdGhlCi0gICAgICAgICAgICAgdHlwZS4gIFRoaXMgbm9ybWFsbHkgZHVwbGljYXRlcyB0aGUgaW5mb3JtYXRpb24gd2UgaGF2ZQotICAgICAgICAgICAgIHN0b3JlZCB3aXRoIHRoZSByZXNvdXJjZSBpdHNlbGYsIGJ1dCB3ZSBuZWVkIHRvIHJlbWVtYmVyCi0gICAgICAgICAgICAgdGhlIHR5cGUgaWYgdGhpcyBpcyBhIHVzZXIgZGVmaW5lIHJlc291cmNlIHR5cGUuICAqLwotCSAgdHlwZSA9ICZyZS0+aWQ7Ci0JICBicmVhazsKLQotCWNhc2UgMjoKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDIsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUgbmFtZQotCSAgICAgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbiB0aGUgcmMgcHJpbnRvdXQuICovCi0JICBuYW1lID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAzOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMywgdGhlbiB0aGlzIGtleSByZXByZXNlbnRzIGEgbGFuZ3VhZ2UuCi0JICAgICBVc2UgaXQgdG8gdXBkYXRlIHRoZSBjdXJyZW50IGxhbmd1YWdlLiAgKi8KLQkgIGlmICghIHJlLT5pZC5uYW1lZAotCSAgICAgICYmIHJlLT5pZC51LmlkICE9ICh1bnNpZ25lZCBsb25nKSAodW5zaWduZWQgaW50KSAqbGFuZ3VhZ2UKLQkgICAgICAmJiAocmUtPmlkLnUuaWQgJiAweGZmZmYpID09IHJlLT5pZC51LmlkKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoZSwgIkxBTkdVQUdFICVsdSwgJWx1XG4iLAotCQkgICAgICAgcmUtPmlkLnUuaWQgJiAweGZmLCAocmUtPmlkLnUuaWQgPj4gOCkgJiAweGZmKTsKLQkgICAgICAqbGFuZ3VhZ2UgPSByZS0+aWQudS5pZDsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmUtPnN1YmRpcikKLQl3cml0ZV9yY19zdWJkaXIgKGUsIHJlLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwgbGV2ZWwpOwotICAgICAgZWxzZQotCXsKLQkgIGlmIChsZXZlbCA9PSAzKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyB0aGUgbm9ybWFsIGNhc2U6IHRoZSB0aHJlZSBsZXZlbHMgYXJlCi0gICAgICAgICAgICAgICAgIFRZUEUvTkFNRS9MQU5HVUFHRS4gIE5BTUUgd2lsbCBoYXZlIGJlZW4gc2V0IGF0IGxldmVsCi0gICAgICAgICAgICAgICAgIDIsIGFuZCByZXByZXNlbnRzIHRoZSBuYW1lIHRvIHVzZS4gIFdlIHByb2JhYmx5IGp1c3QKLSAgICAgICAgICAgICAgICAgc2V0IExBTkdVQUdFLCBhbmQgaXQgd2lsbCBwcm9iYWJseSBtYXRjaCB3aGF0IHRoZQotICAgICAgICAgICAgICAgICByZXNvdXJjZSBpdHNlbGYgcmVjb3JkcyBpZiBhbnl0aGluZy4gICovCi0JICAgICAgd3JpdGVfcmNfcmVzb3VyY2UgKGUsIHR5cGUsIG5hbWUsIHJlLT51LnJlcywgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChlLCAiLy8gUmVzb3VyY2UgYXQgdW5leHBlY3RlZCBsZXZlbCAlZFxuIiwgbGV2ZWwpOwotCSAgICAgIHdyaXRlX3JjX3Jlc291cmNlIChlLCB0eXBlLCAoc3RydWN0IHJlc19pZCAqKSBOVUxMLCByZS0+dS5yZXMsCi0JCQkJIGxhbmd1YWdlKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN1YmRpcmVjdG9yeSBlbnRyeS4gIEUgaXMgdGhlIGZpbGUgdG8gd3JpdGUgdG8uICBSRSBpcwotICAgdGhlIHN1YmRpcmVjdG9yeSBlbnRyeS4gIFRZUEUgYW5kIE5BTUUgYXJlIHBvaW50ZXJzIHRvIGhpZ2hlciBsZXZlbAotICAgSURzLCBvciBOVUxMLiAgTEFOR1VBR0UgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGxhbmd1YWdlLgotICAgTEVWRUwgaXMgdGhlIGxldmVsIGluIHRoZSB0cmVlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3N1YmRpciAoZSwgcmUsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci0gICAgIGludCBsZXZlbDsKLXsKLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0gIHN3aXRjaCAobGV2ZWwpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGZwcmludGYgKGUsICIvLyBUeXBlOiAiKTsKLSAgICAgIGlmIChyZS0+aWQubmFtZWQpCi0JcmVzX2lkX3ByaW50IChlLCByZS0+aWQsIDEpOwotICAgICAgZWxzZQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0KLQkgIHN3aXRjaCAocmUtPmlkLnUuaWQpCi0JICAgIHsKLQkgICAgY2FzZSBSVF9DVVJTT1I6IHMgPSAiY3Vyc29yIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfQklUTUFQOiBzID0gImJpdG1hcCI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0lDT046IHMgPSAiaWNvbiI7IGJyZWFrOwotCSAgICBjYXNlIFJUX01FTlU6IHMgPSAibWVudSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0RJQUxPRzogcyA9ICJkaWFsb2ciOyBicmVhazsKLQkgICAgY2FzZSBSVF9TVFJJTkc6IHMgPSAic3RyaW5ndGFibGUiOyBicmVhazsKLQkgICAgY2FzZSBSVF9GT05URElSOiBzID0gImZvbnRkaXIiOyBicmVhazsKLQkgICAgY2FzZSBSVF9GT05UOiBzID0gImZvbnQiOyBicmVhazsKLQkgICAgY2FzZSBSVF9BQ0NFTEVSQVRPUjogcyA9ICJhY2NlbGVyYXRvcnMiOyBicmVhazsKLQkgICAgY2FzZSBSVF9SQ0RBVEE6IHMgPSAicmNkYXRhIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfTUVTU0FHRVRBQkxFOiBzID0gIm1lc3NhZ2V0YWJsZSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX0dST1VQX0NVUlNPUjogcyA9ICJncm91cCBjdXJzb3IiOyBicmVhazsKLQkgICAgY2FzZSBSVF9HUk9VUF9JQ09OOiBzID0gImdyb3VwIGljb24iOyBicmVhazsKLQkgICAgY2FzZSBSVF9WRVJTSU9OOiBzID0gInZlcnNpb24iOyBicmVhazsKLQkgICAgY2FzZSBSVF9ETEdJTkNMVURFOiBzID0gImRsZ2luY2x1ZGUiOyBicmVhazsKLQkgICAgY2FzZSBSVF9QTFVHUExBWTogcyA9ICJwbHVncGxheSI7IGJyZWFrOwotCSAgICBjYXNlIFJUX1ZYRDogcyA9ICJ2eGQiOyBicmVhazsKLQkgICAgY2FzZSBSVF9BTklDVVJTT1I6IHMgPSAiYW5pY3Vyc29yIjsgYnJlYWs7Ci0JICAgIGNhc2UgUlRfQU5JSUNPTjogcyA9ICJhbmlpY29uIjsgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6IHMgPSBOVUxMOyBicmVhazsKLQkgICAgfQotCi0JICBpZiAocyAhPSBOVUxMKQotCSAgICBmcHJpbnRmIChlLCAiJXMiLCBzKTsKLQkgIGVsc2UKLQkgICAgcmVzX2lkX3ByaW50IChlLCByZS0+aWQsIDEpOwotCX0KLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gTmFtZTogIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgZnByaW50ZiAoZSwgIi8vIExhbmd1YWdlOiAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgcmUtPmlkLCAxKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoZSwgIi8vIExldmVsICVkOiAiLCBsZXZlbCk7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIHJlLT5pZCwgMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9CQkKLQotICB3cml0ZV9yY19kaXJlY3RvcnkgKGUsIHJlLT51LmRpciwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsICsgMSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHNpbmdsZSByZXNvdXJjZS4gIEUgaXMgdGhlIGZpbGUgdG8gd3JpdGUgdG8uICBUWVBFIGlzIGEKLSAgIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHJlc291cmNlLiAgTkFNRSBpcyBhIHBvaW50ZXIgdG8gdGhlIG5hbWUKLSAgIG9mIHRoZSByZXNvdXJjZTsgaXQgd2lsbCBiZSBOVUxMIGlmIHRoZXJlIGlzIGEgbGV2ZWwgbWlzbWF0Y2guICBSRVMKLSAgIGlzIHRoZSByZXNvdXJjZSBkYXRhLiAgTEFOR1VBR0UgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50Ci0gICBsYW5ndWFnZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19yZXNvdXJjZSAoZSwgdHlwZSwgbmFtZSwgcmVzLCBsYW5ndWFnZSkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBpbnQgKmxhbmd1YWdlOwotewotICBjb25zdCBjaGFyICpzOwotICBpbnQgcnQ7Ci0gIGludCBtZW51ZXggPSAwOwotCi0gIGZwcmludGYgKGUsICJcbiIpOwotCi0gIHN3aXRjaCAocmVzLT50eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0FDQ0VMRVJBVE9SOgotICAgICAgcyA9ICJBQ0NFTEVSQVRPUiI7Ci0gICAgICBydCA9IFJUX0FDQ0VMRVJBVE9SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoKLSAgICAgIHMgPSAiQklUTUFQIjsKLSAgICAgIHJ0ID0gUlRfQklUTUFQOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0NVUlNPUjoKLSAgICAgIHMgPSAiQ1VSU09SIjsKLSAgICAgIHJ0ID0gUlRfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoKLSAgICAgIHMgPSAiR1JPVVBfQ1VSU09SIjsKLSAgICAgIHJ0ID0gUlRfR1JPVVBfQ1VSU09SOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIGlmIChleHRlbmRlZF9kaWFsb2cgKHJlcy0+dS5kaWFsb2cpKQotCXMgPSAiRElBTE9HRVgiOwotICAgICAgZWxzZQotCXMgPSAiRElBTE9HIjsKLSAgICAgIHJ0ID0gUlRfRElBTE9HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6Ci0gICAgICBzID0gIkZPTlQiOwotICAgICAgcnQgPSBSVF9GT05UOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0ZPTlRESVI6Ci0gICAgICBzID0gIkZPTlRESVIiOwotICAgICAgcnQgPSBSVF9GT05URElSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0lDT046Ci0gICAgICBzID0gIklDT04iOwotICAgICAgcnQgPSBSVF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046Ci0gICAgICBzID0gIkdST1VQX0lDT04iOwotICAgICAgcnQgPSBSVF9HUk9VUF9JQ09OOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FTlU6Ci0gICAgICBpZiAoZXh0ZW5kZWRfbWVudSAocmVzLT51Lm1lbnUpKQotCXsKLQkgIHMgPSAiTUVOVUVYIjsKLQkgIG1lbnVleCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHMgPSAiTUVOVSI7Ci0JICBtZW51ZXggPSAwOwotCX0KLSAgICAgIHJ0ID0gUlRfTUVOVTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9NRVNTQUdFVEFCTEU6Ci0gICAgICBzID0gIk1FU1NBR0VUQUJMRSI7Ci0gICAgICBydCA9IFJUX01FU1NBR0VUQUJMRTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICBzID0gIlJDREFUQSI7Ci0gICAgICBydCA9IFJUX1JDREFUQTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLSAgICAgIHMgPSAiU1RSSU5HVEFCTEUiOwotICAgICAgcnQgPSBSVF9TVFJJTkc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICBzID0gTlVMTDsKLSAgICAgIHJ0ID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9WRVJTSU9OSU5GTzoKLSAgICAgIHMgPSAiVkVSU0lPTklORk8iOwotICAgICAgcnQgPSBSVF9WRVJTSU9OOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChydCAhPSAwCi0gICAgICAmJiB0eXBlICE9IE5VTEwKLSAgICAgICYmICh0eXBlLT5uYW1lZCB8fCB0eXBlLT51LmlkICE9ICh1bnNpZ25lZCBsb25nKSBydCkpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIFVuZXhwZWN0ZWQgcmVzb3VyY2UgdHlwZSBtaXNtYXRjaDogIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsICp0eXBlLCAxKTsKLSAgICAgIGZwcmludGYgKGUsICIgIT0gJWQiLCBydCk7Ci0gICAgfQotCi0gIGlmIChyZXMtPmNvZmZfaW5mby5jb2RlcGFnZSAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBDb2RlIHBhZ2U6ICVsdVxuIiwgcmVzLT5jb2ZmX2luZm8uY29kZXBhZ2UpOwotICBpZiAocmVzLT5jb2ZmX2luZm8ucmVzZXJ2ZWQgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiLy8gQ09GRiByZXNlcnZlZCB2YWx1ZTogJWx1XG4iLCByZXMtPmNvZmZfaW5mby5yZXNlcnZlZCk7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICByZXNfaWRfcHJpbnQgKGUsICpuYW1lLCAwKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGUsICI/P1Vua25vd24tTmFtZT8/Iik7Ci0KLSAgZnByaW50ZiAoZSwgIiAiKTsKLSAgaWYgKHMgIT0gTlVMTCkKLSAgICBmcHJpbnRmIChlLCAiJXMiLCBzKTsKLSAgZWxzZSBpZiAodHlwZSAhPSBOVUxMKQotICAgIHJlc19pZF9wcmludCAoZSwgKnR5cGUsIDApOwotICBlbHNlCi0gICAgZnByaW50ZiAoZSwgIj8/VW5rbm93bi1UeXBlPz8iKTsKLQotICBpZiAocmVzLT5yZXNfaW5mby5tZW1mbGFncyAhPSAwKQotICAgIHsKLSAgICAgIGlmICgocmVzLT5yZXNfaW5mby5tZW1mbGFncyAmIE1FTUZMQUdfTU9WRUFCTEUpICE9IDApCi0JZnByaW50ZiAoZSwgIiBNT1ZFQUJMRSIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19QVVJFKSAhPSAwKQotCWZwcmludGYgKGUsICIgUFVSRSIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19QUkVMT0FEKSAhPSAwKQotCWZwcmludGYgKGUsICIgUFJFTE9BRCIpOwotICAgICAgaWYgKChyZXMtPnJlc19pbmZvLm1lbWZsYWdzICYgTUVNRkxBR19ESVNDQVJEQUJMRSkgIT0gMCkKLQlmcHJpbnRmIChlLCAiIERJU0NBUkRBQkxFIik7Ci0gICAgfQotCi0gIGlmIChyZXMtPnR5cGUgPT0gUkVTX1RZUEVfRElBTE9HKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIgJWQsICVkLCAlZCwgJWQiLCByZXMtPnUuZGlhbG9nLT54LCByZXMtPnUuZGlhbG9nLT55LAotCSAgICAgICByZXMtPnUuZGlhbG9nLT53aWR0aCwgcmVzLT51LmRpYWxvZy0+aGVpZ2h0KTsKLSAgICAgIGlmIChyZXMtPnUuZGlhbG9nLT5leCAhPSBOVUxMCi0JICAmJiByZXMtPnUuZGlhbG9nLT5leC0+aGVscCAhPSAwKQotCWZwcmludGYgKGUsICIsICVsdSIsIHJlcy0+dS5kaWFsb2ctPmV4LT5oZWxwKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0KLSAgaWYgKChyZXMtPnJlc19pbmZvLmxhbmd1YWdlICE9IDAgJiYgcmVzLT5yZXNfaW5mby5sYW5ndWFnZSAhPSAqbGFuZ3VhZ2UpCi0gICAgICB8fCByZXMtPnJlc19pbmZvLmNoYXJhY3RlcmlzdGljcyAhPSAwCi0gICAgICB8fCByZXMtPnJlc19pbmZvLnZlcnNpb24gIT0gMCkKLSAgICB7Ci0gICAgICBpbnQgbW9kaWZpZXJzOwotCi0gICAgICBzd2l0Y2ggKHJlcy0+dHlwZSkKLQl7Ci0JY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLQljYXNlIFJFU19UWVBFX0RJQUxPRzoKLQljYXNlIFJFU19UWVBFX01FTlU6Ci0JY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0JY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToKLQkgIG1vZGlmaWVycyA9IDE7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBtb2RpZmllcnMgPSAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAocmVzLT5yZXNfaW5mby5sYW5ndWFnZSAhPSAwICYmIHJlcy0+cmVzX2luZm8ubGFuZ3VhZ2UgIT0gKmxhbmd1YWdlKQotCWZwcmludGYgKGUsICIlc0xBTkdVQUdFICVkLCAlZFxuIiwKLQkJIG1vZGlmaWVycyA/ICIvLyAiIDogIiIsCi0JCSByZXMtPnJlc19pbmZvLmxhbmd1YWdlICYgMHhmZiwKLQkJIChyZXMtPnJlc19pbmZvLmxhbmd1YWdlID4+IDgpICYgMHhmZik7Ci0gICAgICBpZiAocmVzLT5yZXNfaW5mby5jaGFyYWN0ZXJpc3RpY3MgIT0gMCkKLQlmcHJpbnRmIChlLCAiJXNDSEFSQUNURVJJU1RJQ1MgJWx1XG4iLAotCQkgbW9kaWZpZXJzID8gIi8vICIgOiAiIiwKLQkJIHJlcy0+cmVzX2luZm8uY2hhcmFjdGVyaXN0aWNzKTsKLSAgICAgIGlmIChyZXMtPnJlc19pbmZvLnZlcnNpb24gIT0gMCkKLQlmcHJpbnRmIChlLCAiJXNWRVJTSU9OICVsdVxuIiwKLQkJIG1vZGlmaWVycyA/ICIvLyAiIDogIiIsCi0JCSByZXMtPnJlc19pbmZvLnZlcnNpb24pOwotICAgIH0KLQotICBzd2l0Y2ggKHJlcy0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHdyaXRlX3JjX2FjY2VsZXJhdG9ycyAoZSwgcmVzLT51LmFjYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgotICAgICAgd3JpdGVfcmNfY3Vyc29yIChlLCByZXMtPnUuY3Vyc29yKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9DVVJTT1I6Ci0gICAgICB3cml0ZV9yY19ncm91cF9jdXJzb3IgKGUsIHJlcy0+dS5ncm91cF9jdXJzb3IpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoKLSAgICAgIHdyaXRlX3JjX2RpYWxvZyAoZSwgcmVzLT51LmRpYWxvZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVERJUjoKLSAgICAgIHdyaXRlX3JjX2ZvbnRkaXIgKGUsIHJlcy0+dS5mb250ZGlyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9HUk9VUF9JQ09OOgotICAgICAgd3JpdGVfcmNfZ3JvdXBfaWNvbiAoZSwgcmVzLT51Lmdyb3VwX2ljb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FTlU6Ci0gICAgICB3cml0ZV9yY19tZW51IChlLCByZXMtPnUubWVudSwgbWVudWV4KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6Ci0gICAgICB3cml0ZV9yY19yY2RhdGEgKGUsIHJlcy0+dS5yY2RhdGEsIDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotICAgICAgd3JpdGVfcmNfc3RyaW5ndGFibGUgKGUsIG5hbWUsIHJlcy0+dS5zdHJpbmd0YWJsZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICB3cml0ZV9yY19yY2RhdGEgKGUsIHJlcy0+dS51c2VyZGF0YSwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICB3cml0ZV9yY192ZXJzaW9uaW5mbyAoZSwgcmVzLT51LnZlcnNpb25pbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9CSVRNQVA6Ci0gICAgY2FzZSBSRVNfVFlQRV9GT05UOgotICAgIGNhc2UgUkVTX1RZUEVfSUNPTjoKLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHdyaXRlX3JjX2ZpbGVkYXRhIChlLCByZXMtPnUuZGF0YS5sZW5ndGgsIHJlcy0+dS5kYXRhLmRhdGEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYWNjZWxlcmF0b3IgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfYWNjZWxlcmF0b3JzIChlLCBhY2NlbGVyYXRvcnMpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBhY2NlbGVyYXRvciAqYWNjZWxlcmF0b3JzOwotewotICBjb25zdCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKmFjYzsKLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotICBmb3IgKGFjYyA9IGFjY2VsZXJhdG9yczsgYWNjICE9IE5VTEw7IGFjYyA9IGFjYy0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgcHJpbnRhYmxlOwotCi0gICAgICBmcHJpbnRmIChlLCAiICAiKTsKLQotICAgICAgaWYgKChhY2MtPmtleSAmIDB4N2YpID09IGFjYy0+a2V5Ci0JICAmJiBpc3ByaW50ICgodW5zaWduZWQgY2hhcikgYWNjLT5rZXkpCi0JICAmJiAoYWNjLT5mbGFncyAmIEFDQ19WSVJUS0VZKSA9PSAwKQotCXsKLQkgIGZwcmludGYgKGUsICJcIiVjXCIiLCBhY2MtPmtleSk7Ci0JICBwcmludGFibGUgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcHJpbnRmIChlLCAiJWQiLCBhY2MtPmtleSk7Ci0JICBwcmludGFibGUgPSAwOwotCX0KLQotICAgICAgZnByaW50ZiAoZSwgIiwgJWQiLCBhY2MtPmlkKTsKLQotICAgICAgaWYgKCEgcHJpbnRhYmxlKQotCXsKLQkgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19WSVJUS0VZKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBWSVJUS0VZIik7Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKGUsICIsIEFTQ0lJIik7Ci0JfQotCi0gICAgICBpZiAoKGFjYy0+ZmxhZ3MgJiBBQ0NfU0hJRlQpICE9IDApCi0JZnByaW50ZiAoZSwgIiwgU0hJRlQiKTsKLSAgICAgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19DT05UUk9MKSAhPSAwKQotCWZwcmludGYgKGUsICIsIENPTlRST0wiKTsKLSAgICAgIGlmICgoYWNjLT5mbGFncyAmIEFDQ19BTFQpICE9IDApCi0JZnByaW50ZiAoZSwgIiwgQUxUIik7Ci0KLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGN1cnNvciBpbmZvcm1hdGlvbi4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgaW4gYSBzZXBhcmF0ZQotICAgZmlsZSwgd2hpY2ggdGhlIHJjIGZpbGUgd291bGQgaW5jbHVkZS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19jdXJzb3IgKGUsIGN1cnNvcikKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IGN1cnNvciAqY3Vyc29yOwotewotICBmcHJpbnRmIChlLCAiLy8gSG90c3BvdDogeDogJWQ7IHk6ICVkXG4iLCBjdXJzb3ItPnhob3RzcG90LAotCSAgIGN1cnNvci0+eWhvdHNwb3QpOwotICB3cml0ZV9yY19maWxlZGF0YSAoZSwgY3Vyc29yLT5sZW5ndGgsIGN1cnNvci0+ZGF0YSk7Ci19Ci0KLS8qIFdyaXRlIG91dCBncm91cCBjdXJzb3IgZGF0YS4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgYnVpbHQgZnJvbSB0aGUKLSAgIGN1cnNvciBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2dyb3VwX2N1cnNvciAoZSwgZ3JvdXBfY3Vyc29yKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpncm91cF9jdXJzb3I7Ci17Ci0gIGNvbnN0IHN0cnVjdCBncm91cF9jdXJzb3IgKmdjOwotCi0gIGZvciAoZ2MgPSBncm91cF9jdXJzb3I7IGdjICE9IE5VTEw7IGdjID0gZ2MtPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIHdpZHRoOiAlZDsgaGVpZ2h0ICVkOyBwbGFuZXMgJWQ7IGJpdHMgJWRcbiIsCi0JICAgICBnYy0+d2lkdGgsIGdjLT5oZWlnaHQsIGdjLT5wbGFuZXMsIGdjLT5iaXRzKTsKLSAgICAgIGZwcmludGYgKGUsICIvLyBkYXRhIGJ5dGVzOiAlbHU7IGluZGV4OiAlZFxuIiwKLQkgICAgICAgZ2MtPmJ5dGVzLCBnYy0+aW5kZXgpOwotICAgIH0KLX0KLQotLyogV3JpdGUgZGlhbG9nIGRhdGEuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfZGlhbG9nIChlLCBkaWFsb2cpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpYWxvZ19jb250cm9sICpjb250cm9sOwotCi0gIGlmIChkaWFsb2ctPnN0eWxlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIlNUWUxFIDB4JWx4XG4iLCBkaWFsb2ctPnN0eWxlKTsKLSAgaWYgKGRpYWxvZy0+ZXhzdHlsZSAhPSAwKQotICAgIGZwcmludGYgKGUsICJFWFNUWUxFIDB4JWx4XG4iLCBkaWFsb2ctPmV4c3R5bGUpOwotICBpZiAoKGRpYWxvZy0+Y2xhc3MubmFtZWQgJiYgZGlhbG9nLT5jbGFzcy51Lm4ubGVuZ3RoID4gMCkKLSAgICAgIHx8IGRpYWxvZy0+Y2xhc3MudS5pZCAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICJDTEFTUyAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgZGlhbG9nLT5jbGFzcywgMCk7Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChkaWFsb2ctPmNhcHRpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiQ0FQVElPTiBcIiIpOwotICAgICAgdW5pY29kZV9wcmludCAoZSwgZGlhbG9nLT5jYXB0aW9uLCAtMSk7Ci0gICAgICBmcHJpbnRmIChlLCAiXCJcbiIpOwotICAgIH0KLSAgaWYgKChkaWFsb2ctPm1lbnUubmFtZWQgJiYgZGlhbG9nLT5tZW51LnUubi5sZW5ndGggPiAwKQotICAgICAgfHwgZGlhbG9nLT5tZW51LnUuaWQgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiTUVOVSAiKTsKLSAgICAgIHJlc19pZF9wcmludCAoZSwgZGlhbG9nLT5tZW51LCAwKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLSAgaWYgKGRpYWxvZy0+Zm9udCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICJGT05UICVkLCBcIiIsIGRpYWxvZy0+cG9pbnRzaXplKTsKLSAgICAgIHVuaWNvZGVfcHJpbnQgKGUsIGRpYWxvZy0+Zm9udCwgLTEpOwotICAgICAgZnByaW50ZiAoZSwgIlwiIik7Ci0gICAgICBpZiAoZGlhbG9nLT5leCAhPSBOVUxMCi0JICAmJiAoZGlhbG9nLT5leC0+d2VpZ2h0ICE9IDAgfHwgZGlhbG9nLT5leC0+aXRhbGljICE9IDApKQotCWZwcmludGYgKGUsICIsICVkLCAlZCIsIGRpYWxvZy0+ZXgtPndlaWdodCwgZGlhbG9nLT5leC0+aXRhbGljKTsKLSAgICAgIGZwcmludGYgKGUsICJcbiIpOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAoY29udHJvbCA9IGRpYWxvZy0+Y29udHJvbHM7IGNvbnRyb2wgIT0gTlVMTDsgY29udHJvbCA9IGNvbnRyb2wtPm5leHQpCi0gICAgd3JpdGVfcmNfZGlhbG9nX2NvbnRyb2wgKGUsIGNvbnRyb2wpOwotCi0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBGb3IgZWFjaCBwcmVkZWZpbmVkIGNvbnRyb2wga2V5d29yZCwgdGhpcyB0YWJsZSBwcm92aWRlcyB0aGUgY2xhc3MKLSAgIGFuZCB0aGUgc3R5bGUuICAqLwotCi1zdHJ1Y3QgY29udHJvbF9pbmZvCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIHNob3J0IGNsYXNzOwotICB1bnNpZ25lZCBsb25nIHN0eWxlOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gY29udHJvbF9pbmZvW10gPQotewotICB7ICJBVVRPM1NUQVRFIiwgQ1RMX0JVVFRPTiwgQlNfQVVUTzNTVEFURSB9LAotICB7ICJBVVRPQ0hFQ0tCT1giLCBDVExfQlVUVE9OLCBCU19BVVRPQ0hFQ0tCT1ggfSwKLSAgeyAiQVVUT1JBRElPQlVUVE9OIiwgQ1RMX0JVVFRPTiwgQlNfQVVUT1JBRElPQlVUVE9OIH0sCi0gIHsgIkNIRUNLQk9YIiwgQ1RMX0JVVFRPTiwgQlNfQ0hFQ0tCT1ggfSwKLSAgeyAiQ09NQk9CT1giLCBDVExfQ09NQk9CT1gsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJDVEVYVCIsIENUTF9TVEFUSUMsIFNTX0NFTlRFUiB9LAotICB7ICJERUZQVVNIQlVUVE9OIiwgQ1RMX0JVVFRPTiwgQlNfREVGUFVTSEJVVFRPTiB9LAotICB7ICJFRElUVEVYVCIsIENUTF9FRElULCAodW5zaWduZWQgbG9uZykgLTEgfSwKLSAgeyAiR1JPVVBCT1giLCBDVExfQlVUVE9OLCBCU19HUk9VUEJPWCB9LAotICB7ICJJQ09OIiwgQ1RMX1NUQVRJQywgU1NfSUNPTiB9LAotICB7ICJMSVNUQk9YIiwgQ1RMX0xJU1RCT1gsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJMVEVYVCIsIENUTF9TVEFUSUMsIFNTX0xFRlQgfSwKLSAgeyAiUFVTSEJPWCIsIENUTF9CVVRUT04sIEJTX1BVU0hCT1ggfSwKLSAgeyAiUFVTSEJVVFRPTiIsIENUTF9CVVRUT04sIEJTX1BVU0hCVVRUT04gfSwKLSAgeyAiUkFESU9CVVRUT04iLCBDVExfQlVUVE9OLCBCU19SQURJT0JVVFRPTiB9LAotICB7ICJSVEVYVCIsIENUTF9TVEFUSUMsIFNTX1JJR0hUIH0sCi0gIHsgIlNDUk9MTEJBUiIsIENUTF9TQ1JPTExCQVIsICh1bnNpZ25lZCBsb25nKSAtMSB9LAotICB7ICJTVEFURTMiLCBDVExfQlVUVE9OLCBCU18zU1RBVEUgfSwKLSAgLyogSXQncyBpbXBvcnRhbnQgdGhhdCBVU0VSQlVUVE9OIGNvbWUgYWZ0ZXIgYWxsIHRoZSBvdGhlciBidXR0b24KLSAgICAgdHlwZXMsIHNvIHRoYXQgaXQgd29uJ3QgYmUgbWF0Y2hlZCB0b28gZWFybHkuICAqLwotICB7ICJVU0VSQlVUVE9OIiwgQ1RMX0JVVFRPTiwgKHVuc2lnbmVkIGxvbmcpIC0xIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi0vKiBXcml0ZSBhIGRpYWxvZyBjb250cm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2RpYWxvZ19jb250cm9sIChlLCBjb250cm9sKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKmNvbnRyb2w7Ci17Ci0gIGNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gKmNpOwotCi0gIGZwcmludGYgKGUsICIgICIpOwotCi0gIGlmIChjb250cm9sLT5jbGFzcy5uYW1lZCkKLSAgICBjaSA9IE5VTEw7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGNpID0gY29udHJvbF9pbmZvOyBjaS0+bmFtZSAhPSBOVUxMOyArK2NpKQotCWlmIChjaS0+Y2xhc3MgPT0gY29udHJvbC0+Y2xhc3MudS5pZAotCSAgICAmJiAoY2ktPnN0eWxlID09ICh1bnNpZ25lZCBsb25nKSAtMQotCQl8fCBjaS0+c3R5bGUgPT0gKGNvbnRyb2wtPnN0eWxlICYgMHhmZikpKQotCSAgYnJlYWs7Ci0gICAgfQotICBpZiAoY2kgPT0gTlVMTCkKLSAgICBmcHJpbnRmIChlLCAiQ09OVFJPTCIpOwotICBlbHNlIGlmIChjaS0+bmFtZSAhPSBOVUxMKQotICAgIGZwcmludGYgKGUsICIlcyIsIGNpLT5uYW1lKTsKLSAgZWxzZQotICAgIGZwcmludGYgKGUsICJDT05UUk9MIik7Ci0gIAotICBpZiAoY29udHJvbC0+dGV4dC5uYW1lZCB8fCBjb250cm9sLT50ZXh0LnUuaWQgIT0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiICIpOwotICAgICAgcmVzX2lkX3ByaW50IChlLCBjb250cm9sLT50ZXh0LCAxKTsKLSAgICAgIGZwcmludGYgKGUsICIsIik7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICIgJWQsICIsIGNvbnRyb2wtPmlkKTsKLQotICBpZiAoY2kgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29udHJvbC0+Y2xhc3MubmFtZWQpCi0JZnByaW50ZiAoZSwgIlwiIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKGUsIGNvbnRyb2wtPmNsYXNzLCAwKTsKLSAgICAgIGlmIChjb250cm9sLT5jbGFzcy5uYW1lZCkKLQlmcHJpbnRmIChlLCAiXCIiKTsKLSAgICAgIGZwcmludGYgKGUsICIsIDB4JWx4LCAiLCBjb250cm9sLT5zdHlsZSk7Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICIlZCwgJWQiLCBjb250cm9sLT54LCBjb250cm9sLT55KTsKLQotICBpZiAoY29udHJvbC0+c3R5bGUgIT0gU1NfSUNPTgotICAgICAgfHwgY29udHJvbC0+ZXhzdHlsZSAhPSAwCi0gICAgICB8fCBjb250cm9sLT53aWR0aCAhPSAwCi0gICAgICB8fCBjb250cm9sLT5oZWlnaHQgIT0gMAotICAgICAgfHwgY29udHJvbC0+aGVscCAhPSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIsICVkLCAlZCIsIGNvbnRyb2wtPndpZHRoLCBjb250cm9sLT5oZWlnaHQpOwotCi0gICAgICAvKiBGSVhNRTogV2UgZG9uJ3QgbmVlZCB0byBwcmludCB0aGUgc3R5bGUgaWYgaXQgaXMgdGhlIGRlZmF1bHQuCi0JIE1vcmUgaW1wb3J0YW50bHksIGluIGNlcnRhaW4gY2FzZXMgd2UgYWN0dWFsbHkgbmVlZCB0byB0dXJuCi0JIG9mZiBwYXJ0cyBvZiB0aGUgZm9yY2VkIHN0eWxlLCBieSB1c2luZyBOT1QuICAqLwotICAgICAgZnByaW50ZiAoZSwgIiwgMHglbHgiLCBjb250cm9sLT5zdHlsZSk7Ci0KLSAgICAgIGlmIChjb250cm9sLT5leHN0eWxlICE9IDAgfHwgY29udHJvbC0+aGVscCAhPSAwKQotCWZwcmludGYgKGUsICIsIDB4JWx4LCAlbHUiLCBjb250cm9sLT5leHN0eWxlLCBjb250cm9sLT5oZWxwKTsKLSAgICB9Ci0KLSAgZnByaW50ZiAoZSwgIlxuIik7Ci0KLSAgaWYgKGNvbnRyb2wtPmRhdGEgIT0gTlVMTCkKLSAgICB3cml0ZV9yY19yY2RhdGEgKGUsIGNvbnRyb2wtPmRhdGEsIDIpOwotfQotCi0vKiBXcml0ZSBvdXQgZm9udCBkaXJlY3RvcnkgZGF0YS4gIFRoaXMgd291bGQgbm9ybWFsbHkgYmUgYnVpbHQgZnJvbQotICAgdGhlIGZvbnQgZGF0YS4gICovCi0KLXN0YXRpYyB2b2lkCi13cml0ZV9yY19mb250ZGlyIChlLCBmb250ZGlyKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgZm9udGRpciAqZm9udGRpcjsKLXsKLSAgY29uc3Qgc3RydWN0IGZvbnRkaXIgKmZjOwotCi0gIGZvciAoZmMgPSBmb250ZGlyOyBmYyAhPSBOVUxMOyBmYyA9IGZjLT5uZXh0KQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyBGb250IGluZGV4OiAlZFxuIiwgZmMtPmluZGV4KTsKLSAgICAgIHdyaXRlX3JjX2ZpbGVkYXRhIChlLCBmYy0+bGVuZ3RoLCBmYy0+ZGF0YSk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgZ3JvdXAgaWNvbiBkYXRhLiAgVGhpcyB3b3VsZCBub3JtYWxseSBiZSBidWlsdCBmcm9tIHRoZQotICAgaWNvbiBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2dyb3VwX2ljb24gKGUsIGdyb3VwX2ljb24pCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCBncm91cF9pY29uICpncm91cF9pY29uOwotewotICBjb25zdCBzdHJ1Y3QgZ3JvdXBfaWNvbiAqZ2k7Ci0KLSAgZm9yIChnaSA9IGdyb3VwX2ljb247IGdpICE9IE5VTEw7IGdpID0gZ2ktPm5leHQpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vIHdpZHRoOiAlZDsgaGVpZ2h0ICVkOyBjb2xvcnM6ICVkOyBwbGFuZXMgJWQ7IGJpdHMgJWRcbiIsCi0JICAgICAgIGdpLT53aWR0aCwgZ2ktPmhlaWdodCwgZ2ktPmNvbG9ycywgZ2ktPnBsYW5lcywgZ2ktPmJpdHMpOwotICAgICAgZnByaW50ZiAoZSwgIi8vIGRhdGEgYnl0ZXM6ICVsdTsgaW5kZXg6ICVkXG4iLAotCSAgICAgICBnaS0+Ynl0ZXMsIGdpLT5pbmRleCk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSBvdXQgYSBtZW51IHJlc291cmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX21lbnUgKGUsIG1lbnUsIG1lbnVleCkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgIGludCBtZW51ZXg7Ci17Ci0gIGlmIChtZW51LT5oZWxwICE9IDApCi0gICAgZnByaW50ZiAoZSwgIi8vIEhlbHAgSUQ6ICVsdVxuIiwgbWVudS0+aGVscCk7Ci0gIHdyaXRlX3JjX21lbnVpdGVtcyAoZSwgbWVudS0+aXRlbXMsIG1lbnVleCwgMCk7Ci19Ci0KLS8qIFdyaXRlIG91dCBtZW51aXRlbXMuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfbWVudWl0ZW1zIChlLCBtZW51aXRlbXMsIG1lbnVleCwgaW5kKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1lbnVpdGVtczsKLSAgICAgaW50IG1lbnVleDsKLSAgICAgaW50IGluZDsKLXsKLSAgY29uc3Qgc3RydWN0IG1lbnVpdGVtICptaTsKLQotICBpbmRlbnQgKGUsIGluZCk7Ci0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0KLSAgZm9yIChtaSA9IG1lbnVpdGVtczsgbWkgIT0gTlVMTDsgbWkgPSBtaS0+bmV4dCkKLSAgICB7Ci0gICAgICBpbmRlbnQgKGUsIGluZCArIDIpOwotCi0gICAgICBpZiAobWktPnBvcHVwID09IE5VTEwpCi0JZnByaW50ZiAoZSwgIk1FTlVJVEVNIik7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZSwgIlBPUFVQIik7Ci0KLSAgICAgIGlmICghIG1lbnVleAotCSAgJiYgbWktPnBvcHVwID09IE5VTEwKLQkgICYmIG1pLT50ZXh0ID09IE5VTEwKLQkgICYmIG1pLT50eXBlID09IDAKLQkgICYmIG1pLT5pZCA9PSAwKQotCXsKLQkgIGZwcmludGYgKGUsICIgU0VQQVJBVE9SXG4iKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKG1pLT50ZXh0ID09IE5VTEwpCi0JZnByaW50ZiAoZSwgIiBcIlwiIik7Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAoZSwgIiBcIiIpOwotCSAgdW5pY29kZV9wcmludCAoZSwgbWktPnRleHQsIC0xKTsKLQkgIGZwcmludGYgKGUsICJcIiIpOwotCX0KLQotICAgICAgaWYgKCEgbWVudWV4KQotCXsKLQkgIGlmIChtaS0+cG9wdXAgPT0gTlVMTCkKLQkgICAgZnByaW50ZiAoZSwgIiwgJWQiLCBtaS0+aWQpOwotCi0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fQ0hFQ0tFRCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgQ0hFQ0tFRCIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX0dSQVlFRCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgR1JBWUVEIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fSEVMUCkgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgSEVMUCIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX0lOQUNUSVZFKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBJTkFDVElWRSIpOwotCSAgaWYgKChtaS0+dHlwZSAmIE1FTlVJVEVNX01FTlVCQVJCUkVBSykgIT0gMCkKLQkgICAgZnByaW50ZiAoZSwgIiwgTUVOVUJBUkJSRUFLIik7Ci0JICBpZiAoKG1pLT50eXBlICYgTUVOVUlURU1fTUVOVUJSRUFLKSAhPSAwKQotCSAgICBmcHJpbnRmIChlLCAiLCBNRU5VQlJFQUsiKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG1pLT5pZCAhPSAwIHx8IG1pLT50eXBlICE9IDAgfHwgbWktPnN0YXRlICE9IDAgfHwgbWktPmhlbHAgIT0gMCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKGUsICIsICVkIiwgbWktPmlkKTsKLQkgICAgICBpZiAobWktPnR5cGUgIT0gMCB8fCBtaS0+c3RhdGUgIT0gMCB8fCBtaS0+aGVscCAhPSAwKQotCQl7Ci0JCSAgZnByaW50ZiAoZSwgIiwgJWx1IiwgbWktPnR5cGUpOwotCQkgIGlmIChtaS0+c3RhdGUgIT0gMCB8fCBtaS0+aGVscCAhPSAwKQotCQkgICAgewotCQkgICAgICBmcHJpbnRmIChlLCAiLCAlbHUiLCBtaS0+c3RhdGUpOwotCQkgICAgICBpZiAobWktPmhlbHAgIT0gMCkKLQkJCWZwcmludGYgKGUsICIsICVsdSIsIG1pLT5oZWxwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLQotICAgICAgaWYgKG1pLT5wb3B1cCAhPSBOVUxMKQotCXdyaXRlX3JjX21lbnVpdGVtcyAoZSwgbWktPnBvcHVwLCBtZW51ZXgsIGluZCArIDIpOwotICAgIH0KLQotICBpbmRlbnQgKGUsIGluZCk7Ci0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgYW4gcmNkYXRhIHJlc291cmNlLiAgVGhpcyBpcyBhbHNvIHVzZWQgZm9yIG90aGVyIHR5cGVzIG9mCi0gICByZXNvdXJjZXMgdGhhdCBuZWVkIHRvIHByaW50IGFyYml0cmFyeSBkYXRhLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3JjZGF0YSAoZSwgcmNkYXRhLCBpbmQpCi0gICAgIEZJTEUgKmU7Ci0gICAgIGNvbnN0IHN0cnVjdCByY2RhdGFfaXRlbSAqcmNkYXRhOwotICAgICBpbnQgaW5kOwotewotICBjb25zdCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnJpOwotCi0gIGluZGVudCAoZSwgaW5kKTsKLSAgZnByaW50ZiAoZSwgIkJFR0lOXG4iKTsKLQotICBmb3IgKHJpID0gcmNkYXRhOyByaSAhPSBOVUxMOyByaSA9IHJpLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChyaS0+dHlwZSA9PSBSQ0RBVEFfQlVGRkVSICYmIHJpLT51LmJ1ZmZlci5sZW5ndGggPT0gMCkKLQljb250aW51ZTsKLQotICAgICAgaW5kZW50IChlLCBpbmQgKyAyKTsKLQotICAgICAgc3dpdGNoIChyaS0+dHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JY2FzZSBSQ0RBVEFfV09SRDoKLQkgIGZwcmludGYgKGUsICIlZCIsIHJpLT51LndvcmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9EV09SRDoKLQkgIGZwcmludGYgKGUsICIlbHVMIiwgcmktPnUuZHdvcmQpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9TVFJJTkc6Ci0JICB7Ci0JICAgIGNvbnN0IGNoYXIgKnM7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQotCSAgICBmcHJpbnRmIChlLCAiXCIiKTsKLQkgICAgcyA9IHJpLT51LnN0cmluZy5zOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgcmktPnUuc3RyaW5nLmxlbmd0aDsgaSsrKQotCSAgICAgIHsKLQkJaWYgKGlzcHJpbnQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSAgcHV0YyAoKnMsIGUpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZSwgIlxcJTAzbyIsICpzKTsKLQkgICAgICB9Ci0JICAgIGZwcmludGYgKGUsICJcIiIpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgUkNEQVRBX1dTVFJJTkc6Ci0JICBmcHJpbnRmIChlLCAiTFwiIik7Ci0JICB1bmljb2RlX3ByaW50IChlLCByaS0+dS53c3RyaW5nLncsIHJpLT51LndzdHJpbmcubGVuZ3RoKTsKLQkgIGZwcmludGYgKGUsICJcIiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJDREFUQV9CVUZGRVI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaTsKLQkgICAgaW50IGZpcnN0OwotCi0JICAgIC8qIEFzc3VtZSBsaXR0bGUgZW5kaWFuIGRhdGEuICAqLwotCi0JICAgIGZpcnN0ID0gMTsKLQkgICAgZm9yIChpID0gMDsgaSArIDMgPCByaS0+dS5idWZmZXIubGVuZ3RoOyBpICs9IDQpCi0JICAgICAgewotCQl1bnNpZ25lZCBsb25nIGw7Ci0KLQkJbCA9ICgoKCgoKHJpLT51LmJ1ZmZlci5kYXRhW2kgKyAzXSA8PCA4KQotCQkJIHwgcmktPnUuYnVmZmVyLmRhdGFbaSArIDJdKSA8PCA4KQotCQkgICAgICAgfCByaS0+dS5idWZmZXIuZGF0YVtpICsgMV0pIDw8IDgpCi0JCSAgICAgfCByaS0+dS5idWZmZXIuZGF0YVtpXSk7Ci0JCWlmIChmaXJzdCkKLQkJICBmaXJzdCA9IDA7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBmcHJpbnRmIChlLCAiLFxuIik7Ci0JCSAgICBpbmRlbnQgKGUsIGluZCArIDIpOwotCQkgIH0KLQkJZnByaW50ZiAoZSwgIiVsdUwiLCBsKTsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGkgKyAxIDwgcmktPnUuYnVmZmVyLmxlbmd0aCkKLQkgICAgICB7Ci0JCWludCBpOwotCi0JCWkgPSAocmktPnUuYnVmZmVyLmRhdGFbaSArIDFdIDw8IDgpIHwgcmktPnUuYnVmZmVyLmRhdGFbaV07Ci0JCWlmIChmaXJzdCkKLQkJICBmaXJzdCA9IDA7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBmcHJpbnRmIChlLCAiLFxuIik7Ci0JCSAgICBpbmRlbnQgKGUsIGluZCArIDIpOwotCQkgIH0KLQkJZnByaW50ZiAoZSwgIiVkIiwgaSk7Ci0JCWkgKz0gMjsKLQkgICAgICB9Ci0KLQkgICAgaWYgKGkgPCByaS0+dS5idWZmZXIubGVuZ3RoKQotCSAgICAgIHsKLQkJaWYgKGZpcnN0KQotCQkgIGZpcnN0ID0gMDsKLQkJZWxzZQotCQkgIHsKLQkJICAgIGZwcmludGYgKGUsICIsXG4iKTsKLQkJICAgIGluZGVudCAoZSwgaW5kICsgMik7Ci0JCSAgfQotCQlpZiAoKHJpLT51LmJ1ZmZlci5kYXRhW2ldICYgMHg3ZikgPT0gcmktPnUuYnVmZmVyLmRhdGFbaV0KLQkJICAgICYmIGlzcHJpbnQgKHJpLT51LmJ1ZmZlci5kYXRhW2ldKSkKLQkJICBmcHJpbnRmIChlLCAiXCIlY1wiIiwgcmktPnUuYnVmZmVyLmRhdGFbaV0pOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZSwgIlwiXCUwM29cIiIsIHJpLT51LmJ1ZmZlci5kYXRhW2ldKTsKLQkgICAgICB9Ci0KLQkgICAgYnJlYWs7Ci0JICB9Ci0JfQotCi0gICAgICBpZiAocmktPm5leHQgIT0gTlVMTCkKLQlmcHJpbnRmIChlLCAiLCIpOwotICAgICAgZnByaW50ZiAoZSwgIlxuIik7Ci0gICAgfQotCi0gIGluZGVudCAoZSwgaW5kKTsKLSAgZnByaW50ZiAoZSwgIkVORFxuIik7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHN0cmluZ3RhYmxlIHJlc291cmNlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX3N0cmluZ3RhYmxlIChlLCBuYW1lLCBzdHJpbmd0YWJsZSkKLSAgICAgRklMRSAqZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHN0cmluZ3RhYmxlICpzdHJpbmd0YWJsZTsKLXsKLSAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gIGludCBpOwotCi0gIGlmIChuYW1lICE9IE5VTEwgJiYgISBuYW1lLT5uYW1lZCkKLSAgICBvZmZzZXQgPSAobmFtZS0+dS5pZCAtIDEpIDw8IDQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcHJpbnRmIChlLCAiLy8gJXMgc3RyaW5nIHRhYmxlIG5hbWVcbiIsCi0JICAgICAgIG5hbWUgPT0gTlVMTCA/ICJNaXNzaW5nIiA6ICJJbnZhbGlkIik7Ci0gICAgICBvZmZzZXQgPSAwOwotICAgIH0KLQotICBmcHJpbnRmIChlLCAiQkVHSU5cbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5sZW5ndGggIT0gMCkKLQl7Ci0JICBmcHJpbnRmIChlLCAiICAlbHUsIFwiIiwgb2Zmc2V0ICsgaSk7Ci0JICB1bmljb2RlX3ByaW50IChlLCBzdHJpbmd0YWJsZS0+c3RyaW5nc1tpXS5zdHJpbmcsCi0JCQkgc3RyaW5ndGFibGUtPnN0cmluZ3NbaV0ubGVuZ3RoKTsKLQkgIGZwcmludGYgKGUsICJcIlxuIik7Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChlLCAiRU5EXG4iKTsKLX0KLQotLyogV3JpdGUgb3V0IGEgdmVyc2lvbmluZm8gcmVzb3VyY2UuICAqLwotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmNfdmVyc2lvbmluZm8gKGUsIHZlcnNpb25pbmZvKQotICAgICBGSUxFICplOwotICAgICBjb25zdCBzdHJ1Y3QgdmVyc2lvbmluZm8gKnZlcnNpb25pbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmY7Ci0gIGNvbnN0IHN0cnVjdCB2ZXJfaW5mbyAqdmk7Ci0KLSAgZiA9IHZlcnNpb25pbmZvLT5maXhlZDsKLSAgaWYgKGYtPmZpbGVfdmVyc2lvbl9tcyAhPSAwIHx8IGYtPmZpbGVfdmVyc2lvbl9scyAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRVZFUlNJT04gJWx1LCAlbHUsICVsdSwgJWx1XG4iLAotCSAgICAgKGYtPmZpbGVfdmVyc2lvbl9tcyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5maWxlX3ZlcnNpb25fbXMgJiAweGZmZmYsCi0JICAgICAoZi0+ZmlsZV92ZXJzaW9uX2xzID4+IDE2KSAmIDB4ZmZmZiwKLQkgICAgIGYtPmZpbGVfdmVyc2lvbl9scyAmIDB4ZmZmZik7Ci0gIGlmIChmLT5wcm9kdWN0X3ZlcnNpb25fbXMgIT0gMCB8fCBmLT5wcm9kdWN0X3ZlcnNpb25fbHMgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIFBST0RVQ1RWRVJTSU9OICVsdSwgJWx1LCAlbHUsICVsdVxuIiwKLQkgICAgIChmLT5wcm9kdWN0X3ZlcnNpb25fbXMgPj4gMTYpICYgMHhmZmZmLAotCSAgICAgZi0+cHJvZHVjdF92ZXJzaW9uX21zICYgMHhmZmZmLAotCSAgICAgKGYtPnByb2R1Y3RfdmVyc2lvbl9scyA+PiAxNikgJiAweGZmZmYsCi0JICAgICBmLT5wcm9kdWN0X3ZlcnNpb25fbHMgJiAweGZmZmYpOwotICBpZiAoZi0+ZmlsZV9mbGFnc19tYXNrICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFRkxBR1NNQVNLIDB4JWx4XG4iLCBmLT5maWxlX2ZsYWdzX21hc2spOwotICBpZiAoZi0+ZmlsZV9mbGFncyAhPSAwKQotICAgIGZwcmludGYgKGUsICIgRklMRUZMQUdTIDB4JWx4XG4iLCBmLT5maWxlX2ZsYWdzKTsKLSAgaWYgKGYtPmZpbGVfb3MgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVPUyAweCVseFxuIiwgZi0+ZmlsZV9vcyk7Ci0gIGlmIChmLT5maWxlX3R5cGUgIT0gMCkKLSAgICBmcHJpbnRmIChlLCAiIEZJTEVUWVBFIDB4JWx4XG4iLCBmLT5maWxlX3R5cGUpOwotICBpZiAoZi0+ZmlsZV9zdWJ0eXBlICE9IDApCi0gICAgZnByaW50ZiAoZSwgIiBGSUxFU1VCVFlQRSAweCVseFxuIiwgZi0+ZmlsZV9zdWJ0eXBlKTsKLSAgaWYgKGYtPmZpbGVfZGF0ZV9tcyAhPSAwIHx8IGYtPmZpbGVfZGF0ZV9scyAhPSAwKQotICAgIGZwcmludGYgKGUsICIvLyBEYXRlOiAlbHUsICVsdVxuIiwgZi0+ZmlsZV9kYXRlX21zLCBmLT5maWxlX2RhdGVfbHMpOwotCi0gIGZwcmludGYgKGUsICJCRUdJTlxuIik7Ci0KLSAgZm9yICh2aSA9IHZlcnNpb25pbmZvLT52YXI7IHZpICE9IE5VTEw7IHZpID0gdmktPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoICh2aS0+dHlwZSkKLQl7Ci0JY2FzZSBWRVJJTkZPX1NUUklORzoKLQkgIHsKLQkgICAgY29uc3Qgc3RydWN0IHZlcl9zdHJpbmdpbmZvICp2czsKLQotCSAgICBmcHJpbnRmIChlLCAiICBCTE9DSyBcIlN0cmluZ0ZpbGVJbmZvXCJcbiIpOwotCSAgICBmcHJpbnRmIChlLCAiICBCRUdJTlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgICAgQkxPQ0sgXCIiKTsKLQkgICAgdW5pY29kZV9wcmludCAoZSwgdmktPnUuc3RyaW5nLmxhbmd1YWdlLCAtMSk7Ci0JICAgIGZwcmludGYgKGUsICJcIlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgICAgQkVHSU5cbiIpOwotCi0JICAgIGZvciAodnMgPSB2aS0+dS5zdHJpbmcuc3RyaW5nczsgdnMgIT0gTlVMTDsgdnMgPSB2cy0+bmV4dCkKLQkgICAgICB7Ci0JCWZwcmludGYgKGUsICIgICAgICBWQUxVRSBcIiIpOwotCQl1bmljb2RlX3ByaW50IChlLCB2cy0+a2V5LCAtMSk7Ci0JCWZwcmludGYgKGUsICJcIiwgXCIiKTsKLQkJdW5pY29kZV9wcmludCAoZSwgdnMtPnZhbHVlLCAtMSk7Ci0JCWZwcmludGYgKGUsICJcIlxuIik7Ci0JICAgICAgfQotCi0JICAgIGZwcmludGYgKGUsICIgICAgRU5EXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgRU5EXG4iKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQljYXNlIFZFUklORk9fVkFSOgotCSAgewotCSAgICBjb25zdCBzdHJ1Y3QgdmVyX3ZhcmluZm8gKnZ2OwotCi0JICAgIGZwcmludGYgKGUsICIgIEJMT0NLIFwiVmFyRmlsZUluZm9cIlxuIik7Ci0JICAgIGZwcmludGYgKGUsICIgIEJFR0lOXG4iKTsKLQkgICAgZnByaW50ZiAoZSwgIiAgICBWQUxVRSBcIiIpOwotCSAgICB1bmljb2RlX3ByaW50IChlLCB2aS0+dS52YXIua2V5LCAtMSk7Ci0JICAgIGZwcmludGYgKGUsICJcIiIpOwotCi0JICAgIGZvciAodnYgPSB2aS0+dS52YXIudmFyOyB2diAhPSBOVUxMOyB2diA9IHZ2LT5uZXh0KQotCSAgICAgIGZwcmludGYgKGUsICIsIDB4JXgsICVkIiwgKHVuc2lnbmVkIGludCkgdnYtPmxhbmd1YWdlLAotCQkgICAgICAgdnYtPmNoYXJzZXQpOwotCi0JICAgIGZwcmludGYgKGUsICJcbiAgRU5EXG4iKTsKLQotCSAgICBicmVhazsKLQkgIH0KLQl9Ci0gICAgfQotCi0gIGZwcmludGYgKGUsICJFTkRcbiIpOwotfQotCi0vKiBXcml0ZSBvdXQgZGF0YSB3aGljaCB3b3VsZCBub3JtYWxseSBiZSByZWFkIGZyb20gYSBmaWxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXdyaXRlX3JjX2ZpbGVkYXRhIChlLCBsZW5ndGgsIGRhdGEpCi0gICAgIEZJTEUgKmU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOwotewotICB1bnNpZ25lZCBsb25nIGk7Ci0KLSAgZm9yIChpID0gMDsgaSArIDE1IDwgbGVuZ3RoOyBpICs9IDE2KQotICAgIHsKLSAgICAgIGZwcmludGYgKGUsICIvLyAlNGx4OiAiLCBpKTsKLSAgICAgIGZwcmludGYgKGUsICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIiwKLQkgICAgICAgZGF0YVtpICsgMF0sIGRhdGFbaSArIDFdLCBkYXRhW2kgKyAyXSwgZGF0YVtpICsgM10sCi0JICAgICAgIGRhdGFbaSArIDRdLCBkYXRhW2kgKyA1XSwgZGF0YVtpICsgNl0sIGRhdGFbaSArIDddKTsKLSAgICAgIGZwcmludGYgKGUsICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCi0JICAgICAgIGRhdGFbaSArICA4XSwgZGF0YVtpICsgIDldLCBkYXRhW2kgKyAxMF0sIGRhdGFbaSArIDExXSwKLQkgICAgICAgZGF0YVtpICsgMTJdLCBkYXRhW2kgKyAxM10sIGRhdGFbaSArIDE0XSwgZGF0YVtpICsgMTVdKTsKLSAgICB9Ci0KLSAgaWYgKGkgPCBsZW5ndGgpCi0gICAgewotICAgICAgZnByaW50ZiAoZSwgIi8vICU0bHg6IiwgaSk7Ci0gICAgICB3aGlsZSAoaSA8IGxlbmd0aCkKLQl7Ci0JICBmcHJpbnRmIChlLCAiICUwMngiLCBkYXRhW2ldKTsKLQkgICsraTsKLQl9Ci0gICAgICBmcHJpbnRmIChlLCAiXG4iKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9yZXNyZXMuYyBiL2JpbnV0aWxzL3Jlc3Jlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTI2NGY0Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Jlc3Jlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU2ICswLDAgQEAKLS8qIHJlc3Jlcy5jOiByZWFkX3Jlc19maWxlIGFuZCB3cml0ZV9yZXNfZmlsZSBpbXBsZW1lbnRhdGlvbiBmb3Igd2luZHJlcy4KLQotICAgQ29weXJpZ2h0IDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEFuZGVycyBOb3JsYW5kZXIgPGFub3JsYW5kQGhlbTIucGFzc2FnZW4uc2U+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiYnVjb21tLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotCi1zdHJ1Y3QgcmVzX2hkcgotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBkYXRhX3NpemU7Ci0gICAgdW5zaWduZWQgbG9uZyBoZWFkZXJfc2l6ZTsKLSAgfTsKLQotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2RpcmVjdG9yeQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGludCAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19yZXNvdXJjZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9yZXNfYmluCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqKSk7Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19pZCBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX2lkICopKTsKLXN0YXRpYyB2b2lkIHdyaXRlX3Jlc19pbmZvIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2RhdGEgUEFSQU1TICgoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCkpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVzX2hlYWRlcgotICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwKLQkgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICopKTsKLQotc3RhdGljIGludCByZWFkX3Jlc291cmNlX2VudHJ5IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIHJlYWRfcmVzX2RhdGEgUEFSQU1TICgodm9pZCAqLCBzaXplX3QsIGludCkpOwotc3RhdGljIHZvaWQgcmVhZF9yZXNfaWQgUEFSQU1TICgoc3RydWN0IHJlc19pZCAqKSk7Ci1zdGF0aWMgdW5pY2hhciAqcmVhZF91bmlzdHJpbmcgUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyB2b2lkIHNraXBfbnVsbF9yZXNvdXJjZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9pZF9zaXplIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZXNfaWQgKikpOwotc3RhdGljIHZvaWQgcmVzX2FsaWduX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgdm9pZAotICByZXNfYWRkX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfcmVzb3VyY2UgKiwgY29uc3Qgc3RydWN0IHJlc19pZCAqLAotCSAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKiwgaW50LCBpbnQpKTsKLQotdm9pZAotICByZXNfYXBwZW5kX3Jlc291cmNlCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqLCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosCi0JICAgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOwotCi1zdGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlcyA9IE5VTEw7Ci0KLXN0YXRpYyBGSUxFICpmcmVzOwotc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotCi1leHRlcm4gY2hhciAqcHJvZ3JhbV9uYW1lOwotCi0vKiBSZWFkIHJlc291cmNlIGZpbGUgKi8KLXN0cnVjdCByZXNfZGlyZWN0b3J5ICoKLXJlYWRfcmVzX2ZpbGUgKGZuKQotICAgICBjb25zdCBjaGFyICpmbjsKLXsKLSAgZmlsZW5hbWUgPSBmbjsKLSAgZnJlcyA9IGZvcGVuIChmaWxlbmFtZSwgInJiIik7Ci0gIGlmIChmcmVzID09IE5VTEwpCi0gICAgZmF0YWwgKCJjYW4ndCBvcGVuIGAlcycgZm9yIG91dHB1dDogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgc2tpcF9udWxsX3Jlc291cmNlICgpOwotCi0gIHdoaWxlIChyZWFkX3Jlc291cmNlX2VudHJ5ICgpKQotICAgIDsKLQotICBmY2xvc2UgKGZyZXMpOwotCi0gIHJldHVybiByZXNvdXJjZXM7Ci19Ci0KLS8qIFdyaXRlIHJlc291cmNlIGZpbGUgKi8KLXZvaWQKLXdyaXRlX3Jlc19maWxlIChmbiwgcmVzZGlyKQotICAgICBjb25zdCBjaGFyICpmbjsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc2RpcjsKLXsKLSAgaW50IGxhbmd1YWdlOwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzaWduW10gPQotICB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCi0gICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gIGxvbmcgZnBvczsKLQotICBmaWxlbmFtZSA9IGZuOwotCi0gIGZyZXMgPSBmb3BlbiAoZmlsZW5hbWUsICJ3YiIpOwotICBpZiAoZnJlcyA9PSBOVUxMKQotICAgIGZhdGFsICgiY2FuJ3Qgb3BlbiBgJXMnIGZvciBvdXRwdXQ6ICVzIiwgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIC8qIFdyaXRlIDMyIGJpdCByZXNvdXJjZSBzaWduYXR1cmUgKi8KLSAgd3JpdGVfcmVzX2RhdGEgKHNpZ24sIHNpemVvZiAoc2lnbiksIDEpOwotCi0gIC8qIHdyaXRlIHJlc291cmNlcyAqLwotCi0gIGxhbmd1YWdlID0gLTE7Ci0gIHdyaXRlX3Jlc19kaXJlY3RvcnkgKHJlc2RpciwgKGNvbnN0IHN0cnVjdCByZXNfaWQgKikgTlVMTCwKLQkJICAgICAgIChjb25zdCBzdHJ1Y3QgcmVzX2lkICopIE5VTEwsICZsYW5ndWFnZSwgMSk7Ci0KLSAgLyogZW5kIGZpbGUgb24gRFdPUkQgYm91bmRhcnkgKi8KLSAgZnBvcyA9IGZ0ZWxsIChmcmVzKTsKLSAgaWYgKGZwb3MgJSA0KQotICAgIHdyaXRlX3Jlc19kYXRhIChzaWduLCBmcG9zICUgNCwgMSk7Ci0KLSAgZmNsb3NlIChmcmVzKTsKLX0KLQotLyogUmVhZCBhIHJlc291cmNlIGVudHJ5LCByZXR1cm5zIDAgd2hlbiBhbGwgcmVzb3VyY2VzIGFyZSByZWFkICovCi1zdGF0aWMgaW50Ci1yZWFkX3Jlc291cmNlX2VudHJ5ICh2b2lkKQotewotICBzdHJ1Y3QgcmVzX2lkIHR5cGU7Ci0gIHN0cnVjdCByZXNfaWQgbmFtZTsKLSAgc3RydWN0IHJlc19yZXNfaW5mbyByZXNpbmZvOwotICBzdHJ1Y3QgcmVzX2hkciByZXNoZHI7Ci0gIGxvbmcgdmVyc2lvbjsKLSAgdm9pZCAqYnVmZjsKLQotICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotCi0gIC8qIFJlYWQgaGVhZGVyICovCi0gIGlmIChmcmVhZCAoJnJlc2hkciwgc2l6ZW9mIChyZXNoZHIpLCAxLCBmcmVzKSAhPSAxKQotICAgIHJldHVybiAwOwotCi0gIC8qIHJlYWQgcmVzb3VyY2UgdHlwZSAqLwotICByZWFkX3Jlc19pZCAoJnR5cGUpOwotICAvKiByZWFkIHJlc291cmNlIGlkICovCi0gIHJlYWRfcmVzX2lkICgmbmFtZSk7Ci0KLSAgcmVzX2FsaWduX2ZpbGUgKCk7Ci0KLSAgLyogUmVhZCBhZGRpdGlvbmFsIHJlc291cmNlIGhlYWRlciAqLwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby52ZXJzaW9uLCBzaXplb2YgKHJlc2luZm8udmVyc2lvbiksIDEpOwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5tZW1mbGFncywgc2l6ZW9mIChyZXNpbmZvLm1lbWZsYWdzKSwgMSk7Ci0gIHJlYWRfcmVzX2RhdGEgKCZyZXNpbmZvLmxhbmd1YWdlLCBzaXplb2YgKHJlc2luZm8ubGFuZ3VhZ2UpLCAxKTsKLSAgcmVhZF9yZXNfZGF0YSAoJnZlcnNpb24sIHNpemVvZiAodmVyc2lvbiksIDEpOwotICByZWFkX3Jlc19kYXRhICgmcmVzaW5mby5jaGFyYWN0ZXJpc3RpY3MsIHNpemVvZiAocmVzaW5mby5jaGFyYWN0ZXJpc3RpY3MpLCAxKTsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLQotICAvKiBBbGxvY2F0ZSBidWZmZXIgZm9yIGRhdGEgKi8KLSAgYnVmZiA9IHJlc19hbGxvYyAocmVzaGRyLmRhdGFfc2l6ZSk7Ci0gIC8qIFJlYWQgZGF0YSAqLwotICByZWFkX3Jlc19kYXRhIChidWZmLCByZXNoZHIuZGF0YV9zaXplLCAxKTsKLSAgLyogQ29udmVydCBiaW5hcnkgZGF0YSB0byByZXNvdXJjZSAqLwotICByID0gYmluX3RvX3JlcyAodHlwZSwgYnVmZiwgcmVzaGRyLmRhdGFfc2l6ZSwgMCk7Ci0gIHItPnJlc19pbmZvID0gcmVzaW5mbzsKLSAgLyogQWRkIHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeSAqLwotICByZXNfYWRkX3Jlc291cmNlIChyLCAmdHlwZSwgJm5hbWUsIHJlc2luZm8ubGFuZ3VhZ2UsIDApOwotCi0gIHJldHVybiAxOwotfQotCi0vKiB3cml0ZSByZXNvdXJjZSBkaXJlY3RvcnkgdG8gYmluYXJ5IHJlc291cmNlIGZpbGUgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfZGlyZWN0b3J5IChyZCwgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGxldmVsKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmQ7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKm5hbWU7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci0gICAgIGludCBsZXZlbDsKLXsKLSAgY29uc3Qgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0KLSAgZm9yIChyZSA9IHJkLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAobGV2ZWwpCi0JewotCWNhc2UgMToKLQkgIC8qIElmIHdlJ3JlIGF0IGxldmVsIDEsIHRoZSBrZXkgb2YgdGhpcyByZXNvdXJjZSBpcyB0aGUKLQkgICAgIHR5cGUuICBUaGlzIG5vcm1hbGx5IGR1cGxpY2F0ZXMgdGhlIGluZm9ybWF0aW9uIHdlIGhhdmUKLQkgICAgIHN0b3JlZCB3aXRoIHRoZSByZXNvdXJjZSBpdHNlbGYsIGJ1dCB3ZSBuZWVkIHRvIHJlbWVtYmVyCi0JICAgICB0aGUgdHlwZSBpZiB0aGlzIGlzIGEgdXNlciBkZWZpbmUgcmVzb3VyY2UgdHlwZS4gICovCi0JICB0eXBlID0gJnJlLT5pZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAyOgotCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMiwgdGhlIGtleSBvZiB0aGlzIHJlc291cmNlIGlzIHRoZSBuYW1lCi0JICAgICB3ZSBhcmUgZ29pbmcgdG8gdXNlIGluIHRoZSByYyBwcmludG91dC4gKi8KLQkgIG5hbWUgPSAmcmUtPmlkOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6Ci0JICAvKiBJZiB3ZSdyZSBhdCBsZXZlbCAzLCB0aGVuIHRoaXMga2V5IHJlcHJlc2VudHMgYSBsYW5ndWFnZS4KLQkgICAgIFVzZSBpdCB0byB1cGRhdGUgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuICAqLwotCSAgaWYgKCFyZS0+aWQubmFtZWQKLQkgICAgICAmJiByZS0+aWQudS5pZCAhPSAqbGFuZ3VhZ2UKLQkgICAgICAmJiAocmUtPmlkLnUuaWQgJiAweGZmZmYpID09IHJlLT5pZC51LmlkKQotCSAgICB7Ci0JICAgICAgKmxhbmd1YWdlID0gcmUtPmlkLnUuaWQ7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHJlLT5zdWJkaXIpCi0Jd3JpdGVfcmVzX2RpcmVjdG9yeSAocmUtPnUuZGlyLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwgbGV2ZWwgKyAxKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobGV2ZWwgPT0gMykKLQkgICAgewotCSAgICAgIC8qIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlOiB0aGUgdGhyZWUgbGV2ZWxzIGFyZQotCSAgICAgICAgIFRZUEUvTkFNRS9MQU5HVUFHRS4gIE5BTUUgd2lsbCBoYXZlIGJlZW4gc2V0IGF0IGxldmVsCi0JICAgICAgICAgMiwgYW5kIHJlcHJlc2VudHMgdGhlIG5hbWUgdG8gdXNlLiAgV2UgcHJvYmFibHkganVzdAotCSAgICAgICAgIHNldCBMQU5HVUFHRSwgYW5kIGl0IHdpbGwgcHJvYmFibHkgbWF0Y2ggd2hhdCB0aGUKLQkgICAgICAgICByZXNvdXJjZSBpdHNlbGYgcmVjb3JkcyBpZiBhbnl0aGluZy4gICovCi0JICAgICAgd3JpdGVfcmVzX3Jlc291cmNlICh0eXBlLCBuYW1lLCByZS0+dS5yZXMsIGxhbmd1YWdlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiLy8gUmVzb3VyY2UgYXQgdW5leHBlY3RlZCBsZXZlbCAlZFxuIiwgbGV2ZWwpOwotCSAgICAgIHdyaXRlX3Jlc19yZXNvdXJjZSAodHlwZSwgKHN0cnVjdCByZXNfaWQgKikgTlVMTCwgcmUtPnUucmVzLAotCQkJCSAgbGFuZ3VhZ2UpOwotCSAgICB9Ci0JfQotICAgIH0KLQotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX3Jlc291cmNlICh0eXBlLCBuYW1lLCByZXMsIGxhbmd1YWdlKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXM7Ci0gICAgIGludCAqbGFuZ3VhZ2U7Ci17Ci0gIGludCBydDsKLQotICBzd2l0Y2ggKHJlcy0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoKLSAgICAgIHJ0ID0gUlRfQUNDRUxFUkFUT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQklUTUFQOgotICAgICAgcnQgPSBSVF9CSVRNQVA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfQ1VSU09SOgotICAgICAgcnQgPSBSVF9DVVJTT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfQ1VSU09SOgotICAgICAgcnQgPSBSVF9HUk9VUF9DVVJTT1I7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRElBTE9HOgotICAgICAgcnQgPSBSVF9ESUFMT0c7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfRk9OVDoKLSAgICAgIHJ0ID0gUlRfRk9OVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9GT05URElSOgotICAgICAgcnQgPSBSVF9GT05URElSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX0lDT046Ci0gICAgICBydCA9IFJUX0lDT047Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfR1JPVVBfSUNPTjoKLSAgICAgIHJ0ID0gUlRfR1JPVVBfSUNPTjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVNfVFlQRV9NRU5VOgotICAgICAgcnQgPSBSVF9NRU5VOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX01FU1NBR0VUQUJMRToKLSAgICAgIHJ0ID0gUlRfTUVTU0FHRVRBQkxFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1JDREFUQToKLSAgICAgIHJ0ID0gUlRfUkNEQVRBOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFU19UWVBFX1NUUklOR1RBQkxFOgotICAgICAgcnQgPSBSVF9TVFJJTkc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVVNFUkRBVEE6Ci0gICAgICBydCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVTX1RZUEVfVkVSU0lPTklORk86Ci0gICAgICBydCA9IFJUX1ZFUlNJT047Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHJ0ICE9IDAKLSAgICAgICYmIHR5cGUgIT0gTlVMTAotICAgICAgJiYgKHR5cGUtPm5hbWVkIHx8IHR5cGUtPnUuaWQgIT0gcnQpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIi8vIFVuZXhwZWN0ZWQgcmVzb3VyY2UgdHlwZSBtaXNtYXRjaDogIik7Ci0gICAgICByZXNfaWRfcHJpbnQgKHN0ZGVyciwgKnR5cGUsIDEpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICE9ICVkIiwgcnQpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHdyaXRlX3Jlc19iaW4gKHJlcywgdHlwZSwgbmFtZSwgJnJlcy0+cmVzX2luZm8pOwotICByZXR1cm47Ci19Ci0KLS8qIFdyaXRlIGEgcmVzb3VyY2UgaW4gYmluYXJ5IHJlc291cmNlIGZvcm1hdCAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19iaW4gKHJlcywgdHlwZSwgbmFtZSwgcmVzaW5mbykKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqcmVzOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOwotewotICB1bnNpZ25lZCBsb25nIGRhdGFzaXplID0gMDsKLSAgY29uc3Qgc3RydWN0IGJpbmRhdGEgKmJpbl9yZXAsICpkYXRhOwotCi0gIGJpbl9yZXAgPSByZXNfdG9fYmluIChyZXMsIDApOwotICBmb3IgKGRhdGEgPSBiaW5fcmVwOyBkYXRhICE9IE5VTEw7IGRhdGEgPSBkYXRhLT5uZXh0KQotICAgIGRhdGFzaXplICs9IGRhdGEtPmxlbmd0aDsKLQotICB3cml0ZV9yZXNfaGVhZGVyIChkYXRhc2l6ZSwgdHlwZSwgbmFtZSwgcmVzaW5mbyk7Ci0KLSAgZm9yIChkYXRhID0gYmluX3JlcDsgZGF0YSAhPSBOVUxMOyBkYXRhID0gZGF0YS0+bmV4dCkKLSAgICB3cml0ZV9yZXNfZGF0YSAoZGF0YS0+ZGF0YSwgZGF0YS0+bGVuZ3RoLCAxKTsKLX0KLQotLyogR2V0IG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gc3RvcmUgYW4gaWQgaW4gYmluYXJ5IGZvcm1hdCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldF9pZF9zaXplIChpZCkKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWQ7Ci17Ci0gIGlmIChpZC0+bmFtZWQpCi0gICAgcmV0dXJuIHNpemVvZiAodW5pY2hhcikgKiAoaWQtPnUubi5sZW5ndGggKyAxKTsKLSAgZWxzZQotICAgIHJldHVybiBzaXplb2YgKHVuaWNoYXIpICogMjsKLX0KLQotLyogV3JpdGUgYSByZXNvdXJjZSBoZWFkZXIgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfaGVhZGVyIChkYXRhc2l6ZSwgdHlwZSwgbmFtZSwgcmVzaW5mbykKLSAgICAgdW5zaWduZWQgbG9uZyBkYXRhc2l6ZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqbmFtZTsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsKLXsKLSAgc3RydWN0IHJlc19oZHIgcmVzaGRyOwotICByZXNoZHIuZGF0YV9zaXplID0gZGF0YXNpemU7Ci0gIHJlc2hkci5oZWFkZXJfc2l6ZSA9IDI0ICsgZ2V0X2lkX3NpemUgKHR5cGUpICsgZ2V0X2lkX3NpemUgKG5hbWUpOwotCi0gIHJlc19hbGlnbl9maWxlICgpOwotICB3cml0ZV9yZXNfZGF0YSAoJnJlc2hkciwgc2l6ZW9mIChyZXNoZHIpLCAxKTsKLSAgd3JpdGVfcmVzX2lkICh0eXBlKTsKLSAgd3JpdGVfcmVzX2lkIChuYW1lKTsKLQotICByZXNfYWxpZ25fZmlsZSAoKTsKLQotICB3cml0ZV9yZXNfaW5mbyAocmVzaW5mbyk7Ci0gIHJlc19hbGlnbl9maWxlICgpOwotfQotCi0KLS8qIFdyaXRlIGRhdGEgdG8gZmlsZSwgYWJvcnQgb24gZmFpbHVyZSAqLwotc3RhdGljIHZvaWQKLXdyaXRlX3Jlc19kYXRhIChkYXRhLCBzaXplLCBjb3VudCkKLSAgICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaWYgKGZ3cml0ZSAoZGF0YSwgc2l6ZSwgY291bnQsIGZyZXMpICE9IGNvdW50KQotICAgIGZhdGFsICgiJXM6ICVzOiBjb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOwotfQotCi0vKiBSZWFkIGRhdGEgZnJvbSBmaWxlLCBhYm9ydCBvbiBmYWlsdXJlICovCi1zdGF0aWMgdm9pZAotcmVhZF9yZXNfZGF0YSAoZGF0YSwgc2l6ZSwgY291bnQpCi0gICAgIHZvaWQgKmRhdGE7Ci0gICAgIHNpemVfdCBzaXplOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGlmIChmcmVhZCAoZGF0YSwgc2l6ZSwgY291bnQsIGZyZXMpICE9IGNvdW50KQotICAgIGZhdGFsICgiJXM6ICVzOiB1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIiwgcHJvZ3JhbV9uYW1lLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFdyaXRlIGEgcmVzb3VyY2UgaWQgKi8KLXN0YXRpYyB2b2lkCi13cml0ZV9yZXNfaWQgKGlkKQotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZDsKLXsKLSAgaWYgKGlkLT5uYW1lZCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbiA9IGlkLT51Lm4ubGVuZ3RoOwotICAgICAgdW5pY2hhciBudWxsX3Rlcm0gPSAwOwotICAgICAgd3JpdGVfcmVzX2RhdGEgKGlkLT51Lm4ubmFtZSwgbGVuICogc2l6ZW9mICh1bmljaGFyKSwgMSk7Ci0gICAgICB3cml0ZV9yZXNfZGF0YSAoJm51bGxfdGVybSwgc2l6ZW9mIChudWxsX3Rlcm0pLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCBpID0gMHhGRkZGOwotICAgICAgd3JpdGVfcmVzX2RhdGEgKCZpLCBzaXplb2YgKGkpLCAxKTsKLSAgICAgIGkgPSBpZC0+dS5pZDsKLSAgICAgIHdyaXRlX3Jlc19kYXRhICgmaSwgc2l6ZW9mIChpKSwgMSk7Ci0gICAgfQotfQotCi0vKiBXcml0ZSByZXNvdXJjZSBpbmZvICovCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVzX2luZm8gKGluZm8pCi0gICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKmluZm87Ci17Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+dmVyc2lvbiwgc2l6ZW9mIChpbmZvLT52ZXJzaW9uKSwgMSk7Ci0gIHdyaXRlX3Jlc19kYXRhICgmaW5mby0+bWVtZmxhZ3MsIHNpemVvZiAoaW5mby0+bWVtZmxhZ3MpLCAxKTsKLSAgd3JpdGVfcmVzX2RhdGEgKCZpbmZvLT5sYW5ndWFnZSwgc2l6ZW9mIChpbmZvLT5sYW5ndWFnZSksIDEpOwotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPnZlcnNpb24sIHNpemVvZiAoaW5mby0+dmVyc2lvbiksIDEpOwotICB3cml0ZV9yZXNfZGF0YSAoJmluZm8tPmNoYXJhY3RlcmlzdGljcywgc2l6ZW9mIChpbmZvLT5jaGFyYWN0ZXJpc3RpY3MpLCAxKTsKLX0KLQotLyogcmVhZCBhIHJlc291cmNlIGlkZW50aWZpZXIgKi8KLXZvaWQgCi1yZWFkX3Jlc19pZCAoaWQpCi0gICAgIHN0cnVjdCByZXNfaWQgKmlkOwotewotICB1bnNpZ25lZCBzaG9ydCBvcmQ7Ci0gIHVuaWNoYXIgKmlkX3MgPSBOVUxMOwotICBpbnQgbGVuOwotCi0gIHJlYWRfcmVzX2RhdGEgKCZvcmQsIHNpemVvZiAob3JkKSwgMSk7Ci0gIGlmIChvcmQgPT0gMHhGRkZGKQkJLyogYW4gb3JkaW5hbCBpZCAqLwotICAgIHsKLSAgICAgIHJlYWRfcmVzX2RhdGEgKCZvcmQsIHNpemVvZiAob3JkKSwgMSk7Ci0gICAgICBpZC0+bmFtZWQgPSAwOwotICAgICAgaWQtPnUuaWQgPSBvcmQ7Ci0gICAgfQotICBlbHNlCi0gICAgLyogbmFtZWQgaWQgKi8KLSAgICB7Ci0gICAgICBpZiAoZnNlZWsgKGZyZXMsIC1zaXplb2YgKG9yZCksIFNFRUtfQ1VSKSAhPSAwKQotCWZhdGFsICgiJXM6ICVzOiBjb3VsZCBub3Qgc2VlayBpbiBmaWxlIiwgcHJvZ3JhbV9uYW1lLCBmaWxlbmFtZSk7Ci0gICAgICBpZF9zID0gcmVhZF91bmlzdHJpbmcgKCZsZW4pOwotICAgICAgaWQtPm5hbWVkID0gMTsKLSAgICAgIGlkLT51Lm4ubGVuZ3RoID0gbGVuOwotICAgICAgaWQtPnUubi5uYW1lID0gaWRfczsKLSAgICB9Ci19Ci0KLS8qIFJlYWQgYSBudWxsIHRlcm1pbmF0ZWQgVU5JQ09ERSBzdHJpbmcgKi8KLXN0YXRpYyB1bmljaGFyICoKLXJlYWRfdW5pc3RyaW5nIChsZW4pCi0gICAgIGludCAqbGVuOwotewotICB1bmljaGFyICpzOwotICB1bmljaGFyIGM7Ci0gIHVuaWNoYXIgKnA7Ci0gIGludCBsOwotCi0gICpsZW4gPSAwOwotICBsID0gMDsKLQotICAvKiB0aGVyZSBhcmUgaGFyZGx5IGFueSBuYW1lcyBsb25nZXIgdGhhbiAyNTYgY2hhcmFjdGVycyAqLwotICBwID0gcyA9ICh1bmljaGFyICopIHhtYWxsb2MgKHNpemVvZiAodW5pY2hhcikgKiAyNTYpOwotICBkbwotICAgIHsKLSAgICAgIHJlYWRfcmVzX2RhdGEgKCZjLCBzaXplb2YgKGMpLCAxKTsKLSAgICAgICpwKysgPSBjOwotICAgICAgaWYgKGMgIT0gMCkKLQlsKys7Ci0gICAgfQotICB3aGlsZSAoYyAhPSAwKTsKLSAgKmxlbiA9IGw7Ci0gIHJldHVybiBzOwotfQotCi0vKiBhbGlnbiBmaWxlIG9uIERXT1JEIGJvdW5kYXJ5ICovCi1zdGF0aWMgdm9pZAotcmVzX2FsaWduX2ZpbGUgKHZvaWQpCi17Ci0gIGlmIChmc2VlayAoZnJlcywgZnRlbGwgKGZyZXMpICUgNCwgU0VFS19DVVIpICE9IDApCi0gICAgZmF0YWwgKCIlczogJXM6IHVuYWJsZSB0byBhbGlnbiBmaWxlIiwgcHJvZ3JhbV9uYW1lLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIENoZWNrIGlmIGZpbGUgaXMgYSB3aW4zMiBiaW5hcnkgcmVzb3VyY2UgZmlsZSwgaWYgc28KLSAgIHNraXAgcGFzdCB0aGUgbnVsbCByZXNvdXJjZS4gUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIC0xIG9uCi0gICBlcnJvci4KLSAqLwotc3RhdGljIHZvaWQKLXNraXBfbnVsbF9yZXNvdXJjZSAodm9pZCkKLXsKLSAgc3RydWN0IHJlc19oZHIgcmVzaGRyID0KLSAgezAsIDB9OwotICByZWFkX3Jlc19kYXRhICgmcmVzaGRyLCBzaXplb2YgKHJlc2hkciksIDEpOwotICBpZiAoKHJlc2hkci5kYXRhX3NpemUgIT0gMCkgfHwgKHJlc2hkci5oZWFkZXJfc2l6ZSAhPSAweDIwKSkKLSAgICBnb3RvIHNraXBfZXJyOwotCi0gIC8qIFN1YnRyYWN0IHNpemUgb2YgSGVhZGVyU2l6ZSBhbmQgRGF0YVNpemUgKi8KLSAgaWYgKGZzZWVrIChmcmVzLCByZXNoZHIuaGVhZGVyX3NpemUgLSA4LCBTRUVLX0NVUikgIT0gMCkKLSAgICBnb3RvIHNraXBfZXJyOwotCi0gIHJldHVybjsKLQotc2tpcF9lcnI6Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlczogTm90IGEgdmFsaWQgV0lOMzIgcmVzb3VyY2UgZmlsZVxuIiwgcHJvZ3JhbV9uYW1lLAotCSAgIGZpbGVuYW1lKTsKLSAgeGV4aXQgKDEpOwotfQotCi0vKiBBZGQgYSByZXNvdXJjZSB0byByZXNvdXJjZSBkaXJlY3RvcnkgKi8KLXZvaWQKLXJlc19hZGRfcmVzb3VyY2UgKHIsIHR5cGUsIGlkLCBsYW5ndWFnZSwgZHVwb2spCi0gICAgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnI7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKnR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkOwotICAgICBpbnQgbGFuZ3VhZ2U7Ci0gICAgIGludCBkdXBvazsKLXsKLSAgc3RydWN0IHJlc19pZCBhWzNdOwotCi0gIGFbMF0gPSAqdHlwZTsKLSAgYVsxXSA9ICppZDsKLSAgYVsyXS5uYW1lZCA9IDA7Ci0gIGFbMl0udS5pZCA9IGxhbmd1YWdlOwotICByZXNfYXBwZW5kX3Jlc291cmNlICgmcmVzb3VyY2VzLCByLCAzLCBhLCBkdXBvayk7Ci19Ci0KLS8qIEFwcGVuZCBhIHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeS4KLSAgIFRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBkZWZpbmVfcmVzb3VyY2UKLSAgIGFuZCBtb2RpZmllZCB0byBhZGQgYW4gZXhpc3RpbmcgcmVzb3VyY2UuCi0gKi8KLXZvaWQKLXJlc19hcHBlbmRfcmVzb3VyY2UgKHJlc291cmNlcywgcmVzb3VyY2UsIGNpZHMsIGlkcywgZHVwb2spCi0gICAgIHN0cnVjdCByZXNfZGlyZWN0b3J5ICoqcmVzb3VyY2VzOwotICAgICBzdHJ1Y3QgcmVzX3Jlc291cmNlICpyZXNvdXJjZTsKLSAgICAgaW50IGNpZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCByZXNfaWQgKmlkczsKLSAgICAgaW50IGR1cG9rOwotewotICBzdHJ1Y3QgcmVzX2VudHJ5ICpyZSA9IE5VTEw7Ci0gIGludCBpOwotCi0gIGFzc2VydCAoY2lkcyA+IDApOwotICBmb3IgKGkgPSAwOyBpIDwgY2lkczsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCByZXNfZW50cnkgKipwcDsKLQotICAgICAgaWYgKCpyZXNvdXJjZXMgPT0gTlVMTCkKLQl7Ci0JICBzdGF0aWMgdW5zaWduZWQgbG9uZyB0aW1ldmFsOwotCi0JICAvKiBVc2UgdGhlIHNhbWUgdGltZXN0YW1wIGZvciBldmVyeSByZXNvdXJjZSBjcmVhdGVkIGluIGEKLQkgICAgIHNpbmdsZSBydW4uICAqLwotCSAgaWYgKHRpbWV2YWwgPT0gMCkKLQkgICAgdGltZXZhbCA9IHRpbWUgKE5VTEwpOwotCi0JICAqcmVzb3VyY2VzID0gKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKQotCQkJcmVzX2FsbG9jIChzaXplb2YgKipyZXNvdXJjZXMpKTsKLQkgICgqcmVzb3VyY2VzKS0+Y2hhcmFjdGVyaXN0aWNzID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+dGltZSA9IHRpbWV2YWw7Ci0JICAoKnJlc291cmNlcyktPm1ham9yID0gMDsKLQkgICgqcmVzb3VyY2VzKS0+bWlub3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5lbnRyaWVzID0gTlVMTDsKLQl9Ci0KLSAgICAgIGZvciAocHAgPSAmKCpyZXNvdXJjZXMpLT5lbnRyaWVzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JaWYgKHJlc19pZF9jbXAgKCgqcHApLT5pZCwgaWRzW2ldKSA9PSAwKQotCSAgYnJlYWs7Ci0KLSAgICAgIGlmICgqcHAgIT0gTlVMTCkKLQlyZSA9ICpwcDsKLSAgICAgIGVsc2UKLQl7Ci0JICByZSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICopIHJlc19hbGxvYyAoc2l6ZW9mICpyZSk7Ci0JICByZS0+bmV4dCA9IE5VTEw7Ci0JICByZS0+aWQgPSBpZHNbaV07Ci0JICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMTsKLQkgICAgICByZS0+dS5kaXIgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZS0+c3ViZGlyID0gMDsKLQkgICAgICByZS0+dS5yZXMgPSBOVUxMOwotCSAgICB9Ci0KLQkgICpwcCA9IHJlOwotCX0KLQotICAgICAgaWYgKChpICsgMSkgPCBjaWRzKQotCXsKLQkgIGlmICghcmUtPnN1YmRpcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgaSwgaWRzKTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICI6IGV4cGVjdGVkIHRvIGJlIGEgZGlyZWN0b3J5XG4iKTsKLQkgICAgICB4ZXhpdCAoMSk7Ci0JICAgIH0KLQotCSAgcmVzb3VyY2VzID0gJnJlLT51LmRpcjsKLQl9Ci0gICAgfQotCi0gIGlmIChyZS0+c3ViZGlyKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiBleHBlY3RlZCB0byBiZSBhIGxlYWZcbiIpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocmUtPnUucmVzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR1cG9rKQotCXJldHVybjsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHdhcm5pbmc6ICIsIHByb2dyYW1fbmFtZSk7Ci0gICAgICByZXNfaWRzX3ByaW50IChzdGRlcnIsIGNpZHMsIGlkcyk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6IGR1cGxpY2F0ZSB2YWx1ZVxuIik7Ci0gICAgfQotCi0gIHJlLT51LnJlcyA9IHJlc291cmNlOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc2FuaXR5LnNoIGIvYmludXRpbHMvc2FuaXR5LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5NDJjYWJmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Nhbml0eS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMhL2Jpbi9zaAotIyMjIHF1aWNrIHNhbml0eSB0ZXN0IGZvciB0aGUgYmludXRpbHMuCi0jIyMKLSMjIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYW5kIGlzIG1haW50YWluZWQgYnkgSy4gUmljaGFyZCBQaXhsZXksCi0jIyMgcmljaEBjeWdudXMuY29tLgotCi0jIyMgZmFpbCBvbiBlcnJvcnMKLXNldCAtZQotCi0jIyMgZmlyc3QgYXJnIGlzIGRpcmVjdG9yeSBpbiB3aGljaCBiaW5hcmllcyB0byBiZSB0ZXN0ZWQgcmVzaWRlLgotY2FzZSAiJDEiIGluCi0iIikgQklOPS4gOzsKLSopICBCSU49IiQxIiA7OwotZXNhYwotCi0jIyMgc2l6ZQotZm9yIGkgaW4gc2l6ZSBvYmpkdW1wIG5tIGFyIHN0cmlwIHJhbmxpYiA7IGRvCi0JJHtCSU59L3NpemUgJHtCSU59LyRpID4gL2Rldi9udWxsCi1kb25lCi0KLSMjIyBvYmpkdW1wCi1mb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KLQkke0JJTn0vb2JqZHVtcCAtYWhpZmRydHhzbCAke0JJTn0vJGkgPiAvZGV2L251bGwKLWRvbmUKLQotIyMjIG5tCi1mb3IgaSBpbiBzaXplIG9iamR1bXAgbm0gYXIgc3RyaXAgcmFubGliIDsgZG8KLQkke0JJTn0vbm0gJHtCSU59LyRpID4gL2Rldi9udWxsCi1kb25lCi0KLSMjIyBzdHJpcAotVE1QRElSPS4vYmludXRpbHMtJCQKLW1rZGlyICR7VE1QRElSfQotCi1jcCAke0JJTn0vc3RyaXAgJHtUTVBESVJ9L3N0cmlwCi0KLWZvciBpIGluIHNpemUgb2JqZHVtcCBubSBhciByYW5saWIgOyBkbwotCWNwICR7QklOfS8kaSAke1RNUERJUn0vJGkKLQkke0JJTn0vc3RyaXAgJHtUTVBESVJ9LyRpCi0JY3AgJHtCSU59LyRpICR7VE1QRElSfS8kaQotCSR7VE1QRElSfS9zdHJpcCAke1RNUERJUn0vJGkKLWRvbmUKLQotIyMjIGFyCi0KLSMjIyByYW5saWIKLQotcm0gLXJmICR7VE1QRElSfQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NpemUuMSBiL2JpbnV0aWxzL3NpemUuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxOWJkMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zaXplLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHNpemUgMSAiNSBOb3ZlbWJlciAxOTkxIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotc2l6ZSBcLSBsaXN0IHNlY3Rpb24gc2l6ZXMgYW5kIHRvdGFsIHNpemUuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBzaXplCi0uUkIgIltcfCIgXC1BIFx8fFx8IFwtQiBcfHxcfCBcYwotLkJJICJcLVwtZm9ybWF0PSIgY29tcGF0aWJpbGl0eVxjCi1cJlx8XQotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iIAotLlJCICJbXHwiIFwtZCBcfHxcfCBcLW8gXHx8XHwgXC14XGMKLVx8fFx8XGMKLS5CSSAiXC1cLXJhZGl4PSIgbnVtYmVyXGMKLVwmXHxdCi0uUkIgIltcfCIgXGMKLS5CSSAiXC1cLXRhcmdldD0iIGJmZG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiBcLVYgXHx8XHwgXC1cLXZlcnNpb24gIlx8XSIgIAotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1UaGUgR05VIFxjCi0uQiBzaXplXGMKLVwmIHV0aWxpdHkgbGlzdHMgdGhlIHNlY3Rpb24gc2l6ZXNcKGVtXCZhbmQgdGhlIHRvdGFsCi1zaXplXChlbVwmZm9yIGVhY2ggb2YgdGhlIG9iamVjdCBmaWxlcwotLkkgb2JqZmlsZQotaW4gaXRzIGFyZ3VtZW50IGxpc3QuCi1CeSBkZWZhdWx0LCBvbmUgbGluZSBvZiBvdXRwdXQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoIG9iamVjdCBmaWxlIG9yIGVhY2gKLW1vZHVsZSBpbiBhbiBhcmNoaXZlLgotCi0uU0ggT1BUSU9OUwotLlRQCi0uQiBcLUEKLS5UUAotLkIgXC1CCi0uVFAKLS5CSSAiXC1cLWZvcm1hdCAiICJjb21wYXRpYmlsaXR5IgotVXNpbmcgb25lIG9mIHRoZXNlIG9wdGlvbnMsIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgdGhlIG91dHB1dCBmcm9tIEdOVQotXGMKLS5CIHNpemVcYwotXCYgcmVzZW1ibGVzIG91dHB1dCBmcm9tIFN5c3RlbSBWIFxjCi0uQiBzaXplXGMKLVwmICh1c2luZyBgXHxcYwotLkIgXC1BXGMKLVx8JywKLW9yIGBcfFxjCi0uQiBcLVwtZm9ybWF0PXN5c3ZcYwotXHwnKSwgb3IgQmVya2VsZXkgXGMKLS5CIHNpemVcYwotXCYgKHVzaW5nIGBcfFxjCi0uQiBcLUJcYwotXHwnLCBvcgotYFx8XGMKLS5CIFwtXC1mb3JtYXQ9YmVya2VsZXlcYwotXHwnKS4gIFRoZSBkZWZhdWx0IGlzIHRoZSBvbmUtbGluZSBmb3JtYXQgc2ltaWxhciB0bwotQmVya2VsZXkncy4gIAotCi0uVFAKLS5CIFwtXC1oZWxwCi1TaG93IGEgc3VtbWFyeSBvZiBhY2NlcHRhYmxlIGFyZ3VtZW50cyBhbmQgb3B0aW9ucy4KLQotLlRQCi0uQiBcLWQKLS5UUAotLkIgXC1vCi0uVFAKLS5CIFwteAotLlRQCi0uQkkgIlwtXC1yYWRpeCAiICJudW1iZXIiCi1Vc2luZyBvbmUgb2YgdGhlc2Ugb3B0aW9ucywgeW91IGNhbiBjb250cm9sIHdoZXRoZXIgdGhlIHNpemUgb2YgZWFjaAotc2VjdGlvbiBpcyBnaXZlbiBpbiBkZWNpbWFsIChgXHxcYwotLkIgXC1kXGMKLVx8Jywgb3IgYFx8XGMKLS5CIFwtXC1yYWRpeCAxMFxjCi1cfCcpOyBvY3RhbAotKGBcfFxjCi0uQiBcLW9cYwotXHwnLCBvciBgXHxcYwotLkIgXC1cLXJhZGl4IDhcYwotXHwnKTsgb3IgaGV4YWRlY2ltYWwgKGBcfFxjCi0uQiBcLXhcYwotXHwnLCBvcgotYFx8XGMKLS5CIFwtXC1yYWRpeCAxNlxjCi1cfCcpLiAgSW4gYFx8XGMKLS5CIFwtXC1yYWRpeCBcYwotLkkgbnVtYmVyXGMKLVwmXGMKLVx8Jywgb25seSB0aGUgdGhyZWUKLXZhbHVlcyAoOCwgMTAsIDE2KSBhcmUgc3VwcG9ydGVkLiAgVGhlIHRvdGFsIHNpemUgaXMgYWx3YXlzIGdpdmVuIGluIHR3bwotcmFkaWNlczsgZGVjaW1hbCBhbmQgaGV4YWRlY2ltYWwgZm9yIGBcfFxjCi0uQiBcLWRcYwotXHwnIG9yIGBcfFxjCi0uQiBcLXhcYwotXHwnIG91dHB1dCwgb3IKLW9jdGFsIGFuZCBoZXhhZGVjaW1hbCBpZiB5b3UncmUgdXNpbmcgYFx8XGMKLS5CIFwtb1xjCi1cfCcuCi0KLS5UUAotLkJJICJcLVwtdGFyZ2V0ICIgImJmZG5hbWUiCi1Zb3UgY2FuIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIG9iamVjdC1jb2RlIGZvcm1hdCBmb3IgXGMKLS5JIG9iamZpbGVcYwotXCYgYXMKLVxjCi0uSSBiZmRuYW1lXGMKLVwmLiAgVGhpcyBtYXkgbm90IGJlIG5lY2Vzc2FyeTsgXGMKLS5JIHNpemVcYwotXCYgY2FuCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBtYW55IGZvcm1hdHMuICAgU2VlIAotLkJSIG9iamR1bXAgKCAxICkgCi1mb3IgaW5mb3JtYXRpb24KLW9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1EaXNwbGF5IHZlcnNpb24gbnVtYmVyIGluZm9ybWF0aW9uIG9uIFxjCi0uQiBzaXplXGMKLVwmIGl0c2VsZi4KLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBiaW51dGlscyAiXHwnIiAKLWVudHJ5IGluIAotLkJSIGluZm8gOwotLklSICJUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXMiICwKLSBSb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSk7IAotLkJSIGFyICIoIiAxICIpLCIKLS5CUiBvYmpkdW1wICggMSApLgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zaXplLmMgYi9iaW51dGlscy9zaXplLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1N2M3ZWQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc2l6ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLS8qIHNpemUuYyAtLSByZXBvcnQgc2l6ZSBvZiB2YXJpb3VzIHNlY3Rpb25zIG9mIGFuIGV4ZWN1dGFibGUgZmlsZS4KLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIEV4dGVuc2lvbnMvaW5jb21wYXRpYmlsaXRpZXM6Ci0gICBvIC0gQlNEIG91dHB1dCBoYXMgZmlsZW5hbWVzIGF0IHRoZSBlbmQuCi0gICBvIC0gQlNEIG91dHB1dCBjYW4gYXBwZWFyIGluIGRpZmZlcmVudCByYWRpY2llcy4KLSAgIG8gLSBTeXNWIG91dHB1dCBoYXMgbGVzcyByZWR1bmRhbnQgd2hpdGVzcGFjZS4gIEZpbGVuYW1lIGNvbWVzIGF0IGVuZC4KLSAgIG8gLSBTeXNWIG91dHB1dCBkb2Vzbid0IHNob3cgVk1BIHdoaWNoIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgUE1BLgotICAgbyAtIFdlIGFsc28gaGFuZGxlIGNvcmUgZmlsZXMuCi0gICBvIC0gV2UgYWxzbyBoYW5kbGUgYXJjaGl2ZXMuCi0gICBJZiB5b3Ugd3JpdGUgc2hlbGwgc2NyaXB0cyB3aGljaCBtYW5pcHVsYXRlIHRoaXMgaW5mbyB0aGVuIHlvdSBtYXkgYmUKLSAgIG91dCBvZiBsdWNrOyB0aGVyZSdzIG5vIC0tY29tcGF0aWJpbGl0eSBvciAtLXBlZGFudGljIG9wdGlvbi4KLSovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmbmRlZiBCU0RfREVGQVVMVAotI2RlZmluZSBCU0RfREVGQVVMVCAxCi0jZW5kaWYKLQotLyogUHJvZ3JhbSBvcHRpb25zLiAgKi8KLQotZW51bQotICB7Ci0gICAgZGVjaW1hbCwgb2N0YWwsIGhleAotICB9IHJhZGl4ID0gZGVjaW1hbDsKLWludCBiZXJrZWxleV9mb3JtYXQgPSBCU0RfREVGQVVMVDsJLyogMCBtZWFucyB1c2UgQVQmVC1zdHlsZSBvdXRwdXQuICAqLwotaW50IHNob3dfdmVyc2lvbiA9IDA7Ci1pbnQgc2hvd19oZWxwID0gMDsKLQotLyogUHJvZ3JhbSBleGl0IHN0YXR1cy4gICovCi1pbnQgcmV0dXJuX2NvZGUgPSAwOwotCi1zdGF0aWMgY2hhciAqdGFyZ2V0ID0gTlVMTDsKLQotLyogU3RhdGljIGRlY2xhcmF0aW9ucyAqLwotCi1zdGF0aWMgdm9pZCB1c2FnZSBQQVJBTVMgKChGSUxFICosIGludCkpOwotc3RhdGljIHZvaWQgZGlzcGxheV9maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci1zdGF0aWMgdm9pZCBkaXNwbGF5X2JmZCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgZGlzcGxheV9hcmNoaXZlIFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgaW50IHNpemVfbnVtYmVyIFBBUkFNUyAoKGJmZF9zaXplX3R5cGUpKTsKLSNpZiAwCi1zdGF0aWMgdm9pZCBscHJpbnRfbnVtYmVyIFBBUkFNUyAoKGludCwgYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBycHJpbnRfbnVtYmVyIFBBUkFNUyAoKGludCwgYmZkX3NpemVfdHlwZSkpOwotc3RhdGljIHZvaWQgcHJpbnRfYmVya2VsZXlfZm9ybWF0IFBBUkFNUyAoKGJmZCAqKSk7Ci1zdGF0aWMgdm9pZCBzeXN2X2ludGVybmFsX3NpemVyIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHN5c3ZfaW50ZXJuYWxfcHJpbnRlciBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zeXN2X2Zvcm1hdCBQQVJBTVMgKChiZmQgKikpOwotc3RhdGljIHZvaWQgcHJpbnRfc2l6ZXMgUEFSQU1TICgoYmZkICogZmlsZSkpOwotc3RhdGljIHZvaWQgYmVya2VsZXlfc3VtIFBBUkFNUyAoKGJmZCAqLCBzZWNfcHRyLCBQVFIpKTsKLQwKLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1BQmRveFZdIFstLWZvcm1hdD1iZXJrZWxleXxzeXN2XSBbLS1yYWRpeD04fDEwfDE2XVxuXAotICAgICAgIFstLXRhcmdldD1iZmRuYW1lXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSBbZmlsZS4uLl1cbiIpLCBwcm9ncmFtX25hbWUpOwotI2lmIEJTRF9ERUZBVUxUCi0gIGZwdXRzIChfKCJkZWZhdWx0IGlzIC0tZm9ybWF0PWJlcmtlbGV5XG4iKSwgc3RyZWFtKTsKLSNlbHNlCi0gIGZwdXRzIChfKCJkZWZhdWx0IGlzIC0tZm9ybWF0PXN5c3ZcbiIpLCBzdHJlYW0pOwotI2VuZGlmCi0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLXN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAyMDB9LAotICB7InJhZGl4IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMX0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsIDIwMn0sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAmc2hvd192ZXJzaW9uLCAxfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsICZzaG93X2hlbHAsIDF9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IHRlbXA7Ci0gIGludCBjOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gKmFyZ3Y7Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgIkFCVmRveCIsIGxvbmdfb3B0aW9ucywKLQkJCSAgIChpbnQgKikgMCkpICE9IEVPRikKLSAgICBzd2l0Y2ggKGMpCi0gICAgICB7Ci0gICAgICBjYXNlIDIwMDoJCS8qIC0tZm9ybWF0ICovCi0Jc3dpdGNoICgqb3B0YXJnKQotCSAgewotCSAgY2FzZSAnQic6Ci0JICBjYXNlICdiJzoKLQkgICAgYmVya2VsZXlfZm9ybWF0ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdTJzoKLQkgIGNhc2UgJ3MnOgotCSAgICBiZXJrZWxleV9mb3JtYXQgPSAwOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW52YWxpZCBhcmd1bWVudCB0byAtLWZvcm1hdDogJXNcbiIpLCBvcHRhcmcpOwotCSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSAyMDI6CQkvKiAtLXRhcmdldCAqLwotCXRhcmdldCA9IG9wdGFyZzsKLQlicmVhazsKLQotICAgICAgY2FzZSAyMDE6CQkvKiAtLXJhZGl4ICovCi0jaWZkZWYgQU5TSV9MSUJSQVJJRVMKLQl0ZW1wID0gc3RydG9sIChvcHRhcmcsIE5VTEwsIDEwKTsKLSNlbHNlCi0JdGVtcCA9IGF0b2wgKG9wdGFyZyk7Ci0jZW5kaWYKLQlzd2l0Y2ggKHRlbXApCi0JICB7Ci0JICBjYXNlIDEwOgotCSAgICByYWRpeCA9IGRlY2ltYWw7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA4OgotCSAgICByYWRpeCA9IG9jdGFsOwotCSAgICBicmVhazsKLQkgIGNhc2UgMTY6Ci0JICAgIHJhZGl4ID0gaGV4OwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIHByaW50ZiAoXygiSW52YWxpZCByYWRpeDogJXNcbiIpLCBvcHRhcmcpOwotCSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSAnQSc6Ci0JYmVya2VsZXlfZm9ybWF0ID0gMDsKLQlicmVhazsKLSAgICAgIGNhc2UgJ0InOgotCWJlcmtlbGV5X2Zvcm1hdCA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdWJzoKLQlzaG93X3ZlcnNpb24gPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSAnZCc6Ci0JcmFkaXggPSBkZWNpbWFsOwotCWJyZWFrOwotICAgICAgY2FzZSAneCc6Ci0JcmFkaXggPSBoZXg7Ci0JYnJlYWs7Ci0gICAgICBjYXNlICdvJzoKLQlyYWRpeCA9IG9jdGFsOwotCWJyZWFrOwotICAgICAgY2FzZSAwOgotCWJyZWFrOwotICAgICAgY2FzZSAnPyc6Ci0JdXNhZ2UgKHN0ZGVyciwgMSk7Ci0gICAgICB9Ci0KLSAgaWYgKHNob3dfdmVyc2lvbikKLSAgICBwcmludF92ZXJzaW9uICgic2l6ZSIpOwotICBpZiAoc2hvd19oZWxwKQotICAgIHVzYWdlIChzdGRvdXQsIDApOwotCi0gIGlmIChvcHRpbmQgPT0gYXJnYykKLSAgICBkaXNwbGF5X2ZpbGUgKCJhLm91dCIpOwotICBlbHNlCi0gICAgZm9yICg7IG9wdGluZCA8IGFyZ2M7KQotICAgICAgZGlzcGxheV9maWxlIChhcmd2W29wdGluZCsrXSk7Ci0KLSAgcmV0dXJuIHJldHVybl9jb2RlOwotfQotDAotLyogRGlzcGxheSBzdGF0cyBvbiBmaWxlIG9yIGFyY2hpdmUgbWVtYmVyIEFCRkQuICAqLwotCi1zdGF0aWMgdm9pZAotZGlzcGxheV9iZmQgKGFiZmQpCi0gICAgIGJmZCAqYWJmZDsKLXsKLSAgY2hhciAqKm1hdGNoaW5nOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfYXJjaGl2ZSkpCi0gICAgLyogQW4gYXJjaGl2ZSB3aXRoaW4gYW4gYXJjaGl2ZS4gICovCi0gICAgcmV0dXJuOwotCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgcHJpbnRfc2l6ZXMgKGFiZmQpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ZpbGVfYW1iaWd1b3VzbHlfcmVjb2duaXplZCkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLSAgICAgIGxpc3RfbWF0Y2hpbmdfZm9ybWF0cyAobWF0Y2hpbmcpOwotICAgICAgZnJlZSAobWF0Y2hpbmcpOwotICAgICAgcmV0dXJuX2NvZGUgPSAzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzIChhYmZkLCBiZmRfY29yZSwgJm1hdGNoaW5nKSkKLSAgICB7Ci0gICAgICBDT05TVCBjaGFyICpjb3JlX2NtZDsKLQotICAgICAgcHJpbnRfc2l6ZXMgKGFiZmQpOwotICAgICAgZnB1dHMgKCIgKGNvcmUgZmlsZSIsIHN0ZG91dCk7Ci0KLSAgICAgIGNvcmVfY21kID0gYmZkX2NvcmVfZmlsZV9mYWlsaW5nX2NvbW1hbmQgKGFiZmQpOwotICAgICAgaWYgKGNvcmVfY21kKQotCXByaW50ZiAoIiBpbnZva2VkIGFzICVzIiwgY29yZV9jbWQpOwotCi0gICAgICBwdXRzICgiKVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJmZF9ub25mYXRhbCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0gICAgewotICAgICAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0gICAgICBmcmVlIChtYXRjaGluZyk7Ci0gICAgfQotCi0gIHJldHVybl9jb2RlID0gMzsKLX0KLQotc3RhdGljIHZvaWQKLWRpc3BsYXlfYXJjaGl2ZSAoZmlsZSkKLSAgICAgYmZkICpmaWxlOwotewotICBiZmQgKmFyZmlsZSA9IChiZmQgKikgTlVMTDsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0KLSAgICAgIGFyZmlsZSA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGZpbGUsIGFyZmlsZSk7Ci0gICAgICBpZiAoYXJmaWxlID09IE5VTEwpCi0JewotCSAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgIT0gYmZkX2Vycm9yX25vX21vcmVfYXJjaGl2ZWRfZmlsZXMpCi0JICAgIHsKLQkgICAgICBiZmRfbm9uZmF0YWwgKGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLQkgICAgICByZXR1cm5fY29kZSA9IDI7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgZGlzcGxheV9iZmQgKGFyZmlsZSk7Ci0gICAgICAvKiBEb24ndCBjbG9zZSB0aGUgYXJjaGl2ZSBlbGVtZW50czsgd2UgbmVlZCB0aGVtIGZvciBuZXh0X2FyY2hpdmUgKi8KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaXNwbGF5X2ZpbGUgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgYmZkICpmaWxlID0gYmZkX29wZW5yIChmaWxlbmFtZSwgdGFyZ2V0KTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfbm9uZmF0YWwgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybl9jb2RlID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGZpbGUsIGJmZF9hcmNoaXZlKSA9PSB0cnVlKQotICAgIGRpc3BsYXlfYXJjaGl2ZSAoZmlsZSk7Ci0gIGVsc2UKLSAgICBkaXNwbGF5X2JmZCAoZmlsZSk7Ci0KLSAgaWYgKGJmZF9jbG9zZSAoZmlsZSkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlbmFtZSk7Ci0gICAgICByZXR1cm5fY29kZSA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotDAotLyogVGhpcyBpcyB3aGF0IGxleGljYWwgZnVuY3Rpb25zIGFyZSBmb3IuICAqLwotCi1zdGF0aWMgaW50Ci1zaXplX251bWJlciAobnVtKQotICAgICBiZmRfc2l6ZV90eXBlIG51bTsKLXsKLSAgY2hhciBidWZmZXJbNDBdOwotICBzcHJpbnRmIChidWZmZXIsCi0JICAgKHJhZGl4ID09IGRlY2ltYWwgPyAiJWx1IiA6Ci0JICAgKChyYWRpeCA9PSBvY3RhbCkgPyAiMCVsbyIgOiAiMHglbHgiKSksCi0JICAgKHVuc2lnbmVkIGxvbmcpIG51bSk7Ci0KLSAgcmV0dXJuIHN0cmxlbiAoYnVmZmVyKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBub3QgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1scHJpbnRfbnVtYmVyICh3aWR0aCwgbnVtKQotICAgICBpbnQgd2lkdGg7Ci0gICAgIGJmZF9zaXplX3R5cGUgbnVtOwotewotICBjaGFyIGJ1ZmZlcls0MF07Ci0gIHNwcmludGYgKGJ1ZmZlciwKLQkgICAocmFkaXggPT0gZGVjaW1hbCA/ICIlbHUiIDoKLQkgICAoKHJhZGl4ID09IG9jdGFsKSA/ICIwJWxvIiA6ICIweCVseCIpKSwKLQkgICAodW5zaWduZWQgbG9uZykgbnVtKTsKLQotICBwcmludGYgKCIlLSpzIiwgd2lkdGgsIGJ1ZmZlcik7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotcnByaW50X251bWJlciAod2lkdGgsIG51bSkKLSAgICAgaW50IHdpZHRoOwotICAgICBiZmRfc2l6ZV90eXBlIG51bTsKLXsKLSAgY2hhciBidWZmZXJbNDBdOwotICBzcHJpbnRmIChidWZmZXIsCi0JICAgKHJhZGl4ID09IGRlY2ltYWwgPyAiJWx1IiA6Ci0JICAgKChyYWRpeCA9PSBvY3RhbCkgPyAiMCVsbyIgOiAiMHglbHgiKSksCi0JICAgKHVuc2lnbmVkIGxvbmcpIG51bSk7Ci0KLSAgcHJpbnRmICgiJSpzIiwgd2lkdGgsIGJ1ZmZlcik7Ci19Ci0KLXN0YXRpYyBiZmRfc2l6ZV90eXBlIGJzc3NpemU7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBkYXRhc2l6ZTsKLXN0YXRpYyBiZmRfc2l6ZV90eXBlIHRleHRzaXplOwotCi1zdGF0aWMgdm9pZAotYmVya2VsZXlfc3VtIChhYmZkLCBzZWMsIGlnbm9yZSkKLSAgICAgYmZkICphYmZkOwotICAgICBzZWNfcHRyIHNlYzsKLSAgICAgUFRSIGlnbm9yZTsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLSAgaWYgKChmbGFncyAmIFNFQ19BTExPQykgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKTsKLSAgaWYgKChmbGFncyAmIFNFQ19DT0RFKSAhPSAwIHx8IChmbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMCkKLSAgICB0ZXh0c2l6ZSArPSBzaXplOwotICBlbHNlIGlmICgoZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotICAgIGRhdGFzaXplICs9IHNpemU7Ci0gIGVsc2UKLSAgICBic3NzaXplICs9IHNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkIAotcHJpbnRfYmVya2VsZXlfZm9ybWF0IChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIHN0YXRpYyBpbnQgZmlsZXNfc2VlbiA9IDA7Ci0gIGJmZF9zaXplX3R5cGUgdG90YWw7Ci0KLSAgYnNzc2l6ZSA9IDA7Ci0gIGRhdGFzaXplID0gMDsKLSAgdGV4dHNpemUgPSAwOwotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgYmVya2VsZXlfc3VtLCAoUFRSKSBOVUxMKTsKLQotICBpZiAoZmlsZXNfc2VlbisrID09IDApCi0jaWYgMAotICAgIC8qIEludGVsIGRvZXNuJ3QgbGlrZSBic3Mvc3RrIGJlY2F1c2UgdGhleSBkb24ndCBoYXZlIGNvcmUgZmlsZXMuICAqLwotICAgIHB1dHMgKChyYWRpeCA9PSBvY3RhbCkgPyAiICAgdGV4dFx0ICAgZGF0YVx0YnNzL3N0a1x0ICAgIG9jdFx0ICAgIGhleFx0ZmlsZW5hbWUiIDoKLQkgICIgICB0ZXh0XHQgICBkYXRhXHRic3Mvc3RrXHQgICAgZGVjXHQgICAgaGV4XHRmaWxlbmFtZSIpOwotI2Vsc2UKLSAgICBwdXRzICgocmFkaXggPT0gb2N0YWwpID8gIiAgIHRleHRcdCAgIGRhdGFcdCAgICBic3NcdCAgICBvY3RcdCAgICBoZXhcdGZpbGVuYW1lIiA6Ci0JICAiICAgdGV4dFx0ICAgZGF0YVx0ICAgIGJzc1x0ICAgIGRlY1x0ICAgIGhleFx0ZmlsZW5hbWUiKTsKLSNlbmRpZgotCi0gIHRvdGFsID0gdGV4dHNpemUgKyBkYXRhc2l6ZSArIGJzc3NpemU7Ci0KLSAgcnByaW50X251bWJlciAoNywgdGV4dHNpemUpOwotICBwdXRjaGFyICgnXHQnKTsKLSAgcnByaW50X251bWJlciAoNywgZGF0YXNpemUpOwotICBwdXRjaGFyICgnXHQnKTsKLSAgcnByaW50X251bWJlciAoNywgYnNzc2l6ZSk7Ci0gIHByaW50ZiAoKChyYWRpeCA9PSBvY3RhbCkgPyAiXHQlN2xvXHQlN2x4XHQiIDogIlx0JTdsdVx0JTdseFx0IiksCi0JICAodW5zaWduZWQgbG9uZykgdG90YWwsICh1bnNpZ25lZCBsb25nKSB0b3RhbCk7Ci0KLSAgZnB1dHMgKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpLCBzdGRvdXQpOwotICBpZiAoYmZkX215X2FyY2hpdmUgKGFiZmQpKQotICAgIHByaW50ZiAoIiAoZXggJXMpIiwgYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSk7Ci19Ci0KLS8qIEkgUkVBTExZIG1pc3MgbGV4aWNhbCBmdW5jdGlvbnMhICovCi1iZmRfc2l6ZV90eXBlIHN2aV90b3RhbCA9IDA7Ci1iZmRfdm1hIHN2aV9tYXh2bWEgPSAwOwotaW50IHN2aV9uYW1lbGVuID0gMDsKLWludCBzdmlfdm1hbGVuID0gMDsKLWludCBzdmlfc2l6ZWxlbiA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1zeXN2X2ludGVybmFsX3NpemVyIChmaWxlLCBzZWMsIGlnbm9yZSkKLSAgICAgYmZkICpmaWxlOwotICAgICBzZWNfcHRyIHNlYzsKLSAgICAgUFRSIGlnbm9yZTsKLXsKLSAgYmZkX3NpemVfdHlwZSBzaXplID0gYmZkX3NlY3Rpb25fc2l6ZSAoZmlsZSwgc2VjKTsKLSAgaWYgKCFiZmRfaXNfYWJzX3NlY3Rpb24gKHNlYykKLSAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKHNlYykKLSAgICAgICYmICFiZmRfaXNfdW5kX3NlY3Rpb24gKHNlYykpCi0gICAgewotICAgICAgaW50IG5hbWVsZW4gPSBzdHJsZW4gKGJmZF9zZWN0aW9uX25hbWUgKGZpbGUsIHNlYykpOwotICAgICAgaWYgKG5hbWVsZW4gPiBzdmlfbmFtZWxlbikKLQlzdmlfbmFtZWxlbiA9IG5hbWVsZW47Ci0KLSAgICAgIHN2aV90b3RhbCArPSBzaXplOwotICAgICAgaWYgKGJmZF9zZWN0aW9uX3ZtYSAoZmlsZSwgc2VjKSA+IHN2aV9tYXh2bWEpCi0Jc3ZpX21heHZtYSA9IGJmZF9zZWN0aW9uX3ZtYSAoZmlsZSwgc2VjKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zeXN2X2ludGVybmFsX3ByaW50ZXIgKGZpbGUsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmZpbGU7Ci0gICAgIHNlY19wdHIgc2VjOwotICAgICBQVFIgaWdub3JlOwotewotICBiZmRfc2l6ZV90eXBlIHNpemUgPSBiZmRfc2VjdGlvbl9zaXplIChmaWxlLCBzZWMpOwotICBpZiAoIWJmZF9pc19hYnNfc2VjdGlvbiAoc2VjKQotICAgICAgJiYgIWJmZF9pc19jb21fc2VjdGlvbiAoc2VjKQotICAgICAgJiYgIWJmZF9pc191bmRfc2VjdGlvbiAoc2VjKSkKLSAgICB7Ci0gICAgICBzdmlfdG90YWwgKz0gc2l6ZTsKLQotICAgICAgcHJpbnRmICgiJS0qcyAgICIsIHN2aV9uYW1lbGVuLCBiZmRfc2VjdGlvbl9uYW1lIChmaWxlLCBzZWMpKTsKLSAgICAgIHJwcmludF9udW1iZXIgKHN2aV9zaXplbGVuLCBzaXplKTsKLSAgICAgIHByaW50ZiAoIiAgICIpOwotICAgICAgcnByaW50X251bWJlciAoc3ZpX3ZtYWxlbiwgYmZkX3NlY3Rpb25fdm1hIChmaWxlLCBzZWMpKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3lzdl9mb3JtYXQgKGZpbGUpCi0gICAgIGJmZCAqZmlsZTsKLXsKLSAgLyogc2l6ZSBhbGwgb2YgdGhlIGNvbHVtbnMgKi8KLSAgc3ZpX3RvdGFsID0gMDsKLSAgc3ZpX21heHZtYSA9IDA7Ci0gIHN2aV9uYW1lbGVuID0gMDsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChmaWxlLCBzeXN2X2ludGVybmFsX3NpemVyLCAoUFRSKSBOVUxMKTsKLSAgc3ZpX3ZtYWxlbiA9IHNpemVfbnVtYmVyICgoYmZkX3NpemVfdHlwZSlzdmlfbWF4dm1hKTsKLSAgaWYgKChzaXplX3QpIHN2aV92bWFsZW4gPCBzaXplb2YgKCJhZGRyIikgLSAxKQotICAgIHN2aV92bWFsZW4gPSBzaXplb2YgKCJhZGRyIiktMTsKLQotICBzdmlfc2l6ZWxlbiA9IHNpemVfbnVtYmVyIChzdmlfdG90YWwpOwotICBpZiAoKHNpemVfdCkgc3ZpX3NpemVsZW4gPCBzaXplb2YgKCJzaXplIikgLSAxKQotICAgIHN2aV9zaXplbGVuID0gc2l6ZW9mICgic2l6ZSIpLTE7Ci0KLSAgc3ZpX3RvdGFsID0gMDsKLSAgcHJpbnRmICgiJXMgICIsIGJmZF9nZXRfZmlsZW5hbWUgKGZpbGUpKTsKLSAgaWYgKGJmZF9teV9hcmNoaXZlIChmaWxlKSkKLSAgICBwcmludGYgKCIgKGV4ICVzKSIsIGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChmaWxlKSkpOwotCi0gIHByaW50ZiAoIjpcbiUtKnMgICAlKnMgICAlKnNcbiIsIHN2aV9uYW1lbGVuLCAic2VjdGlvbiIsCi0JICBzdmlfc2l6ZWxlbiwgInNpemUiLCBzdmlfdm1hbGVuLCAiYWRkciIpOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGZpbGUsIHN5c3ZfaW50ZXJuYWxfcHJpbnRlciwgKFBUUikgTlVMTCk7Ci0KLSAgcHJpbnRmICgiJS0qcyAgICIsIHN2aV9uYW1lbGVuLCAiVG90YWwiKTsKLSAgcnByaW50X251bWJlciAoc3ZpX3NpemVsZW4sIHN2aV90b3RhbCk7Ci0gIHByaW50ZiAoIlxuXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3NpemVzIChmaWxlKQotICAgICBiZmQgKmZpbGU7Ci17Ci0gIGlmIChiZXJrZWxleV9mb3JtYXQpCi0gICAgcHJpbnRfYmVya2VsZXlfZm9ybWF0IChmaWxlKTsKLSAgZWxzZQotICAgIHByaW50X3N5c3ZfZm9ybWF0IChmaWxlKTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3NyY29udi5jIGIvYmludXRpbHMvc3Jjb252LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMGYyYjcuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3Jjb252LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDM2ICswLDAgQEAKLS8qIHNyY29udi5jIC0tIFN5c3JvZmYgY29udmVyc2lvbiBwcm9ncmFtCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gKHNhY0BjeWdudXMuY29tKQotCi0gICBUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gY29udmVydCBhIGNvZmYgb2JqZWN0IGZpbGUKLSAgIGludG8gYSBIaXRhY2hpIE9NL0xNIChTeXNyb2ZmKSBmb3JtYXQuCi0KLSAgIEFsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkICovCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJzeXNyb2ZmLmgiCi0jaW5jbHVkZSAiY29mZmdyb2suaCIKLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLQotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotCi0jZGVmaW5lIFBST0dSQU1fVkVSU0lPTiAiMS41IgotLyojZGVmaW5lIEZPT1AxIDEgKi8KLQotc3RhdGljIGludCBhZGRyc2l6ZTsKLXN0YXRpYyBjaGFyICp0b29sbmFtZTsKLXN0YXRpYyBjaGFyICoqcm5hbWVzOwotCi1zdGF0aWMgdm9pZCB3cl9jcyAoKTsKLXN0YXRpYyB2b2lkIHdhbGtfdHJlZV9zY29wZSAoKTsKLXN0YXRpYyB2b2lkIHdyX2dsb2JhbHMgKCk7Ci1zdGF0aWMgaW50IGZpbmRfYmFzZSAoKTsKLQotc3RhdGljIEZJTEUgKmZpbGU7Ci1zdGF0aWMgYmZkICphYmZkOwotc3RhdGljIGludCBkZWJ1ZyA9IDA7Ci1zdGF0aWMgaW50IHF1aWNrID0gMDsKLXN0YXRpYyBpbnQgbm9wcmVzY2FuID0gMDsKLXN0YXRpYyBzdHJ1Y3QgY29mZl9vZmlsZSAqdHJlZTsKLS8qIE9ic29sZXRlID8/IAotICAgc3RhdGljIGludCBhYnNvbHV0ZV9wOwotICovCi0KLXN0YXRpYyBpbnQgc2VnbWVudGVkX3A7Ci1zdGF0aWMgaW50IGNvZGU7Ci0KLXN0YXRpYyBpbnQgaWRzMVsyMDAwMF07Ci1zdGF0aWMgaW50IGlkczJbMjAwMDBdOwotCi1zdGF0aWMgaW50IGJhc2UxID0gMHgxODsKLXN0YXRpYyBpbnQgYmFzZTIgPSAweDIwMTg7Ci0KLXN0YXRpYyBpbnQKLWdldF9tZW1iZXJfaWQgKHgpCi0gICAgIGludCB4OwotewotICBpZiAoaWRzMlt4XSkKLSAgICB7Ci0gICAgICByZXR1cm4gaWRzMlt4XTsKLSAgICB9Ci0gIGlkczJbeF0gPSBiYXNlMisrOwotICByZXR1cm4gaWRzMlt4XTsKLX0KLQotc3RhdGljIGludAotZ2V0X29yZGluYXJ5X2lkICh4KQotICAgICBpbnQgeDsKLXsKLSAgaWYgKGlkczFbeF0pCi0gICAgewotICAgICAgcmV0dXJuIGlkczFbeF07Ci0gICAgfQotICBpZHMxW3hdID0gYmFzZTErKzsKLSAgcmV0dXJuIGlkczFbeF07Ci19Ci1zdGF0aWMgY2hhciAqCi1zZWN0aW9uX3RyYW5zbGF0ZSAobikKLSAgICAgY2hhciAqbjsKLXsKLSAgaWYgKHN0cmNtcCAobiwgIi50ZXh0IikgPT0gMCkKLSAgICByZXR1cm4gIlAiOwotICBpZiAoc3RyY21wIChuLCAiLmRhdGEiKSA9PSAwKQotICAgIHJldHVybiAiRCI7Ci0gIGlmIChzdHJjbXAgKG4sICIuYnNzIikgPT0gMCkKLSAgICByZXR1cm4gIkIiOwotICByZXR1cm4gbjsKLX0KLQotCi0KLSNkZWZpbmUgREFURSAiOTQwMjAxMDczMDAwIjsJLyogSnVzdCBhIHRpbWUgb24gbXkgYmlydGhkYXkgKi8KLQotCi1zdGF0aWMKLWNoYXIgKgotc3RyaXBfc3VmZml4IChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgaTsKLSAgY2hhciAqcmVzOwotICBmb3IgKGkgPSAwOyBuYW1lW2ldICE9IDAgJiYgbmFtZVtpXSAhPSAnLic7IGkrKykKLSAgICA7Ci0gIHJlcyA9IChjaGFyICopIHhtYWxsb2MgKGkgKyAxKTsKLSAgbWVtY3B5IChyZXMsIG5hbWUsIGkpOwotICByZXNbaV0gPSAwOwotICByZXR1cm4gcmVzOwotfQotCi0KLS8qIElUIExFTiBzdHVmZiBDUyAqLwotc3RhdGljIHZvaWQKLWNoZWNrc3VtIChmaWxlLCBwdHIsIHNpemUsIGNvZGUpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBjb2RlOwotewotICBpbnQgajsKLSAgaW50IGxhc3Q7Ci0gIGludCBzdW0gPSAwOwotICBpbnQgYnl0ZXMgPSBzaXplIC8gODsKLSAgbGFzdCA9ICEoY29kZSAmIDB4ZmYwMCk7Ci0gIGlmIChzaXplICYgMHg3KQotICAgIGFib3J0ICgpOwotICBwdHJbMF0gPSBjb2RlIHwgKGxhc3QgPyAweDgwIDogMCk7Ci0gIHB0clsxXSA9IGJ5dGVzICsgMTsKLQotICBmb3IgKGogPSAwOyBqIDwgYnl0ZXM7IGorKykKLSAgICB7Ci0gICAgICBzdW0gKz0gcHRyW2pdOwotICAgIH0KLSAgLyogR2x1ZSBvbiBhIGNoZWNrc3VtIHRvbyAqLwotICBwdHJbYnl0ZXNdID0gfnN1bTsKLSAgZndyaXRlIChwdHIsIGJ5dGVzICsgMSwgMSwgZmlsZSk7Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkCi13cml0ZUlOVCAobiwgcHRyLCBpZHgsIHNpemUsIGZpbGUpCi0gICAgIGludCBuOwotICAgICBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLQotICBpZiAoc2l6ZSA9PSAtMikKLSAgICBzaXplID0gYWRkcnNpemU7Ci0gIGVsc2UgaWYgKHNpemUgPT0gLTEpCi0gICAgc2l6ZSA9IDA7Ci0KLSAgaWYgKGJ5dGUgPiAyNDApCi0gICAgewotICAgICAgLyogTGV0cyB3cml0ZSBvdXQgdGhhdCByZWNvcmQgYW5kIGRvIGFub3RoZXIgb25lICovCi0gICAgICBjaGVja3N1bSAoZmlsZSwgcHRyLCAqaWR4LCBjb2RlIHwgMHgxMDAwKTsKLSAgICAgICppZHggPSAxNjsKLSAgICAgIGJ5dGUgPSAqaWR4IC8gODsKLSAgICB9Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgcHRyW2J5dGVdID0gbjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHB0cltieXRlICsgMF0gPSBuID4+IDg7Ci0gICAgICBwdHJbYnl0ZSArIDFdID0gbjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHB0cltieXRlICsgMF0gPSBuID4+IDI0OwotICAgICAgcHRyW2J5dGUgKyAxXSA9IG4gPj4gMTY7Ci0gICAgICBwdHJbYnl0ZSArIDJdID0gbiA+PiA4OwotICAgICAgcHRyW2J5dGUgKyAzXSA9IG4gPj4gMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gICppZHggKz0gc2l6ZSAqIDg7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlQklUUyAodmFsLCBwdHIsIGlkeCwgc2l6ZSkKLSAgICAgaW50IHZhbDsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0gIGludCBiaXQgPSAqaWR4ICUgODsKLSAgaW50IG9sZDsKLSAgKmlkeCArPSBzaXplOwotCi0gIG9sZCA9IHB0cltieXRlXTsKLSAgLyogVHVybiBvZmYgYWxsIGFib3V0IHRvIGNoYW5nZSBiaXRzICovCi0gIG9sZCAmPSB+KCh+MCA+PiAoOCAtIGJpdCAtIHNpemUpKSAmICgoMSA8PCBzaXplKSAtIDEpKTsKLSAgLyogVHVybiBvbiB0aGUgYml0cyB3ZSB3YW50ICovCi0gIG9sZCB8PSAodmFsICYgKCgxIDw8IHNpemUpIC0gMSkpIDw8ICg4IC0gYml0IC0gc2l6ZSk7Ci0gIHB0cltieXRlXSA9IG9sZDsKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlQkFSUkFZIChkYXRhLCBwdHIsIGlkeCwgc2l6ZSwgZmlsZSkKLSAgICAgYmFycmF5IGRhdGE7Ci0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplOwotICAgICBGSUxFICpmaWxlOwotewotICBpbnQgaTsKLSAgd3JpdGVJTlQgKGRhdGEubGVuLCBwdHIsIGlkeCwgMSwgZmlsZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbjsgaSsrKQotICAgIHsKLSAgICAgIHdyaXRlSU5UIChkYXRhLmRhdGFbaV0sIHB0ciwgaWR4LCAxLCBmaWxlKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyaXRlQ0hBUlMgKHN0cmluZywgcHRyLCBpZHgsIHNpemUsIGZpbGUpCi0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IHNpemU7Ci0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGludCBpID0gKmlkeCAvIDg7Ci0KLSAgaWYgKGkgPiAyNDApCi0gICAgewotICAgICAgLyogTGV0cyB3cml0ZSBvdXQgdGhhdCByZWNvcmQgYW5kIGRvIGFub3RoZXIgb25lICovCi0gICAgICBjaGVja3N1bSAoZmlsZSwgcHRyLCAqaWR4LCBjb2RlIHwgMHgxMDAwKTsKLSAgICAgICppZHggPSAxNjsKLSAgICAgIGkgPSAqaWR4IC8gODsKLSAgICB9Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBWYXJpYWJsZSBsZW5ndGggc3RyaW5nICovCi0gICAgICBzaXplID0gc3RybGVuIChzdHJpbmcpOwotICAgICAgcHRyW2krK10gPSBzaXplOwotICAgIH0KLQotICAvKiBCVUcgV0FJVElORyBUTyBIQVBQRU4gKi8KLSAgbWVtY3B5IChwdHIgKyBpLCBzdHJpbmcsIHNpemUpOwotICBpICs9IHNpemU7Ci0gICppZHggPSBpICogODsKLX0KLQotI2RlZmluZSBTWVNST0ZGX1NXQVBfT1VUCi0jaW5jbHVkZSAic3lzcm9mZi5jIgotCi0KLXN0YXRpYyBjaGFyICpybmFtZV9zaFtdID0KLXsKLSAgIlIwIiwgIlIxIiwgIlIyIiwgIlIzIiwgIlI0IiwgIlI1IiwgIlI2IiwgIlI3IiwgIlI4IiwgIlI5IiwgIlIxMCIsICJSMTEiLCAiUjEyIiwgIlIxMyIsICJSMTQiLCAiUjE1IgotfTsKLQotc3RhdGljIGNoYXIgKnJuYW1lX2g4MzAwW10gPQotewotICAiRVIwIiwgIkVSMSIsICJFUjIiLCAiRVIzIiwgIkVSNCIsICJFUjUiLCAiRVI2IiwgIkVSNyIsICJQQyIsICJDQ1IiCi19OwotCi1zdGF0aWMgdm9pZAotd3JfdHIgKCkKLXsKLSAgLyogVGhlIFRSIGJsb2NrIGlzIG5vdCBub3JtYWwgLSBpdCBkb2Vzbid0IGhhdmUgYW55IGNvbnRlbnRzLiAqLwotCi0gIHN0YXRpYyBjaGFyIGJbXSA9IHsKLSAgICAweGZmLAkJCS8qIElUICovCi0gICAgMHgwMywJCQkvKiBSTCAqLwotICAgIDB4ZmQsCQkJLyogQ1MgKi8KLSAgfTsKLSAgZndyaXRlIChiLCAxLCBzaXplb2YgKGIpLCBmaWxlKTsKLX0KLQotc3RhdGljIHZvaWQKLXdyX3VuIChwdHIsIHNmaWxlLCBmaXJzdCwgbnNlY3MpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwdHI7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IGZpcnN0OwotICAgICBpbnQgbnNlY3M7Ci17Ci0gIHN0cnVjdCBJVF91biB1bjsKLQotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnM7Ci0KLSAgdW4uc3BhcmUxID0gMDsKLQotICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKLSAgICB1bi5mb3JtYXQgPSBGT1JNQVRfTE07Ci0gIGVsc2UKLSAgICB1bi5mb3JtYXQgPSBGT1JNQVRfT007Ci0gIHVuLnNwYXJlMSA9IDA7Ci0KLQotI2lmIDEKLSAgdW4ubnNlY3Rpb25zID0gcHRyLT5uc2VjdGlvbnMgLSAxOwkvKiAgRG9uJ3QgY291bnQgdGhlIGFicyBzZWN0aW9uICovCi0jZWxzZQotICAvKk5FVyAtIG9ubHkgY291bnQgc2VjdGlvbnMgd2l0aCBzaXplICovCi0gIHVuLm5zZWN0aW9ucyA9IG5zZWNzOwotI2VuZGlmCi0KLSAgdW4ubmV4dGRlZnMgPSAwOwotICB1bi5uZXh0cmVmcyA9IDA7Ci0gIC8qIENvdW50IGFsbCB0aGUgdW5kZWZpbmVkIGFuZCBkZWZpbmVkIHZhcmlhYmxlcyB3aXRoIGdsb2JhbCBzY29wZSAqLwotCi0gIGlmIChmaXJzdCkKLSAgICB7Ci0gICAgICBmb3IgKHMgPSBwdHItPnN5bWJvbF9saXN0X2hlYWQ7IHM7IHMgPSBzLT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgaWYgKHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfZXh0X2RlZgotCSAgICAgIHx8IHMtPnZpc2libGUtPnR5cGUgPT0gY29mZl92aXNfY29tbW9uKQotCSAgICB1bi5uZXh0ZGVmcysrOwotCi0JICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfcmVmKQotCSAgICB1bi5uZXh0cmVmcysrOwotCX0KLSAgICB9Ci0gIHVuLnRvb2wgPSB0b29sbmFtZTsKLSAgdW4udGNkID0gREFURTsKLSAgdW4ubGlua2VyID0gIkxfR1gwMCI7Ci0gIHVuLmxjZCA9IERBVEU7Ci0gIHVuLm5hbWUgPSBzZmlsZS0+bmFtZTsKLSAgc3lzcm9mZl9zd2FwX3VuX291dCAoZmlsZSwgJnVuKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotd3JfaGQgKHApCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotewotICBzdHJ1Y3QgSVRfaGQgaGQ7Ci0KLSAgaGQuc3BhcmUxID0gMDsKLSAgaWYgKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1ApCi0gICAgewotICAgICAgaGQubXQgPSBNVFlQRV9BQlNfTE07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGQubXQgPSBNVFlQRV9PTVNfT1JfTE1TOwotICAgIH0KLSAgaGQuY2QgPSBEQVRFOwotCi0gIGhkLm51ID0gcC0+bnNvdXJjZXM7CQkvKiBBbHdheXMgb25lIHVuaXQgKi8KLSAgaGQuY29kZSA9IDA7CQkJLyogQWx3YXlzIEFTQ0lJICovCi0gIGhkLnZlciA9ICIwMjAwIjsJCS8qIFZlcnNpb24gMi4wMCAqLwotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoYWJmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfaDgzMDA6Ci0gICAgICBoZC5hdSA9IDg7Ci0gICAgICBoZC5zaSA9IDA7Ci0gICAgICBoZC5zcGNzeiA9IDMyOwotICAgICAgaGQuc2Vnc3ogPSAwOwotICAgICAgaGQuc2Vnc2ggPSAwOwotICAgICAgc3dpdGNoIChiZmRfZ2V0X21hY2ggKGFiZmQpKQotCXsKLQljYXNlIGJmZF9tYWNoX2g4MzAwOgotCSAgaGQuY3B1ID0gIkg4MzAwIjsKLQkgIGhkLmFmbCA9IDI7Ci0JICBhZGRyc2l6ZSA9IDI7Ci0JICB0b29sbmFtZSA9ICJDX0g4LzMwMCI7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2g4MzAwaDoKLQkgIGhkLmNwdSA9ICJIODMwMEgiOwotCSAgaGQuYWZsID0gNDsKLQkgIGFkZHJzaXplID0gNDsKLQkgIHRvb2xuYW1lID0gIkNfSDgvMzAwSCI7Ci0JICBicmVhazsKLQljYXNlIGJmZF9tYWNoX2g4MzAwczoKLQkgIGhkLmNwdSA9ICJIODMwMFMiOwotCSAgaGQuYWZsID0gNDsKLQkgIGFkZHJzaXplID0gNDsKLQkgIHRvb2xuYW1lID0gIkNfSDgvMzAwUyI7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQoKTsKLQl9Ci0gICAgICBybmFtZXMgPSBybmFtZV9oODMwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBoZC5hdSA9IDg7Ci0gICAgICBoZC5zaSA9IDA7Ci0gICAgICBoZC5hZmwgPSA0OwotICAgICAgaGQuc3Bjc3ogPSAzMjsKLSAgICAgIGhkLnNlZ3N6ID0gMDsKLSAgICAgIGhkLnNlZ3NoID0gMDsKLSAgICAgIGhkLmNwdSA9ICJTSCI7Ci0gICAgICBhZGRyc2l6ZSA9IDQ7Ci0gICAgICB0b29sbmFtZSA9ICJDX1NIIjsKLSAgICAgIHJuYW1lcyA9IHJuYW1lX3NoOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoISBiZmRfZ2V0X2ZpbGVfZmxhZ3MoYWJmZCkgJiBFWEVDX1ApCi0gICAgewotICAgICAgaGQuZXAgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGhkLmVwID0gMTsKLSAgICAgIGhkLnVhbiA9IDA7Ci0gICAgICBoZC5zYSA9IDA7Ci0gICAgICBoZC5zYWQgPSAwOwotICAgICAgaGQuYWRkcmVzcyA9IGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCk7Ci0gICAgfQotCi0gIGhkLm9zID0gIiI7Ci0gIGhkLnN5cyA9ICIiOwotICBoZC5tbiA9IHN0cmlwX3N1ZmZpeCAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCi0gIHN5c3JvZmZfc3dhcF9oZF9vdXQgKGZpbGUsICZoZCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdyX3NoIChwLCBzZWMpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7Ci17Ci0gIHN0cnVjdCBJVF9zaCBzaDsKLSAgc2gudW5pdCA9IDA7Ci0gIHNoLnNlY3Rpb24gPSBzZWMtPm51bWJlcjsKLSNpZmRlZiBGT09QMQotICBzaC5zZWN0aW9uID0gMDsKLSNlbmRpZgotICBzeXNyb2ZmX3N3YXBfc2hfb3V0IChmaWxlLCAmc2gpOwotfQotCi0KLXN0YXRpYyB2b2lkCi13cl9vYiAocCwgc2VjdGlvbikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci17Ci0gIGJmZF9zaXplX3R5cGUgaTsKLSAgaW50IGZpcnN0ID0gMTsKLSAgdW5zaWduZWQgY2hhciBzdHVmZlsyMDBdOwotCi0gIGkgPSAwOwotICB3aGlsZSAoaSA8IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUpCi0gICAgewotICAgICAgc3RydWN0IElUX29iIG9iOwotICAgICAgaW50IHRvZG8gPSAyMDA7CQkvKiBDb3B5IGluIDIwMCBieXRlIGx1bXBzICovCi0gICAgICBvYi5zcGFyZSA9IDA7Ci0gICAgICBpZiAoaSArIHRvZG8gPiBzZWN0aW9uLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplKQotCXRvZG8gPSBzZWN0aW9uLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplIC0gaTsKLQotICAgICAgaWYgKGZpcnN0KQotCXsKLQkgIG9iLnNhZiA9IDE7Ci0JICBpZiAoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCkKLQkgICAgb2IuYWRkcmVzcyA9IHNlY3Rpb24tPmFkZHJlc3M7Ci0JICBlbHNlCi0JICAgIG9iLmFkZHJlc3MgPSAwOwotCi0JICBmaXJzdCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9iLnNhZiA9IDA7Ci0JfQotCi0gICAgICBvYi5jcGYgPSAwOwkJLyogTmV2ZXIgY29tcHJlc3MgKi8KLSAgICAgIG9iLmRhdGEubGVuID0gdG9kbzsKLSAgICAgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgc2VjdGlvbi0+YmZkX3NlY3Rpb24sIHN0dWZmLCBpLCB0b2RvKTsKLSAgICAgIG9iLmRhdGEuZGF0YSA9IHN0dWZmOwotICAgICAgc3lzcm9mZl9zd2FwX29iX291dCAoZmlsZSwgJm9iIC8qLCBpICsgdG9kbyA8IHNlY3Rpb24tPnNpemUgKi8gKTsKLSAgICAgIGkgKz0gdG9kbzsKLSAgICB9Ci0gIC8qIE5vdyBmaWxsIHRoZSByZXN0IHdpdGggYmxhbmtzICovCi0gIHdoaWxlIChpIDwgKGJmZF9zaXplX3R5cGUpIHNlY3Rpb24tPnNpemUpCi0gICAgewotICAgICAgc3RydWN0IElUX29iIG9iOwotICAgICAgaW50IHRvZG8gPSAyMDA7CQkvKiBDb3B5IGluIDIwMCBieXRlIGx1bXBzICovCi0gICAgICBvYi5zcGFyZSA9IDA7Ci0gICAgICBpZiAoaSArIHRvZG8gPiAoYmZkX3NpemVfdHlwZSkgc2VjdGlvbi0+c2l6ZSkKLQl0b2RvID0gc2VjdGlvbi0+c2l6ZSAtIGk7Ci0gICAgICBvYi5zYWYgPSAwOwotCi0gICAgICBvYi5jcGYgPSAwOwkJLyogTmV2ZXIgY29tcHJlc3MgKi8KLSAgICAgIG9iLmRhdGEubGVuID0gdG9kbzsKLSAgICAgIG1lbXNldCAoc3R1ZmYsIDAsIHRvZG8pOwotICAgICAgb2IuZGF0YS5kYXRhID0gc3R1ZmY7Ci0gICAgICBzeXNyb2ZmX3N3YXBfb2Jfb3V0IChmaWxlLCAmb2IpOwotICAgICAgaSArPSB0b2RvOwotICAgIH0KLSAgLyogTm93IGZpbGwgdGhlIHJlc3Qgd2l0aCBibGFua3MgKi8KLQotfQotCi1zdGF0aWMgdm9pZAotd3JfcmwgKHB0ciwgc2VjKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7Ci17Ci0gIGludCBuciA9IHNlYy0+bnJlbG9jczsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBjb2ZmX3JlbG9jICpyID0gc2VjLT5yZWxvY3MgKyBpOwotICAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpyZWY7Ci0gICAgICBzdHJ1Y3QgSVRfcmwgcmw7Ci0gICAgICBybC5hcG9sID0gMDsKLSAgICAgIHJsLmJvdW5kYXJ5ID0gMDsKLSAgICAgIHJsLnNlZ21lbnQgPSAxOwotICAgICAgcmwuc2lnbiA9IDA7Ci0gICAgICBybC5jaGVjayA9IDA7Ci0gICAgICBybC5hZGRyID0gci0+b2Zmc2V0OwotICAgICAgcmwuYml0bG9jID0gMDsKLSAgICAgIHJsLmZsZW4gPSAzMjsJCS8qIFNIIFNwZWNpZmljICovCi0gICAgICAvKiBXaGF0IHNvcnQgb2YgcmVsb2MgPyBMb29rIGluIHRoZSBzZWN0aW9uIHRvIGZpbmQgb3V0ICovCi0gICAgICByZWYgPSByLT5zeW1ib2w7Ci0gICAgICBpZiAocmVmLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCi0JewotCSAgcmwuYmNvdW50ID0gNDsJLyogQWx3YXlzIDQgZm9yIHVzICovCi0JICBybC5vcCA9IE9QX0VYVF9SRUY7Ci0JICBybC5zeW1uID0gcmVmLT5lcl9udW1iZXI7Ci0JfQotICAgICAgZWxzZSBpZiAocmVmLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKLQl7Ci0JICBybC5iY291bnQgPSAxMTsJLyogQWx3YXlzIDExIGZvciB1cyAqLwotCSAgcmwub3AgPSBPUF9TRUNfUkVGOwotCSAgcmwuc2VjbiA9IHJlZi0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkgIHJsLmNvcGNvZGVfaXNfMyA9IDM7Ci0JICBybC5hbGVuZ3RoX2lzXzQgPSA0OwotCSAgcmwuYWRkZW5kID0gcmVmLT53aGVyZS0+b2Zmc2V0IC0gcmVmLT53aGVyZS0+c2VjdGlvbi0+YWRkcmVzczsKLQkgIHJsLmFvcGNvZGVfaXNfMHgyMCA9IDB4MjA7Ci0JfQotCi0gICAgICBlbHNlCi0JewotCSAgcmwuYmNvdW50ID0gMTE7CS8qIEFsd2F5cyAxMSBmb3IgdXMgKi8KLQkgIHJsLm9wID0gT1BfU0VDX1JFRjsKLQkgIHJsLnNlY24gPSByZWYtPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0JICBybC5jb3Bjb2RlX2lzXzMgPSAzOwotCSAgcmwuYWxlbmd0aF9pc180ID0gNDsKLQkgIHJsLmFkZGVuZCA9IC1yZWYtPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzOwotCSAgcmwuYW9wY29kZV9pc18weDIwID0gMHgyMDsKLQl9Ci0gICAgICBybC5lbmQgPSAweGZmOwotICAgICAgaWYgKHJsLm9wID09IE9QX1NFQ19SRUYKLQkgIHx8IHJsLm9wID09IE9QX0VYVF9SRUYpCi0JewotCSAgc3lzcm9mZl9zd2FwX3JsX291dCAoZmlsZSwgJnJsKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3Jfb2JqZWN0X2JvZHkgKHApCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotewotICBpbnQgaTsKLSAgZm9yIChpID0gMTsgaSA8IHAtPm5zZWN0aW9uczsgaSsrKQotICAgIHsKLSAgICAgIHdyX3NoIChwLCBwLT5zZWN0aW9ucyArIGkpOwotICAgICAgd3Jfb2IgKHAsIHAtPnNlY3Rpb25zICsgaSk7Ci0gICAgICB3cl9ybCAocCwgcC0+c2VjdGlvbnMgKyBpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9kcHNfc3RhcnQgKHNmaWxlLCBzZWN0aW9uLCBzY29wZSwgdHlwZSwgbmVzdCkKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zY29wZSAqc2NvcGU7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgbmVzdDsKLXsKLSAgc3RydWN0IElUX2RwcyBkcHM7Ci0gIGRwcy5lbmQgPSAwOwotICBkcHMub3B0ID0gMDsKLSAgZHBzLnR5cGUgPSB0eXBlOwotICBpZiAoc2NvcGUtPnNlYykKLSAgICB7Ci0gICAgICBkcHMuc2FuID0gc2NvcGUtPnNlYy0+bnVtYmVyOwotICAgICAgZHBzLmFkZHJlc3MgPSBzY29wZS0+b2Zmc2V0IC0gZmluZF9iYXNlIChzZmlsZSwgc2NvcGUtPnNlYyk7Ci0gICAgICBkcHMuYmxvY2tfc2l6ZSA9IHNjb3BlLT5zaXplOwotICAgICAgaWYgKGRlYnVnKQotCXsKLQkgIHByaW50ZiAoIkRQUyAlcyAlZCAleFxuIiwKLQkJICBzZmlsZS0+bmFtZSwKLQkJICBuZXN0LAotCQkgIGRwcy5hZGRyZXNzKTsKLQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkcHMuc2FuID0gMDsKLSAgICAgIGRwcy5hZGRyZXNzID0gMDsKLSAgICAgIGRwcy5ibG9ja19zaXplID0gMDsKLSAgICB9Ci0KLSAgZHBzLm5lc3RpbmcgPSBuZXN0OwotICBkcHMubmVnID0gMHgxMDAxOwotICBzeXNyb2ZmX3N3YXBfZHBzX291dCAoZmlsZSwgJmRwcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9kcHNfZW5kIChzZWN0aW9uLCBzY29wZSwgdHlwZSkKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGNvZmZfc2NvcGUgKnNjb3BlOwotICAgICBpbnQgdHlwZTsKLXsKLSAgc3RydWN0IElUX2RwcyBkcHM7Ci0gIGRwcy5lbmQgPSAxOwotICBkcHMudHlwZSA9IHR5cGU7Ci0gIHN5c3JvZmZfc3dhcF9kcHNfb3V0IChmaWxlLCAmZHBzKTsKLX0KLQotc3RhdGljIGludCAqCi1uaW50cyAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHJldHVybiAoaW50ICopICh4Y2FsbG9jIChzaXplb2YgKGludCksIHgpKTsKLX0KLQotc3RhdGljIHZvaWQgd2Fsa190cmVlX3N5bWJvbCAoKTsKLXN0YXRpYyB2b2lkCi13YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KQotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICAgICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOwotICAgICBpbnQgbmVzdDsKLXsKLSAgc3dpdGNoICh0eXBlLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfc2VjZGVmX3R5cGU6Ci0gICAgY2FzZSBjb2ZmX2Jhc2ljX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0KLQlzd2l0Y2ggKHR5cGUtPnUuYmFzaWMpCi0JICB7Ci0JICBjYXNlIFRfTlVMTDoKLQkgIGNhc2UgVF9WT0lEOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9WT0lEOwotCSAgICBkYnQuc2lnbiA9IEJUWVBFX1VOU1BFQzsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9DSEFSOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9DSEFSOwotCSAgICBkYnQuc2lnbiA9IEJUWVBFX1VOU1BFQzsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9TSE9SVDoKLQkgIGNhc2UgVF9JTlQ6Ci0JICBjYXNlIFRfTE9ORzoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfSU5UOwotCSAgICBkYnQuc2lnbiA9IFNJR05fU0lHTkVEOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX0ZMT0FUOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9GTE9BVDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9TSU5HTEU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX0RPVUJMRToKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfRkxPQVQ7Ci0JICAgIGRidC5mcHR5cGUgPSBGUFRZUEVfRE9VQkxFOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9MTkdEQkw6Ci0JICAgIGRidC5idHlwZSA9IEJUWVBFX0ZMT0FUOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX0VYVEVOREVEOwotCSAgICBicmVhazsKLQkgIGNhc2UgVF9VQ0hBUjoKLQkgICAgZGJ0LmJ0eXBlID0gQlRZUEVfQ0hBUjsKLQkgICAgZGJ0LnNpZ24gPSBTSUdOX1VOU0lHTkVEOwotCSAgICBkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBUX1VTSE9SVDoKLQkgIGNhc2UgVF9VSU5UOgotCSAgY2FzZSBUX1VMT05HOgotCSAgICBkYnQuYnR5cGUgPSBCVFlQRV9JTlQ7Ci0JICAgIGRidC5zaWduID0gU0lHTl9VTlNJR05FRDsKLQkgICAgZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCSAgICBicmVhazsKLQkgIH0KLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHB0IGRwdDsKLQl3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLT51LnBvaW50ZXIucG9pbnRzX3RvLCBuZXN0ICsgMSk7Ci0JZHB0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZHB0X291dCAoZmlsZSwgJmRwdCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIGNvZmZfZnVuY3Rpb25fdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGZwIGRmcDsKLQlzdHJ1Y3QgY29mZl9zeW1ib2wgKnBhcmFtOwotCWRmcC5lbmQgPSAwOwotCWRmcC5zcGFyZSA9IDA7Ci0JZGZwLm5wYXJhbXMgPSB0eXBlLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMtPm52YXJzOwotCWRmcC5uZWcgPSAweDEwMDE7Ci0KLQl3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLT51LmZ1bmN0aW9uLmZ1bmN0aW9uX3JldHVybnMsIG5lc3QgKyAxKTsKLQotCXN5c3JvZmZfc3dhcF9kZnBfb3V0IChmaWxlLCAmZGZwKTsKLQotCWZvciAocGFyYW0gPSB0eXBlLT51LmZ1bmN0aW9uLnBhcmFtZXRlcnMtPnZhcnNfaGVhZDsKLQkgICAgIHBhcmFtOwotCSAgICAgcGFyYW0gPSBwYXJhbS0+bmV4dCkKLQkgIHsKLQkgICAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIDAsIHBhcmFtLCBuZXN0KTsKLQkgIH0KLQlkZnAuZW5kID0gMTsKLQlzeXNyb2ZmX3N3YXBfZGZwX291dCAoZmlsZSwgJmRmcCk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlIGNvZmZfc3RydWN0ZGVmX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0Jc3RydWN0IElUX2RkcyBkZHM7Ci0Jc3RydWN0IGNvZmZfc3ltYm9sICptZW1iZXI7Ci0JZGRzLnNwYXJlID0gMDsKLQlkYnQuYnR5cGUgPSBCVFlQRV9TVFJVQ1Q7Ci0JZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOwotCWRidC5zaWduID0gU0lHTl9VTlNQRUM7Ci0JZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCWRidC5zaWQgPSBnZXRfbWVtYmVyX2lkICh0eXBlLT51LmFzdHJ1Y3RkZWYuaWR4KTsKLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLQlkZHMuZW5kID0gMDsKLQlkZHMubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kZHNfb3V0IChmaWxlLCAmZGRzKTsKLQlmb3IgKG1lbWJlciA9IHR5cGUtPnUuYXN0cnVjdGRlZi5lbGVtZW50cy0+dmFyc19oZWFkOwotCSAgICAgbWVtYmVyOwotCSAgICAgbWVtYmVyID0gbWVtYmVyLT5uZXh0KQotCSAgewotCSAgICB3YWxrX3RyZWVfc3ltYm9sIChzZmlsZSwgMCwgbWVtYmVyLCBuZXN0ICsgMSk7Ci0JICB9Ci0KLQlkZHMuZW5kID0gMTsKLQlzeXNyb2ZmX3N3YXBfZGRzX291dCAoZmlsZSwgJmRkcyk7Ci0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zdHJ1Y3RyZWZfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGJ0IGRidDsKLQlkYnQuYnR5cGUgPSBCVFlQRV9UQUc7Ci0JZGJ0LmJpdHNpemUgPSB0eXBlLT5zaXplOwotCWRidC5zaWduID0gU0lHTl9VTlNQRUM7Ci0JZGJ0LmZwdHlwZSA9IEZQVFlQRV9OT1RTUEVDOwotCWlmICh0eXBlLT51LmFzdHJ1Y3RyZWYucmVmKQotCSAgewotCSAgICBkYnQuc2lkID0gZ2V0X21lbWJlcl9pZCAodHlwZS0+dS5hc3RydWN0cmVmLnJlZi0+bnVtYmVyKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGRidC5zaWQgPSAwOwotCSAgfQotCi0JZGJ0Lm5lZyA9IDB4MTAwMTsKLQlzeXNyb2ZmX3N3YXBfZGJ0X291dCAoZmlsZSwgJmRidCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGFyIGRhcjsKLQlpbnQgajsKLQlpbnQgZGltcyA9IDE7CQkvKiBPbmx5IG91dHB1dCBvbmUgZGltZW5zaW9uIGF0IGEgdGltZSAqLwotCWRhci5kaW1zID0gZGltczsKLQlkYXIudmFyaWFibGUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLnN1YnR5cGUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLnNwYXJlID0gbmludHMgKGRpbXMpOwotCWRhci5tYXhfdmFyaWFibGUgPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1heHNwYXJlID0gbmludHMgKGRpbXMpOwotCWRhci5tYXggPSBuaW50cyAoZGltcyk7Ci0JZGFyLm1pbl92YXJpYWJsZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIubWluID0gbmludHMgKGRpbXMpOwotCWRhci5taW5zcGFyZSA9IG5pbnRzIChkaW1zKTsKLQlkYXIubmVnID0gMHgxMDAxOwotCWRhci5sZW5ndGggPSB0eXBlLT5zaXplIC8gdHlwZS0+dS5hcnJheS5kaW07Ci0JZm9yIChqID0gMDsgaiA8IGRpbXM7IGorKykKLQkgIHsKLQkgICAgZGFyLnZhcmlhYmxlW2pdID0gVkFSSUFCTEVfRklYRUQ7Ci0JICAgIGRhci5zdWJ0eXBlW2pdID0gU1VCX0lOVEVHRVI7Ci0JICAgIGRhci5zcGFyZVtqXSA9IDA7Ci0JICAgIGRhci5tYXhfdmFyaWFibGVbal0gPSAwOwotCSAgICBkYXIubWF4W2pdID0gdHlwZS0+dS5hcnJheS5kaW07Ci0JICAgIGRhci5taW5fdmFyaWFibGVbal0gPSAwOwotCSAgICBkYXIubWluW2pdID0gMTsJLyogV2h5IGlzbid0IHRoaXMgMCA/ICovCi0JICB9Ci0Jd2Fsa190cmVlX3R5cGVfMSAoc2ZpbGUsIHN5bWJvbCwgdHlwZS0+dS5hcnJheS5hcnJheV9vZiwgbmVzdCArIDEpOwotCXN5c3JvZmZfc3dhcF9kYXJfb3V0IChmaWxlLCAmZGFyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtZGVmX3R5cGU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RidCBkYnQ7Ci0Jc3RydWN0IElUX2RlbiBkZW47Ci0Jc3RydWN0IGNvZmZfc3ltYm9sICptZW1iZXI7Ci0JZGJ0LmJ0eXBlID0gQlRZUEVfRU5VTTsKLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKLQlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYWVudW1kZWYuaWR4KTsKLQlkYnQubmVnID0gMHgxMDAxOwotCXN5c3JvZmZfc3dhcF9kYnRfb3V0IChmaWxlLCAmZGJ0KTsKLQotCWRlbi5lbmQgPSAwOwotCWRlbi5uZWcgPSAweDEwMDE7Ci0JZGVuLnNwYXJlID0gMDsKLQlzeXNyb2ZmX3N3YXBfZGVuX291dCAoZmlsZSwgJmRlbik7Ci0JZm9yIChtZW1iZXIgPSB0eXBlLT51LmFlbnVtZGVmLmVsZW1lbnRzLT52YXJzX2hlYWQ7Ci0JICAgICBtZW1iZXI7Ci0JICAgICBtZW1iZXIgPSBtZW1iZXItPm5leHQpCi0JICB7Ci0JICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBtZW1iZXIsIG5lc3QgKyAxKTsKLQkgIH0KLQotCWRlbi5lbmQgPSAxOwotCXN5c3JvZmZfc3dhcF9kZW5fb3V0IChmaWxlLCAmZGVuKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfZW51bXJlZl90eXBlOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZGJ0OwotCWRidC5idHlwZSA9IEJUWVBFX1RBRzsKLQlkYnQuYml0c2l6ZSA9IHR5cGUtPnNpemU7Ci0JZGJ0LnNpZ24gPSBTSUdOX1VOU1BFQzsKLQlkYnQuZnB0eXBlID0gRlBUWVBFX05PVFNQRUM7Ci0JZGJ0LnNpZCA9IGdldF9tZW1iZXJfaWQgKHR5cGUtPnUuYWVudW1yZWYucmVmLT5udW1iZXIpOwotCWRidC5uZWcgPSAweDEwMDE7Ci0Jc3lzcm9mZl9zd2FwX2RidF9vdXQgKGZpbGUsICZkYnQpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogT2Jzb2xldGUgPyAKLSAgIHN0YXRpYyB2b2lkCi0gICBkdHlfc3RhcnQgKCkKLSAgIHsKLSAgIHN0cnVjdCBJVF9kdHkgZHR5OwotICAgZHR5LmVuZCA9IDA7Ci0gICBkdHkubmVnID0gMHgxMDAxOwotICAgZHR5LnNwYXJlID0gMDsKLSAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLSAgIH0KLQotICAgc3RhdGljIHZvaWQKLSAgIGR0eV9zdG9wICgpCi0gICB7Ci0gICBzdHJ1Y3QgSVRfZHR5IGR0eTsKLSAgIGR0eS5lbmQgPSAwOwotICAgZHR5Lm5lZyA9IDB4MTAwMTsKLSAgIGR0eS5lbmQgPSAxOwotICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgfQotCi0KLSAgIHN0YXRpYyB2b2lkCi0gICBkdW1wX3RyZWVfc3RydWN0dXJlIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KQotICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICBzdHJ1Y3QgY29mZl90eXBlICp0eXBlOwotICAgaW50IG5lc3Q7Ci0gICB7Ci0gICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLSAgIHsKLQotCi0gICB9Ci0KLSAgIH0KLSAqLwotCi1zdGF0aWMgdm9pZAotd2Fsa190cmVlX3R5cGUgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpCi0KLSAgICAgc3RydWN0Ci0gICAgIGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgICAgc3RydWN0IGNvZmZfdHlwZSAqdHlwZTsKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIGlmIChzeW1ib2wtPnR5cGUtPnR5cGUgPT0gY29mZl9mdW5jdGlvbl90eXBlKQotICAgIHsKLQotICAgICAgc3RydWN0IElUX2R0eSBkdHk7Ci0gICAgICBkdHkuZW5kID0gMDsKLSAgICAgIGR0eS5uZWcgPSAweDEwMDE7Ci0KLSAgICAgIHN5c3JvZmZfc3dhcF9kdHlfb3V0IChmaWxlLCAmZHR5KTsKLSAgICAgIHdhbGtfdHJlZV90eXBlXzEgKHNmaWxlLCBzeW1ib2wsIHR5cGUsIG5lc3QpOwotICAgICAgZHR5LmVuZCA9IDE7Ci0gICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0KLSAgICAgIHdyX2Rwc19zdGFydCAoc2ZpbGUsCi0JCSAgICBzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAotCQkgICAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsCi0JCSAgICBCTE9DS19UWVBFX0ZVTkNUSU9OLCBuZXN0KTsKLSAgICAgIHdyX2Rwc19zdGFydCAoc2ZpbGUsIHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKLQkJICAgIEJMT0NLX1RZUEVfQkxPQ0ssIG5lc3QpOwotICAgICAgd2Fsa190cmVlX3Njb3BlIChzeW1ib2wtPndoZXJlLT5zZWN0aW9uLAotCQkgICAgICAgc2ZpbGUsCi0JCSAgICAgICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKLQkJICAgICAgIG5lc3QgKyAxLCBCTE9DS19UWVBFX0JMT0NLKTsKLQotICAgICAgd3JfZHBzX2VuZCAoc3ltYm9sLT53aGVyZS0+c2VjdGlvbiwKLQkJICBzeW1ib2wtPnR5cGUtPnUuZnVuY3Rpb24uY29kZSwKLQkJICBCTE9DS19UWVBFX0JMT0NLKTsKLSAgICAgIHdyX2Rwc19lbmQgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24sCi0JCSAgc3ltYm9sLT50eXBlLT51LmZ1bmN0aW9uLmNvZGUsIEJMT0NLX1RZUEVfRlVOQ1RJT04pOwotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IElUX2R0eSBkdHk7Ci0gICAgICBkdHkuZW5kID0gMDsKLSAgICAgIGR0eS5uZWcgPSAweDEwMDE7Ci0gICAgICBzeXNyb2ZmX3N3YXBfZHR5X291dCAoZmlsZSwgJmR0eSk7Ci0gICAgICB3YWxrX3RyZWVfdHlwZV8xIChzZmlsZSwgc3ltYm9sLCB0eXBlLCBuZXN0KTsKLSAgICAgIGR0eS5lbmQgPSAxOwotICAgICAgc3lzcm9mZl9zd2FwX2R0eV9vdXQgKGZpbGUsICZkdHkpOwotICAgIH0KLQotfQotCi0KLQotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCBzZWN0aW9uLCBzeW1ib2wsIG5lc3QpCi0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgc3RydWN0IGNvZmZfc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeW1ib2w7Ci0gICAgIGludCBuZXN0OwotewotICBzdHJ1Y3QgSVRfZHN5IGRzeTsKLQotICBtZW1zZXQoJmRzeSwgMCwgc2l6ZW9mKGRzeSkpOwotICBkc3kubmVzdGluZyA9IG5lc3Q7Ci0KLSAgc3dpdGNoIChzeW1ib2wtPnR5cGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl9mdW5jdGlvbl90eXBlOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9GVU5DOwotICAgICAgZHN5LmFzc2lnbiA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfc3RydWN0cmVmX3R5cGU6Ci0gICAgY2FzZSBjb2ZmX3BvaW50ZXJfdHlwZToKLSAgICBjYXNlIGNvZmZfYXJyYXlfdHlwZToKLSAgICBjYXNlIGNvZmZfYmFzaWNfdHlwZToKLSAgICBjYXNlIGNvZmZfZW51bXJlZl90eXBlOgotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9WQVI7Ci0gICAgICBkc3kuYXNzaWduID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9lbnVtZGVmX3R5cGU6Ci0gICAgICBkc3kudHlwZSA9IFNUWVBFX1RBRzsKLSAgICAgIGRzeS5hc3NpZ24gPSAwOwotICAgICAgZHN5Lm1hZ2ljID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl9zdHJ1Y3RkZWZfdHlwZToKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfVEFHOwotICAgICAgZHN5LmFzc2lnbiA9IDA7Ci0gICAgICBkc3kubWFnaWMgPSBzeW1ib2wtPnR5cGUtPnUuYXN0cnVjdGRlZi5pc3N0cnVjdCA/IDAgOiAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3NlY2RlZl90eXBlOgotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdCkKLSAgICB7Ci0gICAgICBkc3kuYXNzaWduID0gMDsKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfTUVNQkVSOwotICAgIH0KLSAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfbWVtYmVyX29mX2VudW0pCi0gICAgewotICAgICAgZHN5LnR5cGUgPSBTVFlQRV9FTlVNOwotICAgICAgZHN5LmFzc2lnbiA9IDA7Ci0gICAgICBkc3kuZXZhbGxlbiA9IDQ7Ci0gICAgICBkc3kuZXZhbHVlID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OwotICAgIH0KLQotICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc3RydWN0ZGVmX3R5cGUKLSAgICAgIHx8IHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfZW50YWcKLSAgICAgIHx8IHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfc3RydGFnKQotICAgIHsKLSAgICAgIGRzeS5zbnVtYmVyID0gZ2V0X21lbWJlcl9pZCAoc3ltYm9sLT5udW1iZXIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRzeS5zbnVtYmVyID0gZ2V0X29yZGluYXJ5X2lkIChzeW1ib2wtPm51bWJlcik7Ci0gICAgfQotCi0KLSAgZHN5LnNuYW1lID0gc3ltYm9sLT5uYW1lWzBdID09ICdfJyA/IHN5bWJvbC0+bmFtZSArIDEgOiBzeW1ib2wtPm5hbWU7Ci0KLSAgc3dpdGNoIChzeW1ib2wtPnZpc2libGUtPnR5cGUpCi0gICAgewotICAgIGNhc2UgY29mZl92aXNfY29tbW9uOgotICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKLSAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1NUQVRJQ19FWFRfREVGOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19leHRfcmVmOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fU1RBVElDX0VYVF9SRUY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6Ci0gICAgICBkc3kuYWluZm8gPSBBSU5GT19TVEFUSUNfSU5UOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc19hdXRvOgotICAgIGNhc2UgY29mZl92aXNfYXV0b3BhcmFtOgotICAgICAgZHN5LmFpbmZvID0gQUlORk9fQVVUTzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl92aXNfcmVnaXN0ZXI6Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKLSAgICAgIGRzeS5haW5mbyA9IEFJTkZPX1JFRzsKLSAgICAgIGJyZWFrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3Zpc190YWc6Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2Zfc3RydWN0OgotICAgIGNhc2UgY29mZl92aXNfbWVtYmVyX29mX2VudW06Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGRzeS5kbGVuZ3RoID0gc3ltYm9sLT50eXBlLT5zaXplOwotICBzd2l0Y2ggKHN5bWJvbC0+d2hlcmUtPndoZXJlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtb3J5OgotCi0gICAgICBkc3kuc2VjdGlvbiA9IHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLSNpZmRlZiBGT09QCi0gICAgICBkc3kuc2VjdGlvbiA9IDA7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2Zfc3RydWN0OgotICAgIGNhc2UgY29mZl93aGVyZV9tZW1iZXJfb2ZfZW51bToKLSAgICBjYXNlIGNvZmZfd2hlcmVfc3RhY2s6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3JlZ2lzdGVyOgotICAgIGNhc2UgY29mZl93aGVyZV91bmtub3duOgotICAgIGNhc2UgY29mZl93aGVyZV9zdHJ0YWc6Ci0KLSAgICBjYXNlIGNvZmZfd2hlcmVfZW50YWc6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3R5cGVkZWY6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHN3aXRjaCAoc3ltYm9sLT53aGVyZS0+d2hlcmUpCi0gICAgewotICAgIGNhc2UgY29mZl93aGVyZV9tZW1vcnk6Ci0gICAgICBkc3kuYWRkcmVzcyA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldCAtIGZpbmRfYmFzZSAoc2ZpbGUsIHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0YWNrOgotICAgICAgZHN5LmFkZHJlc3MgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfbWVtYmVyX29mX3N0cnVjdDoKLQotCi0gICAgICBpZiAoc3ltYm9sLT53aGVyZS0+Yml0c2l6ZSkKLQl7Ci0JICBpbnQgYml0cyA9IChzeW1ib2wtPndoZXJlLT5vZmZzZXQgKiA4ICsgc3ltYm9sLT53aGVyZS0+Yml0b2Zmc2V0KTsKLQkgIGRzeS5iaXR1bml0ID0gMTsKLQkgIGRzeS5maWVsZF9sZW4gPSBzeW1ib2wtPndoZXJlLT5iaXRzaXplOwotCSAgZHN5LmZpZWxkX29mZiA9IChiaXRzIC8gMzIpICogNDsKLQkgIGRzeS5maWVsZF9iaXRvZmYgPSBiaXRzICUgMzI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRzeS5iaXR1bml0ID0gMDsKLQotCSAgZHN5LmZpZWxkX2xlbiA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKLQkgIGRzeS5maWVsZF9vZmYgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBjb2ZmX3doZXJlX21lbWJlcl9vZl9lbnVtOgotICAgICAgLyogICAgICBkc3kuYml0dW5pdCA9IDA7Ci0gICAgICAgICBkc3kuZmllbGRfbGVuICA9IHN5bWJvbC0+dHlwZS0+c2l6ZTsKLSAgICAgICAgIGRzeS5maWVsZF9vZmYgPSBzeW1ib2wtPndoZXJlLT5vZmZzZXQ7ICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIGNvZmZfd2hlcmVfcmVnaXN0ZXI6Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3Vua25vd246Ci0gICAgY2FzZSBjb2ZmX3doZXJlX3N0cnRhZzoKLQotICAgIGNhc2UgY29mZl93aGVyZV9lbnRhZzoKLSAgICBjYXNlIGNvZmZfd2hlcmVfdHlwZWRlZjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbC0+d2hlcmUtPndoZXJlID09IGNvZmZfd2hlcmVfcmVnaXN0ZXIpCi0gICAgZHN5LnJlZyA9IHJuYW1lc1tzeW1ib2wtPndoZXJlLT5vZmZzZXRdOwotCi0gIHN3aXRjaCAoc3ltYm9sLT52aXNpYmxlLT50eXBlKQotICAgIHsKLSAgICBjYXNlIGNvZmZfdmlzX2NvbW1vbjoKLSAgICAgIC8qIFdlIGRvIHRoaXMgJ2NhdXNlIGNvbW1vbiBDIHN5bWJvbHMgYXJlIHRyZWF0ZWQgYXMgZXh0ZGVmcyAqLwotICAgIGNhc2UgY29mZl92aXNfZXh0X2RlZjoKLSAgICBjYXNlIGNvZmZfdmlzX2V4dF9yZWY6Ci0KLSAgICAgIGRzeS5lbmFtZSA9IHN5bWJvbC0+bmFtZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjb2ZmX3Zpc19yZWdwYXJhbToKLSAgICBjYXNlIGNvZmZfdmlzX2F1dG9wYXJhbToKLSAgICAgIGRzeS50eXBlID0gU1RZUEVfUEFSQU1FVEVSOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNvZmZfdmlzX2ludF9kZWY6Ci0KLSAgICBjYXNlIGNvZmZfdmlzX2F1dG86Ci0gICAgY2FzZSBjb2ZmX3Zpc19yZWdpc3RlcjoKLSAgICBjYXNlIGNvZmZfdmlzX3RhZzoKLSAgICBjYXNlIGNvZmZfdmlzX21lbWJlcl9vZl9zdHJ1Y3Q6Ci0gICAgY2FzZSBjb2ZmX3Zpc19tZW1iZXJfb2ZfZW51bToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgZHN5LnNmbiA9IDA7Ci0gIGRzeS5zbG4gPSAyOwotCi0gIGRzeS5uZWcgPSAweDEwMDE7Ci0KLQotICBzeXNyb2ZmX3N3YXBfZHN5X291dCAoZmlsZSwgJmRzeSk7Ci0KLSAgd2Fsa190cmVlX3R5cGUgKHNmaWxlLCBzeW1ib2wsIHN5bWJvbC0+dHlwZSwgbmVzdCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV9zY29wZSAoc2VjdGlvbiwgc2ZpbGUsIHNjb3BlLCBuZXN0LCB0eXBlKQotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIHN0cnVjdCBjb2ZmX3Njb3BlICpzY29wZTsKLSAgICAgaW50IG5lc3Q7Ci0gICAgIGludCB0eXBlOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnZhcnM7Ci0gIHN0cnVjdCBjb2ZmX3Njb3BlICpjaGlsZDsKLQotICBpZiAoc2NvcGUtPnZhcnNfaGVhZAotICAgICAgfHwgKHNjb3BlLT5saXN0X2hlYWQgJiYgc2NvcGUtPmxpc3RfaGVhZC0+dmFyc19oZWFkKSkKLSAgICB7Ci0gICAgICB3cl9kcHNfc3RhcnQgKHNmaWxlLCBzZWN0aW9uLCBzY29wZSwgdHlwZSwgbmVzdCk7Ci0KLSAgICAgIGlmIChuZXN0ID09IDApCi0Jd3JfZ2xvYmFscyAodHJlZSwgc2ZpbGUsIG5lc3QgKyAxKTsKLQotICAgICAgZm9yICh2YXJzID0gc2NvcGUtPnZhcnNfaGVhZDsgdmFyczsgdmFycyA9IHZhcnMtPm5leHQpCi0JewotCSAgd2Fsa190cmVlX3N5bWJvbCAoc2ZpbGUsIHNlY3Rpb24sIHZhcnMsIG5lc3QpOwotCX0KLQotICAgICAgZm9yIChjaGlsZCA9IHNjb3BlLT5saXN0X2hlYWQ7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQotCXsKLQkgIHdhbGtfdHJlZV9zY29wZSAoc2VjdGlvbiwgc2ZpbGUsIGNoaWxkLCBuZXN0ICsgMSwgQkxPQ0tfVFlQRV9CTE9DSyk7Ci0JfQotCi0gICAgICB3cl9kcHNfZW5kIChzZWN0aW9uLCBzY29wZSwgdHlwZSk7Ci0gICAgfQotfQotc3RhdGljIHZvaWQKLXdhbGtfdHJlZV9zZmlsZSAoc2VjdGlvbiwgc2ZpbGUpCi0gICAgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb247Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLXsKLSAgd2Fsa190cmVlX3Njb3BlIChzZWN0aW9uLCBzZmlsZSwgc2ZpbGUtPnNjb3BlLCAwLCBCTE9DS19UWVBFX0NPTVBVTklUKTsKLQotfQotCi1zdGF0aWMgdm9pZAotd3JfcHJvZ3JhbV9zdHJ1Y3R1cmUgKHAsIHNmaWxlKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotewotCi0gIHdhbGtfdHJlZV9zZmlsZSAocC0+c2VjdGlvbnMgKyA0LCBzZmlsZSk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdyX2R1IChwLCBzZmlsZSwgbikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IG47Ci17Ci0gIHN0cnVjdCBJVF9kdSBkdTsKLSAgaW50IGxpbTsKLSNpZiAwCi0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltYm9sOwotICBzdGF0aWMgaW50IGluY2l0ID0gMHg1MDAwMDA7Ci0gIGludCB1c2VkID0gMDsKLSNlbmRpZgotICBpbnQgaTsKLSAgaW50IGo7Ci0gIHVuc2lnbmVkIGludCAqbG93ZXN0ID0gKHVuc2lnbmVkICopIG5pbnRzIChwLT5uc2VjdGlvbnMpOwotICB1bnNpZ25lZCBpbnQgKmhpZ2hlc3QgPSAodW5zaWduZWQgKikgbmludHMgKHAtPm5zZWN0aW9ucyk7Ci0gIGR1LmZvcm1hdCA9IGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBFWEVDX1AgPyAwIDogMTsKLSAgZHUub3B0aW1pemVkID0gMDsKLSAgZHUuc3RhY2tmcm10ID0gMDsKLSAgZHUuc3BhcmUgPSAwOwotICBkdS51bml0ID0gbjsKLSAgZHUuc2VjdGlvbnMgPSBwLT5uc2VjdGlvbnMgLSAxOwotICBkdS5zYW4gPSAoaW50ICopIHhjYWxsb2MgKHNpemVvZiAoaW50KSwgZHUuc2VjdGlvbnMpOwotICBkdS5hZGRyZXNzID0gbmludHMgKGR1LnNlY3Rpb25zKTsKLSAgZHUubGVuZ3RoID0gbmludHMgKGR1LnNlY3Rpb25zKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgZHUuc2VjdGlvbnM7IGkrKykKLSAgICB7Ci0gICAgICBsb3dlc3RbaV0gPSB+MDsKLSAgICAgIGhpZ2hlc3RbaV0gPSAwOwotICAgIH0KLQotICAvKiBMb29rIHRocm91Z2ggYWxsIHRoZSBzeW1ib2xzIGFuZCB0cnkgYW5kIHdvcmsgb3V0IHRoZSBleHRlbnRzIGluIHRoaXMKLSAgICAgc291cmNlIGZpbGUgKi8KLSNpZiAwCi0gIGZvciAoc3ltYm9sID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7Ci0gICAgICAgc3ltYm9sOwotICAgICAgIHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc2VjZGVmX3R5cGUpCi0JewotCSAgdW5zaWduZWQgaW50IGxvdyA9IHN5bWJvbC0+d2hlcmUtPm9mZnNldDsKLQkgIHVuc2lnbmVkIGludCBoaWdoID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0ICsgc3ltYm9sLT50eXBlLT5zaXplIC0gMTsKLQkgIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKnNlY3Rpb24gPSBzeW1ib2wtPndoZXJlLT5zZWN0aW9uOwotCi0JICBpbnQgc24gPSBzZWN0aW9uLT5udW1iZXI7Ci0JICBpZiAobG93IDwgbG93ZXN0W3NuXSkKLQkgICAgbG93ZXN0W3NuXSA9IGxvdzsKLQkgIGlmIChoaWdoID4gaGlnaGVzdFtzbl0pCi0JICAgIGhpZ2hlc3Rbc25dID0gaGlnaDsKLQl9Ci0gICAgfQotCi0KLSAgZm9yIChpID0gMDsgaSA8IGR1LnNlY3Rpb25zOyBpKyspCi0gICAgewotICAgICAgaWYgKGhpZ2hlc3RbaV0gPT0gMCkKLQl7Ci0JICBsb3dlc3RbaV0gPSBoaWdoZXN0W2ldID0gaW5jaXQ7Ci0JfQotICAgICAgZHUuc2FuW3VzZWRdID0gaTsKLSAgICAgIGR1Lmxlbmd0aFt1c2VkXSA9IGhpZ2hlc3RbaV0gLSBsb3dlc3RbaV07Ci0gICAgICBkdS5hZGRyZXNzW3VzZWRdID0gYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCA/IGxvd2VzdFtpXSA6IDA7Ci0gICAgICBpZiAoZGVidWcpCi0JewotCSAgcHJpbnRmICgiIHNlY3Rpb24gJTZzIDB4JTA4eC4uMHglMDh4XG4iLAotCQkgIHAtPnNlY3Rpb25zW2kgKyAxXS5uYW1lLAotCQkgIGxvd2VzdFtpXSwKLQkJICBoaWdoZXN0W2ldKTsKLQl9Ci0gICAgICB1c2VkKys7Ci0gICAgfQotCi0jZW5kaWYKLSAgbGltID0gZHUuc2VjdGlvbnM7Ci0gIGZvciAoaiA9IDA7IGogPCBsaW07IGorKykKLSAgICB7Ci0gICAgICBpbnQgc3JjID0gajsKLSAgICAgIGludCBkc3QgPSBqOwotICAgICAgZHUuc2FuW2RzdF0gPSBkc3Q7Ci0gICAgICBpZiAoc2ZpbGUtPnNlY3Rpb25bc3JjXS5pbml0KQotCXsKLQkgIGR1Lmxlbmd0aFtkc3RdCi0JICAgID0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5oaWdoIC0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5sb3cgKyAxOwotCSAgZHUuYWRkcmVzc1tkc3RdCi0JICAgID0gc2ZpbGUtPnNlY3Rpb25bc3JjXS5sb3c7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGR1Lmxlbmd0aFtkc3RdID0gMDsKLQkgIGR1LmFkZHJlc3NbZHN0XSA9IDA7Ci0JfQotICAgICAgaWYgKGRlYnVnKQotCXsKLQkgIGlmIChzZmlsZS0+c2VjdGlvbltzcmNdLnBhcmVudCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiBzZWN0aW9uICU2cyAweCUwOHguLjB4JTA4eFxuIiwKLQkJICAgICAgc2ZpbGUtPnNlY3Rpb25bc3JjXS5wYXJlbnQtPm5hbWUsCi0JCSAgICAgIGR1LmFkZHJlc3NbZHN0XSwKLQkJICAgICAgZHUuYWRkcmVzc1tkc3RdICsgZHUubGVuZ3RoW2RzdF0gLSAxKTsKLQkgICAgfQotCX0KLSAgICAgIGR1LnNlY3Rpb25zID0gZHN0ICsgMTsKLSAgICB9Ci0KLSAgZHUudG9vbCA9ICJjX2djYyI7Ci0gIGR1LmRhdGUgPSBEQVRFOwotCi0gIHN5c3JvZmZfc3dhcF9kdV9vdXQgKGZpbGUsICZkdSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9kdXMgKHAsIHNmaWxlKQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcDsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotewotCi0gIHN0cnVjdCBJVF9kdXMgZHVzOwotCi0gIGR1cy5lZm4gPSAweDEwMDE7Ci0gIGR1cy5ucyA9IDE7CQkJLyogcC0+bnNvdXJjZXM7IHNhYyAxNCBqdWwgOTQgKi8KLSAgZHVzLmRyYiA9IG5pbnRzIChkdXMubnMpOwotICBkdXMuZm5hbWUgPSAoY2hhciAqKikgeGNhbGxvYyAoc2l6ZW9mIChjaGFyICopLCBkdXMubnMpOwotICBkdXMuc3BhcmUgPSBuaW50cyAoZHVzLm5zKTsKLSAgZHVzLm5kaXIgPSAwOwotICAvKiBGaW5kIHRoZSBmaWxlbmFtZXMgKi8KLSNpZiAwCi0gIGkgPSAwOwotCi0gIGZvciAoc2ZpbGUgPSBwLT5zb3VyY2VfaGVhZDsKLSAgICAgICBzZmlsZTsKLSAgICAgICBzZmlsZSA9IHNmaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGR1cy5kcmJbaV0gPSAwOwotICAgICAgZHVzLnNwYXJlW2ldID0gMDsKLSAgICAgIGR1cy5mbmFtZVtpXSA9IHNmaWxlLT5uYW1lOwotICAgICAgaSsrOwotICAgIH0KLSNlbHNlCi0gIGR1cy5kcmJbMF0gPSAwOwotICBkdXMuZm5hbWVbMF0gPSBzZmlsZS0+bmFtZTsKLSNlbmRpZgotCi0gIHN5c3JvZmZfc3dhcF9kdXNfb3V0IChmaWxlLCAmZHVzKTsKLQotfQotCi0vKiBGaW5kIHRoZSBvZmZzZXQgb2YgdGhlIC50ZXh0IHNlY3Rpb24gZm9yIHRoaXMgc2ZpbGUgaW4gdGhlCi0gICAudGV4dCBzZWN0aW9uIGZvciB0aGUgb3V0cHV0IGZpbGUgKi8KLQotc3RhdGljIGludAotZmluZF9iYXNlIChzZmlsZSwgc2VjdGlvbikKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWN0aW9uOwotewotICByZXR1cm4gc2ZpbGUtPnNlY3Rpb25bc2VjdGlvbi0+bnVtYmVyXS5sb3c7Ci19Ci1zdGF0aWMgdm9pZAotd3JfZGxuIChwLCBzZmlsZSwgbikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnA7Ci0gICAgIHN0cnVjdCBjb2ZmX3NmaWxlICpzZmlsZTsKLSAgICAgaW50IG47Ci0KLXsKLSNpZiAwCi0gIGlmIChuID09IDApCi0gICAgewotICAgICAgLyogQ291bnQgdXAgYWxsIHRoZSBsaW5lbnVtYmVycyAqLwotICAgICAgc3RydWN0IGNvZmZfc3ltYm9sICpzeTsKLSAgICAgIGludCBsYyA9IDA7Ci0gICAgICBzdHJ1Y3QgSVRfZGxuIGRsbjsKLQotICAgICAgaW50IGlkeDsKLQotICAgICAgZm9yIChzeSA9IHAtPnN5bWJvbF9saXN0X2hlYWQ7Ci0JICAgc3k7Ci0JICAgc3kgPSBzeS0+bmV4dF9pbl9vZmlsZV9saXN0KQotCXsKLQkgIHN0cnVjdCBjb2ZmX3R5cGUgKnQgPSBzeS0+dHlwZTsKLQkgIGlmICh0LT50eXBlID09IGNvZmZfZnVuY3Rpb25fdHlwZSkKLQkgICAgewotCSAgICAgIHN0cnVjdCBjb2ZmX2xpbmUgKmwgPSB0LT51LmZ1bmN0aW9uLmxpbmVzOwotCSAgICAgIGxjICs9IGwtPm5saW5lczsKLQkgICAgfQotCX0KLQotICAgICAgZGxuLnNmbiA9IG5pbnRzIChsYyk7Ci0gICAgICBkbG4uc2xuID0gbmludHMgKGxjKTsKLSAgICAgIGRsbi5sbG4gPSBuaW50cyAobGMpOwotICAgICAgZGxuLnNlY3Rpb24gPSBuaW50cyAobGMpOwotCi0gICAgICBkbG4uZnJvbV9hZGRyZXNzID0gbmludHMgKGxjKTsKLSAgICAgIGRsbi50b19hZGRyZXNzID0gbmludHMgKGxjKTsKLQotCi0gICAgICBkbG4ubmVnID0gMHgxMDAxOwotCi0gICAgICBkbG4ubmxuID0gbGM7Ci0KLSAgICAgIC8qIFJ1biB0aHJvdWdoIG9uY2UgbW9yZSBhbmQgZmlsbCB1cCB0aGUgc3RydWN0dXJlICovCi0gICAgICBpZHggPSAwOwotICAgICAgZm9yIChzeSA9IHAtPnN5bWJvbF9saXN0X2hlYWQ7Ci0JICAgc3k7Ci0JICAgc3kgPSBzeS0+bmV4dF9pbl9vZmlsZV9saXN0KQotCXsKLQkgIGlmIChzeS0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0JICAgIHsKLQkgICAgICBpbnQgaTsKLQkgICAgICBzdHJ1Y3QgY29mZl9saW5lICpsID0gc3ktPnR5cGUtPnUuZnVuY3Rpb24ubGluZXM7Ci0JICAgICAgZm9yIChpID0gMDsgaSA8IGwtPm5saW5lczsgaSsrKQotCQl7Ci0JCSAgZGxuLnNlY3Rpb25baWR4XSA9IHN5LT53aGVyZS0+c2VjdGlvbi0+bnVtYmVyOwotCQkgIGRsbi5zZm5baWR4XSA9IG47Ci0JCSAgZGxuLnNsbltpZHhdID0gbC0+bGluZXNbaV07Ci0JCSAgZGxuLmZyb21fYWRkcmVzc1tpZHhdID0gbC0+YWRkcmVzc2VzW2ldOwotCQkgIGlmIChpZHgpCi0JCSAgICBkbG4udG9fYWRkcmVzc1tpZHggLSAxXSA9IGRsbi5mcm9tX2FkZHJlc3NbaWR4XTsKLQkJICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JICBuKys7Ci0JfQotICAgICAgc3lzcm9mZl9zd2FwX2Rsbl9vdXQgKGZpbGUsICZkbG4pOwotICAgIH0KLQotI2VuZGlmCi0jaWYgMQotICAvKiBDb3VudCB1cCBhbGwgdGhlIGxpbmVudW1iZXJzICovCi0KLSAgc3RydWN0IGNvZmZfc3ltYm9sICpzeTsKLSAgaW50IGxjID0gMDsKLSAgc3RydWN0IElUX2RsbiBkbG47Ci0KLSAgaW50IGlkeDsKLQotICBmb3IgKHN5ID0gc2ZpbGUtPnNjb3BlLT52YXJzX2hlYWQ7Ci0gICAgICAgc3k7Ci0gICAgICAgc3kgPSBzeS0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl90eXBlICp0ID0gc3ktPnR5cGU7Ci0gICAgICBpZiAodC0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0JewotCSAgc3RydWN0IGNvZmZfbGluZSAqbCA9IHQtPnUuZnVuY3Rpb24ubGluZXM7Ci0JICBpZiAobCkKLQkgICAgbGMgKz0gbC0+bmxpbmVzOwotCX0KLSAgICB9Ci0KLSAgZGxuLnNmbiA9IG5pbnRzIChsYyk7Ci0gIGRsbi5zbG4gPSBuaW50cyAobGMpOwotICBkbG4uY2MgPSBuaW50cyAobGMpOwotICBkbG4uc2VjdGlvbiA9IG5pbnRzIChsYyk7Ci0KLSAgZGxuLmZyb21fYWRkcmVzcyA9IG5pbnRzIChsYyk7Ci0gIGRsbi50b19hZGRyZXNzID0gbmludHMgKGxjKTsKLQotCi0gIGRsbi5uZWcgPSAweDEwMDE7Ci0KLSAgZGxuLm5sbiA9IGxjOwotCi0gIC8qIFJ1biB0aHJvdWdoIG9uY2UgbW9yZSBhbmQgZmlsbCB1cCB0aGUgc3RydWN0dXJlICovCi0gIGlkeCA9IDA7Ci0gIGZvciAoc3kgPSBzZmlsZS0+c2NvcGUtPnZhcnNfaGVhZDsKLSAgICAgICBzeTsKLSAgICAgICBzeSA9IHN5LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzeS0+dHlwZS0+dHlwZSA9PSBjb2ZmX2Z1bmN0aW9uX3R5cGUpCi0JewotCSAgaW50IGk7Ci0JICBzdHJ1Y3QgY29mZl9saW5lICpsID0gc3ktPnR5cGUtPnUuZnVuY3Rpb24ubGluZXM7Ci0JICBpZiAobCkKLQkgICAgewotCSAgICAgIGludCBiYXNlID0gZmluZF9iYXNlIChzZmlsZSwgc3ktPndoZXJlLT5zZWN0aW9uKTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgbC0+bmxpbmVzOyBpKyspCi0JCXsKLQkJICBkbG4uc2VjdGlvbltpZHhdID0gc3ktPndoZXJlLT5zZWN0aW9uLT5udW1iZXI7Ci0JCSAgZGxuLnNmbltpZHhdID0gMDsKLQkJICBkbG4uc2xuW2lkeF0gPSBsLT5saW5lc1tpXTsKLQkJICBkbG4uZnJvbV9hZGRyZXNzW2lkeF0gPQotCQkgICAgbC0+YWRkcmVzc2VzW2ldICsgc3ktPndoZXJlLT5zZWN0aW9uLT5hZGRyZXNzIC0gYmFzZTsKLQkJICBkbG4uY2NbaWR4XSA9IDA7Ci0JCSAgaWYgKGlkeCkKLQkJICAgIGRsbi50b19hZGRyZXNzW2lkeCAtIDFdID0gZGxuLmZyb21fYWRkcmVzc1tpZHhdOwotCQkgIGlkeCsrOwotCi0JCX0KLQkgICAgICBkbG4udG9fYWRkcmVzc1tpZHggLSAxXSA9IGRsbi5mcm9tX2FkZHJlc3NbaWR4IC0gMV0gKyAyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKGxjKQotICAgIHN5c3JvZmZfc3dhcF9kbG5fb3V0IChmaWxlLCAmZGxuKTsKLSNlbmRpZgotfQotCi0vKiBXcml0ZSB0aGUgZ2xvYmFsIHN5bWJvbHMgb3V0IHRvIHRoZSBkZWJ1ZyBpbmZvICovCi1zdGF0aWMgdm9pZAotd3JfZ2xvYmFscyAocCwgc2ZpbGUsIG4pCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBuOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5OwotICBmb3IgKHN5ID0gcC0+c3ltYm9sX2xpc3RfaGVhZDsKLSAgICAgICBzeTsKLSAgICAgICBzeSA9IHN5LT5uZXh0X2luX29maWxlX2xpc3QpCi0gICAgewotICAgICAgaWYgKHN5LT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9kZWYKLQkgIHx8IHN5LT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2V4dF9yZWYpCi0JewotCSAgLyogT25seSB3cml0ZSBvdXQgc3ltYm9scyBpZiB0aGV5IGJlbG9uZyB0bwotCSAgICAgdGhlIGN1cnJlbnQgc291cmNlIGZpbGUgKi8KLQkgIGlmIChzeS0+c2ZpbGUgPT0gc2ZpbGUpCi0JICAgIHdhbGtfdHJlZV9zeW1ib2wgKHNmaWxlLCAwLCBzeSwgMCk7Ci0KLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3JfZGVidWcgKHApCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotewotICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gIGludCBuID0gMDsKLSAgZm9yIChzZmlsZSA9IHAtPnNvdXJjZV9oZWFkOwotICAgICAgIHNmaWxlOwotICAgICAgIHNmaWxlID0gc2ZpbGUtPm5leHQpCi0KLSAgICB7Ci0gICAgICBpZiAoZGVidWcpCi0JewotCSAgcHJpbnRmICgiJXNcbiIsIHNmaWxlLT5uYW1lKTsKLQl9Ci0gICAgICB3cl9kdSAocCwgc2ZpbGUsIG4pOwotICAgICAgd3JfZHVzIChwLCBzZmlsZSk7Ci0gICAgICB3cl9wcm9ncmFtX3N0cnVjdHVyZSAocCwgc2ZpbGUpOwotICAgICAgd3JfZGxuIChwLCBzZmlsZSwgbik7Ci0gICAgICBuKys7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd3JfY3MgKCkKLXsKLSAgLyogSXQgc2VlbXMgdGhhdCB0aGUgQ1Mgc3RydWN0IGlzIG5vdCBub3JtYWwgLSB0aGUgc2l6ZSBpcyB3cm9uZwotICAgICBoZXJlcyBvbmUgSSBwcmVwYXJlZCBlYXJsaWVyLi4gKi8KLSAgc3RhdGljIGNoYXIgYltdID0gewotICAgIDB4ODAsCQkJLyogSVQgKi8KLSAgICAweDIxLAkJCS8qIFJMICovCi0gICAgMHgwMCwJCQkvKiBudW1iZXIgb2YgY2hhcnMgaW4gdmFyaWFibGUgbGVuZ3RoIHBhcnQgKi8KLSAgICAweDgwLAkJCS8qIGhkICovIAotICAgIDB4MDAsCQkJLyogaHMgKi8gCi0gICAgMHg4MCwJCQkvKiB1biAqLyAKLSAgICAweDAwLAkJCS8qIHVzICovIAotICAgIDB4ODAsCQkJLyogc2MgKi8gCi0gICAgMHgwMCwJCQkvKiBzcyAqLyAKLSAgICAweDgwLAkJCS8qIGVyICovIAotICAgIDB4ODAsCQkJLyogZWQgKi8gCi0gICAgMHg4MCwJCQkvKiBzaCAqLyAKLSAgICAweDgwLAkJCS8qIG9iICovIAotICAgIDB4ODAsCQkJLyogcmwgKi8gCi0gICAgMHg4MCwJCQkvKiBkdSAqLwotICAgIDB4ODAsCQkJLyogZHBzICovCi0gICAgMHg4MCwJCQkvKiBkc3kgKi8KLSAgICAweDgwLAkJCS8qIGR0eSAqLwotICAgIDB4ODAsCQkJLyogZGxuICovCi0gICAgMHg4MCwJCQkvKiBkc28gKi8KLSAgICAweDgwLAkJCS8qIGR1cyAqLwotICAgIDB4MDAsCQkJLyogZHNzICovCi0gICAgMHg4MCwJCQkvKiBkYnQgKi8KLSAgICAweDAwLAkJCS8qIGRwcCAqLwotICAgIDB4ODAsCQkJLyogZGZwICovCi0gICAgMHg4MCwJCQkvKiBkZW4gKi8KLSAgICAweDgwLAkJCS8qIGRkcyAqLwotICAgIDB4ODAsCQkJLyogZGFyICovCi0gICAgMHg4MCwJCQkvKiBkcHQgKi8KLSAgICAweDAwLAkJCS8qIGR1bCAqLwotICAgIDB4MDAsCQkJLyogZHNlICovCi0gICAgMHgwMCwJCQkvKiBkb3QgKi8KLSAgICAweERFCQkJLyogQ1MgKi8KLSAgfTsKLSAgZndyaXRlIChiLCAxLCBzaXplb2YgKGIpLCBmaWxlKTsKLX0KLQotLyogV3JpdGUgb3V0IHRoZSBTQyByZWNvcmRzIGZvciBhIHVuaXQuICBDcmVhdGUgYW4gU0MKLSAgIGZvciBhbGwgdGhlIHNlY3Rpb25zIHdoaWNoIGFwcGVhciBpbiB0aGUgb3V0cHV0IGZpbGUsIGV2ZW4KLSAgIGlmIHRoZXJlIGlzbid0IGFuIGVxdWl2YWxlbnQgb25lIG9uIHRoZSBpbnB1dCAqLwotCi1zdGF0aWMgaW50Ci13cl9zYyAocHRyLCBzZmlsZSkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotewotICBpbnQgaTsKLWludCBzY291bnQgPSAwOwotICAvKiBGaXJzdCB3b3JrIG91dCB0aGUgdG90YWwgbnVtYmVyIG9mIHNlY3Rpb25zICovCi0KLSAgaW50IHRvdGFsX3NlYyA9IHB0ci0+bnNlY3Rpb25zOwotCi0gIHN0cnVjdCBteWluZm8KLSAgICB7Ci0gICAgICBzdHJ1Y3QgY29mZl9zZWN0aW9uICpzZWM7Ci0gICAgICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLSAgICB9OwotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnN5bWJvbDsKLQotICBzdHJ1Y3QgbXlpbmZvICppbmZvCi0gICAgPSAoc3RydWN0IG15aW5mbyAqKSBjYWxsb2MgKHRvdGFsX3NlYywgc2l6ZW9mIChzdHJ1Y3QgbXlpbmZvKSk7Ci0KLQotCi0gIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9zZWM7IGkrKykKLSAgICB7Ci0gICAgICBpbmZvW2ldLnNlYyA9IHB0ci0+c2VjdGlvbnMgKyBpOwotICAgICAgaW5mb1tpXS5zeW1ib2wgPSAwOwotICAgIH0KLQotICBmb3IgKHN5bWJvbCA9IHNmaWxlLT5zY29wZS0+dmFyc19oZWFkOwotICAgICAgIHN5bWJvbDsKLSAgICAgICBzeW1ib2wgPSBzeW1ib2wtPm5leHQpCi0gICAgewotCi0gICAgICBpZiAoc3ltYm9sLT50eXBlLT50eXBlID09IGNvZmZfc2VjZGVmX3R5cGUpCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3NlYzsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHN5bWJvbC0+d2hlcmUtPnNlY3Rpb24gPT0gaW5mb1tpXS5zZWMpCi0JCXsKLQkJICBpbmZvW2ldLnN5bWJvbCA9IHN5bWJvbDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgb3V0cHV0IGFsbCB0aGUgc2VjdGlvbiBpbmZvLCBhbmQgZmFrZSB1cCBzb21lIHN0dWZmIGZvciBzZWN0aW9ucwotICAgICB3ZSBkb24ndCBoYXZlICovCi0KLSAgZm9yIChpID0gMTsgaSA8IHRvdGFsX3NlYzsgaSsrKQotICAgIHsKLSAgICAgIHN0cnVjdCBJVF9zYyBzYzsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBzeW1ib2wgPSBpbmZvW2ldLnN5bWJvbDsKLSAgICAgIHNjLnNwYXJlID0gMDsKLSAgICAgIHNjLnNwYXJlMSA9IDA7Ci0gICAgICBpZiAoIXN5bWJvbCkKLQl7Ci0JICAvKiBEb24ndCBoYXZlIGEgc3ltYm9sIHNldCBhc2lkZSBmb3IgdGhpcyBzZWN0aW9uLCB3aGljaCBtZWFucyB0aGF0IG5vdGhpbmcKLQkgICAgIGluIHRoaXMgZmlsZSBkb2VzIGFueXRoaW5nIGZvciB0aGUgc2VjdGlvbi4gKi8KLQkgIHNjLmZvcm1hdCA9ICEoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIEVYRUNfUCk7Ci0JICBzYy5hZGRyID0gMDsKLQkgIHNjLmxlbmd0aCA9IDA7Ci0JICBuYW1lID0gaW5mb1tpXS5zZWMtPm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChiZmRfZ2V0X2ZpbGVfZmxhZ3MgKGFiZmQpICYgRVhFQ19QKQotCSAgICB7Ci0JICAgICAgc2MuZm9ybWF0ID0gMDsKLQkgICAgICBzYy5hZGRyID0gc3ltYm9sLT53aGVyZS0+b2Zmc2V0OwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzYy5mb3JtYXQgPSAxOwotCSAgICAgIHNjLmFkZHIgPSAwOwotCSAgICB9Ci0JICBzYy5sZW5ndGggPSBzeW1ib2wtPnR5cGUtPnNpemU7Ci0JICBuYW1lID0gc3ltYm9sLT5uYW1lOwotCX0KLQotICAgICAgc2MuYWxpZ24gPSA0OwotCi0gICAgICBzYy5jb25jYXQgPSBDT05DQVRfU0lNUExFOwotICAgICAgc2MucmVhZCA9IDM7Ci0gICAgICBzYy53cml0ZSA9IDM7Ci0gICAgICBzYy5leGVjID0gMzsKLSAgICAgIHNjLmluaXQgPSAzOwotICAgICAgc2MubW9kZSA9IDM7Ci0gICAgICBzYy5zcGFyZSA9IDA7Ci0gICAgICBzYy5zZWdhZGQgPSAwOwotICAgICAgc2Muc3BhcmUxID0gMDsJCS8qIElmIG5vdCB6ZXJvLCB0aGVuIGl0IGRvZXNuJ3Qgd29yayAqLwotICAgICAgc2MubmFtZSA9IHNlY3Rpb25fdHJhbnNsYXRlIChuYW1lKTsKLSAgICAgIGlmIChzdHJsZW4gKHNjLm5hbWUpID09IDEpCi0JewotCSAgc3dpdGNoIChzYy5uYW1lWzBdKQotCSAgICB7Ci0JICAgIGNhc2UgJ0QnOgotCSAgICBjYXNlICdCJzoKLQkgICAgICBzYy5jb250ZW50cyA9IENPTlRFTlRTX0RBVEE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgc2MuY29udGVudHMgPSBDT05URU5UU19DT0RFOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNjLmNvbnRlbnRzID0gQ09OVEVOVFNfQ09ERTsKLQl9Ci0jaWYgMAotICAgICAgLyogTkVXICovCi0gICAgICBpZiAoc2MubGVuZ3RoKSB7Ci0jZW5kaWYKLQlzeXNyb2ZmX3N3YXBfc2Nfb3V0IChmaWxlLCAmc2MpOwotCXNjb3VudCsrOwotI2lmIDAKLSAgICAgIH0KLSNlbmRpZgotICAgIH0KLXJldHVybiBzY291bnQ7Ci19Ci0KLQotLyogV3JpdGUgb3V0IHRoZSBFUiByZWNvcmRzIGZvciBhIHVuaXQuICovCi1zdGF0aWMgdm9pZAotd3JfZXIgKHB0ciwgc2ZpbGUsIGZpcnN0KQotICAgICBzdHJ1Y3QgY29mZl9vZmlsZSAqcHRyOwotICAgICBzdHJ1Y3QgY29mZl9zZmlsZSAqc2ZpbGU7Ci0gICAgIGludCBmaXJzdDsKLXsKLSAgaW50IGlkeCA9IDA7Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqc3ltOwotICBpZiAoZmlyc3QpCi0gICAgewotICAgICAgZm9yIChzeW0gPSBwdHItPnN5bWJvbF9saXN0X2hlYWQ7IHN5bTsgc3ltID0gc3ltLT5uZXh0X2luX29maWxlX2xpc3QpCi0JewotCSAgaWYgKHN5bS0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfcmVmKQotCSAgICB7Ci0JICAgICAgc3RydWN0IElUX2VyIGVyOwotCSAgICAgIGVyLnNwYXJlID0gMDsKLQkgICAgICBlci50eXBlID0gRVJfTk9UU1BFQzsKLQkgICAgICBlci5uYW1lID0gc3ltLT5uYW1lOwotCSAgICAgIHN5c3JvZmZfc3dhcF9lcl9vdXQgKGZpbGUsICZlcik7Ci0JICAgICAgc3ltLT5lcl9udW1iZXIgPSBpZHgrKzsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgRUQgcmVjb3JkcyBmb3IgYSB1bml0LiAqLwotc3RhdGljIHZvaWQKLXdyX2VkIChwdHIsIHNmaWxlLCBmaXJzdCkKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLSAgICAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICAgICBpbnQgZmlyc3Q7Ci17Ci0gIHN0cnVjdCBjb2ZmX3N5bWJvbCAqczsKLSAgaWYgKGZpcnN0KQotICAgIHsKLSAgICAgIGZvciAocyA9IHB0ci0+c3ltYm9sX2xpc3RfaGVhZDsgczsgcyA9IHMtPm5leHRfaW5fb2ZpbGVfbGlzdCkKLQl7Ci0JICBpZiAocy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19leHRfZGVmCi0JICAgICAgfHwgcy0+dmlzaWJsZS0+dHlwZSA9PSBjb2ZmX3Zpc19jb21tb24pCi0JICAgIHsKLQkgICAgICBzdHJ1Y3QgSVRfZWQgZWQ7Ci0KLQkgICAgICBlZC5zZWN0aW9uID0gcy0+d2hlcmUtPnNlY3Rpb24tPm51bWJlcjsKLQkgICAgICBlZC5zcGFyZSA9IDA7Ci0JICAgICAgaWYgKHMtPndoZXJlLT5zZWN0aW9uLT5kYXRhKQotCQl7Ci0JCSAgZWQudHlwZSA9IEVEX1RZUEVfREFUQTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHMtPndoZXJlLT5zZWN0aW9uLT5jb2RlICYgU0VDX0NPREUpCi0JCXsKLQkJICBlZC50eXBlID0gRURfVFlQRV9FTlRSWTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVkLnR5cGUgPSBFRF9UWVBFX05PVFNQRUM7Ci0JCSAgZWQudHlwZSA9IEVEX1RZUEVfREFUQTsKLQkJfQotCSAgICAgIGVkLmFkZHJlc3MgPSBzLT53aGVyZS0+b2Zmc2V0IC0gcy0+d2hlcmUtPnNlY3Rpb24tPmFkZHJlc3M7Ci0JICAgICAgZWQubmFtZSA9IHMtPm5hbWU7Ci0JICAgICAgc3lzcm9mZl9zd2FwX2VkX291dCAoZmlsZSwgJmVkKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl91bml0X2luZm8gKHB0cikKLSAgICAgc3RydWN0IGNvZmZfb2ZpbGUgKnB0cjsKLXsKLSAgc3RydWN0IGNvZmZfc2ZpbGUgKnNmaWxlOwotICBpbnQgZmlyc3QgPSAxOwotICBmb3IgKHNmaWxlID0gcHRyLT5zb3VyY2VfaGVhZDsKLSAgICAgICBzZmlsZTsKLSAgICAgICBzZmlsZSA9IHNmaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGxvbmcgcDE7Ci0gICAgICBsb25nIHAyOwotICAgICAgaW50IG5zZWNzOwotICAgICAgcDEgPSBmdGVsbCAoZmlsZSk7Ci0gICAgICB3cl91biAocHRyLCBzZmlsZSwgZmlyc3QsIDApOwotICAgICAgbnNlY3MgPSB3cl9zYyAocHRyLCBzZmlsZSk7Ci0gICAgICBwMiA9IGZ0ZWxsIChmaWxlKTsKLSAgICAgIGZzZWVrIChmaWxlLCBwMSwgU0VFS19TRVQpOwotICAgICAgd3JfdW4gKHB0ciwgc2ZpbGUsIGZpcnN0LCBuc2Vjcyk7Ci0gICAgICBmc2VlayAoZmlsZSwgcDIsIFNFRUtfU0VUKTsgCi0gICAgICB3cl9lciAocHRyLCBzZmlsZSwgZmlyc3QpOwotICAgICAgd3JfZWQgKHB0ciwgc2ZpbGUsIGZpcnN0KTsKLSAgICAgIGZpcnN0ID0gMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi13cl9tb2R1bGUgKHApCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICpwOwotewotICB3cl9jcyAoKTsKLSAgd3JfaGQgKHApOwotICB3cl91bml0X2luZm8gKHApOwotICB3cl9vYmplY3RfYm9keSAocCk7Ci0gIHdyX2RlYnVnIChwKTsKLSAgd3JfdHIgKCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWFsaWduICh4KQotICAgICBpbnQgeDsKLXsKLSAgcmV0dXJuICh4ICsgMykgJiB+MzsKLX0KLQotLyogRmluZCBhbGwgdGhlIGNvbW1vbiB2YXJpYWJsZXMgYW5kIHR1cm4gdGhlbSBpbnRvCi0gICBvcmRpbmFyeSBkZWZzIC0gZHVubm8gd2h5LCBidXQgdGhhdHMgd2hhdCBoaXRhY2hpIGRvZXMgd2l0aCAnZW0gKi8KLQotc3RhdGljIHZvaWQKLXByZXNjYW4gKHRyZWUpCi0gICAgIHN0cnVjdCBjb2ZmX29maWxlICp0cmVlOwotewotICBzdHJ1Y3QgY29mZl9zeW1ib2wgKnM7Ci0gIHN0cnVjdCBjb2ZmX3NlY3Rpb24gKmNvbW1vbl9zZWN0aW9uOwotICAvKiBGaW5kIHRoZSBjb21tb24gc2VjdGlvbiAtIGFsd2F5cyBzZWN0aW9uIDMgKi8KLSAgY29tbW9uX3NlY3Rpb24gPSB0cmVlLT5zZWN0aW9ucyArIDM7Ci0gIGZvciAocyA9IHRyZWUtPnN5bWJvbF9saXN0X2hlYWQ7Ci0gICAgICAgczsKLSAgICAgICBzID0gcy0+bmV4dF9pbl9vZmlsZV9saXN0KQotICAgIHsKLSAgICAgIGlmIChzLT52aXNpYmxlLT50eXBlID09IGNvZmZfdmlzX2NvbW1vbikKLQl7Ci0JICBzdHJ1Y3QgY29mZl93aGVyZSAqdyA9IHMtPndoZXJlOwotCSAgLyogICAgICBzLT52aXNpYmxlLT50eXBlID0gY29mZl92aXNfZXh0X2RlZjsgbGVhdmUgaXQgYXMgY29tbW9uICovCi0JICBjb21tb25fc2VjdGlvbi0+c2l6ZSA9IGFsaWduIChjb21tb25fc2VjdGlvbi0+c2l6ZSk7Ci0JICB3LT5vZmZzZXQgPSBjb21tb25fc2VjdGlvbi0+c2l6ZSArIGNvbW1vbl9zZWN0aW9uLT5hZGRyZXNzOwotCSAgdy0+c2VjdGlvbiA9IGNvbW1vbl9zZWN0aW9uOwotCSAgY29tbW9uX3NlY3Rpb24tPnNpemUgKz0gcy0+dHlwZS0+c2l6ZTsKLQkgIGNvbW1vbl9zZWN0aW9uLT5zaXplID0gYWxpZ24gKGNvbW1vbl9zZWN0aW9uLT5zaXplKTsKLQl9Ci0gICAgfQotfQotCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLXN0YXRpYyB2b2lkCi1zaG93X3VzYWdlIChmaWxlLCBzdGF0dXMpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGludCBzdGF0dXM7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIlVzYWdlOiAlcyBbLWRoVnFdIGluLWZpbGUgW291dC1maWxlXVxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogQ29udmVydCBhIENPRkYgb2JqZWN0IGZpbGUgaW50byBhIFNZU1JPRkYgb2JqZWN0IGZpbGVcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotCi0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKmF2W107Ci17Ci0gIGludCBvcHQ7Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLSAgewotICAgIHsiZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2QnfSwKLSAgICB7InF1aWNrIiwgbm9fYXJndW1lbnQsIDAsICdxJ30sCi0gICAgeyJub3ByZXNjYW4iLCBub19hcmd1bWVudCwgMCwgJ24nfSwKLSAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnfSwKLSAgICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ1YnfSwKLSAgICB7TlVMTCwgbm9fYXJndW1lbnQsIDAsIDB9Ci0gIH07Ci0gIGNoYXIgKiptYXRjaGluZzsKLSAgY2hhciAqaW5wdXRfZmlsZTsKLSAgY2hhciAqb3V0cHV0X2ZpbGU7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhdlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFjLCBhdiwgImRoVnFuIiwgbG9uZ19vcHRpb25zLAotCQkJICAgICAoaW50ICopIE5VTEwpKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ3EnOgotCSAgcXVpY2sgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBub3ByZXNjYW4gPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBkZWJ1ZyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHNob3dfaGVscCAoKTsKLQkgIC8qTk9UUkVBQ0hFRCAqLwotCWNhc2UgJ1YnOgotCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKLQkgIGV4aXQgKDApOwotCSAgLypOT1RSRUFDSEVEICovCi0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAvKk5PVFJFQUNIRUQgKi8KLQl9Ci0gICAgfQotCi0gIC8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG1heSBiZSBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLSAgb3V0cHV0X2ZpbGUgPSBOVUxMOwotICBpZiAob3B0aW5kIDwgYWMpCi0gICAgewotICAgICAgaW5wdXRfZmlsZSA9IGF2W29wdGluZF07Ci0gICAgICArK29wdGluZDsKLSAgICAgIGlmIChvcHRpbmQgPCBhYykKLQl7Ci0JICBvdXRwdXRfZmlsZSA9IGF2W29wdGluZF07Ci0JICArK29wdGluZDsKLQkgIGlmIChvcHRpbmQgPCBhYykKLQkgICAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIGlmIChzdHJjbXAgKGlucHV0X2ZpbGUsIG91dHB1dF9maWxlKSA9PSAwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IGlucHV0IGFuZCBvdXRwdXQgZmlsZXMgbXVzdCBiZSBkaWZmZXJlbnRcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICBleGl0ICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBpbnB1dF9maWxlID0gMDsKLQotICBpZiAoIWlucHV0X2ZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGlmICghb3V0cHV0X2ZpbGUpCi0gICAgewotICAgICAgLyogVGFrZSBhIC5vIG9mZiB0aGUgaW5wdXQgZmlsZSBhbmQgc3RpY2sgb24gYSAub2JqLiAgSWYKLSAgICAgICAgIGl0IGRvZXNuJ3QgZW5kIGluIC5vLCB0aGVuIHN0aWNrIGEgLm9iaiBvbiBhbnl3YXkgKi8KLQotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoaW5wdXRfZmlsZSk7Ci0gICAgICBvdXRwdXRfZmlsZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotICAgICAgc3RyY3B5IChvdXRwdXRfZmlsZSwgaW5wdXRfZmlsZSk7Ci0gICAgICBpZiAobGVuID4gMwotCSAgJiYgb3V0cHV0X2ZpbGVbbGVuIC0gMl0gPT0gJy4nCi0JICAmJiBvdXRwdXRfZmlsZVtsZW4gLSAxXSA9PSAnbycpCi0JewotCSAgb3V0cHV0X2ZpbGVbbGVuXSA9ICdiJzsKLQkgIG91dHB1dF9maWxlW2xlbiArIDFdID0gJ2onOwotCSAgb3V0cHV0X2ZpbGVbbGVuICsgMl0gPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJjYXQgKG91dHB1dF9maWxlLCAiLm9iaiIpOwotCX0KLSAgICB9Ci0KLSAgYWJmZCA9IGJmZF9vcGVuciAoaW5wdXRfZmlsZSwgMCk7Ci0KLSAgaWYgKCFhYmZkKQotICAgIGJmZF9mYXRhbCAoaW5wdXRfZmlsZSk7Ci0KLSAgaWYgKCFiZmRfY2hlY2tfZm9ybWF0X21hdGNoZXMgKGFiZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChpbnB1dF9maWxlKTsKLSAgICAgIGlmIChiZmRfZ2V0X2Vycm9yICgpID09IGJmZF9lcnJvcl9maWxlX2FtYmlndW91c2x5X3JlY29nbml6ZWQpCi0JewotCSAgbGlzdF9tYXRjaGluZ19mb3JtYXRzIChtYXRjaGluZyk7Ci0JICBmcmVlIChtYXRjaGluZyk7Ci0JfQotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGZpbGUgPSBmb3BlbiAob3V0cHV0X2ZpbGUsIEZPUEVOX1dCKTsKLQotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUsIG91dHB1dF9maWxlKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAoZGVidWcpCi0gICAgcHJpbnRmICgiaWRzICVkICVkXG4iLCBiYXNlMSwgYmFzZTIpOwotICB0cmVlID0gY29mZl9ncm9rIChhYmZkKTsKLSAgaWYgKCFub3ByZXNjYW4pCi0gICAgcHJlc2NhbiAodHJlZSk7Ci0gIHdyX21vZHVsZSAodHJlZSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvc3RhYnMuYyBiL2JpbnV0aWxzL3N0YWJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2IzYmQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RhYnMuYworKysgL2Rldi9udWxsCkBAIC0xLDUxODggKzAsMCBAQAotLyogc3RhYnMuYyAtLSBQYXJzZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSB3aGljaCBwYXJzZXMgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotICAgVGhlIG9yZ2FuaXphdGlvbiBvZiB0aGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGdkYiBzdGFicyByZWFkaW5nCi0gICBjb2RlLiAgVGhlIGpvYiBpdCBkb2VzIGlzIHNvbWV3aGF0IGRpZmZlcmVudCwgYmVjYXVzZSBpdCBpcyBub3QKLSAgIHRyeWluZyB0byBpZGVudGlmeSB0aGUgY29ycmVjdCBhZGRyZXNzIGZvciBhbnl0aGluZy4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAiYnVkYmcuaCIKLQotLyogTWVhbmluZ2xlc3MgZGVmaW5pdGlvbiBuZWVkcyBieSBhb3V0NjQuaC4gIEZJWE1FLiAgKi8KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0Ci0KLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotI2lmbmRlZiBESVJfU0VQQVJBVE9SCi0jaWZkZWYgX1dJTjMyCi0jZGVmaW5lIERJUl9TRVBBUkFUT1IgJ1xcJwotI2Vsc2UKLSNkZWZpbmUgRElSX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFRoZSBudW1iZXIgb2YgcHJlZGVmaW5lZCBYQ09GRiB0eXBlcy4gICovCi0KLSNkZWZpbmUgWENPRkZfVFlQRV9DT1VOVCAzNAotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGFzIGEgaGFuZGxlIHNvIHRoYXQgdGhlIHN0YWIgcGFyc2luZyBkb2Vzbid0Ci0gICBuZWVkIHRvIHVzZSBhbnkgc3RhdGljIHZhcmlhYmxlcy4gICovCi0KLXN0cnVjdCBzdGFiX2hhbmRsZQotewotICAvKiBUaGUgQkZELiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUcnVlIGlmIHRoaXMgaXMgc3RhYnMgaW4gc2VjdGlvbnMuICAqLwotICBib29sZWFuIHNlY3Rpb25zOwotICAvKiBUaGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgYXN5bWJvbCAqKnN5bXM7Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3ltYm9scy4gICovCi0gIGxvbmcgc3ltY291bnQ7Ci0gIC8qIFRoZSBhY2N1bXVsYXRlZCBmaWxlIG5hbWUgc3RyaW5nLiAgKi8KLSAgY2hhciAqc29fc3RyaW5nOwotICAvKiBUaGUgdmFsdWUgb2YgdGhlIGxhc3QgTl9TTyBzeW1ib2wuICAqLwotICBiZmRfdm1hIHNvX3ZhbHVlOwotICAvKiBUaGUgdmFsdWUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgZmlsZQotICAgICByZWxhdGl2ZSBOX0xCUkFDIGFuZCBOX1JCUkFDIHN5bWJvbHMuICAqLwotICBiZmRfdm1hIGZpbGVfc3RhcnRfb2Zmc2V0OwotICAvKiBUaGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIHNvIHRoYXQgd2UgY2FuIGhhbmRsZQotICAgICBmdW5jdGlvbiByZWxhdGl2ZSBOX0xCUkFDIGFuZCBOX1JCUkFDIHN5bWJvbHMuICAqLwotICBiZmRfdm1hIGZ1bmN0aW9uX3N0YXJ0X29mZnNldDsKLSAgLyogVGhlIHZlcnNpb24gbnVtYmVyIG9mIGdjYyB3aGljaCBjb21waWxlZCB0aGUgY3VycmVudCBjb21waWxhdGlvbgotICAgICB1bml0LCAwIGlmIG5vdCBjb21waWxlZCBieSBnY2MuICAqLwotICBpbnQgZ2NjX2NvbXBpbGVkOwotICAvKiBXaGV0aGVyIGFuIE5fT1BUIHN5bWJvbCB3YXMgc2VlbiB0aGF0IHdhcyBub3QgZ2VuZXJhdGVkIGJ5IGdjYywKLSAgICAgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHRoZSBTdW5QUk8gY29tcGlsZXIuICAqLwotICBib29sZWFuIG5fb3B0X2ZvdW5kOwotICAvKiBUaGUgbWFpbiBmaWxlIG5hbWUuICAqLwotICBjaGFyICptYWluX2ZpbGVuYW1lOwotICAvKiBBIHN0YWNrIG9mIHVuZmluaXNoZWQgTl9CSU5DTCBmaWxlcy4gICovCi0gIHN0cnVjdCBiaW5jbF9maWxlICpiaW5jbF9zdGFjazsKLSAgLyogQSBsaXN0IG9mIGZpbmlzaGVkIE5fQklOQ0wgZmlsZXMuICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqYmluY2xfbGlzdDsKLSAgLyogV2hldGhlciB3ZSBhcmUgaW5zaWRlIGEgZnVuY3Rpb24gb3Igbm90LiAgKi8KLSAgYm9vbGVhbiB3aXRoaW5fZnVuY3Rpb247Ci0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCB1c2VkIGlmIHdlIGhhdmUgc2VlbiBhbgotICAgICBOX0ZVTiBzeW1ib2wgd2hpbGUgaW4gYSBmdW5jdGlvbi4gIFRoaXMgaXMgLTEgaWYgd2UgaGF2ZSBub3Qgc2VlbgotICAgICBhbiBOX0ZVTiAodGhlIG5vcm1hbCBjYXNlKS4gICovCi0gIGJmZF92bWEgZnVuY3Rpb25fZW5kOwotICAvKiBUaGUgZGVwdGggb2YgYmxvY2sgbmVzdGluZy4gICovCi0gIGludCBibG9ja19kZXB0aDsKLSAgLyogTGlzdCBvZiBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb25zLiAgKi8KLSAgc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKnBlbmRpbmc7Ci0gIC8qIE51bWJlciBvZiBmaWxlcyBmb3Igd2hpY2ggd2UgaGF2ZSB0eXBlcy4gICovCi0gIHVuc2lnbmVkIGludCBmaWxlczsKLSAgLyogTGlzdHMgb2YgdHlwZXMgcGVyIGZpbGUuICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlcyAqKmZpbGVfdHlwZXM7Ci0gIC8qIFByZWRlZmluZWQgWENPRkYgdHlwZXMuICAqLwotICBkZWJ1Z190eXBlIHhjb2ZmX3R5cGVzW1hDT0ZGX1RZUEVfQ09VTlRdOwotICAvKiBVbmRlZmluZWQgdGFncy4gICovCi0gIHN0cnVjdCBzdGFiX3RhZyAqdGFnczsKLSAgLyogU2V0IGJ5IHBhcnNlX3N0YWJfdHlwZSBpZiBpdCBzZWVzIGEgc3RydWN0dXJlIGRlZmluZWQgYXMgYSBjcm9zcwotICAgICByZWZlcmVuY2UgdG8gaXRzZWxmLiAgUmVzZXQgYnkgcGFyc2Vfc3RhYl90eXBlIG90aGVyd2lzZS4gICovCi0gIGJvb2xlYW4gc2VsZl9jcm9zc3JlZjsKLX07Ci0KLS8qIEEgbGlzdCBvZiB0aGVzZSBzdHJ1Y3R1cmVzIGlzIHVzZWQgdG8gaG9sZCBwZW5kaW5nIHZhcmlhYmxlCi0gICBkZWZpbml0aW9ucyBzZWVuIGJlZm9yZSB0aGUgTl9MQlJBQyBvZiBhIGJsb2NrLiAgKi8KLQotc3RydWN0IHN0YWJfcGVuZGluZ192YXIKLXsKLSAgLyogTmV4dCBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb24uICAqLwotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqbmV4dDsKLSAgLyogTmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFR5cGUuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci0gIC8qIEtpbmQuICAqLwotICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gIC8qIFZhbHVlLiAgKi8KLSAgYmZkX3ZtYSB2YWw7Ci19OwotCi0vKiBBIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyB1c2VkIHRvIGhvbGQgdGhlIHR5cGVzIGZvciBhIHNpbmdsZQotICAgZmlsZS4gICovCi0KLXN0cnVjdCBzdGFiX3R5cGVzCi17Ci0gIC8qIE5leHQgc2V0IG9mIHNsb3RzIGZvciB0aGlzIGZpbGUuICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlcyAqbmV4dDsKLSAgLyogVHlwZXMgaW5kZXhlZCBieSB0eXBlIG51bWJlci4gICovCi0jZGVmaW5lIFNUQUJfVFlQRVNfU0xPVFMgKDE2KQotICBkZWJ1Z190eXBlIHR5cGVzW1NUQUJfVFlQRVNfU0xPVFNdOwotfTsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgdW5kZWZpbmVkIHRhZ3MgdGhhdCB3ZSBlbmNvdW50ZXIsIHNvIHRoYXQgd2UgY2FuCi0gICBmaWxsIHRoZW0gaW4gaWYgdGhlIHRhZyBpcyBsYXRlciBkZWZpbmVkLiAgKi8KLQotc3RydWN0IHN0YWJfdGFnCi17Ci0gIC8qIE5leHQgdW5kZWZpbmVkIHRhZy4gICovCi0gIHN0cnVjdCBzdGFiX3RhZyAqbmV4dDsKLSAgLyogVGFnIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUeXBlIGtpbmQuICAqLwotICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAvKiBTbG90IHRvIGhvbGQgcmVhbCB0eXBlIHdoZW4gd2UgZGlzY292ZXIgaXQuICBJZiB3ZSBkb24ndCwgd2UgZmlsbAotICAgICBpbiBhbiB1bmRlZmluZWQgdGFnIHR5cGUuICAqLwotICBkZWJ1Z190eXBlIHNsb3Q7Ci0gIC8qIEluZGlyZWN0IHR5cGUgd2UgaGF2ZSBjcmVhdGVkIHRvIHBvaW50IGF0IHNsb3QuICAqLwotICBkZWJ1Z190eXBlIHR5cGU7Ci19OwotCi1zdGF0aWMgY2hhciAqc2F2ZXN0cmluZyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGJmZF92bWEgcGFyc2VfbnVtYmVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIGJvb2xlYW4gKikpOwotc3RhdGljIHZvaWQgYmFkX3N0YWIgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3YXJuX3N0YWIgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfc3RyaW5nCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGludCwgaW50LCBiZmRfdm1hLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCi0JICAgZGVidWdfdHlwZSAqKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl90eXBlX251bWJlcgotICBQQVJBTVMgKChjb25zdCBjaGFyICoqLCBpbnQgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9yYW5nZV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwKLQkgICBjb25zdCBpbnQgKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9zdW5fYnVpbHRpbl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9zdW5fZmxvYXRpbmdfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfZW51bV90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9zdHJ1Y3RfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosIGJvb2xlYW4sCi0JICAgY29uc3QgaW50ICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfYmFzZWNsYXNzZXMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgZGVidWdfYmFzZWNsYXNzICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX3N0cnVjdF9maWVsZHMKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgZGVidWdfZmllbGQgKiosCi0JICAgYm9vbGVhbiAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBwYXJzZV9zdGFiX2NwcF9hYmJyZXYKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgZGVidWdfZmllbGQgKikpOwotc3RhdGljIGJvb2xlYW4gcGFyc2Vfc3RhYl9vbmVfc3RydWN0X2ZpZWxkCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiwKLQkgICBkZWJ1Z19maWVsZCAqLCBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfbWVtYmVycwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiosCi0JICAgY29uc3QgaW50ICosIGRlYnVnX21ldGhvZCAqKikpOwotc3RhdGljIGRlYnVnX3R5cGUgcGFyc2Vfc3RhYl9hcmd0eXBlcwotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBkZWJ1Z190eXBlLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkgICBkZWJ1Z190eXBlLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBib29sZWFuIHBhcnNlX3N0YWJfdGlsZGVfZmllbGQKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqKiwgY29uc3QgaW50ICosCi0JICAgZGVidWdfdHlwZSAqLCBib29sZWFuICopKTsKLXN0YXRpYyBkZWJ1Z190eXBlIHBhcnNlX3N0YWJfYXJyYXlfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICoqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBwdXNoX2JpbmNsIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpwb3BfYmluY2wgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICopKTsKLXN0YXRpYyBib29sZWFuIGZpbmRfZXhjbAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3JlY29yZF92YXJpYWJsZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGRlYnVnX3R5cGUsCi0JICAgZW51bSBkZWJ1Z192YXJfa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbWl0X3BlbmRpbmdfdmFycyBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSAqc3RhYl9maW5kX3Nsb3QKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGludCAqKSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBzdGFiX2ZpbmRfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9yZWNvcmRfdHlwZQotICBQQVJBTVMgKChQVFIsIHN0cnVjdCBzdGFiX2hhbmRsZSAqLCBjb25zdCBpbnQgKiwgZGVidWdfdHlwZSkpOwotc3RhdGljIGRlYnVnX3R5cGUgc3RhYl94Y29mZl9idWlsdGluX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgaW50KSk7Ci1zdGF0aWMgZGVidWdfdHlwZSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUKLSAgUEFSQU1TICgoUFRSLCBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBpbnQsCi0JICAgZW51bSBkZWJ1Z190eXBlX2tpbmQpKTsKLXN0YXRpYyBkZWJ1Z190eXBlICpzdGFiX2RlbWFuZ2xlX2FyZ3R5cGVzCi0gIFBBUkFNUyAoKFBUUiwgc3RydWN0IHN0YWJfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiAqKSk7Ci0KLS8qIFNhdmUgYSBzdHJpbmcgaW4gbWVtb3J5LiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2F2ZXN0cmluZyAoc3RhcnQsIGxlbikKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIGludCBsZW47Ci17Ci0gIGNoYXIgKnJldDsKLQotICByZXQgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5IChyZXQsIHN0YXJ0LCBsZW4pOwotICByZXRbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgZnJvbSBhIHN0cmluZy4gICovCi0KLXN0YXRpYyBiZmRfdm1hCi1wYXJzZV9udW1iZXIgKHBwLCBwb3ZlcmZsb3cpCi0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgYm9vbGVhbiAqcG92ZXJmbG93OwotewotICB1bnNpZ25lZCBsb25nIHVsOwotICBjb25zdCBjaGFyICpvcmlnOwotCi0gIGlmIChwb3ZlcmZsb3cgIT0gTlVMTCkKLSAgICAqcG92ZXJmbG93ID0gZmFsc2U7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBlcnJubyA9IDA7Ci0gIHVsID0gc3RydG91bCAoKnBwLCAoY2hhciAqKikgcHAsIDApOwotICBpZiAodWwgKyAxICE9IDAgfHwgZXJybm8gPT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiBiZmRfdm1hIGlzIGxhcmdlciB0aGFuIHVuc2lnbmVkIGxvbmcsIGFuZCB0aGUgbnVtYmVyIGlzCi0gICAgICAgICBtZWFudCB0byBiZSBuZWdhdGl2ZSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzaWduCi0gICAgICAgICBleHRlbmQgcHJvcGVybHkuICAqLwotICAgICAgaWYgKCpvcmlnID09ICctJykKLQlyZXR1cm4gKGJmZF92bWEpIChiZmRfc2lnbmVkX3ZtYSkgKGxvbmcpIHVsOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSB1bDsKLSAgICB9Ci0KLSAgLyogTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHN0cnRvdWwgb3ZlcmZsb3dlZCwgaXQgc2hvdWxkIGhhdmUgc2V0ICpwcAotICAgICB0byB0aGUgZW5kIG9mIHRoZSBudW1iZXIsIHdoaWNoIGlzIHdoZXJlIHdlIHdhbnQgaXQuICAqLwotCi0gIGlmIChzaXplb2YgKGJmZF92bWEpID4gc2l6ZW9mICh1bnNpZ25lZCBsb25nKSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpwOwotICAgICAgYm9vbGVhbiBuZWc7Ci0gICAgICBpbnQgYmFzZTsKLSAgICAgIGJmZF92bWEgb3ZlciwgbGFzdGRpZzsKLSAgICAgIGJvb2xlYW4gb3ZlcmZsb3c7Ci0gICAgICBiZmRfdm1hIHY7Ci0KLSAgICAgIC8qIE91ciBvd24gdmVyc2lvbiBvZiBzdHJ0b3VsLCBmb3IgYSBiZmRfdm1hLiAgKi8KLQotICAgICAgcCA9IG9yaWc7Ci0KLSAgICAgIG5lZyA9IGZhbHNlOwotICAgICAgaWYgKCpwID09ICcrJykKLQkrK3A7Ci0gICAgICBlbHNlIGlmICgqcCA9PSAnLScpCi0JewotCSAgbmVnID0gdHJ1ZTsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIGJhc2UgPSAxMDsKLSAgICAgIGlmICgqcCA9PSAnMCcpCi0JewotCSAgaWYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnKQotCSAgICB7Ci0JICAgICAgYmFzZSA9IDE2OwotCSAgICAgIHAgKz0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYmFzZSA9IDg7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JfQotCi0gICAgICBvdmVyID0gKChiZmRfdm1hKSAoYmZkX3NpZ25lZF92bWEpIC0xKSAvIChiZmRfdm1hKSBiYXNlOwotICAgICAgbGFzdGRpZyA9ICgoYmZkX3ZtYSkgKGJmZF9zaWduZWRfdm1hKSAtMSkgJSAoYmZkX3ZtYSkgYmFzZTsKLQotICAgICAgb3ZlcmZsb3cgPSBmYWxzZTsKLSAgICAgIHYgPSAwOwotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaW50IGQ7Ci0KLQkgIGQgPSAqcCsrOwotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBkKSkKLQkgICAgZCAtPSAnMCc7Ci0JICBlbHNlIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgZCkpCi0JICAgIGQgLT0gJ0EnOwotCSAgZWxzZSBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpIGQpKQotCSAgICBkIC09ICdhJzsKLQkgIGVsc2UKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChkID49IGJhc2UpCi0JICAgIGJyZWFrOwotCi0JICBpZiAodiA+IG92ZXIgfHwgKHYgPT0gb3ZlciAmJiAoYmZkX3ZtYSkgZCA+IGxhc3RkaWcpKQotCSAgICB7Ci0JICAgICAgb3ZlcmZsb3cgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBvdmVyZmxvdykKLQl7Ci0JICBpZiAobmVnKQotCSAgICB2ID0gLSB2OwotCSAgcmV0dXJuIHY7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlIG51bWJlciBpcyB0b28gbGFyZ2UgdG8gcmVwcmVzZW50IGluIGEKLSAgICAgYmZkX3ZtYS4gICovCi0KLSAgaWYgKHBvdmVyZmxvdyAhPSBOVUxMKQotICAgICpwb3ZlcmZsb3cgPSB0cnVlOwotICBlbHNlCi0gICAgd2Fybl9zdGFiIChvcmlnLCBfKCJudW1lcmljIG92ZXJmbG93IikpOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGZvciBhIGJhZCBzdGFiIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1iYWRfc3RhYiAocCkKLSAgICAgY29uc3QgY2hhciAqcDsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJCYWQgc3RhYjogJXNcbiIpLCBwKTsKLX0KLQotLyogV2FybiBhYm91dCBzb21ldGhpbmcgaW4gYSBzdGFiIHN0cmluZy4gICovCi0KLXN0YXRpYyB2b2lkCi13YXJuX3N0YWIgKHAsIGVycikKLSAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgY29uc3QgY2hhciAqZXJyOwotewotICBmcHJpbnRmIChzdGRlcnIsIF8oIldhcm5pbmc6ICVzOiAlc1xuIiksIGVyciwgcCk7Ci19Ci0KLS8qIENyZWF0ZSBhIGhhbmRsZSB0byBwYXJzZSBzdGFicyBzeW1ib2xzIHdpdGguICAqLwotCi0vKkFSR1NVU0VEKi8KLVBUUgotc3RhcnRfc3RhYiAoZGhhbmRsZSwgYWJmZCwgc2VjdGlvbnMsIHN5bXMsIHN5bWNvdW50KQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYmZkICphYmZkOwotICAgICBib29sZWFuIHNlY3Rpb25zOwotICAgICBhc3ltYm9sICoqc3ltczsKLSAgICAgbG9uZyBzeW1jb3VudDsKLXsKLSAgc3RydWN0IHN0YWJfaGFuZGxlICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBzdGFiX2hhbmRsZSAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIG1lbXNldCAocmV0LCAwLCBzaXplb2YgKnJldCk7Ci0gIHJldC0+YWJmZCA9IGFiZmQ7Ci0gIHJldC0+c2VjdGlvbnMgPSBzZWN0aW9uczsKLSAgcmV0LT5zeW1zID0gc3ltczsKLSAgcmV0LT5zeW1jb3VudCA9IHN5bWNvdW50OwotICByZXQtPmZpbGVzID0gMTsKLSAgcmV0LT5maWxlX3R5cGVzID0gKHN0cnVjdCBzdGFiX3R5cGVzICoqKSB4bWFsbG9jIChzaXplb2YgKnJldC0+ZmlsZV90eXBlcyk7Ci0gIHJldC0+ZmlsZV90eXBlc1swXSA9IE5VTEw7Ci0gIHJldC0+ZnVuY3Rpb25fZW5kID0gKGJmZF92bWEpIC0xOwotICByZXR1cm4gKFBUUikgcmV0OwotfQotCi0vKiBXaGVuIHdlIGhhdmUgcHJvY2Vzc2VkIGFsbCB0aGUgc3RhYnMgaW5mb3JtYXRpb24sIHdlIG5lZWQgdG8gZ28KLSAgIHRocm91Z2ggYW5kIGZpbGwgaW4gYWxsIHRoZSB1bmRlZmluZWQgdGFncy4gICovCi0KLWJvb2xlYW4KLWZpbmlzaF9zdGFiIChkaGFuZGxlLCBoYW5kbGUpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBQVFIgaGFuZGxlOwotewotICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfaGFuZGxlICopIGhhbmRsZTsKLSAgc3RydWN0IHN0YWJfdGFnICpzdDsKLQotICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotICAgIHsKLSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pCi0JICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgaW5mby0+ZnVuY3Rpb25fZW5kKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLSAgICAgIGluZm8tPmZ1bmN0aW9uX2VuZCA9IChiZmRfdm1hKSAtMTsKLSAgICB9Ci0KLSAgZm9yIChzdCA9IGluZm8tPnRhZ3M7IHN0ICE9IE5VTEw7IHN0ID0gc3QtPm5leHQpCi0gICAgewotICAgICAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLQotICAgICAga2luZCA9IHN0LT5raW5kOwotICAgICAgaWYgKGtpbmQgPT0gREVCVUdfS0lORF9JTExFR0FMKQotCWtpbmQgPSBERUJVR19LSU5EX1NUUlVDVDsKLSAgICAgIHN0LT5zbG90ID0gZGVidWdfbWFrZV91bmRlZmluZWRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIHN0LT5uYW1lLCBraW5kKTsKLSAgICAgIGlmIChzdC0+c2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogSGFuZGxlIGEgc2luZ2xlIHN0YWJzIHN5bWJvbC4gICovCi0KLWJvb2xlYW4KLXBhcnNlX3N0YWIgKGRoYW5kbGUsIGhhbmRsZSwgdHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIFBUUiBoYW5kbGU7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgZGVzYzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfaGFuZGxlICopIGhhbmRsZTsKLQotICAvKiBnY2Mgd2lsbCBlbWl0IHR3byBOX1NPIHN0cmluZ3MgcGVyIGNvbXBpbGF0aW9uIHVuaXQsIG9uZSBmb3IgdGhlCi0gICAgIGRpcmVjdG9yeSBuYW1lIGFuZCBvbmUgZm9yIHRoZSBmaWxlIG5hbWUuICBXZSBqdXN0IGNvbGxlY3QgTl9TTwotICAgICBzdHJpbmdzIGFzIHdlIHNlZSB0aGVtLCBhbmQgc3RhcnQgdGhlIG5ldyBjb21waWxhdGlvbiB1bml0IHdoZW4KLSAgICAgd2Ugc2VlIGEgbm9uIE5fU08gc3ltYm9sLiAgKi8KLSAgaWYgKGluZm8tPnNvX3N0cmluZyAhPSBOVUxMCi0gICAgICAmJiAodHlwZSAhPSBOX1NPIHx8ICpzdHJpbmcgPT0gJ1wwJyB8fCB2YWx1ZSAhPSBpbmZvLT5zb192YWx1ZSkpCi0gICAgewotICAgICAgaWYgKCEgZGVidWdfc2V0X2ZpbGVuYW1lIChkaGFuZGxlLCBpbmZvLT5zb19zdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPm1haW5fZmlsZW5hbWUgPSBpbmZvLT5zb19zdHJpbmc7Ci0KLSAgICAgIGluZm8tPmdjY19jb21waWxlZCA9IDA7Ci0gICAgICBpbmZvLT5uX29wdF9mb3VuZCA9IGZhbHNlOwotCi0gICAgICAvKiBHZW5lcmFsbHksIGZvciBzdGFicyBpbiB0aGUgc3ltYm9sIHRhYmxlLCB0aGUgTl9MQlJBQyBhbmQKLQkgTl9SQlJBQyBzeW1ib2xzIGFyZSByZWxhdGl2ZSB0byB0aGUgTl9TTyBzeW1ib2wgdmFsdWUuICAqLwotICAgICAgaWYgKCEgaW5mby0+c2VjdGlvbnMpCi0JaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQgPSBpbmZvLT5zb192YWx1ZTsKLQotICAgICAgLyogV2UgbmVlZCB0byByZXNldCB0aGUgbWFwcGluZyBmcm9tIHR5cGUgbnVtYmVycyB0byB0eXBlcy4gIFdlCi0JIGNhbid0IGZyZWUgdGhlIG9sZCBtYXBwaW5nLCBiZWNhdXNlIG9mIHRoZSB1c2Ugb2YKLQkgZGVidWdfbWFrZV9pbmRpcmVjdF90eXBlLiAgKi8KLSAgICAgIGluZm8tPmZpbGVzID0gMTsKLSAgICAgIGluZm8tPmZpbGVfdHlwZXMgPSAoKHN0cnVjdCBzdGFiX3R5cGVzICoqKQotCQkJICB4bWFsbG9jIChzaXplb2YgKmluZm8tPmZpbGVfdHlwZXMpKTsKLSAgICAgIGluZm8tPmZpbGVfdHlwZXNbMF0gPSBOVUxMOwotCi0gICAgICBpbmZvLT5zb19zdHJpbmcgPSBOVUxMOwotCi0gICAgICAvKiBOb3cgcHJvY2VzcyB3aGF0ZXZlciB0eXBlIHdlIGp1c3QgZ290LiAgKi8KLSAgICB9Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlIE5fRk46Ci0gICAgY2FzZSBOX0ZOX1NFUToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0xCUkFDOgotICAgICAgLyogSWdub3JlIGV4dHJhIG91dGVybW9zdCBjb250ZXh0IGZyb20gU3VuUFJPIGNjIGFuZCBhY2MuICAqLwotICAgICAgaWYgKGluZm8tPm5fb3B0X2ZvdW5kICYmIGRlc2MgPT0gMSkKLQlicmVhazsKLQotICAgICAgaWYgKCEgaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiTl9MQlJBQyBub3Qgd2l0aGluIGZ1bmN0aW9uXG4iKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICAvKiBTdGFydCBhbiBpbm5lciBsZXhpY2FsIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIGRlYnVnX3N0YXJ0X2Jsb2NrIChkaGFuZGxlLAotCQkJICAgICAgICh2YWx1ZQotCQkJCSsgaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQKLQkJCQkrIGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldCkpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRW1pdCBhbnkgcGVuZGluZyB2YXJpYWJsZSBkZWZpbml0aW9ucy4gICovCi0gICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICsraW5mby0+YmxvY2tfZGVwdGg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9SQlJBQzoKLSAgICAgIC8qIElnbm9yZSBleHRyYSBvdXRlcm1vc3QgY29udGV4dCBmcm9tIFN1blBSTyBjYyBhbmQgYWNjLiAgKi8KLSAgICAgIGlmIChpbmZvLT5uX29wdF9mb3VuZCAmJiBkZXNjID09IDEpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlIHNob3VsZG4ndCBoYXZlIGFueSBwZW5kaW5nIHZhcmlhYmxlIGRlZmluaXRpb25zIGhlcmUsIGJ1dCwKLSAgICAgICAgIGlmIHdlIGRvLCB3ZSBwcm9iYWJseSBuZWVkIHRvIGVtaXQgdGhlbSBiZWZvcmUgY2xvc2luZyB0aGUKLSAgICAgICAgIGJsb2NrLiAgKi8KLSAgICAgIGlmICghIHN0YWJfZW1pdF9wZW5kaW5nX3ZhcnMgKGRoYW5kbGUsIGluZm8pKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRW5kIGFuIGlubmVyIGxleGljYWwgYmxvY2suICAqLwotICAgICAgaWYgKCEgZGVidWdfZW5kX2Jsb2NrIChkaGFuZGxlLAotCQkJICAgICAodmFsdWUKLQkJCSAgICAgICsgaW5mby0+ZmlsZV9zdGFydF9vZmZzZXQKLQkJCSAgICAgICsgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0KSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAtLWluZm8tPmJsb2NrX2RlcHRoOwotICAgICAgaWYgKGluZm8tPmJsb2NrX2RlcHRoIDwgMCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIlRvbyBtYW55IE5fUkJSQUNzXG4iKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fU086Ci0gICAgICAvKiBUaGlzIGFsd2F5cyBlbmRzIGEgZnVuY3Rpb24uICAqLwotICAgICAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbikKLQl7Ci0JICBiZmRfdm1hIGVuZHZhbDsKLQotCSAgZW5kdmFsID0gdmFsdWU7Ci0JICBpZiAoKnN0cmluZyAhPSAnXDAnCi0JICAgICAgJiYgaW5mby0+ZnVuY3Rpb25fZW5kICE9IChiZmRfdm1hKSAtMQotCSAgICAgICYmIGluZm8tPmZ1bmN0aW9uX2VuZCA8IGVuZHZhbCkKLQkgICAgZW5kdmFsID0gaW5mby0+ZnVuY3Rpb25fZW5kOwotCSAgaWYgKCEgc3RhYl9lbWl0X3BlbmRpbmdfdmFycyAoZGhhbmRsZSwgaW5mbykKLQkgICAgICB8fCAhIGRlYnVnX2VuZF9mdW5jdGlvbiAoZGhhbmRsZSwgZW5kdmFsKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaW5mby0+d2l0aGluX2Z1bmN0aW9uID0gZmFsc2U7Ci0JICBpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JfQotCi0gICAgICAvKiBBbiBlbXB0eSBzdHJpbmcgaXMgZW1pdHRlZCBieSBnY2MgYXQgdGhlIGVuZCBvZiBhIGNvbXBpbGF0aW9uCi0gICAgICAgICB1bml0LiAgKi8KLSAgICAgIGlmICgqc3RyaW5nID09ICdcMCcpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIC8qIEp1c3QgYWNjdW11bGF0ZSBzdHJpbmdzIHVudGlsIHdlIHNlZSBhIG5vbiBOX1NPIHN5bWJvbC4gIElmCi0gICAgICAgICB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgZGlyZWN0b3J5IHNlcGFyYXRvciBvciBzb21lIG90aGVyCi0JIGZvcm0gb2YgYWJzb2x1dGUgcGF0aCBzcGVjaWZpY2F0aW9uLCB3ZSBkaXNjYXJkIHRoZSBwcmV2aW91c2x5Ci0gICAgICAgICBhY2N1bXVsYXRlZCBzdHJpbmdzLiAgKi8KLSAgICAgIGlmIChpbmZvLT5zb19zdHJpbmcgPT0gTlVMTCkKLQlpbmZvLT5zb19zdHJpbmcgPSB4c3RyZHVwIChzdHJpbmcpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmY7Ci0KLQkgIGYgPSBpbmZvLT5zb19zdHJpbmc7Ci0KLQkgIGlmICggICAoc3RyaW5nWzBdID09ICcvJykKLQkgICAgICB8fCAoc3RyaW5nWzBdID09IERJUl9TRVBBUkFUT1IpCi0JICAgICAgfHwgKCAgIChESVJfU0VQQVJBVE9SID09ICdcXCcpCi0JCSAgJiYgKHN0cmluZ1sxXSA9PSAnOicpCi0JCSAgJiYgKCAgIChzdHJpbmdbMl0gPT0gRElSX1NFUEFSQVRPUikKLQkJICAgICAgfHwgKHN0cmluZ1syXSA9PSAnLycpKSkpCi0JICAgIGluZm8tPnNvX3N0cmluZyA9IHhzdHJkdXAgKHN0cmluZyk7Ci0JICBlbHNlCi0JICAgIGluZm8tPnNvX3N0cmluZyA9IGNvbmNhdCAoaW5mby0+c29fc3RyaW5nLCBzdHJpbmcsCi0JCQkJICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0JICBmcmVlIChmKTsKLQl9Ci0KLSAgICAgIGluZm8tPnNvX3ZhbHVlID0gdmFsdWU7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NPTDoKLSAgICAgIC8qIFN0YXJ0IGFuIGluY2x1ZGUgZmlsZS4gICovCi0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGRoYW5kbGUsIHN0cmluZykpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE5fQklOQ0w6Ci0gICAgICAvKiBTdGFydCBhbiBpbmNsdWRlIGZpbGUgd2hpY2ggbWF5IGJlIHJlcGxhY2VkLiAgKi8KLSAgICAgIHB1c2hfYmluY2wgKGluZm8sIHN0cmluZywgdmFsdWUpOwotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfc291cmNlIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VJTkNMOgotICAgICAgLyogRW5kIGFuIE5fQklOQ0wgaW5jbHVkZS4gICovCi0gICAgICBpZiAoISBkZWJ1Z19zdGFydF9zb3VyY2UgKGRoYW5kbGUsIHBvcF9iaW5jbCAoaW5mbykpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VYQ0w6Ci0gICAgICAvKiBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIGEgaGVhZGVyIGZpbGUgbmFtZWQgYnkgTl9CSU5DTCB3aGljaAotICAgICAgICAgd2FzIGVsaW1pbmF0ZWQgYnkgdGhlIGxpbmtlci4gICovCi0gICAgICBpZiAoISBmaW5kX2V4Y2wgKGluZm8sIHN0cmluZywgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX1NMSU5FOgotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX2xpbmUgKGRoYW5kbGUsIGRlc2MsCi0JCQkgICAgICAgdmFsdWUgKyBpbmZvLT5mdW5jdGlvbl9zdGFydF9vZmZzZXQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0JDT01NOgotICAgICAgaWYgKCEgZGVidWdfc3RhcnRfY29tbW9uX2Jsb2NrIChkaGFuZGxlLCBzdHJpbmcpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBOX0VDT01NOgotICAgICAgaWYgKCEgZGVidWdfZW5kX2NvbW1vbl9ibG9jayAoZGhhbmRsZSwgc3RyaW5nKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9GVU46Ci0gICAgICBpZiAoKnN0cmluZyA9PSAnXDAnKQotCXsKLQkgIGlmIChpbmZvLT53aXRoaW5fZnVuY3Rpb24pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGFsd2F5cyBtYXJrcyB0aGUgZW5kIG9mIGEgZnVuY3Rpb247IHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgIG5lZWQgdG8gd29ycnkgYWJvdXQgaW5mby0+ZnVuY3Rpb25fZW5kLiAgKi8KLQkgICAgICBpZiAoaW5mby0+c2VjdGlvbnMpCi0JCXZhbHVlICs9IGluZm8tPmZ1bmN0aW9uX3N0YXJ0X29mZnNldDsKLQkgICAgICBpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCQkgIHx8ICEgZGVidWdfZW5kX2Z1bmN0aW9uIChkaGFuZGxlLCB2YWx1ZSkpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpbmZvLT53aXRoaW5fZnVuY3Rpb24gPSBmYWxzZTsKLQkgICAgICBpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogQSBjb25zdCBzdGF0aWMgc3ltYm9sIGluIHRoZSAudGV4dCBzZWN0aW9uIHdpbGwgaGF2ZSBhbiBOX0ZVTgotICAgICAgICAgZW50cnkuICBXZSBuZWVkIHRvIHVzZSB0aGVzZSB0byBtYXJrIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLAotICAgICAgICAgaW4gY2FzZSB3ZSBhcmUgbG9va2luZyBhdCBnY2Mgb3V0cHV0IGJlZm9yZSBpdCB3YXMgY2hhbmdlZCB0bwotICAgICAgICAgYWx3YXlzIGVtaXQgYW4gZW1wdHkgTl9GVU4uICBXZSBjYW4ndCBjYWxsIGRlYnVnX2VuZF9mdW5jdGlvbgotICAgICAgICAgaGVyZSwgYmVjYXVzZSBpdCBtaWdodCBiZSBhIGxvY2FsIHN0YXRpYyBzeW1ib2wuICAqLwotICAgICAgaWYgKGluZm8tPndpdGhpbl9mdW5jdGlvbgotCSAgJiYgKGluZm8tPmZ1bmN0aW9uX2VuZCA9PSAoYmZkX3ZtYSkgLTEKLQkgICAgICB8fCB2YWx1ZSA8IGluZm8tPmZ1bmN0aW9uX2VuZCkpCi0JaW5mby0+ZnVuY3Rpb25fZW5kID0gdmFsdWU7Ci0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyB0aGUgc3RyaW5nIGZvciBOX1NUU1lNLCBOX0xDU1lNIG9yIE5fUk9TWU0KLSAgICAgICAgIHN5bWJvbHMsIGFuZCBpZiBpdCBkb2VzIG5vdCBzdGFydCB3aXRoIDpTLCBnZGIgcmVsb2NhdGVzIHRoZQotICAgICAgICAgdmFsdWUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLiAgZ2NjIGFsd2F5cyBzZWVtcyB0byB1c2UKLSAgICAgICAgIDpTLCBzbyB3ZSBkb24ndCB3b3JyeSBhYm91dCB0aGlzLiAgKi8KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgZGVmYXVsdDoKLSAgICAgIHsKLQljb25zdCBjaGFyICpjb2xvbjsKLQotCWNvbG9uID0gc3RyY2hyIChzdHJpbmcsICc6Jyk7Ci0JaWYgKGNvbG9uICE9IE5VTEwKLQkgICAgJiYgKGNvbG9uWzFdID09ICdmJyB8fCBjb2xvblsxXSA9PSAnRicpKQotCSAgewotCSAgICBpZiAoaW5mby0+d2l0aGluX2Z1bmN0aW9uKQotCSAgICAgIHsKLQkJYmZkX3ZtYSBlbmR2YWw7Ci0KLQkJZW5kdmFsID0gdmFsdWU7Ci0JCWlmIChpbmZvLT5mdW5jdGlvbl9lbmQgIT0gKGJmZF92bWEpIC0xCi0JCSAgICAmJiBpbmZvLT5mdW5jdGlvbl9lbmQgPCBlbmR2YWwpCi0JCSAgZW5kdmFsID0gaW5mby0+ZnVuY3Rpb25fZW5kOwotCQlpZiAoISBzdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotCQkgICAgfHwgISBkZWJ1Z19lbmRfZnVuY3Rpb24gKGRoYW5kbGUsIGVuZHZhbCkpCi0JCSAgcmV0dXJuIGZhbHNlOwotCQlpbmZvLT5mdW5jdGlvbl9lbmQgPSAoYmZkX3ZtYSkgLTE7Ci0JICAgICAgfQotCSAgICAvKiBGb3Igc3RhYnMgaW4gc2VjdGlvbnMsIGxpbmUgbnVtYmVycyBhbmQgYmxvY2sgYWRkcmVzc2VzCi0gICAgICAgICAgICAgICBhcmUgb2Zmc2V0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uICAqLwotCSAgICBpZiAoaW5mby0+c2VjdGlvbnMpCi0JICAgICAgaW5mby0+ZnVuY3Rpb25fc3RhcnRfb2Zmc2V0ID0gdmFsdWU7Ci0JICAgIGluZm8tPndpdGhpbl9mdW5jdGlvbiA9IHRydWU7Ci0JICB9Ci0KLQlpZiAoISBwYXJzZV9zdGFiX3N0cmluZyAoZGhhbmRsZSwgaW5mbywgdHlwZSwgZGVzYywgdmFsdWUsIHN0cmluZykpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9PUFQ6Ci0gICAgICBpZiAoc3RyaW5nICE9IE5VTEwgJiYgc3RyY21wIChzdHJpbmcsICJnY2MyX2NvbXBpbGVkLiIpID09IDApCi0JaW5mby0+Z2NjX2NvbXBpbGVkID0gMjsKLSAgICAgIGVsc2UgaWYgKHN0cmluZyAhPSBOVUxMICYmIHN0cmNtcCAoc3RyaW5nLCAiZ2NjX2NvbXBpbGVkLiIpID09IDApCi0JaW5mby0+Z2NjX2NvbXBpbGVkID0gMTsKLSAgICAgIGVsc2UKLQlpbmZvLT5uX29wdF9mb3VuZCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTl9PQko6Ci0gICAgY2FzZSBOX0VORE06Ci0gICAgY2FzZSBOX01BSU46Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIHRoZSBzdGFicyBzdHJpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9zdHJpbmcgKGRoYW5kbGUsIGluZm8sIHN0YWJ0eXBlLCBkZXNjLCB2YWx1ZSwgc3RyaW5nKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBpbnQgc3RhYnR5cGU7Ci0gICAgIGludCBkZXNjOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCB0eXBlOwotICBkZWJ1Z190eXBlIGR0eXBlOwotICBib29sZWFuIHN5bm9ueW07Ci0gIGJvb2xlYW4gc2VsZl9jcm9zc3JlZjsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBwID0gc3RyY2hyIChzdHJpbmcsICc6Jyk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgd2hpbGUgKHBbMV0gPT0gJzonKQotICAgIHsKLSAgICAgIHAgKz0gMjsKLSAgICAgIHAgPSBzdHJjaHIgKHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgLyogR0NDIDIueCBwdXRzIHRoZSBsaW5lIG51bWJlciBpbiBkZXNjLiAgU3VuT1MgYXBwYXJlbnRseSBwdXRzIGluCi0gICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgYSB0eXBlIG9yIG9iamVjdCwgd2hpY2ggd2UKLSAgICAgaWdub3JlLiAgKi8KLSAgaWYgKGluZm8tPmdjY19jb21waWxlZCA+PSAyKQotICAgIGxpbmVubyA9IGRlc2M7Ci0gIGVsc2UKLSAgICBsaW5lbm8gPSAwOwotCi0gIC8qIEZJWE1FOiBTb21ldGltZXMgdGhlIHNwZWNpYWwgQysrIG5hbWVzIHN0YXJ0IHdpdGggJy4nLiAgKi8KLSAgbmFtZSA9IE5VTEw7Ci0gIGlmIChzdHJpbmdbMF0gPT0gJyQnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3RyaW5nWzFdKQotCXsKLQljYXNlICd0JzoKLQkgIG5hbWUgPSAidGhpcyI7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIC8qIFdhczogbmFtZSA9ICJ2cHRyIjsgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ2UnOgotCSAgbmFtZSA9ICJlaF90aHJvdyI7Ci0JICBicmVhazsKLQljYXNlICdfJzoKLQkgIC8qIFRoaXMgd2FzIGFuIGFub255bW91cyB0eXBlIHRoYXQgd2FzIG5ldmVyIGZpeGVkIHVwLiAgKi8KLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgLyogU3VuUFJPICgzLjAgYXQgbGVhc3QpIHN0YXRpYyB2YXJpYWJsZSBlbmNvZGluZy4gICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgd2Fybl9zdGFiIChzdHJpbmcsIF8oInVua25vd24gQysrIGVuY29kZWQgbmFtZSIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAocCA9PSBzdHJpbmcgfHwgKHN0cmluZ1swXSA9PSAnICcgJiYgcCA9PSBzdHJpbmcgKyAxKSkKLQluYW1lID0gTlVMTDsKLSAgICAgIGVsc2UKLQluYW1lID0gc2F2ZXN0cmluZyAoc3RyaW5nLCBwIC0gc3RyaW5nKTsKLSAgICB9Ci0KLSAgKytwOwotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSB8fCAqcCA9PSAnKCcgfHwgKnAgPT0gJy0nKQotICAgIHR5cGUgPSAnbCc7Ci0gIGVsc2UKLSAgICB0eXBlID0gKnArKzsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2MnOgotICAgICAgLyogYyBpcyBhIHNwZWNpYWwgY2FzZSwgbm90IGZvbGxvd2VkIGJ5IGEgdHlwZS1udW1iZXIuCi0JIFNZTUJPTDpjPWlWQUxVRSBmb3IgYW4gaW50ZWdlciBjb25zdGFudCBzeW1ib2wuCi0JIFNZTUJPTDpjPXJWQUxVRSBmb3IgYSBmbG9hdGluZyBjb25zdGFudCBzeW1ib2wuCi0JIFNZTUJPTDpjPWVUWVBFLElOVFZBTFVFIGZvciBhbiBlbnVtIGNvbnN0YW50IHN5bWJvbC4KLQkgZS5nLiAiYjpjPWU2LDAiIGZvciAiY29uc3QgYiA9IGJsb2IxIgotCSAod2hlcmUgdHlwZSA2IGlzIGRlZmluZWQgYnkgImJsb2JzOnQ2PWVibG9iMTowLGJsb2IyOjEsOyIpLiAgKi8KLSAgICAgIGlmICgqcCAhPSAnPScpCi0JewotCSAgYmFkX3N0YWIgKHN0cmluZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKytwOwotICAgICAgc3dpdGNoICgqcCsrKQotCXsKLQljYXNlICdyJzoKLQkgIC8qIEZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgKi8KLQkgIGlmICghIGRlYnVnX3JlY29yZF9mbG9hdF9jb25zdCAoZGhhbmRsZSwgbmFtZSwgYXRvZiAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIC8qIEludGVnZXIgY29uc3RhbnQuICAqLwotCSAgLyogRGVmaW5pbmcgaW50ZWdlciBjb25zdGFudHMgdGhpcyB3YXkgaXMga2luZCBvZiBzaWxseSwKLQkgICAgIHNpbmNlICdlJyBjb25zdGFudHMgYWxsb3dzIHRoZSBjb21waWxlciB0byBnaXZlIG5vdCBvbmx5Ci0JICAgICB0aGUgdmFsdWUsIGJ1dCB0aGUgdHlwZSBhcyB3ZWxsLiAgQyBoYXMgYXQgbGVhc3QgaW50LAotCSAgICAgbG9uZywgdW5zaWduZWQgaW50LCBhbmQgbG9uZyBsb25nIGFzIGNvbnN0YW50IHR5cGVzOwotCSAgICAgb3RoZXIgbGFuZ3VhZ2VzIHByb2JhYmx5IHNob3VsZCBoYXZlIGF0IGxlYXN0IHVuc2lnbmVkIGFzCi0JICAgICB3ZWxsIGFzIHNpZ25lZCBjb25zdGFudHMuICAqLwotCSAgaWYgKCEgZGVidWdfcmVjb3JkX2ludF9jb25zdCAoZGhhbmRsZSwgbmFtZSwgYXRvaSAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIC8qIFNZTUJPTDpjPWVUWVBFLElOVFZBTFVFIGZvciBhIGNvbnN0YW50IHN5bWJvbCB3aG9zZSB2YWx1ZQotCSAgICAgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGludGVncmFsLgotCSAgICAgZS5nLiAiYjpjPWU2LDAiIGZvciAiY29uc3QgYiA9IGJsb2IxIgotCSAgICAgKHdoZXJlIHR5cGUgNiBpcyBkZWZpbmVkIGJ5ICJibG9iczp0Nj1lYmxvYjE6MCxibG9iMjoxLDsiKS4gICovCi0JICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkgICAmcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaWYgKCpwICE9ICcsJykKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChzdHJpbmcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgaWYgKCEgZGVidWdfcmVjb3JkX3R5cGVkX2NvbnN0IChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgYXRvaSAocCkpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYmFkX3N0YWIgKHN0cmluZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgLyogVGhlIG5hbWUgb2YgYSBjYXVnaHQgZXhjZXB0aW9uLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJICAgICAgICZwLCAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9sYWJlbCAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgLyogQSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9mdW5jdGlvbiAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIHR5cGUgPT0gJ0YnLCB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICAvKiBTdW4gYWNjIHB1dHMgZGVjbGFyZWQgdHlwZXMgb2YgYXJndW1lbnRzIGhlcmUuICBXZSBkb24ndCBjYXJlCi0JIGFib3V0IHRoZWlyIGFjdHVhbCB0eXBlcyAoRklYTUUgLS0gd2Ugc2hvdWxkIHJlbWVtYmVyIHRoZSB3aG9sZQotCSBmdW5jdGlvbiBwcm90b3R5cGUpLCBidXQgdGhlIGxpc3QgbWF5IGRlZmluZSBzb21lIG5ldyB0eXBlcwotCSB0aGF0IHdlIGhhdmUgdG8gcmVtZW1iZXIsIHNvIHdlIG11c3Qgc2NhbiBpdCBub3cuICAqLwotICAgICAgd2hpbGUgKCpwID09ICc7JykKLQl7Ci0JICArK3A7Ci0JICBpZiAocGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCkKLQkgICAgICA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICB7Ci0JY2hhciBsZWFkaW5nOwotCWxvbmcgYzsKLQlhc3ltYm9sICoqcHM7Ci0KLQkvKiBBIGdsb2JhbCBzeW1ib2wuICBUaGUgdmFsdWUgbXVzdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUKLQkgICBzeW1ib2wgdGFibGUuICAqLwotCWR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICByZXR1cm4gZmFsc2U7Ci0JbGVhZGluZyA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoaW5mby0+YWJmZCk7Ci0JZm9yIChjID0gaW5mby0+c3ltY291bnQsIHBzID0gaW5mby0+c3ltczsgYyA+IDA7IC0tYywgKytwcykKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbjsKLQotCSAgICBuID0gYmZkX2FzeW1ib2xfbmFtZSAoKnBzKTsKLQkgICAgaWYgKGxlYWRpbmcgIT0gJ1wwJyAmJiAqbiA9PSBsZWFkaW5nKQotCSAgICAgICsrbjsKLQkgICAgaWYgKCpuID09ICpuYW1lICYmIHN0cmNtcCAobiwgbmFtZSkgPT0gMCkKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoYyA+IDApCi0JICB2YWx1ZSA9IGJmZF9hc3ltYm9sX3ZhbHVlICgqcHMpOwotCWlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfR0xPQkFMLAotCQkJCSAgICB2YWx1ZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogVGhpcyBjYXNlIGlzIGZha2VkIGJ5IGEgY29uZGl0aW9uYWwgYWJvdmUsIHdoZW4gdGhlcmUgaXMgbm8KLQkgY29kZSBsZXR0ZXIgaW4gdGhlIGRieCBkYXRhLiAgRGJ4IGRhdGEgbmV2ZXIgYWN0dWFsbHkKLQkgY29udGFpbnMgJ2wnLiAgKi8KLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdzJzoKLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfTE9DQUwsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICAgIC8qIEEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLSAgICAgIGlmICgqcCAhPSAnRicpCi0JZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBlbHNlCi0JewotCS8qIHBGIGlzIGEgdHdvLWxldHRlciBjb2RlIHRoYXQgbWVhbnMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIgaW4KLQkgICBGb3J0cmFuLiAgVGhlIHR5cGUtbnVtYmVyIHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuCi0JICAgdmFsdWUuICBUcmFuc2xhdGUgaXQgaW50byBhIHBvaW50ZXItdG8tZnVuY3Rpb24gdHlwZS4gICovCi0JICArK3A7Ci0JICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkJICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGR0eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgewotCSAgICAgIGRlYnVnX3R5cGUgZnR5cGU7Ci0KLQkgICAgICBmdHlwZSA9IGRlYnVnX21ha2VfZnVuY3Rpb25fdHlwZSAoZGhhbmRsZSwgZHR5cGUsCi0JCQkJCQkoZGVidWdfdHlwZSAqKSBOVUxMLCBmYWxzZSk7Ci0JICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3BvaW50ZXJfdHlwZSAoZGhhbmRsZSwgZnR5cGUpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9TVEFDSywKLQkJCQkgICAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IEF0IHRoaXMgcG9pbnQgZ2RiIGNvbnNpZGVycyByZWFycmFuZ2luZyB0aGUgcGFyYW1ldGVyCi0JIGFkZHJlc3Mgb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgaWYgaXQgaXMgc21hbGxlciB0aGFuIGFuIGludC4KLQkgV2UgaGF2ZSBubyB3YXkgdG8gZG8gdGhhdCwgc2luY2Ugd2UgZG9uJ3QgcmVhbGx5IGtub3cgbXVjaAotCSBhYm91dCB0aGUgdGFyZ2V0LiAgKi8KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdQJzoKLSAgICAgIGlmIChzdGFidHlwZSA9PSBOX0ZVTikKLQl7Ci0JICAvKiBQcm90b3R5cGUgb2YgYSBmdW5jdGlvbiByZWZlcmVuY2VkIGJ5IHRoaXMgZmlsZS4gICovCi0JICB3aGlsZSAoKnAgPT0gJzsnKQotCSAgICB7Ci0JICAgICAgKytwOwotCSAgICAgIGlmIChwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJCSAgIChkZWJ1Z190eXBlICoqKSBOVUxMKQotCQkgID09IERFQlVHX1RZUEVfTlVMTCkKLQkJcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJ1InOgotICAgICAgLyogUGFyYW1ldGVyIHdoaWNoIGlzIGluIGEgcmVnaXN0ZXIuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3BhcmFtZXRlciAoZGhhbmRsZSwgbmFtZSwgZHR5cGUsIERFQlVHX1BBUk1fUkVHLAotCQkJCSAgICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIC8qIFJlZ2lzdGVyIHZhcmlhYmxlIChlaXRoZXIgZ2xvYmFsIG9yIGxvY2FsKS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsIERFQlVHX1JFR0lTVEVSLAotCQkJCSAgdmFsdWUpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgLyogRklYTUU6IEF0IHRoaXMgcG9pbnQgZ2RiIGNoZWNrcyB0byBjb21iaW5lIHBhaXJzIG9mICdwJyBhbmQKLQkgJ3InIHN0YWJzIGludG8gYSBzaW5nbGUgJ1AnIHN0YWIuICAqLwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgLyogU3RhdGljIHN5bWJvbCBhdCB0b3AgbGV2ZWwgb2YgZmlsZSAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsICZwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdmFyaWFibGUgKGRoYW5kbGUsIGluZm8sIG5hbWUsIGR0eXBlLCBERUJVR19TVEFUSUMsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIC8qIEEgdHlwZWRlZi4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgJnAsICZzbG90KTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQl7Ci0JICAvKiBBIG5hbWVsZXNzIHR5cGUuICBOb3RoaW5nIHRvIGRvLiAgKi8KLQkgIHJldHVybiB0cnVlOwotCX0KLQotICAgICAgZHR5cGUgPSBkZWJ1Z19uYW1lX3R5cGUgKGRoYW5kbGUsIG5hbWUsIGR0eXBlKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoc2xvdCAhPSBOVUxMKQotCSpzbG90ID0gZHR5cGU7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVCc6Ci0gICAgICAvKiBTdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHRhZy4gIEZvciBHTlUgQysrLCB0aGlzIGNhbiBiZSBiZSBmb2xsb3dlZAotCSBieSAndCcgd2hpY2ggbWVhbnMgd2UgYXJlIHR5cGVkZWYnaW5nIGl0IGFzIHdlbGwuICAqLwotICAgICAgaWYgKCpwICE9ICd0JykKLQl7Ci0JICBzeW5vbnltID0gZmFsc2U7Ci0JICAvKiBGSVhNRTogZ2RiIHNldHMgc3lub255bSB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGxhbmd1YWdlCi0gICAgICAgICAgICAgaXMgQysrLiAgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3lub255bSA9IHRydWU7Ci0JICArK3A7Ci0JfQotCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgJnAsICZzbG90KTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgLyogSU5GTy0+U0VMRl9DUk9TU1JFRiBpcyBzZXQgYnkgcGFyc2Vfc3RhYl90eXBlIGlmIHRoaXMgdHlwZSBpcwotICAgICAgICAgYSBjcm9zcyByZWZlcmVuY2UgdG8gaXRzZWxmLiAgVGhlc2UgYXJlIGdlbmVyYXRlZCBieSBzb21lCi0gICAgICAgICB2ZXJzaW9ucyBvZiBnKysuICAqLwotICAgICAgc2VsZl9jcm9zc3JlZiA9IGluZm8tPnNlbGZfY3Jvc3NyZWY7Ci0KLSAgICAgIGR0eXBlID0gZGVidWdfdGFnX3R5cGUgKGRoYW5kbGUsIG5hbWUsIGR0eXBlKTsKLSAgICAgIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHNsb3QgIT0gTlVMTCkKLQkqc2xvdCA9IGR0eXBlOwotCi0gICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhIGNyb3NzIHJlZmVyZW5jZSB0byB0aGlzIHRhZyB3aGljaCB3ZSBjYW4gbm93Ci0gICAgICAgICBmaWxsIGluLiAgQXZvaWQgZmlsbGluZyBpbiBhIGNyb3NzIHJlZmVyZW5jZSB0byBvdXJzZWx2ZXMsCi0gICAgICAgICBiZWNhdXNlIHRoYXQgd291bGQgbGVhZCB0byBjaXJjdWxhciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgICAgaWYgKCEgc2VsZl9jcm9zc3JlZikKLQl7Ci0JICByZWdpc3RlciBzdHJ1Y3Qgc3RhYl90YWcgKipwc3Q7Ci0KLQkgIGZvciAocHN0ID0gJmluZm8tPnRhZ3M7ICpwc3QgIT0gTlVMTDsgcHN0ID0gJigqcHN0KS0+bmV4dCkKLQkgICAgewotCSAgICAgIGlmICgoKnBzdCktPm5hbWVbMF0gPT0gbmFtZVswXQotCQkgICYmIHN0cmNtcCAoKCpwc3QpLT5uYW1lLCBuYW1lKSA9PSAwKQotCQl7Ci0JCSAgKCpwc3QpLT5zbG90ID0gZHR5cGU7Ci0JCSAgKnBzdCA9ICgqcHN0KS0+bmV4dDsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc3lub255bSkKLQl7Ci0JICBkdHlwZSA9IGRlYnVnX25hbWVfdHlwZSAoZGhhbmRsZSwgbmFtZSwgZHR5cGUpOwotCSAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIGZhbHNlOwotCi0JICBpZiAoc2xvdCAhPSBOVUxMKQotCSAgICAqc2xvdCA9IGR0eXBlOwotCX0KLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIC8qIFN0YXRpYyBzeW1ib2wgb2YgbG9jYWwgc2NvcGUgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0gICAgICBpZiAoISBzdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgZHR5cGUsCi0JCQkJICBERUJVR19MT0NBTF9TVEFUSUMsIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3YnOgotICAgICAgLyogUmVmZXJlbmNlIHBhcmFtZXRlci4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgJnAsCi0JCQkgICAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGR0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfcGFyYW1ldGVyIChkaGFuZGxlLCBuYW1lLCBkdHlwZSwgREVCVUdfUEFSTV9SRUZFUkVOQ0UsCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2EnOgotICAgICAgLyogUmVmZXJlbmNlIHBhcmFtZXRlciB3aGljaCBpcyBpbiBhIHJlZ2lzdGVyLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIGRlYnVnX3JlY29yZF9wYXJhbWV0ZXIgKGRoYW5kbGUsIG5hbWUsIGR0eXBlLCBERUJVR19QQVJNX1JFRl9SRUcsCi0JCQkJICAgIHZhbHVlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgICAgLyogVGhpcyBpcyB1c2VkIGJ5IFN1biBGT1JUUkFOIGZvciAiZnVuY3Rpb24gcmVzdWx0IHZhbHVlIi4KLQkgU3VuIGNsYWltcyAoImRieCBhbmQgZGJ4dG9vbCBpbnRlcmZhY2VzIiwgMm5kIGVkKQotCSB0aGF0IFBhc2NhbCB1c2VzIGl0IHRvbywgYnV0IHdoZW4gSSB0cmllZCBpdCBQYXNjYWwgdXNlZAotCSAieDozIiAobG9jYWwgc3ltYm9sKSBpbnN0ZWFkLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCAmcCwKLQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmICghIHN0YWJfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBpbmZvLCBuYW1lLCBkdHlwZSwgREVCVUdfTE9DQUwsCi0JCQkJICB2YWx1ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYmFkX3N0YWIgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIEZJWE1FOiBnZGIgY29udmVydHMgc3RydWN0dXJlIHZhbHVlcyB0byBzdHJ1Y3R1cmUgcG9pbnRlcnMgaW4gYQotICAgICBjb3VwbGUgb2YgY2FzZXMsIGRlcGVuZGluZyB1cG9uIHRoZSB0YXJnZXQuICAqLwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHN0YWJzIHR5cGUuICBUaGUgdHlwZW5hbWUgYXJndW1lbnQgaXMgbm9uLU5VTEwgaWYgdGhpcyBpcyBhCi0gICB0eXBlZGVmIG9yIGEgdGFnIGRlZmluaXRpb24uICBUaGUgcHAgYXJndW1lbnQgcG9pbnRzIHRvIHRoZSBzdGFiCi0gICBzdHJpbmcsIGFuZCBpcyB1cGRhdGVkLiAgVGhlIHNsb3RwIGFyZ3VtZW50IHBvaW50cyB0byBhIHBsYWNlIHRvCi0gICBzdG9yZSB0aGUgc2xvdCB1c2VkIGlmIHRoZSB0eXBlIGlzIGJlaW5nIGRlZmluZWQuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsIHNsb3RwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICoqc2xvdHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGludCB0eXBlbnVtc1syXTsKLSAgaW50IHNpemU7Ci0gIGJvb2xlYW4gc3RyaW5ncDsKLSAgaW50IGRlc2NyaXB0b3I7Ci0gIGRlYnVnX3R5cGUgZHR5cGU7Ci0KLSAgaWYgKHNsb3RwICE9IE5VTEwpCi0gICAgKnNsb3RwID0gTlVMTDsKLQotICBvcmlnID0gKnBwOwotCi0gIHNpemUgPSAtMTsKLSAgc3RyaW5ncCA9IGZhbHNlOwotCi0gIGluZm8tPnNlbGZfY3Jvc3NyZWYgPSBmYWxzZTsKLQotICAvKiBSZWFkIHR5cGUgbnVtYmVyIGlmIHByZXNlbnQuICBUaGUgdHlwZSBudW1iZXIgbWF5IGJlIG9taXR0ZWQuCi0gICAgIGZvciBpbnN0YW5jZSBpbiBhIHR3by1kaW1lbnNpb25hbCBhcnJheSBkZWNsYXJlZCB3aXRoIHR5cGUKLSAgICAgImFyMTsxOzEwO2FyMTsxOzEwOzQiLiAgKi8KLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApICYmICoqcHAgIT0gJygnICYmICoqcHAgIT0gJy0nKQotICAgIHsKLSAgICAgIC8qICd0eXBlbnVtcz0nIG5vdCBwcmVzZW50LCB0eXBlIGlzIGFub255bW91cy4gIFJlYWQgYW5kIHJldHVybgotCSB0aGUgZGVmaW5pdGlvbiwgYnV0IGRvbid0IHB1dCBpdCBpbiB0aGUgdHlwZSB2ZWN0b3IuICAqLwotICAgICAgdHlwZW51bXNbMF0gPSB0eXBlbnVtc1sxXSA9IC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHBhcnNlX3N0YWJfdHlwZV9udW1iZXIgKHBwLCB0eXBlbnVtcykpCi0JcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgaWYgKCoqcHAgIT0gJz0nKQotCXsKLQkgIC8qIFR5cGUgaXMgbm90IGJlaW5nIGRlZmluZWQgaGVyZS4gIEVpdGhlciBpdCBhbHJlYWR5Ci0JICAgICBleGlzdHMsIG9yIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSB0byBpdC4gICovCi0JICByZXR1cm4gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKTsKLQl9Ci0KLSAgICAgIC8qIE9ubHkgc2V0IHRoZSBzbG90IGlmIHRoZSB0eXBlIGlzIGJlaW5nIGRlZmluZWQuICBUaGlzIG1lYW5zCi0gICAgICAgICB0aGF0IHRoZSBtYXBwaW5nIGZyb20gdHlwZSBudW1iZXJzIHRvIHR5cGVzIHdpbGwgb25seSByZWNvcmQKLSAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIHdoaWNoIGRlZmluZXMgYSB0eXBlLiAgSWYgd2UgZG9uJ3QgZG8KLSAgICAgICAgIHRoaXMsIHRoZW4gc29tZXRoaW5nIGxpa2UKLQkgICAgIHR5cGVkZWYgaW50IGZvbzsKLQkgICAgIGludCBpOwotCSB3aWxsIHJlY29yZCB0aGF0IGkgaXMgb2YgdHlwZSBmb28uICBVbmZvcnR1bmF0ZWx5LCBzdGFicwotCSBpbmZvcm1hdGlvbiBpcyBhbWJpZ3VvdXMgYWJvdXQgdmFyaWFibGUgdHlwZXMuICBGb3IgdGhpcyBjb2RlLAotCSAgICAgdHlwZWRlZiBpbnQgZm9vOwotCSAgICAgaW50IGk7Ci0JICAgICBmb28gajsKLQkgdGhlIHN0YWJzIGluZm9ybWF0aW9uIHJlY29yZHMgYm90aCBpIGFuZCBqIGFzIGhhdmluZyB0aGUgc2FtZQotCSB0eXBlLiAgVGhpcyBjb3VsZCBiZSBmaXhlZCBieSBwYXRjaGluZyB0aGUgY29tcGlsZXIuICAqLwotICAgICAgaWYgKHNsb3RwICE9IE5VTEwgJiYgdHlwZW51bXNbMF0gPj0gMCAmJiB0eXBlbnVtc1sxXSA+PSAwKQotCSpzbG90cCA9IHN0YWJfZmluZF9zbG90IChpbmZvLCB0eXBlbnVtcyk7Ci0KLSAgICAgIC8qIFR5cGUgaXMgYmVpbmcgZGVmaW5lZCBoZXJlLiAgKi8KLSAgICAgIC8qIFNraXAgdGhlICc9Jy4gICovCi0gICAgICArKypwcDsKLQotICAgICAgd2hpbGUgKCoqcHAgPT0gJ0AnKQotCXsKLQkgIGNvbnN0IGNoYXIgKnAgPSAqcHAgKyAxOwotCSAgY29uc3QgY2hhciAqYXR0cjsKLQotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJygnIHx8ICpwID09ICctJykKLQkgICAgewotCSAgICAgIC8qIE1lbWJlciB0eXBlLiAgKi8KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBUeXBlIGF0dHJpYnV0ZXMuICAqLwotCSAgYXR0ciA9IHA7Ci0KLQkgIGZvciAoOyAqcCAhPSAnOyc7ICsrcCkKLQkgICAgewotCSAgICAgIGlmICgqcCA9PSAnXDAnKQotCQl7Ci0JCSAgYmFkX3N0YWIgKG9yaWcpOwotCQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JCX0KLQkgICAgfQotCSAgKnBwID0gcCArIDE7Ci0KLQkgIHN3aXRjaCAoKmF0dHIpCi0JICAgIHsKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgc2l6ZSA9IGF0b2kgKGF0dHIgKyAxKTsKLQkgICAgICBpZiAoc2l6ZSA8PSAwKQotCQlzaXplID0gLTE7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgc3RyaW5ncCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBJZ25vcmUgdW5yZWNvZ25pemVkIHR5cGUgYXR0cmlidXRlcywgc28gZnV0dXJlCi0JCSBjb21waWxlcnMgY2FuIGludmVudCBuZXcgb25lcy4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGRlc2NyaXB0b3IgPSAqKnBwOwotICArKypwcDsKLQotICBzd2l0Y2ggKGRlc2NyaXB0b3IpCi0gICAgewotICAgIGNhc2UgJ3gnOgotICAgICAgewotCWVudW0gZGVidWdfdHlwZV9raW5kIGNvZGU7Ci0JY29uc3QgY2hhciAqcTEsICpxMiwgKnA7Ci0KLQkvKiBBIGNyb3NzIHJlZmVyZW5jZSB0byBhbm90aGVyIHR5cGUuICAqLwotCi0Jc3dpdGNoICgqKnBwKQotCSAgewotCSAgY2FzZSAncyc6Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX1NUUlVDVDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICd1JzoKLQkgICAgY29kZSA9IERFQlVHX0tJTkRfVU5JT047Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnZSc6Ci0JICAgIGNvZGUgPSBERUJVR19LSU5EX0VOVU07Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgLyogQ29tcGxhaW4gYW5kIGtlZXAgZ29pbmcsIHNvIGNvbXBpbGVycyBjYW4gaW52ZW50IG5ldwotCSAgICAgICBjcm9zcy1yZWZlcmVuY2UgdHlwZXMuICAqLwotCSAgICB3YXJuX3N0YWIgKG9yaWcsIF8oInVucmVjb2duaXplZCBjcm9zcyByZWZlcmVuY2UgdHlwZSIpKTsKLQkgICAgY29kZSA9IERFQlVHX0tJTkRfU1RSVUNUOwotCSAgICBicmVhazsKLQkgIH0KLQkrKypwcDsKLQotCXExID0gc3RyY2hyICgqcHAsICc8Jyk7Ci0JcCA9IHN0cmNociAoKnBwLCAnOicpOwotCWlmIChwID09IE5VTEwpCi0JICB7Ci0JICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQl3aGlsZSAocTEgIT0gTlVMTCAmJiBwID4gcTEgJiYgcFsxXSA9PSAnOicpCi0JICB7Ci0JICAgIHEyID0gc3RyY2hyIChxMSwgJz4nKTsKLQkgICAgaWYgKHEyID09IE5VTEwgfHwgcTIgPCBwKQotCSAgICAgIGJyZWFrOwotCSAgICBwICs9IDI7Ci0JICAgIHAgPSBzdHJjaHIgKHAsICc6Jyk7Ci0JICAgIGlmIChwID09IE5VTEwpCi0JICAgICAgewotCQliYWRfc3RhYiAob3JpZyk7Ci0JCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgfQotCSAgfQotCi0JLyogU29tZSB2ZXJzaW9ucyBvZiBnKysgY2FuIGVtaXQgc3RhYnMgbGlrZQotCSAgICAgICBmbGVlcDpUMjA9eHNmbGVlcDoKLQkgICB3aGljaCBkZWZpbmUgc3RydWN0dXJlcyBpbiB0ZXJtcyBvZiB0aGVtc2VsdmVzLiAgV2UgbmVlZCB0bwotCSAgIHRlbGwgdGhlIGNhbGxlciB0byBhdm9pZCBidWlsZGluZyBhIGNpcmN1bGFyIHN0cnVjdHVyZS4gICovCi0JaWYgKHR5cGVuYW1lICE9IE5VTEwKLQkgICAgJiYgc3RybmNtcCAodHlwZW5hbWUsICpwcCwgcCAtICpwcCkgPT0gMAotCSAgICAmJiB0eXBlbmFtZVtwIC0gKnBwXSA9PSAnXDAnKQotCSAgaW5mby0+c2VsZl9jcm9zc3JlZiA9IHRydWU7Ci0KLQlkdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgaW5mbywgKnBwLCBwIC0gKnBwLCBjb2RlKTsKLQotCSpwcCA9IHAgKyAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICctJzoKLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICBjYXNlICcyJzoKLSAgICBjYXNlICczJzoKLSAgICBjYXNlICc0JzoKLSAgICBjYXNlICc1JzoKLSAgICBjYXNlICc2JzoKLSAgICBjYXNlICc3JzoKLSAgICBjYXNlICc4JzoKLSAgICBjYXNlICc5JzoKLSAgICBjYXNlICcoJzoKLSAgICAgIHsKLQljb25zdCBjaGFyICpob2xkOwotCWludCB4dHlwZW51bXNbMl07Ci0KLQkvKiBUaGlzIHR5cGUgaXMgZGVmaW5lZCBhcyBhbm90aGVyIHR5cGUuICAqLwotCi0JKCpwcCktLTsKLQlob2xkID0gKnBwOwotCi0JLyogUGVlayBhaGVhZCBhdCB0aGUgbnVtYmVyIHRvIGRldGVjdCB2b2lkLiAgKi8KLQlpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgeHR5cGVudW1zKSkKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQlpZiAodHlwZW51bXNbMF0gPT0geHR5cGVudW1zWzBdICYmIHR5cGVudW1zWzFdID09IHh0eXBlbnVtc1sxXSkKLQkgIHsKLQkgICAgLyogVGhpcyB0eXBlIGlzIGJlaW5nIGRlZmluZWQgYXMgaXRzZWxmLCB3aGljaCBtZWFucyB0aGF0Ci0gICAgICAgICAgICAgICBpdCBpcyB2b2lkLiAgKi8KLQkgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICAqcHAgPSBob2xkOwotCi0JICAgIC8qIEdvIGJhY2sgdG8gdGhlIG51bWJlciBhbmQgaGF2ZSBwYXJzZV9zdGFiX3R5cGUgZ2V0IGl0LgotCSAgICAgICBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIGRlYWwgd2l0aCBzb21ldGhpbmcgbGlrZQotCSAgICAgICB0KDEsMik9KDMsNCk9Li4uIHdoaWNoIHRoZSBMdWNpZCBjb21waWxlciB1c2VzLiAgKi8KLQkgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJICAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgICBpZiAoZHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICB9Ci0KLQlpZiAodHlwZW51bXNbMF0gIT0gLTEpCi0JICB7Ci0JICAgIGlmICghIHN0YWJfcmVjb3JkX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zLCBkdHlwZSkpCi0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgIH0KLQotCWJyZWFrOwotICAgICAgfQotCi0gICAgY2FzZSAnKic6Ci0gICAgICBkdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChkaGFuZGxlLAotCQkJCSAgICAgICBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkJKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCQlwcCwKLQkJCQkJCQkoZGVidWdfdHlwZSAqKikgTlVMTCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcmJzoKLSAgICAgIC8qIFJlZmVyZW5jZSB0byBhbm90aGVyIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV9yZWZlcmVuY2VfdHlwZQotCSAgICAgICAoZGhhbmRsZSwKLQkJcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgKGRlYnVnX3R5cGUgKiopIE5VTEwpKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2YnOgotICAgICAgLyogRnVuY3Rpb24gcmV0dXJuaW5nIGFub3RoZXIgdHlwZS4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBvczlrX3N0YWJzIGhlcmUuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV9mdW5jdGlvbl90eXBlCi0JICAgICAgIChkaGFuZGxlLAotCQlwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCksCi0JCShkZWJ1Z190eXBlICopIE5VTEwsIGZhbHNlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgLyogQ29uc3QgcXVhbGlmaWVyIG9uIHNvbWUgdHlwZSAoU3VuKS4gICovCi0gICAgICAvKiBGSVhNRTogZ2RiIGFjY2VwdHMgJ2MnIGhlcmUgaWYgb3M5a19zdGFicy4gICovCi0gICAgICBkdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAoZGhhbmRsZSwKLQkJCQkgICAgIHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKLQkJCQkJCSAgICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCQkgICAgICBwcCwKLQkJCQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgLyogVm9sYXRpbGUgcXVhbCBvbiBzb21lIHR5cGUgKFN1bikuICAqLwotICAgICAgLyogRklYTUU6IGdkYiBhY2NlcHRzICdpJyBoZXJlIGlmIG9zOWtfc3RhYnMuICAqLwotICAgICAgZHR5cGUgPSAoZGVidWdfbWFrZV92b2xhdGlsZV90eXBlCi0JICAgICAgIChkaGFuZGxlLAotCQlwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAoZGVidWdfdHlwZSAqKikgTlVMTCkpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQCc6Ci0gICAgICAvKiBPZmZzZXQgKGNsYXNzICYgdmFyaWFibGUpIHR5cGUuICBUaGlzIGlzIHVzZWQgZm9yIGEgcG9pbnRlcgotICAgICAgICAgcmVsYXRpdmUgdG8gYW4gb2JqZWN0LiAgKi8KLSAgICAgIHsKLQlkZWJ1Z190eXBlIGRvbWFpbjsKLQlkZWJ1Z190eXBlIG1lbXR5cGU7Ci0KLQkvKiBNZW1iZXIgdHlwZS4gICovCi0KLQlkb21haW4gPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChkb21haW4gPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCWlmICgqKnBwICE9ICcsJykKLQkgIHsKLQkgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgfQotCSsrKnBwOwotCi0JbWVtdHlwZSA9IHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywgKGNvbnN0IGNoYXIgKikgTlVMTCwgcHAsCi0JCQkJICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCWlmIChtZW10eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQlkdHlwZSA9IGRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUgKGRoYW5kbGUsIGRvbWFpbiwgbWVtdHlwZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyMnOgotICAgICAgLyogTWV0aG9kIChjbGFzcyAmIGZuKSB0eXBlLiAgKi8KLSAgICAgIGlmICgqKnBwID09ICcjJykKLQl7Ci0JICBkZWJ1Z190eXBlIHJldHVybl90eXBlOwotCi0JICArKypwcDsKLQkgIHJldHVybl90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgIGlmIChyZXR1cm5fdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICBpZiAoKipwcCAhPSAnOycpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQkgICAgfQotCSAgKysqcHA7Ci0JICBkdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLAotCQkJCQkgIERFQlVHX1RZUEVfTlVMTCwKLQkJCQkJICAoZGVidWdfdHlwZSAqKSBOVUxMLCBmYWxzZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlYnVnX3R5cGUgZG9tYWluOwotCSAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLQkgIGRlYnVnX3R5cGUgKmFyZ3M7Ci0JICB1bnNpZ25lZCBpbnQgbjsKLQkgIHVuc2lnbmVkIGludCBhbGxvYzsKLQkgIGJvb2xlYW4gdmFyYXJnczsKLQotCSAgZG9tYWluID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKGRvbWFpbiA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLQkgIGlmICgqKnBwICE9ICcsJykKLQkgICAgewotCSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLQkgICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCSAgICB9Ci0JICArKypwcDsKLQotCSAgcmV0dXJuX3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotCSAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotCSAgYWxsb2MgPSAxMDsKLQkgIGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqYXJncyk7Ci0JICBuID0gMDsKLQkgIHdoaWxlICgqKnBwICE9ICc7JykKLQkgICAgewotCSAgICAgIGlmICgqKnBwICE9ICcsJykKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCQl9Ci0JICAgICAgKysqcHA7Ci0KLQkgICAgICBpZiAobiArIDEgPj0gYWxsb2MpCi0JCXsKLQkJICBhbGxvYyArPSAxMDsKLQkJICBhcmdzID0gKChkZWJ1Z190eXBlICopCi0JCQkgIHhyZWFsbG9jICgoUFRSKSBhcmdzLCBhbGxvYyAqIHNpemVvZiAqYXJncykpOwotCQl9Ci0KLQkgICAgICBhcmdzW25dID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgcHAsIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgICAgICBpZiAoYXJnc1tuXSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgKytuOwotCSAgICB9Ci0JICArKypwcDsKLQotCSAgLyogSWYgdGhlIGxhc3QgdHlwZSBpcyBub3Qgdm9pZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIHRha2VzIGEKLQkgICAgIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMuICBPdGhlcndpc2UsIHdlIG11c3Qgc3RyaXAKLQkgICAgIHRoZSB2b2lkIHR5cGUuICAqLwotCSAgaWYgKG4gPT0gMAotCSAgICAgIHx8IGRlYnVnX2dldF90eXBlX2tpbmQgKGRoYW5kbGUsIGFyZ3NbbiAtIDFdKSAhPSBERUJVR19LSU5EX1ZPSUQpCi0JICAgIHZhcmFyZ3MgPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLS1uOwotCSAgICAgIHZhcmFyZ3MgPSBmYWxzZTsKLQkgICAgfQotCi0JICBhcmdzW25dID0gREVCVUdfVFlQRV9OVUxMOwotCi0JICBkdHlwZSA9IGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBkb21haW4sIGFyZ3MsCi0JCQkJCSAgdmFyYXJncyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIC8qIFJhbmdlIHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwgdHlwZW51bXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICAgIC8qIEZJWE1FOiBnZGIgY2hlY2tzIG9zOWtfc3RhYnMgaGVyZS4gICovCi0gICAgICAvKiBTdW4gQUNDIGJ1aWx0aW4gaW50IHR5cGUuICAqLwotICAgICAgZHR5cGUgPSBwYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAvKiBTdW4gQUNDIGJ1aWx0aW4gZmxvYXQgdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfc3VuX2Zsb2F0aW5nX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZSc6Ci0gICAgICAvKiBFbnVtZXJhdGlvbiB0eXBlLiAgKi8KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9lbnVtX3R5cGUgKGRoYW5kbGUsIHBwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAndSc6Ci0gICAgICAvKiBTdHJ1Y3Qgb3IgdW5pb24gdHlwZS4gICovCi0gICAgICBkdHlwZSA9IHBhcnNlX3N0YWJfc3RydWN0X3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVuYW1lLCBwcCwKLQkJCQkgICAgICBkZXNjcmlwdG9yID09ICdzJywgdHlwZW51bXMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdhJzoKLSAgICAgIC8qIEFycmF5IHR5cGUuICAqLwotICAgICAgaWYgKCoqcHAgIT0gJ3InKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIGR0eXBlID0gcGFyc2Vfc3RhYl9hcnJheV90eXBlIChkaGFuZGxlLCBpbmZvLCBwcCwgc3RyaW5ncCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1MnOgotICAgICAgZHR5cGUgPSBkZWJ1Z19tYWtlX3NldF90eXBlIChkaGFuZGxlLAotCQkJCSAgIHBhcnNlX3N0YWJfdHlwZSAoZGhhbmRsZSwgaW5mbywKLQkJCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkJICAgIHBwLAotCQkJCQkJICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKSwKLQkJCQkgICBzdHJpbmdwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmIChkdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQotICBpZiAodHlwZW51bXNbMF0gIT0gLTEpCi0gICAgewotICAgICAgaWYgKCEgc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIGR0eXBlKSkKLQlyZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoc2l6ZSAhPSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBkZWJ1Z19yZWNvcmRfdHlwZV9zaXplIChkaGFuZGxlLCBkdHlwZSwgKHVuc2lnbmVkIGludCkgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gZHR5cGU7Ci19Ci0KLS8qIFJlYWQgYSBudW1iZXIgYnkgd2hpY2ggYSB0eXBlIGlzIHJlZmVycmVkIHRvIGluIGRieCBkYXRhLCBvcgotICAgcGVyaGFwcyByZWFkIGEgcGFpciAoRklMRU5VTSwgVFlQRU5VTSkgaW4gcGFyZW50aGVzZXMuICBKdXN0IGEKLSAgIHNpbmdsZSBudW1iZXIgTiBpcyBlcXVpdmFsZW50IHRvICgwLE4pLiAgUmV0dXJuIHRoZSB0d28gbnVtYmVycyBieQotICAgc3RvcmluZyB0aGVtIGluIHRoZSB2ZWN0b3IgVFlQRU5VTVMuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHR5cGVudW1zKQotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGludCAqdHlwZW51bXM7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBpZiAoKipwcCAhPSAnKCcpCi0gICAgewotICAgICAgdHlwZW51bXNbMF0gPSAwOwotICAgICAgdHlwZW51bXNbMV0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIHR5cGVudW1zWzBdID0gKGludCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgdHlwZW51bXNbMV0gPSAoaW50KSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgICAgIGlmICgqKnBwICE9ICcpJykKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHJhbmdlIHR5cGUuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9yYW5nZV90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbmFtZSwgcHAsIHR5cGVudW1zKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBpbnQgcmFuZ2VudW1zWzJdOwotICBib29sZWFuIHNlbGZfc3VicmFuZ2U7Ci0gIGRlYnVnX3R5cGUgaW5kZXhfdHlwZTsKLSAgY29uc3QgY2hhciAqczIsICpzMzsKLSAgYmZkX3NpZ25lZF92bWEgbjIsIG4zOwotICBib29sZWFuIG92Miwgb3YzOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgaW5kZXhfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAvKiBGaXJzdCBjb21lcyBhIHR5cGUgd2UgYXJlIGEgc3VicmFuZ2Ugb2YuCi0gICAgIEluIEMgaXQgaXMgdXN1YWxseSAwLCAxIG9yIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuICAqLwotICBpZiAoISBwYXJzZV9zdGFiX3R5cGVfbnVtYmVyIChwcCwgcmFuZ2VudW1zKSkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIHNlbGZfc3VicmFuZ2UgPSAocmFuZ2VudW1zWzBdID09IHR5cGVudW1zWzBdCi0JCSAgICYmIHJhbmdlbnVtc1sxXSA9PSB0eXBlbnVtc1sxXSk7Ci0KLSAgaWYgKCoqcHAgPT0gJz0nKQotICAgIHsKLSAgICAgICpwcCA9IG9yaWc7Ci0gICAgICBpbmRleF90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSAgICBwcCwgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIGlmICgqKnBwID09ICc7JykKLSAgICArKypwcDsKLQotICAvKiBUaGUgcmVtYWluaW5nIHR3byBvcGVyYW5kcyBhcmUgdXN1YWxseSBsb3dlciBhbmQgdXBwZXIgYm91bmRzIG9mCi0gICAgIHRoZSByYW5nZS4gIEJ1dCBpbiBzb21lIHNwZWNpYWwgY2FzZXMgdGhleSBtZWFuIHNvbWV0aGluZyBlbHNlLiAgKi8KLSAgczIgPSAqcHA7Ci0gIG4yID0gcGFyc2VfbnVtYmVyIChwcCwgJm92Mik7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgczMgPSAqcHA7Ci0gIG4zID0gcGFyc2VfbnVtYmVyIChwcCwgJm92Myk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgaWYgKG92MiB8fCBvdjMpCi0gICAgewotICAgICAgLyogZ2NjIHdpbGwgZW1pdCByYW5nZSBzdGFicyBmb3IgbG9uZyBsb25nIHR5cGVzLiAgSGFuZGxlIHRoaXMKLSAgICAgICAgIGFzIGEgc3BlY2lhbCBjYXNlLiAgRklYTUU6IFRoaXMgbmVlZHMgdG8gYmUgbW9yZSBnZW5lcmFsLiAgKi8KLSNkZWZpbmUgTExMT1cgICIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDsiCi0jZGVmaW5lIExMSElHSCAiMDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzsiCi0jZGVmaW5lIFVMTEhJR0ggIjAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIKLSAgICAgIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQl7Ci0JICBpZiAoc3RybmNtcCAoczIsIExMTE9XLCBzaXplb2YgTExMT1cgLSAxKSA9PSAwCi0JICAgICAgJiYgc3RybmNtcCAoczMsIExMSElHSCwgc2l6ZW9mIExMSElHSCAtIDEpID09IDApCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCBmYWxzZSk7Ci0JICBpZiAoISBvdjIKLQkgICAgICAmJiBuMiA9PSAwCi0JICAgICAgJiYgc3RybmNtcCAoczMsIFVMTEhJR0gsIHNpemVvZiBVTExISUdIIC0gMSkgPT0gMCkKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIHRydWUpOwotCX0KLQotICAgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJudW1lcmljIG92ZXJmbG93IikpOwotICAgIH0KLQotICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgewotICAgICAgLyogQSB0eXBlIGRlZmluZWQgYXMgYSBzdWJyYW5nZSBvZiBpdHNlbGYsIHdpdGggYm90aCBib3VuZHMgMCwKLSAgICAgICAgIGlzIHZvaWQuICAqLwotICAgICAgaWYgKHNlbGZfc3VicmFuZ2UgJiYgbjIgPT0gMCAmJiBuMyA9PSAwKQotCXJldHVybiBkZWJ1Z19tYWtlX3ZvaWRfdHlwZSAoZGhhbmRsZSk7Ci0KLSAgICAgIC8qIEEgdHlwZSBkZWZpbmVkIGFzIGEgc3VicmFuZ2Ugb2YgaXRzZWxmLCB3aXRoIG4yIHBvc2l0aXZlIGFuZAotCSBuMyB6ZXJvLCBpcyBhIGNvbXBsZXggdHlwZSwgYW5kIG4yIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMuICAqLwotICAgICAgaWYgKHNlbGZfc3VicmFuZ2UgJiYgbjMgPT0gMCAmJiBuMiA+IDApCi0JcmV0dXJuIGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCBuMik7Ci0KLSAgICAgIC8qIElmIG4zIGlzIHplcm8gYW5kIG4yIGlzIHBvc2l0aXZlLCB0aGlzIGlzIGEgZmxvYXRpbmcgcG9pbnQKLSAgICAgICAgIHR5cGUsIGFuZCBuMiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzLiAgKi8KLSAgICAgIGlmIChuMyA9PSAwICYmIG4yID4gMCkKLQlyZXR1cm4gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCBuMik7Ci0KLSAgICAgIC8qIElmIHRoZSB1cHBlciBib3VuZCBpcyAtMSwgdGhpcyBpcyBhbiB1bnNpZ25lZCBpbnQuICAqLwotICAgICAgaWYgKG4yID09IDAgJiYgbjMgPT0gLTEpCi0JewotCSAgLyogV2hlbiBnY2MgaXMgdXNlZCB3aXRoIC1nc3RhYnMsIGJ1dCBub3QgLWdzdGFicyssIGl0IHdpbGwgZW1pdAotCSAgICAgICAgIGxvbmcgbG9uZyBpbnQ6dDY9cjE7MDstMTsKLQkJIGxvbmcgbG9uZyB1bnNpZ25lZCBpbnQ6dDc9cjE7MDstMTsKLQkgICAgIFdlIGhhY2sgaGVyZSB0byBoYW5kbGUgdGhpcyByZWFzb25hYmx5LiAgKi8KLQkgIGlmICh0eXBlbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJsb25nIGxvbmcgaW50IikgPT0gMCkKLQkJcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHR5cGVuYW1lLCAibG9uZyBsb25nIHVuc2lnbmVkIGludCIpID09IDApCi0JCXJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA4LCB0cnVlKTsKLQkgICAgfQotCSAgLyogRklYTUU6IFRoZSBzaXplIGhlcmUgcmVhbGx5IGRlcGVuZHMgdXBvbiB0aGUgdGFyZ2V0LiAgKi8KLQkgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLQl9Ci0KLSAgICAgIC8qIEEgcmFuZ2Ugb2YgMCB0byAxMjcgaXMgY2hhci4gICovCi0gICAgICBpZiAoc2VsZl9zdWJyYW5nZSAmJiBuMiA9PSAwICYmIG4zID09IDEyNykKLQlyZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotCi0gICAgICAvKiBGSVhNRTogZ2RiIGNoZWNrcyBmb3IgdGhlIGxhbmd1YWdlIENISUxMIGhlcmUuICAqLwotCi0gICAgICBpZiAobjIgPT0gMCkKLQl7Ci0JICBpZiAobjMgPCAwKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgLSBuMywgdHJ1ZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweGZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0JICBlbHNlIGlmIChuMyA9PSAweGZmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLQkgIGVsc2UgaWYgKG4zID09IDB4ZmZmZmZmZmYpCi0JICAgIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSNpZmRlZiBCRkQ2NAotCSAgZWxzZSBpZiAobjMgPT0gKCgoKGJmZF92bWEpIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IDB4ZmZmZmZmZmYpKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0jZW5kaWYKLQl9Ci0gICAgICBlbHNlIGlmIChuMyA9PSAwCi0JICAgICAgICYmIG4yIDwgMAotCSAgICAgICAmJiAoc2VsZl9zdWJyYW5nZSB8fCBuMiA9PSAtOCkpCi0JcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIC0gbjIsIHRydWUpOwotICAgICAgZWxzZSBpZiAobjIgPT0gLSBuMyAtIDEgfHwgbjIgPT0gbjMgKyAxKQotCXsKLQkgIGlmIChuMyA9PSAweDdmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgZmFsc2UpOwotCSAgZWxzZSBpZiAobjMgPT0gMHg3ZmZmKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMiwgZmFsc2UpOwotCSAgZWxzZSBpZiAobjMgPT0gMHg3ZmZmZmZmZikKLQkgICAgcmV0dXJuIGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSNpZmRlZiBCRkQ2NAotCSAgZWxzZSBpZiAobjMgPT0gKCgoKGJmZF92bWEpIDB4N2ZmZmZmZmYpIDw8IDMyKSB8IDB4ZmZmZmZmZmYpKQotCSAgICByZXR1cm4gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotI2VuZGlmCi0JfQotICAgIH0KLQotICAvKiBBdCB0aGlzIHBvaW50IEkgZG9uJ3QgaGF2ZSB0aGUgZmFpbnRlc3QgaWRlYSBob3cgdG8gZGVhbCB3aXRoIGEKLSAgICAgc2VsZl9zdWJyYW5nZSB0eXBlOyBJJ20gZ29pbmcgdG8gYXNzdW1lIHRoYXQgdGhpcyBpcyB1c2VkIGFzIGFuCi0gICAgIGlkaW9tLCBhbmQgdGhhdCBhbGwgb2YgdGhlbSBhcmUgc3BlY2lhbCBjYXNlcy4gIFNvIC4gLiAuICAqLwotICBpZiAoc2VsZl9zdWJyYW5nZSkKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpbmRleF90eXBlID0gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHJhbmdlbnVtcyk7Ci0gIGlmIChpbmRleF90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICB7Ci0gICAgICAvKiBEb2VzIHRoaXMgYWN0dWFsbHkgZXZlciBoYXBwZW4/ICBJcyB0aGF0IHdoeSB3ZSBhcmUgd29ycnlpbmcKLSAgICAgICAgIGFib3V0IGRlYWxpbmcgd2l0aCBpdCByYXRoZXIgdGhhbiBqdXN0IGNhbGxpbmcgZXJyb3JfdHlwZT8gICovCi0gICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oIm1pc3NpbmcgaW5kZXggdHlwZSIpKTsKLSAgICAgIGluZGV4X3R5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgfQotCi0gIHJldHVybiBkZWJ1Z19tYWtlX3JhbmdlX3R5cGUgKGRoYW5kbGUsIGluZGV4X3R5cGUsIG4yLCBuMyk7Ci19Ci0KLS8qIFN1bidzIEFDQyB1c2VzIGEgc29tZXdoYXQgc2FuZXIgbWV0aG9kIGZvciBzcGVjaWZ5aW5nIHRoZSBidWlsdGluCi0gICB0eXBlZGVmcyBpbiBldmVyeSBmaWxlIChmb3IgaW50LCBsb25nLCBldGMpOgotCi0JdHlwZSA9IGIgPHNpZ25lZD4gPHdpZHRoPjsgPG9mZnNldD47IDxuYml0cz4KLQlzaWduZWQgPSB1IG9yIHMuICBQb3NzaWJsZSBjIGluIGFkZGl0aW9uIHRvIHUgb3IgcyAoZm9yIGNoYXI/KS4KLQlvZmZzZXQgPSBvZmZzZXQgZnJvbSBoaWdoIG9yZGVyIGJpdCB0byBzdGFydCBiaXQgb2YgdHlwZS4KLQl3aWR0aCBpcyAjIGJ5dGVzIGluIG9iamVjdCBvZiB0aGlzIHR5cGUsIG5iaXRzIGlzICMgYml0cyBpbiB0eXBlLgotCi0gICBUaGUgd2lkdGgvb2Zmc2V0IHN0dWZmIGFwcGVhcnMgdG8gYmUgZm9yIHNtYWxsIG9iamVjdHMgc3RvcmVkIGluCi0gICBsYXJnZXIgb25lcyAoZS5nLiBgc2hvcnRzJyBpbiBgaW50JyByZWdpc3RlcnMpLiAgV2UgaWdub3JlIGl0IGZvciBub3csCi0gICBGSVhNRS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3N1bl9idWlsdGluX3R5cGUgKGRoYW5kbGUsIHBwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBib29sZWFuIHVuc2lnbmVkcDsKLSAgYmZkX3ZtYSBiaXRzOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgc3dpdGNoICgqKnBwKQotICAgIHsKLSAgICBjYXNlICdzJzoKLSAgICAgIHVuc2lnbmVkcCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndSc6Ci0gICAgICB1bnNpZ25lZHAgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICArKypwcDsKLQotICAvKiBGb3Igc29tZSBvZGQgcmVhc29uLCBhbGwgZm9ybXMgb2YgY2hhciBwdXQgYSBjIGhlcmUuICBUaGlzIGlzIHN0cmFuZ2UKLSAgICAgYmVjYXVzZSBubyBvdGhlciB0eXBlIGhhcyB0aGlzIGhvbm9yLiAgV2UgY2FuIHNhZmVseSBpZ25vcmUgdGhpcyBiZWNhdXNlCi0gICAgIHdlIGFjdHVhbGx5IGRldGVybWluZSAnY2hhcidhY3Rlcm5lc3MgYnkgdGhlIG51bWJlciBvZiBiaXRzIHNwZWNpZmllZCBpbgotICAgICB0aGUgZGVzY3JpcHRvci4gICovCi0gIGlmICgqKnBwID09ICdjJykKLSAgICArKypwcDsKLQotICAvKiBUaGUgZmlyc3QgbnVtYmVyIGFwcGVhcnMgdG8gYmUgdGhlIG51bWJlciBvZiBieXRlcyBvY2N1cGllZAotICAgICBieSB0aGlzIHR5cGUsIGV4Y2VwdCB0aGF0IHVuc2lnbmVkIHNob3J0IGlzIDQgaW5zdGVhZCBvZiAyLgotICAgICBTaW5jZSB0aGlzIGluZm9ybWF0aW9uIGlzIHJlZHVuZGFudCB3aXRoIHRoZSB0aGlyZCBudW1iZXIsCi0gICAgIHdlIHdpbGwgaWdub3JlIGl0LiAgKi8KLSAgKHZvaWQpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLSAgICB9Ci0gICsrKnBwOwotCi0gIC8qIFRoZSBzZWNvbmQgbnVtYmVyIGlzIGFsd2F5cyAwLCBzbyBpZ25vcmUgaXQgdG9vLiAqLwotICAodm9pZCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgLyogVGhlIHRoaXJkIG51bWJlciBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgZm9yIHRoaXMgdHlwZS4gKi8KLSAgYml0cyA9IHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotCi0gIC8qIFRoZSB0eXBlICpzaG91bGQqIGVuZCB3aXRoIGEgc2VtaWNvbG9uLiAgSWYgaXQgYXJlIGVtYmVkZGVkCi0gICAgIGluIGEgbGFyZ2VyIHR5cGUgdGhlIHNlbWljb2xvbiBtYXkgYmUgdGhlIG9ubHkgd2F5IHRvIGtub3cgd2hlcmUKLSAgICAgdGhlIHR5cGUgZW5kcy4gIElmIHRoaXMgdHlwZSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzdGFic3RyaW5nIHdlCi0gICAgIGNhbiBkZWFsIHdpdGggdGhlIG9taXR0ZWQgc2VtaWNvbG9uIChidXQgd2UgZG9uJ3QgaGF2ZSB0byBsaWtlCi0gICAgIGl0KS4gIERvbid0IGJvdGhlciB0byBjb21wbGFpbigpLCBTdW4ncyBjb21waWxlciBvbWl0cyB0aGUgc2VtaWNvbG9uCi0gICAgIGZvciAidm9pZCIuICAqLwotICBpZiAoKipwcCA9PSAnOycpCi0gICAgKysqcHA7Ci0KLSAgaWYgKGJpdHMgPT0gMCkKLSAgICByZXR1cm4gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCBiaXRzIC8gOCwgdW5zaWduZWRwKTsKLX0KLQotLyogUGFyc2UgYSBidWlsdGluIGZsb2F0aW5nIHR5cGUgZ2VuZXJhdGVkIGJ5IHRoZSBTdW4gY29tcGlsZXIuICAqLwotCi1zdGF0aWMgZGVidWdfdHlwZQotcGFyc2Vfc3RhYl9zdW5fZmxvYXRpbmdfdHlwZSAoZGhhbmRsZSwgcHApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJmZF92bWEgZGV0YWlsczsKLSAgYmZkX3ZtYSBieXRlczsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIFRoZSBmaXJzdCBudW1iZXIgaGFzIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgdHlwZSwgZm9yIGV4YW1wbGUKLSAgICAgRk5fQ09NUExFWC4gICovCi0gIGRldGFpbHMgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLSAgaWYgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotCi0gIC8qIFRoZSBzZWNvbmQgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgdGhpcyB0eXBlICovCi0gIGJ5dGVzID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLQotICBpZiAoZGV0YWlscyA9PSBORl9DT01QTEVYCi0gICAgICB8fCBkZXRhaWxzID09IE5GX0NPTVBMRVgxNgotICAgICAgfHwgZGV0YWlscyA9PSBORl9DT01QTEVYMzIpCi0gICAgcmV0dXJuIGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCBieXRlcyk7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgYnl0ZXMpOyAgICAgIAotfQotCi0vKiBIYW5kbGUgYW4gZW51bSB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfZW51bV90eXBlIChkaGFuZGxlLCBwcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY29uc3QgY2hhciAqKm5hbWVzOwotICBiZmRfc2lnbmVkX3ZtYSAqdmFsdWVzOwotICB1bnNpZ25lZCBpbnQgbjsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAvKiBUaGUgYWl4NCBjb21waWxlciBlbWl0cyBhbiBleHRyYSBmaWVsZCBiZWZvcmUgdGhlIGVudW0gbWVtYmVyczsKLSAgICAgbXkgZ3Vlc3MgaXMgaXQncyBhIHR5cGUgb2Ygc29tZSBzb3J0LiAgSnVzdCBpZ25vcmUgaXQuICAqLwotICBpZiAoKipwcCA9PSAnLScpCi0gICAgewotICAgICAgd2hpbGUgKCoqcHAgIT0gJzonKQotCSsrKnBwOwotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIC8qIFJlYWQgdGhlIHZhbHVlLW5hbWVzIGFuZCB0aGVpciB2YWx1ZXMuCi0gICAgIFRoZSBpbnB1dCBzeW50YXggaXMgTkFNRTpWQUxVRSxOQU1FOlZBTFVFLCBhbmQgc28gb24uCi0gICAgIEEgc2VtaWNvbG9uIG9yIGNvbW1hIGluc3RlYWQgb2YgYSBOQU1FIG1lYW5zIHRoZSBlbmQuICAqLwotICBhbGxvYyA9IDEwOwotICBuYW1lcyA9IChjb25zdCBjaGFyICoqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqbmFtZXMpOwotICB2YWx1ZXMgPSAoYmZkX3NpZ25lZF92bWEgKikgeG1hbGxvYyAoYWxsb2MgKiBzaXplb2YgKnZhbHVlcyk7Ci0gIG4gPSAwOwotICB3aGlsZSAoKipwcCAhPSAnXDAnICYmICoqcHAgIT0gJzsnICYmICoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgYmZkX3NpZ25lZF92bWEgdmFsOwotCi0gICAgICBwID0gKnBwOwotICAgICAgd2hpbGUgKCpwICE9ICc6JykKLQkrK3A7Ci0KLSAgICAgIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCi0gICAgICAqcHAgPSBwICsgMTsKLSAgICAgIHZhbCA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIERFQlVHX1RZUEVfTlVMTDsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgaWYgKG4gKyAxID49IGFsbG9jKQotCXsKLQkgIGFsbG9jICs9IDEwOwotCSAgbmFtZXMgPSAoKGNvbnN0IGNoYXIgKiopCi0JCSAgIHhyZWFsbG9jICgoUFRSKSBuYW1lcywgYWxsb2MgKiBzaXplb2YgKm5hbWVzKSk7Ci0JICB2YWx1ZXMgPSAoKGJmZF9zaWduZWRfdm1hICopCi0JCSAgICB4cmVhbGxvYyAoKFBUUikgdmFsdWVzLCBhbGxvYyAqIHNpemVvZiAqdmFsdWVzKSk7Ci0JfQotCi0gICAgICBuYW1lc1tuXSA9IG5hbWU7Ci0gICAgICB2YWx1ZXNbbl0gPSB2YWw7Ci0gICAgICArK247Ci0gICAgfQotCi0gIG5hbWVzW25dID0gTlVMTDsKLSAgdmFsdWVzW25dID0gMDsKLQotICBpZiAoKipwcCA9PSAnOycpCi0gICAgKysqcHA7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfZW51bV90eXBlIChkaGFuZGxlLCBuYW1lcywgdmFsdWVzKTsKLX0KLQotLyogUmVhZCB0aGUgZGVzY3JpcHRpb24gb2YgYSBzdHJ1Y3R1cmUgKG9yIHVuaW9uIHR5cGUpIGFuZCByZXR1cm4gYW4gb2JqZWN0Ci0gICBkZXNjcmliaW5nIHRoZSB0eXBlLgotCi0gICBQUCBwb2ludHMgdG8gYSBjaGFyYWN0ZXIgcG9pbnRlciB0aGF0IHBvaW50cyB0byB0aGUgbmV4dCB1bmNvbnN1bWVkIHRva2VuCi0gICBpbiB0aGUgdGhlIHN0YWJzIHN0cmluZy4gIEZvciBleGFtcGxlLCBnaXZlbiBzdGFicyAiQTpUND1zNGE6MSwwLDMyOzsiLAotICAgKlBQIHdpbGwgcG9pbnQgdG8gIjRhOjEsMCwzMjs7Ii4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX3N0cnVjdF90eXBlIChkaGFuZGxlLCBpbmZvLCB0YWduYW1lLCBwcCwgc3RydWN0cCwgdHlwZW51bXMpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnRhZ25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgYm9vbGVhbiBzdHJ1Y3RwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBiZmRfdm1hIHNpemU7Ci0gIGRlYnVnX2Jhc2VjbGFzcyAqYmFzZWNsYXNzZXM7Ci0gIGRlYnVnX2ZpZWxkICpmaWVsZHM7Ci0gIGJvb2xlYW4gc3RhdGljczsKLSAgZGVidWdfbWV0aG9kICptZXRob2RzOwotICBkZWJ1Z190eXBlIHZwdHJiYXNlOwotICBib29sZWFuIG93bnZwdHI7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICAvKiBHZXQgdGhlIHNpemUuICAqLwotICBzaXplID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0KLSAgLyogR2V0IHRoZSBvdGhlciBpbmZvcm1hdGlvbi4gICovCi0gIGlmICghIHBhcnNlX3N0YWJfYmFzZWNsYXNzZXMgKGRoYW5kbGUsIGluZm8sIHBwLCAmYmFzZWNsYXNzZXMpCi0gICAgICB8fCAhIHBhcnNlX3N0YWJfc3RydWN0X2ZpZWxkcyAoZGhhbmRsZSwgaW5mbywgcHAsICZmaWVsZHMsICZzdGF0aWNzKQotICAgICAgfHwgISBwYXJzZV9zdGFiX21lbWJlcnMgKGRoYW5kbGUsIGluZm8sIHRhZ25hbWUsIHBwLCB0eXBlbnVtcywgJm1ldGhvZHMpCi0gICAgICB8fCAhIHBhcnNlX3N0YWJfdGlsZGVfZmllbGQgKGRoYW5kbGUsIGluZm8sIHBwLCB0eXBlbnVtcywgJnZwdHJiYXNlLAotCQkJCSAgICZvd252cHRyKSkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICghIHN0YXRpY3MKLSAgICAgICYmIGJhc2VjbGFzc2VzID09IE5VTEwKLSAgICAgICYmIG1ldGhvZHMgPT0gTlVMTAotICAgICAgJiYgdnB0cmJhc2UgPT0gREVCVUdfVFlQRV9OVUxMCi0gICAgICAmJiAhIG93bnZwdHIpCi0gICAgcmV0dXJuIGRlYnVnX21ha2Vfc3RydWN0X3R5cGUgKGRoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcyk7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2Vfb2JqZWN0X3R5cGUgKGRoYW5kbGUsIHN0cnVjdHAsIHNpemUsIGZpZWxkcywgYmFzZWNsYXNzZXMsCi0JCQkJIG1ldGhvZHMsIHZwdHJiYXNlLCBvd252cHRyKTsKLX0KLQotLyogVGhlIHN0YWJzIGZvciBDKysgZGVyaXZlZCBjbGFzc2VzIGNvbnRhaW4gYmFzZWNsYXNzIGluZm9ybWF0aW9uIHdoaWNoCi0gICBpcyBtYXJrZWQgYnkgYSAnIScgY2hhcmFjdGVyIGFmdGVyIHRoZSB0b3RhbCBzaXplLiAgVGhpcyBmdW5jdGlvbiBpcwotICAgY2FsbGVkIHdoZW4gd2UgZW5jb3VudGVyIHRoZSBiYXNlY2xhc3MgbWFya2VyLCBhbmQgc2x1cnBzIHVwIGFsbCB0aGUKLSAgIGJhc2VjbGFzcyBpbmZvcm1hdGlvbi4KLQotICAgSW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSAnIScgbWFya2VyIGlzIHRoZSBudW1iZXIgb2YgYmFzZSBjbGFzc2VzIHRoYXQKLSAgIHRoZSBjbGFzcyBpcyBkZXJpdmVkIGZyb20sIGZvbGxvd2VkIGJ5IGluZm9ybWF0aW9uIGZvciBlYWNoIGJhc2UgY2xhc3MuCi0gICBGb3IgZWFjaCBiYXNlIGNsYXNzLCB0aGVyZSBhcmUgdHdvIHZpc2liaWxpdHkgc3BlY2lmaWVycywgYSBiaXQgb2Zmc2V0Ci0gICB0byB0aGUgYmFzZSBjbGFzcyBpbmZvcm1hdGlvbiB3aXRoaW4gdGhlIGRlcml2ZWQgY2xhc3MsIGEgcmVmZXJlbmNlIHRvCi0gICB0aGUgdHlwZSBmb3IgdGhlIGJhc2UgY2xhc3MsIGFuZCBhIHRlcm1pbmF0aW5nIHNlbWljb2xvbi4KLQotICAgQSB0eXBpY2FsIGV4YW1wbGUsIHdpdGggdHdvIGJhc2UgY2xhc3Nlcywgd291bGQgYmUgIiEyLDAyMCwxOTswMjY0LDIxOyIuCi0gICAJCQkJCQkgICAgICAgXl4gXiBeIF4gIF4gXiAgXgotCUJhc2VjbGFzcyBpbmZvcm1hdGlvbiBtYXJrZXIgX19fX19fX19fX19fX19fX19ffHwgfCB8IHwgIHwgfCAgfAotCU51bWJlciBvZiBiYXNlY2xhc3NlcyBfX19fX19fX19fX19fX19fX19fX19fX19fX3wgfCB8IHwgIHwgfCAgfAotCVZpc2liaWxpdHkgc3BlY2lmaWVycyAoMikgX19fX19fX19fX19fX19fX19fX19fX19ffCB8IHwgIHwgfCAgfAotCU9mZnNldCBpbiBiaXRzIGZyb20gc3RhcnQgb2YgY2xhc3MgX19fX19fX19fX19fX19fX198IHwgIHwgfCAgfAotCVR5cGUgbnVtYmVyIGZvciBiYXNlIGNsYXNzIF9fX19fX19fX19fX19fX19fX19fX19fX19fX3wgIHwgfCAgfAotCVZpc2liaWxpdHkgc3BlY2lmaWVycyAoMikgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wgfCAgfAotCU9mZnNldCBpbiBiaXRzIGZyb20gc3RhcnQgb2YgY2xhc3MgX19fX19fX19fX19fX19fX19fX19fX19ffCAgfAotCVR5cGUgbnVtYmVyIG9mIGJhc2UgY2xhc3MgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAotCi0gIFJldHVybiB0cnVlIGZvciBzdWNjZXNzLCBmYWxzZSBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX2Jhc2VjbGFzc2VzIChkaGFuZGxlLCBpbmZvLCBwcCwgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19iYXNlY2xhc3MgKipyZXRwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICB1bnNpZ25lZCBpbnQgYywgaTsKLSAgZGVidWdfYmFzZWNsYXNzICpjbGFzc2VzOwotCi0gICpyZXRwID0gTlVMTDsKLQotICBvcmlnID0gKnBwOwotCi0gIGlmICgqKnBwICE9ICchJykKLSAgICB7Ci0gICAgICAvKiBObyBiYXNlIGNsYXNzZXMuICAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICArKypwcDsKLQotICBjID0gKHVuc2lnbmVkIGludCkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0KLSAgaWYgKCoqcHAgIT0gJywnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICsrKnBwOwotCi0gIGNsYXNzZXMgPSAoZGVidWdfYmFzZWNsYXNzICopIHhtYWxsb2MgKChjICsgMSkgKiBzaXplb2YgKCoqcmV0cCkpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjOyBpKyspCi0gICAgewotICAgICAgYm9vbGVhbiB2aXJ0dWFsOwotICAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gICAgICBiZmRfdm1hIGJpdHBvczsKLSAgICAgIGRlYnVnX3R5cGUgdHlwZTsKLQotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICcwJzoKLQkgIHZpcnR1YWwgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJzEnOgotCSAgdmlydHVhbCA9IHRydWU7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bmtub3duIHZpcnR1YWwgY2hhcmFjdGVyIGZvciBiYXNlY2xhc3MiKSk7Ci0JICB2aXJ0dWFsID0gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0gICAgICArKypwcDsKLQotICAgICAgc3dpdGNoICgqKnBwKQotCXsKLQljYXNlICcwJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU7Ci0JICBicmVhazsKLQljYXNlICcxJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDsKLQkgIGJyZWFrOwotCWNhc2UgJzInOgotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHdhcm5fc3RhYiAob3JpZywgXygidW5rbm93biB2aXNpYmlsaXR5IGNoYXJhY3RlciBmb3IgYmFzZWNsYXNzIikpOwotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKysqcHA7Ci0KLSAgICAgIC8qIFRoZSByZW1haW5pbmcgdmFsdWUgaXMgdGhlIGJpdCBvZmZzZXQgb2YgdGhlIHBvcnRpb24gb2YgdGhlCi0JIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYmFzZWNsYXNzLiAgQWx3YXlzIHplcm8gaW4gdGhlCi0JIGFic2VuY2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UuICAqLwotICAgICAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gICAgICBpZiAoKipwcCAhPSAnLCcpCi0JewotCSAgYmFkX3N0YWIgKG9yaWcpOwotCSAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgICsrKnBwOwotCi0gICAgICB0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGNsYXNzZXNbaV0gPSBkZWJ1Z19tYWtlX2Jhc2VjbGFzcyAoZGhhbmRsZSwgdHlwZSwgYml0cG9zLCB2aXJ0dWFsLAotCQkJCQkgdmlzaWJpbGl0eSk7Ci0gICAgICBpZiAoY2xhc3Nlc1tpXSA9PSBERUJVR19CQVNFQ0xBU1NfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICgqKnBwICE9ICc7JykKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgY2xhc3Nlc1tpXSA9IERFQlVHX0JBU0VDTEFTU19OVUxMOwotCi0gICpyZXRwID0gY2xhc3NlczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmVhZCBzdHJ1Y3Qgb3IgY2xhc3MgZGF0YSBmaWVsZHMuICBUaGV5IGhhdmUgdGhlIGZvcm06Ci0KLSAgIAlOQU1FIDogW1ZJU0lCSUxJVFldIFRZUEVOVU0gLCBCSVRQT1MgLCBCSVRTSVpFIDsKLQotICAgQXQgdGhlIGVuZCwgd2Ugc2VlIGEgc2VtaWNvbG9uIGluc3RlYWQgb2YgYSBmaWVsZC4KLQotICAgSW4gQysrLCB0aGlzIG1heSB3aW5kIHVwIGJlaW5nIE5BTUU6P1RZUEVOVU06UEhZU05BTUU7IGZvcgotICAgYSBzdGF0aWMgZmllbGQuCi0KLSAgIFRoZSBvcHRpb25hbCBWSVNJQklMSVRZIGlzIG9uZSBvZjoKLQotICAgCScvMCcJKFZJU0lCSUxJVFlfUFJJVkFURSkKLQknLzEnCShWSVNJQklMSVRZX1BST1RFQ1RFRCkKLQknLzInCShWSVNJQklMSVRZX1BVQkxJQykKLQknLzknCShWSVNJQklMSVRZX0lHTk9SRSkKLQotICAgb3Igbm90aGluZywgZm9yIEMgc3R5bGUgZmllbGRzIHdpdGggcHVibGljIHZpc2liaWxpdHkuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3N0cnVjdF9maWVsZHMgKGRoYW5kbGUsIGluZm8sIHBwLCByZXRwLCBzdGF0aWNzcCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19maWVsZCAqKnJldHA7Ci0gICAgIGJvb2xlYW4gKnN0YXRpY3NwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICBkZWJ1Z19maWVsZCAqZmllbGRzOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgdW5zaWduZWQgaW50IGFsbG9jOwotCi0gICpyZXRwID0gTlVMTDsKLSAgKnN0YXRpY3NwID0gZmFsc2U7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBjID0gMDsKLSAgYWxsb2MgPSAxMDsKLSAgZmllbGRzID0gKGRlYnVnX2ZpZWxkICopIHhtYWxsb2MgKGFsbG9jICogc2l6ZW9mICpmaWVsZHMpOwotICB3aGlsZSAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAgICAgcCA9ICpwcDsKLQotICAgICAgLyogQWRkIDEgdG8gYyB0byBsZWF2ZSByb29tIGZvciBOVUxMIHBvaW50ZXIgYXQgZW5kLiAgKi8KLSAgICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQl7Ci0JICBhbGxvYyArPSAxMDsKLQkgIGZpZWxkcyA9ICgoZGVidWdfZmllbGQgKikKLQkJICAgIHhyZWFsbG9jICgoUFRSKSBmaWVsZHMsIGFsbG9jICogc2l6ZW9mICpmaWVsZHMpKTsKLQl9Ci0KLSAgICAgIC8qIElmIGl0IHN0YXJ0cyB3aXRoIENQTFVTX01BUktFUiBpdCBpcyBhIHNwZWNpYWwgYWJicmV2aWF0aW9uLAotCSB1bmxlc3MgdGhlIENQTFVTX01BUktFUiBpcyBmb2xsb3dlZCBieSBhbiB1bmRlcnNjb3JlLCBpbgotCSB3aGljaCBjYXNlIGl0IGlzIGp1c3QgdGhlIG5hbWUgb2YgYW4gYW5vbnltb3VzIHR5cGUsIHdoaWNoIHdlCi0JIHNob3VsZCBoYW5kbGUgbGlrZSBhbnkgb3RoZXIgdHlwZSBuYW1lLiAgV2UgYWNjZXB0IGVpdGhlciAnJCcKLQkgb3IgJy4nLCBiZWNhdXNlIGEgZmllbGQgbmFtZSBjYW4gbmV2ZXIgY29udGFpbiBvbmUgb2YgdGhlc2UKLQkgY2hhcmFjdGVycyBleGNlcHQgYXMgYSBDUExVU19NQVJLRVIuICAqLwotCi0gICAgICBpZiAoKCpwID09ICckJyB8fCAqcCA9PSAnLicpICYmIHBbMV0gIT0gJ18nKQotCXsKLQkgICsrKnBwOwotCSAgaWYgKCEgcGFyc2Vfc3RhYl9jcHBfYWJicmV2IChkaGFuZGxlLCBpbmZvLCBwcCwgZmllbGRzICsgYykpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgICsrYzsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogTG9vayBmb3IgdGhlICc6JyB0aGF0IHNlcGFyYXRlcyB0aGUgZmllbGQgbmFtZSBmcm9tIHRoZSBmaWVsZAotCSB2YWx1ZXMuICBEYXRhIG1lbWJlcnMgYXJlIGRlbGltaXRlZCBieSBhIHNpbmdsZSAnOicsIHdoaWxlIG1lbWJlcgotCSBmdW5jdGlvbnMgYXJlIGRlbGltaXRlZCBieSBhIHBhaXIgb2YgJzoncy4gIFdoZW4gd2UgaGl0IHRoZSBtZW1iZXIKLQkgZnVuY3Rpb25zIChpZiBhbnkpLCB0ZXJtaW5hdGUgc2NhbiBsb29wIGFuZCByZXR1cm4uICovCi0KLSAgICAgIHAgPSBzdHJjaHIgKHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIGlmIChwWzFdID09ICc6JykKLQlicmVhazsKLQotICAgICAgaWYgKCEgcGFyc2Vfc3RhYl9vbmVfc3RydWN0X2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgcCwgZmllbGRzICsgYywKLQkJCQkJIHN0YXRpY3NwKSkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgICsrYzsKLSAgICB9Ci0KLSAgZmllbGRzW2NdID0gREVCVUdfRklFTERfTlVMTDsKLQotICAqcmV0cCA9IGZpZWxkczsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3BlY2lhbCBHTlUgQysrIG5hbWUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotcGFyc2Vfc3RhYl9jcHBfYWJicmV2IChkaGFuZGxlLCBpbmZvLCBwcCwgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z19maWVsZCAqcmV0cDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgaW50IGNwcF9hYmJyZXY7Ci0gIGRlYnVnX3R5cGUgY29udGV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY29uc3QgY2hhciAqdHlwZW5hbWU7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBiaXRwb3M7Ci0KLSAgKnJldHAgPSBERUJVR19GSUVMRF9OVUxMOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgaWYgKCoqcHAgIT0gJ3YnKQotICAgIHsKLSAgICAgIGJhZF9zdGFiICgqcHApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgY3BwX2FiYnJldiA9ICoqcHA7Ci0gICsrKnBwOwotCi0gIC8qIEF0IHRoaXMgcG9pbnQsICpwcCBwb2ludHMgdG8gc29tZXRoaW5nIGxpa2UgIjIyOjIzPSoyMi4uLiIsIHdoZXJlCi0gICAgIHRoZSB0eXBlIG51bWJlciBiZWZvcmUgdGhlICc6JyBpcyB0aGUgImNvbnRleHQiIGFuZCBldmVyeXRoaW5nCi0gICAgIGFmdGVyIGlzIGEgcmVndWxhciB0eXBlIGRlZmluaXRpb24uICBMb29rdXAgdGhlIHR5cGUsIGZpbmQgaXQncwotICAgICBuYW1lLCBhbmQgY29uc3RydWN0IHRoZSBmaWVsZCBuYW1lLiAgKi8KLQotICBjb250ZXh0ID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgICAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAoY29udGV4dCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN3aXRjaCAoY3BwX2FiYnJldikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAvKiAkdmYgLS0gYSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIHBvaW50ZXIuICAqLwotICAgICAgbmFtZSA9ICJfdnB0ciQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICAvKiAkdmIgLS0gYSB2aXJ0dWFsIGJzb21ldGhpbmdvcm90aGVyICovCi0gICAgICB0eXBlbmFtZSA9IGRlYnVnX2dldF90eXBlX25hbWUgKGRoYW5kbGUsIGNvbnRleHQpOwotICAgICAgaWYgKHR5cGVuYW1lID09IE5VTEwpCi0JewotCSAgd2Fybl9zdGFiIChvcmlnLCBfKCJ1bm5hbWVkICR2YiB0eXBlIikpOwotCSAgdHlwZW5hbWUgPSAiRk9PIjsKLQl9Ci0gICAgICBuYW1lID0gY29uY2F0ICgiX3ZiJCIsIHR5cGVuYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB3YXJuX3N0YWIgKG9yaWcsIF8oInVucmVjb2duaXplZCBDKysgYWJicmV2aWF0aW9uIikpOwotICAgICAgbmFtZSA9ICJJTlZBTElEX0NQTFVTUExVU19BQkJSRVYiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICc6JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICB0eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCSAgKGRlYnVnX3R5cGUgKiopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICAqcmV0cCA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIGJpdHBvcywgMCwKLQkJCSAgICBERUJVR19WSVNJQklMSVRZX1BSSVZBVEUpOwotICBpZiAoKnJldHAgPT0gREVCVUdfRklFTERfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBhcnNlIGEgc2luZ2xlIGZpZWxkIGluIGEgc3RydWN0IG9yIHVuaW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXBhcnNlX3N0YWJfb25lX3N0cnVjdF9maWVsZCAoZGhhbmRsZSwgaW5mbywgcHAsIHAsIHJldHAsIHN0YXRpY3NwKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgIGRlYnVnX2ZpZWxkICpyZXRwOwotICAgICBib29sZWFuICpzdGF0aWNzcDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY2hhciAqbmFtZTsKLSAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci0gIGRlYnVnX3R5cGUgdHlwZTsKLSAgYmZkX3ZtYSBiaXRwb3M7Ci0gIGJmZF92bWEgYml0c2l6ZTsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIEZJWE1FOiBnZGIgY2hlY2tzIEFSTV9ERU1BTkdMSU5HIGhlcmUuICAqLwotCi0gIG5hbWUgPSBzYXZlc3RyaW5nICgqcHAsIHAgLSAqcHApOwotCi0gICpwcCA9IHAgKyAxOwotCi0gIGlmICgqKnBwICE9ICcvJykKLSAgICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QVUJMSUM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIHN3aXRjaCAoKipwcCkKLQl7Ci0JY2FzZSAnMCc6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUklWQVRFOwotCSAgYnJlYWs7Ci0JY2FzZSAnMSc6Ci0JICB2aXNpYmlsaXR5ID0gREVCVUdfVklTSUJJTElUWV9QUk9URUNURUQ7Ci0JICBicmVhazsKLQljYXNlICcyJzoKLQkgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB3YXJuX3N0YWIgKG9yaWcsIF8oInVua25vd24gdmlzaWJpbGl0eSBjaGFyYWN0ZXIgZm9yIGZpZWxkIikpOwotCSAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgfQotCi0gIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCoqcHAgPT0gJzonKQotICAgIHsKLSAgICAgIGNoYXIgKnZhcm5hbWU7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBzdGF0aWMgY2xhc3MgbWVtYmVyLiAgKi8KLSAgICAgICsrKnBwOwotICAgICAgcCA9IHN0cmNociAoKnBwLCAnOycpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQl7Ci0JICBiYWRfc3RhYiAob3JpZyk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICB2YXJuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQotICAgICAgKnBwID0gcCArIDE7Ci0KLSAgICAgICpyZXRwID0gZGVidWdfbWFrZV9zdGF0aWNfbWVtYmVyIChkaGFuZGxlLCBuYW1lLCB0eXBlLCB2YXJuYW1lLAotCQkJCQl2aXNpYmlsaXR5KTsKLSAgICAgICpzdGF0aWNzcCA9IHRydWU7Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBpZiAoKipwcCAhPSAnLCcpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYml0cG9zID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICcsJykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBiaXRzaXplID0gcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAoYml0cG9zID09IDAgJiYgYml0c2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoaXMgY2FuIGhhcHBlbiBpbiB0d28gY2FzZXM6ICgxKSBhdCBsZWFzdCBmb3IgZ2NjIDIuNC41IG9yCi0JIHNvLCBpdCBpcyBhIGZpZWxkIHdoaWNoIGhhcyBiZWVuIG9wdGltaXplZCBvdXQuICBUaGUgY29ycmVjdAotCSBzdGFiIGZvciB0aGlzIGNhc2UgaXMgdG8gdXNlIFZJU0lCSUxJVFlfSUdOT1JFLCBidXQgdGhhdCBpcyBhCi0JIHJlY2VudCBpbnZlbnRpb24uICAoMikgSXQgaXMgYSAwLXNpemUgYXJyYXkuICBGb3IgZXhhbXBsZQotCSB1bmlvbiB7IGludCBudW07IGNoYXIgc3RyWzBdOyB9IGZvby4gIFByaW50aW5nICI8bm8gdmFsdWU+IgotCSBmb3Igc3RyIGluICJwIGZvbyIgaXMgT0ssIHNpbmNlIGZvby5zdHIgKGFuZCB0aHVzIGZvby5zdHJbM10pCi0JIHdpbGwgY29udGludWUgdG8gd29yaywgYW5kIGEgMC1zaXplIGFycmF5IGFzIGEgd2hvbGUgZG9lc24ndAotCSBoYXZlIGFueSBjb250ZW50cyB0byBwcmludC4KLQotCSBJIHN1c3BlY3QgdGhpcyBwcm9iYWJseSBjb3VsZCBhbHNvIGhhcHBlbiB3aXRoIGdjYyAtZ3N0YWJzCi0JIChub3QgLWdzdGFicyspIGZvciBzdGF0aWMgZmllbGRzLCBhbmQgcGVyaGFwcyBvdGhlciBDKysKLQkgZXh0ZW5zaW9ucy4gIEhvcGVmdWxseSBmZXcgcGVvcGxlIHVzZSAtZ3N0YWJzIHdpdGggZ2RiLCBzaW5jZQotCSBpdCBpcyBpbnRlbmRlZCBmb3IgZGJ4IGNvbXBhdGliaWxpdHkuICAqLwotICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfSUdOT1JFOwotICAgIH0KLQotICAvKiBGSVhNRTogZ2RiIGRvZXMgc29tZSBzdHVmZiBoZXJlIHRvIG1hcmsgZmllbGRzIGFzIHVucGFja2VkLiAgKi8KLQotICAqcmV0cCA9IGRlYnVnX21ha2VfZmllbGQgKGRoYW5kbGUsIG5hbWUsIHR5cGUsIGJpdHBvcywgYml0c2l6ZSwgdmlzaWJpbGl0eSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFJlYWQgbWVtYmVyIGZ1bmN0aW9uIHN0YWJzIGluZm8gZm9yIEMrKyBjbGFzc2VzLiAgVGhlIGZvcm0gb2YgZWFjaCBtZW1iZXIKLSAgIGZ1bmN0aW9uIGRhdGEgaXM6Ci0KLQlOQU1FIDo6IFRZUEVOVU1bPXR5cGUgZGVmaW5pdGlvbl0gQVJHUyA6IFBIWVNOQU1FIDsKLQotICAgQW4gZXhhbXBsZSB3aXRoIHR3byBtZW1iZXIgZnVuY3Rpb25zIGlzOgotCi0JYWZ1bmMxOjoyMD0jIzE1OzppOzJBLjthZnVuYzI6OjIwOmk7MkEuOwotCi0gICBGb3IgdGhlIGNhc2Ugb2Ygb3ZlcmxvYWRlZCBvcGVyYXRvcnMsIHRoZSBmb3JtYXQgaXMgb3AkOjoqLmZ1bmNzLCB3aGVyZQotICAgJCBpcyB0aGUgQ1BMVVNfTUFSS0VSICh1c3VhbGx5ICckJyksIGAqJyBob2xkcyB0aGUgcGxhY2UgZm9yIGFuIG9wZXJhdG9yCi0gICBuYW1lIChzdWNoIGFzIGArPScpIGFuZCBgLicgbWFya3MgdGhlIGVuZCBvZiB0aGUgb3BlcmF0b3IgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX21lbWJlcnMgKGRoYW5kbGUsIGluZm8sIHRhZ25hbWUsIHBwLCB0eXBlbnVtcywgcmV0cCkKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqdGFnbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotICAgICBkZWJ1Z19tZXRob2QgKipyZXRwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBkZWJ1Z19tZXRob2QgKm1ldGhvZHM7Ci0gIHVuc2lnbmVkIGludCBjOwotICB1bnNpZ25lZCBpbnQgYWxsb2M7Ci0KLSAgKnJldHAgPSBOVUxMOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgYWxsb2MgPSAwOwotICBtZXRob2RzID0gTlVMTDsKLSAgYyA9IDA7Ci0KLSAgd2hpbGUgKCoqcHAgIT0gJzsnKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgICBjaGFyICpuYW1lOwotICAgICAgZGVidWdfbWV0aG9kX3ZhcmlhbnQgKnZhcmlhbnRzOwotICAgICAgdW5zaWduZWQgaW50IGN2YXJzOwotICAgICAgdW5zaWduZWQgaW50IGFsbG9jdmFyczsKLSAgICAgIGRlYnVnX3R5cGUgbG9va19haGVhZF90eXBlOwotCi0gICAgICBwID0gc3RyY2hyICgqcHAsICc6Jyk7Ci0gICAgICBpZiAocCA9PSBOVUxMIHx8IHBbMV0gIT0gJzonKQotCWJyZWFrOwotCi0gICAgICAvKiBGSVhNRTogU29tZSBzeXN0ZW1zIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAnJCcgaGVyZS4gICovCi0gICAgICBpZiAoKCpwcClbMF0gIT0gJ28nIHx8ICgqcHApWzFdICE9ICdwJyB8fCAoKnBwKVsyXSAhPSAnJCcpCi0JewotCSAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgcCAtICpwcCk7Ci0JICAqcHAgPSBwICsgMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIGNvbXBsZXRlbHkgd2llcmQgY2FzZS4gIEluIG9yZGVyIHRvIHN0dWZmIGluIHRoZQotCSAgICAgbmFtZXMgdGhhdCBtaWdodCBjb250YWluIGNvbG9ucyAodGhlIHVzdWFsIG5hbWUgZGVsaW1pdGVyKSwKLQkgICAgIE1pa2UgVGllbWFubiBkZWZpbmVkIGEgZGlmZmVyZW50IG5hbWUgZm9ybWF0IHdoaWNoIGlzCi0JICAgICBzaWduYWxsZWQgaWYgdGhlIGlkZW50aWZpZXIgaXMgIm9wJCIuICBJbiB0aGF0IGNhc2UsIHRoZQotCSAgICAgZm9ybWF0IGlzICJvcCQ6OlhYWFguIiB3aGVyZSBYWFhYIGlzIHRoZSBuYW1lLiAgVGhpcyBpcwotCSAgICAgdXNlZCBmb3IgbmFtZXMgbGlrZSAiKyIgb3IgIj0iLiAgWVVVVVVVVVVLISAgRklYTUUhICAqLwotCSAgKnBwID0gcCArIDI7Ci0JICBmb3IgKHAgPSAqcHA7ICpwICE9ICcuJyAmJiAqcCAhPSAnXDAnOyBwKyspCi0JICAgIDsKLQkgIGlmICgqcCAhPSAnLicpCi0JICAgIHsKLQkgICAgICBiYWRfc3RhYiAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0JICBuYW1lID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQkgICpwcCA9IHAgKyAxOwotCX0KLQotICAgICAgYWxsb2N2YXJzID0gMTA7Ci0gICAgICB2YXJpYW50cyA9ICgoZGVidWdfbWV0aG9kX3ZhcmlhbnQgKikKLQkJICB4bWFsbG9jIChhbGxvY3ZhcnMgKiBzaXplb2YgKnZhcmlhbnRzKSk7Ci0gICAgICBjdmFycyA9IDA7Ci0KLSAgICAgIGxvb2tfYWhlYWRfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQotICAgICAgZG8KLQl7Ci0JICBkZWJ1Z190eXBlIHR5cGU7Ci0JICBib29sZWFuIHN0dWI7Ci0JICBjaGFyICphcmd0eXBlczsKLQkgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotCSAgYm9vbGVhbiBjb25zdHAsIHZvbGF0aWxlcCwgc3RhdGljcDsKLQkgIGJmZF92bWEgdm9mZnNldDsKLQkgIGRlYnVnX3R5cGUgY29udGV4dDsKLQkgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotCSAgYm9vbGVhbiB2YXJhcmdzOwotCi0JICBpZiAobG9va19haGVhZF90eXBlICE9IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgewotCSAgICAgIC8qIGcrKyB2ZXJzaW9uIDEga2x1ZGdlICovCi0JICAgICAgdHlwZSA9IGxvb2tfYWhlYWRfdHlwZTsKLQkgICAgICBsb29rX2FoZWFkX3R5cGUgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLQkgICAgICBpZiAodHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICBpZiAoKipwcCAhPSAnOicpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgKysqcHA7Ci0JICBwID0gc3RyY2hyICgqcHAsICc7Jyk7Ci0JICBpZiAocCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmFkX3N0YWIgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCi0JICBzdHViID0gZmFsc2U7Ci0JICBpZiAoZGVidWdfZ2V0X3R5cGVfa2luZCAoZGhhbmRsZSwgdHlwZSkgPT0gREVCVUdfS0lORF9NRVRIT0QKLQkgICAgICAmJiBkZWJ1Z19nZXRfcGFyYW1ldGVyX3R5cGVzIChkaGFuZGxlLCB0eXBlLCAmdmFyYXJncykgPT0gTlVMTCkKLQkgICAgc3R1YiA9IHRydWU7Ci0KLQkgIGFyZ3R5cGVzID0gc2F2ZXN0cmluZyAoKnBwLCBwIC0gKnBwKTsKLQkgICpwcCA9IHAgKyAxOwotCi0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnMCc6Ci0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJJVkFURTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnMSc6Ci0JICAgICAgdmlzaWJpbGl0eSA9IERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHZpc2liaWxpdHkgPSBERUJVR19WSVNJQklMSVRZX1BVQkxJQzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKysqcHA7Ci0KLQkgIGNvbnN0cCA9IGZhbHNlOwotCSAgdm9sYXRpbGVwID0gZmFsc2U7Ci0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgLyogTm9ybWFsIGZ1bmN0aW9uLiAgKi8KLQkgICAgICArKypwcDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgLyogY29uc3QgbWVtYmVyIGZ1bmN0aW9uLiAgKi8KLQkgICAgICBjb25zdHAgPSB0cnVlOwotCSAgICAgICsrKnBwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdDJzoKLQkgICAgICAvKiB2b2xhdGlsZSBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgICAgIHZvbGF0aWxlcCA9IHRydWU7Ci0JICAgICAgKysqcHA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0QnOgotCSAgICAgIC8qIGNvbnN0IHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbi4gICovCi0JICAgICAgY29uc3RwID0gdHJ1ZTsKLQkgICAgICB2b2xhdGlsZXAgPSB0cnVlOwotCSAgICAgICsrKnBwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICcqJzoKLQkgICAgY2FzZSAnPyc6Ci0JICAgIGNhc2UgJy4nOgotCSAgICAgIC8qIEZpbGUgY29tcGlsZWQgd2l0aCBnKysgdmVyc2lvbiAxOyBubyBpbmZvcm1hdGlvbi4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgd2Fybl9zdGFiIChvcmlnLCBfKCJjb25zdC92b2xhdGlsZSBpbmRpY2F0b3IgbWlzc2luZyIpKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzdGF0aWNwID0gZmFsc2U7Ci0JICBzd2l0Y2ggKCoqcHApCi0JICAgIHsKLQkgICAgY2FzZSAnKic6Ci0JICAgICAgLyogdmlydHVhbCBtZW1iZXIgZnVuY3Rpb24sIGZvbGxvd2VkIGJ5IGluZGV4LiAgVGhlIHNpZ24KLQkJIGJpdCBpcyBzdXBwb3NlZGx5IHNldCB0byBkaXN0aW5ndWlzaAotCQkgcG9pbnRlcnMtdG8tbWV0aG9kcyBmcm9tIHZpcnR1YWwgZnVuY3Rpb24gaW5kaWNpZXMuICAqLwotCSAgICAgICsrKnBwOwotCSAgICAgIHZvZmZzZXQgPSBwYXJzZV9udW1iZXIgKHBwLCAoYm9vbGVhbiAqKSBOVUxMKTsKLQkgICAgICBpZiAoKipwcCAhPSAnOycpCi0JCXsKLQkJICBiYWRfc3RhYiAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgKysqcHA7Ci0JICAgICAgdm9mZnNldCAmPSAweDdmZmZmZmZmOwotCi0JICAgICAgaWYgKCoqcHAgPT0gJzsnIHx8ICpwcCA9PSAnXDAnKQotCQl7Ci0JCSAgLyogTXVzdCBiZSBnKysgdmVyc2lvbiAxLiAgKi8KLQkJICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogRmlndXJlIG91dCBmcm9tIHdoZW5jZSB0aGlzIHZpcnR1YWwgZnVuY3Rpb24KLQkJICAgICBjYW1lLiAgSXQgbWF5IGJlbG9uZyB0byB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlIG9mCi0JCSAgICAgb25lIG9mIGl0cyBiYXNlY2xhc3Nlcy4gICovCi0JCSAgICBsb29rX2FoZWFkX3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sCi0JCQkJCQkgICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJCSAgICAgICBwcCwKLQkJCQkJCSAgICAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0JCSAgICBpZiAoKipwcCA9PSAnOicpCi0JCSAgICAgIHsKLQkJCS8qIGcrKyB2ZXJzaW9uIDEgb3ZlcmxvYWRlZCBtZXRob2RzLiAgKi8KLQkJCWNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJY29udGV4dCA9IGxvb2tfYWhlYWRfdHlwZTsKLQkJCWxvb2tfYWhlYWRfdHlwZSA9IERFQlVHX1RZUEVfTlVMTDsKLQkJCWlmICgqKnBwICE9ICc7JykKLQkJCSAgewotCQkJICAgIGJhZF9zdGFiIChvcmlnKTsKLQkJCSAgICByZXR1cm4gZmFsc2U7Ci0JCQkgIH0KLQkJCSsrKnBwOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJz8nOgotCSAgICAgIC8qIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24uICAqLwotCSAgICAgICsrKnBwOwotCSAgICAgIHN0YXRpY3AgPSB0cnVlOwotCSAgICAgIHZvZmZzZXQgPSAwOwotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgaWYgKHN0cm5jbXAgKGFyZ3R5cGVzLCBuYW1lLCBzdHJsZW4gKG5hbWUpKSAhPSAwKQotCQlzdHViID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHdhcm5fc3RhYiAob3JpZywgIm1lbWJlciBmdW5jdGlvbiB0eXBlIG1pc3NpbmciKTsKLQkgICAgICB2b2Zmc2V0ID0gMDsKLQkgICAgICBjb250ZXh0ID0gREVCVUdfVFlQRV9OVUxMOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJy4nOgotCSAgICAgICsrKnBwOwotCSAgICAgIHZvZmZzZXQgPSAwOwotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgLyogSWYgdGhlIHR5cGUgaXMgbm90IGEgc3R1YiwgdGhlbiB0aGUgYXJndHlwZXMgc3RyaW5nIGlzCi0gICAgICAgICAgICAgdGhlIHBoeXNpY2FsIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgT3RoZXJ3aXNlIHRoZQotICAgICAgICAgICAgIGFyZ3R5cGVzIHN0cmluZyBpcyB0aGUgbWFuZ2xlZCBmb3JtIG9mIHRoZSBhcmd1bWVudAotICAgICAgICAgICAgIHR5cGVzLCBhbmQgdGhlIGZ1bGwgdHlwZSBhbmQgdGhlIHBoeXNpY2FsIG5hbWUgbXVzdCBiZQotICAgICAgICAgICAgIGV4dHJhY3RlZCBmcm9tIHRoZW0uICAqLwotCSAgaWYgKCEgc3R1YikKLQkgICAgcGh5c25hbWUgPSBhcmd0eXBlczsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRlYnVnX3R5cGUgY2xhc3NfdHlwZSwgcmV0dXJuX3R5cGU7Ci0KLQkgICAgICBjbGFzc190eXBlID0gc3RhYl9maW5kX3R5cGUgKGRoYW5kbGUsIGluZm8sIHR5cGVudW1zKTsKLQkgICAgICBpZiAoY2xhc3NfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgICByZXR1cm5fdHlwZSA9IGRlYnVnX2dldF9yZXR1cm5fdHlwZSAoZGhhbmRsZSwgdHlwZSk7Ci0JICAgICAgaWYgKHJldHVybl90eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkJewotCQkgIGJhZF9zdGFiIChvcmlnKTsKLQkJICByZXR1cm4gZmFsc2U7Ci0JCX0KLQkgICAgICB0eXBlID0gcGFyc2Vfc3RhYl9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgY2xhc3NfdHlwZSwgbmFtZSwKLQkJCQkJICB0YWduYW1lLCByZXR1cm5fdHlwZSwgYXJndHlwZXMsCi0JCQkJCSAgY29uc3RwLCB2b2xhdGlsZXAsICZwaHlzbmFtZSk7Ci0JICAgICAgaWYgKHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKGN2YXJzICsgMSA+PSBhbGxvY3ZhcnMpCi0JICAgIHsKLQkgICAgICBhbGxvY3ZhcnMgKz0gMTA7Ci0JICAgICAgdmFyaWFudHMgPSAoKGRlYnVnX21ldGhvZF92YXJpYW50ICopCi0JCQkgIHhyZWFsbG9jICgoUFRSKSB2YXJpYW50cywKLQkJCQkgICAgYWxsb2N2YXJzICogc2l6ZW9mICp2YXJpYW50cykpOwotCSAgICB9Ci0KLQkgIGlmICghIHN0YXRpY3ApCi0JICAgIHZhcmlhbnRzW2N2YXJzXSA9IGRlYnVnX21ha2VfbWV0aG9kX3ZhcmlhbnQgKGRoYW5kbGUsIHBoeXNuYW1lLAotCQkJCQkJCSB0eXBlLCB2aXNpYmlsaXR5LAotCQkJCQkJCSBjb25zdHAsIHZvbGF0aWxlcCwKLQkJCQkJCQkgdm9mZnNldCwgY29udGV4dCk7Ci0JICBlbHNlCi0JICAgIHZhcmlhbnRzW2N2YXJzXSA9IGRlYnVnX21ha2Vfc3RhdGljX21ldGhvZF92YXJpYW50IChkaGFuZGxlLAotCQkJCQkJCQlwaHlzbmFtZSwKLQkJCQkJCQkJdHlwZSwKLQkJCQkJCQkJdmlzaWJpbGl0eSwKLQkJCQkJCQkJY29uc3RwLAotCQkJCQkJCQl2b2xhdGlsZXApOwotCSAgaWYgKHZhcmlhbnRzW2N2YXJzXSA9PSBERUJVR19NRVRIT0RfVkFSSUFOVF9OVUxMKQotCSAgICByZXR1cm4gZmFsc2U7Ci0KLQkgICsrY3ZhcnM7Ci0JfQotICAgICAgd2hpbGUgKCoqcHAgIT0gJzsnICYmICoqcHAgIT0gJ1wwJyk7Ci0KLSAgICAgIHZhcmlhbnRzW2N2YXJzXSA9IERFQlVHX01FVEhPRF9WQVJJQU5UX05VTEw7Ci0KLSAgICAgIGlmICgqKnBwICE9ICdcMCcpCi0JKysqcHA7Ci0KLSAgICAgIGlmIChjICsgMSA+PSBhbGxvYykKLQl7Ci0JICBhbGxvYyArPSAxMDsKLQkgIG1ldGhvZHMgPSAoKGRlYnVnX21ldGhvZCAqKQotCQkgICAgIHhyZWFsbG9jICgoUFRSKSBtZXRob2RzLCBhbGxvYyAqIHNpemVvZiAqbWV0aG9kcykpOwotCX0KLQotICAgICAgbWV0aG9kc1tjXSA9IGRlYnVnX21ha2VfbWV0aG9kIChkaGFuZGxlLCBuYW1lLCB2YXJpYW50cyk7Ci0KLSAgICAgICsrYzsKLSAgICB9Ci0KLSAgaWYgKG1ldGhvZHMgIT0gTlVMTCkKLSAgICBtZXRob2RzW2NdID0gREVCVUdfTUVUSE9EX05VTEw7Ci0KLSAgKnJldHAgPSBtZXRob2RzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQYXJzZSBhIHN0cmluZyByZXByZXNlbnRpbmcgYXJndW1lbnQgdHlwZXMgZm9yIGEgbWV0aG9kLiAgU3RhYnMKLSAgIHRyaWVzIHRvIHNhdmUgc3BhY2UgYnkgcGFja2luZyBhcmd1bWVudCB0eXBlcyBpbnRvIGEgbWFuZ2xlZAotICAgc3RyaW5nLiAgVGhpcyBzdHJpbmcgc2hvdWxkIGdpdmUgdXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGV4dHJhY3QKLSAgIGJvdGggYXJndW1lbnQgdHlwZXMgYW5kIHRoZSBwaHlzaWNhbCBuYW1lIG9mIHRoZSBmdW5jdGlvbiwgZ2l2ZW4KLSAgIHRoZSB0YWcgbmFtZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlCi1wYXJzZV9zdGFiX2FyZ3R5cGVzIChkaGFuZGxlLCBpbmZvLCBjbGFzc190eXBlLCBmaWVsZG5hbWUsIHRhZ25hbWUsCi0JCSAgICAgcmV0dXJuX3R5cGUsIGFyZ3R5cGVzLCBjb25zdHAsIHZvbGF0aWxlcCwgcHBoeXNuYW1lKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBkZWJ1Z190eXBlIGNsYXNzX3R5cGU7Ci0gICAgIGNvbnN0IGNoYXIgKmZpZWxkbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGFnbmFtZTsKLSAgICAgZGVidWdfdHlwZSByZXR1cm5fdHlwZTsKLSAgICAgY29uc3QgY2hhciAqYXJndHlwZXM7Ci0gICAgIGJvb2xlYW4gY29uc3RwOwotICAgICBib29sZWFuIHZvbGF0aWxlcDsKLSAgICAgY29uc3QgY2hhciAqKnBwaHlzbmFtZTsKLXsKLSAgYm9vbGVhbiBpc19mdWxsX3BoeXNuYW1lX2NvbnN0cnVjdG9yOwotICBib29sZWFuIGlzX2NvbnN0cnVjdG9yOwotICBib29sZWFuIGlzX2Rlc3RydWN0b3I7Ci0gIGRlYnVnX3R5cGUgKmFyZ3M7Ci0gIGJvb2xlYW4gdmFyYXJnczsKLQotICAvKiBDb25zdHJ1Y3RvcnMgYXJlIHNvbWV0aW1lcyBoYW5kbGVkIHNwZWNpYWxseS4gICovCi0gIGlzX2Z1bGxfcGh5c25hbWVfY29uc3RydWN0b3IgPSAoKGFyZ3R5cGVzWzBdID09ICdfJwotCQkJCSAgICYmIGFyZ3R5cGVzWzFdID09ICdfJwotCQkJCSAgICYmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgYXJndHlwZXNbMl0pCi0JCQkJICAgICAgIHx8IGFyZ3R5cGVzWzJdID09ICdRJwotCQkJCSAgICAgICB8fCBhcmd0eXBlc1syXSA9PSAndCcpKQotCQkJCSAgfHwgc3RybmNtcCAoYXJndHlwZXMsICJfX2N0IiwgNCkgPT0gMCk7Ci0KLSAgaXNfY29uc3RydWN0b3IgPSAoaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvcgotCQkgICAgfHwgKHRhZ25hbWUgIT0gTlVMTAotCQkJJiYgc3RyY21wIChmaWVsZG5hbWUsIHRhZ25hbWUpID09IDApKTsKLSAgaXNfZGVzdHJ1Y3RvciA9ICgoYXJndHlwZXNbMF0gPT0gJ18nCi0JCSAgICAmJiAoYXJndHlwZXNbMV0gPT0gJyQnIHx8IGFyZ3R5cGVzWzFdID09ICcuJykKLQkJICAgICYmIGFyZ3R5cGVzWzJdID09ICdfJykKLQkJICAgfHwgc3RybmNtcCAoYXJndHlwZXMsICJfX2R0IiwgNCkgPT0gMCk7Ci0KLSAgaWYgKGlzX2Rlc3RydWN0b3IgfHwgaXNfZnVsbF9waHlzbmFtZV9jb25zdHJ1Y3RvcikKLSAgICAqcHBoeXNuYW1lID0gYXJndHlwZXM7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgbGVuOwotICAgICAgY29uc3QgY2hhciAqY29uc3RfcHJlZml4OwotICAgICAgY29uc3QgY2hhciAqdm9sYXRpbGVfcHJlZml4OwotICAgICAgY2hhciBidWZbMjBdOwotICAgICAgdW5zaWduZWQgaW50IG1hbmdsZWRfbmFtZV9sZW47Ci0gICAgICBjaGFyICpwaHlzbmFtZTsKLQotICAgICAgbGVuID0gdGFnbmFtZSA9PSBOVUxMID8gMCA6IHN0cmxlbiAodGFnbmFtZSk7Ci0gICAgICBjb25zdF9wcmVmaXggPSBjb25zdHAgPyAiQyIgOiAiIjsKLSAgICAgIHZvbGF0aWxlX3ByZWZpeCA9IHZvbGF0aWxlcCA/ICJWIiA6ICIiOwotCi0gICAgICBpZiAobGVuID09IDApCi0Jc3ByaW50ZiAoYnVmLCAiX18lcyVzIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgpOwotICAgICAgZWxzZSBpZiAodGFnbmFtZSAhPSBOVUxMICYmIHN0cmNociAodGFnbmFtZSwgJzwnKSAhPSBOVUxMKQotCXsKLQkgIC8qIFRlbXBsYXRlIG1ldGhvZHMgYXJlIGZ1bGx5IG1hbmdsZWQuICAqLwotCSAgc3ByaW50ZiAoYnVmLCAiX18lcyVzIiwgY29uc3RfcHJlZml4LCB2b2xhdGlsZV9wcmVmaXgpOwotCSAgdGFnbmFtZSA9IE5VTEw7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIGVsc2UKLQlzcHJpbnRmIChidWYsICJfXyVzJXMlZCIsIGNvbnN0X3ByZWZpeCwgdm9sYXRpbGVfcHJlZml4LCBsZW4pOwotCi0gICAgICBtYW5nbGVkX25hbWVfbGVuID0gKChpc19jb25zdHJ1Y3RvciA/IDAgOiBzdHJsZW4gKGZpZWxkbmFtZSkpCi0JCQkgICsgc3RybGVuIChidWYpCi0JCQkgICsgbGVuCi0JCQkgICsgc3RybGVuIChhcmd0eXBlcykKLQkJCSAgKyAxKTsKLQotICAgICAgaWYgKGZpZWxkbmFtZVswXSA9PSAnbycKLQkgICYmIGZpZWxkbmFtZVsxXSA9PSAncCcKLQkgICYmIChmaWVsZG5hbWVbMl0gPT0gJyQnIHx8IGZpZWxkbmFtZVsyXSA9PSAnLicpKQotCXsKLQkgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLQotCSAgb3BuYW1lID0gY3BsdXNfbWFuZ2xlX29wbmFtZSAoZmllbGRuYW1lICsgMywgMCk7Ci0JICBpZiAob3BuYW1lID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIk5vIG1hbmdsaW5nIGZvciBcIiVzXCJcbiIpLCBmaWVsZG5hbWUpOwotCSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0JICAgIH0KLQkgIG1hbmdsZWRfbmFtZV9sZW4gKz0gc3RybGVuIChvcG5hbWUpOwotCSAgcGh5c25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChtYW5nbGVkX25hbWVfbGVuKTsKLQkgIHN0cm5jcHkgKHBoeXNuYW1lLCBmaWVsZG5hbWUsIDMpOwotCSAgc3RyY3B5IChwaHlzbmFtZSArIDMsIG9wbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHBoeXNuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAobWFuZ2xlZF9uYW1lX2xlbik7Ci0JICBpZiAoaXNfY29uc3RydWN0b3IpCi0JICAgIHBoeXNuYW1lWzBdID0gJ1wwJzsKLQkgIGVsc2UKLQkgICAgc3RyY3B5IChwaHlzbmFtZSwgZmllbGRuYW1lKTsKLQl9Ci0KLSAgICAgIHN0cmNhdCAocGh5c25hbWUsIGJ1Zik7Ci0gICAgICBpZiAodGFnbmFtZSAhPSBOVUxMKQotCXN0cmNhdCAocGh5c25hbWUsIHRhZ25hbWUpOwotICAgICAgc3RyY2F0IChwaHlzbmFtZSwgYXJndHlwZXMpOwotCi0gICAgICAqcHBoeXNuYW1lID0gcGh5c25hbWU7Ci0gICAgfQotCi0gIGlmICgqYXJndHlwZXMgPT0gJ1wwJyB8fCBpc19kZXN0cnVjdG9yKQotICAgIHsKLSAgICAgIGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKmFyZ3MpOwotICAgICAgKmFyZ3MgPSBOVUxMOwotICAgICAgcmV0dXJuIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBjbGFzc190eXBlLCBhcmdzLAotCQkJCSAgICAgZmFsc2UpOwotICAgIH0KLQotICBhcmdzID0gc3RhYl9kZW1hbmdsZV9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgKnBwaHlzbmFtZSwgJnZhcmFyZ3MpOwotICBpZiAoYXJncyA9PSBOVUxMKQotICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0KLSAgcmV0dXJuIGRlYnVnX21ha2VfbWV0aG9kX3R5cGUgKGRoYW5kbGUsIHJldHVybl90eXBlLCBjbGFzc190eXBlLCBhcmdzLAotCQkJCSB2YXJhcmdzKTsKLX0KLQotLyogVGhlIHRhaWwgZW5kIG9mIHN0YWJzIGZvciBDKysgY2xhc3NlcyB0aGF0IGNvbnRhaW4gYSB2aXJ0dWFsIGZ1bmN0aW9uCi0gICBwb2ludGVyIGNvbnRhaW5zIGEgdGlsZGUsIGEgJSwgYW5kIGEgdHlwZSBudW1iZXIuCi0gICBUaGUgdHlwZSBudW1iZXIgcmVmZXJzIHRvIHRoZSBiYXNlIGNsYXNzIChwb3NzaWJseSB0aGlzIGNsYXNzIGl0c2VsZikgd2hpY2gKLSAgIGNvbnRhaW5zIHRoZSB2dGFibGUgcG9pbnRlciBmb3IgdGhlIGN1cnJlbnQgY2xhc3MuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgaGF2ZSBwYXJzZWQgYWxsIHRoZSBtZXRob2QgZGVjbGFyYXRpb25zLAotICAgc28gd2UgY2FuIGxvb2sgZm9yIHRoZSB2cHRyIGJhc2UgY2xhc3MgaW5mby4gICovCi0KLXN0YXRpYyBib29sZWFuCi1wYXJzZV9zdGFiX3RpbGRlX2ZpZWxkIChkaGFuZGxlLCBpbmZvLCBwcCwgdHlwZW51bXMsIHJldHZwdHJiYXNlLCByZXRvd252cHRyKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci0gICAgIGRlYnVnX3R5cGUgKnJldHZwdHJiYXNlOwotICAgICBib29sZWFuICpyZXRvd252cHRyOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpob2xkOwotICBpbnQgdnR5cGVudW1zWzJdOwotCi0gICpyZXR2cHRyYmFzZSA9IERFQlVHX1RZUEVfTlVMTDsKLSAgKnJldG93bnZwdHIgPSBmYWxzZTsKLQotICBvcmlnID0gKnBwOwotCi0gIC8qIElmIHdlIGFyZSBwb3NpdGlvbmVkIGF0IGEgJzsnLCB0aGVuIHNraXAgaXQuICovCi0gIGlmICgqKnBwID09ICc7JykKLSAgICArKypwcDsKLQotICBpZiAoKipwcCAhPSAnficpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgKysqcHA7Ci0KLSAgaWYgKCoqcHAgPT0gJz0nIHx8ICoqcHAgPT0gJysnIHx8ICoqcHAgPT0gJy0nKQotICAgIHsKLSAgICAgIC8qIE9ic29sZXRlIGZsYWdzIHRoYXQgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YKLQkgY29uc3RydWN0b3JzIGFuZC9vciBkZXN0cnVjdG9ycy4gKi8KLSAgICAgICsrKnBwOwotICAgIH0KLQotICBpZiAoKipwcCAhPSAnJScpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgKysqcHA7Ci0KLSAgaG9sZCA9ICpwcDsKLQotICAvKiBUaGUgbmV4dCBudW1iZXIgaXMgdGhlIHR5cGUgbnVtYmVyIG9mIHRoZSBiYXNlIGNsYXNzIChwb3NzaWJseQotICAgICBvdXIgb3duIGNsYXNzKSB3aGljaCBzdXBwbGllcyB0aGUgdnRhYmxlIGZvciB0aGlzIGNsYXNzLiAgKi8KLSAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAocHAsIHZ0eXBlbnVtcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2dHlwZW51bXNbMF0gPT0gdHlwZW51bXNbMF0KLSAgICAgICYmIHZ0eXBlbnVtc1sxXSA9PSB0eXBlbnVtc1sxXSkKLSAgICAqcmV0b3dudnB0ciA9IHRydWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkZWJ1Z190eXBlIHZ0eXBlOwotICAgICAgY29uc3QgY2hhciAqcDsKLQotICAgICAgKnBwID0gaG9sZDsKLQotICAgICAgdnR5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJICAgICAgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgICAgIGZvciAocCA9ICpwcDsgKnAgIT0gJzsnICYmICpwICE9ICdcMCc7IHArKykKLQk7Ci0gICAgICBpZiAoKnAgIT0gJzsnKQotCXsKLQkgIGJhZF9zdGFiIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgICpyZXR2cHRyYmFzZSA9IHZ0eXBlOwotCi0gICAgICAqcHAgPSBwICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7ICAgIAotfQotCi0vKiBSZWFkIGEgZGVmaW5pdGlvbiBvZiBhbiBhcnJheSB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXBhcnNlX3N0YWJfYXJyYXlfdHlwZSAoZGhhbmRsZSwgaW5mbywgcHAsIHN0cmluZ3ApCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgYm9vbGVhbiBzdHJpbmdwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBjb25zdCBjaGFyICpwOwotICBpbnQgdHlwZW51bXNbMl07Ci0gIGRlYnVnX3R5cGUgaW5kZXhfdHlwZTsKLSAgYm9vbGVhbiBhZGp1c3RhYmxlOwotICBiZmRfc2lnbmVkX3ZtYSBsb3dlciwgdXBwZXI7Ci0gIGRlYnVnX3R5cGUgZWxlbWVudF90eXBlOwotCi0gIC8qIEZvcm1hdCBvZiBhbiBhcnJheSB0eXBlOgotICAgICAiYXI8aW5kZXggdHlwZT47bG93ZXI7dXBwZXI7PGFycmF5X2NvbnRlbnRzX3R5cGU+Ii4KLSAgICAgT1M5MDAwOiAiYXJsb3dlcix1cHBlcjs8YXJyYXlfY29udGVudHNfdHlwZT4iLgotCi0gICAgIEZvcnRyYW4gYWRqdXN0YWJsZSBhcnJheXMgdXNlIEFkaWdpdHMgb3IgVGRpZ2l0cyBmb3IgbG93ZXIgb3IgdXBwZXI7Ci0gICAgIGZvciB0aGVzZSwgcHJvZHVjZSBhIHR5cGUgbGlrZSBmbG9hdFtdW10uICAqLwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgLyogRklYTUU6IGdkYiBjaGVja3Mgb3M5a19zdGFicyBoZXJlLiAgKi8KLQotICAvKiBJZiB0aGUgaW5kZXggdHlwZSBpcyB0eXBlIDAsIHdlIHRha2UgaXQgYXMgaW50LiAgKi8KLSAgcCA9ICpwcDsKLSAgaWYgKCEgcGFyc2Vfc3RhYl90eXBlX251bWJlciAoJnAsIHR5cGVudW1zKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICh0eXBlbnVtc1swXSA9PSAwICYmIHR5cGVudW1zWzFdID09IDAgJiYgKipwcCAhPSAnPScpCi0gICAgewotICAgICAgaW5kZXhfdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAoZGhhbmRsZSwgImludCIpOwotICAgICAgaWYgKGluZGV4X3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCXsKLQkgIGluZGV4X3R5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0JICBpZiAoaW5kZXhfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAqcHAgPSBwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4X3R5cGUgPSBwYXJzZV9zdGFiX3R5cGUgKGRoYW5kbGUsIGluZm8sIChjb25zdCBjaGFyICopIE5VTEwsIHBwLAotCQkJCSAgICAoZGVidWdfdHlwZSAqKikgTlVMTCk7Ci0gICAgfQotCi0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgYWRqdXN0YWJsZSA9IGZhbHNlOwotCi0gIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSAmJiAqKnBwICE9ICctJykKLSAgICB7Ci0gICAgICArKypwcDsKLSAgICAgIGFkanVzdGFibGUgPSB0cnVlOwotICAgIH0KLQotICBsb3dlciA9IChiZmRfc2lnbmVkX3ZtYSkgcGFyc2VfbnVtYmVyIChwcCwgKGJvb2xlYW4gKikgTlVMTCk7Ci0gIGlmICgqKnBwICE9ICc7JykKLSAgICB7Ci0gICAgICBiYWRfc3RhYiAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICArKypwcDsKLQotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkgJiYgKipwcCAhPSAnLScpCi0gICAgewotICAgICAgKysqcHA7Ci0gICAgICBhZGp1c3RhYmxlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgdXBwZXIgPSAoYmZkX3NpZ25lZF92bWEpIHBhcnNlX251bWJlciAocHAsIChib29sZWFuICopIE5VTEwpOwotICBpZiAoKipwcCAhPSAnOycpCi0gICAgewotICAgICAgYmFkX3N0YWIgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKysqcHA7Ci0KLSAgZWxlbWVudF90eXBlID0gcGFyc2Vfc3RhYl90eXBlIChkaGFuZGxlLCBpbmZvLCAoY29uc3QgY2hhciAqKSBOVUxMLCBwcCwKLQkJCQkgIChkZWJ1Z190eXBlICoqKSBOVUxMKTsKLSAgaWYgKGVsZW1lbnRfdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChhZGp1c3RhYmxlKQotICAgIHsKLSAgICAgIGxvd2VyID0gMDsKLSAgICAgIHVwcGVyID0gLTE7Ci0gICAgfQotCi0gIHJldHVybiBkZWJ1Z19tYWtlX2FycmF5X3R5cGUgKGRoYW5kbGUsIGVsZW1lbnRfdHlwZSwgaW5kZXhfdHlwZSwgbG93ZXIsCi0JCQkJdXBwZXIsIHN0cmluZ3ApOwotfQotCi0vKiBUaGlzIHN0cnVjdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBmaWxlcyB3ZSBoYXZlIHNlZW4gdXNpbmcKLSAgIE5fQklOQ0wuICAqLwotCi1zdHJ1Y3QgYmluY2xfZmlsZQotewotICAvKiBUaGUgbmV4dCBOX0JJTkNMIGZpbGUuICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbmV4dDsKLSAgLyogVGhlIG5leHQgTl9CSU5DTCBvbiB0aGUgc3RhY2suICAqLwotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbmV4dF9zdGFjazsKLSAgLyogVGhlIGZpbGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBoYXNoIHZhbHVlLiAgKi8KLSAgYmZkX3ZtYSBoYXNoOwotICAvKiBUaGUgZmlsZSBpbmRleC4gICovCi0gIHVuc2lnbmVkIGludCBmaWxlOwotICAvKiBUaGUgbGlzdCBvZiB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVzICpmaWxlX3R5cGVzOwotfTsKLQotLyogU3RhcnQgYSBuZXcgTl9CSU5DTCBmaWxlLCBwdXNoaW5nIGl0IG9udG8gdGhlIHN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXB1c2hfYmluY2wgKGluZm8sIG5hbWUsIGhhc2gpCi0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBoYXNoOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbjsKLQotICBuID0gKHN0cnVjdCBiaW5jbF9maWxlICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPm5leHQgPSBpbmZvLT5iaW5jbF9saXN0OwotICBuLT5uZXh0X3N0YWNrID0gaW5mby0+YmluY2xfc3RhY2s7Ci0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT5oYXNoID0gaGFzaDsKLSAgbi0+ZmlsZSA9IGluZm8tPmZpbGVzOwotICBuLT5maWxlX3R5cGVzID0gTlVMTDsKLSAgaW5mby0+YmluY2xfbGlzdCA9IG47Ci0gIGluZm8tPmJpbmNsX3N0YWNrID0gbjsKLQotICArK2luZm8tPmZpbGVzOwotICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJICAgICAgeHJlYWxsb2MgKChQVFIpIGluZm8tPmZpbGVfdHlwZXMsCi0JCQkJKGluZm8tPmZpbGVzCi0JCQkJICogc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSkpOwotICBpbmZvLT5maWxlX3R5cGVzW24tPmZpbGVdID0gTlVMTDsKLX0KLQotLyogRmluaXNoIGFuIE5fQklOQ0wgZmlsZSwgYXQgYW4gTl9FSU5DTCwgcG9wcGluZyB0aGUgbmFtZSBvZmYgdGhlCi0gICBzdGFjay4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBvcF9iaW5jbCAoaW5mbykKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbzsKLQotICBvID0gaW5mby0+YmluY2xfc3RhY2s7Ci0gIGlmIChvID09IE5VTEwpCi0gICAgcmV0dXJuIGluZm8tPm1haW5fZmlsZW5hbWU7Ci0gIGluZm8tPmJpbmNsX3N0YWNrID0gby0+bmV4dF9zdGFjazsKLQotICBvLT5maWxlX3R5cGVzID0gaW5mby0+ZmlsZV90eXBlc1tvLT5maWxlXTsKLQotICBpZiAoaW5mby0+YmluY2xfc3RhY2sgPT0gTlVMTCkKLSAgICByZXR1cm4gaW5mby0+bWFpbl9maWxlbmFtZTsKLSAgcmV0dXJuIGluZm8tPmJpbmNsX3N0YWNrLT5uYW1lOwotfQotCi0vKiBIYW5kbGUgYW4gTl9FWENMOiBnZXQgdGhlIHR5cGVzIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTl9CSU5DTC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1maW5kX2V4Y2wgKGluZm8sIG5hbWUsIGhhc2gpCi0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBoYXNoOwotewotICBzdHJ1Y3QgYmluY2xfZmlsZSAqbDsKLQotICArK2luZm8tPmZpbGVzOwotICBpbmZvLT5maWxlX3R5cGVzID0gKChzdHJ1Y3Qgc3RhYl90eXBlcyAqKikKLQkJICAgICAgeHJlYWxsb2MgKChQVFIpIGluZm8tPmZpbGVfdHlwZXMsCi0JCQkJKGluZm8tPmZpbGVzCi0JCQkJICogc2l6ZW9mICppbmZvLT5maWxlX3R5cGVzKSkpOwotCi0gIGZvciAobCA9IGluZm8tPmJpbmNsX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgaWYgKGwtPmhhc2ggPT0gaGFzaCAmJiBzdHJjbXAgKGwtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBicmVhazsKLSAgaWYgKGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB3YXJuX3N0YWIgKG5hbWUsIF8oIlVuZGVmaW5lZCBOX0VYQ0wiKSk7Ci0gICAgICBpbmZvLT5maWxlX3R5cGVzW2luZm8tPmZpbGVzIC0gMV0gPSBOVUxMOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGluZm8tPmZpbGVfdHlwZXNbaW5mby0+ZmlsZXMgLSAxXSA9IGwtPmZpbGVfdHlwZXM7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhhbmRsZSBhIHZhcmlhYmxlIGRlZmluaXRpb24uICBnY2MgZW1pdHMgdmFyaWFibGUgZGVmaW5pdGlvbnMgZm9yIGEKLSAgIGJsb2NrIGJlZm9yZSB0aGUgTl9MQlJBQywgc28gd2UgbXVzdCBob2xkIG9udG8gdGhlbSB1bnRpbCB3ZSBzZWUKLSAgIGl0LiAgVGhlIFN1blBSTyBjb21waWxlciBlbWl0cyB2YXJpYWJsZSBkZWZpbml0aW9ucyBhZnRlciB0aGUKLSAgIE5fTEJSQUMsIHNvIHdlIGNhbiBjYWxsIGRlYnVnX3JlY29yZF92YXJpYWJsZSBpbW1lZGlhdGVseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3JlY29yZF92YXJpYWJsZSAoZGhhbmRsZSwgaW5mbywgbmFtZSwgdHlwZSwga2luZCwgdmFsKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkZWJ1Z190eXBlIHR5cGU7Ci0gICAgIGVudW0gZGVidWdfdmFyX2tpbmQga2luZDsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3BlbmRpbmdfdmFyICp2OwotCi0gIGlmICgoa2luZCA9PSBERUJVR19HTE9CQUwgfHwga2luZCA9PSBERUJVR19TVEFUSUMpCi0gICAgICB8fCAhIGluZm8tPndpdGhpbl9mdW5jdGlvbgotICAgICAgfHwgKGluZm8tPmdjY19jb21waWxlZCA9PSAwICYmIGluZm8tPm5fb3B0X2ZvdW5kKSkKLSAgICByZXR1cm4gZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCBuYW1lLCB0eXBlLCBraW5kLCB2YWwpOwotCi0gIHYgPSAoc3RydWN0IHN0YWJfcGVuZGluZ192YXIgKikgeG1hbGxvYyAoc2l6ZW9mICp2KTsKLSAgbWVtc2V0ICh2LCAwLCBzaXplb2YgKnYpOwotCi0gIHYtPm5leHQgPSBpbmZvLT5wZW5kaW5nOwotICB2LT5uYW1lID0gbmFtZTsKLSAgdi0+dHlwZSA9IHR5cGU7Ci0gIHYtPmtpbmQgPSBraW5kOwotICB2LT52YWwgPSB2YWw7Ci0gIGluZm8tPnBlbmRpbmcgPSB2OwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBFbWl0IHBlbmRpbmcgdmFyaWFibGUgZGVmaW5pdGlvbnMuICBUaGlzIGlzIGNhbGxlZCBhZnRlciB3ZSBzZWUgdGhlCi0gICBOX0xCUkFDIHRoYXQgc3RhcnRzIHRoZSBibG9jay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VtaXRfcGVuZGluZ192YXJzIChkaGFuZGxlLCBpbmZvKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotewotICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqdjsKLQotICB2ID0gaW5mby0+cGVuZGluZzsKLSAgd2hpbGUgKHYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc3RhYl9wZW5kaW5nX3ZhciAqbmV4dDsKLQotICAgICAgaWYgKCEgZGVidWdfcmVjb3JkX3ZhcmlhYmxlIChkaGFuZGxlLCB2LT5uYW1lLCB2LT50eXBlLCB2LT5raW5kLCB2LT52YWwpKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgbmV4dCA9IHYtPm5leHQ7Ci0gICAgICBmcmVlICh2KTsKLSAgICAgIHYgPSBuZXh0OwotICAgIH0KLQotICBpbmZvLT5wZW5kaW5nID0gTlVMTDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluZCB0aGUgc2xvdCBmb3IgYSB0eXBlIGluIHRoZSBkYXRhYmFzZS4gICovCi0KLXN0YXRpYyBkZWJ1Z190eXBlICoKLXN0YWJfZmluZF9zbG90IChpbmZvLCB0eXBlbnVtcykKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBpbnQgKnR5cGVudW1zOwotewotICBpbnQgZmlsZW51bTsKLSAgaW50IGluZGV4OwotICBzdHJ1Y3Qgc3RhYl90eXBlcyAqKnBzOwotCi0gIGZpbGVudW0gPSB0eXBlbnVtc1swXTsKLSAgaW5kZXggPSB0eXBlbnVtc1sxXTsKLQotICBpZiAoZmlsZW51bSA8IDAgfHwgKHVuc2lnbmVkIGludCkgZmlsZW51bSA+PSBpbmZvLT5maWxlcykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlR5cGUgZmlsZSBudW1iZXIgJWQgb3V0IG9mIHJhbmdlXG4iKSwgZmlsZW51bSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGlmIChpbmRleCA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJUeXBlIGluZGV4IG51bWJlciAlZCBvdXQgb2YgcmFuZ2VcbiIpLCBpbmRleCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgcHMgPSBpbmZvLT5maWxlX3R5cGVzICsgZmlsZW51bTsKLQotICB3aGlsZSAoaW5kZXggPj0gU1RBQl9UWVBFU19TTE9UUykKLSAgICB7Ci0gICAgICBpZiAoKnBzID09IE5VTEwpCi0JewotCSAgKnBzID0gKHN0cnVjdCBzdGFiX3R5cGVzICopIHhtYWxsb2MgKHNpemVvZiAqKnBzKTsKLQkgIG1lbXNldCAoKnBzLCAwLCBzaXplb2YgKipwcyk7Ci0JfQotICAgICAgcHMgPSAmKCpwcyktPm5leHQ7Ci0gICAgICBpbmRleCAtPSBTVEFCX1RZUEVTX1NMT1RTOwotICAgIH0KLSAgaWYgKCpwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgICpwcyA9IChzdHJ1Y3Qgc3RhYl90eXBlcyAqKSB4bWFsbG9jIChzaXplb2YgKipwcyk7Ci0gICAgICBtZW1zZXQgKCpwcywgMCwgc2l6ZW9mICoqcHMpOwotICAgIH0KLQotICByZXR1cm4gKCpwcyktPnR5cGVzICsgaW5kZXg7Ci19Ci0KLS8qIEZpbmQgYSB0eXBlIGdpdmVuIGEgdHlwZSBudW1iZXIuICBJZiB0aGUgdHlwZSBoYXMgbm90IGJlZW4KLSAgIGFsbG9jYXRlZCB5ZXQsIGNyZWF0ZSBhbiBpbmRpcmVjdCB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXN0YWJfZmluZF90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtcykKLSAgICAgUFRSIGRoYW5kbGU7Ci0gICAgIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgICAgY29uc3QgaW50ICp0eXBlbnVtczsKLXsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBpZiAodHlwZW51bXNbMF0gPT0gMCAmJiB0eXBlbnVtc1sxXSA8IDApCi0gICAgewotICAgICAgLyogQSBuZWdhdGl2ZSB0eXBlIG51bWJlciBpbmRpY2F0ZXMgYW4gWENPRkYgYnVpbHRpbiB0eXBlLiAgKi8KLSAgICAgIHJldHVybiBzdGFiX3hjb2ZmX2J1aWx0aW5fdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXNbMV0pOwotICAgIH0KLQotICBzbG90ID0gc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKTsKLSAgaWYgKHNsb3QgPT0gTlVMTCkKLSAgICByZXR1cm4gREVCVUdfVFlQRV9OVUxMOwotCi0gIGlmICgqc2xvdCA9PSBERUJVR19UWVBFX05VTEwpCi0gICAgcmV0dXJuIGRlYnVnX21ha2VfaW5kaXJlY3RfdHlwZSAoZGhhbmRsZSwgc2xvdCwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLSAgcmV0dXJuICpzbG90OwotfQotCi0vKiBSZWNvcmQgdGhhdCBhIGdpdmVuIHR5cGUgbnVtYmVyIHJlZmVycyB0byBhIGdpdmVuIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9yZWNvcmRfdHlwZSAoZGhhbmRsZSwgaW5mbywgdHlwZW51bXMsIHR5cGUpCi0gICAgIFBUUiBkaGFuZGxlOwotICAgICBzdHJ1Y3Qgc3RhYl9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGludCAqdHlwZW51bXM7Ci0gICAgIGRlYnVnX3R5cGUgdHlwZTsKLXsKLSAgZGVidWdfdHlwZSAqc2xvdDsKLQotICBzbG90ID0gc3RhYl9maW5kX3Nsb3QgKGluZm8sIHR5cGVudW1zKTsKLSAgaWYgKHNsb3QgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogZ2RiIGFwcGVhcnMgdG8gaWdub3JlIHR5cGUgcmVkZWZpbml0aW9ucywgc28gd2UgZG8gYXMgd2VsbC4gICovCi0KLSAgKnNsb3QgPSB0eXBlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm4gYW4gWENPRkYgYnVpbHRpbiB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXN0YWJfeGNvZmZfYnVpbHRpbl90eXBlIChkaGFuZGxlLCBpbmZvLCB0eXBlbnVtKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBpbnQgdHlwZW51bTsKLXsKLSAgZGVidWdfdHlwZSByZXR0eXBlOwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIGlmICh0eXBlbnVtID49IDAgfHwgdHlwZW51bSA8IC1YQ09GRl9UWVBFX0NPVU5UKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIFhDT0ZGIHR5cGUgJWRcbiIpLCB0eXBlbnVtKTsKLSAgICAgIHJldHVybiBERUJVR19UWVBFX05VTEw7Ci0gICAgfQotICBpZiAoaW5mby0+eGNvZmZfdHlwZXNbLXR5cGVudW1dICE9IE5VTEwpCi0gICAgcmV0dXJuIGluZm8tPnhjb2ZmX3R5cGVzWy10eXBlbnVtXTsKLQotICBzd2l0Y2ggKC10eXBlbnVtKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBUaGUgc2l6ZSBvZiB0aGlzIGFuZCBhbGwgdGhlIG90aGVyIHR5cGVzIGFyZSBmaXhlZCwgZGVmaW5lZAotCSBieSB0aGUgZGVidWdnaW5nIGZvcm1hdC4gICovCi0gICAgICBuYW1lID0gImludCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbmFtZSA9ICJjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBuYW1lID0gInNob3J0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBuYW1lID0gImxvbmciOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgY2hhciI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgMSwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICBuYW1lID0gInNpZ25lZCBjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDc6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIHNob3J0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIG5hbWUgPSAidW5zaWduZWQgaW50IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgOToKLSAgICAgIG5hbWUgPSAidW5zaWduZWQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgIGNhc2UgMTA6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmciOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDQsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMToKLSAgICAgIG5hbWUgPSAidm9pZCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKGRoYW5kbGUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIC8qIElFRUUgc2luZ2xlIHByZWNpc2lvbiAoMzIgYml0KS4gICovCi0gICAgICBuYW1lID0gImZsb2F0IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMzoKLSAgICAgIC8qIElFRUUgZG91YmxlIHByZWNpc2lvbiAoNjQgYml0KS4gICovCi0gICAgICBuYW1lID0gImRvdWJsZSI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTQ6Ci0gICAgICAvKiBUaGlzIGlzIGFuIElFRUUgZG91YmxlIG9uIHRoZSBSUy82MDAwLCBhbmQgZGlmZmVyZW50IG1hY2hpbmVzCi0JIHdpdGggZGlmZmVyZW50IHNpemVzIGZvciAibG9uZyBkb3VibGUiIHNob3VsZCB1c2UgZGlmZmVyZW50Ci0JIG5lZ2F0aXZlIHR5cGUgbnVtYmVycy4gIFNlZSBzdGFicy50ZXhpbmZvLiAgKi8KLSAgICAgIG5hbWUgPSAibG9uZyBkb3VibGUiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAoZGhhbmRsZSwgOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE1OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCA0LCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgbmFtZSA9ICJib29sZWFuIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE3OgotICAgICAgbmFtZSA9ICJzaG9ydCByZWFsIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKGRoYW5kbGUsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxODoKLSAgICAgIG5hbWUgPSAicmVhbCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9mbG9hdF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTk6Ci0gICAgICAvKiBGSVhNRSAqLwotICAgICAgbmFtZSA9ICJzdHJpbmdwdHIiOwotICAgICAgcmV0dHlwZSA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIwOgotICAgICAgLyogRklYTUUgKi8KLSAgICAgIG5hbWUgPSAiY2hhcmFjdGVyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjE6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwqMSI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9ib29sX3R5cGUgKGRoYW5kbGUsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyMjoKLSAgICAgIG5hbWUgPSAibG9naWNhbCoyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAoZGhhbmRsZSwgMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDIzOgotICAgICAgbmFtZSA9ICJsb2dpY2FsKjQiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICBuYW1lID0gImxvZ2ljYWwiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjU6Ci0gICAgICAvKiBDb21wbGV4IHR5cGUgY29uc2lzdGluZyBvZiB0d28gSUVFRSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlcy4gICovCi0gICAgICBuYW1lID0gImNvbXBsZXgiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfY29tcGxleF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjY6Ci0gICAgICAvKiBDb21wbGV4IHR5cGUgY29uc2lzdGluZyBvZiB0d28gSUVFRSBkb3VibGUgcHJlY2lzaW9uIHZhbHVlcy4gICovCi0gICAgICBuYW1lID0gImRvdWJsZSBjb21wbGV4IjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2NvbXBsZXhfdHlwZSAoZGhhbmRsZSwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNzoKLSAgICAgIG5hbWUgPSAiaW50ZWdlcioxIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAxLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI4OgotICAgICAgbmFtZSA9ICJpbnRlZ2VyKjIiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDIsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjk6Ci0gICAgICBuYW1lID0gImludGVnZXIqNCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgNCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMDoKLSAgICAgIC8qIEZJWE1FICovCi0gICAgICBuYW1lID0gIndjaGFyIjsKLSAgICAgIHJldHR5cGUgPSBkZWJ1Z19tYWtlX2ludF90eXBlIChkaGFuZGxlLCAyLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMxOgotICAgICAgbmFtZSA9ICJsb25nIGxvbmciOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKGRoYW5kbGUsIDgsIGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBuYW1lID0gInVuc2lnbmVkIGxvbmcgbG9uZyI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMzOgotICAgICAgbmFtZSA9ICJsb2dpY2FsKjgiOwotICAgICAgcmV0dHlwZSA9IGRlYnVnX21ha2VfYm9vbF90eXBlIChkaGFuZGxlLCA4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzQ6Ci0gICAgICBuYW1lID0gImludGVnZXIqOCI7Ci0gICAgICByZXR0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAoZGhhbmRsZSwgOCwgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR0eXBlID0gZGVidWdfbmFtZV90eXBlIChkaGFuZGxlLCBuYW1lLCByZXR0eXBlKTsKLQotICBpbmZvLT54Y29mZl90eXBlc1stdHlwZW51bV0gPSByZXR0eXBlOwotCi0gIHJldHVybiByZXR0eXBlOwotfQotCi0vKiBGaW5kIG9yIGNyZWF0ZSBhIHRhZ2dlZCB0eXBlLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUKLXN0YWJfZmluZF90YWdnZWRfdHlwZSAoZGhhbmRsZSwgaW5mbywgcCwgbGVuLCBraW5kKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwOwotICAgICBpbnQgbGVuOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotewotICBjaGFyICpuYW1lOwotICBkZWJ1Z190eXBlIGR0eXBlOwotICBzdHJ1Y3Qgc3RhYl90YWcgKnN0OwotCi0gIG5hbWUgPSBzYXZlc3RyaW5nIChwLCBsZW4pOwotCi0gIC8qIFdlIHBhc3MgREVCVUdfS0lORF9JTExFR0FMIGJlY2F1c2Ugd2Ugd2FudCBhbGwgdGFncyBpbiB0aGUgc2FtZQotICAgICBuYW1lc3BhY2UuICBUaGlzIGlzIHJpZ2h0IGZvciBDLCBhbmQgSSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUKLSAgICAgb3RoZXIgbGFuZ3VhZ2VzLiAgRklYTUUuICAqLwotICBkdHlwZSA9IGRlYnVnX2ZpbmRfdGFnZ2VkX3R5cGUgKGRoYW5kbGUsIG5hbWUsIERFQlVHX0tJTkRfSUxMRUdBTCk7Ci0gIGlmIChkdHlwZSAhPSBERUJVR19UWVBFX05VTEwpCi0gICAgewotICAgICAgZnJlZSAobmFtZSk7Ci0gICAgICByZXR1cm4gZHR5cGU7Ci0gICAgfQotCi0gIC8qIFdlIG5lZWQgdG8gYWxsb2NhdGUgYW4gZW50cnkgb24gdGhlIHVuZGVmaW5lZCB0YWcgbGlzdC4gICovCi0gIGZvciAoc3QgPSBpbmZvLT50YWdzOyBzdCAhPSBOVUxMOyBzdCA9IHN0LT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdC0+bmFtZVswXSA9PSBuYW1lWzBdCi0JICAmJiBzdHJjbXAgKHN0LT5uYW1lLCBuYW1lKSA9PSAwKQotCXsKLQkgIGlmIChzdC0+a2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwpCi0JICAgIHN0LT5raW5kID0ga2luZDsKLQkgIGZyZWUgKG5hbWUpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKHN0ID09IE5VTEwpCi0gICAgewotICAgICAgc3QgPSAoc3RydWN0IHN0YWJfdGFnICopIHhtYWxsb2MgKHNpemVvZiAqc3QpOwotICAgICAgbWVtc2V0IChzdCwgMCwgc2l6ZW9mICpzdCk7Ci0KLSAgICAgIHN0LT5uZXh0ID0gaW5mby0+dGFnczsKLSAgICAgIHN0LT5uYW1lID0gbmFtZTsKLSAgICAgIHN0LT5raW5kID0ga2luZDsKLSAgICAgIHN0LT5zbG90ID0gREVCVUdfVFlQRV9OVUxMOwotICAgICAgc3QtPnR5cGUgPSBkZWJ1Z19tYWtlX2luZGlyZWN0X3R5cGUgKGRoYW5kbGUsICZzdC0+c2xvdCwgbmFtZSk7Ci0gICAgICBpbmZvLT50YWdzID0gc3Q7Ci0gICAgfQotCi0gIHJldHVybiBzdC0+dHlwZTsKLX0KLQwKLS8qIEluIG9yZGVyIHRvIGdldCB0aGUgY29ycmVjdCBhcmd1bWVudCB0eXBlcyBmb3IgYSBzdHViYmVkIG1ldGhvZCwgd2UKLSAgIG5lZWQgdG8gZXh0cmFjdCB0aGUgYXJndW1lbnQgdHlwZXMgZnJvbSBhIEMrKyBtYW5nbGVkIHN0cmluZy4KLSAgIFNpbmNlIHRoZSBhcmd1bWVudCB0eXBlcyBjYW4gcmVmZXIgYmFjayB0byB0aGUgcmV0dXJuIHR5cGUsIHRoaXMKLSAgIG1lYW5zIHRoYXQgd2UgbXVzdCBkZW1hbmdsZSB0aGUgZW50aXJlIHBoeXNpY2FsIG5hbWUuICBJbiBnZGIgdGhpcwotICAgaXMgZG9uZSBieSBjYWxsaW5nIGNwbHVzX2RlbWFuZ2xlIGFuZCBydW5uaW5nIHRoZSByZXN1bHRzIGJhY2sKLSAgIHRocm91Z2ggdGhlIEMrKyBleHByZXNzaW9uIHBhcnNlci4gIFNpbmNlIHdlIGhhdmUgbm8gZXhwcmVzc2lvbgotICAgcGFyc2VyLCB3ZSBtdXN0IGR1cGxpY2F0ZSBtdWNoIG9mIHRoZSB3b3JrIG9mIGNwbHVzX2RlbWFuZ2xlIGhlcmUuCi0KLSAgIFdlIGFzc3VtZSB0aGF0IEdOVSBzdHlsZSBkZW1hbmdsaW5nIGlzIHVzZWQsIHNpbmNlIHRoaXMgaXMgb25seQotICAgZG9uZSBmb3IgbWV0aG9kIHN0dWJzLCBhbmQgb25seSBnKysgc2hvdWxkIG91dHB1dCB0aGF0IGZvcm0gb2YKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gaG9sZCBhIHBvaW50ZXIgdG8gdHlwZSBpbmZvcm1hdGlvbiB3aGljaAotICAgZGVtYW5nbGluZyBhIHN0cmluZy4gICovCi0KLXN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcKLXsKLSAgLyogVGhlIHN0YXJ0IG9mIHRoZSB0eXBlLiAgVGhpcyBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkLiAgKi8KLSAgY29uc3QgY2hhciAqdHlwZXN0cmluZzsKLSAgLyogVGhlIGxlbmd0aCBvZiB0aGUgdHlwZS4gICovCi0gIHVuc2lnbmVkIGludCBsZW47Ci19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgaW5mb3JtYXRpb24gd2hpbGUgZGVtYW5nbGluZyBhCi0gICBzdHJpbmcuICAqLwotCi1zdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvCi17Ci0gIC8qIFRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaGFuZGxlLiAgKi8KLSAgUFRSIGRoYW5kbGU7Ci0gIC8qIFRoZSBzdGFiIGluZm9ybWF0aW9uIGhhbmRsZS4gICovCi0gIHN0cnVjdCBzdGFiX2hhbmRsZSAqaW5mbzsKLSAgLyogVGhlIGFycmF5IG9mIGFyZ3VtZW50cyB3ZSBhcmUgYnVpbGRpbmcuICAqLwotICBkZWJ1Z190eXBlICphcmdzOwotICAvKiBXaGV0aGVyIHRoZSBtZXRob2QgdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLiAgKi8KLSAgYm9vbGVhbiB2YXJhcmdzOwotICAvKiBUaGUgYXJyYXkgb2YgdHlwZXMgd2UgaGF2ZSByZW1lbWJlcmVkLiAgKi8KLSAgc3RydWN0IHN0YWJfZGVtYW5nbGVfdHlwZXN0cmluZyAqdHlwZXN0cmluZ3M7Ci0gIC8qIFRoZSBudW1iZXIgb2YgdHlwZXN0cmluZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgdHlwZXN0cmluZ19jb3VudDsKLSAgLyogVGhlIG51bWJlciBvZiB0eXBlc3RyaW5nIHNsb3RzIHdlIGhhdmUgYWxsb2NhdGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHR5cGVzdHJpbmdfYWxsb2M7Ci19OwotCi1zdGF0aWMgdm9pZCBzdGFiX2JhZF9kZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhYl9kZW1hbmdsZV9jb3VudCBQQVJBTVMgKChjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2dldF9jb3VudAotICBQQVJBTVMgKChjb25zdCBjaGFyICoqLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9wcmVmaXgKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfc2lnbmF0dXJlCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9xdWFsaWZpZWQKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBjaGFyICoqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2RlbWFuZ2xlX2NsYXNzCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9hcmdzCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKiwKLQkgICBib29sZWFuICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfYXJnCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKiwgY29uc3QgY2hhciAqKiwgZGVidWdfdHlwZSAqKiwKLQkgICB1bnNpZ25lZCBpbnQgKiwgdW5zaWduZWQgaW50ICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiosIGRlYnVnX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9kZW1hbmdsZV9mdW5kX3R5cGUKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqLCBjb25zdCBjaGFyICoqLCBkZWJ1Z190eXBlICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLS8qIFdhcm4gYWJvdXQgYSBiYWQgZGVtYW5nbGluZy4gICovCi0KLXN0YXRpYyB2b2lkCi1zdGFiX2JhZF9kZW1hbmdsZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJiYWQgbWFuZ2xlZCBuYW1lIGAlcydcbiIpLCBzKTsKLX0KLQotLyogR2V0IGEgY291bnQgZnJvbSBhIHN0YWIgc3RyaW5nLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotc3RhYl9kZW1hbmdsZV9jb3VudCAocHApCi0gICAgIGNvbnN0IGNoYXIgKipwcDsKLXsKLSAgdW5zaWduZWQgaW50IGNvdW50OwotCi0gIGNvdW50ID0gMDsKLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLSAgICB7Ci0gICAgICBjb3VudCAqPSAxMDsKLSAgICAgIGNvdW50ICs9ICoqcHAgLSAnMCc7Ci0gICAgICArKypwcDsKLSAgICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLQotLyogUmVxdWlyZSBhIGNvdW50IGluIGEgc3RyaW5nLiAgVGhlIGNvdW50IG1heSBiZSBtdWx0aXBsZSBkaWdpdHMsIGluCi0gICB3aGljaCBjYXNlIGl0IG11c3QgZW5kIGluIGFuIHVuZGVyc2NvcmUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCBwaSkKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICB1bnNpZ25lZCBpbnQgKnBpOwotewotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKipwcCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpwaSA9ICoqcHAgLSAnMCc7Ci0gICsrKnBwOwotICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBjb3VudDsKLSAgICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICAgIGNvdW50ID0gKnBpOwotICAgICAgcCA9ICpwcDsKLSAgICAgIGRvCi0JewotCSAgY291bnQgKj0gMTA7Ci0JICBjb3VudCArPSAqcCAtICcwJzsKLQkgICsrcDsKLQl9Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSk7Ci0gICAgICBpZiAoKnAgPT0gJ18nKQotCXsKLQkgICpwcCA9IHAgKyAxOwotCSAgKnBpID0gY291bnQ7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBkZW1hbmdsZXMgYSBwaHlzaWNhbCBuYW1lLCByZXR1cm5pbmcgYSBOVUxMCi0gICB0ZXJtaW5hdGVkIGFycmF5IG9mIGFyZ3VtZW50IHR5cGVzLiAgKi8KLQotc3RhdGljIGRlYnVnX3R5cGUgKgotc3RhYl9kZW1hbmdsZV9hcmd0eXBlcyAoZGhhbmRsZSwgaW5mbywgcGh5c25hbWUsIHB2YXJhcmdzKQotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgc3RydWN0IHN0YWJfaGFuZGxlICppbmZvOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgYm9vbGVhbiAqcHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gbWluZm87Ci0KLSAgbWluZm8uZGhhbmRsZSA9IGRoYW5kbGU7Ci0gIG1pbmZvLmluZm8gPSBpbmZvOwotICBtaW5mby5hcmdzID0gTlVMTDsKLSAgbWluZm8udmFyYXJncyA9IGZhbHNlOwotICBtaW5mby50eXBlc3RyaW5nX2FsbG9jID0gMTA7Ci0gIG1pbmZvLnR5cGVzdHJpbmdzID0gKChzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV90eXBlc3RyaW5nICopCi0JCSAgICAgICB4bWFsbG9jIChtaW5mby50eXBlc3RyaW5nX2FsbG9jCi0JCQkJKiBzaXplb2YgKm1pbmZvLnR5cGVzdHJpbmdzKSk7Ci0gIG1pbmZvLnR5cGVzdHJpbmdfY291bnQgPSAwOwotCi0gIC8qIGNwbHVzX2RlbWFuZ2xlIGNoZWNrcyBmb3Igc3BlY2lhbCBHTlUgbWFuZ2xlZCBmb3JtcywgYnV0IHdlIGNhbid0Ci0gICAgIHNlZSBhbnkgb2YgdGhlbSBpbiBtYW5nbGVkIG1ldGhvZCBhcmd1bWVudCB0eXBlcy4gICovCi0KLSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9wcmVmaXggKCZtaW5mbywgJnBoeXNuYW1lKSkKLSAgICBnb3RvIGVycm9yX3JldHVybjsKLQotICBpZiAoKnBoeXNuYW1lICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9zaWduYXR1cmUgKCZtaW5mbywgJnBoeXNuYW1lKSkKLQlnb3RvIGVycm9yX3JldHVybjsKLSAgICB9Ci0KLSAgZnJlZSAobWluZm8udHlwZXN0cmluZ3MpOwotICBtaW5mby50eXBlc3RyaW5ncyA9IE5VTEw7Ci0KLSAgaWYgKG1pbmZvLmFyZ3MgPT0gTlVMTCkKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIm5vIGFyZ3VtZW50IHR5cGVzIGluIG1hbmdsZWQgc3RyaW5nXG4iKSk7Ci0KLSAgKnB2YXJhcmdzID0gbWluZm8udmFyYXJnczsKLSAgcmV0dXJuIG1pbmZvLmFyZ3M7Ci0KLSBlcnJvcl9yZXR1cm46Ci0gIGlmIChtaW5mby50eXBlc3RyaW5ncyAhPSBOVUxMKQotICAgIGZyZWUgKG1pbmZvLnR5cGVzdHJpbmdzKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSBwcmVmaXggb2YgdGhlIG1hbmdsZWQgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3ByZWZpeCAobWluZm8sIHBwKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpzY2FuOwotICB1bnNpZ25lZCBpbnQgaTsKLQotICAvKiBjcGx1c19kZW1hbmdsZSBjaGVja3MgZm9yIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLAotICAgICBidXQgd2UgY2FuJ3Qgc2VlIHRoZW0gaW4gbWFuZ2xlZCBhcmd1bWVudCB0eXBlcy4gICovCi0KLSAgLyogTG9vayBmb3IgYF9fJy4gICovCi0gIHNjYW4gPSAqcHA7Ci0gIGRvCi0gICAgewotICAgICAgc2NhbiA9IHN0cmNociAoc2NhbiwgJ18nKTsKLSAgICB9Ci0gIHdoaWxlIChzY2FuICE9IE5VTEwgJiYgKisrc2NhbiAhPSAnXycpOwotCi0gIGlmIChzY2FuID09IE5VTEwpCi0gICAgewotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKCpwcCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC0tc2NhbjsKLQotICAvKiBXZSBmb3VuZCBgX18nOyBtb3ZlIGFoZWFkIHRvIHRoZSBsYXN0IGNvbnRpZ3VvdXMgYF9fJyBwYWlyLiAgKi8KLSAgaSA9IHN0cnNwbiAoc2NhbiwgIl8iKTsKLSAgaWYgKGkgPiAyKQotICAgIHNjYW4gKz0gaSAtIDI7Ci0KLSAgaWYgKHNjYW4gPT0gKnBwCi0gICAgICAmJiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNjYW5bMl0pCi0JICB8fCBzY2FuWzJdID09ICdRJwotCSAgfHwgc2NhblsyXSA9PSAndCcpKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYSBHTlUgc3R5bGUgY29uc3RydWN0b3IgbmFtZS4gICovCi0gICAgICAqcHAgPSBzY2FuICsgMjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZSBpZiAoc2NhbiA9PSAqcHAKLQkgICAmJiAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzY2FuWzJdKQotCSAgICYmIHNjYW5bMl0gIT0gJ3QnKQotICAgIHsKLSAgICAgIC8qIExvb2sgZm9yIHRoZSBgX18nIHRoYXQgc2VwYXJhdGVzIHRoZSBwcmVmaXggZnJvbSB0aGUKLSAgICAgICAgIHNpZ25hdHVyZS4gICovCi0gICAgICB3aGlsZSAoKnNjYW4gPT0gJ18nKQotCSsrc2NhbjsKLSAgICAgIHNjYW4gPSBzdHJzdHIgKHNjYW4sICJfXyIpOwotICAgICAgaWYgKHNjYW4gPT0gTlVMTCB8fCBzY2FuWzJdID09ICdcMCcpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKCpwcCk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICByZXR1cm4gc3RhYl9kZW1hbmdsZV9mdW5jdGlvbl9uYW1lIChtaW5mbywgcHAsIHNjYW4pOwotICAgIH0KLSAgZWxzZSBpZiAoc2NhblsyXSAhPSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFRoZSBuYW1lIGRvZXNuJ3Qgc3RhcnQgd2l0aCBgX18nLCBidXQgaXQgZG9lcyBjb250YWluIGBfXycuICAqLwotICAgICAgcmV0dXJuIHN0YWJfZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAobWluZm8sIHBwLCBzY2FuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAoKnBwKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIERlbWFuZ2xlIGEgZnVuY3Rpb24gbmFtZSBwcmVmaXguICBUaGUgc2NhbiBhcmd1bWVudCBwb2ludHMgdG8gdGhlCi0gICBkb3VibGUgdW5kZXJzY29yZSB3aGljaCBzZXBhcmF0ZXMgdGhlIGZ1bmN0aW9uIG5hbWUgZnJvbSB0aGUKLSAgIHNpZ25hdHVyZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2Z1bmN0aW9uX25hbWUgKG1pbmZvLCBwcCwgc2NhbikKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgY2hhciAqc2NhbjsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgc3RyaW5nIGZyb20gKnBwIHRvIHNjYW4gaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgV2UKLSAgICAgZG9uJ3QgY2FyZSBhYm91dCB0aGUgbmFtZSwgc2luY2Ugd2UganVzdCBsb29raW5nIGZvciBhcmd1bWVudAotICAgICB0eXBlcy4gIEhvd2V2ZXIsIGZvciBjb252ZXJzaW9uIG9wZXJhdG9ycywgdGhlIG5hbWUgbWF5IGluY2x1ZGUgYQotICAgICB0eXBlIHdoaWNoIHdlIG11c3QgcmVtZW1iZXIgaW4gb3JkZXIgdG8gaGFuZGxlIGJhY2tyZWZlcmVuY2VzLiAgKi8KLQotICBuYW1lID0gKnBwOwotICAqcHAgPSBzY2FuICsgMjsKLQotICBpZiAoKnBwIC0gbmFtZSA+PSA1Ci0JICAgJiYgc3RybmNtcCAobmFtZSwgInR5cGUiLCA0KSA9PSAwCi0JICAgJiYgKG5hbWVbNF0gPT0gJyQnIHx8IG5hbWVbNF0gPT0gJy4nKSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gbmFtZSArIDU7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCAmdGVtLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlIGlmIChuYW1lWzBdID09ICdfJwotCSAgICYmIG5hbWVbMV0gPT0gJ18nCi0JICAgJiYgbmFtZVsyXSA9PSAnbycKLQkgICAmJiBuYW1lWzNdID09ICdwJykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gbmFtZSArIDQ7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCAmdGVtLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSB0aGUgc2lnbmF0dXJlLiAgVGhpcyBpcyB3aGVyZSB0aGUgYXJndW1lbnQgdHlwZXMgYXJlCi0gICBmb3VuZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3NpZ25hdHVyZSAobWluZm8sIHBwKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotewotICBjb25zdCBjaGFyICpvcmlnOwotICBib29sZWFuIGV4cGVjdF9mdW5jLCBmdW5jX2RvbmU7Ci0gIGNvbnN0IGNoYXIgKmhvbGQ7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBleHBlY3RfZnVuYyA9IGZhbHNlOwotICBmdW5jX2RvbmUgPSBmYWxzZTsKLSAgaG9sZCA9IE5VTEw7Ci0KLSAgd2hpbGUgKCoqcHAgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqcHApCi0JewotCWNhc2UgJ1EnOgotCSAgaG9sZCA9ICpwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkIChtaW5mbywgcHAsIChkZWJ1Z190eXBlICopIE5VTEwpCi0JICAgICAgfHwgISBzdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBob2xkLCAqcHAgLSBob2xkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZXhwZWN0X2Z1bmMgPSB0cnVlOwotCSAgaG9sZCA9IE5VTEw7Ci0JICBicmVhazsKLQotCWNhc2UgJ1MnOgotCSAgLyogU3RhdGljIG1lbWJlciBmdW5jdGlvbi4gIEZJWE1FOiBDYW4gdGhpcyBoYXBwZW4/ICAqLwotCSAgaWYgKGhvbGQgPT0gTlVMTCkKLQkgICAgaG9sZCA9ICpwcDsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdDJzoKLQkgIC8qIENvbnN0IG1lbWJlciBmdW5jdGlvbi4gICovCi0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgKysqcHA7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JICBpZiAoaG9sZCA9PSBOVUxMKQotCSAgICBob2xkID0gKnBwOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9jbGFzcyAobWluZm8sIHBwLCAoY29uc3QgY2hhciAqKikgTlVMTCkKLQkgICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIGhvbGQsICpwcCAtIGhvbGQpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBleHBlY3RfZnVuYyA9IHRydWU7Ci0JICBob2xkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnRic6Ci0JICAvKiBGdW5jdGlvbi4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGFjdHVhbGx5IGhhcHBlbnMgd2l0aCBnKysKLSAgICAgICAgICAgICBvdXRwdXQuICAqLwotCSAgaG9sZCA9IE5VTEw7Ci0JICBmdW5jX2RvbmUgPSB0cnVlOwotCSAgKysqcHA7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgJ3QnOgotCSAgLyogVGVtcGxhdGUuICAqLwotCSAgaWYgKGhvbGQgPT0gTlVMTCkKLQkgICAgaG9sZCA9ICpwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUgKG1pbmZvLCBwcCwgKGNoYXIgKiopIE5VTEwpCi0JICAgICAgfHwgISBzdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBob2xkLCAqcHAgLSBob2xkKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgaG9sZCA9IE5VTEw7Ci0JICBleHBlY3RfZnVuYyA9IHRydWU7Ci0JICBicmVhazsKLQotCWNhc2UgJ18nOgotCSAgLyogQXQgdGhlIG91dGVybW9zdCBsZXZlbCwgd2UgY2Fubm90IGhhdmUgYSByZXR1cm4gdHlwZQotCSAgICAgc3BlY2lmaWVkLCBzbyBpZiB3ZSBydW4gaW50byBhbm90aGVyICdfJyBhdCB0aGlzIHBvaW50IHdlCi0JICAgICBhcmUgZGVhbGluZyB3aXRoIGEgbWFuZ2xlZCBuYW1lIHRoYXQgaXMgZWl0aGVyIGJvZ3VzLCBvcgotCSAgICAgaGFzIGJlZW4gbWFuZ2xlZCBieSBzb21lIGFsZ29yaXRobSB3ZSBkb24ndCBrbm93IGhvdyB0bwotCSAgICAgZGVhbCB3aXRoLiAgU28ganVzdCByZWplY3QgdGhlIGVudGlyZSBkZW1hbmdsaW5nLiAgKi8KLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQotCWRlZmF1bHQ6Ci0JICAvKiBBc3N1bWUgd2UgaGF2ZSBzdHVtYmxlZCBvbnRvIHRoZSBmaXJzdCBvdXRlcm1vc3QgZnVuY3Rpb24KLQkgICAgIGFyZ3VtZW50IHRva2VuLCBhbmQgc3RhcnQgcHJvY2Vzc2luZyBhcmdzLiAgKi8KLQkgIGZ1bmNfZG9uZSA9IHRydWU7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwgJm1pbmZvLT5hcmdzLCAmbWluZm8tPnZhcmFyZ3MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChleHBlY3RfZnVuYykKLQl7Ci0JICBmdW5jX2RvbmUgPSB0cnVlOwotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9hcmdzIChtaW5mbywgcHAsICZtaW5mby0+YXJncywgJm1pbmZvLT52YXJhcmdzKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgZnVuY19kb25lKQotICAgIHsKLSAgICAgIC8qIFdpdGggR05VIHN0eWxlIGRlbWFuZ2xpbmcsIGJhcl9fM2ZvbyBpcyAnZm9vOjpiYXIodm9pZCknLCBhbmQKLQkgYmFyX18zZm9vaSBpcyAnZm9vOjpiYXIoaW50KScuICBXZSBnZXQgaGVyZSB3aGVuIHdlIGZpbmQgdGhlCi0JIGZpcnN0IGNhc2UsIGFuZCBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSAnKHZvaWQpJyBnZXRzIGFkZGVkCi0JIHRvIHRoZSBjdXJyZW50IGRlY2xwLiAgKi8KLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCAmbWluZm8tPmFyZ3MsICZtaW5mby0+dmFyYXJncykpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVtYW5nbGUgYSBxdWFsaWZpZWQgbmFtZSwgc3VjaCBhcyAiUTI1T3V0ZXI1SW5uZXIiIHdoaWNoIGlzIHRoZQotICAgbWFuZ2xlZCBmb3JtIG9mICJPdXRlcjo6SW5uZXIiLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfcXVhbGlmaWVkIChtaW5mbywgcHAsIHB0eXBlKQotICAgICBzdHJ1Y3Qgc3RhYl9kZW1hbmdsZV9pbmZvICptaW5mbzsKLSAgICAgY29uc3QgY2hhciAqKnBwOwotICAgICBkZWJ1Z190eXBlICpwdHlwZTsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgY29uc3QgY2hhciAqcDsKLSAgdW5zaWduZWQgaW50IHF1YWxpZmllcnM7Ci0gIGRlYnVnX3R5cGUgY29udGV4dDsKLQotICBvcmlnID0gKnBwOwotCi0gIHN3aXRjaCAoKCpwcClbMV0pCi0gICAgewotICAgIGNhc2UgJ18nOgotICAgICAgLyogR05VIG1hbmdsZWQgbmFtZSB3aXRoIG1vcmUgdGhhbiA5IGNsYXNzZXMuICBUaGUgY291bnQgaXMKLQkgcHJlY2VkZWQgYnkgYW4gdW5kZXJzY29yZSAodG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSB0aGUgPD0gOQotCSBjYXNlKSBhbmQgZm9sbG93ZWQgYnkgYW4gdW5kZXJzY29yZS4gICovCi0gICAgICBwID0gKnBwICsgMjsKLSAgICAgIGlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcCkgfHwgKnAgPT0gJzAnKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICBxdWFsaWZpZXJzID0gYXRvaSAocCk7Ci0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpwKSkKLQkrK3A7Ci0gICAgICBpZiAoKnAgIT0gJ18nKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAqcHAgPSBwICsgMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6IGNhc2UgJzknOgotICAgICAgcXVhbGlmaWVycyA9ICgqcHApWzFdIC0gJzAnOwotICAgICAgLyogU2tpcCBhbiBvcHRpb25hbCB1bmRlcnNjb3JlIGFmdGVyIHRoZSBjb3VudC4gICovCi0gICAgICBpZiAoKCpwcClbMl0gPT0gJ18nKQotCSsrKnBwOwotICAgICAgKnBwICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgIGRlZmF1bHQ6Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgLyogUGljayBvZmYgdGhlIG5hbWVzLiAgKi8KLSAgd2hpbGUgKHF1YWxpZmllcnMtLSA+IDApCi0gICAgewotICAgICAgaWYgKCoqcHAgPT0gJ18nKQotCSsrKnBwOwotICAgICAgaWYgKCoqcHAgPT0gJ3QnKQotCXsKLQkgIGNoYXIgKm5hbWU7Ci0KLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdGVtcGxhdGUgKG1pbmZvLCBwcCwKLQkJCQkJcHR5cGUgIT0gTlVMTCA/ICZuYW1lIDogTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgaWYgKHB0eXBlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb250ZXh0ID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbWluZm8tPmluZm8sCi0JCQkJCSAgICAgICBuYW1lLCBzdHJsZW4gKG5hbWUpLAotCQkJCQkgICAgICAgREVCVUdfS0lORF9DTEFTUyk7Ci0JICAgICAgZnJlZSAobmFtZSk7Ci0JICAgICAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotCQlyZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGxlbjsKLQotCSAgbGVuID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotCSAgaWYgKHN0cmxlbiAoKnBwKSA8IGxlbikKLQkgICAgewotCSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgICByZXR1cm4gZmFsc2U7Ci0JICAgIH0KLQotCSAgaWYgKHB0eXBlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb25zdCBkZWJ1Z19maWVsZCAqZmllbGRzOwotCi0JICAgICAgZmllbGRzID0gTlVMTDsKLQkgICAgICBpZiAoY29udGV4dCAhPSBERUJVR19UWVBFX05VTEwpCi0JCWZpZWxkcyA9IGRlYnVnX2dldF9maWVsZHMgKG1pbmZvLT5kaGFuZGxlLCBjb250ZXh0KTsKLQotCSAgICAgIGNvbnRleHQgPSBERUJVR19UWVBFX05VTEw7Ci0KLQkgICAgICBpZiAoZmllbGRzICE9IE5VTEwpCi0JCXsKLQkJICBjaGFyICpuYW1lOwotCi0JCSAgLyogVHJ5IHRvIGZpbmQgdGhlIHR5cGUgYnkgbG9va2luZyB0aHJvdWdoIHRoZQotICAgICAgICAgICAgICAgICAgICAgZmllbGRzIG9mIGNvbnRleHQgdW50aWwgd2UgZmluZCBhIGZpZWxkIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgICAgICBzYW1lIHR5cGUuICBUaGlzIG91Z2h0IHRvIHdvcmsgZm9yIGEgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgd2l0aGluIGEgY2xhc3MsIGJ1dCBpdCB3b24ndCB3b3JrIGZvciwKLSAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGFuIGVudW0gZGVmaW5lZCB3aXRoaW4gYSBjbGFzcy4gIHN0YWJzIGRvZXMKLSAgICAgICAgICAgICAgICAgICAgIG5vdCBnaXZlIHVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBmaWd1cmUgb3V0IHRoZQotICAgICAgICAgICAgICAgICAgICAgbGF0dGVyIGNhc2UuICAqLwotCi0JCSAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgbGVuKTsKLQotCQkgIGZvciAoOyAqZmllbGRzICE9IERFQlVHX0ZJRUxEX05VTEw7IGZpZWxkcysrKQotCQkgICAgewotCQkgICAgICBkZWJ1Z190eXBlIGZ0OwotCQkgICAgICBjb25zdCBjaGFyICpkbjsKLQotCQkgICAgICBmdCA9IGRlYnVnX2dldF9maWVsZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKmZpZWxkcyk7Ci0JCSAgICAgIGlmIChmdCA9PSBOVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgICBkbiA9IGRlYnVnX2dldF90eXBlX25hbWUgKG1pbmZvLT5kaGFuZGxlLCBmdCk7Ci0JCSAgICAgIGlmIChkbiAhPSBOVUxMICYmIHN0cmNtcCAoZG4sIG5hbWUpID09IDApCi0JCQl7Ci0JCQkgIGNvbnRleHQgPSBmdDsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBmcmVlIChuYW1lKTsKLQkJfQotCi0JICAgICAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotCQl7Ci0JCSAgLyogV2UgaGF2ZSB0byBmYWxsIGJhY2sgb24gZmluZGluZyB0aGUgdHlwZSBieSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgSWYgdGhlcmUgYXJlIG1vcmUgdHlwZXMgdG8gY29tZSwgdGhlbiB0aGlzIG11c3QKLSAgICAgICAgICAgICAgICAgICAgIGJlIGEgY2xhc3MuICBPdGhlcndpc2UsIGl0IGNvdWxkIGJlIGFueXRoaW5nLiAgKi8KLQotCQkgIGlmIChxdWFsaWZpZXJzID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNoYXIgKm5hbWU7Ci0KLQkJICAgICAgbmFtZSA9IHNhdmVzdHJpbmcgKCpwcCwgbGVuKTsKLQkJICAgICAgY29udGV4dCA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsCi0JCQkJCQkgICAgICAgbmFtZSk7Ci0JCSAgICAgIGZyZWUgKG5hbWUpOwotCQkgICAgfQotCi0JCSAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgICAgewotCQkgICAgICBjb250ZXh0ID0gc3RhYl9maW5kX3RhZ2dlZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJCSAgICAgICBtaW5mby0+aW5mbywKLQkJCQkJCSAgICAgICAqcHAsIGxlbiwKLQkJCQkJCSAgICAgICAocXVhbGlmaWVycyA9PSAwCi0JCQkJCQkJPyBERUJVR19LSU5EX0lMTEVHQUwKLQkJCQkJCQk6IERFQlVHX0tJTkRfQ0xBU1MpKTsKLQkJICAgICAgaWYgKGNvbnRleHQgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkJcmV0dXJuIGZhbHNlOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgKnBwICs9IGxlbjsKLQl9Ci0gICAgfQotCi0gIGlmIChwdHlwZSAhPSBOVUxMKQotICAgICpwdHlwZSA9IGNvbnRleHQ7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgdGVtcGxhdGUuICBJZiBQTkFNRSBpcyBub3QgTlVMTCwgdGhpcyBzZXRzICpQTkFNRSB0byBhCi0gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfdGVtcGxhdGUgKG1pbmZvLCBwcCwgcG5hbWUpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGNoYXIgKipwbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgdW5zaWduZWQgaW50IHIsIGk7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICArKypwcDsKLQotICAvKiBTa2lwIHRoZSB0ZW1wbGF0ZSBuYW1lLiAgKi8KLSAgciA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLSAgaWYgKHIgPT0gMCB8fCBzdHJsZW4gKCpwcCkgPCByKQotICAgIHsKLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICpwcCArPSByOwotCi0gIC8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIGxpc3QuICAqLwotICBpZiAoc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmcikgPT0gMCkKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0gICAgewotICAgICAgaWYgKCoqcHAgPT0gJ1onKQotCXsKLQkgIC8qIFRoaXMgaXMgYSB0eXBlIHBhcmFtZXRlci4gICovCi0JICArKypwcDsKLQkgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCAoZGVidWdfdHlwZSAqKSBOVUxMKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpvbGRfcDsKLQkgIGJvb2xlYW4gcG9pbnRlcnAsIHJlYWxwLCBpbnRlZ3JhbHAsIGNoYXJwLCBib29scDsKLQkgIGJvb2xlYW4gZG9uZTsKLQotCSAgb2xkX3AgPSAqcHA7Ci0JICBwb2ludGVycCA9IGZhbHNlOwotCSAgcmVhbHAgPSBmYWxzZTsKLQkgIGludGVncmFscCA9IGZhbHNlOwotCSAgY2hhcnAgPSBmYWxzZTsKLQkgIGJvb2xwID0gZmFsc2U7Ci0JICBkb25lID0gZmFsc2U7Ci0KLQkgIC8qIFRoaXMgaXMgYSB2YWx1ZSBwYXJhbWV0ZXIuICAqLwotCi0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgKGRlYnVnX3R5cGUgKikgTlVMTCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgd2hpbGUgKCpvbGRfcCAhPSAnXDAnICYmICEgZG9uZSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKm9sZF9wKQotCQl7Ci0JCWNhc2UgJ1AnOgotCQljYXNlICdwJzoKLQkJY2FzZSAnUic6Ci0JCSAgcG9pbnRlcnAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQljYXNlICdDJzoJLyogQ29uc3QuICAqLwotCQljYXNlICdTJzoJLyogU2lnbmVkLiAgKi8KLQkJY2FzZSAnVSc6CS8qIFVuc2lnbmVkLiAgKi8KLQkJY2FzZSAnVic6CS8qIFZvbGF0aWxlLiAgKi8KLQkJY2FzZSAnRic6CS8qIEZ1bmN0aW9uLiAgKi8KLQkJY2FzZSAnTSc6CS8qIE1lbWJlciBmdW5jdGlvbi4gICovCi0JCWNhc2UgJ08nOgkvKiA/Pz8gKi8KLQkJICArK29sZF9wOwotCQkgIGJyZWFrOwotCQljYXNlICdRJzoJLyogUXVhbGlmaWVkIG5hbWUuICAqLwotCQkgIGludGVncmFscCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1QnOgkvKiBSZW1lbWJlcmVkIHR5cGUuICAqLwotCQkgIGFib3J0ICgpOwotCQljYXNlICd2JzoJLyogVm9pZC4gICovCi0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgJ3gnOgkvKiBMb25nIGxvbmcuICAqLwotCQljYXNlICdsJzoJLyogTG9uZy4gICovCi0JCWNhc2UgJ2knOgkvKiBJbnQuICAqLwotCQljYXNlICdzJzoJLyogU2hvcnQuICAqLwotCQljYXNlICd3JzoJLyogV2NoYXJfdC4gICovCi0JCSAgaW50ZWdyYWxwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAnYic6CS8qIEJvb2wuICAqLwotCQkgIGJvb2xwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAnYyc6CS8qIENoYXIuICAqLwotCQkgIGNoYXJwID0gdHJ1ZTsKLQkJICBkb25lID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJY2FzZSAncic6CS8qIExvbmcgZG91YmxlLiAgKi8KLQkJY2FzZSAnZCc6CS8qIERvdWJsZS4gICovCi0JCWNhc2UgJ2YnOgkvKiBGbG9hdC4gICovCi0JCSAgcmVhbHAgPSB0cnVlOwotCQkgIGRvbmUgPSB0cnVlOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIC8qIEFzc3VtZSBpdCdzIGEgdXNlciBkZWZpbmVkIGludGVncmFsIHR5cGUuICAqLwotCQkgIGludGVncmFscCA9IHRydWU7Ci0JCSAgZG9uZSA9IHRydWU7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoaW50ZWdyYWxwKQotCSAgICB7Ci0JICAgICAgaWYgKCoqcHAgPT0gJ20nKQotCQkrKypwcDsKLQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCQkrKypwcDsKLQkgICAgfQotCSAgZWxzZSBpZiAoY2hhcnApCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgdmFsOwotCi0JICAgICAgaWYgKCoqcHAgPT0gJ20nKQotCQkrKypwcDsKLQkgICAgICB2YWwgPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0JICAgICAgaWYgKHZhbCA9PSAwKQotCQl7Ci0JCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChib29scCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGludCB2YWw7Ci0KLQkgICAgICB2YWwgPSBzdGFiX2RlbWFuZ2xlX2NvdW50IChwcCk7Ci0JICAgICAgaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQotCQl7Ci0JCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQkgIHJldHVybiBmYWxzZTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyZWFscCkKLQkgICAgewotCSAgICAgIGlmICgqKnBwID09ICdtJykKLQkJKysqcHA7Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkJKysqcHA7Ci0JICAgICAgaWYgKCoqcHAgPT0gJy4nKQotCQl7Ci0JCSAgKysqcHA7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkJICAgICsrKnBwOwotCQl9Ci0JICAgICAgaWYgKCoqcHAgPT0gJ2UnKQotCQl7Ci0JCSAgKysqcHA7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkJICAgICsrKnBwOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHBvaW50ZXJwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGxlbjsKLQotCSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJmxlbikpCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgICAgKnBwICs9IGxlbjsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV2UgY2FuIHRyYW5zbGF0ZSB0aGlzIHRvIGEgc3RyaW5nIGZhaXJseSBlYXNpbHkgYnkgaW52b2tpbmcgdGhlCi0gICAgIHJlZ3VsYXIgZGVtYW5nbGluZyByb3V0aW5lLiAgKi8KLSAgaWYgKHBuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqczEsICpzMiwgKnMzLCAqczQ7Ci0gICAgICBjaGFyICpmcm9tLCAqdG87Ci0KLSAgICAgIHMxID0gc2F2ZXN0cmluZyAob3JpZywgKnBwIC0gb3JpZyk7Ci0KLSAgICAgIHMyID0gY29uY2F0ICgiTm9TdWNoU3RyaW5HX18iLCBzMSwgKGNvbnN0IGNoYXIgKikgTlVMTCk7Ci0KLSAgICAgIGZyZWUgKHMxKTsKLQotICAgICAgczMgPSBjcGx1c19kZW1hbmdsZSAoczIsIERNR0xfQU5TSSk7Ci0KLSAgICAgIGZyZWUgKHMyKTsKLQotICAgICAgaWYgKHMzICE9IE5VTEwpCi0JczQgPSBzdHJzdHIgKHMzLCAiOjpOb1N1Y2hTdHJpbkciKTsKLSAgICAgIGlmIChzMyA9PSBOVUxMIHx8IHM0ID09IE5VTEwpCi0JewotCSAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgaWYgKHMzICE9IE5VTEwpCi0JICAgIGZyZWUgKHMzKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0KLSAgICAgIC8qIEVsaW1pbmF0aW5nIGFsbCBzcGFjZXMsIGV4Y2VwdCB0aG9zZSBiZXR3ZWVuID4gY2hhcmFjdGVycywKLSAgICAgICAgIG1ha2VzIGl0IG1vcmUgbGlrZWx5IHRoYXQgdGhlIGRlbWFuZ2xlZCBuYW1lIHdpbGwgbWF0Y2ggdGhlCi0gICAgICAgICBuYW1lIHdoaWNoIGcrKyB1c2VkIGFzIHRoZSBzdHJ1Y3R1cmUgbmFtZS4gICovCi0gICAgICBmb3IgKGZyb20gPSB0byA9IHMzOyBmcm9tICE9IHM0OyArK2Zyb20pCi0JaWYgKCpmcm9tICE9ICcgJwotCSAgICB8fCAoZnJvbVsxXSA9PSAnPicgJiYgZnJvbSA+IHMzICYmIGZyb21bLTFdID09ICc+JykpCi0JICAqdG8rKyA9ICpmcm9tOwotCi0gICAgICAqcG5hbWUgPSBzYXZlc3RyaW5nIChzMywgdG8gLSBzMyk7Ci0KLSAgICAgIGZyZWUgKHMzKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgY2xhc3MgbmFtZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2NsYXNzIChtaW5mbywgcHAsIHBzdGFydCkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgY29uc3QgY2hhciAqKnBzdGFydDsKLXsKLSAgY29uc3QgY2hhciAqb3JpZzsKLSAgdW5zaWduZWQgaW50IG47Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBuID0gc3RhYl9kZW1hbmdsZV9jb3VudCAocHApOwotICBpZiAoc3RybGVuICgqcHApIDwgbikKLSAgICB7Ci0gICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmIChwc3RhcnQgIT0gTlVMTCkKLSAgICAqcHN0YXJ0ID0gKnBwOwotCi0gICpwcCArPSBuOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBmdW5jdGlvbiBhcmd1bWVudHMuICBJZiB0aGUgcGFyZ3MgYXJndW1lbnQgaXMgbm90IE5VTEwsIGl0Ci0gICBpcyBzZXQgdG8gYSBOVUxMIHRlcm1pbmF0ZWQgYXJyYXkgaG9sZGluZyB0aGUgYXJndW1lbnRzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfYXJncyAobWluZm8sIHBwLCBwYXJncywgcHZhcmFyZ3MpCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICoqcHA7Ci0gICAgIGRlYnVnX3R5cGUgKipwYXJnczsKLSAgICAgYm9vbGVhbiAqcHZhcmFyZ3M7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIHVuc2lnbmVkIGludCBhbGxvYywgY291bnQ7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBhbGxvYyA9IDEwOwotICBpZiAocGFyZ3MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAqcGFyZ3MgPSAoZGVidWdfdHlwZSAqKSB4bWFsbG9jIChhbGxvYyAqIHNpemVvZiAqKnBhcmdzKTsKLSAgICAgICpwdmFyYXJncyA9IGZhbHNlOwotICAgIH0KLSAgY291bnQgPSAwOwotCi0gIHdoaWxlICgqKnBwICE9ICdfJyAmJiAqKnBwICE9ICdcMCcgJiYgKipwcCAhPSAnZScpCi0gICAgewotICAgICAgaWYgKCoqcHAgPT0gJ04nIHx8ICoqcHAgPT0gJ1QnKQotCXsKLQkgIGNoYXIgdGVtcHR5cGU7Ci0JICB1bnNpZ25lZCBpbnQgciwgdDsKLQotCSAgdGVtcHR5cGUgPSAqKnBwOwotCSAgKysqcHA7Ci0KLQkgIGlmICh0ZW1wdHlwZSA9PSAnVCcpCi0JICAgIHIgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmcikpCi0JCXsKLQkJICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCSAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKCEgc3RhYl9kZW1hbmdsZV9nZXRfY291bnQgKHBwLCAmdCkpCi0JICAgIHsKLQkgICAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmICh0ID49IG1pbmZvLT50eXBlc3RyaW5nX2NvdW50KQotCSAgICB7Ci0JICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICAgIHJldHVybiBmYWxzZTsKLQkgICAgfQotCSAgd2hpbGUgKHItLSA+IDApCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICp0ZW07Ci0KLQkgICAgICB0ZW0gPSBtaW5mby0+dHlwZXN0cmluZ3NbdF0udHlwZXN0cmluZzsKLQkgICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZyAobWluZm8sICZ0ZW0sIHBhcmdzLCAmY291bnQsICZhbGxvYykpCi0JCXJldHVybiBmYWxzZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZyAobWluZm8sIHBwLCBwYXJncywgJmNvdW50LCAmYWxsb2MpKQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotICAgIH0KLQotICBpZiAocGFyZ3MgIT0gTlVMTCkKLSAgICAoKnBhcmdzKVtjb3VudF0gPSBERUJVR19UWVBFX05VTEw7Ci0KLSAgaWYgKCoqcHAgPT0gJ2UnKQotICAgIHsKLSAgICAgIGlmIChwYXJncyAhPSBOVUxMKQotCSpwdmFyYXJncyA9IHRydWU7Ci0gICAgICArKypwcDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgc2luZ2xlIGFyZ3VtZW50LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfYXJnIChtaW5mbywgcHAsIHBhcmdzLCBwY291bnQsIHBhbGxvYykKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqKnBhcmdzOwotICAgICB1bnNpZ25lZCBpbnQgKnBjb3VudDsKLSAgICAgdW5zaWduZWQgaW50ICpwYWxsb2M7Ci17Ci0gIGNvbnN0IGNoYXIgKnN0YXJ0OwotICBkZWJ1Z190eXBlIHR5cGU7Ci0KLSAgc3RhcnQgPSAqcHA7Ci0gIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLAotCQkJICAgIHBhcmdzID09IE5VTEwgPyAoZGVidWdfdHlwZSAqKSBOVUxMIDogJnR5cGUpCi0gICAgICB8fCAhIHN0YWJfZGVtYW5nbGVfcmVtZW1iZXJfdHlwZSAobWluZm8sIHN0YXJ0LCAqcHAgLSBzdGFydCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwYXJncyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQlyZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICgqcGNvdW50ICsgMSA+PSAqcGFsbG9jKQotCXsKLQkgICpwYWxsb2MgKz0gMTA7Ci0JICAqcGFyZ3MgPSAoKGRlYnVnX3R5cGUgKikKLQkJICAgIHhyZWFsbG9jICgqcGFyZ3MsICpwYWxsb2MgKiBzaXplb2YgKipwYXJncykpOwotCX0KLSAgICAgICgqcGFyZ3MpWypwY291bnRdID0gdHlwZTsKLSAgICAgICsrKnBjb3VudDsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIERlbWFuZ2xlIGEgdHlwZS4gIElmIHRoZSBwdHlwZSBhcmd1bWVudCBpcyBub3QgTlVMTCwgKnB0eXBlIGlzIHNldAotICAgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0KLSAgb3JpZyA9ICpwcDsKLQotICBzd2l0Y2ggKCoqcHApCi0gICAgewotICAgIGNhc2UgJ1AnOgotICAgIGNhc2UgJ3AnOgotICAgICAgLyogQSBwb2ludGVyIHR5cGUuICAqLwotICAgICAgKysqcHA7Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCSpwdHlwZSA9IGRlYnVnX21ha2VfcG9pbnRlcl90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAvKiBBIHJlZmVyZW5jZSB0eXBlLiAgKi8KLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX3JlZmVyZW5jZV90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQSc6Ci0gICAgICAvKiBBbiBhcnJheS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgbG9uZyBoaWdoOwotCi0JKysqcHA7Ci0JaGlnaCA9IDA7Ci0Jd2hpbGUgKCoqcHAgIT0gJ1wwJyAmJiAqKnBwICE9ICdfJykKLQkgIHsKLQkgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCSAgICAgIHsKLQkJc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCQlyZXR1cm4gZmFsc2U7Ci0JICAgICAgfQotCSAgICBoaWdoICo9IDEwOwotCSAgICBoaWdoICs9ICoqcHAgLSAnMCc7Ci0JICAgICsrKnBwOwotCSAgfQotCWlmICgqKnBwICE9ICdfJykKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JKysqcHA7Ci0KLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3R5cGUgKG1pbmZvLCBwcCwgcHR5cGUpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICBkZWJ1Z190eXBlIGludF90eXBlOwotCi0JICAgIGludF90eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImludCIpOwotCSAgICBpZiAoaW50X3R5cGUgPT0gTlVMTCkKLQkgICAgICBpbnRfdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0LCBmYWxzZSk7Ci0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfYXJyYXlfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSwgaW50X3R5cGUsCi0JCQkJCSAgICAwLCBoaWdoLCBmYWxzZSk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogQSBiYWNrIHJlZmVyZW5jZSB0byBhIHJlbWVtYmVyZWQgdHlwZS4gICovCi0gICAgICB7Ci0JdW5zaWduZWQgaW50IGk7Ci0JY29uc3QgY2hhciAqcDsKLQotCSsrKnBwOwotCWlmICghIHN0YWJfZGVtYW5nbGVfZ2V0X2NvdW50IChwcCwgJmkpKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQlpZiAoaSA+PSBtaW5mby0+dHlwZXN0cmluZ19jb3VudCkKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JcCA9IG1pbmZvLT50eXBlc3RyaW5nc1tpXS50eXBlc3RyaW5nOwotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sICZwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0YnOgotICAgICAgLyogQSBmdW5jdGlvbi4gICovCi0gICAgICB7Ci0JZGVidWdfdHlwZSAqYXJnczsKLQlib29sZWFuIHZhcmFyZ3M7Ci0KLQkrKypwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwKLQkJCQkgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgPyAoZGVidWdfdHlwZSAqKikgTlVMTAotCQkJCSAgIDogJmFyZ3MpLAotCQkJCSAgKHB0eXBlID09IE5VTEwKLQkJCQkgICA/IChib29sZWFuICopIE5VTEwKLQkJCQkgICA6ICZ2YXJhcmdzKSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKCoqcHAgIT0gJ18nKQotCSAgewotCSAgICAvKiBjcGx1c19kZW1hbmdsZSB3aWxsIGFjY2VwdCBhIGZ1bmN0aW9uIHdpdGhvdXQgYSByZXR1cm4KLQkgICAgICAgdHlwZSwgYnV0IEkgZG9uJ3Qga25vdyB3aGVuIHRoYXQgd2lsbCBoYXBwZW4sIG9yIHdoYXQKLQkgICAgICAgdG8gZG8gaWYgaXQgZG9lcy4gICovCi0JICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCSsrKnBwOwotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKHB0eXBlICE9IE5VTEwpCi0JICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Z1bmN0aW9uX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUsIGFyZ3MsCi0JCQkJCSAgICAgdmFyYXJncyk7Ci0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgY2FzZSAnTyc6Ci0gICAgICB7Ci0JYm9vbGVhbiBtZW1iZXJwLCBjb25zdHAsIHZvbGF0aWxlcDsKLQlkZWJ1Z190eXBlICphcmdzOwotCWJvb2xlYW4gdmFyYXJnczsKLQl1bnNpZ25lZCBpbnQgbjsKLQljb25zdCBjaGFyICpuYW1lOwotCi0JbWVtYmVycCA9ICoqcHAgPT0gJ00nOwotCWNvbnN0cCA9IGZhbHNlOwotCXZvbGF0aWxlcCA9IGZhbHNlOwotCWFyZ3MgPSBOVUxMOwotCXZhcmFyZ3MgPSBmYWxzZTsKLQotCSsrKnBwOwotCWlmICghIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqKnBwKSkKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JbiA9IHN0YWJfZGVtYW5nbGVfY291bnQgKHBwKTsKLQlpZiAoc3RybGVuICgqcHApIDwgbikKLQkgIHsKLQkgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JICB9Ci0JbmFtZSA9ICpwcDsKLQkqcHAgKz0gbjsKLQotCWlmIChtZW1iZXJwKQotCSAgewotCSAgICBpZiAoKipwcCA9PSAnQycpCi0JICAgICAgewotCQljb25zdHAgPSB0cnVlOwotCQkrKypwcDsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKCoqcHAgPT0gJ1YnKQotCSAgICAgIHsKLQkJdm9sYXRpbGVwID0gdHJ1ZTsKLQkJKysqcHA7Ci0JICAgICAgfQotCSAgICBpZiAoKipwcCAhPSAnRicpCi0JICAgICAgewotCQlzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICAgICsrKnBwOwotCSAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2FyZ3MgKG1pbmZvLCBwcCwKLQkJCQkgICAgICAocHR5cGUgPT0gTlVMTAotCQkJCSAgICAgICA/IChkZWJ1Z190eXBlICoqKSBOVUxMCi0JCQkJICAgICAgIDogJmFyZ3MpLAotCQkJCSAgICAgIChwdHlwZSA9PSBOVUxMCi0JCQkJICAgICAgID8gKGJvb2xlYW4gKikgTlVMTAotCQkJCSAgICAgICA6ICZ2YXJhcmdzKSkpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotCi0JaWYgKCoqcHAgIT0gJ18nKQotCSAgewotCSAgICBzdGFiX2JhZF9kZW1hbmdsZSAob3JpZyk7Ci0JICAgIHJldHVybiBmYWxzZTsKLQkgIH0KLQkrKypwcDsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0KLQlpZiAocHR5cGUgIT0gTlVMTCkKLQkgIHsKLQkgICAgZGVidWdfdHlwZSBjbGFzc190eXBlOwotCi0JICAgIGNsYXNzX3R5cGUgPSBzdGFiX2ZpbmRfdGFnZ2VkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBtaW5mby0+aW5mbywKLQkJCQkJCW5hbWUsIChpbnQpIG4sCi0JCQkJCQlERUJVR19LSU5EX0NMQVNTKTsKLQkgICAgaWYgKGNsYXNzX3R5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAgIHJldHVybiBmYWxzZTsKLQotCSAgICBpZiAoISBtZW1iZXJwKQotCSAgICAgICpwdHlwZSA9IGRlYnVnX21ha2Vfb2Zmc2V0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCBjbGFzc190eXBlLAotCQkJCQkgICAgICAgKnB0eXBlKTsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogRklYTUU6IFdlIGhhdmUgbm8gd2F5IHRvIHJlY29yZCBjb25zdHAgb3IKLSAgICAgICAgICAgICAgICAgICB2b2xhdGlsZXAuICAqLwotCQkqcHR5cGUgPSBkZWJ1Z19tYWtlX21ldGhvZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgKnB0eXBlLAotCQkJCQkJIGNsYXNzX3R5cGUsIGFyZ3MsIHZhcmFyZ3MpOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICArKypwcDsKLSAgICAgIGlmICghIHN0YWJfZGVtYW5nbGVfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgc3RhYl9kZW1hbmdsZV90eXBlIChtaW5mbywgcHAsIHB0eXBlKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQkqcHR5cGUgPSBkZWJ1Z19tYWtlX2NvbnN0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAqcHR5cGUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdRJzoKLSAgICAgIHsKLQljb25zdCBjaGFyICpob2xkOwotCi0JaG9sZCA9ICpwcDsKLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3F1YWxpZmllZCAobWluZm8sIHBwLCBwdHlwZSkpCi0JICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoISBzdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZW1hbmdsZSBhIGZ1bmRhbWVudGFsIHR5cGUuICBJZiB0aGUgcHR5cGUgYXJndW1lbnQgaXMgbm90IE5VTEwsCi0gICAqcHR5cGUgaXMgc2V0IHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX2Z1bmRfdHlwZSAobWluZm8sIHBwLCBwdHlwZSkKLSAgICAgc3RydWN0IHN0YWJfZGVtYW5nbGVfaW5mbyAqbWluZm87Ci0gICAgIGNvbnN0IGNoYXIgKipwcDsKLSAgICAgZGVidWdfdHlwZSAqcHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9yaWc7Ci0gIGJvb2xlYW4gY29uc3RwLCB2b2xhdGlsZXAsIHVuc2lnbmVkcCwgc2lnbmVkcDsKLSAgYm9vbGVhbiBkb25lOwotCi0gIG9yaWcgPSAqcHA7Ci0KLSAgY29uc3RwID0gZmFsc2U7Ci0gIHZvbGF0aWxlcCA9IGZhbHNlOwotICB1bnNpZ25lZHAgPSBmYWxzZTsKLSAgc2lnbmVkcCA9IGZhbHNlOwotCi0gIGRvbmUgPSBmYWxzZTsKLSAgd2hpbGUgKCEgZG9uZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqcHApCi0JewotCWNhc2UgJ0MnOgotCSAgY29uc3RwID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdVJzoKLQkgIHVuc2lnbmVkcCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6Ci0JICBzaWduZWRwID0gdHJ1ZTsKLQkgICsrKnBwOwotCSAgYnJlYWs7Ci0KLQljYXNlICdWJzoKLQkgIHZvbGF0aWxlcCA9IHRydWU7Ci0JICArKypwcDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGRvbmUgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKCoqcHApCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICBjYXNlICdfJzoKLSAgICAgIC8qIGNwbHVzX2RlbWFuZ2xlIHBlcm1pdHMgdGhpcywgYnV0IEkgZG9uJ3Qga25vdyB3aGF0IGl0IG1lYW5zLiAgKi8KLSAgICAgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndic6IC8qIHZvaWQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJ2b2lkIik7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV92b2lkX3R5cGUgKG1pbmZvLT5kaGFuZGxlKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6IC8qIGxvbmcgbG9uZyAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogImxvbmcgbG9uZyBpbnQiKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDgsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2wnOiAvKiBsb25nICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAibG9uZyB1bnNpZ25lZCBpbnQiCi0JCQkJCSAgIDogImxvbmcgaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA0LCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdpJzogLyogaW50ICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLAotCQkJCQkgICh1bnNpZ25lZHAKLQkJCQkJICAgPyAidW5zaWduZWQgaW50IgotCQkJCQkgICA6ICJpbnQiKSk7Ci0JICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgKnB0eXBlID0gZGVidWdfbWFrZV9pbnRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQsIHVuc2lnbmVkcCk7Ci0JfQotICAgICAgKysqcHA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOiAvKiBzaG9ydCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gInNob3J0IHVuc2lnbmVkIGludCIKLQkJCQkJICAgOiAic2hvcnQgaW50IikpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAyLCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzogLyogYm9vbCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImJvb2wiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Jvb2xfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdjJzogLyogY2hhciAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwKLQkJCQkJICAodW5zaWduZWRwCi0JCQkJCSAgID8gInVuc2lnbmVkIGNoYXIiCi0JCQkJCSAgIDogKHNpZ25lZHAKLQkJCQkJICAgICAgPyAic2lnbmVkIGNoYXIiCi0JCQkJCSAgICAgIDogImNoYXIiKSkpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAxLCB1bnNpZ25lZHApOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd3JzogLyogd2NoYXJfdCAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgIl9fd2NoYXJfdCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfaW50X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAyLCB0cnVlKTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncic6IC8qIGxvbmcgZG91YmxlICovCi0gICAgICBpZiAocHR5cGUgIT0gTlVMTCkKLQl7Ci0JICAqcHR5cGUgPSBkZWJ1Z19maW5kX25hbWVkX3R5cGUgKG1pbmZvLT5kaGFuZGxlLCAibG9uZyBkb3VibGUiKTsKLQkgIGlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCSAgICAqcHR5cGUgPSBkZWJ1Z19tYWtlX2Zsb2F0X3R5cGUgKG1pbmZvLT5kaGFuZGxlLCA4KTsKLQl9Ci0gICAgICArKypwcDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6IC8qIGRvdWJsZSAqLwotICAgICAgaWYgKHB0eXBlICE9IE5VTEwpCi0JewotCSAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgImRvdWJsZSIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDgpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzogLyogZmxvYXQgKi8KLSAgICAgIGlmIChwdHlwZSAhPSBOVUxMKQotCXsKLQkgICpwdHlwZSA9IGRlYnVnX2ZpbmRfbmFtZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsICJmbG9hdCIpOwotCSAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICpwdHlwZSA9IGRlYnVnX21ha2VfZmxvYXRfdHlwZSAobWluZm8tPmRoYW5kbGUsIDQpOwotCX0KLSAgICAgICsrKnBwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgICsrKnBwOwotICAgICAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqcHApKQotCXsKLQkgIHN0YWJfYmFkX2RlbWFuZ2xlIChvcmlnKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLSAgICBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqaG9sZDsKLQotCWlmICghIHN0YWJfZGVtYW5nbGVfY2xhc3MgKG1pbmZvLCBwcCwgJmhvbGQpKQotCSAgcmV0dXJuIGZhbHNlOwotCWlmIChwdHlwZSAhPSBOVUxMKQotCSAgewotCSAgICBjaGFyICpuYW1lOwotCi0JICAgIG5hbWUgPSBzYXZlc3RyaW5nIChob2xkLCAqcHAgLSBob2xkKTsKLQkgICAgKnB0eXBlID0gZGVidWdfZmluZF9uYW1lZF90eXBlIChtaW5mby0+ZGhhbmRsZSwgbmFtZSk7Ci0JICAgIGZyZWUgKG5hbWUpOwotCSAgICBpZiAoKnB0eXBlID09IERFQlVHX1RZUEVfTlVMTCkKLQkgICAgICB7Ci0JCS8qIEZJWE1FOiBJdCBpcyBwcm9iYWJseSBpbmNvcnJlY3QgdG8gYXNzdW1lIHRoYXQKLSAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgdHlwZXMgYXJlIHRhZ2dlZCB0eXBlcy4gICovCi0JCSpwdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAotCQkJCQkJaG9sZCwgKnBwIC0gaG9sZCwKLQkJCQkJCURFQlVHX0tJTkRfSUxMRUdBTCk7Ci0JCWlmICgqcHR5cGUgPT0gREVCVUdfVFlQRV9OVUxMKQotCQkgIHJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgICAgewotCWNoYXIgKm5hbWU7Ci0KLQlpZiAoISBzdGFiX2RlbWFuZ2xlX3RlbXBsYXRlIChtaW5mbywgcHAsCi0JCQkJICAgICAgcHR5cGUgIT0gTlVMTCA/ICZuYW1lIDogTlVMTCkpCi0JICByZXR1cm4gZmFsc2U7Ci0JaWYgKHB0eXBlICE9IE5VTEwpCi0JICB7Ci0JICAgICpwdHlwZSA9IHN0YWJfZmluZF90YWdnZWRfdHlwZSAobWluZm8tPmRoYW5kbGUsIG1pbmZvLT5pbmZvLAotCQkJCQkgICAgbmFtZSwgc3RybGVuIChuYW1lKSwKLQkJCQkJICAgIERFQlVHX0tJTkRfQ0xBU1MpOwotCSAgICBmcmVlIChuYW1lKTsKLQkgICAgaWYgKCpwdHlwZSA9PSBERUJVR19UWVBFX05VTEwpCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgc3RhYl9iYWRfZGVtYW5nbGUgKG9yaWcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBpZiAocHR5cGUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoY29uc3RwKQotCSpwdHlwZSA9IGRlYnVnX21ha2VfY29uc3RfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgICBpZiAodm9sYXRpbGVwKQotCSpwdHlwZSA9IGRlYnVnX21ha2Vfdm9sYXRpbGVfdHlwZSAobWluZm8tPmRoYW5kbGUsICpwdHlwZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZW1lbWJlciBhIHR5cGUgc3RyaW5nIGluIGEgZGVtYW5nbGVkIHN0cmluZy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2RlbWFuZ2xlX3JlbWVtYmVyX3R5cGUgKG1pbmZvLCBwLCBsZW4pCi0gICAgIHN0cnVjdCBzdGFiX2RlbWFuZ2xlX2luZm8gKm1pbmZvOwotICAgICBjb25zdCBjaGFyICpwOwotICAgICBpbnQgbGVuOwotewotICBpZiAobWluZm8tPnR5cGVzdHJpbmdfY291bnQgPj0gbWluZm8tPnR5cGVzdHJpbmdfYWxsb2MpCi0gICAgewotICAgICAgbWluZm8tPnR5cGVzdHJpbmdfYWxsb2MgKz0gMTA7Ci0gICAgICBtaW5mby0+dHlwZXN0cmluZ3MgPSAoKHN0cnVjdCBzdGFiX2RlbWFuZ2xlX3R5cGVzdHJpbmcgKikKLQkJCSAgICB4cmVhbGxvYyAobWluZm8tPnR5cGVzdHJpbmdzLAotCQkJCSAgICAgIChtaW5mby0+dHlwZXN0cmluZ19hbGxvYwotCQkJCSAgICAgICAqIHNpemVvZiAqbWluZm8tPnR5cGVzdHJpbmdzKSkpOwotICAgIH0KLQotICBtaW5mby0+dHlwZXN0cmluZ3NbbWluZm8tPnR5cGVzdHJpbmdfY291bnRdLnR5cGVzdHJpbmcgPSBwOwotICBtaW5mby0+dHlwZXN0cmluZ3NbbWluZm8tPnR5cGVzdHJpbmdfY291bnRdLmxlbiA9ICh1bnNpZ25lZCBpbnQpIGxlbjsKLSAgKyttaW5mby0+dHlwZXN0cmluZ19jb3VudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0YW1wLWguaW4gYi9iaW51dGlscy9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N0cmluZ3MuMSBiL2JpbnV0aWxzL3N0cmluZ3MuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZGUyOS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdHJpbmdzLjEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIHN0cmluZ3MgMSAiMjUgSnVuZSAxOTkzIiAiY3lnbnVzIHN1cHBvcnQiICJHTlUgRGV2ZWxvcG1lbnQgVG9vbHMiCi0uZGUgQlAKLS5zcAotLnRpIFwtLjJpCi1cKCoqCi0uLgotCi0uU0ggTkFNRQotc3RyaW5ncyBcLSBwcmludCB0aGUgc3RyaW5ncyBvZiBwcmludGFibGUgY2hhcmFjdGVycyBpbiBmaWxlcwotCi0uU0ggU1lOT1BTSVMKLS5oeSAwCi0ubmEKLS5UUAotLkIgc3RyaW5ncwotLlJCICJbXHwiIFwtYSB8IFwtXGMKLS5SQiB8IFwtXC1hbGwgIlx8XSIgCi0uUkIgIltcfCIgXC1mIHwgXC1cLXByaW50XC1maWxlXC1uYW1lICJcfF0iCi0uUkIgIltcfCIgXC1vICJcfF0iIAotLlJCICJbXHwiIFwtXC1oZWxwICJcfF0iIAotLlJCICJbXHwiIFwtdiB8IFwtXC12ZXJzaW9uICJcfF0iICAKLS5SQiAiW1x8IiBcLW4KLS5JIG1pblwtbGVuXGMKLS5SSSB8IFwtbWluXC1sZW5cYwotLlJCIHwgIlwtXC1ieXRlcz0iXGMKLS5JIG1pblwtbGVuXGMKLVwmXHxdCi0uUkIgIltcfCIgXC10Ci0uSSB7byx4LGR9XGMKLS5SQiAiW1x8IiAiXC1cLXRhcmdldD1cZkliZmRuYW1lIiAiXHxdIgotLlJCIHwgIlwtXC1yYWRpeD0iXGMKLS5JIHtvLHgsZH1cYwotXCZcfF0KLS5JIGZpbGVcYwotLmFkIGIKLS5oeSAxCi0uU0ggREVTQ1JJUFRJT04KLUZvciBlYWNoCi0uSSBmaWxlCi1naXZlbiwgR05VIFxjCi0uQiBzdHJpbmdzCi1wcmludHMgdGhlIHByaW50YWJsZSBjaGFyYWN0ZXIgc2VxdWVuY2VzIHRoYXQgYXJlIGF0IGxlYXN0IDQKLWNoYXJhY3RlcnMgbG9uZyAob3IgdGhlIG51bWJlciBnaXZlbiB3aXRoIHRoZSBvcHRpb25zIGJlbG93KSBhbmQgYXJlCi1mb2xsb3dlZCBieSBhbiB1bnByaW50YWJsZSBjaGFyYWN0ZXIuICBCeSBkZWZhdWx0LCBpdCBvbmx5IHByaW50cyB0aGUKLXN0cmluZ3MgZnJvbSB0aGUgaW5pdGlhbGl6ZWQgYW5kIGxvYWRlZCBzZWN0aW9ucyBvZiBvYmplY3QgZmlsZXM7IGZvcgotb3RoZXIgdHlwZXMgb2YgZmlsZXMsIGl0IHByaW50cyB0aGUgc3RyaW5ncyBmcm9tIHRoZSB3aG9sZSBmaWxlLgotCi0uUFAKLS5CIHN0cmluZ3MKLWlzIG1haW5seSB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBjb250ZW50cyBvZiBub24tdGV4dCBmaWxlcy4KLQotLlNIIE9QVElPTlMKLVRoZSBsb25nIGFuZCBzaG9ydCBmb3JtcyBvZiBvcHRpb25zLCBzaG93biBoZXJlIGFzIGFsdGVybmF0aXZlcywgYXJlCi1lcXVpdmFsZW50LgotCi0uVFAKLS5CIFwtYQotLlRQCi0uQiBcLVwtYWxsCi0uVFAKLS5CIFwtCi1EbyBub3Qgc2NhbiBvbmx5IHRoZSBpbml0aWFsaXplZCBhbmQgbG9hZGVkIHNlY3Rpb25zIG9mIG9iamVjdCBmaWxlczsKLXNjYW4gdGhlIHdob2xlIGZpbGVzLgotCi0uVFAKLS5CIFwtZgotLlRQCi0uQiBcLVwtcHJpbnRcLWZpbGVcLW5hbWUKLVByaW50IHRoZSBuYW1lIG9mIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4KLQotLlRQCi0uQiBcLVwtaGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvCi0uQiBzdHJpbmdzCi1vbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi0uVFAKLS5CIFwtdgotLlRQCi0uQiBcLVwtdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyCi1vZgotLkIgc3RyaW5ncwotb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLQotLlRQCi0uQiAiXC1uIFxmSW1pblwtbGVuXGZQIgotLlRQCi0uQiAiXC1cZkltaW5cLWxlblxmUCIKLS5UUAotLkIgIlwtYnl0ZXM9XGZJbWluXC1sZW5cZlAiCi1QcmludCBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB0aGF0IGFyZSBhdCBsZWFzdAotLkkgbWluXC1sZW4KLWNoYXJhY3RlcnMgbG9uZywgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCA0LgotCi0uVFAKLS5CUiAiXC10ICIge28seCxkfQotLlRQCi0uQlIgIlwtXC1yYWRpeD0iIHtvLHgsZH0KLVByaW50IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBmaWxlIGJlZm9yZSBlYWNoIHN0cmluZy4gIFRoZSBzaW5nbGUKLWNoYXJhY3RlciBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHJhZGl4IG9mIHRoZSBvZmZzZXRcKGVtb2N0YWwsCi1oZXhhZGVjaW1hbCwgb3IgZGVjaW1hbC4KLQotLlRQCi0uQkkgIlwtXC10YXJnZXQ9IiAiYmZkbmFtZSIKLVNwZWNpZnkgYW4gb2JqZWN0IGNvZGUgZm9ybWF0IG90aGVyIHRoYW4geW91ciBzeXN0ZW0ncyBkZWZhdWx0IGZvcm1hdC4KLVNlZSAKLS5CUiBvYmpkdW1wICggMSApLAotZm9yIGluZm9ybWF0aW9uIG9uIGxpc3RpbmcgYXZhaWxhYmxlIGZvcm1hdHMuCi0KLS5UUAotLkIgXC1vCi1MaWtlCi0uQlIgIlwtdCBvIiAuCi0KLS5QUAotCi0uU0ggIlNFRSBBTFNPIgotLlJCICJgXHwiIGJpbnV0aWxzICJcfCciCi1lbnRyeSBpbiAKLS5CCi1pbmZvXGMKLVwmOyAKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotXCYsIFJvbGFuZCBILiBQZXNjaCAoT2N0b2JlciAxOTkxKTsKLS5CUiBhciAoIDEgKSwKLS5CUiBubSAoIDEgKSwKLS5CUiBvYmpkdW1wICggMSApLAotLkJSIHJhbmxpYiAoIDEgKS4KLQotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpbmdzLmMgYi9iaW51dGlscy9zdHJpbmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZmU2YTEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvc3RyaW5ncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qIHN0cmluZ3MgLS0gcHJpbnQgdGhlIHN0cmluZ3Mgb2YgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gZmlsZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQwKLS8qIFVzYWdlOiBzdHJpbmdzIFtvcHRpb25zXSBmaWxlLi4uCi0KLSAgIE9wdGlvbnM6Ci0gICAtLWFsbAotICAgLWEKLSAgIC0JCURvIG5vdCBzY2FuIG9ubHkgdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBvZiBvYmplY3QgZmlsZXMuCi0KLSAgIC0tcHJpbnQtZmlsZS1uYW1lCi0gICAtZgkJUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVmb3JlIGVhY2ggc3RyaW5nLgotCi0gICAtLWJ5dGVzPW1pbi1sZW4KLSAgIC1uIG1pbi1sZW4KLSAgIC1taW4tbGVuCVByaW50IGdyYXBoaWMgY2hhciBzZXF1ZW5jZXMsIE1JTi1MRU4gb3IgbW9yZSBieXRlcyBsb25nLAotCQl0aGF0IGFyZSBmb2xsb3dlZCBieSBhIE5VTCBvciBhIG5ld2xpbmUuICBEZWZhdWx0IGlzIDQuCi0KLSAgIC0tcmFkaXg9e28seCxkfQotICAgLXQge28seCxkfQlQcmludCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSBiZWZvcmUgZWFjaCBzdHJpbmcsCi0JCWluIG9jdGFsL2hleC9kZWNpbWFsLgotCi0gICAtbwkJTGlrZSAtdG8uICAoU29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgaGF2ZSAtbyBsaWtlIC10bywKLQkJb3RoZXJzIGxpa2UgLXRkLiAgV2UgY2hvc2Ugb25lIGFyYml0cmFyaWx5LikKLQotICAgLS10YXJnZXQ9QkZETkFNRQotCQlTcGVjaWZ5IGEgbm9uLWRlZmF1bHQgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi0gICAtLWhlbHAKLSAgIC1oCQlQcmludCB0aGUgdXNhZ2UgbWVzc2FnZSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0gICAtLXZlcnNpb24KLSAgIC12CQlQcmludCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIG51bWJlci4KLQotICAgV3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIDxybXNAZ251LmFpLm1pdC5lZHU+Ci0gICBhbmQgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWZkZWYgaXNhc2NpaQotI2RlZmluZSBpc2dyYXBoaWMoYykgKGlzYXNjaWkgKGMpICYmIGlzcHJpbnQgKGMpKQotI2Vsc2UKLSNkZWZpbmUgaXNncmFwaGljKGMpIChpc3ByaW50IChjKSkKLSNlbmRpZgotCi0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0KLS8qIFRoZSBCRkQgc2VjdGlvbiBmbGFncyB0aGF0IGlkZW50aWZ5IGFuIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbi4gICovCi0jZGVmaW5lIERBVEFfRkxBR1MgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUykKLQotLyogUmFkaXggZm9yIHByaW50aW5nIGFkZHJlc3NlcyAobXVzdCBiZSA4LCAxMCBvciAxNikuICAqLwotc3RhdGljIGludCBhZGRyZXNzX3JhZGl4OwotCi0vKiBNaW5pbXVtIGxlbmd0aCBvZiBzZXF1ZW5jZSBvZiBncmFwaGljIGNoYXJzIHRvIHRyaWdnZXIgb3V0cHV0LiAgKi8KLXN0YXRpYyBpbnQgc3RyaW5nX21pbjsKLQotLyogdHJ1ZSBtZWFucyBwcmludCBhZGRyZXNzIHdpdGhpbiBmaWxlIGZvciBlYWNoIHN0cmluZy4gICovCi1zdGF0aWMgYm9vbGVhbiBwcmludF9hZGRyZXNzZXM7Ci0KLS8qIHRydWUgbWVhbnMgcHJpbnQgZmlsZW5hbWUgZm9yIGVhY2ggc3RyaW5nLiAgKi8KLXN0YXRpYyBib29sZWFuIHByaW50X2ZpbGVuYW1lczsKLQotLyogdHJ1ZSBtZWFucyBmb3Igb2JqZWN0IGZpbGVzIHNjYW4gb25seSB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyBib29sZWFuIGRhdGFzZWN0aW9uX29ubHk7Ci0KLS8qIHRydWUgaWYgd2UgZm91bmQgYW4gaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9uIGluIHRoZSBjdXJyZW50IGZpbGUuICAqLwotc3RhdGljIGJvb2xlYW4gZ290X2Ffc2VjdGlvbjsKLQotLyogVGhlIEJGRCBvYmplY3QgZmlsZSBmb3JtYXQuICAqLwotc3RhdGljIGNoYXIgKnRhcmdldDsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPQotewotICB7ImFsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnYSd9LAotICB7InByaW50LWZpbGUtbmFtZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZid9LAotICB7ImJ5dGVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICduJ30sCi0gIHsicmFkaXgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgeyJ0YXJnZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1QnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdoJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAndid9LAotICB7TlVMTCwgMCwgTlVMTCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkIHN0cmluZ3NfYV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0cmluZ3Nfb2JqZWN0X2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdHJpbmdzX2ZpbGUgUEFSQU1TICgoY2hhciAqZmlsZSkpOwotc3RhdGljIGludCBpbnRlZ2VyX2FyZyBQQVJBTVMgKChjaGFyICpzKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdHJpbmdzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBGSUxFICpzdHJlYW0sCi0JCQkJICBmaWxlX3B0ciBhZGRyZXNzLCBpbnQgc3RvcF9wb2ludCwKLQkJCQkgIGludCBtYWdpY2NvdW50LCBjaGFyICptYWdpYykpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqc3RyZWFtLCBpbnQgc3RhdHVzKSk7Ci0MCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG9wdGM7Ci0gIGludCBleGl0X3N0YXR1cyA9IDA7Ci0gIGJvb2xlYW4gZmlsZXNfZ2l2ZW4gPSBmYWxzZTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLSAgc3RyaW5nX21pbiA9IC0xOwotICBwcmludF9hZGRyZXNzZXMgPSBmYWxzZTsKLSAgcHJpbnRfZmlsZW5hbWVzID0gZmFsc2U7Ci0gIGRhdGFzZWN0aW9uX29ubHkgPSB0cnVlOwotICB0YXJnZXQgPSBOVUxMOwotCi0gIHdoaWxlICgob3B0YyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiYWZuOm90OnYwMTIzNDU2Nzg5IiwKLQkJCSAgICAgIGxvbmdfb3B0aW9ucywgKGludCAqKSAwKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIHN3aXRjaCAob3B0YykKLQl7Ci0JY2FzZSAnYSc6Ci0JICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgcHJpbnRfZmlsZW5hbWVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnaCc6Ci0JICB1c2FnZSAoc3Rkb3V0LCAwKTsKLQotCWNhc2UgJ24nOgotCSAgc3RyaW5nX21pbiA9IGludGVnZXJfYXJnIChvcHRhcmcpOwotCSAgaWYgKHN0cmluZ19taW4gPCAxKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW52YWxpZCBudW1iZXIgJXNcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ28nOgotCSAgcHJpbnRfYWRkcmVzc2VzID0gdHJ1ZTsKLQkgIGFkZHJlc3NfcmFkaXggPSA4OwotCSAgYnJlYWs7Ci0KLQljYXNlICd0JzoKLQkgIHByaW50X2FkZHJlc3NlcyA9IHRydWU7Ci0JICBpZiAob3B0YXJnWzFdICE9ICdcMCcpCi0JICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgc3dpdGNoIChvcHRhcmdbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnbyc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDg7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgYWRkcmVzc19yYWRpeCA9IDEwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIGFkZHJlc3NfcmFkaXggPSAxNjsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHVzYWdlIChzdGRlcnIsIDEpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ1QnOgotCSAgdGFyZ2V0ID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICd2JzoKLQkgIHByaW50X3ZlcnNpb24gKCJzdHJpbmdzIik7Ci0JICBicmVhazsKLQotCWNhc2UgJz8nOgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHN0cmluZ19taW4gPCAwKQotCSAgICBzdHJpbmdfbWluID0gb3B0YzsKLQkgIGVsc2UKLQkgICAgc3RyaW5nX21pbiA9IHN0cmluZ19taW4gKiAxMCArIG9wdGMgLSAnMCc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChzdHJpbmdfbWluIDwgMCkKLSAgICBzdHJpbmdfbWluID0gNDsKLQotICBiZmRfaW5pdCAoKTsKLSAgc2V0X2RlZmF1bHRfYmZkX3RhcmdldCAoKTsKLQotICBpZiAob3B0aW5kID49IGFyZ2MpCi0gICAgewotICAgICAgZGF0YXNlY3Rpb25fb25seSA9IGZhbHNlOwotICAgICAgcHJpbnRfc3RyaW5ncyAoIntzdGFuZGFyZCBpbnB1dH0iLCBzdGRpbiwgMCwgMCwgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBmaWxlc19naXZlbiA9IHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yICg7IG9wdGluZCA8IGFyZ2M7ICsrb3B0aW5kKQotCXsKLQkgIGlmIChzdHJjbXAgKGFyZ3Zbb3B0aW5kXSwgIi0iKSA9PSAwKQotCSAgICBkYXRhc2VjdGlvbl9vbmx5ID0gZmFsc2U7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaWxlc19naXZlbiA9IHRydWU7Ci0JICAgICAgZXhpdF9zdGF0dXMgfD0gKHN0cmluZ3NfZmlsZSAoYXJndltvcHRpbmRdKSA9PSBmYWxzZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmaWxlc19naXZlbiA9PSBmYWxzZSkKLSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQotICByZXR1cm4gKGV4aXRfc3RhdHVzKTsKLX0KLQwKLS8qIFNjYW4gc2VjdGlvbiBTRUNUIG9mIHRoZSBmaWxlIEFCRkQsIHdob3NlIHByaW50YWJsZSBuYW1lIGlzIEZJTEUuCi0gICBJZiBpdCBjb250YWlucyBpbml0aWFsaXplZCBkYXRhLAotICAgc2V0IGBnb3RfYV9zZWN0aW9uJyBhbmQgcHJpbnQgdGhlIHN0cmluZ3MgaW4gaXQuICAqLwotCi1zdGF0aWMgdm9pZAotc3RyaW5nc19hX3NlY3Rpb24gKGFiZmQsIHNlY3QsIGZpbGVhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Q7Ci0gICAgIFBUUiBmaWxlYXJnOwotewotICBjb25zdCBjaGFyICpmaWxlID0gKGNvbnN0IGNoYXIgKikgZmlsZWFyZzsKLQotICBpZiAoKHNlY3QtPmZsYWdzICYgREFUQV9GTEFHUykgPT0gREFUQV9GTEFHUykKLSAgICB7Ci0gICAgICBiZmRfc2l6ZV90eXBlIHN6ID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzZWN0KTsKLSAgICAgIFBUUiBtZW0gPSB4bWFsbG9jIChzeik7Ci0gICAgICBpZiAoYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBzZWN0LCBtZW0sIChmaWxlX3B0cikgMCwgc3opKQotCXsKLQkgIGdvdF9hX3NlY3Rpb24gPSB0cnVlOwotCSAgcHJpbnRfc3RyaW5ncyAoZmlsZSwgKEZJTEUgKikgTlVMTCwgc2VjdC0+ZmlsZXBvcywgMCwgc3osIG1lbSk7Ci0JfQotICAgICAgZnJlZSAobWVtKTsKLSAgICB9Ci19Ci0KLS8qIFNjYW4gYWxsIG9mIHRoZSBzZWN0aW9ucyBpbiBGSUxFLCBhbmQgcHJpbnQgdGhlIHN0cmluZ3MKLSAgIGluIHRoZSBpbml0aWFsaXplZCBkYXRhIHNlY3Rpb24ocykuCi0KLSAgIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwsCi0gICBmYWxzZSBpZiBub3QgKHN1Y2ggYXMgaWYgRklMRSBpcyBub3QgYW4gb2JqZWN0IGZpbGUpLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0cmluZ3Nfb2JqZWN0X2ZpbGUgKGZpbGUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGU7Ci17Ci0gIGJmZCAqYWJmZCA9IGJmZF9vcGVuciAoZmlsZSwgdGFyZ2V0KTsKLQotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRyZWF0IHRoZSBmaWxlIGFzIGEgbm9uLW9iamVjdCBmaWxlLiAgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogVGhpcyBjYWxsIGlzIG1haW5seSBmb3IgaXRzIHNpZGUgZWZmZWN0IG9mIHJlYWRpbmcgaW4gdGhlIHNlY3Rpb25zLgotICAgICBXZSBmb2xsb3cgdGhlIHRyYWRpdGlvbmFsIGJlaGF2aW9yIG9mIGBzdHJpbmdzJyBpbiB0aGF0IHdlIGRvbid0Ci0gICAgIGNvbXBsYWluIGlmIHdlIGRvbid0IHJlY29nbml6ZSBhIGZpbGUgdG8gYmUgYW4gb2JqZWN0IGZpbGUuICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkgPT0gZmFsc2UpCi0gICAgewotICAgICAgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZ290X2Ffc2VjdGlvbiA9IGZhbHNlOwotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKGFiZmQsIHN0cmluZ3NfYV9zZWN0aW9uLCAoUFRSKSBmaWxlKTsKLQotICBpZiAoIWJmZF9jbG9zZSAoYWJmZCkpCi0gICAgewotICAgICAgYmZkX25vbmZhdGFsIChmaWxlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgcmV0dXJuIGdvdF9hX3NlY3Rpb247Ci19Ci0KLS8qIFByaW50IHRoZSBzdHJpbmdzIGluIEZJTEUuICBSZXR1cm4gdHJ1ZSBpZiBvaywgZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0cmluZ3NfZmlsZSAoZmlsZSkKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgLyogSWYgd2Ugd2VyZW4ndCB0b2xkIHRvIHNjYW4gdGhlIHdob2xlIGZpbGUsCi0gICAgIHRyeSB0byBvcGVuIGl0IGFzIGFuIG9iamVjdCBmaWxlIGFuZCBvbmx5IGxvb2sgYXQKLSAgICAgaW5pdGlhbGl6ZWQgZGF0YSBzZWN0aW9ucy4gIElmIHRoYXQgZmFpbHMsIGZhbGwgYmFjayB0byB0aGUKLSAgICAgd2hvbGUgZmlsZS4gICovCi0gIGlmICghZGF0YXNlY3Rpb25fb25seSB8fCAhc3RyaW5nc19vYmplY3RfZmlsZSAoZmlsZSkpCi0gICAgewotICAgICAgRklMRSAqc3RyZWFtOwotCi0gICAgICBzdHJlYW0gPSBmb3BlbiAoZmlsZSwgInJiIik7Ci0gICAgICAvKiBOb3QgYWxsIHN5c3RlbXMgcGVybWl0ICJyYiIsIHNvIHRyeSAiciIgaWYgaXQgZmFpbGVkLiAgKi8KLSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQlzdHJlYW0gPSBmb3BlbiAoZmlsZSwgInIiKTsKLSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKLQkgIHBlcnJvciAoZmlsZSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgICBwcmludF9zdHJpbmdzIChmaWxlLCBzdHJlYW0sIChmaWxlX3B0cikgMCwgMCwgMCwgKGNoYXIgKikgMCk7Ci0KLSAgICAgIGlmIChmY2xvc2UgKHN0cmVhbSkgPT0gRU9GKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgcGVycm9yIChmaWxlKTsKLQkgIHJldHVybiBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotDAotLyogRmluZCB0aGUgc3RyaW5ncyBpbiBmaWxlIEZJTEVOQU1FLCByZWFkIGZyb20gU1RSRUFNLgotICAgQXNzdW1lIHRoYXQgU1RSRUFNIGlzIHBvc2l0aW9uZWQgc28gdGhhdCB0aGUgbmV4dCBieXRlIHJlYWQKLSAgIGlzIGF0IGFkZHJlc3MgQUREUkVTUyBpbiB0aGUgZmlsZS4KLSAgIFN0b3AgcmVhZGluZyBhdCBhZGRyZXNzIFNUT1BfUE9JTlQgaW4gdGhlIGZpbGUsIGlmIG5vbnplcm8uCi0KLSAgIElmIFNUUkVBTSBpcyBOVUxMLCBkbyBub3QgcmVhZCBmcm9tIGl0LgotICAgVGhlIGNhbGxlciBjYW4gc3VwcGx5IGEgYnVmZmVyIG9mIGNoYXJhY3RlcnMKLSAgIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGRhdGEgaW4gU1RSRUFNLgotICAgTUFHSUMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlciBhbmQKLSAgIE1BR0lDQ09VTlQgaXMgaG93IG1hbnkgY2hhcmFjdGVycyBhcmUgaW4gaXQuCi0gICBUaG9zZSBjaGFyYWN0ZXJzIGNvbWUgYXQgYWRkcmVzcyBBRERSRVNTIGFuZCB0aGUgZGF0YSBpbiBTVFJFQU0gZm9sbG93LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3N0cmluZ3MgKGZpbGVuYW1lLCBzdHJlYW0sIGFkZHJlc3MsIHN0b3BfcG9pbnQsIG1hZ2ljY291bnQsIG1hZ2ljKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBmaWxlX3B0ciBhZGRyZXNzOwotICAgICBpbnQgc3RvcF9wb2ludDsKLSAgICAgaW50IG1hZ2ljY291bnQ7Ci0gICAgIGNoYXIgKm1hZ2ljOwotewotICBjaGFyICpidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJpbmdfbWluICsgMSk7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgZmlsZV9wdHIgc3RhcnQ7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBjOwotCi0gICAgICAvKiBTZWUgaWYgdGhlIG5leHQgYHN0cmluZ19taW4nIGNoYXJzIGFyZSBhbGwgZ3JhcGhpYyBjaGFycy4gICovCi0gICAgdHJ5bGluZToKLSAgICAgIGlmIChzdG9wX3BvaW50ICYmIGFkZHJlc3MgPj0gc3RvcF9wb2ludCkKLQlicmVhazsKLSAgICAgIHN0YXJ0ID0gYWRkcmVzczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpbmdfbWluOyBpKyspCi0JewotCSAgaWYgKG1hZ2ljY291bnQpCi0JICAgIHsKLQkgICAgICBtYWdpY2NvdW50LS07Ci0JICAgICAgYyA9ICptYWdpYysrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc3RyZWFtID09IE5VTEwpCi0JCXJldHVybjsKLQkgICAgICBjID0gZ2V0YyAoc3RyZWFtKTsKLQkgICAgICBpZiAoYyA9PSBFT0YpCi0JCXJldHVybjsKLQkgICAgfQotCSAgYWRkcmVzcysrOwotCSAgaWYgKCFpc2dyYXBoaWMgKGMpKQotCSAgICAvKiBGb3VuZCBhIG5vbi1ncmFwaGljLiAgVHJ5IGFnYWluIHN0YXJ0aW5nIHdpdGggbmV4dCBjaGFyLiAgKi8KLQkgICAgZ290byB0cnlsaW5lOwotCSAgYnVmW2ldID0gYzsKLQl9Ci0KLSAgICAgIC8qIFdlIGZvdW5kIGEgcnVuIG9mIGBzdHJpbmdfbWluJyBncmFwaGljIGNoYXJhY3RlcnMuICBQcmludCB1cAotICAgICAgICAgdG8gdGhlIG5leHQgbm9uLWdyYXBoaWMgY2hhcmFjdGVyLiAgKi8KLQotICAgICAgaWYgKHByaW50X2ZpbGVuYW1lcykKLQlwcmludGYgKCIlczogIiwgZmlsZW5hbWUpOwotICAgICAgaWYgKHByaW50X2FkZHJlc3NlcykKLQlzd2l0Y2ggKGFkZHJlc3NfcmFkaXgpCi0JICB7Ci0JICBjYXNlIDg6Ci0JICAgIHByaW50ZiAoIiU3bG8gIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMTA6Ci0JICAgIHByaW50ZiAoIiU3bGQgIiwgKGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgMTY6Ci0JICAgIHByaW50ZiAoIiU3bHggIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLSAgICAgIGJ1ZltpXSA9ICdcMCc7Ci0gICAgICBmcHV0cyAoYnVmLCBzdGRvdXQpOwotCi0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBpZiAobWFnaWNjb3VudCkKLQkgICAgewotCSAgICAgIG1hZ2ljY291bnQtLTsKLQkgICAgICBjID0gKm1hZ2ljKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgICAgYyA9IGdldGMgKHN0cmVhbSk7Ci0JICAgICAgaWYgKGMgPT0gRU9GKQotCQlicmVhazsKLQkgICAgfQotCSAgYWRkcmVzcysrOwotCSAgaWYgKCEgaXNncmFwaGljIChjKSkKLQkgICAgYnJlYWs7Ci0JICBwdXRjaGFyIChjKTsKLQl9Ci0KLSAgICAgIHB1dGNoYXIgKCdcbicpOwotICAgIH0KLX0KLQwKLS8qIFBhcnNlIHN0cmluZyBTIGFzIGFuIGludGVnZXIsIHVzaW5nIGRlY2ltYWwgcmFkaXggYnkgZGVmYXVsdCwKLSAgIGJ1dCBhbGxvd2luZyBvY3RhbCBhbmQgaGV4IG51bWJlcnMgYXMgaW4gQy4gICovCi0KLXN0YXRpYyBpbnQKLWludGVnZXJfYXJnIChzKQotICAgICBjaGFyICpzOwotewotICBpbnQgdmFsdWU7Ci0gIGludCByYWRpeCA9IDEwOwotICBjaGFyICpwID0gczsKLSAgaW50IGM7Ci0KLSAgaWYgKCpwICE9ICcwJykKLSAgICByYWRpeCA9IDEwOwotICBlbHNlIGlmICgqKytwID09ICd4JykKLSAgICB7Ci0gICAgICByYWRpeCA9IDE2OwotICAgICAgcCsrOwotICAgIH0KLSAgZWxzZQotICAgIHJhZGl4ID0gODsKLQotICB2YWx1ZSA9IDA7Ci0gIHdoaWxlICgoKGMgPSAqcCsrKSA+PSAnMCcgJiYgYyA8PSAnOScpCi0JIHx8IChyYWRpeCA9PSAxNiAmJiAoYyAmIH40MCkgPj0gJ0EnICYmIChjICYgfjQwKSA8PSAnWicpKQotICAgIHsKLSAgICAgIHZhbHVlICo9IHJhZGl4OwotICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCXZhbHVlICs9IGMgLSAnMCc7Ci0gICAgICBlbHNlCi0JdmFsdWUgKz0gKGMgJiB+NDApIC0gJ0EnOwotICAgIH0KLQotICBpZiAoYyA9PSAnYicpCi0gICAgdmFsdWUgKj0gNTEyOwotICBlbHNlIGlmIChjID09ICdCJykKLSAgICB2YWx1ZSAqPSAxMDI0OwotICBlbHNlCi0gICAgcC0tOwotCi0gIGlmICgqcCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBpbnZhbGlkIGludGVnZXIgYXJndW1lbnQgJXNcbiIpLCBwcm9ncmFtX25hbWUsIHMpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1Vc2FnZTogJXMgWy1hZm92XSBbLW4gbWluLWxlbl0gWy1taW4tbGVuXSBbLXQge28seCxkfV0gWy1dXG5cCi0gICAgICAgWy0tYWxsXSBbLS1wcmludC1maWxlLW5hbWVdIFstLWJ5dGVzPW1pbi1sZW5dIFstLXJhZGl4PXtvLHgsZH1dXG5cCi0gICAgICAgWy0tdGFyZ2V0PWJmZG5hbWVdIFstLWhlbHBdIFstLXZlcnNpb25dIGZpbGUuLi5cbiIpLAotCSAgIHByb2dyYW1fbmFtZSk7Ci0gIGxpc3Rfc3VwcG9ydGVkX3RhcmdldHMgKHByb2dyYW1fbmFtZSwgc3RyZWFtKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIGZwcmludGYgKHN0cmVhbSwgXygiUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci0gIGV4aXQgKHN0YXR1cyk7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zdHJpcC4xIGIvYmludXRpbHMvc3RyaXAuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4ODE3ZC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zdHJpcC4xCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS5cIiBDb3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBzdHJpcCAxICI1IE5vdmVtYmVyIDE5OTEiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLS5kZSBCUAotLnNwCi0udGkgXC0uMmkKLVwoKioKLS4uCi0KLS5TSCBOQU1FCi1zdHJpcCBcLSBEaXNjYXJkIHN5bWJvbHMgZnJvbSBvYmplY3QgZmlsZXMuCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBzdHJpcAotLlJCICJbXHwiIFwtRlwgXGZJYmZkbmFtZVxmUlwgfFwgXGZCXC1cLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1JXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtaW5wdXRcLXRhcmdldD1cZkliZmRuYW1lXGZQICJcfF0iCi0uUkIgIltcfCIgXC1PXCBcZkliZmRuYW1lXGZSXCB8XCBcZkJcLVwtb3V0cHV0XC10YXJnZXQ9XGZJYmZkbmFtZVxmUCAiXHxdIgotLlJCICJbXHwiIFwtUlwgXGZJc2VjdGlvbm5hbWVcZlJcIHxcIFxmQlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWVcZlAgIlx8XSIKLS5SQiAiW1x8IiBcLXNcZlJcIHxcIFxmQlwtXC1zdHJpcFwtYWxsICJcfF0iCi0uUkIgIltcfCIgXC1TXGZSXCB8XCBcZkJcLWdcZlJcIHxcIFxmQlwtXC1zdHJpcFwtZGVidWcgIlx8XSIKLS5SQiAiW1x8IiBcLVwtc3RyaXBcLXVubmVlZGVkXGZSICJcfF0iCi0uUkIgIltcfCIgXC14XGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtYWxsICJcfF0iCi0uUkIgIltcfCIgXC1YXGZSXCB8XCBcZkJcLVwtZGlzY2FyZFwtbG9jYWxzICJcfF0iCi0uUkIgIltcfCIgXC1LXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWVcZlIgIlx8XSIgCi0uUkIgIltcfCIgXC1OXCBcZklzeW1ib2xuYW1lXGZSXCB8XCBcZkJcLVwtc3RyaXBcLXN5bWJvbD1cZklzeW1ib2xuYW1lXGZSICJcfF0iCi0uUkIgIltcfCIgXC1vXCBcZklmaWxlXGZcUiAiXHxdIgotLlJCICJbXHwiIFwtcFxmUlwgfFwgXGZCXC1cLXByZXNlcnZlXC1kYXRlcyAiXHxdIgotLlJCICJbXHwiIFwtdlxmUlwgfFwgXGZCXC1cLXZlcmJvc2UgIlx8XSIKLS5SQiAiW1x8IiBcLVZcZlJcIHxcIFxmQlwtXC12ZXJzaW9uICJcfF0iCi0uUkIgIltcfCIgXC1WXGZSXCB8XCBcZkJcLVwtaGVscCAiXHxdIgotLkkgb2JqZmlsZVxjCi1cJi5cfC5cfC4KLQotLlNIIERFU0NSSVBUSU9OCi1HTlUKLS5CIHN0cmlwCi1kaXNjYXJkcyBhbGwgc3ltYm9scyBmcm9tIHRoZSBvYmplY3QgZmlsZXMKLS5JUiBvYmpmaWxlIC4KLVRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBtYXkgaW5jbHVkZSBhcmNoaXZlcy4KLUF0IGxlYXN0IG9uZSBvYmplY3QgZmlsZSBtdXN0IGJlIGdpdmVuLgotCi0uUAotLkIgc3RyaXAKLW1vZGlmaWVzIHRoZSBmaWxlcyBuYW1lZCBpbiBpdHMgYXJndW1lbnQsCi1yYXRoZXIgdGhhbiB3cml0aW5nIG1vZGlmaWVkIGNvcGllcyB1bmRlciBkaWZmZXJlbnQgbmFtZXMuCi0KLS5TSCBPUFRJT05TCi0uVFAKLS5CICJcLUYgXGZJYmZkbmFtZSIKLS5UUAotLkIgIlwtXC10YXJnZXQ9XGZJYmZkbmFtZSIKLVRyZWF0IHRoZSBvcmlnaW5hbCBcZklvYmpmaWxlXGZQIGFzIGEgZmlsZSB3aXRoIHRoZSBvYmplY3QKLWNvZGUgZm9ybWF0IFxmSWJmZG5hbWVcZlAsIGFuZCByZXdyaXRlIGl0IGluIHRoZSBzYW1lIGZvcm1hdC4KLQotLlRQCi0uQiBcLVwtaGVscAotU2hvdyBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8KLS5CIHN0cmlwCi1hbmQgZXhpdC4KLQotLlRQCi0uQiAiXC1JIFxmSWJmZG5hbWUKLS5UUAotLkIgIlwtXC1pbnB1dFwtdGFyZ2V0PVxmSWJmZG5hbWUiCi1UcmVhdCB0aGUgb3JpZ2luYWwgXGZJb2JqZmlsZVxmUCBhcyBhIGZpbGUgd2l0aCB0aGUgb2JqZWN0Ci1jb2RlIGZvcm1hdCBcZkliZmRuYW1lXGZQLgotCi0uVFAKLS5CICJcLU8gXGZJYmZkbmFtZVxmUCIKLS5UUAotLkIgIlwtXC1vdXRwdXRcLXRhcmdldD1cZkliZmRuYW1lIgotUmVwbGFjZSBcZklvYmpmaWxlXGZQIHdpdGggYSBmaWxlIGluIHRoZSBvdXRwdXQgZm9ybWF0IFxmSWJmZG5hbWVcZlAuCi0KLS5UUAotLkIgIlwtUiBcZklzZWN0aW9ubmFtZVxmUCIKLS5UUAotLkIgIlwtXC1yZW1vdmVcLXNlY3Rpb249XGZJc2VjdGlvbm5hbWUiCi1SZW1vdmUgdGhlIG5hbWVkIHNlY3Rpb24gZnJvbSB0aGUgZmlsZS4gIFRoaXMgb3B0aW9uIG1heSBiZSBnaXZlbiBtb3JlCi10aGFuIG9uY2UuICBOb3RlIHRoYXQgdXNpbmcgdGhpcyBvcHRpb24gaW5hcHByb3ByaWF0ZWx5IG1heSBtYWtlIHRoZQotb2JqZWN0IGZpbGUgdW51c2FibGUuCi0KLS5UUAotLkIgXC1zCi0uVFAKLS5CIFwtXC1zdHJpcFwtYWxsCi1SZW1vdmUgYWxsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1TCi0uVFAKLS5CIFwtZwotLlRQCi0uQiBcLVwtc3RyaXBcLWRlYnVnCi1SZW1vdmUgZGVidWdnaW5nIHN5bWJvbHMgb25seS4KLQotLlRQCi0uQiBcLVwtc3RyaXBcLXVubmVlZGVkCi1TdHJpcCBhbGwgc3ltYm9scyB0aGF0IGFyZSBub3QgbmVlZGVkIGZvciByZWxvY2F0aW9uIHByb2Nlc3NpbmcuCi0KLS5UUAotLkIgXC1OIFxmSXN5bWJvbG5hbWVcZlIKLS5UUAotLkIgXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotUmVtb3ZlIHN5bWJvbCBcZklzeW1ib2xuYW1lXGZQIGZyb20gdGhlIHNvdXJjZSBmaWxlLiBUaGlzIG9wdGlvbgotbWF5IGJlIGdpdmVuIG1vcmUgdGhhbiBvbmNlLCBhbmQgbWF5IGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgc3RyaXAKLW9wdGlvbnMuCi0KLS5UUAotLkIgXC1vIFxmSWZpbGVcZlIKLVB1dCB0aGUgc3RyaXBwZWQgb3V0cHV0IGluIFxmSWZpbGVcZlIsIHJhdGhlciB0aGFuIHJlcGxhY2luZyB0aGUKLWV4aXN0aW5nIGZpbGUuICBXaGVuIHRoaXMgYXJndW1lbnQgaXMgdXNlZCwgb25seSBvbmUgXGZJb2JqZmlsZVxmUgotYXJndW1lbnQgbWF5IGJlIHNwZWNpZmllZC4KLQotLlRQCi0uQiBcLXAKLS5UUAotLkIgXC1cLXByZXNlcnZlLWRhdGVzCi1QcmVzZXJ2ZSB0aGUgYWNjZXNzIGFuZCBtb2RpZmljYXRpb24gZGF0ZXMgb2YgdGhlIGZpbGUuCi0KLS5UUAotLkIgXC14Ci0uVFAKLS5CIFwtXC1kaXNjYXJkXC1hbGwKLVJlbW92ZSBub24tZ2xvYmFsIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1YCi0uVFAKLS5CIFwtXC1kaXNjYXJkXC1sb2NhbHMKLVJlbW92ZSBjb21waWxlci1nZW5lcmF0ZWQgbG9jYWwgc3ltYm9scy4KLShUaGVzZSB1c3VhbGx5IHN0YXJ0IHdpdGggYGBMJycgb3IgYGAuJycuKQotCi0uVFAKLS5CIFwtSyBcZklzeW1ib2xuYW1lXGZSLCBcZkJcLVwta2VlcFwtc3ltYm9sPVxmSXN5bWJvbG5hbWUKLUNvcHkgb25seSBzeW1ib2wgXGZJc3ltYm9sbmFtZVxmUCBmcm9tIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBvcHRpb24KLW1heSBiZSBnaXZlbiBtb3JlIHRoYW4gb25jZS4KLQotLlRQCi0uQiBcLU4gXGZJc3ltYm9sbmFtZVxmUiwgXGZCXC1cLXN0cmlwXC1zeW1ib2w9XGZJc3ltYm9sbmFtZQotRG8gbm90IGNvcHkgc3ltYm9sIFxmSXN5bWJvbG5hbWVcZlAgZnJvbSB0aGUgc291cmNlIGZpbGUuIFRoaXMgb3B0aW9uCi1tYXkgYmUgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGFuZCBtYXkgYmUgY29tYmluZWQgd2l0aCBzdHJpcCBvcHRpb25zCi1vdGhlciB0aGFuIFxmQlwtS1xmUi4KLQotLlRQCi0uQiBcLXYKLS5UUAotLkIgXC1cLXZlcmJvc2UKLVZlcmJvc2Ugb3V0cHV0OiBsaXN0IGFsbCBvYmplY3QgZmlsZXMgbW9kaWZpZWQuICBJbiB0aGUgY2FzZSBvZgotYXJjaGl2ZXMsCi0uQiAic3RyaXAgXC12IgotbGlzdHMgYWxsIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUuCi0KLS5UUAotLkIgXC1WCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1TaG93IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGZCc3RyaXBcZlAgYW5kIGV4aXQuCi0KLS5TSCAiU0VFIEFMU08iCi0uUkIgImBcfCIgYmludXRpbHMgIlx8JyIgCi1lbnRyeSBpbiAKLS5CUiBpbmZvIDsKLS5JUiAiVGhlIEdOVSBCaW5hcnkgVXRpbGl0aWVzIiAsCi1Sb2xhbmQgSC4gUGVzY2ggKE9jdG9iZXIgMTk5MSkuCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2R1bXAuYyBiL2JpbnV0aWxzL3N5c2R1bXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgyMWU4Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNkdW1wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OTAgKzAsMCBAQAotLyogU3lzcm9mZiBvYmplY3QgZm9ybWF0IGR1bXBlci4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPi4KLQotIFRoaXMgcHJvZ3JhbSByZWFkcyBhIFNZU1JPRkYgb2JqZWN0IGZpbGUgYW5kIHByaW50cyBpdCBpbiBhbgotIGFsbW9zdCBodW1hbiByZWFkYWJsZSBmb3JtIHRvIHN0ZG91dC4gKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotI2luY2x1ZGUgPGdldG9wdC5oPgotI2luY2x1ZGUgInN5c3JvZmYuaCIKLQotI2RlZmluZSBQUk9HUkFNX1ZFUlNJT04gIjEuMCIKLQotc3RhdGljIGludCBkdW1wID0gMTsKLXN0YXRpYyBpbnQgc2VnbWVudGVkX3A7Ci1zdGF0aWMgaW50IGNvZGU7Ci1zdGF0aWMgaW50IGFkZHJzaXplID0gNDsKLXN0YXRpYyBGSUxFICpmaWxlOwotCi1jaGFyICoKLWdldENIQVJTIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgaW50IG9jID0gKmlkeCAvIDg7Ci0gIGNoYXIgKnI7Ci0gIGludCBiID0gc2l6ZTsKLSAgaWYgKGIgPj0gbWF4KQotICAgIHsKLSAgICAgIHJldHVybiAiKnVuZGVmaW5lZCoiOwotICAgIH0KLQotICBpZiAoYiA9PSAwKQotICAgIHsKLSAgICAgIC8qIEdvdCB0byB3b3JrIG91dCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgZnJvbSBzZWxmICovCi0gICAgICBiID0gcHRyW29jKytdOwotICAgICAgKCppZHgpICs9IDg7Ci0gICAgfQotCi0gICppZHggKz0gYiAqIDg7Ci0gIHIgPSB4Y2FsbG9jIChiICsgMSwgMSk7Ci0gIG1lbWNweSAociwgcHRyICsgb2MsIGIpOwotICByW2JdID0gMDsKLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kaCAocHRyLCBzaXplKQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCBzaXplOwotewotICBpbnQgaTsKLSAgaW50IGo7Ci0gIGludCBzcGFuID0gMTY7Ci0KLSAgcHJpbnRmICgiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpICs9IHNwYW4pCi0gICAgewotICAgICAgZm9yIChqID0gMDsgaiA8IHNwYW47IGorKykKLQl7Ci0JICBpZiAoaiArIGkgPCBzaXplKSAKLQkgICAgcHJpbnRmICgiJTAyeCAiLCBwdHJbaSArIGpdKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwcmludGYgKCIgICAiKTsKLQl9Ci0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBzcGFuICYmIGogKyBpIDwgc2l6ZTsgaisrKQotCXsKLQkgIGludCBjID0gcHRyW2kgKyBqXTsKLQkgIGlmIChjIDwgMzIgfHwgYyA+IDEyNykKLQkgICAgYyA9ICcuJzsKLQkgIHByaW50ZiAoIiVjIiwgYyk7Ci0JfQotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci19Ci0KLWludAotZmlsbHVwIChwdHIpCi0gICAgIGNoYXIgKnB0cjsKLXsKLSAgaW50IHNpemU7Ci0gIGludCBzdW07Ci0gIGludCBpOwotICBzaXplID0gZ2V0YyAoZmlsZSkgLSAyOwotICBmcmVhZCAocHRyLCAxLCBzaXplLCBmaWxlKTsKLSAgc3VtID0gY29kZSArIHNpemUgKyAyOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHN1bSArPSBwdHJbaV07Ci0gICAgfQotCi0gIGlmICgoc3VtICYgMHhmZikgIT0gMHhmZikKLSAgICB7Ci0gICAgICBwcmludGYgKCJTVU0gSVMgJXhcbiIsIHN1bSk7Ci0gICAgfQotICBpZiAoZHVtcCkKLSAgICBkaCAocHRyLCBzaXplKTsKLQotICByZXR1cm4gc2l6ZSAtIDE7Ci19Ci0KLWJhcnJheQotZ2V0QkFSUkFZIChwdHIsIGlkeCwgZHNpemUsIG1heCkKLSAgICAgdW5zaWduZWQgY2hhciAqcHRyOwotICAgICBpbnQgKmlkeDsKLSAgICAgaW50IGRzaXplOwotICAgICBpbnQgbWF4OwotewotICBiYXJyYXkgcmVzOwotICBpbnQgaTsKLSAgaW50IGJ5dGUgPSAqaWR4IC8gODsKLSAgaW50IHNpemUgPSBwdHJbYnl0ZSsrXTsKLSAgcmVzLmxlbiA9IHNpemU7Ci0gIHJlcy5kYXRhID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoc2l6ZSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgcmVzLmRhdGFbaV0gPSBwdHJbYnl0ZSsrXTsKLSAgICB9Ci0gIHJldHVybiByZXM7Ci19Ci0KLWludAotZ2V0SU5UIChwdHIsIGlkeCwgc2l6ZSwgbWF4KQotICAgICB1bnNpZ25lZCBjaGFyICpwdHI7Ci0gICAgIGludCAqaWR4OwotICAgICBpbnQgc2l6ZTsKLSAgICAgaW50IG1heDsKLXsKLSAgaW50IG4gPSAwOwotICBpbnQgYnl0ZSA9ICppZHggLyA4OwotCi0gIGlmIChieXRlID49IG1heCkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChzaXplID09IC0yKQotICAgIHNpemUgPSBhZGRyc2l6ZTsKLSAgaWYgKHNpemUgPT0gLTEpCi0gICAgc2l6ZSA9IDA7Ci0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSAxOgotICAgICAgbiA9IChwdHJbYnl0ZV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbiA9IChwdHJbYnl0ZSArIDBdIDw8IDgpICsgcHRyW2J5dGUgKyAxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG4gPSAocHRyW2J5dGUgKyAwXSA8PCAyNCkgKyAocHRyW2J5dGUgKyAxXSA8PCAxNikgKyAocHRyW2J5dGUgKyAyXSA8PCA4KSArIChwdHJbYnl0ZSArIDNdKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gICppZHggKz0gc2l6ZSAqIDg7Ci0gIHJldHVybiBuOwotfQotCi1pbnQKLWdldEJJVFMgKHB0ciwgaWR4LCBzaXplLCBtYXgpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgaW50ICppZHg7Ci0gICAgIGludCBzaXplLCBtYXg7Ci17Ci0gIGludCBieXRlID0gKmlkeCAvIDg7Ci0gIGludCBiaXQgPSAqaWR4ICUgODsKLQotICBpZiAoYnl0ZSA+PSBtYXgpCi0gICAgcmV0dXJuIDA7Ci0KLSAgKmlkeCArPSBzaXplOwotCi0gIHJldHVybiAocHRyW2J5dGVdID4+ICg4IC0gYml0IC0gc2l6ZSkpICYgKCgxIDw8IHNpemUpIC0gMSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pdGhlYWRlciAobmFtZSwgY29kZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGNvZGU7Ci17Ci0gIHByaW50ZiAoIlxuJXMgMHglMDJ4XG4iLCBuYW1lLCBjb2RlKTsKLX0KLQotc3RhdGljIGludCBpbmRlbnQ7Ci1zdGF0aWMgdm9pZAotcCAoKQotewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoInwgIik7Ci0gICAgfQotICBwcmludGYgKCI+ICIpOwotfQotCi1zdGF0aWMgdm9pZAotdGFib3V0ICgpCi17Ci0gIHAgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYmFycmF5ICh5KQotICAgICBiYXJyYXkgKnk7Ci17Ci0gIGludCB4OwotICBwcmludGYgKCIlZCAoIiwgeS0+bGVuKTsKLSAgZm9yICh4ID0gMDsgeCA8IHktPmxlbjsgeCsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiglMDJ4ICVjKSIsIHktPmRhdGFbeF0sIGlzcHJpbnQgKHktPmRhdGFbeF0pID8geS0+ZGF0YVt4XSA6ICcuJyk7Ci0gICAgfQotICBwcmludGYgKCIpXG4iKTsKLX0KLQotI2RlZmluZSBTWVNST0ZGX1BSSU5UCi0jZGVmaW5lIFNZU1JPRkZfU1dBUF9JTgotCi0jaW5jbHVkZSAic3lzcm9mZi5jIgotCi0vKiAKLSAqIEZJWE1FOiBzeXNpbmZvLCB3aGljaCBnZW5lcmF0ZXMgc3lzcm9mZi5bY2hdIGZyb20gc3lzcm9mZi5pbmZvLCBjYW4ndAotICogaGFjayB0aGUgc3BlY2lhbCBjYXNlIG9mIHRoZSB0ciBibG9jaywgd2hpY2ggaGFzIG5vIGNvbnRlbnRzLiAgU28gd2UKLSAqIGltcGxlbWVudCBvdXIgb3duIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBpbiBhbmQgcHJpbnRpbmcgb3V0IHRoZSB0cgotICogYmxvY2suCi0gKi8KLQotI2RlZmluZSBJVF90cl9DT0RFCTB4N2YKLXZvaWQKLXN5c3JvZmZfc3dhcF90cl9pbigpCi17Ci0JY2hhciByYXdbMjU1XTsKLQotCW1lbXNldChyYXcsIDAsIDI1NSk7Ci0JZmlsbHVwKHJhdyk7Ci19Ci0KLXZvaWQKLXN5c3JvZmZfcHJpbnRfdHJfb3V0KCkKLXsKLQlpdGhlYWRlcigidHIiLCBJVF90cl9DT0RFKTsKLX0KLQotc3RhdGljIGludAotZ2V0b25lICh0eXBlKQotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IGMgPSBnZXRjIChmaWxlKTsKLSAgY29kZSA9IGM7Ci0KLSAgaWYgKChjICYgMHg3ZikgIT0gdHlwZSkKLSAgICB7Ci0gICAgICB1bmdldGMgKGMsIGZpbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHN3aXRjaCAoYyAmIDB4N2YpCi0gICAgewotICAgIGNhc2UgSVRfY3NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfY3MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2NzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfY3Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9kbG5fQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZGxuIGR1bW15OwotCXN5c3JvZmZfc3dhcF9kbG5faW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9kbG5fb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9oZF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9oZCBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfaGRfaW4gKCZkdW1teSk7Ci0JYWRkcnNpemUgPSBkdW1teS5hZmw7Ci0Jc3lzcm9mZl9wcmludF9oZF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rhcl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kYXIgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rhcl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rhcl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RzeV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc3kgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RzeV9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RzeV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RmcF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZnAgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RmcF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RmcF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rzb19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc28gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rzb19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rzb19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RwdF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kcHQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RwdF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RwdF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rlbl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZW4gZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rlbl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rlbl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2RidF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kYnQgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2RidF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2RidF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R0eV9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdHkgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R0eV9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R0eV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3VuX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3VuIGR1bW15OwotCXN5c3JvZmZfc3dhcF91bl9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3VuX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfc2NfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfc2MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3NjX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfc2Nfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9lcl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9lciBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZXJfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9lcl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2VkX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2VkIGR1bW15OwotCXN5c3JvZmZfc3dhcF9lZF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2VkX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfc2hfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfc2ggZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX3NoX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfc2hfb3V0ICgmZHVtbXkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJVF9vYl9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9vYiBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfb2JfaW4gKCZkdW1teSk7Ci0Jc3lzcm9mZl9wcmludF9vYl9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX3JsX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX3JsIGR1bW15OwotCXN5c3JvZmZfc3dhcF9ybF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X3JsX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHVfQ09ERToKLSAgICAgIHsKLQlzdHJ1Y3QgSVRfZHUgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1X2luICgmZHVtbXkpOwotCi0Jc3lzcm9mZl9wcmludF9kdV9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1c19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdXMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1c19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R1c19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2R1bF9DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kdWwgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2R1bF9pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2R1bF9vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rzc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kc3MgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rzc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rzc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2hzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2hzIGR1bW15OwotCXN5c3JvZmZfc3dhcF9oc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2hzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfZHBzX0NPREU6Ci0gICAgICB7Ci0Jc3RydWN0IElUX2RwcyBkdW1teTsKLQlzeXNyb2ZmX3N3YXBfZHBzX2luICgmZHVtbXkpOwotCXN5c3JvZmZfcHJpbnRfZHBzX291dCAoJmR1bW15KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSVRfdHJfQ09ERToKLSAgICAgIHsKLQlzeXNyb2ZmX3N3YXBfdHJfaW4gKCk7Ci0Jc3lzcm9mZl9wcmludF90cl9vdXQgKCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElUX2Rkc19DT0RFOgotICAgICAgewotCXN0cnVjdCBJVF9kZHMgZHVtbXk7Ci0Jc3lzcm9mZl9zd2FwX2Rkc19pbiAoJmR1bW15KTsKLQlzeXNyb2ZmX3ByaW50X2Rkc19vdXQgKCZkdW1teSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRmICgiR09UIEEgJXhcbiIsIGMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1vcHQgKHgpCi0gICAgIGludCB4OwotewotICByZXR1cm4gZ2V0b25lICh4KTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi11bml0X2luZm9fbGlzdCAoKQotewotICB3aGlsZSAob3B0IChJVF91bl9DT0RFKSkKLSAgICB7Ci0gICAgICBnZXRvbmUgKElUX3VzX0NPREUpOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9zY19DT0RFKSkKLQlnZXRvbmUgKElUX3NzX0NPREUpOwotCi0gICAgICB3aGlsZSAoZ2V0b25lIChJVF9lcl9DT0RFKSkKLQk7Ci0KLSAgICAgIHdoaWxlIChnZXRvbmUgKElUX2VkX0NPREUpKQotCTsKLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0jaWYgMAotCi0vKiBUaGlzIGlzIG5vIGxvbmdlciB1c2VkLiAgKi8KLQotc3RhdGljIHZvaWQKLW9iamVjdF9ib2R5X2xpc3QgKCkKLXsKLSAgd2hpbGUgKGdldG9uZSAoSVRfc2hfQ09ERSkpCi0gICAgewotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfb2JfQ09ERSkpCi0JOwotICAgICAgd2hpbGUgKGdldG9uZSAoSVRfcmxfQ09ERSkpCi0JOwotICAgIH0KLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1tdXN0ICh4KQotICAgICBpbnQgeDsKLXsKLSAgaWYgKCFnZXRvbmUgKHgpKQotICAgIHsKLSAgICAgIHByaW50ZiAoIldBTlRFRCAleCEhXG4iLCB4KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWIgKGksIHMpCi0gICAgIGludCBpOwotICAgICBjaGFyICpzOwotewotICBpbmRlbnQgKz0gaTsKLSAgaWYgKHMpCi0gICAgewotICAgICAgcCAoKTsKLSAgICAgIHByaW50ZiAocyk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZGVyaXZlZF90eXBlICgpOwotCi1zdGF0aWMgdm9pZAotZHVtcF9zeW1ib2xfaW5mbyAoKQotewotICB0YWIgKDEsICJTWU1CT0wgSU5GTyIpOwotICB3aGlsZSAob3B0IChJVF9kc3lfQ09ERSkpCi0gICAgewotICAgICAgaWYgKG9wdCAoSVRfZHR5X0NPREUpKQotCXsKLQkgIG11c3QgKElUX2RidF9DT0RFKTsKLQkgIGRlcml2ZWRfdHlwZSAoKTsKLQkgIG11c3QgKElUX2R0eV9DT0RFKTsKLQl9Ci0gICAgfQotICB0YWIgKC0xLCAiIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZXJpdmVkX3R5cGUgKCkKLXsKLSAgdGFiICgxLCAiREVSSVZFRCBUWVBFIik7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmIChvcHQgKElUX2RwcF9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZHBwX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGZwX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZnBfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kZW5fQ09ERSkpCi0JewotCSAgZHVtcF9zeW1ib2xfaW5mbyAoKTsKLQkgIG11c3QgKElUX2Rlbl9DT0RFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2Rlbl9DT0RFKSkKLQl7Ci0JICBkdW1wX3N5bWJvbF9pbmZvICgpOwotCSAgbXVzdCAoSVRfZGVuX0NPREUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZGRzX0NPREUpKQotCXsKLQkgIGR1bXBfc3ltYm9sX2luZm8gKCk7Ci0JICBtdXN0IChJVF9kZHNfQ09ERSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kYXJfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZHB0X0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlIGlmIChvcHQgKElUX2R1bF9DT0RFKSkKLQl7Ci0JfQotICAgICAgZWxzZSBpZiAob3B0IChJVF9kc2VfQ09ERSkpCi0JewotCX0KLSAgICAgIGVsc2UgaWYgKG9wdCAoSVRfZG90X0NPREUpKQotCXsKLQl9Ci0gICAgICBlbHNlCi0JYnJlYWs7Ci0gICAgfQotCi0gIHRhYiAoLTEsICIiKTsKLX0KLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9ncmFtX3N0cnVjdHVyZSAoKQotewotICB0YWIgKDEsICJQUk9HUkFNIFNUUlVDVFVSRSIpOwotICB3aGlsZSAob3B0IChJVF9kcHNfQ09ERSkpCi0gICAgewotICAgICAgbXVzdCAoSVRfZHNvX0NPREUpOwotICAgICAgb3B0IChJVF9kc3NfQ09ERSk7Ci0gICAgICBkdW1wX3N5bWJvbF9pbmZvICgpOwotICAgICAgbXVzdCAoSVRfZHBzX0NPREUpOwotICAgIH0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jZW5kaWYKLQotI2lmIDAKLQotLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19saXN0ICgpCi17Ci0gIHRhYiAoMSwgIkRFQlVHIExJU1QiKTsKLQotICBtdXN0IChJVF9kdV9DT0RFKTsKLSAgb3B0IChJVF9kdXNfQ09ERSk7Ci0gIHByb2dyYW1fc3RydWN0dXJlICgpOwotICBtdXN0IChJVF9kbG5fQ09ERSk7Ci0KLSAgdGFiICgtMSwgIiIpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLW1vZHVsZSAoKQotewotICBpbnQgYyA9IDA7Ci0gIGludCBsID0gMDsKLQotICB0YWIgKDEsICJNT0RVTEUqKipcbiIpOwotCi0gIGRvCi0gICAgewotICAgICAgYyA9IGdldGMgKGZpbGUpOwotICAgICAgdW5nZXRjIChjLCBmaWxlKTsKLQotICAgICAgYyAmPSAweDdmOwotICAgIH0KLSAgd2hpbGUgKGdldG9uZSAoYykgJiYgYyAhPSBJVF90cl9DT0RFKTsKLQotI2lmIDAKLSAgbXVzdCAoSVRfY3NfQ09ERSk7Ci0gIG11c3QgKElUX2hkX0NPREUpOwotICBvcHQgKElUX2hzX0NPREUpOwotCi0gIHVuaXRfaW5mb19saXN0ICgpOwotICBvYmplY3RfYm9keV9saXN0ICgpOwotICBkZWJ1Z19saXN0ICgpOwotCi0gIG11c3QgKElUX3RyX0NPREUpOwotI2VuZGlmCi0gIHRhYiAoLTEsICIiKTsKLQotICBjID0gZ2V0YyAoZmlsZSk7Ci0gIHdoaWxlIChjICE9IEVPRikKLSAgICB7Ci0gICAgICBwcmludGYgKCIlMDJ4ICIsIGMpOwotICAgICAgbCsrOwotICAgICAgaWYgKGwgPT0gMzIpCi0JewotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGwgPSAwOwotCX0KLSAgICAgIGMgPSBnZXRjIChmaWxlKTsKLSAgICB9Ci19Ci0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiVXNhZ2U6ICVzIFstaFZdIGluLWZpbGVcbiIpLCBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZAotc2hvd19oZWxwICgpCi17Ci0gIHByaW50ZiAoXygiJXM6IFByaW50IGEgaHVtYW4gcmVhZGFibGUgaW50ZXJwcmV0YXRpb24gb2YgYSBTWVNST0ZGIG9iamVjdCBmaWxlXG4iKSwKLQkgIHByb2dyYW1fbmFtZSk7Ci0gIHNob3dfdXNhZ2UgKHN0ZG91dCwgMCk7Ci19Ci0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgY2hhciAqaW5wdXRfZmlsZSA9IE5VTEw7Ci0gIGludCBvcHQ7Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLSAgewotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCAnaCd9LAotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAnVid9LAotICAgIHtOVUxMLCBub19hcmd1bWVudCwgMCwgMH0KLSAgfTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGF2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyAoYWMsIGF2LCAiaFYiLCBsb25nX29wdGlvbnMsIChpbnQgKikgTlVMTCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wdCkKLQl7Ci0JY2FzZSAnaCc6Ci0JICBzaG93X2hlbHAgKCk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCWNhc2UgJ1YnOgotCSAgcHJpbnRmIChfKCJHTlUgJXMgdmVyc2lvbiAlc1xuIiksIHByb2dyYW1fbmFtZSwgUFJPR1JBTV9WRVJTSU9OKTsKLQkgIGV4aXQgKDApOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlIDA6Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc2hvd191c2FnZSAoc3RkZXJyLCAxKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JfQotICAgIH0KLQotICAvKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBmaWxlcyBtYXkgYmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gICovCi0KLSAgaWYgKG9wdGluZCA8IGFjKQotICAgIHsKLSAgICAgIGlucHV0X2ZpbGUgPSBhdltvcHRpbmRdOwotICAgIH0KLQotICBpZiAoIWlucHV0X2ZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpLAotCSAgICAgICBwcm9ncmFtX25hbWUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGZpbGUgPSBmb3BlbiAoaW5wdXRfZmlsZSwgRk9QRU5fUkIpOwotICBpZiAoIWZpbGUpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiksCi0JICAgICAgIHByb2dyYW1fbmFtZSwgaW5wdXRfZmlsZSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgbW9kdWxlICgpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c2luZm8ueSBiL2JpbnV0aWxzL3N5c2luZm8ueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhODczNy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNpbmZvLnkKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotJXsKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1leHRlcm4gY2hhciAqd29yZDsKLWV4dGVybiBjaGFyIHdyaXRlY29kZTsKLWV4dGVybiBpbnQgbnVtYmVyOwotZXh0ZXJuIGludCB1bml0OwotY2hhciBuaWNlX25hbWVbMTAwMF07Ci1jaGFyICppdDsKLWludCBzb2ZhcjsKLWludCB3aWR0aDsKLWludCBjb2RlOwotY2hhciAqIHJlcGVhdDsKLWNoYXIgKm9sZHJlcGVhdDsKLWNoYXIgKm5hbWU7Ci1pbnQgcmRlcHRoOwotY2hhciAqbG9vcCBbXSA9IHsiIiwibiIsIm0iLCIvKkJBRCovIn07Ci1jaGFyICpuYW1lc1tdID0geyIgIiwiW25dIiwiW25dW21dIn07Ci1jaGFyICpwbmFtZXNbXT0geyIiLCIqIiwiKioifTsKLSV9Ci0KLQotJXVuaW9uIHsKLSBpbnQgaTsKLSBjaGFyICpzOwotfSAKLSV0b2tlbiBDT05ECi0ldG9rZW4gUkVQRUFUCi0ldG9rZW4gJygnICcpJwotJXRva2VuIDxzPiBUWVBFCi0ldG9rZW4gPHM+IE5BTUUKLSV0b2tlbiA8aT4gTlVNQkVSIFVOSVQKLSV0eXBlIDxpPiBhdHRyX3NpemUgCi0ldHlwZSA8cz4gYXR0cl9kZXNjIGF0dHJfaWQgYXR0cl90eXBlCi0lJQotCi10b3A6ICB7Ci0gIHN3aXRjaCAod3JpdGVjb2RlKQotICAgIHsKLSAgICBjYXNlICdpJzoKLSAgICAgIHByaW50ZigiI2lmZGVmIFNZU1JPRkZfU1dBUF9JTlxuIik7Ci0gICAgICBicmVhazsgCi0gICAgY2FzZSAncCc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX3BcbiIpOwotICAgICAgYnJlYWs7IAotICAgIGNhc2UgJ2QnOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZyc6Ci0gICAgICBwcmludGYoIiNpZmRlZiBTWVNST0ZGX1NXQVBfT1VUXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgICAgcHJpbnRmKCIjaWZkZWYgU1lTUk9GRl9QUklOVFxuIik7Ci0gICAgICBwcmludGYoIiNpbmNsdWRlIDxzdGRpby5oPlxuIik7Ci0gICAgICBwcmludGYoIiNpbmNsdWRlIDxzdGRsaWIuaD5cbiIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotIH0gCi1pdF9saXN0IHsKLSAgc3dpdGNoICh3cml0ZWNvZGUpIHsKLSAgY2FzZSAnaSc6Ci0gIGNhc2UgJ3AnOgotICBjYXNlICdnJzoKLSAgY2FzZSAnYyc6Ci0gICAgcHJpbnRmKCIjZW5kaWZcbiIpOwotICAgIGJyZWFrOyAKLSAgY2FzZSAnZCc6Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotICA7Ci0KLQotaXRfbGlzdDogaXQgaXRfbGlzdAotICB8Ci0gIDsKLQotaXQ6Ci0JJygnIE5BTUUgTlVNQkVSIAotICAgICAgewotCWl0ID0gJDI7IGNvZGUgPSAkMzsKLQlzd2l0Y2ggKHdyaXRlY29kZSkgCi0JICB7Ci0JICBjYXNlICdkJzoKLQkgICAgcHJpbnRmKCJcblxuXG4jZGVmaW5lIElUXyVzX0NPREUgMHgleFxuIiwgaXQsY29kZSk7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzIHsgXG4iLCBpdCk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnaSc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfaW4ocHRyKVxuIiwkMik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLCBpdCk7Ci0JICAgIHByaW50Zigie1xuIik7Ci0JICAgIHByaW50ZigiY2hhciByYXdbMjU1XTtcbiIpOwotCSAgICBwcmludGYoIlx0aW50IGlkeCA9IDAgO1xuIik7Ci0JICAgIHByaW50ZigiXHRpbnQgc2l6ZTtcbiIpOwotCSAgICBwcmludGYoIm1lbXNldChyYXcsMCwyNTUpO1xuIik7CQotCSAgICBwcmludGYoIm1lbXNldChwdHIsMCxzaXplb2YoKnB0cikpO1xuIik7Ci0JICAgIHByaW50Zigic2l6ZSA9IGZpbGx1cChyYXcpO1xuIik7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnZyc6Ci0JICAgIHByaW50Zigidm9pZCBzeXNyb2ZmX3N3YXBfJXNfb3V0KGZpbGUscHRyKVxuIiwkMik7Ci0JICAgIHByaW50ZigiRklMRSAqIGZpbGU7XG4iKTsKLQkgICAgcHJpbnRmKCJzdHJ1Y3QgSVRfJXMgKnB0cjtcbiIsIGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJcdGNoYXIgcmF3WzI1NV07XG4iKTsKLQkgICAgcHJpbnRmKCJcdGludCBpZHggPSAxNiA7XG4iKTsKLQkgICAgcHJpbnRmKCJcdG1lbXNldCAocmF3LCAwLCAyNTUpO1xuIik7Ci0JICAgIHByaW50ZigiXHRjb2RlID0gSVRfJXNfQ09ERTtcbiIsIGl0KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdvJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfc3dhcF8lc19vdXQoYWJmZCxwdHIpXG4iLCQyKTsKLQkgICAgcHJpbnRmKCJiZmQgKiBhYmZkO1xuIik7Ci0JICAgIHByaW50Zigic3RydWN0IElUXyVzICpwdHI7XG4iLGl0KTsKLQkgICAgcHJpbnRmKCJ7XG4iKTsKLQkgICAgcHJpbnRmKCJpbnQgaWR4ID0gMCA7XG4iKTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdjJzoKLQkgICAgcHJpbnRmKCJ2b2lkIHN5c3JvZmZfcHJpbnRfJXNfb3V0KHB0cilcbiIsJDIpOwotCSAgICBwcmludGYoInN0cnVjdCBJVF8lcyAqcHRyO1xuIiwgaXQpOwotCSAgICBwcmludGYoIntcbiIpOwotCSAgICBwcmludGYoIml0aGVhZGVyKFwiJXNcIiwgSVRfJXNfQ09ERSk7XG4iLCQyLCQyKTsKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgJ3QnOgotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgfSAKLQlpdF9maWVsZF9saXN0IAotJyknCi17Ci0gIHN3aXRjaCAod3JpdGVjb2RlKSB7Ci0gIGNhc2UgJ2QnOiAKLSAgICBwcmludGYoIn07XG4iKTsKLSAgICBicmVhazsKLSAgY2FzZSAnZyc6Ci0gICAgcHJpbnRmKCJcdGNoZWNrc3VtKGZpbGUscmF3LCBpZHgsIElUXyVzX0NPREUpO1xuIiwgaXQpOwotICAgIAotICBjYXNlICdpJzoKLQotICBjYXNlICdvJzoKLSAgY2FzZSAnYyc6Ci0gICAgcHJpbnRmKCJ9XG4iKTsKLSAgfQotfQotOwotCi0KLQotaXRfZmllbGRfbGlzdDoKLQkJaXRfZmllbGQgaXRfZmllbGRfbGlzdAotCXwJY29uZF9pdF9maWVsZCBpdF9maWVsZF9saXN0CQotCXwJcmVwZWF0X2l0X2ZpZWxkIGl0X2ZpZWxkX2xpc3QKLQl8Ci0JOwotCi1yZXBlYXRfaXRfZmllbGQ6ICcoJyBSRVBFQVQgTkFNRQotCXsKLQkgIHJkZXB0aCsrOwotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIGlmIChyZGVwdGg9PTEpCi0JICAgICAgcHJpbnRmKCJcdHByaW50ZihcInJlcGVhdCAlJWRcXG5cIiwgJXMpO1xuIiwkMyk7Ci0JICAgICAgaWYgKHJkZXB0aD09MikKLQkgICAgICBwcmludGYoIlx0cHJpbnRmKFwicmVwZWF0ICUlZFxcblwiLCAlc1tuXSk7XG4iLCQzKTsKLQkgICAgY2FzZSAnaSc6Ci0JICAgIGNhc2UgJ2cnOgotCSAgICBjYXNlICdvJzoKLQotCSAgICAgIGlmIChyZGVwdGg9PTEpIAotCQl7Ci0JICAgICAgcHJpbnRmKCJcdHsgaW50IG47IGZvciAobiA9IDA7IG4gPCAlczsgbisrKSB7XG4iLCAgICAkMyk7Ci0JICAgIH0KLQkgICAgICBpZiAocmRlcHRoID09IDIpIHsKLQkgICAgICBwcmludGYoIlx0eyBpbnQgbTsgZm9yIChtID0gMDsgbSA8ICVzW25dOyBtKyspIHtcbiIsICAgICQzKTsKLQkgICAgfQkJCi0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBvbGRyZXBlYXQgPSByZXBlYXQ7Ci0gICAgICAgICByZXBlYXQgPSAkMzsKLQl9Ci0KLQkgaXRfZmllbGRfbGlzdCAnKScgCi0KLQl7Ci0JICByZXBlYXQgPSBvbGRyZXBlYXQ7Ci0JICBvbGRyZXBlYXQgPTA7Ci0JICByZGVwdGgtLTsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgcHJpbnRmKCJcdH19XG4iKTsKLQl9Ci0JfQotICAgICAgIDsKLQotCi1jb25kX2l0X2ZpZWxkOiAnKCcgQ09ORCBOQU1FCi0JewotCSAgc3dpdGNoICh3cml0ZWNvZGUpIAotCSAgICB7Ci0JICAgIGNhc2UgJ2knOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgIHByaW50ZigiXHRpZiAoJXMpIHtcbiIsICQzKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotCSBpdF9maWVsZF9saXN0ICcpJyAKLQl7Ci0JICBzd2l0Y2ggKHdyaXRlY29kZSkKLQkgICAgewotCSAgICBjYXNlICdpJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgIGNhc2UgJ28nOgotCSAgICBjYXNlICdjJzoKLQkgIHByaW50ZigiXHR9XG4iKTsKLQl9Ci0JfQotICAgICAgIDsKLQotaXRfZmllbGQ6Ci0JJygnIGF0dHJfZGVzYyAnKCcgYXR0cl90eXBlIGF0dHJfc2l6ZSAnKScgYXR0cl9pZCAKLQl7bmFtZSA9ICQ3OyB9IAotCWVudW1zICcpJwotCXsKLQkgIGNoYXIgKmRlc2MgPSAkMjsKLQkgIGNoYXIgKnR5cGUgPSAkNDsKLQkgIGludCBzaXplID0gJDU7Ci0JICBjaGFyICppZCA9ICQ3OwotY2hhciAqcCA9IG5hbWVzW3JkZXB0aF07Ci1jaGFyICpwdHIgPSBwbmFtZXNbcmRlcHRoXTsKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdnJzoKLQkgICAgICBpZiAoc2l6ZSAlIDgpIAotCQl7Ci0JCSAgCi0JCSAgcHJpbnRmKCJcdHdyaXRlQklUUyhwdHItPiVzJXMscmF3LCZpZHgsJWQpO1xuIiwKLQkJCSBpZCwKLQkJCSBuYW1lc1tyZGVwdGhdLCBzaXplKTsKLQotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHR3cml0ZSVzKHB0ci0+JXMlcyxyYXcsJmlkeCwlZCxmaWxlKTtcbiIsCi0JCSAgICAgICB0eXBlLAotCQkgICAgICAgaWQsCi0JCSAgICAgICBuYW1lc1tyZGVwdGhdLHNpemUvOCk7Ci0JCX0KLQkgICAgICBicmVhazsJICAgICAgCi0JICAgIGNhc2UgJ2knOgotCSAgICAgIHsKLQotCQlpZiAocmRlcHRoID49IDEpCi0KLQkJICB7Ci0JCSAgICBwcmludGYoImlmICghcHRyLT4lcykgcHRyLT4lcyA9ICglcyopeGNhbGxvYyglcywgc2l6ZW9mKHB0ci0+JXNbMF0pKTtcbiIsIAotCQkJICAgaWQsIAotCQkJICAgaWQsCi0JCQkgICB0eXBlLAotCQkJICAgcmVwZWF0LAotCQkJICAgaWQpOwotCQkgIH0KLQotCQlpZiAocmRlcHRoID09IDIpCi0JCSAgewotCQkgICAgcHJpbnRmKCJpZiAoIXB0ci0+JXNbbl0pIHB0ci0+JXNbbl0gPSAoJXMqKil4Y2FsbG9jKCVzW25dLCBzaXplb2YocHRyLT4lc1tuXVswXSkpO1xuIiwgCi0JCQkgICBpZCwgCi0JCQkgICBpZCwKLQkJCSAgIHR5cGUsCi0JCQkgICByZXBlYXQsCi0JCQkgICBpZCk7Ci0JCSAgfQotCi0JICAgICAgfQotCi0JICAgICAgaWYgKHNpemUgJSA4KSAKLQkJewotCQkgIHByaW50ZigiXHRwdHItPiVzJXMgPSBnZXRCSVRTKHJhdywmaWR4LCAlZCxzaXplKTtcbiIsCi0JCQkgaWQsCi0JCQkgbmFtZXNbcmRlcHRoXSwgCi0JCQkgc2l6ZSk7Ci0JCX0KLQkgICAgICBlbHNlIHsKLQkJcHJpbnRmKCJcdHB0ci0+JXMlcyA9IGdldCVzKHJhdywmaWR4LCAlZCxzaXplKTtcbiIsCi0JCSAgICAgICBpZCwKLQkJICAgICAgIG5hbWVzW3JkZXB0aF0sCi0JCSAgICAgICB0eXBlLAotCQkgICAgICAgc2l6ZS84KTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdvJzoKLQkgICAgICBwcmludGYoIlx0cHV0JXMocmF3LCVkLCVkLCZpZHgscHRyLT4lcyVzKTtcbiIsIHR5cGUsc2l6ZS84LHNpemUlOCxpZCxuYW1lc1tyZGVwdGhdKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnZCc6Ci0JICAgICAgaWYgKHJlcGVhdCkgCi0JCXByaW50ZigiXHQvKiByZXBlYXQgJXMgKi9cbiIsIHJlcGVhdCk7Ci0KLQkJICBpZiAodHlwZVswXSA9PSAnSScpIHsKLQkJICBwcmludGYoIlx0aW50ICVzJXM7IFx0LyogJXMgKi9cbiIscHRyLGlkLCBkZXNjKTsKLQkJfQotCQkgIGVsc2UgaWYgKHR5cGVbMF0gPT0nQycpIHsKLQkJICBwcmludGYoIlx0Y2hhciAlcyolcztcdCAvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCXByaW50ZigiXHRiYXJyYXkgJXMlcztcdCAvKiAlcyAqL1xuIixwdHIsaWQsIGRlc2MpOwotCSAgICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSAnYyc6Ci0JICAgICAgcHJpbnRmKCJ0YWJvdXQoKTtcbiIpOwotCQkgIHByaW50ZigiXHRwcmludGYoXCIvKiUtMzBzKi8gcHRyLT4lcyA9IFwiKTtcbiIsIGRlc2MsIGlkKTsKLQotCQkgIGlmICh0eXBlWzBdID09ICdJJykKLQkJICBwcmludGYoIlx0cHJpbnRmKFwiJSVkXFxuXCIscHRyLT4lcyVzKTtcbiIsIGlkLHApOwotCQkgIGVsc2UgICBpZiAodHlwZVswXSA9PSAnQycpCi0JCSAgcHJpbnRmKCJcdHByaW50ZihcIiUlc1xcblwiLHB0ci0+JXMlcyk7XG4iLCBpZCxwKTsKLQotCQkgIGVsc2UgICBpZiAodHlwZVswXSA9PSAnQicpIAotCQkgICAgewotCQkgIHByaW50ZigiXHRwYmFycmF5KCZwdHItPiVzJXMpO1xuIiwgaWQscCk7Ci0JCX0KLQkgICAgICBlbHNlIGFib3J0KCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQl9Ci0KLQk7Ci0KLQotYXR0cl90eXBlOgkKLQkgVFlQRSB7ICQkID0gJDE7IH0KLSAJfCAgeyAkJCA9ICJJTlQiO30KLQk7Ci0KLWF0dHJfZGVzYzogCi0JJygnIE5BTUUgJyknCQotCXsgJCQgPSAkMjsgfQotCTsKLQotYXR0cl9zaXplOgotCSBOVU1CRVIgVU5JVCAKLQl7ICQkID0gJDEgKiAkMjsgfQotCTsKLQotCi1hdHRyX2lkOgotCQknKCcgTkFNRSAnKScJeyAkJCA9ICQyOyB9Ci0JfAl7ICQkID0gImR1bW15Ijt9Ci0JOwkKLQkKLWVudW1zOiAKLQl8ICcoJyBlbnVtX2xpc3QgJyknIDsKLQotZW51bV9saXN0OgotCXwKLQllbnVtX2xpc3QgJygnIE5BTUUgTkFNRSAnKScgeyAKLQkgIHN3aXRjaCAod3JpdGVjb2RlKSAKLQkgICAgewotCSAgICBjYXNlICdkJzoKLQkgICAgICBwcmludGYoIiNkZWZpbmUgJXMgJXNcbiIsICQzLCQ0KTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYyc6Ci0JCXByaW50ZigiaWYgKHB0ci0+JXMlcyA9PSAlcykgeyB0YWJvdXQoKTsgcHJpbnRmKFwiJXNcXG5cIik7fVxuIiwgbmFtZSwgbmFtZXNbcmRlcHRoXSwkNCwkMyk7Ci0JICAgIH0KLQl9Ci0KLQk7Ci0KLQotCi0lJQotLyogZm91ciBtb2RlcwotCi0gICAtZCB3cml0ZSBzdHJ1Y3R1cmUgZGVmaW50aW9ucyBmb3Igc3lzcm9mZiBpbiBob3N0IGZvcm1hdAotICAgLWkgd3JpdGUgZnVuY3Rpb25zIHRvIHN3YXAgaW50byBzeXNyb2ZmIGZvcm1hdCBpbgotICAgLW8gd3JpdGUgZnVuY3Rpb25zIHRvIHN3YXAgaW50byBzeXNyb2ZmIGZvcm1hdCBvdXQKLSAgIC1jIHdyaXRlIGNvZGUgdG8gcHJpbnQgaW5mbyBpbiBodW1hbiBmb3JtICovCi0KLWludCB5eWRlYnVnOwotY2hhciB3cml0ZWNvZGU7Ci0KLWludCAKLW1haW4oYWMsYXYpCi1pbnQgYWM7Ci1jaGFyICoqYXY7Ci17Ci0gIHl5ZGVidWc9MDsKLSAgaWYgKGFjID4gMSkKLSAgICB3cml0ZWNvZGUgPSBhdlsxXVsxXTsKLWlmICh3cml0ZWNvZGUgPT0gJ2QnKQotICB7Ci0gICAgcHJpbnRmKCJ0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgKmRhdGE7IGludCBsZW47IH0gYmFycmF5OyBcbiIpOwotICAgIHByaW50ZigidHlwZWRlZiAgaW50IElOVDtcbiIpOwotICAgIHByaW50ZigidHlwZWRlZiAgY2hhciAqIENIQVJTO1xuIik7Ci0KLSAgfQotICB5eXBhcnNlKCk7Ci1yZXR1cm4gMDsKLX0KLQotaW50Ci15eWVycm9yKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIGZwcmludGYoc3RkZXJyLCAiJXNcbiIgLCBzKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy9zeXNsZXgubCBiL2JpbnV0aWxzL3N5c2xleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzk0ODQyLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3N5c2xleC5sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotJXsKLSNpbmNsdWRlICJzeXNpbmZvLmgiCi1jaGFyICp3b3JkOwotaW50IG51bWJlcjsKLWludCB1bml0OwotCi0jaWZuZGVmIHl5d3JhcAotc3RhdGljIGludCB5eXdyYXAgKCkgeyByZXR1cm4gMTsgfQotI2VuZGlmCi0lfQotJSUKLSIoIiB7IHJldHVybiAnKCc7fQotIikiIHsgcmV0dXJuICcpJzt9Ci0iWyIgeyByZXR1cm4gJ1snO30KLSJdIiB7IHJldHVybiAnXSc7fQotIiAiIHsgOyB9Ci0iOyIuKiB7IDsgfSAKLSJcdCIgeyA7IH0KLSJcbiIgeyA7IH0KLSJcIiJbXlwiXSoiXCIiIHsKLXl5bHZhbC5zID0gbWFsbG9jKHN0cmxlbiAoeXl0ZXh0KSk7Ci1zdHJjcHkoeXlsdmFsLnMsIHl5dGV4dCsxKTsKLXl5bHZhbC5zW3N0cmxlbih5eWx2YWwucyktMV0gPSAwOwotICAgICAgICByZXR1cm4gTkFNRTsKLQl9Ci0KLTB4WzAtOWEtZl0rIHsKLSAgICAgICAgeXlsdmFsLmkgPSBzdHJ0b2woeXl0ZXh0LDAsMTYpOwotCXJldHVybiAgTlVNQkVSOwotCX0KLQotWzAtOV0rIHsKLSAgICAgICAgeXlsdmFsLmkgPSBhdG9pKHl5dGV4dCk7Ci0JcmV0dXJuICBOVU1CRVI7Ci0JfQotCi0KLSJiaXRzIiB7IHl5bHZhbC5pID0xIDtyZXR1cm4gVU5JVDt9Ci0iYml0IiB7IHl5bHZhbC5pID0gMTsgcmV0dXJuIFVOSVQ7fQotImJ5dGVzIiB7IHl5bHZhbC5pPSA4OyByZXR1cm4gVU5JVDt9Ci0iYnl0ZSIgeyB5eWx2YWwuaSA9IDg7IHJldHVybiBVTklUO30KLQotImludCIgeyB5eWx2YWwucyA9ICJJTlQiOyByZXR1cm4gVFlQRTt9Ci0iYmFycmF5IiB7IHl5bHZhbC5zID0gIkJBUlJBWSI7IHJldHVybiBUWVBFO30KLSJjaGFycyIgeyB5eWx2YWwucyA9ICJDSEFSUyI7IHJldHVybiBUWVBFO30KLSJ2YXJpYWJsZSIgeyB5eWx2YWwuaSA9IDA7IHJldHVybiBOVU1CRVI7fQotImNvdW50ZWQiIHsgeXlsdmFsLmkgPSAtNDsgcmV0dXJuIE5VTUJFUjt9Ci0iYWRkcnNpemUiIHsgeXlsdmFsLmkgPSAtMjsgcmV0dXJuIE5VTUJFUjsgfQotInNlZ3NpemUiIHsgeXlsdmFsLmkgPSAtMTsgcmV0dXJuIE5VTUJFUjsgfQotImNvbmQiIHsgcmV0dXJuIENPTkQ7fQotInJlcGVhdCIgeyByZXR1cm4gUkVQRUFUO30KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3N5c3JvZmYuaW5mbyBiL2JpbnV0aWxzL3N5c3JvZmYuaW5mbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmMDAxYS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy9zeXNyb2ZmLmluZm8KKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotKCJjcyIgMHgwCi0gKCgic2l6ZSIpICgxIGJ5dGUpICgic2l6ZSIpKQotCi0gKCgiaGQiKSAoMSBieXRlKSAoImhkIikpCi0gKCgiaHMiKSAoMSBieXRlKSAoImhzIikpCi0gKCgidW4iKSAoMSBieXRlKSAoInVuIikpCi0gKCgidXMiKSAoMSBieXRlKSAoInVzIikpCi0KLSAoKCJzYyIpICgxIGJ5dGUpICgic2MiKSkKLSAoKCJzcyIpICgxIGJ5dGUpICgic3MiKSkKLSAoKCJlciIpICgxIGJ5dGUpICgiZXIiKSkKLSAoKCJlZCIpICgxIGJ5dGUpICgiZWQiKSkKLQotICgoInNoIikgKDEgYnl0ZSkgKCJzaCIpKQotICgoIm9iIikgKDEgYnl0ZSkgKCJvYiIpKQotICgoInJsIikgKDEgYnl0ZSkgKCJybCIpKQotICgoImR1IikgKDEgYnl0ZSkgKCJkdSIpKQotCi0gKCgiZHBzIikgKDEgYnl0ZSkgKCJkcHMiKSkKLSAoKCJkc3kiKSAoMSBieXRlKSAoImRzeSIpKQotICgoImR0eSIpICgxIGJ5dGUpICgiZHR5IikpCi0gKCgiZGxuIikgKDEgYnl0ZSkgKCJkbG4iKSkKLQotICgoImRzbyIpICgxIGJ5dGUpICgiZHNvIikpCi0gKCgiZHVzIikgKDEgYnl0ZSkgKCJkdXMiKSkKLSAoKCJkc3MiKSAoMSBieXRlKSAoImRzcyIpKQotICgoImRidCIpICgxIGJ5dGUpICgiZGJ0IikpCi0KLSAoKCJkcHAiKSAoMSBieXRlKSAoImRwcCIpKQotICgoImRmcCIpICgxIGJ5dGUpICgiZGZwIikpCi0gKCgiZGVuIikgKDEgYnl0ZSkgKCJkZW4iKSkKLSAoKCJkZHMiKSAoMSBieXRlKSAoImRkcyIpKQotCi0gKCgiZGFyIikgKDEgYnl0ZSkgKCJkYXIiKSkKLSAoKCJkcHQiKSAoMSBieXRlKSAoImRwdCIpKQotICgoImR1bCIpICgxIGJ5dGUpICgiZHVsIikpCi0gKCgiZHNlIikgKDEgYnl0ZSkgKCJkc2UiKSkKLQotICgoImRvdCIpICgxIGJ5dGUpICgiZG90IikpKQotCi0KLSgiaGQiIDB4MDQKLSAoKCJtb2R1bGUgdHlwZSIpICg0IGJpdHMpICgibXQiKQotICAoKCJNVFlQRV9BQlNfTE0iIAkiMCIpCi0gICAoIk1UWVBFX1JFTF9MTSIgCSIxIikKLSAgICgiTVRZUEVfT01TX09SX0xNUyIgCSIyIikKLSAgICgiTVRZUEVfVU5TUEVDIiAJIjB4ZiIpKSkKLSAoKCJzcGFyZSIpKDQgYml0cykgKCJzcGFyZTEiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikoIGNoYXJzIDEyIGJ5dGVzKSggImNkIikpCi0gKCgibnVtYmVyIG9mIHVuaXRzIikgKDIgYnl0ZXMpICgibnUiKSkKLSAoKCJjb2RlIikgKDEgYnl0ZSkgKCJjb2RlIikpCi0gKCgidmVyc2lvbiIpIChjaGFycyA0IGJ5dGVzKSAoInZlciIpKQotICgoImFkZHJlc3MgdXBkYXRlIikgKDEgYnl0ZSkgKCJhdSIpKQotICgoInNlZ21lbnQgaWRlbnRpZmllciIpICgxIGJpdCkgKCJzaSIpKQotICgoImFkZHJlc3MgZmllbGQgbGVuZ3RoIikgKDQgYml0cykgKCJhZmwiKSkKLSAoKCJzcGFyZSIpKDMgYml0cykgKCJzcGFyZTIiKSkKLSAoKCJzcGFjZSBzaXplIHdpdGhpbiBzZWdtZW50IikgKDEgYnl0ZSkgKCJzcGNzeiIpKQotICgoInNlZ21lbnQgc2l6ZSIpICAJKDEgYnl0ZSkgKCJzZWdzeiIpKQotICgoInNlZ21lbnQgc2hpZnQiKSAJKDEgYnl0ZSkgKCJzZWdzaCIpKQotICgoImVudHJ5IHBvaW50IikgCSgxIGJ5dGUpICgiZXAiKSkKLSAoY29uZCAicHRyLT5lcCIKLSAgICAgICAoY29uZCAicHRyLT5tdCAhPSBNVFlQRV9BQlNfTE0iIAotCSAgICAgKCgidW5pdCBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInVhbiIpKQotCSAgICAgKCgic2VjdGlvbiBhcHBlYXJhbmNlIG51bWJlciIpICgyIGJ5dGVzKSAoInNhIikpKQotICAgICAgIChjb25kICJzZWdtZW50ZWRfcCIKLQkgICAgICgoInNlZ21lbnQgYWRkcmVzcyIpIChzZWdzaXplIGJ5dGVzKSAoInNhZCIpKSkKLSAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gKCgib3MgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJvcyIpKQotICgoInN5cyBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInN5cyIpKQotICgoIm1vZHVsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1uIikpCi0gKCgiY3B1IikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImNwdSIpKSkKLQotCi0oImhzIiAweDA1Ci0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCi0oInVuIiAweDA2Ci0gKCgiZm9ybWF0IikgKDIgYml0cykgKCJmb3JtYXQiKQotICAoKCJGT1JNQVRfTE0iICIwIikKLSAgICgiRk9STUFUX09NIiAiMSIpCi0gICAoIkZPUk1BVF9PTVNfT1JfTE1TIiAiMiIpKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCi0gKCgibnVtYmVyIG9mIHNlY3Rpb25zIikgKDIgYnl0ZXMpICgibnNlY3Rpb25zIikpCi0gKCgibnVtYmVyIG9mIGV4dGVybmFsIHJlZnMiKSAoMiBieXRlcykgKCJuZXh0cmVmcyIpKQotICgoIm51bWJlciBvZiBleHRlcm5hbCBkZWZzIikgKDIgYnl0ZXMpICgibmV4dGRlZnMiKSkKLSAoKCJ1bml0IG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpCi0gKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgidGNkIikpCi0gKCgibGlua2VyIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJsaW5rZXIiKSkKLSAoKCJjcmVhdGlvbiBkYXRlIikgKGNoYXJzIDEyIGJ5dGVzKSAoImxjZCIpKSkKLQotCi0oInVzIiAweDA3Ci0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKQotCi0KLSgic2MiIDB4MDgKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoKCJzZWdtZW50IGFkZHJlc3MiKSAoc2Vnc2l6ZSBieXRlcykgKCJzZWdhZGQiKSkKLSAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKLSAoKCJsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgibGVuZ3RoIikpCi0gKCgiYWxpZ25tZW50IikgKGFkZHJzaXplIGJ5dGVzKSAoImFsaWduIikpCi0gKCgiY29udGVudHMiKSAoNCBiaXRzKSAoImNvbnRlbnRzIikKLSAgKCgiQ09OVEVOVFNfQ09ERSIgIjAiKQotICAgKCJDT05URU5UU19EQVRBIiAiMSIpCi0gICAoIkNPTlRFTlRTX1NUQUNLIiAiMiIpCi0gICAoIkNPTlRFTlRTX0RVTU1ZIiAiMyIpCi0gICAoIkNPTlRFTlRTX1NQRUNJQUwiICI0IikKLSAgICgiQ09OVEVOVFNfTk9OU1BFQyIgIjB4ZiIpKSkKLSAoKCJjb25jYXQiKSAoNCBiaXRzKSAoImNvbmNhdCIpCi0gICgoIkNPTkNBVF9TSU1QTEUiICIwIikKLSAgICgiQ09OQ0FUX1NIQVJFREMiICIxIikKLSAgICgiQ09OQ0FUX0RVTU1ZIiAiMiIpCi0gICAoIkNPTkNBVF9HUk9VUCIgIjMiKQotICAgKCJDT05DQVRfU0hBUkVEIiAiNCIpCi0gICAoIkNPTkNBVF9QUklWQVRFIiAiNSIpCi0gICAoIkNPTkNBVF9VTlNQRUMiICIweGYiKSkpCi0gKCgicmVhZCIpICgyIGJpdHMpICgicmVhZCIpKQotICgoIndyaXRlIikgKDIgYml0cykgKCJ3cml0ZSIpKQotICgoImV4ZWMiKSAoMiBiaXRzKSAoImV4ZWMiKSkKLSAoKCJpbml0aWFsaXplZCIpICgyIGJpdHMpICgiaW5pdCIpKQotICgoIm1vZGUiKSAoMiBiaXRzKSAoIm1vZGUiKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUxIikpCi0gKCgibmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoIm5hbWUiKSkpCi0KLQotKCJzcyIgMHgwOQotICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLQkKLSgiZXIiIDB4MGMKLSAoKCJzeW1ib2wgdHlwZSIpICgyIGJpdHMpICgidHlwZSIpCi0gICgoIkVSX0VOVFJZIiAiMCIpCi0gICAoIkVSX0RBVEEiICIxIikKLSAgICgiRVJfTk9UREVGIiAiMiIpCi0gICAoIkVSX05PVFNQRUMiICIzIikpKQotICgoInNwYXJlIikgKDYgYml0cykgKCJzcGFyZSIpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgibmFtZSIpKSkKLQkKLQotKCJlZCIgMHgxNAotICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpCi0gKCgic3ltYm9sIHR5cGUiKSAoMyBiaXRzKSAoInR5cGUiKQotICAoKCJFRF9UWVBFX0VOVFJZIiAiMCIpCi0gICAoIkVEX1RZUEVfREFUQSIgIjEiKQotICAgKCJFRF9UWVBFX0NPTlNUIiAiMiIpCi0gICAoIkVEX1RZUEVfTk9UU1BFQyIgIjciKSkpCi0gKCgic3BhcmUiKSAoNSBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgInB0ci0+dHlwZT09RURfVFlQRV9FTlRSWSB8fCBwdHItPnR5cGU9PUVEX1RZUEVfREFUQSIKLSAgICAgICAoKCJzeW1ib2wgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpKQotIChjb25kICJwdHItPnR5cGU9PUVEX1RZUEVfQ09OU1QiCi0gICAgICAgKCgiY29uc3RhbnQgdmFsdWUiKSAoYWRkcnNpemUgYnl0ZXMpICgiY29uc3RhbnQiKSkpCi0gKCgic3ltYm9sIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZSkgKCJuYW1lIikpKQotCi0KLSgic2giIDB4MWEKLSAoKCJ1bml0IGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQotICgoInNlY3Rpb24gYXBwZWFyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZWN0aW9uIikpKQotCi0KLSgib2IiIDB4MWMKLSAoKCJzdGFydGluZyBhZGRyZXNzIGZsYWciKSAoMSBiaXQpICgic2FmIikpCi0gKCgiY29tcHJlc3Npb24gZmxhZyIpICgxIGJpdCkgKCJjcGYiKSkKLSAoKCJzcGFyZSIpICg2IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAicHRyLT5zYWYiCi0gICAgICAgKCAoInN0YXJ0aW5nIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKSkKLSAoY29uZCAicHRyLT5jcGYiCi0gICAgICAgKCgiY29tcCByZXBzIikgKGFkZHJzaXplIGJ5dGVzKSAoImNvbXByZXBzIikpKQotICgoImRhdGEiKSAoYmFycmF5IGNvdW50ZWQgYnl0ZSkgKCJkYXRhIikpKQotCQotCi0oInJsIiAweDIwCi0gKCgiYm91bmRhcnkgb2YgcmVsb2NhdGVhYmxlIGFyZWEiKSAoNCBiaXRzKSAoImJvdW5kYXJ5IikpCi0gKCgiYWRkcmVzcyBwb2xhcml0eSIpICgxIGJpdCkgKCJhcG9sIikpCi0gKCgic2VnbWVudCBudW1iZXIiKSAoMSBiaXQpICgic2VnbWVudCIpKQotICgoInNpZ24gb2YgcmVsb2NhdGlvbiIpICgxIGJpdCkgKCJzaWduIikpCi0gKCgiY2hlY2sgcmFuZ2UiKSAoMSBiaXQpICgiY2hlY2siKSkKLSAoKCJyZWxvYyBhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHIiKSkKLQotICgoImJpdCBsb2MiKSAoMSBieXRlKSAoImJpdGxvYyIpKQotICgoImZpZWxkIGxlbmd0aCIpICgxIGJ5dGUpICgiZmxlbiIpKQotICgoImJjb3VudCIpICgxIGJ5dGUpICgiYmNvdW50IikpCi0gKCgib3BlcmF0b3IiKSAoMSBieXRlKSAoIm9wIikKLSAgKCgiT1BfUkVMT0NfQUREUiIgIjEiKQotICAgKCJPUF9TRUNfUkVGIiAiMCIpCi0gICAoIk9QX0VYVF9SRUYiICIyIikpKQotIChjb25kICJwdHItPm9wID09IE9QX0VYVF9SRUYiCi0gICAgICAgKCgic3ltYm9sIG51bWJlciIpICgyIGJ5dGVzKSAoInN5bW4iKSkJKQotCQotIChjb25kICJwdHItPm9wID09IE9QX1NFQ19SRUYiCi0gICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzZWNuIikpCi0gICAgICAgKCgiY29uc3Qgb3Bjb2RlIikgKDEgYnl0ZSkgKCJjb3Bjb2RlX2lzXzMiKSkKLSAgICAgICAoKCJhZGRlbmQgbGVuZ3RoIikgKDEgYnl0ZSkgKCJhbGVuZ3RoX2lzXzQiKSkKLSAgICAgICAoKCJhZGRlbmQiKSAoNCBieXRlKSAoImFkZGVuZCIpKQotICAgICAgICgoInBsdXMgb3Bjb2RlIikgKDEgYnl0ZSkgKCJhb3Bjb2RlX2lzXzB4MjAiKSkpCi0KLSAoY29uZCAicHRyLT5vcCA9PSBPUF9SRUxPQ19BRERSIgotICAgICAgICgoImR1bm5vIikgKDIgYnl0ZXMpICgiZHVubm8iKSkpCi0KLSAoKCJlbmQiKSAgKDEgYnl0ZSkgKCJlbmQiKSkpCi0JCi0KLSgiZHUiIDB4MzAKLSAoKCJmb3JtYXQiKSAoMiBiaXRzKSAoImZvcm1hdCIpKQotICgoIm9wdGltaXplZCIpICgxIGJpdCkgKCJvcHRpbWl6ZWQiKSkKLSAoKCJzdGFja2ZybXQiKSAoMiBiaXRzKSAoInN0YWNrZnJtdCIpKQotICgoInNwYXJlIikgKDMgYml0cykgKCJzcGFyZSIpKQotICgoInVuaXQgbnVtYmVyIikgKDIgYnl0ZXMpICgidW5pdCIpKQotICgoInNlY3Rpb25zIikgKDIgYnl0ZXMpICgic2VjdGlvbnMiKSkKLSAocmVwZWF0ICJwdHItPnNlY3Rpb25zIgotCSAoKCJzZWN0aW9uIGFwcGVhcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgic2FuIikpCi0JICgoImFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiYWRkcmVzcyIpKQotCSAoKCJzZWN0aW9uIGxlbmd0aCIpIChhZGRyc2l6ZSBieXRlcykgKCJsZW5ndGgiKSkpCi0gKCgidG9vbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgidG9vbCIpKQotICgoImNyZWF0aW9uIGRhdGUiKSAoY2hhcnMgMTIgYnl0ZXMpICgiZGF0ZSIpKSkKLQotCi0oImRzeSIgMHgzNAotICgoInN5bWJvbCB0eXBlIikgKDcgYml0cykgKCJ0eXBlIikKLSAgKCgiU1RZUEVfVkFSIiAiMCIpCi0gICAoIlNUWVBFX0xBQiIgIjEiKQotICAgKCJTVFlQRV9QUk9DIiAiMiIpCi0gICAoIlNUWVBFX0ZVTkMiICIzIikKLSAgICgiU1RZUEVfVFlQRSIgIjQiKQotICAgKCJTVFlQRV9DT05TVCIgIjUiKQotICAgKCJTVFlQRV9FTlRSWSIgIjYiKQotICAgKCJTVFlQRV9NRU1CRVIiICI3IikKLSAgICgiU1RZUEVfRU5VTSIgIjgiKQotICAgKCJTVFlQRV9UQUciICI5IikKLSAgICgiU1RZUEVfUEFDS0FHRSIgIjEwIikKLSAgICgiU1RZUEVfR0VORVJJQyIgIjExIikKLSAgICgiU1RZUEVfVEFTSyIgIjEyIikKLSAgICgiU1RZUEVfRVhDRVBUSU9OIiAiMTMiKQotICAgKCJTVFlQRV9QQVJBTUVURVIiICIxNCIpCi0gICAoIlNUWVBFX0VRVUFURSIgIjE1IikKLSAgICgiU1RZUEVfVU5TUEVDIiAiMHg3ZiIpKSkKLSAoKCJhc3NpZ25tZW50IGluZm8iKSAoMSBiaXQpICgiYXNzaWduIikpCi0gKCgic3ltYm9sIGlkIikgKDIgYnl0ZXMpICgic251bWJlciIpKQotICgoInN5bWJvbCBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoInNuYW1lIikpCi0gKCgibmVzdGluZyBsZXZlbCIpICgyIGJ5dGVzKSAoIm5lc3RpbmciKSkKLSAoY29uZCAicHRyLT5hc3NpZ24iCi0gICAgICAgKCgiYXNzaWdubWVudCB0eXBlIikgKDEgYnl0ZSkgICgiYWluZm8iKQotCSgoIkFJTkZPX1JFRyIgIjEiKQotCSAoIkFJTkZPX1NUQVRJQ19FWFRfREVGIiAiMiIpCi0JICgiQUlORk9fU1RBVElDX0VYVF9SRUYiICIzIikKLQkgKCJBSU5GT19TVEFUSUNfSU5UIiAiNCIpCi0JICgiQUlORk9fU1RBVElDX0NPTSIgIjUiKQotCSAoIkFJTkZPX0FVVE8iICI2IikKLQkgKCJBSU5GT19DT05TVCIgIjciKQotCSAoIkFJTkZPX1VOU1BFQyIgIjB4ZmYiKSkpCi0gICAgICAgKCgiZGF0YSBsZW5ndGgiKSAoYWRkcnNpemUgYnl0ZXMpICgiZGxlbmd0aCIpKQotICAgICAgIChjb25kICJwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19FWFRfREVGCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX1NUQVRJQ19JTlQKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0NPTSIKLQkgICAgICgoInNlY3Rpb24gbnVtYmVyIikgICgyIGJ5dGVzKSAoInNlY3Rpb24iKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLSAgICAgICAgICAgIHx8IHB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0lOVAotICAgICAgICAgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfQ09NCi0gICAgICAgICAgICB8fCBwdHItPmFpbmZvID09IEFJTkZPX0FVVE8iCi0JICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fUkVHIgotCSAgICAgKCgicmVnaXN0ZXIgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJyZWciKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fU1RBVElDX0VYVF9ERUYKLQkgICAgfHwgcHRyLT5haW5mbyA9PSBBSU5GT19TVEFUSUNfRVhUX1JFRiIKLQkgICAgICgoImV4dGVybmFsIG5hbWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiZW5hbWUiKSkpCi0gICAgICAgKGNvbmQgInB0ci0+YWluZm8gPT0gQUlORk9fQ09OU1QiCi0JICAgICAoKCJjb25zdGFudCIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJjb25zdGFudCIpKSkpCi0gKGNvbmQgInB0ci0+dHlwZSA9PSBTVFlQRV9NRU1CRVIiCi0gICAgICAgKCgiYXNzaWdubWVudCB1bml0IikgKDEgYml0KSAoImJpdHVuaXQiKSkKLSAgICAgICAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUyIikpCi0gICAgICAgKCgiZmllbGQgbGVuZ3RoIikgKGFkZHJzaXplIGJ5dGVzKSAoImZpZWxkX2xlbiIpKQotICAgICAgICgoImZpZWxkIG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9vZmYiKSkKLSAgICAgICAoY29uZCAicHRyLT5iaXR1bml0IgotCSAgICAgKCgiYml0IG9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJmaWVsZF9iaXRvZmYiKSkpKQotIChjb25kICJwdHItPnR5cGU9PSBTVFlQRV9FTlVNIgotICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgiZXZhbGxlbiIpKQotICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgiZXZhbHVlIikpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfQ09OU1QiCi0gICAgICAgKCgidmFsdWUiKSAoY2hhcnMgdmFyaWFibGUgYnl0ZXMpICgiY3ZhbHVlIikpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfRVFVQVRFIgotICAgICAgICgoInZhbHVlIGxlbmd0aCIpICgxIGJ5dGUpICgicXZhbGxlbiIpKQotICAgICAgICgoInZhbHVlIikgKDQgYnl0ZXMpICgicXZhbHVlIikpCi0gICAgICAgKCgiYmFzaWMgdHlwZSIpICgxIGJ5dGUpICgiYnR5cGUiKSkKLSAgICAgICAoKCJzaXplIGluZm9ybWF0aW9uIikgKGFkZHJzaXplIGJ5dGVzKSAoInNpemVpbmZvIikpCi0gICAgICAgKCgic2lnbiIpICgyIGJpdHMpICgic2lnbiIpKQotICAgICAgICgoImZsb2F0aW5nIHBvaW50IHR5cGUiKSAoNiBiaXRzKSAoImZsdF90eXBlIikpKQotICgoInNvdXJjZSBmaWxlIG51bWJlciIpICgyIGJ5dGVzKSAoInNmbiIpKQotICgoInNvdXJjZSBsaW5lIG51bWJlciIpICgyIGJ5dGVzKSAoInNsbiIpKQotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotIChjb25kICJwdHItPnR5cGUgPT0gU1RZUEVfVEFHIgotICAgICAgICgoIm1hZ2ljIikgKDEgYnl0ZSkgKCJtYWdpYyIpKSkpCi0KLSAKLQotKCJkdWwiIDB4NTIKLSAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQotICgoIm1heCBzcGFyZSIpICg3IGJpdHMpICgibWF4c3BhcmUiKSkKLSAoY29uZCAicHRyLT5tYXhfdmFyaWFibGUgPT0gMCIKLSAgICAgICAoKCJtYXhpbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1heCIpKQotICAgICAgICgoIm1heCBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1heG1vZGUiKSkpCi0KLSAoKCJtaW4gZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1pbl92YXJpYWJsZSIpKQotICgoIm1pbiBzcGFyZSIpICg3IGJpdHMpICgibWluc3BhcmUiKSkKLSAoY29uZCAicHRyLT5taW5fdmFyaWFibGUgPT0gMCIKLSAgICAgICAoKCJtaW5pbXVtIikgKGFkZHJzaXplIGJ5dGVzKSAoIm1pbiIpKQotICAgICAgICgoIm1pbiBtb2RlIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoIm1pbm1vZGUiKSkpKQotCi0KLSgiZHR5IiAweDM2Ci0gKCgiZW5kIGZsYWciKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLQotKCJkYnQiIDB4NDQKLSAoKCJiYXNpYyB0eXBlIikgKDEgYnl0ZSkgKCJidHlwZSIpCi0gICgoIkJUWVBFX1ZPSUQiICIwIikKLSAgICgiQlRZUEVfVU5ERUYiICIxIikKLSAgICgiQlRZUEVfQ0hBUiIgIjIiKQotICAgKCJCVFlQRV9JTlQiICIzIikKLSAgICgiQlRZUEVfRkxPQVQiICI0IikKLSAgICgiQlRZUEVfQklUIiAiNSIpCi0gICAoIkJUWVBFX1NUUklORyIgIjYiKQotICAgKCJCVFlQRV9ERUNJTUFMIiAiNyIpCi0gICAoIkJUWVBFX0VOVU0iICI4IikKLSAgICgiQlRZUEVfU1RSVUNUIiAiOSIpCi0gICAoIkJUWVBFX1RZUEUiICIxMCIpCi0gICAoIkJUWVBFX1RBRyIgIjExIikKLSAgICgiQlRZUEVfVU5TUEVDIiAiMHhmZiIpKSkKLSAoKCJzaXplIGluZm8iKSAoYWRkcnNpemUgYnl0ZXMpICgiYml0c2l6ZSIpKQotICgoInNpZ24iKSAoMiBiaXRzKSAoInNpZ24iKQotICAoKCJTSUdOX1NJR05FRCIgIjAiKQotICAgKCJTSUdOX1VOU0lHTkVEIiAiMSIpCi0gICAoIlNJR05fVU5TUEVDIiAiMyIpKSkKLSAoKCJmbG9hdGluZyBwb2ludCB0eXBlIikgKDYgYml0cykgKCJmcHR5cGUiKQotICAoKCJGUFRZUEVfU0lOR0xFIiAiMCIpCi0gICAoIkZQVFlQRV9ET1VCTEUiICIxIikKLSAgICgiRlBUWVBFX0VYVEVOREVEIiAiMiIpCi0gICAoIkZQVFlQRV9OT1RTUEVDIiAiMHgzZiIpKSkKLSAoY29uZCAicHRyLT5idHlwZT09QlRZUEVfVEFHIHx8IHB0ci0+YnR5cGUgPT0gQlRZUEVfVFlQRSIKLSAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJzaWQiKSkpCi0gKCgibmVnb3RpYXRpb24iKSAoMiBieXRlcykgKCJuZWciKSkpCi0KLSgiZGFyIiAweDRlCi0gKCgiZWxlbWVudCBsZW5ndGgiICkgKGFkZHJzaXplIGJ5dGVzKSAoImxlbmd0aCIpKQotICgoImRpbXMiKSAoMSBieXRlKSAoImRpbXMiKSkKLSAocmVwZWF0ICJwdHItPmRpbXMiCi0JICgoInZhcmlhYmxlIGZsYWciKSAoMSBiaXQpICgidmFyaWFibGUiKQotCSAgKCgiVkFSSUFCTEVfRklYRUQiICIwIikKLQkgICAoIlZBUklBQkxFX1ZBUklBQkxFIiAiMSIpKSkKLQotCSAoKCJzdWJzY3JpcHQgdHlwZSIpICgxIGJpdCkgKCJzdWJ0eXBlIikKLQkgICgoIlNVQl9JTlRFR0VSIiAiMCIpCi0JICAgKCJTVUJfVFlQRSIgICAgIjEiKSkpCi0KLQkgKCgic3BhcmUiKSAoNiBiaXRzKSAoInNwYXJlIikpCi0KLQkgKGNvbmQgInB0ci0+c3VidHlwZVtuXSA9PSBTVUJfVFlQRSIKLQkgICAgICAgKCgic3ViIHN5bWJvbCBpZCIpICgyIGJ5dGVzKSAoInNpZCIpKSkKLQotCSAoY29uZCAicHRyLT5zdWJ0eXBlW25dID09IFNVQl9JTlRFR0VSIgotCSAgICAgICAoKCJtYXggZGVjbGFyYXRpb24gdHlwZSBmbGFnIikgKDEgYml0KSAoIm1heF92YXJpYWJsZSIpKQotCSAgICAgICAoKCJtYXggc3BhcmUiKSAoNyBiaXRzKSAoIm1heHNwYXJlIikpCi0JICAgICAgIDs7IEZJWE1FOiBuZXh0IGZpZWxkIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBtYXhfdmFyaWFibGUsCi0JICAgICAgICgoIm1heGltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWF4IikpCi0KLQkgICAgICAgKCgibWluIGRlY2xhcmF0aW9uIHR5cGUgZmxhZyIpICgxIGJpdCkgKCJtaW5fdmFyaWFibGUiKSkKLQkgICAgICAgKCgibWluIHNwYXJlIikgKDcgYml0cykgKCJtaW5zcGFyZSIpKQotCSAgICAgICA7OyBGSVhNRTogbmV4dCBmaWVsZCBzaG91bGQgYmUgY29uZGl0aW9uYWwgb24gbWluX3ZhcmlhYmxlCi0JICAgICAgICgoIm1pbmltdW0iKSAoYWRkcnNpemUgYnl0ZXMpICgibWluIikpKSkKLSAoKCJuZWdvdGlhdGlvbiIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLQotCSAgICAgICAKLSgiZHNvIiAweDNhCi0gKCgiZnVuY3Rpb24gbmFtZSIpICgyIGJ5dGVzKSAoInNpZCIpKQotICgoInNwIHVwZGF0ZSBjb3VudCIpICg0IGJ5dGVzKSAoInNwdXBkYXRlcyIpKQotIChyZXBlYXQgInB0ci0+c3B1cGRhdGVzIgotCSAoKCJ1cGRhdGUgYWRkcmVzcyIpIChhZGRyc2l6ZSBieXRlcykgKCJhZGRyZXNzIikpCi0JICgoIm9mZnNldCIpIChhZGRyc2l6ZSBieXRlcykgKCJvZmZzZXQiKSkpKQotCi0oImRsbiIgMHgzOAotICgoIm51bWJlciBvZiBsaW5lcyIpICgyIGJ5dGVzKSAoIm5sbiIpKQotIChyZXBlYXQgInB0ci0+bmxuIgotCSAoKCJzb3VyY2UgZmlsZSBudW1iZXIiKSAoMiBieXRlcykgKCJzZm4iKSkKLQkgKCgic291cmNlIGxpbmUgbnVtYmVyIikgKDIgYnl0ZXMpICgic2xuIikpCi0JICgoInNlY3Rpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgic2VjdGlvbiIpKQotCSAoKCJmcm9tIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgiZnJvbV9hZGRyZXNzIikpCi0JICgoInRvIGFkZHJlc3MiKSAoYWRkcnNpemUgYnl0ZXMpICgidG9fYWRkcmVzcyIpKQotCSAoKCJjYWxsIGNvdW50IikgKDIgYnl0ZXMpICgiY2MiKSkKLQkgKQotICgoIm5lZyIpICgyIGJ5dGVzKSAoIm5lZyIpKSkKLSAKLSgiZHBwIiAweDQ2Ci0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgicGFyYW1zIikgKDEgYnl0ZSkgKCJwYXJhbXMiKSkKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZW4iIDB4NGEKLSAoKCJzdGFydC9lbmQiKSAoMSBiaXQpICgiZW5kIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmVuZCIKLSAgICAgICAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpKSkKLQotKCJkZnAiIDB4NDgKLSAoKCJzdGFydC9lbmQgZmxhZyIpICgxIGJpdCkgKCJlbmQiKSkKLSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm51bWJlciBvZiBwYXJhbWV0ZXJzIikgKDEgYnl0ZSkgKCJucGFyYW1zIikpCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZGRzIiAweDRjCi0gKCgic3RhcnQvZW5kIikgKDEgYml0KSAoImVuZCIpKQotICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotIChjb25kICIhcHRyLT5lbmQiCi0gICAgICAgKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKSkpCi0KLSgiZHB0IiAweDUwCi0gKCgibmVnIG51bWJlciIpICgyIGJ5dGVzKSAoIm5lZyIpKQotICgoImR1bm5vIikgKDEgYnl0ZSkgKCJkdW5ubyIpKSkKLQotKCJkc2UiIDB4NTQKLSAoKCJuZWcgbnVtYmVyIikgKDIgYnl0ZXMpICgibmVnIikpCi0gKCgiZHVubm8iKSAoMSBieXRlKSAoImR1bm5vIikpKQotCi0oImRvdCIgMHg1NgotICgoInVua25vd24iKSAoMSBieXRlKSAoInVua25vd24iKSkpCi07IEZJWE1FOiB1bmtub3duIGZpZWxkIHNob3VsZCBiZSByZXBlYXRlZCBzeW1ib2wgbnVtYmVyPwotCi0KLSgiZHNzIiAweDQyCi0gKCgidHlwZSIpICgxIGJ5dGUpICgidHlwZSIpKQotICgoImV4dGVybmFsL2ludGVybmFsIikgKDEgYml0KSAoImludGVybmFsIikpCi0gKCgic3BhcmUiKSAoNyBiaXRzKSAoInNwYXJlIikpCi0gKGNvbmQgIiFwdHItPmludGVybmFsIgotICAgICAgICggICgicGFja2FnZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicGFja2FnZSIpKSkKLSAoY29uZCAicHRyLT5pbnRlcm5hbCIKLSAgICAgICAoKCJzeW1ib2wgaWQiKSAoMiBieXRlcykgKCJpZCIpKSkKLSAoKCJyZWNvcmQgdHlwZSIpICgyIGJ5dGVzKSAoInJlY29yZCIpKQotICgoInJ1bGVzIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgicnVsZXMiKSkKLSAoKCJudW1iZXIgb2Ygc3ltYm9scyIpICgyIGJ5dGVzKSAoIm5zeW1ib2xzIikpCi0gKCgidW5rbm93biIgKSAoMiBieXRlcykgKCJmaXhtZSIpKSkKLSAgICAgCi0oInBzcyIgMHg0MAotICgoIm5lZ290aWF0aW9uIG51bWJlciIpICgyIGJ5dGVzKSAoImVmbiIpKQotICgoIm51bWJlciBvZiBzb3VyY2UgZmlsZXMiKSAoMiBieXRlcykgKCJucyIpKQotIChyZXBlYXQgInB0ci0+bnMiCi0JICgoImRpcmVjdG9yeSByZWZlcmVuY2UgYml0IikgKDEgYml0KSAoImRyYiIpKQotCSAoKCJzcGFyZSIpICg3IGJpdHMpICgic3BhcmUiKSkKLQkgKCgiY29tcGxldGVkIGZpbGUgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlKSAoImZuYW1lIikpCi0JIChjb25kICJwdHItPmRyYltuXSIgCi0JICAgICAgICgoImRpcmVjdG9yeSBhcHBlcmFuY2UgbnVtYmVyIikgKDIgYnl0ZXMpICgiZGFuIikpKSkKLSAKLSAoKCJudW1iZXIgb2YgZGlyZWN0b3JpZXMiKSAoMiBieXRlcykgKCJuZGlyIikpCi0gKHJlcGVhdCAicHRyLT5uZGlyIgotCSAoKCJkaXJlY3RvcnkgbmFtZSIpIChjaGFycyB2YXJpYWJsZSBieXRlcykgKCJkbmFtZSIpKSkpCi0KLQotOyBGSVhNRTogdGhlIHRyIGJsb2NrIGhhcyBubyBjb250ZW50cy4gc3lzaW5mbywgZXRjLiBhcmVuJ3QgcHJlcGFyZWQgCi07IHRvIGRlYWwgd2l0aCB0aGF0LgotOyAoInRyIiAweDdmKQotCi0KLSgiZHVzIiAweDQwCi0gKCgibmVnb3RpYXRpb24gbnVtYmVyIikgKDIgYnl0ZXMpICgiZWZuIikpCi0gKCgibnVtYmVyIG9mIHNvdXJjZSBmaWxlcyIpICgyIGJ5dGVzKSAoIm5zIikpCi0gKHJlcGVhdCAicHRyLT5ucyIKLQkgKCgiZGlyZWN0b3J5IHJlZmVyZW5jZSBiaXQiKSAoMSBiaXQpICgiZHJiIikpCi0JICgoInNwYXJlIikgKDcgYml0cykgKCJzcGFyZSIpKQotCSAoKCJjb21wbGV0ZWQgZmlsZSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGUpICgiZm5hbWUiKSkKLQkgKGNvbmQgInB0ci0+ZHJiW25dIiAKLQkgICAgICAgKCgiZGlyZWN0b3J5IGFwcGVyYW5jZSBudW1iZXIiKSAoMiBieXRlcykgKCJkYW4iKSkpKQotICgoIm51bWJlciBvZiBkaXJlY3RvcmllcyIpICgyIGJ5dGVzKSAoIm5kaXIiKSkKLSAocmVwZWF0ICJwdHItPm5kaXIiCi0JICgoImRpcmVjdG9yeSBuYW1lIikgKGNoYXJzIHZhcmlhYmxlIGJ5dGVzKSAoImRuYW1lIikpKSkKLQotCi0oImRwcyIgMHgzMgotICgoInN0YXJ0L2VuZCBmbGFnIikgKDEgYml0KSAoImVuZCIpKQotICgoImJsb2NrIHR5cGUiKSAoNyBiaXRzKSAoInR5cGUiKQotICAoKCJCTE9DS19UWVBFX0NPTVBVTklUIiAiMCIpCi0gICAoIkJMT0NLX1RZUEVfUFJPQ0VEVVJFIiAiMiIpCi0gICAoIkJMT0NLX1RZUEVfRlVOQ1RJT04iICIzIikKLSAgICgiQkxPQ0tfVFlQRV9CTE9DSyIgIjQiKQotICAgKCJCTE9DS19UWVBFX0JBU0lDIiAiOSIpKSkKLSAoY29uZCAiIXB0ci0+ZW5kIgotICAgICAgICgoIm9wdGltaXphdGlvbiIpICgxIGJ5dGUpICgib3B0IikpCi0gICAgICAgKCgic2VjdGlvbiBudW1iZXIiKSAoMiBieXRlcykgKCJzYW4iKSkKLSAgICAgICAoKCJhZGRyZXNzIikgKGFkZHJzaXplIGJ5dGVzKSAoImFkZHJlc3MiKSkKLSAgICAgICAoKCJibG9jayBzaXplIikgKGFkZHJzaXplIGJ5dGVzKSAoImJsb2NrX3NpemUiKSkKLSAgICAgICAoKCJuZXN0aW5nIikgKDEgYnl0ZSkgKCJuZXN0aW5nIikpCi0gICAgICAgKGNvbmQgInB0ci0+dHlwZSA9PSBCTE9DS19UWVBFX1BST0NFRFVSRSAKLQkgICAgfHwgcHRyLT50eXBlID09IEJMT0NLX1RZUEVfRlVOQ1RJT04iCi0JICAgICAoKCJyZXR1cm4gYWRkcmVzcyIpICgxIGJpdCkgKCJyZXRhZGRyIikpCi0JICAgICAoKCJpbnRlcnJ1cHQgZnVuY3Rpb24gZmxhZyIpICgxIGJpdCkgKCJpbnRyZmxhZyIpKQotCSAgICAgKCgic3RhY2sgdXBkYXRlIGZsYWciKSAoMSBiaXQpICgic3RhY2tmbGFnIikpCi0JICAgICAoKCJpbnRyYSBwYWdlIEpNUCIpICgxIGJpdCkgKCJpbnRycGFnZWptcCIpKQotCSAgICAgKCgic3BhcmUiKSAoNCBiaXRzKSAoInNwYXJlIikpKQotICAgICAgICgoIm5lZyBudW1iZXIiKSAoMiBieXRlcykgKCJuZWciKSkpKQotCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nIGIvYmludXRpbHMvdGVzdHN1aXRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3OTA4YS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTk5ICswLDAgQEAKLTE5OTktMDYtMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLndpOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IG91dHB1dC4KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmg6IFVwZGF0ZSB0byBtYXRjaCBsYXRlc3Qgb3V0cHV0LgotCi1XZWQgSnVuICA5IDExOjU5OjIyIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBUaWdodGVuIHJlZ2V4cCB0byBtYXRjaCBgb2JqZHVtcCAtaScKLQlvdXRwdXQgdG8gYXZvaWQgbWFzc2l2ZSBleHBvbmVudGlhbCBiZWhhdmlvdXIuCi0KLTE5OTktMDUtMjggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5oOiBVcGRhdGUgZm9yIGNoYW5nZXMgb2YgMTk5OS0wNC0wOC4KLQotMTk5OS0wMy0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL3JlYWRlbGYud2k6IFJlbW92ZSBGUjMwIHNwZWNpZmljIGNvbXBvbm50cy4KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IFJlbW92ZSBSRUxBIHNwZWNpZmljIGNvbXBvbmVudHMuCi0KLTE5OTktMDItMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IERvIG5vdCBhc3N1bWUgc2VjdGlvbiBhbGlnbm1lbnQgaXMgNC4KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnI6IERvIG5vdCBhc3N1bWUgcmVsYSdzIGFyZSBiZWluZyB1c2VkLiAKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cDogZGlzYWJsZSB0ZXN0cyBmb3Igbm9uIEVMRiBiYXNlZAotCXRhcmdldHMuCi0KLTE5OTktMDItMDIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLndpOiBBbWVuZCB0byBtYXRjaCBuZXcgcmVhZGVsZiBvdXRwdXQuCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBEbyBub3QgYXNzdW1lIHRoYXQgUkVMQXMgd2lsbCBiZSB1c2VkLgotCi0xOTk5LTAxLTI5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IEFkZCBkZWZpbml0aW9ucyBvZiBSRUFERUxGIGFuZCBSRUFERUxGRkxBR1MuCi0KLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cDogTmV3IGZpbGU6IFJlYWRlbGYgdGVzdHMKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLmg6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtaCcKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnM6IE5ldyBmaWxlOiBFeHBlY3RlZCByZXN1bHRzIGZvciAncmVhZGVsZiAtUycKLQkqIGJpbnV0aWxzLWFsbC9yZWFkZWxmLnNzOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLXMnCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi5yOiBOZXcgZmlsZTogRXhwZWN0ZWQgcmVzdWx0cyBmb3IgJ3JlYWRlbGYgLXInCi0JKiBiaW51dGlscy1hbGwvcmVhZGVsZi53aTogTmV3IGZpbGU6IEV4cGVjdGVkIHJlc3VsdHMgZm9yICdyZWFkZWxmIC13aScKLQotV2VkIERlYyAgOSAxOToxMTozOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCAoY29weV9leGVjdXRhYmxlKTogRXhwZWN0IGNvbXBhcmlzb24KLQlmYWlsdXJlIGZvciBtaXBzKi0qLWVsZi4KLQotRnJpIE9jdCAxNiAyMjo1NzoxMiAxOTk4ICBGZWxpeCBMZWUgIDxmbGVlQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogZml4ICJubyBzeW1ib2xzIiBtZXNzYWdlLgotCi1UdWUgSnVsIDI4IDE1OjE0OjA0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBLZWVwICJtYWluIiBhbmQgIl9tYWluIiBmb3Igc3RyaXAgd2l0aAotCXNhdmluZyBzeW1ib2wgdGVzdHMuICBMb29rIGZvciBlaXRoZXIgIm1haW4iIG9yICJfbWFpbiIgaW4gdGhlIG91dHB1dAotCWZpbGUuICBGaXggdGVzdCBmb3IgIm5vIHN5bWJvbHMiIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotMTk5OC0wNy0yMiAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogUG9saXNoIG91dHB1dCBhYm91dCBmYWlsIGZvciBvYmpjb3B5Ci0JKHNpbXBsZSBjb3B5KSwgc3RyaXAgd2l0aC93aXRob3V0IHNhdmluZyBhIHN5bWJvbCBmb3Igb2JqZWN0IGZpbGUKLQlhbmQgZXhlY3V0YWJsZS4KLQotV2VkIEp1bCAgMSAxNjoyNzo0MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFSTSBzaW1wbGUgb2JqY29weSBub3cgcGFzc2VzLgotCi1XZWQgSnVuIDI0IDA5OjIwOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogTG9vayBmb3IgJy5kYXRhJyByYXRoZXIgdGhhbiAnZGF0YScKLQl3aGVuIHBhcnNpbmcgb3V0cHV0IG9mIG9iamR1bXAgLWguCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IExvb2sgZm9yICcuZGF0YScgcmF0aGVyIHRoYW4gJ2RhdGEnIHdoZW4KLQlwYXJzaW5nIG91dHB1dCBvZiBzaXplIC1BLgotCi0xOTk4LTA3LTIwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogb2JqY29weS5leHA6IFR3byBuZXcgdGVzdHMgLSBzdHJpcCBvYmplY3QgZmlsZSB3aXRoIHNhdmluZyBhCi0Jc3ltYm9sIGFuZCBzdHJpcCBleGVjdXRhYmxlIGZpbGUgd2l0aCBzYXZpbmcgYSBzeW1ib2wuCi0KLUZyaSBNYXkgMjkgMTQ6NTA6MjQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERvbid0IHhmYWlsIHRoZSBzaW1wbGUgb2JqY29weSB0ZXN0Ci0Jd2hlbiBjcm9zcyBjb21waWxpbmcuCi0KLVRodSBOb3YgIDYgMTQ6MzI6MzcgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwOiBUZW1wb3JhcnkgZGVmaW5pdGlvbiBvZiB0YXJnZXRfYXNzZW1ibGUgYW5kCi0gCWRlZmF1bHRfdGFyZ2V0X2Fzc2VtYmxlIHNvIHRoYXQgdGVzdGluZyBjYW4gd29yayB3aXRoIG9sZGVyCi0gCWRlamFnbnUgdmVyc2lvbnMuCi0KLVdlZCBTZXAgMjQgMTI6MDk6MTUgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cChzdHJpcF9leGVjdXRhYmxlKTogTWFrZSBhIG5ldyBjb3B5IG9mCi0gCXRoZSBleGVjdXRhYmxlIGJlaW5nIHRlc3RlZC4KLQotTW9uIFNlcCAxNSAyMToyNToyMCAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBDb21waWxlIHRoZSBleGVjdXRhYmxlcyB0byBiZSB0ZXN0ZWQKLSAJb24gdGhlIHRhcmdldCB3aXRoIGEgc3RhdHVzIHdyYXBwZXIgKGFzIG5lY2Vzc2FyeSkuCi0KLQkqIGJpbnV0aWxzLWFsbC9hci5leHA6IElmIHRlc3Rpbmcgb24gYSByZW1vdGUgaG9zdCwgZG9uJ3QgYm90aGVyCi0gCWxvb2tpbmcgb24gdGhlIGxvY2FsIGhvc3QgZm9yIHRoZSBwcm9ncmFtIGJlaW5nIHRlc3RlZC4gVXNlIHRoZQotIAljb3JyZWN0IGZpbGVuYW1lcyBvbiB0aGUgcmVtb3RlIGhvc3QuCi0KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IERpdHRvLgotCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IERpdHRvLgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IERpdHRvLgotIAkoY3B1c19leHBlY3RlZCk6IEFkZCB0aGUgdGFyZ2V0IENQVSB0byB0aGUgcmVnZXhwIG9mIENQVXMgdG8gYmUKLSAJZXhwZWN0ZWQsIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuCi0KLVRodSBBdWcgMjggMDk6NTc6MjcgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogQWRkIGFyYy4KLQotVHVlIEF1ZyAgNSAwMDowMzoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogTG9vayBmb3Igbm0tbmV3IGFuZCBzdHJpcC1uZXcuCi0KLVR1ZSBKdW4gIDMgMTc6MTI6NTQgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVtb3ZlIGV4cGVjdF9iZWZvcmUgc3RhdGVtZW50LgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERvbid0IHVzZSBnbG9iYWwgZXhlY19vdXRwdXQgdmFyaWFibGU7Ci0gCXRoZSBvdXRwdXQgaXMgcmV0dXJuZWQgZnJvbSByZW1vdGVfbG9hZCBpbnN0ZWFkLgotCi1Nb24gTWF5IDEyIDIyOjE0OjIwIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHAoc3RyaXBfdGVzdCk6IFRlc3RzIHRoYXQKLQlmYWlsIHRvIGNvbXBpbGUgYXJlIHVudGVzdGVkLCBub3QgdW5yZXNvbHZlZC4KLQkoY29weV9zZXR1cCk6IERpdHRvLgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cChkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogQ2FsbAotCXRhcmdldF9hc3NlbWJsZSBpbnN0ZWFkIG9mIHRhcmdldF9jb21waWxlLgotCi1XZWQgQXByIDMwIDIwOjM3OjUxIDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyB0byBzdXBwb3J0IG11bHRpbGliIGFuZCByZW1vdGUgaG9zdGVkIHRlc3RpbmcsIGFsb25nIHdpdGgKLSAJZ2VuZXJhbCBjbGVhbnVwcyBhbmQgc2ltcGxpZmljYXRpb25zLgotCi0JKiBsaWIvdXRpbHMtbGliLmV4cChiaW51dGlsX3ZlcnNpb24pOiBVc2UgcmVtb3RlX2V4ZWMuCi0JKGRlZmF1bHRfYmludXRpbHNfcnVuKTogRGl0dG8uCi0JKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBSZW1vdmUgZmlyc3QgYXJndW1lbnQ7IGNhbGwKLSAJdGFyZ2V0X2NvbXBpbGUgdG8gYWN0dWFsbHkgZG8gdGhlIGFzc2VtYmx5LgotCShkZWZhdWx0X2JpbnV0aWxzX2NvbXBpbGUsZGVmYXVsdF9iaW51dGlsc19yZW1vdmUscHJ1bmVfd2FybmluZ3MpOgotIAlEZWxldGUuCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogUmVtb3ZlIEFTIGFuZCBBU0ZMQUdTLgotCShiaW51dGlsc19jb21waWxlLGJpbnV0aWxzX3JlbW92ZSk6IERlbGV0ZS4KLQkoYmludXRpbHNfYXNzZW1ibGUpOiBSZW1vdmUgZmlyc3QgYXJndW1lbnQuCi0KLQkqIGJpbnV0aWxzLWFsbC9hci5leHA6IFNlZSBpZiB3ZSdyZSBydW5uaW5nIHRoZSB0ZXN0cyBvbgotCWEgcmVtb3RlIGhvc3QsIGFuZCBkb3dubG9hZC91cGxvYWQgZmlsZXMgYXMgYXBwcm9wcmlhdGUuCi0JUmVwbGFjZSBjYWxscyB0byBiaW51dGlsc19yZW1vdmUgd2l0aCByZW1vdGVfZmlsZS4gUmVwbGFjZQotCWNhbGxzIHRvIGJpbnV0aWxzX2NvbXBpbGUgd2l0aCB0YXJnZXRfY29tcGlsZS4gUmVtb3ZlIGluaXRpYWwKLQlhcmd1bWVudCB0byBiaW51dGlsc19hc3NlbWJsZS4gVXNlIHJlbW90ZV9sb2FkIHRvIGV4ZWN1dGUKLQlwcm9ncmFtcyBvbiB0aGUgdGFyZ2V0LgotCSogYmludXRpbHMtYWxsL25tLmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6ICBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogIERpdHRvLgotCSogYmludXRpbHMtYWxsL3NpemUuZXhwOiBEaXR0by4KLQotTW9uIEFwciAxNCAxMjozNjo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9hci5leHAgKGxvbmdfZmlsZW5hbWVzKTogQ2hlY2sgZm9yIGEgZmlsZSBzeXN0ZW0KLQl3aXRoIGEgMTQgY2hhcmFjdGVyIGZpbGUgbmFtZSBsZW5ndGggbGltaXQuCi0KLVR1ZSBBcHIgIDEgMDk6NTI6MTUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IEhhbmRsZSBkMTB2LgotCi1GcmkgRmViICA3IDE2OjQ1OjM0IDE5OTcgIEJvYiBNYW5zb24gIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvYXIuZXhwOiBVc2UgcHJ1bmVfd2FybmluZ3MgaW5zdGVhZCBvZgotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEaXR0by4KLQotV2VkIEphbiAyOSAwMDoxNjo0MyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogVXNlIC8gYmV0d2VlbiAkc3JjZGlyIGFuZCAkc3ViZGlyLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBEaXR0by4KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IERpdHRvLgotCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHA6IERpdHRvLgotCQotCi1XZWQgT2N0IDE2IDIyOjU3OjU5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBBZGQgbW4xMDIwMCBhbmQgbW4xMDMwMCB0byBleHBlY3RlZAotCWNwdXMgbGlzdC4KLQotVHVlIE9jdCAgMSAxNTowNjo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChiaW51dGlsX3ZlcnNpb24pOiBGaXggZm9yIGN1cnJlbnQgdmVyc2lvbgotCXByaW50aW5nLgotCi1TdW4gQXVnICA0IDIyOjI1OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBGaXggZW5kIG9mIGxpbmUgbWF0Y2hpbmcgaW4gc3JlYyB0ZXN0cwotCXRvIHdvcmsgd2l0aCBUQ0wgNy41LgotCi1TYXQgSnVuIDI5IDEyOjUxOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBTaW1wbGUgY29weSB0ZXN0IHdvcmtzIGZvciBpOTYwIGIub3V0Ci0JdGFyZ2V0cy4KLQotTW9uIEp1biAyNCAxNDozMzowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogT24gT1NGLzEsIHRoZSBzaW1wbGUgY29weSB0ZXN0IHdpbGwKLQlzdWNjZWVkIHdpdGggZ2FzLCBhbmQgZmFpbCB3aXRoIC9iaW4vYXMsIHNvIG1hcmsgaXQgYXMgYW4gZXhwZWN0ZWQKLQlmYWlsdXJlIG9ubHkgaWYgaXQgZmFpbHMuCi0KLVR1ZSBNYXIgMjYgMTY6NTU6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IE5vIGxvbmdlciBleHBlY3QgYWRqdXN0LXNlY3Rpb24tdm1hCi0JdGVzdCB0byBmYWlsIGZvciBocHBhKi0qLXByb2VsZiouCi0KLU1vbiBNYXIgMTEgMDg6MjU6MTQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IExvb2sgZm9yICIkQ09ERSQiLCBub3QganVzdCAiQ09ERSIuCi0KLVdlZCBKYW4gMzEgMTE6NTU6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEV4cGVjdCBhZGp1c3Qtc2VjdGlvbi12bWEgdGVzdHMgdG8KLQlmYWlsIGZvciBocHBhKi0qLXByb2VsZiogdGFyZ2V0cy4KLQotVGh1IEphbiAyNSAxMzo1MzowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogVXBkYXRlIGZvciBvYmpkdW1wIC1oIGZvcm1hdCBjaGFuZ2UuCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IExpa2V3aXNlLgotCi1Nb24gSmFuIDE1IDE4OjE0OjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBVc2UgdGhlIGxtYSwgbm90IHRoZSB2bWEsIHdoZW4gdGVzdGluZwotCWFkZHJlc3MgYWRqdXN0bWVudHMuCi0KLUZyaSBEZWMgMTUgMTY6MzE6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IFVwZGF0ZSBvYmpkdW1wIC1pIHRlc3QgZm9yIGN1cnJlbnQKLQlvYmpkdW1wIG91dHB1dC4KLQotTW9uIE5vdiAyNyAxNToxNTowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ29ycmVjdCBmYWlsIGNhbGxzIHRvIGFsd2F5cyB1c2UgdGhlCi0Jc2FtZSBzdHJpbmcgYXMgdGhlIHBhc3MgY2FsbC4KLQotV2VkIE5vdiAyMiAxMzoxODo1OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERpc2NhcmQgLWcgLU8gd2FybmluZ3MKLQlmcm9tIG5hdGl2ZSBjb21waWxlcnMgb24gT1NGLzEgYW5kIFN1bk9TLgotCi1GcmkgTm92IDE3IDEwOjM2OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfY29tcGlsZXI6IENoYW5nZSBlcnJvcgotCW1lc3NhZ2UgdG8gc2F5IGNvbXBpbGF0aW9uIHJhdGhlciB0aGFuIGFzc2VtYmx5LgotCi1XZWQgTm92IDE1IDE4OjM0OjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IFNpbXBsZSBjb3B5IHRlc3QgZG9lcyBhcHBlYXIgdG8gd29yawotCW9uIGkqODYtc3ZyNC4KLQotV2VkIE5vdiAxNSAxMjoxOToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogSWYgYXNzZW1ibHkgZmFpbHMsIGNhbGwgdW5yZXNvbHZlZC4KLQlUZXN0IHJ1bm5pbmcgb2JqY29weSBhbmQgc3RyaXAgb24gYSBmaW5hbCBleGVjdXRhYmxlLgotCSogYmludXRpbHMtYWxsL3Rlc3Rwcm9nLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL2RlZmF1bHQuZXhwIChTVFJJUCwgU1RSSVBGTEFHUyk6IERlZmluZS4KLQkoYmludXRpbHNfY29tcGlsZSk6IE5ldyBwcm9jZWR1cmUuCi0JKiBsaWIvdXRpbHMtbGliLmV4cCAoZGVmYXVsdF9iaW51dGlsc19jb21waWxlKTogTmV3IHByb2NlZHVyZS4KLQotRnJpIE5vdiAgMyAxMzoyMjozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IERvbid0IHVzZSB2ZXJib3NlCi0JLWxvZywgcmV2ZXJ0aW5nIHBhcnQgb2YgT2N0IDIgY2hhbmdlLgotCi1XZWQgTm92ICAxIDE1OjA5OjU3IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yCi0JbTY4Ki1tb3Rvcm9sYS1zeXN2KiBhbmQgbTg4Ki1tb3Rvcm9sYS1zeXN2Ki4KLQotV2VkIE9jdCAgNCAxNDozODozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIFhDT0ZGLgotCi1Nb24gT2N0ICAyIDEyOjQxOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL2FyLmV4cDogTmV3IGZpbGUuCi0JKiBiaW51dGlscy1hbGwvYmludGVzdC5zOiBNYWtlIHRleHRfc3ltYm9sIGFuZCBkYXRhX3N5bWJvbCBnbG9iYWwuCi0JQWRkIG5ldyBzdGF0aWMgc3ltYm9scyBzdGF0aWNfdGV4dF9zeW1ib2wgYW5kIHN0YXRpY19kYXRhX3N5bWJvbC4KLQkqIGJpbnV0aWxzLWFsbC9ubS5leHA6IEFkanVzdCBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoQVIpOiBTZXQgaWYgbm90IHNldC4KLQkoYmludXRpbHNfcmVtb3ZlKTogTmV3IHByb2NlZHVyZS4KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IENhbGwKLQlwcnVuZV9zeXN0ZW1fY3J1ZCBvbiBwcm9ncmFtIG91dHB1dC4gIFVzZSB2ZXJib3NlIC1sb2cgaW5zdGVhZCBvZgotCWJvdGggdmVyYm9zZSBhbmQgc2VuZF9sb2cuCi0JKGRlZmF1bHRfYmludXRpbHNfcmVtb3ZlKTogTmV3IHByb2NlZHVyZS4KLQotCSogbGliL3V0aWxzLWxpYi5leHAgKGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUpOiBDYWxsCi0JcHJ1bmVfc3lzdGVtX2NydWQgb24gYXNzZW1ibGVyIG91dHB1dC4KLQotVHVlIFNlcCAyNiAxNDowNzowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3Igc2ltcGxlIGNvcHkgdGVzdAotCWZvciBpMzg2IENPRkYgdGFyZ2V0cy4KLQotV2VkIFNlcCAxMyAxMzoyMDoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChwcnVuZV9zeXN0ZW1fY3J1ZCk6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZCBvbiBjbXAgb3V0cHV0LgotCi1TYXQgQXVnIDE5IDE3OjM4OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgeGZhaWwgZm9yIGkqODYtKi1hb3V0KiBmb3Igc2ltcGxlCi0JY29weSB0ZXN0LgotCi1XZWQgQXVnIDE2IDE2OjUyOjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBtaXBzKi1zb255LWJzZCogZm9yCi0JdGVzdHMgd2hpY2ggZmFpbCBvbiBFQ09GRiB0YXJnZXRzLgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IENoYW5nZSBpKjg2LSotbGludXggeGZhaWwgZm9yIHNpbXBsZQotCWNvcHkgdGVzdCB0byBjaGVjayBmb3IgaSo4Ni0qLWxpbnV4YW91dCogaW5zdGVhZC4KLQotVHVlIEF1ZyAgOCAxNzo0ODozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBhMjlrLSotdnh3b3JrcyoKLQlmb3Igc2ltcGxlIGNvcHkgdGVzdC4KLQotVHVlIEp1bCAyNSAxMTo1NzoxMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQ2hhbmdlIHNldHVwX3hmYWlsIGZvciBzaW1wbGUgY29weQotCXRlc3QgZnJvbSBpOTYwLSotdnh3b3JrczUuMSB0byBpOTYwLSotdnh3b3JrcyouCi0KLU1vbiBKdWwgMTAgMTI6MjU6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgejgqLSotY29mZiBmb3IKLQlzaW1wbGUgY29weSB0ZXN0LgotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogQWRkIHo4MDAxIGFuZCB6ODAwMi4KLQotU3VuIE1heSAyMSAyMDozMjo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAgKGFkZGVuZGJ1Zyk6IEhhbmRsZSBQQSBFTEYgdGFyZ2V0cwotCXRvby4KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCAoc2ltcGxlIGNvcHkpOiBEb24ndCBleHBlY3QgUEEgRUxGCi0JdGFyZ2V0cyB0byBmYWlsLgotCi1UdWUgQXByICA0IDE0OjUyOjA4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBiaW51dGlscy1hbGwvaHBwYTogUmVuYW1lZCBmcm9tIGJpbnV0aWxzLWhwcGEuCi0KLVdlZCBNYXIgMjkgMTI6MDI6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3Igc2ltcGxlIGNvcHkgdGVzdAotCWZvciBoODUwMC0qLWhtcyBhbmQgaDg1MDAtKi1jb2ZmLgotCi1UdWUgTWFyIDI4IDExOjE4OjI4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHNpbXBsZSBjb3B5IHRlc3QKLQlmb3IgbTY4Ki1lcmljc3Nvbi1vc2UgYW5kIG04OCotKi1jb2ZmLgotCi1Nb24gTWFyIDI3IDExOjI3OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHNpbXBsZSBjb3B5IHRlc3QKLQlmb3IgbTY4Ki0qLXZ4d29ya3MqLgotCi1GcmkgTWFyIDI0IDExOjQ0OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtaHBwYS9vYmpkdW1wLmV4cDogQ29ycmVjdCBocHBhKi0qLSogY2hlY2suCi0KLVR1ZSBNYXIgMjEgMTA6NDg6NDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGJpbnV0aWxzLWhwcGEvYWRkZW5kYnVnLnM6IE5ldyB0ZXN0Y2FzZS4KLQkqIGJpbnV0aWxzLWhwcGEvb2JqZHVtcC5leHA6IFJ1biBpdC4KLQotTW9uIE1hciAyMCAxMTozMTowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX3J1bik6IFF1b3RlIGFueSBkb2xsYXIgc2lnbnMKLQlpbiBwcm9nYXJncyBiZWZvcmUgcGFzc2luZyBpdCB0byBleGVjLgotCi1GcmkgTWFyIDE3IDE2OjM5OjMxIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvaHBwYS5zZWQ6IFNlZCBzY3JpcHQgdG8gdHJhbnNmb3JtIGJpbnRlc3QucyBpbnRvIHByb3BlcgotCVBBIGFzc2VtYmx5IGNvZGUuCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBFbmFibGUgdGhlc2UgdGVzdHMgb24gdGhlIFBBLgotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBFbmFibGUgdGhlc2UgdGVzdHMgb24gdGhlIFBBLiAgRXhwZWN0Ci0Jc2ltcGxlIGNvcHkgdG8gZmFpbC4KLQkqIGJpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cDogRW5hYmxlIHRoZXNlIHRlc3RzIG9uIHRoZSBQQS4gIEhhbmRsZQotCSJDT0RFIiBhcyBhIHNlY3Rpb24gbmFtZS4KLQkqIGJpbnV0aWxzLWFsbC9zaXplLmV4cDogRW5hYmxlIHRoZXNlIHRlc3RzIG9uIHRoZSBQQS4KLQkqIGxpYi91dGlscy1saWIuZXhwIChkZWZhdWx0X2JpbnV0aWxzX2Fzc2VtYmxlKTogRm9yICJocHBhKi0qLSoiLAotCXJ1biB0aGUgYXNzZW1ibHkgdGhyb3VnaCBhIHNlZCBzY3JpcHQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlCi0JYXNzZW1ibGVyLgotCi1XZWQgTWFyIDE1IDE2OjQ3OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwOiBGb3JjZSBzZWN0aW9uIHNpemVzIHRvIGJlIGludGVycHJldGVkCi0JaW4gaGV4LiAgQ2hhbmdlIG9iamR1bXAgLWggZmFpbHVyZSBtb2RlIHRvIGFsd2F5cyB1c2UgdGhlIHNhbWUKLQlzdHJpbmcuCi0KLVRodSBKYW4gIDUgMTM6MDE6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwOiBKdXN0IGNoZWNrIGZvciBpcml4NCosIHJhdGhlciB0aGFuCi0JaXJpeFxbMC00XF0qLCB0byBhdm9pZCBEZWphR251IGJ1Zy4KLQotVGh1IERlYyAxNSAxOTozNTozMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IEV4cGVjdCBzaW1wbGUtb2JqY29weSB0ZXN0IHRvIGZhaWwKLQlmb3IgdmFyaW91cyBvdGhlciB0YXJnZXRzIGZvciB3aGljaCBnYXMgZG9lc24ndCB1c2UgYmZkOiBzaC1obXMsCi0JbTY4ay1ocHV4LCBtNjhrLXN1bm9zLCBtNjhrLWNvZmYsIGkzODYtbGludXgsIGEyOWstdWRpLCBhMjlrLWNvZmYsCi0JaTk2MC12eHdvcmtzNS4xLCBpOTYwLWNvZmYsIGg4MzAwLWhtcywgaDgzMDAtY29mZi4KLQotV2VkIERlYyAxNCAxNTo1NDo0NiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IFNraXAgdGVzdHMgcmVxdWlyaW5nIGJpbnRlc3QubyBvbiBocHBhLAotCXNpbmNlIGl0IChjb3JyZWN0bHkpIGdlbmVyYXRlcyBzeW50YXggZXJyb3JzIG9uIHRoYXQgcGxhdGZvcm0uCi0JKiBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IERpdHRvLgotCSogYmludXRpbHMtYWxsL25tLmV4cDogRGl0dG8uCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IERpdHRvLiAgQWxzbywgbW92ZSBzZXR1cF94ZmFpbCBmb3IKLQlzaC1jb2ZmIHRvIGJyYW5jaCB3aGVyZSBvYmpjb3B5IGV4ZWN1dGlvbiBwcm9kdWNlZCBubyBlcnJvcgotCW1lc3NhZ2VzLiAgRXhwZWN0IGZhaWx1cmUgZm9yIGhwMzAwIGFsc28uCi0KLVRodSBEZWMgIDggMTQ6MzY6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL29iamR1bXAuZXhwIChjcHVzX2V4cGVjdGVkKTogTmV3IHZhcmlhYmxlLCB0YWtlbgotCWZyb20gb2JqZHVtcCAtaSB0ZXN0LCBhZGRlZCBuczMyayBhbmQgcG93ZXJwYywgc29ydGVkLgotCShvYmpkdW1wIC1pLCAtZiB0ZXN0cyk6IFVzZSAkY3B1c19leHBlY3RlZC4KLQotCSogYmludXRpbHMtYWxsL29iamNvcHkuZXhwOiBGb3Igc2ltcGxlLWNvcHkgdGVzdCwgZXhwZWN0IGZhaWx1cmUKLQlmb3Igc2gtY29mZi4KLQotVHVlIE9jdCAyNSAxNjowMDoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cDogQWRqdXN0IC0tYWRqdXN0LXNlY3Rpb24tdm1hIHRlc3RzIGZvcgotCW5ldyBTLXJlY29yZCBzZWN0aW9uIGhhbmRsaW5nLgotCi1UdWUgT2N0IDE4IDExOjE4OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMtYWxsL25tLmV4cDogbm0gd2l0aCBubyBhcmd1bWVudHMgYW5kIG5tIC1QIGRvIG5vdCB3b3JrCi0JYXMgZXhwZWN0ZWQgb24gRUNPRkYgdGFyZ2V0czsgYWRkIGNhbGxzIHRvIHNldHVwX3hmYWlsLgotCi0JKiBiaW51dGlscy1hbGwvb2JqY29weS5leHA6IE5ldyBmaWxlLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBJbml0aWFsaXplIE9CSkNPUFkgYW5kIE9CSkNPUFlGTEFHUy4KLQotRnJpIE9jdCAxNCAxNDo0NjoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQlSZXdyaXRlIHRlc3RzdWl0ZS4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IFJlbW92ZS4KLQkqIGJpbnV0aWxzLWFsbC9jb25maWd1cmUuaW4sIGJpbnV0aWxzLWFsbC9NYWtlZmlsZS5pbjogUmVtb3ZlLgotCSogYmludXRpbHMtYWxsL2JpbnRlc3QuYzogUmVtb3ZlLgotCSogYmludXRpbHMtYWxsL2JpbnRlc3QuczogTmV3IGZpbGUuCi0JKiBiaW51dGlscy1hbGwvbm0uZXhwLCBiaW51dGlscy1hbGwvb2JqZHVtcC5leHA6IFJld3JpdGUuCi0JKiBiaW51dGlscy1hbGwvc2l6ZS5leHA6IFJld3JpdGUuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IExvYWQgdXRpbHMtbGliLmV4cC4gIFNldCBBUyBhbmQgQVNGTEFHUy4KLQlEb24ndCBnbyB1cCBvbmUgZGlyZWN0b3J5IGZyb20gJGJhc2VfZGlyLiAgQ3JlYXRlIHRtcGRpci4KLQkoYmludXRpbHNfcnVuLCBiaW51dGlscy1hc3NlbWJsZSk6IE5ldyBwcm9jZWR1cmVzLgotCSogY29uZmlnL3VuaXguZXhwOiBSZW1vdmUuCi0JKiBjb25maWcvbXQtYTI5ay11ZGksIGNvbmZpZy9tdC1pMzg2LWFvdXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1pOTYwLW5pbmR5LCBjb25maWcvbXQtbHlueCwgY29uZmlnL210LW02OGs6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1taXBzLWVjb2ZmLCBjb25maWcvbXQtc2xpdGU6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1zcGFyYy1hb3V0LCBjb25maWcvbXQtdnh3b3JrczogUmVtb3ZlLgotCSogbGliL3V0aWxzLWxpYi5leHAgKGJpbnV0aWxfdmVyc2lvbik6IERvbid0IHJlZGlyZWN0IHN0YW5kYXJkCi0JaW5wdXQgd2hlbiBnZXR0aW5nIHZlcnNpb24uICBEb24ndCB1bnNldCBlcnJvckluZm8uCi0JKGRlZmF1bHRfYmludXRpbHNfcnVuKTogTmV3IHByb2NlZHVyZS4KLQkoZGVmYXVsdF9iaW51dGlsc19hc3NlbWJsZSk6IE5ldyBwcm9jZWR1cmUuCi0KLVRodSBTZXAgMjkgMTI6NDU6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBWTVMgZG9lcyBub3QgcGVybWl0IGAuJyBpbiBkaXJlY3RvcnkgbmFtZXM6IHJlbmFtZWQgYmludXRpbHMuYWxsCi0JdG8gYmludXRpbHMtYWxsLgotCSogY29uZmlndXJlLmluIChjb25maWdkaXJzKTogQ2hhbmdlIGJpbnV0aWxzLmFsbCB0byBiaW51dGlscy1hbGwuCi0KLUZyaSBTZXAgMjMgMTY6MDE6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFVzZSBtdC1tNjhrIGZvciBtNjhrKi0qLWFvdXQqIGFuZCBtNjhrKi0qLWNvZmYqLAotCW5vdCBmb3IgbTY4ay0qLSouCi0KLUZyaSBTZXAgMjMgMTM6NTQ6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYmludXRpbHMuYWxsL29iamR1bXAuZXhwOiBBZGRlZCBBUk0gdG8gbGlzdCBvZiBDUFUgdHlwZXMuCi0KLVRodSBTZXAgMjIgMTE6MDQ6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IFVwZGF0ZSBmb3IgbmV3IHVzYWdlIG1lc3NhZ2UuCi0JKiBiaW51dGlscy5hbGwvc2l6ZS5leHA6IFVzZSBhIGRvdWJsZSBiYWNrc2xhc2ggaW4gdGhlIHN0cmluZyB0bwotCWdldCBhIHNpbmdsZSBiYWNrc2xhc2ggdG8gdGhlIHJlZ2V4cCBtYXRjaGVyLiAgQWNjZXB0ICRURVhUJCwKLQkkREFUQSQgYW5kICRCU1MkIGFzIHdlbGwgYXMgLnRleHQsIC5kYXRhIGFuZCAuYnNzLCBmb3IgSFAvVVguCi0KLUZyaSBTZXAgIDIgMTI6NTM6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdW5peC5leHA6IElmIG5tLm5ldyBkb2VzIG5vdCBleGlzdCwgdXNlIFt0cmFuc2Zvcm0gbm1dLgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAyNCAxMjo0MTozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgYmludXRpbHMuYWxsL2NvbmZpZ3VyZS5pbjogQ2hhbmdlIGkzODYgdG8KLQlpWzM0NV04Ni4KLQotVHVlIEp1bCAxOSAxNToyMzo1MyAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC1taXBzLWVjb2ZmOiBBZGQgLVRpZHAubGQgb3B0aW9uLgotCi1UaHUgSnVuIDMwIDEyOjQxOjU1IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBVc2Ugbm0ubmV3LCBub3Qgbm0sIGZyb20gbmV3bHkgYnVpbHQgdHJlZS4KLQotVHVlIE1heSAxNyAxNDowNDowNSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCwgY29uZmlnL3VuaXguZXhwOiBSZXBsYWNlIGVycm9yCi0JICBwcm9jIGNhbGxzIHdpdGggcGVycm9yLgotCi1UdWUgTWF5IDEwIDExOjIwOjU0IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChzcGFyY2xpdGUpOiBNYXRjaCBvbiBzcGFyY2xpdGUqLSotKi4KLQotV2VkIEFwciAxMyAxODoyNToxOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdW5peC5leHA6IFVzZSBubS5uZXcsIG5vdCBubSwgZnJvbSBuZXdseSBidWlsdCB0cmVlLgotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IEFkZCBtb3JlIHdpbGRjYXJkcyB0byBsaXN0IG9mCi0Jc2luZ2xlLWxldHRlciBvcHRpb25zIGluIHBhdHRlcm4gZm9yIHVzYWdlIG1lc3NhZ2UuCi0KLQkqIGJpbnV0aWxzLmFsbC9ubS5leHA6IERlbGV0ZWQgZGVidWctc3ltYm9scyB0ZXN0LCBzaW5jZSBpdCBvbmx5Ci0Jd29ya3MgZm9yIGEub3V0L3N0YWJzIHN5c3RlbXMuICBGaXhlZCByZWdleHBzIHRvIG1ha2UgdW5kZXJzY29yZXMKLQlvcHRpb25hbCwgc2luY2Ugc29tZSBDIGNvbXBpbGVycyBkb24ndCBwcmVwZW5kIHRoZW0uICBEZWxldGVkCi0JY2hlY2sgZm9yIGZvby5vIHN5bWJvbCwgc2luY2UgYWdhaW4gc29tZSBzeXN0ZW1zIGRvbid0IGdlbmVyYXRlCi0JaXQuCi0KLU1vbiBBcHIgMTEgMTA6MzE6MDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBTZXQgVENMX0xJQlJBUlkgZm9yIHJ1bnRlc3QuCi0KLU1vbiBGZWIgMTQgMTk6MzQ6MDMgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVXNlIG5ldyBjb25maWcgZmVhdHVyZXMgb2YgRGVqYUdudSBpbiBzaXRlLmV4cAotCWZpbGUuICJNYWtlIGNoZWNrIiBzaG91bGQgbm93IHdvcmsgZm9yIGFsbCBjcm9zc2VzLgotCi1GcmkgSmFuIDI4IDE4OjAwOjI5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogSW4gdXNhZ2UgbWVzc2FnZSwgYWNjZXB0Ci0JInNlY3Rpb24tbmFtZSIgYXMgd2VsbCBhcyAic2VjdGlvbl9uYW1lIi4KLQotTW9uIEphbiAxNyAxNjo1NzowMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBiaW51dGlscy5hbGwvb2JqZHVtcC5leHA6IFRyaW0gbGlzdCBvZiBmb3JtYXQgbmFtZXMgZXhwZWN0ZWQsCi0JYW5kIGFjY2VwdCBhbnkga25vd24gQ1BVIHR5cGUuCi0KLVRodSBEZWMgIDIgMjA6NTA6MjQgMTk5MyAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHNvbWUgc3R1ZmYgZnJvbSB0aGUgc2l0ZS5leHAgZmlsZS4KLQkqIGNvbmZpZy91bml4LmV4cDogQWRkIGdsb2JhbCBiZWZvcmUgc2VlaW5nIGlmIHRoZSB2YXJpYWJsZXMgZm9yCi0Jbm0sIG9iamR1bXAsIGFuZCBzaXplIGV4aXN0LgotCi1XZWQgTm92ICAzIDExOjEyOjMyIDE5OTMgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3VkaS5leHAsdW5peC5leHA6IFRyYW5zZm9ybSB0b29sIG5hbWUuCi0JKiBiaW51dGlscy5hbGwvKi5leHA6IENsZWFyIGVycm9ySW5mbyBhZnRlciBleGVjLgotCi1GcmkgSnVsICAyIDEyOjQxOjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmludXRpbHMuYWxsLyouZXhwOiBVc2UgLS0gZm9yIGxvbmcgYXJndW1lbnRzIHJhdGhlciB0aGFuICsuCi0KLUZyaSBKdW4gIDQgMTA6NTI6MjkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGNoYW5nZSBzcmN0cmlnZ2VyIHRvIE1ha2VmaWxlLmluIAotCi1XZWQgTWF5IDI2IDE3OjI3OjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBQYXNzIGRvd24gQ0MgYW5kIENGTEFHUy4KLQotRnJpIE1heSAgNyAxMzo1ODo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC9vYmpkdW1wLmV4cDogVXBkYXRlIGZvciBuZXcgdXNhZ2UgbWVzc2FnZS4KLQotTW9uIEFwciAxOSAxNDowODo1MiAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzLmFsbC8qLmV4cDogVXNlIHRoZSBuZXcgdXRpbF90ZXN0IHByb2MuCi0JKiBNYWtlZmlsZS5pbjogQ3JlYXRlIGEgbG9jYWwgc2l0ZS5leHAgZmlsZSB3aXRoIGNvbmZpZyBpbmZvLgotCi1UaHUgTWFyIDI1IDA1OjM4OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBubS5hbGwvY29uZmlndXJlLmluIChzcmNuYW1lKTogRGVsZXRlIGV4dHJhIHF1b3RlLgotCi1Nb24gRmViIDIyIDA3OjU0OjAzIDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBiaW51dGlscy90ZXN0c3VpdGU6IG1hZGUgbW9kaWZpY2F0aW9ucyB0byB0ZXN0Y2FzZXMsIGV0Yy4sIHRvIGFsbG93Ci0gICAgICAgIHRoZW0gdG8gd29yayBwcm9wZXJseSAgZ2l2ZW4gdGhlIHJlb3JnYW5pemF0aW9uIG9mIGRlamEtZ251IGFuZCB0aGUKLSAgICAgICAgcmVsb2NhdGlvbiBvZiB0aGUgdGVzdGNhc2VzIGZyb20gZGVqYS1nbnUgdG8gYSAidG9vbCIgc3ViZGlyZWN0b3J5LgotCi1TdW4gRmViIDIxIDEwOjU1OjU1IDE5OTMgIE1pa2UgV2VybmVyICAobXR3QHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGJpbnV0aWxzL3Rlc3RzdWl0ZTogSW5pdGlhbCBjcmVhdGlvbiBvZiBiaW51dGlscy90ZXN0c3VpdGUuCi0JTWlncmF0ZWQgZGVqYWdudSB0ZXN0Y2FzZXMgYW5kIHN1cHBvcnQgZmlsZXMgZm9yIHRlc3Rpbmcgbm0gdG8KLQliaW51dGlscy90ZXN0c3VpdGUgZnJvbSBkZWphLWdudS4gIFRoZXNlIGZpbGVzIHdlcmUgbW92ZWQgImFzIGlzIgotCXdpdGggbm8gbW9kaWZpY2F0aW9ucy4gIFRoaXMgbWlncmF0aW9uIGlzIHBhcnQgb2YgYSBtYWpvciBvdmVyaGF1bAotCW9mIGRlamFnbnUuICBUaGUgbW9kaWZpY2F0aW9ucyB0byB0aGVzZSB0ZXN0Y2FzZXMsIGV0Yy4sIHdoaWNoCi0Jd2lsbCBhbGxvdyB0aGVtIHRvIHdvcmsgd2l0aCB0aGUgbmV3IHZlcnNpb24gb2YgZGVqYWdudSB3aWxsIGJlCi0JbWFkZSBpbiBhIGZ1dHVyZSB1cGRhdGUuCi0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvYXIuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9hci5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMzhjNmIuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9hci5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRBUl0gPT0gMH0gdGhlbiB7Ci0gICAgICAgIHBlcnJvciAiJEFSIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLSMgc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJEFSXSIKLQotIyBUZXN0IGxvbmcgZmlsZSBuYW1lIHN1cHBvcnQKLQotcHJvYyBsb25nX2ZpbGVuYW1lcyB7IH0gewotICAgIGdsb2JhbCBBUgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCB0ZXN0bmFtZSAiYXIgbG9uZyBmaWxlIG5hbWVzIgotCi0gICAgc2V0IG4xICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEiCi0gICAgc2V0IG4yICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejIiCi0gICAgc2V0IGZpbGUxIHRtcGRpci8kbjEKLSAgICBzZXQgZmlsZTIgdG1wZGlyLyRuMgotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlICRmaWxlMQotCi0gICAgIyBTb21lIGZpbGUgc3lzdGVtcyB0cnVuY2F0ZSBmaWxlIG5hbWVzIGF0IDE0IGNoYXJhY3RlcnMsIHdoaWNoCi0gICAgIyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHJ1biB0aGlzIHRlc3QuICBDaGVjayBmb3IgdGhhdCBub3cuCi0gICAgc2V0IHN0YXR1cyBbY2F0Y2ggInNldCBmIFtvcGVuIHRtcGRpci8kbjEgd10iIGVycnNdCi0gICAgaWYgeyAkc3RhdHVzICE9IDAgfSB7Ci0JdmVyYm9zZSAtbG9nICJvcGVuIHRtcGRpci8kbjEgcmV0dXJuZWQgJGVycnMiCi0JdW5zdXBwb3J0ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIHB1dHMgJGYgImZpcnN0IgotICAgIGNsb3NlICRmCi0KLQotICAgIHJlbW90ZV9maWxlIGJ1aWxkIGRlbGV0ZSAkZmlsZTIKLQotICAgIHNldCBzdGF0dXMgW2NhdGNoICJzZXQgZiBbb3BlbiB0bXBkaXIvJG4yIHddIiBlcnJzXQotICAgIGlmIHsgJHN0YXR1cyAhPSAwIH0gewotCXZlcmJvc2UgLWxvZyAib3BlbiB0bXBkaXIvJG4yIHJldHVybmVkICRlcnJzIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLSAgICBwdXRzICRmICJzZWNvbmQiCi0gICAgY2xvc2UgJGYKLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBmaWxlMSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJGZpbGUxXTsKLQlzZXQgZmlsZTIgW3JlbW90ZV9kb3dubG9hZCBob3N0ICRmaWxlMl07Ci0Jc2V0IGRlc3QgYXJ0ZXN0LmEKLSAgICB9IGVsc2UgewotCXNldCBkZXN0IHRtcGRpci9hcnRlc3QuYQotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRkZXN0OwotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGRlc3QgJGZpbGUxICRmaWxlMiJdCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRmaWxlMSB0bXBkaXIvJG4xCi0gICAgfQotCi0gICAgc2V0IGYgW29wZW4gdG1wZGlyLyRuMSByXQotICAgIGdldHMgJGYgc3RyaW5nCi0gICAgY2xvc2UgJGYKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiZmlyc3QiICRzdHJpbmddIHsKLQl2ZXJib3NlIC1sb2cgInJlYWRpbmcgdG1wZGlyLyRuMSByZXR1cm5lZCAkc3RyaW5nIgotCXVuc3VwcG9ydGVkICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRkZXN0OwotICAgIHNldCBnb3QgW2JpbnV0aWxzX3J1biAkQVIgInJjICRkZXN0ICRmaWxlMSAkZmlsZTIiXQotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci8kbjEKLSAgICByZW1vdGVfZmlsZSBidWlsZCBkZWxldGUgdG1wZGlyLyRuMgotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAidCAkZGVzdCJdCi0gICAgcmVnc3ViICJcW1xyXG4gXHRcXSokIiAiJGdvdCIgIiIgZ290OwotICAgIGlmICFbc3RyaW5nIG1hdGNoICIkbjEqJG4yIiAkZ290XSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX2ZpbGUgaG9zdCBkZWxldGUgJGZpbGUxOwotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRmaWxlMjsKLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRBUiB4ICRkZXN0IgotICAgIHNldCBleGVjX291dHB1dCBbYmludXRpbHNfcnVuICRBUiAieCAkZGVzdCJdCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0JcmVtb3RlX3VwbG9hZCBob3N0ICRuMSB0bXBkaXIvJG4xOwotCXJlbW90ZV91cGxvYWQgaG9zdCAkbjIgdG1wZGlyLyRuMjsKLQlzZXQgZmlsZTEgdG1wZGlyLyRuMQotCXNldCBmaWxlMiB0bXBkaXIvJG4yCi0gICAgfSBlbHNlIHsKLQlzZXQgZmlsZTEgJG4xCi0Jc2V0IGZpbGUyICRuMgotICAgIH0KLQotICAgIGlmICFbZmlsZSBleGlzdHMgJGZpbGUxXSB7Ci0JdmVyYm9zZSAtbG9nICIkZmlsZTEgZG9lcyBub3QgZXhpc3QiCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgaWYgIVtmaWxlIGV4aXN0cyAkZmlsZTJdIHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMiBkb2VzIG5vdCBleGlzdCIKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHNldCBmIFtvcGVuICRmaWxlMSByXQotICAgIGlmIHsgW2dldHMgJGYgbGluZV0gPT0gLTEgfHwgJGxpbmUgIT0gImZpcnN0IiB9IHsKLQl2ZXJib3NlIC1sb2cgIiRmaWxlMSBjb250ZW50czoiCi0JdmVyYm9zZSAtbG9nICIkbGluZSIKLQljbG9zZSAkZgotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotICAgIGNsb3NlICRmCi0KLSAgICBzZXQgZiBbb3BlbiAkZmlsZTIgcl0KLSAgICBpZiB7IFtnZXRzICRmIGxpbmVdID09IC0xIHx8ICRsaW5lICE9ICJzZWNvbmQiIH0gewotCXZlcmJvc2UgLWxvZyAiJGZpbGUyIGNvbnRlbnRzOiIKLQl2ZXJib3NlIC1sb2cgIiRsaW5lIgotCWNsb3NlICRmCi0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0gICAgY2xvc2UgJGYKLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgVGVzdCBidWlsZGluZyB0aGUgc3ltYm9sIHRhYmxlLgotCi1wcm9jIHN5bWJvbF90YWJsZSB7IH0gewotICAgIGdsb2JhbCBBUgotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdG5hbWUgImFyIHN5bWJvbCB0YWJsZSIKLQotICAgIGlmICFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgYXJjaGl2ZSBhcnRlc3QuYQotCXNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotCXJlbW90ZV9maWxlIGhvc3QgZGVsZXRlICRhcmNoaXZlCi0gICAgfSBlbHNlIHsKLQlzZXQgYXJjaGl2ZSB0bXBkaXIvYXJ0ZXN0LmEKLQlzZXQgb2JqZmlsZSB0bXBkaXIvYmludGVzdC5vCi0gICAgfQotCi0gICAgcmVtb3RlX2ZpbGUgYnVpbGQgZGVsZXRlIHRtcGRpci9hcnRlc3QuYQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRBUiAicmMgJGFyY2hpdmUgJHtvYmpmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gewotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiLS1wcmludC1hcm1hcCAkYXJjaGl2ZSJdCi0gICAgaWYgeyAhW3N0cmluZyBtYXRjaCAiKnRleHRfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgIVtzdHJpbmcgbWF0Y2ggIipkYXRhX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8ICFbc3RyaW5nIG1hdGNoICIqY29tbW9uX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSBcCi0JIHx8IFtzdHJpbmcgbWF0Y2ggIipzdGF0aWNfdGV4dF9zeW1ib2wgaW4gYmludGVzdC5vKiIgJGdvdF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqc3RhdGljX2RhdGFfc3ltYm9sIGluIGJpbnRlc3QubyoiICRnb3RdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKmV4dGVybmFsX3N5bWJvbCBpbiBiaW50ZXN0Lm8qIiAkZ290XSB9IHsKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cy4KLQotbG9uZ19maWxlbmFtZXMKLXN5bWJvbF90YWJsZQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9iaW50ZXN0LnMgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMDY1MC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2JpbnRlc3QucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQkuZ2xvYmwgdGV4dF9zeW1ib2wKLQkudGV4dAotdGV4dF9zeW1ib2w6CQotc3RhdGljX3RleHRfc3ltYm9sOgotCS5sb25nCTEKLQkubG9uZwlleHRlcm5hbF9zeW1ib2wKLQkuZ2xvYmwgZGF0YV9zeW1ib2wKLQkuZGF0YQotZGF0YV9zeW1ib2w6Ci1zdGF0aWNfZGF0YV9zeW1ib2w6Ci0JLmxvbmcJMgotCS5jb21tIGNvbW1vbl9zeW1ib2wsNApkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL2FkZGVuZGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTkzMDZmLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvaHBwYS9hZGRlbmRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGluaXRpYWxpemVfY2hhcl9zeW50YXgsQ09ERQotCS5FWFBPUlQgaW5pdGlhbGl6ZV9jaGFyX3N5bnRheCxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotaW5pdGlhbGl6ZV9jaGFyX3N5bnRheAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LE5PX0NBTExTLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCWFkZGlsIEwnaXNfaWRjaGFyLSRnbG9iYWwkLTMyLCVyMjcKLQkuRVhJVAotCS5QUk9DRU5ECi1pc19pZGNoYXIJLmNvbW0gMjU2CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL2hwcGEvb2JqZHVtcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NmIyODkuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ocHBhL29iamR1bXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotIyAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIGJ1Zy1kZWphZ251QHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb2IgU2F2b3llIDxyb2JAY3lnbnVzLmNvbT4KLSMgYW5kIHJld3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICByZXR1cm4KLX0KLQotaWYge1t3aGljaCAkT0JKRFVNUF0gPT0gMH0gdGhlbiB7Ci0gICAgcGVycm9yICIkT0JKRFVNUCBkb2VzIG5vdCBleGlzdCIKLSAgICByZXR1cm4KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE9CSkRVTVBdIgotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYWRkZW5kYnVnLnMgdG1wZGlyL2FkZGVuZGJ1Zy5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCBvYmpmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYWRkZW5kYnVnLm9dCi19IGVsc2UgewotICAgIHNldCBvYmpmaWxlIHRtcGRpci9hZGRlbmRidWcubwotfQotCi0jIE1ha2Ugc3VyZSB0aGUgU09NIEJGRCBjb2RlIHNpZ24gZXh0ZW5kcyBjb25zdGFudHMgaW4gUl9EQVRBX09WRVJSSURFIGZpeHVwcy4KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1yICRvYmpmaWxlIl0KLQotaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotICBzZXQgd2FudCAiMDAwMDAwMDAgUl9QQVJJU0NfRFBSRUwyMUxcWyAJXF0raXNfaWRjaGFyXFwrMHhmZmZmZmZlMC4qIgotfSBlbHNlIHsKLSAgc2V0IHdhbnQgIjAwMDAwMDAwIFJfRFBfUkVMQVRJVkVcWyAJXF0raXNfaWRjaGFyXFwrMHhmZmZmZmZlMC4qIgotfQotCi0KLWlmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgcGFzcyAiYWRkZW5kYnVnIHRlc3QiCi19IGVsc2UgewotICAgIGZhaWwgImFkZGVuZGJ1ZyB0ZXN0IgotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9ubS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL25tLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjN2M1Zi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL25tLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgcmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkTk1dID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiROTSBkb2VzIG5vdCBleGlzdCIKLSAgICAgICAgcmV0dXJuCi0gICAgfQotfQotCi1zZW5kX3VzZXIgIlZlcnNpb24gW2JpbnV0aWxfdmVyc2lvbiAkTk1dIgotCi0KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHJldHVybgotfQotCi1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi19IGVsc2UgewotICAgIHNldCB0ZW1wZmlsZSB0bXBkaXIvYmludGVzdC5vCi19Ci0KLSMgVGVzdCBubSB3aXRoIG5vIGFyZ3VtZW50cy4KLQotIyBUaGlzIHRlc3QgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgb24gRUNPRkYgdGFyZ2V0cywgYmVjYXVzZSBFQ09GRgotIyBzdG9yZXMgbW9zdCBzeW1ib2xzIHR3aWNlLCB3aGljaCBtZXNzZXMgdXAgdGhlIG5tIG91dHB1dC4KLXNldHVwX3hmYWlsICJhbHBoYSotKi1vc2YqIiAiYWxwaGEqLSotbmV0d2FyZSoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi11bHRyaXgqIiAibWlwcyotKi1lY29mZioiICJtaXBzKi0qLWlyaXg0KiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLXJpc2NvcyoiICJtaXBzKi0qLXN5c3YzKiIgIm1pcHMqLXNvbnktYnNkKiIKLQotIyBUaGlzIHRlc3QgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgb24gWENPRkYgdGFyZ2V0cywgYmVjYXVzZSBYQ09GRgotIyBkb2VzIG5vdCBlbnRlciBzdGF0aWMgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlLgotc2V0dXBfeGZhaWwgIiotKi1haXgqIgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAkdGVtcGZpbGUiXQotCi1pZiBbaW5mbyBleGlzdHMgdmFyc10gdGhlbiB7IHVuc2V0IHZhcnMgfQotd2hpbGUge1tyZWdleHAgIihcW2EtekEtWlxdKSAoXFthLXpfXF0qX3N5bWJvbCkoLiopIiAkZ290IGFsbCB0eXBlIHN5bWJvbCByZXN0XX0gewotICAgIHNldCB2YXJzKCRzeW1ib2wpICR0eXBlCi0gICAgc2V0IGdvdCAkcmVzdAotfQotCi1pZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRleHRfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyh0ZXh0X3N5bWJvbCkgIT0gIlQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGRhdGFfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhkYXRhX3N5bWJvbCkgIT0gIkQiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGNvbW1vbl9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKGNvbW1vbl9zeW1ib2wpICE9ICJDIiBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhleHRlcm5hbF9zeW1ib2wpXSBcCi0gICAgIHx8ICR2YXJzKGV4dGVybmFsX3N5bWJvbCkgIT0gIlUiIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKHN0YXRpY190ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgJHZhcnMoc3RhdGljX3RleHRfc3ltYm9sKSAhPSAidCIgXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX2RhdGFfc3ltYm9sKV0gXAotICAgICB8fCAkdmFycyhzdGF0aWNfZGF0YV9zeW1ib2wpICE9ICJkIn0gewotICAgIGZhaWwgIm5tIChubyBhcmd1bWVudHMpIgotfSBlbHNlIHsKLSAgICBwYXNzICJubSAobm8gYXJndW1lbnRzKSIKLX0KLQotIyBUZXN0IG5tIC1nCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkTk0gIiROTUZMQUdTIC1nICR0ZW1wZmlsZSJdCi0KLWlmIFtpbmZvIGV4aXN0cyB2YXJzXSB0aGVuIHsgdW5zZXQgdmFycyB9Ci13aGlsZSB7W3JlZ2V4cCAiKFxbYS16X1xdKl9zeW1ib2wpKC4qKSIgJGdvdCBhbGwgc3ltYm9sIHJlc3RdfSB7Ci0gICAgc2V0IHZhcnMoJHN5bWJvbCkgMQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyFbaW5mbyBleGlzdHMgdmFycyh0ZXh0X3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGRhdGFfc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoY29tbW9uX3N5bWJvbCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyB2YXJzKGV4dGVybmFsX3N5bWJvbCldIFwKLSAgICAgfHwgW2luZm8gZXhpc3RzIHZhcnMoc3RhdGljX3RleHRfc3ltYm9sKV0gXAotICAgICB8fCBbaW5mbyBleGlzdHMgdmFycyhzdGF0aWNfZGF0YV9zeW1ib2wpXX0gewotICAgIGZhaWwgIm5tIC1nIgotfSBlbHNlIHsKLSAgICBwYXNzICJubSAtZyIKLX0KLQotIyBUZXN0IG5tIC1QCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIEVDT0ZGIHRhcmdldHMsIGJlY2F1c2UgRUNPRkYKLSMgc3RvcmVzIG1vc3Qgc3ltYm9scyB0d2ljZSwgd2hpY2ggbWVzc2VzIHVwIHRoZSBubSBvdXRwdXQuCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotb3NmKiIgImFscGhhKi0qLW5ldHdhcmUqIgotc2V0dXBfeGZhaWwgIm1pcHMqLSotdWx0cml4KiIgIm1pcHMqLSotZWNvZmYqIiAibWlwcyotKi1pcml4NCoiCi1zZXR1cF94ZmFpbCAibWlwcyotKi1yaXNjb3MqIiAibWlwcyotKi1zeXN2MyoiICJtaXBzKi1zb255LWJzZCoiCi0KLSMgVGhpcyB0ZXN0IGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IG9uIFhDT0ZGIHRhcmdldHMsIGJlY2F1c2UgWENPRkYKLSMgZG9lcyBub3QgZW50ZXIgc3RhdGljIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLXNldHVwX3hmYWlsICIqLSotYWl4KiIKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICROTSAiJE5NRkxBR1MgLVAgJHRlbXBmaWxlIl0KLQotc2V0IHdhbnQgImNvbW1vbl9zeW1ib2wgQyBcWzBcXSo0LipkYXRhX3N5bWJvbCBEIFxbMC05YS1mQS1GXF0qLipleHRlcm5hbF9zeW1ib2wgVS4qc3RhdGljX2RhdGFfc3ltYm9sIGQgXFswLTlhLWZBLUZcXSouKnN0YXRpY190ZXh0X3N5bWJvbCB0IFxbMC05YS1mQS1GXF0qLip0ZXh0X3N5bWJvbCBUIFxbMC05YS1mQS1GXF0qIgotCi1pZiBbcmVnZXhwICR3YW50ICRnb3RdIHRoZW4gewotICAgIHBhc3MgIm5tIC1QIgotfSBlbHNlIHsKLSAgICBmYWlsICJubSAtUCIKLX0KLQotIyBUaGVyZSBhcmUgY2VydGFpbmx5IG90aGVyIHRlc3RzIHRoYXQgY291bGQgYmUgcnVuLgpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvb2JqY29weS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OTcyZjEuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpjb3B5LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDU5MSArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotaWYgIVtpc19yZW1vdGUgaG9zdF0gewotICAgIGlmIHtbd2hpY2ggJE9CSkNPUFldID09IDB9IHRoZW4gewotICAgICAgICBwZXJyb3IgIiRPQkpDT1BZIGRvZXMgbm90IGV4aXN0IgotICAgICAgICByZXR1cm4KLSAgICB9Ci19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRPQkpDT1BZXSIKLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcGVycm9yICJ1bnJlc29sdmVkIDEiCi0gICAgdW5yZXNvbHZlZCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotICAgIHJldHVybgotfQotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlbXBmaWxlIHRtcGRpci9iaW50ZXN0Lm87Ci0gICAgc2V0IGNvcHlmaWxlIHRtcGRpci9jb3B5OwotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi0gICAgc2V0IGNvcHlmaWxlIGNvcHkKLX0KLQotIyBUZXN0IHRoYXQgb2JqY29weSBkb2VzIG5vdCBtb2RpZnkgYSBmaWxlIHdoZW4gY29weWluZyBpdC4KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vIl0KLQotaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0gICAgZmFpbCAib2JqY29weSAoc2ltcGxlIGNvcHkpIgotfSBlbHNlIHsKLSAgICBzZW5kX2xvZyAiY21wICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vXG4iCi0gICAgdmVyYm9zZSAiY21wICR0ZW1wZmlsZSAke2NvcHlmaWxlfS5vIgotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXNldCBzcmMxIHRtcGRpci9iaW50ZXN0Lm8KLQlzZXQgc3JjMiB0bXBkaXIvY29weS5vCi0JcmVtb3RlX3VwbG9hZCBob3N0ICR0ZW1wZmlsZSAkc3JjMTsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHtjb3B5ZmlsZX0ubyAkc3JjMjsKLSAgICB9IGVsc2UgewotCXNldCBzcmMxICR7dGVtcGZpbGV9Ci0Jc2V0IHNyYzIgJHtjb3B5ZmlsZX0ubwotICAgIH0KLSAgICBzZXQgc3RhdHVzIFtyZW1vdGVfZXhlYyBidWlsZCBjbXAgIiR7c3JjMX0gJHtzcmMyfSJdOwotICAgIHNldCBleGVjX291dHB1dCBbbGluZGV4ICRzdGF0dXMgMV07Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICAjIE9uIHNvbWUgc3lzdGVtcyB0aGUgcmVzdWx0IG9mIG9iamNvcHkgd2lsbCBub3QgYmUgaWRlbnRpY2FsLgotICAgICMgVXN1YWxseSB0aGlzIGlzIGp1c3QgYmVjYXVzZSBnYXMgaXNuJ3QgdXNpbmcgYmZkIHRvIHdyaXRlIHRoZSBmaWxlcwotICAgICMgaW4gdGhlIGZpcnN0IHBsYWNlLCBhbmQgbWF5IG9yZGVyIHRoaW5ncyBhIGxpdHRsZSBkaWZmZXJlbnRseS4KLSAgICAjIFRob3NlIHN5c3RlbXMgc2hvdWxkIHVzZSBzZXR1cF94ZmFpbCBoZXJlLgotCi0gICAgc2V0dXBfeGZhaWwgInNoLSotY29mZiIgInNoLSotaG1zIiAKLSAgICBzZXR1cF94ZmFpbCAibTY4Ki0qLWhwdXgqIiAibTY4Ki0qLXN1bm9zKiIgIm02OCotKi1jb2ZmIiAibTY4Ki0qLXZ4d29ya3MqIgotICAgIHNldHVwX3hmYWlsICJtNjgqLWVyaWNzc29uLW9zZSIgIm02OGsqLW1vdG9yb2xhLXN5c3YqIgotICAgIHNldHVwX3hmYWlsICJpKjg2LSotbGludXhhb3V0KiIgImkqODYtKi1hb3V0KiIKLSAgICBzZXR1cF94ZmFpbCAiaSo4Ni0qLXN5c3YzIiAiaSo4Ni0qLWlzYyoiICJpKjg2LSotc2NvKiIgImkqODYtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJpKjg2LSotYWl4KiIgImkqODYtKi1nbzMyKiIKLSAgICBzZXR1cF94ZmFpbCAiYTI5ay0qLXVkaSIgImEyOWstKi1jb2ZmIiAiYTI5ay0qLXZ4d29ya3MqIgotICAgIHNldHVwX3hmYWlsICJpOTYwLSotY29mZiIKLSAgICBzZXR1cF94ZmFpbCAiaDgzMDAtKi1obXMiICJoODMwMC0qLWNvZmYiCi0gICAgc2V0dXBfeGZhaWwgImg4NTAwLSotaG1zIiAiaDg1MDAtKi1jb2ZmIgotICAgIHNldHVwX3hmYWlsICJocHBhKi0qLSoiCi0gICAgY2xlYXJfeGZhaWwgImhwcGEqLSotKmVsZioiCi0gICAgc2V0dXBfeGZhaWwgIm04OCotKi1jb2ZmIiAibTg4Ki1tb3Rvcm9sYS1zeXN2KiIKLSAgICBzZXR1cF94ZmFpbCAiejgqLSotY29mZiIKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlwYXNzICJvYmpjb3B5IChzaW1wbGUgY29weSkiCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IiAxCi0KLQkjIE9uIE9TRi8xLCB0aGlzIHN1Y2NlZWRzIHdpdGggZ2FzIGFuZCBmYWlscyB3aXRoIC9iaW4vYXMuCi0Jc2V0dXBfeGZhaWwgImFscGhhKi0qLW9zZioiCi0KLQkjIFRoaXMgZmFpbHMgZm9yIENPRkYgaTk2MC12eHdvcmtzIHRhcmdldHMuCi0Jc2V0dXBfeGZhaWwgImk5NjAtKi12eHdvcmtzKiIKLQotCWZhaWwgIm9iamNvcHkgKHNpbXBsZSBjb3B5KSIKLSAgICB9Ci19Ci0KLSMgVGVzdCBnZW5lcmF0aW5nIFMgcmVjb3Jkcy4KLQotIyBXZSBtYWtlIHRoZSBzcmVjIGZpbGVuYW1lIDguMyBjb21wYXRpYmxlLiBOb3RlIHRoYXQgdGhlIGhlYWRlciBzdHJpbmcKLSMgbWF0Y2hlZCBhZ2FpbnN0IGRlcGVuZHMgb24gdGhlIG5hbWUgb2YgdGhlIGZpbGUuIFVnaC4KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHNyZWNmaWxlIGNvcHkuc3JlCi0gICAgc2V0IGhlYWRlcl9zdHJpbmcgUzAwQjAwMDA2MzZGNzA3OTJFNzM3MjY1QzEKLX0gZWxzZSB7Ci0gICAgc2V0IHNyZWNmaWxlICR7Y29weWZpbGV9LnNyZWMKLSAgICBzZXQgaGVhZGVyX3N0cmluZyBTMDEzMDAwMDc0NkQ3MDY0Njk3MjJGNjM2RjcwNzkyRTczNzI2NTYzOTcKLX0KLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7c3JlY2ZpbGV9Il0KLQotaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0gICAgZmFpbCAib2JqY29weSAtTyBzcmVjIgotfSBlbHNlIHsKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlyZW1vdGVfdXBsb2FkIGhvc3QgJHtzcmVjZmlsZX0gdG1wZGlyL2NvcHkuc3JlYzsKLQlzZXQgc3JlY2ZpbGUgdG1wZGlyL2NvcHkuc3JlYzsKLSAgICB9Ci0gICAgc2V0IGZpbGUgW29wZW4gJHtzcmVjZmlsZX0gcl0KLQotICAgICMgVGhlIGZpcnN0IFMgcmVjb3JkIGlzIGZpeGVkIGJ5IHRoZSBmaWxlIG5hbWUgd2UgYXJlIHVzaW5nLgotICAgIGdldHMgJGZpbGUgbGluZQotICAgIHNlbmRfbG9nICIkbGluZVxuIgotICAgIHZlcmJvc2UgJGxpbmUKLSAgICBpZiAhW3JlZ2V4cCAiJGhlYWRlcl9zdHJpbmcuKiIgJGxpbmVdIHsKLQlzZW5kX2xvZyAiYmFkIGhlYWRlclxuIgotCWZhaWwgIm9iamNvcHkgLU8gc3JlYyIKLSAgICB9IGVsc2UgewotCXdoaWxlIHtbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMSBcCi0JICAgICAgICYmIFtyZWdleHAgIl5TXFsxMjNcXVxbMC05YS1mQS1GXF0rXFtcclxuXF0qJCIgJGxpbmVdfSB7Ci0JICAgIHNlbmRfbG9nICIkbGluZVxuIgotCSAgICB2ZXJib3NlICRsaW5lCi0JICAgIHNldCBsaW5lICIqKkVPRioqIgotCX0KLQlzZW5kX2xvZyAiJGxpbmVcbiIKLQl2ZXJib3NlICRsaW5lCi0JaWYgIVtyZWdleHAgIl5TXFs3ODlcXVxbMC05YS1mQS1GXF0rXFtcclxuXF0qJCIgJGxpbmVdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiYmFkIHRyYWlsZXJcbiIKLQkgICAgZmFpbCAib2JqY29weSAtTyBzcmVjIgotCX0gZWxzZSB7Ci0JICAgIGlmIHtbZ2V0cyAkZmlsZSBsaW5lXSAhPSAtMX0gdGhlbiB7Ci0JCXNlbmRfbG9nICJnYXJiYWdlIGF0IGVuZFxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJdmVyYm9zZSAkbGluZQotCQlmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi0JICAgIH0gZWxzZSB7Ci0JCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAke2NvcHlmaWxlfS5zcmVjIl0KLQkJaWYgIVtyZWdleHAgImZpbGUgZm9ybWF0IHNyZWMiICRnb3RdIHRoZW4gewotCQkgICAgc2VuZF9sb2cgIm9iamR1bXAgZmFpbGVkXG4iCi0JCSAgICBmYWlsICJvYmpjb3B5IC1PIHNyZWMiCi0JCX0gZWxzZSB7Ci0JCSAgICBwYXNzICJvYmpjb3B5IC1PIHNyZWMiCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZQotfQotCi0jIFRlc3Qgc2V0dGluZyBhbmQgYWRqdXN0aW5nIHRoZSBzdGFydCBhZGRyZXNzLiAgV2Ugb25seSB0ZXN0IHRoaXMKLSMgd2hpbGUgZ2VuZXJhdGluZyBTIHJlY29yZHMsIGJlY2F1c2Ugd2UgbWF5IG5vdCBiZSBhYmxlIHRvIHNldCB0aGUKLSMgc3RhcnQgYWRkcmVzcyBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cywgYW5kIHRoZSBTIHJlY29yZCBjYXNlCi0jIGlzIHRoZSBvbmx5IHVzZWZ1bCBvbmUgYW55aG93LgotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWYgJHRlbXBmaWxlIl0KLWlmICFbcmVnZXhwICJzdGFydCBhZGRyZXNzIChcWzAtOWEtZkEtRnhYXF0rKSIgJGdvdCBhbGwgb3JpZ3N0YXJ0XSB0aGVuIHsKLSAgICBwZXJyb3IgIm9iamR1bXAgY2FuIG5vdCByZWNvZ25pemUgYmludGVzdC5vIgotICAgIHNldCBvcmlnc3RhcnQgIiIKLX0gZWxzZSB7Ci0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgLS1zZXQtc3RhcnQgMHg3NjU0Il0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlmYWlsICJvYmpjb3B5IC0tc2V0LXN0YXJ0IgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1mICR7Y29weWZpbGV9LnNyZWMiXQotCWlmICFbcmVnZXhwICJmaWxlIGZvcm1hdCBzcmVjLipzdGFydCBhZGRyZXNzIChcWzAtOWEtZkEtRnhYXF0rKSIgJGdvdCBhbGwgc3JlY3N0YXJ0XSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLXNldC1zdGFydCIKLQl9IGVsc2UgewotCSAgICBpZiB7JHNyZWNzdGFydCAhPSAweDc2NTR9IHRoZW4gewotCQlzZW5kX2xvZyAiJHNyZWNzdGFydCAhPSAweDc2NTRcbiIKLQkJZmFpbCAib2JqY29weSAtLXNldC1zdGFydCIKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAib2JqY29weSAtLXNldC1zdGFydCIKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkNPUFkgIiRPQkpDT1BZRkxBR1MgLU8gc3JlYyAkdGVtcGZpbGUgJHtjb3B5ZmlsZX0uc3JlYyAtLWFkanVzdC1zdGFydCAweDEyMyJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0JZmFpbCAib2JqY29weSAtLWFkanVzdC1zdGFydCIKLSAgICB9IGVsc2UgewotCXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAke2NvcHlmaWxlfS5zcmVjIl0KLQlpZiAhW3JlZ2V4cCAiZmlsZSBmb3JtYXQgc3JlYy4qc3RhcnQgYWRkcmVzcyAoXFswLTlhLWZBLUZ4WFxdKykiICRnb3QgYWxsIHNyZWNzdGFydF0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRzcmVjc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzfSB0aGVuIHsKLQkJc2VuZF9sb2cgIiRzcmVjc3RhcnQgIT0gJG9yaWdzdGFydCArIDB4MTIzXG4iCi0JCWZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtc3RhcnQiCi0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0jIFRlc3QgYWRqdXN0aW5nIHRoZSBvdmVyYWxsIFZNQSwgYW5kIGFkanVzdGluZyB0aGUgVk1BIG9mIGEKLSMgcGFydGljdWxhciBzZWN0aW9uLiAgV2UgYWdhaW4gb25seSB0ZXN0IHRoaXMgd2hlbiBnZW5lcmF0aW5nIFMKLSMgcmVjb3Jkcy4KLQotc2V0IGxvdyAiIgotc2V0IGxvd25hbWUgIiIKLQotc2V0IGhlYWRlcnMgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtaCAkdGVtcGZpbGUiXQotCi1zZXQgaGVhZGVyc19yZWdleHAgIlxbIAkwLTlcXSsoXFteIAlcXSspXFsgCVxdKihcWzAtOWEtZkEtRlxdKylcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsyXFsqXF1cWypcXVxbMC05XF0rKC4qKSIKLQotc2V0IGdvdCAkaGVhZGVycwotd2hpbGUge1tyZWdleHAgJGhlYWRlcnNfcmVnZXhwICRnb3QgYWxsIG5hbWUgc2l6ZSB2bWEgcmVzdF19IHsKLSAgICBzZXQgdm1hIDB4JHZtYQotICAgIHNldCBzaXplIDB4JHNpemUKLSAgICBpZiB7JHNpemUgIT0gMH0gewotCWlmIHskbG93ID09ICIiIHx8ICR2bWEgPCAkbG93fSB7Ci0gICAgICAgICAgICBzZXQgbG93ICR2bWEKLQkgICAgc2V0IGxvd25hbWUgJG5hbWUKLQl9Ci0gICAgfQotICAgIHNldCBnb3QgJHJlc3QKLX0KLQotaWYgeyRsb3cgPT0gIiIgfHwgJG9yaWdzdGFydCA9PSAiIn0gdGhlbiB7Ci0gICAgcGVycm9yICJvYmpkdW1wIGNhbiBub3QgcmVjb2duaXplIGJpbnRlc3QubyIKLX0gZWxzZSB7Ci0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgLS1hZGp1c3Qtdm1hIDB4MTIzIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLSAgICAgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC12bWEiCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWZoICR7Y29weWZpbGV9LnNyZWMiXQotCXNldCB3YW50ICJmaWxlIGZvcm1hdCBzcmVjLipzdGFydCBhZGRyZXNzXFsgCVxdKihcWzAtOWEtZkEtRnhYXF0rKS4qc2VjMVxbIAlcXStcWzAtOWEtZkEtRlxdK1xbIAlcXSsoXFswLTlhLWZBLUZcXSspIgotCWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHN0YXJ0IHZtYV0gdGhlbiB7Ci0JICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotCX0gZWxzZSB7Ci0JICAgIHNldCB2bWEgMHgkdm1hCi0JICAgIGlmIHskdm1hICE9ICRsb3cgKyAweDEyM30gdGhlbiB7Ci0JCXNlbmRfbG9nICIkdm1hICE9ICRsb3cgKyAweDEyM1xuIgotCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXZtYSIKLQkgICAgfSBlbHNlIHsKLQkJaWYgeyRzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjN9IHRoZW4gewotCQkgICAgc2VuZF9sb2cgIiRzdGFydCAhPSAkb3JpZ3N0YXJ0ICsgMHgxMjNcbiIKLQkJICAgIGZhaWwgIm9iamNvcHkgLS1hZGp1c3Qtdm1hIgotCQl9IGVsc2UgewotCQkgICAgcGFzcyAib2JqY29weSAtLWFkanVzdC12bWEiCi0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgICBzZXQgYXJnICIiCi0gICAgc2V0IGdvdCAkaGVhZGVycwotICAgIHdoaWxlIHtbcmVnZXhwICRoZWFkZXJzX3JlZ2V4cCAkZ290IGFsbCBuYW1lIHNpemUgdm1hIHJlc3RdfSB7Ci0Jc2V0IHZtYSAweCR2bWEKLQlpZiB7JHZtYSA9PSAkbG93fSB0aGVuIHsKLQkgICAgc2V0IGFyZyAiJGFyZyAtLWFkanVzdC1zZWN0aW9uLXZtYSAkbmFtZSs0IgotCX0KLQlzZXQgZ290ICRyZXN0Ci0gICAgfQotCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgJGFyZyJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0JZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgotICAgIH0gZWxzZSB7Ci0Jc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1oICR7Y29weWZpbGV9LnNyZWMiXQotCXNldCB3YW50ICJmaWxlIGZvcm1hdCBzcmVjLipzZWMxXFsgCVxdK1xbMC05YS1mQS1GXF0rXFsgCVxdKyhcWzAtOWEtZkEtRlxdKykiCi0JaWYgIVtyZWdleHAgJHdhbnQgJGdvdCBhbGwgdm1hXSB0aGVuIHsKLQkgICAgZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgotCX0gZWxzZSB7Ci0JICAgIHNldCB2bWEgMHgkdm1hCi0JICAgIGlmIHskdm1hICE9ICRsb3cgKyA0fSB0aGVuIHsKLQkJc2VuZF9sb2cgIiR2bWEgIT0gJGxvdyArIDRcbiIKLQkJZmFpbCAib2JqY29weSAtLWFkanVzdC1zZWN0aW9uLXZtYSArIgotCSAgICB9IGVsc2UgewotCQlwYXNzICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hICsiCi0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgcmVnc3ViIC1hbGwgIlxcKzQiICRhcmcgIj1bZXhwciAkbG93ICsgNF0iIGFyZ2VxCi0gICAgc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpDT1BZICIkT0JKQ09QWUZMQUdTIC1PIHNyZWMgJHRlbXBmaWxlICR7Y29weWZpbGV9LnNyZWMgJGFyZ2VxIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZ290XSB0aGVuIHsKLQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCi0gICAgfSBlbHNlIHsKLQlzZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHtjb3B5ZmlsZX0uc3JlYyJdCi0Jc2V0IHdhbnQgImZpbGUgZm9ybWF0IHNyZWMuKnNlYzFcWyAJXF0rXFswLTlhLWZBLUZcXStcWyAJXF0rKFxbMC05YS1mQS1GXF0rKSIKLQlpZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB2bWFdIHRoZW4gewotCSAgICBmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCi0JfSBlbHNlIHsKLQkgICAgc2V0IHZtYSAweCR2bWEKLQkgICAgaWYgeyR2bWEgIT0gJGxvdyArIDR9IHRoZW4gewotCQlzZW5kX2xvZyAiJHZtYSAhPSAkbG93ICsgNFxuIgotCQlmYWlsICJvYmpjb3B5IC0tYWRqdXN0LXNlY3Rpb24tdm1hID0iCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgIm9iamNvcHkgLS1hZGp1c3Qtc2VjdGlvbi12bWEgPSIKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLSMgVGVzdCBzdHJpcHBpbmcgYW4gb2JqZWN0LgotCi1wcm9jIHN0cmlwX3Rlc3QgeyB9IHsKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgU1RSSVAKLSAgICBnbG9iYWwgU1RSSVBGTEFHUwotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLQotICAgIHNldCB0ZXN0ICJzdHJpcCIKLQotICAgIGlmIHsgW3RhcmdldF9jb21waWxlICRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jIHRtcGRpci90ZXN0cHJvZy5vIG9iamVjdCBkZWJ1Z10gIT0gIiIgfSB7Ci0JdW50ZXN0ZWQgJHRlc3QKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgb2JqZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nLm9dOwotICAgIH0gZWxzZSB7Ci0Jc2V0IG9iamZpbGUgdG1wZGlyL3Rlc3Rwcm9nLm8KLSAgICB9Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkU1RSSVAgIiRTVFJJUEZMQUdTICRvYmpmaWxlIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICItYSAkTk1GTEFHUyAkb2JqZmlsZSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIio6IG5vIHN5bWJvbHMqIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgcGFzcyAkdGVzdAotfQotCi1zdHJpcF90ZXN0Ci0KLSMgVGVzdCBzdHJpcHBpbmcgYW4gb2JqZWN0IGZpbGUgd2l0aCBzYXZpbmcgYSBzeW1ib2wKLQotcHJvYyBzdHJpcF90ZXN0X3dpdGhfc2F2aW5nX2Ffc3ltYm9sIHsgfSB7Ci0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIFNUUklQCi0gICAgZ2xvYmFsIFNUUklQRkxBR1MKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0KLSAgICBzZXQgdGVzdCAic3RyaXAgd2l0aCBzYXZpbmcgYSBzeW1ib2wiCi0KLSAgICBpZiB7IFt0YXJnZXRfY29tcGlsZSAkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyB0bXBkaXIvdGVzdHByb2cubyBvYmplY3QgZGVidWddICE9ICIiIH0gewotCXVudGVzdGVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IG9iamZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZy5vXTsKLSAgICB9IGVsc2UgewotCXNldCBvYmpmaWxlIHRtcGRpci90ZXN0cHJvZy5vCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJFNUUklQICIkU1RSSVBGTEFHUyAtSyBtYWluIC1LIF9tYWluICRvYmpmaWxlIl0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAkb2JqZmlsZSJdCi0gICAgaWYgeyFbcmVnZXhwIHteKFswLTlhLWZBLUZdKyk/WyBdK1QgbWFpbn0gJGV4ZWNfb3V0cHV0XSBcCi0gICAgICAgICAmJiAhW3JlZ2V4cCB7XihbMC05YS1mQS1GXSspP1sgXStUIF9tYWlufSAkZXhlY19vdXRwdXRdfSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3QKLX0KLQotc3RyaXBfdGVzdF93aXRoX3NhdmluZ19hX3N5bWJvbAotCi0jIEJ1aWxkIGEgZmluYWwgZXhlY3V0YWJsZS4KLQotcHJvYyBjb3B5X3NldHVwIHsgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICAKLSAgICBzZXQgcmVzIFtidWlsZF93cmFwcGVyIHRlc3RnbHVlLm9dOwotICAgIHNldCBmbGFncyB7IGRlYnVnIH07Ci0gICAgCi0gICAgaWYgeyAkcmVzICE9ICIiIH0gewotCWxhcHBlbmQgZmxhZ3MgImFkZGl0aW9uYWxfZmxhZ3M9W2xpbmRleCAkcmVzIDFdIjsKLQlzZXQgYWRkX2xpYnMgInRlc3RnbHVlLm8iOwotICAgIH0gZWxzZSB7Ci0Jc2V0IGFkZF9saWJzICIiOwotICAgIH0KLQotICAgIGlmIHsgW3RhcmdldF9jb21waWxlICIkc3JjZGlyLyRzdWJkaXIvdGVzdHByb2cuYyAkYWRkX2xpYnMiIHRtcGRpci90ZXN0cHJvZyBleGVjdXRhYmxlICRmbGFnc10gICE9ICIiIH0gewotCXJldHVybiAyCi0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci90ZXN0cHJvZ107Ci0gICAgc2V0IHN0YXR1cyBbbGluZGV4ICRyZXN1bHQgMF07Ci0KLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiICB9IHsKLQlwZXJyb3IgInVucmVzb2x2ZWQgc2V0dXAsIHN0YXR1cyA9ICRzdGF0dXMiCi0JcmV0dXJuIDMKLSAgICB9Ci0KLSAgICByZXR1cm4gMAotfQotCi0jIFRlc3QgY29weWluZyBhbiBleGVjdXRhYmxlLgotCi1wcm9jIGNvcHlfZXhlY3V0YWJsZSB7IHByb2cgZmxhZ3MgdGVzdDEgdGVzdDIgfSB7Ci0KLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgdGVzdGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci90ZXN0cHJvZ107Ci0Jc2V0IHRlc3Rjb3B5IGNvcHlwcm9nCi0gICAgfSBlbHNlIHsKLQlzZXQgdGVzdGZpbGUgdG1wZGlyL3Rlc3Rwcm9nCi0Jc2V0IHRlc3Rjb3B5IHRtcGRpci9jb3B5cHJvZwotICAgIH0KLSAgICByZW1vdGVfZmlsZSBob3N0IGRlbGV0ZSAkdGVzdGNvcHk7Ci0KLSAgICBzZXQgZXhlY19vdXRwdXQgW2JpbnV0aWxzX3J1biAkcHJvZyAiJGZsYWdzICR0ZXN0ZmlsZSAkdGVzdGNvcHkiXQotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdDEKLQlmYWlsICR0ZXN0MgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAkdGVzdGNvcHkgdG1wZGlyL2NvcHlwcm9nCi0gICAgfQotCi0gICAgc2V0IHN0YXR1cyBbcmVtb3RlX2V4ZWMgYnVpbGQgImNtcCIgInRtcGRpci90ZXN0cHJvZyB0bXBkaXIvY29weXByb2ciXQotICAgIHNldCBleGVjX291dHB1dCBbbGluZGV4ICRzdGF0dXMgMV07Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdDEKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0KLQkjIFRoaXMgd2lsbCBmYWlsIGZvciBtYW55IHJlYXNvbnMuICBGb3IgZXhhbXBsZSwgaXQgd2lsbCBtb3N0Ci0JIyBsaWtlbHkgZmFpbCBpZiBhIG5vbi1HTlUgbGlua2VyIGlzIHVzZWQuICBUaGVyZWZvcmUsIHdlIGRvCi0JIyBub3QgaW5zaXN0IHRoYXQgaXQgcGFzcy4gIElmIHlvdSBhcmUgdXNpbmcgYW4gYXNzZW1ibGVyIGFuZAotCSMgbGlua2VyIGJhc2VkIG9uIHRoZSBzYW1lIEJGRCBhcyBvYmpjb3B5LCBpdCBpcyB3b3J0aAotCSMgaW52ZXN0aWdhdGluZyB0byBzZWUgd2h5IHRoaXMgZmFpbHVyZSBvY2N1cnMuICBJZiB3ZSBhcmUKLQkjIGNyb3NzIGNvbXBpbGluZywgd2UgYXNzdW1lIHRoYXQgYSBHTlUgbGlua2VyIGlzIGJlaW5nIHVzZWQsCi0JIyBhbmQgZXhwZWN0IGl0IHRvIHN1Y2NlZWQuCi0JaWYge1tpc25hdGl2ZV19IHRoZW4gewotCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCi0JfQotCi0JIyBUaGlzIGFsc28gZmFpbHMgZm9yIG1pcHMqLSotZWxmIHRhcmdldHMuICBTZWUgZWxmMzItbWlwcy5jCi0JIyBtaXBzX2VsZl9zeW1faXNfZ2xvYmFsLgotCXNldHVwX3hmYWlsICJtaXBzKi0qLWVsZiIKLQotCWZhaWwgJHRlc3QxCi0gICAgfQotCi0gICAgc2V0IG91dHB1dCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9jb3B5cHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJG91dHB1dCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlwYXNzICR0ZXN0MgotICAgIH0KLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlCi0KLXByb2Mgc3RyaXBfZXhlY3V0YWJsZSB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotCi0gICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107Ci0gICAgfSBlbHNlIHsKLQlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7Ci0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIio6IG5vIHN5bWJvbHMqIiAkZXhlY19vdXRwdXRdIHsKLQlmYWlsICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3QKLX0KLQotIyBUZXN0IHN0cmlwcGluZyBhbiBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sCi0KLXByb2Mgc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCB7IHByb2cgZmxhZ3MgdGVzdCB9IHsKLSAgICBnbG9iYWwgTk0KLSAgICBnbG9iYWwgTk1GTEFHUwotCi0gICAgcmVtb3RlX2Rvd25sb2FkIGJ1aWxkIHRtcGRpci9jb3B5cHJvZyB0bXBkaXIvc3RyaXByb2cKLSAgICBpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQlzZXQgY29weWZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9zdHJpcHJvZ107Ci0gICAgfSBlbHNlIHsKLQlzZXQgY29weWZpbGUgdG1wZGlyL3N0cmlwcm9nCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJHByb2cgIiRmbGFncyAke2NvcHlmaWxlfSJdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtpc19yZW1vdGUgaG9zdF0gewotCXJlbW90ZV91cGxvYWQgaG9zdCAke2NvcHlmaWxlfSB0bXBkaXIvc3RyaXByb2c7Ci0gICAgfQotCi0gICAgc2V0IHJlc3VsdCBbcmVtb3RlX2xvYWQgdGFyZ2V0IHRtcGRpci9zdHJpcHJvZ10KLSAgICBzZXQgc3RhdHVzIFtsaW5kZXggJHJlc3VsdCAwXTsKLSAgICBpZiB7ICRzdGF0dXMgIT0gInBhc3MiIH0gewotCWZhaWwgJHRlc3QKLSAgICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFtiaW51dGlsc19ydW4gJE5NICIkTk1GTEFHUyAke2NvcHlmaWxlfSJdCi0gICAgaWYgeyFbcmVnZXhwIHteWzAtOWEtZkEtRl0rIFQgbWFpbn0gJGV4ZWNfb3V0cHV0XSBcCi0gICAgICAgICAmJiAhW3JlZ2V4cCB7XlswLTlhLWZBLUZdKyBUIF9tYWlufSAkZXhlY19vdXRwdXRdfSB7Ci0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLXNldCB0ZXN0MSAic2ltcGxlIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKLXNldCB0ZXN0MiAicnVuIG9iamNvcHkgb2YgZXhlY3V0YWJsZSIKLXNldCB0ZXN0MyAicnVuIHN0cmlwcGVkIGV4ZWN1dGFibGUiCi1zZXQgdGVzdDQgInJ1biBzdHJpcHBlZCBleGVjdXRhYmxlIHdpdGggc2F2aW5nIGEgc3ltYm9sIgotCi1zd2l0Y2ggW2NvcHlfc2V0dXBdIHsKLSAgICAiMSIgewotCSMgZG8gbm90aGluZwotICAgIH0KLSAgICAiMiIgewotCXVudGVzdGVkICR0ZXN0MQotCXVudGVzdGVkICR0ZXN0MgotCXVudGVzdGVkICR0ZXN0MwotCXVudGVzdGVkICR0ZXN0NAotICAgIH0KLSAgICAiMyIgewotCXVucmVzb2x2ZWQgJHRlc3QxCi0JdW5yZXNvbHZlZCAkdGVzdDIKLQl1bnJlc29sdmVkICR0ZXN0MwotCXVucmVzb2x2ZWQgJHRlc3Q0Ci0gICAgfQotICAgICIwIiB7Ci0JY29weV9leGVjdXRhYmxlICIkT0JKQ09QWSIgIiRPQkpDT1BZRkxBR1MiICIkdGVzdDEiICIkdGVzdDIiCi0Jc3RyaXBfZXhlY3V0YWJsZSAiJFNUUklQIiAiJFNUUklQRkxBR1MiICIkdGVzdDMiCi0Jc3RyaXBfZXhlY3V0YWJsZV93aXRoX3NhdmluZ19hX3N5bWJvbCAiJFNUUklQIiAiLUsgbWFpbiAtSyBfbWFpbiAkU1RSSVBGTEFHUyIgIiR0ZXN0NCIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9vYmpkdW1wLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYzZGI5MS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL29iamR1bXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZSA8cm9iQGN5Z251cy5jb20+Ci0jIGFuZCByZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBpZiB7W3doaWNoICRPQkpEVU1QXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRPQkpEVU1QIGRvZXMgbm90IGV4aXN0IgotCXJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJE9CSkRVTVBdIgotCi0jIFNpbXBsZSB0ZXN0IG9mIG9iamR1bXAgLWkKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC1pIl0KLQotc2V0IGNwdXNfZXhwZWN0ZWQgIihhMjlrfGFsbGlhbnR8YWxwaGF8YXJjfGFybXxjb252ZXh8ZDEwdnxkMzB2fGg4fGhwcGF8aTM4NnxpODYwfGk5NjB8bTMycnxtNjhrfG04OGt8bWlwc3xtbjEwMjAwfG1uMTAzMDB8bnMzMmt8cG93ZXJwY3xweXJhbWlkfHJvbXB8cnM2MDAwfHNofHNwYXJjfHRhaG9lfHY4NTB8dmF4fHdlMzJrfHo4a3x6ODAwMXx6ODAwMikiCi0KLSMgTWFrZSBzdXJlIHRoZSB0YXJnZXQgQ1BVIHNob3dzIHVwIGluIHRoZSBsaXN0LgotaWYgIVtyZWdleHAgJGNwdXNfZXhwZWN0ZWQgJHRhcmdldF9jcHVdIHsKLSAgICByZWdzdWIgIl5cWyhcXSIgIiRjcHVzX2V4cGVjdGVkIiAiKCR7dGFyZ2V0X2NwdX18IiBjcHVzX2V4cGVjdGVkOwotfQotCi1zZXQgd2FudCAiQkZEIGhlYWRlciBmaWxlIHZlcnNpb24uKnNyZWNcW15cblxdKlxuXFteXG5cXSpoZWFkZXIgXFteXG5cXSplbmRpYW5cW15cblxdKiwgZGF0YSBcW15cblxdKmVuZGlhbi4qJGNwdXNfZXhwZWN0ZWQiCi0KLWlmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgcGFzcyAib2JqZHVtcCAtaSIKLX0gZWxzZSB7Ci0gICAgZmFpbCAib2JqZHVtcCAtaSIKLX0KLQotIyBUaGUgcmVtYWluaW5nIHRlc3RzIHJlcXVpcmUgYSB0ZXN0IGZpbGUuCi0KLQotaWYgeyFbYmludXRpbHNfYXNzZW1ibGUgJHNyY2Rpci8kc3ViZGlyL2JpbnRlc3QucyB0bXBkaXIvYmludGVzdC5vXX0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci1pZiBbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVzdGZpbGUgW3JlbW90ZV9kb3dubG9hZCBob3N0IHRtcGRpci9iaW50ZXN0Lm9dCi19IGVsc2UgewotICAgIHNldCB0ZXN0ZmlsZSB0bXBkaXIvYmludGVzdC5vCi19Ci0KLSMgVGVzdCBvYmpkdW1wIC1mCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtZiAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qYXJjaGl0ZWN0dXJlOlxbIAlcXSoke2NwdXNfZXhwZWN0ZWR9LipIQVNfUkVMT0MuKkhBU19TWU1TIgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBmYWlsICJvYmpkdW1wIC1mIgotfSBlbHNlIHsKLSAgICBwYXNzICJvYmpkdW1wIC1mIgotfQotCi0jIFRlc3Qgb2JqZHVtcCAtaAotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLWggJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKlNlY3Rpb25zLipcWzAtOVxdK1xbIAlcXStcW14gCVxdKih0ZXh0fFRFWFR8XFxcJENPREVcXFwkKVxbXiAJXF0qXFsgCVxdKihcWzAtOWEtZkEtRlxdKykuKlxbMC05XF0rXFsgCVxdK1xbXiAJXF0qKFxcLmRhdGF8REFUQSlcW14gCVxdKlxbIAlcXSooXFswLTlhLWZBLUZcXSspIgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB0ZXh0X25hbWUgdGV4dF9zaXplIGRhdGFfbmFtZSBkYXRhX3NpemVdIHRoZW4gewotICAgIGZhaWwgIm9iamR1bXAgLWgiCi19IGVsc2UgewotICAgIHZlcmJvc2UgInRleHQgbmFtZSBpcyAkdGV4dF9uYW1lIHNpemUgaXMgJHRleHRfc2l6ZSIKLSAgICB2ZXJib3NlICJkYXRhIG5hbWUgaXMgJGRhdGFfbmFtZSBzaXplIGlzICRkYXRhX3NpemUiCi0gICAgaWYge1tleHByICIweCR0ZXh0X3NpemUiXSA8IDggfHwgW2V4cHIgIjB4JGRhdGFfc2l6ZSJdIDwgNH0gdGhlbiB7Ci0Jc2VuZF9sb2cgInNpemVzIHRvbyBzbWFsbFxuIgotCWZhaWwgIm9iamR1bXAgLWgiCi0gICAgfSBlbHNlIHsKLQlwYXNzICJvYmpkdW1wIC1oIgotICAgIH0KLX0KLQotIyBUZXN0IG9iamR1bXAgLXQKLQotc2V0IGdvdCBbYmludXRpbHNfcnVuICRPQkpEVU1QICIkT0JKRFVNUEZMQUdTIC10ICR0ZXN0ZmlsZSJdCi0KLWlmIFtpbmZvIGV4aXN0cyB2YXJzXSB0aGVuIHsgdW5zZXQgdmFycyB9Ci13aGlsZSB7W3JlZ2V4cCAiKFxbYS16XF0qX3N5bWJvbCkoLiopIiAkZ290IGFsbCBzeW1ib2wgcmVzdF19IHsKLSAgICBzZXQgdmFycygkc3ltYm9sKSAxCi0gICAgc2V0IGdvdCAkcmVzdAotfQotCi1pZiB7IVtpbmZvIGV4aXN0cyB2YXJzKHRleHRfc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZGF0YV9zeW1ib2wpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgdmFycyhjb21tb25fc3ltYm9sKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIHZhcnMoZXh0ZXJuYWxfc3ltYm9sKV19IHRoZW4gewotICAgIGZhaWwgIm9iamR1bXAgLXQiCi19IGVsc2UgewotICAgIHBhc3MgIm9iamR1bXAgLXQiCi19Ci0KLSMgVGVzdCBvYmpkdW1wIC1yCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkT0JKRFVNUCAiJE9CSkRVTVBGTEFHUyAtciAkdGVzdGZpbGUiXQotCi1zZXQgd2FudCAiJHRlc3RmaWxlOlxbIAlcXSpmaWxlIGZvcm1hdC4qUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcXFxbXFteXF1cXSoodGV4dHxURVhUfFxcXCRDT0RFXFxcJClcW15cXVxdKlxcXF0uKmV4dGVybmFsX3N5bWJvbCIKLQotaWYgW3JlZ2V4cCAkd2FudCAkZ290XSB0aGVuIHsKLSAgICBwYXNzICJvYmpkdW1wIC1yIgotfSBlbHNlIHsKLSAgICBmYWlsICJvYmpkdW1wIC1yIgotfQotCi0jIFRlc3Qgb2JqZHVtcCAtcwotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJE9CSkRVTVAgIiRPQkpEVU1QRkxBR1MgLXMgJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIiR0ZXN0ZmlsZTpcWyAJXF0qZmlsZSBmb3JtYXQuKkNvbnRlbnRzLioodGV4dHxURVhUfFxcXCRDT0RFXFxcJClcW14wLTlcXSpcWyAJXF0qXFswLTlhLWZBLUZcXSpcWyAJXF0qKDAwMDAwMDAxfDAxMDAwMDAwKS4qQ29udGVudHMuKihkYXRhfERBVEEpXFteMC05XF0qXFsgCVxdKlxbMC05YS1mQS1GXF0qXFsgCVxdKigwMDAwMDAwMnwwMjAwMDAwMCkiCi0KLWlmIFtyZWdleHAgJHdhbnQgJGdvdF0gdGhlbiB7Ci0gICAgcGFzcyAib2JqZHVtcCAtcyIKLX0gZWxzZSB7Ci0gICAgZmFpbCAib2JqZHVtcCAtcyIKLX0KLQotIyBPcHRpb25zIHdoaWNoIGFyZSBub3QgdGVzdGVkOiAtYSAtZCAtRCAtUiAtVCAteCAtbCAtLXN0YWJzCi0jIEkgZG9uJ3Qgc2VlIGFueSBnZW5lcmljIHdheSB0byB0ZXN0IGFueSBvZiB0aGVzZSBvdGhlciB0aGFuIC1hLgotIyBUZXN0cyBjb3VsZCBiZSB3cml0dGVuIGZvciBzcGVjaWZpYyB0YXJnZXRzLCBhbmQgdGhhdCBzaG91bGQgYmUgZG9uZQotIyBpZiBzcGVjaWZpYyBwcm9ibGVtcyBhcmUgZm91bmQuCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmNzQ0Yy4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBXcml0dGVuIGJ5IE5pY2sgQ2xpZnRvICA8bmlja2NAY3lnbnVzLmNvbT4KLSMgQmFzZWQgb24gc2NyaXB0cyB3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotIyBhbmQgS2VuIFJhZWJ1cm4gPHJhZWJ1cm5AY3lnbnVzLmNvbT4uCi0KLSMgRmlyc3Qgc29tZSBoZWxwZnVsIHByb2NlZHVyZXMsIHRoZW4gdGhlIHRlc3RzIHRoZW1zZWx2ZXMKLQotIyBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlbmFtZSBnaXZlbgotcHJvYyBmaWxlX2NvbnRlbnRzIHsgZmlsZW5hbWUgfSB7Ci0gICAgc2V0IGZpbGUgW29wZW4gJGZpbGVuYW1lIHJdCi0gICAgc2V0IGNvbnRlbnRzIFtyZWFkICRmaWxlXQotICAgIGNsb3NlICRmaWxlCi0gICAgcmV0dXJuICRjb250ZW50cwotfQotCi0jIHJlZ2V4cF9kaWZmLCBiYXNlZCBvbiBzaW1wbGVfZGlmZiB0YWtlbiBmcm9tIGxkIHRlc3Qgc3VpdGUKLSMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQotIwlmaWxlMSBjb250YWlucyBzdHJpbmdzLCBmaWxlMiBjb250YWlucyByZWdleHBzIGFuZCAjLWNvbW1lbnRzCi0jCWJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkIGluIGVpdGhlciBmaWxlCi0jCXJldHVybnMgbm9uLXplcm8gaWYgZGlmZmVyZW5jZXMgZXhpc3QKLSMKLXByb2MgcmVnZXhwX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0gewotCi0gICAgc2V0IGVvZiAtMQotICAgIHNldCBlbmRfMSAwCi0gICAgc2V0IGVuZF8yIDAKLSAgICBzZXQgZGlmZmVyZW5jZXMgMAotICAgIHNldCBkaWZmX3Bhc3MgMAotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzFdIHRoZW4gewotCXNldCBmaWxlX2EgW29wZW4gJGZpbGVfMSByXQotICAgIH0gZWxzZSB7Ci0Jd2FybmluZyAiJGZpbGVfMSBkb2Vzbid0IGV4aXN0IgotCXJldHVybiAxCi0gICAgfQotCi0gICAgaWYgW2ZpbGUgZXhpc3RzICRmaWxlXzJdIHRoZW4gewotCXNldCBmaWxlX2IgW29wZW4gJGZpbGVfMiByXQotICAgIH0gZWxzZSB7Ci0JZmFpbCAiJGZpbGVfMiBkb2Vzbid0IGV4aXN0IgotCWNsb3NlICRmaWxlX2EKLQlyZXR1cm4gMQotICAgIH0KLQotICAgIHZlcmJvc2UgIiBSZWdleHAtZGlmZidpbmc6ICRmaWxlXzEgJGZpbGVfMiIgMgotCi0gICAgd2hpbGUgeyAxIH0gewotCXNldCBsaW5lX2EgIiIKLQlzZXQgbGluZV9iICIiCi0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9hXSA9PSAwIH0gewotCSAgICBpZiB7IFtnZXRzICRmaWxlX2EgbGluZV9hXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzEgMQotCQlicmVhawotCSAgICB9Ci0JfQotCXdoaWxlIHsgW3N0cmluZyBsZW5ndGggJGxpbmVfYl0gPT0gMCB8fCBbc3RyaW5nIG1hdGNoICIjKiIgJGxpbmVfYl0gfSB7Ci0JICAgIGlmIFsgc3RyaW5nIG1hdGNoICIjcGFzcyIgJGxpbmVfYiBdIHsKLQkJc2V0IGVuZF8yIDEKLQkJc2V0IGRpZmZfcGFzcyAxCi0JCWJyZWFrCi0JICAgIH0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZV9iIGxpbmVfYl0gPT0gJGVvZiB9IHsKLQkJc2V0IGVuZF8yIDEKLQkJYnJlYWsKLQkgICAgfQotCX0KLQotICAgICAgICBpZiB7ICRkaWZmX3Bhc3MgfSB7IAotICAgICAgICAgICAgYnJlYWsgCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xICYmICRlbmRfMiB9IHsgCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMSB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xXG4iCi0gICAgICAgICAgICB2ZXJib3NlICJleHRyYSByZWdleHBzIGluICRmaWxlXzIgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9iJFwiXG5FT0YgZnJvbSAkZmlsZV8xIiAzCi0gICAgICAgICAgICBzZXQgZGlmZmVyZW5jZXMgMQotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzIgfSB7Ci0gICAgICAgICAgICBzZW5kX2xvZyAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIGxpbmVzIGluICRmaWxlXzEgc3RhcnRpbmcgd2l0aCBcIl4kbGluZV9hJFwiXG5FT0YgZnJvbSAkZmlsZV8yXG4iIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmVyYm9zZSAicmVnZXhwIFwiXiRsaW5lX2IkXCJcbmxpbmUgICBcIiRsaW5lX2FcIiIgMwotICAgICAgICAgICAgaWYgIVtyZWdleHAgIl4kbGluZV9iJCIgIiRsaW5lX2EiXSB7Ci0JCXNlbmRfbG9nICJyZWdleHBfZGlmZiBtYXRjaCBmYWlsdXJlXG4iCi0JCXNlbmRfbG9nICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiXG4iCi0JCXNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIHsgJGRpZmZlcmVuY2VzID09IDAgJiYgISRkaWZmX3Bhc3MgJiYgW2VvZiAkZmlsZV9hXSAhPSBbZW9mICRmaWxlX2JdIH0gewotCXNlbmRfbG9nICIkZmlsZV8xIGFuZCAkZmlsZV8yIGFyZSBkaWZmZXJlbnQgbGVuZ3Roc1xuIgotCXZlcmJvc2UgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzIiAzCi0Jc2V0IGRpZmZlcmVuY2VzIDEKLSAgICB9Ci0KLSAgICBjbG9zZSAkZmlsZV9hCi0gICAgY2xvc2UgJGZpbGVfYgotCi0gICAgcmV0dXJuICRkaWZmZXJlbmNlcwotfQotCi0jIFJ1biBhbiBpbmRpdmlkdWFsIHJlYWRlbGYgdGVzdC4KLSMgQmFzaWNhbGx5IHJlYWRlbGYgaXMgcnVuIG9uIHRoZSBiaW5hcnlfZmlsZSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zLgotIyBSZWFkZWxmJ3Mgb3V0cHV0IGlzIGNhcHR1cmVkIGFuZCB0aGVuIGNvbXBhcmVkIGFnYWluc3QgdGhlIGNvbnRlbnRzCi0jIG9mIHRoZSByZWdleHBfZmlsZS4KLQotcHJvYyByZWFkZWxmX3Rlc3QgeyBvcHRpb25zIGJpbmFyeV9maWxlIHJlZ2V4cF9maWxlIHhmYWlscyB9IHsKLQotICAgIGdsb2JhbCBSRUFERUxGCi0gICAgZ2xvYmFsIFJFQURFTEZGTEFHUwotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgCi0gICAgc2VuZF9sb2cgImV4ZWMgJFJFQURFTEYgJFJFQURFTEZGTEFHUyAkb3B0aW9ucyAkYmluYXJ5X2ZpbGUgPiByZWFkZWxmLm91dCIKLSAgICBjYXRjaCAiZXhlYyAkUkVBREVMRiAkUkVBREVMRkZMQUdTICRvcHRpb25zICRiaW5hcnlfZmlsZSA+IHJlYWRlbGYub3V0IiBnb3QKLQotICAgIGlmIHsgW2xsZW5ndGggJHhmYWlsc10gIT0gMCB9IHRoZW4gewotCXNldHVwX3hmYWlsICR4ZmFpbHMKLSAgICB9Ci0gICAgCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGdvdF0gdGhlbiB7Ci0Jc2VuZF9sb2cgJGdvdAotCWZhaWwgInJlYWRlbGYgJG9wdGlvbnMiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgcmVhZGVsZi5vdXQgJHNyY2Rpci8kc3ViZGlyLyRyZWdleHBfZmlsZV0gfSB0aGVuIHsKLQlmYWlsICJyZWFkZWxmICRvcHRpb25zIgotCXZlcmJvc2UgIm91dHB1dCBpcyBcbltmaWxlX2NvbnRlbnRzIHJlYWRlbGYub3V0XSIgMgotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgInJlYWRlbGYgJG9wdGlvbnMiCi19Ci0KLQotCi0jIE9ubHkgRUxGIGJhc2VkIHRvb2xjaGFpbnMgbmVlZCByZWFkZWxmLgotIyBGb3Igbm93IGJlIHBhcmFub2lkIGFuZCBhc3N1bWUgdGhhdCBpZiBFTEYgaXMgbm90IG1lbnRpb25lZAotIyBpbiB0aGUgdGFyZ2V0IHN0cmluZywgdGhlbiB0aGUgdGFyZ2V0IGlzIG5vdCBhbiBFTEYgYmFzZWQgcG9ydC4KLQotaWYgIVtpc3RhcmdldCAiKi0qZWxmIl0gdGhlbiB7Ci0gICAgdmVyYm9zZSAiJFJFQURFTEYgaXMgb25seSBpbnRlbnRlZGVkIGZvciBFTEYgdGFyZ2V0cyIgMgotICAgIHJldHVybgotfQotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkUkVBREVMRl0gPT0gMH0gdGhlbiB7Ci0gICAgICAgIHBlcnJvciAiJFJFQURFTEYgZG9lcyBub3QgZXhpc3QiCi0gICAgICAgIHJldHVybgotICAgIH0KLX0KLQotc2VuZF91c2VyICJWZXJzaW9uIFtiaW51dGlsX3ZlcnNpb24gJFJFQURFTEZdIgotCi0jIEFzc2VtbGUgdGhlIHRlc3QgZmlsZS4KLWlmIHshW2JpbnV0aWxzX2Fzc2VtYmxlICRzcmNkaXIvJHN1YmRpci9iaW50ZXN0LnMgdG1wZGlyL2JpbnRlc3Qub119IHRoZW4gewotICAgIHBlcnJvciAidW5yZXNvbHZlZCAxIgotICAgIHVucmVzb2x2ZWQgInJlYWRlbGYgLSBmYWlsZWQgdG8gYXNzZW1ibGUiCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLSAgICBzZXQgdGVtcGZpbGUgdG1wZGlyL2JpbnRlc3QubzsKLX0gZWxzZSB7Ci0gICAgc2V0IHRlbXBmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfQotCi0jIFJ1biB0aGUgdGVzdHMKLXJlYWRlbGZfdGVzdCAtaCAkdGVtcGZpbGUgcmVhZGVsZi5oICB7fQotCi0jIFRoZSB2ODUwIGZhaWxzIHRoZSBuZXh0IHR3byB0ZXN0cyBiZWNhdXNlIGl0IGNyZWF0ZXMgdHdvIHNwZWNpYWwKLSMgc2VjdGlvbnMgb2YgaXRzIG93bjogLmNhbGxfdGFibGVfZGF0YSBhbmQgLmNhbGxfdGFibGVfdGV4dAotIyBUaGUgcmVnZXhwIHNjcmlwdHMgYXJlIG5vdCBleHBlY3RpbmcgdGhlc2Ugc2VjdGlvbnMuLi4KLQotcmVhZGVsZl90ZXN0IC1TICR0ZW1wZmlsZSByZWFkZWxmLnMgIHt2ODUwKi0qLSp9Ci1yZWFkZWxmX3Rlc3QgLXMgJHRlbXBmaWxlIHJlYWRlbGYuc3Mge3Y4NTAqLSotKn0KLXJlYWRlbGZfdGVzdCAtciAkdGVtcGZpbGUgcmVhZGVsZi5yICB7fQotCi0KLSMgQ29tcGlsZSB0aGUgc2Vjb25kIHRlc3QgZmlsZS4KLWlmIHsgW3RhcmdldF9jb21waWxlICRzcmNkaXIvJHN1YmRpci90ZXN0cHJvZy5jIHRtcGRpci90ZXN0cHJvZy5vIG9iamVjdCBkZWJ1Z10gIT0gIiIgfSB7Ci0gICAgdW50ZXN0ZWQgInJlYWRlbGYgLXciCi0gICAgcmV0dXJuCi19Ci0KLWlmIFtpc19yZW1vdGUgaG9zdF0gewotICAgIHNldCB0ZW1wZmlsZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgdG1wZGlyL3Rlc3Rwcm9nLm9dOwotfSBlbHNlIHsKLSAgICBzZXQgdGVtcGZpbGUgdG1wZGlyL3Rlc3Rwcm9nLm8KLX0KLQotIyBUaGUgeGZhaWwgdGFyZ2V0cyBoZXJlIGRvIG5vdCBkZWZhdWx0IHRvIERXQVJGMiBmb3JtYXQgZGVidWcgaW5mb3JtYXRpb24KLSMgVGhlIHN5bXB0b20gaXMgdGhhdCB0aGUgb3V0cHV0IG9mICdyZWFkZWxmIC13aScgaXMgZW1wdHkuCi0KLXJlYWRlbGZfdGVzdCAtd2kgJHRlbXBmaWxlIHJlYWRlbGYud2kge3Y4NTAqLSotKn0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5oIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGVhYjUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1FTEYgSGVhZGVyOgotICBNYWdpYzogICA3ZiA0NSA0YyA0NiAwWzEyXSAwWzEyXSAwMSAuLiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAKLSAgQ2xhc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTEZbMzZdWzI0XQotICBEYXRhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIncyBjb21wbGVtZW50LC4qIGVuZGlhbgotICBWZXJzaW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgXChjdXJyZW50XCkKLSAgT1MvQUJJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuKgotICBBQkkgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgIC4qCi0gIFR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVMIFwoUmVsb2NhdGFibGUgZmlsZVwpCi0gIE1hY2hpbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgVmVyc2lvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKLSAgRW50cnkgcG9pbnQgYWRkcmVzczogICAgICAgICAgICAgICAweDAKLSAgU3RhcnQgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgICAwIFwoYnl0ZXMgaW50byBmaWxlXCkKLSAgU3RhcnQgb2Ygc2VjdGlvbiBoZWFkZXJzOiAgICAgICAgICAuKiBcKGJ5dGVzIGludG8gZmlsZVwpCi0gIEZsYWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLioKLSAgU2l6ZSBvZiB0aGlzIGhlYWRlcjogICAgICAgICAgICAgICAuKiBcKGJ5dGVzXCkKLSAgU2l6ZSBvZiBwcm9ncmFtIGhlYWRlcnM6ICAgICAgICAgICAwIFwoYnl0ZXNcKQotICBOdW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzOiAgICAgICAgIDAKLSAgU2l6ZSBvZiBzZWN0aW9uIGhlYWRlcnM6ICAgICAgICAgICAuKiBcKGJ5dGVzXCkKLSAgTnVtYmVyIG9mIHNlY3Rpb24gaGVhZGVyczogICAgICAgICAuKgotICBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXg6IC4qCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYuciBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmVhNzIxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5yCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLVJlbG9jYXRpb24gc2VjdGlvbiAnLnJlbC4qdGV4dCcgYXQgb2Zmc2V0IDB4LiogY29udGFpbnMgMSBlbnRyaWVzOgotICBPZmZzZXQgICAgSW5mbyAgVHlwZSAgICAgICAgICAgIFN5bWJvbCdzIFZhbHVlICBTeW1ib2wncyBOYW1lLioKLSAgMDAwMDAwMDQgIDAwLiogUl8uKiAgICAgICAgICAgMDAwMDAwMDAgIGV4dGVybmFsX3N5bWJvbC4qCmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYucyBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGIxMjQ1Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotVGhlcmUgYXJlIC4qIHNlY3Rpb24gaGVhZGVycywgc3RhcnRpbmcgYXQgb2Zmc2V0IC4qOgotCi1TZWN0aW9uIEhlYWRlcnM6Ci0gIFxbTnJcXSBOYW1lICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgQWRkciAgICAgT2ZmICAgIFNpemUgICBFUyBGbGcgTGsgSW5mIEFsCi0gIFxbIDBcXSAgICAgICAgICAgICAgICAgICBOVUxMICAgICAgICAgICAgMDAwMDAwMDAgMDAwMDAwIDAwMDAwMCAwMCAgICAgIDAgICAwIDAKLSAgXFsgMVxdIC50ZXh0ICAgICAgICAgICAgIFBST0dCSVRTICAgICAgICAwMDAwMDAwMCAwMDAwMzQgMDAwMDA4IDAwICBBWCAgMCAgIDAgLgotICBcWyAyXF0gLnJlbC4rdGV4dCArUkVMLiArMCsgMCsuKiAwMDAwMC4gMC4gICAgICAuICAgMSA0Ci0gIFxbIDNcXSAuZGF0YSAgICAgICAgICAgICBQUk9HQklUUyAgICAgICAgMDAwMDAwMDAgMDAwMDNjIDAwMDAwNCAwMCBXQSAgIDAgICAwIC4KLSAgXFsgNFxdIC5ic3MgICAgICAgICAgICAgIE5PQklUUyAgICAgICAgICAwMDAwMDAwMCAwMDAwNDAgMDAwMDAwIDAwIFdBICAgMCAgIDAgLgotICBcWyA1XF0gLnNoc3RydGFiICAgICAgICAgU1RSVEFCICAgICAgICAgIDAwMDAwMDAwIDAwMDA0MCAwMDAwLiogMDAgICAgICAwICAgMCAuCi0gIFxbIDZcXSAuc3ltdGFiICAgICAgICAgICBTWU1UQUIgICAgICAgICAgMDAwMDAwMDAgMCsuKiAwKy4qIDEwICAgICAgNyAgIDYgNAotICBcWyA3XF0gLnN0cnRhYiAgICAgICAgICAgU1RSVEFCICAgICAgICAgIDAwMDAwMDAwIDArLiogMCsuKiAwMCAgICAgIDAgICAwIDEKLQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnNzIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC9yZWFkZWxmLnNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzYwYjM4Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi5zcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotU3ltYm9sIHRhYmxlICcuc3ltdGFiJyBjb250YWlucyAuKiBlbnRyaWVzOgotICBOdW06ICAgIFZhbHVlICBTaXplIFR5cGUgICAgQmluZCAgIE90ICBOZHggTmFtZQotICAgIDA6ICAgICAgICAwICAgICAwIE5PVFlQRSAgTE9DQUwgICAwICBVTkQgCi0gICAgMTogICAgICAgIDAgICAgIDAgU0VDVElPTiBMT0NBTCAgIDAgICAgMSAKLSAgICAyOiAgICAgICAgMCAgICAgMCBTRUNUSU9OIExPQ0FMICAgMCAgICAzIAotICAgIDM6ICAgICAgICAwICAgICAwIFNFQ1RJT04gTE9DQUwgICAwICAgIDQgCi0gICAgNDogICAgICAgIDAgICAgIDAgTk9UWVBFICBMT0NBTCAgIDAgICAgMSBzdGF0aWNfdGV4dF9zeW1ib2wKLSAgICA1OiAgICAgICAgMCAgICAgMCBOT1RZUEUgIExPQ0FMICAgMCAgICAzIHN0YXRpY19kYXRhX3N5bWJvbAotICAgIC46ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICAgIDEgdGV4dF9zeW1ib2wKLSAgICAuOiAgICAgICAgMCAgICAgMCBOT1RZUEUgIEdMT0JBTCAgMCAgVU5EIGV4dGVybmFsX3N5bWJvbAotICAgLio6ICAgICAgICAwICAgICAwIE5PVFlQRSAgR0xPQkFMICAwICAgIDMgZGF0YV9zeW1ib2wKLSAgIC4qOiAgICAgICAgNCAgICAgNCBPQkpFQ1QgIEdMT0JBTCAgMCAgQ09NIGNvbW1vbl9zeW1ib2wKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aSBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvcmVhZGVsZi53aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyMmZmZi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3JlYWRlbGYud2kKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi1UaGUgc2VjdGlvbiAuZGVidWdfaW5mbyBjb250YWluczoKLQotICBDb21waWxhdGlvbiBVbml0OgotICAgTGVuZ3RoOiAgICAgICAgLioKLSAgIFZlcnNpb246ICAgICAgIDIKLSAgIEFiYnJldiBPZmZzZXQ6IDAKLSAgIFBvaW50ZXIgU2l6ZTogIDQKLSA8Lj48Lio+OiBBYmJyZXYgTnVtYmVyOiAxIFwoRFdfVEFHX2NvbXBpbGVfdW5pdFwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogLiovdGVzdHByb2cuYwkKLSAgICAgRFdfQVRfY29tcF9kaXIgICAgOiAuKi9iaW51dGlscwkKLSAgICAgRFdfQVRfcHJvZHVjZXIgICAgOiBHTlUgQyAuKgkKLSAgICAgRFdfQVRfbGFuZ3VhZ2UgICAgOiAxCVwoQU5TSSBDXCkKLSAgICAgRFdfQVRfbG93X3BjICAgICAgOiAwCQotICAgICBEV19BVF9oaWdoX3BjICAgICA6IC4qCQotICAgICBEV19BVF9zdG10X2xpc3QgICA6IDAJCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogMiBcKERXX1RBR19zdWJwcm9ncmFtXCkKLSAgICAgRFdfQVRfZXh0ZXJuYWwgICAgOiAxCQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGZuCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogMTAJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogLioJCi0gICAgIERXX0FUX2xvd19wYyAgICAgIDogMAkKLSAgICAgRFdfQVRfaGlnaF9wYyAgICAgOiAuKgkKLSAgICAgRFdfQVRfZnJhbWVfYmFzZSAgOiAxIGJ5dGUgYmxvY2s6IC4qCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogMyBcKERXX1RBR19iYXNlX3R5cGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IGludAkKLSAgICAgRFdfQVRfYnl0ZV9zaXplICAgOiA0CQotICAgICBEV19BVF9lbmNvZGluZyAgICA6IDUJXChzaWduZWRcKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDQgXChEV19UQUdfc3VicHJvZ3JhbVwpCi0gICAgIERXX0FUX3NpYmxpbmcgICAgIDogLioJCi0gICAgIERXX0FUX2V4dGVybmFsICAgIDogMQkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBtYWluCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogMTYJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogLioJCi0gICAgIERXX0FUX2xvd19wYyAgICAgIDogLioJCi0gICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCi0gICAgIERXX0FUX2ZyYW1lX2Jhc2UgIDogMSBieXRlIGJsb2NrOiAuKgotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDUgXChEV19UQUdfbGV4aWNhbF9ibG9ja1wpCi0gICAgIERXX0FUX2xvd19wYyAgICAgIDogLioJCi0gICAgIERXX0FUX2hpZ2hfcGMgICAgIDogLioJCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNiBcKERXX1RBR192YXJpYWJsZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogY29tbW9uCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogMwkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIDAgMCAwIDAgCVwoRFdfT1BfYWRkcjogMFwpCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNiBcKERXX1RBR192YXJpYWJsZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogZ2xvYmFsCQotICAgICBEV19BVF9kZWNsX2ZpbGUgICA6IDEJCi0gICAgIERXX0FUX2RlY2xfbGluZSAgIDogNAkKLSAgICAgRFdfQVRfdHlwZSAgICAgICAgOiA8Lio+CQotICAgICBEV19BVF9leHRlcm5hbCAgICA6IDEJCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIDAgMCAwIDAgCVwoRFdfT1BfYWRkcjogMFwpCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogNyBcKERXX1RBR192YXJpYWJsZVwpCi0gICAgIERXX0FUX25hbWUgICAgICAgIDogbG9jYWwJCi0gICAgIERXX0FUX2RlY2xfZmlsZSAgIDogMQkKLSAgICAgRFdfQVRfZGVjbF9saW5lICAgOiA1CQotICAgICBEV19BVF90eXBlICAgICAgICA6IDwuKj4JCi0gICAgIERXX0FUX2xvY2F0aW9uICAgIDogNSBieXRlIGJsb2NrOiAzIC4gMCAwIC4gCVwoRFdfT1BfYWRkcjogLlwpCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogOCBcKERXX1RBR19hcnJheV90eXBlXCkKLSAgICAgRFdfQVRfc2libGluZyAgICAgOiA8Lio+CQotICAgICBEV19BVF90eXBlICAgICAgICA6IDwuKj4JCi0gPC4+PC4qPjogQWJicmV2IE51bWJlcjogOSBcKERXX1RBR19zdWJyYW5nZV90eXBlXCkKLSAgICAgRFdfQVRfdXBwZXJfYm91bmQgOiA2CQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDMgXChEV19UQUdfYmFzZV90eXBlXCkKLSAgICAgRFdfQVRfbmFtZSAgICAgICAgOiBjaGFyCQotICAgICBEV19BVF9ieXRlX3NpemUgICA6IDEJCi0gICAgIERXX0FUX2VuY29kaW5nICAgIDogOAlcKHVuc2lnbmVkIGNoYXJcKQotIDwuPjwuKj46IEFiYnJldiBOdW1iZXI6IDcgXChEV19UQUdfdmFyaWFibGVcKQotICAgICBEV19BVF9uYW1lICAgICAgICA6IHN0cmluZwkKLSAgICAgRFdfQVRfZGVjbF9maWxlICAgOiAxCQotICAgICBEV19BVF9kZWNsX2xpbmUgICA6IDYJCi0gICAgIERXX0FUX3R5cGUgICAgICAgIDogPC4qPgkKLSAgICAgRFdfQVRfbG9jYXRpb24gICAgOiA1IGJ5dGUgYmxvY2s6IDMgLiAwIDAgLiAJXChEV19PUF9hZGRyOiAuXCkKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvc2l6ZS5leHAgYi9iaW51dGlscy90ZXN0c3VpdGUvYmludXRpbHMtYWxsL3NpemUuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTA4YzkxLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvc2l6ZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgcmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPgotCi1pZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgaWYge1t3aGljaCAkU0laRV0gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkU0laRSBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLXNlbmRfdXNlciAiVmVyc2lvbiBbYmludXRpbF92ZXJzaW9uICRTSVpFXSIKLQotCi1pZiB7IVtiaW51dGlsc19hc3NlbWJsZSAkc3JjZGlyLyRzdWJkaXIvYmludGVzdC5zIHRtcGRpci9iaW50ZXN0Lm9dfSB0aGVuIHsKLSAgICByZXR1cm4KLX0KLQotaWYgW2lzX3JlbW90ZSBob3N0XSB7Ci0gICAgc2V0IHRlc3RmaWxlIFtyZW1vdGVfZG93bmxvYWQgaG9zdCB0bXBkaXIvYmludGVzdC5vXQotfSBlbHNlIHsKLSAgICBzZXQgdGVzdGZpbGUgdG1wZGlyL2JpbnRlc3QubwotfQotCi1zZXQgZGVjICJcWzAtOVxdKyIKLXNldCBoZXggIlxbMC05YS1mQS1GXF0rIgotCi0jIFRlc3Qgc2l6ZSB3aXRoIG5vIGFyZ3VtZW50cwotCi1zZXQgZ290IFtiaW51dGlsc19ydW4gJFNJWkUgIiRTSVpFRkxBR1MgJHRlc3RmaWxlIl0KLQotc2V0IHdhbnQgIigkZGVjKVxbIAlcXSsoJGRlYylcWyAJXF0rKCRkZWMpXFsgCVxdKygkZGVjKVxbIAlcXSsoJGhleClcWyAJXF0rJHt0ZXN0ZmlsZX0iCi0KLWlmICFbcmVnZXhwICR3YW50ICRnb3QgYWxsIHRleHQgZGF0YSBic3MgZHRvdCBoZXh0b3RdIHRoZW4gewotICAgIGZhaWwgInNpemUgKG5vIGFyZ3VtZW50cykiCi19IGVsc2UgewotICAgIGlmIHskdGV4dCA8IDggfHwgJGRhdGEgPCA0fSB0aGVuIHsKLQlmYWlsICJzaXplIChubyBhcmd1bWVudHMpIgotICAgIH0gZWxzZSB7Ci0JcGFzcyAic2l6ZSAobm8gYXJndW1lbnRzKSIKLSAgICB9Ci19Ci0KLSMgVGVzdCBzaXplIC1BCi0KLXNldCBnb3QgW2JpbnV0aWxzX3J1biAkU0laRSAiJFNJWkVGTEFHUyAtQSAke3Rlc3RmaWxlfSJdCi0KLXNldCB3YW50ICIke3Rlc3RmaWxlfS4qKHRleHR8VEVYVClcW15cblxyXF0qXFsgCVxdKCRkZWMpXFsgCVxdKyRkZWMuKihcXC5kYXRhfERBVEEpXFteXG5cclxdKlxbIAlcXSgkZGVjKVxbIAlcXSskZGVjIgotCi1pZiAhW3JlZ2V4cCAkd2FudCAkZ290IGFsbCB0ZXh0bmFtZSB0ZXh0c2l6ZSBkYXRhbmFtZSBkYXRhc2l6ZV0gdGhlbiB7Ci0gICAgZmFpbCAic2l6ZSAtQSIKLX0gZWxzZSB7Ci0gICAgdmVyYm9zZSAidGV4dCBzaXplOiAkdGV4dHNpemUiCi0gICAgdmVyYm9zZSAiZGF0YSBzaXplOiAkZGF0YXNpemUiCi0gICAgaWYgeyR0ZXh0c2l6ZSA8IDggfHwgJGRhdGFzaXplIDwgNH0gdGhlbiB7Ci0JZmFpbCAic2l6ZSAtQSIKLSAgICB9IGVsc2UgewotCXBhc3MgInNpemUgLUEiCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC90ZXN0cHJvZy5jIGIvYmludXRpbHMvdGVzdHN1aXRlL2JpbnV0aWxzLWFsbC90ZXN0cHJvZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTA2NTZiLi4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9iaW51dGlscy1hbGwvdGVzdHByb2cuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIHRlc3Qgb2JqY29weSBhbmQgc3RyaXAuICAqLwotCi1pbnQgY29tbW9uOwotaW50IGdsb2JhbCA9IDE7Ci1zdGF0aWMgaW50IGxvY2FsID0gMjsKLXN0YXRpYyBjaGFyIHN0cmluZ1tdID0gInN0cmluZyI7Ci0KLWludAotZm4gKCkKLXsKLSAgcmV0dXJuIDM7Ci19Ci0KLWludAotbWFpbiAoKQotewotICBpZiAoY29tbW9uICE9IDAKLSAgICAgIHx8IGdsb2JhbCAhPSAxCi0gICAgICB8fCBsb2NhbCAhPSAyCi0gICAgICB8fCBzdHJjbXAgKHN0cmluZywgInN0cmluZyIpICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbGVkXG4iKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICBwcmludGYgKCJva1xuIik7Ci0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cCBiL2JpbnV0aWxzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjgwMmUuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZGVqYWdudUBwcmVwLmFpLm1pdC5lZHUKLQotIyBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9iIFNhdm95ZS4gKHJvYkBjeWdudXMuY29tKQotCi1sb2FkX2xpYiB1dGlsLWRlZnMuZXhwCi1sb2FkX2xpYiB1dGlscy1saWIuZXhwCi0KLWlmICFbaW5mbyBleGlzdHMgTk1dIHRoZW4gewotICAgIHNldCBOTSBbZmluZGZpbGUgJGJhc2VfZGlyL25tLW5ldyAkYmFzZV9kaXIvbm0tbmV3IFt0cmFuc2Zvcm0gbm1dXQotfQotaWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgTk1GTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIFNJWkVdIHRoZW4gewotICAgIHNldCBTSVpFIFtmaW5kZmlsZSAkYmFzZV9kaXIvc2l6ZV0KLX0KLWlmICFbaW5mbyBleGlzdHMgU0laRUZMQUdTXSB0aGVuIHsKLSAgICBzZXQgU0laRUZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUF0gdGhlbiB7Ci0gICAgc2V0IE9CSkRVTVAgW2ZpbmRmaWxlICRiYXNlX2Rpci9vYmpkdW1wXQotfQotaWYgIVtpbmZvIGV4aXN0cyBPQkpEVU1QRkxBR1NdIHRoZW4gewotICAgIHNldCBPQkpEVU1QRkxBR1MgIiIKLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBPQkpDT1BZXSB0aGVuIHsKLSAgICBzZXQgT0JKQ09QWSBbZmluZGZpbGUgJGJhc2VfZGlyL29iamNvcHldCi19Ci1pZiAhW2luZm8gZXhpc3RzIE9CSkNPUFlGTEFHU10gdGhlbiB7Ci0gICAgc2V0IE9CSkNPUFlGTEFHUyAiIgotfQotCi1pZiAhW2luZm8gZXhpc3RzIEFSXSB0aGVuIHsKLSAgICBzZXQgQVIgW2ZpbmRmaWxlICRiYXNlX2Rpci9hcl0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBTVFJJUF0gdGhlbiB7Ci0gICAgc2V0IFNUUklQIFtmaW5kZmlsZSAkYmFzZV9kaXIvc3RyaXAtbmV3ICRiYXNlX2Rpci9zdHJpcC1uZXcgW3RyYW5zZm9ybSBzdHJpcF1dCi19Ci1pZiAhW2luZm8gZXhpc3RzIFNUUklQRkxBR1NdIHRoZW4gewotICAgIHNldCBTVFJJUEZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgUkVBREVMRl0gdGhlbiB7Ci0gICAgc2V0IFJFQURFTEYgW2ZpbmRmaWxlICRiYXNlX2Rpci9yZWFkZWxmXQotfQotaWYgIVtpbmZvIGV4aXN0cyBSRUFERUxGRkxBR1NdIHRoZW4gewotICAgIHNldCBSRUFERUxGRkxBR1MgIiIKLX0KLQotaWYgIVtmaWxlIGlzZGlyZWN0b3J5IHRtcGRpcl0ge2NhdGNoICJleGVjIG1rZGlyIHRtcGRpciIgc3RhdHVzfQotCi0jCi0jIGJpbnV0aWxzX3J1bgotIwlydW4gYSBwcm9ncmFtLCByZXR1cm5pbmcgdGhlIG91dHB1dAotIwlzZXRzIGJpbnV0aWxzX3J1bl9mYWlsZWQgaWYgdGhlIHByb2dyYW0gZG9lcyBub3QgZXhpc3QKLSMKLXByb2MgYmludXRpbHNfcnVuIHsgcHJvZyBwcm9nYXJncyB9IHsKLSAgICBkZWZhdWx0X2JpbnV0aWxzX3J1biAkcHJvZyAkcHJvZ2FyZ3MKLX0KLQotIwotIyBiaW51dGlsc19hc3NlbWJsZQotIwlhc3NlbWJsZSBhIGZpbGUKLSMKLXByb2MgYmludXRpbHNfYXNzZW1ibGUgeyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUgJHNvdXJjZSAkb2JqZWN0Ci19CmRpZmYgLS1naXQgYS9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2hwcGEuc2VkIGIvYmludXRpbHMvdGVzdHN1aXRlL2NvbmZpZy9ocHBhLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2MDdkOC4uMDAwMDAwMAotLS0gYS9iaW51dGlscy90ZXN0c3VpdGUvY29uZmlnL2hwcGEuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zLyMgT2xkIE9TRiBzZWQgYmxvd3MgdXAgaWYgeW91IGhhdmUgYSBzZWQgY29tbWFuZCBzdGFydGluZyB3aXRoICIjIi8vCi1zLyMgQXZvaWQgaXQgYnkgcHV0dGluZyB0aGUgY29tbWVudHMgd2l0aGluIHJlYWwgc2VkIGNvbW1hbmRzLi8vCi1zLyMgRml4IHRoZSBkZWZpbml0aW9uIG9mIGNvbW1vbl9zeW1ib2wgdG8gYmUgY29ycmVjdCBmb3IgdGhlIFBBIGFzc2VibWxlcnMuLy8KLXMvCVwuY29tbSBjb21tb25fc3ltYm9sLDQvY29tbW9uX3N5bWJvbAkuY29tbSA0LwpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdGVzdHN1aXRlL2xpYi91dGlscy1saWIuZXhwIGIvYmludXRpbHMvdGVzdHN1aXRlL2xpYi91dGlscy1saWIuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjdmMjE3Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3Rlc3RzdWl0ZS9saWIvdXRpbHMtbGliLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgYnVnLWRlamFnbnVAcHJlcC5haS5taXQuZWR1Ci0KLSMgVGhpcyBmaWxlIHdhcyB3cml0dGVuIGJ5IFJvYiBTYXZveWUgPHJvYkBjeWdudXMuY29tPgotIyBhbmQgZXh0ZW5kZWQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLXByb2MgYmludXRpbF92ZXJzaW9uIHsgcHJvZyB9IHsKLSAgICBpZiAhW2lzX3JlbW90ZSBob3N0XSB7Ci0Jc2V0IHBhdGggW3doaWNoICRwcm9nXTsKLQlpZiB7JHBhdGggPT0gMH0gdGhlbiB7Ci0JICAgIHBlcnJvciAiJHByb2cgY2FuJ3QgYmUgcnVuLCBmaWxlIG5vdCBmb3VuZC4iCi0JICAgIHJldHVybiAiIgotCX0KLSAgICB9IGVsc2UgewotCXNldCBwYXRoICRwcm9nCi0gICAgfQotICAgIHNldCBzdGF0ZSBbcmVtb3RlX2V4ZWMgaG9zdCAkcHJvZyAtLXZlcnNpb25dOwotICAgIHNldCB0bXAgIltsaW5kZXggJHN0YXRlIDFdXG4iOwotICAgICMgU2hvdWxkIGZpbmQgYSB3YXkgdG8gZGlzY2FyZCBjb25zdGFudCBwYXJ0cywga2VlcCB3aGF0ZXZlcidzCi0gICAgIyBsZWZ0LCBzbyB0aGUgdmVyc2lvbiBzdHJpbmcgY291bGQgYmUgYWxtb3N0IGFueXRoaW5nIGF0IGFsbC4uLgotICAgIHJlZ2V4cCAiXFteXG5cXSogKGN5Z251cy18KShcWy0wLTkuYS16QS1aLVxdKylcW1xyXG5cXS4qIiAiJHRtcCIgdmVyc2lvbiBjeWcgbnVtYmVyCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBudW1iZXJdIHRoZW4gewotICAgICAgICByZXR1cm4gIiRwYXRoIChubyB2ZXJzaW9uIG51bWJlcilcbiIKLSAgICB9Ci0gICAgcmV0dXJuICIkcGF0aCAkbnVtYmVyXG4iCi19Ci0KLSMKLSMgZGVmYXVsdF9iaW51dGlsc19ydW4KLSMJcnVuIGEgcHJvZ3JhbSwgcmV0dXJuaW5nIHRoZSBvdXRwdXQKLSMJc2V0cyBiaW51dGlsc19ydW5fZmFpbGVkIGlmIHRoZSBwcm9ncmFtIGRvZXMgbm90IGV4aXN0Ci0jCi1wcm9jIGRlZmF1bHRfYmludXRpbHNfcnVuIHsgcHJvZyBwcm9nYXJncyB9IHsKLSAgICBnbG9iYWwgYmludXRpbHNfcnVuX2ZhaWxlZAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCBiaW51dGlsc19ydW5fZmFpbGVkIDAKLQotICAgIGlmICFbaXNfcmVtb3RlIGhvc3RdIHsKLQlpZiB7W3doaWNoICRwcm9nXSA9PSAwfSB0aGVuIHsKLQkgICAgcGVycm9yICIkcHJvZyBkb2VzIG5vdCBleGlzdCIKLQkgICAgc2V0IGJpbnV0aWxzX3J1bl9mYWlsZWQgMQotCSAgICByZXR1cm4gIiIKLQl9Ci0gICAgfQotCi0gICAgc2VuZF9sb2cgIiRwcm9nICRwcm9nYXJnc1xuIgotICAgIHZlcmJvc2UgIiRwcm9nICRwcm9nYXJncyIKLQotICAgICMgR290dGEgcXVvdGUgZG9sbGFyLXNpZ25zIGJlY2F1c2UgdGhleSBnZXQgbWFuZ2xlZCBieSB0aGUKLSAgICAjIHNoZWxsIG90aGVyd2lzZS4KLSAgICByZWdzdWIgLWFsbCAiXFwkIiAiJHByb2dhcmdzIiAiXFwkIiBwcm9nYXJncwotCi0gICAgc2V0IHN0YXRlIFtyZW1vdGVfZXhlYyBob3N0ICRwcm9nICRwcm9nYXJnc10KLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzIFtsaW5kZXggJHN0YXRlIDFdXTsKLSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLSAgICB9Ci0gICAgcmV0dXJuICRleGVjX291dHB1dAotfQotCi0jCi0jIGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGRlZmF1bHRfYmludXRpbHNfYXNzZW1ibGUgeyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0KLSAgICAjIFRoZSBIUFBBIGFzc2VtYmxlciBzeW50YXggaXMgYSBsaXR0bGUgZGlmZmVyZW50IHRoYW4gbW9zdCwgdG8gbWFrZQotICAgICMgdGhlIHRlc3Qgc291cmNlIGZpbGUgYXNzZW1ibGUgd2UgbmVlZCB0byBydW4gaXQgdGhyb3VnaCBzZWQuCi0gICAgIwotICAgICMgVGhpcyBpcyBhIGhhY2sgaW4gdGhhdCBpdCB3b24ndCBzY2FsZSB3ZWxsIGlmIG90aGVyIHRhcmdldHMgbmVlZAotICAgICMgc2ltaWxhciB0cmFuc2Zvcm1hdGlvbnMgdG8gYXNzZW1ibGUuICBXZSdsbCBnZW5lcmFsaXplIHRoZSBoYWNrCi0gICAgIyBpZi93aGVuIG90aGVyIHRhcmdldHMgbmVlZCBzaW1pbGFyIGhhbmRsaW5nLgotICAgIGlmIFtpc3RhcmdldCAiaHBwYSotKi0qIiBdIHRoZW4gewotCXNlbmRfbG9nICJzZWQgLWYgJHNyY2Rpci9jb25maWcvaHBwYS5zZWQgPCAkc291cmNlID4gYXNtLnNcbiIKLQl2ZXJib3NlICJzZWQgLWYgJHNyY2Rpci9jb25maWcvaHBwYS5zZWQgPCAkc291cmNlID4gYXNtLnMiCi0JY2F0Y2ggImV4ZWMgc2VkIC1mICRzcmNkaXIvY29uZmlnL2hwcGEuc2VkIDwgJHNvdXJjZSA+IGFzbS5zIjsKLQlzZXQgc291cmNlIGFzbS5zCi0gICAgfQotCi0gICAgc2V0IGV4ZWNfb3V0cHV0IFt0YXJnZXRfYXNzZW1ibGUgJHNvdXJjZSAkb2JqZWN0ICIiXTsKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkc291cmNlOiBhc3NlbWJseSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLWlmICFbaW5mbyBleGlzdHMgdGFyZ2V0X2Fzc2VtYmxlXSB7Ci0jCi0jIFN0b2xlbiBmcm9tIGRlamFnbnUvbGliL3RhcmdldC5leHAtLXBsZWFzZSByZW1vdmUgYWZ0ZXIgMS8xLzk4LgotIwotdXBsZXZlbCAjMCB7Ci0gICAgcHJvYyB0YXJnZXRfYXNzZW1ibGUgeyBzb3VyY2UgZGVzdGZpbGUgZmxhZ3MgfSB7Ci0JcmV0dXJuIFtkZWZhdWx0X3RhcmdldF9hc3NlbWJsZSAkc291cmNlICRkZXN0ZmlsZSAkZmxhZ3NdOwotICAgIH0KLQotICAgIHByb2MgZGVmYXVsdF90YXJnZXRfYXNzZW1ibGUgeyBzb3VyY2UgZGVzdGZpbGUgZmxhZ3MgfSB7Ci0JZ2xvYmFsIEFTX0ZPUl9UQVJHRVQ7Ci0JZ2xvYmFsIEFTRkxBR1NfRk9SX1RBUkdFVDsKLQotCWlmIFtpbmZvIGV4aXN0cyBBU19GT1JfVEFSR0VUXSB7Ci0JICAgIHNldCBBUyAiJEFTX0ZPUl9UQVJHRVQiOwotCX0gZWxzZSB7Ci0JICAgIGlmICFbYm9hcmRfaW5mbyB0YXJnZXQgZXhpc3RzIGFzc2VtYmxlcl0gewotCQlzZXQgQVMgW2ZpbmRfZ2FzXTsKLQkgICAgfSBlbHNlIHsKLQkJc2V0IEFTIFtib2FyZF9pbmZvIHRhcmdldCBhc3NlbWJsZXJdOwotCSAgICB9Ci0JfQotCi0JaWYgW2luZm8gZXhpc3RzIEFTRkxBR1NfRk9SX1RBUkdFVF0gewotCSAgICBhcHBlbmQgZmxhZ3MgIiAkQVNGTEFHU19GT1JfVEFSR0VUIjsKLQl9Ci0KLQlpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQkgICAgc2V0IHNvdXJjZSBbcmVtb3RlX2Rvd25sb2FkIGhvc3QgJHNvdXJjZV07Ci0JICAgIHNldCBkZXN0ICJhLm91dCIKLQl9IGVsc2UgewotCSAgICBzZXQgZGVzdCAkZGVzdGZpbGUKLQl9Ci0Jc2V0IHN0YXR1cyBbcmVtb3RlX2V4ZWMgaG9zdCAiJEFTICRzb3VyY2UgJGZsYWdzIC1vICRkZXN0Il0KLQlpZiBbaXNfcmVtb3RlIGhvc3RdIHsKLQkgICAgcmVtb3RlX3VwbG9hZCBob3N0ICRkZXN0ICRkZXN0ZmlsZQotCX0KLQotCXNldCBjb21wX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgW2xpbmRleCAkc3RhdHVzIDFdXTsKLQlpZiB7IFtsaW5kZXggJHN0YXR1cyAwXSAhPSAwIH0gewotCSAgICB2ZXJib3NlIC1sb2cgImFzc2VtYmxlciBleGl0ZWQgd2l0aCBzdGF0dXMgW2xpbmRleCAkc3RhdHVzIDBdIjsKLQl9Ci0JaWYgeyBbbGluZGV4ICRzdGF0dXMgMV0gIT0gIiIgfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiYXNzZW1ibGVyIG91dHB1dCBpczpcbltsaW5kZXggJHN0YXR1cyAxXSIgMjsKLQl9Ci0JcmV0dXJuICR7Y29tcF9vdXRwdXR9OwotfQotfQotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvdmVyc2lvbi5jIGIvYmludXRpbHMvdmVyc2lvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDU1OTM5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3ZlcnNpb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIHZlcnNpb24uYyAtLSBiaW51dGlscyB2ZXJzaW9uIGluZm9ybWF0aW9uCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLQotLyogVGhpcyBpcyB0aGUgdmVyc2lvbiBudW1iZXJzIGZvciB0aGUgYmludXRpbHMuICBUaGV5IGFsbCBjaGFuZ2UgaW4KLSAgIGxvY2tzdGVwIC0tIGl0J3MgZWFzaWVyIHRoYXQgd2F5LiAqLwotCi1jb25zdCBjaGFyICpwcm9ncmFtX3ZlcnNpb24gPSBWRVJTSU9OOwotCi0vKiBQcmludCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIGNvcHlyaWdodCBpbmZvcm1hdGlvbiwgYW5kIGV4aXQuICBUaGlzCi0gICBpbXBsZW1lbnRzIHRoZSAtLXZlcnNpb24gb3B0aW9uIGZvciB0aGUgdmFyaW91cyBwcm9ncmFtcy4gICovCi0KLXZvaWQKLXByaW50X3ZlcnNpb24gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoIkdOVSAlcyAlc1xuIiwgbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKLSAgcHJpbnRmIChfKCJDb3B5cmlnaHQgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIpKTsKLSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvYmludXRpbHMvd2luZHJlcy5jIGIvYmludXRpbHMvd2luZHJlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2NkOTA5Li4wMDAwMDAwCi0tLSBhL2JpbnV0aWxzL3dpbmRyZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk5MiArMCwwIEBACi0vKiB3aW5kcmVzLmMgLS0gYSBwcm9ncmFtIHRvIG1hbmlwdWxhdGUgV2luZG93cyByZXNvdXJjZXMKLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBwcm9ncmFtIGNhbiByZWFkIGFuZCB3cml0ZSBXaW5kb3dzIHJlc291cmNlcyBpbiB2YXJpb3VzCi0gICBmb3JtYXRzLiAgSW4gcGFydGljdWxhciwgaXQgY2FuIGFjdCBsaWtlIHRoZSByYyByZXNvdXJjZSBjb21waWxlcgotICAgcHJvZ3JhbSwgYW5kIGl0IGNhbiBhY3QgbGlrZSB0aGUgY3Z0cmVzIHJlcyB0byBDT0ZGIGNvbnZlcnNpb24KLSAgIHByb2dyYW0uCi0KLSAgIEl0IGlzIGJhc2VkIG9uIGluZm9ybWF0aW9uIHRha2VuIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzOgotCi0gICAqIE1pY3Jvc29mdCBkb2N1bWVudGF0aW9uLgotCi0gICAqIFRoZSByY2wgcHJvZ3JhbSwgd3JpdHRlbiBieSBHdW50aGVyIEViZXJ0Ci0gICAgIDxndW50aGVyLmViZXJ0QGl4b3MtbGVpcHppZy5kZT4uCi0KLSAgICogVGhlIHJlczJjb2ZmIHByb2dyYW0sIHdyaXR0ZW4gYnkgUGVkcm8gQS4gQXJhbmRhIDxwYWFnQHRpZC5lcz4uCi0KLSAgICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAid2luZHJlcy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLS8qIHVzZWQgYnkgcmVzcmMuYyBhdCBsZWFzdCAqLwotCi1pbnQgdmVyYm9zZSA9IDA7Ci0KLS8qIEFuIGVudW1lcmF0aW9uIG9mIGZvcm1hdCB0eXBlcy4gICovCi0KLWVudW0gcmVzX2Zvcm1hdAotewotICAvKiBVbmtub3duIGZvcm1hdC4gICovCi0gIFJFU19GT1JNQVRfVU5LTk9XTiwKLSAgLyogVGV4dHVhbCBSQyBmaWxlLiAgKi8KLSAgUkVTX0ZPUk1BVF9SQywKLSAgLyogQmluYXJ5IFJFUyBmaWxlLiAgKi8KLSAgUkVTX0ZPUk1BVF9SRVMsCi0gIC8qIENPRkYgZmlsZS4gICovCi0gIFJFU19GT1JNQVRfQ09GRgotfTsKLQotLyogQSBzdHJ1Y3R1cmUgdXNlZCB0byBtYXAgYmV0d2VlbiBmb3JtYXQgdHlwZXMgYW5kIHN0cmluZ3MuICAqLwotCi1zdHJ1Y3QgZm9ybWF0X21hcAotewotICBjb25zdCBjaGFyICpuYW1lOwotICBlbnVtIHJlc19mb3JtYXQgZm9ybWF0OwotfTsKLQotLyogQSBtYXBwaW5nIGJldHdlZW4gbmFtZXMgYW5kIGZvcm1hdCB0eXBlcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZm9ybWF0X21hcCBmb3JtYXRfbmFtZXNbXSA9Ci17Ci0gIHsgInJjIiwgUkVTX0ZPUk1BVF9SQyB9LAotICB7ICJyZXMiLCBSRVNfRk9STUFUX1JFUyB9LAotICB7ICJjb2ZmIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgTlVMTCwgUkVTX0ZPUk1BVF9VTktOT1dOIH0KLX07Ci0KLS8qIEEgbWFwcGluZyBmcm9tIGZpbGUgZXh0ZW5zaW9ucyB0byBmb3JtYXQgdHlwZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgZm9ybWF0X2ZpbGVleHRzW10gPQotewotICB7ICJyYyIsIFJFU19GT1JNQVRfUkMgfSwKLSAgeyAicmVzIiwgUkVTX0ZPUk1BVF9SRVMgfSwKLSAgeyAiZXhlIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgIm9iaiIsIFJFU19GT1JNQVRfQ09GRiB9LAotICB7ICJvIiwgUkVTX0ZPUk1BVF9DT0ZGIH0sCi0gIHsgTlVMTCwgUkVTX0ZPUk1BVF9VTktOT1dOIH0KLX07Ci0KLS8qIEEgbGlzdCBvZiBpbmNsdWRlIGRpcmVjdG9yaWVzLiAgKi8KLQotc3RydWN0IGluY2x1ZGVfZGlyCi17Ci0gIHN0cnVjdCBpbmNsdWRlX2RpciAqbmV4dDsKLSAgY2hhciAqZGlyOwotfTsKLQotc3RhdGljIHN0cnVjdCBpbmNsdWRlX2RpciAqaW5jbHVkZV9kaXJzOwotCi0vKiBMb25nIG9wdGlvbnMuICAqLwotCi0vKiAxNTAgaXNuJ3Qgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0RFRklORSAxNTAKLSNkZWZpbmUgT1BUSU9OX0hFTFAgKE9QVElPTl9ERUZJTkUgKyAxKQotI2RlZmluZSBPUFRJT05fSU5DTFVERV9ESVIgKE9QVElPTl9IRUxQICsgMSkKLSNkZWZpbmUgT1BUSU9OX0xBTkdVQUdFIChPUFRJT05fSU5DTFVERV9ESVIgKyAxKQotI2RlZmluZSBPUFRJT05fUFJFUFJPQ0VTU09SIChPUFRJT05fTEFOR1VBR0UgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTiAoT1BUSU9OX1BSRVBST0NFU1NPUiArIDEpCi0jZGVmaW5lIE9QVElPTl9ZWURFQlVHIChPUFRJT05fVkVSU0lPTiArIDEpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJkZWZpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0RFRklORX0sCi0gIHsiaGVscCIsIG5vX2FyZ3VtZW50LCAwLCBPUFRJT05fSEVMUH0sCi0gIHsiaW5jbHVkZS1kaXIiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX0lOQ0xVREVfRElSfSwKLSAgeyJpbnB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKLSAgeyJsYW5ndWFnZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCBPUFRJT05fTEFOR1VBR0V9LAotICB7Im91dHB1dC1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJwcmVwcm9jZXNzb3IiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgT1BUSU9OX1BSRVBST0NFU1NPUn0sCi0gIHsidGFyZ2V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCi0gIHsidmVyYm9zZSIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1ZFUlNJT059LAotICB7Inl5ZGVidWciLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX1lZREVCVUd9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBTdGF0aWMgZnVuY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQgcmVzX2luaXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBleHRlbmRlZF9tZW51aXRlbXMgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnVpdGVtICopKTsKLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQgZm9ybWF0X2Zyb21fbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBlbnVtIHJlc19mb3JtYXQgZm9ybWF0X2Zyb21fZmlsZW5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHVzYWdlIFBBUkFNUyAoKEZJTEUgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGNtcF9yZXNfZW50cnkgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqc29ydF9yZXNvdXJjZXMgUEFSQU1TICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotDAotLyogV2hlbiB3ZSBhcmUgYnVpbGRpbmcgYSByZXNvdXJjZSB0cmVlLCB3ZSBhbGxvY2F0ZSBldmVyeXRoaW5nIG9udG8KLSAgIGFuIG9ic3RhY2ssIHNvIHRoYXQgd2UgY2FuIGZyZWUgaXQgYWxsIGF0IG9uY2UgaWYgd2Ugd2FudC4gICovCi0KLSNkZWZpbmUgb2JzdGFja19jaHVua19hbGxvYyB4bWFsbG9jCi0jZGVmaW5lIG9ic3RhY2tfY2h1bmtfZnJlZSBmcmVlCi0KLS8qIFRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHN0cnVjdCBvYnN0YWNrIHJlc19vYnN0YWNrOwotCi0vKiBJbml0aWFsaXplIHRoZSByZXNvdXJjZSBidWlsZGluZyBvYnN0YWNrLiAgKi8KLQotc3RhdGljIHZvaWQKLXJlc19pbml0ICgpCi17Ci0gIG9ic3RhY2tfaW5pdCAoJnJlc19vYnN0YWNrKTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2Ugb24gdGhlIHJlc291cmNlIGJ1aWxkaW5nIG9ic3RhY2suICAqLwotCi1QVFIKLXJlc19hbGxvYyAoYnl0ZXMpCi0gICAgIHNpemVfdCBieXRlczsKLXsKLSAgcmV0dXJuIChQVFIpIG9ic3RhY2tfYWxsb2MgKCZyZXNfb2JzdGFjaywgYnl0ZXMpOwotfQotCi0vKiBXZSBhbHNvIHVzZSBhbiBvYnN0YWNrIHRvIHNhdmUgbWVtb3J5IHVzZWQgd2hpbGUgd3JpdGluZyBvdXQgYSBzZXQKLSAgIG9mIHJlc291cmNlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb2JzdGFjayByZXN3cl9vYnN0YWNrOwotCi0vKiBJbml0aWFsaXplIHRoZSByZXNvdXJjZSB3cml0aW5nIG9ic3RhY2suICAqLwotCi1zdGF0aWMgdm9pZAotcmVzd3JfaW5pdCAoKQotewotICBvYnN0YWNrX2luaXQgKCZyZXN3cl9vYnN0YWNrKTsKLX0KLQotLyogQWxsb2NhdGUgc3BhY2Ugb24gdGhlIHJlc291cmNlIHdyaXRpbmcgb2JzdGFjay4gICovCi0KLVBUUgotcmVzd3JfYWxsb2MgKGJ5dGVzKQotICAgICBzaXplX3QgYnl0ZXM7Ci17Ci0gIHJldHVybiAoUFRSKSBvYnN0YWNrX2FsbG9jICgmcmVzd3Jfb2JzdGFjaywgYnl0ZXMpOwotfQotDAotLyogT3BlbiBhIGZpbGUgdXNpbmcgdGhlIGluY2x1ZGUgZGlyZWN0b3J5IHNlYXJjaCBsaXN0LiAgKi8KLQotRklMRSAqCi1vcGVuX2ZpbGVfc2VhcmNoIChmaWxlbmFtZSwgbW9kZSwgZXJybXNnLCByZWFsX2ZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbW9kZTsKLSAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICBjaGFyICoqcmVhbF9maWxlbmFtZTsKLXsKLSAgRklMRSAqZTsKLSAgc3RydWN0IGluY2x1ZGVfZGlyICpkOwotCi0gIGUgPSBmb3BlbiAoZmlsZW5hbWUsIG1vZGUpOwotICBpZiAoZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICpyZWFsX2ZpbGVuYW1lID0geHN0cmR1cCAoZmlsZW5hbWUpOwotICAgICAgcmV0dXJuIGU7Ci0gICAgfQotCi0gIGlmIChlcnJubyA9PSBFTk9FTlQpCi0gICAgewotICAgICAgZm9yIChkID0gaW5jbHVkZV9kaXJzOyBkICE9IE5VTEw7IGQgPSBkLT5uZXh0KQotCXsKLQkgIGNoYXIgKm47Ci0KLQkgIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGQtPmRpcikgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDIpOwotCSAgc3ByaW50ZiAobiwgIiVzLyVzIiwgZC0+ZGlyLCBmaWxlbmFtZSk7Ci0JICBlID0gZm9wZW4gKG4sIG1vZGUpOwotCSAgaWYgKGUgIT0gTlVMTCkKLQkgICAgewotCSAgICAgICpyZWFsX2ZpbGVuYW1lID0gbjsKLQkgICAgICByZXR1cm4gZTsKLQkgICAgfQotCi0JICBpZiAoZXJybm8gIT0gRU5PRU5UKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZhdGFsIChfKCJjYW4ndCBvcGVuICVzIGAlcyc6ICVzIiksIGVycm1zZywgZmlsZW5hbWUsIHN0cmVycm9yIChlcnJubykpOwotCi0gIC8qIFJldHVybiBhIHZhbHVlIHRvIGF2b2lkIGEgY29tcGlsZXIgd2FybmluZy4gICovCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogQ29tcGFyZSB0d28gcmVzb3VyY2UgSUQncy4gIFdlIGNvbnNpZGVyIG5hbWUgZW50cmllcyB0byBjb21lIGJlZm9yZQotICAgbnVtZXJpYyBlbnRyaWVzLCBiZWNhdXNlIHRoYXQgaXMgaG93IHRoZXkgYXBwZWFyIGluIHRoZSBDT0ZGIC5yc3JjCi0gICBzZWN0aW9uLiAgKi8KLQotaW50Ci1yZXNfaWRfY21wIChhLCBiKQotICAgICBzdHJ1Y3QgcmVzX2lkIGE7Ci0gICAgIHN0cnVjdCByZXNfaWQgYjsKLXsKLSAgaWYgKCEgYS5uYW1lZCkKLSAgICB7Ci0gICAgICBpZiAoYi5uYW1lZCkKLQlyZXR1cm4gMTsKLSAgICAgIGlmIChhLnUuaWQgPiBiLnUuaWQpCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmIChhLnUuaWQgPCBiLnUuaWQpCi0JcmV0dXJuIC0xOwotICAgICAgZWxzZQotCXJldHVybiAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHVuaWNoYXIgKmFzLCAqYXNlLCAqYnMsICpic2U7Ci0KLSAgICAgIGlmICghIGIubmFtZWQpCi0JcmV0dXJuIC0xOwotCi0gICAgICBhcyA9IGEudS5uLm5hbWU7Ci0gICAgICBhc2UgPSBhcyArIGEudS5uLmxlbmd0aDsKLSAgICAgIGJzID0gYi51Lm4ubmFtZTsKLSAgICAgIGJzZSA9IGJzICsgYi51Lm4ubGVuZ3RoOwotCi0gICAgICB3aGlsZSAoYXMgPCBhc2UpCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmIChicyA+PSBic2UpCi0JICAgIHJldHVybiAxOwotCSAgaSA9IChpbnQpICphcyAtIChpbnQpICpiczsKLQkgIGlmIChpICE9IDApCi0JICAgIHJldHVybiBpOwotCSAgKythczsKLQkgICsrYnM7Ci0JfQotCi0gICAgICBpZiAoYnMgPCBic2UpCi0JcmV0dXJuIC0xOwotCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGEgcmVzb3VyY2UgSUQuICAqLwotCi12b2lkCi1yZXNfaWRfcHJpbnQgKHN0cmVhbSwgaWQsIHF1b3RlKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIHN0cnVjdCByZXNfaWQgaWQ7Ci0gICAgIGludCBxdW90ZTsKLXsKLSAgaWYgKCEgaWQubmFtZWQpCi0gICAgZnByaW50ZiAoc3RyZWFtLCAiJWx1IiwgaWQudS5pZCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocXVvdGUpCi0JcHV0YyAoJyInLCBzdHJlYW0pOwotICAgICAgdW5pY29kZV9wcmludCAoc3RyZWFtLCBpZC51Lm4ubmFtZSwgaWQudS5uLmxlbmd0aCk7Ci0gICAgICBpZiAocXVvdGUpCi0JcHV0YyAoJyInLCBzdHJlYW0pOwotICAgIH0KLX0KLQotLyogUHJpbnQgYSBsaXN0IG9mIHJlc291cmNlIElEJ3MuICAqLwotCi12b2lkCi1yZXNfaWRzX3ByaW50IChzdHJlYW0sIGNpZHMsIGlkcykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgY2lkczsKLSAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAqaWRzOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY2lkczsgaSsrKQotICAgIHsKLSAgICAgIHJlc19pZF9wcmludCAoc3RyZWFtLCBpZHNbaV0sIDEpOwotICAgICAgaWYgKGkgKyAxIDwgY2lkcykKLQlmcHJpbnRmIChzdHJlYW0sICI6ICIpOwotICAgIH0KLX0KLQotLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSByZXNvdXJjZSBJRC4gICovCi0KLXZvaWQKLXJlc19zdHJpbmdfdG9faWQgKHJlc19pZCwgc3RyaW5nKQotICAgICBzdHJ1Y3QgcmVzX2lkICpyZXNfaWQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgcmVzX2lkLT5uYW1lZCA9IDE7Ci0gIHVuaWNvZGVfZnJvbV9hc2NpaSAoJnJlc19pZC0+dS5uLmxlbmd0aCwgJnJlc19pZC0+dS5uLm5hbWUsIHN0cmluZyk7Ci19Ci0KLS8qIERlZmluZSBhIHJlc291cmNlLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHJlc291cmNlIHRyZWUsIFJFU09VUkNFUywKLSAgIGFuZCB0aGUgbG9jYXRpb24gYXQgd2hpY2ggdG8gcHV0IGl0IGluIHRoZSB0cmVlLCBDSURTIGFuZCBJRFMuCi0gICBUaGlzIHJldHVybnMgYSBuZXdseSBhbGxvY2F0ZWQgcmVzX3Jlc291cmNlIHN0cnVjdHVyZSwgd2hpY2ggdGhlCi0gICBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gaW5pdGlhbGl6ZS4gIElmIERVUE9LIGlzIG5vbi16ZXJvLCB0aGVuIGlmIGEKLSAgIHJlc291cmNlIHdpdGggdGhpcyBJRCBleGlzdHMsIGl0IGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCBhIHdhcm5pbmcKLSAgIGlzIGlzc3VlZCwgYW5kIGEgbmV3IHJlc291cmNlIGlzIGNyZWF0ZWQgcmVwbGFjaW5nIHRoZSBleGlzdGluZwotICAgb25lLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1kZWZpbmVfcmVzb3VyY2UgKHJlc291cmNlcywgY2lkcywgaWRzLCBkdXBvaykKLSAgICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKipyZXNvdXJjZXM7Ci0gICAgIGludCBjaWRzOwotICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZHM7Ci0gICAgIGludCBkdXBvazsKLXsKLSAgc3RydWN0IHJlc19lbnRyeSAqcmUgPSBOVUxMOwotICBpbnQgaTsKLQotICBhc3NlcnQgKGNpZHMgPiAwKTsKLSAgZm9yIChpID0gMDsgaSA8IGNpZHM7IGkrKykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgcmVzX2VudHJ5ICoqcHA7Ci0KLSAgICAgIGlmICgqcmVzb3VyY2VzID09IE5VTEwpCi0JewotCSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXZhbDsKLQotCSAgLyogVXNlIHRoZSBzYW1lIHRpbWVzdGFtcCBmb3IgZXZlcnkgcmVzb3VyY2UgY3JlYXRlZCBpbiBhCi0gICAgICAgICAgICAgc2luZ2xlIHJ1bi4gICovCi0JICBpZiAodGltZXZhbCA9PSAwKQotCSAgICB0aW1ldmFsID0gdGltZSAoTlVMTCk7Ci0KLQkgICpyZXNvdXJjZXMgPSAoKHN0cnVjdCByZXNfZGlyZWN0b3J5ICopCi0JCQlyZXNfYWxsb2MgKHNpemVvZiAqKnJlc291cmNlcykpOwotCSAgKCpyZXNvdXJjZXMpLT5jaGFyYWN0ZXJpc3RpY3MgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT50aW1lID0gdGltZXZhbDsKLQkgICgqcmVzb3VyY2VzKS0+bWFqb3IgPSAwOwotCSAgKCpyZXNvdXJjZXMpLT5taW5vciA9IDA7Ci0JICAoKnJlc291cmNlcyktPmVudHJpZXMgPSBOVUxMOwotCX0KLQotICAgICAgZm9yIChwcCA9ICYoKnJlc291cmNlcyktPmVudHJpZXM7ICpwcCAhPSBOVUxMOyBwcCA9ICYoKnBwKS0+bmV4dCkKLQlpZiAocmVzX2lkX2NtcCAoKCpwcCktPmlkLCBpZHNbaV0pID09IDApCi0JICBicmVhazsKLQotICAgICAgaWYgKCpwcCAhPSBOVUxMKQotCXJlID0gKnBwOwotICAgICAgZWxzZQotCXsKLQkgIHJlID0gKHN0cnVjdCByZXNfZW50cnkgKikgcmVzX2FsbG9jIChzaXplb2YgKnJlKTsKLQkgIHJlLT5uZXh0ID0gTlVMTDsKLQkgIHJlLT5pZCA9IGlkc1tpXTsKLQkgIGlmICgoaSArIDEpIDwgY2lkcykKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAxOwotCSAgICAgIHJlLT51LmRpciA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlLT5zdWJkaXIgPSAwOwotCSAgICAgIHJlLT51LnJlcyA9IE5VTEw7Ci0JICAgIH0KLQotCSAgKnBwID0gcmU7Ci0JfQotCi0gICAgICBpZiAoKGkgKyAxKSA8IGNpZHMpCi0JewotCSAgaWYgKCEgcmUtPnN1YmRpcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotCSAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgaSwgaWRzKTsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnlcbiIpKTsKLQkgICAgICB4ZXhpdCAoMSk7Ci0JICAgIH0KLQotCSAgcmVzb3VyY2VzID0gJnJlLT51LmRpcjsKLQl9Ci0gICAgfQotCi0gIGlmIChyZS0+c3ViZGlyKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGV4cGVjdGVkIHRvIGJlIGEgbGVhZlxuIikpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICBpZiAocmUtPnUucmVzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGR1cG9rKQotCXJldHVybiByZS0+dS5yZXM7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHdhcm5pbmc6ICIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBjaWRzLCBpZHMpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCI6IGR1cGxpY2F0ZSB2YWx1ZVxuIikpOwotICAgIH0KLQotICByZS0+dS5yZXMgPSAoKHN0cnVjdCByZXNfcmVzb3VyY2UgKikKLQkgICAgICAgcmVzX2FsbG9jIChzaXplb2YgKHN0cnVjdCByZXNfcmVzb3VyY2UpKSk7Ci0KLSAgcmUtPnUucmVzLT50eXBlID0gUkVTX1RZUEVfVU5JTklUSUFMSVpFRDsKLSAgbWVtc2V0ICgmcmUtPnUucmVzLT5yZXNfaW5mbywgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVzX3Jlc19pbmZvKSk7Ci0gIG1lbXNldCAoJnJlLT51LnJlcy0+Y29mZl9pbmZvLCAwLCBzaXplb2YgKHN0cnVjdCByZXNfY29mZl9pbmZvKSk7Ci0KLSAgcmV0dXJuIHJlLT51LnJlczsKLX0KLQotLyogRGVmaW5lIGEgc3RhbmRhcmQgcmVzb3VyY2UuICBUaGlzIGlzIGEgdmVyc2lvbiBvZiBkZWZpbmVfcmVzb3VyY2UKLSAgIHRoYXQganVzdCB0YWtlcyB0eXBlLCBuYW1lLCBhbmQgbGFuZ3VhZ2UgYXJndW1lbnRzLiAgKi8KLQotc3RydWN0IHJlc19yZXNvdXJjZSAqCi1kZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UgKHJlc291cmNlcywgdHlwZSwgbmFtZSwgbGFuZ3VhZ2UsIGR1cG9rKQotICAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKnJlc291cmNlczsKLSAgICAgaW50IHR5cGU7Ci0gICAgIHN0cnVjdCByZXNfaWQgbmFtZTsKLSAgICAgaW50IGxhbmd1YWdlOwotICAgICBpbnQgZHVwb2s7Ci17Ci0gIHN0cnVjdCByZXNfaWQgYVszXTsKLQotICBhWzBdLm5hbWVkID0gMDsKLSAgYVswXS51LmlkID0gdHlwZTsKLSAgYVsxXSA9IG5hbWU7Ci0gIGFbMl0ubmFtZWQgPSAwOwotICBhWzJdLnUuaWQgPSBsYW5ndWFnZTsKLSAgcmV0dXJuIGRlZmluZV9yZXNvdXJjZSAocmVzb3VyY2VzLCAzLCBhLCBkdXBvayk7Ci19Ci0KLS8qIENvbXBhcmlzb24gcm91dGluZSBmb3IgcmVzb3VyY2Ugc29ydGluZy4gICovCi0KLXN0YXRpYyBpbnQKLWNtcF9yZXNfZW50cnkgKHAxLCBwMikKLSAgICAgY29uc3QgUFRSIHAxOwotICAgICBjb25zdCBQVFIgcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKipyZTEsICoqcmUyOwotCi0gIHJlMSA9IChjb25zdCBzdHJ1Y3QgcmVzX2VudHJ5ICoqKSBwMTsKLSAgcmUyID0gKGNvbnN0IHN0cnVjdCByZXNfZW50cnkgKiopIHAyOwotICByZXR1cm4gcmVzX2lkX2NtcCAoKCpyZTEpLT5pZCwgKCpyZTIpLT5pZCk7Ci19Ci0KLS8qIFNvcnQgdGhlIHJlc291cmNlcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqCi1zb3J0X3Jlc291cmNlcyAocmVzZGlyKQotICAgICBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVzZGlyOwotewotICBpbnQgYywgaTsKLSAgc3RydWN0IHJlc19lbnRyeSAqcmU7Ci0gIHN0cnVjdCByZXNfZW50cnkgKiphOwotCi0gIGlmIChyZXNkaXItPmVudHJpZXMgPT0gTlVMTCkKLSAgICByZXR1cm4gcmVzZGlyOwotCi0gIGMgPSAwOwotICBmb3IgKHJlID0gcmVzZGlyLT5lbnRyaWVzOyByZSAhPSBOVUxMOyByZSA9IHJlLT5uZXh0KQotICAgICsrYzsKLQotICAvKiBUaGlzIGlzIGEgcmVjdXJzaXZlIHJvdXRpbmUsIHNvIHVzaW5nIHhtYWxsb2MgaXMgcHJvYmFibHkgYmV0dGVyCi0gICAgIHRoYW4gYWxsb2NhLiAgKi8KLSAgYSA9IChzdHJ1Y3QgcmVzX2VudHJ5ICoqKSB4bWFsbG9jIChjICogc2l6ZW9mIChzdHJ1Y3QgcmVzX2VudHJ5ICopKTsKLQotICBmb3IgKGkgPSAwLCByZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCwgaSsrKQotICAgIGFbaV0gPSByZTsKLQotICBxc29ydCAoYSwgYywgc2l6ZW9mIChzdHJ1Y3QgcmVzX2VudHJ5ICopLCBjbXBfcmVzX2VudHJ5KTsKLQotICByZXNkaXItPmVudHJpZXMgPSBhWzBdOwotICBmb3IgKGkgPSAwOyBpIDwgYyAtIDE7IGkrKykKLSAgICBhW2ldLT5uZXh0ID0gYVtpICsgMV07Ci0gIGFbaV0tPm5leHQgPSBOVUxMOwotCi0gIGZyZWUgKGEpOwotCi0gIC8qIE5vdyBzb3J0IHRoZSBzdWJkaXJlY3Rvcmllcy4gICovCi0KLSAgZm9yIChyZSA9IHJlc2Rpci0+ZW50cmllczsgcmUgIT0gTlVMTDsgcmUgPSByZS0+bmV4dCkKLSAgICBpZiAocmUtPnN1YmRpcikKLSAgICAgIHJlLT51LmRpciA9IHNvcnRfcmVzb3VyY2VzIChyZS0+dS5kaXIpOwotCi0gIHJldHVybiByZXNkaXI7Ci19Ci0MCi0vKiBSZXR1cm4gd2hldGhlciB0aGUgZGlhbG9nIHJlc291cmNlIERJQUxPRyBpcyBhIERJQUxPRyBvciBhCi0gICBESUFMT0dFWC4gICovCi0KLWludAotZXh0ZW5kZWRfZGlhbG9nIChkaWFsb2cpCi0gICAgIGNvbnN0IHN0cnVjdCBkaWFsb2cgKmRpYWxvZzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpYWxvZ19jb250cm9sICpjOwotCi0gIGlmIChkaWFsb2ctPmV4ICE9IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0KLSAgZm9yIChjID0gZGlhbG9nLT5jb250cm9sczsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dCkKLSAgICBpZiAoYy0+ZGF0YSAhPSBOVUxMIHx8IGMtPmhlbHAgIT0gMCkKLSAgICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBNRU5VSVRFTVMgYXJlIGEgTUVOVSBvciBhIE1FTlVFWC4gICovCi0KLWludAotZXh0ZW5kZWRfbWVudSAobWVudSkKLSAgICAgY29uc3Qgc3RydWN0IG1lbnUgKm1lbnU7Ci17Ci0gIHJldHVybiBleHRlbmRlZF9tZW51aXRlbXMgKG1lbnUtPml0ZW1zKTsKLX0KLQotc3RhdGljIGludAotZXh0ZW5kZWRfbWVudWl0ZW1zIChtZW51aXRlbXMpCi0gICAgIGNvbnN0IHN0cnVjdCBtZW51aXRlbSAqbWVudWl0ZW1zOwotewotICBjb25zdCBzdHJ1Y3QgbWVudWl0ZW0gKm1pOwotCi0gIGZvciAobWkgPSBtZW51aXRlbXM7IG1pICE9IE5VTEw7IG1pID0gbWktPm5leHQpCi0gICAgewotICAgICAgaWYgKG1pLT5oZWxwICE9IDAgfHwgbWktPnN0YXRlICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwgJiYgbWktPmlkICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKG1pLT50eXBlCi0JICAgJiB+IChNRU5VSVRFTV9DSEVDS0VECi0JCXwgTUVOVUlURU1fR1JBWUVECi0JCXwgTUVOVUlURU1fSEVMUAotCQl8IE1FTlVJVEVNX0lOQUNUSVZFCi0JCXwgTUVOVUlURU1fTUVOVUJBUkJSRUFLCi0JCXwgTUVOVUlURU1fTUVOVUJSRUFLKSkKLQkgICE9IDApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAobWktPnBvcHVwICE9IE5VTEwpCi0JewotCSAgaWYgKGV4dGVuZGVkX21lbnVpdGVtcyAobWktPnBvcHVwKSkKLQkgICAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQwKLS8qIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBmb3JtYXQgdHlwZSwgb3IgZXhpdCBpZiBpdCBjYW4ndCBiZSBkb25lLiAgKi8KLQotc3RhdGljIGVudW0gcmVzX2Zvcm1hdAotZm9ybWF0X2Zyb21fbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgKm07Ci0KLSAgZm9yIChtID0gZm9ybWF0X25hbWVzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLSAgICBpZiAoc3RyY2FzZWNtcCAobS0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChtLT5uYW1lID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5rbm93biBmb3JtYXQgdHlwZSBgJXMnXG4iKSwgcHJvZ3JhbV9uYW1lLCBuYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHN1cHBvcnRlZCBmb3JtYXRzOiIpLCBwcm9ncmFtX25hbWUpOwotICAgICAgZm9yIChtID0gZm9ybWF0X25hbWVzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLQlmcHJpbnRmIChzdGRlcnIsICIgJXMiLCBtLT5uYW1lKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotCi0gIHJldHVybiBtLT5mb3JtYXQ7Ci19Ci0KLS8qIFdvcmsgb3V0IGEgZm9ybWF0IHR5cGUgZ2l2ZW4gYSBmaWxlIG5hbWUuICBJZiBJTlBVVCBpcyBub24temVybywKLSAgIGl0J3MgT0sgdG8gbG9vayBhdCB0aGUgZmlsZSBpdHNlbGYuICAqLwotCi1zdGF0aWMgZW51bSByZXNfZm9ybWF0Ci1mb3JtYXRfZnJvbV9maWxlbmFtZSAoZmlsZW5hbWUsIGlucHV0KQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgaW50IGlucHV0OwotewotICBjb25zdCBjaGFyICpleHQ7Ci0gIEZJTEUgKmU7Ci0gIHVuc2lnbmVkIGNoYXIgYjEsIGIyLCBiMywgYjQsIGI1OwotICBpbnQgbWFnaWM7Ci0KLSAgLyogSWYgd2UgaGF2ZSBhbiBleHRlbnNpb24sIHNlZSBpZiB3ZSByZWNvZ25pemUgaXQgYXMgaW1wbHlpbmcgYQotICAgICBwYXJ0aWN1bGFyIGZvcm1hdC4gICovCi0gIGV4dCA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLicpOwotICBpZiAoZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGZvcm1hdF9tYXAgKm07Ci0KLSAgICAgICsrZXh0OwotICAgICAgZm9yIChtID0gZm9ybWF0X2ZpbGVleHRzOyBtLT5uYW1lICE9IE5VTEw7IG0rKykKLQlpZiAoc3RyY2FzZWNtcCAobS0+bmFtZSwgZXh0KSA9PSAwKQotCSAgcmV0dXJuIG0tPmZvcm1hdDsKLSAgICB9Ci0KLSAgLyogSWYgd2UgZG9uJ3QgcmVjb2duaXplIHRoZSBuYW1lIG9mIGFuIG91dHB1dCBmaWxlLCBhc3N1bWUgaXQncyBhCi0gICAgIENPRkYgZmlsZS4gICovCi0KLSAgaWYgKCEgaW5wdXQpCi0gICAgcmV0dXJuIFJFU19GT1JNQVRfQ09GRjsKLQotICAvKiBSZWFkIHRoZSBmaXJzdCBmZXcgYnl0ZXMgb2YgdGhlIGZpbGUgdG8gc2VlIGlmIHdlIGNhbiBndWVzcyB3aGF0Ci0gICAgIGl0IGlzLiAgKi8KLQotICBlID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gIGlmIChlID09IE5VTEwpCi0gICAgZmF0YWwgKCIlczogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7Ci0KLSAgYjEgPSBnZXRjIChlKTsKLSAgYjIgPSBnZXRjIChlKTsKLSAgYjMgPSBnZXRjIChlKTsKLSAgYjQgPSBnZXRjIChlKTsKLSAgYjUgPSBnZXRjIChlKTsKLQotICBmY2xvc2UgKGUpOwotCi0gIC8qIEEgUEUgZXhlY3V0YWJsZSBzdGFydHMgd2l0aCAweDRkIDB4NWEuICAqLwotICBpZiAoYjEgPT0gMHg0ZCAmJiBiMiA9PSAweDVhKQotICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0KLSAgLyogQSBDT0ZGIC5vIGZpbGUgc3RhcnRzIHdpdGggYSBDT0ZGIG1hZ2ljIG51bWJlci4gICovCi0gIG1hZ2ljID0gKGIyIDw8IDgpIHwgYjE7Ci0gIHN3aXRjaCAobWFnaWMpCi0gICAgewotICAgIGNhc2UgMHgxNGM6IC8qIGkzODYgKi8KLSAgICBjYXNlIDB4MTY2OiAvKiBNSVBTICovCi0gICAgY2FzZSAweDE4NDogLyogQWxwaGEgKi8KLSAgICBjYXNlIDB4MjY4OiAvKiA2OGsgKi8KLSAgICBjYXNlIDB4MWYwOiAvKiBQb3dlclBDICovCi0gICAgY2FzZSAweDI5MDogLyogUEEgKi8KLSAgICAgIHJldHVybiBSRVNfRk9STUFUX0NPRkY7Ci0gICAgfQotCi0gIC8qIEEgUkVTIGZpbGUgc3RhcnRzIHdpdGggMHgwIDB4MCAweDAgMHgwIDB4MjAgMHgwIDB4MCAweDAuICAqLwotICBpZiAoYjEgPT0gMCAmJiBiMiA9PSAwICYmIGIzID09IDAgJiYgYjQgPT0gMCAmJiBiNSA9PSAweDIwKQotICAgIHJldHVybiBSRVNfRk9STUFUX1JFUzsKLQotICAvKiBJZiBldmVyeSBjaGFyYWN0ZXIgaXMgcHJpbnRhYmxlIG9yIHNwYWNlLCBhc3N1bWUgaXQncyBhbiBSQyBmaWxlLiAgKi8KLSAgaWYgKChpc3ByaW50IChiMSkgfHwgaXNzcGFjZSAoYjEpKQotICAgICAgJiYgKGlzcHJpbnQgKGIyKSB8fCBpc3NwYWNlIChiMikpCi0gICAgICAmJiAoaXNwcmludCAoYjMpIHx8IGlzc3BhY2UgKGIzKSkKLSAgICAgICYmIChpc3ByaW50IChiNCkgfHwgaXNzcGFjZSAoYjQpKQotICAgICAgJiYgKGlzcHJpbnQgKGI1KSB8fCBpc3NwYWNlIChiNSkpKQotICAgIHJldHVybiBSRVNfRk9STUFUX1JDOwotCi0gIC8qIE90aGVyd2lzZSwgd2UgZ2l2ZSB1cC4gICovCi0gIGZhdGFsIChfKCJjYW4gbm90IGRldGVybWluZSB0eXBlIG9mIGZpbGUgYCVzJzsgdXNlIHRoZSAtSSBvcHRpb24iKSwKLQkgZmlsZW5hbWUpOwotCi0gIC8qIFJldHVybiBzb21ldGhpbmcgdG8gc2lsZW5jZSB0aGUgY29tcGlsZXIgd2FybmluZy4gICovCi0gIHJldHVybiBSRVNfRk9STUFUX1VOS05PV047Ci19Ci0KLS8qIFByaW50IGEgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4gICovCi0KLXN0YXRpYyB2b2lkCi11c2FnZSAoc3RyZWFtLCBzdGF0dXMpCi0gICAgIEZJTEUgKnN0cmVhbTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJVc2FnZTogJXMgW29wdGlvbnNdIFtpbnB1dC1maWxlXSBbb3V0cHV0LWZpbGVdXG4iKSwKLQkgICBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLU9wdGlvbnM6XG5cCi0gIC1pIEZJTEUsIC0taW5wdXQgRklMRSAgICAgICBOYW1lIGlucHV0IGZpbGVcblwKLSAgLW8gRklMRSwgLS1vdXRwdXQgRklMRSAgICAgIE5hbWUgb3V0cHV0IGZpbGVcblwKLSAgLUkgRk9STUFULCAtLWlucHV0LWZvcm1hdCBGT1JNQVRcblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgaW5wdXQgZm9ybWF0XG5cCi0gIC1PIEZPUk1BVCwgLS1vdXRwdXQtZm9ybWF0IEZPUk1BVFxuXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBvdXRwdXQgZm9ybWF0XG5cCi0gIC1GIFRBUkdFVCwgLS10YXJnZXQgVEFSR0VUICBTcGVjaWZ5IENPRkYgdGFyZ2V0XG5cCi0gIC0tcHJlcHJvY2Vzc29yIFBST0dSQU0gICAgICBQcm9ncmFtIHRvIHVzZSB0byBwcmVwcm9jZXNzIHJjIGZpbGVcblwKLSAgLS1pbmNsdWRlLWRpciBESVIgICAgICAgICAgIEluY2x1ZGUgZGlyZWN0b3J5IHdoZW4gcHJlcHJvY2Vzc2luZyByYyBmaWxlXG5cCi0gIC1EU1lNWz1WQUxdLCAtLWRlZmluZSBTWU1bPVZBTF1cblwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSBTWU0gd2hlbiBwcmVwcm9jZXNzaW5nIHJjIGZpbGVcblwKLSAgLXYgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcmJvc2UgLSB0ZWxscyB5b3Ugd2hhdCBpdCdzIGRvaW5nXG5cCi0gIC0tbGFuZ3VhZ2UgVkFMICAgICAgICAgICAgICBTZXQgbGFuZ3VhZ2Ugd2hlbiByZWFkaW5nIHJjIGZpbGVcbiIpKTsKLSNpZmRlZiBZWURFQlVHCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLXl5ZGVidWcgICAgICAgICAgICAgICAgICAgVHVybiBvbiBwYXJzZXIgZGVidWdnaW5nXG4iKSk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC0taGVscCAgICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgbWVzc2FnZVxuXAotICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAgUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvblxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLUZPUk1BVCBpcyBvbmUgb2YgcmMsIHJlcywgb3IgY29mZiwgYW5kIGlzIGRlZHVjZWQgZnJvbSB0aGUgZmlsZSBuYW1lXG5cCi1leHRlbnNpb24gaWYgbm90IHNwZWNpZmllZC4gIEEgc2luZ2xlIGZpbGUgbmFtZSBpcyBhbiBpbnB1dCBmaWxlLlxuXAotTm8gaW5wdXQtZmlsZSBpcyBzdGRpbiwgZGVmYXVsdCByYy4gIE5vIG91dHB1dC1maWxlIGlzIHN0ZG91dCwgZGVmYXVsdCByYy5cbiIpKTsKLSAgbGlzdF9zdXBwb3J0ZWRfdGFyZ2V0cyAocHJvZ3JhbV9uYW1lLCBzdHJlYW0pOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgZnByaW50ZiAoc3RyZWFtLCBfKCJSZXBvcnQgYnVncyB0byBidWctZ251LXV0aWxzQGdudS5vcmdcbiIpKTsKLSAgZXhpdCAoc3RhdHVzKTsKLX0KLQotLyogUXVvdGUgY2hhcmFjdGVycyB0aGF0IHdpbGwgY29uZnVzZSB0aGUgc2hlbGwgd2hlbiB3ZSBydW4gdGhlIHByZXByb2Nlc3NvciAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnF1b3QgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdGF0aWMgY2hhciAqYnVmID0gMDsKLSAgc3RhdGljIGludCBidWZsZW4gPSAwOwotICBpbnQgc2xlbiA9IHN0cmxlbiAoc3RyaW5nKTsKLSAgY29uc3QgY2hhciAqc3JjOwotICBjaGFyICpkZXN0OwotCi0gIGlmICgoYnVmbGVuIDwgc2xlbiAqIDIgKyAyKSB8fCAhYnVmKQotICAgIHsKLSAgICAgIGJ1ZmxlbiA9IHNsZW4gKiAyICsgMjsKLSAgICAgIGlmIChidWYpCi0JZnJlZSAoYnVmKTsKLSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGJ1Zmxlbik7Ci0gICAgfQotCi0gIGZvciAoc3JjPXN0cmluZywgZGVzdD1idWY7ICpzcmM7IHNyYysrLCBkZXN0KyspCi0gICAgewotICAgICAgaWYgKCpzcmMgPT0gJygnIHx8ICpzcmMgPT0gJyknIHx8ICpzcmMgPT0gJyAnKQotCSpkZXN0KysgPSAnXFwnOwotICAgICAgKmRlc3QgPSAqc3JjOwotICAgIH0KLSAgKmRlc3QgPSAwOwotICByZXR1cm4gYnVmOwotfQotCi0vKiBUaGUgbWFpbiBmdW5jdGlvbi4gICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgY2hhciAqaW5wdXRfZmlsZW5hbWU7Ci0gIGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLSAgZW51bSByZXNfZm9ybWF0IGlucHV0X2Zvcm1hdDsKLSAgZW51bSByZXNfZm9ybWF0IG91dHB1dF9mb3JtYXQ7Ci0gIGNoYXIgKnRhcmdldDsKLSAgY2hhciAqcHJlcHJvY2Vzc29yOwotICBjaGFyICpwcmVwcm9jYXJnczsKLSAgY29uc3QgY2hhciAqcXVvdGVkYXJnOwotICBpbnQgbGFuZ3VhZ2U7Ci0gIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZXNvdXJjZXM7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHByb2dyYW1fbmFtZSk7Ci0KLSAgYmZkX2luaXQgKCk7Ci0gIHNldF9kZWZhdWx0X2JmZF90YXJnZXQgKCk7Ci0KLSAgcmVzX2luaXQgKCk7Ci0KLSAgaW5wdXRfZmlsZW5hbWUgPSBOVUxMOwotICBvdXRwdXRfZmlsZW5hbWUgPSBOVUxMOwotICBpbnB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1VOS05PV047Ci0gIG91dHB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1VOS05PV047Ci0gIHRhcmdldCA9IE5VTEw7Ci0gIHByZXByb2Nlc3NvciA9IE5VTEw7Ci0gIHByZXByb2NhcmdzID0gTlVMTDsKLSAgbGFuZ3VhZ2UgPSAtMTsKLQotICB3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImk6bzpJOk86RjpEOnYiLCBsb25nX29wdGlvbnMsCi0JCQkgICAoaW50ICopIDApKSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdpJzoKLQkgIGlucHV0X2ZpbGVuYW1lID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICdvJzoKLQkgIG91dHB1dF9maWxlbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6Ci0JICBpbnB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9uYW1lIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdPJzoKLQkgIG91dHB1dF9mb3JtYXQgPSBmb3JtYXRfZnJvbV9uYW1lIChvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIHRhcmdldCA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fUFJFUFJPQ0VTU09SOgotCSAgcHJlcHJvY2Vzc29yID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0KLQljYXNlICdEJzoKLQljYXNlIE9QVElPTl9ERUZJTkU6Ci0JICBpZiAocHJlcHJvY2FyZ3MgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIHF1b3RlZGFyZyA9IHF1b3QgKG9wdGFyZyk7Ci0JICAgICAgcHJlcHJvY2FyZ3MgPSB4bWFsbG9jIChzdHJsZW4gKHF1b3RlZGFyZykgKyAzKTsKLQkgICAgICBzcHJpbnRmIChwcmVwcm9jYXJncywgIi1EJXMiLCBxdW90ZWRhcmcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpuOwotCi0JICAgICAgcXVvdGVkYXJnID0gcXVvdCAob3B0YXJnKTsKLQkgICAgICBuID0geG1hbGxvYyAoc3RybGVuIChwcmVwcm9jYXJncykgKyBzdHJsZW4gKHF1b3RlZGFyZykgKyA0KTsKLQkgICAgICBzcHJpbnRmIChuLCAiJXMgLUQlcyIsIHByZXByb2NhcmdzLCBxdW90ZWRhcmcpOwotCSAgICAgIGZyZWUgKHByZXByb2NhcmdzKTsKLQkgICAgICBwcmVwcm9jYXJncyA9IG47Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAndic6Ci0JICB2ZXJib3NlICsrOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9JTkNMVURFX0RJUjoKLQkgIGlmIChwcmVwcm9jYXJncyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgcXVvdGVkYXJnID0gcXVvdCAob3B0YXJnKTsKLQkgICAgICBwcmVwcm9jYXJncyA9IHhtYWxsb2MgKHN0cmxlbiAocXVvdGVkYXJnKSArIDMpOwotCSAgICAgIHNwcmludGYgKHByZXByb2NhcmdzLCAiLUklcyIsIHF1b3RlZGFyZyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKm47Ci0KLQkgICAgICBxdW90ZWRhcmcgPSBxdW90IChvcHRhcmcpOwotCSAgICAgIG4gPSB4bWFsbG9jIChzdHJsZW4gKHByZXByb2NhcmdzKSArIHN0cmxlbiAocXVvdGVkYXJnKSArIDQpOwotCSAgICAgIHNwcmludGYgKG4sICIlcyAtSSVzIiwgcHJlcHJvY2FyZ3MsIHF1b3RlZGFyZyk7Ci0JICAgICAgZnJlZSAocHJlcHJvY2FyZ3MpOwotCSAgICAgIHByZXByb2NhcmdzID0gbjsKLQkgICAgfQotCi0JICB7Ci0JICAgIHN0cnVjdCBpbmNsdWRlX2RpciAqbiwgKipwcDsKLQotCSAgICBuID0gKHN0cnVjdCBpbmNsdWRlX2RpciAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gTlVMTDsKLQkgICAgbi0+ZGlyID0gb3B0YXJnOwotCi0JICAgIGZvciAocHAgPSAmaW5jbHVkZV9kaXJzOyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgICAgOwotCSAgICAqcHAgPSBuOwotCSAgfQotCi0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0xBTkdVQUdFOgotCSAgbGFuZ3VhZ2UgPSBzdHJ0b2wgKG9wdGFyZywgKGNoYXIgKiopIE5VTEwsIDE2KTsKLQkgIGJyZWFrOwotCi0jaWZkZWYgWVlERUJVRwotCWNhc2UgT1BUSU9OX1lZREVCVUc6Ci0JICB5eWRlYnVnID0gMTsKLQkgIGJyZWFrOwotI2VuZGlmCi0KLQljYXNlIE9QVElPTl9IRUxQOgotCSAgdXNhZ2UgKHN0ZG91dCwgMCk7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1ZFUlNJT046Ci0JICBwcmludF92ZXJzaW9uICgid2luZHJlcyIpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpbnB1dF9maWxlbmFtZSA9PSBOVUxMICYmIG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgaW5wdXRfZmlsZW5hbWUgPSBhcmd2W29wdGluZF07Ci0gICAgICArK29wdGluZDsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9maWxlbmFtZSA9PSBOVUxMICYmIG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gYXJndltvcHRpbmRdOwotICAgICAgKytvcHRpbmQ7Ci0gICAgfQotCi0gIGlmIChhcmdjICE9IG9wdGluZCkKLSAgICB1c2FnZSAoc3RkZXJyLCAxKTsKLQotICBpZiAoaW5wdXRfZm9ybWF0ID09IFJFU19GT1JNQVRfVU5LTk9XTikKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRfZmlsZW5hbWUgPT0gTlVMTCkKLQlpbnB1dF9mb3JtYXQgPSBSRVNfRk9STUFUX1JDOwotICAgICAgZWxzZQotCWlucHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIChpbnB1dF9maWxlbmFtZSwgMSk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfZm9ybWF0ID09IFJFU19GT1JNQVRfVU5LTk9XTikKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X2ZpbGVuYW1lID09IE5VTEwpCi0Jb3V0cHV0X2Zvcm1hdCA9IFJFU19GT1JNQVRfUkM7Ci0gICAgICBlbHNlCi0Jb3V0cHV0X2Zvcm1hdCA9IGZvcm1hdF9mcm9tX2ZpbGVuYW1lIChvdXRwdXRfZmlsZW5hbWUsIDApOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBpbnB1dCBmaWxlLiAgKi8KLQotICBzd2l0Y2ggKGlucHV0X2Zvcm1hdCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SQzoKLSAgICAgIHJlc291cmNlcyA9IHJlYWRfcmNfZmlsZSAoaW5wdXRfZmlsZW5hbWUsIHByZXByb2Nlc3NvciwgcHJlcHJvY2FyZ3MsCi0JCQkJbGFuZ3VhZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVNfRk9STUFUX1JFUzoKLSAgICAgIHJlc291cmNlcyA9IHJlYWRfcmVzX2ZpbGUgKGlucHV0X2ZpbGVuYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9DT0ZGOgotICAgICAgcmVzb3VyY2VzID0gcmVhZF9jb2ZmX3JzcmMgKGlucHV0X2ZpbGVuYW1lLCB0YXJnZXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChyZXNvdXJjZXMgPT0gTlVMTCkKLSAgICBmYXRhbCAoXygibm8gcmVzb3VyY2VzIikpOwotCi0gIC8qIFNvcnQgdGhlIHJlc291cmNlcy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIENPRkYsIGNvbnZlbmllbnQgZm9yCi0gICAgIHJjLCBhbmQgdW5pbXBvcnRhbnQgZm9yIHJlcy4gICovCi0KLSAgcmVzb3VyY2VzID0gc29ydF9yZXNvdXJjZXMgKHJlc291cmNlcyk7Ci0KLSAgLyogV3JpdGUgdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICByZXN3cl9pbml0ICgpOwotCi0gIHN3aXRjaCAob3V0cHV0X2Zvcm1hdCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SQzoKLSAgICAgIHdyaXRlX3JjX2ZpbGUgKG91dHB1dF9maWxlbmFtZSwgcmVzb3VyY2VzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUkVTX0ZPUk1BVF9SRVM6Ci0gICAgICB3cml0ZV9yZXNfZmlsZSAob3V0cHV0X2ZpbGVuYW1lLCByZXNvdXJjZXMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSRVNfRk9STUFUX0NPRkY6Ci0gICAgICB3cml0ZV9jb2ZmX2ZpbGUgKG91dHB1dF9maWxlbmFtZSwgdGFyZ2V0LCByZXNvdXJjZXMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHhleGl0ICgwKTsKLSAgcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmRyZXMuaCBiL2JpbnV0aWxzL3dpbmRyZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0M2RkNS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kcmVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NDkgKzAsMCBAQAotLyogd2luZHJlcy5oIC0tIGhlYWRlciBmaWxlIGZvciB3aW5kcmVzIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBUaGlzIGlzIHRoZSBoZWFkZXIgZmlsZSBmb3IgdGhlIHdpbmRyZXMgcHJvZ3JhbS4gIEl0IGRlZmluZXMKLSAgIHN0cnVjdHVyZXMgYW5kIGRlY2xhcmVzIGZ1bmN0aW9ucyB1c2VkIHdpdGhpbiB0aGUgcHJvZ3JhbS4gICovCi0KLSNpbmNsdWRlICJ3aW5kdW5pLmgiCi0KLS8qIFdlIHJlcHJlc2VudCByZXNvdXJjZXMgaW50ZXJuYWxseSBhcyBhIHRyZWUsIHNpbWlsYXIgdG8gdGhlIHRyZWUKLSAgIHVzZWQgaW4gdGhlIC5yc3JjIHNlY3Rpb24gb2YgYSBDT0ZGIGZpbGUuICBUaGUgcm9vdCBpcyBhCi0gICByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCByZXNfZGlyZWN0b3J5Ci17Ci0gIC8qIFJlc291cmNlIGZsYWdzLiAgQWNjb3JkaW5nIHRvIHRoZSBNUyBkb2NzLCB0aGlzIGlzIGN1cnJlbnRseQotICAgICBhbHdheXMgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgY2hhcmFjdGVyaXN0aWNzOwotICAvKiBUaW1lL2RhdGUgc3RhbXAuICAqLwotICB1bnNpZ25lZCBsb25nIHRpbWU7Ci0gIC8qIE1ham9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWFqb3I7Ci0gIC8qIE1pbm9yIHZlcnNpb24gbnVtYmVyLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgbWlub3I7Ci0gIC8qIERpcmVjdG9yeSBlbnRyaWVzLiAgKi8KLSAgc3RydWN0IHJlc19lbnRyeSAqZW50cmllczsKLX07Ci0KLS8qIEEgcmVzb3VyY2UgSUQgaXMgc3RvcmVkIGluIGEgcmVzX2lkIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCByZXNfaWQKLXsKLSAgLyogTm9uLXplcm8gaWYgdGhpcyBlbnRyeSBoYXMgYSBuYW1lIHJhdGhlciB0aGFuIGFuIElELiAgKi8KLSAgdW5zaWduZWQgaW50IG5hbWVkIDogMTsKLSAgdW5pb24KLSAgewotICAgIC8qIElmIHRoZSBuYW1lZCBmaWVsZCBpcyBub24temVybywgdGhpcyBpcyB0aGUgbmFtZS4gICovCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgLyogTGVuZ3RoIG9mIHRoZSBuYW1lLiAgKi8KLSAgICAgIGludCBsZW5ndGg7Ci0gICAgICAvKiBQb2ludGVyIHRvIHRoZSBuYW1lLCB3aGljaCBpcyBhIFVuaWNvZGUgc3RyaW5nLiAgKi8KLSAgICAgIHVuaWNoYXIgKm5hbWU7Ci0gICAgfSBuOwotICAgIC8qIElmIHRoZSBuYW1lZCBmaWVsZCBpcyB6ZXJvLCB0aGlzIGlzIHRoZSBJRC4gICovCi0gICAgdW5zaWduZWQgbG9uZyBpZDsKLSAgfSB1OwotfTsKLQotLyogRWFjaCBlbnRyeSBpbiB0aGUgdHJlZSBpcyBhIHJlc19lbnRyeSBzdHJ1Y3R1cmUuICBXZSBtaXgKLSAgIGRpcmVjdG9yaWVzIGFuZCByZXNvdXJjZXMgYmVjYXVzZSBpbiBhIENPRkYgZmlsZSBhbGwgZW50cmllcyBpbiBhCi0gICBkaXJlY3RvcnkgYXJlIHNvcnRlZCB0b2dldGhlciwgd2hldGhlciB0aGUgZW50cmllcyBhcmUKLSAgIHN1YmRpcmVjdG9yaWVzIG9yIHJlc291cmNlcy4gICovCi0KLXN0cnVjdCByZXNfZW50cnkKLXsKLSAgLyogTmV4dCBlbnRyeS4gICovCi0gIHN0cnVjdCByZXNfZW50cnkgKm5leHQ7Ci0gIC8qIFJlc291cmNlIElELiAgKi8KLSAgc3RydWN0IHJlc19pZCBpZDsKLSAgLyogTm9uLXplcm8gaWYgdGhpcyBlbnRyeSBpcyBhIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBhIGxlYWYuICAqLwotICB1bnNpZ25lZCBpbnQgc3ViZGlyIDogMTsKLSAgdW5pb24KLSAgewotICAgIC8qIElmIHRoZSBzdWJkaXIgZmllbGQgaXMgbm9uLXplcm8sIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZQotICAgICAgIHN1YmRpcmVjdG9yeS4gICovCi0gICAgc3RydWN0IHJlc19kaXJlY3RvcnkgKmRpcjsKLSAgICAvKiBJZiB0aGUgc3ViZGlyIGZpZWxkIGlzIHplcm8sIHRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSByZXNvdXJjZQotICAgICAgIGRhdGEuICAqLwotICAgIHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsKLSAgfSB1OwotfTsKLQotLyogVHlwZXMgb2YgcmVzb3VyY2VzLiAgKi8KLQotZW51bSByZXNfdHlwZQotewotICBSRVNfVFlQRV9VTklOSVRJQUxJWkVELAotICBSRVNfVFlQRV9BQ0NFTEVSQVRPUiwKLSAgUkVTX1RZUEVfQklUTUFQLAotICBSRVNfVFlQRV9DVVJTT1IsCi0gIFJFU19UWVBFX0dST1VQX0NVUlNPUiwKLSAgUkVTX1RZUEVfRElBTE9HLAotICBSRVNfVFlQRV9GT05ULAotICBSRVNfVFlQRV9GT05URElSLAotICBSRVNfVFlQRV9JQ09OLAotICBSRVNfVFlQRV9HUk9VUF9JQ09OLAotICBSRVNfVFlQRV9NRU5VLAotICBSRVNfVFlQRV9NRVNTQUdFVEFCTEUsCi0gIFJFU19UWVBFX1JDREFUQSwKLSAgUkVTX1RZUEVfU1RSSU5HVEFCTEUsCi0gIFJFU19UWVBFX1VTRVJEQVRBLAotICBSRVNfVFlQRV9WRVJTSU9OSU5GTwotfTsKLQotLyogQSByZXMgZmlsZSBhbmQgYSBDT0ZGIGZpbGUgc3RvcmUgaW5mb3JtYXRpb24gZGlmZmVyZW50bHkuICBUaGUKLSAgIHJlc19pbmZvIHN0cnVjdHVyZXMgaG9sZHMgZGF0YSB3aGljaCBpbiBhIHJlcyBmaWxlIGlzIHN0b3JlZCB3aXRoCi0gICBlYWNoIHJlc291cmNlLCBidXQgaW4gYSBDT0ZGIGZpbGUgaXMgc3RvcmVkIGVsc2V3aGVyZS4gICovCi0KLXN0cnVjdCByZXNfcmVzX2luZm8KLXsKLSAgLyogTGFuZ3VhZ2UuICBJbiBhIENPRkYgZmlsZSwgdGhlIHRoaXJkIGxldmVsIG9mIHRoZSBkaXJlY3RvcnkgaXMKLSAgICAga2V5ZWQgYnkgdGhlIGxhbmd1YWdlLCBzbyB0aGUgbGFuZ3VhZ2Ugb2YgYSByZXNvdXJjZSBpcyBkZWZpbmVkCi0gICAgIGJ5IGl0cyBsb2NhdGlvbiBpbiB0aGUgcmVzb3VyY2UgdHJlZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IGxhbmd1YWdlOwotICAvKiBDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHJlc291cmNlLiAgRW50aXJlbHkgdXNlciBkZWZpbmVkLiAgSW4gYQotICAgICBDT0ZGIGZpbGUsIHRoZSByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZSBoYXMgYSBjaGFyYWN0ZXJpc3RpY3MKLSAgICAgZmllbGQsIGJ1dCBJIGRvbid0IGtub3cgaWYgaXQncyByZWxhdGVkIHRvIHRoZSBvbmUgaW4gdGhlIHJlcwotICAgICBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBjaGFyYWN0ZXJpc3RpY3M7Ci0gIC8qIFZlcnNpb24gb2YgdGhlIHJlc291cmNlLiAgRW50aXJlbHkgdXNlciBkZWZpbmVkLiAgSW4gYSBDT0ZGIGZpbGUsCi0gICAgIHRoZSByZXNfZGlyZWN0b3J5IHN0cnVjdHVyZSBoYXMgYSBjaGFyYWN0ZXJpc3RpY3MgZmllbGQsIGJ1dCBJCi0gICAgIGRvbid0IGtub3cgaWYgaXQncyByZWxhdGVkIHRvIHRoZSBvbmUgaW4gdGhlIHJlcyBmaWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyB2ZXJzaW9uOwotICAvKiBNZW1vcnkgZmxhZ3MuICBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgdGhlIE1FTUZMQUcgdmFsdWVzCi0gICAgIGRlZmluZWQgYmVsb3cuICBNb3N0IG9mIHRoZXNlIHZhbHVlcyBhcmUgaGlzdG9yaWNhbCwgYW5kIGFyZSBub3QKLSAgICAgbWVhbmluZ2Z1bCBmb3Igd2luMzIuICBJIGRvbid0IHRoaW5rIHRoZXJlIGlzIGFueSB3YXkgdG8gc3RvcmUKLSAgICAgdGhpcyBpbmZvcm1hdGlvbiBpbiBhIENPRkYgZmlsZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IG1lbWZsYWdzOwotfTsKLQotLyogRWFjaCByZXNvdXJjZSBpbiBhIENPRkYgZmlsZSBoYXMgc29tZSBpbmZvcm1hdGlvbiB3aGljaCBjYW4gZG9lcwotICAgbm90IGFwcGVhciBpbiBhIHJlcyBmaWxlLiAgKi8KLQotc3RydWN0IHJlc19jb2ZmX2luZm8KLXsKLSAgLyogVGhlIGNvZGUgcGFnZSB1c2VkIGZvciB0aGUgZGF0YS4gIEkgZG9uJ3QgcmVhbGx5IGtub3cgd2hhdCB0aGlzCi0gICAgIHNob3VsZCBiZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgY29kZXBhZ2U7Ci0gIC8qIEEgcmVzb3VyY2UgZW50cnkgaW4gYSBDT0ZGIGZpbGUgaGFzIGEgcmVzZXJ2ZWQgZmllbGQsIHdoaWNoIHdlCi0gICAgIHJlY29yZCBoZXJlIHdoZW4gcmVhZGluZyBhIENPRkYgZmlsZS4gIFdoZW4gd3JpdGluZyBhIENPRkYgZmlsZSwKLSAgICAgd2Ugc2V0IHRoaXMgZmllbGQgdG8gemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZWQ7Ci19OwotCi0vKiBSZXNvdXJjZSBkYXRhIGlzIHN0b3JlZCBpbiBhIHJlc19yZXNvdXJjZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgcmVzX3Jlc291cmNlCi17Ci0gIC8qIFRoZSB0eXBlIG9mIHJlc291cmNlLiAgKi8KLSAgZW51bSByZXNfdHlwZSB0eXBlOwotICAvKiBUaGUgZGF0YSBmb3IgdGhlIHJlc291cmNlLiAgKi8KLSAgdW5pb24KLSAgewotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICB9IGRhdGE7Ci0gICAgc3RydWN0IGFjY2VsZXJhdG9yICphY2M7Ci0gICAgc3RydWN0IGN1cnNvciAqY3Vyc29yOwotICAgIHN0cnVjdCBncm91cF9jdXJzb3IgKmdyb3VwX2N1cnNvcjsKLSAgICBzdHJ1Y3QgZGlhbG9nICpkaWFsb2c7Ci0gICAgc3RydWN0IGZvbnRkaXIgKmZvbnRkaXI7Ci0gICAgc3RydWN0IGdyb3VwX2ljb24gKmdyb3VwX2ljb247Ci0gICAgc3RydWN0IG1lbnUgKm1lbnU7Ci0gICAgc3RydWN0IHJjZGF0YV9pdGVtICpyY2RhdGE7Ci0gICAgc3RydWN0IHN0cmluZ3RhYmxlICpzdHJpbmd0YWJsZTsKLSAgICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKnVzZXJkYXRhOwotICAgIHN0cnVjdCB2ZXJzaW9uaW5mbyAqdmVyc2lvbmluZm87Ci0gIH0gdTsKLSAgLyogSW5mb3JtYXRpb24gZnJvbSBhIHJlcyBmaWxlLiAgKi8KLSAgc3RydWN0IHJlc19yZXNfaW5mbyByZXNfaW5mbzsKLSAgLyogSW5mb3JtYXRpb24gZnJvbSBhIENPRkYgZmlsZS4gICovCi0gIHN0cnVjdCByZXNfY29mZl9pbmZvIGNvZmZfaW5mbzsKLX07Ci0KLS8qIE1lbW9yeSBmbGFncyBpbiB0aGUgbWVtZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgcmVzX3Jlc291cmNlLiAgKi8KLQotI2RlZmluZSBNRU1GTEFHX01PVkVBQkxFCTB4MTAKLSNkZWZpbmUgTUVNRkxBR19QVVJFCQkweDIwCi0jZGVmaW5lIE1FTUZMQUdfUFJFTE9BRAkJMHg0MAotI2RlZmluZSBNRU1GTEFHX0RJU0NBUkRBQkxFCTB4MTAwMAotCi0vKiBTdGFuZGFyZCByZXNvdXJjZSB0eXBlIGNvZGVzLiAgVGhlc2UgYXJlIHVzZWQgaW4gdGhlIElEIGZpZWxkIG9mIGEKLSAgIHJlc19lbnRyeSBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIFJUX0NVUlNPUgkJIDEKLSNkZWZpbmUgUlRfQklUTUFQCQkgMgotI2RlZmluZSBSVF9JQ09OCQkJIDMKLSNkZWZpbmUgUlRfTUVOVQkJCSA0Ci0jZGVmaW5lIFJUX0RJQUxPRwkJIDUKLSNkZWZpbmUgUlRfU1RSSU5HCQkgNgotI2RlZmluZSBSVF9GT05URElSCQkgNwotI2RlZmluZSBSVF9GT05UCQkJIDgKLSNkZWZpbmUgUlRfQUNDRUxFUkFUT1IJCSA5Ci0jZGVmaW5lIFJUX1JDREFUQQkJMTAKLSNkZWZpbmUgUlRfTUVTU0FHRVRBQkxFCQkxMQotI2RlZmluZSBSVF9HUk9VUF9DVVJTT1IJCTEyCi0jZGVmaW5lIFJUX0dST1VQX0lDT04JCTE0Ci0jZGVmaW5lIFJUX1ZFUlNJT04JCTE2Ci0jZGVmaW5lIFJUX0RMR0lOQ0xVREUJCTE3Ci0jZGVmaW5lIFJUX1BMVUdQTEFZCQkxOQotI2RlZmluZSBSVF9WWEQJCQkyMAotI2RlZmluZSBSVF9BTklDVVJTT1IJCTIxCi0jZGVmaW5lIFJUX0FOSUlDT04JCTIyCi0KLS8qIEFuIGFjY2VsZXJhdG9yIHJlc291cmNlIGlzIGEgbGlua2VkIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBhY2NlbGVyYXRvcgotewotICAvKiBOZXh0IGFjY2VsZXJhdG9yLiAgKi8KLSAgc3RydWN0IGFjY2VsZXJhdG9yICpuZXh0OwotICAvKiBGbGFncy4gIEEgY29tYmluYXRpb24gb2YgdGhlIEFDQyB2YWx1ZXMgZGVmaW5lZCBiZWxvdy4gICovCi0gIHVuc2lnbmVkIHNob3J0IGZsYWdzOwotICAvKiBLZXkgdmFsdWUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBrZXk7Ci0gIC8qIFJlc291cmNlIElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci19OwotCi0vKiBBY2NlbGVyYXRvciBmbGFncyBpbiB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgYWNjZWxlcmF0b3IuCi0gICBUaGVzZSBhcmUgdGhlIHNhbWUgdmFsdWVzIHRoYXQgYXBwZWFyIGluIGEgcmVzIGZpbGUuICBJIGhvcGUuICAqLwotCi0jZGVmaW5lIEFDQ19WSVJUS0VZCTB4MDEKLSNkZWZpbmUgQUNDX05PSU5WRVJUCTB4MDIKLSNkZWZpbmUgQUNDX1NISUZUCTB4MDQKLSNkZWZpbmUgQUNDX0NPTlRST0wJMHgwOAotI2RlZmluZSBBQ0NfQUxUCQkweDEwCi0jZGVmaW5lIEFDQ19MQVNUCTB4ODAKLQotLyogQSBjdXJzb3IgcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgY3Vyc29yCi17Ci0gIC8qIFggY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgc2hvcnQgeGhvdHNwb3Q7Ci0gIC8qIFkgY29vcmRpbmF0ZSBvZiBob3RzcG90LiAgKi8KLSAgc2hvcnQgeWhvdHNwb3Q7Ci0gIC8qIExlbmd0aCBvZiBiaXRtYXAgZGF0YS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAvKiBEYXRhLiAgKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLX07Ci0KLS8qIEEgZ3JvdXBfY3Vyc29yIHJlc291cmNlIGlzIGEgbGlzdCBvZiBncm91cF9jdXJzb3Igc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCBncm91cF9jdXJzb3IKLXsKLSAgLyogTmV4dCBjdXJzb3IgaW4gZ3JvdXAuICAqLwotICBzdHJ1Y3QgZ3JvdXBfY3Vyc29yICpuZXh0OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0gIC8qIFBsYW5lcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IHBsYW5lczsKLSAgLyogQml0cyBwZXIgcGl4ZWwuICAqLwotICB1bnNpZ25lZCBzaG9ydCBiaXRzOwotICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBieXRlczsKLSAgLyogSW5kZXggb2YgY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaW5kZXg7Ci19OwotCi0vKiBBIGRpYWxvZyByZXNvdXJjZS4gICovCi0KLXN0cnVjdCBkaWFsb2cKLXsKLSAgLyogQmFzaWMgd2luZG93IHN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzdHlsZTsKLSAgLyogRXh0ZW5kZWQgd2luZG93IHN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBleHN0eWxlOwotICAvKiBYIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB4OwotICAvKiBZIGNvb3JkaW5hdGUuICAqLwotICB1bnNpZ25lZCBzaG9ydCB5OwotICAvKiBXaWR0aC4gICovCi0gIHVuc2lnbmVkIHNob3J0IHdpZHRoOwotICAvKiBIZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCBoZWlnaHQ7Ci0gIC8qIE1lbnUgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgbWVudTsKLSAgLyogQ2xhc3MgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgY2xhc3M7Ci0gIC8qIENhcHRpb24uICAqLwotICB1bmljaGFyICpjYXB0aW9uOwotICAvKiBGb250IHBvaW50IHNpemUuICAqLwotICB1bnNpZ25lZCBzaG9ydCBwb2ludHNpemU7Ci0gIC8qIEZvbnQgbmFtZS4gICovCi0gIHVuaWNoYXIgKmZvbnQ7Ci0gIC8qIEV4dGVuZGVkIGluZm9ybWF0aW9uIGZvciBhIGRpYWxvZ2V4LiAgKi8KLSAgc3RydWN0IGRpYWxvZ19leCAqZXg7Ci0gIC8qIENvbnRyb2xzLiAgKi8KLSAgc3RydWN0IGRpYWxvZ19jb250cm9sICpjb250cm9sczsKLX07Ci0KLS8qIEFuIGV4dGVuZGVkIGRpYWxvZyBoYXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCBkaWFsb2dfZXgKLXsKLSAgLyogSGVscCBJRC4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGVscDsKLSAgLyogRm9udCB3ZWlnaHQuICAqLwotICB1bnNpZ25lZCBzaG9ydCB3ZWlnaHQ7Ci0gIC8qIFdoZXRoZXIgdGhlIGZvbnQgaXMgaXRhbGljLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaXRhbGljOwotfTsKLQotLyogV2luZG93IHN0eWxlIGZsYWdzLCBmcm9tIHRoZSB3aW5zdXAgRGVmaW5lcy5oIGhlYWRlciBmaWxlLiAgVGhlc2UKLSAgIGNhbiBhcHBlYXIgaW4gdGhlIHN0eWxlIGZpZWxkIG9mIGEgc3RydWN0IGRpYWxvZyBvciBhIHN0cnVjdAotICAgZGlhbG9nX2NvbnRyb2wuICAqLwotCi0jZGVmaW5lIENXX1VTRURFRkFVTFQJKDB4ODAwMDAwMDApCi0jZGVmaW5lIFdTX0JPUkRFUgkoMHg4MDAwMDBMKQotI2RlZmluZSBXU19DQVBUSU9OCSgweGMwMDAwMEwpCi0jZGVmaW5lIFdTX0NISUxECSgweDQwMDAwMDAwTCkKLSNkZWZpbmUgV1NfQ0hJTERXSU5ET1cJKDB4NDAwMDAwMDBMKQotI2RlZmluZSBXU19DTElQQ0hJTERSRU4JKDB4MjAwMDAwMEwpCi0jZGVmaW5lIFdTX0NMSVBTSUJMSU5HUwkoMHg0MDAwMDAwTCkKLSNkZWZpbmUgV1NfRElTQUJMRUQJKDB4ODAwMDAwMEwpCi0jZGVmaW5lIFdTX0RMR0ZSQU1FCSgweDQwMDAwMEwpCi0jZGVmaW5lIFdTX0dST1VQCSgweDIwMDAwTCkKLSNkZWZpbmUgV1NfSFNDUk9MTAkoMHgxMDAwMDBMKQotI2RlZmluZSBXU19JQ09OSUMJKDB4MjAwMDAwMDBMKQotI2RlZmluZSBXU19NQVhJTUlaRQkoMHgxMDAwMDAwTCkKLSNkZWZpbmUgV1NfTUFYSU1JWkVCT1gJKDB4MTAwMDBMKQotI2RlZmluZSBXU19NSU5JTUlaRQkoMHgyMDAwMDAwMEwpCi0jZGVmaW5lIFdTX01JTklNSVpFQk9YCSgweDIwMDAwTCkKLSNkZWZpbmUgV1NfT1ZFUkxBUFBFRAkoMEwpCi0jZGVmaW5lIFdTX09WRVJMQVBQRURXSU5ET1cJKDB4Y2YwMDAwTCkKLSNkZWZpbmUgV1NfUE9QVVAJKDB4ODAwMDAwMDBMKQotI2RlZmluZSBXU19QT1BVUFdJTkRPVwkoMHg4MDg4MDAwMEwpCi0jZGVmaW5lIFdTX1NJWkVCT1gJKDB4NDAwMDBMKQotI2RlZmluZSBXU19TWVNNRU5VCSgweDgwMDAwTCkKLSNkZWZpbmUgV1NfVEFCU1RPUAkoMHgxMDAwMEwpCi0jZGVmaW5lIFdTX1RISUNLRlJBTUUJKDB4NDAwMDBMKQotI2RlZmluZSBXU19USUxFRAkoMEwpCi0jZGVmaW5lIFdTX1RJTEVEV0lORE9XCSgweGNmMDAwMEwpCi0jZGVmaW5lIFdTX1ZJU0lCTEUJKDB4MTAwMDAwMDBMKQotI2RlZmluZSBXU19WU0NST0xMCSgweDIwMDAwMEwpCi0jZGVmaW5lIE1ESVNfQUxMQ0hJTERTVFlMRVMJKDB4MSkKLSNkZWZpbmUgQlNfM1NUQVRFCSgweDVMKQotI2RlZmluZSBCU19BVVRPM1NUQVRFCSgweDZMKQotI2RlZmluZSBCU19BVVRPQ0hFQ0tCT1gJKDB4M0wpCi0jZGVmaW5lIEJTX0FVVE9SQURJT0JVVFRPTgkoMHg5TCkKLSNkZWZpbmUgQlNfQklUTUFQCSgweDgwTCkKLSNkZWZpbmUgQlNfQk9UVE9NCSgweDgwMEwpCi0jZGVmaW5lIEJTX0NFTlRFUgkoMHgzMDBMKQotI2RlZmluZSBCU19DSEVDS0JPWAkoMHgyTCkKLSNkZWZpbmUgQlNfREVGUFVTSEJVVFRPTgkoMHgxTCkKLSNkZWZpbmUgQlNfR1JPVVBCT1gJKDB4N0wpCi0jZGVmaW5lIEJTX0lDT04JKDB4NDBMKQotI2RlZmluZSBCU19MRUZUCSgweDEwMEwpCi0jZGVmaW5lIEJTX0xFRlRURVhUCSgweDIwTCkKLSNkZWZpbmUgQlNfTVVMVElMSU5FCSgweDIwMDBMKQotI2RlZmluZSBCU19OT1RJRlkJKDB4NDAwMEwpCi0jZGVmaW5lIEJTX09XTkVSRFJBVwkoMHhiTCkKLSNkZWZpbmUgQlNfUFVTSEJPWAkoMHhjTCkJCS8qIEZJWE1FISAgV2hhdCBzaG91bGQgdGhpcyBiZT8gICovCi0jZGVmaW5lIEJTX1BVU0hCVVRUT04JKDBMKQotI2RlZmluZSBCU19QVVNITElLRQkoMHgxMDAwTCkKLSNkZWZpbmUgQlNfUkFESU9CVVRUT04JKDB4NEwpCi0jZGVmaW5lIEJTX1JJR0hUCSgweDIwMEwpCi0jZGVmaW5lIEJTX1JJR0hUQlVUVE9OCSgweDIwTCkKLSNkZWZpbmUgQlNfVEVYVAkoMEwpCi0jZGVmaW5lIEJTX1RPUAkoMHg0MDBMKQotI2RlZmluZSBCU19VU0VSQlVUVE9OCSgweDhMKQotI2RlZmluZSBCU19WQ0VOVEVSCSgweGMwMEwpCi0jZGVmaW5lIENCU19BVVRPSFNDUk9MTAkoMHg0MEwpCi0jZGVmaW5lIENCU19ESVNBQkxFTk9TQ1JPTEwJKDB4ODAwTCkKLSNkZWZpbmUgQ0JTX0RST1BET1dOCSgweDJMKQotI2RlZmluZSBDQlNfRFJPUERPV05MSVNUCSgweDNMKQotI2RlZmluZSBDQlNfSEFTU1RSSU5HUwkoMHgyMDBMKQotI2RlZmluZSBDQlNfTE9XRVJDQVNFCSgweDQwMDBMKQotI2RlZmluZSBDQlNfTk9JTlRFR1JBTEhFSUdIVAkoMHg0MDBMKQotI2RlZmluZSBDQlNfT0VNQ09OVkVSVAkoMHg4MEwpCi0jZGVmaW5lIENCU19PV05FUkRSQVdGSVhFRAkoMHgxMEwpCi0jZGVmaW5lIENCU19PV05FUkRSQVdWQVJJQUJMRQkoMHgyMEwpCi0jZGVmaW5lIENCU19TSU1QTEUJKDB4MUwpCi0jZGVmaW5lIENCU19TT1JUCSgweDEwMEwpCi0jZGVmaW5lIENCU19VUFBFUkNBU0UJKDB4MjAwMEwpCi0jZGVmaW5lIEVTX0FVVE9IU0NST0xMCSgweDgwTCkKLSNkZWZpbmUgRVNfQVVUT1ZTQ1JPTEwJKDB4NDBMKQotI2RlZmluZSBFU19DRU5URVIJKDB4MUwpCi0jZGVmaW5lIEVTX0xFRlQJKDBMKQotI2RlZmluZSBFU19MT1dFUkNBU0UJKDB4MTBMKQotI2RlZmluZSBFU19NVUxUSUxJTkUJKDB4NEwpCi0jZGVmaW5lIEVTX05PSElERVNFTAkoMHgxMDBMKQotI2RlZmluZSBFU19OVU1CRVIJKDB4MjAwMEwpCi0jZGVmaW5lIEVTX09FTUNPTlZFUlQJKDB4NDAwTCkKLSNkZWZpbmUgRVNfUEFTU1dPUkQJKDB4MjBMKQotI2RlZmluZSBFU19SRUFET05MWQkoMHg4MDBMKQotI2RlZmluZSBFU19SSUdIVAkoMHgyTCkKLSNkZWZpbmUgRVNfVVBQRVJDQVNFCSgweDhMKQotI2RlZmluZSBFU19XQU5UUkVUVVJOCSgweDEwMDBMKQotI2RlZmluZSBMQlNfRElTQUJMRU5PU0NST0xMCSgweDEwMDBMKQotI2RlZmluZSBMQlNfRVhURU5ERURTRUwJKDB4ODAwTCkKLSNkZWZpbmUgTEJTX0hBU1NUUklOR1MJKDB4NDBMKQotI2RlZmluZSBMQlNfTVVMVElDT0xVTU4JKDB4MjAwTCkKLSNkZWZpbmUgTEJTX01VTFRJUExFU0VMCSgweDhMKQotI2RlZmluZSBMQlNfTk9EQVRBCSgweDIwMDBMKQotI2RlZmluZSBMQlNfTk9JTlRFR1JBTEhFSUdIVAkoMHgxMDBMKQotI2RlZmluZSBMQlNfTk9SRURSQVcJKDB4NEwpCi0jZGVmaW5lIExCU19OT1NFTAkoMHg0MDAwTCkKLSNkZWZpbmUgTEJTX05PVElGWQkoMHgxTCkKLSNkZWZpbmUgTEJTX09XTkVSRFJBV0ZJWEVECSgweDEwTCkKLSNkZWZpbmUgTEJTX09XTkVSRFJBV1ZBUklBQkxFCSgweDIwTCkKLSNkZWZpbmUgTEJTX1NPUlQJKDB4MkwpCi0jZGVmaW5lIExCU19TVEFOREFSRAkoMHhhMDAwMDNMKQotI2RlZmluZSBMQlNfVVNFVEFCU1RPUFMJKDB4ODBMKQotI2RlZmluZSBMQlNfV0FOVEtFWUJPQVJESU5QVVQJKDB4NDAwTCkKLSNkZWZpbmUgU0JTX0JPVFRPTUFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfSE9SWgkoMEwpCi0jZGVmaW5lIFNCU19MRUZUQUxJR04JKDB4MkwpCi0jZGVmaW5lIFNCU19SSUdIVEFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfU0laRUJPWAkoMHg4TCkKLSNkZWZpbmUgU0JTX1NJWkVCT1hCT1RUT01SSUdIVEFMSUdOCSgweDRMKQotI2RlZmluZSBTQlNfU0laRUJPWFRPUExFRlRBTElHTgkoMHgyTCkKLSNkZWZpbmUgU0JTX1NJWkVHUklQCSgweDEwTCkKLSNkZWZpbmUgU0JTX1RPUEFMSUdOCSgweDJMKQotI2RlZmluZSBTQlNfVkVSVAkoMHgxTCkKLSNkZWZpbmUgU1NfQklUTUFQCSgweGVMKQotI2RlZmluZSBTU19CTEFDS0ZSQU1FCSgweDdMKQotI2RlZmluZSBTU19CTEFDS1JFQ1QJKDB4NEwpCi0jZGVmaW5lIFNTX0NFTlRFUgkoMHgxTCkKLSNkZWZpbmUgU1NfQ0VOVEVSSU1BR0UJKDB4MjAwTCkKLSNkZWZpbmUgU1NfRU5ITUVUQUZJTEUJKDB4ZkwpCi0jZGVmaW5lIFNTX0VUQ0hFREZSQU1FCSgweDEyTCkKLSNkZWZpbmUgU1NfRVRDSEVESE9SWgkoMHgxMEwpCi0jZGVmaW5lIFNTX0VUQ0hFRFZFUlQJKDB4MTFMKQotI2RlZmluZSBTU19HUkFZRlJBTUUJKDB4OEwpCi0jZGVmaW5lIFNTX0dSQVlSRUNUCSgweDVMKQotI2RlZmluZSBTU19JQ09OCSgweDNMKQotI2RlZmluZSBTU19MRUZUCSgwTCkKLSNkZWZpbmUgU1NfTEVGVE5PV09SRFdSQVAJKDB4Y0wpCi0jZGVmaW5lIFNTX05PUFJFRklYCSgweDgwTCkKLSNkZWZpbmUgU1NfTk9USUZZCSgweDEwMEwpCi0jZGVmaW5lIFNTX09XTkVSRFJBVwkoMHhkTCkKLSNkZWZpbmUgU1NfUkVBTFNJWkVJTUFHRQkoMHg4MDBMKQotI2RlZmluZSBTU19SSUdIVAkoMHgyTCkKLSNkZWZpbmUgU1NfUklHSFRKVVNUCSgweDQwMEwpCi0jZGVmaW5lIFNTX1NJTVBMRQkoMHhiTCkKLSNkZWZpbmUgU1NfU1VOS0VOCSgweDEwMDBMKQotI2RlZmluZSBTU19VU0VSSVRFTSAgICAgKDB4YUwpCi0jZGVmaW5lIFNTX1dISVRFRlJBTUUJKDB4OUwpCi0jZGVmaW5lIFNTX1dISVRFUkVDVAkoMHg2TCkKLSNkZWZpbmUgRFNfM0RMT09LCSgweDRMKQotI2RlZmluZSBEU19BQlNBTElHTgkoMHgxTCkKLSNkZWZpbmUgRFNfQ0VOVEVSCSgweDgwMEwpCi0jZGVmaW5lIERTX0NFTlRFUk1PVVNFCSgweDEwMDBMKQotI2RlZmluZSBEU19DT05URVhUSEVMUAkoMHgyMDAwTCkKLSNkZWZpbmUgRFNfQ09OVFJPTAkoMHg0MDBMKQotI2RlZmluZSBEU19GSVhFRFNZUwkoMHg4TCkKLSNkZWZpbmUgRFNfTE9DQUxFRElUCSgweDIwTCkKLSNkZWZpbmUgRFNfTU9EQUxGUkFNRQkoMHg4MEwpCi0jZGVmaW5lIERTX05PRkFJTENSRUFURQkoMHgxMEwpCi0jZGVmaW5lIERTX05PSURMRU1TRwkoMHgxMDBMKQotI2RlZmluZSBEU19TRVRGT05UCSgweDQwTCkKLSNkZWZpbmUgRFNfU0VURk9SRUdST1VORAkoMHgyMDBMKQotI2RlZmluZSBEU19TWVNNT0RBTAkoMHgyTCkKLQotLyogQSBkaWFsb2cgY29udHJvbC4gICovCi0KLXN0cnVjdCBkaWFsb2dfY29udHJvbAotewotICAvKiBOZXh0IGNvbnRyb2wuICAqLwotICBzdHJ1Y3QgZGlhbG9nX2NvbnRyb2wgKm5leHQ7Ci0gIC8qIElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci0gIC8qIFN0eWxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBzdHlsZTsKLSAgLyogRXh0ZW5kZWQgc3R5bGUuICAqLwotICB1bnNpZ25lZCBsb25nIGV4c3R5bGU7Ci0gIC8qIFggY29vcmRpbmF0ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHg7Ci0gIC8qIFkgY29vcmRpbmF0ZS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHk7Ci0gIC8qIFdpZHRoLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgd2lkdGg7Ci0gIC8qIEhlaWdodC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGhlaWdodDsKLSAgLyogQ2xhc3MgbmFtZS4gICovCi0gIHN0cnVjdCByZXNfaWQgY2xhc3M7Ci0gIC8qIEFzc29jaWF0ZWQgdGV4dC4gICovCi0gIHN0cnVjdCByZXNfaWQgdGV4dDsKLSAgLyogRXh0cmEgZGF0YSBmb3IgdGhlIHdpbmRvdyBwcm9jZWR1cmUuICAqLwotICBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKmRhdGE7Ci0gIC8qIEhlbHAgSUQuICBPbmx5IHVzZWQgaW4gYW4gZXh0ZW5kZWQgZGlhbG9nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBoZWxwOwotfTsKLQotLyogQ29udHJvbCBjbGFzc2VzLiAgVGhlc2UgY2FuIGJlIHVzZWQgYXMgdGhlIElEIGZpZWxkIGluIGEgc3RydWN0Ci0gICBkaWFsb2dfY29udHJvbC4gICovCi0KLSNkZWZpbmUgQ1RMX0JVVFRPTgkweDgwCi0jZGVmaW5lIENUTF9FRElUCTB4ODEKLSNkZWZpbmUgQ1RMX1NUQVRJQwkweDgyCi0jZGVmaW5lIENUTF9MSVNUQk9YCTB4ODMKLSNkZWZpbmUgQ1RMX1NDUk9MTEJBUgkweDg0Ci0jZGVmaW5lIENUTF9DT01CT0JPWAkweDg1Ci0KLS8qIEEgZm9udGRpciByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZm9udGRpciBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGZvbnRkaXIKLXsKLSAgc3RydWN0IGZvbnRkaXIgKm5leHQ7Ci0gIC8qIEluZGV4IG9mIGZvbnQgZW50cnkuICAqLwotICBzaG9ydCBpbmRleDsKLSAgLyogTGVuZ3RoIG9mIGZvbnQgaW5mb3JtYXRpb24uICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgLyogRm9udCBpbmZvcm1hdGlvbi4gKi8KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLX07Ci0KLS8qIEEgZ3JvdXBfaWNvbiByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgZ3JvdXBfaWNvbiBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RydWN0IGdyb3VwX2ljb24KLXsKLSAgLyogTmV4dCBpY29uIGluIGdyb3VwLiAgKi8KLSAgc3RydWN0IGdyb3VwX2ljb24gKm5leHQ7Ci0gIC8qIFdpZHRoLiAgKi8KLSAgdW5zaWduZWQgY2hhciB3aWR0aDsKLSAgLyogSGVpZ2h0LiAgKi8KLSAgdW5zaWduZWQgY2hhciBoZWlnaHQ7Ci0gIC8qIENvbG9yIGNvdW50LiAgKi8KLSAgdW5zaWduZWQgY2hhciBjb2xvcnM7Ci0gIC8qIFBsYW5lcy4gICovCi0gIHVuc2lnbmVkIHNob3J0IHBsYW5lczsKLSAgLyogQml0cyBwZXIgcGl4ZWwuICAqLwotICB1bnNpZ25lZCBzaG9ydCBiaXRzOwotICAvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBieXRlczsKLSAgLyogSW5kZXggb2YgY3Vyc29yIHJlc291cmNlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaW5kZXg7Ci19OwotCi0vKiBBIG1lbnUgcmVzb3VyY2UuICAqLwotCi1zdHJ1Y3QgbWVudQotewotICAvKiBMaXN0IG9mIG1lbnVpdGVtcy4gICovCi0gIHN0cnVjdCBtZW51aXRlbSAqaXRlbXM7Ci0gIC8qIEhlbHAgSUQuICBJIGRvbid0IHRoaW5rIHRoZXJlIGlzIGFueSB3YXkgdG8gc2V0IHRoaXMgaW4gYW4gcmMKLSAgICAgZmlsZSwgYnV0IGl0IGNhbiBhcHBlYXIgaW4gdGhlIGJpbmFyeSBmb3JtYXQuICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci19OwotCi0vKiBBIG1lbnUgcmVzb3VyY2UgaXMgYSBsaXN0IG9mIG1lbnVpdGVtIHN0cnVjdHVyZXMuICAqLwotCi1zdHJ1Y3QgbWVudWl0ZW0KLXsKLSAgLyogTmV4dCBtZW51aXRlbS4gICovCi0gIHN0cnVjdCBtZW51aXRlbSAqbmV4dDsKLSAgLyogVHlwZS4gIEluIGEgbm9ybWFsIG1lbnUsIHJhdGhlciB0aGFuIGEgbWVudWV4LCB0aGlzIGlzIHRoZSBmbGFncwotICAgICBmaWVsZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgdHlwZTsKLSAgLyogU3RhdGUuICBUaGlzIGlzIG9ubHkgdXNlZCBpbiBhIG1lbnVleC4gICovCi0gIHVuc2lnbmVkIGxvbmcgc3RhdGU7Ci0gIC8qIElkLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgaWQ7Ci0gIC8qIFVuaWNvZGUgdGV4dC4gICovCi0gIHVuaWNoYXIgKnRleHQ7Ci0gIC8qIFBvcHVwIG1lbnUgaXRlbXMgZm9yIGEgcG9wdXAuICAqLwotICBzdHJ1Y3QgbWVudWl0ZW0gKnBvcHVwOwotICAvKiBIZWxwIElELiAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gYSBtZW51ZXguICAqLwotICB1bnNpZ25lZCBsb25nIGhlbHA7Ci19OwotCi0vKiBNZW51IGl0ZW0gZmxhZ3MuICBUaGVzZSBjYW4gYXBwZWFyIGluIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdAotICAgbWVudWl0ZW0uICAqLwotCi0jZGVmaW5lIE1FTlVJVEVNX0dSQVlFRAkJMHgwMDEKLSNkZWZpbmUgTUVOVUlURU1fSU5BQ1RJVkUJMHgwMDIKLSNkZWZpbmUgTUVOVUlURU1fQklUTUFQCQkweDAwNAotI2RlZmluZSBNRU5VSVRFTV9PV05FUkRSQVcJMHgxMDAKLSNkZWZpbmUgTUVOVUlURU1fQ0hFQ0tFRAkweDAwOAotI2RlZmluZSBNRU5VSVRFTV9QT1BVUAkJMHgwMTAKLSNkZWZpbmUgTUVOVUlURU1fTUVOVUJBUkJSRUFLCTB4MDIwCi0jZGVmaW5lIE1FTlVJVEVNX01FTlVCUkVBSwkweDA0MAotI2RlZmluZSBNRU5VSVRFTV9FTkRNRU5VCTB4MDgwCi0jZGVmaW5lIE1FTlVJVEVNX0hFTFAJICAgICAgIDB4NDAwMAotCi0vKiBBbiByY2RhdGEgcmVzb3VyY2UgaXMgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiByY2RhdGFfaXRlbQotICAgc3RydWN0dXJlcy4gICovCi0KLXN0cnVjdCByY2RhdGFfaXRlbQotewotICAvKiBOZXh0IGRhdGEgaXRlbS4gICovCi0gIHN0cnVjdCByY2RhdGFfaXRlbSAqbmV4dDsKLSAgLyogVHlwZSBvZiBkYXRhLiAgKi8KLSAgZW51bQotICB7Ci0gICAgUkNEQVRBX1dPUkQsCi0gICAgUkNEQVRBX0RXT1JELAotICAgIFJDREFUQV9TVFJJTkcsCi0gICAgUkNEQVRBX1dTVFJJTkcsCi0gICAgUkNEQVRBX0JVRkZFUgotICB9IHR5cGU7Ci0gIHVuaW9uCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgd29yZDsKLSAgICB1bnNpZ25lZCBsb25nIGR3b3JkOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgY2hhciAqczsKLSAgICB9IHN0cmluZzsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgICAgIGNvbnN0IHVuaWNoYXIgKnc7Ci0gICAgfSB3c3RyaW5nOwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICB9IGJ1ZmZlcjsKLSAgfSB1OwotfTsKLQotLyogQSBzdHJpbmd0YWJsZSByZXNvdXJjZSBpcyBhIHBvaW50ZXIgdG8gYSBzdHJpbmd0YWJsZSBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3Qgc3RyaW5ndGFibGUKLXsKLSAgLyogRWFjaCBzdHJpbmd0YWJsZSByZXNvdXJjZSBpcyBhIGxpc3Qgb2YgMTYgdW5pY29kZSBzdHJpbmdzLiAgKi8KLSAgc3RydWN0Ci0gIHsKLSAgICAvKiBMZW5ndGggb2Ygc3RyaW5nLiAgKi8KLSAgICBpbnQgbGVuZ3RoOwotICAgIC8qIFN0cmluZyBkYXRhIGlmIGxlbmd0aCA+IDAuICAqLwotICAgIHVuaWNoYXIgKnN0cmluZzsKLSAgfSBzdHJpbmdzWzE2XTsKLX07Ci0KLS8qIEEgdmVyc2lvbmluZm8gcmVzb3VyY2UgcG9pbnRzIHRvIGEgdmVyc2lvbmluZm8gc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHZlcnNpb25pbmZvCi17Ci0gIC8qIEZpeGVkIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QgZml4ZWRfdmVyc2lvbmluZm8gKmZpeGVkOwotICAvKiBWYXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLSAgc3RydWN0IHZlcl9pbmZvICp2YXI7Ci19OwotCi0vKiBUaGUgZml4ZWQgcG9ydGlvbiBvZiBhIHZlcnNpb25pbmZvIHJlc291cmNlLiAgKi8KLQotc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvCi17Ci0gIC8qIFRoZSBmaWxlIHZlcnNpb24sIHdoaWNoIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfdmVyc2lvbl9tczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX3ZlcnNpb25fbHM7Ci0gIC8qIFRoZSBwcm9kdWN0IHZlcnNpb24sIHdoaWNoIGlzIHR3byAzMiBiaXQgaW50ZWdlcnMuICAqLwotICB1bnNpZ25lZCBsb25nIHByb2R1Y3RfdmVyc2lvbl9tczsKLSAgdW5zaWduZWQgbG9uZyBwcm9kdWN0X3ZlcnNpb25fbHM7Ci0gIC8qIFRoZSBmaWxlIGZsYWdzIG1hc2suICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfZmxhZ3NfbWFzazsKLSAgLyogVGhlIGZpbGUgZmxhZ3MuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfZmxhZ3M7Ci0gIC8qIFRoZSBPUyB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX29zOwotICAvKiBUaGUgZmlsZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmaWxlX3R5cGU7Ci0gIC8qIFRoZSBmaWxlIHN1YnR5cGUuICAqLwotICB1bnNpZ25lZCBsb25nIGZpbGVfc3VidHlwZTsKLSAgLyogVGhlIGRhdGUsIHdoaWNoIGluIFdpbmRvd3MgaXMgdHdvIDMyIGJpdCBpbnRlZ2Vycy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9kYXRlX21zOwotICB1bnNpZ25lZCBsb25nIGZpbGVfZGF0ZV9sczsKLX07Ci0KLS8qIEEgbGlzdCBvZiB2YXJpYWJsZSB2ZXJzaW9uIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IHZlcl9pbmZvCi17Ci0gIC8qIE5leHQgaXRlbS4gICovCi0gIHN0cnVjdCB2ZXJfaW5mbyAqbmV4dDsKLSAgLyogVHlwZSBvZiBkYXRhLiAgKi8KLSAgZW51bSB7IFZFUklORk9fU1RSSU5HLCBWRVJJTkZPX1ZBUiB9IHR5cGU7Ci0gIHVuaW9uCi0gIHsKLSAgICAvKiBTdHJpbmdGaWxlSW5mbyBkYXRhLiAgKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICAvKiBMYW5ndWFnZS4gICovCi0gICAgICB1bmljaGFyICpsYW5ndWFnZTsKLSAgICAgIC8qIFN0cmluZ3MuICAqLwotICAgICAgc3RydWN0IHZlcl9zdHJpbmdpbmZvICpzdHJpbmdzOwotICAgIH0gc3RyaW5nOwotICAgIC8qIFZhckZpbGVJbmZvIGRhdGEuICAqLwotICAgIHN0cnVjdAotICAgIHsKLSAgICAgIC8qIEtleS4gICovCi0gICAgICB1bmljaGFyICprZXk7Ci0gICAgICAvKiBWYWx1ZXMuICAqLwotICAgICAgc3RydWN0IHZlcl92YXJpbmZvICp2YXI7Ci0gICAgfSB2YXI7Ci0gIH0gdTsKLX07Ci0KLS8qIEEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbiBpbmZvcm1hdGlvbi4gICovCi0KLXN0cnVjdCB2ZXJfc3RyaW5naW5mbwotewotICAvKiBOZXh0IHN0cmluZy4gICovCi0gIHN0cnVjdCB2ZXJfc3RyaW5naW5mbyAqbmV4dDsKLSAgLyogS2V5LiAgKi8KLSAgdW5pY2hhciAqa2V5OwotICAvKiBWYWx1ZS4gICovCi0gIHVuaWNoYXIgKnZhbHVlOwotfTsKLQotLyogQSBsaXN0IG9mIHZhcmlhYmxlIHZlcnNpb24gaW5mb3JtYXRpb24uICAqLwotCi1zdHJ1Y3QgdmVyX3ZhcmluZm8KLXsKLSAgLyogTmV4dCBpdGVtLiAgKi8KLSAgc3RydWN0IHZlcl92YXJpbmZvICpuZXh0OwotICAvKiBMYW5ndWFnZSBJRC4gICovCi0gIHVuc2lnbmVkIHNob3J0IGxhbmd1YWdlOwotICAvKiBDaGFyYWN0ZXIgc2V0IElELiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgY2hhcnNldDsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHJlc291cmNlIGluZm9ybWF0aW9uIHRvCi0gICBiaW5hcnkuICAqLwotCi1zdHJ1Y3QgYmluZGF0YQotewotICAvKiBOZXh0IGRhdGEuICAqLwotICBzdHJ1Y3QgYmluZGF0YSAqbmV4dDsKLSAgLyogTGVuZ3RoIG9mIGRhdGEuICAqLwotICB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgLyogRGF0YS4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmRhdGE7Ci19OwotCi1leHRlcm4gaW50IHZlcmJvc2U7Ci0KLS8qIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gICovCi0KLWV4dGVybiBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqcmVhZF9yY19maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZWFkX3Jlc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHN0cnVjdCByZXNfZGlyZWN0b3J5ICpyZWFkX2NvZmZfcnNyYwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgd3JpdGVfcmNfZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IHN0cnVjdCByZXNfZGlyZWN0b3J5ICopKTsKLWV4dGVybiB2b2lkIHdyaXRlX3Jlc19maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKikpOwotZXh0ZXJuIHZvaWQgd3JpdGVfY29mZl9maWxlCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKSk7Ci0KLWV4dGVybiBzdHJ1Y3QgcmVzX3Jlc291cmNlICpiaW5fdG9fcmVzCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgbG9uZywgaW50KSk7Ci1leHRlcm4gc3RydWN0IGJpbmRhdGEgKnJlc190b19iaW4gUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBpbnQpKTsKLQotZXh0ZXJuIEZJTEUgKm9wZW5fZmlsZV9zZWFyY2gKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY2hhciAqKikpOwotCi1leHRlcm4gUFRSIHJlc19hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgcmVzd3JfYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLS8qIFJlc291cmNlIElEIGhhbmRsaW5nLiAgKi8KLQotZXh0ZXJuIGludCByZXNfaWRfY21wIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIHN0cnVjdCByZXNfaWQpKTsKLWV4dGVybiB2b2lkIHJlc19pZF9wcmludCBQQVJBTVMgKChGSUxFICosIHN0cnVjdCByZXNfaWQsIGludCkpOwotZXh0ZXJuIHZvaWQgcmVzX2lkc19wcmludCBQQVJBTVMgKChGSUxFICosIGludCwgY29uc3Qgc3RydWN0IHJlc19pZCAqKSk7Ci1leHRlcm4gdm9pZCByZXNfc3RyaW5nX3RvX2lkIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIE1hbmlwdWxhdGlvbiBvZiB0aGUgcmVzb3VyY2UgdHJlZS4gICovCi0KLWV4dGVybiBzdHJ1Y3QgcmVzX3Jlc291cmNlICpkZWZpbmVfcmVzb3VyY2UKLSAgUEFSQU1TICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKiosIGludCwgY29uc3Qgc3RydWN0IHJlc19pZCAqLCBpbnQpKTsKLWV4dGVybiBzdHJ1Y3QgcmVzX3Jlc291cmNlICpkZWZpbmVfc3RhbmRhcmRfcmVzb3VyY2UKLSAgUEFSQU1TICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKiosIGludCwgc3RydWN0IHJlc19pZCwgaW50LCBpbnQpKTsKLQotZXh0ZXJuIGludCBleHRlbmRlZF9kaWFsb2cgUEFSQU1TICgoY29uc3Qgc3RydWN0IGRpYWxvZyAqKSk7Ci1leHRlcm4gaW50IGV4dGVuZGVkX21lbnUgUEFSQU1TICgoY29uc3Qgc3RydWN0IG1lbnUgKikpOwotCi0vKiBDb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHJjIGZpbGUgc3VwcG9ydCBhbmQgdGhlIHBhcnNlciBhbmQgbGV4ZXIuICAqLwotCi1leHRlcm4gaW50IHl5ZGVidWc7Ci1leHRlcm4gRklMRSAqeXlpbjsKLWV4dGVybiBjaGFyICpyY19maWxlbmFtZTsKLWV4dGVybiBpbnQgcmNfbGluZW5vOwotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHJjcGFyc2Vfd2FybmluZyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHJjcGFyc2Vfc2V0X2xhbmd1YWdlIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV9kaXNjYXJkX3N0cmluZ3MgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV9yY2RhdGEgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcmNwYXJzZV9ub3JtYWwgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBkZWZpbmVfYWNjZWxlcmF0b3IKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBzdHJ1Y3QgYWNjZWxlcmF0b3IgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2JpdG1hcAotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2N1cnNvcgotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2RpYWxvZwotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIGNvbnN0IHN0cnVjdCBkaWFsb2cgKikpOwotZXh0ZXJuIHN0cnVjdCBkaWFsb2dfY29udHJvbCAqZGVmaW5lX2NvbnRyb2wKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAotCSAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JICAgdW5zaWduZWQgbG9uZykpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX2ZvbnQKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9pY29uCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBkZWZpbmVfbWVudQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHN0cnVjdCBtZW51aXRlbSAqKSk7Ci1leHRlcm4gc3RydWN0IG1lbnVpdGVtICpkZWZpbmVfbWVudWl0ZW0KLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JICAgc3RydWN0IG1lbnVpdGVtICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9tZXNzYWdldGFibGUKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV9yY2RhdGEKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLCBzdHJ1Y3QgcmNkYXRhX2l0ZW0gKikpOwotZXh0ZXJuIHN0cnVjdCByY2RhdGFfaXRlbSAqZGVmaW5lX3JjZGF0YV9zdHJpbmcKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci1leHRlcm4gc3RydWN0IHJjZGF0YV9pdGVtICpkZWZpbmVfcmNkYXRhX251bWJlciBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQpKTsKLWV4dGVybiB2b2lkIGRlZmluZV9zdHJpbmd0YWJsZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosIHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3VzZXJfZGF0YQotICBQQVJBTVMgKChzdHJ1Y3QgcmVzX2lkLCBzdHJ1Y3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICosCi0JICAgc3RydWN0IHJjZGF0YV9pdGVtICopKTsKLWV4dGVybiB2b2lkIGRlZmluZV91c2VyX2ZpbGUKLSAgUEFSQU1TICgoc3RydWN0IHJlc19pZCwgc3RydWN0IHJlc19pZCwgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqLAotCSAgIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgZGVmaW5lX3ZlcnNpb25pbmZvCi0gIFBBUkFNUyAoKHN0cnVjdCByZXNfaWQsIGludCwgc3RydWN0IGZpeGVkX3ZlcnNpb25pbmZvICosCi0JICAgc3RydWN0IHZlcl9pbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgdmVyX2luZm8gKmFwcGVuZF92ZXJfc3RyaW5nZmlsZWluZm8KLSAgUEFSQU1TICgoc3RydWN0IHZlcl9pbmZvICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IHZlcl9zdHJpbmdpbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgdmVyX2luZm8gKmFwcGVuZF92ZXJfdmFyZmlsZWluZm8KLSAgUEFSQU1TICgoc3RydWN0IHZlcl9pbmZvICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IHZlcl92YXJpbmZvICopKTsKLWV4dGVybiBzdHJ1Y3QgdmVyX3N0cmluZ2luZm8gKmFwcGVuZF92ZXJ2YWwKLSAgUEFSQU1TICgoc3RydWN0IHZlcl9zdHJpbmdpbmZvICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IHZlcl92YXJpbmZvICphcHBlbmRfdmVydHJhbnMKLSAgUEFSQU1TICgoc3RydWN0IHZlcl92YXJpbmZvICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTsKZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmR1bmkuYyBiL2JpbnV0aWxzL3dpbmR1bmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5ZjQ3YS4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kdW5pLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyogd2luZHVuaS5jIC0tIHVuaWNvZGUgc3VwcG9ydCBmb3IgdGhlIHdpbmRyZXMgcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGNvbnRhaW5zIHVuaWNvZGUgc3VwcG9ydCByb3V0aW5lcyBmb3IgdGhlIHdpbmRyZXMKLSAgIHByb2dyYW0uICBJZGVhbGx5LCB3ZSB3b3VsZCBoYXZlIGdlbmVyaWMgdW5pY29kZSBzdXBwb3J0IHdoaWNoCi0gICB3b3VsZCB3b3JrIG9uIGFsbCBzeXN0ZW1zLiAgSG93ZXZlciwgd2UgZG9uJ3QuICBJbnN0ZWFkLCBvbiBhCi0gICBXaW5kb3dzIGhvc3QsIHdlIGFyZSBwcmVwYXJlZCB0byBjYWxsIHNvbWUgV2luZG93cyByb3V0aW5lcy4gIFRoaXMKLSAgIG1lYW5zIHRoYXQgd2Ugd2lsbCBnZW5lcmF0ZSBkaWZmZXJlbnQgb3V0cHV0IG9uIFdpbmRvd3MgYW5kIFVuaXgKLSAgIGhvc3RzLCBidXQgdGhhdCBzZWVtcyBiZXR0ZXIgdGhhbiBub3QgcmVhbGx5IHN1cHBvcnRpbmcgdW5pY29kZSBhdAotICAgYWxsLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgImJ1Y29tbS5oIgotI2luY2x1ZGUgIndpbmR1bmkuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpZmRlZiBfV0lOMzIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIHN0cmluZy4gIFdlIGp1c3QgY29weSBpdCwKLSAgIGV4cGFuZGluZyBjaGFycyB0byBzaG9ydHMsIHJhdGhlciB0aGFuIGRvaW5nIHNvbWV0aGluZyBpbnRlbGxpZ2VudC4gICovCi0KLXZvaWQKLXVuaWNvZGVfZnJvbV9hc2NpaSAobGVuZ3RoLCB1bmljb2RlLCBhc2NpaSkKLSAgICAgaW50ICpsZW5ndGg7Ci0gICAgIHVuaWNoYXIgKip1bmljb2RlOwotICAgICBjb25zdCBjaGFyICphc2NpaTsKLXsKLSAgaW50IGxlbjsKLSAgY29uc3QgY2hhciAqczsKLSAgdW5zaWduZWQgc2hvcnQgKnc7Ci0KLSAgbGVuID0gc3RybGVuIChhc2NpaSk7Ci0KLSAgaWYgKGxlbmd0aCAhPSBOVUxMKQotICAgICpsZW5ndGggPSBsZW47Ci0KLSAgKnVuaWNvZGUgPSAoKHVuaWNoYXIgKikgcmVzX2FsbG9jICgobGVuICsgMSkgKiBzaXplb2YgKHVuaWNoYXIpKSk7Ci0KLSNpZmRlZiBfV0lOMzIKLSAgLyogRklYTUU6IE9uIFdpbmRvd3MsIHdlIHNob3VsZCBiZSB1c2luZyBNdWx0aUJ5dGVUb1dpZGVDaGFyIHRvIHNldAotICAgICB0aGUgbGVuZ3RoLiAgKi8KLSAgTXVsdGlCeXRlVG9XaWRlQ2hhciAoQ1BfQUNQLCAwLCBhc2NpaSwgbGVuICsgMSwgKnVuaWNvZGUsIGxlbiArIDEpOwotI2Vsc2UKLSAgZm9yIChzID0gYXNjaWksIHcgPSAqdW5pY29kZTsgKnMgIT0gJ1wwJzsgcysrLCB3KyspCi0gICAgKncgPSAqcyAmIDB4ZmY7Ci0gICp3ID0gMDsKLSNlbmRpZgotfQotCi0vKiBQcmludCB0aGUgdW5pY29kZSBzdHJpbmcgVU5JQ09ERSB0byB0aGUgZmlsZSBFLiAgTEVOR1RIIGlzIHRoZQotICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJpbnQsIG9yIC0xIGlmIHdlIHNob3VsZCBwcmludCB1bnRpbCB0aGUKLSAgIGVuZCBvZiB0aGUgc3RyaW5nLiAgRklYTUU6IE9uIGEgV2luZG93cyBob3N0LCB3ZSBzaG91bGQgYmUgY2FsbGluZwotICAgc29tZSBXaW5kb3dzIGZ1bmN0aW9uLCBwcm9iYWJseSBXaWRlQ2hhclRvTXVsdGlCeXRlLiAgKi8KLQotdm9pZAotdW5pY29kZV9wcmludCAoZSwgdW5pY29kZSwgbGVuZ3RoKQotICAgICBGSUxFICplOwotICAgICBjb25zdCB1bmljaGFyICp1bmljb2RlOwotICAgICBpbnQgbGVuZ3RoOwotewotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB1bmljaGFyIGNoOwotCi0gICAgICBpZiAobGVuZ3RoID09IDApCi0JcmV0dXJuOwotICAgICAgaWYgKGxlbmd0aCA+IDApCi0JLS1sZW5ndGg7Ci0KLSAgICAgIGNoID0gKnVuaWNvZGU7Ci0KLSAgICAgIGlmIChjaCA9PSAwICYmIGxlbmd0aCA8IDApCi0JcmV0dXJuOwotCi0gICAgICArK3VuaWNvZGU7Ci0KLSAgICAgIGlmICgoY2ggJiAweDdmKSA9PSBjaCkKLQl7Ci0JICBpZiAoY2ggPT0gJ1xcJykKLQkgICAgZnB1dHMgKCJcXCIsIGUpOwotCSAgZWxzZSBpZiAoaXNwcmludCAoY2gpKQotCSAgICBwdXRjIChjaCwgZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNoKQotCQl7Ci0JCWNhc2UgRVNDQVBFX0E6Ci0JCSAgZnB1dHMgKCJcXGEiLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9COgotCQkgIGZwdXRzICgiXFxiIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfRjoKLQkJICBmcHV0cyAoIlxcZiIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX046Ci0JCSAgZnB1dHMgKCJcXG4iLCBlKTsKLQkJICBicmVhazsKLQotCQljYXNlIEVTQ0FQRV9SOgotCQkgIGZwdXRzICgiXFxyIiwgZSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSBFU0NBUEVfVDoKLQkJICBmcHV0cyAoIlxcdCIsIGUpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgRVNDQVBFX1Y6Ci0JCSAgZnB1dHMgKCJcXHYiLCBlKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGZwcmludGYgKGUsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjaCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChjaCAmIDB4ZmYpID09IGNoKQotCWZwcmludGYgKGUsICJcXCUwM28iLCAodW5zaWduZWQgaW50KSBjaCk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoZSwgIlxceCV4IiwgKHVuc2lnbmVkIGludCkgY2gpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2JpbnV0aWxzL3dpbmR1bmkuaCBiL2JpbnV0aWxzL3dpbmR1bmkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhOWFmMi4uMDAwMDAwMAotLS0gYS9iaW51dGlscy93aW5kdW5pLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKiB3aW5kdW5pLmggLS0gaGVhZGVyIGZpbGUgZm9yIHVuaWNvZGUgc3VwcG9ydCBmb3Igd2luZHJlcyBwcm9ncmFtLgotICAgQ29weXJpZ2h0IDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVGhpcyBoZWFkZXIgZmlsZSBkZWNsYXJlcyB0aGUgdHlwZXMgYW5kIGZ1bmN0aW9ucyB3ZSB1c2UgZm9yCi0gICB1bmljb2RlIHN1cHBvcnQgaW4gd2luZHJlcy4gIE91ciB1bmljb2RlIHN1cHBvcnQgaXMgdmVyeSBsaW1pdGVkIGF0Ci0gICBwcmVzZW50LgotCi0gICBXZSBkb24ndCBwdXQgdGhpcyBzdHVmZiBpbiB3aW5kcmVzLmggc28gdGhhdCB3aW5kdW5pLmMgZG9lc24ndCBoYXZlCi0gICB0byBpbmNsdWRlIHdpbmRyZXMuaC4gIHdpbmR1bmkuYyBuZWVkcyB0byBpbmNsdWRlcyB3aW5kb3dzLmgsIGFuZAotICAgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIHRoZSBkZWZpbml0aW9ucyBvZiBXaW5kb3dzIG1hY3JvcyB3ZQotICAgYWxyZWFkeSBoYXZlIGluIHdpbmRyZXMuaC4gICovCi0KLS8qIFdlIHVzZSB0aGlzIHR5cGUgdG8gaG9sZCBhIHVuaWNvZGUgY2hhcmFjdGVyLiAgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1bmljaGFyOwotCi0vKiBFc2NhcGUgY2hhcmFjdGVyIHRyYW5zbGF0aW9ucy4gICovCi0KLSNkZWZpbmUgRVNDQVBFX0EgKDAwNykKLSNkZWZpbmUgRVNDQVBFX0IgKDAxMCkKLSNkZWZpbmUgRVNDQVBFX0YgKDAxNCkKLSNkZWZpbmUgRVNDQVBFX04gKDAxMikKLSNkZWZpbmUgRVNDQVBFX1IgKDAxNSkKLSNkZWZpbmUgRVNDQVBFX1QgKDAxMSkKLSNkZWZpbmUgRVNDQVBFX1YgKDAxMykKLQotLyogQ29udmVydCBhbiBBU0NJSSBzdHJpbmcgdG8gYSB1bmljb2RlIHN0cmluZy4gICovCi0KLWV4dGVybiB2b2lkIHVuaWNvZGVfZnJvbV9hc2NpaQotICBQQVJBTVMgKChpbnQgKiwgdW5pY2hhciAqKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIFByaW50IGEgdW5pY29kZSBzdHJpbmcgdG8gYSBmaWxlLiAgKi8KLQotZXh0ZXJuIHZvaWQgdW5pY29kZV9wcmludCBQQVJBTVMgKChGSUxFICosIGNvbnN0IHVuaWNoYXIgKiwgaW50KSk7Ci0KLS8qIFdpbmRyZXMgc3VwcG9ydCByb3V0aW5lIGNhbGxlZCBieSB1bmljb2RlX2Zyb21fYXNjaWkuICBUaGlzIGlzIGJvdGgKLSAgIGhlcmUgYW5kIGluIHdpbmRyZXMuaC4gIEl0IHNob3VsZCBwcm9iYWJseSBiZSBpbiBhIHNlcGFyYXRlIGhlYWRlcgotICAgZmlsZSwgYnV0IGl0IGhhcmRseSBzZWVtcyB3b3J0aCBpdCBmb3Igb25lIGZ1bmN0aW9uLiAgKi8KLQotZXh0ZXJuIFBUUiByZXNfYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7CmRpZmYgLS1naXQgYS9iaW51dGlscy93cnN0YWJzLmMgYi9iaW51dGlscy93cnN0YWJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjgxNzQuLjAwMDAwMDAKLS0tIGEvYmludXRpbHMvd3JzdGFicy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQxNiArMCwwIEBACi0vKiB3cnN0YWJzLmMgLS0gT3V0cHV0IHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHdoaWNoIHdyaXRlcyBvdXQgc3RhYnMgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbi4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJidWNvbW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJkZWJ1Zy5oIgotI2luY2x1ZGUgImJ1ZGJnLmgiCi0KLS8qIE1lYW5pbmdsZXNzIGRlZmluaXRpb24gbmVlZHMgYnkgYW91dDY0LmguICBGSVhNRS4gICovCi0jZGVmaW5lIEJZVEVTX0lOX1dPUkQgNAotCi0jaW5jbHVkZSAiYW91dC9hb3V0NjQuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLS8qIFRoZSBzaXplIG9mIGEgc3RhYnMgc3ltYm9sLiAgVGhpcyBwcmVzdW1lcyAzMiBiaXQgdmFsdWVzLiAgKi8KLQotI2RlZmluZSBTVEFCX1NZTUJPTF9TSVpFICgxMikKLQotLyogQW4gZW50cnkgaW4gYSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogTmV4dCBzdHJpbmcgaW4gdGhpcyB0YWJsZS4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqbmV4dDsKLSAgLyogSW5kZXggaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSAgbG9uZyBpbmRleDsKLSAgLyogU2l6ZSBvZiB0eXBlIGlmIHRoaXMgaXMgYSB0eXBlZGVmLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci19OwotCi0vKiBBIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotc3RydWN0IHN0cmluZ19oYXNoX3RhYmxlCi17Ci0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLX07Ci0KLS8qIFRoZSB0eXBlIHN0YWNrLiAgRWFjaCBlbGVtZW50IG9uIHRoZSBzdGFjayBpcyBhIHN0cmluZy4gICovCi0KLXN0cnVjdCBzdGFiX3R5cGVfc3RhY2sKLXsKLSAgLyogVGhlIG5leHQgZWxlbWVudCBvbiB0aGUgc3RhY2suICAqLwotICBzdHJ1Y3Qgc3RhYl90eXBlX3N0YWNrICpuZXh0OwotICAvKiBUaGlzIGVsZW1lbnQgYXMgYSBzdHJpbmcuICAqLwotICBjaGFyICpzdHJpbmc7Ci0gIC8qIFRoZSB0eXBlIGluZGV4IG9mIHRoaXMgZWxlbWVudC4gICovCi0gIGxvbmcgaW5kZXg7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSB0eXBlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIFdoZXRoZXIgdHlwZSBzdHJpbmcgZGVmaW5lcyBhIG5ldyB0eXBlLiAgKi8KLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICAvKiBTdHJpbmcgZGVmaW5pbmcgc3RydWN0IGZpZWxkcy4gICovCi0gIGNoYXIgKmZpZWxkczsKLSAgLyogTlVMTCB0ZXJtaW5hdGVkIGFycmF5IG9mIHN0cmluZ3MgZGVmaW5pbmcgYmFzZSBjbGFzc2VzIGZvciBhCi0gICAgIGNsYXNzLiAgKi8KLSAgY2hhciAqKmJhc2VjbGFzc2VzOwotICAvKiBTdHJpbmcgZGVmaW5pbmcgY2xhc3MgbWV0aG9kcy4gICovCi0gIGNoYXIgKm1ldGhvZHM7Ci0gIC8qIFN0cmluZyBkZWZpbmluZyB2dGFibGUgcG9pbnRlciBmb3IgYSBjbGFzcy4gICovCi0gIGNoYXIgKnZ0YWJsZTsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0eXBlIGluZGljZXMgZm9yIHRhZ2dlZAotICAgdHlwZXMuICAqLwotCi1zdHJ1Y3Qgc3RhYl90YWcKLXsKLSAgLyogVGhlIHR5cGUgaW5kZXguICAqLwotICBsb25nIGluZGV4OwotICAvKiBUaGUgdGFnIG5hbWUuICAqLwotICBjb25zdCBjaGFyICp0YWc7Ci0gIC8qIFRoZSBraW5kIG9mIHR5cGUuICBUaGlzIGlzIHNldCB0byBERUJVR19LSU5EX0lMTEVHQUwgd2hlbiB0aGUKLSAgICAgdHlwZSBpcyBkZWZpbmVkLiAgKi8KLSAgZW51bSBkZWJ1Z190eXBlX2tpbmQga2luZDsKLSAgLyogVGhlIHNpemUgb2YgdGhlIHN0cnVjdC4gICovCi0gIHVuc2lnbmVkIGludCBzaXplOwotfTsKLQotLyogV2UgcmVtZW1iZXIgdmFyaW91cyBzb3J0cyBvZiB0eXBlIGluZGljZXMuICBUaGV5IGFyZSBub3QgcmVsYXRlZCwKLSAgIGJ1dCwgZm9yIGNvbnZlbmllbmNlLCB3ZSBrZWVwIGFsbCB0aGUgaW5mb3JtYXRpb24gaW4gdGhpcwotICAgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IHN0YWJfdHlwZV9jYWNoZQotewotICAvKiBUaGUgdm9pZCB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyB2b2lkX3R5cGU7Ci0gIC8qIFNpZ25lZCBpbnRlZ2VyIHR5cGUgaW5kaWNlcywgaW5kZXhlZCBieSBzaXplIC0gMS4gICovCi0gIGxvbmcgc2lnbmVkX2ludGVnZXJfdHlwZXNbOF07Ci0gIC8qIFVuc2lnbmVkIGludGVnZXIgdHlwZSBpbmRpY2VzLCBpbmRleGVkIGJ5IHNpemUgLSAxLiAgKi8KLSAgbG9uZyB1bnNpZ25lZF9pbnRlZ2VyX3R5cGVzWzhdOwotICAvKiBGbG9hdGluZyBwb2ludCB0eXBlcywgaW5kZXhlZCBieSBzaXplIC0gMS4gICovCi0gIGxvbmcgZmxvYXRfdHlwZXNbMTZdOwotICAvKiBQb2ludGVycyB0byB0eXBlcywgaW5kZXhlZCBieSB0aGUgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgKnBvaW50ZXJfdHlwZXM7Ci0gIHNpemVfdCBwb2ludGVyX3R5cGVzX2FsbG9jOwotICAvKiBGdW5jdGlvbnMgcmV0dXJuaW5nIHR5cGVzLCBpbmRleGVkIGJ5IHRoZSB0eXBlIGluZGV4LiAgKi8KLSAgbG9uZyAqZnVuY3Rpb25fdHlwZXM7Ci0gIHNpemVfdCBmdW5jdGlvbl90eXBlc19hbGxvYzsKLSAgLyogUmVmZXJlbmNlcyB0byB0eXBlcywgaW5kZXhlZCBieSB0aGUgdHlwZSBpbmRleC4gICovCi0gIGxvbmcgKnJlZmVyZW5jZV90eXBlczsKLSAgc2l6ZV90IHJlZmVyZW5jZV90eXBlc19hbGxvYzsKLSAgLyogU3RydWN0L3VuaW9uL2NsYXNzIHR5cGUgaW5kaWNlcywgaW5kZXhlZCBieSB0aGUgc3RydWN0IGlkLiAgKi8KLSAgc3RydWN0IHN0YWJfdGFnICpzdHJ1Y3RfdHlwZXM7Ci0gIHNpemVfdCBzdHJ1Y3RfdHlwZXNfYWxsb2M7Ci19OwotCi0vKiBUaGlzIGlzIHRoZSBoYW5kbGUgcGFzc2VkIHRocm91Z2ggZGVidWdfd3JpdGUuICAqLwotCi1zdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUKLXsKLSAgLyogVGhlIEJGRC4gICovCi0gIGJmZCAqYWJmZDsKLSAgLyogVGhpcyBidWZmZXIgaG9sZHMgdGhlIHN5bWJvbHMuICAqLwotICBiZmRfYnl0ZSAqc3ltYm9sczsKLSAgc2l6ZV90IHN5bWJvbHNfc2l6ZTsKLSAgc2l6ZV90IHN5bWJvbHNfYWxsb2M7Ci0gIC8qIFRoaXMgaXMgYSBsaXN0IG9mIGhhc2ggdGFibGUgZW50cmllcyBmb3IgdGhlIHN0cmluZ3MuICAqLwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKnN0cmluZ3M7Ci0gIC8qIFRoZSBsYXN0IHN0cmluZyBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpsYXN0X3N0cmluZzsKLSAgLyogVGhlIHNpemUgb2YgdGhlIHN0cmluZ3MuICAqLwotICBzaXplX3Qgc3RyaW5nc19zaXplOwotICAvKiBUaGlzIGhhc2ggdGFibGUgZWxpbWluYXRlcyBkdXBsaWNhdGUgc3RyaW5ncy4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZSBzdHJoYXNoOwotICAvKiBUaGUgdHlwZSBzdGFjay4gICovCi0gIHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKnR5cGVfc3RhY2s7Ci0gIC8qIFRoZSBuZXh0IHR5cGUgaW5kZXguICAqLwotICBsb25nIHR5cGVfaW5kZXg7Ci0gIC8qIFRoZSB0eXBlIGNhY2hlLiAgKi8KLSAgc3RydWN0IHN0YWJfdHlwZV9jYWNoZSB0eXBlX2NhY2hlOwotICAvKiBBIG1hcHBpbmcgZnJvbSB0eXBlZGVmIG5hbWVzIHRvIHR5cGUgaW5kaWNlcy4gICovCi0gIHN0cnVjdCBzdHJpbmdfaGFzaF90YWJsZSB0eXBlZGVmX2hhc2g7Ci0gIC8qIElmIHRoaXMgaXMgbm90IC0xLCBpdCBpcyB0aGUgb2Zmc2V0IHRvIHRoZSBtb3N0IHJlY2VudCBOX1NPCi0gICAgIHN5bWJvbCwgYW5kIHRoZSB2YWx1ZSBvZiB0aGF0IHN5bWJvbCBuZWVkcyB0byBiZSBzZXQuICAqLwotICBsb25nIHNvX29mZnNldDsKLSAgLyogSWYgdGhpcyBpcyBub3QgLTEsIGl0IGlzIHRoZSBvZmZzZXQgdG8gdGhlIG1vc3QgcmVjZW50IE5fRlVOCi0gICAgIHN5bWJvbCwgYW5kIHRoZSB2YWx1ZSBvZiB0aGF0IHN5bWJvbCBuZWVkcyB0byBiZSBzZXQuICAqLwotICBsb25nIGZ1bl9vZmZzZXQ7Ci0gIC8qIFRoZSBsYXN0IHRleHQgc2VjdGlvbiBhZGRyZXNzIHNlZW4uICAqLwotICBiZmRfdm1hIGxhc3RfdGV4dF9hZGRyZXNzOwotICAvKiBUaGUgYmxvY2sgbmVzdGluZyBkZXB0aC4gICovCi0gIHVuc2lnbmVkIGludCBuZXN0aW5nOwotICAvKiBUaGUgZnVuY3Rpb24gYWRkcmVzcy4gICovCi0gIGJmZF92bWEgZm5hZGRyOwotICAvKiBBIHBlbmRpbmcgTEJSQUMgc3ltYm9sLiAgKi8KLSAgYmZkX3ZtYSBwZW5kaW5nX2xicmFjOwotICAvKiBUaGUgY3VycmVudCBsaW5lIG51bWJlciBmaWxlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpsaW5lbm9fZmlsZW5hbWU7Ci19OwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICpzdHJpbmdfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3dyaXRlX3N5bWJvbAotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgaW50LCBpbnQsIGJmZF92bWEsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9wdXNoX3N0cmluZwotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgY29uc3QgY2hhciAqLCBsb25nLCBib29sZWFuLAotCSAgIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgbG9uZywgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgY2hhciAqc3RhYl9wb3BfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9tb2RpZnlfdHlwZQotICBQQVJBTVMgKChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKiwgaW50LCB1bnNpZ25lZCBpbnQsIGxvbmcgKiosIHNpemVfdCAqKSk7Ci1zdGF0aWMgbG9uZyBzdGFiX2dldF9zdHJ1Y3RfaW5kZXgKLSAgUEFSQU1TICgoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAotCSAgIGVudW0gZGVidWdfdHlwZV9raW5kLCB1bnNpZ25lZCBpbnQgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19tZXRob2RfdmFyCi0gIFBBUkFNUyAoKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwKLQkgICBib29sZWFuLCBib29sZWFuLCBib29sZWFuLCBiZmRfdm1hLCBib29sZWFuKSk7Ci0KLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9zb3VyY2UgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW1wdHlfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdm9pZF90eXBlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9pbnRfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9mbG9hdF90eXBlIFBBUkFNUyAoKFBUUiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NvbXBsZXhfdHlwZSBQQVJBTVMgKChQVFIsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9ib29sX3R5cGUgUEFSQU1TICgoUFRSLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW51bV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBiZmRfc2lnbmVkX3ZtYSAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3BvaW50ZXJfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZnVuY3Rpb25fdHlwZSBQQVJBTVMgKChQVFIsIGludCwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9yZWZlcmVuY2VfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfcmFuZ2VfdHlwZSBQQVJBTVMgKChQVFIsIGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9hcnJheV90eXBlCi0gIFBBUkFNUyAoKFBUUiwgYmZkX3NpZ25lZF92bWEsIGJmZF9zaWduZWRfdm1hLCBib29sZWFuKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3NldF90eXBlIFBBUkFNUyAoKFBUUiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9vZmZzZXRfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfbWV0aG9kX3R5cGUgUEFSQU1TICgoUFRSLCBib29sZWFuLCBpbnQsIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY29uc3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdm9sYXRpbGVfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfc3RydWN0X3R5cGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgYm9vbGVhbiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3N0cnVjdF9maWVsZAotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgYmZkX3ZtYSwgYmZkX3ZtYSwgZW51bSBkZWJ1Z192aXNpYmlsaXR5KSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2VuZF9zdHJ1Y3RfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfY2xhc3NfdHlwZQotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LCBib29sZWFuLCB1bnNpZ25lZCBpbnQsIGJvb2xlYW4sCi0JICAgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19zdGF0aWNfbWVtYmVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19iYXNlY2xhc3MKLSAgUEFSQU1TICgoUFRSLCBiZmRfdm1hLCBib29sZWFuLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHkpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfY2xhc3Nfc3RhcnRfbWV0aG9kIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2NsYXNzX21ldGhvZF92YXJpYW50Ci0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Zpc2liaWxpdHksIGJvb2xlYW4sIGJvb2xlYW4sCi0JICAgYmZkX3ZtYSwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmlzaWJpbGl0eSwgYm9vbGVhbiwgYm9vbGVhbikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9jbGFzc19lbmRfbWV0aG9kIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbmRfY2xhc3NfdHlwZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdHlwZWRlZl90eXBlIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3RhZ190eXBlCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGVudW0gZGVidWdfdHlwZV9raW5kKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX3R5cGRlZiBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gc3RhYl90YWcgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfaW50X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2Zsb2F0X2NvbnN0YW50IFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBkb3VibGUpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdHlwZWRfY29uc3RhbnQgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfdmFyaWFibGUKLSAgUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGVudW0gZGVidWdfdmFyX2tpbmQsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfc3RhcnRfZnVuY3Rpb24gUEFSQU1TICgoUFRSLCBjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZnVuY3Rpb25fcGFyYW1ldGVyCi0gIFBBUkFNUyAoKFBUUiwgY29uc3QgY2hhciAqLCBlbnVtIGRlYnVnX3Bhcm1fa2luZCwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9zdGFydF9ibG9jayBQQVJBTVMgKChQVFIsIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHN0YWJfZW5kX2Jsb2NrIFBBUkFNUyAoKFBUUiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gc3RhYl9lbmRfZnVuY3Rpb24gUEFSQU1TICgoUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiBzdGFiX2xpbmVubwotICBQQVJBTVMgKChQVFIsIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZywgYmZkX3ZtYSkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRlYnVnX3dyaXRlX2ZucyBzdGFiX2ZucyA9Ci17Ci0gIHN0YWJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCwKLSAgc3RhYl9zdGFydF9zb3VyY2UsCi0gIHN0YWJfZW1wdHlfdHlwZSwKLSAgc3RhYl92b2lkX3R5cGUsCi0gIHN0YWJfaW50X3R5cGUsCi0gIHN0YWJfZmxvYXRfdHlwZSwKLSAgc3RhYl9jb21wbGV4X3R5cGUsCi0gIHN0YWJfYm9vbF90eXBlLAotICBzdGFiX2VudW1fdHlwZSwKLSAgc3RhYl9wb2ludGVyX3R5cGUsCi0gIHN0YWJfZnVuY3Rpb25fdHlwZSwKLSAgc3RhYl9yZWZlcmVuY2VfdHlwZSwKLSAgc3RhYl9yYW5nZV90eXBlLAotICBzdGFiX2FycmF5X3R5cGUsCi0gIHN0YWJfc2V0X3R5cGUsCi0gIHN0YWJfb2Zmc2V0X3R5cGUsCi0gIHN0YWJfbWV0aG9kX3R5cGUsCi0gIHN0YWJfY29uc3RfdHlwZSwKLSAgc3RhYl92b2xhdGlsZV90eXBlLAotICBzdGFiX3N0YXJ0X3N0cnVjdF90eXBlLAotICBzdGFiX3N0cnVjdF9maWVsZCwKLSAgc3RhYl9lbmRfc3RydWN0X3R5cGUsCi0gIHN0YWJfc3RhcnRfY2xhc3NfdHlwZSwKLSAgc3RhYl9jbGFzc19zdGF0aWNfbWVtYmVyLAotICBzdGFiX2NsYXNzX2Jhc2VjbGFzcywKLSAgc3RhYl9jbGFzc19zdGFydF9tZXRob2QsCi0gIHN0YWJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQsCi0gIHN0YWJfY2xhc3Nfc3RhdGljX21ldGhvZF92YXJpYW50LAotICBzdGFiX2NsYXNzX2VuZF9tZXRob2QsCi0gIHN0YWJfZW5kX2NsYXNzX3R5cGUsCi0gIHN0YWJfdHlwZWRlZl90eXBlLAotICBzdGFiX3RhZ190eXBlLAotICBzdGFiX3R5cGRlZiwKLSAgc3RhYl90YWcsCi0gIHN0YWJfaW50X2NvbnN0YW50LAotICBzdGFiX2Zsb2F0X2NvbnN0YW50LAotICBzdGFiX3R5cGVkX2NvbnN0YW50LAotICBzdGFiX3ZhcmlhYmxlLAotICBzdGFiX3N0YXJ0X2Z1bmN0aW9uLAotICBzdGFiX2Z1bmN0aW9uX3BhcmFtZXRlciwKLSAgc3RhYl9zdGFydF9ibG9jaywKLSAgc3RhYl9lbmRfYmxvY2ssCi0gIHN0YWJfZW5kX2Z1bmN0aW9uLAotICBzdGFiX2xpbmVubwotfTsKLQwKLS8qIFJvdXRpbmUgdG8gY3JlYXRlIGFuIGVudHJ5IGluIGEgc3RyaW5nIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLXN0cmluZ19oYXNoX25ld2Z1bmMgKGVudHJ5LCB0YWJsZSwgc3RyaW5nKQotICAgICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmVudHJ5OwotICAgICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKnRhYmxlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqcmV0ID0gKHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopIE5VTEwpCi0gICAgcmV0ID0gKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikKLQkgICBiZmRfaGFzaF9hbGxvY2F0ZSAodGFibGUsIHNpemVvZiAoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICAvKiBDYWxsIHRoZSBhbGxvY2F0aW9uIG1ldGhvZCBvZiB0aGUgc3VwZXJjbGFzcy4gICovCi0gIHJldCA9ICgoc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0KLSAgaWYgKHJldCkKLSAgICB7Ci0gICAgICAvKiBJbml0aWFsaXplIHRoZSBsb2NhbCBmaWVsZHMuICAqLwotICAgICAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgICAgIHJldC0+aW5kZXggPSAtMTsKLSAgICAgIHJldC0+c2l6ZSA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICopIHJldDsKLX0KLQotLyogTG9vayB1cCBhbiBlbnRyeSBpbiBhIHN0cmluZyBoYXNoIHRhYmxlLiAgKi8KLQotI2RlZmluZSBzdHJpbmdfaGFzaF9sb29rdXAodCwgc3RyaW5nLCBjcmVhdGUsIGNvcHkpIFwKLSAgKChzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKikgXAotICAgYmZkX2hhc2hfbG9va3VwICgmKHQpLT50YWJsZSwgKHN0cmluZyksIChjcmVhdGUpLCAoY29weSkpKQotCi0vKiBBZGQgYSBzeW1ib2wgdG8gdGhlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3ZSBhcmUgYnVpbGRpbmcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIHR5cGUsIGRlc2MsIHZhbHVlLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgaW50IHR5cGU7Ci0gICAgIGludCBkZXNjOwotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci17Ci0gIGJmZF9zaXplX3R5cGUgc3RyeDsKLSAgYmZkX2J5dGUgc3ltW1NUQUJfU1lNQk9MX1NJWkVdOwotCi0gIGlmIChzdHJpbmcgPT0gTlVMTCkKLSAgICBzdHJ4ID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN0cnVjdCBzdHJpbmdfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IHN0cmluZ19oYXNoX2xvb2t1cCAoJmluZm8tPnN0cmhhc2gsIHN0cmluZywgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygic3RyaW5nX2hhc2hfbG9va3VwIGZhaWxlZDogJXNcbiIpLAotCQkgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICByZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgaWYgKGgtPmluZGV4ICE9IC0xKQotCXN0cnggPSBoLT5pbmRleDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ4ID0gaW5mby0+c3RyaW5nc19zaXplOwotCSAgaC0+aW5kZXggPSBzdHJ4OwotCSAgaWYgKGluZm8tPmxhc3Rfc3RyaW5nID09IE5VTEwpCi0JICAgIGluZm8tPnN0cmluZ3MgPSBoOwotCSAgZWxzZQotCSAgICBpbmZvLT5sYXN0X3N0cmluZy0+bmV4dCA9IGg7Ci0JICBpbmZvLT5sYXN0X3N0cmluZyA9IGg7Ci0JICBpbmZvLT5zdHJpbmdzX3NpemUgKz0gc3RybGVuIChzdHJpbmcpICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIFRoaXMgcHJlc3VtZXMgMzIgYml0IHZhbHVlcy4gICovCi0gIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIHN0cngsIHN5bSk7Ci0gIGJmZF9wdXRfOCAoaW5mby0+YWJmZCwgdHlwZSwgc3ltICsgNCk7Ci0gIGJmZF9wdXRfOCAoaW5mby0+YWJmZCwgMCwgc3ltICsgNSk7Ci0gIGJmZF9wdXRfMTYgKGluZm8tPmFiZmQsIGRlc2MsIHN5bSArIDYpOwotICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCB2YWx1ZSwgc3ltICsgOCk7Ci0KLSAgaWYgKGluZm8tPnN5bWJvbHNfc2l6ZSArIFNUQUJfU1lNQk9MX1NJWkUgPiBpbmZvLT5zeW1ib2xzX2FsbG9jKQotICAgIHsKLSAgICAgIGluZm8tPnN5bWJvbHNfYWxsb2MgKj0gMjsKLSAgICAgIGluZm8tPnN5bWJvbHMgPSAoYmZkX2J5dGUgKikgeHJlYWxsb2MgKGluZm8tPnN5bWJvbHMsCi0JCQkJCSAgICAgaW5mby0+c3ltYm9sc19hbGxvYyk7Ci0gICAgfQotCi0gIG1lbWNweSAoaW5mby0+c3ltYm9scyArIGluZm8tPnN5bWJvbHNfc2l6ZSwgc3ltLCBTVEFCX1NZTUJPTF9TSVpFKTsKLQotICBpbmZvLT5zeW1ib2xzX3NpemUgKz0gU1RBQl9TWU1CT0xfU0laRTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIHN0cmluZyBvbiB0byB0aGUgdHlwZSBzdGFjay4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBzdHJpbmcsIGluZGV4LCBkZWZpbml0aW9uLCBzaXplKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLSAgICAgbG9uZyBpbmRleDsKLSAgICAgYm9vbGVhbiBkZWZpbml0aW9uOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLXsKLSAgc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqczsKLQotICBzID0gKHN0cnVjdCBzdGFiX3R5cGVfc3RhY2sgKikgeG1hbGxvYyAoc2l6ZW9mICpzKTsKLSAgcy0+c3RyaW5nID0geHN0cmR1cCAoc3RyaW5nKTsKLSAgcy0+aW5kZXggPSBpbmRleDsKLSAgcy0+ZGVmaW5pdGlvbiA9IGRlZmluaXRpb247Ci0gIHMtPnNpemUgPSBzaXplOwotCi0gIHMtPmZpZWxkcyA9IE5VTEw7Ci0gIHMtPmJhc2VjbGFzc2VzID0gTlVMTDsKLSAgcy0+bWV0aG9kcyA9IE5VTEw7Ci0gIHMtPnZ0YWJsZSA9IE5VTEw7Ci0KLSAgcy0+bmV4dCA9IGluZm8tPnR5cGVfc3RhY2s7Ci0gIGluZm8tPnR5cGVfc3RhY2sgPSBzOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgdHlwZSBpbmRleCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIHNpemUpCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLSAgICAgbG9uZyBpbmRleDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIGNoYXIgYnVmWzIwXTsKLQotICBzcHJpbnRmIChidWYsICIlbGQiLCBpbmRleCk7Ci0gIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBmYWxzZSwgc2l6ZSk7Ci19Ci0KLS8qIFBvcCBhIHR5cGUgb2ZmIHRoZSB0eXBlIHN0YWNrLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKLSAgIGZyZWVpbmcgdGhlIHN0cmluZy4gICovCi0KLXN0YXRpYyBjaGFyICoKLXN0YWJfcG9wX3R5cGUgKGluZm8pCi0gICAgIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbzsKLXsKLSAgc3RydWN0IHN0YWJfdHlwZV9zdGFjayAqczsKLSAgY2hhciAqcmV0OwotCi0gIHMgPSBpbmZvLT50eXBlX3N0YWNrOwotICBhc3NlcnQgKHMgIT0gTlVMTCk7Ci0KLSAgaW5mby0+dHlwZV9zdGFjayA9IHMtPm5leHQ7Ci0KLSAgcmV0ID0gcy0+c3RyaW5nOwotCi0gIGZyZWUgKHMpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBUaGUgZ2VuZXJhbCByb3V0aW5lIHRvIHdyaXRlIG91dCBzdGFicyBpbiBzZWN0aW9ucyBkZWJ1Z2dpbmcKLSAgIGluZm9ybWF0aW9uLiAgVGhpcyBhY2N1bXVsYXRlcyB0aGUgc3RhYnMgc3ltYm9scyBhbmQgdGhlIHN0cmluZ3MgaW4KLSAgIHR3byBvYnN0YWNrcy4gIFdlIGNhbid0IGVhc2lseSB3cml0ZSBvdXQgdGhlIGluZm9ybWF0aW9uIGFzIHdlIGdvCi0gICBhbG9uZywgYmVjYXVzZSB3ZSBuZWVkIHRvIGtub3cgdGhlIHNlY3Rpb24gc2l6ZXMgYmVmb3JlIHdlIGNhbgotICAgd3JpdGUgb3V0IHRoZSBzZWN0aW9uIGNvbnRlbnRzLiAgQUJGRCBpcyB0aGUgQkZEIGFuZCBESEFORExFIGlzIHRoZQotICAgaGFuZGxlIGZvciB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBzZXRzICpQU1lNUyB0byBwb2ludCB0bwotICAgdGhlIHN5bWJvbHMsICpQU1lNU0laRSB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9scywgKlBTVFJJTkdTIHRvIHRoZQotICAgc3RyaW5ncywgYW5kICpQU1RSSU5HU0laRSB0byB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5ncy4gICovCi0KLWJvb2xlYW4KLXdyaXRlX3N0YWJzX2luX3NlY3Rpb25zX2RlYnVnZ2luZ19pbmZvIChhYmZkLCBkaGFuZGxlLCBwc3ltcywgcHN5bXNpemUsCi0JCQkJCXBzdHJpbmdzLCBwc3RyaW5nc2l6ZSkKLSAgICAgYmZkICphYmZkOwotICAgICBQVFIgZGhhbmRsZTsKLSAgICAgYmZkX2J5dGUgKipwc3ltczsKLSAgICAgYmZkX3NpemVfdHlwZSAqcHN5bXNpemU7Ci0gICAgIGJmZF9ieXRlICoqcHN0cmluZ3M7Ci0gICAgIGJmZF9zaXplX3R5cGUgKnBzdHJpbmdzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgaW5mbzsKLSAgc3RydWN0IHN0cmluZ19oYXNoX2VudHJ5ICpoOwotICBiZmRfYnl0ZSAqcDsKLQotICBpbmZvLmFiZmQgPSBhYmZkOwotCi0gIGluZm8uc3ltYm9sc19zaXplID0gMDsKLSAgaW5mby5zeW1ib2xzX2FsbG9jID0gNTAwOwotICBpbmZvLnN5bWJvbHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoaW5mby5zeW1ib2xzX2FsbG9jKTsKLQotICBpbmZvLnN0cmluZ3MgPSBOVUxMOwotICBpbmZvLmxhc3Rfc3RyaW5nID0gTlVMTDsKLSAgLyogUmVzZXJ2ZSAxIGJ5dGUgZm9yIGEgbnVsbCBieXRlLiAgKi8KLSAgaW5mby5zdHJpbmdzX3NpemUgPSAxOwotCi0gIGlmICghIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZpbmZvLnN0cmhhc2gudGFibGUsIHN0cmluZ19oYXNoX25ld2Z1bmMpCi0gICAgICB8fCAhIGJmZF9oYXNoX3RhYmxlX2luaXQgKCZpbmZvLnR5cGVkZWZfaGFzaC50YWJsZSwgc3RyaW5nX2hhc2hfbmV3ZnVuYykpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiYmZkX2hhc2hfdGFibGVfaW5pdF9mYWlsZWQ6ICVzXG4iLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGluZm8udHlwZV9zdGFjayA9IE5VTEw7Ci0gIGluZm8udHlwZV9pbmRleCA9IDE7Ci0gIG1lbXNldCAoJmluZm8udHlwZV9jYWNoZSwgMCwgc2l6ZW9mIGluZm8udHlwZV9jYWNoZSk7Ci0gIGluZm8uc29fb2Zmc2V0ID0gLTE7Ci0gIGluZm8uZnVuX29mZnNldCA9IC0xOwotICBpbmZvLmxhc3RfdGV4dF9hZGRyZXNzID0gMDsKLSAgaW5mby5uZXN0aW5nID0gMDsKLSAgaW5mby5mbmFkZHIgPSAwOwotICBpbmZvLnBlbmRpbmdfbGJyYWMgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgLyogVGhlIGluaXRpYWwgc3ltYm9sIGhvbGRzIHRoZSBzdHJpbmcgc2l6ZS4gICovCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sICgmaW5mbywgMCwgMCwgMCwgKGNvbnN0IGNoYXIgKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIE91dHB1dCBhbiBpbml0aWFsIE5fU08gc3ltYm9sLiAgKi8KLSAgaW5mby5zb19vZmZzZXQgPSBpbmZvLnN5bWJvbHNfc2l6ZTsKLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKCZpbmZvLCBOX1NPLCAwLCAwLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghIGRlYnVnX3dyaXRlIChkaGFuZGxlLCAmc3RhYl9mbnMsIChQVFIpICZpbmZvKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXNzZXJ0IChpbmZvLnBlbmRpbmdfbGJyYWMgPT0gKGJmZF92bWEpIC0xKTsKLQotICAvKiBPdXRwdXQgYSB0cmFpbGluZyBOX1NPLiAgKi8KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKCZpbmZvLCBOX1NPLCAwLCBpbmZvLmxhc3RfdGV4dF9hZGRyZXNzLAotCQkJICAgKGNvbnN0IGNoYXIgKikgTlVMTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIFB1dCB0aGUgc3RyaW5nIHNpemUgaW4gdGhlIGluaXRpYWwgc3ltYm9sLiAgKi8KLSAgYmZkX3B1dF8zMiAoYWJmZCwgaW5mby5zdHJpbmdzX3NpemUsIGluZm8uc3ltYm9scyArIDgpOwotCi0gICpwc3ltcyA9IGluZm8uc3ltYm9sczsKLSAgKnBzeW1zaXplID0gaW5mby5zeW1ib2xzX3NpemU7Ci0KLSAgKnBzdHJpbmdzaXplID0gaW5mby5zdHJpbmdzX3NpemU7Ci0gICpwc3RyaW5ncyA9IChiZmRfYnl0ZSAqKSB4bWFsbG9jIChpbmZvLnN0cmluZ3Nfc2l6ZSk7Ci0KLSAgcCA9ICpwc3RyaW5nczsKLSAgKnArKyA9ICdcMCc7Ci0gIGZvciAoaCA9IGluZm8uc3RyaW5nczsgaCAhPSBOVUxMOyBoID0gaC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJjcHkgKChjaGFyICopIHAsIGgtPnJvb3Quc3RyaW5nKTsKLSAgICAgIHAgKz0gc3RybGVuICgoY2hhciAqKSBwKSArIDE7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTdGFydCB3cml0aW5nIG91dCBpbmZvcm1hdGlvbiBmb3IgYSBjb21waWxhdGlvbiB1bml0LiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfY29tcGlsYXRpb25fdW5pdCAocCwgZmlsZW5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIFdlIHdvdWxkIG5vcm1hbGx5IG91dHB1dCBhbiBOX1NPIHN5bWJvbCBoZXJlLiAgSG93ZXZlciwgdGhhdAotICAgICB3b3VsZCBmb3JjZSB1cyB0byByZXNldCBhbGwgb2Ygb3VyIHR5cGUgaW5mb3JtYXRpb24uICBJIHRoaW5rIHdlCi0gICAgIHdpbGwgYmUgYmV0dGVyIG9mZiBqdXN0IG91dHB1dHRpbmcgYW4gTl9TT0wgc3ltYm9sLCBhbmQgbm90Ci0gICAgIHdvcnJ5aW5nIGFib3V0IHNwbGl0dGluZyBpbmZvcm1hdGlvbiBiZXR3ZWVuIGZpbGVzLiAgKi8KLQotICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICByZXR1cm4gc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fU09MLCAwLCAwLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFN0YXJ0IHdyaXRpbmcgb3V0IGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgc291cmNlIGZpbGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdGFydF9zb3VyY2UgKHAsIGZpbGVuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIHN5bWJvbCdzIHZhbHVlIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSB0ZXh0IHNlY3Rpb24KLSAgICAgYWRkcmVzcy4gIEhvd2V2ZXIsIHdlIHdvdWxkIGhhdmUgdG8gZmlsbCBpdCBpbiBsYXRlciwgYW5kIGdkYgotICAgICBkb2Vzbid0IGNhcmUsIHNvIHdlIGRvbid0IGJvdGhlciB3aXRoIGl0LiAgKi8KLQotICBpbmZvLT5saW5lbm9fZmlsZW5hbWUgPSBmaWxlbmFtZTsKLQotICByZXR1cm4gc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fU09MLCAwLCAwLCBmaWxlbmFtZSk7Ci19Ci0KLS8qIFB1c2ggYW4gZW1wdHkgdHlwZS4gIFRoaXMgc2hvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4gIFdlIGp1c3QgdXNlIGEKLSAgIHZvaWQgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VtcHR5X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogV2UgZG9uJ3QgY2FsbCBzdGFiX3ZvaWRfdHlwZSBpZiB0aGUgdHlwZSBpcyBub3QgeWV0IGRlZmluZWQsCi0gICAgIGJlY2F1c2UgdGhhdCBtaWdodCBzY3JldyB1cCB0aGUgdHlwZWRlZi4gICovCi0KLSAgaWYgKGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlICE9IDApCi0gICAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlLCAwKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgaW5kZXg7Ci0gICAgICBjaGFyIGJ1Zls0MF07Ci0KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPSVsZCIsIGluZGV4LCBpbmRleCk7Ci0KLSAgICAgIHJldHVybiBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBmYWxzZSwgMCk7Ci0gICAgfQotfQotCi0vKiBQdXNoIGEgdm9pZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdm9pZF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIGlmIChpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSAhPSAwKQotICAgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmZvLT50eXBlX2NhY2hlLnZvaWRfdHlwZSwgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGluZGV4OwotICAgICAgY2hhciBidWZbNDBdOwotCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLSAgICAgIGluZm8tPnR5cGVfY2FjaGUudm9pZF90eXBlID0gaW5kZXg7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD0lbGQiLCBpbmRleCwgaW5kZXgpOwotCi0gICAgICByZXR1cm4gc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgMCk7Ci0gICAgfQotfQotCi0vKiBQdXNoIGFuIGludGVnZXIgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2ludF90eXBlIChwLCBzaXplLCB1bnNpZ25lZHApCi0gICAgIFBUUiBwOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgYm9vbGVhbiB1bnNpZ25lZHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgbG9uZyAqY2FjaGU7Ci0KLSAgaWYgKHNpemUgPD0gMCB8fCAoc2l6ZSA+IHNpemVvZiAobG9uZykgJiYgc2l6ZSAhPSA4KSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oInN0YWJfaW50X3R5cGU6IGJhZCBzaXplICV1XG4iKSwgc2l6ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGlmICh1bnNpZ25lZHApCi0gICAgY2FjaGUgPSBpbmZvLT50eXBlX2NhY2hlLnNpZ25lZF9pbnRlZ2VyX3R5cGVzOwotICBlbHNlCi0gICAgY2FjaGUgPSBpbmZvLT50eXBlX2NhY2hlLnVuc2lnbmVkX2ludGVnZXJfdHlwZXM7Ci0KLSAgaWYgKGNhY2hlW3NpemUgLSAxXSAhPSAwKQotICAgIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBjYWNoZVtzaXplIC0gMV0sIHNpemUpOwotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbmRleDsKLSAgICAgIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLQotICAgICAgY2FjaGVbc2l6ZSAtIDFdID0gaW5kZXg7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD1yJWxkOyIsIGluZGV4LCBpbmRleCk7Ci0gICAgICBpZiAodW5zaWduZWRwKQotCXsKLQkgIHN0cmNhdCAoYnVmLCAiMDsiKTsKLQkgIGlmIChzaXplIDwgc2l6ZW9mIChsb25nKSkKLQkgICAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiJWxkOyIsICgobG9uZykgMSA8PCAoc2l6ZSAqIDgpKSAtIDEpOwotCSAgZWxzZSBpZiAoc2l6ZSA9PSBzaXplb2YgKGxvbmcpKQotCSAgICBzdHJjYXQgKGJ1ZiwgIi0xOyIpOwotCSAgZWxzZSBpZiAoc2l6ZSA9PSA4KQotCSAgICBzdHJjYXQgKGJ1ZiwgIjAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3OyIpOwotCSAgZWxzZQotCSAgICBhYm9ydCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNpemUgPD0gc2l6ZW9mIChsb25nKSkKLQkgICAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiJWxkOyVsZDsiLAotCQkgICAgIChsb25nKSAtICgodW5zaWduZWQgbG9uZykgMSA8PCAoc2l6ZSAqIDggLSAxKSksCi0JCSAgICAgKGxvbmcpICgoKHVuc2lnbmVkIGxvbmcpIDEgPDwgKHNpemUgKiA4IC0gMSkpIC0gMSkpOwotCSAgZWxzZSBpZiAoc2l6ZSA9PSA4KQotCSAgICBzdHJjYXQgKGJ1ZiwgIjAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwOzA3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc7Iik7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCX0KLQotICAgICAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIHNpemUpOwotICAgIH0KLX0KLQotLyogUHVzaCBhIGZsb2F0aW5nIHBvaW50IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9mbG9hdF90eXBlIChwLCBzaXplKQotICAgICBQVFIgcDsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICBpZiAoc2l6ZSA+IDAKLSAgICAgICYmIHNpemUgLSAxIDwgKHNpemVvZiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzCi0JCSAgICAgLyBzaXplb2YgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1swXSkKLSAgICAgICYmIGluZm8tPnR5cGVfY2FjaGUuZmxvYXRfdHlwZXNbc2l6ZSAtIDFdICE9IDApCi0gICAgcmV0dXJuIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sCi0JCQkJICAgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1tzaXplIC0gMV0sCi0JCQkJICAgc2l6ZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsb25nIGluZGV4OwotICAgICAgY2hhciAqaW50X3R5cGU7Ci0gICAgICBjaGFyIGJ1Zls1MF07Ci0KLSAgICAgIC8qIEZsb2F0cyBhcmUgZGVmaW5lZCBhcyBhIHN1YnJhbmdlIG9mIGludC4gICovCi0gICAgICBpZiAoISBzdGFiX2ludF90eXBlIChpbmZvLCA0LCBmYWxzZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgaW50X3R5cGUgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotCi0gICAgICBpZiAoc2l6ZSA+IDAKLQkgICYmIHNpemUgLSAxIDwgKHNpemVvZiBpbmZvLT50eXBlX2NhY2hlLmZsb2F0X3R5cGVzCi0JCQkgLyBzaXplb2YgaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1swXSkpCi0JaW5mby0+dHlwZV9jYWNoZS5mbG9hdF90eXBlc1tzaXplIC0gMV0gPSBpbmRleDsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPXIlczsldTswOyIsIGluZGV4LCBpbnRfdHlwZSwgc2l6ZSk7Ci0KLSAgICAgIGZyZWUgKGludF90eXBlKTsKLQotICAgICAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIHNpemUpOwotICAgIH0KLX0KLQotLyogUHVzaCBhIGNvbXBsZXggdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NvbXBsZXhfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgYnVmWzUwXTsKLSAgbG9uZyBpbmRleDsKLQotICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICsraW5mby0+dHlwZV9pbmRleDsKLQotICBzcHJpbnRmIChidWYsICIlbGQ9ciVsZDsldTswOyIsIGluZGV4LCBpbmRleCwgc2l6ZSk7Ci0KLSAgcmV0dXJuIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIHRydWUsIHNpemUgKiAyKTsKLX0KLQotLyogUHVzaCBhIGJvb2xlYW4gdHlwZS4gIFdlIHVzZSBhbiBYQ09GRiBwcmVkZWZpbmVkIHR5cGUsIHNpbmNlIGdkYgotICAgYWx3YXlzIHJlY29nbml6ZXMgdGhlbS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2Jvb2xfdHlwZSAocCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGxvbmcgaW5kZXg7Ci0KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpbmRleCA9IC0yMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgaW5kZXggPSAtMjI7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSA0OgotICAgICAgaW5kZXggPSAtMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgODoKLSAgICAgIGluZGV4ID0gLTMzOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgc2l6ZSk7Ci19Ci0KLS8qIFB1c2ggYW4gZW51bSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZW51bV90eXBlIChwLCB0YWcsIG5hbWVzLCB2YWxzKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqdGFnOwotICAgICBjb25zdCBjaGFyICoqbmFtZXM7Ci0gICAgIGJmZF9zaWduZWRfdm1hICp2YWxzOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIHNpemVfdCBsZW47Ci0gIGNvbnN0IGNoYXIgKipwbjsKLSAgY2hhciAqYnVmOwotICBsb25nIGluZGV4ID0gMDsKLSAgYmZkX3NpZ25lZF92bWEgKnB2OwotCi0gIGlmIChuYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzc2VydCAodGFnICE9IE5VTEwpOwotCi0gICAgICBidWYgPSAoY2hhciAqKSB4bWFsbG9jICgxMCArIHN0cmxlbiAodGFnKSk7Ci0gICAgICBzcHJpbnRmIChidWYsICJ4ZSVzOiIsIHRhZyk7Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgaXMganVzdCBhIGd1ZXNzLiAgKi8KLSAgICAgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZmFsc2UsIDQpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgbGVuID0gMTA7Ci0gIGlmICh0YWcgIT0gTlVMTCkKLSAgICBsZW4gKz0gc3RybGVuICh0YWcpOwotICBmb3IgKHBuID0gbmFtZXM7ICpwbiAhPSBOVUxMOyBwbisrKQotICAgIGxlbiArPSBzdHJsZW4gKCpwbikgKyAyMDsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotCi0gIGlmICh0YWcgPT0gTlVMTCkKLSAgICBzdHJjcHkgKGJ1ZiwgImUiKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzOlQlbGQ9ZSIsIHRhZywgaW5kZXgpOwotICAgIH0KLQotICBmb3IgKHBuID0gbmFtZXMsIHB2ID0gdmFsczsgKnBuICE9IE5VTEw7IHBuKyssIHB2KyspCi0gICAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiJXM6JWxkLCIsICpwbiwgKGxvbmcpICpwdik7Ci0gIHN0cmNhdCAoYnVmLCAiOyIpOwotCi0gIGlmICh0YWcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgaXMganVzdCBhIGd1ZXNzLiAgKi8KLSAgICAgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZmFsc2UsIDQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogVGhlIHNpemUgaXMganVzdCBhIGd1ZXNzLiAgKi8KLSAgICAgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikKLQkgIHx8ICEgc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaW5kZXgsIDQpKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgdG9wIHR5cGUgb24gdGhlIHN0YWNrLiAgQ2FjaGUgdGhlCi0gICByZXN1bHRzIGluIENBQ0hFIGFuZCBDQUNIRV9BTExPQy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX21vZGlmeV90eXBlIChpbmZvLCBtb2QsIHNpemUsIGNhY2hlLCBjYWNoZV9hbGxvYykKLSAgICAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvOwotICAgICBpbnQgbW9kOwotICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgICAgbG9uZyAqKmNhY2hlOwotICAgICBzaXplX3QgKmNhY2hlX2FsbG9jOwotewotICBsb25nIHRhcmdpbmRleDsKLSAgbG9uZyBpbmRleDsKLSAgY2hhciAqcywgKmJ1ZjsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCk7Ci0gIHRhcmdpbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPmluZGV4OwotCi0gIGlmICh0YXJnaW5kZXggPD0gMAotICAgICAgfHwgY2FjaGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBib29sZWFuIGRlZmluaXRpb247Ci0KLSAgICAgIC8qIEVpdGhlciB0aGUgdGFyZ2V0IHR5cGUgaGFzIG5vIGluZGV4LCBvciB3ZSBhcmVuJ3QgY2FjaGluZwotICAgICAgICAgdGhpcyBtb2RpZmllci4gIEVpdGhlciB3YXkgd2UgaGF2ZSBubyB3YXkgb2YgcmVjb3JkaW5nIHRoZQotICAgICAgICAgbmV3IHR5cGUsIHNvIHdlIGRvbid0IGJvdGhlciB0byBkZWZpbmUgb25lLiAgKi8KLSAgICAgIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICAgICAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDIpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWMlcyIsIG1vZCwgcyk7Ci0gICAgICBmcmVlIChzKTsKLSAgICAgIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZGVmaW5pdGlvbiwgc2l6ZSkpCi0JcmV0dXJuIGZhbHNlOwotICAgICAgZnJlZSAoYnVmKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKHNpemVfdCkgdGFyZ2luZGV4ID49ICpjYWNoZV9hbGxvYykKLQl7Ci0JICBzaXplX3QgYWxsb2M7Ci0KLQkgIGFsbG9jID0gKmNhY2hlX2FsbG9jOwotCSAgaWYgKGFsbG9jID09IDApCi0JICAgIGFsbG9jID0gMTA7Ci0JICB3aGlsZSAoKHNpemVfdCkgdGFyZ2luZGV4ID49IGFsbG9jKQotCSAgICBhbGxvYyAqPSAyOwotCSAgKmNhY2hlID0gKGxvbmcgKikgeHJlYWxsb2MgKCpjYWNoZSwgYWxsb2MgKiBzaXplb2YgKGxvbmcpKTsKLQkgIG1lbXNldCAoKmNhY2hlICsgKmNhY2hlX2FsbG9jLCAwLAotCQkgIChhbGxvYyAtICpjYWNoZV9hbGxvYykgKiBzaXplb2YgKGxvbmcpKTsKLQkgICpjYWNoZV9hbGxvYyA9IGFsbG9jOwotCX0KLQotICAgICAgaW5kZXggPSAoKmNhY2hlKVt0YXJnaW5kZXhdOwotICAgICAgaWYgKGluZGV4ICE9IDAgJiYgISBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uKQotCXsKLQkgIC8qIFdlIGhhdmUgYWxyZWFkeSBkZWZpbmVkIGEgbW9kaWZpY2F0aW9uIG9mIHRoaXMgdHlwZSwgYW5kCi0gICAgICAgICAgICAgdGhlIGVudHJ5IG9uIHRoZSB0eXBlIHN0YWNrIGlzIG5vdCBhIGRlZmluaXRpb24sIHNvIHdlCi0gICAgICAgICAgICAgY2FuIHNhZmVseSBkaXNjYXJkIGl0ICh3ZSBtYXkgaGF2ZSBhIGRlZmluaXRpb24gb24gdGhlCi0gICAgICAgICAgICAgc3RhY2ssIGV2ZW4gaWYgd2UgYWxyZWFkeSBkZWZpbmVkIGEgbW9kaWZpY2F0aW9uLCBpZiBpdAotICAgICAgICAgICAgIGlzIGEgc3RydWN0IHdoaWNoIHdlIGRpZCBub3QgZGVmaW5lIGF0IHRoZSB0aW1lIGl0IHdhcwotICAgICAgICAgICAgIHJlZmVyZW5jZWQpLiAgKi8KLQkgIGZyZWUgKHN0YWJfcG9wX3R5cGUgKGluZm8pKTsKLQkgIGlmICghIHN0YWJfcHVzaF9kZWZpbmVkX3R5cGUgKGluZm8sIGluZGV4LCBzaXplKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0JICArK2luZm8tPnR5cGVfaW5kZXg7Ci0KLQkgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQkgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAyMCk7Ci0JICBzcHJpbnRmIChidWYsICIlbGQ9JWMlcyIsIGluZGV4LCBtb2QsIHMpOwotCSAgZnJlZSAocyk7Ci0KLQkgICgqY2FjaGUpW3RhcmdpbmRleF0gPSBpbmRleDsKLQotCSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgdHJ1ZSwgc2l6ZSkpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfSAgCi0KLS8qIFB1c2ggYSBwb2ludGVyIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9wb2ludGVyX3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgLyogRklYTUU6IFRoZSBzaXplIHNob3VsZCBkZXBlbmQgdXBvbiB0aGUgYXJjaGl0ZWN0dXJlLiAgKi8KLSAgcmV0dXJuIHN0YWJfbW9kaWZ5X3R5cGUgKGluZm8sICcqJywgNCwgJmluZm8tPnR5cGVfY2FjaGUucG9pbnRlcl90eXBlcywKLQkJCSAgICZpbmZvLT50eXBlX2NhY2hlLnBvaW50ZXJfdHlwZXNfYWxsb2MpOwotfQotCi0vKiBQdXNoIGEgZnVuY3Rpb24gdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2Z1bmN0aW9uX3R5cGUgKHAsIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgaW50IGFyZ2NvdW50OwotICAgICBib29sZWFuIHZhcmFyZ3M7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgaW50IGk7Ci0KLSAgLyogV2UgaGF2ZSBubyB3YXkgdG8gcmVwcmVzZW50IHRoZSBhcmd1bWVudCB0eXBlcywgc28gd2UganVzdAotICAgICBkaXNjYXJkIHRoZW0uICBIb3dldmVyLCBpZiB0aGV5IGRlZmluZSBuZXcgdHlwZXMsIHdlIG11c3Qgb3V0cHV0Ci0gICAgIHRoZW0uICBXZSBkbyB0aGlzIGJ5IHByb2R1Y2luZyBlbXB0eSB0eXBlZGVmcy4gICovCi0gIGZvciAoaSA9IDA7IGkgPCBhcmdjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb24pCi0JZnJlZSAoc3RhYl9wb3BfdHlwZSAoaW5mbykpOwotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKnMsICpidWY7Ci0KLQkgIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotCSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDMpOwotCSAgc3ByaW50ZiAoYnVmLCAiOnQlcyIsIHMpOwotCSAgZnJlZSAocyk7Ci0KLQkgIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0xTWU0sIDAsIDAsIGJ1ZikpCi0JICAgIHJldHVybiBmYWxzZTsKLQotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnZicsIDAsICZpbmZvLT50eXBlX2NhY2hlLmZ1bmN0aW9uX3R5cGVzLAotCQkJICAgJmluZm8tPnR5cGVfY2FjaGUuZnVuY3Rpb25fdHlwZXNfYWxsb2MpOwotfQotCi0vKiBQdXNoIGEgcmVmZXJlbmNlIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9yZWZlcmVuY2VfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICAvKiBGSVhNRTogVGhlIHNpemUgc2hvdWxkIGRlcGVuZCB1cG9uIHRoZSBhcmNoaXRlY3R1cmUuICAqLwotICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJyYnLCA0LCAmaW5mby0+dHlwZV9jYWNoZS5yZWZlcmVuY2VfdHlwZXMsCi0JCQkgICAmaW5mby0+dHlwZV9jYWNoZS5yZWZlcmVuY2VfdHlwZXNfYWxsb2MpOwotfQotCi0vKiBQdXNoIGEgcmFuZ2UgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3JhbmdlX3R5cGUgKHAsIGxvdywgaGlnaCkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvdzsKLSAgICAgYmZkX3NpZ25lZF92bWEgaGlnaDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBjaGFyICpzLCAqYnVmOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+c2l6ZTsKLQotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocykgKyAxMDApOwotICBzcHJpbnRmIChidWYsICJyJXM7JWxkOyVsZDsiLCBzLCAobG9uZykgbG93LCAobG9uZykgaGlnaCk7Ci0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgMCwgZGVmaW5pdGlvbiwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1c2ggYW4gYXJyYXkgdHlwZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2FycmF5X3R5cGUgKHAsIGxvdywgaGlnaCwgc3RyaW5ncCkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF9zaWduZWRfdm1hIGxvdzsKLSAgICAgYmZkX3NpZ25lZF92bWEgaGlnaDsKLSAgICAgYm9vbGVhbiBzdHJpbmdwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgdW5zaWduZWQgaW50IGVsZW1lbnRfc2l6ZTsKLSAgY2hhciAqcmFuZ2UsICplbGVtZW50LCAqYnVmOwotICBsb25nIGluZGV4OwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgcmFuZ2UgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbiB8fCBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICBlbGVtZW50X3NpemUgPSBpbmZvLT50eXBlX3N0YWNrLT5zaXplOwotICBlbGVtZW50ID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChyYW5nZSkgKyBzdHJsZW4gKGVsZW1lbnQpICsgMTAwKTsKLQotICBpZiAoISBzdHJpbmdwKQotICAgIHsKLSAgICAgIGluZGV4ID0gMDsKLSAgICAgICpidWYgPSAnXDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gZGVmaW5lIGEgdHlwZSBpbiBvcmRlciB0byBpbmNsdWRlIHRoZSBzdHJpbmcKLSAgICAgICAgIGF0dHJpYnV0ZS4gICovCi0gICAgICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0gICAgICBkZWZpbml0aW9uID0gdHJ1ZTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZD1AUzsiLCBpbmRleCk7Ci0gICAgfQotCi0gIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgImFyJXM7JWxkOyVsZDslcyIsCi0JICAgcmFuZ2UsIChsb25nKSBsb3csIChsb25nKSBoaWdoLCBlbGVtZW50KTsKLSAgZnJlZSAocmFuZ2UpOwotICBmcmVlIChlbGVtZW50KTsKLQotICBpZiAoaGlnaCA8IGxvdykKLSAgICBzaXplID0gMDsKLSAgZWxzZQotICAgIHNpemUgPSBlbGVtZW50X3NpemUgKiAoKGhpZ2ggLSBsb3cpICsgMSk7Ci0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGRlZmluaXRpb24sIHNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgc2V0IHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zZXRfdHlwZSAocCwgYml0c3RyaW5ncCkKLSAgICAgUFRSIHA7Ci0gICAgIGJvb2xlYW4gYml0c3RyaW5ncDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKnMsICpidWY7Ci0gIGxvbmcgaW5kZXg7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0KLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMzApOwotCi0gIGlmICghIGJpdHN0cmluZ3ApCi0gICAgewotICAgICAgKmJ1ZiA9ICdcMCc7Ci0gICAgICBpbmRleCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgbmVlZCB0byBkZWZpbmUgYSB0eXBlIGluIG9yZGVyIHRvIGluY2x1ZGUgdGhlIHN0cmluZwotICAgICAgICAgYXR0cmlidXRlLiAgKi8KLSAgICAgIGluZGV4ID0gaW5mby0+dHlwZV9pbmRleDsKLSAgICAgICsraW5mby0+dHlwZV9pbmRleDsKLSAgICAgIGRlZmluaXRpb24gPSB0cnVlOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWxkPUBTOyIsIGluZGV4KTsKLSAgICB9Ci0KLSAgc3ByaW50ZiAoYnVmICsgc3RybGVuIChidWYpLCAiUyVzIiwgcyk7Ci0gIGZyZWUgKHMpOwotCi0gIGlmICghIHN0YWJfcHVzaF9zdHJpbmcgKGluZm8sIGJ1ZiwgaW5kZXgsIGRlZmluaXRpb24sIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGFuIG9mZnNldCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfb2Zmc2V0X3R5cGUgKHApCi0gICAgIFBUUiBwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqdGFyZ2V0LCAqYmFzZSwgKmJ1ZjsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgdGFyZ2V0ID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgYmFzZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAodGFyZ2V0KSArIHN0cmxlbiAoYmFzZSkgKyAzKTsKLSAgc3ByaW50ZiAoYnVmLCAiQCVzLCVzIiwgYmFzZSwgdGFyZ2V0KTsKLSAgZnJlZSAoYmFzZSk7Ci0gIGZyZWUgKHRhcmdldCk7Ci0KLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCAwLCBkZWZpbml0aW9uLCAwKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVzaCBhIG1ldGhvZCB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfbWV0aG9kX3R5cGUgKHAsIGRvbWFpbnAsIGFyZ2NvdW50LCB2YXJhcmdzKQotICAgICBQVFIgcDsKLSAgICAgYm9vbGVhbiBkb21haW5wOwotICAgICBpbnQgYXJnY291bnQ7Ci0gICAgIGJvb2xlYW4gdmFyYXJnczsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKmRvbWFpbiwgKnJldHVybl90eXBlLCAqYnVmOwotICBjaGFyICoqYXJnczsKLSAgaW50IGk7Ci0gIHNpemVfdCBsZW47Ci0KLSAgLyogV2UgZG9uJ3QgYm90aGVyIHdpdGggc3R1YiBtZXRob2QgdHlwZXMsIGJlY2F1c2UgdGhhdCB3b3VsZAotICAgICByZXF1aXJlIGEgbWFuZ2xlciBmb3IgQysrIGFyZ3VtZW50IHR5cGVzLiAgVGhpcyB3aWxsIHdhc3RlIHNwYWNlCi0gICAgIGluIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0LiAgKi8KLQotICAvKiBXZSBuZWVkIGEgZG9tYWluLiAgSSdtIG5vdCBzdXJlIERPTUFJTlAgY2FuIGV2ZXIgYmUgZmFsc2UsCi0gICAgIGFueWhvdy4gICovCi0gIGlmICghIGRvbWFpbnApCi0gICAgewotICAgICAgaWYgKCEgc3RhYl9lbXB0eV90eXBlIChwKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICBkb21haW4gPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBBIG5vbi12YXJhcmdzIGZ1bmN0aW9uIGlzIGluZGljYXRlZCBieSBtYWtpbmcgdGhlIGxhc3QgcGFyYW1ldGVyCi0gICAgIHR5cGUgYmUgdm9pZC4gICovCi0KLSAgaWYgKGFyZ2NvdW50IDwgMCkKLSAgICB7Ci0gICAgICBhcmdzID0gTlVMTDsKLSAgICAgIGFyZ2NvdW50ID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGFyZ2NvdW50ID09IDApCi0gICAgewotICAgICAgaWYgKHZhcmFyZ3MpCi0JYXJncyA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgYXJncyA9IChjaGFyICoqKSB4bWFsbG9jICgxICogc2l6ZW9mICgqYXJncykpOwotCSAgaWYgKCEgc3RhYl9lbXB0eV90eXBlIChwKSkKLQkgICAgcmV0dXJuIGZhbHNlOwotCSAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLQkgIGFyZ3NbMF0gPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQkgIGFyZ2NvdW50ID0gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXJncyA9IChjaGFyICoqKSB4bWFsbG9jICgoYXJnY291bnQgKyAxKSAqIHNpemVvZiAoKmFyZ3MpKTsKLSAgICAgIGZvciAoaSA9IGFyZ2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLQkgIGFyZ3NbaV0gPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQl9Ci0gICAgICBpZiAoISB2YXJhcmdzKQotCXsKLQkgIGlmICghIHN0YWJfZW1wdHlfdHlwZSAocCkpCi0JICAgIHJldHVybiBmYWxzZTsKLQkgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0JICBhcmdzW2FyZ2NvdW50XSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCSAgKythcmdjb3VudDsKLQl9Ci0gICAgfQotCi0gIGRlZmluaXRpb24gPSBkZWZpbml0aW9uIHx8IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHJldHVybl90eXBlID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgbGVuID0gc3RybGVuIChkb21haW4pICsgc3RybGVuIChyZXR1cm5fdHlwZSkgKyAxMDsKLSAgZm9yIChpID0gMDsgaSA8IGFyZ2NvdW50OyBpKyspCi0gICAgbGVuICs9IHN0cmxlbiAoYXJnc1tpXSk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLQotICBzcHJpbnRmIChidWYsICIjJXMsJXMiLCBkb21haW4sIHJldHVybl90eXBlKTsKLSAgZnJlZSAoZG9tYWluKTsKLSAgZnJlZSAocmV0dXJuX3R5cGUpOwotICBmb3IgKGkgPSAwOyBpIDwgYXJnY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBzdHJjYXQgKGJ1ZiwgIiwiKTsKLSAgICAgIHN0cmNhdCAoYnVmLCBhcmdzW2ldKTsKLSAgICAgIGZyZWUgKGFyZ3NbaV0pOwotICAgIH0KLSAgc3RyY2F0IChidWYsICI7Iik7Ci0KLSAgaWYgKGFyZ3MgIT0gTlVMTCkKLSAgICBmcmVlIChhcmdzKTsKLQotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIDAsIGRlZmluaXRpb24sIDApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgY29uc3QgdmVyc2lvbiBvZiBhIHR5cGUuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jb25zdF90eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdGFiX21vZGlmeV90eXBlIChpbmZvLCAnaycsIGluZm8tPnR5cGVfc3RhY2stPnNpemUsCi0JCQkgICAobG9uZyAqKikgTlVMTCwgKHNpemVfdCAqKSBOVUxMKTsKLX0KLQotLyogUHVzaCBhIHZvbGF0aWxlIHZlcnNpb24gb2YgYSB0eXBlLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdm9sYXRpbGVfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICByZXR1cm4gc3RhYl9tb2RpZnlfdHlwZSAoaW5mbywgJ0InLCBpbmZvLT50eXBlX3N0YWNrLT5zaXplLAotCQkJICAgKGxvbmcgKiopIE5VTEwsIChzaXplX3QgKikgTlVMTCk7Ci19Ci0KLS8qIEdldCB0aGUgdHlwZSBpbmRleCB0byB1c2UgZm9yIGEgc3RydWN0L3VuaW9uL2NsYXNzIElELiAgVGhpcyBzaG91bGQKLSAgIHJldHVybiAtMSBpZiBpdCBmYWlscy4gICovCi0KLXN0YXRpYyBsb25nCi1zdGFiX2dldF9zdHJ1Y3RfaW5kZXggKGluZm8sIHRhZywgaWQsIGtpbmQsIHBzaXplKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBlbnVtIGRlYnVnX3R5cGVfa2luZCBraW5kOwotICAgICB1bnNpZ25lZCBpbnQgKnBzaXplOwotewotICBpZiAoaWQgPj0gaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNfYWxsb2MpCi0gICAgewotICAgICAgc2l6ZV90IGFsbG9jOwotCi0gICAgICBhbGxvYyA9IGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzX2FsbG9jOwotICAgICAgaWYgKGFsbG9jID09IDApCi0JYWxsb2MgPSAxMDsKLSAgICAgIHdoaWxlIChpZCA+PSBhbGxvYykKLQlhbGxvYyAqPSAyOwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXMgPQotCShzdHJ1Y3Qgc3RhYl90YWcgKikgeHJlYWxsb2MgKGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzLAotCQkJCSAgICAgIGFsbG9jICogc2l6ZW9mIChzdHJ1Y3Qgc3RhYl90YWcpKTsKLSAgICAgIG1lbXNldCAoKGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzCi0JICAgICAgICsgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNfYWxsb2MpLAotCSAgICAgIDAsCi0JICAgICAgKChhbGxvYyAtIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzX2FsbG9jKQotCSAgICAgICAqIHNpemVvZiAoc3RydWN0IHN0YWJfdGFnKSkpOwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNfYWxsb2MgPSBhbGxvYzsKLSAgICB9Ci0KLSAgaWYgKGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5pbmRleCA9PSAwKQotICAgIHsKLSAgICAgIGluZm8tPnR5cGVfY2FjaGUuc3RydWN0X3R5cGVzW2lkXS5pbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0gICAgICArK2luZm8tPnR5cGVfaW5kZXg7Ci0gICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0udGFnID0gdGFnOwotICAgICAgaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLmtpbmQgPSBraW5kOwotICAgIH0KLQotICBpZiAoa2luZCA9PSBERUJVR19LSU5EX0lMTEVHQUwpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIGRlZmluaXRpb24gb2YgdGhlIHN0cnVjdC4gICovCi0gICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0ua2luZCA9IGtpbmQ7Ci0gICAgICBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0uc2l6ZSA9ICpwc2l6ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICAqcHNpemUgPSBpbmZvLT50eXBlX2NhY2hlLnN0cnVjdF90eXBlc1tpZF0uc2l6ZTsKLQotICByZXR1cm4gaW5mby0+dHlwZV9jYWNoZS5zdHJ1Y3RfdHlwZXNbaWRdLmluZGV4OwotfQotCi0vKiBTdGFydCBvdXRwdXR0aW5nIGEgc3RydWN0LiAgV2UgaWdub3JlIHRoZSB0YWcsIGFuZCBoYW5kbGUgaXQgaW4KLSAgIHN0YWJfdGFnLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdGFydF9zdHJ1Y3RfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGxvbmcgaW5kZXg7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqYnVmOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDQwKTsKLQotICBpZiAoaWQgPT0gMCkKLSAgICB7Ci0gICAgICBpbmRleCA9IDA7Ci0gICAgICAqYnVmID0gJ1wwJzsKLSAgICAgIGRlZmluaXRpb24gPSBmYWxzZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmRleCA9IHN0YWJfZ2V0X3N0cnVjdF9pbmRleCAoaW5mbywgdGFnLCBpZCwgREVCVUdfS0lORF9JTExFR0FMLAotCQkJCSAgICAgJnNpemUpOwotICAgICAgaWYgKGluZGV4IDwgMCkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBzcHJpbnRmIChidWYsICIlbGQ9IiwgaW5kZXgpOwotICAgICAgZGVmaW5pdGlvbiA9IHRydWU7Ci0gICAgfQotCi0gIHNwcmludGYgKGJ1ZiArIHN0cmxlbiAoYnVmKSwgIiVjJXUiLAotCSAgIHN0cnVjdHAgPyAncycgOiAndScsCi0JICAgc2l6ZSk7Ci0KLSAgaWYgKCEgc3RhYl9wdXNoX3N0cmluZyAoaW5mbywgYnVmLCBpbmRleCwgZGVmaW5pdGlvbiwgc2l6ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyA9IChjaGFyICopIHhtYWxsb2MgKDEpOwotICBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHNbMF0gPSAnXDAnOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBBZGQgYSBmaWVsZCB0byBhIHN0cnVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0cnVjdF9maWVsZCAocCwgbmFtZSwgYml0cG9zLCBiaXRzaXplLCB2aXNpYmlsaXR5KQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSBiaXRwb3M7Ci0gICAgIGJmZF92bWEgYml0c2l6ZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgY2hhciAqcywgKm47Ci0gIGNvbnN0IGNoYXIgKnZpczsKLQotICBkZWZpbml0aW9uID0gaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnNpemU7Ci0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICAvKiBBZGQgdGhpcyBmaWVsZCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN0cnVjdCBmaWVsZHMsIHdoaWNoIGlzCi0gICAgIGN1cnJlbnRseSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gICovCi0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7Ci0gIG4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcykKLQkJCSsgc3RybGVuIChuYW1lKQotCQkJKyBzdHJsZW4gKHMpCi0JCQkrIDUwKTsKLQotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICB2aXMgPSAiIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BSSVZBVEU6Ci0gICAgICB2aXMgPSAiLzAiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgdmlzID0gIi8xIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoYml0c2l6ZSA9PSAwKQotICAgIHsKLSAgICAgIGJpdHNpemUgPSBzaXplICogODsKLSAgICAgIGlmIChiaXRzaXplID09IDApCi0JZnByaW50ZiAoc3RkZXJyLAotCQkgXygiJXM6IHdhcm5pbmc6IHVua25vd24gc2l6ZSBmb3IgZmllbGQgYCVzJyBpbiBzdHJ1Y3RcbiIpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoaW5mby0+YWJmZCksIG5hbWUpOwotICAgIH0KLQotICBzcHJpbnRmIChuLCAiJXMlczolcyVzLCVsZCwlbGQ7IiwgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzLCBuYW1lLCB2aXMsIHMsCi0JICAgKGxvbmcpIGJpdHBvcywgKGxvbmcpIGJpdHNpemUpOwotCi0gIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyk7Ci0gIGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcyA9IG47Ci0KLSAgaWYgKGRlZmluaXRpb24pCi0gICAgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEZpbmlzaCB1cCBhIHN0cnVjdC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VuZF9zdHJ1Y3RfdHlwZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBsb25nIGluZGV4OwotICB1bnNpZ25lZCBpbnQgc2l6ZTsKLSAgY2hhciAqZmllbGRzLCAqZmlyc3QsICpidWY7Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwgJiYgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzICE9IE5VTEwpOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICBpbmRleCA9IGluZm8tPnR5cGVfc3RhY2stPmluZGV4OwotICBzaXplID0gaW5mby0+dHlwZV9zdGFjay0+c2l6ZTsKLSAgZmllbGRzID0gaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzOwotICBmaXJzdCA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlyc3QpICsgc3RybGVuIChmaWVsZHMpICsgMik7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzJXM7IiwgZmlyc3QsIGZpZWxkcyk7Ci0gIGZyZWUgKGZpcnN0KTsKLSAgZnJlZSAoZmllbGRzKTsKLQotICBpZiAoISBzdGFiX3B1c2hfc3RyaW5nIChpbmZvLCBidWYsIGluZGV4LCBkZWZpbml0aW9uLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogU3RhcnQgb3V0cHV0dGluZyBhIGNsYXNzLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfc3RhcnRfY2xhc3NfdHlwZSAocCwgdGFnLCBpZCwgc3RydWN0cCwgc2l6ZSwgdnB0ciwgb3dudnB0cikKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICAgdW5zaWduZWQgaW50IGlkOwotICAgICBib29sZWFuIHN0cnVjdHA7Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICBib29sZWFuIHZwdHI7Ci0gICAgIGJvb2xlYW4gb3dudnB0cjsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBib29sZWFuIGRlZmluaXRpb247Ci0gIGNoYXIgKnZzdHJpbmc7Ci0KLSAgaWYgKCEgdnB0ciB8fCBvd252cHRyKQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBmYWxzZTsKLSAgICAgIHZzdHJpbmcgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICAgICAgdnN0cmluZyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotICAgIH0KLQotICBpZiAoISBzdGFiX3N0YXJ0X3N0cnVjdF90eXBlIChwLCB0YWcsIGlkLCBzdHJ1Y3RwLCBzaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZwdHIpCi0gICAgewotICAgICAgY2hhciAqdnRhYmxlOwotCi0gICAgICBpZiAob3dudnB0cikKLQl7Ci0JICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2stPmluZGV4ID4gMCk7Ci0JICB2dGFibGUgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0JICBzcHJpbnRmICh2dGFibGUsICJ+JSUlbGQiLCBpbmZvLT50eXBlX3N0YWNrLT5pbmRleCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHZ0YWJsZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAodnN0cmluZykgKyAzKTsKLQkgIHNwcmludGYgKHZ0YWJsZSwgIn4lJSVzIiwgdnN0cmluZyk7Ci0JICBmcmVlICh2c3RyaW5nKTsKLQl9Ci0KLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSA9IHZ0YWJsZTsKLSAgICB9Ci0KLSAgaWYgKGRlZmluaXRpb24pCi0gICAgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHN0YXRpYyBtZW1iZXIgdG8gdGhlIGNsYXNzIG9uIHRoZSB0eXBlIHN0YWNrLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3Nfc3RhdGljX21lbWJlciAocCwgbmFtZSwgcGh5c25hbWUsIHZpc2liaWxpdHkpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpwaHlzbmFtZTsKLSAgICAgZW51bSBkZWJ1Z192aXNpYmlsaXR5IHZpc2liaWxpdHk7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICpzLCAqbjsKLSAgY29uc3QgY2hhciAqdmlzOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQWRkIHRoaXMgZmllbGQgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdHJ1Y3QgZmllbGRzLCB3aGljaCBpcwotICAgICBjdXJyZW50bHkgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2suICAqLwotCi0gIGFzc2VydCAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzICE9IE5VTEwpOwotICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpCi0JCQkrIHN0cmxlbiAobmFtZSkKLQkJCSsgc3RybGVuIChzKQotCQkJKyBzdHJsZW4gKHBoeXNuYW1lKQotCQkJKyAxMCk7Ci0KLSAgc3dpdGNoICh2aXNpYmlsaXR5KQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgdmlzID0gIiI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgdmlzID0gIi8wIjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHZpcyA9ICIvMSI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgc3ByaW50ZiAobiwgIiVzJXM6JXMlczolczsiLCBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMsIG5hbWUsIHZpcywgcywKLQkgICBwaHlzbmFtZSk7Ci0KLSAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzKTsKLSAgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzID0gbjsKLQotICBpZiAoZGVmaW5pdGlvbikKLSAgICBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uID0gdHJ1ZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgYmFzZSBjbGFzcyB0byB0aGUgY2xhc3Mgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jbGFzc19iYXNlY2xhc3MgKHAsIGJpdHBvcywgdmlydHVhbCwgdmlzaWJpbGl0eSkKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYml0cG9zOwotICAgICBib29sZWFuIHZpcnR1YWw7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGJvb2xlYW4gZGVmaW5pdGlvbjsKLSAgY2hhciAqczsKLSAgY2hhciAqYnVmOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgY2hhciAqKmJhc2VjbGFzc2VzOwotCi0gIGRlZmluaXRpb24gPSBpbmZvLT50eXBlX3N0YWNrLT5kZWZpbml0aW9uOwotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgLyogQnVpbGQgdGhlIGJhc2UgY2xhc3Mgc3BlY2lmaWVyLiAgKi8KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHMpICsgMjUpOwotICBidWZbMF0gPSB2aXJ0dWFsID8gJzEnIDogJzAnOwotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgYnVmWzFdID0gJzAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFJPVEVDVEVEOgotICAgICAgYnVmWzFdID0gJzEnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1ZJU0lCSUxJVFlfUFVCTElDOgotICAgICAgYnVmWzFdID0gJzInOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHNwcmludGYgKGJ1ZiArIDIsICIlbGQsJXM7IiwgKGxvbmcpIGJpdHBvcywgcyk7Ci0gIGZyZWUgKHMpOwotCi0gIC8qIEFkZCB0aGUgbmV3IGJhc2VjbGFzcyB0byB0aGUgZXhpc3Rpbmcgb25lcy4gICovCi0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwgJiYgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzICE9IE5VTEwpOwotCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3NlcyA9PSBOVUxMKQotICAgIGMgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgYyA9IDA7Ci0gICAgICB3aGlsZSAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXNbY10gIT0gTlVMTCkKLQkrK2M7Ci0gICAgfQotCi0gIGJhc2VjbGFzc2VzID0gKGNoYXIgKiopIHhyZWFsbG9jIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3NlcywKLQkJCQkgICAgKGMgKyAyKSAqIHNpemVvZiAoKmJhc2VjbGFzc2VzKSk7Ci0gIGJhc2VjbGFzc2VzW2NdID0gYnVmOwotICBiYXNlY2xhc3Nlc1tjICsgMV0gPSBOVUxMOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzID0gYmFzZWNsYXNzZXM7Ci0KLSAgaWYgKGRlZmluaXRpb24pCi0gICAgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGFkZGluZyBhIG1ldGhvZCB0byB0aGUgY2xhc3Mgb24gdGhlIHR5cGUgc3RhY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jbGFzc19zdGFydF9tZXRob2QgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKm07Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwgJiYgaW5mby0+dHlwZV9zdGFjay0+ZmllbGRzICE9IE5VTEwpOwotCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzID09IE5VTEwpCi0gICAgewotICAgICAgbSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAzKTsKLSAgICAgICptID0gJ1wwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtID0gKGNoYXIgKikgeHJlYWxsb2MgKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMsCi0JCQkgICAgIChzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpCi0JCQkgICAgICArIHN0cmxlbiAobmFtZSkKLQkJCSAgICAgICsgNCkpOwotICAgIH0KLQotICBzcHJpbnRmIChtICsgc3RybGVuIChtKSwgIiVzOjoiLCBuYW1lKTsKLQotICBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzID0gbTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWRkIGEgdmFyaWFudCwgZWl0aGVyIHN0YXRpYyBvciBub3QsIHRvIHRoZSBjdXJyZW50IG1ldGhvZC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2NsYXNzX21ldGhvZF92YXIgKGluZm8sIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBzdGF0aWNwLCBjb25zdHAsIHZvbGF0aWxlcCwKLQkJICAgICAgIHZvZmZzZXQsIGNvbnRleHRwKQotICAgICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBzdGF0aWNwOwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgYm9vbGVhbiBjb250ZXh0cDsKLXsKLSAgYm9vbGVhbiBkZWZpbml0aW9uOwotICBjaGFyICp0eXBlOwotICBjaGFyICpjb250ZXh0ID0gTlVMTDsKLSAgY2hhciB2aXNjLCBxdWFsYywgdHlwZWM7Ci0KLSAgZGVmaW5pdGlvbiA9IGluZm8tPnR5cGVfc3RhY2stPmRlZmluaXRpb247Ci0gIHR5cGUgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBpZiAoY29udGV4dHApCi0gICAgewotICAgICAgZGVmaW5pdGlvbiA9IGRlZmluaXRpb24gfHwgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbjsKLSAgICAgIGNvbnRleHQgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLSAgICB9Ci0KLSAgYXNzZXJ0IChpbmZvLT50eXBlX3N0YWNrICE9IE5VTEwgJiYgaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyAhPSBOVUxMKTsKLQotICBzd2l0Y2ggKHZpc2liaWxpdHkpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QUklWQVRFOgotICAgICAgdmlzYyA9ICcwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19WSVNJQklMSVRZX1BST1RFQ1RFRDoKLSAgICAgIHZpc2MgPSAnMSc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfVklTSUJJTElUWV9QVUJMSUM6Ci0gICAgICB2aXNjID0gJzInOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChjb25zdHApCi0gICAgewotICAgICAgaWYgKHZvbGF0aWxlcCkKLQlxdWFsYyA9ICdEJzsKLSAgICAgIGVsc2UKLQlxdWFsYyA9ICdCJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodm9sYXRpbGVwKQotCXF1YWxjID0gJ0MnOwotICAgICAgZWxzZQotCXF1YWxjID0gJ0EnOwotICAgIH0KLQotICBpZiAoc3RhdGljcCkKLSAgICB0eXBlYyA9ICc/JzsKLSAgZWxzZSBpZiAoISBjb250ZXh0cCkKLSAgICB0eXBlYyA9ICcuJzsKLSAgZWxzZQotICAgIHR5cGVjID0gJyonOwotCi0gIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMgPQotICAgIChjaGFyICopIHhyZWFsbG9jIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzLAotCQkgICAgICAgKHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcykKLQkJCSsgc3RybGVuICh0eXBlKQotCQkJKyBzdHJsZW4gKHBoeXNuYW1lKQotCQkJKyAoY29udGV4dHAgPyBzdHJsZW4gKGNvbnRleHQpIDogMCkKLQkJCSsgNDApKTsKLQotICBzcHJpbnRmIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzICsgc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKSwKLQkgICAiJXM6JXM7JWMlYyVjIiwgdHlwZSwgcGh5c25hbWUsIHZpc2MsIHF1YWxjLCB0eXBlYyk7Ci0gIGZyZWUgKHR5cGUpOwotCi0gIGlmIChjb250ZXh0cCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzICsgc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzKSwKLQkgICAgICAgIiVsZDslczsiLCAobG9uZykgdm9mZnNldCwgY29udGV4dCk7Ci0gICAgICBmcmVlIChjb250ZXh0KTsKLSAgICB9Ci0KLSAgaWYgKGRlZmluaXRpb24pCi0gICAgaW5mby0+dHlwZV9zdGFjay0+ZGVmaW5pdGlvbiA9IHRydWU7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFkZCBhIHZhcmlhbnQgdG8gdGhlIGN1cnJlbnQgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3NfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCwKLQkJCSAgIHZvZmZzZXQsIGNvbnRleHRwKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqcGh5c25hbWU7Ci0gICAgIGVudW0gZGVidWdfdmlzaWJpbGl0eSB2aXNpYmlsaXR5OwotICAgICBib29sZWFuIGNvbnN0cDsKLSAgICAgYm9vbGVhbiB2b2xhdGlsZXA7Ci0gICAgIGJmZF92bWEgdm9mZnNldDsKLSAgICAgYm9vbGVhbiBjb250ZXh0cDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIHJldHVybiBzdGFiX2NsYXNzX21ldGhvZF92YXIgKGluZm8sIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBmYWxzZSwgY29uc3RwLAotCQkJCXZvbGF0aWxlcCwgdm9mZnNldCwgY29udGV4dHApOwotfQotCi0vKiBBZGQgYSBzdGF0aWMgdmFyaWFudCB0byB0aGUgY3VycmVudCBtZXRob2QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9jbGFzc19zdGF0aWNfbWV0aG9kX3ZhcmlhbnQgKHAsIHBoeXNuYW1lLCB2aXNpYmlsaXR5LCBjb25zdHAsIHZvbGF0aWxlcCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnBoeXNuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zpc2liaWxpdHkgdmlzaWJpbGl0eTsKLSAgICAgYm9vbGVhbiBjb25zdHA7Ci0gICAgIGJvb2xlYW4gdm9sYXRpbGVwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0KLSAgcmV0dXJuIHN0YWJfY2xhc3NfbWV0aG9kX3ZhciAoaW5mbywgcGh5c25hbWUsIHZpc2liaWxpdHksIHRydWUsIGNvbnN0cCwKLQkJCQl2b2xhdGlsZXAsIDAsIGZhbHNlKTsKLX0KLQotLyogRmluaXNoIHVwIGEgbWV0aG9kLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfY2xhc3NfZW5kX21ldGhvZCAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzICE9IE5VTEwpOwotCi0gIC8qIFdlIGFsbG9jYXRlZCBlbm91Z2ggcm9vbSBvbiBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzIHRvIGFkZCB0aGUKLSAgICAgdHJhaWxpbmcgc2VtaWNvbG9uLiAgKi8KLSAgc3RyY2F0IChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzLCAiOyIpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdXAgYSBjbGFzcy4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VuZF9jbGFzc190eXBlIChwKQotICAgICBQVFIgcDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBzaXplX3QgbGVuOwotICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0gIGNoYXIgKmJ1ZjsKLQotICBhc3NlcnQgKGluZm8tPnR5cGVfc3RhY2sgIT0gTlVMTCAmJiBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgIT0gTlVMTCk7Ci0KLSAgLyogV29yayBvdXQgdGhlIHNpemUgd2UgbmVlZCB0byBhbGxvY2F0ZSBmb3IgdGhlIGNsYXNzIGRlZmluaXRpb24uICAqLwotCi0gIGxlbiA9IChzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPnN0cmluZykKLQkgKyBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPmZpZWxkcykKLQkgKyAxMCk7Ci0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3NlcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGxlbiArPSAyMDsKLSAgICAgIGZvciAoaSA9IDA7IGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2ldICE9IE5VTEw7IGkrKykKLQlsZW4gKz0gc3RybGVuIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tpXSk7Ci0gICAgfQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyAhPSBOVUxMKQotICAgIGxlbiArPSBzdHJsZW4gKGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpOwotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlICE9IE5VTEwpCi0gICAgbGVuICs9IHN0cmxlbiAoaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlKTsKLQotICAvKiBCdWlsZCB0aGUgY2xhc3MgZGVmaW5pdGlvbi4gICovCi0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLQotICBzdHJjcHkgKGJ1ZiwgaW5mby0+dHlwZV9zdGFjay0+c3RyaW5nKTsKLQotICBpZiAoaW5mby0+dHlwZV9zdGFjay0+YmFzZWNsYXNzZXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIhJXUsIiwgaSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlc1tpXSAhPSBOVUxMOyBpKyspCi0JewotCSAgc3RyY2F0IChidWYsIGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2ldKTsKLQkgIGZyZWUgKGluZm8tPnR5cGVfc3RhY2stPmJhc2VjbGFzc2VzW2ldKTsKLQl9Ci0gICAgICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3Nlcyk7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT5iYXNlY2xhc3NlcyA9IE5VTEw7Ci0gICAgfQotCi0gIHN0cmNhdCAoYnVmLCBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpOwotICBmcmVlIChpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMpOwotICBpbmZvLT50eXBlX3N0YWNrLT5maWVsZHMgPSBOVUxMOwotCi0gIGlmIChpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzICE9IE5VTEwpCi0gICAgewotICAgICAgc3RyY2F0IChidWYsIGluZm8tPnR5cGVfc3RhY2stPm1ldGhvZHMpOwotICAgICAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+bWV0aG9kcyk7Ci0gICAgICBpbmZvLT50eXBlX3N0YWNrLT5tZXRob2RzID0gTlVMTDsKLSAgICB9Ci0KLSAgc3RyY2F0IChidWYsICI7Iik7Ci0KLSAgaWYgKGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cmNhdCAoYnVmLCBpbmZvLT50eXBlX3N0YWNrLT52dGFibGUpOwotICAgICAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+dnRhYmxlKTsKLSAgICAgIGluZm8tPnR5cGVfc3RhY2stPnZ0YWJsZSA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFJlcGxhY2UgdGhlIHN0cmluZyBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRoIHRoZSBjb21wbGV0ZQotICAgICBjbGFzcyBkZWZpbml0aW9uLiAgKi8KLSAgZnJlZSAoaW5mby0+dHlwZV9zdGFjay0+c3RyaW5nKTsKLSAgaW5mby0+dHlwZV9zdGFjay0+c3RyaW5nID0gYnVmOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBQdXNoIGEgdHlwZWRlZiB3aGljaCB3YXMgcHJldmlvdXNseSBkZWZpbmVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfdHlwZWRlZl90eXBlIChwLCBuYW1lKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmg7Ci0KLSAgaCA9IHN0cmluZ19oYXNoX2xvb2t1cCAoJmluZm8tPnR5cGVkZWZfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKTsKLSAgYXNzZXJ0IChoICE9IE5VTEwgJiYgaC0+aW5kZXggPiAwKTsKLQotICByZXR1cm4gc3RhYl9wdXNoX2RlZmluZWRfdHlwZSAoaW5mbywgaC0+aW5kZXgsIGgtPnNpemUpOwotfQotCi0vKiBQdXNoIGEgc3RydWN0LCB1bmlvbiBvciBjbGFzcyB0YWcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl90YWdfdHlwZSAocCwgbmFtZSwgaWQsIGtpbmQpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICB1bnNpZ25lZCBpbnQgaWQ7Ci0gICAgIGVudW0gZGVidWdfdHlwZV9raW5kIGtpbmQ7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgbG9uZyBpbmRleDsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgaW5kZXggPSBzdGFiX2dldF9zdHJ1Y3RfaW5kZXggKGluZm8sIG5hbWUsIGlkLCBraW5kLCAmc2l6ZSk7Ci0gIGlmIChpbmRleCA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiBzdGFiX3B1c2hfZGVmaW5lZF90eXBlIChpbmZvLCBpbmRleCwgc2l6ZSk7Ci19Ci0KLS8qIERlZmluZSBhIHR5cGVkZWYuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl90eXBkZWYgKHAsIG5hbWUpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGxvbmcgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBjaGFyICpzLCAqYnVmOwotICBzdHJ1Y3Qgc3RyaW5nX2hhc2hfZW50cnkgKmg7Ci0KLSAgaW5kZXggPSBpbmZvLT50eXBlX3N0YWNrLT5pbmRleDsKLSAgc2l6ZSA9IGluZm8tPnR5cGVfc3RhY2stPnNpemU7Ci0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChzKSArIDIwKTsKLQotICBpZiAoaW5kZXggPiAwKQotICAgIHNwcmludGYgKGJ1ZiwgIiVzOnQlcyIsIG5hbWUsIHMpOwotICBlbHNlCi0gICAgewotICAgICAgaW5kZXggPSBpbmZvLT50eXBlX2luZGV4OwotICAgICAgKytpbmZvLT50eXBlX2luZGV4OwotICAgICAgc3ByaW50ZiAoYnVmLCAiJXM6dCVsZD0lcyIsIG5hbWUsIGluZGV4LCBzKTsKLSAgICB9Ci0KLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICBoID0gc3RyaW5nX2hhc2hfbG9va3VwICgmaW5mby0+dHlwZWRlZl9oYXNoLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJzdHJpbmdfaGFzaF9sb29rdXAgZmFpbGVkOiAlc1xuIiksCi0JICAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgLyogSSBkb24ndCB0aGluayB3ZSBjYXJlIGFib3V0IHJlZGVmaW5pdGlvbnMuICAqLwotCi0gIGgtPmluZGV4ID0gaW5kZXg7Ci0gIGgtPnNpemUgPSBzaXplOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZWZpbmUgYSB0YWcuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl90YWcgKHAsIHRhZykKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKnRhZzsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpzLCAqYnVmOwotCi0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHRhZykgKyBzdHJsZW4gKHMpICsgMyk7Ci0KLSAgc3ByaW50ZiAoYnVmLCAiJXM6VCVzIiwgdGFnLCBzKTsKLSAgZnJlZSAocyk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVmaW5lIGFuIGludGVnZXIgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9pbnRfY29uc3RhbnQgKHAsIG5hbWUsIHZhbCkKLSAgICAgUFRSIHA7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKmJ1ZjsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMjApOwotICBzcHJpbnRmIChidWYsICIlczpjPWklbGQiLCBuYW1lLCAobG9uZykgdmFsKTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBEZWZpbmUgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2Zsb2F0X2NvbnN0YW50IChwLCBuYW1lLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBkb3VibGUgdmFsOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKmJ1ZjsKLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMjApOwotICBzcHJpbnRmIChidWYsICIlczpjPWYlZyIsIG5hbWUsIHZhbCk7Ci0KLSAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTFNZTSwgMCwgMCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRGVmaW5lIGEgdHlwZWQgY29uc3RhbnQuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl90eXBlZF9jb25zdGFudCAocCwgbmFtZSwgdmFsKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkX3ZtYSB2YWw7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLSAgY2hhciAqcywgKmJ1ZjsKLQotICBzID0gc3RhYl9wb3BfdHlwZSAoaW5mbyk7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAocykgKyAyMCk7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzOmM9ZSVzLCVsZCIsIG5hbWUsIHMsIChsb25nKSB2YWwpOwotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MU1lNLCAwLCAwLCBidWYpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmcmVlIChidWYpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZWNvcmQgYSB2YXJpYWJsZS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3ZhcmlhYmxlIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Zhcl9raW5kIGtpbmQ7Ci0gICAgIGJmZF92bWEgdmFsOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnMsICpidWY7Ci0gIGludCBzdGFiX3R5cGU7Ci0gIGNvbnN0IGNoYXIgKmtpbmRzdHI7Ci0KLSAgcyA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIHN3aXRjaCAoa2luZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBERUJVR19HTE9CQUw6Ci0gICAgICBzdGFiX3R5cGUgPSBOX0dTWU07Ci0gICAgICBraW5kc3RyID0gIkciOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1NUQVRJQzoKLSAgICAgIHN0YWJfdHlwZSA9IE5fU1RTWU07Ci0gICAgICBraW5kc3RyID0gIlMiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0xPQ0FMX1NUQVRJQzoKLSAgICAgIHN0YWJfdHlwZSA9IE5fU1RTWU07Ci0gICAgICBraW5kc3RyID0gIlYiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX0xPQ0FMOgotICAgICAgc3RhYl90eXBlID0gTl9MU1lNOwotICAgICAga2luZHN0ciA9ICIiOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGEgdHlwZSByZWZlcmVuY2Ugb3IgZGVmaW5pdGlvbi4gICovCi0gICAgICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCXsKLQkgIGNoYXIgKm47Ci0JICBsb25nIGluZGV4OwotCi0JICBpbmRleCA9IGluZm8tPnR5cGVfaW5kZXg7Ci0JICArK2luZm8tPnR5cGVfaW5kZXg7Ci0JICBuID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzKSArIDIwKTsKLQkgIHNwcmludGYgKG4sICIlbGQ9JXMiLCBpbmRleCwgcyk7Ci0JICBmcmVlIChzKTsKLQkgIHMgPSBuOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19SRUdJU1RFUjoKLSAgICAgIHN0YWJfdHlwZSA9IE5fUlNZTTsKLSAgICAgIGtpbmRzdHIgPSAiciI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIHN0cmxlbiAocykgKyAzKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXM6JXMlcyIsIG5hbWUsIGtpbmRzdHIsIHMpOwotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgc3RhYl90eXBlLCAwLCB2YWwsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IG91dHB1dHRpbmcgYSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX3N0YXJ0X2Z1bmN0aW9uIChwLCBuYW1lLCBnbG9iYWxwKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYm9vbGVhbiBnbG9iYWxwOwotewotICBzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKmluZm8gPSAoc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICopIHA7Ci0gIGNoYXIgKnJldHR5cGUsICpidWY7Ci0KLSAgYXNzZXJ0IChpbmZvLT5uZXN0aW5nID09IDAgJiYgaW5mby0+ZnVuX29mZnNldCA9PSAtMSk7Ci0KLSAgcmV0dHlwZSA9IHN0YWJfcG9wX3R5cGUgKGluZm8pOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKHJldHR5cGUpICsgMyk7Ci0gIHNwcmludGYgKGJ1ZiwgIiVzOiVjJXMiLCBuYW1lLAotCSAgIGdsb2JhbHAgPyAnRicgOiAnZicsCi0JICAgcmV0dHlwZSk7Ci0KLSAgLyogV2UgZG9uJ3Qga25vdyB0aGUgdmFsdWUgbm93LCBzbyB3ZSBzZXQgaXQgaW4gc3RhcnRfYmxvY2suICAqLwotICBpbmZvLT5mdW5fb2Zmc2V0ID0gaW5mby0+c3ltYm9sc19zaXplOwotCi0gIGlmICghIHN0YWJfd3JpdGVfc3ltYm9sIChpbmZvLCBOX0ZVTiwgMCwgMCwgYnVmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZnJlZSAoYnVmKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogT3V0cHV0IGEgZnVuY3Rpb24gcGFyYW1ldGVyLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLXN0YWJfZnVuY3Rpb25fcGFyYW1ldGVyIChwLCBuYW1lLCBraW5kLCB2YWwpCi0gICAgIFBUUiBwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBlbnVtIGRlYnVnX3Bhcm1fa2luZCBraW5kOwotICAgICBiZmRfdm1hIHZhbDsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotICBjaGFyICpzLCAqYnVmOwotICBpbnQgc3RhYl90eXBlOwotICBjaGFyIGtpbmRjOwotCi0gIHMgPSBzdGFiX3BvcF90eXBlIChpbmZvKTsKLQotICBzd2l0Y2ggKGtpbmQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIGNhc2UgREVCVUdfUEFSTV9TVEFDSzoKLSAgICAgIHN0YWJfdHlwZSA9IE5fUFNZTTsKLSAgICAgIGtpbmRjID0gJ3AnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQlVHX1BBUk1fUkVHOgotICAgICAgc3RhYl90eXBlID0gTl9SU1lNOwotICAgICAga2luZGMgPSAnUCc7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREVCVUdfUEFSTV9SRUZFUkVOQ0U6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1BTWU07Ci0gICAgICBraW5kYyA9ICd2JzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBERUJVR19QQVJNX1JFRl9SRUc6Ci0gICAgICBzdGFiX3R5cGUgPSBOX1JTWU07Ci0gICAgICBraW5kYyA9ICdhJzsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBidWYgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgc3RybGVuIChzKSArIDMpOwotICBzcHJpbnRmIChidWYsICIlczolYyVzIiwgbmFtZSwga2luZGMsIHMpOwotICBmcmVlIChzKTsKLQotICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgc3RhYl90eXBlLCAwLCB2YWwsIGJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZyZWUgKGJ1Zik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFN0YXJ0IGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9zdGFydF9ibG9jayAocCwgYWRkcikKLSAgICAgUFRSIHA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIC8qIEZpbGwgaW4gYW55IHNsb3RzIHdoaWNoIGhhdmUgYmVlbiB3YWl0aW5nIGZvciB0aGUgZmlyc3Qga25vd24KLSAgICAgdGV4dCBhZGRyZXNzLiAgKi8KLQotICBpZiAoaW5mby0+c29fb2Zmc2V0ICE9IC0xKQotICAgIHsKLSAgICAgIGJmZF9wdXRfMzIgKGluZm8tPmFiZmQsIGFkZHIsIGluZm8tPnN5bWJvbHMgKyBpbmZvLT5zb19vZmZzZXQgKyA4KTsKLSAgICAgIGluZm8tPnNvX29mZnNldCA9IC0xOwotICAgIH0KLQotICBpZiAoaW5mby0+ZnVuX29mZnNldCAhPSAtMSkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzMyIChpbmZvLT5hYmZkLCBhZGRyLCBpbmZvLT5zeW1ib2xzICsgaW5mby0+ZnVuX29mZnNldCArIDgpOwotICAgICAgaW5mby0+ZnVuX29mZnNldCA9IC0xOwotICAgIH0KLQotICArK2luZm8tPm5lc3Rpbmc7Ci0KLSAgLyogV2Ugd2lsbCBiZSBjYWxsZWQgd2l0aCBhIHRvcCBsZXZlbCBibG9jayBzdXJyb3VuZGluZyB0aGUKLSAgICAgZnVuY3Rpb24sIGJ1dCBzdGFicyBpbmZvcm1hdGlvbiBkb2VzIG5vdCBvdXRwdXQgdGhhdCBibG9jaywgc28gd2UKLSAgICAgaWdub3JlIGl0LiAgKi8KLQotICBpZiAoaW5mby0+bmVzdGluZyA9PSAxKQotICAgIHsKLSAgICAgIGluZm8tPmZuYWRkciA9IGFkZHI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogV2UgaGF2ZSB0byBvdXRwdXQgdGhlIExCUkFDIHN5bWJvbCBhZnRlciBhbnkgdmFyaWFibGVzIHdoaWNoIGFyZQotICAgICBkZWNsYXJlZCBpbnNpZGUgdGhlIGJsb2NrLiAgV2UgcG9zdHBvbmUgdGhlIExCUkFDIHVudGlsIHRoZSBuZXh0Ci0gICAgIHN0YXJ0X2Jsb2NrIG9yIGVuZF9ibG9jay4gICovCi0KLSAgLyogSWYgd2UgaGF2ZSBwb3N0cG9uZWQgYW4gTEJSQUMsIG91dHB1dCBpdCBub3cuICAqLwotICBpZiAoaW5mby0+cGVuZGluZ19sYnJhYyAhPSAoYmZkX3ZtYSkgLTEpCi0gICAgewotICAgICAgaWYgKCEgc3RhYl93cml0ZV9zeW1ib2wgKGluZm8sIE5fTEJSQUMsIDAsIGluZm8tPnBlbmRpbmdfbGJyYWMsCi0JCQkgICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBSZW1lbWJlciB0aGUgYWRkcmVzcyBhbmQgb3V0cHV0IGl0IGxhdGVyLiAgKi8KLQotICBpbmZvLT5wZW5kaW5nX2xicmFjID0gYWRkciAtIGluZm8tPmZuYWRkcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW5kIGEgYmxvY2suICAqLwotCi1zdGF0aWMgYm9vbGVhbgotc3RhYl9lbmRfYmxvY2sgKHAsIGFkZHIpCi0gICAgIFBUUiBwOwotICAgICBiZmRfdm1hIGFkZHI7Ci17Ci0gIHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqaW5mbyA9IChzdHJ1Y3Qgc3RhYl93cml0ZV9oYW5kbGUgKikgcDsKLQotICBpZiAoYWRkciA+IGluZm8tPmxhc3RfdGV4dF9hZGRyZXNzKQotICAgIGluZm8tPmxhc3RfdGV4dF9hZGRyZXNzID0gYWRkcjsKLQotICAvKiBJZiB3ZSBoYXZlIHBvc3Rwb25lZCBhbiBMQlJBQywgb3V0cHV0IGl0IG5vdy4gICovCi0gIGlmIChpbmZvLT5wZW5kaW5nX2xicmFjICE9IChiZmRfdm1hKSAtMSkKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9MQlJBQywgMCwgaW5mby0+cGVuZGluZ19sYnJhYywKLQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSkKLQlyZXR1cm4gZmFsc2U7Ci0gICAgICBpbmZvLT5wZW5kaW5nX2xicmFjID0gKGJmZF92bWEpIC0xOwotICAgIH0KLQotICBhc3NlcnQgKGluZm8tPm5lc3RpbmcgPiAwKTsKLQotICAtLWluZm8tPm5lc3Rpbmc7Ci0KLSAgLyogV2UgaWdub3JlIHRoZSBvdXRlcm1vc3QgYmxvY2suICAqLwotICBpZiAoaW5mby0+bmVzdGluZyA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIHJldHVybiBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9SQlJBQywgMCwgYWRkciAtIGluZm8tPmZuYWRkciwKLQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMKTsKLX0KLQotLyogRW5kIGEgZnVuY3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1zdGFiX2VuZF9mdW5jdGlvbiAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBPdXRwdXQgYSBsaW5lIG51bWJlci4gICovCi0KLXN0YXRpYyBib29sZWFuCi1zdGFiX2xpbmVubyAocCwgZmlsZSwgbGluZW5vLCBhZGRyKQotICAgICBQVFIgcDsKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgbG9uZyBsaW5lbm87Ci0gICAgIGJmZF92bWEgYWRkcjsKLXsKLSAgc3RydWN0IHN0YWJfd3JpdGVfaGFuZGxlICppbmZvID0gKHN0cnVjdCBzdGFiX3dyaXRlX2hhbmRsZSAqKSBwOwotCi0gIGFzc2VydCAoaW5mby0+bGluZW5vX2ZpbGVuYW1lICE9IE5VTEwpOwotCi0gIGlmIChhZGRyID4gaW5mby0+bGFzdF90ZXh0X2FkZHJlc3MpCi0gICAgaW5mby0+bGFzdF90ZXh0X2FkZHJlc3MgPSBhZGRyOwotCi0gIGlmIChzdHJjbXAgKGZpbGUsIGluZm8tPmxpbmVub19maWxlbmFtZSkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoISBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9TT0wsIDAsIGFkZHIsIGZpbGUpKQotCXJldHVybiBmYWxzZTsKLSAgICAgIGluZm8tPmxpbmVub19maWxlbmFtZSA9IGZpbGU7Ci0gICAgfQotCi0gIHJldHVybiBzdGFiX3dyaXRlX3N5bWJvbCAoaW5mbywgTl9TTElORSwgbGluZW5vLCBhZGRyIC0gaW5mby0+Zm5hZGRyLAotCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwpOwotfQpkaWZmIC0tZ2l0IGEvY29uZmlnLW1sLmluIGIvY29uZmlnLW1sLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNmN2NmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy1tbC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi0jIENvbmZpZ3VyZSBmcmFnbWVudCBpbnZva2VkIGluIHRoZSBwb3N0LXRhcmdldCBzZWN0aW9uIGZvciBzdWJkaXJzCi0jIHdhbnRpbmcgbXVsdGlsaWIgc3VwcG9ydC4KLSMKLSMgSXQgaXMgYWR2aXNhYmxlIHRvIHN1cHBvcnQgYSBmZXcgLS1lbmFibGUvLS1kaXNhYmxlIG9wdGlvbnMgdG8gbGV0IHRoZQotIyB1c2VyIHNlbGVjdCB3aGljaCBsaWJyYXJpZXMgcy9oZSByZWFsbHkgd2FudHMuCi0jCi0jIFN1YmRpcmVjdG9yaWVzIHdpc2hpbmcgdG8gdXNlIG11bHRpbGliIHNob3VsZCBwdXQgdGhlIGZvbGxvd2luZyBsaW5lcwotIyBpbiB0aGUgInBvc3QtdGFyZ2V0IiBzZWN0aW9uIG9mIGNvbmZpZ3VyZS5pbi4KLSMKLSMgaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdIDsgdGhlbgotIyAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF0gOyB0aGVuCi0jICAgICAuICR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLi9jb25maWctbWwuaW4KLSMgICBlbHNlCi0jICAgICAuICR7d2l0aF9tdWx0aXNyY3RvcH0uLi9jb25maWctbWwuaW4KLSMgICBmaQotIyBlbHNlCi0jICAgLiAke3NyY2Rpcn0vLi4vY29uZmlnLW1sLmluCi0jIGZpCi0jCi0jIFNlZSBsaWJyeC9jb25maWd1cmUuaW4gaW4gdGhlIGxpYmcrKyBkaXN0cmlidXRpb24gZm9yIGFuIGV4YW1wbGUgb2YgaG93Ci0jIHRvIGhhbmRsZSBhdXRvY29uZidkIGxpYnJhcmllcy4KLSMKLSMgVGhpbmdzIGFyZSBjb21wbGljYXRlZCBiZWNhdXNlIDYgc2VwYXJhdGUgY2FzZXMgbXVzdCBiZSBoYW5kbGVkOgotIyAyIChuYXRpdmUsIGNyb3NzKSB4IDMgKGFic29sdXRlLXBhdGgsIHJlbGF0aXZlLW5vdC1kb3QsIGRvdCkgPSA2LgotIwotIyBzcmNkaXI9LiBpcyBzcGVjaWFsLiAgSXQgbXVzdCBoYW5kbGUgbWFrZSBwcm9ncmFtcyB0aGF0IGRvbid0IGhhbmRsZSBWUEFUSC4KLSMgVG8gaW1wbGVtZW50IHRoaXMsIGEgc3ltbGluayB0cmVlIGlzIGJ1aWx0IGZvciBlYWNoIGxpYnJhcnkgYW5kIGZvciBlYWNoCi0jIG11bHRpbGliIHN1YmRpci4KLSMKLSMgVGhlIGJ1aWxkIHRyZWUgaXMgbGF5ZWQgb3V0IGFzCi0jCi0jIC4vCi0jICAgbGliZysrCi0jICAgbmV3bGliCi0jICAgbTY4MDIwLwotIyAgICAgICAgICBsaWJnKysKLSMgICAgICAgICAgbmV3bGliCi0jICAgICAgICAgIG02ODg4MS8KLSMgICAgICAgICAgICAgICAgIGxpYmcrKwotIyAgICAgICAgICAgICAgICAgbmV3bGliCi0jCi0jIFRoZSBuaWNlIGZlYXR1cmUgYWJvdXQgdGhpcyBhcnJhbmdlbWVudCBpcyB0aGF0IGludGVyLWxpYnJhcnkgcmVmZXJlbmNlcwotIyBpbiB0aGUgYnVpbGQgdHJlZSB3b3JrIHdpdGhvdXQgaGF2aW5nIHRvIGNhcmUgd2hlcmUgeW91IGFyZS4gIE5vdGUgdGhhdAotIyBpbnRlci1saWJyYXJ5IHJlZmVyZW5jZXMgYWxzbyB3b3JrIGluIHRoZSBzb3VyY2UgdHJlZSBiZWNhdXNlIHN5bWxpbmsgdHJlZXMKLSMgYXJlIGJ1aWx0IHdoZW4gc3JjZGlyPS4KLSMKLSMgVW5mb3J0dW5hdGVseSwgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgbGlicmFyaWVzIGluIHRoZSBidWlsZCB0cmVlIHJlcXVpcmVzCi0jIHRoZSB1c2VyIHRvIG1hbnVhbGx5IGNob29zZSB3aGljaCBsaWJyYXJ5IHRvIHVzZSBhcyBHQ0Mgd29uJ3QgYmUgYWJsZSB0bwotIyBmaW5kIHRoZSByaWdodCBvbmUuICBUaGlzIGlzIHZpZXdlZCBhcyB0aGUgbGVzc2VyIG9mIHR3byBldmlscy4KLSMKLSMgQ29uZmlndXJlIHZhcmlhYmxlczoKLSMgJHt3aXRoX3RhcmdldF9zdWJkaXJ9ID0gIi4iIGZvciBuYXRpdmUsIG9yICR7dGFyZ2V0X2FsaWFzfSBmb3IgY3Jvc3MuCi0jIFNldCBieSB0b3AgbGV2ZWwgTWFrZWZpbGUuCi0jICR7d2l0aF9tdWx0aXNyY3RvcH0gPSBob3cgbWFueSBsZXZlbHMgb2YgbXVsdGlsaWJzIHRoZXJlIGFyZSBpbiB0aGUgc291cmNlCi0jIHRyZWUuICBJdCBleGlzdHMgdG8gaGFuZGxlIHRoZSBjYXNlIG9mIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UgdHJlZToKLSMgJHtzcmNkaXJ9IGlzIG5vdCBjb25zdGFudC4KLSMgJHt3aXRoX211bHRpc3ViZGlyfSA9IG5hbWUgb2YgbXVsdGlsaWIgc3ViZGlyZWN0b3J5IChlZzogbTY4MDIwL202ODg4MSkuCi0jCi0jIE1ha2VmaWxlIHZhcmlhYmxlczoKLSMgTVVMVElTUkNUT1AgPSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHNvdXJjZSB0cmVlICgrMSBpZiBjcm9zcykKLSMgKEZJWE1FOiBub3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiAke3dpdGhfbXVsdGlzcmN0b3B9LiAgQ2hlY2sgb3V0LikuCi0jIE1VTFRJQlVJTERUT1AgPSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIGJ1aWxkIHRyZWUKLSMgTVVMVElESVJTID0gbGlzdCBvZiBtdWx0aWxpYiBzdWJkaXJzIChlZzogbTY4MDAwIG02ODAyMCAuLi4pCi0jIChvbmx5IGRlZmluZWQgaW4gZWFjaCBsaWJyYXJ5J3MgbWFpbiBNYWtlZmlsZSkuCi0jIE1VTFRJU1VCRElSID0gaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHdpdGggbGVhZGluZyAnLycgKGVnOiAvbTY4MDAwKQotIyAob25seSBkZWZpbmVkIGluIGVhY2ggbXVsdGlsaWIgc3ViZGlyKS4KLQotIyBGSVhNRTogTXVsdGlsaWIgaXMgY3VycmVudGx5IGRpc2FibGVkIGJ5IGRlZmF1bHQgZm9yIGV2ZXJ5dGhpbmcgb3RoZXIgdGhhbgotIyBuZXdsaWIuICBJdCBpcyB1cCB0byBlYWNoIHRhcmdldCB0byB0dXJuIG9uIG11bHRpbGliIHN1cHBvcnQgZm9yIHRoZSBvdGhlcgotIyBsaWJyYXJpZXMgYXMgZGVzaXJlZC4KLQotIyBXZSBoYXZlIHRvIGhhbmRsZSBiZWluZyBpbnZva2VkIGJ5IGJvdGggQ3lnbnVzIGNvbmZpZ3VyZSBhbmQgQXV0b2NvbmYuCi0jCi0jIEN5Z251cyBjb25maWd1cmUgaW5jb21pbmcgdmFyaWFibGVzOgotIyBzcmNkaXIsIHN1YmRpciwgaG9zdCwgYXJndW1lbnRzCi0jCi0jIEF1dG9jb25mIGluY29taW5nIHZhcmlhYmxlczoKLSMgc3JjZGlyLCBob3N0LCBhY19jb25maWd1cmVfYXJncwotIwotIyBXZSAqY291bGQqIGZpZ3VyZSBzcmNkaXIgYW5kIGhvc3Qgb3V0LCBidXQgd2UnZCBoYXZlIHRvIGRvIHdvcmsgdGhhdAotIyBvdXIgY2FsbGVyIGhhcyBhbHJlYWR5IGRvbmUgdG8gZmlndXJlIHRoZW0gb3V0IGFuZCByZXF1aXJpbmcgdGhlc2UgdHdvCi0jIHNlZW1zIHJlYXNvbmFibGUuCi0jIE5vdGUgdGhhdCBgaG9zdCcgaW4gdGhpcyBjYXNlIGlzIEdDQydzIGB0YXJnZXQnLiAgVGFyZ2V0IGxpYnJhcmllcyBhcmUKLSMgY29uZmlndXJlZCBmb3IgYSBwYXJ0aWN1bGFyIGhvc3QuCi0KLWlmIFsgLW4gIiR7YWNfY29uZmlndXJlX2FyZ3N9IiBdOyB0aGVuCi0gIE1ha2VmaWxlPSR7YWNfZmlsZS1NYWtlZmlsZX0KLSAgbWxfY29uZmlnX3NoZWxsPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0gIG1sX2FyZ3VtZW50cz0iJHthY19jb25maWd1cmVfYXJnc30iCi0gIG1sX3JlYWxzcmNkaXI9JHtzcmNkaXJ9Ci1lbHNlCi0gIE1ha2VmaWxlPSR7TWFrZWZpbGUtTWFrZWZpbGV9Ci0gIG1sX2NvbmZpZ19zaGVsbD0ke2NvbmZpZ19zaGVsbC0vYmluL3NofQotICBtbF9hcmd1bWVudHM9IiR7YXJndW1lbnRzfSIKLSAgaWYgWyAtbiAiJHtzdWJkaXJ9IiAtYSAiJHtzdWJkaXJ9IiAhPSAiLiIgXSA7IHRoZW4KLSAgICBtbF9yZWFsc3JjZGlyPSR7c3JjZGlyfS8ke3N1YmRpcn0KLSAgZWxzZQotICAgIG1sX3JlYWxzcmNkaXI9JHtzcmNkaXJ9Ci0gIGZpCi1maQotCi0jIFNjYW4gYWxsIHRoZSBhcmd1bWVudHMgYW5kIHNldCBhbGwgdGhlIG9uZXMgd2UgbmVlZC4KLQotbWxfdmVyYm9zZT0tLXZlcmJvc2UKLWZvciBvcHRpb24gaW4gJHttbF9hcmd1bWVudHN9Ci1kbwotICBjYXNlICRvcHRpb24gaW4KLSAgLS0qKSA7OwotICAtKikgb3B0aW9uPS0kb3B0aW9uIDs7Ci0gIGVzYWMKLQotICBjYXNlICRvcHRpb24gaW4KLSAgLS0qPSopCi0Jb3B0YXJnPWBlY2hvICRvcHRpb24gfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AKLQk7OwotICBlc2FjCi0KLSAgY2FzZSAkb3B0aW9uIGluCi0gIC0tZGlzYWJsZS0qKQotCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tZGlzYWJsZS06ZW5hYmxlXzo7czotOl86ZydgCi0JZXZhbCAkZW5hYmxlb3B0PW5vCi0JOzsKLSAgLS1lbmFibGUtKikKLQljYXNlICIkb3B0aW9uIiBpbgotCSo9KikJOzsKLQkqKQlvcHRhcmc9eWVzIDs7Ci0JZXNhYwotCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JZXZhbCAkZW5hYmxlb3B0PSIkb3B0YXJnIgotCTs7Ci0gIC0tbm9yZWN1cnNpb24gfCAtLW5vKikKLQltbF9ub3JlY3Vyc2lvbj15ZXMKLQk7OwotICAtLXNpbGVudCB8IC0tc2lsKiB8IC0tcXVpZXQgfCAtLXEqKQotCW1sX3ZlcmJvc2U9LS1zaWxlbnQKLQk7OwotICAtLXZlcmJvc2UgfCAtLXYgfCAtLXZlcmIqKQotCW1sX3ZlcmJvc2U9LS12ZXJib3NlCi0JOzsKLSAgLS13aXRoLSopCi0JY2FzZSAiJG9wdGlvbiIgaW4KLQkqPSopCTs7Ci0JKikJb3B0YXJnPXllcyA7OwotCWVzYWMKLQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOj0uKiQ6OjtzOi06XzpnJ2AKLQlldmFsICR3aXRob3B0PSIkb3B0YXJnIgotCTs7Ci0gIC0td2l0aG91dC0qKQotCXdpdGhvcHQ9YGVjaG8gJHtvcHRpb259IHwgc2VkICdzOl4tLTo6O3M6b3V0Ojo7czotOl86ZydgCi0JZXZhbCAkd2l0aG9wdD1ubwotCTs7Ci0gIGVzYWMKLWRvbmUKLQotIyBPbmx5IGRvIHRoaXMgaWYgLS1lbmFibGUtbXVsdGlsaWIuCi1pZiBbICIke2VuYWJsZV9tdWx0aWxpYn0iID0geWVzIF07IHRoZW4KLQotIyBDb21wdXRlIHdoZXRoZXIgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHRvcCBsZXZlbCBkaXJlY3RvcnkKLSMgKGllOiBub3QgYSBtdWx0aWxpYiBzdWJkaXJlY3RvcnksIGFuZCBub3QgYSBzdWJkaXJlY3RvcnkgbGlrZSBsaWJnKysvc3JjKS4KLSMgJHt3aXRoX211bHRpc3ViZGlyfSB0ZWxscyB1cyB3ZSdyZSBpbiB0aGUgcmlnaHQgYnJhbmNoLCBidXQgd2UgY291bGQgYmUKLSMgaW4gYSBzdWJkaXIgb2YgdGhhdC4KLSMgPz8/IFRoZSBwcmV2aW91cyB2ZXJzaW9uIGNvdWxkIHZvaWQgdGhpcyB0ZXN0IGJ5IHNlcGFyYXRpbmcgdGhlIHByb2Nlc3MgaW50bwotIyB0d28gZmlsZXM6IG9uZSB0aGF0IG9ubHkgdGhlIGxpYnJhcnkncyB0b3BsZXZlbCBjb25maWd1cmUuaW4gcmFuICh0bwotIyBjb25maWd1cmUgdGhlIG11bHRpbGliIHN1YmRpcnMpLCBhbmQgYW5vdGhlciB0aGF0IGFsbCBjb25maWd1cmUuaW4ncyByYW4gdG8KLSMgdXBkYXRlIHRoZSBNYWtlZmlsZS4gIEl0IHNlZW1lZCByZWFzb25hYmxlIHRvIGNvbGxhcHNlIGFsbCBtdWx0aWxpYiBzdXBwb3J0Ci0jIGludG8gb25lIGZpbGUsIGJ1dCBpdCBkb2VzIGxlYXZlIHVzIHdpdGggaGF2aW5nIHRvIHBlcmZvcm0gdGhpcyB0ZXN0LgotbWxfdG9wbGV2ZWxfcD1ubwotaWYgWyAteiAiJHt3aXRoX211bHRpc3ViZGlyfSIgXTsgdGhlbgotICBpZiBbICIke3NyY2Rpcn0iID0gIi4iIF07IHRoZW4KLSAgICAjIFVzZSAke21sX3JlYWxzcmNkaXJ9IGluc3RlYWQgb2YgJHtzcmNkaXJ9IGhlcmUgdG8gYWNjb3VudCBmb3IgJHtzdWJkaXJ9LgotICAgICMgJHt3aXRoX3RhcmdldF9zdWJkaXJ9ID0gIi4iIGZvciBuYXRpdmUsIG90aGVyd2lzZSB0YXJnZXQgYWxpYXMuCi0gICAgaWYgWyAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gICAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLQltbF90b3BsZXZlbF9wPXllcwotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLQltbF90b3BsZXZlbF9wPXllcwotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgIyBVc2UgJHttbF9yZWFsc3JjZGlyfSBpbnN0ZWFkIG9mICR7c3JjZGlyfSBoZXJlIHRvIGFjY291bnQgZm9yICR7c3ViZGlyfS4KLSAgICBpZiBbIC1mICR7bWxfcmVhbHNyY2Rpcn0vLi4vY29uZmlnLW1sLmluIF07IHRoZW4KLSAgICAgIG1sX3RvcGxldmVsX3A9eWVzCi0gICAgZmkKLSAgZmkKLWZpCi0KLSMgSWYgdGhpcyBpcyB0aGUgbGlicmFyeSdzIHRvcCBsZXZlbCBkaXJlY3RvcnksIHNldCBtdWx0aWRpcnMgdG8gdGhlCi0jIG11bHRpbGliIHN1YmRpcnMgdG8gc3VwcG9ydC4gIFRoaXMgbGl2ZXMgYXQgdGhlIHRvcCBiZWNhdXNlIHdlIG5lZWQKLSMgYG11bHRpZGlycycgc2V0IHJpZ2h0IGF3YXkuCi0KLWlmIFsgIiR7bWxfdG9wbGV2ZWxfcH0iID0geWVzIF07IHRoZW4KLQotbXVsdGlkaXJzPQotZm9yIGkgaW4gYCR7Q0MtZ2NjfSAtLXByaW50LW11bHRpLWxpYiAyPi9kZXYvbnVsbGA7IGRvCi0gIGRpcj1gZWNobyAkaSB8IHNlZCAtZSAncy87LiokLy8nYAotICBpZiBbICIke2Rpcn0iID0gIi4iIF07IHRoZW4KLSAgICB0cnVlCi0gIGVsc2UKLSAgICBpZiBbIC16ICIke211bHRpZGlyc30iIF07IHRoZW4KLSAgICAgIG11bHRpZGlycz0iJHtkaXJ9IgotICAgIGVsc2UKLSAgICAgIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7ZGlyfSIKLSAgICBmaQotICBmaQotZG9uZQotCi0jIFRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbmZpZ3VyZWQgZm9yIHRoZSBob3N0IHRoZXkgcnVuIG9uLCBzbyB3ZSBjaGVjawotIyAkaG9zdCBoZXJlLCBub3QgJHRhcmdldC4KLQotY2FzZSAiJHtob3N0fSIgaW4KLWFyYy0qLWVsZiopCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiAhPSB4eWVzIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICpiZSopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotYXJtLSotKikKLQlpZiBbIHgiJGVuYWJsZV9mcHUiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICpmcHUqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4IiRlbmFibGVfMjZiaXQiID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSR7bXVsdGlkaXJzfQotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIke3h9IiBpbgotCSAgICAgICoyNmJpdCopIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgiJGVuYWJsZV91bmRlcnNjb3JlIiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqdW5kZXIqKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4IiRlbmFibGVfaW50ZXJ3b3JrIiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0ke211bHRpZGlyc30KLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHt4fSIgaW4KLQkgICAgICAqaW50ZXJ3b3JrKikgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfYmllbmRpYW4gPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKmxlKiApIDogOzsKLQkgICAgICAqYmUqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCTs7Ci1tNjgqLSotKikKLQlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjg4ODEgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODg4MSogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjgwMDAgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODAwMCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9tNjgwMjAgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKm02ODAyMCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLW1pcHMqLSotKikKLQlpZiBbIHgkZW5hYmxlX3NpbmdsZV9mbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc2luZ2xlKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2JpZW5kaWFuID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICplbCogKSA6IDs7Ci0JICAgICAgKmViKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3NvZnRmbG9hdCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqc29mdC1mbG9hdCogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JOzsKLXBvd2VycGMqLSotKiB8IHJzNjAwMCotKi0qKQotCWlmIFsgeCRlbmFibGVfc29mdGZsb2F0ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICpzb2Z0LWZsb2F0KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3Bvd2VyY3B1ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgIHBvd2VyIHwgKi9wb3dlciB8ICovcG93ZXIvKiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX3Bvd2VycGNjcHUgPSB4bm8gXQotCXRoZW4KLQkgIG9sZF9tdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSIKLQkgIG11bHRpZGlycz0iIgotCSAgZm9yIHggaW4gJHtvbGRfbXVsdGlkaXJzfTsgZG8KLQkgICAgY2FzZSAiJHgiIGluCi0JICAgICAgKnBvd2VycGMqICkgOiA7OwotCSAgICAgICopIG11bHRpZGlycz0iJHttdWx0aWRpcnN9ICR7eH0iIDs7Ci0JICAgIGVzYWMKLQkgIGRvbmUKLQlmaQotCWlmIFsgeCRlbmFibGVfcG93ZXJwY29zID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptY2FsbC1saW51eCogfCAqbWNhbGwtc29sYXJpcyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9iaWVuZGlhbiA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWxpdHRsZSogfCAqbWJpZyogKSA6IDs7Ci0JICAgICAgKikgbXVsdGlkaXJzPSIke211bHRpZGlyc30gJHt4fSIgOzsKLQkgICAgZXNhYwotCSAgZG9uZQotCWZpCi0JaWYgWyB4JGVuYWJsZV9zeXN2ID0geG5vIF0KLQl0aGVuCi0JICBvbGRfbXVsdGlkaXJzPSIke211bHRpZGlyc30iCi0JICBtdWx0aWRpcnM9IiIKLQkgIGZvciB4IGluICR7b2xkX211bHRpZGlyc307IGRvCi0JICAgIGNhc2UgIiR4IiBpbgotCSAgICAgICptY2FsbC1zeXN2KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQlpZiBbIHgkZW5hYmxlX2FpeCA9IHhubyBdCi0JdGhlbgotCSAgb2xkX211bHRpZGlycz0iJHttdWx0aWRpcnN9IgotCSAgbXVsdGlkaXJzPSIiCi0JICBmb3IgeCBpbiAke29sZF9tdWx0aWRpcnN9OyBkbwotCSAgICBjYXNlICIkeCIgaW4KLQkgICAgICAqbWNhbGwtYWl4KiApIDogOzsKLQkgICAgICAqKSBtdWx0aWRpcnM9IiR7bXVsdGlkaXJzfSAke3h9IiA7OwotCSAgICBlc2FjCi0JICBkb25lCi0JZmkKLQk7OwotZXNhYwotCi0jIFJlbW92ZSBleHRyYW5lb3VzIGJsYW5rcyBmcm9tIG11bHRpZGlycy4KLSMgVGVzdHMgbGlrZSBgaWYgWyAtbiAiJG11bHRpZGlycyIgXScgcmVxdWlyZSBpdC4KLW11bHRpZGlycz1gZWNobyAiJG11bHRpZGlycyIgfCBzZWQgLWUgJ3MvXlsgXVsgXSovLycgLWUgJ3MvWyBdWyBdKiQvLycgLWUgJ3MvWyBdWyBdKi8gL2cnYAotCi0jIEFkZCBjb2RlIHRvIGxpYnJhcnkncyB0b3AgbGV2ZWwgbWFrZWZpbGUgdG8gaGFuZGxlIGJ1aWxkaW5nIHRoZSBtdWx0aWxpYgotIyBzdWJkaXJzLgotCi1jYXQgPiBNdWx0aS50ZW0gPDxcRU9GCi0KLSMgRklYTUU6IFRoZXJlIHNob3VsZCBiZSBhbiBALXNpZ24gaW4gZnJvbnQgb2YgdGhlIGBpZicuCi0jIExlYXZlIG91dCB1bnRpbCB0aGlzIGlzIHRlc3RlZCBhIGJpdCBtb3JlLgotbXVsdGktZG86Ci0JaWYgWyAteiAiJChNVUxUSURJUlMpIiBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbHNlIFwKLQkgIHJvb3RwcmU9YHB3ZGAvOyBleHBvcnQgcm9vdHByZTsgXAotCSAgc3Jjcm9vdHByZT1gY2QgJChzcmNkaXIpOyBwd2RgLzsgZXhwb3J0IHNyY3Jvb3RwcmU7IFwKLQkgIGxpYj1gZWNobyAkJHtyb290cHJlfSB8IHNlZCAtZSAncyxeLiovXChbXi9dW14vXSpcKS8kJCxcMSwnYDsgXAotCSAgY29tcGlsZXI9IiQoQ0MpIjsgXAotCSAgZm9yIGkgaW4gYCQke2NvbXBpbGVyfSAtLXByaW50LW11bHRpLWxpYiAyPi9kZXYvbnVsbGA7IGRvIFwKLQkgICAgZGlyPWBlY2hvICQkaSB8IHNlZCAtZSAncy87LiokJC8vJ2A7IFwKLQkgICAgaWYgWyAiJCR7ZGlyfSIgPSAiLiIgXTsgdGhlbiBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBlbHNlIFwKLQkgICAgICBpZiBbIC1kIC4uLyQke2Rpcn0vJCR7bGlifSBdOyB0aGVuIFwKLQkJZmxhZ3M9YGVjaG8gJCRpIHwgc2VkIC1lICdzL15bXjtdKjsvLycgLWUgJ3MvQC8gLS9nJ2A7IFwKLQkJaWYgKGNkIC4uLyQke2Rpcn0vJCR7bGlifTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpIFwKLQkJCQlDRkxBR1M9IiQoQ0ZMQUdTKSAkJHtmbGFnc30iIFwKLQkJCQlDWFhGTEFHUz0iJChDWFhGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJTElCQ0ZMQUdTPSIkKExJQkNGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJTElCQ1hYRkxBR1M9IiQoTElCQ1hYRkxBR1MpICQke2ZsYWdzfSIgXAotCQkJCUxERkxBR1M9IiQoTERGTEFHUykgJCR7ZmxhZ3N9IiBcCi0JCQkJJChETykpOyB0aGVuIFwKLQkJICB0cnVlOyBcCi0JCWVsc2UgXAotCQkgIGV4aXQgMTsgXAotCQlmaTsgXAotCSAgICAgIGVsc2UgdHJ1ZTsgXAotCSAgICAgIGZpOyBcCi0JICAgIGZpOyBcCi0JICBkb25lOyBcCi0JZmkKLQotIyBGSVhNRTogVGhlcmUgc2hvdWxkIGJlIGFuIEAtc2lnbiBpbiBmcm9udCBvZiB0aGUgYGlmJy4KLSMgTGVhdmUgb3V0IHVudGlsIHRoaXMgaXMgdGVzdGVkIGEgYml0IG1vcmUuCi1tdWx0aS1jbGVhbjoKLQlpZiBbIC16ICIkKE1VTFRJRElSUykiIF07IHRoZW4gXAotCSAgdHJ1ZTsgXAotCWVsc2UgXAotCSAgbGliPWBwd2QgfCBzZWQgLWUgJ3MsXi4qL1woW14vXVteL10qXCkkJCxcMSwnYDsgXAotCSAgZm9yIGRpciBpbiBNYWtlZmlsZSAkKE1VTFRJRElSUyk7IGRvIFwKLQkgICAgaWYgWyAtZiAuLi8kJHtkaXJ9LyQke2xpYn0vTWFrZWZpbGUgXTsgdGhlbiBcCi0JICAgICAgaWYgKGNkIC4uLyQke2Rpcn0vJCR7bGlifTsgJChNQUtFKSAkKEZMQUdTX1RPX1BBU1MpICQoRE8pKTsgXAotCSAgICAgIHRoZW4gdHJ1ZTsgXAotCSAgICAgIGVsc2UgZXhpdCAxOyBcCi0JICAgICAgZmk7IFwKLQkgICAgZWxzZSB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBkb25lOyBcCi0JZmkKLUVPRgotCi1jYXQgJHtNYWtlZmlsZX0gTXVsdGkudGVtID4gTWFrZWZpbGUudGVtCi1ybSAtZiAke01ha2VmaWxlfSBNdWx0aS50ZW0KLW12IE1ha2VmaWxlLnRlbSAke01ha2VmaWxlfQotCi1maSAjICR7bWxfdG9wbGV2ZWxfcH0gPSB5ZXMKLQotaWYgWyAiJHttbF92ZXJib3NlfSIgPSAtLXZlcmJvc2UgXTsgdGhlbgotICBlY2hvICJBZGRpbmcgbXVsdGlsaWIgc3VwcG9ydCB0byBNYWtlZmlsZSBpbiAke21sX3JlYWxzcmNkaXJ9IgotICBpZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0gICAgZWNobyAibXVsdGlkaXJzPSR7bXVsdGlkaXJzfSIKLSAgZmkKLSAgZWNobyAid2l0aF9tdWx0aXN1YmRpcj0ke3dpdGhfbXVsdGlzdWJkaXJ9IgotZmkKLQotaWYgWyAiJHtzcmNkaXJ9IiA9ICIuIiBdOyB0aGVuCi0gIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF07IHRoZW4KLSAgICBtbF9zcmNkb3Rkb3Q9Ii4uLyIKLSAgZWxzZQotICAgIG1sX3NyY2RvdGRvdD0iIgotICBmaQotZWxzZQotICBtbF9zcmNkb3Rkb3Q9IiIKLWZpCi0KLWlmIFsgLXogIiR7d2l0aF9tdWx0aXN1YmRpcn0iIF07IHRoZW4KLSAgbWxfc3ViZGlyPQotICBtbF9idWlsZGRvdGRvdD0KLSAgOiAjIG1sX3NyY2RvdGRvdD0gIyBhbHJlYWR5IHNldAotZWxzZQotICBtbF9zdWJkaXI9Ii8ke3dpdGhfbXVsdGlzdWJkaXJ9IgotICAjIFRoZSAnW14vXVteL10qJyBhcHBlYXJzIHRoYXQgd2F5IHRvIHdvcmsgYXJvdW5kIGEgU3VuT1Mgc2VkIGJ1Zy4KLSAgbWxfYnVpbGRkb3Rkb3Q9YGVjaG8gJHt3aXRoX211bHRpc3ViZGlyfSB8IHNlZCAtZSAnczpbXi9dW14vXSo6Li46ZydgLwotICBpZiBbICIkc3JjZGlyIiA9ICIuIiBdOyB0aGVuCi0gICAgbWxfc3JjZG90ZG90PSR7bWxfc3JjZG90ZG90fSR7bWxfYnVpbGRkb3Rkb3R9Ci0gIGVsc2UKLSAgICA6ICMgbWxfc3JjZG90ZG90PSAjIGFscmVhZHkgc2V0Ci0gIGZpCi1maQotCi1pZiBbICIke21sX3RvcGxldmVsX3B9IiA9IHllcyBdOyB0aGVuCi0gIG1sX2RvPSckKE1BS0UpJwotICBtbF9jbGVhbj0nJChNQUtFKScKLWVsc2UKLSAgbWxfZG89dHJ1ZQotICBtbF9jbGVhbj10cnVlCi1maQotCi0jIFRPUCBpcyB1c2VkIGJ5IG5ld2xpYiBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGVsc2V3aGVyZSBmb3IgdGhpcyBwdXJwb3NlLgotIyBNVUxUSXtTUkMsQlVJTER9VE9QIGFyZSB0aGUgcHJvcGVyIG9uZXMgdG8gdXNlLiAgTVVMVElTUkNUT1AgaXMgZW1wdHkKLSMgd2hlbiBzcmNkaXIgIT0gYnVpbGRkaXIuICBNVUxUSUJVSUxEVE9QIGlzIGFsd2F5cyBzb21lIG51bWJlciBvZiAuLi8ncy4KLSMgRklYTUU6IG5ld2xpYiBuZWVkcyB0byBiZSB1cGRhdGVkIHRvIHVzZSBNVUxUSXtTUkMsQlVJTER9VE9QIHNvIHdlIGNhbgotIyBkZWxldGUgVE9QLiAgTmV3bGliIG1heSB3aXNoIHRvIGNvbnRpbnVlIHRvIHVzZSBUT1AgZm9yIGl0cyBvd24gcHVycG9zZXMKLSMgb2YgY291cnNlLgotIyBNVUxUSURJUlMgaXMgbm9uLWVtcHR5IGZvciB0aGUgY3B1IHRvcCBsZXZlbCBNYWtlZmlsZSAoZWc6IG5ld2xpYi9NYWtlZmlsZSkKLSMgYW5kIGxpc3RzIHRoZSBzdWJkaXJlY3RvcmllcyB0byByZWN1cnNlIGludG8uCi0jIE1VTFRJU1VCRElSIGlzIG5vbi1lbXB0eSBpbiBlYWNoIGNwdSBzdWJkaXJlY3RvcnkncyBNYWtlZmlsZQotIyAoZWc6IG5ld2xpYi9oODMwMGgvTWFrZWZpbGUpIGFuZCBpcyB0aGUgaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHdpdGgKLSMgYSBsZWFkaW5nICcvJy4KLSMgTVVMVElETyBpcyB1c2VkIGZvciB0YXJnZXRzIGxpa2UgYWxsLCBpbnN0YWxsLCBhbmQgY2hlY2sgd2hlcmUKLSMgJChGTEFHU19UT19QQVNTKSBhdWdtZW50ZWQgd2l0aCB0aGUgc3ViZGlyJ3MgY29tcGlsZXIgb3B0aW9uIGlzIG5lZWRlZC4KLSMgTVVMVElDTEVBTiBpcyB1c2VkIGZvciB0aGUgKmNsZWFuIHRhcmdldHMuCi0jCi0jID8/PyBJdCBpcyBwb3NzaWJsZSB0byBtZXJnZSBNVUxUSURPIGFuZCBNVUxUSUNMRUFOIGludG8gb25lLiAgVGhleSBhcmUKLSMgY3VycmVudGx5IGtlcHQgc2VwYXJhdGUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSAqY2xlYW4gdGFyZ2V0cyB0byByZXF1aXJlCi0jIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGNvbXBpbGVyICh3aGljaCBNVUxUSURPIGN1cnJlbnRseSByZXF1aXJlcykgYW5kCi0jIHRoZXJlZm9yZSB3ZSdkIGhhdmUgdG8gcmVjb3JkIHRoZSBkaXJlY3Rvcnkgb3B0aW9ucyBhcyB3ZWxsIGFzIG5hbWVzCi0jIChjdXJyZW50bHkgd2UganVzdCByZWNvcmQgdGhlIG5hbWVzIGFuZCB1c2UgLS1wcmludC1tdWx0aS1saWIgdG8gZ2V0IHRoZQotIyBvcHRpb25zKS4KLQotc2VkIC1lICJzOl5UT1BbIAldKj1bIAldKlwoWy4vXSpcKVsgCV0qJDpUT1AgPSAke21sX2J1aWxkZG90ZG90fVwxOiIgXAotICAgIC1lICJzOl5NVUxUSVNSQ1RPUFsgCV0qPS4qJDpNVUxUSVNSQ1RPUCA9ICR7bWxfc3JjZG90ZG90fToiIFwKLSAgICAtZSAiczpeTVVMVElCVUlMRFRPUFsgCV0qPS4qJDpNVUxUSUJVSUxEVE9QID0gJHttbF9idWlsZGRvdGRvdH06IiBcCi0gICAgLWUgInM6Xk1VTFRJRElSU1sgCV0qPS4qJDpNVUxUSURJUlMgPSAke211bHRpZGlyc306IiBcCi0gICAgLWUgInM6Xk1VTFRJU1VCRElSWyAJXSo9LiokOk1VTFRJU1VCRElSID0gJHttbF9zdWJkaXJ9OiIgXAotICAgIC1lICJzOl5NVUxUSURPWyAJXSo9LiokOk1VTFRJRE8gPSAkbWxfZG86IiBcCi0gICAgLWUgInM6Xk1VTFRJQ0xFQU5bIAldKj0uKiQ6TVVMVElDTEVBTiA9ICRtbF9jbGVhbjoiIFwKLQkke01ha2VmaWxlfSA+IE1ha2VmaWxlLnRlbQotcm0gLWYgJHtNYWtlZmlsZX0KLW12IE1ha2VmaWxlLnRlbSAke01ha2VmaWxlfQotCi0jIElmIHRoaXMgaXMgdGhlIGxpYnJhcnkncyB0b3AgbGV2ZWwsIGNvbmZpZ3VyZSBlYWNoIG11bHRpbGliIHN1YmRpci4KLSMgVGhpcyBpcyBkb25lIGF0IHRoZSBlbmQgYmVjYXVzZSB0aGlzIGlzIHRoZSBsb29wIHRoYXQgcnVucyBjb25maWd1cmUKLSMgaW4gZWFjaCBtdWx0aWxpYiBzdWJkaXIgYW5kIGl0IHNlZW1lZCByZWFzb25hYmxlIHRvIGZpbmlzaCB1cGRhdGluZyB0aGUKLSMgTWFrZWZpbGUgYmVmb3JlIGdvaW5nIG9uIHRvIGNvbmZpZ3VyZSB0aGUgc3ViZGlycy4KLQotaWYgWyAiJHttbF90b3BsZXZlbF9wfSIgPSB5ZXMgXTsgdGhlbgotCi0jIFdlIG11c3QgZnJlc2hseSBjb25maWd1cmUgZWFjaCBzdWJkaXJlY3RvcnkuICBUaGlzIGJpdCBvZiBjb2RlIGlzCi0jIGFjdHVhbGx5IHBhcnRpYWxseSBzdG9sZW4gZnJvbSB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0LiAgRklYTUUuCi0KLWlmIFsgLW4gIiR7bXVsdGlkaXJzfSIgXSAmJiBbIC16ICIke21sX25vcmVjdXJzaW9ufSIgXTsgdGhlbgotCi0gIGlmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KLSAgICBlY2hvICJSdW5uaW5nIGNvbmZpZ3VyZSBpbiBtdWx0aWxpYiBzdWJkaXJzICR7bXVsdGlkaXJzfSIKLSAgICBlY2hvICJwd2Q6IGBwd2RgIgotICBmaQotCi0gIG1sX29yaWdkaXI9YHB3ZGAKLSAgbWxfbGliZGlyPWBlY2hvICRtbF9vcmlnZGlyIHwgc2VkIC1lICdzLF4uKi8sLCdgCi0gICMgY2QgdG8gdG9wLWxldmVsLWJ1aWxkLWRpci8ke3dpdGhfdGFyZ2V0X3N1YmRpcn0KLSAgY2QgLi4KLQotICBmb3IgbWxfZGlyIGluICR7bXVsdGlkaXJzfTsgZG8KLQotICAgIGlmIFsgIiR7bWxfdmVyYm9zZX0iID0gLS12ZXJib3NlIF07IHRoZW4KLSAgICAgIGVjaG8gIlJ1bm5pbmcgY29uZmlndXJlIGluIG11bHRpbGliIHN1YmRpciAke21sX2Rpcn0iCi0gICAgICBlY2hvICJwd2Q6IGBwd2RgIgotICAgIGZpCi0KLSAgICBpZiBbIC1kICR7bWxfZGlyfSBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJHttbF9kaXJ9OyBmaQotICAgIGlmIFsgLWQgJHttbF9kaXJ9LyR7bWxfbGliZGlyfSBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJHttbF9kaXJ9LyR7bWxfbGliZGlyfTsgZmkKLQotICAgICMgRWc6IGlmICR7bWxfZGlyfSA9IG02ODAwMC9tNjg4ODEsIGRvdGRvdCA9IC4uLy4uLwotICAgIGRvdGRvdD0uLi9gZWNobyAke21sX2Rpcn0gfCBzZWQgLWUgJ3N8W14vXXx8ZycgLWUgJ3N8L3wuLi98ZydgCi0KLSAgICBjYXNlICR7c3JjZGlyfSBpbgotICAgICIuIikKLSAgICAgIGVjaG8gQnVpbGRpbmcgc3ltbGluayB0cmVlIGluIGBwd2RgLyR7bWxfZGlyfS8ke21sX2xpYmRpcn0KLSAgICAgIGlmIFsgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iIF07IHRoZW4KLQltbF91bnN1YmRpcj0iLi4vIgotICAgICAgZWxzZQotCW1sX3Vuc3ViZGlyPSIiCi0gICAgICBmaQotICAgICAgKGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn07Ci0gICAgICAgLi4vJHtkb3Rkb3R9JHttbF91bnN1YmRpcn1zeW1saW5rLXRyZWUgLi4vJHtkb3Rkb3R9JHttbF91bnN1YmRpcn0ke21sX2xpYmRpcn0gIiIpCi0gICAgICBpZiBbIC1mICR7bWxfZGlyfS8ke21sX2xpYmRpcn0vTWFrZWZpbGUgXTsgdGhlbgotCWlmIFsgeCIke01BS0V9IiA9IHggXTsgdGhlbgotCSAgKGNkICR7bWxfZGlyfS8ke21sX2xpYmRpcn07IG1ha2UgZGlzdGNsZWFuKQotCWVsc2UKLQkgIChjZCAke21sX2Rpcn0vJHttbF9saWJkaXJ9OyAke01BS0V9IGRpc3RjbGVhbikKLQlmaQotICAgICAgZmkKLSAgICAgIG1sX25ld3NyY2Rpcj0iLiIKLSAgICAgIG1sX3NyY2Rpcm9wdGlvbj0KLSAgICAgIG11bHRpc3JjdG9wPSR7ZG90ZG90fQotICAgICAgOzsKLSAgICAqKQotICAgICAgY2FzZSAiJHtzcmNkaXJ9IiBpbgotICAgICAgLyopICMgYWJzb2x1dGUgcGF0aAotICAgICAgICBtbF9uZXdzcmNkaXI9JHtzcmNkaXJ9Ci0gICAgICAgIDs7Ci0gICAgICAqKSAjIG90aGVyd2lzZSByZWxhdGl2ZQotICAgICAgICBtbF9uZXdzcmNkaXI9JHtkb3Rkb3R9JHtzcmNkaXJ9Ci0gICAgICAgIDs7Ci0gICAgICBlc2FjCi0gICAgICBtbF9zcmNkaXJvcHRpb249Ii1zcmNkaXI9JHttbF9uZXdzcmNkaXJ9IgotICAgICAgbXVsdGlzcmN0b3A9Ci0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGNhc2UgIiR7cHJvZ25hbWV9IiBpbgotICAgIC8qKSAgICAgbWxfcmVjcHJvZz0ke3Byb2duYW1lfSA7OwotICAgICopICAgICAgbWxfcmVjcHJvZz0ke2RvdGRvdH0ke3Byb2duYW1lfSA7OwotICAgIGVzYWMKLQotICAgICMgRklYTUU6IFBPUERJUj0ke1BXRD1gcHdkYH0gZG9lc24ndCB3b3JrIGhlcmUuCi0gICAgTUxfUE9QRElSPWBwd2RgCi0gICAgY2QgJHttbF9kaXJ9LyR7bWxfbGliZGlyfQotCi0gICAgaWYgWyAtZiAke21sX25ld3NyY2Rpcn0vY29uZmlndXJlIF07IHRoZW4KLSAgICAgIG1sX3JlY3Byb2c9JHttbF9uZXdzcmNkaXJ9L2NvbmZpZ3VyZQotICAgIGZpCi0gICAgaWYgZXZhbCAke21sX2NvbmZpZ19zaGVsbH0gJHttbF9yZWNwcm9nfSBcCi0JLS13aXRoLW11bHRpc3ViZGlyPSR7bWxfZGlyfSAtLXdpdGgtbXVsdGlzcmN0b3A9JHttdWx0aXNyY3RvcH0gXAotCSR7bWxfYXJndW1lbnRzfSAke21sX3NyY2Rpcm9wdGlvbn0gOyB0aGVuCi0gICAgICB0cnVlCi0gICAgZWxzZQotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGNkICR7TUxfUE9QRElSfQotCi0gIGRvbmUKLQotICBjZCAke21sX29yaWdkaXJ9Ci1maQotCi1maSAjICR7bWxfdG9wbGV2ZWxfcH0gPSB5ZXMKLWZpICMgJHtlbmFibGVfbXVsdGlsaWJ9ID0geWVzCmRpZmYgLS1naXQgYS9jb25maWcuZ3Vlc3MgYi9jb25maWcuZ3Vlc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg4NWY2NjEuLjAwMDAwMDAKLS0tIGEvY29uZmlnLmd1ZXNzCisrKyAvZGV2L251bGwKQEAgLTEsMTAwOCArMCwwIEBACi0jISAvYmluL3NoCi0jIEF0dGVtcHQgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBXcml0dGVuIGJ5IFBlciBCb3RobmVyIDxib3RobmVyQGN5Z251cy5jb20+LgotIyBUaGUgbWFzdGVyIHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIGF0IHRoZSBGU0YgaW4gL2hvbWUvZ2QvZ251L2xpYi4KLSMKLSMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bwotIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKLSMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCi0jCi0jIFRoZSBwbGFuIGlzIHRoYXQgdGhpcyBjYW4gYmUgY2FsbGVkIGJ5IGNvbmZpZ3VyZSBzY3JpcHRzIGlmIHlvdQotIyBkb24ndCBzcGVjaWZ5IGFuIGV4cGxpY2l0IHN5c3RlbSB0eXBlIChob3N0L3RhcmdldCBuYW1lKS4KLSMKLSMgT25seSBhIGZldyBzeXN0ZW1zIGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIGxpc3Q7IHBsZWFzZSBhZGQgb3RoZXJzCi0jIChidXQgdHJ5IHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBjbGVhbikuCi0jCi0KLSMgVGhpcyBpcyBuZWVkZWQgdG8gZmluZCB1bmFtZSBvbiBhIFB5cmFtaWQgT1N4IHdoZW4gcnVuIGluIHRoZSBCU0QgdW5pdmVyc2UuCi0jIChnaGF6aUBub2MucnV0Z2Vycy5lZHUgOC8yNC85NC4pCi1pZiAodGVzdCAtZiAvLmF0dGJpbi91bmFtZSkgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgotCVBBVEg9JFBBVEg6Ly5hdHRiaW4gOyBleHBvcnQgUEFUSAotZmkKLQotVU5BTUVfTUFDSElORT1gKHVuYW1lIC1tKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfTUFDSElORT11bmtub3duCi1VTkFNRV9SRUxFQVNFPWAodW5hbWUgLXIpIDI+L2Rldi9udWxsYCB8fCBVTkFNRV9SRUxFQVNFPXVua25vd24KLVVOQU1FX1NZU1RFTT1gKHVuYW1lIC1zKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfU1lTVEVNPXVua25vd24KLVVOQU1FX1ZFUlNJT049YCh1bmFtZSAtdikgMj4vZGV2L251bGxgIHx8IFVOQU1FX1ZFUlNJT049dW5rbm93bgotCi10cmFwICdybSAtZiBkdW1teS5jIGR1bW15Lm8gZHVtbXk7IGV4aXQgMScgMSAyIDE1Ci0KLSMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KLQotY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgotICAgIGFscGhhOk9TRjE6KjoqKQotCWlmIHRlc3QgJFVOQU1FX1JFTEVBU0UgPSAiVjQuMCI7IHRoZW4KLQkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKLQlmaQotCSMgQSBWbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCB2ZXJzaW9uLgotCSMgQSBUbi5uIHZlcnNpb24gaXMgYSByZWxlYXNlZCBmaWVsZCB0ZXN0IHZlcnNpb24uCi0JIyBBIFhuLm4gdmVyc2lvbiBpcyBhbiB1bnJlbGVhc2VkIGV4cGVyaW1lbnRhbCBiYXNlbGV2ZWwuCi0JIyAxLjIgdXNlcyAiMS4yIiBmb3IgdW5hbWUgLXIuCi0JY2F0IDw8RU9GID5kdW1teS5zCi0JLmdsb2JsIG1haW4KLQkuZW50IG1haW4KLW1haW46Ci0JLmZyYW1lIFwkMzAsMCxcJDI2LDAKLQkucHJvbG9ndWUgMAotCS5sb25nIDB4NDdlMDNkODAgIyBpbXBsdmVyICQwCi0JbGRhIFwkMiwyNTkKLQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgJDIsJDEKLQlzcmwgXCQxLDgsXCQyCi0Jc2xsIFwkMiwyLFwkMgotCXNsbCBcJDAsMyxcJDAKLQlhZGRsIFwkMSxcJDAsXCQwCi0JYWRkbCBcJDIsXCQwLFwkMAotCXJldCBcJDMxLChcJDI2KSwxCi0JLmVuZCBtYWluCi1FT0YKLQkke0NDLWNjfSBkdW1teS5zIC1vIGR1bW15IDI+L2Rldi9udWxsCi0JaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJLi9kdW1teQotCQljYXNlICIkPyIgaW4KLQkJCTcpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGEiCi0JCQkJOzsKLQkJCTE1KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY1IgotCQkJCTs7Ci0JCQkxNCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NTYiCi0JCQkJOzsKLQkJCTEwKQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTYiCi0JCQkJOzsKLQkJCTE2KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IgotCQkJCTs7Ci0JCWVzYWMKLQlmaQotCXJtIC1mIGR1bW15LnMgZHVtbXkKLQllY2hvICR7VU5BTUVfTUFDSElORX0tZGVjLW9zZmBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvXltWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAotCWV4aXQgMCA7OwotICAgIDIxMDY0OldpbmRvd3NfTlQ6NTA6MykKLQllY2hvIGFscGhhLWRlYy13aW5udDMuNQotCWV4aXQgMCA7OwotICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQotCWVjaG8gbTY4ay1jYm0tc3lzdjQKLQlleGl0IDA7OwotICAgIGFtaWdhOk5ldEJTRDoqOiopCi0gICAgICBlY2hvIG02OGstY2JtLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgIGV4aXQgMCA7OwotICAgIGFtaWdhOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpbQWFdbWlnYVtPb11bU3NdOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1hbWlnYW9zCi0JZXhpdCAwIDs7Ci0gICAgYXJjNjQ6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzNjRlbC11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXJjOk9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBoa21pcHM6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBwbWF4Ok9wZW5CU0Q6KjoqKQotCWVjaG8gbWlwc2VsLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzZ2k6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICB3Z3Jpc2M6T3BlbkJTRDoqOiopCi0JZWNobyBtaXBzZWwtdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKLQllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwOzsKLSAgICBhcm0zMjpOZXRCU0Q6KjoqKQotCWVjaG8gYXJtLXVua25vd24tbmV0YnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgU1IyPzAxOkhJLVVYL01QUDoqOiopCi0JZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAotCWV4aXQgMDs7Ci0gICAgUHlyYW1pZCo6T1N4KjoqOip8TUlTKjpPU3gqOio6KikKLQkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgotCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KLQkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKLQllbHNlCi0JCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgTklMRToqOio6ZGNvc3gpCi0JZWNobyBweXJhbWlkLXB5cmFtaWQtc3ZyNAotCWV4aXQgMCA7OwotICAgIHN1bjRIOlN1bk9TOjUuKjoqKQotCWVjaG8gc3BhcmMtaGFsLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKLQllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIGk4NnBjOlN1bk9TOjUuKjoqKQotCWVjaG8gaTM4Ni1wYy1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjQqOlN1bk9TOjYqOiopCi0JIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKLQkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAotCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCi0JZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKLQlleGl0IDAgOzsKLSAgICBzdW40KjpTdW5PUzoqOiopCi0JY2FzZSAiYC91c3IvYmluL2FyY2ggLWtgIiBpbgotCSAgICBTZXJpZXMqfFM0KikKLQkJVU5BTUVfUkVMRUFTRT1gdW5hbWUgLXZgCi0JCTs7Ci0JZXNhYwotCSMgSmFwYW5lc2UgTGFuZ3VhZ2UgdmVyc2lvbnMgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGxpa2UgYDQuMS4zLUpMJy4KLQllY2hvIHNwYXJjLXN1bi1zdW5vc2BlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzLy0vXy8nYAotCWV4aXQgMCA7OwotICAgIHN1bjMqOlN1bk9TOio6KikKLQllY2hvIG02OGstc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bio6Kjo0LjJCU0Q6KikKLQlVTkFNRV9SRUxFQVNFPWAoaGVhZCAtMSAvZXRjL21vdGQgfCBhd2sgJ3twcmludCBzdWJzdHIoJDUsMSwzKX0nKSAyPi9kZXYvbnVsbGAKLQl0ZXN0ICJ4JHtVTkFNRV9SRUxFQVNFfSIgPSAieCIgJiYgVU5BTUVfUkVMRUFTRT0zCi0JY2FzZSAiYC9iaW4vYXJjaGAiIGluCi0JICAgIHN1bjMpCi0JCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JCTs7Ci0JICAgIHN1bjQpCi0JCWVjaG8gc3BhcmMtc3VuLXN1bm9zJHtVTkFNRV9SRUxFQVNFfQotCQk7OwotCWVzYWMKLQlleGl0IDAgOzsKLSAgICBhdXNocDpTdW5PUzoqOiopCi0JZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgYXRhcmkqOk5ldEJTRDoqOiopCi0JZWNobyBtNjhrLWF0YXJpLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBhdGFyaSo6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBzdW4zKjpOZXRCU0Q6KjoqKQotCWVjaG8gbTY4ay1zdW4tbmV0YnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHN1bjMqOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWFjNjhrOk5ldEJTRDoqOiopCi0JZWNobyBtNjhrLWFwcGxlLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtYWM2OGs6T3BlbkJTRDoqOiopCi0JZWNobyBtNjhrLXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtdm1lNjhrOk9wZW5CU0Q6KjoqKQotCWVjaG8gbTY4ay11bmtub3duLW9wZW5ic2Qke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbXZtZTg4azpPcGVuQlNEOio6KikKLQllY2hvIG04OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHBvd2VycGM6bWFjaHRlbjoqOiopCi0JZWNobyBwb3dlcnBjLWFwcGxlLW1hY2h0ZW4ke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgUklTQyo6TWFjaDoqOiopCi0JZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMwotCWV4aXQgMCA7OwotICAgIFJJU0MqOlVMVFJJWDoqOiopCi0JZWNobyBtaXBzLWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgVkFYKjpVTFRSSVgqOio6KikKLQllY2hvIHZheC1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIDIwMjA6Q0xJWDoqOiopCi0JZWNobyBjbGlwcGVyLWludGVyZ3JhcGgtY2xpeCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBtaXBzOio6KjpVTUlQUyB8IG1pcHM6KjoqOlJJU0NvcykKLQlzZWQgJ3MvXgkvLycgPDwgRU9GID5kdW1teS5jCi0JaW50IG1haW4gKGFyZ2MsIGFyZ3YpIGludCBhcmdjOyBjaGFyICoqYXJndjsgewotCSNpZiBkZWZpbmVkIChob3N0X21pcHMpICYmIGRlZmluZWQgKE1JUFNFQikKLQkjaWYgZGVmaW5lZCAoU1lTVFlQRV9TWVNWKQotCSAgcHJpbnRmICgibWlwcy1taXBzLXJpc2NvcyVzc3lzdlxuIiwgYXJndlsxXSk7IGV4aXQgKDApOwotCSNlbmRpZgotCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NWUjQpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzdnI0XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7Ci0JI2VuZGlmCi0JI2lmIGRlZmluZWQgKFNZU1RZUEVfQlNENDMpIHx8IGRlZmluZWQoU1lTVFlQRV9CU0QpCi0JICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNic2RcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKLQkjZW5kaWYKLQkjZW5kaWYKLQkgIGV4aXQgKC0xKTsKLQl9Ci1FT0YKLQkke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IFwKLQkgICYmIC4vZHVtbXkgYGVjaG8gIiR7VU5BTUVfUkVMRUFTRX0iIHwgc2VkIC1uICdzL1woWzAtOV0qXCkuKi9cMS9wJ2AgXAotCSAgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQlybSAtZiBkdW1teS5jIGR1bW15Ci0JZWNobyBtaXBzLW1pcHMtcmlzY29zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIE5pZ2h0X0hhd2s6UG93ZXJfVU5JWDoqOiopCi0JZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcnVuaXgKLQlleGl0IDAgOzsKLSAgICBtODhrOkNYL1VYOjcqOiopCi0JZWNobyBtODhrLWhhcnJpcy1jeHV4NwotCWV4aXQgMCA7OwotICAgIG04OGs6Kjo0KjpSNCopCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgbTg4azoqOjMqOlIzKikKLQllY2hvIG04OGstbW90b3JvbGEtc3lzdjMKLQlleGl0IDAgOzsKLSAgICBBVmlpT046ZGd1eDoqOiopCi0gICAgICAgICMgREcvVVggcmV0dXJucyBBVmlpT04gZm9yIGFsbCBhcmNoaXRlY3R1cmVzCi0gICAgICAgIFVOQU1FX1BST0NFU1NPUj1gL3Vzci9iaW4vdW5hbWUgLXBgCi0gICAgICAgIGlmIFsgJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMDAgLW8gJFVOQU1FX1BST0NFU1NPUiA9IG1jODgxMTAgXSA7IHRoZW4KLQlpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBcCi0JICAgICAtbyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0gOyB0aGVuCi0JCWVjaG8gbTg4ay1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkJZWNobyBtODhrLWRnLWRndXhiY3Mke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLSAgICAgICAgZWxzZSBlY2hvIGk1ODYtZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICAgZmkKLSAJZXhpdCAwIDs7Ci0gICAgTTg4KjpEb2xwaGluT1M6KjoqKQkjIERvbHBoaW5PUyAoU1ZSMykKLQllY2hvIG04OGstZG9scGhpbi1zeXN2MwotCWV4aXQgMCA7OwotICAgIE04OCo6KjpSMyo6KikKLQkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCi0JZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCi0JZXhpdCAwIDs7Ci0gICAgWEQ4OCo6KjoqOiopICMgVGVrdHJvbml4IFhEODggc3lzdGVtIHJ1bm5pbmcgVVRla1YgKFNWUjMpCi0JZWNobyBtODhrLXRla3Ryb25peC1zeXN2MwotCWV4aXQgMCA7OwotICAgIFRlazQzWzAtOV1bMC05XTpVVGVrOio6KikgIyBUZWt0cm9uaXggNDMwMCBzeXN0ZW0gcnVubmluZyBVVGVrIChCU0QpCi0JZWNobyBtNjhrLXRla3Ryb25peC1ic2QKLQlleGl0IDAgOzsKLSAgICAqOklSSVgqOio6KikKLQllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCi0JZXhpdCAwIDs7Ci0gICAgPz8/Pz8/Pz86QUlYPzpbMTJdLjE6MikgICAjIEFJWCAyLjIuMSBvciBBSVggMi4xLjEgaXMgUlQvUEMgQUlYLgotCWVjaG8gcm9tcC1pYm0tYWl4ICAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAotCWV4aXQgMCA7OyAgICAgICAgICAgICAgIyBOb3RlIHRoYXQ6IGVjaG8gIidgdW5hbWUgLXNgJyIgZ2l2ZXMgJ0FJWCAnCi0gICAgaT84NjpBSVg6KjoqKQotCWVjaG8gaTM4Ni1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6MjozKQotCWlmIGdyZXAgYm9zMzI1IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgotCQlzZWQgJ3MvXgkJLy8nIDw8IEVPRiA+ZHVtbXkuYwotCQkjaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgotCi0JCW1haW4oKQotCQkJewotCQkJaWYgKCFfX3Bvd2VyX3BjKCkpCi0JCQkJZXhpdCgxKTsKLQkJCXB1dHMoInBvd2VycGMtaWJtLWFpeDMuMi41Iik7Ci0JCQlleGl0KDApOwotCQkJfQotRU9GCi0JCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCQlybSAtZiBkdW1teS5jIGR1bW15Ci0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNQotCWVsaWYgZ3JlcCBib3MzMjQgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCWVjaG8gcnM2MDAwLWlibS1haXgzLjIuNAotCWVsc2UKLQkJZWNobyByczYwMDAtaWJtLWFpeDMuMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgKjpBSVg6Kjo0KQotCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVIbCBwcm9jMCB8IGdyZXAgUE9XRVIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JCUlCTV9BUkNIPXJzNjAwMAotCWVsc2UKLQkJSUJNX0FSQ0g9cG93ZXJwYwotCWZpCi0JaWYgWyAteCAvdXNyL2Jpbi9vc2xldmVsIF0gOyB0aGVuCi0JCUlCTV9SRVY9YC91c3IvYmluL29zbGV2ZWxgCi0JZWxzZQotCQlJQk1fUkVWPTQuJHtVTkFNRV9SRUxFQVNFfQotCWZpCi0JZWNobyAke0lCTV9BUkNIfS1pYm0tYWl4JHtJQk1fUkVWfQotCWV4aXQgMCA7OwotICAgICo6QUlYOio6KikKLQllY2hvIHJzNjAwMC1pYm0tYWl4Ci0JZXhpdCAwIDs7Ci0gICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCi0JZWNobyByb21wLWlibS1ic2Q0LjQKLQlleGl0IDAgOzsKLSAgICBpYm1ydDoqQlNEOip8cm9tcC1pYm06QlNEOiopICAgICAgICAgICAgIyBjb3ZlcnMgUlQvUEMgTmV0QlNEIGFuZAotCWVjaG8gcm9tcC1pYm0tYnNkJHtVTkFNRV9SRUxFQVNFfSAgICMgNC4zIHdpdGggdW5hbWUgYWRkZWQgdG8KLQlleGl0IDAgOzsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlcG9ydDogcm9tcC1pYm0gQlNEIDQuMwotICAgICo6Qk9TWDoqOiopCi0JZWNobyByczYwMDAtYnVsbC1ib3N4Ci0JZXhpdCAwIDs7Ci0gICAgRFBYLzI/MDA6Qi5PLlMuOio6KikKLQllY2hvIG02OGstYnVsbC1zeXN2MwotCWV4aXQgMCA7OwotICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKLQllY2hvIG02OGstaHAtYnNkCi0JZXhpdCAwIDs7Ci0gICAgaHAzMDA6NC40QlNEOio6KiB8IDkwMDAvWzM0XT8/OjQuM2JzZDoyLio6KikKLQllY2hvIG02OGstaHAtYnNkNC40Ci0JZXhpdCAwIDs7Ci0gICAgKjk/Pyo6TVBFL2lYOio6KikKLQllY2hvIGhwcGExLjAtaHAtbXBlaXgKLQlleGl0IDAgOzsKLSAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCi0JY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KLQkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7Ci0JICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKLQkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0gKQotCi0gICAgICAgICAgICAgIHNlZCAncy9eICAgICAgICAgICAgICAvLycgPDwgRU9GID5kdW1teS5jCi0gICAgICAgICAgICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KLSAgICAgICAgICAgICAgI2luY2x1ZGUgPHVuaXN0ZC5oPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgaW50IG1haW4gKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0gICAgICAgICAgICAgICAgICBsb25nIGJpdHMgPSBzeXNjb25mKF9TQ19LRVJORUxfQklUUyk7Ci0gICAgICAgICAgICAgICNlbmRpZiAKLSAgICAgICAgICAgICAgICAgIGxvbmcgY3B1ICA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgc3dpdGNoIChjcHUpIAotICAgICAgICAgICAgICAJewotICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7Ci0gICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMSIpOyBicmVhazsKLSAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MyXzA6IAotICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCi0gICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKSAKLSAgICAgICAgICAgICAgCQl7Ci0gICAgICAgICAgICAgIAkJY2FzZSA2NDogcHV0cyAoImhwcGEyLjB3Iik7IGJyZWFrOwotICAgICAgICAgICAgICAJCWNhc2UgMzI6IHB1dHMgKCJocHBhMi4wbiIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQlkZWZhdWx0OiBwdXRzICgiaHBwYTIuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCQl9IGJyZWFrOwotICAgICAgICAgICAgICAjZWxzZSAgLyogIWRlZmluZWQoX1NDX0tFUk5FTF9CSVRTKSAqLwotICAgICAgICAgICAgICAJICAgIHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOwotICAgICAgICAgICAgICAjZW5kaWYgCi0gICAgICAgICAgICAgIAlkZWZhdWx0OiBwdXRzICgiaHBwYTEuMCIpOyBicmVhazsKLSAgICAgICAgICAgICAgCX0KLSAgICAgICAgICAgICAgICAgIGV4aXQgKDApOwotICAgICAgICAgICAgICB9Ci1FT0YKLQkoJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCApICYmIEhQX0FSQ0g9YC4vZHVtbXlgCi0Jcm0gLWYgZHVtbXkuYyBkdW1teQotCWVzYWMKLQlIUFVYX1JFVj1gZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi5bMEJdKi8vJ2AKLQllY2hvICR7SFBfQVJDSH0taHAtaHB1eCR7SFBVWF9SRVZ9Ci0JZXhpdCAwIDs7Ci0gICAgMzA1MCo6SEktVVg6KjoqKQotCXNlZCAncy9eCS8vJyA8PCBFT0YgPmR1bW15LmMKLQkjaW5jbHVkZSA8dW5pc3RkLmg+Ci0JaW50Ci0JbWFpbiAoKQotCXsKLQkgIGxvbmcgY3B1ID0gc3lzY29uZiAoX1NDX0NQVV9WRVJTSU9OKTsKLQkgIC8qIFRoZSBvcmRlciBtYXR0ZXJzLCBiZWNhdXNlIENQVV9JU19IUF9NQzY4SyBlcnJvbmVvdXNseSByZXR1cm5zCi0JICAgICB0cnVlIGZvciBDUFVfUEFfUklTQzFfMC4gIENQVV9JU19QQV9SSVNDIHJldHVybnMgY29ycmVjdAotCSAgICAgcmVzdWx0cywgaG93ZXZlci4gICovCi0JICBpZiAoQ1BVX0lTX1BBX1JJU0MgKGNwdSkpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGNwdSkKLQkJewotCQkgIGNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJICBjYXNlIENQVV9QQV9SSVNDMV8xOiBwdXRzICgiaHBwYTEuMS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7Ci0JCSAgY2FzZSBDUFVfUEFfUklTQzJfMDogcHV0cyAoImhwcGEyLjAtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOwotCQkgIGRlZmF1bHQ6IHB1dHMgKCJocHBhLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChDUFVfSVNfSFBfTUM2OEsgKGNwdSkpCi0JICAgIHB1dHMgKCJtNjhrLWhpdGFjaGktaGl1eHdlMiIpOwotCSAgZWxzZSBwdXRzICgidW5rbm93bi1oaXRhY2hpLWhpdXh3ZTIiKTsKLQkgIGV4aXQgKDApOwotCX0KLUVPRgotCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgJiYgLi9kdW1teSAmJiBybSBkdW1teS5jIGR1bW15ICYmIGV4aXQgMAotCXJtIC1mIGR1bW15LmMgZHVtbXkKLQllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCi0JZXhpdCAwIDs7Ci0gICAgOTAwMC83Pz86NC4zYnNkOio6KiB8IDkwMDAvOD9bNzldOjQuM2JzZDoqOiogKQotCWVjaG8gaHBwYTEuMS1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICA5MDAwLzg/Pzo0LjNic2Q6KjoqKQotCWVjaG8gaHBwYTEuMC1ocC1ic2QKLQlleGl0IDAgOzsKLSAgICBocDc/PzpPU0YxOio6KiB8IGhwOD9bNzldOk9TRjE6KjoqICkKLQllY2hvIGhwcGExLjEtaHAtb3NmCi0JZXhpdCAwIDs7Ci0gICAgaHA4Pz86T1NGMToqOiopCi0JZWNobyBocHBhMS4wLWhwLW9zZgotCWV4aXQgMCA7OwotICAgIGk/ODY6T1NGMToqOiopCi0JaWYgWyAteCAvdXNyL3NiaW4vc3lzdmVyc2lvbiBdIDsgdGhlbgotCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxbWsKLQllbHNlCi0JICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW9zZjEKLQlmaQotCWV4aXQgMCA7OwotICAgIHBhcmlzYyo6TGl0ZXMqOio6KikKLQllY2hvIGhwcGExLjEtaHAtbGl0ZXMKLQlleGl0IDAgOzsKLSAgICBocHBhKjpPcGVuQlNEOio6KikKLQllY2hvIGhwcGEtdW5rbm93bi1vcGVuYnNkCi0JZXhpdCAwIDs7Ci0gICAgQzEqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMSo6KikKLQllY2hvIGMxLWNvbnZleC1ic2QKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMzNCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzNCo6KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEMzOCo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMzOCo6KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCi0JZWNobyBjNC1jb252ZXgtYnNkCi0gICAgICAgIGV4aXQgMCA7OwotICAgIENSQVkqWC1NUDoqOio6KikKLQllY2hvIHhtcC1jcmF5LXVuaWNvcwotICAgICAgICBleGl0IDAgOzsKLSAgICBDUkFZKlktTVA6KjoqOiopCi0JZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpbQS1aXTkwOio6KjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAotCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAotCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovCi0JZXhpdCAwIDs7Ci0gICAgQ1JBWSpUUzoqOio6KikKLQllY2hvIHQ5MC1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBDUkFZLTI6KjoqOiopCi0JZWNobyBjcmF5Mi1jcmF5LXVuaWNvcwotICAgICAgICBleGl0IDAgOzsKLSAgICBGMzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQotICAgICAgICBGVUpJVFNVX1NZUz1gdW5hbWUgLXAgfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgfCBzZWQgLWUgJ3MvXC8vLydgCi0gICAgICAgIEZVSklUU1VfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgLWUgJ3MvIC9fLydgCi0gICAgICAgIGVjaG8gImYzMDAtZnVqaXRzdS0ke0ZVSklUU1VfU1lTfSR7RlVKSVRTVV9SRUx9IgotICAgICAgICBleGl0IDAgOzsKLSAgICBGMzAxOlVOSVhfU3lzdGVtX1Y6KjoqKQotICAgICAgIGVjaG8gZjMwMS1mdWppdHN1LXV4cHZgZWNobyAkVU5BTUVfUkVMRUFTRSB8IHNlZCAncy8gLiovLydgCi0gICAgICAgZXhpdCAwIDs7Ci0gICAgaHAzWzAtOV1bMDVdOk5ldEJTRDoqOiopCi0JZWNobyBtNjhrLWhwLW5ldGJzZCR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBocDMwMDpPcGVuQlNEOio6KikKLQllY2hvIG02OGstdW5rbm93bi1vcGVuYnNkJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIGk/ODY6QlNELzM4NjoqOiogfCAqOkJTRC9PUzoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWJzZGkke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgKjpGcmVlQlNEOio6KikKLQlpZiB0ZXN0IC14IC91c3IvYmluL29iamZvcm1hdDsgdGhlbgotCSAgICBpZiB0ZXN0ICJlbGYiID0gImAvdXNyL2Jpbi9vYmpmb3JtYXRgIjsgdGhlbgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1mcmVlYnNkZWxmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qLy8nYAotCQlleGl0IDAKLQkgICAgZmkKLQlmaQotICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tZnJlZWJzZGBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKLQlleGl0IDAgOzsKLSAgICAqOk5ldEJTRDoqOiopCi0JZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbmV0YnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpPcGVuQlNEOio6KikKLQllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vcGVuYnNkYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvWy1fXS4qL1wuLydgCi0JZXhpdCAwIDs7Ci0gICAgaSo6W0NjXVtZeV1bR2ddW1d3XVtJaV1bTm5dKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1jeWd3aW4zMgotCWV4aXQgMCA7OwotICAgIGkqOk1JTkdXKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCi0JZXhpdCAwIDs7Ci0gICAgaSo6V2luZG93c19OVCo6KiB8IFBlbnRpdW0qOldpbmRvd3NfTlQqOiopCi0gICAgICAgICMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIGdlbmVyaWMgcG9zaXggc3Vic3lzdGVtPwotCSMgSXQgYWxzbyBjb25mbGljdHMgd2l0aCBwcmUtMi4wIHZlcnNpb25zIG9mIEFUJlQgVVdJTi4gU2hvdWxkIHdlCi0JIyBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQgb2YKLQkjIGkzODY/Ci0JZWNobyBpMzg2LXBjLWludGVyaXgKLQlleGl0IDAgOzsKLSAgICBpKjpVV0lOKjoqKQotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy11d2luCi0JZXhpdCAwIDs7Ci0gICAgcCo6Q1lHV0lOKjoqKQotCWVjaG8gcG93ZXJwY2xlLXVua25vd24tY3lnd2luMzIKLQlleGl0IDAgOzsKLSAgICBwcmVwKjpTdW5PUzo1Lio6KikKLQllY2hvIHBvd2VycGNsZS11bmtub3duLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCi0JZXhpdCAwIDs7Ci0gICAgKjpHTlU6KjoqKQotCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAotCWV4aXQgMCA7OwotICAgICo6TGludXg6KjoqKQotCSMgdW5hbWUgb24gdGhlIEFSTSBwcm9kdWNlcyBhbGwgc29ydHMgb2Ygc3RyYW5nZW5lc3MsIGFuZCB3ZSBuZWVkIHRvCi0JIyBmaWx0ZXIgaXQgb3V0LgotCWNhc2UgIiRVTkFNRV9NQUNISU5FIiBpbgotCSAgYXJtdiopCQkgICAgICBVTkFNRV9NQUNISU5FPSRVTkFNRV9NQUNISU5FIDs7Ci0JICBhcm0qIHwgc2ExMTAqKQkgICAgICBVTkFNRV9NQUNISU5FPSJhcm0iIDs7Ci0JZXNhYwotCi0JIyBUaGUgQkZEIGxpbmtlciBrbm93cyB3aGF0IHRoZSBkZWZhdWx0IG9iamVjdCBmaWxlIGZvcm1hdCBpcywgc28KLQkjIGZpcnN0IHNlZSBpZiBpdCB3aWxsIHRlbGwgdXMuCi0JbGRfaGVscF9zdHJpbmc9YGxkIC0taGVscCAyPiYxYAotCWxkX3N1cHBvcnRlZF9lbXVsYXRpb25zPWBlY2hvICRsZF9oZWxwX3N0cmluZyBcCi0JCQkgfCBzZWQgLW5lICcvc3VwcG9ydGVkIGVtdWxhdGlvbnM6LyFkCi0JCQkJICAgIHMvWyAJXVsgCV0qLyAvZwotCQkJCSAgICBzLy4qc3VwcG9ydGVkIGVtdWxhdGlvbnM6ICovLwotCQkJCSAgICBzLyAuKi8vCi0JCQkJICAgIHAnYAotICAgICAgICBjYXNlICIkbGRfc3VwcG9ydGVkX2VtdWxhdGlvbnMiIGluCi0JICBpPzg2bGludXgpICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXBjLWxpbnV4LWdudWFvdXQiICAgICAgOyBleGl0IDAgOzsKLQkgIGk/ODZjb2ZmKSAgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tcGMtbGludXgtZ251Y29mZiIgICAgICA7IGV4aXQgMCA7OwotCSAgc3BhcmNsaW51eCkgZWNobyAiJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWFvdXQiIDsgZXhpdCAwIDs7Ci0JICBhcm1saW51eCkgICBlY2hvICIke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251YW91dCIgOyBleGl0IDAgOzsKLQkgIG02OGtsaW51eCkgIGVjaG8gIiR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnVhb3V0IiA7IGV4aXQgMCA7OwotCSAgZWxmMzJwcGMgfCBlbGYzMnBwY2xpbnV4KQotCQkjIERldGVybWluZSBMaWIgVmVyc2lvbgotCQljYXQgPmR1bW15LmMgPDxFT0YKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotI2lmIGRlZmluZWQoX19HTElCQ19fKQotZXh0ZXJuIGNoYXIgX19saWJjX3ZlcnNpb25bXTsKLWV4dGVybiBjaGFyIF9fbGliY19yZWxlYXNlW107Ci0jZW5kaWYKLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSNpZiBkZWZpbmVkKF9fR0xJQkNfXykKLSAgcHJpbnRmKCIlcyAlc1xuIiwgX19saWJjX3ZlcnNpb24sIF9fbGliY19yZWxlYXNlKTsKLSNlbHNlCi0gIHByaW50ZigidW5rb3duXG4iKTsKLSNlbmRpZgotICByZXR1cm4gMDsKLX0KLUVPRgotCQlMSUJDPSIiCi0JCSR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwKLQkJaWYgdGVzdCAiJD8iID0gMCA7IHRoZW4KLQkJCS4vZHVtbXkgfCBncmVwIDFcLjk5ID4gL2Rldi9udWxsCi0JCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJCUxJQkM9ImxpYmMxIgotCQkJZmkKLQkJZmkJCi0JCXJtIC1mIGR1bW15LmMgZHVtbXkKLQkJZWNobyBwb3dlcnBjLXVua25vd24tbGludXgtZ251JHtMSUJDfSA7IGV4aXQgMCA7OwotCWVzYWMKLQotCWlmIHRlc3QgIiR7VU5BTUVfTUFDSElORX0iID0gImFscGhhIiA7IHRoZW4KLQkJc2VkICdzL14JLy8nICA8PEVPRiA+ZHVtbXkucwotCQkuZ2xvYmwgbWFpbgotCQkuZW50IG1haW4KLQltYWluOgotCQkuZnJhbWUgXCQzMCwwLFwkMjYsMAotCQkucHJvbG9ndWUgMAotCQkubG9uZyAweDQ3ZTAzZDgwICMgaW1wbHZlciAkMAotCQlsZGEgXCQyLDI1OQotCQkubG9uZyAweDQ3ZTIwYzIxICMgYW1hc2sgJDIsJDEKLQkJc3JsIFwkMSw4LFwkMgotCQlzbGwgXCQyLDIsXCQyCi0JCXNsbCBcJDAsMyxcJDAKLQkJYWRkbCBcJDEsXCQwLFwkMAotCQlhZGRsIFwkMixcJDAsXCQwCi0JCXJldCBcJDMxLChcJDI2KSwxCi0JCS5lbmQgbWFpbgotRU9GCi0JCUxJQkM9IiIKLQkJJHtDQy1jY30gZHVtbXkucyAtbyBkdW1teSAyPi9kZXYvbnVsbAotCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJLi9kdW1teQotCQkJY2FzZSAiJD8iIGluCi0JCQk3KQotCQkJCVVOQU1FX01BQ0hJTkU9ImFscGhhIgotCQkJCTs7Ci0JCQkxNSkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIKLQkJCQk7OwotCQkJMTQpCi0JCQkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IgotCQkJCTs7Ci0JCQkxMCkKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYXBjYTU2IgotCQkJCTs7Ci0JCQkxNikKLQkJCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NiIKLQkJCQk7OwotCQkJZXNhYwkKLQotCQkJb2JqZHVtcCAtLXByaXZhdGUtaGVhZGVycyBkdW1teSB8IFwKLQkJCSAgZ3JlcCBsZC5zby4xID4gL2Rldi9udWxsCi0JCQlpZiB0ZXN0ICIkPyIgPSAwIDsgdGhlbgotCQkJCUxJQkM9ImxpYmMxIgotCQkJZmkKLQkJZmkJCi0JCXJtIC1mIGR1bW15LnMgZHVtbXkKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfSA7IGV4aXQgMAotCWVsaWYgdGVzdCAiJHtVTkFNRV9NQUNISU5FfSIgPSAibWlwcyIgOyB0aGVuCi0JICBjYXQgPmR1bW15LmMgPDxFT0YKLW1haW4oYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmFyZ3ZbXTsKLXsKLSNpZmRlZiBfX01JUFNFQl9fCi0gIHByaW50ZiAoIiVzLXVua25vd24tbGludXgtZ251XG4iLCBhcmd2WzFdKTsKLSNlbmRpZgotI2lmZGVmIF9fTUlQU0VMX18KLSAgcHJpbnRmICgiJXNlbC11bmtub3duLWxpbnV4LWdudVxuIiwgYXJndlsxXSk7Ci0jZW5kaWYKLSAgcmV0dXJuIDA7Ci19Ci1FT0YKLQkgICR7Q0MtY2N9IGR1bW15LmMgLW8gZHVtbXkgMj4vZGV2L251bGwgJiYgLi9kdW1teSAiJHtVTkFNRV9NQUNISU5FfSIgJiYgcm0gZHVtbXkuYyBkdW1teSAmJiBleGl0IDAKLQkgIHJtIC1mIGR1bW15LmMgZHVtbXkKLQllbHNlCi0JICAjIEVpdGhlciBhIHByZS1CRkQgYS5vdXQgbGlua2VyIChsaW51eC1nbnVvbGRsZCkKLQkgICMgb3Igb25lIHRoYXQgZG9lcyBub3QgZ2l2ZSB1cyB1c2VmdWwgLS1oZWxwLgotCSAgIyBHQ0Mgd2FudHMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBsaW51eC1nbnVvbGRsZCBhbmQgbGludXgtZ251YW91dC4KLQkgICMgSWYgbGQgZG9lcyBub3QgcHJvdmlkZSAqYW55KiAic3VwcG9ydGVkIGVtdWxhdGlvbnM6IgotCSAgIyB0aGF0IG1lYW5zIGl0IGlzIGdudW9sZGxkLgotCSAgZWNobyAiJGxkX2hlbHBfc3RyaW5nIiB8IGdyZXAgPi9kZXYvbnVsbCAyPiYxICJzdXBwb3J0ZWQgZW11bGF0aW9uczoiCi0JICB0ZXN0ICQ/ICE9IDAgJiYgZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC1nbnVvbGRsZCIgJiYgZXhpdCAwCi0KLQkgIGNhc2UgIiR7VU5BTUVfTUFDSElORX0iIGluCi0JICBpPzg2KQotCSAgICBWRU5ET1I9cGM7Ci0JICAgIDs7Ci0JICAqKQotCSAgICBWRU5ET1I9dW5rbm93bjsKLQkgICAgOzsKLQkgIGVzYWMKLQkgICMgRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgY29tcGlsZXIgaXMgYS5vdXQgb3IgZWxmCi0JICBjYXQgPmR1bW15LmMgPDxFT0YKLSNpbmNsdWRlIDxmZWF0dXJlcy5oPgotbWFpbihhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqYXJndltdOwotewotI2lmZGVmIF9fRUxGX18KLSMgaWZkZWYgX19HTElCQ19fCi0jICBpZiBfX0dMSUJDX18gPj0gMgotICAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVcbiIsIGFyZ3ZbMV0pOwotIyAgZWxzZQotICAgIHByaW50ZiAoIiVzLSR7VkVORE9SfS1saW51eC1nbnVsaWJjMVxuIiwgYXJndlsxXSk7Ci0jICBlbmRpZgotIyBlbHNlCi0gICBwcmludGYgKCIlcy0ke1ZFTkRPUn0tbGludXgtZ251bGliYzFcbiIsIGFyZ3ZbMV0pOwotIyBlbmRpZgotI2Vsc2UKLSAgcHJpbnRmICgiJXMtJHtWRU5ET1J9LWxpbnV4LWdudWFvdXRcbiIsIGFyZ3ZbMV0pOwotI2VuZGlmCi0gIHJldHVybiAwOwotfQotRU9GCi0JICAke0NDLWNjfSBkdW1teS5jIC1vIGR1bW15IDI+L2Rldi9udWxsICYmIC4vZHVtbXkgIiR7VU5BTUVfTUFDSElORX0iICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi0JICBybSAtZiBkdW1teS5jIGR1bW15Ci0JZmkgOzsKLSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuICBlYXJsaWVyIHZlcnNpb25zCi0jIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aCBzeXNuYW1lIGFuZCBub2RlbmFtZS4KLSAgICBpPzg2OkRZTklYL3B0eDo0KjoqKQotCWVjaG8gaTM4Ni1zZXF1ZW50LXN5c3Y0Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjpVTklYX1NWOjQuMk1QOjIuKikKLSAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgotICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCi0gICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKLQkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCi0gICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgotCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059Ci0JZXhpdCAwIDs7Ci0gICAgaT84NjoqOjQuKjoqIHwgaT84NjpTWVNURU1fVjo0Lio6KikKLQlpZiBncmVwIE5vdmVsbCAvdXNyL2luY2x1ZGUvbGluay5oID4vZGV2L251bGwgMj4vZGV2L251bGw7IHRoZW4KLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVuaXZlbC1zeXN2JHtVTkFNRV9SRUxFQVNFfQotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZmkKLQlleGl0IDAgOzsKLSAgICBpPzg2Oio6NTo3KQotICAgICAgIFVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8ZWdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCi0gICAgICAgKC9iaW4vdW5hbWUgLVh8ZWdyZXAgaTgwNDg2ID4vZGV2L251bGwpICYmIFVOQU1FX01BQ0hJTkU9aTQ4NgotICAgICAgICgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bScgPi9kZXYvbnVsbCkgXAotICAgICAgICAgICAgICAgJiYgVU5BTUVfTUFDSElORT1pNTg2Ci0jIDUuMC40YyByZXR1cm5zICJQZW50IElJIi4gIDUuMC41IHJldHVybnMgUGVudElJCi0gICAgICAgKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50LipJSScgPi9kZXYvbnVsbCkgXAotICAgICAgICAgICAgICAgJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0gICAgICAgKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtIFBybycgPi9kZXYvbnVsbCkgXAotICAgICAgICAgICAgICAgJiYgVU5BTUVfTUFDSElORT1pNjg2Ci0gICAgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfSR7VU5BTUVfVkVSU0lPTn0tc3lzdiR7VU5BTUVfUkVMRUFTRX0KLSAgICAgICBleGl0IDAgOzsKLSAgICBpPzg2Oio6My4yOiopCi0JaWYgdGVzdCAtZiAvdXNyL29wdGlvbnMvY2IubmFtZTsgdGhlbgotCQlVTkFNRV9SRUw9YHNlZCAtbiAncy8uKlZlcnNpb24gLy9wJyA8L3Vzci9vcHRpb25zL2NiLm5hbWVgCi0JCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1pc2MkVU5BTUVfUkVMCi0JZWxpZiAvYmluL3VuYW1lIC1YIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCi0JCVVOQU1FX1JFTD1gKC9iaW4vdW5hbWUgLVh8ZWdyZXAgUmVsZWFzZXxzZWQgLWUgJ3MvLio9IC8vJylgCi0JCSgvYmluL3VuYW1lIC1YfGVncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50aXVtJyA+L2Rldi9udWxsKSBcCi0JCQkmJiBVTkFNRV9NQUNISU5FPWk1ODYKLQkJKC9iaW4vdW5hbWUgLVh8ZWdyZXAgJ15NYWNoaW5lLipQZW50SUknID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQkoL2Jpbi91bmFtZSAtWHxlZ3JlcCAnXk1hY2hpbmUuKlBlbnQgSUknID4vZGV2L251bGwpIFwKLQkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgotICAgICAgICAgICAgICAgICgvYmluL3VuYW1lIC1YfGVncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIFVOQU1FX01BQ0hJTkU9aTY4NgotCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAotCWVsc2UKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgcGM6KjoqOiopCi0gICAgICAgICMgdW5hbWUgLW0gcHJpbnRzIGZvciBESkdQUCBhbHdheXMgJ3BjJywgYnV0IGl0IHByaW50cyBub3RoaW5nIGFib3V0Ci0gICAgICAgICMgdGhlIHByb2Nlc3Nvciwgc28gd2UgcGxheSBzYWZlIGJ5IGFzc3VtaW5nIGkzODYuCi0JZWNobyBpMzg2LXBjLW1zZG9zZGpncHAKLSAgICAgICAgZXhpdCAwIDs7Ci0gICAgSW50ZWw6TWFjaDozKjoqKQotCWVjaG8gaTM4Ni1wYy1tYWNoMwotCWV4aXQgMCA7OwotICAgIHBhcmFnb246KjoqOiopCi0JZWNobyBpODYwLWludGVsLW9zZjEKLQlleGl0IDAgOzsKLSAgICBpODYwOio6NC4qOiopICMgaTg2MC1TVlI0Ci0JaWYgZ3JlcCBTdGFyZGVudCAvdXNyL2luY2x1ZGUvc3lzL3VhZG1pbi5oID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLQkgIGVjaG8gaTg2MC1zdGFyZGVudC1zeXN2JHtVTkFNRV9SRUxFQVNFfSAjIFN0YXJkZW50IFZpc3RyYSBpODYwLVNWUjQKLQllbHNlICMgQWRkIG90aGVyIGk4NjAtU1ZSNCB2ZW5kb3JzIGJlbG93IGFzIHRoZXkgYXJlIGRpc2NvdmVyZWQuCi0JICBlY2hvIGk4NjAtdW5rbm93bi1zeXN2JHtVTkFNRV9SRUxFQVNFfSAgIyBVbmtub3duIGk4NjAtU1ZSNAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgbWluaSo6Q1RJWDpTWVMqNToqKQotCSMgIm1pbmlmcmFtZSIKLQllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKLQlleGl0IDAgOzsKLSAgICBNNjgqOio6UjNWWzU2N10qOiopCi0JdGVzdCAtciAvc3lzVjY4ICYmIGVjaG8gJ202OGstbW90b3JvbGEtc3lzdicgJiYgZXhpdCAwIDs7Ci0gICAgM1szNF0/PzoqOjQuMDozLjAgfCAzWzM0XT8/LCo6Kjo0LjA6My4wIHwgNDg1MDoqOjQuMDozLjApCi0JT1NfUkVMPScnCi0JdGVzdCAtciAvZXRjLy5yZWxpZCBcCi0JJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAKLQkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgL2Jpbi9ncmVwIGVudGl1bSA+L2Rldi9udWxsIFwKLQkgICYmIGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfSAmJiBleGl0IDAgOzsKLSAgICAzWzM0XT8/Oio6NC4wOiogfCAzWzM0XT8/LCo6Kjo0LjA6KikKLSAgICAgICAgL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IGdyZXAgODYgPi9kZXYvbnVsbCBcCi0gICAgICAgICAgJiYgZWNobyBpNDg2LW5jci1zeXN2NCAmJiBleGl0IDAgOzsKLSAgICBtNjgqOkx5bnhPUzoyLio6KikKLQllY2hvIG02OGstdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9Ci0JZXhpdCAwIDs7Ci0gICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQotCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAotCWV4aXQgMCA7OwotICAgIGk/ODY6THlueE9TOjIuKjoqKQotCWVjaG8gaTM4Ni11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKLQllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIHJzNjAwMDpMeW54T1M6Mi4qOiogfCBQb3dlclBDOkx5bnhPUzoyLio6KikKLQllY2hvIHJzNjAwMC11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBTTVtCRV1TOlVOSVhfU1Y6KjoqKQotCWVjaG8gbWlwcy1kZGUtc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlleGl0IDAgOzsKLSAgICBSTSo6U0lOSVgtKjoqOiopCi0JZWNobyBtaXBzLXNuaS1zeXN2NAotCWV4aXQgMCA7OwotICAgICo6U0lOSVgtKjoqOiopCi0JaWYgdW5hbWUgLXAgMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KLQkJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKLQkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXNuaS1zeXN2NAotCWVsc2UKLQkJZWNobyBuczMyay1zbmktc3lzdgotCWZpCi0JZXhpdCAwIDs7Ci0gICAgUEVOVElVTTpDUHVuaXg6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYXlzIDxSaWNoYXJkLk0uQmFydGVsQGNjTWFpbC5DZW5zdXMuR09WPgotICAgICAgICBlY2hvIGk1ODYtdW5pc3lzLXN5c3Y0Ci0gICAgICAgIGV4aXQgMCA7OwotICAgICo6VU5JWF9TeXN0ZW1fVjo0KjpGVFgqKQotCSMgRnJvbSBHZXJhbGQgSGV3ZXMgPGhld2VzQG9wZW5tYXJrZXQuY29tPi4KLQkjIEhvdyBhYm91dCBkaWZmZXJlbnRpYXRpbmcgYmV0d2VlbiBzdHJhdHVzIGFyY2hpdGVjdHVyZXM/IC1kam0KLQllY2hvIGhwcGExLjEtc3RyYXR1cy1zeXN2NAotCWV4aXQgMCA7OwotICAgICo6KjoqOkZUWCopCi0JIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCi0JZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKLQlleGl0IDAgOzsKLSAgICBtYzY4KjpBL1VYOio6KikKLQllY2hvIG02OGstYXBwbGUtYXV4JHtVTkFNRV9SRUxFQVNFfQotCWV4aXQgMCA7OwotICAgIG5ld3MqOk5FV1MtT1M6Kjo2KikKLQllY2hvIG1pcHMtc29ueS1uZXdzb3M2Ci0JZXhpdCAwIDs7Ci0gICAgUjMwMDA6KlN5c3RlbV9WKjoqOiogfCBSNDAwMDpVTklYX1NZU1Y6KjoqIHwgUjQwMDA6VU5JWF9TVjoqOiopCi0JaWYgWyAtZCAvdXNyL25lYyBdOyB0aGVuCi0JICAgICAgICBlY2hvIG1pcHMtbmVjLXN5c3Yke1VOQU1FX1JFTEVBU0V9Ci0JZWxzZQotCSAgICAgICAgZWNobyBtaXBzLXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0KLQlmaQotICAgICAgICBleGl0IDAgOzsKLSAgICBCZUJveDpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gaGFyZHdhcmUgbWFkZSBieSBCZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWJlLWJlb3MKLQlleGl0IDAgOzsKLSAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCi0JZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKLQlleGl0IDAgOzsKLSAgICBCZVBDOkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBJbnRlbCBQQyBjb21wYXRpYmxlLgotCWVjaG8gaTU4Ni1wYy1iZW9zCi0JZXhpdCAwIDs7Ci1lc2FjCi0KLSNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgotI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgotCi1jYXQgPmR1bW15LmMgPDxFT0YKLSNpZmRlZiBfU0VRVUVOVF8KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jIGluY2x1ZGUgPHN5cy91dHNuYW1lLmg+Ci0jZW5kaWYKLW1haW4gKCkKLXsKLSNpZiBkZWZpbmVkIChzb255KQotI2lmIGRlZmluZWQgKE1JUFNFQikKLSAgLyogQkZEIHdhbnRzICJic2QiIGluc3RlYWQgb2YgIm5ld3NvcyIuICBQZXJoYXBzIEJGRCBzaG91bGQgYmUgY2hhbmdlZCwKLSAgICAgSSBkb24ndCBrbm93Li4uLiAgKi8KLSAgcHJpbnRmICgibWlwcy1zb255LWJzZFxuIik7IGV4aXQgKDApOwotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSAgcHJpbnRmICgibTY4ay1zb255LW5ld3NvcyVzXG4iLAotI2lmZGVmIE5FV1NPUzQKLSAgICAgICAgICAiNCIKLSNlbHNlCi0JICAiIgotI2VuZGlmCi0gICAgICAgICApOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2FybSkgJiYgZGVmaW5lZCAoX19hY29ybikgJiYgZGVmaW5lZCAoX191bml4KQotICBwcmludGYgKCJhcm0tYWNvcm4tcmlzY2l4Iik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCi0gIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE5lWFQpCi0jaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCi0jZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCi0jZW5kaWYKLSAgaW50IHZlcnNpb247Ci0gIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKLSAgcHJpbnRmICgiJXMtbmV4dC1uZXh0c3RlcCVkXG4iLCBfX0FSQ0hJVEVDVFVSRV9fLCB2ZXJzaW9uKTsKLSAgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKE1VTFRJTUFYKSB8fCBkZWZpbmVkIChuMTYpCi0jaWYgZGVmaW5lZCAoVU1BWFYpCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1zeXN2XG4iKTsgZXhpdCAoMCk7Ci0jZWxzZQotI2lmIGRlZmluZWQgKENNVSkKLSAgcHJpbnRmICgibnMzMmstZW5jb3JlLW1hY2hcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoIm5zMzJrLWVuY29yZS1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fMzg2QlNEX18pCi0gIHByaW50ZiAoImkzODYtcGMtYnNkXG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgKHNlcXVlbnQpCi0jaWYgZGVmaW5lZCAoaTM4NikKLSAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChuczMyMDAwKQotICBwcmludGYgKCJuczMyay1zZXF1ZW50LWR5bml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoX1NFUVVFTlRfKQotICAgIHN0cnVjdCB1dHNuYW1lIHVuOwotCi0gICAgdW5hbWUoJnVuKTsKLQotICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMiIsIDIpID09IDApIHsKLQlwcmludGYgKCJpMzg2LXNlcXVlbnQtcHR4MlxuIik7IGV4aXQgKDApOwotICAgIH0KLSAgICBpZiAoc3RybmNtcCh1bi52ZXJzaW9uLCAiVjEiLCAyKSA9PSAwKSB7IC8qIFhYWCBpcyBWMSBjb3JyZWN0PyAqLwotCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgxXG4iKTsgZXhpdCAoMCk7Ci0gICAgfQotICAgIHByaW50ZiAoImkzODYtc2VxdWVudC1wdHhcbiIpOyBleGl0ICgwKTsKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkICh2YXgpCi0jaWYgIWRlZmluZWQgKHVsdHJpeCkKLSAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKLSNlbHNlCi0gIHByaW50ZiAoInZheC1kZWMtdWx0cml4XG4iKTsgZXhpdCAoMCk7Ci0jZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoYWxsaWFudCkgJiYgZGVmaW5lZCAoaTg2MCkKLSAgcHJpbnRmICgiaTg2MC1hbGxpYW50LWJzZFxuIik7IGV4aXQgKDApOwotI2VuZGlmCi0KLSAgZXhpdCAoMSk7Ci19Ci1FT0YKLQotJHtDQy1jY30gZHVtbXkuYyAtbyBkdW1teSAyPi9kZXYvbnVsbCAmJiAuL2R1bW15ICYmIHJtIGR1bW15LmMgZHVtbXkgJiYgZXhpdCAwCi1ybSAtZiBkdW1teS5jIGR1bW15Ci0KLSMgQXBvbGxvcyBwdXQgdGhlIHN5c3RlbSB0eXBlIGluIHRoZSBlbnZpcm9ubWVudC4KLQotdGVzdCAtZCAvdXNyL2Fwb2xsbyAmJiB7IGVjaG8gJHtJU1B9LWFwb2xsby0ke1NZU1RZUEV9OyBleGl0IDA7IH0KLQotIyBDb252ZXggdmVyc2lvbnMgdGhhdCBwcmVkYXRlIHVuYW1lIGNhbiB1c2UgZ2V0c3lzaW5mbygxKQotCi1pZiBbIC14IC91c3IvY29udmV4L2dldHN5c2luZm8gXQotdGhlbgotICAgIGNhc2UgYGdldHN5c2luZm8gLWYgY3B1X3R5cGVgIGluCi0gICAgYzEqKQotCWVjaG8gYzEtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGMyKikKLQlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKLQl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKLQllbHNlIGVjaG8gYzItY29udmV4LWJzZAotCWZpCi0JZXhpdCAwIDs7Ci0gICAgYzM0KikKLQllY2hvIGMzNC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzM4KikKLQllY2hvIGMzOC1jb252ZXgtYnNkCi0JZXhpdCAwIDs7Ci0gICAgYzQqKQotCWVjaG8gYzQtY29udmV4LWJzZAotCWV4aXQgMCA7OwotICAgIGVzYWMKLWZpCi0KLSNlY2hvICcoVW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlKScgMT4mMgotCi1leGl0IDEKZGlmZiAtLWdpdCBhL2NvbmZpZy5pZiBiL2NvbmZpZy5pZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjMDI2OS4uMDAwMDAwMAotLS0gYS9jb25maWcuaWYKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jISAvZGV2L251bGwKLSMgRG9uJ3QgY2FsbCBpdCBkaXJlY3RseS4gVGhpcyBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgaXMgY2FsbGVkIHRvCi0jIGRldGVybWluZToKLSMKLSMJMS4gbGlic3RjeHhfaW50ZXJmYWNlOiB0aGUgaW50ZXJmYWNlIG5hbWUgZm9yIGxpYnN0ZGMrKy4KLSMJMi4gY3h4X2ludGVyZmFjZTogdGhlIGludGVyZmFjZSBuYW1lIGZvciBjKysuCi0jCTMuIGxpYmNfaW50ZXJmYWNlOiB0aGUgaW50ZXJmYWNlIG5hbWUgZm9yIGxpYmMuCi0jCi0KLSMgR2V0IHRoZSB0b3AgbGV2ZWwgc3JjIGRpci4KLWlmIFsgLXogIiR7dG9wc3JjZGlyfSIgLWEgLXogIiR7dG9wX3NyY2Rpcn0iIF0KLXRoZW4KLSAgZWNobyAiVW5kZWZpbmVkIHRvcCBsZXZlbCBzcmMgZGlyOiB0b3BzcmNkaXIgYW5kIHRvcF9zcmNkaXIgYXJlIGVtcHR5IiA+JjIKLSAgZXhpdCAxCi1maQotCi1pZiBbIC1uICIke3RvcHNyY2Rpcn0iIF0KLXRoZW4KLSAgaWZfdG9wc3JjZGlyPSR7dG9wc3JjZGlyfQotZWxzZQotICBpZl90b3BzcmNkaXI9JHt0b3Bfc3JjZGlyfQotZmkKLQotaWYgWyAtZiAke2lmX3RvcHNyY2Rpcn0vbGlic3RkYysrL01ha2VmaWxlLmluIF07IHRoZW4KLSMgV2UgY2hlY2sgbGlic3RkYysrIGZvciBsaWJzdGRjeHhfaW50ZXJmYWNlLgotbGlic3RkY3h4X2ludGVyZmFjZT1gZ3JlcCAiXklOVEVSRkFDRSIgJHtpZl90b3BzcmNkaXJ9L2xpYnN0ZGMrKy9NYWtlZmlsZS5pbiB8IHNlZCAncy9JTlRFUkZBQ0VbIAldKj1bIAldKlwoLipcKS9cMS8nYAotZWxzZQotbGlic3RkY3h4X2ludGVyZmFjZT0KLWZpCi0KLWlmIFsgLWYgJHtpZl90b3BzcmNkaXJ9L2djYy9jcC9NYWtlZmlsZS5pbiBdOyB0aGVuCi0jIFdlIGNoZWNrIGdjYy9jcCBmb3IgY3h4X2ludGVyZmFjZS4KLWN4eF9pbnRlcmZhY2U9YGdyZXAgIl5JTlRFUkZBQ0UiICR7aWZfdG9wc3JjZGlyfS9nY2MvY3AvTWFrZWZpbGUuaW4gfCBzZWQgJ3MvSU5URVJGQUNFWyAJXSo9WyAJXSpcKC4qXCkvXDEvJ2AKLWVsc2UKLWN4eF9pbnRlcmZhY2U9Ci1maQotCi0jIFRoZSB0cmlja2llc3QgcGFydCBpcyBsaWJjX2ludGVyZmFjZS4KLWlmIFsgLXogIiR7bGliY19pbnRlcmZhY2V9IiBdCi10aGVuCi0gIGNhc2UgJHt0YXJnZXRfb3N9IGluCi0gICpsaW51eCpsaWJjMSp8KmxpbnV4KmxpYmM1KikKLSAgICBjYXNlICR7dGFyZ2V0X2FsaWFzfSBpbgotICAgICphbHBoYSp8KnBvd2VycGMqKQotICAgICAgbGliY19pbnRlcmZhY2U9LWxpYmM1LjktCi0gICAgICA7OwotICAgICopCi0gICAgICBsaWJjX2ludGVyZmFjZT0tbGliYzUtCi0gICAgICA7OwotICAgIGVzYWMKLSAgICA7OwotICAqbGludXgqZ251KikKLSAgICAjIFdlIGhhdmUgdG8gd29yayBoYXJkZXIgdG8gZmlndXJlIGl0IG91dC4KLSAgICBpZiBbICR7dGFyZ2V0X2FsaWFzfSA9ICR7YnVpbGRfYWxpYXN9IF0KLSAgICB0aGVuCi0gICAgICBkdW1teT1pZiQkCi0gICAgICBjYXQgPiRkdW1teS5jIDw8RU9GCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4gICAgICAgICAgICAgICAgICAgICAgCi1tYWluKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOyAgICAgICAgICAKLSAgICAgY2hhciAqYXJndltdOwotewotICBwcmludGYoIiVkXG4iLCBfX0dMSUJDX01JTk9SX18pOwotICByZXR1cm4gMDsKLX0KLUVPRgotICAgICAgJHtDQy1jY30gJGR1bW15LmMgLW8gJGR1bW15IDI+L2Rldi9udWxsCi0gICAgICBpZiBbICIkPyIgPSAwIF0KLSAgICAgIHRoZW4KLQlsaWJjX2ludGVyZmFjZT0tbGliYzYuYC4vJGR1bW15YC0KLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkKLSAgICAgIGVsc2UKLQkjIEl0IHNob3VsZCBuZXZlciBoYXBwZW4uCi0JZWNobyAiQ2Fubm90IGZpbmQgdGhlIEdOVSBDIGxpYnJhcnkgbWlub3IgdmVyc2lvbiBudW1iZXIuIiA+JjIKLQlybSAtZiAkZHVtbXkuYyAkZHVtbXkKLQlleGl0IDEKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgIyBDcm9zcyBjb21waWxpbmcuIEFzc3VtZSBnbGliYyAyLjEuCi0gICAgICBsaWJjX2ludGVyZmFjZT0tbGliYzYuMS0KLSAgICBmaQotICAgIDs7Ci0gICopCi0gICAgbGliY19pbnRlcmZhY2U9LQotICAgIDs7Ci0gIGVzYWMKLWZpCmRpZmYgLS1naXQgYS9jb25maWcuc3ViIGIvY29uZmlnLnN1YgpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNWVmZTMxNi4uMDAwMDAwMAotLS0gYS9jb25maWcuc3ViCisrKyAvZGV2L251bGwKQEAgLTEsMTIxMyArMCwwIEBACi0jISAvYmluL3NoCi0jIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBzdWJyb3V0aW5lIHNjcmlwdCwgdmVyc2lvbiAxLjEuCi0jICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5Mi05NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBmaWxlIGlzIChpbiBwcmluY2lwbGUpIGNvbW1vbiB0byBBTEwgR05VIHNvZnR3YXJlLgotIyBUaGUgcHJlc2VuY2Ugb2YgYSBtYWNoaW5lIGluIHRoaXMgZmlsZSBzdWdnZXN0cyB0aGF0IFNPTUUgR05VIHNvZnR3YXJlCi0jIGNhbiBoYW5kbGUgdGhhdCBtYWNoaW5lLiAgSXQgZG9lcyBub3QgaW1wbHkgQUxMIEdOVSBzb2Z0d2FyZSBjYW4uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSMgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIENvbmZpZ3VyYXRpb24gc3Vicm91dGluZSB0byB2YWxpZGF0ZSBhbmQgY2Fub25pY2FsaXplIGEgY29uZmlndXJhdGlvbiB0eXBlLgotIyBTdXBwbHkgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHR5cGUgYXMgYW4gYXJndW1lbnQuCi0jIElmIGl0IGlzIGludmFsaWQsIHdlIHByaW50IGFuIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIGFuZCBleGl0IHdpdGggY29kZSAxLgotIyBPdGhlcndpc2UsIHdlIHByaW50IHRoZSBjYW5vbmljYWwgY29uZmlnIHR5cGUgb24gc3Rkb3V0IGFuZCBzdWNjZWVkLgotCi0jIFRoaXMgZmlsZSBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIEdOVSBwYWNrYWdlcwotIyBhbmQgcmVjb2duaXplIGFsbCB0aGUgQ1BVIHR5cGVzLCBzeXN0ZW0gdHlwZXMgYW5kIGFsaWFzZXMKLSMgdGhhdCBhcmUgbWVhbmluZ2Z1bCB3aXRoICphbnkqIEdOVSBzb2Z0d2FyZS4KLSMgRWFjaCBwYWNrYWdlIGlzIHJlc3BvbnNpYmxlIGZvciByZXBvcnRpbmcgd2hpY2ggdmFsaWQgY29uZmlndXJhdGlvbnMKLSMgaXQgZG9lcyBub3Qgc3VwcG9ydC4gIFRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoCi0jIGEgZmFpbHVyZSB0byBzdXBwb3J0IGEgdmFsaWQgY29uZmlndXJhdGlvbiBmcm9tIGEgbWVhbmluZ2xlc3MKLSMgY29uZmlndXJhdGlvbi4KLQotIyBUaGUgZ29hbCBvZiB0aGlzIGZpbGUgaXMgdG8gbWFwIGFsbCB0aGUgdmFyaW91cyB2YXJpYXRpb25zIG9mIGEgZ2l2ZW4KLSMgbWFjaGluZSBzcGVjaWZpY2F0aW9uIGludG8gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiBpbiB0aGUgZm9ybToKLSMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLU9QRVJBVElOR19TWVNURU0KLSMgb3IgaW4gc29tZSBjYXNlcywgdGhlIG5ld2VyIGZvdXItcGFydCBmb3JtOgotIwlDUFVfVFlQRS1NQU5VRkFDVFVSRVItS0VSTkVMLU9QRVJBVElOR19TWVNURU0KLSMgSXQgaXMgd3JvbmcgdG8gZWNobyBhbnkgb3RoZXIgdHlwZSBvZiBzcGVjaWZpY2F0aW9uLgotCi1pZiBbIHgkMSA9IHggXQotdGhlbgotCWVjaG8gQ29uZmlndXJhdGlvbiBuYW1lIG1pc3NpbmcuIDE+JjIKLQllY2hvICJVc2FnZTogJDAgQ1BVLU1GUi1PUFNZUyIgMT4mMgotCWVjaG8gIm9yICAgICAkMCBBTElBUyIgMT4mMgotCWVjaG8gd2hlcmUgQUxJQVMgaXMgYSByZWNvZ25pemVkIGNvbmZpZ3VyYXRpb24gdHlwZS4gMT4mMgotCWV4aXQgMQotZmkKLQotIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCi1jYXNlICQxIGluCi0JKmxvY2FsKikKLQkJZWNobyAkMQotCQlleGl0IDAKLQkJOzsKLQkqKQotCTs7Ci1lc2FjCi0KLSMgU2VwYXJhdGUgd2hhdCB0aGUgdXNlciBnYXZlIGludG8gQ1BVLUNPTVBBTlkgYW5kIE9TIG9yIEtFUk5FTC1PUyAoaWYgYW55KS4KLSMgSGVyZSB3ZSBtdXN0IHJlY29nbml6ZSBhbGwgdGhlIHZhbGlkIEtFUk5FTC1PUyBjb21iaW5hdGlvbnMuCi1tYXliZV9vcz1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDIvJ2AKLWNhc2UgJG1heWJlX29zIGluCi0gIGxpbnV4LWdudSopCi0gICAgb3M9LSRtYXliZV9vcwotICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvXlwoLipcKS1cKFteLV0qLVteLV0qXCkkL1wxLydgCi0gICAgOzsKLSAgKikKLSAgICBiYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkICdzLy1bXi1dKiQvLydgCi0gICAgaWYgWyAkYmFzaWNfbWFjaGluZSAhPSAkMSBdCi0gICAgdGhlbiBvcz1gZWNobyAkMSB8IHNlZCAncy8uKi0vLS8nYAotICAgIGVsc2Ugb3M9OyBmaQotICAgIDs7Ci1lc2FjCi0KLSMjIyBMZXQncyByZWNvZ25pemUgY29tbW9uIG1hY2hpbmVzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcyBzbwotIyMjIHRoYXQgdGhpbmdzIGxpa2UgY29uZmlnLnN1YiBkZWNzdGF0aW9uLTMxMDAgd29yay4gIFdlIGFsc28KLSMjIyByZWNvZ25pemUgc29tZSBtYW51ZmFjdHVyZXJzIGFzIG5vdCBiZWluZyBvcGVyYXRpbmcgc3lzdGVtcywgc28gd2UKLSMjIyBjYW4gcHJvdmlkZSBkZWZhdWx0IG9wZXJhdGluZyBzeXN0ZW1zIGJlbG93LgotY2FzZSAkb3MgaW4KLQktc3VuKm9zKikKLQkJIyBQcmV2ZW50IGZvbGxvd2luZyBjbGF1c2UgZnJvbSBoYW5kbGluZyB0aGlzIGludmFsaWQgaW5wdXQuCi0JCTs7Ci0JLWRlYyogfCAtbWlwcyogfCAtc2VxdWVudCogfCAtZW5jb3JlKiB8IC1wYzUzMiogfCAtc2dpKiB8IC1zb255KiB8IFwKLQktYXR0KiB8IC03MzAwKiB8IC0zMzAwKiB8IC1kZWx0YSogfCAtbW90b3JvbGEqIHwgLXN1blsyMzRdKiB8IFwKLQktdW5pY29tKiB8IC1pYm0qIHwgLW5leHQgfCAtaHAgfCAtaXNpKiB8IC1hcG9sbG8gfCAtYWx0b3MqIHwgXAotCS1jb252ZXJnZW50KiB8IC1uY3IqIHwgLW5ld3MgfCAtMzIqIHwgLTM2MDAqIHwgLTMxMDAqIHwgLWhpdGFjaGkqIHxcCi0JLWNbMTIzXSogfCAtY29udmV4KiB8IC1zdW4gfCAtY3JkcyB8IC1vbXJvbiogfCAtZGcgfCAtdWx0cmEgfCAtdHRpKiB8IFwKLQktaGFycmlzIHwgLWRvbHBoaW4gfCAtaGlnaGxldmVsIHwgLWdvdWxkIHwgLWNibSB8IC1ucyB8IC1tYXNzY29tcCB8IFwKLQktYXBwbGUpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNpbSB8IC1jaXNjbyB8IC1va2kgfCAtd2VjIHwgLXdpbmJvbmQpCi0JCW9zPQotCQliYXNpY19tYWNoaW5lPSQxCi0JCTs7Ci0JLXNjb3V0KQotCQk7OwotCS13cnMpCi0JCW9zPXZ4d29ya3MKLQkJYmFzaWNfbWFjaGluZT0kMQotCQk7OwotCS1oaXV4KikKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQktc2NvNSkKLQkJb3M9LXNjbzMuMnY1Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvNCkKLQkJb3M9LXNjbzMuMnY0Ci0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvMy4yLls0LTldKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCi0JCTs7Ci0JLXNjbzMuMnZbNC05XSopCi0JCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktc2NvKikKLQkJb3M9LXNjbzMuMnYyCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKLQkJOzsKLQktdWRrKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1pc2MpCi0JCW9zPS1pc2MyLjIKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1jbGl4KikKLQkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWludGVyZ3JhcGgKLQkJOzsKLQktaXNjKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAotCQk7OwotCS1seW54KikKLQkJb3M9LWx5bnhvcwotCQk7OwotCS1wdHgqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXNlcXVlbnQvJ2AKLQkJOzsKLQktd2luZG93c250KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3dpbmRvd3NudC93aW5udC8nYAotCQk7OwotCS1wc29zKikKLQkJb3M9LXBzb3MKLQkJOzsKLWVzYWMKLQotIyBEZWNvZGUgYWxpYXNlcyBmb3IgY2VydGFpbiBDUFUtQ09NUEFOWSBjb21iaW5hdGlvbnMuCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JIyBSZWNvZ25pemUgdGhlIGJhc2ljIENQVSB0eXBlcyB3aXRob3V0IGNvbXBhbnkgbmFtZS4KLQkjIFNvbWUgYXJlIG9taXR0ZWQgaGVyZSBiZWNhdXNlIHRoZXkgaGF2ZSBzcGVjaWFsIG1lYW5pbmdzIGJlbG93LgotCXRhaG9lIHwgaTg2MCB8IG0zMnIgfCBtNjhrIHwgbTY4MDAwIHwgbTg4ayB8IG5zMzJrIHwgYXJjIHwgYXJtIFwKLQkJfCBhcm1lW2xiXSB8IHB5cmFtaWQgfCBtbjEwMjAwIHwgbW4xMDMwMCB8IHRyb24gfCBhMjlrIFwKLQkJfCA1ODAgfCBpOTYwIHwgaDgzMDAgXAotCQl8IGhwcGEgfCBocHBhMS4wIHwgaHBwYTEuMSB8IGhwcGEyLjAgfCBocHBhMi4wdyB8IGhwcGEyLjBuIFwKLQkJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhcGNhNVs2N10gXAotCQl8IHdlMzJrIHwgbnMxNmsgfCBjbGlwcGVyIHwgaTM3MCB8IHNoIHwgcG93ZXJwYyB8IHBvd2VycGNsZSBcCi0JCXwgMTc1MGEgfCBkc3AxNnh4IHwgcGRwMTEgfCBtaXBzMTYgfCBtaXBzNjQgfCBtaXBzZWwgfCBtaXBzNjRlbCBcCi0JCXwgbWlwczY0b3Jpb24gfCBtaXBzNjRvcmlvbmVsIHwgbWlwc3R4MzkgfCBtaXBzdHgzOWVsIFwKLQkJfCBtaXBzNjR2cjQzMDAgfCBtaXBzNjR2cjQzMDBlbCB8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKLQkJfCBtaXBzNjR2cjUwMDAgfCBtaXByczY0dnI1MDAwZWwgfCBtY29yZSBcCi0JICAgICAgICB8IG04ODExMCB8IG02ODBbMDEyMzQ2XTAgfCBtNjgzPzIgfCBtNjgzNjAgfCBtNTIwMCB8IHo4ayB8IHY3MCBcCi0JCXwgc3BhcmMgfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSB8IHNwYXJjNjQgfCBzcGFyYzg2eCB8IHNwYXJjdjkgXAotCQl8IHRodW1iIHwgdjg1MCB8IGM0eCB8IGQxMHYgfCBoODUwMCB8IHc2NSkKLQkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCi0JCTs7Ci0JIyBXZSB1c2UgYHBjJyByYXRoZXIgdGhhbiBgdW5rbm93bicKLQkjIGJlY2F1c2UgKDEpIHRoYXQncyB3aGF0IHRoZXkgbm9ybWFsbHkgYXJlLCBhbmQKLQkjICgyKSB0aGUgd29yZCAidW5rbm93biIgdGVuZHMgdG8gY29uZnVzZSBiZWdpbm5pbmcgdXNlcnMuCi0JaVszNDU2N104NikKLQkgIGJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtcGMKLQkgIDs7Ci0JIyBPYmplY3QgaWYgbW9yZSB0aGFuIG9uZSBjb21wYW55IG5hbWUgd29yZC4KLQkqLSotKikKLQkJZWNobyBJbnZhbGlkIGNvbmZpZ3VyYXRpb24gXGAkMVwnOiBtYWNoaW5lIFxgJGJhc2ljX21hY2hpbmVcJyBub3QgcmVjb2duaXplZCAxPiYyCi0JCWV4aXQgMQotCQk7OwotCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aCBjb21wYW55IG5hbWUuCi0JdmF4LSogfCB0YWhvZS0qIHwgaVszNDU2N104Ni0qIHwgaTg2MC0qIHwgbTMyci0qIHwgbTY4ay0qIHwgbTY4MDAwLSogXAotCSAgICAgIHwgbTg4ay0qIHwgc3BhcmMtKiB8IG5zMzJrLSogfCBmeDgwLSogfCBhcmMtKiB8IGFybS0qIHwgY1sxMjNdKiBcCi0JICAgICAgfCBtaXBzLSogfCBweXJhbWlkLSogfCB0cm9uLSogfCBhMjlrLSogfCByb21wLSogfCByczYwMDAtKiBcCi0JICAgICAgfCBwb3dlci0qIHwgbm9uZS0qIHwgNTgwLSogfCBjcmF5Mi0qIHwgaDgzMDAtKiB8IGg4NTAwLSogfCBpOTYwLSogXAotCSAgICAgIHwgeG1wLSogfCB5bXAtKiBcCi0JICAgICAgfCBocHBhLSogfCBocHBhMS4wLSogfCBocHBhMS4xLSogfCBocHBhMi4wLSogfCBocHBhMi4wdy0qIHwgaHBwYTIuMG4tKiBcCi0JICAgICAgfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhcGNhNVs2N10tKiBcCi0JICAgICAgfCB3ZTMyay0qIHwgY3lkcmEtKiB8IG5zMTZrLSogfCBwbi0qIHwgbnAxLSogfCB4cHMxMDAtKiBcCi0JICAgICAgfCBjbGlwcGVyLSogfCBvcmlvbi0qIFwKLQkgICAgICB8IHNwYXJjbGl0ZS0qIHwgcGRwMTEtKiB8IHNoLSogfCBwb3dlcnBjLSogfCBwb3dlcnBjbGUtKiBcCi0JICAgICAgfCBzcGFyYzY0LSogfCBzcGFyY3Y5LSogfCBzcGFyYzg2eC0qIHwgbWlwczE2LSogfCBtaXBzNjQtKiB8IG1pcHNlbC0qIFwKLQkgICAgICB8IG1pcHM2NGVsLSogfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKLQkgICAgICB8IG1pcHM2NHZyNDEwMC0qIHwgbWlwczY0dnI0MTAwZWwtKiB8IG1pcHM2NHZyNDMwMC0qIHwgbWlwczY0dnI0MzAwZWwtKiBcCi0JICAgICAgfCBtaXBzdHgzOS0qIHwgbWlwc3R4MzllbC0qIHwgbWNvcmUtKiBcCi0JICAgICAgfCBmMzAxLSogfCBhcm0qLSogfCB0M2UtKiBcCi0JICAgICAgfCBtODgxMTAtKiB8IG02ODBbMDEyMzRdMC0qIHwgbTY4Mz8yLSogfCBtNjgzNjAtKiB8IHo4ay0qIHwgZDEwdi0qIFwKLQkgICAgICB8IHRodW1iLSogfCB2ODUwLSogfCBkMzB2LSogfCB0aWMzMC0qIHwgYzMwLSogKQotCQk7OwotCSMgUmVjb2duaXplIHRoZSB2YXJpb3VzIG1hY2hpbmUgbmFtZXMgYW5kIGFsaWFzZXMgd2hpY2ggc3RhbmQKLQkjIGZvciBhIENQVSB0eXBlIGFuZCBhIGNvbXBhbnkgYW5kIHNvbWV0aW1lcyBldmVuIGFuIE9TLgotCTM4NmJzZCkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LWJzZAotCQk7OwotCTNiMSB8IDczMDAgfCA3MzAwLWF0dCB8IGF0dC03MzAwIHwgcGM3MzAwIHwgc2FmYXJpIHwgdW5peHBjKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1hdHQKLQkJOzsKLQkzYiopCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0JYTI5a2hpZikKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JYWRvYmU2OGspCi0JCWJhc2ljX21hY2hpbmU9bTY4MDEwLWFkb2JlCi0JCW9zPS1zY291dAotCQk7OwotCWFsbGlhbnQgfCBmeDgwKQotCQliYXNpY19tYWNoaW5lPWZ4ODAtYWxsaWFudAotCQk7OwotCWFsdG9zIHwgYWx0b3MzMDY4KQotCQliYXNpY19tYWNoaW5lPW02OGstYWx0b3MKLQkJOzsKLQlhbTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLW5vbmUKLQkJb3M9LWJzZAotCQk7OwotCWFtZGFobCkKLQkJYmFzaWNfbWFjaGluZT01ODAtYW1kYWhsCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JYW1pZ2EgfCBhbWlnYS0qKQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCTs7Ci0JYW1pZ2FvcyB8IGFtaWdhZG9zKQotCQliYXNpY19tYWNoaW5lPW02OGstY2JtCi0JCW9zPS1hbWlnYW9zCi0JCTs7Ci0JYW1pZ2F1bml4IHwgYW1peCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWNibQotCQlvcz0tc3lzdjQKLQkJOzsKLQlhcG9sbG82OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbwotCQlvcz0tc3lzdgotCQk7OwotCWFwb2xsbzY4YnNkKQotCQliYXNpY19tYWNoaW5lPW02OGstYXBvbGxvCi0JCW9zPS1ic2QKLQkJOzsKLQlhdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQotCQlvcz0tYXV4Ci0JCTs7Ci0JYmFsYW5jZSkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1zZXF1ZW50Ci0JCW9zPS1keW5peAotCQk7OwotCWNvbnZleC1jMSkKLQkJYmFzaWNfbWFjaGluZT1jMS1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMikKLQkJYmFzaWNfbWFjaGluZT1jMi1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNvbnZleC1jMzIpCi0JCWJhc2ljX21hY2hpbmU9YzMyLWNvbnZleAotCQlvcz0tYnNkCi0JCTs7Ci0JY29udmV4LWMzNCkKLQkJYmFzaWNfbWFjaGluZT1jMzQtY29udmV4Ci0JCW9zPS1ic2QKLQkJOzsKLQljb252ZXgtYzM4KQotCQliYXNpY19tYWNoaW5lPWMzOC1jb252ZXgKLQkJb3M9LWJzZAotCQk7OwotCWNyYXkgfCB5bXApCi0JCWJhc2ljX21hY2hpbmU9eW1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCWNyYXkyKQotCQliYXNpY19tYWNoaW5lPWNyYXkyLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotCVtjdGpdOTAtY3JheSkKLQkJYmFzaWNfbWFjaGluZT1jOTAtY3JheQotCQlvcz0tdW5pY29zCi0JCTs7Ci0JY3JkcyB8IHVub3MpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1jcmRzCi0JCTs7Ci0JZGEzMCB8IGRhMzAtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWRhMzAKLQkJOzsKLQlkZWNzdGF0aW9uIHwgZGVjc3RhdGlvbi0zMTAwIHwgcG1heCB8IHBtYXgtKiB8IHBtaW4gfCBkZWMzMTAwIHwgZGVjc3RhdG4pCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1kZWMKLQkJOzsKLQlkZWx0YSB8IDMzMDAgfCBtb3Rvcm9sYS0zMzAwIHwgbW90b3JvbGEtZGVsdGEgXAotCSAgICAgIHwgMzMwMC1tb3Rvcm9sYSB8IGRlbHRhLW1vdG9yb2xhKQotCQliYXNpY19tYWNoaW5lPW02OGstbW90b3JvbGEKLQkJOzsKLQlkZWx0YTg4KQotCQliYXNpY19tYWNoaW5lPW04OGstbW90b3JvbGEKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JZHB4MjAgfCBkcHgyMC0qKQotCQliYXNpY19tYWNoaW5lPXJzNjAwMC1idWxsCi0JCW9zPS1ib3N4Ci0JCTs7Ci0JZHB4MiogfCBkcHgyKi1idWxsKQotCQliYXNpY19tYWNoaW5lPW02OGstYnVsbAotCQlvcz0tc3lzdjMKLQkJOzsKLQllYm1vbjI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tZWJtb24KLQkJOzsKLQllbHhzaSkKLQkJYmFzaWNfbWFjaGluZT1lbHhzaS1lbHhzaQotCQlvcz0tYnNkCi0JCTs7Ci0JZW5jb3JlIHwgdW1heCB8IG1tYXgpCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstZW5jb3JlCi0JCTs7Ci0JZXMxODAwIHwgT1NFNjhrIHwgb3NlNjhrIHwgb3NlIHwgT1NFKQotCQliYXNpY19tYWNoaW5lPW02OGstZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCWZ4MjgwMCkKLQkJYmFzaWNfbWFjaGluZT1pODYwLWFsbGlhbnQKLQkJOzsKLQlnZW5peCkKLQkJYmFzaWNfbWFjaGluZT1uczMyay1ucwotCQk7OwotCWdtaWNybykKLQkJYmFzaWNfbWFjaGluZT10cm9uLWdtaWNybwotCQlvcz0tc3lzdgotCQk7OwotCWgzMDUwciogfCBoaXV4KikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKLQkJb3M9LWhpdXh3ZTIKLQkJOzsKLQloODMwMGhtcykKLQkJYmFzaWNfbWFjaGluZT1oODMwMC1oaXRhY2hpCi0JCW9zPS1obXMKLQkJOzsKLQloODMwMHhyYXkpCi0JCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQotCQlvcz0teHJheQotCQk7OwotCWg4NTAwaG1zKQotCQliYXNpY19tYWNoaW5lPWg4NTAwLWhpdGFjaGkKLQkJb3M9LWhtcwotCQk7OwotCWhhcnJpcykKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tc3lzdjMKLQkJOzsKLQlocDMwMC0qKQotCQliYXNpY19tYWNoaW5lPW02OGstaHAKLQkJOzsKLQlocDMwMGJzZCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCW9zPS1ic2QKLQkJOzsKLQlocDMwMGhwdXgpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1ocAotCQlvcz0taHB1eAotCQk7OwotCWhwM2s5WzAtOV1bMC05XSB8IGhwOVswLTldWzAtOV0pCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAotCQk7OwotCWhwOWsyWzAtOV1bMC05XSB8IGhwOWszMVswLTldKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1ocAotCQk7OwotCWhwOWszWzItOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCi0JCTs7Ci0JaHA5azZbMC05XVswLTldIHwgaHA2WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHA5azdbMC03OV1bMC05XSB8IGhwN1swLTc5XVswLTldKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrNzhbMC05XSB8IGhwNzhbMC05XSkKLQkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbNjddMSB8IGhwOFs2N10xIHwgaHA5azgwWzI0XSB8IGhwODBbMjRdIHwgaHA5azhbNzhdOSB8IGhwOFs3OF05IHwgaHA5azg5MyB8IGhwODkzKQotCQkjIEZJWE1FOiByZWFsbHkgaHBwYTIuMC1ocAotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaHAKLQkJOzsKLQlocDlrOFswLTldWzEzNjc5XSB8IGhwOFswLTldWzEzNjc5XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCTs7Ci0JaHA5azhbMC05XVswLTldIHwgaHA4WzAtOV1bMC05XSkKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4wLWhwCi0JCTs7Ci0JaHBwYS1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0JaHBwYW9zZikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1vc2YKLQkJOzsKLQlocHBybykKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQlpMzcwLWlibSogfCBpYm0qKQotCQliYXNpY19tYWNoaW5lPWkzNzAtaWJtCi0JCW9zPS1tdnMKLQkJOzsKLSMgSSdtIG5vdCBzdXJlIHdoYXQgIlN5c3YzMiIgbWVhbnMuICBTaG91bGQgdGhpcyBiZSBzeXN2My4yPwotCWlbMzQ1NjddODZ2MzIpCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAotCQlvcz0tc3lzdjMyCi0JCTs7Ci0JaVszNDU2N104NnY0KikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zeXN2NAotCQk7OwotCWlbMzQ1NjddODZ2KQotCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKLQkJb3M9LXN5c3YKLQkJOzsKLQlpWzM0NTY3XTg2c29sMikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCi0JCW9zPS1zb2xhcmlzMgotCQk7OwotCWkzODZtYWNoKQotCQliYXNpY19tYWNoaW5lPWkzODYtbWFjaAotCQlvcz0tbWFjaAotCQk7OwotCWkzODYtdnN0YSB8IHZzdGEpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCi0JCW9zPS12c3RhCi0JCTs7Ci0JaTM4Ni1nbzMyIHwgZ28zMikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LWdvMzIKLQkJOzsKLQlpMzg2LW1pbmd3MzIgfCBtaW5ndzMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tbWluZ3czMgotCQk7OwotCWlyaXMgfCBpcmlzNGQpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zZ2kKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1pcml4KikKLQkJCTs7Ci0JCSAgICAqKQotCQkJb3M9LWlyaXg0Ci0JCQk7OwotCQllc2FjCi0JCTs7Ci0JaXNpNjggfCBpc2kpCi0JCWJhc2ljX21hY2hpbmU9bTY4ay1pc2kKLQkJb3M9LXN5c3YKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJYmFzaWNfbWFjaGluZT1tODhrLW9tcm9uCi0JCTs7Ci0JbWFnbnVtIHwgbTMyMzApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1taXBzCi0JCW9zPS1zeXN2Ci0JCTs7Ci0JbWVybGluKQotCQliYXNpY19tYWNoaW5lPW5zMzJrLXV0ZWsKLQkJb3M9LXN5c3YKLQkJOzsKLQltaW5pZnJhbWUpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKLQkJOzsKLQkqbWludCB8ICpNaU5UKQotCQliYXNpY19tYWNoaW5lPW02OGstYXRhcmkKLQkJb3M9LW1pbnQKLQkJOzsKLQltaXBzZWwqLWxpbnV4KikKLQkJYmFzaWNfbWFjaGluZT1taXBzZWwtdW5rbm93bgotCQlvcz0tbGludXgtZ251Ci0JCTs7Ci0JbWlwcyotbGludXgqKQotCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgotCQlvcz0tbGludXgtZ251Ci0JCTs7Ci0JbWlwczMqLSopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCi0JCTs7Ci0JbWlwczMqKQotCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCi0JCTs7Ci0JbW9uaXRvcikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4awotCQlvcz0tY29mZgotCQk7OwotCW1zZG9zKQotCQliYXNpY19tYWNoaW5lPWkzODYtdW5rbm93bgotCQlvcz0tbXNkb3MKLQkJOzsKLQluY3IzMDAwKQotCQliYXNpY19tYWNoaW5lPWk0ODYtbmNyCi0JCW9zPS1zeXN2NAotCQk7OwotCW5ldGJzZDM4NikKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KLQkJb3M9LW5ldGJzZAotCQk7OwotCW5ldHdpbmRlcikKLQkJYmFzaWNfbWFjaGluZT1hcm12NGwtY29yZWwKLQkJb3M9LWxpbnV4Ci0JCTs7Ci0JbmV3cyB8IG5ld3M3MDAgfCBuZXdzODAwIHwgbmV3czkwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXNvbnkKLQkJb3M9LW5ld3NvcwotCQk7OwotCW5ld3MxMDAwKQotCQliYXNpY19tYWNoaW5lPW02ODAzMC1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZXdzLTM2MDAgfCByaXNjLW5ld3MpCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zb255Ci0JCW9zPS1uZXdzb3MKLQkJOzsKLQluZWN2NzApCi0JCWJhc2ljX21hY2hpbmU9djcwLW5lYwotCQlvcz0tc3lzdgotCQk7OwotCW5leHQgfCBtKi1uZXh0ICkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5leHQKLQkJY2FzZSAkb3MgaW4KLQkJICAgIC1uZXh0c3RlcCogKQotCQkJOzsKLQkJICAgIC1uczIqKQotCQkgICAgICBvcz0tbmV4dHN0ZXAyCi0JCQk7OwotCQkgICAgKikKLQkJICAgICAgb3M9LW5leHRzdGVwMwotCQkJOzsKLQkJZXNhYwotCQk7OwotCW5oMzAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5oWzQ1XTAwMCkKLQkJYmFzaWNfbWFjaGluZT1tODhrLWhhcnJpcwotCQlvcz0tY3h1eAotCQk7OwotCW5pbmR5OTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW5pbmR5Ci0JCTs7Ci0JbW9uOTYwKQotCQliYXNpY19tYWNoaW5lPWk5NjAtaW50ZWwKLQkJb3M9LW1vbjk2MAotCQk7OwotCW5wMSkKLQkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKLQkJOzsKLQlvcDUwbi0qIHwgb3A2MGMtKikKLQkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JT1NFNjgwMDAgfCBvc2U2ODAwMCkKLQkJYmFzaWNfbWFjaGluZT1tNjgwMDAtZXJpY3Nzb24KLQkJb3M9LW9zZQotCQk7OwotCW9zNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstbm9uZQotCQlvcz0tb3M2OGsKLQkJOzsKLQlwYS1oaXRhY2hpKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtaGl0YWNoaQotCQlvcz0taGl1eHdlMgotCQk7OwotCXBhcmFnb24pCi0JCWJhc2ljX21hY2hpbmU9aTg2MC1pbnRlbAotCQlvcz0tb3NmCi0JCTs7Ci0JcGJkKQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXR0aQotCQk7OwotCXBiYikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXR0aQotCQk7OwotICAgICAgICBwYzUzMiB8IHBjNTMyLSopCi0JCWJhc2ljX21hY2hpbmU9bnMzMmstcGM1MzIKLQkJOzsKLQlwZW50aXVtIHwgcDUgfCBrNSB8IG5leGVuKQotCQliYXNpY19tYWNoaW5lPWk1ODYtcGMKLQkJOzsKLQlwZW50aXVtcHJvIHwgcDYgfCBrNiB8IDZ4ODYpCi0JCWJhc2ljX21hY2hpbmU9aTY4Ni1wYwotCQk7OwotCXBlbnRpdW1paSB8IHBlbnRpdW0yKQotCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKLQkJOzsKLQlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhlbi0qKQotCQliYXNpY19tYWNoaW5lPWk1ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtcHJvLSogfCBwNi0qIHwgNng4Ni0qKQotCQliYXNpY19tYWNoaW5lPWk2ODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKLQkJOzsKLQlwZW50aXVtaWktKiB8IHBlbnRpdW0yLSopCi0JCWJhc2ljX21hY2hpbmU9aTc4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBuKQotCQliYXNpY19tYWNoaW5lPXBuLWdvdWxkCi0JCTs7Ci0JcG93ZXIpCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQotCQk7OwotCXBwYykJYmFzaWNfbWFjaGluZT1wb3dlcnBjLXVua25vd24KLQkgICAgICAgIDs7Ci0JcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAotCQk7OwotCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQotCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCi0JICAgICAgICA7OwotCXBwY2xlLSogfCBwb3dlcnBjbGl0dGxlLSopCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwY2xlLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCi0JCTs7Ci0JcHMyKQotCQliYXNpY19tYWNoaW5lPWkzODYtaWJtCi0JCTs7Ci0Jcm9tNjhrKQotCQliYXNpY19tYWNoaW5lPW02OGstcm9tNjhrCi0JCW9zPS1jb2ZmCi0JCTs7Ci0Jcm1bNDZdMDApCi0JCWJhc2ljX21hY2hpbmU9bWlwcy1zaWVtZW5zCi0JCTs7Ci0JcnRwYyB8IHJ0cGMtKikKLQkJYmFzaWNfbWFjaGluZT1yb21wLWlibQotCQk7OwotCXNhMjkyMDApCi0JCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKLQkJb3M9LXVkaQotCQk7OwotCXNlcXVlbnQpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50Ci0JCTs7Ci0Jc2gpCi0JCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQotCQlvcz0taG1zCi0JCTs7Ci0Jc3BhcmNsaXRlLXdycykKLQkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCi0JCW9zPS12eHdvcmtzCi0JCTs7Ci0Jc3BzNykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKLQkJb3M9LXN5c3YyCi0JCTs7Ci0Jc3B1cikKLQkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KLQkJOzsKLQlzdDIwMDApCi0JCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KLQkJOzsKLQlzdHJhdHVzKQotCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cwotCQlvcz0tc3lzdjQKLQkJOzsKLQlzdW4yKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJOzsKLQlzdW4yb3MzKQotCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjJvczQpCi0JCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuM29zMykKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3MzCi0JCTs7Ci0Jc3VuM29zNCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQlvcz0tc3Vub3M0Ci0JCTs7Ci0Jc3VuNG9zMykKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXN1bm9zMwotCQk7OwotCXN1bjRvczQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCW9zPS1zdW5vczQKLQkJOzsKLQlzdW40c29sMikKLQkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0Jc3VuMyB8IHN1bjMtKikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgotCQk7OwotCXN1bjQpCi0JCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCi0JCTs7Ci0Jc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCi0JCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KLQkJOzsKLQlzeW1tZXRyeSkKLQkJYmFzaWNfbWFjaGluZT1pMzg2LXNlcXVlbnQKLQkJb3M9LWR5bml4Ci0JCTs7Ci0JdDNlKQotCQliYXNpY19tYWNoaW5lPXQzZS1jcmF5Ci0JCW9zPS11bmljb3MKLQkJOzsKLQl0eDM5KQotCQliYXNpY19tYWNoaW5lPW1pcHN0eDM5LXVua25vd24KLQkJOzsKLQl0eDM5ZWwpCi0JCWJhc2ljX21hY2hpbmU9bWlwc3R4MzllbC11bmtub3duCi0JCTs7Ci0JdG93ZXIgfCB0b3dlci0zMikKLQkJYmFzaWNfbWFjaGluZT1tNjhrLW5jcgotCQk7OwotCXVkaTI5aykKLQkJYmFzaWNfbWFjaGluZT1hMjlrLWFtZAotCQlvcz0tdWRpCi0JCTs7Ci0JdWx0cmEzKQotCQliYXNpY19tYWNoaW5lPWEyOWstbnl1Ci0JCW9zPS1zeW0xCi0JCTs7Ci0JdjgxMCB8IG5lY3Y4MTApCi0JCWJhc2ljX21hY2hpbmU9djgxMC1uZWMKLQkJb3M9LW5vbmUKLQkJOzsKLQl2YXh2KQotCQliYXNpY19tYWNoaW5lPXZheC1kZWMKLQkJb3M9LXN5c3YKLQkJOzsKLQl2bXMpCi0JCWJhc2ljX21hY2hpbmU9dmF4LWRlYwotCQlvcz0tdm1zCi0JCTs7Ci0JdnBwKnx2eHx2eC0qKQotICAgICAgICAgICAgICAgYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKLSAgICAgICAgICAgICAgIDs7Ci0Jdnh3b3Jrczk2MCkKLQkJYmFzaWNfbWFjaGluZT1pOTYwLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3M2OCkKLQkJYmFzaWNfbWFjaGluZT1tNjhrLXdycwotCQlvcz0tdnh3b3JrcwotCQk7OwotCXZ4d29ya3MyOWspCi0JCWJhc2ljX21hY2hpbmU9YTI5ay13cnMKLQkJb3M9LXZ4d29ya3MKLQkJOzsKLQl3NjUqKQotCQliYXNpY19tYWNoaW5lPXc2NS13ZGMKLQkJb3M9LW5vbmUKLQkJOzsKLQl3ODlrLSopCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS13aW5ib25kCi0JCW9zPS1wcm9lbGYKLQkJOzsKLQl4bXApCi0JCWJhc2ljX21hY2hpbmU9eG1wLWNyYXkKLQkJb3M9LXVuaWNvcwotCQk7OwotICAgICAgICB4cHMgfCB4cHMxMDApCi0JCWJhc2ljX21hY2hpbmU9eHBzMTAwLWhvbmV5d2VsbAotCQk7OwotCXo4ay0qLWNvZmYpCi0JCWJhc2ljX21hY2hpbmU9ejhrLXVua25vd24KLQkJb3M9LXNpbQotCQk7OwotCW5vbmUpCi0JCWJhc2ljX21hY2hpbmU9bm9uZS1ub25lCi0JCW9zPS1ub25lCi0JCTs7Ci0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgbWFudWZhY3R1cmVyIG9mIGNlcnRhaW4gQ1BVIHR5cGVzLiAgSXQgaXMgaW4KLSMgc29tZSBjYXNlcyB0aGUgb25seSBtYW51ZmFjdHVyZXIsIGluIG90aGVycywgaXQgaXMgdGhlIG1vc3QgcG9wdWxhci4KLQl3ODlrKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtd2luYm9uZAotCQk7OwotCW9wNTBuKQotCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCi0JCTs7Ci0Jb3A2MGMpCi0JCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1va2kKLQkJOzsKLQltaXBzKQotCQlpZiBbIHgkb3MgPSB4LWxpbnV4LWdudSBdOyB0aGVuCi0JCQliYXNpY19tYWNoaW5lPW1pcHMtdW5rbm93bgotCQllbHNlCi0JCQliYXNpY19tYWNoaW5lPW1pcHMtbWlwcwotCQlmaQotCQk7OwotCXJvbXApCi0JCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KLQkJOzsKLQlyczYwMDApCi0JCWJhc2ljX21hY2hpbmU9cnM2MDAwLWlibQotCQk7OwotCXZheCkKLQkJYmFzaWNfbWFjaGluZT12YXgtZGVjCi0JCTs7Ci0JcGRwMTEpCi0JCWJhc2ljX21hY2hpbmU9cGRwMTEtZGVjCi0JCTs7Ci0Jd2UzMmspCi0JCWJhc2ljX21hY2hpbmU9d2UzMmstYXR0Ci0JCTs7Ci0Jc3BhcmMgfCBzcGFyY3Y5KQotCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgotCQk7OwotICAgICAgICBjeWRyYSkKLQkJYmFzaWNfbWFjaGluZT1jeWRyYS1jeWRyb21lCi0JCTs7Ci0Jb3Jpb24pCi0JCWJhc2ljX21hY2hpbmU9b3Jpb24taGlnaGxldmVsCi0JCTs7Ci0Jb3Jpb24xMDUpCi0JCWJhc2ljX21hY2hpbmU9Y2xpcHBlci1oaWdobGV2ZWwKLQkJOzsKLQltYWMgfCBtcHcgfCBtYWMtbXB3KQotCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKLQkJOzsKLQlwbWFjIHwgcG1hYy1tcHcpCi0JCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1hcHBsZQotCQk7OwotCWM0eCopCi0JCWJhc2ljX21hY2hpbmU9YzR4LW5vbmUKLQkJb3M9LWNvZmYKLQkJOzsKLQkqKQotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IG1hY2hpbmUgXGAkYmFzaWNfbWFjaGluZVwnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi0KLSMgSGVyZSB3ZSBjYW5vbmljYWxpemUgY2VydGFpbiBhbGlhc2VzIGZvciBtYW51ZmFjdHVyZXJzLgotY2FzZSAkYmFzaWNfbWFjaGluZSBpbgotCSotZGlnaXRhbCopCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvZGlnaXRhbC4qL2RlYy8nYAotCQk7OwotCSotY29tbW9kb3JlKikKLQkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9jb21tb2RvcmUuKi9jYm0vJ2AKLQkJOzsKLQkqKQotCQk7OwotZXNhYwotCi0jIERlY29kZSBtYW51ZmFjdHVyZXItc3BlY2lmaWMgYWxpYXNlcyBmb3IgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotaWYgWyB4IiRvcyIgIT0geCIiIF0KLXRoZW4KLWNhc2UgJG9zIGluCi0gICAgICAgICMgRmlyc3QgbWF0Y2ggc29tZSBzeXN0ZW0gdHlwZSBhbGlhc2VzCi0gICAgICAgICMgdGhhdCBtaWdodCBnZXQgY29uZnVzZWQgd2l0aCB2YWxpZCBzeXN0ZW0gdHlwZXMuCi0JIyAtc29sYXJpcyogaXMgYSBiYXNpYyBzeXN0ZW0gdHlwZSwgd2l0aCB0aGlzIG9uZSBleGNlcHRpb24uCi0JLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKLQkJOzsKLQktc29sYXJpcykKLQkJb3M9LXNvbGFyaXMyCi0JCTs7Ci0JLXN2cjQqKQotCQlvcz0tc3lzdjQKLQkJOzsKLQktdW5peHdhcmUqKQotCQlvcz0tc3lzdjQuMnV3Ci0JCTs7Ci0JLWdudS9saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCi0JCTs7Ci0JIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KLQkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgotCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgotCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKLQkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1zdW5vcyB8IC1zdW5vc1szNF0qXAotCSAgICAgIHwgLWhwdXgqIHwgLXVub3MqIHwgLW9zZiogfCAtbHVuYSogfCAtZGd1eCogfCAtc29sYXJpcyogfCAtc3ltKiBcCi0JICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCi0JICAgICAgfCAtYW9zKiBcCi0JICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKLQkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKLQkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLW5ldGJzZCogfCAtb3BlbmJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiBcCi0JICAgICAgfCAtbHlueG9zKiB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCi0JICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAotCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAotCSAgICAgIHwgLWN5Z3dpbiogfCAtcGUqIHwgLXBzb3MqIHwgLW1vc3MqIHwgLXByb2VsZiogfCAtcnRlbXMqIFwKLQkgICAgICB8IC1taW5ndzMyKiB8IC1saW51eC1nbnUqIHwgLXV4cHYqIHwgLWJlb3MqIHwgLW1wZWl4KiB8IC11ZGsqIFwKLQkgICAgICB8IC1pbnRlcml4KiB8IC11d2luKiB8IC1yaGFwc29keSogfCAtb3BlbnN0ZXAqIHwgLW9za2l0KikKLQkjIFJlbWVtYmVyLCBlYWNoIGFsdGVybmF0aXZlIE1VU1QgRU5EIElOICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCi0JCTs7Ci0JLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAotCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogXAotCSAgICAgIHwgLW1hY29zKiB8IC1tcHcqIHwgLW1hZ2ljKiB8IC1tb245NjAqIHwgLWxuZXdzKikKLQkJOzsKLQktbWFjKikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG1hY3xtYWNvc3wnYAotCQk7OwotCS1saW51eCopCi0JCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xsaW51eHxsaW51eC1nbnV8J2AKLQkJOzsKLQktc3Vub3M1KikKLQkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNXxzb2xhcmlzMnwnYAotCQk7OwotCS1zdW5vczYqKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c3Vub3M2fHNvbGFyaXMzfCdgCi0JCTs7Ci0JLW9zZnJvc2UqKQotCQlvcz0tb3Nmcm9zZQotCQk7OwotCS1vc2YqKQotCQlvcz0tb3NmCi0JCTs7Ci0JLXV0ZWsqKQotCQlvcz0tYnNkCi0JCTs7Ci0JLWR5bml4KikKLQkJb3M9LWJzZAotCQk7OwotCS1hY2lzKikKLQkJb3M9LWFvcwotCQk7OwotCS0zODZic2QpCi0JCW9zPS1ic2QKLQkJOzsKLQktY3RpeCogfCAtdXRzKikKLQkJb3M9LXN5c3YKLQkJOzsKLQktbnMyICkKLQkgICAgICAgIG9zPS1uZXh0c3RlcDIKLQkJOzsKLQkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCi0JLXNpbml4NS4qKQotCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAotCQk7OwotCS1zaW5peCopCi0JCW9zPS1zeXN2NAotCQk7OwotCS10cml0b24qKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktb3NzKikKLQkJb3M9LXN5c3YzCi0JCTs7Ci0JLXN2cjQpCi0JCW9zPS1zeXN2NAotCQk7OwotCS1zdnIzKQotCQlvcz0tc3lzdjMKLQkJOzsKLQktc3lzdnI0KQotCQlvcz0tc3lzdjQKLQkJOzsKLQkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCi0JLXN5c3YqKQotCQk7OwotCS1vc2UqKQotCQlvcz0tb3NlCi0JCTs7Ci0JLWVzMTgwMCopCi0JCW9zPS1vc2UKLQkJOzsKLQkteGVuaXgpCi0JCW9zPS14ZW5peAotCQk7OwotICAgICAgICAtKm1pbnQgfCAtKk1pTlQpCi0JICAgICAgICBvcz0tbWludAotCQk7OwotCS1ub25lKQotCQk7OwotCSopCi0JCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgotCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAotCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKLQkJZXhpdCAxCi0JCTs7Ci1lc2FjCi1lbHNlCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KLSMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCi0jIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCi0KLSMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKLSMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKLSMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQotIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCi0jIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgotCi1jYXNlICRiYXNpY19tYWNoaW5lIGluCi0JKi1hY29ybikKLQkJb3M9LXJpc2NpeDEuMgotCQk7OwotCWFybSotY29yZWwpCi0JCW9zPS1saW51eAotCQk7OwotCWFybSotc2VtaSkKLQkJb3M9LWFvdXQKLQkJOzsKLSAgICAgICAgcGRwMTEtKikKLQkJb3M9LW5vbmUKLQkJOzsKLQkqLWRlYyB8IHZheC0qKQotCQlvcz0tdWx0cml4NC4yCi0JCTs7Ci0JbTY4Ki1hcG9sbG8pCi0JCW9zPS1kb21haW4KLQkJOzsKLQlpMzg2LXN1bikKLQkJb3M9LXN1bm9zNC4wLjIKLQkJOzsKLQltNjgwMDAtc3VuKQotCQlvcz0tc3Vub3MzCi0JCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQotCQkjIGRlZmF1bHQuCi0JCSMgb3M9LXN1bm9zNAotCQk7OwotCW02OCotY2lzY28pCi0JCW9zPS1hb3V0Ci0JCTs7Ci0JbWlwcyotY2lzY28pCi0JCW9zPS1lbGYKLQkJOzsKLQltaXBzKi0qKQotCQlvcz0tZWxmCi0JCTs7Ci0JKi10dGkpCSMgbXVzdCBiZSBiZWZvcmUgc3BhcmMgZW50cnkgb3Igd2UgZ2V0IHRoZSB3cm9uZyBvcy4KLQkJb3M9LXN5c3YzCi0JCTs7Ci0Jc3BhcmMtKiB8ICotc3VuKQotCQlvcz0tc3Vub3M0LjEuMQotCQk7OwotCSotYmUpCi0JCW9zPS1iZW9zCi0JCTs7Ci0JKi1pYm0pCi0JCW9zPS1haXgKLQkJOzsKLQkqLXdlYykKLQkJb3M9LXByb2VsZgotCQk7OwotCSotd2luYm9uZCkKLQkJb3M9LXByb2VsZgotCQk7OwotCSotb2tpKQotCQlvcz0tcHJvZWxmCi0JCTs7Ci0JKi1ocCkKLQkJb3M9LWhwdXgKLQkJOzsKLQkqLWhpdGFjaGkpCi0JCW9zPS1oaXV4Ci0JCTs7Ci0JaTg2MC0qIHwgKi1hdHQgfCAqLW5jciB8ICotYWx0b3MgfCAqLW1vdG9yb2xhIHwgKi1jb252ZXJnZW50KQotCQlvcz0tc3lzdgotCQk7OwotCSotY2JtKQotCQlvcz0tYW1pZ2FvcwotCQk7OwotCSotZGcpCi0JCW9zPS1kZ3V4Ci0JCTs7Ci0JKi1kb2xwaGluKQotCQlvcz0tc3lzdjMKLQkJOzsKLQltNjhrLWNjdXIpCi0JCW9zPS1ydHUKLQkJOzsKLQltODhrLW9tcm9uKikKLQkJb3M9LWx1bmEKLQkJOzsKLQkqLW5leHQgKQotCQlvcz0tbmV4dHN0ZXAKLQkJOzsKLQkqLXNlcXVlbnQpCi0JCW9zPS1wdHgKLQkJOzsKLQkqLWNyZHMpCi0JCW9zPS11bm9zCi0JCTs7Ci0JKi1ucykKLQkJb3M9LWdlbml4Ci0JCTs7Ci0JaTM3MC0qKQotCQlvcz0tbXZzCi0JCTs7Ci0JKi1uZXh0KQotCQlvcz0tbmV4dHN0ZXAzCi0JCTs7Ci0gICAgICAgICotZ291bGQpCi0JCW9zPS1zeXN2Ci0JCTs7Ci0gICAgICAgICotaGlnaGxldmVsKQotCQlvcz0tYnNkCi0JCTs7Ci0JKi1lbmNvcmUpCi0JCW9zPS1ic2QKLQkJOzsKLSAgICAgICAgKi1zZ2kpCi0JCW9zPS1pcml4Ci0JCTs7Ci0gICAgICAgICotc2llbWVucykKLQkJb3M9LXN5c3Y0Ci0JCTs7Ci0JKi1tYXNzY29tcCkKLQkJb3M9LXJ0dQotCQk7OwotCWYzMDEtZnVqaXRzdSkKLQkJb3M9LXV4cHYKLQkJOzsKLQkqLXJvbTY4aykKLQkJb3M9LWNvZmYKLQkJOzsKLQkqLSpidWcpCi0JCW9zPS1jb2ZmCi0JCTs7Ci0JKi1hcHBsZSkKLQkJb3M9LW1hY29zCi0JCTs7Ci0JKi1hdGFyaSopCi0JCW9zPS1taW50Ci0JCTs7Ci0JKikKLQkJb3M9LW5vbmUKLQkJOzsKLWVzYWMKLWZpCi0KLSMgSGVyZSB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGUgb3MsIGFuZCB0aGUgQ1BVIHR5cGUsIGJ1dCBub3QgdGhlCi0jIG1hbnVmYWN0dXJlci4gIFdlIHBpY2sgdGhlIGxvZ2ljYWwgbWFudWZhY3R1cmVyLgotdmVuZG9yPXVua25vd24KLWNhc2UgJGJhc2ljX21hY2hpbmUgaW4KLQkqLXVua25vd24pCi0JCWNhc2UgJG9zIGluCi0JCQktcmlzY2l4KikKLQkJCQl2ZW5kb3I9YWNvcm4KLQkJCQk7OwotCQkJLXN1bm9zKikKLQkJCQl2ZW5kb3I9c3VuCi0JCQkJOzsKLQkJCS1haXgqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLWJlb3MqKQotCQkJCXZlbmRvcj1iZQotCQkJCTs7Ci0JCQktaHB1eCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1tcGVpeCopCi0JCQkJdmVuZG9yPWhwCi0JCQkJOzsKLQkJCS1oaXV4KikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktdW5vcyopCi0JCQkJdmVuZG9yPWNyZHMKLQkJCQk7OwotCQkJLWRndXgqKQotCQkJCXZlbmRvcj1kZwotCQkJCTs7Ci0JCQktbHVuYSopCi0JCQkJdmVuZG9yPW9tcm9uCi0JCQkJOzsKLQkJCS1nZW5peCopCi0JCQkJdmVuZG9yPW5zCi0JCQkJOzsKLQkJCS1tdnMqKQotCQkJCXZlbmRvcj1pYm0KLQkJCQk7OwotCQkJLXB0eCopCi0JCQkJdmVuZG9yPXNlcXVlbnQKLQkJCQk7OwotCQkJLXZ4c2ltKiB8IC12eHdvcmtzKikKLQkJCQl2ZW5kb3I9d3JzCi0JCQkJOzsKLQkJCS1hdXgqKQotCQkJCXZlbmRvcj1hcHBsZQotCQkJCTs7Ci0JCQktaG1zKikKLQkJCQl2ZW5kb3I9aGl0YWNoaQotCQkJCTs7Ci0JCQktbXB3KiB8IC1tYWNvcyopCi0JCQkJdmVuZG9yPWFwcGxlCi0JCQkJOzsKLQkJCS0qbWludCB8IC0qTWlOVCkKLQkJCQl2ZW5kb3I9YXRhcmkKLQkJCQk7OwotCQllc2FjCi0JCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgInMvdW5rbm93bi8kdmVuZG9yLyJgCi0JCTs7Ci1lc2FjCi0KLWVjaG8gJGJhc2ljX21hY2hpbmUkb3MKZGlmZiAtLWdpdCBhL2NvbmZpZy9DaGFuZ2VMb2cgYi9jb25maWcvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDZmYzYwLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotMTk5OS0wNC0wNyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIG10LWQzMHY6IE5ldyBmaWxlLCBwYXNzIC1nIC1PcyAtV2EsLUMgYXMgZGVmYXVsdCBvcHRpb25zLgotCi0xOTk5LTAyLTA4ICBTeWQgUG9sayAgPHNwb2xrQGN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogQWRkZWQgbWFjcm9zIHRvIGZpbmQgaXRjbCBmaWxlcy4KLQlFeHBvcnQgVENMX0NGTEFHUyBmcm9tIHRjbENvbmZpZy5zaC4KLQlFeHBvcnQgVENMX0xJQl9GVUxMX1BBVEgsIFRLX0xJQl9GVUxMX1BBVEgsIElUQ0xfTElCX0ZVTExfUEFUSCwKLQlJVEtfTElCX0ZVTExfUEFUSCwgYW5kIFRJWF9MSUJfRlVMTF9QQVRICi0JUmVwbGFjZSBUSVggbWFjcm9zIHdpdGggYmV0dGVyIG9uZXMgZnJvbSBzbmF2aWdhdG9yLgotCi1UdWUgRmViICAyIDIyOjUxOjIxIDE5OTkgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogbWgtYXJtcGljOiBOZXcgZmlsZS4gIFBhdGNoIGZyb20gSmltIFBpY2sgPGppbUBqaW1waWNrLmNvbT4uCi0JKiBtdC1hcm1waWM6IExpa2V3aXNlLgotCi1Nb24gSmFuIDE4IDE5OjQxOjA4IDE5OTkgIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGN5Z3dpbi5taDogQWN0aXZhdGUgY29tbWVudGVkIG91dCBkZXBlbmRlbmNpZXMgZm9yCi0JZ2RiOiBsaWJ0ZXJtY2FwLgotCi1XZWQgTm92IDE4IDIwOjI5OjQ2IDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGN5Z3dpbi5taDogQWRkIGV4dHJhIGxpYnRlcm1jYXAgdGFyZ2V0IGluZm9ybWF0aW9uLgotCUFkZCBjb21tZW50ZWQgb3V0IGRlcGVuZGVuY3kgZm9yIGdkYiB0byBsaWJ0ZXJtY2FwIGZvcgotCWZ1dHVyZSByZWFkbGluZSByZXF1aXJlbWVudC4KLQotTW9uIE5vdiAgMiAxNToxNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogbWgtY3lnd2luMzI6IGRlbGV0ZQotICAgICAgICAqIG1oLWN5Z3dpbjogd2FzIG1oLWN5Z3dpbjMyCi0KLTE5OTgtMTAtMjYgIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00OiBUQ0xIRElSIGFuZCBUS0hESVIgbmVlZCB0byBiZSBydW4gdGhyb3VnaAotCWN5Z3BhdGggZm9yIE1pY3Jvc29mdCBidWlsZHMuCi0KLTE5OTgtMTAtMjAgIFN5ZCBQb2xrICA8c3BvbGtAY3lnbnVzLmNvbT4KLQotCSogYWNpbmNsdWRlLm00OiBSZS1leHBvcnRlZCBUQ0xfTElCUyBhbmQgVENMX0xEX1NFQVJDSF9GTEFHUwotCWJlY2F1c2UgaXRjbCBuZWVkcyB0aGVtLgotCi1Nb24gQXVnIDMxIDE3OjUwOjUzIDE5OTggIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBtaC1haXg0MyAoTk1fRk9SX1RBUkdFVCk6IEFkZCAtWDMyXzY0IGFzIHdlbGwuCi0KLVNhdCBBdWcgMjkgMTQ6MzI6NTUgMTk5OCAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIG1oLWFpeDQzOiBOZXcgZmlsZS4KLQotTW9uIEF1ZyAxMCAwMDoxNTo0NyAxOTk4ICBISiBMdSAoaGpsQGdudS5vcmcpCi0KLQkqIG10LWxpbnV4IChDWFhGTEFHU19GT1JfVEFSR0VUKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLTE5OTgtMDUtMjkgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGNvbGxlY3Rpb24gb2YgZ2VuZXJpYyBhdXRvY29uZiBtYWNyb3MuCi0JCi1XZWQgQXByIDIyIDEyOjI0OjI4IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBtdC1vc3BhY2U6IE5ldyBmaWxlLCBzdXBwb3J0IHVzaW5nIC1PcyBpbnN0ZWFkIG9mIC1PMiB0byBjb21waWxlCi0JdGhlIGxpYnJhcmllcy4KLQotV2VkIEFwciAyMiAxMDo1MzoxNCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbXQtbGludXggKENYWEZMQUdTX0ZPUl9UQVJHRVQpOiBTZXQgdGhpcyBpbnN0ZWFkIG9mIENYWEZMQUdTLgotCi1TYXQgQXByIDExIDIyOjQzOjE3IDE5OTggIEouIEtlYW4gSm9obnN0b24gIDxqa2pAc2NvLmNvbT4KLQotCSogbWgtc3ZzdjU6IE5ldyBmaWxlIC0gc3VwcG9ydCBmb3IgU0NPIFVuaXhXYXJlIDcgLyBTVlI1LgotCi1UaHUgTWFyIDI2IDAxOjU0OjI1IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBzdG9wIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyBkb3NyZWwuCi0KLVRodSBTZXAgMTEgMTY6NDM6MjcgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBtaC1lbGZhbHBoYXBpYywgbXQtZWxmYWxwaGFwaWM6IE5ldyBmaWxlcy4KLQotV2VkIEp1bCAyMyAxMjozMjoxOCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIG1oLWdvMzIgKENGTEFHUyk6IERvbid0IHNldCAtZm5vLW9taXQtZnJhbWUtcG9pbnRlci4KLQotTW9uIEp1biAxNiAxOTowNjo0MSAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBtaC1wcGNwaWM6IE5ldyBmaWxlLgotCSogbXQtcHBjcGljOiBOZXcgZmlsZS4KLQotVGh1IE1hciAyNyAxNTo1Mjo0MCAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBtaC1jeWd3aW4zMjogb3ZlcnJpZGUgQ1hYRkxBR1MsIHNldHRpbmcgdG8gLU8yIG9ubHkKLQkobm8gZGVidWcpCi0KLVR1ZSBNYXIgMjUgMTg6MTY6NDMgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogbWgtY3lnd2luMzI6IG92ZXJyaWRlIExJQkdDQzJfREVCVUdfQ0ZMQUdTIHNvIGRlYnVnIGluZm8KLQlpc24ndCBpbmNsdWRlZCBpbiBjeWd3aW4zMi1ob3N0ZWQgbGliZ2NjMi5hIGJ5IGRlZmF1bHQKLQotV2VkIEphbiAgOCAxOTo1Njo0MyAxOTk3ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogbWgtY3lnd2luMzI6IG92ZXJyaWRlIENGTEFHUyBzbyBkZWJ1ZyBpbmZvIGlzbid0IGluY2x1ZGVkCi0gICAgICAgIGluIGN5Z3dpbjMyLWhvc3RlZCB0b29scyBieSBkZWZhdWx0Ci0KLVR1ZSBEZWMgMzEgMTY6MDQ6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1saW51eDogUmVtb3ZlLgotCi1Nb24gTm92IDExIDEwOjI5OjUxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbXQtcHBjOiBEZWxldGUgZmlsZSwgb3B0aW9ucyBtb3ZlZCB0byBuZXdsaWIgY29uZmlndXJlLgotCi1GcmkgT2N0ICA0IDEyOjIxOjAzIDE5OTYgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBtaC1kZ3V4Mzg2OiBOZXcgZmlsZS4gIHg4NiBkZ3V4IHNwZWNpZmljIGZsYWdzCi0KLU1vbiBTZXAgMzAgMTU6MTA6MDcgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWgtbXB3IChFWFRSQUxJQlNfUFBDX1hDT0ZGKTogTmV3LCB3YXMgRVhUUkFMSUJTX1BQQy4KLQkoRVhUUkFMSUJTX1BQQyk6IFVzZSBzaGFyZWQgbGlicmFyaWVzIGluc3RlYWQgb2YgeGNvZmYuCi0KLVNhdCBBdWcgMTcgMDQ6NTY6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAc2thcm8uY3lnbnVzLmNvbT4KLQotCSogbWgtY3lnd2luMzI6IGRvbid0IC1EX1dJTjMyIGhlcmUgYW55bW9yZQotCi1UaHUgQXVnIDE1IDE5OjQ2OjQ0IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdyAoU0VHRkxBR182OEssIFNFR0ZMQUdfUFBDKTogUmVtb3ZlLgotCShFWFRSQUxJQlNfUFBDKTogQWRkIGxpYmdjYy54Y29mZi4KLQotVGh1IEF1ZyAgOCAxNDo1MTo0NyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIG10LXBwYzogTmV3IGZpbGUsIGFkZCAtbXJlbG9jYXRhYmxlLWxpYiBhbmQgLW1uby1lYWJpIHRvIGFsbAotCXRhcmdldCBidWlsZHMgZm9yIFBvd2VyUEMgZWFiaSB0YXJnZXRzLgotCi1GcmkgSnVsIDEyIDEyOjA2OjAxIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3OiBOZXcgc3ViZGlyLCBNYWMgTVBXIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCBiaXRzLgotCi1Nb24gSnVsICA4IDE3OjMwOjUyIDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogbWgtaXJpeDY6IE5ldyBmaWxlLgotCi1Nb24gSnVsICA4IDE1OjE1OjM3IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogbXQtc3BhcmNwaWMgKFBJQ0ZMQUdfRk9SX1RBUkdFVCk6IFVzZSAtZlBJQy4KLQotRnJpIEp1bCAgNSAxMTo0OTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLWlyaXg0IChSQU5MSUIpOiBEb24ndCBkZWZpbmU7IElyaXggNCBkb2VzIGhhdmUgcmFubGliLgotCi1TdW4gSnVuIDIzIDIyOjU5OjI1IDE5OTYgIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIG1oLWN5Z3dpbjMyOiBuZXcgZmlsZS4gIExpa2UgbWgtZ28zMiB3aXRob3V0IHRoZSBDRkxBR1MgZW50cnkuCi0KLVR1ZSBNYXIgMjYgMTQ6MTA6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1nbzMyIChDRkxBR1MpOiBEZWZpbmUuCi0KLVRodSBNYXIgMTQgMTk6MjA6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1uZWN2NDogTmV3IGZpbGUuCi0KLVRodSBGZWIgMTUgMTM6MDc6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaC1jeHV4IChDQyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZMQUdTLCBMREZMQUdTKTogUmVtb3ZlLgotCSogbWgtbmNyc3ZyNDMgKENDKTogTmV3IHZhcmlhYmxlLgotCShDRkxBR1MpOiBSZW1vdmUuCi0JKiBtaC1zb2xhcmlzIChDRkxBR1MpOiBSZW1vdmUuCi0KLQkqIG1oLWdvMzI6IFJlbW92ZSBtb3N0IHZhcmlhYmxlIHNldHRpbmdzLCBzaW5jZSB0aGV5IHByZXN1bWVkIGEKLQlDYW5hZGlhbiBDcm9zcywgd2hpY2ggaXMgbm93IGhhbmRsZWQgY29ycmVjdGx5IGJ5IHRoZSBjb25maWd1cmUKLQlzY3JpcHQuCi0KLQkqIG1oLXNwYXJjcGljIChQSUNGTEFHKTogU2V0IHRvIC1mUElDLCBub3QgLWZwaWMuCi0KLU1vbiBGZWIgMTIgMTQ6NTM6MzkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG1oLW02OGtwaWMsIG10LW02OGtwaWM6IE5ldyBmaWxlcy4KLQotVGh1IEZlYiAgMSAxNDoxNTo0MiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKENDX01XQzY4Syk6IEFkZCBvcHRpb25zIHNpbWlsYXIgdG8gdGhvc2UgdXNlZAotCWluIENDX01XQ1BQQywgYW5kIC1tYzY4MDIwIC1tb2RlbCBmYXIuCi0JKEFSX01XTElOSzY4Syk6IEFkZCAteG0gbGlicmFyeS4KLQkoQVJfQVIpOiBEZWZpbmUuCi0JKENDX0xEX01XTElOSzY4Syk6IFJlbW92ZSAtZC4KLQkoRVhUUkFMSUJTX01XQzY4Syk6IERlZmluZS4KLQotVGh1IEphbiAyNSAxNjowNTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1oLW5jcnN2cjQzIChDRkxBR1MpOiBSZW1vdmUgLUhub2NvcHlyLgotCi1UdWUgTm92ICA3IDE1OjQxOjMwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1oLW1wdyAoQ0NfTVdDNjhLLCBDQ19NV0NQUEMpOiBSZW1vdmUgdW51c2VkIGluY2x1ZGUgcGF0aC4KLQkoQ0NfTVdDUFBDKTogQWRkIC1tcHdfY2hhcnMsIGRpc2FibGUgd2FybmluZ3MsIGFkZCBjb21tZW50cwotCWV4cGxhaW5pbmcgcmVhc29ucyBmb3IgdmFyaW91cyBmbGFncy4KLQkoRVhUUkFMSUJTX1BQQywgRVhUUkFMSUJTX01XQ1BQQyApOiBQdXQgcnVudGltZSBsaWJyYXJ5IGZpcnN0LgotCQotRnJpIE9jdCAxMyAxNDo0NDoyNSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogbWgtYWl4LCBtaC1zdW46ICBSZW1vdmVkLgotCi0JKiBtaC1kZWNzdGF0aW9uIChYMTFfRVhUUkFfQ0ZMQUdTKTogRGVmaW5lLgotCi0JKiBtaC1zY28sIG1oLXNvbGFyaXMsIG1oLXN5c3Y0IChYMTFfRVhUUkFfTElCUyk6IERlZmluZS4KLQotICAgICAgICAqIG1oLWhwMzAwLCBtaC1ocHV4LCBtaC1ocHV4OCwgbWgtc29sYXJpcywgbWgtc3VuMywgbWgtc3lzdjQ6IERvbid0IAotCWhhcmRjb2RlIGxvY2F0aW9uIG9mIFggc3R1ZmYgaGVyZS4KLQotVGh1IFNlcCAyOCAxMzoxNDo1NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHc6IEFkZCBkZWZpbml0aW9ucyBmb3IgdmFyaW91cyA2OEsgYW5kIFBvd2VyTWFjCi0JY29tcGlsZXJzLCBhZGQgZGVmaW5pdGlvbnMgZm9yIGxpYnJhcnkgYW5kIGxpbmsgc3RlcHMgZm9yCi0JUG93ZXJNYWNzLgotCi1UaHUgU2VwIDE0IDA4OjIwOjA0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBtaC1ocDMwMCAoQ0MpOiBBZGQgIkNDID0gY2MgLVdwLC1IMjU2MDAwIiB0byBhdm9pZAotCSJ0b28gbXVjaCBkZWZpbmluZyIgZXJyb3JzIGZyb20gdGhlIEhQVVggY29tcGlsZXIuCi0KLVRodSBBdWcgMTcgMTc6Mjg6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBtaC1ocDMwMCAoUkFOTElCKTogVXNlICJhciB0cyIsIGluIGNhc2UgR05VIGFyIHdhcyB1c2VkIGFuZAotCWRpZG4ndCBidWlsZCBhIHN5bWJvbCB0YWJsZS4KLQotVGh1IEp1biAyMiAxNzo0NzoyNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKENDKTogRGVmaW5lIEFOU0lfUFJPVE9UWVBFUy4KLQotTW9uIEFwciAxMCAxMjoyOTo0OCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1taC1tcHcgKEVYVFJBTElCUyk6IEFsd2F5cyBsaW5rIGluIE1hdGgubywgQ1NBTkVMSUIubywKLSAgICAgICAgYW5kIFRvb2xMaWJzLm8uCi0KLQkqIG1wdy1taC1tcHcgKENDKTogRGVmaW5lIEFMTU9TVF9TVERDLgotCShDRkxBR1MpOiBSZW1vdmUgQUxNT1NUX1NUREMsIC1tYzY4ODgxLgotCShMREZMQUdTKTogYWRkIC13LgotCi0JKiBtcHctbWgtbXB3IChDRkxBR1MpOiBBZGQgLWIgb3B0aW9uIHRvIHB1dCBzdHJpbmdzIGF0IHRoZSBlbmRzIG9mCi0JZnVuY3Rpb25zLgotCi0JKiBtcHctbWgtbXB3OiBOZXcgZmlsZSwgaG9zdCBtYWtlZmlsZSBkZWZpbml0aW9ucyBmb3IgTVBXLgotCi1GcmkgTWFyIDMxIDExOjM1OjE3IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIG10LW5ldHdhcmU6IE5ldyBmaWxlLgotCi1Nb24gTWFyIDEzIDEyOjMxOjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtaHB1eDg6IE5ldyBmaWxlLgotCSogbWgtaHB1eDogVXNlIFgxMVI1IHJhdGhlciB0aGFuIFgxMVI0LgotCi1UaHUgRmViICA5IDExOjA0OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWgtbGludXggKFNZU1YpOiBEb24ndCBkZWZpbmUuCi0JKFJBTkxJQik6IERvbid0IGRlZmluZS4KLQotV2VkIEphbiAxMSAxNjoyOTozNCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogbT8tKnBpYyAoTElCQ1hYRkxBR1MpOiBBZGQgLWZuby1pbXBsaWNpdC10ZW1wbGF0ZXMuCi0KLVRodSBOb3YgIDMgMTc6Mjc6MTkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbWgtaXJpeDQgKENDKTogSW5jcmVhc2UgbWF4aW11bSBzdHJpbmcgbGVuZ3RoLgotCi0JKiBtaC1zY28gKENDKTogRGVmaW5lIGF3YXkgY29uc3QsIGl0IGRvZXNuJ3Qgd29yayByaWdodDsgZWxlbWVudHMKLQlvZiBhcnJheXMgb2YgcHRyLXRvLWNvbnN0IGFyZSBjb25zaWRlcmVkIGNvbnN0IHRoZW1zZWx2ZXMuCi0KLVNhdCBKdWwgMTYgMTI6MTc6NDkgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBtaC1jeHV4OiBOZXcgZmlsZSwgZnJvbSBCb2IgUnVzayAocnJ1c2tAbWFpbC5jc2QuaGFycmlzLmNvbSkuCi0KLVNhdCBKdW4gIDQgMTc6MjI6MTIgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIG1oLW5jcnN2cjQzOiAgTmV3IGZpbGUgZnJvbSBUb20gTWNDb25uZWxsCi0JPHRtY2Nvbm5lQHNlZG9uYS5pbnRlbC5jb20+LgotCi1UaHUgTWF5IDE5IDAwOjMyOjExIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBtaC1ocHV4IChDQyk6IEFkZCAtV3AsLUgyNTYwMDAgdG8gYXZvaWQgInRvbyBtdWNoIGRlZmluaW5nIgotCWVycm9ycyBmcm9tIHRoZSBIUFVYIDggY29tcGlsZXJzLgotCi1XZWQgTWF5ICA0IDIwOjE0OjQ3IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogbWgtbHlueHJzNms6IHNldCBTSEVMTCB0byAvYmluL2Jhc2gKLQotVHVlIEFwciAxMiAxMjozODoxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1oLWlyaXg0IChDQyk6IENoYW5nZSAtWE5oMTUwMCB0byAtWE5oMjAwMC4KLQotU2F0IERlYyAyNSAyMDowMzo0NSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbXQtaHBwYTogRGVsZXRlLgotCi1UdWUgTm92IDE2IDIyOjU0OjM5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtaC1hNjhic2Q6IERlZmluZSBDQyB0byBnY2MuCi0KLU1vbiBOb3YgMTUgMTY6NTY6NTEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLWxpbnV4OiBEb24ndCBwdXQgLXN0YXRpYyBpbiBMREZMQUdTLiAgQWRkIGNvbW1lbnRzLgotCi1Nb24gTm92IDE1IDEzOjM3OjU4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogbWgtc3lzdjQgKEFSX0ZMQUdTKTogY2hhbmdlIGZyb20gY3EgdG8gY3IKLQotRnJpIE5vdiAgNSAwODoxMjozMiAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGJsdWVzLmN5Z251cy5jb20pCi0KLQkqIG1oLXVuaXh3YXJlOiByZW1vdmUuICBJdCdzIHRoZSBzYW1lIGFzIHN5c3Y0LCBhbmQgY29uZmlnLmd1ZXNzCi0JY2FuJ3QgdGVsbCB0aGUgZGlmZmVyZW5jZS4gIFNvIGRvbid0IGFsbG93IHNrZXcuCi0KLVdlZCBPY3QgMjAgMjA6MzU6MTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIG1oLWhwMzAwOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLCBidXQgYWRkIGNvbW1lbnQgZXhwbGFpbmluZy4KLQotVHVlIE9jdCAxOSAxODo1ODoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWgtaHAzMDA6IERvbid0IGRlZmluZSBDRkxBR1MgdG8gZW1wdHkuICBXaHkgc2hvdWxkIGhwMzAwIGJlCi0JZGlmZmVyZW50IGZyb20gYW55dGhpbmcgZWxzZT8gICgiZ2RiIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgbmF0aXZlCi0JZGVidWcgZm9ybWF0IiBpc24ndCBhIGdvb2QgZW5vdWdoIGFuc3dlciBiZWNhdXNlIHdlIG1pZ2h0IGJlIHVzaW5nCi0JZ2NjKS4KLQotVHVlIE9jdCAgNSAxMjoxNzo0MCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG1oLWFscGhhb3NmOiBSZW1vdmUsIG5vIGxvbmdlciBuZWNlc3Nhcnkgbm93IHRoYXQgZ2RiIGtub3dzCi0JaG93IHRvIGhhbmRsZSBPU0YvMSBzaGFyZWQgbGlicmFyaWVzLgotCi1UdWUgSnVsICA2IDExOjI3OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIG1oLWFscGhhb3NmOiBOZXcgZmlsZS4KLQotVGh1IEp1bCAgMSAxNTo0OTozMyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWgtcmlzY29zOiBOZXcgZmlsZS4KLQotTW9uIEp1biAxNCAxMjowMzoxOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIG1oLWFpeCwgbWgtYWl4Mzg2LCBtaC1kZWNzdGF0aW9uLCBtaC1kZWx0YTg4LCBtaC1ocHV4LCBtaC1pcml4NCwKLQltaC1uY3IzMDAwLCBtaC1zb2xhcmlzLCBtaC1zeXN2LCBtaC1zeXN2NDogcmVtb3ZlIElOU1RBTEw9Y3AgbGluZSwKLQlub3cgdGhhdCB3ZSdyZSB1c2luZyBpbnN0YWxsLnNoIGdsb2JhbGx5Ci0KLUZyaSBKdW4gIDQgMTY6MDk6MzQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaC1zeXN2NCAoSU5TVEFMTCk6IFVzZSBjcCwgbm90IC91c3IvdWNiL2luc3RhbGwuCi0KLVRodSBBcHIgIDggMTE6MjE6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtdC1hMjlrLCBtdC1lYm1vbjI5aywgbXQtb3M2OGssIG10LW9zZTY4MDAwLCBtdC1vc2U2OGssCi0JbXQtdnh3b3JrczY4LCBtdC12eHdvcmtzOTYwOiBSZW1vdmVkIG9ic29sZXRlLCB1bnVzZWQgdGFyZ2V0Ci0JTWFrZWZpbGUgZnJhZ21lbnQgZmlsZXMuCi0KLU1vbiBNYXIgIDggMTU6MDU6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBtaC1haXgzODY6IE5ldyBmaWxlOyBvbGQgbWgtYWl4LCBwbHVzIG5vLW9wIFJBTkxJQi4KLQotVGh1IE9jdCAgMSAxMzo1MDo0OCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIG1oLXNvbGFyaXM6IElOU1RBTEwgaXMgTk9UIC91c3IvdWNiL2luc3RhbGwKLQotTW9uIEF1ZyAyNCAxNDoyNTozNSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG10LW9zZTY4MDAwLCBtdC1vc2U2OGs6IHJlbmFtZWQgZnJvbSBtdC1PU0UqLgotCi1UdWUgSnVsIDIxIDAyOjExOjAxIDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogbXQtT1NFNjhrLCBtdC02ODAwMDA6IG5ldyBjb25maWdzLgotCi1UaHUgSnVsIDE2IDE3OjEyOjA5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogbWgtaXJpeDQ6IG1lcmdlZCBjaGFuZ2VzIGZyb20gcHJvZ3Jlc3NpdmUuCi0KLVR1ZSBKdW4gIDkgMjM6Mjk6MzggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBFdmVyeXdoZXJlOiBDaGFuZ2UgUkFOTElCPWVjaG8+L2Rldi9udWxsICh3aGljaCBjb25mdXNlcwotCXNvbWUgc2hlbGxzIC0gYW5kIEkgZG9uJ3QgYmxhbWUgdGhlbSkgdG8gUkFOTElCPXRydWUuCi0JKiBtaC1zb2xhcmlzOiAgVXNlIC91c3IvdWNiL2luc3RhbGwgZm9yIElOU1RBTEwuCi0KLVN1biBNYXkgMzEgMTQ6NDU6MjMgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW4gYXQgY3lnbnVzLmNvbSkKLQotCSogbWgtc29sYXJpczI6IEFkZCBuZXcgY29uZmlndXJhdGlvbiBmb3IgU29sYXJpcyAyIChzeXN2LCBubyByYW5saWIpCi0KLUZyaSBBcHIgMTAgMjM6MTA6MDggMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIG1oLW5jcjMwMDA6ICBBZGQgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIE5DUiAzMDAwLgotCi1UdWUgRGVjIDEwIDAwOjEwOjU1IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogQ2hhbmdlTG9nOiBmcmVzaCBjaGFuZ2Vsb2cuCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9hY2luY2x1ZGUubTQgYi9jb25maWcvYWNpbmNsdWRlLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNzk5Y2VkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTk0ICswLDAgQEAKLWRubCBUaGlzIGZpbGUgaXMgaW5jbHVkZWQgaW50byBhbGwgYW55IG90aGVyIGFjaW5jbHVkZSBmaWxlIHRoYXQgbmVlZHMKLWRubCB0byB1c2UgdGhlc2UgbWFjcm9zLgotCi1kbmwgVGhpcyBpcyBjb3BpZWQgZnJvbSBhdXRvY29uZiAyLjEyLCBidXQgZG9lcyBjYWxscyBvdXIgb3duIEFDX1BST0dfQ0NfV09SS1MsCi1kbmwgYW5kIGRvZXNuJ3QgY2FsbCBBQ19QUk9HX0NYWF9HTlUsIGNhdXNlIHdlIHRlc3QgZm9yIHRoYXQgaW4gIEFDX1BST0dfQ0NfV09SS1MuCi1kbmwgV2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHdoaWNoIHdpbGwgbm90IGJlIGFibGUgdG8gZnVsbHkKLWRubCBsaW5rIGFuIGV4ZWN1dGFibGUuICBUaGlzIHNob3VsZCByZWFsbHkgYmUgZml4ZWQgaW4gYXV0b2NvbmYgaXRzZWxmLgotZG5sIEZpbmQgYSB3b3JraW5nIEcrKyBjcm9zcyBjb21waWxlci4gVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgR05VIEMrKyBjb21waWxlci4KLUFDX0RFRlVOKENZR19BQ19QUk9HX0NYWF9DUk9TUywKLVtBQ19CRUZPUkUoWyQwXSwgW0FDX1BST0dfQ1hYQ1BQXSkKLUFDX0NIRUNLX1BST0dTKENYWCwgJENDQyBjKysgZysrIGdjYyBDQyBjeHggY2MrKywgZ2NjKQotCi1DWUdfQUNfUFJPR19HWFhfV09SS1MKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19neHggPSB5ZXM7IHRoZW4KLSAgR1hYPXllcwotZG5sIENoZWNrIHdoZXRoZXIgLWcgd29ya3MsIGV2ZW4gaWYgQ1hYRkxBR1MgaXMgc2V0LCBpbiBjYXNlIHRoZSBwYWNrYWdlCi1kbmwgcGxheXMgYXJvdW5kIHdpdGggQ1hYRkxBR1MgKHN1Y2ggYXMgdG8gYnVpbGQgYm90aCBkZWJ1Z2dpbmcgYW5kCi1kbmwgbm9ybWFsIHZlcnNpb25zIG9mIGEgbGlicmFyeSksIHRhc3RlbGVzcyBhcyB0aGF0IGlkZWEgaXMuCi0gIGFjX3Rlc3RfQ1hYRkxBR1M9IiR7Q1hYRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DWFhGTEFHUz0iJENYWEZMQUdTIgotICBDWFhGTEFHUz0KLSAgQUNfUFJPR19DWFhfRwotICBpZiB0ZXN0ICIkYWNfdGVzdF9DWFhGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDWFhGTEFHUz0iJGFjX3NhdmVfQ1hYRkxBR1MiCi0gIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jeHhfZyA9IHllczsgdGhlbgotICAgIENYWEZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDWFhGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHWFg9Ci0gIHRlc3QgIiR7Q1hYRkxBR1Mrc2V0fSIgPSBzZXQgfHwgQ1hYRkxBR1M9Ii1nIgotZmkKLV0pCi0KLWRubCBTZWUgaWYgdGhlIEcrKyBjb21waWxlciB3ZSBmb3VuZCB3b3Jrcy4KLUFDX0RFRlVOKENZR19BQ19QUk9HX0dYWF9XT1JLUywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIEcrKyBjb21waWxlciAoJENYWCAkQ1hYRkxBR1MgJExERkxBR1MpIGFjdHVhbGx5IHdvcmtzXSkKLUFDX0xBTkdfU0FWRQotQUNfTEFOR19DUExVU1BMVVMKLWRubCBUcnkgYSB0ZXN0IGNhc2UuIFdlIG9ubHkgY29tcGlsZSwgYmVjYXVzZSBpdCdzIGNsb3NlIHRvIGltcG9zc2libGUKLWRubCB0byBnZXQgYSBjb3JyZWN0IGZ1bGx5IGxpbmtlZCBleGVjdXRhYmxlIHdpdGggYSBjcm9zcyBjb21waWxlci4gRm9yCi1kbmwgbW9zdCBjcm9zcyBjb21waWxlcnMsIHRoaXMgdGVzdCBpcyBib2d1cy4gRm9yIEcrKywgd2UgY2FuIHVzZSB2YXJpb3VzCi1kbmwgb3RoZXIgY29tcGlsZSBsaW5lIG9wdGlvbnMgdG8gZ2V0IGEgZGVjZW50IGlkZWEgdGhhdCB0aGUgY3Jvc3MgY29tcGlsZXIKLWRubCBhY3R1YWxseSBkb2VzIHdvcmssIGV2ZW4gdGhvdWdoIHdlIGNhbid0IHByb2R1Y2UgYW4gZXhlY3V0YWJsZSB3aXRob3V0Ci1kbmwgbW9yZSBpbmZvIGFib3V0IHRoZSB0YXJnZXQgaXQncyBiZWluZyBjb21waWxlZCBmb3IuIFRoaXMgb25seSB3b3JrcwotZG5sIGZvciB0aGUgR05VIEMrKyBjb21waWxlci4KLQotZG5sIFRyYW5zZm9ybSB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIgdG8gaXQncyBjcm9zcyB2YXJpYW50LCB1bmxlc3MKLWRubCBDWFggaXMgc2V0LiBUaGlzIGlzIGFsc28gd2hhdCBDWFggZ2V0cyBzZXQgdG8gaW4gdGhlIGdlbmVyYXRlZAotZG5sIE1ha2VmaWxlLgotaWYgdGVzdCB4IiR7Q1hYfSIgPSB4YysrIDsgdGhlbgotICAgIENYWD1gZWNobyBnY2MgfCBzZWQgLWUgIiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0iYAotZmkKLQotZG5sIEdldCBHKysncyBmdWxsIHBhdGggdG8gbGliZ2NjLmEKLWxpYmdjY3BhdGg9YCR7Q1hYfSAtLXByaW50LWxpYmdjY2AKLQotZG5sIElmIHdlIGRvbid0IGhhdmUgYSBwYXRoIHdpdGggbGliZ2NjLmEgb24gdGhlIGVuZCwgdGhpcyBpc24ndCBHKysuCi1pZiB0ZXN0IGBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi8uKi86OidgID0gbGliZ2NjLmEgOyB0aGVuCi0gICBhY19jdl9wcm9nX2d4eD15ZXMKLWVsc2UKLSAgIGFjX2N2X3Byb2dfZ3h4PW5vCi1maQotCi1kbmwgSWYgd2UgYXJlIHVzaW5nIEcrKywgbG9vayBmb3IgdGhlIGZpbGVzIHRoYXQgbmVlZCB0byBleGlzdCBpZiB0aGlzCi1kbmwgY29tcGlsZXIgd29ya3MuCi1pZiB0ZXN0IHgiJHthY19jdl9wcm9nX2d4eH0iID0geHllcyA7IHRoZW4KLSAgICBnY2NmaWxlcz1gZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovbGliZ2NjLmE6OidgCi0gICAgaWYgdGVzdCAtZiAke2djY2ZpbGVzfS9zcGVjcyAtYSAtZiAke2djY2ZpbGVzfS9jcHAgLWEgLWYgJHtnY2NmaWxlc30vY2MxcGx1czsgdGhlbgotCWdjY2ZpbGVzPXllcwotICAgIGVsc2UKLQlnY2NmaWxlcz1ubwotICAgIGZpCi0gICAgZ2NjbGlicz1gZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczpsaWIvZ2NjLWxpYi86OicgLWUgJ3M6L2xpYmdjYy5hOjonIC1lICdzLFwoLipcKS8uKixcMSxnJ2AvbGliCi0gICAgaWYgdGVzdCAtZCAke2djY2xpYnN9L2xkc2NyaXB0cyAtYSAtZiAke2djY2xpYnN9L2xpYmMuYSAtYSAtZiAke2djY2xpYnN9L2xpYnN0ZGMrKy5hIDsgdGhlbgotCWdjY2xpYnM9eWVzCi0gICAgZWxzZQotCWdjY2xpYnM9bm8KLSAgICBmaQotZmkKLQotZG5sIElmIGV2ZXJ5dGhpbmcgaXMgT0ssIHRoZW4gd2UgY2FuIHNhZmVseSBhc3N1bWUgdGhlIGNvbXBpbGVyIHdvcmtzLgotaWYgdGVzdCB4IiR7Z2NjZmlsZXN9IiA9IHhubyAtbyB4IiR7Z2NjbGlic30iID0geG5vOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jeHhfd29ya3M9bm8KLSAgICBBQ19NU0dfRVJST1IoJHtDWFh9IGlzIGEgbm9uLXdvcmtpbmcgY3Jvc3MgY29tcGlsZXIpCi1lbHNlCi0gICBhY19jdl9wcm9nX2N4eF93b3Jrcz15ZXMgCi1maQotCi1BQ19MQU5HX1JFU1RPUkUKLUFDX01TR19SRVNVTFQoJGFjX2N2X3Byb2dfY3h4X3dvcmtzKQotaWYgdGVzdCB4IiRhY19jdl9wcm9nX2N4eF93b3JrcyIgPSB4bm87IHRoZW4KLSAgQUNfTVNHX0VSUk9SKFtpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDKysgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy5dKQotZmkKLUFDX01TR19DSEVDS0lORyhbd2hldGhlciB0aGUgRysrIGNvbXBpbGVyICgkQ1hYICRDWFhGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlcl0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9wcm9nX2N4eF9jcm9zcykKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jeHhfY3Jvc3MKLUFDX1NVQlNUKENYWCkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgYSB3b3JraW5nIEdDQyBjcm9zcyBjb21waWxlci4gVGhpcyBvbmx5IHdvcmtzIGZvciB0aGUgR05VIGdjYyBjb21waWxlci4KLWRubCBUaGlzIGlzIGJhc2VkIG9uIHRoZSBtYWNyb3MgYWJvdmUgZm9yIEcrKy4KLUFDX0RFRlVOKENZR19BQ19QUk9HX0NDX0NST1NTLAotW0FDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DQ1BQXSkKLUFDX0NIRUNLX1BST0dTKENDLCBjYywgZ2NjKQotCi1DWUdfQUNfUFJPR19HQ0NfV09SS1MKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZG5sIENoZWNrIHdoZXRoZXIgLWcgd29ya3MsIGV2ZW4gaWYgQ0ZMQUdTIGlzIHNldCwgaW4gY2FzZSB0aGUgcGFja2FnZQotZG5sIHBsYXlzIGFyb3VuZCB3aXRoIENGTEFHUyAoc3VjaCBhcyB0byBidWlsZCBib3RoIGRlYnVnZ2luZyBhbmQKLWRubCBub3JtYWwgdmVyc2lvbnMgb2YgYSBsaWJyYXJ5KSwgdGFzdGVsZXNzIGFzIHRoYXQgaWRlYSBpcy4KLSAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9Ci0gIEFDX1BST0dfQ0NfRwotICBpZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gICAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0gIGVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1PMiIKLSAgZmkKLWVsc2UKLSAgR1hYPQotICB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldCB8fCBDRkxBR1M9Ii1nIgotZmkKLV0pCi0KLWRubCBTZWUgaWYgdGhlIEdDQyBjb21waWxlciB3ZSBmb3VuZCB3b3Jrcy4KLUFDX0RFRlVOKENZR19BQ19QUk9HX0dDQ19XT1JLUywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdGhlIEdjYyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGFjdHVhbGx5IHdvcmtzXSkKLUFDX0xBTkdfU0FWRQotQUNfTEFOR19DCi1kbmwgVHJ5IGEgdGVzdCBjYXNlLiBXZSBvbmx5IGNvbXBpbGUsIGJlY2F1c2UgaXQncyBjbG9zZSB0byBpbXBvc3NpYmxlCi1kbmwgdG8gZ2V0IGEgY29ycmVjdCBmdWxseSBsaW5rZWQgZXhlY3V0YWJsZSB3aXRoIGEgY3Jvc3MKLWRubCBjb21waWxlci4gRm9yIG1vc3QgY3Jvc3MgY29tcGlsZXJzLCB0aGlzIHRlc3QgaXMgYm9ndXMuIEZvciBHKyssCi1kbmwgd2UgY2FuIHVzZSB2YXJpb3VzIG90aGVyIGNvbXBpbGUgbGluZSBvcHRpb25zIHRvIGdldCBhIGRlY2VudCBpZGVhCi1kbmwgdGhhdCB0aGUgY3Jvc3MgY29tcGlsZXIgYWN0dWFsbHkgZG9lcyB3b3JrLCBldmVuIHRob3VnaCB3ZSBjYW4ndAotZG5sIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSB3aXRob3V0IG1vcmUgaW5mbyBhYm91dCB0aGUgdGFyZ2V0IGl0J3MKLWRubCBiZWluZyBjb21waWxlZCBmb3IuIFRoaXMgb25seSB3b3JrcyBmb3IgdGhlIEdOVSBDKysgY29tcGlsZXIuCi0KLWRubCBUcmFuc2Zvcm0gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyIHRvIGl0J3MgY3Jvc3MgdmFyaWFudCwgdW5sZXNzCi1kbmwgQ1hYIGlzIHNldC4gVGhpcyBpcyBhbHNvIHdoYXQgQ0MgZ2V0cyBzZXQgdG8gaW4gdGhlIGdlbmVyYXRlZCBNYWtlZmlsZS4KLWlmIHRlc3QgeCIke0NDfSIgPSB4Y2MgOyB0aGVuCi0gICAgQ0M9YGVjaG8gZ2NjIHwgc2VkIC1lICIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9ImAKLWZpCi0KLWRubCBHZXQgR2NjJ3MgZnVsbCBwYXRoIHRvIGxpYmdjYy5hCi1saWJnY2NwYXRoPWAke0NDfSAtLXByaW50LWxpYmdjY2AKLQotZG5sIElmIHdlIGRvbid0IGhhdmUgYSBwYXRoIHdpdGggbGliZ2NjLmEgb24gdGhlIGVuZCwgdGhpcyBpc24ndCBHKysuCi1pZiB0ZXN0IGBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi8uKi86OidgID0gbGliZ2NjLmEgOyB0aGVuCi0gICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotCi1kbmwgSWYgd2UgYXJlIHVzaW5nIEdjYywgbG9vayBmb3IgdGhlIGZpbGVzIHRoYXQgbmVlZCB0byBleGlzdCBpZiB0aGlzCi1kbmwgY29tcGlsZXIgd29ya3MuCi1pZiB0ZXN0IHgiJHthY19jdl9wcm9nX2djY30iID0geHllcyA7IHRoZW4KLSAgICBnY2NmaWxlcz1gZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczovbGliZ2NjLmE6OidgCi0gICAgaWYgdGVzdCAtZiAke2djY2ZpbGVzfS9zcGVjcyAtYSAtZiAke2djY2ZpbGVzfS9jcHAgLWEgLWYgJHtnY2NmaWxlc30vY2MxcGx1czsgdGhlbgotCWdjY2ZpbGVzPXllcwotICAgIGVsc2UKLQlnY2NmaWxlcz1ubwotICAgIGZpCi0gICAgZ2NjbGlicz1gZWNobyAkbGliZ2NjcGF0aCB8IHNlZCAtZSAnczpsaWIvZ2NjLWxpYi86OicgLWUgJ3M6L2xpYmdjYy5hOjonIC1lICdzLFwoLipcKS8uKixcMSxnJ2AvbGliCi0gICAgaWYgdGVzdCAtZCAke2djY2xpYnN9L2xkc2NyaXB0cyAtYSAtZiAke2djY2xpYnN9L2xpYmMuYSAtYSAtZiAke2djY2xpYnN9L2xpYnN0ZGMrKy5hIDsgdGhlbgotCWdjY2xpYnM9eWVzCi0gICAgZWxzZQotCWdjY2xpYnM9bm8KLSAgICBmaQotZmkKLQotZG5sIElmIGV2ZXJ5dGhpbmcgaXMgT0ssIHRoZW4gd2UgY2FuIHNhZmVseSBhc3N1bWUgdGhlIGNvbXBpbGVyIHdvcmtzLgotaWYgdGVzdCB4IiR7Z2NjZmlsZXN9IiA9IHhubyAtbyB4IiR7Z2NjbGlic30iID0geG5vOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotICAgIEFDX01TR19FUlJPUigke0NDfSBpcyBhIG5vbi13b3JraW5nIGNyb3NzIGNvbXBpbGVyKSAgICAKLWVsc2UKLSAgICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotZmkKLQotQUNfTEFOR19SRVNUT1JFCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9wcm9nX2NjX3dvcmtzKQotaWYgdGVzdCB4IiRhY19jdl9wcm9nX2NjX3dvcmtzIiA9IHhubzsgdGhlbgotICBBQ19NU0dfRVJST1IoW2luc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMrKyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLl0pCi1maQotQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRoZSBHY2MgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyXSkKLUFDX01TR19SRVNVTFQoJGFjX2N2X3Byb2dfY2NfY3Jvc3MpCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLUFDX1NVQlNUKENDKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCB0aGUgQkZEIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBhY2Nlc3MgYW5kCi1kbmwgbWFuaXB1bGF0ZSBvYmplY3Qgb3IgZXhlY3V0YWJsZSBmaWxlcy4KLUFDX0RFRlVOKENZR19BQ19QQVRIX0JGRCwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgYmZkIGhlYWRlciBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1kbmwgTG9vayBmb3IgdGhlIGhlYWRlciBmaWxlCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19iZmRoLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2JmZC9iZmQuaCIgOyB0aGVuCi0JYWNfY3ZfY19iZmRoPWAoY2QgJGkvYmZkOyBwd2QpYAotCWJyZWFrCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2JmZGh9IiAhPSB4OyB0aGVuCi0gICAgQkZESERJUj0iLUkke2FjX2N2X2NfYmZkaH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfYmZkaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKEJGREhESVIpCi0KLWRubCBMb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgYmZkIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19iZmRsaWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvYmZkL01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX2JmZGxpYj1gKGNkICRpL2JmZDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWRubCBXZSBsaXN0IHR3byBkaXJlY3RvcmllcyBjYXVzZSBiZmQgbm93IHVzZXMgbGlidG9vbAotaWYgdGVzdCB4IiR7YWNfY3ZfY19iZmRsaWJ9IiAhPSB4OyB0aGVuCi0gICAgQkZETElCPSItTCR7YWNfY3ZfY19iZmRsaWJ9IC1MJHthY19jdl9jX2JmZGxpYn0vLmxpYnMiCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfYmZkbGlifSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoQkZETElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCB0aGUgbGliaWJlcnR5IGxpYnJhcnkuIFRoaXMgZGVmaW5lcyBtYW55IGNvbW1vbmx5IHVzZWQgQwotZG5sIGZ1bmN0aW9ucyB0aGF0IGV4aXN0cyBpbiB2YXJpb3VzIHN0YXRlcyBiYXNlZCBvbiB0aGUgdW5kZXJseWluZyBPUy4KLUFDX0RFRlVOKENZR19BQ19QQVRIX0xJQkVSVFksIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGxpYmVydHkgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19saWJlcnR5LFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2xpYmliZXJ0eS9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19saWJlcnR5PWAoY2QgJGkvbGliaWJlcnR5OyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJlcnR5fSIgIT0geDsgdGhlbgotICAgIExJQkVSVFk9Ii1MJHthY19jdl9jX2xpYmVydHl9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2xpYmVydHl9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChMSUJFUlRZKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgRmluZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5LiBUaGlzIGlzIHVzZWQgdG8gZG8gZGlzc2FzZW1ibGllcy4KLUFDX0RFRlVOKENZR19BQ19QQVRIX09QQ09ERVMsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIG9wY29kZXMgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19vcGMsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvb3Bjb2Rlcy9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19vcGM9YChjZCAkaS9vcGNvZGVzOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19vcGN9IiAhPSB4OyB0aGVuCi0gICAgT1BDT0RFU0xJQj0iLUwke2FjX2N2X2Nfb3BjfSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19vcGN9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChPUENPREVTTElCKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgTG9vayBmb3IgdGhlIERlamFHbnUgaGVhZGVyIGZpbGUgaW4gdGhlIHNvdXJjZSB0cmVlLiBUaGlzIGZpbGUKLWRubCBkZWZpbmVzIHRoZSBmdW5jdGlvbnMgdXNlZCB0byB0ZXN0aW5nIHN1cHBvcnQuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9ERUpBR05VLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSB0ZXN0aW5nIHN1cHBvcnQgZmlsZXMgaW4gdGhlIHNvdXJjZSB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2RlamFnbnUsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHNyY2Rpci8kaS9lY2MvZWNjL2luZnJhL3Rlc3RsaWIvY3VycmVudC9pbmNsdWRlL2RlamFnbnUuaCIgOyB0aGVuCi0JYWNfY3ZfY19kZWphZ251PWAoY2QgJHNyY2Rpci8kaS9lY2MvZWNjL2luZnJhL3Rlc3RsaWIvY3VycmVudC9pbmNsdWRlOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19kZWphZ251fSIgIT0geDsgdGhlbgotICAgIERFSkFHTlVIRElSPSItSSR7YWNfY3ZfY19kZWphZ251fSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19kZWphZ251fSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfZGVqYWdudWxpYixbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkc3JjZGlyLyRpL2luZnJhL3Rlc3RsaWIvY3VycmVudC9saWIvaG9zdHV0aWwuZXhwIiA7IHRoZW4KLQlhY19jdl9jX2RlamFnbnVsaWI9YChjZCAkc3JjZGlyLyRpL2luZnJhL3Rlc3RsaWIvY3VycmVudC9saWI7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2RlamFnbnVsaWJ9IiAhPSB4OyB0aGVuCi0gICAgREVKQUdOVUxJQj0iJHthY19jdl9jX2RlamFnbnVsaWJ9IgotZWxzZQotICAgIERFSkFHTlVMSUI9IiIKLWZpCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHJ1bnRlc3QgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfcnVudGVzdCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkc3JjZGlyLyRpL2RlamFnbnUvcnVudGVzdCIgOyB0aGVuCi0JYWNfY3ZfY19ydW50ZXN0PWAoY2QgJHNyY2Rpci8kaS9kZWphZ251OyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19ydW50ZXN0fSIgIT0geDsgdGhlbgotICAgIFJVTlRFU1RESVI9IiR7YWNfY3ZfY19ydW50ZXN0fSIKLSAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3J1bnRlc3R9KQotZWxzZQotICAgIFJVTlRFU1RESVI9IiIKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoUlVOVEVTVERJUikKLUFDX1NVQlNUKERFSkFHTlVMSUIpCi1BQ19TVUJTVChERUpBR05VSERJUikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIGxpYmludGwgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZS4gVGhpcyBpcyBmb3IKLWRubCAgaW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydC4KLUFDX0RFRlVOKENZR19BQ19QQVRIX0lOVEwsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIGludGwgaGVhZGVyIGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWRubCBMb29rIGZvciB0aGUgaGVhZGVyIGZpbGUKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2ludGxoLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2ludGwvbGliaW50bC5oIiA7IHRoZW4KLQlhY19jdl9jX2ludGxoPWAoY2QgJGkvaW50bDsgcHdkKWAKLQlicmVhawotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbnRsaH0iICE9IHg7IHRoZW4KLSAgICBJTlRMSERJUj0iLUkke2FjX2N2X2NfaW50bGh9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2ludGxofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoSU5UTEhESVIpCi0KLWRubCBMb29rIGZvciB0aGUgbGlicmFyeQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgbGliaW50bCBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaW50bGxpYixbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9pbnRsL01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX2ludGxsaWI9YChjZCAkaS9pbnRsOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbnRsbGlifSIgIT0geDsgdGhlbgotICAgIElOVExMSUI9Ii1MJHthY19jdl9jX2ludGxsaWJ9IC1saW50bCIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbnRsbGlifSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotQUNfU1VCU1QoSU5UTExJQikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIEZpbmQgdGhlIHNpbXVsYXRvciBsaWJyYXJ5LgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfU0lNLCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotY2FzZSAiJHRhcmdldF9jcHUiIGluCi0gICAgcG93ZXJwYykJdGFyZ2V0X2Rpcj1wcGMgOzsKLSAgICBzcGFyYyopCXRhcmdldF9kaXI9ZXJjMzIgOzsKLSAgICBtaXBzKikJdGFyZ2V0X2Rpcj1taXBzIDs7Ci0gICAgKikJCXRhcmdldF9kaXI9JHRhcmdldF9jcHUgOzsKLWVzYWMKLWRubCBGaXJzdCBsb29rIGZvciB0aGUgaGVhZGVyIGZpbGUKLUFDX01TR19DSEVDS0lORyhmb3IgdGhlIHNpbXVsYXRvciBoZWFkZXIgZmlsZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3NpbWgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJHtzcmNkaXJ9LyRpL2luY2x1ZGUvcmVtb3RlLXNpbS5oIiA7IHRoZW4KLQlhY19jdl9jX3NpbWg9YChjZCAke3NyY2Rpcn0vJGkvaW5jbHVkZTsgcHdkKWAKLQlicmVhawotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19zaW1ofSIgIT0geDsgdGhlbgotICAgIFNJTUhESVI9Ii1JJHthY19jdl9jX3NpbWh9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3NpbWh9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChTSU1IRElSKQotCi1kbmwgU2VlIHdoZXRoZXIgaXQncyBhIGRldm8gb3IgRm91bmRyeSBicmFuY2ggc2ltdWxhdG9yCi1BQ19NU0dfQ0hFQ0tJTkcoV2hldGhlciB0aGlzIGlzIGEgZGV2byBzaW11bGF0b3IgKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2Nfc2ltZGV2byxbCi0gICAgQ1BQRkxBR1M9IiRDUFBGTEFHUyAkU0lNSERJUiIKLSAgICBBQ19FR1JFUF9IRUFERVIoW1NJTV9ERVNDIHNpbV9vcGVuLipzdHJ1Y3QgX2JmZF0sIHJlbW90ZS1zaW0uaCwKLSAgICAgICAgYWNfY3ZfY19zaW1kZXZvPXllcywKLSAgICAgICAgYWNfY3ZfY19zaW1kZXZvPW5vKQotXSkKLWlmIHRlc3QgeCIkYWNfY3ZfY19zaW1kZXZvIiA9IHgieWVzIiA7IHRoZW4KLSAgICBBQ19ERUZJTkUoSEFWRV9ERVZPX1NJTSkKLWZpCi1BQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19zaW1kZXZvfSkKLUFDX1NVQlNUKEhBVkVfREVWT19TSU0pCi0KLWRubCBOZXh0IGxvb2sgZm9yIHRoZSBsaWJyYXJ5Ci1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBzaW11bGF0b3IgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3NpbWxpYixbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIkaS9zaW0vJHRhcmdldF9kaXIvTWFrZWZpbGUiIDsgdGhlbgotCWFjX2N2X2Nfc2ltbGliPWAoY2QgJGkvc2ltLyR0YXJnZXRfZGlyOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19zaW1saWJ9IiAhPSB4OyB0aGVuCi0gICAgU0lNTElCPSItTCR7YWNfY3ZfY19zaW1saWJ9IgotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgICBkbmwgRklYTUU6IHRoaXMgaXMga2luZGEgYm9ndXMsIGNhdXNlIHVtdGltYXRlbHkgdGhlIFRNIHdpbGwgYnVpbGQKLSAgICBkbmwgYWxsIHRoZSBsaWJyYXJpZXMgZm9yIHNldmVyYWwgYXJjaGl0ZWN0dXJlcy4gQnV0IGZvciBub3csIHRoaXMKLSAgICBkbmwgd2lsbCB3b3JrIHRpbGwgdGhlbi4KLWRubCAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgc2ltdWxhdG9yIGluc3RhbGxlZCB3aXRoIHRoZSBjb21waWxlciBsaWJyYXJpZXMpCi0gICAgZG5sIFRyYW5zZm9ybSB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIgdG8gaXQncyBjcm9zcyB2YXJpYW50LCB1bmxlc3MKLSAgICBkbmwgQ1hYIGlzIHNldC4gVGhpcyBpcyBhbHNvIHdoYXQgQ1hYIGdldHMgc2V0IHRvIGluIHRoZSBnZW5lcmF0ZWQKLSAgICBkbmwgTWFrZWZpbGUuCi0gICAgQ1JPU1NfR0NDPWBlY2hvIGdjYyB8IHNlZCAtZSAicy9eLyR0YXJnZXQvImAKLQotICAgIGRubCBHZXQgRysrJ3MgZnVsbCBwYXRoIHRvIGxpYmdjYy5hCi1jaGFuZ2VxdW90ZSgsKQotICAgIGdjY3BhdGg9YCR7Q1JPU1NfR0NDfSAtLXByaW50LWxpYmdjYyB8IHNlZCAtZSAnczpbYS16MC05QS1aXC5cLV0qL2xpYmdjYy5hOjonIC1lICdzOmxpYi9nY2MtbGliLzo6J2BsaWIKLWNoYW5nZXF1b3RlKFssXSkKLSAgICBpZiB0ZXN0IC1mICRnY2NwYXRoL2xpYnNpbS5hIC1vIC1mICRnY2NwYXRoL2xpYnNpbS5zbyA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19zaW1saWI9IiRnY2NwYXRoLyIKLSAgICAgICAgU0lNTElCPSItTCR7YWNfY3ZfY19zaW1saWJ9IgotCUFDX01TR19SRVNVTFQoJHthY19jdl9jX3NpbWxpYn0pCi0gICAgZWxzZQotICAgICAgICBBTV9DT05ESVRJT05BTChQU0lNLCB0ZXN0IHgkcHNpbSA9IHhubykKLQlTSU1MSUI9IiIKLQlBQ19NU0dfUkVTVUxUKG5vbmUpCi1kbmwgICAgICAgICBhY19jdl9jX3NpbWxpYj1ub25lCi0gICAgZmkKLWZpCi1BQ19TVUJTVChTSU1MSUIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUFDX0RFRlVOKENZR19BQ19QQVRIX0xJQklCRVJUWSwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgbGliaWJlcnR5IGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliaWIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvbGliaWJlcnR5L01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX2xpYmliPWAoY2QgJGkvbGliaWJlcnR5LzsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliaWJ9IiAhPSB4OyB0aGVuCi0gICAgTElCSUJFUlRZPSItTCR7YWNfY3ZfY19saWJpYn0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGliaWJ9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi1BQ19TVUJTVChMSUJJQkVSVFkpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUFDX0RFRlVOKENZR19BQ19QQVRIX0RFVk8sIFsKLUFDX01TR19DSEVDS0lORyhmb3IgZGV2byBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19kZXZvaCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvaW5jbHVkZS9yZW1vdGUtc2ltLmgiIDsgdGhlbgotCWFjX2N2X2NfZGV2b2g9YChjZCAke3NyY2Rpcn0vJGkvaW5jbHVkZTsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfZGV2b2h9IiAhPSB4OyB0aGVuCi0gICAgREVWT0hESVI9Ii1JJHthY19jdl9jX2Rldm9ofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19kZXZvaH0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKERFVk9IRElSKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgZmluZCB0aGUgSURFIGxpYnJhcnkgYW5kIGhlYWRlcnMuCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JREUsIFsKLUFDX01TR19DSEVDS0lORyhmb3IgSURFIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUlERUhESVI9Ci1JREVMSUI9Ci1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGVoLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9saWJpZGUvc3JjL2V2ZW50LmgiIDsgdGhlbgotCWFjX2N2X2NfaWRlaD1gKGNkICR7c3JjZGlyfS8kaS9saWJpZGUvc3JjOyBwd2QpYDsKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRlaH0iICE9IHg7IHRoZW4KLSAgICBJREVIRElSPSItSSR7YWNfY3ZfY19pZGVofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pZGVofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIExJQklERSBUQ0wgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pZGV0Y2xoLFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiR7c3JjZGlyfS8kaS9saWJpZGV0Y2wvc3JjL2lkZXRjbC5oIiA7IHRoZW4KLQlhY19jdl9jX2lkZXRjbGg9YChjZCAke3NyY2Rpcn0vJGkvbGliaWRldGNsL3NyYzsgcHdkKWA7Ci0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZXRjbGh9IiAhPSB4OyB0aGVuCi0gICAgSURFSERJUj0iJHtJREVIRElSfSAtSSR7YWNfY3ZfY19pZGV0Y2xofSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pZGV0Y2xofSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElERSBoZWFkZXJzIGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRlaDIsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvbGliaWRlL3NyYy9NYWtlZmlsZSIgOyB0aGVuCi0JYWNfY3ZfY19pZGVoMj1gKGNkICRpL2xpYmlkZS9zcmM7IHB3ZClgOwotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pZGVoMn0iICE9IHg7IHRoZW4KLSAgICBJREVIRElSPSIke0lERUhESVJ9IC1JJHthY19jdl9jX2lkZWgyfSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pZGVoMn0pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotZG5sIGxvb2sgZm9yIHRoZSBsaWJyYXJ5Ci1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElERSBsaWJyYXJ5KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWRlbGliLFsKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRlbGlifSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvbGliaWRlL3NyYy9NYWtlZmlsZSIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaWRlbGliPWAoY2QgJGkvbGliaWRlL3NyYzsgcHdkKWAKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotZmldKSAKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRlbGlifSIgIT0geCA7IHRoZW4KLSAgICAgSURFTElCPSItTCR7YWNfY3ZfY19pZGVsaWJ9IgotICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pZGVsaWJ9KQotZWxzZQotICAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1kbmwgZmluZCBsaWJpZGRldGNsLmEgaWYgaXQgZXhpc3RzCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElERSBUQ0wgbGlicmFyeSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lkZXRjbGxpYixbCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lkZXRjbGxpYn0iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2xpYmlkZXRjbC9zcmMvTWFrZWZpbGUiIDsgdGhlbgotICAgICAgICBhY19jdl9jX2lkZXRjbGxpYj1gKGNkICRpL2xpYmlkZXRjbC9zcmM7IHB3ZClgCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLWZpCi1dKSAKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWRldGNsbGlifSIgIT0geCA7IHRoZW4KLSAgICAgSURFTElCPSIke0lERUxJQn0gLUwke2FjX2N2X2NfaWRldGNsbGlifSIKLSAgICAgSURFVENMTElCPSItbGlkZXRjbCIKLSAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWRldGNsbGlifSkKLWVsc2UKLSAgICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKElERUhESVIpCi1BQ19TVUJTVChJREVMSUIpCi1BQ19TVUJTVChJREVUQ0xMSUIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBGaW5kIGFsbCB0aGUgSUxVIGhlYWRlcnMgYW5kIGxpYnJhcmllcwotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSUxVLCBbCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBrZXJuZWwgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1aCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvaWx1L3J1bnRpbWUva2VybmVsL21ldGhvZC5oIiA7IHRoZW4KLQlhY19jdl9jX2lsdWg9YChjZCAke3NyY2Rpcn0vJGkvaWx1L3J1bnRpbWUva2VybmVsOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVofSIgIT0geDsgdGhlbgotICAgIElMVUhESVI9Ii1JJHthY19jdl9jX2lsdWh9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWh9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX01TR19DSEVDS0lORyhmb3IgSUxVIGtlcm5lbCBoZWFkZXJzIGluIHRoZSBidWlsZCB0cmVlKQotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWg1LFsKLWZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgIiRpL2lsdS9ydW50aW1lL2tlcm5lbC9pbHVjb25mLmgiIDsgdGhlbgotCWFjX2N2X2NfaWx1aDU9YChjZCAkaS9pbHUvcnVudGltZS9rZXJuZWw7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWg1fSIgIT0geDsgdGhlbgotICAgIElMVUhESVI9IiR7SUxVSERJUn0gLUkke2FjX2N2X2NfaWx1aDV9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWg1fSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBDKysgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVoMixbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvaWx1L3N0dWJiZXJzL2NwcC9yZXNvdXJjZS5oIiA7IHRoZW4KLQlhY19jdl9jX2lsdWgyPWAoY2QgJHtzcmNkaXJ9LyRpL2lsdS9zdHViYmVycy9jcHA7IHB3ZClgCi0gICAgZmkKLWRvbmUKLV0pCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWgyfSIgIT0geDsgdGhlbgotICAgIElMVUhESVI9IiR7SUxVSERJUn0gLUkke2FjX2N2X2NfaWx1aDJ9IgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWgyfSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBDIGhlYWRlcnMpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVoMyxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvaWx1L3N0dWJiZXJzL2MvcmVzb3VyY2UuaCIgOyB0aGVuCi0JYWNfY3ZfY19pbHVoMz1gKGNkICR7c3JjZGlyfS8kaS9pbHUvc3R1YmJlcnMvYyAgOyBwd2QpYAotICAgIGZpCi1kb25lCi1dKQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVoM30iICE9IHg7IHRoZW4KLSAgICBJTFVIRElSPSIke0lMVUhESVJ9IC1JJHthY19jdl9jX2lsdWgzfSIKLSAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pbHVoM30pCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLQotQUNfTVNHX0NIRUNLSU5HKGZvciBJTFUgQyBydW50aW1lIGhlYWRlcnMpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVoNCxbCi1mb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICIke3NyY2Rpcn0vJGkvaWx1L3J1bnRpbWUvYy9pbHVjc3R1Yi5oIiA7IHRoZW4KLQlhY19jdl9jX2lsdWg0PWAoY2QgJHtzcmNkaXJ9LyRpL2lsdS9ydW50aW1lL2MgIDsgcHdkKWAKLSAgICBmaQotZG9uZQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaWx1aDR9IiAhPSB4OyB0aGVuCi0gICAgSUxVSERJUj0iJHtJTFVIRElSfSAtSSR7YWNfY3ZfY19pbHVoNH0iCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaWx1aDR9KQotZWxzZQotICAgIEFDX01TR19SRVNVTFQobm9uZSkKLWZpCi0KLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdXBhdGgsWwotZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAiJGkvaWx1L01ha2VmaWxlIiA7IHRoZW4KLQlhY19jdl9jX2lsdXBhdGg9YChjZCAkaS9pbHU7IHB3ZClgCi0JYnJlYWsKLSAgICBmaQotZG9uZQotXSkKLUlMVVRPUD0ke2FjX2N2X2NfaWx1cGF0aH0KLQotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgSUxVIGxpYnJhcnkgaW4gdGhlIGJ1aWxkIHRyZWUpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pbHVsaWIsWwotaWYgdGVzdCAtZiAiJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2tlcm5lbC9NYWtlZmlsZSIgOyB0aGVuCi0gICAgYWNfY3ZfY19pbHVsaWI9YChjZCAkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUva2VybmVsOyBwd2QpYAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJHthY19jdl9jX2lsdWxpYn0vbGliaWx1LmEpCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLWZpXSkKLSAgIAotQUNfTVNHX0NIRUNLSU5HKGZvciB0aGUgSUxVIEMrKyBiaW5kaW5ncyBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliMixbCi1pZiB0ZXN0IC1mICIkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUvY3BwL01ha2VmaWxlIiA7IHRoZW4KLSAgICBhY19jdl9jX2lsdWxpYjI9YChjZCAkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUvY3BwOyBwd2QpYAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJHthY19jdl9jX2lsdWxpYjJ9L2xpYmlsdS1jKysuYSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vKQotZmldKQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBJTFUgQyBiaW5kaW5ncyBsaWJyYXJ5IGluIHRoZSBidWlsZCB0cmVlKQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaWx1bGliMyxbCi1pZiB0ZXN0IC1mICIkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUvYy9NYWtlZmlsZSIgOyB0aGVuCi0gICAgYWNfY3ZfY19pbHVsaWIzPWAoY2QgJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL2M7IHB3ZClgCi0gICAgQUNfTVNHX1JFU1VMVChmb3VuZCAke2FjX2N2X2NfaWx1bGliM30vbGliaWx1LWMuYSkKLWVsc2UKLSAgICBBQ19NU0dfUkVTVUxUKG5vKQotZmldKQotCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBJTFUgVGsgYmluZGluZ3MgbGlicmFyeSBpbiB0aGUgYnVpbGQgdHJlZSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYjQsWwotaWYgdGVzdCAtZiAiJGFjX2N2X2NfaWx1cGF0aC9ydW50aW1lL21haW5sb29wL01ha2VmaWxlIiA7IHRoZW4KLSAgICBhY19jdl9jX2lsdWxpYjQ9YChjZCAkYWNfY3ZfY19pbHVwYXRoL3J1bnRpbWUvbWFpbmxvb3A7IHB3ZClgCi0gICAgQUNfTVNHX1JFU1VMVChmb3VuZCAke2FjX2N2X2NfaWx1bGliNH0vbGliaWx1LXRrLmEpCi1lbHNlCi0gICAgQUNfTVNHX1JFU1VMVChubykKLWZpXSkKLQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pbHVsaWJ9IiA9IHggLWEgeCIke2FjX2N2X2NfaWx1bGliMn0iID0geDsgdGhlbgotICBJTFVIRElSPSIiCi1maQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2lsdWxpYn0iICE9IHggLWEgeCIke2FjX2N2X2NfaWx1bGliMn0iICE9IHg7IHRoZW4KLSAgICBJTFVMSUI9Ii1MJHthY19jdl9jX2lsdWxpYn0gLUwke2FjX2N2X2NfaWx1bGliMn0gLUwke2FjX2N2X2NfaWx1bGliM30gLUwke2FjX2N2X2NfaWx1bGliNH0iCi1lbHNlCi0gICAgSUxVTElCPSIiCi1maQotCi1pZiB0ZXN0IHgiJHtJTFVMSUJ9IiA9IHg7IHRoZW4KLSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIElMVSBsaWJyYXJpZXMgaW5zdGFsbGVkIHdpdGggdGhlIGNvbXBpbGVyKQotICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX2lsdWxpYjUsWwotICAgIE5BVElWRV9HQ0M9YGVjaG8gZ2NjIHwgc2VkIC1lICIke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9ImAKLQotICAgIGRubCBHZXQgRysrJ3MgZnVsbCBwYXRoIHRvIGl0J3MgbGlicmFyaWVzCi0gICAgYWNfY3ZfY19pbHVsaWI1PWAke05BVElWRV9HQ0N9IC0tcHJpbnQtbGliZ2NjIHwgc2VkIC1lICdzOmxpYi9nY2MtbGliLy4qOjonYGxpYgotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfaWx1bGliNS9saWJpbHUtYy5hIC1vIC1mICRhY19jdl9jX2lsdWxpYjUvbGliaWx1LWMuc28gOyB0aGVuCi0gICAgICAgIGlmIHRlc3QgeCIke0lMVUhESVJ9IiA9IHg7IHRoZW4KLSAgICAgICAgICAgICAgIElMVUhESVI9Ii1JJHthY19jdl9jX2lsdWxpYjV9Ly4uL2luY2x1ZGUiCi0gICAgICAgIGZpCi0gICAgICAgIElMVUxJQj0iLUwke2FjX2N2X2NfaWx1bGliNX0iCi0gICAgICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2lsdWxpYjV9KQotICAgIGVsc2UKLSAgICAgICAgYWNfY3ZfY19pbHVsaWI9bm9uZQotICAgICAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICAgZmkKLWZpXSkKLUFDX1NVQlNUKElMVUhESVIpCi1BQ19TVUJTVChJTFVMSUIpCi1BQ19TVUJTVChJTFVUT1ApCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBUaGlzIGRlZmluZXMgdGhlIGJ5dGUgb3JkZXIgZm9yIHRoZSBob3N0LiBXZSBjYW4ndCB1c2UKLWRubCBBQ19DX0JJR0VORElBTiwgY2F1c2Ugd2Ugd2FudCB0byBjcmVhdGUgYSBjb25maWcgZmlsZSBhbmQKLWRubCBzdWJzdGl0dWUgdGhlIHJlYWwgdmFsdWUsIHNvIHRoZSBoZWFkZXIgZmlsZXMgd29yayByaWdodAotQUNfREVGVU4oQ1lHX0FDX0NfRU5ESUFOLCBbCi1BQ19NU0dfQ0hFQ0tJTkcodG8gc2VlIGlmIHRoaXMgaXMgYSBsaXR0bGUgZW5kaWFuIGhvc3QpCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19saXR0bGVfZW5kaWFuLCBbCi1hY19jdl9jX2xpdHRsZV9lbmRpYW49dW5rbm93bgotIyBTZWUgaWYgc3lzL3BhcmFtLmggZGVmaW5lcyB0aGUgQllURV9PUkRFUiBtYWNyby4KLUFDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+XSwgWwotI2lmICFCWVRFX09SREVSIHx8ICFfQklHX0VORElBTiB8fCAhX0xJVFRMRV9FTkRJQU4KLSBib2d1cyBlbmRpYW4gbWFjcm9zCi0jZW5kaWZdLCBbIyBJdCBkb2VzOyBub3cgc2VlIHdoZXRoZXIgaXQgZGVmaW5lZCB0byBfTElUVExFX0VORElBTiBvciBub3QuCi1BQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPl0sIFsKLSNpZiBCWVRFX09SREVSICE9IF9MSVRUTEVfRU5ESUFOCi0gbm90IGJpZyBlbmRpYW4KLSNlbmRpZl0sIGFjX2N2X2NfbGl0dGxlX2VuZGlhbj15ZXMsIGFjX2N2X2NfbGl0dGxlX2VuZGlhbj1ubykKLV0pCi1pZiB0ZXN0ICR7YWNfY3ZfY19saXR0bGVfZW5kaWFufSA9IHVua25vd247IHRoZW4KLW9sZF9jZmxhZ3M9JENGTEFHUwotQ0ZMQUdTPS1nCi1BQ19UUllfUlVOKFsKLW1haW4gKCkgewotICAvKiBBcmUgd2UgbGl0dGxlIG9yIGJpZyBlbmRpYW4/ICBGcm9tIEhhcmJpc29uJlN0ZWVsZS4gICovCi0gIHVuaW9uCi0gIHsKLSAgICBsb25nIGw7Ci0gICAgY2hhciBjW3NpemVvZiAobG9uZyldOwotICB9IHU7Ci0gIHUubCA9IDE7Ci0gIGV4aXQgKHUuY1swXSA9PSAxKTsKLX1dLAotYWNfY3ZfY19saXR0bGVfZW5kaWFuPW5vLAotYWNfY3ZfY19saXR0bGVfZW5kaWFuPXllcyxbCi1kbmwgWWVzLCB0aGlzIGlzIHVnbHksIGFuZCBvbmx5IHVzZWQgZm9yIGEgY2FuYWRpYW4gY3Jvc3MgYW55d2F5LiBUaGlzCi1kbmwgaXMganVzdCB0byBrZWVwIGNvbmZpZ3VyZSBmcm9tIHN0b3BwaW5nIGhlcmUuCi1jYXNlICIke2hvc3R9IiBpbgotY2hhbmdlcXVvdGUoLCkKLSAgIGlbMzQ1Nl04Ni0qLSopIGFjX2N2X2NfbGl0dGxlX2VuZGlhbj15ZXMgOzsKLSAgIHNwYXJjKi0qLSopICAgIGFjX2N2X2NfbGl0dGxlX2VuZGlhbj1ubyA7OwotY2hhbmdlcXVvdGUoWyxdKQotICAqKSAgICBBQ19NU0dfV0FSTihDYW4ndCBjcm9zcyBjb21waWxlIHRoaXMgdGVzdCkgOzsKLWVzYWNdKQotQ0ZMQUdTPSRvbGRfY2ZsYWdzCi1maV0pCi0KLWlmIHRlc3QgeCIke2FjX2N2X2NfbGl0dGxlX2VuZGlhbn0iID0geHllczsgdGhlbgotICAgIEFDX0RFRklORShMSVRUTEVfRU5ESUFOX0hPU1QpCi0gICAgRU5ESUFOPSJDWUdfTFNCRklSU1QiOwotZWxzZQotICAgIEVORElBTj0iQ1lHX01TQkZJUlNUIjsKLWZpCi1BQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saXR0bGVfZW5kaWFufSkKLUFDX1NVQlNUKEVORElBTikKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIExvb2sgZm9yIHRoZSBwYXRoIHRvIGxpYmdjYywgc28gd2UgY2FuIHVzZSBpdCB0byBkaXJlY3RseSBsaW5rCi1kbmwgaW4gbGliZ2NjLmEgd2l0aCBMRC4KLUFDX0RFRlVOKENZR19BQ19QQVRIX0xJQkdDQywKLVtBQ19NU0dfQ0hFQ0tJTkcoW0xvb2tpbmcgZm9yIHRoZSBwYXRoIHRvIGxpYmdjYy5hXSkKLUFDX0xBTkdfU0FWRQotQUNfTEFOR19DCi0KLWRubCBHZXQgR2NjJ3MgZnVsbCBwYXRoIHRvIGxpYmdjYy5hCi1saWJnY2NwYXRoPWAke0NDfSAtLXByaW50LWxpYmdjY2AKLQotZG5sIElmIHdlIGRvbid0IGhhdmUgYSBwYXRoIHdpdGggbGliZ2NjLmEgb24gdGhlIGVuZCwgdGhpcyBpc24ndCBHKysuCi1pZiB0ZXN0IGBlY2hvICRsaWJnY2NwYXRoIHwgc2VkIC1lICdzOi8uKi86OidgID0gbGliZ2NjLmEgOyB0aGVuCi0gICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotCi1kbmwgCi1pZiB0ZXN0IHgiJHthY19jdl9wcm9nX2djY30iID0geHllcyA7IHRoZW4KLSAgIGdjY3BhdGg9YGVjaG8gJGxpYmdjY3BhdGggfCBzZWQgLWUgJ3M6L2xpYmdjYy5hOjonYAotICAgTElCR0NDPSItTCR7Z2NjcGF0aH0iCi0gICBBQ19NU0dfUkVTVUxUKCR7Z2NjcGF0aH0pCi1lbHNlCi0gICBMSUJHQ0M9IiIKLSAgIEFDX01TR19FUlJPUihOb3QgdXNpbmcgZ2NjKQotZmkKLQotQUNfTEFOR19SRVNUT1JFCi1BQ19TVUJTVChMSUJHQ0MpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSB0Y2wgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKLWRubCBXYXJuaW5nOiB0cmFuc2l0aW9uIG9mIHZlcnNpb24gOSB0byAxMCB3aWxsIGJyZWFrIHRoaXMgYWxnb3JpdGhtCi1kbmwgYmVjYXVzZSAxMCBzb3J0cyBiZWZvcmUgOS4gV2UgYWxzbyBsb29rIGZvciBqdXN0IHRjbC4gV2UgaGF2ZSB0bwotZG5sIGJlIGNhcmVmdWwgdGhhdCB3ZSBkb24ndCBtYXRjaCBzdHVmZiBsaWtlIHRjbFggYnkgYWNjaWRlbnQuCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLXRjbGluY2x1ZGUKLUFDX0RFRlVOKENZR19BQ19QQVRIX1RDTCwgWwotICAgIENZR19BQ19QQVRIX1RDTEgKLSAgICBDWUdfQUNfUEFUSF9UQ0xDT05GSUcKLSAgICBDWUdfQUNfTE9BRF9UQ0xDT05GSUcKLV0pCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9UQ0xILCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9fdGNsPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgVGNsIGhlYWRlcnMgaW4gdGhlIHNvdXJjZSB0cmVlKQotQUNfQVJHX1dJVEgodGNsaW5jbHVkZSwgWyAgLS13aXRoLXRjbGluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIHRjbCBoZWFkZXJzIGFyZV0sIHdpdGhfdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfdGNsaCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10Y2xpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfdGNsaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX3RjbGluY2x1ZGV9L3RjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfdGNsaD1gKGNkICR7d2l0aF90Y2xpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF90Y2xpbmNsdWRlfS9nZW5lcmljL3RjbC5oIDsgdGhlbgotICAgIGFjX2N2X2NfdGNsaD1gKGNkICR7d2l0aF90Y2xpbmNsdWRlfS9nZW5lcmljOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGNsaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBoZWFkZXJzXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUY2wgY29uZmlndXJhdGlvbiBmaWxlCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfdGNsY29uZmlnLyRpL2dlbmVyaWMvdGNsLmggOyB0aGVuCi0gICAgICBhY19jdl9jX3RjbGg9YChjZCAkYWNfY3ZfY190Y2xjb25maWcvJGkvZ2VuZXJpYzsgcHdkKWAKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotZmkKLQotZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Ci1kbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGNsaH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRjbCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS90Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgIHRjbHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IFRjbCBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUY2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgZm9yIGkgaW4gYGxzIC1kciAkdGNscGF0aC90Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL2dlbmVyaWMvdGNsLmggOyB0aGVuCi0gICAgICAgICAgYWNfY3ZfY190Y2xoPWAoY2QgJGkvZ2VuZXJpYzsgcHdkKWAKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBjaGVjayBpZiBpdHMgaW5zdGFsbGVkIHdpdGggdGhlIGNvbXBpbGVyCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCi0gICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKLSAgICBjY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9pbmNsdWRlCi0gICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RjbC5oOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfdGNsaD0kY2NwYXRoCi0gICAgZmkKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgPSB4IDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgQUNfQ0hFQ0tfSEVBREVSKHRjbC5oLCBhY19jdl9jX3RjbGg9aW5zdGFsbGVkLCBhY19jdl9jX3RjbGg9IiIpCi1lbHNlCi0gICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190Y2xofSkKLWZpCi1dKQotICBUQ0xIRElSPSIiCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX0VSUk9SKFtDYW4ndCBmaW5kIGFueSBUY2wgaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xofSIgIT0geCA7IHRoZW4KLSAgICBub190Y2w9IiIKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGh9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0JaWYgdGVzdCB4IiR7Q0N9IiA9IHhjbCA7IHRoZW4KLQkgICAgdG1wPSJgY3lncGF0aCAtLXdpbmRvd3MgJHthY19jdl9jX3RjbGh9YCIKLQkgICAgYWNfY3ZfY190Y2xoPSJgZWNobyAkdG1wIHwgc2VkIC1lIHMjXFxcXFxcXFwjLyNnYCIKLQlmaQotICAgICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY190Y2xofSkKLSAgICAgICAgVENMSERJUj0iLUkke2FjX2N2X2NfdGNsaH0iCi0gICAgZmkKLWZpCi0KLUFDX1NVQlNUKFRDTEhESVIpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSB0Y2wgY29uZmlndXJhdGlvbgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVENMQ09ORklHLCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotZG5sIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC10Y2xjb25maWcKLWlmIHRlc3QgeCIke25vX3RjbH0iID0geCA7IHRoZW4KLSAgZG5sIHdlIHJlc2V0IG5vX3RjbCBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCi0gICAgbm9fdGNsPXRydWUKLSAgICBBQ19BUkdfV0lUSCh0Y2xjb25maWcsIFsgIC0td2l0aC10Y2xjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRjbCBjb25maWd1cmF0aW9uICh0Y2xDb25maWcuc2gpXSwKLSAgICAgICAgIHdpdGhfdGNsY29uZmlnPSR7d2l0aHZhbH0pCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgVGNsIGNvbmZpZ3VyYXRpb24gc2NyaXB0XSkKLSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfY190Y2xjb25maWcsWwotCi0gICAgZG5sIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGNsY29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gICAgaWYgdGVzdCB4IiR7d2l0aF90Y2xjb25maWd9IiAhPSB4IDsgdGhlbgotICAgICAgICBpZiB0ZXN0IC1mICIke3dpdGhfdGNsY29uZmlnfS90Y2xDb25maWcuc2giIDsgdGhlbgotICAgICAgICAgICAgYWNfY3ZfY190Y2xjb25maWc9YChjZCAke3dpdGhfdGNsY29uZmlnfTsgcHdkKWAKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfdGNsY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRjbENvbmZpZy5zaF0pCi0gICAgICAgIGZpCi0gICAgZmkKLQotICAgIGRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBUY2wgY29uZmlndXJhdGlvbiBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci8kaS91bml4L3RjbENvbmZpZy5zaCA7IHRoZW4KLSAgICAgICAgICAgICAgICBhY19jdl9jX3RjbGNvbmZpZz1gKGNkICRzcmNkaXIvJGkvdW5peDsgcHdkKWAKLQkgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBmaQotICAgICAgICBkb25lCi0gICAgZmkKLSAgICBkbmwgY2hlY2sgaW4gYSBmZXcgb3RoZXIgbG9jYXRpb25zCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGNsIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRpL3RjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgICAgIHRjbGNvbmZwYXRoPSRpCi0JICAgICAgICBicmVhawotCSAgICBmaQotICAgICAgICBkb25lCi0KLSAgICAgICAgZG5sIGZpbmQgdGhlIGV4YWN0IFRjbCBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgICAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBUY2wsIGFuZCB3ZSB3YW50IHRoZSBtb3N0IHJlY2VudCBvbmUuCi0gICAgICAgIGZvciBpIGluIGBscyAtZHIgJHRjbGNvbmZwYXRoL3RjbCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRpL3VuaXgvdGNsQ29uZmlnLnNoIDsgdGhlbgotICAgICAgICAgICAgICAgIGFjX2N2X2NfdGNsY29uZmlnPWAoY2QgJGkvdW5peDsgcHdkKWAKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi0KLSAgICBkbmwgQ2hlY2sgdG8gc2VlIGlmIGl0J3MgaW5zdGFsbGVkLiBXZSBoYXZlIHRvIGxvb2sgaW4gdGhlICRDQyBwYXRoCi0gICAgZG5sIHRvIGZpbmQgaXQsIGNhdXNlIG91ciAkcHJlZml4IG1heSBub3QgbWF0Y2ggdGhlIGNvbXBpbGVycy4KLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKLQljY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9saWIKLSAgICAgICAgaWYgdGVzdCAtZiAkY2NwYXRoL3RjbENvbmZpZy5zaDsgdGhlbgotCSAgICBhY19jdl9jX3RjbGNvbmZpZz0kY2NwYXRoCi0gICAgICAgIGZpCi0gICAgZmkKLSAgICBdKQlkbmwgZW5kIG9mIGNhY2hlX3ZhbAotCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIFRDTENPTkZJRz0iIgotICAgICAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIFRjbCBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQotICAgIGVsc2UKLSAgICAgICAgbm9fdGNsPSIiCi0gICAgICAgIFRDTENPTkZJRz0ke2FjX2N2X2NfdGNsY29uZmlnfS90Y2xDb25maWcuc2gKLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke1RDTENPTkZJR30pCi0gICAgIGZpCi1maQotQUNfU1VCU1QoVENMQ09ORklHKQotXSkKLQotZG5sIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKLWRubCBmcm9tIFBBVEhfVENMQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX1RDTENPTkZJRywgWwotICAgIC4gJFRDTENPTkZJRwotCi1kbmwgQUNfU1VCU1QoVENMX1ZFUlNJT04pCi1kbmwgQUNfU1VCU1QoVENMX01BSk9SX1ZFUlNJT04pCi1kbmwgQUNfU1VCU1QoVENMX01JTk9SX1ZFUlNJT04pCi1kbmwgQUNfU1VCU1QoVENMX0NDKQotICAgIEFDX1NVQlNUKFRDTF9ERUZTKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLSAgICBBQ19TVUJTVChUQ0xfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoVENMX0xJQl9GVUxMX1BBVEgpCi0gICAgQUNfU1VCU1QoVENMX0xJQlMpCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUQ0xfUFJFRklYKQotCi0gICAgQUNfU1VCU1QoVENMX0NGTEFHUykKLQotZG5sIG5vdCB1c2VkLCBkb24ndCBleHBvcnQgdG8gc2F2ZSBzeW1ib2xzCi1kbmwgICAgQUNfU1VCU1QoVENMX0VYRUNfUFJFRklYKQotCi0gICAgQUNfU1VCU1QoVENMX1NITElCX0NGTEFHUykKLSAgICBBQ19TVUJTVChUQ0xfU0hMSUJfTEQpCi1kbmwgZG9uJ3QgZXhwb3J0LCBub3QgdXNlZCBvdXRzaWRlIG9mIGNvbmZpZ3VyZQotZG5sIEFDX1NVQlNUKFRDTF9TSExJQl9MRF9MSUJTKQotZG5sIEFDX1NVQlNUKFRDTF9TSExJQl9TVUZGSVgpCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCBBQ19TVUJTVChUQ0xfRExfTElCUykKLSAgICBBQ19TVUJTVChUQ0xfTERfRkxBR1MpCi0gICAgQUNfU1VCU1QoVENMX0xEX1NFQVJDSF9GTEFHUykKLWRubCBkb24ndCBleHBvcnQsIG5vdCB1c2VkIG91dHNpZGUgb2YgY29uZmlndXJlCi1kbmwgQUNfU1VCU1QoVENMX0NPTVBBVF9PQkpTKQotICAgIEFDX1NVQlNUKFRDTF9SQU5MSUIpCi0gICAgQUNfU1VCU1QoVENMX0JVSUxEX0xJQl9TUEVDKQotICAgIEFDX1NVQlNUKFRDTF9MSUJfU1BFQykKLWRubCBBQ19TVUJTVChUQ0xfTElCX1ZFUlNJT05TX09LKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUQ0xfU0hBUkVEX0xJQl9TVUZGSVgpCi0KLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRDTF9VTlNIQVJFRF9MSUJfU1VGRklYKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BQ19ERUZVTihDWUdfQUNfUEFUSF9USywgWwotICAgIENZR19BQ19QQVRIX1RLSAotICAgIENZR19BQ19QQVRIX1RLQ09ORklHCi0gICAgQ1lHX0FDX0xPQURfVEtDT05GSUcKLV0pCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9US0gsIFsKLSMKLSMgT2ssIGxldHMgZmluZCB0aGUgdGsgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGhlYWRlcnMKLSMgSWYgdGhlIGRpcmVjdG9yeSAocHJlc3VtYWJseSBzeW1saW5rKSBuYW1lZCAidGsiIGV4aXN0cywgdXNlIHRoYXQgb25lCi0jIGluIHByZWZlcmVuY2UgdG8gYW55IG90aGVycy4gIFNhbWUgbG9naWMgaXMgdXNlZCB3aGVuIGNob29zaW5nIGxpYnJhcnkKLSMgYW5kIGFnYWluIHdpdGggVGNsLiBUaGUgc2VhcmNoIG9yZGVyIGlzIHRoZSBiZXN0IHBsYWNlIHRvIGxvb2sgZmlyc3QsIHRoZW4gaW4KLSMgZGVjcmVhc2luZyBzaWduaWZpY2FuY2UuIFRoZSBsb29wIGJyZWFrcyBpZiB0aGUgdHJpZ2dlciBmaWxlIGlzIGZvdW5kLgotIyBOb3RlIHRoZSBncm9zcyBsaXR0bGUgY29udmVyc2lvbiBoZXJlIG9mIHNyY2RpciBieSBjZCdpbmcgdG8gdGhlIGZvdW5kCi0jIGRpcmVjdG9yeS4gVGhpcyBjb252ZXJ0cyB0aGUgcGF0aCBmcm9tIGEgcmVsYXRpdmUgdG8gYW4gYWJzb2x1dGUsIHNvCi0jIHJlY3Vyc2l2ZSBjYWNoZSB2YXJpYWJsZXMgZm9yIHRoZSBwYXRoIHdpbGwgd29yayByaWdodC4gV2UgY2hlY2sgYWxsCi0jIHRoZSBwb3NzaWJsZSBwYXRocyBpbiBvbmUgbG9vcCByYXRoZXIgdGhhbiBtYW55IHNlcGVyYXRlIGxvb3BzIHRvIHNwZWVkCi0jIHRoaW5ncyB1cC4KLSMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLXRraW5jbHVkZQotIwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX3RrPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgVGsgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSCh0a2luY2x1ZGUsIFsgIC0td2l0aC10a2luY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIHRrIGhlYWRlcnMgYXJlXSwgd2l0aF90a2luY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3RraCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10a2luY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF90a2luY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF90a2luY2x1ZGV9L3RrLmggOyB0aGVuCi0gICAgYWNfY3ZfY190a2g9YChjZCAke3dpdGhfdGtpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF90a2luY2x1ZGV9L2dlbmVyaWMvdGsuaCA7IHRoZW4KLSAgICBhY19jdl9jX3RraD1gKGNkICR7d2l0aF90a2luY2x1ZGV9L2dlbmVyaWM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF90a2luY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGsgY29uZmlndXJhdGlvbiBmaWxlCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfY3ZfY190a2NvbmZpZy8kaS9nZW5lcmljL3RrLmggOyB0aGVuCi0gICAgICBhY19jdl9jX3RraD1gKGNkICRhY19jdl9jX3RrY29uZmlnLyRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX3RraH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIFRrIHNvdXJjZSBkaXJlY3RvcnkKLSAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgaWYgdGVzdCAtbiAiYGxzIC1kciAkc3JjZGlyLyRpL3RrKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICB0a3BhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IFRrIHNvdXJjZSBkaXIuIFdlIGRvIGl0IHRoaXMgd2F5LCBjYXVzZSB0aGVyZQotICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRrLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJHRrcGF0aC90ayogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvZ2VuZXJpYy90ay5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfdGtoPWAoY2QgJGkvZ2VuZXJpYzsgcHdkKWAKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiA9IHggOyB0aGVuCi0gICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyLiBXZSBkbyBpdCB0aGlzIHdheSBpbnN0ZWFkIG9mIHVzaW5nCi0gICAgZG5sIEFDX0NIRUNLX0hFQURFUiwgY2F1c2UgdGhpcyBkb2Vzbid0IGRlcGVuZCBpbiBoYXZpbmcgWCBjb25maWd1cmVkLgotICAgIGNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2luY2x1ZGUKLSAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGsuaDsgdGhlbgotCWFjX2N2X2NfdGtoPSRjY3BhdGgKLSAgICBmaQotZWxzZQotICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGtofSkKLWZpCi1dKQotICBUS0hESVI9IiIKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGtofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBhbnkgVGsgaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiAhPSB4IDsgdGhlbgotICAgIG5vX3RrPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2h9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0JaWYgdGVzdCB4IiR7Q0N9IiA9IHhjbCA7IHRoZW4KLQkgICAgdG1wPSJgY3lncGF0aCAtLXdpbmRvd3MgJHthY19jdl9jX3RraH1gIgotCSAgICBhY19jdl9jX3RraD0iYGVjaG8gJHRtcCB8IHNlZCAtZSBzI1xcXFxcXFxcIy8jZ2AiCi0JZmkKLSAgICAgICAgQUNfTVNHX1JFU1VMVChbZm91bmQgaW4gJHthY19jdl9jX3RraH1dKQotICAgICAgICBUS0hESVI9Ii1JJHthY19jdl9jX3RraH0iCi0gICAgZmkKLWZpCi0KLUFDX1NVQlNUKFRLSERJUikKLV0pCi0KLUFDX0RFRlVOKENZR19BQ19QQVRIX1RLQ09ORklHLCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotZG5sIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKLWRubCB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC10a2NvbmZpZwotaWYgdGVzdCB4IiR7bm9fdGt9IiA9IHggOyB0aGVuCi0gIGRubCB3ZSByZXNldCBub190ayBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCi0gICAgbm9fdGs9dHJ1ZQotICAgIEFDX0FSR19XSVRIKHRrY29uZmlnLCBbICAtLXdpdGgtdGtjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRrIGNvbmZpZ3VyYXRpb24gKHRrQ29uZmlnLnNoKV0sCi0gICAgICAgICB3aXRoX3RrY29uZmlnPSR7d2l0aHZhbH0pCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgVGsgY29uZmlndXJhdGlvbiBzY3JpcHRdKQotICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX3RrY29uZmlnLFsKLQotICAgIGRubCBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLXRrY29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gICAgaWYgdGVzdCB4IiR7d2l0aF90a2NvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90a2NvbmZpZ30vdGtDb25maWcuc2giIDsgdGhlbgotICAgICAgICAgICAgYWNfY3ZfY190a2NvbmZpZz1gKGNkICR7d2l0aF90a2NvbmZpZ307IHB3ZClgCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RrY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIHRrQ29uZmlnLnNoXSkKLSAgICAgICAgZmkKLSAgICBmaQotCi0gICAgZG5sIG5leHQgY2hlY2sgaWYgaXQgY2FtZSB3aXRoIFRrIGNvbmZpZ3VyYXRpb24gZmlsZSBpbiB0aGUgc291cmNlIHRyZWUKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci8kaS91bml4L3RrQ29uZmlnLnNoIDsgdGhlbgotICAgICAgICAgICAgICAgIGFjX2N2X2NfdGtjb25maWc9YChjZCAkc3JjZGlyLyRpL3VuaXg7IHB3ZClgCi0JICAgICAgICBicmVhawotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi0gICAgZG5sIGNoZWNrIGluIGEgZmV3IG90aGVyIGxvY2F0aW9ucwotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgVGsgc291cmNlIGRpcmVjdG9yeQotICAgICAgICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJGkvdGsqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgICAgICB0a2NvbmZwYXRoPSRpCi0JICAgICAgICBicmVhawotCSAgICBmaQotICAgICAgICBkb25lCi0KLSAgICAgICAgZG5sIGZpbmQgdGhlIGV4YWN0IFRrIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgICAgIGRubCBtaWdodCBiZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIFRrLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgICAgICBmb3IgaSBpbiBgbHMgLWRyICR0a2NvbmZwYXRoL3RrKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJGkvdW5peC90a0NvbmZpZy5zaCA7IHRoZW4KLSAgICAgICAgICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJGkvdW5peDsgcHdkKWAKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZmkKLSAgICAgICAgZG9uZQotICAgIGZpCi0KLSAgICBkbmwgQ2hlY2sgdG8gc2VlIGlmIGl0J3MgaW5zdGFsbGVkLiBXZSBoYXZlIHRvIGxvb2sgaW4gdGhlICRDQyBwYXRoCi0gICAgZG5sIHRvIGZpbmQgaXQsIGNhdXNlIG91ciAkcHJlZml4IG1heSBub3QgbWF0Y2ggdGhlIGNvbXBpbGVycy4KLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX3RrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgICAgICBkbmwgR2V0IHRoZSBwYXRoIHRvIHRoZSBjb21waWxlcgotCWNjcGF0aD1gd2hpY2ggJHtDQ30gIHwgc2VkIC1lICdzOi9iaW4vLio6OidgL2xpYgotICAgICAgICBpZiB0ZXN0IC1mICRjY3BhdGgvdGtDb25maWcuc2g7IHRoZW4KLQkgICAgYWNfY3ZfY190a2NvbmZpZz0kY2NwYXRoCi0gICAgICAgIGZpCi0gICAgZmkKLSAgICBdKQlkbmwgZW5kIG9mIGNhY2hlX3ZhbAotCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY190a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICAgICAgVEtDT05GSUc9IiIKLSAgICAgICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBUayBjb25maWd1cmF0aW9uIGRlZmluaXRpb25zKQotICAgIGVsc2UKLSAgICAgICAgbm9fdGs9IiIKLSAgICAgICAgVEtDT05GSUc9JHthY19jdl9jX3RrY29uZmlnfS90a0NvbmZpZy5zaAotICAgICAgICBBQ19NU0dfUkVTVUxUKCR7VEtDT05GSUd9KQotICAgICBmaQotZmkKLUFDX1NVQlNUKFRLQ09ORklHKQotXSkKLQotZG5sIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKLWRubCBmcm9tIFBBVEhfVEtDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgotQUNfREVGVU4oQ1lHX0FDX0xPQURfVEtDT05GSUcsIFsKLSAgICBpZiB0ZXN0IC1mICIkVEtDT05GSUciIDsgdGhlbgotICAgICAgLiAkVEtDT05GSUcKLSAgICBmaQotCi0gICAgQUNfU1VCU1QoVEtfVkVSU0lPTikKLWRubCBub3QgYWN0dWFsbHkgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRLX01BSk9SX1ZFUlNJT04pCi1kbmwgICAgQUNfU1VCU1QoVEtfTUlOT1JfVkVSU0lPTikKLSAgICBBQ19TVUJTVChUS19ERUZTKQotCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLSAgICBBQ19TVUJTVChUS19MSUJfRklMRSkKLSAgICBBQ19TVUJTVChUS19MSUJfRlVMTF9QQVRIKQotICAgIEFDX1NVQlNUKFRLX0xJQlMpCi1kbmwgbm90IHVzZWQsIGRvbid0IGV4cG9ydCB0byBzYXZlIHN5bWJvbHMKLWRubCAgICBBQ19TVUJTVChUS19QUkVGSVgpCi0KLWRubCBub3QgdXNlZCwgZG9uJ3QgZXhwb3J0IHRvIHNhdmUgc3ltYm9scwotZG5sICAgIEFDX1NVQlNUKFRLX0VYRUNfUFJFRklYKQotICAgIEFDX1NVQlNUKFRLX0JVSUxEX0lOQ0xVREVTKQotICAgIEFDX1NVQlNUKFRLX1hJTkNMVURFUykKLSAgICBBQ19TVUJTVChUS19YTElCU1cpCi0gICAgQUNfU1VCU1QoVEtfQlVJTERfTElCX1NQRUMpCi0gICAgQUNfU1VCU1QoVEtfTElCX1NQRUMpCi1dKQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLWl0Y2xpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMLCBbCi0gICAgQ1lHX0FDX1BBVEhfSVRDTEgKLSAgICBDWUdfQUNfUEFUSF9JVENMTElCCi0gICAgQ1lHX0FDX1BBVEhfSVRDTFNICi0gICAgQ1lHX0FDX1BBVEhfSVRDTE1LSURYCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTEgsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub19pdGNsPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgSXRjbCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0FSR19XSVRIKGl0Y2xpbmNsdWRlLCBbICAtLXdpdGgtaXRjbGluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIGl0Y2wgaGVhZGVycyBhcmVdLCB3aXRoX2l0Y2xpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsaCxbCi1kbmwgZmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsaW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX2l0Y2xpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L2l0Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xoPWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjL2l0Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xoPWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBoZWFkZXJzXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBJdGNsIGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgIT0geCA7IHRoZW4KLSAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgaWYgdGVzdCAtZiAkYWNfY3ZfY19pdGNsY29uZmlnLyRpL3NyYy9pdGNsLmggOyB0aGVuCi0gICAgICBhY19jdl9jX2l0Y2xoPWAoY2QgJGFjX2N2X2NfaXRjbGNvbmZpZy8kaS9zcmM7IHB3ZClgCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgSXRjbCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS9pdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICBpdGNscGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgSXRjbCBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBJdGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJGl0Y2xwYXRoL2l0Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL3NyYy9pdGNsLmggOyB0aGVuCi0gICAgICAgICAgYWNfY3ZfY19pdGNsaD1gKGNkICRpL3NyYzsgcHdkKWAKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgIGRvbmUKLWZpCi0KLWRubCBzZWUgaWYgb25lIGlzIGluc3RhbGxlZAotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iID0geCA7IHRoZW4KLSAgIEFDX01TR19SRVNVTFQobm9uZSkKLSAgIEFDX0NIRUNLX0hFQURFUihpdGNsLmgsIGFjX2N2X2NfaXRjbGg9aW5zdGFsbGVkLCBhY19jdl9jX2l0Y2xoPSIiKQotZWxzZQotICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbGh9KQotZmkKLV0pCi0gIElUQ0xIRElSPSIiCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCBhbnkgSXRjbCBoZWFkZXJzXSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xofSIgIT0geCA7IHRoZW4KLSAgICBub19pdGNsPSIiCi0gICAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsaH0iICE9IHgiaW5zdGFsbGVkIiA7IHRoZW4KLSAgICAgICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbGh9KQotICAgICAgICBJVENMSERJUj0iLUkke2FjX2N2X2NfaXRjbGh9IgotICAgIGZpCi1maQotCi1BQ19TVUJTVChJVENMSERJUikKLV0pCi0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIGxpYnJhcnkKLWRubCBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtaXRjbGxpYgotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTExJQiwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLWlmIHRlc3QgeCIke25vX2l0Y2x9IiA9IHggOyB0aGVuCi0gICAgZG5sIHdlIHJlc2V0IG5vX2l0Y2wgaW5jYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCi0gICAgbm9faXRjbD10cnVlCi0gICAgQUNfQVJHX1dJVEgoaXRjbGxpYiwKLQlbICAtLXdpdGgtaXRjbGxpYiAgICAgICAgICAgZGlyZWN0b3J5IHdoZXJlIHRoZSBpdGNsIGxpYnJhcnkgaXNdLAotICAgICAgICB3aXRoX2l0Y2xsaWI9JHt3aXRodmFsfSkKLSAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJdGNsIGxpYnJhcnldKQotICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xsaWIsWwotICAgIGRubCBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xsaWIgd2FzIHNwZWNpZmllZC4KLSAgICBpZiB0ZXN0IHgiJHt3aXRoX2l0Y2xsaWJ9IiAhPSB4IDsgdGhlbgotICAgICAgICBpZiB0ZXN0IC1mICIke3dpdGhfaXRjbGxpYn0vbGliaXRjbCRUQ0xfU0hBUkVEX0xJQl9TVUZGSVgiIDsgdGhlbgotICAgICAgICAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJHt3aXRoX2l0Y2xsaWJ9OyBwd2QpYC9saWJpdGNsJFRDTF9TSEFSRURfTElCX1NVRkZJWAotCWVsc2UKLQkgICAgaWYgdGVzdCAtZiAiJHt3aXRoX2l0Y2xsaWJ9L2xpYml0Y2wkVENMX1VOU0hBUkVEX0xJQl9TVUZGSVgiOyB0aGVuCi0JIAlhY19jdl9jX2l0Y2xsaWI9YChjZCAke3dpdGhfaXRjbGxpYn07IHB3ZClgL2xpYml0Y2wkVENMX1VOU0hBUkVEX0xJQl9TVUZGSVgKLQkgICAgZmkKLQlmaQotICAgIGZpCi0gICAgZG5sIHRoZW4gY2hlY2sgZm9yIGEgIEl0Y2wgbGlicmFyeS4gU2luY2UgdGhlc2UgYXJlIHVuaW5zdGFsbGVkLAotICAgIGRubCB1c2UgdGhlIHNpbXBsZSBsaWIgbmFtZSByb290LiAKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgSXRjbCBidWlsZCBkaXJlY3RvcnkKLSAgICAgICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRpL2l0Y2wqIDI+L2Rldi9udWxsYCIgOyB0aGVuCi0JICAgICAgICBpdGNscGF0aD0kaS9pdGNsCi0JICAgICAgICBicmVhawotCSAgICBmaQotICAgICAgICBkb25lCi0gICAgICAgIGRubCBJdGNsIDcuNSBhbmQgZ3JlYXRlciBwdXRzIGxpYnJhcnkgaW4gc3ViZGlyLiAgTG9vayB0aGVyZSBmaXJzdC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJGl0Y2xwYXRoL3NyYy9saWJpdGNsLiRUQ0xfU0hMSUJfU1VGRklYIiA7IHRoZW4KLQkgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICRpdGNscGF0aC9zcmM7IHB3ZClgCi0gICAgICAgIGVsaWYgdGVzdCAtZiAiJGl0Y2xwYXRoL3NyYy9saWJpdGNsLmEiOyB0aGVuCi0JICAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAkaXRjbHBhdGgvc3JjOyBwd2QpYAotCWZpCi0gICAgZmkKLSAgICBkbmwgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgICAgIGZvciBpIGluICR7ZGlybGlzdH07IGRvCi0gICAgICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICR7c3JjZGlyfS8kaS9pdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICAgICAgaXRjbHBhdGg9JHtzcmNkaXJ9LyRpCi0JICAgICAgICBicmVhawotCSAgICBmaQotICAgICAgICBkb25lCi0gICAgICAgIGZvciBpIGluIGBscyAtZHIgJHtpdGNscGF0aH0vaXRjbCogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgICAgICAgIGRubCBJdGNsIDcuNSBhbmQgZ3JlYXRlciBwdXRzIGxpYnJhcnkgaW4gc3ViZGlyLiAgTG9vayB0aGVyZSBmaXJzdC4KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgIiRpL3NyYy9saWJpdGNsJFRDTF9TSExJQl9TVUZGSVgiIDsgdGhlbgotCSAgICAgICAgYWNfY3ZfY19pdGNsbGliPWAoY2QgJGkvc3JjOyBwd2QpYAotCSAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsaWYgdGVzdCAtZiAiJGkvc3JjL2xpYml0Y2wuYSI7IHRoZW4KLQkgICAgICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICRpL3NyYzsgcHdkKWAKLQkgICAgICAgIGJyZWFrCi0JICAgIGZpCQotICAgICAgICBkb25lCi0gICAgZmkKLQotICAgIGRubCBzZWUgaWYgb25lIGlzIGNvbnZlbmllbnRseSBpbnN0YWxsZWQgd2l0aCB0aGUgY29tcGlsZXIKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xsaWJ9IiA9IHggOyB0aGVuCi0gICAgICAgIGRubCBHZXQgdGhlIHBhdGggdG8gdGhlIGNvbXBpbGVyCi0JY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvbGliCi0gICAgICAgIGRubCBJdGNsIDcuNSBhbmQgZ3JlYXRlciBwdXRzIGxpYnJhcnkgaW4gc3ViZGlyLiAgTG9vayB0aGVyZSBmaXJzdC4KLSAgICAgICAgaWYgdGVzdCAtZiAiJHtjY3BhdGh9L2xpYml0Y2wkVENMX1NITElCX1NVRkZJWCIgOyB0aGVuCi0JICAgIGFjX2N2X2NfaXRjbGxpYj1gKGNkICR7Y2NwYXRofTsgcHdkKWAKLSAgICAgICAgZWxpZiB0ZXN0IC1mICIke2NjcGF0aH0vbGliaXRjbC5hIjsgdGhlbgotCSAgICBhY19jdl9jX2l0Y2xsaWI9YChjZCAke2NjcGF0aH07IHB3ZClgCi0gICAgICAgIGZpCi0gICAgZmkKLSAgICBdKQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGxpYn0iID0geCA7IHRoZW4KLSAgICAgICAgSVRDTExJQj0iIgotICAgICAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIEl0Y2wgbGlicmFyeSkKLSAgICBlbHNlCi0gICAgICAgIElUQ0xMSUI9Ii1MJHthY19jdl9jX2l0Y2xsaWJ9IgotICAgICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19pdGNsbGlifSkKLSAgICAgICAgbm9faXRjbD0iIgotICAgIGZpCi1maQotCi1BQ19QUk9WSURFKFskMF0pCi1BQ19TVUJTVChJVENMTElCKQotXSkKLQotCi1kbmwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLWRubCBPaywgbGV0cyBmaW5kIHRoZSBpdGNsIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBpdGNsX3NoIHNjcmlwdAotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC1pdGNsaW5jbHVkZQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfSVRDTFNILCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotbm9faXRjbD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIHRoZSBpdGNsX3NoIHNjcmlwdCkKLUFDX0FSR19XSVRIKGl0Y2xpbmNsdWRlLCBbICAtLXdpdGgtaXRjbGluY2x1ZGUgICAgICAgZGlyZWN0b3J5IHdoZXJlIGl0Y2wgaGVhZGVycyBhcmVdLCB3aXRoX2l0Y2xpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19pdGNsc2gsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtaXRjbGluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF9pdGNsaW5jbHVkZX0iICE9IHggOyB0aGVuCi0gIGlmIHRlc3QgLWYgJHt3aXRoX2l0Y2xpbmNsdWRlfS9pdGNsX3NoIDsgdGhlbgotICAgIGFjX2N2X2NfaXRjbHNoPWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfTsgcHdkKWAKLSAgZWxpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vc3JjL2l0Y2xfc2ggOyB0aGVuCi0gICAgYWNfY3ZfY19pdGNsc2g9YChjZCAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0Y2xpbmNsdWRlfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0Y2xfc2hdKQotICBmaQotZmkKLQotZG5sIG5leHQgY2hlY2sgaW4gcHJpdmF0ZSBzb3VyY2UgZGlyZWN0b3J5Ci1kbmwgc2luY2UgbHMgcmV0dXJucyBsb3dlc3QgdmVyc2lvbiBudW1iZXJzIGZpcnN0LCByZXZlcnNlIGl0cyBvdXRwdXQKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbHNofSIgPSB4IDsgdGhlbgotICAgIGRubCBmaW5kIHRoZSB0b3AgbGV2ZWwgSXRjbCBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgZm9yIGkgaW4gJGRpcmxpc3Q7IGRvCi0gICAgICAgIGlmIHRlc3QgLW4gImBscyAtZHIgJHNyY2Rpci8kaS9pdGNsKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICBpdGNscGF0aD0kc3JjZGlyLyRpCi0JICAgIGJyZWFrCi0JZmkKLSAgICBkb25lCi0KLSAgICBkbmwgZmluZCB0aGUgZXhhY3QgSXRjbCBzb3VyY2UgZGlyLiBXZSBkbyBpdCB0aGlzIHdheSwgY2F1c2UgdGhlcmUKLSAgICBkbmwgbWlnaHQgYmUgbXVsdGlwbGUgdmVyc2lvbiBvZiBJdGNsLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJGl0Y2xwYXRoL2l0Y2wqIDI+L2Rldi9udWxsIGAgOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRpL3NyYy9pdGNsX3NoIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfaXRjbHNoPWAoY2QgJGkvc3JjOyBwd2QpYC9pdGNsX3NoCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbHNofSIgPSB4IDsgdGhlbgotICAgQUNfTVNHX1JFU1VMVChub25lKQotICAgQUNfUEFUSF9QUk9HKGFjX2N2X2NfaXRjbHNoLCBpdGNsX3NoKQotZWxzZQotICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbHNofSkKLWZpCi1dKQotCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xzaH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgdGhlIGl0Y2xfc2ggc2NyaXB0XSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xzaH0iICE9IHggOyB0aGVuCi0gICAgbm9faXRjbD0iIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX2l0Y2xzaH0pCi0gICAgSVRDTFNIPSIke2FjX2N2X2NfaXRjbHNofSIKLWZpCi1BQ19TVUJTVChJVENMU0gpCi1dKQotCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIGl0Y2wgc291cmNlIHRyZWVzIHNvIHdlIGNhbiB1c2UgdGhlIGl0Y2xfc2ggc2NyaXB0Ci1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLWl0Y2xpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9JVENMTUtJRFgsIFsKLWRpcmxpc3Q9Ii4uIC4uLy4uLyAuLi8uLi8uLi8gLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub19pdGNsPXRydWUKLUFDX01TR19DSEVDS0lORyhmb3IgaXRjbF9ta2luZGV4LnRjbCBzY3JpcHQpCi1BQ19BUkdfV0lUSChpdGNsaW5jbHVkZSwgWyAgLS13aXRoLWl0Y2xpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSBpdGNsIGhlYWRlcnMgYXJlXSwgd2l0aF9pdGNsaW5jbHVkZT0ke3dpdGh2YWx9KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfaXRjbG1raWR4LFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0Y2xpbmNsdWRlIHdhcyBzcGVjaWZpZWQKLWlmIHRlc3QgeCIke3dpdGhfaXRjbGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF9pdGNsaW5jbHVkZX0vaXRjbF9zaCA7IHRoZW4KLSAgICBhY19jdl9jX2l0Y2xta2lkeD1gKGNkICR7d2l0aF9pdGNsaW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfaXRjbGluY2x1ZGV9L3NyYy9pdGNsX3NoIDsgdGhlbgotICAgIGFjX2N2X2NfaXRjbG1raWR4PWAoY2QgJHt3aXRoX2l0Y2xpbmNsdWRlfS9zcmM7IHB3ZClgCi0gIGVsc2UKLSAgICBBQ19NU0dfRVJST1IoWyR7d2l0aF9pdGNsaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBpdGNsX3NoXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xta2lkeH0iID0geCA7IHRoZW4KLSAgICBkbmwgZmluZCB0aGUgdG9wIGxldmVsIEl0Y2wgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvaXRjbCogMj4vZGV2L251bGxgIiA7IHRoZW4KLQkgICAgaXRjbHBhdGg9JHNyY2Rpci8kaQotCSAgICBicmVhawotCWZpCi0gICAgZG9uZQotCi0gICAgZG5sIGZpbmQgdGhlIGV4YWN0IEl0Y2wgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgSXRjbCwgYW5kIHdlIHdhbnQgdGhlIG1vc3QgcmVjZW50IG9uZS4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRpdGNscGF0aC9pdGNsKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9saWJyYXJ5L2l0Y2xfbWtpbmRleC50Y2wgOyB0aGVuCi0gICAgICAgICAgYWNfY3ZfY19pdGNsbWtpZHg9YChjZCAkaS9saWJyYXJ5OyBwd2QpYC9pdGNsX21raW5kZXgudGNsCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsbWtpZHh9IiA9IHggOyB0aGVuCi0gICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKLSAgICBjY3BhdGg9YHdoaWNoICR7Q0N9ICB8IHNlZCAtZSAnczovYmluLy4qOjonYC9zaGFyZQotICAgIGRubCBJdGNsIDcuNSBhbmQgZ3JlYXRlciBwdXRzIGxpYnJhcnkgaW4gc3ViZGlyLiAgTG9vayB0aGVyZSBmaXJzdC4KLSAgICBmb3IgaSBpbiBgbHMgLWRyICRjY3BhdGgvaXRjbCogMj4vZGV2L251bGwgYCA7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGkvaXRjbF9ta2luZGV4LnRjbCA7IHRoZW4KLSAgICAgICAgICAgIGFjX2N2X2NfaXRjbG1raWR4PWAoY2QgJGk7IHB3ZClgL2l0Y2xfbWtpbmRleC50Y2wKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLV0pCi0KLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbG1raWR4fSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19FUlJPUihbQ2FuJ3QgZmluZCB0aGUgaXRjbF9ta2luZGV4LnRjbCBzY3JpcHRdKQotZmkKLWlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbG1raWR4fSIgIT0geCA7IHRoZW4KLSAgICBub19pdGNsPSIiCi0gICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfaXRjbG1raWR4fSkKLSAgICBJVENMTUtJRFg9IiR7YWNfY3ZfY19pdGNsbWtpZHh9IgotZWxzZQotICAgQUNfTVNHX1JFU1VMVChub25lKQotZmkKLUFDX1NVQlNUKElUQ0xNS0lEWCkKLV0pCi0KLWRubCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZG5sIE9rLCBsZXRzIGZpbmQgdGhlIHRpeCBzb3VyY2UgdHJlZXMgc28gd2UgY2FuIHVzZSB0aGUgaGVhZGVycwotZG5sIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9sa2VkIGJ5IC0td2l0aC10aXhpbmNsdWRlCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9USVgsIFsKLSAgICBDWUdfQUNfUEFUSF9USVhICi0gICAgQ1lHX0FDX1BBVEhfVElYTElCCi1dKQotQUNfREVGVU4oQ1lHX0FDX1BBVEhfVElYSCwgWwotZGlybGlzdD0iLi4gLi4vLi4vIC4uLy4uLy4uLyAuLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiAuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLiIKLW5vX3RpeD10cnVlCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIFRpeCBoZWFkZXJzIGluIHRoZSBzb3VyY2UgdHJlZSkKLUFDX0FSR19XSVRIKHRpeGluY2x1ZGUsIFsgIC0td2l0aC10aXhpbmNsdWRlICAgICAgIGRpcmVjdG9yeSB3aGVyZSB0aXggaGVhZGVycyBhcmVdLCB3aXRoX3RpeGluY2x1ZGU9JHt3aXRodmFsfSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9jX3RpeGgsWwotZG5sIGZpcnN0IGNoZWNrIHRvIHNlZSBpZiAtLXdpdGgtdGl4aW5jbHVkZSB3YXMgc3BlY2lmaWVkCi1pZiB0ZXN0IHgiJHt3aXRoX3RpeGluY2x1ZGV9IiAhPSB4IDsgdGhlbgotICBpZiB0ZXN0IC1mICR7d2l0aF90aXhpbmNsdWRlfS90aXguaCA7IHRoZW4KLSAgICBhY19jdl9jX3RpeGg9YChjZCAke3dpdGhfdGl4aW5jbHVkZX07IHB3ZClgCi0gIGVsaWYgdGVzdCAtZiAke3dpdGhfdGl4aW5jbHVkZX0vZ2VuZXJpYy90aXguaCA7IHRoZW4KLSAgICBhY19jdl9jX3RpeGg9YChjZCAke3dpdGhfdGl4aW5jbHVkZX0vZ2VuZXJpYzsgcHdkKWAKLSAgZWxzZQotICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RpeGluY2x1ZGV9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaGVhZGVyc10pCi0gIGZpCi1maQotCi1kbmwgbmV4dCBjaGVjayBpZiBpdCBjYW1lIHdpdGggVGl4IGNvbmZpZ3VyYXRpb24gZmlsZQotaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiAhPSB4IDsgdGhlbgotICBmb3IgaSBpbiAkZGlybGlzdDsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19jdl9jX3RpeGNvbmZpZy8kaS9nZW5lcmljL3RpeC5oIDsgdGhlbgotICAgICAgYWNfY3ZfY190aXhoPWAoY2QgJGFjX2N2X2NfdGl4Y29uZmlnLyRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBUaXggc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvdGl4KiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICB0aXhwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBUaXggc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgVGl4LCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJHRpeHBhdGgvdGl4KiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9nZW5lcmljL3RpeC5oIDsgdGhlbgotICAgICAgICAgIGFjX2N2X2NfdGl4aD1gKGNkICRpL2dlbmVyaWM7IHB3ZClgCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICBkb25lCi1maQotCi1kbmwgc2VlIGlmIG9uZSBpcyBpbnN0YWxsZWQKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIKLQotICAgZG5sIEdldCB0aGUgcGF0aCB0byB0aGUgY29tcGlsZXIuIFdlIGRvIGl0IHRoaXMgd2F5IGluc3RlYWQgb2YgdXNpbmcKLSAgICBkbmwgQUNfQ0hFQ0tfSEVBREVSLCBjYXVzZSB0aGlzIGRvZXNuJ3QgZGVwZW5kIGluIGhhdmluZyBYIGNvbmZpZ3VyZWQuCi0gICAgY2NwYXRoPWB3aGljaCAke0NDfSAgfCBzZWQgLWUgJ3M6L2Jpbi8uKjo6J2AvaW5jbHVkZQotICAgIGlmIHRlc3QgLWYgJGNjcGF0aC90aXguaDsgdGhlbgotCWFjX2N2X2NfdGl4aD1pbnN0YWxsZWQKLSAgICBmaQotZWxzZQotICAgQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfdGl4aH0pCi1maQotXSkKLWlmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iID0geCA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoW0Nhbid0IGZpbmQgYW55IFRpeCBoZWFkZXJzXSkKLWZpCi1pZiB0ZXN0IHgiJHthY19jdl9jX3RpeGh9IiAhPSB4IDsgdGhlbgotICAgIG5vX3RpeD0iIgotICAgIEFDX01TR19SRVNVTFQoJHthY19jdl9jX3RpeGh9KQotICAgIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4aH0iICE9IHgiaW5zdGFsbGVkIiA7IHRoZW4KLSAgICAgICAgVElYSERJUj0iLUkke2FjX2N2X2NfdGl4aH0iCi0gICAgZmkKLWZpCi0KLUFDX1NVQlNUKFRJWEhESVIpCi1dKQotCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9USVhDT05GSUcsIFsKLSMKLSMgT2ssIGxldHMgZmluZCB0aGUgdGl4IGNvbmZpZ3VyYXRpb24KLSMgRmlyc3QsIGxvb2sgZm9yIG9uZSB1bmluc3RhbGxlZC4gIAotIyB0aGUgYWx0ZXJuYXRpdmUgc2VhcmNoIGRpcmVjdG9yeSBpcyBpbnZva2VkIGJ5IC0td2l0aC10aXhjb25maWcKLSMKLQotaWYgdGVzdCB4IiR7bm9fdGl4fSIgPSB4IDsgdGhlbgotICAjIHdlIHJlc2V0IG5vX3RpeCBpbiBjYXNlIHNvbWV0aGluZyBmYWlscyBoZXJlCi0gIG5vX3RpeD10cnVlCi0gIEFDX0FSR19XSVRIKHRpeGNvbmZpZywgWyAgLS13aXRoLXRpeGNvbmZpZyAgICAgICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGl4IGNvbmZpZ3VyYXRpb24gKHRpeENvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF90aXhjb25maWc9JHt3aXRodmFsfSkKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgVGl4IGNvbmZpZ3VyYXRpb25dKQotICBBQ19DQUNIRV9WQUwoYWNfY3ZfY190aXhjb25maWcsWwotCi0gICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC10aXhjb25maWcgd2FzIHNwZWNpZmllZC4KLSAgaWYgdGVzdCB4IiR7d2l0aF90aXhjb25maWd9IiAhPSB4IDsgdGhlbgotICAgIGlmIHRlc3QgLWYgIiR7d2l0aF90aXhjb25maWd9L3RpeENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICBhY19jdl9jX3RpeGNvbmZpZz1gKGNkICR7d2l0aF90aXhjb25maWd9OyBwd2QpYAotICAgIGVsc2UKLSAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX3RpeGNvbmZpZ30gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiB0aXhDb25maWcuc2hdKQotICAgIGZpCi0gIGZpCi0KLSAgIyB0aGVuIGNoZWNrIGZvciBhIHByaXZhdGUgVGl4IGxpYnJhcnkKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gXAotCQkuLi90aXggXAotCQlgbHMgLWRyIC4uL3RpeFtbNF1dKiAyPi9kZXYvbnVsbGAgXAotCQkuLi8uLi90aXggXAotCQlgbHMgLWRyIC4uLy4uL3RpeFtbNF1dKiAyPi9kZXYvbnVsbGAgXAotCQkuLi8uLi8uLi90aXggXAotCQlgbHMgLWRyIC4uLy4uLy4uL3RpeFtbNF1dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvdGl4Q29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY190aXhjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIGBscyAtZCAke3ByZWZpeH0vbGliIC91c3IvbG9jYWwvbGliIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS90aXhDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX3RrY29uZmlnPWAoY2QgJGk7IHB3ZClgCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICBmaQotICAjIGNoZWNrIGluIGEgZmV3IG90aGVyIHByaXZhdGUgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfdGl4Y29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJJHtzcmNkaXJ9Ly4uL3RpeCBcCi0JCWBscyAtZHIgJHtzcmNkaXJ9Ly4uL3RpeFtbNC05XV0qIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS90aXhDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX3RpeGNvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgXSkKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY190aXhjb25maWd9IiA9IHggOyB0aGVuCi0gICAgVElYQ09ORklHPSIjIG5vIFRpeCBjb25maWdzIGZvdW5kIgotICAgIEFDX01TR19XQVJOKENhbid0IGZpbmQgVGl4IGNvbmZpZ3VyYXRpb24gZGVmaW5pdGlvbnMpCi0gIGVsc2UKLSAgICBub190aXg9Ci0gICAgVElYQ09ORklHPSR7YWNfY3ZfY190aXhjb25maWd9L3RpeENvbmZpZy5zaAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJFRJWENPTkZJRykKLSAgZmkKLWZpCi0KLV0pCi0KLSMgRGVmaW5lZCBhcyBhIHNlcGFyYXRlIG1hY3JvIHNvIHdlIGRvbid0IGhhdmUgdG8gY2FjaGUgdGhlIHZhbHVlcwotIyBmcm9tIFBBVEhfVElYQ09ORklHIChiZWNhdXNlIHRoaXMgY2FuIGFsc28gYmUgY2FjaGVkKS4KLUFDX0RFRlVOKENZR19BQ19MT0FEX1RJWENPTkZJRywgWwotICAgIGlmIHRlc3QgLWYgIiRUSVhDT05GSUciIDsgdGhlbgotICAgICAgLiAkVElYQ09ORklHCi0gICAgZmkKLQotICAgIEFDX1NVQlNUKFRJWF9CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChUSVhfTElCX0ZVTExfUEFUSCkKLV0pCi0KLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUQ0xDT05GSUcsIFsKLSMKLSMgT2ssIGxldHMgZmluZCB0aGUgaXRjbCBjb25maWd1cmF0aW9uCi0jIEZpcnN0LCBsb29rIGZvciBvbmUgdW5pbnN0YWxsZWQuICAKLSMgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2tlZCBieSAtLXdpdGgtaXRjbGNvbmZpZwotIwotCi1pZiB0ZXN0IHgiJHtub19pdGNsfSIgPSB4IDsgdGhlbgotICAjIHdlIHJlc2V0IG5vX2l0Y2wgaW4gY2FzZSBzb21ldGhpbmcgZmFpbHMgaGVyZQotICBub19pdGNsPXRydWUKLSAgQUNfQVJHX1dJVEgoaXRjbGNvbmZpZywgWyAgLS13aXRoLWl0Y2xjb25maWcgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIGl0Y2wgY29uZmlndXJhdGlvbiAoaXRjbENvbmZpZy5zaCldLAotICAgICAgICAgd2l0aF9pdGNsY29uZmlnPSR7d2l0aHZhbH0pCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEl0Y2wgY29uZmlndXJhdGlvbl0pCi0gIEFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0Y2xjb25maWcsWwotCi0gICMgRmlyc3QgY2hlY2sgdG8gc2VlIGlmIC0td2l0aC1pdGNsY29uZmlnIHdhcyBzcGVjaWZpZWQuCi0gIGlmIHRlc3QgeCIke3dpdGhfaXRjbGNvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgaWYgdGVzdCAtZiAiJHt3aXRoX2l0Y2xjb25maWd9L2l0Y2xDb25maWcuc2giIDsgdGhlbgotICAgICAgYWNfY3ZfY19pdGNsY29uZmlnPWAoY2QgJHt3aXRoX2l0Y2xjb25maWd9OyBwd2QpYAotICAgIGVsc2UKLSAgICAgIEFDX01TR19FUlJPUihbJHt3aXRoX2l0Y2xjb25maWd9IGRpcmVjdG9yeSBkb2Vzbid0IGNvbnRhaW4gaXRjbENvbmZpZy5zaF0pCi0gICAgZmkKLSAgZmkKLQotICAjIHRoZW4gY2hlY2sgZm9yIGEgcHJpdmF0ZSBpdGNsIGxpYnJhcnkKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGNsY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluIFwKLQkJLi4vaXRjbC9pdGNsIFwKLQkJYGxzIC1kciAuLi9pdGNsL2l0Y2xbWzNdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vaXRjbC9pdGNsIFwKLQkJYGxzIC1kciAuLi8uLi9pdGNsL2l0Y2xbWzNdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vLi4vaXRjbC9pdGNsIFwKLQkJYGxzIC1kciAuLi8uLi8uLi9pdGNsL2l0Y2xbWzNdXSogMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2xDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgY29tbW9uIGluc3RhbGwgbG9jYXRpb25zCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBgbHMgLWQgJHtwcmVmaXh9L2xpYiAvdXNyL2xvY2FsL2xpYiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRjbENvbmZpZy5zaCIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfaXRjbGNvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgIyBjaGVjayBpbiBhIGZldyBvdGhlciBwcml2YXRlIGxvY2F0aW9ucwotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0Y2xjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gXAotCQkke3NyY2Rpcn0vLi4vaXRjbC9pdGNsIFwKLQkJYGxzIC1kciAke3NyY2Rpcn0vLi4vaXRjbC9pdGNsW1szXV0qIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGNsL2l0Y2xDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX2l0Y2xjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRjbGNvbmZpZ30iID0geCA7IHRoZW4KLSAgICBJVENMQ09ORklHPSIjIG5vIGl0Y2wgY29uZmlncyBmb3VuZCIKLSAgICBBQ19NU0dfV0FSTihDYW4ndCBmaW5kIGl0Y2wgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgZWxzZQotICAgIG5vX2l0Y2w9Ci0gICAgSVRDTENPTkZJRz0ke2FjX2N2X2NfaXRjbGNvbmZpZ30vaXRjbENvbmZpZy5zaAotICAgIEFDX01TR19SRVNVTFQoZm91bmQgJElUQ0xDT05GSUcpCi0gIGZpCi1maQotCi1dKQotCi0jIERlZmluZWQgYXMgYSBzZXBhcmF0ZSBtYWNybyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNhY2hlIHRoZSB2YWx1ZXMKLSMgZnJvbSBQQVRIX0lUQ0xDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgotQUNfREVGVU4oQ1lHX0FDX0xPQURfSVRDTENPTkZJRywgWwotICAgIGlmIHRlc3QgLWYgIiRJVENMQ09ORklHIiA7IHRoZW4KLSAgICAgIC4gJElUQ0xDT05GSUcKLSAgICBmaQotCi0gICAgQUNfU1VCU1QoSVRDTF9CVUlMRF9MSUJfU1BFQykKLSAgICBBQ19TVUJTVChJVENMX1NIKQotICAgIEFDX1NVQlNUKElUQ0xfTElCX0ZJTEUpCi0gICAgQUNfU1VCU1QoSVRDTF9MSUJfRlVMTF9QQVRIKQotCi1dKQotCi0KLUFDX0RFRlVOKENZR19BQ19QQVRIX0lUS0NPTkZJRywgWwotIwotIyBPaywgbGV0cyBmaW5kIHRoZSBpdGsgY29uZmlndXJhdGlvbgotIyBGaXJzdCwgbG9vayBmb3Igb25lIHVuaW5zdGFsbGVkLiAgCi0jIHRoZSBhbHRlcm5hdGl2ZSBzZWFyY2ggZGlyZWN0b3J5IGlzIGludm9rZWQgYnkgLS13aXRoLWl0a2NvbmZpZwotIwotCi1pZiB0ZXN0IHgiJHtub19pdGt9IiA9IHggOyB0aGVuCi0gICMgd2UgcmVzZXQgbm9faXRrIGluIGNhc2Ugc29tZXRoaW5nIGZhaWxzIGhlcmUKLSAgbm9faXRrPXRydWUKLSAgQUNfQVJHX1dJVEgoaXRrY29uZmlnLCBbICAtLXdpdGgtaXRrY29uZmlnICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyBpdGsgY29uZmlndXJhdGlvbiAoaXRrQ29uZmlnLnNoKV0sCi0gICAgICAgICB3aXRoX2l0a2NvbmZpZz0ke3dpdGh2YWx9KQotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBJdGsgY29uZmlndXJhdGlvbl0pCi0gIEFDX0NBQ0hFX1ZBTChhY19jdl9jX2l0a2NvbmZpZyxbCi0KLSAgIyBGaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWl0a2NvbmZpZyB3YXMgc3BlY2lmaWVkLgotICBpZiB0ZXN0IHgiJHt3aXRoX2l0a2NvbmZpZ30iICE9IHggOyB0aGVuCi0gICAgaWYgdGVzdCAtZiAiJHt3aXRoX2l0a2NvbmZpZ30vaXRrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgIGFjX2N2X2NfaXRrY29uZmlnPWAoY2QgJHt3aXRoX2l0a2NvbmZpZ307IHB3ZClgCi0gICAgZWxzZQotICAgICAgQUNfTVNHX0VSUk9SKFske3dpdGhfaXRrY29uZmlnfSBkaXJlY3RvcnkgZG9lc24ndCBjb250YWluIGl0a0NvbmZpZy5zaF0pCi0gICAgZmkKLSAgZmkKLQotICAjIHRoZW4gY2hlY2sgZm9yIGEgcHJpdmF0ZSBpdGsgbGlicmFyeQotICBpZiB0ZXN0IHgiJHthY19jdl9jX2l0a2NvbmZpZ30iID0geCA7IHRoZW4KLSAgICBmb3IgaSBpbiBcCi0JCS4uL2l0Y2wvaXRrIFwKLQkJYGxzIC1kciAuLi9pdGNsL2l0a1tbM11dKiAyPi9kZXYvbnVsbGAgXAotCQkuLi8uLi9pdGNsL2l0ayBcCi0JCWBscyAtZHIgLi4vLi4vaXRjbC9pdGtbWzNdXSogMj4vZGV2L251bGxgIFwKLQkJLi4vLi4vLi4vaXRjbC9pdGsgXAotCQlgbHMgLWRyIC4uLy4uLy4uL2l0Y2wvaXRrW1szXV0qIDI+L2Rldi9udWxsYCA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkaS9pdGtDb25maWcuc2giIDsgdGhlbgotICAgICAgICBhY19jdl9jX2l0a2NvbmZpZz1gKGNkICRpOyBwd2QpYAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgZmkKLSAgIyBjaGVjayBpbiBhIGZldyBjb21tb24gaW5zdGFsbCBsb2NhdGlvbnMKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gYGxzIC1kICR7cHJlZml4fS9saWIgL3Vzci9sb2NhbC9saWIgMj4vZGV2L251bGxgIDsgZG8KLSAgICAgIGlmIHRlc3QgLWYgIiRpL2l0Y2wvaXRrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gICMgY2hlY2sgaW4gYSBmZXcgb3RoZXIgcHJpdmF0ZSBsb2NhdGlvbnMKLSAgaWYgdGVzdCB4IiR7YWNfY3ZfY19pdGtjb25maWd9IiA9IHggOyB0aGVuCi0gICAgZm9yIGkgaW4gXAotCQkke3NyY2Rpcn0vLi4vaXRjbC9pdGsgXAotCQlgbHMgLWRyICR7c3JjZGlyfS8uLi9pdGNsL2l0a1tbM11dKiAyPi9kZXYvbnVsbGAgOyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvaXRrQ29uZmlnLnNoIiA7IHRoZW4KLSAgICAgICAgYWNfY3ZfY19pdGtjb25maWc9YChjZCAkaTsgcHdkKWAKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gIGZpCi0gIF0pCi0gIGlmIHRlc3QgeCIke2FjX2N2X2NfaXRrY29uZmlnfSIgPSB4IDsgdGhlbgotICAgIElUQ0xDT05GSUc9IiMgbm8gaXRrIGNvbmZpZ3MgZm91bmQiCi0gICAgQUNfTVNHX1dBUk4oQ2FuJ3QgZmluZCBpdGsgY29uZmlndXJhdGlvbiBkZWZpbml0aW9ucykKLSAgZWxzZQotICAgIG5vX2l0az0KLSAgICBJVEtDT05GSUc9JHthY19jdl9jX2l0a2NvbmZpZ30vaXRrQ29uZmlnLnNoCi0gICAgQUNfTVNHX1JFU1VMVChmb3VuZCAkSVRLQ09ORklHKQotICBmaQotZmkKLQotXSkKLQotIyBEZWZpbmVkIGFzIGEgc2VwYXJhdGUgbWFjcm8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjYWNoZSB0aGUgdmFsdWVzCi0jIGZyb20gUEFUSF9JVEtDT05GSUcgKGJlY2F1c2UgdGhpcyBjYW4gYWxzbyBiZSBjYWNoZWQpLgotQUNfREVGVU4oQ1lHX0FDX0xPQURfSVRLQ09ORklHLCBbCi0gICAgaWYgdGVzdCAtZiAiJElUS0NPTkZJRyIgOyB0aGVuCi0gICAgICAuICRJVEtDT05GSUcKLSAgICBmaQotCi0gICAgQUNfU1VCU1QoSVRLX0JVSUxEX0xJQl9TUEVDKQotICAgIEFDX1NVQlNUKElUS19MSUJfRklMRSkKLSAgICBBQ19TVUJTVChJVEtfTElCX0ZVTExfUEFUSCkKLV0pCi0KLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgT2ssIGxldHMgZmluZCB0aGUgbGliZ3VpIHNvdXJjZSB0cmVlcyBzbyB3ZSBjYW4gdXNlIHRoZSBoZWFkZXJzCi1kbmwgdGhlIGFsdGVybmF0aXZlIHNlYXJjaCBkaXJlY3RvcnkgaXMgaW52b2xrZWQgYnkgLS13aXRoLWxpYmd1aWluY2x1ZGUKLUFDX0RFRlVOKENZR19BQ19QQVRIX0xJQkdVSSwgWwotICAgIENZR19BQ19QQVRIX0xJQkdVSUgKLSAgICBDWUdfQUNfUEFUSF9MSUJHVUlMSUIKLV0pCi1BQ19ERUZVTihDWUdfQUNfUEFUSF9MSUJHVUlILCBbCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4iCi1ub19saWJndWk9dHJ1ZQotQUNfTVNHX0NIRUNLSU5HKGZvciBMaWJndWkgaGVhZGVycyBpbiB0aGUgc291cmNlIHRyZWUpCi1BQ19BUkdfV0lUSChsaWJndWlpbmNsdWRlLCBbICAtLXdpdGgtbGliZ3VpaW5jbHVkZSAgICAgICBkaXJlY3Rvcnkgd2hlcmUgbGliZ3VpIGhlYWRlcnMgYXJlXSwgd2l0aF9saWJndWlpbmNsdWRlPSR7d2l0aHZhbH0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfY19saWJndWloLFsKLWRubCBmaXJzdCBjaGVjayB0byBzZWUgaWYgLS13aXRoLWxpYmd1aWluY2x1ZGUgd2FzIHNwZWNpZmllZAotaWYgdGVzdCB4IiR7d2l0aF9saWJndWlpbmNsdWRlfSIgIT0geCA7IHRoZW4KLSAgaWYgdGVzdCAtZiAke3dpdGhfbGliZ3VpaW5jbHVkZX0vZ3VpdGNsLmggOyB0aGVuCi0gICAgYWNfY3ZfY19saWJndWloPWAoY2QgJHt3aXRoX2xpYmd1aWluY2x1ZGV9OyBwd2QpYAotICBlbGlmIHRlc3QgLWYgJHt3aXRoX2xpYmd1aWluY2x1ZGV9L3NyYy9ndWl0Y2wuaCA7IHRoZW4KLSAgICBhY19jdl9jX2xpYmd1aWg9YChjZCAke3dpdGhfbGliZ3VpaW5jbHVkZX0vc3JjOyBwd2QpYAotICBlbHNlCi0gICAgQUNfTVNHX0VSUk9SKFske3dpdGhfbGliZ3VpaW5jbHVkZX0gZGlyZWN0b3J5IGRvZXNuJ3QgY29udGFpbiBoZWFkZXJzXSkKLSAgZmkKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGlmIGl0IGNhbWUgd2l0aCBMaWJndWkgY29uZmlndXJhdGlvbiBmaWxlCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWNvbmZpZ30iICE9IHggOyB0aGVuCi0gIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgIGlmIHRlc3QgLWYgJGFjX2N2X2NfbGliZ3VpY29uZmlnLyRpL3NyYy9ndWl0Y2wuaCA7IHRoZW4KLSAgICAgIGFjX2N2X2NfbGliZ3VpaD1gKGNkICRhY19jdl9jX2xpYmd1aWNvbmZpZy8kaS9zcmM7IHB3ZClgCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLWZpCi0KLWRubCBuZXh0IGNoZWNrIGluIHByaXZhdGUgc291cmNlIGRpcmVjdG9yeQotZG5sIHNpbmNlIGxzIHJldHVybnMgbG93ZXN0IHZlcnNpb24gbnVtYmVycyBmaXJzdCwgcmV2ZXJzZSBpdHMgb3V0cHV0Ci1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWh9IiA9IHggOyB0aGVuCi0gICAgZG5sIGZpbmQgdGhlIHRvcCBsZXZlbCBMaWJndWkgc291cmNlIGRpcmVjdG9yeQotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgICBpZiB0ZXN0IC1uICJgbHMgLWRyICRzcmNkaXIvJGkvbGliZ3VpKiAyPi9kZXYvbnVsbGAiIDsgdGhlbgotCSAgICBsaWJndWlwYXRoPSRzcmNkaXIvJGkKLQkgICAgYnJlYWsKLQlmaQotICAgIGRvbmUKLQotICAgIGRubCBmaW5kIHRoZSBleGFjdCBMaWJndWkgc291cmNlIGRpci4gV2UgZG8gaXQgdGhpcyB3YXksIGNhdXNlIHRoZXJlCi0gICAgZG5sIG1pZ2h0IGJlIG11bHRpcGxlIHZlcnNpb24gb2YgTGliZ3VpLCBhbmQgd2Ugd2FudCB0aGUgbW9zdCByZWNlbnQgb25lLgotICAgIGZvciBpIGluIGBscyAtZHIgJGxpYmd1aXBhdGgvbGliZ3VpKiAyPi9kZXYvbnVsbCBgIDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkaS9zcmMvZ3VpdGNsLmggOyB0aGVuCi0gICAgICAgICAgYWNfY3ZfY19saWJndWloPWAoY2QgJGkvc3JjOyBwd2QpYAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgZG9uZQotZmkKLQotZG5sIHNlZSBpZiBvbmUgaXMgaW5zdGFsbGVkCi1pZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWh9IiA9IHggOyB0aGVuCi0gICBBQ19NU0dfUkVTVUxUKG5vbmUpCi0gICBBQ19DSEVDS19IRUFERVIoZ3VpdGNsLmgsIGFjX2N2X2NfbGliZ3VpaD1pbnN0YWxsZWQsIGFjX2N2X2NfbGliZ3VpaD0iIikKLWZpCi1dKQotTElCR1VJSERJUj0iIgotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgPSB4IDsgdGhlbgotICAgIEFDX01TR19XQVJOKFtDYW4ndCBmaW5kIGFueSBMaWJndWkgaGVhZGVyc10pCi1maQotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlofSIgIT0geCA7IHRoZW4KLSAgICBub19saWJndWk9IiIKLSAgICBpZiB0ZXN0IHgiJHthY19jdl9jX2xpYmd1aWh9IiAhPSB4Imluc3RhbGxlZCIgOyB0aGVuCi0gICAgICAgIExJQkdVSUhESVI9Ii1JJHthY19jdl9jX2xpYmd1aWh9IgotICAgIGZpCi1maQotQUNfTVNHX1JFU1VMVCgke2FjX2N2X2NfbGliZ3VpaH0pCi1BQ19TVUJTVChMSUJHVUlIRElSKQotXSkKLQotZG5sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1kbmwgZmluZCB0aGUgR1VJIGxpYnJhcnkKLUFDX0RFRlVOKENZR19BQ19QQVRIX0xJQkdVSUxJQiwgWwotQUNfTVNHX0NIRUNLSU5HKGZvciBHVUkgbGlicmFyeSAgaW4gdGhlIGJ1aWxkIHRyZWUpCi1kaXJsaXN0PSIuLiAuLi8uLi8gLi4vLi4vLi4vIC4uLy4uLy4uLy4uLyAuLi8uLi8uLi8uLi8uLi8gLi4vLi4vLi4vLi4vLi4vLi4vIC4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIC4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uIgotZG5sIGxvb2sgZm9yIHRoZSBsaWJyYXJ5Ci1BQ19NU0dfQ0hFQ0tJTkcoZm9yIEdVSSBsaWJyYXJ5KQotQUNfQ0FDSEVfVkFMKGFjX2N2X2NfbGliZ3VpbGliLFsKLWlmIHRlc3QgeCIke2FjX2N2X2NfbGliZ3VpbGlifSIgPSB4IDsgdGhlbgotICAgIGZvciBpIGluICRkaXJsaXN0OyBkbwotICAgICAgaWYgdGVzdCAtZiAiJGkvbGliZ3VpL3NyYy9NYWtlZmlsZSIgOyB0aGVuCi0gICAgICAgIGFjX2N2X2NfbGliZ3VpbGliPWAoY2QgJGkvbGliZ3VpL3NyYzsgcHdkKWAKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotZmkKLV0pIAotaWYgdGVzdCB4IiR7YWNfY3ZfY19saWJndWlsaWJ9IiAhPSB4IDsgdGhlbgotICAgICBHVUlMSUI9IiR7R1VJTElCfSAtTCR7YWNfY3ZfY19saWJndWlsaWJ9IgotICAgICBMSUJHVUlMSUI9Ii1sZ3VpIgotICAgICBBQ19NU0dfUkVTVUxUKCR7YWNfY3ZfY19saWJndWlsaWJ9KQotZWxzZQotICAgICBBQ19NU0dfUkVTVUxUKG5vbmUpCi1maQotCi1BQ19TVUJTVChHVUlMSUIpCi1BQ19TVUJTVChMSUJHVUlMSUIpCi1dKQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWE2OGJzZCBiL2NvbmZpZy9taC1hNjhic2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTEyODkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWE2OGJzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLVJBTkxJQj10cnVlCi0KLSNOb25lIG9mIHRoZSBBcG9sbG8gY29tcGlsZXJzIGNhbiBjb21waWxlIGdhcyBvciBiaW51dGlscy4gIFRoZSBwcmVwcm9jZXNzb3IKLSMgY2hva2VzIG9uIGJmZCwgdGhlIGNvbXBpbGVyIHdvbid0IGxldCB5b3UgYXNzaWduIGludGVnZXJzIHRvIGVudW1zLCBhbmQKLSMgb3RoZXIgcHJvYmxlbXMuICBEZWZpbmluZyBDQyB0byBnY2MgaXMgYSBxdWVzdGlvbmFibGUgd2F5IHRvIHNheSAiZG9uJ3QgdXNlCi0jIHRoZSBhcG9sbG8gY29tcGlsZXIiICh0aGUgcHJlZmVycmVkIHZlcnNpb24gb2YgR0NDIGNvdWxkIGJlIGNhbGxlZCBjYywKLSMgb3Igd2hhdGV2ZXIpLCBidXQgSSdtIG5vdCBzdXJlIGxlYXZpbmcgQ0MgYXMgY2MgaXMgYW55IGJldHRlci4uLgotCi0jQ0M9Y2MgLUEgYW5zaSAtQSBydW50eXBlLGFueSAtQSBzeXN0eXBlLGFueSAtVV9fU1REQ19fIC1ETk9fU1REQVJHCi1DQz1nY2MKLQotQklTT049eWFjYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWFpeDM4NiBiL2NvbmZpZy9taC1haXgzODYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhY2NkMWMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWFpeDM4NgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVJBTkxJQiA9IEA6CmRpZmYgLS1naXQgYS9jb25maWcvbWgtYWl4NDMgYi9jb25maWcvbWgtYWl4NDMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjc1MGMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWFpeDQzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jIEFJWCA0LjMgYW5kIGFib3ZlIHJlcXVpcmVzIC1YMzJfNjQgZmxhZyB0byBhbGwgYXIgYW5kIG5tIGNvbW1hbmRzCi0jIHRvIGhhbmRsZSBib3RoIDMyLWJpdCBhbmQgNjQtYml0IG9iamVjdHMuCi1BUl9GT1JfVEFSR0VUPWFyIC1YMzJfNjQKLU5NX0ZPUl9UQVJHRVQ9bm0gLVgzMl82NApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWFwb2xsbzY4IGIvY29uZmlnL21oLWFwb2xsbzY4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDk3ZWQ5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hcG9sbG82OAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotSERFRklORVMgPSAtRFVTRwotUkFOTElCPXRydWUKLUNDPSBjYyAtQSBhbnNpIC1BIHJ1bnR5cGUsYW55IC1BIHN5c3R5cGUsYW55IC1VX19TVERDX18gLURVU0cKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1hcm1waWMgYi9jb25maWcvbWgtYXJtcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNmMmM4Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1hcm1waWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtY3h1eCBiL2NvbmZpZy9taC1jeHV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGIyYTE2Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1jeHV4CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZvciBIYXJyaXMgQ1gvVVggNyAoYW5kIG1heWJlIDYpLCBiYXNlZCBvbiBzeXN2NCBjb25maWd1cmF0aW9uLgotCi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0Ci1SQU5MSUIgPSB0cnVlCi0KLSMgQysrIGRlYnVnZ2luZyBpcyBub3QgeWV0IHN1cHBvcnRlZCB1bmRlciBTVlI0IChEV0FSRikKLUNYWEZMQUdTPS1PCi0KLSMgVGhlIGwgZmxhZyBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gdGhlIFNWUjQgYXJjaGl2ZXIsIHJlbW92ZSBpdC4KLUFSX0ZMQUdTID0gY3EKLQotIyBVbmRlciBDWC9VWCwgd2Ugd2FudCB0byB0ZWxsIHRoZSBjb21waWxlciB0byB1c2UgQU5TSSBtb2RlLgotQ0M9Y2MgLVhhCmRpZmYgLS1naXQgYS9jb25maWcvbWgtY3lnd2luIGIvY29uZmlnL21oLWN5Z3dpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxMDI3Zi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtY3lnd2luCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1FWFRSQV9UQVJHRVRfSE9TVF9BTExfTU9EVUxFUz1hbGwtbGlidGVybWNhcAotRVhUUkFfVEFSR0VUX0hPU1RfSU5TVEFMTF9NT0RVTEVTPWluc3RhbGwtbGlidGVybWNhcAotCi1hbGwtZ2RiOiBhbGwtbGlidGVybWNhcAotCi1pbnN0YWxsLWdkYjogYWxsLWxpYnRlcm1jYXAKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1kZWNzdGF0aW9uIGIvY29uZmlnL21oLWRlY3N0YXRpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MjAxOTIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWRlY3N0YXRpb24KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUNDID0gY2MgLVdmLC1YTmcxMDAwCi0KLSMgZm9yIFgxMSwgc2luY2UgdGhlIG5hdGl2ZSBERUN3aW5kb3dzIGluY2x1ZGUgZmlsZXMgYXJlIHJlYWxseSBicm9rZW4gd2hlbgotIyBpdCBjb21lcyB0byBmdW5jdGlvbiBwcm90b3R5cGVzLiAgCi1YMTFfRVhUUkFfQ0ZMQUdTID0gIi1ETmVlZEZ1bmN0aW9uUHJvdG90eXBlcz0wIgpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRlbHRhODggYi9jb25maWcvbWgtZGVsdGE4OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5YzQ1My4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGVsdGE4OAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotUkFOTElCID0gdHJ1ZQotCi0KLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRndXggYi9jb25maWcvbWgtZGd1eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkODVkNi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtZGd1eAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotSERFRklORVM9LURIT1NUX1NZUz1ER1VYX1NZUwotQ0M9Z2NjIC1XYWxsIC1hbnNpIC1EX191c2luZ19ER1VYCi1SQU5MSUI9dHJ1ZQotCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZGd1eDM4NiBiL2NvbmZpZy9taC1kZ3V4Mzg2CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTg4NWMzLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kZ3V4Mzg2CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyBmcm9tIG1oLWRndXgKLUhERUZJTkVTPS1ESE9TVF9TWVM9REdVWF9TWVMKLUNDPWdjYyAtV2FsbCAtYW5zaSAtRF9fdXNpbmdfREdVWAotUkFOTElCID0gdHJ1ZQotCi0jIGZyb20gbWgtc3lzdjQKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBDKysgZGVidWdnaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHVuZGVyIFNWUjQgKERXQVJGKQotQ1hYRkxBR1M9LU8KLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcgotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsCi0KLSMgZnJvbSBhbmdlbGEKLSMgbm8gZGVidWdnaW5nIGR1ZSB0byBicm9rZW4gY29tcGlsZXIsIHVzZSBCU0Qgc3R5bGUgdGltZW9mZGF5Ci1DRkxBR1M9LU8gLURfQlNEX1RJTUVPRkRBWV9GTEFWT1IKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWRqZ3BwIGIvY29uZmlnL21oLWRqZ3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTIwMDdiLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1kamdwcAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotIyBXZSBkb24ndCB3YW50IHRvIHVzZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb24gRE9TLiAgVW5mb3J0dW5hdGVseSwKLSMgdGhpcyByZXF1aXJlcyB0aGF0IHdlIHNldCBDRkxBR1MuCi0jIFRoaXMgdXNlZCB0byBzZXQgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIuCi1DRkxBR1M9LU8yCmRpZmYgLS1naXQgYS9jb25maWcvbWgtZWxmYWxwaGFwaWMgYi9jb25maWcvbWgtZWxmYWxwaGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Y2YyYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWVsZmFscGhhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWhwMzAwIGIvY29uZmlnL21oLWhwMzAwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjE3MjRkLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1ocDMwMAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTVgotIyBBdm9pZCAidG9vIG11Y2ggZGVmaW5pbmciIGVycm9ycyBmcm9tIEhQVVggY29tcGlsZXIuCi1DQyA9IGNjIC1XcCwtSDI1NjAwMAotIyBJZiAiYXIiIGluICRQQVRIIGlzIEdOVSBhciwgdGhlIHN5bWJvbCB0YWJsZSBtYXkgbmVlZCByZWJ1aWxkaW5nLgotIyBJZiBpdCdzIEhQL1VYIGFyLCB0aGlzIHNob3VsZCBiZSBoYXJtbGVzcy4KLVJBTkxJQiA9IGFyIHRzCi0KLSMgTmF0aXZlIGNjIGNhbid0IGJvb3RzdHJhcCBnY2Mgd2l0aCAtZy4gIERlZmluaW5nIENGTEFHUyBoZXJlIGxvc2VzIChhKQotIyBmb3Igbm9uLWdjYyBkaXJlY3RvcmllcywgKGIpIGlmIHdlIGFyZSBjb21waWxpbmcgd2l0aCBnY2MsIG5vdAotIyBuYXRpdmUgY2MuICBOZWl0aGVyIChhKSBub3IgKGIpIGhhcyBhIHRyaXZpYWwgZml4IHRob3VnaC4KLQotQ0ZMQUdTID0KZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocHV4IGIvY29uZmlnL21oLWhwdXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzFjOWQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWhwdXgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotQ0MgPSBjYyAtV3AsLUgyNTYwMDAKLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1ocHV4OCBiL2NvbmZpZy9taC1ocHV4OApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MWM5ZC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtaHB1eDgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotQ0MgPSBjYyAtV3AsLUgyNTYwMDAKLVNZU1YgPSAtRFNZU1YKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1pbnRlcml4IGIvY29uZmlnL21oLWludGVyaXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjhlY2YuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWludGVyaXgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIFRoZSBzaGVsbCBtYXkgbm90IGJlIGluIC9iaW4uIAotU0hFTEwgPSBzaAotUkFOTElCID0gdHJ1ZQotCi0jIFdlIGRvbid0IHdhbnQgZGVidWdnaW5nIGluZm8gaW4gSW50ZXJpeC1ob3N0ZWQgdG9vbGNoYWlucy4KLSMgQWNjb21wbGlzaCB0aGlzIGJ5IG92ZXJyaWRpbmcgQ0ZMQUdTLiBUaGlzIGlzIGFsc28gYSB3b3JrYXJvdW5kCi0jIGZvciBMRCBjcmFzaCB3aGVuIGJ1aWxkaW5nIHNoYXJlZCBsaWJzdGRjKysuCi1DRkxBR1M9LU8yCi1DWFhGTEFHUz0tTzIKLQotIyBXZSBhbHNvIG5lZWQgdG8gb3ZlcnJpZGUgTElCR0NDMl9ERUJVR19DRkxBR1Mgc28gbGliZ2NjMiB3aWxsIGJlCi0jIGJ1aWx0IHdpdGhvdXQgZGVidWdnaW5nIGluZm9ybWF0aW9uCi0KLUxJQkdDQzJfREVCVUdfQ0ZMQUdTPQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLWlyaXg0IGIvY29uZmlnL21oLWlyaXg0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODcyMTQ1Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1pcml4NAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBNYWtlZmlsZSBjaGFuZ2VzIGZvciBTR0kncyBydW5uaW5nIElSSVgtNC54LgotIyBUZWxsIGNvbXBpbGVyIHRvIHVzZSBLJlIgQy4gIFdlIGNhbid0IGNvbXBpbGUgdW5kZXIgdGhlIFNHSSBBbnNpCi0jIGVudmlyb25tZW50LiAgQWxzbyBidW1wIHN3aXRjaCB0YWJsZSBzaXplIHNvIHRoYXQgY3AtcGFyc2Ugd2lsbAotIyBjb21waWxlLiAgQnVtcCBzdHJpbmcgbGVuZ3RoIGxpbWl0IHNvIGxpbmtlciBidWlsZHMuCi0KLUNDID0gY2MgLWNja3IgLVdmLC1YTmcxNTAwIC1XZiwtWE5rMTAwMCAtV2YsLVhOaDIwMDAgLVdmLC1YTmw4MTkyCi1TWVNWID0gLURTWVNWCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaXJpeDUgYi9jb25maWcvbWgtaXJpeDUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZDdjOTkuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWlyaXg1CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIE1ha2VmaWxlIGNoYW5nZXMgZm9yIFNHSSdzIHJ1bm5pbmcgSVJJWC01LnguCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtaXJpeDYgYi9jb25maWcvbWgtaXJpeDYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMjVjMTYuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLWlyaXg2CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jIE1ha2VmaWxlIGNoYW5nZXMgZm9yIFNHSSdzIHJ1bm5pbmcgSVJJWC02LnguCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCi0jIFNwZWNpZnkgdGhlIEFCSSwgdG8gZW5zdXJlIHRoYXQgYWxsIElyaXggNiBzeXN0ZW1zIHdpbGwgYmVoYXZlIHRoZSBzYW1lLgotIyBBbHNvLCB1c2luZyAtMzIgYXZvaWRzIGJ1Z3MgdGhhdCBleGlzdCBpbiB0aGUgbjMyL242NCBzdXBwb3J0IGluIHNvbWUKLSMgdmVyc2lvbnMgb2YgdGhlIFNHSSBjb21waWxlci4KLUNDID0gY2MgLTMyCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbHlueG9zIGIvY29uZmlnL21oLWx5bnhvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmY2I3OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbHlueG9zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIC9iaW4vY2MgaXMgbGVzcyB0aGFuIHVzZWZ1bCBmb3Igb3VyIHB1cnBvc2VzLiAgQWx3YXlzIHVzZSBHQ0MKLUNDID0gL2Jpbi9nY2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1seW54cnM2ayBiL2NvbmZpZy9taC1seW54cnM2awpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3OTM5OS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbHlueHJzNmsKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgTHlueE9TIHJ1bm5pbmcgb24gdGhlIHJzNjAwMCBkb2Vzbid0IGhhdmUgcmFubGliCi1SQU5MSUIgPSB0cnVlCi0KLSMgL2Jpbi9jYyBpcyBsZXNzIHRoYW4gdXNlZnVsIGZvciBvdXIgcHVycG9zZXMuICBBbHdheXMgdXNlIEdDQwotQ0MgPSAvdXNyL2N5Z251cy9wcm9ncmVzc2l2ZS9iaW4vZ2NjCi0KLSMgL2Jpbi9zaCBpcyB0b28gYnVnZ3ksIHNvIHVzZSAvYmluL2Jhc2ggaW5zdGVhZC4KLVNIRUxMID0gL2Jpbi9iYXNoCmRpZmYgLS1naXQgYS9jb25maWcvbWgtbTY4a3BpYyBiL2NvbmZpZy9taC1tNjhrcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmU0OGQ5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1tNjhrcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZnBpYwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW1pbmd3MzIgYi9jb25maWcvbWgtbWluZ3czMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM0ODM5ZC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbWluZ3czMgorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgV2UgZG9uJ3Qgd2FudCBkZWJ1Z2dpbmcgaW5mbyBpbiBXaW4zMi1ob3N0ZWQgdG9vbGNoYWlucy4KLSMgQWNjb21wbGlzaCB0aGlzIGJ5IG92ZXJyaWRpbmcgQ0ZMQUdTLgotQ0ZMQUdTPS1PMgotQ1hYRkxBR1M9LU8yCi0KLSMgV2UgYWxzbyBuZWVkIHRvIG92ZXJyaWRlIExJQkdDQzJfREVCVUdfQ0ZMQUdTIHNvIGxpYmdjYzIgd2lsbCBiZQotIyBidWlsdCB3aXRob3V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCi1MSUJHQ0MyX0RFQlVHX0NGTEFHUz0KLQotIyBjdXN0b20gaW5zdGFsbGF0aW9uIHJ1bGVzIGZvciBtaW5ndzMyIChhcHBlbmQgLmV4ZSB0byBiaW5hcmllcywgZXRjLikKLSMgSU5TVEFMTF9ET1NSRUw9aW5zdGFsbC1kb3NyZWwKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1uY3IzMDAwIGIvY29uZmlnL21oLW5jcjMwMDAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYmQ4MDMuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLW5jcjMwMDAKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIEhvc3QgY29uZmlndXJhdGlvbiBmaWxlIGZvciBhbiBOQ1IgMzAwMCAoaTQ4Ni9TVlI0KSBzeXN0ZW0uCi0KLSMgVGhlIE5DUiAzMDAwIHNoaXBzIHdpdGggYSBNZXRhV2FyZSBjb21waWxlciBpbnN0YWxsZWQgYXMgL2Jpbi9jYy4KLSMgVGhpcyBjb21waWxlciBub3Qgb25seSBlbWl0cyBvYm5veGlvdXMgY29weXJpZ2h0IG1lc3NhZ2VzIGV2ZXJ5IHRpbWUKLSMgeW91IHJ1biBpdCwgYnV0IGl0IGNob2tlcyBhbmQgZGllcyBvbiBhIHdob2xlIGJ1bmNoIG9mIEdOVSBzb3VyY2UKLSMgZmlsZXMuICBEZWZhdWx0IHRvIHVzaW5nIHRoZSBBVCZUIGNvbXBpbGVyIGluc3RhbGxlZCBpbiAvdXNyL2Njcy9BVFQvY2MuCi0jIFVuZm9ydHVuYXRlbHkgdGhvdWdoLCB0aGUgQVQmVCBjb21waWxlciBzb21ldGltZXMgZ2VuZXJhdGVzIGNvZGUgdGhhdAotIyB0aGUgYXNzZW1ibGVyIGJhcmZzIG9uIGlmIC1nIGlzIHVzZWQsIHNvIGRpc2FibGUgaXQgYnkgZGVmYXVsdCBhcyB3ZWxsLgotQ0MgPSAvdXNyL2Njcy9BVFQvY2MKLUNGTEFHUyA9Ci0KLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLW5jcnN2cjQzIGIvY29uZmlnL21oLW5jcnN2cjQzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2IwOTkxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1uY3JzdnI0MworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyBIb3N0IGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgYW4gTkNSIDMwMDAgKGk0ODYvU1ZSNDMpIHN5c3RlbS4KLQotIyBUaGUgTWV0YVdhcmUgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhIGNvcHlyaWdodCBtZXNzYWdlIHVubGVzcyB5b3UKLSMgdHVybiBpdCBvZmYgYnkgYWRkaW5nIHRoZSAtSG5vY29weXIgZmxhZy4KLUNDID0gY2MgLUhub2NvcHlyCi0KLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1uZWN2NCBiL2NvbmZpZy9taC1uZWN2NApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg4NzczNi4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtbmVjdjQKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIEhvc3QgTWFrZWZpbGUgZnJhZ21lbnQgZm9yIE5FQyBNSVBTIFNWUjQuCi0KLSMgVGhlIEMgY29tcGlsZXIgb24gTkVDIE1JUFMgU1ZSNCBuZWVkcyBiaWdnZXIgdGFibGVzLgotQ0MgPSBjYyAtWlhOZD01MDAwIC1aWE5nPTEwMDAKLQotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWIC1EU1ZSNAotUkFOTElCID0gdHJ1ZQotCi0jIE5FQyAtbFgxMSBuZWVkcyBzb21lIG90aGVyIGxpYnJhcmllcy4KLVgxMV9FWFRSQV9MSUJTID0gLWxzb2NrZXQgLWxuc2wKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1wYXBpYyBiL2NvbmZpZy9taC1wYXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjZjJjOC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtcGFwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbWgtcHBjcGljIGIvY29uZmlnL21oLXBwY3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjZjJjOC4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtcHBjcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz0tZlBJQwpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXJpc2NvcyBiL2NvbmZpZy9taC1yaXNjb3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODZiMzAuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXJpc2NvcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMgVGhpcyBpcyBmb3IgYSBNSVBTIHJ1bm5pbmcgUklTQy9vcyA0LjUyQy4KLQotIyBUaGlzIGlzIG5lZWRlZCBmb3IgR0RCLCBidXQgbmVlZHMgdG8gYmUgaW4gdGhlIHRvcC1sZXZlbCBtYWtlIGJlY2F1c2UKLSMgaWYgYSBsaWJyYXJ5IGlzIGNvbXBpbGVkIHdpdGggdGhlIGJzZCBoZWFkZXJzIGFuZCBnZXRzIGxpbmtlZCB3aXRoIHRoZQotIyBzeXN2IHN5c3RlbSBsaWJyYXJpZXMgYWxsIGhlbGwgY2FuIGJyZWFrIGxvb3NlIChlLmcuIGEgam1wX2J1ZiBtaWdodCBiZQotIyBhIGRpZmZlcmVudCBzaXplKS4KLSMgcHRyYWNlKDIpIGFwcGFyZW50bHkgaGFzIHByb2JsZW1zIGluIHRoZSBCU0QgZW52aXJvbm1lbnQuICBObyB3b3JrYXJvdW5kIGlzCi0jIGtub3duIGV4Y2VwdCB0byBzZWxlY3QgdGhlIHN5c3YgZW52aXJvbm1lbnQuICBDb3VsZCB3ZSB1c2UgL3Byb2MgaW5zdGVhZD8KLSMgVGhlc2UgInN5c3YgZW52aXJvbm1lbnRzIiBhbmQgImJzZCBlbnZpcm9ubWVudHMiIG9mdGVuIGVuZCB1cCBiZWluZyBhIHBhaW4uCi0jCi0jIFRoaXMgaXMgbm90IHBhcnQgb2YgQ0ZMQUdTIGJlY2F1c2UgcGVyaGFwcyBub3QgYWxsIEMgY29tcGlsZXJzIGhhdmUgdGhpcwotIyBvcHRpb24uCi1DQz0gY2MgLXN5c3R5cGUgc3lzdgotCi1SQU5MSUIgPSB0cnVlCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc2NvIGIvY29uZmlnL21oLXNjbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MzMzdjOS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc2NvCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyBEZWZpbmUgU1lTViBhcyAtRFNZU1YgaWYgeW91IGFyZSB1c2luZyBhIFN5c3RlbSBWIG9wZXJhdGluZyBzeXN0ZW0uCi1TWVNWID0gLURTWVNWCi1SQU5MSUIgPSB0cnVlCi0jIFlvdSBtYXkgbmVlZCB0aGlzIGlmIHlvdSBkb24ndCBoYXZlIGJpc29uLgotIyBCSVNPTiA9IHlhY2MgLVNtMTA0MDAKLSMgVGhlIG5hdGl2ZSBDIGNvbXBpbGVyIGJvdGNoZXMgc29tZSBzaW1wbGUgdXNlcyBvZiBjb25zdC4gIFVuZm9ydHVuYXRlbHksCi0jIGl0IGRvZXNuJ3QgZGVmaW5lZCBhbnl0aGluZyBsaWtlICJfX3Njb19fIiBmb3IgdXMgdG8gdGVzdCBmb3IgaW4gYW5zaWRlY2wuaC4KLUNDID0gY2MgLURjb25zdD0KLQotWDExX0VYVFJBX0xJQlMgPSAtbHNvY2tldCAtbG0gLWxpbnRsIC1sbWFsbG9jCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc29sYXJpcyBiL2NvbmZpZy9taC1zb2xhcmlzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJlYTU0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zb2xhcmlzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIE1ha2VmaWxlIGNoYW5nZXMgZm9yIFN1bnMgcnVubmluZyBTb2xhcmlzIDIKLQotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsIC1sc29ja2V0CmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3BhcmNwaWMgYi9jb25maWcvbWgtc3BhcmNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGJjMjIuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXNwYXJjcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBRz1gY2FzZSAiJHtMSUJDRkxBR1N9ICR7TElCQ1hYRkxBR1N9IiBpbiAqLWZwaWMqICkgZWNobyAtZnBpYyA7OyAqICkgZWNobyAtZlBJQyA7OyBlc2FjYApkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXN1bjMgYi9jb25maWcvbWgtc3VuMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkNTE1NS4uMDAwMDAwMAotLS0gYS9jb25maWcvbWgtc3VuMworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotIyBTdW4ncyBDIGNvbXBpbGVyIG5lZWRzIHRoZSAtSiBmbGFnIHRvIGJlIGFibGUgdG8gY29tcGlsZSBjcC1wYXJzZS5jCi0jIHdpdGhvdXQgb3ZlcmZsb3dpbmcgdGhlIGp1bXAgdGFibGVzICgtSiBzYXlzIHRvIHVzZSBhIDMyIGJpdCB0YWJsZSkKLUNDID0gY2MgLUoKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC1zeXN2IGIvY29uZmlnL21oLXN5c3YKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjExODcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXN5c3YKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTVgotUkFOTElCID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29uZmlnL21oLXN5c3Y0IGIvY29uZmlnL21oLXN5c3Y0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTA2NjUxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC1zeXN2NAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgRGVmaW5lIFNZU1YgYXMgLURTWVNWIGlmIHlvdSBhcmUgdXNpbmcgYSBTeXN0ZW0gViBvcGVyYXRpbmcgc3lzdGVtLgotU1lTViA9IC1EU1lTViAtRFNWUjQKLVJBTkxJQiA9IHRydWUKLQotIyBDKysgZGVidWdnaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIHVuZGVyIFNWUjQgKERXQVJGKQotQ1hYRkxBR1M9LU8KLQotIyBUaGUgbCBmbGFnIGdlbmVyYXRlcyBhIHdhcm5pbmcgZnJvbSB0aGUgU1ZSNCBhcmNoaXZlciwgcmVtb3ZlIGl0LgotQVJfRkxBR1MgPSBjcgotCi1YMTFfRVhUUkFfTElCUyA9IC1sbnNsCmRpZmYgLS1naXQgYS9jb25maWcvbWgtc3lzdjUgYi9jb25maWcvbWgtc3lzdjUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTM4ZTUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXN5c3Y1CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIERlZmluZSBTWVNWIGFzIC1EU1lTViBpZiB5b3UgYXJlIHVzaW5nIGEgU3lzdGVtIFYgb3BlcmF0aW5nIHN5c3RlbS4KLVNZU1YgPSAtRFNZU1YgLURTVlI0IC1EU1ZSNQotUkFOTElCID0gdHJ1ZQotCi0jIFRoZSBsIGZsYWcgZ2VuZXJhdGVzIGEgd2FybmluZyBmcm9tIHRoZSBTVlI0IGFyY2hpdmVyLCByZW1vdmUgaXQuCi1BUl9GTEFHUyA9IGNyCi0KLVgxMV9FWFRSQV9MSUJTID0gLWxuc2wKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC12YXh1bHQyIGIvY29uZmlnL21oLXZheHVsdDIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTJkYzguLjAwMDAwMDAKLS0tIGEvY29uZmlnL21oLXZheHVsdDIKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgVGhlIG9sZCBCU0QgcGNjIGlzbid0IHVwIHRvIGNvbXBpbGluZyBwYXJ0cyBvZiBnZGIgc28gdXNlIGdjYwotQ0MgPSBnY2MKZGlmZiAtLWdpdCBhL2NvbmZpZy9taC14ODZwaWMgYi9jb25maWcvbWgteDg2cGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmU0OGQ5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9taC14ODZwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHPS1mcGljCmRpZmYgLS1naXQgYS9jb25maWcvbXB3LW1oLW1wdyBiL2NvbmZpZy9tcHctbWgtbXB3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDNlZjRmLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHctbWgtbXB3CisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLSMgVGhpcyBpcyBhbiBNUFcgbWFrZWZpbGUgZnJhZ21lbnQuCi0KLSMgU2luY2UgdGhlcmUgYXJlIGEgbXVsdGlwbGljaXR5IG9mIE1hYyBjb21waWxlcnMgYW5kIHR3byBkaWZmZXJlbnQKLSMgcHJvY2Vzc29ycywgdGhpcyBmaWxlIGlzIHByaW1hcmlseSBhIGxpYnJhcnkgb2Ygb3B0aW9ucyBmb3IgZWFjaAotIyBjb21waWxlci4gIFNvbWVib2R5IGVsc2UgKHN1Y2ggYXMgYSBjb25maWd1cmUgb3IgYnVpbGQgc2NyaXB0KSB3aWxsCi0jIG1ha2UgdGhlIGFjdHVhbCBjaG9pY2UuCi0KLSMgQ29tcGlsZXIgdG8gdXNlIGZvciBjb21waWxpbmcuCi0KLUNDX01QV19DID0gQyAtZCBNUFdfQyAtZCBBTE1PU1RfU1REQyAtZCBBTlNJX1BST1RPVFlQRVMgLWQgTVBXIC1tYzY4MDIwIC1tb2RlbCBmYXIgLWIgLXcKLQotQ0NfU0MgPSBTQyAtZCBBTE1PU1RfU1REQyAtZCBBTlNJX1BST1RPVFlQRVMgLWQgTVBXIC1tYzY4MDIwIC1tb2RlbCBmYXIgLWIgLWkgJycgLWkgOgotCi1DQ19NV0M2OEsgPSBNV0M2OEsgLWQgTVBXIC1lbnVtIGludCAtbXB3X2NoYXJzIC1zeW0gb24gLXcgb2ZmIC1tYzY4MDIwIC1tb2RlbCBmYXIKLQotQ0NfUFBDQyA9IFBQQ0MgLWQgcG93ZXJjPTEgLWQgcGFzY2FsPSAtZCBBTE1PU1RfU1REQyAtZCBBTlNJX1BST1RPVFlQRVMgLWQgTVBXIC13Ci0KLUNDX01SQyA9IE1yQyAtZCBwb3dlcmM9MSAtZCBwYXNjYWw9IC1kIEFMTU9TVF9TVERDIC1kIEFOU0lfUFJPVE9UWVBFUyAtZCBNUFcgLWkgJycgLWkgOiAtam0KLQotQ0NfU01yQyA9IFNNckMgLWQgTVBXCi0KLSMgIi1tcHdfY2hhcnMiIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIEdOVSBzb3VyY2VzIG9mdGVuIG1peCBzaWduZWQgYW5kCi0jIHVuc2lnbmVkIGNhc3VhbGx5LgotIyAiLXcgb2ZmIiBpcyBub3QgYSBncmVhdCBpZGVhLCBidXQgQ1c3IGlzIGNvbXBsYWluaW5nIGFib3V0IGVudW0KLSMgYXNzaWdubWVudHMuCi0jICItb3B0IGdsb2JhbCxwZWVwLGw0LHNwZWVkIiBpcyBzb21ldGltZXMgZ29vZCwgYW5kIHNvbWV0aW1lcyBiYWQuCi0jIFdlIG11c3QgdXNlIHtDSW5jbHVkZXN9IHNvIHRoYXQgTVBXIHRvb2xzIHdpbGwgd29yazsge01XQ0luY2x1ZGVzfQotIyBkZWZpbmVzIHN0ZG91dCwgaXNsb3dlciwgZXRjLCBpbiB3YXlzIHRoYXQgYXJlIGluY29tcGF0aWJsZSB3aXRoIE1QVydzCi0jIHJ1bnRpbWUuICBIb3dldmVyLCB0aGlzIGNhbm5vdCBiZSBkb25lIHZpYSAgLWkgIntDSW5jbHVkZXN9Iiwgc2luY2UKLSMgdGhhdCBkb2VzIG5vdCBhZmZlY3QgaG93IDw+LXR5cGUgaW5jbHVkZXMgaGFwcGVuOyBpbnN0ZWFkLCB0aGUgdmFyaWFibGUKLSMgTVdDSW5jbHVkZXMgbXVzdCBiZSBzZXQgdG8gcG9pbnQgYXQge0NJbmNsdWRlc30uCi0KLUNDX01XQ1BQQyA9IE1XQ1BQQyAtZCBNUFcgLWVudW0gaW50IC1tcHdfY2hhcnMgLXN5bSBvbiAtdyBvZmYKLQotIyBOb3RlIHRoYXQgR0NDIGRvZXMgKm5vdCogd2lyZSBpbiBhIGRlZmluaXRpb24gb2YgInBhc2NhbCIsIHNvIHRoYXQKLSMgaXQgY2FuIGJlIGhhbmRsZWQgaW4gYW5vdGhlciB3YXkgaWYgZGVzaXJlZC4KLQotQ0NfNjhLX0dDQyA9IGdDIC1EcGFzY2FsPSAtREFOU0lfUFJPVE9UWVBFUyAtRE1QVwotCi1DQ19QUENfR0NDID0gZ0MgLURwb3dlcmM9MSAtRHBhc2NhbD0gLURBTlNJX1BST1RPVFlQRVMgLURNUFcKLQotIyBOb3RoaW5nIGZvciB0aGUgZGVmYXVsdCBDRkxBR1MuCi0KLUNGTEFHUyA9IAotCi0jIFRvb2wgdG8gdXNlIGZvciBtYWtpbmcgbGlicmFyaWVzL2FyY2hpdmVzLgotCi1BUl9MSUIgPSBMaWIKLQotQVJfTVdMSU5LNjhLID0gTVdMaW5rNjhLIC14bSBsaWJyYXJ5Ci0KLUFSX1BQQ0xJTksgPSBQUENMaW5rIC14bSBsaWJyYXJ5Ci0KLUFSX01XTElOS1BQQyA9IE1XTGlua1BQQyAteG0gbGlicmFyeQotCi1BUl9BUiA9IGFyCi0KLUFSX0ZMQUdTID0gLW8KLQotUkFOTElCX05VTEwgPSBudWxsLWNvbW1hbmQKLQotUkFOTElCX1JBTkxJQiA9IHJhbmxpYgotCi0jIENvbXBpbGVyIGFuZC9vciBsaW5rZXIgdG8gdXNlIGZvciBsaW5raW5nLgotCi1DQ19MRF9MSU5LID0gTGluayAtdyAtZCAtbW9kZWwgZmFyIHtDQ19MRF9UT09MX0ZMQUdTfQotCi1DQ19MRF9NV0xJTks2OEsgPSBNV0xpbms2OEsgLXcge0NDX0xEX1RPT0xfRkxBR1N9IC1zeW0gb24gLW1vZGVsIGZhcgotCi1DQ19MRF9QUENMSU5LID0gUFBDTGluayAtbWFpbiBfX3N0YXJ0IC1vdXRwdXRmb3JtYXQgeGNvZmYKLQotQ0NfTERfTVdMSU5LUFBDID0gTVdMaW5rUFBDIC13IHtDQ19MRF9UT09MX0ZMQUdTfSAtc3ltIG9uCi0KLUNDX0xEX0dMRCA9IGdDCi0KLSMgRXh0ZW5zaW9uIGZvciBsaW5rZXIgb3V0cHV0LgotCi1QUk9HX0VYVF82OEsgPQotCi1QUk9HX0VYVF9YQ09GRiA9IC54Y29mZgotCi0jIE5vdGhpbmcgZm9yIHRoZSBkZWZhdWx0IExERkxBR1MuCi0KLUxERkxBR1MgPSAtdwotCi1DQ19MRF9UT09MX0ZMQUdTID0gLWMgJ01QUyAnIC10IE1QU1QKLQotIyBMaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0LgotCi0jIEl0IHdvdWxkIGFwcGVhciB0aGF0IHRoZSBtYXRoIGxpYnJhcmllcyBhcmUgbm90Ci0jIG5lZWRlZCBleGNlcHQgdG8gcHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIHNjYWxiLAotIyB3aGljaCBpcyBjYWxsZWQgZnJvbSBsZGV4cCwgd2hpY2ggaXMgcmVmZXJlbmNlZAotIyBpbiB0aGUgbTY4ayBvcGNvZGVzIGxpYnJhcnkuCi0KLUVYVFJBTElCU19DID0gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJTdGRDbGliLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJNYXRoLm8gXE9wdGlvbi1kCi0JIntDTGlicmFyaWVzfSJDU0FORUxpYi5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJTdHVicy5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IkludGVyZmFjZS5vIFxPcHRpb24tZAotCSJ7TGlicmFyaWVzfSJUb29sTGlicy5vCi0KLUVYVFJBTElCU19NV0M2OEsgPSBcT3B0aW9uLWQKLQkie0NMaWJyYXJpZXN9IlN0ZENsaWIubyBcT3B0aW9uLWQKLQkie0NMaWJyYXJpZXN9Ik1hdGgubyBcT3B0aW9uLWQKLQkie0NMaWJyYXJpZXN9IkNTQU5FTGliLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IlN0dWJzLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IlJ1bnRpbWUubyBcT3B0aW9uLWQKLQkie0xpYnJhcmllc30iSW50ZXJmYWNlLm8gXE9wdGlvbi1kCi0JIntMaWJyYXJpZXN9IlRvb2xMaWJzLm8gXE9wdGlvbi1kCi0JIntNVzY4S0xpYnJhcmllc31NUFcgQU5TSSAoNGkpIEMuNjhLLkxpYiIKLQotRVhUUkFMSUJTX1BQQ19YQ09GRiA9IFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJTdGRDUnVudGltZS5vIFxPcHRpb24tZAotCSJ7UFBDTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIueGNvZmYgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9Ik1hdGhMaWIueGNvZmYgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlN0ZENMaWIueGNvZmYgXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlBQQ0NSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntHQ0NQUENMaWJyYXJpZXN9ImxpYmdjYy54Y29mZgotCi1FWFRSQUxJQlNfUFBDID0gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlN0ZENSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IkludGVyZmFjZUxpYiBcT3B0aW9uLWQKLQkie1NoYXJlZExpYnJhcmllc30iTWF0aExpYiBcT3B0aW9uLWQKLQkie1NoYXJlZExpYnJhcmllc30iU3RkQ0xpYiBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDVG9vbExpYnMubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie0dDQ1BQQ0xpYnJhcmllc30ibGliZ2NjLnhjb2ZmCi0KLUVYVFJBTElCU19NV0NQUEMgPSBcT3B0aW9uLWQKLQkie01XUFBDTGlicmFyaWVzfSJNV1N0ZENSdW50aW1lLkxpYiBcT3B0aW9uLWQKLQkie01XUFBDTGlicmFyaWVzfSJJbnRlcmZhY2VMaWIgXE9wdGlvbi1kCi0JIntNV1BQQ0xpYnJhcmllc30iU3RkQ0xpYiBcT3B0aW9uLWQKLQkie01XUFBDTGlicmFyaWVzfSJNYXRoTGliIFxPcHRpb24tZAotCSJ7TVdQUENMaWJyYXJpZXN9IlBQQ1Rvb2xMaWJzLm8KLQotIyBUb29sIHRvIG1ha2UgUEVGIHdpdGgsIGlmIG5lZWRlZC4KLQotTUFLRVBFRl9OVUxMID0gbnVsbC1jb21tYW5kCi0KLU1BS0VQRUZfUFBDID0gTWFrZVBFRgotCi1NQUtFUEVGX0ZMQUdTID0gXE9wdGlvbi1kCi0JLWwgSW50ZXJmYWNlTGliLnhjb2ZmPUludGVyZmFjZUxpYiBcT3B0aW9uLWQKLQktbCBNYXRoTGliLnhjb2ZmPU1hdGhMaWIgXE9wdGlvbi1kCi0JLWwgU3RkQ0xpYi54Y29mZj1TdGRDTGliCi0KLU1BS0VQRUZfVE9PTF9GTEFHUyA9IC1mdCBNUFNUIC1mYyAnTVBTICcKLQotIyBSZXNvdXJjZSBjb21waWxlciB0byB1c2UuCi0KLVJFWl82OEsgPSBSZXoKLQotUkVaX1BQQyA9IFJleiAtZCBXQU5UX0NGUkcKLQpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9DaGFuZ2VMb2cgYi9jb25maWcvbXB3L0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkZWZiZi4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLVR1ZSBOb3YgMjYgMTI6MzQ6MTIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZDogRml4IHNvbWUgY29tbWVudHMuCi0KLU1vbiBTZXAgMTYgMTQ6NDI6NTIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZCAoSExERU5WKTogRWRpdCBvdXQgYWxsIHJlZmVyZW5jZXMuCi0KLVRodSBBdWcgMTUgMTk6NDk6MjMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiB0cnVlOiBOZXcgc2NyaXB0LCBpZGVudGljYWwgdG8gbXB3LXRydWUuCi0JKiBnLW1wdy1tYWtlLnNlZDogQWRkIEBEQVNIX0NfRkxBR0AgYW5kIEBTRUdNRU5UX0ZMQUcoKUAKLQl0byB0aGUgZWRpdG9ycyBmb3IgY29tcGlsZSBjb21tYW5kcy4KLQotVGh1IEF1ZyAgMSAxNTowMTo0MiAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy10cnVlLCBtcHctdG91Y2gsIG51bGwtY29tbWFuZDogTmV3IHNjcmlwdHMuCi0JKiBSRUFETUU6IERlc2NyaWJlIHVzYWdlIGluIG1vcmUgZGV0YWlsLgotCi1UdWUgRGVjIDEyIDE0OjUxOjUxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQ6IERvbid0IGVkaXQgb3V0ICJ2ZXJzaW9uPSIgb2NjdXJyZW5jZXMuCi0KLUZyaSBEZWMgIDEgMTE6NDY6MTggMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBnLW1wdy1tYWtlLnNlZCAoYmluZGlyLCBsaWJkaXIpOiBFZGl0IHRoZSBwb3NpdGlvbnMgb2YKLQlwYXRobmFtZSBzZXBhcmF0b3JzIHRvIHdvcmsgd2l0aCBvdGhlciBwYXRobmFtZXMgYmV0dGVyLgotCi1UdWUgTm92ICA3IDE1OjA4OjA3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQ6IEFkZCBjb21tZW50IGFib3V0IER1cGxpY2F0ZSB2cyBDYXRlbmF0ZSwKLQlhZGQgYWRkaXRpb25hbCBwYXR0ZXJuIGZvciBlZGl0aW5nIGxpbmstY29tcGlsZSBjb21tYW5kcy4KLQotVHVlIE9jdCAyNCAxNDoyODo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGctbXB3LW1ha2Uuc2VkOiBBZGQgaGFuZGxpbmcgZm9yICoudGFiLltoY10gZmlsZXMuCi0JKENISUxMX0ZPUl9UQVJHRVQsIENISUxMX0xJQik6IEVkaXQgb3V0IHRyaWNreSBkZWZpbml0aW9ucwotCW9mIHRoZXNlLgotCi1UaHUgU2VwIDI4IDIxOjA1OjEwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogZy1tcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBnZW5lcmljIHNlZCBjb21tYW5kcyB0byB0cmFuc2xhdGUKLQlVbml4IG1ha2VmaWxlcyBpbnRvIE1QVyBtYWtlZmlsZSBzeW50YXguCi0KLUZyaSBNYXIgMTcgMTE6NTE6MjAgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBSRUFETUU6IENsYXJpZnkgaW5zdHJ1Y3Rpb25zLgotCSogZmk6IFJlbW92ZS4KLQotV2VkIERlYyAyMSAxNTo0NTo1MyAxOTk0ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIE1vdmVJZkNoYW5nZSwgUkVBRE1FLCBmaSwgZm9yd2FyZC1pbmNsdWRlLCBvcGVuLWJyYWNlLAotICAgICAgICB0ci03dG84LXNyYzogTmV3IGZpbGVzLgpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9Nb3ZlSWZDaGFuZ2UgYi9jb25maWcvbXB3L01vdmVJZkNoYW5nZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiYzEyNS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L01vdmVJZkNoYW5nZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgUmVuYW1lIGEgZmlsZSBvbmx5IGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIGEgcHJldmlvdXNseSBleGlzdGluZwotIyBmaWxlIG9mIHRoZSBzYW1lIG5hbWUuICBUaGlzIGlzIHVzZWZ1bCBmb3Iga2VlcGluZyBtYWtlIGZyb20gZG9pbmcKLSMgdG9vIG11Y2ggd29yayBpZiB0aGUgY29udGVudHMgb2YgYSBmaWxlIGhhdmVuJ3QgY2hhbmdlZC4KLQotIyBUaGlzIGlzIGFuIE1QVyB0cmFuc2xhdGlvbiBvZiB0aGUgc3RhbmRhcmQgR05VIHNoIHNjcmlwdCBtb3ZlLWlmLWNoYW5nZS4KLQotU2V0IGV4aXQgMAotCi1JZiAiYGV4aXN0cyAtZiAiezJ9ImAiCi0gIENvbXBhcmUgInsxfSIgInsyfSIgPmRldjpudWxsCi0gIElmIHtzdGF0dXN9ICE9IDAKLSAgICBSZW5hbWUgLXkgInsxfSIgInsyfSIKLSAgRWxzZQotICAgIEVjaG8gInsyfSIgaXMgdW5jaGFuZ2VkCi0gICAgRGVsZXRlIC1pIC15ICJ7MX0iCi0gIEVuZAotRWxzZQotICBSZW5hbWUgLXkgInsxfSIgInsyfSIKLUVuZApkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9SRUFETUUgYi9jb25maWcvbXB3L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU0NzAwYS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIE1QVyBzY3JpcHRzIGFuZCByZWxhdGVkIGZpbGVzIHRoYXQgYXJlIG5lZWRlZCB0bwotYnVpbGQgQ3lnbnVzIEdOVSB0b29scyBmb3IgTVBXLiAgVGhlIHNjcmlwdHMgc2hvdWxkIGJlIHNvbWV3aGVyZSBvbiB0aGUKLWNvbW1hbmQgcGF0aDsgb3VyIHVzdWFsIHByYWN0aWNlIGhhcyBiZWVuIHRvIGhhdmUgYSBzZXBhcmF0ZSBkaXJlY3RvcnkKLWZvciB0aGUgc2NyaXB0cywgYW5kIHB1dCB0aGUgdG9vbHMgKGJ5YWNjLCBmbGV4LCBhbmQgc2VkIGF0IGxlYXN0KSB0aGVyZQotYWxzbzsgdGhlbiBpdCdzIGVhc2llciB0byBkcmFnIHRoZSBzdXBwb3J0IGJpdHMgYXJvdW5kIGFzIGEgZ3JvdXAsIG9yIHRvCi11cGdyYWRlIE1QVyB2ZXJzaW9ucy4gIFRoZSBjb21wbGV0ZSBwYWNrYWdlIG9mIHNjcmlwdHMgYW5kIHRvb2wgYmluYXJpZXMKLWlzIHVzdWFsbHkgYXZhaWxhYmxlIGFzIHB1Yi9tYWMvYnVpbGR0b29scy5jcHQuaHF4IG9uIGZ0cC5jeWdudXMuY29tLgotCi0idHItN3RvOC1zcmMiIGlzIGFjdHVhbGx5IHRoZSBzb3VyY2UgdG8gYW4gTVBXIHNjcmlwdCB0aGF0IHRyYW5zZm9ybXMKLXNlcXVlbmNlcyBsaWtlICJcT3B0aW9uLWQiIGludG8gdGhlIGFjdHVhbCA4LWJpdCBjaGFycyB0aGF0IE1QVyBuZWVkcy4KLUl0J3Mgb25seSB0aGUgc291cmNlIGJlY2F1c2UgaXQgY2FuJ3QgaXRzZWxmIGluY2x1ZGUgYW55IDgtYml0IGNoYXJzLgotSXQgKmNhbiogYmUgcHJvY2Vzc2VkIGludG8gYSBnZW51aW5lICJ0ci03dG84IiBieSB1c2luZyBpdHNlbGY6Ci0KLQl0ci03dG84IHRyLTd0bzgtc3JjIHwgc2VkIC1lICdzL1NyYy8vJyA+bmV3LXRyLTd0bzgKLQotVXNlIHRoaXMgdG8gdmVyaWZ5OgotCi0JY29tcGFyZSB0ci03dG84IG5ldy10ci03dG84Ci0KLUlmIHlvdSBkb24ndCBoYXZlIGEgd29ya2luZyB0ci03dG84LCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gbWFudWFsbHkKLXJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mICJcT3B0aW9uLWQiIHdpdGggcmVhbCBPcHRpb24tZCAod2hpY2ggbG9va3MKLWxpa2UgYSBkZWx0YSksIHRoZW4gZG8gc2ltaWxhcmx5IHdpdGggYWxsIHRoZSBvdGhlciAiXE9wdGlvbi0uLi4iCi1zdHJpbmdzLCBhbmQgdGhlbiBjaGFuZ2UgIlxTcmNPcHRpb24tZCIgaW50byB0aGUgc3RyaW5nICJcT3B0aW9uLWQiLgpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9mb3J3YXJkLWluY2x1ZGUgYi9jb25maWcvbXB3L2ZvcndhcmQtaW5jbHVkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkNmJkNy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L2ZvcndhcmQtaW5jbHVkZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotRWNobyAnI2luY2x1ZGUnILYiInsxfSK2IiA+InsyfSIudGVtCi1Nb3ZlSWZDaGFuZ2UgInsyfSIudGVtICJ7Mn0iCi0KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvZy1tcHctbWFrZS5zZWQgYi9jb25maWcvbXB3L2ctbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2QzYzc3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvZy1tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlIFVuaXggbWFrZWZpbGVzIGludG8gTVBXIG1ha2VmaWxlcy4KLSMgVGhlc2UgYXJlIG5vbWluYWxseSBnZW5lcmljLCBidXQgd29yayBiZXN0IG9uIHRoZSBtYWtlZmlsZXMgdXNlZAotIyBmb3IgR05VIHByb2dyYW1zLgotCi0jIFdoYWNrIG91dCBhbnkgY29tbWVudGVkLW91dCBsaW5lcyB0aGF0IGFyZSBwcm9iYWJseSBjb21tYW5kczsKLSMgdGhleSBjYW4gb25seSBjYXVzZSB0cm91YmxlIGxhdGVyIG9uLgotL14jCS9kCi0KLSMgQ2hhbmdlIGRlcGVuZGVuY3kgY2hhci4KLS86JC9zLzovIFxcT3B0aW9uLWYvZwotL15bXiAJOiNdW146XSo6L3MvXChbIAldKlwpOlwoWyAJXSpcKS8gXFxPcHRpb24tZiAvZwotCi0jIENoYW5nZSBzeW50YXggb2YgTWFrZWZpbGUgdmFycy4KLS9cJC9zL1wke1woW2EtekEtWjAtOV8tXSpcKX0ve1wxfS9nCi0vXCQvcy9cJChcKFthLXpBLVowLTlfLV0qXCkpL3tcMX0vZwotLyAkQC9zLyAkQC8ge1Rhcmd9LwotCi0jIERvdWJsZS0kIGFyZSBsaXRlcmFscyB0byBVbml4IGJ1dCBub3QgdG8gTVBXIG1ha2UuCi0vXCRcJC9zL1wkXCQvJC9nCi0KLSMgQ2hhbmdlIHBhdGhuYW1lIHN5bnRheC4KLS9cLy9zLFwuXC4vXC9cLlwuLyw6OjosZwotL1wvL3MsXC5cLi8sOjosZwotL1wuXC8vcyxcLi8sOixnCi0vXC8vcywvLDosZwotIyBVbmRvIGV4Y2VzcyBjaGFuZ2VzLgotL2FuZC9zLGFuZDpvciQsYW5kL29yLAotL2FuZC9zLGFuZDpvciAsYW5kL29yICwKLS93YW50L3Msd2FudDpuZWVkLHdhbnQvbmVlZCwKLSMgRml4aW5nIHVwIHNlZCBjb21tYW5kcy4KLS8tZS9zXyI6XChbXjpdKlwpOmQiXyIvXDEvZCJfZwotLy1lL3NfIjpcKFteOl0qXCk6LDpcKFteOl0qXCk6ZCJfIi9cMS8sL1wyL2QiX2cKLQotLz0vcy8gPSBcLiQvID0gOi8KLQotIyBNYWtlIHRoZXNlIGdvIGF3YXkgc28gdGhhdCBsYXRlciBlZGl0cyBub3QgY29uZnVzZWQuCi0vSExERU5WL3Mve0hMREVOVn0vLwotCi0jIENvbW1lbnQgb3V0IGFueSBleHBsaWNpdCBzcmNkaXIgc2V0dGluZy4KLS9zcmNkaXIvcy9ec3JjZGlyLyMgc3JjZGlyLwotCi0vQkFTRURJUi9zL15CQVNFRElSID0uKiQvQkFTRURJUiA9ICJ7c3Jjcm9vdH0iLwotL3tCQVNFRElSfTovcy97QkFTRURJUn06L3tCQVNFRElSfS9nCi0ve3NyY2Rpcn06L3Mve3NyY2Rpcn06LyJ7c3JjZGlyfSIvZwotLyJ7c3JjZGlyfSI6L3MvIntzcmNkaXJ9IjovIntzcmNkaXJ9Ii9nCi0KLSMgVHdlYWsgc29tZSBjb252ZW50aW9ucyB0aGF0IGFyZSBiYWNrd2FyZHMgZm9yIHRoZSBNYWMuCi0vYmluZGlyL3Mve2V4ZWNfcHJlZml4fTpiaW4ve2V4ZWNfcHJlZml4fWJpbjovCi0vbGliZGlyL3Mve2V4ZWNfcHJlZml4fTpsaWIve2V4ZWNfcHJlZml4fWxpYjovCi0KLSMgQ29tbWVudCBvdXQgc2V0dGluZ3Mgb2YgYW55dGhpbmcgc2V0IGJ5IG1wdyBob3N0IGNvbmZpZy4KLS9DQy9zL15DQyAqPS8jQ0MgPS8KLS9DRkxBR1Mvcy9eQ0ZMQUdTICo9LyNDRkxBR1MgPS8KLS9BUi9zL15BUiAqPS8jQVIgPS8KLS9BUl9GTEFHUy9zL15BUl9GTEFHUyAqPS8jQVJfRkxBR1MgPS8KLS9SQU5MSUIvcy9eUkFOTElCICo9LyNSQU5MSUIgPS8KLS9DQ19MRC9zL15DQ19MRCAqPS8jQ0NfTEQgPS8KLS9MREZMQUdTL3MvXkxERkxBR1MgKj0vI0xERkxBR1MgPS8KLQotIyBDaGFuZ2UgLUkgdXNhZ2VzLgotLy1JL3MvLUlcLi8taSA6L2cKLS8tSS9zLy1JOjpiZmQvLWkgOjpiZmQ6L2cKLS8tSS9zLy1JOjppbmNsdWRlLy1pIDo6aW5jbHVkZTovZwotLy1JL3MvLUkvLWkgL2cKLQotIyBDaGFuZ2UgLUQgdXNhZ2UuCi0vLUQvcy9cKFsgPV1cKS1EXChbXiBdKlwpL1wxLWQgXDIvZwotCi0jIENoYW5nZSBjb250aW51YXRpb24gY2hhci4KLS9cXCQvcy9cXCQvXFxPcHRpb24tZC8KLQotIyBDaGFuZ2Ugd2lsZGNhcmQgY2hhci4KLS9cKi9zL1wqL1xcT3B0aW9uLXgvZwotCi0jIENoYW5nZSBwYXRoIG9mIHZhcmlvdXMgdHlwZXMgb2Ygc291cmNlIGZpbGVzLiAgVGhpcyBydWxlIGRvZXMgbm90IGFsbG93Ci0jIGZvciBmaWxlIG5hbWVzIHdpdGggbXVsdGlwbGUgZG90cyBpbiB0aGUgbmFtZS4KLS9cLltjaGx5XS9zL1woWyAJPjw9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLlwoW2NobHldXCkvXDEie3N9IlwyLlwzL2cKLS9cLltjaGx5XS9zL15cKFstYS16QS1aMC05XyR7fToiXSpcKVwuXChbY2hseV1cKS8ie3N9IlwxLlwyLwotIyBBbGxvdyBmaWxlcyBuYW1lZCAqLnRhYi5bY2hdIGFzIGEgc3BlY2lhbCBjYXNlLgotL1wudGFiXC5bY2hdL3MvXChbIAk+PD1dXClcKFstYS16QS1aMC05XyR7fToiXSpcLnRhYlwpXC5cKFtjaF1cKS9cMSJ7c30iXDIuXDMvZwotL1wudGFiXC5bY2hdL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwudGFiXClcLlwoW2NoXVwpLyJ7c30iXDEuXDIvCi0jIEZpeCBzb21lIG92ZXJlbnRodXNpYXNtcy4KLS97c30vcy8ie3N9IiJ7c3JjZGlyfSIvIntzcmNkaXJ9Ii9nCi0ve3N9L3MvIntzfSJ7XChbYS16QS1aMC05X10qXClkaXJ9LyJ7XDFkaXJ9Ii9nCi0ve3N9L3MvIntzfSJ7XChbYS16QS1aMC05X10qXClESVJ9LyJ7XDFESVJ9Ii9nCi0ve3N9L3MvIntzfSIie1woW2EtekEtWjAtOV9dKlwpZGlyfSIvIntcMWRpcn0iL2cKLS97c30vcy8ie3N9IiJ7XChbYS16QS1aMC05X10qXClESVJ9Ii8ie1wxRElSfSIvZwotL3tzfS9zLyJ7c30iOi86L2cKLS97c30vcy9eIntzfSIvL2cKLS97c30vcy8ie3N9IiJ7c30iLyJ7c30iL2cKLS97c30vcy8ie3N9IiJ7c3JjZGlyfSIvIntzfSIvZwotL3tzfS9zLyJ7c3JjZGlyfSIie3N9Ii8ie3N9Ii9nCi0KLSMgVGhlIC5kZWYgZmlsZXMgYXJlIGFsc28gdHlwaWNhbGx5IHNvdXJjZSBmaWxlcy4KLS9cLmRlZi9zL1woWyAJPjxdXClcKFstYS16QS1aMC05XyR7fToiXSpcKVwuZGVmL1wxIntzfSJcMi5kZWYvZwotL1wuZGVmL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC5kZWYvIntzfSJcMS5kZWYvZwotCi0jIENoYW5nZSBleHRlbnNpb24gYW5kIHBhdGggb2Ygb2JqZWN0cy4KLS9cLm8vcy9cKFsgCT1dXClcKFstYS16QS1aMC05XyR7fToiXSpcKVwuby9cMSJ7b30iXDIuYy5vL2cKLS9cLm8vcy9eXChbLWEtekEtWjAtOV8ke306Il0qXClcLm8vIntvfSJcMS5jLm8vCi0jIEFsbG93ICoudGFiLm8gZmlsZXMgYXMgYSBzcGVjaWFsIGNhc2Ugb2YgYSAyLWRvdC1uYW1lIGZpbGUuCi0vXC5vL3MvXChbIAk9XVwpXChbLWEtekEtWjAtOV8ke306Il0qXClcLnRhYlwuby9cMSJ7b30iXDIudGFiLmMuby9nCi0vXC5vL3MvXlwoWy1hLXpBLVowLTlfJHt9OiJdKlwpXC50YWJcLm8vIntvfSJcMS50YWIuYy5vLwotIyBDbGVhbiB1cC4KLS8ie299Ii9zLyJ7b30iIntvfSIvIntvfSIvZwotLyJ7b30iL3MvXiJ7b30iXChbYS16QS1aMC05X10qXCk9L1wxPS8KLQotIyBDaGFuZ2UgZXh0ZW5zaW9uIG9mIGxpYnMuCi0vXC5hL3MvbGliXChbYS16XSpcKVwuYS9saWJcMS5vL2cKLQotIyBSZW1vdmUgbm9uLWZhaWwgb3B0aW9uLgotLy0vcy9eXChbIAldKlwpLS9cMS8KLSMgRml4IG92ZXJlYWdlcm5lc3NlcyAtIGFzc3VtZXMgbm8gb25lLWxldHRlciBjb21tYW5kcy4KLS9eWyAJXSpbYS16XSAvcy9eXChbIAldKlwpXChbYS16XVwpIC9cMS1cMiAvCi0KLSMgUmVtb3ZlIG5vbi1lY2hvIG9wdGlvbi4gKHdhdGNoIG91dCBmb3IgYXV0b2NvbmYgdGhpbmdzKQotL0Avcy9eXChbIAldKlwpQC9cMS8KLQotIyBDaGFuZ2UgY3AgdG8gRHVwbGljYXRlLgotIyBDYXRlbmF0ZSBpcyBwZXJoYXBzIG1vcmUgYWNjdXJhdGUsIGJ1dCB0aGUgcGF0dGVybiB3b3VsZCBoYXZlIHRvCi0jIGlkZW50aWZ5IHRoZSBvdXRwdXQgZmlsZSBhbmQgYWRkIGEgJz4nIHJlZGlyZWN0aW9uIGludG8gaXQuCi0vY3Avcy9eXChbIAldKlwpY3AgL1wxRHVwbGljYXRlIC1kIC15IC8KLSMgQ2hhbmdlIG12IHRvIFJlbmFtZS4KLS9tdi9zL15cKFsgCV0qXCltdiAvXDFSZW5hbWUgLXkgLwotL1JlbmFtZS9zL15cKFsgCV0qXClSZW5hbWUgLXkgLWYvXDFSZW5hbWUgLXkvCi0jIENoYW5nZSBybSB0byBEZWxldGUuCi0vcm0gLXJmL3MvXlwoWyAJXSpcKXJtIC1yZiAvXDFEZWxldGUgLWkgLXkgLwotL3JtIC1mL3MvXlwoWyAJXSpcKXJtIC1mIC9cMURlbGV0ZSAtaSAteSAvCi0vcm0vcy9eXChbIAldKlwpcm0gL1wxRGVsZXRlIC1pIC15IC8KLSMgTm90ZSB0aGF0IHdlIGRvbid0IG1lc3Mgd2l0aCBsbiAtIGRpcmVjdG9yeS1zcGVjaWZpYyBzY3JpcHRzCi0jIG11c3QgZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCBzeW1saW5rcy4KLSMgQ2hhbmdlIGNhdCB0byBDYXRlbmF0ZS4KLS9jYXQvcy9eXChbIAldKlwpY2F0IC9cMUNhdGVuYXRlIC8KLSMgQ2hhbmdlIHRvdWNoIHRvIG1wdy10b3VjaC4KLS90b3VjaC9zL15cKFsgCV0qXCl0b3VjaCAvXDFtcHctdG91Y2ggLwotIyBDaGFuZ2UgbWtkaXIgdG8gTmV3Rm9sZGVyLgotL21rZGlyL3MvXlwoWyAJXSpcKW1rZGlyIC9cMU5ld0ZvbGRlciAvCi0jIENoYW5nZSB2YXIgc2V0dGluZyB0byBTZXQuCi0vPS9zL15cKFsgCV0qXClcKFstYS16QS1aMC05X10qXCk9XChbXjtdKlwpOyBcXE9wdGlvbi1kL1wxU2V0IFwyIFwzLwotCi0jIENoYW5nZSB0ZXN0cy4KLS9pZiAvcy9pZiBcWyAqLWYgXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiLwotL2lmIC9zL2lmIFxbICotZiBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgIT0gIiIvCi0vaWYgL3MvaWYgXFsgISAqLWYgXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiID09ICIiLwotL2lmIC9zL2lmIFxbICEgKi1mIFwoW14gXSpcKSBdICo7ICp0aGVuIFxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiID09ICIiLwotCi0vaWYgL3MvaWYgXFsgKi1kIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIi8KLS9pZiAvcy9pZiBcWyAqLWQgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgImBFeGlzdHMgIlwxImAiICE9ICIiLwotL2lmIC9zL2lmIFxbICEgKi1kIFwoW14gXSpcKSBdICo7ICpcXE9wdGlvbi1kL0lmICJgRXhpc3RzICJcMSJgIiA9PSAiIi8KLS9pZiAvcy9pZiBcWyAhICotZCBcKFteIF0qXCkgXSAqOyAqdGhlbiAqXFxPcHRpb24tZC9JZiAiYEV4aXN0cyAiXDEiYCIgPT0gIiIvCi0KLS9pZiAvcy9pZiBcWyAtZCBcKFteIF0qXCkgXSAqOyB0aGVuIHRydWUgKjsgZWxzZSBta2RpciBcKFteIDtdKlwpICo7IGZpL0lmICJgRXhpc3RzICJcMSJgIiAhPSAiIiBOZXdGb2xkZXIgXDIgRW5kIElmLwotCi0vaWYgL3MvaWYgXFsgXChbXiBdKlwpID0gXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgIlwxIiA9PSAiXDIiLwotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSA9IFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJcMSIgPT0gIlwyIi8KLQotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSAhPSBcKFteIF0qXCkgXSAqOyAqXFxPcHRpb24tZC9JZiAiXDEiICE9ICJcMiIvCi0vaWYgL3MvaWYgXFsgXChbXiBdKlwpICE9IFwoW14gXSpcKSBdICo7ICp0aGVuICpcXE9wdGlvbi1kL0lmICJcMSIgIT0gIlwyIi8KLQotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSAtZXEgXChbXiBdKlwpIF0gKjsgKlxcT3B0aW9uLWQvSWYgIlwxIiAhPSAiXDIiLwotL2lmIC9zL2lmIFxbIFwoW14gXSpcKSAtZXEgXChbXiBdKlwpIF0gKjsgKnRoZW4gKlxcT3B0aW9uLWQvSWYgIlwxIiAhPSAiXDIiLwotCi0vXlsgCV0qZWxzZSB0cnVlJC9jXAotCUVsc2VcCi0JCW1wdy10cnVlXAotCi0KLS9lbHNlL3MvXlwoWyAJXSpcKWVsc2VbIAldKiQvXDFFbHNlLwotL2Vsc2Uvcy9eXChbIAldKlwpZWxzZVs7IAldKlxcT3B0aW9uLWQkL1wxRWxzZS8KLQotL15bIAldKmVsc2VbIAldKnRydWVbIAldKiQvY1wKLQlFbHNlXAotCQltcHctdHJ1ZQotCi0vXlsgCV0qZWxzZVsgCV0qdHJ1ZVs7IAldKmZpJC9jXAotCUVsc2VcCi0JCW1wdy10cnVlXAotCUVuZCBJZgotCi0vZmkvcy9eXChbIAldKlwpZmkgKiQvXDFFbmQvCi0vZmkvcy9eXChbIAldKlwpZmkgKjsgKlxcT3B0aW9uLWQvXDFFbmQvCi0KLSMgQ2hhbmdlIGxvb3BpbmcuCi0vZm9yL3MvXlwoWyAJXSpcKWZvciBcKFstYS16QS1aMC05X10qXCkgaW4gXChbXjtdKlwpOyAqZG8gKlxcT3B0aW9uLWQvXDFGb3IgXDIgSW4gXDMvCi0vXlwoWyAJXSpcKWRvICpcXE9wdGlvbi1kL2QKLS9kb25lL3MvXlwoWyAJXSpcKWRvbmUgKjsgKlxcT3B0aW9uLWQvXDFFbmQvCi0vZG9uZS9zL15cKFsgCV0qXClkb25lJC9cMUVuZC8KLQotIyBUcmFpbGluZyBzZW1pY29sb25zIGFuZCBjb250aW51ZWQgbGluZXMgYXJlIHVubmVlZGVkIHNoIHN5bnRheC4KLS87IFxcT3B0aW9uLWQvcy87IFxcT3B0aW9uLWQvLwotCi0jIENoYW5nZSBtb3ZlLWlmLWNoYW5nZSB0byBNb3ZlSWZDaGFuZ2UuCi0vbW92ZS1pZi1jaGFuZ2Uvcy9cKFteIAldKlwpbW92ZS1pZi1jaGFuZ2UvTW92ZUlmQ2hhbmdlL2cKLQotIyBDaGFuZ2UgJChTSEVMTCkgdG8gdGhlIHNjcmlwdCBuYW1lIGJ5IGl0c2VsZi4KLS9TSEVMTC9zL15cKFsgCV0qXCl7U0hFTEx9IC9cMS8KLQotIyBDaGFuZ2Ugc3ludGF4IG9mIGRlZmF1bHQgcnVsZSBkZXBlbmRlbmN5LgotL15cLmNcLm8vcy9eXC5jXC5vIFxcT3B0aW9uLWYkLy5jLm8gXFxPcHRpb24tZiAuYy8KLQotIyBDaGFuZ2UgZGVmYXVsdCBydWxlJ3MgYWN0aW9uLgotL3tDQ30gLWMvcy97Q0N9IC1jIFwoLipcKSBcJDwkL3tDQ30gQERBU0hfQ19GTEFHQCB7RGVwRGlyfXtEZWZhdWx0fS5jIFwxIEBTRUdNRU5UX0ZMQUcoe0RlZmF1bHR9KUAgLW8ge1RhcmdEaXJ9e0RlZmF1bHR9LmMuby8KLQotIyBUaGlzIGlzIHByZXR0eSBkaXNndXN0aW5nLCBidXQgSSBjYW4ndCBzZWVtIHRvIGRldGVjdCBlbXB0eSBydWxlcy4KLS9PcHRpb24tZiQvcy9PcHRpb24tZiQvT3B0aW9uLWYgX29sZGVzdC9nCi0KLSMgUmVtb3ZlIC1jIGZyb20gZXhwbGljaXQgY29tcGlsZXIgY2FsbHMuIChidXQgc2hvdWxkIG5vdCBpZiBHQ0MpCi0jIEhhbmRsZSB0aGUgY2FzZSBvZiBhIHNvdXJjZSBmaWxlIHRoYXQgaXMgInt4eHh9ImZpbGUuYy4KLS8gLWMgL3Mve1woW0EtWl9dKlwpQ0N9XCguKlwpIC1jIFwoLipcKSJcKFteIl0qXCkiXChbLWEtel9dKlwpXC5jL3tcMUNDfVwyIEBEQVNIX0NfRkxBR0AgXDMiXDQiXDUuYyAtbyAie299Ilw1LmMuby8KLSMgSGFuZGxlIHRoZSBjYXNlIG9mIGEgc291cmNlIGZpbGUgdGhhdCBpcyAie3h4eH0iZGlyOmZpbGUuYy4KLS8gLWMgL3Mve1woW0EtWl9dKlwpQ0N9XCguKlwpIC1jIFwoLipcKSJcKFteIl0qXCkiXChbLWEtel9dKlwpOlwoWy1hLXpfXSpcKVwuYy97XDFDQ31cMiBAREFTSF9DX0ZMQUdAIFwzIlw0Ilw1Olw2LmMgLW8gIntvfSJcNi5jLm8vCi0KLSMgQ2hhbmdlIGxpbmtpbmcgY2MgdG8gbGlua2luZyBzZXF1ZW5jZS4KLS8tby9zL15cKFsgCV0qXCl7Q0N9IFwoLipcKXtcKFtBLVpfXSpcKUNGTEFHU30gXCguKlwpe0xERkxBR1N9IFwoLipcKS1vIFwoW14gXSpcKSBcKC4qXCkkL1wxe0NDX0xEfSBcMiB7XDNDRkxBR1N9IFw0IHtMREZMQUdTfSBcNSAtbyBcNntQUk9HX0VYVH0gXDdcCi1cMXtNQUtFUEVGfSBcNntQUk9HX0VYVH0gLW8gXDYge01BS0VQRUZfVE9PTF9GTEFHU30ge01BS0VQRUZfRkxBR1N9XAotXDF7UkVafSAie3N9Ilw2LnIgLW8gXDYgLWFwcGVuZCAtZCBQUk9HX05BTUU9JyInXDYnIicgLWQgVkVSU0lPTl9TVFJJTkc9JyIne3ZlcnNpb259JyInLwotLy1vL3MvXlwoWyAJXSpcKXtDQ30gXCguKlwpe1woW0EtWl9dKlwpQ0ZMQUdTfSBcKC4qXCktbyBcKFteIF0qXCkgXCguKlwpe0xERkxBR1N9IFwoLipcKSQvXDF7Q0NfTER9IFwyIHtcM0NGTEFHU30gXDQge0xERkxBR1N9IFw2IC1vIFw1e1BST0dfRVhUfSBcN1wKLVwxe01BS0VQRUZ9IFw1e1BST0dfRVhUfSAtbyBcNSB7TUFLRVBFRl9UT09MX0ZMQUdTfSB7TUFLRVBFRl9GTEFHU31cCi1cMXtSRVp9ICJ7c30iXDUuciAtbyBcNSAtYXBwZW5kIC1kIFBST0dfTkFNRT0nIidcNSciJyAtZCBWRVJTSU9OX1NUUklORz0nIid7dmVyc2lvbn0nIicvCi0vLW8vcy9eXChbIAldKlwpe0hPU1RfQ0N9IFwoLipcKS1vIFwoW14gXSpcKSBcKC4qXCkkL1wxe0hPU1RfQ0NfTER9IFwyIC1vIFwze1BST0dfRVhUfSBcNFwKLVwxe01BS0VQRUZ9IFwze1BST0dfRVhUfSAtbyBcMyB7TUFLRVBFRl9UT09MX0ZMQUdTfSB7TUFLRVBFRl9GTEFHU31cCi1cMXtSRVp9ICJ7c30iXDMuciAtbyBcMyAtYXBwZW5kIC1kIFBST0dfTkFNRT0nIidcMyciJyAtZCBWRVJTSU9OX1NUUklORz0nIid7dmVyc2lvbn0nIicvCi0KLSMgQ29tbWVudCBvdXQgLk5PRVhQT1JUIHJ1bGVzLgotL1wuTk9FWFBPUlQvcy9eXC5OT0VYUE9SVC8jXC5OT0VYUE9SVC8KLSMgQ29tbWVudCBvdXQgLlBIT05ZIHJ1bGVzLgotL1wuUEhPTlkvcy9eXC5QSE9OWS8jXC5QSE9OWS8KLSMgQ29tbWVudCBvdXQgLlBSRUNJT1VTIHJ1bGVzLgotL1wuUFJFQ0lPVVMvcy9eXC5QUkVDSU9VUy8jXC5QUkVDSU9VUy8KLSMgQ29tbWVudCBvdXQgLlNVRkZJWEVTIHJ1bGVzLgotL1wuU1VGRklYRVMvcy9eXC5TVUZGSVhFUy8jXC5TVUZGSVhFUy8KLQotIyBTZXQgdGhlIGluc3RhbGwgcHJvZ3JhbSBhcHByb3ByaWF0ZWx5LgotL0lOU1RBTEwvcy9eSU5TVEFMTCAqPSAqYC4qYDppbnN0YWxsLnNoIC1jL0lOU1RBTEwgPSBEdXBsaWNhdGUgLXkvCi0KLSMgRG9uJ3QgdHJ5IHRvIGRlY2lkZSB3aGV0aGVyIHRvIHVzZSB0aGUgdHJlZSdzIG93biB0b29scy4KLS9iaXNvbi9zL2AuKmJpc29uOmJpc29uLipgL2Jpc29uIC15LwotL2J5YWNjL3MvYC4qYnlhY2M6YnlhY2MuKmAvYnlhY2MvCi0vZmxleC9zL2AuKmZsZXg6ZmxleC4qYC9mbGV4LwotCi0jIFR1cm4gdHJhbnNmb3JtZWQgQyBjb21tZW50cyBpbiBlY2hvIGNvbW1hbmRzIGJhY2sgaW50byBjb21tZW50cy4KLS9lY2hvL3MsZWNobyAnXCguKlwpOlxcT3B0aW9uLXhcKC4qXClcXE9wdGlvbi14OlwoLipcKScsZWNobyAnXDEvKlwyKi9cMycsCi0KLSMgV2hhY2sgb3V0IHZhcmlvdXMgY2xldmVyIGV4cHJlc3Npb25zIHRoYXQgc2VhcmNoIGZvciB0b29scywgc2luY2UKLSMgdGhlIGNsZXZlciBjb2RlIGlzIHRvbyAvYmluL3NoIHNwZWNpZmljLgotCi0vXkFSX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKLUFSX0ZPUl9UQVJHRVQgPSA6OmJpbnV0aWxzOmFyXAotCi0KLS9eUkFOTElCX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKLVJBTkxJQl9GT1JfVEFSR0VUID0gOjpiaW51dGlsczpyYW5saWJcCi0KLQotL15SQU5MSUJfVEVTVF9GT1JfVEFSR0VUID0gLywvcmFubGliIF0gKSQvY1wKLVJBTkxJQl9URVNUX0ZPUl9UQVJHRVQgPSBcCi0KLQotL15FWFBFQ1QgPSBgLywvYCQvY1wKLUVYUEVDVCA9IFwKLQotCi0vXlJVTlRFU1QgPSBgLywvYCQvY1wKLVJVTlRFU1QgPSBcCi0KLQotL15DQ19GT1JfVEFSR0VUID0gYC8sL2AkL2NcCi1DQ19GT1JfVEFSR0VUID0gXAotCi0KLS9eQ1hYX0ZPUl9UQVJHRVQgPSBgLywvYCQvY1wKLUNYWF9GT1JfVEFSR0VUID0gXAotCi0KLS9eQ0hJTExfRk9SX1RBUkdFVCA9IGAvLC9gJC9jXAotQ0hJTExfRk9SX1RBUkdFVCA9IFwKLQotCi0vXkNISUxMX0xJQiA9IGAvLC9gJC9jXAotQ0hJTExfTElCID0gXAotCi0vc2FuaXQvcy97c3RhcnQtc2FuaXQuLi4tW2EtejAtOV0qfS8vCi0vc2FuaXQvcy97ZW5kLXNhbml0Li4uLVthLXowLTldKn0vLwotCi0jIEFkZCBzdGFuZGFyZCBkZWZpbmVzIGFuZCBkZWZhdWx0IHJ1bGVzLgotL14jIHNyY2Rpci9hXAotXAotcyA9ICJ7c3JjZGlyfSJcCi1cCi1vID0gOlwKLVwKLSJ7b30iIFxcT3B0aW9uLWYgOiAie3N9IgotCmRpZmYgLS1naXQgYS9jb25maWcvbXB3L21wdy10b3VjaCBiL2NvbmZpZy9tcHcvbXB3LXRvdWNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYTUxLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvbXB3LXRvdWNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jICJUb3VjaCIgY29tbWFuZC4KLQotSWYgImBFeGlzdHMgInsxfSJgIiAhPSAiIgotCVNldEZpbGUgLW0gLiAiezF9IgotRWxzZQotCUVjaG8gJyAnID4gInsxfSIKLUVuZCBJZgpkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9tcHctdHJ1ZSBiL2NvbmZpZy9tcHcvbXB3LXRydWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDY1MzAuLjAwMDAwMDAKLS0tIGEvY29uZmlnL21wdy9tcHctdHJ1ZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUV4aXQgMApkaWZmIC0tZ2l0IGEvY29uZmlnL21wdy9udWxsLWNvbW1hbmQgYi9jb25maWcvbXB3L251bGwtY29tbWFuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0NGM4ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L251bGwtY29tbWFuZAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgVGhpcyBjb21tYW5kIGRvZXMgbm90aGluZy4KZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvb3Blbi1icmFjZSBiL2NvbmZpZy9tcHcvb3Blbi1icmFjZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0NjVkYy4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L29wZW4tYnJhY2UKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgTVBXIG1ha2VmaWxlcyBzZWVtIG5vdCB0byBoYXZlIGFueSB3YXkgdG8gZ2V0IGEgbGl0ZXJhbCBvcGVuCi0jIGJyYWNlIGludG8gYSBydWxlIGFueXdoZXJlLCBzbyB0aGlzIGRvZXMgdGhlIGpvYi4KLQotRWNobyAneycKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvdHItN3RvOC1zcmMgYi9jb25maWcvbXB3L3RyLTd0bzgtc3JjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjBiNjQ5Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tcHcvdHItN3RvOC1zcmMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVN0cmVhbUVkaXQgLWUgXE9wdGlvbi1kCi0gICcvXE9wdGlvbi14LyBcT3B0aW9uLWQKLSAgICBSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLWQvICJcT3B0aW9uLWRcT3B0aW9uLWQiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotICAgIFJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24tZi8gIlxPcHRpb24tZFxPcHRpb24tZiIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0JUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi04LyAiXE9wdGlvbi1kXE9wdGlvbi04IiAtYyBcT3B0aW9uLTUgOyBcT3B0aW9uLWQKLQlSZXBsYWNlIC9cT3B0aW9uLWRcU3JjT3B0aW9uLTUvICJcT3B0aW9uLWRcT3B0aW9uLTUiIC1jIFxPcHRpb24tNSA7IFxPcHRpb24tZAotCVJlcGxhY2UgL1xPcHRpb24tZFxTcmNPcHRpb24teC8gIlxPcHRpb24tZFxPcHRpb24teCIgLWMgXE9wdGlvbi01IDsgXE9wdGlvbi1kCi0JUmVwbGFjZSAvXE9wdGlvbi1kXFNyY09wdGlvbi1yLyAiXE9wdGlvbi1kXE9wdGlvbi1yIiAtYyBcT3B0aW9uLTUnICBcT3B0aW9uLWQKLSAgInsxfSIKZGlmZiAtLWdpdCBhL2NvbmZpZy9tcHcvdHJ1ZSBiL2NvbmZpZy9tcHcvdHJ1ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwNjUzMC4uMDAwMDAwMAotLS0gYS9jb25maWcvbXB3L3RydWUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FeGl0IDAKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1hcm1waWMgYi9jb25maWcvbXQtYXJtcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWI4YzllLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1hcm1waWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1kMzB2IGIvY29uZmlnL210LWQzMHYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNGI3NzQuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LWQzMHYKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgQnVpbGQgbGlicmFyaWVzIG9wdGltaXppbmcgZm9yIHNwYWNlLCBub3Qgc3BlZWQuCi0jIFR1cm4gb2ZmIHdhcm5pbmdzIGFib3V0IHN5bWJvbHMgbmFtZWQgdGhlIHNhbWUgYXMgcmVnaXN0ZXJzCi0gQ0ZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MgLVdhLC1DCi0gQ1hYRkxBR1NfRk9SX1RBUkdFVCA9IC1nIC1PcyAtV2EsLUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1lbGZhbHBoYXBpYyBiL2NvbmZpZy9tdC1lbGZhbHBoYXBpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtZWxmYWxwaGFwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZQSUMKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1saW51eCBiL2NvbmZpZy9tdC1saW51eApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA5ZTZmMS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtbGludXgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMgV2hlbiB1c2luZyBnbGliYyAyIG9uIExpbnV4IHdlIG11c3QgYWx3YXlzIHVzZSB2dGFibGUgdGh1bmtzLgotQ1hYRkxBR1NfRk9SX1RBUkdFVCA9ICQoQ1hYRkxBR1MpIC1mdnRhYmxlLXRodW5rcyAtRF9HTlVfU09VUkNFCmRpZmYgLS1naXQgYS9jb25maWcvbXQtbTY4a3BpYyBiL2NvbmZpZy9tdC1tNjhrcGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjk4NzI3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1tNjhrcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mcGljCmRpZmYgLS1naXQgYS9jb25maWcvbXQtbmV0d2FyZSBiL2NvbmZpZy9tdC1uZXR3YXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDgyZjliLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1uZXR3YXJlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotR0RCX05MTV9ERVBTID0gYWxsLWdjYyBhbGwtbGQKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC1vc3BhY2UgYi9jb25maWcvbXQtb3NwYWNlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA5MTA0Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC1vc3BhY2UKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgQnVpbGQgbGlicmFyaWVzIG9wdGltaXppbmcgZm9yIHNwYWNlLCBub3Qgc3BlZWQuCi0gQ0ZMQUdTX0ZPUl9UQVJHRVQgPSAtZyAtT3MKLSBDWFhGTEFHU19GT1JfVEFSR0VUID0gLWcgLU9zCmRpZmYgLS1naXQgYS9jb25maWcvbXQtcGFwaWMgYi9jb25maWcvbXQtcGFwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YjhjOWUuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXBhcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtcHBjcGljIGIvY29uZmlnL210LXBwY3BpYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViOGM5ZS4uMDAwMDAwMAotLS0gYS9jb25maWcvbXQtcHBjcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPS1mUElDCmRpZmYgLS1naXQgYS9jb25maWcvbXQtc3BhcmNwaWMgYi9jb25maWcvbXQtc3BhcmNwaWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGVjMjcuLjAwMDAwMDAKLS0tIGEvY29uZmlnL210LXNwYXJjcGljCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotUElDRkxBR19GT1JfVEFSR0VUPWBjYXNlICIke0xJQkNGTEFHU30gJHtMSUJDWFhGTEFHU30iIGluICotZnBpYyogKSBlY2hvIC1mcGljIDs7ICogKSBlY2hvIC1mUElDIDs7IGVzYWNgCmRpZmYgLS1naXQgYS9jb25maWcvbXQtdjgxMCBiL2NvbmZpZy9tdC12ODEwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2RhNmMyLi4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC12ODEwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1DQ19GT1JfVEFSR0VUID0gY2E3MzIgLWFuc2kKLUFTX0ZPUl9UQVJHRVQgPSBhczczMgotQVJfRk9SX1RBUkdFVCA9IGFyNzMyCi1SQU5MSUJfRk9SX1RBUkdFVCA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbmZpZy9tdC14ODZwaWMgYi9jb25maWcvbXQteDg2cGljCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjk4NzI3Li4wMDAwMDAwCi0tLSBhL2NvbmZpZy9tdC14ODZwaWMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1QSUNGTEFHX0ZPUl9UQVJHRVQ9LWZwaWMKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2FkNjBiNy4uMDAwMDAwMAotLS0gYS9jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk1ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIyMgV0FSTklORzogdGhpcyBmaWxlIGNvbnRhaW5zIGVtYmVkZGVkIHRhYnMuICBEbyBub3QgcnVuIHVudGFiaWZ5IG9uIHRoaXMgZmlsZS4KLQotIyBDb25maWd1cmF0aW9uIHNjcmlwdAotIyBDb3B5cmlnaHQgKEMpIDE5ODgsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0jIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotIyBUaGlzIGZpbGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBLLiBSaWNoYXJkIFBpeGxleS4KLQotIwotIyBTaGVsbCBzY3JpcHQgdG8gY3JlYXRlIHByb3BlciBsaW5rcyB0byBtYWNoaW5lLWRlcGVuZGVudCBmaWxlcyBpbgotIyBwcmVwYXJhdGlvbiBmb3IgY29tcGlsYXRpb24uCi0jCi0jIElmIGNvbmZpZ3VyZSBzdWNjZWVkcywgaXQgbGVhdmVzIGl0cyBzdGF0dXMgaW4gY29uZmlnLnN0YXR1cy4KLSMgSWYgY29uZmlndXJlIGZhaWxzIGFmdGVyIGRpc3R1cmJpbmcgdGhlIHN0YXR1cyBxdW8sIAotIyAgICAgICBjb25maWcuc3RhdHVzIGlzIHJlbW92ZWQuCi0jCi0KLWV4cG9ydCBQQVRIIHx8IChlY2hvICJPT1BTLCB0aGlzIGlzbid0IHNoLiAgRGVzcGVyYXRpb24gdGltZS4gIEkgd2lsbCBmZWVkIG15c2VsZiB0byBzaC4iOyBzaCAkMCAkYXJndjsga2lsbCAkJCkKLQotcmVtb3ZlPXJtCi1oYXJkX2xpbms9bG4KLXN5bWJvbGljX2xpbms9J2xuIC1zJwotCi0jZm9yIFRlc3QKLSNyZW1vdmU9ImVjaG8gcm0iCi0jaGFyZF9saW5rPSJlY2hvIGxuIgotI3N5bWJvbGljX2xpbms9ImVjaG8gbG4gLXMiCi0KLSMgY2xlYXIgc29tZSB0aGluZ3MgcG90ZW50aWFsbHkgaW5oZXJpdGVkIGZyb20gZW52aXJvbm1lbnQuCi0KLU1ha2VmaWxlPU1ha2VmaWxlCi1NYWtlZmlsZV9pbj1NYWtlZmlsZS5pbgotYXJndW1lbnRzPQotYnVpbGRfYWxpYXM9Ci1jYWNoZV9maWxlPWNvbmZpZy5jYWNoZQotY2FjaGVfZmlsZV9vcHRpb249Ci1jb25maWdkaXJzPQotZXh0cmFjb25maWdkaXJzPQotZGlyb3B0aW9ucz0KLWV4ZWNfcHJlZml4PQotZXhlY19wcmVmaXhvcHRpb249Ci1mYXRhbD0KLWZsb2F0aW5nX3BvaW50PWRlZmF1bHQKLWdhcz1kZWZhdWx0Ci1nY2NfdmVyc2lvbj0KLWdjY192ZXJzaW9uX3RyaWdnZXI9Ci1ob3N0X2FsaWFzPU5PSE9TVAotaG9zdF9tYWtlZmlsZV9mcmFnPQotbW92ZWlmY2hhbmdlPQotbm9yZWN1cnNpb249Ci1vdGhlcl9vcHRpb25zPQotcGFja2FnZV9tYWtlZmlsZV9mcmFnPQotcGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnPQotcHJlZml4PS91c3IvbG9jYWwKLXByb2duYW1lPQotcHJvZ3JhbV9wcmVmaXg9Ci1wcm9ncmFtX3ByZWZpeG9wdGlvbj0KLXByb2dyYW1fc3VmZml4PQotcHJvZ3JhbV9zdWZmaXhvcHRpb249Ci1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbj0KLXJlZGlyZWN0PQotcmVtb3Zpbmc9Ci1zaXRlPQotc2l0ZV9tYWtlZmlsZV9mcmFnPQotc2l0ZV9vcHRpb249Ci1zcmNkaXI9Ci1zcmN0cmlnZ2VyPQotc3ViZGlycz0KLXRhcmdldF9hbGlhcz1OT1RBUkdFVAotdGFyZ2V0X21ha2VmaWxlX2ZyYWc9Ci11bmRlZnM9Tk9VTkRFRlMKLXZlcnNpb249IiRSZXZpc2lvbiQiCi14MTE9ZGVmYXVsdAotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMjIyB3ZSBtaWdodCBuZWVkIHRvIHVzZSBzb21lIG90aGVyIHNoZWxsIHRoYW4gL2Jpbi9zaCBmb3IgcnVubmluZyBzdWJzaGVsbHMKLQotIyMjIElmIHdlIGFyZSBvbiBXaW5kb3dzLCBzZWFyY2ggZm9yIHRoZSBzaGVsbC4gIFRoaXMgd2lsbCBwZXJtaXQgcGVvcGxlCi0jIyMgdG8gbm90IGhhdmUgL2Jpbi9zaCwgYnV0IHRvIGJlIGFibGUgdG8gc2VlIC9TT01FL1BBVEgvc2ggY29uZmlndXJlCi0jIyMgd2l0aG91dCBhbHNvIGhhdmluZyB0byBzZXQgQ09ORklHX1NIRUxMLiAgVGhpcyBjb2RlIHdpbGwgd29yayB3aGVuCi0jIyMgdXNpbmcgYmFzaCwgd2hpY2ggc2V0cyBPU1RZUEUuCi1jYXNlICIke09TVFlQRX0iIGluCi0qd2luMzIqKQotICBpZiBbIHgke0NPTkZJR19TSEVMTH0gPSB4IF07IHRoZW4KLSAgICBpZiBbICEgLWYgL2Jpbi9zaCBdOyB0aGVuCi0gICAgICBpZiBbIHgke1NIRUxMfSAhPSB4IF0gJiYgWyAtZiAke1NIRUxMfSBdOyB0aGVuCi0JQ09ORklHX1NIRUxMPSR7U0hFTEx9Ci0JZXhwb3J0IENPTkZJR19TSEVMTAotICAgICAgZWxzZQotCWZvciBwcm9nIGluIHNoIHNoLmV4ZSBiYXNoIGJhc2guZXhlOyBkbwotCSAgSUZTPSIke0lGUz0JfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotCSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLQkgICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLQkgICAgaWYgdGVzdCAtZiAkZGlyLyRwcm9nOyB0aGVuCi0JICAgICAgQ09ORklHX1NIRUxMPSRkaXIvJHByb2cKLQkgICAgICBleHBvcnQgQ09ORklHX1NIRUxMCi0JICAgICAgYnJlYWsKLQkgICAgZmkKLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCSAgdGVzdCAtbiAiJHtDT05GSUdfU0hFTEx9IiAmJiBicmVhawotCWRvbmUKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLSAgOzsKLWVzYWMKLQotY29uZmlnX3NoZWxsPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0KLU5PX0VESVQ9IlRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgRG8gbm90IGVkaXQuIgotCi0jIyB0aGlzIGlzIGEgbGl0dGxlIHRvdWNoeSBhbmQgd29uJ3QgYWx3YXlzIHdvcmssIGJ1dC4uLgotIyMKLSMjIGlmIHRoZSBhcmd2WzBdIHN0YXJ0cyB3aXRoIGEgc2xhc2ggdGhlbiBpdCBpcyBhbiBhYnNvbHV0ZSBuYW1lIHRoYXQgY2FuIChhbmQKLSMjIG11c3QpIGJlIHVzZWQgYXMgaXMuCi0jIwotIyMgb3RoZXJ3aXNlLCBpZiBhcmd2WzBdIGhhcyBubyBzbGFzaCBpbiBpdCwgd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGlzIG9uIHRoZQotIyMgcGF0aC4gIFNpbmNlIFBBVEggbWlnaHQgaW5jbHVkZSAiLiIgd2UgYWxzbyBhZGQgYHB3ZGAgdG8gdGhlIGVuZCBvZiBQQVRILgotIyMKLQotcHJvZ25hbWU9JDAKLSMgaWYgUFdEIGFscmVhZHkgaGFzIGEgdmFsdWUsIGl0IGlzIHByb2JhYmx5IHdyb25nLgotaWYgWyAtbiAiJFBXRCIgXTsgdGhlbiBQV0Q9YHB3ZGA7IGZpCi0KLWNhc2UgIiR7cHJvZ25hbWV9IiBpbgotLyopIDs7Ci0qLyopIDs7Ci0qKQotICAgICAgICBQQVRIPSRQQVRIOiR7UFdEPWBwd2RgfSA7IGV4cG9ydCBQQVRICi0gICAgICAgIDs7Ci1lc2FjCi0KLSMgTG9vcCBvdmVyIGFsbCBhcmdzCi0KLXdoaWxlIDoKLWRvCi0KLSMgQnJlYWsgb3V0IGlmIHRoZXJlIGFyZSBubyBtb3JlIGFyZ3MKLQljYXNlICQjIGluCi0JMCkKLQkJYnJlYWsKLQkJOzsKLQllc2FjCi0KLSMgR2V0IHRoZSBmaXJzdCBhcmcsIGFuZCBzaHVmZmxlCi0Jb3B0aW9uPSQxCi0Jc2hpZnQKLQotIyBNYWtlIGFsbCBvcHRpb25zIGhhdmUgdHdvIGh5cGhlbnMKLQlvcmlnX29wdGlvbj0kb3B0aW9uCSMgU2F2ZSBvcmlnaW5hbCBmb3IgZXJyb3IgbWVzc2FnZXMKLQljYXNlICRvcHRpb24gaW4KLQktLSopIDs7Ci0JLSopIG9wdGlvbj0tJG9wdGlvbiA7OwotCWVzYWMKLQkJCi0jIFNwbGl0IG91dCB0aGUgYXJndW1lbnQgZm9yIG9wdGlvbnMgdGhhdCB0YWtlIHRoZW0KLQljYXNlICRvcHRpb24gaW4KLQktLSo9KikKLQkJb3B0YXJnPWBlY2hvICRvcHRpb24gfCBzZWQgLWUgJ3MvXltePV0qPS8vJ2AKLQkJYXJndW1lbnRzPSIkYXJndW1lbnRzICRvcHRpb24iCi0JCTs7Ci0jIFRoZXNlIG9wdGlvbnMgaGF2ZSBtYW5kYXRvcnkgdmFsdWVzLiAgU2luY2Ugd2UgZGlkbid0IGZpbmQgYW4gPSBzaWduLAotIyB0aGUgdmFsdWUgbXVzdCBiZSBpbiB0aGUgbmV4dCBhcmd1bWVudAotCS0tYnUqIHwgLS1jYWNoZSogfCAtLWV4KiB8IC0taG8qIHwgLS1wcmUqIHwgLS1wcm9ncmFtLXAqIHwgLS1wcm9ncmFtLXMqIHwgLS1wcm9ncmFtLXQqIHwgLS1zaSogfCAtLXNyKiB8IC0tdGEqIHwgLS10bSogfCAtLXgtKiB8IC0tYmkqIHwgLS1zYiogfCAtLWxpKiB8IC0tZGEqIHwgLS1zeSogfCAtLXNoKiB8IC0tbG8qIHwgLS1pbiogfCAtLW9sKiB8IC0tbWEqKQotCQlvcHRhcmc9JDEKLQkJc2hpZnQKLQkJYXJndW1lbnRzPSIkYXJndW1lbnRzICRvcHRpb249JG9wdGFyZyIKLQkJOzsKLQktLXYpCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAtdiIKLQkJOzsKLQktLSopCi0JCWFyZ3VtZW50cz0iJGFyZ3VtZW50cyAkb3B0aW9uIgotCQk7OwotCWVzYWMKLQotIyBOb3csIHByb2Nlc3MgdGhlIG9wdGlvbnMKLQljYXNlICRvcHRpb24gaW4KLQotCS0tYmkqKQotCQliaW5kaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWJpbmRpcj0kb3B0YXJnIgotCQk7OwotCS0tYnVpbGQqIHwgLS1idSopCi0JCWNhc2UgIiRidWlsZF9hbGlhcyIgaW4KLQkJIiIpIGJ1aWxkX2FsaWFzPSRvcHRhcmcgOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBidWlsZCBtYWNoaW5lIGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLWNhY2hlKikKLQkJY2FjaGVfZmlsZT0kb3B0YXJnCi0JCTs7Ci0JLS1kYSopCi0JCWRhdGFkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWRhdGFkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWRpc2FibGUtKikKLQkJZW5hYmxlb3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS1kaXNhYmxlLTplbmFibGVfOjtzOi06XzpnJ2AKLQkJZXZhbCAkZW5hYmxlb3B0PW5vCi0JCWRpc2FibGVvcHRpb25zPSIkZGlzYWJsZW9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLWVuYWJsZS0qKQotCQljYXNlICIkb3B0aW9uIiBpbgotCQkqPSopCTs7Ci0JCSopCW9wdGFyZz15ZXMgOzsKLQkJZXNhYwotCi0JCWVuYWJsZW9wdD1gZWNobyAke29wdGlvbn0gfCBzZWQgJ3M6Xi0tOjo7czo9LiokOjo7czotOl86ZydgCi0JCWV2YWwgIiRlbmFibGVvcHQ9JyRvcHRhcmcnIgotCQllbmFibGVvcHRpb25zPSIkZW5hYmxlb3B0aW9ucyAnJG9wdGlvbiciCi0JCTs7Ci0JLS1leGVjLXByZWZpeCogfCAtLWV4KikKLQkJZXhlY19wcmVmaXg9JG9wdGFyZwotCQlleGVjX3ByZWZpeG9wdGlvbj0iLS1leGVjLXByZWZpeD0kb3B0YXJnIgotCQk7OwotCS0tZ2FzIHwgLS1nKikKLQkJZ2FzPXllcwotCQk7OwotCS0taGVscCB8IC0taGUqKQotCQlmYXRhbD15ZXMKLQkJOzsKLQktLWhvc3QqIHwgLS1obyopCi0JCWNhc2UgJGhvc3RfYWxpYXMgaW4KLQkJTk9IT1NUKSBob3N0X2FsaWFzPSRvcHRhcmcgOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGF0IGEgdGltZS4gIDE+JjIKLQkJICAgZmF0YWw9eWVzCi0JCSAgIDs7Ci0JCWVzYWMKLQkJOzsKLQktLWluYyopCi0JCWluY2x1ZGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWluY2x1ZGVkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWluZiopCi0JCWluZm9kaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWluZm9kaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxpYmQqKQotCQlsaWJkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxpYmRpcj0kb3B0YXJnIgotCQk7OwotCS0tbGliZSopCi0JCWxpYmV4ZWNkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLWxpYmV4ZWNkaXI9JG9wdGFyZyIKLQkJOzsKLQktLWxvKikKLQkJbG9jYWxzdGF0ZWRpcj0kb3B0YXJnCi0JCWRpcm9wdGlvbnM9IiRkaXJvcHRpb25zIC0tbG9jYWxzdGF0ZWRpcj0kb3B0YXJnIgotCQk7OwotCS0tbWEqKQotCQltYW5kaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLW1hbmRpcj0kb3B0YXJnIgotCQk7OwotCS0tbmZwIHwgLS1uZiopCi0JCWZsb2F0aW5nX3BvaW50PW5vCi0JCWZsb2F0aW5nX3BvaW50b3B0aW9uPSItLW5mcCIKLQkJOzsKLQktLW5vcmVjdXJzaW9uIHwgLS1ubyopCi0JCW5vcmVjdXJzaW9uPXllcwotCQk7OwotCS0tb2wqKQotCQlvbGRpbmNsdWRlZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1vbGRpbmNsdWRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1wcmVmaXgqIHwgLS1wcmUqKQotCQlwcmVmaXg9JG9wdGFyZwotCQlwcmVmaXhvcHRpb249Ii0tcHJlZml4PSRvcHRhcmciCi0JCTs7Ci0JLS1wcm9ncmFtLXByZWZpeCogfCAtLXByb2dyYW0tcCopCi0JCXByb2dyYW1fcHJlZml4PSRvcHRhcmcKLQkJcHJvZ3JhbV9wcmVmaXhvcHRpb249Ii0tcHJvZ3JhbS1wcmVmaXg9JG9wdGFyZyIKLQkJOzsKLQktLXByb2dyYW0tc3VmZml4KiB8IC0tcHJvZ3JhbS1zKikKLQkJcHJvZ3JhbV9zdWZmaXg9JG9wdGFyZwotCQlwcm9ncmFtX3N1ZmZpeG9wdGlvbj0iLS1wcm9ncmFtLXN1ZmZpeD0kb3B0YXJnIgotCQk7OwotCS0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSogfCAtLXByb2dyYW0tdCopCi0JCSMgRG91YmxlIGFueSBiYWNrc2xhc2hlcyBvciBkb2xsYXIgc2lnbnMgaW4gdGhlIGFyZ3VtZW50Ci0JCXByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZX0gLWUgYGVjaG8gJHtvcHRhcmd9IHwgc2VkIC1lICdzL1xcXFwvXFxcXFxcXFwvZycgLWUgJ3MvXFxcJC8kJC9nJ2AiCi0JCXByb2dyYW1fdHJhbnNmb3JtX25hbWVvcHRpb249IiR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSckb3B0YXJnJyIKLQkJOzsKLQktLXJtKQotCQlyZW1vdmluZz0tLXJtCi0JCTs7Ci0JLS1zYiopCi0JCXNiaW5kaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLXNiaW5kaXI9JG9wdGFyZyIKLQkJOzsKLQktLXNoKikKLQkJc2hhcmVkc3RhdGVkaXI9JG9wdGFyZwotCQlkaXJvcHRpb25zPSIkZGlyb3B0aW9ucyAtLXNoYXJlZHN0YXRlZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS1zaWxlbnQgfCAtLXNpbCogfCAtLXF1aWV0IHwgLS1xKikKLQkJcmVkaXJlY3Q9Ij4vZGV2L251bGwiCi0JCXZlcmJvc2U9LS1zaWxlbnQKLQkJOzsKLQktLXNpdGUqIHwgLS1zaXQqKQotCQlzaXRlPSRvcHRhcmcKLQkJc2l0ZV9vcHRpb249Ii0tc2l0ZT0kb3B0YXJnIgotCQk7OwotCS0tc3JjZGlyKi8gfCAtLXNyKi8pCi0gICAgICAgICAgICAgICAgIyBSZW1vdmUgdHJhaWxpbmcgc2xhc2hlcy4gIE90aGVyd2lzZSwgd2hlbiB0aGUgZmlsZSBuYW1lIGdldHMKLSAgICAgICAgICAgICAgICAjIGJvbHRlZCBpbnRvIGFuIG9iamVjdCBmaWxlIGFzIGRlYnVnIGluZm8sIGl0IGhhcyB0d28gc2xhc2hlcwotICAgICAgICAgICAgICAgICMgaW4gaXQuICBPcmRpbmFyaWx5IHRoaXMgaXMgb2ssIGJ1dCBlbWFjcyB0YWtlcyBkb3VibGUgc2xhc2gKLSAgICAgICAgICAgICAgICAjIHRvIG1lYW4gImZvcmdldCB0aGUgZmlyc3QgcGFydCIuCi0JCXNyY2Rpcj1gZWNobyAkb3B0YXJnIHwgc2VkIC1lICdzOi8kOjonYAotCQk7OwotCS0tc3JjZGlyKiB8IC0tc3IqKQotCQlzcmNkaXI9JG9wdGFyZwotCQk7OwotCS0tc3kqKQotCQlzeXNjb25mZGlyPSRvcHRhcmcKLQkJZGlyb3B0aW9ucz0iJGRpcm9wdGlvbnMgLS1zeXNjb25mZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS10YXJnZXQqIHwgLS10YSopCi0JCWNhc2UgJHRhcmdldF9hbGlhcyBpbgotCQlOT1RBUkdFVCkgdGFyZ2V0X2FsaWFzPSRvcHRhcmcgOzsKLQkJKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSB0YXJnZXQgYXQgYSB0aW1lLiAgMT4mMgotCQkgICBmYXRhbD15ZXMKLQkJICAgOzsKLQkJZXNhYwotCQk7OwotCS0tdG1wZGlyKiB8IC0tdG0qKQotCQlUTVBESVI9JG9wdGFyZwotCQl0bXBkaXJvcHRpb249Ii0tdG1wZGlyPSRvcHRhcmciCi0JCTs7Ci0JLS12ZXJib3NlIHwgLS12IHwgLS12ZXJiKikKLQkJcmVkaXJlY3Q9Ci0JCXZlcmJvc2U9LS12ZXJib3NlCi0JCTs7Ci0JLS12ZXJzaW9uIHwgLS1WIHwgLS12ZXJzKikKLQkJZWNobyAiVGhpcyBpcyBDeWdudXMgQ29uZmlndXJlIHZlcnNpb24iIGBlY2hvICR7dmVyc2lvbn0gfCBzZWQgJ3MvWyAkOl0vL2cnYAotCQlleGl0IDAKLQkJOzsKLQktLXdpdGgtKikKLQkJY2FzZSAiJG9wdGlvbiIgaW4KLQkJKj0qKQk7OwotCQkqKQlvcHRhcmc9eWVzIDs7Ci0JCWVzYWMKLQotCQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOj0uKiQ6OjtzOi06XzpnJ2AKLQkJZXZhbCAkd2l0aG9wdD0iJG9wdGFyZyIKLQkJd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAkb3B0aW9uIgotCQk7OwotCS0td2l0aG91dC0qKQotCQl3aXRob3B0PWBlY2hvICR7b3B0aW9ufSB8IHNlZCAnczpeLS06OjtzOm91dDo6O3M6LTpfOmcnYAotCQlldmFsICR3aXRob3B0PW5vCi0JCXdpdGhvdXRvcHRpb25zPSIkd2l0aG91dG9wdGlvbnMgJG9wdGlvbiIKLQkJOzsKLQktLXgpCXdpdGhfeD15ZXMKLQkJd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAtLXdpdGgteCIKLQkJOzsKLQktLXgtaSogfCAtLXgtbCopIG90aGVyX29wdGlvbnM9IiRvdGhlcl9vcHRpb25zICRvcmlnX29wdGlvbiIKLQkJOzsKLQktLSopCi0JCWVjaG8gImNvbmZpZ3VyZTogVW5yZWNvZ25pemVkIG9wdGlvbjogXCIkb3JpZ19vcHRpb25cIjsgdXNlIC0taGVscCBmb3IgdXNhZ2UuIiA+JjIKLQkJZXhpdCAxCi0JCTs7Ci0JKikKLQkJY2FzZSAkdW5kZWZzIGluCi0JCU5PVU5ERUZTKSB1bmRlZnM9JG9wdGlvbiA7OwotCQkqKSBlY2hvICcqKionIENhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lLiAgMT4mMgotCQkgICBmYXRhbD15ZXMKLQkJICAgOzsKLQkJZXNhYwotCQk7OwotCWVzYWMKLWRvbmUKLQotIyBwcm9jZXNzIGhvc3QgYW5kIHRhcmdldAotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgVU5ERUZTCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmVuJ3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCB1bmRlZnMgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byB1bmRlZnMuCi0jIDMuIElmIHVuZGVmcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBkZWZhdWx0cyB0byB1bmRlZnMuCi0jIDUuIElmIHVuZGVmcyBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBkZWZhdWx0cyB0byBob3N0LgotCi1jYXNlICIke2ZhdGFsfSIgaW4KLSIiKQotCSMgTWFrZSBzdXJlIHRoYXQgaG9zdCwgdGFyZ2V0ICYgdW5kZWZzIGFyZW4ndCBhbGwgc3BlY2lmaWVkIGF0IHRoZQotCSMgc2FtZSB0aW1lLgotCWNhc2UgJGhvc3RfYWxpYXMtLS0kdGFyZ2V0X2FsaWFzLS0tJHVuZGVmcyBpbgotCU5PSE9TVC0tLSotLS0qIHwgKi0tLU5PVEFSR0VULS0tKiB8ICotLS0qLS0tTk9VTkRFRlMpCi0JCTs7Ci0JKikgZWNobyAnKioqJyBDYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZS4gIDE+JjIKLQkgICBmYXRhbD15ZXMKLQkgICBicmVhayAyCi0JCTs7Ci0JZXNhYwotCi0JIyBOb3csIGRvIGRlZmF1bHRpbmcgZm9yIGhvc3QuCi0JY2FzZSAkaG9zdF9hbGlhcyBpbgotCU5PSE9TVCkKLQkJY2FzZSAkdW5kZWZzIGluCi0JCU5PVU5ERUZTKQotCQkJIyBOZWl0aGVyIC0taG9zdCBvcHRpb24gbm9yIHVuZGVmcyB3ZXJlIHByZXNlbnQuCi0JCQkjIENhbGwgY29uZmlnLmd1ZXNzLgotCQkJZ3Vlc3NzeXM9YGVjaG8gJHtwcm9nbmFtZX0gfCBzZWQgJ3MvY29uZmlndXJlJC9jb25maWcuZ3Vlc3MvJ2AKLQkJCWlmIGhvc3RfYWxpYXM9YCR7Y29uZmlnX3NoZWxsfSAke2d1ZXNzc3lzfWAKLQkJCXRoZW4KLQkJCQkjIElmIHRoZSBzdHJpbmcgd2UgYXJlIGdvaW5nIHRvIHVzZSBmb3IKLQkJCQkjIHRoZSB0YXJnZXQgaXMgYSBwcmVmaXggb2YgdGhlIHN0cmluZwotCQkJCSMgd2UganVzdCBndWVzc2VkIGZvciB0aGUgaG9zdCwgdGhlbgotCQkJCSMgYXNzdW1lIHdlIGFyZSBydW5uaW5nIG5hdGl2ZSwgYW5kIGZvcmNlCi0JCQkJIyB0aGUgc2FtZSBzdHJpbmcgZm9yIGJvdGggdGFyZ2V0IGFuZCBob3N0LgotCQkJCWNhc2UgJHRhcmdldF9hbGlhcyBpbgotCQkJCU5PVEFSR0VUKSA7OwotCQkJCSopCi0JCQkJCWlmIGV4cHIgJGhvc3RfYWxpYXMgOiAkdGFyZ2V0X2FsaWFzID4vZGV2L251bGwKLQkJCQkJdGhlbgotCQkJCQkJaG9zdF9hbGlhcz0kdGFyZ2V0X2FsaWFzCi0JCQkJCWZpCi0JCQkJCTs7Ci0JCQkJZXNhYwotCQkJCWVjaG8gIkNvbmZpZ3VyaW5nIGZvciBhICR7aG9zdF9hbGlhc30gaG9zdC4iIDE+JjIKLQkJCQlhcmd1bWVudHM9Ii0taG9zdD0kaG9zdF9hbGlhcyAkYXJndW1lbnRzIgotCQkJZWxzZQotCQkJCWVjaG8gJ0NvbmZpZy5ndWVzcyBmYWlsZWQgdG8gZGV0ZXJtaW5lIHRoZSBob3N0IHR5cGUuICBZb3UgbmVlZCB0byBzcGVjaWZ5IG9uZS4nIDE+JjIKLQkJCQlmYXRhbD15ZXMKLQkJCWZpCi0JCQk7OwotCQkqKQotCQkJaG9zdF9hbGlhcz0kdW5kZWZzCi0JCQlhcmd1bWVudHM9Ii0taG9zdD0kaG9zdF9hbGlhcyAkYXJndW1lbnRzIgotCQkJdW5kZWZzPU5PVU5ERUZTCi0JCQk7OwotCQllc2FjCi0JZXNhYwotCi0JIyBEbyBkZWZhdWx0aW5nIGZvciB0YXJnZXQuICBJZiAtLXRhcmdldCBvcHRpb24gaXNuJ3QgcHJlc2VudCwgZGVmYXVsdAotCSMgdG8gdW5kZWZzLiAgSWYgdW5kZWZzIGlzbid0IHByZXNlbnQsIGRlZmF1bHQgdG8gaG9zdC4KLQljYXNlICR0YXJnZXRfYWxpYXMgaW4KLQlOT1RBUkdFVCkKLQkJY2FzZSAkdW5kZWZzIGluCi0JCU5PVU5ERUZTKQotCQkJdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzCi0JCQk7OwotCQkqKQotCQkJdGFyZ2V0X2FsaWFzPSR1bmRlZnMKLQkJCWFyZ3VtZW50cz0iLS10YXJnZXQ9JHRhcmdldF9hbGlhcyAkYXJndW1lbnRzIgotCQkJOzsKLQkJZXNhYwotCWVzYWMKLQk7OwotKikgOzsKLWVzYWMKLQotaWYgWyAtbiAiJHtmYXRhbH0iIC1vICIke2hvc3RfYWxpYXN9IiA9ICJoZWxwIiBdIDsgdGhlbgotCWV4ZWMgMT4mMgotCWVjaG8gVXNhZ2U6IGNvbmZpZ3VyZSBbT1BUSU9OU10gW0hPU1RdCi0JZWNobwotCWVjaG8gT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzXQotCWVjaG8gJyAtLXByZWZpeD1NWURJUgkJIGluc3RhbGwgaW50byBNWURJUiBbL3Vzci9sb2NhbF0nCi0JZWNobyAnIC0tZXhlYy1wcmVmaXg9TVlESVIJIGluc3RhbGwgaG9zdC1kZXBlbmRlbnQgZmlsZXMgaW50byBNWURJUiBbL3Vzci9sb2NhbF0nCi0JZWNobyAnIC0taGVscAkJCSBwcmludCB0aGlzIG1lc3NhZ2UgW25vcm1hbCBjb25maWddJwotCWVjaG8gJyAtLWJ1aWxkPUJVSUxECQkgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0nCi0JZWNobyAnIC0taG9zdD1IT1NUCQkgY29uZmlndXJlIGZvciBIT1NUIFtkZXRlcm1pbmVkIHZpYSBjb25maWcuZ3Vlc3NdJwotCWVjaG8gJyAtLW5vcmVjdXJzaW9uCQkgY29uZmlndXJlIHRoaXMgZGlyZWN0b3J5IG9ubHkgW3JlY3Vyc2VdJwotCWVjaG8gJyAtLXByb2dyYW0tcHJlZml4PUZPTwkgcHJlcGVuZCBGT08gdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMgWyIiXScKLQllY2hvICcgLS1wcm9ncmFtLXN1ZmZpeD1GT08JIGFwcGVuZCBGT08gdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMgWyIiXScKLQllY2hvICcgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVAgdHJhbnNmb3JtIGluc3RhbGxlZCBuYW1lcyBieSBzZWQgcGF0dGVybiBQIFsiIl0nCi0JZWNobyAnIC0tc2l0ZT1TSVRFCQkgY29uZmlndXJlIHdpdGggc2l0ZS1zcGVjaWZpYyBtYWtlZmlsZSBmb3IgU0lURScKLQllY2hvICcgLS1zcmNkaXI9RElSCQkgZmluZCB0aGUgc291cmNlcyBpbiBESVIgWy4gb3IgLi5dJwotCWVjaG8gJyAtLXRhcmdldD1UQVJHRVQJIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0nCi0JZWNobyAnIC0tdG1wZGlyPVRNUERJUgkgY3JlYXRlIHRlbXBvcmFyeSBmaWxlcyBpbiBUTVBESVIgWy90bXBdJwotCWVjaG8gJyAtLW5mcAkJCSBjb25maWd1cmUgZm9yIHNvZnR3YXJlIGZsb2F0aW5nIHBvaW50IFtoYXJkIGZsb2F0XScKLQllY2hvICcgLS13aXRoLUZPTywgLS13aXRoLUZPTz1CQVIgcGFja2FnZSBGT08gaXMgYXZhaWxhYmxlIChwYXJhbWV0ZXIgQkFSKScKLQllY2hvICcgLS13aXRob3V0LUZPTwkJIHBhY2thZ2UgRk9PIGlzIE5PVCBhdmFpbGFibGUnCi0JZWNobyAnIC0tZW5hYmxlLUZPTywgLS1lbmFibGUtRk9PPUJBUiBpbmNsdWRlIGZlYXR1cmUgRk9PIChwYXJhbWV0ZXIgQkFSKScKLQllY2hvICcgLS1kaXNhYmxlLUZPTwkJIGRvIG5vdCBpbmNsdWRlIGZlYXR1cmUgRk9PJwotCWVjaG8KLQllY2hvICdXaGVyZSBIT1NUIGFuZCBUQVJHRVQgYXJlIHNvbWV0aGluZyBsaWtlICJzcGFyYy1zdW5vcyIsICJtaXBzLXNnaS1pcml4NSIsIGV0Yy4nCi0JZWNobwotCWlmIFsgLXIgY29uZmlnLnN0YXR1cyBdIDsgdGhlbgotCQljYXQgY29uZmlnLnN0YXR1cwotCWZpCi0KLQlleGl0IDEKLWZpCi0KLWNvbmZpZ3N1Yj1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAncy9jb25maWd1cmUkL2NvbmZpZy5zdWIvJ2AKLW1vdmVpZmNoYW5nZT1gZWNobyAke3Byb2duYW1lfSB8IHNlZCAncy9jb25maWd1cmUkL21vdmUtaWYtY2hhbmdlLydgCi10b3BzcmNkaXI9YGNkIFxgZGlybmFtZSAke3Byb2duYW1lfVxgOyBwd2RgCi0KLQotIyB0aGlzIGlzIGEgaGFjay4gIHN1bjQgbXVzdCBhbHdheXMgYmUgYSB2YWxpZCBob3N0IGFsaWFzIG9yIHRoaXMgd2lsbCBmYWlsLgotaWYgJHtjb25maWdfc2hlbGx9ICR7Y29uZmlnc3VifSBzdW40ID4vZGV2L251bGwgMj4mMSA7IHRoZW4KLSAgICAgICAgdHJ1ZQotZWxzZQotICAgICAgICBlY2hvICcqKionIGNhbm5vdCBmaW5kIGNvbmZpZy5zdWIuICAxPiYyCi0gICAgICAgIGV4aXQgMQotZmkKLQotdG91Y2ggY29uZmlnLmp1bmsKLWlmICR7Y29uZmlnX3NoZWxsfSAke21vdmVpZmNoYW5nZX0gY29uZmlnLmp1bmsgY29uZmlnLnRyYXNoIDsgdGhlbgotICAgICAgICB0cnVlCi1lbHNlCi0gICAgICAgIGVjaG8gJyoqKicgY2Fubm90IGZpbmQgbW92ZS1pZi1jaGFuZ2UuICAxPiYyCi0gICAgICAgIGV4aXQgMQotZmkKLXJtIC1mIGNvbmZpZy5qdW5rIGNvbmZpZy50cmFzaAotCi1jYXNlICIke3NyY2Rpcn0iIGluCi0iIikKLSAgICAgICAgaWYgWyAtciBjb25maWd1cmUuaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBzcmNkaXI9LgotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWYgWyAtciAke3Byb2duYW1lfS5pbiBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgc3JjZGlyPWBlY2hvICR7cHJvZ25hbWV9IHwgc2VkICdzOi9jb25maWd1cmUkOjonYAotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgIkNhbid0IGZpbmQgY29uZmlndXJlLmluLiAgVHJ5IHVzaW5nIC0tc3JjZGlyPXNvbWVfZGlyIiAgMT4mMgotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSopCi0JIyBTZXQgc3JjZGlyIHRvICIuIiBpZiB0aGF0J3Mgd2hhdCBpdCBpcy4KLQkjIFRoaXMgaXMgaW1wb3J0YW50IGZvciBtdWx0aWxpYiBzdXBwb3J0LgotCWlmIFsgISAtZCAke3NyY2Rpcn0gXSA7IHRoZW4KLQkJZWNobyAiSW52YWxpZCBzb3VyY2UgZGlyZWN0b3J5ICR7c3JjZGlyfSIgPiYyCi0JCWV4aXQgMQotCWZpCi0JcHdkPWBwd2RgCi0Jc3JjcHdkPWBjZCAke3NyY2Rpcn0gOyBwd2RgCi0JaWYgWyAiJHtwd2R9IiA9ICIke3NyY3B3ZH0iIF0gOyB0aGVuCi0JCXNyY2Rpcj0uCi0JZmkKLWVzYWMKLQotIyMjIHdhcm4gYWJvdXQgc29tZSBjb25mbGljdGluZyBjb25maWd1cmF0aW9ucy4KLQotY2FzZSAiJHtzcmNkaXJ9IiBpbgotIi4iKSA7OwotKikKLSAgICAgICAgaWYgWyAtZiAke3NyY2Rpcn0vY29uZmlnLnN0YXR1cyBdIDsgdGhlbgotICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgQ2Fubm90IGNvbmZpZ3VyZSBoZXJlIGluIFwiJHtQV0Q9YHB3ZGB9XCIgd2hlbiBcIiR7c3JjZGlyfVwiIGlzIGN1cnJlbnRseSBjb25maWd1cmVkLiAxPiYyCi0gICAgICAgICAgICAgICAgZXhpdCAxCi0gICAgICAgIGZpCi1lc2FjCi0KLQotIyBkZWZhdWx0IGV4ZWNfcHJlZml4Ci1jYXNlICIke2V4ZWNfcHJlZml4b3B0aW9ufSIgaW4KLSIiKSBleGVjX3ByZWZpeD0iXCQocHJlZml4KSIgOzsKLSopIDs7Ci1lc2FjCi0KLSMgRGVmaW5lIHRoZSB0cmlnZ2VyIGZpbGUgdG8gbWFrZSBzdXJlIGNvbmZpZ3VyZSB3aWxsIHJlLXJ1biB3aGVuZXZlcgotIyB0aGUgZ2NjIHZlcnNpb24gbnVtYmVyIGNoYW5nZXMuCi1pZiBbICIke3dpdGhfZ2NjX3ZlcnNpb25fdHJpZ2dlcitzZXR9IiA9IHNldCBdOyB0aGVuCi0gICAgZ2NjX3ZlcnNpb25fdHJpZ2dlcj0iJHdpdGhfZ2NjX3ZlcnNpb25fdHJpZ2dlciIKLSAgICBnY2NfdmVyc2lvbj1gc2VkIC1lICdzLy4qXCJcKFteIFwiXSpcKVsgXCJdLiovXDEvJyA8ICR7d2l0aF9nY2NfdmVyc2lvbl90cmlnZ2VyfWAKLWVsc2UKLSAgICAjIElmIGdjYydzIHNvdXJjZXMgYXJlIGF2YWlsYWJsZSwgZGVmaW5lIHRoZSB0cmlnZ2VyIGZpbGUuCi0gICAgaWYgWyAtZiAke3RvcHNyY2Rpcn0vZ2NjL3ZlcnNpb24uYyBdIDsgdGhlbgotCWdjY192ZXJzaW9uX3RyaWdnZXI9JHt0b3BzcmNkaXJ9L2djYy92ZXJzaW9uLmMKLQlnY2NfdmVyc2lvbj1gc2VkIC1lICdzLy4qXCJcKFteIFwiXSpcKVsgXCJdLiovXDEvJyA8ICR7Z2NjX3ZlcnNpb25fdHJpZ2dlcn1gCi0JY2FzZSAiJGFyZ3VtZW50cyIgaW4KLQkgICotLXdpdGgtZ2NjLXZlcnNpb24tdHJpZ2dlcj0kZ2NjX3ZlcnNpb25fdHJpZ2dlciogKQotCSAgICA7OwotCSAgKiApCi0JICAgICMgTWFrZSBzdXJlIGNvbmZpZ3VyZS5pbiBrbm93cyBhYm91dCB0aGlzLgotCSAgICBhcmd1bWVudHM9Ii0td2l0aC1nY2MtdmVyc2lvbi10cmlnZ2VyPSRnY2NfdmVyc2lvbl90cmlnZ2VyICRhcmd1bWVudHMiCi0JICAgIDs7Ci0JZXNhYwotCXdpdGhvcHRpb25zPSItLXdpdGgtZ2NjLXZlcnNpb24tdHJpZ2dlcj0kZ2NjX3ZlcnNpb25fdHJpZ2dlciAkd2l0aG9wdGlvbnMiCi0gICAgZmkKLWZpCi0KLSMjIyBicmVhayB1cCAke3NyY2Rpcn0vY29uZmlndXJlLmluLgotY2FzZSAiYGdyZXAgJ14jIHBlclwtaG9zdDonICR7c3JjZGlyfS9jb25maWd1cmUuaW5gIiBpbgotIiIpCi0gICAgICAgIGVjaG8gJyoqKicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBoYXMgbm8gXCJwZXItaG9zdDpcIiBsaW5lLiAxPiYyCi0JIyBDaGVjayBmb3IgYSBkaXJlY3RvcnkgdGhhdCdzIGJlZW4gY29udmVydGVkIHRvIHVzZSBhdXRvY29uZiBzaW5jZQotCSMgaXQgd2FzIGxhc3QgY29uZmlndXJlZC4KLQlpZiBncmVwIEFDX09VVFBVVCAke3NyY2Rpcn0vY29uZmlndXJlLmluID4vZGV2L251bGwgOyB0aGVuCi0JICBlY2hvICcqKionIEhtbSwgbG9va3MgbGlrZSB0aGlzIGRpcmVjdG9yeSBoYXMgYmVlbiBhdXRvY29uZmlzY2F0ZWQuIDE+JjIKLQkgIGlmIFsgLXIgJHtzcmNkaXJ9L2NvbmZpZ3VyZSBdIDsgdGhlbgotCSAgICBlY2hvICcqKionIFJ1bm5pbmcgdGhlIGxvY2FsIGNvbmZpZ3VyZSBzY3JpcHQuIDE+JjIKLQkgICAgY2FzZSAiJHtjYWNoZV9maWxlfSIgaW4KLQkgICAgIiIpIGNhY2hlX2ZpbGVfb3B0aW9uPSA7OwotCSAgICAqKSAgY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IiA7OwotCSAgICBlc2FjCi0JICAgIHNyY2Rpcm9wdGlvbj0iLS1zcmNkaXI9JHtzcmNkaXJ9IgotCSAgICBjYXNlICIke2J1aWxkX2FsaWFzfSIgaW4KLQkgICAgIiIpIGJ1aWxkb3B0PSA7OwotCSAgICAqKSAgYnVpbGRvcHQ9Ii0tYnVpbGQ9JHtidWlsZF9hbGlhc30iIDs7Ci0JICAgIGVzYWMKLQkgICAgZXZhbCBleGVjICR7Y29uZmlnX3NoZWxsfSAke3NyY2Rpcn0vY29uZmlndXJlICR7dmVyYm9zZX0gXAotCQkke2J1aWxkb3B0fSAtLWhvc3Q9JHtob3N0X2FsaWFzfSAtLXRhcmdldD0ke3RhcmdldF9hbGlhc30gXAotCQkke3ByZWZpeG9wdGlvbn0gJHt0bXBkaXJvcHRpb259ICR7ZXhlY19wcmVmaXhvcHRpb259IFwKLQkJJHtzcmNkaXJvcHRpb259ICR7ZGlyb3B0aW9uc30gXAotCQkke3Byb2dyYW1fcHJlZml4b3B0aW9ufSAke3Byb2dyYW1fc3VmZml4b3B0aW9ufSBcCi0JCSR7cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZW9wdGlvbn0gJHtzaXRlX29wdGlvbn0gXAotCQkke3dpdGhvcHRpb25zfSAke3dpdGhvdXRvcHRpb25zfSBcCi0JCSR7ZW5hYmxlb3B0aW9uc30gJHtkaXNhYmxlb3B0aW9uc30gJHtmbG9hdGluZ19wb2ludG9wdGlvbn0gXAotCQkke2NhY2hlX2ZpbGVfb3B0aW9ufSAke3JlbW92aW5nfSAke290aGVyX29wdGlvbnN9ICR7cmVkaXJlY3R9Ci0JICBlbHNlCi0JICAgIGVjaG8gJyoqKicgVGhlcmUgaXMgbm8gY29uZmlndXJlIHNjcmlwdCBwcmVzZW50IHRob3VnaC4gMT4mMgotCSAgZmkKLQlmaQotICAgICAgICBleGl0IDEKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWNhc2UgImBncmVwICdeIyBwZXJcLXRhcmdldDonICR7c3JjZGlyfS9jb25maWd1cmUuaW5gIiBpbgotIiIpCi0gICAgICAgIGVjaG8gJyoqKicgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBoYXMgbm8gXCJwZXItdGFyZ2V0OlwiIGxpbmUuIDE+JjIKLSAgICAgICAgZXhpdCAxCi0gICAgICAgIDs7Ci0qKSA7OwotZXNhYwotCi1jYXNlICIke1RNUERJUn0iIGluCi0iIikgVE1QRElSPS90bXAgOyBleHBvcnQgVE1QRElSIDs7Ci0qKSA7OwotZXNhYwotCi0jIGtlZXAgdGhpcyBmaWxlbmFtZSBzaG9ydCBmb3IgJiUqJSQqIyAxNCBjaGFyIGZpbGUgbmFtZXMKLXRtcGZpbGU9JHtUTVBESVJ9L2NPTmYkJAotIyBOb3RlIHRoYXQgdW5kZXIgbWFueSB2ZXJzaW9ucyBvZiBzaCBhIHRyYXAgaGFuZGxlciBmb3IgMCB3aWxsICpvdmVycmlkZSogYW55Ci0jIGV4aXQgc3RhdHVzIHlvdSBleHBsaWNpdGx5IHNwZWNpZnkhICBBdCB0aGlzIHBvaW50LCB0aGUgb25seSBub24tZXJyb3IgZXhpdAotIyBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzY3JpcHQ7IHRoZXNlIGFjdGlvbnMgYXJlIGR1cGxpY2F0ZWQgdGhlcmUsIG1pbnVzCi0jIHRoZSAiZXhpdCAxIi4gIERvbid0IHVzZSAiZXhpdCAwIiBhbnl3aGVyZSBhZnRlciB0aGlzIHdpdGhvdXQgcmVzZXR0aW5nIHRoZQotIyB0cmFwIGhhbmRsZXIsIG9yIHlvdSdsbCBsb3NlLgotdHJhcCAicm0gLWYgTWFrZWZpbGUudGVtICR7dG1wZmlsZX0uY29tICR7dG1wZmlsZX0udGd0ICR7dG1wZmlsZX0uaHN0ICR7dG1wZmlsZX0ucG9zOyBleGl0IDEiIDAgMSAyIDE1Ci0KLSMgc3BsaXQgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiBpbnRvIGNvbW1vbiwgcGVyLWhvc3QsIHBlci10YXJnZXQsCi0jIGFuZCBwb3N0LXRhcmdldCBwYXJ0cy4gIFBvc3QtdGFyZ2V0IGlzIG9wdGlvbmFsLgotc2VkIC1lICcvXiMgcGVyXC1ob3N0Oi8sJGQnICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPiAke3RtcGZpbGV9LmNvbQotc2VkIC1lICcxLC9eIyBwZXJcLWhvc3Q6L2QnIC1lICcvXiMgcGVyXC10YXJnZXQ6LywkZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0uaHN0Ci1pZiBncmVwICdeIyBwb3N0LXRhcmdldDonICR7c3JjZGlyfS9jb25maWd1cmUuaW4gPi9kZXYvbnVsbCA7IHRoZW4KLSAgc2VkIC1lICcxLC9eIyBwZXJcLXRhcmdldDovZCcgLWUgJy9eIyBwb3N0XC10YXJnZXQ6LywkZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0udGd0Ci0gIHNlZCAtZSAnMSwvXiMgcG9zdFwtdGFyZ2V0Oi9kJyAke3NyY2Rpcn0vY29uZmlndXJlLmluID4gJHt0bXBmaWxlfS5wb3MKLWVsc2UKLSAgc2VkIC1lICcxLC9eIyBwZXJcLXRhcmdldDovZCcgJHtzcmNkaXJ9L2NvbmZpZ3VyZS5pbiA+ICR7dG1wZmlsZX0udGd0Ci0gIGVjaG8gPiR7dG1wZmlsZX0ucG9zCi1maQotCi0jIyMgZG8gY29tbW9uIHBhcnQgb2YgY29uZmlndXJlLmluCi0KLSMgSWYgdGhlIGxhbmd1YWdlIHNwZWNpZmljIGNvbXBpbGVyIGRvZXMgbm90IGV4aXN0LCBidXQgdGhlICJnY2MiIGRpcmVjdG9yeSBkb2VzLAotIyB3ZSB3aWxsIHNraXAgdGhpcyBkaXJlY3Rvcnk7IGluIHRoaXMgY2FzZSB0aGUgc3ViLWRpcmVjdG9yeSdzIGNvbW1vbiBwYXJ0Ci0jIG9mIGNvbmZpZ3VyZS5pbiB3aWxsIGNyZWF0ZSBhIHNtYWxsIHNoZWxsIHNjcmlwdCAic2tpcC10aGlzLWRpciIgY29udGFpbmluZwotIyBjb21tYW5kcyB0byBjb21wbGV0ZWx5IGNsZWFuIHVwIGFueSB0ZW1wb3Jhcnkgb3IgY3JlYXRlZCBmaWxlcy4KLQotLiAke3RtcGZpbGV9LmNvbQotCi1pZiB0ZXN0IC1mIHNraXAtdGhpcy1kaXI7IHRoZW4KLQkjIFBlcmZvcm0gdGhlIHNhbWUgY2xlYW51cCBhcyB0aGUgdHJhcCBoYW5kbGVyLCBtaW51cyB0aGUgImV4aXQgMSIgb2YgY291cnNlLAotCSMgYW5kIHJlc2V0IHRoZSB0cmFwIGhhbmRsZXIuCi0JdHJhcCAwCi0Jcm0gLWYgTWFrZWZpbGUqICR7dG1wZmlsZX0uY29tICR7dG1wZmlsZX0udGd0ICR7dG1wZmlsZX0uaHN0ICR7dG1wZmlsZX0ucG9zCi0JIyBFeGVjdXRlIHRoZSBmaW5hbCBjbGVhbi11cCBhY3Rpb25zCi0JJHtjb25maWdfc2hlbGx9IHNraXAtdGhpcy1kaXIKLQkjIGFuZCBzdG9wIGNvbmZpZ3VyaW5nIHRoaXMgZGlyZWN0b3J5LgotCWV4aXQgMAotZmkKLQotIyBzb21lIHNhbml0eSBjaGVja3Mgb24gY29uZmlndXJlLmluCi1jYXNlICIke3NyY3RyaWdnZXJ9IiBpbgotIiIpCi0gICAgICAgIGVjaG8gJyoqKicgc3JjdHJpZ2dlciBub3Qgc2V0IGluICR7UFdEPWBwd2RgfS9jb25maWd1cmUuaW4uICAxPiYyCi0gICAgICAgIGV4aXQgMQotICAgICAgICA7OwotKikgOzsKLWVzYWMKLQotY2FzZSAiJHtidWlsZF9hbGlhc30iIGluCi0iIikKLQlpZiByZXN1bHQ9YCR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gJHtob3N0X2FsaWFzfWAgOyB0aGVuCi0JICAgIGJ1aWxkX2NwdT1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLQkgICAgYnVpbGRfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotCSAgICBidWlsZF9vcz1gZWNobyAkcmVzdWx0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLQkgICAgYnVpbGQ9JHtidWlsZF9jcHV9LSR7YnVpbGRfdmVuZG9yfS0ke2J1aWxkX29zfQotCSAgICBidWlsZF9hbGlhcz0ke2hvc3RfYWxpYXN9Ci0JZmkKLQk7OwotKikKLQlpZiByZXN1bHQ9YCR7Y29uZmlnX3NoZWxsfSAke2NvbmZpZ3N1Yn0gJHtidWlsZF9hbGlhc31gIDsgdGhlbgotCSAgICBidWlsZG9wdD0iLS1idWlsZD0ke2J1aWxkX2FsaWFzfSIKLQkgICAgYnVpbGRfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotCSAgICBidWlsZF92ZW5kb3I9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi0JICAgIGJ1aWxkX29zPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCSAgICBidWlsZD0ke2J1aWxkX2NwdX0tJHtidWlsZF92ZW5kb3J9LSR7YnVpbGRfb3N9Ci0JZWxzZQotCSAgICBlY2hvICJVbnJlY29nbml6ZWQgYnVpbGQgc3lzdGVtIG5hbWUgJHtidWlsZF9hbGlhc30uIiAxPiYyCi0JICAgIGV4aXQgMQotCWZpCi0JOzsKLWVzYWMKLQotaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7aG9zdF9hbGlhc31gIDsgdGhlbgotICAgIHRydWUKLWVsc2UKLSAgICBlY2hvICJVbnJlY29nbml6ZWQgaG9zdCBzeXN0ZW0gbmFtZSAke2hvc3RfYWxpYXN9LiIgMT4mMgotICAgIGV4aXQgMQotZmkKLWhvc3RfY3B1PWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotaG9zdD0ke2hvc3RfY3B1fS0ke2hvc3RfdmVuZG9yfS0ke2hvc3Rfb3N9Ci0KLS4gJHt0bXBmaWxlfS5oc3QKLQotaWYgcmVzdWx0PWAke2NvbmZpZ19zaGVsbH0gJHtjb25maWdzdWJ9ICR7dGFyZ2V0X2FsaWFzfWAgOyB0aGVuCi0gICAgdHJ1ZQotZWxzZQotICAgIGVjaG8gIlVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIG5hbWUgJHt0YXJnZXRfYWxpYXN9LiIgMT4mMgotICAgIGV4aXQgMQotZmkKLXRhcmdldF9jcHU9YGVjaG8gJHJlc3VsdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi10YXJnZXRfdmVuZG9yPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotdGFyZ2V0X29zPWBlY2hvICRyZXN1bHQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotdGFyZ2V0PSR7dGFyZ2V0X2NwdX0tJHt0YXJnZXRfdmVuZG9yfS0ke3RhcmdldF9vc30KLQotLiAke3RtcGZpbGV9LnRndAotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1jYXNlICIke3NyY2Rpcn0iIGluCi0iIikKLSAgICAgICAgc3JjZGlyZGVmYXVsdGVkPTEKLSAgICAgICAgc3JjZGlyPS4KLSAgICAgICAgaWYgWyAhIC1yICR7c3JjdHJpZ2dlcn0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBzcmNkaXI9Li4KLSAgICAgICAgZmkKLSAgICAgICAgOzsKLSopIDs7Ci1lc2FjCi0KLWlmIFsgISAtciAke3NyY2Rpcn0vJHtzcmN0cmlnZ2VyfSBdIDsgdGhlbgotICAgICAgICBjYXNlICIke3NyY2RpcmRlZmF1bHRlZH0iIGluCi0gICAgICAgICIiKSBlY2hvICcqKionICIke3Byb2duYW1lfTogQ2FuJ3QgZmluZCAke3NyY25hbWV9IHNvdXJjZXMgaW4gJHtQV0Q9YHB3ZGB9LyR7c3JjZGlyfSIgMT4mMiA7OwotICAgICAgICAqKSAgZWNobyAnKioqJyAiJHtwcm9nbmFtZX06IENhbid0IGZpbmQgJHtzcmNuYW1lfSBzb3VyY2VzIGluICR7UFdEPWBwd2RgfS8uIG9yICR7UFdEPWBwd2RgfS8uLiIgMT4mMiA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgZWNobyAnKioqJyBcKEF0IGxlYXN0ICR7c3JjdHJpZ2dlcn0gaXMgbWlzc2luZy5cKSAxPiYyCi0gICAgICAgIGV4aXQgMQotZmkKLQotIyBTb21lIHN5c3RlbXMgKGUuZy4sIG9uZSBvZiB0aGUgaTM4Ni1haXggc3lzdGVtcyB0aGUgZ2FzIHRlc3RlcnMgYXJlCi0jIHVzaW5nKSBkb24ndCBoYW5kbGUgIlwkIiBjb3JyZWN0bHksIHNvIGRvbid0IHVzZSBpdCBoZXJlLgotdG9vbGRpcj0nJChleGVjX3ByZWZpeCknLyR7dGFyZ2V0X2FsaWFzfQotCi1pZiBbICIke2hvc3RfYWxpYXN9IiAhPSAiJHt0YXJnZXRfYWxpYXN9IiBdIDsgdGhlbgotICAgIGlmIFsgIiR7cHJvZ3JhbV9wcmVmaXhvcHRpb259IiA9ICIiIF0gOyB0aGVuCi0gICAgICAgIGlmIFsgIiR7cHJvZ3JhbV9zdWZmaXhvcHRpb259IiA9ICIiIF0gOyB0aGVuIAotICAgICAgICAgICAgaWYgWyAiJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9ufSIgPSAiIiBdIDsgdGhlbgotICAgICAgICAgICAgICAgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0gOwotICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICBmaQotZmkKLQotIyBNZXJnZSBwcm9ncmFtX3ByZWZpeCBhbmQgcHJvZ3JhbV9zdWZmaXggb250byBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lLgotIyAocHJvZ3JhbV9zdWZmaXggdXNlZCB0byB1c2UgJCwgYnV0IGl0J3MgaGFyZCB0byBwcmVzZXJ2ZSAkIHRocm91Z2ggYm90aAotIyBtYWtlIGFuZCBzaC4pCi1pZiBbICIke3Byb2dyYW1fc3VmZml4fSIgIT0gIiIgXSA7IHRoZW4KLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSItZSBzLFxcXFwoLipcXFxcKSxcXFxcMSR7cHJvZ3JhbV9zdWZmaXh9LCAke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IgotZmkKLQotaWYgWyAiJHtwcm9ncmFtX3ByZWZpeH0iICE9ICIiIF0gOyB0aGVuCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iLWUgcyxeLCR7cHJvZ3JhbV9wcmVmaXh9LCAke3Byb2dyYW1fdHJhbnNmb3JtX25hbWV9IgotZmkKLQotIyBJZiBDQyBhbmQgQ1hYIGFyZSBub3Qgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgYW5kIHRoZSBNYWtlZmlsZQotIyBleGlzdHMsIHRyeSB0byBleHRyYWN0IHRoZW0gZnJvbSBpdC4gIFRoaXMgaXMgdG8gaGFuZGxlIHJ1bm5pbmcKLSMgLi9jb25maWcuc3RhdHVzIGJ5IGhhbmQuCi1pZiBbIC16ICIke0NDfSIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgc2VkIC1uIC1lICc6bG9vcAotL1xcJC8gTgotcy9cXFxuLy9nCi10IGxvb3AKLS9eQ0NbIAldKj0vIHMvQ0NbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ0M9YHRhaWwgLTEgTWFrZWZpbGUuY2NgCi0gIHJtIC1mIE1ha2VmaWxlLmNjCi1maQotCi1pZiBbIC16ICIke0NGTEFHU30iIF0gJiYgWyAtciBNYWtlZmlsZSBdOyB0aGVuCi0gIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXkNGTEFHU1sgCV0qPS8gcy9DRkxBR1NbIAldKj1bIAldKlwoLipcKS9cMS9wJyA8IE1ha2VmaWxlID4gTWFrZWZpbGUuY2MKLSAgQ0ZMQUdTPWB0YWlsIC0xIE1ha2VmaWxlLmNjYAotICBybSAtZiBNYWtlZmlsZS5jYwotZmkKLQotaWYgWyAteiAiJHtDWFh9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DWFhbIAldKj0vIHMvQ1hYWyAJXSo9WyAJXSpcKC4qXCkvXDEvcCcgPCBNYWtlZmlsZSA+IE1ha2VmaWxlLmNjCi0gIENYWD1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLWlmIFsgLXogIiR7Q1hYRkxBR1N9IiBdICYmIFsgLXIgTWFrZWZpbGUgXTsgdGhlbgotICBzZWQgLW4gLWUgJzpsb29wCi0vXFwkLyBOCi1zL1xcXG4vL2cKLXQgbG9vcAotL15DWFhGTEFHU1sgCV0qPS8gcy9DWFhGTEFHU1sgCV0qPVsgCV0qXCguKlwpL1wxL3AnIDwgTWFrZWZpbGUgPiBNYWtlZmlsZS5jYwotICBDWFhGTEFHUz1gdGFpbCAtMSBNYWtlZmlsZS5jY2AKLSAgcm0gLWYgTWFrZWZpbGUuY2MKLWZpCi0KLSMgR2VuZXJhdGUgYSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIFlBQ0MuICBUaGlzIGlzIHVzZWQgaWYgdGhlIG1ha2VmaWxlIGNhbid0Ci0jIGxvY2F0ZSBiaXNvbiBvciBieWFjYyBpbiBvYmpkaXIuCi0KLWZvciBwcm9nIGluICdiaXNvbiAteScgYnlhY2MgeWFjYwotZG8KLSAgc2V0IGR1bW15ICRwcm9nOyB0bXA9JDIKLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci8kdG1wOyB0aGVuCi0gICAgICBERUZBVUxUX1lBQ0M9IiRwcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIHRlc3QgLW4gIiRERUZBVUxUX1lBQ0MiICYmIGJyZWFrCi1kb25lCi0KLSMgR2VuZXJhdGUgYSBkZWZhdWx0IGRlZmluaXRpb24gZm9yIE00LiAgVGhpcyBpcyB1c2VkIGlmIHRoZSBtYWtlZmlsZSBjYW4ndAotIyBsb2NhdGUgbTQgaW4gb2JqZGlyLgotCi1mb3IgcHJvZyBpbiBnbTQgZ251bTQgbTQKLWRvCi0gIHNldCBkdW1teSAkcHJvZzsgdG1wPSQyCi0gIElGUz0iJHtJRlM9ICAgfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgaWYgdGVzdCAtZiAkZGlyLyR0bXA7IHRoZW4KLSAgICAgIERFRkFVTFRfTTQ9IiRwcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIHRlc3QgLW4gIiRERUZBVUxUX000IiAmJiBicmVhawotZG9uZQotCi0jIEdlbmVyYXRlIGEgZGVmYXVsdCBkZWZpbml0aW9uIGZvciBMRVguICBUaGlzIGlzIHVzZWQgaWYgdGhlIG1ha2VmaWxlIGNhbid0Ci0jIGxvY2F0ZSBmbGV4IGluIG9iamRpci4KLQotZm9yIHByb2cgaW4gZmxleCBsZXgKLWRvCi0gIHNldCBkdW1teSAkcHJvZzsgdG1wPSQyCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvJHRtcDsgdGhlbgotICAgICAgREVGQVVMVF9MRVg9IiRwcm9nIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIHRlc3QgLW4gIiRERUZBVUxUX0xFWCIgJiYgYnJlYWsKLWRvbmUKLQotaWYgWyAiJHtidWlsZH0iICE9ICIke2hvc3R9IiBdOyB0aGVuCi0gICMgSWYgd2UgYXJlIGRvaW5nIGEgQ2FuYWRpYW4gQ3Jvc3MsIGluIHdoaWNoIHRoZSBob3N0IGFuZCBidWlsZCBzeXN0ZW1zCi0gICMgYXJlIG5vdCB0aGUgc2FtZSwgd2Ugc2V0IHJlYXNvbmFibGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSB0b29scy4KLQotICB0b29scz0iQVIgQVJfRk9SX1RBUkdFVCBBUyBBU19GT1JfVEFSR0VUIEJJU09OIENDX0ZPUl9CVUlMRCIKLSAgdG9vbHM9IiR7dG9vbHN9IENDX0ZPUl9UQVJHRVQgQ1hYX0ZPUl9UQVJHRVQiCi0gIHRvb2xzPSIke3Rvb2xzfSBETExUT09MIERMTFRPT0xfRk9SX1RBUkdFVCBHQ0NfRk9SX1RBUkdFVCBIT1NUX1BSRUZJWCIKLSAgdG9vbHM9IiR7dG9vbHN9IEhPU1RfUFJFRklYXzEgTEQgTERfRk9SX1RBUkdFVCBMRVggTUFLRUlORk8gTk0iCi0gIHRvb2xzPSIke3Rvb2xzfSBOTV9GT1JfVEFSR0VUIFJBTkxJQiBSQU5MSUJfRk9SX1RBUkdFVCIKLSAgdG9vbHM9IiR7dG9vbHN9IFdJTkRSRVMgV0lORFJFU19GT1JfVEFSR0VUIFlBQ0MiCi0KLSAgZm9yIHZhciBpbiAke3Rvb2xzfTsgZG8KLSAgICBpZiBbIC16ICJgZXZhbCAnZWNobyAkJyIke3Zhcn0iYCIgXSAmJiBbIC1yIE1ha2VmaWxlIF07IHRoZW4KLSAgICAgIHNlZCAtbiAtZSAnOmxvb3AKLS9cXCQvIE4KLXMvXFxcbi8vZwotdCBsb29wCi0vXiciJHt2YXJ9IidbIAldKj0vIHMvJyIke3Zhcn0iJ1sgCV0qPVsgCV0qXCguKlwpL1wxL3AnIFwKLQk8IE1ha2VmaWxlID4gTWFrZWZpbGUudgotICAgICAgdD1gdGFpbCAtMSBNYWtlZmlsZS52YAotICAgICAgaWYgWyAtbiAiJHt0fSIgXTsgdGhlbgotCWV2YWwgIiR7dmFyfT0nJHt0fSciCi0gICAgICBmaQotICAgICAgcm0gLWYgTWFrZWZpbGUudgotICAgIGZpCi0gIGRvbmUKLQotICBBUj0ke0FSLSR7aG9zdF9hbGlhc30tYXJ9Ci0gIEFSX0ZPUl9UQVJHRVQ9JHtBUl9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1hcn0KLSAgQVM9JHtBUy0ke2hvc3RfYWxpYXN9LWFzfQotICBBU19GT1JfVEFSR0VUPSR7QVNfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tYXN9Ci0gIEJJU09OPSR7QklTT04tYmlzb259Ci0gIENDPSR7Q0MtJHtob3N0X2FsaWFzfS1nY2N9Ci0gIENGTEFHUz0ke0NGTEFHUy0iLWcgLU8yIn0KLSAgQ1hYPSR7Q1hYLSR7aG9zdF9hbGlhc30tYysrfQotICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotICBDQ19GT1JfQlVJTEQ9JHtDQ19GT1JfQlVJTEQtZ2NjfQotICBDQ19GT1JfVEFSR0VUPSR7Q0NfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tZ2NjfQotICBDWFhfRk9SX1RBUkdFVD0ke0NYWF9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1jKyt9Ci0gIERMTFRPT0w9JHtETExUT09MLSR7aG9zdF9hbGlhc30tZGxsdG9vbH0KLSAgRExMVE9PTF9GT1JfVEFSR0VUPSR7RExMVE9PTF9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1kbGx0b29sfQotICBHQ0NfRk9SX1RBUkdFVD0ke0dDQ19GT1JfVEFSR0VULSR7Q0NfRk9SX1RBUkdFVC0ke3RhcmdldF9hbGlhc30tZ2NjfX0KLSAgSE9TVF9QUkVGSVg9JHtidWlsZF9hbGlhc30tCi0gIEhPU1RfUFJFRklYXzE9JHtidWlsZF9hbGlhc30tCi0gIExEPSR7TEQtJHtob3N0X2FsaWFzfS1sZH0KLSAgTERfRk9SX1RBUkdFVD0ke0xEX0ZPUl9UQVJHRVQtJHt0YXJnZXRfYWxpYXN9LWxkfQotICBNQUtFSU5GTz0ke01BS0VJTkZPLW1ha2VpbmZvfQotICBOTT0ke05NLSR7aG9zdF9hbGlhc30tbm19Ci0gIE5NX0ZPUl9UQVJHRVQ9JHtOTV9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1ubX0KLSAgUkFOTElCPSR7UkFOTElCLSR7aG9zdF9hbGlhc30tcmFubGlifQotICBSQU5MSUJfRk9SX1RBUkdFVD0ke1JBTkxJQl9GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS1yYW5saWJ9Ci0gIFdJTkRSRVM9JHtXSU5EUkVTLSR7aG9zdF9hbGlhc30td2luZHJlc30KLSAgV0lORFJFU19GT1JfVEFSR0VUPSR7V0lORFJFU19GT1JfVEFSR0VULSR7dGFyZ2V0X2FsaWFzfS13aW5kcmVzfQotCi0gIGlmIFsgLXogIiR7WUFDQ30iIF07IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2Jpc29uOyB0aGVuCi0JWUFDQz0iYmlzb24gLXkiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvYnlhY2M7IHRoZW4KLQlZQUNDPWJ5YWNjCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1mICRkaXIveWFjYzsgdGhlbgotCVlBQ0M9eWFjYwotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBpZiBbIC16ICIke1lBQ0N9IiBdOyB0aGVuCi0gICAgICBZQUNDPSJiaXNvbiAteSIKLSAgICBmaQotICBmaQotCi0gIGlmIFsgLXogIiR7TEVYfSIgXTsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZmxleDsgdGhlbgotCUxFWD1mbGV4Ci0JYnJlYWsKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvbGV4OyB0aGVuCi0JTEVYPWxleAotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBMRVg9JHtMRVgtZmxleH0KLSAgZmkKLQotICAjIEV4cG9ydCB2YXJpYWJsZXMgd2hpY2ggYXV0b2NvbmYgbWlnaHQgdHJ5IHRvIHNldC4KLSAgZXhwb3J0IEFTCi0gIGV4cG9ydCBBUgotICBleHBvcnQgQ0NfRk9SX0JVSUxECi0gIGV4cG9ydCBETExUT09MCi0gIGV4cG9ydCBMRAotICBleHBvcnQgTk0KLSAgZXhwb3J0IFJBTkxJQgotICBleHBvcnQgV0lORFJFUwotZWxzZQotICAjIElmIENDIGlzIHN0aWxsIG5vdCBzZXQsIHRyeSB0byBnZXQgZ2NjLgotICBpZiBbIC16ICIke0NDfSIgXTsgdGhlbgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gICAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0JQ0M9ImdjYyIKLQllY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLQlpZiB0ZXN0IC16ICJgJHtDQ30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLQkgIENGTEFHUz0ke0NGTEFHUy0iLWcgLU8yIn0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1nIC1PMiJ9Ci0JZWxzZQotCSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzIifQotCSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLU8yIn0KLQlmaQotCXJtIC1mIGNvbmZ0ZXN0KgotCWJyZWFrCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICBDQz0ke0NDLWNjfQotICBlbHNlCi0gICAgaWYgdGVzdCAteiAiJHtDRkxBR1N9IjsgdGhlbgotICAgICAgIyBIZXJlIENDIGlzIHNldCBidXQgQ0ZMQUdTIGlzIG5vdC4gIFVzZSBhIHF1aWNrIGhhY2sgdG8gdXNlIC1PMiBpZiBDQwotICAgICAgIyBpcyBzZXQgdG8gYSB2ZXJzaW9uIG9mIGdjYy4KLSAgICAgIGNhc2UgIiR7Q0N9IiBpbgotICAgICAgKmdjYykKLQllY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLQlpZiB0ZXN0IC16ICJgJHtDQ30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLQkgIENGTEFHUz0ke0NGTEFHUy0iLWcgLU8yIn0KLQkgIENYWEZMQUdTPSR7Q1hYRkxBR1MtIi1nIC1PMiJ9Ci0JZWxzZQotCSAgQ0ZMQUdTPSR7Q0ZMQUdTLSItTzIifQotCSAgQ1hYRkxBR1M9JHtDWFhGTEFHUy0iLU8yIn0KLQlmaQotCXJtIC1mIGNvbmZ0ZXN0KgotCTs7Ci0gICAgICBlc2FjCi0gICAgZmkKLSAgZmkKLQotICBDWFg9JHtDWFgtImMrKyJ9Ci0gIENGTEFHUz0ke0NGTEFHUy0iLWcifQotICBDWFhGTEFHUz0ke0NYWEZMQUdTLSItZyAtTzIifQotZmkKLQotZXhwb3J0IENDCi1leHBvcnQgQ1hYCi1leHBvcnQgQ0ZMQUdTCi1leHBvcnQgQ1hYRkxBR1MKLQotCi1mb3Igc3ViZGlyIGluIC4gJHtzdWJkaXJzfSA7IGRvCi0KLSAgICAjICR7c3ViZGlyfSBpcyByZWxhdGl2ZSBwYXRoIGZyb20gLiB0byB0aGUgZGlyZWN0b3J5IHdlJ3JlIGN1cnJlbnRseQotICAgICMgY29uZmlndXJpbmcuCi0gICAgIyAke2ludnN1YmRpcn0gaXMgaW52ZXJzZSBvZiAke3N1YmRpciksICp3aXRoKiB0cmFpbGluZyAvLCBpZiBuZWVkZWQuCi0gICAgaW52c3ViZGlyPWBlY2hvICR7c3ViZGlyfS8gfCBzZWQgLWUgJ3N8XC4vfHxnJyAtZSAnc3xbXi9dKi98Li4vfGcnYAotCi0gICAgIyMjIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHNyY2RpcgotICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgICAgIi4iKSAgIyBubyAtc3JjZGlyIG9wdGlvbi4gIFdlJ3JlIGJ1aWxkaW5nIGluIHBsYWNlLgotICAgICAgICAgICAgICAgIG1ha2VzcmNkaXI9LiA7OwotICAgICAgICAvKikgIyBhYnNvbHV0ZSBwYXRoCi0gICAgICAgICAgICAgICAgbWFrZXNyY2Rpcj1gZWNobyAke3NyY2Rpcn0vJHtzdWJkaXJ9IHwgc2VkIC1lICdzfC9cLiR8fCdgCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgKikgIyBvdGhlcndpc2UgcmVsYXRpdmUKLSAgICAgICAgICAgICAgICBjYXNlICIke3N1YmRpcn0iIGluCi0gICAgICAgICAgICAgICAgLikgbWFrZXNyY2Rpcj0ke3NyY2Rpcn0gOzsKLSAgICAgICAgICAgICAgICAqKSBtYWtlc3JjZGlyPSR7aW52c3ViZGlyfSR7c3JjZGlyfS8ke3N1YmRpcn0gOzsKLSAgICAgICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICBpZiBbICIke3N1YmRpcn0vIiAhPSAiLi8iIF0gOyB0aGVuCi0gICAgICAgIE1ha2VmaWxlPSR7c3ViZGlyfS9NYWtlZmlsZQotICAgIGZpCi0KLSAgICBpZiBbICEgLWQgJHtzdWJkaXJ9IF0gOyB0aGVuCi0gICAgICAgIGlmIG1rZGlyICR7c3ViZGlyfSA7IHRoZW4KLSAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY291bGQgbm90IG1ha2UgJHtQV0Q9YHB3ZGB9LyR7c3ViZGlyfSIgMT4mMgotICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICBmaQotICAgIGZpCi0KLSAgICBjYXNlICIke3JlbW92aW5nfSIgaW4KLSAgICAiIikKLSAgICAgICAgY2FzZSAiJHtzdWJkaXJ9IiBpbgotICAgICAgICAuKSA7OwotICAgICAgICAqKSBldmFsIGVjaG8gQnVpbGRpbmcgaW4gJHtzdWJkaXJ9ICR7cmVkaXJlY3R9IDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICAjIEZJWE1FIFNob3VsZCB0aGlzIGJlIGRvbmUgcmVjdXJzaXZlbHkgPz8/IChVc2VmdWwgZm9yIGUuZy4gZ2RidGVzdCkKLSAgICAgICAgIyBTZXQgdXAgdGhlIGxpc3Qgb2YgbGlua3MgdG8gYmUgbWFkZS4KLSAgICAgICAgIyAke2xpbmtzfSBpcyB0aGUgbGlzdCBvZiBsaW5rIG5hbWVzLCBhbmQgJHtmaWxlc30gaXMgdGhlIGxpc3Qgb2YgbmFtZXMgdG8gbGluayB0by4KLQotICAgICAgICAjIE1ha2UgdGhlIGxpbmtzLgotICAgICAgICBjb25maWdsaW5rcz0iJHtsaW5rc30iCi0gICAgICAgIGlmIFsgLXIgJHtzdWJkaXJ9L2NvbmZpZy5zdGF0dXMgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBtdiAtZiAke3N1YmRpcn0vY29uZmlnLnN0YXR1cyAke3N1YmRpcn0vY29uZmlnLmJhY2sKLSAgICAgICAgZmkKLSAgICAgICAgd2hpbGUgWyAtbiAiJHtmaWxlc30iIF0gOyBkbwotICAgICAgICAgICAgICAgICMgc2V0IGZpbGUgdG8gY2FyIG9mIGZpbGVzLCBmaWxlcyB0byBjZHIgb2YgZmlsZXMKLSAgICAgICAgICAgICAgICBzZXQgJHtmaWxlc307IGZpbGU9JDE7IHNoaWZ0OyBmaWxlcz0kKgotICAgICAgICAgICAgICAgIHNldCAke2xpbmtzfTsgbGluaz0kMTsgc2hpZnQ7IGxpbmtzPSQqCi0KLSAgICAgICAgICAgICAgICBpZiBbICEgLXIgJHtzcmNkaXJ9LyR7ZmlsZX0gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgIGlmIFsgISAtciAke2ZpbGV9IF0gOyB0aGVuCi0JCSAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgIiR7cHJvZ25hbWV9OiBjYW5ub3QgY3JlYXRlIGEgbGluayBcIiR7bGlua31cIiwiIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgInNpbmNlIHRoZSBmaWxlIFwiJHtzcmNkaXJ9LyR7ZmlsZX1cIiBkb2VzIG5vdCBleGlzdC4iIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotCQkgIGVsc2UKLQkJCXNyY2ZpbGU9JHtmaWxlfQotCQkgIGZpCi0JCWVsc2UKLQkJCXNyY2ZpbGU9JHtzcmNkaXJ9LyR7ZmlsZX0KLSAgICAgICAgICAgICAgICBmaQotCi0gICAgICAgICAgICAgICAgJHtyZW1vdmV9IC1mICR7bGlua30KLQkJIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluawotCQlpZiAke3N5bWJvbGljX2xpbmt9ICR7c3JjZmlsZX0gJHtsaW5rfSA+L2Rldi9udWxsIDI+JjEgOyB0aGVuCi0JCQl0cnVlCi0JCWVsc2UKLQkJCSMgV2UgbmVlZCB0byByZS1yZW1vdmUgdGhlIGZpbGUgYmVjYXVzZSBMeW54IGxlYXZlcyBhIAotCQkJIyB2ZXJ5IHN0cmFuZ2UgZGlyZWN0b3J5IHRoZXJlIHdoZW4gaXQgZmFpbHMgYW4gTkZTIHN5bWxpbmsuCi0JCQkke3JlbW92ZX0gLXIgLWYgJHtsaW5rfQotCQkJJHtoYXJkX2xpbmt9ICR7c3JjZmlsZX0gJHtsaW5rfQotCQlmaQotICAgICAgICAgICAgICAgIGlmIFsgISAtciAke2xpbmt9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogdW5hYmxlIHRvIGxpbmsgXCIke2xpbmt9XCIgdG8gXCIke3NyY2ZpbGV9XCIuIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICBleGl0IDEKLSAgICAgICAgICAgICAgICBmaQotCi0gICAgICAgICAgICAgICAgZWNobyAiTGlua2VkIFwiJHtsaW5rfVwiIHRvIFwiJHtzcmNmaWxlfVwiLiIKLSAgICAgICAgZG9uZQotCi0gICAgICAgICMgQ3JlYXRlIGEgLmdkYmluaXQgZmlsZSB3aGljaCBydW5zIHRoZSBvbmUgaW4gc3JjZGlyCi0gICAgICAgICMgYW5kIHRlbGxzIEdEQiB0byBsb29rIHRoZXJlIGZvciBzb3VyY2UgZmlsZXMuCi0KLSAgICAgICAgaWYgWyAtciAke3NyY2Rpcn0vJHtzdWJkaXJ9Ly5nZGJpbml0IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgY2FzZSAke3NyY2Rpcn0gaW4KLSAgICAgICAgICAgICAgICAuKSA7OwotICAgICAgICAgICAgICAgICopIGNhdCA+ICR7c3ViZGlyfS8uZ2RiaW5pdCA8PEVPRgotIyAke05PX0VESVR9Ci1kaXIgJHttYWtlc3JjZGlyfQotZGlyIC4KLXNvdXJjZSAke21ha2VzcmNkaXJ9Ly5nZGJpbml0Ci1FT0YKLSAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgZXNhYwotICAgICAgICBmaQotCi0gICAgICAgICMgSW5zdGFsbCBhIG1ha2VmaWxlLCBhbmQgbWFrZSBpdCBzZXQgVlBBVEgKLSAgICAgICAgIyBpZiBuZWNlc3Nhcnkgc28gdGhhdCB0aGUgc291cmNlcyBhcmUgZm91bmQuCi0gICAgICAgICMgQWxzbyBjaGFuZ2UgaXRzIHZhbHVlIG9mIHNyY2Rpci4KLSAgICAgICAgIyBOT1RFOiBNYWtlZmlsZSBnZW5lcmF0aW9uIGNvbnN0aXR1dGVzIHRoZSBtYWpvcml0eSBvZiB0aGUgdGltZSBpbiBjb25maWd1cmUuICBIZW5jZSwgdGhpcyBzZWN0aW9uIGhhcwotICAgICAgICAjIGJlZW4gc29tZXdoYXQgb3B0aW1pemVkIGFuZCBpcyBwZXJoYXBzIGEgYml0IHR3aXN0eS4KLQotICAgICAgICAjIGNvZGUgaXMgb3JkZXIgc28gYXMgdG8gdHJ5IHRvIHNlZCB0aGUgc21hbGxlc3QgaW5wdXQgZmlsZXMgd2Uga25vdy4KLSAgICAgICAgIyBzbyBkbyB0aGVzZSBzZXBhcmF0ZWx5IGJlY2F1c2UgSSBkb24ndCB0cnVzdCB0aGUgb3JkZXIgb2Ygc2VkIC1lIGV4cHJlc3Npb25zLgotCi0gICAgICAgICMgdGhlIGZpdmUgbWFrZWZpbGUgZnJhZ21lbnRzIE1VU1QgZW5kIHVwIGluIHRoZSByZXN1bHRpbmcgTWFrZWZpbGUgaW4gdGhpcyBvcmRlcjogCi0gICAgICAgICMgcGFja2FnZSBtYWNyb3MsIHRhcmdldCwgaG9zdCwgc2l0ZSwgYW5kIHBhY2thZ2UgcnVsZXMuCi0KLSAgICAgICAgaWYgWyAtZiAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59IF0gOyB0aGVuCi0KLSAgICAgICAgICAgICMgQ29uZGl0aW9uYWxpemUgdGhlIG1ha2VmaWxlIGZvciB0aGlzIHBhY2thZ2UgZnJvbSAiTWFrZWZpbGUuaW4iIChvciB3aGF0ZXZlciBpdCdzIGNhbGxlZCkgaW50byBNYWtlZmlsZS50ZW0uCi0gICAgICAgICAgICBybSAtZiAke3N1YmRpcn0vJHtNYWtlZmlsZX0udGVtCi0gICAgICAgICAgICBjYXNlICIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSBjcCAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHtwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX21ha2VmaWxlX3J1bGVzX2ZyYWc9JHtzcmNkaXJ9LyR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAiL14jIyMjLyAgciAke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ30iICR7c3JjZGlyfS8ke3N1YmRpcn0vJHtNYWtlZmlsZV9pbn0gPiAke01ha2VmaWxlfS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIEV4cGVjdGVkIHBhY2thZ2UgbWFrZWZpbGUgcnVsZXMgZnJhZ21lbnQgXCIke3BhY2thZ2VfbWFrZWZpbGVfcnVsZXNfZnJhZ31cIiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionIGlzIG1pc3NpbmcgaW4gJHtQV0Q9YHB3ZGB9LiAxPiYyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcCAke3NyY2Rpcn0vJHtzdWJkaXJ9LyR7TWFrZWZpbGVfaW59ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7TWFrZWZpbGV9LnRlbQotCi0gICAgICAgICAgICAjIENvbmRpdGlvbmFsaXplIGZvciB0aGlzIHNpdGUuCi0gICAgICAgICAgICBybSAtZiAke01ha2VmaWxlfQotICAgICAgICAgICAgICBjYXNlICIke3NpdGV9IiBpbgotICAgICAgICAgICAgICAiIikgbXYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSAke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgIHNpdGVfbWFrZWZpbGVfZnJhZz0ke3NyY2Rpcn0vY29uZmlnL21zLSR7c2l0ZX0KLQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgLWYgJHtzaXRlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHtzaXRlX21ha2VmaWxlX2ZyYWd9IiAke3N1YmRpcn0vTWFrZWZpbGUudGVtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPiAke01ha2VmaWxlfQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVfbWFrZWZpbGVfZnJhZz0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICBlc2FjCi0gICAgICAgICAgICAjIHdvcmtpbmcgY29weSBub3cgaW4gJHtNYWtlZmlsZX0KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSB0aGUgbWFrZWZpbGUgZm9yIHRoaXMgaG9zdC4KLSAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgIGNhc2UgIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHtob3N0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0X21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke2hvc3RfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAiL14jIyMjLyAgciAke2hvc3RfbWFrZWZpbGVfZnJhZ30iICR7TWFrZWZpbGV9ID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgRXhwZWN0ZWQgaG9zdCBtYWtlZmlsZSBmcmFnbWVudCBcIiR7aG9zdF9tYWtlZmlsZV9mcmFnfVwiIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgaXMgbWlzc2luZyBpbiAke1BXRD1gcHdkYH0uIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyB3b3JraW5nIGNvcHkgbm93IGluICR7c3ViZGlyKS9NYWtlZmlsZS50ZW0KLQotICAgICAgICAgICAgIyBDb25kaXRpb25hbGl6ZSB0aGUgbWFrZWZpbGUgZm9yIHRoaXMgdGFyZ2V0LgotICAgICAgICAgICAgcm0gLWYgJHtNYWtlZmlsZX0KLSAgICAgICAgICAgIGNhc2UgIiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgbXYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbSAke01ha2VmaWxlfSA7OwotICAgICAgICAgICAgICAqKQotICAgICAgICAgICAgICAgICAgICAgIGlmIFsgISAtZiAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9LyR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9Ci0gICAgICAgICAgICAgICAgICAgICAgZmkKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbIC1mICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWQgLWUgIi9eIyMjIy8gIHIgJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gPiAke01ha2VmaWxlfQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gJHtNYWtlZmlsZX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICMgd29ya2luZyBjb3B5IG5vdyBpbiAke01ha2VmaWxlfQotCi0gICAgICAgICAgICAjIEVtaXQgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoaXMgcGFja2FnZSdzIG1hY3Jvcy4KLSAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgIGNhc2UgIiR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIG12ICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gOzsKLSAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICBpZiBbICEgLWYgJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX21ha2VmaWxlX2ZyYWc9JHtzcmNkaXJ9LyR7cGFja2FnZV9tYWtlZmlsZV9mcmFnfQotICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZCAtZSAiL14jIyMjLyAgciAke3BhY2thZ2VfbWFrZWZpbGVfZnJhZ30iICR7TWFrZWZpbGV9ID4gJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgRXhwZWN0ZWQgcGFja2FnZSBtYWtlZmlsZSBmcmFnbWVudCBcIiR7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfVwiIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJyoqKicgaXMgbWlzc2luZyBpbiAke1BXRD1gcHdkYH0uIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12ICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLSAgICAgICAgICAgICAgICAgICAgICBmaQotICAgICAgICAgICAgZXNhYwotICAgICAgICAgICAgIyByZWFsIGNvcHkgbm93IGluICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLQotICAgICAgICAgICAgIyBwcmVwZW5kIHdhcm5pbmcgYWJvdXQgZWRpdHRpbmcsIGFuZCBhIGJ1bmNoIG9mIHZhcmlhYmxlcy4KLSAgICAgICAgICAgIHJtIC1mICR7TWFrZWZpbGV9Ci0gICAgICAgICAgICBjYXQgPiAke01ha2VmaWxlfSA8PEVPRgotIyAke05PX0VESVR9Ci1WUEFUSCA9ICR7bWFrZXNyY2Rpcn0KLWxpbmtzID0gJHtjb25maWdsaW5rc30KLWhvc3RfYWxpYXMgPSAke2hvc3RfYWxpYXN9Ci1ob3N0X2NwdSA9ICR7aG9zdF9jcHV9Ci1ob3N0X3ZlbmRvciA9ICR7aG9zdF92ZW5kb3J9Ci1ob3N0X29zID0gJHtob3N0X29zfQotaG9zdF9jYW5vbmljYWwgPSAke2hvc3RfY3B1fS0ke2hvc3RfdmVuZG9yfS0ke2hvc3Rfb3N9Ci10YXJnZXRfYWxpYXMgPSAke3RhcmdldF9hbGlhc30KLXRhcmdldF9jcHUgPSAke3RhcmdldF9jcHV9Ci10YXJnZXRfdmVuZG9yID0gJHt0YXJnZXRfdmVuZG9yfQotdGFyZ2V0X29zID0gJHt0YXJnZXRfb3N9Ci10YXJnZXRfY2Fub25pY2FsID0gJHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9LSR7dGFyZ2V0X29zfQotRU9GCi0JICAgIGNhc2UgIiR7YnVpbGR9IiBpbgotCSAgICAgICIiKSA7OwotCSAgICAgICopICBjYXQgPj4gJHtNYWtlZmlsZX0gPDwgRU9GCi1idWlsZF9hbGlhcyA9ICR7YnVpbGRfYWxpYXN9Ci1idWlsZF9jcHUgPSAke2J1aWxkX2NwdX0KLWJ1aWxkX3ZlbmRvciA9ICR7YnVpbGRfdmVuZG9yfQotYnVpbGRfb3MgPSAke2J1aWxkX29zfQotYnVpbGRfY2Fub25pY2FsID0gJHtidWlsZF9jcHV9LSR7YnVpbGRfdmVuZG9yfS0ke2J1aWxkX29zfQotRU9GCi0JICAgIGVzYWMKLQotICAgICAgICAgICAgY2FzZSAiJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IiBpbgotICAgICAgICAgICAgICAiIikgOzsKLSAgICAgICAgICAgICAgLyopIGVjaG8gcGFja2FnZV9tYWtlZmlsZV9mcmFnID0gJHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikgIGVjaG8gcGFja2FnZV9tYWtlZmlsZV9mcmFnID0gJHtpbnZzdWJkaXJ9JHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgIGVzYWMKLQotICAgICAgICAgICAgY2FzZSAiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICAgICAgICIiKSA7OwotICAgICAgICAgICAgICAvKikgZWNobyB0YXJnZXRfbWFrZWZpbGVfZnJhZyA9ICR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9ID4+JHtNYWtlZmlsZX0gOzsKLSAgICAgICAgICAgICAgKikgIGVjaG8gdGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAke2ludnN1YmRpcn0ke3RhcmdldF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgIGNhc2UgIiR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgICAgICAgIiIpIDs7Ci0gICAgICAgICAgICAgIC8qKSBlY2hvIGhvc3RfbWFrZWZpbGVfZnJhZyA9ICR7aG9zdF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICAgICopICBlY2hvIGhvc3RfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7aG9zdF9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9IDs7Ci0gICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgIGlmIFsgIiR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgIT0gIiIgXSA7IHRoZW4KLSAgICAgICAgICAgICAgICBlY2hvIHNpdGVfbWFrZWZpbGVfZnJhZyA9ICR7aW52c3ViZGlyfSR7c2l0ZV9tYWtlZmlsZV9mcmFnfSA+PiR7TWFrZWZpbGV9Ci0gICAgICAgICAgICBmaSAKLQotCSAgICAjIHJlY29yZCBpZiB3ZSB3YW50IHRvIGJ1aWxkIHNoYXJlZCBsaWJzLgotCSAgICBpZiB0ZXN0IC16ICIke2VuYWJsZV9zaGFyZWR9IjsgdGhlbgotCSAgICAgICAgZWNobyBlbmFibGVfc2hhcmVkID0gbm8gPj4gJHtNYWtlZmlsZX0KLQkgICAgZWxzZQotCSAgICAgICAgZWNobyBlbmFibGVfc2hhcmVkID0gJHtlbmFibGVfc2hhcmVkfSA+PiAke01ha2VmaWxlfQotCSAgICBmaQotCSAgICAjIHJlY29yZCBpZiB3ZSB3YW50IHRvIHJ1bXRpbWUgbGlicmFyeSBzdHVmZiBpbnN0YWxsZWQgaW4gbGlic3ViZGlyLgotCSAgICBpZiB0ZXN0IC16ICIke2VuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlic30iOyB0aGVuCi0JICAgICAgICBlY2hvIGVuYWJsZV92ZXJzaW9uX3NwZWNpZmljX3J1bnRpbWVfbGlicyA9IG5vID4+ICR7TWFrZWZpbGV9Ci0JICAgIGVsc2UKLQkgICAgICAgIGVjaG8gZW5hYmxlX3ZlcnNpb25fc3BlY2lmaWNfcnVudGltZV9saWJzID0gJHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9ID4+ICR7TWFrZWZpbGV9Ci0JICAgIGZpCi0KLQkgICAgIyBFbWl0IGEgbWFjcm8gd2hpY2ggZGVzY3JpYmVzIHRoZSBmaWxlIGNvbnRhaW5pbmcgZ2NjJ3MKLQkgICAgIyB2ZXJzaW9uIG51bWJlci4KLQkgICAgZWNobyBnY2NfdmVyc2lvbl90cmlnZ2VyID0gJHtnY2NfdmVyc2lvbl90cmlnZ2VyfSA+PiAke01ha2VmaWxlfQotCSAgICAjIEFuZCBlbWl0IGEgbWFjcm8gZGVmaW5pbmcgZ2NjJ3MgdmVyc2lvbiBudW1iZXIuCi0JICAgIGVjaG8gZ2NjX3ZlcnNpb24gPSAke2djY192ZXJzaW9ufSA+PiAke01ha2VmaWxlfQotCi0gICAgICAgICAgICAjIHJlc2V0IHByZWZpeCwgZXhlY19wcmVmaXgsIHNyY2RpciwgU1VCRElSUywgTk9OU1VCRElSUywKLSAgICAgICAgICAgICMgcmVtb3ZlIGFueSBmb3JtIGZlZWRzLgotICAgICAgICAgICAgaWYgWyAteiAiJHtzdWJkaXJzfSIgXTsgdGhlbgotICAgICAgICAgICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50bTIKLSAgICAgICAgICAgICAgICBzZWQgLWUgInM6XlNVQkRJUlNbIAldKj0uKiQ6U1VCRElSUyA9ICR7Y29uZmlnZGlyc306IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5OT05TVUJESVJTWyAJXSo9LiokOk5PTlNVQkRJUlMgPSAke25vY29uZmlnZGlyc306IiBcCi0gICAgICAgICAgICAgICAgICAgICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gPiAke3N1YmRpcn0vTWFrZWZpbGUudG0yCi0gICAgICAgICAgICAgICAgcm0gLWYgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotICAgICAgICAgICAgICAgIG12ICR7c3ViZGlyfS9NYWtlZmlsZS50bTIgJHtzdWJkaXJ9L01ha2VmaWxlLnRlbQotCSAgICBmaQotCSAgICBzZWQgICAgIC1lICJzfF5wcmVmaXhbIAldKj0uKiR8cHJlZml4ID0gJHtwcmVmaXh9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeZXhlY19wcmVmaXhbIAldKj0uKiR8ZXhlY19wcmVmaXggPSAke2V4ZWNfcHJlZml4fXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmJpbmRpclsgCV0qPS4qJHxiaW5kaXIgPSAke2JpbmRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zYmluZGlyWyAJXSo9LiokfHNiaW5kaXIgPSAke3NiaW5kaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebGliZXhlY2RpclsgCV0qPS4qJHxsaWJleGVjZGlyID0gJHtsaWJleGVjZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmRhdGFkaXJbIAldKj0uKiR8ZGF0YWRpciA9ICR7ZGF0YWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5zeXNjb25mZGlyWyAJXSo9LiokfHN5c2NvbmZkaXIgPSAke3N5c2NvbmZkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xec2hhcmVkc3RhdGVkaXJbIAldKj0uKiR8c2hhcmVkc3RhdGVkaXIgPSAke3NoYXJlZHN0YXRlZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XmxvY2Fsc3RhdGVkaXJbIAldKj0uKiR8bG9jYWxzdGF0ZWRpciA9ICR7bG9jYWxzdGF0ZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5saWJkaXJbIAldKj0uKiR8bGliZGlyID0gJHtsaWJkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xeaW5jbHVkZWRpclsgCV0qPS4qJHxpbmNsdWRlZGlyID0gJHtpbmNsdWRlZGlyfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8Xm9sZGluY2x1ZGVkaXJbIAldKj0uKiR8b2xkaW5jbHVkZWRpciA9ICR7b2xkaW5jbHVkZWRpcn18IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzfF5pbmZvZGlyWyAJXSo9LiokfGluZm9kaXIgPSAke2luZm9kaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAic3xebWFuZGlyWyAJXSo9LiokfG1hbmRpciA9ICR7bWFuZGlyfXwiIFwKLQkJICAgIC1lICIvXkNDWyAJXSo9L3sKLQkJCTpsb29wMQotCQkJL1xcXFwkLyBOCi0JCQlzL1xcXFxcXG4vL2cKLQkJCXQgbG9vcDEKLQkJCXMlXkNDWyAJXSo9LiokJUNDID0gJHtDQ30lCi0JCQl9IiBcCi0JCSAgICAtZSAiL15DWFhbIAldKj0vewotCQkJOmxvb3AyCi0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wMgotCQkJcyVeQ1hYWyAJXSo9LiokJUNYWCA9ICR7Q1hYfSUKLQkJCX0iIFwKLQkJICAgIC1lICIvXkNGTEFHU1sgCV0qPS97Ci0JCQk6bG9vcDMKLQkJCS9cXFxcJC8gTgotCQkJcy9cXFxcXFxuLy9nCi0JCQl0IGxvb3AzCi0JCQlzJV5DRkxBR1NbIAldKj0uKiQlQ0ZMQUdTID0gJHtDRkxBR1N9JQotCQkJfSIgXAotCQkgICAgLWUgIi9eQ1hYRkxBR1NbIAldKj0vewotCQkJOmxvb3A0Ci0JCQkvXFxcXCQvIE4KLQkJCXMvXFxcXFxcbi8vZwotCQkJdCBsb29wNAotCQkJcyVeQ1hYRkxBR1NbIAldKj0uKiQlQ1hYRkxBR1MgPSAke0NYWEZMQUdTfSUKLQkJCX0iIFwKLQkJICAgIC1lICJzfF5TSEVMTFsJIF0qPS4qJHxTSEVMTCA9ICR7Y29uZmlnX3NoZWxsfXwiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnNyY2RpclsgCV0qPS4qJHxzcmNkaXIgPSAke21ha2VzcmNkaXJ9fCIgXAotICAgICAgICAgICAgICAgICAgICAtZSAicy8MLy8iIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInM6XnByb2dyYW1fcHJlZml4WyAJXSo9LiokOnByb2dyYW1fcHJlZml4ID0gJHtwcm9ncmFtX3ByZWZpeH06IiBcCi0gICAgICAgICAgICAgICAgICAgIC1lICJzOl5wcm9ncmFtX3N1ZmZpeFsgCV0qPS4qJDpwcm9ncmFtX3N1ZmZpeCA9ICR7cHJvZ3JhbV9zdWZmaXh9OiIgXAotICAgICAgICAgICAgICAgICAgICAtZSAiczpecHJvZ3JhbV90cmFuc2Zvcm1fbmFtZVsgCV0qPS4qJDpwcm9ncmFtX3RyYW5zZm9ybV9uYW1lID0gJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lfToiIFwKLSAgICAgICAgICAgICAgICAgICAgLWUgInN8XnRvb2xkaXJbIAldKj0uKiR8dG9vbGRpciA9ICR7dG9vbGRpcn18IiBcCi0JCSAgICAtZSAiczpeREVGQVVMVF9ZQUNDWwkgXSo9LiokOkRFRkFVTFRfWUFDQyA9ICR7REVGQVVMVF9ZQUNDfToiIFwKLQkJICAgIC1lICJzOl5ERUZBVUxUX0xFWFsJIF0qPS4qJDpERUZBVUxUX0xFWCA9ICR7REVGQVVMVF9MRVh9OiIgXAotCQkgICAgLWUgInM6XkRFRkFVTFRfTTRbICBdKj0uKiQ6REVGQVVMVF9NNCA9ICR7REVGQVVMVF9NNH06IiBcCi0gICAgICAgICAgICAgICAgICAgICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0gPj4gJHtNYWtlZmlsZX0KLSAgCi0KLQkgICAgIyBJZiB0aGlzIGlzIGEgQ2FuYWRpYW4gQ3Jvc3MsIHByZXNldCB0aGUgdmFsdWVzIG9mIG1hbnkgbW9yZQotCSAgICAjIHRvb2xzLgotCSAgICBpZiBbICIke2J1aWxkfSIgIT0gIiR7aG9zdH0iIF07IHRoZW4KLQkJZm9yIHZhciBpbiAke3Rvb2xzfTsgZG8KLQkJICAgIHZhbD1gZXZhbCAnZWNobyAkJyIke3Zhcn0iYAotCQkgICAgc2VkIC1lICIvXiR7dmFyfVsgCV0qPS97Ci0JCQkgICA6bG9vcDEKLQkJCSAgIC9cXFxcJC8gTgotCQkJICAgL1xcXFwkLyBiIGxvb3AxCi0JCQkgICBzL1xcXFxcXG4vL2cKLQkJCSAgIHMlXiR7dmFyfVsgCV0qPS4qJCUke3Zhcn0gPSAke3ZhbH0lCi0JCQkgICB9IiAke01ha2VmaWxlfSA+ICR7TWFrZWZpbGV9LnRlbQotCQkgICAgbXYgLWYgJHtNYWtlZmlsZX0udGVtICR7TWFrZWZpbGV9Ci0JCWRvbmUKLQkgICAgZmkKLQotICAgICAgICAgICAgIyBmaW5hbCBjb3B5IG5vdyBpbiAke01ha2VmaWxlfQotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgZWNobyAiTm8gTWFrZWZpbGUuaW4gZm91bmQgaW4gJHtzcmNkaXJ9LyR7c3ViZGlyfSwgdW5hYmxlIHRvIGNvbmZpZ3VyZSIgMT4mMgotICAgICAgICBmaQotCi0gICAgICAgIHJtIC1mICR7c3ViZGlyfS9NYWtlZmlsZS50ZW0KLQotICAgICAgICBjYXNlICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICIiKSB1c2luZz0gOzsKLSAgICAgICAgKikgdXNpbmc9ImFuZCBcIiR7aG9zdF9tYWtlZmlsZV9mcmFnfVwiIiA7OwotICAgICAgICBlc2FjCi0KLSAgICAgICAgY2FzZSAiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30iIGluCi0gICAgICAgICIiKSA7OwotICAgICAgICAqKSB1c2luZz0iJHt1c2luZ30gYW5kIFwiJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ31cIiIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIGNhc2UgIiR7c2l0ZV9tYWtlZmlsZV9mcmFnfSIgaW4KLSAgICAgICAgIiIpIDs7Ci0gICAgICAgICopIHVzaW5nPSIke3VzaW5nfSBhbmQgXCIke3NpdGVfbWFrZWZpbGVfZnJhZ31cIiIgOzsKLSAgICAgICAgZXNhYwotCi0gICAgICAgIG5ld3VzaW5nPWBlY2hvICIke3VzaW5nfSIgfCBzZWQgJ3MvYW5kL3VzaW5nLydgCi0gICAgICAgIHVzaW5nPSR7bmV3dXNpbmd9Ci0gICAgICAgIGVjaG8gIkNyZWF0ZWQgXCIke01ha2VmaWxlfVwiIGluIiAke1BXRD1gcHdkYH0gJHt1c2luZ30KLQotICAgICAgICAuICR7dG1wZmlsZX0ucG9zCi0KLSAgICAgICAgIyBkZXNjcmliZSB0aGUgY2hvc2VuIGNvbmZpZ3VyYXRpb24gaW4gY29uZmlnLnN0YXR1cy4KLSAgICAgICAgIyBNYWtlIHRoYXQgZmlsZSBhIHNoZWxsc2NyaXB0IHdoaWNoIHdpbGwgcmVlc3RhYmxpc2gKLSAgICAgICAgIyB0aGUgc2FtZSBjb25maWd1cmF0aW9uLiAgVXNlZCBpbiBNYWtlZmlsZXMgdG8gcmVidWlsZAotICAgICAgICAjIE1ha2VmaWxlcy4KLQotICAgICAgICBjYXNlICIke25vcmVjdXJzaW9ufSIgaW4KLSAgICAgICAgIiIpIGFyZ3VtZW50cz0iJHthcmd1bWVudHN9IC0tbm9yZWN1cnNpb24iIDs7Ci0gICAgICAgICopIDs7Ci0gICAgICAgIGVzYWMKLQotICAgICAgICBpZiBbICR7c3ViZGlyfSA9IC4gXSA7IHRoZW4KLSAgICAgICAgICAgIGVjaG8gIiMhL2Jpbi9zaAotIyAke05PX0VESVR9Ci0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6Ci0ke3Byb2duYW1lfSIgJHthcmd1bWVudHN9ICAiCi0jICR7dXNpbmd9IiA+ICR7c3ViZGlyfS9jb25maWcubmV3Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVjaG8gIiMhL2Jpbi9zaAotIyAke05PX0VESVR9Ci0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6Ci1jZCAke2ludnN1YmRpcn0KLSR7cHJvZ25hbWV9IiAke2FyZ3VtZW50c30gICIKLSMgJHt1c2luZ30iID4gJHtzdWJkaXJ9L2NvbmZpZy5uZXcKLSAgICAgICAgZmkKLSAgICAgICAgY2htb2QgYSt4ICR7c3ViZGlyfS9jb25maWcubmV3Ci0gICAgICAgIGlmIFsgLXIgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgbXYgLWYgJHtzdWJkaXJ9L2NvbmZpZy5iYWNrICR7c3ViZGlyfS9jb25maWcuc3RhdHVzCi0gICAgICAgIGZpCi0JJHtjb25maWdfc2hlbGx9ICR7bW92ZWlmY2hhbmdlfSAke3N1YmRpcn0vY29uZmlnLm5ldyAke3N1YmRpcn0vY29uZmlnLnN0YXR1cwotICAgICAgICA7OwotCi0gICAgKikgIHJtIC1mICR7TWFrZWZpbGV9ICR7c3ViZGlyfS9jb25maWcuc3RhdHVzICR7bGlua3N9IDs7Ci0gICAgZXNhYwotZG9uZQotCi0jIElmIHRoZXJlIGFyZSBzdWJkaXJlY3RvcmllcywgdGhlbiByZWN1ci4KLWlmIFsgLXogIiR7bm9yZWN1cnNpb259IiBdICYmIFsgLW4gIiR7Y29uZmlnZGlyc30iIF0gOyB0aGVuIAotICAgICAgICBmb3IgY29uZmlnZGlyIGluICR7Y29uZmlnZGlyc30gJHtleHRyYWNvbmZpZ2RpcnN9IDsgZG8KLQotCQkjIElmIGNvbmZpZ2RpciBjb250YWlucyAnLCcgaXQgaXMKLQkJIyBzcmNkaXIsYnVpbGRkaXIsdGFyZ2V0X2FsaWFzCi0JCSMgVGhlc2UgY29tZSBmcm9tIGV4dHJhY29uZmlnZGlycy4KLQkJY2FzZSAke2NvbmZpZ2Rpcn0gaW4KLQkJKiwqKQotCQkgICAgZXZhbCBgZWNobyAke2NvbmZpZ2Rpcn0gfCBzZWQgLWUgJ3MvXChbXixdKlwpLFwoW14sXSpcKSxcKC4qXCkvY2ZnX2Rpcj1cMSBibGRfZGlyPVwyIHRndF9hbGlhcz1cMy8nYAotCQkgICAgOzsKLQkJKikKLQkJICAgIGNmZ19kaXI9JHtjb25maWdkaXJ9Ci0JCSAgICBibGRfZGlyPSR7Y29uZmlnZGlyfQotCQkgICAgdGd0X2FsaWFzPSR7dGFyZ2V0X2FsaWFzfQotCQkgICAgOzsKLQkJZXNhYwotCi0gICAgICAgICAgICAgICAgaWYgWyAtZCAke3NyY2Rpcn0vJHtjZmdfZGlyfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgZXZhbCBlY2hvIENvbmZpZ3VyaW5nICR7Y29uZmlnZGlyfS4uLiAke3JlZGlyZWN0fQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzcmNkaXJ9IiBpbgotICAgICAgICAgICAgICAgICAgICAgICAgIi4iKSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAhIC1kIC4vJHtibGRfZGlyfSBdIDsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1rZGlyIC4vJHtibGRfZGlyfSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICcqKionICIke3Byb2duYW1lfTogY291bGQgbm90IG1ha2UgJHtQV0Q9YHB3ZGB9LyR7YmxkX2Rpcn0iIDE+JjIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlc2FjCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBPUERJUj0ke1BXRD1gcHdkYH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNkICR7YmxkX2Rpcn0gCi0KLSMjIyBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCBzcmNkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c3JjZGlyfSIgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICIuIikgbmV3c3JjZGlyPSR7c3JjZGlyfSA7OyAjIG5vIC1zcmNkaXIgb3B0aW9uLiAgV2UncmUgYnVpbGRpbmcgaW4gcGxhY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAvKikgIyBhYnNvbHV0ZSBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NyY2Rpcj0ke3NyY2Rpcn0vJHtjZmdfZGlyfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7bmV3c3JjZGlyfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgID86KikgIyBhYnNvbHV0ZSBwYXRoIG9uIHdpbjMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NyY2Rpcj0ke3NyY2Rpcn0vJHtjZmdfZGlyfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7bmV3c3JjZGlyfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICopICMgb3RoZXJ3aXNlIHJlbGF0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3NyY2Rpcj0uLi8ke3NyY2Rpcn0vJHtjZmdfZGlyfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNkaXJvcHRpb249Ii0tc3JjZGlyPSR7bmV3c3JjZGlyfSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKLQotCQkJIyBIYW5kbGUgLS1jYWNoZS1maWxlPS4uL1hYWAotCQkJY2FzZSAiJHtjYWNoZV9maWxlfSIgaW4KLQkJCSIiKSAjIGVtcHR5Ci0JCQkJOzsKLQkJCS8qKSAjIGFic29sdXRlIHBhdGgKLQkJCQljYWNoZV9maWxlX29wdGlvbj0iLS1jYWNoZS1maWxlPSR7Y2FjaGVfZmlsZX0iCi0JCQkJOzsKLQkJCT86KikgIyBhYnNvbHV0ZSBwYXRoIG9uIHdpbjMyCi0JCQkJY2FjaGVfZmlsZV9vcHRpb249Ii0tY2FjaGUtZmlsZT0ke2NhY2hlX2ZpbGV9IgotCQkJCTs7Ci0JCQkqKSAjIHJlbGF0aXZlIHBhdGgKLQkJCQljYWNoZV9maWxlX29wdGlvbj0iLS1jYWNoZS1maWxlPS4uLyR7Y2FjaGVfZmlsZX0iCi0JCQkJOzsKLQkJCWVzYWMKLQotIyMjIGNoZWNrIGZvciBndWVzdGVkIGNvbmZpZ3VyZSwgb3RoZXJ3aXNlIGZpeCBwb3NzaWJseSByZWxhdGl2ZSBwcm9nbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAtZiAke25ld3NyY2Rpcn0vY29uZmlndXJlIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Byb2c9JHtuZXdzcmNkaXJ9L2NvbmZpZ3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBbIC1mICR7bmV3c3JjZGlyfS9jb25maWd1cmUuaW4gXSA7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtwcm9nbmFtZX0iIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKSAgICAgcmVjcHJvZz0ke3Byb2duYW1lfSA7OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/OiopICAgIHJlY3Byb2c9JHtwcm9nbmFtZX0gOzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKikgICAgICByZWNwcm9nPS4uLyR7cHJvZ25hbWV9IDs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzYWMKLQkJCWVsc2UKLQkJCQlldmFsIGVjaG8gTm8gY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiAke2NmZ19kaXJ9ICR7cmVkaXJlY3R9Ci0JCQkJcmVjcHJvZz0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpCi0KLSMjIyBUaGUgcmVjdXJzaW9uIGxpbmUgaXMgaGVyZS4KLQkJCWlmIFsgISAteiAiJHtyZWNwcm9nfSIgXSA7IHRoZW4KLQkgICAgICAgICAgICAgICAgICAgICAgICBpZiBldmFsICR7Y29uZmlnX3NoZWxsfSAke3JlY3Byb2d9ICR7dmVyYm9zZX0gJHtidWlsZG9wdH0gLS1ob3N0PSR7aG9zdF9hbGlhc30gLS10YXJnZXQ9JHt0Z3RfYWxpYXN9IFwKLSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICR7cHJlZml4b3B0aW9ufSAke3RtcGRpcm9wdGlvbn0gJHtleGVjX3ByZWZpeG9wdGlvbn0gXAotICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgJHtzcmNkaXJvcHRpb259ICR7ZGlyb3B0aW9uc30gJHtwcm9ncmFtX3ByZWZpeG9wdGlvbn0gJHtwcm9ncmFtX3N1ZmZpeG9wdGlvbn0gJHtwcm9ncmFtX3RyYW5zZm9ybV9uYW1lb3B0aW9ufSAke3NpdGVfb3B0aW9ufSAke3dpdGhvcHRpb25zfSAke3dpdGhvdXRvcHRpb25zfSAke2VuYWJsZW9wdGlvbnN9ICR7ZGlzYWJsZW9wdGlvbnN9ICR7ZmxvYXRpbmdfcG9pbnRvcHRpb259ICR7Y2FjaGVfZmlsZV9vcHRpb259ICR7cmVtb3Zpbmd9ICR7b3RoZXJfb3B0aW9uc30gJHtyZWRpcmVjdH0gOyB0aGVuCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlCi0gICAgICAgIAkgICAgICAgICAgICAgICAgZWxzZQotCQkJCQllY2hvIENvbmZpZ3VyZSBpbiBgcHdkYCBmYWlsZWQsIGV4aXRpbmcuIDE+JjIKLSAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgICAgICAgICAgICAgCWZpCi0JCQlmaQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjZCAke1BPUERJUn0KLSAgICAgICAgICAgICAgICBmaQotICAgICAgICBkb25lCi1maQotCi0jIFBlcmZvcm0gdGhlIHNhbWUgY2xlYW51cCBhcyB0aGUgdHJhcCBoYW5kbGVyLCBtaW51cyB0aGUgImV4aXQgMSIgb2YgY291cnNlLAotIyBhbmQgcmVzZXQgdGhlIHRyYXAgaGFuZGxlci4KLXJtIC1mICR7dG1wZmlsZX0uY29tICR7dG1wZmlsZX0udGd0ICR7dG1wZmlsZX0uaHN0ICR7dG1wZmlsZX0ucG9zCi10cmFwIDAKLQotZXhpdCAwCi0KLSMKLSMgTG9jYWwgVmFyaWFibGVzOgotIyBmaWxsLWNvbHVtbjogMTMxCi0jIEVuZDoKLSMKLQotIyBlbmQgb2YgY29uZmlndXJlCmRpZmYgLS1naXQgYS9jb25maWd1cmUuYmF0IGIvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2YTM3ZS4uMDAwMDAwMAotLS0gYS9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotY2hkaXIgbGliaWJlcnR5DQotY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxiZmQNCi1jYWxsIGNvbmZpZ3VyZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXG9wY29kZXMNCi1jYWxsIGNvbmZpZ3VyZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXGdwcm9mDQotY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxiaW51dGlscw0KLWNhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cZ2FzDQotY2FsbCBjb25maWd1cmUgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkNCi1jaGRpciAuLlxsZA0KLWNhbGwgY29uZmlndXJlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi4NCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTVjNDMuLjAwMDAwMDAKLS0tIGEvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTE4NCArMCwwIEBACi0jISAvYmluL2Jhc2gKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgdGhhdCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24KLSMjIG5lY2Vzc2FyeSB0byB0YWlsb3IgYSB0ZW1wbGF0ZSBjb25maWd1cmUgc2NyaXB0IGludG8gdGhlIGNvbmZpZ3VyZQotIyMgc2NyaXB0IGFwcHJvcHJpYXRlIGZvciB0aGlzIGRpcmVjdG9yeS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBjaGVjawotIyMgYW55IGV4aXN0aW5nIGNvbmZpZ3VyZSBzY3JpcHQuICAKLQotIyMgQmUgd2FybmVkLCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIGNvbmZpZ3VyZS5pbiBmaWxlcy4gIFRoZXJlIGFyZSB0aG9zZQotIyMgdXNlZCBieSBBdXRvY29uZiwgd2hpY2ggYXJlIG1hY3JvcyB3aGljaCBhcmUgZXhwYW5kZWQgaW50byBhIGNvbmZpZ3VyZQotIyMgc2NyaXB0IGJ5IGF1dG9jb25mLiAgVGhlIG90aGVyIHNvcnQsIG9mIHdoaWNoIHRoaXMgaXMgb25lLCBpcyBleGVjdXRlZAotIyMgYnkgQ3lnbnVzIGNvbmZpZ3VyZS4gIAotCi0jIyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZSB0d28gc3lzdGVtcywgY2hlY2sgb3V0IHRoZSBkb2N1bWVudGF0aW9uCi0jIyBmb3IgJ0F1dG9jb25mJyAoYXV0b2NvbmYudGV4aSkgYW5kICdDb25maWd1cmUnIChjb25maWd1cmUudGV4aSkuICAKLQotIyAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIFRvIGFkZCBhIG5ldyBkaXJlY3RvcnkgdG8gdGhlIHRyZWUsIGZpcnN0IGNob29zZSB3aGV0aGVyIGl0IGlzIGEgdGFyZ2V0Ci0jIyMgb3IgYSBob3N0IGRlcGVuZGVudCB0b29sLiAgVGhlbiBwdXQgaXQgaW50byB0aGUgYXBwcm9wcmlhdGUgbGlzdAotIyMjIChsaWJyYXJ5IG9yIHRvb2xzLCBob3N0IG9yIHRhcmdldCksIGRvaW5nIGEgZGVwZW5kZW5jeSBzb3J0LiAgRm9yCi0jIyMgZXhhbXBsZSwgZ2RiIHJlcXVpcmVzIHRoYXQgYnlhY2MgKG9yIGJpc29uKSBiZSBidWlsdCBmaXJzdCwgc28gaXQgaXMgaW4KLSMjIyB0aGUgJHtob3N0X3Rvb2xzfSBsaXN0IGFmdGVyIGJ5YWNjIGFuZCBiaXNvbi4gIAotCi0KLSMgdGhlc2UgbGlicmFyaWVzIGFyZSB1c2VkIGJ5IHZhcmlvdXMgcHJvZ3JhbXMgYnVpbHQgZm9yIHRoZSBob3N0IGVudmlyb25tZW50Ci0jCi1ob3N0X2xpYnM9ImludGwgbW1hbGxvYyBsaWJpYmVydHkgb3Bjb2RlcyBiZmQgcmVhZGxpbmUgZ2FzaCBkYiB0Y2wgdGsgdGNsOC4xIHRrOC4xIHRjbFggaXRjbCB0aXggbGliZ3VpIgotCi1pZiBbICIke2VuYWJsZV9nZGJndWl9IiA9ICJ5ZXMiIF0gOyB0aGVuCi0JaG9zdF9saWJzPSIke2hvc3RfbGlic30gbGliZ3VpIgotZmkKLQotIyB0aGVzZSB0b29scyBhcmUgYnVpbHQgZm9yIHRoZSBob3N0IGVudmlyb25tZW50Ci0jIE5vdGUsIHRoZSBwb3dlcnBjLWVhYmkgYnVpbGQgZGVwZW5kcyBvbiBzaW0gb2NjdXJyaW5nIGJlZm9yZSBnZGIgaW4gb3JkZXIgdG8KLSMga25vdyB0aGF0IHdlIGFyZSBidWlsZGluZyB0aGUgc2ltdWxhdG9yLgotaG9zdF90b29scz0idGV4aW5mbyBieWFjYyBmbGV4IGJpc29uIGJpbnV0aWxzIGxkIGdhcyBnY2Mgc2ltIGdkYiBtYWtlIHBhdGNoIHBybXMgc2VuZC1wciBncHJvZiBnZGJ0ZXN0IHRnYXMgZXRjIGV4cGVjdCBkZWphZ251IGFzaCBiYXNoIGJ6aXAyIG00IGF1dG9jb25mIGF1dG9tYWtlIGxpYnRvb2wgaXNwZWxsIGdyZXAgZGlmZiByY3MgY3Zzc3JjIGZpbGV1dGlscyBzaGVsbHV0aWxzIHRpbWUgdGV4dHV0aWxzIHdkaWZmIGZpbmQgZW1hY3MgZW1hY3MxOSB1dWRlY29kZSBoZWxsbyB0YXIgZ3ppcCBpbmRlbnQgcmVjb2RlIHJlbGVhc2Ugc2VkIHV0aWxzIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgZ2F3ayBmaW5kdXRpbHMgc25hdmlnYXRvciBsaWJ0b29sIGdldHRleHQgemlwIgotCi0jIHRoZXNlIGxpYnJhcmllcyBhcmUgYnVpbHQgZm9yIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQsIGFuZCBhcmUgYnVpbHQgYWZ0ZXIKLSMgdGhlIGhvc3QgbGlicmFyaWVzIGFuZCB0aGUgaG9zdCB0b29scyAod2hpY2ggbWF5IGJlIGEgY3Jvc3MgY29tcGlsZXIpCi0jCi10YXJnZXRfbGlicz0idGFyZ2V0LWxpYmliZXJ0eSBcCi0JCXRhcmdldC1saWJnbG9zcyBcCi0JCXRhcmdldC1uZXdsaWIgXAotCQl0YXJnZXQtbGliaW8gXAotCQl0YXJnZXQtbGlicnggXAotCQl0YXJnZXQtbGlic3RkYysrIFwKLQkJdGFyZ2V0LWxpYmcrKyIKLQotIyB0aGVzZSB0b29scyBhcmUgYnVpbHQgdXNpbmcgdGhlIHRhcmdldCBsaWJzLCBhbmQgYXJlIGludGVuZGVkIHRvIHJ1biBvbmx5Ci0jIGluIHRoZSB0YXJnZXQgZW52aXJvbm1lbnQKLSMKLSMgbm90ZTogYW55IHByb2dyYW0gdGhhdCAqdXNlcyogbGlicmFyaWVzIHRoYXQgYXJlIGluIHRoZSAidGFyZ2V0X2xpYnMiCi0jIGxpc3QgYmVsb25ncyBpbiB0aGlzIGxpc3QuICB0aG9zZSBwcm9ncmFtcyBhcmUgYWxzbyB2ZXJ5IGxpa2VseQotIyBjYW5kaWRhdGVzIGZvciB0aGUgIm5hdGl2ZV9vbmx5IiBsaXN0IHdoaWNoIGZvbGxvd3MKLSMKLXRhcmdldF90b29scz0idGFyZ2V0LWV4YW1wbGVzIHRhcmdldC1ncm9mZiB0YXJnZXQtZ3BlcmYiCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIFRoZXNlIHR3byBsaXN0cyBhcmUgb2YgZGlyZWN0b3JpZXMgdGhhdCBhcmUgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZQotIyMgJHtjb25maWdkaXJzfSBsaXN0IGZvciBlaXRoZXIgY3Jvc3MtY29tcGlsYXRpb25zIG9yIGZvciBuYXRpdmUtCi0jIyBjb21waWxhdGlvbnMuICBGb3IgZXhhbXBsZSwgaXQgZG9lc24ndCBtYWtlIHRoYXQgbXVjaCBzZW5zZSB0bwotIyMgY3Jvc3MtY29tcGlsZSBFbWFjcywgbm9yIGlzIGl0IHRlcnJpYmx5IHVzZWZ1bCB0byBjb21waWxlIHRhcmdldC1saWJpYmVydHkgaW4KLSMjIGEgbmF0aXZlIGVudmlyb25tZW50LiAgCi0KLSMgZGlyZWN0b3JpZXMgdG8gYmUgYnVpbHQgaW4gdGhlIG5hdGl2ZSBlbnZpcm9ubWVudCBvbmx5Ci0jCi0jIFRoaXMgbXVzdCBiZSBhIHNpbmdsZSBsaW5lIGJlY2F1c2Ugb2YgdGhlIHdheSBpdCBpcyBzZWFyY2hlZCBieSBncmVwIGluCi0jIHRoZSBjb2RlIGJlbG93LgotbmF0aXZlX29ubHk9ImF1dG9jb25mIGF1dG9tYWtlIGxpYnRvb2wgY3Zzc3JjIGVtYWNzIGVtYWNzMTkgZmlsZXV0aWxzIGZpbmQgZ2F3ayBnZXR0ZXh0IGdyZXAgZ3ppcCBoZWxsbyBpbmRlbnQgaXNwZWxsIG00IHJjcyByZWNvZGUgc2VkIHNoZWxsdXRpbHMgdGFyIHRleHR1dGlscyBnYXNoIHV1ZGVjb2RlIHdkaWZmIGdwcm9mIHRhcmdldC1ncm9mZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IHRpbWUgYXNoIGJhc2ggYnppcDIgcHJtcyBzbmF2aWdhdG9yIGdudXNlcnYgdGFyZ2V0LWdwZXJmIgotCi0jIGRpcmVjdG9yaWVzIHRvIGJlIGJ1aWx0IGluIGEgY3Jvc3MgZW52aXJvbm1lbnQgb25seQotIwotY3Jvc3Nfb25seT0idGFyZ2V0LWxpYmdsb3NzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWN5Z21vbiB0YXJnZXQtb3Bjb2RlcyB0YXJnZXQtbGlic3R1YiIKLQotIyMgQWxsIHRvb2xzIGJlbG9uZyBpbiBvbmUgb2YgdGhlIGZvdXIgY2F0ZWdvcmllcywgYW5kIGFyZSBhc3NpZ25lZCBhYm92ZQotIyMgV2UgYXNzaWduICR7Y29uZmlnZGlyc30gdGhpcyB3YXkgdG8gcmVtb3ZlIGFsbCBlbWJlZGRlZCBuZXdsaW5lcy4gIFRoaXMKLSMjIGlzIGltcG9ydGFudCBiZWNhdXNlIGNvbmZpZ3VyZSB3aWxsIGNob2tlIGlmIHRoZXkgZXZlciBnZXQgdGhyb3VnaC4KLSMjICR7Y29uZmlnZGlyc30gaXMgZGlyZWN0b3JpZXMgd2UgYnVpbGQgdXNpbmcgdGhlIGhvc3QgdG9vbHMuCi0jIyAke3RhcmdldF9jb25maWdkaXJzfSBpcyBkaXJlY3RvcmllcyB3ZSBidWlsZCB1c2luZyB0aGUgdGFyZ2V0IHRvb2xzLgotIwotY29uZmlnZGlycz1gZWNobyAke2hvc3RfbGlic30gJHtob3N0X3Rvb2xzfWAKLXRhcmdldF9jb25maWdkaXJzPWBlY2hvICR7dGFyZ2V0X2xpYnN9ICR7dGFyZ2V0X3Rvb2xzfWAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotc3JjdHJpZ2dlcj1tb3ZlLWlmLWNoYW5nZQotc3JjbmFtZT0iZ251IGRldmVsb3BtZW50IHBhY2thZ2UiCi0KLSMgVGhpcyBnZXRzIHNldCBub24tZW1wdHkgZm9yIHNvbWUgbmV0IHJlbGVhc2VzIG9mIHBhY2thZ2VzLgotYXBwZGlycz0iIgotCi0jIHBlci1ob3N0OgotCi0jIFdvcmsgaW4gZGlzdHJpYnV0aW9ucyB0aGF0IGNvbnRhaW4gbm8gY29tcGlsZXIgdG9vbHMsIGxpa2UgQXV0b2NvbmYuCi1pZiBbIC1kICR7c3JjZGlyfS9jb25maWcgXTsgdGhlbgotY2FzZSAiJHtob3N0fSIgaW4KLSAgbTY4ay1ocC1ocHV4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaHAzMDAiCi0gICAgOzsKLSAgbTY4ay1hcG9sbG8tc3lzdiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWFwb2xsbzY4IgotICAgIDs7Ci0gIG02OGstYXBvbGxvLWJzZCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWE2OGJzZCIKLSAgICA7OwotICBtODhrLWRnLWRndXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kZ3V4IgotICAgIDs7Ci0gIG04OGstaGFycmlzLWN4dXgqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1jeHV4IgotICAgIDs7Ci0gIG04OGstbW90b3JvbGEtc3lzdiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRlbHRhODgiCi0gICAgOzsKLSAgbWlwcyotZGVjLXVsdHJpeCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRlY3N0YXRpb24iCi0gICAgOzsKLSAgbWlwcyotbmVjLXN5c3Y0KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbmVjdjQiCi0gICAgOzsKLSAgbWlwcyotc2dpLWlyaXg2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaXJpeDYiCi0gICAgOzsKLSAgbWlwcyotc2dpLWlyaXg1KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaXJpeDUiCi0gICAgOzsKLSAgbWlwcyotc2dpLWlyaXg0KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaXJpeDQiCi0gICAgOzsKLSAgbWlwcyotc2dpLWlyaXgzKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdiIKLSAgICA7OwotICBtaXBzKi0qLXN5c3Y0KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjQiCi0gICAgOzsKLSAgbWlwcyotKi1zeXN2KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtcmlzY29zIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXN5c3Y1KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjUiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotZGd1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWRndXgzODYiCi0gICAgOzsKLSAgaVszNDU2XTg2LW5jci1zeXN2NC4zKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbmNyc3ZyNDMiCi0gICAgOzsKLSAgaVszNDU2XTg2LW5jci1zeXN2NCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLW5jcjMwMDAiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc2NvMy4ydjUqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNjbyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXNjbyIKLSAgICA7OwotICBpWzM0NTZdODYtKi11ZGsqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2NSIKLSAgICA7OwotICBpWzM0NTZdODYtKi1pc2MqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjQiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotYWl4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYWl4Mzg2IgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1kamdwcCIKLSAgICA7OwotICAqLWN5Z3dpbiopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWN5Z3dpbiIKLSAgICA7OwotICAqLW1pbmd3MzIqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1taW5ndzMyIgotICAgIDs7Ci0gICotaW50ZXJpeCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWludGVyaXgiCi0gICAgOzsKLSAgKi13aW5kb3dzKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtd2luZG93cyIKLSAgICA7OwotICB2YXgtKi11bHRyaXgyKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtdmF4dWx0MiIKLSAgICA7OwotICAqLSotc29sYXJpczIqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zb2xhcmlzIgotICAgIDs7Ci0gIG02OGstc3VuLXN1bm9zKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3VuMyIKLSAgICA7OwotICAqLWhwLWhwdXhbNzhdKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaHB1eDgiCi0gICAgOzsKLSAgKi1ocC1ocHV4KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtaHB1eCIKLSAgICA7OwotICAqLSotaGl1eCopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWhwdXgiCi0gICAgOzsKLSAgcnM2MDAwLSotbHlueG9zKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtbHlueHJzNmsiCi0gICAgOzsKLSAgKi0qLWx5bnhvcyopCi0gICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLWx5bnhvcyIKLSAgICA7OwotICAqLSotYWl4NC5bMzQ1Njc4OV0qIHwgKi0qLWFpeFs1Njc4OV0uKikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYWl4NDMiCi0gICAgOzsKLSAgKi0qLXN5c3Y0KikKLSAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3lzdjQiCi0gICAgOzsKLSAgKi0qLXN5c3YqKQotICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1zeXN2IgotICAgIDs7Ci1lc2FjCi1maQotCi0jIElmIHdlIGFyZW4ndCBnb2luZyB0byBiZSB1c2luZyBnY2MsIHNlZSBpZiB3ZSBjYW4gZXh0cmFjdCBhIGRlZmluaXRpb24KLSMgb2YgQ0MgZnJvbSB0aGUgZnJhZ21lbnQuCi1pZiBbIC16ICIke0NDfSIgXSAmJiBbICIke2J1aWxkfSIgPSAiJHtob3N0fSIgXTsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3VuZD0KLSAgZm9yIGRpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgIGlmIHRlc3QgLWYgJGRpci9nY2M7IHRoZW4KLSAgICAgIGZvdW5kPXllcwotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotICBpZiBbIC16ICIke2ZvdW5kfSIgXSAmJiBbIC1uICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIF0gJiYgWyAtZiAiJHtzcmNkaXJ9LyR7aG9zdF9tYWtlZmlsZV9mcmFnfSIgXTsgdGhlbgotICAgIHh4PWBzZWQgLW4gLWUgJ3MvXlsgCV0qQ0NbIAldKj1bIAldKlwoLipcKSQvXDEvcCcgPCAke3NyY2Rpcn0vJHtob3N0X21ha2VmaWxlX2ZyYWd9YAotICAgIGlmIFsgLW4gIiR7eHh9IiBdIDsgdGhlbgotICAgICAgQ0M9JHh4Ci0gICAgZmkKLSAgZmkKLWZpCi0KLSMgV2UgZGVmYXVsdCB0byAtLXdpdGgtc2hhcmVkIG9uIHBsYXRmb3JtcyB3aGVyZSAtZnBpYyBpcyBtZWFuaW5nbGVzcy4KLSMgV2VsbCwgd2UgZG9uJ3QgeWV0LCBidXQgd2Ugd2lsbC4KLWlmIGZhbHNlICYmIFsgIiR7aG9zdH0iID0gIiR7dGFyZ2V0fSIgXSAmJiBbIHgke2VuYWJsZV9zaGFyZWR9ID0geCBdOyB0aGVuCi0gIGNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgICBhbHBoYSotZGVjLW9zZiopCWVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci0gICAgYWxwaGEqLSotbGludXgqKQllbmFibGVfc2hhcmVkPXllcyA7OwotICAgIG1pcHMtc2dpLWlyaXg1KikJZW5hYmxlX3NoYXJlZD15ZXMgOzsKLSAgICAqKQkJCWVuYWJsZV9zaGFyZWQ9bm8gOzsKLSAgZXNhYwotZmkKLQotY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLSAgeWVzKSBzaGFyZWQ9eWVzIDs7Ci0gIG5vKSBzaGFyZWQ9bm8gOzsKLSAgIiIpIHNoYXJlZD1ubyA7OwotICAqKSBzaGFyZWQ9eWVzIDs7Ci1lc2FjCi0KLWlmIFsgeCR7c2hhcmVkfSA9IHh5ZXMgXTsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotICAgIGFscGhhKi0qLWxpbnV4KikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1lbGZhbHBoYXBpYyIKLSAgICAgIDs7Ci0gICAgYXJtKi0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtYXJtcGljIgotICAgICAgOzsKLSAgICBocHBhKi0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtcGFwaWMiCi0gICAgICA7OwotICAgIGlbMzQ1Nl04Ni0qLWN5Z3dpbiopCi0gICAgICAjIFdlIGRvbid0IHdhbnQgLWZQSUMgb24gQ3lnd2luLgotICAgICAgOzsKLSAgICBpWzM0NTZdODYtKi0qKQotICAgICAgaG9zdF9tYWtlZmlsZV9mcmFnPSIke2hvc3RfbWFrZWZpbGVfZnJhZ30gY29uZmlnL21oLXg4NnBpYyIKLSAgICAgIDs7Ci0gICAgc3BhcmM2NC0qLSopCi0gICAgICBob3N0X21ha2VmaWxlX2ZyYWc9IiR7aG9zdF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbWgtc3BhcmNwaWMiCi0gICAgICA7OwotICAgIHBvd2VycGMqLSotYWl4KikKLSAgICAgICMgV2UgZG9uJ3Qgd2FudCAtZlBJQyBvbiBBSVguCi0gICAgICA7OwotICAgIHBvd2VycGMqLSotKikKLSAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC1wcGNwaWMiCi0gICAgICA7OwotICAgICotKi0qKQotICAgICAgaWYgdGVzdCAtZiAke3NyY2Rpcn0vY29uZmlnL21oLSR7aG9zdF9jcHV9cGljOyB0aGVuCi0gICAgICAgIGhvc3RfbWFrZWZpbGVfZnJhZz0iJHtob3N0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9taC0ke2hvc3RfY3B1fXBpYyIKLSAgICAgIGZpCi0gICAgICA7OwotICBlc2FjCi1maQotCi1ybSAtZiBtaC1mcmFnCi1pZiBbIC1uICIke2hvc3RfbWFrZWZpbGVfZnJhZ30iIF0gOyB0aGVuCi0gIGZvciBmIGluICR7aG9zdF9tYWtlZmlsZV9mcmFnfQotICBkbwotICAgIGNhdCAke3NyY2Rpcn0vJGYgPj4gbWgtZnJhZwotICBkb25lCi0gIGhvc3RfbWFrZWZpbGVfZnJhZz1taC1mcmFnCi1maQotCi0jIHBlci10YXJnZXQ6Ci0KLWNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgdjgxMCopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC12ODEwIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLW5ldHdhcmUqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtbmV0d2FyZSIKLSAgICA7OwotICBwb3dlcnBjLSotbmV0d2FyZSopCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1uZXR3YXJlIgotICAgIDs7Ci0gICotKi1saW51eC1nbnUpCi0gICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1saW51eCIKLSAgICA7OwotZXNhYwotCi0jIElmIC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSBhbHdheXMgdXNlIC1PcyBpbnN0ZWFkIG9mIC1PMiB0byBidWlsZAotIyB0aGUgdGFyZ2V0IGxpYnJhcmllcywgc2ltaWxhcmx5IGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQsIHVzZSAtT3MKLSMgb24gc2VsZWN0ZWQgcGxhdGZvcm1zLgotY2FzZSAiJHtlbmFibGVfdGFyZ2V0X29wdHNwYWNlfToke3RhcmdldH0iIGluCi0gIHllczoqKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtb3NwYWNlIgotICAgIDs7Ci0gICMgQ1lHTlVTIExPQ0FMIGQxMHYsIGQzMHYsIGZyMzAKLSAgOmQzMHYtKikKLSAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LWQzMHYiCi0gICAgOzsKLSAgOm0zMnItKiB8IDpkMTB2LSogfCA6ZnIzMC0qKQotICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtb3NwYWNlIgotICAgIDs7Ci0gIG5vOiogfCA6KikKLSAgICA7OwotICAqKQotICAgIGVjaG8gIioqKiBiYWQgdmFsdWUgXCIke2VuYWJsZV90YXJnZXRfb3B0c3BhY2V9XCIgZm9yIC0tZW5hYmxlLXRhcmdldC1vcHRzcGFjZSBmbGFnOyBpZ25vcmVkIiAxPiYyCi0gICAgOzsKLWVzYWMKLQotc2tpcGRpcnM9Ci1nYXNkaXI9Z2FzCi11c2VfZ251X2xkPQotdXNlX2dudV9hcz0KLQotIyBzb21lIHRvb2xzIGFyZSBzbyBkZXBlbmRlbnQgdXBvbiBYMTEgdGhhdCBpZiB3ZSdyZSBub3QgYnVpbGRpbmcgd2l0aCBYLCAKLSMgaXQncyBub3QgZXZlbiB3b3J0aCB0cnlpbmcgdG8gY29uZmlndXJlLCBtdWNoIGxlc3MgYnVpbGQsIHRoYXQgdG9vbC4KLQotY2FzZSAke3dpdGhfeH0gaW4KLSAgeWVzIHwgIiIpICAjIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHRyZWUgaXMgdGhhdCBYMTEgaXMgYXZhaWxhYmxlCi0JOzsKLSAgbm8pCi0Jc2tpcGRpcnM9IiR7c2tpcGRpcnN9IHRrIGxpYmd1aSBnYXNoIgotCTs7Ci0gICopCi0gICAgCWVjaG8gIioqKiBiYWQgdmFsdWUgXCIke3dpdGhfeH1cIiBmb3IgLXdpdGgteCBmbGFnOyBpZ25vcmVkIiAxPiYyCi0gICAgCTs7Ci1lc2FjCi0KLSMgU29tZSB0b29scyBhcmUgb25seSBzdWl0YWJsZSBmb3IgYnVpbGRpbmcgaW4gYSAibmF0aXZlIiBzaXR1YXRpb24uCi0jIFRob3NlIGFyZSBhZGRlZCB3aGVuIHdlIGhhdmUgYSBob3N0PT10YXJnZXQgY29uZmlndXJhdGlvbi4gIEZvciBjcm9zcwotIyB0b29sY2hhaW5zLCB3ZSBhZGQgc29tZSBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWZ1bCBpbiBhCi0jIGNyb3NzLWNvbXBpbGVyLgotCi1pc19jcm9zc19jb21waWxlcj0KLQotaWYgWyB4IiR7aG9zdH0iID0geCIke3RhcmdldH0iIF0gOyB0aGVuCi0JIyB3aGVuIGRvaW5nIGEgbmF0aXZlIHRvb2xjaGFpbiwgZG9uJ3QgYnVpbGQgdGhlIHRhcmdldHMKLQkjIHRoYXQgYXJlIGluIHRoZSAnY3Jvc3Mgb25seScgbGlzdAotCXNraXBkaXJzPSIke3NraXBkaXJzfSAke2Nyb3NzX29ubHl9IgotCWlzX2Nyb3NzX2NvbXBpbGVyPW5vCi1lbHNlCi0JIyBzaW1pbGFybHksIGRvbid0IGJ1aWxkIHRoZSB0YXJnZXRzIGluIHRoZSAnbmF0aXZlIG9ubHknIAotCSMgbGlzdCB3aGVuIGJ1aWxkaW5nIGEgY3Jvc3MgY29tcGlsZXIKLQlza2lwZGlycz0iJHtza2lwZGlyc30gJHtuYXRpdmVfb25seX0iCi0JaXNfY3Jvc3NfY29tcGlsZXI9eWVzCi1maQkKLQotIyBXZSBhbHdheXMgd2FudCB0byB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgdGhpcyBkaXJlY3RvcnksIHNvIHRoYXQgZGVqYWdudQotIyBjYW4gcmVsaWFibHkgZmluZCBpdC4KLXRhcmdldF9zdWJkaXI9JHt0YXJnZXRfYWxpYXN9Ci0KLWlmIFsgISAtZCAke3RhcmdldF9zdWJkaXJ9IF0gOyB0aGVuCi0gIGlmIG1rZGlyICR7dGFyZ2V0X3N1YmRpcn0gOyB0aGVuIHRydWUKLSAgZWxzZQotICAgIGVjaG8gIicqKiogY291bGQgbm90IG1ha2UgJHtQV0Q9YHB3ZGB9LyR7dGFyZ2V0X3N1YmRpcn0iIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLWZpCi0KLWNvcHlfZGlycz0KLQotIyBIYW5kbGUgLS13aXRoLWhlYWRlcnM9WFhYLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBuYW1lZCBkaXJlY3RvcnkgYXJlCi0jIGNvcGllZCB0byAkKHRvb2xkaXIpL3N5cy1pbmNsdWRlLgotaWYgWyB4IiR7d2l0aF9oZWFkZXJzfSIgIT0geCBdOyB0aGVuCi0gIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ID0geG5vIF07IHRoZW4KLSAgICBlY2hvIDE+JjIgJyoqKicgLS13aXRoLWhlYWRlcnMgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiBjcm9zcyBjb21waWxpbmcKLSAgICBleGl0IDEKLSAgZmkKLSAgY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0gICIiKSB4PSR7cHJlZml4fSA7OwotICAqKSB4PSR7ZXhlY19wcmVmaXh9IDs7Ci0gIGVzYWMKLSAgY29weV9kaXJzPSIke2NvcHlfZGlyc30gJHt3aXRoX2hlYWRlcnN9ICR4LyR7dGFyZ2V0X2FsaWFzfS9zeXMtaW5jbHVkZSIKLWZpCi0KLSMgSGFuZGxlIC0td2l0aC1saWJzPVhYWC4gIE11bHRpcGxlIGRpcmVjdG9yaWVzIGFyZSBwZXJtaXR0ZWQuICBUaGUKLSMgY29udGVudHMgYXJlIGNvcGllZCB0byAkKHRvb2xkaXIpL2xpYi4KLWlmIFsgeCIke3dpdGhfbGlic30iICE9IHggXTsgdGhlbgotICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSA9IHhubyBdOyB0aGVuCi0gICAgZWNobyAxPiYyICcqKionIC0td2l0aC1saWJzIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gY3Jvc3MgY29tcGlsaW5nCi0gICAgZXhpdCAxCi0gIGZpCi0gICMgQ29weSB0aGUgbGlicmFyaWVzIGluIHJldmVyc2Ugb3JkZXIsIHNvIHRoYXQgZmlsZXMgaW4gdGhlIGZpcnN0IG5hbWVkCi0gICMgbGlicmFyeSBvdmVycmlkZSBmaWxlcyBpbiBzdWJzZXF1ZW50IGxpYnJhcmllcy4KLSAgY2FzZSAiJHtleGVjX3ByZWZpeG9wdGlvbn0iIGluCi0gICIiKSB4PSR7cHJlZml4fSA7OwotICAqKSB4PSR7ZXhlY19wcmVmaXh9IDs7Ci0gIGVzYWMKLSAgZm9yIGwgaW4gJHt3aXRoX2xpYnN9OyBkbwotICAgIGNvcHlfZGlycz0iJGwgJHgvJHt0YXJnZXRfYWxpYXN9L2xpYiAke2NvcHlfZGlyc30iCi0gIGRvbmUKLWZpCi0KLSMgSWYgYm90aCAtLXdpdGgtaGVhZGVycyBhbmQgLS13aXRoLWxpYnMgYXJlIHNwZWNpZmllZCwgZGVmYXVsdCB0bwotIyAtLXdpdGhvdXQtbmV3bGliLgotaWYgWyB4IiR7d2l0aF9oZWFkZXJzfSIgIT0geCBdICYmIFsgeCIke3dpdGhfbGlic30iICE9IHggXTsgdGhlbgotICBpZiBbIHgiJHt3aXRoX25ld2xpYn0iID0geCBdOyB0aGVuCi0gICAgd2l0aF9uZXdsaWI9bm8KLSAgZmkKLWZpCi0KLSMgUmVjb2duaXplIC0td2l0aC1uZXdsaWIvLS13aXRob3V0LW5ld2xpYi4KLWlmIFsgeCR7d2l0aF9uZXdsaWJ9ID0geG5vIF07IHRoZW4KLSAgc2tpcGRpcnM9IiR7c2tpcGRpcnN9IHRhcmdldC1uZXdsaWIiCi1lbGlmIFsgeCR7d2l0aF9uZXdsaWJ9ID0geHllcyBdOyB0aGVuCi0gIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gdGFyZ2V0LW5ld2xpYiAvIC8nYAotZmkKLQotIyBEZWZhdWx0IHRvIHVzaW5nIC0td2l0aC1zdGFicyBmb3IgY2VydGFpbiB0YXJnZXRzLgotaWYgWyB4JHt3aXRoX3N0YWJzfSA9IHggXTsgdGhlbgotICBjYXNlICIke3RhcmdldH0iIGluCi0gIG1pcHMqLSotaXJpeDYqKQotICAgIDs7Ci0gIG1pcHMqLSotKiB8IGFscGhhKi0qLW9zZiopCi0gICAgd2l0aF9zdGFicz15ZXM7Ci0gICAgd2l0aG9wdGlvbnM9IiR7d2l0aG9wdGlvbnN9IC0td2l0aC1zdGFicyIKLSAgICA7OwotICBlc2FjCi1maQotCi0jIEhhbmRsZSAke2NvcHlfZGlyc30KLXNldCBmbm9yZCAke2NvcHlfZGlyc30KLXNoaWZ0Ci13aGlsZSBbICQjICE9IDAgXTsgZG8KLSAgaWYgWyAtZiAkMi9DT1BJRUQgXSAmJiBbIHgiYGNhdCAkMi9DT1BJRURgIiA9IHgiJDEiIF07IHRoZW4KLSAgICA6Ci0gIGVsc2UKLSAgICBlY2hvIENvcHlpbmcgJDEgdG8gJDIKLQotICAgICMgVXNlIHRoZSBpbnN0YWxsIHNjcmlwdCB0byBjcmVhdGUgdGhlIGRpcmVjdG9yeSBhbmQgYWxsIHJlcXVpcmVkCi0gICAgIyBwYXJlbnQgZGlyZWN0b3JpZXMuCi0gICAgaWYgWyAtZCAkMiBdOyB0aGVuCi0gICAgICA6Ci0gICAgZWxzZQotICAgICAgZWNobyA+Y29uZmlnLnRlbXAKLSAgICAgICR7c3JjZGlyfS9pbnN0YWxsLXNoIC1jIC1tIDY0NCBjb25maWcudGVtcCAkMi9DT1BJRUQKLSAgICBmaQotCi0gICAgIyBDb3B5IHRoZSBkaXJlY3RvcnksIGFzc3VtaW5nIHdlIGhhdmUgdGFyLgotICAgICMgRklYTUU6IFNob3VsZCB3ZSB1c2UgQiBpbiB0aGUgc2Vjb25kIHRhcj8gIE5vdCBhbGwgc3lzdGVtcyBzdXBwb3J0IGl0LgotICAgIChjZCAkMTsgdGFyIC1jZiAtIC4pIHwgKGNkICQyOyB0YXIgLXhwZiAtKQotCi0gICAgIyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHVzZXIgdG8gY29ycmVjdGx5IGFkanVzdCBhbGwKLSAgICAjIHN5bWxpbmtzLiAgSWYgc29tZWJvZHkgY2FuIGZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZSB0aGVtIGNvcnJlY3RseQotICAgICMgaGVyZSwgZmVlbCBmcmVlIHRvIGFkZCB0aGUgY29kZS4KLQotICAgIGVjaG8gJDEgPiAkMi9DT1BJRUQKLSAgZmkKLSAgc2hpZnQ7IHNoaWZ0Ci1kb25lCi0KLSMgQ29uZmlndXJlIGV4dHJhIGRpcmVjdG9yaWVzIHdoaWNoIGFyZSBob3N0IHNwZWNpZmljCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0JaVszNDU2XTg2LSotZ28zMiopCi0JICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBkb3NyZWwiIDs7Ci0JaVszNDU2XTg2LSotbWluZ3czMiopCi0JICBjb25maWdkaXJzPSIkY29uZmlnZGlycyBkb3NyZWwiIDs7Ci0JKi1jeWd3aW4qKQotCSAgY29uZmlnZGlycz0iJGNvbmZpZ2RpcnMgbGlidGVybWNhcCBkb3NyZWwiIDs7Ci1lc2FjCi0KLSMgUmVtb3ZlIG1vcmUgcHJvZ3JhbXMgZnJvbSBjb25zaWRlcmF0aW9uLCBiYXNlZCBvbiB0aGUgaG9zdCBvciAKLSMgdGFyZ2V0IHRoaXMgdXN1YWxseSBtZWFucyB0aGF0IGEgcG9ydCBvZiB0aGUgcHJvZ3JhbSBkb2Vzbid0Ci0jIGV4aXN0IHlldC4KLQotbm9jb25maWdkaXJzPSIiCi0KLWNhc2UgIiR7aG9zdH0iIGluCi0gIGlbMzQ1Nl04Ni0qLXZzdGEpCi0gICAgbm9jb25maWdkaXJzPSJ0Y2wgZXhwZWN0IGRlamFnbnUgbWFrZSB0ZXhpbmZvIGJpc29uIHBhdGNoIGZsZXggYnlhY2Mgc2VuZC1wciBncHJvZiB1dWRlY29kZSBkZWphZ251IGRpZmYgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYgZ2V0dGV4dCIKLSAgICA7OwotICBpWzM0NTZdODYtKi1nbzMyKiB8IGlbMzQ1Nl04Ni0qLW1zZG9zZGpncHAqKQotICAgIG5vY29uZmlnZGlycz0idGNsIHRrIGV4cGVjdCBkZWphZ251IG1ha2UgdGV4aW5mbyBiaXNvbiBwYXRjaCBmbGV4IGJ5YWNjIHNlbmQtcHIgdXVkZWNvZGUgZGVqYWdudSBkaWZmIGd1aWxlIHBlcmwgYXBhY2hlIGluZXQgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IGdldHRleHQiCi0JOzsKLSAgaVszNDU2XTg2LSotbWluZ3czMiopCi0gICAgIyBub2NvbmZpZ2RpcnM9InRjbCB0ayBleHBlY3QgZGVqYWdudSBtYWtlIHRleGluZm8gYmlzb24gcGF0Y2ggZmxleCBieWFjYyBzZW5kLXByIHV1ZGVjb2RlIGRlamFnbnUgZGlmZiBndWlsZSBwZXJsIGFwYWNoZSBpbmV0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICAgbm9jb25maWdkaXJzPSJleHBlY3QgZGVqYWdudSBjdnMgYXV0b2NvbmYgYXV0b21ha2Ugc2VuZC1wciBncHJvZiByY3MgZ3VpbGUgcGVybCB0ZXhpbmZvIGFwYWNoZSBpbmV0IGxpYnRvb2wiCi0JOzsKLSAgaVszNDU2XTg2LSotYmVvcyopCi0gICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0ayBpdGNsIHRpeCBsaWJndWkgZ2RiIgotICAgICA7OwotICAqLSotY3lnd2luKikKLSAgICAgbm9jb25maWdkaXJzPSJhdXRvY29uZiBhdXRvbWFrZSBzZW5kLXByIGdwcm9mIHJjcyBndWlsZSBwZXJsIHRleGluZm8gYXBhY2hlIGluZXQiCi0gICAgOzsKLSAgKi0qLW5ldGJzZCopCi0gICAgbm9jb25maWdkaXJzPSJyY3MiCi0gICAgOzsKLSAgcHBjKi0qLXBlKQotICAgICBub2NvbmZpZ2RpcnM9InBhdGNoIGRpZmYgbWFrZSB0ayB0Y2wgZXhwZWN0IGRlamFnbnUgY3Zzc3JjIGF1dG9jb25mIGF1dG9tYWtlIHRleGluZm8gYmlzb24gc2VuZC1wciBncHJvZiByY3MgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBpdGNsIHRpeCBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgOzsKLWVzYWMKLQotCi1jYXNlICIke3RhcmdldH0iIGluCi0gICotKi1uZXR3YXJlKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZysrIHRhcmdldC1saWJzdGRjKysgdGFyZ2V0LWxpYnJ4IHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmliZXJ0eSB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgKi0qLXJ0ZW1zKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gICotKi12eHdvcmtzKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYWxwaGEqLWRlYy1vc2YqKQotICAgICMgbGQgd29ya3MsIGJ1dCBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuICBlbWFjcyBkb2Vzbid0Ci0gICAgIyB3b3JrLiAgbmV3bGliIGlzIG5vdCA2NCBiaXQgcmVhZHkuICBJJ20gbm90IHN1cmUgYWJvdXQgZmlsZXV0aWxzLgotICAgICMgZ2FzIGRvZXNuJ3QgZ2VuZXJhdGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnYXMgbGQgZW1hY3MgZmlsZXV0aWxzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGFscGhhKi0qLSp2bXMqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgbGQgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYWxwaGEqLSotbGludXgqKQotICAgICMgbmV3bGliIGlzIG5vdCA2NCBiaXQgcmVhZHkKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LW5ld2xpYiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgIyBsaW51eCBoYXMgcnggaW4gbGliYwotICAgIHNraXBkaXJzPSIkc2tpcGRpcnMgdGFyZ2V0LWxpYnJ4IgotICAgIDs7Ci0gIGFscGhhKi0qLSopCi0gICAgIyBuZXdsaWIgaXMgbm90IDY0IGJpdCByZWFkeQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBhcmMtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJtLSotcGUqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJtLSotY29mZiopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgYXJtLSotZWxmKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBhcm0tKi1vYWJpKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGM0eC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB0aHVtYi0qLWNvZmYpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotIyBDWUdOVVMgTE9DQUwgY2xtL2FybS1lbGYKLSAgdGh1bWItKi1lbGYpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB0aHVtYi0qLW9hYmkpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotIyBFTkQgQ1lHTlVTIExPQ0FMCi0jIENZR05VUyBMT0NBTCBuaWNrYy9zdHJvbmdhcm0KLSAgc3Ryb25nYXJtLSotZWxmKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHN0cm9uZ2FybS0qLWNvZmYpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSMgRU5EIENZR05VUyBMT0NBTAotICB0aHVtYi0qLXBlKSAjIENZR05VUyBMT0NBTCBuaWNrYy90aHVtYgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgYXJtLSotcmlzY2l4KikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGQxMHYtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGlicnggdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyIKLSAgICA7OwotIyBDWUdOVVMgTE9DQUwgZDMwdgotICBkMzB2LSotKikKLSAgICA7OwotIyBFTkQgQ1lHTlVTIExPQ0FMCi0jIENZR05VUyBMT0NBTCBmcjMwCi0gIGZyMzAtKi1lbGYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotIyBFTkQgQ1lHTlVTIExPQ0FMCi0gIGg4MzAwKi0qLSogfCBcCi0gIGg4NTAwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyB0YXJnZXQtbGlicnggdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGhwcGEqLSotKmVsZiogfCBcCi0gIGhwcGEqLSotbGl0ZXMqKQotICAgICMgRG8gY29uZmlndXJlIGxkL2JpbnV0aWxzL2dhcyBmb3IgdGhpcyBjYXNlLgotICAgIDs7Ci0gIGhwcGEqLSotKikKLSAgICAjIEhQJ3MgQyBjb21waWxlciBkb2Vzbid0IGhhbmRsZSBFbWFjcyBjb3JyZWN0bHkgKGJ1dCBvbiBCU0QgYW5kIE1hY2gKLSAgICAjIGNjIGlzIGdjYywgYW5kIG9uIGFueSBzeXN0ZW0gYSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIGxpbmsgY2MgdG8KLSAgICAjIHdoYXRldmVyIHRoZXkgd2FudC4gIEZJWE1FLCBlbWFjcyBlbWFjczE5KS4KLSAgICBjYXNlICIke0NDfSIgaW4KLQkiIiB8IGNjKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGVtYWNzIGVtYWNzMTkiIDs7Ci0gICAgICAgICopIDs7Ci0gICAgZXNhYwotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBzaGVsbHV0aWxzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWNvZmYgfCBpWzM0NTZdODYtKi1lbGYpCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0gICAgICAgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWdvMzIqIHwgaVszNDU2XS0qLW1zZG9zZGpncHAqKQotICAgICMgYnV0IGRvbid0IGJ1aWxkIGdkYgotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBnZGIgdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIHRhcmdldC1saWJpbyB0YXJnZXQtbGlicngiCi0gICAgOzsKLSAgKi0qLWxpbnV4KikKLSAgICAjIGxpbnV4IGhhcyByeCBpbiBsaWJjCi0gICAgc2tpcGRpcnM9IiRza2lwZGlycyB0YXJnZXQtbGlicngiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotbWluZ3czMiopCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR0YXJnZXRfY29uZmlnZGlycyB0YXJnZXQtbWluZ3ciCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGV4cGVjdCB0YXJnZXQtbGliZ2xvc3MiCi0KLSAgICAjIENhbid0IGJ1aWxkIGdkYiBmb3IgbWluZ3czMiBpZiBub3QgbmF0aXZlLgotICAgIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgICBpWzM0NTZdODYtKi1taW5ndzMyKSA7OyAjIGtlZXAgZ2RiIHRjbCB0ayBleHBlY3QgZXRjLgotICAgICAgKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0Y2wgdGsgZXhwZWN0IGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICAgICAgIDs7Ci0gICAgZXNhYwotICAgIDs7ICAgIAotICAqLSotY3lnd2luKikKLSAgICB0YXJnZXRfY29uZmlnZGlycz0iJHRhcmdldF9jb25maWdkaXJzIHRhcmdldC1saWJ0ZXJtY2FwIHRhcmdldC13aW5zdXAiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICAjIGFsd2F5cyBidWlsZCBuZXdsaWIuCi0gICAgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyB0YXJnZXQtbmV3bGliIC8gLydgCi0KLSAgICAjIENhbid0IGJ1aWxkIGdkYiBmb3IgQ3lnd2luIGlmIG5vdCBuYXRpdmUuCi0gICAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAgICotKi1jeWd3aW4qKSA7OyAjIGtlZXAgZ2RiIHRjbCB0ayBleHBlY3QgZXRjLgotICAgICAgKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0Y2wgdGsgZXhwZWN0IGl0Y2wgdGl4IGxpYmd1aSBkYiBzbmF2aWdhdG9yIGdudXNlcnYiCi0gICAgICAgICA7OwotICAgIGVzYWMKLSAgICA7OyAgICAKLSAgaVszNDU2XTg2LSotcGUpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnKysgdGFyZ2V0LWxpYnN0ZGMrKyB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYnJ4IHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28zLjJ2NSopCi0gICAgIyBUaGUgbGlua2VyIGRvZXMgbm90IHlldCBrbm93IGFib3V0IHdlYWsgc3ltYm9scyBpbiBDT0ZGLAotICAgICMgYW5kIGlzIG5vdCBjb25maWd1cmVkIHRvIGhhbmRsZSBtaXhlZCBFTEYgYW5kIENPRkYuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBpWzM0NTZdODYtKi1zY28qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc29sYXJpczIqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgaVszNDU2XTg2LSotc3lzdjQqKQotICAgICMgVGhlIFNZU1Y0IEMgY29tcGlsZXIgZG9lc24ndCBoYW5kbGUgRW1hY3MgY29ycmVjdGx5Ci0gICAgY2FzZSAiJHtDQ30iIGluCi0JIiIgfCBjYyopIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBlbWFjcyBlbWFjczE5IiA7OwotICAgICAgICAqKSA7OwotICAgIGVzYWMKLSAgICAjIGJ1dCB0aGF0J3Mgb2theSBzaW5jZSBlbWFjcyBkb2Vzbid0IHdvcmsgYW55d2F5Ci0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGVtYWNzIGVtYWNzMTkgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIGlbMzQ1Nl04Ni0qLWJlb3MqKQotICAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgICA7OwotICBtNjhrLSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWJzcCB0YXJnZXQtY3lnbW9uIgotICAgIGZpCi0gICAgOzsKLSAgbTY4ay0qLWNvZmYqKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBtbjEwMjAwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBtbjEwMzAwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMiCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHBvd2VycGMtKi1haXgqKQotICAgICMgY29waWVkIGZyb20gcnM2MDAwLSotKiBlbnRyeQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiBjdnNzcmMgdGFyZ2V0LWxpYmdsb3NzIgotICAgICMgVGhpcyBpcyBuZWVkZWQgdW50aWwgZ2NjIGFuZCBsZCBhcmUgZml4ZWQgdG8gd29yayB0b2dldGhlci4KLSAgICB1c2VfZ251X2xkPW5vCi0gICAgOzsKLSAgcG93ZXJwYyotKi13aW5udCogfCBwb3dlcnBjKi0qLXBlKiB8IHBwYyotKi1wZSkKLSAgICB0YXJnZXRfY29uZmlnZGlycz0iJHRhcmdldF9jb25maWdkaXJzIHRhcmdldC13aW5zdXAiCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiB0Y2wgdGsgbWFrZSBleHBlY3QgdGFyZ2V0LWxpYmdsb3NzIGl0Y2wgdGl4IGRiIHNuYXZpZ2F0b3IgZ251c2VydiIKLSAgICAjIGFsd2F5cyBidWlsZCBuZXdsaWIuCi0gICAgc2tpcGRpcnM9YGVjaG8gIiAke3NraXBkaXJzfSAiIHwgc2VkIC1lICdzLyB0YXJnZXQtbmV3bGliIC8gLydgCi0gICAgOzsKLSAgICAjIFRoaXMgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIGNhbiBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcwotICBwb3dlcnBjbGUtKi1zb2xhcmlzKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ2RiIHNpbSBtYWtlIHRjbCB0ayBleHBlY3QgaXRjbCB0aXggZGIgc25hdmlnYXRvciBnbnVzZXJ2IgotICAgIDs7Ci0gIHBvd2VycGMtKi1lYWJpKQotICAgIGlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ICE9IHhubyBdIDsgdGhlbgotCSAgIHRhcmdldF9jb25maWdkaXJzPSIke3RhcmdldF9jb25maWdkaXJzfSB0YXJnZXQtYnNwIHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICByczYwMDAtKi1seW54b3MqKQotICAgICMgVGhlIENWUyBzZXJ2ZXIgY29kZSBkb2Vzbid0IHdvcmsgb24gdGhlIFJTLzYwMDAKLSAgICAjIE5ld2xpYiBtYWtlcyBwcm9ibGVtcyBmb3IgbGliZysrIGluIGNyb3NzZXMuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgZ3Byb2YgY3Zzc3JjIgotICAgIDs7Ci0gIHJzNjAwMC0qLWFpeCopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdwcm9mIgotICAgICMgVGhpcyBpcyBuZWVkZWQgdW50aWwgZ2NjIGFuZCBsZCBhcmUgZml4ZWQgdG8gd29yayB0b2dldGhlci4KLSAgICB1c2VfZ251X2xkPW5vCi0gICAgOzsKLSAgcnM2MDAwLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YiCi0gICAgOzsKLSAgbTY4ay1hcG9sbG8tKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgYmludXRpbHMgZ3Byb2YgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDUqKQotICAgICMgVGhlIEdOVSBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotICAgICMgZW1hY3MgaXMgZW1hY3MgMTgsIHdoaWNoIGRvZXMgbm90IHdvcmsgb24gSXJpeCA1IChlbWFjczE5IGRvZXMgd29yaykKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgbGQgZ3Byb2YgZW1hY3MgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLSotaXJpeDYqKQotICAgICMgVGhlIEdOVSBhc3NlbWJsZXIgYW5kIGxpbmtlciBkbyBub3Qgc3VwcG9ydCBJUklYIDYuCi0gICAgIyBlbWFjcyBpcyBlbWFjcyAxOCwgd2hpY2ggZG9lcyBub3Qgd29yayBvbiBJcml4IDUgKGVtYWNzMTkgZG9lcyB3b3JrKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBsZCBnYXMgZ3Byb2YgZW1hY3MgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIG1pcHMqLWRlYy1ic2QqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgbWlwcyotKi1ic2QqKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgbWlwc3R4MzktKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyBncHJvZiIgICAjIHNhbWUgYXMgZ2VuZXJpYyBtaXBzCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgIDs7Ci0gIG1pcHMqLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgZ3Byb2YiCi0gICAgOzsKLSAgcm9tcC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGJmZCBiaW51dGlscyBsZCBnYXMgb3Bjb2RlcyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgc2gtKi0qKQotICAgIGNhc2UgIiR7aG9zdH0iIGluCi0gICAgICBpWzM0NTZdODYtKi12c3RhKSA7OyAjIGRvbid0IGFkZCBncHJvZiBiYWNrIGluCi0gICAgICBpWzM0NTZdODYtKi1nbzMyKikgOzsgIyBkb24ndCBhZGQgZ3Byb2YgYmFjayBpbgotICAgICAgaVszNDU2XTg2LSotbXNkb3NkamdwcCopIDs7ICMgZG9uJ3QgYWRkIGdwcm9mIGJhY2sgaW4KLSAgICAgICopIHNraXBkaXJzPWBlY2hvICIgJHtza2lwZGlyc30gIiB8IHNlZCAtZSAncy8gZ3Byb2YgLyAvJ2AgOzsKLSAgICBlc2FjCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICBzcGFyYy0qLWVsZiopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1saWJzdHViIHRhcmdldC1jeWdtb24iCi0gICAgZmkKLSAgICA7OwotICBzcGFyYzY0LSotZWxmKikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLQkgICB0YXJnZXRfY29uZmlnZGlycz0iJHt0YXJnZXRfY29uZmlnZGlyc30gdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHNwYXJjbGl0ZS0qLSopCi0gICAgaWYgWyB4JHtpc19jcm9zc19jb21waWxlcn0gIT0geG5vIF0gOyB0aGVuCi0JICAgdGFyZ2V0X2NvbmZpZ2RpcnM9IiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHRhcmdldC1ic3AgdGFyZ2V0LWxpYnN0dWIgdGFyZ2V0LWN5Z21vbiIKLSAgICBmaQotICAgIDs7Ci0gIHNwYXJjLSotc3Vub3M0KikKLSAgICBpZiBbIHgke2lzX2Nyb3NzX2NvbXBpbGVyfSAhPSB4bm8gXSA7IHRoZW4KLSAgICAgICAgICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdkYiBnZGJ0ZXN0IHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIGVsc2UKLSAgICAgICAgICAgdXNlX2dudV9sZD1ubwotICAgIGZpCi0gICAgOzsKLSAgdjgxMC0qLSopCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGJmZCBiaW51dGlscyBnYXMgZ2NjIGdkYiBsZCB0YXJnZXQtbGliaW8gdGFyZ2V0LWxpYmcrKyB0YXJnZXQtbGlic3RkYysrIG9wY29kZXMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7Ci0gIHY4NTAtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdjg1MGUtKi0qKSAjIENZR05VUyBMT0NBTCB2ODUwZQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbGliZ2xvc3MiCi0gICAgOzsKLSAgdjg1MGVhLSotKikKLSAgICBub2NvbmZpZ2RpcnM9IiRub2NvbmZpZ2RpcnMgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7ICAgICAgICMgRU5EIENZR05VUyBMT0NBTAotICB2YXgtKi12bXMpCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGJmZCBiaW51dGlscyBnZGIgbGQgdGFyZ2V0LW5ld2xpYiBvcGNvZGVzIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICB2YXgtKi0qKQotICAgIG5vY29uZmlnZGlycz0iJG5vY29uZmlnZGlycyB0YXJnZXQtbmV3bGliIHRhcmdldC1saWJnbG9zcyIKLSAgICA7OwotICAqLSotbHlueG9zKikKLSAgICAjIE5ld2xpYiBtYWtlcyBwcm9ibGVtcyBmb3IgbGliZysrIGluIGNyb3NzZXMuCi0gICAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1uZXdsaWIgdGFyZ2V0LWxpYmdsb3NzIgotICAgIDs7IAotICAqLSotbWFjb3MqIHwgXAotICAqLSotbXB3KikKLSAgICAjIE1hY3Mgd2FudCBhIHJlc291cmNlIGNvbXBpbGVyLgotICAgIGNvbmZpZ2RpcnM9IiRjb25maWdkaXJzIGdyZXoiCi0gICAgOzsgICAgCi1lc2FjCi0KLSMgSWYgd2UgYXJlbid0IGJ1aWxkaW5nIG5ld2xpYiwgdGhlbiBkb24ndCBidWlsZCBsaWJnbG9zcywgc2luY2UgbGliZ2xvc3MKLSMgZGVwZW5kcyB1cG9uIHNvbWUgbmV3bGliIGhlYWRlciBmaWxlcy4KLWNhc2UgIiR7bm9jb25maWdkaXJzfSIgaW4KLSAgKnRhcmdldC1saWJnbG9zcyopIDs7Ci0gICp0YXJnZXQtbmV3bGliKikgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIHRhcmdldC1saWJnbG9zcyIgOzsKLWVzYWMKLQotIyBNYWtlIHN1cmUgd2UgZG9uJ3QgbGV0IEdOVSBsZCBiZSBhZGRlZCBpZiB3ZSBkaWRuJ3Qgd2FudCBpdC4KLWlmIFsgeCR3aXRoX2dudV9sZCA9IHhubyBdOyB0aGVuCi0gIHVzZV9nbnVfbGQ9bm8KLSAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGxkIgotZmkKLQotIyBNYWtlIHN1cmUgd2UgZG9uJ3QgbGV0IEdOVSBhcyBiZSBhZGRlZCBpZiB3ZSBkaWRuJ3Qgd2FudCBpdC4KLWlmIFsgeCR3aXRoX2dudV9hcyA9IHhubyBdOyB0aGVuCi0gIHVzZV9nbnVfYXM9bm8KLSAgbm9jb25maWdkaXJzPSIkbm9jb25maWdkaXJzIGdhcyIKLWZpCi0KLSMgUmVtb3ZlIHRoZSBlbnRyaWVzIGluICRza2lwZGlycyBhbmQgJG5vY29uZmlnZGlycyBmcm9tICRjb25maWdkaXJzIGFuZAotIyAkdGFyZ2V0X2NvbmZpZ2RpcnMuCi0jIElmIHdlIGhhdmUgdGhlIHNvdXJjZSBmb3IgJG5vY29uZmlnZGlycyBlbnRyaWVzLCBhZGQgdGhlbSB0byAkbm90c3VwcC4KLQotbm90c3VwcD0iIgotZm9yIGRpciBpbiAuICRza2lwZGlycyAkbm9jb25maWdkaXJzIDsgZG8KLSAgZGlybmFtZT1gZWNobyAkZGlyIHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AKLSAgaWYgWyAkZGlyICE9IC4gXSAgJiYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2Rpcn0gIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgICBjb25maWdkaXJzPWBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgc2VkIC1lICJzLyAke2Rpcn0gLyAvImAKLSAgICBpZiBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlIF0gXAotCXx8IFsgLXIgJHNyY2Rpci8kZGlybmFtZS9jb25maWd1cmUuaW4gXTsgdGhlbgotICAgICAgaWYgZWNobyAiICR7c2tpcGRpcnN9ICIgfCBncmVwICIgJHtkaXJ9ICIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JdHJ1ZQotICAgICAgZWxzZQotCW5vdHN1cHA9IiRub3RzdXBwICRkaXIiCi0gICAgICBmaQotICAgIGZpCi0gIGZpCi0gIGlmIFsgJGRpciAhPSAuIF0gICYmIGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICAgIHRhcmdldF9jb25maWdkaXJzPWBlY2hvICIgJHt0YXJnZXRfY29uZmlnZGlyc30gIiB8IHNlZCAtZSAicy8gJHtkaXJ9IC8gLyJgCi0gICAgaWYgWyAtciAkc3JjZGlyLyRkaXJuYW1lL2NvbmZpZ3VyZSBdIFwKLQl8fCBbIC1yICRzcmNkaXIvJGRpcm5hbWUvY29uZmlndXJlLmluIF07IHRoZW4KLSAgICAgIGlmIGVjaG8gIiAke3NraXBkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCXRydWUKLSAgICAgIGVsc2UKLQlub3RzdXBwPSIkbm90c3VwcCAkZGlyIgotICAgICAgZmkKLSAgICBmaQotICBmaQotZG9uZQotCi0jIFNvbWV0aW1lcyB0aGUgdG9vbHMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggbGliaWJlcnR5IGJ1dCB3aXRoIG5vIG90aGVyCi0jIGxpYnJhcmllcy4gIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBidWlsZCB0YXJnZXQtbGliaWJlcnR5LgotaWYgWyAtbiAiJHt0YXJnZXRfY29uZmlnZGlyc30iIF07IHRoZW4KLSAgb3RoZXJzPQotICBmb3IgaSBpbiBgZWNobyAke3RhcmdldF9jb25maWdkaXJzfSB8IHNlZCAtZSBzL3RhcmdldC0vL2dgIDsgZG8KLSAgICBpZiBbICIkaSIgIT0gImxpYmliZXJ0eSIgXTsgdGhlbgotICAgICAgaWYgWyAtciAkc3JjZGlyLyRpL2NvbmZpZ3VyZSBdIHx8IFsgLXIgJHNyY2Rpci8kaS9jb25maWd1cmUuaW4gXTsgdGhlbgotCW90aGVycz15ZXM7Ci0JYnJlYWs7Ci0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgaWYgWyAteiAiJHtvdGhlcnN9IiBdOyB0aGVuCi0gICAgdGFyZ2V0X2NvbmZpZ2RpcnM9Ci0gIGZpCi1maQotCi0jIERlY29uZmlndXJlIGFsbCBzdWJkaXJlY3RvcmllcywgaW4gY2FzZSB3ZSBhcmUgY2hhbmdpbmcgdGhlCi0jIGNvbmZpZ3VyYXRpb24gZnJvbSBvbmUgd2hlcmUgYSBzdWJkaXJlY3RvcnkgaXMgc3VwcG9ydGVkIHRvIG9uZSB3aGVyZSBpdAotIyBpcyBub3QuCi1pZiBbIC16ICIke25vcmVjdXJzaW9ufSIgXSAmJiBbIC1uICIke2NvbmZpZ2RpcnN9IiBdOyB0aGVuCi0gIGZvciBpIGluIGBlY2hvICR7Y29uZmlnZGlyc30gfCBzZWQgLWUgcy90YXJnZXQtLy9nYCA7IGRvCi0gICAgcm0gLWYgJGkvTWFrZWZpbGUKLSAgZG9uZQotZmkKLWlmIFsgLXogIiR7bm9yZWN1cnNpb259IiBdICYmIFsgLW4gIiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IiBdOyB0aGVuCi0gIGZvciBpIGluIGBlY2hvICR7dGFyZ2V0X2NvbmZpZ2RpcnN9IHwgc2VkIC1lIHMvdGFyZ2V0LS8vZ2AgOyBkbwotICAgIHJtIC1mICR7dGFyZ2V0X3N1YmRpcn0vJGkvTWFrZWZpbGUKLSAgZG9uZQotZmkKLQotIyBQcm9kdWNlIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGUgc3ViZGlycyB3ZSBjYW4ndCBjb25maWd1cmUuCi0jIFRoaXMgaXNuJ3QgZXNwZWNpYWxseSBpbnRlcmVzdGluZyBpbiB0aGUgQ3lnbnVzIHRyZWUsIGJ1dCBpbiB0aGUgaW5kaXZpZHVhbAotIyBGU0YgcmVsZWFzZXMsIGl0J3MgaW1wb3J0YW50IHRvIGxldCBwZW9wbGUga25vdyB3aGVuIHRoZWlyIG1hY2hpbmUgaXNuJ3QKLSMgc3VwcG9ydGVkIGJ5IHRoZSBvbmUgb3IgdHdvIHByb2dyYW1zIGluIGEgcGFja2FnZS4KLQotaWYgWyAtbiAiJHtub3RzdXBwfSIgXSAmJiBbIC16ICIke25vcmVjdXJzaW9ufSIgXTsgdGhlbgotICAjIElmICRhcHBkaXJzIGlzIG5vbi1lbXB0eSwgYXQgbGVhc3Qgb25lIG9mIHRob3NlIGRpcmVjdG9yaWVzIG11c3Qgc3RpbGwKLSAgIyBiZSBjb25maWd1cmVkLCBvciB3ZSBlcnJvciBvdXQuICAoRS5nLiwgaWYgdGhlIGdhcyByZWxlYXNlIHN1cHBvcnRzIGEKLSAgIyBzcGVjaWZpZWQgdGFyZ2V0IGluIHNvbWUgc3ViZGlycyBidXQgbm90IHRoZSBnYXMgc3ViZGlyLCB3ZSBzaG91bGRuJ3QKLSAgIyBwcmV0ZW5kIHRoYXQgYWxsIGlzIHdlbGwuKQotICBpZiBbIC1uICIkYXBwZGlycyIgXTsgdGhlbgotICAgIGZvciBkaXIgaW4gJGFwcGRpcnMgOyBkbwotICAgICAgaWYgWyAtciAkZGlyL01ha2VmaWxlLmluIF07IHRoZW4KLQlpZiBlY2hvICIgJHtjb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgYXBwZGlycz0iIgotCSAgYnJlYWsKLQlmaQotCWlmIGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgZ3JlcCAiICR7ZGlyfSAiID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgYXBwZGlycz0iIgotCSAgYnJlYWsKLQlmaQotICAgICAgZmkKLSAgICBkb25lCi0gICAgaWYgWyAtbiAiJGFwcGRpcnMiIF07IHRoZW4KLSAgICAgIGVjaG8gIioqKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBhY2thZ2UuIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotICBmaQotICAjIE9rYXksIHNvbWUgYXBwbGljYXRpb24gd2lsbCBidWlsZCwgb3Igd2UgZG9uJ3QgY2FyZSB0byBjaGVjay4gIFN0aWxsCi0gICMgbm90aWZ5IG9mIHN1YmRpcnMgbm90IGdldHRpbmcgYnVpbHQuCi0gIGVjaG8gIioqKiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZm9sbG93aW5nIHN1YmRpcmVjdG9yaWVzOiIgMT4mMgotICBlY2hvICIgICAgJHtub3RzdXBwfSIgMT4mMgotICBlY2hvICIgICAgKEFueSBvdGhlciBkaXJlY3RvcmllcyBzaG91bGQgc3RpbGwgd29yayBmaW5lLikiIDE+JjIKLWZpCi0KLSMgU2V0IHdpdGhfZ251X2FzIGFuZCB3aXRoX2dudV9sZCBhcyBhcHByb3ByaWF0ZS4KLSMKLSMgVGhpcyBpcyBkb25lIGJ5IGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkKLSMgaXMgYXZhaWxhYmxlLCBhbmQgYnkgY2hlY2tpbmcgd2hldGhlciBvciBub3Qgc3BlY2lmaWMgY29uZmlndXJhdGlvbnMKLSMgaGF2ZSByZXF1ZXN0ZWQgdGhhdCB0aGlzIG1hZ2ljIG5vdCBoYXBwZW4uCi0jIAotIyBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYWx3YXlzIG92ZXJyaWRlIHRoZSBleHBsaWNpdCBzZXR0aW5ncyBpbiAKLSMgY29uZmlndXJlLmluLCBhbmQgdGhlIHNldHRpbmdzIGluIGNvbmZpZ3VyZS5pbiBvdmVycmlkZSB0aGlzIG1hZ2ljLgotIwotIyBJZiB0aGUgZGVmYXVsdCBmb3IgYSB0b29sY2hhaW4gaXMgdG8gdXNlIEdOVSBhcyBhbmQgbGQsIGFuZCB5b3UgZG9uJ3QgCi0jIHdhbnQgdG8gZG8gdGhhdCwgdGhlbiB5b3Ugc2hvdWxkIHVzZSB0aGUgLS13aXRob3V0LWdudS1hcyBhbmQKLSMgLS13aXRob3V0LWdudS1sZCBvcHRpb25zIGZvciB0aGUgY29uZmlndXJlIHNjcmlwdC4KLQotaWYgWyB4JHt1c2VfZ251X2FzfSA9IHggXSA7IHRoZW4KLSAgaWYgWyB4JHt3aXRoX2dudV9hc30gIT0geG5vIF0gJiYgZWNobyAiICR7Y29uZmlnZGlyc30gIiB8IGdyZXAgIiAke2dhc2Rpcn0gIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9LyR7Z2FzZGlyfSBdIDsgdGhlbgotICAgIHdpdGhfZ251X2FzPXllcwotICAgIHdpdGhvcHRpb25zPSIkd2l0aG9wdGlvbnMgLS13aXRoLWdudS1hcyIKLSAgZmkKLWZpCi0KLWlmIFsgeCR7dXNlX2dudV9sZH0gPSB4IF0gOyB0aGVuCi0gIGlmIFsgeCR7d2l0aF9nbnVfbGR9ICE9IHhubyBdICYmIGVjaG8gIiAke2NvbmZpZ2RpcnN9ICIgfCBncmVwICIgbGQgIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9L2xkIF0gOyB0aGVuCi0gICAgd2l0aF9nbnVfbGQ9eWVzCi0gICAgd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAtLXdpdGgtZ251LWxkIgotICBmaQotZmkKLQotIyBJZiB1c2luZyBuZXdsaWIsIGFkZCAtLXdpdGgtbmV3bGliIHRvIHRoZSB3aXRob3B0aW9ucyBzbyB0aGF0IGdjYy9jb25maWd1cmUKLSMgY2FuIGRldGVjdCB0aGlzIGNhc2UuCi0KLWlmIFsgeCR7d2l0aF9uZXdsaWJ9ICE9IHhubyBdICYmIGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgZ3JlcCAiIHRhcmdldC1uZXdsaWIgIiA+IC9kZXYvbnVsbCAyPiYxICYmIFsgLWQgJHtzcmNkaXJ9L25ld2xpYiBdIDsgdGhlbgotICB3aXRoX25ld2xpYj15ZXMKLSAgd2l0aG9wdGlvbnM9IiR3aXRob3B0aW9ucyAtLXdpdGgtbmV3bGliIgotZmkKLQotaWYgWyB4JHtzaGFyZWR9ID0geHllcyBdOyB0aGVuCi0gIGNhc2UgIiR7dGFyZ2V0fSIgaW4KLSAgICBocHBhKikKLSAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtcGFwaWMiCi0gICAgICA7OwotICAgIGlbMzQ1Nl04Ni0qKQotICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC14ODZwaWMiCi0gICAgICA7OwotICAgIHBvd2VycGMqLSopCi0gICAgICB0YXJnZXRfbWFrZWZpbGVfZnJhZz0iJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30gY29uZmlnL210LXBwY3BpYyIKLSAgICAgIDs7Ci0gICAgYWxwaGEqLSotbGludXgqKQotICAgICAgdGFyZ2V0X21ha2VmaWxlX2ZyYWc9IiR7dGFyZ2V0X21ha2VmaWxlX2ZyYWd9IGNvbmZpZy9tdC1lbGZhbHBoYXBpYyIKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGlmIHRlc3QgLWYgJHtzcmNkaXJ9L2NvbmZpZy9tdC0ke3RhcmdldF9jcHV9cGljOyB0aGVuCi0gICAgICAgIHRhcmdldF9tYWtlZmlsZV9mcmFnPSIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSBjb25maWcvbXQtJHt0YXJnZXRfY3B1fXBpYyIKLSAgICAgIGZpCi0gICAgICA7OwotICBlc2FjCi1maQotCi1ybSAtZiBtdC1mcmFnCi1pZiBbIC1uICIke3RhcmdldF9tYWtlZmlsZV9mcmFnfSIgXSA7IHRoZW4KLSAgZm9yIGYgaW4gJHt0YXJnZXRfbWFrZWZpbGVfZnJhZ30KLSAgZG8KLSAgICBjYXQgJHtzcmNkaXJ9LyRmID4+IG10LWZyYWcKLSAgZG9uZQotICB0YXJnZXRfbWFrZWZpbGVfZnJhZz1tdC1mcmFnCi1maQotCi0jIHBvc3QtdGFyZ2V0OgotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBjb21waWxlciBpcyBhYmxlIHRvIGdlbmVyYXRlIGFuIGV4ZWN1dGFibGUuICBJZiBpdAotIyBjYW4ndCwgd2UgYXJlIHByb2JhYmx5IGluIHRyb3VibGUuICBXZSBkb24ndCBjYXJlIHdoZXRoZXIgd2UgY2FuIHJ1biB0aGUKLSMgZXhlY3V0YWJsZS0td2UgbWlnaHQgYmUgdXNpbmcgYSBjcm9zcyBjb21waWxlci0td2Ugb25seSBjYXJlIHdoZXRoZXIgaXQKLSMgY2FuIGJlIGNyZWF0ZWQuICBBdCB0aGlzIHBvaW50IHRoZSBtYWluIGNvbmZpZ3VyZSBzY3JpcHQgaGFzIHNldCBDQy4KLWVjaG8gImludCBtYWluICgpIHsgcmV0dXJuIDA7IH0iID4gY29uZnRlc3QuYwotJHtDQ30gLW8gY29uZnRlc3QgJHtDRkxBR1N9ICR7Q1BQRkxBR1N9ICR7TERGTEFHU30gY29uZnRlc3QuYwotaWYgWyAkPyA9IDAgXSAmJiBbIC1zIGNvbmZ0ZXN0IC1vIC1zIGNvbmZ0ZXN0LmV4ZSBdOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAxPiYyICIqKiogVGhlIGNvbW1hbmQgJyR7Q0N9IC1vIGNvbmZ0ZXN0ICR7Q0ZMQUdTfSAke0NQUEZMQUdTfSAke0xERkxBR1N9IGNvbmZ0ZXN0LmMnIGZhaWxlZC4iCi0gIGVjaG8gMT4mMiAiKioqIFlvdSBtdXN0IHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQ0MgdG8gYSB3b3JraW5nIGNvbXBpbGVyLiIKLSAgcm0gLWYgY29uZnRlc3QqCi0gIGV4aXQgMQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi0jIFRoZSBTb2xhcmlzIC91c3IvdWNiL2NjIGNvbXBpbGVyIGRvZXMgbm90IGFwcGVhciB0byB3b3JrLgotY2FzZSAiJHtob3N0fSIgaW4KLSAgc3BhcmMtc3VuLXNvbGFyaXMyKikKLSAgICAgIENDQkFTRT0iYGVjaG8gJHtDQy1jY30gfCBzZWQgJ3MvIC4qJC8vJ2AiCi0gICAgICBpZiBbICJgL3Vzci9iaW4vd2hpY2ggJENDQkFTRWAiID0gIi91c3IvdWNiL2NjIiBdIDsgdGhlbgotICAgICAgICAgIGNvdWxkX3VzZT0KLSAgICAgICAgICBbIC1kIC9vcHQvU1VOV3Nwcm8vYmluIF0gJiYgY291bGRfdXNlPSIvb3B0L1NVTldzcHJvL2JpbiIKLSAgICAgICAgICBpZiBbIC1kIC9vcHQvY3lnbnVzL2JpbiBdIDsgdGhlbgotICAgICAgICAgICAgICBpZiBbICIkY291bGRfdXNlIiA9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICAgICAgICBjb3VsZF91c2U9Ii9vcHQvY3lnbnVzL2JpbiIKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgY291bGRfdXNlPSIkY291bGRfdXNlIG9yIC9vcHQvY3lnbnVzL2JpbiIKLSAgICAgICAgICAgICAgZmkKLSAgICAgICAgICBmaQotICAgICAgICBpZiBbICIkY291bGRfdXNlIiA9ICIiIF0gOyB0aGVuCi0gICAgICAgICAgICBlY2hvICJXYXJuaW5nOiBjb21waWxhdGlvbiBtYXkgZmFpbCBiZWNhdXNlIHlvdSdyZSB1c2luZyIKLSAgICAgICAgICAgIGVjaG8gIi91c3IvdWNiL2NjLiAgWW91IHNob3VsZCBjaGFuZ2UgeW91ciBQQVRIIG9yIENDICIKLSAgICAgICAgICAgIGVjaG8gInZhcmlhYmxlIGFuZCByZXJ1biBjb25maWd1cmUuIgotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlY2hvICJXYXJuaW5nOiBjb21waWxhdGlvbiBtYXkgZmFpbCBiZWNhdXNlIHlvdSdyZSB1c2luZyIKLSAgICAgICAgICAgIGVjaG8gIi91c3IvdWNiL2NjLCB3aGVuIHlvdSBzaG91bGQgdXNlIHRoZSBDIGNvbXBpbGVyIGZyb20iCi0gICAgICAgICAgICBlY2hvICIkY291bGRfdXNlLiAgWW91IHNob3VsZCBjaGFuZ2UgeW91ciIKLSAgICAgICAgICAgIGVjaG8gIlBBVEggb3IgQ0MgdmFyaWFibGUgYW5kIHJlcnVuIGNvbmZpZ3VyZS4iCi0gICAgICAgIGZpCi0gICAgICBmaQotICA7OwotZXNhYwotCi0jIElmIC0tZW5hYmxlLXNoYXJlZCB3YXMgc2V0LCB3ZSBtdXN0IHNldCBMRF9MSUJSQVJZX1BBVEggc28gdGhhdCB0aGUKLSMgYmludXRpbHMgdG9vbHMgd2lsbCBmaW5kIGxpYmJmZC5zby4KLWlmIFsgIiR7c2hhcmVkfSIgPSAieWVzIiBdOyB0aGVuCi0gIHNlZCAtZSAncy9eU0VUX0xJQl9QQVRIWyAJXSo9LiokL1NFVF9MSUJfUEFUSCA9ICQoUkVBTExZX1NFVF9MSUJfUEFUSCkvJyBcCi0gICAgICBNYWtlZmlsZSA+IE1ha2VmaWxlLnRlbQotICBybSAtZiBNYWtlZmlsZQotICBtdiAtZiBNYWtlZmlsZS50ZW0gTWFrZWZpbGUKLQotICBjYXNlICIke2hvc3R9IiBpbgotICAqLSotaHB1eCopCi0gICAgc2VkIC1lICdzL15SUEFUSF9FTlZWQVJbIAldKj0uKiQvUlBBVEhfRU5WVkFSID0gU0hMSUJfUEFUSC8nIFwKLQlNYWtlZmlsZSA+IE1ha2VmaWxlLnRlbQotICAgIHJtIC1mIE1ha2VmaWxlCi0gICAgbXYgLWYgTWFrZWZpbGUudGVtIE1ha2VmaWxlCi0gICAgOzsKLSAgZXNhYwotZmkKLQotIyBSZWNvcmQgdGFyZ2V0X2NvbmZpZ2RpcnMgYW5kIHRoZSBjb25maWd1cmUgYXJndW1lbnRzIGluIE1ha2VmaWxlLgotdGFyZ2V0X2NvbmZpZ2RpcnM9YGVjaG8gIiR7dGFyZ2V0X2NvbmZpZ2RpcnN9IiB8IHNlZCAtZSAncy90YXJnZXQtLy9nJ2AKLXRhcmdhcmdzPWBlY2hvICIke2FyZ3VtZW50c30iIHwgXAotCXNlZCAtZSAncy8tLW5vW14gCV0qLy8nIFwKLQkgICAgLWUgJ3MvLS1jYWNoZVthLXotXSo9W14gCV0qLy8nIFwKLQkgICAgLWUgJ3MvLS1ob1thLXotXSo9W14gCV0qLy8nIFwKLQkgICAgLWUgJ3MvLS1idVthLXotXSo9W14gCV0qLy8nIFwKLQkgICAgLWUgJ3MvLS10YVthLXotXSo9W14gCV0qLy8nYAotCi0jIFBhc3NpbmcgYSAtLXdpdGgtY3Jvc3MtaG9zdCBhcmd1bWVudCBsZXRzIHRoZSB0YXJnZXQgbGlicmFyaWVzIGtub3cKLSMgd2hldGhlciB0aGV5IGFyZSBiZWluZyBidWlsdCB3aXRoIGEgY3Jvc3MtY29tcGlsZXIgb3IgYmVpbmcgYnVpbHQKLSMgbmF0aXZlLiAgSG93ZXZlciwgaXQgd291bGQgYmUgYmV0dGVyIHRvIHVzZSBvdGhlciBtZWNoYW5pc21zIHRvIG1ha2UgdGhlCi0jIHNvcnRzIG9mIGRlY2lzaW9ucyB0aGV5IHdhbnQgdG8gbWFrZSBvbiB0aGlzIGJhc2lzLiAgUGxlYXNlIGNvbnNpZGVyCi0jIHRoaXMgb3B0aW9uIHRvIGJlIGRlcHJlY2F0ZWQuICBGSVhNRS4KLWlmIFsgeCR7aXNfY3Jvc3NfY29tcGlsZXJ9ID0geHllcyBdOyB0aGVuCi0gIHRhcmdhcmdzPSItLXdpdGgtY3Jvc3MtaG9zdD0ke2hvc3RfYWxpYXN9ICR7dGFyZ2FyZ3N9IgotZmkKLQotIyBEZWZhdWx0IHRvIC0tZW5hYmxlLW11bHRpbGliLgotaWYgWyB4JHtlbmFibGVfbXVsdGlsaWJ9ID0geCBdOyB0aGVuCi0gIHRhcmdhcmdzPSItLWVuYWJsZS1tdWx0aWxpYiAke3RhcmdhcmdzfSIKLWZpCi0KLSMgUGFzcyAtLXdpdGgtbmV3bGliIGlmIGFwcHJvcHJpYXRlLiAgTm90ZSB0aGF0IHRhcmdldF9jb25maWdkaXJzIGhhcwotIyBjaGFuZ2VkIGZyb20gdGhlIGVhcmxpZXIgc2V0dGluZyBvZiB3aXRoX25ld2xpYi4KLWlmIFsgeCR7d2l0aF9uZXdsaWJ9ICE9IHhubyBdICYmIGVjaG8gIiAke3RhcmdldF9jb25maWdkaXJzfSAiIHwgZ3JlcCAiIG5ld2xpYiAiID4gL2Rldi9udWxsIDI+JjEgJiYgWyAtZCAke3NyY2Rpcn0vbmV3bGliIF0gOyB0aGVuCi0gIHRhcmdhcmdzPSItLXdpdGgtbmV3bGliICR7dGFyZ2FyZ3N9IgotZmkKLQotIyBwcm92aWRlIGEgcHJvcGVyIGd4eF9pbmNsdWRlX2Rpci4KLSMgTm90ZSwgaWYgeW91IGNoYW5nZSB0aGUgZGVmYXVsdCwgbWFrZSBzdXJlIHRvIGZpeCBib3RoIGhlcmUgYW5kIGluCi0jIHRoZSBnY2MsIGxpYmlvLCBsaWJzdGRjKysgYW5kIGxpYmcrKyBzdWJkaXJlY3Rvcmllcy4KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ3h4LWluY2x1ZGUtZGlyIG9yIC0td2l0aG91dC1neHgtaW5jbHVkZS1kaXIgd2FzIGdpdmVuLgotZ3h4X2luY2x1ZGVfZGlyPQotaWYgdGVzdCAtbiAiJHt3aXRoX2d4eF9pbmNsdWRlX2Rpcn0iOyB0aGVuCi0gIGNhc2UgIiR7d2l0aF9neHhfaW5jbHVkZV9kaXJ9IiBpbgotICAgIHllcyApCi0gICAgICBlY2hvICJjb25maWd1cmUuaW46IGVycm9yOiBiYWQgdmFsdWUgJHt3aXRodmFsfSBnaXZlbiBmb3IgZysrIGluY2x1ZGUgZGlyZWN0b3J5IiAxPiYyCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgbm8gKQotICAgICAgOzsKLSAgICAqICkKLSAgICAgIGd4eF9pbmNsdWRlX2Rpcj0ke3dpdGhfZ3h4X2luY2x1ZGVfZGlyfQotICAgICAgOzsKLSAgZXNhYwotZmkKLWlmIHRlc3QgeCR7Z3h4X2luY2x1ZGVfZGlyfSA9IHg7IHRoZW4KLSAgaWYgdGVzdCB4JHtlbmFibGVfdmVyc2lvbl9zcGVjaWZpY19ydW50aW1lX2xpYnN9ID0geHllczsgdGhlbgotICAgIGd4eF9pbmNsdWRlX2Rpcj0nJHtsaWJzdWJkaXJ9L2luY2x1ZGUvZysrJwotICBlbHNlCi0gICAgLiAke3RvcHNyY2Rpcn0vY29uZmlnLmlmCi0gICAgZ3h4X2luY2x1ZGVfZGlyPScke3ByZWZpeH0vaW5jbHVkZS9nKysnLSR7bGlic3RkY3h4X2ludGVyZmFjZX0KLSAgZmkKLWVsc2UKLSAgZ3h4X2luY2x1ZGVfZGlyPSR7Z3h4X2luY2x1ZGVfZGlyfQotZmkKLQotdGFyZ2FyZ3M9Ii0taG9zdD0ke3RhcmdldF9hbGlhc30gLS1idWlsZD0ke2J1aWxkX2FsaWFzfSAke3RhcmdhcmdzfSIKLXNlZCAtZSAiczpeVEFSR0VUX0NPTkZJR0RJUlNbIAldKj0uKiQ6VEFSR0VUX0NPTkZJR0RJUlMgPSAke3RhcmdldF9jb25maWdkaXJzfToiIFwKLSAgICAtZSAicyVeQ09ORklHX0FSR1VNRU5UU1sgCV0qPS4qJCVDT05GSUdfQVJHVU1FTlRTID0gJHt0YXJnYXJnc30lIiBcCi0gICAgLWUgInMlXlRBUkdFVF9TVUJESVJbIAldKj0uKiQlVEFSR0VUX1NVQkRJUiA9ICR7dGFyZ2V0X3N1YmRpcn0lIiBcCi0gICAgLWUgInMlXmd4eF9pbmNsdWRlX2RpclsgCV0qPS4qJCVneHhfaW5jbHVkZV9kaXI9JHtneHhfaW5jbHVkZV9kaXJ9JSIgXAotICAgICAgIE1ha2VmaWxlID4gTWFrZWZpbGUudGVtCi1ybSAtZiBNYWtlZmlsZQotbXYgLWYgTWFrZWZpbGUudGVtIE1ha2VmaWxlCi0KLSMKLSMgTG9jYWwgVmFyaWFibGVzOgotIyBmaWxsLWNvbHVtbjogMTMxCi0jIEVuZDoKLSMKZGlmZiAtLWdpdCBhL2V0Yy9DaGFuZ2VMb2cgYi9ldGMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUzYTNlLi4wMDAwMDAwCi0tLSBhL2V0Yy9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotMTk5OS0wNC0wMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBhZGQtbG9nLmVsLCBhZGQtbG9nLnZpOiBOZXcgZmlsZXMuCi0KLVdlZCBKYW4gMjAgMDE6MzM6NTAgMTk5OSAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIGNvbXAtdG9vbHMtdmVyaWZ5OiBSZW1vdmUgc29tZSBjaGVja3MgdGhhdCBhcmUgbm8gbG9uZ2VyIHZhbGlkLgotCi0xOTk4LTEyLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB0YXJnZXRkb2MvZnIzMC50ZXhpOiBOZXcgZG9jdW1lbnQuCi0JCi1UaHUgT2N0ICAxIDIxOjE1OjU5IDE5OTggIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjb21wLXRvb2xzLWZpeCwgY3Jvc3MtdG9vbHMtZml4OiBSZXBsYWNlIC91c3IvaW5jbHVkZQotCXdpdGggJHtGSVhJTkNESVJ9LgotCi1UdWUgQXVnIDExIDE5OjIyOjExIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlICh2ZXJzaW9uKTogVXBkYXRlIGNhbGN1bGF0aW9uLgotCi1GcmkgSnVuIDEyIDIxOjM0OjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRleGk6IFZhcmlvdXMgYWRkaXRpb25zLgotCSogTWFrZWZpbGUuaW4gKFRFWEkySFRNTCwgRFZJUFMpOiBOZXcgdmFyaWFibGVzLgotCShzdGFuZGFyZHMucHMpOiBOZXcgdGFyZ2V0LgotCShjb25maWd1cmUuZHZpKTogQ29weSAudGluIGZpbGVzIGluIGFzIHdlbGwuCi0JKGNvbmZpZ3VyZS5wcywgY29uZmlndXJlLmh0bWwpOiBOZXcgdGFyZ2V0cy4KLQkoY2xlYW4pOiBSZW1vdmUgY29uZmlnZGV2LmpwZyBhbmQgY29uZmlnYnVpbGQuanBnLgotCSogY29uZmlnZGV2LmZpZzogTmV3IGZpbGUuCi0JKiBjb25maWdkZXYuZWluOiBOZXcgZmlsZSAoRVBTIHZlcnNpb24gb2YgY29uZmlnZGV2LmZpZykuCi0JKiBjb25maWdkZXYuamluOiBOZXcgZmlsZSAoSlBFRyB2ZXJzaW9uIG9mIGNvbmZpZ2Rldi5maWcpLgotCSogY29uZmlnYnVpbGQuZmlnOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2J1aWxkLmVpbjogTmV3IGZpbGUgKEVQUyB2ZXJzaW9uIG9mIGNvbmZpZ2J1aWxkLmZpZykuCi0JKiBjb25maWdidWlsZC5qaW46IE5ldyBmaWxlIChKUEVHIHZlcnNpb24gb2YgY29uZmlnYnVpbGQuZmlnKS4KLQotV2VkIEp1biAxMCAxNDo0MToyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50ZXhpOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ2Rldi50aW46IE5ldyBmaWxlLgotCSogY29uZmlnYnVpbGQudGluOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChNQUtFSU5GTyk6IFVzZSBtYWtlaW5mbyBmcm9tIHRleGluZm8gZGlyZWN0b3J5IGlmCi0JaXQgZXhpc3RzLgotCShURVhJMkRWSSk6IExpa2V3aXNlIGZvciB0ZXhpMmR2aS4KLQkoSU5GT0ZJTEVTKTogQWRkIGNvbmZpZ3VyZS5pbmZvLgotCShEVklGSUxFUyk6IEFkZCBjb25maWd1cmUuZHZpLgotCShpbmZvKTogT25seSBidWlsZCBpbmZvIGZpbGVzIGlmIHRoZSBzb3VyY2UgZmlsZXMgZXhpc3QuCi0JKGluc3RhbGwtaW5mbyk6IE9ubHkgaW5zdGFsbCBpbmZvIGZpbGVzIGlmIHRoZXkgZXhpc3QuCi0JKGR2aSk6IE9ubHkgYnVpbGQgRFZJIGZpbGVzIGlmIHRoZSBzb3VyY2VzIGZpbGVzIGV4aXN0LgotCShjb25maWd1cmUuaW5mbyk6IE5ldyB0YXJnZXQuCi0JKGNvbmZpZ3VyZS5kdmkpOiBOZXcgdGFyZ2V0LgotCShjbGVhbik6IFJlbW92ZSBjb25maWdkZXYgYW5kIGNvbmZpZ2J1aWxkIGRlcml2ZWQgZmlsZXMuCi0KLQlSZW1vdmUgb2Jzb2xldGUgZG9jdW1lbnRhdGlvbi4KLQkqIGludHJvLnRleGk6IFJlbW92ZS4KLQkqIGluc3RhbGwudGV4aTogUmVtb3ZlLgotCSogY29uZmlnLW5hbWVzLnRleGk6IFJlbW92ZS4KLQkqIHNjcmVlbjEuZXBzOiBSZW1vdmUuCi0JKiBzY3JlZW4xLm9iajogUmVtb3ZlLgotCSogc2NyZWVuMi5lcHM6IFJlbW92ZS4KLQkqIHNjcmVlbjIub2JqOiBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlIGFib3ZlLgotCi1UaHUgTWF5IDIxIDE0OjM0OjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IEFkZCBub3RlIGFib3V0IGlnbm9yaW5nIGxpbmtlcgotCXdhcm5pbmcgbWVzc2FnZSB3aGVuIHVzaW5nIC0tc3VwcG9ydC1vbGQtY29kZS4KLQotTW9uIE1heSAxOCAxNDoyNzozNyAxOTk4ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiwgY29tcC10b29scy1maXgsIGNvbXAtdG9vbHMtdmVyaWZ5LCBjcm9zcy10b29scy1maXg6Ci0JVXNlICRHQ0N2biByYXRoZXIgdGhhbiBzdWJzdGl0dXRlIGV2ZXJ5d2hlcmUuCi0KLVRodSBNYXkgMTQgMTQ6NDM6MTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdGFyZ2V0ZG9jL2FybS1pbnRlcndvcmsudGV4aTogRG9jdW1lbnQgZGxsdG9vbCBzdXBwb3J0IG9mCi0JaW50ZXJ3b3JraW5nLiAKLQotVGh1IE1heSAgNyAxNjo0OTozOCAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gVENMX0xJQlJBUlksIFRLX0xJQlJBUlksCi0JYW5kIEdEQlRLX0ZJTEVOQU1FLgotCi1XZWQgQXByICAxIDE3OjExOjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHRhcmdldGRvYy9hcm0taW50ZXJ3b3JrLnRleGk6IERvY3VtZW50IEFSTS90aHVtYiBpbnRlcndvcmtpbmcuIAotCi1UdWUgTWFyIDMxIDE1OjI4OjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhbmRhcmRzLnRleGksIG1ha2Utc3Rkcy50ZXhpOiBVcGRhdGUgdG8gY3VycmVudCBGU0YgdmVyc2lvbnMuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbmRhcmRzLmluZm8pOiBEZXBlbmQgdXBvbiBtYWtlLXN0ZC50ZXhpLgotCi1UdWUgTWFyIDI0IDE2OjEzOjI2IDE5OTggIFN0dSBHcm9zc21hbiAgPGdyb3NzbWFuQGJodW5hLmN5Z251cy5jby51az4KLQotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mIDIuMTIuMSB0byBmaXggc2hlbGwgaXNzdWVzCi0JZm9yIE5UIG5hdGl2ZSBidWlsZHMuIAotCi1Nb24gTWFyICA5IDE2OjQxOjA0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlIChiaW5wcm9ncyk6IEFkZCBvYmpjb3B5LgotCi1UdWUgRmViIDI0IDE4OjExOjU4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlOiBhcy5uZXcgLT4gYXMtbmV3LCBsZC5uZXcgLT4gbGQtbmV3Ci0Jbm0ubmV3IC0+IG5tLW5ldy4gIE1ha2Ugc3ltbGlua3MgdG8gY3J0Ki5vLgotCi1GcmkgTm92IDIxIDEyOjU0OjU4IDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIC0tbm8tc3BsaXQgYXJndW1lbnQgdG8gYXZvaWQgY3JlYXRpbmcgZmlsZXMKLQl3aXRoIG5hbWVzIGxvbmdlciB0aGFuIDE0IGNoYXJhY3RlcnMuCi0KLVRodSBTZXAgMjUgMTM6MTM6MTEgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBlcm4uY3lnbnVzLmNvbSkKLQotCSogaW50cm8udGV4aTogQWRkIGNsb3NpbmcgaWZzZXQuCi0KLU1vbiBTZXAgIDEgMTA6MzE6MzIgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IE1vdmUgc2V0dGluZyBIT1NUIGFuZCBUQVJHRVQgdG8gdGhlIGJlZ2lubmluZwotCW9mIHRoZSBmaWxlIGZvciBlZGl0aW5nIGNvbnZlbmllbmNlLgotCi1Nb24gU2VwICAxIDEwOjI4OjM3IDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluLjogTW9yZSBmcmllbmRseSBvcHRpb25zL21lc3NhZ2VzIHdoZW4gZXh0cmFjdGluZwotCWZyb20gYSBmaWxlIGluc3RlYWQgb2YgYSB0YXBlIGRldmljZS4KLQotVHVlIEp1biAxNyAxNTo1MDoyMyAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogQWRkIC91c3IvYnNkIHRvIFBBVEggZm9yIElyaXggKGhvbWUgb2YgY29tcHJlc3MpCi0KLVRodSBKdW4gMTIgMTM6NDc6MDAgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluIChzaG93X2V4ZWNfcHJlZml4X21zZyk6IGZpeCBxdW90aW5nCi0KLVdlZCBKdW4gIDQgMTU6MzE6NDMgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogcmVidWlsZGluZy50ZXhpOiBSZW1vdmVkLgotCi1TYXQgTWF5IDI0IDE4OjAyOjIwIDE5OTcgIEFuZ2VsYSBNYXJpZSBUaG9tYXMgKGFuZ2VsYUBjeWdudXMuY29tKQotCi0JKiBjcm9zcy10b29scy1maXg6ICBSZW1vdmUgaG9zdCBjaGVjayBzaW5jZSBpdCBkb2Vzbid0IG1hdHRlcgotCWZvciB0aGlzIGNhc2UuCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiBjbGVhbiB1cCBtb3JlIHVudXNlZCBob3N0cy4KLQkqIEluc3RhbGwuaW4sIGNyb3NzLXRvb2xzLWZpeCwgY29tcC10b29scy1maXgsIGNvbXAtdG9vbHMtdmVyaWZ5OgotCUhhY2sgZm9yIGhvc3QgY2hlY2sgdG8gbm90IHdhcm4gdGhlIHVzZXIgZm9yIGNlcnRhaW4gY2FzZXMuCi0KLUZyaSBNYXkgMjMgMjM6NDY6MTAgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6IFJlbW92ZSBhIGxvdCBvZiB1bnVzZWQgY29kZQotCSogSW5zdGFsbC5pbjogUmVtb3ZlIHJlZmVyZW5jZSB0byBUQVBFZGZsdCwgdXNlIHZhcmlhYmxlcyBpbnN0ZWFkIG9mCi0Jc3RyaW5nIHN1YnN0aXR1dGlvbiB3aGVuIGFibGUuCi0KLUZyaSBBcHIgMTEgMTc6MjU6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBmaWxlIG5hbWVkIGluIEFDX0lOSVQgdG8gTWFrZWZpbGUuaW4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgMTEgMTg6MTI6NDIgMTk5NyAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogQmFjayBvdXQgY2hhbmdlIHRvIElOU1RBTExIT1NUIHRvCi0JY2FsbCBhbGwgSVJJWCBzeXN0ZW1zICJtaXBzLXNnaS1pcml4NCIKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSByZWZlcmVuY2VzIHRvIGNvbmZpZ3VyZS50ZXhpIGFuZCBjZmctcGFwZXIudGV4aS4KLQotVGh1IEFwciAxMCAyMzoyNjo0NSAxOTk3ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBzcmN0cmVlLnRleGksIGVtYWNzLXJlbG5vdGVzLnRleGksIGNmZy1wYXBlci50ZXhpOiBSZW1vdmUuCi0JKiBJbnN0YWxsLmluOiBSZW1vdmUgVWx0cml4LXNwZWNpZmljIGhhY2tzLgotCVVwZGF0ZSBDeWdudXMgcGhvbmUgbnVtYmVycy4KLQkoZ3Vlc3Nfc3lzdGVtKTogUmVtb3ZlIHNvbWUgb2xkIHN5c3RlbXMgKFVsdHJpeCwgT1NGMSB2MSAmIDIsCi0JbTY4ay1IUFVYLCBtNjhrIFN1bk9TLCBldGMuKQotCShzaG93X2dudV9yb290X21zZyk6IFJlbW92ZS4KLQlSZW1vdmVkIGFsbCB0aGUgcmVtb3ZlIG9wdGlvbiBjb2RlLgotCi1UaHUgQXByIDEwIDIzOjIzOjMzIDE5OTcgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIGNvbmZpZ3VyZS5tYW4sIGNvbmZpZ3VyZS50ZXhpOiBSZW1vdGUuCi0KLU1vbiBBcHIgIDcgMTg6MTU6MDAgMTk5NyAgQnJlbmRhbiBLZWhvZSA8YnJlbmRhbkBjeWdudXMuY29tPgotCi0gICAgICAgICogRml4IHRoZSB2ZXJzaW9uIHN0cmluZyBmb3IgT1NGMSA0LjAgdG8gcmVjb2duaXplIGVpdGhlcgotICAgICAgICBWNC4qIG9yIFg0LioKLQotTW9uIEFwciAgNyAxNTozNDo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN0YW5kYXJkcy50ZXhpLCBtYWtlLXN0ZHMudGV4aTogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb25zLgotCi1UdWUgTm92IDE5IDE1OjM2OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG1ha2UtcmVsLXN5bS10cmVlOiBOZXcgZmlsZS4KLQotV2VkIE9jdCAyMyAwMDozNDowNyAxOTk2ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogTG90cyBvZiBwYXRjaGVzIGZyb20gcHJvZ3Jlc3NpdmUuLi4KLSAJKiBJbnN0YWxsLmluOiByZXN0b3JlIERET1BUUyBmb3IgQUlYIDQueAotIAkqIEluc3RhbGwuaW4sIHN1YnN0LXN0cmluZ3M6IGFkZCBjYXNlIGZvciBERyBBdmlpb24KLSAJKiBzdWJzdC1zdHJpbmdzOiBmaXggdHlwbyBpbiBJTlNUQUxMZGlyIHZhciBzZXR0aW5nCi0gCSogY29tcC10b29scy12ZXJpZnk6IHNldCBTSExJQl9QQVRIIGZvciBzaGFyZWQgbGlicwotIAkqIEluc3RhbGwuaW4sIHN1YnN0LXN0cmluZ3M6ICBhZGQgY2FzZSBmb3Igc29sYXJpczIuNQotIAkqIEluc3RhbGwuaW46IGZpeCByZWdyZXNzaW9uIGZvciBocHBhMS4xIGNoZWNrCi0gCSogY29tcC10b29scy1maXg6IHNldCBMRF9MSUJSQVJZX1BBVEgKLSAJKiBjb21wLXRvb2xzLWZpeDogSWYgZml4aW5jbHVkZXMgZml4ZXMgL3Vzci9pbmNsdWRlL2xpbWl0cy5oLAotIAlpbnN0YWxsIGl0IGFzIHN5c2xpbWl0cy5oLgotCi1XZWQgT2N0IDE2IDE5OjIwOjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogSW5zdGFsbC5pbiAoZ3Vlc3Nfc3lzdGVtKTogVHJlYXQgcG93ZXJwYy1pYm0tYWl4NC4xIHRoZSBzYW1lIGFzCi0JcnM2MDAwLWlibS1haXg0LjEsIHNpbmNlIHRoZSBjb21waWxlciBub3cgdXNlcyBjb21tb24gbW9kZSBieQotCWRlZmF1bHQuCi0KLVdlZCBPY3QgIDIgMTU6Mzk6MDcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogY29uZmlndXJlLmluIChBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmNhY2hlLgotCi1XZWQgT2N0ICAyIDE0OjMzOjU4IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3dpdGNoIHRvIGF1dG9jb25mIGNvbmZpZ3VyZS5pbi4KLQkqIGNvbmZpZ3VyZTogTmV3LgotCSogTWFrZWZpbGUuaW46IFVzZSBhdXRvY29uZi1zdWJzdGl0dXRlZCB2YWx1ZXMuCi0KLVR1ZSBKdW4gMjUgMTg6NTY6MDggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGRhdGFkaXIpOiBDaGFuZ2VkIHRvICQocHJlZml4KS9zaGFyZS4KLQotRnJpIE1hciAyOSAxMTozODowMSAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUubWFuOiBDaGFuZ2VkIHRvIGJlIHJlY29nbml6ZWQgYnkgY2F0bWFuIC13IG9uIFNvbGFyaXMuCi0KLVdlZCBEZWMgIDYgMTU6NDA6MjggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tcC10b29scy1maXggKGZpeGluY2x1ZGVzKTogRGVmaW5lIEZJWFBST1RPX0RFRklORVMgZnJvbQotCS4uLi9pbnN0YWxsLXRvb2xzL2ZpeHByb3RvLWRlZmluZXMuCi0KLVN1biBOb3YgMTIgMTk6MzE6MjcgMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbXAtdG9vbHMtdmVyaWZ5ICh2ZXJpZnlfY3h4X2luaXRpYWxpemVycyk6IGRlbGV0ZSBhcmd2LAotCWFyZ2MgZGVjbGFyYXRpb25zLCBhZGQgLXN0YXRpYyB0byBjb21waWxlIGxpbmUuCi0JKHZlcmlmeV9jeHhfaGVsbG9fd29ybGQpOiBkZWxldGUgYXJndiwgYXJnYyBkZWNsYXJhdGlvbnMsIGFkZAotCS1zdGF0aWMgdG8gY29tcGlsZSBsaW5lLgotCi1XZWQgU2VwIDIwIDEzOjIxOjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4KLQotTW9uIEF1ZyAyOCAxNzoyNTo0OSAxOTk1ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbiAoUEFUSCk6ICBhZGQgL3Vzci91Y2IgdG8gJFBBVEggKGZvciBTdW5PUyA0LjEueCkuCi0KLVR1ZSBBdWcgMTUgMjE6NTE6NTggMTk5NSAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4gKGd1ZXNzX3N5c3RlbSk6IE1hdGNoIE9TRi8xIHYzLnggYXMgdGhlIHNhbWUgYXMgCi0gICAgICAgIHYyLngtLXYyLnggYmluYXJpZXMgYXJlIHVwd2FyZCBjb21wYXRpYmxlLgotCi1UdWUgQXVnIDE1IDIxOjQ2OjU0IDE5OTUgIEphc29uIE1vbGVuZGEgIChjcmFzaEBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluIChndWVzc19zeXN0ZW0pOiByZWNvZ25pemUgSFAgOTAwMC84MDAgc3lzdGVtcyBhcyB0aGUKLQlzYW1lIGFzIEhQIDkwMDAvNzAwIHN5c3RlbXMuCi0KLVR1ZSBBdWcgIDggMTM6MTE6NTYgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBJbnN0YWxsLmluOiBGb3IgZW1hY3MsIHJ1biBzaG93X2VtYWNzX2FsdGVybmF0ZV9tc2cgYW5kIGV4aXQuCi0JKHNob3dfZW1hY3NfYWx0ZXJuYXRlX21zZyk6IE5ldyBtZXNzYWdlIHNheWluZyBob3cgZW1hY3MgY2FuJ3QgYmUKLQlpbnN0YWxsZWQgaW4gYW4gYWx0ZXJuYXRlIHByZWZpeC4KLQotVGh1IEp1biAgOCAwMDo0Mjo1NiAxOTk1ICBBbmdlbGEgTWFyaWUgVGhvbWFzICA8YW5nZWxhQGNpcmRhbi5jeWdudXMuY29tPgotCi0gICAgICAgICogc3Vic3Qtc3RyaW5nczogY2hhbmdlIGR1IGNvbW1hbmRzIHRvICRCSU5ESVIvLiAmICRTUkNESVIvLiBqdXN0Ci0gICAgICAgIGluIGNhc2UgdGhleSBhcmUgc3ltbGlua3MuCi0KLVR1ZSBBcHIgMTggMTQ6MjM6MTAgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjZGstZml4OiBFeHRyYWN0ZWQgdGFibGUgb2YgdGFyZ2V0cyB0aGF0IGRvbid0IG5lZWQgdGhlaXIKLQkgIGhlYWRlcnMgZml4ZWQgZnJvbSBnY2MncyBjb25maWd1cmUgc2NyaXB0LgotCi0JKiBjZGstZml4LCBjZGstdmVyaWZ5OiBVc2UgJHtIT1NUfSBpbnN0ZWFkIG9mIHx8SE9TVHN0cnx8Ci0KLQkqIGNkay1maXgsIGNkay12ZXJpZnk6IE5ldyBmaWxlcywgaW5zdGFsbCBzY3JpcHQgZnJhZ21lbnRzIHVzZWQKLQkgIGZvciBDeWdudXMgRGV2ZWxvcGVyJ3MgS2l0LgotCi0JKiBJbnN0YWxsLmluIChkb19ta2Rpcik6IE5ldyBmdW5jdGlvbi4KLQotCSogSW5zdGFsbC5pbjogQWRkZWQgc3VwcG9ydCBmb3IgLS13aXRoIGFuZCAtLXdpdGhvdXQgb3B0aW9ucy4KLQkgIENoYW5nZWQgc28gdGhhdCB0YXBlIGNvbW1hbmRzIGFyZSBub3QgcnVuIHdoZW4gZXh0cmFjdGluZyAKLQkgIGZyb20gYSBmaWxlLgotCSAgKGRvX210KTogQ2hhbmdlZCB0byB0YWtlIG9ubHkgb25lIGFyZ3VtZW50LgotCi1XZWQgTWFyIDI5IDExOjE2OjM4IDE5OTUgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46IGNhdGNoIFVOQU1FPT1hbHBoYS1kZWMtb3NmMi54IGFuZCBjb3JyZWN0IGVudHJ5IGZvcgotCWFscGhhLWRlYy1vc2YxLngKLQkKLUZyaSBKYW4gMjcgMTI6MDQ6MjkgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzdWJzdC1zdHJpbmdzIChtaXBzLXNnaS1pcml4NSk6IE5ldyBlbnRyeSBpbiB0YWJsZS4KLQotVGh1IEphbiAxOSAxMjoxNTo0NCAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIEluc3RhbGwuaW46IE1ham9yIHJld3JpdGUsIGJ1bmRsZSBkZXBlbmRlbnQgY29kZSAoZm9yIGV4YW1wbGUsCi0JICBmaXhpbmNsdWRlcyBmb3IgY29tcC10b29scykgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBJbnN0YWxsCi0JICBzY3JpcHQgd2hlbiBpdCBpcyBnZW5lcmF0ZWQuCi0KLVR1ZSBKYW4gMTcgMTY6NTE6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBSZWJ1aWxkIHVzaW5nICQoU0hFTEwpLgotCi1UaHUgTm92ICAzIDE5OjMwOjMzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBEZXBlbmQgb24gaW5mby4KLQotRnJpIEF1ZyAxOSAxNjoxNjozOCAxOTk0ICBKYXNvbiBNb2xlbmRhICAgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogc2V0ICRGSVhfSEVBREVSIHNvIGZpeHByb3RvIGNhbiBmaW5kIGZpeC1oZWFkZXIuCi0KLUZyaSBNYXkgIDYgMTY6MTg6NTggMTk5NCAgSmFzb24gTW9sZW5kYSAgICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogYWRkIGEgc2VtaWNvbG9uIGluIHRoZSBpZiBzdGF0ZW1lbnQuCi0KLUZyaSBBcHIgMjkgMTY6NTY6MDcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjZmctcGFwZXIudGV4aTogVXBkYXRlIHNvbWUgb3V0ZGF0ZWQgaW5mb3JtYXRpb24uCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBQYXNzIGZpbGUsIG5vdCBkaXJlY3RvcnksIGFzIGxhc3QKLQlhcmcgdG8gSU5TVEFMTF9EQVRBLgotCSh1bmluc3RhbGwpOiBOZXcgdGFyZ2V0LgotCi1UaHUgQXByIDI4IDE0OjQyOjIyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLnRleGk6IENvbW1lbnQgb3V0IEBzbWFsbGJvb2suCi0KLQkqIE1ha2VmaWxlLmluOiBEZWZpbmUgVEVYSTJEVkkgYW5kIFRFWElESVIsIGFuZCB1c2UgdGhlIGxhdHRlci4KLQlSZW1vdmUgaW5mbyBmaWxlcyBpbiByZWFsY2xlYW4sIG5vdCBjbGVhbiwgcGVyIGNvZGluZyBzdGFuZGFyZHMuCi0JUmVtb3ZlIFRlWCBvdXRwdXQgaW4gY2xlYW4uCi0KLVR1ZSBBcHIgMjYgMTc6MTg6MDMgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiAgZml4aW5jbHVkZXMgb3V0cHV0IGlzIGFjdHVhbGx5IHB1dCBpbiBmaXhpbmNsdWRlcy5sb2csCi0gICAgICAgIGJ1dCBlY2hvJ2VkIG1lc3NhZ2VzIGNsYWltIGl0IGlzIGZpeGluYy5sb2cuICBUaGlzIGlzIHRoZSBzYW1lCi0JbWVzc2FnZXMgYXMgSSBsb2dnZWQgaW4gTWFyY2ggNCAxOTk0LCBidXQgZm9yIHNvbWUgcmVhc29uIHdlIGZvdW5kCi0JdGhlIGNoYW5nZSBoYWRuJ3QgYmVlbiBkb25lLiAgSSdsbCBoYXZlIHRvIGRpZyB0aHJvdWdoIHRoZSBsb2dzCi0JYW5kIGZpbmQgb3V0IHdoYXQgSSByZWFsbHkgZGlkIGRvIHRoYXQgZGF5LiA6KQotCi1Nb24gQXByIDI1IDIwOjI4OjE5IDE5OTQgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW46ICB1c2UgZXZhbCB0byBjYWxsIGRvX210KCkgZm9yIFVsdHJpeCBicm9rZW5uZXNzLgotCi1Nb24gQXByIDI1IDIwOjAwOjAwIDE5OTQgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIEluc3RhbGwuaW4oZG9fbXQpOiBleGl0IHdpdGggZXJyb3Igc3RhdHVzIDEgaWYgIyBvZiBwYXJhbWV0ZXJzCi0JIT0gMy4KLQotTW9uIEFwciAyNSAxOTo0MjozNiAxOTk0ICBKYXNvbiBNb2xlbmRhICAgKGNyYXNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiAgbG9zZSBUQVBFX0ZPUldBUkQgYW5kIFRBUEVfUkVXSU5ELCBhZGQgZG9fbXQoKQotCXRvIGRvIGFsbCB0YXBlIG1vdmVtZW50IG9wZXJhdGlvbnMuICBDdXJyZW50bHkgdW50ZXN0ZWQuICBBZGRyZXNzZXMKLQlQUiAjIDQ4ODYgZnJvbSBidWxsLgotCi0JKiBJbnN0YWxsLmluOiBhZGQgMTk5NCB0byB0aGUgY29weXJpZ2h0IHRoaW5nLgotCi1GcmkgQXByIDIyIDE5OjA1OjEzIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IFVwZGF0ZSBmcm9tIEZTRi4KLQotRnJpIEFwciAyMiAxNTo0NjoxMCAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBjeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBBZGQgJERET1BUUywgaGFzIGBgYnM9MTI0YicnIGZvciBhbGwgc3lzdGVtcyBleGNlcHQKLQlBSVggKHNvbWUgdmVyc2lvbnMgb2YgQUlYIGRvbid0IHVuZGVyc3RhbmQgYnM9MTI0Yi4gIFNpbGx5IE9TKS4KLQotTW9uIEFwciAgNCAyMjo1NTowNSAxOTk0ICBKYXNvbiBNb2xlbmRhIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogbnVsbCBvdXQgJFRPT0xTIGJlZm9yZSBhZGRpbmcgc3R1ZmYgdG8gaXQKLQlub24tZGVzdHJ1Y3RpdmVseS4KLQotV2VkIE1hciAzMCAyMTo0NTozNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBGaXggdHlwby4KLQotCSogY29uZmlndXJlLnRleGksIGNvbmZpZ3VyZS5tYW46IERvY3VtZW50IC0tZGlzYWJsZS0uCi0KLU1vbiBNYXIgMjggMTM6MjI6MTUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdGFuZGFyZHMudGV4aTogVXBkYXRlIGZyb20gRlNGLgotCi1TYXQgTWFyIDI2IDA5OjIxOjQ0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGksIG1ha2Utc3Rkcy50ZXhpOiBVcGRhdGUgZnJvbSBGU0YuCi0KLUZyaSBNYXIgMjUgMjI6NTk6NDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUudGV4aSwgY29uZmlndXJlLm1hbjogRG9jdW1lbnQgLS1lbmFibGUtKiBvcHRpb25zLgotCi1XZWQgTWFyIDIzIDIzOjM4OjI0IDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogc2V0IENQUCB0byBiZSBnY2MgLUUgZm9yIGZpeGluY2x1ZGVzLgotCi1XZWQgTWFyIDIzIDEzOjQyOjQ4IDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotICAgICAgICAqIEluc3RhbGwuaW46IHNldCBQQVRIIHRvICRQQVRIOi9iaW46L3Vzci9iaW4gc28gd2UgY2FuIHBpY2sKLSAgICAgICAgdXAgbmF0aXZlIHRvb2xzIGV2ZW4gaWYgdGhlIHVzZXIgZG9lc24ndCBoYXZlIHRoZW0gaW4gaGlzCi0gICAgICAgIHBhdGguCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiBgYGhwcGEtMS4xLWhwLWhwdXgnJyAtPiBgYGhwcGExLjEtaHAtaHB1eCcnLgotCi1UdWUgTWFyIDE1IDIyOjA5OjIwIDE5OTQgIEphc29uIE1vbGVuZGEgIChjcmFzaEBzZW5kYWkuY3lnbnVzLmNvbSkKLSAgICAgICAgCi0gICAgICAgICogSW5zdGFsbC5pbjogVEFQRV9SRVdJTkQgYW5kIFRBUEVfRk9SV0FSRCB2YXJpYWJsZXMgZm9yIFVuaXh1bmF3YXJlLAotICAgICAgICBhZGRlZCBzd2l0Y2ggc3RhdGVtZW50IHRvIGRldGVjdCBpZiBzeXN0ZW0gaXMgVW5peHVuYXdhcmUuCi0KLUZyaSBNYXIgIDQgMTI6MTA6MzAgMTk5NCAgSmFzb24gTW9sZW5kYSAoY3Jhc2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBJbnN0YWxsLmluOiAgZml4aW5jbHVkZXMgb3V0cHV0IGlzIGFjdHVhbGx5IHB1dCBpbiBmaXhpbmNsdWRlcy5sb2csCi0gICAgICAgIGJ1dCBlY2hvJ2VkIG1lc3NhZ2VzIGNsYWltIGl0IGlzIGZpeGluYy5sb2cuCi0KLVdlZCBOb3YgIDMgMDI6NTg6MDIgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6ICBvdXRwdXQgVEVYQlVORExFIGZvciBtb3JlIGluc3RhbGwgbm90ZXMgbWF0Y2hpbmcKLQkqIGluc3RhbGwtdGV4aS5pbjogIFBSTVMgaW5mbyBub3cgZXhpc3RzCi0KLVR1ZSBPY3QgMjYgMTY6NTc6MTIgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiBtYXRjaCBzb2xhcmlzKi4gIEFsc28sIGFkZCBkZWZhdWx0IGNhc2UgdG8gY2F0Y2gKLQkgIGFuZCBlcnJvciBvdXQgZm9yIHVucmVjb2duaXplZCBzeXN0ZW1zLgotCi1UaHUgQXVnIDE5IDE4OjIxOjMxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogaGFuZGxlIHRoZSBuZXcgZml4cHJvdG8gd29yawotCi1Nb24gSnVsIDE5IDEyOjA1OjQxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogcmVtb3ZlICJNVD10Y3RsIiBmb3IgQUlYIChub3QgbmVlZGVkLCBhbmQgYmFyZWx5Ci0Jd29ya2VkIGFueXdheSkKLQotTW9uIEp1biAxNCAxOTowOToyMiAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiBjaGFuZ2VkIEhPU1QgdG8gcmVjb2duaXplIFNvbGFyaXMgZm9yIGluc3RhbGwgbm90ZXMKLQotVGh1IEp1biAxMCAxNjowMToyNSAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBkb3MtaW5zdC50ZXhpOiAgbmV3IGZpbGUuCi0KLVdlZCBKdW4gIDkgMTk6MjM6NTkgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAcnRsLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBpbnN0YWxsLXRleGkuaW46ICAgICAgICBhZGRlZCBjb25kaXRpb25hbHMgKG5lYXJseSBjb21wbGV0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbmVkIHVwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgc3VwcG9ydCBmb3Igb3RoZXIgcmVsZWFzZXMgKG5vdCBkb25lKQotCi1XZWQgSnVuICA5IDE1OjUzOjU4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogVXNlIElOU1RBTExfREFUQS4KLQkoe2Rpc3QscmVhbH1jbGVhbik6IEFsc28gZGVsZXRlIE1ha2VmaWxlIGFuZCBjb25maWcuc3RhdHVzLgotCi1GcmkgSnVuICA0IDE3OjA5OjU2IDE5OTMgIEplZmZyZXkgT3NpZXIgIChqZWZmcmV5QGN5Z251cy5jb20pCi0KLQkqIHN1YnN0LXN0cmluZ3M6ICBhZGRlZCBkYXRhIGZvciBPU19TVFJJTkcKLQotCSogc3Vic3Qtc3RyaW5nczogIGFkZGVkIHN1cHBvcnQgZm9yIE9TX1NUUklORwotCi1UaHUgSnVuICAzIDAwOjM3OjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogSW5zdGFsbC5pbjogcHVsbCBDT1BZSU5HIGFuZCBDT1BZSU5HLkxJQiBvZmYgb2YgdGhlIHRhcGUgCi0KLVR1ZSBKdW4gIDEgMTY6NTI6MDggMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzdWJzdC1zdHJpbmdzOiByZXBsYWNlIFJFTEVBU0VfRElSIHRvbwotCi1Nb24gTWFyIDIyIDIzOjU1OjI3IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLVdlZCBNYXIgMTcgMDI6MjE6MTUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBJbnN0YWxsLmluOiBmaXggJ3NvdXJjZSBvbmx5JyBleHRyYWN0aW9uIGJ1ZyB3aGVyZSBpdCBsb29rZWQgZm9yCi0JdGhlIHNyYyBkaXIgdW5kZXIgSC08aG9zdD4vc3JjIGluc3RlYWQgb2Ygc3JjOyBhbHNvIHJlbW92ZSBzdHJheQotCXJlZmVyZW5jZSB0byBFTUFDU0hJQklOCi0KLU1vbiBNYXIgMTUgMDE6MjU6NDUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBtYWtlLXN0ZHMudGV4aTogYWRkZWQgJ2luc3RhbGxjaGVjaycgdG8gdGhlIHN0YW5kYXJkIHRhcmdldHMKLQotVHVlIE1hciAgOSAxOTo0ODoyOCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIHN0YW5kYXJkcy50ZXhpOiBhZGRlZCBJTkZPLURJUi1FTlRSWSwgdXBkYXRlZCB2ZXJzaW9uIGZyb20gdGhlIEZTRgotCi1UdWUgRmViICA5IDEyOjQwOjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0YW5kYXJkcy5pbmZvKTogQWRkZWQgLUkkKHNyY2RpcikgdG8gZmluZAotCW1ha2Utc3Rkcy50ZXhpLgotCi1Nb24gRmViICAxIDE2OjMyOjU2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogc3RhbmRhcmRzLnRleGk6IHVwZGF0ZWQgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLCB3aGljaCBpbmNsdWRlczoKLQotCSogbWFrZS1zdGRzLnRleGk6IG5ldyBmaWxlCi0KLU1vbiBOb3YgMzAgMDE6MzE6NDAgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBpbnN0YWxsLXRleGkuaW4sIHJlbG5vdGVzLnRleGksIGludHJvLnRleGk6IGNoYW5nZWQgQ3lnbnVzIHBob25lCi0JbnVtYmVycyBmcm9tIHRoZSBvbGQgUGFsbyBBbHRvIG9uZXMgdG8gdGhlIG5ldyBNdG4uIFZpZXcgbnVtYmVycwotCi1Nb24gTm92IDE2IDE2OjUwOjQzIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRlZmluZSAkKFJNKSB0byAicm0gLWYiCi0KLVN1biBPY3QgMTEgMTY6MDU6NDggMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBpbnRyby50ZXhpOiBhZGRlZCBJTkZPLURJUi1FTlRSWQotCmRpZmYgLS1naXQgYS9ldGMvTWFrZWZpbGUuaW4gYi9ldGMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZGM4YzkuLjAwMDAwMDAKLS0tIGEvZXRjL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSMgCi0jIE1ha2VmaWxlLmluIGZvciBldGMKLSMKLQotcHJlZml4IAkJPSBAcHJlZml4QAotZXhlY19wcmVmaXggCT0gQGV4ZWNfcHJlZml4QAotCi1zcmNkaXIgID0gQHNyY2RpckAKLVZQQVRICT0gQHNyY2RpckAKLQotYmluZGlyICA9IEBiaW5kaXJACi1saWJkaXIgID0gQGxpYmRpckAKLXRvb2xkaXIgPSAkKGxpYmRpcikKLWRhdGFkaXIgPSBAZGF0YWRpckAKLQotbWFuZGlyICA9IEBtYW5kaXJACi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLW1hbjJkaXIgPSAkKG1hbmRpcikvbWFuMgotbWFuM2RpciA9ICQobWFuZGlyKS9tYW4zCi1tYW40ZGlyID0gJChtYW5kaXIpL21hbjQKLW1hbjVkaXIgPSAkKG1hbmRpcikvbWFuNQotbWFuNmRpciA9ICQobWFuZGlyKS9tYW42Ci1tYW43ZGlyID0gJChtYW5kaXIpL21hbjcKLW1hbjhkaXIgPSAkKG1hbmRpcikvbWFuOAotbWFuOWRpciA9ICQobWFuZGlyKS9tYW45Ci1pbmZvZGlyID0gQGluZm9kaXJACi0KLVNIRUxMID0gL2Jpbi9zaAotCi1JTlNUQUxMIAk9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKLUlOU1RBTExfREFUQSAgICA9IEBJTlNUQUxMX0RBVEFACi0KLU1BS0VJTkZPID0gYGlmIFsgLWYgLi4vdGV4aW5mby9tYWtlaW5mby9tYWtlaW5mbyBdOyBcCi0JdGhlbiBlY2hvIC4uL3RleGluZm8vbWFrZWluZm8vbWFrZWluZm87IFwKLQllbHNlIGVjaG8gbWFrZWluZm87IGZpYAotVEVYSTJEVkkgPSBgaWYgWyAtZiAuLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmkgXTsgXAotCXRoZW4gZWNobyAuLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IFwKLQllbHNlIGVjaG8gdGV4aTJkdmk7IGZpYAotVEVYSTJIVE1MID0gdGV4aTJodG1sCi1EVklQUyA9IGR2aXBzCi0KLSMgV2hlcmUgdG8gZmluZCB0ZXhpbmZvLnRleCB0byBmb3JtYXQgZG9jdW1lbnRhdGlvbiB3aXRoIFRlWC4KLVRFWElESVIgPSAkKHNyY2RpcikvLi4vdGV4aW5mbwotCi0jIyMjIEhvc3QsIHRhcmdldCwgYW5kIHNpdGUgc3BlY2lmaWMgTWFrZWZpbGUgZnJhZ21lbnRzIGNvbWUgaW4gaGVyZS4KLSMjIwotCi1JTkZPRklMRVMgPSBzdGFuZGFyZHMuaW5mbyBjb25maWd1cmUuaW5mbwotRFZJRklMRVMgPSBzdGFuZGFyZHMuZHZpIGNvbmZpZ3VyZS5kdmkKLQotYWxsOgotCi1pbnN0YWxsOgotCi11bmluc3RhbGw6Ci0KLWluZm86Ci0JZm9yIGYgaW4gJChJTkZPRklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS9gZWNobyAkJGYgfCBzZWQgLWUgJ3MvLmluZm8kJC8udGV4aS8nYDsgdGhlbiBcCi0JICAgIGlmICQoTUFLRSkgIk1BS0VJTkZPPSQoTUFLRUlORk8pIiAkJGY7IHRoZW4gXAotCSAgICAgIHRydWU7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgZXhpdCAxOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQotaW5zdGFsbC1pbmZvOiBpbmZvCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21raW5zdGFsbGRpcnMgJChpbmZvZGlyKQotCWlmIHRlc3QgISAtZiBzdGFuZGFyZHMuaW5mbzsgdGhlbiBjZCAkKHNyY2Rpcik7IGZpOyBcCi0JaWYgdGVzdCAtZiBzdGFuZGFyZHMuaW5mbzsgdGhlbiBcCi0JICBmb3IgaSBpbiBzdGFuZGFyZHMuaW5mbyo7IGRvIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkaSAkKGluZm9kaXIpLyQkaTsgXAotCSAgZG9uZTsgXAotCWZpCi0JaWYgdGVzdCAhIC1mIGNvbmZpZ3VyZS5pbmZvOyB0aGVuIGNkICQoc3JjZGlyKTsgZmk7IFwKLQlpZiB0ZXN0IC1mIGNvbmZpZ3VyZS5pbmZvOyB0aGVuIFwKLQkgIGZvciBpIGluIGNvbmZpZ3VyZS5pbmZvKjsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRpICQoaW5mb2RpcikvJCRpOyBcCi0JICBkb25lOyBcCi0JZmkKLQotZHZpOgotCWZvciBmIGluICQoRFZJRklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQoc3JjZGlyKS9gZWNobyAkJGYgfCBzZWQgLWUgJ3MvLmR2aSQkLy50ZXhpLydgOyB0aGVuIFwKLQkgICAgaWYgJChNQUtFKSAiVEVYSTJEVkk9JChURVhJMkRWSSkiICQkZjsgdGhlbiBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBlbHNlIFwKLQkgICAgICBleGl0IDE7IFwKLQkgICAgZmk7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1zdGFuZGFyZHMuaW5mbzogJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpICQoc3JjZGlyKS9tYWtlLXN0ZHMudGV4aQotCSQoTUFLRUlORk8pIC0tbm8tc3BsaXQgLUkkKHNyY2RpcikgLW8gc3RhbmRhcmRzLmluZm8gJChzcmNkaXIpL3N0YW5kYXJkcy50ZXhpCi0KLXN0YW5kYXJkcy5kdmk6ICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQotCVRFWElOUFVUUz0kKFRFWElESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9zdGFuZGFyZHMudGV4aQotCi1zdGFuZGFyZHMucHM6IHN0YW5kYXJkcy5kdmkKLQkkKERWSVBTKSBzdGFuZGFyZHMuZHZpIC1vIHN0YW5kYXJkcy5wcwotCi0jIG1ha2VpbmZvIHJlcXVpcmVzIGltYWdlcyB0byBiZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi1jb25maWd1cmUuaW5mbzogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpICQoc3JjZGlyKS9jb25maWdkZXYudGluICQoc3JjZGlyKS9jb25maWdidWlsZC50aW4KLQlybSAtZiBjb25maWdkZXYudHh0IGNvbmZpZ2J1aWxkLnR4dAotCWNwICQoc3JjZGlyKS9jb25maWdkZXYudGluIGNvbmZpZ2Rldi50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQudGluIGNvbmZpZ2J1aWxkLnR4dAotCSQoTUFLRUlORk8pIC1JJChzcmNkaXIpIC1vIGNvbmZpZ3VyZS5pbmZvICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0KLSMgdGV4aTJkdmkgd2FudHMgYm90aCB0aGUgLnR4dCBhbmQgdGhlIC5lcHMgZmlsZXMuCi1jb25maWd1cmUuZHZpOiAkKHNyY2RpcikvY29uZmlndXJlLnRleGkgJChzcmNkaXIpL2NvbmZpZ2Rldi50aW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiAkKHNyY2RpcikvY29uZmlnZGV2LmVpbiAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQKLQljcCAkKHNyY2RpcikvY29uZmlnZGV2LnRpbiBjb25maWdkZXYudHh0Ci0JY3AgJChzcmNkaXIpL2NvbmZpZ2J1aWxkLnRpbiBjb25maWdidWlsZC50eHQKLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdkZXYuZWluIGNvbmZpZ2Rldi5lcHMKLQljcCAkKHNyY2RpcikvY29uZmlnYnVpbGQuZWluIGNvbmZpZ2J1aWxkLmVwcwotCVRFWElOUFVUUz0kKFRFWElESVIpOiQkVEVYSU5QVVRTICQoVEVYSTJEVkkpICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCXJtIC1mIGNvbmZpZ2Rldi50eHQgY29uZmlnYnVpbGQudHh0Ci0Jcm0gLWYgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQotIyBkdmlwcyByZXF1aXJlcyBpbWFnZXMgdG8gYmUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci1jb25maWd1cmUucHM6IGNvbmZpZ3VyZS5kdmkgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gJChzcmNkaXIpL2NvbmZpZ2J1aWxkLmVpbgotCXJtIC1mIGNvbmZpZ2Rldi5lcHMgY29uZmlnYnVpbGQuZXBzCi0JY3AgJChzcmNkaXIpL2NvbmZpZ2Rldi5laW4gY29uZmlnZGV2LmVwcwotCWNwICQoc3JjZGlyKS9jb25maWdidWlsZC5laW4gY29uZmlnYnVpbGQuZXBzCi0JJChEVklQUykgY29uZmlndXJlLmR2aSAtbyBjb25maWd1cmUucHMKLQlybSAtZiBjb25maWdkZXYuZXBzIGNvbmZpZ2J1aWxkLmVwcwotCi1jb25maWd1cmUuaHRtbDogJChzcmNkaXIpL2NvbmZpZ3VyZS50ZXhpCi0JJChURVhJMkhUTUwpIC1zcGxpdF9jaGFwdGVyICQoc3JjZGlyKS9jb25maWd1cmUudGV4aQotCi1jbGVhbjoKLQlybSAtZiAqLmF1eCAqLmNwICouY3BzICouZHZpICouZm4gKi5mbnMgKi5reSAqLmt5cyAqLmxvZwotCXJtIC1mICoucGcgKi5wZ3MgKi50b2MgKi50cCAqLnRwcyAqLnZyICoudnJzCi0Jcm0gLWYgY29uZmlnZGV2LnR4dCBjb25maWdidWlsZC50eHQgY29uZmlnZGV2LmVwcyBjb25maWdidWlsZC5lcHMKLQlybSAtZiBjb25maWdkZXYuanBnIGNvbmZpZ2J1aWxkLmpwZwotCi1tb3N0bHljbGVhbjogY2xlYW4KLQotZGlzdGNsZWFuOiAgIGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUKLQotbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46ICAgZGlzdGNsZWFuCi0Jcm0gLWYgKi5pbmZvKgotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICQoaG9zdF9tYWtlZmlsZV9mcmFnKSAkKHRhcmdldF9tYWtlZmlsZV9mcmFnKQotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIyB0aGVzZSBsYXN0IHRhcmdldHMgYXJlIGZvciBzdGFuZGFyZHMudGV4aSBjb25mb3JtYW5jZQotZGlzdDoKLWNoZWNrOgotaW5zdGFsbGNoZWNrOgotVEFHUzoKZGlmZiAtLWdpdCBhL2V0Yy9hZGQtbG9nLmVsIGIvZXRjL2FkZC1sb2cuZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzg4ZTguLjAwMDAwMDAKLS0tIGEvZXRjL2FkZC1sb2cuZWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NzMgKzAsMCBAQAotOzs7ID09PT09PT09PT09PSBOT1RFIFdFTEwhID09PT09PT09PT09PT0KLTs7OwotOzs7IFlvdSBvbmx5IG5lZWQgdG8gdXNlIHRoaXMgZmlsZSBpZiB5b3UncmUgdXNpbmcgYSB2ZXJzaW9uIG9mIEVtYWNzCi07OzsgcHJpb3IgdG8gMjAuMSB0byB3b3JrIG9uIEdEQi4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzCi07OzsgYW5kIHRoZSBzdGFuZGFyZCBhZGQtbG9nLmVsIHByb3ZpZGVkIHdpdGggMTkuMzQgaXMgdGhhdCBpdAotOzs7IGdlbmVyYXRlcyBkYXRlcyB1c2luZyB0aGUgdGVyc2VyIGZvcm1hdCB1c2VkIGJ5IEVtYWNzIDIwLiAgVGhpcyBpcwotOzs7IHRoZSBmb3JtYXQgcmVjb21tZW5kZWQgZm9yIHVzZSBpbiBHREIgQ2hhbmdlTG9ncy4KLTs7OwotOzs7IFRvIHVzZSB0aGlzIGNvZGUsIHlvdSBzaG91bGQgY3JlYXRlIGEgZGlyZWN0b3J5IGB+L2VsaXNwJywgc2F2ZSB0aGUgY29kZQotOzs7IGJlbG93IGluIGB+L2VsaXNwL2FkZC1sb2cuZWwnLCBhbmQgdGhlbiBwdXQgc29tZXRoaW5nIGxpa2UgdGhpcyBpbgotOzs7IHlvdXIgYH4vLmVtYWNzJyBmaWxlLCB0byB0ZWxsIEVtYWNzIHdoZXJlIHRvIGZpbmQgaXQ6Ci07OzsgCi07OzsgKHNldHEgbG9hZC1wYXRoCi07OzsgICAgICAgKGNvbnMgKGV4cGFuZC1maWxlLW5hbWUgIn4vZWxpc3AiKQotOzs7ICAgICAgICAgICAgIGxvYWQtcGF0aCkpCi07OzsgCi07OzsgSWYgeW91IHdhbnQsIHlvdSBjYW4gYWxzbyBieXRlLWNvbXBpbGUgaXQgLS0tIGl0J2xsIHJ1biBhIGxpdHRsZQotOzs7IGZhc3RlciwgYW5kIHVzZSBhIGxpdHRsZSBsZXNzIG1lbW9yeS4gIChOb3QgdGhhdCB0aG9zZSBtYXR0ZXIgbXVjaCBmb3IKLTs7OyB0aGlzIGZpbGUuKSAgVG8gZG8gdGhhdCwgYWZ0ZXIgeW91J3ZlIHNhdmVkIHRoZSB0ZXh0IGFzCi07Ozsgfi9lbGlzcC9hZGQtbG9nLmVsLCBicmluZyBpdCB1cCBpbiBFbWFjcywgYW5kIHR5cGUKLTs7OyAKLTs7OyAgICAgQy11IE0teCBieXRlLWNvbXBpbGUtZmlsZQotOzs7Ci07OzsgLS0tIEppbSBCbGFuZHkKLQotOzs7IGFkZC1sb2cuZWwgLS0tIGNoYW5nZSBsb2cgbWFpbnRlbmFuY2UgY29tbWFuZHMgZm9yIEVtYWNzCi0KLTs7IENvcHlyaWdodCAoQykgMTk4NSwgMTk4NiwgMTk4OCwgMTk5MywgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotOzsgS2V5d29yZHM6IG1haW50Ci0KLTs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KLQotOzsgR05VIEVtYWNzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLTs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci07OyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi07OyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotOzsgR05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi07OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotOzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotOzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotOzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLTs7IGFsb25nIHdpdGggR05VIEVtYWNzOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi07OyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLTs7IEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi07OzsgQ29tbWVudGFyeToKLQotOzsgVGhpcyBmYWNpbGl0eSBpcyBkb2N1bWVudGVkIGluIHRoZSBFbWFjcyBNYW51YWwuCi0KLTs7OyBDb2RlOgotCi0oZGVmdmFyIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lIG5pbAotICAiKk5hbWUgb2YgYSBjaGFuZ2UgbG9nIGZpbGUgZm9yIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5XS4iKQotCi0oZGVmdmFyIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1mdW5jdGlvbiBuaWwKLSAgIlwKLSpJZiBub24tbmlsLCBmdW5jdGlvbiB0byBndWVzcyBuYW1lIG9mIGN1cnJlbnQgZnVuY3Rpb24gZnJvbSBzdXJyb3VuZGluZyB0ZXh0LgotXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIGNhbGxzIHRoaXMgZnVuY3Rpb24gKGlmIG5pbCwgYGFkZC1sb2ctY3VycmVudC1kZWZ1bicKLWluc3RlYWQpIHdpdGggbm8gYXJndW1lbnRzLiAgSXQgcmV0dXJucyBhIHN0cmluZyBvciBuaWwgaWYgaXQgY2Fubm90IGd1ZXNzLiIpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdmFyIGFkZC1sb2ctZnVsbC1uYW1lIG5pbAotICAiKkZ1bGwgbmFtZSBvZiB1c2VyLCBmb3IgaW5jbHVzaW9uIGluIENoYW5nZUxvZyBkYWlseSBoZWFkZXJzLgotVGhpcyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGB1c2VyLWZ1bGwtbmFtZScgZnVuY3Rpb24uIikKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ2YXIgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MgbmlsCi0gICIqRWxlY3Ryb25pYyBtYWlsIGFkZHJlc3Mgb2YgdXNlciwgZm9yIGluY2x1c2lvbiBpbiBDaGFuZ2VMb2cgZGFpbHkgaGVhZGVycy4KLVRoaXMgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIGB1c2VyLW1haWwtYWRkcmVzcycuIikKLQotKGRlZnZhciBjaGFuZ2UtbG9nLWZvbnQtbG9jay1rZXl3b3JkcwotICAnKCgiXltTTVRXRl0uKyIgLiBmb250LWxvY2stZnVuY3Rpb24tbmFtZS1mYWNlKQk7IERhdGUgbGluZS4KLSAgICAoIl5cdFxcKiBcXChbXiA6XG5dK1xcKSIgMSBmb250LWxvY2stY29tbWVudC1mYWNlKQk7IEZpbGUgbmFtZS4KLSAgICAoIihcXChbXilcbl0rXFwpKToiIDEgZm9udC1sb2NrLWtleXdvcmQtZmFjZSkpCTsgRnVuY3Rpb24gbmFtZS4KLSAgIkFkZGl0aW9uYWwgZXhwcmVzc2lvbnMgdG8gaGlnaGxpZ2h0IGluIENoYW5nZSBMb2cgbW9kZS4iKQotCi0oZGVmdmFyIGNoYW5nZS1sb2ctbW9kZS1tYXAgbmlsCi0gICJLZXltYXAgZm9yIENoYW5nZSBMb2cgbWFqb3IgbW9kZS4iKQotKGlmIGNoYW5nZS1sb2ctbW9kZS1tYXAKLSAgICBuaWwKLSAgKHNldHEgY2hhbmdlLWxvZy1tb2RlLW1hcCAobWFrZS1zcGFyc2Uta2V5bWFwKSkKLSAgKGRlZmluZS1rZXkgY2hhbmdlLWxvZy1tb2RlLW1hcCAiXE0tcSIgJ2NoYW5nZS1sb2ctZmlsbC1wYXJhZ3JhcGgpKQotCi0oZGVmdW4gY2hhbmdlLWxvZy1uYW1lICgpCi0gIChvciBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZQotICAgICAgKGlmIChlcSBzeXN0ZW0tdHlwZSAndmF4LXZtcykgCi0JICAiJENIQU5HRV9MT0ckLlRYVCIgCi0JKGlmIChvciAoZXEgc3lzdGVtLXR5cGUgJ21zLWRvcykgKGVxIHN5c3RlbS10eXBlICd3aW5kb3dzLW50KSkKLQkgICAgImNoYW5nZWxvIgotCSAgIkNoYW5nZUxvZyIpKSkpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gcHJvbXB0LWZvci1jaGFuZ2UtbG9nLW5hbWUgKCkKLSAgIlByb21wdCBmb3IgYSBjaGFuZ2UgbG9nIG5hbWUuIgotICAobGV0KiAoKGRlZmF1bHQgKGNoYW5nZS1sb2ctbmFtZSkpCi0JIChuYW1lIChleHBhbmQtZmlsZS1uYW1lCi0JCShyZWFkLWZpbGUtbmFtZSAoZm9ybWF0ICJMb2cgZmlsZSAoZGVmYXVsdCAlcyk6ICIgZGVmYXVsdCkKLQkJCQluaWwgZGVmYXVsdCkpKSkKLSAgICA7OyBIYW5kbGUgc29tZXRoaW5nIHRoYXQgaXMgc3ludGFjdGljYWxseSBhIGRpcmVjdG9yeSBuYW1lLgotICAgIDs7IExvb2sgZm9yIENoYW5nZUxvZyBvciB3aGF0ZXZlciBpbiB0aGF0IGRpcmVjdG9yeS4KLSAgICAoaWYgKHN0cmluZz0gKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgbmFtZSkgIiIpCi0JKGV4cGFuZC1maWxlLW5hbWUgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZGVmYXVsdCkKLQkJCSAgbmFtZSkKLSAgICAgIDs7IEhhbmRsZSBzcGVjaWZ5aW5nIGEgZmlsZSB0aGF0IGlzIGEgZGlyZWN0b3J5LgotICAgICAgKGlmIChmaWxlLWRpcmVjdG9yeS1wIG5hbWUpCi0JICAoZXhwYW5kLWZpbGUtbmFtZSAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBkZWZhdWx0KQotCQkJICAgIChmaWxlLW5hbWUtYXMtZGlyZWN0b3J5IG5hbWUpKQotCW5hbWUpKSkpCi0KLTs7OyMjI2F1dG9sb2FkCi0oZGVmdW4gZmluZC1jaGFuZ2UtbG9nICgmb3B0aW9uYWwgZmlsZS1uYW1lKQotICAiRmluZCBhIGNoYW5nZSBsb2cgZmlsZSBmb3IgXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIGFuZCByZXR1cm4gdGhlIG5hbWUuCi0KLU9wdGlvbmFsIGFyZyBGSUxFLU5BTUUgc3BlY2lmaWVzIHRoZSBmaWxlIHRvIHVzZS4KLUlmIEZJTEUtTkFNRSBpcyBuaWwsIHVzZSB0aGUgdmFsdWUgb2YgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4KLUlmICdjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScgaXMgbmlsLCBiZWhhdmUgYXMgdGhvdWdoIGl0IHdlcmUgJ0NoYW5nZUxvZycKLVwob3Igd2hhdGV2ZXIgd2UgdXNlIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbSkuCi0KLUlmICdjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZScgY29udGFpbnMgYSBsZWFkaW5nIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4KLXNpbXBseSBmaW5kIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIE90aGVyd2lzZSwgc2VhcmNoIGluIHRoZSBjdXJyZW50IAotZGlyZWN0b3J5IGFuZCBpdHMgc3VjY2Vzc2l2ZSBwYXJlbnRzIGZvciBhIGZpbGUgc28gbmFtZWQuCi0KLU9uY2UgYSBmaWxlIGlzIGZvdW5kLCBgY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUnIGlzIHNldCBsb2NhbGx5IGluIHRoZQotY3VycmVudCBidWZmZXIgdG8gdGhlIGNvbXBsZXRlIGZpbGUgbmFtZS4iCi0gIDs7IElmIHVzZXIgc3BlY2lmaWVkIGEgZmlsZSBuYW1lIG9yIGlmIHRoaXMgYnVmZmVyIGtub3dzIHdoaWNoIG9uZSB0byB1c2UsCi0gIDs7IGp1c3QgdXNlIHRoYXQuCi0gIChvciBmaWxlLW5hbWUKLSAgICAgIChzZXRxIGZpbGUtbmFtZSAoYW5kIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lCi0JCQkgICAoZmlsZS1uYW1lLWRpcmVjdG9yeSBjaGFuZ2UtbG9nLWRlZmF1bHQtbmFtZSkKLQkJCSAgIGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lKSkKLSAgICAgIChwcm9nbgotCTs7IENoYXNlIGxpbmtzIGluIHRoZSBzb3VyY2UgZmlsZQotCTs7IGFuZCB1c2UgdGhlIGNoYW5nZSBsb2cgaW4gdGhlIGRpciB3aGVyZSBpdCBwb2ludHMuCi0JKHNldHEgZmlsZS1uYW1lIChvciAoYW5kIGJ1ZmZlci1maWxlLW5hbWUKLQkJCQkgKGZpbGUtbmFtZS1kaXJlY3RvcnkKLQkJCQkgIChmaWxlLWNoYXNlLWxpbmtzIGJ1ZmZlci1maWxlLW5hbWUpKSkKLQkJCSAgICBkZWZhdWx0LWRpcmVjdG9yeSkpCi0JKGlmIChmaWxlLWRpcmVjdG9yeS1wIGZpbGUtbmFtZSkKLQkgICAgKHNldHEgZmlsZS1uYW1lIChleHBhbmQtZmlsZS1uYW1lIChjaGFuZ2UtbG9nLW5hbWUpIGZpbGUtbmFtZSkpKQotCTs7IENoYXNlIGxpbmtzIGJlZm9yZSB2aXNpdGluZyB0aGUgZmlsZS4KLQk7OyBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2UgYSBzaW5nbGUgY2hhbmdlIGxvZyBmaWxlCi0JOzsgZm9yIHNldmVyYWwgcmVsYXRlZCBkaXJlY3Rvcmllcy4KLQkoc2V0cSBmaWxlLW5hbWUgKGZpbGUtY2hhc2UtbGlua3MgZmlsZS1uYW1lKSkKLQkoc2V0cSBmaWxlLW5hbWUgKGV4cGFuZC1maWxlLW5hbWUgZmlsZS1uYW1lKSkKLQk7OyBNb3ZlIHVwIGluIHRoZSBkaXIgaGllcmFyY2h5IHRpbGwgd2UgZmluZCBhIGNoYW5nZSBsb2cgZmlsZS4KLQkobGV0ICgoZmlsZTEgZmlsZS1uYW1lKQotCSAgICAgIHBhcmVudC1kaXIpCi0JICAod2hpbGUgKGFuZCAobm90IChvciAoZ2V0LWZpbGUtYnVmZmVyIGZpbGUxKSAoZmlsZS1leGlzdHMtcCBmaWxlMSkpKQotCQkgICAgICAocHJvZ24gKHNldHEgcGFyZW50LWRpcgotCQkJCSAgIChmaWxlLW5hbWUtZGlyZWN0b3J5Ci0JCQkJICAgIChkaXJlY3RvcnktZmlsZS1uYW1lCi0JCQkJICAgICAoZmlsZS1uYW1lLWRpcmVjdG9yeSBmaWxlMSkpKSkKLQkJCSAgICAgOzsgR2l2ZSB1cCBpZiB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUgcm9vdCBkaXIuCi0JCQkgICAgIChub3QgKHN0cmluZz0gKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmlsZTEpCi0JCQkJCSAgIHBhcmVudC1kaXIpKSkpCi0JICAgIDs7IE1vdmUgdXAgdG8gdGhlIHBhcmVudCBkaXIgYW5kIHRyeSBhZ2Fpbi4KLQkgICAgKHNldHEgZmlsZTEgKGV4cGFuZC1maWxlLW5hbWUgCi0JCQkgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgKGNoYW5nZS1sb2ctbmFtZSkpCi0JCQkgcGFyZW50LWRpcikpKQotCSAgOzsgSWYgd2UgZm91bmQgYSBjaGFuZ2UgbG9nIGluIGEgcGFyZW50LCB1c2UgdGhhdC4KLQkgIChpZiAob3IgKGdldC1maWxlLWJ1ZmZlciBmaWxlMSkgKGZpbGUtZXhpc3RzLXAgZmlsZTEpKQotCSAgICAgIChzZXRxIGZpbGUtbmFtZSBmaWxlMSkpKSkpCi0gIDs7IE1ha2UgYSBsb2NhbCB2YXJpYWJsZSBpbiB0aGlzIGJ1ZmZlciBzbyB3ZSBuZWVkbid0IHNlYXJjaCBhZ2Fpbi4KLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnY2hhbmdlLWxvZy1kZWZhdWx0LW5hbWUpIGZpbGUtbmFtZSkKLSAgZmlsZS1uYW1lKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGFkZC1jaGFuZ2UtbG9nLWVudHJ5ICgmb3B0aW9uYWwgd2hvYW1pIGZpbGUtbmFtZSBvdGhlci13aW5kb3cgbmV3LWVudHJ5KQotICAiRmluZCBjaGFuZ2UgbG9nIGZpbGUgYW5kIGFkZCBhbiBlbnRyeSBmb3IgdG9kYXkuCi1PcHRpb25hbCBhcmcgKGludGVyYWN0aXZlIHByZWZpeCkgbm9uLW5pbCBtZWFucyBwcm9tcHQgZm9yIHVzZXIgbmFtZSBhbmQgc2l0ZS4KLVNlY29uZCBhcmcgaXMgZmlsZSBuYW1lIG9mIGNoYW5nZSBsb2cuICBJZiBuaWwsIHVzZXMgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4KLVRoaXJkIGFyZyBPVEhFUi1XSU5ET1cgbm9uLW5pbCBtZWFucyB2aXNpdCBpbiBvdGhlciB3aW5kb3cuCi1Gb3VydGggYXJnIE5FVy1FTlRSWSBub24tbmlsIG1lYW5zIGFsd2F5cyBjcmVhdGUgYSBuZXcgZW50cnkgYXQgdGhlIGZyb250OwotbmV2ZXIgYXBwZW5kIHRvIGFuIGV4aXN0aW5nIGVudHJ5LiIKLSAgKGludGVyYWN0aXZlIChsaXN0IGN1cnJlbnQtcHJlZml4LWFyZwotCQkgICAgIChwcm9tcHQtZm9yLWNoYW5nZS1sb2ctbmFtZSkpKQotICAob3IgYWRkLWxvZy1mdWxsLW5hbWUKLSAgICAgIChzZXRxIGFkZC1sb2ctZnVsbC1uYW1lICh1c2VyLWZ1bGwtbmFtZSkpKQotICAob3IgYWRkLWxvZy1tYWlsaW5nLWFkZHJlc3MKLSAgICAgIChzZXRxIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzIHVzZXItbWFpbC1hZGRyZXNzKSkKLSAgKGlmIHdob2FtaQotICAgICAgKHByb2duCi0JKHNldHEgYWRkLWxvZy1mdWxsLW5hbWUgKHJlYWQtaW5wdXQgIkZ1bGwgbmFtZTogIiBhZGQtbG9nLWZ1bGwtbmFtZSkpCi0JIDs7IE5vdGUgdGhhdCBzb21lIHNpdGVzIGhhdmUgcm9vbSBhbmQgcGhvbmUgbnVtYmVyIGZpZWxkcyBpbgotCSA7OyBmdWxsIG5hbWUgd2hpY2ggbG9vayBzaWxseSB3aGVuIGluc2VydGVkLiAgUmF0aGVyIHRoYW4gZG8KLQkgOzsgYW55dGhpbmcgYWJvdXQgdGhhdCBoZXJlLCBsZXQgdXNlciBnaXZlIHByZWZpeCBhcmd1bWVudCBzbyB0aGF0Ci0JIDs7IHMvaGUgY2FuIGVkaXQgdGhlIGZ1bGwgbmFtZSBmaWVsZCBpbiBwcm9tcHRlciBpZiBzL2hlIHdhbnRzLgotCShzZXRxIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzCi0JICAgICAgKHJlYWQtaW5wdXQgIk1haWxpbmcgYWRkcmVzczogIiBhZGQtbG9nLW1haWxpbmctYWRkcmVzcykpKSkKLSAgKGxldCAoKGRlZnVuIChmdW5jYWxsIChvciBhZGQtbG9nLWN1cnJlbnQtZGVmdW4tZnVuY3Rpb24KLQkJCSAgICAnYWRkLWxvZy1jdXJyZW50LWRlZnVuKSkpCi0JcGFyYWdyYXBoLWVuZCBlbnRyeSkKLQotICAgIChzZXRxIGZpbGUtbmFtZSAoZXhwYW5kLWZpbGUtbmFtZSAoZmluZC1jaGFuZ2UtbG9nIGZpbGUtbmFtZSkpKQotCi0gICAgOzsgU2V0IEVOVFJZIHRvIHRoZSBmaWxlIG5hbWUgdG8gdXNlIGluIHRoZSBuZXcgZW50cnkuCi0gICAgKGFuZCBidWZmZXItZmlsZS1uYW1lCi0JIDs7IE5ldmVyIHdhbnQgdG8gYWRkIGEgY2hhbmdlIGxvZyBlbnRyeSBmb3IgdGhlIENoYW5nZUxvZyBmaWxlIGl0c2VsZi4KLQkgKG5vdCAoc3RyaW5nPSBidWZmZXItZmlsZS1uYW1lIGZpbGUtbmFtZSkpCi0JIChzZXRxIGVudHJ5IChpZiAoc3RyaW5nLW1hdGNoCi0JCQkgIChjb25jYXQgIl4iIChyZWdleHAtcXVvdGUgKGZpbGUtbmFtZS1kaXJlY3RvcnkKLQkJCQkJCSAgICAgZmlsZS1uYW1lKSkpCi0JCQkgIGJ1ZmZlci1maWxlLW5hbWUpCi0JCQkgKHN1YnN0cmluZyBidWZmZXItZmlsZS1uYW1lIChtYXRjaC1lbmQgMCkpCi0JCSAgICAgICAoZmlsZS1uYW1lLW5vbmRpcmVjdG9yeSBidWZmZXItZmlsZS1uYW1lKSkpKQotCi0gICAgKGlmIChhbmQgb3RoZXItd2luZG93IChub3QgKGVxdWFsIGZpbGUtbmFtZSBidWZmZXItZmlsZS1uYW1lKSkpCi0JKGZpbmQtZmlsZS1vdGhlci13aW5kb3cgZmlsZS1uYW1lKQotICAgICAgKGZpbmQtZmlsZSBmaWxlLW5hbWUpKQotICAgIChvciAoZXEgbWFqb3ItbW9kZSAnY2hhbmdlLWxvZy1tb2RlKQotCShjaGFuZ2UtbG9nLW1vZGUpKQotICAgICh1bmRvLWJvdW5kYXJ5KQotICAgIChnb3RvLWNoYXIgKHBvaW50LW1pbikpCi0gICAgKGxldCAoKGhlYWRpbmcgKGZvcm1hdCAiJXMgICVzICA8JXM+IgotCQkJICAgKGZvcm1hdC10aW1lLXN0cmluZyAiJVktJW0tJWQiKQotCQkJICAgYWRkLWxvZy1mdWxsLW5hbWUKLQkJCSAgIGFkZC1sb2ctbWFpbGluZy1hZGRyZXNzKSkpCi0gICAgICAoaWYgKGxvb2tpbmctYXQgKHJlZ2V4cC1xdW90ZSBoZWFkaW5nKSkKLQkgIChmb3J3YXJkLWxpbmUgMSkKLQkoaW5zZXJ0IGhlYWRpbmcgIlxuXG4iKSkpCi0KLSAgICA7OyBTZWFyY2ggb25seSB3aXRoaW4gdGhlIGZpcnN0IHBhcmFncmFwaC4KLSAgICAoaWYgKGxvb2tpbmctYXQgIlxuKlteXG4qIFx0XSIpCi0JKHNraXAtY2hhcnMtZm9yd2FyZCAiXG4iKQotICAgICAgKGZvcndhcmQtcGFyYWdyYXBoIDEpKQotICAgIChzZXRxIHBhcmFncmFwaC1lbmQgKHBvaW50KSkKLSAgICAoZ290by1jaGFyIChwb2ludC1taW4pKQotCi0gICAgOzsgTm93IGluc2VydCB0aGUgbmV3IGxpbmUgZm9yIHRoaXMgZW50cnkuCi0gICAgKGNvbmQgKChyZS1zZWFyY2gtZm9yd2FyZCAiXlxccyAqXFwqXFxzICokIiBwYXJhZ3JhcGgtZW5kIHQpCi0JICAgOzsgUHV0IHRoaXMgZmlsZSBuYW1lIGludG8gdGhlIGV4aXN0aW5nIGVtcHR5IGVudHJ5LgotCSAgIChpZiBlbnRyeQotCSAgICAgICAoaW5zZXJ0IGVudHJ5KSkpCi0JICAoKGFuZCAobm90IG5ldy1lbnRyeSkKLQkJKGxldCAoY2FzZS1mb2xkLXNlYXJjaCkKLQkJICAocmUtc2VhcmNoLWZvcndhcmQKLQkJICAgKGNvbmNhdCAocmVnZXhwLXF1b3RlIChjb25jYXQgIiogIiBlbnRyeSkpCi0JCQkgICA7OyBEb24ndCBhY2NlcHQgYGZvby5iYXInIHdoZW4KLQkJCSAgIDs7IGxvb2tpbmcgZm9yIGBmb28nOgotCQkJICAgIlxcKFxccyBcXHxbKCksOl1cXCkiKQotCQkgICBwYXJhZ3JhcGgtZW5kIHQpKSkKLQkgICA7OyBBZGQgdG8gdGhlIGV4aXN0aW5nIGVudHJ5IGZvciB0aGUgc2FtZSBmaWxlLgotCSAgIChyZS1zZWFyY2gtZm9yd2FyZCAiXlxccyAqJFxcfF5cXHMgXFwqIikKLQkgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgMCkpCi0JICAgOzsgRGVsZXRlIGV4Y2VzcyBlbXB0eSBsaW5lczsgbWFrZSBqdXN0IDIuCi0JICAgKHdoaWxlIChhbmQgKG5vdCAoZW9icCkpIChsb29raW5nLWF0ICJeXFxzICokIikpCi0JICAgICAoZGVsZXRlLXJlZ2lvbiAocG9pbnQpIChzYXZlLWV4Y3Vyc2lvbiAoZm9yd2FyZC1saW5lIDEpIChwb2ludCkpKSkKLQkgICAoaW5zZXJ0ICJcblxuIikKLQkgICAoZm9yd2FyZC1saW5lIC0yKQotCSAgIChpbmRlbnQtcmVsYXRpdmUtbWF5YmUpKQotCSAgKHQKLQkgICA7OyBNYWtlIGEgbmV3IGVudHJ5LgotCSAgIChmb3J3YXJkLWxpbmUgMSkKLQkgICAod2hpbGUgKGxvb2tpbmctYXQgIlxcc1ciKQotCSAgICAgKGZvcndhcmQtbGluZSAxKSkKLQkgICAod2hpbGUgKGFuZCAobm90IChlb2JwKSkgKGxvb2tpbmctYXQgIl5cXHMgKiQiKSkKLQkgICAgIChkZWxldGUtcmVnaW9uIChwb2ludCkgKHNhdmUtZXhjdXJzaW9uIChmb3J3YXJkLWxpbmUgMSkgKHBvaW50KSkpKQotCSAgIChpbnNlcnQgIlxuXG5cbiIpCi0JICAgKGZvcndhcmQtbGluZSAtMikKLQkgICAoaW5kZW50LXRvIGxlZnQtbWFyZ2luKQotCSAgIChpbnNlcnQgIiogIiAob3IgZW50cnkgIiIpKSkpCi0gICAgOzsgTm93IGluc2VydCB0aGUgZnVuY3Rpb24gbmFtZSwgaWYgd2UgaGF2ZSBvbmUuCi0gICAgOzsgUG9pbnQgaXMgYXQgdGhlIGVudHJ5IGZvciB0aGlzIGZpbGUsCi0gICAgOzsgZWl0aGVyIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgb3IgYXQgdGhlIGZpcnN0IGJsYW5rIGxpbmUuCi0gICAgKGlmIGRlZnVuCi0JKHByb2duCi0JICA7OyBNYWtlIGl0IGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLQkgICh1bmRvLWJvdW5kYXJ5KQotCSAgKGluc2VydCAoaWYgKHNhdmUtZXhjdXJzaW9uCi0JCQkoYmVnaW5uaW5nLW9mLWxpbmUgMSkKLQkJCShsb29raW5nLWF0ICJcXHMgKiQiKSkgCi0JCSAgICAgICIiCi0JCSAgICAiICIpCi0JCSAgIigiIGRlZnVuICIpOiAiKSkKLSAgICAgIDs7IE5vIGZ1bmN0aW9uIG5hbWUsIHNvIHB1dCBpbiBhIGNvbG9uIHVubGVzcyB3ZSBoYXZlIGp1c3QgYSBzdGFyLgotICAgICAgKGlmIChub3QgKHNhdmUtZXhjdXJzaW9uCi0JCSAoYmVnaW5uaW5nLW9mLWxpbmUgMSkKLQkJIChsb29raW5nLWF0ICJcXHMgKlxcKFxcKlxccyAqXFwpPyQiKSkpCi0JICAoaW5zZXJ0ICI6ICIpKSkpKQotCi07OzsjIyNhdXRvbG9hZAotKGRlZnVuIGFkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvdyAoJm9wdGlvbmFsIHdob2FtaSBmaWxlLW5hbWUpCi0gICJGaW5kIGNoYW5nZSBsb2cgZmlsZSBpbiBvdGhlciB3aW5kb3cgYW5kIGFkZCBhbiBlbnRyeSBmb3IgdG9kYXkuCi1PcHRpb25hbCBhcmcgKGludGVyYWN0aXZlIHByZWZpeCkgbm9uLW5pbCBtZWFucyBwcm9tcHQgZm9yIHVzZXIgbmFtZSBhbmQgc2l0ZS4KLVNlY29uZCBhcmcgaXMgZmlsZSBuYW1lIG9mIGNoYW5nZSBsb2cuICBcCi1JZiBuaWwsIHVzZXMgYGNoYW5nZS1sb2ctZGVmYXVsdC1uYW1lJy4iCi0gIChpbnRlcmFjdGl2ZSAoaWYgY3VycmVudC1wcmVmaXgtYXJnCi0JCSAgIChsaXN0IGN1cnJlbnQtcHJlZml4LWFyZwotCQkJIChwcm9tcHQtZm9yLWNoYW5nZS1sb2ctbmFtZSkpKSkKLSAgKGFkZC1jaGFuZ2UtbG9nLWVudHJ5IHdob2FtaSBmaWxlLW5hbWUgdCkpCi07OzsjIyNhdXRvbG9hZCAoZGVmaW5lLWtleSBjdGwteC00LW1hcCAiYSIgJ2FkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvdykKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBjaGFuZ2UtbG9nLW1vZGUgKCkKLSAgIk1ham9yIG1vZGUgZm9yIGVkaXRpbmcgY2hhbmdlIGxvZ3M7IGxpa2UgSW5kZW50ZWQgVGV4dCBNb2RlLgotUHJldmVudHMgbnVtZXJpYyBiYWNrdXBzIGFuZCBzZXRzIGBsZWZ0LW1hcmdpbicgdG8gOCBhbmQgYGZpbGwtY29sdW1uJyB0byA3NC4KLU5ldyBsb2cgZW50cmllcyBhcmUgdXN1YWxseSBtYWRlIHdpdGggXFxbYWRkLWNoYW5nZS1sb2ctZW50cnldIG9yIFxcW2FkZC1jaGFuZ2UtbG9nLWVudHJ5LW90aGVyLXdpbmRvd10uCi1FYWNoIGVudHJ5IGJlaGF2ZXMgYXMgYSBwYXJhZ3JhcGgsIGFuZCB0aGUgZW50cmllcyBmb3Igb25lIGRheSBhcyBhIHBhZ2UuCi1SdW5zIGBjaGFuZ2UtbG9nLW1vZGUtaG9vaycuIgotICAoaW50ZXJhY3RpdmUpCi0gIChraWxsLWFsbC1sb2NhbC12YXJpYWJsZXMpCi0gIChpbmRlbnRlZC10ZXh0LW1vZGUpCi0gIChzZXRxIG1ham9yLW1vZGUgJ2NoYW5nZS1sb2ctbW9kZQotCW1vZGUtbmFtZSAiQ2hhbmdlIExvZyIKLQlsZWZ0LW1hcmdpbiA4Ci0JZmlsbC1jb2x1bW4gNzQKLSAgICBpbmRlbnQtdGFicy1tb2RlIHQKLSAgICB0YWItd2lkdGggOCkKLSAgKHVzZS1sb2NhbC1tYXAgY2hhbmdlLWxvZy1tb2RlLW1hcCkKLSAgOzsgTGV0IGVhY2ggZW50cnkgYmVoYXZlIGFzIG9uZSBwYXJhZ3JhcGg6Ci0gIDs7IFdlIHJlYWxseSBkbyB3YW50ICJeIiBpbiBwYXJhZ3JhcGgtc3RhcnQgYmVsb3c6IGl0IGlzIG9ubHkgdGhlIGxpbmVzIHRoYXQKLSAgOzsgYmVnaW4gYXQgY29sdW1uIDAgKGRlc3BpdGUgdGhlIGxlZnQtbWFyZ2luIG9mIDgpIHRoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLgotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdwYXJhZ3JhcGgtc3RhcnQpICJcXHMgKiRcXHxcZlxcfF5cXHN3IikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAncGFyYWdyYXBoLXNlcGFyYXRlKSAiXFxzICokXFx8XGZcXHxeXFxzdyIpCi0gIDs7IExldCBhbGwgZW50cmllcyBmb3Igb25lIGRheSBiZWhhdmUgYXMgb25lIHBhZ2UuCi0gIDs7IE1hdGNoIG51bGwgc3RyaW5nIG9uIHRoZSBkYXRlLWxpbmUgc28gdGhhdCB0aGUgZGF0ZS1saW5lCi0gIDs7IGlzIGdyb3VwZWQgd2l0aCB3aGF0IGZvbGxvd3MuCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3BhZ2UtZGVsaW1pdGVyKSAiXlxcPFxcfF5cZiIpCi0gIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3ZlcnNpb24tY29udHJvbCkgJ25ldmVyKQotICAoc2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdhZGFwdGl2ZS1maWxsLXJlZ2V4cCkgIlxccyAqIikKLSAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnZm9udC1sb2NrLWRlZmF1bHRzKQotICAgICAgICcoY2hhbmdlLWxvZy1mb250LWxvY2sta2V5d29yZHMgdCkpCi0gIChydW4taG9va3MgJ2NoYW5nZS1sb2ctbW9kZS1ob29rKSkKLQotOzsgSXQgbWlnaHQgYmUgbmljZSB0byBoYXZlIGEgZ2VuZXJhbCBmZWF0dXJlIHRvIHJlcGxhY2UgdGhpcy4gIFRoZSBpZGVhIEkKLTs7IGhhdmUgaXMgYSB2YXJpYWJsZSBnaXZpbmcgYSByZWdleHAgbWF0Y2hpbmcgdGV4dCB3aGljaCBzaG91bGQgbm90IGJlCi07OyBtb3ZlZCBmcm9tIGJvbCBieSBmaWxsaW5nLiAgY2hhbmdlLWxvZy1tb2RlIHdvdWxkIHNldCB0aGlzIHRvICJeXFxzICpcXHMoIi4KLTs7IEJ1dCBJIGRvbid0IGZlZWwgdXAgdG8gaW1wbGVtZW50aW5nIHRoYXQgdG9kYXkuCi0oZGVmdW4gY2hhbmdlLWxvZy1maWxsLXBhcmFncmFwaCAoJm9wdGlvbmFsIGp1c3RpZnkpCi0gICJGaWxsIHRoZSBwYXJhZ3JhcGgsIGJ1dCBwcmVzZXJ2ZSBvcGVuIHBhcmVudGhlc2VzIGF0IGJlZ2lubmluZyBvZiBsaW5lcy4KLVByZWZpeCBhcmcgbWVhbnMganVzdGlmeSBhcyB3ZWxsLiIKLSAgKGludGVyYWN0aXZlICJQIikKLSAgKGxldCAoKGVuZCAoc2F2ZS1leGN1cnNpb24gKGZvcndhcmQtcGFyYWdyYXBoKSAocG9pbnQpKSkKLQkoYmVnIChzYXZlLWV4Y3Vyc2lvbiAoYmFja3dhcmQtcGFyYWdyYXBoKShwb2ludCkpKQotCShwYXJhZ3JhcGgtc3RhcnQgKGNvbmNhdCBwYXJhZ3JhcGgtc3RhcnQgIlxcfFxccyAqXFxzKCIpKSkKLSAgICAoZmlsbC1yZWdpb24gYmVnIGVuZCBqdXN0aWZ5KSkpCi0MCi0oZGVmdmFyIGFkZC1sb2ctY3VycmVudC1kZWZ1bi1oZWFkZXItcmVnZXhwCi0gICJeXFwoW0EtWl1bQS1aXyBdKltBLVpfXVxcfFstX2EtekEtWl0rXFwpWyBcdF0qWzo9XSIKLSAgIipIZXVyaXN0aWMgcmVnZXhwIHVzZWQgYnkgYGFkZC1sb2ctY3VycmVudC1kZWZ1bicgZm9yIHVua25vd24gbWFqb3IgbW9kZXMuIikKLQotOzs7IyMjYXV0b2xvYWQKLShkZWZ1biBhZGQtbG9nLWN1cnJlbnQtZGVmdW4gKCkKLSAgIlJldHVybiBuYW1lIG9mIGZ1bmN0aW9uIGRlZmluaXRpb24gcG9pbnQgaXMgaW4sIG9yIG5pbC4KLQotVW5kZXJzdGFuZHMgQywgTGlzcCwgTGFUZVggKFwiZnVuY3Rpb25zXCIgYXJlIGNoYXB0ZXJzLCBzZWN0aW9ucywgLi4uKSwKLVRleGluZm8gKEBub2RlIHRpdGxlcyksIFBlcmwsIGFuZCBGb3J0cmFuLgotCi1PdGhlciBtb2RlcyBhcmUgaGFuZGxlZCBieSBhIGhldXJpc3RpYyB0aGF0IGxvb2tzIGluIHRoZSAxMEsgYmVmb3JlCi1wb2ludCBmb3IgdXBwZXJjYXNlIGhlYWRpbmdzIHN0YXJ0aW5nIGluIHRoZSBmaXJzdCBjb2x1bW4gb3IKLWlkZW50aWZpZXJzIGZvbGxvd2VkIGJ5IGA6JyBvciBgPScsIHNlZSB2YXJpYWJsZQotYGFkZC1sb2ctY3VycmVudC1kZWZ1bi1oZWFkZXItcmVnZXhwJy4KLQotSGFzIGEgcHJlZmVyZW5jZSBvZiBsb29raW5nIGJhY2t3YXJkcy4iCi0gIChjb25kaXRpb24tY2FzZSBuaWwKLSAgICAgIChzYXZlLWV4Y3Vyc2lvbgotCShsZXQgKChsb2NhdGlvbiAocG9pbnQpKSkKLQkgIChjb25kICgobWVtcSBtYWpvci1tb2RlICcoZW1hY3MtbGlzcC1tb2RlIGxpc3AtbW9kZSBzY2hlbWUtbW9kZQotCQkJCQkJICAgIGxpc3AtaW50ZXJhY3Rpb24tbW9kZSkpCi0JCSA7OyBJZiB3ZSBhcmUgbm93IHByZWNpc2VseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgZGVmdW4sCi0JCSA7OyBtYWtlIHN1cmUgYmVnaW5uaW5nLW9mLWRlZnVuIGZpbmRzIHRoYXQgb25lCi0JCSA7OyByYXRoZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lLgotCQkgKG9yIChlb2JwKSAoZm9yd2FyZC1jaGFyIDEpKQotCQkgKGJlZ2lubmluZy1vZi1kZWZ1bikKLQkJIDs7IE1ha2Ugc3VyZSB3ZSBhcmUgcmVhbGx5IGluc2lkZSB0aGUgZGVmdW4gZm91bmQsIG5vdCBhZnRlciBpdC4KLQkJIChpZiAoYW5kIChsb29raW5nLWF0ICJcXHMoIikKLQkJCSAgKHByb2duIChlbmQtb2YtZGVmdW4pCi0JCQkJICg8IGxvY2F0aW9uIChwb2ludCkpKQotCQkJICAocHJvZ24gKGZvcndhcmQtc2V4cCAtMSkKLQkJCQkgKD49IGxvY2F0aW9uIChwb2ludCkpKSkKLQkJICAgICAocHJvZ24KLQkJICAgICAgIChpZiAobG9va2luZy1hdCAiXFxzKCIpCi0JCQkgICAoZm9yd2FyZC1jaGFyIDEpKQotCQkgICAgICAgKGZvcndhcmQtc2V4cCAxKQotCQkgICAgICAgKHNraXAtY2hhcnMtZm9yd2FyZCAiICciKQotCQkgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotCQkJCQkgKHByb2duIChmb3J3YXJkLXNleHAgMSkgKHBvaW50KSkpKSkpCi0JCSgoYW5kIChtZW1xIG1ham9yLW1vZGUgJyhjLW1vZGUgYysrLW1vZGUgYysrLWMtbW9kZSBvYmpjLW1vZGUpKQotCQkgICAgICAoc2F2ZS1leGN1cnNpb24gKGJlZ2lubmluZy1vZi1saW5lKQotCQkJCSAgICAgIDs7IFVzZSBlcSBpbnN0ZWFkIG9mID0gaGVyZSB0byBhdm9pZAotCQkJCSAgICAgIDs7IGVycm9yIHdoZW4gYXQgYm9iIGFuZCBjaGFyLWFmdGVyCi0JCQkJICAgICAgOzsgcmV0dXJucyBuaWwuCi0JCQkJICAgICAgKHdoaWxlIChlcSAoY2hhci1hZnRlciAoLSAocG9pbnQpIDIpKSA/XFwpCi0JCQkJCShmb3J3YXJkLWxpbmUgLTEpKQotCQkJCSAgICAgIChsb29raW5nLWF0ICJbIFx0XSojWyBcdF0qZGVmaW5lWyBcdF0iKSkpCi0JCSA7OyBIYW5kbGUgYSBDIG1hY3JvIGRlZmluaXRpb24uCi0JCSAoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCSAod2hpbGUgKGVxIChjaGFyLWFmdGVyICgtIChwb2ludCkgMikpID9cXCkgO25vdCA9OyBub3RlIGFib3ZlCi0JCSAgIChmb3J3YXJkLWxpbmUgLTEpKQotCQkgKHNlYXJjaC1mb3J3YXJkICJkZWZpbmUiKQotCQkgKHNraXAtY2hhcnMtZm9yd2FyZCAiIFx0IikKLQkJIChidWZmZXItc3Vic3RyaW5nIChwb2ludCkKLQkJCQkgICAocHJvZ24gKGZvcndhcmQtc2V4cCAxKSAocG9pbnQpKSkpCi0JCSgobWVtcSBtYWpvci1tb2RlICcoYy1tb2RlIGMrKy1tb2RlIGMrKy1jLW1vZGUgb2JqYy1tb2RlKSkKLQkJIChiZWdpbm5pbmctb2YtbGluZSkKLQkJIDs7IFNlZSBpZiB3ZSBhcmUgaW4gdGhlIGJlZ2lubmluZyBwYXJ0IG9mIGEgZnVuY3Rpb24sCi0JCSA7OyBiZWZvcmUgdGhlIG9wZW4gYnJhY2UuICBJZiBzbywgYWR2YW5jZSBmb3J3YXJkLgotCQkgKHdoaWxlIChub3QgKGxvb2tpbmctYXQgIntcXHxcXChcXHMgKiRcXCkiKSkKLQkJICAgKGZvcndhcmQtbGluZSAxKSkKLQkJIChvciAoZW9icCkKLQkJICAgICAoZm9yd2FyZC1jaGFyIDEpKQotCQkgKGJlZ2lubmluZy1vZi1kZWZ1bikKLQkJIChpZiAocHJvZ24gKGVuZC1vZi1kZWZ1bikKLQkJCSAgICAoPCBsb2NhdGlvbiAocG9pbnQpKSkKLQkJICAgICAocHJvZ24KLQkJICAgICAgIChiYWNrd2FyZC1zZXhwIDEpCi0JCSAgICAgICAobGV0IChiZWcgdGVtKQotCi0JCQkgKGZvcndhcmQtbGluZSAtMSkKLQkJCSA7OyBTa2lwIGJhY2sgb3ZlciB0eXBlZGVmcyBvZiBhcmdsaXN0LgotCQkJICh3aGlsZSAoYW5kIChub3QgKGJvYnApKQotCQkJCSAgICAgKGxvb2tpbmctYXQgIlsgXHRcbl0iKSkKLQkJCSAgIChmb3J3YXJkLWxpbmUgLTEpKQotCQkJIDs7IFNlZSBpZiB0aGlzIGlzIHVzaW5nIHRoZSBERUZVTiBtYWNybyB1c2VkIGluIEVtYWNzLAotCQkJIDs7IG9yIHRoZSBERUZVTiBtYWNybyB1c2VkIGJ5IHRoZSBDIGxpYnJhcnkuCi0JCQkgKGlmIChjb25kaXRpb24tY2FzZSBuaWwKLQkJCQkgKGFuZCAoc2F2ZS1leGN1cnNpb24KLQkJCQkJKGVuZC1vZi1saW5lKQotCQkJCQkod2hpbGUgKD0gKHByZWNlZGluZy1jaGFyKSA/XFwpCi0JCQkJCSAgKGVuZC1vZi1saW5lIDIpKQotCQkJCQkoYmFja3dhcmQtc2V4cCAxKQotCQkJCQkoYmVnaW5uaW5nLW9mLWxpbmUpCi0JCQkJCShzZXRxIHRlbSAocG9pbnQpKQotCQkJCQkobG9va2luZy1hdCAiREVGVU5cXGIiKSkKLQkJCQkgICAgICAoPj0gbG9jYXRpb24gdGVtKSkKLQkJCSAgICAgICAoZXJyb3IgbmlsKSkKLQkJCSAgICAgKHByb2duCi0JCQkgICAgICAgKGdvdG8tY2hhciB0ZW0pCi0JCQkgICAgICAgKGRvd24tbGlzdCAxKQotCQkJICAgICAgIChpZiAoPSAoY2hhci1hZnRlciAocG9pbnQpKSA/XCIpCi0JCQkJICAgKHByb2duCi0JCQkJICAgICAoZm9yd2FyZC1zZXhwIDEpCi0JCQkJICAgICAoc2tpcC1jaGFycy1mb3J3YXJkICIgLCIpKSkKLQkJCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQpCi0JCQkJCQkgKHByb2duIChmb3J3YXJkLXNleHAgMSkgKHBvaW50KSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChsb29raW5nLWF0ICJeWystXSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldC1tZXRob2QtZGVmaW5pdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgT3JkaW5hcnkgQyBmdW5jdGlvbiBzeW50YXguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRxIGJlZyAocG9pbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGFuZCAoY29uZGl0aW9uLWNhc2UgbmlsCi0JCQkJCSAgOzsgUHJvdGVjdCBhZ2FpbnN0ICJVbmJhbGFuY2VkIHBhcmVucyIgZXJyb3IuCi0JCQkJCSAgKHByb2duCi0JCQkJCSAgICAoZG93bi1saXN0IDEpIDsgaW50byBhcmdsaXN0Ci0JCQkJCSAgICAoYmFja3dhcmQtdXAtbGlzdCAxKQotCQkJCQkgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpCi0JCQkJCSAgICB0KQotCQkJCQkoZXJyb3IgbmlsKSkKLQkJCQkgICAgICA7OyBWZXJpZnkgaW5pdGlhbCBwb3Mgd2FzIGFmdGVyCi0JCQkJICAgICAgOzsgcmVhbCBzdGFydCBvZiBmdW5jdGlvbi4KLQkJCQkgICAgICAoc2F2ZS1leGN1cnNpb24KLQkJCQkJKGdvdG8tY2hhciBiZWcpCi0JCQkJCTs7IEZvciB0aGlzIHB1cnBvc2UsIGluY2x1ZGUgdGhlIGxpbmUKLQkJCQkJOzsgdGhhdCBoYXMgdGhlIGRlY2wga2V5d29yZHMuICBUaGlzCi0JCQkJCTs7IG1heSBhbHNvIGluY2x1ZGUgc29tZSBvZiB0aGUKLQkJCQkJOzsgY29tbWVudHMgYmVmb3JlIHRoZSBmdW5jdGlvbi4KLQkJCQkJKHdoaWxlIChhbmQgKG5vdCAoYm9icCkpCi0JCQkJCQkgICAgKHNhdmUtZXhjdXJzaW9uCi0JCQkJCQkgICAgICAoZm9yd2FyZC1saW5lIC0xKQotCQkJCQkJICAgICAgKGxvb2tpbmctYXQgIlteXG5cZl0iKSkpCi0JCQkJCSAgKGZvcndhcmQtbGluZSAtMSkpCi0JCQkJCSg+PSBsb2NhdGlvbiAocG9pbnQpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IENvbnNpc3RlbmN5IGNoZWNrOiBnb2luZyBkb3duIGFuZCB1cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgc2hvdWxkbid0IHRha2UgdXMgYmFjayBiZWZvcmUgQkVHLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD4gKHBvaW50KSBiZWcpKQotCQkJCSAobGV0IChlbmQgbWlkZGxlKQotCQkJCSAgIDs7IERvbid0IGluY2x1ZGUgYW55IGZpbmFsIG5ld2xpbmUKLQkJCQkgICA7OyBpbiB0aGUgbmFtZSB3ZSB1c2UuCi0JCQkJICAgKGlmICg9IChwcmVjZWRpbmctY2hhcikgP1xuKQotCQkJCSAgICAgICAoZm9yd2FyZC1jaGFyIC0xKSkKLQkJCQkgICAoc2V0cSBlbmQgKHBvaW50KSkKLQkJCQkgICAoYmFja3dhcmQtc2V4cCAxKQotCQkJCSAgIDs7IE5vdyBmaW5kIHRoZSByaWdodCBiZWdpbm5pbmcgb2YgdGhlIG5hbWUuCi0JCQkJICAgOzsgSW5jbHVkZSBjZXJ0YWluIGtleXdvcmRzIGlmIHRoZXkKLQkJCQkgICA7OyBwcmVjZWRlIHRoZSBuYW1lLgotCQkJCSAgIChzZXRxIG1pZGRsZSAocG9pbnQpKQotCQkJCSAgIChmb3J3YXJkLXdvcmQgLTEpCi0JCQkJICAgOzsgSWdub3JlIHRoZXNlIHN1YnBhcnRzIG9mIGEgY2xhc3MgZGVjbAotCQkJCSAgIDs7IGFuZCBtb3ZlIGJhY2sgdG8gdGhlIGNsYXNzIG5hbWUgaXRzZWxmLgotCQkJCSAgICh3aGlsZSAobG9va2luZy1hdCAicHVibGljIFxcfHByaXZhdGUgIikKLQkJCQkgICAgIChza2lwLWNoYXJzLWJhY2t3YXJkICIgXHQ6IikKLQkJCQkgICAgIChzZXRxIGVuZCAocG9pbnQpKQotCQkJCSAgICAgKGJhY2t3YXJkLXNleHAgMSkKLQkJCQkgICAgIChzZXRxIG1pZGRsZSAocG9pbnQpKQotCQkJCSAgICAgKGZvcndhcmQtd29yZCAtMSkpCi0JCQkJICAgKGFuZCAoYm9scCkKLQkJCQkJKGxvb2tpbmctYXQgInN0cnVjdCBcXHx1bmlvbiBcXHxjbGFzcyAiKQotCQkJCQkoc2V0cSBtaWRkbGUgKHBvaW50KSkpCi0JCQkJICAgKGJ1ZmZlci1zdWJzdHJpbmcgbWlkZGxlIGVuZCkpKSkpKSkpKQotCQkoKG1lbXEgbWFqb3ItbW9kZQotCQkgICAgICAgJyhUZVgtbW9kZSBwbGFpbi1UZVgtbW9kZSBMYVRlWC1tb2RlOzsgdGV4LW1vZGUuZWwKLQkJCQkgIHBsYWluLXRleC1tb2RlIGxhdGV4LW1vZGU7OyBjbXV0ZXguZWwKLQkJCQkgICkpCi0JCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZAotCQkgICAgICAiXFxcXFxcKHN1YlxcKSpcXChzZWN0aW9uXFx8cGFyYWdyYXBoXFx8Y2hhcHRlclxcKSIgbmlsIHQpCi0JCSAgICAgKHByb2duCi0JCSAgICAgICAoZ290by1jaGFyIChtYXRjaC1iZWdpbm5pbmcgMCkpCi0JCSAgICAgICAoYnVmZmVyLXN1YnN0cmluZyAoMSsgKHBvaW50KSk7OyB3aXRob3V0IGluaXRpYWwgYmFja3NsYXNoCi0JCQkJCSAocHJvZ24KLQkJCQkJICAgKGVuZC1vZi1saW5lKQotCQkJCQkgICAocG9pbnQpKSkpKSkKLQkJKChlcSBtYWpvci1tb2RlICd0ZXhpbmZvLW1vZGUpCi0JCSAoaWYgKHJlLXNlYXJjaC1iYWNrd2FyZCAiXkBub2RlWyBcdF0rXFwoW14sXG5dK1xcKSIgbmlsIHQpCi0JCSAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKG1hdGNoLWJlZ2lubmluZyAxKQotCQkJCSAgICAgICAobWF0Y2gtZW5kIDEpKSkpCi0JCSgoZXEgbWFqb3ItbW9kZSAncGVybC1tb2RlKQotCQkgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgIl5zdWJbIFx0XStcXChbXiBcdFxuXStcXCkiIG5pbCB0KQotCQkgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkgICAgICAgKG1hdGNoLWVuZCAxKSkpKQotICAgICAgICAgICAgICAgICgoZXEgbWFqb3ItbW9kZSAnZm9ydHJhbi1tb2RlKQotICAgICAgICAgICAgICAgICA7OyBtdXN0IGJlIGluc2lkZSBmdW5jdGlvbiBib2R5IGZvciB0aGlzIHRvIHdvcmsKLSAgICAgICAgICAgICAgICAgKGJlZ2lubmluZy1vZi1mb3J0cmFuLXN1YnByb2dyYW0pCi0gICAgICAgICAgICAgICAgIChsZXQgKChjYXNlLWZvbGQtc2VhcmNoIHQpKSA7IGNhc2UtaW5zZW5zaXRpdmUKLSAgICAgICAgICAgICAgICAgICA7OyBzZWFyY2ggZm9yIGZvcnRyYW4gc3VicHJvZ3JhbSBzdGFydAotICAgICAgICAgICAgICAgICAgIChpZiAocmUtc2VhcmNoLWZvcndhcmQKLQkJCSAiXlsgXHRdKlxcKHByb2dyYW1cXHxzdWJyb3V0aW5lXFx8ZnVuY3Rpb25cCi1cXHxbIFx0YS16MC05Kl0qWyBcdF0rZnVuY3Rpb25cXCkiCi0JCQkgbmlsIHQpCi0gICAgICAgICAgICAgICAgICAgICAgIChwcm9nbgotICAgICAgICAgICAgICAgICAgICAgICAgIDs7IG1vdmUgdG8gRU9MIG9yIGJlZm9yZSBmaXJzdCBsZWZ0IHBhcmVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChyZS1zZWFyY2gtZm9yd2FyZCAiWyhcbl0iIG5pbCB0KQotCQkJICAgICAocHJvZ24gKGZvcndhcmQtY2hhciAtMSkKLQkJCQkgICAgKHNraXAtY2hhcnMtYmFja3dhcmQgIiBcdCIpKQotCQkJICAgKGVuZC1vZi1saW5lKSkKLQkJCSA7OyBVc2UgdGhlIG5hbWUgcHJlY2VkaW5nIHRoYXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmcgKHBvaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9nbiAoZm9yd2FyZC1zZXhwIC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9pbnQpKSkpKSkpCi0JCSh0Ci0JCSA7OyBJZiBhbGwgZWxzZSBmYWlscywgdHJ5IGhldXJpc3RpY3MKLQkJIChsZXQgKGNhc2UtZm9sZC1zZWFyY2gpCi0JCSAgIChlbmQtb2YtbGluZSkKLQkJICAgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgYWRkLWxvZy1jdXJyZW50LWRlZnVuLWhlYWRlci1yZWdleHAKLQkJCQkJICAgKC0gKHBvaW50KSAxMDAwMCkKLQkJCQkJICAgdCkKLQkJICAgICAgIChidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkKLQkJCQkJIChtYXRjaC1lbmQgMSkpKSkpKSkpCi0gICAgKGVycm9yIG5pbCkpKQotCi0oZGVmdmFyIGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCkKLQotOzsgU3Vicm91dGluZSB1c2VkIHdpdGhpbiBnZXQtbWV0aG9kLWRlZmluaXRpb24uCi07OyBBZGQgdGhlIGxhc3QgbWF0Y2ggaW4gdGhlIGJ1ZmZlciB0byB0aGUgZW5kIG9mIGBtZCcsCi07OyBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIEVORDsgbW92ZSB0byB0aGUgZW5kIG9mIHRoYXQgbWF0Y2guCi0oZGVmdW4gZ2V0LW1ldGhvZC1kZWZpbml0aW9uLTEgKGVuZCkKLSAgKHNldHEgZ2V0LW1ldGhvZC1kZWZpbml0aW9uLW1kCi0JKGNvbmNhdCBnZXQtbWV0aG9kLWRlZmluaXRpb24tbWQgCi0JCShidWZmZXItc3Vic3RyaW5nIChtYXRjaC1iZWdpbm5pbmcgMSkgKG1hdGNoLWVuZCAxKSkKLQkJZW5kKSkKLSAgKGdvdG8tY2hhciAobWF0Y2gtZW5kIDApKSkKLQotOzsgRm9yIG9iamVjdGl2ZSBDLCByZXR1cm4gdGhlIG1ldGhvZCBuYW1lIGlmIHdlIGFyZSBpbiBhIG1ldGhvZC4KLShkZWZ1biBnZXQtbWV0aG9kLWRlZmluaXRpb24gKCkKLSAgKGxldCAoKGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCAiWyIpKQotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKGlmIChyZS1zZWFyY2gtYmFja3dhcmQgIl5AaW1wbGVtZW50YXRpb25cXHMtKlxcKFtBLVphLXpfXSpcXCkiIG5pbCB0KQotCSAgKGdldC1tZXRob2QtZGVmaW5pdGlvbi0xICIgIikpKQotICAgIChzYXZlLWV4Y3Vyc2lvbgotICAgICAgKGNvbmQKLSAgICAgICAoKHJlLXNlYXJjaC1mb3J3YXJkICJeXFwoWy0rXVxcKVsgXHRcblxmXHJdKlxcKChbXildKilcXCk/XFxzLSoiIG5pbCB0KQotCShnZXQtbWV0aG9kLWRlZmluaXRpb24tMSAiIikKLQkod2hpbGUgKG5vdCAobG9va2luZy1hdCAiW3s7XSIpKQotCSAgKGxvb2tpbmctYXQKLQkgICAiXFwoW0EtWmEtel9dKjo/XFwpXFxzLSpcXCgoW14pXSopXFwpP1tBLVphLXpfXSpbIFx0XG5cZlxyXSoiKQotCSAgKGdldC1tZXRob2QtZGVmaW5pdGlvbi0xICIiKSkKLQkoY29uY2F0IGdldC1tZXRob2QtZGVmaW5pdGlvbi1tZCAiXSIpKSkpKSkKLQotCi0ocHJvdmlkZSAnYWRkLWxvZykKLQotOzs7IGFkZC1sb2cuZWwgZW5kcyBoZXJlCmRpZmYgLS1naXQgYS9ldGMvYWRkLWxvZy52aSBiL2V0Yy9hZGQtbG9nLnZpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI4Yzc3Li4wMDAwMDAwCi0tLSBhL2V0Yy9hZGQtbG9nLnZpCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmVpbiBiL2V0Yy9jb25maWdidWlsZC5laW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMGUyMTQuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmVpbgorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0lIVBTLUFkb2JlLTIuMCBFUFNGLTIuMAotJSVUaXRsZTogY29uZmlnYnVpbGQuZmlnCi0lJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjEgUGF0Y2hsZXZlbCAxCi0lJUNyZWF0aW9uRGF0ZTogRnJpIEp1biAxMiAyMDoxMzoxNiAxOTk4Ci0lJUZvcjogaWFuQHRpdG8uY3lnbnVzLmNvbSAoSWFuIExhbmNlIFRheWxvcikKLSUlT3JpZW50YXRpb246IFBvcnRyYWl0Ci0lJUJvdW5kaW5nQm94OiAwIDAgMzIyIDE3MwotJSVQYWdlczogMAotJSVCZWdpblNldHVwCi0lJUluY2x1ZGVGZWF0dXJlOiAqUGFnZVNpemUgTGV0dGVyCi0lJUVuZFNldHVwCi0lJUVuZENvbW1lbnRzCi0vJEYycHNEaWN0IDIwMCBkaWN0IGRlZgotJEYycHNEaWN0IGJlZ2luCi0kRjJwc0RpY3QgL210cnggbWF0cml4IHB1dAotL2NvbC0xIHt9IGRlZgotL2NvbDAgezAuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMSB7MC4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyIHswLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDMgezAuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNCB7MS4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w1IHsxLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDYgezEuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNyB7MS4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w4IHswLjAwMCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDkgezAuMDAwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTAgezAuMDAwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTEgezAuNTMwIDAuODEwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTIgezAuMDAwIDAuNTYwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTMgezAuMDAwIDAuNjkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTQgezAuMDAwIDAuODIwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTUgezAuMDAwIDAuNTYwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTYgezAuMDAwIDAuNjkwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTcgezAuMDAwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTggezAuNTYwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTkgezAuNjkwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjAgezAuODIwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjEgezAuNTYwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjIgezAuNjkwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjMgezAuODIwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjQgezAuNTAwIDAuMTkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjUgezAuNjMwIDAuMjUwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjYgezAuNzUwIDAuMzgwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjcgezEuMDAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjggezEuMDAwIDAuNjMwIDAuNjMwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjkgezEuMDAwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzAgezEuMDAwIDAuODgwIDAuODgwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzEgezEuMDAwIDAuODQwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0KLWVuZAotc2F2ZQotLTYyLjAgMjI2LjAgdHJhbnNsYXRlCi0xIC0xIHNjYWxlCi0KLS9jbHAge2Nsb3NlcGF0aH0gYmluZCBkZWYKLS9lZiB7ZW9maWxsfSBiaW5kIGRlZgotL2dyIHtncmVzdG9yZX0gYmluZCBkZWYKLS9ncyB7Z3NhdmV9IGJpbmQgZGVmCi0vbCB7bGluZXRvfSBiaW5kIGRlZgotL20ge21vdmV0b30gYmluZCBkZWYKLS9uIHtuZXdwYXRofSBiaW5kIGRlZgotL3Mge3N0cm9rZX0gYmluZCBkZWYKLS9zbGMge3NldGxpbmVjYXB9IGJpbmQgZGVmCi0vc2xqIHtzZXRsaW5lam9pbn0gYmluZCBkZWYKLS9zbHcge3NldGxpbmV3aWR0aH0gYmluZCBkZWYKLS9zcmdiIHtzZXRyZ2Jjb2xvcn0gYmluZCBkZWYKLS9yb3Qge3JvdGF0ZX0gYmluZCBkZWYKLS9zYyB7c2NhbGV9IGJpbmQgZGVmCi0vdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKLS90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9Ci0gIGJpbmQgZGVmCi0vc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKLSAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgotLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgotLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCi0lJUVuZFByb2xvZwotCi0kRjJwc0JlZ2luCi0xMCBzZXRtaXRlcmxpbWl0Ci0gMC4wNjAwMCAwLjA2MDAwIHNjCi03LjUwMCBzbHcKLSUgUG9seWxpbmUKLW4gMTA1MCA5MDAgbSAyMTAwIDkwMCBsICAyMTAwIDE0MjUgbCAgMTA1MCAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTUwMCAxNDI1IG0gMTUwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMTk4MC4wMCBtIDE1MDAuMDAgMjEwMC4wMCBsIDE0NzAuMDAgMTk4MC4wMCBsICAxNTAwLjUwIDE5ODAuNTAgbCAxNTMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMTUwMCAyNjI1IG0gMTUwMCAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDE1MzAuMDAgMzE4MC4wMCBtIDE1MDAuMDAgMzMwMC4wMCBsIDE0NzAuMDAgMzE4MC4wMCBsICAxNTAwLjUwIDMxODAuNTAgbCAxNTMwLjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gMjkyNSA5MDAgbSAzODI1IDkwMCBsICAzODI1IDE0MjUgbCAgMjkyNSAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMTE1NSAyMTAwIG0gMTA1MCAyMTAwIDEwNTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMTA1MCAyNjI1IDIyMjAgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjMyNSAyNjI1IDIzMjUgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgMjMyNSAyMTAwIDExNTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAyODUwIDIxMDAgbSA0MTI1IDIxMDAgbCAgNDEyNSAyNjI1IGwgIDI4NTAgMjYyNSBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDMzNzUgMTQyNSBtIDMzNzUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAzNDA1LjAwIDE5ODAuMDAgbSAzMzc1LjAwIDIxMDAuMDAgbCAzMzQ1LjAwIDE5ODAuMDAgbCAgMzM3NS41MCAxOTgwLjUwIGwgMzQwNS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDUxMDAgOTAwIG0gNjMwMCA5MDAgbCAgNjMwMCAxMzUwIGwgIDUxMDAgMTM1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU2MjUgMTM1MCBtIDU2MjUgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiA1NjU1LjAwIDE5ODAuMDAgbSA1NjI1LjAwIDIxMDAuMDAgbCA1NTk1LjAwIDE5ODAuMDAgbCAgNTYyNS41MCAxOTgwLjUwIGwgNTY1NS4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDUyMDUgMjEwMCBtIDUxMDAgMjEwMCA1MTAwIDI1MjAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDUxMDAgMjYyNSA2MjcwIDI2MjUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDYzNzUgMjYyNSA2Mzc1IDIyMDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDYzNzUgMjEwMCA1MjA1IDIxMDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTYyNSAyNjI1IG0gNTYyNSAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU2NTUuMDAgMzE4MC4wMCBtIDU2MjUuMDAgMzMwMC4wMCBsIDU1OTUuMDAgMzE4MC4wMCBsICA1NjI1LjUwIDMxODAuNTAgbCA1NjU1LjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNTEwMCAzMzAwIG0gNjIyNSAzMzAwIGwgIDYyMjUgMzc1MCBsICA1MTAwIDM3NTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotCVsxIDUwLjBdIDUwLjAwMDAwMCBzZXRkYXNoCi1uIDI4NTAgMjQwMCBtIDIzMjUgMjQwMCBsICBncyBjb2wtMSBzIGdyIAlbXSAwIHNldGRhc2gKLW4gMjQ0NS4wMCAyNDMwLjAwIG0gMjMyNS4wMCAyNDAwLjAwIGwgMjQ0NS4wMCAyMzcwLjAwIGwgIDI0NDUuNTAgMjQwMC41MCBsIDI0NDUuMDAgMjQzMC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotCVsxIDUwLjBdIDUwLjAwMDAwMCBzZXRkYXNoCi1uIDQxMjUgMjQwMCBtIDUxMDAgMjQwMCBsICBncyBjb2wtMSBzIGdyIAlbXSAwIHNldGRhc2gKLW4gNDk4MC4wMCAyMzcwLjAwIG0gNTEwMC4wMCAyNDAwLjAwIGwgNDk4MC4wMCAyNDMwLjAwIGwgIDQ5ODAuNTAgMjQwMC41MCBsIDQ5ODAuMDAgMjM3MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxMDUwIDMzMDAgbSAxOTUwIDMzMDAgbCAgMTk1MCAzNzUwIGwgIDEwNTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDI0MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMTIwMCAyNDAwIG0KLWdzIDEgLTEgc2MgKGNvbmZpZy5zdGF0dXMpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMzYwMCBtCi1ncyAxIC0xIHNjIChjb25maWcuaCkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTI1MCAxMjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01MjUwIDI0MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLnN0YXR1cykgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotNTI1MCAzNjAwIG0KLWdzIDEgLTEgc2MgKE1ha2VmaWxlKSBjb2wtMSBzaG93IGdyCi0kRjJwc0VuZAotcmVzdG9yZQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmZpZyBiL2V0Yy9jb25maWdidWlsZC5maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzU5MmQuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmZpZworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSNGSUcgMy4xCi1Qb3J0cmFpdAotQ2VudGVyCi1JbmNoZXMKLTEyMDAgMgotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAxMDUwIDkwMCAyMTAwIDkwMCAyMTAwIDE0MjUgMTA1MCAxNDI1IDEwNTAgOTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDE0MjUgMTUwMCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAxNTAwIDI2MjUgMTUwMCAzMzAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI5MjUgOTAwIDM4MjUgOTAwIDM4MjUgMTQyNSAyOTI1IDE0MjUgMjkyNSA5MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMjMyNSAyNjI1IDIzMjUgMjEwMCAxMDUwIDIxMDAgMTA1MCAyNjI1IDIzMjUgMjYyNQotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSAyODUwIDIxMDAgNDEyNSAyMTAwIDQxMjUgMjYyNSAyODUwIDI2MjUgMjg1MCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAzMzc1IDE0MjUgMzM3NSAyMTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDUxMDAgOTAwIDYzMDAgOTAwIDYzMDAgMTM1MCA1MTAwIDEzNTAgNTEwMCA5MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDU2MjUgMTM1MCA1NjI1IDIxMDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgNjM3NSAyNjI1IDYzNzUgMjEwMCA1MTAwIDIxMDAgNTEwMCAyNjI1IDYzNzUgMjYyNQotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNTYyNSAyNjI1IDU2MjUgMzMwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1MTAwIDMzMDAgNjIyNSAzMzAwIDYyMjUgMzc1MCA1MTAwIDM3NTAgNTEwMCAzMzAwCi0yIDEgMiAxIC0xIDcgMCAwIC0xIDMuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSAyODUwIDI0MDAgMjMyNSAyNDAwCi0yIDEgMiAxIC0xIDcgMCAwIC0xIDMuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MTI1IDI0MDAgNTEwMCAyNDAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgMzMwMCAxOTUwIDMzMDAgMTk1MCAzNzUwIDEwNTAgMzc1MCAxMDUwIDMzMDAKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNjQ1IDEyMDAgMTIwMCBjb25maWcuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDcwNSAzMDAwIDEyMDAgY29uZmlndXJlXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDE4MCA5OTAgMzAwMCAyNDAwIGNvbmZpZy5zdGF0dXNcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDk5MCAxMjAwIDI0MDAgY29uZmlnLnN0YXR1c1wwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNjAwIDEyMDAgMzYwMCBjb25maWcuaFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxMzUgODU1IDUyNTAgMTIwMCBNYWtlZmlsZS5pblwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgOTkwIDUyNTAgMjQwMCBjb25maWcuc3RhdHVzXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA2NzUgNTI1MCAzNjAwIE1ha2VmaWxlXDAwMQpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2J1aWxkLmppbiBiL2V0Yy9jb25maWdidWlsZC5qaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0Y2Q5MzkuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ2J1aWxkLmppbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWdidWlsZC50aW4gYi9ldGMvY29uZmlnYnVpbGQudGluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmRkNmZlLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdidWlsZC50aW4KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSAgIGNvbmZpZy5pbiAgICAgICAgKmNvbmZpZ3VyZSogICAgICBNYWtlZmlsZS5pbgotICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gICAgICB8ICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgIHwKLSAgICAgIHwgICAgICAgICAgICAgY29uZmlnLnN0YXR1cyAgICAgICAgfAotICAgICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gICAqY29uZmlnLnN0YXR1cyo8PT09PT09Kz09PT09PT09PT0+KmNvbmZpZy5zdGF0dXMqCi0gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdgotICAgY29uZmlnLmggICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmVpbiBiL2V0Yy9jb25maWdkZXYuZWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjgzNzg1Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuZWluCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLSUhUFMtQWRvYmUtMi4wIEVQU0YtMi4wCi0lJVRpdGxlOiBjb25maWdkZXYuZmlnCi0lJUNyZWF0b3I6IGZpZzJkZXYgVmVyc2lvbiAzLjEgUGF0Y2hsZXZlbCAxCi0lJUNyZWF0aW9uRGF0ZTogTW9uIEp1biAxNSAxNzozNToxOSAxOTk4Ci0lJUZvcjogaWFuQHRpdG8uY3lnbnVzLmNvbSAoSWFuIExhbmNlIFRheWxvcikKLSUlT3JpZW50YXRpb246IFBvcnRyYWl0Ci0lJUJvdW5kaW5nQm94OiAwIDAgMzQ0IDMxNwotJSVQYWdlczogMAotJSVCZWdpblNldHVwCi0lJUluY2x1ZGVGZWF0dXJlOiAqUGFnZVNpemUgTGV0dGVyCi0lJUVuZFNldHVwCi0lJUVuZENvbW1lbnRzCi0vJEYycHNEaWN0IDIwMCBkaWN0IGRlZgotJEYycHNEaWN0IGJlZ2luCi0kRjJwc0RpY3QgL210cnggbWF0cml4IHB1dAotL2NvbC0xIHt9IGRlZgotL2NvbDAgezAuMDAwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMSB7MC4wMDAgMC4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2wyIHswLjAwMCAxLjAwMCAwLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDMgezAuMDAwIDEuMDAwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNCB7MS4wMDAgMC4wMDAgMC4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w1IHsxLjAwMCAwLjAwMCAxLjAwMCBzcmdifSBiaW5kIGRlZgotL2NvbDYgezEuMDAwIDEuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sNyB7MS4wMDAgMS4wMDAgMS4wMDAgc3JnYn0gYmluZCBkZWYKLS9jb2w4IHswLjAwMCAwLjAwMCAwLjU2MCBzcmdifSBiaW5kIGRlZgotL2NvbDkgezAuMDAwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTAgezAuMDAwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTEgezAuNTMwIDAuODEwIDEuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTIgezAuMDAwIDAuNTYwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTMgezAuMDAwIDAuNjkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTQgezAuMDAwIDAuODIwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTUgezAuMDAwIDAuNTYwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTYgezAuMDAwIDAuNjkwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTcgezAuMDAwIDAuODIwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTggezAuNTYwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMTkgezAuNjkwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjAgezAuODIwIDAuMDAwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjEgezAuNTYwIDAuMDAwIDAuNTYwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjIgezAuNjkwIDAuMDAwIDAuNjkwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjMgezAuODIwIDAuMDAwIDAuODIwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjQgezAuNTAwIDAuMTkwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjUgezAuNjMwIDAuMjUwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjYgezAuNzUwIDAuMzgwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjcgezEuMDAwIDAuNTAwIDAuNTAwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjggezEuMDAwIDAuNjMwIDAuNjMwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMjkgezEuMDAwIDAuNzUwIDAuNzUwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzAgezEuMDAwIDAuODgwIDAuODgwIHNyZ2J9IGJpbmQgZGVmCi0vY29sMzEgezEuMDAwIDAuODQwIDAuMDAwIHNyZ2J9IGJpbmQgZGVmCi0KLWVuZAotc2F2ZQotLTYyLjAgMzcwLjAgdHJhbnNsYXRlCi0xIC0xIHNjYWxlCi0KLS9jbHAge2Nsb3NlcGF0aH0gYmluZCBkZWYKLS9lZiB7ZW9maWxsfSBiaW5kIGRlZgotL2dyIHtncmVzdG9yZX0gYmluZCBkZWYKLS9ncyB7Z3NhdmV9IGJpbmQgZGVmCi0vbCB7bGluZXRvfSBiaW5kIGRlZgotL20ge21vdmV0b30gYmluZCBkZWYKLS9uIHtuZXdwYXRofSBiaW5kIGRlZgotL3Mge3N0cm9rZX0gYmluZCBkZWYKLS9zbGMge3NldGxpbmVjYXB9IGJpbmQgZGVmCi0vc2xqIHtzZXRsaW5lam9pbn0gYmluZCBkZWYKLS9zbHcge3NldGxpbmV3aWR0aH0gYmluZCBkZWYKLS9zcmdiIHtzZXRyZ2Jjb2xvcn0gYmluZCBkZWYKLS9yb3Qge3JvdGF0ZX0gYmluZCBkZWYKLS9zYyB7c2NhbGV9IGJpbmQgZGVmCi0vdHIge3RyYW5zbGF0ZX0gYmluZCBkZWYKLS90bnQge2R1cCBkdXAgY3VycmVudHJnYmNvbG9yCi0gIDQgLTIgcm9sbCBkdXAgMSBleGNoIHN1YiAzIC0xIHJvbGwgbXVsIGFkZAotICA0IC0yIHJvbGwgZHVwIDEgZXhjaCBzdWIgMyAtMSByb2xsIG11bCBhZGQKLSAgNCAtMiByb2xsIGR1cCAxIGV4Y2ggc3ViIDMgLTEgcm9sbCBtdWwgYWRkIHNyZ2J9Ci0gIGJpbmQgZGVmCi0vc2hkIHtkdXAgZHVwIGN1cnJlbnRyZ2Jjb2xvciA0IC0yIHJvbGwgbXVsIDQgLTIgcm9sbCBtdWwKLSAgNCAtMiByb2xsIG11bCBzcmdifSBiaW5kIGRlZgotLyRGMnBzQmVnaW4geyRGMnBzRGljdCBiZWdpbiAvJEYycHNFbnRlcmVkU3RhdGUgc2F2ZSBkZWZ9IGRlZgotLyRGMnBzRW5kIHskRjJwc0VudGVyZWRTdGF0ZSByZXN0b3JlIGVuZH0gZGVmCi0lJUVuZFByb2xvZwotCi0kRjJwc0JlZ2luCi0xMCBzZXRtaXRlcmxpbWl0Ci0gMC4wNjAwMCAwLjA2MDAwIHNjCi03LjUwMCBzbHcKLSUgUG9seWxpbmUKLW4gMTA1MCA5MDAgbSAyMTAwIDkwMCBsICAyMTAwIDE0MjUgbCAgMTA1MCAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMjkyNSA5MDAgbSAzOTc1IDkwMCBsICAzOTc1IDE0MjUgbCAgMjkyNSAxNDI1IGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTU1MCA5MDAgbSA2NzUwIDkwMCBsICA2NzUwIDEzNTAgbCAgNTU1MCAxMzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMzc1MCAxODAwIG0gNTAyNSAxODAwIGwgIDUwMjUgMjI1MCBsICAzNzUwIDIyNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAxMTU1IDIxMDAgbSAxMDUwIDIxMDAgMTA1MCAyNTIwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAxMDUwIDI2MjUgMjA3MCAyNjI1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyMTc1IDI2MjUgMjE3NSAyMjA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyMTc1IDIxMDAgMTE1NSAyMTAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDU1NTAgMzMwMCBtIDY2NzUgMzMwMCBsICA2Njc1IDM3NTAgbCAgNTU1MCAzNzUwIGwgIGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gNTY1NSAyMTAwIG0gNTU1MCAyMTAwIDU1NTAgMjUyMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNTU1MCAyNjI1IDY0OTUgMjYyNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNjYwMCAyNjI1IDY2MDAgMjIwNSAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgNjYwMCAyMTAwIDU2NTUgMjEwMCAxMDUgYXJjdG8gNCB7cG9wfSByZXBlYXQgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzNzUwIDM2MDAgbSA0ODc1IDM2MDAgbCAgNDg3NSA0MDUwIGwgIDM3NTAgNDA1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDM4NTUgMjcwMCBtIDM3NTAgMjcwMCAzNzUwIDMwNDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDM3NTAgMzE1MCA0NTQ1IDMxNTAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDQ2NTAgMzE1MCA0NjUwIDI4MDUgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IDQ2NTAgMjcwMCAzODU1IDI3MDAgMTA1IGFyY3RvIDQge3BvcH0gcmVwZWF0IGNscCAgZ3MgY29sLTEgcyBnciAKLSUgUG9seWxpbmUKLW4gMjg1MCA1NzAwIG0gMzc1MCA1NzAwIGwgIDM3NTAgNjE1MCBsICAyODUwIDYxNTAgbCAgY2xwICBncyBjb2wtMSBzIGdyIAotJSBQb2x5bGluZQotbiAzMDMwIDQ4MDAgbSAyOTI1IDQ4MDAgMjkyNSA1MTQ1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAyOTI1IDUyNTAgMzY0NSA1MjUwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAzNzUwIDUyNTAgMzc1MCA0OTA1IDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCAzNzUwIDQ4MDAgMzAzMCA0ODAwIDEwNSBhcmN0byA0IHtwb3B9IHJlcGVhdCBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDE1MDAgMTQyNSBtIDE1MDAgMjEwMCBsICBncyBjb2wtMSBzIGdyIAotbiAxNTMwLjAwIDE5ODAuMDAgbSAxNTAwLjAwIDIxMDAuMDAgbCAxNDcwLjAwIDE5ODAuMDAgbCAgMTUwMC41MCAxOTgwLjUwIGwgMTUzMC4wMCAxOTgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzMDAgMTQyNSBtIDMzMDAgNDgwMCBsICBncyBjb2wtMSBzIGdyIAotbiAzMzMwLjAwIDQ2ODAuMDAgbSAzMzAwLjAwIDQ4MDAuMDAgbCAzMjcwLjAwIDQ2ODAuMDAgbCAgMzMwMC41MCA0NjgwLjUwIGwgMzMzMC4wMCA0NjgwLjAwIGwgY2xwIGdzIDAuMDAgc2V0Z3JheSBlZiBnciBncyBjb2wtMSBzIGdyCi0lIFBvbHlsaW5lCi1uIDMzMDAgMTU3NSBtIDE4NzUgMTU3NSBsICAxODc1IDIxMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTkwNS4wMCAxOTgwLjAwIG0gMTg3NS4wMCAyMTAwLjAwIGwgMTg0NS4wMCAxOTgwLjAwIGwgIDE4NzUuNTAgMTk4MC41MCBsIDE5MDUuMDAgMTk4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDE1NzUgbSA1NzAwIDE1NzUgbCAgNTcwMCAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU3MzAuMDAgMTk4MC4wMCBtIDU3MDAuMDAgMjEwMC4wMCBsIDU2NzAuMDAgMTk4MC4wMCBsICA1NzAwLjUwIDE5ODAuNTAgbCA1NzMwLjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNjIyNSAxMzUwIG0gNjIyNSAyMTAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDYyNTUuMDAgMTk4MC4wMCBtIDYyMjUuMDAgMjEwMC4wMCBsIDYxOTUuMDAgMTk4MC4wMCBsICA2MjI1LjUwIDE5ODAuNTAgbCA2MjU1LjAwIDE5ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNjA3NSAyNjI1IG0gNjA3NSAzMzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDYxMDUuMDAgMzE4MC4wMCBtIDYwNzUuMDAgMzMwMC4wMCBsIDYwNDUuMDAgMzE4MC4wMCBsICA2MDc1LjUwIDMxODAuNTAgbCA2MTA1LjAwIDMxODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCAyMjUwIG0gNDIwMCAyNzAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDQyMzAuMDAgMjU4MC4wMCBtIDQyMDAuMDAgMjcwMC4wMCBsIDQxNzAuMDAgMjU4MC4wMCBsICA0MjAwLjUwIDI1ODAuNTAgbCA0MjMwLjAwIDI1ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCAzMTUwIG0gNDIwMCAzNjAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDQyMzAuMDAgMzQ4MC4wMCBtIDQyMDAuMDAgMzYwMC4wMCBsIDQxNzAuMDAgMzQ4MC4wMCBsICA0MjAwLjUwIDM0ODAuNTAgbCA0MjMwLjAwIDM0ODAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLSUgUG9seWxpbmUKLW4gNDIwMCA0MDUwIG0gNDIwMCA0NTAwIGwgIDM2NzUgNDUwMCBsICAzNjc1IDQ4MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzcwNS4wMCA0NjgwLjAwIG0gMzY3NS4wMCA0ODAwLjAwIGwgMzY0NS4wMCA0NjgwLjAwIGwgIDM2NzUuNTAgNDY4MC41MCBsIDM3MDUuMDAgNDY4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzc1IDUyNTAgbSAzMzc1IDU3MDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzQwNS4wMCA1NTgwLjAwIG0gMzM3NS4wMCA1NzAwLjAwIGwgMzM0NS4wMCA1NTgwLjAwIGwgIDMzNzUuNTAgNTU4MC41MCBsIDM0MDUuMDAgNTU4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAzMzAwIDI5MjUgbSAzNzUwIDI5MjUgbCAgZ3MgY29sLTEgcyBnciAKLW4gMzYzMC4wMCAyODk1LjAwIG0gMzc1MC4wMCAyOTI1LjAwIGwgMzYzMC4wMCAyOTU1LjAwIGwgIDM2MzAuNTAgMjkyNS41MCBsIDM2MzAuMDAgMjg5NS4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxNTAwIDI2MjUgbSAxNTAwIDMzMDAgbCAgZ3MgY29sLTEgcyBnciAKLW4gMTUzMC4wMCAzMTgwLjAwIG0gMTUwMC4wMCAzMzAwLjAwIGwgMTQ3MC4wMCAzMTgwLjAwIGwgIDE1MDAuNTAgMzE4MC41MCBsIDE1MzAuMDAgMzE4MC4wMCBsIGNscCBncyAwLjAwIHNldGdyYXkgZWYgZ3IgZ3MgY29sLTEgcyBncgotJSBQb2x5bGluZQotbiAxMDUwIDMzMDAgbSAyMTAwIDMzMDAgbCAgMjEwMCAzNzUwIGwgIDEwNTAgMzc1MCBsICBjbHAgIGdzIGNvbC0xIHMgZ3IgCi0lIFBvbHlsaW5lCi1uIDQ4NzUgMzgyNSBtIDUyNTAgMzgyNSBsICA1MjUwIDI0MDAgbCAgNTU1MCAyNDAwIGwgIGdzIGNvbC0xIHMgZ3IgCi1uIDU0MzAuMDAgMjM3MC4wMCBtIDU1NTAuMDAgMjQwMC4wMCBsIDU0MzAuMDAgMjQzMC4wMCBsICA1NDMwLjUwIDI0MDAuNTAgbCA1NDMwLjAwIDIzNzAuMDAgbCBjbHAgZ3MgMC4wMCBzZXRncmF5IGVmIGdyIGdzIGNvbC0xIHMgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMTIwMCBtCi1ncyAxIC0xIHNjIChhY2NvbmZpZy5oKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01NzAwIDEyMDAgbQotZ3MgMSAtMSBzYyAoTWFrZWZpbGUuYW0pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTM5MDAgMjEwMCBtCi1ncyAxIC0xIHNjIChhY2luY2x1ZGUubTQpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTEyMDAgMjQwMCBtCi1ncyAxIC0xIHNjIChhdXRvaGVhZGVyKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0xMjAwIDM2MDAgbQotZ3MgMSAtMSBzYyAoY29uZmlnLmluKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci01NzAwIDM2MDAgbQotZ3MgMSAtMSBzYyAoTWFrZWZpbGUuaW4pIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTU3MDAgMjQwMCBtCi1ncyAxIC0xIHNjIChhdXRvbWFrZSkgY29sLTEgc2hvdyBncgotL1RpbWVzLVJvbWFuIGZpbmRmb250IDE4MC4wMCBzY2FsZWZvbnQgc2V0Zm9udAotMzkwMCAzOTAwIG0KLWdzIDEgLTEgc2MgKGFjbG9jYWwubTQpIGNvbC0xIHNob3cgZ3IKLS9UaW1lcy1Sb21hbiBmaW5kZm9udCAxODAuMDAgc2NhbGVmb250IHNldGZvbnQKLTM5MDAgMzAwMCBtCi1ncyAxIC0xIHNjIChhY2xvY2FsKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDYwMDAgbQotZ3MgMSAtMSBzYyAoY29uZmlndXJlKSBjb2wtMSBzaG93IGdyCi0vVGltZXMtUm9tYW4gZmluZGZvbnQgMTgwLjAwIHNjYWxlZm9udCBzZXRmb250Ci0zMDAwIDUxMDAgbQotZ3MgMSAtMSBzYyAoYXV0b2NvbmYpIGNvbC0xIHNob3cgZ3IKLSRGMnBzRW5kCi1yZXN0b3JlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmZpZyBiL2V0Yy9jb25maWdkZXYuZmlnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDM4NmVjLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuZmlnCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI0ZJRyAzLjEKLVBvcnRyYWl0Ci1DZW50ZXIKLUluY2hlcwotMTIwMCAyCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDEwNTAgOTAwIDIxMDAgOTAwIDIxMDAgMTQyNSAxMDUwIDE0MjUgMTA1MCA5MDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMjkyNSA5MDAgMzk3NSA5MDAgMzk3NSAxNDI1IDI5MjUgMTQyNSAyOTI1IDkwMAotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1NTUwIDkwMCA2NzUwIDkwMCA2NzUwIDEzNTAgNTU1MCAxMzUwIDU1NTAgOTAwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDM3NTAgMTgwMCA1MDI1IDE4MDAgNTAyNSAyMjUwIDM3NTAgMjI1MCAzNzUwIDE4MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMjE3NSAyNjI1IDIxNzUgMjEwMCAxMDUwIDIxMDAgMTA1MCAyNjI1IDIxNzUgMjYyNQotMiAyIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgMCAwIDAgNQotCSA1NTUwIDMzMDAgNjY3NSAzMzAwIDY2NzUgMzc1MCA1NTUwIDM3NTAgNTU1MCAzMzAwCi0yIDQgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCA3IDAgMCA1Ci0JIDY2MDAgMjYyNSA2NjAwIDIxMDAgNTU1MCAyMTAwIDU1NTAgMjYyNSA2NjAwIDI2MjUKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMzc1MCAzNjAwIDQ4NzUgMzYwMCA0ODc1IDQwNTAgMzc1MCA0MDUwIDM3NTAgMzYwMAotMiA0IDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgNyAwIDAgNQotCSA0NjUwIDMxNTAgNDY1MCAyNzAwIDM3NTAgMjcwMCAzNzUwIDMxNTAgNDY1MCAzMTUwCi0yIDIgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAwIDAgMCA1Ci0JIDI4NTAgNTcwMCAzNzUwIDU3MDAgMzc1MCA2MTUwIDI4NTAgNjE1MCAyODUwIDU3MDAKLTIgNCAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDcgMCAwIDUKLQkgMzc1MCA1MjUwIDM3NTAgNDgwMCAyOTI1IDQ4MDAgMjkyNSA1MjUwIDM3NTAgNTI1MAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMTUwMCAxNDI1IDE1MDAgMjEwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDIKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzMwMCAxNDI1IDMzMDAgNDgwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDMKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgMzMwMCAxNTc1IDE4NzUgMTU3NSAxODc1IDIxMDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAzCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMTU3NSA1NzAwIDE1NzUgNTcwMCAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA2MjI1IDEzNTAgNjIyNSAyMTAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA2MDc1IDI2MjUgNjA3NSAzMzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDIyNTAgNDIwMCAyNzAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgMgotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDMxNTAgNDIwMCAzNjAwCi0yIDEgMCAxIC0xIDcgMCAwIC0xIDAuMDAwIDAgMCAtMSAxIDAgNAotCTEgMSAxLjAwIDYwLjAwIDEyMC4wMAotCSA0MjAwIDQwNTAgNDIwMCA0NTAwIDM2NzUgNDUwMCAzNjc1IDQ4MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzNzUgNTI1MCAzMzc1IDU3MDAKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDMzMDAgMjkyNSAzNzUwIDI5MjUKLTIgMSAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIC0xIDEgMCAyCi0JMSAxIDEuMDAgNjAuMDAgMTIwLjAwCi0JIDE1MDAgMjYyNSAxNTAwIDMzMDAKLTIgMiAwIDEgLTEgNyAwIDAgLTEgMC4wMDAgMCAwIDAgMCAwIDUKLQkgMTA1MCAzMzAwIDIxMDAgMzMwMCAyMTAwIDM3NTAgMTA1MCAzNzUwIDEwNTAgMzMwMAotMiAxIDAgMSAtMSA3IDAgMCAtMSAwLjAwMCAwIDAgLTEgMSAwIDQKLQkxIDEgMS4wMCA2MC4wMCAxMjAuMDAKLQkgNDg3NSAzODI1IDUyNTAgMzgyNSA1MjUwIDI0MDAgNTU1MCAyNDAwCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDc4MCAxMjAwIDEyMDAgYWNjb25maWcuaFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgODg1IDMwMDAgMTIwMCBjb25maWd1cmUuaW5cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDk0NSA1NzAwIDEyMDAgTWFrZWZpbGUuYW1cMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDk5MCAzOTAwIDIxMDAgYWNpbmNsdWRlLm00XDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4NDAgMTIwMCAyNDAwIGF1dG9oZWFkZXJcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTgwIDY0NSAxMjAwIDM2MDAgY29uZmlnLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4NTUgNTcwMCAzNjAwIE1ha2VmaWxlLmluXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA3MzUgNTcwMCAyNDAwIGF1dG9tYWtlXDAwMQotNCAwIC0xIDAgMCAwIDEyIDAuMDAwMDAwMCA0IDEzNSA4MTAgMzkwMCAzOTAwIGFjbG9jYWwubTRcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDU0MCAzOTAwIDMwMDAgYWNsb2NhbFwwMDEKLTQgMCAtMSAwIDAgMCAxMiAwLjAwMDAwMDAgNCAxODAgNzA1IDMwMDAgNjAwMCBjb25maWd1cmVcMDAxCi00IDAgLTEgMCAwIDAgMTIgMC4wMDAwMDAwIDQgMTM1IDY2MCAzMDAwIDUxMDAgYXV0b2NvbmZcMDAxCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnZGV2LmppbiBiL2V0Yy9jb25maWdkZXYuamluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjExYTcxLi4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWdkZXYuamluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZ2Rldi50aW4gYi9ldGMvY29uZmlnZGV2LnRpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliNmYzNC4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlnZGV2LnRpbgorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSAgIGFjY29uZmlnLmggICAgICAgY29uZmlndXJlLmluICAgICAgICAgICAgICAgICBNYWtlZmlsZS5hbQotICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICB8ICAtLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICB8Ci0gICAgICAgfCAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfAotICAgICAgIHYgIHYgICAgICAgICAgICAgfCAgICBhY2luY2x1ZGUubTQgICAgIHwgICAgIHwKLSAgICphdXRvaGVhZGVyKiAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICB2ICAgICB2Ci0gICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgdiAgICAgIC0tLT4qYXV0b21ha2UqIAotICAgICAgIHYgICAgICAgICAgICAgICAgfC0tLT4qYWNsb2NhbCogICB8ICAgICAgIHwgICAgICAKLSAgIGNvbmZpZy5pbiAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgfCAgICAgICB2ICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgdiAgICAgIHwgICBNYWtlZmlsZS5pbgotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICBhY2xvY2FsLm00LS0tCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICB2ICAgICB2Ci0gICAgICAgICAgICAgICAgICAgICAgICphdXRvY29uZioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKLSAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlIGIvZXRjL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTAxZmNlZi4uMDAwMDAwMAotLS0gYS9ldGMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsODYyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTIuMSIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1NYWtlZmlsZS5pbgotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU1NTogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQpIDI+JjEgfCBncmVwIGFjX3NwYWNlYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBERUZTLgotIyBQcm90ZWN0IGFnYWluc3Qgc2hlbGwgZXhwYW5zaW9uIHdoaWxlIGV4ZWN1dGluZyBNYWtlZmlsZSBydWxlcy4KLSMgUHJvdGVjdCBhZ2FpbnN0IE1ha2VmaWxlIG1hY3JvIGV4cGFuc2lvbi4KLWNhdCA+IGNvbmZ0ZXN0LmRlZnMgPDxcRU9GCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUtRFwxPVwyJWcKLXMlWyAJYH4jJF4mKigpe31cXHw7JyI8Pj9dJVxcJiVnCi1zJVxbJVxcJiVnCi1zJVxdJVxcJiVnCi1zJVwkJSQkJWcKLUVPRgotREVGUz1gc2VkIC1mIGNvbmZ0ZXN0LmRlZnMgY29uZmRlZnMuaCB8IHRyICdcMDEyJyAnICdgCi1ybSAtZiBjb25mdGVzdC5kZWZzCi0KLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2V0Yy9jb25maWd1cmUuaW4gYi9ldGMvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzg1MDY4Li4wMDAwMDAwCi0tLSBhL2V0Yy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfUFJFUkVRKDIuNSkKLUFDX0lOSVQoTWFrZWZpbGUuaW4pCi0KLUFDX1BST0dfSU5TVEFMTAotCi1BQ19PVVRQVVQoTWFrZWZpbGUpCmRpZmYgLS1naXQgYS9ldGMvY29uZmlndXJlLnRleGkgYi9ldGMvY29uZmlndXJlLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDAxNjcuLjAwMDAwMDAKLS0tIGEvZXRjL2NvbmZpZ3VyZS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjY0NCArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQGMgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgY29uZmlndXJlLmluZm8KLUBzZXR0aXRsZSBUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCi1AYyAlKiplbmQgb2YgaGVhZGVyCi0KLUBkaXJjYXRlZ29yeSBHTlUgYWRtaW4KLUBkaXJlbnRyeQotKiBjb25maWd1cmU6IChjb25maWd1cmUpLglUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1AZW5kIGRpcmVudHJ5Ci0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbS4KLQotQ29weXJpZ2h0IChDKSAxOTk4IEN5Z251cyBTb2x1dGlvbnMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLQotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRm91bmRhdGlvbi4KLUBlbmQgaWZpbmZvCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBUaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi1AYXV0aG9yIElhbiBMYW5jZSBUYXlsb3IKLQotQHBhZ2UKLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5OCBDeWdudXMgU29sdXRpb25zCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uCi1hcHByb3ZlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQGVuZCB0aXRsZXBhZ2UKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbQotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtLgotCi1AbWVudQotKiBJbnRyb2R1Y3Rpb246OgkJSW50cm9kdWN0aW9uLgotKiBHZXR0aW5nIFN0YXJ0ZWQ6OgkJR2V0dGluZyBTdGFydGVkLgotKiBGaWxlczo6CQkJRmlsZXMuCi0qIENvbmZpZ3VyYXRpb24gTmFtZXM6OgkJQ29uZmlndXJhdGlvbiBOYW1lcy4KLSogQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHM6OglDcm9zcyBDb21waWxhdGlvbiBUb29scy4KLSogQ2FuYWRpYW4gQ3Jvc3M6OgkJQ2FuYWRpYW4gQ3Jvc3MuCi0qIEN5Z251cyBDb25maWd1cmU6OgkJQ3lnbnVzIENvbmZpZ3VyZS4KLSogTXVsdGlsaWJzOjoJCQlNdWx0aWxpYnMuCi0qIEZBUTo6CQkJCUZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zLgotKiBJbmRleDo6CQkJSW5kZXguCi1AZW5kIG1lbnUKLQotQGVuZCBpZmluZm8KLQotQG5vZGUgSW50cm9kdWN0aW9uCi1AY2hhcHRlciBJbnRyb2R1Y3Rpb24KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbXMuICBJdAotZGVzY3JpYmVzIGhvdyBhdXRvY29uZiwgYXV0b21ha2UsIGxpYnRvb2wsIGFuZCBtYWtlIGZpdCB0b2dldGhlci4gIEl0Ci1hbHNvIGluY2x1ZGVzIGEgZGlzY3Vzc2lvbiBvZiB0aGUgb2xkZXIgQ3lnbnVzIGNvbmZpZ3VyZSBzeXN0ZW0uCi0KLVRoaXMgZG9jdW1lbnQgZG9lcyBub3QgZGVzY3JpYmUgaW4gZGV0YWlsIGhvdyB0byB1c2UgZWFjaCBvZiB0aGUgdG9vbHM7Ci1zZWUgdGhlIHJlc3BlY3RpdmUgbWFudWFscyBmb3IgdGhhdC4gIEluc3RlYWQsIGl0IGRlc2NyaWJlcyB3aGljaCBmaWxlcwotdGhlIGRldmVsb3BlciBtdXN0IHdyaXRlLCB3aGljaCBmaWxlcyBhcmUgbWFjaGluZSBnZW5lcmF0ZWQgYW5kIGhvdyB0aGV5Ci1hcmUgZ2VuZXJhdGVkLCBhbmQgd2hlcmUgY2VydGFpbiBjb21tb24gcHJvYmxlbXMgc2hvdWxkIGJlIGFkZHJlc3NlZC4KLQotQGlmbm90aHRtbAotVGhpcyBkb2N1bWVudCBkcmF3cyBvbiBzZXZlcmFsIHNvdXJjZXMsIGluY2x1ZGluZyB0aGUgYXV0b2NvbmYgbWFudWFsIGJ5Ci1EYXZpZCBNYWNLZW56aWUgKEBweHJlZntUb3AsICwgYXV0b2NvbmYgb3ZlcnZpZXcsIGF1dG9jb25mLCBBdXRvY29uZn0pLAotdGhlIGF1dG9tYWtlIG1hbnVhbCBieSBEYXZpZCBNYWNLZW56aWUgYW5kIFRvbSBUcm9tZXkgKEBweHJlZntUb3AsICwKLWF1dG9tYWtlIG92ZXJ2aWV3LCBhdXRvbWFrZSwgR05VIEF1dG9tYWtlfSksIHRoZSBsaWJ0b29sIG1hbnVhbCBieQotR29yZG9uIE1hdHppZ2tlaXQgKEBweHJlZntUb3AsICwgbGlidG9vbCBvdmVydmlldywgbGlidG9vbCwgR05VCi1saWJ0b29sfSksIGFuZCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBtYW51YWwgYnkgSy4gUmljaGFyZCBQaXhsZXkuCi1AZW5kIGlmbm90aHRtbAotQGlmaHRtbAotVGhpcyBkb2N1bWVudCBkcmF3cyBvbiBzZXZlcmFsIHNvdXJjZXMsIGluY2x1ZGluZwotQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvY29uZi9hdXRvY29uZl90b2MuaHRtbCwgdGhlCi1hdXRvY29uZiBtYW51YWx9IGJ5IERhdmlkIE1hY0tlbnppZSwKLUB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b21ha2UvYXV0b21ha2VfdG9jLmh0bWwsIHRoZQotYXV0b21ha2UgbWFudWFsfSBieSBEYXZpZCBNYWNLZW56aWUgYW5kIFRvbSBUcm9tZXksCi1AdXJlZntodHRwOi8vd3d3LmRlbG9yaWUuY29tL2dudS9kb2NzL2xpYnRvb2wvbGlidG9vbF90b2MuaHRtbCwgdGhlCi1saWJ0b29sIG1hbnVhbH0gYnkgR29yZG9uIE1hdHppZ2tlaXQsIGFuZCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBtYW51YWwgYnkKLUsuIFJpY2hhcmQgUGl4bGV5LgotQGVuZCBpZmh0bWwKLQotQG1lbnUKLSogR29hbHM6OgkJCUdvYWxzLgotKiBUb29sczo6CQkJVGhlIHRvb2xzLgotKiBIaXN0b3J5OjoJCQlIaXN0b3J5LgotKiBCdWlsZGluZzo6CQkJQnVpbGRpbmcuCi1AZW5kIG1lbnUKLQotQG5vZGUgR29hbHMKLUBzZWN0aW9uIEdvYWxzCi1AY2luZGV4IGdvYWxzCi0KLVRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gaGFzIHR3byBtYWluIGdvYWxzLgotCi1UaGUgZmlyc3QgaXMgdG8gc2ltcGxpZnkgdGhlIGRldmVsb3BtZW50IG9mIHBvcnRhYmxlIHByb2dyYW1zLiAgVGhlCi1zeXN0ZW0gcGVybWl0cyB0aGUgZGV2ZWxvcGVyIHRvIGNvbmNlbnRyYXRlIG9uIHdyaXRpbmcgdGhlIHByb2dyYW0sCi1zaW1wbGlmeWluZyBtYW55IGRldGFpbHMgb2YgcG9ydGFiaWxpdHkgYWNyb3NzIFVuaXggYW5kIGV2ZW4gV2luZG93cwotc3lzdGVtcywgYW5kIHBlcm1pdHRpbmcgdGhlIGRldmVsb3BlciB0byBkZXNjcmliZSBob3cgdG8gYnVpbGQgdGhlCi1wcm9ncmFtIHVzaW5nIHNpbXBsZSBydWxlcyByYXRoZXIgdGhhbiBjb21wbGV4IE1ha2VmaWxlcy4KLQotVGhlIHNlY29uZCBpcyB0byBzaW1wbGlmeSB0aGUgYnVpbGRpbmcgb2YgcHJvZ3JhbXMgZGlzdHJpYnV0ZWQgYXMgc291cmNlCi1jb2RlLiAgQWxsIHByb2dyYW1zIGFyZSBidWlsdCB1c2luZyBhIHNpbXBsZSwgc3RhbmRhcmRpemVkLCB0d28gc3RlcAotcHJvY2Vzcy4gIFRoZSBwcm9ncmFtIGJ1aWxkZXIgbmVlZCBub3QgaW5zdGFsbCBhbnkgc3BlY2lhbCB0b29scyBpbgotb3JkZXIgdG8gYnVpbGQgdGhlIHByb2dyYW0uCi0KLUBub2RlIFRvb2xzCi1Ac2VjdGlvbiBUb29scwotCi1UaGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIGlzIGNvbXByaXNlZCBvZiBzZXZlcmFsIGRpZmZlcmVudAotdG9vbHMuICBQcm9ncmFtIGRldmVsb3BlcnMgbXVzdCBidWlsZCBhbmQgaW5zdGFsbCBhbGwgb2YgdGhlc2UgdG9vbHMuCi0KLVBlb3BsZSB3aG8ganVzdCB3YW50IHRvIGJ1aWxkIHByb2dyYW1zIGZyb20gZGlzdHJpYnV0ZWQgc291cmNlcyBub3JtYWxseQotZG8gbm90IG5lZWQgYW55IHNwZWNpYWwgdG9vbHMgYmV5b25kIGEgVW5peCBzaGVsbCwgYSBtYWtlIHByb2dyYW0sIGFuZCBhCi1DIGNvbXBpbGVyLgotCi1AdGFibGUgQGFzaXMKLUBpdGVtIGF1dG9jb25mCi1wcm92aWRlcyBhIGdlbmVyYWwgcG9ydGFiaWxpdHkgZnJhbWV3b3JrLCBiYXNlZCBvbiB0ZXN0aW5nIHRoZSBmZWF0dXJlcwotb2YgdGhlIGhvc3Qgc3lzdGVtIGF0IGJ1aWxkIHRpbWUuCi1AaXRlbSBhdXRvbWFrZQotYSBzeXN0ZW0gZm9yIGRlc2NyaWJpbmcgaG93IHRvIGJ1aWxkIGEgcHJvZ3JhbSwgcGVybWl0dGluZyB0aGUgZGV2ZWxvcGVyCi10byB3cml0ZSBhIHNpbXBsaWZpZWQgQGZpbGV7TWFrZWZpbGV9LgotQGl0ZW0gbGlidG9vbAotYSBzdGFuZGFyZGl6ZWQgYXBwcm9hY2ggdG8gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4KLUBpdGVtIGdldHRleHQKLXByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciB0cmFuc2xhdGlvbiBvZiB0ZXh0IG1lc3NhZ2VzIGludG8gb3RoZXIKLWxhbmd1YWdlczsgbm90IHJlYWxseSBkaXNjdXNzZWQgaW4gdGhpcyBkb2N1bWVudC4KLUBpdGVtIG00Ci1hdXRvY29uZiByZXF1aXJlcyB0aGUgR05VIHZlcnNpb24gb2YgbTQ7IHRoZSBzdGFuZGFyZCBVbml4IG00IGRvZXMgbm90Ci1zdWZmaWNlLgotQGl0ZW0gcGVybAotYXV0b21ha2UgcmVxdWlyZXMgcGVybC4KLUBlbmQgdGFibGUKLQotQG5vZGUgSGlzdG9yeQotQHNlY3Rpb24gSGlzdG9yeQotQGNpbmRleCBoaXN0b3J5Ci0KLVRoaXMgaXMgYSB2ZXJ5IGJyaWVmIGFuZCBwcm9iYWJseSBpbmFjY3VyYXRlIGhpc3RvcnkuCi0KLUFzIHRoZSBudW1iZXIgb2YgVW5peCB2YXJpYW50cyBpbmNyZWFzZWQgZHVyaW5nIHRoZSAxOTgwcywgaXQgYmVjYW1lCi1oYXJkZXIgdG8gd3JpdGUgcHJvZ3JhbXMgd2hpY2ggY291bGQgcnVuIG9uIGFsbCB2YXJpYW50cy4gIFdoaWxlIGl0IHdhcwotb2Z0ZW4gcG9zc2libGUgdG8gdXNlIEBjb2RleyNpZmRlZn0gdG8gaWRlbnRpZnkgcGFydGljdWxhciBzeXN0ZW1zLAotZGV2ZWxvcGVycyBmcmVxdWVudGx5IGRpZCBub3QgaGF2ZSBhY2Nlc3MgdG8gZXZlcnkgc3lzdGVtLCBhbmQgdGhlCi1jaGFyYWN0ZXJpc3RpY3Mgb2Ygc29tZSBzeXN0ZW1zIGNoYW5nZWQgZnJvbSB2ZXJzaW9uIHRvIHZlcnNpb24uCi0KLUJ5IDE5OTIsIGF0IGxlYXN0IHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzIGhhZCBiZWVuIGRldmVsb3BlZDoKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgTWV0YWNvbmZpZyBwcm9ncmFtLCBieSBMYXJyeSBXYWxsLCBIYXJsYW4gU3Rlbm4sIGFuZCBSYXBoYWVsCi1NYW5mcmVkaS4KLUBpdGVtCi1UaGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQsIGJ5IEsuIFJpY2hhcmQgUGl4bGV5LCBhbmQgdGhlIGdjYyBjb25maWd1cmUKLXNjcmlwdCwgYnkgUmljaGFyZCBTdGFsbG1hbi4gIFRoZXNlIHVzZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcHByb2FjaCwKLWFuZCB0aGUgZGV2ZWxvcGVycyBjb21tdW5pY2F0ZWQgcmVndWxhcmx5LgotQGl0ZW0KLVRoZSBhdXRvY29uZiBwcm9ncmFtLCBieSBEYXZpZCBNYWNLZW56aWUuCi1AZW5kIGl0ZW1pemUKLQotVGhlIE1ldGFjb25maWcgcHJvZ3JhbSBpcyBzdGlsbCB1c2VkIGZvciBQZXJsIGFuZCBhIGZldyBvdGhlciBwcm9ncmFtcy4KLUl0IGlzIHBhcnQgb2YgdGhlIERpc3QgcGFja2FnZS4gIEkgZG8gbm90IGtub3cgaWYgaXQgaXMgYmVpbmcgZGV2ZWxvcGVkLgotCi1JbiAxOTk0LCBEYXZpZCBNYWNLZW56aWUgYW5kIG90aGVycyBtb2RpZmllZCBhdXRvY29uZiB0byBpbmNvcnBvcmF0ZSBhbGwKLXRoZSBmZWF0dXJlcyBvZiBDeWdudXMgY29uZmlndXJlLiAgU2luY2UgdGhlbiwgdGhlcmUgaGFzIGJlZW4gYSBzbG93IGJ1dAotc3RlYWR5IGNvbnZlcnNpb24gb2YgR05VIHByb2dyYW1zIGZyb20gQ3lnbnVzIGNvbmZpZ3VyZSB0byBhdXRvY29uZi4gZ2NjCi1oYXMgYmVlbiBjb252ZXJ0ZWQsIGVsaW1pbmF0aW5nIHRoZSBnY2MgY29uZmlndXJlIHNjcmlwdC4KLQotR05VIGF1dG9jb25mIHdhcyByZWd1bGFybHkgbWFpbnRhaW5lZCB1bnRpbCBsYXRlIDE5OTYuICBBcyBvZiB0aGlzCi13cml0aW5nIGluIEp1bmUsIDE5OTgsIGl0IGhhcyBubyBwdWJsaWMgbWFpbnRhaW5lci4KLQotTW9zdCBwcm9ncmFtcyBhcmUgYnVpbHQgdXNpbmcgdGhlIG1ha2UgcHJvZ3JhbSwgd2hpY2ggcmVxdWlyZXMgdGhlCi1kZXZlbG9wZXIgdG8gd3JpdGUgTWFrZWZpbGVzIGRlc2NyaWJpbmcgaG93IHRvIGJ1aWxkIHRoZSBwcm9ncmFtcy4KLVNpbmNlIG1vc3QgcHJvZ3JhbXMgYXJlIGJ1aWx0IGluIHByZXR0eSBtdWNoIHRoZSBzYW1lIHdheSwgdGhpcyBsZWQgdG8gYQotbG90IG9mIGR1cGxpY2F0aW9uLgotCi1UaGUgWCBXaW5kb3cgc3lzdGVtIGlzIGJ1aWx0IHVzaW5nIHRoZSBpbWFrZSB0b29sLCB3aGljaCB1c2VzIGEgZGF0YWJhc2UKLW9mIHJ1bGVzIHRvIGVsaW1pbmF0ZSB0aGUgZHVwbGljYXRpb24uICBIb3dldmVyLCBidWlsZGluZyBhIHRvb2wgd2hpY2gKLXdhcyBkZXZlbG9wZWQgdXNpbmcgaW1ha2UgcmVxdWlyZXMgdGhhdCB0aGUgYnVpbGRlciBoYXZlIGltYWtlCi1pbnN0YWxsZWQsIHZpb2xhdGluZyBvbmUgb2YgdGhlIGdvYWxzIG9mIHRoZSBHTlUgc3lzdGVtLgotCi1UaGUgbmV3IEJTRCBtYWtlIHByb3ZpZGVzIGEgc3RhbmRhcmQgbGlicmFyeSBvZiBNYWtlZmlsZSBmcmFnbWVudHMsCi13aGljaCBwZXJtaXRzIGRldmVsb3BlcnMgdG8gd3JpdGUgdmVyeSBzaW1wbGUgTWFrZWZpbGVzLiAgSG93ZXZlciwgdGhpcwotcmVxdWlyZXMgdGhhdCB0aGUgYnVpbGRlciBpbnN0YWxsIHRoZSBuZXcgQlNEIG1ha2UgcHJvZ3JhbS4KLQotSW4gMTk5NCwgRGF2aWQgTWFjS2VuemllIHdyb3RlIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIGF1dG9tYWtlLCB3aGljaAotcGVybWl0dGVkIHdyaXRpbmcgYSBzaW1wbGUgYnVpbGQgZGVzY3JpcHRpb24gd2hpY2ggd2FzIGNvbnZlcnRlZCBpbnRvIGEKLU1ha2VmaWxlIHdoaWNoIGNvdWxkIGJlIHVzZWQgYnkgdGhlIHN0YW5kYXJkIG1ha2UgcHJvZ3JhbS4gIEluIDE5OTUsIFRvbQotVHJvbWV5IGNvbXBsZXRlbHkgcmV3cm90ZSBhdXRvbWFrZSBpbiBQZXJsLCBhbmQgaGUgY29udGludWVzIHRvIGVuaGFuY2UKLWl0LgotCi1WYXJpb3VzIGZyZWUgcGFja2FnZXMgYnVpbHQgbGlicmFyaWVzLCBhbmQgYnkgYXJvdW5kIDE5OTUgc2V2ZXJhbAotaW5jbHVkZWQgc3VwcG9ydCB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLgotSG93ZXZlciwgdGhlcmUgd2FzIG5vIGNvbnNpc3RlbnQgYXBwcm9hY2guICBJbiBlYXJseSAxOTk2LCBHb3Jkb24KLU1hdHppZ2tlaXQgYmVnYW4gd29ya2luZyBvbiBsaWJ0b29sLCB3aGljaCBwcm92aWRlZCBhIHN0YW5kYXJkaXplZAotYXBwcm9hY2ggdG8gYnVpbGRpbmcgc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgd2FzIGludGVncmF0ZWQgaW50bwotYXV0b21ha2UgZnJvbSB0aGUgc3RhcnQuCi0KLVRoZSBkZXZlbG9wbWVudCBvZiBhdXRvbWFrZSBhbmQgbGlidG9vbCB3YXMgZHJpdmVuIGJ5IHRoZSBHTklUUyBwcm9qZWN0LAotYSBncm91cCBvZiBHTlUgbWFpbnRhaW5lcnMgd2hvIGRlc2lnbmVkIHN0YW5kYXJkaXplZCB0b29scyB0byBoZWxwIG1lZXQKLXRoZSBHTlUgY29kaW5nIHN0YW5kYXJkcy4KLQotQG5vZGUgQnVpbGRpbmcKLUBzZWN0aW9uIEJ1aWxkaW5nCi0KLU1vc3QgcmVhZGVycyBvZiB0aGlzIGRvY3VtZW50IHNob3VsZCBhbHJlYWR5IGtub3cgaG93IHRvIGJ1aWxkIGEgdG9vbCBieQotcnVubmluZyBAc2FtcHtjb25maWd1cmV9IGFuZCBAc2FtcHttYWtlfS4gIFRoaXMgc2VjdGlvbiBtYXkgc2VydmUgYXMgYQotcXVpY2sgaW50cm9kdWN0aW9uIG9yIHJlbWluZGVyLgotCi1CdWlsZGluZyBhIHRvb2wgaXMgbm9ybWFsbHkgYXMgc2ltcGxlIGFzIHJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfQotZm9sbG93ZWQgYnkgQHNhbXB7bWFrZX0uICBZb3Ugc2hvdWxkIG5vcm1hbGx5IHJ1biBAc2FtcHtjb25maWd1cmV9IGZyb20KLWFuIGVtcHR5IGRpcmVjdG9yeSwgdXNpbmcgc29tZSBwYXRoIHRvIHJlZmVyIHRvIHRoZSBAc2FtcHtjb25maWd1cmV9Ci1zY3JpcHQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBUaGUgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBydW4KLUBzYW1we2NvbmZpZ3VyZX0gaXMgY2FsbGVkIHRoZSBAZGZue29iamVjdCBkaXJlY3Rvcnl9LgotCi1JbiBvcmRlciB0byB1c2UgYSBvYmplY3QgZGlyZWN0b3J5IHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzb3VyY2UKLWRpcmVjdG9yeSwgeW91IG11c3QgYmUgdXNpbmcgdGhlIEdOVSB2ZXJzaW9uIG9mIEBzYW1we21ha2V9LCB3aGljaCBoYXMKLXRoZSByZXF1aXJlZCBAc2FtcHtWUEFUSH0gc3VwcG9ydC4gIERlc3BpdGUgdGhpcyByZXN0cmljdGlvbiwgdXNpbmcgYQotZGlmZmVyZW50IG9iamVjdCBkaXJlY3RvcnkgaXMgaGlnaGx5IHJlY29tbWVuZGVkOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUl0IGtlZXBzIHRoZSBmaWxlcyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBidWlsZCBmcm9tIGNsdXR0ZXJpbmcgdXAgeW91cgotc291cmNlcy4KLUBpdGVtIAotSXQgcGVybWl0cyB5b3UgdG8gcmVtb3ZlIHRoZSBidWlsdCBmaWxlcyBieSBzaW1wbHkgcmVtb3ZpbmcgdGhlIGVudGlyZQotYnVpbGQgZGlyZWN0b3J5LgotQGl0ZW0KLUl0IHBlcm1pdHMgeW91IHRvIGJ1aWxkIGZyb20gdGhlIHNhbWUgc291cmNlcyB3aXRoIHNldmVyYWwgc2V0cyBvZgotY29uZmlndXJlIG9wdGlvbnMgc2ltdWx0YW5lb3VzbHkuCi1AZW5kIGl0ZW1pemUKLQotSWYgeW91IGRvbid0IGhhdmUgR05VIEBzYW1we21ha2V9LCB5b3Ugd2lsbCBoYXZlIHRvIHJ1biBAc2FtcHtjb25maWd1cmV9Ci1pbiB0aGUgc291cmNlIGRpcmVjdG9yeS4gIEFsbCBHTlUgcGFja2FnZXMgc2hvdWxkIHN1cHBvcnQgdGhpczsgaW4KLXBhcnRpY3VsYXIsIEdOVSBwYWNrYWdlcyBzaG91bGQgbm90IGFzc3VtZSB0aGUgcHJlc2VuY2Ugb2YgR05VCi1Ac2FtcHttYWtlfS4KLQotQWZ0ZXIgcnVubmluZyBAc2FtcHtjb25maWd1cmV9LCB5b3UgY2FuIGJ1aWxkIHRoZSB0b29scyBieSBydW5uaW5nCi1Ac2FtcHttYWtlfS4KLQotVG8gaW5zdGFsbCB0aGUgdG9vbHMsIHJ1biBAc2FtcHttYWtlIGluc3RhbGx9LiAgSW5zdGFsbGluZyB0aGUgdG9vbHMKLXdpbGwgY29weSB0aGUgcHJvZ3JhbXMgYW5kIGFueSByZXF1aXJlZCBzdXBwb3J0IGZpbGVzIHRvIHRoZQotQGRmbntpbnN0YWxsYXRpb24gZGlyZWN0b3J5fS4gIFRoZSBsb2NhdGlvbiBvZiB0aGUgaW5zdGFsbGF0aW9uCi1kaXJlY3RvcnkgaXMgY29udHJvbGxlZCBieSBAc2FtcHtjb25maWd1cmV9IG9wdGlvbnMsIGFzIGRlc2NyaWJlZCBiZWxvdy4KLQotSW4gdGhlIEN5Z251cyB0cmVlIGF0IHByZXNlbnQsIHRoZSBpbmZvIGZpbGVzIGFyZSBidWlsdCBhbmQgaW5zdGFsbGVkIGFzCi1hIHNlcGFyYXRlIHN0ZXAuICBUbyBidWlsZCB0aGVtLCBydW4gQHNhbXB7bWFrZSBpbmZvfS4gIFRvIGluc3RhbGwgdGhlbSwKLXJ1biBAc2FtcHttYWtlIGluc3RhbGwtaW5mb30uCi0KLUFsbCBAc2FtcHtjb25maWd1cmV9IHNjcmlwdHMgc3VwcG9ydCBhIHdpZGUgdmFyaWV0eSBvZiBvcHRpb25zLiAgVGhlCi1tb3N0IGludGVyZXN0aW5nIG9uZXMgYXJlIEBzYW1wey0td2l0aH0gYW5kIEBzYW1wey0tZW5hYmxlfSBvcHRpb25zCi13aGljaCBhcmUgZ2VuZXJhbGx5IHNwZWNpZmljIHRvIHBhcnRpY3VsYXIgdG9vbHMuICBZb3UgY2FuIHVzdWFsbHkgdXNlCi10aGUgQHNhbXB7LS1oZWxwfSBvcHRpb24gdG8gZ2V0IGEgbGlzdCBvZiBpbnRlcmVzdGluZyBvcHRpb25zIGZvciBhCi1wYXJ0aWN1bGFyIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLVRoZSBvbmx5IGdlbmVyaWMgb3B0aW9ucyB5b3UgYXJlIGxpa2VseSB0byB1c2UgYXJlIHRoZSBAc2FtcHstLXByZWZpeH0KLWFuZCBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb25zLiAgVGhlc2Ugb3B0aW9ucyBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZQotaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLQotVGhlIGRpcmVjdG9yeSBuYW1lZCBieSB0aGUgQHNhbXB7LS1wcmVmaXh9IG9wdGlvbiB3aWxsIGhvbGQgbWFjaGluZQotaW5kZXBlbmRlbnQgZmlsZXMgc3VjaCBhcyBpbmZvIGZpbGVzLgotCi1UaGUgZGlyZWN0b3J5IG5hbWVkIGJ5IHRoZSBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb24sIHdoaWNoIGlzCi1ub3JtYWxseSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgQHNhbXB7LS1wcmVmaXh9IGRpcmVjdG9yeSwgd2lsbCBob2xkCi1tYWNoaW5lIGRlcGVuZGVudCBmaWxlcyBzdWNoIGFzIGV4ZWN1dGFibGVzLgotCi1UaGUgZGVmYXVsdCBmb3IgQHNhbXB7LS1wcmVmaXh9IGlzIEBmaWxley91c3IvbG9jYWx9LiAgVGhlIGRlZmF1bHQgZm9yCi1Ac2FtcHstLWV4ZWMtcHJlZml4fSBpcyB0aGUgdmFsdWUgdXNlZCBmb3IgQHNhbXB7LS1wcmVmaXh9LgotCi1UaGUgY29udmVudGlvbiB1c2VkIGluIEN5Z251cyByZWxlYXNlcyBpcyB0byB1c2UgYSBAc2FtcHstLXByZWZpeH0KLW9wdGlvbiBvZiBAZmlsZXsvdXNyL2N5Z251cy9AdmFye3JlbGVhc2V9fSwgd2hlcmUgQHZhcntyZWxlYXNlfSBpcyB0aGUKLW5hbWUgb2YgdGhlIHJlbGVhc2UsIGFuZCB0byB1c2UgYSBAc2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb24gb2YKLUBmaWxley91c3IvY3lnbnVzL0B2YXJ7cmVsZWFzZX0vSC1AdmFye2hvc3R9fSwgd2hlcmUgQHZhcntob3N0fSBpcyB0aGUKLWNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUgaG9zdCBzeXN0ZW0gKEBweHJlZntDb25maWd1cmF0aW9uIE5hbWVzfSkuCi0KLURvIG5vdCB1c2UgZWl0aGVyIHRoZSBzb3VyY2Ugb3IgdGhlIG9iamVjdCBkaXJlY3RvcnkgYXMgdGhlIGluc3RhbGxhdGlvbgotZGlyZWN0b3J5LiAgVGhhdCB3aWxsIGp1c3QgbGVhZCB0byBjb25mdXNpb24uCi0KLUBub2RlIEdldHRpbmcgU3RhcnRlZAotQGNoYXB0ZXIgR2V0dGluZyBTdGFydGVkCi0KLVRvIHN0YXJ0IHVzaW5nIHRoZSBHTlUgY29uZmlndXJlIGFuZCBidWlsZCBzeXN0ZW0gd2l0aCB5b3VyIHNvZnR3YXJlCi1wYWNrYWdlLCB5b3UgbXVzdCB3cml0ZSB0aHJlZSBmaWxlcywgYW5kIHlvdSBtdXN0IHJ1biBzb21lIHRvb2xzIHRvCi1tYW51YWxseSBnZW5lcmF0ZSBhZGRpdGlvbmFsIGZpbGVzLgotCi1AbWVudQotKiBXcml0ZSBjb25maWd1cmUuaW46OgkJV3JpdGUgY29uZmlndXJlLmluLgotKiBXcml0ZSBNYWtlZmlsZS5hbTo6CQlXcml0ZSBNYWtlZmlsZS5hbS4KLSogV3JpdGUgYWNjb25maWcuaDo6CQlXcml0ZSBhY2NvbmZpZy5oLgotKiBHZW5lcmF0ZSBmaWxlczo6CQlHZW5lcmF0ZSBmaWxlcy4KLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGU6OglFeGFtcGxlLgotQGVuZCBtZW51Ci0KLUBub2RlIFdyaXRlIGNvbmZpZ3VyZS5pbgotQHNlY3Rpb24gV3JpdGUgY29uZmlndXJlLmluCi1AY2luZGV4IEBmaWxle2NvbmZpZ3VyZS5pbn0sIHdyaXRpbmcKLQotWW91IG11c3QgZmlyc3Qgd3JpdGUgdGhlIGZpbGUgQGZpbGV7Y29uZmlndXJlLmlufS4gIFRoaXMgaXMgYW4gYXV0b2NvbmYKLWlucHV0IGZpbGUsIGFuZCB0aGUgYXV0b2NvbmYgbWFudWFsIGRlc2NyaWJlcyBpbiBkZXRhaWwgd2hhdCB0aGlzIGZpbGUKLXNob3VsZCBsb29rIGxpa2UuCi0KLVlvdSB3aWxsIHdyaXRlIHRlc3RzIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlIHRvIGNoZWNrIGZvcgotY29uZGl0aW9ucyB0aGF0IG1heSBjaGFuZ2UgZnJvbSBvbmUgc3lzdGVtIHRvIGFub3RoZXIsIHN1Y2ggYXMgdGhlCi1wcmVzZW5jZSBvZiBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlcyBvciBmdW5jdGlvbnMuCi0KLUZvciBleGFtcGxlLCBub3QgYWxsIHN5c3RlbXMgc3VwcG9ydCB0aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbi4KLUlmIHlvdSB3YW50IHRvIHVzZSB0aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbiB3aGVuIGl0IGlzCi1hdmFpbGFibGUsIGFuZCB0byB1c2Ugc29tZSBvdGhlciBmdW5jdGlvbiB3aGVuIGl0IGlzIG5vdCwgeW91IHdvdWxkCi1jaGVjayBmb3IgdGhpcyBieSBwdXR0aW5nIEBzYW1we0FDX0NIRUNLX0ZVTkNTKGdldHRpbWVvZmRheSl9IGluCi1AZmlsZXtjb25maWd1cmUuaW59LgotCi1XaGVuIHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1biBhdCBidWlsZCB0aW1lLCB0aGlzIHdpbGwgYXJyYW5nZSB0bwotZGVmaW5lIHRoZSBwcmVwcm9jZXNzb3IgbWFjcm8gQHNhbXB7SEFWRV9HRVRUSU1FT0ZEQVl9IHRvIHRoZSB2YWx1ZSAxIGlmCi10aGUgQHNhbXB7Z2V0dGltZW9mZGF5fSBmdW5jdGlvbiBpcyBhdmFpbGFibGUsIGFuZCB0byBub3QgZGVmaW5lIHRoZQotbWFjcm8gYXQgYWxsIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgWW91ciBjb2RlIGNhbiB0aGVuIHVzZQotQHNhbXB7I2lmZGVmfSB0byB0ZXN0IHdoZXRoZXIgaXQgaXMgc2FmZSB0byBjYWxsIEBzYW1we2dldHRpbWVvZmRheX0uCi0KLUlmIHlvdSBoYXZlIGFuIGV4aXN0aW5nIGJvZHkgb2YgY29kZSwgdGhlIEBzYW1we2F1dG9zY2FufSBwcm9ncmFtIG1heQotaGVscCBpZGVudGlmeSBwb3RlbnRpYWwgcG9ydGFiaWxpdHkgcHJvYmxlbXMsIGFuZCBoZW5jZSBjb25maWd1cmUgdGVzdHMKLXRoYXQgeW91IHdpbGwgd2FudCB0byB1c2UuCi1AaWZub3RodG1sCi1AeHJlZntJbnZva2luZyBhdXRvc2NhbiwgLCAsIGF1dG9jb25mLCB0aGUgYXV0b2NvbmYgbWFudWFsfS4KLUBlbmQgaWZub3RodG1sCi1AaWZodG1sCi1TZWUgQHVyZWZ7aHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9hdXRvY29uZi9hdXRvY29uZl80Lmh0bWwsIHRoZQotYXV0b3NjYW4gZG9jdW1lbnRhdGlvbn0uCi1AZW5kIGlmaHRtbAotCi1Bbm90aGVyIGhhbmR5IHRvb2wgZm9yIGFuIGV4aXN0aW5nIGJvZHkgb2YgY29kZSBpcyBAc2FtcHtpZm5hbWVzfS4gIFRoaXMKLXdpbGwgc2hvdyB5b3UgYWxsIHRoZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzIHRoYXQgdGhlIGNvZGUgYWxyZWFkeQotdXNlcy4KLUBpZm5vdGh0bWwKLUB4cmVme0ludm9raW5nIGlmbmFtZXMsICwgLCBhdXRvY29uZiwgdGhlIGF1dG9jb25mIG1hbnVhbH0uCi1AZW5kIGlmbm90aHRtbAotQGlmaHRtbAotU2VlIEB1cmVme2h0dHA6Ly93d3cuZGVsb3JpZS5jb20vZ251L2RvY3MvYXV0b2NvbmYvYXV0b2NvbmZfNS5odG1sLCB0aGUKLWlmbmFtZXMgZG9jdW1lbnRhdGlvbn0uCi1AZW5kIGlmaHRtbAotCi1CZXNpZGVzIHRoZSBwb3J0YWJpbGl0eSB0ZXN0cyB3aGljaCBhcmUgc3BlY2lmaWMgdG8geW91ciBwYXJ0aWN1bGFyCi1wYWNrYWdlLCBldmVyeSBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZwotbWFjcm9zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIEFDX0lOSVQKLUBjaW5kZXggQHNhbXB7QUNfSU5JVH0KLVRoaXMgbWFjcm8gdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQsIHdoaWNoIGlzIHRoZSBuYW1lIG9mIGEgZmlsZSBpbiB5b3VyCi1wYWNrYWdlLiAgRm9yIGV4YW1wbGUsIEBzYW1we0FDX0lOSVQoZm9vLmMpfS4KLQotQGl0ZW0gQUNfUFJFUkVRKEB2YXJ7VkVSU0lPTn0pCi1AY2luZGV4IEBzYW1we0FDX1BSRVJFUX0KLVRoaXMgbWFjcm8gaXMgb3B0aW9uYWwuICBJdCBtYXkgYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZgotQHNhbXB7YXV0b2NvbmZ9IHRoYXQgeW91IGFyZSB1c2luZy4gIFRoaXMgd2lsbCBwcmV2ZW50IHVzZXJzIGZyb20KLXJ1bm5pbmcgYW4gZWFybGllciB2ZXJzaW9uIG9mIEBzYW1we2F1dG9jb25mfSBhbmQgcGVyaGFwcyBnZXR0aW5nIGFuCi1pbnZhbGlkIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0LiAgRm9yIGV4YW1wbGUsIEBzYW1we0FDX1BSRVJFUSgyLjEyKX0uCi0KLUBpdGVtIEFNX0lOSVRfQVVUT01BS0UKLUBjaW5kZXggQHNhbXB7QU1fSU5JVF9BVVRPTUFLRX0KLVRoaXMgbWFjcm8gdGFrZXMgdHdvIGFyZ3VtZW50czogdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UsIGFuZCBhIHZlcnNpb24KLW51bWJlci4gIEZvciBleGFtcGxlLCBAc2FtcHtBTV9JTklUX0FVVE9NQUtFKGZvbywgMS4wKX0uICAoVGhpcyBtYWNybyBpcwotbm90IG5lZWRlZCBpZiB5b3UgYXJlIG5vdCB1c2luZyBhdXRvbWFrZSkuCi0KLUBpdGVtIEFNX0NPTkZJR19IRUFERVIKLUBjaW5kZXggQHNhbXB7QU1fQ09ORklHX0hFQURFUn0KLVRoaXMgbWFjcm8gbmFtZXMgdGhlIGhlYWRlciBmaWxlIHdoaWNoIHdpbGwgaG9sZCB0aGUgcHJlcHJvY2Vzc29yIG1hY3JvCi1kZWZpbml0aW9ucyBhdCBydW4gdGltZS4gIE5vcm1hbGx5IHRoaXMgc2hvdWxkIGJlIEBmaWxle2NvbmZpZy5ofS4gIFlvdXIKLXNvdXJjZXMgd291bGQgdGhlbiB1c2UgQHNhbXB7I2luY2x1ZGUgImNvbmZpZy5oIn0gdG8gaW5jbHVkZSBpdC4KLQotVGhpcyBtYWNybyBtYXkgb3B0aW9uYWxseSBuYW1lIHRoZSBpbnB1dCBmaWxlIGZvciB0aGF0IGhlYWRlciBmaWxlOyBieQotZGVmYXVsdCwgdGhpcyBpcyBAZmlsZXtjb25maWcuaC5pbn0sIGJ1dCB0aGF0IGZpbGUgbmFtZSB3b3JrcyBwb29ybHkgb24KLURPUyBmaWxlc3lzdGVtcy4gIFRoZXJlZm9yZSwgaXQgaXMgb2Z0ZW4gYmV0dGVyIHRvIG5hbWUgaXQgZXhwbGljaXRseSBhcwotQGZpbGV7Y29uZmlnLmlufS4KLQotVGhpcyBpcyB3aGF0IHlvdSBzaG91bGQgbm9ybWFsbHkgcHV0IGluIEBmaWxle2NvbmZpZ3VyZS5pbn06Ci1AZXhhbXBsZQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi1AZW5kIGV4YW1wbGUKLQotQGNpbmRleCBAc2FtcHtBQ19DT05GSUdfSEVBREVSfQotKElmIHlvdSBhcmUgbm90IHVzaW5nIGF1dG9tYWtlLCB1c2UgQHNhbXB7QUNfQ09ORklHX0hFQURFUn0gcmF0aGVyIHRoYW4KLUBzYW1we0FNX0NPTkZJR19IRUFERVJ9KS4KLQotQGl0ZW0gQU1fTUFJTlRBSU5FUl9NT0RFCi1AY2luZGV4IEBzYW1we0FNX01BSU5UQUlORVJfTU9ERX0KLVRoaXMgbWFjcm8gYWx3YXlzIGFwcGVhcnMgaW4gQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHRzLiAgT3RoZXIgcHJvZ3JhbXMKLW1heSBvciBtYXkgbm90IHVzZSBpdC4KLQotSWYgdGhpcyBtYWNybyBpcyB1c2VkLCB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24gaXMKLXJlcXVpcmVkIHRvIGVuYWJsZSBhdXRvbWF0aWMgcmVidWlsZGluZyBvZiBnZW5lcmF0ZWQgZmlsZXMgdXNlZCBieSB0aGUKLWNvbmZpZ3VyZSBzeXN0ZW0uICBUaGlzIG9mIGNvdXJzZSByZXF1aXJlcyB0aGF0IGRldmVsb3BlcnMgYmUgYXdhcmUgb2YsCi1hbmQgdXNlLCB0aGF0IG9wdGlvbi4KLQotSWYgdGhpcyBtYWNybyBpcyBub3QgdXNlZCwgdGhlbiB0aGUgZ2VuZXJhdGVkIGZpbGVzIHdpbGwgYWx3YXlzIGJlCi1yZWJ1aWx0IGF1dG9tYXRpY2FsbHkuICBUaGlzIHdpbGwgY2F1c2UgcHJvYmxlbXMgaWYgdGhlIHdyb25nIHZlcnNpb25zCi1vZiBhdXRvY29uZiwgYXV0b21ha2UsIG9yIG90aGVycyBhcmUgaW4gdGhlIGJ1aWxkZXIncyBAc2FtcHtQQVRIfS4KLQotKElmIHlvdSBhcmUgbm90IHVzaW5nIGF1dG9tYWtlLCB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgbWFjcm8pLgotCi1AaXRlbSBBQ19FWEVFWFQKLUBjaW5kZXggQHNhbXB7QUNfRVhFRVhUfQotQGNpbmRleCBAc2FtcHtBTV9FWEVFWFR9Ci1FaXRoZXIgdGhpcyBtYWNybyBvciBAc2FtcHtBTV9FWEVFWFR9IGFsd2F5cyBhcHBlYXJzIGluIEN5Z251cyBjb25maWd1cmUKLWZpbGVzLiAgT3RoZXIgcHJvZ3JhbXMgbWF5IG9yIG1heSBub3QgdXNlIG9uZSBvZiB0aGVtLgotCi1UaGlzIG1hY3JvIGxvb2tzIGZvciB0aGUgZXhlY3V0YWJsZSBzdWZmaXggdXNlZCBvbiB0aGUgaG9zdCBzeXN0ZW0uICBPbgotVW5peCBzeXN0ZW1zLCB0aGlzIGlzIHRoZSBlbXB0eSBzdHJpbmcuICBPbiBXaW5kb3dzIHN5c3RlbXMsIHRoaXMgaXMKLUBzYW1wey5leGV9LiAgVGhpcyBtYWNybyBkaXJlY3RzIGF1dG9tYWtlIHRvIHVzZSB0aGUgZXhlY3V0YWJsZSBzdWZmaXgKLWFzIGFwcHJvcHJpYXRlIHdoZW4gY3JlYXRpbmcgcHJvZ3JhbXMuICBUaGlzIG1hY3JvIGRvZXMgbm90IHRha2UgYW55Ci1hcmd1bWVudHMuCi0KLVRoZSBAc2FtcHtBQ19FWEVFWFR9IGZvcm0gaXMgbmV3LCBhbmQgaXMgcGFydCBvZiBhIEN5Z251cyBwYXRjaCB0bwotYXV0b2NvbmYgdG8gc3VwcG9ydCBjb21waWxpbmcgd2l0aCBWaXN1YWwgQysrLiAgT2xkZXIgcHJvZ3JhbXMgdXNlCi1Ac2FtcHtBTV9FWEVFWFR9IGluc3RlYWQuCi0KLShQcm9ncmFtcyB3aGljaCBkbyBub3QgdXNlIGF1dG9tYWtlIHVzZSBuZWl0aGVyIEBzYW1we0FDX0VYRUVYVH0gbm9yCi1Ac2FtcHtBTV9FWEVFWFR9KS4KLQotQGl0ZW0gQUNfUFJPR19DQwotQGNpbmRleCBAc2FtcHtBQ19QUk9HX0NDfQotSWYgeW91IGFyZSB3cml0aW5nIEMgY29kZSwgeW91IHdpbGwgbm9ybWFsbHkgd2FudCB0byB1c2UgdGhpcyBtYWNyby4gIEl0Ci1sb2NhdGVzIHRoZSBDIGNvbXBpbGVyIHRvIHVzZS4gIEl0IGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy4KLQotSG93ZXZlciwgaWYgdGhpcyBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUgaXMgZm9yIGEgbGlicmFyeSB3aGljaCBpcyB0bwotYmUgY29tcGlsZWQgYnkgYSBjcm9zcyBjb21waWxlciB3aGljaCBtYXkgbm90IGZ1bGx5IHdvcmssIHRoZW4geW91IHdpbGwKLW5vdCB3YW50IHRvIHVzZSBAc2FtcHtBQ19QUk9HX0NDfS4gIEluc3RlYWQsIHlvdSB3aWxsIHdhbnQgdG8gdXNlIGEKLXZhcmlhbnQgd2hpY2ggZG9lcyBub3QgY2FsbCB0aGUgbWFjcm8gQHNhbXB7QUNfUFJPR19DQ19XT1JLU30uICBFeGFtcGxlcwotY2FuIGJlIGZvdW5kIGluIHZhcmlvdXMgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlcyBmb3IgbGlicmFyaWVzIHRoYXQgYXJlCi1jb21waWxlZCB3aXRoIGNyb3NzIGNvbXBpbGVycywgc3VjaCBhcyBsaWJpYmVydHkgb3IgbGliZ2xvc3MuICBUaGlzIGlzCi1lc3NlbnRpYWxseSBhIGJ1ZyBpbiBhdXRvY29uZiwgYW5kIHRoZXJlIHdpbGwgcHJvYmFibHkgYmUgYSBiZXR0ZXIKLXdvcmthcm91bmQgYXQgc29tZSBwb2ludC4KLQotQGl0ZW0gQUNfUFJPR19DWFgKLUBjaW5kZXggQHNhbXB7QUNfUFJPR19DWFh9Ci1JZiB5b3UgYXJlIHdyaXRpbmcgQysrIGNvZGUsIHlvdSB3aWxsIHdhbnQgdG8gdXNlIHRoaXMgbWFjcm8uICBJdAotbG9jYXRlcyB0aGUgQysrIGNvbXBpbGVyIHRvIHVzZS4gIEl0IGRvZXMgbm90IHRha2UgYW55IGFyZ3VtZW50cy4gIFRoZQotc2FtZSBjcm9zcyBjb21waWxlciBjb21tZW50cyBhcHBseSBhcyBmb3IgQHNhbXB7QUNfUFJPR19DQ30uCi0KLUBpdGVtIEFNX1BST0dfTElCVE9PTAotQGNpbmRleCBAc2FtcHtBTV9QUk9HX0xJQlRPT0x9Ci1JZiB5b3Ugd2FudCB0byBidWlsZCBsaWJyYXJpZXMsIGFuZCB5b3Ugd2FudCB0byBwZXJtaXQgdGhlbSB0byBiZQotc2hhcmVkLCBvciB5b3Ugd2FudCB0byBsaW5rIGFnYWluc3QgbGlicmFyaWVzIHdoaWNoIHdlcmUgYnVpbHQgdXNpbmcKLWxpYnRvb2wsIHRoZW4geW91IHdpbGwgbmVlZCB0aGlzIG1hY3JvLiAgVGhpcyBtYWNybyBpcyByZXF1aXJlZCBpbiBvcmRlcgotdG8gdXNlIGxpYnRvb2wuCi0KLUBjaW5kZXggQHNhbXB7QU1fRElTQUJMRV9TSEFSRUR9Ci1CeSBkZWZhdWx0LCB0aGlzIHdpbGwgY2F1c2UgYWxsIGxpYnJhcmllcyB0byBiZSBidWlsdCBhcyBzaGFyZWQKLWxpYnJhcmllcy4gIFRvIHByZXZlbnQgdGhpcy0tdG8gY2hhbmdlIHRoZSBkZWZhdWx0LS11c2UKLUBzYW1we0FNX0RJU0FCTEVfU0hBUkVEfSBiZWZvcmUgQHNhbXB7QU1fUFJPR19MSUJUT09MfS4gIFRoZSBjb25maWd1cmUKLW9wdGlvbnMgQHNhbXB7LS1lbmFibGUtc2hhcmVkfSBhbmQgQHNhbXB7LS1kaXNhYmxlLXNoYXJlZH0gbWF5IGJlIHVzZWQKLXRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGF0IGJ1aWxkIHRpbWUuCi0KLUBpdGVtIEFDX0RFRklORShfR05VX1NPVVJDRSkKLUBjaW5kZXggQHNhbXB7X0dOVV9TT1VSQ0V9Ci1HTlUgcGFja2FnZXMgc2hvdWxkIG5vcm1hbGx5IGluY2x1ZGUgdGhpcyBsaW5lIGJlZm9yZSBhbnkgb3RoZXIgZmVhdHVyZQotdGVzdHMuICBUaGlzIGRlZmluZXMgdGhlIG1hY3JvIEBzYW1we19HTlVfU09VUkNFfSB3aGVuIGNvbXBpbGluZywgd2hpY2gKLWRpcmVjdHMgdGhlIGxpYmMgaGVhZGVyIGZpbGVzIHRvIHByb3ZpZGUgdGhlIHN0YW5kYXJkIEdOVSBzeXN0ZW0KLWludGVyZmFjZXMgaW5jbHVkaW5nIGFsbCBHTlUgZXh0ZW5zaW9ucy4gIElmIHRoaXMgbWFjcm8gaXMgbm90IGRlZmluZWQsCi1jZXJ0YWluIEdOVSBleHRlbnNpb25zIG1heSBub3QgYmUgYXZhaWxhYmxlLgotCi1AaXRlbSBBQ19PVVRQVVQKLUBjaW5kZXggQHNhbXB7QUNfT1VUUFVUfQotVGhpcyBtYWNybyB0YWtlcyBhIGxpc3Qgb2YgZmlsZSBuYW1lcyB3aGljaCB0aGUgY29uZmlndXJlIHByb2Nlc3Mgc2hvdWxkCi1wcm9kdWNlLiAgVGhpcyBpcyBub3JtYWxseSBhIGxpc3Qgb2Ygb25lIG9yIG1vcmUgQGZpbGV7TWFrZWZpbGV9IGZpbGVzCi1pbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuICBJZiB5b3VyIHBhY2thZ2UgbGl2ZXMgZW50aXJlbHkgaW4gYSBzaW5nbGUKLWRpcmVjdG9yeSwgeW91IHdvdWxkIHVzZSBzaW1wbHkgQHNhbXB7QUNfT1VUUFVUKE1ha2VmaWxlKX0uICBJZiB5b3UgYWxzbwotaGF2ZSwgZm9yIGV4YW1wbGUsIGEgQGZpbGV7bGlifSBzdWJkaXJlY3RvcnksIHlvdSB3b3VsZCB1c2UKLUBzYW1we0FDX09VVFBVVChNYWtlZmlsZSBsaWIvTWFrZWZpbGUpfS4KLUBlbmQgdGFibGUKLQotSWYgeW91IHdhbnQgdG8gdXNlIGxvY2FsbHkgZGVmaW5lZCBtYWNyb3MgaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59Ci1maWxlLCB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gd3JpdGUgYSBAZmlsZXthY2luY2x1ZGUubTR9IGZpbGUgd2hpY2gKLWRlZmluZXMgdGhlbSAoaWYgbm90IHVzaW5nIGF1dG9tYWtlLCB0aGlzIGZpbGUgaXMgY2FsbGVkCi1AZmlsZXthY2xvY2FsLm00fSkuICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHB1dCBzZXBhcmF0ZSBtYWNyb3MgaW4gYW4KLUBmaWxle200fSBzdWJkaXJlY3RvcnksIGFuZCBwdXQgQHNhbXB7QUNMT0NBTF9BTUZMQUdTID0gLUkgbTR9IGluIHlvdXIKLUBmaWxle01ha2VmaWxlLmFtfSBmaWxlIHNvIHRoYXQgdGhlIEBzYW1we2FjbG9jYWx9IHByb2dyYW0gd2lsbCBiZSBhYmxlCi10byBmaW5kIHRoZW0uCi0KLVRoZSBkaWZmZXJlbnQgbWFjcm8gcHJlZml4ZXMgaW5kaWNhdGUgd2hpY2ggdG9vbCBkZWZpbmVzIHRoZSBtYWNyby4KLU1hY3JvcyB3aGljaCBzdGFydCB3aXRoIEBzYW1we0FDX30gYXJlIHBhcnQgb2YgYXV0b2NvbmYuICBNYWNyb3Mgd2hpY2gKLXN0YXJ0IHdpdGggQHNhbXB7QU1ffSBhcmUgcHJvdmlkZWQgYnkgYXV0b21ha2Ugb3IgbGlidG9vbC4KLQotQG5vZGUgV3JpdGUgTWFrZWZpbGUuYW0KLUBzZWN0aW9uIFdyaXRlIE1ha2VmaWxlLmFtCi1AY2luZGV4IEBmaWxle01ha2VmaWxlLmFtfSwgd3JpdGluZwotCi1Zb3UgbXVzdCB3cml0ZSB0aGUgZmlsZSBAZmlsZXtNYWtlZmlsZS5hbX0uICBUaGlzIGlzIGFuIGF1dG9tYWtlIGlucHV0Ci1maWxlLCBhbmQgdGhlIGF1dG9tYWtlIG1hbnVhbCBkZXNjcmliZXMgaW4gZGV0YWlsIHdoYXQgdGhpcyBmaWxlIHNob3VsZAotbG9vayBsaWtlLgotCi1UaGUgYXV0b21ha2UgY29tbWFuZHMgaW4gQGZpbGV7TWFrZWZpbGUuYW19IG1vc3RseSBsb29rIGxpa2UgdmFyaWFibGUKLWFzc2lnbm1lbnRzIGluIGEgQGZpbGV7TWFrZWZpbGV9LiAgYXV0b21ha2UgcmVjb2duaXplcyBzcGVjaWFsIHZhcmlhYmxlCi1uYW1lcywgYW5kIGF1dG9tYXRpY2FsbHkgYWRkIG1ha2UgcnVsZXMgdG8gdGhlIG91dHB1dCBhcyBuZWVkZWQuCi0KLVRoZXJlIHdpbGwgYmUgb25lIEBmaWxle01ha2VmaWxlLmFtfSBmaWxlIGZvciBlYWNoIGRpcmVjdG9yeSBpbiB5b3VyCi1wYWNrYWdlLiAgRm9yIGVhY2ggZGlyZWN0b3J5IHdpdGggc3ViZGlyZWN0b3JpZXMsIHRoZSBAZmlsZXtNYWtlZmlsZS5hbX0KLWZpbGUgc2hvdWxkIGNvbnRhaW4gdGhlIGxpbmUKLUBzbWFsbGV4YW1wbGUKLVNVQkRJUlMgPSBAdmFye2Rpcn0gQHZhcntkaXJ9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIGVhY2ggQHZhcntkaXJ9IGlzIHRoZSBuYW1lIG9mIGEgc3ViZGlyZWN0b3J5LgotCi1Gb3IgZWFjaCBAZmlsZXtNYWtlZmlsZS5hbX0sIHRoZXJlIHNob3VsZCBiZSBhIGNvcnJlc3BvbmRpbmcKLUBmaWxle01ha2VmaWxlfSBpbiB0aGUgQHNhbXB7QUNfT1VUUFVUfSBtYWNybyBpbiBAZmlsZXtjb25maWd1cmUuaW59LgotCi1FdmVyeSBAZmlsZXtNYWtlZmlsZS5hbX0gd3JpdHRlbiBhdCBDeWdudXMgc2hvdWxkIGNvbnRhaW4gdGhlIGxpbmUKLUBzbWFsbGV4YW1wbGUKLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoaXMgcHV0cyBhdXRvbWFrZSBpbnRvIEN5Z251cyBtb2RlLiAgU2VlIHRoZSBhdXRvbWFrZSBtYW51YWwgZm9yCi1kZXRhaWxzLgotCi1Zb3UgbWF5IHRvIGluY2x1ZGUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIEBzYW1we2F1dG9tYWtlfSB0aGF0IHlvdSBhcmUKLXVzaW5nIG9uIHRoZSBAc2FtcHtBVVRPTUFLRV9PUFRJT05TfSBsaW5lLiAgRm9yIGV4YW1wbGUsCi1Ac21hbGxleGFtcGxlCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzIDEuMwotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB3aWxsIHByZXZlbnQgdXNlcnMgZnJvbSBydW5uaW5nIGFuIGVhcmxpZXIgdmVyc2lvbiBvZgotQHNhbXB7YXV0b21ha2V9IGFuZCBwZXJoYXBzIGdldHRpbmcgYW4gaW52YWxpZCBAZmlsZXtNYWtlZmlsZS5pbn0uCi0KLUlmIHlvdXIgcGFja2FnZSBidWlsZHMgYSBwcm9ncmFtLCB0aGVuIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhhdAotcHJvZ3JhbSBpcyBidWlsdCB5b3Ugd2lsbCBub3JtYWxseSB3YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1iaW5fUFJPR1JBTVMgPSBAdmFye3Byb2dyYW19Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBAdmFye3Byb2dyYW19IGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtLiAgWW91IHdpbGwgdGhlbiB3YW50IGEKLWxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotQHZhcntwcm9ncmFtfV9TT1VSQ0VTID0gQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIGVhY2ggQHZhcntmaWxlfSBpcyB0aGUgbmFtZSBvZiBhIHNvdXJjZSBmaWxlIHRvIGxpbmsgaW50byB0aGUKLXByb2dyYW0gKGUuZy4sIEBzYW1we2Zvby5jfSkuCi0KLUlmIHlvdXIgcGFja2FnZSBidWlsZHMgYSBsaWJyYXJ5LCBhbmQgeW91IGRvIG5vdCB3YW50IHRoZSBsaWJyYXJ5IHRvCi1ldmVyIGJlIGJ1aWx0IGFzIGEgc2hhcmVkIGxpYnJhcnksIHRoZW4gaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGF0Ci1saWJyYXJ5IGlzIGJ1aWx0IHlvdSB3aWxsIG5vcm1hbGx5IHdhbnQgYSBsaW5lIGxpa2UKLUBzbWFsbGV4YW1wbGUKLWxpYl9MSUJSQVJJRVMgPSBsaWJAdmFye25hbWV9LmEKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdoZXJlIEBzYW1we2xpYkB2YXJ7bmFtZX0uYX0gaXMgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkuICBZb3Ugd2lsbCB0aGVuCi13YW50IGEgbGluZSBsaWtlCi1Ac21hbGxleGFtcGxlCi1saWJAdmFye25hbWV9X2FfU09VUkNFUyA9IEB2YXJ7ZmlsZX0gQHZhcntmaWxlfSBAZG90c3t9Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci13aGVyZSBlYWNoIEB2YXJ7ZmlsZX0gaXMgdGhlIG5hbWUgb2YgYSBzb3VyY2UgZmlsZSB0byBhZGQgdG8gdGhlCi1saWJyYXJ5LgotCi1JZiB5b3VyIHBhY2thZ2UgYnVpbGRzIGEgbGlicmFyeSwgYW5kIHlvdSB3YW50IHRvIHBlcm1pdCBidWlsZGluZyB0aGUKLWxpYnJhcnkgYXMgYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBpbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoYXQgbGlicmFyeSBpcwotYnVpbHQgeW91IHdpbGwgbm9ybWFsbHkgd2FudCBhIGxpbmUgbGlrZQotQHNtYWxsZXhhbXBsZQotbGliX0xUTElCUkFSSUVTID0gbGliQHZhcntuYW1lfS5sYQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB1c2Ugb2YgQHNhbXB7TFRMSUJSQVJJRVN9LCBhbmQgdGhlIEBzYW1wey5sYX0gZXh0ZW5zaW9uLCBpbmRpY2F0ZSBhCi1saWJyYXJ5IHRvIGJlIGJ1aWx0IHVzaW5nIGxpYnRvb2wuICBBcyB1c3VhbCwgeW91IHdpbGwgdGhlbiB3YW50IGEgbGluZQotbGlrZQotQHNtYWxsZXhhbXBsZQotbGliQHZhcntuYW1lfV9sYV9TT1VSQ0VTID0gQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBzdHJpbmdzIEBzYW1we2Jpbn0gYW5kIEBzYW1we2xpYn0gdGhhdCBhcHBlYXIgYWJvdmUgaW4KLUBzYW1we2Jpbl9QUk9HUkFNU30gYW5kIEBzYW1we2xpYl9MSUJSQVJJRVN9IGFyZSBub3QgYXJiaXRyYXJ5LiAgVGhleQotcmVmZXIgdG8gcGFydGljdWxhciBkaXJlY3Rvcmllcywgd2hpY2ggbWF5IGJlIHNldCBieSB0aGUgQHNhbXB7LS1iaW5kaXJ9Ci1hbmQgQHNhbXB7LS1saWJkaXJ9IG9wdGlvbnMgdG8gQGZpbGV7Y29uZmlndXJlfS4gIElmIHRob3NlIG9wdGlvbnMgYXJlCi1ub3QgdXNlZCwgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgQHNhbXB7LS1wcmVmaXh9IG9yCi1Ac2FtcHstLWV4ZWMtcHJlZml4fSBvcHRpb25zIHRvIEBmaWxle2NvbmZpZ3VyZX0uICBJdCBpcyBwb3NzaWJsZSB0byB1c2UKLW90aGVyIG5hbWVzIGlmIHRoZSBwcm9ncmFtIG9yIGxpYnJhcnkgc2hvdWxkIGJlIGluc3RhbGxlZCBpbiBzb21lIG90aGVyCi1kaXJlY3RvcnkuCi0KLVRoZSBAZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBtYXkgYWxzbyBjb250YWluIGFsbW9zdCBhbnl0aGluZyB0aGF0IG1heQotYXBwZWFyIGluIGEgbm9ybWFsIEBmaWxle01ha2VmaWxlfS4gIGF1dG9tYWtlIGFsc28gc3VwcG9ydHMgbWFueSBvdGhlcgotc3BlY2lhbCB2YXJpYWJsZXMsIGFzIHdlbGwgYXMgY29uZGl0aW9uYWxzLgotCi1TZWUgdGhlIGF1dG9tYWtlIG1hbnVhbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotQG5vZGUgV3JpdGUgYWNjb25maWcuaAotQHNlY3Rpb24gV3JpdGUgYWNjb25maWcuaAotQGNpbmRleCBAZmlsZXthY2NvbmZpZy5ofSwgd3JpdGluZwotCi1JZiB5b3UgYXJlIGdlbmVyYXRpbmcgYSBwb3J0YWJpbGl0eSBoZWFkZXIgZmlsZSwgKGkuZS4sIHlvdSBhcmUgdXNpbmcKLUBzYW1we0FNX0NPTkZJR19IRUFERVJ9IGluIEBmaWxle2NvbmZpZ3VyZS5pbn0pLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8KLXdyaXRlIGEgQGZpbGV7YWNjb25maWcuaH0gZmlsZS4gIEl0IHdpbGwgaGF2ZSB0byBjb250YWluIHRoZSBmb2xsb3dpbmcKLWxpbmVzLgotCi1Ac21hbGxleGFtcGxlCi0vKiBOYW1lIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBvZiBwYWNrYWdlLiAgKi8KLSN1bmRlZiBWRVJTSU9OCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHJlcXVpcmVtZW50IGlzIHJlYWxseSBhIGJ1ZyBpbiB0aGUgc3lzdGVtLCBhbmQgdGhlIHJlcXVpcmVtZW50IG1heQotYmUgZWxpbWluYXRlZCBhdCBzb21lIGxhdGVyIGRhdGUuCi0KLVRoZSBAZmlsZXthY2NvbmZpZy5ofSBmaWxlIHdpbGwgYWxzbyBzaW1pbGFyIGNvbW1lbnQgYW5kIEBzYW1weyN1bmRlZn0KLWxpbmVzIGZvciBhbnkgdW51c3VhbCBtYWNyb3MgaW4gdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSwgaW5jbHVkaW5nCi1hbnkgbWFjcm8gd2hpY2ggYXBwZWFycyBpbiBhIEBzYW1we0FDX0RFRklORX0gbWFjcm8uCi0KLUluIHBhcnRpY3VsYXIsIGlmIHlvdSBhcmUgd3JpdGluZyBhIEdOVSBwYWNrYWdlIGFuZCB0aGVyZWZvcmUgaW5jbHVkZQotQHNhbXB7QUNfREVGSU5FKF9HTlVfU09VUkNFKX0gaW4gQGZpbGV7Y29uZmlndXJlLmlufSBhcyBzdWdnZXN0ZWQgYWJvdmUsCi15b3Ugd2lsbCBuZWVkIGxpbmVzIGxpa2UgdGhpcyBpbiBAZmlsZXthY2NvbmZpZy5ofToKLUBzbWFsbGV4YW1wbGUKLS8qIEVuYWJsZSBHTlUgZXh0ZW5zaW9ucy4gICovCi0jdW5kZWYgX0dOVV9TT1VSQ0UKLUBlbmQgc21hbGxleGFtcGxlCi0KLU5vcm1hbGx5IHRoZSBAc2FtcHthdXRvaGVhZGVyfSBwcm9ncmFtIHdpbGwgaW5mb3JtIHlvdSBvZiBhbnkgc3VjaAotcmVxdWlyZW1lbnRzIGJ5IHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBpdCBpcyBydW4uICBIb3dldmVyLCBpZgoteW91IGRvIGFueXRoaW5nIHBhcnRpY3VsYXIgb2RkIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCB5b3UKLXdpbGwgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmlnaHQgZW50cmllcyBhcHBlYXIgaW4KLUBmaWxle2FjY29uZmlnLmh9LCBzaW5jZSBvdGhlcndpc2UgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIG1heSBub3QgYmUKLWF2YWlsYWJsZSBpbiB0aGUgQGZpbGV7Y29uZmlnLmh9IGZpbGUgd2hpY2ggeW91ciBjb2RlIHdpbGwgdXNlLgotCi0oVGhlZSBAc2FtcHtQQUNLQUdFfSBhbmQgQHNhbXB7VkVSU0lPTn0gbGluZXMgYXJlIG5vdCByZXF1aXJlZCBpZiB5b3UKLWFyZSBub3QgdXNpbmcgYXV0b21ha2UsIGFuZCBpbiB0aGF0IGNhc2UgeW91IG1heSBub3QgbmVlZCBhCi1AZmlsZXthY2NvbmZpZy5ofSBmaWxlIGF0IGFsbCkuCi0KLUBub2RlIEdlbmVyYXRlIGZpbGVzCi1Ac2VjdGlvbiBHZW5lcmF0ZSBmaWxlcwotCi1PbmNlIHlvdSBoYXZlIHdyaXR0ZW4gQGZpbGV7Y29uZmlndXJlLmlufSwgQGZpbGV7TWFrZWZpbGUuYW19LAotQGZpbGV7YWNjb25maWcuaH0sIGFuZCBwb3NzaWJseSBAZmlsZXthY2luY2x1ZGUubTR9LCB5b3UgbXVzdCB1c2UKLWF1dG9jb25mIGFuZCBhdXRvbWFrZSBwcm9ncmFtcyB0byBwcm9kdWNlIHRoZSBmaXJzdCB2ZXJzaW9ucyBvZiB0aGUKLWdlbmVyYXRlZCBmaWxlcy4gIFRoaXMgaXMgZG9uZSBieSBleGVjdXRpbmcgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBvZgotY29tbWFuZHMuCi0KLUBzbWFsbGV4YW1wbGUKLWFjbG9jYWwKLWF1dG9jb25mCi1hdXRvaGVhZGVyCi1hdXRvbWFrZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEBzYW1we2FjbG9jYWx9IGFuZCBAc2FtcHthdXRvbWFrZX0gY29tbWFuZHMgYXJlIHBhcnQgb2YgdGhlIGF1dG9tYWtlCi1wYWNrYWdlLCBhbmQgdGhlIEBzYW1we2F1dG9jb25mfSBhbmQgQHNhbXB7YXV0b2hlYWRlcn0gY29tbWFuZHMgYXJlIHBhcnQKLW9mIHRoZSBhdXRvY29uZiBwYWNrYWdlLgotCi1JZiB5b3UgYXJlIHVzaW5nIGEgQGZpbGV7bTR9IHN1YmRpcmVjdG9yeSBmb3IgeW91ciBtYWNyb3MsIHlvdSB3aWxsIG5lZWQKLXRvIHVzZSB0aGUgQHNhbXB7LUkgbTR9IG9wdGlvbiB3aGVuIHlvdSBydW4gQHNhbXB7YWNsb2NhbH0uCi0KLUlmIHlvdSBhcmUgbm90IHVzaW5nIHRoZSBDeWdudXMgdHJlZSwgdXNlIHRoZSBAc2FtcHstYX0gb3B0aW9uIHdoZW4KLXJ1bm5pbmcgQHNhbXB7YXV0b21ha2V9IGNvbW1hbmQgaW4gb3JkZXIgdG8gY29weSB0aGUgcmVxdWlyZWQgc3VwcG9ydAotZmlsZXMgaW50byB5b3VyIHNvdXJjZSBkaXJlY3RvcnkuCi0KLUlmIHlvdSBhcmUgdXNpbmcgbGlidG9vbCwgeW91IG11c3QgYnVpbGQgYW5kIGluc3RhbGwgdGhlIGxpYnRvb2wgcGFja2FnZQotd2l0aCB0aGUgc2FtZSBAc2FtcHstLXByZWZpeH0gYW5kIEBzYW1wey0tZXhlYy1wcmVmaXh9IG9wdGlvbnMgYXMgeW91Ci11c2VkIHdpdGggdGhlIGF1dG9jb25mIGFuZCBhdXRvbWFrZSBwYWNrYWdlcy4gIFlvdSBtdXN0IGRvIHRoaXMgYmVmb3JlCi1ydW5uaW5nIGFueSBvZiB0aGUgYWJvdmUgY29tbWFuZHMuICBJZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgQ3lnbnVzCi10cmVlLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biB0aGUgQHNhbXB7bGlidG9vbGl6ZX0gcHJvZ3JhbSB0byBjb3B5IHRoZQotbGlidG9vbCBzdXBwb3J0IGZpbGVzIGludG8geW91ciBkaXJlY3RvcnkuCi0KLU9uY2UgeW91IGhhdmUgbWFuYWdlZCB0byBydW4gdGhlc2UgY29tbWFuZHMgd2l0aG91dCBnZXR0aW5nIGFueSBlcnJvcnMsCi15b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBlbXB0eSBkaXJlY3RvcnksIGFuZCBydW4gdGhlIEBzYW1we2NvbmZpZ3VyZX0KLXNjcmlwdCB3aGljaCB3aWxsIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IEBzYW1we2F1dG9jb25mfSB3aXRoIHRoZQotQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfSBvcHRpb24uICBUaGlzIHdpbGwgZ2l2ZSB5b3UgYSBzZXQgb2YKLU1ha2VmaWxlcyB3aGljaCB3aWxsIGluY2x1ZGUgcnVsZXMgdG8gYXV0b21hdGljYWxseSByZWJ1aWxkIGFsbCB0aGUKLWdlbmVyYXRlZCBmaWxlcy4KLQotQWZ0ZXIgZG9pbmcgdGhhdCwgd2hlbmV2ZXIgeW91IGhhdmUgY2hhbmdlZCBzb21lIG9mIHRoZSBpbnB1dCBmaWxlcyBhbmQKLXdhbnQgdG8gcmVnZW5lcmF0ZWQgdGhlIG90aGVyIGZpbGVzLCBnbyB0byB5b3VyIG9iamVjdCBkaXJlY3RvcnkgYW5kIHJ1bgotQHNhbXB7bWFrZX0uICBEb2luZyB0aGlzIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB0cnlpbmcgdG8gcmVidWlsZCB0aGUKLWZpbGVzIG1hbnVhbGx5LCBiZWNhdXNlIHRoZXJlIGFyZSBjb21wbGV4IG9yZGVyIGRlcGVuZGVuY2llcyBhbmQgaXQgaXMKLWVhc3kgdG8gZm9yZ2V0IHNvbWV0aGluZy4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUKLUBzZWN0aW9uIEV4YW1wbGUKLQotTGV0J3MgY29uc2lkZXIgYSB0cml2aWFsIGV4YW1wbGUuCi0KLVN1cHBvc2Ugd2Ugd2FudCB0byB3cml0ZSBhIHNpbXBsZSB2ZXJzaW9uIG9mIEBzYW1we3RvdWNofS4gIE91ciBwcm9ncmFtLAotd2hpY2ggd2Ugd2lsbCBjYWxsIEBzYW1we3Bva2V9LCB3aWxsIHRha2UgYSBzaW5nbGUgZmlsZSBuYW1lIGFyZ3VtZW50LAotYW5kIHVzZSB0aGUgQHNhbXB7dXRpbWV9IHN5c3RlbSBjYWxsIHRvIHNldCB0aGUgbW9kaWZpY2F0aW9uIGFuZCBhY2Nlc3MKLXRpbWVzIG9mIHRoZSBmaWxlIHRvIHRoZSBjdXJyZW50IHRpbWUuICBXZSB3YW50IHRoaXMgcHJvZ3JhbSB0byBiZQotaGlnaGx5IHBvcnRhYmxlLgotCi1XZSdsbCBmaXJzdCBzZWUgd2hhdCB0aGlzIGxvb2tzIGxpa2Ugd2l0aG91dCB1c2luZyBhdXRvY29uZiBhbmQKLWF1dG9tYWtlLCBhbmQgdGhlbiBzZWUgd2hhdCBpdCBsb29rcyBsaWtlIHdpdGggdGhlbS4KLQotQG1lbnUKLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMTo6CQlGaXJzdCBUcnkuCi0qIEdldHRpbmcgU3RhcnRlZCBFeGFtcGxlIDI6OgkJU2Vjb25kIFRyeS4KLSogR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMzo6CQlUaGlyZCBUcnkuCi0qIEdlbmVyYXRlIEZpbGVzIGluIEV4YW1wbGU6OgkJR2VuZXJhdGUgRmlsZXMuCi1AZW5kIG1lbnUKLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMQotQHN1YnNlY3Rpb24gRmlyc3QgVHJ5Ci0KLUhlcmUgaXMgb3VyIGZpcnN0IHRyeSBhdCBAc2FtcHtwb2tlLmN9LiAgTm90ZSB0aGF0IHdlJ3ZlIHdyaXR0ZW4gaXQKLXdpdGhvdXQgQU5TSS9JU08gQyBwcm90b3R5cGVzLCBzaW5jZSB3ZSB3YW50IGl0IHRvIGJlIGhpZ2hseSBwb3J0YWJsZS4KLQotQGV4YW1wbGUKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aW1lLmg+Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotQHsKLSAgaWYgKGFyZ2MgIT0gMikKLSAgICBAewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6IHBva2UgZmlsZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICBAfQotCi0gIGlmICh1dGltZSAoYXJndlsxXSwgTlVMTCkgPCAwKQotICAgIEB7Ci0gICAgICBwZXJyb3IgKCJ1dGltZSIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBleGl0ICgwKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotV2UgYWxzbyB3cml0ZSBhIHNpbXBsZSBAZmlsZXtNYWtlZmlsZX0uCi0KLUBleGFtcGxlCi1DQyA9IGdjYwotQ0ZMQUdTID0gLWcgLU8yCi0KLWFsbDogcG9rZQotCi1wb2tlOiBwb2tlLm8KLQkkKENDKSAtbyBwb2tlICQoQ0ZMQUdTKSAkKExERkxBR1MpIHBva2UubwotQGVuZCBleGFtcGxlCi0KLVNvIGZhciwgc28gZ29vZC4KLQotVW5mb3J0dW5hdGVseSwgdGhlcmUgYXJlIGEgZmV3IHByb2JsZW1zLgotCi1PbiBvbGRlciBVbml4IHN5c3RlbXMgZGVyaXZlZCBmcm9tIEJTRCA0LjMsIHRoZSBAc2FtcHt1dGltZX0gc3lzdGVtIGNhbGwKLWRvZXMgbm90IGFjY2VwdCBhIHNlY29uZCBhcmd1bWVudCBvZiBAc2FtcHtOVUxMfS4gIE9uIHRob3NlIHN5c3RlbXMsIHdlCi1uZWVkIHRvIHBhc3MgYSBwb2ludGVyIHRvIEBzYW1we3N0cnVjdCB1dGltYnVmfSBzdHJ1Y3R1cmUuCi1VbmZvcnR1bmF0ZWx5LCBldmVuIG9sZGVyIHN5c3RlbXMgZG9uJ3QgZGVmaW5lIHRoYXQgc3RydWN0dXJlOyBvbiB0aG9zZQotc3lzdGVtcywgd2UgbmVlZCB0byBwYXNzIGFuIGFycmF5IG9mIHR3byBAc2FtcHtsb25nfSB2YWx1ZXMuCi0KLVRoZSBoZWFkZXIgZmlsZSBAZmlsZXtzdGRsaWIuaH0gd2FzIGludmVudGVkIGJ5IEFOU0kgQywgYW5kIG9sZGVyCi1zeXN0ZW1zIGRvbid0IGhhdmUgYSBjb3B5LiAgV2UgaW5jbHVkZWQgaXQgYWJvdmUgdG8gZ2V0IGEgZGVjbGFyYXRpb24gb2YKLUBzYW1we2V4aXR9LgotCi1XZSBjYW4gZmluZCBzb21lIG9mIHRoZXNlIHBvcnRhYmlsaXR5IHByb2JsZW1zIGJ5IHJ1bm5pbmcKLUBzYW1we2F1dG9zY2FufSwgd2hpY2ggd2lsbCBjcmVhdGUgYSBAZmlsZXtjb25maWd1cmUuc2Nhbn0gZmlsZSB3aGljaCB3ZQotY2FuIHVzZSBhcyBhIHByb3RvdHlwZSBmb3Igb3VyIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZS4gIEkgd29uJ3Qgc2hvdwotdGhlIG91dHB1dCwgYnV0IGl0IHdpbGwgbm90aWNlIHRoZSBwb3RlbnRpYWwgcHJvYmxlbXMgd2l0aCBAc2FtcHt1dGltZX0KLWFuZCBAZmlsZXtzdGRsaWIuaH0uCi0KLUluIG91ciBAZmlsZXtNYWtlZmlsZX0sIHdlIGRvbid0IHByb3ZpZGUgYW55IHdheSB0byBpbnN0YWxsIHRoZSBwcm9ncmFtLgotVGhpcyBkb2Vzbid0IG1hdHRlciBtdWNoIGZvciBzdWNoIGEgc2ltcGxlIGV4YW1wbGUsIGJ1dCBhIHJlYWwgcHJvZ3JhbQotd2lsbCBuZWVkIGFuIEBzYW1we2luc3RhbGx9IHRhcmdldC4gIEZvciB0aGF0IG1hdHRlciwgd2Ugd2lsbCBhbHNvIHdhbnQKLWEgQHNhbXB7Y2xlYW59IHRhcmdldC4KLQotQG5vZGUgR2V0dGluZyBTdGFydGVkIEV4YW1wbGUgMgotQHN1YnNlY3Rpb24gU2Vjb25kIFRyeQotCi1IZXJlIGlzIG91ciBzZWNvbmQgdHJ5IGF0IHRoaXMgcHJvZ3JhbS4KLQotV2UgbW9kaWZ5IEBmaWxle3Bva2UuY30gdG8gdXNlIHByZXByb2Nlc3NvciBtYWNyb3MgdG8gY29udHJvbCB3aGF0Ci1mZWF0dXJlcyBhcmUgYXZhaWxhYmxlLiAgKEkndmUgY2hlYXRlZCBhIGJpdCBieSB1c2luZyB0aGUgc2FtZSBtYWNybwotbmFtZXMgd2hpY2ggYXV0b2NvbmYgd2lsbCB1c2UpLgotCi1AZXhhbXBsZQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpZmRlZiBIQVZFX1VUSU1FX0gKLSNpbmNsdWRlIDx1dGltZS5oPgotI2VuZGlmCi0KLSNpZm5kZWYgSEFWRV9VVElNRV9OVUxMCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZm5kZWYgSEFWRV9TVFJVQ1RfVVRJTUJVRgotCi1zdHJ1Y3QgdXRpbWJ1ZgotQHsKLSAgbG9uZyBhY3RpbWU7Ci0gIGxvbmcgbW9kdGltZTsKLUB9OwotCi0jZW5kaWYKLQotc3RhdGljIGludAotdXRpbWVfbm93IChmaWxlKQotICAgICBjaGFyICpmaWxlOwotQHsKLSAgc3RydWN0IHV0aW1idWYgbm93OwotCi0gIG5vdy5hY3RpbWUgPSBub3cubW9kdGltZSA9IHRpbWUgKE5VTEwpOwotICByZXR1cm4gdXRpbWUgKGZpbGUsICZub3cpOwotQH0KLQotI2RlZmluZSB1dGltZShmLCBwKSB1dGltZV9ub3cgKGYpCi0KLSNlbmRpZiAvKiBIQVZFX1VUSU1FX05VTEwgICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotQHsKLSAgaWYgKGFyZ2MgIT0gMikKLSAgICBAewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6IHBva2UgZmlsZVxuIik7Ci0gICAgICBleGl0ICgxKTsKLSAgICBAfQotCi0gIGlmICh1dGltZSAoYXJndlsxXSwgTlVMTCkgPCAwKQotICAgIEB7Ci0gICAgICBwZXJyb3IgKCJ1dGltZSIpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgQH0KLQotICBleGl0ICgwKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyB0aGUgYXNzb2NpYXRlZCBAZmlsZXtNYWtlZmlsZX0uICBXZSd2ZSBhZGRlZCBzdXBwb3J0IGZvciB0aGUKLXByZXByb2Nlc3NvciBmbGFncyB3ZSB1c2UuICBXZSd2ZSBhbHNvIGFkZGVkIEBzYW1we2luc3RhbGx9IGFuZAotQHNhbXB7Y2xlYW59IHRhcmdldHMuCi0KLUBleGFtcGxlCi0jIFNldCB0aGlzIHRvIHlvdXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KLWJpbmRpciA9IC91c3IvbG9jYWwvYmluCi0KLSMgVW5jb21tZW50IHRoaXMgaWYgeW91IGhhdmUgdGhlIHN0YW5kYXJkIEFOU0kvSVNPIEMgaGVhZGVyIGZpbGVzLgotIyBTVERDX0hEUlMgPSAtRFNURENfSEVBREVSUwotCi0jIFVuY29tbWVudCB0aGlzIGlmIHlvdSBoYXZlIHV0aW1lLmguCi0jIFVUSU1FX0ggPSAtREhBVkVfVVRJTUVfSAotCi0jIFVuY29tbWVudCB0aGlzIGlmIHV0aW1lIChGSUxFLCBOVUxMKSB3b3JrcyBvbiB5b3VyIHN5c3RlbS4KLSMgVVRJTUVfTlVMTCA9IC1ESEFWRV9VVElNRV9OVUxMCi0KLSMgVW5jb21tZW50IHRoaXMgaWYgc3RydWN0IHV0aW1idWYgaXMgZGVmaW5lZCBpbiB1dGltZS5oLgotIyBVVElNQlVGID0gLURIQVZFX1NUUlVDVF9VVElNQlVGCi0KLUNDID0gZ2NjCi1DRkxBR1MgPSAtZyAtTzIKLQotQUxMX0NGTEFHUyA9ICQoU1REQ19IRFJTKSAkKFVUSU1FX0gpICQoVVRJTUVfTlVMTCkgJChVVElNQlVGKSAkKENGTEFHUykKLQotYWxsOiBwb2tlCi0KLXBva2U6IHBva2UubwotCSQoQ0MpIC1vIHBva2UgJChBTExfQ0ZMQUdTKSAkKExERkxBR1MpIHBva2UubwotCi0uYy5vOgotCSQoQ0MpIC1jICQoQUxMX0NGTEFHUykgcG9rZS5jCi0KLWluc3RhbGw6IHBva2UKLQljcCBwb2tlICQoYmluZGlyKS9wb2tlCi0KLWNsZWFuOgotCXJtIHBva2UgcG9rZS5vCi1AZW5kIGV4YW1wbGUKLQotU29tZSBwcm9ibGVtcyB3aXRoIHRoaXMgYXBwcm9hY2ggc2hvdWxkIGJlIGNsZWFyLgotCi1Vc2VycyB3aG8gd2FudCB0byBjb21waWxlIHBva2Ugd2lsbCBoYXZlIHRvIGtub3cgaG93IEBzYW1we3V0aW1lfSB3b3Jrcwotb24gdGhlaXIgc3lzdGVtcywgc28gdGhhdCB0aGV5IGNhbiB1bmNvbW1lbnQgdGhlIEBmaWxle01ha2VmaWxlfQotY29ycmVjdGx5LgotCi1UaGUgaW5zdGFsbGF0aW9uIGlzIGRvbmUgdXNpbmcgQHNhbXB7Y3B9LCBidXQgbWFueSBzeXN0ZW1zIGhhdmUgYW4KLUBzYW1we2luc3RhbGx9IHByb2dyYW0gd2hpY2ggbWF5IGJlIHVzZWQsIGFuZCB3aGljaCBzdXBwb3J0cyBvcHRpb25hbAotZmVhdHVyZXMgc3VjaCBhcyBzdHJpcHBpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIG91dCBvZiB0aGUgaW5zdGFsbGVkCi1iaW5hcnkuCi0KLVRoZSB1c2Ugb2YgQGZpbGV7TWFrZWZpbGV9IHZhcmlhYmxlcyBsaWtlIEBzYW1we0NDfSwgQHNhbXB7Q0ZMQUdTfSBhbmQKLUBzYW1we0xERkxBR1N9IGZvbGxvd3MgdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIHN0YW5kYXJkcy4gIFRoaXMgaXMKLWNvbnZlbmllbnQgZm9yIGFsbCBwYWNrYWdlcywgc2luY2UgaXQgcmVkdWNlcyBzdXJwcmlzZXMgZm9yIHVzZXJzLgotSG93ZXZlciwgaXQgaXMgZWFzeSB0byBnZXQgdGhlIGRldGFpbHMgd3JvbmcsIGFuZCB3aW5kIHVwIHdpdGggYQotc2xpZ2h0bHkgbm9uc3RhbmRhcmQgZGlzdHJpYnV0aW9uLgotCi1Abm9kZSBHZXR0aW5nIFN0YXJ0ZWQgRXhhbXBsZSAzCi1Ac3Vic2VjdGlvbiBUaGlyZCBUcnkKLQotRm9yIG91ciB0aGlyZCB0cnkgYXQgdGhpcyBwcm9ncmFtLCB3ZSB3aWxsIHdyaXRlIGEgQGZpbGV7Y29uZmlndXJlLmlufQotc2NyaXB0IHRvIGRpc2NvdmVyIHRoZSBjb25maWd1cmF0aW9uIGZlYXR1cmVzIG9uIHRoZSBob3N0IHN5c3RlbSwgcmF0aGVyCi10aGFuIHJlcXVpcmluZyB0aGUgdXNlciB0byBlZGl0IHRoZSBAZmlsZXtNYWtlZmlsZX0uICBXZSB3aWxsIGFsc28gd3JpdGUKLWEgQGZpbGV7TWFrZWZpbGUuYW19IHJhdGhlciB0aGFuIGEgQGZpbGV7TWFrZWZpbGV9LgotCi1UaGUgb25seSBjaGFuZ2UgdG8gQGZpbGV7cG9rZS5jfSBpcyB0byBhZGQgYSBsaW5lIGF0IHRoZSBzdGFydCBvZiB0aGUKLWZpbGU6Ci1Ac21hbGxleGFtcGxlCi0jaW5jbHVkZSAiY29uZmlnLmgiCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgbmV3IEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBpcyBhcyBmb2xsb3dzLgotCi1AZXhhbXBsZQotQUNfSU5JVChwb2tlLmMpCi1BTV9JTklUX0FVVE9NQUtFKHBva2UsIDEuMCkKLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotQUNfUFJPR19DQwotQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlModXRpbWUuaCkKLUFDX0VHUkVQX0hFQURFUih1dGltYnVmLCB1dGltZS5oLCBBQ19ERUZJTkUoSEFWRV9TVFJVQ1RfVVRJTUJVRikpCi1BQ19GVU5DX1VUSU1FX05VTEwKLUFDX09VVFBVVChNYWtlZmlsZSkKLUBlbmQgZXhhbXBsZQotCi1UaGUgZmlyc3QgZm91ciBtYWNyb3MgaW4gdGhpcyBmaWxlLCBhbmQgdGhlIGxhc3Qgb25lLCB3ZXJlIGRlc2NyaWJlZAotYWJvdmU7IHNlZSBAcmVme1dyaXRlIGNvbmZpZ3VyZS5pbn0uICBJZiB3ZSBvbWl0IHRoZXNlIG1hY3JvcywgdGhlbiB3aGVuCi13ZSBydW4gQHNhbXB7YXV0b21ha2V9IHdlIHdpbGwgZ2V0IGEgcmVtaW5kZXIgdGhhdCB3ZSBuZWVkIHRoZW0uCi0KLVRoZSBvdGhlciBtYWNyb3MgYXJlIHN0YW5kYXJkIGF1dG9jb25mIG1hY3Jvcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBBQ19IRUFERVJfU1REQwotQ2hlY2sgZm9yIHN0YW5kYXJkIEMgaGVhZGVycy4KLUBpdGVtIEFDX0NIRUNLX0hFQURFUlMKLUNoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlIGV4aXN0cy4KLUBpdGVtIEFDX0VHUkVQX0hFQURFUgotQ2hlY2sgZm9yIGEgcGFydGljdWxhciBzdHJpbmcgaW4gYSBwYXJ0aWN1bGFyIGhlYWRlciBmaWxlLCBpbiB0aGlzIGNhc2UKLWNoZWNraW5nIGZvciBAc2FtcHt1dGltYnVmfSBpbiBAZmlsZXt1dGltZS5ofS4KLUBpdGVtIEFDX0ZVTkNfVVRJTUVfTlVMTAotQ2hlY2sgd2hldGhlciBAc2FtcHt1dGltZX0gYWNjZXB0cyBhIE5VTEwgc2Vjb25kIGFyZ3VtZW50IHRvIHNldCB0aGUKLWZpbGUgY2hhbmdlIHRpbWUgdG8gdGhlIGN1cnJlbnQgdGltZS4KLUBlbmQgdGFibGUKLQotU2VlIHRoZSBhdXRvY29uZiBtYW51YWwgZm9yIGEgbW9yZSBjb21wbGV0ZSBkZXNjcmlwdGlvbi4KLQotVGhlIG5ldyBAZmlsZXtNYWtlZmlsZS5hbX0gZmlsZSBpcyBhcyBmb2xsb3dzLiAgTm90ZSBob3cgc2ltcGxlIHRoaXMgaXMKLWNvbXBhcmVkIHRvIG91ciBlYXJsaWVyIEBmaWxle01ha2VmaWxlfS4KLQotQGV4YW1wbGUKLWJpbl9QUk9HUkFNUyA9IHBva2UKLQotcG9rZV9TT1VSQ0VTID0gcG9rZS5jCi1AZW5kIGV4YW1wbGUKLQotVGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCBidWlsZCBhIHNpbmdsZSBwcm9ncmFtIG5hbWUgQHNhbXB7cG9rZX0uICBJdAotc2hvdWxkIGJlIGluc3RhbGxlZCBpbiB0aGUgYmluYXJ5IGRpcmVjdG9yeSwgd2hpY2ggd2UgY2FsbGVkCi1Ac2FtcHtiaW5kaXJ9IGVhcmxpZXIuICBUaGUgcHJvZ3JhbSBAc2FtcHtwb2tlfSBpcyBidWlsdCBmcm9tIHRoZSBzb3VyY2UKLWZpbGUgQGZpbGV7cG9rZS5jfS4KLQotV2UgbXVzdCBhbHNvIHdyaXRlIGEgQGZpbGV7YWNjb25maWcuaH0gZmlsZS4gIEJlc2lkZXMgQHNhbXB7UEFDS0FHRX0gYW5kCi1Ac2FtcHtWRVJTSU9OfSwgd2hpY2ggbXVzdCBiZSBtZW50aW9uZWQgZm9yIGFsbCBwYWNrYWdlcyB3aGljaCB1c2UKLWF1dG9tYWtlLCB3ZSBtdXN0IGluY2x1ZGUgQHNhbXB7SEFWRV9TVFJVQ1RfVVRJTUJVRn0sIHNpbmNlIHdlIG1lbnRpb25lZAotaXQgaW4gYW4gQHNhbXB7QUNfREVGSU5FfS4KLQotQGV4YW1wbGUKLS8qIE5hbWUgb2YgcGFja2FnZS4gICovCi0jdW5kZWYgUEFDS0FHRQotCi0vKiBWZXJzaW9uIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogV2hldGhlciB1dGltZS5oIGRlZmluZXMgc3RydWN0IHV0aW1idWYuICAqLwotI3VuZGVmIEhBVkVfU1RSVUNUX1VUSU1CVUYKLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBHZW5lcmF0ZSBGaWxlcyBpbiBFeGFtcGxlCi1Ac3Vic2VjdGlvbiBHZW5lcmF0ZSBGaWxlcwotCi1XZSBtdXN0IG5vdyBnZW5lcmF0ZSB0aGUgb3RoZXIgZmlsZXMsIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMuCi0KLUBzbWFsbGV4YW1wbGUKLWFjbG9jYWwKLWF1dG9jb25mCi1hdXRvaGVhZGVyCi1hdXRvbWFrZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB3ZSBydW4gQHNhbXB7YXV0b2hlYWRlcn0sIGl0IHdpbGwgcmVtaW5kIHVzIG9mIGFueSBtYWNyb3Mgd2UgZm9yZ290Ci10byBhZGQgdG8gQGZpbGV7YWNjb25maWcuaH0uCi0KLVdoZW4gd2UgcnVuIEBzYW1we2F1dG9tYWtlfSwgaXQgd2lsbCB3YW50IHRvIGFkZCBzb21lIGZpbGVzIHRvIG91cgotZGlzdHJpYnV0aW9uLiAgSXQgd2lsbCBhZGQgdGhlbSBhdXRvbWF0aWNhbGx5IGlmIHdlIHVzZSB0aGUKLUBzYW1wey0tYWRkLW1pc3Npbmd9IG9wdGlvbi4KLQotQnkgZGVmYXVsdCwgQHNhbXB7YXV0b21ha2V9IHdpbGwgcnVuIGluIEdOVSBtb2RlLCB3aGljaCBtZWFucyB0aGF0IGl0Ci13aWxsIHdhbnQgdXMgdG8gY3JlYXRlIGNlcnRhaW4gYWRkaXRpb25hbCBmaWxlczsgYXMgb2YgdGhpcyB3cml0aW5nLCBpdAotd2lsbCB3YW50IEBmaWxle05FV1N9LCBAZmlsZXtSRUFETUV9LCBAZmlsZXtBVVRIT1JTfSwgYW5kCi1AZmlsZXtDaGFuZ2VMb2d9LCBhbGwgb2Ygd2hpY2ggYXJlIGZpbGVzIHdoaWNoIHNob3VsZCBhcHBlYXIgaW4gYQotc3RhbmRhcmQgR05VIGRpc3RyaWJ1dGlvbi4gIFdlIGNhbiBlaXRoZXIgYWRkIHRob3NlIGZpbGVzLCBvciBydW4KLUBzYW1we2F1dG9tYWtlfSB3aXRoIHRoZSBAc2FtcHstLWZvcmVpZ259IG9wdGlvbi4KLQotUnVubmluZyB0aGVzZSB0b29scyB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgZmlsZXMsIGFsbCBvZiB3aGljaCBhcmUKLWRlc2NyaWJlZCBpbiB0aGUgbmV4dCBjaGFwdGVyLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQGZpbGV7YWNsb2NhbC5tNH0KLUBpdGVtCi1AZmlsZXtjb25maWd1cmV9Ci1AaXRlbQotQGZpbGV7Y29uZmlnLmlufQotQGl0ZW0KLUBmaWxle01ha2VmaWxlLmlufQotQGl0ZW0KLUBmaWxle3N0YW1wLWguaW59Ci1AZW5kIGl0ZW1pemUKLQotQG5vZGUgRmlsZXMKLUBjaGFwdGVyIEZpbGVzCi0KLUFzIHdhcyBzZWVuIGluIHRoZSBwcmV2aW91cyBjaGFwdGVyLCB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtCi11c2VzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBmaWxlcy4gIFRoZSBkZXZlbG9wZXIgbXVzdCB3cml0ZSBhIGZldyBmaWxlcy4KLVRoZSBvdGhlcnMgYXJlIGdlbmVyYXRlZCBieSB2YXJpb3VzIHRvb2xzLgotCi1UaGUgc3lzdGVtIGlzIHJhdGhlciBmbGV4aWJsZSwgYW5kIGNhbiBiZSB1c2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXMuCi1JbiBkZXNjcmliaW5nIHRoZSBmaWxlcyB0aGF0IGl0IHVzZXMsIEkgd2lsbCBkZXNjcmliZSB0aGUgY29tbW9uIGNhc2UsCi1hbmQgbWVudGlvbiBzb21lIG90aGVyIGNhc2VzIHRoYXQgbWF5IGFyaXNlLgotCi1AbWVudQotKiBEZXZlbG9wZXIgRmlsZXM6OgkJRGV2ZWxvcGVyIEZpbGVzLgotKiBCdWlsZCBGaWxlczo6CQkJQnVpbGQgRmlsZXMuCi0qIFN1cHBvcnQgRmlsZXM6OgkJU3VwcG9ydCBGaWxlcy4KLUBlbmQgbWVudQotCi1Abm9kZSBEZXZlbG9wZXIgRmlsZXMKLUBzZWN0aW9uIERldmVsb3BlciBGaWxlcwotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBmaWxlcyB3cml0dGVuIG9yIGdlbmVyYXRlZCBieSB0aGUgZGV2ZWxvcGVyCi1vZiBhIHBhY2thZ2UuCi0KLUBtZW51Ci0qIERldmVsb3BlciBGaWxlcyBQaWN0dXJlOjoJRGV2ZWxvcGVyIEZpbGVzIFBpY3R1cmUuCi0qIFdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzOjoJV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXMuCi0qIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXM6OglHZW5lcmF0ZWQgRGV2ZWxvcGVyIEZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIERldmVsb3BlciBGaWxlcyBQaWN0dXJlCi1Ac3Vic2VjdGlvbiBEZXZlbG9wZXIgRmlsZXMgUGljdHVyZQotCi1IZXJlIGlzIGEgcGljdHVyZSBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIHdyaXR0ZW4gYnkgdGhlIGRldmVsb3BlciwgdGhlCi1nZW5lcmF0ZWQgZmlsZXMgd2hpY2ggd291bGQgYmUgaW5jbHVkZWQgd2l0aCBhIGNvbXBsZXRlIHNvdXJjZQotZGlzdHJpYnV0aW9uLCBhbmQgdGhlIHRvb2xzIHdoaWNoIGNyZWF0ZSB0aG9zZSBmaWxlcy4KLUBpZmluZm8KLVRoZSBmaWxlIG5hbWVzIGFyZSBwbGFpbiB0ZXh0IGFuZCB0aGUgdG9vbCBuYW1lcyBhcmUgZW5jbG9zZWQgYnkKLUBzYW1weyp9IGNoYXJhY3RlcnMKLUBlbmQgaWZpbmZvCi1AaWZub3RpbmZvCi1UaGUgZmlsZSBuYW1lcyBhcmUgaW4gcmVjdGFuZ2xlcyB3aXRoIHNxdWFyZSBjb3JuZXJzIGFuZCB0aGUgdG9vbCBuYW1lcwotYXJlIGluIHJlY3RhbmdsZXMgd2l0aCByb3VuZGVkIGNvcm5lcnMKLUBlbmQgaWZub3RpbmZvCi0oZS5nLiwgQHNhbXB7YXV0b2hlYWRlcn0gaXMgdGhlIG5hbWUgb2YgYSB0b29sLCBub3QgdGhlIG5hbWUgb2YgYSBmaWxlKS4KLQotQGltYWdle2NvbmZpZ2Rldn0KLQotQG5vZGUgV3JpdHRlbiBEZXZlbG9wZXIgRmlsZXMKLUBzdWJzZWN0aW9uIFdyaXR0ZW4gRGV2ZWxvcGVyIEZpbGVzCi0KLVRoZSBmb2xsb3dpbmcgZmlsZXMgd291bGQgYmUgd3JpdHRlbiBieSB0aGUgZGV2ZWxvcGVyLgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGNvbmZpZ3VyZS5pbgotQGNpbmRleCBAZmlsZXtjb25maWd1cmUuaW59Ci1UaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIHNjcmlwdC4gIFRoaXMgc2NyaXB0IGNvbnRhaW5zIGludm9jYXRpb25zIG9mCi1hdXRvY29uZiBtYWNyb3MuICBJdCBtYXkgYWxzbyBjb250YWluIG9yZGluYXJ5IHNoZWxsIHNjcmlwdCBjb2RlLiAgVGhpcwotZmlsZSB3aWxsIGNvbnRhaW4gZmVhdHVyZSB0ZXN0cyBmb3IgcG9ydGFiaWxpdHkgaXNzdWVzLiAgVGhlIGxhc3QgdGhpbmcKLWluIHRoZSBmaWxlIHdpbGwgbm9ybWFsbHkgYmUgYW4gQHNhbXB7QUNfT1VUUFVUfSBtYWNybyBsaXN0aW5nIHdoaWNoCi1maWxlcyB0byBjcmVhdGUgd2hlbiB0aGUgYnVpbGRlciBydW5zIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgVGhpcyBmaWxlCi1pcyBhbHdheXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgR05VIGNvbmZpZ3VyZSBzeXN0ZW0uICBAeHJlZntXcml0ZQotY29uZmlndXJlLmlufS4KLQotQGl0ZW0gTWFrZWZpbGUuYW0KLUBjaW5kZXggQGZpbGV7TWFrZWZpbGUuYW19Ci1UaGlzIGlzIHRoZSBhdXRvbWFrZSBpbnB1dCBmaWxlLiAgSXQgZGVzY3JpYmVzIGhvdyB0aGUgY29kZSBzaG91bGQgYmUKLWJ1aWx0LiAgSXQgY29uc2lzdHMgb2YgZGVmaW5pdGlvbnMgb2YgYXV0b21ha2UgdmFyaWFibGVzLiAgSXQgbWF5IGFsc28KLWNvbnRhaW4gb3JkaW5hcnkgTWFrZWZpbGUgdGFyZ2V0cy4gIFRoaXMgZmlsZSBpcyBvbmx5IG5lZWRlZCB3aGVuIHVzaW5nCi1hdXRvbWFrZSAobmV3ZXIgdG9vbHMgbm9ybWFsbHkgdXNlIGF1dG9tYWtlLCBidXQgdGhlcmUgYXJlIHN0aWxsIG9sZGVyCi10b29scyB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbnZlcnRlZCwgaW4gd2hpY2ggdGhlIGRldmVsb3BlciB3cml0ZXMKLUBmaWxle01ha2VmaWxlLmlufSBkaXJlY3RseSkuICBAeHJlZntXcml0ZSBNYWtlZmlsZS5hbX0uCi0KLUBpdGVtIGFjY29uZmlnLmgKLUBjaW5kZXggQGZpbGV7YWNjb25maWcuaH0KLVdoZW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY3JlYXRlcyBhIHBvcnRhYmlsaXR5IGhlYWRlciBmaWxlLCBieSB1c2luZwotQHNhbXB7QU1fQ09ORklHX0hFQURFUn0gKG9yLCBpZiBub3QgdXNpbmcgYXV0b21ha2UsCi1Ac2FtcHtBQ19DT05GSUdfSEVBREVSfSksIHRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlc2NyaWJlIG1hY3JvcyB3aGljaCBhcmUKLW5vdCByZWNvZ25pemVkIGJ5IHRoZSBAc2FtcHthdXRvaGVhZGVyfSBjb21tYW5kLiAgVGhpcyBpcyBub3JtYWxseSBhCi1mYWlybHkgdW5pbnRlcmVzdGluZyBmaWxlLCBjb25zaXN0aW5nIG9mIGEgY29sbGVjdGlvbiBvZiBAc2FtcHsjdW5kZWZ9Ci1saW5lcyB3aXRoIGNvbW1lbnRzLiAgTm9ybWFsbHkgYW55IGNhbGwgdG8gQHNhbXB7QUNfREVGSU5FfSBpbgotQGZpbGV7Y29uZmlndXJlLmlufSB3aWxsIHJlcXVpcmUgYSBsaW5lIGluIHRoaXMgZmlsZS4gQHhyZWZ7V3JpdGUKLWFjY29uZmlnLmh9LgotCi1AaXRlbSBhY2luY2x1ZGUubTQKLUBjaW5kZXggQGZpbGV7YWNpbmNsdWRlLm00fQotVGhpcyBmaWxlIGlzIG5vdCBhbHdheXMgcmVxdWlyZWQuICBJdCBkZWZpbmVzIGxvY2FsIGF1dG9jb25mIG1hY3Jvcy4KLVRoZXNlIG1hY3JvcyBtYXkgdGhlbiBiZSB1c2VkIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBJZiB5b3UgZG9uJ3QgbmVlZAotYW55IGxvY2FsIGF1dG9jb25mIG1hY3JvcywgdGhlbiB5b3UgZG9uJ3QgbmVlZCB0aGlzIGZpbGUgYXQgYWxsLiAgSW4KLWZhY3QsIGluIGdlbmVyYWwsIHlvdSBuZXZlciBuZWVkIGxvY2FsIGF1dG9jb25mIG1hY3Jvcywgc2luY2UgeW91IGNhbgotcHV0IGV2ZXJ5dGhpbmcgaW4gQGZpbGV7Y29uZmlndXJlLmlufSwgYnV0IHNvbWV0aW1lcyBhIGxvY2FsIG1hY3JvIGlzCi1jb252ZW5pZW50LgotCi1OZXdlciB0b29scyBtYXkgb21pdCBAZmlsZXthY2luY2x1ZGUubTR9LCBhbmQgaW5zdGVhZCB1c2UgYQotc3ViZGlyZWN0b3J5LCB0eXBpY2FsbHkgbmFtZWQgQGZpbGV7bTR9LCBhbmQgZGVmaW5lCi1Ac2FtcHtBQ0xPQ0FMX0FNRkxBR1MgPSAtSSBtNH0gaW4gQGZpbGV7TWFrZWZpbGUuYW19IHRvIGZvcmNlCi1Ac2FtcHthY2xvY2FsfSB0byBsb29rIHRoZXJlIGZvciBtYWNybyBkZWZpbml0aW9ucy4gIFRoZSBtYWNybwotZGVmaW5pdGlvbnMgYXJlIHRoZW4gcGxhY2VkIGluIHNlcGFyYXRlIGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5LgotCi1UaGUgQGZpbGV7YWNpbmNsdWRlLm00fSBmaWxlIGlzIG9ubHkgdXNlZCB3aGVuIHVzaW5nIGF1dG9tYWtlOyBpbiBvbGRlcgotdG9vbHMsIHRoZSBkZXZlbG9wZXIgd3JpdGVzIEBmaWxle2FjbG9jYWwubTR9IGRpcmVjdGx5LCBpZiBpdCBpcyBuZWVkZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXMKLUBzdWJzZWN0aW9uIEdlbmVyYXRlZCBEZXZlbG9wZXIgRmlsZXMKLQotVGhlIGZvbGxvd2luZyBmaWxlcyB3b3VsZCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGRldmVsb3Blci4KLQotV2hlbiB1c2luZyBhdXRvbWFrZSwgdGhlc2UgZmlsZXMgYXJlIG5vcm1hbGx5IG5vdCBnZW5lcmF0ZWQgbWFudWFsbHkKLWFmdGVyIHRoZSBmaXJzdCB0aW1lLiAgSW5zdGVhZCwgdGhlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gY29udGFpbnMKLXJ1bGVzIHRvIGF1dG9tYXRpY2FsbHkgcmVidWlsZCB0aGUgZmlsZXMgYXMgcmVxdWlyZWQuICBXaGVuCi1Ac2FtcHtBTV9NQUlOVEFJTkVSX01PREV9IGlzIHVzZWQgaW4gQGZpbGV7Y29uZmlndXJlLmlufSAodGhlIG5vcm1hbAotY2FzZSBpbiBDeWdudXMgY29kZSksIHRoZSBhdXRvbWF0aWMgcmVidWlsZGluZyBydWxlcyB3aWxsIG9ubHkgYmUKLWRlZmluZWQgaWYgeW91IGNvbmZpZ3VyZSB1c2luZyB0aGUgQHNhbXB7LS1lbmFibGUtbWFpbnRhaW5lci1tb2RlfQotb3B0aW9uLgotCi1XaGVuIHVzaW5nIGF1dG9tYXRpYyByZWJ1aWxkaW5nLCBpdCBpcyBpbXBvcnRhbnQgdG8gZW5zdXJlIHRoYXQgYWxsIHRoZQotdmFyaW91cyB0b29scyBoYXZlIGJlZW4gYnVpbHQgYW5kIGluc3RhbGxlZCBvbiB5b3VyIEBzYW1we1BBVEh9LiAgVXNpbmcKLWF1dG9tYXRpYyByZWJ1aWxkaW5nIGlzIGhpZ2hseSByZWNvbW1lbmRlZCwgc28gbXVjaCBzbyB0aGF0IEknbSBub3QKLWdvaW5nIHRvIGV4cGxhaW4gd2hhdCB5b3UgaGF2ZSB0byBkbyBpZiB5b3UgZG9uJ3QgdXNlIGl0LgotCi1AdGFibGUgQGZpbGUKLUBpdGVtIGNvbmZpZ3VyZQotQGNpbmRleCBAZmlsZXtjb25maWd1cmV9Ci1UaGlzIGlzIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoaWNoIHdpbGwgYmUgcnVuIHdoZW4gYnVpbGRpbmcgdGhlCi1wYWNrYWdlLiAgVGhpcyBpcyBnZW5lcmF0ZWQgYnkgQHNhbXB7YXV0b2NvbmZ9IGZyb20gQGZpbGV7Y29uZmlndXJlLmlufQotYW5kIEBmaWxle2FjbG9jYWwubTR9LiAgVGhpcyBpcyBhIHNoZWxsIHNjcmlwdC4KLQotQGl0ZW0gTWFrZWZpbGUuaW4KLUBjaW5kZXggQGZpbGV7TWFrZWZpbGUuaW59Ci1UaGlzIGlzIHRoZSBmaWxlIHdoaWNoIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpbGwgdHVybiBpbnRvIHRoZQotQGZpbGV7TWFrZWZpbGV9IGF0IGJ1aWxkIHRpbWUuICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5Ci1Ac2FtcHthdXRvbWFrZX0gZnJvbSBAZmlsZXtNYWtlZmlsZS5hbX0uICBJZiB5b3UgYXJlbid0IHVzaW5nIGF1dG9tYWtlLAoteW91IG11c3Qgd3JpdGUgdGhpcyBmaWxlIHlvdXJzZWxmLiAgVGhpcyBmaWxlIGlzIHByZXR0eSBtdWNoIGEgbm9ybWFsCi1AZmlsZXtNYWtlZmlsZX0sIHdpdGggc29tZSBjb25maWd1cmUgc3Vic3RpdHV0aW9ucyBmb3IgY2VydGFpbgotdmFyaWFibGVzLgotCi1AaXRlbSBhY2xvY2FsLm00Ci1AY2luZGV4IEBmaWxle2FjbG9jYWwubTR9Ci1UaGlzIGZpbGUgaXMgY3JlYXRlZCBieSB0aGUgQHNhbXB7YWNsb2NhbH0gcHJvZ3JhbSwgYmFzZWQgb24gdGhlCi1jb250ZW50cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IGFuZCBAZmlsZXthY2luY2x1ZGUubTR9IChvciwgYXMgbm90ZWQgaW4KLXRoZSBkZXNjcmlwdGlvbiBvZiBAZmlsZXthY2luY2x1ZGUubTR9IGFib3ZlLCBvbiB0aGUgY29udGVudHMgb2YgYW4KLUBmaWxle200fSBzdWJkaXJlY3RvcnkpLiAgVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIGF1dG9jb25mCi1tYWNyb3Mgd2hpY2ggQHNhbXB7YXV0b2NvbmZ9IHdpbGwgdXNlIHdoZW4gZ2VuZXJhdGluZyB0aGUgZmlsZQotQGZpbGV7Y29uZmlndXJlfS4gIFRoZXNlIGF1dG9jb25mIG1hY3JvcyBtYXkgYmUgZGVmaW5lZCBieSB5b3UgaW4KLUBmaWxle2FjaW5jbHVkZS5tNH0gb3IgdGhleSBtYXkgYmUgZGVmaW5lZCBieSBvdGhlciBwYWNrYWdlcyBzdWNoIGFzCi1hdXRvbWFrZSwgbGlidG9vbCBvciBnZXR0ZXh0LiAgSWYgeW91IGFyZW4ndCB1c2luZyBhdXRvbWFrZSwgeW91IHdpbGwKLW5vcm1hbGx5IHdyaXRlIHRoaXMgZmlsZSB5b3Vyc2VsZjsgaW4gdGhhdCBjYXNlLCBpZiBAZmlsZXtjb25maWd1cmUuaW59Ci11c2VzIG9ubHkgc3RhbmRhcmQgYXV0b2NvbmYgbWFjcm9zLCB0aGlzIGZpbGUgd2lsbCBub3QgYmUgbmVlZGVkIGF0IGFsbC4KLQotQGl0ZW0gY29uZmlnLmluCi1AY2luZGV4IEBmaWxle2NvbmZpZy5pbn0KLUBjaW5kZXggQGZpbGV7Y29uZmlnLmguaW59Ci1UaGlzIGZpbGUgaXMgY3JlYXRlZCBieSBAc2FtcHthdXRvaGVhZGVyfSBiYXNlZCBvbiBAZmlsZXthY2NvbmZpZy5ofSBhbmQKLUBmaWxle2NvbmZpZ3VyZS5pbn0uICBBdCBidWlsZCB0aW1lLCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aWxsIGRlZmluZQotc29tZSBvZiB0aGUgbWFjcm9zIGluIGl0IHRvIGNyZWF0ZSBAZmlsZXtjb25maWcuaH0sIHdoaWNoIG1heSB0aGVuIGJlCi1pbmNsdWRlZCBieSB5b3VyIHByb2dyYW0uICBUaGlzIHBlcm1pdHMgeW91ciBDIGNvZGUgdG8gdXNlIHByZXByb2Nlc3NvcgotY29uZGl0aW9uYWxzIHRvIGNoYW5nZSBpdHMgYmVoYXZpb3VyIGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCi1ob3N0IHN5c3RlbS4gIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBjYWxsZWQgQGZpbGV7Y29uZmlnLmguaW59LgotCi1AaXRlbSBzdGFtcC5oLWluCi1AY2luZGV4IEBmaWxle3N0YW1wLWguaW59Ci1UaGlzIHJhdGhlciB1bmludGVyZXN0aW5nIGZpbGUsIHdoaWNoIEkgb21pdHRlZCBmcm9tIHRoZSBwaWN0dXJlLCBpcwotZ2VuZXJhdGVkIGJ5IEBzYW1we2F1dG9tYWtlfS4gIEl0IGFsd2F5cyBjb250YWlucyB0aGUgc3RyaW5nCi1Ac2FtcHt0aW1lc3RhbXB9LiAgSXQgaXMgdXNlZCBhcyBhIHRpbWVzdGFtcCBmaWxlIGluZGljYXRpbmcgd2hldGhlcgotQGZpbGV7Y29uZmlnLmlufSBpcyB1cCB0byBkYXRlLiAgVXNpbmcgYSB0aW1lc3RhbXAgZmlsZSBtZWFucyB0aGF0Ci1AZmlsZXtjb25maWcuaW59IGNhbiBiZSBtYXJrZWQgYXMgdXAgdG8gZGF0ZSB3aXRob3V0IGFjdHVhbGx5IGNoYW5naW5nCi1pdHMgbW9kaWZpY2F0aW9uIHRpbWUuICBUaGlzIGlzIHVzZWZ1bCBzaW5jZSBAZmlsZXtjb25maWcuaW59IGRlcGVuZHMKLXVwb24gQGZpbGV7Y29uZmlndXJlLmlufSwgYnV0IGl0IGlzIGVhc3kgdG8gY2hhbmdlIEBmaWxle2NvbmZpZ3VyZS5pbn0KLWluIGEgd2F5IHdoaWNoIGRvZXMgbm90IGFmZmVjdCBAZmlsZXtjb25maWcuaW59LgotQGVuZCB0YWJsZQotCi1Abm9kZSBCdWlsZCBGaWxlcwotQHNlY3Rpb24gQnVpbGQgRmlsZXMKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZmlsZXMgd2hpY2ggYXJlIGNyZWF0ZWQgYXQgY29uZmlndXJlIGFuZAotYnVpbGQgdGltZS4gIFRoZXNlIGFyZSB0aGUgZmlsZXMgd2hpY2ggc29tZWJvZHkgd2hvIGJ1aWxkcyB0aGUgcGFja2FnZQotd2lsbCBzZWUuCi0KLU9mIGNvdXJzZSwgdGhlIGRldmVsb3BlciB3aWxsIGFsc28gYnVpbGQgdGhlIHBhY2thZ2UuICBUaGUgZGlzdGluY3Rpb24KLWJldHdlZW4gZGV2ZWxvcGVyIGZpbGVzIGFuZCBidWlsZCBmaWxlcyBpcyBub3QgdGhhdCB0aGUgZGV2ZWxvcGVyIGRvZXMKLW5vdCBzZWUgdGhlIGJ1aWxkIGZpbGVzLCBidXQgdGhhdCBzb21lYm9keSB3aG8gb25seSBidWlsZHMgdGhlIHBhY2thZ2UKLWRvZXMgbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGRldmVsb3BlciBmaWxlcy4KLQotQG1lbnUKLSogQnVpbGQgRmlsZXMgUGljdHVyZTo6CQlCdWlsZCBGaWxlcyBQaWN0dXJlLgotKiBCdWlsZCBGaWxlcyBEZXNjcmlwdGlvbjo6CUJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uLgotQGVuZCBtZW51Ci0KLUBub2RlIEJ1aWxkIEZpbGVzIFBpY3R1cmUKLUBzdWJzZWN0aW9uIEJ1aWxkIEZpbGVzIFBpY3R1cmUKLQotSGVyZSBpcyBhIHBpY3R1cmUgb2YgdGhlIGZpbGVzIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBhdCBidWlsZCB0aW1lLgotQGZpbGV7Y29uZmlnLnN0YXR1c30gaXMgYm90aCBhIGNyZWF0ZWQgZmlsZSBhbmQgYSBzaGVsbCBzY3JpcHQgd2hpY2ggaXMKLXJ1biB0byBjcmVhdGUgb3RoZXIgZmlsZXMsIGFuZCB0aGUgcGljdHVyZSBhdHRlbXB0cyB0byBzaG93IHRoYXQuCi0KLUBpbWFnZXtjb25maWdidWlsZH0KLQotQG5vZGUgQnVpbGQgRmlsZXMgRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIEJ1aWxkIEZpbGVzIERlc2NyaXB0aW9uCi0KLVRoaXMgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlsZXMgd2hpY2ggYXJlIGNyZWF0ZWQgYXQgYnVpbGQgdGltZS4KLQotQHRhYmxlIEBmaWxlCi1AaXRlbSBjb25maWcuc3RhdHVzCi1AY2luZGV4IEBmaWxle2NvbmZpZy5zdGF0dXN9Ci1UaGUgZmlyc3Qgc3RlcCBpbiBidWlsZGluZyBhIHBhY2thZ2UgaXMgdG8gcnVuIHRoZSBAZmlsZXtjb25maWd1cmV9Ci1zY3JpcHQuICBUaGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBjcmVhdGUgdGhlIGZpbGUKLUBmaWxle2NvbmZpZy5zdGF0dXN9LCB3aGljaCBpcyBpdHNlbGYgYSBzaGVsbCBzY3JpcHQuICBXaGVuIHlvdSBmaXJzdAotcnVuIEBmaWxle2NvbmZpZ3VyZX0sIGl0IHdpbGwgYXV0b21hdGljYWxseSBydW4gQGZpbGV7Y29uZmlnLnN0YXR1c30uCi1BbiBAZmlsZXtNYWtlZmlsZX0gZGVyaXZlZCBmcm9tIGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZS5pbn0KLXdpbGwgY29udGFpbiBydWxlcyB0byBhdXRvbWF0aWNhbGx5IHJ1biBAZmlsZXtjb25maWcuc3RhdHVzfSBhZ2FpbiB3aGVuCi1uZWNlc3NhcnkgdG8gcmVjcmVhdGUgY2VydGFpbiBmaWxlcyBpZiB0aGVpciBpbnB1dHMgY2hhbmdlLgotCi1AaXRlbSBNYWtlZmlsZQotQGNpbmRleCBAZmlsZXtNYWtlZmlsZX0KLVRoaXMgaXMgdGhlIGZpbGUgd2hpY2ggbWFrZSB3aWxsIHJlYWQgdG8gYnVpbGQgdGhlIHByb2dyYW0uICBUaGUKLUBmaWxle2NvbmZpZy5zdGF0dXN9IHNjcmlwdCB3aWxsIHRyYW5zZm9ybSBAZmlsZXtNYWtlZmlsZS5pbn0gaW50bwotQGZpbGV7TWFrZWZpbGV9LgotCi1AaXRlbSBjb25maWcuaAotQGNpbmRleCBAZmlsZXtjb25maWcuaH0KLVRoaXMgZmlsZSBkZWZpbmVzIEMgcHJlcHJvY2Vzc29yIG1hY3JvcyB3aGljaCBDIGNvZGUgY2FuIHVzZSB0byBhZGp1c3QKLWl0cyBiZWhhdmlvdXIgb24gZGlmZmVyZW50IHN5c3RlbXMuICBUaGUgQGZpbGV7Y29uZmlnLnN0YXR1c30gc2NyaXB0Ci13aWxsIHRyYW5zZm9ybSBAZmlsZXtjb25maWcuaW59IGludG8gQGZpbGV7Y29uZmlnLmh9LgotCi1AaXRlbSBjb25maWcuY2FjaGUKLUBjaW5kZXggQGZpbGV7Y29uZmlnLmNhY2hlfQotVGhpcyBmaWxlIGRpZCBub3QgZml0IG5lYXRseSBpbnRvIHRoZSBwaWN0dXJlLCBhbmQgSSBvbWl0dGVkIGl0LiAgSXQgaXMKLXVzZWQgYnkgdGhlIEBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHRvIGNhY2hlIHJlc3VsdHMgYmV0d2VlbiBydW5zLiAgVGhpcwotY2FuIGJlIGFuIGltcG9ydGFudCBzcGVlZHVwLiAgSWYgeW91IG1vZGlmeSBAZmlsZXtjb25maWd1cmUuaW59IGluIHN1Y2gKLWEgd2F5IHRoYXQgdGhlIHJlc3VsdHMgb2Ygb2xkIHRlc3RzIHNob3VsZCBjaGFuZ2UgKHBlcmhhcHMgeW91IGhhdmUKLWFkZGVkIGEgbmV3IGxpYnJhcnkgdG8gQHNhbXB7TERGTEFHU30pLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gcmVtb3ZlCi1AZmlsZXtjb25maWcuY2FjaGV9IHRvIGZvcmNlIHRoZSB0ZXN0cyB0byBiZSByZXJ1bi4KLQotVGhlIGF1dG9jb25mIG1hbnVhbCBleHBsYWlucyBob3cgdG8gc2V0IHVwIGEgc2l0ZSBzcGVjaWZpYyBjYWNoZSBmaWxlLgotVGhpcyBjYW4gc3BlZWQgdXAgcnVubmluZyBAZmlsZXtjb25maWd1cmV9IHNjcmlwdHMgb24geW91ciBzeXN0ZW0uCi0KLUBpdGVtIHN0YW1wLmgKLUBjaW5kZXggQGZpbGV7c3RhbXAtaH0KLVRoaXMgZmlsZSwgd2hpY2ggSSBvbWl0dGVkIGZyb20gdGhlIHBpY3R1cmUsIGlzIHNpbWlsYXIgdG8KLUBmaWxle3N0YW1wLWguaW59LiAgSXQgaXMgdXNlZCBhcyBhIHRpbWVzdGFtcCBmaWxlIGluZGljYXRpbmcgd2hldGhlcgotQGZpbGV7Y29uZmlnLmh9IGlzIHVwIHRvIGRhdGUuICBUaGlzIGlzIHVzZWZ1bCBzaW5jZSBAZmlsZXtjb25maWcuaH0KLWRlcGVuZHMgdXBvbiBAZmlsZXtjb25maWcuc3RhdHVzfSwgYnV0IGl0IGlzIGVhc3kgZm9yCi1AZmlsZXtjb25maWcuc3RhdHVzfSB0byBjaGFuZ2UgaW4gYSB3YXkgd2hpY2ggZG9lcyBub3QgYWZmZWN0Ci1AZmlsZXtjb25maWcuaH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIFN1cHBvcnQgRmlsZXMKLUBzZWN0aW9uIFN1cHBvcnQgRmlsZXMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSByZXF1aXJlcyBzZXZlcmFsIHN1cHBvcnQgZmlsZXMgdG8gYmUKLWluY2x1ZGVkIHdpdGggeW91ciBkaXN0cmlidXRpb24uICBZb3UgZG8gbm90IG5vcm1hbGx5IG5lZWQgdG8gY29uY2VybgoteW91cnNlbGYgd2l0aCB0aGVzZS4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCBtb3N0IGFyZSBhbHJlYWR5Ci1wcmVzZW50LiAgT3RoZXJ3aXNlLCB0aGV5IHdpbGwgYmUgaW5zdGFsbGVkIHdpdGggeW91ciBzb3VyY2UgYnkKLUBzYW1we2F1dG9tYWtlfSAod2l0aCB0aGUgQHNhbXB7LS1hZGQtbWlzc2luZ30gb3B0aW9uKSBhbmQKLUBzYW1we2xpYnRvb2xpemV9LgotCi1Zb3UgZG9uJ3QgaGF2ZSB0byBwdXQgdGhlIHN1cHBvcnQgZmlsZXMgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuICBZb3UKLWNhbiBwdXQgdGhlbSBpbiBhIHN1YmRpcmVjdG9yeSwgYW5kIHVzZSB0aGUgQHNhbXB7QUNfQ09ORklHX0FVWF9ESVJ9Ci1tYWNybyBpbiBAZmlsZXtjb25maWd1cmUuaW59IHRvIHRlbGwgQHNhbXB7YXV0b21ha2V9IGFuZCB0aGUKLUBmaWxle2NvbmZpZ3VyZX0gc2NyaXB0IHdoZXJlIHRoZXkgYXJlLgotCi1JbiB0aGlzIHNlY3Rpb24sIEkgZGVzY3JpYmUgdGhlIHN1cHBvcnQgZmlsZXMsIHNvIHRoYXQgeW91IGNhbiBrbm93IHdoYXQKLXRoZXkgYXJlIGFuZCB3aHkgdGhleSBhcmUgdGhlcmUuCi0KLUB0YWJsZSBAZmlsZQotQGl0ZW0gQUJPVVQtTkxTCi1BZGRlZCBieSBhdXRvbWFrZSBpZiB5b3UgYXJlIHVzaW5nIGdldHRleHQuICBUaGlzIGlzIGEgZG9jdW1lbnRhdGlvbgotZmlsZSBhYm91dCB0aGUgZ2V0dGV4dCBwcm9qZWN0LgotQGl0ZW0gYW5zaTJrbnIuYwotVXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IGlmIHlvdSBwdXQgQHNhbXB7YW5zaTJrbnJ9Ci1pbiBAc2FtcHtBVVRPTUFLRV9PUFRJT05TfSBpbiBAZmlsZXtNYWtlZmlsZS5hbX0uICBUaGlzIHBlcm1pdHMKLWNvbXBpbGluZyBBTlNJIEMgY29kZSB3aXRoIGEgSyZSIEMgY29tcGlsZXIuCi1AaXRlbSBhbnNpMmtuci4xCi1UaGUgbWFuIHBhZ2Ugd2hpY2ggZ29lcyB3aXRoIEBmaWxle2Fuc2kya25yLmN9LgotQGl0ZW0gY29uZmlnLmd1ZXNzCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBkZXRlcm1pbmVzIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgZm9yIHRoZSBzeXN0ZW0gb24KLXdoaWNoIGl0IGlzIHJ1bi4KLUBpdGVtIGNvbmZpZy5zdWIKLUEgc2hlbGwgc2NyaXB0IHdoaWNoIGNhbm9uaWNhbGl6ZXMgYSBjb25maWd1cmF0aW9uIG5hbWUgZW50ZXJlZCBieSBhCi11c2VyLgotQGl0ZW0gZWxpc3AtY29tcAotVXNlZCB0byBjb21waWxlIEVtYWNzIExJU1AgZmlsZXMuCi1AaXRlbSBpbnN0YWxsLXNoCi1BIHNoZWxsIHNjcmlwdCB3aGljaCBpbnN0YWxscyBhIHByb2dyYW0uICBUaGlzIGlzIHVzZWQgaWYgdGhlIGNvbmZpZ3VyZQotc2NyaXB0IGNhbiBub3QgZmluZCBhbiBpbnN0YWxsIGJpbmFyeS4KLUBpdGVtIGx0Y29uZmlnCi1Vc2VkIGJ5IGxpYnRvb2wuICBUaGlzIGlzIGEgc2hlbGwgc2NyaXB0IHdoaWNoIGNvbmZpZ3VyZXMgbGlidG9vbCBmb3IKLXRoZSBwYXJ0aWN1bGFyIHN5c3RlbSBvbiB3aGljaCBpdCBpcyB1c2VkLgotQGl0ZW0gbHRtYWluLnNoCi1Vc2VkIGJ5IGxpYnRvb2wuICBUaGlzIGlzIHRoZSBhY3R1YWwgbGlidG9vbCBzY3JpcHQgd2hpY2ggaXMgdXNlZCwgYWZ0ZXIKLWl0IGlzIGNvbmZpZ3VyZWQgYnkgQGZpbGV7bHRjb25maWd9IHRvIGJ1aWxkIGEgbGlicmFyeS4KLUBpdGVtIG1kYXRlLXNoCi1BIHNoZWxsIHNjcmlwdCB1c2VkIGJ5IGFuIGF1dG9tYWtlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0gdG8gcHJldHR5Ci1wcmludCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlLiAgVGhpcyBpcyB1c2VkIHRvIG1haW50YWluIHZlcnNpb24KLW51bWJlcnMgZm9yIHRleGluZm8gZmlsZXMuCi1AaXRlbSBtaXNzaW5nCi1BIHNoZWxsIHNjcmlwdCB1c2VkIGlmIHNvbWUgdG9vbCBpcyBtaXNzaW5nIGVudGlyZWx5LiAgVGhpcyBpcyB1c2VkIGJ5Ci1hbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IHRvIGF2b2lkIGNlcnRhaW4gc29ydHMgb2YKLXRpbWVzdGFtcCBwcm9ibGVtcy4KLUBpdGVtIG1raW5zdGFsbGRpcnMKLUEgc2hlbGwgc2NyaXB0IHdoaWNoIGNyZWF0ZXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBhbGwgcGFyZW50Ci1kaXJlY3Rvcmllcy4gIFRoaXMgaXMgdXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9Ci1kdXJpbmcgaW5zdGFsbGF0aW9uLgotQGl0ZW0gdGV4aW5mby50ZXgKLVJlcXVpcmVkIGlmIHlvdSBoYXZlIGFueSB0ZXhpbmZvIGZpbGVzLiAgVGhpcyBpcyB1c2VkIHdoZW4gY29udmVydGluZwotVGV4aW5mbyBmaWxlcyBpbnRvIERWSSB1c2luZyBAc2FtcHt0ZXhpMmR2aX0gYW5kIEBUZVh7fS4KLUBpdGVtIHlsd3JhcAotQSBzaGVsbCBzY3JpcHQgdXNlZCBieSBhbiBhdXRvbWFrZSBnZW5lcmF0ZWQgQGZpbGV7TWFrZWZpbGV9IHRvIHJ1bgotcHJvZ3JhbXMgbGlrZSBAc2FtcHtiaXNvbn0sIEBzYW1we3lhY2N9LCBAc2FtcHtmbGV4fSwgYW5kIEBzYW1we2xleH0uCi1UaGVzZSBwcm9ncmFtcyBkZWZhdWx0IHRvIHByb2R1Y2luZyBvdXRwdXQgZmlsZXMgd2l0aCBhIGZpeGVkIG5hbWUsIGFuZAotdGhlIEBmaWxle3lsd3JhcH0gc2NyaXB0IHJ1bnMgdGhlbSBpbiBhIHN1YmRpcmVjdG9yeSB0byBhdm9pZCBmaWxlIG5hbWUKLWNvbmZsaWN0cyB3aGVuIHVzaW5nIGEgcGFyYWxsZWwgbWFrZSBwcm9ncmFtLgotQGVuZCB0YWJsZQotCi1Abm9kZSBDb25maWd1cmF0aW9uIE5hbWVzCi1AY2hhcHRlciBDb25maWd1cmF0aW9uIE5hbWVzCi1AY2luZGV4IGNvbmZpZ3VyYXRpb24gbmFtZXMKLUBjaW5kZXggY29uZmlndXJhdGlvbiB0cmlwbGV0cwotQGNpbmRleCB0cmlwbGV0cwotQGNpbmRleCBob3N0IG5hbWVzCi1AY2luZGV4IGhvc3QgdHJpcGxldHMKLUBjaW5kZXggY2Fub25pY2FsIHN5c3RlbSBuYW1lcwotQGNpbmRleCBzeXN0ZW0gbmFtZXMKLUBjaW5kZXggc3lzdGVtIHR5cGVzCi0KLVRoZSBHTlUgY29uZmlndXJlIHN5c3RlbSBuYW1lcyBhbGwgc3lzdGVtcyB1c2luZyBhIEBkZm57Y29uZmlndXJhdGlvbgotbmFtZX0uICBBbGwgc3VjaCBuYW1lcyB1c2VkIHRvIGJlIHRyaXBsZXRzICh0aGV5IG1heSBub3cgY29udGFpbiBmb3VyCi1wYXJ0cyBpbiBjZXJ0YWluIGNhc2VzKSwgYW5kIHRoZSB0ZXJtIEBkZm57Y29uZmlndXJhdGlvbiB0cmlwbGV0fSBpcwotc3RpbGwgc2Vlbi4KLQotQG1lbnUKLSogQ29uZmlndXJhdGlvbiBOYW1lIERlZmluaXRpb246OglDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbi4KLSogVXNpbmcgQ29uZmlndXJhdGlvbiBOYW1lczo6CQlVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzLgotQGVuZCBtZW51Ci0KLUBub2RlIENvbmZpZ3VyYXRpb24gTmFtZSBEZWZpbml0aW9uCi1Ac2VjdGlvbiBDb25maWd1cmF0aW9uIE5hbWUgRGVmaW5pdGlvbgotCi1UaGlzIGlzIGEgc3RyaW5nIG9mIHRoZSBmb3JtCi1AdmFye2NwdX0tQHZhcnttYW51ZmFjdHVyZXJ9LUB2YXJ7b3BlcmF0aW5nX3N5c3RlbX0uICBJbiBzb21lIGNhc2VzLAotdGhpcyBpcyBleHRlbmRlZCB0byBhIGZvdXIgcGFydCBmb3JtOgotQHZhcntjcHV9LUB2YXJ7bWFudWZhY3R1cmVyfS1AdmFye2tlcm5lbH0tQHZhcntvcGVyYXRpbmdfc3lzdGVtfS4KLQotV2hlbiB1c2luZyBhIGNvbmZpZ3VyYXRpb24gbmFtZSBpbiBhIGNvbmZpZ3VyZSBvcHRpb24sIGl0IGlzIG5vcm1hbGx5Ci1ub3QgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYW4gZW50aXJlIG5hbWUuICBJbiBwYXJ0aWN1bGFyLCB0aGUKLUB2YXJ7bWFudWZhY3R1cmVyfSBmaWVsZCBpcyBvZnRlbiBvbWl0dGVkLCBsZWFkaW5nIHRvIHN0cmluZ3Mgc3VjaCBhcwotQHNhbXB7aTM4Ni1saW51eH0gb3IgQHNhbXB7c3BhcmMtc3Vub3N9LiAgVGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Y29uZmlnLnN1Yn0gd2lsbCB0cmFuc2xhdGUgdGhlc2Ugc2hvcnRlbmVkIHN0cmluZ3MgaW50byB0aGUKLWNhbm9uaWNhbCBmb3JtLiAgYXV0b2NvbmYgd2lsbCBhcnJhbmdlIGZvciBAZmlsZXtjb25maWcuc3VifSB0byBiZSBydW4KLWF1dG9tYXRpY2FsbHkgd2hlbiBpdCBpcyBuZWVkZWQuCi0KLVRoZSBmaWVsZHMgb2YgYSBjb25maWd1cmF0aW9uIG5hbWUgYXJlIGFzIGZvbGxvd3M6Ci0KLUB0YWJsZSBAdmFyCi1AaXRlbSBjcHUKLVRoZSB0eXBlIG9mIHByb2Nlc3Nvci4gIFRoaXMgaXMgdHlwaWNhbGx5IHNvbWV0aGluZyBsaWtlIEBzYW1we2kzODZ9IG9yCi1Ac2FtcHtzcGFyY30uICBNb3JlIHNwZWNpZmljIHZhcmlhbnRzIGFyZSB1c2VkIGFzIHdlbGwsIHN1Y2ggYXMKLUBzYW1we21pcHNlbH0gdG8gaW5kaWNhdGUgYSBsaXR0bGUgZW5kaWFuIE1JUFMgcHJvY2Vzc29yLgotQGl0ZW0gbWFudWZhY3R1cmVyCi1BIHNvbWV3aGF0IGZyZWVmb3JtIGZpZWxkIHdoaWNoIGluZGljYXRlcyB0aGUgbWFudWZhY3R1cmVyIG9mIHRoZQotc3lzdGVtLiAgVGhpcyBpcyBvZnRlbiBzaW1wbHkgQHNhbXB7dW5rbm93bn0uICBPdGhlciBjb21tb24gc3RyaW5ncyBhcmUKLUBzYW1we3BjfSBmb3IgYW4gSUJNIFBDIGNvbXBhdGlibGUgc3lzdGVtLCBvciB0aGUgbmFtZSBvZiBhIHdvcmtzdGF0aW9uCi12ZW5kb3IsIHN1Y2ggYXMgQHNhbXB7c3VufS4KLUBpdGVtIG9wZXJhdGluZ19zeXN0ZW0KLVRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdoaWNoIGlzIHJ1biBvbiB0aGUgc3lzdGVtLiAgVGhpcyB3aWxsCi1iZSBzb21ldGhpbmcgbGlrZSBAc2FtcHtzb2xhcmlzMi41fSBvciBAc2FtcHtpcml4Ni4zfS4gIFRoZXJlIGlzIG5vCi1wYXJ0aWN1bGFyIHJlc3RyaWN0aW9uIG9uIHRoZSB2ZXJzaW9uIG51bWJlciwgYW5kIHN0cmluZ3MgbGlrZQotQHNhbXB7YWl4NC4xLjQuMH0gYXJlIHNlZW4uICBGb3IgYW4gZW1iZWRkZWQgc3lzdGVtLCB3aGljaCBoYXMgbm8KLW9wZXJhdGluZyBzeXN0ZW0sIHRoaXMgZmllbGQgbm9ybWFsbHkgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIG9iamVjdCBmaWxlCi1mb3JtYXQsIHN1Y2ggYXMgQHNhbXB7ZWxmfSBvciBAc2FtcHtjb2ZmfS4KLUBpdGVtIGtlcm5lbAotVGhpcyBpcyB1c2VkIG1haW5seSBmb3IgR05VL0xpbnV4LiAgQSB0eXBpY2FsIEdOVS9MaW51eCBjb25maWd1cmF0aW9uCi1uYW1lIGlzIEBzYW1we2k1ODYtcGMtbGludXgtZ251bGliYzF9LiAgSW4gdGhpcyBjYXNlIHRoZSBrZXJuZWwsCi1Ac2FtcHtsaW51eH0sIGlzIHNlcGFyYXRlZCBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLCBAc2FtcHtnbnVsaWJjMX0uCi1AZW5kIHRhYmxlCi0KLVRoZSBzaGVsbCBzY3JpcHQgQGZpbGV7Y29uZmlnLmd1ZXNzfSB3aWxsIG5vcm1hbGx5IHByaW50IHRoZSBjb3JyZWN0Ci1jb25maWd1cmF0aW9uIG5hbWUgZm9yIHRoZSBzeXN0ZW0gb24gd2hpY2ggaXQgaXMgcnVuLiAgSXQgZG9lcyBieQotcnVubmluZyBAc2FtcHt1bmFtZX0gYW5kIGJ5IGV4YW1pbmluZyBvdGhlciBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlCi1zeXN0ZW0uCi0KLUJlY2F1c2UgQGZpbGV7Y29uZmlnLmd1ZXNzfSBjYW4gbm9ybWFsbHkgZGV0ZXJtaW5lIHRoZSBjb25maWd1cmF0aW9uCi1uYW1lIGZvciBhIG1hY2hpbmUsIGl0IGlzIG5vcm1hbGx5IG9ubHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYQotY29uZmlndXJhdGlvbiBuYW1lIHdoZW4gYnVpbGRpbmcgYSBjcm9zcy1jb21waWxlciBvciB3aGVuIGJ1aWxkaW5nIHVzaW5nCi1hIGNyb3NzLWNvbXBpbGVyLgotCi1Abm9kZSBVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzCi1Ac2VjdGlvbiBVc2luZyBDb25maWd1cmF0aW9uIE5hbWVzCi0KLUEgY29uZmlndXJlIHNjcmlwdCB3aWxsIHNvbWV0aW1lcyBoYXZlIHRvIG1ha2UgYSBkZWNpc2lvbiBiYXNlZCBvbiBhCi1jb25maWd1cmF0aW9uIG5hbWUuICBZb3Ugd2lsbCBuZWVkIHRvIGRvIHRoaXMgaWYgeW91IGhhdmUgdG8gY29tcGlsZQotY29kZSBkaWZmZXJlbnRseSBiYXNlZCBvbiBzb21ldGhpbmcgd2hpY2ggY2FuIG5vdCBiZSB0ZXN0ZWQgdXNpbmcgYQotc3RhbmRhcmQgYXV0b2NvbmYgZmVhdHVyZSB0ZXN0LgotCi1JdCBpcyBub3JtYWxseSBiZXR0ZXIgdG8gdGVzdCBmb3IgcGFydGljdWxhciBmZWF0dXJlcywgcmF0aGVyIHRoYW4gdG8KLXRlc3QgZm9yIGEgcGFydGljdWxhciBzeXN0ZW0uICBUaGlzIGlzIGJlY2F1c2UgYXMgVW5peCBldm9sdmVzLAotZGlmZmVyZW50IHN5c3RlbXMgY29weSBmZWF0dXJlcyBmcm9tIG9uZSBhbm90aGVyLiAgRXZlbiBpZiB5b3UgbmVlZCB0bwotZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJhc2VkIG9uIGEgY29uZmlndXJhdGlvbgotbmFtZSwgeW91IHNob3VsZCBkZWZpbmUgYSBtYWNybyB3aGljaCBkZXNjcmliZXMgdGhlIGZlYXR1cmUsIHJhdGhlciB0aGFuCi1kZWZpbmluZyBhIG1hY3JvIHdoaWNoIGRlc2NyaWJlcyB0aGUgcGFydGljdWxhciBzeXN0ZW0geW91IGFyZSBvbi4KLQotVGVzdGluZyBmb3IgYSBwYXJ0aWN1bGFyIHN5c3RlbSBpcyBub3JtYWxseSBkb25lIHVzaW5nIGEgY2FzZSBzdGF0ZW1lbnQKLWluIEBmaWxle2NvbmZpZ3VyZS5pbn0uICBUaGUgY2FzZSBzdGF0ZW1lbnQgbWlnaHQgbG9vayBzb21ldGhpbmcgbGlrZQotdGhlIGZvbGxvd2luZywgYXNzdW1pbmcgdGhhdCBAc2FtcHtob3N0fSBpcyBhIHNoZWxsIHZhcmlhYmxlIGhvbGRpbmcgYQotY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZSAod2hpY2ggd2lsbCBiZSB0aGUgY2FzZSBpZgotQGZpbGV7Y29uZmlndXJlLmlufSB1c2VzIHRoZSBAc2FtcHtBQ19DQU5PTklDQUxfSE9TVH0gb3IKLUBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19IG1hY3JvKS4KLQotQHNtYWxsZXhhbXBsZQotY2FzZSAiJEB7aG9zdEB9IiBpbgotaVszNDU2XTg2LSotbGludXgtZ251KikgZG8gc29tZXRoaW5nIDs7Ci1zcGFyYyotc3VuLXNvbGFyaXMyLls1Njc4OV0qKSBkbyBzb21ldGhpbmcgOzsKLXNwYXJjKi1zdW4tc29sYXJpcyopIGRvIHNvbWV0aGluZyA7OwotbWlwcyotKi1lbGYqKSBkbyBzb21ldGhpbmcgOzsKLWVzYWMKLUBlbmQgc21hbGxleGFtcGxlCi0KLUl0IGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgdG8gdXNlIEBzYW1weyp9IGFmdGVyIHRoZSBvcGVyYXRpbmcgc3lzdGVtCi1maWVsZCwgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIHdoaWNoIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5Ci1AZmlsZXtjb25maWcuZ3Vlc3N9LgotCi1JbiBtb3N0IGNhc2VzIHlvdSBtdXN0IGJlIGNhcmVmdWwgdG8gbWF0Y2ggYSByYW5nZSBvZiBwcm9jZXNzb3IgdHlwZXMuCi1Gb3IgbW9zdCBwcm9jZXNzb3IgZmFtaWxpZXMsIGEgdHJhaWxpbmcgQHNhbXB7Kn0gc3VmZmljZXMsIGFzIGluCi1Ac2FtcHttaXBzKn0gYWJvdmUuICBGb3IgdGhlIGkzODYgZmFtaWx5LCBzb21ldGhpbmcgYWxvbmcgdGhlIGxpbmVzIG9mCi1Ac2FtcHtpWzM0NTZdODZ9IHN1ZmZpY2VzIGF0IHByZXNlbnQuICBGb3IgdGhlIG02OGsgZmFtaWx5LCB5b3Ugd2lsbAotbmVlZCBzb21ldGhpbmcgbGlrZSBAc2FtcHttNjgqfS4gIE9mIGNvdXJzZSwgaWYgeW91IGRvIG5vdCBuZWVkIHRvIG1hdGNoCi1vbiB0aGUgcHJvY2Vzc29yLCBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgcmVwbGFjZSB0aGUgZW50aXJlIGZpZWxkIGJ5IGEKLUBzYW1weyp9LCBhcyBpbiBAc2FtcHsqLSotaXJpeCp9LgotCi1Abm9kZSBDcm9zcyBDb21waWxhdGlvbiBUb29scwotQGNoYXB0ZXIgQ3Jvc3MgQ29tcGlsYXRpb24gVG9vbHMKLUBjaW5kZXggY3Jvc3MgdG9vbHMKLQotVGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSBjYW4gYmUgdXNlZCB0byBidWlsZCBAZGZue2Nyb3NzCi1jb21waWxhdGlvbn0gdG9vbHMuICBBIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2wgaXMgYSB0b29sIHdoaWNoIHJ1bnMgb24KLW9uZSBzeXN0ZW0gYW5kIHByb2R1Y2VzIGNvZGUgd2hpY2ggcnVucyBvbiBhbm90aGVyIHN5c3RlbS4KLQotQG1lbnUKLSogQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHM6OgkJQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHMuCi0qIEhvc3QgYW5kIFRhcmdldDo6CQkJSG9zdCBhbmQgVGFyZ2V0LgotKiBVc2luZyB0aGUgSG9zdCBUeXBlOjoJCQlVc2luZyB0aGUgSG9zdCBUeXBlLgotKiBTcGVjaWZ5aW5nIHRoZSBUYXJnZXQ6OiAgICAgICAJU3BlY2lmeWluZyB0aGUgVGFyZ2V0LgotKiBVc2luZyB0aGUgVGFyZ2V0IFR5cGU6OgkJVXNpbmcgdGhlIFRhcmdldCBUeXBlLgotKiBDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWU6OglDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWUKLUBlbmQgbWVudQotCi1Abm9kZSBDcm9zcyBDb21waWxhdGlvbiBDb25jZXB0cwotQHNlY3Rpb24gQ3Jvc3MgQ29tcGlsYXRpb24gQ29uY2VwdHMKLQotQGNpbmRleCBjcm9zcyBjb21waWxlcgotQSBjb21waWxlciB3aGljaCBwcm9kdWNlcyBwcm9ncmFtcyB3aGljaCBydW4gb24gYSBkaWZmZXJlbnQgc3lzdGVtIGlzIGEKLWNyb3NzIGNvbXBpbGF0aW9uIGNvbXBpbGVyLCBvciBzaW1wbHkgYSBAZGZue2Nyb3NzIGNvbXBpbGVyfS4KLVNpbWlsYXJseSwgd2Ugc3BlYWsgb2YgY3Jvc3MgYXNzZW1ibGVycywgY3Jvc3MgbGlua2VycywgZXRjLgotCi1JbiB0aGUgbm9ybWFsIGNhc2UsIGEgY29tcGlsZXIgcHJvZHVjZXMgY29kZSB3aGljaCBydW5zIG9uIHRoZSBzYW1lCi1zeXN0ZW0gYXMgdGhlIG9uZSBvbiB3aGljaCB0aGUgY29tcGlsZXIgcnVucy4gIFdoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvCi1kaXN0aW5ndWlzaCB0aGlzIGNhc2UgZnJvbSB0aGUgY3Jvc3MgY29tcGlsYXRpb24gY2FzZSwgc3VjaCBhIGNvbXBpbGVyCi1pcyBjYWxsZWQgYSBAZGZue25hdGl2ZSBjb21waWxlcn0uICBTaW1pbGFybHksIHdlIHNwZWFrIG9mIG5hdGl2ZQotYXNzZW1ibGVycywgZXRjLgotCi1BbHRob3VnaCB0aGUgZGVidWdnZXIgaXMgbm90IHN0cmljdGx5IHNwZWFraW5nIGEgY29tcGlsYXRpb24gdG9vbCwgaXQgaXMKLW5ldmVydGhlbGVzcyBtZWFuaW5nZnVsIHRvIHNwZWFrIG9mIGEgY3Jvc3MgZGVidWdnZXI6IGEgZGVidWdnZXIgd2hpY2gKLWlzIHVzZWQgdG8gZGVidWcgY29kZSB3aGljaCBydW5zIG9uIGFub3RoZXIgc3lzdGVtLiAgRXZlcnl0aGluZyB0aGF0IGlzCi1zYWlkIGJlbG93IGFib3V0IGNvbmZpZ3VyaW5nIGNyb3NzIGNvbXBpbGF0aW9uIHRvb2xzIGFwcGxpZXMgdG8gdGhlCi1kZWJ1Z2dlciBhcyB3ZWxsLgotCi1Abm9kZSBIb3N0IGFuZCBUYXJnZXQKLUBzZWN0aW9uIEhvc3QgYW5kIFRhcmdldAotQGNpbmRleCBob3N0IHN5c3RlbQotQGNpbmRleCB0YXJnZXQgc3lzdGVtCi0KLVdoZW4gYnVpbGRpbmcgY3Jvc3MgY29tcGlsYXRpb24gdG9vbHMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHN5c3RlbXMKLWludm9sdmVkOiB0aGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1biwgYW5kIHRoZSBzeXN0ZW0gZm9yCi13aGljaCB0aGUgdG9vbHMgZ2VuZXJhdGUgY29kZS4KLQotVGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgd2lsbCBydW4gaXMgY2FsbGVkIHRoZSBAZGZue2hvc3R9IHN5c3RlbS4KLQotVGhlIHN5c3RlbSBmb3Igd2hpY2ggdGhlIHRvb2xzIGdlbmVyYXRlIGNvZGUgaXMgY2FsbGVkIHRoZSBAZGZue3RhcmdldH0KLXN5c3RlbS4KLQotRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgYSBjb21waWxlciB3aGljaCBydW5zIG9uIGEgR05VL0xpbnV4Ci1zeXN0ZW0gYW5kIGdlbmVyYXRlcyBFTEYgcHJvZ3JhbXMgZm9yIGEgTUlQUyBlbWJlZGRlZCBzeXN0ZW0uICBJbiB0aGlzCi1jYXNlIHRoZSBHTlUvTGludXggc3lzdGVtIGlzIHRoZSBob3N0LCBhbmQgdGhlIE1JUFMgRUxGIHN5c3RlbSBpcyB0aGUKLXRhcmdldC4gIFN1Y2ggYSBjb21waWxlciBjb3VsZCBiZSBjYWxsZWQgYSBHTlUvTGludXggY3Jvc3MgTUlQUyBFTEYKLWNvbXBpbGVyLCBvciwgZXF1aXZhbGVudGx5LCBhIEBzYW1we2kzODYtbGludXgtZ251fSBjcm9zcwotQHNhbXB7bWlwcy1lbGZ9IGNvbXBpbGVyLgotCi1OYXR1cmFsbHksIG1vc3QgcHJvZ3JhbXMgYXJlIG5vdCBjcm9zcyBjb21waWxhdGlvbiB0b29scy4gIEZvciB0aG9zZQotcHJvZ3JhbXMsIGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gc3BlYWsgb2YgYSB0YXJnZXQuICBJdCBvbmx5IG1ha2VzCi1zZW5zZSB0byBzcGVhayBvZiBhIHRhcmdldCBmb3IgdG9vbHMgbGlrZSBAc2FtcHtnY2N9IG9yIHRoZQotQHNhbXB7YmludXRpbHN9IHdoaWNoIGFjdHVhbGx5IHByb2R1Y2UgcnVubmluZyBjb2RlLiAgRm9yIGV4YW1wbGUsIGl0Ci1kb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHNwZWFrIG9mIHRoZSB0YXJnZXQgb2YgYSB0b29sIGxpa2UgQHNhbXB7Ymlzb259Ci1vciBAc2FtcHttYWtlfS4KLQotTW9zdCBjcm9zcyBjb21waWxhdGlvbiB0b29scyBjYW4gYWxzbyBzZXJ2ZSBhcyBuYXRpdmUgdG9vbHMuICBGb3IgYQotbmF0aXZlIGNvbXBpbGF0aW9uIHRvb2wsIGl0IGlzIHN0aWxsIG1lYW5pbmdmdWwgdG8gc3BlYWsgb2YgYSB0YXJnZXQuCi1Gb3IgYSBuYXRpdmUgdG9vbCwgdGhlIHRhcmdldCBpcyB0aGUgc2FtZSBhcyB0aGUgaG9zdC4gIEZvciBleGFtcGxlLCBmb3IKLWEgR05VL0xpbnV4IG5hdGl2ZSBjb21waWxlciwgdGhlIGhvc3QgaXMgR05VL0xpbnV4LCBhbmQgdGhlIHRhcmdldCBpcwotYWxzbyBHTlUvTGludXguCi0KLUBub2RlIFVzaW5nIHRoZSBIb3N0IFR5cGUKLUBzZWN0aW9uIFVzaW5nIHRoZSBIb3N0IFR5cGUKLQotSW4gYWxtb3N0IGFsbCBjYXNlcyB0aGUgaG9zdCBzeXN0ZW0gaXMgdGhlIHN5c3RlbSBvbiB3aGljaCB5b3UgcnVuIHRoZQotQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQsIGFuZCBvbiB3aGljaCB5b3UgYnVpbGQgdGhlIHRvb2xzIChmb3IgdGhlIGNhc2UKLXdoZW4gdGhleSBkaWZmZXIsIEBweHJlZntDYW5hZGlhbiBDcm9zc30pLgotCi1AY2luZGV4IEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfQotSWYgeW91ciBjb25maWd1cmUgc2NyaXB0IG5lZWRzIHRvIGtub3cgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZiB0aGUKLWhvc3Qgc3lzdGVtLCBhbmQgdGhlIHBhY2thZ2UgaXMgbm90IGEgY3Jvc3MgY29tcGlsYXRpb24gdG9vbCBhbmQKLXRoZXJlZm9yZSBkb2VzIG5vdCBoYXZlIGEgdGFyZ2V0LCBwdXQgQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9IGluCi1AZmlsZXtjb25maWd1cmUuaW59LiAgVGhpcyBtYWNybyB3aWxsIGFycmFuZ2UgdG8gZGVmaW5lIGEgZmV3IHNoZWxsCi12YXJpYWJsZXMgd2hlbiB0aGUgQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQgaXMgcnVuLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGhvc3QKLVRoZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbiBuYW1lIG9mIHRoZSBob3N0LiAgVGhpcyB3aWxsIG5vcm1hbGx5IGJlCi1kZXRlcm1pbmVkIGJ5IHJ1bm5pbmcgdGhlIEBmaWxle2NvbmZpZy5ndWVzc30gc2hlbGwgc2NyaXB0LCBhbHRob3VnaCB0aGUKLXVzZXIgaXMgcGVybWl0dGVkIHRvIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fQotb3B0aW9uLgotQGl0ZW0gaG9zdF9hbGlhcwotSW4gdGhlIHVudXN1YWwgY2FzZSB0aGF0IHRoZSB1c2VyIHVzZWQgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fSBvcHRpb24sCi10aGlzIHdpbGwgYmUgdGhlIGFyZ3VtZW50IHRvIEBzYW1wey0taG9zdH0uICBJbiB0aGUgbm9ybWFsIGNhc2UsIHRoaXMKLXdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIEBzYW1we2hvc3R9IHZhcmlhYmxlLgotQGl0ZW0gaG9zdF9jcHUKLUBpdGVteCBob3N0X3ZlbmRvcgotQGl0ZW14IGhvc3Rfb3MKLVRoZSBmaXJzdCB0aHJlZSBwYXJ0cyBvZiB0aGUgY2Fub25pY2FsIGNvbmZpZ3VyYXRpb24gbmFtZS4KLUBlbmQgdGFibGUKLQotVGhlIHNoZWxsIHZhcmlhYmxlcyBtYXkgYmUgdXNlZCBieSBwdXR0aW5nIHNoZWxsIGNvZGUgaW4KLUBmaWxle2NvbmZpZ3VyZS5pbn0uICBGb3IgYW4gZXhhbXBsZSwgc2VlIEByZWZ7VXNpbmcgQ29uZmlndXJhdGlvbgotTmFtZXN9LgotCi1Abm9kZSBTcGVjaWZ5aW5nIHRoZSBUYXJnZXQKLUBzZWN0aW9uIFNwZWNpZnlpbmcgdGhlIFRhcmdldAotCi1CeSBkZWZhdWx0LCB0aGUgQHNhbXB7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGlzCi10aGUgc2FtZSBhcyB0aGUgaG9zdC4gIFRoaXMgaXMgdGhlIG1vcmUgY29tbW9uIGNhc2U7IGZvciBleGFtcGxlLCBpdAotbGVhZHMgdG8gYSBuYXRpdmUgY29tcGlsZXIgcmF0aGVyIHRoYW4gYSBjcm9zcyBjb21waWxlci4KLQotQGNpbmRleCBAc2FtcHstLXRhcmdldH0gb3B0aW9uCi1AY2luZGV4IHRhcmdldCBvcHRpb24KLUBjaW5kZXggY29uZmlndXJlIHRhcmdldAotSWYgeW91IHdhbnQgdG8gYnVpbGQgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZQotdGFyZ2V0IGV4cGxpY2l0bHkgYnkgdXNpbmcgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gd2hlbiB5b3UgcnVuCi1Ac2FtcHtjb25maWd1cmV9LiAgVGhlIGFyZ3VtZW50IHRvIEBzYW1wey0tdGFyZ2V0fSBpcyB0aGUgY29uZmlndXJhdGlvbgotbmFtZSBvZiB0aGUgc3lzdGVtIGZvciB3aGljaCB5b3Ugd2lzaCB0byBnZW5lcmF0ZSBjb2RlLgotQHhyZWZ7Q29uZmlndXJhdGlvbiBOYW1lc30uCi0KLUZvciBleGFtcGxlLCB0byBidWlsZCB0b29scyB3aGljaCBnZW5lcmF0ZSBjb2RlIGZvciBhIE1JUFMgRUxGIGVtYmVkZGVkCi1zeXN0ZW0sIHlvdSB3b3VsZCB1c2UgQHNhbXB7LS10YXJnZXQgbWlwcy1lbGZ9LgotCi1Abm9kZSBVc2luZyB0aGUgVGFyZ2V0IFR5cGUKLUBzZWN0aW9uIFVzaW5nIHRoZSBUYXJnZXQgVHlwZQotCi1AY2luZGV4IEBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19Ci1XaGVuIHdyaXRpbmcgQGZpbGV7Y29uZmlndXJlLmlufSBmb3IgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLCB5b3Ugd2lsbAotbmVlZCB0byB1c2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhcmdldC4gIFRvIGRvIHRoaXMsIHB1dAotQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0gaW4gQGZpbGV7Y29uZmlndXJlLmlufS4KLQotQHNhbXB7QUNfQ0FOT05JQ0FMX1NZU1RFTX0gd2lsbCBsb29rIGZvciBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gYW5kCi1jYW5vbmljYWxpemUgaXQgdXNpbmcgdGhlIEBmaWxle2NvbmZpZy5zdWJ9IHNoZWxsIHNjcmlwdC4gIEl0IHdpbGwgYWxzbwotcnVuIEBzYW1we0FDX0NBTk9OSUNBTF9IT1NUfSAoQHB4cmVme1VzaW5nIHRoZSBIb3N0IFR5cGV9KS4KLQotVGhlIHRhcmdldCB0eXBlIHdpbGwgYmUgcmVjb3JkZWQgaW4gdGhlIGZvbGxvd2luZyBzaGVsbCB2YXJpYWJsZXMuICBOb3RlCi10aGF0IHRoZSBob3N0IHZlcnNpb25zIG9mIHRoZXNlIHZhcmlhYmxlcyB3aWxsIGFsc28gYmUgZGVmaW5lZCBieQotQHNhbXB7QUNfQ0FOT05JQ0FMX0hPU1R9LgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIHRhcmdldAotVGhlIGNhbm9uaWNhbCBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHRhcmdldC4KLUBpdGVtIHRhcmdldF9hbGlhcwotVGhlIGFyZ3VtZW50IHRvIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uLiAgSWYgdGhlIHVzZXIgZGlkIG5vdCBzcGVjaWZ5Ci1hIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24sIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyBAc2FtcHtob3N0X2FsaWFzfS4KLUBpdGVtIHRhcmdldF9jcHUKLUBpdGVteCB0YXJnZXRfdmVuZG9yCi1AaXRlbXggdGFyZ2V0X29zCi1UaGUgZmlyc3QgdGhyZWUgcGFydHMgb2YgdGhlIGNhbm9uaWNhbCB0YXJnZXQgY29uZmlndXJhdGlvbiBuYW1lLgotQGVuZCB0YWJsZQotCi1Ob3RlIHRoYXQgaWYgQHNhbXB7aG9zdH0gYW5kIEBzYW1we3RhcmdldH0gYXJlIHRoZSBzYW1lIHN0cmluZywgeW91IGNhbgotYXNzdW1lIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24uICBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHlvdSBjYW4gYXNzdW1lIGEKLWNyb3NzIGNvbmZpZ3VyYXRpb24uCi0KLUl0IGlzIGFyZ3VhYmx5IHBvc3NpYmxlIGZvciBAc2FtcHtob3N0fSBhbmQgQHNhbXB7dGFyZ2V0fSB0byByZXByZXNlbnQKLXRoZSBzYW1lIHN5c3RlbSwgYnV0IGZvciB0aGUgc3RyaW5ncyB0byBub3QgYmUgaWRlbnRpY2FsLiAgRm9yIGV4YW1wbGUsCi1pZiBAc2FtcHtjb25maWcuZ3Vlc3N9IHJldHVybnMgQHNhbXB7c3BhcmMtc3VuLXN1bm9zNC4xLjR9LCBhbmQgc29tZWJvZHkKLWNvbmZpZ3VyZXMgd2l0aCBAc2FtcHstLXRhcmdldCBzcGFyYy1zdW4tc3Vub3M0LjF9LCB0aGVuIHRoZSBzbGlnaHQKLWRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byB2ZXJzaW9ucyBvZiBTdW5PUyBtYXkgYmUgdW5pbXBvcnRhbnQgZm9yCi15b3VyIHRvb2wuICBIb3dldmVyLCBpbiB0aGUgZ2VuZXJhbCBjYXNlIGl0IGNhbiBiZSBxdWl0ZSBkaWZmaWN1bHQgdG8KLWRldGVybWluZSB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBjb25maWd1cmF0aW9uIG5hbWVzIGFyZQotc2lnbmlmaWNhbnQgb3Igbm90LiAgVGhlcmVmb3JlLCBieSBjb252ZW50aW9uLCBpZiB0aGUgdXNlciBzcGVjaWZpZXMgYQotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiB3aXRob3V0IHNwZWNpZnlpbmcgYSBAc2FtcHstLWhvc3R9IG9wdGlvbiwgaXQgaXMKLWFzc3VtZWQgdGhhdCB0aGUgdXNlciB3YW50cyB0byBjb25maWd1cmUgYSBjcm9zcyBjb21waWxhdGlvbiB0b29sLgotCi1UaGUgdmFyaWFibGVzIEBzYW1we3RhcmdldH0gYW5kIEBzYW1we3RhcmdldF9hbGlhc30gc2hvdWxkIGJlIGhhbmRsZWQKLWRpZmZlcmVudGx5LgotCi1JbiBnZW5lcmFsLCB3aGVuZXZlciB0aGUgdXNlciBtYXkgYWN0dWFsbHkgc2VlIGEgc3RyaW5nLAotQHNhbXB7dGFyZ2V0X2FsaWFzfSBzaG91bGQgYmUgdXNlZC4gIFRoaXMgaW5jbHVkZXMgYW55dGhpbmcgd2hpY2ggbWF5Ci1hcHBlYXIgaW4gdGhlIGZpbGUgc3lzdGVtLCBzdWNoIGFzIGEgZGlyZWN0b3J5IG5hbWUgb3IgcGFydCBvZiBhIHRvb2wKLW5hbWUuICBJdCBhbHNvIGluY2x1ZGVzIGFueSB0b29sIG91dHB1dCwgdW5sZXNzIGl0IGlzIGNsZWFybHkgbGFiZWxsZWQKLWFzIHRoZSBjYW5vbmljYWwgdGFyZ2V0IGNvbmZpZ3VyYXRpb24gbmFtZS4gIFRoaXMgcGVybWl0cyB0aGUgdXNlciB0bwotdXNlIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIHRvIHNwZWNpZnkgaG93IHRoZSB0b29sIHdpbGwgYXBwZWFyIHRvCi10aGUgb3V0c2lkZSB3b3JsZC4KLQotT24gdGhlIG90aGVyIGhhbmQsIHdoZW4gY2hlY2tpbmcgZm9yIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgdGFyZ2V0Ci1zeXN0ZW0sIEBzYW1we3RhcmdldH0gc2hvdWxkIGJlIHVzZWQuICBUaGlzIGlzIGJlY2F1c2UgYSB3aWRlIHZhcmlldHkgb2YKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb25zIG1heSBtYXAgaW50byB0aGUgc2FtZSBjYW5vbmljYWwgY29uZmlndXJhdGlvbgotbmFtZS4gIFlvdSBzaG91bGQgbm90IGF0dGVtcHQgdG8gZHVwbGljYXRlIHRoZSBjYW5vbmljYWxpemF0aW9uIGRvbmUgYnkKLUBzYW1we2NvbmZpZy5zdWJ9IGluIHlvdXIgb3duIGNvZGUuCi0KLUJ5IGNvbnZlbnRpb24sIGNyb3NzIHRvb2xzIGFyZSBpbnN0YWxsZWQgd2l0aCBhIHByZWZpeCBvZiB0aGUgYXJndW1lbnQKLXVzZWQgd2l0aCB0aGUgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgYWxzbyBrbm93biBhcyBAc2FtcHt0YXJnZXRfYWxpYXN9Ci0oQHB4cmVme1VzaW5nIHRoZSBUYXJnZXQgVHlwZX0pLiAgSWYgdGhlIHVzZXIgZG9lcyBub3QgdXNlIHRoZQotQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgYW5kIHRodXMgaXMgYnVpbGRpbmcgYSBuYXRpdmUgdG9vbCwgbm8gcHJlZml4IGlzCi11c2VkLgotCi1Gb3IgZXhhbXBsZSwgaWYgZ2NjIGlzIGNvbmZpZ3VyZWQgd2l0aCBAc2FtcHstLXRhcmdldCBtaXBzLWVsZn0sIHRoZW4KLXRoZSBpbnN0YWxsZWQgYmluYXJ5IHdpbGwgYmUgbmFtZWQgQHNhbXB7bWlwcy1lbGYtZ2NjfS4gIElmIGdjYyBpcwotY29uZmlndXJlZCB3aXRob3V0IGEgQHNhbXB7LS10YXJnZXR9IG9wdGlvbiwgdGhlbiB0aGUgaW5zdGFsbGVkIGJpbmFyeQotd2lsbCBiZSBuYW1lZCBAc2FtcHtnY2N9LgotCi1UaGUgYXV0b2NvbmYgbWFjcm8gQHNhbXB7QUNfQVJHX1BST0dSQU19IHdpbGwgaGFuZGxlIHRoaXMgZm9yIHlvdS4gIElmCi15b3UgYXJlIHVzaW5nIGF1dG9tYWtlLCBubyBtb3JlIG5lZWQgYmUgZG9uZTsgdGhlIHByb2dyYW1zIHdpbGwKLWF1dG9tYXRpY2FsbHkgYmUgaW5zdGFsbGVkIHdpdGggdGhlIGNvcnJlY3QgcHJlZml4ZXMuICBPdGhlcndpc2UsIHNlZQotdGhlIGF1dG9jb25mIGRvY3VtZW50YXRpb24gZm9yIEBzYW1we0FDX0FSR19QUk9HUkFNfS4KLQotQG5vZGUgQ3Jvc3MgVG9vbHMgaW4gdGhlIEN5Z251cyBUcmVlCi1Ac2VjdGlvbiBDcm9zcyBUb29scyBpbiB0aGUgQ3lnbnVzIFRyZWUKLQotVGhlIEN5Z251cyB0cmVlIGlzIHVzZWQgZm9yIHZhcmlvdXMgcGFja2FnZXMgaW5jbHVkaW5nIGdkYiwgdGhlIEdOVQotYmludXRpbHMsIGFuZCBlZ2NzLiAgSXQgaXMgYWxzbywgb2YgY291cnNlLCB1c2VkIGZvciBDeWdudXMgcmVsZWFzZXMuCi0KLUluIHRoZSBDeWdudXMgdHJlZSwgdGhlIHRvcCBsZXZlbCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB1c2VzIHRoZSBvbGQKLUN5Z251cyBjb25maWd1cmUgc3lzdGVtLCBub3QgYXV0b2NvbmYuICBUaGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlLmlufQotaXMgd3JpdHRlbiB0byBidWlsZCBwYWNrYWdlcyBiYXNlZCBvbiB3aGF0IGlzIGluIHRoZSBzb3VyY2UgdHJlZSwgYW5kCi1zdXBwb3J0cyBidWlsZGluZyBhIGxhcmdlIG51bWJlciBvZiB0b29scyBpbiBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSBzdGVwLgotCi1UaGUgQ3lnbnVzIHRyZWUgbWF5IGJlIGNvbmZpZ3VyZWQgd2l0aCBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24uICBUaGUKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gYXBwbGllcyByZWN1cnNpdmVseSB0byBldmVyeSBzdWJkaXJlY3RvcnksIGFuZAotcGVybWl0cyBidWlsZGluZyBhbiBlbnRpcmUgc2V0IG9mIGNyb3NzIHRvb2xzIGF0IG9uY2UuCi0KLUBtZW51Ci0qIEhvc3QgYW5kIFRhcmdldCBMaWJyYXJpZXM6OgkJSG9zdCBhbmQgVGFyZ2V0IExpYnJhcmllcy4KLSogVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHM6OglUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0cy4KLSogTWFrZSBUYXJnZXRzIGluIEN5Z251cyBUcmVlOjogICAgICAgICBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWUuCi0qIFRhcmdldCBsaWJpYmVydHk6OgkJCVRhcmdldCBsaWJpYmVydHkKLUBlbmQgbWVudQotCi1Abm9kZSBIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzCi1Ac3Vic2VjdGlvbiBIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzCi0KLVRoZSBDeWdudXMgdHJlZSBkaXN0aW5ndWlzaGVzIGhvc3QgbGlicmFyaWVzIGZyb20gdGFyZ2V0IGxpYnJhcmllcy4KLQotSG9zdCBsaWJyYXJpZXMgYXJlIGJ1aWx0IHdpdGggdGhlIGNvbXBpbGVyIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW1zCi13aGljaCBydW4gb24gdGhlIGhvc3QsIHdoaWNoIGlzIGNhbGxlZCB0aGUgaG9zdCBjb21waWxlci4gIFRoaXMgaW5jbHVkZXMKLWxpYnJhcmllcyBzdWNoIGFzIEBzYW1we2JmZH0gYW5kIEBzYW1we3RjbH0uICBUaGVzZSBsaWJyYXJpZXMgYXJlIGJ1aWx0Ci13aXRoIHRoZSBob3N0IGNvbXBpbGVyLCBhbmQgYXJlIGxpbmtlZCBpbnRvIHByb2dyYW1zIGxpa2UgdGhlIGJpbnV0aWxzCi1vciBnY2Mgd2hpY2ggcnVuIG9uIHRoZSBob3N0LgotCi1UYXJnZXQgbGlicmFyaWVzIGFyZSBidWlsdCB3aXRoIHRoZSB0YXJnZXQgY29tcGlsZXIuICBJZiBnY2MgaXMgcHJlc2VudAotaW4gdGhlIHNvdXJjZSB0cmVlLCB0aGVuIHRoZSB0YXJnZXQgY29tcGlsZXIgaXMgdGhlIGdjYyB0aGF0IGlzIGJ1aWx0Ci11c2luZyB0aGUgaG9zdCBjb21waWxlci4gIFRhcmdldCBsaWJyYXJpZXMgYXJlIGxpYnJhcmllcyBzdWNoIGFzCi1Ac2FtcHtuZXdsaWJ9IGFuZCBAc2FtcHtsaWJzdGRjKyt9LiAgVGhlc2UgbGlicmFyaWVzIGFyZSBub3QgbGlua2VkIGludG8KLXRoZSBob3N0IHByb2dyYW1zLCBidXQgYXJlIGluc3RlYWQgbWFkZSBhdmFpbGFibGUgZm9yIHVzZSB3aXRoIHByb2dyYW1zCi1idWlsdCB3aXRoIHRoZSB0YXJnZXQgY29tcGlsZXIuCi0KLUZvciB0aGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24sIGFzc3VtZSB0aGF0IGdjYyBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UKLXRyZWUsIHNvIHRoYXQgaXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotCi1UaGVyZSBpcyBhIGNvbXBsaWNhdGlvbiBoZXJlLiAgVGhlIGNvbmZpZ3VyZSBwcm9jZXNzIG5lZWRzIHRvIGtub3cgd2hpY2gKLWNvbXBpbGVyIHlvdSBhcmUgZ29pbmcgdG8gdXNlIHRvIGJ1aWxkIGEgdG9vbDsgb3RoZXJ3aXNlLCB0aGUgZmVhdHVyZQotdGVzdHMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuICBUaGUgQ3lnbnVzIHRyZWUgaGFuZGxlcyB0aGlzIGJ5IG5vdAotY29uZmlndXJpbmcgdGhlIHRhcmdldCBsaWJyYXJpZXMgdW50aWwgdGhlIHRhcmdldCBjb21waWxlciBpcyBidWlsdC4gIEluCi1vcmRlciB0byBwZXJtaXQgZXZlcnl0aGluZyB0byBidWlsZCB1c2luZyBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSwgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhcmdldCBsaWJyYXJpZXMKLWlzIGFjdHVhbGx5IHRyaWdnZXJlZCBkdXJpbmcgdGhlIG1ha2Ugc3RlcC4KLQotV2hlbiB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgY29uZmlndXJlZCwgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gaXMKLW5vdCB1c2VkLiAgSW5zdGVhZCwgdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIGlzIHVzZWQgd2l0aCB0aGUgYXJndW1lbnQKLW9mIHRoZSBAc2FtcHstLXRhcmdldH0gb3B0aW9uIGZvciB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLiAgSWYgbm8KLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gd2FzIHVzZWQgZm9yIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24sIHRoZQotQHNhbXB7LS1ob3N0fSBvcHRpb24gd2lsbCBiZSBwYXNzZWQgd2l0aCB0aGUgb3V0cHV0IG9mIHRoZQotQGZpbGV7Y29uZmlnLmd1ZXNzfSBzaGVsbCBzY3JpcHQuICBBbnkgQHNhbXB7LS1idWlsZH0gb3B0aW9uIGlzIHBhc3NlZAotZG93biB1bmNoYW5nZWQuCi0KLVRoaXMgdHJhbnNsYXRpb24gb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGlzIGRvbmUgYmVjYXVzZSBzaW5jZSB0aGUKLXRhcmdldCBsaWJyYXJpZXMgYXJlIGNvbXBpbGVkIHdpdGggdGhlIHRhcmdldCBjb21waWxlciwgdGhleSBhcmUgYmVpbmcKLWJ1aWx0IGluIG9yZGVyIHRvIHJ1biBvbiB0aGUgdGFyZ2V0IG9mIHRoZSBvdmVyYWxsIGNvbmZpZ3VyYXRpb24uICBCeQotdGhlIGRlZmluaXRpb24gb2YgaG9zdCwgdGhpcyBtZWFucyB0aGF0IHRoZWlyIGhvc3Qgc3lzdGVtIGlzIHRoZSBzYW1lIGFzCi10aGUgdGFyZ2V0IHN5c3RlbSBvZiB0aGUgb3ZlcmFsbCBjb25maWd1cmF0aW9uLgotCi1UaGUgc2FtZSBwcm9jZXNzIGlzIHVzZWQgZm9yIGJvdGggYSBuYXRpdmUgY29uZmlndXJhdGlvbiBhbmQgYSBjcm9zcwotY29uZmlndXJhdGlvbi4gIEV2ZW4gd2hlbiB1c2luZyBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCB0aGUgdGFyZ2V0Ci1saWJyYXJpZXMgd2lsbCBiZSBjb25maWd1cmVkIGFuZCBidWlsdCB1c2luZyB0aGUgbmV3bHkgYnVpbHQgY29tcGlsZXIuCi1UaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIHRoZSBDKysgbGlicmFyaWVzLCBzaW5jZSB0aGVyZSBpcyBubwotcmVhc29uIHRvIGFzc3VtZSB0aGF0IHRoZSBDKysgY29tcGlsZXIgdXNlZCB0byBidWlsZCB0aGUgaG9zdCB0b29scyAoaWYKLXRoZXJlIGV2ZW4gaXMgb25lKSB1c2VzIHRoZSBzYW1lIEFCSSBhcyB0aGUgZysrIGNvbXBpbGVyIHdoaWNoIHdpbGwgYmUKLXVzZWQgdG8gYnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi0KLVRoZXJlIGlzIG9uZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiBhbmQgYSBjcm9zcwotY29uZmlndXJhdGlvbi4gIEluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24sIHRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZQotbm9ybWFsbHkgY29uZmlndXJlZCBhbmQgYnVpbHQgYXMgc2libGluZ3Mgb2YgdGhlIGhvc3QgdG9vbHMuICBJbiBhIGNyb3NzCi1jb25maWd1cmF0aW9uLCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBhcmUgbm9ybWFsbHkgYnVpbHQgaW4gYSBzdWJkaXJlY3RvcnkKLXdob3NlIG5hbWUgaXMgdGhlIGFyZ3VtZW50IHRvIEBzYW1wey0tdGFyZ2V0fS4gIFRoaXMgaXMgbWFpbmx5IGZvcgotaGlzdG9yaWNhbCByZWFzb25zLgotCi1UbyBzdW1tYXJpemUsIHJ1bm5pbmcgQHNhbXB7Y29uZmlndXJlfSBpbiB0aGUgQ3lnbnVzIHRyZWUgY29uZmlndXJlcyBhbGwKLXRoZSBob3N0IGxpYnJhcmllcyBhbmQgdG9vbHMsIGJ1dCBkb2VzIG5vdCBjb25maWd1cmUgYW55IG9mIHRoZSB0YXJnZXQKLWxpYnJhcmllcy4gIFJ1bm5pbmcgQHNhbXB7bWFrZX0gdGhlbiBkb2VzIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1CdWlsZCB0aGUgaG9zdCBsaWJyYXJpZXMuCi1AaXRlbQotQnVpbGQgdGhlIGhvc3QgcHJvZ3JhbXMsIGluY2x1ZGluZyBnY2MuICBOb3RlIHRoYXQgd2UgY2FsbCBnY2MgYm90aCBhCi1ob3N0IHByb2dyYW0gKHNpbmNlIGl0IHJ1bnMgb24gdGhlIGhvc3QpIGFuZCBhIHRhcmdldCBjb21waWxlciAoc2luY2UgaXQKLWdlbmVyYXRlcyBjb2RlIGZvciB0aGUgdGFyZ2V0KS4KLUBpdGVtCi1Vc2luZyB0aGUgbmV3bHkgYnVpbHQgdGFyZ2V0IGNvbXBpbGVyLCBjb25maWd1cmUgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi1AaXRlbQotQnVpbGQgdGhlIHRhcmdldCBsaWJyYXJpZXMuCi1AZW5kIGl0ZW1pemUKLQotVGhlIHN0ZXBzIG5lZWQgbm90IGJlIGRvbmUgaW4gcHJlY2lzZWx5IHRoaXMgb3JkZXIsIHNpbmNlIHRoZXkgYXJlCi1hY3R1YWxseSBjb250cm9sbGVkIGJ5IEBmaWxle01ha2VmaWxlfSB0YXJnZXRzLgotCi1Abm9kZSBUYXJnZXQgTGlicmFyeSBDb25maWd1cmUgU2NyaXB0cwotQHN1YnNlY3Rpb24gVGFyZ2V0IExpYnJhcnkgQ29uZmlndXJlIFNjcmlwdHMKLQotVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB5b3UgbXVzdCBrbm93IGluIG9yZGVyIHRvIHdyaXRlIGEgY29uZmlndXJlCi1zY3JpcHQgZm9yIGEgdGFyZ2V0IGxpYnJhcnkuICBUaGlzIGlzIGp1c3QgYSBxdWljayBza2V0Y2gsIGFuZCBiZWdpbm5lcnMKLXNob3VsZG4ndCB3b3JyeSBpZiB0aGV5IGRvbid0IGZvbGxvdyBldmVyeXRoaW5nIGhlcmUuCi0KLVRoZSB0YXJnZXQgbGlicmFyaWVzIGFyZSBjb25maWd1cmVkIGFuZCBidWlsdCB1c2luZyBhIG5ld2x5IGJ1aWx0IHRhcmdldAotY29tcGlsZXIuICBUaGVyZSBtYXkgbm90IGJlIGFueSBzdGFydHVwIGZpbGVzIG9yIGxpYnJhcmllcyBmb3IgdGhpcwotdGFyZ2V0IGNvbXBpbGVyLiAgSW4gZmFjdCwgdGhvc2UgZmlsZXMgd2lsbCBwcm9iYWJseSBiZSBidWlsdCBhcyBwYXJ0IG9mCi1zb21lIHRhcmdldCBsaWJyYXJ5LCB3aGljaCBuYXR1cmFsbHkgbWVhbnMgdGhhdCB0aGV5IHdpbGwgbm90IGV4aXN0IHdoZW4KLXlvdXIgdGFyZ2V0IGxpYnJhcnkgaXMgY29uZmlndXJlZC4KLQotVGhpcyBtZWFucyB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBhIHRhcmdldCBsaWJyYXJ5IG1heSBub3QgdXNlCi1hbnkgdGVzdCB3aGljaCByZXF1aXJlcyBkb2luZyBhIGxpbmsuICBUaGlzIHVuZm9ydHVuYXRlbHkgaW5jbHVkZXMgbWFueQotdXNlZnVsIGF1dG9jb25mIG1hY3Jvcywgc3VjaCBhcyBAc2FtcHtBQ19DSEVDS19GVU5DU30uICBhdXRvY29uZiBtYWNyb3MKLXdoaWNoIGRvIGEgY29tcGlsZSBidXQgbm90IGEgbGluaywgc3VjaCBhcyBAc2FtcHtBQ19DSEVDS19IRUFERVJTfSwgbWF5Ci1iZSB1c2VkLgotCi1UaGlzIGlzIGEgc2V2ZXJlIHJlc3RyaWN0aW9uLCBidXQgbm9ybWFsbHkgbm90IGEgZmF0YWwgb25lLCBhcyB0YXJnZXQKLWxpYnJhcmllcyBjYW4gb2Z0ZW4gYXNzdW1lIHRoZSBwcmVzZW5jZSBvZiBvdGhlciB0YXJnZXQgbGlicmFyaWVzLCBhbmQKLXRodXMga25vdyB3aGljaCBmdW5jdGlvbnMgd2lsbCBiZSBhdmFpbGFibGUuCi0KLUFzIG9mIHRoaXMgd3JpdGluZywgdGhlIGF1dG9jb25mIG1hY3JvIEBzYW1we0FDX1BST0dfQ0N9IGRvZXMgYSBsaW5rIHRvCi1tYWtlIHN1cmUgdGhhdCB0aGUgY29tcGlsZXIgd29ya3MuICBUaGlzIG1heSBmYWlsIGluIGEgdGFyZ2V0IGxpYnJhcnksCi1zbyB0YXJnZXQgbGlicmFyaWVzIG11c3QgdXNlIGEgZGlmZmVyZW50IHNldCBvZiBtYWNyb3MgdG8gbG9jYXRlIHRoZQotY29tcGlsZXIuICBTZWUgdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBpbiBhIGRpcmVjdG9yeSBsaWtlCi1AZmlsZXtsaWJpYmVydHl9IG9yIEBmaWxle2xpYmdsb3NzfSBmb3IgYW4gZXhhbXBsZS4KLQotQXMgbm90ZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIHRhcmdldCBsaWJyYXJpZXMgYXJlIHNvbWV0aW1lcyBidWlsdAotaW4gZGlyZWN0b3JpZXMgd2hpY2ggYXJlIHNpYmxpbmdzIHRvIHRoZSBob3N0IHRvb2xzLCBhbmQgYXJlIHNvbWV0aW1lcwotYnVpbHQgaW4gYSBzdWJkaXJlY3RvcnkuICBUaGUgQHNhbXB7LS13aXRoLXRhcmdldC1zdWJkaXJ9IGNvbmZpZ3VyZQotb3B0aW9uIHdpbGwgYmUgcGFzc2VkIHdoZW4gdGhlIGxpYnJhcnkgaXMgY29uZmlndXJlZC4gIEl0cyB2YWx1ZSB3aWxsIGJlCi1hbiBlbXB0eSBzdHJpbmcgaWYgdGhlIHRhcmdldCBsaWJyYXJ5IGlzIGEgc2libGluZy4gIEl0cyB2YWx1ZSB3aWxsIGJlCi10aGUgbmFtZSBvZiB0aGUgc3ViZGlyZWN0b3J5IGlmIHRoZSB0YXJnZXQgbGlicmFyeSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLQotSWYgdGhlIG92ZXJhbGwgYnVpbGQgaXMgbm90IGEgbmF0aXZlIGJ1aWxkIChpLmUuLCB0aGUgb3ZlcmFsbCBjb25maWd1cmUKLXVzZWQgdGhlIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24pLCB0aGVuIHRoZSBsaWJyYXJ5IHdpbGwgYmUgY29uZmlndXJlZAotd2l0aCB0aGUgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbi4gIFRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbiB3aWxsCi1iZSB0aGUgaG9zdCBzeXN0ZW0gb2YgdGhlIG92ZXJhbGwgYnVpbGQuICBSZWNhbGwgdGhhdCB0aGUgaG9zdCBzeXN0ZW0gb2YKLXRoZSBsaWJyYXJ5IHdpbGwgYmUgdGhlIHRhcmdldCBvZiB0aGUgb3ZlcmFsbCBidWlsZC4gIElmIHRoZSBvdmVyYWxsCi1idWlsZCBpcyBhIG5hdGl2ZSBidWlsZCwgdGhlIEBzYW1wey0td2l0aC1jcm9zcy1ob3N0fSBvcHRpb24gd2lsbCBub3QgYmUKLXVzZWQuCi0KLUEgbGlicmFyeSB3aGljaCBjYW4gYmUgYnVpbHQgYm90aCBzdGFuZGFsb25lIGFuZCBhcyBhIHRhcmdldCBsaWJyYXJ5IG1heQotd2FudCB0byBpbnN0YWxsIGl0c2VsZiBpbnRvIGRpZmZlcmVudCBkaXJlY3RvcmllcyBkZXBlbmRpbmcgdXBvbiB0aGUKLWNhc2UuICBXaGVuIGJ1aWx0IHN0YW5kYWxvbmUsIG9yIHdoZW4gYnVpbHQgbmF0aXZlLCB0aGUgbGlicmFyeSBzaG91bGQKLWJlIGluc3RhbGxlZCBpbiBAc2FtcHskKGxpYmRpcil9LiAgV2hlbiBidWlsdCBhcyBhIHRhcmdldCBsaWJyYXJ5IHdoaWNoCi1pcyBub3QgbmF0aXZlLCB0aGUgbGlicmFyeSBzaG91bGQgYmUgaW5zdGFsbGVkIGluIEBzYW1weyQodG9vbGRpcikvbGlifS4KLVRoZSBAc2FtcHstLXdpdGgtY3Jvc3MtaG9zdH0gb3B0aW9uIG1heSBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlCi1jYXNlcy4KLQotVGhpcyBzYW1lIHRlc3Qgb2YgQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG1heSBiZSB1c2VkIHRvIHNlZSB3aGV0aGVyIGl0Ci1pcyBPSyB0byB1c2UgbGluayB0ZXN0cyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4gIElmIHRoZQotQHNhbXB7LS13aXRoLWNyb3NzLWhvc3R9IG9wdGlvbiBpcyBub3QgdXNlZCwgdGhlbiB0aGUgbGlicmFyeSBpcyBiZWluZwotYnVpbHQgZWl0aGVyIHN0YW5kYWxvbmUgb3IgbmF0aXZlLCBhbmQgYSBsaW5rIHNob3VsZCB3b3JrLgotCi1Abm9kZSBNYWtlIFRhcmdldHMgaW4gQ3lnbnVzIFRyZWUKLUBzdWJzZWN0aW9uIE1ha2UgVGFyZ2V0cyBpbiBDeWdudXMgVHJlZQotCi1UaGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBpbiB0aGUgQ3lnbnVzIHRyZWUgZGVmaW5lcyB0YXJnZXRzIGZvcgotZXZlcnkga25vd24gc3ViZGlyZWN0b3J5LgotCi1Gb3IgZXZlcnkgc3ViZGlyZWN0b3J5IEB2YXJ7ZGlyfSB3aGljaCBob2xkcyBhIGhvc3QgbGlicmFyeSBvciBwcm9ncmFtLAotdGhlIEBmaWxle01ha2VmaWxlfSB0YXJnZXQgQHNhbXB7YWxsLUB2YXJ7ZGlyfX0gd2lsbCBidWlsZCB0aGF0IGxpYnJhcnkKLW9yIHByb2dyYW0uCi0KLVRoZXJlIGFyZSBkZXBlbmRlbmNpZXMgYW1vbmcgaG9zdCB0b29scy4gIEZvciBleGFtcGxlLCBidWlsZGluZyBnY2MKLXJlcXVpcmVzIGZpcnN0IGJ1aWxkaW5nIGdhcywgYmVjYXVzZSB0aGUgZ2NjIGJ1aWxkIHByb2Nlc3MgaW52b2tlcyB0aGUKLXRhcmdldCBhc3NlbWJsZXIuICBUaGVzZSBkZXBlbmRlbmNpZXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgdG9wIGxldmVsCi1AZmlsZXtNYWtlZmlsZX0uCi0KLUZvciBldmVyeSBzdWJkaXJlY3RvcnkgQHZhcntkaXJ9IHdoaWNoIGhvbGRzIGEgdGFyZ2V0IGxpYnJhcnksIHRoZQotQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBAc2FtcHtjb25maWd1cmUtdGFyZ2V0LUB2YXJ7ZGlyfX0gd2lsbCBjb25maWd1cmUKLXRoYXQgbGlicmFyeS4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0IEBzYW1we2FsbC10YXJnZXQtQHZhcntkaXJ9fQotd2lsbCBidWlsZCB0aGF0IGxpYnJhcnkuCi0KLUV2ZXJ5IEBzYW1we2NvbmZpZ3VyZS10YXJnZXQtQHZhcntkaXJ9fSB0YXJnZXQgZGVwZW5kcyB1cG9uCi1Ac2FtcHthbGwtZ2NjfSwgc2luY2UgZ2NjLCB0aGUgdGFyZ2V0IGNvbXBpbGVyLCBpcyByZXF1aXJlZCB0byBjb25maWd1cmUKLXRoZSB0b29sLiAgRXZlcnkgQHNhbXB7YWxsLXRhcmdldC1AdmFye2Rpcn19IHRhcmdldCBkZXBlbmRzIHVwb24gdGhlCi1jb3JyZXNwb25kaW5nIEBzYW1we2NvbmZpZ3VyZS10YXJnZXQtQHZhcntkaXJ9fSB0YXJnZXQuCi0KLVRoZXJlIGFyZSBzZXZlcmFsIG90aGVyIHRhcmdldHMgd2hpY2ggbWF5IGJlIG9mIGludGVyZXN0IGZvciBlYWNoCi1kaXJlY3Rvcnk6IEBzYW1we2luc3RhbGwtQHZhcntkaXJ9fSwgQHNhbXB7Y2xlYW4tQHZhcntkaXJ9fSwgYW5kCi1Ac2FtcHtjaGVjay1AdmFye2Rpcn19LiAgVGhlcmUgYXJlIGFsc28gY29ycmVzcG9uZGluZyBAc2FtcHt0YXJnZXR9Ci12ZXJzaW9ucyBvZiB0aGVzZSBmb3IgdGhlIHRhcmdldCBsaWJyYXJpZXMgLCBzdWNoIGFzCi1Ac2FtcHtpbnN0YWxsLXRhcmdldC1AdmFye2Rpcn19LgotCi1Abm9kZSBUYXJnZXQgbGliaWJlcnR5Ci1Ac3Vic2VjdGlvbiBUYXJnZXQgbGliaWJlcnR5Ci0KLVRoZSBAZmlsZXtsaWJpYmVydHl9IHN1YmRpcmVjdG9yeSBpcyBjdXJyZW50bHkgYSBzcGVjaWFsIGNhc2UsIGluIHRoYXQKLWl0IGlzIHRoZSBvbmx5IGRpcmVjdG9yeSB3aGljaCBpcyBidWlsdCBib3RoIHVzaW5nIHRoZSBob3N0IGNvbXBpbGVyIGFuZAotdXNpbmcgdGhlIHRhcmdldCBjb21waWxlci4KLQotVGhpcyBpcyBiZWNhdXNlIHRoZSBmaWxlcyBpbiBAZmlsZXtsaWJpYmVydHl9IGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgdGhlCi1ob3N0IHRvb2xzLCBhbmQgdGhleSBhcmUgYWxzbyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgQGZpbGV7bGlic3RkYysrfQotdGFyZ2V0IGxpYnJhcnkgYXMgc3VwcG9ydCBjb2RlLgotCi1UaGlzIGR1YWxpdHkgZG9lcyBub3QgcG9zZSBhbnkgcGFydGljdWxhciBkaWZmaWN1bHRpZXMuICBJdCBtZWFucyB0aGF0Ci10aGVyZSBhcmUgdGFyZ2V0cyBmb3IgYm90aCBAc2FtcHthbGwtbGliaWJlcnR5fSBhbmQKLUBzYW1we2FsbC10YXJnZXQtbGliaWJlcnR5fS4KLQotSW4gYSBuYXRpdmUgY29uZmlndXJhdGlvbiwgd2hlbiB0YXJnZXQgbGlicmFyaWVzIGFyZSBub3QgYnVpbHQgaW4gYQotc3ViZGlyZWN0b3J5LCB0aGUgc2FtZSBvYmplY3RzIGFyZSBub3JtYWxseSB1c2VkIGFzIGJvdGggdGhlIGhvc3QgYnVpbGQKLWFuZCB0aGUgdGFyZ2V0IGJ1aWxkLiAgVGhpcyBpcyBub3JtYWxseSBPSywgc2luY2UgbGliaWJlcnR5IGNvbnRhaW5zCi1vbmx5IEMgY29kZSwgYW5kIGluIGEgbmF0aXZlIGNvbmZpZ3VyYXRpb24gdGhlIHJlc3VsdHMgb2YgdGhlIGhvc3QKLWNvbXBpbGVyIGFuZCB0aGUgdGFyZ2V0IGNvbXBpbGVyIGFyZSBub3JtYWxseSBpbnRlcm9wZXJhYmxlLgotCi1Jcml4IDYgaXMgYWdhaW4gYW4gZXhjZXB0aW9uIGhlcmUsIHNpbmNlIHRoZSBTR0kgbmF0aXZlIGNvbXBpbGVyCi1kZWZhdWx0cyB0byB1c2luZyB0aGUgQHNhbXB7TzMyfSBBQkksIGFuZCBnY2MgZGVmYXVsdHMgdG8gdXNpbmcgdGhlCi1Ac2FtcHtOMzJ9IEFCSS4gIE9uIElyaXggNiwgdGhlIHRhcmdldCBsaWJyYXJpZXMgYXJlIGJ1aWx0IGluIGEKLXN1YmRpcmVjdG9yeSBldmVuIGZvciBhIG5hdGl2ZSBjb25maWd1cmF0aW9uLCBhdm9pZGluZyB0aGlzIHByb2JsZW0uCi0KLVRoZXJlIGFyZSBjdXJyZW50bHkgbm8gb3RoZXIgbGlicmFyaWVzIGJ1aWx0IGZvciBib3RoIHRoZSBob3N0IGFuZCB0aGUKLXRhcmdldCwgYnV0IHRoZXJlIGlzIG5vIGNvbmNlcHR1YWwgcHJvYmxlbSB3aXRoIGFkZGluZyBtb3JlLgotCi1Abm9kZSBDYW5hZGlhbiBDcm9zcwotQGNoYXB0ZXIgQ2FuYWRpYW4gQ3Jvc3MKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MKLUBjaW5kZXggYnVpbGRpbmcgd2l0aCBhIGNyb3NzIGNvbXBpbGVyCi1AY2luZGV4IGNyb3NzIGNvbXBpbGVyLCBidWlsZGluZyB3aXRoCi0KLUl0IGlzIHBvc3NpYmxlIHRvIHVzZSB0aGUgR05VIGNvbmZpZ3VyZSBhbmQgYnVpbGQgc3lzdGVtIHRvIGJ1aWxkIGEKLXByb2dyYW0gd2hpY2ggd2lsbCBydW4gb24gYSBzeXN0ZW0gd2hpY2ggaXMgZGlmZmVyZW50IGZyb20gdGhlIHN5c3RlbSBvbgotd2hpY2ggdGhlIHRvb2xzIGFyZSBidWlsdC4gIEluIG90aGVyIHdvcmRzLCBpdCBpcyBwb3NzaWJsZSB0byBidWlsZAotcHJvZ3JhbXMgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLQotVGhpcyBpcyByZWZlcnJlZCB0byBhcyBhIEBkZm57Q2FuYWRpYW4gQ3Jvc3N9LgotCi1AbWVudQotKiBDYW5hZGlhbiBDcm9zcyBFeGFtcGxlOjoJCUNhbmFkaWFuIENyb3NzIEV4YW1wbGUuCi0qIENhbmFkaWFuIENyb3NzIENvbmNlcHRzOjoJCUNhbmFkaWFuIENyb3NzIENvbmNlcHRzLgotKiBCdWlsZCBDcm9zcyBIb3N0IFRvb2xzOjoJCUJ1aWxkIENyb3NzIEhvc3QgVG9vbHMuCi0qIEJ1aWxkIGFuZCBIb3N0IE9wdGlvbnM6OgkJQnVpbGQgYW5kIEhvc3QgT3B0aW9ucy4KLSogQ0Nyb3NzIG5vdCBpbiBDeWdudXMgVHJlZTo6CQlDYW5hZGlhbiBDcm9zcyBub3QgaW4gQ3lnbnVzIFRyZWUuCi0qIENDcm9zcyBpbiBDeWdudXMgVHJlZTo6CQlDYW5hZGlhbiBDcm9zcyBpbiBDeWdudXMgVHJlZS4KLSogU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zczo6CQlTdXBwb3J0aW5nIENhbmFkaWFuIENyb3NzLgotQGVuZCBtZW51Ci0KLUBub2RlIENhbmFkaWFuIENyb3NzIEV4YW1wbGUKLUBzZWN0aW9uIENhbmFkaWFuIENyb3NzIEV4YW1wbGUKLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIGEgQ2FuYWRpYW4gQ3Jvc3MuCi0KLVdoaWxlIHJ1bm5pbmcgb24gYSBHTlUvTGludXgsIHlvdSBjYW4gYnVpbGQgYSBwcm9ncmFtIHdoaWNoIHdpbGwgcnVuIG9uCi1hIFNvbGFyaXMgc3lzdGVtLiAgWW91IHdvdWxkIHVzZSBhIEdOVS9MaW51eCBjcm9zcyBTb2xhcmlzIGNvbXBpbGVyIHRvCi1idWlsZCB0aGUgcHJvZ3JhbS4KLQotT2YgY291cnNlLCB5b3UgY291bGQgbm90IHJ1biB0aGUgcmVzdWx0aW5nIHByb2dyYW0gb24geW91ciBHTlUvTGludXgKLXN5c3RlbS4gIFlvdSB3b3VsZCBoYXZlIHRvIGNvcHkgaXQgb3ZlciB0byBhIFNvbGFyaXMgc3lzdGVtIGJlZm9yZSB5b3UKLXdvdWxkIHJ1biBpdC4KLQotT2YgY291cnNlLCB5b3UgY291bGQgYWxzbyBzaW1wbHkgYnVpbGQgdGhlIHByb2dyYW1zIG9uIHRoZSBTb2xhcmlzCi1zeXN0ZW0gaW4gdGhlIGZpcnN0IHBsYWNlLiAgSG93ZXZlciwgcGVyaGFwcyB0aGUgU29sYXJpcyBzeXN0ZW0gaXMgbm90Ci1hdmFpbGFibGUgZm9yIHNvbWUgcmVhc29uOyBwZXJoYXBzIHlvdSBhY3R1YWxseSBkb24ndCBoYXZlIG9uZSwgYnV0IHlvdQotd2FudCB0byBidWlsZCB0aGUgdG9vbHMgZm9yIHNvbWVib2R5IGVsc2UgdG8gdXNlLiAgT3IgcGVyaGFwcyB5b3VyCi1HTlUvTGludXggc3lzdGVtIGlzIG11Y2ggZmFzdGVyIHRoYW4geW91ciBTb2xhcmlzIHN5c3RlbS4KLQotQSBDYW5hZGlhbiBDcm9zcyBidWlsZCBpcyBtb3N0IGZyZXF1ZW50bHkgdXNlZCB3aGVuIGJ1aWxkaW5nIHByb2dyYW1zIHRvCi1ydW4gb24gYSBub24tVW5peCBzeXN0ZW0sIHN1Y2ggYXMgRE9TIG9yIFdpbmRvd3MuICBJdCBtYXkgYmUgc2ltcGxlciB0bwotY29uZmlndXJlIGFuZCBidWlsZCBvbiBhIFVuaXggc3lzdGVtIHRoYW4gdG8gc3VwcG9ydCB0aGUgY29uZmlndXJhdGlvbgotbWFjaGluZXJ5IG9uIGEgbm9uLVVuaXggc3lzdGVtLgotCi1Abm9kZSBDYW5hZGlhbiBDcm9zcyBDb25jZXB0cwotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3MgQ29uY2VwdHMKLQotV2hlbiBidWlsZGluZyBhIENhbmFkaWFuIENyb3NzLCB0aGVyZSBhcmUgYXQgbGVhc3QgdHdvIGRpZmZlcmVudCBzeXN0ZW1zCi1pbnZvbHZlZDogdGhlIHN5c3RlbSBvbiB3aGljaCB0aGUgdG9vbHMgYXJlIGJlaW5nIGJ1aWx0LCBhbmQgdGhlIHN5c3RlbQotb24gd2hpY2ggdGhlIHRvb2xzIHdpbGwgcnVuLgotCi1UaGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyBhcmUgYmVpbmcgYnVpbHQgaXMgY2FsbGVkIHRoZSBAZGZue2J1aWxkfQotc3lzdGVtLgotCi1UaGUgc3lzdGVtIG9uIHdoaWNoIHRoZSB0b29scyB3aWxsIHJ1biBpcyBjYWxsZWQgdGhlIGhvc3Qgc3lzdGVtLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBidWlsZGluZyBhIFNvbGFyaXMgcHJvZ3JhbSBvbiBhIEdOVS9MaW51eAotc3lzdGVtLCBhcyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdGhlIGJ1aWxkIHN5c3RlbSB3b3VsZCBiZSBHTlUvTGludXgsCi1hbmQgdGhlIGhvc3Qgc3lzdGVtIHdvdWxkIGJlIFNvbGFyaXMuCi0KLUl0IGlzLCBvZiBjb3Vyc2UsIHBvc3NpYmxlIHRvIGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBDYW5hZGlhbgotQ3Jvc3MgKGkuZS4sIGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBjcm9zcyBjb21waWxlcikuICBJbiB0aGlzCi1jYXNlLCB0aGUgc3lzdGVtIGZvciB3aGljaCB0aGUgcmVzdWx0aW5nIGNyb3NzIGNvbXBpbGVyIGdlbmVyYXRlcyBjb2RlCi1pcyBjYWxsZWQgdGhlIHRhcmdldCBzeXN0ZW0uICAoRm9yIGEgbW9yZSBjb21wbGV0ZSBkaXNjdXNzaW9uIG9mIGhvc3QKLWFuZCB0YXJnZXQgc3lzdGVtcywgQHB4cmVme0hvc3QgYW5kIFRhcmdldH0pLgotCi1BbiBleGFtcGxlIG9mIGJ1aWxkaW5nIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgYSBDYW5hZGlhbiBDcm9zcyB3b3VsZCBiZQotYnVpbGRpbmcgYSBXaW5kb3dzIGNyb3NzIE1JUFMgRUxGIGNvbXBpbGVyIG9uIGEgR05VL0xpbnV4IHN5c3RlbS4gIEluCi10aGlzIGNhc2UgdGhlIGJ1aWxkIHN5c3RlbSB3b3VsZCBiZSBHTlUvTGludXgsIHRoZSBob3N0IHN5c3RlbSB3b3VsZCBiZQotV2luZG93cywgYW5kIHRoZSB0YXJnZXQgc3lzdGVtIHdvdWxkIGJlIE1JUFMgRUxGLgotCi1UaGUgbmFtZSBDYW5hZGlhbiBDcm9zcyBjb21lcyBmcm9tIHRoZSBjYXNlIHdoZW4gdGhlIGJ1aWxkLCBob3N0LCBhbmQKLXRhcmdldCBzeXN0ZW1zIGFyZSBhbGwgZGlmZmVyZW50LiAgQXQgdGhlIHRpbWUgdGhhdCB0aGVzZSBpc3N1ZXMgd2VyZQotYWxsIGJlaW5nIGhhc2hlZCBvdXQsIENhbmFkYSBoYWQgdGhyZWUgbmF0aW9uYWwgcG9saXRpY2FsIHBhcnRpZXMuCi0KLUBub2RlIEJ1aWxkIENyb3NzIEhvc3QgVG9vbHMKLUBzZWN0aW9uIEJ1aWxkIENyb3NzIEhvc3QgVG9vbHMKLQotSW4gb3JkZXIgdG8gY29uZmlndXJlIGEgcHJvZ3JhbSBmb3IgYSBDYW5hZGlhbiBDcm9zcyBidWlsZCwgeW91IG11c3QKLWZpcnN0IGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBzZXQgb2YgY3Jvc3MgdG9vbHMgeW91IHdpbGwgdXNlIHRvIGJ1aWxkIHRoZQotcHJvZ3JhbS4KLQotVGhlc2UgdG9vbHMgd2lsbCBiZSBidWlsZCBjcm9zcyBob3N0IHRvb2xzLiAgVGhhdCBpcywgdGhleSB3aWxsIHJ1biBvbgotdGhlIGJ1aWxkIHN5c3RlbSwgYW5kIHdpbGwgcHJvZHVjZSBjb2RlIHRoYXQgcnVucyBvbiB0aGUgaG9zdCBzeXN0ZW0uCi0KLUl0IGlzIGVhc3kgdG8gY29uZnVzZSB0aGUgbWVhbmluZyBvZiBidWlsZCBhbmQgaG9zdCBoZXJlLiAgQWx3YXlzCi1yZW1lbWJlciB0aGF0IHRoZSBidWlsZCBzeXN0ZW0gaXMgd2hlcmUgeW91IGFyZSBkb2luZyB0aGUgYnVpbGQsIGFuZCB0aGUKLWhvc3Qgc3lzdGVtIGlzIHdoZXJlIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSB3aWxsIHJ1bi4gIFRoZXJlZm9yZSwgeW91Ci1uZWVkIGEgYnVpbGQgY3Jvc3MgaG9zdCBjb21waWxlci4KLQotSW4gZ2VuZXJhbCwgeW91IG11c3QgaGF2ZSBhIGNvbXBsZXRlIGNyb3NzIGVudmlyb25tZW50IGluIG9yZGVyIHRvIGRvCi10aGUgYnVpbGQuICBUaGlzIG5vcm1hbGx5IG1lYW5zIGEgY3Jvc3MgY29tcGlsZXIsIGNyb3NzIGFzc2VtYmxlciwgYW5kCi1zbyBmb3J0aCwgYXMgd2VsbCBhcyBsaWJyYXJpZXMgYW5kIGluY2x1ZGUgZmlsZXMgZm9yIHRoZSBob3N0IHN5c3RlbS4KLQotQG5vZGUgQnVpbGQgYW5kIEhvc3QgT3B0aW9ucwotQHNlY3Rpb24gQnVpbGQgYW5kIEhvc3QgT3B0aW9ucwotQGNpbmRleCBjb25maWd1cmluZyBhIGNhbmFkaWFuIGNyb3NzCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzLCBjb25maWd1cmluZwotCi1XaGVuIHlvdSBydW4gQGZpbGV7Y29uZmlndXJlfSwgeW91IG11c3QgdXNlIGJvdGggdGhlIEBzYW1wey0tYnVpbGR9IGFuZAotQHNhbXB7LS1ob3N0fSBvcHRpb25zLgotCi1AY2luZGV4IEBzYW1wey0tYnVpbGR9IG9wdGlvbgotQGNpbmRleCBidWlsZCBvcHRpb24KLUBjaW5kZXggY29uZmlndXJlIGJ1aWxkIHN5c3RlbQotVGhlIEBzYW1wey0tYnVpbGR9IG9wdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbmZpZ3VyYXRpb24gbmFtZSBvZgotdGhlIGJ1aWxkIHN5c3RlbS4gIFRoaXMgY2FuIG5vcm1hbGx5IGJlIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUKLUBmaWxle2NvbmZpZy5ndWVzc30gc2hlbGwgc2NyaXB0LCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UKLUBzYW1wey0tYnVpbGQ9YGNvbmZpZy5ndWVzc2B9LgotCi1AY2luZGV4IEBzYW1wey0taG9zdH0gb3B0aW9uCi1AY2luZGV4IGhvc3Qgb3B0aW9uCi1AY2luZGV4IGNvbmZpZ3VyZSBob3N0Ci1UaGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YKLXRoZSBob3N0IHN5c3RlbS4KLQotQXMgd2UgZXhwbGFpbmVkIGVhcmxpZXIsIEBmaWxle2NvbmZpZy5ndWVzc30gaXMgdXNlZCB0byBzZXQgdGhlIGRlZmF1bHQKLXZhbHVlIGZvciB0aGUgQHNhbXB7LS1ob3N0fSBvcHRpb24gKEBweHJlZntVc2luZyB0aGUgSG9zdCBUeXBlfSkuICBXZQotY2FuIG5vdyBzZWUgdGhhdCBzaW5jZSBAZmlsZXtjb25maWcuZ3Vlc3N9IHJldHVybnMgdGhlIHR5cGUgb2Ygc3lzdGVtIG9uCi13aGljaCBpdCBpcyBydW4sIGl0IHJlYWxseSBpZGVudGlmaWVzIHRoZSBidWlsZCBzeXN0ZW0uICBTaW5jZSB0aGUgaG9zdAotc3lzdGVtIGlzIG5vcm1hbGx5IHRoZSBzYW1lIGFzIHRoZSBidWlsZCBzeXN0ZW0gKGkuZS4sIHBlb3BsZSBkbyBub3QKLW5vcm1hbGx5IGJ1aWxkIHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIpLCBpdCBpcyByZWFzb25hYmxlIHRvIHVzZSB0aGUKLXJlc3VsdCBvZiBAZmlsZXtjb25maWcuZ3Vlc3N9IGFzIHRoZSBkZWZhdWx0IGZvciB0aGUgaG9zdCBzeXN0ZW0gd2hlbgotdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIGlzIG5vdCB1c2VkLgotCi1JdCBtaWdodCBzZWVtIHRoYXQgaWYgdGhlIEBzYW1wey0taG9zdH0gb3B0aW9uIHdlcmUgdXNlZCB3aXRob3V0IHRoZQotQHNhbXB7LS1idWlsZH0gb3B0aW9uIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY291bGQgcnVuCi1AZmlsZXtjb25maWcuZ3Vlc3N9IHRvIGRldGVybWluZSB0aGUgYnVpbGQgc3lzdGVtLCBhbmQgcHJlc3VtZSBhCi1DYW5hZGlhbiBDcm9zcyBpZiB0aGUgcmVzdWx0IG9mIEBmaWxle2NvbmZpZy5ndWVzc30gZGlmZmVyZWQgZnJvbSB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uLiAgSG93ZXZlciwgZm9yIGhpc3RvcmljYWwgcmVhc29ucywgc29tZSBjb25maWd1cmUKLXNjcmlwdHMgYXJlIHJvdXRpbmVseSBydW4gdXNpbmcgYW4gZXhwbGljaXQgQHNhbXB7LS1ob3N0fSBvcHRpb24sIHJhdGhlcgotdGhhbiB1c2luZyB0aGUgZGVmYXVsdCBmcm9tIEBmaWxle2NvbmZpZy5ndWVzc30uICBBcyBub3RlZCBlYXJsaWVyLCBpdAotaXMgZGlmZmljdWx0IG9yIGltcG9zc2libGUgdG8gcmVsaWFibHkgY29tcGFyZSBjb25maWd1cmF0aW9uIG5hbWVzCi0oQHB4cmVme1VzaW5nIHRoZSBUYXJnZXQgVHlwZX0pLiAgVGhlcmVmb3JlLCBieSBjb252ZW50aW9uLCBpZiB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uIGlzIHVzZWQsIGJ1dCB0aGUgQHNhbXB7LS1idWlsZH0gb3B0aW9uIGlzIG5vdCB1c2VkLAotdGhlbiB0aGUgYnVpbGQgc3lzdGVtIGRlZmF1bHRzIHRvIHRoZSBob3N0IHN5c3RlbS4KLQotQG5vZGUgQ0Nyb3NzIG5vdCBpbiBDeWdudXMgVHJlZQotQHNlY3Rpb24gQ2FuYWRpYW4gQ3Jvc3Mgbm90IGluIEN5Z251cyBUcmVlLgotCi1JZiB5b3UgYXJlIG5vdCB1c2luZyB0aGUgQ3lnbnVzIHRyZWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUKLWNyb3NzIHRvb2xzIHdoaWNoIHlvdSB3YW50IHRvIHVzZSB0byBidWlsZCB0aGUgcHJvZ3JhbS4gIFRoaXMgaXMgZG9uZSBieQotc2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHJ1bm5pbmcgdGhlIEBmaWxle2NvbmZpZ3VyZX0KLXNjcmlwdC4KLQotWW91IG11c3Qgbm9ybWFsbHkgc2V0IGF0IGxlYXN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQHNhbXB7Q0N9LAotQHNhbXB7QVJ9LCBhbmQgQHNhbXB7UkFOTElCfSB0byB0aGUgY3Jvc3MgdG9vbHMgd2hpY2ggeW91IHdhbnQgdG8gdXNlIHRvCi1idWlsZC4KLQotRm9yIHNvbWUgcHJvZ3JhbXMsIHlvdSBtdXN0IHNldCBhZGRpdGlvbmFsIGNyb3NzIHRvb2xzIGFzIHdlbGwsIHN1Y2ggYXMKLUBzYW1we0FTfSwgQHNhbXB7TER9LCBvciBAc2FtcHtOTX0uCi0KLVlvdSB3b3VsZCBzZXQgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHRoZSBidWlsZCBjcm9zcyB0b29scyB3aGljaAoteW91IGFyZSBnb2luZyB0byB1c2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEgU29sYXJpcyBwcm9ncmFtIG9uIGEgR05VL0xpbnV4Ci1zeXN0ZW0sIGFuZCB5b3VyIEdOVS9MaW51eCBjcm9zcyBTb2xhcmlzIGNvbXBpbGVyIHdlcmUgbmFtZWQKLUBzYW1we3NvbGFyaXMtZ2NjfSwgdGhlbiB5b3Ugd291bGQgc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQHNhbXB7Q0N9IHRvIEBzYW1we3NvbGFyaXMtZ2NjfS4KLQotQG5vZGUgQ0Nyb3NzIGluIEN5Z251cyBUcmVlCi1Ac2VjdGlvbiBDYW5hZGlhbiBDcm9zcyBpbiBDeWdudXMgVHJlZQotQGNpbmRleCBjYW5hZGlhbiBjcm9zcyBpbiBjeWdudXMgdHJlZQotCi1UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyBhIENhbmFkaWFuIENyb3NzIHdoZW4KLXVzaW5nIHRoZSBDeWdudXMgdHJlZS4KLQotQG1lbnUKLSogU3RhbmRhcmQgQ3lnbnVzIENDcm9zczo6CUJ1aWxkaW5nIGEgTm9ybWFsIFByb2dyYW0uCi0qIENyb3NzIEN5Z251cyBDQ3Jvc3M6OgkJQnVpbGRpbmcgYSBDcm9zcyBQcm9ncmFtLgotQGVuZCBtZW51Ci0KLUBub2RlIFN0YW5kYXJkIEN5Z251cyBDQ3Jvc3MKLUBzdWJzZWN0aW9uIEJ1aWxkaW5nIGEgTm9ybWFsIFByb2dyYW0KLQotV2hlbiBjb25maWd1cmluZyBhIENhbmFkaWFuIENyb3NzIGluIHRoZSBDeWdudXMgdHJlZSwgYWxsIHRoZQotYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IHNldCB0bwotQHNhbXB7QHZhcntob3N0fS1AdmFye3Rvb2x9fSwgd2hlcmUgQHZhcntob3N0fSBpcyB0aGUgdmFsdWUgdXNlZCBmb3IgdGhlCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiwgYW5kIEB2YXJ7dG9vbH0gaXMgdGhlIG5hbWUgb2YgdGhlIHRvb2wgKGUuZy4sCi1Ac2FtcHtnY2N9LCBAc2FtcHthc30sIGV0Yy4pLiAgVGhlc2UgdG9vbHMgbXVzdCBiZSBvbiB5b3VyIEBzYW1we1BBVEh9LgotCi1BZGRpbmcgYSBwcmVmaXggb2YgQHZhcntob3N0fSB3aWxsIGdpdmUgdGhlIHVzdWFsIG5hbWUgZm9yIHRoZSBidWlsZAotY3Jvc3MgaG9zdCB0b29scy4gIFRvIHNlZSB0aGlzLCBjb25zaWRlciB0aGF0IHdoZW4gdGhlc2UgY3Jvc3MgdG9vbHMKLXdlcmUgYnVpbHQsIHRoZXkgd2VyZSBjb25maWd1cmVkIHRvIHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtIGFuZCB0bwotcHJvZHVjZSBjb2RlIGZvciB0aGUgaG9zdCBzeXN0ZW0uICBUaGF0IGlzLCB0aGV5IHdlcmUgY29uZmlndXJlZCB3aXRoIGEKLUBzYW1wey0tdGFyZ2V0fSBvcHRpb24gdGhhdCBpcyB0aGUgc2FtZSBhcyB0aGUgc3lzdGVtIHdoaWNoIHdlIGFyZSBub3cKLWNhbGxpbmcgdGhlIGhvc3QuICBSZWNhbGwgdGhhdCB0aGUgZGVmYXVsdCBuYW1lIGZvciBpbnN0YWxsZWQgY3Jvc3MKLXRvb2xzIHVzZXMgdGhlIHRhcmdldCBzeXN0ZW0gYXMgYSBwcmVmaXggKEBweHJlZntVc2luZyB0aGUgVGFyZ2V0Ci1UeXBlfSkuICBTaW5jZSB0aGF0IGlzIHRoZSBzeXN0ZW0gd2hpY2ggd2UgYXJlIG5vdyBjYWxsaW5nIHRoZSBob3N0LAotQHZhcntob3N0fSBpcyB0aGUgcmlnaHQgcHJlZml4IHRvIHVzZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBjb25maWd1cmUgd2l0aCBAc2FtcHstLWJ1aWxkPWkzODYtbGludXgtZ251fSBhbmQKLUBzYW1wey0taG9zdD1zb2xhcmlzfSwgdGhlbiB0aGUgQ3lnbnVzIHRyZWUgd2lsbCBhdXRvbWF0aWNhbGx5IGRlZmF1bHQKLXRvIHVzaW5nIHRoZSBjb21waWxlciBAc2FtcHtzb2xhcmlzLWdjY30uICBZb3UgbXVzdCBoYXZlIHByZXZpb3VzbHkKLWJ1aWx0IGFuZCBpbnN0YWxsZWQgdGhpcyBjb21waWxlciwgcHJvYmFibHkgYnkgZG9pbmcgYSBidWlsZCB3aXRoIG5vCi1Ac2FtcHstLWhvc3R9IG9wdGlvbiBhbmQgd2l0aCBhIEBzYW1wey0tdGFyZ2V0fSBvcHRpb24gb2YKLUBzYW1we3NvbGFyaXN9LgotCi1Abm9kZSBDcm9zcyBDeWdudXMgQ0Nyb3NzCi1Ac3Vic2VjdGlvbiBCdWlsZGluZyBhIENyb3NzIFByb2dyYW0KLQotVGhlcmUgYXJlIGFkZGl0aW9uYWwgY29uc2lkZXJhdGlvbnMgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBjcm9zcwotY29tcGlsZXIsIHJhdGhlciB0aGFuIGEgbmF0aXZlIGNvbXBpbGVyLCBpbiB0aGUgQ3lnbnVzIHRyZWUgdXNpbmcgYQotQ2FuYWRpYW4gQ3Jvc3MuCi0KLVdoZW4geW91IGJ1aWxkIGEgY3Jvc3MgY29tcGlsZXIgdXNpbmcgdGhlIEN5Z251cyB0cmVlLCB0aGVuIHRoZSB0YXJnZXQKLWxpYnJhcmllcyB3aWxsIG5vcm1hbGx5IGJlIGJ1aWx0IHdpdGggdGhlIG5ld2x5IGJ1aWx0IHRhcmdldCBjb21waWxlcgotKEBweHJlZntIb3N0IGFuZCBUYXJnZXQgTGlicmFyaWVzfSkuICBIb3dldmVyLCB0aGlzIHdpbGwgbm90IHdvcmsgd2hlbgotYnVpbGRpbmcgd2l0aCBhIENhbmFkaWFuIENyb3NzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBuZXdseSBidWlsdCB0YXJnZXQKLWNvbXBpbGVyIHdpbGwgYmUgYSBwcm9ncmFtIHdoaWNoIHJ1bnMgb24gdGhlIGhvc3Qgc3lzdGVtLCBhbmQgdGhlcmVmb3JlCi13aWxsIG5vdCBiZSBhYmxlIHRvIHJ1biBvbiB0aGUgYnVpbGQgc3lzdGVtLgotCi1UaGVyZWZvcmUsIHdoZW4gYnVpbGRpbmcgYSBjcm9zcyBjb21waWxlciB3aXRoIHRoZSBDeWdudXMgdHJlZSwgeW91IG11c3QKLWZpcnN0IGluc3RhbGwgYSBzZXQgb2YgYnVpbGQgY3Jvc3MgdGFyZ2V0IHRvb2xzLiAgVGhlc2UgdG9vbHMgd2lsbCBiZQotdXNlZCB3aGVuIGJ1aWxkaW5nIHRoZSB0YXJnZXQgbGlicmFyaWVzLgotCi1Ob3RlIHRoYXQgdGhpcyBpcyBub3QgYSByZXF1aXJlbWVudCBvZiBhIENhbmFkaWFuIENyb3NzIGluIGdlbmVyYWwuICBGb3IKLWV4YW1wbGUsIGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGJ1aWxkIGp1c3QgdGhlIGhvc3QgY3Jvc3MgdGFyZ2V0IHRvb2xzCi1vbiB0aGUgYnVpbGQgc3lzdGVtLCB0byBjb3B5IHRoZSB0b29scyB0byB0aGUgaG9zdCBzeXN0ZW0sIGFuZCB0byBidWlsZAotdGhlIHRhcmdldCBsaWJyYXJpZXMgb24gdGhlIGhvc3Qgc3lzdGVtLiAgVGhlIHJlcXVpcmVtZW50IGZvciBidWlsZAotY3Jvc3MgdGFyZ2V0IHRvb2xzIGlzIGltcG9zZWQgYnkgdGhlIEN5Z251cyB0cmVlLCB3aGljaCBleHBlY3RzIHRvIGJlCi1hYmxlIHRvIGJ1aWxkIGJvdGggaG9zdCBwcm9ncmFtcyBhbmQgdGFyZ2V0IGxpYnJhcmllcyBpbiBhIHNpbmdsZQotQHNhbXB7Y29uZmlndXJlfS9Ac2FtcHttYWtlfSBzdGVwLiAgQmVjYXVzZSBpdCBidWlsZHMgdGhlc2UgaW4gYSBzaW5nbGUKLXN0ZXAsIGl0IGV4cGVjdHMgdG8gYmUgYWJsZSB0byBidWlsZCB0aGUgdGFyZ2V0IGxpYnJhcmllcyBvbiB0aGUgYnVpbGQKLXN5c3RlbSwgd2hpY2ggbWVhbnMgdGhhdCBpdCBtdXN0IHVzZSBhIGJ1aWxkIGNyb3NzIHRhcmdldCB0b29sY2hhaW4uCi0KLUZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSB3YW50IHRvIGJ1aWxkIGEgV2luZG93cyBjcm9zcyBNSVBTIEVMRiBjb21waWxlcgotb24gYSBHTlUvTGludXggc3lzdGVtLiAgWW91IG11c3QgaGF2ZSBwcmV2aW91c2x5IGluc3RhbGxlZCBib3RoIGEKLUdOVS9MaW51eCBjcm9zcyBXaW5kb3dzIGNvbXBpbGVyIGFuZCBhIEdOVS9MaW51eCBjcm9zcyBNSVBTIEVMRgotY29tcGlsZXIuCi0KLUluIG9yZGVyIHRvIGJ1aWxkIHRoZSBXaW5kb3dzIChjb25maWd1cmF0aW9uIG5hbWUgQHNhbXB7aTM4Ni1jeWd3aW4zMn0pCi1jcm9zcyBNSVBTIEVMRiAoY29uZmlndXJlIG5hbWUgQHNhbXB7bWlwcy1lbGZ9KSBjb21waWxlciwgeW91IG1pZ2h0Ci1leGVjdXRlIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgKGxvbmcgY29tbWFuZCBsaW5lcyBhcmUgYnJva2VuIGFjcm9zcwotbGluZXMgd2l0aCBhIHRyYWlsaW5nIGJhY2tzbGFzaCBhcyBhIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIpLgotCi1AZXhhbXBsZQotbWtkaXIgbGludXgteC1jeWd3aW4zMgotY2QgbGludXgteC1jeWd3aW4zMgotQHZhcntzcmNkaXJ9L2NvbmZpZ3VyZSAtLXRhcmdldCBpMzg2LWN5Z3dpbjMyIC0tcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0gXAotICAtLWV4ZWMtcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0vSC1pMzg2LWxpbnV4Ci1tYWtlCi1tYWtlIGluc3RhbGwKLWNkIC4uCi1ta2RpciBsaW51eC14LW1pcHMtZWxmCi1jZCBsaW51eC14LW1pcHMtZWxmCi1AdmFye3NyY2Rpcn0vY29uZmlndXJlIC0tdGFyZ2V0IG1pcHMtZWxmIC0tcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0gXAotICAtLWV4ZWMtcHJlZml4PUB2YXJ7aW5zdGFsbGRpcn0vSC1pMzg2LWxpbnV4Ci1tYWtlCi1tYWtlIGluc3RhbGwKLWNkIC4uCi1ta2RpciBjeWd3aW4zMi14LW1pcHMtZWxmCi1jZCBjeWd3aW4zMi14LW1pcHMtZWxmCi1AdmFye3NyY2Rpcn0vY29uZmlndXJlIC0tYnVpbGQ9aTM4Ni1saW51eC1nbnUgLS1ob3N0PWkzODYtY3lnd2luMzIgXAotICAtLXRhcmdldD1taXBzLWVsZiAtLXByZWZpeD1AdmFye3dpbmluc3RhbGxkaXJ9IFwKLSAgLS1leGVjLXByZWZpeD1AdmFye3dpbmluc3RhbGxkaXJ9L0gtaTM4Ni1jeWd3aW4zMgotbWFrZQotbWFrZSBpbnN0YWxsCi1AZW5kIGV4YW1wbGUKLQotWW91IHdvdWxkIHRoZW4gY29weSB0aGUgY29udGVudHMgb2YgQHZhcnt3aW5pbnN0YWxsZGlyfSBvdmVyIHRvIHRoZQotV2luZG93cyBtYWNoaW5lLCBhbmQgcnVuIHRoZSByZXN1bHRpbmcgcHJvZ3JhbXMuCi0KLUBub2RlIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MKLUBzZWN0aW9uIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MKLQotSWYgeW91IHdhbnQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBidWlsZCBhIHByb2dyYW0geW91IGFyZSBkZXZlbG9waW5nCi11c2luZyBhIENhbmFkaWFuIENyb3NzLCB5b3UgbXVzdCB0YWtlIHNvbWUgY2FyZSB3aGVuIHdyaXRpbmcgeW91cgotY29uZmlndXJlIGFuZCBtYWtlIHJ1bGVzLiAgU2ltcGxlIGNhc2VzIHdpbGwgbm9ybWFsbHkgd29yayBjb3JyZWN0bHkuCi1Ib3dldmVyLCBpdCBpcyBub3QgaGFyZCB0byB3cml0ZSBjb25maWd1cmUgYW5kIG1ha2UgdGVzdHMgd2hpY2ggd2lsbAotZmFpbCBpbiBhIENhbmFkaWFuIENyb3NzLgotCi1AbWVudQotKiBDQ3Jvc3MgaW4gQ29uZmlndXJlOjoJCVN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gQ29uZmlndXJlIFNjcmlwdHMuCi0qIENDcm9zcyBpbiBNYWtlOjoJCVN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gTWFrZWZpbGVzLgotQGVuZCBtZW51Ci0KLUBub2RlIENDcm9zcyBpbiBDb25maWd1cmUKLUBzdWJzZWN0aW9uIFN1cHBvcnRpbmcgQ2FuYWRpYW4gQ3Jvc3MgaW4gQ29uZmlndXJlIFNjcmlwdHMKLUBjaW5kZXggY2FuYWRpYW4gY3Jvc3MgaW4gY29uZmlndXJlCi0KLUluIGEgQGZpbGV7Y29uZmlndXJlLmlufSBmaWxlLCBhZnRlciBjYWxsaW5nIEBzYW1we0FDX1BST0dfQ0N9LCB5b3UgY2FuCi1maW5kIG91dCB3aGV0aGVyIHRoaXMgaXMgYSBDYW5hZGlhbiBDcm9zcyBjb25maWd1cmUgYnkgZXhhbWluaW5nIHRoZQotc2hlbGwgdmFyaWFibGUgQHNhbXB7Y3Jvc3NfY29tcGlsaW5nfS4gIEluIGEgQ2FuYWRpYW4gQ3Jvc3MsIHdoaWNoIG1lYW5zCi10aGF0IHRoZSBjb21waWxlciBpcyBhIGNyb3NzIGNvbXBpbGVyLCBAc2FtcHtjcm9zc19jb21waWxpbmd9IHdpbGwgYmUKLUBzYW1we3llc30uICBJbiBhIG5vcm1hbCBjb25maWd1cmF0aW9uLCBAc2FtcHtjcm9zc19jb21waWxpbmd9IHdpbGwgYmUKLUBzYW1we25vfS4KLQotWW91IG9yZGluYXJpbHkgZG8gbm90IG5lZWQgdG8ga25vdyB0aGUgdHlwZSBvZiB0aGUgYnVpbGQgc3lzdGVtIGluIGEKLWNvbmZpZ3VyZSBzY3JpcHQuICBIb3dldmVyLCBpZiB5b3UgZG8gbmVlZCB0aGF0IGluZm9ybWF0aW9uLCB5b3UgY2FuIGdldAotaXQgYnkgdXNpbmcgdGhlIG1hY3JvIEBzYW1we0FDX0NBTk9OSUNBTF9TWVNURU19LCB0aGUgc2FtZSBtYWNybyB0aGF0IGlzCi11c2VkIHRvIGRldGVybWluZSB0aGUgdGFyZ2V0IHN5c3RlbS4gIFRoaXMgbWFjcm8gd2lsbCBzZXQgdGhlIHZhcmlhYmxlcwotQHNhbXB7YnVpbGR9LCBAc2FtcHtidWlsZF9hbGlhc30sIEBzYW1we2J1aWxkX2NwdX0sIEBzYW1we2J1aWxkX3ZlbmRvcn0sCi1hbmQgQHNhbXB7YnVpbGRfb3N9LCB3aGljaCBjb3JyZXNwb25kIHRvIHRoZSBzaW1pbGFyIEBzYW1we3RhcmdldH0gYW5kCi1Ac2FtcHtob3N0fSB2YXJpYWJsZXMsIGV4Y2VwdCB0aGF0IHRoZXkgZGVzY3JpYmUgdGhlIGJ1aWxkIHN5c3RlbS4KLQotV2hlbiB3cml0aW5nIHRlc3RzIGluIEBmaWxle2NvbmZpZ3VyZS5pbn0sIHlvdSBtdXN0IHJlbWVtYmVyIHRoYXQgeW91Ci13YW50IHRvIHRlc3QgdGhlIGhvc3QgZW52aXJvbm1lbnQsIG5vdCB0aGUgYnVpbGQgZW52aXJvbm1lbnQuCi0KLU1hY3JvcyBsaWtlIEBzYW1we0FDX0NIRUNLX0ZVTkNTfSB3aGljaCB1c2UgdGhlIGNvbXBpbGVyIHdpbGwgdGVzdCB0aGUKLWhvc3QgZW52aXJvbm1lbnQuICBUaGF0IGlzIGJlY2F1c2UgdGhlIHRlc3RzIHdpbGwgYmUgZG9uZSBieSBydW5uaW5nIHRoZQotY29tcGlsZXIsIHdoaWNoIGlzIGFjdHVhbGx5IGEgYnVpbGQgY3Jvc3MgaG9zdCBjb21waWxlci4gIElmIHRoZQotY29tcGlsZXIgY2FuIGZpbmQgdGhlIGZ1bmN0aW9uLCB0aGF0IG1lYW5zIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIHByZXNlbnQKLWluIHRoZSBob3N0IGVudmlyb25tZW50LgotCi1UZXN0cyBsaWtlIEBzYW1we3Rlc3QgLWYgL2Rldi9wdHlwMH0sIG9uIHRoZSBvdGhlciBoYW5kLCB3aWxsIHRlc3QgdGhlCi1idWlsZCBlbnZpcm9ubWVudC4gIFJlbWVtYmVyIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVubmluZyBvbiB0aGUKLWJ1aWxkIHN5c3RlbSwgbm90IHRoZSBob3N0IHN5c3RlbS4gIElmIHlvdXIgY29uZmlndXJlIHNjcmlwdHMgZXhhbWluZXMKLWZpbGVzLCB0aG9zZSBmaWxlcyB3aWxsIGJlIG9uIHRoZSBidWlsZCBzeXN0ZW0uICBXaGF0ZXZlciB5b3UgZGV0ZXJtaW5lCi1iYXNlZCBvbiB0aG9zZSBmaWxlcyBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgY2FzZSBvbiB0aGUgaG9zdCBzeXN0ZW0uCi0KLU1vc3QgYXV0b2NvbmYgbWFjcm9zIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIGEgQ2FuYWRpYW4gQ3Jvc3MuICBUaGUgbWFpbgotZXhjZXB0aW9uIGlzIEBzYW1we0FDX1RSWV9SVU59LiAgVGhpcyBtYWNybyB0cmllcyB0byBjb21waWxlIGFuZCBydW4gYQotdGVzdCBwcm9ncmFtLiAgVGhpcyB3aWxsIGZhaWwgaW4gYSBDYW5hZGlhbiBDcm9zcywgYmVjYXVzZSB0aGUgcHJvZ3JhbQotd2lsbCBiZSBjb21waWxlZCBmb3IgdGhlIGhvc3Qgc3lzdGVtLCB3aGljaCBtZWFucyB0aGF0IGl0IHdpbGwgbm90IHJ1bgotb24gdGhlIGJ1aWxkIHN5c3RlbS4KLQotVGhlIEBzYW1we0FDX1RSWV9SVU59IG1hY3JvIHByb3ZpZGVzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHRlbGwgdGhlCi1jb25maWd1cmUgc2NyaXB0IHdoYXQgdG8gZG8gaW4gYSBDYW5hZGlhbiBDcm9zcy4gIElmIHRoYXQgYXJndW1lbnQgaXMKLW5vdCBwcmVzZW50LCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIHdoZW4geW91IHJ1biBAc2FtcHthdXRvY29uZn06Ci1Ac21hbGxleGFtcGxlCi13YXJuaW5nOiBBQ19UUllfUlVOIGNhbGxlZCB3aXRob3V0IGRlZmF1bHQgdG8gYWxsb3cgY3Jvc3MgY29tcGlsaW5nCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHRlbGxzIHlvdSB0aGF0IHRoZSByZXN1bHRpbmcgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgd2lsbCBub3Qgd29yawotd2l0aCBhIENhbmFkaWFuIENyb3NzLgotCi1JbiBzb21lIGNhc2VzIHdoaWxlIGl0IG1heSBiZXR0ZXIgdG8gcGVyZm9ybSBhIHRlc3QgYXQgY29uZmlndXJlIHRpbWUsCi1pdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHBlcmZvcm0gdGhlIHRlc3QgYXQgcnVuIHRpbWUuICBJbiBzdWNoIGEgY2FzZSB5b3UKLWNhbiB1c2UgdGhlIGNyb3NzIGNvbXBpbGluZyBhcmd1bWVudCB0byBAc2FtcHtBQ19UUllfUlVOfSB0byB0ZWxsIHlvdXIKLXByb2dyYW0gdGhhdCB0aGUgdGVzdCBjb3VsZCBub3QgYmUgcGVyZm9ybWVkIGF0IGNvbmZpZ3VyZSB0aW1lLgotCi1UaGVyZSBhcmUgYSBmZXcgb3RoZXIgYXV0b2NvbmYgbWFjcm9zIHdoaWNoIHdpbGwgbm90IHdvcmsgY29ycmVjdGx5IHdpdGgKLWEgQ2FuYWRpYW4gQ3Jvc3M6IGEgcGFydGlhbCBsaXN0IGlzIEBzYW1we0FDX0ZVTkNfR0VUUEdSUH0sCi1Ac2FtcHtBQ19GVU5DX1NFVFBHUlB9LCBAc2FtcHtBQ19GVU5DX1NFVFZCVUZfUkVWRVJTRUR9LCBhbmQKLUBzYW1we0FDX1NZU19SRVNUQVJUQUJMRV9TWVNDQUxMU30uICBUaGUgQHNhbXB7QUNfQ0hFQ0tfU0laRU9GfSBtYWNybyBpcwotZ2VuZXJhbGx5IG5vdCB2ZXJ5IHVzZWZ1bCB3aXRoIGEgQ2FuYWRpYW4gQ3Jvc3M7IGl0IHBlcm1pdHMgYW4gb3B0aW9uYWwKLWFyZ3VtZW50IGluZGljYXRpbmcgdGhlIGRlZmF1bHQgc2l6ZSwgYnV0IHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoYXQKLXRoZSBjb3JyZWN0IGRlZmF1bHQgc2hvdWxkIGJlLgotCi1Abm9kZSBDQ3Jvc3MgaW4gTWFrZQotQHN1YnNlY3Rpb24gU3VwcG9ydGluZyBDYW5hZGlhbiBDcm9zcyBpbiBNYWtlZmlsZXMuCi1AY2luZGV4IGNhbmFkaWFuIGNyb3NzIGluIG1ha2VmaWxlCi0KLVRoZSBtYWluIENhbmFkaWFuIENyb3NzIGlzc3VlIGluIGEgQGZpbGV7TWFrZWZpbGV9IGFyaXNlcyB3aGVuIHlvdSB3YW50Ci10byB1c2UgYSBzdWJzaWRpYXJ5IHByb2dyYW0gdG8gZ2VuZXJhdGUgY29kZSBvciBkYXRhIHdoaWNoIHlvdSB3aWxsIHRoZW4KLWluY2x1ZGUgaW4geW91ciByZWFsIHByb2dyYW0uCi0KLUlmIHlvdSBjb21waWxlIHRoaXMgc3Vic2lkaWFyeSBwcm9ncmFtIHVzaW5nIEBzYW1weyQoQ0MpfSBpbiB0aGUgdXN1YWwKLXdheSwgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gcnVuIGl0LiAgVGhpcyBpcyBiZWNhdXNlIEBzYW1weyQoQ0MpfSB3aWxsCi1idWlsZCBhIHByb2dyYW0gZm9yIHRoZSBob3N0IHN5c3RlbSwgYnV0IHRoZSBwcm9ncmFtIGlzIGJlaW5nIGJ1aWx0IG9uCi10aGUgYnVpbGQgc3lzdGVtLgotCi1Zb3UgbXVzdCBpbnN0ZWFkIHVzZSBhIGNvbXBpbGVyIGZvciB0aGUgYnVpbGQgc3lzdGVtLCByYXRoZXIgdGhhbiB0aGUKLWhvc3Qgc3lzdGVtLiAgSW4gdGhlIEN5Z251cyB0cmVlLCB0aGlzIG1ha2UgdmFyaWFibGUKLUBzYW1weyQoQ0NfRk9SX0JVSUxEKX0gd2lsbCBob2xkIGEgY29tcGlsZXIgZm9yIHRoZSBidWlsZCBzeXN0ZW0uCi0KLU5vdGUgdGhhdCB5b3Ugc2hvdWxkIG5vdCBpbmNsdWRlIEBmaWxle2NvbmZpZy5ofSBpbiBhIGZpbGUgeW91IGFyZQotY29tcGlsaW5nIHdpdGggQHNhbXB7JChDQ19GT1JfQlVJTEQpfS4gIFRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCB3aWxsCi1idWlsZCBAZmlsZXtjb25maWcuaH0gd2l0aCBpbmZvcm1hdGlvbiBmb3IgdGhlIGhvc3Qgc3lzdGVtLiAgSG93ZXZlciwKLXlvdSBhcmUgY29tcGlsaW5nIHRoZSBmaWxlIHVzaW5nIGEgY29tcGlsZXIgZm9yIHRoZSBidWlsZCBzeXN0ZW0gKGEKLW5hdGl2ZSBjb21waWxlcikuICBTdWJzaWRpYXJ5IHByb2dyYW1zIGFyZSBub3JtYWxseSBzaW1wbGUgZmlsdGVycyB3aGljaAotZG8gbm8gdXNlciBpbnRlcmFjdGlvbiwgYW5kIGl0IGlzIG5vcm1hbGx5IHBvc3NpYmxlIHRvIHdyaXRlIHRoZW0gaW4gYQotaGlnaGx5IHBvcnRhYmxlIGZhc2hpb24gc28gdGhhdCB0aGUgYWJzZW5jZSBvZiBAZmlsZXtjb25maWcuaH0gaXMgbm90Ci1jcnVjaWFsLgotCi1AY2luZGV4IEBzYW1we0hPU1RfQ0N9Ci1UaGUgZ2NjIEBmaWxle01ha2VmaWxlLmlufSBzaG93cyBhIGNvbXBsZXggc2l0dWF0aW9uIGluIHdoaWNoIGNlcnRhaW4KLWZpbGVzLCBzdWNoIGFzIEBmaWxle3J0bC5jfSwgbXVzdCBiZSBjb21waWxlZCBpbnRvIGJvdGggc3Vic2lkaWFyeQotcHJvZ3JhbXMgcnVuIG9uIHRoZSBidWlsZCBzeXN0ZW0gYW5kIGludG8gdGhlIGZpbmFsIHByb2dyYW0uICBUaGlzCi1hcHByb2FjaCBtYXkgYmUgb2YgaW50ZXJlc3QgZm9yIGFkdmFuY2VkIGJ1aWxkIHN5c3RlbSBoYWNrZXJzLiAgTm90ZQotdGhhdCB0aGUgYnVpbGQgc3lzdGVtIGNvbXBpbGVyIGlzIHJhdGhlciBjb25mdXNpbmdseSBjYWxsZWQKLUBzYW1we0hPU1RfQ0N9LgotCi1Abm9kZSBDeWdudXMgQ29uZmlndXJlCi1AY2hhcHRlciBDeWdudXMgQ29uZmlndXJlCi1AY2luZGV4IGN5Z251cyBjb25maWd1cmUKLQotVGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0IHByZWRhdGVzIGF1dG9jb25mLiAgQWxsIG9mIGl0cyBpbnRlcmVzdGluZwotZmVhdHVyZXMgaGF2ZSBiZWVuIGluY29ycG9yYXRlZCBpbnRvIGF1dG9jb25mLiAgTm8gbmV3IHByb2dyYW1zIHNob3VsZAotYmUgd3JpdHRlbiB0byB1c2UgdGhlIEN5Z251cyBjb25maWd1cmUgc2NyaXB0LgotCi1Ib3dldmVyLCB0aGUgQ3lnbnVzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgc3RpbGwgdXNlZCBpbiBhIGZldyBwbGFjZXM6IGF0Ci10aGUgdG9wIG9mIHRoZSBDeWdudXMgdHJlZSBhbmQgaW4gYSBmZXcgdGFyZ2V0IGxpYnJhcmllcyBpbiB0aGUgQ3lnbnVzCi10cmVlLiAgVW50aWwgdGhvc2UgdXNlcyBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBhdXRvY29uZiwgc29tZSBicmllZgotbm90ZXMgYXJlIGFwcHJvcHJpYXRlIGhlcmUuICBUaGlzIGlzIG5vdCBjb21wbGV0ZSBkb2N1bWVudGF0aW9uLCBidXQgaXQKLXNob3VsZCBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyBhcyBhIGd1aWRlIHdoaWxlIGV4YW1pbmluZyB0aGUgc2NyaXB0cwotdGhlbXNlbHZlcy4KLQotQG1lbnUKLSogQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3M6OgkJQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3MuCi0qIEN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllczo6CUN5Z251cyBDb25maWd1cmUgaW4gQysrIExpYnJhcmllcy4KLUBlbmQgbWVudQotCi1Abm9kZSBDeWdudXMgQ29uZmlndXJlIEJhc2ljcwotQHNlY3Rpb24gQ3lnbnVzIENvbmZpZ3VyZSBCYXNpY3MKLQotQ3lnbnVzIGNvbmZpZ3VyZSBkb2VzIG5vdCB1c2UgYW55IGdlbmVyYXRlZCBmaWxlczsgdGhlcmUgaXMgbm8gcHJvZ3JhbQotY29ycmVzcG9uZGluZyB0byBAc2FtcHthdXRvY29uZn0uICBJbnN0ZWFkLCB0aGVyZSBpcyBhIHNpbmdsZSBzaGVsbAotc2NyaXB0IG5hbWVkIEBzYW1we2NvbmZpZ3VyZX0gd2hpY2ggbWF5IGJlIGZvdW5kIGF0IHRoZSB0b3Agb2YgdGhlCi1DeWdudXMgdHJlZS4gIFRoaXMgc2hlbGwgc2NyaXB0IHdhcyB3cml0dGVuIGJ5IGhhbmQ7IGl0IHdhcyBub3QKLWdlbmVyYXRlZCBieSBhdXRvY29uZiwgYW5kIGl0IGlzIGluY29ycmVjdCwgYW5kIGluZGVlZCBoYXJtZnVsLCB0byBydW4KLUBzYW1we2F1dG9jb25mfSBpbiB0aGUgdG9wIGxldmVsIG9mIGEgQ3lnbnVzIHRyZWUuCi0KLUN5Z251cyBjb25maWd1cmUgd29ya3MgaW4gYSBwYXJ0aWN1bGFyIGRpcmVjdG9yeSBieSBleGFtaW5pbmcgdGhlIGZpbGUKLUBmaWxle2NvbmZpZ3VyZS5pbn0gaW4gdGhhdCBkaXJlY3RvcnkuICBUaGF0IGZpbGUgaXMgYnJva2VuIGludG8gZm91cgotc2VwYXJhdGUgc2hlbGwgc2NyaXB0cy4KLQotVGhlIGZpcnN0IGlzIHRoZSBjb250ZW50cyBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0Ci1zdGFydHMgd2l0aCBAc2FtcHsjIHBlci1ob3N0On0uICBUaGlzIGlzIHRoZSBjb21tb24gcGFydC4KLQotVGhlIHNlY29uZCBpcyB0aGUgcmVzdCBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0IHN0YXJ0cwotd2l0aCBAc2FtcHsjIHBlci10YXJnZXQ6fS4gIFRoaXMgaXMgdGhlIHBlciBob3N0IHBhcnQuCi0KLVRoZSB0aGlyZCBpcyB0aGUgcmVzdCBvZiBAZmlsZXtjb25maWd1cmUuaW59IHVwIHRvIGEgbGluZSB0aGF0IHN0YXJ0cwotd2l0aCBAc2FtcHsjIHBvc3QtdGFyZ2V0On0uICBUaGlzIGlzIHRoZSBwZXIgdGFyZ2V0IHBhcnQuCi0KLVRoZSBmb3VydGggaXMgdGhlIHJlbWFpbmRlciBvZiBAZmlsZXtjb25maWd1cmUuaW59LiAgVGhpcyBpcyB0aGUgcG9zdAotdGFyZ2V0IHBhcnQuCi0KLUlmIGFueSBvZiB0aGVzZSBjb21tZW50IGxpbmVzIGFyZSBtaXNzaW5nLCB0aGUgY29ycmVzcG9uZGluZyBzaGVsbAotc2NyaXB0IGlzIGVtcHR5LgotCi1DeWdudXMgY29uZmlndXJlIHdpbGwgZmlyc3QgZXhlY3V0ZSB0aGUgY29tbW9uIHBhcnQuICBUaGlzIG11c3Qgc2V0IHRoZQotc2hlbGwgdmFyaWFibGUgQHNhbXB7c3JjdHJpZ2dlcn0gdG8gdGhlIG5hbWUgb2YgYSBzb3VyY2UgZmlsZSwgdG8KLWNvbmZpcm0gdGhhdCBDeWdudXMgY29uZmlndXJlIGlzIGxvb2tpbmcgYXQgdGhlIHJpZ2h0IGRpcmVjdG9yeS4gIFRoaXMKLW1heSBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlcyBAc2FtcHtwYWNrYWdlX21ha2VmaWxlX2ZyYWd9IGFuZAotQHNhbXB7cGFja2FnZV9tYWtlZmlsZV9ydWxlc19mcmFnfS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIG5leHQgc2V0IHRoZSBAc2FtcHtidWlsZH0gYW5kIEBzYW1we2hvc3R9IHNoZWxsCi12YXJpYWJsZXMsIGFuZCBleGVjdXRlIHRoZSBwZXIgaG9zdCBwYXJ0LiAgVGhpcyBtYXkgc2V0IHRoZSBzaGVsbAotdmFyaWFibGUgQHNhbXB7aG9zdF9tYWtlZmlsZV9mcmFnfS4KLQotQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIG5leHQgc2V0IHRoZSBAc2FtcHt0YXJnZXR9IHZhcmlhYmxlLCBhbmQgZXhlY3V0ZQotdGhlIHBlciB0YXJnZXQgcGFydC4gIFRoaXMgbWF5IHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBzYW1we3RhcmdldF9tYWtlZmlsZV9mcmFnfS4KLQotQW55IG9mIHRoZXNlIHNjcmlwdHMgbWF5IHNldCB0aGUgQHNhbXB7c3ViZGlyc30gc2hlbGwgdmFyaWFibGUuICBUaGlzCi12YXJpYWJsZSBpcyBhIGxpc3Qgb2Ygc3ViZGlyZWN0b3JpZXMgd2hlcmUgYSBAZmlsZXtNYWtlZmlsZS5pbn0gZmlsZSBtYXkKLWJlIGZvdW5kLiAgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGF1dG9tYXRpY2FsbHkgbG9vayBmb3IgYQotQGZpbGV7TWFrZWZpbGUuaW59IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgVGhlIEBzYW1we3N1YmRpcnN9Ci1zaGVsbCB2YXJpYWJsZSBpcyBub3Qgbm9ybWFsbHkgdXNlZCwgYW5kIEkgYmVsaWV2ZSB0aGF0IHRoZSBvbmx5Ci1kaXJlY3Rvcnkgd2hpY2ggdXNlcyBpdCBhdCBwcmVzZW50IGlzIEBmaWxle25ld2xpYn0uCi0KLUZvciBlYWNoIEBmaWxle01ha2VmaWxlLmlufSwgQ3lnbnVzIGNvbmZpZ3VyZSB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlCi1hIEBmaWxle01ha2VmaWxlfSBieSBhZGRpbmcgZGVmaW5pdGlvbnMgZm9yIEBzYW1we21ha2V9IHZhcmlhYmxlcyBzdWNoCi1hcyBAc2FtcHtob3N0fSBhbmQgQHNhbXB7dGFyZ2V0fSwgYW5kIGF1dG9tYXRpY2FsbHkgZWRpdGluZyB0aGUgdmFsdWVzCi1vZiBAc2FtcHttYWtlfSB2YXJpYWJsZXMgc3VjaCBhcyBAc2FtcHtwcmVmaXh9IGlmIHRoZXkgYXJlIHByZXNlbnQuCi0KLUFsc28sIGlmIGFueSBvZiB0aGUgQHNhbXB7bWFrZWZpbGVfZnJhZ30gc2hlbGwgdmFyaWFibGVzIGFyZSBzZXQsIEN5Z251cwotY29uZmlndXJlIHdpbGwgaW50ZXJwcmV0IHRoZW0gYXMgZmlsZSBuYW1lcyByZWxhdGl2ZSB0byBlaXRoZXIgdGhlCi13b3JraW5nIGRpcmVjdG9yeSBvciB0aGUgc291cmNlIGRpcmVjdG9yeSwgYW5kIHdpbGwgcmVhZCB0aGUgY29udGVudHMgb2YKLXRoZSBmaWxlIGludG8gdGhlIGdlbmVyYXRlZCBAZmlsZXtNYWtlZmlsZX0uICBUaGUgZmlsZSBjb250ZW50cyB3aWxsIGJlCi1yZWFkIGluIGFmdGVyIHRoZSBmaXJzdCBsaW5lIGluIEBmaWxle01ha2VmaWxlLmlufSB3aGljaCBzdGFydHMgd2l0aAotQHNhbXB7IyMjI30uCi0KLVRoZXNlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudHMgYXJlIHVzZWQgdG8gY3VzdG9taXplIGJlaGF2aW91ciBmb3IgYQotcGFydGljdWxhciBob3N0IG9yIHRhcmdldC4gIFRoZXkgc2VydmUgdG8gc2VsZWN0IHBhcnRpY3VsYXIgZmlsZXMgdG8KLWNvbXBpbGUsIGFuZCB0byBkZWZpbmUgcGFydGljdWxhciBwcmVwcm9jZXNzb3IgbWFjcm9zIGJ5IHByb3ZpZGluZwotdmFsdWVzIGZvciBAc2FtcHttYWtlfSB2YXJpYWJsZXMgd2hpY2ggYXJlIHRoZW4gdXNlZCBkdXJpbmcgY29tcGlsYXRpb24uCi1DeWdudXMgY29uZmlndXJlLCB1bmxpa2UgYXV0b2NvbmYsIG5vcm1hbGx5IGRvZXMgbm90IGRvIGZlYXR1cmUgdGVzdHMsCi1hbmQgbm9ybWFsbHkgcmVxdWlyZXMgc3VwcG9ydCB0byBiZSBhZGRlZCBtYW51YWxseSBmb3IgZWFjaCBuZXcgaG9zdC4KLQotVGhlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudCBzdXBwb3J0IGlzIHNpbWlsYXIgdG8gdGhlIGF1dG9jb25mCi1Ac2FtcHtBQ19TVUJTVF9GSUxFfSBtYWNyby4KLQotQWZ0ZXIgY3JlYXRpbmcgZWFjaCBAZmlsZXtNYWtlZmlsZX0sIHRoZSBwb3N0IHRhcmdldCBzY3JpcHQgd2lsbCBiZSBydW4KLShpLmUuLCBpdCBtYXkgYmUgcnVuIHNldmVyYWwgdGltZXMpLiAgVGhpcyBzY3JpcHQgbWF5IGZ1cnRoZXIgY3VzdG9taXplCi10aGUgQGZpbGV7TWFrZWZpbGV9LiAgV2hlbiBpdCBpcyBydW4sIHRoZSBzaGVsbCB2YXJpYWJsZSBAc2FtcHtNYWtlZmlsZX0KLXdpbGwgaG9sZCB0aGUgbmFtZSBvZiB0aGUgQGZpbGV7TWFrZWZpbGV9LCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlCi1kaXJlY3RvcnkgY29tcG9uZW50LgotCi1MaWtlIGFuIGF1dG9jb25mIGdlbmVyYXRlZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgQ3lnbnVzIGNvbmZpZ3VyZQotd2lsbCBjcmVhdGUgYSBmaWxlIG5hbWVkIEBmaWxle2NvbmZpZy5zdGF0dXN9IHdoaWNoLCB3aGVuIHJ1biwgd2lsbAotYXV0b21hdGljYWxseSByZWNyZWF0ZSB0aGUgY29uZmlndXJhdGlvbi4gIFRoZSBAZmlsZXtjb25maWcuc3RhdHVzfSBmaWxlCi13aWxsIHNpbXBseSBleGVjdXRlIHRoZSBDeWdudXMgY29uZmlndXJlIHNjcmlwdCBhZ2FpbiB3aXRoIHRoZQotYXBwcm9wcmlhdGUgYXJndW1lbnRzLgotCi1Bbnkgb2YgdGhlIHBhcnRzIG9mIEBmaWxle2NvbmZpZ3VyZS5pbn0gbWF5IHNldCB0aGUgc2hlbGwgdmFyaWFibGVzCi1Ac2FtcHtmaWxlc30gYW5kIEBzYW1we2xpbmtzfS4gIEN5Z251cyBjb25maWd1cmUgd2lsbCBzZXQgdXAgc3ltbGlua3MKLWZyb20gdGhlIG5hbWVzIGluIEBzYW1we2xpbmtzfSB0byB0aGUgZmlsZXMgbmFtZWQgaW4gQHNhbXB7ZmlsZXN9LiAgVGhpcwotaXMgc2ltaWxhciB0byB0aGUgYXV0b2NvbmYgQHNhbXB7QUNfTElOS19GSUxFU30gbWFjcm8uCi0KLUZpbmFsbHksIGFueSBvZiB0aGUgcGFydHMgb2YgQGZpbGV7Y29uZmlndXJlLmlufSBtYXkgc2V0IHRoZSBzaGVsbAotdmFyaWFibGUgQHNhbXB7Y29uZmlnZGlyc30gdG8gYSBzZXQgb2Ygc3ViZGlyZWN0b3JpZXMuICBJZiBpdCBpcyBzZXQsCi1DeWdudXMgY29uZmlndXJlIHdpbGwgcmVjdXJzaXZlbHkgcnVuIHRoZSBjb25maWd1cmUgcHJvY2VzcyBpbiBlYWNoCi1zdWJkaXJlY3RvcnkuICBJZiB0aGUgc3ViZGlyZWN0b3J5IHVzZXMgQ3lnbnVzIGNvbmZpZ3VyZSwgaXQgd2lsbAotY29udGFpbiBhIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBidXQgbm8gQGZpbGV7Y29uZmlndXJlfSBmaWxlLCBpbgotd2hpY2ggY2FzZSBDeWdudXMgY29uZmlndXJlIHdpbGwgaW52b2tlIGl0c2VsZiByZWN1cnNpdmVseS4gIElmIHRoZQotc3ViZGlyZWN0b3J5IGhhcyBhIEBmaWxle2NvbmZpZ3VyZX0gZmlsZSwgQ3lnbnVzIGNvbmZpZ3VyZSBhc3N1bWVzIHRoYXQKLWl0IGlzIGFuIGF1dG9jb25mIGdlbmVyYXRlZCBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgYW5kIHNpbXBseSBpbnZva2VzCi1pdCBkaXJlY3RseS4KLQotQG5vZGUgQ3lnbnVzIENvbmZpZ3VyZSBpbiBDKysgTGlicmFyaWVzCi1Ac2VjdGlvbiBDeWdudXMgQ29uZmlndXJlIGluIEMrKyBMaWJyYXJpZXMKLUBjaW5kZXggQGZpbGV7bGlic3RkYysrfSBjb25maWd1cmUKLUBjaW5kZXggQGZpbGV7bGliaW99IGNvbmZpZ3VyZQotQGNpbmRleCBAZmlsZXtsaWJnKyt9IGNvbmZpZ3VyZQotCi1UaGUgQysrIGxpYnJhcnkgY29uZmlndXJlIHN5c3RlbSwgd3JpdHRlbiBieSBQZXIgQm90aG5lciwgZGVzZXJ2ZXMKLXNwZWNpYWwgbWVudGlvbi4gIEl0IHVzZXMgQ3lnbnVzIGNvbmZpZ3VyZSwgYnV0IGl0IGRvZXMgZmVhdHVyZSB0ZXN0aW5nCi1saWtlIHRoYXQgZG9uZSBieSBhdXRvY29uZiBnZW5lcmF0ZWQgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHRzLiAgVGhpcwotYXBwcm9hY2ggaXMgdXNlZCBpbiB0aGUgbGlicmFyaWVzIEBmaWxle2xpYmlvfSwgQGZpbGV7bGlic3RkYysrfSwgYW5kCi1AZmlsZXtsaWJnKyt9LgotCi1Nb3N0IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBvdXQgYnkgdGhlIHNoZWxsCi1zY3JpcHQgQGZpbGV7bGliaW8vY29uZmlnLnNoYXJlZH0uICBFYWNoIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBzZXRzCi1jZXJ0YWluIHNoZWxsIHZhcmlhYmxlcywgYW5kIHRoZW4gaW52b2tlcyBAZmlsZXtjb25maWcuc2hhcmVkfSB0byBjcmVhdGUKLXR3byBwYWNrYWdlIEBmaWxle01ha2VmaWxlfSBmcmFnbWVudHMuICBUaGVzZSBmcmFnbWVudHMgYXJlIHRoZW4KLWluY29ycG9yYXRlZCBpbnRvIHRoZSByZXN1bHRpbmcgQGZpbGV7TWFrZWZpbGV9IGJ5IHRoZSBDeWdudXMgY29uZmlndXJlCi1zY3JpcHQuCi0KLVRoZSBmaWxlIEBmaWxle19HX2NvbmZpZy5ofSBpcyBjcmVhdGVkIGluIHRoZSBAZmlsZXtsaWJpb30gb2JqZWN0Ci1kaXJlY3RvcnkgYnkgcnVubmluZyB0aGUgc2hlbGwgc2NyaXB0IEBmaWxle2xpYmlvL2dlbi1wYXJhbXN9LiAgVGhpcwotc2hlbGwgc2NyaXB0IHVzZXMgZmVhdHVyZSB0ZXN0cyB0byBkZWZpbmUgbWFjcm9zIGFuZCB0eXBlZGVmcyBpbgotQGZpbGV7X0dfY29uZmlnLmh9LgotCi1Abm9kZSBNdWx0aWxpYnMKLUBjaGFwdGVyIE11bHRpbGlicwotQGNpbmRleCBtdWx0aWxpYnMKLQotRm9yIHNvbWUgdGFyZ2V0cyBnY2MgbWF5IGhhdmUgZGlmZmVyZW50IHByb2Nlc3NvciByZXF1aXJlbWVudHMgZGVwZW5kaW5nCi11cG9uIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgQW4gb2J2aW91cyBleGFtcGxlIGlzIHRoZQotQHNhbXB7LW1zb2Z0LWZsb2F0fSBvcHRpb24gc3VwcG9ydGVkIG9uIHNldmVyYWwgcHJvY2Vzc29ycy4gIFRoaXMgb3B0aW9uCi1tZWFucyB0aGF0IHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgYXJlIG5vdCBhdmFpbGFibGUsIHdoaWNoIG1lYW5zCi10aGF0IGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgbXVzdCBiZSBkb25lIGJ5IGNhbGxpbmcgYW4gZW11bGF0aW9uCi1zdWJyb3V0aW5lIHJhdGhlciB0aGFuIGJ5IHVzaW5nIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgotCi1Gb3Igc3VjaCBvcHRpb25zLCBnY2MgaXMgb2Z0ZW4gY29uZmlndXJlZCB0byBjb21waWxlIHRhcmdldCBsaWJyYXJpZXMKLXR3aWNlOiBvbmNlIHdpdGggQHNhbXB7LW1zb2Z0LWZsb2F0fSBhbmQgb25jZSB3aXRob3V0LiAgV2hlbiBnY2MKLWNvbXBpbGVzIHRhcmdldCBsaWJyYXJpZXMgbW9yZSB0aGFuIG9uY2UsIHRoZSByZXN1bHRpbmcgbGlicmFyaWVzIGFyZQotY2FsbGVkIEBkZm57bXVsdGlsaWJzfS4KLQotTXVsdGlsaWJzIGFyZSBub3QgcmVhbGx5IHBhcnQgb2YgdGhlIEdOVSBjb25maWd1cmUgYW5kIGJ1aWxkIHN5c3RlbSwgYnV0Ci13ZSBkaXNjdXNzIHRoZW0gaGVyZSBzaW5jZSB0aGV5IHJlcXVpcmUgc3VwcG9ydCBpbiB0aGUgQGZpbGV7Y29uZmlndXJlfQotc2NyaXB0cyBhbmQgQGZpbGV7TWFrZWZpbGV9cyB1c2VkIGZvciB0YXJnZXQgbGlicmFyaWVzLgotCi1AbWVudQotKiBNdWx0aWxpYnMgaW4gZ2NjOjoJCSAgICAgICAgTXVsdGlsaWJzIGluIGdjYy4KLSogTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXM6OglNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllcy4KLUBlbmQgbWVudQotCi1Abm9kZSBNdWx0aWxpYnMgaW4gZ2NjCi1Ac2VjdGlvbiBNdWx0aWxpYnMgaW4gZ2NjCi0KLUluIGdjYywgbXVsdGlsaWJzIGFyZSBkZWZpbmVkIGJ5IHNldHRpbmcgdGhlIHZhcmlhYmxlCi1Ac2FtcHtNVUxUSUxJQl9PUFRJT05TfSBpbiB0aGUgdGFyZ2V0IEBmaWxle01ha2VmaWxlfSBmcmFnbWVudC4gIFNldmVyYWwKLW90aGVyIEBzYW1we01VTFRJTElCfSB2YXJpYWJsZXMgbWF5IGFsc28gYmUgZGVmaW5lZCB0aGVyZS4gIEB4cmVme1RhcmdldAotRnJhZ21lbnQsICwgVGhlIFRhcmdldCBNYWtlZmlsZSBGcmFnbWVudCwgZ2NjLCBVc2luZyBhbmQgUG9ydGluZyBHTlUKLUNDfS4KLQotSWYgeW91IGhhdmUgYnVpbHQgZ2NjLCB5b3UgY2FuIHNlZSB3aGF0IG11bHRpbGlicyBpdCB1c2VzIGJ5IHJ1bm5pbmcgaXQKLXdpdGggdGhlIEBzYW1wey1wcmludC1tdWx0aS1saWJ9IG9wdGlvbi4gIFRoZSBvdXRwdXQgQHNhbXB7Ljt9IG1lYW5zCi10aGF0IG5vIG11bHRpbGlicyBhcmUgdXNlZC4gIEluIGdlbmVyYWwsIHRoZSBvdXRwdXQgaXMgYSBzZXF1ZW5jZSBvZgotbGluZXMsIG9uZSBwZXIgbXVsdGlsaWIuICBUaGUgZmlyc3QgcGFydCBvZiBlYWNoIGxpbmUsIHVwIHRvIHRoZQotQHNhbXB7O30sIGlzIHRoZSBuYW1lIG9mIHRoZSBtdWx0aWxpYiBkaXJlY3RvcnkuICBUaGUgc2Vjb25kIHBhcnQgaXMgYQotbGlzdCBvZiBjb21waWxlciBvcHRpb25zIHNlcGFyYXRlZCBieSBAc2FtcHtAQH0gY2hhcmFjdGVycy4KLQotTXVsdGlsaWJzIGFyZSBidWlsdCBpbiBhIHRyZWUgb2YgZGlyZWN0b3JpZXMuICBUaGUgdG9wIG9mIHRoZSB0cmVlLAotcmVwcmVzZW50ZWQgYnkgQHNhbXB7Ln0gaW4gdGhlIGxpc3Qgb2YgbXVsdGlsaWIgZGlyZWN0b3JpZXMsIGlzIHRoZQotZGVmYXVsdCBsaWJyYXJ5IHRvIHVzZSB3aGVuIG5vIHNwZWNpYWwgY29tcGlsZXIgb3B0aW9ucyBhcmUgdXNlZC4gIFRoZQotc3ViZGlyZWN0b3JpZXMgb2YgdGhlIHRyZWUgaG9sZCB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSB0byB1c2Ugd2hlbgotcGFydGljdWxhciBjb21waWxlciBvcHRpb25zIGFyZSB1c2VkLgotCi1Abm9kZSBNdWx0aWxpYnMgaW4gVGFyZ2V0IExpYnJhcmllcwotQHNlY3Rpb24gTXVsdGlsaWJzIGluIFRhcmdldCBMaWJyYXJpZXMKLQotVGhlIHRhcmdldCBsaWJyYXJpZXMgaW4gdGhlIEN5Z251cyB0cmVlIGFyZSBhdXRvbWF0aWNhbGx5IGJ1aWx0IHdpdGgKLW11bHRpbGlicy4gIFRoYXQgbWVhbnMgdGhhdCBlYWNoIGxpYnJhcnkgaXMgYnVpbHQgbXVsdGlwbGUgdGltZXMuCi0KLVRoaXMgZGVmYXVsdCBpcyBzZXQgaW4gdGhlIHRvcCBsZXZlbCBAZmlsZXtjb25maWd1cmUuaW59IGZpbGUsIGJ5IGFkZGluZwotQHNhbXB7LS1lbmFibGUtbXVsdGlsaWJ9IHRvIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gY29uZmlndXJlCi13aGVuIGl0IGlzIHJ1biBmb3IgdGhlIHRhcmdldCBsaWJyYXJpZXMgKEBweHJlZntIb3N0IGFuZCBUYXJnZXQKLUxpYnJhcmllc30pLgotCi1FYWNoIHRhcmdldCBsaWJyYXJ5IHVzZXMgdGhlIHNoZWxsIHNjcmlwdCBAZmlsZXtjb25maWctbWwuaW59LCB3cml0dGVuCi1ieSBEb3VnIEV2YW5zLCB0byBwcmVwYXJlIHRvIGJ1aWxkIHRhcmdldCBsaWJyYXJpZXMuICBUaGlzIHNoZWxsIHNjcmlwdAotaXMgaW52b2tlZCBhZnRlciB0aGUgQGZpbGV7TWFrZWZpbGV9IGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlCi1AZmlsZXtjb25maWd1cmV9IHNjcmlwdC4gIElmIG11bHRpbGlicyBhcmUgbm90IGVuYWJsZWQsIGl0IGRvZXMgbm90aGluZywKLW90aGVyd2lzZSBpdCBtb2RpZmllcyB0aGUgQGZpbGV7TWFrZWZpbGV9IHRvIHN1cHBvcnQgbXVsdGlsaWJzLgotCi1UaGUgQGZpbGV7Y29uZmlnLW1sLmlufSBzY3JpcHQgbWFrZXMgb25lIGNvcHkgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBmb3IKLWVhY2ggbXVsdGlsaWIgaW4gdGhlIGFwcHJvcHJpYXRlIHN1YmRpcmVjdG9yeS4gIFdoZW4gY29uZmlndXJpbmcgaW4gdGhlCi1zb3VyY2UgZGlyZWN0b3J5ICh3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLCBpdCB3aWxsIGJ1aWxkIGEgc3ltbGluawotdHJlZSBvZiB0aGUgc291cmNlcyBpbiBlYWNoIHN1YmRpcmVjdG9yeS4KLQotVGhlIEBmaWxle2NvbmZpZy1tbC5pbn0gc2NyaXB0IHNldHMgc2V2ZXJhbCB2YXJpYWJsZXMgaW4gdGhlIHZhcmlvdXMKLUBmaWxle01ha2VmaWxlfXMuICBUaGUgQGZpbGV7TWFrZWZpbGUuaW59IG11c3QgaGF2ZSBkZWZpbml0aW9ucyBmb3IKLXRoZXNlIHZhcmlhYmxlcyBhbHJlYWR5OyBAZmlsZXtjb25maWctbWwuaW59IHNpbXBseSBjaGFuZ2VzIHRoZSBleGlzdGluZwotdmFsdWVzLiAgVGhlIEBmaWxle01ha2VmaWxlfSBzaG91bGQgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGVzZQotdmFyaWFibGVzIHdoaWNoIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGluIHRoZSBzdWJkaXJlY3Rvcmllcy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBNVUxUSVNSQ1RPUAotQGZpbGV7Y29uZmlnLW1sLmlufSB3aWxsIHNldCB0aGlzIHRvIGEgc2VxdWVuY2Ugb2YgQHNhbXB7Li4vfSBzdHJpbmdzLAotd2hlcmUgdGhlIG51bWJlciBvZiBzdHJpbmdzIGlzIHRoZSBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHRoZQotc291cmNlIHRyZWUuICBUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgdGhlIGVtcHR5IHN0cmluZy4KLUBpdGVtIE1VTFRJQlVJTERUT1AKLUBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcyB0byBhIHNlcXVlbmNlIG9mIEBzYW1wey4uL30gc3RyaW5ncywKLXdoZXJlIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpcyBudW1iZXIgb2YgbXVsdGlsaWIgbGV2ZWxzIGluIHRoZSBvYmplY3QKLWRpcmVjdG9yeS4gIFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSB0aGUgZW1wdHkgc3RyaW5nLiAgVGhpcyB3aWxsCi1kaWZmZXIgZnJvbSBAc2FtcHtNVUxUSVNSQ1RPUH0gd2hlbiBjb25maWd1cmluZyBpbiB0aGUgc291cmNlIHRyZWUKLSh3aGljaCBpcyBub3QgcmVjb21tZW5kZWQpLgotQGl0ZW0gTVVMVElESVJTCi1JbiB0aGUgdG9wIGxldmVsIEBmaWxle01ha2VmaWxlfSBvbmx5LCBAZmlsZXtjb25maWctbWwuaW59IHdpbGwgc2V0IHRoaXMKLXRvIHRoZSBsaXN0IG9mIG11bHRpbGliIHN1YmRpcmVjdG9yaWVzLiAgVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHRoZQotZW1wdHkgc3RyaW5nLgotQGl0ZW0gTVVMVElTVUJESVIKLUBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQgdGhpcyB0byB0aGUgaW5zdGFsbGVkIHN1YmRpcmVjdG9yeSBuYW1lIHRvCi11c2UgZm9yIHRoaXMgc3ViZGlyZWN0b3J5LCB3aXRoIGEgbGVhZGluZyBAc2FtcHsvfS4gIFRoZSBkZWZhdWx0IHZhbHVlCi1zaG9sZCBiZSB0aGUgZW1wdHkgc3RyaW5nLgotQGl0ZW0gTVVMVElETwotQGl0ZW14IE1VTFRJQ0xFQU4KLUluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IG9ubHksIEBmaWxle2NvbmZpZy1tbC5pbn0gd2lsbCBzZXQKLXRoZXNlIHZhcmlhYmxlcyB0byBjb21tYW5kcyB0byB1c2Ugd2hlbiBkb2luZyBhIHJlY3Vyc2l2ZSBtYWtlLiAgVGhlc2UKLXZhcmlhYmxlcyBzaG91bGQgYm90aCBkZWZhdWx0IHRvIHRoZSBzdHJpbmcgQHNhbXB7dHJ1ZX0sIHNvIHRoYXQgYnkKLWRlZmF1bHQgbm90aGluZyBoYXBwZW5zLgotQGVuZCB0YWJsZQotCi1BbGwgcmVmZXJlbmNlcyB0byB0aGUgcGFyZW50IG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IHNob3VsZCB1c2UgdGhlCi12YXJpYWJsZSBAc2FtcHtNVUxUSVNSQ1RPUH0uICBJbnN0ZWFkIG9mIHdyaXRpbmcgQHNhbXB7JChzcmNkaXIpLy4ufSwKLXlvdSBtdXN0IHdyaXRlIEBzYW1weyQoc3JjZGlyKS8kKE1VTFRJU1JDVE9QKS4ufS4KLQotU2ltaWxhcmx5LCByZWZlcmVuY2VzIHRvIHRoZSBwYXJlbnQgb2YgdGhlIG9iamVjdCBkaXJlY3Rvcnkgc2hvdWxkIHVzZQotdGhlIHZhcmlhYmxlIEBzYW1we01VTFRJQlVJTERUT1B9LgotCi1JbiB0aGUgaW5zdGFsbGF0aW9uIHRhcmdldCwgdGhlIGxpYnJhcmllcyBzaG91bGQgYmUgaW5zdGFsbGVkIGluIHRoZQotc3ViZGlyZWN0b3J5IEBzYW1we01VTFRJU1VCRElSfS4gIEluc3RlYWQgb2YgaW5zdGFsbGluZwotQHNhbXB7JChsaWJkaXIpL2xpYmZvby5hfSwgaW5zdGFsbAotQHNhbXB7JChsaWJkaXIpJChNVUxUSVNVQkRJUikvbGliZm9vLmF9LgotCi1UaGUgQGZpbGV7Y29uZmlnLW1sLmlufSBzY3JpcHQgYWxzbyBtb2RpZmllcyB0aGUgdG9wIGxldmVsCi1AZmlsZXtNYWtlZmlsZX0gdG8gYWRkIEBzYW1we211bHRpLWRvfSBhbmQgQHNhbXB7bXVsdGktY2xlYW59IHRhcmdldHMKLXdoaWNoIGFyZSB1c2VkIHdoZW4gYnVpbGRpbmcgbXVsdGlsaWJzLgotCi1UaGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhlIEBmaWxle01ha2VmaWxlfSBzaG91bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nCi1jb21tYW5kOgotQHNtYWxsZXhhbXBsZQotQEAkKE1VTFRJRE8pICQoRkxBR1NfVE9fUEFTUykgRE89YWxsIG11bHRpLWRvCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIGFzc3VtZXMgdGhhdCBAc2FtcHskKEZMQUdTX1RPX1BBU1MpfSBpcyBkZWZpbmVkIGFzIGEgc2V0IG9mCi12YXJpYWJsZXMgdG8gcGFzcyB0byBhIHJlY3Vyc2l2ZSBpbnZvY2F0aW9uIG9mIEBzYW1we21ha2V9LiAgVGhpcyB3aWxsCi1idWlsZCBhbGwgdGhlIG11bHRpbGlicy4gIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAc2FtcHtNVUxUSURPfQotaXMgQHNhbXB7dHJ1ZX0sIHNvIGJ5IGRlZmF1bHQgdGhpcyBjb21tYW5kIHdpbGwgZG8gbm90aGluZy4gIEl0IHdpbGwKLW9ubHkgZG8gc29tZXRoaW5nIGluIHRoZSB0b3AgbGV2ZWwgQGZpbGV7TWFrZWZpbGV9IGlmIG11bHRpbGlicyB3ZXJlCi1lbmFibGVkLgotCi1UaGUgQHNhbXB7aW5zdGFsbH0gdGFyZ2V0IG9mIHRoZSBAZmlsZXtNYWtlZmlsZX0gc2hvdWxkIGluY2x1ZGUgdGhlCi1mb2xsb3dpbmcgY29tbWFuZDoKLUBzbWFsbGV4YW1wbGUKLUBAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIERPPWluc3RhbGwgbXVsdGktZG8KLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIGdlbmVyYWwsIGFueSBvcGVyYXRpb24sIG90aGVyIHRoYW4gY2xlYW4sIHdoaWNoIHNob3VsZCBiZSBwZXJmb3JtZWQKLW9uIGFsbCB0aGUgbXVsdGlsaWJzIHNob3VsZCB1c2UgYSBAc2FtcHskKE1VTFRJRE8pfSBsaW5lLCBzZXR0aW5nIHRoZQotdmFyaWFibGUgQHNhbXB7RE99IHRvIHRoZSB0YXJnZXQgb2YgZWFjaCByZWN1cnNpdmUgY2FsbCB0byBAc2FtcHttYWtlfS4KLQotVGhlIEBzYW1we2NsZWFufSB0YXJnZXRzIChAc2FtcHtjbGVhbn0sIEBzYW1we21vc3RseWNsZWFufSwgZXRjLikgc2hvdWxkCi11c2UgQHNhbXB7JChNVUxUSUNMRUFOKX0uICBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we2NsZWFufSB0YXJnZXQgc2hvdWxkCi1kbyB0aGlzOgotQHNtYWxsZXhhbXBsZQotQEAkKE1VTFRJQ0xFQU4pIERPPWNsZWFuIG11bHRpLWNsZWFuCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBGQVEKLUBjaGFwdGVyIEZyZXF1ZW50bHkgQXNrZWQgUXVlc3Rpb25zCi0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gV2hpY2ggZG8gSSBydW4gZmlyc3QsIEBzYW1we2F1dG9jb25mfSBvciBAc2FtcHthdXRvbWFrZX0/Ci1FeGNlcHQgd2hlbiB5b3UgZmlyc3QgYWRkIGF1dG9jb25mIG9yIGF1dG9tYWtlIHN1cHBvcnQgdG8gYSBwYWNrYWdlLCB5b3UKLXNob3VsZG4ndCBydW4gZWl0aGVyIGJ5IGhhbmQuICBJbnN0ZWFkLCBjb25maWd1cmUgd2l0aCB0aGUKLUBzYW1wey0tZW5hYmxlLW1haW50YWluZXItbW9kZX0gb3B0aW9uLCBhbmQgbGV0IEBzYW1we21ha2V9IHRha2UgY2FyZSBvZgotaXQuCi0KLUBjaW5kZXggdW5kZWZpbmVkIG1hY3JvcwotQGl0ZW0gQHNhbXB7YXV0b2NvbmZ9IHNheXMgc29tZXRoaW5nIGFib3V0IHVuZGVmaW5lZCBtYWNyb3MuCi1UaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgbWFjcm9zIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSB3aGljaCBhcmUKLW5vdCBkZWZpbmVkIGJ5IEBzYW1we2F1dG9jb25mfS4gIFlvdSBtYXkgYmUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YKLUBzYW1we2F1dG9jb25mfTsgdHJ5IGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIGEgbmV3ZXIgb25lLiAgTWFrZSBzdXJlIHRoZQotbmV3bHkgaW5zdGFsbGxlZCBAc2FtcHthdXRvY29uZn0gaXMgZmlyc3Qgb24geW91ciBAc2FtcHtQQVRIfS4gIEFsc28sCi1zZWUgdGhlIG5leHQgcXVlc3Rpb24uCi0KLUBjaW5kZXggQHNhbXB7Q1lfR05VX0dFVFRFWFR9IGluIEBmaWxle2NvbmZpZ3VyZX0KLUBjaW5kZXggQHNhbXB7QU1fUFJPR19MSUJUT09MfSBpbiBAZmlsZXtjb25maWd1cmV9Ci1AaXRlbSBNeSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCBoYXMgc3R1ZmYgbGlrZSBAc2FtcHtDWV9HTlVfR0VUVEVYVH0gaW4gaXQuCi1UaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUgbWFjcm9zIGluIHlvdXIgQGZpbGV7Y29uZmlndXJlLmlufSB3aGljaCBzaG91bGQKLWJlIGRlZmluZWQgaW4geW91ciBAZmlsZXthY2xvY2FsLm00fSBmaWxlLCBidXQgYXJlbid0LiAgVGhpcyB1c3VhbGx5Ci1tZWFucyB0aGF0IEBzYW1we2FjbG9jYWx9IHdhcyBub3QgYWJsZSB0byBhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBvZiB0aGUKLW1hY3Jvcy4gIE1ha2Ugc3VyZSB0aGF0IHlvdSBoYXZlIGluc3RhbGxlZCBhbGwgdGhlIHBhY2thZ2VzIHlvdSBuZWVkLgotSW4gcGFydGljdWxhciwgbWFrZSBzdXJlIHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkIGxpYnRvb2wgKHRoaXMgaXMgd2hlcmUKLUBzYW1we0FNX1BST0dfTElCVE9PTH0gaXMgZGVmaW5lZCkgYW5kIGdldHRleHQgKHRoaXMgaXMgd2hlcmUKLUBzYW1we0NZX0dOVV9HRVRURVhUfSBpcyBkZWZpbmVkLCBhdCBsZWFzdCBpbiB0aGUgQ3lnbnVzIHZlcnNpb24gb2YKLWdldHRleHQpLgotCi1AY2luZGV4IEBmaWxle01ha2VmaWxlfSwgZ2FyYmFnZSBjaGFyYWN0ZXJzCi1AaXRlbSBNeSBAZmlsZXtNYWtlZmlsZX0gaGFzIEBzYW1we0BAfSBjaGFyYWN0ZXJzIGluIGl0LgotVGhpcyBtYXkgbWVhbiB0aGF0IHlvdSB0cmllZCB0byB1c2UgYW4gYXV0b2NvbmYgc3Vic3RpdHV0aW9uIGluIHlvdXIKLUBmaWxle01ha2VmaWxlLmlufSB3aXRob3V0IGFkZGluZyB0aGUgYXBwcm9wcmlhdGUgQHNhbXB7QUNfU1VCU1R9IGNhbGwKLXRvIHlvdXIgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQuICBPciBpdCBtYXkganVzdCBtZWFuIHRoYXQgeW91IG5lZWQgdG8KLXJlYnVpbGQgQGZpbGV7TWFrZWZpbGV9IGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LiAgVG8gcmVidWlsZAotQGZpbGV7TWFrZWZpbGV9IGZyb20gQGZpbGV7TWFrZWZpbGUuaW59LCBydW4gdGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Y29uZmlnLnN0YXR1c30gd2l0aCBubyBhcmd1bWVudHMuICBJZiB5b3UgbmVlZCB0byBmb3JjZQotQGZpbGV7Y29uZmlndXJlfSB0byBydW4gYWdhaW4sIGZpcnN0IHJ1biBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30uCi1UaGVzZSBydW5zIGFyZSBub3JtYWxseSBkb25lIGF1dG9tYXRpY2FsbHkgYnkgQGZpbGV7TWFrZWZpbGV9IHRhcmdldHMsCi1idXQgaWYgeW91ciBAZmlsZXtNYWtlZmlsZX0gaGFzIGdvdHRlbiBtZXNzZWQgdXAgeW91J2xsIG5lZWQgdG8gaGVscAotdGhlbSBhbG9uZy4KLQotQGNpbmRleCBAc2FtcHtjb25maWcuc3RhdHVzIC0tcmVjaGVja30KLUBpdGVtIFdoeSBkbyBJIGhhdmUgdG8gcnVuIGJvdGggQHNhbXB7Y29uZmlnLnN0YXR1cyAtLXJlY2hlY2t9IGFuZCBAc2FtcHtjb25maWcuc3RhdHVzfT8KLU5vcm1hbGx5LCB5b3UgZG9uJ3Q7IHRoZXkgd2lsbCBiZSBydW4gYXV0b21hdGljYWxseSBieSBAZmlsZXtNYWtlZmlsZX0KLXRhcmdldHMuICBJZiB5b3UgZG8gbmVlZCB0byBydW4gdGhlbSwgdXNlIEBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfQotdG8gcnVuIHRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCBhZ2FpbiB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyBhcyB0aGUKLWZpcnN0IHRpbWUgeW91IHJhbiBpdC4gIFVzZSBAc2FtcHtjb25maWcuc3RhdHVzfSAod2l0aCBubyBhcmd1bWVudHMpIHRvCi1yZWdlbmVyYXRlIGFsbCBmaWxlcyAoQGZpbGV7TWFrZWZpbGV9LCBAZmlsZXtjb25maWcuaH0sIGV0Yy4pIGJhc2VkIG9uCi10aGUgcmVzdWx0cyBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4gIFRoZSB0d28gY2FzZXMgYXJlIHNlcGFyYXRlIGJlY2F1c2UKLWl0IGlzbid0IGFsd2F5cyBuZWNlc3NhcnkgdG8gcmVnZW5lcmF0ZSBhbGwgdGhlIGZpbGVzIGFmdGVyIHJ1bm5pbmcKLUBzYW1we2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrfS4gIFRoZSBAZmlsZXtNYWtlZmlsZX0gdGFyZ2V0cyBnZW5lcmF0ZWQKLWJ5IGF1dG9tYWtlIHdpbGwgdXNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgQHNhbXB7Q09ORklHX0ZJTEVTfSBhbmQKLUBzYW1we0NPTkZJR19IRUFERVJTfSB0byBvbmx5IHJlZ2VuZXJhdGUgZmlsZXMgYXMgdGhleSBhcmUgbmVlZGVkLgotCi1AaXRlbSBXaGF0IGlzIHRoZSBDeWdudXMgdHJlZT8KLVRoZSBDeWdudXMgdHJlZSBpcyB1c2VkIGZvciB2YXJpb3VzIHBhY2thZ2VzIGluY2x1ZGluZyBnZGIsIHRoZSBHTlUKLWJpbnV0aWxzLCBhbmQgZWdjcy4gIEl0IGlzIGFsc28sIG9mIGNvdXJzZSwgdXNlZCBmb3IgQ3lnbnVzIHJlbGVhc2VzLgotSXQgaXMgdGhlIGJ1aWxkIHN5c3RlbSB3aGljaCB3YXMgZGV2ZWxvcGVkIGF0IEN5Z251cywgdXNpbmcgdGhlIEN5Z251cwotY29uZmlndXJlIHNjcmlwdC4gIEl0IHBlcm1pdHMgYnVpbGRpbmcgbWFueSBkaWZmZXJlbnQgcGFja2FnZXMgd2l0aCBhCi1zaW5nbGUgY29uZmlndXJlIGFuZCBtYWtlLiAgVGhlIGNvbmZpZ3VyZSBzY3JpcHRzIGluIHRoZSB0cmVlIGFyZSBiZWluZwotY29udmVydGVkIHRvIGF1dG9jb25mLCBidXQgdGhlIGdlbmVyYWwgYnVpbGQgc3RydWN0dXJlIHJlbWFpbnMgaW50YWN0LgotCi1AaXRlbSBXaHkgZG8gSSBoYXZlIHRvIGtlZXAgcmVidWlsZGluZyBhbmQgcmVpbnN0YWxsaW5nIHRoZSB0b29scz8KLUkga25vdywgaXQncyBhIHBhaW4uICBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgYnVncyBpbiB0aGUgdG9vbHMKLXRoZW1zZWx2ZXMgd2hpY2ggbmVlZCB0byBiZSBmaXhlZCwgYW5kIGVhY2ggdGltZSB0aGF0IGhhcHBlbnMgZXZlcnlib2R5Ci13aG8gdXNlcyB0aGUgdG9vbHMgbmVlZCB0byByZWluc3RhbGwgbmV3IHZlcnNpb25zIG9mIHRoZW0uICBJIGRvbid0IGtub3cKLWlmIHRoZXJlIGlzIGdvaW5nIHRvIGJlIGEgY2xldmVyIGZpeCB1bnRpbCB0aGUgdG9vbHMgc3RhYmlsaXplLgotCi1AaXRlbSBXaHkgbm90IGp1c3QgaGF2ZSBhIEN5Z251cyB0cmVlIEBzYW1we21ha2V9IHRhcmdldCB0byB1cGRhdGUgdGhlIHRvb2xzPwotVGhlIHRvb2xzIHVuZm9ydHVuYXRlbHkgbmVlZCB0byBiZSBpbnN0YWxsZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQuCi1UaGF0IG1lYW5zIHRoYXQgdGhleSBtdXN0IGJlIGJ1aWx0IHVzaW5nIGFuIGFwcHJvcHJpYXRlIHByZWZpeCwgYW5kIGl0Ci1zZWVtcyB1bndpc2UgdG8gYXNzdW1lIHRoYXQgZXZlcnkgY29uZmlndXJhdGlvbiB1c2VzIGFuIGFwcHJvcHJpYXRlCi1wcmVmaXguICBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBtYWtlIHRoZW0gd29yayBpbiBwbGFjZSwgb3IgaXQgbWlnaHQgYmUKLXBvc3NpYmxlIHRvIGluc3RhbGwgdGhlbSBpbiBzb21lIHN1YmRpcmVjdG9yeTsgc28gZmFyIHRoZXNlIGFwcHJvYWNoZXMKLWhhdmUgbm90IGJlZW4gaW1wbGVtZW50ZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2V0Yy9tYWtlLXN0ZHMudGV4aSBiL2V0Yy9tYWtlLXN0ZHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0OTc2NC4uMDAwMDAwMAotLS0gYS9ldGMvbWFrZS1zdGRzLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotQGNvbW1lbnQgVGhpcyBmaWxlIGlzIGluY2x1ZGVkIGJ5IGJvdGggc3RhbmRhcmRzLnRleGkgYW5kIG1ha2UudGV4aW5mby4KLUBjb21tZW50IEl0IHdhcyBicm9rZW4gb3V0IG9mIHN0YW5kYXJkcy50ZXhpIG9uIDEvNi85MyBieSByb2xhbmQuCi0KLUBub2RlIE1ha2VmaWxlIENvbnZlbnRpb25zCi1AY2hhcHRlciBNYWtlZmlsZSBDb252ZW50aW9ucwotQGNvbW1lbnQgc3RhbmRhcmRzLnRleGkgZG9lcyBub3QgcHJpbnQgYW4gaW5kZXgsIGJ1dCBtYWtlLnRleGluZm8gZG9lcy4KLUBjaW5kZXggbWFrZWZpbGUsIGNvbnZlbnRpb25zIGZvcgotQGNpbmRleCBjb252ZW50aW9ucyBmb3IgbWFrZWZpbGVzCi1AY2luZGV4IHN0YW5kYXJkcyBmb3IgbWFrZWZpbGVzCi0KLVRoaXMKLUBpZmluZm8KLW5vZGUKLUBlbmQgaWZpbmZvCi1AaWZ0ZXgKLUBpZnNldCBDT0RFU1RECi1zZWN0aW9uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBDT0RFU1RECi1jaGFwdGVyCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZ0ZXgKLWRlc2NyaWJlcyBjb252ZW50aW9ucyBmb3Igd3JpdGluZyB0aGUgTWFrZWZpbGVzIGZvciBHTlUgcHJvZ3JhbXMuCi0KLUBtZW51Ci0qIE1ha2VmaWxlIEJhc2ljczo6CQlHZW5lcmFsIENvbnZlbnRpb25zIGZvciBNYWtlZmlsZXMKLSogVXRpbGl0aWVzIGluIE1ha2VmaWxlczo6CVV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLSogQ29tbWFuZCBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIGZvciBTcGVjaWZ5aW5nIENvbW1hbmRzCi0qIERpcmVjdG9yeSBWYXJpYWJsZXM6OgkJVmFyaWFibGVzIGZvciBJbnN0YWxsYXRpb24gRGlyZWN0b3JpZXMKLSogU3RhbmRhcmQgVGFyZ2V0czo6CQlTdGFuZGFyZCBUYXJnZXRzIGZvciBVc2VycwotKiBJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllczo6ICBUaHJlZSBjYXRlZ29yaWVzIG9mIGNvbW1hbmRzIGluIHRoZSBgaW5zdGFsbCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlOiBub3JtYWwsIHByZS1pbnN0YWxsIGFuZCBwb3N0LWluc3RhbGwuCi1AZW5kIG1lbnUKLQotQG5vZGUgTWFrZWZpbGUgQmFzaWNzCi1Ac2VjdGlvbiBHZW5lcmFsIENvbnZlbnRpb25zIGZvciBNYWtlZmlsZXMKLQotRXZlcnkgTWFrZWZpbGUgc2hvdWxkIGNvbnRhaW4gdGhpcyBsaW5lOgotCi1AZXhhbXBsZQotU0hFTEwgPSAvYmluL3NoCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci10byBhdm9pZCB0cm91YmxlIG9uIHN5c3RlbXMgd2hlcmUgdGhlIEBjb2Rle1NIRUxMfSB2YXJpYWJsZSBtaWdodCBiZQotaW5oZXJpdGVkIGZyb20gdGhlIGVudmlyb25tZW50LiAgKFRoaXMgaXMgbmV2ZXIgYSBwcm9ibGVtIHdpdGggR05VCi1AY29kZXttYWtlfS4pCi0KLURpZmZlcmVudCBAY29kZXttYWtlfSBwcm9ncmFtcyBoYXZlIGluY29tcGF0aWJsZSBzdWZmaXggbGlzdHMgYW5kCi1pbXBsaWNpdCBydWxlcywgYW5kIHRoaXMgc29tZXRpbWVzIGNyZWF0ZXMgY29uZnVzaW9uIG9yIG1pc2JlaGF2aW9yLiAgU28KLWl0IGlzIGEgZ29vZCBpZGVhIHRvIHNldCB0aGUgc3VmZml4IGxpc3QgZXhwbGljaXRseSB1c2luZyBvbmx5IHRoZQotc3VmZml4ZXMgeW91IG5lZWQgaW4gdGhlIHBhcnRpY3VsYXIgTWFrZWZpbGUsIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBmaXJzdCBsaW5lIGNsZWFycyBvdXQgdGhlIHN1ZmZpeCBsaXN0LCB0aGUgc2Vjb25kIGludHJvZHVjZXMgYWxsCi1zdWZmaXhlcyB3aGljaCBtYXkgYmUgc3ViamVjdCB0byBpbXBsaWNpdCBydWxlcyBpbiB0aGlzIE1ha2VmaWxlLgotCi1Eb24ndCBhc3N1bWUgdGhhdCBAZmlsZXsufSBpcyBpbiB0aGUgcGF0aCBmb3IgY29tbWFuZCBleGVjdXRpb24uICBXaGVuCi15b3UgbmVlZCB0byBydW4gcHJvZ3JhbXMgdGhhdCBhcmUgYSBwYXJ0IG9mIHlvdXIgcGFja2FnZSBkdXJpbmcgdGhlCi1tYWtlLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgaXQgdXNlcyBAZmlsZXsuL30gaWYgdGhlIHByb2dyYW0gaXMgYnVpbHQgYXMKLXBhcnQgb2YgdGhlIG1ha2Ugb3IgQGZpbGV7JChzcmNkaXIpL30gaWYgdGhlIGZpbGUgaXMgYW4gdW5jaGFuZ2luZyBwYXJ0Ci1vZiB0aGUgc291cmNlIGNvZGUuICBXaXRob3V0IG9uZSBvZiB0aGVzZSBwcmVmaXhlcywgdGhlIGN1cnJlbnQgc2VhcmNoCi1wYXRoIGlzIHVzZWQuCi0KLVRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIEBmaWxley4vfSAodGhlIEBkZm57YnVpbGQgZGlyZWN0b3J5fSkgYW5kCi1AZmlsZXskKHNyY2RpcikvfSAodGhlIEBkZm57c291cmNlIGRpcmVjdG9yeX0pIGlzIGltcG9ydGFudCBiZWNhdXNlCi11c2VycyBjYW4gYnVpbGQgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnkgdXNpbmcgdGhlIEBzYW1wey0tc3JjZGlyfSBvcHRpb24KLXRvIEBmaWxle2NvbmZpZ3VyZX0uICBBIHJ1bGUgb2YgdGhlIGZvcm06Ci0KLUBzbWFsbGV4YW1wbGUKLWZvby4xIDogZm9vLm1hbiBzZWRzY3JpcHQKLSAgICAgICAgc2VkIC1lIHNlZHNjcmlwdCBmb28ubWFuID4gZm9vLjEKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotd2lsbCBmYWlsIHdoZW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSBpcyBub3QgdGhlIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UKLUBmaWxle2Zvby5tYW59IGFuZCBAZmlsZXtzZWRzY3JpcHR9IGFyZSBpbiB0aGUgdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0KLVdoZW4gdXNpbmcgR05VIEBjb2Rle21ha2V9LCByZWx5aW5nIG9uIEBzYW1we1ZQQVRIfSB0byBmaW5kIHRoZSBzb3VyY2UKLWZpbGUgd2lsbCB3b3JrIGluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIGEgc2luZ2xlIGRlcGVuZGVuY3kgZmlsZSwKLXNpbmNlIHRoZSBAY29kZXttYWtlfSBhdXRvbWF0aWMgdmFyaWFibGUgQHNhbXB7JDx9IHdpbGwgcmVwcmVzZW50IHRoZQotc291cmNlIGZpbGUgd2hlcmV2ZXIgaXQgaXMuICAoTWFueSB2ZXJzaW9ucyBvZiBAY29kZXttYWtlfSBzZXQgQHNhbXB7JDx9Ci1vbmx5IGluIGltcGxpY2l0IHJ1bGVzLikgIEEgTWFrZWZpbGUgdGFyZ2V0IGxpa2UKLQotQHNtYWxsZXhhbXBsZQotZm9vLm8gOiBiYXIuYwotICAgICAgICAkKENDKSAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpIC1jIGJhci5jIC1vIGZvby5vCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXNob3VsZCBpbnN0ZWFkIGJlIHdyaXR0ZW4gYXMKLQotQHNtYWxsZXhhbXBsZQotZm9vLm8gOiBiYXIuYwotICAgICAgICAkKENDKSAtSS4gLUkkKHNyY2RpcikgJChDRkxBR1MpIC1jICQ8IC1vICRAQAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pbiBvcmRlciB0byBhbGxvdyBAc2FtcHtWUEFUSH0gdG8gd29yayBjb3JyZWN0bHkuICBXaGVuIHRoZSB0YXJnZXQgaGFzCi1tdWx0aXBsZSBkZXBlbmRlbmNpZXMsIHVzaW5nIGFuIGV4cGxpY2l0IEBzYW1weyQoc3JjZGlyKX0gaXMgdGhlIGVhc2llc3QKLXdheSB0byBtYWtlIHRoZSBydWxlIHdvcmsgd2VsbC4gIEZvciBleGFtcGxlLCB0aGUgdGFyZ2V0IGFib3ZlIGZvcgotQGZpbGV7Zm9vLjF9IGlzIGJlc3Qgd3JpdHRlbiBhczoKLQotQHNtYWxsZXhhbXBsZQotZm9vLjEgOiBmb28ubWFuIHNlZHNjcmlwdAotICAgICAgICBzZWQgLWUgJChzcmNkaXIpL3NlZHNjcmlwdCAkKHNyY2RpcikvZm9vLm1hbiA+ICRAQAotQGVuZCBzbWFsbGV4YW1wbGUKLQotR05VIGRpc3RyaWJ1dGlvbnMgdXN1YWxseSBjb250YWluIHNvbWUgZmlsZXMgd2hpY2ggYXJlIG5vdCBzb3VyY2UKLWZpbGVzLS0tZm9yIGV4YW1wbGUsIEluZm8gZmlsZXMsIGFuZCB0aGUgb3V0cHV0IGZyb20gQXV0b2NvbmYsIEF1dG9tYWtlLAotQmlzb24gb3IgRmxleC4gIFNpbmNlIHRoZXNlIGZpbGVzIG5vcm1hbGx5IGFwcGVhciBpbiB0aGUgc291cmNlCi1kaXJlY3RvcnksIHRoZXkgc2hvdWxkIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIG5vdCBpbiB0aGUKLWJ1aWxkIGRpcmVjdG9yeS4gIFNvIE1ha2VmaWxlIHJ1bGVzIHRvIHVwZGF0ZSB0aGVtIHNob3VsZCBwdXQgdGhlCi11cGRhdGVkIGZpbGVzIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotCi1Ib3dldmVyLCBpZiBhIGZpbGUgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBkaXN0cmlidXRpb24sIHRoZW4gdGhlCi1NYWtlZmlsZSBzaG91bGQgbm90IHB1dCBpdCBpbiB0aGUgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSBidWlsZGluZyBhCi1wcm9ncmFtIGluIG9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIHNvdXJjZSBkaXJlY3RvcnkKLWluIGFueSB3YXkuCi0KLVRyeSB0byBtYWtlIHRoZSBidWlsZCBhbmQgaW5zdGFsbGF0aW9uIHRhcmdldHMsIGF0IGxlYXN0IChhbmQgYWxsIHRoZWlyCi1zdWJ0YXJnZXRzKSB3b3JrIGNvcnJlY3RseSB3aXRoIGEgcGFyYWxsZWwgQGNvZGV7bWFrZX0uCi0KLUBub2RlIFV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLUBzZWN0aW9uIFV0aWxpdGllcyBpbiBNYWtlZmlsZXMKLQotV3JpdGUgdGhlIE1ha2VmaWxlIGNvbW1hbmRzIChhbmQgYW55IHNoZWxsIHNjcmlwdHMsIHN1Y2ggYXMKLUBjb2Rle2NvbmZpZ3VyZX0pIHRvIHJ1biBpbiBAY29kZXtzaH0sIG5vdCBpbiBAY29kZXtjc2h9LiAgRG9uJ3QgdXNlIGFueQotc3BlY2lhbCBmZWF0dXJlcyBvZiBAY29kZXtrc2h9IG9yIEBjb2Rle2Jhc2h9LgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgYW5kIHRoZSBNYWtlZmlsZSBydWxlcyBmb3IgYnVpbGRpbmcgYW5kCi1pbnN0YWxsYXRpb24gc2hvdWxkIG5vdCB1c2UgYW55IHV0aWxpdGllcyBkaXJlY3RseSBleGNlcHQgdGhlc2U6Ci0KLUBjIGRkIGZpbmQKLUBjIGd1bnppcCBnemlwIG1kNXN1bQotQGMgbWtmaWZvIG1rbm9kIHRlZSB1bmFtZSAKLQotQGV4YW1wbGUKLWNhdCBjbXAgY3AgZGlmZiBlY2hvIGVncmVwIGV4cHIgZmFsc2UgZ3JlcCBpbnN0YWxsLWluZm8KLWxuIGxzIG1rZGlyIG12IHB3ZCBybSBybWRpciBzZWQgc2xlZXAgc29ydCB0YXIgdGVzdCB0b3VjaCB0cnVlCi1AZW5kIGV4YW1wbGUKLQotVGhlIGNvbXByZXNzaW9uIHByb2dyYW0gQGNvZGV7Z3ppcH0gY2FuIGJlIHVzZWQgaW4gdGhlIEBjb2Rle2Rpc3R9IHJ1bGUuCi0KLVN0aWNrIHRvIHRoZSBnZW5lcmFsbHkgc3VwcG9ydGVkIG9wdGlvbnMgZm9yIHRoZXNlIHByb2dyYW1zLiAgRm9yCi1leGFtcGxlLCBkb24ndCB1c2UgQHNhbXB7bWtkaXIgLXB9LCBjb252ZW5pZW50IGFzIGl0IG1heSBiZSwgYmVjYXVzZQotbW9zdCBzeXN0ZW1zIGRvbid0IHN1cHBvcnQgaXQuCi0KLUl0IGlzIGEgZ29vZCBpZGVhIHRvIGF2b2lkIGNyZWF0aW5nIHN5bWJvbGljIGxpbmtzIGluIG1ha2VmaWxlcywgc2luY2UgYQotZmV3IHN5c3RlbXMgZG9uJ3Qgc3VwcG9ydCB0aGVtLgotCi1UaGUgTWFrZWZpbGUgcnVsZXMgZm9yIGJ1aWxkaW5nIGFuZCBpbnN0YWxsYXRpb24gY2FuIGFsc28gdXNlIGNvbXBpbGVycwotYW5kIHJlbGF0ZWQgcHJvZ3JhbXMsIGJ1dCBzaG91bGQgZG8gc28gdmlhIEBjb2Rle21ha2V9IHZhcmlhYmxlcyBzbyB0aGF0IHRoZQotdXNlciBjYW4gc3Vic3RpdHV0ZSBhbHRlcm5hdGl2ZXMuICBIZXJlIGFyZSBzb21lIG9mIHRoZSBwcm9ncmFtcyB3ZQotbWVhbjoKLQotQGV4YW1wbGUKLWFyIGJpc29uIGNjIGZsZXggaW5zdGFsbCBsZCBsZGNvbmZpZyBsZXgKLW1ha2UgbWFrZWluZm8gcmFubGliIHRleGkyZHZpIHlhY2MKLUBlbmQgZXhhbXBsZQotCi1Vc2UgdGhlIGZvbGxvd2luZyBAY29kZXttYWtlfSB2YXJpYWJsZXMgdG8gcnVuIHRob3NlIHByb2dyYW1zOgotCi1AZXhhbXBsZQotJChBUikgJChCSVNPTikgJChDQykgJChGTEVYKSAkKElOU1RBTEwpICQoTEQpICQoTERDT05GSUcpICQoTEVYKQotJChNQUtFKSAkKE1BS0VJTkZPKSAkKFJBTkxJQikgJChURVhJMkRWSSkgJChZQUNDKQotQGVuZCBleGFtcGxlCi0KLVdoZW4geW91IHVzZSBAY29kZXtyYW5saWJ9IG9yIEBjb2Rle2xkY29uZmlnfSwgeW91IHNob3VsZCBtYWtlIHN1cmUKLW5vdGhpbmcgYmFkIGhhcHBlbnMgaWYgdGhlIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBwcm9ncmFtIGluIHF1ZXN0aW9uLgotQXJyYW5nZSB0byBpZ25vcmUgYW4gZXJyb3IgZnJvbSB0aGF0IGNvbW1hbmQsIGFuZCBwcmludCBhIG1lc3NhZ2UgYmVmb3JlCi10aGUgY29tbWFuZCB0byB0ZWxsIHRoZSB1c2VyIHRoYXQgZmFpbHVyZSBvZiB0aGlzIGNvbW1hbmQgZG9lcyBub3QgbWVhbgotYSBwcm9ibGVtLiAgKFRoZSBBdXRvY29uZiBAc2FtcHtBQ19QUk9HX1JBTkxJQn0gbWFjcm8gY2FuIGhlbHAgd2l0aAotdGhpcy4pCi0KLUlmIHlvdSB1c2Ugc3ltYm9saWMgbGlua3MsIHlvdSBzaG91bGQgaW1wbGVtZW50IGEgZmFsbGJhY2sgZm9yIHN5c3RlbXMKLXRoYXQgZG9uJ3QgaGF2ZSBzeW1ib2xpYyBsaW5rcy4KLQotQWRkaXRpb25hbCB1dGlsaXRpZXMgdGhhdCBjYW4gYmUgdXNlZCB2aWEgTWFrZSB2YXJpYWJsZXMgYXJlOgotCi1AZXhhbXBsZQotY2hncnAgY2htb2QgY2hvd24gbWtub2QKLUBlbmQgZXhhbXBsZQotCi1JdCBpcyBvayB0byB1c2Ugb3RoZXIgdXRpbGl0aWVzIGluIE1ha2VmaWxlIHBvcnRpb25zIChvciBzY3JpcHRzKQotaW50ZW5kZWQgb25seSBmb3IgcGFydGljdWxhciBzeXN0ZW1zIHdoZXJlIHlvdSBrbm93IHRob3NlIHV0aWxpdGllcwotZXhpc3QuCi0KLUBub2RlIENvbW1hbmQgVmFyaWFibGVzCi1Ac2VjdGlvbiBWYXJpYWJsZXMgZm9yIFNwZWNpZnlpbmcgQ29tbWFuZHMKLQotTWFrZWZpbGVzIHNob3VsZCBwcm92aWRlIHZhcmlhYmxlcyBmb3Igb3ZlcnJpZGluZyBjZXJ0YWluIGNvbW1hbmRzLCBvcHRpb25zLAotYW5kIHNvIG9uLgotCi1JbiBwYXJ0aWN1bGFyLCB5b3Ugc2hvdWxkIHJ1biBtb3N0IHV0aWxpdHkgcHJvZ3JhbXMgdmlhIHZhcmlhYmxlcy4KLVRodXMsIGlmIHlvdSB1c2UgQmlzb24sIGhhdmUgYSB2YXJpYWJsZSBuYW1lZCBAY29kZXtCSVNPTn0gd2hvc2UgZGVmYXVsdAotdmFsdWUgaXMgc2V0IHdpdGggQHNhbXB7QklTT04gPSBiaXNvbn0sIGFuZCByZWZlciB0byBpdCB3aXRoCi1AY29kZXskKEJJU09OKX0gd2hlbmV2ZXIgeW91IG5lZWQgdG8gdXNlIEJpc29uLgotCi1GaWxlIG1hbmFnZW1lbnQgdXRpbGl0aWVzIHN1Y2ggYXMgQGNvZGV7bG59LCBAY29kZXtybX0sIEBjb2Rle212fSwgYW5kCi1zbyBvbiwgbmVlZCBub3QgYmUgcmVmZXJyZWQgdG8gdGhyb3VnaCB2YXJpYWJsZXMgaW4gdGhpcyB3YXksIHNpbmNlIHVzZXJzCi1kb24ndCBuZWVkIHRvIHJlcGxhY2UgdGhlbSB3aXRoIG90aGVyIHByb2dyYW1zLgotCi1FYWNoIHByb2dyYW0tbmFtZSB2YXJpYWJsZSBzaG91bGQgY29tZSB3aXRoIGFuIG9wdGlvbnMgdmFyaWFibGUgdGhhdCBpcwotdXNlZCB0byBzdXBwbHkgb3B0aW9ucyB0byB0aGUgcHJvZ3JhbS4gIEFwcGVuZCBAc2FtcHtGTEFHU30gdG8gdGhlCi1wcm9ncmFtLW5hbWUgdmFyaWFibGUgbmFtZSB0byBnZXQgdGhlIG9wdGlvbnMgdmFyaWFibGUgbmFtZS0tLWZvcgotZXhhbXBsZSwgQGNvZGV7QklTT05GTEFHU30uICAoVGhlIG5hbWVzIEBjb2Rle0NGTEFHU30gZm9yIHRoZSBDCi1jb21waWxlciwgQGNvZGV7WUZMQUdTfSBmb3IgeWFjYywgYW5kIEBjb2Rle0xGTEFHU30gZm9yIGxleCwgYXJlCi1leGNlcHRpb25zIHRvIHRoaXMgcnVsZSwgYnV0IHdlIGtlZXAgdGhlbSBiZWNhdXNlIHRoZXkgYXJlIHN0YW5kYXJkLikKLVVzZSBAY29kZXtDUFBGTEFHU30gaW4gYW55IGNvbXBpbGF0aW9uIGNvbW1hbmQgdGhhdCBydW5zIHRoZQotcHJlcHJvY2Vzc29yLCBhbmQgdXNlIEBjb2Rle0xERkxBR1N9IGluIGFueSBjb21waWxhdGlvbiBjb21tYW5kIHRoYXQKLWRvZXMgbGlua2luZyBhcyB3ZWxsIGFzIGluIGFueSBkaXJlY3QgdXNlIG9mIEBjb2Rle2xkfS4KLQotSWYgdGhlcmUgYXJlIEMgY29tcGlsZXIgb3B0aW9ucyB0aGF0IEBlbXBoe211c3R9IGJlIHVzZWQgZm9yIHByb3BlcgotY29tcGlsYXRpb24gb2YgY2VydGFpbiBmaWxlcywgZG8gbm90IGluY2x1ZGUgdGhlbSBpbiBAY29kZXtDRkxBR1N9LgotVXNlcnMgZXhwZWN0IHRvIGJlIGFibGUgdG8gc3BlY2lmeSBAY29kZXtDRkxBR1N9IGZyZWVseSB0aGVtc2VsdmVzLgotSW5zdGVhZCwgYXJyYW5nZSB0byBwYXNzIHRoZSBuZWNlc3Nhcnkgb3B0aW9ucyB0byB0aGUgQyBjb21waWxlcgotaW5kZXBlbmRlbnRseSBvZiBAY29kZXtDRkxBR1N9LCBieSB3cml0aW5nIHRoZW0gZXhwbGljaXRseSBpbiB0aGUKLWNvbXBpbGF0aW9uIGNvbW1hbmRzIG9yIGJ5IGRlZmluaW5nIGFuIGltcGxpY2l0IHJ1bGUsIGxpa2UgdGhpczoKLQotQHNtYWxsZXhhbXBsZQotQ0ZMQUdTID0gLWcKLUFMTF9DRkxBR1MgPSAtSS4gJChDRkxBR1MpCi0uYy5vOgotICAgICAgICAkKENDKSAtYyAkKENQUEZMQUdTKSAkKEFMTF9DRkxBR1MpICQ8Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1EbyBpbmNsdWRlIHRoZSBAc2FtcHstZ30gb3B0aW9uIGluIEBjb2Rle0NGTEFHU30sIGJlY2F1c2UgdGhhdCBpcyBub3QKLUBlbXBoe3JlcXVpcmVkfSBmb3IgcHJvcGVyIGNvbXBpbGF0aW9uLiAgWW91IGNhbiBjb25zaWRlciBpdCBhIGRlZmF1bHQKLXRoYXQgaXMgb25seSByZWNvbW1lbmRlZC4gIElmIHRoZSBwYWNrYWdlIGlzIHNldCB1cCBzbyB0aGF0IGl0IGlzCi1jb21waWxlZCB3aXRoIEdDQyBieSBkZWZhdWx0LCB0aGVuIHlvdSBtaWdodCBhcyB3ZWxsIGluY2x1ZGUgQHNhbXB7LU99Ci1pbiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtDRkxBR1N9IGFzIHdlbGwuCi0KLVB1dCBAY29kZXtDRkxBR1N9IGxhc3QgaW4gdGhlIGNvbXBpbGF0aW9uIGNvbW1hbmQsIGFmdGVyIG90aGVyIHZhcmlhYmxlcwotY29udGFpbmluZyBjb21waWxlciBvcHRpb25zLCBzbyB0aGUgdXNlciBjYW4gdXNlIEBjb2Rle0NGTEFHU30gdG8KLW92ZXJyaWRlIHRoZSBvdGhlcnMuCi0KLUBjb2Rle0NGTEFHU30gc2hvdWxkIGJlIHVzZWQgaW4gZXZlcnkgaW52b2NhdGlvbiBvZiB0aGUgQyBjb21waWxlciwKLWJvdGggdGhvc2Ugd2hpY2ggZG8gY29tcGlsYXRpb24gYW5kIHRob3NlIHdoaWNoIGRvIGxpbmtpbmcuCi0KLUV2ZXJ5IE1ha2VmaWxlIHNob3VsZCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle0lOU1RBTEx9LCB3aGljaCBpcyB0aGUKLWJhc2ljIGNvbW1hbmQgZm9yIGluc3RhbGxpbmcgYSBmaWxlIGludG8gdGhlIHN5c3RlbS4KLQotRXZlcnkgTWFrZWZpbGUgc2hvdWxkIGFsc28gZGVmaW5lIHRoZSB2YXJpYWJsZXMgQGNvZGV7SU5TVEFMTF9QUk9HUkFNfQotYW5kIEBjb2Rle0lOU1RBTExfREFUQX0uICAoVGhlIGRlZmF1bHQgZm9yIGVhY2ggb2YgdGhlc2Ugc2hvdWxkIGJlCi1AY29kZXskKElOU1RBTEwpfS4pICBUaGVuIGl0IHNob3VsZCB1c2UgdGhvc2UgdmFyaWFibGVzIGFzIHRoZSBjb21tYW5kcwotZm9yIGFjdHVhbCBpbnN0YWxsYXRpb24sIGZvciBleGVjdXRhYmxlcyBhbmQgbm9uZXhlY3V0YWJsZXMKLXJlc3BlY3RpdmVseS4gIFVzZSB0aGVzZSB2YXJpYWJsZXMgYXMgZm9sbG93czoKLQotQGV4YW1wbGUKLSQoSU5TVEFMTF9QUk9HUkFNKSBmb28gJChiaW5kaXIpL2ZvbwotJChJTlNUQUxMX0RBVEEpIGxpYmZvby5hICQobGliZGlyKS9saWJmb28uYQotQGVuZCBleGFtcGxlCi0KLU9wdGlvbmFsbHksIHlvdSBtYXkgcHJlcGVuZCB0aGUgdmFsdWUgb2YgQGNvZGV7REVTVERJUn0gdG8gdGhlIHRhcmdldAotZmlsZW5hbWUuICBEb2luZyB0aGlzIGFsbG93cyB0aGUgaW5zdGFsbGVyIHRvIGNyZWF0ZSBhIHNuYXBzaG90IG9mIHRoZQotaW5zdGFsbGF0aW9uIHRvIGJlIGNvcGllZCBvbnRvIHRoZSByZWFsIHRhcmdldCBmaWxlc3lzdGVtIGxhdGVyLiAgRG8gbm90Ci1zZXQgdGhlIHZhbHVlIG9mIEBjb2Rle0RFU1RESVJ9IGluIHlvdXIgTWFrZWZpbGUsIGFuZCBkbyBub3QgaW5jbHVkZSBpdAotaW4gYW55IGluc3RhbGxlZCBmaWxlcy4gIFdpdGggc3VwcG9ydCBmb3IgQGNvZGV7REVTVERJUn0sIHRoZSBhYm92ZQotZXhhbXBsZXMgYmVjb21lOgotCi1AZXhhbXBsZQotJChJTlNUQUxMX1BST0dSQU0pIGZvbyAkKERFU1RESVIpJChiaW5kaXIpL2ZvbwotJChJTlNUQUxMX0RBVEEpIGxpYmZvby5hICQoREVTVERJUikkKGxpYmRpcikvbGliZm9vLmEKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLUFsd2F5cyB1c2UgYSBmaWxlIG5hbWUsIG5vdCBhIGRpcmVjdG9yeSBuYW1lLCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mCi10aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmRzLiAgVXNlIGEgc2VwYXJhdGUgY29tbWFuZCBmb3IgZWFjaCBmaWxlIHRvIGJlCi1pbnN0YWxsZWQuCi0KLUBub2RlIERpcmVjdG9yeSBWYXJpYWJsZXMKLUBzZWN0aW9uIFZhcmlhYmxlcyBmb3IgSW5zdGFsbGF0aW9uIERpcmVjdG9yaWVzCi0KLUluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBzaG91bGQgYWx3YXlzIGJlIG5hbWVkIGJ5IHZhcmlhYmxlcywgc28gaXQgaXMKLWVhc3kgdG8gaW5zdGFsbCBpbiBhIG5vbnN0YW5kYXJkIHBsYWNlLiAgVGhlIHN0YW5kYXJkIG5hbWVzIGZvciB0aGVzZQotdmFyaWFibGVzIGFyZSBkZXNjcmliZWQgYmVsb3cuICBUaGV5IGFyZSBiYXNlZCBvbiBhIHN0YW5kYXJkIGZpbGVzeXN0ZW0KLWxheW91dDsgdmFyaWFudHMgb2YgaXQgYXJlIHVzZWQgaW4gU1ZSNCwgNC40QlNELCBMaW51eCwgVWx0cml4IHY0LCBhbmQKLW90aGVyIG1vZGVybiBvcGVyYXRpbmcgc3lzdGVtcy4KLQotVGhlc2UgdHdvIHZhcmlhYmxlcyBzZXQgdGhlIHJvb3QgZm9yIHRoZSBpbnN0YWxsYXRpb24uICBBbGwgdGhlIG90aGVyCi1pbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgc2hvdWxkIGJlIHN1YmRpcmVjdG9yaWVzIG9mIG9uZSBvZiB0aGVzZSB0d28sCi1hbmQgbm90aGluZyBzaG91bGQgYmUgZGlyZWN0bHkgaW5zdGFsbGVkIGludG8gdGhlc2UgdHdvIGRpcmVjdG9yaWVzLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIHByZWZpeAotQSBwcmVmaXggdXNlZCBpbiBjb25zdHJ1Y3RpbmcgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSB2YXJpYWJsZXMgbGlzdGVkCi1iZWxvdy4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIEBjb2Rle3ByZWZpeH0gc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWx9LgotV2hlbiBidWlsZGluZyB0aGUgY29tcGxldGUgR05VIHN5c3RlbSwgdGhlIHByZWZpeCB3aWxsIGJlIGVtcHR5IGFuZAotQGZpbGV7L3Vzcn0gd2lsbCBiZSBhIHN5bWJvbGljIGxpbmsgdG8gQGZpbGV7L30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBwcmVmaXhAQH0uKQotCi1SdW5uaW5nIEBzYW1we21ha2UgaW5zdGFsbH0gd2l0aCBhIGRpZmZlcmVudCB2YWx1ZSBvZiBAY29kZXtwcmVmaXh9Ci1mcm9tIHRoZSBvbmUgdXNlZCB0byBidWlsZCB0aGUgcHJvZ3JhbSBzaG91bGQgQHZhcntub3R9IHJlY29tcGlsZQotdGhlIHByb2dyYW0uCi0KLUBpdGVtIGV4ZWNfcHJlZml4Ci1BIHByZWZpeCB1c2VkIGluIGNvbnN0cnVjdGluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgb2Ygc29tZSBvZiB0aGUKLXZhcmlhYmxlcyBsaXN0ZWQgYmVsb3cuICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAY29kZXtleGVjX3ByZWZpeH0gc2hvdWxkCi1iZSBAY29kZXskKHByZWZpeCl9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAZXhlY19wcmVmaXhAQH0uKQotCi1HZW5lcmFsbHksIEBjb2RleyQoZXhlY19wcmVmaXgpfSBpcyB1c2VkIGZvciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KLW1hY2hpbmUtc3BlY2lmaWMgZmlsZXMgKHN1Y2ggYXMgZXhlY3V0YWJsZXMgYW5kIHN1YnJvdXRpbmUgbGlicmFyaWVzKSwKLXdoaWxlIEBjb2RleyQocHJlZml4KX0gaXMgdXNlZCBkaXJlY3RseSBmb3Igb3RoZXIgZGlyZWN0b3JpZXMuCi0KLVJ1bm5pbmcgQHNhbXB7bWFrZSBpbnN0YWxsfSB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIG9mIEBjb2Rle2V4ZWNfcHJlZml4fQotZnJvbSB0aGUgb25lIHVzZWQgdG8gYnVpbGQgdGhlIHByb2dyYW0gc2hvdWxkIEB2YXJ7bm90fSByZWNvbXBpbGUgdGhlCi1wcm9ncmFtLgotQGVuZCB0YWJsZQotCi1FeGVjdXRhYmxlIHByb2dyYW1zIGFyZSBpbnN0YWxsZWQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gYmluZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdGhhdCB1c2VycyBjYW4gcnVuLgotVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9iaW59LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQoZXhlY19wcmVmaXgpL2Jpbn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBiaW5kaXJAQH0uKQotCi1AaXRlbSBzYmluZGlyCi1UaGUgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGV4ZWN1dGFibGUgcHJvZ3JhbXMgdGhhdCBjYW4gYmUgcnVuIGZyb20KLXRoZSBzaGVsbCwgYnV0IGFyZSBvbmx5IGdlbmVyYWxseSB1c2VmdWwgdG8gc3lzdGVtIGFkbWluaXN0cmF0b3JzLiAgVGhpcwotc2hvdWxkIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvc2Jpbn0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChleGVjX3ByZWZpeCkvc2Jpbn0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBzYmluZGlyQEB9LikKLQotQGl0ZW0gbGliZXhlY2RpcgotQGNvbW1lbnQgVGhpcyBwYXJhZ3JhcGggYWRqdXN0ZWQgdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveCAtLXJvbGFuZCA1anVsOTQKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgZXhlY3V0YWJsZSBwcm9ncmFtcyB0byBiZSBydW4gYnkgb3RoZXIKLXByb2dyYW1zIHJhdGhlciB0aGFuIGJ5IHVzZXJzLiAgVGhpcyBkaXJlY3Rvcnkgc2hvdWxkIG5vcm1hbGx5IGJlCi1AZmlsZXsvdXNyL2xvY2FsL2xpYmV4ZWN9LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChleGVjX3ByZWZpeCkvbGliZXhlY30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBsaWJleGVjZGlyQEB9LikKLUBlbmQgdGFibGUKLQotRGF0YSBmaWxlcyB1c2VkIGJ5IHRoZSBwcm9ncmFtIGR1cmluZyBpdHMgZXhlY3V0aW9uIGFyZSBkaXZpZGVkIGludG8KLWNhdGVnb3JpZXMgaW4gdHdvIHdheXMuCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Tb21lIGZpbGVzIGFyZSBub3JtYWxseSBtb2RpZmllZCBieSBwcm9ncmFtczsgb3RoZXJzIGFyZSBuZXZlciBub3JtYWxseQotbW9kaWZpZWQgKHRob3VnaCB1c2VycyBtYXkgZWRpdCBzb21lIG9mIHRoZXNlKS4KLQotQGl0ZW0KLVNvbWUgZmlsZXMgYXJlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBhbmQgY2FuIGJlIHNoYXJlZCBieSBhbGwKLW1hY2hpbmVzIGF0IGEgc2l0ZTsgc29tZSBhcmUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBhbmQgY2FuIGJlIHNoYXJlZAotb25seSBieSBtYWNoaW5lcyBvZiB0aGUgc2FtZSBraW5kIGFuZCBvcGVyYXRpbmcgc3lzdGVtOyBvdGhlcnMgbWF5IG5ldmVyCi1iZSBzaGFyZWQgYmV0d2VlbiB0d28gbWFjaGluZXMuCi1AZW5kIGl0ZW1pemUKLQotVGhpcyBtYWtlcyBmb3Igc2l4IGRpZmZlcmVudCBwb3NzaWJpbGl0aWVzLiAgSG93ZXZlciwgd2Ugd2FudCB0bwotZGlzY291cmFnZSB0aGUgdXNlIG9mIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMsIGFzaWRlIGZyb20gb2JqZWN0Ci1maWxlcyBhbmQgbGlicmFyaWVzLiAgSXQgaXMgbXVjaCBjbGVhbmVyIHRvIG1ha2Ugb3RoZXIgZGF0YSBmaWxlcwotYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50LCBhbmQgaXQgaXMgZ2VuZXJhbGx5IG5vdCBoYXJkLgotCi1UaGVyZWZvcmUsIGhlcmUgYXJlIHRoZSB2YXJpYWJsZXMgTWFrZWZpbGVzIHNob3VsZCB1c2UgdG8gc3BlY2lmeQotZGlyZWN0b3JpZXM6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gZGF0YWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGRhdGEKLWZpbGVzLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9zaGFyZX0sIGJ1dCB3cml0ZSBpdCBhcwotQGZpbGV7JChwcmVmaXgpL3NoYXJlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGRhdGFkaXJAQH0uKQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgc2VlIEBmaWxleyQoaW5mb2Rpcil9Ci1hbmQgQGZpbGV7JChpbmNsdWRlZGlyKX0gYmVsb3cuCi0KLUBpdGVtIHN5c2NvbmZkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgcmVhZC1vbmx5IGRhdGEgZmlsZXMgdGhhdCBwZXJ0YWluIHRvIGEKLXNpbmdsZSBtYWNoaW5lLS10aGF0IGlzIHRvIHNheSwgZmlsZXMgZm9yIGNvbmZpZ3VyaW5nIGEgaG9zdC4gIE1haWxlcgotYW5kIG5ldHdvcmsgY29uZmlndXJhdGlvbiBmaWxlcywgQGZpbGV7L2V0Yy9wYXNzd2R9LCBhbmQgc28gZm9ydGggYmVsb25nCi1oZXJlLiAgQWxsIHRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBzaG91bGQgYmUgb3JkaW5hcnkgQVNDSUkgdGV4dAotZmlsZXMuICBUaGlzIGRpcmVjdG9yeSBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC9ldGN9LCBidXQKLXdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9ldGN9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAc3lzY29uZmRpckBAfS4pCi0KLURvIG5vdCBpbnN0YWxsIGV4ZWN1dGFibGVzIGhlcmUgaW4gdGhpcyBkaXJlY3RvcnkgKHRoZXkgcHJvYmFibHkgYmVsb25nCi1pbiBAZmlsZXskKGxpYmV4ZWNkaXIpfSBvciBAZmlsZXskKHNiaW5kaXIpfSkuICBBbHNvIGRvIG5vdCBpbnN0YWxsCi1maWxlcyB0aGF0IGFyZSBtb2RpZmllZCBpbiB0aGUgbm9ybWFsIGNvdXJzZSBvZiB0aGVpciB1c2UgKHByb2dyYW1zCi13aG9zZSBwdXJwb3NlIGlzIHRvIGNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgc3lzdGVtIGV4Y2x1ZGVkKS4KLVRob3NlIHByb2JhYmx5IGJlbG9uZyBpbiBAZmlsZXskKGxvY2Fsc3RhdGVkaXIpfS4KLQotQGl0ZW0gc2hhcmVkc3RhdGVkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgZmlsZXMgd2hpY2gKLXRoZSBwcm9ncmFtcyBtb2RpZnkgd2hpbGUgdGhleSBydW4uICBUaGlzIHNob3VsZCBub3JtYWxseSBiZQotQGZpbGV7L3Vzci9sb2NhbC9jb219LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChwcmVmaXgpL2NvbX0uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBzaGFyZWRzdGF0ZWRpckBAfS4pCi0KLUBpdGVtIGxvY2Fsc3RhdGVkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgZGF0YSBmaWxlcyB3aGljaCB0aGUgcHJvZ3JhbXMgbW9kaWZ5IHdoaWxlCi10aGV5IHJ1biwgYW5kIHRoYXQgcGVydGFpbiB0byBvbmUgc3BlY2lmaWMgbWFjaGluZS4gIFVzZXJzIHNob3VsZCBuZXZlcgotbmVlZCB0byBtb2RpZnkgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlJ3MKLW9wZXJhdGlvbjsgcHV0IHN1Y2ggY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiBzZXBhcmF0ZSBmaWxlcyB0aGF0IGdvCi1pbiBAZmlsZXskKGRhdGFkaXIpfSBvciBAZmlsZXskKHN5c2NvbmZkaXIpfS4gIEBmaWxleyQobG9jYWxzdGF0ZWRpcil9Ci1zaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9sb2NhbC92YXJ9LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQocHJlZml4KS92YXJ9LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbG9jYWxzdGF0ZWRpckBAfS4pCi0KLUBpdGVtIGxpYmRpcgotVGhlIGRpcmVjdG9yeSBmb3Igb2JqZWN0IGZpbGVzIGFuZCBsaWJyYXJpZXMgb2Ygb2JqZWN0IGNvZGUuICBEbyBub3QKLWluc3RhbGwgZXhlY3V0YWJsZXMgaGVyZSwgdGhleSBwcm9iYWJseSBvdWdodCB0byBnbyBpbiBAZmlsZXskKGxpYmV4ZWNkaXIpfQotaW5zdGVhZC4gIFRoZSB2YWx1ZSBvZiBAY29kZXtsaWJkaXJ9IHNob3VsZCBub3JtYWxseSBiZQotQGZpbGV7L3Vzci9sb2NhbC9saWJ9LCBidXQgd3JpdGUgaXQgYXMgQGZpbGV7JChleGVjX3ByZWZpeCkvbGlifS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGxpYmRpckBAfS4pCi0KLUBpdGVtIGluZm9kaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgdGhlIEluZm8gZmlsZXMgZm9yIHRoaXMgcGFja2FnZS4gIEJ5Ci1kZWZhdWx0LCBpdCBzaG91bGQgYmUgQGZpbGV7L3Vzci9sb2NhbC9pbmZvfSwgYnV0IGl0IHNob3VsZCBiZSB3cml0dGVuCi1hcyBAZmlsZXskKHByZWZpeCkvaW5mb30uCi0oSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgaXQgYXMgQHNhbXB7QEBpbmZvZGlyQEB9LikKLQotQGl0ZW0gbGlzcGRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBhbnkgRW1hY3MgTGlzcCBmaWxlcyBpbiB0aGlzIHBhY2thZ2UuICBCeQotZGVmYXVsdCwgaXQgc2hvdWxkIGJlIEBmaWxley91c3IvbG9jYWwvc2hhcmUvZW1hY3Mvc2l0ZS1saXNwfSwgYnV0IGl0Ci1zaG91bGQgYmUgd3JpdHRlbiBhcyBAZmlsZXskKHByZWZpeCkvc2hhcmUvZW1hY3Mvc2l0ZS1saXNwfS4KLQotSWYgeW91IGFyZSB1c2luZyBBdXRvY29uZiwgd3JpdGUgdGhlIGRlZmF1bHQgYXMgQHNhbXB7QEBsaXNwZGlyQEB9LgotSW4gb3JkZXIgdG8gbWFrZSBAc2FtcHtAQGxpc3BkaXJAQH0gd29yaywgeW91IG5lZWQgdGhlIGZvbGxvd2luZyBsaW5lcwotaW4geW91ciBAZmlsZXtjb25maWd1cmUuaW59IGZpbGU6Ci0KLUBleGFtcGxlCi1saXNwZGlyPSckQHtkYXRhZGlyQH0vZW1hY3Mvc2l0ZS1saXNwJwotQUNfU1VCU1QobGlzcGRpcikKLUBlbmQgZXhhbXBsZQotCi1AaXRlbSBpbmNsdWRlZGlyCi1AYyByZXdyaXR0ZW4gdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveCAtLXJvbGFuZAotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBoZWFkZXIgZmlsZXMgdG8gYmUgaW5jbHVkZWQgYnkgdXNlcgotcHJvZ3JhbXMgd2l0aCB0aGUgQyBAc2FtcHsjaW5jbHVkZX0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZS4gIFRoaXMKLXNob3VsZCBub3JtYWxseSBiZSBAZmlsZXsvdXNyL2xvY2FsL2luY2x1ZGV9LCBidXQgd3JpdGUgaXQgYXMKLUBmaWxleyQocHJlZml4KS9pbmNsdWRlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB3cml0ZSBpdCBhcyBAc2FtcHtAQGluY2x1ZGVkaXJAQH0uKQotCi1Nb3N0IGNvbXBpbGVycyBvdGhlciB0aGFuIEdDQyBkbyBub3QgbG9vayBmb3IgaGVhZGVyIGZpbGVzIGluIGRpcmVjdG9yeQotQGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlfS4gIFNvIGluc3RhbGxpbmcgdGhlIGhlYWRlciBmaWxlcyB0aGlzIHdheSBpcwotb25seSB1c2VmdWwgd2l0aCBHQ0MuICBTb21ldGltZXMgdGhpcyBpcyBub3QgYSBwcm9ibGVtIGJlY2F1c2Ugc29tZQotbGlicmFyaWVzIGFyZSBvbmx5IHJlYWxseSBpbnRlbmRlZCB0byB3b3JrIHdpdGggR0NDLiAgQnV0IHNvbWUgbGlicmFyaWVzCi1hcmUgaW50ZW5kZWQgdG8gd29yayB3aXRoIG90aGVyIGNvbXBpbGVycy4gIFRoZXkgc2hvdWxkIGluc3RhbGwgdGhlaXIKLWhlYWRlciBmaWxlcyBpbiB0d28gcGxhY2VzLCBvbmUgc3BlY2lmaWVkIGJ5IEBjb2Rle2luY2x1ZGVkaXJ9IGFuZCBvbmUKLXNwZWNpZmllZCBieSBAY29kZXtvbGRpbmNsdWRlZGlyfS4KLQotQGl0ZW0gb2xkaW5jbHVkZWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBAc2FtcHsjaW5jbHVkZX0gaGVhZGVyIGZpbGVzIGZvciB1c2Ugd2l0aAotY29tcGlsZXJzIG90aGVyIHRoYW4gR0NDLiAgVGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgQGZpbGV7L3Vzci9pbmNsdWRlfS4KLShJZiB5b3UgYXJlIHVzaW5nIEF1dG9jb25mLCB5b3UgY2FuIHdyaXRlIGl0IGFzIEBzYW1we0BAb2xkaW5jbHVkZWRpckBAfS4pCi0KLVRoZSBNYWtlZmlsZSBjb21tYW5kcyBzaG91bGQgY2hlY2sgd2hldGhlciB0aGUgdmFsdWUgb2YKLUBjb2Rle29sZGluY2x1ZGVkaXJ9IGlzIGVtcHR5LiAgSWYgaXQgaXMsIHRoZXkgc2hvdWxkIG5vdCB0cnkgdG8gdXNlCi1pdDsgdGhleSBzaG91bGQgY2FuY2VsIHRoZSBzZWNvbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBoZWFkZXIgZmlsZXMuCi0KLUEgcGFja2FnZSBzaG91bGQgbm90IHJlcGxhY2UgYW4gZXhpc3RpbmcgaGVhZGVyIGluIHRoaXMgZGlyZWN0b3J5IHVubGVzcwotdGhlIGhlYWRlciBjYW1lIGZyb20gdGhlIHNhbWUgcGFja2FnZS4gIFRodXMsIGlmIHlvdXIgRm9vIHBhY2thZ2UKLXByb3ZpZGVzIGEgaGVhZGVyIGZpbGUgQGZpbGV7Zm9vLmh9LCB0aGVuIGl0IHNob3VsZCBpbnN0YWxsIHRoZSBoZWFkZXIKLWZpbGUgaW4gdGhlIEBjb2Rle29sZGluY2x1ZGVkaXJ9IGRpcmVjdG9yeSBpZiBlaXRoZXIgKDEpIHRoZXJlIGlzIG5vCi1AZmlsZXtmb28uaH0gdGhlcmUgb3IgKDIpIHRoZSBAZmlsZXtmb28uaH0gdGhhdCBleGlzdHMgY2FtZSBmcm9tIHRoZSBGb28KLXBhY2thZ2UuCi0KLVRvIHRlbGwgd2hldGhlciBAZmlsZXtmb28uaH0gY2FtZSBmcm9tIHRoZSBGb28gcGFja2FnZSwgcHV0IGEgbWFnaWMKLXN0cmluZyBpbiB0aGUgZmlsZS0tLXBhcnQgb2YgYSBjb21tZW50LS0tYW5kIEBjb2Rle2dyZXB9IGZvciB0aGF0IHN0cmluZy4KLUBlbmQgdGFibGUKLQotVW5peC1zdHlsZSBtYW4gcGFnZXMgYXJlIGluc3RhbGxlZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBtYW5kaXIKLVRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIHRoZSBtYW4gcGFnZXMgKGlmIGFueSkgZm9yIHRoaXMKLXBhY2thZ2UuICBJdCB3aWxsIG5vcm1hbGx5IGJlIEBmaWxley91c3IvbG9jYWwvbWFufSwgYnV0IHlvdSBzaG91bGQKLXdyaXRlIGl0IGFzIEBmaWxleyQocHJlZml4KS9tYW59LgotKElmIHlvdSBhcmUgdXNpbmcgQXV0b2NvbmYsIHdyaXRlIGl0IGFzIEBzYW1we0BAbWFuZGlyQEB9LikKLQotQGl0ZW0gbWFuMWRpcgotVGhlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBzZWN0aW9uIDEgbWFuIHBhZ2VzLiAgV3JpdGUgaXQgYXMKLUBmaWxleyQobWFuZGlyKS9tYW4xfS4KLUBpdGVtIG1hbjJkaXIKLVRoZSBkaXJlY3RvcnkgZm9yIGluc3RhbGxpbmcgc2VjdGlvbiAyIG1hbiBwYWdlcy4gIFdyaXRlIGl0IGFzCi1AZmlsZXskKG1hbmRpcikvbWFuMn0KLUBpdGVtIEBkb3Rze30KLQotQHN0cm9uZ3tEb24ndCBtYWtlIHRoZSBwcmltYXJ5IGRvY3VtZW50YXRpb24gZm9yIGFueSBHTlUgc29mdHdhcmUgYmUgYQotbWFuIHBhZ2UuICBXcml0ZSBhIG1hbnVhbCBpbiBUZXhpbmZvIGluc3RlYWQuICBNYW4gcGFnZXMgYXJlIGp1c3QgZm9yCi10aGUgc2FrZSBvZiBwZW9wbGUgcnVubmluZyBHTlUgc29mdHdhcmUgb24gVW5peCwgd2hpY2ggaXMgYSBzZWNvbmRhcnkKLWFwcGxpY2F0aW9uIG9ubHkufQotCi1AaXRlbSBtYW5leHQKLVRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIGZvciB0aGUgaW5zdGFsbGVkIG1hbiBwYWdlLiAgVGhpcyBzaG91bGQgY29udGFpbgotYSBwZXJpb2QgZm9sbG93ZWQgYnkgdGhlIGFwcHJvcHJpYXRlIGRpZ2l0OyBpdCBzaG91bGQgbm9ybWFsbHkgYmUgQHNhbXB7LjF9LgotCi1AaXRlbSBtYW4xZXh0Ci1UaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgaW5zdGFsbGVkIHNlY3Rpb24gMSBtYW4gcGFnZXMuCi1AaXRlbSBtYW4yZXh0Ci1UaGUgZmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgaW5zdGFsbGVkIHNlY3Rpb24gMiBtYW4gcGFnZXMuCi1AaXRlbSBAZG90c3t9Ci1Vc2UgdGhlc2UgbmFtZXMgaW5zdGVhZCBvZiBAc2FtcHttYW5leHR9IGlmIHRoZSBwYWNrYWdlIG5lZWRzIHRvIGluc3RhbGwgbWFuCi1wYWdlcyBpbiBtb3JlIHRoYW4gb25lIHNlY3Rpb24gb2YgdGhlIG1hbnVhbC4KLUBlbmQgdGFibGUKLQotQW5kIGZpbmFsbHksIHlvdSBzaG91bGQgc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gc3JjZGlyCi1UaGUgZGlyZWN0b3J5IGZvciB0aGUgc291cmNlcyBiZWluZyBjb21waWxlZC4gIFRoZSB2YWx1ZSBvZiB0aGlzCi12YXJpYWJsZSBpcyBub3JtYWxseSBpbnNlcnRlZCBieSB0aGUgQGNvZGV7Y29uZmlndXJlfSBzaGVsbCBzY3JpcHQuCi0oSWYgeW91IGFyZSB1c2luZyBBdXRjb25mLCB1c2UgQHNhbXB7c3JjZGlyID0gQEBzcmNkaXJAQH0uKQotQGVuZCB0YWJsZQotCi1Gb3IgZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotQGMgSSBoYXZlIGNoYW5nZWQgc29tZSBvZiB0aGUgY29tbWVudHMgaGVyZSBzbGlnaHRseSB0byBmaXggYW4gb3ZlcmZ1bGwKLUBjIGhib3gsIHNvIHRoZSBtYWtlIG1hbnVhbCBjYW4gZm9ybWF0IGNvcnJlY3RseS4gLS1yb2xhbmQKLSMgQ29tbW9uIHByZWZpeCBmb3IgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotIyBOT1RFOiBUaGlzIGRpcmVjdG9yeSBtdXN0IGV4aXN0IHdoZW4geW91IHN0YXJ0IHRoZSBpbnN0YWxsLgotcHJlZml4ID0gL3Vzci9sb2NhbAotZXhlY19wcmVmaXggPSAkKHByZWZpeCkKLSMgV2hlcmUgdG8gcHV0IHRoZSBleGVjdXRhYmxlIGZvciB0aGUgY29tbWFuZCBgZ2NjJy4KLWJpbmRpciA9ICQoZXhlY19wcmVmaXgpL2JpbgotIyBXaGVyZSB0byBwdXQgdGhlIGRpcmVjdG9yaWVzIHVzZWQgYnkgdGhlIGNvbXBpbGVyLgotbGliZXhlY2RpciA9ICQoZXhlY19wcmVmaXgpL2xpYmV4ZWMKLSMgV2hlcmUgdG8gcHV0IHRoZSBJbmZvIGZpbGVzLgotaW5mb2RpciA9ICQocHJlZml4KS9pbmZvCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3VyIHByb2dyYW0gaW5zdGFsbHMgYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgaW50byBvbmUgb2YgdGhlCi1zdGFuZGFyZCB1c2VyLXNwZWNpZmllZCBkaXJlY3RvcmllcywgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIGdyb3VwIHRoZW0KLWludG8gYSBzdWJkaXJlY3RvcnkgcGFydGljdWxhciB0byB0aGF0IHByb2dyYW0uICBJZiB5b3UgZG8gdGhpcywgeW91Ci1zaG91bGQgd3JpdGUgdGhlIEBjb2Rle2luc3RhbGx9IHJ1bGUgdG8gY3JlYXRlIHRoZXNlIHN1YmRpcmVjdG9yaWVzLgotCi1EbyBub3QgZXhwZWN0IHRoZSB1c2VyIHRvIGluY2x1ZGUgdGhlIHN1YmRpcmVjdG9yeSBuYW1lIGluIHRoZSB2YWx1ZSBvZgotYW55IG9mIHRoZSB2YXJpYWJsZXMgbGlzdGVkIGFib3ZlLiAgVGhlIGlkZWEgb2YgaGF2aW5nIGEgdW5pZm9ybSBzZXQgb2YKLXZhcmlhYmxlIG5hbWVzIGZvciBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgaXMgdG8gZW5hYmxlIHRoZSB1c2VyIHRvCi1zcGVjaWZ5IHRoZSBleGFjdCBzYW1lIHZhbHVlcyBmb3Igc2V2ZXJhbCBkaWZmZXJlbnQgR05VIHBhY2thZ2VzLiAgSW4KLW9yZGVyIGZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgYWxsIHRoZSBwYWNrYWdlcyBtdXN0IGJlIGRlc2lnbmVkIHNvIHRoYXQKLXRoZXkgd2lsbCB3b3JrIHNlbnNpYmx5IHdoZW4gdGhlIHVzZXIgZG9lcyBzby4KLQotQG5vZGUgU3RhbmRhcmQgVGFyZ2V0cwotQHNlY3Rpb24gU3RhbmRhcmQgVGFyZ2V0cyBmb3IgVXNlcnMKLQotQWxsIEdOVSBwcm9ncmFtcyBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHRhcmdldHMgaW4gdGhlaXIgTWFrZWZpbGVzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIGFsbAotQ29tcGlsZSB0aGUgZW50aXJlIHByb2dyYW0uICBUaGlzIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQuICBUaGlzCi10YXJnZXQgbmVlZCBub3QgcmVidWlsZCBhbnkgZG9jdW1lbnRhdGlvbiBmaWxlczsgSW5mbyBmaWxlcyBzaG91bGQKLW5vcm1hbGx5IGJlIGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sIGFuZCBEVkkgZmlsZXMgc2hvdWxkIGJlIG1hZGUKLW9ubHkgd2hlbiBleHBsaWNpdGx5IGFza2VkIGZvci4KLQotQnkgZGVmYXVsdCwgdGhlIE1ha2UgcnVsZXMgc2hvdWxkIGNvbXBpbGUgYW5kIGxpbmsgd2l0aCBAc2FtcHstZ30sIHNvCi10aGF0IGV4ZWN1dGFibGUgcHJvZ3JhbXMgaGF2ZSBkZWJ1Z2dpbmcgc3ltYm9scy4gIFVzZXJzIHdobyBkb24ndCBtaW5kCi1iZWluZyBoZWxwbGVzcyBjYW4gc3RyaXAgdGhlIGV4ZWN1dGFibGVzIGxhdGVyIGlmIHRoZXkgd2lzaC4KLQotQGl0ZW0gaW5zdGFsbAotQ29tcGlsZSB0aGUgcHJvZ3JhbSBhbmQgY29weSB0aGUgZXhlY3V0YWJsZXMsIGxpYnJhcmllcywgYW5kIHNvIG9uIHRvCi10aGUgZmlsZSBuYW1lcyB3aGVyZSB0aGV5IHNob3VsZCByZXNpZGUgZm9yIGFjdHVhbCB1c2UuICBJZiB0aGVyZSBpcyBhCi1zaW1wbGUgdGVzdCB0byB2ZXJpZnkgdGhhdCBhIHByb2dyYW0gaXMgcHJvcGVybHkgaW5zdGFsbGVkLCB0aGlzIHRhcmdldAotc2hvdWxkIHJ1biB0aGF0IHRlc3QuCi0KLURvIG5vdCBzdHJpcCBleGVjdXRhYmxlcyB3aGVuIGluc3RhbGxpbmcgdGhlbS4gIERldmlsLW1heS1jYXJlIHVzZXJzIGNhbgotdXNlIHRoZSBAY29kZXtpbnN0YWxsLXN0cmlwfSB0YXJnZXQgdG8gZG8gdGhhdC4KLQotSWYgcG9zc2libGUsIHdyaXRlIHRoZSBAY29kZXtpbnN0YWxsfSB0YXJnZXQgcnVsZSBzbyB0aGF0IGl0IGRvZXMgbm90Ci1tb2RpZnkgYW55dGhpbmcgaW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgcHJvZ3JhbSB3YXMgYnVpbHQsIHByb3ZpZGVkCi1Ac2FtcHttYWtlIGFsbH0gaGFzIGp1c3QgYmVlbiBkb25lLiAgVGhpcyBpcyBjb252ZW5pZW50IGZvciBidWlsZGluZyB0aGUKLXByb2dyYW0gdW5kZXIgb25lIHVzZXIgbmFtZSBhbmQgaW5zdGFsbGluZyBpdCB1bmRlciBhbm90aGVyLgotCi1UaGUgY29tbWFuZHMgc2hvdWxkIGNyZWF0ZSBhbGwgdGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIGZpbGVzIGFyZSB0byBiZQotaW5zdGFsbGVkLCBpZiB0aGV5IGRvbid0IGFscmVhZHkgZXhpc3QuICBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGFzIHRoZSB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlcyBAY29kZXtwcmVmaXh9IGFuZAotQGNvZGV7ZXhlY19wcmVmaXh9LCBhcyB3ZWxsIGFzIGFsbCBzdWJkaXJlY3RvcmllcyB0aGF0IGFyZSBuZWVkZWQuCi1PbmUgd2F5IHRvIGRvIHRoaXMgaXMgYnkgbWVhbnMgb2YgYW4gQGNvZGV7aW5zdGFsbGRpcnN9IHRhcmdldAotYXMgZGVzY3JpYmVkIGJlbG93LgotCi1Vc2UgQHNhbXB7LX0gYmVmb3JlIGFueSBjb21tYW5kIGZvciBpbnN0YWxsaW5nIGEgbWFuIHBhZ2UsIHNvIHRoYXQKLUBjb2Rle21ha2V9IHdpbGwgaWdub3JlIGFueSBlcnJvcnMuICBUaGlzIGlzIGluIGNhc2UgdGhlcmUgYXJlIHN5c3RlbXMKLXRoYXQgZG9uJ3QgaGF2ZSB0aGUgVW5peCBtYW4gcGFnZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBpbnN0YWxsZWQuCi0KLVRoZSB3YXkgdG8gaW5zdGFsbCBJbmZvIGZpbGVzIGlzIHRvIGNvcHkgdGhlbSBpbnRvIEBmaWxleyQoaW5mb2Rpcil9Ci13aXRoIEBjb2RleyQoSU5TVEFMTF9EQVRBKX0gKEBweHJlZntDb21tYW5kIFZhcmlhYmxlc30pLCBhbmQgdGhlbiBydW4KLXRoZSBAY29kZXtpbnN0YWxsLWluZm99IHByb2dyYW0gaWYgaXQgaXMgcHJlc2VudC4gIEBjb2Rle2luc3RhbGwtaW5mb30KLWlzIGEgcHJvZ3JhbSB0aGF0IGVkaXRzIHRoZSBJbmZvIEBmaWxle2Rpcn0gZmlsZSB0byBhZGQgb3IgdXBkYXRlIHRoZQotbWVudSBlbnRyeSBmb3IgdGhlIGdpdmVuIEluZm8gZmlsZTsgaXQgaXMgcGFydCBvZiB0aGUgVGV4aW5mbyBwYWNrYWdlLgotSGVyZSBpcyBhIHNhbXBsZSBydWxlIHRvIGluc3RhbGwgYW4gSW5mbyBmaWxlOgotCi1AY29tbWVudCBUaGlzIGV4YW1wbGUgaGFzIGJlZW4gY2FyZWZ1bGx5IGZvcm1hdHRlZCBmb3IgdGhlIE1ha2UgbWFudWFsLgotQGNvbW1lbnQgUGxlYXNlIGRvIG5vdCByZWZvcm1hdCBpdCB3aXRob3V0IHRhbGtpbmcgdG8gcm9sYW5kQGdudS5haS5taXQuZWR1LgotQHNtYWxsZXhhbXBsZQotJChERVNURElSKSQoaW5mb2RpcikvZm9vLmluZm86IGZvby5pbmZvCi0gICAgICAgICQoUE9TVF9JTlNUQUxMKQotIyBUaGVyZSBtYXkgYmUgYSBuZXdlciBpbmZvIGZpbGUgaW4gLiB0aGFuIGluIHNyY2Rpci4KLSAgICAgICAgLWlmIHRlc3QgLWYgZm9vLmluZm87IHRoZW4gZD0uOyBcCi0gICAgICAgICBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotICAgICAgICAkKElOU1RBTExfREFUQSkgJCRkL2Zvby5pbmZvICQoREVTVERJUikkQEA7IFwKLSMgUnVuIGluc3RhbGwtaW5mbyBvbmx5IGlmIGl0IGV4aXN0cy4KLSMgVXNlIGBpZicgaW5zdGVhZCBvZiBqdXN0IHByZXBlbmRpbmcgYC0nIHRvIHRoZQotIyBsaW5lIHNvIHdlIG5vdGljZSByZWFsIGVycm9ycyBmcm9tIGluc3RhbGwtaW5mby4KLSMgV2UgdXNlIGAkKFNIRUxMKSAtYycgYmVjYXVzZSBzb21lIHNoZWxscyBkbyBub3QKLSMgZmFpbCBncmFjZWZ1bGx5IHdoZW4gdGhlcmUgaXMgYW4gdW5rbm93biBjb21tYW5kLgotICAgICAgICBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbicgXAotICAgICAgICAgICA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotICAgICAgICAgIGluc3RhbGwtaW5mbyAtLWRpci1maWxlPSQoREVTVERJUikkKGluZm9kaXIpL2RpciBcCi0gICAgICAgICAgICAgICAgICAgICAgICQoREVTVERJUikkKGluZm9kaXIpL2Zvby5pbmZvOyBcCi0gICAgICAgIGVsc2UgdHJ1ZTsgZmkKLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4gd3JpdGluZyB0aGUgQGNvZGV7aW5zdGFsbH0gdGFyZ2V0LCB5b3UgbXVzdCBjbGFzc2lmeSBhbGwgdGhlCi1jb21tYW5kcyBpbnRvIHRocmVlIGNhdGVnb3JpZXM6IG5vcm1hbCBvbmVzLCBAZGZue3ByZS1pbnN0YWxsYXRpb259Ci1jb21tYW5kcyBhbmQgQGRmbntwb3N0LWluc3RhbGxhdGlvbn0gY29tbWFuZHMuICBAeHJlZntJbnN0YWxsIENvbW1hbmQKLUNhdGVnb3JpZXN9LgotCi1AaXRlbSB1bmluc3RhbGwKLURlbGV0ZSBhbGwgdGhlIGluc3RhbGxlZCBmaWxlcy0tLXRoZSBjb3BpZXMgdGhhdCB0aGUgQHNhbXB7aW5zdGFsbH0KLXRhcmdldCBjcmVhdGVzLgotCi1UaGlzIHJ1bGUgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIGNvbXBpbGF0aW9uIGlzIGRvbmUsCi1vbmx5IHRoZSBkaXJlY3RvcmllcyB3aGVyZSBmaWxlcyBhcmUgaW5zdGFsbGVkLgotCi1UaGUgdW5pbnN0YWxsYXRpb24gY29tbWFuZHMgYXJlIGRpdmlkZWQgaW50byB0aHJlZSBjYXRlZ29yaWVzLCBqdXN0IGxpa2UKLXRoZSBpbnN0YWxsYXRpb24gY29tbWFuZHMuICBAeHJlZntJbnN0YWxsIENvbW1hbmQgQ2F0ZWdvcmllc30uCi0KLUBpdGVtIGluc3RhbGwtc3RyaXAKLUxpa2UgQGNvZGV7aW5zdGFsbH0sIGJ1dCBzdHJpcCB0aGUgZXhlY3V0YWJsZSBmaWxlcyB3aGlsZSBpbnN0YWxsaW5nCi10aGVtLiAgSW4gbWFueSBjYXNlcywgdGhlIGRlZmluaXRpb24gb2YgdGhpcyB0YXJnZXQgY2FuIGJlIHZlcnkgc2ltcGxlOgotCi1Ac21hbGxleGFtcGxlCi1pbnN0YWxsLXN0cmlwOgotICAgICAgICAkKE1BS0UpIElOU1RBTExfUFJPR1JBTT0nJChJTlNUQUxMX1BST0dSQU0pIC1zJyBcCi0gICAgICAgICAgICAgICAgaW5zdGFsbAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm9ybWFsbHkgd2UgZG8gbm90IHJlY29tbWVuZCBzdHJpcHBpbmcgYW4gZXhlY3V0YWJsZSB1bmxlc3MgeW91IGFyZSBzdXJlCi10aGUgcHJvZ3JhbSBoYXMgbm8gYnVncy4gIEhvd2V2ZXIsIGl0IGNhbiBiZSByZWFzb25hYmxlIHRvIGluc3RhbGwgYQotc3RyaXBwZWQgZXhlY3V0YWJsZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB3aGlsZSBzYXZpbmcgdGhlIHVuc3RyaXBwZWQKLWV4ZWN1dGFibGUgZWxzZXdoZXJlIGluIGNhc2UgdGhlcmUgaXMgYSBidWcuCi0KLUBjb21tZW50IFRoZSBncmF0dWl0b3VzIGJsYW5rIGxpbmUgaGVyZSBpcyB0byBtYWtlIHRoZSB0YWJsZSBsb29rIGJldHRlcgotQGNvbW1lbnQgaW4gdGhlIHByaW50ZWQgTWFrZSBtYW51YWwuICBQbGVhc2UgbGVhdmUgaXQgaW4uCi1AaXRlbSBjbGVhbgotCi1EZWxldGUgYWxsIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgYXJlIG5vcm1hbGx5IGNyZWF0ZWQgYnkKLWJ1aWxkaW5nIHRoZSBwcm9ncmFtLiAgRG9uJ3QgZGVsZXRlIHRoZSBmaWxlcyB0aGF0IHJlY29yZCB0aGUKLWNvbmZpZ3VyYXRpb24uICBBbHNvIHByZXNlcnZlIGZpbGVzIHRoYXQgY291bGQgYmUgbWFkZSBieSBidWlsZGluZywgYnV0Ci1ub3JtYWxseSBhcmVuJ3QgYmVjYXVzZSB0aGUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggdGhlbS4KLQotRGVsZXRlIEBmaWxley5kdml9IGZpbGVzIGhlcmUgaWYgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KLQotQGl0ZW0gZGlzdGNsZWFuCi1EZWxldGUgYWxsIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgYXJlIGNyZWF0ZWQgYnkKLWNvbmZpZ3VyaW5nIG9yIGJ1aWxkaW5nIHRoZSBwcm9ncmFtLiAgSWYgeW91IGhhdmUgdW5wYWNrZWQgdGhlIHNvdXJjZQotYW5kIGJ1aWx0IHRoZSBwcm9ncmFtIHdpdGhvdXQgY3JlYXRpbmcgYW55IG90aGVyIGZpbGVzLCBAc2FtcHttYWtlCi1kaXN0Y2xlYW59IHNob3VsZCBsZWF2ZSBvbmx5IHRoZSBmaWxlcyB0aGF0IHdlcmUgaW4gdGhlIGRpc3RyaWJ1dGlvbi4KLQotQGl0ZW0gbW9zdGx5Y2xlYW4KLUxpa2UgQHNhbXB7Y2xlYW59LCBidXQgbWF5IHJlZnJhaW4gZnJvbSBkZWxldGluZyBhIGZldyBmaWxlcyB0aGF0IHBlb3BsZQotbm9ybWFsbHkgZG9uJ3Qgd2FudCB0byByZWNvbXBpbGUuICBGb3IgZXhhbXBsZSwgdGhlIEBzYW1we21vc3RseWNsZWFufQotdGFyZ2V0IGZvciBHQ0MgZG9lcyBub3QgZGVsZXRlIEBmaWxle2xpYmdjYy5hfSwgYmVjYXVzZSByZWNvbXBpbGluZyBpdAotaXMgcmFyZWx5IG5lY2Vzc2FyeSBhbmQgdGFrZXMgYSBsb3Qgb2YgdGltZS4KLQotQGl0ZW0gbWFpbnRhaW5lci1jbGVhbgotRGVsZXRlIGFsbW9zdCBldmVyeXRoaW5nIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgY2FuIGJlCi1yZWNvbnN0cnVjdGVkIHdpdGggdGhpcyBNYWtlZmlsZS4gIFRoaXMgdHlwaWNhbGx5IGluY2x1ZGVzIGV2ZXJ5dGhpbmcKLWRlbGV0ZWQgYnkgQGNvZGV7ZGlzdGNsZWFufSwgcGx1cyBtb3JlOiBDIHNvdXJjZSBmaWxlcyBwcm9kdWNlZCBieQotQmlzb24sIHRhZ3MgdGFibGVzLCBJbmZvIGZpbGVzLCBhbmQgc28gb24uCi0KLVRoZSByZWFzb24gd2Ugc2F5IGBgYWxtb3N0IGV2ZXJ5dGhpbmcnJyBpcyB0aGF0IHJ1bm5pbmcgdGhlIGNvbW1hbmQKLUBzYW1we21ha2UgbWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkIG5vdCBkZWxldGUgQGZpbGV7Y29uZmlndXJlfSBldmVuIGlmCi1AZmlsZXtjb25maWd1cmV9IGNhbiBiZSByZW1hZGUgdXNpbmcgYSBydWxlIGluIHRoZSBNYWtlZmlsZS4gIE1vcmUgZ2VuZXJhbGx5LAotQHNhbXB7bWFrZSBtYWludGFpbmVyLWNsZWFufSBzaG91bGQgbm90IGRlbGV0ZSBhbnl0aGluZyB0aGF0IG5lZWRzIHRvCi1leGlzdCBpbiBvcmRlciB0byBydW4gQGZpbGV7Y29uZmlndXJlfSBhbmQgdGhlbiBiZWdpbiB0byBidWlsZCB0aGUKLXByb2dyYW0uICBUaGlzIGlzIHRoZSBvbmx5IGV4Y2VwdGlvbjsgQGNvZGV7bWFpbnRhaW5lci1jbGVhbn0gc2hvdWxkCi1kZWxldGUgZXZlcnl0aGluZyBlbHNlIHRoYXQgY2FuIGJlIHJlYnVpbHQuCi0KLVRoZSBAc2FtcHttYWludGFpbmVyLWNsZWFufSB0YXJnZXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBhIG1haW50YWluZXIgb2YKLXRoZSBwYWNrYWdlLCBub3QgYnkgb3JkaW5hcnkgdXNlcnMuICBZb3UgbWF5IG5lZWQgc3BlY2lhbCB0b29scyB0bwotcmVjb25zdHJ1Y3Qgc29tZSBvZiB0aGUgZmlsZXMgdGhhdCBAc2FtcHttYWtlIG1haW50YWluZXItY2xlYW59IGRlbGV0ZXMuCi1TaW5jZSB0aGVzZSBmaWxlcyBhcmUgbm9ybWFsbHkgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgd2UgZG9uJ3QKLXRha2UgY2FyZSB0byBtYWtlIHRoZW0gZWFzeSB0byByZWNvbnN0cnVjdC4gIElmIHlvdSBmaW5kIHlvdSBuZWVkIHRvCi11bnBhY2sgdGhlIGZ1bGwgZGlzdHJpYnV0aW9uIGFnYWluLCBkb24ndCBibGFtZSB1cy4KLQotVG8gaGVscCBtYWtlIHVzZXJzIGF3YXJlIG9mIHRoaXMsIHRoZSBjb21tYW5kcyBmb3IgdGhlIHNwZWNpYWwKLUBjb2Rle21haW50YWluZXItY2xlYW59IHRhcmdldCBzaG91bGQgc3RhcnQgd2l0aCB0aGVzZSB0d286Ci0KLUBzbWFsbGV4YW1wbGUKLUBAZWNobyAnVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IGl0JwotQEBlY2hvICdkZWxldGVzIGZpbGVzIHRoYXQgbWF5IG5lZWQgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLicKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIFRBR1MKLVVwZGF0ZSBhIHRhZ3MgdGFibGUgZm9yIHRoaXMgcHJvZ3JhbS4KLUBjIEFEUjogaG93PwotCi1AaXRlbSBpbmZvCi1HZW5lcmF0ZSBhbnkgSW5mbyBmaWxlcyBuZWVkZWQuICBUaGUgYmVzdCB3YXkgdG8gd3JpdGUgdGhlIHJ1bGVzIGlzIGFzCi1mb2xsb3dzOgotCi1Ac21hbGxleGFtcGxlCi1pbmZvOiBmb28uaW5mbwotCi1mb28uaW5mbzogZm9vLnRleGkgY2hhcDEudGV4aSBjaGFwMi50ZXhpCi0gICAgICAgICQoTUFLRUlORk8pICQoc3JjZGlyKS9mb28udGV4aQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Zb3UgbXVzdCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle01BS0VJTkZPfSBpbiB0aGUgTWFrZWZpbGUuICBJdCBzaG91bGQKLXJ1biB0aGUgQGNvZGV7bWFrZWluZm99IHByb2dyYW0sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFRleGluZm8KLWRpc3RyaWJ1dGlvbi4KLQotTm9ybWFsbHkgYSBHTlUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggSW5mbyBmaWxlcywgYW5kIHRoYXQgbWVhbnMgdGhlCi1JbmZvIGZpbGVzIGFyZSBwcmVzZW50IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LiAgVGhlcmVmb3JlLCB0aGUgTWFrZQotcnVsZSBmb3IgYW4gaW5mbyBmaWxlIHNob3VsZCB1cGRhdGUgaXQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuICBXaGVuCi11c2VycyBidWlsZCB0aGUgcGFja2FnZSwgb3JkaW5hcmlseSBNYWtlIHdpbGwgbm90IHVwZGF0ZSB0aGUgSW5mbyBmaWxlcwotYmVjYXVzZSB0aGV5IHdpbGwgYWxyZWFkeSBiZSB1cCB0byBkYXRlLgotCi1AaXRlbSBkdmkKLUdlbmVyYXRlIERWSSBmaWxlcyBmb3IgYWxsIFRleGluZm8gZG9jdW1lbnRhdGlvbi4KLUZvciBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi1kdmk6IGZvby5kdmkKLQotZm9vLmR2aTogZm9vLnRleGkgY2hhcDEudGV4aSBjaGFwMi50ZXhpCi0gICAgICAgICQoVEVYSTJEVkkpICQoc3JjZGlyKS9mb28udGV4aQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1Zb3UgbXVzdCBkZWZpbmUgdGhlIHZhcmlhYmxlIEBjb2Rle1RFWEkyRFZJfSBpbiB0aGUgTWFrZWZpbGUuICBJdCBzaG91bGQKLXJ1biB0aGUgcHJvZ3JhbSBAY29kZXt0ZXhpMmR2aX0sIHdoaWNoIGlzIHBhcnQgb2YgdGhlIFRleGluZm8KLWRpc3RyaWJ1dGlvbi5AZm9vdG5vdGV7QGNvZGV7dGV4aTJkdml9IHVzZXMgQFRlWHt9IHRvIGRvIHRoZSByZWFsIHdvcmsKLW9mIGZvcm1hdHRpbmcuIEBUZVh7fSBpcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCBUZXhpbmZvLn0gIEFsdGVybmF0aXZlbHksCi13cml0ZSBqdXN0IHRoZSBkZXBlbmRlbmNpZXMsIGFuZCBhbGxvdyBHTlUgQGNvZGV7bWFrZX0gdG8gcHJvdmlkZSB0aGUgY29tbWFuZC4KLQotQGl0ZW0gZGlzdAotQ3JlYXRlIGEgZGlzdHJpYnV0aW9uIHRhciBmaWxlIGZvciB0aGlzIHByb2dyYW0uICBUaGUgdGFyIGZpbGUgc2hvdWxkIGJlCi1zZXQgdXAgc28gdGhhdCB0aGUgZmlsZSBuYW1lcyBpbiB0aGUgdGFyIGZpbGUgc3RhcnQgd2l0aCBhIHN1YmRpcmVjdG9yeQotbmFtZSB3aGljaCBpcyB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSBpdCBpcyBhIGRpc3RyaWJ1dGlvbiBmb3IuICBUaGlzCi1uYW1lIGNhbiBpbmNsdWRlIHRoZSB2ZXJzaW9uIG51bWJlci4KLQotRm9yIGV4YW1wbGUsIHRoZSBkaXN0cmlidXRpb24gdGFyIGZpbGUgb2YgR0NDIHZlcnNpb24gMS40MCB1bnBhY2tzIGludG8KLWEgc3ViZGlyZWN0b3J5IG5hbWVkIEBmaWxle2djYy0xLjQwfS4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gY3JlYXRlIGEgc3ViZGlyZWN0b3J5IGFwcHJvcHJpYXRlbHkKLW5hbWVkLCB1c2UgQGNvZGV7bG59IG9yIEBjb2Rle2NwfSB0byBpbnN0YWxsIHRoZSBwcm9wZXIgZmlsZXMgaW4gaXQsIGFuZAotdGhlbiBAY29kZXt0YXJ9IHRoYXQgc3ViZGlyZWN0b3J5LgotCi1Db21wcmVzcyB0aGUgdGFyIGZpbGUgZmlsZSB3aXRoIEBjb2Rle2d6aXB9LiAgRm9yIGV4YW1wbGUsIHRoZSBhY3R1YWwKLWRpc3RyaWJ1dGlvbiBmaWxlIGZvciBHQ0MgdmVyc2lvbiAxLjQwIGlzIGNhbGxlZCBAZmlsZXtnY2MtMS40MC50YXIuZ3p9LgotCi1UaGUgQGNvZGV7ZGlzdH0gdGFyZ2V0IHNob3VsZCBleHBsaWNpdGx5IGRlcGVuZCBvbiBhbGwgbm9uLXNvdXJjZSBmaWxlcwotdGhhdCBhcmUgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHVwIHRvIGRhdGUgaW4gdGhlCi1kaXN0cmlidXRpb24uCi1AaWZzZXQgQ09ERVNURAotQHhyZWZ7UmVsZWFzZXMsICwgTWFraW5nIFJlbGVhc2VzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIENPREVTVEQKLUB4cmVme1JlbGVhc2VzLCAsIE1ha2luZyBSZWxlYXNlcywgc3RhbmRhcmRzLCBHTlUgQ29kaW5nIFN0YW5kYXJkc30uCi1AZW5kIGlmY2xlYXIKLQotQGl0ZW0gY2hlY2sKLVBlcmZvcm0gc2VsZi10ZXN0cyAoaWYgYW55KS4gIFRoZSB1c2VyIG11c3QgYnVpbGQgdGhlIHByb2dyYW0gYmVmb3JlCi1ydW5uaW5nIHRoZSB0ZXN0cywgYnV0IG5lZWQgbm90IGluc3RhbGwgdGhlIHByb2dyYW07IHlvdSBzaG91bGQgd3JpdGUKLXRoZSBzZWxmLXRlc3RzIHNvIHRoYXQgdGhleSB3b3JrIHdoZW4gdGhlIHByb2dyYW0gaXMgYnVpbHQgYnV0IG5vdAotaW5zdGFsbGVkLgotQGVuZCB0YWJsZQotCi1UaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIHN1Z2dlc3RlZCBhcyBjb252ZW50aW9uYWwgbmFtZXMsIGZvciBwcm9ncmFtcwotaW4gd2hpY2ggdGhleSBhcmUgdXNlZnVsLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGluc3RhbGxjaGVjawotUGVyZm9ybSBpbnN0YWxsYXRpb24gdGVzdHMgKGlmIGFueSkuICBUaGUgdXNlciBtdXN0IGJ1aWxkIGFuZCBpbnN0YWxsCi10aGUgcHJvZ3JhbSBiZWZvcmUgcnVubmluZyB0aGUgdGVzdHMuICBZb3Ugc2hvdWxkIG5vdCBhc3N1bWUgdGhhdAotQGZpbGV7JChiaW5kaXIpfSBpcyBpbiB0aGUgc2VhcmNoIHBhdGguCi0KLUBpdGVtIGluc3RhbGxkaXJzCi1JdCdzIHVzZWZ1bCB0byBhZGQgYSB0YXJnZXQgbmFtZWQgQHNhbXB7aW5zdGFsbGRpcnN9IHRvIGNyZWF0ZSB0aGUKLWRpcmVjdG9yaWVzIHdoZXJlIGZpbGVzIGFyZSBpbnN0YWxsZWQsIGFuZCB0aGVpciBwYXJlbnQgZGlyZWN0b3JpZXMuCi1UaGVyZSBpcyBhIHNjcmlwdCBjYWxsZWQgQGZpbGV7bWtpbnN0YWxsZGlyc30gd2hpY2ggaXMgY29udmVuaWVudCBmb3IKLXRoaXM7IHlvdSBjYW4gZmluZCBpdCBpbiB0aGUgVGV4aW5mbyBwYWNrYWdlLgotQGMgSXQncyBpbiAvZ2QvZ251L2xpYi9ta2luc3RhbGxkaXJzLgotWW91IGNhbiB1c2UgYSBydWxlIGxpa2UgdGhpczoKLQotQGNvbW1lbnQgVGhpcyBoYXMgYmVlbiBjYXJlZnVsbHkgZm9ybWF0dGVkIHRvIGxvb2sgZGVjZW50IGluIHRoZSBNYWtlIG1hbnVhbC4KLUBjb21tZW50IFBsZWFzZSBiZSBzdXJlIG5vdCB0byBtYWtlIGl0IGV4dGVuZCBhbnkgZnVydGhlciB0byB0aGUgcmlnaHQuLS1yb2xhbmQKLUBzbWFsbGV4YW1wbGUKLSMgTWFrZSBzdXJlIGFsbCBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgKGUuZy4gJChiaW5kaXIpKQotIyBhY3R1YWxseSBleGlzdCBieSBtYWtpbmcgdGhlbSBpZiBuZWNlc3NhcnkuCi1pbnN0YWxsZGlyczogbWtpbnN0YWxsZGlycwotICAgICAgICAkKHNyY2RpcikvbWtpbnN0YWxsZGlycyAkKGJpbmRpcikgJChkYXRhZGlyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQobGliZGlyKSAkKGluZm9kaXIpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChtYW5kaXIpCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHJ1bGUgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGRpcmVjdG9yaWVzIHdoZXJlIGNvbXBpbGF0aW9uIGlzIGRvbmUuCi1JdCBzaG91bGQgZG8gbm90aGluZyBidXQgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5zdGFsbCBDb21tYW5kIENhdGVnb3JpZXMKLUBzZWN0aW9uIEluc3RhbGwgQ29tbWFuZCBDYXRlZ29yaWVzCi0KLUBjaW5kZXggcHJlLWluc3RhbGxhdGlvbiBjb21tYW5kcwotQGNpbmRleCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcwotV2hlbiB3cml0aW5nIHRoZSBAY29kZXtpbnN0YWxsfSB0YXJnZXQsIHlvdSBtdXN0IGNsYXNzaWZ5IGFsbCB0aGUKLWNvbW1hbmRzIGludG8gdGhyZWUgY2F0ZWdvcmllczogbm9ybWFsIG9uZXMsIEBkZm57cHJlLWluc3RhbGxhdGlvbn0KLWNvbW1hbmRzIGFuZCBAZGZue3Bvc3QtaW5zdGFsbGF0aW9ufSBjb21tYW5kcy4KLQotTm9ybWFsIGNvbW1hbmRzIG1vdmUgZmlsZXMgaW50byB0aGVpciBwcm9wZXIgcGxhY2VzLCBhbmQgc2V0IHRoZWlyCi1tb2Rlcy4gIFRoZXkgbWF5IG5vdCBhbHRlciBhbnkgZmlsZXMgZXhjZXB0IHRoZSBvbmVzIHRoYXQgY29tZSBlbnRpcmVseQotZnJvbSB0aGUgcGFja2FnZSB0aGV5IGJlbG9uZyB0by4KLQotUHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgbWF5IGFsdGVyIG90aGVyIGZpbGVzOwotaW4gcGFydGljdWxhciwgdGhleSBjYW4gZWRpdCBnbG9iYWwgY29uZmlndXJhdGlvbiBmaWxlcyBvciBkYXRhIGJhc2VzLgotCi1QcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGFyZSB0eXBpY2FsbHkgZXhlY3V0ZWQgYmVmb3JlIHRoZSBub3JtYWwKLWNvbW1hbmRzLCBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMgYXJlIHR5cGljYWxseSBydW4gYWZ0ZXIgdGhlCi1ub3JtYWwgY29tbWFuZHMuCi0KLVRoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIGEgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZCBpcyB0byBydW4KLUBjb2Rle2luc3RhbGwtaW5mb30uICBUaGlzIGNhbm5vdCBiZSBkb25lIHdpdGggYSBub3JtYWwgY29tbWFuZCwgc2luY2UKLWl0IGFsdGVycyBhIGZpbGUgKHRoZSBJbmZvIGRpcmVjdG9yeSkgd2hpY2ggZG9lcyBub3QgY29tZSBlbnRpcmVseSBhbmQKLXNvbGVseSBmcm9tIHRoZSBwYWNrYWdlIGJlaW5nIGluc3RhbGxlZC4gIEl0IGlzIGEgcG9zdC1pbnN0YWxsYXRpb24KLWNvbW1hbmQgYmVjYXVzZSBpdCBuZWVkcyB0byBiZSBkb25lIGFmdGVyIHRoZSBub3JtYWwgY29tbWFuZCB3aGljaAotaW5zdGFsbHMgdGhlIHBhY2thZ2UncyBJbmZvIGZpbGVzLgotCi1Nb3N0IHByb2dyYW1zIGRvbid0IG5lZWQgYW55IHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHMsIGJ1dCB3ZSBoYXZlIHRoZQotZmVhdHVyZSBqdXN0IGluIGNhc2UgaXQgaXMgbmVlZGVkLgotCi1UbyBjbGFzc2lmeSB0aGUgY29tbWFuZHMgaW4gdGhlIEBjb2Rle2luc3RhbGx9IHJ1bGUgaW50byB0aGVzZSB0aHJlZQotY2F0ZWdvcmllcywgaW5zZXJ0IEBkZm57Y2F0ZWdvcnkgbGluZXN9IGFtb25nIHRoZW0uICBBIGNhdGVnb3J5IGxpbmUKLXNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgZm9yIHRoZSBjb21tYW5kcyB0aGF0IGZvbGxvdy4KLQotQSBjYXRlZ29yeSBsaW5lIGNvbnNpc3RzIG9mIGEgdGFiIGFuZCBhIHJlZmVyZW5jZSB0byBhIHNwZWNpYWwgTWFrZQotdmFyaWFibGUsIHBsdXMgYW4gb3B0aW9uYWwgY29tbWVudCBhdCB0aGUgZW5kLiAgVGhlcmUgYXJlIHRocmVlCi12YXJpYWJsZXMgeW91IGNhbiB1c2UsIG9uZSBmb3IgZWFjaCBjYXRlZ29yeTsgdGhlIHZhcmlhYmxlIG5hbWUKLXNwZWNpZmllcyB0aGUgY2F0ZWdvcnkuICBDYXRlZ29yeSBsaW5lcyBhcmUgbm8tb3BzIGluIG9yZGluYXJ5IGV4ZWN1dGlvbgotYmVjYXVzZSB0aGVzZSB0aHJlZSBNYWtlIHZhcmlhYmxlcyBhcmUgbm9ybWFsbHkgdW5kZWZpbmVkIChhbmQgeW91Ci1AZW1waHtzaG91bGQgbm90fSBkZWZpbmUgdGhlbSBpbiB0aGUgbWFrZWZpbGUpLgotCi1IZXJlIGFyZSB0aGUgdGhyZWUgcG9zc2libGUgY2F0ZWdvcnkgbGluZXMsIGVhY2ggd2l0aCBhIGNvbW1lbnQgdGhhdAotZXhwbGFpbnMgd2hhdCBpdCBtZWFuczoKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAkKFBSRV9JTlNUQUxMKSAgICAgIyBAcntQcmUtaW5zdGFsbCBjb21tYW5kcyBmb2xsb3cufQotICAgICAgICAkKFBPU1RfSU5TVEFMTCkgICAgIyBAcntQb3N0LWluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChOT1JNQUxfSU5TVEFMTCkgICMgQHJ7Tm9ybWFsIGNvbW1hbmRzIGZvbGxvdy59Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1JZiB5b3UgZG9uJ3QgdXNlIGEgY2F0ZWdvcnkgbGluZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBAY29kZXtpbnN0YWxsfQotcnVsZSwgYWxsIHRoZSBjb21tYW5kcyBhcmUgY2xhc3NpZmllZCBhcyBub3JtYWwgdW50aWwgdGhlIGZpcnN0IGNhdGVnb3J5Ci1saW5lLiAgSWYgeW91IGRvbid0IHVzZSBhbnkgY2F0ZWdvcnkgbGluZXMsIGFsbCB0aGUgY29tbWFuZHMgYXJlCi1jbGFzc2lmaWVkIGFzIG5vcm1hbC4KLQotVGhlc2UgYXJlIHRoZSBjYXRlZ29yeSBsaW5lcyBmb3IgQGNvZGV7dW5pbnN0YWxsfToKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICAkKFBSRV9VTklOU1RBTEwpICAgICAjIEBye1ByZS11bmluc3RhbGwgY29tbWFuZHMgZm9sbG93Ln0KLSAgICAgICAgJChQT1NUX1VOSU5TVEFMTCkgICAgIyBAcntQb3N0LXVuaW5zdGFsbCBjb21tYW5kcyBmb2xsb3cufQotICAgICAgICAkKE5PUk1BTF9VTklOU1RBTEwpICAjIEBye05vcm1hbCBjb21tYW5kcyBmb2xsb3cufQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVHlwaWNhbGx5LCBhIHByZS11bmluc3RhbGwgY29tbWFuZCB3b3VsZCBiZSB1c2VkIGZvciBkZWxldGluZyBlbnRyaWVzCi1mcm9tIHRoZSBJbmZvIGRpcmVjdG9yeS4KLQotSWYgdGhlIEBjb2Rle2luc3RhbGx9IG9yIEBjb2Rle3VuaW5zdGFsbH0gdGFyZ2V0IGhhcyBhbnkgZGVwZW5kZW5jaWVzCi13aGljaCBhY3QgYXMgc3Vicm91dGluZXMgb2YgaW5zdGFsbGF0aW9uLCB0aGVuIHlvdSBzaG91bGQgc3RhcnQKLUBlbXBoe2VhY2h9IGRlcGVuZGVuY3kncyBjb21tYW5kcyB3aXRoIGEgY2F0ZWdvcnkgbGluZSwgYW5kIHN0YXJ0IHRoZQotbWFpbiB0YXJnZXQncyBjb21tYW5kcyB3aXRoIGEgY2F0ZWdvcnkgbGluZSBhbHNvLiAgVGhpcyB3YXksIHlvdSBjYW4KLWVuc3VyZSB0aGF0IGVhY2ggY29tbWFuZCBpcyBwbGFjZWQgaW4gdGhlIHJpZ2h0IGNhdGVnb3J5IHJlZ2FyZGxlc3Mgb2YKLXdoaWNoIG9mIHRoZSBkZXBlbmRlbmNpZXMgYWN0dWFsbHkgcnVuLgotCi1QcmUtaW5zdGFsbGF0aW9uIGFuZCBwb3N0LWluc3RhbGxhdGlvbiBjb21tYW5kcyBzaG91bGQgbm90IHJ1biBhbnkKLXByb2dyYW1zIGV4Y2VwdCBmb3IgdGhlc2U6Ci0KLUBleGFtcGxlCi1bIGJhc2VuYW1lIGJhc2ggY2F0IGNoZ3JwIGNobW9kIGNob3duIGNtcCBjcCBkZCBkaWZmIGVjaG8KLWVncmVwIGV4cGFuZCBleHByIGZhbHNlIGZncmVwIGZpbmQgZ2V0b3B0IGdyZXAgZ3VuemlwIGd6aXAKLWhvc3RuYW1lIGluc3RhbGwgaW5zdGFsbC1pbmZvIGtpbGwgbGRjb25maWcgbG4gbHMgbWQ1c3VtCi1ta2RpciBta2ZpZm8gbWtub2QgbXYgcHJpbnRlbnYgcHdkIHJtIHJtZGlyIHNlZCBzb3J0IHRlZQotdGVzdCB0b3VjaCB0cnVlIHVuYW1lIHhhcmdzIHllcwotQGVuZCBleGFtcGxlCi0KLUBjaW5kZXggYmluYXJ5IHBhY2thZ2VzCi1UaGUgcmVhc29uIGZvciBkaXN0aW5ndWlzaGluZyB0aGUgY29tbWFuZHMgaW4gdGhpcyB3YXkgaXMgZm9yIHRoZSBzYWtlCi1vZiBtYWtpbmcgYmluYXJ5IHBhY2thZ2VzLiAgVHlwaWNhbGx5IGEgYmluYXJ5IHBhY2thZ2UgY29udGFpbnMgYWxsIHRoZQotZXhlY3V0YWJsZXMgYW5kIG90aGVyIGZpbGVzIHRoYXQgbmVlZCB0byBiZSBpbnN0YWxsZWQsIGFuZCBoYXMgaXRzIG93bgotbWV0aG9kIG9mIGluc3RhbGxpbmcgdGhlbS0tLXNvIGl0IGRvZXMgbm90IG5lZWQgdG8gcnVuIHRoZSBub3JtYWwKLWluc3RhbGxhdGlvbiBjb21tYW5kcy4gIEJ1dCBpbnN0YWxsaW5nIHRoZSBiaW5hcnkgcGFja2FnZSBkb2VzIG5lZWQgdG8KLWV4ZWN1dGUgdGhlIHByZS1pbnN0YWxsYXRpb24gYW5kIHBvc3QtaW5zdGFsbGF0aW9uIGNvbW1hbmRzLgotCi1Qcm9ncmFtcyB0byBidWlsZCBiaW5hcnkgcGFja2FnZXMgd29yayBieSBleHRyYWN0aW5nIHRoZQotcHJlLWluc3RhbGxhdGlvbiBhbmQgcG9zdC1pbnN0YWxsYXRpb24gY29tbWFuZHMuICBIZXJlIGlzIG9uZSB3YXkgb2YKLWV4dHJhY3RpbmcgdGhlIHByZS1pbnN0YWxsYXRpb24gY29tbWFuZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLW1ha2UgLW4gaW5zdGFsbCAtbyBhbGwgXAotICAgICAgUFJFX0lOU1RBTEw9cHJlLWluc3RhbGwgXAotICAgICAgUE9TVF9JTlNUQUxMPXBvc3QtaW5zdGFsbCBcCi0gICAgICBOT1JNQUxfSU5TVEFMTD1ub3JtYWwtaW5zdGFsbCBcCi0gIHwgZ2F3ayAtZiBwcmUtaW5zdGFsbC5hd2sKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgdGhlIGZpbGUgQGZpbGV7cHJlLWluc3RhbGwuYXdrfSBjb3VsZCBjb250YWluIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLSQwIH4gL15cdFsgXHRdKihub3JtYWxfaW5zdGFsbHxwb3N0X2luc3RhbGwpWyBcdF0qJC8gQHtvbiA9IDBAfQotb24gQHtwcmludCAkMEB9Ci0kMCB+IC9eXHRbIFx0XSpwcmVfaW5zdGFsbFsgXHRdKiQvIEB7b24gPSAxQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSByZXN1bHRpbmcgZmlsZSBvZiBwcmUtaW5zdGFsbGF0aW9uIGNvbW1hbmRzIGlzIGV4ZWN1dGVkIGFzIGEgc2hlbGwKLXNjcmlwdCBhcyBwYXJ0IG9mIGluc3RhbGxpbmcgdGhlIGJpbmFyeSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvZXRjL3N0YW5kYXJkcy50ZXhpIGIvZXRjL3N0YW5kYXJkcy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBiZjhiLi4wMDAwMDAwCi0tLSBhL2V0Yy9zdGFuZGFyZHMudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDMwOTMgKzAsMCBAQAotXGlucHV0IHRleGluZm8gQGMgLSotdGV4aW5mby0qLQotQGMgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgc3RhbmRhcmRzLmluZm8KLUBzZXR0aXRsZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotQGMgVGhpcyBkYXRlIGlzIGF1dG9tYWdpY2FsbHkgdXBkYXRlZCB3aGVuIHlvdSBzYXZlIHRoaXMgZmlsZToKLUBzZXQgbGFzdHVwZGF0ZSBNYXJjaCAxMywgMTk5OAotQGMgJSoqZW5kIG9mIGhlYWRlcgotCi1AaWZpbmZvCi1AZm9ybWF0Ci1TVEFSVC1JTkZPLURJUi1FTlRSWQotKiBTdGFuZGFyZHM6IChzdGFuZGFyZHMpLiAgICAgICAgR05VIGNvZGluZyBzdGFuZGFyZHMuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AYyBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmCi0KLUBjIFRoaXMgaXMgdXNlZCBieSBhIGNyb3NzIHJlZiBpbiBtYWtlLXN0ZHMudGV4aQotQHNldCBDT0RFU1REICAxCi1AaWZ0ZXgKLUBzZXQgQ0hBUFRFUiBjaGFwdGVyCi1AZW5kIGlmdGV4Ci1AaWZpbmZvCi1Ac2V0IENIQVBURVIgbm9kZQotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotR05VIENvZGluZyBTdGFuZGFyZHMKLUNvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotQGVuZCBpZ25vcmUKLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucywKLWV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIHN0YXRlZCBpbiBhIHRyYW5zbGF0aW9uIGFwcHJvdmVkCi1ieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotQGVuZCBpZmluZm8KLQotQHRpdGxlcGFnZQotQHRpdGxlIEdOVSBDb2RpbmcgU3RhbmRhcmRzCi1AYXV0aG9yIFJpY2hhcmQgU3RhbGxtYW4KLUBhdXRob3IgbGFzdCB1cGRhdGVkIEB2YWx1ZXtsYXN0dXBkYXRlfQotQHBhZ2UKLQotQHZza2lwIDBwdCBwbHVzIDFmaWxsbAotQ29weXJpZ2h0IEBjb3B5cmlnaHR7fSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUgZW50aXJlCi1yZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMsCi1leGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBzdGF0ZWQgaW4gYSB0cmFuc2xhdGlvbiBhcHByb3ZlZAotYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcCwgUHJlZmFjZSwgKGRpciksIChkaXIpCi1AdG9wIFZlcnNpb24KLQotTGFzdCB1cGRhdGVkIEB2YWx1ZXtsYXN0dXBkYXRlfS4KLUBlbmQgaWZpbmZvCi0KLUBtZW51Ci0qIFByZWZhY2U6OiAgICAgICAgICAgICAgICAgICAgIEFib3V0IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotKiBJbnRlbGxlY3R1YWwgUHJvcGVydHk6OiAgICAgICBLZWVwaW5nIEZyZWUgU29mdHdhcmUgRnJlZQotKiBEZXNpZ24gQWR2aWNlOjogICAgICAgICAgICAgICBHZW5lcmFsIFByb2dyYW0gRGVzaWduCi0qIFByb2dyYW0gQmVoYXZpb3I6OiAgICAgICAgICAgIFByb2dyYW0gQmVoYXZpb3IgZm9yIEFsbCBQcm9ncmFtcwotKiBXcml0aW5nIEM6OiAgICAgICAgICAgICAgICAgICBNYWtpbmcgVGhlIEJlc3QgVXNlIG9mIEMKLSogRG9jdW1lbnRhdGlvbjo6ICAgICAgICAgICAgICAgRG9jdW1lbnRpbmcgUHJvZ3JhbXMKLSogTWFuYWdpbmcgUmVsZWFzZXM6OiAgICAgICAgICAgVGhlIFJlbGVhc2UgUHJvY2VzcwotQGVuZCBtZW51Ci0KLUBub2RlIFByZWZhY2UKLUBjaGFwdGVyIEFib3V0IHRoZSBHTlUgQ29kaW5nIFN0YW5kYXJkcwotCi1UaGUgR05VIENvZGluZyBTdGFuZGFyZHMgd2VyZSB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYW5kIG90aGVyIEdOVQotUHJvamVjdCB2b2x1bnRlZXJzLiAgVGhlaXIgcHVycG9zZSBpcyB0byBtYWtlIHRoZSBHTlUgc3lzdGVtIGNsZWFuLAotY29uc2lzdGVudCwgYW5kIGVhc3kgdG8gaW5zdGFsbC4gIFRoaXMgZG9jdW1lbnQgY2FuIGFsc28gYmUgcmVhZCBhcyBhCi1ndWlkZSB0byB3cml0aW5nIHBvcnRhYmxlLCByb2J1c3QgYW5kIHJlbGlhYmxlIHByb2dyYW1zLiAgSXQgZm9jdXNlcyBvbgotcHJvZ3JhbXMgd3JpdHRlbiBpbiBDLCBidXQgbWFueSBvZiB0aGUgcnVsZXMgYW5kIHByaW5jaXBsZXMgYXJlIHVzZWZ1bAotZXZlbiBpZiB5b3Ugd3JpdGUgaW4gYW5vdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZS4gIFRoZSBydWxlcyBvZnRlbgotc3RhdGUgcmVhc29ucyBmb3Igd3JpdGluZyBpbiBhIGNlcnRhaW4gd2F5LgotCi1Db3JyZWN0aW9ucyBvciBzdWdnZXN0aW9ucyBmb3IgdGhpcyBkb2N1bWVudCBzaG91bGQgYmUgc2VudCB0bwotQGVtYWlse2dudUBAZ251Lm9yZ30uICBJZiB5b3UgbWFrZSBhIHN1Z2dlc3Rpb24sIHBsZWFzZSBpbmNsdWRlIGEKLXN1Z2dlc3RlZCBuZXcgd29yZGluZyBmb3IgaXQ7IG91ciB0aW1lIGlzIGxpbWl0ZWQuICBXZSBwcmVmZXIgYSBjb250ZXh0Ci1kaWZmIHRvIHRoZSBAZmlsZXtzdGFuZGFyZHMudGV4aX0gb3IgQGZpbGV7bWFrZS1zdGRzLnRleGl9IGZpbGVzLCBidXQgaWYKLXlvdSBkb24ndCBoYXZlIHRob3NlIGZpbGVzLCBwbGVhc2UgbWFpbCB5b3VyIHN1Z2dlc3Rpb24gYW55d2F5LgotCi1UaGlzIHJlbGVhc2Ugb2YgdGhlIEdOVSBDb2RpbmcgU3RhbmRhcmRzIHdhcyBsYXN0IHVwZGF0ZWQKLUB2YWx1ZXtsYXN0dXBkYXRlfS4KLQotQG5vZGUgSW50ZWxsZWN0dWFsIFByb3BlcnR5Ci1AY2hhcHRlciBLZWVwaW5nIEZyZWUgU29mdHdhcmUgRnJlZQotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBkaXNjdXNzZXMgaG93IHlvdSBjYW4gbWFrZSBzdXJlIHRoYXQgR05VIHNvZnR3YXJlCi1yZW1haW5zIHVuZW5jdW1iZXJlZC4KLQotQG1lbnUKLSogUmVhZGluZyBOb24tRnJlZSBDb2RlOjogICAgICAgUmVmZXJyaW5nIHRvIFByb3ByaWV0YXJ5IFByb2dyYW1zCi0qIENvbnRyaWJ1dGlvbnM6OiAgICAgICAgICAgICAgIEFjY2VwdGluZyBDb250cmlidXRpb25zCi1AZW5kIG1lbnUKLQotQG5vZGUgUmVhZGluZyBOb24tRnJlZSBDb2RlCi1Ac2VjdGlvbiBSZWZlcnJpbmcgdG8gUHJvcHJpZXRhcnkgUHJvZ3JhbXMKLQotRG9uJ3QgaW4gYW55IGNpcmN1bXN0YW5jZXMgcmVmZXIgdG8gVW5peCBzb3VyY2UgY29kZSBmb3Igb3IgZHVyaW5nCi15b3VyIHdvcmsgb24gR05VISAgKE9yIHRvIGFueSBvdGhlciBwcm9wcmlldGFyeSBwcm9ncmFtcy4pCi0KLUlmIHlvdSBoYXZlIGEgdmFndWUgcmVjb2xsZWN0aW9uIG9mIHRoZSBpbnRlcm5hbHMgb2YgYSBVbml4IHByb2dyYW0sCi10aGlzIGRvZXMgbm90IGFic29sdXRlbHkgbWVhbiB5b3UgY2FuJ3Qgd3JpdGUgYW4gaW1pdGF0aW9uIG9mIGl0LCBidXQKLWRvIHRyeSB0byBvcmdhbml6ZSB0aGUgaW1pdGF0aW9uIGludGVybmFsbHkgYWxvbmcgZGlmZmVyZW50IGxpbmVzLAotYmVjYXVzZSB0aGlzIGlzIGxpa2VseSB0byBtYWtlIHRoZSBkZXRhaWxzIG9mIHRoZSBVbml4IHZlcnNpb24KLWlycmVsZXZhbnQgYW5kIGRpc3NpbWlsYXIgdG8geW91ciByZXN1bHRzLgotCi1Gb3IgZXhhbXBsZSwgVW5peCB1dGlsaXRpZXMgd2VyZSBnZW5lcmFsbHkgb3B0aW1pemVkIHRvIG1pbmltaXplCi1tZW1vcnkgdXNlOyBpZiB5b3UgZ28gZm9yIHNwZWVkIGluc3RlYWQsIHlvdXIgcHJvZ3JhbSB3aWxsIGJlIHZlcnkKLWRpZmZlcmVudC4gIFlvdSBjb3VsZCBrZWVwIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBpbiBjb3JlIGFuZCBzY2FuIGl0Ci10aGVyZSBpbnN0ZWFkIG9mIHVzaW5nIHN0ZGlvLiAgVXNlIGEgc21hcnRlciBhbGdvcml0aG0gZGlzY292ZXJlZCBtb3JlCi1yZWNlbnRseSB0aGFuIHRoZSBVbml4IHByb2dyYW0uICBFbGltaW5hdGUgdXNlIG9mIHRlbXBvcmFyeSBmaWxlcy4gIERvCi1pdCBpbiBvbmUgcGFzcyBpbnN0ZWFkIG9mIHR3byAod2UgZGlkIHRoaXMgaW4gdGhlIGFzc2VtYmxlcikuCi0KLU9yLCBvbiB0aGUgY29udHJhcnksIGVtcGhhc2l6ZSBzaW1wbGljaXR5IGluc3RlYWQgb2Ygc3BlZWQuICBGb3Igc29tZQotYXBwbGljYXRpb25zLCB0aGUgc3BlZWQgb2YgdG9kYXkncyBjb21wdXRlcnMgbWFrZXMgc2ltcGxlciBhbGdvcml0aG1zCi1hZGVxdWF0ZS4KLQotT3IgZ28gZm9yIGdlbmVyYWxpdHkuICBGb3IgZXhhbXBsZSwgVW5peCBwcm9ncmFtcyBvZnRlbiBoYXZlIHN0YXRpYwotdGFibGVzIG9yIGZpeGVkLXNpemUgc3RyaW5ncywgd2hpY2ggbWFrZSBmb3IgYXJiaXRyYXJ5IGxpbWl0czsgdXNlCi1keW5hbWljIGFsbG9jYXRpb24gaW5zdGVhZC4gIE1ha2Ugc3VyZSB5b3VyIHByb2dyYW0gaGFuZGxlcyBOVUxzIGFuZAotb3RoZXIgZnVubnkgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgZmlsZXMuICBBZGQgYSBwcm9ncmFtbWluZyBsYW5ndWFnZQotZm9yIGV4dGVuc2liaWxpdHkgYW5kIHdyaXRlIHBhcnQgb2YgdGhlIHByb2dyYW0gaW4gdGhhdCBsYW5ndWFnZS4KLQotT3IgdHVybiBzb21lIHBhcnRzIG9mIHRoZSBwcm9ncmFtIGludG8gaW5kZXBlbmRlbnRseSB1c2FibGUgbGlicmFyaWVzLgotT3IgdXNlIGEgc2ltcGxlIGdhcmJhZ2UgY29sbGVjdG9yIGluc3RlYWQgb2YgdHJhY2tpbmcgcHJlY2lzZWx5IHdoZW4KLXRvIGZyZWUgbWVtb3J5LCBvciB1c2UgYSBuZXcgR05VIGZhY2lsaXR5IHN1Y2ggYXMgb2JzdGFja3MuCi0KLQotQG5vZGUgQ29udHJpYnV0aW9ucwotQHNlY3Rpb24gQWNjZXB0aW5nIENvbnRyaWJ1dGlvbnMKLQotSWYgc29tZW9uZSBlbHNlIHNlbmRzIHlvdSBhIHBpZWNlIG9mIGNvZGUgdG8gYWRkIHRvIHRoZSBwcm9ncmFtIHlvdSBhcmUKLXdvcmtpbmcgb24sIHdlIG5lZWQgbGVnYWwgcGFwZXJzIHRvIHVzZSBpdC0tLXRoZSBzYW1lIHNvcnQgb2YgbGVnYWwKLXBhcGVycyB3ZSB3aWxsIG5lZWQgdG8gZ2V0IGZyb20geW91LiAgQGVtcGh7RWFjaH0gc2lnbmlmaWNhbnQKLWNvbnRyaWJ1dG9yIHRvIGEgcHJvZ3JhbSBtdXN0IHNpZ24gc29tZSBzb3J0IG9mIGxlZ2FsIHBhcGVycyBpbiBvcmRlcgotZm9yIHVzIHRvIGhhdmUgY2xlYXIgdGl0bGUgdG8gdGhlIHByb2dyYW0uICBUaGUgbWFpbiBhdXRob3IgYWxvbmUgaXMgbm90Ci1lbm91Z2guCi0KLVNvLCBiZWZvcmUgYWRkaW5nIGluIGFueSBjb250cmlidXRpb25zIGZyb20gb3RoZXIgcGVvcGxlLCBwbGVhc2UgdGVsbAotdXMsIHNvIHdlIGNhbiBhcnJhbmdlIHRvIGdldCB0aGUgcGFwZXJzLiAgVGhlbiB3YWl0IHVudGlsIHdlIHRlbGwgeW91Ci10aGF0IHdlIGhhdmUgcmVjZWl2ZWQgdGhlIHNpZ25lZCBwYXBlcnMsIGJlZm9yZSB5b3UgYWN0dWFsbHkgdXNlIHRoZQotY29udHJpYnV0aW9uLgotCi1UaGlzIGFwcGxpZXMgYm90aCBiZWZvcmUgeW91IHJlbGVhc2UgdGhlIHByb2dyYW0gYW5kIGFmdGVyd2FyZC4gIElmCi15b3UgcmVjZWl2ZSBkaWZmcyB0byBmaXggYSBidWcsIGFuZCB0aGV5IG1ha2Ugc2lnbmlmaWNhbnQgY2hhbmdlcywgd2UKLW5lZWQgbGVnYWwgcGFwZXJzIGZvciB0aGF0IGNoYW5nZS4KLQotVGhpcyBhbHNvIGFwcGxpZXMgdG8gY29tbWVudHMgYW5kIGRvY3VtZW50YXRpb24gZmlsZXMuICBGb3IgY29weXJpZ2h0Ci1sYXcsIGNvbW1lbnRzIGFuZCBjb2RlIGFyZSBqdXN0IHRleHQuICBDb3B5cmlnaHQgYXBwbGllcyB0byBhbGwga2luZHMgb2YKLXRleHQsIHNvIHdlIG5lZWQgbGVnYWwgcGFwZXJzIGZvciBhbGwga2luZHMuCi0KLVlvdSBkb24ndCBuZWVkIHBhcGVycyBmb3IgY2hhbmdlcyBvZiBhIGZldyBsaW5lcyBoZXJlIG9yIHRoZXJlLCBzaW5jZQotdGhleSBhcmUgbm90IHNpZ25pZmljYW50IGZvciBjb3B5cmlnaHQgcHVycG9zZXMuICBBbHNvLCB5b3UgZG9uJ3QgbmVlZAotcGFwZXJzIGlmIGFsbCB5b3UgZ2V0IGZyb20gdGhlIHN1Z2dlc3Rpb24gaXMgc29tZSBpZGVhcywgbm90IGFjdHVhbCBjb2RlCi13aGljaCB5b3UgdXNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3cml0ZSBhIGRpZmZlcmVudCBzb2x1dGlvbiB0byB0aGUKLXByb2JsZW0sIHlvdSBkb24ndCBuZWVkIHRvIGdldCBwYXBlcnMuCi0KLVdlIGtub3cgdGhpcyBpcyBmcnVzdHJhdGluZzsgaXQncyBmcnVzdHJhdGluZyBmb3IgdXMgYXMgd2VsbC4gIEJ1dCBpZgoteW91IGRvbid0IHdhaXQsIHlvdSBhcmUgZ29pbmcgb3V0IG9uIGEgbGltYi0tLWZvciBleGFtcGxlLCB3aGF0IGlmIHRoZQotY29udHJpYnV0b3IncyBlbXBsb3llciB3b24ndCBzaWduIGEgZGlzY2xhaW1lcj8gIFlvdSBtaWdodCBoYXZlIHRvIHRha2UKLXRoYXQgY29kZSBvdXQgYWdhaW4hCi0KLVRoZSB2ZXJ5IHdvcnN0IHRoaW5nIGlzIGlmIHlvdSBmb3JnZXQgdG8gdGVsbCB1cyBhYm91dCB0aGUgb3RoZXIKLWNvbnRyaWJ1dG9yLiAgV2UgY291bGQgYmUgdmVyeSBlbWJhcnJhc3NlZCBpbiBjb3VydCBzb21lIGRheSBhcyBhCi1yZXN1bHQuCi0KLVdlIGhhdmUgbW9yZSBkZXRhaWxlZCBhZHZpY2UgZm9yIG1haW50YWluZXJzIG9mIHByb2dyYW1zOyBpZiB5b3UgaGF2ZQotcmVhY2hlZCB0aGUgc3RhZ2Ugb2YgYWN0dWFsbHkgbWFpbnRhaW5pbmcgYSBwcm9ncmFtIGZvciBHTlUgKHdoZXRoZXIKLXJlbGVhc2VkIG9yIG5vdCksIHBsZWFzZSBhc2sgdXMgZm9yIGEgY29weS4KLQotQG5vZGUgRGVzaWduIEFkdmljZQotQGNoYXB0ZXIgR2VuZXJhbCBQcm9ncmFtIERlc2lnbgotCi1UaGlzIEB2YWx1ZXtDSEFQVEVSfSBkaXNjdXNzZXMgc29tZSBvZiB0aGUgaXNzdWVzIHlvdSBzaG91bGQgdGFrZSBpbnRvCi1hY2NvdW50IHdoZW4gZGVzaWduaW5nIHlvdXIgcHJvZ3JhbS4KLQotQG1lbnUKLSogQ29tcGF0aWJpbGl0eTo6ICAgICAgICAgICAgICAgQ29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGltcGxlbWVudGF0aW9ucwotKiBVc2luZyBFeHRlbnNpb25zOjogICAgICAgICAgICBVc2luZyBub24tc3RhbmRhcmQgZmVhdHVyZXMKLSogQU5TSSBDOjogICAgICAgICAgICAgICAgICAgICAgVXNpbmcgQU5TSSBDIGZlYXR1cmVzCi0qIFNvdXJjZSBMYW5ndWFnZTo6ICAgICAgICAgICAgIFVzaW5nIGxhbmd1YWdlcyBvdGhlciB0aGFuIEMKLUBlbmQgbWVudQotCi1Abm9kZSBDb21wYXRpYmlsaXR5Ci1Ac2VjdGlvbiBDb21wYXRpYmlsaXR5IHdpdGggT3RoZXIgSW1wbGVtZW50YXRpb25zCi0KLVdpdGggb2NjYXNpb25hbCBleGNlcHRpb25zLCB1dGlsaXR5IHByb2dyYW1zIGFuZCBsaWJyYXJpZXMgZm9yIEdOVQotc2hvdWxkIGJlIHVwd2FyZCBjb21wYXRpYmxlIHdpdGggdGhvc2UgaW4gQmVya2VsZXkgVW5peCwgYW5kIHVwd2FyZAotY29tcGF0aWJsZSB3aXRoIEBzY3thbnNpfSBDIGlmIEBzY3thbnNpfSBDIHNwZWNpZmllcyB0aGVpciBiZWhhdmlvciwgYW5kCi11cHdhcmQgY29tcGF0aWJsZSB3aXRoIEBzY3tQT1NJWH0gaWYgQHNje1BPU0lYfSBzcGVjaWZpZXMgdGhlaXIKLWJlaGF2aW9yLgotCi1XaGVuIHRoZXNlIHN0YW5kYXJkcyBjb25mbGljdCwgaXQgaXMgdXNlZnVsIHRvIG9mZmVyIGNvbXBhdGliaWxpdHkKLW1vZGVzIGZvciBlYWNoIG9mIHRoZW0uCi0KLUBzY3thbnNpfSBDIGFuZCBAc2N7UE9TSVh9IHByb2hpYml0IG1hbnkga2luZHMgb2YgZXh0ZW5zaW9ucy4gIEZlZWwgZnJlZQotdG8gbWFrZSB0aGUgZXh0ZW5zaW9ucyBhbnl3YXksIGFuZCBpbmNsdWRlIGEgQHNhbXB7LS1hbnNpfSwKLUBzYW1wey0tcG9zaXh9LCBvciBAc2FtcHstLWNvbXBhdGlibGV9IG9wdGlvbiB0byB0dXJuIHRoZW0gb2ZmLgotSG93ZXZlciwgaWYgdGhlIGV4dGVuc2lvbiBoYXMgYSBzaWduaWZpY2FudCBjaGFuY2Ugb2YgYnJlYWtpbmcgYW55IHJlYWwKLXByb2dyYW1zIG9yIHNjcmlwdHMsIHRoZW4gaXQgaXMgbm90IHJlYWxseSB1cHdhcmQgY29tcGF0aWJsZS4gIFRyeSB0bwotcmVkZXNpZ24gaXRzIGludGVyZmFjZS4KLQotTWFueSBHTlUgcHJvZ3JhbXMgc3VwcHJlc3MgZXh0ZW5zaW9ucyB0aGF0IGNvbmZsaWN0IHdpdGggUE9TSVggaWYgdGhlCi1lbnZpcm9ubWVudCB2YXJpYWJsZSBAY29kZXtQT1NJWExZX0NPUlJFQ1R9IGlzIGRlZmluZWQgKGV2ZW4gaWYgaXQgaXMKLWRlZmluZWQgd2l0aCBhIG51bGwgdmFsdWUpLiAgUGxlYXNlIG1ha2UgeW91ciBwcm9ncmFtIHJlY29nbml6ZSB0aGlzCi12YXJpYWJsZSBpZiBhcHByb3ByaWF0ZS4KLQotV2hlbiBhIGZlYXR1cmUgaXMgdXNlZCBvbmx5IGJ5IHVzZXJzIChub3QgYnkgcHJvZ3JhbXMgb3IgY29tbWFuZAotZmlsZXMpLCBhbmQgaXQgaXMgZG9uZSBwb29ybHkgaW4gVW5peCwgZmVlbCBmcmVlIHRvIHJlcGxhY2UgaXQKLWNvbXBsZXRlbHkgd2l0aCBzb21ldGhpbmcgdG90YWxseSBkaWZmZXJlbnQgYW5kIGJldHRlci4gIChGb3IgZXhhbXBsZSwKLUBjb2Rle3ZpfSBpcyByZXBsYWNlZCB3aXRoIEVtYWNzLikgIEJ1dCBpdCBpcyBuaWNlIHRvIG9mZmVyIGEgY29tcGF0aWJsZQotZmVhdHVyZSBhcyB3ZWxsLiAgKFRoZXJlIGlzIGEgZnJlZSBAY29kZXt2aX0gY2xvbmUsIHNvIHdlIG9mZmVyIGl0LikKLQotQWRkaXRpb25hbCB1c2VmdWwgZmVhdHVyZXMgbm90IGluIEJlcmtlbGV5IFVuaXggYXJlIHdlbGNvbWUuCi0KLUBub2RlIFVzaW5nIEV4dGVuc2lvbnMKLUBzZWN0aW9uIFVzaW5nIE5vbi1zdGFuZGFyZCBGZWF0dXJlcwotCi1NYW55IEdOVSBmYWNpbGl0aWVzIHRoYXQgYWxyZWFkeSBleGlzdCBzdXBwb3J0IGEgbnVtYmVyIG9mIGNvbnZlbmllbnQKLWV4dGVuc2lvbnMgb3ZlciB0aGUgY29tcGFyYWJsZSBVbml4IGZhY2lsaXRpZXMuICBXaGV0aGVyIHRvIHVzZSB0aGVzZQotZXh0ZW5zaW9ucyBpbiBpbXBsZW1lbnRpbmcgeW91ciBwcm9ncmFtIGlzIGEgZGlmZmljdWx0IHF1ZXN0aW9uLgotCi1PbiB0aGUgb25lIGhhbmQsIHVzaW5nIHRoZSBleHRlbnNpb25zIGNhbiBtYWtlIGEgY2xlYW5lciBwcm9ncmFtLgotT24gdGhlIG90aGVyIGhhbmQsIHBlb3BsZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtCi11bmxlc3MgdGhlIG90aGVyIEdOVSB0b29scyBhcmUgYXZhaWxhYmxlLiAgVGhpcyBtaWdodCBjYXVzZSB0aGUKLXByb2dyYW0gdG8gd29yayBvbiBmZXdlciBraW5kcyBvZiBtYWNoaW5lcy4KLQotV2l0aCBzb21lIGV4dGVuc2lvbnMsIGl0IG1pZ2h0IGJlIGVhc3kgdG8gcHJvdmlkZSBib3RoIGFsdGVybmF0aXZlcy4KLUZvciBleGFtcGxlLCB5b3UgY2FuIGRlZmluZSBmdW5jdGlvbnMgd2l0aCBhIGBga2V5d29yZCcnIEBjb2Rle0lOTElORX0KLWFuZCBkZWZpbmUgdGhhdCBhcyBhIG1hY3JvIHRvIGV4cGFuZCBpbnRvIGVpdGhlciBAY29kZXtpbmxpbmV9IG9yCi1ub3RoaW5nLCBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyLgotCi1JbiBnZW5lcmFsLCBwZXJoYXBzIGl0IGlzIGJlc3Qgbm90IHRvIHVzZSB0aGUgZXh0ZW5zaW9ucyBpZiB5b3UgY2FuCi1zdHJhaWdodGZvcndhcmRseSBkbyB3aXRob3V0IHRoZW0sIGJ1dCB0byB1c2UgdGhlIGV4dGVuc2lvbnMgaWYgdGhleQotYXJlIGEgYmlnIGltcHJvdmVtZW50LgotCi1BbiBleGNlcHRpb24gdG8gdGhpcyBydWxlIGFyZSB0aGUgbGFyZ2UsIGVzdGFibGlzaGVkIHByb2dyYW1zIChzdWNoIGFzCi1FbWFjcykgd2hpY2ggcnVuIG9uIGEgZ3JlYXQgdmFyaWV0eSBvZiBzeXN0ZW1zLiAgU3VjaCBwcm9ncmFtcyB3b3VsZAotYmUgYnJva2VuIGJ5IHVzZSBvZiBHTlUgZXh0ZW5zaW9ucy4KLQotQW5vdGhlciBleGNlcHRpb24gaXMgZm9yIHByb2dyYW1zIHRoYXQgYXJlIHVzZWQgYXMgcGFydCBvZgotY29tcGlsYXRpb246IGFueXRoaW5nIHRoYXQgbXVzdCBiZSBjb21waWxlZCB3aXRoIG90aGVyIGNvbXBpbGVycyBpbgotb3JkZXIgdG8gYm9vdHN0cmFwIHRoZSBHTlUgY29tcGlsYXRpb24gZmFjaWxpdGllcy4gIElmIHRoZXNlIHJlcXVpcmUKLXRoZSBHTlUgY29tcGlsZXIsIHRoZW4gbm8gb25lIGNhbiBjb21waWxlIHRoZW0gd2l0aG91dCBoYXZpbmcgdGhlbQotaW5zdGFsbGVkIGFscmVhZHkuICBUaGF0IHdvdWxkIGJlIG5vIGdvb2QuCi0KLUBub2RlIEFOU0kgQwotQHNlY3Rpb24gQHNje2Fuc2l9IEMgYW5kIHByZS1Ac2N7YW5zaX0gQwotCi1EbyBub3QgZXZlciB1c2UgdGhlIGBgdHJpZ3JhcGgnJyBmZWF0dXJlIG9mIEBzY3thbnNpfSBDLgotCi1Ac2N7YW5zaX0gQyBpcyB3aWRlc3ByZWFkIGVub3VnaCBub3cgdGhhdCBpdCBpcyBvayB0byB3cml0ZSBuZXcgcHJvZ3JhbXMKLXRoYXQgdXNlIEBzY3thbnNpfSBDIGZlYXR1cmVzIChhbmQgdGhlcmVmb3JlIHdpbGwgbm90IHdvcmsgaW4KLW5vbi1Ac2N7YW5zaX0gY29tcGlsZXJzKS4gIEFuZCBpZiBhIHByb2dyYW0gaXMgYWxyZWFkeSB3cml0dGVuIGluCi1Ac2N7YW5zaX0gQywgdGhlcmUncyBubyBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gc3VwcG9ydCBub24tQHNje2Fuc2l9Ci1jb21waWxlcnMuCi0KLUhvd2V2ZXIsIGl0IGlzIGVhc3kgdG8gc3VwcG9ydCBub24tQHNje2Fuc2l9IGNvbXBpbGVycyBpbiBtb3N0IHByb2dyYW1zLAotc28geW91IG1pZ2h0IHN0aWxsIGNvbnNpZGVyIGRvaW5nIHNvIHdoZW4geW91IHdyaXRlIGEgcHJvZ3JhbS4gIEluc3RlYWQKLW9mIHdyaXRpbmcgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW4gQHNje2Fuc2l9IHByb3RvdHlwZSBmb3JtLAotCi1AZXhhbXBsZQotaW50Ci1mb28gKGludCB4LCBpbnQgeSkKLUBkb3Rze30KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdyaXRlIHRoZSBkZWZpbml0aW9uIGluIHByZS1Ac2N7YW5zaX0gc3R5bGUgbGlrZSB0aGlzLAotCi1AZXhhbXBsZQotaW50Ci1mb28gKHgsIHkpCi0gICAgIGludCB4LCB5OwotQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYW5kIHVzZSBhIHNlcGFyYXRlIGRlY2xhcmF0aW9uIHRvIHNwZWNpZnkgdGhlIGFyZ3VtZW50IHByb3RvdHlwZToKLQotQGV4YW1wbGUKLWludCBmb28gKGludCwgaW50KTsKLUBlbmQgZXhhbXBsZQotCi1Zb3UgbmVlZCBzdWNoIGEgZGVjbGFyYXRpb24gYW55d2F5LCBpbiBhIGhlYWRlciBmaWxlLCB0byBnZXQgdGhlIGJlbmVmaXQKLW9mIEBzY3thbnNpfSBDIHByb3RvdHlwZXMgaW4gYWxsIHRoZSBmaWxlcyB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgotQW5kIG9uY2UgeW91IGhhdmUgaXQsIHlvdSBsb3NlIG5vdGhpbmcgYnkgd3JpdGluZyB0aGUgZnVuY3Rpb24KLWRlZmluaXRpb24gaW4gdGhlIHByZS1Ac2N7YW5zaX0gc3R5bGUuCi0KLUlmIHlvdSBkb24ndCBrbm93IG5vbi1Ac2N7YW5zaX0gQywgdGhlcmUncyBubyBuZWVkIHRvIGxlYXJuIGl0OyBqdXN0Ci13cml0ZSBpbiBAc2N7YW5zaX0gQy4KLQotQG5vZGUgU291cmNlIExhbmd1YWdlCi1Ac2VjdGlvbiBVc2luZyBMYW5ndWFnZXMgT3RoZXIgVGhhbiBDCi0KLVVzaW5nIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBDIGlzIGxpa2UgdXNpbmcgYSBub24tc3RhbmRhcmQgZmVhdHVyZTogaXQKLXdpbGwgY2F1c2UgdHJvdWJsZSBmb3IgdXNlcnMuICBFdmVuIGlmIEdDQyBzdXBwb3J0cyB0aGUgb3RoZXIgbGFuZ3VhZ2UsCi11c2VycyBtYXkgZmluZCBpdCBpbmNvbnZlbmllbnQgdG8gaGF2ZSB0byBpbnN0YWxsIHRoZSBjb21waWxlciBmb3IgdGhhdAotb3RoZXIgbGFuZ3VhZ2UgaW4gb3JkZXIgdG8gYnVpbGQgeW91ciBwcm9ncmFtLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQotd3JpdGUgeW91ciBwcm9ncmFtIGluIEMrKywgcGVvcGxlIHdpbGwgaGF2ZSB0byBpbnN0YWxsIHRoZSBDKysgY29tcGlsZXIKLWluIG9yZGVyIHRvIGNvbXBpbGUgeW91ciBwcm9ncmFtLiAgVGh1cywgaXQgaXMgYmV0dGVyIGlmIHlvdSB3cml0ZSBpbiBDLgotCi1CdXQgdGhlcmUgYXJlIHRocmVlIHNpdHVhdGlvbnMgd2hlbiB0aGVyZSBpcyBubyBkaXNhZHZhbnRhZ2UgaW4gdXNpbmcKLXNvbWUgb3RoZXIgbGFuZ3VhZ2U6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1JdCBpcyBva2F5IHRvIHVzZSBhbm90aGVyIGxhbmd1YWdlIGlmIHlvdXIgcHJvZ3JhbSBjb250YWlucyBhbgotaW50ZXJwcmV0ZXIgZm9yIHRoYXQgbGFuZ3VhZ2UuCi0KLUZvciBleGFtcGxlLCBpZiB5b3VyIHByb2dyYW0gbGlua3Mgd2l0aCBHVUlMRSwgaXQgaXMgb2sgdG8gd3JpdGUgcGFydCBvZgotdGhlIHByb2dyYW0gaW4gU2NoZW1lIG9yIGFub3RoZXIgbGFuZ3VhZ2Ugc3VwcG9ydGVkIGJ5IEdVSUxFLgotCi1AaXRlbQotSXQgaXMgb2theSB0byB1c2UgYW5vdGhlciBsYW5ndWFnZSBpbiBhIHRvb2wgc3BlY2lmaWNhbGx5IGludGVuZGVkIGZvcgotdXNlIHdpdGggdGhhdCBsYW5ndWFnZS4KLQotVGhpcyBpcyBva2F5IGJlY2F1c2UgdGhlIG9ubHkgcGVvcGxlIHdobyB3YW50IHRvIGJ1aWxkIHRoZSB0b29sIHdpbGwgYmUKLXRob3NlIHdobyBoYXZlIGluc3RhbGxlZCB0aGUgb3RoZXIgbGFuZ3VhZ2UgYW55d2F5LgotCi1AaXRlbQotSWYgYW4gYXBwbGljYXRpb24gaXMgb2YgaW50ZXJlc3QgdG8gYSBuYXJyb3cgY29tbXVuaXR5LCB0aGVuIHBlcmhhcHMKLWl0J3Mgbm90IGltcG9ydGFudCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5jb252ZW5pZW50IHRvIGluc3RhbGwuCi1AZW5kIGl0ZW1pemUKLQotQyBoYXMgb25lIG90aGVyIGFkdmFudGFnZSBvdmVyIEMrKyBhbmQgb3RoZXIgY29tcGlsZWQgbGFuZ3VhZ2VzOiBtb3JlCi1wZW9wbGUga25vdyBDLCBzbyBtb3JlIHBlb3BsZSB3aWxsIGZpbmQgaXQgZWFzeSB0byByZWFkIGFuZCBtb2RpZnkgdGhlCi1wcm9ncmFtIGlmIGl0IGlzIHdyaXR0ZW4gaW4gQy4KLQotQG5vZGUgUHJvZ3JhbSBCZWhhdmlvcgotQGNoYXB0ZXIgUHJvZ3JhbSBCZWhhdmlvciBmb3IgQWxsIFByb2dyYW1zCi0KLVRoaXMgQHZhbHVle0NIQVBURVJ9IGRlc2NyaWJlcyBob3cgdG8gd3JpdGUgcm9idXN0IHNvZnR3YXJlLiBJdCBhbHNvCi1kZXNjcmliZXMgZ2VuZXJhbCBzdGFuZGFyZHMgZm9yIGVycm9yIG1lc3NhZ2VzLCB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZSwKLWFuZCBob3cgbGlicmFyaWVzIHNob3VsZCBiZWhhdmUuCi0KLUBtZW51Ci0qIFNlbWFudGljczo6ICAgICAgICAgICAgICAgICAgIFdyaXRpbmcgcm9idXN0IHByb2dyYW1zCi0qIExpYnJhcmllczo6ICAgICAgICAgICAgICAgICAgIExpYnJhcnkgYmVoYXZpb3IKLSogRXJyb3JzOjogICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZyBlcnJvciBtZXNzYWdlcwotKiBVc2VyIEludGVyZmFjZXM6OiAgICAgICAgICAgICBTdGFuZGFyZHMgZm9yIGNvbW1hbmQgbGluZSBpbnRlcmZhY2VzCi0qIE9wdGlvbiBUYWJsZTo6ICAgICAgICAgICAgICAgIFRhYmxlIG9mIGxvbmcgb3B0aW9ucy4KLSogTWVtb3J5IFVzYWdlOjogICAgICAgICAgICAgICAgV2hlbiBhbmQgaG93IHRvIGNhcmUgYWJvdXQgbWVtb3J5IG5lZWRzCi1AZW5kIG1lbnUKLQotQG5vZGUgU2VtYW50aWNzCi1Ac2VjdGlvbiBXcml0aW5nIFJvYnVzdCBQcm9ncmFtcwotCi1Bdm9pZCBhcmJpdHJhcnkgbGltaXRzIG9uIHRoZSBsZW5ndGggb3IgbnVtYmVyIG9mIEBlbXBoe2FueX0gZGF0YQotc3RydWN0dXJlLCBpbmNsdWRpbmcgZmlsZSBuYW1lcywgbGluZXMsIGZpbGVzLCBhbmQgc3ltYm9scywgYnkgYWxsb2NhdGluZwotYWxsIGRhdGEgc3RydWN0dXJlcyBkeW5hbWljYWxseS4gIEluIG1vc3QgVW5peCB1dGlsaXRpZXMsIGBgbG9uZyBsaW5lcwotYXJlIHNpbGVudGx5IHRydW5jYXRlZCcnLiAgVGhpcyBpcyBub3QgYWNjZXB0YWJsZSBpbiBhIEdOVSB1dGlsaXR5LgotCi1VdGlsaXRpZXMgcmVhZGluZyBmaWxlcyBzaG91bGQgbm90IGRyb3AgTlVMIGNoYXJhY3RlcnMsIG9yIGFueSBvdGhlcgotbm9ucHJpbnRpbmcgY2hhcmFjdGVycyBAZW1waHtpbmNsdWRpbmcgdGhvc2Ugd2l0aCBjb2RlcyBhYm92ZSAwMTc3fS4gIFRoZQotb25seSBzZW5zaWJsZSBleGNlcHRpb25zIHdvdWxkIGJlIHV0aWxpdGllcyBzcGVjaWZpY2FsbHkgaW50ZW5kZWQgZm9yCi1pbnRlcmZhY2UgdG8gY2VydGFpbiB0eXBlcyBvZiBwcmludGVycyB0aGF0IGNhbid0IGhhbmRsZSB0aG9zZSBjaGFyYWN0ZXJzLgotCi1DaGVjayBldmVyeSBzeXN0ZW0gY2FsbCBmb3IgYW4gZXJyb3IgcmV0dXJuLCB1bmxlc3MgeW91IGtub3cgeW91IHdpc2ggdG8KLWlnbm9yZSBlcnJvcnMuICBJbmNsdWRlIHRoZSBzeXN0ZW0gZXJyb3IgdGV4dCAoZnJvbSBAY29kZXtwZXJyb3J9IG9yCi1lcXVpdmFsZW50KSBpbiBAZW1waHtldmVyeX0gZXJyb3IgbWVzc2FnZSByZXN1bHRpbmcgZnJvbSBhIGZhaWxpbmcKLXN5c3RlbSBjYWxsLCBhcyB3ZWxsIGFzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGlmIGFueSBhbmQgdGhlIG5hbWUgb2YgdGhlCi11dGlsaXR5LiAgSnVzdCBgYGNhbm5vdCBvcGVuIGZvby5jJycgb3IgYGBzdGF0IGZhaWxlZCcnIGlzIG5vdAotc3VmZmljaWVudC4KLQotQ2hlY2sgZXZlcnkgY2FsbCB0byBAY29kZXttYWxsb2N9IG9yIEBjb2Rle3JlYWxsb2N9IHRvIHNlZSBpZiBpdAotcmV0dXJuZWQgemVyby4gIENoZWNrIEBjb2Rle3JlYWxsb2N9IGV2ZW4gaWYgeW91IGFyZSBtYWtpbmcgdGhlIGJsb2NrCi1zbWFsbGVyOyBpbiBhIHN5c3RlbSB0aGF0IHJvdW5kcyBibG9jayBzaXplcyB0byBhIHBvd2VyIG9mIDIsCi1AY29kZXtyZWFsbG9jfSBtYXkgZ2V0IGEgZGlmZmVyZW50IGJsb2NrIGlmIHlvdSBhc2sgZm9yIGxlc3Mgc3BhY2UuCi0KLUluIFVuaXgsIEBjb2Rle3JlYWxsb2N9IGNhbiBkZXN0cm95IHRoZSBzdG9yYWdlIGJsb2NrIGlmIGl0IHJldHVybnMKLXplcm8uICBHTlUgQGNvZGV7cmVhbGxvY30gZG9lcyBub3QgaGF2ZSB0aGlzIGJ1ZzogaWYgaXQgZmFpbHMsIHRoZQotb3JpZ2luYWwgYmxvY2sgaXMgdW5jaGFuZ2VkLiAgRmVlbCBmcmVlIHRvIGFzc3VtZSB0aGUgYnVnIGlzIGZpeGVkLiAgSWYKLXlvdSB3aXNoIHRvIHJ1biB5b3VyIHByb2dyYW0gb24gVW5peCwgYW5kIHdpc2ggdG8gYXZvaWQgbG9zc2FnZSBpbiB0aGlzCi1jYXNlLCB5b3UgY2FuIHVzZSB0aGUgR05VIEBjb2Rle21hbGxvY30uCi0KLVlvdSBtdXN0IGV4cGVjdCBAY29kZXtmcmVlfSB0byBhbHRlciB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIHRoYXQgd2FzCi1mcmVlZC4gIEFueXRoaW5nIHlvdSB3YW50IHRvIGZldGNoIGZyb20gdGhlIGJsb2NrLCB5b3UgbXVzdCBmZXRjaCBiZWZvcmUKLWNhbGxpbmcgQGNvZGV7ZnJlZX0uCi0KLUlmIEBjb2Rle21hbGxvY30gZmFpbHMgaW4gYSBub25pbnRlcmFjdGl2ZSBwcm9ncmFtLCBtYWtlIHRoYXQgYSBmYXRhbAotZXJyb3IuICBJbiBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIChvbmUgdGhhdCByZWFkcyBjb21tYW5kcyBmcm9tIHRoZQotdXNlciksIGl0IGlzIGJldHRlciB0byBhYm9ydCB0aGUgY29tbWFuZCBhbmQgcmV0dXJuIHRvIHRoZSBjb21tYW5kCi1yZWFkZXIgbG9vcC4gIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGtpbGwgb3RoZXIgcHJvY2Vzc2VzIHRvIGZyZWUgdXAKLXZpcnR1YWwgbWVtb3J5LCBhbmQgdGhlbiB0cnkgdGhlIGNvbW1hbmQgYWdhaW4uCi0KLVVzZSBAY29kZXtnZXRvcHRfbG9uZ30gdG8gZGVjb2RlIGFyZ3VtZW50cywgdW5sZXNzIHRoZSBhcmd1bWVudCBzeW50YXgKLW1ha2VzIHRoaXMgdW5yZWFzb25hYmxlLgotCi1XaGVuIHN0YXRpYyBzdG9yYWdlIGlzIHRvIGJlIHdyaXR0ZW4gaW4gZHVyaW5nIHByb2dyYW0gZXhlY3V0aW9uLCB1c2UKLWV4cGxpY2l0IEMgY29kZSB0byBpbml0aWFsaXplIGl0LiAgUmVzZXJ2ZSBDIGluaXRpYWxpemVkIGRlY2xhcmF0aW9ucwotZm9yIGRhdGEgdGhhdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgotQGMgQURSOiB3aHk/Ci0KLVRyeSB0byBhdm9pZCBsb3ctbGV2ZWwgaW50ZXJmYWNlcyB0byBvYnNjdXJlIFVuaXggZGF0YSBzdHJ1Y3R1cmVzIChzdWNoCi1hcyBmaWxlIGRpcmVjdG9yaWVzLCB1dG1wLCBvciB0aGUgbGF5b3V0IG9mIGtlcm5lbCBtZW1vcnkpLCBzaW5jZSB0aGVzZQotYXJlIGxlc3MgbGlrZWx5IHRvIHdvcmsgY29tcGF0aWJseS4gIElmIHlvdSBuZWVkIHRvIGZpbmQgYWxsIHRoZSBmaWxlcwotaW4gYSBkaXJlY3RvcnksIHVzZSBAY29kZXtyZWFkZGlyfSBvciBzb21lIG90aGVyIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlLgotVGhlc2Ugd2lsbCBiZSBzdXBwb3J0ZWQgY29tcGF0aWJseSBieSBHTlUuCi0KLUJ5IGRlZmF1bHQsIHRoZSBHTlUgc3lzdGVtIHdpbGwgcHJvdmlkZSB0aGUgc2lnbmFsIGhhbmRsaW5nIGZ1bmN0aW9ucyBvZgotQHNje0JTRH0gYW5kIG9mIEBzY3tQT1NJWH0uICBTbyBHTlUgc29mdHdhcmUgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gdXNlCi10aGVzZS4KLQotSW4gZXJyb3IgY2hlY2tzIHRoYXQgZGV0ZWN0IGBgaW1wb3NzaWJsZScnIGNvbmRpdGlvbnMsIGp1c3QgYWJvcnQuCi1UaGVyZSBpcyB1c3VhbGx5IG5vIHBvaW50IGluIHByaW50aW5nIGFueSBtZXNzYWdlLiAgVGhlc2UgY2hlY2tzCi1pbmRpY2F0ZSB0aGUgZXhpc3RlbmNlIG9mIGJ1Z3MuICBXaG9ldmVyIHdhbnRzIHRvIGZpeCB0aGUgYnVncyB3aWxsIGhhdmUKLXRvIHJlYWQgdGhlIHNvdXJjZSBjb2RlIGFuZCBydW4gYSBkZWJ1Z2dlci4gIFNvIGV4cGxhaW4gdGhlIHByb2JsZW0gd2l0aAotY29tbWVudHMgaW4gdGhlIHNvdXJjZS4gIFRoZSByZWxldmFudCBkYXRhIHdpbGwgYmUgaW4gdmFyaWFibGVzLCB3aGljaAotYXJlIGVhc3kgdG8gZXhhbWluZSB3aXRoIHRoZSBkZWJ1Z2dlciwgc28gdGhlcmUgaXMgbm8gcG9pbnQgbW92aW5nIHRoZW0KLWVsc2V3aGVyZS4KLQotRG8gbm90IHVzZSBhIGNvdW50IG9mIGVycm9ycyBhcyB0aGUgZXhpdCBzdGF0dXMgZm9yIGEgcHJvZ3JhbS4KLUBlbXBoe1RoYXQgZG9lcyBub3Qgd29ya30sIGJlY2F1c2UgZXhpdCBzdGF0dXMgdmFsdWVzIGFyZSBsaW1pdGVkIHRvIDgKLWJpdHMgKDAgdGhyb3VnaCAyNTUpLiAgQSBzaW5nbGUgcnVuIG9mIHRoZSBwcm9ncmFtIG1pZ2h0IGhhdmUgMjU2Ci1lcnJvcnM7IGlmIHlvdSB0cnkgdG8gcmV0dXJuIDI1NiBhcyB0aGUgZXhpdCBzdGF0dXMsIHRoZSBwYXJlbnQgcHJvY2Vzcwotd2lsbCBzZWUgMCBhcyB0aGUgc3RhdHVzLCBhbmQgaXQgd2lsbCBhcHBlYXIgdGhhdCB0aGUgcHJvZ3JhbSBzdWNjZWVkZWQuCi0KLUlmIHlvdSBtYWtlIHRlbXBvcmFyeSBmaWxlcywgY2hlY2sgdGhlIEBjb2Rle1RNUERJUn0gZW52aXJvbm1lbnQKLXZhcmlhYmxlOyBpZiB0aGF0IHZhcmlhYmxlIGlzIGRlZmluZWQsIHVzZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotaW5zdGVhZCBvZiBAZmlsZXsvdG1wfS4KLQotQG5vZGUgTGlicmFyaWVzCi1Ac2VjdGlvbiBMaWJyYXJ5IEJlaGF2aW9yCi0KLVRyeSB0byBtYWtlIGxpYnJhcnkgZnVuY3Rpb25zIHJlZW50cmFudC4gIElmIHRoZXkgbmVlZCB0byBkbyBkeW5hbWljCi1zdG9yYWdlIGFsbG9jYXRpb24sIGF0IGxlYXN0IHRyeSB0byBhdm9pZCBhbnkgbm9ucmVlbnRyYW5jeSBhc2lkZSBmcm9tCi10aGF0IG9mIEBjb2Rle21hbGxvY30gaXRzZWxmLgotCi1IZXJlIGFyZSBjZXJ0YWluIG5hbWUgY29udmVudGlvbnMgZm9yIGxpYnJhcmllcywgdG8gYXZvaWQgbmFtZQotY29uZmxpY3RzLgotCi1DaG9vc2UgYSBuYW1lIHByZWZpeCBmb3IgdGhlIGxpYnJhcnksIG1vcmUgdGhhbiB0d28gY2hhcmFjdGVycyBsb25nLgotQWxsIGV4dGVybmFsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBuYW1lcyBzaG91bGQgc3RhcnQgd2l0aCB0aGlzCi1wcmVmaXguICBJbiBhZGRpdGlvbiwgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIG9mIHRoZXNlIGluIGFueSBnaXZlbgotbGlicmFyeSBtZW1iZXIuICBUaGlzIHVzdWFsbHkgbWVhbnMgcHV0dGluZyBlYWNoIG9uZSBpbiBhIHNlcGFyYXRlCi1zb3VyY2UgZmlsZS4KLQotQW4gZXhjZXB0aW9uIGNhbiBiZSBtYWRlIHdoZW4gdHdvIGV4dGVybmFsIHN5bWJvbHMgYXJlIGFsd2F5cyB1c2VkCi10b2dldGhlciwgc28gdGhhdCBubyByZWFzb25hYmxlIHByb2dyYW0gY291bGQgdXNlIG9uZSB3aXRob3V0IHRoZQotb3RoZXI7IHRoZW4gdGhleSBjYW4gYm90aCBnbyBpbiB0aGUgc2FtZSBmaWxlLgotCi1FeHRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBkb2N1bWVudGVkIGVudHJ5IHBvaW50cyBmb3IgdGhlIHVzZXIKLXNob3VsZCBoYXZlIG5hbWVzIGJlZ2lubmluZyB3aXRoIEBzYW1we199LiAgVGhleSBzaG91bGQgYWxzbyBjb250YWluCi10aGUgY2hvc2VuIG5hbWUgcHJlZml4IGZvciB0aGUgbGlicmFyeSwgdG8gcHJldmVudCBjb2xsaXNpb25zIHdpdGgKLW90aGVyIGxpYnJhcmllcy4gIFRoZXNlIGNhbiBnbyBpbiB0aGUgc2FtZSBmaWxlcyB3aXRoIHVzZXIgZW50cnkKLXBvaW50cyBpZiB5b3UgbGlrZS4KLQotU3RhdGljIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGNhbiBiZSB1c2VkIGFzIHlvdSBsaWtlIGFuZCBuZWVkIG5vdAotZml0IGFueSBuYW1pbmcgY29udmVudGlvbi4KLQotQG5vZGUgRXJyb3JzCi1Ac2VjdGlvbiBGb3JtYXR0aW5nIEVycm9yIE1lc3NhZ2VzCi0KLUVycm9yIG1lc3NhZ2VzIGZyb20gY29tcGlsZXJzIHNob3VsZCBsb29rIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLUB2YXJ7c291cmNlLWZpbGUtbmFtZX06QHZhcntsaW5lbm99OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotRXJyb3IgbWVzc2FnZXMgZnJvbSBvdGhlciBub25pbnRlcmFjdGl2ZSBwcm9ncmFtcyBzaG91bGQgbG9vayBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye3Byb2dyYW19OkB2YXJ7c291cmNlLWZpbGUtbmFtZX06QHZhcntsaW5lbm99OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVuIHRoZXJlIGlzIGFuIGFwcHJvcHJpYXRlIHNvdXJjZSBmaWxlLCBvciBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1AdmFye3Byb2dyYW19OiBAdmFye21lc3NhZ2V9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci13aGVuIHRoZXJlIGlzIG5vIHJlbGV2YW50IHNvdXJjZSBmaWxlLgotCi1JbiBhbiBpbnRlcmFjdGl2ZSBwcm9ncmFtIChvbmUgdGhhdCBpcyByZWFkaW5nIGNvbW1hbmRzIGZyb20gYQotdGVybWluYWwpLCBpdCBpcyBiZXR0ZXIgbm90IHRvIGluY2x1ZGUgdGhlIHByb2dyYW0gbmFtZSBpbiBhbiBlcnJvcgotbWVzc2FnZS4gIFRoZSBwbGFjZSB0byBpbmRpY2F0ZSB3aGljaCBwcm9ncmFtIGlzIHJ1bm5pbmcgaXMgaW4gdGhlCi1wcm9tcHQgb3Igd2l0aCB0aGUgc2NyZWVuIGxheW91dC4gIChXaGVuIHRoZSBzYW1lIHByb2dyYW0gcnVucyB3aXRoCi1pbnB1dCBmcm9tIGEgc291cmNlIG90aGVyIHRoYW4gYSB0ZXJtaW5hbCwgaXQgaXMgbm90IGludGVyYWN0aXZlIGFuZAotd291bGQgZG8gYmVzdCB0byBwcmludCBlcnJvciBtZXNzYWdlcyB1c2luZyB0aGUgbm9uaW50ZXJhY3RpdmUgc3R5bGUuKQotCi1UaGUgc3RyaW5nIEB2YXJ7bWVzc2FnZX0gc2hvdWxkIG5vdCBiZWdpbiB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIgd2hlbgotaXQgZm9sbG93cyBhIHByb2dyYW0gbmFtZSBhbmQvb3IgZmlsZSBuYW1lLiAgQWxzbywgaXQgc2hvdWxkIG5vdCBlbmQKLXdpdGggYSBwZXJpb2QuCi0KLUVycm9yIG1lc3NhZ2VzIGZyb20gaW50ZXJhY3RpdmUgcHJvZ3JhbXMsIGFuZCBvdGhlciBtZXNzYWdlcyBzdWNoIGFzCi11c2FnZSBtZXNzYWdlcywgc2hvdWxkIHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlci4gIEJ1dCB0aGV5IHNob3VsZCBub3QKLWVuZCB3aXRoIGEgcGVyaW9kLgotCi1Abm9kZSBVc2VyIEludGVyZmFjZXMKLUBzZWN0aW9uIFN0YW5kYXJkcyBmb3IgQ29tbWFuZCBMaW5lIEludGVyZmFjZXMKLQotUGxlYXNlIGRvbid0IG1ha2UgdGhlIGJlaGF2aW9yIG9mIGEgdXRpbGl0eSBkZXBlbmQgb24gdGhlIG5hbWUgdXNlZAotdG8gaW52b2tlIGl0LiAgSXQgaXMgdXNlZnVsIHNvbWV0aW1lcyB0byBtYWtlIGEgbGluayB0byBhIHV0aWxpdHkKLXdpdGggYSBkaWZmZXJlbnQgbmFtZSwgYW5kIHRoYXQgc2hvdWxkIG5vdCBjaGFuZ2Ugd2hhdCBpdCBkb2VzLgotCi1JbnN0ZWFkLCB1c2UgYSBydW4gdGltZSBvcHRpb24gb3IgYSBjb21waWxhdGlvbiBzd2l0Y2ggb3IgYm90aAotdG8gc2VsZWN0IGFtb25nIHRoZSBhbHRlcm5hdGUgYmVoYXZpb3JzLgotCi1MaWtld2lzZSwgcGxlYXNlIGRvbid0IG1ha2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBwcm9ncmFtIGRlcGVuZCBvbiB0aGUKLXR5cGUgb2Ygb3V0cHV0IGRldmljZSBpdCBpcyB1c2VkIHdpdGguICBEZXZpY2UgaW5kZXBlbmRlbmNlIGlzIGFuCi1pbXBvcnRhbnQgcHJpbmNpcGxlIG9mIHRoZSBzeXN0ZW0ncyBkZXNpZ247IGRvIG5vdCBjb21wcm9taXNlIGl0Ci1tZXJlbHkgdG8gc2F2ZSBzb21lb25lIGZyb20gdHlwaW5nIGFuIG9wdGlvbiBub3cgYW5kIHRoZW4uCi0KLUlmIHlvdSB0aGluayBvbmUgYmVoYXZpb3IgaXMgbW9zdCB1c2VmdWwgd2hlbiB0aGUgb3V0cHV0IGlzIHRvIGEKLXRlcm1pbmFsLCBhbmQgYW5vdGhlciBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBvdXRwdXQgaXMgYSBmaWxlIG9yIGEKLXBpcGUsIHRoZW4gaXQgaXMgdXN1YWxseSBiZXN0IHRvIG1ha2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdGhlIG9uZSB0aGF0Ci1pcyB1c2VmdWwgd2l0aCBvdXRwdXQgdG8gYSB0ZXJtaW5hbCwgYW5kIGhhdmUgYW4gb3B0aW9uIGZvciB0aGUgb3RoZXIKLWJlaGF2aW9yLgotCi1Db21wYXRpYmlsaXR5IHJlcXVpcmVzIGNlcnRhaW4gcHJvZ3JhbXMgdG8gZGVwZW5kIG9uIHRoZSB0eXBlIG9mIG91dHB1dAotZGV2aWNlLiAgSXQgd291bGQgYmUgZGlzYXN0cm91cyBpZiBAY29kZXtsc30gb3IgQGNvZGV7c2h9IGRpZCBub3QgZG8gc28KLWluIHRoZSB3YXkgYWxsIHVzZXJzIGV4cGVjdC4gIEluIHNvbWUgb2YgdGhlc2UgY2FzZXMsIHdlIHN1cHBsZW1lbnQgdGhlCi1wcm9ncmFtIHdpdGggYSBwcmVmZXJyZWQgYWx0ZXJuYXRlIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlCi1vdXRwdXQgZGV2aWNlIHR5cGUuICBGb3IgZXhhbXBsZSwgd2UgcHJvdmlkZSBhIEBjb2Rle2Rpcn0gcHJvZ3JhbSBtdWNoCi1saWtlIEBjb2Rle2xzfSBleGNlcHQgdGhhdCBpdHMgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IGlzIGFsd2F5cwotbXVsdGktY29sdW1uIGZvcm1hdC4KLQotSXQgaXMgYSBnb29kIGlkZWEgdG8gZm9sbG93IHRoZSBAc2N7UE9TSVh9IGd1aWRlbGluZXMgZm9yIHRoZQotY29tbWFuZC1saW5lIG9wdGlvbnMgb2YgYSBwcm9ncmFtLiAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvIHRoaXMgaXMgdG8gdXNlCi1AY29kZXtnZXRvcHR9IHRvIHBhcnNlIHRoZW0uICBOb3RlIHRoYXQgdGhlIEdOVSB2ZXJzaW9uIG9mIEBjb2Rle2dldG9wdH0KLXdpbGwgbm9ybWFsbHkgcGVybWl0IG9wdGlvbnMgYW55d2hlcmUgYW1vbmcgdGhlIGFyZ3VtZW50cyB1bmxlc3MgdGhlCi1zcGVjaWFsIGFyZ3VtZW50IEBzYW1wey0tfSBpcyB1c2VkLiAgVGhpcyBpcyBub3Qgd2hhdCBAc2N7UE9TSVh9Ci1zcGVjaWZpZXM7IGl0IGlzIGEgR05VIGV4dGVuc2lvbi4KLQotUGxlYXNlIGRlZmluZSBsb25nLW5hbWVkIG9wdGlvbnMgdGhhdCBhcmUgZXF1aXZhbGVudCB0byB0aGUKLXNpbmdsZS1sZXR0ZXIgVW5peC1zdHlsZSBvcHRpb25zLiAgV2UgaG9wZSB0byBtYWtlIEdOVSBtb3JlIHVzZXIKLWZyaWVuZGx5IHRoaXMgd2F5LiAgVGhpcyBpcyBlYXN5IHRvIGRvIHdpdGggdGhlIEdOVSBmdW5jdGlvbgotQGNvZGV7Z2V0b3B0X2xvbmd9LgotCi1PbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgbG9uZy1uYW1lZCBvcHRpb25zIGlzIHRoYXQgdGhleSBjYW4gYmUKLWNvbnNpc3RlbnQgZnJvbSBwcm9ncmFtIHRvIHByb2dyYW0uICBGb3IgZXhhbXBsZSwgdXNlcnMgc2hvdWxkIGJlIGFibGUKLXRvIGV4cGVjdCB0aGUgYGB2ZXJib3NlJycgb3B0aW9uIG9mIGFueSBHTlUgcHJvZ3JhbSB3aGljaCBoYXMgb25lLCB0byBiZQotc3BlbGxlZCBwcmVjaXNlbHkgQHNhbXB7LS12ZXJib3NlfS4gIFRvIGFjaGlldmUgdGhpcyB1bmlmb3JtaXR5LCBsb29rIGF0Ci10aGUgdGFibGUgb2YgY29tbW9uIGxvbmctb3B0aW9uIG5hbWVzIHdoZW4geW91IGNob29zZSB0aGUgb3B0aW9uIG5hbWVzCi1mb3IgeW91ciBwcm9ncmFtIChAcHhyZWZ7T3B0aW9uIFRhYmxlfSkuCi0KLUl0IGlzIHVzdWFsbHkgYSBnb29kIGlkZWEgZm9yIGZpbGUgbmFtZXMgZ2l2ZW4gYXMgb3JkaW5hcnkgYXJndW1lbnRzIHRvCi1iZSBpbnB1dCBmaWxlcyBvbmx5OyBhbnkgb3V0cHV0IGZpbGVzIHdvdWxkIGJlIHNwZWNpZmllZCB1c2luZyBvcHRpb25zCi0ocHJlZmVyYWJseSBAc2FtcHstb30gb3IgQHNhbXB7LS1vdXRwdXR9KS4gIEV2ZW4gaWYgeW91IGFsbG93IGFuIG91dHB1dAotZmlsZSBuYW1lIGFzIGFuIG9yZGluYXJ5IGFyZ3VtZW50IGZvciBjb21wYXRpYmlsaXR5LCB0cnkgdG8gcHJvdmlkZSBhbgotb3B0aW9uIGFzIGFub3RoZXIgd2F5IHRvIHNwZWNpZnkgaXQuICBUaGlzIHdpbGwgbGVhZCB0byBtb3JlIGNvbnNpc3RlbmN5Ci1hbW9uZyBHTlUgdXRpbGl0aWVzLCBhbmQgZmV3ZXIgaWRpb3N5bmNyYWNpZXMgZm9yIHVzZXJzIHRvIHJlbWVtYmVyLgotCi1BbGwgcHJvZ3JhbXMgc2hvdWxkIHN1cHBvcnQgdHdvIHN0YW5kYXJkIG9wdGlvbnM6IEBzYW1wey0tdmVyc2lvbn0KLWFuZCBAc2FtcHstLWhlbHB9LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC0tdmVyc2lvbgotVGhpcyBvcHRpb24gc2hvdWxkIGRpcmVjdCB0aGUgcHJvZ3JhbSB0byBpbmZvcm1hdGlvbiBhYm91dCBpdHMgbmFtZSwKLXZlcnNpb24sIG9yaWdpbiBhbmQgbGVnYWwgc3RhdHVzLCBhbGwgb24gc3RhbmRhcmQgb3V0cHV0LCBhbmQgdGhlbiBleGl0Ci1zdWNjZXNzZnVsbHkuICBPdGhlciBvcHRpb25zIGFuZCBhcmd1bWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb25jZSB0aGlzCi1pcyBzZWVuLCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkIG5vdCBwZXJmb3JtIGl0cyBub3JtYWwgZnVuY3Rpb24uCi0KLVRoZSBmaXJzdCBsaW5lIGlzIG1lYW50IHRvIGJlIGVhc3kgZm9yIGEgcHJvZ3JhbSB0byBwYXJzZTsgdGhlIHZlcnNpb24KLW51bWJlciBwcm9wZXIgc3RhcnRzIGFmdGVyIHRoZSBsYXN0IHNwYWNlLiAgSW4gYWRkaXRpb24sIGl0IGNvbnRhaW5zCi10aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoaXMgcHJvZ3JhbSwgaW4gdGhpcyBmb3JtYXQ6Ci0KLUBleGFtcGxlCi1HTlUgRW1hY3MgMTkuMzAKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBwcm9ncmFtJ3MgbmFtZSBzaG91bGQgYmUgYSBjb25zdGFudCBzdHJpbmc7IEBlbXBoe2Rvbid0fSBjb21wdXRlIGl0Ci1mcm9tIEBjb2Rle2FyZ3ZbMF19LiAgVGhlIGlkZWEgaXMgdG8gc3RhdGUgdGhlIHN0YW5kYXJkIG9yIGNhbm9uaWNhbAotbmFtZSBmb3IgdGhlIHByb2dyYW0sIG5vdCBpdHMgZmlsZSBuYW1lLiAgVGhlcmUgYXJlIG90aGVyIHdheXMgdG8gZmluZAotb3V0IHRoZSBwcmVjaXNlIGZpbGUgbmFtZSB3aGVyZSBhIGNvbW1hbmQgaXMgZm91bmQgaW4gQGNvZGV7UEFUSH0uCi0KLUlmIHRoZSBwcm9ncmFtIGlzIGEgc3Vic2lkaWFyeSBwYXJ0IG9mIGEgbGFyZ2VyIHBhY2thZ2UsIG1lbnRpb24gdGhlCi1wYWNrYWdlIG5hbWUgaW4gcGFyZW50aGVzZXMsIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWVtYWNzc2VydmVyIChHTlUgRW1hY3MpIDE5LjMwCi1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1JZiB0aGUgcGFja2FnZSBoYXMgYSB2ZXJzaW9uIG51bWJlciB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGlzCi1wcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIsIHlvdSBjYW4gbWVudGlvbiB0aGUgcGFja2FnZSB2ZXJzaW9uIG51bWJlcgotanVzdCBiZWZvcmUgdGhlIGNsb3NlLXBhcmVudGhlc2lzLgotCi1JZiB5b3UgQHN0cm9uZ3tuZWVkfSB0byBtZW50aW9uIHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgbGlicmFyaWVzIHdoaWNoCi1hcmUgZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIHRoaXMgcHJvZ3JhbSwKLXlvdSBjYW4gZG8gc28gYnkgcHJpbnRpbmcgYW4gYWRkaXRpb25hbCBsaW5lIG9mIHZlcnNpb24gaW5mbyBmb3IgZWFjaAotbGlicmFyeSB5b3Ugd2FudCB0byBtZW50aW9uLiAgVXNlIHRoZSBzYW1lIGZvcm1hdCBmb3IgdGhlc2UgbGluZXMgYXMgZm9yCi10aGUgZmlyc3QgbGluZS4KLQotUGxlYXNlIGRvIG5vdCBtZW50aW9uIGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgdGhlIHByb2dyYW0gdXNlcyBgYGp1c3QKLWZvciBjb21wbGV0ZW5lc3MnJy0tLXRoYXQgd291bGQgcHJvZHVjZSBhIGxvdCBvZiB1bmhlbHBmdWwgY2x1dHRlci4KLVBsZWFzZSBtZW50aW9uIGxpYnJhcnkgdmVyc2lvbiBudW1iZXJzIG9ubHkgaWYgeW91IGZpbmQgaW4gcHJhY3RpY2UgdGhhdAotdGhleSBhcmUgdmVyeSBpbXBvcnRhbnQgdG8geW91IGluIGRlYnVnZ2luZy4KLQotVGhlIGZvbGxvd2luZyBsaW5lLCBhZnRlciB0aGUgdmVyc2lvbiBudW1iZXIgbGluZSBvciBsaW5lcywgc2hvdWxkIGJlIGEKLWNvcHlyaWdodCBub3RpY2UuICBJZiBtb3JlIHRoYW4gb25lIGNvcHlyaWdodCBub3RpY2UgaXMgY2FsbGVkIGZvciwgcHV0Ci1lYWNoIG9uIGEgc2VwYXJhdGUgbGluZS4KLQotTmV4dCBzaG91bGQgZm9sbG93IGEgYnJpZWYgc3RhdGVtZW50IHRoYXQgdGhlIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZSwKLWFuZCB0aGF0IHVzZXJzIGFyZSBmcmVlIHRvIGNvcHkgYW5kIGNoYW5nZSBpdCBvbiBjZXJ0YWluIGNvbmRpdGlvbnMuICBJZgotdGhlIHByb2dyYW0gaXMgY292ZXJlZCBieSB0aGUgR05VIEdQTCwgc2F5IHNvIGhlcmUuICBBbHNvIG1lbnRpb24gdGhhdAotdGhlcmUgaXMgbm8gd2FycmFudHksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdy4KLQotSXQgaXMgb2sgdG8gZmluaXNoIHRoZSBvdXRwdXQgd2l0aCBhIGxpc3Qgb2YgdGhlIG1ham9yIGF1dGhvcnMgb2YgdGhlCi1wcm9ncmFtLCBhcyBhIHdheSBvZiBnaXZpbmcgY3JlZGl0LgotCi1IZXJlJ3MgYW4gZXhhbXBsZSBvZiBvdXRwdXQgdGhhdCBmb2xsb3dzIHRoZXNlIHJ1bGVzOgotCi1Ac21hbGxleGFtcGxlCi1HTlUgRW1hY3MgMTkuMzQuNQotQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotR05VIEVtYWNzIGNvbWVzIHdpdGggTk8gV0FSUkFOVFksCi10byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXcuCi1Zb3UgbWF5IHJlZGlzdHJpYnV0ZSBjb3BpZXMgb2YgR05VIEVtYWNzCi11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgotRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlc2UgbWF0dGVycywKLXNlZSB0aGUgZmlsZXMgbmFtZWQgQ09QWUlORy4KLUBlbmQgc21hbGxleGFtcGxlCi0KLVlvdSBzaG91bGQgYWRhcHQgdGhpcyB0byB5b3VyIHByb2dyYW0sIG9mIGNvdXJzZSwgZmlsbGluZyBpbiB0aGUgcHJvcGVyCi15ZWFyLCBjb3B5cmlnaHQgaG9sZGVyLCBuYW1lIG9mIHByb2dyYW0sIGFuZCB0aGUgcmVmZXJlbmNlcyB0bwotZGlzdHJpYnV0aW9uIHRlcm1zLCBhbmQgY2hhbmdpbmcgdGhlIHJlc3Qgb2YgdGhlIHdvcmRpbmcgYXMgbmVjZXNzYXJ5LgotCi1UaGlzIGNvcHlyaWdodCBub3RpY2Ugb25seSBuZWVkcyB0byBtZW50aW9uIHRoZSBtb3N0IHJlY2VudCB5ZWFyIGluCi13aGljaCBjaGFuZ2VzIHdlcmUgbWFkZS0tLXRoZXJlJ3Mgbm8gbmVlZCB0byBsaXN0IHRoZSB5ZWFycyBmb3IgcHJldmlvdXMKLXZlcnNpb25zJyBjaGFuZ2VzLiAgWW91IGRvbid0IGhhdmUgdG8gbWVudGlvbiB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSBpbgotdGhlc2Ugbm90aWNlcywgaWYgdGhhdCBpcyBpbmNvbnZlbmllbnQsIHNpbmNlIGl0IGFwcGVhcmVkIGluIHRoZSBmaXJzdAotbGluZS4KLQotQGl0ZW0gLS1oZWxwCi1UaGlzIG9wdGlvbiBzaG91bGQgb3V0cHV0IGJyaWVmIGRvY3VtZW50YXRpb24gZm9yIGhvdyB0byBpbnZva2UgdGhlCi1wcm9ncmFtLCBvbiBzdGFuZGFyZCBvdXRwdXQsIHRoZW4gZXhpdCBzdWNjZXNzZnVsbHkuICBPdGhlciBvcHRpb25zIGFuZAotYXJndW1lbnRzIHNob3VsZCBiZSBpZ25vcmVkIG9uY2UgdGhpcyBpcyBzZWVuLCBhbmQgdGhlIHByb2dyYW0gc2hvdWxkCi1ub3QgcGVyZm9ybSBpdHMgbm9ybWFsIGZ1bmN0aW9uLgotCi1OZWFyIHRoZSBlbmQgb2YgdGhlIEBzYW1wey0taGVscH0gb3B0aW9uJ3Mgb3V0cHV0IHRoZXJlIHNob3VsZCBiZSBhIGxpbmUKLXRoYXQgc2F5cyB3aGVyZSB0byBtYWlsIGJ1ZyByZXBvcnRzLiAgSXQgc2hvdWxkIGhhdmUgdGhpcyBmb3JtYXQ6Ci0KLUBleGFtcGxlCi1SZXBvcnQgYnVncyB0byBAdmFye21haWxpbmctYWRkcmVzc30uCi1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLQotQG5vZGUgT3B0aW9uIFRhYmxlCi1Ac2VjdGlvbiBUYWJsZSBvZiBMb25nIE9wdGlvbnMKLQotSGVyZSBpcyBhIHRhYmxlIG9mIGxvbmcgb3B0aW9ucyB1c2VkIGJ5IEdOVSBwcm9ncmFtcy4gIEl0IGlzIHN1cmVseQotaW5jb21wbGV0ZSwgYnV0IHdlIGFpbSB0byBsaXN0IGFsbCB0aGUgb3B0aW9ucyB0aGF0IGEgbmV3IHByb2dyYW0gbWlnaHQKLXdhbnQgdG8gYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYgeW91IHVzZSBuYW1lcyBub3QgYWxyZWFkeSBpbiB0aGUgdGFibGUsCi1wbGVhc2Ugc2VuZCBAZW1haWx7Z251QEBnbnUub3JnfSBhIGxpc3Qgb2YgdGhlbSwgd2l0aCB0aGVpcgotbWVhbmluZ3MsIHNvIHdlIGNhbiB1cGRhdGUgdGhlIHRhYmxlLgotCi1AYyBQbGVhc2UgbGVhdmUgbmV3bGluZXMgYmV0d2VlbiBpdGVtcyBpbiB0aGlzIHRhYmxlOyBpdCdzIG11Y2ggZWFzaWVyCi1AYyB0byB1cGRhdGUgd2hlbiBpdCBpc24ndCBjb21wbGV0ZWx5IHNxdWFzaGVkIHRvZ2V0aGVyIGFuZCB1bnJlYWRhYmxlLgotQGMgV2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHNob3J0IG9wdGlvbiBmb3IgYSBsb25nIG9wdGlvbiBuYW1lLCBwdXQKLUBjIGEgc2VtaWNvbG9uIGJldHdlZW4gdGhlIGxpc3RzIG9mIHRoZSBwcm9ncmFtcyB0aGF0IHVzZSB0aGVtLCBub3QgYQotQGMgcGVyaW9kLiAgIC0tZnJpZWRtYW4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBhZnRlci1kYXRlCi1Ac2FtcHstTn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gYWxsCi1Ac2FtcHstYX0gaW4gQGNvZGV7ZHV9LCBAY29kZXtsc30sIEBjb2Rle25tfSwgQGNvZGV7c3R0eX0sIEBjb2Rle3VuYW1lfSwKLWFuZCBAY29kZXt1bmV4cGFuZH0uCi0KLUBpdGVtIGFsbC10ZXh0Ci1Ac2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGFsbW9zdC1hbGwKLUBzYW1wey1BfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGFwcGVuZAotQHNhbXB7LWF9IGluIEBjb2Rle2V0YWdzfSwgQGNvZGV7dGVlfSwgQGNvZGV7dGltZX07Ci1Ac2FtcHstcn0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gYXJjaGl2ZQotQHNhbXB7LWF9IGluIEBjb2Rle2NwfS4KLQotQGl0ZW0gYXJjaGl2ZS1uYW1lCi1Ac2FtcHstbn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGFyZ2xlbmd0aAotQHNhbXB7LWx9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gYXNjaWkKLUBzYW1wey1hfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gYXNzaWduCi1Ac2FtcHstdn0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGFzc3VtZS1uZXcKLUBzYW1wey1XfSBpbiBNYWtlLgotCi1AaXRlbSBhc3N1bWUtb2xkCi1Ac2FtcHstb30gaW4gTWFrZS4KLQotQGl0ZW0gYXV0by1jaGVjawotQHNhbXB7LWF9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGF1dG8tcGFnZXIKLUBzYW1wey1hfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGF1dG8tcmVmZXJlbmNlCi1Ac2FtcHstQX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gYXZvaWQtd3JhcHMKLUBzYW1wey1ufSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIGJhY2t3YXJkLXNlYXJjaAotQHNhbXB7LUJ9IGluIEBjb2Rle2N0YWdzfS4KLQotQGl0ZW0gYmFzZW5hbWUKLUBzYW1wey1mfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gYmF0Y2gKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBiYXVkCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gYmVmb3JlCi1Ac2FtcHstYn0gaW4gQGNvZGV7dGFjfS4KLQotQGl0ZW0gYmluYXJ5Ci1Ac2FtcHstYn0gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBiaXRzLXBlci1jb2RlCi1Ac2FtcHstYn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGJsb2NrLXNpemUKLVVzZWQgaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGJsb2NrcwotQHNhbXB7LWJ9IGluIEBjb2Rle2hlYWR9IGFuZCBAY29kZXt0YWlsfS4KLQotQGl0ZW0gYnJlYWstZmlsZQotQHNhbXB7LWJ9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIGJyaWVmCi1Vc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gbWFrZSBvdXRwdXQgc2hvcnRlci4KLQotQGl0ZW0gYnl0ZXMKLUBzYW1wey1jfSBpbiBAY29kZXtoZWFkfSwgQGNvZGV7c3BsaXR9LCBhbmQgQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGNAdHsrK30KLUBzYW1wey1DfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIGNhdGVuYXRlCi1Ac2FtcHstQX0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gY2QKLVVzZWQgaW4gdmFyaW91cyBwcm9ncmFtcyB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgdG8gdXNlLgotCi1AaXRlbSBjaGFuZ2VzCi1Ac2FtcHstY30gaW4gQGNvZGV7Y2hncnB9IGFuZCBAY29kZXtjaG93bn0uCi0KLUBpdGVtIGNsYXNzaWZ5Ci1Ac2FtcHstRn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBjb2xvbnMKLUBzYW1wey1jfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBjb21tYW5kCi1Ac2FtcHstY30gaW4gQGNvZGV7c3V9OwotQHNhbXB7LXh9IGluIEdEQi4KLQotQGl0ZW0gY29tcGFyZQotQHNhbXB7LWR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGNvbXBhdAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gY29tcHJlc3MKLUBzYW1wey1afSBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtzaGFyfS4KLQotQGl0ZW0gY29uY2F0ZW5hdGUKLUBzYW1wey1BfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjb25maXJtYXRpb24KLUBzYW1wey13fSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBjb250ZXh0Ci1Vc2VkIGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBjb3B5bGVmdAotQHNhbXB7LVcgY29weWxlZnR9IGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBjb3B5cmlnaHQKLUBzYW1wey1DfSBpbiBAY29kZXtwdHh9LCBAY29kZXtyZWNvZGV9LCBhbmQgQGNvZGV7d2RpZmZ9OwotQHNhbXB7LVcgY29weXJpZ2h0fSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gY29yZQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGNvdW50Ci1Ac2FtcHstcX0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gY291bnQtbGlua3MKLUBzYW1wey1sfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIGNyZWF0ZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtjcGlvfS4KLQotQGl0ZW0gY3V0LW1hcmsKLUBzYW1wey1jfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gY3hyZWYKLUBzYW1wey14fSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIGRhdGUKLUBzYW1wey1kfSBpbiBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIGRlYnVnCi1Ac2FtcHstZH0gaW4gTWFrZSBhbmQgQGNvZGV7bTR9OwotQHNhbXB7LXR9IGluIEJpc29uLgotCi1AaXRlbSBkZWZpbmUKLUBzYW1wey1EfSBpbiBAY29kZXttNH0uCi0KLUBpdGVtIGRlZmluZXMKLUBzYW1wey1kfSBpbiBCaXNvbiBhbmQgQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSBkZWxldGUKLUBzYW1wey1EfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBkZXJlZmVyZW5jZQotQHNhbXB7LUx9IGluIEBjb2Rle2NoZ3JwfSwgQGNvZGV7Y2hvd259LCBAY29kZXtjcGlvfSwgQGNvZGV7ZHV9LAotQGNvZGV7bHN9LCBhbmQgQGNvZGV7dGFyfS4KLQotQGl0ZW0gZGVyZWZlcmVuY2UtYXJncwotQHNhbXB7LUR9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gZGlhY3JpdGljcwotQHNhbXB7LWR9IGluIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIGRpY3Rpb25hcnktb3JkZXIKLUBzYW1wey1kfSBpbiBAY29kZXtsb29rfS4KLQotQGl0ZW0gZGlmZgotQHNhbXB7LWR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGRpZ2l0cwotQHNhbXB7LW59IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIGRpcmVjdG9yeQotU3BlY2lmeSB0aGUgZGlyZWN0b3J5IHRvIHVzZSwgaW4gdmFyaW91cyBwcm9ncmFtcy4gIEluIEBjb2Rle2xzfSwgaXQKLW1lYW5zIHRvIHNob3cgZGlyZWN0b3JpZXMgdGhlbXNlbHZlcyByYXRoZXIgdGhhbiB0aGVpciBjb250ZW50cy4gIEluCi1AY29kZXtybX0gYW5kIEBjb2Rle2xufSwgaXQgbWVhbnMgdG8gbm90IHRyZWF0IGxpbmtzIHRvIGRpcmVjdG9yaWVzCi1zcGVjaWFsbHkuCi0KLUBpdGVtIGRpc2NhcmQtYWxsCi1Ac2FtcHsteH0gaW4gQGNvZGV7c3RyaXB9LgotCi1AaXRlbSBkaXNjYXJkLWxvY2FscwotQHNhbXB7LVh9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gZHJ5LXJ1bgotQHNhbXB7LW59IGluIE1ha2UuCi0KLUBpdGVtIGVkCi1Ac2FtcHstZX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGVsaWRlLWVtcHR5LWZpbGVzCi1Ac2FtcHsten0gaW4gQGNvZGV7Y3NwbGl0fS4KLQotQGl0ZW0gZW5kLWRlbGV0ZQotQHNhbXB7LXh9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gZW5kLWluc2VydAotQHNhbXB7LXp9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gZW50aXJlLW5ldy1maWxlCi1Ac2FtcHstTn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGVudmlyb25tZW50LW92ZXJyaWRlcwotQHNhbXB7LWV9IGluIE1ha2UuCi0KLUBpdGVtIGVvZgotQHNhbXB7LWV9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gZXBvY2gKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBlcnJvci1saW1pdAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIGVycm9yLW91dHB1dAotQHNhbXB7LW99IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZXNjYXBlCi1Ac2FtcHstYn0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBleGNsdWRlLWZyb20KLUBzYW1wey1YfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBleGVjCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gZXhpdAotQHNhbXB7LXh9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gZXhpdC0wCi1Ac2FtcHstZX0gaW4gQGNvZGV7dW5zaGFyfS4KLQotQGl0ZW0gZXhwYW5kLXRhYnMKLUBzYW1wey10fSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gZXhwcmVzc2lvbgotQHNhbXB7LWV9IGluIEBjb2Rle3NlZH0uCi0KLUBpdGVtIGV4dGVybi1vbmx5Ci1Ac2FtcHstZ30gaW4gQGNvZGV7bm19LgotCi1AaXRlbSBleHRyYWN0Ci1Ac2FtcHstaX0gaW4gQGNvZGV7Y3Bpb307Ci1Ac2FtcHsteH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZmFjZXMKLUBzYW1wey1mfSBpbiBAY29kZXtmaW5nZXJ9LgotCi1AaXRlbSBmYXN0Ci1Ac2FtcHstZn0gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBmYXRhbC13YXJuaW5ncwotQHNhbXB7LUV9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gZmlsZQotQHNhbXB7LWZ9IGluIEBjb2Rle2luZm99LCBAY29kZXtnYXdrfSwgTWFrZSwgQGNvZGV7bXR9LCBhbmQgQGNvZGV7dGFyfTsKLUBzYW1wey1ufSBpbiBAY29kZXtzZWR9OwotQHNhbXB7LXJ9IGluIEBjb2Rle3RvdWNofS4KLQotQGl0ZW0gZmllbGQtc2VwYXJhdG9yCi1Ac2FtcHstRn0gaW4gQGNvZGV7Z2F3a30uCi0KLUBpdGVtIGZpbGUtcHJlZml4Ci1Ac2FtcHstYn0gaW4gQmlzb24uCi0KLUBpdGVtIGZpbGUtdHlwZQotQHNhbXB7LUZ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gZmlsZXMtZnJvbQotQHNhbXB7LVR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGZpbGwtY29sdW1uCi1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gZmxhZy10cnVuY2F0aW9uCi1Ac2FtcHstRn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gZml4ZWQtb3V0cHV0LWZpbGVzCi1Ac2FtcHsteX0gaW4gQmlzb24uCi0KLUBpdGVtIGZvbGxvdwotQHNhbXB7LWZ9IGluIEBjb2Rle3RhaWx9LgotCi1AaXRlbSBmb290bm90ZS1zdHlsZQotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIGZvcmNlCi1Ac2FtcHstZn0gaW4gQGNvZGV7Y3B9LCBAY29kZXtsbn0sIEBjb2Rle212fSwgYW5kIEBjb2Rle3JtfS4KLQotQGl0ZW0gZm9yY2UtcHJlZml4Ci1Ac2FtcHstRn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGZvcm1hdAotVXNlZCBpbiBAY29kZXtsc30sIEBjb2Rle3RpbWV9LCBhbmQgQGNvZGV7cHR4fS4KLQotQGl0ZW0gZnJlZXplLXN0YXRlCi1Ac2FtcHstRn0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBmdWxsbmFtZQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIGdhcC1zaXplCi1Ac2FtcHstZ30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gZ2V0Ci1Ac2FtcHsteH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gZ3JhcGhpYwotQHNhbXB7LWl9IGluIEBjb2Rle3VsfS4KLQotQGl0ZW0gZ3JhcGhpY3MKLUBzYW1wey1nfSBpbiBAY29kZXtyZWNvZGV9LgotCi1AaXRlbSBncm91cAotQHNhbXB7LWd9IGluIEBjb2Rle2luc3RhbGx9LgotCi1AaXRlbSBnemlwCi1Ac2FtcHsten0gaW4gQGNvZGV7dGFyfSBhbmQgQGNvZGV7c2hhcn0uCi0KLUBpdGVtIGhhc2hzaXplCi1Ac2FtcHstSH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBoZWFkZXIKLUBzYW1wey1ofSBpbiBAY29kZXtvYmpkdW1wfSBhbmQgQGNvZGV7cmVjb2RlfQotCi1AaXRlbSBoZWFkaW5nCi1Ac2FtcHstSH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gaGVscAotVXNlZCB0byBhc2sgZm9yIGJyaWVmIHVzYWdlIGluZm9ybWF0aW9uLgotCi1AaXRlbSBoZXJlLWRlbGltaXRlcgotQHNhbXB7LWR9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBoaWRlLWNvbnRyb2wtY2hhcnMKLUBzYW1wey1xfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGlkbGUKLUBzYW1wey11fSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBpZmRlZgotQHNhbXB7LUR9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUKLUBzYW1wey1JfSBpbiBAY29kZXtsc307Ci1Ac2FtcHsteH0gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gaWdub3JlLWFsbC1zcGFjZQotQHNhbXB7LXd9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtYmFja3VwcwotQHNhbXB7LUJ9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gaWdub3JlLWJsYW5rLWxpbmVzCi1Ac2FtcHstQn0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlnbm9yZS1jYXNlCi1Ac2FtcHstZn0gaW4gQGNvZGV7bG9va30gYW5kIEBjb2Rle3B0eH07Ci1Ac2FtcHstaX0gaW4gQGNvZGV7ZGlmZn0gYW5kIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gaWdub3JlLWVycm9ycwotQHNhbXB7LWl9IGluIE1ha2UuCi0KLUBpdGVtIGlnbm9yZS1maWxlCi1Ac2FtcHstaX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gaWdub3JlLWluZGVudGF0aW9uCi1Ac2FtcHstSX0gaW4gQGNvZGV7ZXRhZ3N9LgotCi1AaXRlbSBpZ25vcmUtaW5pdC1maWxlCi1Ac2FtcHstZn0gaW4gT2xlby4KLQotQGl0ZW0gaWdub3JlLWludGVycnVwdHMKLUBzYW1wey1pfSBpbiBAY29kZXt0ZWV9LgotCi1AaXRlbSBpZ25vcmUtbWF0Y2hpbmctbGluZXMKLUBzYW1wey1JfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gaWdub3JlLXNwYWNlLWNoYW5nZQotQHNhbXB7LWJ9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBpZ25vcmUtemVyb3MKLUBzYW1wey1pfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBpbmNsdWRlCi1Ac2FtcHstaX0gaW4gQGNvZGV7ZXRhZ3N9OwotQHNhbXB7LUl9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gaW5jbHVkZS1kaXIKLUBzYW1wey1JfSBpbiBNYWtlLgotCi1AaXRlbSBpbmNyZW1lbnRhbAotQHNhbXB7LUd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGluZm8KLUBzYW1wey1pfSwgQHNhbXB7LWx9LCBhbmQgQHNhbXB7LW19IGluIEZpbmdlci4KLQotQGl0ZW0gaW5pdGlhbAotQHNhbXB7LWl9IGluIEBjb2Rle2V4cGFuZH0uCi0KLUBpdGVtIGluaXRpYWwtdGFiCi1Ac2FtcHstVH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIGlub2RlCi1Ac2FtcHstaX0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSBpbnRlcmFjdGl2ZQotQHNhbXB7LWl9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0sIEBjb2Rle3JtfTsKLUBzYW1wey1lfSBpbiBAY29kZXttNH07Ci1Ac2FtcHstcH0gaW4gQGNvZGV7eGFyZ3N9OwotQHNhbXB7LXd9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGludGVybWl4LXR5cGUKLUBzYW1wey1wfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gam9icwotQHNhbXB7LWp9IGluIE1ha2UuCi0KLUBpdGVtIGp1c3QtcHJpbnQKLUBzYW1wey1ufSBpbiBNYWtlLgotCi1AaXRlbSBrZWVwLWdvaW5nCi1Ac2FtcHsta30gaW4gTWFrZS4KLQotQGl0ZW0ga2VlcC1maWxlcwotQHNhbXB7LWt9IGluIEBjb2Rle2NzcGxpdH0uCi0KLUBpdGVtIGtpbG9ieXRlcwotQHNhbXB7LWt9IGluIEBjb2Rle2R1fSBhbmQgQGNvZGV7bHN9LgotCi1AaXRlbSBsYW5ndWFnZQotQHNhbXB7LWx9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gbGVzcy1tb2RlCi1Ac2FtcHstbH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBsZXZlbC1mb3ItZ3ppcAotQHNhbXB7LWd9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBsaW5lLWJ5dGVzCi1Ac2FtcHstQ30gaW4gQGNvZGV7c3BsaXR9LgotCi1AaXRlbSBsaW5lcwotVXNlZCBpbiBAY29kZXtzcGxpdH0sIEBjb2Rle2hlYWR9LCBhbmQgQGNvZGV7dGFpbH0uCi0KLUBpdGVtIGxpbmsKLUBzYW1wey1sfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gbGludAotQGl0ZW14IGxpbnQtb2xkCi1Vc2VkIGluIEBjb2Rle2dhd2t9LgotCi1AaXRlbSBsaXN0Ci1Ac2FtcHstdH0gaW4gQGNvZGV7Y3Bpb307Ci1Ac2FtcHstbH0gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gbGlzdAotQHNhbXB7LXR9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIGxpdGVyYWwKLUBzYW1wey1OfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIGxvYWQtYXZlcmFnZQotQHNhbXB7LWx9IGluIE1ha2UuCi0KLUBpdGVtIGxvZ2luCi1Vc2VkIGluIEBjb2Rle3N1fS4KLQotQGl0ZW0gbWFjaGluZQotTm8gbGlzdGluZyBvZiB3aGljaCBwcm9ncmFtcyBhbHJlYWR5IHVzZSB0aGlzOwotc29tZW9uZSBzaG91bGQgY2hlY2sgdG8KLXNlZSBpZiBhbnkgYWN0dWFsbHkgZG8sIGFuZCB0ZWxsIEBlbWFpbHtnbnVAQGdudS5vcmd9LgotCi1AaXRlbSBtYWNyby1uYW1lCi1Ac2FtcHstTX0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gbWFpbAotQHNhbXB7LW19IGluIEBjb2Rle2hlbGxvfSBhbmQgQGNvZGV7dW5hbWV9LgotCi1AaXRlbSBtYWtlLWRpcmVjdG9yaWVzCi1Ac2FtcHstZH0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIG1ha2VmaWxlCi1Ac2FtcHstZn0gaW4gTWFrZS4KLQotQGl0ZW0gbWFwcGVkCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gbWF4LWFyZ3MKLUBzYW1wey1ufSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG1heC1jaGFycwotQHNhbXB7LW59IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWF4LWxpbmVzCi1Ac2FtcHstbH0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSBtYXgtbG9hZAotQHNhbXB7LWx9IGluIE1ha2UuCi0KLUBpdGVtIG1heC1wcm9jcwotQHNhbXB7LVB9IGluIEBjb2Rle3hhcmdzfS4KLQotQGl0ZW0gbWVzZwotQHNhbXB7LVR9IGluIEBjb2Rle3dob30uCi0KLUBpdGVtIG1lc3NhZ2UKLUBzYW1wey1UfSBpbiBAY29kZXt3aG99LgotCi1AaXRlbSBtaW5pbWFsCi1Ac2FtcHstZH0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIG1peGVkLXV1ZW5jb2RlCi1Ac2FtcHstTX0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG1vZGUKLUBzYW1wey1tfSBpbiBAY29kZXtpbnN0YWxsfSwgQGNvZGV7bWtkaXJ9LCBhbmQgQGNvZGV7bWtmaWZvfS4KLQotQGl0ZW0gbW9kaWZpY2F0aW9uLXRpbWUKLUBzYW1wey1tfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBtdWx0aS12b2x1bWUKLUBzYW1wey1NfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBuYW1lLXByZWZpeAotQHNhbXB7LWF9IGluIEJpc29uLgotCi1AaXRlbSBuZXN0aW5nLWxpbWl0Ci1Ac2FtcHstTH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBuZXQtaGVhZGVycwotQHNhbXB7LWF9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuZXctZmlsZQotQHNhbXB7LVd9IGluIE1ha2UuCi0KLUBpdGVtIG5vLWJ1aWx0aW4tcnVsZXMKLUBzYW1wey1yfSBpbiBNYWtlLgotCi1AaXRlbSBuby1jaGFyYWN0ZXItY291bnQKLUBzYW1wey13fSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tY2hlY2stZXhpc3RpbmcKLUBzYW1wey14fSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gbm8tY29tbW9uCi1Ac2FtcHstM30gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSBuby1jcmVhdGUKLUBzYW1wey1jfSBpbiBAY29kZXt0b3VjaH0uCi0KLUBpdGVtIG5vLWRlZmluZXMKLUBzYW1wey1EfSBpbiBAY29kZXtldGFnc30uCi0KLUBpdGVtIG5vLWRlbGV0ZWQKLUBzYW1wey0xfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIG5vLWRlcmVmZXJlbmNlCi1Ac2FtcHstZH0gaW4gQGNvZGV7Y3B9LgotCi1AaXRlbSBuby1pbnNlcnRlZAotQHNhbXB7LTJ9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gbm8ta2VlcC1nb2luZwotQHNhbXB7LVN9IGluIE1ha2UuCi0KLUBpdGVtIG5vLWxpbmVzCi1Ac2FtcHstbH0gaW4gQmlzb24uCi0KLUBpdGVtIG5vLXBpcGluZwotQHNhbXB7LVB9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuby1wcm9mCi1Ac2FtcHstZX0gaW4gQGNvZGV7Z3Byb2Z9LgotCi1AaXRlbSBuby1yZWdleAotQHNhbXB7LVJ9IGluIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gbm8tc29ydAotQHNhbXB7LXB9IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gbm8tc3BsaXQKLVVzZWQgaW4gQGNvZGV7bWFrZWluZm99LgotCi1AaXRlbSBuby1zdGF0aWMKLUBzYW1wey1hfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG5vLXRpbWUKLUBzYW1wey1FfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG5vLXRpbWVzdGFtcAotQHNhbXB7LW19IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBuby12YWxpZGF0ZQotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIG5vLXdhaXQKLVVzZWQgaW4gQGNvZGV7ZW1hY3NjbGllbnR9LgotCi1AaXRlbSBuby13YXJuCi1Vc2VkIGluIHZhcmlvdXMgcHJvZ3JhbXMgdG8gaW5oaWJpdCB3YXJuaW5ncy4KLQotQGl0ZW0gbm9kZQotQHNhbXB7LW59IGluIEBjb2Rle2luZm99LgotCi1AaXRlbSBub2RlbmFtZQotQHNhbXB7LW59IGluIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gbm9ubWF0Y2hpbmcKLUBzYW1wey1mfSBpbiBAY29kZXtjcGlvfS4KLQotQGl0ZW0gbnN0dWZmCi1Ac2FtcHstbn0gaW4gQGNvZGV7b2JqZHVtcH0uCi0KLUBpdGVtIG51bGwKLUBzYW1wey0wfSBpbiBAY29kZXt4YXJnc30uCi0KLUBpdGVtIG51bWJlcgotQHNhbXB7LW59IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIG51bWJlci1ub25ibGFuawotQHNhbXB7LWJ9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIG51bWVyaWMtc29ydAotQHNhbXB7LW59IGluIEBjb2Rle25tfS4KLQotQGl0ZW0gbnVtZXJpYy11aWQtZ2lkCi1Ac2FtcHstbn0gaW4gQGNvZGV7Y3Bpb30gYW5kIEBjb2Rle2xzfS4KLQotQGl0ZW0gbngKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSBvbGQtYXJjaGl2ZQotQHNhbXB7LW99IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIG9sZC1maWxlCi1Ac2FtcHstb30gaW4gTWFrZS4KLQotQGl0ZW0gb25lLWZpbGUtc3lzdGVtCi1Ac2FtcHstbH0gaW4gQGNvZGV7dGFyfSwgQGNvZGV7Y3B9LCBhbmQgQGNvZGV7ZHV9LgotCi1AaXRlbSBvbmx5LWZpbGUKLUBzYW1wey1vfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSBvbmx5LXByb2YKLUBzYW1wey1mfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIG9ubHktdGltZQotQHNhbXB7LUZ9IGluIEBjb2Rle2dwcm9mfS4KLQotQGl0ZW0gb3V0cHV0Ci1JbiB2YXJpb3VzIHByb2dyYW1zLCBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZSBuYW1lLgotCi1AaXRlbSBvdXRwdXQtcHJlZml4Ci1Ac2FtcHstb30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIG92ZXJyaWRlCi1Ac2FtcHstb30gaW4gQGNvZGV7cm19LgotCi1AaXRlbSBvdmVyd3JpdGUKLUBzYW1wey1jfSBpbiBAY29kZXt1bnNoYXJ9LgotCi1AaXRlbSBvd25lcgotQHNhbXB7LW99IGluIEBjb2Rle2luc3RhbGx9LgotCi1AaXRlbSBwYWdpbmF0ZQotQHNhbXB7LWx9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBwYXJhZ3JhcGgtaW5kZW50Ci1Vc2VkIGluIEBjb2Rle21ha2VpbmZvfS4KLQotQGl0ZW0gcGFyZW50cwotQHNhbXB7LXB9IGluIEBjb2Rle21rZGlyfSBhbmQgQGNvZGV7cm1kaXJ9LgotCi1AaXRlbSBwYXNzLWFsbAotQHNhbXB7LXB9IGluIEBjb2Rle3VsfS4KLQotQGl0ZW0gcGFzcy10aHJvdWdoCi1Ac2FtcHstcH0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHBvcnQKLUBzYW1wey1QfSBpbiBAY29kZXtmaW5nZXJ9LgotCi1AaXRlbSBwb3J0YWJpbGl0eQotQHNhbXB7LWN9IGluIEBjb2Rle2NwaW99IGFuZCBAY29kZXt0YXJ9LgotCi1AaXRlbSBwb3NpeAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gcHJlZml4LWJ1aWx0aW5zCi1Ac2FtcHstUH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBwcmVmaXgKLUBzYW1wey1mfSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBwcmVzZXJ2ZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtjcH0uCi0KLUBpdGVtIHByZXNlcnZlLWVudmlyb25tZW50Ci1Ac2FtcHstcH0gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBwcmVzZXJ2ZS1tb2RpZmljYXRpb24tdGltZQotQHNhbXB7LW19IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSBwcmVzZXJ2ZS1vcmRlcgotQHNhbXB7LXN9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHByZXNlcnZlLXBlcm1pc3Npb25zCi1Ac2FtcHstcH0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gcHJpbnQKLUBzYW1wey1sfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcHJpbnQtY2hhcnMKLUBzYW1wey1MfSBpbiBAY29kZXtjbXB9LgotCi1AaXRlbSBwcmludC1kYXRhLWJhc2UKLUBzYW1wey1wfSBpbiBNYWtlLgotCi1AaXRlbSBwcmludC1kaXJlY3RvcnkKLUBzYW1wey13fSBpbiBNYWtlLgotCi1AaXRlbSBwcmludC1maWxlLW5hbWUKLUBzYW1wey1vfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHByaW50LXN5bWRlZnMKLUBzYW1wey1zfSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHByaW50ZXIKLUBzYW1wey1wfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHByb21wdAotQHNhbXB7LXB9IGluIEBjb2Rle2VkfS4KLQotQGl0ZW0gcXVlcnktdXNlcgotQHNhbXB7LVh9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBxdWVzdGlvbgotQHNhbXB7LXF9IGluIE1ha2UuCi0KLUBpdGVtIHF1aWV0Ci1Vc2VkIGluIG1hbnkgcHJvZ3JhbXMgdG8gaW5oaWJpdCB0aGUgdXN1YWwgb3V0cHV0LiAgQHN0cm9uZ3tOb3RlOn0gZXZlcnkKLXByb2dyYW0gYWNjZXB0aW5nIEBzYW1wey0tcXVpZXR9IHNob3VsZCBhY2NlcHQgQHNhbXB7LS1zaWxlbnR9IGFzIGEKLXN5bm9ueW0uCi0KLUBpdGVtIHF1aWV0LXVuc2hhcgotQHNhbXB7LVF9IGluIEBjb2Rle3NoYXJ9Ci0KLUBpdGVtIHF1b3RlLW5hbWUKLUBzYW1wey1RfSBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHJjcwotQHNhbXB7LW59IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSByZS1pbnRlcnZhbAotVXNlZCBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gcmVhZC1mdWxsLWJsb2NrcwotQHNhbXB7LUJ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHJlYWRub3cKLVVzZWQgaW4gR0RCLgotCi1AaXRlbSByZWNvbgotQHNhbXB7LW59IGluIE1ha2UuCi0KLUBpdGVtIHJlY29yZC1udW1iZXIKLUBzYW1wey1SfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSByZWN1cnNpdmUKLVVzZWQgaW4gQGNvZGV7Y2hncnB9LCBAY29kZXtjaG93bn0sIEBjb2Rle2NwfSwgQGNvZGV7bHN9LCBAY29kZXtkaWZmfSwKLWFuZCBAY29kZXtybX0uCi0KLUBpdGVtIHJlZmVyZW5jZS1saW1pdAotVXNlZCBpbiBAY29kZXttYWtlaW5mb30uCi0KLUBpdGVtIHJlZmVyZW5jZXMKLUBzYW1wey1yfSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSByZWdleAotQHNhbXB7LXJ9IGluIEBjb2Rle3RhY30gYW5kIEBjb2Rle2V0YWdzfS4KLQotQGl0ZW0gcmVsZWFzZQotQHNhbXB7LXJ9IGluIEBjb2Rle3VuYW1lfS4KLQotQGl0ZW0gcmVsb2FkLXN0YXRlCi1Ac2FtcHstUn0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSByZWxvY2F0aW9uCi1Ac2FtcHstcn0gaW4gQGNvZGV7b2JqZHVtcH0uCi0KLUBpdGVtIHJlbmFtZQotQHNhbXB7LXJ9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSByZXBsYWNlCi1Ac2FtcHstaX0gaW4gQGNvZGV7eGFyZ3N9LgotCi1AaXRlbSByZXBvcnQtaWRlbnRpY2FsLWZpbGVzCi1Ac2FtcHstc30gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHJlc2V0LWFjY2Vzcy10aW1lCi1Ac2FtcHstYX0gaW4gQGNvZGV7Y3Bpb30uCi0KLUBpdGVtIHJldmVyc2UKLUBzYW1wey1yfSBpbiBAY29kZXtsc30gYW5kIEBjb2Rle25tfS4KLQotQGl0ZW0gcmV2ZXJzZWQtZWQKLUBzYW1wey1mfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gcmlnaHQtc2lkZS1kZWZzCi1Ac2FtcHstUn0gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gc2FtZS1vcmRlcgotQHNhbXB7LXN9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHNhbWUtcGVybWlzc2lvbnMKLUBzYW1wey1wfSBpbiBAY29kZXt0YXJ9LgotCi1AaXRlbSBzYXZlCi1Ac2FtcHstZ30gaW4gQGNvZGV7c3R0eX0uCi0KLUBpdGVtIHNlCi1Vc2VkIGluIEdEQi4KLQotQGl0ZW0gc2VudGVuY2UtcmVnZXhwCi1Ac2FtcHstU30gaW4gQGNvZGV7cHR4fS4KLQotQGl0ZW0gc2VwYXJhdGUtZGlycwotQHNhbXB7LVN9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gc2VwYXJhdG9yCi1Ac2FtcHstc30gaW4gQGNvZGV7dGFjfS4KLQotQGl0ZW0gc2VxdWVuY2UKLVVzZWQgYnkgQGNvZGV7cmVjb2RlfSB0byBjaG9zZSBmaWxlcyBvciBwaXBlcyBmb3Igc2VxdWVuY2luZyBwYXNzZXMuCi0KLUBpdGVtIHNoZWxsCi1Ac2FtcHstc30gaW4gQGNvZGV7c3V9LgotCi1AaXRlbSBzaG93LWFsbAotQHNhbXB7LUF9IGluIEBjb2Rle2NhdH0uCi0KLUBpdGVtIHNob3ctYy1mdW5jdGlvbgotQHNhbXB7LXB9IGluIEBjb2Rle2RpZmZ9LgotCi1AaXRlbSBzaG93LWVuZHMKLUBzYW1wey1FfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzaG93LWZ1bmN0aW9uLWxpbmUKLUBzYW1wey1GfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gc2hvdy10YWJzCi1Ac2FtcHstVH0gaW4gQGNvZGV7Y2F0fS4KLQotQGl0ZW0gc2lsZW50Ci1Vc2VkIGluIG1hbnkgcHJvZ3JhbXMgdG8gaW5oaWJpdCB0aGUgdXN1YWwgb3V0cHV0LgotQHN0cm9uZ3tOb3RlOn0gZXZlcnkgcHJvZ3JhbSBhY2NlcHRpbmcKLUBzYW1wey0tc2lsZW50fSBzaG91bGQgYWNjZXB0IEBzYW1wey0tcXVpZXR9IGFzIGEgc3lub255bS4KLQotQGl0ZW0gc2l6ZQotQHNhbXB7LXN9IGluIEBjb2Rle2xzfS4KLQotQGl0ZW0gc29ydAotVXNlZCBpbiBAY29kZXtsc30uCi0KLUBpdGVtIHNvdXJjZQotQHNhbXB7LVcgc291cmNlfSBpbiBAY29kZXtnYXdrfS4KLQotQGl0ZW0gc3BhcnNlCi1Ac2FtcHstU30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gc3BlZWQtbGFyZ2UtZmlsZXMKLUBzYW1wey1IfSBpbiBAY29kZXtkaWZmfS4KLQotQGl0ZW0gc3BsaXQtYXQKLUBzYW1wey1FfSBpbiBAY29kZXt1bnNoYXJ9LgotCi1AaXRlbSBzcGxpdC1zaXplLWxpbWl0Ci1Ac2FtcHstTH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHNxdWVlemUtYmxhbmsKLUBzYW1wey1zfSBpbiBAY29kZXtjYXR9LgotCi1AaXRlbSBzdGFydC1kZWxldGUKLUBzYW1wey13fSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHN0YXJ0LWluc2VydAotQHNhbXB7LXl9IGluIEBjb2Rle3dkaWZmfS4KLQotQGl0ZW0gc3RhcnRpbmctZmlsZQotVXNlZCBpbiBAY29kZXt0YXJ9IGFuZCBAY29kZXtkaWZmfSB0byBzcGVjaWZ5IHdoaWNoIGZpbGUgd2l0aGluCi1hIGRpcmVjdG9yeSB0byBzdGFydCBwcm9jZXNzaW5nIHdpdGguCi0KLUBpdGVtIHN0YXRpc3RpY3MKLUBzYW1wey1zfSBpbiBAY29kZXt3ZGlmZn0uCi0KLUBpdGVtIHN0ZGluLWZpbGUtbGlzdAotQHNhbXB7LVN9IGluIEBjb2Rle3NoYXJ9LgotCi1AaXRlbSBzdG9wCi1Ac2FtcHstU30gaW4gTWFrZS4KLQotQGl0ZW0gc3RyaWN0Ci1Ac2FtcHstc30gaW4gQGNvZGV7cmVjb2RlfS4KLQotQGl0ZW0gc3RyaXAKLUBzYW1wey1zfSBpbiBAY29kZXtpbnN0YWxsfS4KLQotQGl0ZW0gc3RyaXAtYWxsCi1Ac2FtcHstc30gaW4gQGNvZGV7c3RyaXB9LgotCi1AaXRlbSBzdHJpcC1kZWJ1ZwotQHNhbXB7LVN9IGluIEBjb2Rle3N0cmlwfS4KLQotQGl0ZW0gc3VibWl0dGVyCi1Ac2FtcHstc30gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHN1ZmZpeAotQHNhbXB7LVN9IGluIEBjb2Rle2NwfSwgQGNvZGV7bG59LCBAY29kZXttdn0uCi0KLUBpdGVtIHN1ZmZpeC1mb3JtYXQKLUBzYW1wey1ifSBpbiBAY29kZXtjc3BsaXR9LgotCi1AaXRlbSBzdW0KLUBzYW1wey1zfSBpbiBAY29kZXtncHJvZn0uCi0KLUBpdGVtIHN1bW1hcml6ZQotQHNhbXB7LXN9IGluIEBjb2Rle2R1fS4KLQotQGl0ZW0gc3ltYm9saWMKLUBzYW1wey1zfSBpbiBAY29kZXtsbn0uCi0KLUBpdGVtIHN5bWJvbHMKLVVzZWQgaW4gR0RCIGFuZCBAY29kZXtvYmpkdW1wfS4KLQotQGl0ZW0gc3luY2xpbmVzCi1Ac2FtcHstc30gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSBzeXNuYW1lCi1Ac2FtcHstc30gaW4gQGNvZGV7dW5hbWV9LgotCi1AaXRlbSB0YWJzCi1Ac2FtcHstdH0gaW4gQGNvZGV7ZXhwYW5kfSBhbmQgQGNvZGV7dW5leHBhbmR9LgotCi1AaXRlbSB0YWJzaXplCi1Ac2FtcHstVH0gaW4gQGNvZGV7bHN9LgotCi1AaXRlbSB0ZXJtaW5hbAotQHNhbXB7LVR9IGluIEBjb2Rle3RwdXR9IGFuZCBAY29kZXt1bH0uCi1Ac2FtcHstdH0gaW4gQGNvZGV7d2RpZmZ9LgotCi1AaXRlbSB0ZXh0Ci1Ac2FtcHstYX0gaW4gQGNvZGV7ZGlmZn0uCi0KLUBpdGVtIHRleHQtZmlsZXMKLUBzYW1wey1UfSBpbiBAY29kZXtzaGFyfS4KLQotQGl0ZW0gdGltZQotVXNlZCBpbiBAY29kZXtsc30gYW5kIEBjb2Rle3RvdWNofS4KLQotQGl0ZW0gdG8tc3Rkb3V0Ci1Ac2FtcHstT30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdG90YWwKLUBzYW1wey1jfSBpbiBAY29kZXtkdX0uCi0KLUBpdGVtIHRvdWNoCi1Ac2FtcHstdH0gaW4gTWFrZSwgQGNvZGV7cmFubGlifSwgYW5kIEBjb2Rle3JlY29kZX0uCi0KLUBpdGVtIHRyYWNlCi1Ac2FtcHstdH0gaW4gQGNvZGV7bTR9LgotCi1AaXRlbSB0cmFkaXRpb25hbAotQHNhbXB7LXR9IGluIEBjb2Rle2hlbGxvfTsKLUBzYW1wey1XIHRyYWRpdGlvbmFsfSBpbiBAY29kZXtnYXdrfTsKLUBzYW1wey1HfSBpbiBAY29kZXtlZH0sIEBjb2Rle200fSwgYW5kIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHR0eQotVXNlZCBpbiBHREIuCi0KLUBpdGVtIHR5cGVkZWZzCi1Ac2FtcHstdH0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSB0eXBlZGVmcy1hbmQtYysrCi1Ac2FtcHstVH0gaW4gQGNvZGV7Y3RhZ3N9LgotCi1AaXRlbSB0eXBlc2V0LW1vZGUKLUBzYW1wey10fSBpbiBAY29kZXtwdHh9LgotCi1AaXRlbSB1bmNvbXByZXNzCi1Ac2FtcHsten0gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdW5jb25kaXRpb25hbAotQHNhbXB7LXV9IGluIEBjb2Rle2NwaW99LgotCi1AaXRlbSB1bmRlZmluZQotQHNhbXB7LVV9IGluIEBjb2Rle200fS4KLQotQGl0ZW0gdW5kZWZpbmVkLW9ubHkKLUBzYW1wey11fSBpbiBAY29kZXtubX0uCi0KLUBpdGVtIHVwZGF0ZQotQHNhbXB7LXV9IGluIEBjb2Rle2NwfSwgQGNvZGV7Y3RhZ3N9LCBAY29kZXttdn0sIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHVzYWdlCi1Vc2VkIGluIEBjb2Rle2dhd2t9OyBzYW1lIGFzIEBzYW1wey0taGVscH0uCi0KLUBpdGVtIHV1ZW5jb2RlCi1Ac2FtcHstQn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHZhbmlsbGEtb3BlcmF0aW9uCi1Ac2FtcHstVn0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHZlcmJvc2UKLVByaW50IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgcHJvZ3Jlc3MuICBNYW55IHByb2dyYW1zIHN1cHBvcnQgdGhpcy4KLQotQGl0ZW0gdmVyaWZ5Ci1Ac2FtcHstV30gaW4gQGNvZGV7dGFyfS4KLQotQGl0ZW0gdmVyc2lvbgotUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyLgotCi1AaXRlbSB2ZXJzaW9uLWNvbnRyb2wKLUBzYW1wey1WfSBpbiBAY29kZXtjcH0sIEBjb2Rle2xufSwgQGNvZGV7bXZ9LgotCi1AaXRlbSB2Z3JpbmQKLUBzYW1wey12fSBpbiBAY29kZXtjdGFnc30uCi0KLUBpdGVtIHZvbHVtZQotQHNhbXB7LVZ9IGluIEBjb2Rle3Rhcn0uCi0KLUBpdGVtIHdoYXQtaWYKLUBzYW1wey1XfSBpbiBNYWtlLgotCi1AaXRlbSB3aG9sZS1zaXplLWxpbWl0Ci1Ac2FtcHstbH0gaW4gQGNvZGV7c2hhcn0uCi0KLUBpdGVtIHdpZHRoCi1Ac2FtcHstd30gaW4gQGNvZGV7bHN9IGFuZCBAY29kZXtwdHh9LgotCi1AaXRlbSB3b3JkLXJlZ2V4cAotQHNhbXB7LVd9IGluIEBjb2Rle3B0eH0uCi0KLUBpdGVtIHdyaXRhYmxlCi1Ac2FtcHstVH0gaW4gQGNvZGV7d2hvfS4KLQotQGl0ZW0gemVyb3MKLUBzYW1wey16fSBpbiBAY29kZXtncHJvZn0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIE1lbW9yeSBVc2FnZQotQHNlY3Rpb24gTWVtb3J5IFVzYWdlCi0KLUlmIGl0IHR5cGljYWxseSB1c2VzIGp1c3QgYSBmZXcgbWVnIG9mIG1lbW9yeSwgZG9uJ3QgYm90aGVyIG1ha2luZyBhbnkKLWVmZm9ydCB0byByZWR1Y2UgbWVtb3J5IHVzYWdlLiAgRm9yIGV4YW1wbGUsIGlmIGl0IGlzIGltcHJhY3RpY2FsIGZvcgotb3RoZXIgcmVhc29ucyB0byBvcGVyYXRlIG9uIGZpbGVzIG1vcmUgdGhhbiBhIGZldyBtZWcgbG9uZywgaXQgaXMKLXJlYXNvbmFibGUgdG8gcmVhZCBlbnRpcmUgaW5wdXQgZmlsZXMgaW50byBjb3JlIHRvIG9wZXJhdGUgb24gdGhlbS4KLQotSG93ZXZlciwgZm9yIHByb2dyYW1zIHN1Y2ggYXMgQGNvZGV7Y2F0fSBvciBAY29kZXt0YWlsfSwgdGhhdCBjYW4KLXVzZWZ1bGx5IG9wZXJhdGUgb24gdmVyeSBsYXJnZSBmaWxlcywgaXQgaXMgaW1wb3J0YW50IHRvIGF2b2lkIHVzaW5nIGEKLXRlY2huaXF1ZSB0aGF0IHdvdWxkIGFydGlmaWNpYWxseSBsaW1pdCB0aGUgc2l6ZSBvZiBmaWxlcyBpdCBjYW4gaGFuZGxlLgotSWYgYSBwcm9ncmFtIHdvcmtzIGJ5IGxpbmVzIGFuZCBjb3VsZCBiZSBhcHBsaWVkIHRvIGFyYml0cmFyeQotdXNlci1zdXBwbGllZCBpbnB1dCBmaWxlcywgaXQgc2hvdWxkIGtlZXAgb25seSBhIGxpbmUgaW4gbWVtb3J5LCBiZWNhdXNlCi10aGlzIGlzIG5vdCB2ZXJ5IGhhcmQgYW5kIHVzZXJzIHdpbGwgd2FudCB0byBiZSBhYmxlIHRvIG9wZXJhdGUgb24gaW5wdXQKLWZpbGVzIHRoYXQgYXJlIGJpZ2dlciB0aGFuIHdpbGwgZml0IGluIGNvcmUgYWxsIGF0IG9uY2UuCi0KLUlmIHlvdXIgcHJvZ3JhbSBjcmVhdGVzIGNvbXBsaWNhdGVkIGRhdGEgc3RydWN0dXJlcywganVzdCBtYWtlIHRoZW0gaW4KLWNvcmUgYW5kIGdpdmUgYSBmYXRhbCBlcnJvciBpZiBAY29kZXttYWxsb2N9IHJldHVybnMgemVyby4KLQotQG5vZGUgV3JpdGluZyBDCi1AY2hhcHRlciBNYWtpbmcgVGhlIEJlc3QgVXNlIG9mIEMKLQotVGhpcyBAdmFsdWV7Q0hBUFRFUn0gcHJvdmlkZXMgYWR2aWNlIG9uIGhvdyBiZXN0IHRvIHVzZSB0aGUgQyBsYW5ndWFnZQotd2hlbiB3cml0aW5nIEdOVSBzb2Z0d2FyZS4KLQotQG1lbnUKLSogRm9ybWF0dGluZzo6ICAgICAgICAgICAgICAgICAgRm9ybWF0dGluZyBZb3VyIFNvdXJjZSBDb2RlCi0qIENvbW1lbnRzOjogICAgICAgICAgICAgICAgICAgIENvbW1lbnRpbmcgWW91ciBXb3JrCi0qIFN5bnRhY3RpYyBDb252ZW50aW9uczo6ICAgICAgIENsZWFuIFVzZSBvZiBDIENvbnN0cnVjdHMKLSogTmFtZXM6OiAgICAgICAgICAgICAgICAgICAgICAgTmFtaW5nIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCi0qIFN5c3RlbSBQb3J0YWJpbGl0eTo6ICAgICAgICAgIFBvcnRhYmlsaXR5IGJldHdlZW4gZGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zCi0qIENQVSBQb3J0YWJpbGl0eTo6ICAgICAgICAgICAgIFN1cHBvcnRpbmcgdGhlIHJhbmdlIG9mIENQVSB0eXBlcwotKiBTeXN0ZW0gRnVuY3Rpb25zOjogICAgICAgICAgICBQb3J0YWJpbGl0eSBhbmQgYGBzdGFuZGFyZCcnIGxpYnJhcnkgZnVuY3Rpb25zCi0qIEludGVybmF0aW9uYWxpemF0aW9uOjogICAgICAgIFRlY2huaXF1ZXMgZm9yIGludGVybmF0aW9uYWxpemF0aW9uCi0qIE1tYXA6OiAgICAgICAgICAgICAgICAgICAgICAgIEhvdyB5b3UgY2FuIHNhZmVseSB1c2UgQGNvZGV7bW1hcH0uCi1AZW5kIG1lbnUKLQotQG5vZGUgRm9ybWF0dGluZwotQHNlY3Rpb24gRm9ybWF0dGluZyBZb3VyIFNvdXJjZSBDb2RlCi0KLUl0IGlzIGltcG9ydGFudCB0byBwdXQgdGhlIG9wZW4tYnJhY2UgdGhhdCBzdGFydHMgdGhlIGJvZHkgb2YgYSBDCi1mdW5jdGlvbiBpbiBjb2x1bW4gemVybywgYW5kIGF2b2lkIHB1dHRpbmcgYW55IG90aGVyIG9wZW4tYnJhY2Ugb3IKLW9wZW4tcGFyZW50aGVzaXMgb3Igb3Blbi1icmFja2V0IGluIGNvbHVtbiB6ZXJvLiAgU2V2ZXJhbCB0b29scyBsb29rCi1mb3Igb3Blbi1icmFjZXMgaW4gY29sdW1uIHplcm8gdG8gZmluZCB0aGUgYmVnaW5uaW5ncyBvZiBDIGZ1bmN0aW9ucy4KLVRoZXNlIHRvb2xzIHdpbGwgbm90IHdvcmsgb24gY29kZSBub3QgZm9ybWF0dGVkIHRoYXQgd2F5LgotCi1JdCBpcyBhbHNvIGltcG9ydGFudCBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMgdG8gc3RhcnQgdGhlIG5hbWUgb2YgdGhlCi1mdW5jdGlvbiBpbiBjb2x1bW4gemVyby4gIFRoaXMgaGVscHMgcGVvcGxlIHRvIHNlYXJjaCBmb3IgZnVuY3Rpb24KLWRlZmluaXRpb25zLCBhbmQgbWF5IGFsc28gaGVscCBjZXJ0YWluIHRvb2xzIHJlY29nbml6ZSB0aGVtLiAgVGh1cywKLXRoZSBwcm9wZXIgZm9ybWF0IGlzIHRoaXM6Ci0KLUBleGFtcGxlCi1zdGF0aWMgY2hhciAqCi1jb25jYXQgKHMxLCBzMikgICAgICAgIC8qIE5hbWUgc3RhcnRzIGluIGNvbHVtbiB6ZXJvIGhlcmUgKi8KLSAgICAgY2hhciAqczEsICpzMjsKLUB7ICAgICAgICAgICAgICAgICAgICAgLyogT3BlbiBicmFjZSBpbiBjb2x1bW4gemVybyBoZXJlICovCi0gIEBkb3Rze30KLUB9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1vciwgaWYgeW91IHdhbnQgdG8gdXNlIEBzY3thbnNpfSBDLCBmb3JtYXQgdGhlIGRlZmluaXRpb24gbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotc3RhdGljIGNoYXIgKgotY29uY2F0IChjaGFyICpzMSwgY2hhciAqczIpCi1AewotICBAZG90c3t9Ci1AfQotQGVuZCBleGFtcGxlCi0KLUluIEBzY3thbnNpfSBDLCBpZiB0aGUgYXJndW1lbnRzIGRvbid0IGZpdCBuaWNlbHkgb24gb25lIGxpbmUsCi1zcGxpdCBpdCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1pbnQKLWxvdHNfb2ZfYXJncyAoaW50IGFuX2ludGVnZXIsIGxvbmcgYV9sb25nLCBzaG9ydCBhX3Nob3J0LAotICAgICAgICAgICAgICBkb3VibGUgYV9kb3VibGUsIGZsb2F0IGFfZmxvYXQpCi1AZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotRm9yIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgd2UgcHJlZmVyIGNvZGUgZm9ybWF0dGVkIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmICh4IDwgZm9vICh5LCB6KSkKLSAgaGFoYSA9IGJhcls0XSArIDU7Ci1lbHNlCi0gIEB7Ci0gICAgd2hpbGUgKHopCi0gICAgICBAewotICAgICAgICBoYWhhICs9IGZvbyAoeiwgeik7Ci0gICAgICAgIHotLTsKLSAgICAgIEB9Ci0gICAgcmV0dXJuICsreCArIGJhciAoKTsKLSAgQH0KLUBlbmQgZXhhbXBsZQotCi1XZSBmaW5kIGl0IGVhc2llciB0byByZWFkIGEgcHJvZ3JhbSB3aGVuIGl0IGhhcyBzcGFjZXMgYmVmb3JlIHRoZQotb3Blbi1wYXJlbnRoZXNlcyBhbmQgYWZ0ZXIgdGhlIGNvbW1hcy4gIEVzcGVjaWFsbHkgYWZ0ZXIgdGhlIGNvbW1hcy4KLQotV2hlbiB5b3Ugc3BsaXQgYW4gZXhwcmVzc2lvbiBpbnRvIG11bHRpcGxlIGxpbmVzLCBzcGxpdCBpdAotYmVmb3JlIGFuIG9wZXJhdG9yLCBub3QgYWZ0ZXIgb25lLiAgSGVyZSBpcyB0aGUgcmlnaHQgd2F5OgotCi1AZXhhbXBsZQotaWYgKGZvb190aGlzX2lzX2xvbmcgJiYgYmFyID4gd2luICh4LCB5LCB6KQotICAgICYmIHJlbWFpbmluZ19jb25kaXRpb24pCi1AZW5kIGV4YW1wbGUKLQotVHJ5IHRvIGF2b2lkIGhhdmluZyB0d28gb3BlcmF0b3JzIG9mIGRpZmZlcmVudCBwcmVjZWRlbmNlIGF0IHRoZSBzYW1lCi1sZXZlbCBvZiBpbmRlbnRhdGlvbi4gIEZvciBleGFtcGxlLCBkb24ndCB3cml0ZSB0aGlzOgotCi1AZXhhbXBsZQotbW9kZSA9IChpbm1vZGVbal0gPT0gVk9JRG1vZGUKLSAgICAgICAgfHwgR0VUX01PREVfU0laRSAob3V0bW9kZVtqXSkgPiBHRVRfTU9ERV9TSVpFIChpbm1vZGVbal0pCi0gICAgICAgID8gb3V0bW9kZVtqXSA6IGlubW9kZVtqXSk7Ci1AZW5kIGV4YW1wbGUKLQotSW5zdGVhZCwgdXNlIGV4dHJhIHBhcmVudGhlc2VzIHNvIHRoYXQgdGhlIGluZGVudGF0aW9uIHNob3dzIHRoZSBuZXN0aW5nOgotCi1AZXhhbXBsZQotbW9kZSA9ICgoaW5tb2RlW2pdID09IFZPSURtb2RlCi0gICAgICAgICB8fCAoR0VUX01PREVfU0laRSAob3V0bW9kZVtqXSkgPiBHRVRfTU9ERV9TSVpFIChpbm1vZGVbal0pKSkKLSAgICAgICAgPyBvdXRtb2RlW2pdIDogaW5tb2RlW2pdKTsKLUBlbmQgZXhhbXBsZQotCi1JbnNlcnQgZXh0cmEgcGFyZW50aGVzZXMgc28gdGhhdCBFbWFjcyB3aWxsIGluZGVudCB0aGUgY29kZSBwcm9wZXJseS4KLUZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGluZGVudGF0aW9uIGxvb2tzIG5pY2UgaWYgeW91IGRvIGl0IGJ5IGhhbmQsCi1idXQgRW1hY3Mgd291bGQgbWVzcyBpdCB1cDoKLQotQGV4YW1wbGUKLXYgPSBydXAtPnJ1X3V0aW1lLnR2X3NlYyoxMDAwICsgcnVwLT5ydV91dGltZS50dl91c2VjLzEwMDAKLSAgICArIHJ1cC0+cnVfc3RpbWUudHZfc2VjKjEwMDAgKyBydXAtPnJ1X3N0aW1lLnR2X3VzZWMvMTAwMDsKLUBlbmQgZXhhbXBsZQotCi1CdXQgYWRkaW5nIGEgc2V0IG9mIHBhcmVudGhlc2VzIHNvbHZlcyB0aGUgcHJvYmxlbToKLQotQGV4YW1wbGUKLXYgPSAocnVwLT5ydV91dGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfdXRpbWUudHZfdXNlYy8xMDAwCi0gICAgICsgcnVwLT5ydV9zdGltZS50dl9zZWMqMTAwMCArIHJ1cC0+cnVfc3RpbWUudHZfdXNlYy8xMDAwKTsKLUBlbmQgZXhhbXBsZQotCi1Gb3JtYXQgZG8td2hpbGUgc3RhdGVtZW50cyBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1kbwotICBAewotICAgIGEgPSBmb28gKGEpOwotICBAfQotd2hpbGUgKGEgPiAwKTsKLUBlbmQgZXhhbXBsZQotCi1QbGVhc2UgdXNlIGZvcm1mZWVkIGNoYXJhY3RlcnMgKGNvbnRyb2wtTCkgdG8gZGl2aWRlIHRoZSBwcm9ncmFtIGludG8KLXBhZ2VzIGF0IGxvZ2ljYWwgcGxhY2VzIChidXQgbm90IHdpdGhpbiBhIGZ1bmN0aW9uKS4gIEl0IGRvZXMgbm90IG1hdHRlcgotanVzdCBob3cgbG9uZyB0aGUgcGFnZXMgYXJlLCBzaW5jZSB0aGV5IGRvIG5vdCBoYXZlIHRvIGZpdCBvbiBhIHByaW50ZWQKLXBhZ2UuICBUaGUgZm9ybWZlZWRzIHNob3VsZCBhcHBlYXIgYWxvbmUgb24gbGluZXMgYnkgdGhlbXNlbHZlcy4KLQotCi1Abm9kZSBDb21tZW50cwotQHNlY3Rpb24gQ29tbWVudGluZyBZb3VyIFdvcmsKLQotRXZlcnkgcHJvZ3JhbSBzaG91bGQgc3RhcnQgd2l0aCBhIGNvbW1lbnQgc2F5aW5nIGJyaWVmbHkgd2hhdCBpdCBpcyBmb3IuCi1FeGFtcGxlOiBAc2FtcHtmbXQgLSBmaWx0ZXIgZm9yIHNpbXBsZSBmaWxsaW5nIG9mIHRleHR9LgotCi1QbGVhc2Ugd3JpdGUgdGhlIGNvbW1lbnRzIGluIGEgR05VIHByb2dyYW0gaW4gRW5nbGlzaCwgYmVjYXVzZSBFbmdsaXNoCi1pcyB0aGUgb25lIGxhbmd1YWdlIHRoYXQgbmVhcmx5IGFsbCBwcm9ncmFtbWVycyBpbiBhbGwgY291bnRyaWVzIGNhbgotcmVhZC4gIElmIHlvdSBkbyBub3Qgd3JpdGUgRW5nbGlzaCB3ZWxsLCBwbGVhc2Ugd3JpdGUgY29tbWVudHMgaW4KLUVuZ2xpc2ggYXMgd2VsbCBhcyB5b3UgY2FuLCB0aGVuIGFzayBvdGhlciBwZW9wbGUgdG8gaGVscCByZXdyaXRlIHRoZW0uCi1JZiB5b3UgY2FuJ3Qgd3JpdGUgY29tbWVudHMgaW4gRW5nbGlzaCwgcGxlYXNlIGZpbmQgc29tZW9uZSB0byB3b3JrIHdpdGgKLXlvdSBhbmQgdHJhbnNsYXRlIHlvdXIgY29tbWVudHMgaW50byBFbmdsaXNoLgotCi1QbGVhc2UgcHV0IGEgY29tbWVudCBvbiBlYWNoIGZ1bmN0aW9uIHNheWluZyB3aGF0IHRoZSBmdW5jdGlvbiBkb2VzLAotd2hhdCBzb3J0cyBvZiBhcmd1bWVudHMgaXQgZ2V0cywgYW5kIHdoYXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZgotYXJndW1lbnRzIG1lYW4gYW5kIGFyZSB1c2VkIGZvci4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZHVwbGljYXRlIGluCi13b3JkcyB0aGUgbWVhbmluZyBvZiB0aGUgQyBhcmd1bWVudCBkZWNsYXJhdGlvbnMsIGlmIGEgQyB0eXBlIGlzIGJlaW5nCi11c2VkIGluIGl0cyBjdXN0b21hcnkgZmFzaGlvbi4gIElmIHRoZXJlIGlzIGFueXRoaW5nIG5vbnN0YW5kYXJkIGFib3V0Ci1pdHMgdXNlIChzdWNoIGFzIGFuIGFyZ3VtZW50IG9mIHR5cGUgQGNvZGV7Y2hhciAqfSB3aGljaCBpcyByZWFsbHkgdGhlCi1hZGRyZXNzIG9mIHRoZSBzZWNvbmQgY2hhcmFjdGVyIG9mIGEgc3RyaW5nLCBub3QgdGhlIGZpcnN0KSwgb3IgYW55Ci1wb3NzaWJsZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3Qgd29yayB0aGUgd2F5IG9uZSB3b3VsZCBleHBlY3QgKHN1Y2ggYXMsCi10aGF0IHN0cmluZ3MgY29udGFpbmluZyBuZXdsaW5lcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gd29yayksIGJlIHN1cmUKLXRvIHNheSBzby4KLQotQWxzbyBleHBsYWluIHRoZSBzaWduaWZpY2FuY2Ugb2YgdGhlIHJldHVybiB2YWx1ZSwgaWYgdGhlcmUgaXMgb25lLgotCi1QbGVhc2UgcHV0IHR3byBzcGFjZXMgYWZ0ZXIgdGhlIGVuZCBvZiBhIHNlbnRlbmNlIGluIHlvdXIgY29tbWVudHMsIHNvCi10aGF0IHRoZSBFbWFjcyBzZW50ZW5jZSBjb21tYW5kcyB3aWxsIHdvcmsuICBBbHNvLCBwbGVhc2Ugd3JpdGUKLWNvbXBsZXRlIHNlbnRlbmNlcyBhbmQgY2FwaXRhbGl6ZSB0aGUgZmlyc3Qgd29yZC4gIElmIGEgbG93ZXItY2FzZQotaWRlbnRpZmllciBjb21lcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgc2VudGVuY2UsIGRvbid0IGNhcGl0YWxpemUgaXQhCi1DaGFuZ2luZyB0aGUgc3BlbGxpbmcgbWFrZXMgaXQgYSBkaWZmZXJlbnQgaWRlbnRpZmllci4gIElmIHlvdSBkb24ndAotbGlrZSBzdGFydGluZyBhIHNlbnRlbmNlIHdpdGggYSBsb3dlciBjYXNlIGxldHRlciwgd3JpdGUgdGhlIHNlbnRlbmNlCi1kaWZmZXJlbnRseSAoZS5nLiwgYGBUaGUgaWRlbnRpZmllciBsb3dlci1jYXNlIGlzIEBkb3Rze30nJykuCi0KLVRoZSBjb21tZW50IG9uIGEgZnVuY3Rpb24gaXMgbXVjaCBjbGVhcmVyIGlmIHlvdSB1c2UgdGhlIGFyZ3VtZW50Ci1uYW1lcyB0byBzcGVhayBhYm91dCB0aGUgYXJndW1lbnQgdmFsdWVzLiAgVGhlIHZhcmlhYmxlIG5hbWUgaXRzZWxmCi1zaG91bGQgYmUgbG93ZXIgY2FzZSwgYnV0IHdyaXRlIGl0IGluIHVwcGVyIGNhc2Ugd2hlbiB5b3UgYXJlIHNwZWFraW5nCi1hYm91dCB0aGUgdmFsdWUgcmF0aGVyIHRoYW4gdGhlIHZhcmlhYmxlIGl0c2VsZi4gIFRodXMsIGBgdGhlIGlub2RlCi1udW1iZXIgTk9ERV9OVU0nJyByYXRoZXIgdGhhbiBgYGFuIGlub2RlJycuCi0KLVRoZXJlIGlzIHVzdWFsbHkgbm8gcHVycG9zZSBpbiByZXN0YXRpbmcgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluCi10aGUgY29tbWVudCBiZWZvcmUgaXQsIGJlY2F1c2UgdGhlIHJlYWRlciBjYW4gc2VlIHRoYXQgZm9yIGhpbXNlbGYuCi1UaGVyZSBtaWdodCBiZSBhbiBleGNlcHRpb24gd2hlbiB0aGUgY29tbWVudCBpcyBzbyBsb25nIHRoYXQgdGhlIGZ1bmN0aW9uCi1pdHNlbGYgd291bGQgYmUgb2ZmIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4KLQotVGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBvbiBlYWNoIHN0YXRpYyB2YXJpYWJsZSBhcyB3ZWxsLCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi0vKiBOb256ZXJvIG1lYW5zIHRydW5jYXRlIGxpbmVzIGluIHRoZSBkaXNwbGF5OwotICAgemVybyBtZWFucyBjb250aW51ZSB0aGVtLiAgKi8KLWludCB0cnVuY2F0ZV9saW5lczsKLUBlbmQgZXhhbXBsZQotCi1FdmVyeSBAc2FtcHsjZW5kaWZ9IHNob3VsZCBoYXZlIGEgY29tbWVudCwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHNob3J0Ci1jb25kaXRpb25hbHMgKGp1c3QgYSBmZXcgbGluZXMpIHRoYXQgYXJlIG5vdCBuZXN0ZWQuICBUaGUgY29tbWVudCBzaG91bGQKLXN0YXRlIHRoZSBjb25kaXRpb24gb2YgdGhlIGNvbmRpdGlvbmFsIHRoYXQgaXMgZW5kaW5nLCBAZW1waHtpbmNsdWRpbmcKLWl0cyBzZW5zZX0uICBAc2FtcHsjZWxzZX0gc2hvdWxkIGhhdmUgYSBjb21tZW50IGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbgotQGVtcGh7YW5kIHNlbnNlfSBvZiB0aGUgY29kZSB0aGF0IGZvbGxvd3MuICBGb3IgZXhhbXBsZToKLQotQGV4YW1wbGUKLUBncm91cAotI2lmZGVmIGZvbwotICBAZG90c3t9Ci0jZWxzZSAvKiBub3QgZm9vICovCi0gIEBkb3Rze30KLSNlbmRpZiAvKiBub3QgZm9vICovCi1AZW5kIGdyb3VwCi1AZ3JvdXAKLSNpZmRlZiBmb28KLSAgQGRvdHN7fQotI2VuZGlmIC8qIGZvbyAqLwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYnV0LCBieSBjb250cmFzdCwgd3JpdGUgdGhlIGNvbW1lbnRzIHRoaXMgd2F5IGZvciBhIEBzYW1weyNpZm5kZWZ9OgotCi1AZXhhbXBsZQotQGdyb3VwCi0jaWZuZGVmIGZvbwotICBAZG90c3t9Ci0jZWxzZSAvKiBmb28gKi8KLSAgQGRvdHN7fQotI2VuZGlmIC8qIGZvbyAqLwotQGVuZCBncm91cAotQGdyb3VwCi0jaWZuZGVmIGZvbwotICBAZG90c3t9Ci0jZW5kaWYgLyogbm90IGZvbyAqLwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2RlIFN5bnRhY3RpYyBDb252ZW50aW9ucwotQHNlY3Rpb24gQ2xlYW4gVXNlIG9mIEMgQ29uc3RydWN0cwotCi1QbGVhc2UgZXhwbGljaXRseSBkZWNsYXJlIGFsbCBhcmd1bWVudHMgdG8gZnVuY3Rpb25zLgotRG9uJ3Qgb21pdCB0aGVtIGp1c3QgYmVjYXVzZSB0aGV5IGFyZSBAY29kZXtpbnR9cy4KLQotRGVjbGFyYXRpb25zIG9mIGV4dGVybmFsIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb25zIHRvIGFwcGVhciBsYXRlciBpbiB0aGUKLXNvdXJjZSBmaWxlIHNob3VsZCBhbGwgZ28gaW4gb25lIHBsYWNlIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZQotKHNvbWV3aGVyZSBiZWZvcmUgdGhlIGZpcnN0IGZ1bmN0aW9uIGRlZmluaXRpb24gaW4gdGhlIGZpbGUpLCBvciBlbHNlCi1zaG91bGQgZ28gaW4gYSBoZWFkZXIgZmlsZS4gIERvbid0IHB1dCBAY29kZXtleHRlcm59IGRlY2xhcmF0aW9ucyBpbnNpZGUKLWZ1bmN0aW9ucy4KLQotSXQgdXNlZCB0byBiZSBjb21tb24gcHJhY3RpY2UgdG8gdXNlIHRoZSBzYW1lIGxvY2FsIHZhcmlhYmxlcyAod2l0aAotbmFtZXMgbGlrZSBAY29kZXt0ZW19KSBvdmVyIGFuZCBvdmVyIGZvciBkaWZmZXJlbnQgdmFsdWVzIHdpdGhpbiBvbmUKLWZ1bmN0aW9uLiAgSW5zdGVhZCBvZiBkb2luZyB0aGlzLCBpdCBpcyBiZXR0ZXIgZGVjbGFyZSBhIHNlcGFyYXRlIGxvY2FsCi12YXJpYWJsZSBmb3IgZWFjaCBkaXN0aW5jdCBwdXJwb3NlLCBhbmQgZ2l2ZSBpdCBhIG5hbWUgd2hpY2ggaXMKLW1lYW5pbmdmdWwuICBUaGlzIG5vdCBvbmx5IG1ha2VzIHByb2dyYW1zIGVhc2llciB0byB1bmRlcnN0YW5kLCBpdCBhbHNvCi1mYWNpbGl0YXRlcyBvcHRpbWl6YXRpb24gYnkgZ29vZCBjb21waWxlcnMuICBZb3UgY2FuIGFsc28gbW92ZSB0aGUKLWRlY2xhcmF0aW9uIG9mIGVhY2ggbG9jYWwgdmFyaWFibGUgaW50byB0aGUgc21hbGxlc3Qgc2NvcGUgdGhhdCBpbmNsdWRlcwotYWxsIGl0cyB1c2VzLiAgVGhpcyBtYWtlcyB0aGUgcHJvZ3JhbSBldmVuIGNsZWFuZXIuCi0KLURvbid0IHVzZSBsb2NhbCB2YXJpYWJsZXMgb3IgcGFyYW1ldGVycyB0aGF0IHNoYWRvdyBnbG9iYWwgaWRlbnRpZmllcnMuCi0KLURvbid0IGRlY2xhcmUgbXVsdGlwbGUgdmFyaWFibGVzIGluIG9uZSBkZWNsYXJhdGlvbiB0aGF0IHNwYW5zIGxpbmVzLgotU3RhcnQgYSBuZXcgZGVjbGFyYXRpb24gb24gZWFjaCBsaW5lLCBpbnN0ZWFkLiAgRm9yIGV4YW1wbGUsIGluc3RlYWQKLW9mIHRoaXM6Ci0KLUBleGFtcGxlCi1AZ3JvdXAKLWludCAgICBmb28sCi0gICAgICAgYmFyOwotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd3JpdGUgZWl0aGVyIHRoaXM6Ci0KLUBleGFtcGxlCi1pbnQgZm9vLCBiYXI7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1vciB0aGlzOgotCi1AZXhhbXBsZQotaW50IGZvbzsKLWludCBiYXI7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci0oSWYgdGhleSBhcmUgZ2xvYmFsIHZhcmlhYmxlcywgZWFjaCBzaG91bGQgaGF2ZSBhIGNvbW1lbnQgcHJlY2VkaW5nIGl0Ci1hbnl3YXkuKQotCi1XaGVuIHlvdSBoYXZlIGFuIEBjb2Rle2lmfS1AY29kZXtlbHNlfSBzdGF0ZW1lbnQgbmVzdGVkIGluIGFub3RoZXIKLUBjb2Rle2lmfSBzdGF0ZW1lbnQsIGFsd2F5cyBwdXQgYnJhY2VzIGFyb3VuZCB0aGUgQGNvZGV7aWZ9LUBjb2Rle2Vsc2V9LgotVGh1cywgbmV2ZXIgd3JpdGUgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKGZvbykKLSAgaWYgKGJhcikKLSAgICB3aW4gKCk7Ci0gIGVsc2UKLSAgICBsb3NlICgpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotYWx3YXlzIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIEB7Ci0gICAgaWYgKGJhcikKLSAgICAgIHdpbiAoKTsKLSAgICBlbHNlCi0gICAgICBsb3NlICgpOwotICBAfQotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSBoYXZlIGFuIEBjb2Rle2lmfSBzdGF0ZW1lbnQgbmVzdGVkIGluc2lkZSBvZiBhbiBAY29kZXtlbHNlfQotc3RhdGVtZW50LCBlaXRoZXIgd3JpdGUgQGNvZGV7ZWxzZSBpZn0gb24gb25lIGxpbmUsIGxpa2UgdGhpcywKLQotQGV4YW1wbGUKLWlmIChmb28pCi0gIEBkb3Rze30KLWVsc2UgaWYgKGJhcikKLSAgQGRvdHN7fQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2l0aCBpdHMgQGNvZGV7dGhlbn0tcGFydCBpbmRlbnRlZCBsaWtlIHRoZSBwcmVjZWRpbmcgQGNvZGV7dGhlbn0tcGFydCwKLW9yIHdyaXRlIHRoZSBuZXN0ZWQgQGNvZGV7aWZ9IHdpdGhpbiBicmFjZXMgbGlrZSB0aGlzOgotCi1AZXhhbXBsZQotaWYgKGZvbykKLSAgQGRvdHN7fQotZWxzZQotICBAewotICAgIGlmIChiYXIpCi0gICAgICBAZG90c3t9Ci0gIEB9Ci1AZW5kIGV4YW1wbGUKLQotRG9uJ3QgZGVjbGFyZSBib3RoIGEgc3RydWN0dXJlIHRhZyBhbmQgdmFyaWFibGVzIG9yIHR5cGVkZWZzIGluIHRoZQotc2FtZSBkZWNsYXJhdGlvbi4gIEluc3RlYWQsIGRlY2xhcmUgdGhlIHN0cnVjdHVyZSB0YWcgc2VwYXJhdGVseQotYW5kIHRoZW4gdXNlIGl0IHRvIGRlY2xhcmUgdGhlIHZhcmlhYmxlcyBvciB0eXBlZGVmcy4KLQotVHJ5IHRvIGF2b2lkIGFzc2lnbm1lbnRzIGluc2lkZSBAY29kZXtpZn0tY29uZGl0aW9ucy4gIEZvciBleGFtcGxlLAotZG9uJ3Qgd3JpdGUgdGhpczoKLQotQGV4YW1wbGUKLWlmICgoZm9vID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKmZvbykpID09IDApCi0gIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pbnN0ZWFkLCB3cml0ZSB0aGlzOgotCi1AZXhhbXBsZQotZm9vID0gKGNoYXIgKikgbWFsbG9jIChzaXplb2YgKmZvbyk7Ci1pZiAoZm9vID09IDApCi0gIGZhdGFsICgidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7Ci1AZW5kIGV4YW1wbGUKLQotRG9uJ3QgbWFrZSB0aGUgcHJvZ3JhbSB1Z2x5IHRvIHBsYWNhdGUgQGNvZGV7bGludH0uICBQbGVhc2UgZG9uJ3QgaW5zZXJ0IGFueQotY2FzdHMgdG8gQGNvZGV7dm9pZH0uICBaZXJvIHdpdGhvdXQgYSBjYXN0IGlzIHBlcmZlY3RseSBmaW5lIGFzIGEgbnVsbAotcG9pbnRlciBjb25zdGFudCwgZXhjZXB0IHdoZW4gY2FsbGluZyBhIHZhcmFyZ3MgZnVuY3Rpb24uCi0KLUBub2RlICBOYW1lcwotQHNlY3Rpb24gTmFtaW5nIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zCi0KLVRoZSBuYW1lcyBvZiBnbG9iYWwgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgaW4gYSBwcm9ncmFtIHNlcnZlIGFzCi1jb21tZW50cyBvZiBhIHNvcnQuICBTbyBkb24ndCBjaG9vc2UgdGVyc2UgbmFtZXMtLS1pbnN0ZWFkLCBsb29rIGZvcgotbmFtZXMgdGhhdCBnaXZlIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaWFibGUgb3IKLWZ1bmN0aW9uLiAgSW4gYSBHTlUgcHJvZ3JhbSwgbmFtZXMgc2hvdWxkIGJlIEVuZ2xpc2gsIGxpa2Ugb3RoZXIKLWNvbW1lbnRzLgotCi1Mb2NhbCB2YXJpYWJsZSBuYW1lcyBjYW4gYmUgc2hvcnRlciwgYmVjYXVzZSB0aGV5IGFyZSB1c2VkIG9ubHkgd2l0aGluCi1vbmUgY29udGV4dCwgd2hlcmUgKHByZXN1bWFibHkpIGNvbW1lbnRzIGV4cGxhaW4gdGhlaXIgcHVycG9zZS4KLQotUGxlYXNlIHVzZSB1bmRlcnNjb3JlcyB0byBzZXBhcmF0ZSB3b3JkcyBpbiBhIG5hbWUsIHNvIHRoYXQgdGhlIEVtYWNzCi13b3JkIGNvbW1hbmRzIGNhbiBiZSB1c2VmdWwgd2l0aGluIHRoZW0uICBTdGljayB0byBsb3dlciBjYXNlOyByZXNlcnZlCi11cHBlciBjYXNlIGZvciBtYWNyb3MgYW5kIEBjb2Rle2VudW19IGNvbnN0YW50cywgYW5kIGZvciBuYW1lLXByZWZpeGVzCi10aGF0IGZvbGxvdyBhIHVuaWZvcm0gY29udmVudGlvbi4KLQotRm9yIGV4YW1wbGUsIHlvdSBzaG91bGQgdXNlIG5hbWVzIGxpa2UgQGNvZGV7aWdub3JlX3NwYWNlX2NoYW5nZV9mbGFnfTsKLWRvbid0IHVzZSBuYW1lcyBsaWtlIEBjb2Rle2lDYW50UmVhZFRoaXN9LgotCi1WYXJpYWJsZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIGNvbW1hbmQtbGluZSBvcHRpb25zIGhhdmUgYmVlbgotc3BlY2lmaWVkIHNob3VsZCBiZSBuYW1lZCBhZnRlciB0aGUgbWVhbmluZyBvZiB0aGUgb3B0aW9uLCBub3QgYWZ0ZXIKLXRoZSBvcHRpb24tbGV0dGVyLiAgQSBjb21tZW50IHNob3VsZCBzdGF0ZSBib3RoIHRoZSBleGFjdCBtZWFuaW5nIG9mCi10aGUgb3B0aW9uIGFuZCBpdHMgbGV0dGVyLiAgRm9yIGV4YW1wbGUsCi0KLUBleGFtcGxlCi1AZ3JvdXAKLS8qIElnbm9yZSBjaGFuZ2VzIGluIGhvcml6b250YWwgd2hpdGVzcGFjZSAoLWIpLiAgKi8KLWludCBpZ25vcmVfc3BhY2VfY2hhbmdlX2ZsYWc7Ci1AZW5kIGdyb3VwCi1AZW5kIGV4YW1wbGUKLQotV2hlbiB5b3Ugd2FudCB0byBkZWZpbmUgbmFtZXMgd2l0aCBjb25zdGFudCBpbnRlZ2VyIHZhbHVlcywgdXNlCi1AY29kZXtlbnVtfSByYXRoZXIgdGhhbiBAc2FtcHsjZGVmaW5lfS4gIEdEQiBrbm93cyBhYm91dCBlbnVtZXJhdGlvbgotY29uc3RhbnRzLgotCi1Vc2UgZmlsZSBuYW1lcyBvZiAxNCBjaGFyYWN0ZXJzIG9yIGxlc3MsIHRvIGF2b2lkIGNyZWF0aW5nIGdyYXR1aXRvdXMKLXByb2JsZW1zIG9uIG9sZGVyIFN5c3RlbSBWIHN5c3RlbXMuICBZb3UgY2FuIHVzZSB0aGUgcHJvZ3JhbQotQGNvZGV7ZG9zY2hrfSB0byB0ZXN0IGZvciB0aGlzLiAgQGNvZGV7ZG9zY2hrfSBhbHNvIHRlc3RzIGZvciBwb3RlbnRpYWwKLW5hbWUgY29uZmxpY3RzIGlmIHRoZSBmaWxlcyB3ZXJlIGxvYWRlZCBvbnRvIGFuIE1TLURPUyBmaWxlCi1zeXN0ZW0tLS1zb21ldGhpbmcgeW91IG1heSBvciBtYXkgbm90IGNhcmUgYWJvdXQuCi0KLUBub2RlIFN5c3RlbSBQb3J0YWJpbGl0eQotQHNlY3Rpb24gUG9ydGFiaWxpdHkgYmV0d2VlbiBTeXN0ZW0gVHlwZXMKLQotSW4gdGhlIFVuaXggd29ybGQsIGBgcG9ydGFiaWxpdHknJyByZWZlcnMgdG8gcG9ydGluZyB0byBkaWZmZXJlbnQgVW5peAotdmVyc2lvbnMuICBGb3IgYSBHTlUgcHJvZ3JhbSwgdGhpcyBraW5kIG9mIHBvcnRhYmlsaXR5IGlzIGRlc2lyYWJsZSwgYnV0Ci1ub3QgcGFyYW1vdW50LgotCi1UaGUgcHJpbWFyeSBwdXJwb3NlIG9mIEdOVSBzb2Z0d2FyZSBpcyB0byBydW4gb24gdG9wIG9mIHRoZSBHTlUga2VybmVsLAotY29tcGlsZWQgd2l0aCB0aGUgR05VIEMgY29tcGlsZXIsIG9uIHZhcmlvdXMgdHlwZXMgb2YgQHNje2NwdX0uICBUaGUKLWFtb3VudCBhbmQga2luZHMgb2YgdmFyaWF0aW9uIGFtb25nIEdOVSBzeXN0ZW1zIG9uIGRpZmZlcmVudCBAc2N7Y3B1fXMKLXdpbGwgYmUgY29tcGFyYWJsZSB0byB0aGUgdmFyaWF0aW9uIGFtb25nIExpbnV4LWJhc2VkIEdOVSBzeXN0ZW1zIG9yCi1hbW9uZyBCU0Qgc3lzdGVtcyB0b2RheS4gIFNvIHRoZSBraW5kcyBvZiBwb3J0YWJpbGl0eSB0aGF0IGFyZSBhYnNvbHV0ZWx5Ci1uZWNlc3NhcnkgYXJlIHF1aXRlIGxpbWl0ZWQuCi0KLUJ1dCBtYW55IHVzZXJzIGRvIHJ1biBHTlUgc29mdHdhcmUgb24gbm9uLUdOVSBVbml4IG9yIFVuaXgtbGlrZSBzeXN0ZW1zLgotU28gc3VwcG9ydGluZyBhIHZhcmlldHkgb2YgVW5peC1saWtlIHN5c3RlbXMgaXMgZGVzaXJhYmxlLCBhbHRob3VnaCBub3QKLXBhcmFtb3VudC4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGFjaGlldmUgcG9ydGFiaWxpdHkgdG8gbW9zdCBVbml4LWxpa2Ugc3lzdGVtcyBpcyB0bwotdXNlIEF1dG9jb25mLiAgSXQncyB1bmxpa2VseSB0aGF0IHlvdXIgcHJvZ3JhbSBuZWVkcyB0byBrbm93IG1vcmUKLWluZm9ybWF0aW9uIGFib3V0IHRoZSBob3N0IHBsYXRmb3JtIHRoYW4gQXV0b2NvbmYgY2FuIHByb3ZpZGUsIHNpbXBseQotYmVjYXVzZSBtb3N0IG9mIHRoZSBwcm9ncmFtcyB0aGF0IG5lZWQgc3VjaCBrbm93bGVkZ2UgaGF2ZSBhbHJlYWR5IGJlZW4KLXdyaXR0ZW4uCi0KLUF2b2lkIHVzaW5nIHRoZSBmb3JtYXQgb2Ygc2VtaS1pbnRlcm5hbCBkYXRhIGJhc2VzIChlLmcuLCBkaXJlY3RvcmllcykKLXdoZW4gdGhlcmUgaXMgYSBoaWdoZXItbGV2ZWwgYWx0ZXJuYXRpdmUgKEBjb2Rle3JlYWRkaXJ9KS4KLQotQXMgZm9yIHN5c3RlbXMgdGhhdCBhcmUgbm90IGxpa2UgVW5peCwgc3VjaCBhcyBNU0RPUywgV2luZG93cywgdGhlCi1NYWNpbnRvc2gsIFZNUywgYW5kIE1WUywgc3VwcG9ydGluZyB0aGVtIGlzIHVzdWFsbHkgc28gbXVjaCB3b3JrIHRoYXQgaXQKLWlzIGJldHRlciBpZiB5b3UgZG9uJ3QuCi0KLVRoZSBwbGFubmVkIEdOVSBrZXJuZWwgaXMgbm90IGZpbmlzaGVkIHlldCwgYnV0IHlvdSBjYW4gdGVsbCB3aGljaAotZmFjaWxpdGllcyBpdCB3aWxsIHByb3ZpZGUgYnkgbG9va2luZyBhdCB0aGUgR05VIEMgTGlicmFyeSBNYW51YWwuICBUaGUKLUdOVSBrZXJuZWwgaXMgYmFzZWQgb24gTWFjaCwgc28gdGhlIGZlYXR1cmVzIG9mIE1hY2ggd2lsbCBhbHNvIGJlCi1hdmFpbGFibGUuICBIb3dldmVyLCBpZiB5b3UgdXNlIE1hY2ggZmVhdHVyZXMsIHlvdSdsbCBwcm9iYWJseSBoYXZlCi10cm91YmxlIGRlYnVnZ2luZyB5b3VyIHByb2dyYW0gdG9kYXkuCi0KLUBub2RlIENQVSBQb3J0YWJpbGl0eQotQHNlY3Rpb24gUG9ydGFiaWxpdHkgYmV0d2VlbiBAc2N7Y3B1fXMKLQotRXZlbiBHTlUgc3lzdGVtcyB3aWxsIGRpZmZlciBiZWNhdXNlIG9mIGRpZmZlcmVuY2VzIGFtb25nIEBzY3tjcHV9Ci10eXBlcy0tLWZvciBleGFtcGxlLCBkaWZmZXJlbmNlIGluIGJ5dGUgb3JkZXJpbmcgYW5kIGFsaWdubWVudAotcmVxdWlyZW1lbnRzLiAgSXQgaXMgYWJzb2x1dGVseSBlc3NlbnRpYWwgdG8gaGFuZGxlIHRoZXNlIGRpZmZlcmVuY2VzLgotSG93ZXZlciwgZG9uJ3QgbWFrZSBhbnkgZWZmb3J0IHRvIGNhdGVyIHRvIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGFuCi1AY29kZXtpbnR9IHdpbGwgYmUgbGVzcyB0aGFuIDMyIGJpdHMuICBXZSBkb24ndCBzdXBwb3J0IDE2LWJpdCBtYWNoaW5lcwotaW4gR05VLgotCi1Eb24ndCBhc3N1bWUgdGhhdCB0aGUgYWRkcmVzcyBvZiBhbiBAY29kZXtpbnR9IG9iamVjdCBpcyBhbHNvIHRoZQotYWRkcmVzcyBvZiBpdHMgbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZS4gIFRoaXMgaXMgZmFsc2Ugb24gYmlnLWVuZGlhbgotbWFjaGluZXMuICBUaHVzLCBkb24ndCBtYWtlIHRoZSBmb2xsb3dpbmcgbWlzdGFrZToKLQotQGV4YW1wbGUKLWludCBjOwotQGRvdHN7fQotd2hpbGUgKChjID0gZ2V0Y2hhcigpKSAhPSBFT0YpCi0gIHdyaXRlKGZpbGVfZGVzY3JpcHRvciwgJmMsIDEpOwotQGVuZCBleGFtcGxlCi0KLVdoZW4gY2FsbGluZyBmdW5jdGlvbnMsIHlvdSBuZWVkIG5vdCB3b3JyeSBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi1wb2ludGVycyBvZiB2YXJpb3VzIHR5cGVzLCBvciBiZXR3ZWVuIHBvaW50ZXJzIGFuZCBpbnRlZ2Vycy4gIE9uIG1vc3QKLW1hY2hpbmVzLCB0aGVyZSdzIG5vIGRpZmZlcmVuY2UgYW55d2F5LiAgQXMgZm9yIHRoZSBmZXcgbWFjaGluZXMgd2hlcmUKLXRoZXJlIGlzIGEgZGlmZmVyZW5jZSwgYWxsIG9mIHRoZW0gc3VwcG9ydCBAc2N7YW5zaX0gQywgc28geW91IGNhbiB1c2UKLXByb3RvdHlwZXMgKGNvbmRpdGlvbmFsaXplZCB0byBiZSBhY3RpdmUgb25seSBpbiBAc2N7YW5zaX0gQykgdG8gbWFrZQotdGhlIGNvZGUgd29yayBvbiB0aG9zZSBzeXN0ZW1zLgotCi1JbiBjZXJ0YWluIGNhc2VzLCBpdCBpcyBvayB0byBwYXNzIGludGVnZXIgYW5kIHBvaW50ZXIgYXJndW1lbnRzCi1pbmRpc2NyaW1pbmF0ZWx5IHRvIHRoZSBzYW1lIGZ1bmN0aW9uLCBhbmQgdXNlIG5vIHByb3RvdHlwZSBvbiBhbnkKLXN5c3RlbS4gIEZvciBleGFtcGxlLCBtYW55IEdOVSBwcm9ncmFtcyBoYXZlIGVycm9yLXJlcG9ydGluZyBmdW5jdGlvbnMKLXRoYXQgcGFzcyB0aGVpciBhcmd1bWVudHMgYWxvbmcgdG8gQGNvZGV7cHJpbnRmfSBhbmQgZnJpZW5kczoKLQotQGV4YW1wbGUKLWVycm9yIChzLCBhMSwgYTIsIGEzKQotICAgICBjaGFyICpzOwotICAgICBpbnQgYTEsIGEyLCBhMzsKLUB7Ci0gIGZwcmludGYgKHN0ZGVyciwgImVycm9yOiAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBzLCBhMSwgYTIsIGEzKTsKLUB9Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1JbiBwcmFjdGljZSwgdGhpcyB3b3JrcyBvbiBhbGwgbWFjaGluZXMsIGFuZCBpdCBpcyBtdWNoIHNpbXBsZXIgdGhhbiBhbnkKLWBgY29ycmVjdCcnIGFsdGVybmF0aXZlLiAgQmUgc3VyZSBAZW1waHtub3R9IHRvIHVzZSBhIHByb3RvdHlwZQotZm9yIHN1Y2ggZnVuY3Rpb25zLgotCi1Ib3dldmVyLCBhdm9pZCBjYXN0aW5nIHBvaW50ZXJzIHRvIGludGVnZXJzIHVubGVzcyB5b3UgcmVhbGx5IG5lZWQgdG8uCi1UaGVzZSBhc3N1bXB0aW9ucyByZWFsbHkgcmVkdWNlIHBvcnRhYmlsaXR5LCBhbmQgaW4gbW9zdCBwcm9ncmFtcyB0aGV5Ci1hcmUgZWFzeSB0byBhdm9pZC4gIEluIHRoZSBjYXNlcyB3aGVyZSBjYXN0aW5nIHBvaW50ZXJzIHRvIGludGVnZXJzIGlzCi1lc3NlbnRpYWwtLS1zdWNoIGFzLCBhIExpc3AgaW50ZXJwcmV0ZXIgd2hpY2ggc3RvcmVzIHR5cGUgaW5mb3JtYXRpb24gYXMKLXdlbGwgYXMgYW4gYWRkcmVzcyBpbiBvbmUgd29yZC0tLWl0IGlzIG9rIHRvIGRvIHNvLCBidXQgeW91J2xsIGhhdmUgdG8KLW1ha2UgZXhwbGljaXQgcHJvdmlzaW9ucyB0byBoYW5kbGUgZGlmZmVyZW50IHdvcmQgc2l6ZXMuCi0KLUBub2RlIFN5c3RlbSBGdW5jdGlvbnMKLUBzZWN0aW9uIENhbGxpbmcgU3lzdGVtIEZ1bmN0aW9ucwotCi1DIGltcGxlbWVudGF0aW9ucyBkaWZmZXIgc3Vic3RhbnRpYWxseS4gIEBzY3thbnNpfSBDIHJlZHVjZXMgYnV0IGRvZXMgbm90Ci1lbGltaW5hdGUgdGhlIGluY29tcGF0aWJpbGl0aWVzOyBtZWFud2hpbGUsIG1hbnkgdXNlcnMgd2lzaCB0byBjb21waWxlCi1HTlUgc29mdHdhcmUgd2l0aCBwcmUtQHNje2Fuc2l9IGNvbXBpbGVycy4gIFRoaXMgY2hhcHRlciBnaXZlcwotcmVjb21tZW5kYXRpb25zIGZvciBob3cgdG8gdXNlIHRoZSBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQgQyBsaWJyYXJ5Ci1mdW5jdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgbG9zcyBvZiBwb3J0YWJpbGl0eS4KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLURvbid0IHVzZSB0aGUgdmFsdWUgb2YgQGNvZGV7c3ByaW50Zn0uICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YKLWNoYXJhY3RlcnMgd3JpdHRlbiBvbiBzb21lIHN5c3RlbXMsIGJ1dCBub3Qgb24gYWxsIHN5c3RlbXMuCi0KLUBpdGVtCi1AY29kZXttYWlufSBzaG91bGQgYmUgZGVjbGFyZWQgdG8gcmV0dXJuIHR5cGUgQGNvZGV7aW50fS4gIEl0IHNob3VsZAotdGVybWluYXRlIGVpdGhlciBieSBjYWxsaW5nIEBjb2Rle2V4aXR9IG9yIGJ5IHJldHVybmluZyB0aGUgaW50ZWdlcgotc3RhdHVzIGNvZGU7IG1ha2Ugc3VyZSBpdCBjYW5ub3QgZXZlciByZXR1cm4gYW4gdW5kZWZpbmVkIHZhbHVlLgotCi1AaXRlbQotRG9uJ3QgZGVjbGFyZSBzeXN0ZW0gZnVuY3Rpb25zIGV4cGxpY2l0bHkuCi0KLUFsbW9zdCBhbnkgZGVjbGFyYXRpb24gZm9yIGEgc3lzdGVtIGZ1bmN0aW9uIGlzIHdyb25nIG9uIHNvbWUgc3lzdGVtLgotVG8gbWluaW1pemUgY29uZmxpY3RzLCBsZWF2ZSBpdCB0byB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyB0byBkZWNsYXJlCi1zeXN0ZW0gZnVuY3Rpb25zLiAgSWYgdGhlIGhlYWRlcnMgZG9uJ3QgZGVjbGFyZSBhIGZ1bmN0aW9uLCBsZXQgaXQKLXJlbWFpbiB1bmRlY2xhcmVkLgotCi1XaGlsZSBpdCBtYXkgc2VlbSB1bmNsZWFuIHRvIHVzZSBhIGZ1bmN0aW9uIHdpdGhvdXQgZGVjbGFyaW5nIGl0LCBpbgotcHJhY3RpY2UgdGhpcyB3b3JrcyBmaW5lIGZvciBtb3N0IHN5c3RlbSBsaWJyYXJ5IGZ1bmN0aW9ucyBvbiB0aGUKLXN5c3RlbXMgd2hlcmUgdGhpcyByZWFsbHkgaGFwcGVuczsgdGh1cywgdGhlIGRpc2FkdmFudGFnZSBpcyBvbmx5Ci10aGVvcmV0aWNhbC4gIEJ5IGNvbnRyYXN0LCBhY3R1YWwgZGVjbGFyYXRpb25zIGhhdmUgZnJlcXVlbnRseSBjYXVzZWQKLWFjdHVhbCBjb25mbGljdHMuCi0KLUBpdGVtCi1JZiB5b3UgbXVzdCBkZWNsYXJlIGEgc3lzdGVtIGZ1bmN0aW9uLCBkb24ndCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcy4KLVVzZSBhbiBvbGQtc3R5bGUgZGVjbGFyYXRpb24sIG5vdCBhbiBAc2N7YW5zaX0gcHJvdG90eXBlLiAgVGhlIG1vcmUgeW91Ci1zcGVjaWZ5IGFib3V0IHRoZSBmdW5jdGlvbiwgdGhlIG1vcmUgbGlrZWx5IGEgY29uZmxpY3QuCi0KLUBpdGVtCi1JbiBwYXJ0aWN1bGFyLCBkb24ndCB1bmNvbmRpdGlvbmFsbHkgZGVjbGFyZSBAY29kZXttYWxsb2N9IG9yCi1AY29kZXtyZWFsbG9jfS4KLQotTW9zdCBHTlUgcHJvZ3JhbXMgdXNlIHRob3NlIGZ1bmN0aW9ucyBqdXN0IG9uY2UsIGluIGZ1bmN0aW9ucwotY29udmVudGlvbmFsbHkgbmFtZWQgQGNvZGV7eG1hbGxvY30gYW5kIEBjb2Rle3hyZWFsbG9jfS4gIFRoZXNlCi1mdW5jdGlvbnMgY2FsbCBAY29kZXttYWxsb2N9IGFuZCBAY29kZXtyZWFsbG9jfSwgcmVzcGVjdGl2ZWx5LCBhbmQKLWNoZWNrIHRoZSByZXN1bHRzLgotCi1CZWNhdXNlIEBjb2Rle3htYWxsb2N9IGFuZCBAY29kZXt4cmVhbGxvY30gYXJlIGRlZmluZWQgaW4geW91ciBwcm9ncmFtLAoteW91IGNhbiBkZWNsYXJlIHRoZW0gaW4gb3RoZXIgZmlsZXMgd2l0aG91dCBhbnkgcmlzayBvZiB0eXBlIGNvbmZsaWN0LgotCi1PbiBtb3N0IHN5c3RlbXMsIEBjb2Rle2ludH0gaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIGEgcG9pbnRlcjsgdGh1cywgdGhlCi1jYWxscyB0byBAY29kZXttYWxsb2N9IGFuZCBAY29kZXtyZWFsbG9jfSB3b3JrIGZpbmUuICBGb3IgdGhlIGZldwotZXhjZXB0aW9uYWwgc3lzdGVtcyAobW9zdGx5IDY0LWJpdCBtYWNoaW5lcyksIHlvdSBjYW4gdXNlCi1Ac3Ryb25ne2NvbmRpdGlvbmFsaXplZH0gZGVjbGFyYXRpb25zIG9mIEBjb2Rle21hbGxvY30gYW5kCi1AY29kZXtyZWFsbG9jfS0tLW9yIHB1dCB0aGVzZSBkZWNsYXJhdGlvbnMgaW4gY29uZmlndXJhdGlvbiBmaWxlcwotc3BlY2lmaWMgdG8gdGhvc2Ugc3lzdGVtcy4KLQotQGl0ZW0KLVRoZSBzdHJpbmcgZnVuY3Rpb25zIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQuICBTb21lIFVuaXggc3lzdGVtcyBoYXZlCi1hIGhlYWRlciBmaWxlIEBmaWxle3N0cmluZy5ofTsgb3RoZXJzIGhhdmUgQGZpbGV7c3RyaW5ncy5ofS4gIE5laXRoZXIKLWZpbGUgbmFtZSBpcyBwb3J0YWJsZS4gIFRoZXJlIGFyZSB0d28gdGhpbmdzIHlvdSBjYW4gZG86IHVzZSBBdXRvY29uZiB0bwotZmlndXJlIG91dCB3aGljaCBmaWxlIHRvIGluY2x1ZGUsIG9yIGRvbid0IGluY2x1ZGUgZWl0aGVyIGZpbGUuCi0KLUBpdGVtCi1JZiB5b3UgZG9uJ3QgaW5jbHVkZSBlaXRoZXIgc3RyaW5ncyBmaWxlLCB5b3UgY2FuJ3QgZ2V0IGRlY2xhcmF0aW9ucyBmb3IKLXRoZSBzdHJpbmcgZnVuY3Rpb25zIGZyb20gdGhlIGhlYWRlciBmaWxlIGluIHRoZSB1c3VhbCB3YXkuCi0KLVRoYXQgY2F1c2VzIGxlc3Mgb2YgYSBwcm9ibGVtIHRoYW4geW91IG1pZ2h0IHRoaW5rLiAgVGhlIG5ld2VyIEBzY3thbnNpfQotc3RyaW5nIGZ1bmN0aW9ucyBzaG91bGQgYmUgYXZvaWRlZCBhbnl3YXkgYmVjYXVzZSBtYW55IHN5c3RlbXMgc3RpbGwKLWRvbid0IHN1cHBvcnQgdGhlbS4gIFRoZSBzdHJpbmcgZnVuY3Rpb25zIHlvdSBjYW4gdXNlIGFyZSB0aGVzZToKLQotQGV4YW1wbGUKLXN0cmNweSAgIHN0cm5jcHkgICBzdHJjYXQgICBzdHJuY2F0Ci1zdHJsZW4gICBzdHJjbXAgICAgc3RybmNtcAotc3RyY2hyICAgc3RycmNocgotQGVuZCBleGFtcGxlCi0KLVRoZSBjb3B5IGFuZCBjb25jYXRlbmF0ZSBmdW5jdGlvbnMgd29yayBmaW5lIHdpdGhvdXQgYSBkZWNsYXJhdGlvbiBhcwotbG9uZyBhcyB5b3UgZG9uJ3QgdXNlIHRoZWlyIHZhbHVlcy4gIFVzaW5nIHRoZWlyIHZhbHVlcyB3aXRob3V0IGEKLWRlY2xhcmF0aW9uIGZhaWxzIG9uIHN5c3RlbXMgd2hlcmUgdGhlIHdpZHRoIG9mIGEgcG9pbnRlciBkaWZmZXJzIGZyb20KLXRoZSB3aWR0aCBvZiBAY29kZXtpbnR9LCBhbmQgcGVyaGFwcyBpbiBvdGhlciBjYXNlcy4gIEl0IGlzIHRyaXZpYWwgdG8KLWF2b2lkIHVzaW5nIHRoZWlyIHZhbHVlcywgc28gZG8gdGhhdC4KLQotVGhlIGNvbXBhcmUgZnVuY3Rpb25zIGFuZCBAY29kZXtzdHJsZW59IHdvcmsgZmluZSB3aXRob3V0IGEgZGVjbGFyYXRpb24KLW9uIG1vc3Qgc3lzdGVtcywgcG9zc2libHkgYWxsIHRoZSBvbmVzIHRoYXQgR05VIHNvZnR3YXJlIHJ1bnMgb24uCi1Zb3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGRlY2xhcmUgdGhlbSBAc3Ryb25ne2NvbmRpdGlvbmFsbHl9IG9uIGEKLWZldyBzeXN0ZW1zLgotCi1UaGUgc2VhcmNoIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIHRvIHJldHVybiBAY29kZXtjaGFyICp9LiAgTHVja2lseSwKLXRoZXJlIGlzIG5vIHZhcmlhdGlvbiBpbiB0aGUgZGF0YSB0eXBlIHRoZXkgcmV0dXJuLiAgQnV0IHRoZXJlIGlzCi12YXJpYXRpb24gaW4gdGhlaXIgbmFtZXMuICBTb21lIHN5c3RlbXMgZ2l2ZSB0aGVzZSBmdW5jdGlvbnMgdGhlIG5hbWVzCi1AY29kZXtpbmRleH0gYW5kIEBjb2Rle3JpbmRleH07IG90aGVyIHN5c3RlbXMgdXNlIHRoZSBuYW1lcwotQGNvZGV7c3RyY2hyfSBhbmQgQGNvZGV7c3RycmNocn0uICBTb21lIHN5c3RlbXMgc3VwcG9ydCBib3RoIHBhaXJzIG9mCi1uYW1lcywgYnV0IG5laXRoZXIgcGFpciB3b3JrcyBvbiBhbGwgc3lzdGVtcy4KLQotWW91IHNob3VsZCBwaWNrIGEgc2luZ2xlIHBhaXIgb2YgbmFtZXMgYW5kIHVzZSBpdCB0aHJvdWdob3V0IHlvdXIKLXByb2dyYW0uICAoTm93YWRheXMsIGl0IGlzIGJldHRlciB0byBjaG9vc2UgQGNvZGV7c3RyY2hyfSBhbmQKLUBjb2Rle3N0cnJjaHJ9IGZvciBuZXcgcHJvZ3JhbXMsIHNpbmNlIHRob3NlIGFyZSB0aGUgc3RhbmRhcmQgQHNje2Fuc2l9Ci1uYW1lcy4pICBEZWNsYXJlIGJvdGggb2YgdGhvc2UgbmFtZXMgYXMgZnVuY3Rpb25zIHJldHVybmluZyBAY29kZXtjaGFyCi0qfS4gIE9uIHN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aG9zZSBuYW1lcywgZGVmaW5lIHRoZW0gYXMgbWFjcm9zCi1pbiB0ZXJtcyBvZiB0aGUgb3RoZXIgcGFpci4gIEZvciBleGFtcGxlLCBoZXJlIGlzIHdoYXQgdG8gcHV0IGF0IHRoZQotYmVnaW5uaW5nIG9mIHlvdXIgZmlsZSAob3IgaW4gYSBoZWFkZXIpIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgbmFtZXMKLUBjb2Rle3N0cmNocn0gYW5kIEBjb2Rle3N0cnJjaHJ9IHRocm91Z2hvdXQ6Ci0KLUBleGFtcGxlCi0jaWZuZGVmIEhBVkVfU1RSQ0hSCi0jZGVmaW5lIHN0cmNociBpbmRleAotI2VuZGlmCi0jaWZuZGVmIEhBVkVfU1RSUkNIUgotI2RlZmluZSBzdHJyY2hyIHJpbmRleAotI2VuZGlmCi0KLWNoYXIgKnN0cmNociAoKTsKLWNoYXIgKnN0cnJjaHIgKCk7Ci1AZW5kIGV4YW1wbGUKLUBlbmQgaXRlbWl6ZQotCi1IZXJlIHdlIGFzc3VtZSB0aGF0IEBjb2Rle0hBVkVfU1RSQ0hSfSBhbmQgQGNvZGV7SEFWRV9TVFJSQ0hSfSBhcmUKLW1hY3JvcyBkZWZpbmVkIGluIHN5c3RlbXMgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIGV4aXN0LgotT25lIHdheSB0byBnZXQgdGhlbSBwcm9wZXJseSBkZWZpbmVkIGlzIHRvIHVzZSBBdXRvY29uZi4KLQotQG5vZGUgSW50ZXJuYXRpb25hbGl6YXRpb24KLUBzZWN0aW9uIEludGVybmF0aW9uYWxpemF0aW9uCi0KLUdOVSBoYXMgYSBsaWJyYXJ5IGNhbGxlZCBHTlUgZ2V0dGV4dCB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gdHJhbnNsYXRlIHRoZQotbWVzc2FnZXMgaW4gYSBwcm9ncmFtIGludG8gdmFyaW91cyBsYW5ndWFnZXMuICBZb3Ugc2hvdWxkIHVzZSB0aGlzCi1saWJyYXJ5IGluIGV2ZXJ5IHByb2dyYW0uICBVc2UgRW5nbGlzaCBmb3IgdGhlIG1lc3NhZ2VzIGFzIHRoZXkgYXBwZWFyCi1pbiB0aGUgcHJvZ3JhbSwgYW5kIGxldCBnZXR0ZXh0IHByb3ZpZGUgdGhlIHdheSB0byB0cmFuc2xhdGUgdGhlbSBpbnRvCi1vdGhlciBsYW5ndWFnZXMuCi0KLVVzaW5nIEdOVSBnZXR0ZXh0IGludm9sdmVzIHB1dHRpbmcgYSBjYWxsIHRvIHRoZSBAY29kZXtnZXR0ZXh0fSBtYWNybwotYXJvdW5kIGVhY2ggc3RyaW5nIHRoYXQgbWlnaHQgbmVlZCB0cmFuc2xhdGlvbi0tLWxpa2UgdGhpczoKLQotQGV4YW1wbGUKLXByaW50ZiAoZ2V0dGV4dCAoIlByb2Nlc3NpbmcgZmlsZSBgJXMnLi4uIikpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotVGhpcyBwZXJtaXRzIEdOVSBnZXR0ZXh0IHRvIHJlcGxhY2UgdGhlIHN0cmluZyBAY29kZXsiUHJvY2Vzc2luZyBmaWxlCi1gJXMnLi4uIn0gd2l0aCBhIHRyYW5zbGF0ZWQgdmVyc2lvbi4KLQotT25jZSBhIHByb2dyYW0gdXNlcyBnZXR0ZXh0LCBwbGVhc2UgbWFrZSBhIHBvaW50IG9mIHdyaXRpbmcgY2FsbHMgdG8KLUBjb2Rle2dldHRleHR9IHdoZW4geW91IGFkZCBuZXcgc3RyaW5ncyB0aGF0IGNhbGwgZm9yIHRyYW5zbGF0aW9uLgotCi1Vc2luZyBHTlUgZ2V0dGV4dCBpbiBhIHBhY2thZ2UgaW52b2x2ZXMgc3BlY2lmeWluZyBhIEBkZm57dGV4dCBkb21haW4KLW5hbWV9IGZvciB0aGUgcGFja2FnZS4gIFRoZSB0ZXh0IGRvbWFpbiBuYW1lIGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhlCi10cmFuc2xhdGlvbnMgZm9yIHRoaXMgcGFja2FnZSBmcm9tIHRoZSB0cmFuc2xhdGlvbnMgZm9yIG90aGVyIHBhY2thZ2VzLgotTm9ybWFsbHksIHRoZSB0ZXh0IGRvbWFpbiBuYW1lIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUKLXBhY2thZ2UtLS1mb3IgZXhhbXBsZSwgQHNhbXB7ZmlsZXV0aWxzfSBmb3IgdGhlIEdOVSBmaWxlIHV0aWxpdGllcy4KLQotVG8gZW5hYmxlIGdldHRleHQgdG8gd29yayB3ZWxsLCBhdm9pZCB3cml0aW5nIGNvZGUgdGhhdCBtYWtlcwotYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZiB3b3JkcyBvciBzZW50ZW5jZXMuICBXaGVuIHlvdSB3YW50Ci10aGUgcHJlY2lzZSB0ZXh0IG9mIGEgc2VudGVuY2UgdG8gdmFyeSBkZXBlbmRpbmcgb24gdGhlIGRhdGEsIHVzZSB0d28gb3IKLW1vcmUgYWx0ZXJuYXRpdmUgc3RyaW5nIGNvbnN0YW50cyBlYWNoIGNvbnRhaW5pbmcgYSBjb21wbGV0ZSBzZW50ZW5jZXMsCi1yYXRoZXIgdGhhbiBpbnNlcnRpbmcgY29uZGl0aW9uYWxpemVkIHdvcmRzIG9yIHBocmFzZXMgaW50byBhIHNpbmdsZQotc2VudGVuY2UgZnJhbWV3b3JrLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2Ygd2hhdCBub3QgdG8gZG86Ci0KLUBleGFtcGxlCi1wcmludGYgKCIlZCBmaWxlJXMgcHJvY2Vzc2VkIiwgbmZpbGVzLAotICAgICAgICBuZmlsZXMgIT0gMSA/ICJzIiA6ICIiKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBwcm9ibGVtIHdpdGggdGhhdCBleGFtcGxlIGlzIHRoYXQgaXQgYXNzdW1lcyB0aGF0IHBsdXJhbHMgYXJlIG1hZGUKLWJ5IGFkZGluZyBgcycuICBJZiB5b3UgYXBwbHkgZ2V0dGV4dCB0byB0aGUgZm9ybWF0IHN0cmluZywgbGlrZSB0aGlzLAotCi1AZXhhbXBsZQotcHJpbnRmIChnZXR0ZXh0ICgiJWQgZmlsZSVzIHByb2Nlc3NlZCIpLCBuZmlsZXMsCi0gICAgICAgIG5maWxlcyAhPSAxID8gInMiIDogIiIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotdGhlIG1lc3NhZ2UgY2FuIHVzZSBkaWZmZXJlbnQgd29yZHMsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlIGZvcmNlZCB0byB1c2UKLWBzJyBmb3IgdGhlIHBsdXJhbC4gIEhlcmUgaXMgYSBiZXR0ZXIgd2F5OgotCi1AZXhhbXBsZQotcHJpbnRmICgobmZpbGVzICE9IDEgPyAiJWQgZmlsZXMgcHJvY2Vzc2VkIgotICAgICAgICAgOiAiJWQgZmlsZSBwcm9jZXNzZWQiKSwKLSAgICAgICAgbmZpbGVzKTsKLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgd2F5LCB5b3UgY2FuIGFwcGx5IGdldHRleHQgdG8gZWFjaCBvZiB0aGUgdHdvIHN0cmluZ3MKLWluZGVwZW5kZW50bHk6Ci0KLUBleGFtcGxlCi1wcmludGYgKChuZmlsZXMgIT0gMSA/IGdldHRleHQgKCIlZCBmaWxlcyBwcm9jZXNzZWQiKQotICAgICAgICAgOiBnZXR0ZXh0ICgiJWQgZmlsZSBwcm9jZXNzZWQiKSksCi0gICAgICAgIG5maWxlcyk7Ci1AZW5kIGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGlzIGNhbiBiZSBhbnkgbWV0aG9kIG9mIGZvcm1pbmcgdGhlIHBsdXJhbCBvZiB0aGUgd29yZCBmb3IgYGBmaWxlJycsIGFuZAotYWxzbyBoYW5kbGVzIGxhbmd1YWdlcyB0aGF0IHJlcXVpcmUgYWdyZWVtZW50IGluIHRoZSB3b3JkIGZvcgotYGBwcm9jZXNzZWQnJy4KLQotQSBzaW1pbGFyIHByb2JsZW0gYXBwZWFycyBhdCB0aGUgbGV2ZWwgb2Ygc2VudGVuY2Ugc3RydWN0dXJlIHdpdGggdGhpcwotY29kZToKLQotQGV4YW1wbGUKLXByaW50ZiAoIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyVzIGJlZW4gZG9uZS5cbiIsCi0gICAgICAgIGYtPnRyaWVkX2ltcGxpY2l0ID8gIiIgOiAiIG5vdCIpOwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotQWRkaW5nIEBjb2Rle2dldHRleHR9IGNhbGxzIHRvIHRoaXMgY29kZSBjYW5ub3QgZ2l2ZSBjb3JyZWN0IHJlc3VsdHMgZm9yCi1hbGwgbGFuZ3VhZ2VzLCBiZWNhdXNlIG5lZ2F0aW9uIGluIHNvbWUgbGFuZ3VhZ2VzIHJlcXVpcmVzIGFkZGluZyB3b3JkcwotYXQgbW9yZSB0aGFuIG9uZSBwbGFjZSBpbiB0aGUgc2VudGVuY2UuICBCeSBjb250cmFzdCwgYWRkaW5nCi1AY29kZXtnZXR0ZXh0fSBjYWxscyBkb2VzIHRoZSBqb2Igc3RyYWlnaHRmb3dhcmRseSBpZiB0aGUgY29kZSBzdGFydHMKLW91dCBsaWtlIHRoaXM6Ci0KLUBleGFtcGxlCi1wcmludGYgKGYtPnRyaWVkX2ltcGxpY2l0Ci0gICAgICAgID8gIiMgIEltcGxpY2l0IHJ1bGUgc2VhcmNoIGhhcyBiZWVuIGRvbmUuXG4iLAotICAgICAgICA6ICIjICBJbXBsaWNpdCBydWxlIHNlYXJjaCBoYXMgbm90IGJlZW4gZG9uZS5cbiIpOwotQGVuZCBleGFtcGxlCi0KLUBub2RlIE1tYXAKLUBzZWN0aW9uIE1tYXAKLQotRG9uJ3QgYXNzdW1lIHRoYXQgQGNvZGV7bW1hcH0gZWl0aGVyIHdvcmtzIG9uIGFsbCBmaWxlcyBvciBmYWlscwotZm9yIGFsbCBmaWxlcy4gIEl0IG1heSB3b3JrIG9uIHNvbWUgZmlsZXMgYW5kIGZhaWwgb24gb3RoZXJzLgotCi1UaGUgcHJvcGVyIHdheSB0byB1c2UgQGNvZGV7bW1hcH0gaXMgdG8gdHJ5IGl0IG9uIHRoZSBzcGVjaWZpYyBmaWxlIGZvcgotd2hpY2ggeW91IHdhbnQgdG8gdXNlIGl0LS0tYW5kIGlmIEBjb2Rle21tYXB9IGRvZXNuJ3Qgd29yaywgZmFsbCBiYWNrIG9uCi1kb2luZyB0aGUgam9iIGluIGFub3RoZXIgd2F5IHVzaW5nIEBjb2Rle3JlYWR9IGFuZCBAY29kZXt3cml0ZX0uCi0KLVRoZSByZWFzb24gdGhpcyBwcmVjYXV0aW9uIGlzIG5lZWRlZCBpcyB0aGF0IHRoZSBHTlUga2VybmVsICh0aGUgSFVSRCkKLXByb3ZpZGVzIGEgdXNlci1leHRlbnNpYmxlIGZpbGUgc3lzdGVtLCBpbiB3aGljaCB0aGVyZSBjYW4gYmUgbWFueQotZGlmZmVyZW50IGtpbmRzIG9mIGBgb3JkaW5hcnkgZmlsZXMuJycgIE1hbnkgb2YgdGhlbSBzdXBwb3J0Ci1AY29kZXttbWFwfSwgYnV0IHNvbWUgZG8gbm90LiAgSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgcHJvZ3JhbXMgaGFuZGxlCi1hbGwgdGhlc2Uga2luZHMgb2YgZmlsZXMuCi0KLUBub2RlIERvY3VtZW50YXRpb24KLUBjaGFwdGVyIERvY3VtZW50aW5nIFByb2dyYW1zCi0KLUBtZW51Ci0qIEdOVSBNYW51YWxzOjogICAgICAgICAgICAgICAgIFdyaXRpbmcgcHJvcGVyIG1hbnVhbHMuCi0qIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlsczo6ICAgIFNwZWNpZmljIHN0cnVjdHVyZSBjb252ZW50aW9ucy4KLSogTkVXUyBGaWxlOjogICAgICAgICAgICAgICAgICAgTkVXUyBmaWxlcyBzdXBwbGVtZW50IG1hbnVhbHMuCi0qIENoYW5nZSBMb2dzOjogICAgICAgICAgICAgICAgIFJlY29yZGluZyBDaGFuZ2VzCi0qIE1hbiBQYWdlczo6ICAgICAgICAgICAgICAgICAgIE1hbiBwYWdlcyBhcmUgc2Vjb25kYXJ5LgotKiBSZWFkaW5nIG90aGVyIE1hbnVhbHM6OiAgICAgICBIb3cgZmFyIHlvdSBjYW4gZ28gaW4gbGVhcm5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBvdGhlciBtYW51YWxzLgotQGVuZCBtZW51Ci0KLUBub2RlIEdOVSBNYW51YWxzCi1Ac2VjdGlvbiBHTlUgTWFudWFscwotCi1UaGUgcHJlZmVycmVkIHdheSB0byBkb2N1bWVudCBwYXJ0IG9mIHRoZSBHTlUgc3lzdGVtIGlzIHRvIHdyaXRlIGEKLW1hbnVhbCBpbiB0aGUgVGV4aW5mbyBmb3JtYXR0aW5nIGxhbmd1YWdlLiAgU2VlIHRoZSBUZXhpbmZvIG1hbnVhbCwKLWVpdGhlciB0aGUgaGFyZGNvcHksIG9yIHRoZSBvbi1saW5lIHZlcnNpb24gYXZhaWxhYmxlIHRocm91Z2gKLUBjb2Rle2luZm99IG9yIHRoZSBFbWFjcyBJbmZvIHN1YnN5c3RlbSAoQGtiZHtDLWggaX0pLgotCi1Qcm9ncmFtbWVycyBvZnRlbiBmaW5kIGl0IG1vc3QgbmF0dXJhbCB0byBzdHJ1Y3R1cmUgdGhlIGRvY3VtZW50YXRpb24KLWZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggdGhleSBrbm93LiAgQnV0Ci10aGlzIHN0cnVjdHVyZSBpcyBub3QgbmVjZXNzYXJpbHkgZ29vZCBmb3IgZXhwbGFpbmluZyBob3cgdG8gdXNlIHRoZQotcHJvZ3JhbTsgaXQgbWF5IGJlIGlycmVsZXZhbnQgYW5kIGNvbmZ1c2luZyBmb3IgYSB1c2VyLgotCi1BdCBldmVyeSBsZXZlbCwgZnJvbSB0aGUgc2VudGVuY2VzIGluIGEgcGFyYWdyYXBoIHRvIHRoZSBncm91cGluZyBvZgotdG9waWNzIGludG8gc2VwYXJhdGUgbWFudWFscywgdGhlIHJpZ2h0IHdheSB0byBzdHJ1Y3R1cmUgZG9jdW1lbnRhdGlvbgotaXMgYWNjb3JkaW5nIHRvIHRoZSBjb25jZXB0cyBhbmQgcXVlc3Rpb25zIHRoYXQgYSB1c2VyIHdpbGwgaGF2ZSBpbiBtaW5kCi13aGVuIHJlYWRpbmcgaXQuICBTb21ldGltZXMgdGhpcyBzdHJ1Y3R1cmUgb2YgaWRlYXMgbWF0Y2hlcyB0aGUKLXN0cnVjdHVyZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNvZnR3YXJlIGJlaW5nIGRvY3VtZW50ZWQtLS1idXQKLW9mdGVuIHRoZXkgYXJlIGRpZmZlcmVudC4gIE9mdGVuIHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIGxlYXJuaW5nIHRvCi13cml0ZSBnb29kIGRvY3VtZW50YXRpb24gaXMgbGVhcm5pbmcgdG8gbm90aWNlIHdoZW4geW91IGFyZSBzdHJ1Y3R1cmluZwotdGhlIGRvY3VtZW50YXRpb24gbGlrZSB0aGUgaW1wbGVtZW50YXRpb24sIGFuZCB0aGluayBhYm91dCBiZXR0ZXIKLWFsdGVybmF0aXZlcy4KLQotRm9yIGV4YW1wbGUsIGVhY2ggcHJvZ3JhbSBpbiB0aGUgR05VIHN5c3RlbSBwcm9iYWJseSBvdWdodCB0byBiZQotZG9jdW1lbnRlZCBpbiBvbmUgbWFudWFsOyBidXQgdGhpcyBkb2VzIG5vdCBtZWFuIGVhY2ggcHJvZ3JhbSBzaG91bGQKLWhhdmUgaXRzIG93biBtYW51YWwuICBUaGF0IHdvdWxkIGJlIGZvbGxvd2luZyB0aGUgc3RydWN0dXJlIG9mIHRoZQotaW1wbGVtZW50YXRpb24sIHJhdGhlciB0aGFuIHRoZSBzdHJ1Y3R1cmUgdGhhdCBoZWxwcyB0aGUgdXNlcgotdW5kZXJzdGFuZC4KLQotSW5zdGVhZCwgZWFjaCBtYW51YWwgc2hvdWxkIGNvdmVyIGEgY29oZXJlbnQgQGVtcGh7dG9waWN9LiAgRm9yIGV4YW1wbGUsCi1pbnN0ZWFkIG9mIGEgbWFudWFsIGZvciBAY29kZXtkaWZmfSBhbmQgYSBtYW51YWwgZm9yIEBjb2Rle2RpZmYzfSwgd2UKLWhhdmUgb25lIG1hbnVhbCBmb3IgYGBjb21wYXJpc29uIG9mIGZpbGVzJycgd2hpY2ggY292ZXJzIGJvdGggb2YgdGhvc2UKLXByb2dyYW1zLCBhcyB3ZWxsIGFzIEBjb2Rle2NtcH0uICBCeSBkb2N1bWVudGluZyB0aGVzZSBwcm9ncmFtcwotdG9nZXRoZXIsIHdlIGNhbiBtYWtlIHRoZSB3aG9sZSBzdWJqZWN0IGNsZWFyZXIuCi0KLVRoZSBtYW51YWwgd2hpY2ggZGlzY3Vzc2VzIGEgcHJvZ3JhbSBzaG91bGQgZG9jdW1lbnQgYWxsIG9mIHRoZQotcHJvZ3JhbSdzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBhbGwgb2YgaXRzIGNvbW1hbmRzLiAgSXQgc2hvdWxkIGdpdmUKLWV4YW1wbGVzIG9mIHRoZWlyIHVzZS4gIEJ1dCBkb24ndCBvcmdhbml6ZSB0aGUgbWFudWFsIGFzIGEgbGlzdCBvZgotZmVhdHVyZXMuICBJbnN0ZWFkLCBvcmdhbml6ZSBpdCBsb2dpY2FsbHksIGJ5IHN1YnRvcGljcy4gIEFkZHJlc3MgdGhlCi1xdWVzdGlvbnMgdGhhdCBhIHVzZXIgd2lsbCBhc2sgd2hlbiB0aGlua2luZyBhYm91dCB0aGUgam9iIHRoYXQgdGhlCi1wcm9ncmFtIGRvZXMuCi0KLUluIGdlbmVyYWwsIGEgR05VIG1hbnVhbCBzaG91bGQgc2VydmUgYm90aCBhcyB0dXRvcmlhbCBhbmQgcmVmZXJlbmNlLgotSXQgc2hvdWxkIGJlIHNldCB1cCBmb3IgY29udmVuaWVudCBhY2Nlc3MgdG8gZWFjaCB0b3BpYyB0aHJvdWdoIEluZm8sCi1hbmQgZm9yIHJlYWRpbmcgc3RyYWlnaHQgdGhyb3VnaCAoYXBwZW5kaXhlcyBhc2lkZSkuICBBIEdOVSBtYW51YWwKLXNob3VsZCBnaXZlIGEgZ29vZCBpbnRyb2R1Y3Rpb24gdG8gYSBiZWdpbm5lciByZWFkaW5nIHRocm91Z2ggZnJvbSB0aGUKLXN0YXJ0LCBhbmQgc2hvdWxkIGFsc28gcHJvdmlkZSBhbGwgdGhlIGRldGFpbHMgdGhhdCBoYWNrZXJzIHdhbnQuCi0KLVRoYXQgaXMgbm90IGFzIGhhcmQgYXMgaXQgZmlyc3Qgc291bmRzLiAgQXJyYW5nZSBlYWNoIGNoYXB0ZXIgYXMgYQotbG9naWNhbCBicmVha2Rvd24gb2YgaXRzIHRvcGljLCBidXQgb3JkZXIgdGhlIHNlY3Rpb25zLCBhbmQgd3JpdGUgdGhlaXIKLXRleHQsIHNvIHRoYXQgcmVhZGluZyB0aGUgY2hhcHRlciBzdHJhaWdodCB0aHJvdWdoIG1ha2VzIHNlbnNlLiAgRG8KLWxpa2V3aXNlIHdoZW4gc3RydWN0dXJpbmcgdGhlIGJvb2sgaW50byBjaGFwdGVycywgYW5kIHdoZW4gc3RydWN0dXJpbmcgYQotc2VjdGlvbiBpbnRvIHBhcmFncmFwaHMuICBUaGUgd2F0Y2h3b3JkIGlzLCBAZW1waHthdCBlYWNoIHBvaW50LCBhZGRyZXNzCi10aGUgbW9zdCBmdW5kYW1lbnRhbCBhbmQgaW1wb3J0YW50IGlzc3VlIHJhaXNlZCBieSB0aGUgcHJlY2VkaW5nIHRleHQufQotCi1JZiBuZWNlc3NhcnksIGFkZCBleHRyYSBjaGFwdGVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtYW51YWwgd2hpY2gKLWFyZSBwdXJlbHkgdHV0b3JpYWwgYW5kIGNvdmVyIHRoZSBiYXNpY3Mgb2YgdGhlIHN1YmplY3QuICBUaGVzZSBwcm92aWRlCi10aGUgZnJhbWV3b3JrIGZvciBhIGJlZ2lubmVyIHRvIHVuZGVyc3RhbmQgdGhlIHJlc3Qgb2YgdGhlIG1hbnVhbC4gIFRoZQotQmlzb24gbWFudWFsIHByb3ZpZGVzIGEgZ29vZCBleGFtcGxlIG9mIGhvdyB0byBkbyB0aGlzLgotCi1Eb24ndCB1c2UgVW5peCBtYW4gcGFnZXMgYXMgYSBtb2RlbCBmb3IgaG93IHRvIHdyaXRlIEdOVSBkb2N1bWVudGF0aW9uOwotbW9zdCBvZiB0aGVtIGFyZSB0ZXJzZSwgYmFkbHkgc3RydWN0dXJlZCwgYW5kIGdpdmUgaW5hZGVxdWF0ZQotZXhwbGFuYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgY29uY2VwdHMuICAoVGhlcmUgYXJlLCBvZiBjb3Vyc2UKLWV4Y2VwdGlvbnMuKSAgQWxzbyBVbml4IG1hbiBwYWdlcyB1c2UgYSBwYXJ0aWN1bGFyIGZvcm1hdCB3aGljaCBpcwotZGlmZmVyZW50IGZyb20gd2hhdCB3ZSB1c2UgaW4gR05VIG1hbnVhbHMuCi0KLVBsZWFzZSBkbyBub3QgdXNlIHRoZSB0ZXJtIGBgcGF0aG5hbWUnJyB0aGF0IGlzIHVzZWQgaW4gVW5peAotZG9jdW1lbnRhdGlvbjsgdXNlIGBgZmlsZSBuYW1lJycgKHR3byB3b3JkcykgaW5zdGVhZC4gIFdlIHVzZSB0aGUgdGVybQotYGBwYXRoJycgb25seSBmb3Igc2VhcmNoIHBhdGhzLCB3aGljaCBhcmUgbGlzdHMgb2YgZmlsZSBuYW1lcy4KLQotUGxlYXNlIGRvIG5vdCB1c2UgdGhlIHRlcm0gYGBpbGxlZ2FsJycgdG8gcmVmZXIgdG8gZXJyb25lb3VzIGlucHV0IHRvIGEKLWNvbXB1dGVyIHByb2dyYW0uICBQbGVhc2UgdXNlIGBgaW52YWxpZCcnIGZvciB0aGlzLCBhbmQgcmVzZXJ2ZSB0aGUgdGVybQotYGBpbGxlZ2FsJycgZm9yIHZpb2xhdGlvbnMgb2YgbGF3LgotCi1Abm9kZSBNYW51YWwgU3RydWN0dXJlIERldGFpbHMKLUBzZWN0aW9uIE1hbnVhbCBTdHJ1Y3R1cmUgRGV0YWlscwotCi1UaGUgdGl0bGUgcGFnZSBvZiB0aGUgbWFudWFsIHNob3VsZCBzdGF0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbXMgb3IKLXBhY2thZ2VzIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbC4gIFRoZSBUb3Agbm9kZSBvZiB0aGUgbWFudWFsIHNob3VsZAotYWxzbyBjb250YWluIHRoaXMgaW5mb3JtYXRpb24uICBJZiB0aGUgbWFudWFsIGlzIGNoYW5naW5nIG1vcmUKLWZyZXF1ZW50bHkgdGhhbiBvciBpbmRlcGVuZGVudCBvZiB0aGUgcHJvZ3JhbSwgYWxzbyBzdGF0ZSBhIHZlcnNpb24KLW51bWJlciBmb3IgdGhlIG1hbnVhbCBpbiBib3RoIG9mIHRoZXNlIHBsYWNlcy4KLQotRWFjaCBwcm9ncmFtIGRvY3VtZW50ZWQgaW4gdGhlIG1hbnVhbCBzaG91bGQgc2hvdWxkIGhhdmUgYSBub2RlIG5hbWVkCi1Ac2FtcHtAdmFye3Byb2dyYW19IEludm9jYXRpb259IG9yIEBzYW1we0ludm9raW5nIEB2YXJ7cHJvZ3JhbX19LiAgVGhpcwotbm9kZSAodG9nZXRoZXIgd2l0aCBpdHMgc3Vibm9kZXMsIGlmIGFueSkgc2hvdWxkIGRlc2NyaWJlIHRoZSBwcm9ncmFtJ3MKLWNvbW1hbmQgbGluZSBhcmd1bWVudHMgYW5kIGhvdyB0byBydW4gaXQgKHRoZSBzb3J0IG9mIGluZm9ybWF0aW9uIHBlb3BsZQotd291bGQgbG9vayBpbiBhIG1hbiBwYWdlIGZvcikuICBTdGFydCB3aXRoIGFuIEBzYW1we0BAZXhhbXBsZX0KLWNvbnRhaW5pbmcgYSB0ZW1wbGF0ZSBmb3IgYWxsIHRoZSBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdCB0aGUgcHJvZ3JhbQotdXNlcy4KLQotQWx0ZXJuYXRpdmVseSwgcHV0IGEgbWVudSBpdGVtIGluIHNvbWUgbWVudSB3aG9zZSBpdGVtIG5hbWUgZml0cyBvbmUgb2YKLXRoZSBhYm92ZSBwYXR0ZXJucy4gIFRoaXMgaWRlbnRpZmllcyB0aGUgbm9kZSB3aGljaCB0aGF0IGl0ZW0gcG9pbnRzIHRvCi1hcyB0aGUgbm9kZSBmb3IgdGhpcyBwdXJwb3NlLCByZWdhcmRsZXNzIG9mIHRoZSBub2RlJ3MgYWN0dWFsIG5hbWUuCi0KLVRoZXJlIHdpbGwgYmUgYXV0b21hdGljIGZlYXR1cmVzIGZvciBzcGVjaWZ5aW5nIGEgcHJvZ3JhbSBuYW1lIGFuZAotcXVpY2tseSByZWFkaW5nIGp1c3QgdGhpcyBwYXJ0IG9mIGl0cyBtYW51YWwuCi0KLUlmIG9uZSBtYW51YWwgZGVzY3JpYmVzIHNldmVyYWwgcHJvZ3JhbXMsIGl0IHNob3VsZCBoYXZlIHN1Y2ggYSBub2RlIGZvcgotZWFjaCBwcm9ncmFtIGRlc2NyaWJlZC4KLQotQG5vZGUgTkVXUyBGaWxlCi1Ac2VjdGlvbiBUaGUgTkVXUyBGaWxlCi0KLUluIGFkZGl0aW9uIHRvIGl0cyBtYW51YWwsIHRoZSBwYWNrYWdlIHNob3VsZCBoYXZlIGEgZmlsZSBuYW1lZAotQGZpbGV7TkVXU30gd2hpY2ggY29udGFpbnMgYSBsaXN0IG9mIHVzZXItdmlzaWJsZSBjaGFuZ2VzIHdvcnRoCi1tZW50aW9uaW5nLiAgSW4gZWFjaCBuZXcgcmVsZWFzZSwgYWRkIGl0ZW1zIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBhbmQKLWlkZW50aWZ5IHRoZSB2ZXJzaW9uIHRoZXkgcGVydGFpbiB0by4gIERvbid0IGRpc2NhcmQgb2xkIGl0ZW1zOyBsZWF2ZQotdGhlbSBpbiB0aGUgZmlsZSBhZnRlciB0aGUgbmV3ZXIgaXRlbXMuICBUaGlzIHdheSwgYSB1c2VyIHVwZ3JhZGluZyBmcm9tCi1hbnkgcHJldmlvdXMgdmVyc2lvbiBjYW4gc2VlIHdoYXQgaXMgbmV3LgotCi1JZiB0aGUgQGZpbGV7TkVXU30gZmlsZSBnZXRzIHZlcnkgbG9uZywgbW92ZSBzb21lIG9mIHRoZSBvbGRlciBpdGVtcwotaW50byBhIGZpbGUgbmFtZWQgQGZpbGV7T05FV1N9IGFuZCBwdXQgYSBub3RlIGF0IHRoZSBlbmQgcmVmZXJyaW5nIHRoZQotdXNlciB0byB0aGF0IGZpbGUuCi0KLUBub2RlIENoYW5nZSBMb2dzCi1Ac2VjdGlvbiBDaGFuZ2UgTG9ncwotCi1LZWVwIGEgY2hhbmdlIGxvZyB0byBkZXNjcmliZSBhbGwgdGhlIGNoYW5nZXMgbWFkZSB0byBwcm9ncmFtIHNvdXJjZQotZmlsZXMuICBUaGUgcHVycG9zZSBvZiB0aGlzIGlzIHNvIHRoYXQgcGVvcGxlIGludmVzdGlnYXRpbmcgYnVncyBpbiB0aGUKLWZ1dHVyZSB3aWxsIGtub3cgYWJvdXQgdGhlIGNoYW5nZXMgdGhhdCBtaWdodCBoYXZlIGludHJvZHVjZWQgdGhlIGJ1Zy4KLU9mdGVuIGEgbmV3IGJ1ZyBjYW4gYmUgZm91bmQgYnkgbG9va2luZyBhdCB3aGF0IHdhcyByZWNlbnRseSBjaGFuZ2VkLgotTW9yZSBpbXBvcnRhbnRseSwgY2hhbmdlIGxvZ3MgY2FuIGhlbHAgeW91IGVsaW1pbmF0ZSBjb25jZXB0dWFsCi1pbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBkaWZmZXJlbnQgcGFydHMgb2YgYSBwcm9ncmFtLCBieSBnaXZpbmcgeW91IGEKLWhpc3Rvcnkgb2YgaG93IHRoZSBjb25mbGljdGluZyBjb25jZXB0cyBhcm9zZSBhbmQgd2hvIHRoZXkgY2FtZSBmcm9tLgotCi1AbWVudQotKiBDaGFuZ2UgTG9nIENvbmNlcHRzOjogICAgICAgICAKLSogU3R5bGUgb2YgQ2hhbmdlIExvZ3M6OiAgICAgICAgCi0qIFNpbXBsZSBDaGFuZ2VzOjogICAgICAgICAgICAgIAotKiBDb25kaXRpb25hbCBDaGFuZ2VzOjogICAgICAgICAKLUBlbmQgbWVudQotCi1Abm9kZSBDaGFuZ2UgTG9nIENvbmNlcHRzCi1Ac3Vic2VjdGlvbiBDaGFuZ2UgTG9nIENvbmNlcHRzCi0KLVlvdSBjYW4gdGhpbmsgb2YgdGhlIGNoYW5nZSBsb2cgYXMgYSBjb25jZXB0dWFsIGBgdW5kbyBsaXN0Jycgd2hpY2gKLWV4cGxhaW5zIGhvdyBlYXJsaWVyIHZlcnNpb25zIHdlcmUgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgdmVyc2lvbi4KLVBlb3BsZSBjYW4gc2VlIHRoZSBjdXJyZW50IHZlcnNpb247IHRoZXkgZG9uJ3QgbmVlZCB0aGUgY2hhbmdlIGxvZwotdG8gdGVsbCB0aGVtIHdoYXQgaXMgaW4gaXQuICBXaGF0IHRoZXkgd2FudCBmcm9tIGEgY2hhbmdlIGxvZyBpcyBhCi1jbGVhciBleHBsYW5hdGlvbiBvZiBob3cgdGhlIGVhcmxpZXIgdmVyc2lvbiBkaWZmZXJlZC4KLQotVGhlIGNoYW5nZSBsb2cgZmlsZSBpcyBub3JtYWxseSBjYWxsZWQgQGZpbGV7Q2hhbmdlTG9nfSBhbmQgY292ZXJzIGFuCi1lbnRpcmUgZGlyZWN0b3J5LiAgRWFjaCBkaXJlY3RvcnkgY2FuIGhhdmUgaXRzIG93biBjaGFuZ2UgbG9nLCBvciBhCi1kaXJlY3RvcnkgY2FuIHVzZSB0aGUgY2hhbmdlIGxvZyBvZiBpdHMgcGFyZW50IGRpcmVjdG9yeS0taXQncyB1cCB0bwoteW91LgotCi1Bbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIHJlY29yZCBjaGFuZ2UgbG9nIGluZm9ybWF0aW9uIHdpdGggYSB2ZXJzaW9uCi1jb250cm9sIHN5c3RlbSBzdWNoIGFzIFJDUyBvciBDVlMuICBUaGlzIGNhbiBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseQotdG8gYSBAZmlsZXtDaGFuZ2VMb2d9IGZpbGUuCi0KLVRoZXJlJ3Mgbm8gbmVlZCB0byBkZXNjcmliZSB0aGUgZnVsbCBwdXJwb3NlIG9mIHRoZSBjaGFuZ2VzIG9yIGhvdyB0aGV5Ci13b3JrIHRvZ2V0aGVyLiAgSWYgeW91IHRoaW5rIHRoYXQgYSBjaGFuZ2UgY2FsbHMgZm9yIGV4cGxhbmF0aW9uLCB5b3UncmUKLXByb2JhYmx5IHJpZ2h0LiAgUGxlYXNlIGRvIGV4cGxhaW4gaXQtLS1idXQgcGxlYXNlIHB1dCB0aGUgZXhwbGFuYXRpb24KLWluIGNvbW1lbnRzIGluIHRoZSBjb2RlLCB3aGVyZSBwZW9wbGUgd2lsbCBzZWUgaXQgd2hlbmV2ZXIgdGhleSBzZWUgdGhlCi1jb2RlLiAgRm9yIGV4YW1wbGUsIGBgTmV3IGZ1bmN0aW9uJycgaXMgZW5vdWdoIGZvciB0aGUgY2hhbmdlIGxvZyB3aGVuCi15b3UgYWRkIGEgZnVuY3Rpb24sIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIGEgY29tbWVudCBiZWZvcmUgdGhlCi1mdW5jdGlvbiBkZWZpbml0aW9uIHRvIGV4cGxhaW4gd2hhdCBpdCBkb2VzLgotCi1Ib3dldmVyLCBzb21ldGltZXMgaXQgaXMgdXNlZnVsIHRvIHdyaXRlIG9uZSBsaW5lIHRvIGRlc2NyaWJlIHRoZQotb3ZlcmFsbCBwdXJwb3NlIG9mIGEgYmF0Y2ggb2YgY2hhbmdlcy4KLQotVGhlIGVhc2llc3Qgd2F5IHRvIGFkZCBhbiBlbnRyeSB0byBAZmlsZXtDaGFuZ2VMb2d9IGlzIHdpdGggdGhlIEVtYWNzCi1jb21tYW5kIEBrYmR7TS14IGFkZC1jaGFuZ2UtbG9nLWVudHJ5fS4gIEFuIGVudHJ5IHNob3VsZCBoYXZlIGFuCi1hc3RlcmlzaywgdGhlIG5hbWUgb2YgdGhlIGNoYW5nZWQgZmlsZSwgYW5kIHRoZW4gaW4gcGFyZW50aGVzZXMgdGhlIG5hbWUKLW9mIHRoZSBjaGFuZ2VkIGZ1bmN0aW9ucywgdmFyaWFibGVzIG9yIHdoYXRldmVyLCBmb2xsb3dlZCBieSBhIGNvbG9uLgotVGhlbiBkZXNjcmliZSB0aGUgY2hhbmdlcyB5b3UgbWFkZSB0byB0aGF0IGZ1bmN0aW9uIG9yIHZhcmlhYmxlLgotCi1Abm9kZSBTdHlsZSBvZiBDaGFuZ2UgTG9ncwotQHN1YnNlY3Rpb24gU3R5bGUgb2YgQ2hhbmdlIExvZ3MKLQotSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBjaGFuZ2UgbG9nIGVudHJpZXM6Ci0KLUBleGFtcGxlCi0qIHJlZ2lzdGVyLmVsIChpbnNlcnQtcmVnaXN0ZXIpOiBSZXR1cm4gbmlsLgotKGp1bXAtdG8tcmVnaXN0ZXIpOiBMaWtld2lzZS4KLQotKiBzb3J0LmVsIChzb3J0LXN1YnIpOiBSZXR1cm4gbmlsLgotCi0qIHRleC1tb2RlLmVsICh0ZXgtYmlidGV4LWZpbGUsIHRleC1maWxlLCB0ZXgtcmVnaW9uKToKLVJlc3RhcnQgdGhlIHRleCBzaGVsbCBpZiBwcm9jZXNzIGlzIGdvbmUgb3Igc3RvcHBlZC4KLSh0ZXgtc2hlbGwtcnVubmluZyk6IE5ldyBmdW5jdGlvbi4KLQotKiBleHByLmMgKHN0b3JlX29uZV9hcmcpOiBSb3VuZCBzaXplIHVwIGZvciBtb3ZlX2Jsb2NrX3RvX3JlZy4KLShleHBhbmRfY2FsbCk6IFJvdW5kIHVwIHdoZW4gZW1pdHRpbmcgVVNFIGluc25zLgotKiBzdG10LmMgKGFzc2lnbl9wYXJtcyk6IFJvdW5kIHNpemUgdXAgZm9yIG1vdmVfYmxvY2tfZnJvbV9yZWcuCi1AZW5kIGV4YW1wbGUKLQotSXQncyBpbXBvcnRhbnQgdG8gbmFtZSB0aGUgY2hhbmdlZCBmdW5jdGlvbiBvciB2YXJpYWJsZSBpbiBmdWxsLiAgRG9uJ3QKLWFiYnJldmlhdGUgZnVuY3Rpb24gb3IgdmFyaWFibGUgbmFtZXMsIGFuZCBkb24ndCBjb21iaW5lIHRoZW0uCi1TdWJzZXF1ZW50IG1haW50YWluZXJzIHdpbGwgb2Z0ZW4gc2VhcmNoIGZvciBhIGZ1bmN0aW9uIG5hbWUgdG8gZmluZCBhbGwKLXRoZSBjaGFuZ2UgbG9nIGVudHJpZXMgdGhhdCBwZXJ0YWluIHRvIGl0OyBpZiB5b3UgYWJicmV2aWF0ZSB0aGUgbmFtZSwKLXRoZXkgd29uJ3QgZmluZCBpdCB3aGVuIHRoZXkgc2VhcmNoLgotCi1Gb3IgZXhhbXBsZSwgc29tZSBwZW9wbGUgYXJlIHRlbXB0ZWQgdG8gYWJicmV2aWF0ZSBncm91cHMgb2YgZnVuY3Rpb24KLW5hbWVzIGJ5IHdyaXRpbmcgQHNhbXB7KiByZWdpc3Rlci5lbCAoQHtpbnNlcnQsanVtcC10b0B9LXJlZ2lzdGVyKX07Ci10aGlzIGlzIG5vdCBhIGdvb2QgaWRlYSwgc2luY2Ugc2VhcmNoaW5nIGZvciBAY29kZXtqdW1wLXRvLXJlZ2lzdGVyfSBvcgotQGNvZGV7aW5zZXJ0LXJlZ2lzdGVyfSB3b3VsZCBub3QgZmluZCB0aGF0IGVudHJ5LgotCi1TZXBhcmF0ZSB1bnJlbGF0ZWQgY2hhbmdlIGxvZyBlbnRyaWVzIHdpdGggYmxhbmsgbGluZXMuICBXaGVuIHR3bwotZW50cmllcyByZXByZXNlbnQgcGFydHMgb2YgdGhlIHNhbWUgY2hhbmdlLCBzbyB0aGF0IHRoZXkgd29yayB0b2dldGhlciwKLXRoZW4gZG9uJ3QgcHV0IGJsYW5rIGxpbmVzIGJldHdlZW4gdGhlbS4gIFRoZW4geW91IGNhbiBvbWl0IHRoZSBmaWxlCi1uYW1lIGFuZCB0aGUgYXN0ZXJpc2sgd2hlbiBzdWNjZXNzaXZlIGVudHJpZXMgYXJlIGluIHRoZSBzYW1lIGZpbGUuCi0KLUBub2RlIFNpbXBsZSBDaGFuZ2VzCi1Ac3Vic2VjdGlvbiBTaW1wbGUgQ2hhbmdlcwotCi1DZXJ0YWluIHNpbXBsZSBraW5kcyBvZiBjaGFuZ2VzIGRvbid0IG5lZWQgbXVjaCBkZXRhaWwgaW4gdGhlIGNoYW5nZQotbG9nLgotCi1XaGVuIHlvdSBjaGFuZ2UgdGhlIGNhbGxpbmcgc2VxdWVuY2Ugb2YgYSBmdW5jdGlvbiBpbiBhIHNpbXBsZSBmYXNoaW9uLAotYW5kIHlvdSBjaGFuZ2UgYWxsIHRoZSBjYWxsZXJzIG9mIHRoZSBmdW5jdGlvbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBtYWtlCi1pbmRpdmlkdWFsIGVudHJpZXMgZm9yIGFsbCB0aGUgY2FsbGVycyB0aGF0IHlvdSBjaGFuZ2VkLiAgSnVzdCB3cml0ZSBpbgotdGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBgYEFsbCBjYWxsZXJzIGNoYW5nZWQuJycKLQotQGV4YW1wbGUKLSoga2V5Ym9hcmQuYyAoRmNvbW1hbmRfZXhlY3V0ZSk6IE5ldyBhcmcgU1BFQ0lBTC4KLUFsbCBjYWxsZXJzIGNoYW5nZWQuCi1AZW5kIGV4YW1wbGUKLQotV2hlbiB5b3UgY2hhbmdlIGp1c3QgY29tbWVudHMgb3IgZG9jIHN0cmluZ3MsIGl0IGlzIGVub3VnaCB0byB3cml0ZSBhbgotZW50cnkgZm9yIHRoZSBmaWxlLCB3aXRob3V0IG1lbnRpb25pbmcgdGhlIGZ1bmN0aW9ucy4gIEp1c3QgYGBEb2MKLWZpeGVzJycgaXMgZW5vdWdoIGZvciB0aGUgY2hhbmdlIGxvZy4KLQotVGhlcmUncyBubyBuZWVkIHRvIG1ha2UgY2hhbmdlIGxvZyBlbnRyaWVzIGZvciBkb2N1bWVudGF0aW9uIGZpbGVzLgotVGhpcyBpcyBiZWNhdXNlIGRvY3VtZW50YXRpb24gaXMgbm90IHN1c2NlcHRpYmxlIHRvIGJ1Z3MgdGhhdCBhcmUgaGFyZAotdG8gZml4LiAgRG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBjb25zaXN0IG9mIHBhcnRzIHRoYXQgbXVzdCBpbnRlcmFjdCBpbiBhCi1wcmVjaXNlbHkgZW5naW5lZXJlZCBmYXNoaW9uLiAgVG8gY29ycmVjdCBhbiBlcnJvciwgeW91IG5lZWQgbm90IGtub3cKLXRoZSBoaXN0b3J5IG9mIHRoZSBlcnJvbmVvdXMgcGFzc2FnZTsgaXQgaXMgZW5vdWdoIHRvIGNvbXBhcmUgd2hhdCB0aGUKLWRvY3VtZW50YXRpb24gc2F5cyB3aXRoIHRoZSB3YXkgdGhlIHByb2dyYW0gYWN0dWFsbHkgd29ya3MuCi0KLUBub2RlIENvbmRpdGlvbmFsIENoYW5nZXMKLUBzdWJzZWN0aW9uIENvbmRpdGlvbmFsIENoYW5nZXMKLQotQyBwcm9ncmFtcyBvZnRlbiBjb250YWluIGNvbXBpbGUtdGltZSBAY29kZXsjaWZ9IGNvbmRpdGlvbmFscy4gIE1hbnkKLWNoYW5nZXMgYXJlIGNvbmRpdGlvbmFsOyBzb21ldGltZXMgeW91IGFkZCBhIG5ldyBkZWZpbml0aW9uIHdoaWNoIGlzCi1lbnRpcmVseSBjb250YWluZWQgaW4gYSBjb25kaXRpb25hbC4gIEl0IGlzIHZlcnkgdXNlZnVsIHRvIGluZGljYXRlIGluCi10aGUgY2hhbmdlIGxvZyB0aGUgY29uZGl0aW9ucyBmb3Igd2hpY2ggdGhlIGNoYW5nZSBhcHBsaWVzLgotCi1PdXIgY29udmVudGlvbiBmb3IgaW5kaWNhdGluZyBjb25kaXRpb25hbCBjaGFuZ2VzIGlzIHRvIHVzZSBzcXVhcmUKLWJyYWNrZXRzIGFyb3VuZCB0aGUgbmFtZSBvZiB0aGUgY29uZGl0aW9uLgotCi1IZXJlIGlzIGEgc2ltcGxlIGV4YW1wbGUsIGRlc2NyaWJpbmcgYSBjaGFuZ2Ugd2hpY2ggaXMgY29uZGl0aW9uYWwgYnV0Ci1kb2VzIG5vdCBoYXZlIGEgZnVuY3Rpb24gb3IgZW50aXR5IG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0OgotCi1AZXhhbXBsZQotKiB4dGVybS5jIFtTT0xBUklTMl06IEluY2x1ZGUgc3RyaW5nLmguCi1AZW5kIGV4YW1wbGUKLQotSGVyZSBpcyBhbiBlbnRyeSBkZXNjcmliaW5nIGEgbmV3IGRlZmluaXRpb24gd2hpY2ggaXMgZW50aXJlbHkKLWNvbmRpdGlvbmFsLiAgVGhpcyBuZXcgZGVmaW5pdGlvbiBmb3IgdGhlIG1hY3JvIEBjb2Rle0ZSQU1FX1dJTkRPV19QfSBpcwotdXNlZCBvbmx5IHdoZW4gQGNvZGV7SEFWRV9YX1dJTkRPV1N9IGlzIGRlZmluZWQ6Ci0KLUBleGFtcGxlCi0qIGZyYW1lLmggW0hBVkVfWF9XSU5ET1dTXSAoRlJBTUVfV0lORE9XX1ApOiBNYWNybyBkZWZpbmVkLgotQGVuZCBleGFtcGxlCi0KLUhlcmUgaXMgYW4gZW50cnkgZm9yIGEgY2hhbmdlIHdpdGhpbiB0aGUgZnVuY3Rpb24gQGNvZGV7aW5pdF9kaXNwbGF5fSwKLXdob3NlIGRlZmluaXRpb24gYXMgYSB3aG9sZSBpcyB1bmNvbmRpdGlvbmFsLCBidXQgdGhlIGNoYW5nZXMgdGhlbXNlbHZlcwotYXJlIGNvbnRhaW5lZCBpbiBhIEBzYW1weyNpZmRlZiBIQVZFX0xJQk5DVVJTRVN9IGNvbmRpdGlvbmFsOgotCi1AZXhhbXBsZQotKiBkaXNwbmV3LmMgKGluaXRfZGlzcGxheSkgW0hBVkVfTElCTkNVUlNFU106IElmIFgsIGNhbGwgdGdldGVudC4KLUBlbmQgZXhhbXBsZQotCi1IZXJlIGlzIGFuIGVudHJ5IGZvciBhIGNoYW5nZSB0aGF0IHRha2VzIGFmZmVjdCBvbmx5IHdoZW4KLWEgY2VydGFpbiBtYWNybyBpcyBAZW1waHtub3R9IGRlZmluZWQ6Ci0KLUBleGFtcGxlCi0oZ2V0aG9zdG5hbWUpIFshSEFWRV9TT0NLRVRTXTogUmVwbGFjZSB3aXRoIHdpbnNvY2sgdmVyc2lvbi4KLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBNYW4gUGFnZXMKLUBzZWN0aW9uIE1hbiBQYWdlcwotCi1JbiB0aGUgR05VIHByb2plY3QsIG1hbiBwYWdlcyBhcmUgc2Vjb25kYXJ5LiAgSXQgaXMgbm90IG5lY2Vzc2FyeSBvcgotZXhwZWN0ZWQgZm9yIGV2ZXJ5IEdOVSBwcm9ncmFtIHRvIGhhdmUgYSBtYW4gcGFnZSwgYnV0IHNvbWUgb2YgdGhlbSBkby4KLUl0J3MgeW91ciBjaG9pY2Ugd2hldGhlciB0byBpbmNsdWRlIGEgbWFuIHBhZ2UgaW4geW91ciBwcm9ncmFtLgotCi1XaGVuIHlvdSBtYWtlIHRoaXMgZGVjaXNpb24sIGNvbnNpZGVyIHRoYXQgc3VwcG9ydGluZyBhIG1hbiBwYWdlCi1yZXF1aXJlcyBjb250aW51YWwgZWZmb3J0IGVhY2ggdGltZSB0aGUgcHJvZ3JhbSBpcyBjaGFuZ2VkLiAgVGhlIHRpbWUKLXlvdSBzcGVuZCBvbiB0aGUgbWFuIHBhZ2UgaXMgdGltZSB0YWtlbiBhd2F5IGZyb20gbW9yZSB1c2VmdWwgd29yay4KLQotRm9yIGEgc2ltcGxlIHByb2dyYW0gd2hpY2ggY2hhbmdlcyBsaXR0bGUsIHVwZGF0aW5nIHRoZSBtYW4gcGFnZSBtYXkgYmUKLWEgc21hbGwgam9iLiAgVGhlbiB0aGVyZSBpcyBsaXR0bGUgcmVhc29uIG5vdCB0byBpbmNsdWRlIGEgbWFuIHBhZ2UsIGlmCi15b3UgaGF2ZSBvbmUuCi0KLUZvciBhIGxhcmdlIHByb2dyYW0gdGhhdCBjaGFuZ2VzIGEgZ3JlYXQgZGVhbCwgdXBkYXRpbmcgYSBtYW4gcGFnZSBtYXkKLWJlIGEgc3Vic3RhbnRpYWwgYnVyZGVuLiAgSWYgYSB1c2VyIG9mZmVycyB0byBkb25hdGUgYSBtYW4gcGFnZSwgeW91IG1heQotZmluZCB0aGlzIGdpZnQgY29zdGx5IHRvIGFjY2VwdC4gIEl0IG1heSBiZSBiZXR0ZXIgdG8gcmVmdXNlIHRoZSBtYW4KLXBhZ2UgdW5sZXNzIHRoZSBzYW1lIHBlcnNvbiBhZ3JlZXMgdG8gdGFrZSBmdWxsIHJlc3BvbnNpYmlsaXR5IGZvcgotbWFpbnRhaW5pbmcgaXQtLS1zbyB0aGF0IHlvdSBjYW4gd2FzaCB5b3VyIGhhbmRzIG9mIGl0IGVudGlyZWx5LiAgSWYKLXRoaXMgdm9sdW50ZWVyIGxhdGVyIGNlYXNlcyB0byBkbyB0aGUgam9iLCB0aGVuIGRvbid0IGZlZWwgb2JsaWdlZCB0bwotcGljayBpdCB1cCB5b3Vyc2VsZjsgaXQgbWF5IGJlIGJldHRlciB0byB3aXRoZHJhdyB0aGUgbWFuIHBhZ2UgZnJvbSB0aGUKLWRpc3RyaWJ1dGlvbiB1bnRpbCBzb21lb25lIGVsc2UgYWdyZWVzIHRvIHVwZGF0ZSBpdC4KLQotV2hlbiBhIHByb2dyYW0gY2hhbmdlcyBvbmx5IGEgbGl0dGxlLCB5b3UgbWF5IGZlZWwgdGhhdCB0aGUKLWRpc2NyZXBhbmNpZXMgYXJlIHNtYWxsIGVub3VnaCB0aGF0IHRoZSBtYW4gcGFnZSByZW1haW5zIHVzZWZ1bCB3aXRob3V0Ci11cGRhdGluZy4gIElmIHNvLCBwdXQgYSBwcm9taW5lbnQgbm90ZSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1hbgotcGFnZSBleHBsYWluaW5nIHRoYXQgeW91IGRvbid0IG1haW50YWluIGl0IGFuZCB0aGF0IHRoZSBUZXhpbmZvIG1hbnVhbAotaXMgbW9yZSBhdXRob3JpdGF0aXZlLiAgVGhlIG5vdGUgc2hvdWxkIHNheSBob3cgdG8gYWNjZXNzIHRoZSBUZXhpbmZvCi1kb2N1bWVudGF0aW9uLgotCi1Abm9kZSBSZWFkaW5nIG90aGVyIE1hbnVhbHMKLUBzZWN0aW9uIFJlYWRpbmcgb3RoZXIgTWFudWFscwotCi1UaGVyZSBtYXkgYmUgbm9uLWZyZWUgYm9va3Mgb3IgZG9jdW1lbnRhdGlvbiBmaWxlcyB0aGF0IGRlc2NyaWJlIHRoZQotcHJvZ3JhbSB5b3UgYXJlIGRvY3VtZW50aW5nLgotCi1JdCBpcyBvayB0byB1c2UgdGhlc2UgZG9jdW1lbnRzIGZvciByZWZlcmVuY2UsIGp1c3QgYXMgdGhlIGF1dGhvciBvZiBhCi1uZXcgYWxnZWJyYSB0ZXh0Ym9vayBjYW4gcmVhZCBvdGhlciBib29rcyBvbiBhbGdlYnJhLiAgQSBsYXJnZSBwb3J0aW9uCi1vZiBhbnkgbm9uLWZpY3Rpb24gYm9vayBjb25zaXN0cyBvZiBmYWN0cywgaW4gdGhpcyBjYXNlIGZhY3RzIGFib3V0IGhvdwotYSBjZXJ0YWluIHByb2dyYW0gd29ya3MsIGFuZCB0aGVzZSBmYWN0cyBhcmUgbmVjZXNzYXJpbHkgdGhlIHNhbWUgZm9yCi1ldmVyeW9uZSB3aG8gd3JpdGVzIGFib3V0IHRoZSBzdWJqZWN0LiAgQnV0IGJlIGNhcmVmdWwgbm90IHRvIGNvcHkgeW91cgotb3V0bGluZSBzdHJ1Y3R1cmUsIHdvcmRpbmcsIHRhYmxlcyBvciBleGFtcGxlcyBmcm9tIHByZWV4aXN0aW5nIG5vbi1mcmVlCi1kb2N1bWVudGF0aW9uLiAgQ29weWluZyBmcm9tIGZyZWUgZG9jdW1lbnRhdGlvbiBtYXkgYmUgb2s7IHBsZWFzZSBjaGVjawotd2l0aCB0aGUgRlNGIGFib3V0IHRoZSBpbmRpdmlkdWFsIGNhc2UuCi0KLUBub2RlIE1hbmFnaW5nIFJlbGVhc2VzCi1AY2hhcHRlciBUaGUgUmVsZWFzZSBQcm9jZXNzCi0KLU1ha2luZyBhIHJlbGVhc2UgaXMgbW9yZSB0aGFuIGp1c3QgYnVuZGxpbmcgdXAgeW91ciBzb3VyY2UgZmlsZXMgaW4gYQotdGFyIGZpbGUgYW5kIHB1dHRpbmcgaXQgdXAgZm9yIEZUUC4gIFlvdSBzaG91bGQgc2V0IHVwIHlvdXIgc29mdHdhcmUgc28KLXRoYXQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcnVuIG9uIGEgdmFyaWV0eSBvZiBzeXN0ZW1zLiAgWW91ciBNYWtlZmlsZQotc2hvdWxkIGNvbmZvcm0gdG8gdGhlIEdOVSBzdGFuZGFyZHMgZGVzY3JpYmVkIGJlbG93LCBhbmQgeW91ciBkaXJlY3RvcnkKLWxheW91dCBzaG91bGQgYWxzbyBjb25mb3JtIHRvIHRoZSBzdGFuZGFyZHMgZGlzY3Vzc2VkIGJlbG93LiAgRG9pbmcgc28KLW1ha2VzIGl0IGVhc3kgdG8gaW5jbHVkZSB5b3VyIHBhY2thZ2UgaW50byB0aGUgbGFyZ2VyIGZyYW1ld29yayBvZgotYWxsIEdOVSBzb2Z0d2FyZS4KLQotQG1lbnUKLSogQ29uZmlndXJhdGlvbjo6ICAgICAgICAgICAgICAgSG93IENvbmZpZ3VyYXRpb24gU2hvdWxkIFdvcmsKLSogTWFrZWZpbGUgQ29udmVudGlvbnM6OglNYWtlZmlsZSBDb252ZW50aW9ucwotKiBSZWxlYXNlczo6ICAgICAgICAgICAgICAgICAgICBNYWtpbmcgUmVsZWFzZXMKLUBlbmQgbWVudQotCi1Abm9kZSBDb25maWd1cmF0aW9uCi1Ac2VjdGlvbiBIb3cgQ29uZmlndXJhdGlvbiBTaG91bGQgV29yawotCi1FYWNoIEdOVSBkaXN0cmlidXRpb24gc2hvdWxkIGNvbWUgd2l0aCBhIHNoZWxsIHNjcmlwdCBuYW1lZAotQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgc2NyaXB0IGlzIGdpdmVuIGFyZ3VtZW50cyB3aGljaCBkZXNjcmliZSB0aGUKLWtpbmQgb2YgbWFjaGluZSBhbmQgc3lzdGVtIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIHByb2dyYW0gZm9yLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgbXVzdCByZWNvcmQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzbwotdGhhdCB0aGV5IGFmZmVjdCBjb21waWxhdGlvbi4KLQotT25lIHdheSB0byBkbyB0aGlzIGlzIHRvIG1ha2UgYSBsaW5rIGZyb20gYSBzdGFuZGFyZCBuYW1lIHN1Y2ggYXMKLUBmaWxle2NvbmZpZy5ofSB0byB0aGUgcHJvcGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIGNob3NlbiBzeXN0ZW0uCi1JZiB5b3UgdXNlIHRoaXMgdGVjaG5pcXVlLCB0aGUgZGlzdHJpYnV0aW9uIHNob3VsZCBAZW1waHtub3R9IGNvbnRhaW4gYQotZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuaH0uICBUaGlzIGlzIHNvIHRoYXQgcGVvcGxlIHdvbid0IGJlIGFibGUgdG8KLWJ1aWxkIHRoZSBwcm9ncmFtIHdpdGhvdXQgY29uZmlndXJpbmcgaXQgZmlyc3QuCi0KLUFub3RoZXIgdGhpbmcgdGhhdCBAY29kZXtjb25maWd1cmV9IGNhbiBkbyBpcyB0byBlZGl0IHRoZSBNYWtlZmlsZS4gIElmCi15b3UgZG8gdGhpcywgdGhlIGRpc3RyaWJ1dGlvbiBzaG91bGQgQGVtcGh7bm90fSBjb250YWluIGEgZmlsZSBuYW1lZAotQGZpbGV7TWFrZWZpbGV9LiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluY2x1ZGUgYSBmaWxlIEBmaWxle01ha2VmaWxlLmlufSB3aGljaAotY29udGFpbnMgdGhlIGlucHV0IHVzZWQgZm9yIGVkaXRpbmcuICBPbmNlIGFnYWluLCB0aGlzIGlzIHNvIHRoYXQgcGVvcGxlCi13b24ndCBiZSBhYmxlIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIHdpdGhvdXQgY29uZmlndXJpbmcgaXQgZmlyc3QuCi0KLUlmIEBjb2Rle2NvbmZpZ3VyZX0gZG9lcyB3cml0ZSB0aGUgQGZpbGV7TWFrZWZpbGV9LCB0aGVuIEBmaWxle01ha2VmaWxlfQotc2hvdWxkIGhhdmUgYSB0YXJnZXQgbmFtZWQgQGZpbGV7TWFrZWZpbGV9IHdoaWNoIGNhdXNlcyBAY29kZXtjb25maWd1cmV9Ci10byBiZSByZXJ1biwgc2V0dGluZyB1cCB0aGUgc2FtZSBjb25maWd1cmF0aW9uIHRoYXQgd2FzIHNldCB1cCBsYXN0Ci10aW1lLiAgVGhlIGZpbGVzIHRoYXQgQGNvZGV7Y29uZmlndXJlfSByZWFkcyBzaG91bGQgYmUgbGlzdGVkIGFzCi1kZXBlbmRlbmNpZXMgb2YgQGZpbGV7TWFrZWZpbGV9LgotCi1BbGwgdGhlIGZpbGVzIHdoaWNoIGFyZSBvdXRwdXQgZnJvbSB0aGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkCi1oYXZlIGNvbW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgZXhwbGFpbmluZyB0aGF0IHRoZXkgd2VyZSBnZW5lcmF0ZWQKLWF1dG9tYXRpY2FsbHkgdXNpbmcgQGNvZGV7Y29uZmlndXJlfS4gIFRoaXMgaXMgc28gdGhhdCB1c2VycyB3b24ndCB0aGluawotb2YgdHJ5aW5nIHRvIGVkaXQgdGhlbSBieSBoYW5kLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIHdyaXRlIGEgZmlsZSBuYW1lZCBAZmlsZXtjb25maWcuc3RhdHVzfQotd2hpY2ggZGVzY3JpYmVzIHdoaWNoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB3ZXJlIHNwZWNpZmllZCB3aGVuIHRoZQotcHJvZ3JhbSB3YXMgbGFzdCBjb25maWd1cmVkLiAgVGhpcyBmaWxlIHNob3VsZCBiZSBhIHNoZWxsIHNjcmlwdCB3aGljaCwKLWlmIHJ1biwgd2lsbCByZWNyZWF0ZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uLgotCi1UaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIGFjY2VwdCBhbiBvcHRpb24gb2YgdGhlIGZvcm0KLUBzYW1wey0tc3JjZGlyPUB2YXJ7ZGlybmFtZX19IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZSBzb3VyY2VzIGFyZSBmb3VuZAotKGlmIGl0IGlzIG5vdCB0aGUgY3VycmVudCBkaXJlY3RvcnkpLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBidWlsZAotdGhlIHByb2dyYW0gaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnksIHNvIHRoYXQgdGhlIGFjdHVhbCBzb3VyY2UgZGlyZWN0b3J5Ci1pcyBub3QgbW9kaWZpZWQuCi0KLUlmIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgQHNhbXB7LS1zcmNkaXJ9LCB0aGVuIEBjb2Rle2NvbmZpZ3VyZX0gc2hvdWxkCi1jaGVjayBib3RoIEBmaWxley59IGFuZCBAZmlsZXsuLn0gdG8gc2VlIGlmIGl0IGNhbiBmaW5kIHRoZSBzb3VyY2VzLiAgSWYKLWl0IGZpbmRzIHRoZSBzb3VyY2VzIGluIG9uZSBvZiB0aGVzZSBwbGFjZXMsIGl0IHNob3VsZCB1c2UgdGhlbSBmcm9tCi10aGVyZS4gIE90aGVyd2lzZSwgaXQgc2hvdWxkIHJlcG9ydCB0aGF0IGl0IGNhbm5vdCBmaW5kIHRoZSBzb3VyY2VzLCBhbmQKLXNob3VsZCBleGl0IHdpdGggbm9uemVybyBzdGF0dXMuCi0KLVVzdWFsbHkgdGhlIGVhc3kgd2F5IHRvIHN1cHBvcnQgQHNhbXB7LS1zcmNkaXJ9IGlzIGJ5IGVkaXRpbmcgYQotZGVmaW5pdGlvbiBvZiBAY29kZXtWUEFUSH0gaW50byB0aGUgTWFrZWZpbGUuICBTb21lIHJ1bGVzIG1heSBuZWVkIHRvCi1yZWZlciBleHBsaWNpdGx5IHRvIHRoZSBzcGVjaWZpZWQgc291cmNlIGRpcmVjdG9yeS4gIFRvIG1ha2UgdGhpcwotcG9zc2libGUsIEBjb2Rle2NvbmZpZ3VyZX0gY2FuIGFkZCB0byB0aGUgTWFrZWZpbGUgYSB2YXJpYWJsZSBuYW1lZAotQGNvZGV7c3JjZGlyfSB3aG9zZSB2YWx1ZSBpcyBwcmVjaXNlbHkgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0KLVRoZSBAY29kZXtjb25maWd1cmV9IHNjcmlwdCBzaG91bGQgYWxzbyB0YWtlIGFuIGFyZ3VtZW50IHdoaWNoIHNwZWNpZmllcyB0aGUKLXR5cGUgb2Ygc3lzdGVtIHRvIGJ1aWxkIHRoZSBwcm9ncmFtIGZvci4gIFRoaXMgYXJndW1lbnQgc2hvdWxkIGxvb2sgbGlrZQotdGhpczoKLQotQGV4YW1wbGUKLUB2YXJ7Y3B1fS1AdmFye2NvbXBhbnl9LUB2YXJ7c3lzdGVtfQotQGVuZCBleGFtcGxlCi0KLUZvciBleGFtcGxlLCBhIFN1biAzIG1pZ2h0IGJlIEBzYW1we202OGstc3VuLXN1bm9zNC4xfS4KLQotVGhlIEBjb2Rle2NvbmZpZ3VyZX0gc2NyaXB0IG5lZWRzIHRvIGJlIGFibGUgdG8gZGVjb2RlIGFsbCBwbGF1c2libGUKLWFsdGVybmF0aXZlcyBmb3IgaG93IHRvIGRlc2NyaWJlIGEgbWFjaGluZS4gIFRodXMsIEBzYW1we3N1bjMtc3Vub3M0LjF9Ci13b3VsZCBiZSBhIHZhbGlkIGFsaWFzLiAgRm9yIG1hbnkgcHJvZ3JhbXMsIEBzYW1we3ZheC1kZWMtdWx0cml4fSB3b3VsZAotYmUgYW4gYWxpYXMgZm9yIEBzYW1we3ZheC1kZWMtYnNkfSwgc2ltcGx5IGJlY2F1c2UgdGhlIGRpZmZlcmVuY2VzCi1iZXR3ZWVuIFVsdHJpeCBhbmQgQHNje0JTRH0gYXJlIHJhcmVseSBub3RpY2VhYmxlLCBidXQgYSBmZXcgcHJvZ3JhbXMKLW1pZ2h0IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlbS4KLUBjIFJlYWwgNC40QlNEIG5vdyBydW5zIG9uIHNvbWUgU3Vucy4KLQotVGhlcmUgaXMgYSBzaGVsbCBzY3JpcHQgY2FsbGVkIEBmaWxle2NvbmZpZy5zdWJ9IHRoYXQgeW91IGNhbiB1c2UKLWFzIGEgc3Vicm91dGluZSB0byB2YWxpZGF0ZSBzeXN0ZW0gdHlwZXMgYW5kIGNhbm9uaWNhbGl6ZSBhbGlhc2VzLgotCi1PdGhlciBvcHRpb25zIGFyZSBwZXJtaXR0ZWQgdG8gc3BlY2lmeSBpbiBtb3JlIGRldGFpbCB0aGUgc29mdHdhcmUKLW9yIGhhcmR3YXJlIHByZXNlbnQgb24gdGhlIG1hY2hpbmUsIGFuZCBpbmNsdWRlIG9yIGV4Y2x1ZGUgb3B0aW9uYWwKLXBhcnRzIG9mIHRoZSBwYWNrYWdlOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC0tZW5hYmxlLUB2YXJ7ZmVhdHVyZX1AcntbfT1AdmFye3BhcmFtZXRlcn1AcntdfQotQ29uZmlndXJlIHRoZSBwYWNrYWdlIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGFuIG9wdGlvbmFsIHVzZXItbGV2ZWwKLWZhY2lsaXR5IGNhbGxlZCBAdmFye2ZlYXR1cmV9LiAgVGhpcyBhbGxvd3MgdXNlcnMgdG8gY2hvb3NlIHdoaWNoCi1vcHRpb25hbCBmZWF0dXJlcyB0byBpbmNsdWRlLiAgR2l2aW5nIGFuIG9wdGlvbmFsIEB2YXJ7cGFyYW1ldGVyfSBvZgotQHNhbXB7bm99IHNob3VsZCBvbWl0IEB2YXJ7ZmVhdHVyZX0sIGlmIGl0IGlzIGJ1aWx0IGJ5IGRlZmF1bHQuCi0KLU5vIEBzYW1wey0tZW5hYmxlfSBvcHRpb24gc2hvdWxkIEBzdHJvbmd7ZXZlcn0gY2F1c2Ugb25lIGZlYXR1cmUgdG8KLXJlcGxhY2UgYW5vdGhlci4gIE5vIEBzYW1wey0tZW5hYmxlfSBvcHRpb24gc2hvdWxkIGV2ZXIgc3Vic3RpdHV0ZSBvbmUKLXVzZWZ1bCBiZWhhdmlvciBmb3IgYW5vdGhlciB1c2VmdWwgYmVoYXZpb3IuICBUaGUgb25seSBwcm9wZXIgdXNlIGZvcgotQHNhbXB7LS1lbmFibGV9IGlzIGZvciBxdWVzdGlvbnMgb2Ygd2hldGhlciB0byBidWlsZCBwYXJ0IG9mIHRoZSBwcm9ncmFtCi1vciBleGNsdWRlIGl0LgotCi1AaXRlbSAtLXdpdGgtQHZhcntwYWNrYWdlfQotQGMgQHJ7W309QHZhcntwYXJhbWV0ZXJ9QHJ7XX0KLVRoZSBwYWNrYWdlIEB2YXJ7cGFja2FnZX0gd2lsbCBiZSBpbnN0YWxsZWQsIHNvIGNvbmZpZ3VyZSB0aGlzIHBhY2thZ2UKLXRvIHdvcmsgd2l0aCBAdmFye3BhY2thZ2V9LgotCi1AYyAgR2l2aW5nIGFuIG9wdGlvbmFsIEB2YXJ7cGFyYW1ldGVyfSBvZgotQGMgQHNhbXB7bm99IHNob3VsZCBvbWl0IEB2YXJ7cGFja2FnZX0sIGlmIGl0IGlzIHVzZWQgYnkgZGVmYXVsdC4KLQotUG9zc2libGUgdmFsdWVzIG9mIEB2YXJ7cGFja2FnZX0gaW5jbHVkZSAKLUBzYW1we2dudS1hc30gKG9yIEBzYW1we2dhc30pLCBAc2FtcHtnbnUtbGR9LCBAc2FtcHtnbnUtbGliY30sCi1Ac2FtcHtnZGJ9LAotQHNhbXB7eH0sIAotYW5kCi1Ac2FtcHt4LXRvb2xraXR9LgotCi1EbyBub3QgdXNlIGEgQHNhbXB7LS13aXRofSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIHRvIHVzZSB0bwotZmluZCBjZXJ0YWluIGZpbGVzLiAgVGhhdCBpcyBvdXRzaWRlIHRoZSBzY29wZSBvZiB3aGF0IEBzYW1wey0td2l0aH0KLW9wdGlvbnMgYXJlIGZvci4KLQotQGl0ZW0gLS1uZnAKLVRoZSB0YXJnZXQgbWFjaGluZSBoYXMgbm8gZmxvYXRpbmcgcG9pbnQgcHJvY2Vzc29yLgotCi1AaXRlbSAtLWdhcwotVGhlIHRhcmdldCBtYWNoaW5lIGFzc2VtYmxlciBpcyBHQVMsIHRoZSBHTlUgYXNzZW1ibGVyLgotVGhpcyBpcyBvYnNvbGV0ZTsgdXNlcnMgc2hvdWxkIHVzZSBAc2FtcHstLXdpdGgtZ251LWFzfSBpbnN0ZWFkLgotCi1AaXRlbSAtLXgKLVRoZSB0YXJnZXQgbWFjaGluZSBoYXMgdGhlIFggV2luZG93IFN5c3RlbSBpbnN0YWxsZWQuCi1UaGlzIGlzIG9ic29sZXRlOyB1c2VycyBzaG91bGQgdXNlIEBzYW1wey0td2l0aC14fSBpbnN0ZWFkLgotQGVuZCB0YWJsZQotCi1BbGwgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHRzIHNob3VsZCBhY2NlcHQgYWxsIG9mIHRoZXNlIGBgZGV0YWlsJycKLW9wdGlvbnMsIHdoZXRoZXIgb3Igbm90IHRoZXkgbWFrZSBhbnkgZGlmZmVyZW5jZSB0byB0aGUgcGFydGljdWxhcgotcGFja2FnZSBhdCBoYW5kLiAgSW4gcGFydGljdWxhciwgdGhleSBzaG91bGQgYWNjZXB0IGFueSBvcHRpb24gdGhhdAotc3RhcnRzIHdpdGggQHNhbXB7LS13aXRoLX0gb3IgQHNhbXB7LS1lbmFibGUtfS4gIFRoaXMgaXMgc28gdXNlcnMgd2lsbAotYmUgYWJsZSB0byBjb25maWd1cmUgYW4gZW50aXJlIEdOVSBzb3VyY2UgdHJlZSBhdCBvbmNlIHdpdGggYSBzaW5nbGUgc2V0Ci1vZiBvcHRpb25zLgotCi1Zb3Ugd2lsbCBub3RlIHRoYXQgdGhlIGNhdGVnb3JpZXMgQHNhbXB7LS13aXRoLX0gYW5kIEBzYW1wey0tZW5hYmxlLX0KLWFyZSBuYXJyb3c6IHRoZXkgQHN0cm9uZ3tkbyBub3R9IHByb3ZpZGUgYSBwbGFjZSBmb3IgYW55IHNvcnQgb2Ygb3B0aW9uCi15b3UgbWlnaHQgdGhpbmsgb2YuICBUaGF0IGlzIGRlbGliZXJhdGUuICBXZSB3YW50IHRvIGxpbWl0IHRoZSBwb3NzaWJsZQotY29uZmlndXJhdGlvbiBvcHRpb25zIGluIEdOVSBzb2Z0d2FyZS4gIFdlIGRvIG5vdCB3YW50IEdOVSBwcm9ncmFtcyB0bwotaGF2ZSBpZGlvc3luY3JhdGljIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KLQotUGFja2FnZXMgdGhhdCBwZXJmb3JtIHBhcnQgb2YgdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MgbWF5IHN1cHBvcnQgY3Jvc3MtY29tcGlsYXRpb24uCi1JbiBzdWNoIGEgY2FzZSwgdGhlIGhvc3QgYW5kIHRhcmdldCBtYWNoaW5lcyBmb3IgdGhlIHByb2dyYW0gbWF5IGJlCi1kaWZmZXJlbnQuICBUaGUgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgc2hvdWxkIG5vcm1hbGx5IHRyZWF0IHRoZQotc3BlY2lmaWVkIHR5cGUgb2Ygc3lzdGVtIGFzIGJvdGggdGhlIGhvc3QgYW5kIHRoZSB0YXJnZXQsIHRodXMgcHJvZHVjaW5nCi1hIHByb2dyYW0gd2hpY2ggd29ya3MgZm9yIHRoZSBzYW1lIHR5cGUgb2YgbWFjaGluZSB0aGF0IGl0IHJ1bnMgb24uCi0KLVRoZSB3YXkgdG8gYnVpbGQgYSBjcm9zcy1jb21waWxlciwgY3Jvc3MtYXNzZW1ibGVyLCBvciB3aGF0IGhhdmUgeW91LCBpcwotdG8gc3BlY2lmeSB0aGUgb3B0aW9uIEBzYW1wey0taG9zdD1AdmFye2hvc3R0eXBlfX0gd2hlbiBydW5uaW5nCi1AY29kZXtjb25maWd1cmV9LiAgVGhpcyBzcGVjaWZpZXMgdGhlIGhvc3Qgc3lzdGVtIHdpdGhvdXQgY2hhbmdpbmcgdGhlCi10eXBlIG9mIHRhcmdldCBzeXN0ZW0uICBUaGUgc3ludGF4IGZvciBAdmFye2hvc3R0eXBlfSBpcyB0aGUgc2FtZSBhcwotZGVzY3JpYmVkIGFib3ZlLgotCi1Cb290c3RyYXBwaW5nIGEgY3Jvc3MtY29tcGlsZXIgcmVxdWlyZXMgY29tcGlsaW5nIGl0IG9uIGEgbWFjaGluZSBvdGhlcgotdGhhbiB0aGUgaG9zdCBpdCB3aWxsIHJ1biBvbi4gIENvbXBpbGF0aW9uIHBhY2thZ2VzIGFjY2VwdCBhCi1jb25maWd1cmF0aW9uIG9wdGlvbiBAc2FtcHstLWJ1aWxkPUB2YXJ7aG9zdHR5cGV9fSBmb3Igc3BlY2lmeWluZyB0aGUKLWNvbmZpZ3VyYXRpb24gb24gd2hpY2ggeW91IHdpbGwgY29tcGlsZSB0aGVtLCBpbiBjYXNlIHRoYXQgaXMgZGlmZmVyZW50Ci1mcm9tIHRoZSBob3N0LgotCi1Qcm9ncmFtcyBmb3Igd2hpY2ggY3Jvc3Mtb3BlcmF0aW9uIGlzIG5vdCBtZWFuaW5nZnVsIG5lZWQgbm90IGFjY2VwdCB0aGUKLUBzYW1wey0taG9zdH0gb3B0aW9uLCBiZWNhdXNlIGNvbmZpZ3VyaW5nIGFuIGVudGlyZSBvcGVyYXRpbmcgc3lzdGVtIGZvcgotY3Jvc3Mtb3BlcmF0aW9uIGlzIG5vdCBhIG1lYW5pbmdmdWwgdGhpbmcuCi0KLVNvbWUgcHJvZ3JhbXMgaGF2ZSB3YXlzIG9mIGNvbmZpZ3VyaW5nIHRoZW1zZWx2ZXMgYXV0b21hdGljYWxseS4gIElmCi15b3VyIHByb2dyYW0gaXMgc2V0IHVwIHRvIGRvIHRoaXMsIHlvdXIgQGNvZGV7Y29uZmlndXJlfSBzY3JpcHQgY2FuIHNpbXBseQotaWdub3JlIG1vc3Qgb2YgaXRzIGFyZ3VtZW50cy4KLQotQGNvbW1lbnQgVGhlIG1ha2VmaWxlIHN0YW5kYXJkcyBhcmUgaW4gYSBzZXBhcmF0ZSBmaWxlIHRoYXQgaXMgYWxzbwotQGNvbW1lbnQgaW5jbHVkZWQgYnkgbWFrZS50ZXhpbmZvLiAgRG9uZSBieSByb2xhbmRAZ251LmFpLm1pdC5lZHUgb24gMS82LzkzLgotQGNvbW1lbnQgRm9yIHRoaXMgZG9jdW1lbnQsIHR1cm4gY2hhcHRlcnMgaW50byBzZWN0aW9ucywgZXRjLgotQGxvd2Vyc2VjdGlvbnMKLUBpbmNsdWRlIG1ha2Utc3Rkcy50ZXhpCi1AcmFpc2VzZWN0aW9ucwotCi1Abm9kZSBSZWxlYXNlcwotQHNlY3Rpb24gTWFraW5nIFJlbGVhc2VzCi0KLVBhY2thZ2UgdGhlIGRpc3RyaWJ1dGlvbiBvZiBAY29kZXtGb28gdmVyc2lvbiA2OS45Nn0gdXAgaW4gYSBnemlwcGVkIHRhcgotZmlsZSB3aXRoIHRoZSBuYW1lIEBmaWxle2Zvby02OS45Ni50YXIuZ3p9LiAgSXQgc2hvdWxkIHVucGFjayBpbnRvIGEKLXN1YmRpcmVjdG9yeSBuYW1lZCBAZmlsZXtmb28tNjkuOTZ9LgotCi1CdWlsZGluZyBhbmQgaW5zdGFsbGluZyB0aGUgcHJvZ3JhbSBzaG91bGQgbmV2ZXIgbW9kaWZ5IGFueSBvZiB0aGUgZmlsZXMKLWNvbnRhaW5lZCBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgVGhpcyBtZWFucyB0aGF0IGFsbCB0aGUgZmlsZXMgdGhhdCBmb3JtCi1wYXJ0IG9mIHRoZSBwcm9ncmFtIGluIGFueSB3YXkgbXVzdCBiZSBjbGFzc2lmaWVkIGludG8gQGRmbntzb3VyY2UKLWZpbGVzfSBhbmQgQGRmbntub24tc291cmNlIGZpbGVzfS4gIFNvdXJjZSBmaWxlcyBhcmUgd3JpdHRlbiBieSBodW1hbnMKLWFuZCBuZXZlciBjaGFuZ2VkIGF1dG9tYXRpY2FsbHk7IG5vbi1zb3VyY2UgZmlsZXMgYXJlIHByb2R1Y2VkIGZyb20KLXNvdXJjZSBmaWxlcyBieSBwcm9ncmFtcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgTWFrZWZpbGUuCi0KLU5hdHVyYWxseSwgYWxsIHRoZSBzb3VyY2UgZmlsZXMgbXVzdCBiZSBpbiB0aGUgZGlzdHJpYnV0aW9uLiAgSXQgaXMgb2theQotdG8gaW5jbHVkZSBub24tc291cmNlIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24sIHByb3ZpZGVkIHRoZXkgYXJlCi11cC10by1kYXRlIGFuZCBtYWNoaW5lLWluZGVwZW5kZW50LCBzbyB0aGF0IGJ1aWxkaW5nIHRoZSBkaXN0cmlidXRpb24KLW5vcm1hbGx5IHdpbGwgbmV2ZXIgbW9kaWZ5IHRoZW0uICBXZSBjb21tb25seSBpbmNsdWRlIG5vbi1zb3VyY2UgZmlsZXMKLXByb2R1Y2VkIGJ5IEJpc29uLCBAY29kZXtsZXh9LCBAVGVYe30sIGFuZCBAY29kZXttYWtlaW5mb307IHRoaXMgaGVscHMgYXZvaWQKLXVubmVjZXNzYXJ5IGRlcGVuZGVuY2llcyBiZXR3ZWVuIG91ciBkaXN0cmlidXRpb25zLCBzbyB0aGF0IHVzZXJzIGNhbgotaW5zdGFsbCB3aGljaGV2ZXIgcGFja2FnZXMgdGhleSB3YW50IHRvIGluc3RhbGwuCi0KLU5vbi1zb3VyY2UgZmlsZXMgdGhhdCBtaWdodCBhY3R1YWxseSBiZSBtb2RpZmllZCBieSBidWlsZGluZyBhbmQKLWluc3RhbGxpbmcgdGhlIHByb2dyYW0gc2hvdWxkIEBzdHJvbmd7bmV2ZXJ9IGJlIGluY2x1ZGVkIGluIHRoZQotZGlzdHJpYnV0aW9uLiAgU28gaWYgeW91IGRvIGRpc3RyaWJ1dGUgbm9uLXNvdXJjZSBmaWxlcywgYWx3YXlzIG1ha2UKLXN1cmUgdGhleSBhcmUgdXAgdG8gZGF0ZSB3aGVuIHlvdSBtYWtlIGEgbmV3IGRpc3RyaWJ1dGlvbi4KLQotTWFrZSBzdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBkaXN0cmlidXRpb24gdW5wYWNrcyAoYXMKLXdlbGwgYXMgYW55IHN1YmRpcmVjdG9yaWVzKSBhcmUgYWxsIHdvcmxkLXdyaXRhYmxlIChvY3RhbCBtb2RlIDc3NykuCi1UaGlzIGlzIHNvIHRoYXQgb2xkIHZlcnNpb25zIG9mIEBjb2Rle3Rhcn0gd2hpY2ggcHJlc2VydmUgdGhlCi1vd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlcyBmcm9tIHRoZSB0YXIgYXJjaGl2ZSB3aWxsIGJlCi1hYmxlIHRvIGV4dHJhY3QgYWxsIHRoZSBmaWxlcyBldmVuIGlmIHRoZSB1c2VyIGlzIHVucHJpdmlsZWdlZC4KLQotTWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGFyZSB3b3JsZC1yZWFkYWJsZS4KLQotTWFrZSBzdXJlIHRoYXQgbm8gZmlsZSBuYW1lIGluIHRoZSBkaXN0cmlidXRpb24gaXMgbW9yZSB0aGFuIDE0Ci1jaGFyYWN0ZXJzIGxvbmcuICBMaWtld2lzZSwgbm8gZmlsZSBjcmVhdGVkIGJ5IGJ1aWxkaW5nIHRoZSBwcm9ncmFtCi1zaG91bGQgaGF2ZSBhIG5hbWUgbG9uZ2VyIHRoYW4gMTQgY2hhcmFjdGVycy4gIFRoZSByZWFzb24gZm9yIHRoaXMgaXMKLXRoYXQgc29tZSBzeXN0ZW1zIGFkaGVyZSB0byBhIGZvb2xpc2ggaW50ZXJwcmV0YXRpb24gb2YgdGhlIFBPU0lYCi1zdGFuZGFyZCwgYW5kIHJlZnVzZSB0byBvcGVuIGEgbG9uZ2VyIG5hbWUsIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgYXMKLXRoZXkgZGlkIGluIHRoZSBwYXN0LgotCi1Eb24ndCBpbmNsdWRlIGFueSBzeW1ib2xpYyBsaW5rcyBpbiB0aGUgZGlzdHJpYnV0aW9uIGl0c2VsZi4gIElmIHRoZSB0YXIKLWZpbGUgY29udGFpbnMgc3ltYm9saWMgbGlua3MsIHRoZW4gcGVvcGxlIGNhbm5vdCBldmVuIHVucGFjayBpdCBvbgotc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgc3ltYm9saWMgbGlua3MuICBBbHNvLCBkb24ndCB1c2UgbXVsdGlwbGUKLW5hbWVzIGZvciBvbmUgZmlsZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMsIGJlY2F1c2UgY2VydGFpbiBmaWxlCi1zeXN0ZW1zIGNhbm5vdCBoYW5kbGUgdGhpcyBhbmQgdGhhdCBwcmV2ZW50cyB1bnBhY2tpbmcgdGhlCi1kaXN0cmlidXRpb24uCi0KLVRyeSB0byBtYWtlIHN1cmUgdGhhdCBhbGwgdGhlIGZpbGUgbmFtZXMgd2lsbCBiZSB1bmlxdWUgb24gTVMtRE9TLiAgQQotbmFtZSBvbiBNUy1ET1MgY29uc2lzdHMgb2YgdXAgdG8gOCBjaGFyYWN0ZXJzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEKLXBlcmlvZCBhbmQgdXAgdG8gdGhyZWUgY2hhcmFjdGVycy4gIE1TLURPUyB3aWxsIHRydW5jYXRlIGV4dHJhCi1jaGFyYWN0ZXJzIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgcGVyaW9kLiAgVGh1cywKLUBmaWxle2Zvb2JhcmhhY2tlci5jfSBhbmQgQGZpbGV7Zm9vYmFyaGFja2VyLm99IGFyZSBub3QgYW1iaWd1b3VzOyB0aGV5Ci1hcmUgdHJ1bmNhdGVkIHRvIEBmaWxle2Zvb2JhcmhhLmN9IGFuZCBAZmlsZXtmb29iYXJoYS5vfSwgd2hpY2ggYXJlCi1kaXN0aW5jdC4KLQotSW5jbHVkZSBpbiB5b3VyIGRpc3RyaWJ1dGlvbiBhIGNvcHkgb2YgdGhlIEBmaWxle3RleGluZm8udGV4fSB5b3UgdXNlZAotdG8gdGVzdCBwcmludCBhbnkgQGZpbGV7Ki50ZXhpbmZvfSBvciBAZmlsZXsqLnRleGl9IGZpbGVzLgotCi1MaWtld2lzZSwgaWYgeW91ciBwcm9ncmFtIHVzZXMgc21hbGwgR05VIHNvZnR3YXJlIHBhY2thZ2VzIGxpa2UgcmVnZXgsCi1nZXRvcHQsIG9ic3RhY2ssIG9yIHRlcm1jYXAsIGluY2x1ZGUgdGhlbSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZpbGUuCi1MZWF2aW5nIHRoZW0gb3V0IHdvdWxkIG1ha2UgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlIGEgbGl0dGxlIHNtYWxsZXIgYXQKLXRoZSBleHBlbnNlIG9mIHBvc3NpYmxlIGluY29udmVuaWVuY2UgdG8gYSB1c2VyIHdobyBkb2Vzbid0IGtub3cgd2hhdAotb3RoZXIgZmlsZXMgdG8gZ2V0LgotCi1AY29udGVudHMKLQotQGJ5ZQotTG9jYWwgdmFyaWFibGVzOgotdXBkYXRlLWRhdGUtbGVhZGluZy1yZWdleHA6ICJAYyBUaGlzIGRhdGUgaXMgYXV0b21hZ2ljYWxseSB1cGRhdGVkIHdoZW4geW91IHNhdmUgdGhpcyBmaWxlOlxuQHNldCBsYXN0dXBkYXRlICIKLXVwZGF0ZS1kYXRlLXRyYWlsaW5nLXJlZ2V4cDogIiIKLWV2YWw6IChsb2FkICIvZ2QvZ251b3JnL3VwZGF0ZS1kYXRlLmVsIikKLWV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndXBkYXRlLWRhdGUpCi1FbmQ6CmRpZmYgLS1naXQgYS9nYXMvQ09OVFJJQlVUT1JTIGIvZ2FzL0NPTlRSSUJVVE9SUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNmZDAzZS4uMDAwMDAwMAotLS0gYS9nYXMvQ09OVFJJQlVUT1JTCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLShUaGlzIGZpbGUgaXMgdW5kZXIgY29uc3RydWN0aW9uLikJCQktKi0gdGV4dCAtKi0KLQotSWYgeW91J3ZlIGNvbnRyaWJ1dGVkIHRvIGdhcyBhbmQgeW91ciBuYW1lIGlzbid0IGxpc3RlZCBoZXJlLCBpdCBpcwotbm90IG1lYW50IGFzIGEgc2xpZ2h0LiAgSSBqdXN0IGRvbid0IGtub3cgYWJvdXQgaXQuICBFbWFpbCBtZSwKLXJhZWJ1cm5AY3lnbnVzLmNvbSBhbmQgSSdsbCBjb3JyZWN0IHRoZSBzaXR1YXRpb24uCi0KLVRoaXMgZmlsZSB3aWxsIGV2ZW50dWFsbHkgYmUgZGVsZXRlZDogVGhlIGdlbmVyYWwgaW5mbyB3aWxsIGdvIGludG8KLXRoZSBkb2N1bWVudGF0aW9uLCBhbmQgaW5mbyBvbiBzcGVjaWZpYyBmaWxlcyB3aWxsIGdvIGludG8gYW4gQVVUSE9SUwotZmlsZSwgYXMgcmVxdWVzdGVkIGJ5IHRoZSBGU0YuCi0KLSsrKysrKysrKysrKysrKysKLQotRGVhbiBFbHNuZXIgd3JvdGUgdGhlIG9yaWdpbmFsIGdhcyBmb3IgdmF4LiAgW21vcmUgZGV0YWlscz9dCi0KLUpheSBGZW5sYXNvbiBtYWludGFpbmVkIGdhcyBmb3IgYSB3aGlsZSwgYWRkaW5nIHN1cHBvcnQgZm9yCi1nZGItc3BlY2lmaWMgZGVidWcgaW5mb3JtYXRpb24gYW5kIHRoZSA2OGsgc2VyaWVzIG1hY2hpbmVzLCBtb3N0IG9mCi10aGUgcHJlcHJvY2Vzc2luZyBwYXNzLCBhbmQgZXh0ZW5zaXZlIGNoYW5nZXMgaW4gbWVzc2FnZXMuYywKLWlucHV0LWZpbGUuYywgd3JpdGUuYy4KLQotSy4gUmljaGFyZCBQaXhsZXkgbWFpbnRhaW5lZCBnYXMgZm9yIGEgd2hpbGUsIGFkZGluZyB2YXJpb3VzCi1lbmhhbmNlbWVudHMgYW5kIG1hbnkgYnVnIGZpeGVzLCBpbmNsdWRpbmcgbWVyZ2luZyBzdXBwb3J0IGZvciBzZXZlcmFsCi1wcm9jZXNzb3JzLCBicmVha2luZyBnYXMgdXAgdG8gaGFuZGxlIG11bHRpcGxlIG9iamVjdCBmaWxlIGZvcm1hdAotYmFja2VuZHMgKGluY2x1ZGluZyBoZWF2eSByZXdyaXRlLCB0ZXN0aW5nLCBhbiBpbnRlZ3JhdGlvbiBvZiB0aGUgY29mZgotYW5kIGIub3V0IGJhY2tlbmRzKSwgYWRkaW5nIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIGhlYXZ5IHRlc3RpbmcgYW5kCi12ZXJpZmljYXRpb24gb2YgY3Jvc3MgYXNzZW1ibGVycyBhbmQgZmlsZSBzcGxpdHMgYW5kIHJlbmFtaW5nLAotY29udmVydGVkIGdhcyB0byBzdHJpY3RseSBhbnNpIEMgaW5jbHVkaW5nIGZ1bGwgcHJvdG90eXBlcywgYWRkZWQKLXN1cHBvcnQgZm9yIG02ODBbMzRdMCAmIGNwdTMyLCBjb25zaWRlcmFibGUgd29yayBvbiBpOTYwIGluY2x1ZGluZyBhCi1jb2ZmIHBvcnQgKGluY2x1ZGluZyBjb25zaWRlcmFibGUgYW1vdW50cyBvZiByZXZlcnNlIGVuZ2luZWVyaW5nKSwgYQotc3BhcmMgb3Bjb2RlIGZpbGUgcmV3cml0ZSwgZGVjc3RhdGlvbiwgcnM2MDAwLCBhbmQgaHAzMDBocHV4IGhvc3QKLXBvcnRzLCB1cGRhdGVkICJrbm93IiBhc3NlcnRpb25zIGFuZCBtYWRlIHRoZW0gd29yaywgbXVjaCBvdGhlcgotcmVvcmdhbml6YXRpb24sIGNsZWFudXAsIGFuZCBsaW50LgotCi1LZW4gUmFlYnVybiBjdXJyZW50bHkgbWFpbnRhaW5zIGdhcywgYW5kIHdyb3RlIHRoZSBoaWdoLWxldmVsIEJGRAotaW50ZXJmYWNlIGNvZGUgdG8gcmVwbGFjZSBtb3N0IG9mIHRoZSBjb2RlIGluIGZvcm1hdC1zcGVjaWZpYyBJL08KLW1vZHVsZXMuCi0KLVRoZSBvcmlnaW5hbCBWYXgtVk1TIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IERhdmlkIEwuIEthc2h0YW4uCi1FcmljIFlvdW5nZGFsZSBhbmQgUGF0IFJhbmtpbiBoYXZlIGRvbmUgbXVjaCB3b3JrIHdpdGggaXQgc2luY2UuCi0KLVRoZSBJbnRlbCA4MDM4NiBtYWNoaW5lIGRlc2NyaXB0aW9uIHdhcyB3cml0dGVuIGJ5IEVsaW90IERyZXNzZWxoYXVzLgotCi1NaW5oIFRyYW4tTGUgYXQgSW50ZWxsaUNvcnAgY29udHJpYnV0ZWQgc29tZSBBSVggMzg2IHN1cHBvcnQuCi0KLVRoZSBNb3Rvcm9sYSA4OGsgbWFjaGluZSBkZXNjcmlwdGlvbiB3YXMgY29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YKLUJ1ZmZhbG8gVW5pdmVyc2l0eSBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mCi1Db21wdXRlciBTY2llbmNlLgotCi1LZWl0aCBLbm93bGVzIGF0IHRoZSBPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24gd3JvdGUgdGhlIG9yaWdpbmFsIE1JUFMKLWJhY2sgZW5kICh0Yy1taXBzLmMsIHRjLW1pcHMuaCksIGFuZCBjb250cmlidXRlZCBSb3NlIGZvcm1hdCBzdXBwb3J0Ci10aGF0IGhhc24ndCBiZWVuIG1lcmdlZCBpbiB5ZXQuICBSYWxwaCBDYW1wYmVsbCB3b3JrZWQgd2l0aCB0aGUgTUlQUwotY29kZSB0byBzdXBwb3J0IGEub3V0IGZvcm1hdC4KLQotU3VwcG9ydCBmb3IgdGhlIFppbG9nIFo4ayBhbmQgSGl0YWNoaSBIOC8zMDAsIEg4LzUwMCBhbmQgU0ggcHJvY2Vzc29ycwotKHRjLXo4aywgdGMtaDgzMDAsIHRjLWg4NTAwLCB0Yy1zaCksIGFuZCBJRUVFIDY5NSBvYmplY3QgZmlsZSBmb3JtYXQKLShvYmotaWVlZSksIHdhcyB3cml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTb2x1dGlvbnMuCi1TdGV2ZSBhbHNvIG1vZGlmaWVkIHRoZSBDT0ZGIGJhY2sgZW5kIChvYmotY29mZmJmZCkgdG8gdXNlIEJGRCBmb3IKLXNvbWUgbG93LWxldmVsIG9wZXJhdGlvbnMsIGZvciB1c2Ugd2l0aCB0aGUgSGl0YWNoaSwgMjlrIGFuZCBaaWxvZwotdGFyZ2V0cy4KLQotSm9obiBHaWxtb3JlIGJ1aWx0IHRoZSBBTUQgMjkwMDAgc3VwcG9ydCwgYWRkZWQgLmluY2x1ZGUgc3VwcG9ydCwgYW5kCi1zaW1wbGlmaWVkIHRoZSBjb25maWd1cmF0aW9uIG9mIHdoaWNoIHZlcnNpb25zIGFjY2VwdCB3aGljaAotcHNldWRvLW9wcy4gIEhlIHVwZGF0ZWQgdGhlIDY4ayBtYWNoaW5lIGRlc2NyaXB0aW9uIHNvIHRoYXQgTW90b3JvbGEncwotb3Bjb2RlcyBhbHdheXMgcHJvZHVjZWQgZml4ZWQtc2l6ZSBpbnN0cnVjdGlvbnMgKGUuZy4ganNyKSwgd2hpbGUKLXN5bnRoZXRpYyBpbnN0cnVjdGlvbnMgcmVtYWluZWQgc2hyaW5rYWJsZSAoamJzcikuICBKb2huIGZpeGVkIG1hbnkKLWJ1Z3MsIGluY2x1ZGluZyB0cnVlIHRlc3RlZCBjcm9zcy1jb21waWxhdGlvbiBzdXBwb3J0LCBhbmQgb25lIGJ1ZyBpbgotcmVsYXhhdGlvbiB0aGF0IHRvb2sgYSB3ZWVrIGFuZCByZXF1aXJlZCB0aGUgcHJvdmVyYmlhbCBvbmUtYml0IGZpeC4KLQotSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMgU29sdXRpb25zIG1lcmdlZCB0aGUgTW90b3JvbGEgYW5kIE1JVAotc3ludGF4ZXMgZm9yIHRoZSA2OGssIGNvbXBsZXRlZCBzdXBwb3J0IGZvciBzb21lIENPRkYgdGFyZ2V0cyAoNjhrLAotaTM4NiBTVlIzLCBhbmQgU0NPIFVuaXgpLCB3cm90ZSB0aGUgRUNPRkYgc3VwcG9ydCBiYXNlZCBvbiBNaWNoYWVsCi1NZWlzc25lcidzIG1pcHMtdGZpbGUgcHJvZ3JhbSwgd3JvdGUgdGhlIFBvd2VyUEMgYW5kIFJTLzYwMDAgc3VwcG9ydCwKLWFuZCBtYWRlIGEgZmV3IG90aGVyIG1pbm9yIHBhdGNoZXMuICBIZSBoYW5kbGVkIHRoZSBiaW51dGlscyByZWxlYXNlcwotZm9yIHZlcnNpb25zIDIuNyB0aHJvdWdoIDIuOS4KLQotRGF2aWQgRWRlbHNvaG4gY29udHJpYnV0ZWQgZml4ZXMgZm9yIHRoZSBQb3dlclBDIGFuZCBBSVggc3VwcG9ydC4KLQotU3RldmUgQ2hhbWJlcmxhaW4gbWFkZSBnYXMgYWJsZSB0byBnZW5lcmF0ZSBsaXN0aW5ncy4KLQotU3VwcG9ydCBmb3IgdGhlIEhQOTAwMC8zMDAgd2FzIGNvbnRyaWJ1dGVkIGJ5IEdsZW5uIEVuZ2VsIG9mIEhQLgotCi1TdXBwb3J0IGZvciBFTEYgZm9ybWF0IGZpbGVzIGhhcyBiZWVuIHdvcmtlZCBvbiBieSBNYXJrIEVpY2hpbiBvZgotQ3lnbnVzIFNvbHV0aW9ucyAob3JpZ2luYWwsIGluY29tcGxldGUgaW1wbGVtZW50YXRpb24pLCBQZXRlCi1Ib29nZW5ib29tIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWggKEhQUEEgbWFpbmx5KSwgTWljaGFlbCBNZWlzc25lcgotb2YgdGhlIE9wZW4gU29mdHdhcmUgRm91bmRhdGlvbiAoaTM4NiBtYWlubHkpLCBhbmQgS2VuIFJhZWJ1cm4gb2YKLUN5Z251cyBTb2x1dGlvbnMgKHNwYXJjLCBpbml0aWFsIDY0LWJpdCBzdXBwb3J0KS4KLQotU2V2ZXJhbCBlbmdpbmVlcnMgYXQgQ3lnbnVzIFNvbHV0aW9ucyBoYXZlIGFsc28gcHJvdmlkZWQgbWFueSBzbWFsbAotYnVnIGZpeGVzIGFuZCBjb25maWd1cmF0aW9uIGVuaGFuY2VtZW50cy4KLQotVGhlIGluaXRpYWwgQWxwaGEgc3VwcG9ydCB3YXMgY29udHJpYnV0ZWQgYnkgQ2FybmVnaWUtTWVsbG9uCi1Vbml2ZXJzaXR5LiAgQWRkaXRpb25hbCB3b3JrIHdhcyBkb25lIGJ5IEtlbiBSYWVidXJuIG9mIEN5Z251cwotU29sdXRpb25zLiAgUmljaGFyZCBIZW5kZXJzb24gdGhlbiByZXdyb3RlIG11Y2ggb2YgdGhlIEFscGhhIHN1cHBvcnQuCi0KLUlhbiBEYWxsIHVwZGF0ZWQgdGhlIHN1cHBvcnQgY29kZSBmb3IgdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgMzIwMDAKLXNlcmllcywgYW5kIGFkZGVkIHN1cHBvcnQgZm9yIE1hY2ggMyBhbmQgTmV0QlNEIHJ1bm5pbmcgb24gdGhlIFBDNTMyLgotCi1LbGF1cyBLYWVtcGYgcG9ydGVkIHRoZSBhc3NlbWJsZXIgYW5kIHRoZSBiaW51dGlscyB0byBvcGVuVk1TL0FscGhhLgotCi1TdGV2ZSBIYXdvcnRoIGNvbnRyaWJ1dGVkIHRoZSBzdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1Y3Rpb24gYzMwCi0odG1zMzIwYzMwKS4KLQotSC5KLiBMdSBoYXMgY29udHJpYnV0ZWQgbWFueSBwYXRjaGVzIGFuZCBtdWNoIHRlc3RpbmcuCi0KLUFsYW4gTW9kcmEgcmV3b3JrZWQgbXVjaCBvZiB0aGUgaTM4NiBiYWNrZW5kLCBpbXByb3ZpbmcgdGhlIGVycm9yCi1jaGVja2luZywgdXBkYXRpbmcgdGhlIGNvZGUsIGFuZCBpbXByb3ZpbmcgdGhlIDE2IGJpdCBzdXBwb3J0LCB1c2luZwotcGF0Y2hlcyBmcm9tIHRoZSB3b3JrIG9mIE1hcnR5bmFzIEt1bmlnZWxpcyBhbmQgSC5KLiBMdS4KLQotTWFueSBvdGhlcnMgaGF2ZSBjb250cmlidXRlZCBsYXJnZSBvciBzbWFsbCBidWdmaXhlcyBhbmQgZW5oYW5jZW1lbnRzLiAgSWYKLXlvdSd2ZSBjb250cmlidXRlZCBzaWduaWZpY2FudCB3b3JrIGFuZCBhcmUgbm90IG1lbnRpb25lZCBvbiB0aGlzIGxpc3QsIGFuZAotd2FudCB0byBiZSwgbGV0IHVzIGtub3cuICBTb21lIG9mIHRoZSBoaXN0b3J5IGhhcyBiZWVuIGxvc3Q7IHdlIGFyZW4ndAotaW50ZW50aW9uYWxseSBsZWF2aW5nIGFueW9uZSBvdXQuCmRpZmYgLS1naXQgYS9nYXMvQ09QWUlORyBiL2dhcy9DT1BZSU5HCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDU0OWJlLi4wMDAwMDAwCi0tLSBhL2dhcy9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvZ2FzL0NoYW5nZUxvZyBiL2dhcy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGZmZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDM4NTQgKzAsMCBAQAotMTk5OS0wNi0yNyAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ190ZXh0X3ApOiBVc2UgMS8wIGluc3RlYWQgb2YgdHJ1ZS9mYWxzZSBmb3IKLQlub24gQkZEX0FTU0VNQkxFUiBjYXNlLgotCi0xOTk5LTA2LTI2ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBNYXJrIHdyaXRhYmxlIHNlY3Rpb25zIGFzCi0JZGF0YS4KLQotMTk5OS0wNi0yNiAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IERvbid0IGNhbGwKLQlvdXRfZW5kX3NlcXVlbmNlKCkgd2hlbiB0aGUgYWRkcmVzcyBkZWNyZWFzZXMgZHVlIHRvIGEgbmV3IGZyYWcuCi0JKGdlbl9kaXJfbGlzdCk6IFNldCBscy5maWxlW2ldLmRpciB0byBqICsgMSAobm90IGopIGJlY2F1c2UgZmlsZQotCW51bWJlcmluZyBzdGFydHMgd2l0aCAxLgotCi0xOTk5LTA2LTIzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIC5jb21tIGZvciBFTEYgYW5kIGFsbG93Ci0JLnNlY3Rpb24gZm9yIENPRkYuCi0JKG1jb3JlX3NfdGV4dCk6IENhbGwgb2JqX2VsZl90ZXh0IGZvciBFTEYgdGFyZ2V0LgotCShtY29yZV9zX2RhdGEpOiBDYWxsIG9ial9lbGZfZGF0YSBmb3IgRUxGIHRhcmdldC4KLQkobWNvcmVfc19zZWN0aW9uKTogTm8gbG9uZ2VyIEVMRiBzcGVjaWZpYy4gIENhbGwgb2JqX2NvZmZfc2VjdGlvbgotCWZvciBDT0ZGIHRhcmdldC4KLQkobWNvcmVfc19ic3MpOiBOZXcgZnVuY3Rpb246ICBEdW1wIGxpdGVyYWwgdGFibGUgYmVmb3JlIGNoYW5naW5nCi0Jc2VjdGlvbnMuCi0JKG1jb3JlX3NfY29tbSk6IE5ldyBmdW5jdGlvbjogIER1bXAgbGl0ZXJhbCB0YWJsZSBiZWZvcmUgY2hhbmdpbmcKLQlzZWN0aW9ucy4KLQkKLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uLCBvYmpfZWxmX2RhdGEsIG9ial9lbGZfdGV4dCk6Ci0JTm8gbG9uZ2VyIHN0YXRpYyBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX2NvbW1vbiwgb2JqX2VsZl9kYXRhLCBvYmpfZWxmX3RleHQpOgotCVByb3ZpZGUgcHJvdG90eXBlcyBmb3IgdGhlc2UgZnVuY3Rpb25zLgotCi0xOTk5LTA2LTIyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfdGV4dF9wKTogUmV3cml0ZSBub24gQkZEX0FTU0VNQkxFUiBjYXNlIHRvIHVzZQotCWEgbGlzdCBvZiBuYW1lcywgdG8gdHJ5IG9ial9zZWdtZW50X25hbWUsIGFuZCB0byB0cnkgYWJicmV2aWF0ZWQKLQluYW1lcyB3aGVuIHVzaW5nIENPRkYgd2l0aG91dCBsb25nIHNlY3Rpb24gbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBNb3JlIHVzZSBvZiBzeW1ib2wgYWNjZXNzb3IgZnVuY3Rpb25zLgotCSogY29uZmlnL3RjLWFyYy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWZyMzAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTg2MC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tODhrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1jb3JlLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1hcmMuYyAoZ2V0X2FyY19leHBfcmVsb2NfdHlwZSk6IENoYW5nZSB1c2VzIG9mCi0Jc3lfdmFsdWUgd2l0aCBhcHByb3ByaWF0ZSBhY2Nlc3NvciBmdW5jdGlvbnMuCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKEFUX1dPUkRfUCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX2Vjb2ZmX3NldF9leHQpOiBDaGFuZ2UgdXNlcyBvZiBic3ltIHRvCi0JdXNlIHN5bWJvbF9nZXRfYmZkc3ltIGluc3RlYWQuCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2NvbW0pOiBMaWtld2lzZS4KLQotMTk5OS0wNi0yMiAgSm9uYXRoYW4gTGFybW91ciAgPGpsYXJtb3VyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFyYy5jICh0Y19nZW5fcmVsb2MpOiBVc2Ugc3ltYm9sX2dldF9iZmRzeW0gdG8gZ2V0IGF0Ci0JdGhlIHN5bWJvbCwgcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBic3ltIG1lbWJlci4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWQzMHYuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWNvcmUuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXRpYzMwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuYyAodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLU1vbiBKdW4gMjEgMTY6NDU6MTkgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKGVsZl9ocHBhX3JlbG9jX3R5cGUpOiBSZW5hbWVkIGZyb20gZWxmMzJfaHBwYV9yZWxvY190eXBlLgotCShocHBhX2dlbl9yZWxvY190eXBlKTogQ29uZGl0aW9uYWxpemUgb24gQkZENjQuCi0JKHRjX2dlbl9yZWxvYyk6IFJlLWVuYWJsZSBFTEYgcmVsb2NhdGlvbnMuCi0JKiB0Yy1ocHBhLmggKFRBUkdFVF9GT1JNQVQpOiBIYW5kbGUgZWxmNjQtaHBwYSBmb3JtYXQuCi0KLTE5OTktMDYtMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGxkc3RfZXh0ZW5kKTogQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkCi0Jd2FybmluZy4KLQkoZG9fbGRzdCk6IE1vdmUgYXNzaWdubWVudCBvdXQgb2YgaWYgY29uZGl0aW9uLgotCShtZF9hcHBseV9maXgzKTogQWRkIGNhc3RzIHRvIGF2b2lkIHByaW50ZiBmb3JtYXQgd2FybmluZ3MuICBBZGQKLQlwYXJlbnRoZXNlcyB0byBhdm9pZCB3YXJuaW5nLgotCi0xOTk5LTA2LTIxICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogVXNlIHN5bWJvbF9nZXRfYmZkc3ltKCkKLQltYWNybyB0byBnZXQgYXQgdGhlIEJGRCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIGEgR0FTIHN5bWJvbC4KLQotMTk5OS0wNi0xOSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYzogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBMaWtld2lzZS4KLQotRnJpIEp1biAxOCAxNDozNDoxOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYzogR2VuZXJhbCBjbGVhbnVwcyBvZiBFTEYgc3VwcG9ydC4gIE5vIG1vcmUgc3BhY2VzCi0JYW5kIHN1YnNwYWNlcyBmb3IgRUxGLgotCShHREJfREVCVUdfU1BBQ0VfTkFNRSk6IERlbGV0ZSBkZWZpbml0aW9uIGZvciBFTEYuCi0JKEdEQl9TVFJJTkdTX1NVQlNQQUNFX05BTUUpOiBMaWtld2lzZS4KLQkoR0RCX1NZTUJPTFNfU1VCU1BBQ0VfTkFNRSk6IExpa2V3aXNlCi0JKFVOV0lORF9TRUNUSU9OX05BTUUpOiBMaWtld2lzZS4KLQkoc3BhY2Uvc3Vic3BhY2UgcmVsYXRlZCBzdHJ1Y3R1cmVzKTogQ29uZGl0aW9uYWxpemUgZGVmaW5pdGlvbnMKLQlvbiBPQkpfU09NLgotCShzcGFjZS9zdWJzcGFjZSBkaXJlY3RpdmVzIGFuZCBzdXBwb3J0IHJvdXRpbmVzKTogQ29uZGl0aW9uYWxpemUKLQlkZWZpbml0aW9ucyBhbmQgcmVmZXJlbmNlcy91c2VzIG9uIE9CSl9TT00uCi0JKGxhYmVsX3N5bWJvbF9zdHJ1Y3QpOiBGb3IgRUxGLCB0cmFjayB0aGUgc3ltYm9sJ3Mgc2VnbWVudC4gIEZvcgotCVNPTSB0cmFjayBpdHMgc3BhY2UuCi0JKHBhX2RlZmluZV9sYWJlbCwgcGFfdW5kZWZpbmVfbGFiZWwsIHBhX2dldF9sYWJlbCk6IENvcnJlc3BvbmRpbmcKLQljaGFuZ2VzLgotCShVU0VfQUxJQVNFUyk6IEtpbGwgZm9yIGJvdGggU09NICYgRUxGLgotCShwYV9kZWZfc3Vic3BhY2VzLCBwYV9kZWZfc3BhY2VzKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCShwYV9zcGFjZSwgcGFfc3Vic3BhY2UpOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKHBhX3NwYWNlc19iZWdpbik6IENvcnJlc3BvbmRpbmcgY2hhZ25lcy4KLQkobWRfYmVnaW4pOiBEbyBub3QgbXVjayBhcm91bmQgd2l0aCBzcGFjZS9zdWJzcGFjZSBzdHVmZiBmb3IKLQlPQkpfRUxGLgotCShtZF9hcHBseV9maXgpOiBUZW1wb3JhcmlseSBkaXNhYmxlIGFyZ3VtZW50IHJlbG9jYXRpb24gc3R1ZmYKLQlmb3IgT0JKX0VMRi4KLQkodGNfZ2VuX3JlbG9jKTogVGVtcG9yYXJpbHkgZGlzYWJsZSByZWxvY2F0aW9uIGdlbmVyYXRpb24gZm9yCi0JT0JKX0VMRgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBTaW1pbGFybHkuCi0KLTE5OTktMDYtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAodGh1bWJfc2V0KTogTmV3IHBzZXVkbyBvcC4KLQkodGV4dCwgZGF0YSwgc2VjdGlvbik6IE92ZXJyaWRlIHRoZXNlIHBzZXVkbyBvcHMgd2l0aCBBUk0KLQlzcGVjaWZpYyB2ZXJzaW9ucy4KLQkoc190aHVtYl9zZXQpOiBOZXcgZnVuY3Rpb246IFBlcmZvcm0gdGhlIHNhbWUgYXMgYSAuc2V0IHBzZXVkbwotCW9wLCBidXQgYWxzbyBtYXJrIHRoZSBhbGlhcydlZCBzeW1ib2wgYXMgYmVpbmcgYSBUaHVtYgotCWZ1bmN0aW9uLgotCShhcm1fc190ZXh0KTogTmV3IGZ1bmN0aW9uOiBQZXJmb3JtIHRoZSBzYW1lIGFzIHRoZSAudGV4dAotCXBzZXVkbyBvcCwgYnV0IGR1bXAgdGhlIGxpdGVyYWwgcG9vbCBiZWZvcmUgY2hhbmdpbmcKLQlzZWN0aW9ucy4gCi0JKGFybV9zX2RhdGEpOiBOZXcgZnVuY3Rpb246IFBlcmZvcm0gdGhlIHNhbWUgYXMgdGhlIC5kYXRhCi0JcHNldWRvIG9wLCBidXQgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGJlZm9yZSBjaGFuZ2luZwotCXNlY3Rpb25zLiAKLQkoYXJtX3Nfc2VjdGlvbik6IE5ldyBmdW5jdGlvbjogUGVyZm9ybSB0aGUgc2FtZSBhcyB0aGUKLQkuc2VjdGlvbiBwc2V1ZG8gb3AsIGJ1dCBkdW1wIHRoZSBsaXRlcmFsIHBvb2wgYmVmb3JlIGNoYW5naW5nIAotCXNlY3Rpb25zLiAKLQkoYXJtX2NsZWFudXApOiBEbyBub3QgcmVzZXQgdGhlIGN1cnJlbnQgc2VjdGlvbiBiZWZvcmUgZHVtcGluZwotCXRoZSBsaXRlcmFsIHBvb2wuCi0KLTE5OTktMDYtMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2xvbmdvcHRzKTogRml4IE9QVElPTl9XQVJOX1VOTUFUQ0hFRCBhbmQKLQlPUFRJT05fTk9fV0FSTl9VTk1BVENIRUQgZW50cmllcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogR2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYW4gdW5yZWNvZ25pc2VkCi0Jb3B0aW9uIGlzIGVuY291bnRlcmVkLgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkb19ub3RfaWdub3JlX2hhc2gpOiBOZXcgdmFyaWFibGUuCi0JKGdldF9vcGVyYW5kcyk6IFdoZW4gcGFyc2luZyBhbiBleHByZXNzaW9uIGFmdGVyIGFuICdAJyBzeW1ib2wKLQloYXMgYmVlbiBkZXRlY3RlZCwgZG8gbm90IGlnbm9yZSAnIycgc3ltYm9scy4KLQkobWRfb3BlcmFuZCk6IE9ubHkgaWdub3JlICcjJyBzeW1ib2xzIGlmIGRvX25vdF9pZ25vcmVfaGFzaCBpcwotCWZhbHNlLiAKLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlGcm9tIEsuIFJpY2hhcmQgUGl4bGV5IDxyaWNoQG5vaXIuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbiAocHBjLSotdnh3b3JrcyopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEyICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZiBHT1RQQyByZWxvY3MuCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFJhdGhlciB0aGFuIG5ldmVyIHJlZHVjaW5nIHJlbG9jCi0Jd2hpY2ggcmVmZXIgdG8gc3ltYm9scyBpbiBsaW5rb25jZSBzZWN0aW9ucywgcGVybWl0IHJlZHVjaW5nIHRoZQotCXJlbG9jcyBpZiB0aGUgc3ltYm9sIGlzIGxvY2FsLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfdGV4dF9wKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoc3Vic2VnX3RleHRfcCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGRvX2FsaWduKTogVXNlIHN1YnNlZ190ZXh0X3AgdG8gc2V0IHRoZSBkZWZhdWx0IGZpbGwuCi0JKiB3cml0ZS5jIChzdWJzZWdzX2ZpbmlzaCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9tYXliZV90ZXh0KTogRG9uJ3QgZGVmaW5lLgotCShtZF9kb19hbGlnbik6IFVzZSBzdWJzZWdfdGV4dF9wIHRvIHNldCB0aGUgZGVmYXVsdCBmaWxsLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQotMTk5OS0wNi0xMiAgRGF2aWQgTydCcmllbiAgPG9icmllbkBmcmVlYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmluOiAoaVszNDU2XTg2LSotZnJlZWJzZCopOiBOb3cgZGVmYXVsdHMgdG8gRUxGLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZHdhcmYyZGJnLmM6IEluY2x1ZGUgZWxmL2R3YXJmMi5oIHdpdGggIiIsIG5vdCA8Pi4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2ltbWVkaWF0ZSk6IFJlbW92ZSB1bnVzZWQgbGFiZWwKLQlzZWdfdW5pbXBsZW1lbnRlZC4KLQotCSogc3RydWMtc3ltYm9sLmg6IFB1dCBsb2NhbF9zeW1ib2wgY29kZSBpbiBpZmRlZiBCRkRfQVNTRU1CTEVSLgotCSogc3ltYm9scy5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogUmVmZXIgZGlyZWN0bHkgdG8KLQlzeV9uZXh0IGZpZWxkIHdoZW4gdGFraW5nIGFkZHJlc3MsIHJhdGhlciB0aGFuIHN5bWJvbF9uZXh0LgotCi0JKiBkd2FyZjJkYmcuYzogQ2hhbmdlIGJmZF92bWEgdG8gYWRkcmVzc1QgYW5kIGJmZF9zaWduZWRfdm1hIHRvCi0Jb2Zmc2V0VC4KLQkob3V0X3NldF9hZGRyKTogRG9uJ3QgdXNlIEJZVEVTX1BFUl9BRERSRVNTLiAgSW5zdGVhZCwgZ2V0IHRoZQotCXZhbHVlIGZyb20gdGhlIG91dHB1dCBmaWxlIGFyY2hpdGVjdHVyZS4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBJZmRlZiBCRkRfQVNTRU1CTEVSIHNwZWNpZmljIGNvZGUuCi0JKiBkd2FyZjJkYmcuaDogQ2hhbmdlIGJmZF92bWEgdG8gYWRkcmVzc1QuCi0KLTE5OTktMDYtMTEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkd2FyZjJkYmcuaDogVXNlIFBBUkFNUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCi0KLTE5OTktMDYtMTEgIE1hcnRpbiBEb3JleSAgPG1kb3JleUBtYWRnZS5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIGZvciBpOTYwIEVMRi4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHNfbGVhZnByb2MpOiBEb24ndCBjYWxsIHRjX3NldF9iYWxfb2ZfY2FsIGlmCi0JT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4KTogU2ltcGxpZnkgQkZEX0FTU0VNQkxFUiBoYW5kbGluZy4KLQotMTk5OS0wNi0xMSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHN3aXRjaC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IFJlbW92ZSBwdXNoc2VjdGlvbiBhbmQKLQlwb3BzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHJlbG9jIHN3aXRjaC4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBPbmx5IGRlY2xhcmUgaW5lc2NhcGUgaWYKLQlRVU9URVNfSU5fSU5TTi4KLQotCSogaXRibC1vcHMuYyAoaXRibF9kaXNhc3NlbWJsZSk6IENoYW5nZSBzcHJpbnRmIGZvcm1hdCBzdHJpbmdzIHRvCi0JbWF0Y2ggcGFyYW1ldGVycy4KLQkoZmluZF9lbnRyeV9ieXZhbCk6IEFkZCBwYXJlbnMgdG8gYXZvaWQgd2FybmluZy4KLQotCSogYXMuYzogSWYgSEFWRV9JVEJMX0NQVSwgaW5jbHVkZSAiaXRibC1vcHMuaCIuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBEb24ndCBwZXJtaXQgc3VidHJhY3Rpb24gb2YKLQl1bmRlZmluZWQgc3ltYm9scy4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0gICAgICAgICogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRG9uJ3QgdXNlIHNpZGUtZWZmZWN0IGV4cHJlc3Npb24KLQl3aXRoIGlzb2N0YWwuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzeW50aGV0aXplX3NldHV3LCBzeW50aGV0aXplX3NldHN3LAotCXN5bnRoZXRpemVfc2V0eCk6IE5ldyBmdW5jdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogQnJva2VuIHRoZSBzcGVjaWFsIGNhc2VzIGludG8gdGhlIGFib3ZlCi0JZnVuY3Rpb25zLiBNYWtlIGNvbXBpbGVyIGhhcHB5IGlmIHNpemVvZihiZmRfdm1hKT09NC4KLQlGaXggc2V0aGkgZ2VuZXJhdGVkIGZyb20gc2V0L3NldHV3LiBJZiBpbnN0cnVjdGlvbnMgaGF2ZSBhIHJlbGxvYywKLQlhbHdheXMgY2xlYXIgdGhlIGZpZWxkcyB0byBiZSByZWxvY2F0ZWQgaW4gdGhlIG9wY29kZS4KLQkoc3BhcmNfaXApOiBSZW1vdmUgc3BlY2lhbF9jYXNlIGdsb2JhbCB2YXJpYWJsZS4KLQotMTk5OS0wNi0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSm9obiBXLiBXb3puYWNrIDxqd296bmFja0Bjb25jZW50cmljLm5ldD46Ci0JKiBpdGJsLW9wcy5jIChpdGJsX2dldF9yZWdfdmFsKTogQWRkIHB2YWwgcGFyYW1ldGVyLiAgUmV0dXJuCi0JaW5kaWNhdGlvbiBvZiBzdWNjZXNzIHJhdGhlciB0aGFuIGEgdmFsdWUuCi0JKGl0YmxfZ2V0X3ZhbCk6IExpa2V3aXNlLgotCShpdGJsX2dldF9maWVsZCk6IFVzZSBzdHJjc3BuLiAgQ2hhbmdlIGRlbGltaXRlcnMgdG8gaW5jbHVkZQotCXBhcmVucy4KLQkqIGl0Ymwtb3BzLmggKGl0YmxfZ2V0X3JlZ192YWwpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKGl0YmxfZ2V0X3ZhbCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IFVwZGF0ZSBjYWxsIHRvIGl0YmxfZ2V0X3JlZ192YWwuCi0KLQkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IENvbnZlcnQgbG9jYWwgc3ltYm9scyB0bwotCXJlZ3VsYXIgc3ltYm9scy4KLQotMTk5OS0wNi0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgQVJNOTIwIGFuZAotCUFSTTkyMHQuIAotCi0xOTk5LTA2LTA3ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hc3NlbWJsZSk6IEZpeCB1cCBzZXR4LCBzdXBwb3J0IHNldHN3LgotCU9wdGltaXplIHNldCBpZiBzaXplb2YoYmZkX3ZtYSkgPT0gNjQuCi0JKHNwYXJjX2lwKTogRml4IHNldGhpIC0gd2l0aG91dCAlaGkoKSBpdCBzaG91bGQgZ2VuZXJhdGUKLQlSX1NQQVJDXzIyIHJlbG9jLCBub3QgUl9TUEFSQ19ISTIyLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgQkZEX1JFTE9DX1NQQVJDMjIuCi0KLTE5OTktMDYtMDcgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2JlZ2luKTogSGFuZGxlIG5hdGl2ZSB3b3Jkc2l6ZSBhbGlhc2VzLgotCShzX25jb25zKTogTmV3IGZ1bmN0aW9uLgotCShuYXRpdmVfb3BfdGFibGUpOiBOZXcgdGFibGUuCi0JKHNwYXJjX2lwKTogQmUgbW9yZSBzdHJpY3Qgb24gJWhpKCkgZXRjLjsgcHJlcGFyZSBhc3NlbWJsZXIgZm9yCi0JUl9TUEFSQ19PTE8xMCBoYW5kbGluZy4KLQotTW9uIEp1biAgNyAxMDoyMjoxNiAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBleHByLmggKHN0cnVjdCBleHByZXNzaW9uUyk6IFJldmVydCBsYXN0IGNoYW5nZTsgd2lkZW4gWF9vcC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9iZWdpbik6IENoZWNrIHRoZSBmaWVsZCBpcyB3aWRlIGVub3VnaC4KLQotTW9uIEp1biAgNyAxMToyNToxNiAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmFtIChUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCBjb25maWcvdGMtZnIzMC5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCBjb25maWcvdGMtZnIzMC5oLgotCShUQVJHX0VOVl9IRklMRVMpOiBBZGQgY29uZmlnL3RlLWVwb2MtcGUuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBJbiBNUkkgbW9kZSBpZiBjYWxsZWQgYXMKLQlgY29tbW9uJyBwYXNzIG9uIHRvIHNfbXJpX2NvbW1vbi4KLQkoZWxmX3BzZXVkb190YWJsZSk6IFBhc3MgMSB0byBvYmpfZWxmX2NvbW1vbiBmb3IgYGNvbW1vbicuIAotCi0xOTk5LTA2LTA2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBEb24ndCBmcmVlIHRoZSByZXR1cm4KLQl2YWx1ZSBvZiBkZW1hbmRfY29weV9DX3N0cmluZy4KLQotMTk5OS0wNi0wNSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyZGJnLmMgKGR3YXJmMl9nZW5fbGluZV9pbmZvKTogTWlycm9yIHRoZSBzZWN0aW9uIHN5bWJvbAotCWNyZWF0aW9uIGxvZ2ljIGZyb20gb2JqX2VsZl9jcmVhdGVfc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWIpOiBBZGQgcHVzaHNlY3Rpb24vcG9wc2VjdGlvbi4KLQkoc2VjdGlvbl9zdGFjayk6IE5ldy4KLQkoc3BlY2lhbF9zZWN0aW9ucyk6IE1ha2UgY29uc3QuCi0JKG9ial9lbGZfc2VjdGlvbik6IEd1dCBhbmQgcmV3cml0ZSBwYXJzaW5nLgotCShvYmpfZWxmX2NoYW5nZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uIGJyb2tlbiBvdXQgb2Ygb2JqX2VsZl9zZWN0aW9uLgotCShvYmpfZWxmX3BhcnNlX3NlY3Rpb25fbGV0dGVycyk6IExpa2V3aXNlLgotCShvYmpfZWxmX3NlY3Rpb25fd29yZCk6IExpa2V3aXNlLgotCShvYmpfZWxmX3NlY3Rpb25fdHlwZSk6IExpa2V3aXNlLgotCShvYmpfZWxmX3ByZXZpb3VzKTogVHJlYXQgYXMgYSB0b2dnbGUuCi0JKG9ial9lbGZfcG9wc2VjdGlvbik6IE5ldy4KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NlY3Rpb25fd29yZCk6IFRha2Ugc3RyK2xlbiBub3QgcHRyX3N0ci4KLQkocHBjX3NlY3Rpb25fdHlwZSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXBwYy5oOiBMaWtld2lzZS4KLQotCSogZXhwci5oIChzdHJ1Y3QgZXhwcmVzc2lvblMpOiBEb24ndCBtYWtlIFhfb3AgYSBiaXRmaWVsZC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBVcGRhdGUgZm9yIHN5bWJvbCBoYW5kbGluZyBjaGFuZ2VzLgotCShtZF9hcHBseV9maXgpIFtjYXNlIEdQUkVMXTogVXNlIG5vd19zZWcgaW5zdGVhZCBvZiBhYnNvbHV0ZV9zZWN0aW9uLgotCShsb2FkX2V4cHJlc3Npb24sIGVtaXRfaXJfbG9hZCwgZW1pdF9sb2Fkc3RvcmUsIGVtaXRfanNyam1wKTogTGlrZXdpc2UuCi0KLTE5OTktMDYtMDUgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jICgqKTogQ29udmVydCB0byBLJlIgKyBwcm90b3R5cGVzLgotCShkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IEtpbGwgdW51c2VkIHZhcmlhYmxlcy4KLQkoZHdhcmYyX2ZpbmlzaCk6IExpa2V3aXNlLgotCShkd2FyZjJfd2hlcmUpOiBMaWtld2lzZS4KLQkoZHdhcmYyX2RpcmVjdGl2ZV9maWxlKTogSWYgd2UndmUgb25seSBnb3QgYSBzdHJpbmcsCi0JaGFuZCBvZmYgdG8gc19hcHBfZmlsZS4KLQkqIGVjb2ZmLmM6IE1vdmUgdGhlIGluY2x1ZGUgb2YgZWNvZmYuaC4KLQkqIHN5bWJvbHMuaCAoU19JU19GVU5DVElPTik6IFByb3RvdHlwZS4KLQotCSogcmVhZC5jIChMRVhfSEFTSCk6IFN1cHBseSBhIGRlZmF1bHQuCi0JKGxleF90eXBlKTogVXNlIGl0LgotCShzX2dsb2JsKTogVXBkYXRlIGBjJyBhZnRlciBza2lwcGluZyB3aGl0ZXNwYWNlLgotCSogcmVhZC5oIChMRVhfRU5EX05BTUUsIGlzX25hbWVfZW5kZXIpOiBOZXcuCi0JKiBleHByLmMgKGdldF9zeW1ib2xfZW5kKTogUmVzcGVjdCBpdC4KLQotMTk5OS0wNi0wNCAgTWFyayBLbGVpbiA8bWtsZWluQGRpcy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogQ29udmVydCBsb2NhbCBzeW1ib2wgZHVtbXlfc3ltYm9sCi0JdG8gcmVhbCBpZiBPQkpfU09NCi0JKHRjX2dlbl9yZWxvYyk6IFN0aWxsIG5lZWQgYmZkX2Fic19zeW1ib2wgaW4gc29tZSByZWxvY3MuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0KLTE5OTktMDYtMDMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBjZ2VuLmM6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKiBjb25maWcvdGMtbTMyci5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogVXBkYXRlIGZvciBzeW1ib2wgaGFuZGxpbmcgY2hhbmdlcy4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYXJtLmg6IFVwZGF0ZSBmb3Igc3ltYm9sIGhhbmRsaW5nIGNoYW5nZXMuCi0JKiBjb25maWcvdGMtYXJtLmM6IExpa2V3aXNlLgotCShzeW1ib2xfbWFrZV9lbXB0eSk6IFJlbW92ZS4gIEp1c3QgdXNlIHN5bWJvbF9jcmVhdGUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX3NldF90Yyk6IENvcnJlY3QgbmFtZS4KLQotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSgkKE9CSlMpKTogRG9uJ3QgZGVwZW5kIHVwb24gc3RydWMtc3ltYm9sLmguCi0JKC5kZXAxLCAudGNkZXAsIC5vYmpkZXApOiBDcmVhdGUgaXRibC1wYXJzZS5oLgotCSogZGVwLWluLnNlZDogRG9uJ3QgcmVtb3ZlIHN0cnVjLXN5bWJvbC5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoU3ltYm9scyk6IERlc2NyaWJlIGNoYW5nZXMgaW4gc3ltYm9sCi0JaGFuZGxpbmcuCi0KLTE5OTktMDYtMDMgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChkd2FyZjJfZ2VuX2xpbmVfaW5mbyk6IFVzZSBzZWN0aW9uX3N5bWJvbAotCWluc3RlYWQgb2YgZG9pbmcgdGhlIHdvcmsgYnkgaGFuZC4KLQotMTk5OS0wNi0wMyAgRGF2aWQgTW9zYmVyZ2VyICA8ZGF2aWRtQGhwbC5ocC5jb20+Ci0KLQkqIGR3YXJmMmRiZy5jIChJTklUSUFMX1NUQVRFKTogTmV3IG1hY3JvIGVuY2Fwc3VsYXRpbmcgaW5pdGlhbAotCXN0YXRlIG9mIGxpbmUgc3RhdGUtbWFjaGluZS4KLQkoc3RydWN0IGxzKTogQ29sbGVjdCBEV0FSRjIgbGluZSBzdGF0ZS1tYWNoaW5lIHN0YXRlIGluIG5ldyBtZW1iZXIKLQlTTS4gIEFkZCBtZW1iZXIgRU1QVFlfU0VRVUVOQ0UgdG8ga2VlcCB0cmFjayBpZiBhIGNvZGUgc2VxdWVuY2UKLQlyZXN1bHRlZCBpbiBhbnkgRFdBUkYyIGRpcmVjdGl2ZXMuCi0JKHJlc2V0X3N0YXRlX21hY2hpbmUpOiBOZXcgZnVuY3Rpb24uCi0JKG91dF9lbmRfc2VxdWVuY2UpOiBEaXR0by4KLQkoZHdhcmYyX2dlbl9saW5lX2luZm8pOiBXaGVuIHN3aXRjaGluZyBzZWN0aW9ucyBvciBzd2l0Y2hpbmcgdG8gYQotCWxvd2VyIHRleHQgYWRkcmVzcywgY2FsbCBvdXRfZW5kX3NlcXVlbmNlKCkgZmlyc3QgdG8gdGVybWluYXRlIHRoZQotCXByZXZpb3VzIGNvZGUgc2VxdWVuY2UgYXMgY29kZSBzZXF1ZW5jZXMgTVVTVCBoYXZlIG1vbm90b25pY2FsbHkKLQlpbmNyZWFzaW5nIGFkZHJlc3Nlcy4KLQkoZHdhcmYyX2ZpbmlzaCk6IENhbGwgb3V0X2VuZF9zZXF1ZW5jZSgpIGluc3RlYWQgb2Ygb3BlbiBjb2RpbmcgaXQuCi0KLTE5OTktMDYtMDMgIERhdmlkIE1vc2JlcmdlciAgPGRhdmlkbUBocGwuaHAuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIG9wdGlvbiAtZ2R3YXJmMiB0byBhbGxvdyByZXF1ZXN0aW5nCi0JRFdBUkYyIGRlYnVnIGluZm8gKGxpbmUgaW5mb3JtYXRpb24gb25seSwgYXQgdGhpcyBwb2ludCkuCi0JKiBhcy5oOiBVcGRhdGUgY29tbWVudCBhYm91dCBzdXBwb3J0ZWQgZGVidWcgZm9ybWF0cy4KLQkqIGR3YXJmMmRiZy5jLCBkd2FyZjJkYmcuaDogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuYW0gKEdBU19DRklMRVMsIEhGSUxFUywgR0VORVJJQ19PQkpTKTogQWRkIHRoZW0uCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IERvbid0IHVzZSBbIGZvciBwYXJlbnMgaWYgd2Ugd2FudCBhbiBpbmRleCBvcC4KLQkob3BfZW5jb2RpbmcpOiBTd2l0Y2ggWyBpbnRvIE9faW5kZXgsIGlmIGRlc2lyZWQuCi0JKG9wX3JhbmspOiBSZW51bWJlciB3aXRoIE9faW5kZXggb24gYm90dG9tLgotCShleHByKTogSWYgT19pbmRleCwgbWF0Y2ggY2xvc2luZyBicmFja2V0LgotCSogZXhwci5oIChPX2luZGV4KTogTmV3LgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENvbmRpdGlvbmFsbHkgYWxsb3cgbWF0Y2hlZCAiCi0JaW4gbGluZXMgcGFzc2VkIHRvIG1kX2Fzc2VtYmxlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfcHNldWRvX3RhYmxlKTogQWRkIGBjb21tb24nLgotCi0xOTk5LTA2LTAzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUFkZCBzdXBwb3J0IGZvciBzdG9yaW5nIGxvY2FsIHN5bWJvbHMgaW4gYSBzbWFsbCBzdHJ1Y3R1cmUgdG8gc2F2ZQotCW1lbW9yeSB3aGVuIGFzc2VtYmxpbmcgbGFyZ2UgZmlsZXMuCi0JKiBhcy5oOiBEb24ndCBpbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShzeW1ib2xTKTogQWRkIHR5cGVkZWYuCi0JKiBzeW1ib2xzLmM6IEluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKGxvY2FsX2hhc2gpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzYXZlX3N5bWJvbF9uYW1lKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgZnJvbSBzeW1ib2xfY3JlYXRlLgotCShzeW1ib2xfY3JlYXRlKTogQ2FsbCBzYXZlX3N5bWJvbF9uYW1lLgotCShsb2NhbF9zeW1ib2xfY291bnQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsb2NhbF9zeW1ib2xfY29udmVyc2lvbl9jb3VudCk6IExpa2V3aXNlLgotCShMT0NBTF9TWU1CT0xfQ0hFQ0spOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9tYWtlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobG9jYWxfc3ltYm9sX2NvbnZlcnQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShjb2xvbik6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLiAgQ3JlYXRlIGxvY2FsIHN5bWJvbCBmb3IgbG9jYWwKLQlsYWJlbCBuYW1lLgotCShzeW1ib2xfdGFibGVfaW5zZXJ0KTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuCi0JKHN5bWJvbF9maW5kX29yX21ha2UpOiBDcmVhdGUgbG9jYWwgc3ltYm9sIGZvciBsb2NhbCBsYWJlbCBuYW1lLgotCShzeW1ib2xfZmluZF9iYXNlKTogQ2hlY2sgZm9yIGxvY2FsIHN5bWJvbC4KLQkoc3ltYm9sX2FwcGVuZCwgc3ltYm9sX2luc2VydCk6IENoZWNrIGZvciBsb2NhbCBzeW1ib2xzLgotCShzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycywgc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgotCSh2ZXJpZnlfc3ltYm9sX2NoYWluKTogTGlrZXdpc2UuCi0JKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBMaWtld2lzZS4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgbG9jYWwgc3ltYm9scy4KLQkocmVzb2x2ZV9sb2NhbF9zeW1ib2wpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShyZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMpOiBOZXcgZnVuY3Rpb24uCi0JKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IEhhbmRsZSBsb2NhbCBzeW1ib2xzLgotCShTX0lTX0ZVTkNUSU9OLCBTX0lTX0VYVEVSTkFMLCBTX0lTX1dFQUssIFNfSVNfQ09NTU9OKTogTGlrZXdpc2UuCi0JKFNfSVNfREVGSU5FRCwgU19JU19ERUJVRywgU19JU19MT0NBTCwgU19HRVRfTkFNRSk6IExpa2V3aXNlLgotCShTX0dFVF9TRUdNRU5ULCBTX1NFVF9TRUdNRU5ULCBTX1NFVF9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX0NMRUFSX0VYVEVSTkFMLCBTX1NFVF9XRUFLLCBTX1NFVF9OQU1FKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9wcmV2aW91cywgc3ltYm9sX25leHQpOiBOZXcgZnVuY3Rpb25zLgotCShzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24pOiBMaWtld2lzZS4KLQkoc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9zZXRfZnJhZywgc3ltYm9sX2dldF9mcmFnKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3VzZWQsIHN5bWJvbF9jbGVhcl91c2VkLCBzeW1ib2xfdXNlZF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MsIHN5bWJvbF91c2VkX2luX3JlbG9jX3ApOiBMaWtld2lzZS4KLQkoc3ltYm9sX21hcmtfbXJpX2NvbW1vbiwgc3ltYm9sX2NsZWFyX21yaV9jb21tb24pOiBMaWtld2lzZS4KLQkoc3ltYm9sX21yaV9jb21tb25fcCk6IExpa2V3aXNlLgotCShzeW1ib2xfbWFya193cml0dGVuLCBzeW1ib2xfY2xlYXJfd3JpdHRlbik6IExpa2V3aXNlLgotCShzeW1ib2xfd3JpdHRlbl9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9tYXJrX3Jlc29sdmVkLCBzeW1ib2xfcmVzb2x2ZWRfcCk6IExpa2V3aXNlLgotCShzeW1ib2xfc2VjdGlvbl9wLCBzeW1ib2xfZXF1YXRlZF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9jb25zdGFudF9wKTogTGlrZXdpc2UuCi0JKHN5bWJvbF9nZXRfYmZkc3ltLCBzeW1ib2xfc2V0X2JmZHN5bSk6IExpa2V3aXNlLgotCShzeW1ib2xfZ2V0X29iaiwgc3ltYm9sX3NldF9vYmopOiBMaWtld2lzZS4KLQkoc3ltYm9sX2dldF90Yywgc3ltYm9sX3NldF90Yyk6IExpa2V3aXNlLgotCShzeW1ib2xfYmVnaW4pOiBJbml0aWFsaXplIGxvY2FsX2hhc2guCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMuCi0JKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogUHJpbnQgbG9jYWwgc3ltYm9sIHN0YXRpc3RpY3MuCi0JKiBzeW1ib2xzLmg6IEluY2x1ZGUgInN0cnVjLXN5bWJvbC5oIiBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQlEZWNsYXJlIG5ldyBzeW1ib2xzLmMgZnVuY3Rpb25zLiAgTW92ZSBtYW55IGRlY2xhcmF0aW9ucyBoZXJlIGZyb20KLQlzdHJ1Yy1zeW1ib2wuaC4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IERlZmluZSBpZiBuZWVkZWQuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IERvbid0IHNldC4KLQkoc3RydWN0IHN5bWJvbCk6IE1vdmUgYnN5bSB0byBtYWtlIGl0IGNsZWFybHkgdGhlIGZpcnN0IGZpZWxkLgotCVJlbW92ZSBUQVJHRVRfU1lNQk9MX0ZJRUxEUy4KLQkoc3ltYm9sUyk6IERvbid0IHR5cGVkZWYuCi0JKHN0cnVjdCBicm9rZW5fd29yZCk6IFJlbW92ZS4KLQkoTl9UWVBFX3NlZywgc2VnX05fVFlQRSk6IE1vdmUgdG8gc3ltYm9sLmguCi0JKFNFR01FTlRfVE9fU1lNQk9MX1RZUEUsIE5fUkVHSVNURVIpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2luc2VydCwgc3ltYm9sX3JlbW92ZSk6IExpa2V3aXNlLgotCShzeW1ib2xfcHJldmlvdXMsIHN5bWJvbF9hcHBlbmQpOiBMaWtld2lzZS4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbiwgdmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBsb2NhbF9zeW1ib2wpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9jb252ZXJ0ZWRfcCwgbG9jYWxfc3ltYm9sX21hcmtfY29udmVydGVkKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfcmVzb2x2ZWRfcCwgbG9jYWxfc3ltYm9sX21hcmtfcmVzb2x2ZWQpOiBEZWZpbmUuCi0JKGxvY2FsX3N5bWJvbF9nZXRfZnJhZywgbG9jYWxfc3ltYm9sX3NldF9mcmFnKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfZ2V0X3JlYWxfc3ltYm9sKTogRGVmaW5lLgotCShsb2NhbF9zeW1ib2xfc2V0X3JlYWxfc3ltYm9sKTogRGVmaW5lLgotCURlZmluZS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCByZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogQWRkIGxvY2FsIGZpZWxkLiAgSWYKLQlFQ09GRl9ERUJVR0dJTkcsIGFkZCBFQ09GRiBmaWVsZHMuCi0JKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUywgVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvb2JqLW11bHRpLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogQWRkIGxvY2FsIGZpZWxkLiAgSWYKLQlFQ09GRl9ERUJVR0dJTkcsIGFkZCBFQ09GRiBmaWVsZHMuCi0JKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUywgVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKEVDT0ZGX0RFQlVHX1RBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLW1jb3JlLmg6IERvbid0IGluY2x1ZGUgc3RydWMtc3ltYm9sLmguCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTKTogRG9uJ3QgZGVmaW5lLgotCShzdHJ1Y3QgbWNvcmVfdGNfc3kpOiBEZWZpbmUuCi0JKFRDX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUuCi0JKiBNYW55IGZpbGVzOiBVc2Ugc3ltYm9sUyBpbnN0ZWFkIG9mIHN0cnVjdCBzeW1ib2wuICBVc2UgbmV3Ci0JYWNjZXNzb3IgZnVuY3Rpb25zIHJhdGhlciB0aGFuIHJlZmVycmluZyB0byBzeW1ib2xTIGZpZWxkcwotCWRpcmVjdGx5LgotCi0JKiByZWFkLmMgKHNfbXJpX2NvbW1vbik6IERvbid0IGFkZCBpbiB2YWx1ZSBvZiBsaW5lX2xhYmVsLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gd2hlbgotCWNoZWNraW5nIGZvciBTRUNfTElOS19PTkNFLgotCi0JKiBjb25maWcvdGMtc2guaCAoc2hfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCi0JKiBhcHAuYyAoaW5wdXRfYnVmZmVyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwX3B1c2gpOiBTYXZlIHNhdmVkX2lucHV0IGluIGFsbG9jYXRlZCBidWZmZXIuCi0JKGFwcF9wb3ApOiBSZXN0b3JlZCBzYXZlZF9pbnB1dC4KLQkoZG9fc2NydWJfY2hhcnMpOiBDaGFuZ2UgZ2V0IHBhcmFtZXRlciB0byB0YWtlIGNoYXIgKiBhbmQgaW50IGFzCi0JYXJndW1lbnRzLiAgQ2hhbmdlIEdFVCBtYWNybyB0byBwYXNzIGlucHV0X2J1ZmZlciB0byBnZXQKLQlmdW5jdGlvbi4gIERvbid0IHNhdmUgaW5wdXQgaW50byBhbGxvY2F0ZWQgYnVmZmVyLgotCSogYXMuaCAoZG9fc2NydWJfY2hhcnMpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfZ2V0KTogQ2hhbmdlIHRvIHRha2UgY2hhciAqIGFuZCBpbnQuCi0JUmVhZCBkYXRhIGludG8gcGFzc2VkIGluIGJ1ZmZlci4gIFJlbW92ZSBzdGF0aWMgYnVmZmVyLgotCSogcmVhZC5jIChzY3J1Yl9mcm9tX3N0cmluZyk6IENoYW5nZSB0byB0YWtlIGNoYXIgKiBhbmQgaW50LiAgQ29weQotCWRhdGEgaW50byBwYXNzZWQgaW4gYnVmZmVyLgotCi0JKiBoYXNoLmg6IE5lYXRlbi4gIERlY2xhcmUgaGFzaF90cmF2ZXJzZS4KLQkqIGhhc2guYzogQ29tcGxldGUgcmV3cml0ZSBiYXNlZCBvbiBCRkQgaGFzaGluZyBjb2RlLgotCSogZ2FzcC5jIChjaHVua3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IENhbGwgaGFzaF9qYW0gd2l0aCBOVUxMIHJhdGhlciB0aGFuCi0JaGFzaF9kZWxldGUuCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEFkZCBwaXBlbGluZSBvZmZzZXQgaW50byByZWxvYwotCWFkZGVuZCB1bmxlc3MgdGhlIHRhcmdldCB1c2VzIGFuIG9sZCBBQkkuCi0KLU1vbiBNYXkgMjQgMTM6MzY6NTUgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCS1XY2hhci1zdWJzY3JpcHRzIGNsZWFudXAKLQkqIGxpc3RpbmcuYyAobGlzdGluZ19uZXdsaW5lKTogVXNlIHVuc2lnbmVkIGNoYXIgdmFyaWFibGUsIHNvCi0gCWNhbGxzIHRvIGlzYXNjaWksaXNjbnRybCBhcmUgY29ycmVjdC4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBDYXN0IGFyZyB0byBpc2RpZ2l0LCBldC4gYWwuIHdpdGgKLQkodW5zaWduZWQgY2hhcikuCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfZW50LGVjb2ZmX3N0YWIpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsbWlwczE2X2lwKTogRGl0dG8uCi0JKG15X2dldFNtYWxsRXhwcmVzc2lvbixnZXRfbnVtYmVyLHNfbWlwc19lbnQpOiBEaXR0by4KLQotMTk5OS0wNS0yOCAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQG1hdGVtYXRpay5zdS5zZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IENoZWNrIGZvciBkaXNhbGxvd2VkIGluZGV4IHJlZ2lzdGVyCi0Jd2lkdGggZm9yIENvbGRmaXJlLgotCShhcmNoX2NvbGRmaXJlX3ApOiBOZXcgI2RlZmluZS4KLQkobTY4a19pcCwgbTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgYXJjaF9jb2xkZmlyZV9wLgotCi0xOTk5LTA1LTI4ICBMaW51cyBOb3JkYmVyZyAgPGxpbnVzLm5vcmRiZXJnQGNhbml0LnNlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbnN0YWxsX29wZXJhbmQpOiBBZGQgcGxhY2VzIGBuJywgYG8nLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWRkIGZvcm1hdHMgYEUnLCBgRycsIGBIJy4KLQkoaW5zdGFsbF9vcGVyYW5kKTogQWRkIHBsYWNlIGBOJy4KLQkoaW5pdF90YWJsZSk6IEFkZCByZWdpc3RlcnMgQUNDLCBNQUNTUiwgTUFTSy4KLQotCSogY29uZmlnL202OGstcGFyc2UuaCAobTY4a19yZWdpc3Rlcik6IEFkZCBBQ0MsIE1BQ1NSLCBNQVNLLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBDaGFuZ2UgbWNmNTIwMCAtLT4gbWNmLgotCShhcmNocyk6IEFkZCBtY2Y1MjA2ZSwgbWNmNTMwNy4KLQkobTY4a19pcCk6IEFkZCBmb3JtYXQgYHUnLgotCShpbnN0YWxsX29wZXJhbmQpOiBBZGQgcGxhY2UgYG0nLCBgTScsIGBoJy4KLQkoaW5pdF90YWJsZSk6IEFkZCB1cHBlci9sb3dlciByZWdpc3RlcnMuCi0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKG02OGtfcmVnaXN0ZXIpOiBBZGQgdXBwZXIvbG93ZXIgcmVnaXN0ZXJzLgotCi0xOTk5LTA1LTI4ICBNYXJ0aW4gRG9yZXkgIDxtZG9yZXlAbWFkZ2UuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jOiBTZXZlcmFsIG1pbm9yIGNoYW5nZXMgdG8gYWRkIEVMRiBhbmQKLQlCRkRfQVNTRU1CTEVSIHN1cHBvcnQuCi0JKiBjb25maWcvdGMtaTk2MC5oOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaTk2MC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi0xOTk5LTA1LTI1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBPbmx5IGRvIDE5OTktMDUtMTcgZnhfcGNyZWwKLQlyZWxvYyBjaGFuZ2VzIHdoZW4gZGVmaW5lZChCRkRfQVNTRU1CTEVSKS4KLQotMTk5OS0wNS0xNyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19nZW5fcmVsb2MpOiBSZW1vdmUgRiBhbmQgTUFQIG1hY3Jvcy4KLQotCSogd3JpdGUuYyAod3JpdGVfcHJpbnRfc3RhdGlzdGljcyk6IE91dHB1dCB0byBmaWxlLCBub3Qgc3RkZXJyLgotCi0JKiBleHByLmMgKGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyLDY0KTogUHJvdG90eXBlLgotCi0JKiByZWFkLmMgKHNfbGNvbW1faW50ZXJuYWwsIHNpemVvZl9zbGViMTI4LCBzaXplb2ZfdWxlYjEyOCwKLQlvdXRwdXRfc2xlYjEyOCwgb3V0cHV0X3VsZWIxMjgsIG91dHB1dF9iaWdfc2xlYjEyOCwKLQlvdXRwdXRfYmlnX3VsZWIxMjgsIG91dHB1dF9iaWdfbGViMTI4KTogUHJvdG90eXBlLgotCShvdXRwdXRfYmlnX3NsZWIxMjgsIG91dHB1dF9iaWdfdWxlYjEyOCk6IE1ha2UgaW5saW5lLgotCShvdXRwdXRfYmlnX2xlYjEyOCk6IFJlbW92ZSBpbmxpbmUKLQotCUZyb20gTWFjaWVqIFcuIFJvenlja2kgPG1hY3JvQGRzMi5wZy5nZGEucGw+Ci0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogQ29udmVydCBCRkRfUkVMT0NfMTYgd2l0aAotCWZ4X3BjcmVsIHNldCB0byBCRkRfUkVMT0NfMTZfUENSRUwuICBTaW1pbGFybHkgZm9yIEJGRF9SRUxPQ184LgotCUhhbmRsZSBCRkRfUkVMT0NfMTZfUENSRUwgYW5kIEJGRF9SRUxPQ184X1BDUkVMLiAgUmV0dXJuIGNoYW5nZWQKLQl2YWx1ZSBmb3IgY29ycmVjdCBvdmVyZmxvdyBjaGVjayBpbiB3cml0ZS5jOmZpeHVwX3NlZ21lbnQuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogTW92ZSBiaXRmaWVsZCBvdmVyZmxvdyBjaGVja3MgdG8gYWZ0ZXIKLQl0aGUgbWRfYXBwbHlfZml4IGNhbGwuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IE1lbnRpb24gbWRfYXBwbHlfZml4IG1vZGlmeWluZwotCXZhbHVlVCAqdmFsIGFyZ3VtZW50LgotCi1GcmkgTWF5IDE0IDEwOjUyOjEzIDE5OTkgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBDb3JyZWN0bHkgcm91bmQgYQotCWRlbm9ybWFsaXplZCBudW1iZXIuICBGaXggb2ZmLWJ5LW9uZSBpbiByYW5nZSBjaGVja2luZyBmb3IKLQlleHBvbmVudCBpbiBhIGRlbm9ybWFsLiAKLQotMTk5OS0wNS0xMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKHBhcnNlX3JlZyk6IEFjY2VwdCAnc3AnIGFzIGEgdmFsaWQgcmVnaXN0ZXIKLQluYW1lLiAKLQotVGh1IE1heSAxMyAwOTo0Njo1OSAxOTk5ICBKb2VsIFNoZXJyaWxsIChqb2VsQE9BUmNvcnAuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1ydGVtc2VsZiosIHNoLSotcnRlbXNlbGYqKTogTmV3IHRhcmdldHMuCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoSW52TWVtKTogTmV3IGZsYWcuICBBZGQgdG8gQW55TWVtLgotCShSZXZlcnNlUmVnUmVnbWVtKTogUmVtb3ZlLgotCShJbW1FeHQpOiBOZXcgZmxhZy4gIFJlbnVtYmVyIHNvbWUgb2YgdGhlIG9wY29kZV9tb2RpZmllciBiaXRzLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBUZXN0IGZvciBQSUlJIFNJTUQgYW5kIEFNRAotCTNETm93ISB2aWEgSW1tRXh0IG9wY29kZV9tb2RpZmllci4gIFJlbW92ZSBSZXZlcnNlUmVnUmVnbWVtCi0Ja2x1ZGdlLgotCi0JRnJvbSAgRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgotCSogY29uZmlnL3RjLWkzODYuaCAoUmVnWE1NKTogTmV3IGZvciBQL0lJSS4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IEFkZCBzdXBwb3J0IGZvciBQL0lJSS4KLQotU2F0IE1heSAgOCAyMzoyODo1MCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IFJlY29nbml6ZSAtbXBwYzY0YnJpZGdlLgotCShtZF9iZWdpbik6IEFsbG93IHBwYzMyIGluc25zIGluIHBwYzY0YnJpZGdlIG1vZGUuCi0JKHBwY19pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBTSUdOT1BUIGluIHBwYzY0IG1vZGUuCi0KLVRodSBNYXkgIDYgMjM6MTM6MzkgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbW1lZGlhdGUpOiBTa2lwIHdoaXRlc3BhY2UgYmVmb3JlCi0JY29tcGxhaW5pbmcgYWJvdXQganVuayBhZnRlciBleHByZXNzaW9uLgotCShpMzg2X2Rpc3BsYWNlbWVudCk6IExpa2V3aXNlLgotCi1UaHUgTWF5ICA2IDE5OjUwOjE0IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2ZpbmRfYmFzZSk6IFVzZSBtZW1jcHkgaW5zdGVhZCBvZiBzdHJjcHkuCi0JRG9uJ3QgY29weSBiZWZvcmUgZG93bmNhc2VpbmcuCi0KLTE5OTktMDUtMDUgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotIAotICAgICAgICAqIHRjLW02OGsuYzogSW5jbHVkZSBlbGYvbTY4ay5oLgotICAgICAgICAobTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IE5ldyByb3V0aW5lLgotICAgICAgICAqIHRjLW02OGsuaCAoZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcgbTY4a19lbGZfZmluYWxfcHJvY2Vzc2luZyk6Ci0gICAgICAgIERlZmluZS4KLSAKLU1vbiBNYXkgIDMgMTA6MjY6MDMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgMjIgYml0IGZtdCBpbnNuIGxpa2UgYQotCTE3IGJpdCBmbXQgaW5zbi4KLQotMTk5OS0wNC0zMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1jb3JlX3Nfc2VjdGlvbik6IER1bXAgbGl0ZXJhbHMgYmVmb3JlCi0JY2hhbmdpbmcgc2VjdGlvbi4KLQotMTk5OS0wNC0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX2FwcGx5X2ZpeDMpOiBJbnNlcnQgcmVsb2MgYWRkZW5kIGludG8gaW5zbgotCWZvciBDT0ZGL1BFIHBvcnQuCi0KLU1vbiBBcHIgMjYgMTI6MzQ6MzcgMTk5OSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuaCAoVENfRklYX1RZUEUpOiBEZWxldGUsIGNnZW4gZmllbGRzIG1vdmVkIHRvIHdyaXRlLmguCi0JKFRDX0lOSVRfRklYX0RBVEEpOiBEZWxldGUuCi0JKiBjb25maWcvdGMtbTMyci5oIChUQ19GSVhfVFlQRSk6IERlbGV0ZSwgY2dlbiBmaWVsZHMgbW92ZWQgdG8gd3JpdGUuaC4KLQkoVENfSU5JVF9GSVhfREFUQSk6IERlbGV0ZS4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBOZXcgbWVtYmVyIGZ4X2NnZW4sIGlmZGVmIFVTSU5HX0NHRU4uCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBmeF9jZ2VuIG1lbWJlci4KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwLGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBVcGRhdGUuCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZS4KLQkobWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogVXBkYXRlLgotCShGWF9PUElORk9fUl9UWVBFKTogVXBkYXRlLgotCi0JKiBmcmFncy5jIChmcmFnX3ZhcixmcmFnX3ZhcmlhbnQpOiBJbml0aWFsaXplIGZyX2NnZW4gaGVyZS4KLQkqIGNvbmZpZy90Yy1mcjMwLmggKFRDX0ZSQUdfSU5JVCk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKFRDX0ZSQUdfSU5JVCk6IERlbGV0ZS4KLQkqIGZyYWdzLmggKHN0cnVjdCBmcmFnKTogTWFrZSBvcGluZGV4LCBvcGluZm8gaW50cy4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoRlhfT1BJTkZPX1JfVFlQRSk6IERlbGV0ZSwgdW51c2VkLgotCi0xOTk5LTA0LTI2ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogVXBkYXRlZCBmb3IgbmV3IHZlcnNpb24gb2YgbGlidG9vbC4KLQotMTk5OS0wNC0yMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWVkIGZ1bmN0aW9uIGZyb20KLQltZF9hcHBseV9maXguIAotCShtZF9hcHBseV9maXgzKTogRG8gbm90IGZpeCB1cCBhYnNvbHV0ZSByZWxvY2F0aW9ucyBhZ2FpbnN0Ci0Jc3ltYm9saWMgdmFsdWVzLgotCi0JKiBjb25maWcvdGMtbWNvcmUuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotMTk5OS0wNC0yMCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1jb3JlLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBpbnRlcmNlcHRzIGZvciBzZWN0aW9uCi0JY2hhbmdlcyBhbmQgZGF0YS1pbi10ZXh0IGRpcmVjdGl2ZXMuCi0JKG1jb3JlX2NvbnMpOiBOZXcgZnVuY3Rpb246IGludGVyY2VwdCBjb25zKCkgb3BlcmF0aW9ucy4KLQkobWNvcmVfZmxvYXRfY29ucyk6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IGZsb2F0X2NvbnMoKQotCW9wZXJhdGlvbnMuIAotCShtY29yZV9zdHJpbmdlcik6IE5ldyBmdW5jdGlvbjogaW50ZXJjZXB0IHN0cmluZ2VyKCkgb3BlcmF0aW9ucy4KLQotMTk5OS0wNC0xOCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IENoYW5nZSBnZW5lcmF0ZV9hc21fbGluZW5vIGZpZWxkIHRvCi0JdGFrZSBubyBwYXJhbWV0ZXJzLgotCSogY29uZmlnL29iai1lY29mZi5oIChPQkpfR0VORVJBVEVfQVNNX0xJTkVOTyk6IERvbid0IGRlZmluZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGZpbmRfb3Bjb2RlX21hdGNoKTogQWRkIGRlZmF1bHQgY2FzZSB0bwotCXN3aXRjaC4KLQkoZmluZF9tYWNyb19tYXRjaCk6IExpa2V3aXNlLgotCShsb2FkX2V4cHJlc3Npb24pOiBQYXJlbnRoZXNpemUgJiYgd2l0aGluIHx8LgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lLgotCi0xOTk5LTA0LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWNvcmUuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIG92ZXJyaWRlcyBmb3IgLmJzcwotCS50ZXh0IC5kYXRhIC5zZWN0aW9uIHBzZXVkbyBvcHMuCi0JKG1jb3JlX3Nfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0JKG1jb3JlX3NfdGV4dCk6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0JKG1jb3JlX3NfZGF0YSk6IE5ldyBmdW5jdGlvbi4gIER1bXAgbGl0cyBiZWZvcmUgY2hhbmdpbmcgc2Vjcy4gCi0KLTE5OTktMDQtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzMyYml0bW9kZSk6IE5ldy4KLQkobWRfYmVnaW4pOiBTZXQgbWlwc18zMmJpdG1vZGUgaWYgbmVlZGVkLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogRG9uJ3Qgc2V0IEVGX01JUFNfQVJDSC4KLQlTZXQgRUZfTUlQU18zMkJJVE1PREUuCi0KLUZyaSBBcHIgMTYgMTI6MjY6MzkgMTk5OSAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3NlY3Rpb25fc3ltYm9sKTogRml4IHR5cG8gaW4gcHJldmlvdXMKLQljaGFuZ2UuCi0KLTE5OTktMDQtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5oIChMT0NBTF9MQUJFTFNfRkIpOiBEZWZpbmUgdG8gMS4KLQotVGh1IEFwciAxNSAxNjo1MjowOSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfZ2V0X2Fic29sdXRlX2V4cmVzc2lvbik6IFRyeSB0byBoYW5kbGUgIjUgJXIzIiAKLQlleHByZXNzaW9ucyBjb3JyZWN0bHkuCi0KLQotMTk5OS0wNC0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcpOiBTZXQgRUZfTUlQU19BUkNILgotCi1Nb24gQXByIDEyIDIzOjQ1OjA3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnMycpOiBOZXcgY2FzZSBmb3IgUEEyLjAgZm1weWZhZGQKLQlhbmQgZm1weW5mYWRkIGluc3RydWN0aW9ucy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZW52aXJvbik6IERlY2xhcmUgaXQsIGlmIG5lZWRlZC4KLQkqIGFzLmMgKGR1bXBfc3RhdGlzdGljcyk6IERvbid0IGRlY2xhcmUgZW52aXJvbi4KLQkqIGNvbmZpZ3VyZS5pbiAoZW52aXJvbik6IERldGVjdCBkZWNsYXJhdGlvbi4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfaW1tZWRpYXRlKTogQWNjZXB0IEBHT1QgcmVsb2NhdGlvbnMuCi0JKGkzODZfZGlzcGxhY2VtZW50KTogQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciByZXBsYWNlbWVudCBidWZmZXIuCi0JQ2xlYW4gdXAgcmVwbGFjZW1lbnQgYnVmZmVyIGluaXRpYWxpemF0aW9uLgotCi0xOTk5LTA0LTExICBCb2IgTWFuc29uIDxtYW5zb25AY2hhcm1lZC5jeWdudXMuY29tPjoKLQotCSogc3Vic2Vncy5jIChzZWN0aW9uX3N5bWJvbCk6IERvbid0IGNyZWF0ZSBhIG5ldyBzeW1ib2wgaWYgb25lCi0JYWxyZWFkeSBleGlzdHM7IGluc3RlYWQsIHVzZSB0aGUgZXhpc3Rpbmcgb25lLCBidXQgc2V0IGl0cyBzZWdtZW50Ci0JYW5kIGZyYWcgZGF0YSBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zZWN0aW9uX3N5bWJvbCk6IExpa2V3aXNlLgotCi1TYXQgQXByIDEwIDIwOjEwOjAyIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IENhbGwgYXNfYmFkIGluc3RlYWQgb2YgYWJvcnQuCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tY29yZS5jOiBOZXcgRmlsZTogU3VwcG9ydCByb3V0aW5lcyBmb3IgTUNvcmUKLQlhc3NlbWJsZXIuCi0JKiBjb25maWcvdGMtbWNvcmUuaDogTmV3IEZpbGU6IERlZmluaXRpb25zIGZvciBNQ29yZSBhc3NlbWJsZXIuIAotCSogY29uZmlnL29iai1jb2ZmLmM6IEFkZCBzdXBwb3J0IGZvciBtY29yZS1wZSB0YXJnZXQuCi0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgTUNvcmUgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotCSogZG9jL2FsbC50ZXhpOiBTZXQgTUNPUkUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgTUNvcmUgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0JCi0JKiB3cml0ZS5oOiBQcmV2ZW50IG11bHRpcGxlIGluY2x1c2lvbi4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGFzaW50bC5oIChMQ19NRVNTQUdFUyk6IE5ldmVyIGRlZmluZS4KLQkqIGFzLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUgc3lzdGVtCi0JZG9lcyBub3QgZGVmaW5lIGl0LgotCSogZ2FzcC5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlIHN5c3RlbQotCWRvZXMgbm90IGRlZmluZSBpdC4KLQotCSogTWFrZWZpbGUuYW0gKG02OGstcGFyc2UuYyk6IElmIGNvbmZpZ3VyaW5nIGluIHRoZSBzb3VyY2UKLQlkaXJlY3RvcnksIGNvcHkgbTY4ay1wYXJzZS55IGludG8gdGhlIGxvY2FsIGRpcmVjdG9yeSBiZWZvcmUKLQlydW5uaW5nIHlsd3JhcCwgdG8gcmVtb3ZlIHNwdXJpb3VzIGRpZmZlcmVuY2VzIHdoZW4gZ2VuZXJhdGluZwotCXNuYXBzaG90cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBKdXN0IGFsbG9jYXRlIHRoZSBudW1iZXIgb2YKLQlieXRlcyBuZWNlc3NhcnksIHJhdGhlciB0aGFuIGFsd2F5cyBhbGxvY2F0aW5nIDEwMjQuCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IEFkZCBjYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0JKiByZWFkLmMgKGdlbmVyYXRlX2xpbmVub19kZWJ1Zyk6IEFkZCBjYXNlcyB0byBzd2l0Y2guICBSZWluZGVudC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfc2NhbGUpOiBBZGQgcmV0dXJuIHZhbHVlLgotCShidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB0ZW1wX2Rpc3AyLgotCShpMzg2X2ludGVsX21lbW9yeV9vcGVyYW5kKTogQWRkIHBhcmVudGhlc2VzIHRvIGF2b2lkIHdhcm5pbmcuCi0JKGkzODZfaW50ZWxfb3BlcmFuZCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgZW5kX29mX29wZXJhbmRfc3RyaW5nLgotCShpMzg2X29wZXJhbmQpOiBSZW1vdmUgdW51c2VkIGxvY2FsIG9wZXJhbmRfbW9kaWZpZXIuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBwYXJlbnMgdG8gYXZvaWQgd2FybmluZy4KLQotMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG1pcHMqLSotdnh3b3JrcyogdGFyZ2V0OyBoYXZlIGl0IGRlZmluZQotCU1JUFNfU1RBQlNfRUxGLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciBhcm0tZXBvYy1wZS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZy90ZS1lcG9jLXBlLmg6IE5ldyBmaWxlLiAgRGVmaW5lIG1hY3JvcyBzcGVjaWZpYyB0bwotCWFybS1lcG9jLXBlIHRhcmdldC4KLQkqIGNvbmZpZy90Yy1hcm0uaDogU2VsZWN0IGVwb2MtcGUtYXJtIHRhcmdldCBmb3JtYXQgaWYgY29uZmlndXJlZAotCWZvciBhcm0tZXBvYy1wZSB0YXJnZXQuCi0KLU1vbiBNYXIgMjkgMTA6MTU6NDAgQ1NUIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6ICBBZGp1c3QgdmFsdWUgZm9yIGxpbmtvbmNlIHNlY3Rpb25zLgotCi1XZWQgTWFyIDI0IDE0OjExOjEwIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IENsZWFuIHVwIGNvZGUgdG8KLQlkZXRlY3QgIixuIiB3aXRob3V0IGEgY29uZGl0aW9uLgotCShwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0cik6IExpa2V3aXNlLgotCi0KLVR1ZSBNYXIgMjMgMTE6Mjg6MjMgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB0Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd+Jyk6IFRoZSBjb25kaXRpb24gZm9yIGEgYnJhbmNoIG9uIGJpdAotCWluc3RydWN0aW9uIGlzIGVuY29kZWQgd2l0aCBvbmUgYml0LgotCi0KLTE5OTktMDMtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogTWVudGlvbiB0aGF0Ci0JbGluZV9zZXBhcmF0b3JfY2hhcnMgc2hvdWxkIG5vdCBpbmNsdWRlIG5ld2xpbmUuICBGcm9tIHRoaQotCTx0dG5AbWluZ2xlLmdsdWcub3JnPi4KLQotMTk5OS0wMy0yMiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2JlZ2luKTogVXBkYXRlIGNhbGwgdG8gbTMycl9jZ2VuX2NwdV9vcGVuLgotCi1TdW4gTWFyIDIxIDE4OjA4OjE4IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKG1kX2Fzc2VtYmxlKTogQWxsb3cgJzYnIGluIGFuIG9wY29kZS4KLQotVGh1IE1hciAxOCAxMDo1NTozMCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ2EnKTogRG8gbm90IGNhbGwgcGFfcGFyc2VfLi4uX2NtcHN1Yl9jbXBsdHIuCi0KLQotVGh1IE1hciAxOCAwMjozMDowNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocGFfaXAsIGNhc2UgJ2QnKTogRG8gbm90IGFsbG93ICIsbiIuCi0JCi0xOTk5LTAzLTE1ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogQ2hhbmdlICctJyBiYWNrIHRvIGEgc3ltYm9sIGNoYXIKLQlzbyB3ZSBjYW4gdXNlIG11bHRpcGxlIG9wY29kZXMgb24gYSBsaW5lIGFnYWluLgotCi0JKiBjb25maWcvdGMtZDMwdi5jOiBCeSBkZWZhdWx0LCB3YXJuIGlmIGEgc3ltYm9sIGhhcwotCXRoZSBzYW1lIG5hbWUgYXMgYSByZWdpc3Rlci4gIFBsdXMgc29tZSBtaW5vcgotCXVwZGF0ZXMgZnJvbSB0aGUgYnJhbmNoLgotCi0xOTk5LTAzLTEzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogSGFuZGxlIEJGRF9SRUxPQ184LAotCUJGRF9SRUxPQ18xNiBhbmQgQkZEX1JFTE9DXzY0LgotCi0xOTk5LTAzLTEyICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGV4cHIuYyAoZXhwcik6IEFkZCBtaXNzaW5nIGVsc2UuCi0KLTE5OTktMDMtMTIgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZS4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ1BVX1RZUEVTKTogQWRkIGZyMzAuCi0JKGNnZW4ubyk6IEFkZCAkKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIGRlcGVuZGVuY3kuCi0JKGZyMzAsbTMyciBkZXBlbmRlbmNpZXMpOiBVcGRhdGUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9yZWNvcmRfZml4dXApOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKGdhc19jZ2VuX3JlY29yZF9maXh1cF9leHApOiBEaXR0by4KLQkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBDYWxsIGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtLgotCShnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogRGl0dG8uICBVcGRhdGUgY2FsbCB0byBzZXRfdm1hX29wZXJhbmQuCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFVwZGF0ZSBjYWxsIHRvIGZyMzBfY2dlbl9jcHVfb3Blbi4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bS4KLQkobWRfY2dlbl9sb29rdXBfcmVsb2MpOiBVcGRhdGUgdXNlIG9mIG9wZXJhbmQtPnR5cGUuCi0JKG0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwKTogRGl0dG8uCi0KLTE5OTktMDMtMDkgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCBtZXNzYWdlLgotCi0xOTk5LTAzLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNIFN5bnRheCk6IERvY3VtZW50IG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoZXMKLQlhbmQgTERSIHJlZyw9PGV4cHI+IGluc3RydWN0aW9uLgotCi0JKiBjb25maWcvdGMtYXJtLmM6IEFkZCBzdXBwb3J0IGZvciAtbWNwdT1hcm04MTAsIC1tY3B1PWFybTkgYW5kCi0JLW1jcHU9YXJtOXRkbWkuCi0KLUZyaSBGZWIgMTkgMDk6MzY6MzAgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1hcm0udGV4aSAoQVJNLUNoYXJzKTogRml4IHR5cG8gaW4gdXNlIG9mICdAJy4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVRoaXMgcGF0Y2ggd2FzIGNyZWF0ZWQgYnk6IFNjb3R0IEJhbWJyb3VnaAotCTxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0JCi0JKiBhcHAuYzogCi0JICBTcGVjaWFsIGNhc2VkICdAJyBjaGFyYWN0ZXIuICBUaGUgJ0AnIGNoYXJhY3RlciBpcyB1c2VkIGFzIHRoZQotCSAgQVJNIGFzc2VtYmxlciBjb21tZW50IGNoYXJhY3RlciwgYXMgYSBzcGVjaWFsIGNoYXJhY3RlciAKLQkgIGFuZCBpbiBFTEYgLnN5bXZlciBwc2V1ZG8tb3AncywgYW5kIGFzIGEgc3BlY2lhbCBjaGFyYWN0ZXIgaW4KLQkgIC50eXBlIGFuZCAuc2VjdGlvbiBwc2V1ZG8tb3BzLgotCShzeW12ZXJfcHNldWRvKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3ltdmVyX3N0YXRlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3RydWN0IGFwcF9zYXZlKTogQWRkIGZpZWxkICdzeW12ZXJfc3RhdGUnLgotCShhcHBfcHVzaCk6IFNhdmUgZ2xvYmFsIHN5bXZlcl9zdGF0ZSBpbnQgc3RydWN0IGFwcF9zYXZlLgotCShhcHBfcG9wKTogUmVzdG9yZSBnbG9iYWwgc3ltdmVyX3N0YXRlIGZyb20gc3RydWN0IGFwcF9zYXZlLgotICAJKGRvX3NjcnViX2NoYXJzKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIG9mICdAJyBjaGFyYWN0ZXIgaW4KLQkuc3ltdmVyIHBzZXVkby1vcHMuIAotCi0JKiBjb25maWd1cmUuaW46IE1vZGlmaWVkIHRvIHJlY29nbml6ZSBhcm12KiB1bmFtZSBzeW50YXggZnJvbSBBUk0KLQlMaW51eCBrZXJuZWwuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgJyUnIGFzIHdlbGwgYXMgJ0AnIGFzCi0JYSBwcmVmaXggdG8gdGhlIHNlY3Rpb24ncyB0eXBlLgotCShvYmpfZWxmX3R5cGUpOiBBbGxvdyAnJScgYXMgd2VsbCBhcyAnQCcgYW5kICcjJyBhcyBwcmVmaXhlcyB0bwotCXRoZSB0eXBlJ3MgdHlwZW5hbWUuCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogQWRkIHN1cHBvcnQgZm9yIFBJQyBnZW5lcmF0aW9uOgotCShwaWNfY29kZSk6IE5ldyBib29sZWFuLgotCShvYmpfcmVsb2NhdGVfZXh0ZXJuKTogRGVmaW5lLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUKLQkoVENfQ09OU19GSVhfTkVXKTogRGVmaW5lLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZS4KLQkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVmaW5lLgotCQotCSogY29uZmlnL3RjLWFybS5jOiBBZGQgc3VwcG9ydCBmb3IgUElDIGdlbmVyYXRpb246Ci0JKGxpbmVfc2VwZXJhdG9yX2NoYXJzKTogQWxsb3cgJzsnIGFzIGEgc2VwZXJhdG9yIGZvciBMaW51eC4KLQkoaXNfaW1tZWRpYXRlX3ByZWZpeCk6IE5ldyBtYWNyby4KLQkoYXJtX3BhcnNlX3JlbG9jKTogTmV3IGZ1bmN0aW9uLgotCShzX2FybV9lbGZfY29ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZG9fYnJhbmNoKTogU3BlY2lhbCBjYXNlIGZvciBCRkRfUkVMT0NfQVJNX1BMVDMyLgotCShtZF91bmRlZmluZWRfc3ltYm9sKTogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciB0aGUgR2xvYmFsIE9mZnNldAotCSAgVGFibGUncyBzeW1ib2wuCi0JKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgUElDIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIFBJQyByZWxvY3MuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAnLWsnIGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8KLQkgIGVuYWJsZSBQSUMgZ2VuZXJhdGlvbi4KLQkoY29uc19maXhfbmV3X2FybSk6IE5ldyBmdW5jdGlvbi4KLQkoc19hcm1fZWxmX2NvbnMpOiBOZXcgZnVuY3Rpb24uCi0KLVR1ZSBGZWIgMTYgMTY6MzE6NTMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBjb21tZW50cyBmb3IgdXNlcyBvZiBBQ19ERUZJTkUuCi0JKiBhY2luY2x1ZGUubTQ6IExpa2V3aXNlLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTE1ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcDogY2FzZSAnbycpOiBGaXggYXNzZXJ0aW9uIGZhaWx1cmUgZm9yCi0Jbm9uLWNvbnN0YW50IG9mZnNldCBmcm9tIGEgYmFzZSByZWdpc3Rlci4KLQotMTk5OS0wMi0xNCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQHJhZWJ1cm4ub3JnPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvd191c2FnZSk6IFB1dCBcIGJlZm9yZSBuZXdsaW5lIGluCi0Jc3RyaW5ncyBhbHdheXMuCi0KLVNhdCBGZWIgMTMgMTQ6MTA6MTAgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGNwdV90eXBlcyk6IEVuYWJsZSBFVjYgUEFMY29kZSB3aXRoIC1tMjEyNjQuCi0JKGVtaXRfaW5zbik6IExvb2sgZm9yIHBjLXJlbGF0aXZlIGFuZCBuby1vdmVyZmxvdyBzcGVjaWZpZXJzIG9uCi0JaW50ZXJuYWwgcmVsb2NhdGlvbiB0eXBlcy4KLQotMTk5OS0wMi0xMyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGkgKE1JUFMgT3B0cyk6IFVwZGF0ZWQgbGlzdCBvZiAtbU5OTk4gYW5kCi0JLW1jcHU9Tk5OTiBmbGFncy4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogUmVtb3ZlIGFsbCB0aGUgbWlwc19OTk5OIHZhcmlhYmxlczsganVzdCB1c2UKLQltaXBzX2NwdSBpbnN0ZWFkLgotCShtaXBzXzQ2NTAsIG1pcHNfNDAxMCwgbWlwc180MTAwKTogVmFyaWFibGVzIHJlbW92ZWQuCi0JKGhpbG9faW50ZXJsb2NrcywgZ3ByX2ludGVybG9ja3MsIGFwcGVuZF9pbnNuLCBtYWNyb19idWlsZCwgbWFjcm8sCi0JbWFjcm8yLCBtaXBzMTZfbWFjcm8sIG1pcHNfaXApOiBUZXN0IG1pcHNfY3B1LCBub3QgdGhlIG1pcHNfTk5OTgotCXZhcmlhYmxlcy4KLQkobWRfYmVnaW4pOiBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nIHRoZSBtaXBzX05OTk4gdmFyaWFibGVzOwotCW1pcHNfY3B1IGlzIHNldCwgYW5kIHRoYXQncyBnb29kIGVub3VnaCBub3cuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhdmUgdGhlIC1tTk5OTiBvcHRpb25zIHNldCBtaXBzX2NwdSBpbnN0ZWFkIG9mCi0JdGhlIG1pcHNfTk5OTiB2YXJpYWJsZS4gIFRoZSAtbm8tbU5OTk4gZmxhZ3MgYXJlIG5vdyBuby1vcHMuCi0JKHNob3cpOiBOZXcgZnVuY3Rpb24sIHRvIGhhbmRsZSB3cmFwcGluZyBpbiB0aGUgQ1BVIGxpc3RzLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlIGxpc3RzIG9mIC1tY3B1IGFuZCAtbU5OTk4gc3dpdGNoZXMuCi0KLVNhdCBGZWIgMTMgMDA6MTc6MjYgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9pbnRlbF9vcGVyYW5kKTogSWdub3JlIGBTSE9SVCcgcmF0aGVyCi0JdGhhbiB0cmVhdCBhcyBhbiBpbW1lZGlhdGUgc3BlY2lmaWVyLgotCi1UaHUgRmViIDExIDE2OjE4OjMxIDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFByb3RvdHlwZSBtYW55IGZ1bmN0aW9ucy4KLQkoc2V0X2ludGVsX3N5bnRheCk6IEFjY2VwdCBgcHJlZml4Jy9gbm9wcmVmaXgnIHNwZWNpZmllcnMuCi0JKGkzODZfaW1tZWRpYXRlKTogUmVtb3ZlIHVudXNlZCBzZWNvbmQgYXJndW1lbnQuCi0JKGkzODZfaW50ZWxfb3BlcmFuZCk6IEZpeCBpMzg2X2lzX3JlZyB0eXBvLgotCShpMzg2X29wZXJhbmQpOiBVc2UgYWxsb3dfbmFrZWRfcmVnLgotCShvdXRwdXRfaW52YWxpZCk6IE1ha2Ugb3BlcmFuZCBpbnQgZm9yIEsmUi4KLQotVGh1IEZlYiAxMSAxMToyMTowMiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9hc19uZXdfU09VUkNFUyk6IFVuY29tbWVudC0tZml4ZWQgYnkgYXV0b21ha2UKLQlwYXRjaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTAyLTA5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IENoYW5nZSBjZ2VuLW9wYy5oIHRvIGNnZW4tZGVzYy5oLgotCShjZ2VuLm8pOiBEaXR0by4KLQkoRVhUUkFfYXNfbmV3X1NPVVJDRVMpOiBDb21tZW50IG91dC4KLQkoLnRjZGVwKTogPGFyY2g+LW9wYy5oIHJlbmFtZWQgdG8gPGFyY2g+LWRlc2MuaC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTMuICBSZWRvIHVzaW5nX2NnZW4gaGFuZGxpbmcuCi0JRGVsZXRlIGNhbGwgdG8gQU1fQ1lHV0lOMzIuICBSZXBsYWNlIEFNX0VYRUVYVCB3aXRoIEFDX0VYRUVYVC4KLQkoQUNfT1VUUFVUKTogPGFyY2g+LW9wYy5oIHJlbmFtZWQgdG8gPGFyY2g+LWRlc2MuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0JKiBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBjZ2VuLmM6IEluY2x1ZGUgY2dlbi1kZXNjLmgsIG5vdCBjZ2VuLW9wYy5oLgotCSgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKGdhc19jZ2VuX2NwdV9kZXNjKTogUmVuYW1lZCBmcm9tIGdhc19jZ2VuX29wY29kZV9kZXNjLgotCUNHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JQ0dFTl9PUEVSQU5EX0FUVFIgcmVuYW1lZCB0byBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRS4KLQkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwKTogUmVtb3ZlIHVubmVjZXNzYXJ5ICE9IDAgdGVzdC4KLQkoZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERpdHRvLgotCShnYXNfY2dlbl9maW5pc2hfaW5zbik6IERpdHRvLiAgUmVmZXIgdG8gb3BlcmFuZCB0YWJsZSB2aWEgY3B1Ci0JZGVzY3JpcHRvciwgbm90IGdsb2JhbCB2YXJpYWJsZS4KLQkoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IFJlZmVyIHRvIG9wZXJhbmRfdGFibGUgdmlhIGNwdQotCWRlc2NyaXB0b3IsIG5vdCBnbG9iYWwgdmFyaWFibGUuICBSZWZlciB0byBpbnNlcnRfb3BlcmFuZCBoYW5kbGVyCi0JdmlhIGNwdSBkZXNjcmlwdG9yLCBub3QgZ2xvYmFsIGZ1bmN0aW9uLgotCSogY2dlbi5oICgqKTogQ0dFTl9PUENPREVfREVTQyByZW5hbWVkIHRvIENHRU5fQ1BVX0RFU0MuCi0JKiBjb25maWcvdGMtZnIzMC5jOiBJbmNsdWRlIG9wY29kZXMvZnIzMC1kZXNjLmguCi0JKCopOiBnYXNfY2dlbl9vcGNvZGVfZGVzYyByZW5hbWVkIHRvIGdhc19jZ2VuX2NwdV9kZXNjLgotCUNHRU5fSU5TTl9BVFRSIHJlbmFtZWQgdG8gQ0dFTl9JTlNOX0FUVFJfVkFMVUUuCi0JVXBkYXRlIGNhbGwgdG8gQ0dFTl9PUEVSQU5EX1RZUEUsQ0dFTl9JTlNOX09QRVJBTkRTLgotCSogY29uZmlnL3RjLW0zMnIuYzogRGl0dG8uCi0JKGFzc2VtYmxlX3R3b19pbnNucyk6IFVwZGF0ZSBjYWxscyB0byBjZ2VuX2xvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkobWRfY29udmVydF9mcmFnKTogVXBkYXRlIGNhbGwgdG8gQ0dFTl9PUEVSQU5EX0VOVFJZLgotCi0xOTk5LTAyLTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggaGFuZGxpbmcgb2YgbGFiZWwxIC0gbGFiZWwyCi0JcmVsb2NhdGlvbnMgZm9yIEVMRiB0YXJnZXRzLgotCi0xOTk5LTAyLTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAyLTA1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmg6IFRpZHkgT0JKX0VMRiBhbmQgT0JKX0NPRkYgZGVmaW5pdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSAotCWZvciBDT0ZGIHBvcnRzLgotCi1XZWQgRmViICAzIDExOjM1OjQ3IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG93X3VzYWdlKTogRG9jdW1lbnQgcGNhNTYgYW5kIGV2NiBvcHRpb25zLgotCi1Nb24gRmViICAxIDIwOjM3OjMwIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWkzODYuaCAoTE9OR19ET1VCTEVfTU5FTV9TVUZGSVgpOiAgRGVmaW5lLgotICAgICAgICAoSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpOiAgRGVmaW5lLgotICAgICAgICAoQllURV9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoV09SRF9QVFIpOiAgRGVmaW5lLgotICAgICAgICAoRFdPUkRfUFRSKTogIERlZmluZS4KLSAgICAgICAgKFhXT1JEX1BUUik6ICBEZWZpbmUuCi0gICAgICAgIChTSE9SVCk6ICBEZWZpbmUuCi0gICAgICAgIChPRkZTRVRfRkxBVCk6ICBEZWZpbmUuCi0gICAgICAgIChGTEFUKTogIERlZmluZS4KLSAgICAgICAgKE5PTkVfRk9VTkQpOiAgRGVmaW5lLgotICAgICAgICAoTm9fZFN1Zik6ICBEZWZpbmUuCi0gICAgICAgIChOb194U3VmKTogIERlZmluZS4KLSAgICAgICAgKiBjb25maWcvdGMtaTM4Ni5jICAoc2V0X2ludGVsX3N5bnRheCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGludGVsX3N5bnRheCk6ICBEZWNsYXJlLgotICAgICAgICAoYWxsb3dfbmFrZWRfcmVnKTogIERlY2xhcmUuCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiAgU3VwcG9ydCAuaW50ZWxfc3ludGF4IGFuZCAuYXR0X3N5bnRheC4KLSAgICAgICAgKGludGVsX2Zsb2F0X29wZXJhbmQpOiAgTmV3IHJvdXRpbmUuCi0gICAgICAgIChtZF9hc3NlbWJsZSk6ICBIYW5kbGUgSU5URUxfRFdPUkRfTU5FTV9TVUZGSVguCi0gICAgICAgIEhhbmRsZSBicmFja2V0cyBhcyB3ZWxsIGFzIHBhcmVucy4gIENhbGwgaTM4Nl9pbnRlbF9vcGVyYW5kIGZvcgotICAgICAgICBpbnRlbCBzeW50YXguICBSZXZlcnNlIG9wZXJhbmRzIGlmIGFwcHJvcHJpYXRlLiAgSGFuZGxlIG5ldwotICAgICAgICBzdWZmaXhlcy4gIEhhbmRsZSBtb3Z6eCBhbmQgbW92c3guCi0gICAgICAgIChpMzg2X2lzX3JlZyk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfaW1tZWRpYXRlKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9zY2FsZSk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfZGlzcGxhY2VtZW50KTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9vcGVyYW5kX21vZGlmaWVyKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoYnVpbGRfZGlzcGxhY2VtZW50X3N0cmluZyk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfcGFyc2Vfc2VnKTogIE5ldyByb3V0aW5lLgotICAgICAgICAoaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfaW50ZWxfb3BlcmFuZCk6ICBOZXcgcm91dGluZS4KLSAgICAgICAgKGkzODZfb3BlcmFuZCk6ICBDYWxsIGkzODZfZGlzcGxhY2VtZW50LCBpMzg2X2ltbWVkaWF0ZSwKLSAgICAgICAgaTM4Nl9zY2FsZSwgZXRjLiAgaW5zdGVhZCBvZiBoYW5kbGluZyBpbmxpbmUuCi0gICAgICAgIChwYXJzZV9yZWdpc3Rlcik6ICBIYW5kbGUgcmVnaXN0ZXJzIHdpdGhvdXQgcHJlZml4LgotCi1Nb24gRmViICAxIDEyOjI0OjU4IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlOiAgUmVnZW5lcmF0ZS4KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGFybS0qLW9hYmkpOiAgTmV3LgotICAgICAgICAodGh1bWItKi1vYWJpKTogIE5ldy4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKHRhcmdldF9vYWJpKTogIERlY2xhcmUuCi0gICAgICAgIChtZF9hcHBseV9maXgzKTogU3VwcG9ydCBSRUwgcmVsb2NzLgotICAgICAgICAobWRfcGFyc2Vfb3B0aW9uKTogIEhhbmRsZSAtb2FiaS4KLSAgICAgICAgKGVsZjMyX2FybV90YXJnZXRfZm9ybWF0KTogIE5ldyByb3V0aW5lLgotICAgICAgICAobWRfbG9uZ29wdHMpOiAgQWRkIE9QVElPTl9PQUJJLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIFJlZGVmaW5lIFRBUkdFVF9GT1JNQVQuCi0KLQotMTk5OS0wMS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSGFuZGxlIG91dCBvZiByYW5nZSBlcnJvci4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAoZnIzMF9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkoZnIzMF9mb3JjZV9yZWxvY2F0aW9uKTogRGVmYXVsdCB0byAwLgotCi0JKiBjb25maWcvdGMtZnIzMC5oIChvYmpfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IERvIG5vdCBhcHBseSBmaXhlcyB0byBWVEFCTEUKLQlyZWxvY3MuIAotCi0xOTk5LTAxLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRG8gbm90IGdlbmVyYXRlIGEgc2VxdWVudGlhbAotCW1lcmdlIG9mIHR3byBpbnN0cnVjdGlvbnMgaWYgdGhlIGxlZnQgaW5zdHJ1Y2l0b24ga2lsbHMgdGhlIHJpZ2h0LgotCi0xOTk5LTAxLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluOiBSZWRvIHRlc3QgZm9yIHVzaW5nIGNnZW4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfYWRqdXN0X3N5bXRhYik6IFByZXZlbnQgYWNjaWRlbnRhbAotCXJlZGVmaW5pdGlvbiBvZiB0aGlzIG1hY3JvLgotCi1UdWUgSmFuICA1IDIxOjU4OjAzIDE5OTkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZnJvYl9maWxlKTogRGlzYWJsZSAiVW5tYXRjaGVkICVoaSByZWxvYyIKLQl3YXJuaW5nLgotCi0xOTk4LTEyLTI5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBGb3IgbWlwczE2LCBpbnNlcnQgYSBub3AgYmV0d2VlbgotCWEgcmVhZCBvZiBISSBvciBMTyBhbmQgYW4gaW1tZWRpYXRseSBmb2xsb3dpbmcgYnJhbmNoLgotCi0xOTk4LTEyLTI5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBBbm90aGVyIGNvcnJlY3Rpb24gdG8gdGhlIHNldHRpbmcgb2YKLQltaXBzX2VhYmk2NC4KLQotMTk5OC0xMi0yMyAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQ29ycmVjdCB0eXBlLW8gaW4gc2V0dGluZyBvZiBtaXBzX2VhYmk2NC4KLQotMTk5OC0xMi0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYXNzZW1ibGUpOiBFbWl0IGEgTk9QIGFmdGVyIGEgcmVsYXhhYmxlIDE2Ci0JYml0IGluc24gd2hlbiBvcHRpbWl6aW5nLCBzbyB0aGF0IHBhcmFsbGVsaXNlZCBpbnN0cnVjdGlvbnMgd2lsbAotCXN0YXJ0IG9uIGEgMzIgYml0IGJvdW5kYXJ5LgotCi0xOTk4LTEyLTE5ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lYWJpNjQpOiBOZXcuCi0JKG1kX2JlZ2luKTogU2V0IG1pcHNfZWFiaTY0LgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogVXNlIGl0LgotCi0xOTk4LTEyLTE4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IAotCUNvcnJlY3Qgc2V0dGluZyBvZiBBQkkgaW4gZV9mbGFncy4KLQotV2VkIERlYyAxNiAxNjoxNzoyMiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2Fzc2VtYmxlKTogV2FybiBhYm91dCBpbnZhbGlkIGluc3RydWN0aW9ucyBpbiBkZWxheSBzbG90cy4KLQotMTk5OC0xMi0xNiAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luLG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB2cjQxMTEuCi0JCi0xOTk4LTEyLTE1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoZ2FzX2NnZW5fbWRfYXBwbHlfZml4Myk6IE1hcmsgYXMgYW4gZXJyb3IsIHJhdGhlciB0aGFuIGEKLQl3YXJuaW5nLCB2YWx1ZXMgdGhhdCBkb24ndCBmaXQgaW4gdGhlIGZpZWxkLgotCi0xOTk4LTEyLTE1ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19hYmlfc3RyaW5nKTogTmV3LgotCShtZF9wYXJzZV9vcHRpb24sbWRfbG9uZ29wdHMpOiBBZGQgbWFiaS4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IFNldCBlX2ZsYWdzIGJhc2VkIG9uIG1hYmkgZmxhZy4KLQotMTk5OC0xMi0xNSAgR2F2aW4gUm9taWctS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSB2cjQxMTEuIAotCi05OC0xMi0xMSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IENoYW5nZSBtZXNzYWdlIGdpdmVuIGlmIHRoZQotCWluc3RydWN0aW9uIHJlcXVpcmVzIEg4LzMwMEggbW9kZSBhbmQgd2UncmUgbm90IGluIEhtb2RlLCB0bwotCXN1Z2dlc3QgdGhhdCBpdCBtYXkgYmUgdGhlIG9wZXJhbmQgbW9kZXMgdGhhdCBhcmUgdGhlIHByb2JsZW0sIG5vdAotCW5lY2Vzc2FyaWx5IHRoZSBvcGNvZGUuCi0KLTE5OTgtMTItMTAgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IEFkZCBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIuCi0KLVR1ZSBEZWMgIDggMTk6NTE6NTAgMTk5OCAgTWFyayBLbGVpbiAgPG1rbGVpbkBkaXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEtKi1tcGVpeCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3NvbV9jb21waWxlcik6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLXNvbS5jIChjb21waWxlcl9zZWVuKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkob2JqX3NvbV9jb21waWxlcik6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFVwZGF0ZSB0Y19kYXRhIHVzZXMgZm9yIGNoYW5nZSB0byBiZmQvc29tLmguCi0gCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImNvbXBpbGVyIiBpZiBPQkpfU09NLgotCShwYV90eXBlX2FyZ3MpOiBTZXQgaHBwYV9wcml2X2xldmVsLgotCShwYV9jb21waWxlcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24gaWYgT0JKX1NPTS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIERlYyAgOCAxNTowMDo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAob3V0cHV0X2xlYjEyOCk6IERvbid0IG1hcmsgYXMgaW5saW5lLgotCi0xOTk4LTEyLTA4ICBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3ZieXRlKTogUHJvdG90eXBlIGFuZCBuZXcgZnVuY3Rpb24gZm9yIAotCUFJWCAudmJ5dGUgdW5hbGlnbmVkIGRhdGEgc3VwcG9ydC4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkICd2Ynl0ZScgdG8gbGlzdCBvZiB2YWxpZCBwc2V1ZG9zLgotCShwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFkZCBlaF9mcmFtZSB0byBsaXN0IG9mIEVMRiByZWxvY2F0YWJsZSAKLQlzZWN0aW9ucy4KLQotMTk5OC0xMi0wNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUsIGRvX2Fzc2VtYmxlKTogSW1wcm92ZSBlcnJvbmVvdXMKLQlpbnB1dCBoYW5kbGluZy4gCi0KLU1vbiBEZWMgIDcgMDk6NDg6MzQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKGVsZjMyX2FybV9mb3JjZV9yZWxvY2F0aW9uKTogIENoZWNrIGZvcgotICAgICAgICBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSC4KLQotU3VuIERlYyAgNiAxMjo0NjozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU197QklHLExJVFRMRX1fRU5ESUFOIGFmdGVyCi0JY2hlY2tpbmcgdGhlIHRhcmdldCB0eXBlLgotCShtaXBzLWRlYy1ic2QqKTogU2V0IGVuZGlhbiB0byBsaXR0bGUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQlDT0ZGIHdlYWsgc3ltYm9sIHN1cHBvcnQsIGJhc2VkIG9uIHBhdGNoZXMgZnJvbSBNYXJrIEVsYnJlY2h0Ci0JPHNub3diYWxsM0B1c2EubmV0PjoKLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX1dFQUspOiBEZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfd2Vhayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9ial9jb2ZmX2VuZGVmKSBbYm90aCB2ZXJzaW9uc106IEhhbmRsZSB3ZWFrIHN5bWJvbHMuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBMaWtld2lzZS4KLQkoeWFua19zeW1ib2xzKTogTGlrZXdpc2UuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgIndlYWsiLgotCi0JKiBjb25maWd1cmUuaW4gKG02OGstKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gQXltZXJpYyBWaW5jZW50Ci0JPGF5bWVyaWMudmluY2VudEBlbWkudS1ib3JkZWF1eC5mcj4uCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggY3VycmVudCB0b29scy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGVtaXRfbGRncCk6IEdpdmUgYW4gZXJyb3IgbWVzc2FnZSByYXRoZXIgdGhhbgotCWFuIGFzc2VydGlvbiBmYWlsdXJlIGZvciBhIGNhc2Ugd2UgY2FuJ3QgaGFuZGxlIHdoZW4gT0JKX0VDT0ZGLgotCi0JKiBleHByLmMgKG9wZXJhdG9yKTogQW5kIHdpdGggMHhmZiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHNpZ25lZAotCWNoYXIuCi0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogR2VuZXJhdGUKLQlCRkRfUkVMT0NfRlIzMF80OCBpbnN0ZWFkIG9mIEJGRF9SRUxPQ19GUjMwXzMyLgotCi0xOTk4LTEyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IEVuYWJsZSByZWxvY3MgZm9yCi0JTERJOjIwIGluc24uCi0KLVRodSBOb3YgMjYgMTE6MjM6NDggMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBSZXN0b3JlIHByZXZpb3VzIGNhbGN1bGF0aW9uCi0Jb2YgcGNyZWwgcG9pbnQuCi0KLVR1ZSBOb3YgMjQgMTc6MjE6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWZyMzAuYyAobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogRml4IGNhbGN1bGF0aW9uIG9mCi0JcGNyZWwgcG9pbnQuCi0KLVR1ZSBOb3YgMjQgMTQ6NTQ6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBNYWtlIHN0YXRpYyAnZXR5cGUnIGhhdmUgZmlsZQotCXNjb3BlLgotCShkMTB2X2NsZWFudXApOiBPbmx5IGdlbmVyYXRlIHByZXZpb3VzIGluc24gaWYgYSBtdWx0aWxpbmUgaW5zbiBpcwotCW5vdCBwZW5kaW5nLgotCi1GcmkgTm92IDIwIDExOjQxOjEzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogQWRkIHN1cHBvcnQgZm9yCi0JRlIzMF9PUEVSQU5EX0kzMi4gCi0KLVRodSBOb3YgMTkgMTU6MDE6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgLW1hcm03eHh4IGFuZAotCS1tYXJtNnh4eCBjb21tYW5kIGxpbmUgc3dpdGNoZXMuCi0KLTE5OTgtMTEtMTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKERFUCk6IFVzZSAkKHNyY2RpcikvLi4vbWtkZXAuCi0JKGl0Ymwtb3BzLm8pOiBEZWxldGUgZHVwbGljYXRlIGRlcGVuZGVuY2llcy4KLQlSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQlBZGQgZnIzMCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIE5vdiAxNyAxMzo0Mjo0MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChtZF9jZ2VuX2xvb2t1cF9yZWxvYyk6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0Ci0Jb3Bjb2RlIGxpc3QuCi0JKiBsaXN0aW5nLmM6IElnbm9yZSBsaW5lIHRlcm1pbmF0b3IgY2hhcmFjdGVycyBmb3VuZCBpbnNpZGUKLQlzdHJpbmdzLiAKLQotVGh1IE5vdiAxMiAxOToyMToyNCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2dhcy5wb3Q6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDEyIDEwOjU0OjE2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmMgKGZyMzBfaXNfY29sb25faW5zbik6IE5ldyBuYW1lIGZvcgotCWZyMzBfaXNfbGFiZWxfc3RhcnQoKS4gIEFsc28gY2hlY2tzIGZvciBkZWxheSBzbG90IGluc25zLgotCi0JKiBjb25maWcvdGMtZnIzMC5jIChmcjMwX2lzX2xhYmVsX3N0YXJ0KTogTmV3IGZ1bmN0aW9uOiBIYW5kbGUKLQlGUjMwIGluc3RydWN0aW9ucyB3aGljaCBjb250YWluIGEgY29sb24gaW4gdGhlIG1uZW1vbmljLgotCi0JKiBjb25maWcvdGMtZnIzMC5oIChUQ19TVEFSVF9MQUJFTCk6IERlZmluZSB0aGlzIG1hY3JvLgotCi1XZWQgTm92IDExIDA5OjU4OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IFJlbW92ZWQgY3VycmVudGx5IHN1cGVyZmxvdXMgY29kZS4KLQotVHVlIE5vdiAxMCAxMzoxMzowNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZnIzMC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1mcjMwLmM6IFR3ZWFraW5nIHNvIHRoYXQgaXQgd2lsbCBjb21waWxlLgotCi1UdWUgTm92IDEwIDE0OjQxOjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLWQxMHYuaCAob2JqX2ZpeF9hZGp1c3RhYmxlKTogIERlZmluZS4KLSAgICAgICAgKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiAgRGVmaW5lLgotICAgICAgICAoZDEwdl9mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCi0gICAgICAgICogY29uZmlnL3RjLWQxMHYuYyAodGNfZ2VuX3JlbG9jKTogIEhhbmRsZSBWdGFibGUgcmVsb2NzLgotICAgICAgICAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgVnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKGQxMHZfZml4X2FkanVzdGFibGUpOiAgTmV3LgotICAgICAgICAoZDEwdl9mb3JjZV9yZWxvY2F0aW9uKTogIE5ldy4KLQotTW9uIE5vdiAgOSAxNDoyNTowNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jOiBDaGFuZ2UgZGVmYXVsdCBiZWhhdmlvdXIgdG8gaWdub3JlIHBvdGVudGlhbAotCWNvbmZsaWN0cyBiZXR3ZWVuIHJlZ2lzdGVyIG5hbWUgYW5kIHN5bWJvbCBuYW1lcy4KLQotV2VkIE5vdiAgNCAxODo0MjowMCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGZyMzAtKi0qLgotCSogY29uZmlnL3RjLWZyMzAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0JKiBwby9nYXMucG90OiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAgMiAyMDo1NDoxNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV90d29faW5zbnMpOiBFbnN1cmUgYm90aCBpbnNucwotCWFyZSAxNiBiaXQgaW5zbnMuCi0KLU1vbiBOb3YgIDIgMjA6MTA6MTggMTk5OCAgTWFydGluIHZvbiBMb2V3aXMgIDxsb2V3aXNAaW5mb3JtYXRpay5odS1iZXJsaW4uZGU+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IFNldCBjaGFyYWN0ZXJzIGFib3ZlIDEyNyB0byBiZSBzeW1ib2wKLQljaGFyYWN0ZXJzLgotCShkb19zY3J1Yl9jaGFycyk6IEFkZCBzb21lIGNhc3RzIHRvIHVuc2lnbmVkIGNoYXIgdG8gYXZvaWQKLQl1bndhbnRlZCBzaWduIGV4dGVuc2lvbi4KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBTZXQgY2hhcmFjdGVycyBhYm91dCAxMjcgdG8gYmUgc3ltYm9sCi0JY2hhcmFjdGVycy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2JlZ2luKTogU2V0IGlkZW50aWZpZXJfY2hhcnMgYW5kCi0Jb3BlcmFuZF9jaGFycyBmb3IgdmFsdWVzIGFib3ZlIDEyNy4KLQotTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgT2N0IDI3IDEzOjE4OjQwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYzogQWRkIHN1cHBvcnQgZm9yIHByb2R1Y2luZyBhIGxpc3RpbmcgZnJvbSBwaXBlZAotCWlucHV0LiAKLQotVHVlIE9jdCAyNyAwODo1Njo0NCAxOTk4ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaGlsb19pbnRlcmxvY2tzKTogUmVtb3ZlIG1pcHNfMzkwMC4KLQkoYXBwZW5kX2luc24pOiBBY2NvdW50IGZvciB0aGUgdHgzOSdzIG11bHRpcGx5IGJlaGF2aW9yLgotCi0xOTk4LTEwLTI2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoYXNzZW1ibGVfdHdvX2luc25zKTogUmVuYW1lIGFzc2VtYmxlX3R3b19pbnNucwotCWZyb20gYXNzZW1ibGVfcGFyYWxsZWxfaW5zbnMuICBBZGQgc3VwcG9ydCBmb3IgJy0+JyB0byBpbmRpY2F0ZQotCWV4cGxpY2l0bHkgc2VyaWFsaXppbmcgdGhlIGluc3RydWN0aW9ucy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotU2F0IE9jdCAyNCAxNToxMjoxOSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zaC5jIChzaF9maXhfYWRqdXN0YWJsZSk6ICBBZGp1c3QgRVhURVJOIGFuZAotICAgICAgICBXRUFLIGhhbmRsaW5nLgotCi1UaHUgT2N0IDIyIDEyOjQxOjMzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogIFJldmVydCBsYXN0IGNoYW5nZS4KLQotVGh1IE9jdCAyMiAxMDowMzoxNSAxOTk4ICBSb24gVW5yYXUgIDxydW5yYXVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyA6IHN1cHBvcnQgZnJhbWUgYW5kIHJlZ21hc2svZnJlZ21hc2sgd2hlbgotCSAgTUlQU19TVEFCU19FTEYgaXMgc3BlY2lmaWVkLgotCi1XZWQgT2N0IDIxIDExOzM0OjUxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIE9ubHkgaW5jbHVkZSBpZiBPQkpfRUxGLgotICAgICAgICAobWRfYXBwbHlfZml4KTogIERvbid0IHJldHVybiAxIGZvciBWVEFCTEUgcmVsb2NzLgotICAgICAgICAqIGNvbmZpZy90Yy1zaC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lIG9ubHkgaWYgT0JKX0VMRi4KLQotVHVlIE9jdCAyMCAxMToxODoyOCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGRvYy9jLWkzODYudGV4aTogUmVwbGFjZSBvY2N1cmVuY2VzIG9mICJvcGNvZGUiIHdpdGgKLQkiaW5zdHJ1Y3Rpb24gbW5lbW9uaWMiLCAiaW5zdHJ1Y3Rpb24iLCBvciAibW5lbW9uaWMiIHdoZW4KLQlyZWZlcnJpbmcgdG8gdGhlIG5hbWUgb2YgYW4gaW5zdHJ1Y3Rpb24uICBVc2UgIm9wY29kZSIgd2hlbgotCXJlZmVycmluZyB0byB0aGUgc2VxdWVuY2Ugb2YgbWFjaGluZSBieXRlcy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAob3Bjb2RlX2NoYXJzKTogUmVuYW1lIHRvIG1uZW1vbmljX2NoYXJzLgotCShpc19vcGNvZGVfY2hhcik6IFJlbmFtZSB0byBpc19tbmVtb25pY19jaGFyLgotCShtZF9hc3NlbWJsZSBhbmQgaTM4Nl9vcGVyYW5kKTogQ29ycmVjdCBlcnJvciBtZXNzYWdlcyBmcm9tCi0gICAgICAgICJvcGNvZGUiIHRvICJpbnN0cnVjdGlvbiBtbmVtb25pYyIKLQlSZW5hbWUgdGhyb3VnaG91dCBvcGNvZGVbXSAtPiBtbmVtb25pY1tdLCBvcHAgLT4gbW5lbV9wLAotCU1BWF9PUENPREVfU0laRSAtPiBNQVhfTU5FTV9TSVpFLAotCURXT1JEX09QQ09ERV9TVUZGSVggLT4gRFdPUkRfTU5FTV9TVUZGSVgsCi0JV09SRF9PUENPREVfU1VGRklYIC0+IFdPUkRfTU5FTV9TVUZGSVgsCi0JQllURV9PUENPREVfU1VGRklYIC0+IEJZVEVfTU5FTV9TVUZGSVgsCi0JU0hPUlRfT1BDT0RFX1NVRkZJWCAtPiBTSE9SVF9NTkVNX1NVRkZJWAotCUxPTkdfT1BDT0RFX1NVRkZJWCAtPiBMT05HX01ORU1fU1VGRklYCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKCpfTU5FTV9TVUZGSVgpOiBSZW5hbWUgZnJvbSAqX09QQ09ERV9TVUZGSVguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoZWNrIGZvciBnYXJiYWdlIGFmdGVyCi0JcmVnaXN0ZXIgbmFtZS4KLQotVHVlIE9jdCAyMCAxMDo0OTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGFuZ2UgaGFuZGxpbmcgb2YgUENSRUwgcmVsb2MKLSAJZm9yIEJGRF9BU1NFTUJMRVIgdG8gb25seSBjaGFuZ2UgdmFsdWUgd2hlbiBDT0ZGIGlmIFRFX1BFLgotCi1Nb24gT2N0IDE5IDIwOjIwOjQyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXNoLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgICogY29uZmlnL3RjLXNoLmMgKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiAgSGFuZGxlIFZUIHJlbG9jcy4KLSAgICAgICAgKG1kX2FwcGx5X2ZpeCk6ICBMaWtld2lzZS4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBMaWtld2lzZS4KLSAgICAgICAgKHNoX2ZpeF9hZGp1c3RhYmxlKTogIE5ldy4KLQotTW9uIE9jdCAxOSAxMjozNTo0MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChnYXNfY2dlbl9maW5pc2hfaW5zbik6IFVwZGF0ZSBoYW5kbGluZyBvZiBDR0VOX0lOVF9JTlNOX1AuCi0JKiBjZ2VuLmggKGdhc19jZ2VuX2ZpbmlzaF9pbnNuKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfaW5zbik6IENHRU5fSU5UX0lOU04gLT4gQ0dFTl9JTlRfSU5TTl9QLgotCWNnZW5faW5zbl90IC0+IENHRU5fSU5TTl9JTlQuCi0JKG1ha2VfcGFyYWxsZWwpOiBVcGRhdGUgaGFuZGxpbmcgb2YgQ0dFTl9JTlRfSU5TTl9QLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogRGl0dG8uCi0JKHRhcmdldF9tYWtlX3BhcmFsbGVsKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFVzZSBpdC4KLQotTW9uIE9jdCAxOSAxMzoxNjoxMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZm9yY2VfcmVsb2NhdGlvbik6ICBGaXggdHlwby4KLQotU3VuIE9jdCAxOCAxODo0ODo1NyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3VyZSB0aGUgZW50aXJlIG9wY29kZSBpcwotCWNvbnZlcnRlZCBpbnRvIGxvd2VyIGNhc2UuCi0KLUZyaSBPY3QgMTYgMTM6MzY6MzQgQ0RUIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY2dlbi5jIChnYXNfY2dlbl9tZF9hcHBseV9maXgzKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgotICAgICAgICAoZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jKTogIExpa2V3aXNlLgotICAgICAgICAqIGNvbmZpZy90Yy1tMzJyLmggKG9ial9maXhfYWRqdXN0YWJsZSk6ICBEZWZpbmUuCi0gICAgICAgICogY29uZmlnL3RjLW0zMnIuYyAobTMycl9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0gICAgICAgIChtMzJyX2ZvcmNlX3JlbG9jYXRpb24pOiAgSGFuZGxlIFZUQUJMRSByZWxvY3MuCi0KLVdlZCBPY3QgMTQgMTE6MzM6MzggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBEaXJlY3RpdmVzKTogRG9jdW1lbnQgLmx0b3JuIGRpcmVjdGl2ZS4KLQotTW9uIE9jdCAxMiAxMTowNzoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogQ29udmVydCBzZWNvbmQgb3Bjb2RlCi0JdG8gbG93ZXIgY2FzZSBiZWZvcmUgcGFyc2luZy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBJZ25vcmUgY29uZmxpY3RzIHdoZW4gZXhwbGljaXRseQotCXBhcmFsbGVsIGluc25zIG1vZGlmdCBidXRzIGluIHRoZSBQU1cgYXMgYSBzaWRlIGVmZmVjdC4KLQotVGh1IE9jdCAgOCAxMDoxODozMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IFRlc3QgZm9yIG1pc3NpbmcgZmxhZyBhbmQKLQljb250cm9sIHJlZ2lzdGVycy4KLQkKLQkobWRfYXBwbHlfZml4Myk6IEZpeCBlcnJvciBtZXNzYWdlcyB0byBhdm9pZAotCWFzc3VtcHRpb24gYWJvdXQgcHJlc2VuY2Ugb2YgYSBzeW1ib2wuCi0KLQkocGFyYWxsZWxfb2spOiBEaXNhbGxvdyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgdGhhdCBib3RoIG1vZGlmeSB0aGUKLQlzYW1lIGZsYWcgcmVnaXN0ZXIuCi0KLQkoZmluZF9mb3JtYXQpOiBHZW5lcmF0ZSBhIHdhcm5pbmcgaWYgYW4gb2RkIG51bWJlcmVkIHJlZ2lzdGVyIGlzCi0JdXNlZCBhcyB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4gYSBtdXRsaS1yZWdpc3RlciBpbnN0cnVjdGlvbi4KLQotV2VkIE9jdCAgNyAxNDowOToxNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogRG8gbm90IGFzc3VtZSB0aGF0IGJhZAotCXJlbG9jYXRpb25zIGFyZSBhbHdheXMgYXNzb2NpYXRlZCB3aXRoIGEgc3ltYm9sLgotCi1UdWUgT2N0ICA2IDA5OjMxOjE1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogdGMtc3BhcmMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCi0gICAgICAgIChlbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uKTogIERlY2xhcmUuCi0gICAgICAgICogdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4Myk6ICBIYW5kbGUgdnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKHRjX2dlbl9yZWxvYyk6ICBIYW5kbGUgdnRhYmxlIHJlbG9jcy4KLSAgICAgICAgKGVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgotCi1Nb24gT2N0ICA1IDA5OjI1OjMyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWduc3UuY29tPgotCi0gICAgICAgICogc3ltYm9scy5jIChTX0lTX0ZVTkNUSU9OKTogIE5ldy4KLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5oIChvYmpfZml4X2FkanVzdGFibGUpOiAgRGVmaW5lLgotICAgICAgICAoVENfRk9SQ0VfUkVMT0NBVElPTik6ICBEZWZpbmUuCi0gICAgICAgICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiAgRGVjbGFyZS4KLSAgICAgICAgKiBjb25maWcvdGMtdjg1MC5jICh0Y19nZW5fcmVsb2MpOiAgVXNlIG9mZnNldCBpbnN0ZWFkCi0gICAgICAgIG9mIGZ4X2FkZG51bWJlciBmb3IgVlRBQkxFIHJlbG9jIGFkZGVuZHMuCi0gICAgICAgIChtZF9hcHBseV9maXgzKTogIEhhbmRsZSBWVEFCTEUgcmVsb2NzLgotICAgICAgICAodjg1MF9maXhfYWRqdXN0YWJsZSk6ICBOZXcuCi0gICAgICAgICh2ODUwX2ZvcmNlX3JlbG9jYXRpb24pOiAgTmV3LgotCi1Nb24gT2N0ICA1IDAwOjQ4OjUyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChmcF9vcGVyYW5kX2Zvcm1hdCk6IEFkZCBzb21lIGFkZGl0aW9uYWwgZm9ybWF0cy4KLQkocGFfaXApOiBEbyBub3QgYXV0b21hdGljYWxseSBwcm9tb3RlIGludG8gcGEyLjAgbW9kZS4KLQkocGFfbGV2ZWwpOiBIYW5kbGUgIi5sZXZlbCAyLjAiLgotCi1TdW4gT2N0ICA0IDIwOjU3OjQzIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgQU1EXzNETk9XX09QQ09ERS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRlbXBsYXRlLmV4dGVuc2lvbl9vcGNvZGUpOiBDaGFuZ2UgdG8KLSAgICAgICAgdW5zaWduZWQgaW50IHRvIGFsbG93IGZ1bGwgcmFuZ2Ugb2YgOC1iaXQgb3Bjb2RlIHN1ZmZpeGVzLgotCShOb25lKTogUmVkZWZpbmUgYXMgMHhmZmZmLgotCi0JRnJvbSBKZWZmIEIgRXBsZXIgPGplcGxlckB1c2dzLmdvdj4KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1TSU1EKTogTmV3IHNlY3Rpb24uCi0KLVRodSBPY3QgIDEgMTU6Mzc6NTQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChkaXNjYXJkX3Jlc3Rfb2ZfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaDogRGVjbGFyZSBpdC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX21hc2ssIHNfYWxwaGFfZnJhbWUpOiBVc2UgaXQuCi0KLVRodSBPY3QgIDEgMTA6MzM6NTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIpOiBOZXcgZnVuY3Rpb24uCi0JKGZpbmRfb3Bjb2RlKTogQ29wZSB3aXRoIHRoZSBjYXNlIHdoZXJlIGEgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzCi0JYSBzeW1ib2wgbmFtZS4KLQotV2VkIFNlcCAzMCAxMDo1MjozMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogUmVuYW1lIHRvCi0Jdjg1MF9wY3JlbF9mcm9tX3NlY3Rpb24uCi0JKHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uKTogRG8gbm90IHJlc29sdmVzIHN5bWJvbHMgaW4gb3RoZXIKLQlzZWN0aW9ucy4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IERlZmluZS4KLQotTW9uIFNlcCAyOCAxMTowMToyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEdlbmVyYXRlIGFuIGVycm9yIGlmIGEgcmVnaXN0ZXIKLQlpcyBzdXBwbGllZCBmb3IgYW4gb3BlcmFuZCB0aGF0IHNob3VsZCBub3QgYmUgYSByZWdpc3Rlci4KLQotRnJpIFNlcCAyNSAxMDowNDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogQnV0IGRvIGFsbG93IGRlbGF5ZWQgYnJhbmNoCi0JaW5zdHJ1Y3Rpb25zIHRvIGhhdmUgYW5vdGhlciBpbnN0cnVjdGlvbiBpbiB0aGUgcmlnaHQgYmluLgotCi1UaHUgU2VwIDI0IDA5OjI4OjM0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHdyaXRlXzJfc2hvcnQpOiBEbyBub3QgYWxsb3cgaW5zdHJ1Y3Rpb25zIGluCi0JdGhlIHJpZ2h0IGNvbnRhaW5lciBpZiB0aGUgbGVmdCBjb250YWluZXIgaG9sZHMgYSBicmFuY2gKLQlpbnN0cnVjdGlvbi4gCi0KLVdlZCBTZXAgMjMgMTA6NTQ6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocmVnX25hbWVfc2VhcmNoKTogT25seSB3YXJuIGlmIGEgbmFtZSBtYXRjaGVzCi0JYm90aCBhIHJlZ2lzdGVyIG5hbWUgYW5kIHN5bWJvbCBuYW1lLgotCShmaW5kX2Zvcm1hdCk6IEFsbG93IGNvcnJlY3QgcGFyc2luZyBvZiBNVlRTWVMgYW5kIE1WRlNZUyBpbnNucy4KLQotVHVlIFNlcCAyMiAxNzo0OToxNiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogSW1wbGVtZW50IEVJVEhFUl9CVVRfUFJFRkVSX01VCi0JZXhlY3V0aW9uIHVuaXQgY2xhc3MuCi0KLQkocmVnX25hbWVfc2VhcmNoKTogSWYgYSBuYW1lIG1hdGNoZXMgYSByZWdpc3RlciBhbmQgYSBzeW1ib2wsCi0JcHJlZmVyIHRoZSByZWdpc3Rlci4KLQkoZmluZF9mb3JtYXQpOiBEaXNhbGxvdyBmbGFnIHJlZ2lzdGVycyB3aGVuIGEgZ2VuZXJhbCBwdXJwb3NlCi0JcmVnaXN0ZXIgaXMgcmVxdWlyZWQuCi0JSWYgYSBudW1iZXIgaXMgcmVxdWlyZWQsIGJ1dCBhIHJlZ2lzdGVyIGhhcyBiZWVuIGdpdmVuLCBjaGVjayB0bwotCXNlZSBpZiBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyIGV4aXN0cywgYW5kIGlmCi0Jc28sIHVzZSB0aGF0IHN5bWJvbC4KLQotVHVlIFNlcCAyMiAxNjo0MDo1MiAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmggKEVDT0ZGX0RFQlVHR0lORyk6IEFkZCBtaXNzaW5nIHBhcmVucy4KLQotVHVlIFNlcCAyMiAxNTo0NDoyMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChmaW5kX2Zvcm1hdCk6IERvIG5vdCBhY2NlcHQgZmxhZyByZWdpc3RlcnMgYXMKLQlnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgotCShmaW5kX2Zvcm1hdCk6IElmIGFuIGltbWVkaWF0ZSB2YWx1ZSBpcyBleHBlY3RlZCBhdCBhIGdpdmVuIHBsYWNlCi0JaW4gYSBmb3JtYXQsIGJ1dCBhIHJlZ2lzdGVyIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQgaW5zdGVhZCwgY2hlY2sKLQl0byBzZWUgaWYgdGhhdCByZWdpc3RlciBuYW1lIG1hdGNoZXMgdGhlIG5hbWUgb2YgYSBwcmVkZWZpbmVkCi0Jc3ltYm9sIGFuZCBpZiBpdCBkb2VzLCB0aGVuIHVzZSB0aGUgc3ltYm9sIGluc3RlYWQuCi0JKHJlZ19uYW1lX3NlYXJjaCk6IElmIGEgcmVnaXN0ZXIgbmFtZSBtYXRjaGVzIGEgc3ltYm9sIG5hbWUsCi0JcHJlZmVyIHRoZSByZWdpc3RlciBuYW1lIHRvIHRoZSBzeW1ib2wgbmFtZS4KLQotTW9uIFNlcCAyMSAxMDo0Mjo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtMzJyX2RvX2FsaWduKTogQWZ0ZXIgaW5zZXJ0aW5nIE5PUHMsIHJlc2V0Ci0JdGhlIHByZXZpb3VzIGluc24gdG8gZW1wdHkuCi0KLTE5OTgtMDktMjAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBEbyBub3QgYnJlYWsgc3RyaW5nIGludG8gdHdvCi0JcGllY2VzLCBmb3JjaW5nIHRoZSB1c2Ugb2YgYW4gQU5TSSBjb21waWxlci4KLQotU3VuIFNlcCAyMCAwMDo1ODoxMiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IE5ldyBtYWNyby4gIEZvcmNlIHZ0YWJsZQotCXJlbG9jcy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogRG8gbm90aGluZyBmb3IgdnRhYmxlIHJlbG9jcy4KLQotVHVlIFNlcCAxNSAwODo1MTowNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogIEhhbmRsZSBhcm0KLSAgICAgICAgYXNzZW1ibGVyIHN5bnRheC4KLSAgICAgICAgKG9ial9lbGZfdnRhYmxlX2VudHJ5KTogIExpa2V3aXNlLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIGZvciBPQkpfRUxGLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEhhbmRsZSBWVEFCTEUgcmVsb2NhdGlvbnMuCi0gICAgICAgICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLSAgICAgICAgKGFybV9maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgotICAgICAgICAoZWxmMzJfYXJtX2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcuCi0gICAgICAgIChhcm1lbGZfZnJvYl9zeW1ib2wpOiAgUmVtb3ZlIGNvZmYtc3R5bGUgc3ltYm9sIHN1cHBvcnQuCi0KLVdlZCBTZXAgIDkgMTE6Mjc6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRml4IHR5cG8gaW4gbGFzdCBwYXRjaC4KLQotVHVlIFNlcCAgOCAxODoxMDowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmMgKGFybV9hZGp1c3Rfc3ltdGFiKTogIE1vdmUgI2lmZGVmCi0gICAgICAgIE9CSl9DT0ZGIHNvIHRoYXQgcm91dGluZSBpcyBkZWZpbmVkIGZvciBhLm91dCBmb3JtYXQuCi0KLVR1ZSBTZXAgIDggMTU6NTY6MTkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRGV0ZWN0IG5vbi1zZWdtZW50IHJlZ2lzdGVycwotCXVzZWQgYXMgc2VnbWVudCBwcmVmaXhlcy4KLQotU2F0IFNlcCAgNSAxOTowMDozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVob3B0LmMgKGNoZWNrX2VoX2ZyYW1lKTogQ2hlY2sgdGhlIHNpemUgb2YgdGhlIEZERSwgYW5kIGRvbid0Ci0Jb3B0aW1pemUgYWNyb3NzIEZERSBib3VuZGFyaWVzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbik6IFByZXNlcnZlIGFueSBsaW5rIG9uY2UKLQlmbGFncyB3aGVuIHNldHRpbmcgdGhlIHNlY3Rpb24gZmxhZ3MuCi0KLUZyaSBTZXAgIDQgMTc6MDc6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChvYmpfYWRqdXN0X3N5bXRhYik6IEZpeGVkIHR5cG8uCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybWVsZl9hZGp1c3Rfc3ltdGFiKTogUmVmb3JtYXR0ZWQuCi0KLUZyaSBTZXAgIDQgMTM6NTc6NDMgMTk5OCAgSmFrdWIgSmVsaW5layA8ampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX3NpZ25lZF9yYW5nZSk6IFNpZ24gZXh0ZW5kIDMyLWJpdCB3b3JkcwotCXRvIHRoZSBob3N0IHdpZHRoLgotCi1XZWQgU2VwICAyIDExOjMxOjE0IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfZ3Jvdyk6IEluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgc3RydWN0IGluIHRoZQotCW9ic3RhY2sgY2h1bmsgc2l6ZS4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBBZGp1c3QgdGhlIHNlZ2luZm8gZnJjaGFpbiBzdGFydAotCWlmIHRoZSBuZXcgc3Vic2VnIGNvbWVzIGJlZm9yZSB0aGUgb2xkLgotCi1UdWUgU2VwICAxIDE1OjAxOjMzIDE5OTggIEpha3ViIEplbGluZWsgPGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3o+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IGFsbCBkaWdpdHMgaW4gYW4gaW5zdHJ1Y3Rpb24KLQl0byBoYW5kbGUgZWRnZTggYW5kIGVkZ2UxNi4KLQotTW9uIEF1ZyAzMSAwOTo1MToxNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3Z0YWJsZV9pbmhlcml0KTogUHJpbnQgZXJyb3IgbWVzc2FnZQotCWJlZm9yZSB3ZSBjbG9iYmVyIHRoZSBzeW1ib2wgaW52b2x2ZWQuCi0KLU1vbiBBdWcgMzEgMTA6NTg6MDYgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmM6ICBSZW1vdmUgT0JKX0VMRiBkZWZpbml0aW9ucyBmb3IgCi0gICAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgYW5kIFNfU0VUX1NUT1JBR0VfQ0xBU1MuICBPbmx5Ci0gICAgICAgIHVzZSBhcm1fYWRqdXN0X3N5bXRhYiBmb3IgT0JKX0NPRkYuCi0gICAgICAgIChhcm1lbGZfYWRqdXN0X3N5bXRhYik6ICBOZXcgUm91dGluZS4KLSAgICAgICAgKiBjb25maWcvdGMtYXJtLmg6ICBEZWZpbmUgb2JqX2FkanVzdF9zeW10YWIgdG8KLSAgICAgICAgYXJtZWxmX2FkanVzdF9zeW10YWIgZm9yIE9CSl9FTEYuCi0gICAgICAgIAotU2F0IEF1ZyAyOSAyMjoxODo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IE1ha2UgYWxsIGkzODYtZWxmIHRhcmdldHMgdXNlIGJmZF9nYXMuCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24pOiBOZXcuCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBmaXggdnRhYmxlIHJlbG9jcy4KLQkobWRfYXBwbHlfZml4Myk6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgdGhlbS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBBbHdheXMgZGVmaW5lLCBjYWxsaW5nCi0JdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uLgotCi1Nb24gQXVnIDI0IDEzOjQwOjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfc2hvd191c2FnZSk6IEltcHJvdmUgZm9ybWF0dGluZyBvZiAtLWhlbHAgb3V0cHV0LgotCi1GcmkgQXVnIDIxIDE4OjQzOjQ4IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogQ29weSBwcmV2aW91cyBvcGNvZGUgb3ZlcgotCWN1cnJlbnQgb3Bjb2RlIGFmdGVyIHdyaXRpbmcgdGhlIGZpcnN0IGluc3R1cmN0aW9uIG9mIGEgcmV2ZXJzZQotCXNlcXVlbnRpYWwgcGFpci4gCi0JCi1GcmkgQXVnIDIxIDA3OjMwOjM1IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogQWRkIHByb3RvdHlwZS4KLQkqIHJlYWQuYyAoZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogTWFrZSBub24tc3RhdGljLgotCi1UaHUgQXVnIDIwIDIzOjE3OjA0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBPbmx5IHdhcm4gZm9yIGFkZHJlc3MvZGF0YSBzaXplCi0JcHJlZml4ZXMuCi0KLVRodSBBdWcgMjAgMTQ6NDU6MDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChhcm1fZml4X2FkanVzdGFibGUpOiBEbyBub3QgYWRqdXN0IHJlbG9jYXRpb25zCi0JYWdhaW5zdCBUaHVtYiBmdW5jdGlvbiBuYW1lcywgYXMgdGhlIGxpbmtlciBuZWVkcyB0aGlzIGluZm9ybWF0aW9uLgotCi0xOTk4LTA4LTIwICBWbGFkaW1pciBOLiBNYWthcm92ICA8dm1ha2Fyb3ZAY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogQ2hlY2sgYWxzbyB0aGF0IHRoZXJlIGlzIG5vIGFkdmFuY2UgaW4gb3BlcmFuZAotCWFmdGVyIGF0b2ZfZ2VuZXJpYyBpbiBvcmRlciB0byBkZWNpZGUgImlzIGl0IGxhYmVsIDBmIG9yIGZsb2F0aW5nCi0JcG9pbnQgbnVtYmVyPyIuCi0KLVdlZCBBdWcgMTkgMDk6MzA6MTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYzogUmVwbGFjZSBkb3VibGUgZGFzaCBwcmVmaXggdG8gTTMyUiBzcGVjaWZpYwotCWNvbW1hbmQgbGluZSBvcHRpb25zIHdpdGggYSBzaW5nbGUgZGFzaC4KLQkqIGRvYy9jLW0zMnIudGV4aTogUmVwbGFjZSBkb3VibGUgZGFzaCBwcmVmaXggd2l0aCBhIHNpbmdsZSBkYXNoLgotCi1UdWUgQXVnIDE4IDExOjU5OjQzIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiB0Yy1hcm0uaDogRGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZSBmb3IgT0JKX0VMRi4KLSAgICAgICAqIHRjLWFybS5jIChhcm1fZml4X2FkanVzdGFibGUpOiBOZXcgcm91dGluZS4KLQotMTk5OC0wOC0xMyAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19hbGlnbiwgc19jb21tLCBzX21yaV9jb21tb24sIHNfZmFpbCwgc19nbG9ibCwgc19zcGFjZSwKLQlzX2Zsb2F0X3NwYWNlLCBzX3N0cnVjdCwgY29uc193b3JrZXIpOiBNb3ZlIGlnbm9yZV9yZXN0X29mX2xpbmUgb3IKLQlkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lIGJlZm9yZSBtcmlfY29tbWVudF9lbmQuCi0JKGVxdWFscyk6IENoZWNrIGdhcmJhZ2UgYWZ0ZXIgZXhwcmVzc2lvbiBiZWZvcmUKLQltcmlfY29tbWVudF9lbmQgaW4gTVJJIG1vZGUuCi0KLVRodSBBdWcgMTMgMTU6MDg6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgTV9TR0VfSS9NX1NHRVVJX0kgY2FzZSBmb3IgYQotCXNtYWxsIGltbWVkaWF0ZSBjb25zdGFudCB0byB1c2UgdGhlIGNvbnN0YW50IGl0c2VsZiByYXRoZXIgdGhhbgotCWFsd2F5cyB1c2luZyAxLgotCi1XZWQgQXVnIDEyIDE4OjQ3OjM4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZW50ZXIpOiBDYWxsIGFzX2JhZCByYXRoZXIgdGhhbiBhYm9ydC4KLQkocGFfbGVhdmUpOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxMiAxMzoyNTowMyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBhIHdhcm5pbmcgZm9yIHN0YW5kLWFsb25lCi0JcHJlZml4ZXMuCi0JKGkzODZfb3BlcmFuZCk6IEZpeCBhbiBlcnJvciBtZXNzYWdlLgotCi1UdWUgQXVnIDExIDE0OjQ0OjMyIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWFybS50ZXhpIChBUk0gRGlyZWN0aXZlcyk6IERvY3VtZW50IC5yZXEgZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHJlZ19yZXF1aXJlZF9oZXJlKTogRGlzcGxheSBlcnJvbmVvdXMgc3RyaW5nIGlmCi0JdGhlIHJlZ2lzdGVyIG5hbWUgY291bGQgbm90IGJlIGRlY29kZWQuCi0JRG8gbm90IHNldCBpbnN0Lmluc3RydWN0aW9uIGlmIHRoZSBzaWZ0IGlzIC0xLgotCi1Nb24gQXVnIDEwIDE1OjM5OjU2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBCaWFzIFdFQUsgc3ltYm9scyBqdXN0IGFzCi0Jd2UgZG8gZm9yIEVYVEVSTi4KLQotTW9uIEF1ZyAxMCAxNTowNjoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQWx3YXlzIHBlcmZvcm0gYWxpZ25tZW50IHJlcXVlc3QsCi0JZXZlbiBpZiBpdCBpcyBiZWxpdmVkIHRvIGJlIHVubmVjZXNzYXJ5LgotCi1Nb24gQXVnIDEwIDE3OjQ4OjA5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCWNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IFNpemUgaW1tZWRpYXRlIGNvbnN0YW50cyBieQotCXN1ZmZpeCAoZXJyb25lb3VzbHkgcmVtb3ZlZCBhcyBwYXJ0IG9mIEp1bHkgNyBjaGFuZ2UpLgotCi1TdW4gQXVnICA5IDIwOjQ1OjMyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL29iai1lbGYuaDogIENoZWNrIGZvciByZWRlZmluaXRpb24gb2Ygb2JqX2Zyb2Jfc3ltYm9sLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uYzogIERlZmluZSBTX0dFVF9TVE9SQUdFX0NMQVNTIGFuZCBTX1NFVF9TVE9SQUdFX0NMQVNTLgotICAgICAgICAoYXJtZWxmX2Zyb2Jfc3ltYm9sKTogIE5ldyBSb3V0aW5lLgotICAgICAgICAqIGNvbmZpZy90Yy1hcm0uaDogIERlZmluZSBvYmpfZnJvYl9zeW1ib2wgaWYgT0JKX0VMRi4KLQotU2F0IEF1ZyAgOCAxNToyMToyOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3Qgd2VhayBzeW1zLgotCi1XZWQgQXVnICA1IDE1OjU0OjE0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBTZXQgQkZEIHByaXZhdGUgZmxhZ3MgZGVwZW5kaW5nIHVwb24KLQljb21tYW5kIGxpbmUgc3dpdGNoZXMgcGFzc2VkIHRvIGFzc2VtYmxlci4KLQotTW9uIEF1ZyAgMyAxNDowMjo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChHQVNfQ0dFTl9NQVhfRklYVVBTKTogR0FTXyBwcmVwZW5kZWQsIGFsbCB1c2VzIHVwZGF0ZWQuCi0JKGdhc19jZ2VuX29wY29kZV9kZXNjKTogRGVjbGFyZS4KLQkoZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCk6IERlY2xhcmUuCi0JKCopOiBQcmVwZW5kIGdhc18gdG8gZ2FzIHNwZWNpZmljIGZucyB0byBkZW5vdGUgdGhlbSBhcyBzdWNoLgotCUFsbCB1c2VzIHVwZGF0ZWQuCi0JKiBjZ2VuLmMgKGdhc19jZ2VuX29wY29kZV9kZXNjKTogTmV3IGdsb2JhbAotCShnYXNfY2dlbl9pbml0X3BhcnNlKTogUmVuYW1lZCBmcm9tIGNnZW5fYXNtX2luaXRfcGFyc2UuCi0JKHF1ZXVlX2ZpeHVwKTogUmVuYW1lZCBmcm9tIGNnZW5fcXVldWVfZml4dXAuCi0JKCopOiBQcmVwZW5kIGdhc18gdG8gZ2FzIHNwZWNpZmljIGZucyB0byBkZW5vdGUgdGhlbSBhcyBzdWNoLgotCUFsbCB1c2VzIHVwZGF0ZWQuCi0JKGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMpOiBVcGRhdGUgY2FsbCB0byBpbnNlcnRfb3BlcmFuZC4KLQkoZ2FzX2NnZW5fZmluaXNoX2luc24pOiBSZW5hbWVkIGZyb20gY2dlbl9hc21fZmluaXNoX2luc24uCi0JKiBjb25maWcvdGMtbTMyci5jIChtZF9iZWdpbik6IFJlbW92ZSB1c2Ugb2YgQ0dFTl9TWU0uCi0JT3BlbiBvcGNvZGUgdGFibGUgYW5kIGluaXRpYWxpemUgaXQuCi0JKG1ha2VfcGFyYWxsZWwpOiBVc2UgZ2FzX2NnZW5fb3Bjb2RlX2Rlc2MuCi0JKGFzc2VtYmxlX3BhcmFsbGVsX2luc24pOiBEaXR0by4gIFJlbW92ZSB1c2Ugb2YgQ0dFTl9TWU0uCi0JKG1kX2Fzc2VtYmxlKTogRGl0dG8uCi0KLVNhdCBBdWcgIDEgMTk6Mjc6MzAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZGVidWdfaW5mb190eXBlKTogQWRkIGVudHJpZXMgZm9yIHVuc3BlY2lmaWVkIGFuZCBkd2FyZiouCi0JKiBlY29mZi5jIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogVGFrZSBubyBhcmd1bWVudHM7IGNhbGwKLQlhc193aGVyZSBvdXJzZWx2ZXMuICBQcm92aWRlIGEgc3R1YiBmb3IgIUVDT0ZGX0RFQlVHR0lORy4KLQkqIGVjb2ZmLmg6IE1vdmUgRUNPRkZfREVCVUdHSU5HIHByb3RlY3Rpb24gaW5zaWRlIEdBU19FQ09GRl9ILgotCU1vdmUgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyBvdXRzaWRlIEVDT0ZGX0RFQlVHR0lORyBwcm90ZWN0aW9uLgotCSogcmVhZC5jIChnZW5lcmF0ZV9saW5lbm9fZGVidWcpOiBUaWR5IEVDT0ZGIGJpdHMuICBVc2UKLQlERUJVR19VTlNQRUNJRklFRCByYXRoZXIgdGhhbiBERUJVR19OT05FIGZvciBpbml0aWFsIHRlc3QuCi0JKiBjb25maWcvb2JqLWVsZi5oIChFQ09GRl9ERUJVR0dJTkcpIFtUQ19BTFBIQV06IERlZmluZSB0byBhIHZhcmlhYmxlLgotCShTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogQ29uZGl0aW9uYWxpemUgb24gdmFsdWUgb2YgRUNPRkZfREVCVUdHSU5HLgotCShJTklUX1NUQUJfU0VDVElPTik6IExpa2V3aXNlLgotCShPQkpfUFJPQ0VTU19TVEFCKTogTGlrZXdpc2UuCi0JCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfbG9uZ29wdHMpOiBOZXcgb3B0aW9ucyAtbWRlYnVnLy1uby1tZGVidWcuCi0JKG1kX3BhcnNlX29wdGlvbik6IFdhdGNoIGZvciB0aGVtLgotCShhbHBoYV9jdXJfZW50X3N5bSwgYWxwaGFfZmxhZ19tZGVidWcpOiBOZXcgdmFyaWFibGVzLgotCShtZF9iZWdpbik6IEtpbGwgbmV2ZXJkZWYgY29kZS4KLQkoc19hbHBoYV9lbnQsIHNfYWxwaGFfZW5kLCBzX2FscGhhX21hc2ssIHNfYWxwaGFfZnJhbWUpOiBOZXcuCi0JKHNfYWxwaGFfcHJvbG9ndWUpOiBXYXRjaCBhbHBoYV9jdXJfZW50X3N5bS4KLQkoc19hbHBoYV9jb2ZmX3dyYXBwZXIpOiBOZXcuCi0JKG1kX3BzZXVkb190YWJsZSk6IFRyYXAgYWxsIEVDT0ZGIHBzZXVkb3MuCi0JCi1GcmkgSnVsIDMxIDE2OjQ1OjU0IDE5OTggIFJvbiBVbnJhdSA8cnVucmF1QGN5Z251cy5jb20+Ci0KLQlTdGFydCBvZiBjaGFuZ2VzIHRvIHJlbW92ZSBtZGVidWcgc2VjdGlvbiBmcm9tIG1pcHMqLWVsZgotCUJhc2VkIG9uIE1JUFNfU1RBQl9FTEYgZGVmaW5pdGlvbgotCSogYWNjb25maWcuaDogdW5kZWYgaWYgbm90IGNvbmZpZ3VyZWQKLQkqIGNvbmZpZy5pbjogdW5kZWYgaWYgbm90IGNvbmZpZ3VyZWQKLQkqIGNvbmZpZy9taXBzLWVsZi5oOiBvbmx5IHNldCBFQ09GRiBkZWJ1Z2dpbmcgaWYgbm90IHN0YWJzLWluLWVsZgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19lbnQpOiBzZXQgQlNGX0ZVTkNUSU9OCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IGZsdXNoIGZyYWcKLQotRnJpIEp1bCAzMSAxNjoxNDo0NSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogKGFybS0qLWVsZik6ICBIYW5kbGUuCi0gICAgICAgICh0aHVtYi0qLWVsZik6IEhhbmRsZS4KLSAgICAgICAgKiBjb25maWd1cmU6ICBSZWdlbmVyYXRlLgotICAgICAgICAqIHJlYWQuYyAoc3RyaW5nZXIpOiBGaXggdHlwbyBpbiBjb21tZW50LgotICAgICAgICAqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgotICAgICAgICBUQ19BUk0gYW5kIE9CSl9FTEYuCi0gICAgICAgICogY29uZmlnL3RjLWFybS5jIChtZF9zZWN0aW9uX2FsaWduKTogIERvbid0IGFsaWduIGR3YXJmIGRlYnVnCi0gICAgICAgIHNlY3Rpb25zLgotICAgICAgICAodGNfZ2VuX3JlbG9jKTogIEFsd2F5cyBzZXQgdGhlIHJlbG9jIGFkZGVuZCB0byBmaXhwLT5meF9vZmZzZXQKLSAgICAgICAgZm9yIE9CSl9FTEYuCi0KLVRodSBKdWwgMzAgMjE6Mzg6NDMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoe2N1cixwcmV2fV9sZWZ0X2tpbGxzX3JpZ2h0X3ApOiBOZXcgdmFyaWFibGVzLgotCSh3cml0ZV8yX3Nob3J0KTogRW1pdCB3YXJuaW5nIGlmIG5ldyBmbGFnIGlzIHNldC4KLQkoZG9fYXNzZW1ibGUpOiBTZXQgZmxhZ3MgaWYgbGVmdCBpbnN0cnVjdGlvbiBpcyBvbmUgb2Ygc3BlY2lhbAotCSJyaWdodC1pbnN0cnVjdGlvbi1raWxsZXIiIHR5cGUuCi0KLVR1ZSBKdW4gMjggMTg6MTI6MjggMTk5OCAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0JCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfbnVtYmVyX3RvX2NoYXJzLCBjb25zX2ZpeF9uZXdfc3BhcmMpOgotCUFsd2F5cyBvdXRwdXQgd29yZHMgaW4gZGVidWdfaW5mbyBzZWN0aW9uIGFzIGJpZyBlbmRpYW4uCi0JKHNwYXJjX3RhcmdldF9mb3JtYXQpOiBDaG9vc2UgY29ycmVjdCBiZmQgdGFyZ2V0LgotCShtZF9hcHBseV9maXgzKTogUmVuYW1lIEJGRF9SRUxPQ19TUEFSQ18zMkxFIHRvIEJGRF9SRUxPQ19TUEFSQ19SRVYzMi4KLQkKLVR1ZSBKdWwgMjggMTE6MDE6MjEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEZpeCAiZXJybXNnIiBpbml0aWFsaXphdGlvbgotCXRvIHdvcmsgd2l0aCBpbnRlcm5hdGlvbmFsaXphdGlvbiBjb2RlLiAgSXNzdWUgYW4gZXJyb3Igd2hlbiB0d28KLQlvcGVyYW5kcyBtYXRjaCB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBtYXRjaC4KLQotTW9uIEp1bCAyNyAxNjoyNTo1OCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGluc3RhbGxfdG9vbGRpcik6IEFsbG93IHRhcmdldCB0byBzcGVjaWZ5IHdoZXRoZXIKLQlpdCB3YW50cyB0byBiZSBpbnN0YWxsZWQgaW4gJCh0b29sZGlyKS9iaW4uCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogU2V0IGluc3RhbGwtZXhlYy10b29sZGlyCi0JZGVwZW5kZW5jeSB2aWEgY29uZmlndXJlLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdWwgMjQgMTk6NTg6NTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IFNwbGl0IGludG8gdHdvIC4uLgotCShpbnN0YWxsLWV4ZWMtYmluZGlyLGluc3RhbGwtZXhlYy10b29sZGlyKTogTmV3IHJ1bGVzLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLUZyaSBKdWwgMjQgMTY6MzE6NDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1GcmkgSnVsIDI0IDA5OjEzOjQ2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQkoY2dlbl9tZF9hcHBseV9maXgzKTogVXBkYXRlIGNhbGwgdG8gbWRfY2dlbl9sb29rdXBfcmVsb2MuCi0JKGNnZW5fdGNfZ2VuX3JlbG9jKTogVXNlIHhtYWxsb2MsIG5vdCBiZmRfYWxsb2MuCi0JKiBjZ2VuLmggKGNnZW5fbWRfYXBwbHlfZml4MyxjZ2VuX3RjX2dlbl9yZWxvYyk6IERlY2xhcmUuCi0JKG1kX2NnZW5fbG9va3VwX3JlbG9jKSk6IERlY2xhcmUuCi0JKG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTMyci5oIChtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBEZWNsYXJlLgotCShtMzJyX3JlbGF4X2ZyYWcpOiBEZWNsYXJlLgotCShjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEZWNscyBtb3ZlZCB0byBjZ2VuLmguCi0JKGNnZW5fcmVjb3JkX2ZpeHVwX2V4cCxjZ2VuX3RjX2dlbl9yZWxvYyk6IERpdHRvLgotCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IERlbGV0ZSBkZWNsLgotCSogY29uZmlnL3RjLW0zMnIuYyAobTMycl9jcHVfZGVzYyk6ICNpZiAwIG91dC4KLQkoYXNzZW1ibGVfbm9wKTogRGVsZXRlLgotCShleHBhbmRfZGVidWdfc3ltcyk6IERlbGV0ZSB1bnVzZWQgYGV4cCcuCi0JKG1kX2NnZW5fbG9va3VwX3JlbG9jKTogUmVuYW1lZCBmcm9tIENHRU5fU1lNIChsb29rdXBfcmVsb2MpLgotCUFkZCBkZWZhdWx0IGNhc2UgZm9yIC1XYWxsLgotCShtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCk6IEFkZCBkZWZhdWx0IGNhc2UgZm9yIC1XYWxsLgotCShtZF9hdG9mKTogRGVsZXRlIHVudXNlZCB3b3JkUC4KLQotVGh1IEp1bCAyMyAxMzoxOTo1MCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTWFrZSBzdXJlICJlcnJtc2ciIGhhcyBhIG5vbi1OVUxMCi0JdmFsdWUuCi0KLVdlZCBKdWwgMjIgMTQ6MzY6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIGRvY3VtZW50YXRpb24gZm9yIC5lbmQsIC5leGl0bSwgLmZhaWwsCi0JLmlmYywgLmlmZXFzLCAuaWZnZSwgLmlmZ3QsIC5pZmxlLCAuaWZsdCwgLmlmbmMsIC5pZm5lLCAuaWZuZXMsCi0JLnByaW50LCAucHVyZ2VtLCBhbmQgLnN0cnVjdC4gIFJlbW92ZSBkb2N1bWVudGF0aW9uIGZvcgotCS5hcHAtZmlsZS4KLQotVHVlIEp1bCAyMSAxNjo1MDo1MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBzZXRfb3BlcmFuZCByZW5hbWVkIHRvIHNldF92bWFfb3BlcmFuZC4KLQlVcGRhdGUgY2FsbCB0byBpbnNlcnRfb3BlcmFuZC4KLQotRnJpIEp1bCAxNyAxMTo0MjoyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jIChtc19zaG93X3VzYWdlKTogRm9ybWF0dGluZyBjaGFuZ2VzLgotCi1XZWQgSnVsIDE1IDE1OjM4OjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBnZXQgY29uZnVzZWQgYnkgdHJhaWxpbmcKLQl3aGl0ZXNwYWNlIGFmdGVyIGEgcHJlZml4IG9wZXJhdG9yLgotCi1UdWUgSnVsIDE0IDE1OjMyOjU2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWJlb3N7cGUsZWxmLH0qKTogUmVjb2duaXplLgotCi1UdWUgSnVsIDE0IDEyOjMzOjQ0IDE5OTggIENocmlzIFRvcmVrICA8dG9yZWtAYnNkaS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsb2cyKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc19yZXNlcnZlKTogVXNlIGxvZzIgdG8gY29udmVydCBhbGlnbm1lbnQgYmVmb3JlIGNhbGxpbmcKLQlyZWNvcmRfYWxpZ25tZW50LgotCShzX2NvbW1vbik6IFVzZSBsb2cyIHRvIGNvbnZlcnQgYWxpZ25tZW50IGJlZm9yZSBjYWxsaW5nCi0JcmVjb3JkX2FsaWdubWVudCBhbmQgZnJhZ19hbGlnbi4KLQkoc3BhcmNfY29uc19hbGlnbik6IFVzZSBsb2cyLgotCi1UdWUgSnVsIDE0IDExOjU4OjQwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IFNldCBzeW1ib2wgc2l6ZSBpZiBPQkpfRUxGLgotCShzX2NvbW1vbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaGFuZGxlX2FsaWduKTogUmVpbmRlbnQgYSBiaXQuICBDb3JyZWN0Ci0JaW5pdGlhbGl6YXRpb24gb2Ygd2FkZHIuCi0JKHNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2guCi0KLVR1ZSBKdWwgMTQgMTE6MDA6MTYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBkb2MvYy1pMzg2LnRleGk6IEZpeCBhIHR5cG8uICBVc2UgdGhlIHRlcm0gODAtYml0IHJlYWwgcmF0aGVyCi0JdGhhbiB0ZW1wb3JhcnkgcmVhbC4KLQotTW9uIEp1bCAxMyAxMzo1NTo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogRG9uJ3QgYWxpZ24gdGhlIHNlZ21lbnRzIGlmIHRoZXJlIHdlcmUKLQlhbnkgZXJyb3JzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19zeW1ib2xfbWVyZ2UpOiBDb3JyZWN0IG51bWJlciBvZiBieXRlcyB3aGVuCi0JY29weWluZyBhdXggaW5mb3JtYXRpb24uCi0KLQkqIGV4cHIuYyAobWFrZV9leHByX3N5bWJvbCk6IENhdGNoIGF0dGVtcHRzIHRvIHR1cm4gYW4gT19iaWcKLQlleHByZXNzaW9uIGludG8gYSBzeW1ib2wuCi0KLU1vbiBKdWwgMTMgMTM6Mjk6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtb2RlX2Zyb21fZGlzcF9zaXplKTogQ2hhbmdlIGFyZyBhbmQgcmV0dXJuCi0JdHlwZSB0byB1bnNpZ25lZCBpbnQuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIHR5cGUgdXNlZCB0byBzdG9yZSBvZmZzZXRzIGZyb20gdW5zaWduZWQKLQlsb25nIHRvIGxvbmcuCi0JKGkzODZfb3BlcmFuZCk6IFN3aXRjaCBlcnJvciBjaGVjayB0byBvbmx5IGNhbGwgUkVTVE9SRV9FTkRfU1RSSU5HCi0Jb25jZSBhZnRlciBwYXJzZV9yZWdpc3Rlci4KLQotRnJpIEp1bCAxMCAxNjowMDowNCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9zaG93X3VzYWdlKTogQ2hhbmdlZCBmb3JtYXQgdG8gbWF0Y2ggdGhhdAotCW9mIGdjYywgbGQsIGV0Yy4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IENoYW5nZWQgZm9ybWF0IHRvIG1hdGNoIHRoYXQgb2YgZ2NjLCBsZCwgZXRjLgotCi1UaHUgSnVsICA5IDEyOjA5OjU3IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHZ0YWJsZQotCXJlbG9jcy4KLQkobWRfYXBwbHlfZml4XzIpOiBGb3JjZSB0aGUgc3ltYm9sIG9mIHRoZSB2dGFibGUgcmVsb2MgdG8gYmUKLQl3ZWFrLgotCi1UaHUgSnVsICA5IDExOjMxOjU0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL01ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotV2VkIEp1bCAgOCAxMjoxODo1NiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwLCBjYXNlICdpJyBhbmQgJ2onKTogTWFzayBvZmYgaGlnaCBiaXRzCi0gICAgICAgIGZvciAlbG8gZXhwcmVzc2lvbnMuCi0gICAgICAgIChtaXBzX2lwLCBjYXNlICd1Jyk6IE1vdmUgcmFuZ2UgY2hlY2sgYWZ0ZXIgY29kZSB0byBtYXNrCi0gICAgICAgIG9mZiBiaXRzIGluICVoaS8lbG8gZXhwcmVzc2lvbnMuICBNYXNrIG9mZiBoaWdoIGJpdHMgZm9yCi0gICAgICAgICVsbyBleHByZXNzaW9ucy4KLQotVHVlIEp1bCAgNyAxNzo1NzozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9NYWtlZmlsZS5hbSAoZ2FzdmVyLnRleGkpOiBOZXcgdGFyZ2V0LgotCShhcy5pbmZvLCBhcy5kdmkpOiBEZXBlbmRzIHVwb24gZ2FzdmVyLnRleGkuCi0JKiBkb2MvYXMudGV4aW5mbzogSW5jbHVkZSBnYXN2ZXIudGV4aS4gIE1lbnRpb24gdmVyc2lvbiBudW1iZXIgb24KLQl0aXRsZSBwYWdlIGFuZCBpbiB0b3Agbm9kZS4KLQkqIGRvYy9NYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEp1bCAgNyAxMTo0MjoxNiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbGlzdGluZyk6IEZvciBFRElDVF9MSVNULCBza2lwIGFsbCBsaW5lcyB1cCB0bwotCWJ1dCBub3QgaW5jbHVkaW5nIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGVkaWN0LgotCSogbGlzdGluZy5oIChMSVNUSU5HX0VPRik6IE5ldy4KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogQ2FsbCBpdC4KLQotVHVlIEp1bCAgNyAxMzowMDozNyAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IERvbid0IHNldCB0aGUgc2l6ZSBvZiBhbgotIAlpbW1lZGlhdGUgYWRkcmVzcyBiYXNlZCBzb2xlbHkgb24gdGhlIHN1ZmZpeCBhbmQgdGhlIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRkIGFzc2VydGlvbiB0byBtYWtlIHN1cmUKLQlvdmVybGFwMiBkb2VzIG5vdCBzZXQgSW1tLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzcGFjZV9jaGFycyk6IFJlbW92ZS4gVGhlIHNjcnViYmVyIGNvbnZlcnRzCi0Jc2VxdWVuY2VzIG9mIHdoaXRlc3BhY2UgdG8gYSBzaW5nbGUgc3BhY2UuCi0JKGlzX3NwYWNlX2NoYXJzKTogSnVzdCBjb21wYXJlIHdpdGggc3BhY2UuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSBzcGFjZV9jaGFycy4KLQkobWRfYXNzZW1ibGUpOiBKdXN0IHNraXAgYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuCi0JKGkzODZfb3BlcmFuZCk6IFJld3JpdGUgYmFzZS1pbmRleCBwYXJzaW5nIHRvIHVzZSBuZXcKLQlwYXJzZV9yZWdpc3RlciwgYW5kIHRvIHNraXAgd2hpdGUgc3BhY2UuICBTa2lwIHdoaXRlIHNwYWNlIGluIGEKLQludW1iZXIgb2Ygb3RoZXIgcGxhY2VzIHRvby4gIERvbid0IGdpdmUgZXJyb3IgbWVzc2FnZSBpZgotCXBhcnNlX3JlZ2lzdGVyIGZhaWxzLgotCShwYXJzZV9yZWdpc3Rlcik6IENoYW5nZSByZWdfc3RyaW5nIHBhcmFtZXRlciB0byBiZSBub24tY29uc3QuCi0JQWRkIGVuZF9vcCBwYXJhbWV0ZXIuICBTa2lwIHdoaXRlIHNwYWNlIGFmdGVyIHRoZSBgJScsIGFuZCByZXR1cm4KLQllbmQgb2YgcmVnaXN0ZXIgc3RyaW5nLiAgR2l2ZSBlcnJvciBtZXNzYWdlIGhlcmUgcmF0aGVyIHRoYW4KLQljYWxsZXIuCi0KLUZyaSBKdWwgIDMgMTU6MzQ6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXR0IFNlbWVyc2t5IDxtYXR0c0BzY2QuaHAuY29tPjoKLQkqIGV4cHIuYyAob3BfZW5jb2RpbmcpOiBNYWtlIGNvbnN0LgotCShleHByX3NldF9wcmVjZWRlbmNlKTogTmV3IGZ1bmN0aW9uLgotCShleHByX2JlZ2luKTogRG9uJ3Qgc2V0IG9wZXJhdG9yIHJhbmtpbmdzLCBqdXN0IGNhbGwKLQlleHByX3NldF9wcmVjZWRlbmNlLgotCSogZXhwci5oIChleHByX3NldF9wcmVjZWRlbmNlKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAoc19tcmkpOiBDYWxsIGV4cHJfc2V0X3ByZWNlZGVuY2UuCi0KLVRodSBKdWwgIDIgMTY6MjQ6NTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoU3RhdGVtZW50cyk6IFJlbW92ZSBwYXJhZ3JhcGggZGlzY3Vzc2luZwotCWNvbnRpbnVpbmcgbGluZXMgd2l0aCBhIGJhY2tzbGFzaC4gIFRoaXMgaGFzbid0IHdvcmtlZCBmb3IgeWVhcnMsCi0JaWYgaXQgZXZlciBkaWQuCi0KLVRodSBKdWwgIDIgMTQ6MDY6MjIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBybWkuZGU+Ci0KLSAgICAgICAgKiBvYmotdm1zLmM6IEFkZCBDKysgc3VwcG9ydCB3aXRoIGN0b3JzL2R0b3JzIHNlY3Rpb25zLiAgQWRkIHdlYWsKLQlzeW1ib2wgZGVmaW5pdGlvbnMuCi0JKEN0b3JzX1N5bWJvbHMsIER0b3JzX1N5bWJvbHMpOiBOZXcgc3ltYm9sIGNoYWlucy4KLQkocHNfQ1RPUlMsIHBzX0RUT1JTKTogTmV3IHNlY3Rpb24gdHlwZXMuCi0JKHZtc19maXh1cF94dG9yc19zZWN0aW9uKTogTmV3IGZ1bmN0aW9uCi0JKEN0b3JzX1BzZWN0LCBEdG9yc19Qc2VjdCk6IERlZmluZS4KLQkoSVNfR1hYX1hUT1IpOiBEZWZpbmUKLQkoZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBDaGFuZ2UgY2hlY2sgb2YgZ3h4X2J1Z19maXhlZCB0byAwLgotCUZpbHRlciBzdGF0aWMgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIGFuZCBhZGQgdG8KLQlDdG9yc19TeW1ib2xzL0R0b3JzX1N5bWJvbHMgY2hhaW4uCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSk6IFdyaXRlIEN0b3JzX1N5bWJvbHMvRHRvcnNfU3ltYm9scyB0bwotCWFwcHJvcHJpYXRlIHNlY3Rpb24uCi0KLSAgICAgICAgKiB0Yy1hbHBoYS5oIChUQVJHRVRfRk9STUFUKTogUmVuYW1lICJldmF4LWFscGhhIiB0byAidm1zLWFscGhhIi4KLQkqIG1ha2VmaWxlLnZtczogTWVyZ2UgdmF4L3ZtcyBzdXBwb3J0LgotCi1XZWQgSnVsICAxIDIwOjA2OjIwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdnRhYmxlX2luaGVyaXQsIG9ial9lbGZfdnRhYmxlX2VudHJ5KTogTmV3LgotCShlbGZfcHNldWRvX3RhYmxlKTogQWRkIHRoZW0uCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSB2dGFibGUgcmVsb2NzLgotCShtZF9hcHBseV9maXgpOiBBY2NlcHQgdGhlbS4KLQkobWlwc19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB0aGVtLgotCSh0Y19nZW5fcmVsb2MpOiBNdW5nIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkgZm9yIFJlbC4KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFjY2VwdCB2dGFibGUgcmVsb2NzLgotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04pOiBGb3JjZSB2dGFibGUgcmVsb2NzLgotCSh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCB0aGVtLgotCi1XZWQgSnVsICAxIDE2OjM1OjMyIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0dFTl9DUFVfUFJFRklYKTogTmV3IHZhcmlhYmxlLgotCShjZ2VuLm8pOiBVc2UgaXQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogQUNfU1VCU1QgY2dlbl9jcHVfcHJlZml4LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1XZWQgSnVsICAxIDIxOjM4OjU2IDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaCAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTJfREVMQVlfTEVOR1RIKTogRGVmaW5lLgotCUNoYW5nZWQgYWxsIHVzZXJzIG9mIENPTkQxMl9ERUxBWS4KLQotRnJpIEp1biAyNiAxMToyMToxMSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHNldF9hcmNoX21hY2gpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBwc2V1ZG8tb3BzIHRvIHNldCB0aGUgY3VycmVudCBtYWNoaW5lIHR5cGUuCi0JKG1kX2JlZ2luKTogRGVmYXVsdCB0byBtbjEwMzAwIG1vZGUuCi0JKG1kX2Fzc2VtYmxlKTogT25seSBhY2NlcHQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgY29yZSBtbjEwMzAwCi0JY2hpcCBhbmQgdGhlIGFjdGl2ZSBtYWNoaW5lIHR5cGUuCi0KLVdlZCBKdW4gMjQgMTk6MDY6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogR2l2ZSB0aGUgc3RydWN0IGEgbmFtZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oICh0Y19yZWxvY19tYW5nbGUpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLWg4NTAwLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtc2guaCAoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBBZGQgcHJvdG90eXBlLgotCSogY29uZmlnL3RjLXc2NS5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXo4ay5oICh0Y19yZWxvY19tYW5nbGUpOiBEZWNsYXJlLgotCi1XZWQgSnVuIDI0IDEzOjQ1OjAwIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9jb21tKTogIFJlc3RvcmUgb2xkIHNlY3Rpb24KLSAgICAgICAgYWZ0ZXIgY29tbW9uIHByb2Nlc3NpbmcuCi0KLVdlZCBKdW4gMjQgMTE6NTA6NTQgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKENyZWF0ZV9WTVNfT2JqZWN0X0ZpbGUpOiBGb3JjZSBiaW5hcnkgZmlsZS4KLQotVHVlIEp1biAyMyAxNzo0NzozMSAxOTk4ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChkb19hX2ZpeF9pbW0sIGJ1aWxkX2J5dGVzKTogUmVwbGFjZSBjYXN0IHRvCi0JY2hhciB3aXRoIGNvZGUgdGhhdCBleHBsaWNpdGx5IHNpZ24tZXh0ZW5kcy4KLQotVHVlIEp1biAyMyAxMzo1NDo1NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiBSZXN0b3JlIHRleHQgc2VjdGlvbiBhcyB0aGUgY3VycmVudAotCXNlY3Rpb24gYWZ0ZXIgY3JlYXRpbmcgY2FsbCB0YWJsZSBzZWN0aW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTWU1fQVVYSU5GTyk6IE5ldyBtYWNybyB0byBjb25jZWFsIHVnbHkKLQljb2RlLiAKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogUmVwbGFjZSBjb21wbGV4IGV4cHJlc2lvbgotCXdpdGggY2FsbCB0byBtYWNybyBTWU1fQVVYSU5GTy4KLQotVHVlIEp1biAyMyAxNTowOToyNyAxOTk4ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBEb24ndCBsZXQgRVhFRVhUIGludGVyZmVyZQotCXdpdGggdGhlIHByb2dyYW0gdHJhbnNmb3JtIG5hbWUuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEp1biAyMiAxOTo1Mjo0MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjX3N5bWJvbF9tZXJnZSk6IEZpeCBjb3B5aW5nIG9mIGF1eGlsaWFyeQotCWluZm9ybWF0aW9uLgotCi1Nb24gSnVuIDIyIDE1OjE4OjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogQmUgcHJlcGFyZWQgZm9yIGEgc3BhY2UgYmV0d2VlbgotCXRoZSBvcGVuIHBhcmVudGhlc2lzIGFuZCB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmQsCi0JYmVjYXVzZSBvZiB0aGUgSnVuZSAxNiBjaGFuZ2UuCi0KLVN1biBKdW4gMjEgMjE6Mjc6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIHdlYWsgc3ltYm9scyBjb3JyZWN0bHkgaWYKLQlCRkRfQVNTRU1CTEVSLgotCi1TdW4gSnVuIDIxIDEyOjI2OjM2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGQzMHZfYWxpZ24pOiBBbHdheXMgcGVyZm9ybSBhbGlnbm1lbnQgcmVxdWVzdCwKLQlldmVuIGlmIGl0IGlzIGJlbGl2ZWQgdG8gYmUgdW5uZWNlc3NhcnkuCi0KLUZyaSBKdW4gMTkgMTM6NTc6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IE5ldmVyIGFkanVzdCByZWxvY3MgYWdhaW5zdCB3ZWFrCi0Jc3ltYm9scy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotRnJpIEp1biAxOSAwOTo1MDoxNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQpOiBEbyBub3QgaGFyZGNvZGUgdGhlCi0Jc2hpZnQgYW1vdW50IGZvciBhIHJlcGVhdGVkIG9wZXJhbmQuICBUaGUgc2hpZnQgYW1vdW50IGZvciB0aGUKLQlyZXBlYXRlZCBjb3B5IGNvbWVzIGZyb20gdGhlIHNpemUgb2YgdGhlIG9wZXJhbmQuCi0KLUZyaSBKdW4gMTkgMDA6NDQ6MTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X29wZXJhbmQpOiBGaXggdHlwb3MgaW4gbGRtL3N0bSBzdXBwb3J0LgotCi1XZWQgSnVuIDE3IDEzOjA3OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCAtbWlwc04gdXNhZ2UuCi0KLVR1ZSBKdW4gMTYgMTM6MDY6MjEgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJZiB0Y19zeW1ib2xfY2hhcnMgaXMgZGVmaW5lZCwgdHJlYXQgYWxsCi0JY2hhcmFjdGVycyBpbiBpdCBhcyBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX3N5bWJvbF9jaGFycyk6IERlZmluZS4KLQkoZXh0cmFfc3ltYm9sX2NoYXJzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGV4dHJhX3N5bWJvbF9jaGFycyk6IERlZmluZS4KLQkoY29tbWVudF9jaGFycyk6IERvbid0IHVzZSAnLycgYXMgY29tbWVudCBzdGFydCBpZiBURV9MSU5VWC4KLQkobGluZV9jb21tZW50X2NoYXJzKTogU2V0IHRvICcvJyBpZiBURV9MSU5VWC4KLQkqIGRvYy9jLWkzODYudGV4aSAoaTM4Ni1wcmVmaXhlcyk6IFVwZGF0ZS4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCB0Y19zeW1ib2xfY2hhcnMuCi0KLUZyaSBKdW4gMTIgMTM6MzY6NTQgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLTE5OTgtMDYtMTIgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hcHBseV9maXgzKTogQ2hlY2tpbmcgZGlzcGxhY2VtZW50Ci0JY29uc3RyYWludCBpbiBpbnN0cnVjdGlvbnMgUkVQICYgUkVQSS4KLQotVGh1IEp1biAxMSAwODo1Njo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogQ2F0Y2ggQkZEX1JFTE9DXzgsCi0JQkZEX1JFTE9DXzE2LCBCRkRfUkVMT0NfNjQgYW5kIGlzc3VlIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2VzLiAgCi0KLQkoY2hlY2tfcmFuZ2UpOiBJZiB0aGUgb3BlcmFuZCBpcyBzaGlmdGVkLCB0aGVuIHNoaWZ0IHRoZSBudW1iZXIKLQliZWZvcmUgY2hlY2tpbmcgaXRzIHJhbmdlLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IEFkZCBtb3JlIGNoZWNrcyBmb3IgTlVMTCBwb2ludGVycy4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IFNldCBTRUNfQ09NTU9OIGJpdCBvbiBzcGVjaWFsCi0JY29tbW9uIHNlY3Rpb25zLgotCi1XZWQgSnVuIDEwIDE3OjI2OjM1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfY29tbSk6IENyZWF0ZSBzcGVjaWFsIHNlY3Rpb25zIGFzIG5lZWRlZC4KLQotMTk5OC0wNi0xMCAgVmxhZGltaXIgTi4gTWFrYXJvdiAgPHZtYWthcm92QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHdyaXRlXzJfc2hvcnQpOiBBZGRpdGlvbiBvZiBzd2FwcGluZwotCWluc3RydWN0aW9ucyBmb3Igc2VxdWVudGlhbCBhbmQgcmV2ZXJzZSBzZXF1ZW50aWFsIG9yZGVyIHdoZW4KLQlnaXZlbiBvcmRlciBpcyBub3QgcG9zc2libGUuCi0KLVR1ZSBKdW4gIDkgMTM6NTI6NTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShERVBfSU5DTFVERVMpOiBGaXggcmVmZXJlbmNlIHRvIGludGwgYnVpbGQgZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdW4gIDkgMTI6MjA6MDUgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBkb2MvYy1pMzg2LnRleGk6IFVwZGF0ZSAxNiBiaXQgZG9jdW1lbnRhdGlvbi4KLQotCSogY29uZmlnL3RjLWkzODYuaDogQ2hhbmdlIERhdGExNiB0byBTaXplMTYsIERhdGEzMiB0byBTaXplMzIsCi0JSWdub3JlRGF0YVNpemUgdG8gSWdub3JlU2l6ZSBhcyB0aGV5IGFyZSB1c2VkIGZvciBhZGRyZXNzIHNpemUgYXMKLQl3ZWxsIGFzIGRhdGEgc2l6ZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IExpa2V3aXNlLiAgQWRkIGNvZGUgdG8gcmVqZWN0IGFkZHIzMi9kYXRhMzIgaW4KLQkzMi1iaXQgbW9kZSwgc2ltaWxhcmx5IGFkZHIxNi9kYXRhMTYgYW5kIHZhcmlhbnRzLgotCi1Nb24gSnVuICA4IDE4OjMyOjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogRml4IGhhbmRsaW5nIG9mIHJldmVyc2UKLQlzZXF1ZW50aWFsIHdvcmQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zLgotCQotCShkb19hc3NlbWJsZSk6IEFkZCBleHRyYSBjb21tYW5kIGxpbmUgYXJndW1lbnQsIHRvIGFsbG93IG11bDMyCi0JYXR0cmlidXRlIHRvIGJlIHByZXNlcnZlZCBhY3Jvc3MgcGFyYWxsZWwgaW5zbnMuCi0JKG1kX2Fzc2VtYmxlKTogSW5zZXJ0IE5PUHMgYmV0d2VlbiBleHBsaWNpdGx5IHBhcmFsbGVsIGluc25zIHdoaWNoCi0JY29udGFpbiBhbiAzMiBiaXQgbXVsdGlwbHkgYW5kIGEgMTYgbXVsdGlwbHkuCi0KLU1vbiBKdW4gIDggMTI6MjA6MzAgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSRVBORSByZW5hbWVkIHRvIFJFUE5FX1BSRUZJWF9PUENPREUsIGFuZAotCWxpa2V3aXNlIGZvciBSRVBFLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChyZWxvYyk6IEFkZCBicmFjZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogUmVuYW1lIGJpIHRvIHNpYiB0byBiZQotCWNvbnNpc3RlbnQgd2l0aCBJbnRlbCBuYW1pbmcuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChiYXNlX2luZGV4X2J5dGUpOiBSZW5hbWUgdG8gc2liX2J5dGUuICBEb24ndAotCXVzZSBiaXRmaWVsZHMgaW4gc2liX2J5dGUuCi0JKG1vZHJtX2J5dGUpOiBEb24ndCB1c2UgYml0ZmllbGRzIGhlcmUgZWl0aGVyLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjdXJyZW50X3RlbXBsYXRlcyk6IEFkZCBjb25zdC4KLQkocGFyc2VfcmVnaXN0ZXIpOiBBZGQgY29uc3QgdG8gcmV0dXJuLCBwYXJhbSwgYW5kIGNoYXIgKnMuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBjb25zdCB0byByZWdfZW50cnkgKnIuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0ZW1wbGF0ZXMpOiBBZGQgY29uc3QgdG8gc3RhcnQsIGVuZC4KLQotCUluc3BpcmVkIGJ5IGNvZGUgZm9yIDE2IGJpdCBnYXMgc3VwcG9ydCBmcm9tIE1hcnR5bmFzIEt1bmlnZWxpcwotCTxtYXJ0eW5hc0BubTMua3R1Lmx0PjoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRkIGZ1bGwgc3VwcG9ydCBmb3IgMTYgYml0Ci0JbW9kcm0sIGFuZCBKdW1wLCBKdW1wQnl0ZSwgSnVtcER3b3JkLCBKdW1wSW50ZXJTZWdtZW50IGluc25zLgotCSh1c2VzX21lbV9hZGRybW9kZSk6IFJlbW92ZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBBZGQgc3VwcG9ydCBoZXJlIHRvby4KLQkobWRfcmVsYXhfdGFibGUpOiBSZXdyaXRlIGludGVyZmFjZSB0byBtZF9yZWxheCBmb3IgMTYgYml0Ci0Jc3VwcG9ydC4KLQkoQllURSwgV09SRCwgRFdPUkQsIFVOS05PV05fU0laRSk6IFJlbW92ZS4KLQkob3Bjb2RlX3N1ZmZpeF90b190eXBlKTogUmVtb3ZlLgotCShDT0RFMTYsIFNNQUxMLCBTTUFMTDE2LCBCSUcsIEJJRzE2KTogRGVmaW5lLgotCShTSVpFX0ZST01fUkVMQVhfU1RBVEUpOiBNb2RpZnkgdG8gc3VpdCBhYm92ZS4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKGkzODZfb3BlcmFuZCk6IEFkZCBzdXBwb3J0IGZvciAxNiBiaXQgYmFzZS9pbmRleCByZWdzLAotCWltbWVkaWF0ZXMsIGFuZCBkaXNwbGFjZW1lbnRzLiAgUmVtb3ZlIHNvbWUgdW5uZWNlc3NhcnkgY2FzdHMsIGFuZAotCWxvY2FsaXNlIGVuZF9vZl9vcGVyYW5kX3N0cmluZywgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCwKLQlkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCB2YXJpYWJsZXMuICBBZGQgR0NDX0FTTV9PX0hBQ0suCi0JKiBjb25maWcvdGMtaTM4Ni5oIChOT19CQVNFX1JFR0lTVEVSXzE2KTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwcmVmaXhfaGFzaCk6IFJlbW92ZS4KLQkobWRfYmVnaW4pOiBSZXdyaXRlIHdpdGhvdXQgb2JzdGFja3MuICBSZW1vdmUgcHJlZml4IGhhc2ggdGFibGUKLQloYW5kbGluZy4gIFJld3JpdGUgbGV4aWNhbCB0YWJsZSBoYW5kbGluZy4KLQkoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogRG9uJ3QgcHJpbnQgcHJlZml4IHN0YXRpc3RpY3MuCi0JKG1kX2Fzc2VtYmxlKTogUmV3cml0ZSBpbnN0cnVjdGlvbiBwYXJzZXIgc28gdGhhdCBsaW5lIGlzIG5vdAotCWNvbnZlcnRlZCB0byBsb3dlciBjYXNlLiAgRG9uJ3QgZG8gYSBoYXNoX2ZpbmQgZm9yIHByZWZpeGVzLAotCWluc3RlYWQgcmVjb2duaXNlIHRoZW0gdmlhIG9wY29kZSBtb2RpZmllci4KLQkoZXhwZWN0aW5nX29wZXJhbmQsIHBhcmVuX25vdF9iYWxhbmNlZCk6IExvY2FsaXNlIHZhcmlhYmxlcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKElzUHJlZml4KTogRGVmaW5lLgotCShwcmVmaXhfZW50cnkpOiBSZW1vdmUuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFBSRUZJWF9TRVBFUkFUT1IpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChQUkVGSVhfU0VQQVJBVE9SKTogRGVmaW5lIGhlcmUgaW5zdGVhZCwgdXNpbmcKLQknXFwnIGluIGNhc2Ugd2hlcmUgY29tbWVudF9jaGFycyBjb250YWlucyAnLycuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKE1BVENIKTogRW5zdXJlIGdpdmVuIG9wZXJhbmQgYW5kIHRlbXBsYXRlCi0JbWF0Y2ggZm9yIEp1bXBBYnNvbHV0ZS4gIE1ha2VzIGUuZy4gYGxqbXAgdGFibGUoJWVieCknIGludmFsaWQ7Ci0JeW91IG11c3Qgd3JpdGUgYGxqbXAgKnRhYmxlKCVlYngpJy4KLQotCUZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogY29uZmlnL3RjLWkzODYuYyAoQkZEX1JFTE9DXzE2LCBCRkRfUkVMT0NfMTZfUENSRUwpOiBEZWZpbmUKLQlhcyAwIGlmbmRlZiBCRkRfQVNTRU1CTEVSLgotCShtZF9hc3NlbWJsZSk6IEFsbG93IGltbWVkaWF0ZSBvcGVyYW5kcyB3aXRob3V0IHN1ZmZpeCBvcgotCW90aGVyIHJlZyBvcGVyYW5kIHRvIGRlZmF1bHQgaW4gc2l6ZSB0byB0aGUgY3VycmVudCBjb2RlIHNpemUuCi0KLU1vbiBKdW4gIDggMDk6NDU6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiAgUmVzdG9yZSBjcmVhdGlvbiBvZgotICAgICAgICAuY2FsbF90YWJsZV90ZXh0IGFuZCAuY2FsbF90YWJsZV9kYXRhIHNlY3Rpb25zLgotCi1TYXQgSnVuICA2IDAwOjAyOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogU2V0IGV4ZWN1dGlvbiB0eXBlIHRvIHVua25vd24KLQlhZnRlciBlbWl0dGluZyBhIHdvcmQgb2Ygbm9vcHMuCi0KLUZyaSBKdW4gIDUgMjM6Mjc6MDQgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtb2RlX2Zyb21fZGlzcF9zaXplKTogRGlzcDE2IGlzIG1vZGUgMi4KLQkoaTM4Nl9vcGVyYW5kKTogU2ltcGxpZnkgY2hlY2tzIGZvciB2YWxpZCBiYXNlL2luZGV4IGNvbWJpbmF0aW9ucy4KLQlEaXNhbGxvdyBgaW4gNCglZHgpLCVhbCcuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogTWFrZSByZWdzLCBiYXNlX3JlZywgYW5kCi0JaW5kZXhfcmVnIGNvbnN0LgotCShhZGRfcHJlZml4KTogQ2hhbmdlIHBhcmFtZXRlciBmcm9tIGNoYXIgdG8gaW50LgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChVZ2gpOiBEZWZpbmUgb3Bjb2RlIG1vZGlmaWVyLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBQcmludCB3YXJuaW5ncyBmb3IgVWdoIGluc25zLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IFJld3JpdGUgTUFUQ0ggYW5kCi0JQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCBtYWNyb3MgdG8gY2hlY2sgcmVnaXN0ZXIgdHlwZXMgbW9yZQotCXRob3JvdWdobHkuICBDaGVjayBmb3IgaWxsZWdhbCBzdWZmaXgvb3BlcmFuZCBjb21iaW5hdGlvbnMKLQl3aGVuIG1hdGNoaW5nIGluc25zIHdpdGggb3BlcmFuZHMuICBIYW5kbGUgbmV3IGBzJyBzdWZmaXgsIGFuZAotCWFzc29jaWF0ZWQgRmxvYXRNRiBvcGNvZGUgbW9kaWZpZXIgZm9yIGZsb2F0IGluc25zIHdpdGggbWVtb3J5Ci0Jb3BlcmFuZHMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChGbG9hdE1GKTogRGVmaW5lIG5ldyBvcGNvZGUgbW9kaWZpZXIuCi0JKE5vX3NTdWYsIE5vX2JTdWYsIE5vX3dTdWYsIE5vX2xTdWYpOiBMaWtld2lzZS4KLQkoU0hPUlRfT1BDT0RFX1NVRkZJWCwgTE9OR19PUENPREVfU1VGRklYKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYzogUmVuYW1lIFdPUkRfUFJFRklYX09QQ09ERSB0bwotCURBVEFfUFJFRklYX09QQ09ERSB0aHJvdWdob3V0LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChSRUdJU1RFUl9XQVJOSU5HUyk6IERlZmluZS4KLQkobWRfYXNzZW1ibGUpOiBSZXdyaXRlIHN1ZmZpeC9yZWdpc3RlciBvcGVyYW5kIGNoZWNraW5nIGNvZGUgdG8gYmUKLQltb3JlIHRob3JvdWdoLiAgUmVtb3ZlIEFiczgsMTYsMzIuICBDaGFuZ2Ugb2NjdXJyZW5jZXMgb2YgTWVtIHRvCi0JQW55TWVtLCB0aGUgYmV0dGVyIHRvIGdyZXAuCi0JKHBpKTogUmVtb3ZlIEFicy4KLQkoaTM4Nl9vcGVyYW5kKTogRG9uJ3Qgc2V0IE1lbSBiaXRzIGluIGkudHlwZXNbdGhpc19vcGVyYW5kXSB3aGVuCi0JZ2l2ZW4gYSBtZW1vcnkgb3BlcmFuZC4gIERvbid0IHNldCBBYnMgYml0cyBlaXRoZXIuCi0JKHR5cGVfbmFtZXMpOiBSZW1vdmUgTWVtKiwgQWJzKi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE1lbTgsIE1lbTE2LCBNZW0zMiwgQWJzOCwgQWJzMTYsIEFiczMyKTogRG9uJ3QKLQlkZWZpbmUgb3Bjb2RlX21vZGlmaWVycyBhcyB0aGVzZSBjYXNlcyBhcmUgaGFuZGxlZCBieSBEaXNwOCwKLQlEaXNwMTYsIERpc3AzMiBhbmQgc3VmZml4IGNoZWNrcy4KLQkoQ09NRVNfSU5fQk9USF9ESVJFQ1RJT05TKTogUmVtb3ZlLgotCShGbG9hdFIpOiBEZWZpbmUuIEl0J3MgT0sgdG8gc2hhcmUgdGhlIGJpdCB3aXRoIFJldmVyc2VSZWdSZWdtZW0uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZW1pdCBvcGVyYW5kIHNpemUgcHJlZml4Ci0JaWYgSWdub3JlRGF0YVNpemUgbW9kaWZpZXIgZ2l2ZW4uICBSZW1vdmUgU2hvcnRmb3JtVyBtb2RpZmllcgotCXRlc3QuICBBZGQgdGVzdCBmb3IgU2hvcnRGb3JtIGluIFcgYmFzZV9vcGNvZGUgbW9kaWZpY2F0aW9uLgotCU1lcmdlIFNlZzJTaG9ydEZvcm0gYW5kIFNlZzNTaG9ydEZvcm0gY29kZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFNob3J0Rm9ybVcpOiBSZW1vdmUuCi0JKElnbm9yZURhdGFTaXplKTogRGVmaW5lLgotCi1GcmkgSnVuICA1IDEwOjUwOjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2Fzc2VtYmxlKTogU3RvcmUgcHJldmlvdXMgc2VnbWVudCBzdGF0ZQotCXdpdGggcHJldmlvdXMgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBKdW4JIDMgMTg6MjE6NTYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChTQ0FMRTFfV0hFTl9OT19JTkRFWCk6IERlZmluZS4KLQkoZWJwLCBlc3ApOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlcy4KLQkoTUFUQ0gpOiBSZW1vdmUgdGVzdCBmb3IgSW5PdXRQb3J0UmVnLgotCShpMzg2X29wZXJhbmQpOiBQcm9wZXJseSBoYW5kbGUgSW5PdXRQb3J0UmVnIGhlcmUgaW5zdGVhZC4KLQlEaXNhbGxvd3MgYGluYiAoJWR4LDIpJywgYGluYiAlZXM6KCVkeCknIGFuZCBgbW92ICglZHgpLCVheCcKLQkobWRfYXNzZW1ibGUpOiBTaW1wbGlmeSBhbmQgY29ycmVjdCBtb2RybSBhbmQgc2liIGdlbmVyYXRpb24uCi0JKGkzODZfb3BlcmFuZCk6IEFkZCB3YXJuaW5nIGZvciBzY2FsZSB3aXRob3V0IGluZGV4LgotCVJld3JpdGUgY2hlY2tzIGZvciB2YWxpZCBiYXNlL2luZGV4IGNvbWJpbmF0aW9ucy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoRU5EX1NUUklOR19BTkRfU0FWRSk6IFByb3RlY3QgYXJndW1lbnRzIG9mCi0JbWFjcm9zIGFuZCBlbmNsb3NlIGluIGRvIHdoaWxlKDApLgotCShSRVNUT1JFX0VORF9TVFJJTkcpOiBMaWtld2lzZS4KLQkobWRfYXNzZW1ibGUpOiBBZGQgb25lIHRvIHByaW50ZWQgb3BlcmFuZCBudW1iZXIgc28gd2Ugc3RhcnQKLQlmcm9tIDEgbm90IDAuICBBZGQgc29tZSBtb3JlIGdldHRleHQgaW52b2NhdGlvbnMuCi0JKGkzODZfb3BlcmFuZCk6IEZpeCBgJSVzJyAtPiBgJSUlcycuIEluYyBwcmludGVkIG9wZXJhbmQKLQludW1iZXIgaGVyZSB0b28uCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFdBSVRfUFJFRklYLCBMT0NLUkVQX1BSRUZJWCwgQUREUl9QUkVGSVgsCi0JREFUQV9QUkVGSVgsIFNFR19QUkVGSVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzdHJ1Y3QgX2kzODZfaW5zbik6IFJlbW92ZSB3YWl0X3ByZWZpeCBmaWVsZC4KLQkoY2hlY2tfcHJlZml4KTogUmVtb3ZlIGZ1bmN0aW9uLgotCShhZGRfcHJlZml4KTogTmV3IGZ1bmN0aW9uLiAgQWRkIHByZWZpeCB0byBpLnByZWZpeCBhcyB3ZWxsIGFzCi0JZG9pbmcgY2hlY2tzLgotCShtZF9hc3NlbWJsZSk6IENoYW5nZXMgZm9yIGFkZF9wcmVmaXguCVJlbW92ZSBoYWNrIGZvciB3YWl0Ci0JcHJlZml4LCBpbnN0ZWFkIGFsd2F5cyBvdXRwdXQgcHJlZml4ZXMgaW4gZml4ZWQgb3JkZXIuCVRlc3QKLQlmb3IgamN4ei9sb29wIHdoZW4gc2VsZWN0aW5nIGJldHdlZW4gd29yZCAmIGR3b3JkIG9wZXJhdGlvbnMsCi0JYW5kIGFkZCBhZGRyZXNzIHNpemUgcHJlZml4IHJhdGhlciB0aGFuIG9wZXJhbmQgc2l6ZSBwcmVmaXguCi0JUmVtb3ZlIG9wZXJhbmQgLT4gYWRkcmVzcyBzaXplIGhhY2sgd2hlbiBlbWl0dGluZyBqY3h6L2xvb3AuCi0JKGkzODZfb3BlcmFuZCk6IFJlbW92ZSBPX0Fic2VudCBjaGVjayBhcyBpdCdzIGRvbmUgaW4gZXhwci4KLQotV2VkIEp1biAgMyAxNTowOToxMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG01MjAwIGFzIGEgY3B1X3R5cGUgb2YgbTY4ay4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKdW4gIDMgMTQ6MTE6NTkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQWRkIG1vcmUgY2FsbHMKLQl0byByZWxheGFibGVfc3ltYm9sIHRvIHByZXZlbnQgcmVmZXJlbmNlcyB0byBleHRlcm5hbCBzeW1ib2wgZnJvbQotCWJlaW5nIHJlbGF4ZWQuCi0KLVdlZCBKdW4gIDMgMTQ6MTA6MzYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChyZWxheGFibGVfc3ltYm9sKTogSWYgVEFSR0VUX09TIGlzICJlbGYiLCBhbGwKLQlzeW1ib2xzIGFyZSByZWxheGFibGUuCi0KLVdlZCBKdW4gIDMgMDk6MTY6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogY29uZmlnL3RjLXY4NTAuYyAobWRfYmVnaW4pOiAgRG9uJ3QgY3JlYXRlIHNwZWNpYWwKLSAgICAgICAgc2VjdGlvbnMgYnkgZGVmYXVsdC4KLSAKLVR1ZSBKdW4gIDIgMTQ6NTI6NTYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZvciBkaXYgYW5kIHVkaXYsIGNsb3NlIHRoZQotCXJlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQotVHVlIEp1biAgMiAxNTozNjoxMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIE1hdHQgU2VtZXJza3kgPG1hdHRzQHNjZC5ocC5jb20+OgotCSogbWFjcm8uYyAobWFjcm9fbXJpX21vZGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBtYWNyby5oIChtYWNyb19tcmlfbW9kZSk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHNfbXJpKTogQ2FsbCBtYWNyb19tcmlfbW9kZSB3aGVuIHN3aXRjaGluZyBpbiBhbmQgb3V0IG9mCi0JTVJJIG1vZGUuCi0KLVR1ZSBKdW4gIDIgMTM6MzI6MjIgMTk5OCAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChzX2FscGhhX2NvbW0pOiBBbGxvdyBhbGlnbm1lbnQgcGFyYW1ldGVyIGluCi0JT0JKX0VWQVggY2FzZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IERlZmVyIHJlc3RvcmluZyBjaGFyYWN0ZXIKLQl1bnRpbCBhZnRlciB4c3RyZHVwIGluIE9CSl9FVkFYIGNhc2UuCi0KLVR1ZSBKdW4gIDIgMTM6MTE6MTMgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfY3JlYXRlX3Nob3J0X2p1bXApOiBGaXggb2ZmIGJ5IHR3byBidWcgaW4KLQlvZmZzZXQgY2FsY3VsYXRpb24uICBBbHNvLCB1c2UgVkFYX0JSVyBmcm9tIHZheC1pbnN0LmggaW5zdGVhZAotCW9mIGhhcmRjb2RlZCBtYWdpYyBudW1iZXIuCi0JKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBVc2UgVkFYX0pNUCBhbmQgVkFYX0FCU09MVVRFX01PREUgbWFjcm9zLgotCi1UdWUgSnVuICAyIDA5OjI1OjM0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZG9fc19mdW5jKTogTmV3IGZ1bmN0aW9uLgotCShzX2Z1bmMpOiBDYWxsIGl0LgotCSogcmVhZC5oIChkb19zX2Z1bmMpOiBBZGQgcHJvdG90eXBlLgotCi1Nb24gSnVuICAxIDEyOjQ3OjMwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBPbmx5IGZpbGwgY29kZSBzZWN0aW9ucyB3aXRoCi0Jbm9wcyBpZiBmaWxsIHBhdHRlcm4gbm90IHNwZWNpZmllZC4KLQotTW9uIEp1biAgMSAxNDowODozNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEFuZHJldyBDcmFidHJlZSA8YW5kcmV3Y0B0eXBob29uLnJvc2UuaHAuY29tPjoKLQkqIGNvbmZpZy90ZS1nbzMyLmggKFRFX0dPMzIpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChMT0NBTF9MQUJFTCk6IERvbid0IGRlZmluZSBpZiBURV9HTzMyLgotCi1TdW4gTWF5IDMxIDE1OjQzOjA2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQlJbXBsZW1lbnQgLmZ1bmMvLmVuZGZ1bmMgcHNldWRvLW9wcy4KLQkqIHJlYWQuaCAoc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMsc3RhYnNfZ2VuZXJhdGVfYXNtX2VuZGZ1bmMpOiBEZWNsYXJlLgotCShzX2Z1bmMpOiBEZWNsYXJlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIC5mdW5jLC5lbmRmdW5jLgotCShzX2Z1bmMpOiBOZXcgZnVuY3Rpb24uCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fZnVuYyxzdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyk6IE5ldwotCWZ1bmN0aW9ucy4KLQkoaW5fZG9jX2Z1bmNfcCxjdXJyZW50X2Z1bmN0aW9uX2xhYmVsKTogTmV3IHN0YXRpYyBnbG9iYWxzLgotCShzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogRW1pdCBmdW5jdGlvbiByZWxhdGl2ZSBzdGFicyBpZiBpbiAuZnVuYy4KLQotRnJpIE1heSAyOSAxODoxMzoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hMjlrLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaHBwYS5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWk4NjAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKFdPUktJTkdfRE9UX1dPUkQpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdGljMzAuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy13NjUuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAoV09SS0lOR19ET1RfV09SRCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IERvbid0IGRlZmluZSBtZF9zaG9ydF9qdW1wX3NpemUsCi0gCW1kX2xvbmdfanVtcF9zaXplLCBtZF9jcmVhdGVfc2hvcnRfanVtcCBvciBtZF9jcmVhdGVfbG9uZ19qdW1wLgotCSogY29uZmlnL3RjLWFscGhhLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFscGhhLmg6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWFybS5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODUwMC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk4NjAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTk2MC5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1wcGMuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc3BhcmMuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdGljMzAuYzogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdzY1LmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXo4ay5jOiBMaWtld2lzZS4KLQotRnJpIE1heSAyOSAxNjowMzoyNiAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3RjLXZheC5jIChfKTogRGVsZXRlIHRoaXMgbWFjcm8gdXNlZCBmb3IgcGxhY2Vob2xkZXIKLQl2YWx1ZXMgaW4gdmF4X29wZXJhbmRfd2lkdGhfc2l6ZTsgaXQgY29uZmxpY3RzIHdpdGggdGhlIF8oKSBtYWNybwotCXVzZWQgZm9yIGludGVybmF0aW9uYWxpemF0aW9uLgotCi1GcmkgTWF5IDI5IDEzOjQ2OjA3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfZmluZF9iYXNlKTogRml4IGNhc2UgaW5zZW5zaXRpdmUgc3ltYm9sIG5hbWUKLQljb2RlLiAgRnJvbSBDaHJpcyBNb2xsZXIgPG1vbGxlckBib3BzLmNvbT4uCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIEtsYXVzIEthZW1wZiA8a2thZW1wZkBwcm9naXMuZGU+OgotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBicm9rZW5fd29yZCk6IEFkZCBzZWcgYW5kIHN1YnNlZyBmaWVsZHMuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IEluaXRpYWxpemUgc2VnIGFuZCBzdWJzZWcgZmllbGRzIG9mIGEgbmV3Ci0JYnJva2VuIHdvcmQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFN3aXRjaCB0byB0aGUgYXBwcm9wcmlhdGUgc2VnbWVudAotCWFuZCBzdWJzZWdtZW50IHdoZW4gcHJvY2Vzc2luZyBhIGJyb2tlbiB3b3JkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtcmlfYXNzZW1ibGUpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2FsbCBtcmlfYXNzZW1ibGUgcmF0aGVyIHRoYW4KLQltZF9hc3NlbWJsZS4KLQkoc19tcmlfZWxzZSwgc19tcmlfYnJlYWssIHNfbXJpX25leHQsIHNfbXJpX2Zvcik6IExpa2V3aXNlLgotCShzX21yaV9lbmRmLCBzX21yaV9lbmR3KTogTGlrZXdpc2UuCi0KLVdlZCBNYXkgMjcgMTE6MTY6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfb3JnKTogQ2FsbCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpZiBpdCBpcyBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvd191c2FnZSk6IEFkZCBcblwgdG8gbmV3IHN0cmluZy4KLQotVHVlIE1heSAyNiAxOToyNzo1MiAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQSk6IE5ldy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWRkIGZvciBzYW1lLgotCShzcGFyY19tZF9lbmQpOiBTZXQgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlLgotCShtZF9hcHBseV9maXgzLCB0Y19nZW5fcmVsb2MpOiBBbGxvdyBCRkRfUkVMT0NfU1BBUkNfMzJMRS4KLQkoY29uc19maXhfbmV3X3NwYXJjKTogQWRkZWQgdG8gY3JlYXRlIEJGRF9SRUxPQ19TUEFSQ18zMkxFLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoY29uc19maXhfbmV3X3NwYXJjKTogQWRkZWQuCi0JCi1UaHUgTWF5IDIxIDE1OjAyOjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZmluZF9yZWFsX3N0YXJ0KTogUmVsYXggZGVmaW5pdGlvbiBvZiBsb2NhbAotCWxhYmVscy4KLQotVHVlIE1heSAxOSAxNjo1OTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkMzB2X2FsaWduKTogQXBwbHkgYWRkcmVzcyBhZGp1c3RtZW50IHRvIGFsbAotCXN5bWJvbHMgYXQgdGhlIGdpdmVuIGFkZHJlc3MsIG5vdCBqdXN0IHRoZSBsYXN0IG9uZSBzcGVjaWZpZWQuCi0KLVR1ZSBNYXkgMTkgMDg6MjU6MTkgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19oYW5kbGVfYWxpZ24pOiBVc2UgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbgotICAgICAgICBvciBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIHRvIHdyaXRlIGRhdGEuCi0KLU1vbiBNYXkgMTggMTc6MDk6MzAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSZW1vdmUgYXJ0aWZpY2lhbGx5IGNyZWF0ZWQKLQlyZWdpc3RlciBuYW1lIHN5bWJvbHMuCi0KLU1vbiBNYXkgMTggMTM6NDc6MDYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSAic2VnbWVudCIgdG8gInNlY3Rpb24iIGluCi0JZXJyb3IgbWVzc2FnZS4KLQotTW9uIE1heSAxOCAxNjo1NTo0MCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENoYW5nZSBzeW0xLXN5bTIgbWVzc2FnZSBhZ2Fpbi4KLQotTW9uIE1heSAxOCAwOTozMTo0MyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3Igc3ltMS1zeW0yCi0JZXJyb3JzIHdoZW4gc3ltMSBpcyBpbiBhIGRpZmZlcmVudCBzZWdtZW50IGZyb20gc3ltMi4KLQotV2VkIE1heSAxMyAxMDoxNjozNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jICh3YXJuX3VubWF0Y2hlZF9oaWdoKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoT1BUSU9OX1dBUk5fUEFSQUxMRUwpOiBSZW5hbWUgZnJvbSBPUFRJT05fV0FSTi4KLQkoT1BUSU9OX05PX1dBUk5fUEFSQUxMRUwpOiBSZW5hbWUgZnJvbSBPUFRJT05fTk9fV0FSTi4KLQkobWRfbG9uZ29wdHMpOiBSZWNvZ25pemUgLS17bm8tLH13YXJuLXVubWF0Y2hlZC1oaWdoLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkobWRfc2hvd191c2FnZSk6IExpa2V3aXNlLgotCShtMzJyX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgotCi0JKiByZWFkLmMgKGdlbmVyYXRlX2ZpbGVfZGVidWcsZ2VuZXJhdGVfbGluZW5vX2RlYnVnKTogTmV3IGZ1bmN0aW9ucy4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCB0aGVtLgotCSogcmVhZC5oIChzdGFic19nZW5lcmF0ZV9hc21fZmlsZSk6IERlY2xhcmUuCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkoZ2VuZXJhdGVfYXNtX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBNb3ZlIGZpbGUgbmFtZSBoYW5kbGluZyBpbnRvCi0JZ2VuZXJhdGVfYXNtX2ZpbGUuCi0KLVR1ZSBNYXkgMTIgMTI6MDM6NDQgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoY3VyX211bDMyX3AsIHByZXZfbXVsMzJfcCk6IE1ha2Ugc3RhdGljLgotICAgICAgICAoZDMwdl9jdXJyZW50X2FsaWduLCBkMzB2X2N1cnJlbnRfYWxpZ25fc2VnKTogTmV3IHZhcmlhYmxlcy4KLSAgICAgICAgKGQzMHZfbGFzdF9sYWJlbCk6IE5ldyB2YXJpYWJsZS4KLSAgICAgICAgKGQzMHZfYWxpZ24sIHNfZDMwdl9hbGlnbiwgc19kMzB2X3RleHQpOiBOZXcgZnVuY3Rpb25zLgotICAgICAgICAoc19kMzB2X2RhdGEsIHNfZDMwdl9zZWN0aW9uKTogTGlrZXdpc2UuCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIHRoZW0uCi0gICAgICAgIChtZF9iZWdpbik6IEluaXRpYWxpemUgZDMwdl9jdXJyZW50X2FsaWduX3NlZy4KLSAgICAgICAgKG1kX2Fzc2VtYmxlKTogQ2FsbCBkMzB2X2FsaWduIHdoZW4gbmVlZGVkIGJ5IGtub3duIGN1cnJlbnQgYWxpZ25tZW50LgotICAgICAgICAoZDMwdl9mcm9iX2xhYmVsLCBkMzB2X2NvbnNfYWxpZ24pOiBOZXcgZnVuY3Rpb25zLgotICAgICAgICAqIGNvbmZpZy90Yy1kMzB2LmggKG1kX2RvX2FsaWduKTogUmVtb3ZlLgotICAgICAgICAodGNfZnJvYl9sYWJlbCk6IENhbGwgZDMwdl9mcm9iX2xhYmVsLgotICAgICAgICAobWRfY29uc19hbGlnbik6IE5ldy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZmluZF9mb3JtYXQpOiBDb252ZXJ0IGNvbXBsZXggZXhwcmVzc2lvbnMgdG8gCi0JZXhwcmVzc2lvbiBzeW1ib2xzIGJlZm9yZSBwcm9jZXNzaW5nLiAgQ2xlYW4gdXAgY29kZSBmb3JtYXR0aW5nLgotCi1TdW4gTWF5IDEwIDIyOjM1OjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotVGh1IE1heSAgNyAxNTo0OTowNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlICJicmEiIGp1c3QgbGlrZSAiam1wIgotCWluc3RydWN0aW9ucy4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogTGlrZXdpc2UuCi0KLVRodSBNYXkgIDcgMTE6NDc6MjIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFVwZGF0ZSB3aXRoIGBtYWtlIGRlcC1hbScuCi0JKEhGSUxFUyk6IEFkZCBjZ2VuLmguCi0JKGNnZW4ubyk6IERlcGVuZCBvbiBjZ2VuLmguCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZS4KLQotCSogY2dlbi5jIChjZ2VuX21kX2FwcGx5X2ZpeDMpOiBEb24ndCBwYXNzIG5ld2xpbmUgdG8gYXNfd2Fybl93aGVyZS4KLQotVGh1IE1heSAgNyAxMzoyMDo1NiAxOTk4ICBBbmRlcnMgQmxvbWRlbGwgIDxhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2U+Ci0KLQkqIGdhc3AuYyAoZ3JhYl9sYWJlbCk6IFBlcm1pdCBhIGxhYmVsIHRvIGJlIGEgcHJlcHJvY2Vzc29yCi0JdmFyaWFibGUgYnkgcGVybWl0dGluZyBhIGxhYmVsIHRvIHN0YXJ0IHdpdGggYSBiYWNrc2xhc2guCi0KLVRodSBNYXkgIDcgMTI6NTA6MzMgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAodmFsaWRhdGVfbWlwc19pbnNuKTogUmVtb3ZlZCBoYWNrCi0JZm9yIHByZXZpb3VzbHkgaW5hY2Nlc3NpYmxlIGJpdGZpZWxkcyBpbiBzb21lIElOU05fVFJBUAotCWluc3RydWN0aW9ucy4KLQotVGh1IE1heSAgNyAxMToxMzowMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFib3J0IHdpdGggZXJyb3IgbWVzc2FnZQotCWlmIG9wY29kZSBvcGVyYW5kcyBkbyBub3QgbWF0Y2guCi0JCi1UaHUgTWF5ICA3IDA5OjM2OjA2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkLCB2YWxpZGF0ZV9taXBzX2luc24pOiBJbXBsZW1lbnQKLQkncScgb3BlcmFuZCBmb3JtYXQgZm9yIDIwLWJpdCAiYnJlYWsiLyJzZGJicCIgaW5zdHJ1Y3Rpb25zLgotCShtaXBzX2lwKTogVHJ1bmNhdGUgb3ZlcmZsb3dlZCAiYnJlYWsiICdjJyBvcGVyYW5kLiAgSW1wbGVtZW50Ci0Jc2ltaWxhciBuZXcgJ3EnIG9wZXJhbmQuCi0KLVRodSBNYXkgIDcgMDc6NDc6MTQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYyAoY2dlbl9hc21fZmluaXNoX2luc24pOiBGaXggdHlwby4KLQotVGh1IE1heSAgNyAwMjoxOToxNCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBOZXcgZmlsZS4KLQkqIGNnZW4uYzogSW5jbHVkZSBpdC4KLQkoTUFYX0ZJWFVQUyk6IFJlbmFtZWQgdG8gQ0dFTl9NQVhfRklYVVBTLgotCShjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFJlc3VsdCBpcyBub3cgdm9pZC4gIE5ldyBhcmcgYHJlc3VsdCcuCi0JQWxsIGNhbGxlcnMgdXBkYXRlZC4KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IEluY2x1ZGUgY2dlbi5oLgotCShtMjNyX2luc24pOiBOZXcgbWVtYmVycyBudW1fZml4dXBzLGZpeHVwcy4KLQotV2VkIE1heSAgNiAxNjoyOToxOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IFNsaWdodGx5IHJld29yayBzb21lIGNvZGUKLQl0byBhdm9pZCBjb21waWxlciB3YXJuaW5nLgotCi1XZWQgTWF5ICA2IDE1OjI2OjM0IDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IFJ1biBkZWMgYyB3aXRoIC9ub2RlYnVnLiAgUGFzcyBDQyB2YWx1ZSB3aGVuCi0JY2FsbGluZyBtYWtlLgotCi0gICAgICAgICogbWFrZWZpbGUudm1zIChPQkpTKTogQWRkIGVob3B0Lm9iagotCi1XZWQgTWF5ICA2IDE1OjExOjEyIDE5OTggIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBkb2MvYy12YXgudGV4aTogQ29ycmVjdCBhbmQgZXh0ZW5kIHZheC92bXMgZG9jdW1lbnRhdGlvbi4KLQotV2VkIE1heSAgNiAxMTo1MTo1MSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IEFjY2VwdCBhIG5ldyBwYXJhbWV0ZXIgcmVxdWVzdGluZwotCWEgc2hvcnQgZm9ybWF0IGluc24uCi0JKG1kX2Fzc2VtYmxlKTogU2V0IGl0IGZvciBleHBsaWNpdGx5IHBhY2tlZCBpbnNucy4KLQkKLVR1ZSBNYXkgIDUgMTM6MjM6MTMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc3ltYm9sX21lcmdlKTogRG8gbm90IHRha2UgYWRkcmVzcyBvZgotCW5hdGl2ZSBmaWVsZHMgd2hlbiBwZXJmb3JtaW5nIHRoZSBtZW1jcHkuCi0KLVR1ZSBNYXkgIDUgMTM6MTA6NDEgMTk5OCAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvLG1hY3JvMik6IEltcGxlbWVudCAKLQlNX0RNVUxPX0ksIE1fTVVMT19JLCBNX0RNVUxPVV9JLCBhbmQgTV9NVUxPVV9JLgotCi1Nb24gTWF5ICA0IDE3OjQ5OjE0IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBDaGFuZ2VkIHRvIGtlZXAKLQlyZWxvY2F0aW9ucyBhZ2FpbnN0IGdsb2JhbGx5IHZpc2libGUgc3ltYm9scy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHJlbGF4YWJsZV9zeW1ib2wpOiBOZXcgbWFjcm8uCi0JKG02OGtfaXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXNlIGl0LgotCSh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogQWxzbyBoYW5kbGUgd2VhayBzeW1ib2xzLgotCi1Nb24gTWF5ICA0IDE2OjEyOjIzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogS2VlcCByZWxvY3MgZm9yIGFsbAotCXJlZmVyZW5jZXMgdG8gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogV2hlbiBPQkpfRUxGLCBkb24ndCBhZGQgdGhlCi0gCXZhbHVlcyBpbiB0d2ljZSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvYyBpZiB0aGUgc3ltYm9sIGlzCi0gCWV4dGVybmFsbHkgZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0FPVVRdOiBXaGVuIFBJQywKLQlkb24ndCBhZGp1c3QgYSBQQyByZWxhdGl2ZSByZWxvYyBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZQotCXN5bWJvbC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogV2hlbiBnZW5lcmF0aW5nIGEub3V0IFBJQywKLQlmb3IgYSBQQyByZWxhdGl2ZSBmaXh1cCBhZ2FpbnN0IGFuIGV4dGVybmFsbHkgdmlzaWJsZSBkZWZpbmVkCi0Jc3ltYm9sLCBhcnJhbmdlIHRvIHN0b3JlIG9iamVjdCBmaWxlIGFuZCBhZGRlbmQgdmFsdWVzIGFzIHRob3VnaAotCXRoZSBzeW1ib2wgd2VyZSBub3QgZGVmaW5lZC4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBBcHIgMzAgMTM6MDk6MzkgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+Ci0KLQkqIHJlYWQuYyAoc2l6ZW9mX2xlYjEyOCk6IFJlZmVyZW5jZWQgZXh0ZXJuYWxseSBieSB3cml0ZS5jIHNvCi0JZG9uJ3QgaW5saW5lLgotCi1XZWQgQXByIDI5IDE1OjQ1OjU3IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTMyci5jICh7LGV4cGFuZF99ZGVidWdfc3ltKTogTmV3IGZ1bmN0aW9ucyB0byByZWNvcmQKLQlhbmQgZXhwYW5kIGEgJ2RlYnVnJyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uCi0JdGhhdCBkb2VzIG5vdCBjYXVzZSBhIHNob3J0IGluc3RydWN0aW9uIHRvIGJlIGZpbGxlZCB3aXRoIGEgTk9QLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgLmRlYnVnc3ltLgotCShhc3NlbWJsZV9wYXJhbGxlbF9pbnNuKTogQWRkIGNhbGxzIHRvIGV4cGFuZF9kZWJ1Z19zeW0gYXMKLQlhcHByb3ByaWF0ZS4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQotVHVlIEFwciAyOCAxOToxNjoyNiAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogZ2FzcC5jIChtYWluKTogTGlrZXdpc2UuCi0JKiBhc2ludGwuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1UdWUgQXByIDI4IDE4OjMzOjIzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3Nob3dfdXNhZ2UpOiBDb3JyZWN0IGdldHRleHQgdHlwby4KLQkKLVR1ZSBBcHIgMjggMTI6MTY6MzAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBDaGFuZ2UgYWxsIGNhbGxzIHRvIGJ6ZXJvIHRvIHVzZSBtZW1zZXQuCi0JKHBhX2lwKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkodGNfZ2VuX3JlbG9jLCBtZF9hcHBseV9maXgpOiBMaWtld2lzZS4KLQkocGFfZmluZF9zcGFjZV9ieV9udW1iZXIpOiBMaWtld2lzZS4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKHBhX2Jsb2NrKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3NvbV9jb3B5cmlnaHQpOiBEZWNsYXJlLgotCi1UdWUgQXByIDI4IDExOjM1OjU2IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2xpbmVubyk6IERvIG5vdCB1c2UgZHVtbXkgZmlyc3RfbGluZW5vCi0JZm9yIGxpbmUgbnVtYmVycyBmb3IgYXNzZW1ibHkgc291cmNlLgotCi1Nb24gQXByIDI3IDE1OjU4OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi45LjQKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEFwciAyNyAxMjowNzozMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IE5ldyBhcmcgcmVsYXhfcC4gIEFsbCBjYWxsZXJzIHVwZGF0ZWQuCi0KLU1vbiBBcHIgMjcgMTU6MTY6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oOiBDaGFuZ2Ugc3ltYm9sUyBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbiB0byBzdHJ1Y3QKLQlzeW1ib2wuCi0KLVN1biBBcHIgMjYgMTM6NDQ6MjIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggaTE4biB0eXBvLgotCi1TYXQgQXByIDI1IDIwOjEyOjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dldF9jdXJfcHJvY19zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5oOiBQcm90b3lwZSBpdC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIFtFTEZdIChzX2FscGhhX3Byb2xvZ3VlKTogTmV3IGZ1bmN0aW9uLgotCVtFVkFYXSAoc19hbHBoYV9wcm9sb2d1ZSk6IERlbGV0ZS4KLQkobWRfcHNldWRvX3RhYmxlKTogVXBkYXRlLgotCi1TYXQgQXByIDI1IDE0OjAwOjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfYXNzZW1ibGUpOiBDaGFuZ2UgYnBfZXJyb3JfbXNnIGZyb20gc3RhdGljCi0JYXJyYXkgdG8gbG9jYWwgcG9pbnRlci4KLQkoZ2V0X2FyZ3MsIHBhcnNlX2V4cHIpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLUZyaSBBcHIgMjQgMTI6NDc6NDIgMTk5OCAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBtYWNxZWwuYmU+Ci0KLQkqIHJlYWQuYyAoc19zZXQpOiBDYXN0IHhtYWxsb2MgcmV0dXJuIHZhbHVlIHRvIGZyYWdTICouCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRnVuY3Rpb24gbWFkZSBzdGF0aWMgdG8gbWF0Y2gKLQlwcmV2aW91cyBmb3J3YXJkIGRlY2xhcmF0aW9uLgotCShpbnNlcnRfcmVnLCBpbml0X3JlZ3RhYmxlLCBtZF9jb252ZXJ0X2ZyYWdfMSk6IExpa2V3aXNlLgotCi1GcmkgQXByIDI0IDA5OjI2OjQ2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEFkZCBpbnRlcm5hdGlvbmFsaXNhdGlvbiBtYWNyb3MgdG8gZXJyb3IKLQlzdHJpbmdzLiAgCi0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKGNhbl9tYWtlX3BhcmFsbGVsKTogQWRkIGludGVybmF0aW9uYWxpc2F0aW9uCi0JbWFjcm9zIHRvIGVycm9yIHN0cmluZ3MuCi0KLVRodSBBcHIgMjMgMTk6MjM6MjMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19maXhfYWRqdXN0YWJsZSk6IENvcnJlY3QgdGVzdCBvZiB3aGV0aGVyIGEKLQlyZWxvYyBpcyBpbiB0aGUgVE9DIGNzZWN0LgotCShtZF9hcHBseV9maXgzKTogQ29ycmVjdCBnZXR0ZXh0IHR5cG8uCi0KLVRodSBBcHIgMjMgMTQ6NTg6MzEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChmaW5kX3JlYWxfc3RhcnQpOiBJZ25vcmUgc3ltYm9scyBzdGFydGluZyB3aXRoCi0JLkwgLSB0aGV5IGFyZSBsb2NhbCBsYWJlbHMgYW5kIHRoZSBicmFuY2hlcyBhcmUgbm90IHJlYWxseQotCWZ1bmN0aW9uIGNhbGxzIGJ1dCByYXRoZXIgZmFyIGp1bXBzLgotCi1XZWQgQXByIDIyIDE1OjU3OjIxIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogcG8vTWFrZS1pbiAoTUtJTlNUQUxMRElSUyk6IERvbid0IGxvb2sgaW4gJCh0b3Bfc3JjZGlyKS4KLQotV2VkIEFwciAyMiAxNDo1MjozNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogUHJpbnQgb3BlcmFuZCBudW1iZXIgcmF0aGVyIHRoYW4KLQl1c2luZyBvcmRpbmFsX25hbWVzLgotCShpMzg2X29wZXJhbmQpOiBMaWtld2lzZS4KLQotVHVlIEFwciAyMSAyMjozNDoyNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoSU5UTExJQlMpOiBEZWZpbmUgdG8gd29yayBhcm91bmQgYXBwYXJlbnQgYXV0b21ha2UKLQlidWcuCi0JQWxsIE1ha2VmaWxlczogUmVnZW5lcmF0ZWQuCi0KLQkqIE1hbnkgZmlsZXM6IEFkZGVkIGdldHRleHQgaW52b2NhdGlvbnMgYXJvdW5kIHVzZXItdmlzaWJsZQotCXN0cmluZ3MuCi0JKiBhY2NvbmZpZy5oIChFTkFCTEVfTkxTLCBIQVZFX0NBVEdFVFMsIEhBVkVfR0VUVEVYVCwgSEFWRV9TVFBDUFksCi0JSEFWRV9MQ19NRVNTQUdFUyk6IERlZmluZS4KLQkqIGRlcC1pbi5zZWQ6IEFkZGVkIGFzaW50bC5oLgotCSogcG8vTWFrZS1pbjogTmV3IGZpbGUuCi0JKiBnYXNwLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIGFuZCB0ZXh0ZG9tYWluLgotCUluY2x1ZGUgImFzaW50bC5oIi4KLQkqIHJlYWQuYyAoWl8pOiBSZW5hbWVkIGZyb20gYF8nLgotCSogTWFrZWZpbGUuYW0gKFNVQkRJUlMpOiBBZGRlZCBwby4KLQkoUE9URklMRVMpOiBuZXcgbWFjcm8uCi0JKHBvL1BPVEZJTEVTLmluKTogTmV3IHRhcmdldC4KLQkoJChPQkpTKSk6IEFkZGVkIGFzaW50bC5oLgotCShIRklMRVMpOiBMaWtld2lzZS4KLQkoSU5DTFVERVMpOiBBZGRlZCAtRExPQ0FMRURJUiwgLUkkKHRvcF9zcmNkaXIpLy4uL2ludGwuCi0JKGFzX25ld19MREFERCk6IEFkZGVkICQoSU5UTExJQlMpLgotCShhc19uZXdfREVQRU5ERU5DSUVTKTogQWRkZWQgJChJTlRMREVQUykuCi0JKGdhc3BfbmV3X0xEQUREKTogQWRkZWQgJChJTlRMTElCUykuCi0JKGdhc3BfbmV3X0RFUEVOREVOQ0lFUyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsdC4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBDWV9HTlVfR0VUVEVYVC4gIEdlbmVyYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLgotCShBTExfTElOR1VBUyk6IERlZmluZS4KLQkqIG1hY3JvLmM6IEluY2x1ZGUgImFzaW50bC5oIi4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHNldGxvY2FsZSwgYmluZHRleHRkb21haW4sIGFuZCB0ZXh0ZG9tYWluLgotCSogYXMuaDogSW5jbHVkZSAiYXNpbnRsLmgiLgotCSogY29uZmlnL3RjLWkzODYuYyAob3JkaW5hbF9uYW1lcyk6IFJlbW92ZWQuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlZCBlcnJvciB0ZXh0IHRvIGF2b2lkIG9yZGluYWxfbmFtZXMuCi0JKGkzODZfb3BlcmFuZCk6IExpa2V3aXNlLgotCShyZWxvYyk6IEFkZGVkIGFzX2JhZCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoYmFkX2FyZ3MpOiBOb3cgYSAjZGVmaW5lLgotCShiYWRfcGMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU19zdGFiX3BhcnNlKTogQ2hhbmdlZCB0eXBlIG9mCi0JYGxvbmdfY29uc3RfbXNnJy4KLQkoZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBVbmlmaWVkIHN0cmluZ3MgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogY29uZmlnL3RjLW02OGsuYyAoZ2V0X3JlbG9jX2NvZGUpOiBBZGRlZCBzb21lIGFzX2JhZCBjYWxscyB0bwotCWF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAocmVsb2MpOiBBZGRlZCBhc19iYWQgdG8gYXZvaWQgaTE4biBwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IEFkZGVkIGFzX2JhZF93aGVyZSB0byBhdm9pZAotCWkxOG4gcHJvYmxlbXMuCi0JKiBjb25maWcvdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogQWRkZWQgYXNfYmFkIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ2hhbmdlZCBDKysgY29tbWVudCBpbnRvIEMKLQljb21tZW50LgotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IEFkZGVkIGFzX3dhcm4gdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogYXMuYyAocHJpbnRfdmVyc2lvbl9pZCk6IEFkZGVkIGFuIGZwcmludGYgdG8gYXZvaWQgaTE4bgotCXByb2JsZW1zLgotCSogY29uZC5jIChjb25kX2ZpbmlzaF9jaGVjayk6IEFkZGVkIGFzX2JhZCBjYWxsIHRvIGF2b2lkIGkxOG4KLQlwcm9ibGVtcy4KLQkqIGV4cHIuYyAoZXhwcik6IEFkZGVkIGFzX3dhcm4gY2FsbCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCSogbWVzc2FnZXMuYyAoYXNfYXNzZXJ0KTogQ2hhbmdlZCBjb2RlIHRvIGF2b2lkIGkxOG4gcHJvYmxlbXMuCi0JKGFzX2Fib3J0KTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBBZGRlZCBhc19iYWQgY2FsbCB0byBhdm9pZCBpMThuIHByb2JsZW1zLgotCShzX3NwYWNlKTogTGlrZXdpc2UuCi0JKiBwby9NYWtlLWluLCBwby9QT1RGSUxFUy5pbiwgcG8vZ2FzLnBvdDogTmV3IGZpbGVzLgotCi1UdWUgQXByIDIxIDE3OjAxOjIyIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoY2hlY2tfcHJlZml4KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgc3BsaXQgb3V0Ci0JZnJvbSBtZF9hc3NlbWJsZS4KLQkoc3RydWN0IF9pMzg2X2luc24pOiBBZGQgd2FpdF9wcmVmaXggZmllbGQuCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHdhaXRfcHJlZml4IGxvY2FsIHZhcmlhYmxlLiAgVXNlCi0JY2hlY2tfcHJlZml4IHdoZW4gYWRkaW5nIGEgcHJlZml4LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChjdXJyZW50X3RlbXBsYXRlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIGN1cnJlbnRfdGVtcGxhdGVzIGxvY2FsIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSwgaTM4Nl9vcGVyYW5kKTogSW1wcm92ZSBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBpbgotCW1hbnkgcGxhY2VzLiAgQWRkIFJFU1RPUkVfRU5EX1NUUklORyBpbiBtYW55IHBsYWNlcyBiZWZvcmUgZXJyb3IKLQlyZXR1cm4uICBDbGFyaWZ5IHNvbWUgY29tbWVudHMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHN0cnVjdCBfaTM4Nl9pbnNuKTogQ2hhbmdlIHNlZyBmaWVsZCB0byBhIHR3bwotCWVsZW1lbnQgYXJyYXkuCi0JKG1kX2Fzc2VtYmxlKTogUGFyc2Ugc3RyaW5nIGluc3RydWN0aW9uIG9wZXJhbmRzLCBsb29raW5nIGZvcgotCXNlZ21lbnQgb3ZlcnJpZGUgcHJlZml4ZXMuICBDaGVjayBmb3IgaW52YWxpZCBzZWdtZW50IHByZWZpeGVzIG9uCi0Jc3RyaW5nIGluc3RydWN0aW9uLgotCShpMzg2X29wZXJhbmQpOiBpLnNlZ1tdIGFuZCBtYXggbWVtX29wZXJhbmQgY2hhbmdlcyBmb3Igc3RyaW5nCi0JaW5zbnMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChFc1NlZyk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWkzODYuaCAocmVnS2x1ZGdlKTogRGVmaW5lLgotCShpY2xyS2x1ZGdlLCBpbXVsS2x1ZGdlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBNZXJnZSBpbXVsS2x1ZGdlIGFuZCBpY2xyS2x1ZGdlCi0JY29kZS4gIE1vdmUgUmV2ZXJzZVJlZ1JlZ21lbSBmdWRnZXMgaW50byBNb2RybSBjYXNlLiAgUmVvcmRlcgotCW9wY29kZV9tb2RpZmllciBjaGVja3MgdG8gbG9vayBmb3IgbW9yZSBjb21tb24gY2FzZXMgZmlyc3QuICBBZGQKLQlkZWZhdWx0X3NlZyBmb3IgSXNTdHJpbmcgY2FzZS4KLQotVHVlIEFwciAyMSAxNjoxODoxMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9QUk9HX0xFWCByYXRoZXIgdGhhbiBBQ19QUk9HX0xFWCBhbmQKLQlBQ19ERUNMX1lZVEVYVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBhbmQgbGlidG9vbC4KLQkqIGFjbG9jYWwubTQsIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotCSogZG9jL01ha2VmaWxlLmFtIChhcy5kdmkpOiBOZXcgdGFyZ2V0LgotCSogZG9jL01ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TYXQgQXByIDE4IDAxOjIxOjA0IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZGVkIHNwYXJjODZ4IHN1cHBvcnQuCi0JCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobG9va3VwX2FyY2gpOiBBZGRlZCBhcmNoX3R5cGUgdG8gc3RydWN0Ci0Jc3BhcmNfYXJjaC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogV2FybiBpZiAtRUwgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChTUEFSQ19CSUVORElBTikgQWx3YXlzIGRlZmluZS4KLQkKLVNhdCBBcHIgMTggMDE6MTk6MDEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE5vdGUgd2hlbiB3ZSB1c2UgZ2V0IG1hdGNoIG9uCi0gICAgICAgIHRoZSBmdWxsIGluc3RydWN0aW9uIG5hbWUuCi0KLVdlZCBBcHIgMTUgMTU6MTc6MjcgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSkgW09fc3ltYm9sXTogQWxzbyBzdG9yZSB0aGUgc3ltYm9sCi0JYmFjayBpbnRvIHRoZSBleHByZXNzaW9uIHRvIGhhbmRsZSBhZGQvc3ViIHNpbXBsaWZpY2F0aW9uIGNvcnJlY3RseS4KLQotV2VkIEFwciAxNSAwNzowNjowNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKGhpbG9faW50ZXJsb2Nrcyk6IFJlbW92ZSA0MzAwLgotCi1Nb24gQXByIDEzIDE2OjUxOjA0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fbXNyKTogU3VwcG9ydCB1bmRvY3VtZW50ZWQgJ21zciBjcHNyX2ZsZywKLQkjPG4+JyBpbnN0cnVjdGlvbi4KLQotVGh1IEFwciAgOSAxMDoyOTo0MiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKG1heF9pbmRlbnRfbGV2ZWwpOiBOZXcgZ2xvYmFsLgotCShwcmludF9zeW1ib2xfdmFsdWVfMSk6IFVzZSBpdC4KLQkqIGV4cHIuaCAoZXhwcl9idWlsZF9kb3QpOiBEZWNsYXJlLgotCSogZXhwci5jIChleHByX2J1aWxkX2RvdCk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIEFwciAgOCAxNjoxNjoxMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHByaW50X2JpbmFyeSk6IE5ldyBmdW5jdGlvbi4KLQkocHJpbnRfZXhwcl8xKTogQ2FsbCBpdC4KLQotTW9uIEFwciAgNiAxMjowNjozOSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCwgY2FzZSAiI0IiKTogSW5zdGFsbCB0aGUgb2Zmc2V0IG9mIHRoZQotCW9wZXJhbmQgaW4gdGhlIG9wY29kZS4KLQotRnJpIEFwciAgMyAxMTo1ODoxOSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2Lmg6IFJlb3JkZXIgb3BlcmFuZCBmbGFncyBhbmQgb3Bjb2RlIG1vZGlmaWVyCi0JZmxhZ3MgZm9yIGNsYXJpdHkuICBSZW1vdmUgdW51c2VkIGRlZmluaXRpb25zOiBVbmtub3duLAotCUltbVVua25vd24sIERpc3BVbmtub3duLCBOb01vZHJtLgotCSogY29uZmlnL3RjLWkzODYuYyAodHlwZV9uYW1lcyk6IEFkZCBtaXNzaW5nIERlYnVnIHR5cGUuCi0JKG1kX2Fzc2VtYmxlKTogQmV0dGVyIGR1cGxpY2F0ZSBwcmVmaXggY2hlY2tpbmcuICBRdWlja2VyIHN0cmluZwotCWluc3RydWN0aW9uIGNoZWNrIHZpYSBuZXcgb3Bjb2RlX21vZGlmaWVyIGZsYWcuCi0KLUZyaSBBcHIgIDMgMTE6NDQ6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoSW52b2tpbmcpOiBDbGFyaWZ5IC1XYSBleGFtcGxlLgotCi1GcmkgQXByICAzIDA5OjEyOjIzIDE5OTggIEdhdmluIEtvY2ggIDxnYXZpbkBjZXR1cy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX3BzZXVkb190YWJsZSk6IEFkZCB3ZWFrZXh0IGVudHJ5LiAKLQkoc19taXBzX3dlYWtleHQpOiBEZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IERvbid0IGRlZmluZSBpZiBkZWZpbmVkKFRDX01JUFMpLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogRG9uJ3QgYWRkIHdlYWtleHQgaWYgCi0JZGVmaW5lZChUQ19NSVBTKS4JCi0JCi1UaHUgQXByICAyIDIyOjQyOjAyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAodGNfZ2VuX3JlbG9jKTogVGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMKLQlpcyBhbiBlcnJvciBpZiB0aGUgdmFsdWUgY2FuIG5vdCBiZSBjb21wdXRlZCBhdCBhc3NlbWJseSB0aW1lLgotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAodGNfZ2VuLXJlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBBcHIgIDIgMTY6MzY6NDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwLmMgKG1haW4pOiBTZXQgbmV4dCBmaWVsZCBvZiBuZXcgaW5jbHVkZV9wYXRoIHN0cnVjdHVyZSB0bwotCU5VTEwuICBGcm9tIEF2ZXJ5IFBlbm5hcnVuIDxhdmVyeXBAZ2RjLmNhPi4KLQotCSogcmVhZC5jIChzX21yaV9zZWN0KTogQ2FsbCBhc19iYWQgcmF0aGVyIHRoYW4gYWJvcnQgZm9yIGFuCi0JdW5zdXBwb3J0ZWQgTVJJIHRhcmdldC4KLQotV2VkIEFwciAgMSAxMTowODoyNyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKGFybV92YWxpZGF0ZV9maXgpOiBOZXcgZnVuY3Rpb24uICBEZXRlcm1pbmUgaWYKLQl0aGUgZGVzdGluYXRpb24gb2YgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGFsdGVyZWQuCi0JKGZpbmRfcmVhbF9zdGFydCk6IE5ldyBmdW5jdGlvbjogIExvY2F0ZSB0aGUgcmVhbCwgVGh1bWIgY29kZWQKLQlzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLgotCShkb190X2JyYW5jaDIzKTogQWx0ZXIgdGhlIGRlc3RpbmF0aW9uIG9mIGJyYW5jaGVzIHRvIFRodW1iCi0JZnVuY3Rpb25zLiAKLQotCSogY29uZmlnL3RjLWFybS5oOiBEZWZpbmUgVENfVkFMSURBVEVfRklYLgotCi1UdWUgTWFyIDMxIDEzOjI3OjMzIDE5OTggIERlYW4gTS4gRGVhdmVyICA8ZGVhdmVyQGFtdC50YXkxLmRlYy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZGVjb2RlX3NoaWZ0KTogSGFuZGxlIGFkZHJlc3NpbmcgbW9kZSAyIHcvcnJ4Ci0JYWxzby4KLQotV2VkIEFwciAgMSAxMzoxMzoyMCAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jL2FzLnRleGluZm86IFVzZSBAaXRlbXggZm9yIGEgc2Vjb25kYXJ5IGl0ZW0gaW4gYSB0YWJsZS4KLQkqIGRvYy9jLWhwcGEudGV4aTogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMzEgMTc6NTI6NDAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogTWFrZWZpbGUuYW0gKERFUF9JTkNMVURFUyk6IE5ldyB2YXJpYWJsZS4KLQkoLmRlcDEpOiBDaGFuZ2UgdG8gd29yayB3aGVuIHNyY2RpciBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aC4KLQkoLnRjZGVwLCAub2JqZGVwLCAuZGVwMiwgZGVwLnNlZCk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBNYXIgMzAgMTI6NDY6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5oLCBjb25maWcvdGMtaTM4Ni5jOiBSZXZlcnQgTWFyY2ggMjQKLQlMaW5lYXJBZGRyZXNzIHBhdGNoLgotCi0JKiBjb25maWd1cmUuaW46IFNldCB2ZXJzaW9uIHRvIDIuOS4xLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLU1vbiBNYXIgMzAgMTE6MjI6MDggMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChGV2FpdCk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRW1pdCBmd2FpdCBwcmVmaXggYmVmb3JlIGFueQotCW90aGVyIHByZWZpeGVzLiAgQ2hlY2sgRldhaXQgZmxhZyBpbiBvcGNvZGUgdGFibGUgdG8gc2VlIHdoaWNoCi0JaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgYW4gZndhaXQgcHJlZml4LgotCi1Nb24gTWFyIDMwIDEwOjEyOjAwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogQWx3YXlzIGNyZWF0ZSBhIHN0YWIgc3RyaW5nCi0Jc2VjdGlvbi4KLQotU2F0IE1hciAyOCAyMjoyODowMiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBMaWtld2lzZS4KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwgb3BlcmFuZCk6IExpa2V3aXNlLgotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IExpa2V3aXNlLgotCSogZ2FzcC5jIChsZXZlbF8wLCBjaGFuZ2VfYmFzZSwgZG9pbnN0cik6IExpa2V3aXNlLgotCSogaGFzaC5jIChoYXNoX2Fzayk6IExpa2V3aXNlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX3BhZ2UsIGNhbGNfaGV4LCBwcmludF9saW5lcyk6IExpa2V3aXNlLgotCShkZWJ1Z2dpbmdfcHNldWRvKTogTGlrZXdpc2UuCi0JKiBtYWNyby5jIChkZWZpbmVfbWFjcm8sIGNoZWNrX21hY3JvKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSwgc19hbGlnbiwgc19mbG9hdF9zcGFjZSk6IExpa2V3aXNlLgotCShpZ25vcmVfcmVzdF9vZl9saW5lLCBmbG9hdF9jb25zKTogTGlrZXdpc2UuCi0JKiBzeW1ib2xzLmMgKGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lKTogTGlrZXdpc2UuCi0JKiB3cml0ZS5jIChyZWNvcmRfYWxpZ25tZW50LCBjdnNfZnJhZ190b19maWxsKTogTGlrZXdpc2UuCi0JKGZpeHVwX3NlZ21lbnQsIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4pOiBMaWtld2lzZS4KLQkobnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbik6IExpa2V3aXNlLgotCSogY29uZmlnL2F0b2YtaWVlZS5jIChnZW5fdG9fd29yZHMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9iZWdpbiwgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQkoc3BhcmNfaXAsIHBhcnNlX2tleXdvcmRfYXJnLCBzX2NvbW1vbik6IExpa2V3aXNlLgotCSogcmVhZC5jIChvdXRwdXRfYmlnX3NsZWIxMjgpOiBJbml0aWFsaXplIGxvY2FscyB0byBhdm9pZAotCXdhcm5pbmdzLgotCShvdXRwdXRfYmlnX3VsZWIxMjgsIGVxdWFscyk6IExpa2V3aXNlLgotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IENoYW5nZSBudW1iZXJfb2ZfZGlnaXRzXyogbG9jYWxzCi0JdG8gdW5zaWduZWQgaW50LiAgQ2hhbmdlIHplcm9zIHRvIHVuc2lnbmVkIGludC4KLQkqIGNvbmQuYyAoc19pZik6IEFkZCByZXR1cm4gdG8gZGVmYXVsdCBjYXNlLgotCSogZnJhZ3MuYyAoZnJhZ19ub3dfZml4KTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGFkZHJlc3NULgotCSogZnJhZ3MuaCAoZnJhZ19ub3dfZml4KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGlzdGluZy5jIChmaWxlX2luZm9fc3RydWN0KTogQ2hhbmdlIGxpbmVudW0gdG8gdW5zaWduZWQgaW50LgotCShzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCk6IENoYW5nZSBobGxfbGluZSB0byB1bnNpZ25lZCBpbnQuCi0JKHByaW50X3NvdXJjZSk6IFVwZGF0ZSBmb3JtYXQgc3RyaW5nLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBDaGFuZ2Ugc2NhbiB0byB1bnNpZ25lZCBpbnQsIGFuZCBkb24ndAotCWJvdGhlciB0byBpbml0aWFsaXplIGl0LgotCSogc3ltYm9scy5jIChkb2xsYXJfbGFiZWxfY291bnQpOiBDaGFuZ2UgdG8gdW5zaWduZWQgbG9uZy4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVtb3ZlIHVudXNlZCBsYWJlbCByZWR1Y2VfZml4dXAuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfbWVtb3J5X21vZGVsKTogT25seSBkZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBBZGQgcmV0dXJuIHRvIGRlZmF1bHQgY2FzZS4KLQotRnJpIE1hciAyNyAxMjo0Njo0NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDaGVjayBsZWdhbCBhZGRyZXNzaW5nIG1vZGVzIGZvcgotIAltY2Y1MjAwIGp1c3QgYXMgd2UgZG8gZm9yIG02ODAwMC4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBMaWtld2lzZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBMaWtld2lzZS4KLQotRnJpIE1hciAyNyAxMDozMDowMSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiAgU3RvcmUgcmVsb2NhdGlvbiBhZGRlbmQgaW4KLQlmaXh1cCBpbnN0ZWFkIG9mIGluc3RydWN0aW9uLgotCi1UaHUgTWFyIDI2IDIzOjA3OjE4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBTd2FwIHRlbXBsYXRlIGFyZ3VtZW50cyB0bwotCUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggbWFjcm8gaW4gcmV2ZXJzZSBkaXJlY3Rpb24gdGVzdC4KLQlUaGlzIG1hY3JvIGlzIGN1cnJlbnRseSBzeW1tZXRyaWMsIHNvIHBhc3NpbmcgdGhlbSB0aGUgd3JvbmcKLQl3YXkgZGlkbid0IGNhdXNlIGFueSBwcm9ibGVtLCBidXQgbWF5IGlmIHRoZSBtYWNybyBpcyBjaGFuZ2VkCi0JaW4gdGhlIGZ1dHVyZS4KLQlBZnRlciBjb3B5aW5nIHRlbXBsYXRlIHRvIGkudG0sIHVzZSBpLnRtLiByYXRoZXIgdGhhbiB0LT4gdG8KLQlhY2Nlc3MgZmllbGRzLCBhbmQgbWFrZSB0IGEgY29uc3QqCi0JTW92ZSBpLnRtLm9wZXJhbmRfdHlwZXNbXSBzd2FwIHRvIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjb3B5LgotCi1XZWQgTWFyIDI1IDEzOjQ0OjE4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGV4cHIuaCAoZXhwcl9idWlsZF91Y29uc3RhbnQpOiBBZGQgcHJvdG90eXBlLgotCShleHByX2J1aWxkX3VuYXJ5LGV4cHJfYnVpbGRfYmluYXJ5KTogQWRkIHByb3RvdHlwZXMuCi0JKiBleHByLmMgKGV4cHJfYnVpbGRfdWNvbnN0YW50KTogTmV3IGZ1bmN0aW9uLgotCShleHByX2J1aWxkX3VuYXJ5LGV4cHJfYnVpbGRfYmluYXJ5KTogTmV3IGZ1bmN0aW9ucy4KLQotV2VkIE1hciAyNSAxMzoxMDo0MiAxOTk4ICBCcnVubyBIYWlibGUgIDxicnVub0BsaW51aXgubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotCi0gICAgICAgICogZ2FzcC5jIChJUyopOiBDYXN0IGFyZ3VtZW50IHRvIHVuc2lnbmVkIGNoYXIsIG5vdCB1bnNpZ25lZCBpbnQuCi0gICAgICAgICogbWFjcm8uYyAobWFjcm9fZXhwYW5kX2JvZHkpOiBJbmNyZWFzZSBidWZmZXIgc2l6ZS4KLSAgICAgICAgKiBtZXNzYWdlcy5jIChhc193YXJuKTogTGlrZXdpc2UuCi0JKGFzX3dhcm5fd2hlcmUsIGFzX2JhZCwgYXNfYmFkX3doZXJlKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMjUgMTI6NTk6MDcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKERJU1RTVFVGRik6IE5ldyB2YXJpYWJsZS4KLQkoZGlzdHN0dWZmKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgTWFyIDI0IDE2OjUxOjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX2NsZWFudXAsIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKTogQ2FsbAotCW0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2suCi0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgZnVuY3Rpb24gdG8KLQllbWl0IGEgbm9wIGlmIGEgc2VjdGlvbiBlbmRzIHdpdGggYSAxNiBiaXQgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBNYXIgMjQgMTk6NDg6MDkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfYnNzKTogQ29tcGlsZSB1bmNvbmRpdGlvbmFsbHkuICBDYWxsCi0Jc19sY29tbSByYXRoZXIgdGhhbiBvYmpfY29mZl9sY29tbS4KLQkob2JqX3BzZXVkb190YWJsZSk6IENvbXBpbGUgLmJzcyBwc2V1ZG8tb3AgdW5jb25kaXRpb25hbGx5LgotCi1UdWUgTWFyIDI0IDE4OjMwOjU4IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoTGluZWFyQWRkcmVzcyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogSWYgTGluZWFyQWRkcmVzcyBpcyBzZXQgZm9yIHRoZQotCWluc3RydWN0aW9uLCBkb24ndCB1c2UgYSBkZWZhdWx0IHNlZ21lbnQuCi0KLU1vbiBNYXIgMjMgMTg6NTM6NDAgMTk5OCAgSm9lbCBTaGVycmlsbCAgPGpvZWxAT0FSY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogKHNoKi0qLXJ0ZW1zKik6IFN3aXRjaGVkIGZyb20gRUxGIHRvIENPRkYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjAgMTk6MTU6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBsaWJ0b29sIDEuMi4KLQotVGh1IE1hciAxOSAxNjowMzoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBmaXggY29kZSB0byB0ZXN0IHRoZSByYW5nZSBvZgotCVBDIHJlbGF0aXZlIGJyYW5jaGVzLiAgUGF0Y2ggY291cnRlc3kgb2YgSm9uYXRoYW4gV2FsdG9uLiAKLQotCQotV2VkIE1hciAxOCAwOToyOTo1MSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi0xOTk4LTAzLTE3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaXRibC1sZXgubCAoeXl3cmFwKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZCBhcyBhCi0JbWFjcm8uCi0KLUZyaSBNYXIgMTMgMTY6MzE6MzggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBkZXBlbmQuYyAocXVvdGVfc3RyaW5nX2Zvcl9tYWtlKTogTmV3IGZ1bmN0aW9uLgotCSh3cmFwX291dHB1dCk6IFVzZSBpdC4KLQotVGh1IE1hciAxMiAxODoyODoyMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgYnNzIGZsYWcgaW4gc2VnX2luZm8KLQlzdHJ1Y3R1cmUgaWYgdHlwZSBpcyBTSFRfTk9CSVRTLiAgW0J1ZyBmaXggY291cnRlc3kgb2YgcnRoXQotCi1TYXQgRmViIDI4IDE3OjI4OjU1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zaG9ydG9wdHMsIG1kX2xvbmdvcHRzLCBtZF9wYXJzZV9vcHRpb24pOgotCVJlY29nbml6ZSAtR04gYW5kIC1yZWxheC4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIGdwIHNpemUgZnJvbSAtRyBzd2l0Y2guCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBBbHdheXMgZm9yY2UgaWYgLXJlbGF4LgotCShhbHBoYV9hbGlnbik6IFRha2UgYSBuZXcgYXJndW1lbnQgdGhhdCB3aWxsIHNwZWNpZnkgd2hlbiB0byAKLQllbWl0IGFuIFJfQUxQSEFfQUxJR04gcmVsb2NhdGlvbiAodGhvdWdoIHdlIGRvbid0IGRvIHRoYXQgbm93KS4KLQlDaGFuZ2UgYWxsIGNhbGxlcnMuICBFbWl0IG5vcCBhbGlnbm1lbnQgcGFkZGluZyBhcyBub3ArdW5vcCBwYWlyLgotCi1TYXQgRmViIDI4IDE3OjA2OjIyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgW1RDX0FMUEhBXTogSW5jbHVkZSA8ZWxmL2FscGhhLmg+LgotCSogY29uZmlnL3RjLWFscGhhLmggKEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TKTogTmV3LgotCi1UaHUgRmViIDI2IDE1OjQ5OjA0IDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jICh3cml0ZV8yX3Nob3J0KTogRGVsYXllZCBqc3IgaW5zdHJ1Y3Rpb25zIGRvbid0Ci0JcmVxdWlyZSBwYWRkaW5nIHRvIHRoZSBuZXh0IGxvbmcgd29yZCBib3VuZGFyeS4KLQotTW9uIEZlYiAyMyAxMToyOTowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiAjaW5jbHVkZSBzeW1jYXQuaC4KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IExpa2V3aXNlLgotCi1Nb24gRmViIDIzIDEwOjI3OjQwIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCwgY2FzZSAnUCcpOiBNYWtlICdQJyBhcmd1bWVudHMgYmUKLQlhYnNvbHV0ZSBleHByZXNzaW9ucyBpbnN0ZWFkIG9mICckJyBwcmVmaXhlZCByZWdpc3RlciBuYW1lcy4KLQotU2F0IEZlYiAyMSAyMjozNjo1MiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfc2V0KTogUmVjb3JkIGZpbGUgYW5kIGxpbmUgaW5mbyBmb3Igc3ltYm9scyB3aGVuIC1hcy4KLQkocHNldWRvX3NldCk6IERvbid0IG92ZXJ3cml0ZSB0aGF0IGR1bW15IGZyYWdtZW50LgotCi1GcmkgRmViIDIwIDE1OjAzOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNlY3Rpb24iLgotCShwcGNfbmFtZWRfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLVRodSBGZWIgMTkgMjI6MjU6NDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtcHBjLmMgKHBwY19iaWVpKTogQ2FjaGUgdGhlIGxhc3Qgc3ltYm9sIHdlIGluc2VydGVkCi0Jc28gd2UgZG9uJ3QgaGF2ZSB0byBzY2FuIHRoZSBlbnRpcmUgbGlzdC4KLQotVHVlIEZlYiAxNyAxNzowMjoxNSAxOTk4ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBGb3IgdGhlIGV4cGxpY2l0bHkgcGFyYWxsZWwKLSAJY2FzZSwgYWxsb3cgdGhlIHBhcmFsbGVsIGluc3RydWN0aW9ucyB0byBtb2RpZnkgdGhlIHNhbWUgZmxhZwotIAliaXRzLgotCi1UaHUgRmViIDE5IDE2OjA4OjE1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBDYXRlZ29yaXplIHN5bWJvbHMgYnkKLQl1bmRlZmluZWRfc2VjdGlvbiByYXRoZXIgdGhhbiBzeV9mcmFnLT5saW5lID09IE5VTEwuCi0KLVdlZCBGZWIgMTggMjM6Mzk6NDYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGluc3RhbGwtZXhlYy1sb2NhbCk6IEluc3RhbGwgcHJvcGVybHkgd2hlbiBsbgotCWZhaWxzIG9yIHRvb2xkaXIgPT0gcHJlZml4LgotCi1UdWUgRmViIDE3IDE4OjU4OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fbWRfYXBwbHlfZml4Myk6IERlbGV0ZSBjYWxsIHRvIHZhbGlkYXRlX29wZXJhbmQuCi0JVGVzdCByZXN1bHQgb2YgaW5zZXJ0X29wZXJhbmQgZm9yIGVycm9yLgotCi1GcmkgRmViIDEzIDE2OjQxOjQyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBBZGQgY3lnbnVzLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0JKiBkb2MvTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBGZWIgMTMgMDA6NDc6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IEhhbmRsZSBvcGVyYW5kIHR5cGUgJ0MnLgotCShtYWNybyk6IEZpeCBoYW5kbGluZyBvZiBNX0NPUFswLTNdLgotCi1UaHUgRmViIDEyIDE0OjA2OjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBSb3NzIEhhcnZleSA8cm9zc0B0ZXJhZmxvcC5jb20+OgotCSogbWFjcm8uYyAoSVNTRVApOiBPbmx5IHRyZWF0ICc8JyBhbmQgJz4nIGFzIHNlcGFyYXRvciBjaGFyYWN0ZXJzCi0JaWYgbWFjcm9fYWx0ZXJuYXRlIG9yIG1hY3JvX21yaS4KLQkoZ2V0c3RyaW5nKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGJ5dGUgY29uc3RhbnRzIGJldHdlZW4gPCBhbmQgPi4KLQkoZ2V0X2FueV9zdHJpbmcpOiAnPCcgb25seSBzdGFydHMgYSBzdHJpbmcgaWYgbWFjcm9fYWx0ZXJuYXRlIG9yCi0JbWFjcm9fbXJpLgotCShtYWNyb19leHBhbmRfYm9keSk6IFBlcm1pdCBrZXl3b3JkIHBhcmFtZXRlcnMgZm9sbG93aW5nCi0JcG9zaXRpb25hbCBwYXJhbWV0ZXJzLgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKGFscGhhKi0qLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RlLW5ic2QuaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhcy5oIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogTW92ZSBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApOiAuLi50bwotCWhlcmUsIGFuZCBtYWtlIHN0YXRpYy4KLQotCSogZWhvcHQuYyAoZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQpOiBPbmx5IHVzZSBzZWdfaW5mbyBpZgotCUJGRF9BU1NFTUJMRVIgb3IgTUFOWV9TRUdNRU5UUy4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBMaWtld2lzZS4KLQkqIGRvYy9hcy50ZXhpbmZvIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTEgMjM6MjY6MjggMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogRG9uJ3QgdXNlIG1pcHMgSUlJIG9yIG1pcHMgSVYKLQlpbnNucyByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIGEgcG9pbnRlciBpZiB3ZSdyZSBpbiBtaXBzIEkgb3IKLQlNSVBTIElJIG1vZGUuCi0gICAgICAgIChtYWNybywgbWFjcm8yLCBzX2NwcmVzdG9yZSwgc19jcGFkZCk6IExpa2V3aXNlLgotCi1UaHUgRmViIDEyIDAzOjQxOjAwIDE5OTggIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLUZpeCByYWMgdG8gYWNjZXB0IG9ubHkgYTA6Ci0JKiB0Yy1kMTB2LmMgKHBhcmFsbGVsX29rLCBmaW5kX29wY29kZSk6Ci0JU3BsaXQgT1BFUkFORF9BQ0MgaW50byBPUEVSQU5EX0FDQzAgYW5kIE9QRVJBTkRfQUNDMS4KLQlJbnRyb2R1Y2UgT1BFUkFORF9HUFIuCi0KLVdlZCBGZWIgMTEgMTY6Mjg6MTMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2ZpbGwpOiBIYW5kbGUgbm9uLWNvbnN0YW50IHJlcGVhdCBjb3VudHMgYnkgY3JlYXRpbmcKLQlhbiByc19zcGFjZSBmcmFnbWVudC4KLQotVHVlIEZlYiAxMCAxODozMTozMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfb3BlcmFuZCk6IENoYW5nZSBlcnJvciBhZGRlZCBKYW4gMiAxOTk4Ci0JZnJvbSBhc19iYWQgdG8gYXNfd2Fybi4KLQotVHVlIEZlYiAxMCAxODowNDowMCAxOTk4ICBKaW0gTGVta2UgIDxqbGVta2VAY3lnbnVzLmNvbT4KLQotCSogYXMuYzogKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IFVzZSBbVEVYVHxEQVRBfEJTU11fU0VDVElPTl9OQU1FCi0JKiBhcy5oOiBEZWZpbmUgZGVmYXVsdCB2YWx1ZXMgb2YgW1RFWFR8REFUQXxCU1NdX1NFQ1RJT05fTkFNRQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2JlZ2luKTogVXNlIFtURVhUfERBVEF8QlNTXV9TRUNUSU9OX05BTUUKLQotVHVlIEZlYiAxMCAxNzo1ODoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVob3B0LmMgKGVoX2ZyYW1lX2NvZGVfYWxpZ25tZW50KTogSWYgbm90IEJGRF9BU1NFTUJMRVIsIHVzZQotCXNlZ19maXhfcm90UCByYXRoZXIgdGhhbiBmaXhfcm9vdCBmcm9tIHNlZ19pbmZvLgotCi1UdWUgRmViIDEwIDE1OjMyOjIyIDE5OTggIElhbiBDYXJtaWNoYWVsICA8aWFuY2FybUBjeWdudXMuY29tPgotCi0JKiBleHByLmM6IEFkZCBzdXBwb3J0IGZvciAweDFfMl8zXzQgYmlnbnVtcy4KLQotVHVlIEZlYiAxMCAxNDo0Mzo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbik6IFRyZWF0IFxyIGFzIHdoaXRlc3BhY2UuCi0KLU1vbiBGZWIgIDkgMTQ6MTY6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1TYXQgRmViICA3IDE1OjMzOjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBGZWIgIDYgMTY6MDg6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiBtaXBzX2NwdSBpcyBzZXQsIHRoZW4gdXNlIGl0IGFzCi0gICAgICAgIHRoZSBhcmd1bWVudCB0byBiZmRfc2V0X2FyY2hfbWFjaC4KLSAgICAgICAgKGxvYWRfYWRkcmVzcyk6IFVzZSBiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIHRvIGRldGVybWluZSB0aGUKLSAgICAgICAgYml0IHNpemUgb2YgYW4gYWRkcmVzcyBpbnN0ZWFkIG9mIGxvb2tpbmcgYXQgdGhlIGlzYSBsZXZlbC4KLSAgICAgICAgKG1hY3JvLCBtYWNybzIsIHNfY3ByZXN0b3JlLCBzX2NwYWRkKTogTGlrZXdpc2UuCi0KLUZyaSBGZWIgIDYgMTQ6NDQ6MzQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIC1tdjg1MGFueSBjb21tYW5kIGxpbmUgb3B0aW9uLgotCi1UaHUgRmViICA1IDEyOjM5OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWhvcHQuYzogTmV3IGZpbGUuCi0JKiBhcy5oIChlbnVtIF9yZWxheF9zdGF0ZSk6IEFkZCByc19jZmEuCi0JKGNoZWNrX2VoX2ZyYW1lLCBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IERlY2xhcmUuCi0JKGVoX2ZyYW1lX3JlbGF4X2ZyYWcsIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IENhbGwgY2hlY2tfZWhfZnJhbWUuCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogSGFuZGxlIHJzX2NmYS4KLQkocmVsYXhfc2VnbWVudCk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoR0FTX0NGSUxFUyk6IEFkZCBlaG9wdC5jLgotCShHRU5FUklDX09CSlMpOiBBZGQgZWhvcHQuby4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aSAoRnJhZ3MpOiBEb2N1bWVudCByc19jZmEuCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIC0tdHJhZGl0aW9uYWwtZm9ybWF0LgotCShwYXJzZV9hcmdzKTogQWNjZXB0IC0tdHJhZGl0aW9uYWwtZm9ybWF0LgotCSogYXMuaCAoZmxhZ190cmFkaXRpb25hbF9mb3JtYXQpOiBEZWNsYXJlLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogSWYgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQsCi0Jc2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQgb24gc3Rkb3V0cHV0LgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtLXRyYWRpdGlvbmFsLWZvcm1hdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBoYXZlIGEKLQlmaXh1cCBmb3IgYW4gdW5tYXRjaGVkICVoaSByZWxvYywgaXQgZG9lcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEKLQl2YXJpYW50IGZyYWcuCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBuZXcgbGlidG9vbC4KLQkqIGRvYy9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDQgMTU6NDE6NTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW0zMnIuYyAoY2hlY2tfZm9yX3NpZGVfZWZmZWN0cyk6IE5ldyBmdW5jdGlvbi4KLQkoY2FuX21ha2VfcGFyYWxsZWwpOiBBZGQgY2hlY2tzIGZvciBpbnN0cnVjdGlvbiBzaWRlIGVmZmVjdHMKLQljbGFzaGluZyB3aXRoIHRoZSBvdGhlciBpbnN0cnVjdGlvbi4KLQkoYXNzZW1ibGVfcGFyYWxsZWxfaW5zbik6IEltcHJvdmUgd2FybmluZyBtZXNzYWdlcy4gIFJldHVybiBlcnJvcgotCW1lc3NhZ2UgZnJvbSBub24tc3dhcHBlZCBpbnN0cnVjdGlvbiBvcmRlci4KLQotV2VkIEZlYiAgNCAyMDowMDoyNiAxOTk4ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEB0ZWtuZW1hLmRlbW9uLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IFJlbmFtZSBhcm1fYWZ0ZXJfcGFzc19ob29rKCkgdG8gYXJtX2NsZWFudXAoKS4KLQotCSogY29uZmlnL3RjLWFybS5oOiBSZXBsYWNlIG1kX2FmdGVyX3Bhc3NfaG9vayBkZWZpbml0aW9uIHdpdGggYQotIAltZF9jbGVhbnVwIGRlZmluaXRpb24uICBUaGlzIG1vdmVzIHRoZSBmb3JjZWQgbGl0ZXJhbCBvdXRwdXQgdG8KLSAJdGhlIGVuZCBvZiB0aGUgc291cmNlIHBhc3MsIGFuZCBhdm9pZHMgbWFjcm8ncyBpbnNlcnRpbmcgbGl0ZXJhbHMKLSAJaW50byB0aGUgY29kZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgbWFjcm8gZXhwYW5zaW9uLgotCi1XZWQgRmViICA0IDEzOjE3OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKSBbT0JKX0VMRl06IEEgcmVsb2MgYWdhaW5zdAotCWEgZ2FzIGludGVybmFsIHN5bWJvbCBpcyBhZGp1c3RhYmxlLgotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IExpa2V3aXNlLgotCi0JKiBhcy5oOiBJZiBnY2MgdmVyc2lvbiBncmVhdGVyIHRoYW4gMi42LCB1c2UgYF9fZm9ybWF0X18nIGFuZAotCWBfX3ByaW50Zl9fJyBpbiBmdW5jdGlvbiBhdHRyaWJ1dGVzLCByYXRoZXIgdGhhbiBgZm9ybWF0JyBhbmQKLQlgcHJpbnRmJy4KLQotTW9uIEZlYiAgMiAxODozODoxOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBPbmx5IGluY2x1ZGUgZWxmL3NwYXJjLmggaWYgT0JKX0VMRi4KLQotTW9uIEZlYiAgMiAxODozMDozNCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JQWRkIHRtczMyMGMzMCBzdXBwb3J0OgotCSogY29uZmlnL3RjLXRpYzMwLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLXRpYzMwLmM6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmLmg6IElmIFRDX1RJQzMwLCBpbmNsdWRlIGNvZmYvdGljMzAuaCBhbmQgZGVmaW5lCi0JVEFSR0VUX0ZPUk1BVCBhcyAiY29mZi10aWMzMCIuCi0JKiBjb25maWd1cmUuaW4gKHRpYzMwLSotKmFvdXQqLCB0aWMzMC0qLSpjb2ZmKik6IE5ldyB0YXJnZXRzLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDUFVfVFlQRVMpOiBBZGQgdGljMzAuCi0JKENQVV9PQkpfVkFMSUQpOiB0aWMzMC1hb3V0IGlzIHZhbGlkLgotCShUQVJHRVRfQ1BVX0NGSUxFUyk6IEFkZCBjb25maWcvdGMtdGljMzAuYy4KLQkoVEFSR0VUX0NQVV9IRklMRVMpOiBBZGQgY29uZmlnL3RjLXRpYzMwLmguCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDEwOjIwOjM3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSW1wcm92ZW1lbnRzIHRvIGVycm9yIG1lc3NhZ2VzLgotCi1Nb24gRmViICAyIDEyOjM5OjA1IDE5OTggIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4Myk6IENoYW5nZSBCRkRfUkVMT0NfSEkxNiBhbmQKLSAJQkZEX1JFTE9DX0hJMTZfUyB0byBzdG9yZSB0aGUgaGlnaCBiaXRzIG9mIGFueSB2YWx1ZS4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IFVuZG8gY2hhbmdlIG9mIEZyaSBKdW4gMjcuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERvbid0IGxldCB0aGUKLQlhc3NlbWJsZXIgY2FsY3VsYXRlIHJlbG9jYXRpb25zIHRvIGFueSBleHRlcm5hbCBzeW1ib2wgYXQgYWxsLgotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKSBbT0JKX0VMRl06IENvcnJlY3QgYnVncwotCWludm9sdmluZyBnZW5lcmF0aW9uIG9mIHBjLXJlbGF0aXZlIHJlbG9jcy4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKSBbT0JKX0VMRl06IFRoZSBqb2IgdGhpcyBjb2RlIHVzZWQgdG8gZG8KLQloYXMgYmVlbiBtb3ZlZCB0byBtZF9hcHBseV9maXgzLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBGaXggdGVzdCBmb3IgdG9vLWZhciBicmFuY2guCi0JKHBwY19lbGZfc3VmZml4KTogV2FybiBhYm91dCAnaWRlbnRpZmllcitjb25zdGFudEBnb3QnIHN5bnRheCwKLQl3aGljaCBhY3R1YWxseSBtZWFucyAodGhlIGFkZHJlc3Mgb2YgaWRlbnRpZmllcidzIEdPVCBlbnRyeSkgKwotCWNvbnN0YW50LCB3aGljaCBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bC4KLQotRnJpIEphbiAzMCAxMTowMjozNSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZWFkLmggKGluY2x1ZGVfZGlycyk6IERlY2xhcmUuCi0JKGluY2x1ZGVfZGlyX2NvdW50LGluY2x1ZGVfZGlyX21heGxlbik6IERlY2xhcmUuCi0KLUZyaSBKYW4gMzAgMTE6NDc6MDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENvcnJlY3QgY2hlY2sgZm9yIHNoYXJlZCBvcGNvZGVzIGxpYnJhcnkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGxpc3RpbmcuYyAoYnVmZmVyX2xpbmUpOiBJZiB3ZSBjYW4ndCBvcGVuIHRoZSBmaWxlLCBzZXQgYXRfZW5kLgotCShsaXN0aW5nX3ByaW50KTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBmaS4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAocmVnbGlzdHBhaXIpOiBIYW5kbGUgcmVnaXN0ZXIgbGlzdCBpbgotCWVpdGhlciBvcmRlci4KLQotCSogY29uZmlnL3Ztcy1jb25mLmg6IERvbid0IHVuZGVmIFZFUlNJT04uCi0KLVRodSBKYW4gMjkgMTQ6NDI6NDQgMTk5OCAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmFtIChDT05GSUdfT0JKUyk6IE5ldyB2YXJpYWJsZSwgY29udGFpbmluZyBwYXJ0IG9mIG9sZAotCU9CSlMgdmFyaWFibGUuCi0JKEdFTkVSSUNfT0JKUyk6IE5ldyB2YXJpYWJsZSwgd2l0aCB0aGUgcmVzdCBvZiB0aGUgb2xkIE9CSlMKLQl2YXJpYWJsZS4KLQkoT0JKUyk6IE5vdyBqdXN0ICQoQ09ORklHX09CSlMpIGFuZCAkKEdFTkVSSUNfT0JKUykuCi0JKCQoc3JjZGlyKS9tYWtlLWdhcy5jb20pOiBSZW5hbWUgZnJvbSBtYWtlLWdhcy5jb20uCi0JKHN0YW1wLW1rLmNvbSk6IFJlcGxhY2UgJChPQkpTKSB3aXRoICQoR0VORVJJQ19PQkpTKS4KLQkoRVhUUkFfRElTVCk6IERlZmluZS4KLQkqIHZtc2NvbmYuc2g6IEhhbmRsZSB7dGFyZy1jcHUsIG9iai1mb3JtYXQsIGF0b2YtdGFyZ30gbW9kdWxlcwotCWV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gdmlhIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcy4KLQkoZ2NjLWFzLm9wdCk6IE5ldyBmaWxlIGNyZWF0ZWQgd2hlbiBtYWtlLWdhcy5jb20gaXMgcnVuLgotCSogY29uZmlnLWdhcy5jb206IENyZWF0ZSB7dGFyZy1jcHUuaCwgb2JqLWZvcm1hdC5oLCB0YXJnLWVudi5oLAotCWl0YmwtY3B1Lmh9IHRvICNpbmNsdWRlIGFwcHJvcHJpYXRlIGZpbGUgcmF0aGVyIHRoYW4gY29weWluZyB0aGF0Ci0JZmlsZS4KLQkqIGNvbmZpZy92bXMtY29uZi5oOiBTeW5jaHJvbml6ZSB3aXRoIGN1cnJlbnQgY29uZmlnLmluLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVRodSBKYW4gMjkgMTg6NDg6MTkgMTk5OCAgQmlsbCBNb3llciAgPGJpbGxtQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogQWRkZWQgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsLgotCShwYXJhbGxlbF9vayk6IFJlbGF4ZWQgcGFyYWxsZWwgc3ViaW5zdHJ1Y3Rpb24gZGVwZW5kZW5jeSBjaGVjay4KLQotV2VkIEphbiAyOCAxNDozNTowMCAxOTk4ICBCaWxsIE1veWVyIDxiaWxsbUBjeWdudXMuY29tPgotCi0JKiBhcy5oIChmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKTogYWRkZWQgbmV3IGZsYWcuCi0JKiB0Yy1kMTB2LmMgKG1kX3BhcnNlX29wdGlvbixtZF9sb25nb3B0cyk6IGFkZGVkICItLW5vd2FybnN3YXAiIAotCWNvbW1hbmQgbGluZSBhcmd1bWVudC4KLQkqIHRjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IGVtaXQgIlN3YXBwaW5nIGluc3RydWN0aW9ucyIKLQl3YXJuaW5nIG9ubHkgaWYgZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCBpcyBmYWxzZS4KLQotV2VkIEphbiAyOCAxNjo0MToxOSAxOTk4ICBKLkouIHZhbiBkZXIgSGVpamRlbiAgPEouSi52YW5kZXJIZWlqZGVuQHN0dWRlbnQudXR3ZW50ZS5ubD4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbWluZ3czMiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgSmFuIDI4IDE0OjUxOjE4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IHNldCB0aGUgc2VnbWVudCBpZiBpdAotCWhhc24ndCBjaGFuZ2VkLCBhbmQgdGhpcyBpcyBPQkpfQU9VVCB3aXRob3V0IEJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChTX0lTX0xPQ0FMKTogQ29ycmVjdCB0eXBvLS1wYXNzIGFyZ3VtZW50IHRvCi0JU19HRVRfU0VHTUVOVC4KLQotV2VkIEphbiAyOCAxMzo1NDo1MCAxOTk4ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCWFzLmggKHVubGluayk6IFJldmVyc2UgMTMtRmViLTk3IGNoYW5nZTsgdXNlIG9mIHVubGluayB2cyByZW1vdmUKLQlkZXBlbmRzIHVwb24gSEFWRV97VU5MSU5LLFJFTU9WRX0gdmFsdWVzIHJhdGhlciB0aGFuIGhvc3QKLQljb21waWxlci4KLQotV2VkIEphbiAyOCAxMzo0ODowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04pOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjggMDk6NTI6MDAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IERpc3BsYXkgaW5zdHJ1Y3Rpb24gd2hlbgotCWFuIGVycm9yIGlzIGVuY291bnRlcmVkLgotCi1UdWUgSmFuIDI3IDEzOjMyOjAxIDE5OTggIFJvYmVydCBMaXBlICA8cm9iZXJ0bEBkZ2lpLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotc2NvMy4ydjUqKTogRGVmYXVsdHMgdG8gRUxGIG5vdy4KLQkoaTM4Ni0qLXNjbzMuMnY1KmNvZmYpOiBOZXcgdGFyZ2V0LgotCShpMzg2LSotc2NvMy4yKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBKYW4gMjcgMTE6MDY6NTIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogVGlkeSBlcnJvciBtZXNzYWdlIHByb2R1Y3Rpb24uCi0KLVR1ZSBKYW4gMjcgMTI6MjQ6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgbmV3IHZhcmlhYmxlIG5ld2ltbSB0byBob2xkCi0JdmFsaWRhdGVfaW1tZWRpYXRlIHJldHVybiB2YWx1ZSBpbiB0aGUgcmlnaHQgdHlwZSBmb3IgY29tcGFyaXNvbnMKLQl0byBGQUlMLgotCi1UdWUgSmFuIDI3IDA2OjUxOjU5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAoTUFYX0JZVEVTKTogVXNlIGxpc3RpbmcgdmFyaWFibGVzIG5vdCBjb25zdGFudHMuCi0JKGRhdGFfYnVmZmVyKTogTm8gbG9uZ2VyIGFuIGFycmF5LCBidXQgYSBwb2ludGVyLgotCShjYWxjX2hleCk6IHNpemVvZihkYXRhX2J1ZmZlcikgLT4gTUFYX0JZVEVTLgotCShsaXN0aW5nX2xpc3RpbmcpOiBBbGxvY2F0ZSBkYXRhX2J1ZmZlci4KLQotVHVlIEphbiAyNyAwNjozODozNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIC0tbGlzdGluZy1saHMtd2lkdGgsIC0tbGlzdGluZy1saHMtd2lkdGgyLAotCS0tbGlzdGluZy1yaHMtd2lkdGgsIC0tbGlzdGluZy1jb250LWxpbmVzLgotCShzaG93X3VzYWdlKTogVXBkYXRlLgotCSogbGlzdGluZy5jIChsaXN0aW5nX2xoc193aWR0aCwgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kKTogTmV3IHZhcnMuCi0JKGxpc3RpbmdfbGhzX2NvbnRfbGluZXMsIGxpc3RpbmdfcmhzX3dpZHRoKTogTmV3IHZhcnMuCi0JKHByaW50X2xpbmVzKTogVXNlIHRoZSB2YXJpYWJsZXMgaW5zdGVhZCBvZiB0aGUgY29uc3RhbnRzLgotCShsaXN0aW5nX2xpc3RpbmcpOiBMaWtld2lzZS4JCi0JKiBsaXN0aW5nLmg6IERlY2xhcmUgdGhlIG5ldyB2YXJzLgotCQotVHVlIEphbiAyNyAwNTozMjowNSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWRkIC0ta2VlcC1sb2NhbHMgYWxpYXMgZm9yIC1MLgotCUFkZCAtLXN0cmlwLWxvY2FsLWFic29sdXRlLgotCShzaG93X3VzYWdlKTogVXBkYXRlLgotCSogYXMuaCAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSk6IE5ldyBmbGFnLgotCSogc3ltYm9scy5jIChTX0lTX0xPQ0FMKTogVXNlIGl0LgotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0xPQ0FMKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCi1Nb24gSmFuIDI2IDEzOjA3OjQxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmM6IERldGVjdCBpZiBleHBsaWNpdGx5IHBhcmFsbGVsIGluc3RydWN0aW9ucwotCW1pZ2h0IGhhdmUgYW4gaW8gY29uZmxpY3QgYW5kIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlLiAKLQotVGh1IEphbiAyMiAxNzo1MTo0NCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fc2F2ZV9maXh1cHMsIGNnZW5fcmVzdG9yZV9maXh1cHMsCi0JY2dlbl9zd2FwX2ZpeHVwcyk6IEZ1bmN0aW9ucyB0byBzYXZlLCByZXN0b3JlIGFuZCBzd2FwIHRoZSBmaXh1cAotCWNoYWluIHdpdGggYSBiYWNrdXAgY29weS4KLQkoY2dlbl9hc21fZmluaXNoX2luc24pOiBSZXR1cm5zIGFkZHJlc3Mgb2YgY29uc3RydWN0ZWQgaW5zbi4KLQotV2VkIEphbiAyMSAxNjo0OToxMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mb19zdHJ1Y3QpOiBSZW1vdmUgRklMRSwgYWRkIFBPUy4KLQkobGFzdF9vcGVuX2ZpbGVfaW5mbywgbGFzdF9vcGVuX2ZpbGUpOiBOZXc7IGEgb25lIGVudHJ5IEZJTEUqIGNhY2hlLgotCShmaWxlX2luZm8pOiBEb24ndCBvcGVuIHRoZSBmaWxlLgotCShidWZmZXJfbGluZSk6IENoZWNrIGZvciB0aGUgZmlsZSBpbiB0aGUgbGFzdF9vcGVuIGNhY2hlLCB1cGRhdGluZwotCWFzIG5lY2Vzc2FyeS4KLQkocHJpbnRfc291cmNlKTogRG9uJ3QgcmVmZXJlbmNlIGZpbGVfaW5mby0+ZmlsZS4KLQkobGlzdGluZ19saXN0aW5nKTogTGlrZXdpc2UuCi0JKGxpc3RpbmdfcHJpbnQpOiBDbG9zZSB0aGUgZmlsZSBpbiB0aGUgY2FjaGUsIGlmIGFueS4KLQotRnJpIEphbiAxNiAxNDo1MTo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZHdhcmZfZmlsZV9zdHJpbmcpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGVtaXRfZXhwcik6IExvb2sgZm9yIGNvbnN0YW50IHNlcXVlbmNlIHRoYXQgbGVhZHMgdXAgdG8gYSBmaWxlCi0JbmFtZSBpbiBEV0FSRiBkZWJ1Z2dpbmcgb3V0cHV0LgotCShzdHJpbmdlcik6IFVzZSBkd2FyZl9maWxlX3N0cmluZyB0byBkZWNpZGUgd2hldGhlciB0byBhY2NlcHQgYQotCXN0cmluZyBhcyBhIGZpbGUgbmFtZS4KLQotRnJpIEphbiAxNiAxMTozMDozNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiB0Yy1tNjhrLmMgKG02OGtfaXApOiBSZW1vdmUgYWJzbC0+cmVnbHN0IE1SSSBoYWNrLgotCShjcmFja19vcGVyYW5kKTogQWRkIHJlZy0+cmVnbHN0IE1SSSBoYWNrLgotCShyX3NlZyk6IFB1dCByZWdsc3Qgc3ltYm9scyBpbiByZWdfc2VjdGlvbi4KLQkobTY4a19mcm9iX3N5bWJvbCk6IEZyb2IgcmVnbHN0IHN5bWJvbHMgaW50byBhYnNvbHV0ZV9zZWN0aW9uLgotCi1UaHUgSmFuIDE1IDE0OjE5OjAxIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLXNoLmMgKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBTR1IgJiBEQlIuCi0KLVRodSBKYW4gMTUgMTM6NDY6NDggMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogdGMtaDgzMDAuYyAocGFyc2VfcmVnKTogVGFrZSB0aGUgbGVuZ3RoIG9mIHRoZSBzeW1ib2wgaW50bwotCWFjY291bnQgd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIGEgcmVnaXN0ZXIgbmFtZS4KLQkqIHRjLWg4NTAwLmMgKHBhcnNlX3JlZyk6IExpa2V3aXNlLgotCi1XZWQgSmFuIDE0IDE3OjUyOjMzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uYzogRm9ybWF0dGluZyBjaGFuZ2VzIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCi0KLVdlZCBKYW4gMTQgMTU6NDE6NDEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFJld29yayBkaXZpc2lvbiBjb2RlIHRvIGF2b2lkIHVuZmlsbGVkCi0JZGVsYXkgc2xvdC4KLQotV2VkIEphbiAxNCAxODowNDoyMCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBKaW0gV2lsc29uCi0JKiBjb25maWcvdGMtZDMwdi5jIChkb19hc3NlbWJsZSk6IFJlbW92ZSBub24tYW5zaSBkZWZhdWx0IGNhc2UuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBjcm9zcyBzZWN0aW9uIFBDIHJlbGF0aXZlIHJlbG9jcwotCWNvcnJlY3RseS4KLQotV2VkIEphbiAxNCAxNTowMjoxOSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IHRlc3QgcGluZm8gZmxhZ3MgaWYgSU5TTl9NQUNSTy4KLQotTW9uIEphbiAxMiAxMzowNDo1NyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5jOiAjaW5jbHVkZSBzZXRqbXAuaC4gIENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKGV4cHJfam1wX2J1Zik6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IEFsbG93IHVzZSBvZiBsb25nam1wIGluIHBhcnNpbmcgdG8gaGFuZGxlIGVycm9ycy4KLQkoY2dlbl9tZF9vcGVyYW5kKTogTmV3IGZ1bmN0aW9uLgotCSogdGMtbTMyci5jOiBDbGVhbiB1cCBwYXNzIG92ZXIgYHN0cnVjdCBmb28nIHVzYWdlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFVzZSBDR0VOX0lOU05fTU5FTU9OSUMuCi0KLVR1ZSBKYW4gIDYgMTU6MzY6MDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX1NFVF9TRUdNRU5UKTogRG9uJ3Qgc2V0IHRoZSBzZWdtZW50IGZvciBzZWN0aW9uIHN5bXMuCi0JKFNfSVNfRVhURVJOQUwsIFNfSVNfTE9DQUwpOiBDb3JyZWN0IHBhcmVudGhldGljYXRpb24uCi0KLUZyaSBKYW4gIDIgMTY6MDg6NTQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBHaXZlIGFuIGVycm9yIGlmIHRoZXJlIGFyZQotCXVucmVjb2duaXplZCBjaGFyYWN0ZXJzIGFmdGVyIGFuIGV4cHJlc3Npb24uCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTY5NwpkaWZmIC0tZ2l0IGEvZ2FzL0NoYW5nZUxvZy05Mjk1IGIvZ2FzL0NoYW5nZUxvZy05Mjk1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWE0OGU2Li4wMDAwMDAwCi0tLSBhL2dhcy9DaGFuZ2VMb2ctOTI5NQorKysgL2Rldi9udWxsCkBAIC0xLDEzMTEwICswLDAgQEAKLVNhdCBEZWMgMzAgMjM6NDI6NTEgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogU2ltcGxpZnkuICBDb3JyZWN0bHkgaGFuZGxlIHN5bSArIG9mZnNldAotCWFkZHJlc3NlcyBmb3Igc3RhdGljIHZhcmlhYmxlcy4KLQotVGh1IERlYyAyMSAxMjo1NDozMiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWFwcGluZyk6IE1ha2UgQGdvdCBnaXZlIGEgcmVhbCBHT1QgcmVsb2NhdGlvbiwKLQlhbmQgeGdvdCBnaXZlIHRoZSBvbGQgdG9jMTYgcmVsb2NhdGlvbi4KLQkobWRfYXBwbHlfZml4Myk6IFN1cHBvcnQgYWxsIEdPVCByZWxvY2F0aW9ucy4KLQotV2VkIERlYyAyMCAxNDo1NzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfYWRkcmVzcyk6IENvcnJlY3RseSBoYW5kbGUgYSBjb25zdGFudCBpbgotCVNWUjRfUElDIGNhc2UuICBGcm9tIFJpY2hhcmQgS2VubmVyIDxrZW5uZXJAdmxzaTEudWx0cmEubnl1LmVkdT4uCi0KLUZyaSBEZWMgMTUgMTQ6MjU6MDcgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogUmVjb2duaXplIFNIMyByZWdpc3RlcnMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBBX1NTUiwgQV9TUEMgYW5kIEFfUkVHX0IuCi0JKGJ1aWxkX01ieXRlcyk6IEhhbmRsZSBSRUdfQi4KLQotRnJpIERlYyAxNSAxNjowNzoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2F1eCk6IFVzZSBuZXcgYmZkX2JpZ19lbmRpYW4gbWFjcm8uCi0KLUZyaSBEZWMgMTUgMTI6MTE6NDggMTk5NSAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBJZiBsaW5raW5nLCBlZGl0IEFMTF9DRkxBR1MgdG8gQ0ZMQUdTLgotCi1UaHUgRGVjIDE0IDE1OjA5OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IHRoZSBzX2FsaWduIGZpZWxkIHRvCi0JdGhlIG51bWJlciBvZiBieXRlcywgcmF0aGVyIHRoYW4gdG8gdGhlIHBvd2VyIG9mIDIuCi0KLVR1ZSBEZWMgMTIgMTI6MTk6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVENMRUFOX0hFUkUpOiBOZXcgdmFyaWFibGUuCi0JKGRpc3RjbGVhbik6IFVzZSBpdC4KLQkobWFpbnRhaW5lci1jbGVhbik6IERlcGVuZCB1cG9uIGNsZWFuLWhlcmUgcmF0aGVyIHRoYW4gY2xlYW4sCi0JZGlzdGNsZWFuLCBhbmQgY2xlYW4taW5mby4gIFJ1biBtYWtlIG1haW50YWluZXItY2xlYW4gaW4gZG9jLgotCVJlbW92ZSBmaWxlcyBsaXN0ZWQgaW4gRElTVENMRUFOX0hFUkUuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogU3BsaXQgb3V0IGZyb20KLQlkaXN0Y2xlYW4uICBEZXBlbmQgdXBvbiBjbGVhbi1pbmZvIGFuZCBkaXN0Y2xlYW4uCi0KLU1vbiBEZWMgMTEgMTY6MjM6NTEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtYWMtYXMucjogRml4IGNvcHlyaWdodCBhbmQgdmVyc2lvbiBzdHJpbmdzLgotCShjZnJnKTogVXNlIFBST0dfTkFNRSBpbnN0ZWFkIG9mIGxpdGVyYWwgbmFtZS4KLQotTW9uIERlYyAxMSAxNDoxNDowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgdGNfdW5yZWNvZ25pemVkX2xpbmUgaXMgZGVmaW5lZCwKLQljYWxsIGl0LgotCSogY29uZmlnL3RjLWEyOWsuaCAodGNfdW5yZWNvZ25pemVkX2xpbmUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtYTI5ay5jIChhMjlrX3VucmVjb2duaXplZF9saW5lKTogTmV3IGZ1bmN0aW9uLgotCShtZF9vcGVyYW5kKTogSGFuZGxlIGEyOWsgc3R5bGUgbG9jYWwgZG9sbGFyIGxhYmVscy4KLQotV2VkIERlYyAgNiAxNzo1Mjo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaDogSWYgT0JKX01BWUJFX0VMRiwgZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFLgotCi1UdWUgRGVjICA1IDEzOjI2OjM0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfZmlsbCk6IElmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IGlzIGRlZmluZWQsIGNhbGwKLQlpdC4KLQotTW9uIERlYyAgNCAxNToxMDo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbiwgZmlsbF9zZWN0aW9uLCBmaXh1cF9tZGVwcyk6Ci0JVHJlYXQgcnNfYWxpZ25fY29kZSBsaWtlIHJzX2FsaWduLgotCi1TdW4gRGVjICAzIDE2OjQ2OjU0IDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogY29uZmlnL3RjLWFybS5jIChjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBTZXQgcHJlX2luYyB3aGVuCi0JY29udmVydGluZyBhbiBhYnNvbHV0ZSBhZGRyZXNzIGludG8gYSBQQy1yZWxhdGl2ZSBvbmUuCi0KLUZyaSBEZWMgIDEgMTE6NTc6NTYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBEb24ndCBhbHdheXMgdXNlIHRlLWdlbmVyaWMuaCBmb3IgZW11bGF0aW9uLgotCShwb3dlcnBjLWFwcGxlLW1hY29zKTogVXNlIGVtdWxhdGlvbiB0ZS1tYWNvcy5oLgotCSogbXB3LW1ha2Uuc2VkIChpbnN0YWxsLCBpbnN0YWxsLW9ubHkpOiBFZGl0IGluIE1hYy1zcGVjaWZpYwotCWluc3RhbGwgcHJvY2VkdXJlLgotCi1GcmkgRGVjICAxIDEwOjU5OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJbXByb3ZlIG1lc3NhZ2UgYWJvdXQgdW5zdXBwb3J0ZWQgRUxGIHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG04OGtfZG9fYWxpZ24pOiBDb3JyZWN0IGNoZWNrIGZvciB3aGV0aGVyIGZpbGwKLQlwYXR0ZXJuIGlzIHplcm8uICBGcm9tIE1hbmZyZWQgSG9sbHN0ZWluLgotCi1UaHUgTm92IDMwIDEzOjI1OjQ5IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19wZV9zZWN0aW9uKTogVG8gZ2V0IHRoZSBhbGlnbm1lbnQgcmlnaHQgZm9yCi0JdGhlIHZhcmlvdXMgaWRhdGEgc2VjdGlvbnMsIHdlIGNoZWNrIHRoZSBuYW1lIG9uIHRoZSAuc2VjdGlvbiBwc2V1ZG8uCi0KLVRodSBOb3YgMzAgMTE6MjM6NDIgMTk5NSAgTWFuZnJlZCBIb2xsc3RlaW4gS1MvRUY0QSA2MC8xRi8xMTAgIzQwMjgzICA8bWFuZnJlZEBsdHMuc2VsLmFsY2F0ZWwuZGU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogSWYgVENfTTg4SyBpcyBkZWZpbmVkLCBkbyBub3QKLQlhZGQgc2VjdGlvbidzIHBhZGRyIHRvIGFkZF9udW1iZXI7IGNvbXBhdGliaWxpdHkgdG8gbmF0aXZlIGFzIGFuZAotCWxkIGZvcmJpZHMuCi0KLVdlZCBOb3YgMjkgMjM6MTQ6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVHJlYXQgbTY4ay1zeXN2NCBsaWtlIG02OGstZWxmLCBub3QgbTY4ay1zeXN2My4KLQotCSogaGFzaC5jIChzdHJ1Y3QgaGFzaF9lbnRyeSk6IE1vdmVkIGhlcmUuLi4KLQkqIGhhc2guaCAoc3RydWN0IGhhc2hfZW50cnkpOiAuLi5mcm9tIGhlcmUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IERvbid0IGZyZWUgYW5kIGNsZWFyIHN5X29iagotCWlmIGl0J3MgYWxyZWFkeSBrbm93biB0byBiZSBudWxsLgotCi1XZWQgTm92IDI5IDEzOjAwOjIwIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogRG9uJ3QgYWRqdXN0IHRoZSB2YWx1ZSBmb3IgMzIKLQliaXQgcmVsb2NzIGNvbnZlcnRlZCB0byBQQyByZWxhdGl2ZSByZWxvY3MuICBUaGlzIHR1cm5lZCBvdXQgdG8KLQlhZGQgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgLnRleHQgdHdpY2UuCi0KLVR1ZSBOb3YgMjggMTA6NDI6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogSW4gJ3MnIGNhc2UsIGZyZWUgc3RyaW5nIGZyb20KLQlvYnN0YWNrLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBSZW1vdmUgdW51c2VkIGZpZWxkCi0Jc3lfbmFtZV9vZmZzZXQuCi0JKiBjb25maWcvb2JqLW11bHRpLmggKEVMRl9UQVJHRVRfU1lNQk9MX0ZJRUxEUykgW09CSl9NQVlCRV9FTEZdOgotCURpdHRvLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogTWFrZSBiaXRmaWVsZHMgdW5zaWduZWQuCi0KLQkqIGV4cHIuaCAoc3RydWN0IGV4cHJlc3Npb25TKTogTWFrZSBYX29wIGFuZCBYX3Vuc2lnbmVkIGJpdGZpZWxkcywKLQlhbmQgbW92ZSB0aGVtIHRvZ2V0aGVyLiAgT24gbW9zdCBzeXN0ZW1zIHRoaXMgd2lsbCByZWR1Y2UgdGhlCi0Jc3RydWN0dXJlIHNpemUgYnkgb25lIHdvcmQuCi0JKG9wZXJhdG9yVCk6IERlZmluZSBPX21heC4KLQkqIGV4cHIuYyAoZXhwcl9iZWdpbik6IFZlcmlmeSB0aGF0IFhfb3AgaXMgd2lkZSBlbm91Z2ggdG8gaG9sZAotCU9fbWF4LgotCi0JKiByZWFkLmMgKHBvcF9pbnNlcnQpOiBQcmludCBlcnJvciByZXR1cm5lZCBieSBoYXNoIHRhYmxlCi0JaW5zZXJ0aW9uIGNvZGUuCi0KLQkqIGFzLmMgKGR1bXBfc3RhdGlzdGljcyk6IFNwbGl0IG91dCBmcm9tIG1haW47IGR1bXAgc29tZSBoYXNoCi0JdGFibGUgc3RhdHMgYW5kIHRhcmdldC1zcGVjaWZpYyBzdGF0cy4KLQkoc3RhcnRfdGltZSk6IE5vIGxvbmdlciBhdXRvbWF0aWMgdG8gbWFpbi4KLQkobWFpbik6IFNldCBmaWxlLWxldmVsIHN0YXJ0X3RpbWUgYW5kIGNhbGwgZHVtcF9zdGF0aXN0aWNzIGF0Ci0JZXhpdC4gIEV4aXQgYnkgY2FsbGluZyB4ZXhpdC4KLQkoc2hvd191c2FnZSk6IE1ha2UgLS1zdGF0aXN0aWNzIGRlc2NyaXB0aW9uIGxlc3Mgc3BlY2lmaWMuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBmdW5jdGlvbi4KLQkqIHdyaXRlLmMgKHdyaXRlX3ByaW50X3N0YXRpc3RpY3MpOiBOZXcgZnVuY3Rpb24uCi0JKG5fZml4dXBzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZml4X25ld19pbnRlcm5hbCk6IEluY3JlbWVudCBpdC4KLQkqIHJlYWQuYyAocmVhZF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogcmVhZC5oIChyZWFkX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogc3ltYm9sLmMgKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogc3ltYm9sLmggKHN5bWJvbF9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIGhhc2guYyAoaGFzaF9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogaGFzaC5oIChoYXNoX3ByaW50X3N0YXRpc3RpY3MpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWkzODYuaCAoaTM4Nl9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkodGNfcHJpbnRfc3RhdGlzdGljcyk6IE5ldyBtYWNyby4KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsLCBhc19hc3NlcnQsIGFzX2Fib3J0KTogVXNlIHhleGl0LCBub3QKLQlleGl0LgotCi0JKiBoYXNoLmMgKERFTEVURUQpOiBSZXdyaXRlIHRvIHVzZSBhIHZhbGlkIGJ1dCB1bmlxdWUgYWRkcmVzcy4KLQkoU1RBUlRfUE9XRVIpOiBSZWR1Y2UgdG8gMTAuCi0JKGVudW0gc3RhdF9lbnVtKTogTmV3IGVudW1lcmF0b3IsIHJlcGxhY2luZyBTVEFUXyogaW5kZXggbWFjcm9zLgotCUFkZCBuZXcgdmFsdWVzIGZvciBjb3VudGluZyBzdHJjbXAgY2FsbHMuCi0JKEdST1dfRkFDVE9SKTogTmV3IG1hY3JvLgotCShoYXNoX2dyb3cpOiBVc2UgR1JPV19GQUNUT1IuICBSZXdyaXRlIGZvciBxdWljayByZXR1cm5zIGluc3RlYWQKLQlvZiBuZXN0aW5nIGJsb2Nrcy4KLQkoRlVMTF9WQUxVRSk6IE5ldyBtYWNyby4gIFVzZSAxLzQgb2YgdGFibGUgc2l6ZSBpbnN0ZWFkIG9mIDEvMi4KLQkoaGFzaF9uZXcpOiBVc2UgRlVMTF9WQUxVRS4KLQkoc3RydWN0IGhhc2hfY29udHJvbCk6IERlZmluaXRpb24gbW92ZWQgaGVyZS4KLQkoaGFzaF9jb2RlKTogRG9uJ3QgbWFzayB0byBsb3cgYml0cy4KLQkoaGFzaF9hc2spOiBNYXNrIHJldHVybmVkIGhhc2ggY29kZSBoZXJlLiAgQ2hlY2sgaGFzaCB2YWx1ZSBiZWZvcmUKLQljYWxsaW5nIHN0cmNtcDsgY291bnQgc3RyY21wIGNhbGxzLgotCSogaGFzaC5oIChzdHJ1Y3QgaGFzaF9jb250cm9sKTogRGVjbGFyZSwgZG9uJ3QgZGVmaW5lLCBoZXJlLgotCShIQVNIX1NUQVRMRU5HVEgpOiBEZWxldGVkLgotCShzdHJ1Y3QgaGFzaF9lbnRyeSk6IEFkZCBmaWVsZCBmb3IgaGFzaCBjb2RlLgotCShoYXNoX3NheSwgaGFzaF9hcHBseSk6IERvbid0IGRlY2xhcmUuCi0KLQkqIGhhc2guYyAoZGVzdHJveSk6IFJldHVybiB2b2lkLgotCShhcHBsaWNhdGVlKTogRGl0dG8uCi0JKG1haW4pOiBGaXggZGVjbGFyYXRpb25zLgotCShoYXNoX2FwcGx5KTogUmV0dXJuIHZvaWQuICBBcmd1bWVudCBgZnVuY3Rpb24nIHJldHVybnMgdm9pZC4gIFB1dAotCWluc2lkZSAiI2lmZGVmIFRFU1QiLgotCShoYXNoX3NheSk6IERlZmluZSBvbmx5IGlmIFRFU1QgaXMgZGVmaW5lZC4KLQkqIGhhc2guaCAoaGFzaF9hcHBseSwgaGFzaF9zYXkpOiBEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQotTW9uIE5vdiAyNyAxMzoxODoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNy4KLQotVHVlIE5vdiAyMSAxODozOTowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBSZW1vdmUgbG9jYWwgZGVmaW5pdGlvbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotTW9uIE5vdiAyMCAxNzoyNjowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2RlYnVnX25hbWVfc2VjdGlvbl9zaXplKTogUmVtb3ZlLgotCShwcGNfc3RhYngpOiBEb24ndCBpbmNyZW1lbnQgcHBjX2RlYnVnX25hbWVfc2VjdGlvbl9zaXplLgotCShwcGNfYmMpOiBMaWtld2lzZS4KLQkocHBjX2Zyb2JfZmlsZSk6IFJlbW92ZS4KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZnJvYl9maWxlKTogRG9uJ3QgZGVmaW5lLgotCShwcGNfZnJvYl9maWxlKTogRG9uJ3QgZGVjbGFyZS4KLQotTW9uIE5vdiAyMCAxMzozNzowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRBUkdfQ1BVX0RFUF9hbHBoYSk6IE1lbnRpb24gYWxwaGEtb3Bjb2RlLmguCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IEluY2x1ZGUgb25lLW9wZXJhbmQgdmFyaWFudHMgb2Ygam1wIGFuZAotCWpzci4KLQotCSogY29uZmlnL3RlLWRlbHQ4OC5oOiBSZW5hbWVkIGZyb20gdGUtZGVsdGE4OC5oLCB0byBhdm9pZCBjb25mbGljdAotCXdpdGggdGUtZGVsdGEuaCBpbiA4LjMgZmlsZSBzeXN0ZW1zLgotCSogY29uZmlndXJlLmluOiBBZGp1c3RlZC4KLQotVGh1IE5vdiAxNiAxMjo0OTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZXJyKTogUmVtb3ZlOyBqdXN0IHVzZSB0aGUgb25lIGluIHJlYWQuYy4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAoeXlsZXgpOiBJbiBNUkkgbW9kZSwgJ0AnIGNhbiBzdGFydCBhbiBvY3RhbAotCW51bWJlci4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEhhbmRsZSBNUkkgc3VmZml4ZXMgYWZ0ZXIgdW5hZG9ybmVkIDAuCi0KLVRodSBOb3YgMTYgMDA6MjE6NDQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlWZXJzaW9uIDIuNiByZWxlYXNlZC4KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogVXBkYXRlZCB0byAyLjYuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENoYW5nZSB1c2Ugb2YgbWRfZG9fYWxpZ24KLQl0byBwYXNzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIGZpbGwgdmFsdWUsIHRvIG1hdGNoIG90aGVyIHVzZXMuCi0KLVdlZCBOb3YgMTUgMDM6NTI6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19GSVhfVFlQRSk6IEFkZCBtaXNzaW5nIHNlbWljb2xvbi4KLQotCSogYXMuYyAobWFpbik6IE1vdmUgbWRfZW5kIGNhbGwgdG8ganVzdCBhZnRlciBjYWxsIHRvCi0JcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzLiAgRGVsZXRlIGNwdS1zcGVjaWZpYyBjb2RlIGhlcmUuCi0JKiBjb25maWcvdGMtaTk2MC5oIChtZF9lbmQpOiBOZXcgbWFjcm8sIGNhbGxzIGJydGFiX2VtaXQuCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2VuZCk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2VuZCk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBOZXcgZnVuY3Rpb24sIG1vdmVkIGhlcmUKLQlmcm9tIEhBTkRMRV9BTElHTiBtYWNyby4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKEhBTkRMRV9BTElHTik6IENhbGwgaXQuCi0KLQlNb24gSnVsIDMxIDE0OjUzOjE5IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiBjYXN0IGZpbGwgYW5kIDB4OTAgdG8gY2hhcgotIAliZWZvcmUgY29tcGFyaW5nCi0KLQlNb24gTWF5ICAxIDEwOjkxOjQ5IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24pOiAgTWFrZSAiLmFsaWduIG4sMHg5MCIgZ2VuZXJhdGUKLQltdWx0aS1ieXRlIG5vcHMgdG8gYXZvaWQgY2hhbmdpbmcgZ2NjLiAgVGhlIG5lY2Vzc2FyeSBnY2MgY2hhbmdlCi0JbWlnaHQgYnJlYWsgb2xkIGFzc2VtYmxlcnMuCi0KLQlTYXQgQXByIDIyIDIwOjUzOjA1IDE5OTUgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAobWRfZG9fYWxpZ24sIEhBTkRMRV9BTElHTik6ICBBZGQgbWFjcm9zIHRvCi0JZ2VuZXJhdGUgb3B0aW1hbCBtdWx0aS1ieXRlIG5vcCBpbnN0cnVjdGlvbnMgZm9yICIuYWxpZ24gbiIKLQkiLmFsaWduIG4sMHg5MCIsIGFuZCBhbGlnbnMgcmVxdWlyaW5nIG1vcmUgdGhhbiAxNSBieXRlcyBvZgotCXBhZGRpbmcgc3RpbGwgZ2VuZXJhdGUgbXVsdGlwbGUgMHg5MCdzIGFzIGJlZm9yZS4KLQotTW9uIE5vdiAxMyAxNzo0MDoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfbXJpX3VudGlsKTogQ2FsbCBwb3BfbXJpX2NvbnRyb2wuCi0KLU1vbiBOb3YgMTMgMjA6Mzk6MDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHBwYy0qLW1hY29zKiwgcHBjLSotbXB3Kik6IE5ldyBjb25maWd1cmF0aW9ucy4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCSogbXB3LW1ha2Uuc2VkOiBSZW9yZGVyIGNvbW1hbmRzIHRvIG1ha2Ugc2VkIGhhcHBpZXIuCi0JKiBjb25maWcvdGUtbWFjb3MuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtcHBjLmggKFRBUkdFVF9GT1JNQVQpOiBTZXQgY29ycmVjdGx5IGZvciBQb3dlck1hYy4KLQotU3VuIE5vdiAxMiAyMToxNDo1NiAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwKTogRml4IG9mZi1ieS0yIGJ1ZyBpbiBsZW5ndGggY2hlY2sgZm9yCi0JY29uZGl0aW9uYWwgYnJhbmNoZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCi1UaHUgTm92ICA5IDE2OjE0OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYXBwbHlfZml4KTogV2FybiBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8KLQlnZW5lcmF0ZSBhIHJlbG9jIHdoaWNoIHRoZSBsaW5rZXIgd2lsbCBub3QgaGFuZGxlIGNvcnJlY3RseS4gIEZpeAotCW92ZXJmbG93IGNoZWNraW5nLS1SX0lSRUwgaXMgMTggYml0cywgbm90IDE3LgotCi1XZWQgTm92ICA4IDE5OjU5OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBzdWJ0cmFjdCBtZF9wY3JlbF9mcm9tCi0JZnJvbSBhIFBDIHJlbGF0aXZlIHJlbG9jIGlmIFRDX0EyOUsuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKGxpbmVfc2VwYXJhdG9yX2NoYXJzKTogUmVzdG9yZSAnQCcuICBFeGlzdGluZwotCWNvZGUgZGVwZW5kcyB1cG9uIGl0LgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9vcGVyYW5kKTogSGFuZGxlICRmbG9hdCwgJGRvdWJsZSwgYW5kCi0JJGV4dGVuZC4gIEJhc2VkIG9uIGNvZGUgZnJvbSBFcmljIEZyZXVkZW50aGFsCi0JPGZyZXVkZW50aGFsQG55dS5lZHU+LgotCSogY29uZmlnL3RjLWEyOWsuaCAoTEVYX0RPTExBUik6IERlZmluZS4KLQkqIHJlYWQuYyAoTEVYX0RPTExBUik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkobGV4X3R5cGUpOiBVc2UgTEVYX0RPTExBUi4KLQotV2VkIE5vdiAgOCAxNjozODoxNCAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKGEyOWstbnl1LXN5bTEpOiBOZXcgdGFyZ2V0LCBqdXN0IGxpa2Ugb3RoZXIgYTI5awotCXRhcmdldHMuCi0KLVdlZCBOb3YgIDggMTE6Mzg6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19kb3RfZmlsZV9zeW1ib2wpOiBDYXN0IHhtYWxsb2MgcmV0dXJuLgotCi1UdWUgTm92ICA3IDA5OjE0OjM1IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGRlZCBCRkRfUkVMT0NfUlZBLiBDdXJyZW50bHkKLQl1c2VkIG9ubHkgYnkgImRsbHRvb2wuYyIuCi0KLU1vbiBOb3YgIDYgMTg6NTE6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogVW5kZWZpbmUgaW5saW5lIGlmIG5vdCBfX0dOVUNfXy4KLQkobWRfcHNldWRvX3RhYmxlKTogRG9uJ3QgZGVmaW5lICJleHRlcm4iLgotCi1TYXQgTm92ICA0IDAwOjUxOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmllaSk6IEZvcmNlIHN5bWJvbCBpbnRvIHRleHRfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9zaG93X3VzYWdlKTogUHV0IGJhY2tzbGFzaCBhdCBlbmQgb2YgbGluZS4KLQotRnJpIE5vdiAgMyAxMzowMjo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogRG9uJ3Qgd2FybiBhYm91dCA9PSB3aXRoIGEKLQlub25leGlzdGVudCBwYXJhbWV0ZXIsIGluIGNhc2UgaXQgaXMgaW4gYSBjb21tZW50IGZpZWxkLgotCi0JKiBhcy5jIChtYWluKTogT24gVENfQTI5SywgY2FsbCBtYWNyb19pbml0IHdpdGggbWFjcm9fYWx0ZXJuYXRlCi0Jc2V0IHRvIDEuCi0JKiBtYWNyby5jIChnZXRfYW55X3N0cmluZyk6IERvbid0IGtlZXAgcXVvdGVzIGlmIG1hY3JvX3N0cmlwX2F0IGlzCi0Jc2V0LCBldmVuIGlmIG1hY3JvX2FsdGVybmF0ZSBpcyBzZXQuCi0JKGdldF9hcG9zdF90b2tlbik6IElmIG1hY3JvX3N0cmlwX2F0LCBvbmx5IHNraXAga2luZCBpZiBpdCBpcyAnQCcuCi0JKHN1Yl9hY3R1YWwpOiBJZiBtYWNyb19zdHJpcF9hdCwgYW5kIGtpbmQgaXMgJ0AnLCBkb24ndCBsb29rIHVwCi0JdGhlIHRva2VuIHVubGVzcyBpdCBlbmRlZCBpbiAnQCcuCi0JKiBjb25maWcvdGMtYTI5ay5jIChsaW5lX3NlcGFyYXRvcl9jaGFycyk6IFJlbW92ZSAnQCcuCi0JKiBkb2MvYy1hMjlrLnRleGk6IERvY3VtZW50IG1hY3JvIHVzYWdlIG9uIEEyOUsuCi0KLVRodSBOb3YgIDIgMjM6MDc6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSGFuZGxlIG5ldyAnVycgcGxhY2UsIG1lYW5pbmcgYQotCXNpZ25lZCB3b3JkLgotCShpbnN0YWxsX29wZXJhbmQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTogQWRkICJleHRlcm4iLgotCi1XZWQgTm92ICAxIDE1OjE3OjAyIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBjb25maWd1cmUuaW4gKG04OGstbW90b3JvbGEtc3lzdiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLWRlbHRhODguaDogTmV3IGZpbGUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgbWRfZG9fYWxpZ24gaWYgaXQgaXMKLQlkZWZpbmVkLgotCSogY29uZmlnL3RjLW04OGsuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUuCi0JKG1kX2RvX2FsaWduKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW04OGsuYzogSW5jbHVkZSAic3Vic2Vncy5oIi4KLQkobTg4a19kb19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RlLWRlbHRhLmggKFNUUklQX1VOREVSU0NPUkUpOiBEb24ndCBkZWZpbmUuCi0JKENPRkZfTk9MT0FEX1BST0JMRU0pOiBEZWZpbmUuCi0JKExPQ0FMX0xBQkVMU19ET0xMQVIsIExPQ0FMX0xBQkVMU19GQik6IERlZmluZS4KLQotV2VkIE5vdiAgMSAxNjowNzo0MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBGb3IgYSBqdW1wIGluc3RydWN0aW9uIHdpdGgKLQlub24tY29uc3RhbnQgdGFyZ2V0LCByZXF1aXJlIDcgYXZhaWxhYmxlIGJ5dGVzIGluIHRoZSBjdXJyZW50Ci0JZnJhZywgbm90IDYuCi0KLVR1ZSBPY3QgMzEgMTU6Mzc6MTYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5oOiBJbmNsdWRlIGJmZC9lbGYtYmZkLmggcmF0aGVyIHRoYW4KLQliZmQvbGliZWxmLmguCi0KLVR1ZSBPY3QgMzEgMTY6MzQ6MjggMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLWxpbnV4Kik6IFVzZSBlY29mZi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9leHRlcm4pOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogTmV3IGZ1bmN0aW9uLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIHdlYWsgc3ltYm9scy4KLQkoZWNvZmZfc2V0dXBfZXh0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogV2FybiBhYm91dCB3ZWFrIGNvbW1vbiBzeW1ib2xzLgotCSogZWNvZmYuaCAoZWNvZmZfZGlyZWN0aXZlX2V4dGVybik6IERlY2xhcmUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV93ZWFrZXh0KTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoU19JU19XRUFLKTogTmV3IGZ1bmN0aW9uLgotCSogc3ltYm9scy5oIChTX0lTX1dFQUspOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkICJleHRlcm4iIGFuZAotCSJ3ZWFrZXh0Ii4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogUmVtb3ZlICJleHRlcm4iLgotCShzX2V4dGVybik6IFJlbW92ZS4KLQotVHVlIE9jdCAzMSAxMzoyOTowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2xnbG9ibCk6IERvIHRoZSByaWdodCB0aGluZy4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfYmIpOiBDYWxsIFNGX1NFVF9QUk9DRVNTLgotCShwcGNfZWIpOiBMaWtld2lzZS4gIFNldCB0aGUgc3RvcmFnZSBjbGFzcyB0byBDX0JMT0NLLCBub3QgQ19GQ04uCi0JKHBwY19mcm9iX3N5bWJvbCk6IERvbid0IGNoYW5nZSBDX0JMT0NLIHN5bWJvbHMgdG8gQ19ISURFWFQuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IGNhbGwKLQlTQV9TRVRfU1lNX0VORE5EWCB3aXRoIHRoZSBjdXJyZW50IHN5bWJvbDsgY2FsbCBpdCB3aXRoIHRoZSBuZXh0Ci0Jb25lLiAgSWYgT0JKX1hDT0ZGLCB0cnkgdG8gZmlndXJlIG91dCB3aGV0aGVyIHRoZSBzeW1ib2wgaXMgZ29pbmcKLQl0byBiZSBkcm9wcGVkLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiYmMiIGFuZCAiZWMiLgotCShwcGNfc3RhYl9zeW1ib2wpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcGNfY2hhbmdlX2NzZWN0KTogQ2hlY2sgdGhhdCBwcGNfdG9jX2NzZWN0IGlzIG5vdCBOVUxMLgotCShwcGNfc3RhYngpOiBTZXQgcHBjX3N0YWJfc3ltYm9sIGFyb3VuZCBjYWxsIHRvIHN5bWJvbF9tYWtlLiAgU2V0Ci0Jc3lfdGMucmVhbF9uYW1lIHRvIHRoZSBzdGFiIHN0cmluZy4KLQkocHBjX2JjLCBwcGNfZWMpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkocHBjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSk6IElmIHBwY19zdGFiX3N5bWJvbCBpcyBzZXQsIGRvbid0Ci0JZG8gYW55dGhpbmcuCi0JKHBwY19zeW1ib2xfbmV3X2hvb2spOiBJZiBwcGNfc3RhYl9zeW1ib2wgaXMgc2V0LCBkb24ndCBsb29rIGZvciBhCi0Jc3VmZml4LgotCShwcGNfZnJvYl9zeW1ib2wpOiBTZXQgQlNGX05PVF9BVF9FTkQgZm9yIHN5bWJvbHMgd2l0aCBjc2VjdCBhdXgKLQllbnRyaWVzLgotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wdXNoKTogUmVzZXQgc2JfaW5kZXguCi0KLU1vbiBPY3QgMzAgMTc6NTI6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IERvbid0IGNyZWF0ZSBhIGZyYWcgaW4gdGhlIGFic29sdXRlCi0Jc2VjdGlvbi4KLQotU2F0IE9jdCAyOCAwMTowMjowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJkYXRhIiBhbmQgInRleHQiLgotCShwcGNfY3NlY3QpOiBNb3ZlIG1vc3Qgb2YgdGhlIGNvZGUgdG8gcHBjX2NoYW5nZV9jc2VjdCwgYW5kIGNhbGwKLQlpdC4KLQkocHBjX2NoYW5nZV9jc2VjdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHRha2VuIGZyb20gcHBjX2NzZWN0LgotCShwcGNfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHBwY19zYXdfYWJzKTogTmV3IHN0YXRpYyB2YXJhYmxlLgotCShwcGNfZnJvYl9zeW1ib2wpOiBDcmVhdGUgYXV4IGVudHJ5IGZvciBhYnNvbHV0ZSBzeW1ib2xzLiAgV2FybiBpZgotCWEgc3ltYm9sIGhhcyBubyBjc2VjdC4KLQkocHBjX2FkanVzdF9zeW10YWIpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2FkanVzdF9zeW10YWIpOiBEZWZpbmUgaWYgT0JKX1hDT0ZGLgotCShwcGNfYWRqdXN0X3N5bXRhYik6IERlY2xhcmUgaWYgT0JKX1hDT0ZGLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIHRjX2FkanVzdF9zeW10YWIgaXMgZGVmaW5lZCwKLQljYWxsIGl0IGp1c3QgYmVmb3JlIHRoZSBjYWxsIHRvIG9ial9hZGp1c3Rfc3ltdGFiLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9maW5kX29yX21ha2UpOiBDaGFuZ2UgbmFtZSB0byBiZSBjb25zdC4KLQkqIHN5bWJvbHMuaCAoc3ltYm9sX2ZpbmRfb3JfbWFrZSk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotVGh1IE9jdCAyNiAxOToxODoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKEFsaWduKTogTWVudGlvbiBTSC4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1EaXJlY3RpdmVzLCAuZXZlbik6IERlc2NyaWJlIGJlaGF2aW9yLCBub3QKLQkuYWxpZ24gdmFsdWUuCi0JKiBkb2MvYy16OGsudGV4aSAoWjgwMDAgRGlyZWN0aXZlcywgZ2xvYmFsKTogRml4IG1pbm9yIHR5cG8uCi0JKFo4MDAwIERpcmVjdGl2ZXMsIGV2ZW4pOiBEb24ndCBnaXZlIG51bWVyaWMgYWxpZ24gdmFsdWUsIGluc3RlYWQKLQlleHBsYWluIGJlaGF2aW9yLgotCi1UaHUgT2N0IDI2IDExOjQ1OjAzIDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogdGMtYXJtLmMgKGRvX2xkc3QpOiBBc3NlbWJsZSBsZHIvc3RyIHIwLCBbcjFdIGFzIGEgcHJlLWluY3JlbWVudAotCWluc3RydWN0aW9uLgotCi1XZWQgT2N0IDI1IDExOjU5OjI0IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIEFsc28gbWFrZSBpbmZvLgotCShtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6ICBBbHNvIG1ha2UgY2xlYW4taW5mby4KLQotVHVlIE9jdCAyNCAxNToyMTozMyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBuZXcgIi5uc3Vic3BhIiBvcGNvZGUuCi0JKHBhX3N1YnNwYWNlKTogRm9yICIubnN1YnNwYSIsIGFsd2F5cyBjcmVhdGUgYSBuZXcgc3Vic3BhY2UKLQl3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLCBldmVuIGlmIG9uZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoZQotCXNhbWUgbmFtZS4KLQotVHVlIE9jdCAyNCAxNDo1MDozOCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OKTogUmVuYW1lIGZyb20KLQlUQ19GT1JDRV9SRUxPQ0FUSU9OLCB0YWtpbmcgYW4gYWRkaXRpb25hbCBzZWN0aW9uIGFyZ3VtZW50LiAgSWYKLQl0aGUgc2VjdGlvbiBvZiB0aGUgdGFyZ2V0IHN5bWJvbCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQKLQlzZWN0aW9uLCBhbHdheXMgZm9yY2UgdGhlIHJlbG9jYXRpb24gdG8gYmUgdXNlZC4KLQkoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogTmV3IG1hY3JvIHRvIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IFJlbmFtZSBmcm9tIHRoZQotCW1kX3BjcmVsX2Zyb20gZnVuY3Rpb24sIHRha2luZyBhbiBhZGRpdGlvbmFsIHNlY3Rpb24gYXJndW1lbnQuCi0JSW52b2tlIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTiBpbnN0ZWFkIG9mIFRDX0ZPUkNFX1JFTE9DQVRJT04uCi0KLQkqIHdyaXRlLmMgKFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTik6IERlZmluZSBpbiB0ZXJtcyBvZiB0aGUKLQlvbGRlciBUQ19GT1JDRV9SRUxPQ0FUSU9OIGlmIG5vdCBkZWZpbmVkLgotCShNRF9QQ1JFTF9GUk9NX1NFQ1RJT04pOiBJZiBub3QgZGVmaW5lZCwgaW52b2tlIG1kX3BjcmVsX2Zyb20uCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgTURfUENSRUxfRlJPTV9TRUNUSU9OIGluc3RlYWQgb2YKLQltZF9wY3JlbF9mcm9tLCBhbmQgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OIGluc3RlYWQgb2YKLQlUQ19GT1JDRV9SRUxPQ0FUSU9OLgotCQotTW9uIE9jdCAyMyAxNjoyMDowNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaW5wdXQtc2NydWIuYyAoYXNfd2hlcmUpOiBTZXQgbmFtZSB0byBudWxsIHBvaW50ZXIgaWYgd2UgZG9uJ3QKLQloYXZlIGEgZmlsZSBuYW1lLgotCSogbWVzc2FnZXMuYyAoaWRlbnRpZnkpOiBPbmx5IHByaW50IGZpbGVuYW1lIGlmIG5vbi1udWxsLgotCShhc19zaG93X3doZXJlKTogRGl0dG8sIGZvciBsaW5lIG51bWJlciB0b28uCi0JKGFzX3dhcm5faW50ZXJuYWwsIGFzX2JhZF9pbnRlcm5hbCk6IERpdHRvLgotCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IElmIHRoZSBpbnB1dCBmaWxlIGNhbid0IGJlCi0Jb3BlbmVkLCBjb25zaWRlciBpdCBhbiBlcnJvci4KLQotTW9uIE9jdCAyMyAxMToxNTo0NCAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBwYXNhbmRhLmN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQWRkZWQgbWlwc180MTAwIGNvbnRyb2wsIGFuZCBzdXBwb3J0IGZvcgotIAlhY2NlcHRpbmcgdGhlIDQxMDAgYXMgYSBNSVBTIGFyY2hpdGVjdHVyZSB2YXJpYW50IChtZF9iZWdpbiwKLSAJbWFjcm9fYnVpbGQsIG1pcHNfaXAsIG1kX3BhcnNlX29wdGlvbikuIEFkZGluZyBzdWl0YWJsZQotIAljb21tYW5kLWxpbmUgT1BUSU9OcywgYW5kIHVwZGF0aW5nIHRoZSBoZWxwIHRleHQgKG1kX3Nob3dfdXNhZ2UpLgotCQotV2VkIE9jdCAxOCAxMzoyMDozMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfYmVnaW4pOiBPbmx5IHNldCBhYnNvbHV0ZV9mcmNoYWluLmZpeF8qIHdoZW4KLQlCRkRfQVNTRU1CTEVSIGlzIGRlZmluZWQuCi0KLQkqIFVzZSBvbmUgYWN0aXZlIGZyYWcgYW5kIG9uZSBvYnN0YWNrIHBlciBmcmFnIGNoYWluOgotCSogZnJhZ3MuYyAoZnJhZ3MpOiBWYXJpYWJsZSBkZWxldGVkLgotCShmcmFnX2FsbG9jKTogTmV3IGZ1bmN0aW9uLgotCShmcmFnX2dyb3csIGZyYWdfbW9yZSwgZnJhZ192YXJpYW50LCBmcmFnX25vd19maXgsCi0JZnJhZ19hcHBlbmRfMV9jaGFyKTogUmVmZXIgdG8gZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjayBpbnN0ZWFkIG9mCi0JZnJhZ3MgdmFyaWFibGUuCi0JKGZyYWdfbmV3KTogRGl0dG8uICBWZXJpZnkgdGhhdCBmcmNoX2xhc3QgYW5kIGZyYWdfbm93IG1hdGNoIG9uCi0JZW50cnkgYW5kIGV4aXQsIGFuZCB0aGF0IG9sZCBmcmFnX25vdyBoYXMgbm9uLXplcm8gdHlwZS4gIFJlcGxhY2UKLQkia25vdyIgdXNlcyB3aXRoICJhc3NlcnQiLiAgVXNlIGZyYWdfYWxsb2MgaW5zdGVhZCBvZiBtdWNraW5nIHdpdGgKLQlvYnN0YWNrIGFsaWdubWVudC4KLQkqIGZyYWdzLmggKGZyYWdzKTogRGVjbGFyYXRpb24gZGVsZXRlZC4KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IGZyY2hhaW4pOiBBZGQgbmV3IGZpZWxkIGZyY2hfZnJhZ19ub3cuCi0JKiBzdWJzZWdzLmMgKGZyY2hhaW5zLCBkdW1teV9mcmFnLCBhYnNvbHV0ZV9mcmNoYWluKTogTmV3IHN0YXRpYwotCXZhcmlhYmxlcy4KLQkoc3Vic2Vnc19iZWdpbik6IEluaXRpYWxpemUgZnJjaGFpbnMgb2JzdGFjay4gIFVuZGVyIGdjYywgZG9uJ3QKLQlnaXZlIGl0IGFueSBzdHJpY3RlciBhbGlnbm1lbnQgdGhhbiBmcmNoYWluUyBzdHJ1Y3R1cmVzIG5lZWQuICBEbwotCW5vdCBpbml0aWFsaXplIGZyYWdzIG9ic3RhY2suICBTZXQgZnJhZ19ub3cgdG8gcG9pbnQgdG8KLQlkdW1teV9vYnN0YWNrLiAgSW5pdGlhbGl6ZSBhYnNvbHV0ZV9mcmNoYWluLgotCShzdWJzZWdfc2V0X3Jlc3QpOiBTYXZlIGFuZCByZXN0b3JlIGZyYWdfbm93IGluIGZyY2hfZnJhZ19ub3cKLQlmaWVsZCBvZiBmcmNoYWluUy4gIERvbid0IGNyZWF0ZSBuZXcgZnJhZ3Mgb24gc2VjdGlvbiBzd2l0Y2gsIGFuZAotCXVzZSBmcmFnX2FsbG9jIHdoZW4gY3JlYXRpbmcgYSBuZXcgZnJhZyBjaGFpbi4gIEZvciBhYnNvbHV0ZQotCXNlY3Rpb24sIHNldCBmcmNoYWluX25vdyB0byBhYnNvbHV0ZV9mcmNoYWluLiAgVmVyaWZ5IHRoYXQKLQlmcmNoX2xhc3QgYW5kIGZyYWdfbm93IG1hdGNoIG9uIGVudHJ5IGFuZCBleGl0LiAgSW5pdGlhbGl6ZQotCXBlci1jaGFpbiBvYnN0YWNrLCBhbmQgdW5kZXIgZ2NjLCBzZXQgcmVxdWlyZWQgYWxpZ25tZW50IHRvIHRoYXQKLQluZWVkZWQgYnkgZnJhZ1Mgc3RydWN0dXJlLgotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlcl8xKTogVmVyaWZ5IGZyX3R5cGUgaXMgbm9uemVyby4KLQotCSogc3RhYnMuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IE9ubHkgY29weSBpbnB1dCBzdHJpbmcgaWYgYQotCWZyZXNoIGNvcHkgaXMgbmVlZGVkLCBub3QgaWYgdGhlIHNlY3Rpb24gYWxyZWFkeSBleGlzdHMuCi0JKHNfc3RhYl9nZW5lcmljKTogQ2FjaGUgc3RhYiBzZWN0aW9uIG5hbWUgdG8gYnlwYXNzIGxvb2t1cHMsIHNpbmNlCi0JdXN1YWxseSBpdCB3aWxsIG1hdGNoLiAgQ291bGQgYmUgbWFkZSBmYXN0ZXIgc3RpbGwgYnkgY2hhbmdpbmcgdGhlCi0JbWVtb3J5IGFsbG9jYXRpb24gcnVsZXMuCi0JKHNfeHN0YWIpOiBDYWNoZSBzZWN0aW9uIG5hbWUgdG8gYnlwYXNzIHJlcGVhdGVkIHN0cmluZwotCWFsbG9jYXRpb24uCi0KLQkqIGZyYWdzLmMgKGZyYWdfbmV3KTogRGVsZXRlZCByZWdpc3RlciBkZWNsYXJhdGlvbnMuCi0KLQkqIGxpc3RpbmcuYyAoZnJhZ19ub3cpOiBEb24ndCBkZWNsYXJlLgotCi0JKiBhcy5jIChjaHVua3NpemUpOiBOZXcgdmFyaWFibGUuCi0JKGRlYnVnX21lbW9yeSk6IE5ldyB2YXJpYWJsZS4KLQkobWFpbik6IElmIGRlYnVnX21lbW9yeSBpcyBzZXQsIHJlZHVjZSBjaHVua3NpemUgYW5kCi0JX2JmZF9jaHVua3NpemUuCi0JKiBhcy5oIChjaHVua3NpemUpOiBEZWNsYXJlIGl0LgotCSogcmVhZC5jIChyZWFkX2JlZ2luKTogVXNlIGl0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvcnRvcHRzKTogSW5jbHVkZSAnZycuCi0JKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSBpdC4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBNYWtlZmlsZSBhbmQgY29uZmlnLnN0YXR1cyBmcm9tCi0JdGVzdHN1aXRlIGRpcmVjdG9yeS4KLQkoY2xlYW4taGVyZSk6IERvbid0IGRlbGV0ZSB0ZXN0c3VpdGUuICBJbnN0ZWFkLCBkZWxldGUgb25seSB0aGUKLQlmaWxlcyB3aXRoaW4gaXQgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQgYnkgcnVubmluZyB0ZXN0cy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24pOiBDYWxsCi0JZnJhZ19ub3dfZml4IGluc3RlYWQgb2YgYWNjZXNzaW5nIG9ic3RhY2sgaW5mbyBkaXJlY3RseS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAoc19sdG9yZyk6IERpdHRvLgotCShtZF9hc3NlbWJsZSk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IENhbGwgZnJhZ19ncm93IGluc3RlYWQgb2YKLQlvYnN0YWNrX3Jvb20uCi0KLVdlZCBPY3QgMTggMTI6MjI6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIHN0YWJzLmMgKGFvdXRfcHJvY2Vzc19zdGFiKTogSW5zZXJ0IGRlYnVnIHN5bWJvbCBpbnRvIHN5bWJvbAotCWNoYWluIGFmdGVyIHBhcnNpbmcgdmFsdWUgZXhwcmVzc2lvbiwgaWYgYW55LCB0byBhdm9pZCBzZXBhcmF0aW5nCi0JY29udGludWVkIC5zdGFicyBsaW5lcy4KLQotTW9uIE9jdCAxNiAxMDo1Njo0MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfZWxmX3BzZXVkb190YWJsZSk6IFJlbW92ZS4KLQkobWlwc19wb3BfaW5zZXJ0KTogRG9uJ3QgY2FsbCBwb3BfaW5zZXJ0IG9uIG1pcHNfZWxmX3BzZXVkb190YWJsZS4KLQotTW9uIE9jdCAxNiAwNzowNzozNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogVXNlIG5ldyBmbGFncyBQUENfT1BDT0RFX0NPTU1PTiBmb3IKLQktbWNvbSBzdXBwb3J0IGFuZCBQUENfT1BDT0RFX0FOWSBmb3IgLW1hbnkuCi0JKG1kX3BhcnNlX29wdGlvbik6IERpdHRvLgotCShwcGNfYXJjaCk6IERpdHRvLgotCShtZF9iZWdpbik6IEZvciBkdXBsaWNhdGUgaW5zdHJ1Y3Rpb25zLCBwcmludCBhbGwgZHVwbGljYXRlcwotCWJlZm9yZSBhYm9ydGluZy4KLQotU3VuIE9jdCAxNSAyMjowNjoxNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBTdXBwb3J0IGZvciAtbWNvbSB0byB0dXJuIG9uCi0JY29tbW9uIG1vZGUgb3BlcmF0aW9uLgotCShtZF9zaG93X3VzYWdlKTogQWRkIC1tY29tIHRvIHVzYWdlIG1lc3NhZ2UuCi0KLUZyaSBPY3QgMTMgMTM6MzI6NDUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcF9yYW5rKTogQWRkIE9fc3ltYm9sX3J2YS4KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogQWRkIE9fc3ltYm9sX3J2YS4KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBTZXQgT19zeW1ib2xfcnZhIHdoZW4gbmVjZXNzYXJ5LgotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBVbmRlcnN0YW5kIE9fc3ltYm9sX3J2YS4KLQotVHVlIE9jdCAxMCAxMTozNDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IENvcnJlY3Qgc19jb25zIGFyZ3VtZW50cy4gIEZyb20gTWljaGFlbAotCUpvb3N0ZW4gPGpvb3N0QG9yaS5jYWRsYWIuZGU+LgotCi1Nb24gT2N0ICA5IDE5OjU5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfbWFjcm8pOiBNYWtlIGNvdW50IHVuc2lnbmVkLgotCShwcGNfYmllaSk6IFNldCBzZWdtZW50IHRvIG5vd19zZWcgYW5kIHZhbHVlIHRvIGNvZmZfbl9saW5lX25vcy4KLQkocHBjX2Zyb2Jfc3ltYm9sKTogSGFuZGxlIENfQklOQ0wgYW5kIENfRUlOQ0wgc3ltYm9scyBieSBzZXR0aW5nCi0JdGhlIGZpeF9saW5lIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfbl9saW5lX25vcyk6IFJlbmFtZSBmcm9tIG5fbGluZV9ub3MsIGFuZAotCW1ha2Ugbm9uLXN0YXRpYy4gIENoYW5nZSBhbGwgdXNlcnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoY29mZl9uX2xpbmVfbm9zKTogRGVjbGFyZS4KLQotRnJpIE9jdCAgNiAxNjoyNDoyNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfQVJHX1dJVEgoYmZkLWFzc2VtYmxlcikpOiBGaXggaGVscCBtZXNzYWdlLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IENvbnZlcnQgc3BlY2lmaWVkIGJ5dGUKLQlhbGlnbm1lbnQgdG8gcG93ZXIgb2YgdHdvLiAgU2V0IHNpemUgb2YgbG9jYWwgYnNzIHN5bWJvbC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAodGNfZ2VuX3JlbG9jKTogRml4IHR5cG8gaW4gdmFyaWFibGUgbmFtZS4KLQotRnJpIE9jdCAgNiAxNToyMjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNiLmMsIG1hY3JvLmM6IERlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgPHN0cmluZy5oPiBvcgotCTxzdHJpbmdzLmg+IGp1c3QgYXMgYXMuaCBkb2VzLgotCi1GcmkgT2N0ICA2IDA5OjU1OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzaXRlLmV4cCk6IEZpeCBzZXR0aW5nIG9mICRzcmNkaXIuCi0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXRvZik6IEZpeCBsaXR0bGUtZW5kaWFuIG91dHB1dC4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoQVJNX0JJX0VORElBTik6IE1vdmUgZGVmaW5pdGlvbiBzbyBkZWZpbmVkIGZvcgotCWFsbCBjb2ZmIHRhcmdldHMuCi0KLVRodSBPY3QgIDUgMjA6MTc6MzAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBTcGxpdCBvdXQgdGhlIE5TMzJrIGZhbWlseSBkb2N1bWVudGF0aW9uLAotCWRlc3BpdGUgaXRzIGJlaW5nIGNvbW1lbnRlZCBvdXQgZm9yIG5vdy4KLQkqIGRvYy9jLW5zMzJrLnRleGk6IE5ldyBmaWxlLgotCi0JKiBzYi5jLCBtYWNyby5jOiBJbmNsdWRlIHN0cmluZy5oLgotCi0JKiBNYWtlZmlsZS5pbiAoY29tcGFyaXNvbik6IE9ubHkgY2hlY2sgKi5vOyB3ZSBkb24ndCBjYXJlIGlmCi0JdGltZXN0YW1wcyBpbnNlcnRlZCBieSB0aGUgbmF0aXZlIGxpbmtlciBkaWZmZXIuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9hbGlnbik6IE9ubHkgZmlsbCB3aXRoIGEgbm8tb3AgcGF0dGVybgotCWlmIGFsaWdubWVudCBzdHJpY3RlciB0aGFuIDQgYnl0ZXMgaXMgcmVxdWVzdGVkOyBpbiB0aGF0IGNhc2UsCi0JYWxpZ24gdG8gYSA0LWJ5dGUgYm91bmRhcnkgZmlyc3QuCi0KLQlUaHUgU2VwIDI4IDE5OjM1OjI3IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfUlNZTV9QYXJzZSk6IGVsaW1pbmF0ZSAibWlnaHQgYmUgdXNlZAotCXVuaW5pdGlhbGl6ZWQiIHdhcm5pbmcgZm9yIGBNYXhfU291cmNlX09mZnNldCcuCi0KLVdlZCBPY3QgIDQgMTY6MTc6MDIgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocGFyc2VfdG9jX2VudHJ5KTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIFt0b2NdCi0JcXVhbGlmaWVycyBhbmQgZGV0ZWN0IGVycm9ycyBpZiBwcmVzZW50LgotCShtZF9hc3NlbWJsZSk6IEFkZCBjYWxsIHRvIHBhcnNlX3RvY19lbnRyeS4gQWxzbyBhZGRlZCBzb21lIHN1cHBvcnQKLQlmb3IgdGhlIFt0b2N2XSBxdWFsaWZpZXIuCi0JKHBwY19wZV90b2NkKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQgZGF0YSBpbiB0aGUgdG9jIHNlY3Rpb24uCi0KLVdlZCBPY3QgIDQgMTQ6MDM6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mcm9iX3N5bWJvbCk6IERvbid0IGNyZWF0ZSBhbiBhdXggZW50cnkgZm9yCi0JYW4gYWJzb2x1dGUgc3ltYm9sLgotCi1UdWUgT2N0ICAzIDEyOjE4OjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaXN3b3JkKTogQWNjZXB0IGFsbCB2YWx1ZXMgZnJvbSAtNjU1MzYgdG8KLQkrNjU1MzUsCXNvIH5WQUwgd2lsbCBub3QgYmUgcmVqZWN0ZWQuCi0KLQkqIGNvbmQuYyAoc19lbmRpZik6IENhbGwgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4gIEluIE1SSSBtb2RlLAotCXNraXAgY2hhcmFjdGVycyBhZnRlciB0aGUgcHNldWRvLW9wLgotCShzX2Vsc2UpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBEb24ndCBsb29rIHBhc3QgYnVmZmVyX2xpbWl0LgotCShzX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgc2tpcCBjaGFyYWN0ZXJzIGFmdGVyIHRoZSBmaWxlIG5hbWUuCi0KLU1vbiBPY3QgIDIgMTY6MTU6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtNjhrX3JlZ19wYXJzZSk6IEluIE1SSSBtb2RlLCBwZXJtaXQKLQlwZXJpb2RzIGluIHJlZ2lzdGVyIG5hbWVzLgotCi1TYXQgU2VwIDMwIDIzOjAzOjMxIDE5OTUgIEplZmYgTGF3ICAobGF3QGh1cmwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IERQIHJlbGF0aXZlIHJlbG9jcwotCWFyZSBub3QgYWRqdXN0YWJsZSBpbiBTT00gdG8gYXZvaWQgY29uZnVzaW5nIHRoZSBvcHRpbWl6aW5nCi0JbGlua2VyLgotCi1GcmkgU2VwIDI5IDE1OjE4OjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBzb21lIHN1cHBvcnQgZm9yIGk5NjAgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBlbmRpYW4uCi0JKGdldF9hcmdzKTogRG9uJ3QgZGlzY2FyZCBhIHNwYWNlIGJldHdlZW4gYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuCi0JKGdldF9jZGlzcCk6IENoYW5nZSB0ZXh0X3NlY3Rpb24gdG8gbm93X3NlZy4KLQkoc19lbmRpYW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWk5NjAuaCAoTVJJX01PREVfTkVFRFNfUFNFVURPX0RPVCk6IERlZmluZS4KLQkqIGV4cHIuaCAob3BlcmF0b3JUKTogQWRkIE9fbG9naWNhbF9ub3QsIE9fbG9naWNhbF9hbmQsIGFuZAotCU9fbG9naWNhbF9vci4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IFRyZWF0ICchJyBhcyBsb2dpY2FsIG5vdCBvcGVyYXRvci4gIElmCi0JVENfSTk2MCwgaW4gTVJJIG1vZGUgcGVybWl0IGBzaXplb2Ygc2VjbmFtZScgYW5kIGBzdGFydG9mCi0Jc2VjbmFtZScuCi0JKG9wX3JhbmspOiBCdW1wIHZhbHVlcyBieSAyIHRvIG1ha2Ugcm9vbSBmb3IgJiYgYW5kIHx8LiAgQWRkCi0JZW50cmllcyBmb3IgISwgJiYsIGFuZCB8fC4KLQkoZXhwcl9iZWdpbik6IE9ubHkgZG8gTVJJIGNoYW5nZXMgaWYgVENfTTY4Sy4KLQkob3BlcmF0b3IpOiBSZWNvZ25pemUgfHwgYW5kICYmLgotCShleHByKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBuZXcgb3BlcmF0b3JUIHZhbHVlcy4KLQkocHJpbnRfZXhwcl8xKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgZGVidWcsIGVyciwgaXJlcCwgaXJlcGMsIHByaW50LCBwdXJnZW0sCi0JYW5kIHJlcC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogSGFuZGxlIE1SSV9NT0RFX05FRURTX1BTRVVET19ET1QuCi0JKG1yaV9jb21tZW50X2ZpZWxkKTogT25seSBoYW5kbGUgd2VpcmQgY29tbWVudHMgaWYgVENfTTY4Sy4KLQkoc19lcnIpOiBOZXcgZnVuY3Rpb24uCi0JKHNfb3JnKTogT25seSBwdW50IGluIE1SSSBtb2RlIGlmIFRDX002OEsuCi0JKHNfbXJpX3NlY3QpOiBXcml0ZSBUQ19JOTYwIHZlcnNpb24uCi0JKHNfcHJpbnQsIHNfcHVyZ2VtKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHJlYWQuaCAoc19lcnIsIHNfcHJpbnQsIHNfcHVyZ2VtKTogRGVjbGFyZS4KLQkqIGNvbmQuYyAoc19pZmVxcyk6IEltcGxlbWVudC4KLQkoaWdub3JlX2lucHV0KTogSGFuZGxlIE1SSV9NT0RFX05FRURTX1BTRVVET19ET1QuCi0JKiBtYWNyby5jIChtYWNyb19zdHJpcF9hdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1hY3JvX2luaXQpOiBBZGQgc3RyaXBfYXQgcGFyYW1ldGVyLgotCShkb19mb3JtYWxzKTogSWYgbWFjcm9fc3RyaXBfYXQsIGNoYW5nZSBOQVJHIHRvICROQVJHLgotCShkZWZpbmVfbWFjcm8pOiBTa2lwIGEgY29tbWEgYWZ0ZXIgdGhlIG1hY3JvIG5hbWUuCi0JKGdldF9hcG9zdF90b2tlbik6IFNraXAgY2hhcmFjdGVyIGlmIG1hY3JvX3N0cmlwX2F0LCBldmVuIGlmCi0JbWFjcm9fbXJpLgotCShtYWNyb19leHBhbmRfYm9keSk6IElmIG1hY3JvX3N0cmlwX2F0LCBkb24ndCByZWNvZ25pemUgcGFyYW1ldGVycwotCWluIHN0cmluZ3MgdW5sZXNzIHRoZXkgYXJlIHByZWNlZGVkIGJ5IGFuICdAJy4gIElmIG1hY3JvX3N0cmlwX2F0LAotCXBhc3MgJ0AnIGFzIHN0cmlwIGNoYXJhY3RlciB0byBzdWJfYWN0dWFsLiAgSWYgbWFjcm9fc3RyaXBfYXQsCi0Jc3RyaXAgJ0AnIGNoYXJhY3RlcnMuCi0JKG1hY3JvX2V4cGFuZCk6IElmIG1hY3JvX3N0cmlwX2F0LCBjaGFuZ2UgTkFSRyB0byAkTkFSRy4KLQkoZGVsZXRlX21hY3JvKTogTmV3IGZ1bmN0aW9uLgotCShleHBhbmRfaXJwKTogU2tpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyAnIicgY2hhcmFjdGVycyBpZiBpcnBjLgotCSogbWFjcm8uaCAobWFjcm9faW5pdCk6IE1lbnRpb24gbmV3IHN0cmlwX2F0IHBhcmFtZXRlci4KLQkoZGVsZXRlX21hY3JvKTogRGVjbGFyZS4KLQkqIGFzLmMgKG1haW4pOiBJZiBUQ19JOTYwLCBwYXNzIGZsYWdfbXJpIHRvIG1hY3JvX2luaXQgYXMKLQlzdHJpcF9hdDsgb3RoZXJ3aXNlLCBwYXNzIDAuCi0JKiBnYXNwLmMgKHByb2Nlc3NfcHNldWRvX29wKTogUGFzcyAwIHRvIG1hY3JvX2luaXQgYXMgc3RyaXBfYXQuCi0JKG1haW4pOiBMaWtld2lzZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBpOTYwIE1SSSBtb2RlLgotCi0JKiBhcy5jIChzaG93X3VzYWdlKTogTWVudGlvbiAtLWRlZnN5bS4KLQotVGh1IFNlcCAyOCAxOToyNTowNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW46IFRyYW5zbGF0ZSAicG93ZXJwYyIgaW50byAicHBjIiwgcmVtb3ZlIGdlbiBvZgotCVZFUlNJT04sIG1vdmUgZ2VuIG9mICJjb25mIiBoZXJlIGZyb20gbWFrZWZpbGUuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBzZWQgY29tbWFuZHMgdG8gdHJhbnNsYXRlIFVuaXggbWFrZWZpbGUKLQlpbnRvIE1QVyBzeW50YXguCi0JKiBtcHctbWFrZS5pbjogUmVtb3ZlLgotCSogbWFjLWFzLnI6IE5ldyBmaWxlLCBNYWMgcmVzb3VyY2UgZmlsZS4KLQkqIGFzLmggKGlubGluZSk6IERvbid0IGRlY2lkZSBhYm91dCBkZWZpbmluZyBpZiBfX01XRVJLU19fLAotCXJlbW92ZSByZWR1bmRhbnQgY29uZGl0aW9uYWwgYW5kIGRlZmluaXRpb24uCi0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogRml4IHN5bnRheCBmb3IgT0JKX1BST0NFU1NfU1RBQi4KLQotVGh1IFNlcCAyOCAxNTo0MzoxNSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW1vdmVkIHNvbWUgVEVfUEUgc3BlY2lmaWMgCi0JbWFuaXB1bGF0aW9ucywgc2luY2UgSSBjYW4ndCBwcm92ZSB0aGV5J3JlIG5lZWRlZC4KLQkobWRfYmVnaW4pOiBSZW1vdmVkIGluaXRfcmVndGFibGUsIGluc2VydF9yZWcsIGFuZCB0aGUgY2FsbCBwb2ludHMuCi0JKHJlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb24uIFBhcnNlcyBhIHJlZ2lzdGVyIG5hbWUsIGlmIGFwcHJvcHJpYXRlLgotCShtZF9hc3NlbWJsZSk6IEFkZGVkIGNhbGwgdG8gcmVnaXN0ZXJfbmFtZSB0byBoYW5kbGUgc3ltYm9saWMgbmFtZXMuCi0JKHBwY19wZV9zZWN0aW9uKTogUmVtb3ZlZCBhbGwgZHVwbGljYXRlIElNQUdFIGRlZmluZXMsIGFuZCBpbmNsdWRlCi0JY29mZi9wZS5oIGluc3RlYWQuCi0KLVRodSBTZXAgMjggMTI6MDk6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRGVmaW5lLgotCShwcGNfcGVfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcGVfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBTZXAgMjggMDE6MTE6NTggMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgZm9yIGFybS1jb2ZmLgotCi1XZWQgU2VwIDI3IDEyOjUzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX0lTX0xPQ0FMKTogQWxsIHN5bWJvbHMgaW4gcmVnX3NlY3Rpb24gYXJlIGxvY2FsLgotCi0JKiBjb25maWcvdGMtcHBjLmggKE9CSl9YQ09GRik6IERlZmluZSBpZiBPQkpfQ09GRiBhbmQgbm90IFRFX1BFLgotCUNoYW5nZSBPQkpfQ09GRiBjaGVja3MgdG8gY2hlY2sgT0JKX1hDT0ZGIGluc3RlYWQuCi0JKFRBUkdFVF9GT1JNQVQpOiBGdWxseSBwYXJlbnRoZXNpemUuCi0JKExFWF9RTSk6IERlZmluZSBpZiBURV9QRS4KLQkqIGNvbmZpZy90Yy1wcGMuYzogUmVwbGFjZSBPQkpfQ09GRiBieSBPQkpfWENPRkYgdGhyb3VnaG91dC4KLQlSZW1vdmUgY2hlY2tzIG9mIFRFX1BFIHdpdGhpbiAjaWZkZWYgT0JKX1hDT0ZGIHNlY3Rpb25zLgotCShpbml0X3JlZ3RhYmxlKTogTWFrZSBpIHVuc2lnbmVkLgotCShwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbik6IFJlbmFtZSBmcm9tIHNldEN1cnJlbnRTZWN0aW9uLiAgQ2hhbmdlCi0JYWxsIGNhbGxlcnMuCi0JKHBwY19hcmNoKTogUmV0dXJuIGFmdGVyIGFzX2ZhdGFsIHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShtZF9hc3NlbWJsZSk6IE9ubHkgZGVjbGFyZSByZWxvYyBpZiBPQkpfRUxGLiAgQWRkIGRlZmF1bHQgdG8KLQlzd2l0Y2ggb24gZml4dXBzW2ldLnJlbG9jIHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShJTUFHRV9TR05fTE5LX09USEVSKTogRml4IG5lc3RlZCBjb21tZW50LgotCShwcGNfcGVfZnVuY3Rpb24pOiBEb24ndCBjYWxsIHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUuCi0JKHBwY19mcm9iX3N5bWJvbCk6IFJlbW92ZSBURV9QRSBzZWN0aW9uIGNoZWNrcy4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBSZXR1cm4gYWZ0ZXIgYWJvcnQgdG8gYXZvaWQgZ2NjCi0Jd2FybmluZy4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBCRkRfUkVMT0NfMTZfR09UX1BDUkVMIHRvIHN3aXRjaC4KLQkqIHJlYWQuYyAoTEVYX1FNKTogRGVmaW5lIGFzIDAgaWYgbm90IGRlZmluZWQuCi0JKGxleF90eXBlKTogVXNlIExFWF9RTSBmb3IgJz8nLgotCi0JKiBjb25maWd1cmUuaW46IE5vIG5lZWQgdG8gY2hlY2sgd2hldGhlciAke2NwdV90eXBlfSBpcyBwb3dlcnBjOwotCWl0IG5ldmVyIHdpbGwgYmUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMjcgMTE6MzM6MzggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW1vdmUgU2VwIDI2IGNoYW5nZXMgdG8gdGhpcwotCWZ1bmN0aW9uLCBrZWVwaW5nIG90aGVyIFNlcC4gMjYgY2hhbmdlcy4KLQotV2VkIFNlcCAyNyAxMDoyOToxMyAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAbmVsbGllPgotCi0JKiBjb25maWd1cmUgKGVtdWxhdGlvbnMpOiBBZGRlZCBzdXBwb3J0IGZvciBwcGNsZS0qLVtwZXx3aW5udF0KLQkodGFyZ2V0X2ZyYWcpOiBSZW1vdmVkIGFuIGV4dHJhbmVvdXMgUFBDIGRlZmluaXRpb24uCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBTYW1lCi0JKiBjb25maWcvdGMtcHBjLmg6Ci0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IEJhc2Ugc3VwcG9ydCBmb3IgbmV3IG9yIGFsdGVyZWQKLQlwc2V1ZG8gb3BzIC0gPHByZXZpb3VzLCBwZGF0YSwgeWRhdGEsIHJlbGRhdGEsIHJkYXRhLCB1YWxvbmcsIHpub3AsCi0Jc2VjdGlvbiwgY29tbSwgZnVuY3Rpb24+IFRoZXJlIHdpbGwgYmUgbW9yZS4KLQkocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogUHJlZGVmaW5lZCByZWcgdGFibGUgdG8gbmFtZSByZWdpc3RlcnMsIGV0YwotCShtZF9iZWdpbik6IFNldHVwIHJlZyB0YWJsZSBpbml0aWFsaXphdGlvbgotCShtZF9hc3NlbWJsZSk6IEluaXRpYWwgW3RvY114KHJ0b2MpIHN1cHBvcnQKLQkocHBjX2Zyb2JfbGFiZWwpOiBSZW1vdmVkIHNvbWUgeGNvZmYgc3BlY2lmaWMgcHJvY2Vzc2luZyBmcm9tIFRFX1BFCi0JKHBwY19mcm9iX3N5bWJvbCk6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIG1vcmUgcHJlZGVmaW5lZCBzZWN0aW9ucwotICAgICAgICAocHBjX2Zyb2Jfc2VjdGlvbik6IFJlbW92ZWQgc29tZSB4Y29mZiBzcGVjaWZpYyBwcm9jZXNzaW5nIGZyb20gVEVfUEUKLQkocHBjX2ZpeF9hZGp1c3RhYmxlKTogUmVtb3ZlZCBmcm9tIFRFX1BFIG1haW5saW5lCi0JKG1kX2FwcGx5X2ZpeDMpOiBGb3IgVEVfUEUgdG9jIGVudHJpZXMsIHdlIGRvbid0IG5lZWQgdG8gbWVzcyAKLSAgICAgICAgd2l0aCBmeF9hZGRudW1iZXIuIFJlbW92ZWQgZm9yIHRoZSB0aW1lIGJlaW5nLgotCShsb3RzKTogUHV0IGJhY2sgbWlzc2luZyBhc3NpZ25tZW50cyB0byBwcGNfY3VycmVudF9jc2VjdC4KLQotVHVlIFNlcCAyNiAxNDo1Nzo1OSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBTdXBwb3J0IGFsbCBvZiB0aGUgVi40Ci0JcmVsb2NhdGlvbnMuCi0JKHBwY19lbGZfY29ucyk6IFJlbW92ZSByZXN0cmljdGlvbiB0aGF0IEAgc3VmZml4ZXMgbXVzdCBiZSBkb25lCi0Jd2l0aCAubG9uZy4gIEFkZCBlcnJvciBpZiByZWxvY2F0aW9uIGRvZXMgbm90IGZpdCBpbiB0aGUgbnVtYmVyIG9mCi0JYnl0ZXMgcHJvdmlkZWQuCi0JKG1kX2Fzc2VtYmxlKTogRm9yIGFic29sdXRlIGJyYW5jaGVzLCBtYXAgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMKLQliYWNrIGludG8gYW4gZXF1aXZhbGVudCBhYnNvbHV0ZSByZWxvY2F0aW9uLgotCShtZF9wY3JlbF9mcm9tKTogSWYgVENfRk9SQ0VfUkVMT0NBVElPTiBpcyB0cnVlLCByZWxvY2F0aW9uIG9mZnNldAotCWlzIDAsIG5vdCBzZWdtZW50IHN0YXJ0LgotCShtZF9hcHBseV9maXgzKTogRG9uJ3QgYm90aGVyIHdyaXRpbmcgYWRkZW5kIGludG8gdGhlIGluc3RydWN0aW9uLAotCXNpbmNlIGl0IGlzIGlnbm9yZWQsIGdpdmVuIHRoYXQgd2UgdXNlIFJFTEEgcmVsb2NhdGlvbnMgZm9yIEVMRi4KLQotCSogY29uZmlnL3RjLXBwYy5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lIHRvIGZvcmNlIGFsbAotCWJyYW5jaCBwcmVkaWN0aW9uIHJlbG9jYXRpb25zIHRvIGFsd2F5cyBiZSBlbWl0dGVkLgotCi1Nb24gU2VwIDI1IDE2OjA4OjQzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IExvd2VyIGNhc2UgcmVsb2MgYmVmb3JlCi0JdGVzdGluZy4KLQkobWRfYXNzZW1ibGUpOiBCZSBtb3JlIHJvYnVzdCBpbiB0ZXJtcyBvZiByZWxvY2F0aW9ucy4KLQkobWRfYXBwbHlfZml4Myk6IEFsbG93IDE0IGJpdCByZWxvY3MgdG8gYmUgZW1pdHRlZCBmb3IgZXh0ZXJuYWwKLQlzeW1ib2xzIGluIGFkZGl0aW9uIHRvIDI2IGJpdCByZWxvY3MuICBQcm9wZXJseSBpbnNlcnQgMjYvMTQgYml0Ci0JcmVsb2MgdmFsdWUgZmllbGRzIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4JCi0KLU1vbiBTZXAgMjUgMDA6MjM6MTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2F0b2YpOiBPdXRwdXQgbGl0dGxlIGVuZGlhbiBjb25zdGFudHMgaW4KLQlsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogUGFzcyAmdHlwZSwgbm90IHR5cGUsCi0Jc19tcmlfc2VjdC4KLQotCSogY29uZmlndXJlLmluOiBGaXggdHlwbzogZm10LWVsZiB0byBmbXQ9ZWxmLgotCi1GcmkgU2VwIDIyIDE2OjM0OjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFJld3JpdGUgdG8gdXNlIGEgdGFibGUgb2YKLQlzdHJpbmdzIGFuZCByZWxvY2F0aW9ucyB0aGV5IHJlcHJlc2VudC4gIEFkZCBAYnJ7LG59dGFrZW4gZm9yCi0JYnJhbmNoIHRha2VuL25vdCB0YWtlbiBzdXBwb3J0LgotCShtZF9hcHBseV9maXgzKTogQWRkIEJGRF9SRUxPQ19QUENfQjE2X0JSeyxOfVRBS0VOIHN1cHBvcnQuCi0KLVRodSBTZXAgMjEgMjE6MTA6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcGFyc2Vfb3B0aW9uKTogLW1yZWxvY2F0YWJsZS1saWIgbm93IG9ubHkKLQlzZXRzIEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIgYW5kIG5vdCBhbHNvIEVGX1BQQ19SRUxPQ0FUQUJMRS4KLQotVGh1IFNlcCAyMSAxNjozMDo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldCk6IFBlcm1pdCBTRUdfQUJTT0xVVEUgaW4ga25vdyBleHByZXNzaW9uLgotCSogZXhwci5jIChleHByKTogQWNjb3VudCBmb3IgbmV3IG9wZXJhdG9yVCB2YWx1ZXMgaW4ga25vdwotCWV4cHJlc3Npb24uCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDbGVhciBmaXhwLT5meF9zdWJzeSBpZiB0aGUgcmVsb2NhdGlvbgotCWlzIGZ1bGx5IHJlc29sdmVkLgotCi1UaHUgU2VwIDIxIDE0OjExOjQ5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mbGFncyk6IE5ldyB2YXJpYWJsZSB0byBob2xkIHRoZSBmbGFnIGJpdHMKLQl0byBzZXQgaW4gdGhlIEVMRiBoZWFkZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXJlbG9jYXRhYmxlLWxpYi4gIE1ha2UgYm90aAotCS1tcmVsb2NhdGFibGUgYW5kIC1tcmVsb2NhdGFibGUtbGliIHNldCBwcGNfZmxhZ3MuCi0JKG1kX2JlZ2luKTogU2V0IEVMRiBmbGFncyB3aXRoIHBwY19mbGFncy4KLQotV2VkIFNlcCAyMCAxMzowMTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uICBBZGQgR05VIHN0YW5kYXJkIG1haW50YWluZXItY2xlYW4gZWNob3MuCi0JKiBkb2MvTWFrZWZpbGUuaW4gKG1haW50YWluZXItY2xlYW4pOiBOZXcgdGFyZ2V0LCBzeW5vbnltIGZvcgotCXJlYWxjbGVhbi4KLQotVHVlIFNlcCAxOSAxMTozMTozMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgaW1tZWRpYXRlIG9wZXJhbmRzIGZvciAnJScuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgaW1tZWRpYXRlIG9wZXJhbmRzIGZvciAnfCcuCi0JUmVwbGFjZSAnUCcgd2l0aCAnMCcsICcxJywgYW5kICcyJy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAocGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IENoYW5nZSBsZWZ0c3RvcAotCWFuZCByaWdodHN0b3AgdG8gbm90IGJlIGNvbnN0LgotCShwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uKTogTGlrZXdpc2UuCi0JKGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQpOiBMaWtld2lzZS4gIFVzZSBtNjhrX2lwX29wIHRvIGV4YW1pbmUKLQl0aGUgb3BlcmFuZCwgbm90IG02OGtfcmVnX3BhcnNlLgotCShzX21yaV9pZik6IEluIE1SSSBtb2RlLCBzdG9wIGF0IHRoZSBmaXJzdCAnKicuCi0JKHNfbXJpX3doaWxlKTogTGlrZXdpc2UuCi0JKHNfbXJpX2Vsc2UpOiBJbiBNUkkgbW9kZSwgaWdub3JlIHRyYWlsaW5nIGNoYXJhY3RlcnMuCi0JKHNfbXJpX2VuZGksIHNfbXJpX2JyZWFrLCBzX21yaV9uZXh0LCBzX21yaV9mb3IpOiBMaWtld2lzZS4KLQkoc19tcmlfZW5kZiwgc19tcmlfcmVwZWF0LCBzX21yaV91bnRpbCwgc19tcmlfZW5kdyk6IExpa2V3aXNlLgotCSogY29uZmlnL202OGstcGFyc2UueTogUmV2ZXJ0IHllc3RlcmRheSdzIGNoYW5nZS4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmg6IFJldmVydCB5ZXN0ZXJkYXkncyBjaGFuZ2UuCi0KLU1vbiBTZXAgMTggMTU6MjI6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogQ2hhbmdlIGxlZnRzdGFydAotCWFuZCByaWdodHN0YXJ0IHRvIG5vdCBiZSBjb25zdC4KLQkocGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbik6IExpa2V3aXNlLgotCShidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kKTogTGlrZXdpc2UuICBJZiB0aGUgbGVmdCBzaWRlIG9mIHRoZQotCWNvbXBhcmlzb24gaXMgYSByZWdpc3RlciwgYW5kIHRoZSByaWdodCBzaWRlIGlzIG5vdCwgc3dhcCB0aGUgdHdvCi0Jc2lkZXMuCi0JKiBjb25maWcvbTY4ay1wYXJzZS55IChtNjhrX3JlZ19wYXJzZSk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKG02OGtfcmVnX3BhcnNlKTogRGVjbGFyZS4KLQotCSogcmVhZC5jIChtcmlfY29tbWVudF9maWVsZCk6IE5ldyBmdW5jdGlvbi4KLQkobXJpX2NvbW1lbnRfZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzX2FsaWduX2J5dGVzKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkLgotCShzX2FsaWduX3B0d28sIHNfY29tbSwgc19tcmlfY29tbW9uLCBzX2ZhaWwsIHNfZ2xvYmwpOiBMaWtld2lzZS4KLQkoc19mbG9hdF9zcGFjZSwgc19zdHJ1Y3QpOiBMaWtld2lzZS4KLQkoc19zcGFjZSk6IFVzZSBtcmlfY29tbWVudF9maWVsZCByYXRoZXIgdGhhbiBkb2luZyBpdCBieSBoYW5kLgotCShjb25zX3dvcmtlciwgZXF1YWxzKTogTGlrZXdpc2UuCi0JKHNfZW5kKTogSWdub3JlIGNvbW1lbnRzIHN0YXJ0aW5nIHdpdGggJyonIG9yICchJy4KLQkqIHJlYWQuaCAobXJpX2NvbW1lbnRfZmllbGQpOiBEZWNsYXJlLgotCShtcmlfY29tbWVudF9lbmQpOiBEZWNsYXJlLgotCSogY29uZC5jIChzX2lmKTogVXNlIG1yaV9jb21tZW50X2ZpZWxkLgotCSogY29uZmlnL3RjLW02OGsuYyAoc19jaGlwLCBzX3JlZyk6IExpa2V3aXNlLgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogSGFuZGxlIEFCUy1zeW0gaW4gLXN5bSBjYXNlIHJhdGhlciB0aGFuCi0Jc3ltLXN5bSBjYXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4gIFBlcm1pdCBuZWdhdGl2ZQotCXN5bWJvbHMgaWYgVENfTTY4Sy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogSWYgZnhfdGNiaXQgaXMgc2V0LCByZXR1cm4KLQlSX1JFTExPTkdfTkVHLgotCSh0Y19nZW5fcmVsb2MpOiBJZiBmeF90Y2JpdCBpcyBzZXQsIGFib3J0LgotCShtZF9hcHBseV9maXhfMik6IEZvciBhIG5lZ2F0aXZlIHJlbG9jLCBtb3ZlIGZ4X3N1YnN5IHRvIGZ4X2FkZHN5LAotCWFuZCBzZXQgZnhfdGNiaXQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfcmVnKTogSWdub3JlIGNvbW1lbnQgZmllbGQgaW4gTVJJIG1vZGUuCi0KLU1vbiBTZXAgMTggMTQ6NDQ6MDQgMTk5NSAgQXJuZSBILiBKdXVsICA8YXJuZWpAcHZ2LnVuaXQubm8+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtbmV0YnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVN1biBTZXAgMTcgMjI6MTc6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbmRpYW4gdG8gbGl0dGxlIGZvciBtaXBzLSotdWx0cml4Ki4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIFNlcCAxNSAxMzoxNjo1NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoY3VycmVudF9sb2NhdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uICBIYW5kbGUgbWFnaWMKLQlzeW1ib2wgYC4nOyBpbiBhYnNvbHV0ZSBzZWN0aW9uLCByZXR1cm4gYSBjb25zdGFudC4KLQkob3BlcmFuZCk6IENhbGwgY3VycmVudF9sb2NhdGlvbiBmb3IgJy4nIGFuZCAnJCcsIGluc3RlYWQgb2YgZG9pbmcKLQlpdCBpbmxpbmUuICBJbiBNUkkgbW9kZSwgY2FsbCBjdXJyZW50X2xvY2F0aW9uIGZvciAnKicuCi0KLUZyaSBTZXAgMTUgMjE6Mzk6MjkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IENoYW5nZSBzb21lICJDT05TVCIgcmVmZXJlbmNlcyB0byAiY29uc3QiLgotCi1GcmkgU2VwIDE1IDE3OjI3OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JVHVlIFNlcCAxMiAxNzowODoyMyAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3N0YWJfcGFyc2UpOiBzaW1wbGlmeSBmaXJzdCBsb29wOwotCXVzZSBTX0dFVF9OQU1FL21vZGlmeS9TX1NFVF9OQU1FIHNlcXVlbmNlIGluc3RlYWQgb2YgYWJ1c2luZwotCVNfR0VUX05BTUUgd2hlbiB1cGRhdGluZyBzeW1ib2wgbmFtZS4KLQkobG9jYWxfc3ltYm9sc19EU1QpOiBmaXJzdCBwcmVmaXgvcG9zdGZpeCB0eXBvIGZyb20gSnVseSAyMXN0LgotCVtwbHVzIGNvbW1lbnQgcmVmb3JtYXR0aW5nIC0ta3JdCi0KLVdlZCBTZXAgMTMgMTI6MzM6MDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRVhQRUNUKTogTmV3IHZhcmlhYmxlLgotCShDSEVDS0ZMQUdTKTogUmVtb3ZlLgotCShzaXRlLmV4cCk6IE5ldyB0YXJnZXQuCi0JKGNoZWNrKTogUmV3cml0ZSB0byBpbnZva2UgcnVudGVzdCBkaXJlY3RseSwgcmF0aGVyIHRoYW4gcmVjdXJyaW5nCi0JZG93biBpbnRvIHRlc3RzdWl0ZS4KLQkoY2xlYW4taGVyZSk6IFJlbW92ZSB0ZXN0c3VpdGUgZGlyZWN0b3J5LgotCShjbGVhbiwgZGlzdGNsZWFuKTogRG9uJ3QgcmVjdXIgaW50byB0ZXN0c3VpdGUuCi0JKiBjb25maWd1cmUuaW46IERvbid0IGNhbGwgQUNfQ09ORklHX1NVQkRJUlModGVzdHN1aXRlKS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQ2hhbmdlIHRvIHRoZSBzZWdtZW50IHdlIGFyZQotCXJlbGF4aW5nLCBpbiBjYXNlIG1kX2NvbnZlcnRfZnJhZywgY2FsbGVkIGJ5IGN2dF9mcmFnX3RvX2ZpbGwsCi0Jd2FudHMgdG8gY2FsbCBmaXhfbmV3LgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFBlcm1pdCBQQyByZWxhdGl2ZSBjb2RlIGlmIHRoZQotCXNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpcyB0aGUgY3VycmVudCBzZWdtZW50LCBub3QganVzdCBpbgotCXRleHRfc2VjdGlvbi4KLQkobWRfY29udmVydF9mcmFnXzEpOiBEb24ndCBjYWxsIHN1YnNlZ19jaGFuZ2UuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0KLVR1ZSBTZXAgMTIgMTA6MzY6NDAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hdG9mKTogRml4IGRlYnVnZ2luZyBwcmludGYsIGFuZCBsZWF2ZSBpdAotCW91dCBieSBkZWZhdWx0LgotCi1Nb24gU2VwIDExIDExOjM5OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2NvbmZpZ3VyZS5pbjogUmVtb3ZlIHVudXNlZCBmaWxlLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBHcmFiIGFsbCBhdmFpbGFibGUgc3BhY2VzIGF0IHN0YXJ0IG9mCi0JbGluZSBiZWZvcmUgcHJlc2VydmluZyBhIHNpbmdsZSBzcGFjZS4gIFJlbW92ZSBzdGF0ZSA9PSAwIHRlc3QKLQl3aGljaCB3aWxsIG5ldmVyIHN1Y2NlZWQuCi0JKiBtYWNyby5jIChtYWNyb19leHBhbmRfYm9keSk6IERlbGV0ZSBsb2NhbCB2YXJpYWJsZXMgZnJvbSB0aGUKLQlmb3JtYWwgaGFzaCB0YWJsZS4KLQkobWFjcm9fZXhwYW5kKTogSW4gTVJJIG1vZGUsIHN0b3Agd2hlbiB3aGl0ZXNwYWNlIGlzIHNlZW4gaW4gdGhlCi0JYXJndW1lbnQgbGlzdC4KLQotCSogc2IuYzogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCSogbWFjcm8uYzogTGlrZXdpc2UuICBBbHNvIGluY2x1ZGUgPHN0ZGxpYi5oPiBpZiBpdCBleGlzdHMuCi0KLUZyaSBTZXAgIDggMDA6Mjc6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJbiBNUkkgbW9kZSwga2VlcCBhIHNwYWNlIGJlZm9yZSBhCi0JcG9zc2libGUgY29tbWVudCBjaGFyYWN0ZXIuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSW4gTVJJIG1vZGUsIGlnbm9yZSBhbnl0aGluZyBhZnRlcgotCWFuIGluc3RydWN0aW9uIHdoaWNoIHRha2VzIG5vIG9wZXJhbmRzLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgZ2FzcCBpbiAkKHRvb2xkaXIpLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBhIG5vbiB6ZXJvIGJhc2UgcmVnaXN0ZXIgZm9yCi0JTV9Ve0wsU317RCxXLEh9X0EuCi0KLQkqIGdhc3AuYyAoc2hvd191c2FnZSk6IFB1dCBwcm9ncmFtX25hbWUgYXJndW1lbnQgaW4gZmlyc3QgZnByaW50ZiwKLQlub3Qgc2Vjb25kLgotCi1UaHUgU2VwICA3IDEyOjMzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSGFuZGxlIDA4IGFuZCAwOSBpbiBNUkkgbW9kZS4KLQkqIG1hY3JvLmMgKElTU0VQKTogUmVtb3ZlIGR1cGxpY2F0ZWQgYCInIGNoYXJhY3Rlci4KLSAJKGdldF9hbnlfc3RyaW5nKTogQ29weSBzb21lIGNoYXJhY3RlcnMgZm9yIHdoaWNoIElTU0VQIGlzIHRydWU6Ci0JJzsnLCAnPicsICcoJywgJyknLiAgT3RoZXJ3aXNlIHdlIGNhbiBnZXQgaW4gYW4gaW5maW5pdGUgbG9vcC4KLQkqIHJlYWQuYyAoc19zcGFjZSk6IEluIE1SSSBtb2RlLCB0aGUgZXhwcmVzc2lvbnMgc3RvcCBhdCB0aGUgZmlyc3QKLQl1bnF1b3RlZCBzcGFjZS4KLQkoY29uc193b3JrZXIpOiBJbiBNUkkgbW9kZSwgcmVzdG9yZSB0aGUgdGVybWluYXRpbmcgY2hhcmFjdGVyIGF0Ci0JdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi0KLQkqIHJlYWQuYyAoY29uc193b3JrZXIpOiBEb24ndCB1c2UgI2VsaWY7IG9sZCBjb21waWxlcnMgZG9uJ3QKLQlzdXBwb3J0IGl0LgotCi1XZWQgU2VwICA2IDIxOjEzOjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSW4gTVJJIG1vZGUsIHNpbGVudGx5IGVuZCBxdW90ZWQgc3RyaW5ncwotCWF0IG5ld2xpbmUgY2hhcmFjdGVycy4gIEluIE1SSSBtb2RlLCBhbHdheXMga2VlcCBzcGFjZXMgaW4gdGhlCi0Jb3BlcmFuZHMgZmllbGQuICBJbiBNUkkgbW9kZSwgdHJlYXQgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIGFzIGEKLQlyZWd1bGFyIGNvbW1lbnQgY2hhcmFjdGVyIGZvbGxvd2luZyBhIHNwYWNlLgotCSogY29uZC5jIChpZ25vcmVfaW5wdXQpOiBVc2Ugc3RybmNhc2VjbXAgcmF0aGVyIHRoYW4gc3RybmNtcCB3aGVuCi0JbG9va2luZyBmb3Igc3BlY2lhbCBwc2V1ZG8tb3BzLgotCSogcmVhZC5jIChjb25zX3dvcmtlcik6IEluIE1SSSBtb2RlLCB0aGUgZXhwcmVzc2lvbnMgc3RvcCBhdCB0aGUKLQlmaXJzdCB1bnF1b3RlZCBzcGFjZS4KLQkoZXF1YWxzKTogTGlrZXdpc2UuCi0KLVdlZCBTZXAgIDYgMTU6MDM6NTMgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoZ2V0X29wZXJhbmRzKTogUmVhZCB0aGlyZCBhcmcgaWYgaXQgZXhpc3RzLgotCU90aGVyd2lzZSwgY2xlYXIgaXQuCi0JKGdldF9zcGVjaWZpYywgY2FzZSBGX0ZSMCk6IEFkZC4KLQotV2VkIFNlcCAgNiAxNTowMzo1MyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChnZXRfc3BlY2lmaWMpOiBEZWxldGUgYXJnX3RvX3Rlc3QuCi0JKG1kX2Fzc2VtYmxlKTogSW5jcmVhc2Ugb3BlcmFuZCBhcnJheSBmcm9tIDIgdG8gMy4KLQotVHVlIFNlcCAgNSAxNjo0NzozNiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlbW92ZSBDWUdOVVMgTE9DQUwgY29tbWVudHMuCi0JKG1kX2JlZ2luKTogVXNlIDAvMSBpbnN0ZWFkIG9mIFRSVUUvRkFMU0UuCi0JKG1kX3Nob3dfdXNhZ2UpOiBCcmVhayB1cCBsb25nIGZvcm1hdCBzdHJpbmcgZm9yIHRoZSBiZW5lZml0Ci0Jb2YgbGFtZSBjb21waWxlcnMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zaG93X3VzYWdlKTogRGl0dG8uCi0JKiBnYXNwLmMgKHNob3dfdXNhZ2UpOiBEaXR0by4KLQkqIG1hY3JvLmMgKGNoZWNrX21hY3JvKTogQ2FzdCByZXN1bHQgb2YgaGFzaF9maW5kLgotCi1UdWUgU2VwICA1IDE0OjQ2OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFdoZW4gdGVzdGluZyBmb3IgYSBmcmVlKCkgZGVjbGFyYXRpb24gaW4gc3lzdGVtCi0JaGVhZGVyIGZpbGVzLCBjYXN0IHRoZSBhZGRyZXNzIHRvIGEgZnVuY3Rpb24gcG9pbnRlciwgbm90IHRvIGFuCi0JaW50ZWdlci4KLQotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IENhbGwgVENfSU5JVF9GSVhfREFUQSBpZiBUQ19GSVhfVFlQRQotCWlzIGRlZmluZWQuICBEb24ndCBpbml0aWFsaXplIGZ4X2Jzci4gIFZlcmlmeSB0aGF0IGZ4X3NpemUgZmllbGQKLQlpcyB3aWRlIGVub3VnaCB0byBob2xkIHN0b3JlZCB2YWx1ZS4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBDaGFuZ2UgdGNfZml4X2RhdGEgdG8gdHlwZSBUQ19GSVhfVFlQRSBpZgotCXRoYXQgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIG9taXQgaXQuICBEZWxldGUgZnhfYnNyLiAgQ2hhbmdlCi0JZnhfc2l6ZSB0byB1bnNpZ25lZCBjaGFyLgotCSogY29uZmlnL3RjLWk5NjAuaCAoVENfRklYX1RZUEUsIGZ4X2JzciwgVENfSU5JVF9GSVhfREFUQSk6IE5ldwotCW1hY3Jvcy4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChUQ19GSVhfVFlQRSwgZnhfYnNyLCBUQ19JTklUX0ZJWF9EQVRBKTogTmV3Ci0JbWFjcm9zLgotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfRklYX1RZUEUpOiBEZWZpbmUgYXMgUFRSLgotCi0JKiBjb25maWcvdGMtaTg2MC5jIChtZF9hcHBseV9maXgpOiBEZWxldGUgY29kZSBmb3IgY2hlY2tpbmcKLQlmeF9pbV9kaXNwLCBhbmQgZm9yIGhhbmRsaW5nIG5vbi16ZXJvIHZhbHVlcywgc2luY2UgaXQgbmV2ZXIgZ2V0cwotCXNldCBhZnRlciBiZWluZyBpbml0aWFsaXplZCB0byB6ZXJvLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogTWFrZSBmeF9pbV9kaXNwIGFsd2F5cyAyIGJpdHMsIHNpbmNlIHRoZQotCW9ubHkgdGMtKiBmaWxlcyBhY3R1YWxseSB1c2luZyBpdCBuZWVkIHRoYXQgbXVjaC4KLQotCU5TMzJLIGNoYW5nZXMgZnJvbSBJYW4gRGFsbDoKLQkqIGNvbmZpZ3VyZS5pbjogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAotCW5zMzJrLXBjNTMyLWxpdGVzKiBsaWtlIG5zMzJrLXBjNTMyLW5ldGJzZCouCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lIHRvIDEuCi0KLUZyaSBTZXAgIDEgMTc6MDI6MTUgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEdldCBUQ19GT1JDRV9SRUxPQ0FUSU9OIHVwIHRoZQotCXJpZ2h0IHdheSEKLQotRnJpIFNlcCAgMSAwODoyMDoxOSAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBiZWF1dHkuY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbiwgbWRfYmVnaW4sIG1kX3Nob3dfdXNhZ2UpOgotCUFkZCBzdXBwb3J0IGZvciAiLW1jcHU9dnI0MzAwIiBhcyBwcm9jZXNzb3IgaWRlbnRpZmllci4KLQotVGh1IEF1ZyAzMSAxNjo0MTowNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogUmVtb3ZlIGNoYW5nZSBvZiAyOXRoLgotCSogY29uZmlnL3RjLXtpMzg2LGFybX0uaCAoVENfRk9SQ0VfUkVMT0NBVElPTik6IEtlZXAgUlZBIHJlbG9jcy4KLQotVHVlIEF1ZyAyOSAxOTo0Mjo1OCAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCkgW2Nhc2UgUE9TVC9QUkUvQkFTRV06IEZpeCB0eXBvIHdoZW4KLSAJbG9va2luZyBhdCBvdXRlciBkaXNwbGFjZW1lbnQuICBEb24ndCBzZXQgdGhlIHBvc3RpbmRleCBiaXQgaWYgdGhlCi0gCWluZGV4IHN1cHByZXNzIGJpdCBpcyBzZXQgKGZvciBtZW1vcnkgaW5kaXJlY3QgYWRkcmVzc2luZyBtb2RlKS4KLQotVGh1IEF1ZyAzMSAwNjo0OTozNyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKHRjX2dlbl9yZWxvYyk6IERlbGV0ZSBkdXBsaWNhdGVkIGNvZGUuCi0KLVdlZCBBdWcgMzAgMjM6NTE6NTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBGcmVlIHNhdmVkX2lucHV0IHdoZW4gdGhlIGZyb20gYnVmZmVyCi0JZXhhY3RseSBmaWxscyB0aGUgdG8gYnVmZmVyLgotCi1XZWQgQXVnIDMwIDEzOjQ2OjM5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChwYXJzZV9rZXl3b3JkX2FyZywgcGFyc2VfY29uc3RfZXhwcl9hcmcpOiBOZXcgZm5zLgotCShzcGFyY19pcCk6IENhbGwgdGhlbSBmb3IgYXNpLCBtZW1iYXIsIGFuZCBwcmVmZXRjaCBwYXJzaW5nLgotCi1UdWUgQXVnIDI5IDE1OjQ1OjM3IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZW1iYXJfbWFza3MpOiBEZWxldGVkLgotCShzcGFyY19pcCk6IENsZWFuIHVwIEFTSSBhbmQgbWVtYmFyIHN1cHBvcnQuCi0KLVR1ZSBBdWcgMjkgMTM6MjA6MjcgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogUnZhIGlzIG5ldyBlbnRyeS4KLQkoY29uc193b3JrZXIpOiBOZXcsIHNwbGl0IGZyb20gY29ucy4gIEhhbmRsZXMgcnZhLgotCShjb25zLCBzX3J2YSk6IENhbGwgY29uc193b3JrZXIuCi0JKiByZWFkLmggKHNfcnZhKTogTmV3IGRlY2xhcmF0aW9uLgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IHRocm93IGF3YXkgcnZhIHJlbG9jcy4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4LCB0Y19nZW5fcmVsb2MpOiBIYW5kbGUgUlZBLgotCSogY29uZmlnL3RjLWkzODYuYyAodGNfY29mZl9maXgydHlwZSk6IEhhbmRsZSBSVkEuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19DT1VOVF9SRUxPQyk6IFJlbWVtYmVyIFJWQXMuCi0JKFRDX1JWQV9SRUxPQyk6IE5ldyBkZWZpbml0aW9uLgotCi1TdW4gQXVnIDI3IDE3OjQxOjA1IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZG9fc3dpKTogQWxsb3cgb3B0aW9uYWwgbGVhZGluZyAnIycuCi0KLVNhdCBBdWcgMjYgMTc6MjQ6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKTogSWYgVEVfREVMVEEgaXMgZGVmaW5lZCwKLQlpbmNsdWRlICcjJy4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKE5PX1BTRVVET19ET1QpOiBEZWZpbmUgaWYgVEVfREVMVEEgaXMKLQlkZWZpbmVkLgotCi0JKiBjb25maWcvdGUtZGVsdGEuaDogSW5jbHVkZSBvYmotZm9ybWF0LmguCi0JKiBjb25maWcvdGUtc2NvMzg2Lmg6IExpa2V3aXNlLgotCSogY29uZmlnL3RlLXN5c3YzMi5oOiBMaWtld2lzZS4KLQotCSogYXBwLmMgKHNjcnViX2ZpbGUpOiBSZW1vdmUuCi0JKHNjcnViX2Zyb21fZmlsZSwgc2NydWJfdG9fZmlsZSk6IFJlbW92ZS4KLQkoc2NydWJfc3RyaW5nLCBzY3J1Yl9sYXN0X3N0cmluZyk6IFJlbW92ZS4KLQkoc2NydWJfZnJvbV9zdHJpbmcsIHNjcnViX3RvX3N0cmluZyk6IFJlbW92ZS4KLQkoc2F2ZWRfaW5wdXQsIHNhdmVkX2lucHV0X2xlbik6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3QgYXBwX3NhdmVkKTogUmVtb3ZlIHNjcnViX3N0cmluZywgc2NydWJfbGFzdF9zdHJpbmcsIGFuZAotCXNjcnViX2ZpbGUgZmllbGRzLiAgQWRkIHNhdmVkX2lucHV0IGFuZCBzYXZlZF9pbnB1dF9sZW4gZmllbGRzLgotCShhcHBfcHVzaCk6IEFkanVzdCBzYXZlZCBmaWVsZHMgZm9yIGNoYW5nZXMgaW4gc3RydWN0IGFwcF9zYXZlLgotCUluaXRpYWxpemUgc3RhdGUgYW5kIHNhdmVkX2lucHV0LgotCShhcHBfcG9wKTogQWRqdXN0IHNhdmVkIGZpZWxkcyBmb3IgY2hhbmdlcyBpbiBzdHJ1Y3QgYXBwX3NhdmUuCi0JKGRvX3NjcnViX2NoYXJzKTogUmVuYW1lIGZyb20gZG9fc2NydWJfbmV4dF9jaGFyIGFuZCByZXdyaXRlIHRvCi0JcHJvY2VzcyBhIGJ1ZmZlciBhdCBhIHRpbWUgcmF0aGVyIHRoYW4gYSBjaGFyYWN0ZXIgYXQgYSB0aW1lLgotCShtYWluLCBhc193YXJuKTogUmVtb3ZlIG9ic29sZXRlIHRlc3RpbmcgY29kZS4KLQkqIGFzLmggKGRvX3NjcnViX25leHRfY2hhcik6IERvbid0IGRlY2xhcmUuCi0JKGRvX3NjcnViX2NoYXJzKTogRGVjbGFyZS4KLQkoc2NydWJfZnJvbV9maWxlLCBzY3J1Yl9mcm9tX3N0cmluZyk6IERvbid0IGRlY2xhcmUuCi0JKHNjcnViX3RvX2ZpbGUsIHNjcnViX3RvX3N0cmluZyk6IERvbid0IGRlY2xhcmUuCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfZ2V0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKTogQ2FsbCBkb19zY3J1Yl9jaGFycyByYXRoZXIgdGhhbgotCWRvX3NjcnViX25leHRfY2hhci4KLQkqIHJlYWQuYyAoc2NydWJfc3RyaW5nLCBzY3J1Yl9zdHJpbmdfZW5kKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHNjcnViX2Zyb21fc3RyaW5nKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCBkb19zY3J1Yl9jaGFycyByYXRoZXIgdGhhbgotCWRvX3NjcnViX25leHRfY2hhci4KLQotVGh1IEF1ZyAyNCAxODo1MDoxOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAoYXNfYWJvcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBzYi5jIChzYl9idWlsZCk6IFJldmVydCB5ZXN0ZXJkYXkncyBwYXRjaC4KLQotCSogTWFrZWZpbGUuaW4gKGdhc3AubmV3KTogRGVwZW5kIHVwb24gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hLgotCUp1c3QgbGluayBhZ2FpbnN0IGxpYmliZXJ0eSwgbm90IGFnYWluc3QgJChMSUJTKS4KLQotV2VkIEF1ZyAyMyAxNToxODoyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNiLmMgKHNiX2J1aWxkKTogVW5kZWZpbmUgYWJvcnQgYmVmb3JlIGNhbGxpbmcgaXQsIHNpbmNlIGdhc3AKLQlkb2VzIG5vdCBwcm92aWRlIGFzX2Fib3J0LgotCi1XZWQgQXVnIDIzIDEwOjQwOjQxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChzZXRfdGFyZ2V0X2VuZGlhbik6IE5ldyBzdGF0aWMgdG8gc2F5IHdoZXRoZXIKLQl3ZSd2ZSBpbml0aWFsaXplZCB0YXJnZXRfYmlnX2VuZGlhbiBvciBub3QuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBzZXRfdGFyZ2V0X2VuZGlhbiBpZiB3ZSBzZXQgdGhlIHZhcmlhYmxlCi0JdGFyZ2V0X2JpZ19lbmRpYW4uCi0JKG1kX2JlZ2luKTogT25seSBzZXQgdGFyZ2V0X2JpZ19lbmRpYW4gaWYgIXNldF90YXJnZXRfZW5kaWFuLgotCi1UdWUgQXVnIDIyIDAzOjAwOjMzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVNhdCBBdWcgMTkgMTg6MDg6MTYgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERTVF9TX0NfU1JDX1NFVFJFQ19XLCBEU1RfU19DX1NSQ19ERUZMSU5FU19CKToKLQlOZXcgbWFjcm9zLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uLAotCVZNU19UQlRfU291cmNlX0xpbmVzKTogTWFrZSB0cmFjZWJhY2sgaW5mbyBiZSByb2J1c3QgZW5vdWdoIHRvCi0JaGFuZGxlIGh1Z2Ugc291cmNlIGZpbGVzLgotCShWTVNfVEJUX1NvdXJjZV9GaWxlKTogUmVvcmdhbml6ZSB0aGUgbmF0aXZlLSB2cyBjcm9zcy1hc3NlbWJseQotCXN1cHBvcnQgc28gdGhhdCBhY3R1YWwgb2JqZWN0IGZpbGUgb3V0cHV0IGlzIGNsZWFyZXIuCi0JKFZNU19UQlRfU291cmNlX0ZpbGU6IEZhYiwgTmFtLCBEYXRlX1hhYiwgRmlsZV9IZWFkZXJfWGFiKToKLQlSZXBsYWNlIHN0YXRpYyB2YXJpYWJsZXMgd2l0aCBhdXRvbWF0aWMgb25lcy4KLQotCVNhdCBBdWcgMTIgMjA6MTg6MTUgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKE1vZHVsZV9OYW1lKTogbmV3IGZpbGUgc2NvcGUgdmFyaWFibGUuCi0JKFZNU19UQlRfTW9kdWxlX0JlZ2luKTogdXNlIGl0IGluc3RlYWQgb2YgbG9jYWwgdmFyaWFibGUuCi0JKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IGRpdHRvOyBhc3NpZ24gaXRzIHZhbHVlIGhlcmUuCi0JKFdyaXRlX1ZNU19FT01fUmVjb3JkKTogc2Vjb25kIGFyZ3VtZW50IGhhcyB0eXBlIHZhbHVlVC4KLQkoVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSk6ICBzaW1wbGlmeSBzZWFyY2ggbG9vcDsgcmV0dXJuCi0JdHlwZSBpcyBvZmZzZXRUOyBzZWNvbmQgYXJndW1lbnQgaXMgdW5zaWduZWQuCi0KLQlTYXQgSnVuIDE3IDE5OjA1OjI1IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBtZXNzYWdlcy5jIChhc19wZXJyb3IpOiBVc2UgeHN0cmVycm9yIGluc3RlYWQgb2Ygc3RyZXJyb3IuCi0KLU1vbiBBdWcgMjEgMTM6NTc6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQWNjZXB0IC0tZGVmc3ltIFNZTT1WQUxVRS4KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMuMTogRG9jdW1lbnQgLS1kZWZzeW0uCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTVJJIG1vZGUsIGRvbid0IGVuZCB0aGUKLQlzdGF0ZW1lbnQgaW5zaWRlIGEgcXVvdGF0aW9uLgotCShzX3NwYWNlKTogRG9uJ3Qgd2FybiBhYm91dCBhIHplcm8gcmVwZWF0IGNvdW50IGluIE1SSSBtb2RlLgotCSogY29uZmlnL3RjLW02OGsuYyAoY3JhY2tfb3BlcmFuZCk6IEluIE1SSSBtb2RlLCBkb24ndCBjb3VudAotCXBhcmVudGhlc2VzIGluc2lkZSBxdW90ZXMuCi0JKG1kX2Fzc2VtYmxlKTogSW4gTVJJIG1vZGUsIGFueXRoaW5nIGFmdGVyIHRoZSBvcGVyYW5kcyBmaWVsZCBpcyBhCi0JY29tbWVudC4KLQkocGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IEFkanVzdCBzdGFydCBhbmQgc3RvcCB0byByZW1vdmUKLQlzcGFjZXMuCi0JKHNfbXJpX2Zvcik6IExpa2V3aXNlLgotCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBSZXN0b3JlIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHN5bWJvbCBuYW1lLAotCWluIGNhc2UgaXQgaXMgYSBuZXdsaW5lLgotCShzX2lmKTogSWYgaWdub3JpbmcgdGhlIGN1cnJlbnQgdHJlZSwgZG9uJ3QgdHJ5IHRvIHBhcnNlIHRoZQotCWV4cHJlc3Npb24uCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBMRVhfSVNfU1RSSU5HUVVPVEUgb3IKLQlMRVhfSVNfT05FQ0hBUl9RVU9URSBpcyBzZWVuIGluCXN0YXRlIDEwLCBwcmVzZXJ2ZSBvbmUgc3BhY2UuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBpcnAsIGlycGMsIG1hY3JvLCBhbmQgcmVwdC4gTVJJIG1vZGUKLQlub3cgc3VwcG9ydHMgbWFjcm9zLCBpZmMsIGlmbmMsIGlycCwgaXJwYywgcmVwdCwgYW5kIGVuZHIsIHdpdGhvdXQKLQl1c2luZyBnYXNwLgotCi0JQWRkIHN1cHBvcnQgZm9yIG1hY3Jvcy4KLQkqIGFzLmM6IEluY2x1ZGUgc2IuaCBhbmQgbWFjcm8uaC4KLQkobWF4X21hY3JvX25leHQpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShtYWluKTogQ2FsbCBtYWNyb19pbml0LgotCShtYWNyb19leHByKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGFzLmggKG1heF9tYWNyb19uZXN0KTogRGVjbGFyZS4KLQkqIHJlYWQuYyAobGluZV9sYWJlbCk6IFJlbmFtZSBmcm9tIG1yaV9saW5lX2xhYmVsLiAgQ2hhbmdlIGFsbAotCXVzZXMuCi0JKHBvdGFibGUpOiBBZGQgZXhpdG0sIGlycCwgaXJwYywgbWFjcm8sIG1leGl0LCByZXB0LgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBBbHdheXMgY2xlYXIgbGluZV9sYWJlbCBhdCB0aGUgc3RhcnQgb2YgYQotCWxpbmUsIG5vdCBqdXN0IHdoZW4gZmxhZ19tcmkgb3IgTEFCRUxTX1dJVEhPVVRfQ09MT05TLiAgRml4Ci0JTVJJL0xBQkVMU19XSVRIT1VUX0NPTE9OUyBoYW5kbGluZy4gIEluIE1SSSBtb2RlLCBwZXJtaXQgbGFiZWw6Ci0JZXF1IHZhbC4gIFNldCBsaW5lX2xhYmVsIHdoZW4gY2FsbGluZyBjb2xvbi4gIEluIE1SSSBtb2RlLCBhCi0JbGVhZGluZyAnLicgZG9lcyBub3QgaW1wbHkgYSBwc2V1ZG8tb3AuICBDaGVjayBmb3IgbWFjcm8gZXhwYW5zaW9uCi0JYmVmb3JlIGNhbGxpbmcgbWRfYXNzZW1ibGUuCi0JKHNfaXJwKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfbGluZV9zYik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNfbWFjcm8pOiBOZXcgZnVuY3Rpb24uCi0JKHNfbWV4aXQpOiBOZXcgZnVuY3Rpb24uCi0JKHNfcmVwdCk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAobGluZV9sYWJlbCk6IFJlbmFtZSBmcm9tIG1yaV9saW5lX2xhYmVsLgotCShzX2lycCwgc19yZXB0KTogRGVjbGFyZS4KLQkoc19tYWNybywgc19tZXhpdCk6IERlY2xhcmUuCi0JKiBpbnB1dC1zY3J1Yi5jOiBJbmNsdWRlIHNiLmguCi0JKHNiX2luZGV4LCBmcm9tX3NiKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKG1hY3JvX25lc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzdHJ1Y3QgaW5wdXRfc2F2ZSk6IEFkZCBzYl9pbmRleCBhbmQgZnJvbV9zYiBmaWVsZHMuICBDaGFuZ2UKLQluZXh0X3NhdmVkX2ZpbGUgZmllbGQgdG8gYmUgc3RydWN0IGlucHV0X3NhdmUgKi4KLQkobmV4dF9zYXZlZF9maWxlKTogQ2hhbmdlZCB0byBiZSBzdHJ1Y3QgaW5wdXRfc2F2ZSAqLgotCShpbnB1dF9zY3J1Yl9wdXNoKTogQ2hhbmdlIHRvIHJldHVybiB0eXBlIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JU2F2ZSBzYl9pbmRleCBhbmQgZnJvbV9zYi4KLQkoaW5wdXRfc2NydWJfcG9wKTogQ2hhbmdlIHBhcmFtZXRlciB0eXBlIHRvIHN0cnVjdCBpbnB1dF9zYXZlICouCi0JUmVzdG9yZSBzYl9pbmRleCBhbmQgZnJvbV9zYi4KLQkoaW5wdXRfc2NydWJfaW5jbHVkZV9zYik6IE5ldyBmdW5jdGlvbi4KLQkoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBIYW5kbGUgcmVhZGluZyBmcm9tIGZyb21fc2IuCi0JKGJ1bXBfbGluZV9jb3VudGVycyk6IE9ubHkgaW5jcmVtZW50IGxpbmVzIGlmIG5vdCB1c2luZyBmcm9tX3NiLgotCSogY29uZmlnL3RjLW02OGsuYyAob3B0X3RhYmxlKTogQWRkIG5lc3QuCi0JKG9wdF9uZXN0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGdhc3AuYzogSW5jbHVkZSBzYi5oIGFuZCBtYWNyby5oLiAgTW92ZSBhbGwgc2IgcmVsYXRlZCBmdW5jdGlvbnMKLQlhbmQgZGVmaW5pdGlvbnMgdG8gc2IuaCBhbmQgc2IuYy4gIE1vdmUgYWxsIG1hY3JvIHJlbGF0ZWQKLQlmdW5jdGlvbnMgYW5kIGRlZmluaXRpb25zIHRvIG1hY3JvLmggYW5kIG1hY3JvLmMuCi0JKiBzYi5oLCBzYi5jOiBOZXcgZmlsZXMsIGV4dHJhY3RlZCBmcm9tIGdhc3AuYy4KLQkqIG1hY3JvLmgsIG1hY3JvLmM6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKE9CSlMpOiBBZGQgc2IubyBhbmQgbWFjcm8ubwotCShHQVNQT0JKUyk6IERlZmluZS4KLQkoZ2FzcC5uZXcpOiBEZXBlbmQgdXBvbiAkKEdBU1BPQkpTKS4gIFVzZSAkKEdBU1BPQkpTKSB0byBsaW5rLgotCShUQVJHX0NQVV9ERVBfbTY4ayk6IERlcGVuZCB1cG9uIHN1YnNlZ3MuaC4KLQkoZ2FzcC5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KLQkoc2Iubyk6IE5ldyB0YXJnZXQuCi0JKG1hY3JvLm8pOiBOZXcgdGFyZ2V0LgotCShhcy5vKTogRGVwZW5kIHVwb24gc2IuaCBhbmQgbWFjcm8uaC4KLQkoaW5wdXQtc2NydWIubyk6IERlcGVuZCB1cG9uIHNiLmguCi0JKHJlYWQubyk6IERlcGVuZCB1cG9uIHNiLmggYW5kIG1hY3JvLmguCi0KLQkqIGNvbmQuYyAoZ2V0X21yaV9zdHJpbmcpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX2lmYyk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBpZmMgYW5kIGlmbmMuCi0JKiByZWFkLmggKHNfaWZjKTogRGVjbGFyZS4KLQotCSogYXBwLmMgKGRvX3NjcnViX2JlZ2luKTogSW4gTVJJIG1vZGUsIHNldCBsZXggb2YgJyB0bwotCUxFWF9JU19TVFJJTkdRVU9URS4KLQotTW9uIEF1ZyAyMSAxMzo0MTozMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hc3NlbWJsZSk6IEFsbG93IEBIQSwgQEwsIGFuZCBASCBzdWZmaXhlcyBvbgotCWNvbnN0YW50IGV4cHJlc3Npb25zLgotCi1TdW4gQXVnIDIwIDE1OjU0OjM3IDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9yZWxvY19zaXplKTogQWRkIGNvbnN0IHRvIGRlY2xhcmF0aW9uLgotCi1GcmkgQXVnIDE4IDEwOjU4OjA5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgZXhwZWN0IHF1b3RlcyBhcm91bmQgdGhlCi0JZmlsZSBuYW1lLgotCSogbGlzdGluZy5jIChsaXN0aW5nX3RpdGxlKTogRG9uJ3QgcmVxdWlyZSB0aGUgdGl0bGUgdG8gYmUgcXVvdGVkLgotCi0JKiBnYXNwLmMgKGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSk6IEFsd2F5cyBzdWJ0cmFjdCAxIGZyb20KLQlsaW5lY291bnQgYmVmb3JlIHByaW50aW5nIGl0LgotCShwcm9jZXNzX2ZpbGUpOiBJbiBNUkkgbW9kZSwgbGluZXMgYmVnaW5uaW5nIHdpdGggJyonIG9yICchJyBhcmUKLQljb21tZW50cy4KLQkoZG9fcmVnKTogSW4gTVJJIG1vZGUsIGRvbid0IHJlcXVpcmUgcGFyZW50aGVzZXMuCi0JKGRvX2luY2x1ZGUpOiBJbiBNUkkgbW9kZSwgZG9uJ3QgcmVxdWlyZXMgcXVvdGVzLiAgSWYgdGhlIGZpbGUgY2FuCi0Jbm90IGJlIGZvdW5kIGluIHRoZSBpbmNsdWRlIHBhdGgsIHRyeSBvcGVuaW5nIGl0IGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LiAgUHJpbnQgdGhlIGZpbGUgbmFtZSBjb3JyZWN0bHkgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0JKGNoYXJ0eXBlX2luaXQpOiBJbiBNUkkgbW9kZSwgc2V0IEZJUlNUQklUIGZvciAnLicuCi0JKG1haW4pOiBTZXQgY29tbWVudF9jaGFyIHRvICc7JyB3aGVuIGVudGVyaW5nIE1SSSBtb2RlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkobTY4a19pcCk6IFBhc3MgNjQgcmF0aGVyIHRoYW4gLTEgdG8gYWRkX0ZpeCBpbiAnQicgJ0InIGNhc2UuCi0JKG1kX3BjcmVsX2Zyb20pOiBJZiBmeF9wY3JlbF9hZGp1c3QgaXMgNjQsIHVzZSAtMSBpbnN0ZWFkLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBGb3IgT0JKX0FPVVQgY2FzZSwgYWRqdXN0Ci0JQkZEX1JFTE9DXzE2IGFuZCBCRkRfUkVMT0NfMzIgcmVsb2NzLgotCi1XZWQgQXVnIDE2IDE0OjQ4OjQ0IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoYWxsb2NhKTogVXNlIHZvaWQqIGRlY2xhcmF0aW9uIG9uIEhQL1VYLgotCi1XZWQgQXVnIDE2IDEyOjQ5OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IElmIFBJQywgb25seSBjaGFuZ2UgUENSRUxfUzIKLQl0byBXUExUMzAgZm9yIGFuIHVuZGVmaW5lZCBvciBleHRlcm5hbCBzeW1ib2wuICBEb24ndCBjb25zaWRlcgotCVBDMTAgb3IgUEMyMiB0byBiZSBhIFBDIHJlbGF0aXZlIHJlbG9jIHdoZW4gY2hvb3NpbmcgYmV0d2VlbgotCWZ4X2FkZG51bWJlciBhbmQgZnhfb2Zmc2V0LgotCi0JKiBjb25maWcvdGMtejhrLmMgKG1kX251bWJlcl90b19jaGFycyk6IERvbid0IGRvIGl0IGhlcmUsIGNhbGwKLQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuLgotCSogY29uZmlnL3RjLXo4ay5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogQWRkIHN1cHBvcnQgZm9yIC5zdGFydG9mLiBhbmQgLnNpemVvZi4gYnkKLQl1c2luZyBtYWdpYyBzeW1ib2wgbmFtZXMgd2hpY2ggdGhlIGxpbmtlciB3aWxsIHJlY29nbml6ZQotCXNwZWNpYWxseS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBUYWtlIG91dCBub3RlIHRoYXQgLnN0YXJ0b2YuIGFuZCAuc2l6ZW9mLiBhcmUKLQlub3Qgc3VwcG9ydGVkLgotCi1UdWUgQXVnIDE1IDE1OjA4OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wKLQlkaXJlY3RpdmVzOiBpZiwgaWYuYiwgaWYudywgaWYubCwgZWxzZSwgZWxzZS5zLCBlbHNlLmwsIGVuZGksCi0JYnJlYWssIGJyZWFrLnMsIGJyZWFrLmwsIG5leHQsIG5leHQucywgbmV4dC5sLCBmb3IsIGZvci5iLCBmb3IudywKLQlmb3IubCwgZW5kZiwgcmVwZWF0LCB1bnRpbCwgdW50aWwuYiwgdW50aWwudywgdW50aWwubCwgd2hpbGUsCi0Jd2hpbGUuYiwgd2hpbGUudywgd2hpbGUubCwgZW5kdy4KLQkoZW51bSBtcmlfY29udHJvbF90eXBlKTogRGVmaW5lLgotCShzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyk6IERlZmluZS4KLQkobXJpX2NvbnRyb2xfc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfY29udHJvbF9pbmRleCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1yaV9jb250cm9sX2xhYmVsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHVzaF9tcmlfY29udHJvbCwgcG9wX21yaV9jb250cm9sKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHBhcnNlX21yaV9jb25kaXRpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3dhcF9tcmlfY29uZGl0aW9uLCByZXZlcnNlX21yaV9jb25kaXRpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX21yaV9pZiwgc19tcmlfZWxzZSwgc19tcmlfZW5kaSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV9icmVhaywgc19tcmlfbmV4dCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV9mb3IsIHNfbXJpX2VuZGYpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19tcmlfcmVwZWF0LCBzX21yaV91bnRpbCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShzX21yaV93aGlsZSwgc19tcmlfZW5kdyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCSogZ2FzcC5jIChtcmlraW5mbyk6IFJlbW92ZSBJRi4KLQkqIGV4cHIuYyAoZ2V0X3N5bWJvbF9lbmQpOiBBY2NlcHQgXDAwMSBhcyBwYXJ0IG9mIGEgbmFtZS4KLQotCSogc3ltYm9scy5jIChjb2xvbik6IENoYW5nZSBwYXJhbWV0ZXIgdG8gY29uc3QgY2hhciAqLgotCSogc3ltYm9scy5oIChjb2xvbik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotTW9uIEF1ZyAxNCAyMDo1MTo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQWx3YXlzIGRvIGl0IHRoZSBCRkRfRkFTVF9TRUNUSU9OX0ZJTEwKLQl3YXkuICBSZWZvcm1hdCBhbmQgcmVpbmRlbnQgdGhhdCBjb2RlIHRvIEdOVSBzdGFuZGFyZHMuCi0JKEJGRF9GQVNUX1NFQ1RJT05fRklMTCk6IERvbid0IGRlZmluZS4KLQotTW9uIEF1ZyAxNCAxNDowODowNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRG9uJ3QgdHJ5IHRvIGFwcGx5IEJFR0lOX0JSVEFCCi0Jb3IgRU5EX0JSVEFCIGZpeHVwcy4KLQotTW9uIEF1ZyAxNCAxNTo0NTowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAoZG9fYWxpZ24sIGdldF9hbnlfc3RyaW5nKTogTWFyayBhcyBzdGF0aWMuCi0JKGRvX2Fzc2lnbmEsIGRvX2Fzc2lnbmMsIG5ld19maWxlKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfcmVnKTogUmVuYW1lIGxvY2FsIG9wIHRvIHJvcCB0byBhdm9pZAotCWNvbmZ1c2lvbiB3aXRoIG1hY3JvIG9wLgotCi0JKiBnYXNwLmMgKHN0cmlwX2NvbW1lbnRzKTogQ29tbWVudCBvdXQ7IGl0J3Mgbm90IHVzZWQuCi0JKGRvX2VuZCk6IEFkZCBwYXJhbWV0ZXIuICBJbiBNUkkgbW9kZSwgcHJpbnQgaXQgb3V0LgotCShkb19pcnApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzdWJfYWN0dWFsKTogQ2hhbmdlIHBhcmFtZXRlciBtIHRvIGZvcm1hbF9oYXNoLCBjaGFuZ2luZyB0eXBlCi0JZnJvbSBtYWNyb19lbnRyeWggKiB0byBoYXNoX3RhYmxlICouCi0JKG1hY3JvX2V4cGFuZF9ib2R5KTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZgotCW1hY3JvX2V4cGFuZC4KLQkobWFjcm9fZXhwYW5kKTogQ2FsbCBtYWNyb19leHBhbmRfYm9keS4KLQkoS18qKTogRnVsbHkgcGFyZW50aGVzaXplLgotCShLX0lSUCwgS19JUlBDKTogRGVmaW5lLgotCShtcmlraW5mbyk6IEFkZCBJUlAgYW5kIElSUEMuCi0JKHByb2Nlc3NfcHNldWRvX29wKTogSW4gTVJJIG1vZGUsIHByaW50IG91dCBFTkQgcHNldWRvLW9wLiAgUGFzcwotCWxpbmUgdG8gZG9fZW5kLiAgSGFuZGxlIEtfSVJQIGFuZCBLX0lSUEMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNfb3B0KTogUmVzZXQgKmlucHV0X2xpbmVfcG9pbnRlciBldmVuIGlmIHdlCi0JZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgb3B0aW9uLgotCi1TdW4gQXVnIDEzIDE3OjAzOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IEhhbmRsZSBhYnNvbHV0ZV9zZWN0aW9uLgotCSogd3JpdGUuYyAocmVjb3JkX2FsaWdubWVudCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZCk6IFNraXAgaW5zbnMgd2l0aCBhbiBpbmFwcHJvcHJpYXRlCi0JSVNBIGxldmVsLgotCi1TdW4gQXVnIDEzIDAwOjM1OjAyIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cmllcyBmb3IKLQkiYmVnaW5fYnJ0YWIiIGFuZCAiZW5kX2JydGFiIiBwc2V1ZG8tb3BzLgotCShwYV9icnRhYik6IE5ldyBmdW5jdGlvbi4KLQkodGNfZ2VuX3JlbG9jLCBTT00gdmVyc2lvbik6IEhhbmRsZSBSX0JFR0lOX0JSVEFCIGFuZCBSX0VORF9CUlRBQi4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NhdGlvbnMgZm9yIEJSVEFCIGZpeHVwcwotCXdoZW4gT0JKX1NPTSBpcyBkZWZpbmVkLgotCi1GcmkgQXVnIDExIDIwOjM0OjA1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRFX09CSlMpOiBBZGQgZW1wdHkgZGVmaW5pdGlvbi4KLQotRnJpIEF1ZyAxMSAxOToxNjowOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAoY2hhbmdlX2Jhc2UpOiBEb24ndCB0cmVhdCAnIHNwZWNpYWxseSBpbiBNUkkgbW9kZS4KLQkocHJvY2Vzc19maWxlKTogRG9uJ3Qgd2FybiBhYm91dCBtaXNzaW5nIEVORCBpbiBNUkkgbW9kZS4KLQkoZG9faWYpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnZXRfbXJpX3N0cmluZywgZG9faWZjKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0JKGJ1ZmZlcl9hbmRfbmVzdCk6IFRyZWF0IE1SSSBtb2RlIGxpa2UgYWx0ZXJuYXRlIHN5bnRheCBtb2RlLgotCShkb19hZW5kcik6IENoYW5nZSBlcnJvciBtZXNzYWdlIGluIE1SSSBtb2RlLgotCShkb19hcmVwZWF0KTogVXNlIFJFUFQvRU5EUiBpbiBNUkkgbW9kZS4KLQkoZG9fZm9ybWFscyk6IEluIE1SSSBtb2RlLCBhZGQgc3BlY2lhbCBOQVJHIGZvcm1hbC4KLQkobWFjcm9fZXhwYW5kKTogVmFyaW91cyBjaGFuZ2VzIGZvciBNUkkgbW9kZTogcGVybWl0IGEgcXVhbGlmaWVyCi0Jb24gdGhlIG1hY3JvIG5hbWU7IHNldCBzcGVjaWFsIE5BUkcgZm9ybWFsOyBwZXJtaXQgdW5uYW1lZAotCXBvc2l0aW9uYWwgYXJndW1lbnRzOyB1c2UgJiYgdG8gY29uY2F0ZW5hdGUgbmFtZWQgcGFyYW1ldGVyczsKLQlwZXJtaXQgXGQgdG8gc3BlY2lmeSBhbiB1bm5hbWVkIHBhcmFtZXRlcjsgcGVybWl0IG5hbWVkIHBhcmFtZXRlcnMKLQl0byBub3Qgc3RhcnQgd2l0aCBcOyB1c2UgPT0gdG8gc2VlIGlmIGEgcGFyYW1ldGVyIGV4aXN0cy4KLQkoZ2V0c3RyaW5nKTogSW4gTVJJIG1vZGUsIGFsbG93IDw+IHRvIHF1b3RlIGEgc3RyaW5nLgotCShLX0lGRVEsIEtfSUZORSwgS19JRkxULCBLX0lGTEUsIEtfSUZHRSwgS19JRkdUKTogRGVmaW5lLgotCShLX0lGQywgS19JRk5DKTogRGVmaW5lLgotCShzdHJ1Y3Qga2V5d29yZCk6IE5hbWUgc3RydWN0dXJlIHVzZWQgaW4ga2luZm8gYXJyYXkuCi0JKG1yaWtpbmZvKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiBEb24ndCByZXF1aXJlIGxlYWRpbmcgJy4nIGluIE1SSSBtb2RlLgotCUhhbmRsZSBuZXcgTVJJIHBzZXVkby1vcCBkZWZpbml0aW9ucy4KLQkoYWRkX2tleXdvcmQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mIHByb2Nlc3NfaW5pdC4KLQkocHJvY2Vzc19pbml0KTogVXNlIGFkZF9rZXl3b3JkLiAgSW4gTVJJIG1vZGUsIGFkZCBtcmlraW5mbyB0YWJsZS4KLQkobG9uZ19vcHRpb25zKTogQWRkICJtcmkiLgotCShzaG93X3VzYWdlKTogTWVudGlvbiAtTS8tLW1yaS4KLQkobWFpbik6IENhbGwgcHJvY2Vzc19pbml0IGFmdGVyIHByb2Nlc3NpbmcgYXJndW1lbnRzLiAgSGFuZGxlIC1NLgotCSogZG9jL2dhc3AudGV4aTogRG9jdW1lbnQgLU0vLS1tcmkuCi0KLQkqIGdhc3AuYzogSW5jbHVkZSBhbnNpZGVjbC5oLiAgTWFrZSBhbGwgbG9jYWwgZnVuY3Rpb25zIHN0YXRpYy4KLSAgICAgICAgQWRkIHByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLgotCShtcmkpOiBOZXcgZ2xvYmFsIHZhcmlhYmxlLgotCShzYl9hZGRfY2hhcik6IENoYW5nZSBwYXJhbWV0ZXIgYyBmcm9tIGNoYXIgdG8gaW50LgotCShzYl9hZGRfc3RyaW5nKTogTWFrZSBwYXJhbWV0ZXIgcyBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQkoc2JfYWRkX2J1ZmZlcik6IExpa2V3aXNlLgotCShjaGVja2NvbnN0KTogQ2hhbmdlIHBhcmFtZXRlciBvcCBmcm9tIGNoYXIgdG8gaW50LgotCShleHBfZ2V0X2Ficyk6IE1ha2UgcGFyYW1ldGVyIGVtc2cgaW50byBhIGNvbnN0IHBvaW50ZXIuCi0JKGRvX3Jlcyk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZSBmcm9tIGNoYXIgdG8gaW50LgotCShidWZmZXJfYW5kX25lc3QpOiBNYWtlIHBhcmFtZXRlcnMgZnJvbSBhbmQgdG8gaW50byBjb25zdAotCXBvaW50ZXJzLgotCShkb19zZGF0YSk6IENoYW5nZSBwYXJhbWV0ZXIgdHlwZSBmcm9tIGNoYXIgdG8gaW50LgotCShuZXdfZmlsZSk6IE1ha2UgcGFyYW1ldGVyIG5hbWUgaW50byBhIGNvbnN0IHBvaW50ZXIuCi0JKGRvX2RlZmluZSk6IE1ha2UgcGFyYW1ldGVyIHN0cmluZyBpbnRvIGEgY29uc3QgcG9pbnRlci4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX251bWJlcl90b19jaGFycyk6IERvbid0IGRvIGl0IGhlcmUsIGNhbGwKLQludW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCi1GcmkgQXVnIDExIDEzOjIzOjU2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIG5ldyBmaWVsZCBmeF9ub19vdmVyZmxvdy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IElmIGZ4X25vX292ZXJmbG93IGlzIG5vbi16ZXJvLCBkb24ndAotCWNvbXBsYWluIGlmIHRoZSBhZGRlbmQgaXMgdG9vIGxhcmdlLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogU2V0IGZ4X25vX292ZXJmbG93IGlmIHRoZSBoYWxmCi0Jd29yZCByZWxvY2F0aW9ucyBCRkRfUkVMT0Nfe0xPMTYsSEkxNixISTE2X1N9LgotCi1UaHUgQXVnIDEwIDIwOjU2OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbXJpX3NlY3QpIFtCRkRfQVNTRU1CTEVSXTogRml4IHR5cG9zIGluIGNob29zaW5nIGFuZAotCXNldHRpbmcgc2VjdGlvbiBmbGFncy4KLQotVGh1IEF1ZyAxMCAwMDozODoxMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLQkqIGRvYy9hcy4xOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IFdoZW4gcmVjb2duaXppbmcgJyMnLCB1c2UgaXNieXRlIGFuZAotCWl3b3JkIHJhdGhlciB0aGFuIGV4cHI4IGFuZCBleHByMTYuICBXaGVuIHJlY29nbml6aW5nICdNJywgdXNlCi0JaXNzYnl0ZSByYXRoZXIgdGhhbiBleHByOC4gIFdoZW4gcmVjb2duaXppbmcgJ1EnIGFuZCAndCcsIGp1c3QKLQljaGVjayBmb3IgT19jb25zdGFudCByYXRoZXIgdGhhbiB1c2luZyBleHByOC4KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLmggKGV4cHI4LCBleHByMTYpOiBEb24ndCBkZWZpbmUuCi0JKiBNYWtlZmlsZS5pbiAobTY4ay1wYXJzZS5vKTogRGVwZW5kIHVwb24gbTY4ay1wYXJzZS5oLCBub3QKLQltNjhrLXBhcnNlLnkuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBzcGMsIHR0bCwgeGNvbSwgeHJlZi4KLQkoc19tcmlfc2VjdCk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAoc19tcmlfc2VjdCk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfc2VjdGlvbikgKGJvdGggdmVyc2lvbnMpOiBJbiBNUkkKLQltb2RlLCBjYWxsIHNfbXJpX3NlY3QuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBBZGQgc2VjdC5zIGFuZCBzZWN0aW9uLnMuICBNb3ZlIHNlY3Qgb3V0c2lkZQotCW9mIGlmbmRlZiBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCBzZWN0aW9uLnMsIHNlY3QsCi0Jc2VjdC5zLgotCShvYmpfZWxmX3NlY3Rpb24pOiBJbiBNUkkgbW9kZSwgY2FsbCBzX21yaV9zZWN0LgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIHJlc3RvcmUsIHNhdmUuCi0JKHN0cnVjdCBzYXZlX29wdHMpOiBEZWZpbmUuCi0JKHNhdmVfc3RhY2spOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3NhdmUsIHNfcmVzdG9yZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCi0JKiByZWFkLmMgKHNfc2V0KTogUmVtb3ZlIHVudXNlZCBsb2NhbCBwdHIuCi0JKGhleF9mbG9hdCk6IENoZWNrIHRhcmdldF9iaWdfZW5kaWFuLgotCShlcXVhbHMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHAuCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWhwcGEuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTg2MC5oIChUQVJHRVRfQllURVNfQklHX0VORElBTik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW04OGsuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtdGFob2UuaCAoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc2guYyAobGl0dGxlKTogU2V0IHRhcmdldF9iaWdfZW5kaWFuLgotCShtZF9iZWdpbik6IExpa2V3aXNlLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkoYnVpbGRfcmVsYXgpOiBDaGVjayB0YXJnZXRfYmlnX2VuZGlhbiByYXRoZXIgdGhhbiBzaGwuCi0JKGJ1aWxkX015dGVzLCBtZF9hdG9mKTogTGlrZXdpc2UuCi0JKG1kX2NvbnZlcnRfZnJhZywgbWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKG1kX251bWJlcl90b19jaGFycyk6IExpa2V3aXNlLgotCQotV2VkIEF1ZyAgOSAxMDo1MTo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfYWJzcGNhZGQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtNjhrX3F1aWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobTY4a19yZWwzMik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBvcHQgYW5kIHJlZy4KLQkobTY4a19pcCk6IFBlcm1pdCBhYnNvbHV0ZSBzeW1ib2xzIGluICdsJy8nTCcgcmVjb2duaXRpb24uICBDaGVjawotCW02OGtfcXVpY2sgaW4gJ00nIGFuZCAnUScgcmVjb2duaXRpb24uICBDaGVjayBtNjhrX2Fic3BjYWRkIGluCi0JRElTUCBoYW5kbGluZy4gIENoZWNrIG02OGtfcmVsMzIgaW4gQkFTRS9QT1NUL1BSRSBoYW5kbGluZy4KLQkobWRfYmVnaW4pOiBJbiBNUkkgbW9kZSwgaW5pdGlhbGl6ZSBtNjhrX2Fic3BjYWRkIGFuZCBtNjhrX3JlbDMyLgotCUluIE1SSSBtb2RlLCBjaGFuZ2UgdW5zaXplZCBicmFuY2ggYWxpYXNlcyB0byBiZSB2YXJpYWJsZSBzaXplZC4KLQkoc3RydWN0IG9wdF9hY3Rpb24pOiBEZWZpbmUuCi0JKG9wdF90YWJsZSk6IERlZmluZS4KLQkoc19vcHQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShza2lwX3RvX2NvbW1hKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3B0X2NoaXApOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShvcHRfbGlzdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKG9wdF9saXN0X3N5bWJvbHMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX3JlZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBhcy5oIChmbGFnX2tlZXBfbG9jYWxzKTogQ2hhbmdlIGZyb20gdW5zaWduZWQgY2hhciB0byBpbnQuCi0JKGZsYWdfbm9fd2FybmluZ3MpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChtcmlfbGluZV9sYWJlbCk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkocG90YWJsZSk6IEFkZCBub3BhZ2UsIHBhZ2UsIHBsZW4uCi0JKHNfb3JnKTogRXJyb3IgaWYgaW4gTVJJIG1vZGUuCi0JKiByZWFkLmggKG1yaV9saW5lX2xhYmVsKTogRGVjbGFyZS4KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19ub3BhZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKiBsaXN0aW5nLmggKGxpc3Rpbmdfbm9wYWdlKTogRGVjbGFyZS4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfYmVnaW4pOiBTZXQgc3lfZnJhZyBvZiBhYnNfc3ltYm9sIHRvCi0JJnplcm9fYWRkcmVzc19mcmFnLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IENoZWNrIHRoYXQgc3ltYm9sIGlzIG5vdCBOVUxMCi0JYmVmb3JlIGNoZWNraW5nIHN5X21yaV9jb21tb24uCi0JKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAoYWJzX3NlY3Rpb25fb2Zmc2V0KTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkocG90YWJsZSk6IEFkZCBvZmZzZXQsIHN0cnVjdC4KLQkoZG9fb3JnKTogTmV3IHN0YXRpYyBmdW5jdGlvbjsgaGFuZGxlIGNoYW5naW5nIHRoZSBvcmlnaW4gaW4gdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4KLQkoc19vcmcpOiBVc2UgZG9fb3JnLgotCShzX3NldCk6IExpa2V3aXNlLgotCShlcXVhbHMpOiBMaWtld2lzZS4KLQkoc19zcGFjZSk6IEluIGFic29sdXRlX3NlY3Rpb24sIGp1c3QgaW5jcmVhc2UgYWJzX3NlY3Rpb25fb2Zmc2V0LgotCShzX3N0cnVjdCk6IE5ldyBmdW5jdGlvbi4KLQkoZW1pdF9leHByKTogSGFuZGxlIGFic29sdXRlX3NlY3Rpb24gc3BlY2lhbGx5LgotCSogcmVhZC5oIChhYnNfc2VjdGlvbl9vZmZzZXQpOiBEZWNsYXJlLgotCShzX3N0cnVjdCk6IERlY2xhcmUuCi0JKiBmcmFncy5jIChmcmFnX21vcmUpOiBXYXJuIGlmIGluIGFic29sdXRlX3NlY3Rpb24uCi0JKGZyYWdfbm93X2ZpeCk6IEluIGFic29sdXRlX3NlY3Rpb24sIHJldHVybiBhYnNfc2VjdGlvbl9vZmZzZXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBJZiBzd2l0Y2hpbmcgdG8gYWJzb2x1dGVfc2VjdGlvbiwKLQlqdXN0IHNldCBub3dfc2VnIGFuZCBub3dfc3Vic2VnLgotCShzdWJzZWdfc2V0X3Jlc3QpOiBTcGVjaWFsIGhhbmRsaW5nIHdoZW4gc3dpdGNoaW5nIHRvIG9yIGZyb20KLQlhYnNvbHV0ZV9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2Zsb2F0X2NvcG51bSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBmb3B0IGFuZCBtYXNrMi4KLQkobTY4a19pcCk6IFVzZSBtNjhrX2Zsb2F0X2NvcG51bSwgbm90IENPUE5VTSwgd2hlbiBzZXR0aW5nCi0JY29wcm9jZXNzb3IgcmVnaXN0ZXIgdG8gdXNlLiAgSW4gY2FzZSAnSScgd2hlbiBjaGVja2luZyBvcGVyYW5kcywKLQljb3JyZWN0IGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG51bWJlcnMuICBJbiBjYXNlICdJJyB3aGVuIHNldHRpbmcKLQlvcGVyYW5kcywgZG9uJ3QgYWRkIDEuCi0JKHNfZm9wdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oIChDT1BOVU0pOiBEb24ndCBkZWZpbmUuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBpZmVxLCBpZmdlLCBpZmd0LCBpZmxlLCBpZmx0LCBpZm5lLgotCUNoYW5nZSBpZiB0byBwYXNzIE9fbmUgdG8gc19pZi4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogRG9uJ3QgZGVmaW5lIGFuIGxhYmVsIHdpdGhvdXQgYSBjb2xvbiBpZgotCWlnbm9yZV9pbnB1dCByZXR1cm5zIHRydWUuCi0JKiBjb25kLmMgKHNfaWYpOiBUcmVhdCBhcmd1bWVudCBhcyBhbiBvcGVyYXRvclQgZGVzY3JpYmluZyBob3cgdG8KLQljb21wYXJlIHRoZSBhcmd1bWVudCBhZ2FpbnN0IHplcm8uCi0JKGlnbm9yZV9pbnB1dCk6IERvbid0IHJlcXVpcmUgYW4gaW5pdGlhbCBkb3QgaW4gTVJJIG1vZGUsIG9yIGlmCi0JTk9fUFNFVURPX0RPVCBpcyBkZWZpbmVkLgotCi0JKiByZWFkLmMgKHBvdGFibGUpOiBBZGQgZGNiLCBkY2IuYiwgZGNiLmQsIGRjYi5sLCBkY2IucywgZGNiLncsCi0JZGNiLngsIGRzLmQsIGRzLnAsIGRzLnMsIGRzLngsIGVsc2VjLCBlbmRjLCBmYWlsLCBmb3JtYXQsIGxsZW4sCi0Jbm9mb3JtYXQuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IElmIHBzZXVkby1vcCBoYW5kbGVyIGlzIHNfZW5kLCBxdWl0Ci0JaW1tZWRpYXRlbHkuCi0JKHNfZW5kKTogTmV3IGZ1bmN0aW9uLgotCShzX2ZhaWwpOiBOZXcgZnVuY3Rpb24uCi0JKHNfZmxvYXRfc3BhY2UpOiBOZXcgZnVuY3Rpb24uCi0JKGhleF9mbG9hdCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGZsb2F0X2NvbnMpOiBVc2UgaGV4X2Zsb2F0LgotCSogcmVhZC5oIChzX2ZhaWwpOiBEZWNsYXJlLgotCShzX2Zsb2F0X3NwYWNlKTogRGVjbGFyZS4KLQkqIGNvbmQuYyAoc19lbmQpOiBSZW1vdmUuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHNpemUpOiBUcmVhdCBhcmd1bWVudCBhcyBpbmRpY2F0aW5nIHdoZXRoZXIKLQlhIGhlaWdodCBpcyBleHBlY3RlZC4KLQotCSogcmVhZC5jIChtcmlfcGVuZGluZ19hbGlnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEhhbmRsZSBtcmlfcGVuZGluZ19hbGlnbi4KLQkoY29ucyk6IFNldCBtcmlfcGVuZGluZ19hbGlnbiBpZiBhcHByb3ByaWF0ZS4KLQotCSogY29uZmlndXJlLmluOiBNb3ZlIHJhbmRvbSBzcGVjaWFsIHRhcmdldCBoYW5kbGluZyBiZWZvcmUKLQlwb3NzaWJsZSBicmVhay4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEF1ZyAgOCAyMzo0MToyNSAxOTk1ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29uc2lzdGVudGx5IHVzZSAke3RhcmdldF9jcHVfdHlwZX0gcmF0aGVyIHRoYW4KLQkke2NwdV90eXBlfSBhZnRlciB0aGUgbG9vcC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluICh0YXJnLWNwdS5vKTogVXNlIEB0YXJnZXRfY3B1X3R5cGVAIHJhdGhlciB0aGFuCi0JQGNwdV90eXBlQC4KLQotVHVlIEF1ZyAgOCAxNzoyNzoxNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5oIChvcGVyYXRvclQpOiBSZW1vdmUgY29tbWEgYWZ0ZXIgbGFzdCBlbnVtZXJhdG9yIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBTb21lIHdoaXRlc3BhY2UgY2xlYW51cCBmcm9tIFBhdCBSYW5raW4uCi0KLQkqIGFzLmggKGFsbG9jYSk6IElmIF9fU1REQ19fLCBkZWNsYXJlIHZvaWQqIGluc3RlYWQgb2YgY2hhciouCi0KLQlXZWQgQXVnICAyIDE4OjU0OjM3IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIsCi0JQ2xvc2VfVk1TX09iamVjdF9GaWxlKTogUmVvcmdhbml6ZSB0aGUgYCNpZiAhVk1TJyBjcm9zcy1hc3NtZWJsZXIKLQlzdXBwb3J0IGNvZGUuCi0JKENsb3NlX1ZNU19PYmplY3RfRmlsZSk6IENhbGwgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgdG8gZmx1c2gKLQlvdXRwdXQgYnVmZmVyLS1qdXN0IGluIGNhc2UtLWJlZm9yZSBjbG9zaW5nIHRoZSBmaWxlLgotCi1UdWUgQXVnICA4IDEzOjA3OjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoYXJjaHMpOiBBZGQgNjhlYzAwMCwgNjhoYzAwMCwgNjhoYzAwMSwKLQk2OGVjMDIwLCA2OGVjMDMwLCA2OGVjMDQwLCBhbmQgNjgzMzAuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBjaGlwIGFuZCBjb21saW5lLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSBzdHJjYXNlY21wIHdoZW4gY29tcGFyaW5nIGRlZmF1bHRfY3B1Ci0JYWdhaW5zdCBhcmNoaXRlY3R1cmVzLgotCShtcmlfY2hpcCwgc19jaGlwKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogQWRkIHN5X21yaV9jb21tb24gYml0LgotCSogcmVhZC5oIChtcmlfY29tb25fc3ltYm9sKTogRGVjbGFyZS4KLQkoc19tcmlfY29tbW9uKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAobXJpX2xpbmVfbGFiZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtcmlfY29tbW9uX3N5bWJvbCk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHBvdGFibGUpOiBBZGQgImNvbW1vbiIgYW5kICJjb21tb24ucyIuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEluIE1SSSBtb2RlLCBzZXQgbXJpX2xpbmVfbGFiZWwgZm9yIGEgbGFiZWwKLQlhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgotCShzX21yaV9jb21tb24pOiBOZXcgZnVuY3Rpb24uCi0JKHNfc3BhY2UpOiBIYW5kbGUgbXJpX2NvbW1vbl9zeW1ib2wuCi0JKiBzeW1ib2xzLmMgKGNvbG9uKTogQ2hhbmdlIHJldHVybiB2YWx1ZSBmcm9tIHZvaWQgdG8gc3ltYm9sUyAqLAotCWFuZCByZXR1cm4gbmV3IHN5bWJvbC4gIElmIG1yaV9jb21tb25fc3ltYm9sIGlzIHNldCwgYXR0YWNoIHRoZQotCW5ldyBzeW1ib2wgdG8gaXQuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIGFuIHN5X21yaV9jb21tb24gc3ltYm9sLgotCSogc3ltYm9scy5oIChjb2xvbik6IENoYW5nZSByZXR1cm4gdmFsdWUgaW4gZGVjbGFyYXRpb24uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENsZWFyIG1yaV9jb21tb25fc3ltYm9sLgotCShzdWJzZWdfc2V0IChib3RoIHZlcnNpb25zKSk6IExpa2V3aXNlLgotCSogZnJhZ3MuYyAoZnJhZ19tb3JlKTogV2FybiBpZiBtcmlfY29tbW9uX3N5bWJvbCBpcyBub3QgTlVMTC4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogU2tpcCBzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogRGlzY2FyZCBzeV9tcmlfY29tbW9uIHN5bWJvbHMuCi0JKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2UgcmVsb2NhdGlvbnMgYWdhaW5zdCBzeV9tcmlfY29tbW9uIHN5bWJvbHMKLQl0byBiZSBhZ2FpbnN0IHRoZSBjb21tb24gc3ltYm9sIGl0c2VsZi4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh5YW5rX3N5bWJvbHMpOiBEaXNjYXJkIHN5X21yaV9jb21tb24gc3ltYm9scy4KLQkoZml4dXBfc2VnbWVudCk6IENoYW5nZSByZWxvY2F0aW9ucyBhZ2FpbnN0IHN5X21yaV9jb21tb24gc3ltYm9scwotCXRvIGJlIGFnYWluc3QgdGhlIGNvbW1vbiBzeW1ib2wgaXRzZWxmLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBEaXNjYXJkCi0Jc3lfbXJpX2NvbW1vbiBzeW1ib2xzLgotCi0JKiBkb2MvYy1tNjhrLnRleGk6IEFkZCBkb2N1bWVudGF0aW9uIGZvciBDUFUgc3BlY2lmaWMgb3B0aW9ucywgYW5kCi0JZm9yIE1vdG9yb2xhIHN5bnRheC4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAobW90b3JvbGFfb3BlcmFuZCk6IEZvciAoJXBjKSwgc2V0IG1vZGUgdG8KLQlESVNQLCBub3QgQkFTRS4KLQotVHVlIEF1ZyAgOCAwMjozMTozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAocmVsYXhfYWxpZ24pOiBBZGQgZXh0cmEgcGFkZGluZyBmb3IgbGlua3JlbGF4IG9ubHkgaWYKLQlMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZIGlzIGRlZmluZWQuCi0JKiBjb25maWcvdGMtaTk2MC5oIChMSU5LRVJfUkVMQVhJTkdfU0hSSU5LU19PTkxZKTogRGVmaW5lIGl0LgotCSogZG9jL2ludGVybmFscy50ZXhpIChSZWxheGF0aW9uKTogV3JpdGUgdXAgc29tZSBzdHVmZiBvbiBsaW5rZXIKLQlyZWxheGluZyBhbmQgTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWS4KLQotTW9uIEF1ZyAgNyAxNzoxODoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tNjhrLXBhcnNlLnk6IE5ldyBmaWxlOiBiaXNvbiBncmFtbWFyIGZvciBtNjhrIG9wZXJhbmRzLAotCWluY2x1ZGluZyBzdXBwb3J0IGZvciBNb3Rvcm9sYSBzeW50YXguCi0JKiBjb25maWcvbTY4ay1wYXJzZS5oOiBOZXcgZmlsZTsgZGVmaW5pdGlvbnMgc2hhcmVkIGJldHdlZW4KLQltNjhrLXBhcnNlLnkgYW5kIHRjLW02OGsuYy4KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEluY2x1ZGUgbTY4ay1wYXJzZS5oLgotCShlbnVtIG9wZXJhbmRfdHlwZSk6IE1vdmUgdG8gbTY4ay1wYXJzZS5oLCB3aGVyZSBpdCBpcyBuYW1lZAotCW02OGtfb3BlcmFuZF90eXBlLiAgUmVuYW1lIGFsbCB1c2VzLiAgUmVhcnJhbmdlIHNvbWV3aGF0LiAgQWRkCi0JRlBSRUcuICBSZW5hbWUgQU9GRiB0byBESVNQLiAgUmVuYW1lIEFJTkRYIHRvIEJBU0UuICBSZW5hbWUgQVBPRFgKLQl0byBQT1NULiAgUmVuYW1lIEFQUkRYIHRvIFBSRS4gIFJlbW92ZSBBTUlORC4gIFJlbmFtZSBNU0NSIHRvCi0JQ09OVFJPTC4gIFJlbW92ZSBESU5EUi4KLQkoc3RydWN0IG02OGtfZXhwKTogTW92ZSB0byBtNjhrLXBhcnNlLmguICBSZW1vdmUgZV9iZWcsIGVfZW5kIGFuZAotCWVfc2VnIGZpZWxkcy4gIFJlbmFtZSBlX2V4cCB0byBleHAuICBSZW5hbWUgZV9zaXogdG8gc2l6ZSwgYW5kCi0JY2hhbmdlIHR5cGUgdG8gZW51bSBtNjhrX3NpemUuICBDaGFuZ2UgYWxsIHVzZXMuCi0JKGVudW0gX3JlZ2lzdGVyKTogTW92ZSB0byBtNjhrLXBhcnNlLmgsIHdoZXJlIGl0IGlzIG5hbWVkCi0JbTY4a19yZWdpc3Rlci4gIFJlbmFtZSBhbGwgdXNlcy4gIEFkZCBaREFUQTAtNyBhbmQgWkFERFIwLTcuCi0JKHN0cnVjdCBtNjhrX29wKTogTW92ZSB0byBtNjhrLXBhcnNlLmguICBDaGFuZ2UgYWxsIGZpZWxkcy4KLQkoc2VnKTogRG9uJ3QgZGVmaW5lLgotCShhZGRfZXhwKTogUmVtb3ZlLgotCShGQUlMLCBPSyk6IFJlbW92ZS4KLQkobTY4a19yZWdfcGFyc2UpOiBNb3ZlIHRvIG02OGstcGFyc2UueSwgYW5kIHJld3JpdGUuCi0JKFNLSVBfV0hJVEUsIFNLSVBfVyk6IFJlbW92ZS4KLQkodHJ5X21vdG9faW5kZXgsIHRyeV9pbmRleCk6IFJlbW92ZS4KLQkobTY4a19pcF9vcCk6IE1vdmUgdG8gbTY4ay1wYXJzZS55LCBhbmQgcmV3cml0ZSB0byB1c2UgZ3JhbW1hci4KLQkobWFpbik6IFJlbW92ZSBvYnNvbGV0ZSB0ZXN0IGZ1bmN0aW9uLgotCShtNjhrX2lwKTogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gdXNlIG5ldyBncmFtbWFyLgotCShnZXRfcmVncyk6IFJlbW92ZS4KLQkoY3JhY2tfb3BlcmFuZCk6IG02OGtfaXBfb3Agbm93IHJldHVybnMgMCBvbiBzdWNjZXNzLgotCShpbml0X3RhYmxlKTogQWRkIHNzcCwgemQwLTcgYW5kIHphMC03LgotCShtZF9hc3NlbWJsZSk6IE1ha2UgZXIgY29uc3QuICBDb3JyZWN0IGxvb3Agb3ZlciBvcGVyYW5kcyB3aGVuCi0JbG9va2luZyBmb3IgZXJyb3IgbWVzc2FnZS4KLQkobWRfYmVnaW4pOiBTZXQgYWx0X25vdGVuZF90YWJsZSBmb3IgJygnIGFuZCAnQCcuCi0JKGdldF9udW0pOiBFeHByZXNzaW9uIGlzIGFscmVhZHkgcGFyc2VkLiAgRG9uJ3Qgc2V0IHNlZy4KLQkqIGNvbmZpZ3VyZS5pbjogSWYgY3B1X3R5cGUgaXMgbTY4aywgcHV0IG02OGstcGFyc2UubyBpbgotCWV4dHJhLW9iamVjdHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogQWRkIG02OGstcGFyc2UuYy4KLQkoQklTT04pOiBVc2UgLi4vYmlzb24vYmlzb24gaWYgaXQgZXhpc3RzLgotCShCSVNPTkZMQUdTKTogRGVmaW5lIGFzIGVtcHR5LgotCShUQVJHX0NQVV9ERVBfbTY4ayk6IERlcGVuZCB1cG9uICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oLgotCShtNjhrLXBhcnNlLmMsIG02OGstcGFyc2Uubyk6IE5ldyB0YXJnZXRzLgotCi1Nb24gQXVnICA3IDAyOjU0OjIwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtc2guYyAocGFyc2VfcmVnKTogSGFuZGxlIG5ldyBGUCByZWdpc3RlcnMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlcy4KLQotRnJpIEF1ZyAgNCAxMjoyOToyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BfZW5jb2RpbmcpOiBNYWtlIG5vbi1jb25zdC4gIERvbid0IHNldCAnIicgdG8KLSAgICAgICAgT19iaXRfbm90LgotCShleHByX2JlZ2luKTogU2V0IG9wX2VuY29kaW5nWyciJ10gaW4gTVJJIG1vZGUuCi0KLVdlZCBBdWcgIDIgMTg6Mzk6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBSZW1vdmUgQlJFQUtfVVBfQklHX0RFQ0wgc3R1ZmYuCi0JKHN0cnVjdCBtNjhrX2luY2FudCk6IENoYW5nZSBtX29wZXJhbmRzIGZpZWxkIHRvIGJlIGNvbnN0LgotCShzdHJ1Y3QgbTY4a19pdCk6IENoYW5nZSBhcmdzIGZpZWxkIHRvIGJlIGNvbnN0LgotCShtNjhrX2lwKTogQ2hhbmdlIGxvY2FsIHZhcmlhYmxlIHMgdG8gYmUgY29uc3QuCi0JKG9wY29kZV9wdHIpOiBSZW1vdmUuCi0JKG1kX2JlZ2luKTogVXNlIG02OGtfbnVtb3Bjb2Rlcywgbm90IG51bW9wY29kZXMuICBVc2UKLQltNjhrX29wY29kZXMsIG5vdCByZW1vdmVkIG9wY29kZV9wdHIuICBVc2UgbTY4a19udW1hbGlhc2VzLCBub3QKLQludW1hbGlhc2VzLgotCi1UdWUgQXVnICAxIDE3OjM1OjI2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoaW5pdF90YWJsZSk6IEFkZCAiY29udHJvbCIsICJzdGF0dXMiLCAiaWFkZHIiLAotCSJzZmNyIiwgYW5kICJkZmNyIiBhcyBzeW5vbnltcyBmb3IgZXhpc3RpbmcgZW50cmllcy4KLQkobWRfYmVnaW4pOiBJbiBNUkkgbW9kZSwgZm9yY2UgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIHRvIDEuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlbW92ZWQgdW51c2VkIGxvY2FscyBpIGFuZCBhcmNoLiAgQ2hhbmdlIHR5cGUKLQlvZiBhcmNoIChhbm90aGVyIG9uZSkgdG8gdW5zaWduZWQgbG9uZy4KLQkodGNfY29mZl9zaXplbWFjaGRlcCk6IEFkZCByZXR1cm4gYWZ0ZXIgYWJvcnQgdG8gYXZvaWQgd2FybmluZy4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgTVJJIHN0eWxlIGxhYmVscyBhbmQgZXhwcmVzc2lvbnMuCi0JKiBhcy5oIChmbGFnX21yaSk6IERlY2xhcmUvZGVmaW5lLgotCSogYXMuYyAoc2hvd191c2FnZSk6IE1lbnRpb24gLU0gYW5kIGl0cyBzeW5vbnltIC0tbXJpLgotCShwYXJzZV9hcmdzKTogQWRkICdNJyB0byBzdGRfc2hvcnRvcHRzLiAgQWRkICJtcmkiIHRvCi0Jc3RkX2xvbmdvcHRzLiAgU2V0IGZsYWdfbXJpIGlmIC1NIGlzIHNlZW4uCi0JKG1haW4pOiBDYWxsIHBhcnNlX2FyZ3MgYmVmb3JlIGlucHV0X3NjcnViX2JlZ2luLiAgQ2FsbAotCWV4cHJfYmVnaW4uCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBEb24ndCBzZXQgbGV4IGZvciAnIicgb3IgJ1wnJyBpbiBNUkkKLQltb2RlLiAgRG8gc2V0IGxleCBmb3IgJzsnLCAnKicsIGFuZCAnIScgaW4gTVJJIG1vZGUuCi0JKGRvX3NjcnViX25leHRfY2hhcik6IFJlbW92ZSBNUkkgaWZkZWYgaW4gTEVYX0lTX1dISVRFU1BBQ0UgY2FzZS4KLQlJbiBNUkkgbW9kZSwga2VlcCBzcGFjZXMgYmV0d2VlbiBsYWJlbHMgYW5kIGNvbG9ucy4gIFJlbW92ZSBNUkkKLQlpZm5kZWYgYXJvdW5kIExFWF9JU19PTkVDSEFSX1FVT1RFIGNhc2UuICBJbiBNUkkgbW9kZSwgZG9uJ3QgdXNlCi0JJyEnIG9yICcqJyBhcyBjb21tZW50IGNoYXJhY3RlcnMgZXZlbiBpZiB0aGV5IGFyZSBpbgotCWNvbW1lbnRfY2hhcnMuCi0JKiByZWFkLmggKGxleF90eXBlKTogTm8gbG9uZ2VyIGNvbnN0LgotCSogcmVhZC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShsZXhfdHlwZSk6IE5vIGxvbmdlciBjb25zdC4KLQkocmVhZF9iZWdpbik6IEluIE1SSSBtb2RlLCBzZXQgbGV4X3R5cGUgb2YgJz8nIHRvIDMuCi0JKHBvdGFibGUpOiBBZGQgZGMsIGRjLmIsIGRjLmQsIGRjLmwsIGRjLnMsIGRjLncsIGRjLngsIGRzLCBkcy5iLAotCWRzLmwsIGRzLncsIGFuZCB4ZGVmLgotCShyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGFuZ2UgTEFCRUxTX1dJVEhPVVRfQ09MT04gaWZkZWYgdG8gY2hlY2sKLQlmb3IgTVJJIG1vZGUgYXQgcnVudGltZSByYXRoZXIgdGhhbiBjb21waWxlIHRpbWUuICBIYW5kbGUgdGhlIEVRVQotCXBzZXVkby1vcCBpbiBNUkkgbW9kZS4gIFJlbW92ZSBib2d1cyBNUkkgaWZkZWYgYXJvdW5kIGRvbmVfcHNldWRvLgotCUNoYW5nZSBOT19QU0VVRE9fRE9UIGlmZGVmIHRvIGFsc28gdGFrZSBlZmZlY3QgZm9yIE1SSSBtb2RlIGF0Ci0JcnVudGltZS4KLQkoY29ucyk6IEluIE1SSSBtb2RlLCBhbHdheXMgY2FsbCBwYXJzZV9tcmlfY29ucyByYXRoZXIgdGhhbgotCVRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTi4KLQkocGFyc2VfbXJpX2NvbnMpOiBBbHdheXMgY29tcGlsZSwgbm90IGp1c3Qgd2hlbiBNUkkgaXMgZGVmaW5lZC4KLQlDYWxsIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiwgbm90IGV4cHJlc3Npb24sIHdoZW4gdGhlIGlucHV0IGlzCi0Jbm90IGEgc3RyaW5nIGNvbnN0YW50LiAgSGFuZGxlIEEgYW5kIEUgbW9kaWZpZXJzLgotCShmbG9hdF9jb25zKTogQWNjZXB0IDp4eHh4LCB3aGVyZSB0aGUgeCdzIGFyZSBoZXggZGlnaXRzLgotCSogZXhwci5oIChvcGVyYXRvclQpOiBBZGQgT19lcSwgT19uZSwgT19sdCwgT19sZSwgT19nZSwgT19ndC4KLQkoZXhwcl9iZWdpbik6IERlY2xhcmUuCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJbiBNUkkgbW9kZSwgaWYgdGhlIGJhc2Ugd2FzIG5vdAotCXNwZWNpZmllZCwgbG9vayBmb3IgYSBzdWZmaXggb24gdGhlIG51bWJlciB0byBzZXQgdGhlIGJhc2UuCi0JKG1yaV9jaGFyX2NvbnN0YW50KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkob3BlcmFuZCk6IFJlbW92ZSBNUkkgaWZkZWYuICBJbiBNUkkgbW9kZSwgZG8gdmFyaW91cyB0aGluZ3M6IFBhc3MKLQkwIGFzIHRoZSBiYXNlIHdoZW4gY2FsbGluZyBpbnRlZ2VyX2NvbnN0YW50IGlmIHRoZXJlIHdhcyBubwotCXByZWZpeC4gIENoZWNrIGZvciBhIGhleCBjb25zdGFudCBzdWZmaXggaWYgd2hlbiBhIGxlYWRpbmcgJzAnIGlzCi0Jc2Vlbi4gIERvbid0IGFjY2VwdCAweCBvciAwYiBhcyBhIHByZWZpeC4gIENoZWNrIGZvciBFJ2NoYXJzJyBhbmQKLQlBJ2NoYXJzJy4gIEhhbmRsZSBNUkkgY2hhcmFjdGVyIGNvbnN0YW50cy4gIFRyZWF0ICciJyBhcyB0aGUKLQl1bmFyeSBiaXR3aXNlIG5vdCBvcGVyYXRvci4gIFRyZWF0ICQgYXMgdGhlIHByb2dyYW0gY291bnRlciwgb3IgYXMKLQl0aGUgcHJlZml4IGZvciBhIGhleCBjb25zdGFudC4gIFRyZWF0ICUgYXMgdGhlIHByZWZpeCBmb3IgYSBiaW5hcnkKLQljb25zdGFudCBhbmQgQCBhcyB0aGUgcHJlZml4IGZvciBhbiBvY3RhbCBjb25zdGFudC4gIFRyZWF0IDogYXMKLQl0aGUgcHJlZml4IGZvciBhIGhleCBjb25zdGFudC4KLQkob3BfZW5jb2RpbmcpOiBTZXQgJyInIHRvIE9fYml0X25vdCwgJzwnIHRvIE9fbHQsIGFuZCAnPicgdG8gT19ndC4KLQkob3BfcmFuayk6IE5vIGxvbmdlciBjb25zdC4gIENoYW5nZSByYW5rIHZhbHVlcy4KLQkoZXhwcl9iZWdpbik6IE5ldyBmdW5jdGlvbi4KLQkob3BlcmF0b3IpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShleHByKTogVXNlIG9wZXJhdG9yLiAgRG9uJ3QgYm90aGVyIHRvIG1lbnRpb24gdGhlIG9wZXJhdG9yIGluCi0Jd2FybmluZ3MuICBSZW1vdmUgYm9ndXMgI2lmIDAgY29kZS4gIEhhbmRsZSBuZXcgb3BlcmF0b3JUIHZhbHVlcy4KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBJbiBNUkkgbW9kZSwgYWNjZXB0IHVuZGVyc2NvcmVzCi0JYXJvdW5kIHRoZSBleHBvbmVudCBpbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLgotCSogc3ltYm9scy5oIChzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKTogRGVjbGFyZS4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sc19jYXNlX3NlbnNpdGl2ZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHN5bWJvbF9jcmVhdGUpOiBDaGVjayBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlLgotCShzeW1ib2xfZmluZF9iYXNlKTogTGlrZXdpc2UuCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSGFuZGxlIG5ldyBvcGVyYXRvclQgdmFsdWVzLgotCShwcmludF9leHByXzEpOiBMaWtld2lzZS4KLQkoU19JU19MT0NBTCk6IEluIE1SSSBtb2RlLCBuYW1lcyBiZWdpbm5pbmcgd2l0aCB0d28gJz8nIGNoYXJhY3RlcnMKLQlhcmUgbG9jYWwuCi0KLVR1ZSBBdWcgIDEgMTE6MzU6MTggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogdGMtc2guYyAobWRfY29udmVydF9mcmFnKTogTWFrZSBzb21lIGVycm9yIG1lc3NhZ2VzIG1vcmUKLQlleHBsaWN0LgotCi1Nb24gSnVsIDMxIDIxOjQwOjQ3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JU2F0IEp1bCAyOSAxODo1NToyMyAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoQ09QWV9TSE9SVCwgQ09QWV9MT05HLCBQVVRfU0hPUlQsIFBVVF9MT05HKToKLQlNYWtlIGV4cGFuc2lvbiBiZSBzYWZlIGZvciB1c2UgaW4gZXhwcmVzc2lvbnMuCi0JKFBVVF9DT1VOVEVEX1NUUklORyk6IEJyYWNrZXQgZXhwYW5zaW9uIHdpdGggYGRvIHsuLi59IHdoaWxlICgwKScKLQlyYXRoZXIgdGhhbiBqdXN0IGB7Li4ufScuCi0KLU1vbiBKdWwgMzEgMTg6MTk6MjYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChtYWluKTogUGFyc2UgLUkgb3B0aW9uLgotCShkb19pbmNsdWRlKTogTG9vayB0aHJvdWdoIGluY2x1ZGUgbGlzdC4KLQkqIGdhc3AuYyAoY2hhbmdlX2Jhc2UpOiBEb24ndCBtb2RpZnkgbnVtYmVycyBpbiBzdHJpbmdzLiAKLQotTW9uIEp1bCAzMSAxMjoxNjoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoU1VCX1NFR01FTlRfQUxJR04pOiBEZWZpbmUuICBGcm9tIE5pY2xhcwotCUFuZGVyc3NvbiA8bmljYW5AaWRhLmxpdS5zZT4uCi0KLVRodSBKdWwgMjcgMjA6NDc6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgZG8gZnVydGhlciBwY3JlbAotCXByb2Nlc3NpbmcgYWZ0ZXIgY29udmVydGluZyBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHRoZQotCXNhbWUgc2VnbWVudC4gIEZyb20gSmltIFdpbHNvbi4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbGludXhvbGRsZCk6IEFkZCBhcyBzeW5vbnltIGZvcgotCWkzODYtKi1saW51eCphb3V0Ki4gIEZyb20gRnJlZCBGaXNoLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEp1bCAyNyAxNjoxNDo1NiAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoZW51bSBwc190eXBlIHtwc19URVhULHBzX0RBVEEscHNfQ09NTU9OLAotCXBzX0NPTlNUfSk6IE5ldyBjb25zdGFudHMuCi0JKFZNU19Qc2VjdF9TcGVjKTogVXNlIHRoZW0gaW5zdGVhZCBvZiBsaXRlcmFsIHN0cmluZ3MuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSwgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkpOiBBZGp1c3QgY2FsbGVycy4KLQotV2VkIEp1bCAyNiAxODozMTozNSAxOTk1ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuYyAoY29uc3RfZmxhZyk6IENoYW5nZSBmcm9tIGNoYXIgdG8gdW5zaWduZWQgY2hhci4KLQkqIGNvbmZpZy9vYmotdm1zLmggKGNvbnN0X2ZsYWcpOiBEaXR0by4KLQkoc3RydWN0IG5saXN0KTogUmVwbGFjZSB1bmlvbiBuX3VuIGFuZCBuX3VuLntuX25hbWUsbl9uZXh0LG5fc3RyeH0KLQlmaWVsZHMgd2l0aCBqdXN0IG5fbmFtZTsgZGVsZXRlIGZpZWxkIG5fdmFsdWU7IGNoYW5nZSBuX290aGVyIGZyb20KLQljaGFyIHRvIHVuc2lnbmVkIGNoYXIgYW5kIG5fZGVzYyBmcm9tIHNob3J0IHRvIGludDsgaW5zZXJ0IGV4cGxpY2l0Ci0JcGFkZGluZyBmb3IgYWxpZ25tZW50LgotCi1Nb24gSnVsIDI0IDIwOjA2OjE3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHN0cnVjdCBzZWdfaW5mb190cmFzaCk6IE1ha2UgYml0ZmllbGQgdHlwZXMgdmFsaWQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTG9jYWwgYWRkX251bWJlciBzaG91bGQgbm90Ci0JYmUgZGVjbGFyZWQgcmVnaXN0ZXIgc2luY2UgaXRzIGFkZHJlc3MgaXMgdGFrZW4gZm9yCi0JTURfQVBQTFlfRklYMy4KLQotCUZyaSBKdWwgMjEgMTU6Mjg6MTggMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQlTcGxpdCBodWdlIHZtc193cml0ZV9vYmplY3RfZmlsZSByb3V0aW5lIGludG8gbWFuYWdhYmxlIHBpZWNlcy4KLQotCSogY29uZmlnL29iai12bXMuYyAodm1zX2ZpeHVwX3RleHRfc2VjdGlvbiwgc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQsCi0Jdm1zX2ZpeHVwX2RhdGFfc2VjdGlvbiwgZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnksIGxvY2FsX3N5bWJvbHNfRFNULAotCXZtc19idWlsZF9EU1QpOiBOZXcgcm91dGluZXMuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGhlbS4KLQkoc3RydWN0IHZtc19vYmpfc3RhdGUpOiBOZXcgZmlsZSBzY29wZSB2YXJpYWJsZSB1c2VkIGJ5IHRoZSBhYm92ZS4KLQotTW9uIEp1bCAyNCAxNDoxMDoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInVzZXMiLgotCShzX3VzZXMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCBzdWJzZWdfY2hhbmdlIGJlZm9yZSBjYWxsaW5nIGZpeF9uZXcuCi0JKHNoX2hhbmRsZV9hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkoU1dJVENIX1RBQkxFKTogRGVmaW5lLgotCShzaF9mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgUl9TSF9VU0VTLCBSX1NIX0NPVU5UIGFuZCBSX1NIX0FMSUdOLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IExpa2V3aXNlLiAgQWxzbyBoYW5kbGUgc3dpdGNoIHRhYmxlCi0JZW50cmllcy4KLQkqIGNvbmZpZy90Yy1zaC5oIChIQU5ETEVfQUxJR04pOiBEZWZpbmUuCi0JKHNoX2hhbmRsZV9hbGlnbik6IERlY2xhcmUuCi0JKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0JKHNoX2ZvcmNlX3JlbG9jYXRpb24pOiBEZWNsYXJlLgotCShUQ19DT1VOVF9SRUxPQyk6IFNpbXBsaWZ5OyByZWx5IG9uIFRDX0ZPUkNFX1JFTE9DQVRJT04gaW5zdGVhZC4KLQkodGNfZnJvYl9maWxlKTogRGVmaW5lLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsIHRjX2Zyb2JfZmlsZSBpZiBpdAotCWlzIGRlZmluZWQuCi0JKGZpeHVwX21kZXBzKTogQ2FsbCBIQU5ETEVfQUxJR04gaWYgaXQgaXMgZGVmaW5lZC4KLQkoVENfRk9SQ0VfUkVMT0NBVElPTik6IERlZmluZSBpZiBub3QgZGVmaW5lZC4KLQkoZml4dXBfc2VnbWVudCk6IFVzZSBUQ19GT1JDRV9SRUxPQ0FUSU9OIHRvIGRlY2lkZSB3aGV0aGVyIHRvCi0JY2xlYXIgdGhlIHN5bWJvbCBmaWVsZHMgb2YgZml4UC4KLQotRnJpIEp1bCAyMSAyMjozODowMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IEFkZCBzdXBwb3J0IGZvciBSX1BQQ19TREFSRUwKLQlyZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogRGl0dG8uCi0KLVRodSBKdWwgMjAgMTM6MDA6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IFJlbmFtZSBhcmd1bWVudCBzZWcgdG8gc2VjLAotCXNpbmNlIHNlZyBpcyBhIG1hY3JvIG5hbWUgaW4gdGhpcyBmaWxlLgotCi0JKiBjb25maWd1cmUuaW4gKGFybS0qLXJpc2NpeCopOiBEb24ndCBzZXQgZW11bGF0aW9uLgotCi1XZWQgSnVsIDE5IDE2OjA4OjI5IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChURV9QRSk6IERlbGV0ZS4KLQkqIGNvbmZpZy90Yy1hcm0uaCAoQllURV9PUkRFUik6IERlbGV0ZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IFByb3ZpZGUgdmFsdWUgZm9yIE9CSl9DT0ZGIGFuZCBURV9QRS4KLQkoQVJNX0JJX0VORElBTik6IERlZmluZSBpZiBPQkpfQ09GRiBhbmQgVEVfUEUuCi0JKiBjb25maWcvdGMtYXJtLmMgKGJ5dGVfb3JkZXIpOiBEZWxldGUuCi0JKG1kX251bWJlcl90b19jaGFycyk6IFJlZmVyZW5jZSB0YXJnZXRfYmlnX2VuZGlhbiwgbm90IGJ5dGVfb3JkZXIuCi0JKG1kX2NoYXJzX3RvX251bWJlcik6IExpa2V3aXNlLgotCShtZF9sb25nb3B0cyk6IEFkZCAtRUIvLUVMIGlmIEFSTV9CSV9FTkRJQU4uCi0JKG1kX3BhcnNlX29wdGlvbnMpOiBSZWNvZ25pemUgLUVCLy1FTC4KLQkobWRfc2hvd191c2FnZSk6IExpc3QgLUVCLy1FTC4KLQotV2VkIEp1bCAxOSAxMTo0OToyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYyAocHJvY2Vzc19hc3NpZ25zKTogVXNlIHRvdXBwZXIgYmVmb3JlIGNvbXBhcmluZyBhZ2FpbnN0Ci0JdXBwZXIgY2FzZSBsZXR0ZXIuCi0JKHdoYXRjb25kKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9yZWxheCk6IFJlbmFtZSBmcm9tIHJlbGF4LCBhbmQgbWFrZSBnbG9iYWwuCi0JUmVuYW1lZCBhbGwgdXNlcy4KLQkoaW5zZXJ0KTogUGFzcyBhIHNpemUgb2YgMiwgbm90IDQuCi0JKGJ1aWxkX3JlbGF4KTogUmVtb3ZlIHVudXNlZCBsZW4gdmFyaWFibGUuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC1saXR0bGUgb3B0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBBZGQgc2VnVCBhcmd1bWVudC4gIFJld3JpdGUgdG8gZ2VuZXJhdGUgcmVsb2NzCi0JcmF0aGVyIHRoYW4gdG8gZ2VuZXJhdGUgY29tcGxldGUgaW5zdHJ1Y3Rpb25zIGhlcmUuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkanVzdCBhbmQgY2xhcmlmeSBSX1NIX1BDUkVMSU1NOEJZNCBjYXNlIGZvcgotCWNoYW5nZXMgaW4gaW5zZXJ0IGFuZCBtZF9wY3JlbF9mcm9tLiAgQWRkIGNhc2VzIGZvciBSX1NIX1BDRElTUAotCWFuZCBSX1NIX1BDRElTUDhCWTIuCi0JKG1kX3BjcmVsX2Zyb20pOiBEb24ndCBzdWJ0cmFjdCAxLCBhZGQgMi4KLQkodGNfY29mZl9maXgycnR5cGUpOiBSZW1vdmUuCi0JKHNoX2NvZmZfcmVsb2NfbWFuZ2xlKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXNoLmggKFRDX0NPRkZfRklYMlJUWVBFKTogSnVzdCByZXR1cm4gZnhfcl90eXBlLgotCShzaF9yZWxheCk6IERlY2xhcmUuCi0JKFRDX0NPVU5UX1JFTE9DKTogSWYgcmVsYXhpbmcsIGNvdW50IFBDIHJlbGF0aXZlIHJlbG9jcy4KLQkoVENfUkVMT0NfTUFOR0xFKTogRGVmaW5lLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0JKHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBEZWNsYXJlLgotCSogdGMuaCAobWRfY29udmVydF9mcmFnKTogQWRkIHNlZ1QgcGFyYW1ldGVyIHRvIG5vbiBCRkRfQVNTRU1CTEVSCi0JZGVjbGFyYXRpb24uCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogQWRkIHNlYyBhcmd1bWVudCB0byBub24KLQlCRkRfQVNTRU1CTEVSIHZlcnNpb24uICBQYXNzIGl0IHRvIG1kX2NvbnZlcnRfZnJhZy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBQYXNzIFNFR19URVhUIHRvIGN2c19mcmFnX3RvX2ZpbGwuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFBhc3Mgc2VnbWVudCBpbmZvIHRvCi0JVENfUkVMT0NfTUFOR0xFLgotCShmaXh1cF9tZGVwcyk6IFBhc3Mgc2VnbWVudCB0eXBlIHRvIG1kX2NvbnZlcnRfZnJhZy4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEFkZCBzZWdUIGFyZ3VtZW50LgotCSogY29uZmlnL3RjLWg4MzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWg4NTAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaTg2MC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5oIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy10YWhvZS5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtdzY1LmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXo4ay5jIChtZF9jb252ZXJ0X2ZyYWcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1oODMwMC5oIChUQ19SRUxPQ19NQU5HTEUpOiBBZGQgc2VnbWVudCBhcmd1bWVudC4KLQkqIGNvbmZpZy90Yy1oODUwMC5oIChUQ19SRUxPQ19NQU5HTEUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy13NjUuaCAoVENfUkVMT0NfTUFOR0xFKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtejhrLmggKFRDX1JFTE9DX01BTkdMRSk6IExpa2V3aXNlLgotCi1Nb24gSnVsIDE3IDE1OjAyOjU0IDE5OTUgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDdXJyZW50X1JvdXRpbmUsIFRleHRfUHNlY3QpOiBEZWxldGUgYXMgZmlsZQotCXNjb3BlIHZhcmlhYmxlcy4KLQkoRGVmaW5lX1JvdXRpbmUsIERlZmluZV9Mb2NhbF9TeW1ib2xzKTogVGFrZSBDdXJyZW50X1JvdXRpbmUgYW5kCi0JVGV4dF9Qc2VjdCBhcyBhcmd1bWVudHMuCi0JKFZNU19EQkdfRGVmaW5lX1JvdXRpbmUpOiBEZWxldGUuCi0JKFZNU19UQlRfQmxvY2tfRW5kKTogQ2hhbmdlIGBTaXplJyBhcmd1bWVudCBmcm9tIGludCB0byB2YWx1ZVQuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogdGV4dCBhbmQgZGF0YSBmaXh1cCBsb29wcyk6IERpZmZlcmVuY2UKLQlvZiB0d28gc3ltYm9scyBoYXMgdHlwZSBvZmZzZXRUIHJhdGhlciB0aGFuIGludDsgY29udmVydCB3aXRoCi0JbWRfbnVtYmVyX3RvX2NoYXJzIGJlZm9yZSBwYXNzaW5nIHRvIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YS4KLQkodm1zX3dyaXRlX29iamVjdF9maWxlOiBkZWJ1ZyBzeW1ib2wgbG9vcCk6IENhbGwgRGVmaW5lX1JvdXRpbmUKLQlpbnN0ZWFkIG9mIFZNU19EQkdfRGVmaW5lX1JvdXRpbmUuCi0KLVNhdCBKdWwgMTUgMDA6MDE6MzUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBBZGQgQGZpeHVwIHNvIHRoYXQgdGhlCi0JY29tcGlsZXIgY2FuIG1hcmsgd2hpY2ggcmVsb2NzIG5vdCB0byBjb21wbGFpbiBhYm91dCB3aXRoCi0JLW1yZWxvY2F0YWJsZS4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBBZGQgLmZpeHVwIHRvIHNlY3Rpb25zIG5vdCB0byBjb21wbGFpbgotCWFib3V0LCBhbmQgYWxzbyBkb24ndCBjb21wbGFpbiBmb3IgQkZEX1JFTE9DX0NUT1IgcmVsb2NhdGlvbnMgaW4KLQl3cml0YWJsZSBub24tY29kZSBzZWdtZW50cy4KLQkobWRfYXBwbHlfZml4KTogVHJlYXQgQkZEX1JFTE9DX0NUT1IganVzdCBsaWtlIEJGRF9SRUxPQ18zMi4KLQotRnJpIEp1bCAxNCAxOTo1NDoyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgU1BBUkMgU3VuT1MgUElDOgotCSogY29uZmlnL3RjLXNwYXJjLmggKHNwYXJjX3BpY19jb2RlKTogQWx3YXlzIGRlY2xhcmUsIG5vdCBqdXN0Ci0Jd2hlbiBPQkpfRUxGLgotCShUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBEZWZpbmUgd2hlbiBPQkpfQU9VVC4KLQkodGNfZml4X2FkanVzdGFibGUpOiBOZXcgZGVmaW5pdGlvbiBmb3IgT0JKX0FPVVQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfcGljX2NvZGUpOiBBbHdheXMgZGVmaW5lLCBub3QganVzdCB3aGVuCi0JT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4KTogQWRqdXN0IHJlbG9jIGFkZGVuZCBmb3IgT0JKX0FPVVQgYW5kIFBJQy4gIEluCi0JQkZEX1JFTE9DXzMyX1BDUkVMX1MyIGNhc2UsIGRvbid0IGluY3JlbWVudCB2YWwgZm9yIGFuIGV4dGVybmFsCi0Jc3ltYm9sIHdoZW4gUElDLgotCSh0Y19nZW5fcmVsb2MpOiBHZW5lcmF0ZSBkaWZmZXJlbnQgUElDIHJlbG9jcyB3aGVuIE9CSl9BT1VULCBhcwotCXdlbGwgYXMgd2hlbiBPQkpfRUxGLgotCShtZF9zaG9ydG9wdHMpOiBJZiBPQkpfQU9VVCwgaW5jbHVkZSBgaycuCi0JKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9BT1VULCBoYW5kbGUgJ2snLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtayBpZiBPQkpfQU9VVCwgYW5kIC1LUElDIGlmIE9CSl9FTEYuCi0JKG1kX3BjcmVsX2Zyb20pOiBEb24ndCBhZGQgaW4gc2l6ZSBmb3IgYW4gZXh0ZXJuYWwgc3ltYm9sIHdoZW4KLQlQSUMuCi0KLVRodSBKdWwgMTMgMjE6MTY6NDMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFVOREVGSU5FRF9ESUZGRVJFTkNFX09LKTogRGVmaW5lIGZvciBTT00uCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jIGZvciBib3RoCi0Jc3ltYm9scyBpbiBhIGZpeHVwIHdoZXJlIGEgZGVmaW5lZCBzeW1ib2wgaXMgc3VidHJhY3RlZCBmcm9tIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCAod2hlbiBVTkRFRklORURfRElGRkVSRU5DRV9PSyBpcyBkZWZpbmVkKS4KLQkoZml4dXBfc2VnbWVudCk6IERvIG5vdGhpbmcgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGlmCi0JVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sgaXMgZGVmaW5lZC4KLQotV2VkIEp1bCAxMiAyMzozMzo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogU3VwcG9ydCBNRF9BUFBMWV9GSVgzLgotCi1XZWQgSnVsIDEyIDAxOjEyOjEyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1wYy5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jIChmaXhfbmV3KTogVXNlIGludCwgbm90IHNob3J0IGludCwgZm9yIGFyZ3VtZW50IHR5cGUuCi0JKGZpeF9uZXdfZXhwKTogRGl0dG8uCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYXJtLSotcmlzY2l4Kik6IERvbid0IHNldCBlbXVsYXRpb25zLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChOT19FQ09GRl9ERUJVR0dJTkcpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HCi0Jd2Fzbid0IHByZXZpb3VzbHkgZGVmaW5lZC4KLQkoc19leHRlcm4pOiBEb24ndCBzZXQgZWNvZmZfZXh0ZXJuX3NpemUgaWYgTk9fRUNPRkZfREVCVUdHSU5HLgotCShub3BpY19uZWVkX3JlbGF4KTogRG9uJ3QgY2hlY2sgaXQgaWYgTk9fRUNPRkZfREVCVUdHSU5HLgotCShtYWNyb19idWlsZCkgWyFVU0VfU1REQVJHXTogRG9uJ3QgdXNlIHZhcmlhZGljIHByb3RvdHlwZS4KLQkobWlwc19sb2NhbF9sYWJlbCkgW05PX0VDT0ZGX0RFQlVHR0lOR106IERvbid0IHByZXNlcnZlIHBvdGVudGlhbAotCUVDT0ZGIGRlYnVnZ2luZyBzeW1ib2xzLgotCi0JKiBlbXVsLmggKHN0cnVjdCBlbXVsYXRpb24pOiBVc2UgdW5zaWduZWQsIG5vdCB1bnNpZ25lZCBjaGFyLCBmb3IKLQliaXRmaWVsZHMuCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWFybS5jIChzeW1ib2xfbWFrZV9lbXB0eSkgW0JGRF9BU1NFTUJMRVJdOiBTZXQKLQl1ZGF0YS5wLCBub3QgdWRhdGEuCi0KLVR1ZSBKdWwgMTEgMTQ6MzA6MTkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC1tNDAxMCBhbmQgLW1uby00MDEwLgotCi1UdWUgSnVsIDExIDE0OjI4OjU1IDE5OTUgIEplZmYgU3BpZWdlbCAgPGplZmZzQGxzaWwuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzQwMTApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbnRlcmxvY2tzKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBDaGVjayBmb3IgYSBjcHUgb2YgInI0MDEwIi4gIFNldCBtaXBzXzQwMTAgY29ycmVjdGx5LgotCUlmIG1pcHNfNDY1MCBvciBtaXBzXzQwMTAsIHNldCBpbnRlcmxvY2tzLgotCShhcHBlbmRfaW5zbik6IENoZWNrIGludGVybG9ja3MsIG5vdCBtaXBzXzQ2NTAuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBMaWtld2lzZS4KLQkobWlwc19pcCk6IE9ubHkgcGVybWl0IElOU05fNDAxMCBpbnN0cnVjdGlvbnMgaWYgbWlwc180MDEwLgotCShtZF9sb25nb3B0cyk6IEFkZCAibTQwMTAiIGFuZCAibm8tbTQwMTAiLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgLW1jcHU9cjQwMTAuICBIYW5kbGUgLW00MDEwIGFuZAotCS1uby1tNDAxMC4KLQkobWRfc2hvd191c2FnZSk6IERvY3VtZW50IC1tNDAxMCBhbmQgLW5vLW00MDEwLgotCi1UdWUgSnVsIDExIDEzOjIyOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoc3RydWN0IGVmZHIpOiBBZGQgbmV3IGZpZWxkIGZha2UuCi0JKGluaXRfZmlsZSk6IEluaXRpYWxpemUgZmFrZS4KLQkoYWRkX2ZpbGUpOiBBZGQgbmV3IHBhcmFtZXRlciBmYWtlLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShlY29mZl9idWlsZF9kZWJ1Zyk6IERvbid0IHdhcm4gYWJvdXQgYSBtaXNzaW5nIC5lbmQgZm9yIGEgZmFrZQotCWZpbGUuCi0KLU1vbiBKdWwgMTAgMTY6MDE6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBTcGxpdCBvdXQgbW9zdCBjcHUgY2hhcHRlcnMuLi4KLQkqIGRvYy9jLSoudGV4aTogLi4udG8gaGVyZS4KLQotCSogcmVhZC5jIChwb19oYXNoKTogTm93IHN0YXRpYy4KLQotTW9uIEp1bCAxMCAxMzo0NzoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlCYXNlZCBvbiBwYXRjaGVzIGZyb20gSC5KLiBMdSA8aGpsQG55bmV4c3QuY29tPjoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeDMpOiBSZW5hbWUgZnJvbSBtZF9hcHBseV9maXgxLgotCUFjY2VwdCBwb2ludGVyIHRvIHZhbHVlIGFuZCBzZWdtZW50LiAgRml4IE9CSl9FTEYgUENSRUwgY2FzZSB0bwotCWhhbmRsZSBnbG9iYWwgZGVmaW5lZCBzeW1ib2xzIGNvcnJlY3RseS4KLQkobWRfYXBwbHlfZml4KTogUmVtb3ZlIGJvdGggdmVyc2lvbnMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChNRF9BUFBMWV9GSVgzKTogRGVmaW5lLgotCi0JKiBjb25maWd1cmUuaW46IFdoZW4gc3dpdGNoaW5nIG9uICR7Y3B1fSwgdXNlICR7Y3B1fSwgbm90Ci0JJFt0YXJnZXRfY3B1fSwgaW4gZGVmYXVsdCBjYXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgSnVsICA4IDEzOjI3OjU1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENhbGwgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgb24KLQlzdWJfc3ltYm9sUCwgaW4gY2FzZSBpdCBpc24ndCBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCi1GcmkgSnVsICA3IDExOjE3OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2xjb21tKTogRm9yIC5sY29tbSAxLCBzZXQgYWxpZ24gdG8gMCwgbm90IDEuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogSWYgU0ZfR0VUX0ZVTkNUSU9OLCBzZXQKLQlCU0ZfRlVOQ1RJT04uCi0JKHN5bWJvbF9nbG9iYWxQLCBzeW1ib2xfZ2xvYmFsX2xhc3RQKTogTmV3IGdsb2JhbCB2YXJpYWJsZXMuCi0JKHlhbmtfc3ltYm9scyk6IFNvcnQgZGVmaW5lZCBnbG9iYWwgc3ltYm9scyB0byB0aGUgZW5kLCBqdXN0Ci0JYmVmb3JlIHRoZSB1bmRlZmluZWQgc3ltYm9scy4KLQkoZ2x1ZV9zeW1ib2xzKTogQWRkIHR3byBhcmd1bWVudHMsIGFuZCB1c2UgdGhlbSBpbnN0ZWFkIG9mCi0JcmVmZXJyaW5nIGRpcmVjdGx5IHRvIGdsb2JhbCB2YXJpYWJsZXMuCi0JKGNyYXdsX3N5bWJvbHMpOiBDYWxsIGdsdWVfc3ltYm9scyB0d2ljZSwgb25jZSBmb3IgZGVmaW5lZCBnbG9iYWxzCi0JYW5kIG9uY2UgZm9yIHVuZGVmaW5lZC4gIEFkZCBjb3JyZXNwb25kaW5nIGtub3cgY2FsbHMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBbHdheXMgYWNjZXB0IFx2LiAgRG9uJ3QgbWFrZSBpdAotCWNvbmRpdGlvbmFsIG9uIEJBQ0tTTEFTSF9WLgotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoQkFDS1NMQVNIX1YpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChCQUNLU0xBU0hfVik6IERvbid0IGRlZmluZS4KLQotCUFkZCBTUEFSQyBFTEYgUElDIHN1cHBvcnQuCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogUGFzcyBmaXhQIHRvIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCwKLQlub3QgZml4UC0+Znhfcl90eXBlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX3BpY19jb2RlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4gCi0JKG1kX2FwcGx5X2ZpeCk6IElmIGdlbmVyYXRpbmcgUElDLCBhZGp1c3QgZnhfYWRkbnVtYmVyIGZvciBhbnkgbm9uCi0JUEMgcmVsYXRpdmUgcmVsb2MuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGdlbmVyYXRpbmcgUElDLCBhZGp1c3QgdmFyaW91cyByZWxvYyB0eXBlcy4KLQlSZW1vdmUgZnhfcGNyZWwgYXNzZXJ0LCBzaW5jZSBpdCBpcyBubyBsb25nZXIgdHJ1ZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1LIFBJQy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChzcGFyY19waWNfY29kZSk6IERlY2xhcmUgaWYgT0JKX0VMRi4KLQkoVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKTogRGVmaW5lIGlmIE9CSl9FTEYuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IFBDIHJlbGF0aXZlIHJlbG9jcyBpZiBQSUMuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBUYWtlIGEgZml4cCwgbm90IGEKLQlyZWxvYyB0eXBlLgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBBZGQgZGVwZW5kZW5jeSBvbiBjb25mLmluLCBzbyB0aGF0IGNvbmYKLQlpcyByZWJ1aWx0IHdoZW4gY29uZi5pbiBjaGFuZ2VzLgotCi1UaHUgSnVsICA2IDE2OjQ5OjM4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBBbGwgZmlsZXM6IFVwZGF0ZWQgRlNGIGFkZHJlc3MuCi0KLVRodSBKdWwgIDYgMTY6MzA6MzQgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChhZGRfZmlsZSk6IERvbid0IGNvbGxhcHNlIG11bHRpcGxlIC5maWxlIGNvbW1hbmRzIGludG8KLQlhIHNpbmdsZSBmaWxlIHN0cnVjdHVyZS4KLQkoZWNvZmZfYnVpbGRfbGluZW5vKTogU2V0IGlsaW5lQmFzZSB0byBzdW0gb2YgcHJldmlvdXMgZmlsZSdzCi0JaWxpbmVCYXNlIGFuZCBjbGluZS4KLQotVGh1IEp1bCAgNiAxMjo1NDoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlQYXRjaGVzIGZyb20gSmVycnkgQmxha2VseSA8Z2VycnlfYmxha2xleUB3ZWxsZmxlZXQuY29tPjoKLQkqIGFzLmMgKGxpc3RpbmdfZmlsZW5hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzaG93X3VzYWdlKTogTWVudGlvbiAtYT1maWxlLgotCShwYXJzZV9hcmdzKTogU3VwcG9ydCA9IG9wdGlvbiBvZiAtYSB0byBzZXQgbmFtZSBvZiBsaXN0aW5nIGZpbGUuCi0JKG1haW4pOiBQYXNzIGxpc3RpbmdfZmlsZW5hbWUgdG8gbGlzdGluZ19wcmludC4KLQkqIGxpc3RpbmcuYyAobGlzdF9maWxlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkodmFyaW91cyk6IFJlcGxhY2UgcHJpbnRmIHdpdGggZnByaW50ZiB0byBsaXN0X2ZpbGUuCi0JKGxpc3RpbmdfcHJpbnQpOiBJZiBuYW1lIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCBvcGVuIGl0IGFzCi0JbGlzdF9maWxlLgotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy4xOiBEb2N1bWVudCAtYT1maWxlLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogRG9uJ3QgcGVybWl0IHJlZGVmaW5pdGlvbiwgZXZlbgotCWlmIHRoZSBzeW1ib2wgd2FzIGFscmVhZHkgaW4gYnNzX3NlY3Rpb24uICBGaXggd2FybmluZyBtZXNzYWdlLgotCi0JKiBsaXN0aW5nLmMgKHN0cnVjdCBmaWxlX2luZm9fc3RydWN0KTogUmVuYW1lIGVuZF9wZW5kaW5nIGZpZWxkIHRvCi0JYXRfZW5kLgotCShmaWxlX2luZm8pOiBJbml0aWFsaXplIGF0X2VuZCwgbm90IGVuZF9wZW5kaW5nLgotCShidWZmZXJfbGluZSk6IElmIGF0X2VuZCBzZXQsIGp1c3QgcmV0dXJuIGltbWVkaWF0ZWx5LiAgRG9uJ3QKLQl3b3JyeSBhYm91dCBlbmRfcGVuZGluZyBjYXNlcy4gIFNldCBhdF9lbmQgd2hlbiBFT0YgaXMgcmVhZC4KLQkocHJpbnRfc291cmNlKTogQ2hlY2sgYXRfZW5kLCBub3QgZW5kX3BlbmRpbmcuCi0JKGxpc3RpbmdfbGlzdGluZyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoYWxwaGFfZG9fYWxpZ24pOiBEb24ndCBkZWNsYXJlLgotCShtZF9kb19hbGlnbik6IERvbid0IGRlZmluZS4KLQkodGNfZnJvYl9sYWJlbCk6IERlZmluZS4KLQkoYWxwaGFfZGVmaW5lX2xhYmVsKTogRGVjbGFyZS4KLQkobWRfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBEZWZpbmUuCi0JKGFscGhhX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChpbnNuX2xhYmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXV0b19hbGlnbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBjYXNlcyBmb3IgLnRleHQsIC5kYXRhLCAuYWxpZ24sIC5ieXRlLAotCS5od29yZCwgLmludCwgLmxvbmcsIC5vY3RhLCAucXVhZCwgLnNob3J0LCAud29yZCwgLmRvdWJsZSwgLmZsb2F0LAotCWFuZCAuc2luZ2xlLiAgQ2hhbmdlIC50X2Zsb2F0aW5nLCAuc19mbG9hdGluZywgLmZfZmxvYXRpbmcsCi0JLmdfZmxvYXRpbmcsIGFuZCAuZF9mbG9hdGluZyB0byB1c2Ugc19hbHBoYV9mbG9hdF9jb25zIHJhdGhlciB0aGFuCi0JZmxvYXRfY29ucy4KLQkoc19hbHBoYV90ZXh0LCBzX2FscGhhX2RhdGEpOiBOZXcgc3RhdGljIGZ1bmN0aW9ucy4KLQkoc19yZGF0YSwgc19zZGF0YSk6IENsZWFyIGluc25fbGFiZWwgYW5kIHNldCBhdXRvX2FsaWduLgotCShzX2dwcmVsMzIpOiBJZiBhdXRvX2FsaWduLCBhbGlnbi4gIENsZWFyIGluc25fbGFiZWwuCi0JKGVtaXRfaW5zbik6IENsZWFyIGluc25fbGFiZWwuCi0JKHNfYWxwaGFfYWxpZ24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhbHBoYV9hbGlnbik6IE1ha2Ugc3RhdGljLiAgVGFrZSBsYWJlbCBhcmd1bWVudC4KLQkoYWxwaGFfZmx1c2hfcGVuZGluZ19vdXRwdXQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShzX2FscGhhX2NvbnMsIHNfYWxwaGFfZmxvYXRfY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShhbHBoYV9kZWZpbmVfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBKdWwgIDUgMjI6NDk6MzEgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmYuaW46IFJlZ2VuZXJhdGUgd2l0aCBhdXRvcmVjb25mLgotCi0JTW9uIEp1bCAgMyAxOTo0Nzo1MyAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAodm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKTogVXNlIGZ1bGwgcHJvdG90eXBlLgotCSh2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwsIHRjX2Zyb2JfbGFiZWwpOiBNb3ZlIHRoZW0gdG8gZ3JvdXAKLQl3aXRoIG90aGVyIHByb3RvdHlwZXMuCi0JW1dBTlRfVk1TX09CSl9ERUZTXTogT25seSBkZWZpbmUgdGhlIG1hbnkgT0JKX3gsIERCR194LCBhbmQgRFNUX3gKLQltYWNyb3Mgd2hlbiB0aGlzIGlzIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLXZtcy5jOiBGdWxseSBwcm90b3R5cGUgYWxsIGxvY2FsIGZ1bmN0aW9ucy4KLQlbc3ltYm9sUywgZnJhZ1NdOiBVc2UgY29uc2lzdGVudGx5IGluc3RlYWQgb2YgdGhlaXIgc3RydWN0IHRhZ3MuCi0JW1dBTlRfVk1TX09CSl9ERUZTXTogRGVmaW5lIHRoaXMuCi0JKHNfY29uc3QpOiBNYWtlIGRlZmluaXRpb24gY29ycmVjdGx5IG1hdGNoIGFjdHVhbCB1c2FnZS4KLQkoVk1TX3N0YWJfcGFyc2UpOiBNYWtlIGBleHBlY3RlZF90eXBlJyBhcmcgYmUgaW50IHJhdGhlciB0aGFuIGNoYXIuCi0JKGdldF9WTVNfdGltZV9vbl91bml4KTogRGVmaW5lIGFzIGBzdGF0aWMgdm9pZCcuCi0JKGhhc2hfc3RyaW5nKTogTWFrZSBkZWZpbml0aW9uIG1hdGNoIGFjdHVhbCB1c2FnZTsgYXJndW1lbnQgaXMKLQlgY2hhciBjb25zdCAqJyByYXRoZXIgdGhhbiBgdW5zaWduZWQgY2hhciAqJy4KLQkoVk1TX0Nhc2VfSGFja19TeW1ib2wsIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcywgVk1TX1BzZWN0X1NwZWMsCi0JVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyk6IERlY2xhcmUgc3RyaW5nIGFyZ3MgYXMgYGNvbnN0IGNoYXIgKicuCi0JW0lTX0dYWF9WVEFCTEVdOiBOZXcgbWFjcm8uCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogR1NEIGxvb3ApOiBVc2UgaXQuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZTogZGF0YSBzZWdtZW50KTogUmVvcmdhbml6ZSBgZmlsbCcgbG9vcC4KLQotV2VkIEp1bCAgNSAxMjowMTo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zaG9ydG9wdHMpOiBBZGQgIks6IiBpZiBPQkpfRUxGLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiBPQkpfRUxGLCBjaGVjayBmb3IgLUsuICBEaWUgaWYgLUsgUElDLCBzaW5jZQotCVBJQyBjb2RlIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogQ2hhbmdlIHN0ZF9zaG9ydG9wdHMgdG8gYmUgYW4gYXJyYXkgcmF0aGVyCi0JdGhhbiBhIGNvbnN0YW50IHN0cmluZy4gIE9ubHkgaW5jbHVkZSAnSycgaWYgV09SS0lOR19ET1RfV09SRCBpcwotCW5vdCBkZWZpbmVkLiAgT25seSBjaGVjayBmb3IgJ0snIGluIHRoYXQgY2FzZSBhcyB3ZWxsLgotCSogYXMuaCAoZmxhZ193YXJuX2Rpc3BsYWNlbWVudCk6IE9ubHkgZGVjbGFyZSBpZiBXT1JLSU5HX0RPVF9XT1JECi0JaXMgbm90IGRlZmluZWQuCi0KLQkqIGNvbmYuaW46IEFkZCB1bmRlZiBvZiBIQVZFX1NCUksuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9saW5lKTogQ2FsbCBsaXN0aW5nX3NvdXJjZV9saW5lLCBpbgotCWJvdGggQkZEX0FTU0VNQkxFUiBhbmQgbm9uIEJGRF9BU1NFTUJMRVIgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9uLgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX0VYVEVSTkFMKTogV2FybiBpZiBzeW1ib2wgaXMgd2Vhay4KLQkoU19DTEVBUl9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX1NFVF9XRUFLKTogV2FybiBpZiBzeW1ib2wgaXMgZ2xvYmFsLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQKLQl0byBwdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbnRvIGEgc2V0LgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIEBjb25maWd1cmVfaW5wdXRAOyBpdCdzIG5vdCBuZWVkZWQgaW4KLQlmaWxlcyBuYW1lZCBNYWtlZmlsZS4KLQotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIuc2V0IiBzbyB0aGF0IHRoZQotCWV4cGxpY2l0IHBzZXVkby1vcCB3b3Jrcywgd2hpbGUgY29udGludWluZyB0byB0cmVhdCAic2V0IiBhcyBhbgotCWluc3RydWN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9kZWJ1Z2dpbmdfc2Vlbik6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9kZWYpOiBTZXQgZWNvZmZfZGVidWdnaW5nX3NlZW4uCi0JKGVjb2ZmX3N0YWIpOiBMaWtld2lzZS4KLQkqIGVjb2ZmLmg6IE1ha2UgaWRlbXBvdGVudC4KLQkoZWNvZmZfZGVidWdnaW5nX3NlZW4pOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYzogSW5jbHVkZSBlY29mZi5oLgotCShtaXBzX2RlYnVnKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19zdHJpbmdlciwgc19taXBzX3NwYWNlKTogUmVtb3ZlIHVubmVlZGVkIGRlY2xhcmF0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSW4gY2FzZSAnZycsIHNldCBtaXBzX2RlYnVnIHRvIGRlYnVnZ2luZyBsZXZlbC4KLQkobWlwc19sb2NhbF9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkqIHRjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBDYWxsIG1pcHNfbG9jYWxfbGFiZWwuCi0JKG1pcHNfbG9jYWxfbGFiZWwpOiBEZWNsYXJlLgotCi1XZWQgSnVsICA1IDAwOjU5OjIyIDE5OTUgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhcy5jIChtYWluKTogIE9ubHkgdXNlIHNicmsgd2hlbiBIQVZFX1NCUksgZGVmaW5lZC4KLQkqIGNvbmZpZ3VyZS5pbjogIEFkZCB0ZXN0IGZvciBzYnJrLgotCSogY29uZmlndXJlOiAgUmVnZW5lcmF0ZSB1c2luZyBhdXRvY29uZiAyLjQuCi0KLU1vbiBKdWwgIDMgMTU6NTg6MTYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKE1BWF9SRUxPQ19FWFBBTlNJT04pOiBCdW1wIHRvIDYuCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlCi0JcmVsb2NhdGlvbnMgZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHR3byAocG9zc2libHkgZXh0ZXJuYWwpCi0Jc3ltYm9scy4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IEZvciBTT00sIHJlamVjdCByZWR1Y3Rpb25zIGludm9sdmluZwotCXRoZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3IgZXhwcmVzc2lvbnMKLQlpbnZvbHZpbmcgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMuCi0KLU1vbiBKdWwgIDMgMTQ6MjI6NTkgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlWy5pbl0gKGkzODYtKi13aW4zMik6IE5ldyBob3N0IGFuZCB0YXJnZXQuCi0KLVRodSBKdW4gMjkgMTc6MjU6NDMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIGxvbmcgZmlsZW5hbWVzIG5vbi1iZmQgY29mZi4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaWxlbmFtZV9saXN0X2hlYWQsIGZpbGVuYW1lX2xpc3RfdGFpbCk6IE5ldy4KLQkoeWFua19zeW1ib2xzKTogTm90aWNlIGFuZCByZWNvcmQgZmlsZW5hbWVzIHdoaWNoIGFyZSB0b28gbG9uZy4KLQkod19zdHJpbmdzKTogV3JpdGUgb3V0IGZpbGVuYW1lIHN0cmluZ3MuCi0JKGNfZG90X2ZpbGVfc3ltYm9scyk6IFB1dCBsb25nIGZpbGVuYW1lcyBvbnRvIGxpc3QuCi0KLVdlZCBKdW4gMjggMTc6MzM6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBQRSBkb2Vzbid0IHVzZQotCXRoZSBzdHJhbmdlIGNvbW1vbiBzeW1ib2wgZm9ybWF0IHRoYXQgb3RoZXIgMzg2cyBmb3JtYXRzCi0JZG8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9iZWdpbik6IElmIExFWF9BVCBkZWZpbmVkIHRoZW4KLQknQCcgaXMgaW4gdGhlIHNldCBvZiBpZGVudGlmaWVycy4KLQkoaTM4Nl9vcGVyYW5kKTogSWYgTEVYX0FULCB0aGVuIGRvbid0IGxvb2sgZm9yIEBnb3RvIHN0dWZmLgotCSogY29uZmlnL3RlLXBlLmg6IERlZmluZSBMRVhfQVQuCi0KLVdlZCBKdW4gMjggMTc6NDk6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChIOC81MDAgRmxvYXRpbmcgUG9pbnQpOiBJbmRpY2F0ZSB0aGF0IElFRUUgRlAKLQludW1iZXJzIGFyZSBmb3IgdGhlIHN0YW5kYXJkIGVtdWxhdGlvbiBjb2RlLgotCShTSCBGbG9hdGluZyBQb2ludCk6IERpdHRvLgotCShPdmVydmlldyk6IERlc2NyaWJlIG5ldyAtLWVtdWxhdGlvbiBvcHRpb24gZm9yIE1JUFMuCi0JKiBkb2MvKi5tNDogRGVsZXRlZC4KLQotVGh1IEp1biAyMiAxOToyNjoyNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU3VuIE1heSAgNyAxMTo1Mzo0MSBNRFQgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBpMzg2LSotbW9zcyogdGFyZ2V0LgotCi1UaHUgSnVuIDIyIDE0OjQxOjIzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYXN0IGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lCi0JYXJndW1lbnQgdG8gY2hhciAqIHRvIGF2b2lkIHdhcm5pbmcuCi0KLVdlZCBKdW4gMjEgMTg6MDc6NTkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluc3dvcmQpOiBJbmNyZW1lbnQgdGhlIGZyYWcgb2Zmc2V0cy4KLQkoc3RydWN0IG02OGtfaXQpOiBBZGQgcmVsb2NbXS5wY3JlbF9maXggZmllbGQgdG8gaG9sZCBwYy1yZWwKLQlmaXh1cC4KLQkoYWRkX2ZpeCk6IEFjY2VwdCBhZGRpdGlvbmFsIHBhcmFtZXRlciwgdGhlIHBjLXJlbCBmaXh1cC4gQWxsCi0JY2FsbGVycyBjaGFuZ2VkLiAgRml4IG9mZnNldCBhZGRyZXNzIGlmIHdpZHRoID09ICdiJy4KLQkobTY4a19pcCkgW2Nhc2UgQUlORFhdOiBBbGxvdyBleHBsaWNpdCBzaXplIHNwZWMuICBEb24ndCBtYWtlIHRoZQotCW91dGVyIGRpc3BsYWNlbWVudCBwYy1yZWxhdGl2ZS4KLQkobWRfcGNyZWxfZnJvbSk6IE1ha2UgaXQgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGV4dGVuc2lvbiB3b3JkIG9mCi0JdGhlIG9wZXJhbmQuCi0JKG9wY29kZV9wdHIpOiBNYWtlIGl0IGEgbWFjcm8gaWYgRE9fQlJFQUtfVVBfQklHX0RFQ0wgaXMKLQl1bmRlZmluZWQuCi0JKG1kX2NvbnZlcnRfZnJhZ18xKTogRG9uJ3QgcmVmZXJlbmNlIGZyYWdQLT5mcl9vcGNvZGVbMi4uXS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpIFtjYXNlIFRBQiAoRkJSQU5DSCwgU1pfVU5ERUYpXToKLQlUdXJuIG9uIGxvbmcgYml0LgotCShtNjhrX2lwKSBbY2FzZSAnQyddOiBEb24ndCBzZXQgc2V0IGxvbmcgYml0LCBzZXQgaXQgaW4gdGhlIG9wY29kZQotIAl0YWJsZS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpIFtjYXNlIFRBQiAoUENJTkRFWCwgU1pfVU5ERUYpXToKLQlWYXJpYWJsZSBwYXJ0IGluY3JlYXNlcyBieSBmb3VyLCBub3Qgc2l4LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCkgW1RDX002OEtdOiBEb24ndCBkbyBmdXJ0aGVyIHBjcmVsCi0JcHJvY2Vzc2luZyBhZnRlciBjb252ZXJ0aW5nIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlCi0Jc2FtZSBzZWdtZW50LgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogRG9uJ3QgY29uZGl0aW9uYWxpemUgdGhlIHBjcmVsIGZpeCBvbgotCVRDX002OEsuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCwgY2FzZSAnQScpOiBJZiBBU0kgaXMgbm90IGEgIiMiCi0JdmFsdWUsIGRvbid0IHNoaWZ0IGl0IGFuIGV4dHJhIHRpbWUuCi0KLVdlZCBKdW4gMjEgMTQ6MTg6MzcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZ2FzcC5jIChkb19wcmludCwgZG9fZm9ybSwgYnVmZmVyX2FuZF9uZXN0KTogVXNlIGNhc2UgaW5zZW5zaXRpdmUKLQlzdHJpbmcgY29tcGFyZXMuCi0KLVR1ZSBKdW4gMjAgMTQ6NTU6MDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2FzdCB0aW1lKCkgYXJndW1lbnQgdG8KLQl0aW1lX3QgKi4KLQotVHVlIEp1biAyMCAxMjowMDo1MyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogRml4IHR5cG8gaW4gbGFzdAotCWNoYW5nZS4KLQotTW9uIEp1biAxOSAxNToyNzoxNyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogWmVybyBvdXQgbWVtb3J5Ci0JZnJvbSBmcmFnX21vcmUgY2FsbHMuCi0KLVRodSBKdW4gMTUgMTY6NTM6MzcgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYzogRG9uJ3QgdXNlICJiZmQvIiB3aGVuIGluY2x1ZGluZyBsaWJiZmQuaAotCWFuZCBsaWJjb2ZmLmguCi0JKGZpbGxfc2VjdGlvbik6IENhbGwgUFJPR1JFU1MuCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBBZGQgYmZkIHNyY2Rpci4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIGJmZF9nYXMgZmxhZyBhbmQgc2V0IGZvciBlYWNoIGNvbmZpZy4KLQkoaTM4Ni11bmtub3duLWdvMzIsIG02OGstdW5rbm93bi1jb2ZmKTogUmVjb2duaXplLgotCSogbXB3LW1ha2UuaW4gKEhBQ0tfT19SQU1BLCBPQkpfQ09GRl9PTUlUX1RJTUVTVEFNUCk6IEFkZCB0bwotCWNvbmZpZy5oLgotCi1UaHUgSnVuIDE1IDEwOjA0OjI2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoTE9DQUxfTEFCRUwpOiBQcmVwZW5kICcuJyBpZiBub3QgT0JKX0FPVVQuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IExpa2V3aXNlLgotCi1Nb24gSnVuIDEyIDIyOjI1OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IENoZWNrIGZvciBpbnZhbGlkIHJlZ2lzdGVyIGluIHNpbmdsZQotCXByZWNpc2lvbiBmbXB5YWRkIGFuZCBmbXB5c3ViIGluc3RydWN0aW9ucy4KLQotVGh1IEp1biAgOCAxOTozMzowMiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYyAobXluYW1lKTogRGVsZXRlIGFsbCByZWZlcmVuY2VzLgotCShWTVNfc3RhYl9wYXJzZSwgV3JpdGVfVk1TX01IRF9SZWNvcmRzLCBWTVNfQ2FzZV9IYWNrX1N5bWJvbCk6Ci0JUmVwbGFjZSBwcmludGYgY2FsbHMgd2l0aCBhc190c2t0c2suCi0JKFBVVF9MT05HLCBQVVRfU0hPUlQpOiBVc2UgQ09QWV9MT05HLCBDT1BZX1NIT1JULgotCShWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEpOiBNb3ZlIHNlY29uZCBidWZmZXIgY2FwYWNpdHkgY2hlY2sKLQliZWxvdyBib3R0b20gb2YgbG9vcDsgZmlyc3QgY2hlY2sgYXQgdG9wIHN1ZmZpY2VzIGZvciBsb29wIGl0c2VsZi4KLQkoZmluZF9maWxlKTogUmVtb3ZlIHJlZHVuZGFudCBwb2ludGVyIGNoZWNrcyBpbiBmaXJzdCB0d28gbG9vcHM7Ci0JcmVwbGFjZSB0aGlyZCBsb29wIHdpdGggcG9pbnRlciB0byBsYXN0IGxpc3QgZWxlbWVudCBkZXRlcm1pbmVkCi0JaW4gZmlyc3QgbG9vcC4KLQotVHVlIEp1biAgNiAxMzo1MzowNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBIYW5kbGUgZGVmaW5lZCBhYnNvbHV0ZSBzeW1ib2xzIGFzCi0JQVNJIHZhbHVlcy4KLQotCSogY29uZmlnL29iai12bXMuYyAodm1zX3dyaXRlX29iamVjdF9maWxlLCBjYXNlIE5fREFUQSk6IFVzZQotCXN0cmNtcCBhZ2FpbnN0IEZBS0VfTEFCRUxfTkFNRSBpbnN0ZWFkIG9mIGNoZWNraW5nIHRoaXJkCi0JY2hhcmFjdGVyLiAgKFN1Z2dlc3RlZCBieSBQYXQgUmFua2luLikKLQotTW9uIEp1biAgNSAyMDoxMDo0NiAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCUFkZCBzdXBwb3J0IGZvciBOX0FCUyBhbmQgTl9BQlN8Tl9FWFQgdHlwZSBzeW1ib2xzLgotCi0JKiBjb25maWcvb2JqLXZtcy5oIChMU1lfU19NX3tERUYsUkVMfSwgRU5WX1NfTV97REVGLE5FU1RFRH0pOgotCU5ldyBtYWNyb3MgZm9yIGxvY2FsIHN5bWJvbHMgKGZyb20gPGxzeWRlZi5oPiBhbmQgPGVudmRlZi5oPikuCi0JKiBjb25maWcvb2JqLXZtcy5jIChDdXJyZW50X0Vudmlyb25tZW50KTogTmV3IGZpbGUtc2NvcGUgdmFyaWFibGUuCi0JKFZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCk6IE5ldyByb3V0aW5lLgotCShHQkxTWU1fTENMKTogTmV3IG1hY3JvLgotCShWTVNfR2xvYmFsX1N5bWJvbF9TcGVjKTogSGFuZGxlIGxvY2FsIHN5bWJvbHMgdG9vLgotCShWTVNfUHNlY3RfU3BlYyk6IFNldCBHTE9CQUxWQUxVRV9CSVQgZm9yIGFic29sdXRlIHN5bWJvbHMuCi0JKFZNU19FbWl0X0dsb2JhbHZhbHVlcyk6IEhhbmRsZSBsb2NhbCBhbmQgZ2xvYmFsIGFic29sdXRlIHN5bWJvbHMuCi0JKFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSk6IERpdHRvLgotCSh2bXNfd3JpdGVfb2JqZWN0X2ZpbGU6IEdTRCBzeW1ib2wgbG9vcCk6IERpdHRvLgotCi1Nb24gSnVuICA1IDE2OjEwOjQwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCi1Nb24gSnVuICA1IDAyOjE3OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251Kik6IEFsd2F5cyB1c2UgR05VIEVMRiBjb25maWcuCi0KLVdlZCBNYXkgMzEgMTc6NDk6MTggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBVcGRhdGUgKnN5bWJvbFBQCi0JaW4gYGVsc2UnIGNsYXVzZSB3aGVuIHJlbW92aW5nIGEgc3ltYm9sLiAgQWxzbywgcmV2aXNlIGNvbW1lbnRzCi0JdG8gbWF0Y2ggdGhlIGNvZGUuCi0JKHZtc193cml0ZV9vYmplY3RfZmlsZSAoR1NEIHN5bWJvbCBsb29wLCBjYXNlIE5fREFUQSkpOiBOZXZlcgotCW91dHB1dCBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIGxvY2FsIG51bWVyaWMgbGFiZWxzLgotCi1UdWUgTWF5IDMwIDE4OjI5OjEwIDE5OTUgIFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogY29uZmlndXJlLmluIChhcmNoaXRlY3R1cmUgdmFyaWFudHMsIGNhc2VzIGFybWViIGFuZCBhcm0qKTogUmVtb3ZlCi0Jc3BhY2VzIHJvdW5kIGFzc2lnbm1lbnQgdG8gZW5kaWFuLgotCi1UdWUgTWF5IDMwIDEyOjMxOjMxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgZm9yIHVuZGVmaW5lZCBsb2NhbCBkb2xsYXIKLQlhbmQgZmIgbGFiZWxzLgotCi0JKiBzeW1ib2xzLmMgKGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lKTogRXh0cmFjdCBpbnN0YW5jZSBudW1iZXIKLQlmcm9tIHRoZSBjb3JyZWN0IGxvY2F0aW9uLgotCi1TYXQgTWF5IDI3IDIxOjI4OjQ5IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RlLWRweDIuaDogSW5jbHVkZSBvYmotZm9ybWF0LmguCi0JKENPRkZfTUFHSUMpOiBSZW5hbWVkIGZyb20gRklMRV9IRUFERVJfTUFHSUMuCi0KLVdlZCBNYXkgMjQgMTM6NDU6MzIgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW4sIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmYuaDoKLQlBZGQgc3VwcG9ydCBmb3IgQVJNIHBlCi0KLVR1ZSBNYXkgMjMgMTc6MDA6MzIgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNgotCWFuZCBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOS4KLQotVHVlIE1heSAyMyAxOToxODozMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKSBbISBVU0VfRU1VTEFUSU9OU106IEFsd2F5cyBwcmludCBhbiBlcnJvcgotCW1lc3NhZ2UuCi0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRG9jdW1lbnQgb2JqX2FwcF9maWxlIGFuZAotCVRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCi1Nb24gTWF5IDIyIDIwOjAzOjIzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBBZGQgZXh0cmEgbGVhZGluZyBhcmd1bWVudCwgZm9yIDQgTWF5Ci0JY2hhbmdlLgotCSogZWNvZmYuaCAoZWNvZmZfc3RhYik6IEZpeCBkZWNsYXJhdGlvbi4KLQkqIG9iai5oIChmb3JtYXRfb3BzLnByb2Nlc3Nfc3RhYik6IEluY2x1ZGUgcHJvdG90eXBlLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1BST0NFU1NfU1RBQik6IFBhc3MgdGhyb3VnaCBzZWcgYXJndW1lbnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9CSl9QUk9DRVNTX1NUQUIpOiBEaXR0by4KLQotCSogY29uZmlnL2UtbWlwc2VsZi5jIChtaXBzZWxmKTogTmV3IGVtdWxhdGlvbiBtb2RlLCBkb2Vzbid0IGNoYW5nZQotCWVuZGlhbm5lc3MgZnJvbSBjb25maWd1cmVkIGRlZmF1bHQuCi0JKiBjb25maWcvZS1taXBzZWNvZmYuYyAobWlwc2Vjb2ZmKTogRGl0dG8uCi0JKiBjb25maWd1cmUuaW4gKG1pcHMgZWNvZmYvZWxmIHRhcmdldHMpOiBJbmNsdWRlIHRoZW0uCi0JKiBhcy5jIChtaXBzZWxmLCBtaXBzZWNvZmYpOiBEZWNsYXJlLgotCi0JKiBhcy5jIChlbXVsYXRpb25fbmFtZSk6IE5ldyB2YXJpYWJsZS4KLQkoc2VsZWN0X2VtdWxhdGlvbl9tb2RlKTogU2V0IGVtdWxhdGlvbl9uYW1lLiAgRG9uJ3QgY2hhbmdlIGFyZ3YuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1lbXVsYXRpb247IGNvbXBsYWluIGlmIHRoZSBzdXBwbGllZCBuYW1lCi0JaXNuJ3Qgd2hhdCBzZWxlY3RfZW11bGF0aW9uX25hbWUgY2FtZSB1cCB3aXRoLgotCi1TdW4gTWF5IDIxIDIxOjM2OjE3IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBSZXZlcnNlIGNoYW5nZXMgZnJvbSBEZWMuIDE5dGggd2hpY2gKLQljaGFuZ2VkIHRoZSB3YXkgdW53aW5kcyB3ZXJlIGJ1aWx0IGZvciBFTEYuICBSZWx5IG9uIHJlbG9jYXRpb24KLQlzeW1ib2wgcmVkdWN0aW9ucyB0byBhdm9pZCBwbGFjaW5nIHRoZSBlbmQgb2YgZnVuY3Rpb24gbWFya2VyCi0Jc3ltYm9scyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4KLQotU2F0IE1heSAyMCAxMjozMTozNiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlBZGRlZCBpbXByb3ZlZCBWTVMgc3VwcG9ydCBmcm9tIFBhdCBSYW5raW46Ci0KLQlGcmkgMTkgTWF5IDE2OjUxOjQwIDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChBT1VUX1NUQUJTKTogRGVmaW5lLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChmcHVzaCwgcnB1c2gpOiBOZXcgcm91dGluZXMuCi0JKHB1c2gpOiBSZXBsYWNlZCBieSB0aGUgYWJvdmUuCi0JKGZpbmRfc3ltYm9sKTogU2xpZ2h0IHJlb3JnYW5pemF0aW9uIHRvIGV4cG9zZSB0YWlsIHJlY3Vyc2lvbi4KLQotCUZyaSBNYXIgMTcgMTg6NDA6MzYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6ICBkZWxldGUgdGhpcy4KLQkqIHZtc2NvbmYuc2ggKG1ha2UtZ2FzLmNvbSk6ICBidWlsZCAuLi9saWJpYmVydHkvbGliZXJ0eS5vbGIKLQlmaXJzdCBpZiBuZWNlc3Nhcnk7IGxpbmsgZ2FzIGFnYWluc3QgaXQuCi0KLUZyaSBNYXkgMTkgMTY6Mzc6MzkgMTk5NSAgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBnYXNwLmMgKGlzdHJ1ZSk6IENvcnJlY3RseSB0ZXN0IGZvciBzdHJpbmcgaW5lcXVhbGl0eS4KLQotVGh1IE1heSAxOCAwNDoyNToxMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBjb25maWcvdGMtYXJtLmMgKENQX1Rfe1ByZSxVRCxXQn0pOiBEZWZpbmUsIGJpdHMgaW4gY28tcHJvY2Vzc29yCi0JaW5zdHJ1Y3Rpb25zLgotCShbbHNdZm1fZmxhZ3MpOiBDb3JyZWN0IGVycm9yIGluIGJpdG1hc2tzLgotCShjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBEZWxldGUgc2Vjb25kIHBhcmFtZXRlciwgRkxBR1MuICBBbGwKLQljYWxsZXJzIGNoYW5nZWQuICBSZW1vdmUgYWxsIGRlYWQgY29kZSByZWZlcnJpbmcgdG8gRkxBR1MuICBJZgotCWFkZHJlc3MgaXMganVzdCAiW1JlZ10iIHRoZW4gY29udmVydCBpbnRvIGEgUFJFLUlOQ1JFTUVOVCBVUCBmb3JtYXQuCi0JKGRvX2ZwX2xkbXN0bSk6IEhhbmRsZSBmdWxsLWRlc2NlbmRpbmcgYW5kIGVtcHR5LWFzY2VuZGluZyBzdGFjawotCWZvcm1hdHMgZXhwbGljaXRseS4KLQotCSogY29uZmlnL3RjLWFybS5jIChpbnRlcm5hbEVycm9yKTogRGVmaW5lLgotCShBUk1fezEsMiwyNTAsMyw2LDcsN0RNLEFOWSwyVVAsQUxMLDNVUCw2VVAsTE9OR01VTH0pOiBEZWZpbmUgcHJvY2Vzc29yCi0JdmFyaWFudHMuCi0JKEZQVV97Q09SRSxGUEExMCxGUEExMSxOT05FLEFMTCxNRU1NVUxUSX0pOiBEZWZpbmUgZmxvYXRpbmcgcG9pbnQKLQl2YXJpYW50cy4KLQkoe0NQVSxGUFV9X0RFRkFVTFQpOiBEZWZpbmUuCi0JKGNwdV92YXJpYW50KTogTmV3IHZhcmlhYmxlLgotCShhc21fZmxnKTogQ2hhbmdlIG1vcmVfZmxhZ3MgdG8gZmxhZ19iaXRzLgotCUFkZCBwcm90b3R5cGVzIGZvciBuZXcgZnVuY3Rpb25zLgotCShGTEFHX3tTLFAsQixULEVELEZELEZBLEVBLElCLElBLERCLERBLEx9KTogRGVsZXRlLgotCShzX2ZsYWdbXSwgbGRzdF9mbGFnc1tdLCBieXRlX2ZsYWdbXSwgY21wX2ZsYWdzW10sIGxkbV9mbGFnc1tdLAotCSBzdG1fZmxhZ3NbXSwgbGZtX2ZsYWdzW10sIHNmbV9mbGFnc1tdLCByb3VuZF9mbGFnc1tdLCBleGNlcHRfZmxhZ3NbXSwKLQkgY3Bsb25nX2ZsYWdbXSk6IE5ldyB2YXJpYWJsZXMuCi0JKGFzbV9vcGNvZGUsIGluc25zW10pOiBOZXcgZm9ybWF0LCBhZGQgdmVyc2lvbiBzdXBwb3J0LgotCShhcm1fZmxnX2hzaCk6IERlbGV0ZS4KLQkoZG9fbXVsLCBkb19tbGEpOiBSZW1vdmUgIldhcm5pbmciIGZyb20gd2FybmluZyBtZXNzYWdlcy4KLQkoZG9fYXJpdCk6IFNpbXBsaWZ5LgotCShkb19zd2FwKTogTWFrZSBlcnJvciBtZXNzYWdlIG1vcmUgYXBwcm9wcmlhdGUuCi0JKG1kX2JlZ2luKTogQnVpbGQgaGFzaCB0YWJsZXMgc3RhcnRpbmcgYXQgZmlyc3QgZW50cnkgaW4gdGFibGVzLgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBDb3BlIHdpdGggYmlnL2xpdHRsZS1lbmRpYW4gc2VsZWN0aW9uLgotCShtZF9jaGFyc190b19udW1iZXIpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IFJld3JpdGUgdG8gbWFrZSBlbmRpYW4gaW5kZXBlbmRlbnQuCi0JKHRjX2dlbl9yZWxvYyk6IEJldHRlciBlcnJvciBtZXNzYWdlcy4KLQkobWRfYXNzZW1ibGUpOiBSZWplY3Qgb3Bjb2RlcyBmb3JiaWRkZW4gYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBjcHUKLQl2YXJpYW50LiAgUmV3cml0ZSBoYW5kbGluZyBjb2RlIGZvciBpbnN0cnVjdGlvbiBmbGFncy4KLQkobWRfc2hvcnRvcHRzKTogQWRkIG9wdGlvbiAibToiLgotCShtZF9wYXJzZV9vcHRpb24pOiBHZXQgdGhlIGRlc2lyZWQgY3B1L2ZwdSB2YXJpYW50LgotCi0JRnJvbTogRGF2aWQgVGF5bG9yIChkdGF5bG9yQGFybWx0ZC5jby51aykKLQkqIGNvbmZpZ3VyZS5pbiAoYXJjaGl0ZWN0dXJlIHZhcmlhbnRzKTogQ2hlY2sgZm9yICJhcm1lYiIgYW5kICJhcm0qIiwKLQlzZXQgZW5kaWFubmVzcyBhY2NvcmRpbmdseS4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogTmV3IGhvb2tzIG1kX3N0YXJ0X2xpbmVfaG9vayBhbmQKLQltZF9hZnRlcl9wYXNzX2hvb2suCi0JKiBjb25maWcvYXJtLXtiaWcsbGl0fS5tdDogTmV3IGZpbGVzCi0JKiBjb25maWcvdGMtYXJtLmggKHtMSVRUTEUsQklHfV9FTkRJQU4sIEJZVEVfT1JERVIpOiBEZWZpbmUuCi0JKFRBUkdFVF9GT1JNQVQpOiBTZWxlY3QgZGVwZW5kaW5nIG9uIGVuZGlhbm5lc3MgYW5kIGVtdWxhdGlvbiBhbmQKLQlvYmplY3QgZm9ybWF0LgotCShtZF9hZnRlcl9wYXNzX2hvb2ssIG1kX3N0YXJ0X2xpbmVfaG9vayk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uYzogSW5jbHVkZSBzdWJzZWdzLmgsIHN5bWJvbHMuaCBhbmQgbGlzdGluZy5oLgotCShzaGlmdFtdKTogQWRkIHVwcHBlciBjYXNlIGVxdWl2YWxlbnRzLgotCShDUF9UX1tYWV0sIFRSQU5TX0JJVCk6IERlZmluZS4KLQkoY29uZHNbXSk6IERlbGV0ZSBpbml0aWFsIE5VTEwgZW50cnksIGFkZCAibG8iIGVudHJ5IGFzIHN5bm9ueW0gZm9yCi0JImNjIi4KLQkoTE9OR0VTVF9GTEFHLCBmbGFnc1tdKTogRGVsZXRlLgotCShhcm1fcHNyKTogTmV3IHN0cnVjdHVyZS4KLQkocHNyc1tdKTogTmV3IHZhcmlhYmxlLgotCShQU1JfQUxMKTogRGVmaW5lLgotCShMT05HRVNUX0lOU1QpOiBCdW1wIHRvIDUuCi0JKExJVEVSQUxfTUFTSywgQ09ORF9NQVNLLCBPUENPREVfTUFTSywgREFUQV9PUF9TSElGVCk6IERlZmluZS4KLQkoT1BDT0RFX3tBTkQsRU9SLFNVQixSU0IsQURELEFEQyxTQkMsUlNDLFRTVCxURVEsQ01QLENNTixPUlIsTU9WLEJJQywKLQkgTVZOfSk6IERlZmluZS4KLQkoaW5zbnNbXSk6IEFkZCBzbXVsbCwgdW11bGwsIHNtbGFsLCB1bWxhbCwgbGRmbSwgc3RmbSwgbXNyIGFuZCBtcnMKLQlpbnN0cnVjdGlvbnMuICBBZGQgbm9wIGFuZCBhZHIgcHNldWRvIG9wcy4KLQkocmVnX3RhYmxlKTogQWRkIEFQQ1MgcmVnaXN0ZXIgbmFtZSB2YXJpYW50cy4KLQkoYXJtX3Bzcl9oc2gpOiBOZXcgaGFzaCB0YWJsZS4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkICJsdG9yZyIsICJwb29sIiwgImV4dGVuZCIsICJsZG91YmxlIiBhbmQKLQkicGFja2VkIi4KLQkoTUFYX0xJVEVSQUxfUE9PTF9TSVpFKTogRGVmaW5lLgotCShzdHJ1Y3QgbGl0ZXJhbFMpOiBOZXcgc3RydWN0dXJlLgotCShsaXRlcmFscywgbmV4dF9saXRlcmFsX3Bvb2xfcGxhY2UsIGxpdF9wb29sX251bSwgY3VycmVudF9wb29sUCk6IE5ldwotCXZhcmlhYmxlcy4KLQkoYWRkX3RvX2xpdF9wb29sLCBzeW1ib2xfbG9jYXRlLCBzeW1ib2xfbWFrZV9lbXB0eSk6IE5ldyBmdW5jdGlvbnMuCi0JKHZhbGlkYXRlX2ltbWVkaWF0ZSk6IFJldHVybiBGQUlMIG9uIGZhaWx1cmUuCi0JKHNfbHRvcmcpOiBOZXcgZnVuY3Rpb24uCi0JKHBzcl9yZXF1aXJlZF9oZXJlLCBwc3JmX3JlcXVpcmVkX2hlcmUpOiBOZXcgZnVuY3Rpb25zLgotCShjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUpOiBOZXcgcGFyYW1ldGVyLCBmbGFnLCBhbGwgY2FsbGVycyBjaGFuZ2VkLgotCUlmIGZsYWcgaXMgbm9uLXplcm8sIHJlc3RyaWN0IHRoZSBsZWdhbCBhZGRyZXNzaW5nIG1vZGVzLgotCShkb19ub3AsIGRvX21ycywgZG9fbXNyLCBkb19tdWxsKTogTmV3IGZ1bmN0aW9ucy4KLQkobmVnYXRlX2RhdGFfb3ApOiBOZXcgZnVuY3Rpb24uCi0JKGRhdGFfb3AyKTogYWNjZXB0ICN4LHkgbWVhbmluZyB4IHJvdGF0ZWQgcmlnaHQgYnkgeSwgYnV0IG9ubHkgd2hlbgotCXN1aXRhYmxlIGNvbnN0YW50cy4gIElmIGltbWVkaWF0ZSBpcyBub3QgbGVnYWwsIHRyeSBjaGFuZ2luZyB0aGUKLQlvcGNvZGUuCi0JKGRvX2Fkcik6IE5ldyBmdW5jdGlvbi4KLQkoZG9fbGRzdCk6IGFjY2VwdCAibGRyIHJlZywgPWV4cHIiLiAgUHV0IGV4cHIgaW4gdGhlIHBvb2wgaWYgaXQgY2FuJ3QKLQliZSBkb25lIGFzIGFuIGltbWVkaWF0ZS4KLQkoZG9fZnBfbGRzdCk6IFVzZSBDUF9UX1tYWV0sIG5vdCBpbW1lZGlhdGUgdmFsdWVzLgotCShkb19mcF9sZG1zdG0pOiBOZXcgZnVuY3Rpb24uCi0JKGFybV9wc3JfcGFyc2UpOiBOZXcgZnVuY3Rpb24uCi0JKG91dHB1dF9pbnN0KTogVXNlIElOU05fU0laRSBpbiBjYWxsIHRvIG1kX251bWJlcl90b19jaGFycy4KLQkobWRfYXNzZW1ibGUpOiBBZGQgaGFjayBzbyB0aGF0ICJMYWJlbCBpbnN0cnVjdGlvbiIgY2F1c2VzIGFsaWdubWVudCBvZgotCXRoZSBsYWJlbC4KLQkoYXJtX2FmdGVyX3Bhc3NfaG9vaywgYXJtX3N0YXJ0X2xpbmVfaG9vaywgYXJtX2Zyb2Jfc3ltYm9sKTogTmV3Ci0JZnVuY3Rpb25zLgotCi1XZWQgTWF5IDE3IDA1OjI1OjE2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9zaG93X3VzYWdlKTogQWRkIFwncyBhdCBlbmQgb2YgbGluZXMgaW4KLQlzdHJpbmdzIGZvciBub24tR0NDIGNvbXBpbGVycy4KLQotVHVlIE1heSAxNiAxOTozNjowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3BvcF9pbnNlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKGVjb2ZmX2Zvcm1hdF9vcHMpOiBVc2UgaXQuCi0JKG9ial9lY29mZl9mcm9iX3N5bWJvbCk6IE5vdyBzdGF0aWMuCi0KLVdlZCBNYXkgMTcgMDA6NTk6MTIgMTk5NSAgQW5kcmV3IENhZ25leSAtIGFrYSBOb2lkICA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9iZWdpbik6IFdhcyBhc3N1bWluZyB0aGF0IGFuIGluc3RydWN0aW9uIHdhcwotCWJpZ2VuZGlhbiBhbmQgaGVuY2UgMTZiaXQgcmVsb2NzIHdpdGhpbmcgaW5zdHJ1Y3Rpb25zIHdvdWxkCi0JQUxXQVlTIGJlIGF0IGFkZHJlc3NlcyBpKzItaSszLiAgSW4gTEUgbW9kZSBpdCBpcyBpKzAtaSsxLgotCi1UdWUgTWF5IDE2IDE2OjI5OjU4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAob2JqX2Zyb2Jfc3ltYm9sLCBvYmpfZnJvYl9maWxlLCBTX0dFVF9TSVpFLAotCVNfU0VUX1NJWkUsIFNfR0VUX0FMSUdOLCBTX1NFVF9BTElHTiwgb2JqX2NvcHlfc3ltYm9sX2F0dHJpYnV0ZXMsCi0JT0JKX1BST0NFU1NfU1RBQik6IE5ldyBtYWNyb3MuCi0JKiBjb25maWcvdGMtbWlwcy5jOiBQcm90ZWN0IGFnYWluc3QgcmVkZWZpbmluZyB0aGVtIGFsc28gd2hlbgotCWluY2x1ZGluZyBvYmotZWxmLmguICBUZXN0IG9ubHkgT0JKX0VMRiBmb3IgaW5jbHVkaW5nIGVsZi9taXBzLmguCi0JKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogTmV3IGZ1bmN0aW9uLiAgU2V0IGJ5dGVfb3JkZXIgaGVyZS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTm90IGhlcmUuCi0JKGJ5dGVfb3JkZXIpOiBEb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBEZWNsYXJlLgotCSh0Y19pbml0X2FmdGVyX2FyZ3MpOiBOZXcgbWFjcm8uCi0KLQkqIHJlYWQuYyAoc19sY29tbSk6IERvIEVMRi9FQ09GRiB0ZXN0IGF0IHJ1biB0aW1lLCBub3QgY29tcGlsZQotCXRpbWUuCi0KLUZyaSBNYXkgMTIgMTQ6MTc6NDcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUluaXRpYWwgc3VwcG9ydCBmb3IgUEUgb2JqZWN0IGZpbGVzLgotCSogY29uZmlndXJlLmluLCBjb25maWd1cmUgKGkzODYtKi1wZSwgaTM4Ni0qLSpudCk6IEFkZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogQ29wZSB3aXRoIFBFIHdpZXJkbmVzcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChURV9QRSk6IE5ldyB0YXJnZXQgZm9ybWF0LgotCi1UaHUgTWF5IDExIDE0OjU4OjIxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKE5FRURfRUNPRkZfREVCVUcpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HCi0Jd2FzIGRlZmluZWQgYnkgaGVhZGVyIGZpbGVzLiAgVGVzdCBpbiBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzCi0JaW5zdGVhZCBvZiBFQ09GRl9ERUJVR0dJTkcuCi0JKGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZSk6IE1ha2UgZW1wdHkgaWYgTkVFRF9FQ09GRl9ERUJVRyBpcyBub3QKLQlkZWZpbmVkLgotCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rLCBlbGZfZnJvYl9zeW1ib2wsCi0JZWxmX2Zyb2JfZmlsZSk6IE9ubHkgY2FsbCBlY29mZiByb3V0aW5lcyBpZiBORUVEX0VDT0ZGX0RFQlVHIGlzCi0JZGVmaW5lZC4KLQkoZWxmX2Vjb2ZmX3NldF9leHQsIGVsZl9nZXRfZXh0ciwgZWxmX3NldF9pbmRleCk6IERlZmluZSBvbmx5IGlmCi0JTkVFRF9FQ09GRl9ERUJVRyBpcyBkZWZpbmVkLgotCShlbGZfZm9ybWF0X29wcyk6IFJlZmVyZW5jZSBlbGZfZWNvZmZfc2V0X2V4dCBvbmx5IGlmCi0JTkVFRF9FQ09GRl9ERUJVRy4KLQotV2VkIE1heSAxMCAxODowOToxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoT0JKUyk6IEluY2x1ZGUgQGV4dHJhX29iamVjdHNALgotCShvYmotZWxmLm8sIG9iai1lY29mZi5vLCBlLW1pcHNlbGYubywgZS1taXBzZWNvZmYubyk6IE5ldyBydWxlcwotCWZvciBidWlsZGluZyB0aGVzZSBpbmRlcGVuZGVudGx5LgotCSogZW11bC10YXJnZXQuaCwgY29uZmlnL2UtbWlwc2VsZi5jLCBjb25maWcvZS1taXBzZWNvZmYuYzogTmV3Ci0JZmlsZXMuCi0KLQkqIGFjY29uZmlnLmggKERFRkFVTFRfRU1VTEFUSU9OLCBFTVVMQVRJT05TLCBVU0VfRU1VTEFUSU9OUywKLQlPQkpfTUFZQkVfKiwgSTM4NkNPRkYsIE02OEtDT0ZGLCBNODhLQ09GRik6IE5ldyBtYWNyb3MuCi0JKiBhY2xvY2FsLm00IChHQVNfVU5JUSk6IE5ldyBtYWNyby4KLQotCSogYXMuYyAoZW11bGF0aW9ucywgbl9lbXVsYXRpb25zKSBbVVNFX0VNVUxBVElPTlNdOiBOZXcgdmFyaWFibGUuCi0JKHNlbGVjdF9lbXVsYXRpb25fbW9kZSwgZGVmYXVsdF9lbXVsX2JmZF9uYW1lLCBjb21tb25fZW11bF9pbml0KQotCVtVU0VfRU1VTEFUSU9OU106IE5ldyBmdW5jdGlvbnMuCi0JKG1haW4pIFtVU0VfRU1VTEFUSU9OU106IENhbGwgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIGJlZm9yZSBvdGhlcgotCWluaXRpYWxpemF0aW9uLgotCSogZW11bC5oOiBOZXcgZmlsZS4KLQkqIGFzLmggW1VTRV9FTVVMQVRJT05TXTogSW5jbHVkZSBpdC4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgZW5hYmxlLXRhcmdldHMgb3B0aW9uLiAgSXRlcmF0ZSBvdmVyIHRhcmdldAotCWxpc3QsIGJ1aWxkaW5nIHVwIGEgbGlzdCBvZiBvYmplY3QgZmlsZSBmb3JtYXRzIGFuZCBlbXVsYXRpb24KLQljb25maWd1cmF0aW9ucy4gIChPbmx5IHN1cHBvcnRzIGVtdWxhdGlvbnMgZm9yIE1JUFMgQ1BVIHNvIGZhci4pCi0JSWYgbXVsdGlwbGUgZm9ybWF0cyBhcmUgbmVlZGVkLCBzZXQgb2JqX2Zvcm1hdCB0byBtdWx0aSBhbmQgYWRkCi0JZm9ybWF0IGNvbmZpZyBmaWxlcyB0byBleHRyYV9maWxlcy4gIElmIGVtdWxhdGlvbiBtb2RlcyBhcmUKLQluZWVkZWQsIGFkZCB0aGUgcmVsZXZhbnQgZmlsZXMgdG8gZXh0cmFfZmlsZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEkzODZDT0ZGLCBNNjhLQ09GRiwgTTg4S0NPRkYgZm9yIHRob3NlCi0JY29uZmlndXJhdGlvbnMuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBGaWxlbmFtZSBhcmd1bWVudCBub3cKLQlwb2ludHMgdG8gY29uc3QuCi0JKiBlY29mZi5oIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogVXBkYXRlZCBkZWNsYXJhdGlvbi4KLQotCSogb2JqLmggKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEb24ndCBkZWNsYXJlIGZ1bmN0aW9uIGlmIGl0J3MKLQlhbHJlYWR5IGEgbWFjcm8uCi0KLQkqIHJlYWQuYyAoc19zcGFjZSwgY29ucywgc3RyaW5nZXIpOiBJZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCBpcwotCWRlZmluZWQsIGNhbGwgaXQgb24gZW50cnkuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBJZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotCWlzIGRlZmluZWQsIGNhbGwgaXQgb24gZW50cnkuICBJZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBpcwotCWRlZmluZWQsIGNhbGwgaXQgYmVmb3JlIHJldHVybmluZyBub3JtYWxseS4KLQotCSogcmVhZC5oICh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUuCi0KLQkqIG9iai5oIChzdHJ1Y3QgZm9ybWF0X29wcyk6IEFkZGVkIG5ldyBmdW5jdGlvbiBwb2ludGVyIGZpZWxkcwotCWVjb2ZmX3NldF9leHQsIHJlYWRfYmVnaW5faG9vaywgc3ltYm9sX25ld19ob29rLgotCShlY29mZl9mb3JtYXRfb3BzLCBlbGZfZm9ybWF0X29wcyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc19nZXRfc2l6ZSwgZWxmX3Nfc2V0X3NpemUsCi0JZWxmX3NfZ2V0X2FsaWduLCBlbGZfc19zZXRfYWxpZ24sIGVsZl9jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzLAotCWVsZl9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IE5ldyBmdW5jdGlvbnMuCi0JKGVsZl9mb3JtYXRfb3BzKTogTmV3IHZhcmlhYmxlLgotCShlbGZfZnJvYl9zeW1ib2wpOiBOb3cgdGFrZXMgYWRkaXRpb25hbCBpbnQqIGFyZ3VtZW50LgotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX2Zyb2Jfc3ltYm9sKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShlbGZfcG9wX2luc2VydCk6IERlY2xhcmUuCi0JKG9ial9wb3BfaW5zZXJ0KTogRGVmaW5lIHRvIGNhbGwgZWxmX3BvcF9pbnNlcnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jLAotCW9ial9lY29mZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbnMuCi0JKGVjb2ZmX2Zvcm1hdF9vcHMpOiBOZXcgdmFyaWFibGUuCi0KLQkqIGNvbmZpZy90ZS1nZW5lcmljLmg6IElmIE9CSl9IRUFERVIgaXMgZGVmaW5lZCwgdXNlIGl0IGFzIHRoZQotCWZpbGVuYW1lIHRvIGluY2x1ZGUgaW4gcGxhY2Ugb2Ygb2JqLWZvcm1hdC5oLgotCSogY29uZmlnL3RlLW11bHRpLmg6IE5ldyBmaWxlLCBjb3BpZWQgZnJvbSB0ZS1nZW5lcmljLmguCi0JKiBjb25maWcvb2JqLWVsZi5jIChPQkpfSEVBREVSKTogRGVmaW5lIGl0IHRvICJvYmotZWxmLmgiLgotCSogY29uZmlnL29iai1lY29mZi5jIChPQkpfSEVBREVSKTogRGVmaW5lIGl0IHRvICJvYmotZWNvZmYuaCIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKEVDT0ZGX0RFQlVHR0lORyk6IERlZmF1bHQgdG8gMC4KLQkob2JqX3JlYWRfYmVnaW5faG9vaywgb2JqX3N5bWJvbF9uZXdfaG9vaywgZWxmX2Zyb2Jfc3ltYm9sLAotCWVsZl9mcm9iX2ZpbGUpOiBUZXN0IGl0IGF0IHJ1biB0aW1lLgotCShvYmpfZWNvZmZfc2V0X2V4dCwgZWxmX2dldF9leHRyLCBlbGZfc2V0X2luZGV4KTogRGVmaW5lCi0JdW5jb25kaXRpb25hbGx5LgotCShlbGZfcHNldWRvX3RhYmxlKTogUmVuYW1lZCBmcm9tIG9ial9wc2V1ZG9fdGFibGUsIG5vdyBzdGF0aWMuCi0JKGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZSk6IFNwbGl0IG9mZiBpbnRvIHNlcGFyYXRlIHRhYmxlLiAgRGVmaW5lCi0JaXQgdW5jb25kaXRpb25hbGx5LgotCShlbGZfcG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkob2JqX3BvcF9pbnNlcnQpOiBOZXcgbWFjcm8uCi0JKG9ial9lY29mZl9zZXRfZXh0KSBbIU9CSl9NQVlCRV9FTEZdOiBEZWZpbmUgdG8gZWxmX2Vjb2ZmX3NldF9leHQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9lY29mZl9zZXRfZXh0KTogRGVmaW5lIHRvIGVjb2ZmX3NldF9leHQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmg6IFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCShtaXBzX3BvcF9pbnNlcnQpOiBEZWNsYXJlLgotCShtZF9wb3BfaW5zZXJ0KTogQ2FsbCBpdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogSWYgT0JKX01BWUJFX0VMRiBpcyBkZWZpbmVkLCBpbmNsdWRlCi0Jb2JqLWVsZi5oLCBidXQgcHJlc2VydmUgT1VUUFVUX0ZMQVZPUiBhbmQgcHJvdGVjdCBzb21lIG90aGVyCi0JbWFjcm9zIGZyb20gcmVkZWZpbml0aW9uLgotCShFQ09GRl9ERUJVR0dJTkcpOiBEZWZhdWx0IHRvIDAuICBBbGwgcmVmZXJlbmNlcyBjaGFuZ2VkIHRvCi0JcnVuLXRpbWUgdGVzdHMgb3IgbWFkZSB1bmNvbmRpdGlvbmFsLgotCShzX3N0cmluZ2VyLCBzX21pcHNfc3BhY2UsIHNfZWxmX3NlY3Rpb24pOiBEZWxldGVkLgotCShtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCByZWZlciB0byB0aGVtLiAgU3BsaXQgdGFibGUgaW50byB0aHJlZQotCXNlY3Rpb25zLCBmb3IgTUlQUywgbm9uLUVDT0ZGX0RFQlVHR0lORywgYW5kIEVMRi4KLQkobWlwc19wb3BfaW5zZXJ0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VuYWJsZV9hdXRvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW1pcHMuaCAobWlwc19wb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkobWRfcG9wX2luc2VydCk6IE5ldyBtYWNyby4KLQkobWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlY2xhcmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IG1hY3JvLgotCShtaXBzX2VuYWJsZV9hdXRvX2FsaWduKTogRGVjbGFyZS4KLQkobWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2spOiBOZXcgbWFjcm8sIGNhbGxzCi0JbWlwc19lbmFibGVfYXV0b19hbGlnbi4KLQotVHVlIE1heSAgOSAxNzowNzo0MSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBzdXBwb3J0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCi0JKiBjb25maWcvcHBjLWJpZy5tdDogTmV3IGZpbGUgZm9yIGJpZyBlbmRpYW4gUG93ZXJQQyBzeXN0ZW1zLgotCSogY29uZmlnL3BwYy1saXQubXQ6IE5ldyBmaWxlIGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3lzdGVtcy4KLQotCSogY29uZmlnL3RjLXBwYy5oICh0YXJnZXRfYmlnX2VuZGlhbik6IERlY2xhcmUuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWFsIHdpdGggbGl0dGxlIGFuZCBiaWcgZW5kaWFuIEVMRiB2YXJpYW50cy4KLQkoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUgYXMgMSwgbm90IGVtcHR5LgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19iaWdfZW5kaWFuKTogRGVsZXRlIHZhcmlhYmxlLCB1c2UKLQl0YXJnZXRfYmlnX2VuZGlhbiBpbnN0ZWFkLgotCShtZF9wYXJzZV9vcHRpb24pOiBQYXJzZSAtbWxpdHRsZSBhbmQgLW1saXR0bGUtZW5kaWFuIHRvIHVzZQotCWxpdHRsZSBlbmRpYW4gc3VwcG9ydC4gIFBhcnNlIC1tYmlnIGFuZCAtbWJpZy1lbmRpYW4gdG8gdXNlIGJpZwotCWVuZGlhbiBzdXBwb3J0LgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlIHRvIHJlZmxlY3QgY3VycmVudCBzd2l0Y2hlcy4KLQkocHBjX3NldF9jcHUpOiBSZWNvZ25pemUgcG93ZXJwY2xlIGFzIGxpdHRsZSBlbmRpYW4gUG93ZXJQQy4gIFVzZQotCWFzX2ZhdGFsLCBub3QgYWJvcnQgaWYgdW5rbm93biBtYWNoaW5lLgotCi1UdWUgTWF5ICA5IDEwOjU4OjQxIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBDYXN0ICp2YWxwIHRvIGFuIGludGVnZXIgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IHNpZ25lZCB2YWx1ZXMuCi0JKGhwcGFfZm9yY2VfcmVsb2NhdGlvbik6IE1ha2UgImRpc3RhbmNlIiBhbiBpbnRlZ2VyLgotCi1UdWUgTWF5ICA5IDAwOjQ3OjAzIDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpIFtCRkRfQVNTRU1CTEVSXTogTmV3IHR5cGUuCi0JKHRoaXNfZm9ybWF0KSBbQkZEX0FTU0VNQkxFUl06IERlY2xhcmUgbmV3IHZhcmlhYmxlLCBpZiBub3QKLQlhbHJlYWR5IGRlZmluZWQgYXMgYSBtYWNyby4KLQotTW9uIE1heSAgOCAyMTo0NDoxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmggKHNlZ19pbmZvKTogUHJvdmlkZSBkdW1teSB2ZXJzaW9uIGZvcgotCW5vbi1CRkRfQVNTRU1CTEVSLCBub24tTUFOWV9TRUdNRU5UUyBjb25maWd1cmF0aW9uLiAgSXQgc2hvdWxkCi0JbmV2ZXIgZ2V0IGludm9rZWQsIGJ1dCB0aGlzIGlzIGVhc2llciB0aGFuIGNvbmRpdGlvbmFsaXppbmcgc29tZQotCW9mIHRoZSB1c2VzLgotCShzdHJ1Y3Qgc2VnX2luZm9fdHJhc2gpOiBEdW1teSB0eXBlIHVzZWQgYnkgYWJvdmUgdG8gbWFrZSBjb2RlCi0JY29tcGlsZS4KLQotRnJpIE1heSAgNSAxNDo0NzoxMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyk6IERlZmluZSB0byAxLCBub3QKLQllbXB0eS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotc29tLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEaXR0by4KLQotVGh1IE1heSAgNCAxOToyNjo1NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzdGFicy5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogQWx3YXlzIGRlZmluZS4gIElmCi0JU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyBpc24ndCBzZXQsIGFib3J0LgotCShTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmYXVsdCB0byB6ZXJvLgotCShhb3V0X3Byb2Nlc3Nfc3RhYik6IE5ldyBmdW5jdGlvbiwgc3BsaXQgb3V0IGZyb20gc19zdGFiX2dlbmVyaWMuCi0JKE9CSl9QUk9DRVNTX1NUQUIpIFtBT1VUX1NUQUJTXTogRGVmaW5lIHRvIGNhbGwgYW91dF9wcm9jZXNzX3N0YWIsCi0JaWYgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkoc19zdGFiX2dlbmVyaWMpOiBUZXN0IFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgYXQgcnVuIHRpbWUuICBJZgotCWl0J3Mgbm90IHNldCwgYW5kIE9CSl9QUk9DRVNTX1NUQUIgaXNuJ3QgZGVmaW5lZCwgYWJvcnQuICBBbHdheXMKLQlwYXNzIHNpeCBhcmd1bWVudHMgdG8gT0JKX1BST0NFU1NfU1RBQi4KLQkqIHJlYWQuaCAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IERlY2xhcmUgdW5jb25kaXRpb25hbGx5LgotCSogY29uZmlnL29iai1hb3V0LmggKEFPVVRfU1RBQlMpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoQU9VVF9TVEFCUyk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoT0JKX1BST0NFU1NfU1RBQik6IEFkZCBuZXcgZmlyc3QgYXJndW1lbnQsCi0JaWdub3JlZC4KLQkqIGNvbmZpZy9vYmotZWxmLmggKE9CSl9QUk9DRVNTX1NUQUIpIFtFQ09GRl9ERUJVR0dJTkddOiBEaXR0by4KLQotCSogY29uZmlnL29iai1lY29mZi5oIChFQ09GRl9ERUJVR0dJTkcpOiBEZWZpbmUgdG8gMSwgbm90IGVtcHR5LgotCSogY29uZmlnL29iai1lbGYuaCAoRUNPRkZfREVCVUdHSU5HKTogRGl0dG8uICBUZXN0IHZhbHVlLCBub3QKLQl3aGV0aGVyIGl0J3MgZGVmaW5lZC4KLQotV2VkIE1heSAgMyAyMTozODoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhcy5oIChMT0NBTF9MQUJFTFNfRE9MTEFSLCBMT0NBTF9MQUJFTFNfRkIpOiBJZiBub3QgYWxyZWFkeQotCWRlZmluZWQsIGRlZmluZSB0aGVtIHRvIHplcm8uCi0JKiBjb25maWcvdGMtKi5oLCBjb25maWcvdGUtKi5oOiBJZiBkZWZpbmluZyB0aGVtLCBkZWZpbmUgdGhlbSB0bwotCWJlIDEgaW5zdGVhZCBvZiBlbXB0eS4KLQkqIGV4cHIuYyAoaW50ZWdlcl9jb25zdGFudCwgb3BlcmFuZCk6IFRlc3QgdGhlbSBhdCBydW4gdGltZQotCWluc3RlYWQgb2YgY29tcGlsZSB0aW1lLgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBEaXR0by4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBEaXR0by4KLQkoZG9sbGFyXyosIGRlZmluZV9kb2xsYXJfbGFiZWwsIGZiXyopOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5oIChkb2xsYXJfKiwgZGVmaW5lX2RvbGxhcl9sYWJlbCwgZmJfKik6IERlY2xhcmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLVdlZCBNYXkgIDMgMTM6MDg6NTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvIG5vdGhpbmcgZm9yIGFuIG91dCBvZiByYW5nZQotCVBDIHJlbGF0aXZlIGNhbGwgc2luY2UgdGhvc2Ugb25seSBvY2N1ciBpbiBjYXNlcyB3aGVyZSB0aGUgbGlua2VyCi0JY2FuIGZpeCB0aGVtIHVwLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSByZWxvY2F0aW9ucyBmb3Igb3V0IG9mIHJhbmdlIFBDCi0JcmVsYXRpdmUgY2FsbHMuCi0KLVR1ZSBNYXkgIDIgMTY6MzQ6NDcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZSAoaHBwYSotKi1saXRlcyopOiBIYW5kbGUganVzdCBsaWtlIGhwcGEqLSotKmVsZiouCi0JKiBjb25maWd1cmUuaW46IExpa2V3aXNlLgotCi1UdWUgTWF5ICAyIDExOjIyOjAwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG9wX2luc2VydCk6IE5ldyBmdW5jdGlvbi4KLQkocG9wX292ZXJyaWRlX29rLCBwb3BfdGFibGVfbmFtZSk6IE5ldyB2YXJpYWJsZXMuCi0JKG1kX3BvcF9pbnNlcnQsIG9ial9wb3BfaW5zZXJ0KTogTmV3IG1hY3Jvcy4KLQkocG9iZWdpbik6IFVzZSB0aGVtLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBVc2UgVVNFX1NUREFSRyBhbmQgVVNFX1ZBUkFSR1MgaW5zdGVhZCBvZgotCU5PX1NUREFSRyAmYy4KLQotCSogcmVhZC5jICh0YXJnZXRfYmlnX2VuZGlhbik6IElmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGlzCi0JZGVmaW5lZCwgaW5pdGlhbGl6ZSB0byAxLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc190YXJnZXRfZm9ybWF0KTogQ2hhbmdlZCB0byBhIGZ1bmN0aW9uLAotCWNoZWNraW5nIGZsYXZvciBhbmQgYnl0ZSBvcmRlciBhdCBydW4gdGltZS4KLQkobWRfcGFyc2Vfb3B0aW9uLCBjYXNlcyBPUFRJT05fRUIgYW5kIE9QVElPTl9FTCk6IFNldAotCXRhcmdldF9iaWdfZW5kaWFuIGhlcmUuCi0JKG1kX2JlZ2luKTogTm90IGhlcmUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChtaXBzX3RhcmdldF9mb3JtYXQpOiBBZGp1c3QgZGVjbGFyYXRpb24uCi0JKFRBUkdFVF9GT1JNQVQpOiBDYWxsIG1pcHNfdGFyZ2V0X2Zvcm1hdC4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCk6IERlZmluZSBpbiB0ZXJtcyBvZgotCU9VVFBVVF9GTEFWT1IuCi0JKiBjb25maWcvdGMtbWlwcy5jIChnX3N3aXRjaF92YWx1ZSwgZ19zd2l0Y2hfc2Vlbik6IERlZmluZQotCXVuY29uZGl0aW9uYWxseS4KLQkobWRfYmVnaW4sIG1pcHNfaXAsIG1kX3BhcnNlX29wdGlvbiwgc19jaGFuZ2Vfc2VjLCBzX29wdGlvbiwKLQlzX2FiaWNhbGxzLCBub3BpY19uZWVkX3JlbGF4KTogQ2hlY2sgVVNFX0dMT0JBTF9QT0lOVEVSX09QVCBhdCBydW4KLQl0aW1lLCBpbnN0ZWFkIG9mIGNvbXBpbGluZyBjb25kaXRpb25hbGx5IG9uIEdQT1BULgotCShHUE9QVCk6IERvbid0IGRlZmluZS4KLQkobWRfc2hvcnRvcHRzKTogQWx3YXlzIGluY2x1ZGUgLUcuCi0JKFJEQVRBX1NFQ1RJT05fTkFNRSk6IFNlbGVjdCBhdCBydW4gdGltZS4KLQkobWRfYmVnaW4pOiBUZXN0IGZvciBFTEYgZm9ybWF0IGF0IHJ1biB0aW1lIGluc3RlYWQgb2YgY29tcGlsZSB0aW1lLgotCShtaXBzX2lwLCBzX2NoYW5nZV9zZWMpOiBEaXR0by4KLQkobWRfcGFyc2Vfb3B0aW9uLCBjYXNlcyBPUFRJT05fQ0FMTF9TSEFSRUQgYW5kIE9QVElPTl9OT05fU0hBUkVEKToKLQlEaXR0by4KLQkoT1BUSU9OX0NBTExfU0hBUkVELCBPUFRJT05fTk9OX1NIQVJFRCwgbWlwc19yZWdtYXNrX2ZyYWcpOiBEZWZpbmUKLQl1bmNvbmRpdGlvbmFsbHkuCi0KLVR1ZSBNYXkgIDIgMDA6MTc6MDQgMTk5NSAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfKik6IE5ldyB2YXJpYWJsZXMuCi0JKHRhcmctY3B1Lm8pOiBEZXBlbmQgb24gb25lLCBzZWxlY3RlZCBieSBhdXRvY29uZiBzdWJzdGl0dXRpb24sCi0JaW5zdGVhZCBvZiBUQVJHX0NQVV9ERVBFTkRFTlRTLgotCSogY29uZmlndXJlLmluOiBTdWJzdGl0dXRlICRjcHVfdHlwZSwgJG9ial9mb3JtYXQsICRhdG9mLCBhbmQKLQkkZW11bGF0aW9uIGludG8gTWFrZWZpbGUuaW4uCi0JKiBjb25maWcvaDgzMDAubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaDg1MDAubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaTM4NmNvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL202OGsubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvbTY4a2NvZmYubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL204OGtjb2ZmLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCAoVEFSR19DUFVfREVQRU5ERU5UUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvbWlwcy1saXQubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOiBEZWxldGVkLgotCSogY29uZmlnL3NoLm10OiBEZWxldGVkLgotCSogY29uZmlnL3c2NS5tdDogRGVsZXRlZC4KLQkqIGNvbmZpZy96OGsubXQ6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy90ZS1kcHgyLmggKGRweDIpOiBEZWxldGVkIHVudXNlZCBtYWNyby4KLQkqIGNvbmZpZy90ZS1nZW5lcmljLmggKFRFX0dFTkVSSUMpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1nbzMyLmggKFRFX0dPMzIpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1ocDMwMC5oIChURV9IUDMwMCk6IERpdHRvLgotCSogY29uZmlnL3RlLWhwcGEuaCAoUEEsIF9URV9QQV9IKTogRGl0dG8uCi0JKiBjb25maWcvdGUtaWM5NjAuaCAoVEVfSUM5NjApOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1uYnNkNTMyLmggKFRFX05FVEJTRDUzMik6IERpdHRvLgotCSogY29uZmlnL3RlLXBjNTMybWFjaC5oIChURV9QQzUzMk1BQ0gpOiBEaXR0by4KLQkqIGNvbmZpZy90ZS1wcGNudy5oIChURV9QUENOVyk6IERpdHRvLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChzY291bml4KTogRGl0dG8uCi0KLU1vbiBNYXkgIDEgMTU6NTk6NTYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2FwcF9maWxlKTogSWYgb2JqX2FwcF9maWxlIGlzIGRlZmluZWQsIGNhbGwgaXQgd2l0aAotCXN0cmluZyBhcyBhcmd1bWVudC4gIERvbid0IGNhbGwgY19kb3RfZmlsZV9zeW1ib2wgb3IKLQllbGZfZmlsZV9zeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2FwcF9maWxlKTogRGVmaW5lIGFzIGNfZG90X2ZpbGVfc3ltYm9sLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2FwcF9maWxlKTogRGVmaW5lIGFzIGVsZl9maWxlX3N5bWJvbC4KLQotCSogYXMuaCAoT1VUUFVUX0ZMQVZPUik6IERvbid0IGRlZmluZSBoZXJlLgotCSogY29uZmlnL29iai1hb3V0LmggKE9VVFBVVF9GTEFWT1IpIFtCRkRfQVNTRU1CTEVSXTogRGVmaW5lLgotCSogY29uZmlnL29iai1ib3V0LmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoT1VUUFVUX0ZMQVZPUikgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKE9VVFBVVF9GTEFWT1IpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChPVVRQVVRfRkxBVk9SKTogRGVmaW5lLgotCi1UaHUgQXByIDI3IDIwOjA3OjMzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogVXNlIG9uZSBpbiBzcmNkaXIgaWYgcHJlc2VudC4KLQkoUlVOVEVTVEZMQUdTKTogRGVmaW5lLgotCi1XZWQgQXByIDI2IDE1OjU0OjEwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBtb3JlIHBvcnRhYmxlIGFsaWdubWVudCBoYW5kbGluZyBpbiBhc3NlbWJseSBjb2RlLAotCWJhc2VkIG9uIHBhdGNoZXMgZnJvbSBCcnlhbiBGb3JkIDxiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1PjoKLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZGVkIGJhbGlnbiBhbmQgcDJhbGlnbiwgZm9yIGFsaWduaW5nIGJ5Ci0JYnl0ZXMgb3IgcG93ZXJzIG9mIHR3byBpbmRlcGVuZGVudCBvZiB3aGF0ICIuYWxpZ24iIGRvZXMgZm9yIGEKLQlnaXZlbiB0YXJnZXQuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgdGhlbS4KLQotVHVlIEFwciAyNSAxMToxMjowNCAxOTk1ICBSb2IgU2F2b3llICA8cm9iQHRoZXB1Yi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogTG9vayBmb3IgbTY4ay0qLXZ4d29ya3MqIHJhdGhlciB0aGFuCi0JanVzdCBtNjhrLXdycy12eHdvcmtzIHNvIGdhcyBjYW4gYmUgY29uZmlndXJlZCBmb3IKLQltNjhrLXZ4d29ya3M1LjEuCi0KLUZyaSBBcHIgMjEgMTU6MTk6MDYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2FwcGx5X2ZpeCk6IElmIGZ4X3JfdHlwZSBpcyB6ZXJvLCBoYW5kbGUKLQlmeF9zaXplIG9mIDEsIGFuZCBhYm9ydCBvbiB1bnJlY29nbml6ZWQgc2l6ZXMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBGaXggYnVnIGluIGxhc3QgY2hhbmdlIHJlZ2FyZGluZwotCW5vbi1pc3ZhciBjYXNlLgotCi1TdW4gQXByIDE2IDAxOjUyOjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuaCAobWRfcmVsYXhfdGFibGUsIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUpOgotCU1pc3NlZCB0aGlzIG9uZSBpbiAxMSBBcHIgY2hhbmdlcy4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IEZpeCB0eXBvLgotCi1UaHUgQXByIDEzIDE4OjE4OjA4IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBJbnN0ZWFkIG9mIGFib3J0aW5nIG9uIGxhcmdlCi0JZGlzcGxhY2VtZW50cywgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIERvbid0IGludm9rZSB0aGUgY29kZSB0aGF0Ci0JZm9sbG93ZWQgdGhlIGFib3J0IGNhbGwgdW50aWwgaXQncyBiZWVuIHZlcmlmaWVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zaG93X3VzYWdlKTogQWRkIDY4MDYwIHRvIGxpc3QuICBTcGxpdCBjcHUKLQlsaXN0IGludG8gdGhyZWUgbGluZXMuCi0KLVRodSBBcHIgMTMgMTQ6MzQ6MzYgMTk5NSAgVG9yYmpvcm4gR3Jhbmx1bmQgIDx0ZWdlQGFkZGVyLmN5Z251cy5jb20+Ci0KLQkqIHRjLW02OGsuYyAobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBUZXN0IGZvciBtNjgzNjAuCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBtNjgzNjAuCi0JKiB0Yy1tNjhrLmggKFRBUkdFVF9XT1JEX1NJWkUpOiBEZWZpbmUuCi0JKFRBUkdFVF9BUkNIKTogRGVmaW5lLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJZiBUQVJHRVRfV09SRF9TSVpFIGlzIGRlZmluZWQsCi0Jc2lnbi1leHRlbmQgYXBwcm9wcmlhdGVseS4KLQotVGh1IEFwciAxMyAxMToyMDoxNyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBQcm9wZXJseSB1c2UgUEFSQU1TIHRvCi0JaGlkZSBwcm90b3R5cGUgZnJvbSBub24tQU5TSSBjb21waWxlcnMsIGFuZCBkb24ndCB1c2UgQU5TSSBzeW50YXgKLQlmb3IgYXJndW1lbnRzLgotCi1XZWQgQXByIDEyIDEyOjIwOjE5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiAoVERFRklORVMpOiBQdXQgZW1wdHkgZGVmaW5pdGlvbiBpbnRvCi0JbWFrZWZpbGUgZnJhZ21lbnQuCi0JKiBtcHctbWFrZS5pbiAoeG1hbGxvYy5jLm8pOiBSZW1vdmUuCi0JKGFzLm5ldyk6IERlcGVuZCBvbiBWZXJzaW9uLnIuCi0JKFZlcnNpb24ucik6IEdlbmVyYXRlIGZyb20gdmVyc2lvbiBpbmZvLgotCi0JKiBtcHctbWFrZS5pbjogRGVsZXRlIHJlZmVyZW5jZXMgdG8gaGV4LXZhbHVlLmMuCi0KLQkqIG1wdy1jb25maWcuaW46IEFkZCBtYXBwaW5nIGZyb20gY29uZmlncyB0byBvYmplY3QgZmlsZSBmb3JtYXRzLAotCWdldCBWRVJTSU9OIGZyb20gTWFrZWZpbGUuaW4gYW5kIGFkZCB0byBtay50bXAuCi0JKG1pcHMtaWR0LWVjb2ZmKSBbVERFRklORVNdOiBBZGQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKiBtcHctbWFrZS5pbiAoVkVSU0lPTiwgZ0MpOiBEb24ndCBkZWZpbmUuCi0JKEFMTF9DRkxBR1MpOiBSZW1vdmUgLWQgZmxhZ3MuCi0JKGNvbmZpZy5oKTogUmVtb3ZlIGRlZmluaXRpb24gb2YgTVBXLCBhZGQgSEFWRV9TVERBUkdfSCwKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBtcHctbWFrZS5pbiAoQUxMX0NGTEFHUyk6IEFkZCBkZWZpbml0aW9uIG9mIEhBVkVfU1REQVJHX0gsCi0JaW5jbHVkZSBvZiA6OmxpYmliZXJ0eTouCi0JKGNvbmZpZy5oKTogSWZkZWYgY29udGVudHMgb24gR0FTX1ZFUlNJT04uCi0KLQkqIG1wdy1tYWtlLmluIChhcy5jKTogQ29tcGlsZSB3aXRoIEMgbm90IGdDLgotCShjb25maWctc3RhbXApOiBUb3VjaCBjb3JyZWN0bHkuCi0JKGluc3RhbGwtb25seSk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBEZXBlbmQgb24gYWxsIGFuZCBpbnN0YWxsLW9ubHkuCi0KLQkqIG1wdy1jb25maWcuaW46IFBhcnNlIHRhcmdldCBhbmQgdXNlIHRvIGdlbmVyYXRlIGZvcndhcmQgaW5jbHVkZXMKLQl0byB0Yy0sIG9iai0sIGFuZCBhdG9mLSBmaWxlcywgdXNlIHRlLWdlbmVyaWMuaCBmb3IgZW11bGF0aW9uLgotCSogbXB3LW1ha2UuaW4gKFZFUlNJT04pOiBEZWZpbmUuCi0JKGFzLmMpOiBDb21waWxlIHdpdGggR0NDLgotCShUQVJHX09CSkVDVFMsIENMSUJTKTogRGVmaW5lLgotCShhcy5uZXcpOiBVc2UgTERGTEFHUywgVEFSR19PQkpFQ1RTLCBDTElCUyBhbmQgRVhUUkFMSUJTIGluIGxpbmsKLQljb21tYW5kLgotCShjb25maWcuaCwgY29uZmlnLXN0YW1wKTogQnVpbGQuCi0KLQkqIG1wdy1tYWtlLmluIChDLCBDRkxBR1MpOiBSZW1vdmVkIGRlZmluaXRpb25zLgotCShBTExfQ0ZMQUdTKTogRGVmaW5lLgotCVNldCBkZWZhdWx0IHJ1bGUgdG8gdXNlIHtDQ30gaW5zdGVhZCBvZiB7Q30uCi0KLQkqIG1wdy1tYWtlLmluIChpbnN0YWxsKTogTW92ZWQgaGVyZSBmcm9tIG1wdy1idWlsZC5pbi4KLQkqIG1wdy1idWlsZC5pbjogUmVtb3ZlZCwgZnVuY3Rpb25hbGl0eSBpbiBtcHctbWFrZS5pbgotCi0JKiBtcHctbWFrZS5pbiAoQ0ZMQUdTKTogQWRkIG1vcmUgaW5jbHVkZSBwYXRocy4KLQotCSogbXB3LWNvbmZpZy5pbiAodmFyYXJncy5oLCBzeXMvKi5oKTogRG9uJ3QgY3JlYXRlIHdoZW4KLQljb25maWd1cmluZy4KLQkqIG1wdy1tYWtlLmluIChDRkxBR1MpOiBBZGQgLXcgZmxhZy4KLQotCSogbXB3LW1ha2UuaW46IFJlcGxhY2UgOC1iaXQgY2hhcnMgd2l0aCB0aGVpciBuYW1lcy4KLQotCSogbXB3LWNvbmZpZy5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIGNvbmZpZ3VyZS5pbi4KLQkqIG1wdy1tYWtlLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgTWFrZWZpbGUuaW4uCi0KLVR1ZSBBcHIgMTEgMDE6NDI6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF0IGxlYXN0IGF1dG9jb25mIDIuMywgYmVjYXVzZSBlYXJsaWVyCi0JdmVyc2lvbnMgbG9zZSBvbiBzb21lIEFJWCB2ZXJzaW9ucy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG02OGstKi1lbGYuCi0JKiBjb25maWcvdGMtbTY4ay5jIChjb21tZW50X2NoYXJzKSBbT0JKX0VMRl06IEluY2x1ZGUgJyMnLgotCShtZF9wc2V1ZG9fdGFibGUpIFtPQkpfRUxGXTogSWdub3JlICJzd2JlZyIuCi0JKG1kX2JlZ2luKTogU2V0IGFsdF9ub3RlbmRfdGFibGVbJyYnXSwgc28gc3ZyNC1zdHlsZSBpbW1lZGlhdGUKLQlvcGVyYW5kcyBhcmUgYWNjZXB0ZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IEFyZ3VtZW50IFZBTFAgc2hvdWxkIHBvaW50IHRvIHZhbHVlVC4KLQkobWRfY29udmVydF9mcmFnKTogQXJndW1lbnQgU0VDIHNob3VsZCBiZSB0eXBlIHNlZ1QuCi0JKG1kX3Nob3J0b3B0cykgW09CSl9FTEZdOiBBY2NlcHQgJ1EnIHdpdGggYW4gYXJndW1lbnQuCi0JKG1kX3BhcnNlX29wdGlvbik6IElnbm9yZSBpdC4KLQkobWRfY29udmVydF9mcmFnXzEpOiBBZGQgaW4gZnJhZyBhZGRyZXNzIGZvciB0aGUgc3ltYm9sIGluIHRoZQotCWRpc3BsYWNlbWVudCBjYWxjdWxhdGlvbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpIFtPQkpfRUxGXTogVXNlICJlbGYzMi1tNjhrIi4KLQkoVEFSR0VUX0FSQ0gpOiBEZWZpbmUuCi0JKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCkgW09CSl9FTEZdOiBEZWZhdWx0IHRvIDAuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUsIFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCk6IEhhbmRsZQotCXRoZXNlIHRoZSBzYW1lIHdheSBmb3IgT0JKX0VMRiBhcyBmb3IgTTY4S0NPRkYuCi0KLQkqIGdkYmluaXQuaW46IEFkZCBicmVha3BvaW50IGluIGFzX2Fib3J0LgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogSWYgb2Zmc2V0IGlzIGxlc3MgdGhhbiB6ZXJvLAotCWNvbXBsYWluIGFib3V0IGl0IHNwZWNpZmljYWxseSwgaW5zdGVhZCBvZiByZXBvcnRpbmcgYW4gYXNzZXJ0aW9uCi0JZmFpbHVyZS4KLQkocmVsYXhfc2VnbWVudCk6IENvbXBsYWluIGFib3V0IC5vcmcgYmFja3dhcmRzLCB0aGVuIGlnbm9yZSBpdC4KLQlEbyBnZW5lcmljIHJzX21hY2hpbmVfZGVwZW5kZW50IHJlbGF4YXRpb24gb25seSBpZgotCVRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgaXMgZGVmaW5lZCwgYW5kIHVzZSBpdHMgdmFsdWUgZm9yIHRoZSBiYXNlCi0Jb2YgdGhlIHRhYmxlLgotCSogdGMuaCAobWRfcmVsYXhfdGFibGUpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKiBhcy5oIChzdHJ1Y3QgcmVsYXhfdHlwZSk6IEFkZCBmb3J3YXJkIGRlY2xhcmF0aW9uIGZvciB0eXBlLgotCSogY29uZmlnL3RjLWEyOWsuYzogRGVsZXRlZCBtZF9yZWxheF90YWJsZS4KLQkqIGNvbmZpZy90Yy17YWxwaGEsYXJtLGg4MzAwLGhwcGEsaTg2MCxtODhrLG1pcHMscHBjLHNwYXJjLHo4a30uYzoKLQlEaXR0by4KLQkqIGNvbmZpZy90Yy17aDg1MDAsaTM4NixpOTYwLG5zMzJrLHNoLHRhaG9lLHZheCx3NjV9Lmg6IERlY2xhcmUKLQltZF9yZWxheF90YWJsZSBoZXJlLCBhbmQgZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgdG8gZXhwYW5kCi0JdG8gbWRfcmVsYXhfdGFibGUuCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobWRfcmVsYXhfdGFibGUpOiBObyBsb25nZXIgY29uc3QuCi0JKiBjb25maWcvdGMtdzY1LmMgKG1kX3JlbGF4X3RhYmxlKTogRGl0dG8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfc2hvcnRfanVtcF9zaXplLCBtZF9sb25nX2p1bXBfc2l6ZSk6Ci0JRGVsZXRlZC4KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRGVzY3JpYmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBhbmQKLQlXT1JLSU5HX0RPVF9XT1JELiAgTWVudGlvbiBtZF8qX2p1bXBfc2l6ZSAoYnV0IGRlc2NyaXB0aW9uIG5lZWRzCi0JdG8gYmUgZmxlc2hlZCBvdXQgbGF0ZXIpLiAgTm90ZSBtNjhrIFBDSU5ERVggbW9kZSBoYXMgYmVlbiBjaGVja2VkCi0JaW4uCi0KLU1vbiBBcHIgMTAgMTU6NTc6NDIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24sIHNwbGl0Ci0Jb3V0IGZyb20gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXguCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ2FsbCBpdC4KLQkobG9hZF9hZGRyZXNzLCBtYWNybyk6IEluIE5PX1BJQyBicmFuY2hlcywgaWYgbm9waWNfbmVlZF9yZWxheAotCXJldHVybnMgbm9uemVybywgZG9uJ3QgYXR0ZW1wdCBHUCBvcHRpbWl6YXRpb24uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKFBDSU5ERVgpOiBOZXcgbWFjcm8uCi0JKG1kX3JlbGF4X3RhYmxlKTogTm8gbG9uZ2VyIGNvbnN0LiAgQWRkIFBDSU5ERVggZW50cmllcy4KLQkobTY4a19pcCk6IEZvciBBSU5EWCB3aXRoIHNpbXBsZSBzeW1ib2wgb3BlcmFuZCwgZ2VuZXJhdGUgYQotCVBDSU5ERVggZnJhZyBpZiBQQyBpcyB1c2VkLCBvciBkbyBub3JtYWwgbm9uLUFJTkRYIHByb2Nlc3NpbmcgZm9yCi0JYWRkcmVzcyByZWdpc3Rlci4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBJZiBjcHUgaXMgNjgwMDAgb3IgNjgwMTAsIGZpeAotCW1kX3JlbGF4X3RhYmxlIHRvIHByZXZlbnQgcmVsYXhhdGlvbiBvZiBQQ0lOREVYL0JZVEUgbW9kZSB0bwotCVNIT1JULCBzaW5jZSB0aGV5IGRvbid0IHN1cHBvcnQgdGhhdCBtb2RlLgotCShtZF9jb252ZXJ0X2ZyYWdfMSwgY2FzZSBQQ0xFQS9MT05HKTogQWRkIDQgdG8gb2Zmc2V0LCBub3QgMi4gIEFkZAotCXN1cHBvcnQgZm9yIG5ldyBQQ0lOREVYIG1vZGVzLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IFByb2Nlc3MgUENJTkRFWC9TWl9VTkRFRiBtb2RlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9jb252ZXJ0X2ZyYWdfMSwgY2FzZSBQQ0xFQS9TSE9SVCk6IEFkZCAyIHRvCi0Jb2Zmc2V0LgotCShtNjhrX2lwLCBjYXNlIG1vc3QgcHVuY3R1YXRpb24vQU9GRik6IElmIHVzaW5nIFBDLCBjYWxsIGFkZF9mcmFnCi0JdXNpbmcgUENMRUEuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IERvbid0IGV4cGxpY2l0bHkgaW5jbHVkZSBjb25maWcuaC4gIERlbGV0ZWQgYQotCWJ1bmNoIG9mICIjaWYgMCIgY29kZSBhbmQgdXNlbGVzcyBjb21tZW50cy4KLQkoc3RydWN0IG02OGtfY3B1KTogTmV3IHR5cGUuCi0JKGFyY2hzLCBuX2FyY2hzKTogTmV3IHZhcmlhYmxlcywgd2l0aCBzaW5nbGUgbGlzdCBvZiBuYW1lL2VudW0KLQltYXBwaW5nIGFuZCBhbGlhc2VzLgotCShtNjhrX2lwKTogRGVsZXRlIHRoZSB0YWJsZSBoZXJlLgotCShtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IFVzZSB0aGUgbmV3IHRhYmxlIGhlcmUgaW5zdGVhZCBvZgotCW9wZW4tY29kaW5nIGl0LgotCShtZF9wYXJzZV9vcHRpb24sIGNhc2UgJ20nKTogRGl0dG8uCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBGaXggcnVsZSBmb3IgcnVubmluZyBjb25maWcuc3RhdHVzLgotCShpbnRlcm5hbHMuZHZpLCBpbnRlcm5hbHMucHMsIGludGVybmFscy5wczQpOiBOZXcgdGFyZ2V0cywgbm90Ci0JYnVpbHQgYnkgZGVmYXVsdC4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBBZGQgbG91ZCBkaXNjbGFpbWVyLiAgUmVmaWxsIHRvIDc5IGNvbHVtbnMsCi0Jc3BlY2lmeSBmaWxsLWNvbHVtbiBpbiBsb2NhbC12YXJpYWJsZXMgc2VjdGlvbi4gIENoYW5nZQotCXN1YmhlYWRpbmdzIHRvIHN1YnNlY3Rpb25zIHNvIHRoZXkgY2FuIGJlIGNyb3NzLXJlZmVyZW5jZWQuCi0JRGVzY3JpYmUgYnJva2VuIHdvcmRzLCBmcmFncywgZnJhZyBjaGFpbnMsIGdlbmVyaWMgcmVsYXhhdGlvbiwKLQlyZWxheCB0YWJsZSwgbTY4ayByZWxheGF0aW9uLCBtNjhrIGFkZHJlc3NpbmcgbW9kZXMsIHRlc3Qgc3VpdGUKLQljb2RlLiAgQWRkIGEgZmV3IHdvcmRzIGFib3V0IHZhcmlvdXMgZmlsZSBmb3JtYXRzLgotCi0JKiBkb2MvYXMudGV4aW5mbyAobTY4ayk6IFJlY29tbWVuZCB1c2luZyBgJScgd2l0aCByZWdpc3RlcnMgYXMgdGhlCi0Jbm9ybWFsIGNhc2UsIGluc3RlYWQgb2YgdGhlIGV4Y2VwdGlvbmFsIGNhc2UuCi0KLVRodSBNYXIgMzAgMTQ6Mzg6NDcgMTk5NSAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBsaW51eCB0byBkZWZhdWx0IHRvIGVsZi4gIFVzaW5nCi0JaVszNDVdODYtKi1saW51eGFvdXQgd2lsbCBkZWZhdWx0cyB0byBhLm91dC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE1hciAyOSAxNzoxNjozMCAxOTk1ICBUb3Jiam9ybiBHcmFubHVuZCAgPHRlZ2VAYWRkZXIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBDYXN0IG5lZ2F0aXZlIG9mZnNldHMgdG8gb2Zmc2V0VAotCShmb3IgaG9zdGluZyBvbiA2NCBiaXQgbWFjaGluZXMpLgotCi1UdWUgTWFyIDIxIDE2OjUzOjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLW1pcHM0IGFuZCAtbTQ2NTAuCi0KLUZyaSBNYXIgMTcgMTY6NDc6MTMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEFkZCBQUk9HUkVTUyBtYWNyb3MuCi0KLUZyaSBNYXIgMTcgMTI6NDA6MzQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBNYWtlIHN1cmUgdG8gYWx3YXlzIHJlc2V0IHRoZSBmcmFnCi0JYW5kIHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzLgotCi1UaHUgTWFyIDE2IDE3OjI2OjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgbm9uIFBDIHJlbGF0aXZlCi0JcG9pbnRlcnMgaW4gdGhlIC5jdG9ycyBhbmQgLmR0b3JzIHNlY3Rpb24gYWxzbyB3aGVuIHVzaW5nIHRoZQotCS1tcmVsb2NhdGFibGUgb3B0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBTdXBwb3J0IC1tNDAzIGFzIGEgUG93ZXJQQyBjb21wdXRlci4KLQkobWRfc2hvd191c2FnZSk6IERpdHRvLgotCi1XZWQgTWFyIDE1IDE0OjQ1OjQyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfZGVidWcpOiBUaGUgY3VyX3Njb3BlIGZpZWxkIG9mIGEgZmlsX3B0cgotCW1heSBiZSBOVUxMIHdoZW4gZ2l2ZW4gc3RyYW5nZSBpbnB1dC4gIERvbid0IGNvcmUgZHVtcC4KLQotVHVlIE1hciAxNCAyMTozNjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBEb24ndCB1c2UgYWRkaXUgZm9yIGRsaSBvZiBhbgotCXVuc2lnbmVkIHNlZW1pbmdseSBuZWdhdGl2ZSBudW1iZXIuICBEb24ndCBib3RoZXIgc2hpZnRpbmcgYSB6ZXJvCi0JdmFsdWUuCi0JKG1pcHNfaXApOiBGb3IgY2FzZSAnaicsIGlmIHRoZXJlIGFyZSBtb3JlIGFsdGVybmF0aXZlcywgYW5kIHRoZQotCUlTQSBsZXZlbCBpcyBhdCBsZWFzdCAzLCBkb24ndCBhY2NlcHQgYW4gdW5zaWduZWQgc2VlbWluZ2x5Ci0JbmVnYXRpdmUgbnVtYmVyLgotCi1UdWUgTWFyIDE0IDE5OjE2OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19hcHBfbGluZSk6IEZpeCBsYXN0IHBhdGNoIHRvIGRlYWwgd2l0aCBhIGxpbmUgbnVtYmVyCi0Jb2YgMS4KLQotVHVlIE1hciAxNCAxNzowMDo1NyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBVc2UgYXNfd2Fybl93aGVyZSwgbm90Ci0JYXNfYmFkX3doZXJlIHRvIGdpdmUgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gZXJyb3IuCi0KLU1vbiBNYXIgMTMgMTc6MDM6NDYgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiAgaXNzdWUgYSB3YXJuaW5nIGlmIGEgY29uc3RhbnQKLQlpcyB1c2VkIGFzIGFuIG9wZXJhbmQgd2hlcmUgYW4gaW1tZWRpYXRlIHZhbHVlIGlzIG5vdCBhbGxvd2VkLgotCi1GcmkgTWFyIDEwIDE5OjIxOjE5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBSZWRvIG15IDEwIEphbiBjaGFuZ2UsIGJ1dCBnZXQgaXQgcmlnaHQgdGhpcwotCXRpbWUuIDotKQotCShmaXh1cF9zZWdtZW50KTogSWYgbGlua3JlbGF4IGlzIHNldCwganVzdCByZXR1cm4uCi0JKHdyaXRlX29iamVjdF9maWxlKTogRG9uJ3QgdHJlYXQgaDgzMDAgYW5kIHo4ayBzcGVjaWFsbHkgd2l0aAotCXJlZ2FyZCB0byBmaXh1cHMuCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfYmVnaW4pOiBTZXQgbGlua3JlbGF4LgotCSogY29uZmlnL3RjLXo4ay5jIChtZF9iZWdpbik6IERpdHRvLgotCi1UaHUgTWFyICA5IDE4OjAxOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfaGVhZGVyX2FwcGVuZCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dC4KLQotVGh1IE1hciAgOSAxMzo1MTozMCAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JRGVsZXRlIHRoaXMgcGF0Y2gsIGl0IGJyZWFrcyB0aGUgaDgzMDAgYXNzZW1ibGVyLgotCVR1ZSBKYW4gMTAgMTM6MzQ6MTQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IHRyZWF0IGg4MzAwIGFuZCB6OGsKLQlzcGVjaWFsbHkgd2l0aCByZWdhcmQgdG8gZml4dXBzLgotCi1UaHUgTWFyICA5IDEyOjI4OjE4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtcmVsb2NhdGFibGUpOiBDaGFuZ2UgdHlwZSB0byBib29sZWFuLgotCShtZF9iZWdpbik6IFNldCB0aGUgRUZfUFBDX1JFTE9DQVRBQkxFIGlmIC1tcmVsb2NhdGFibGUuCi0KLVdlZCBNYXIgIDggMTU6Mzk6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9iZWdpbik6IENoZWNrIGZvciBhIGNwdSBzdHJpbmcgb2YgcjgwMDAgb3IKLQlyMTAwMDAuICBJZiBtaXBzX2lzYSBpcyA0LCBzZXQgdGhlIG1hY2hpbmUgbnVtYmVyIHRvIDgwMDAuCi0JKGFwcGVuZF9pbnNuKTogSWYgbWlwc19pc2EgaXMgYXQgbGVhc3QgNCwgZG9uJ3QgZ2VuZXJhdGUgbm9wcyBmb3IKLQljb3Byb2Nlc3NvciBkZWxheXMuICBDaGVjayBJTlNOX1JFQURfRlBSX1Igd2hlbiBzZXR0aW5nCi0JbWlwc19jcHJtYXNrWzFdLgotCShtaXBzX2VtaXRfZGVsYXlzKTogSWYgbWlwc19pc2EgaXMgYXQgbGVhc3QgNCwgZG9uJ3QgZ2VuZXJhdGUgbm9wcwotCWZvciBjb3Byb2Nlc3NvciBkZWxheXMuCi0JKG1pcHNfaXApOiBDaGVjayBmb3IgSU5TTl9JU0E0IGluc3RydWN0aW9ucy4gIEhhbmRsZSBuZXcgYXJndW1lbnQKLQl0eXBlcyAnaCcsICdSJywgJ04nLCBhbmQgJ00nLgotCShtZF9sb25nb3B0cyk6IEFjY2VwdCAibWlwczQiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLW1pcHM0LCBhbmQgLW1jcHU9MTAwMDAgYW5kIC1tY3B1PTgwMDAuCi0JKHNfbWlwc3NldCk6IFBlcm1pdCAuc2V0IG1pcHM0LgotCi1XZWQgTWFyICA4IDA5OjM2OjA1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IC5zdGFiIHNlY3Rpb25zIHRvCi0JaGF2ZSBub24gUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2l0aCAtbXJlbG9jYXRhYmxlLgotCi1XZWQgTWFyICA4IDAyOjU3OjUzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG9wY29kZV9wdHIpOiBSZXR1cm4gcG9pbnRlciB0byBjb25zdC4KLQkobWRfYmVnaW4pOiBNYWtlIGhhc2ggdGFibGUgZXJyb3JzIGZhdGFsLiAgUHJvY2VzcyBvcGNvZGUgYWxpYXNlcwotCWFmdGVyIG1haW4gb3Bjb2RlIHRhYmxlLgotCShtZF9hcHBseV9maXhfMiwgY2FzZSA0KTogUmVjb2RlIHNldHRpbmcgb2YgbG93ZXJfbGltaXQgdG8gYXZvaWQKLQlnY2Mgd2FybmluZy4KLQotVHVlIE1hciAgNyAxNjowNzoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgU1BBUkMgVjksIGZyb20gRG91ZyBFdmFucwotCTxkamVAY3lnbnVzLmNvbT4uCi0KLU1vbiBNYXIgIDYgMDk6NTg6MzQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IENoYW5nZSBhbGwgb2NjdXJlbmNlcyBvZiBwYS04OSB3aXRoIHBhLTExIHRvCi0JYmUgY29uc2lzdGVudCB3aXRoIGN1cnJlbnQgbmFtaW5nIGNvbnZlbnRpb25zLgotCShtZF9iZWdpbik6IFNldCBhIGRlZmF1bHQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIHR5cGUuCi0JKHBhX2lwKTogSWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVzIGEgbmV3ZXIgbWFjaGluZSB0eXBlCi0JdGhhbiB0aGUgY3VycmVudCBtYWNoaW5lIHR5cGUsIHRoZW4gdXBkYXRlIHRoZSBjdXJyZW50IG1hY2hpbmUKLQl0eXBlLgotCShuZWVkX3BhMTFfb3Bjb2RlKTogTGlrZXdpc2UuCi0KLVN1biBNYXIgIDUgMTk6Mzg6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd6Jyk6IERvbid0IGxvc2UgYXJndW1lbnQKLQlyZWxvY2F0aW9uIGJpdHMgZm9yIGFic29sdXRlIGNhbGxzLgotCi1GcmkgTWFyICAzIDE3OjQxOjUwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC4qIChtZF9vcGVyYW5kKTogQ2hhbmdlIGVtcHR5IGZ1bmN0aW9uIHRvIGVtcHR5Ci0JbWFjcm8uCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IE1ha2UgSDgvMzAwLUggd2FybmluZyBtZXNzYWdlCi0JY2xlYXJlci4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBJZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgZmFpbHMsCi0JcHJpbnQgYSBtZXNzYWdlIGFuZCBleGl0LCBpbnN0ZWFkIG9mIGFib3J0aW5nLgotCi1GcmkgTWFyICAzIDE2OjI2OjE5IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdGMuaCAobWRfYXBwbHlfZml4Myk6IElmIE1EX0FQUExZX0ZJWDMgaXMgZGVmaW5lZCwgZGVjbGFyZQotCW1kX2FwcGx5X2ZpeDMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBJZiBNRF9BUFBMWV9GSVgzIGlzIGRlZmluZWQsIGNhbGwKLQltZF9hcHBseV9maXgzIHdpdGggdGhlIG5vcm1hbCAyIGFyZ3VtZW50cyBhbmQgdGhlIGN1cnJlbnQgc2VnbWVudAotCXBvaW50ZXIgaW5zdGVhZCBvZiBtZF9hcHBseV9maXguCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IFdhcm4gaWYgLW1yZWxvY2F0YWJsZQotCWFuZCBhIG5vbiBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIHRoYXQgaXNuJ3QgaW4gdGhlIC5nb3QyIHNlZ21lbnQKLQl3YXMgcGVyZm9ybWVkLgotCShtZF9hcHBseV9maXgzKTogUmVuYW1lIGZyb20gbWRfYXBwbHlfZml4IGFuZCB0YWtlIHNlZ21lbnQgcG9pbnRlcgotCWFzIHRoaXJkIGFyZ3VtZW50LiAgSWYgRUxGIG9iamVjdCBmb3JtYXQsIGNhbGwgcHBjX2VsZl92YWxpZGF0ZV9maXgKLQlmb3Igbm9ybWFsIHJlbG9jYXRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiBFTEYgb2JqZWN0IGZvcm1hdCwgcmVjb2duaXplIHRoZQotCS1tcmVsb2NhdGFibGUgc3dpdGNoLgotCi1UaHUgTWFyICAyIDE2OjM0OjQ0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoQU9VVF9NQUNIVFlQRSk6IERlZmluZSBhcyAxMDAsIG5vdCAwLgotCi1UdWUgRmViIDI4IDE4OjI5OjI3IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYywgY29uZmlnL3RjLWFybS5oIChtZF9vcGVyYW5kKTogUmVwbGFjZWQgZW1wdHkKLQlmdW5jdGlvbiBpbiAuYyBmaWxlIHdpdGggZW1wdHkgbWFjcm8gaW4gLmggZmlsZS4KLQkqIGNvbmZpZy90Yy1oODUwMC4qLCBjb25maWcvdGMtaHBwYS4qLCBjb25maWcvdGMtaTM4Ni4qLAotCWNvbmZpZy90Yy1pODYwLiosIGNvbmZpZy90Yy1pOTYwLiosIGNvbmZpZy90Yy1uczMyay4qLAotCWNvbmZpZy90Yy1wcGMuKiwgY29uZmlnL3RjLXNoLiosIGNvbmZpZy90Yy1zcGFyYy4qLAotCWNvbmZpZy90Yy10YWhvZS4qLCBjb25maWcvdGMtdmF4LiosIGNvbmZpZy90Yy13NjUuKiwKLQljb25maWcvdGMtejhrLio6IERpdHRvLgotCSogY29uZmlnL3RjLW02OGsuKjogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1vdGVfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBkb3RzIGZyb20gb3Bjb2RlCi0JbmFtZXMuCi0KLQkqIHJlYWQuYyAoc19hcHBfbGluZSk6IElnbm9yZSBub24tcG9zaXRpdmUgbGluZSBudW1iZXJzLgotCi1UdWUgRmViIDI4IDE1OjM0OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBQTFQgb3IKLQlHT1QgcmVsb2NzIGVpdGhlci4KLQotTW9uIEZlYiAyNyAxMzowMzo0MSAxOTk1ICBLdW5nIEhzdSAgPGt1bmdAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IGFkZCBhMjlrLSotdnh3b3JrcyBjb25maWd1cmF0aW9uLgotCi1GcmkgRmViIDI0IDE0OjQxOjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IFRha2UgZGJsIGFyZ3VtZW50IHRvIGRldGVybWluZQotCWhhbmRsaW5nIG9mIHNpZ25lZCAzMiBiaXQgdmFsdWVzIGluIDY0IGJpdCBtb2Rlcy4gIENoYW5nZSBhbGwKLQljYWxsZXJzLgotCShtYWNybyk6IEhhbmRsZSBNX0RMSSBhbmQgTV9ETEFfQUIuCi0KLVdlZCBGZWIgMjIgMjM6MTA6NTYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IERvbid0IHN1YnRyYWN0IHRoZSB2YWx1ZSBvZiB0aGUKLQlhZGQgc3ltYm9sIGlmIGl0J3MgYSBjb21tb24gc3ltYm9sICh0aGUgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sCi0JaXMgaXRzIHNpemUsIG5vdCBhIHZhbHVlIGluIHRoZSB0cmFkaXRpb25hbCBzZW5zZSkuCi0KLVdlZCBGZWIgMjIgMjE6MTI6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IElmIGxpc3RpbmdfcHJldl9saW5lIGlzIGNhbGxlZCwKLQljYWxsIGZyYWdfZ3JvdyB0byBtYWtlIHN1cmUgdGhlcmUgaXMgc3RpbGwgcm9vbSBmb3IgYSB2YXJpYW50LgotCi1GcmkgRmViIDE3IDE0OjUwOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIDJieXRlLCA0Ynl0ZSBhbmQgOGJ5dGUKLQlpZiBPQkpfRUxGLiAgRnJvbSBnYXJ5QEludHJlcGlkLkNPTSAoR2FyeSBGdW5jaykuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IFdhcm4gaWYgYSBzeW1ib2wgaXMgYm90aAotCXdlYWsgYW5kIGNvbW1vbi4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IExpa2V3aXNlLgotCi1GcmkgRmViIDE3IDEyOjQzOjQ3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBEb24ndCByZWRlZmluZSBieXRlIHVuZGVyCi0JRUxGLgotCShwcGNfZWxmX2NvbnMpOiBEb24ndCBzdXBwb3J0IEBwY3JlbCBhbnkgbW9yZSwgc2luY2UgRElGRl9FWFBSX09LCi0JYWxsb3dzIHRoZSBub3JtYWwgZXhwcmVzc2lvbnMgdG8gZ2VuZXJhdGUgaXQuCi0JKG1kX2FwcGx5X2ZpeCk6IENvbnZlcnQgQkZEX1JFTE9DXzMyIHdpdGggcGNyZWwgYml0IHNldCBpbnRvCi0JQkZEX1JFTE9DXzMyX1BDUkVMLiAgQWJvcnQgaWYgZWl0aGVyIEJGRF9SRUxPQ18xNiBvciBCRkRfUkVMT0NfOAotCW5lZWQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lIHRvIGFsbG93IFBDIHJlbGF0aXZlCi0JZXhwcmVzc2lvbnMgdG8gYmUgaGFuZGxlZC4KLQotVGh1IEZlYiAxNiAxNDozMDoxMyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IE1vdmUgbWRfb3BlcmFuZCBoYW5kbGluZyB0byBkZWZhdWx0IGNhc2UKLQkoc28gaXQgd29ya3MpLgotCi1XZWQgRmViIDE1IDE2OjA4OjQ3IDE5OTUgIEphc29uIE1vbGVuZGEgIDxjcmFzaEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaDg1MDAuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQWRkIGlnbm9yZWQKLQlwYXJhbWV0ZXIsIHRvIG1hdGNoIHByb3RvdHlwZS4KLQotV2VkIEZlYiAxNSAxNTowNzowMCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfcHNldWRvX3RhYmxlKTogSWYgRUxGLCBnbyB0byBwcGNfZWxmX2NvbnMKLQlpbnN0ZWFkIG9mIGNvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBTaG93IGFsbCBvZiB0aGUgUG93ZXJQYyBvcHRpb25zLgotCShwcGNfZWxmX3N1ZmZpeCk6IE5ldyBmdW5jdGlvbiB0byByZWNvZ25pemUgRUxGIHN1ZmZpeGVzIHRoYXQKLQlzcGVjaWZ5IGEgcmVsb2NhdGlvbiwgc3VjaCBhcyBAR09ULgotCShwcGNfZWxmX2NvbnMpOiBSZXBsYWNlbWVudCBmb3IgdGhlIHN0YW5kYXJkIGNvbnMgZnVuY3Rpb24gdGhhdAotCWtub3dzIGFib3V0IHRoZSBFTEYgc3VmZml4ZXMuCi0JKHBwY19maXh1cCk6IEFkZCByZWxvYyBmaWVsZCB0byBob2xkIG5vbi1zdGFuZGFyZCByZWxvY2F0aW9uLgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSBFTEYgc3VmZml4ZXMgbGlrZSBAR09ULgotCShtZF9jcmVhdGVfc2hvcnRfanVtcCk6IER1bW15IGluIGNhc2UgV09SS0lOR19ET1RfV09SRCBpcyBub3QKLQlkZWZpbmVkLgotCShtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKG1kX3Nob3J0X2p1bXBfc2l6ZSk6IERpdHRvLgotCShtZF9sb25nX2p1bXBfc2l6ZSk6IERpdHRvLgotCShtZF9hcHBseV9maXgpOiBIYW5kbGUgQkZEX1JFTE9DXzMyX1BDUkVMLCBCRkRfUkVMT0NfTE8xNiwKLQlCRkRfUkVMT0NfSEkxNiwgQkZEX1JFTE9DX0hJMTZfUywgQkZEX1JFTE9DX1BQQ19UT0MxNiwgYW5kCi0JQkZEX1JFTE9DXzE2IHJlbG9jYXRpb25zLiAgSWYgcmVsb2NhdGlvbiBjYW4gbm90IGJlIGZvdW5kLCBwcmludAotCXRoZSBkZWNpbWFsIHZhbHVlIG9mIHRoZSByZWxvY2F0aW9uLgotCi1XZWQgRmViIDE1IDExOjQ2OjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXBwbHlfZml4KTogQWNjZXB0IEJGRF9SRUxPQ18xNiwgZm9yCi0JRFdBUkYuICBGcm9tIGdhcnlASW50cmVwaWQuQ09NIChHYXJ5IEZ1bmNrKS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBIYW5kbGUgTV9Ve0wsU31EW19BXSAodW5hbGlnbmVkIGRvdWJsZQotCWxvYWRzIGFuZCBzdG9yZXMpLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jICh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKTogRG8gYWRqdXN0IGdsb2JhbAotCXN5bWJvbHMgaWYgT0JKX0FPVVQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRG9uJ3QgdXNlIHRoZSB0YXJnZXQgcmVnaXN0ZXIgYXMgYQotCWJhc2UgcmVnaXN0ZXIgd2hlbiBidWlsZGluZyB0aGUgYWRkcmVzcyBmb3IgTV9Me1csRH17TCxSfV9BQi4KLQotTW9uIEZlYiAxMyAxNDo0NDozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKEtUMCwgS1QxKTogRGVmaW5lLgotCShtaXBzX2lwKTogUmVjb2duaXplICRrdDAgYW5kICRrdDEgYXMgcmVnaXN0ZXIgbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERlZmluZSBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCk6IElmIE9CSl9FTEYsIHN1YnRyYWN0IG91dCB0aGUKLQl2YWx1ZSBvZiBhIGRlZmluZWQgc3ltYm9sOyB0aGUgdmFsdWUgd2FzIGFkZGVkIGluIGJ5Ci0JZml4dXBfc2VnbWVudC4gIFRoaXMgd2FzIHByZXZpb3VzbHkgY29ycmVjdGVkLCBpZiB0aGUgcmVsb2Mgd2FzCi0JY2hhbmdlZCB0byBiZSBhZ2FpbnN0IGEgc2VjdGlvbiBzeW1ib2wsIGluIHRjX2dlbl9yZWxvYy4KLQotRnJpIEZlYiAxMCAxNDowNDowNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBVc2UgU19JU19FWFRFUk4KLQlyYXRoZXIgdGhhbiAhU19JU19MT0NBTC4KLQotVGh1IEZlYiAgOSAxODoxNjozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogQWRqdXN0IGNvbmRpdGlvbnMgZm9yIGNoYW5naW5nCi0JQkZEX1JFTE9DXzMyIHRvIEJGRF9SRUxPQ18zODZfR09UUEMgdG8gaGFuZGxlIGEgc3dpdGNoIGluIGZyYWdzLgotCVBhdGNoIG9yaWdpbmFsbHkgZnJvbSBSb2IgUnlhbiA8cm9ickBjbXUuZWR1Pi4KLQotCSogY29uZmlnL3RjLWkzODYuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlIHJldHVybiB2YWx1ZS4KLQkoaTM4Nl9vcGVyYW5kKTogRG9uJ3QgdXNlIGFuIGFzc2lnbm1lbnQgZGlyZWN0bHkgYXMgYSBjb25kaXRpb24uCi0KLVRodSBGZWIgIDkgMTA6Mzc6MTMgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEluIHNvbWUgY2FzZXMgc3VidHJhY3QgdGhlCi0JdmFsdWUgb2YgdGhlIGFkZCBzeW1ib2wgZnJvbSB2YWxwLiAgT2Zmc2V0cyBicmFpbmRhbWFnZSBpbiB0aGUKLQkibWFjaGluZSBpbmRlcGVuZGVudCIgZml4dXBfc2VnbWVudC4KLQotV2VkIEZlYiAgOCAxODo1MToyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtZXNzYWdlcy5jIChhc19hYm9ydCk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGFzX2Fib3J0KTogRGVjbGFyZSBpdC4KLQkoYWJvcnQpOiBOZXcgbWFjcm8uCi0KLQlUaHUgSmFuIDE5IDE4OjEwOjA1IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvdm1zLWNvbmYuaCAoSEFWRV9VTklTVERfSCk6ICBkZWZpbmUgaXQgdW5jb25kaXRpb25hbGx5LgotCSogY29uZmlnLWdhcy5jb206ICB0ZXN0IGZvciBhdmFpbGFiaWxpdHkgb2YgPHVuaXN0ZC5oPjsgY3JlYXRlIGEKLQlydWRpbWVudGFyeSBvbmUgaWYgbmVjZXNzYXJ5LgotCi1UdWUgRmViICA3IDEzOjM0OjQ2IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgcG93ZXJwYy0qLWVhYmkgc3VwcG9ydCwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKLQlwb3dlcnBjLSotZWxmLgotCShjb25maWd1cmUpOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYuCi0KLU1vbiBGZWIgIDYgMDM6Mzc6MDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCUNoYW5nZXMgZnJvbSBCcnlhbiBGb3JkIDxiYWZvcmRAc2NoaXJmLmNzLnV0YWguZWR1PiBmb3IgaTM4NgotCTE2LWJpdCBhbmQgbXNkb3Mgc3VwcG9ydDoKLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGZsYWdfMTZiaXRfY29kZSk6IE5ldyB2YXJpYWJsZS4KLQkoc2V0XzE2Yml0X2NvZGVfZmxhZyk6IE5ldyBmdW5jdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQWRkZWQgZW50cmllcyAiY29kZTE2IiBhbmQgImNvZGUzMiIuCi0JKG1kX2Fzc2VtYmxlKTogRW5zdXJlIHRoYXQgY29ycmVjdCBkYXRhLXNpemUgcHJlZml4ZXMgZ2V0IGVtaXR0ZWQsCi0JYmFzZWQgb24gdGhlIGN1cnJlbnQgbW9kZS4gIEVuc3VyZSB0aGF0IDMyLWJpdCBhZGRyZXNzaW5nIHdpbGwKLQlhbHdheXMgYmUgZG9uZS4gIE1vdmUgc2VnbWVudC1wcmVmaXggaGFuZGxpbmcgY29kZS4gIChXaHk/KSAgVXNlCi0JMTYtYml0IGp1bXBzIGZvciAxNi1iaXQgY29kZSwgMzItYml0IGp1bXBzIGZvciAzMi1iaXQgY29kZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKE1BWF9QUkVGSVhFUyk6IEJ1bXAgdG8gNS4KLQkoRGF0YTE2LCBEYXRhMzIpOiBEZWZpbmUuCi0JKiBkb2MvYXMudGV4aW5mbyAoaTM4Ni0xNmJpdCk6IE5ldyBub2RlLgotCSogY29uZmlndXJlLmluIChpMzg2LSotbXNkb3MqKTogTmV3IHRhcmdldCwgdXNpbmcgYS5vdXQgZm9ybWF0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVGh1IEZlYiAgMiAxNToyMToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChjcHUzMl9jb250cm9sX3JlZ3MpOiBOZXcgbWFjcm8uCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogVXNlIGl0LCBmb3IgY3B1MzIgcHJvY2Vzc29ycy4KLQotCVR1ZSBKYW4gMzEgMTc6MjA6NDUgMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZtc190aXJfc3RhY2tfcHNlY3QpOiAgbmV3IHJvdXRpbmU7Ci0JKFZNU19TZXRfRGF0YSwgVk1TX1NldF9Qc2VjdCwgVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlLAotCVZNU19UQlRfUm91dGluZV9CZWdpbiwgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uKTogIHVzZSBpdDsKLQkoVk1TX0dsb2JhbF9TeW1ib2xfU3BlYywgVk1TX1Byb2NlZHVyZV9FbnRyeV9QdCk6ICB0cmVhdAotCVBzZWN0X051bWJlciBhcyBgdW5zaWduZWQnLgotCi0JVGh1IEphbiAyNiAxNzowNjoyOCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuYzogIHBlcmZvcm1hbmNlIHR1bmluZy4KLQkoVk1TX1N5bWJvbF90eXBlX2xpc3QpOiAgY29udmVydCBmcm9tIHNpbmdsZSBsaXN0IGhlYWQgdG8gc21hbGwKLQlhcnJheSBvZiBsaXN0IGhlYWRzOwotCShTWU1UWVBfSEFTSCk6ICBuZXcgbWFjcm8gZm9yIGFjY2Vzc2luZyBWTVNfU3ltYm9sX3R5cGVfbGlzdFtdOwotCShmaW5kX3N5bWJvbCwgc2V0dXBfYmFzaWNfdHlwZSwgVk1TX3R5cGVkZWZfcGFyc2UpOiAgdXNlIGl0OwotCShWTVNfUlNZTV9QYXJzZSk6ICBtb3ZlIFNfR0VUX1ZBTFVFKCkgaW5zaWRlIHN3aXRjaCB0byBhdm9pZAotCWNhbGxpbmcgaXQgZm9yIHVuaW50ZXJlc3RpbmcgY2FzZXMuCi0KLVdlZCBGZWIgIDEgMjM6NTI6NDUgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEdvIGFoZWFkIGFuZCBjYWxsCi0JaHBwYV9maWVsZF9hZGp1c3QgdG8gZ2V0IGEgbmV3IHZhbHVlIGZvciBSX0RBVEFfT05FX1NZTUJPTAotCXJlbG9jYXRpb25zIGluIFNPTS4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlZmluZSBzb21ld2hhdC4KLQotRnJpIEphbiAyNyAyMToyOTo1MyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoTk9fU1RSSU5HX0VTQ0FQRVMpOiBEb24ndCBkZWZpbmUgaWYgd2UgYXJlCi0JdXNpbmcgRUxGLgotCi1UaHUgSmFuIDI2IDE5OjAzOjQyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBBZGQgcGFyZW5zIGFyb3VuZCB8IGluc2lkZSAmLgotCShza2lwX2NvbG9udGhpbmcpOiBTZXQgTF84IGlmICI6OCIgaXMgc3BlY2lmaWVkLgotCi1UaHUgSmFuIDI2IDE4OjM4OjAxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9iZWdpbik6IFBlcm1pdCBtZmRlYyB0byBiZSBkdXBsaWNhdGVkIG9uIHRoZQotCTYwMS4gIENoZWNrIHRoYXQgdGhlIGVycm9yIHJldHVybiBmcm9tIGhhc2hfaW5zZXJ0IGlzICJleGlzdHMiLgotCi1UaHUgSmFuIDI2IDExOjM1OjMzIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IEFkZCBzdXBwb3J0IGZvciBjb25maWd1cmluZyBwb3dlcnBjLSotZWFiaS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChHT1Rfc3ltYm9sKTogRGVmaW5lIGlmIG9iamVjdCBmb3JtYXQgaXMgRUxGLgotCi0JKiBjb25maWcvdGMtcHBjLmggKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlZmluZSBpZiBvYmplY3QKLQlmb3JtYXQgaXMgRUxGIGFuZCBub3QgZGVmaW5lZCB0byBiZSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfIi4KLQotV2VkIEphbiAyNSAxNjoyMzoxMyAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHRjLXNoLmMgKGxpdHRsZSk6IEFkZCBhcmd1bWVudCBJR05PUkUgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBzcGFjZSBmb3IgY29uc2lzdGVudCBmb3JtYXR0aW5nLgotCShDT05EOF9SQU5HRSwgQ09ORDEyX1JBTkdFKTogRGVsZXRlIHVudXNlZCBtYWNyb3MuCi0JKENPTkQ4X0YsIENPTkQ4X00sIENPTkQxMl9GLCBDT05EMTJfTSwgVU5DT05EMTJfRiwgVU5DT05EMTJfTSk6Ci0JQ29ycmVjdCBtaW5pbXVtIGFuZCBtYXhpbXVtIGJyYW5jaCBvZmZzZXRzLiAgQWRkIGNvbW1lbnRzIGV4cGxhaW5pbmcKLQl3aHkgdGhlc2UgbnVtYmVycyBhcmUgY29ycmVjdC4KLQotV2VkIEphbiAyNSAxNTozMjowOSAxOTk1ICBEYXZpZCBFZGVsc29obiAgPGVkZWxzb2huQG1ocGNjLmVkdT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgbXB3cjIgYXMgYSBzeW5vbnltIGZvcgotCW1wd3J4OyBtcHBjMzIsIG02MDMsIGFuZCBtNjA0IGFzIHN5bm9ueW1zIGZvciBtcHBjOyBhbmQgbXBwYzY0IGFuZAotCW02MjAgZm9yIFBvd2VyUEM2NCBtb2RlLgotCShwcGNfc3ltYm9sX25ld19ob29rKTogQWRkIFQwIGFzIHN5bm9ueW0gZm9yIFRDMCBzdWZmaXguCi0KLVR1ZSBKYW4gMjQgMTY6NDQ6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXZheC5jICh2aXApOiBJbnRyb2R1Y2UgbmV3IHB0ci10by1jb25zdCBsb2NhbCB2YXJpYWJsZQotCWZvciBzY2FubmluZyBvcGVyYW5kIHN0cmluZy4KLQotCVNhdCBKYW4gMjEgMTc6NTA6MzggMTk5NSAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy92YXgtaW5zdC5oIChzdHJ1Y3Qgdm9wLCBmaWVsZHMgYHZvcF93YXJuJywgYHZvcF9lcnJvcicpOgotCW1ha2UgdGhlbSBwb2ludGVycyB0byBjb25zdCBjaGFyOwotCShzdHJ1Y3Qgdml0LCBmaWVsZCBgdml0X2Vycm9yJyk6ICBkaXR0by4KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChtZF9hdG9mKTogIHJlbmFtZSBsb2NhbCBgbGl0dGxlbnVtX3BvaW50ZXInCi0JdG8gYGxpdHRsZW51bVAnIHRvIGF2b2lkIHNoYWRvd2luZyBmaWxlIHNjb3BlIHZhcmlhYmxlLgotCSogY29uZmlnL3RjLXZheC5jICh2aXBfYmVnaW4sIHZpcF9vcF9kZWZhdWx0cywgdmlwX29wXzEpOiAgbWFrZQotCXN0cmluZyBhcmd1bWVudHMgYmUgcG9pbnRlcnMgdG8gY29uc3QgY2hhcjsKLQkodmlwKTogIG1ha2UgYGFsbG9wZXJyJyBjb25zdCBjaGFyICo7Ci0JKHZpcF9vcCk6IG1ha2UgYGVycicgYW5kIGB3cm4nIGNvbnN0IGNoYXIgKjsgcmVuYW1lIGBhY2Nlc3MnIHRvCi0JYGFjY2Vzc19tb2RlJyB0byBhdm9pZCBzaGFkb3dpbmcgbGlicmFyeSBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKGBzeW1ib2xfbmFtZScpOiAgbWFrZSBpdCBjb25zdCBjaGFyICo7Ci0JKGdldF9zdHJ1Y3RfbmFtZSk6ICBjYXN0IG9uZSB1c2Ugb2YgYHN5bWJvbF9uYW1lJyB0byBjaGFyICoKLQlbY2FsbGVyIGd1YXJhbnRlZXMgdGhhdCBpdCB3b24ndCBtb2RpZnkgdGhlIHBvaW50ZXIncyB0YXJnZXRdOwotCShQVVRfQ09VTlRFRF9TVFJJTkcpOiAgdXNlIHBvaW50ZXIgdG8gY29uc3QgY2hhcjsKLQkoVk1TX3R5cGVkZWZfcGFyc2UpOiAgbWFrZSBgcG50MicgY29uc3QgY2hhciAqOwotCShXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiAgbWFrZSBgY3AnIGNvbnN0IGNoYXIgKjsKLQkoVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzLCBhcnJheSBgQXR0cmlidXRlcycpOiAgbWFrZSBjb25zdCwKLQlhbmQgbWFrZSBmaWVsZCBgTmFtZScgcG9pbnRlciB0byBjb25zdCBjaGFyOwotCi0JKiBhcy5oIChgc2VnX25hbWVbXScgZGVjbGFyYXRpb24pOiAgcG9pbnRlcnMgdG8gY29uc3QgY2hhcjsKLQkoc3RydWN0IF9wc2V1ZG9fdHlwZSwgZmllbGQgYHBvY19uYW1lJyk6ICBwb2ludGVyIHRvIGNvbnN0IGNoYXIuCi0JKiBzdWJzZWdzLmMgKGBzZWdfbmFtZVtdJyBkZWZpbml0aW9uKTogIGRpdHRvOwotCSogaGFzaC5jIChoYXNoX2Fzayk6ICByZW5hbWUgYXJndW1lbnQgYGFjY2VzcycgdG8gYGFjY2Vzc190eXBlJwotCXRvIGF2b2lkIHNoYWRvd2luZyBsaWJyYXJ5IGZ1bmN0aW9uLgotCSogd3JpdGUuYyAodmFyaWFibGUgYHRoZV9vYmplY3RfZmlsZScpOiAgbW92ZSBmcm9tIGZpbGUgc2NvcGUKLQl0byBibG9jayBzY29wZSB3aXRoaW4gd3JpdGVfb2JqZWN0X2ZpbGUoKTsgZnJlZSBpdCBhZnRlciB1c2U7Ci0JKGZpeHVwX3NlZ21lbnQpOiAgY29uZGl0aW9uYWxseSBleGNsdWRlIGl0IGZvciBPQkpfVk1TLgotCShjdnRfZnJhZ190b19maWxsKTogIHJlbmFtZSBhcmd1bWVudCBgaGVhZGVycycgdG8gYGhlYWRlcnNQJwotCXRvIGF2b2lkIHNoYWRvd2luZyBmaWxlIHNjb3BlIHZhcmlhYmxlLgotCi1Nb24gSmFuIDIzIDIxOjQyOjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCwgY2FzZSAnRCcpOiBGaXggdHlwbyB3aGljaCBjYXVzZWQKLQltaXNjb21waWxhdGlvbiBvZiAiZGlhZyIgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gSmFuIDIzIDE1OjUxOjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0KLU1vbiBKYW4gMjMgMTQ6MDc6NTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guaCAodGNfaW5pdF9hZnRlcl9hcmdzKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSB0YWJsZS4KLQkobWRfYXNzZW1ibGUpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHAuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IENhc3QgZnJfYWRkcmVzcyB0byB1bnNpZ25lZCBsb25nIGZvciBwcmludGYuCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBhc193YXJuX3doZXJlIHJhdGhlciB0aGFuIGFzX3dhcm4uCi0JKHNoX2luaXRfYWZ0ZXJfYXJncyk6IFJlbW92ZSBlbXB0eSBmdW5jdGlvbi4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ251KmVsZiopOiBOZXcgdGFyZ2V0LgotCi1TYXQgSmFuIDIxIDE5OjAyOjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogaGFzaC5jIChoYXNoX2Fzayk6IElmIHdlIGZpbmQgdGhlIHNsb3QgYWZ0ZXIgd3JhcHBpbmcgYXJvdW5kLAotCWJyZWFrIG91dCBvZiB0aGUgbG9vcC4gIEZpeGVzIGJ1ZyBpbiBKYW4gMTggY2hhbmdlLgotCi1GcmkgSmFuIDIwIDE3OjA3OjMxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGhhc2guYyAoaGFzaF9jb2RlKTogVW5kbyBsYXN0IGNoYW5nZS4KLQotVGh1IEphbiAxOSAxNDo0OTo0NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXApOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcyB0byBrZWVwCi0JZ2NjIHF1aWV0LgotCShncGRpc3BfaGkxNl9ob3d0byk6IERvbid0IHVzZSAiY29uc3QiIHdpdGggcmVsb2NfaG93dG9fdHlwZS4KLQkoaW5fcmFuZ2Vfc2lnbmVkKTogQWRkIHBhcmVucyBhcm91bmQgc3VidHJhY3Rpb24gaW5zaWRlIHNoaWZ0LgotCSogZ2FzcC5jIChkb19kYXRhKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZSAib3BuYW1lIi4KLQkoaXN0cnVlKTogUHJvdmlkZSBhIGRlZmF1bHQgY2FzZSB0byBzZXQgInJlcyIgYW5kIGtlZXAgImdjYyAtV2FsbCIKLQlxdWlldC4KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogRGVsZXRlZCB1bnVzZWQgdmFyaWFibGUuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogRGVjbGFyZS4KLQkqIGhhc2guYyAoaGFzaF9hc2spOiBEZWxldGUgZGlzYWJsZWQgbm9uLXN0cmNtcCB2ZXJzaW9uIG9mIHRoZQotCWNvZGUsIGFuZCBhdXRvbWF0aWMgdmFyaWFibGVzIHVzZWQgb25seSBpbiB0aG9zZSBzZWN0aW9ucy4KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBPbmx5IGRlZmluZSBsb2NhbCB2YXJpYWJsZQotCSJwcmV2X2ZpeCIgaWYgQkZEX0FTU0VNQkxFUi4KLQkqIGZsb251bS1rb25zdC5jIChkdW1teTEpOiBSZXR1cm4gdm9pZC4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBSZW1vdmUgdHdvIGNvbXBhcmlzb25zIG9mCi0JdW5zaWduZWQgbnVtYmVycyB2ZXJzdXMgemVyby4KLQkqIGFzLmggKGJjb3B5KTogSWYgbmVpdGhlciBtZW1jcHkgbm9yIGJjb3B5IGlzIGRlZmluZWQgYXMgYSBtYWNybywKLQlkZWZpbmUgdG8gdXNlIG1lbWNweS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMsIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogUmV2ZXJ0IDIgSnVuZSBjaGFuZ2VzLgotCVR1cm5zIG91dCB3ZSBuZXZlciBnb3QgdGhlIGFzc2lnbm1lbnQgZG9uZSBhZnRlciBhbGwuCi0KLQlDbGVhbnVwIG9mIFZBWCBhbmQgVk1TIGNvZGUsIGZyb20gUGF0IFJhbmtpbjoKLQkqIGNvbmZpZy9vYmotdm1zLmM6IENoYW5nZWQgZXhwb3J0ZWQgZnVuY3Rpb24gbmFtZXMgdG8gbG93ZXIgY2FzZS4KLQkoQ2hhbmdlZCBjYWxsIHNpdGVzIGluIHdyaXRlLmMuKSAgRGVjbGFyZSBWTVMgc3lzdGVtIGZ1bmN0aW9uCi0JbmFtZXMgdXNlZCwgY29uZGl0aW9uYWwgb24gYWN0dWFsbHkgYmVpbmcgb24gVk1TLiAgQ2hhbmdlZCBtYW55Ci0JZnVuY3Rpb25zIHRoYXQgcmV0dXJuZWQgbm8gdXNlZnVsIHZhbHVlIHRvIG5vdyBiZSBkZWNsYXJlZCB0bwotCXJldHVybiB2b2lkLiAgUmVtb3ZlZCBtYW55IHVudXNlZCB2YXJpYWJsZXMuICBTdXBwbHkgbWlzc2luZwotCXJldHVybiBzdGF0ZW1lbnRzIG9yIHZhbHVlcy4gIFN1cHBseSBgZGVmYXVsdCcgY2FzZSBpbiBzd2l0Y2gKLQlzdGF0ZW1lbnRzLiAgRW5zdXJlIGxvY2FsIHZhcmlhYmxlcyBnZXQgaW5pdGlhbGl6ZWQuCi0JKiBjb25maWcvdGMtdmF4LmM6IE1pbm9yIGNoYW5nZXMgdG8gc2lsZW5jZSAiZ2NjIC1XYWxsIi4KLQkqIGNvbmZpZy9vYmotdm1zLmgsIGNvbmZpZy90Yy12YXguaDogQWRkZWQgc29tZSBtaXNzaW5nCi0JZGVjbGFyYXRpb25zLgotCi1XZWQgSmFuIDE4IDEzOjQ5OjI2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGF0b2YtZ2VuZXJpYy5jIChmbG9udW1fcHJpbnQpIFtUUkFDRV06IE5ldyBmdW5jdGlvbi4KLQkoYXRvZl9nZW5lcmljKSBbVFJBQ0VdOiBQcmludCBtdWx0aXBsaWVyIGJlZm9yZSBtdWx0aXBsaWNhdGlvbiwKLQlhbmQgcHJpbnQgbXVsdGlwbGljYXRpb24gcmVzdWx0IGJlZm9yZSBhbmQgYWZ0ZXIgY29weS4KLQotCSogZmxvbnVtLW11bHQuYyAoZmxvbnVtX211bHRpcCk6IEF2b2lkIHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zCi0JYXJvdW5kIG11bHRpcGxpY2F0aW9uIG9wZXJhdGlvbi4KLQotCSogYXRvZi1nZW5lcmljLmMgKEFTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UKTogRGVmaW5lLgotCShhdG9mX2dlbmVyaWMpIFtBU1NVTUVfREVDSU1BTF9NQVJLX0lTX0RPVF06IENoZWNrIGZvciAnLicKLQlleHBsaWNpdGx5IGluc3RlYWQgb2YgY2FsbGluZyBzdHJjaHIuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFdoZW4gc2Nhbm5pbmcgc3VjY2Vzc2l2ZSBvcGNvZGUKLQl0YWJsZSBlbnRyaWVzLCBjaGVjayBuYW1lcyBmb3IgcG9pbnRlciBlcXVhbGl0eSBiZWZvcmUgZG9pbmcKLQlzdHJpbmcgY29tcGFyaXNvbnMuCi0KLQkqIGhhc2guYyAoaGFzaF9hc2spOiBDYWxsIHN0cmNtcCBpbnN0ZWFkIG9mIGV4cGFuZGluZyBpdCBpbmxpbmUuCi0JKGhhc2hfY29kZSk6IFJlcGxhY2VkIHdpdGggYSB2ZXJzaW9uIGZyb20gYmZkLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBJZiBDT0ZGX0ZMQUdTIGlzbid0Ci0JZGVmaW5lZCwgZGVmYXVsdCBpdCB0byB6ZXJvLgotCi1XZWQgSmFuIDE4IDEyOjE2OjA3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IENsZWFyIGZ4X2JzciBvbiB0aG9zZSB0YXJnZXRzIHdoaWNoCi0JdXNlIGl0LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBQYXJlbnRoZXNpemUgJiYgd2l0aGluIHx8LgotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBMaWtld2lzZS4KLQkobGlzdF9zeW1ib2xfdGFibGUpOiBVc2UgJWx1IHRvIHByaW50IHNpemVvZi4KLQkqIHN5bWJvbHMuYzogQ29tbWVudCBvdXQgdW51c2VkIGZ1bmN0aW9uIGluZGVudC4KLQkocHJpbnRfc3ltYm9sX3ZhbHVlXzEpOiBDYXN0IHBvaW50ZXIgdG8gdW5zaWduZWQgbG9uZyBmb3IgcHJpbnRmLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBPbmx5IGRlY2xhcmUgc3ltYm9sX3B0ciBpZiBpdAotCXdpbGwgYmUgdXNlZC4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9iZWdpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgcmVnLgotCShnZXRfb3BlcmFuZCk6IERlY2xhcmUgdHlwZSBvZiBwYXJhbWV0ZXIgZGlyZWN0aW9uLiAgUmVtb3ZlIHVudXNlZAotCXZhcmlhYmxlIHNpemUuCi0JKGdldF9zcGVjaWZpYyk6IEZpeCBjb21tZW50IHRvIGF2b2lkIG5lc3RlZCBjb21tZW50cy4KLQkoY2hlY2tfb3BlcmFuZCk6IENhc3QgWF9hZGRfbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkoYnVpbGRfYnl0ZXMpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHZhcmlhYmxlcyBvdXRwdXRfcHRyLCBwYXJ0LCBhbmQKLQloaWdoLgotCShidWlsZF9ieXRlcyk6IENhc3QgWF9hZGRfbnVtYmVyIHRvIHVuc2lnbmVkIGxvbmcgZm9yIHByaW50Zi4KLQkoY2xldmVyX21lc3NhZ2UpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHNjYW4uCi0JKG1kX2Fzc2VtYmxlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogUmVtb3ZlIHVudXNlZCBmdW5jdGlvbi4KLQkqIHRjLWg4MzAwLmggKHRjX3JlbG9jX21hbmdsZSk6IERlY2xhcmUuCi0KLVR1ZSBKYW4gMTcgMTA6NTg6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzQ2NTApOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IEhhbmRsZSBhIGNwdSBzdHJpbmcgb2YgIjQ2NTAiLiAgSWYgbWlwc180NjUwIHdhcyBub3QKLQlpbml0aWFsaXplZCwgc2V0IGl0IHRvIDAuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3QgaW5zZXJ0IG5vcHMgYXJvdW5kIEhJIGFuZCBMTyBvbiBhIDQ2NTAuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBMaWtld2lzZS4KLQkobWlwc19pcCk6IFVzZSBJTlNOX0lTQSBtYXNrIHRvIGNoZWNrIElTQSBvZiBpbnN0cnVjdGlvbi4gIENoZWNrCi0JZm9yIElOU05fNDY1MC4KLQkobWRfbG9uZ29wdHMpOiBBZGQgbTQ2NTAgYW5kIG5vLW00NjUwLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbWlwcy1jcHU9NDY1MC4gIEhhbmRsZSAtbTQ2NTAgYW5kCi0JLW5vLW00NjUwLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBNSVBTIG9wdGlvbnMuCi0KLVNhdCBKYW4gMTQgMjM6NDg6MTMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAam9ubnk+Ci0KLQkqIGNvbmZpZy90Yy13NjUuYywgY29uZmlnL3RjLXc2NS5oLCBjb25maWcvdzY1Lm10OiBOZXdmaWxlcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBDb3BlIHdpdGggdzY1LgotCSogY29uZmlndXJlLCBjb25maWd1cmUuaW46IFJlY29nbml6ZSB3NjUuCi0KLVRodSBKYW4gMTIgMTc6NTY6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcikgW19fR05VQ19fICYmIF9fT1BUSU1JWkVfX106IElmIGBnZXQnCi0JZnVuY3Rpb24gaXMgc2NydWJfZnJvbV9maWxlLCBjYWxsIHNjcnViX2Zyb21fZmlsZSBkaXJlY3RseSwgYW5kCi0JZ2V0IGdjYydzIGlubGluaW5nIGNhcGFiaWxpdHkgaW50byB0aGUgYWN0LgotCi0JKiBNYWtlZmlsZS5pbiAoVk1TX09USEVSX09CSlMpOiBBZGQgLi4vbGliaWJlcnR5L2hleC5vLgotCShPQkpTKTogRGVsZXRlIGhleC12YWx1ZS5vLgotCShSRUFMX1NPVVJDRVMpOiBEZWxldGUgaGV4LXZhbHVlLmMuCi0JKGhleC12YWx1ZS5vKTogRGVsZXRlIGRlcGVuZGVuY2llcy4KLQkqIGhleC12YWx1ZS5jOiBEZWxldGVkLgotCSogYXMuYyAobWFpbik6IENhbGwgaGV4X2luaXQuCi0JKiBleHByLmMsIGNvbmZpZy90Yy1taXBzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguICBSZXBsYWNlCi0JaGV4X3ZhbHVlIGFycmF5IHJlZmVyZW5jZXMgd2l0aCBoZXhfKiBtYWNyb3MuCi0KLVdlZCBKYW4gMTEgMTc6NTE6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmggKENPRkZfRkxBR1MpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoQ09GRl9GTEFHUyksIGNvbmZpZy90Yy1zaC5oIChDT0ZGX0ZMQUdTKSwKLQljb25maWcvdGMtejhrLmggKENPRkZfRkxBR1MpOiBEaXR0by4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKEtFRVBfUkVMT0NfSU5GTyk6IE1ha2Ugc3VyZSBpdCdzIGFsd2F5cwotCWRlZmluZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2VzIEFPRkYgYW5kIEFJTkRFWCk6IERvbid0Ci0JZ2VuZXJhdGUgNjgwMjAgYWRkcmVzc2luZyBtb2RlcyBmb3IgYSA2ODAwMCBwcm9jZXNzb3IuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBjYXNlcyBQQ1JFTCBhbmQgUENMRUEpOiBEaXR0by4KLQotVHVlIEphbiAxMCAxMzozNDoxNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCB0cmVhdCBoODMwMCBhbmQgejhrCi0Jc3BlY2lhbGx5IHdpdGggcmVnYXJkIHRvIGZpeHVwcy4KLQotTW9uIEphbiAgOSAxNjoyMjoyOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChSRUxBWF9SRUxPQzEsIFJFTEFYX1JFTE9DMik6IENhc3QgdmFsdWVzIHRvCi0JYmZkX3ZtYSBiZWZvcmUgc3VidHJhY3RpbmcuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzaXplX3NlY3Rpb24pOiBIYW5kbGUgcnNfc3BhY2UgbGlrZSByc19maWxsLAotCWJ1dCBtYWtlIHN1cmUgZnJfc3ltYm9sIGlzIG51bGwuCi0JKGZpbGxfc2VjdGlvbik6IERpdHRvLgotCi1TdW4gSmFuICA4IDE2OjE0OjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZpeCBoYW5kbGluZyBvZiBmbG9hdGluZyBwb2ludAotCXZhbHVlcyB3aGVuIEdQT1BUIGlzIG5vdCBkZWZpbmVkLgotCi1GcmkgSmFuICA2IDE2OjU5OjQxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhc3AuYzogSW5jbHVkZSBzdHJpbmcuaC4gIFB1dCBjb25maWcuaCBiZWZvcmUgb3RoZXIgaW5jbHVkZXMuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IERlbGF5IGNhbGxzIHRvIGVtaXRfYWRkNjQgdW50aWwKLQlhZnRlciBhbnkgcmVtYWluaW5nIG9wZXJhbmRzIGFyZSBhbHNvIGtub3duIHRvIG1hdGNoLgotCi1GcmkgRGVjIDMwIDE4OjIxOjQxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBCdWlsZCBhIGZvcm1hdCBzdHJpbmcgYmFzZWQgb24KLQl0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgdG8gYmUgcHJpbnRlZCwgYXMgbG9uZyBhcyAidW5zaWduZWQgbG9uZyIgaXMKLQlhdCBsZWFzdCBhcyB3aWRlLCBhZnRlciBoYW5kbGluZyB0aGUgc3BlY2lhbCBjYXNlIG9mIDQtYnl0ZQotCXZhbHVlcy4KLQotCSogTWFrZWZpbGUuaW4gKGRlcGVuZGVuY2llcyk6IE1ha2UgJChPQkpTKSBkZXBlbmQgb24gYXMuaCBhbmQKLQlldmVyeXRoaW5nIGl0IGluY2x1ZGVzLiAgRGVsZXRlIHRob3NlIGZpbGVzIGZyb20gcGVyLWZpbGUKLQlkZXBlbmRlbmNpZXMuCi0KLQkqIGFzLmggKHJlbGF4X3N1YnN0YXRlVCk6IE5vdyBkZWZpbmVkIHRvIGJlIHVuc2lnbmVkIGludC4KLQkocmVsYXhfc3RhdGVUKTogU2VwYXJhdGUgdHlwZWRlZiBmcm9tIGVudW0gZGVmaW5pdGlvbi4KLQkoZW51bSBfcmVsYXhfc3RhdGUpOiBSZW9yZGVyZWQgZm9yIGJldHRlciBwdW5jdHVhdGlvbi4gIEFkZGVkIG5ldwotCXZhbHVlcyByc19hbGlnbl9jb2RlIGFuZCByc19zcGFjZS4KLQkobGluZW5vLCBzdHJ1Y3QgbGluZW5vX3N0cnVjdCk6IFVudXNlZCwgZGVsZXRlZC4KLQotCSogYXMuaDogTm8gbG9uZ2VyIGluY2x1ZGUgYXNzZXJ0LmguCi0JKGFzX2Fzc2VydCk6IERlY2xhcmUuCi0JKGFzc2VydCk6IE5ldyBkZWZpbml0aW9uLCBjYWxscyBhc19hc3NlcnQgbG9uZ2VyIG5lZWRlZC4KLQkoX19QUkVUVFlfRlVOQ1RJT05fXyk6IFByb3ZpZGUgZGVmYXVsdCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgZ2NjLgotCSogbWVzc2FnZXMuYyAoYXNfYXNzZXJ0KTogTmV3IGZ1bmN0aW9uLgotCSogZ2RiaW5pdC5pbjogUHV0IGEgYnJlYWtwb2ludCB0aGVyZS4KLQotCSogcmVhZC5jIChzX3NwYWNlKTogUmV3cml0ZSB0byBoYW5kbGUgZ2VuZXJhbCBleHByZXNzaW9ucy4KLQlHZW5lcmF0ZSByc19zcGFjZSBmcmFncyBmb3Igbm9uLWNvbnN0YW50IHZhbHVlcy4KLQkqIHdyaXRlLmMgKGN2dF9mcmFnX3RvX2ZpbGwpOiBUcmVhdCByc19hbGlnbl9jb2RlIGFuZCByc19zcGFjZQotCWxpa2UgcnNfYWxpZ24gYW5kIHJzX29yZy4gIFZlcmlmeSB0aGF0IGZyX29mZnNldCBpcyBub24tbmVnYXRpdmUsCi0JYW5kIGZvcmNlIGZyYWcgdHlwZSB0byByc19maWxsIG9ubHkgYWZ0ZXIgYXNzZXJ0aW9uIGNoZWNrcy4KLQkocmVsYXhfc2VnbWVudCk6IFRyZWF0IHJzX2FsaWduX2NvZGUgbGlrZSByc19hbGlnbi4gIFRyZWF0Ci0JcnNfc3BhY2UgbGlrZSByc19vcmcgaW4gdGhlIGZpcnN0IHN3aXRjaDsgaW4gdGhlIHNlY29uZCwgZm9yY2UgdGhlCi0Jb3BlcmFuZCB0byBhIGNvbnN0YW50LCBhbmQgdXNlIGl0IGZvciB0aGUgZ3Jvd3RoIHNpemUuCi0KLVdlZCBEZWMgMjggMjA6NTc6MzcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlKTogRm9yIHNlY3Rpb25zIHdpdGggdGhlIFpFUk8KLQlhdHRyaWJ1dGUsIHNldCB0aGUgImJzcyIgZmllbGQgaW4gdGhlIGFwcHJvcHJpYXRlIHNlZ2luZm8gc3RydWN0dXJlLgotCi1XZWQgRGVjIDI4IDE1OjAxOjAxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIHN1YnNlZ3MuaDogSW5jbHVkZSBvYnN0YWNrLmguCi0KLVR1ZSBEZWMgMjcgMTg6MTY6MDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBFbmFibGUgYWxpZ24qIGNvbXBvbmVudHMgbm93LgotCi1UdWUgRGVjIDIwIDE0OjU2OjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmMgKGZyYWdfaW5pdCk6IENhbGwgb2JzdGFja19iZWdpbiBvbiBgZnJhZ3MnLgotCSogc3Vic2Vncy5jIChzdWJzZWdzX2JlZ2luKTogRG9uJ3QgZG8gaXQgaGVyZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGZyYWdfaW5pdCBiZWZvcmUgc3Vic2Vnc19iZWdpbi4KLQotCSogZnJhZ3MuYyAoZnJhZ19hcHBlbmRfMV9jaGFyKTogTmV3IGZ1bmN0aW9uLgotCSogZnJhZ3MuaCAoZnJhZ19hcHBlbmRfMV9jaGFyKTogRGVjbGFyZSBpdC4KLQkoRlJBR19BUFBFTkRfMV9DSEFSKTogQ2FsbCBpdC4gIE9sZCBkZWZpbml0aW9uIGlzIGNvbW1lbnRlZCBvdXQKLQlmb3Igbm93LgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IEFkZGVkIChidXQgY29tbWVudGVkIG91dCkgbmV3IGZpZWxkcyBmb3IKLQl0cmFja2luZyBjdXJyZW50IGFsaWdubWVudC4KLQkoZnJhZ19ub3dfZml4KTogQ2hhbmdlZCBtYWNybyB0byBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQkqIGZyYWdzLmMgKGZyYWdfbm93X2ZpeCk6IERlZmluZSBmdW5jdGlvbiBoZXJlLgotCShmcmFnX25ldyk6IFVzZSBpdCBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBgZnJhZ3MnIGRpcmVjdGx5LgotCSogZnJhZ3MuaCAoZnJhZ3MpOiBDaGFuZ2UgY29tbWVudCB0byBpbmRpY2F0ZSBpdCBzaG91bGRuJ3QgYmUKLQlhY2Nlc3NlZCBkaXJlY3RseS4KLQkqIHN1YnNlZ3MuaCAoc3RydWN0IGZyY2hhaW4pOiBOZXcgZmllbGQgZnJjaF9vYnN0YWNrLCBpbnRlbmRlZCB0bwotCWV2ZW50dWFsbHkgcmVwbGFjZSBnbG9iYWwgYGZyYWdzJyBvYnN0YWNrLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBVc2UgZnJhZ19ub3dfZml4IGluc3RlYWQgb2YKLQlhY2Nlc3NpbmcgYGZyYWdzJyBkaXJlY3RseS4gIEluaXRpYWxpemUgZmllbGRzIG9mIG5ldyBmcmNoYWluUwotCWV4cGxpY2l0bHkgaW5zdGVhZCBvZiB3aXRoIG1lbXNldC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9sbikgWyFCRkRfQVNTRU1CTEVSXTogVXNlCi0JZnJhZ19ub3dfZml4LgotCSogY29uZmlnL3RjLW1pcHMuYyAoc19sb2MpLCBjb25maWcvb2JqLXZtcy5jCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZiksIHN5bWJvbHMuYyAoY29sb24pOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBVc2Ugb2Zmc2V0VCBhbmQgYWRkcmVzc1QKLQlpbnN0ZWFkIG9mIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcuCi0JKG1kX2FwcGx5X2ZpeCk6IENhc3QgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oLCBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1lbGYuaCwKLQljb25maWcvb2JqLXNvbS5oLCBjb25maWcvdGMtaDg1MDAuYywgY29uZmlnL3RjLWhwcGEuYywKLQljb25maWcvdGMtaHBwYS5oLCBjb25maWcvdGMtc2guYywgY29uZmlnL3RjLXo4ay5jOiBEb24ndCByZWx5IG9uCi0JdXNlIG9mICIuLiIgd2hlbiBpbmNsdWRpbmcgaGVhZGVyIGZpbGVzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFJlZm9ybWF0IGNvbmRpdGlvbiBpbiBhbiBgaWYnCi0Jc3RhdGVtZW50LgotCi0JKiBNYWtlZmlsZS5pbiAoU1VCRElSX0lOQ0xVREVTKTogRGVsZXRlZC4KLQotVHVlIERlYyAyMCAxMzo0MDozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5oOiBJbmNsdWRlIGJmZC9saWJjb2ZmLmgsIG5vdCBsaWJjb2ZmLmguCi0KLU1vbiBEZWMgMTkgMTY6NTM6MzYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChsb2FkX3JlZ2lzdGVyKTogUmV3cml0ZSB0byBoYW5kbGUgT19iaWcgNjQgYml0Ci0JY29uc3RhbnRzLgotCShtaXBzX2lwKTogQWNjZXB0IE9fYmlnIGNvbnN0YW50cyBpbiBjYXNlICdJJy4gIENoYW5nZSBjYXNlCi0JJ2knLydqJyB0byB0cmVhdCBhbiBPX2JpZyBjb25zdGFudCBhcyBhbiBvdXQgb2YgcmFuZ2UgdmFsdWUuCi0KLU1vbiBEZWMgMTkgMTQ6MTU6MDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3N1YnNwYWNlKTogTWFrZSBzdXJlIFNFQ19IQVNfQ09OVEVOVFMgaXMKLQljbGVhciBmb3IgYSBzZWN0aW9uIHdpdGggdGhlICJaRVJPIiBhdHRyaWJ1dGUuCi0KLQkqIFJlZHVjZSB1c2VsZXNzIHN5bWJvbHMgZm9yIEVMRiBpbiBhbiBhdHRlbXB0IHRvIG1ha2Ugc21hbGxlcgotCW9iamVjdHMgYW5kIHNwZWVkIHVwIHRoZSBsaW5rZXIuCi0JKiBjb25maWcvdGMtaHBwYS5jIChzdHJ1Y3QgY2FsbF9pbmZvKTogUmVwbGFjZSBlbmRfc3ltYm9sIGZpZWxkCi0Jd2l0aCBhIHNpemUgZmllbGQuCi0JKGhwcGFfZWxmX21hcmtfZW5kX2Z1bmN0aW9uKTogRGVsZXRlIHVubmVlZGVkIGZ1bmN0aW9uLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBGb3IgdGhlIDJuZCB1bndpbmQgcmVsb2NhdGlvbiwgdXNlCi0JdGhlIGZ1bmN0aW9uIHN5bWJvbCArIGZ1bmN0aW9uIHNpemUgaW5zdGVhZCBvZiBhIHNwZWNpYWwgc3ltYm9sCi0JZm9yIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgotCShwcm9jZXNzX2V4aXQpOiBDb21wdXRlIHRoZSBmdW5jdGlvbiBzaXplIGhlcmUuICBEb24ndCBjYWxsCi0JaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gYW55bW9yZS4KLQkocGFfcHJvY2VuZCk6IExpa2V3aXNlLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogT25seSByZWplY3QgMzJiaXQgcmVsb2NhdGlvbnMgZm9yIFNPTS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IFNpbXBsaWZ5LgotCi1Nb24gRGVjIDE5IDEzOjQ5OjA3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG1pcHMtc29ueS1ic2QgYW5kIG1pcHMtZGVjLWJzZCwgYnV0Ci0JcmVqZWN0IG90aGVyIHZlbmRvcnMgdW50aWwgd2UgY2FuIGJlIHN1cmUgd2UncmUgY29uc2lzdGVudCB3aXRoCi0JYmZkLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDcmVhdGVfVk1TX09iamVjdF9GaWxlKTogSW5zdGVhZCBvZiBmb3JtYXR0aW5nCi0JYSBidWZmZXIgdG8gcGFzcyB0byBgZXJyb3InLCBqdXN0IGNhbGwgYGFzX2ZhdGFsJyBkaXJlY3RseS4KLQkoVk1TX1BzZWN0X1NwZWMpOiBEaXR0by4KLQkoVk1TX1RCVF9Nb2R1bGVfQmVnaW4sIFZNU19UQlRfU291cmNlX0ZpbGUsIGdlbjEsCi0JVk1TX3R5cGVkZWZfcGFyc2UsIFZNU19MU1lNX1BhcnNlLCBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMpOiBDYWxsCi0JYXNfdHNrdHNrIGluc3RlYWQgb2YgcHJpbnRmLgotCShWTVNfVEJUX01vZHVsZV9CZWdpbiwgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uLAotCVZNU19UQlRfU291cmNlX0ZpbGUsIFZNU19UQlRfU291cmNlX0xpbmVzLAotCVZNU19TdG9yZV9SZXBlYXRlZF9EYXRhLCBWTVNfQ2hlY2tfRm9yX01haW4pOiBVc2UgZXhwbGljaXQKLQlpbnRlZ2VycyByYXRoZXIgdGhhbiBzaXplb2YgZXhwcmVzc2lvbnMgdXNpbmcgYmFzaWMgaW50ZWdlciB0eXBlcywKLQlpbiBjYXNlIGhvc3QgYW5kIHRhcmdldCBhcmVuJ3QgdGhlIHNhbWUuICBVc2UgbWVtY3B5IG9yIENPUFlfKgotCW1hY3JvcyBpbnN0ZWFkIG9mIHBvc3NpYmx5IHVuYWxpZ25lZCB3b3JkIG9yIGxvbmd3b3JkIGFzc2lnbm1lbnQuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKE9CSl9TWU1GSUVMRF9UWVBFKTogTmV3IG1hY3JvLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX1N0b3JlX1BJQ19TeW1ib2xfUmVmZXJlbmNlLAotCVZNU19DaGVja19Gb3JfTWFpbiwgVk1TX3dyaXRlX29iamVjdF9maWxlKTogVXNlIHN5X29iaiBpbnN0ZWFkIG9mCi0JZm9yY2luZyBzeV9udW1iZXIgdG8gaG9sZCBhIHBvaW50ZXIuCi0KLUZyaSBEZWMgMTYgMTQ6NDA6MTYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogRG9uJ3QgZmlsbCBpbiBtZF9yZWxheF90YWJsZSBoZXJlLgotCShtZF9yZWxheF90YWJsZSk6IFVzZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwYXJzZV9leHAsIGdldF9vcGVyYW5kcywgY2xldmVyX21lc3NhZ2UsCi0JbWRfYXNzZW1ibGUsIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgbWRfdW5kZWZpbmVkX3N5bWJvbCwKLQl0Y19oZWFkZXJzX2hvb2ssIG1kX29wZXJhbmQsIG1kX251bWJlcl90b19jaGFycyk6IERvbid0IHVzZSBERUZVTi4KLQotCSogTWFrZWZpbGUuaW4gKENIRUNLRkxBR1MpOiBEb24ndCBwYXNzIEFTX0ZPUl9UQVJHRVQsCi0JQ0NfRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VULCBOTV9GT1JfVEFSR0VUOyB0aGV5J3JlIG5vdAotCXVzZWQuCi0JKEFTX0ZPUl9UQVJHRVQsIENDX0ZPUl9UQVJHRVQsIE9CSkRVTVAsIE9CSkRVTVBfRk9SX1RBUkdFVCwgTk0sCi0JTk1fRk9SX1RBUkdFVCk6IERvbid0IGRlZmluZS4KLQkoVk1TX09USEVSX09CSlMpOiBBZGQgeG1hbGxvYy5vIGFuZCB4ZXhpdC5vIGZyb20gbGliaWJlcnR5LgotCSh0b29sZGlyKTogVXNlIGV4ZWNfcHJlZml4LCBub3QgbGliZGlyLgotCi1GcmkgRGVjIDE2IDExOjA3OjEwIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IEluY2x1ZGUgbGliY29mZi5oLCBub3QgLi4vYmZkL2xpYmNvZmYuaC4KLQotCSogYXMuaDogSW5jbHVkZSBwcm9ncmVzcy5oLgotCSogYXMuYyAobWFpbik6IENhbGwgU1RBUlRfUFJPR1JFU1MgYW5kIEVORF9QUk9HUkVTUy4KLQkobWFpbiwgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ2FsbCBQUk9HUkVTUy4KLQotRnJpIERlYyAxNiAwMDo0NjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGJmZF9pc191bmRfc2VjdGlvbiBhbmQKLQliZmRfaXNfYWJzX3NlY3Rpb24gcmF0aGVyIHRoYW4gY29tcGFyaW5nIGFnYWluc3QgJmJmZF91bmRfc2VjdGlvbgotCWFuZCAmYmZkX2Fic19zZWN0aW9uLgotCi1UaHUgRGVjIDE1IDE1OjI3OjE0IDE5OTQgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2JlZ2luKTogVXNlIGEgbG9jYWwgdmFyaWFibGUgd2hlbgotCWluaXRpYWxpemluZyBtZF9yZWxheF90YWJsZSB0byBhdm9pZCBlcnJvcnMgYWJvdXQgbW9kaWZ5aW5nIGEKLQljb25zdCBkYXRhIHN0cnVjdHVyZS4KLQotVHVlIERlYyAxMyAxNTo0MjoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAodGNfZ2VuX3JlbG9jKTogUmVtb3ZlIE9CSl9FTEYgaGFjayB3aGljaAotCWFwcGVhcnMgdG8gbm8gbG9uZ2VyIGJlIG5lZWRlZC4KLQotVHVlIERlYyAxMyAwODowNDoxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogQWNjZXB0IEJGRF9SRUxPQ19QQ1JFTCogd2l0aG91dAotCXJlcXVpcmluZyB0aGF0IHRoZSBYX29wX3N5bWJvbCBiZSBpbiB0aGUgdGV4dF9zZWN0aW9uLgotCShtYWNybyk6IENoYW5nZSB0aGUgdGVzdCBmb3IgYSBsZWdlbCBleHByZXNzaW9uIGRpZmZlcmVuY2UgdG8KLQljb3JyZXNwb25kIHRvIGNoYW5nZXMgaW4gcHNldWRvX3NldCBpbiByZWFkLmMuCi0KLUZyaSBEZWMgIDkgMjE6MDQ6MTcgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKSBbUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFXTogVXNlCi0JYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4KLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogSWYgdGhlcmUgaXMgbm8gY3VycmVudAotCXJvdXRpbmUsIGp1c3QgcmV0dXJuLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfaXAsIGNhc2UgJ0InLCBzdWJjYXNlICdjJyk6IFVzZSBvcGNvZGUKLQl2YWx1ZSBmcm9tIHBhdHRlcm4gaW5zdGVhZCBvZiBhc3N1bWluZyBqc3IuCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGptcCk6IEFkZCBhICIxLEJjIiBmb3JtLgotCi1UaHUgRGVjICA4IDE3OjQ4OjI1IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChOTV9GT1JfVEFSR0VUKTogVXNlIC4uL2JpbnV0aWxzL25tLm5ldywgbm90IGp1c3QKLQlwbGFpbiBubS4KLQotCSogY29uZmlndXJlLmluIChuczMyay1wYzUzMi1tYWNoKik6IFNlbGVjdCBjb3JyZWN0IGVtdWxhdGlvbi4KLQkobWlwcy1zb255LWJzZCopOiBVc2UgZWNvZmYuCi0JKG1pcHMtKi1nbnUqKTogTmV3IHRhcmdldCwgdXNpbmcgYW91dCBmb3JtYXQsIGZyb20gUm9sYW5kIE1jR3JhdGguCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDI5IDEzOjU4OjEwIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlVc2UgbGliaWJlcnR5IHZlcnNpb24gb2YgeG1hbGxvYzoKLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMpOiBEZWxldGUgeG1hbGxvYy5jLgotCShPQkpTKTogRGVsZXRlIHhtYWxsb2Muby4KLQkoeG1hbGxvYy5vKTogRGVsZXRlIGRlcGVuZGVuY2llcy4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSBvbmNlIHByb2dyYW0gbmFtZSBpcwotCWtub3duLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoaW5fcmFuZ2Vfc2lnbmVkLCBpbl9yYW5nZV91bnNpZ25lZCk6IE5ldwotCXJvdXRpbmVzLCBzcGxpdCBmcm9tIGluX3JhbmdlLgotCShpbl9yYW5nZSk6IERlbGV0ZWQuICBBbGwgY2FsbHMgY2hhbmdlZCB0byBpbl9yYW5nZV8qc2lnbmVkLgotCShjcmVhdGVfbGl0YV9zZWN0aW9uKTogTWFjcm8gZGVsZXRlZC4gIFNpbmdsZSB1c2UgZXhwYW5kZWQgaW4KLQlwbGFjZS4KLQkoYWxwaGFfaXApOiBIYW5kbGUgYHQnIGFuZCBgOCcgb3BlcmFuZCB0eXBlcy4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ18xMl9QQ1JFTC4gIFByaW50IG5hbWUgb2YKLQl1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlcy4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogQWRkZWQgSEFMVCBhbmQgRFJBSU5BLiAgRGlzYWJsZWQgTU9WSSwKLQlzaW5jZSBpdCBkb2Vzbid0IHdvcmssIGFuZCBpc24ndCBzdXBwb3J0ZWQgYnkgdGhlIG5hdGl2ZQotCWFzc2VtYmxlci4KLQotCSogaW5wdXQtc2NydWIuYzogQ2hhbmdlIHdvcmRpbmcgb2YgYSBjb21tZW50IHRvIGF2b2lkIGludGVyZmVyZW5jZQotCXdpdGggQ3lnbnVzIHNvdXJjZS1jb250cm9sIHRvb2xzLgotCi0JKiBhcy5oIChlcnJubykgW05FRURfREVDTEFSQVRJT05fRVJSTk9dOiBEZWNsYXJlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogTGlzdCBidXNjciBhbmQgcGNyIGNvbnRyb2wKLQlyZWdpc3RlcnMuCi0JKG02OGtfaXAsIGNhc2UgJ0onKTogSGFuZGxlIHRoZW0uCi0KLQlEZWxldGUgc2lnbmFsIGhhbmRsZXIgY29kZS4gIEl0J3MgYmVlbiBkaXNhYmxlZCBzaW5jZSBNYXJjaCAxOTkzCi0Jd2l0aG91dCBjb21wbGFpbnRzLgotCSogYXMuYzogRG9uJ3QgaW5jbHVkZSBzaWduYWwuaC4KLQkoZ290X3NpZyk6IFVudXNlZCBmdW5jdGlvbiBkZWxldGVkLCBkZWNsYXJhdGlvbiBkZWxldGVkLgotCShTSUdUWSk6IE1hY3JvIGRlbGV0ZWQuCi0JKG1haW4pOiBEZWxldGVkIGRpc2FibGVkIGNvZGUgZm9yIGVzdGFibGlzaGluZyBzaWduYWwgaGFuZGxlci4KLQotTW9uIE5vdiAyOCAxMTozNzozNSAxOTk0ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSW5zZXJ0IG1pc3NpbmcgbmV3bGluZSBhdCBlbmQgb2YgZmlsZQotCWxpa2Ugd2FybmluZyBzYXlzIHdlIGRvLgotCi1Nb24gTm92IDI4IDAwOjExOjE1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChwYV9jaGVja19lb2YpOiBEZWNsYXJlIG5ldyBleHRlcm4gZnVuY3Rpb24uCi0JKHRjX2Zyb2JfZmlsZSk6IERlZmluZSB0byBjYWxsIHBhX2NoZWNrX2VvZi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UpOiBOZXcKLQlmdW5jdGlvbiB0byB2ZXJpZnkgdGhlIGN1cnJlbnQgc3BhY2UgYW5kIHN1YnNwYWNlIGFyZSByZWFzb25hYmxlLgotCUNhbGwgZm9yIHRoZSBhcHByb3ByaWF0ZSBwc2V1ZG8tb3BzIGFuZCBiZWZvcmUgaW5zdHJ1Y3Rpb24gcGFyc2luZy4KLQkocGFfY2hlY2tfZW9mKTogTmV3IGZ1bmN0aW9uIHRvIHZlcmlmeSBlbnRlci9leGl0IGFuZCBwcm9jL3Byb2NlbmQKLQlwYWlycyBtYXRjaCBhdCBFT0YuCi0JKHBhX2NvZGUpOiBTaW1wbGlmeS4KLQotCSogY29uZmlnL29iai1zb20uYzogRGVsZXRlICNpZiAwIGNvZGUuCi0KLVdlZCBOb3YgMjMgMTk6MzY6MDkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFRBUkdFVF9GT1JNQVQpOiBTZWxlY3QgYmV0d2VlbiBjb2ZmLXNobCBhbmQKLQljb2ZmLXNoLgotCSogY29uZmlnL3NoLm1oIChUQVJHX0NQVV9ERVBFTkRFTlRTKTogR2V0IGl0IHJpZ2h0LgotCSogY29uZmlnL3RjLXNoLmMgIChsaXR0bGUpOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BhcnNlX29wdGlvbik6IE5vdGljZSBuZXcgb3B0aW9uLgotCShidWlsZF9yZWxheCwgYnVpbGRfTXl0ZXMsIG1kX2F0b2YsIG1kX2NvbnZlcnRfZnJhZywgbWRfYXBwbHlfZml4KToKLQlDb3BlIHdpdGggbGl0dGxlIGVuZGlhbiBkYXRhLgotCSogY29uZmlnL3RjLXNoLmggKENPRkZfTUFHSUMsIExJU1RJTkdfSEVBREVSKTogRW5kaWFuIGRlcGVuZGVudC4KLQotV2VkIE5vdiAyMyAxMDo1NDozOCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jLCBFTEYgdmFyaWFudCk6IFJldmVydCBsYXN0Ci0JY2hhbmdlLiAgVGhlIHJlYWwgYnVnIHdhcyBpbiBiZmQvZWxmY29kZS5oIGFuZCBoYXMgYmVlbiBmaXhlZC4KLQotVHVlIE5vdiAyMiAyMzozMToyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jLCBFTEYgdmFyaWFudCk6IEFkZCBzZWN0aW9uLT52bWEKLQl0byB0aGUgcmVsb2NhdGlvbidzIG9mZnNldC4KLQotVHVlIE5vdiAyMiAxNDozNzo1OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9YRk9STSk6IEZpeCB0eXBvLgotCi1UdWUgTm92IDIyIDEwOjIzOjI1IDE5OTQgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfc2V0KTogSWdub3JlIHRoZSAuc2V0IChubyltb3ZlIGFuZAotCSAgLnNldCAobm8pdm9sYXRpbGUgZGlyZWN0aXZlcy4KLQotVHVlIE5vdiAxNSAyMTo0NDoxMyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2UpOiBNYWtlIHN1cmUgdG8gYWx3YXlzIHJlc2V0Ci0JY3VycmVudF9zdWJzcGFjZS4KLQkocGFfdGV4dCwgcGFfZGF0YSk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9hbGlnbik6IE5ldyBmdW5jdGlvbi4gIEFsaWducyB0aGUgY3VycmVudAotCW9mZnNldCB3aXRoaW4gdGhlIGN1cnJlbnQgc3Vic3BhY2UgYWxvbmcgd2l0aCB1cGRhdGluZyB0aGUKLQlhbGlnbm1lbnQgb2YgdGhlIHN1YnNwYWNlIGl0c2VsZi4KLQkocGFfc3Vic3BhY2UpOiBEZWZhdWx0IGFsaWdubWVudCB0byBvbmUgYnl0ZSByYXRoZXJuIHRoYW4gemVybwotCWJ5dGVzIHRvIGF2b2lkIHNldHRpbmcgYWxpZ25tZW50IHRvIGxvZzIoMCkuCi0JKG1kX3BzZXVkb190YWJsZSk6IFVzZSBwYV9hbGlnbm1lbnQgZm9yIC5hbGlnbi4KLQotVHVlIE5vdiAxNSAxNToyNDo0NSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IEFsd2F5cyBwdXQgYSBzcGFjZSBhZnRlciAiZmF0YWwgZXJyb3I6IgotCXdoZW4gcHJpbnRpbmcgbWVzc2FnZS4KLQotVHVlIE5vdiAxNSAxMToxMDo0MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuaCAob2JqX2Zyb2Jfc3ltYm9sKTogRGVsZXRlLgotCSh0Y19mcm9iX3N5bWJvbCk6IE1ha2UgZGVmaW5pdGlvbiBjb25kaXRpb25hbCBvbiBPQkpfU09NIG9yCi0JT0JKX0VMRi4gIEZvciBFTEYgc3VidHJhY3Qgb3V0IHN5bWJvbC0+c2VjdGlvbi0+dm1hIGZvciBub24gY29tbW9uCi0Jc3ltYm9scy4KLQotV2VkIE5vdiAgOSAxNDo1MzowMyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGUtZGVsdGEuaDogTmV3IGZpbGUsIGRlcml2ZWQgZnJvbSB0ZS1zeXN2MzIuaC4KLQotV2VkIE5vdiAgOSAxMTo1Mjo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2JmKTogQWx3YXlzIHNldCBjb2ZmX2xpbmVfYmFzZS4KLQotTW9uIE5vdiAgNyAwMTo1ODo0OSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEJ1bXAgdG8gMi41LjMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ29tcGFyZSBnZW5lcmljIGNwdSBuYW1lIGFnYWluc3QgInNwYXJjIiwgbm90Ci0JInNwYXJjKiIsIHNpbmNlIHNwYXJjIHZhcmlhbnRzIHNob3VsZCBiZSBjaGFuZ2VkIHRvICJzcGFyYyIuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi4xLgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChvY3RhbCwgdG9IZXgpOiBWYXJpYWJsZXMgZGVsZXRlZC4KLQkoaXNvY3RhbCk6IE1hY3JvIGRlbGV0ZWQuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSB0aGVtLgotCShtYWNoaW5lX2lwLCBjYXNlICdQJy8nQScpOiBGb3IgYWJzb2x1dGUgb3BlcmFuZCwgZ2VuZXJhdGUgYW4KLQllcnJvciBtZXNzYWdlIGlmIGl0J3Mgb3V0IG9mIHJhbmdlLgotCShtZF9hcHBseV9maXgsIGNhc2UgUkVMT0NfSlVNUFRBUkcpOiBDaGVjayByYW5nZSBmb3IgUEMtcmVsYXRpdmUKLQlqdW1wcy4KLQkobWRfYXBwbHlfZml4KTogRGVsZXRlIGNvZGUgaW5zaWRlICIjaWYgMCIuCi0KLVRodSBOb3YgIDMgMjA6MjA6NDAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2dvMzIubWg6IFVudXNlZCBmaWxlIGRlbGV0ZWQuCi0KLQkqIHJlYWQuYyAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBJbmRpY2F0ZSB0aGF0IHRoZSBlcnJvciBtYXkKLQltZXJlbHkgYmUgdGhhdCB0aGUgZXhwcmVzc2lvbiBjYW4ndCBjdXJyZW50bHkgYmUgcmVkdWNlZC4KLQotVGh1IE5vdiAgMyAxNjowOTo1OSAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBURV9OZXRCU0QgZGVmaW5lIGFzCi0JICAiYS5vdXQtbTY4ay1uZXRic2QiLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBJZiBURV9OZXRCU0QgZGVmaW5lIGFzCi0JICAiYS5vdXQtc3BhcmMtbmV0YnNkIi4KLQotCSogY29uZmlnL3RlLW5ic2QuaDogTmV3IGZpbGUsIE5ldEJTRCB0YXJnZXQgZW11bGF0aW9uCi0JKiBjb25maWcvdGUtbmV0YnNkLmg6IFJlbW92ZWQuCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbmV0YnNkKixtNjgqLSotbmV0YnNkKixzcGFyYyotKi1uZXRic2QqKToKLQkgIFNldCBiZmRfZ2FzLiAgVXNlIG5ic2QgZW11bGF0aW9uLgotCi1UaHUgTm92ICAzIDE3OjQ0OjQ3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlDaGFuZ2VzIGZyb20gbmV0IDIuNS4yIHJlbGVhc2UgYnJhbmNoOgotCi0JKiBjb25maWd1cmUuaW46IFB1dCBBQ19ERUZJTkUoc3BhcmN2OSkgb24gaXRzIG93biBsaW5lLCBzbyB0aGF0Ci0JdGhlIHNoZWxsIHZhcmlhYmxlIHNldHRpbmdzIGFzc29jaWF0ZWQgd2l0aCBpdCBhcmUgcGVybWFuZW50LiAgRm9yCi0JQ1BVcyByZXF1aXJpbmcgYmZkX2dhcz15ZXMsIHNlbGVjdCBpdCBiYXNlZCBvbiBDUFUgb25seSwgbm90Ci0JaW5kaXZpZHVhbCB0YXJnZXQgbmFtZXMuICBIYW5kbGUgbTY4ay1ocC1ocHV4Kiwgbm90IGp1c3QgLWhwdXguCi0KLQkqIGNvbmZpZy90Yy16OGsuYyAodGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogQWRkIGR1bW15IGFyZ3VtZW50Ci0JdG8gbWF0Y2ggcHJvdG90eXBlIGluIG9iai1jb2ZmLmguCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2tpcCB0ZXN0cyBmb3IgZGVmaW5pbmcgV0FOVF9GT1BFTl9CSU4gYW5kCi0JSUJNX0NPTVBJTEVSX1NVWC4KLQkqIGFjY29uZmlnLmg6IERlbGV0ZWQgdGhlbS4KLQkqIGNvbmZpZ3VyZSwgY29uZi5pbjogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMC4KLQkqIGNvbmZpZy9nbzMyLmNmZywgY29uZmlnL3Ztcy1jb25mLmg6IFVwZGF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yLCBtZF9jb252ZXJ0X2ZyYWdfMSk6IEFsd2F5cyB1c2UKLQlJQk1fQ09NUElMRVJfU1VYIHZlcnNpb24gb2YgY29kZSwgd2l0aCBjb21tZW50cyBpbmRpY2F0aW5nIHdoeS4KLQotCSogbGlzdGluZy5jIChmaWxlX2luZm8pOiBVc2UgdGV4dCBtb2RlIHdoZW4gb3BlbmluZyBmaWxlIGZvciByZWFkLgotCVVzZSAiciIgZGlyZWN0bHksIG5vIG1hY3JvLgotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX29wZW4pOiBEb24ndCB1c2UgRk9QRU5fUlQsIGp1c3QgdXNlCi0JInIiLgotCSogcmVhZC5jIChzX2luY2x1ZGUpOiBEaXR0by4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IFRyeSBib3RoICJ3YiIgYW5kICJ3IiwgZG9uJ3QKLQlib3RoZXIgd2l0aCBGT1BFTl8qIG1hY3Jvcy4KLQkqIGFzLmg6IERvbid0IGluY2x1ZGUgZm9wZW4tKi5oLgotCi0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmg6IE1ha2UgInJldCIgd2l0aCBubyBvcGVyYW5kcyBlcXVpdmFsZW50IHRvCi0JInJldCB6ZXJvLChyYSkiLCB0byBtYXRjaCBPU0YxIGFuZCB0byBiZSBjb25zaXN0ZW50IHdpdGggYm90aAotCW9uZS1vcGVyYW5kIGZvcm1zLgotCi0JUGF0Y2hlcyBmcm9tIERKIERlbG9yaWU6Ci0JKiBhcy5oIChhbGxvY2EpOiB1bmRlZiBhbGxvY2EgYmVmb3JlIGRlZmluaW5nIGl0IGp1c3QgaW4gY2FzZQotCSogY29uZmlnL2dvMzIuY2ZnOiBuZXcgZmlsZSBmb3IgYXV0b2NvbmYgdmFsdWVzCi0JKiBjb25maWcvdGUtZ28zMi5oOiBuZXcgZmlsZQotCSogY29uZmlndXJlLmJhdDogbmV3IGZvciBhdXRvY29uZgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEZpeCB0eXBvIGluIEdPVFBDIGNoZWNrOyBoYWQgPQotCWZvciA9PS4KLQotCSogY29uZmlndXJlLmluOiBJZiB0YXJnZXRfZnJhZyBkb2Vzbid0IGV4aXN0LCB1c2UgL2Rldi9udWxsLgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogRm9yIG5vbi1WTVMgc3lzdGVtcywgcmUtYWRkIGB2JyB0bwotCXN0ZF9zaG9ydG9wdHMuICBBZGQgInZlcmJvc2UiIHRvIGxpc3Qgb2YgbG9uZyBvcHRpb25zLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFdoZW4gZ2VuZXJhdGluZyBhbiBhYnNvbHV0ZSBzZWN0aW9uCi0Jc3ltYm9sIGFzIGEgcGxhY2Vob2xkZXIsIGRvbid0IG1hcmsgaXQgYXMgdXNlZCBpbiBhIHJlbG9jYXRpb24KLQllbnRyeSwgaGVyZS4KLQotCSogTWFrZWZpbGUuaW4gKGNvbXBhcmlzb24pOiBDb21wYXJlIHVzaW5nIG1ha2VmaWxlIGNvZGUgZnJvbSBnY2MsCi0Jc3RyaXBwZWQgZG93biB0byBkaXNjYXJkIHN1YmRpciBzdHVmZiBhbmQgYWRhcHRlZCB0byBnaXZlIGEKLQlub24temVybyBleGl0IHN0YXR1cyBpZiBlaXRoZXIgZmlsZSBkaWZmZXJzLgotCi1UaHUgTm92ICAzIDE1OjQzOjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogRml4IFJFTEFYX0VOQ09ERSBhcmd1bWVudHMgZm9yCi0JTk9fUElDIGNhc2UuCi0KLVR1ZSBOb3YgIDEgMTY6MTA6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2NoYW5nZV9zZWMpOiBJZiBub3QgR1BPUFQsIGRvbid0IHBlcm1pdAotCXN3aXRjaGluZyB0byB0aGUgcmVhZG9ubHkgZGF0YSBzZWN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfdHlwZSk6IEZpeCB3YXJuaW5nIG1lc3NhZ2UuCi0KLVN1biBPY3QgMzAgMDA6NTc6MzUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3Byb2MpOiBEZWxldGUgZGlzYWJsZWQgY29kZSB0byBwdXQgZWFjaAotCXByb2MgaW4gaXRzIG93biBzdWJzcGFjZSwgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdC4KLQotVHVlIE9jdCAyNSAxNDo0NDozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRW5zdXJlIHRoYXQgbWlwczIgY2FzZSBvZiBNX0xJX0REIGluCi0JLnJkYXRhIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19jcHUpOiBJbml0aWFsaXplIHRvIC0xLgotCShtZF9iZWdpbik6IERvbid0IG1pcHNfY3B1IGlmIGl0IHdhcyBhbHJlYWR5IHNldC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRm9yIC1taXBzTiwgZG9uJ3Qgc2V0IG1pcHNfY3B1IGlmIGl0IHdhcwotCWFscmVhZHkgc2V0LiAgRm9yIC1tY3B1PSwganVzdCBzZXQgbWlwc19jcHUsIG5vdCBtaXBzX2lzYS4KLQotRnJpIE9jdCAyMSAyMDo0MjoyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IElmIE9CSl9FTEYsIGhhbmRsZSAuc2VjdGlvbi4KLQkoc19lbGZfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogRG9uJ3QgYWJvcnQgaWYgd2UgZG9uJ3QgcmVjb2duaXplCi0JdGhlIHNlY3Rpb24gd2hlbiBzZXR0aW5nIHRoZSBzdG9yYWdlIGNsYXNzOyBkZWZhdWx0IHRvIHNjX0RhdGEuCi0KLVRodSBPY3QgMjAgMDA6NDM6MzggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IFNldCBuZXdfdmFsIHRvIDggZm9yIGFsbAotCWZpeHVwcyB0byBicmFuY2ggaW5zdHJ1Y3Rpb25zIChub3QganVzdCBwYy1yZWxhdGl2ZSBvbmVzKSB3aGljaAotCXdpbGwgZ2VuZXJhdGUgU09NIHJlbG9jYXRpb25zLgotCi1XZWQgT2N0IDE5IDEzOjQxOjU2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWEyOWsuYzogSW5jbHVkZSBjdHlwZS5oIHdpdGggYW5nbGUgYnJhY2tldHMuCi0JKGRlZmluZV9zb21lX3JlZ3MpOiBBZGQgbmV3IHNwZWNpYWwgcmVnaXN0ZXIgbmFtZXMgZGVmaW5lZCBvbiB0aGUKLQkyOTA0MC4KLQkocGFyc2Vfb3BlcmFuZCk6IEFkZCBhcmd1bWVudCBvcHQuICBJZiBub24temVybywgZG9uJ3Qgd2FybiBhYm91dAotCWEgbWlzc2luZyBvcGVyYW5kLgotCShtYWNoaW5lX2lwKTogSWYgaGFuZGxpbmcgYXJndW1lbnQgdHlwZSAnSScsIHBhc3Mgb3B0IGFzIG5vbi16ZXJvCi0JdG8gcGFyc2Vfb3BlcmFuZC4gIEhhbmRsZSBuZXcgb3B0aW9uYWwgb3BlcmFuZCB0eXBlICdJJy4KLQkobWRfdW5kZWZpbmVkX3N5bWJvbCk6IEhhbmRsZSBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzIChzck5OKS4KLQotVHVlIE9jdCAxOCAwMDo0NToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHJlbnVtYmVyX3NlY3Rpb25zKTogTmV3IHN0YXRpYyBCRkRfQVNTRU1CTEVSIGZ1bmN0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgaXQgYWZ0ZXIgcmVtb3ZpbmcgZ2FzIGNyZWF0ZWQgc2VjdGlvbnMuCi0KLU1vbiBPY3QgMTcgMTg6MDY6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9jcmVhdGUpOiBVc2UgdWRhdGEucCwgbm90IGp1c3QgdWRhdGEuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWNvZmZfc2V0X2V4dCk6IExpa2V3aXNlLgotCShlbGZfZ2V0X2V4dHIpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGFzX3doZXJlIGlzCi0JdW5zaWduZWQgaW50ICosIG5vdCBpbnQgKi4KLQotTW9uIE9jdCAxNyAwMjoyNjozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogRWxpbWluYXRlIGFsbCB1c2VzIG9mIGZ4X2FkZG51bWJlci4KLQkodGNfZ2VuX3JlbG9jKTogU2ltcGxpZnkuICBJdCdzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc2V0IGEKLQlyZWxvYydzIGFkZGVuZCBmaWVsZCB0byB6ZXJvIGZvciBmdW5jdGlvbiBzeW1ib2xzLgotCShtZF9hcHBseV9maXgpOiBTaW1wbGlmeS4gIEZvciBmaXh1cHMgd2hpY2ggd2lsbCByZXF1aXJlIGEgU09NCi0JcmVsb2MsIGp1c3QgY2xlYXIgb3V0IHRoZSBuZWNlc3NhcnkgYml0cyBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUZyaSBPY3QgMTQgMTk6MDY6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEJJU09OKTogVXNlIGJpc29uIC15LCBub3QgYmlzb24uCi0KLVRodSBPY3QgMTMgMTk6MjI6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGVkIHRvIDIuNS4KLQkoY2xlYW4taGVyZSk6IERlbGV0ZSBzdGFtcC1tay5jb20uCi0JKGRpc3RjbGVhbik6IERlbGV0ZSAuZ2RiaW5pdC4KLQkqIFZlcnNpb24gMi41IHJlbGVhc2VkLgotCi1XZWQgT2N0IDEyIDIwOjMwOjUxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1uYnNkNTMyLmg6IFJlbmFtZWQgZnJvbSB0ZS1uZXRic2Q1MzIuaC4KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBBZGp1c3RlZC4KLQotV2VkIE9jdCAxMiAxNjozMzozOCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jcGx1cy1kZW0uYzogUmVtb3ZlZC4gIEl0IGlzbid0IHVzZWQuICBFdmVuIGlmIGl0IHdhcywKLQkgIGl0J3MgYmV0dGVyIHRvIHVzZSB0aGUgb25lIGluIGxpYmliZXJ0eS4KLQotV2VkIE9jdCAxMiAxODo0ODozOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fc3ltYm9sKTogVW5kbyBsYXN0Ci0JY2hhbmdlOyBpdCBicmVha3MgdGhlIHJzNjAwMCBzdXBwb3J0LCBhbmQgZG9lc24ndCBzZWVtIHRvIGJlCi0JbmVlZGVkLgotCi1XZWQgT2N0IDEyIDExOjU2OjUwIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWkzODYuaCx0ZS1uZXRic2Q1MzIuaCAoVEFSR0VUX0ZPUk1BVCk6IENoYW5nZWQgdG8KLQkgIGEub3V0LTxhcmNoPi1uZXRic2QgdG8gbWF0Y2ggY29ycmVzcG9uZGluZyBjaGFuZ2VzIGluIEJGRC4KLQotV2VkIE9jdCAxMiAxMTowNjoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2ZpeF9hZGp1c3RhYmxlKTogUmVzb2x2ZSBzeW1ib2wgdmFsdWVzCi0JcmF0aGVyIHRoYW4gZXhwbGljaXRseSBhZGRpbmcgdGhlIGZyYWcgYWRkcmVzcy4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogQWRkIGEgemVybyBlbnRyeSB0byBtYXJrCi0JdGhlIGVuZCBvZiB0aGUgbGluZSBudW1iZXJzOyB0aGlzIHJlcGxhY2VzIHRoZSB6ZXJvIGVudHJ5IHdoaWNoCi0JdXNlZCB0byBiZSBhZGRlZCBieSBjb2ZmX2FkZF9saW5lc3ltLCByZW1vdmVkIE9jdCA3LgotCShjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMpOiBJZ25vcmUgc2VjdGlvbnMgd2l0aCBubyBzZWdpbmZvLgotCi1XZWQgT2N0IDEyIDAxOjQxOjM3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBDcmVhdGUgYQotCSJzdGFnZSIgc3ltbGluayB0byB0aGUgYXBwcm9wcmlhdGUgc3RhZ2UqIGRpcmVjdG9yeSwgYW5kIHVzZSBpdAotCWluc3RlYWQgaW4gdGhlIC1CIG9wdGlvbnMuCi0JKGNvbXBhcmlzb24pOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlLgotCi1UdWUgT2N0IDExIDE2OjQ4OjExIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBGb3Igbm9uLWEub3V0IHJlbG9jYXRpb25zLCBpZgotCXBjLXJlbGF0aXZlLCB1c2UgZnhfb2Zmc2V0IG9ubHksIGlnbm9yZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24uCi0KLVR1ZSBPY3QgMTEgMTU6MjQ6MDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRG9uJ3QgdXNlIFNfSVNfTE9DQUwgd2hlbiBjaGVja2luZwotCWZvciBhbiBlbWJlZGRlZCBQSUMgc3dpdGNoIGV4cHJlc3Npb24sIHNpbmNlIHRoZSBkZWZpbml0aW9uIG9mCi0JU19JU19MT0NBTCB3YXMgY2hhbmdlZC4KLQotVHVlIE9jdCAxMSAxNTowNToxMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbXBhcmlzb24pOiBXaGVuIGNvbXBhcmluZyBhcy5uZXcgb3IgZ2FzcC5uZXcsIHRyeQotCXJ1bm5pbmcgdGhlIGJpbmFyeSB0aHJvdWdoIHNlZCB0byBhdm9pZCBkaWZmZXJlbmNlcyBkdWUgdG8KLQkic3RhZ2UxIiBvciAic3RhZ2UyIiBoYXZpbmcgYmVlbiB3cml0dGVuIGludG8gdGhlIGJpbmFyeS4KLQotU2F0IE9jdCAgOCAwMTo0ODowNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCUVMRiBzeW1ib2wgc2l6ZSBoYW5kbGluZywgYmFzZWQgb24gY29kZSBmcm9tIEVyaWMgWW91bmdkYWxlOgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBOZXcgbWFjcm8uICBBZGRzIGFuCi0JZXhwcmVzc2lvbiBwb2ludGVyIHRvIHRoZSBzeW1ib2wgc3RydWN0dXJlLCB1c2VkIGZvciBgc2l6ZScKLQlleHByZXNzaW9ucyB0aGF0IGNvdWxkbid0IGJlIHJlZHVjZWQgdG8gY29uc3RhbnRzIHdoZW4gaW5pdGlhbGx5Ci0JcHJvY2Vzc2VkLgotCShlbGZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9zeW1ib2wpOiBDYWxsIGVsZl9mcm9iX3N5bWJvbCBhbHdheXMsIHJhdGhlciB0aGFuCi0JZWNvZmZfZnJvYl9zeW1ib2wgb25seSBpZiBFQ09GRl9ERUJVR0dJTkcgZGVmaW5lZC4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWxldGVkIHVudXNlZCBjb2RlLgotCUNsZWFyIHN5X29iaiBmaWVsZC4KLQkob2JqX2VsZl9zaXplKTogRGVsZXRlZCB1bnVzZWQgY29kZS4gIElmIHNpemUgaXMgbm9uLXJlZHVjaWJsZQotCWV4cHJlc3Npb24sIGFsbG9jYXRlIHNvbWUgc3RvcmFnZSBmb3IgdGhlIHN5X29iaiBmaWVsZCBhbmQgY29weQotCXRoZSBleHByZXNzaW9uLgotCShlbGZfZnJvYl9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uICBDb21wdXRlcyBzaXplcywgY2FsbHMKLQllY29mZl9mcm9iX3N5bWJvbCBpZiBhcHByb3ByaWF0ZS4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IEZvciBpMzg2IGVsZiBhbmQgY29mZiAoZm9yIG5vdyksIGRvbid0Ci0JYWRkIGluIHZhbHVlIG9mIHN5bWJvbCBmcm9tIGFub3RoZXIgZGVmaW5lZCBzZWN0aW9uIG9mIHRoZSBmaWxlLgotCi1GcmkgT2N0ICA3IDE3OjU0OjAyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tODhrLmggKFRDX0tFRVBfRlhfT0ZGU0VUKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBUZXN0IG9ubHkgVENfS0VFUF9GWF9PRkZTRVQsCi0JcmF0aGVyIHRoYW4gYm90aCBpdCBhbmQgVENfTTg4Sy4KLQkoY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zKTogTmV3IGZ1bmN0aW9uLgotCShjb2ZmX2Zyb2Jfc2VjdGlvbik6IEZvciBub24tZW1wdHkgc2VjdGlvbnMsIGNyZWF0ZSBhdXggZW50cnkgZm9yCi0JdGhlIHNlY3Rpb24gc3ltYm9sLCBpbmRpY2F0aW5nIHRoZSBzaXplLgotCShuX2xpbmVfbm9zKTogTmV3IHZhcmlhYmxlLgotCShhZGRfbGluZW5vKTogSW5jcmVtZW50IGl0LgotCShjb2ZmX2FkZF9saW5lc3ltKTogSW5jcmVtZW50IG5fbGluZV9ub3MsIGRvbid0IGNhbGwgYWRkX2xpbmVuby4KLQkoY29mZl9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb247IG1hcCBjb2ZmX2FkanVzdF9zZWN0aW9uX3N5bXMgb3ZlcgotCXNlY3Rpb25zLgotCShvYmpfY29mZl9saW5lKTogT25seSByZXNldCBsaW5lX2Jhc2UgZm9yIC5iZiBzeW1ib2xzLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcywgY29mZl9mcm9iX2ZpbGUpOgotCURlY2xhcmUuCi0JKG9ial9mcm9iX2ZpbGUpOiBOZXcgbWFjcm8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IFJlbmFtZWQgZnJvbQotCW9ial9mcm9iX2ZvcndhcmRfc3ltYm9sLCBhbmQgcmV3cml0dGVuIGZvciBuZXcgcGFyYW1ldGVyIGxpc3QuCi0KLQlNb24gT2N0ICAzIDIxOjAyOjM4IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChTX0lTX0xPQ0FMKTogZml4IG9ic29sZXRlIGZsYWdzZWVuW10gcmVmZXJlbmNlLgotCi1XZWQgT2N0ICA1IDExOjQ5OjI2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWNjZXB0IC5lc2l6ZSBhbmQgLmV0eXBlCi0JYXMgc3lub255bXMgZm9yIC5zaXplIGFuZCAudHlwZS4KLQotV2VkIE9jdCAgNSAwMDowODoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc2VjdGlvbik6IFJlbW92ZSBhc3NlcnQgYWJvdXQKLQlzZWN0aW9uIGFsaWdubWVudC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zZWN0aW9uX2FsaWduKTogVXNlIHNlY3Rpb24gYWxpZ25tZW50LCBub3QKLQl4dmVjIGFsaWduX3Bvd2VyX21pbiBmaWVsZC4KLQotRnJpIFNlcCAzMCAxOTowNToyMCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogdm1zY29uZi5zaCAobWFrZS1nYXMuY29tKTogaGFuZGxlIERDTCB2ZXJpZmljYXRpb24gdG8gZW5hYmxlCi0Jc2Vuc2libGUgZmVlZGJhY2sgdG8gdGhlIHVzZXIgd2hpbGUgZ2FzIGlzIGJlaW5nIGJ1aWx0LgotCi1GcmkgU2VwIDMwIDE2OjIzOjMxIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNUU1RVRkYpOiBOZXcgdmFyaWFibGUsIGxpc3Rpbmcgb25seSBtYWtlLWdhcy5jb20KLQlmb3Igbm93LgotCShkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0OyBidWlsZHMgRElTVFNUVUZGLgotCShyZWFsY2xlYW4pOiBTZXBhcmF0ZSB0YXJnZXQsIGRlcGVuZCBvbiBjbGVhbiBhbmQgZGlzdGNsZWFuLCB0aGVuCi0JZGVsZXRlIERJU1RTVFVGRi4KLQkqIG1ha2UtZ2FzLmNvbTogRGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl92YWxpZGF0ZV9maXgpIFtCRkRfQVNTRU1CTEVSXTogTmV3Ci0JZnVuY3Rpb24uICBDb252ZXJ0cyByZWxvYyBmb3IgImZvby1HT1QiIHRvIEJGRF9SRUxPQ18zODZfR09UT0ZGCi0JcmVsb2MgZm9yICJmb28iLgotCShpMzg2X29wZXJhbmQpOiBEb24ndCBsb29rIHVwIHNlY3Rpb24gc3ltYm9sIGZvcgotCXVuZGVmaW5lZF9zZWN0aW9uLgotCShyZWxvYyk6IEFsd2F5cyBwZXJtaXQgcmV0dXJuIG9mIDgtIGFuZCAxNi1iaXQgcmVsb2NhdGlvbiB0eXBlcy4KLQlBZGQgYSBzcGFjZSBhZnRlciAicGMtcmVsYXRpdmUiIGluIHRoZSBlcnJvciBtZXNzYWdlLgotCSh0Y19pMzg2X2ZpeF9hZGp1c3RhYmxlKSBbQkZEX0FTU0VNQkxFUl06IFJlamVjdAotCUJGRF9SRUxPQ18zODZfR09UT0ZGIHJlbG9jcy4KLQkoaTM4Nl9vcGVyYW5kKTogRm9yIGFueSBHT1RPRkYgcmVsb2MsIGNvbnZlcnQgaXQgdG8gYSBCRkRfUkVMT0NfMzIKLQl3aXRoIGEgImZvby1HT1QiIHZhbHVlLgotCSogY29uZmlnL3RjLWkzODYuaCAoaTM4Nl92YWxpZGF0ZV9maXgpOiBEZWNsYXJlIGl0LgotCShUQ19WQUxJREFURV9GSVgpOiBOZXcgbWFjcm8gLS0gY2FsbCBpdC4KLQkoTk9QX09QQ09ERSk6IENhc3QgdG8gYGNoYXInIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi0JKiBhcy5oOiBJZiBfX1NURENfXyBpcyBub3QgZGVmaW5lZCBhbmQgdmFyYXJncy5oIGlzIGF2YWlsYWJsZSwgdXNlCi0JaXQgcmF0aGVyIHRoYW4gc3RkYXJnLmguCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBBZGRlZCBuZXcgYml0ZmllbGQgZnhfcGx0LCBmb3IgZml4dXBzCi0JcmVmZXJyaW5nIHRvIFBMVCBlbnRyaWVzLgotCSogd3JpdGUuYyAoZml4X25ld19pbnRlcm5hbCk6IEluaXRpYWxpemUgZnhfcGx0IHRvIHplcm8uCi0JKGFkanVzdF9yZWxvY19zeW1zKTogUmUtZmV0Y2ggYHN5bScgYWZ0ZXIgdG9wIG9mIHJlZHVjdGlvbiBsb29wLgotCURvbid0IGFkanVzdCBmeF9vZmZzZXQgYnkgZnJhZyBhZGRyZXNzLCBzaW5jZSBTX0dFVF9WQUxVRSBub3cKLQlpbmNsdWRlcyB0aGUgZnJhZyBhZGRyZXNzLgotCShmaXh1cF9zZWdtZW50KTogQ2hhbmdlZCBsb2NhbCB2YXIgUENSRUwgdG8gdHlwZSBpbnQsIGFkZGVkIFBMVC4KLQlJZiBQQy1yZWxhdGl2ZSBmaXh1cCByZWZlcnMgdG8gYSBQTFQgZW50cnkgZm9yIGEgc3ltYm9sIGluIHRoZQotCWN1cnJlbnQgc2VjdGlvbiwgZG9uJ3QgcmVkdWNlIGl0LgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6ICBFeGl0IGxvb3AgdGhyb3VnaCBhIGxhYmVsLiAgSWYKLQlERUJVRzUgaXMgZGVmaW5lZCwgcHJpbnQgb3V0IGVhY2ggZml4dXAgYmVmb3JlIGFuZCBhZnRlcgotCXByb2Nlc3NpbmcuCi0JKGZpeHVwX3NlZ21lbnQpOiBJZiBERUJVRzUgaXMgZGVmaW5lZCwgcHJpbnQgb3V0IGVhY2ggZml4dXAgYmVmb3JlCi0JYW5kIGFmdGVyIHByb2Nlc3NpbmcuCi0JKHByaW50X2ZpeHVwKTogQWRkZWQgcHJvdG90eXBlLiAgU2hvdyBhZGRyZXNzIG9uIGZpcnN0IGxpbmUuICBTaG93Ci0JZnhfb2Zmc2V0IGFuZCBmeF9zdWJzeS4gIFshQkZEX0FTU0VNQkxFUl06IE9ubHkgc2hvdyBmeF9yX3R5cGUgaWYKLQlORUVEX0ZYX1JfVFlQRSBpcyBkZWZpbmVkLgotCi0JKiBzeW1ib2xzLmMgKHByaW50X3N5bWJvbF92YWx1ZV8xKTogQ2hlY2sgU19JU19MT0NBTCwgU19JU19FWFRFUk4sCi0JU19JU19ERUJVRywgU19JU19ERUZJTkVEIGFsc28uCi0KLVRodSBTZXAgMjkgMTg6NTc6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCBvbiAuZ2RiaW5pdC4KLQkoLmdkYmluaXQpOiBSZWJ1aWxkIGZyb20gZ2RiaW5pdC5pbiBieSBydW5uaW5nIGNvbmZpZy5zdGF0dXMuCi0KLQkqIGdkYmluaXQuaW46IERlZmluZSBuZXcgZnVuY3Rpb24gInBmIi4gIEZpeCBkb2Mgb24gInBlIiBhbmQgInBzIi4KLQotCSogd3JpdGUuYyAocHJpbnRfZml4dXApOiBQcmludCBzb3VyY2UgbG9jYXRpb24gb24gZmlyc3QgbGluZS4KLQlTaG93IGZ4X3JfdHlwZSBhbmQgZnhfYWRkc3kgZmllbGRzLgotCi1XZWQgU2VwIDI4IDE0OjU2OjM5IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGJmZF9nYXMgZm9yIGFsbCBzcGFyYyB0YXJnZXRzIGluIG9uZSBwbGFjZSwKLQlpbnN0ZWFkIG9mIHNlcGFyYXRlbHkgZm9yIGVhY2guICBDb3JyZWN0bHkgaGFuZGxlIHVzZXItc3VwcGxpZWQKLQkiLS1lbmFibGUtYmZkLWdhcyIgb3B0aW9uLgotCi0JKiBnZGJpbml0LmluOiBNb3ZlICJicmVhayBhYm9ydCIgdG8gZW5kLCBpbiBjYXNlIGdkYiBjb21wbGFpbnMuCi0KLQkqIGFzLmggKFBSSU5URl9XSEVSRV9MSUtFLCBQUklOVF9MSUtFKSBbVVNFX1NUREFSRywgIV9fR05VQ19fXToKLQlVc2UgUEFSQU1TIG1hY3JvLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fc3ltYm9sKTogRG9uJ3QgZG8gYW55Ci0JcHJvY2Vzc2luZyBpZiBhZGRfc3ltYm9sIGlzIHVuZGVmaW5lZCBvciBpbiBleHByX3NlY3Rpb24uCi0JKHJlc29sdmVfc3ltYm9sX3ZhbHVlLCBjYXNlIE9fYWRkKTogRm9yIHN5bWJvbCBwbHVzCi0JY29uc3RhbnQtdmFsdWVkIHN5bWJvbCwgY29udmVydCB0byBPX3N5bWJvbCBhbmQgcmUtcmVkdWNlLgotCShTX0dFVF9WQUxVRSk6IElmIHN5bWJvbCBuZWVkcyByZXNvbHZpbmcsIHJlc29sdmUgaXQuCi0JKGluZGVudF9sZXZlbCk6IE5vIGxvbmdlciBzdGF0aWMuCi0JKHByaW50X3N5bWJvbF92YWx1ZV8xKTogRG9uJ3QgcHJpbnQgZnJhZyBhZGRyZXNzIGlmIGl0IG1hdGNoZXMKLQl6ZXJvX2FkZHJlc3NfZnJhZy4gIERvbid0IHByaW50ICJyZXNvbHZpbmciIGlmIGFscmVhZHkgcmVzb2x2ZWQuCi0JUHJpbnQgc2VnbWVudCBuYW1lLiAgRG9uJ3QgY2FsbCBwcmludF9leHByXzEgb24gYW4gdW5kZWZpbmVkCi0Jc3ltYm9sLgotCShwcmludF9leHByXzEpOiBGaXggd2hpdGVzcGFjZSBiZWZvcmUgcHJpbnRpbmcgWF9hZGRfbnVtYmVyLgotCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBObyBsb25nZXIgc3RhdGljLiAgVXNlIHN5bWJvbF9jcmVhdGUsCi0Jbm90IHN5bWJvbF9uZXcsIGZvciBzeW1ib2xzIGhvbGRpbmcgZXhwcmVzc2lvbiB2YWx1ZXMuCi0JKiBleHByLmggKG1ha2VfZXhwcl9zeW1ib2wpOiBNb3ZlIGRlY2xhcmF0aW9uIGhlcmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IEhhbmRsZSBPX2FkZCBieSBjcmVhdGluZyBhbgotCWV4cHJlc3Npb24tdmFsdWVkIHN5bWJvbCwgYW5kIGNhbGxpbmcgZml4X25ld19leHAgcmVjdXJzaXZlbHkuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogSWYgYSBmaXh1cCdzIHN5bWJvbCB2YWx1ZSBpcyBhIHN1bSBvZiBhbgotCXVuZGVmaW5lZCBzeW1ib2wgYW5kIGEgY29uc3RhbnQsIGZvbGQgdGhlIGNvbnN0YW50IGludG8gdGhlIGZpeHVwLAotCWFuZCByZWZlciB0byB0aGUgdW5kZWZpbmVkIHN5bWJvbCBkaXJlY3RseS4gIFRoZW4gcHJvY2VzcyB0aGUKLQlmaXh1cCBhZ2FpbiBmcm9tIHNjcmF0Y2guCi0JKHdyaXRlX29iamVjdF9maWxlKTogQmVmb3JlIGNhbGxpbmcgYWRqdXN0X3JlbG9jX3N5bXMsIG1ha2UgYSBwYXNzCi0JdGhyb3VnaCB0aGUgc3ltYm9sIGxpc3QgdHJ5aW5nIHRvIHJlc29sdmUgdmFsdWVzLgotCi0JKiB3cml0ZS5jIChwcmludF9maXh1cCk6IE5ldyByb3V0aW5lLCBmb3IgZGVidWdnaW5nLgotCSh3cml0ZV9yZWxvY3MpOiBDYWxsIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICBEZWxldGVkIHZhcmlvdXMKLQloYWNrcyBmb3Igd29ya2luZyBhcm91bmQgcHJvYmxlbXMgd2l0aCBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uLgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZSB0byAyLjQuOTAuCi0KLVdlZCBTZXAgMjggMTE6NTA6NDAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZ2FzcC5vKTogRGVwZW5kcyB1cG9uIGNvbmZpZy5oLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkobWRfYXBwbHlfZml4KTogSWYgYW4gdW5jb25kaXRpb25hbCBiIG9yIGJhbCBvdmVyZmxvd3MsIGFuZCB3ZSBhcmUKLQlub3QgYXNzZW1ibGluZyBQSUMgY29kZSwgcmVwbGFjZSBpdCB3aXRoIGEgaiBvciBqYWwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IENvcnJlY3QgYnJhbmNoIG92ZXJmbG93IHRlc3QuCi0JVXNlIGFzX2JhZF93aGVyZSBhbmQgYXNfd2Fybl93aGVyZSByYXRoZXIgdGhhbiBhc19iYWQgYW5kIGFzX3dhcm4uCi0KLU1vbiBTZXAgMjYgMTc6MTU6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBBZGQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB0bwotCWFzX2ZhdGFsIGNhbGxzLiAgSGFuZGxlIGJmZF9yZWxvY19vdmVyZmxvdyBjYXNlIHNwZWNpZmljYWxseSB3aGVuCi0JUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFLgotCi1GcmkgU2VwIDIzIDE2OjExOjI4IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGFzLmggKFVTRV9TVERBUkcsIFVTRV9WQVJBUkdTKTogRGVmaW5lIG9uZSBvciBuZWl0aGVyIG9mIHRoZXNlCi0JaGVyZS4gIFVzZSB0aGVtIGZvciBkZWNpZGluZyB3aGljaCBQUklOVEYqTElLRSBtYWNybyBkZWZpbml0aW9ucwotCXRvIHVzZS4KLQkqIG1lc3NhZ2VzLmM6IFVzZSB0aGVtLCBpbnN0ZWFkIG9mIE5PX1NUREFSRywgTk9fVkFSQVJHUy4KLQlbIVVTRV9TVERBUkcgJiYgIVVTRV9WQVJBUkdTXSAodmFfYWxpc3QsIHZhX2RjbCwgLi4uKTogUHJvdmlkZQotCWRlZmF1bHQgZGVmaW5pdGlvbnMgbWF0Y2hpbmcgd2hhdCB3ZSB3ZXJlIGRvaW5nIGJlZm9yZS4KLQkoYXNfdHNrdHNrKTogUmVtb3ZlIHRoZSBub24tc3RkYXJnLCBub24tdmFyYXJncyB2ZXJzaW9uLCBhbmQKLQlhbHdheXMgdXNlIHRoZSB2YXJhcmdzIGZvcm0gaWYgbm90IHVzaW5nIHN0ZGFyZy4gIEl0J3Mgc2FmZSB0bwotCWFsd2F5cyB1c2UgdmZwcmludGYsIGJlY2F1c2UgbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpdCBpZiB0aGUKLQluYXRpdmUgc3lzdGVtIGRvZXNuJ3QuICBBbHNvLCBhbHdheXMgbWFrZSBmb3JtYXQgYmUgY29uc3QuCi0JKGFzX3dhcm4sIGFzX3dhcm5fd2hlcmUsIGFzX2JhZCwgYXNfYmFkX3doZXJlLCBhc19mYXRhbCk6IERpdHRvLgotCi1GcmkgU2VwIDIzIDE0OjQyOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEFsd2F5cyB1c2UgYWRkaXUgd2hlbiBhZGRpbmcgYQotCWNvbnN0YW50IHRvICR6ZXJvLS1ubyBuZWVkIHRvIHVzZSBkYWRkaXUuCi0JKG1hY3JvKTogSGFjayB0aGUgLW1pcHMzIG92ZXJmbG93IHRlc3RzIHRvIG5vdCBmYWlsIHdoZW4gb2Zmc2V0VAotCWlzIG9ubHkgMzIgYml0cy4KLQotCSogc3ltYm9scy5oIChjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKTogRGVjbGFyZS4KLQotVGh1IFNlcCAyMiAyMTo1ODoyNCAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmM6IEJ1Z2ZpeGVzIGJhc2VkIGluIHBhcnQgb24gcGF0Y2hlcyBmcm9tIFBhdWwKLQlLcmFuZW5idXJnLgotCShsaXN0aW5nX25ld2xpbmUpOiBDaGVjayBmaWxlbmFtZSBhcyB3ZWxsIGFzIGxpbmUgbnVtYmVyIHdoZW4KLQlkZWNpZGluZyB3aGV0aGVyIHRvIHJlY29yZCBpdC4KLQkobGlzdF9zeW1ib2xfdGFibGUpIFtTX0lTX1JFR0lTVEVSXTogQ2hlY2sgdGhhdCBTX0lTX1JFR0lTVEVSIGlzCi0JZmFsc2UgKGlmIGRlZmluZWQpIGFzIHdlbGwgYXMgY2hlY2tpbmcgZm9yIHJlZ19zZWN0aW9uLgotCShsaXN0aW5nX2xpc3RpbmcpOiBJdGVyYXRlIGZldGNoaW5nIGxpbmVzIHdoaWxlIGxpbmUgbnVtYmVyIGlzIHRvbwotCWxvdywgYW5kIHdlIGhhdmVuJ3QgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogQ2hhbmdlZCBIQVZFX0RFTEVURSB0byBIQVZFX1JFTU9WRS4KLQotVGh1IFNlcCAyMiAxMzozOToxMCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAeDEuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IGNoZWNrIGlmCi0JY3VycmVudF9zdGFic19maWxlbmFtZSBpcyBOVUxMIGJlZm9yZSBzdHJjbXAuCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGZpeCBhIGJ1ZyBpbiBnZW5lcmF0ZV9hc21fbGluZW5vCi0JY2hlY2tpbmcuCi0KLVdlZCBTZXAgMjEgMTg6MTc6MzUgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2hvLSouaDogTm93LXVudXNlZCBmaWxlcyBkZWxldGVkLgotCi0JKiBzeW1ib2xzLmMgKGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMpOiBOZXcgZnVuY3Rpb24uICBDb3BpZXMgQkZECi0Jc3ltYm9sIGZsYWdzIGFuZCBjYWxscyBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUy4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUsIGNhc2UgT19zeW1ib2wpOiBDYWxsIGl0LCBpZiBYX2FkZF9udW1iZXIgaXMKLQl6ZXJvLiAgRG9uJ3QgY2FsbCBvYmpfZnJvYl9mb3J3YXJkX3N5bWJvbC4KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IENhbGwgY29weV9zeW1ib2xfYXR0cmlidXRlcywgYnV0IG9ubHkgaWYKLQlYX2FkZF9udW1iZXIgaXMgemVyby4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKTogRGVsZXRlZC4KLQotCSogY29uZmlnL3RjLWk5NjAuYzogTG90cyBvZiB3aGl0ZXNwYWNlLCBjb21tZW50IHJlZm9ybWF0dGluZywKLQl1c2luZyBHTlUgaW5kZW50LgotCShzdHJjaHIpOiBEb24ndCBkZWNsYXJlLgotCVtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgY29tcGlsZSBtZF9jb252ZXJ0X2ZyYWcsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX3JpX3RvX2NoYXJzLAotCW1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLgotCShicnRhYl9lbWl0KTogVXNlIGRhdGFfc2VjdGlvbiwgbm90IFNFR19EQVRBLgotCi0JTW9uIFNlcCAxOSAxNzoxNDo0NCAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL3Ztcy1jb25mLmg6IG5ldyBmaWxlLCBtYW51YWxseSBkZXJpdmVkIGZyb20gY29uZi5pbi4KLQkqIGNvbmZpZy1nYXMuY29tOiB1c2UgaXQsIGFuZCBlbGltaW5hdGUgb2Jzb2xldGUgImhvc3QuaCIuCi0KLVdlZCBTZXAgMjEgMTE6MTE6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19jdXJyZW50X2Jsb2NrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHBjX3N0YWJ4KTogU2V0IHN5X3RjLndpdGhpbiBvZiBhIENfU1RTWU0gc3ltYm9sIHRvCi0JcHBjX2N1cnJlbnRfYmxvY2suICBEb24ndCBtb3ZlIGFyb3VuZCBhbnkgc3RhYiBzeW1ib2wsIGp1c3QgdGhvc2UKLQlmb3IgY29tbW9uIHN5bWJvbHMuCi0JKHBwY19icyk6IFNldCBwcGNfY3VycmVudF9ibG9jay4KLQkocHBjX2VzKTogQ2xlYXIgcHBjX2N1cnJlbnRfYmxvY2suCi0JKHBwY19mcm9iX3N5bWJvbCk6IFNldCB0aGUgdmFsdWUgb2YgYSBDX1NUU1lNIHN5bWJvbCB0byB0aGUgb2Zmc2V0Ci0JZnJvbSB0aGUgY3NlY3Qgb2YgdGhlIGVuY2xvc2luZyBibG9jay4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoaW5zbnNfc2luY2VfY2FjaGVfYWNjZXNzKTogUmVtb3ZlLgotCShhcHBlbmRfaW5zbik6IFJlbW92ZSBzZXR0aW5nIG9mIGluc25zX3NpbmNlX2NhY2hlX2FjY2VzcywgYW5kCi0Jc3BlY2lhbCA0NjAwIGhhbmRsaW5nOyBpdCB0dXJucyBvdXQgbm90IHRvIGJlIHJlcXVpcmVkLgotCi1UdWUgU2VwIDIwIDE2OjEzOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvcnRvcHRzKTogUmVtb3ZlIEUuCi0JKG1kX2xvbmdvcHRzKTogQWRkIEVCIGFuZCBFTC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIC1FQiBhbmQgLUVMIGFzIHNlcGFyYXRlIG9wdGlvbnMsIHJhdGhlcgotCXRoYW4gYXMgYSBzaW5nbGUgLUUgb3B0aW9uIHdpdGggYW4gYXJndW1lbnQuCi0KLU1vbiBTZXAgMTkgMTI6NDI6MDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBSZWplY3QgcmVkdWN0aW9ucwotCWludm9sdmluZyBnbG9iYWwgc3ltYm9scyB0b28uCi0KLU1vbiBTZXAgMTkgMTI6MTI6NDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogYXMuaDogVGVzdCBORUVEX0RFQ0xBUkFUSU9OXyosIG5vdCBORUVEXypfREVDTEFSQVRJT04uCi0KLQkqIGNvbmZpZ3VyZS5pbjogVGVzdCBmb3IgcmVtb3ZlLCBub3QgZGVsZXRlLiAgRml4IGNyb3NzLWFzc2VtYmxlcgotCXRlc3QuCi0JKiBhcy5oOiBUZXN0IEhBVkVfUkVNT1ZFLCBub3QgSEFWRV9ERUxFVEU7IGRlZmluZSB1bmxpbmsgdG8KLQlyZW1vdmUsIG5vdCBkZWxldGUuCi0KLQkqIHJlYWQuYyAocHNldWRvX3NldCwgY2FzZSBPX3N5bWJvbCk6IElmCi0JT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgaXMgZGVmaW5lZCwgaW52b2tlIGl0LgotCVtCRkRfQVNTRU1CTEVSXTogQ29weSBCU0ZfRlVOQ1RJT04gc2V0dGluZyB0b28uCi0JKiBjb25maWcvb2JqLWVsZi5oIChPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyk6IERlZmluZS4KLQotCVdlZCBBdWcgMTAgMTk6MTU6MzAgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKERTR19TX0NfVUJJVFUsIERTVF9LX1ZGTEFHU19EU0MsIERTVF9LX1RTX0FUT00sCi0JbWFueSBvdGhlcnMpOiBuZXcgbWFjcm9zOyB2YWx1ZXMgb2J0YWluZWQgZnJvbSAiRFNUUkVDUkRTLlNETCIuCi0JKiBjb25maWcvb2JqLXZtcy5oICh2YXJpb3VzKTogdXNlIHRoZW0uCi0JKFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUik6IG5ldyBtYWNybywgZm9yIHNlbGVjdGluZyBiaXRmaWVsZAotCXJlcHJlc2VudGF0aW9uIChvbmx5IGVudW0gYml0ZmllbGRzIGNhbiBhdm9pZCBiZWluZyBiaXRzdHJpbmdzKS4KLQkoYml0ZmllbGRfc3VmZml4LCBzZXR1cF9iYXNpY190eXBlKTogbmV3IHJvdXRpbmVzLgotCShWTVNfdHlwZWRlZl9wYXJzZSk6IHVzZSB0aGVtLiAgTm93IHJlY29nbml6ZSBiaXRmaWVsZHMgb2YgYWxsCi0JaW50ZWdyYWwgdHlwZXMsIG5vdCBqdXN0IHR5cGUgYGludCcuICBDYXZlYXQ6ICB0aGUgcmVwcmVzZW50YXRpb24KLQl1c2VkIGZvciBiaXRmaWVsZHMgc3RpbGwgZG9lcyBub3Qgd29yayBmb3Igb2JqZWN0cyBwbGFjZWQgaW4KLQlyZWdpc3RlcnMsIGFuZCBnY2MncyBvcHRpbWl6ZXIgc29tZXRpbWVzIHB1dHMgc21hbGwgc3RydWN0cyB0aGVyZS4KLQotCVR1ZSBKdW4gMTQgMTc6MzE6NDQgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIHJlYWQuYyAoc190ZXh0KSBbI2lmIE9CSl9WTVNdOiBjbGVhciB0aGUgSU5fREVGQVVMVF9TRUNUSU9OCi0JYml0IGZyb20gY29uc3RfZmxhZy4KLQkqIGNvbmZpZy9vYmotdm1zLmggKElOX0RFRkFVTFRfU0VDVElPTik6IGRlZmluZSB0aGlzIG1hY3JvLgotCSh0Y19mcm9iX2xhYmVsKTogZGVmaW5lIHRoaXMgdG8gY2FsbCB2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwsCi0JYW5kIGRlY2xhcmUgdGhlIGxhdHRlci4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHZheF9nX2RvdWJsZXMpOiBkZWNsYXJlIHRoaXMgZmlsZS1zY29wZQotCXZhcmlhYmxlLgotCShjb25zdF9mbGFnKTogaW5pdGlhbGl6ZSB0byBJTl9ERUZBVUxUX1NFQ1RJT04gaW5zdGVhZCBvZiAwLgotCSh2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwpOiBuZXcgcm91dGluZSAodGNfZnJvYl9sYWJlbCkuCi0JKFZNU19UQlRfUm91dGluZV9FbmQpOiBkb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIGBnY2NfY29tcGlsZWQuJwotCWFuZCBgZ2NjMl9jb21waWxlZC4nIGxhYmVsczsgdGhleSB3b24ndCByZWFjaCBoZXJlIGFueSBtb3JlLgotCShWTVNfdHlwZWRlZl9wYXJzZSkgW2Nhc2UgJ3InXTogZm9yIHR5cGVzIGBkb3VibGUnIGFuZCBgY29tcGxleAotCWRvdWJsZScsIHVzZSBgdmF4X2dfZG91YmxlcycgZmxhZyB0byBzZWxlY3QgdHlwZSBvZiBkb3VibGUuCi0JKFZNU193cml0ZV9vYmplY3RfZmlsZSkgW3RyYWNlYmFjayBzZXR1cF06IGRvbid0IHBhc3Mgc3ltYm9scwotCXdpdGggdGhlIElOX0RFRkFVTFRfU0VDVElPTiBhdHRyaWJ1dGUgdG8gdGhlIFRCVF9Sb3V0aW5lX0JlZ2luCi0JYW5kIFRCVF9Sb3V0aW5lX0VuZCBmdW5jdGlvbnMuCi0KLQlNb24gSnVuICA2IDIwOjUyOjIwIDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfVEJUX1JvdXRpbmVfRW5kKTogY2FjaGUgdGhlIHJlc3VsdCBvZgotCVNfR0VUX1ZBTFVFKCkgdG8gYXZvaWQgbWFueSByZXBlYXRlZCBmdW5jdGlvbiBjYWxscy4KLQkoVk1TX0NoZWNrX0Zvcl9NYWluKSBbI2lmIEhBQ0tfREVDX0NfU1RBUlRVUF06IGNhcGl0YWxpemUKLQlfQyRNQUlOX0FSR1MgaW4gYWR2YW5jZSwgaW4gY2FzZSAtaDMgKGxlYXZlIHN5bWJvbCBuYW1lIGFzLWlzKQotCWdldHMgcmVxdWVzdGVkLiAgW0FsbCB0aGUgSEFDS19ERUNfQ19TVEFSVFVQIGNvZGUgYXBwZWFycyB0bwotCWJlIG9ic29sZXRlOyBnY2MgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IGZvciB2bXMgdGFyZ2V0LiAgSXQncwotCWFsc28gbWlzbmFtZWQsIGJlY2F1c2UgaXQgaXMgZm9yIHRoZSAiVkFYIEMiIHJ1bi10aW1lIGxpYnJhcnksCi0Jbm90IHRoZSBuZXdlciAiREVDIEMiIG9uZSB3aGljaCBoYXMgbXVjaCBkaWZmZXJlbnQgc3RhcnR1cCBjb2RlLl0KLQl7dmFyaW91c306IHVzZSBgU19TRVRfeHh4KHN5bWJvbCxuZXdfdmFsdWUpJyByYXRoZXIgdGhhbgotCWBTX0dFVF94eHgoc3ltYm9sKSA9IG5ld192YWx1ZScuCi0KLU1vbiBTZXAgMTkgMTI6MDU6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19kb3RfZmlsZV9zeW1ib2wpOiBVc2UgYmZkX2Fic19zZWN0aW9uX3B0ciwKLQlub3QgJmJmZF9hYnNfc2VjdGlvbi4KLQotVGh1IFNlcCAxNSAxODozNjozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoY2xlYW5fdXBfZXhwcmVzc2lvbik6IFVzZSBhZGRyZXNzVCwgbm90IGJmZF92bWEuCi0KLVR1ZSBTZXAgMTMgMjA6MDU6NDcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGV4cHIuYyAoZXhwcik6IERvbid0IHJlZHVjZSB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUKLQlzYW1lIGZyYWcgaWYgdGhlIHN5bWJvbHMgYXJlIG5vdCBpbiBub3JtYWwgc2VjdGlvbnMuCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKFNfU0VUX09USEVSLCBTX1NFVF9UWVBFKTogRGVsZXRlIGEub3V0IGNydWQuCi0JKFNfU0VUX0RFU0MsIFNfR0VUX09USEVSLCBTX0dFVF9UWVBFLCBTX0dFVF9ERVNDKTogTGlrZXdpc2UuCi0JKG9ial9hdHRhY2hfdW53aW5kX2luZm8pOiBEbyBub3QgZGVmaW5lLiAgTm90IG5lZWRlZCBhbnltb3JlLgotCSogY29uZmlnL3RjLWhwcGEuYzogRGVsZXRlIHdoaXRlc3BhY2UgYXQgRU9MLgotCShzdHJ1Y3QgaHBwYV9maXhfc3RydWN0KTogRGVsZXRlIGZ4X3Vud2luZCBmaWVsZCBhbmQgYWxsIHJlZmVyZW5jZXMuCi0JKGZpeF9uZXdfaHBwYSk6IExhc3QgYXJnIGlzIG5vdyBhIHBvaW50ZXIgdG8gYW4gaW50LiAgRG8gbm90Ci0JY2FsbCBvYmpfYXR0YWNoX3Vud2luZF9pbmZvIGFueW1vcmUuICBGb3IgU09NIFJfRU5UUlkgYW5kIFJfRVhJVAotCWZpeHVwcywgc3RvcmUgMzJiaXRzIG9mIHVud2luZCBpbmZvcm1hdGlvbiBpbiB0aGUgZnhfYWRkbnVtYmVyCi0JZmllbGQgb2YgdGhlIGZpeHVwLgotCShtZF9hc3NlbWJsZSwgcGFfZW50cnksIHByb2Nlc3NfZXhpdCwgcGFfcHJvY2VuZCk6IEZvciBTT00gUl9FTlRSWQotCWFuZCBSX0VYSVQgZml4dXBzLCBwYXNzIGEgTlVMTCBwb2ludGVyIHRvIGZpeF9uZXdfaHBwYSwgYW5kIGEKLQlwb2ludGVyIHRvIDMyIGJpdHMgb2YgdW53aW5kIGluZm8uCi0JKHRjX2dlbl9yZWxvYyk6IEZvciBTT00gUl9FTlRSWSBhbmQgUl9FWElUIGZpeHVwcywgc2V0IHRoZSBzeW1ib2wKLQlwb2ludGVyIHRvIHRoZSBkdW1teSBzeW1ib2w7IHNldCB0aGUgYWRkZW5kIGZpZWxkIHRvIGZ4X2FkZG51bWJlci4KLQkocGFfY29tbSwgcGFfZXF1LCBwYV90eXBlX2FyZ3MsIHBhX2ltcG9ydCk6IFVzZSBiZmRfWFhYX3NlY3Rpb25fcHRyCi0JcmF0aGVyIHRoYW4gJmJmZF9YWFhfc2VjdGlvbi4KLQotVHVlIFNlcCAxMyAyMToxNTozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXhfMSk6IEZvciBHT1RQQyByZWxvY3MsIGRlY3JlbWVudAotCXZhbHVlIGJ5IG9uZTsgZGlzY2FyZCBhZGp1c3RtZW50cyBwcmV2aW91c2x5IGJlaW5nIG1hZGUuICBGcm9tCi0JRXJpYyBZb3VuZ2RhbGUuCi0KLQlWTVMtIGFuZCBWYXgtcmVsYXRlZCBjaGFuZ2VzIGZyb20gUGF0IFJhbmtpbjoKLQkqIE1ha2VmaWxlLmluIChWTVNfT1RIRVJfT0JKUyk6IGFkZCBjb25jYXQsIGdldG9wdCwgYW5kIGdldG9wdDEuCi0JKiB2bXNjb25mLnNoOiBubyBsb25nZXIgaGF2ZSBtYWtlLWdhcy5jb20gZWNobyB0ZXh0IGFib3V0IG5lZWRpbmcKLQl0byBtb2RpZnkgdGhlIGdjYy12bXMgZHJpdmVyIHdoZW4gaW50ZW5kaW5nIHRvIHVzZSB3aXRoIGdjYyAxLnguCi0JKiBhcy5jIChwYXJzZV9vcHRpb25zKTogc3VwcHJlc3MgJ3YnIGZyb20gc3RkX3Nob3J0X29wdGlvbnMgYW5kCi0JZWxpbWluYXRlIFZNUy1zcGVjaWZpYyBjb25kaXRpb25hbCBpbml0aWFsaXphdGlvbjsKLQlbZGVmYXVsdCBjYXNlXTogY2hlY2sgZm9yICctdicgaWYgbWRfcGFyc2Vfb3B0aW9ucyBkb2Vzbid0IHJlY29nbml6ZQotCWFuIG9wdGlvbjsKLQlbZGVmYXVsdCBjYXNlLCAjaWYgVk1TXTogY2hlY2sgZm9yIGZpbGVuYW1lIGFyZ3VtZW50IHdoZW4gJy12JyBzZWVuOwotCVtjYXNlICd2J106IGRlbGV0ZS4KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfYXNzZW1ibGUpOiBkb24ndCByZWx5IG9uIGB0aGlzX2FkZF9udW1iZXInCi0JZm9yIE9fYmlnIGxpdGVyYWwgb3BlcmFuZHMgKGRvdWJsZSBmbG9hdHMgYW5kIGxvbmcgbG9uZyBpbnRzKTsKLQlbVk1TLCBtZF9zaG9ydG9wdHNdOiBhZGQgc2Vjb25kIGNvbG9uIGFmdGVyICd2JzsKLQkobWRfcGFyc2Vfb3B0aW9ucykgW1ZNUywgY2FzZSAndiddOiAgY2hlY2sgZm9yIGFyZ3VtZW50LCBzbwotCWNhbGxlciBjYW4gaGFuZGxlIGAtdicgdy9vIGFyZy4KLQotVHVlIFNlcCAxMyAxNjo0NTowOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6ICBJZiBUQ19LRUVQX0ZYX09GRlNFVAotCWlzIGRlZmluZWQsIHB1dCB0aGUgdHhfb2Zmc2V0IGludG8gdGhlIHJfb2Zmc2V0LgotCSogY29uZmlnL3RjLXNoLmMgKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAjCi0JKHRjX3JlbG9jX21hbmdsZSk6IERlbGV0ZWQuCi0JKiBjb25maWcvdGMtc2guaCAoVENfS0VFUF9GWF9PRkZTRVQpOiBEZWZpbmUuCi0JKFRDX1JFTE9DX01BTkdMRSk6IERlbGV0ZS4KLQotVHVlIFNlcCAxMyAxNjoyMDozNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBmbG9udW0ta29uc3QuYzogQ2hhbmdlIHByZXByb2Nlc3NvciB0ZXN0cyBvZiBIT19WTVMgdG8ganVzdCBWTVMuCi0JKiBoZXgtdmFsdWUuYzogRGl0dG8uCi0JKiBjb25maWcvb2JqLXZtcy5jOiBEaXR0by4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogUmVwbGFjZSBhc19iYWQvZXhpdCBzZXF1ZW5jZSB3aXRoCi0JYSBjYWxsIHRvIGFzX2ZhdGFsLgotCSogY29uZmlnL3RjLWk4NjAuYyAoaTg2MF9pcCk6IERpdHRvLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9pcCk6IERpdHRvLgotCSogYXMuYyAocGFyc2VfYXJncyk6IERpdHRvLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogUmVwbGFjZSBhc193YXJuL2V4aXQgc2VxdWVuY2Ugd2l0aCBhCi0JY2FsbCB0byBhc19mYXRhbC4KLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBVc2UgRVhJVF9GQUlMVVJFLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlLCBvdXRwdXRfZmlsZV9jbG9zZSwKLQlvdXRwdXRfZmlsZV9jcmVhdGUsIG91dHB1dF9maWxlX2Nsb3NlKTogRGl0dG8uCi0JKiBtZXNzYWdlcy5jIChhc19mYXRhbCk6IERpdHRvLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uLCBvYmpfc29tX2NvcHlyaWdodCk6IERpdHRvLgotCSogY29uZmlnL29iai1pZWVlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy12YXguYyAobWFpbik6IFVzZSBFWElUX1NVQ0NFU1MuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtYWluKTogRGl0dG8uCi0KLQkqIGhhc2guYyAobWFpbik6IFBhc3MgYSB2YWx1ZSB0byBleGl0KCkuCi0KLQkqIGFzLmggKEVYSVRfU1VDQ0VTUywgRVhJVF9GQUlMVVJFKTogTW92ZWQgaGVyZS4KLQkqIGFzLmM6IC4uLmZyb20gaGVyZS4KLQkocGFyc2VfYXJncyk6IFVzZSB0aGVtIGFsd2F5cy4KLQkobWFpbik6IFVzZSBleGl0IHJhdGhlciB0aGFuIHJldHVybi4KLQotCSogTWFrZWZpbGUuaW4gKCpfRk9SX1RBUkdFVCwgSU5TVEFMTF9YRk9STSwgaW5zdGFsbCwgdW5pbnN0YWxsKToKLQlSZXdyaXRlIGhhbmRsaW5nIG9mIHByb2dyYW1fdHJhbnNmb3JtX25hbWUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVGVzdCBmb3IgZnVuY3Rpb25zIHVubGluayBhbmQgZGVsZXRlLgotCSogYXMuaDogSWYgdW5saW5rIGlzbid0IGF2YWlsYWJsZSBidXQgZGVsZXRlIGlzLCBkZWZpbmUgdW5saW5rIHRvCi0JYmUgZGVsZXRlLgotCi0JVXBkYXRlIGZvciBhdXRvY29uZiAxLjExODoKLQkqIGdkYmluaXQuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGZyb20gb2xkIC5nZGJpbml0LgotCSogLmdkYmluaXQ6IERlbGV0ZWQuCi0JKiBhY2xvY2FsLm00IChHQVNfR0RCSU5JVCk6IERlbGV0ZWQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHVzZSBpdC4gIEluc3RlYWQsIGdlbmVyYXRlIC5nZGJpbml0IGZyb20KLQlnZGJpbml0LmluLiAgRG9uJ3Qgc3Vic3RpdHV0ZSBjcHVfdHlwZSwgb2JqX2Zvcm1hdCwgZW11bGF0aW9uLAotCWF0b2YuICBTd2l0Y2hlZCBvcmRlciBvZiBBQ19MSU5LX0ZJTEVTIGFyZ3VtZW50cy4gIFVzZSBBQ19QUkVSRVEKLQl0byBlbnN1cmUgdGhhdCBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZiBhcmVuJ3QgdXNlZC4KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBAY29uZmlndXJlX2lucHV0QCBsaW5lLgotCShjb25maWd1cmUpOiBEZWxldGVkIHJ1bGUuCi0KLVR1ZSBTZXAgMTMgMTI6MDg6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IEFmdGVyIGhhbmRsaW5nIHRoZSBkaWZmZXJlbmNlCi0Jb2YgdHdvIHN5bWJvbHMgZnJvbSB0aGUgc2FtZSBzZWdtZW50LCBzZXQgZnhfc3Vic3kgdG8gTlVMTCwgdG8KLQlzYXRpc2Z5IGV4aXN0aW5nIFRDX0NPVU5UX1JFTE9DIG1hY3Jvcy4KLQotVHVlIFNlcCAxMyAwMTo0NzowOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhY2xvY2FsLm00IChHQVNfR0RCSU5JVCk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGl0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIFNlcCAxMiAyMDo1NjozOCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIC5nZGJpbml0IChwZSwgcHMpOiBEZWZpbmUgbmV3IGNvbW1hbmRzLgotCSogc3ltYm9scy5jIChpbmRlbnRfbGV2ZWwpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbmRlbnQsIHByaW50X2V4cHJfMSwgcHJpbnRfc3ltYm9sX3ZhbHVlXzEsIHByaW50X3N5bWJvbF92YWx1ZSwKLQlwcmludF9leHByKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IEFkZCBhICJ0aGlzIGZpbGUgZ2VuZXJhdGVkIGJ5IG1ha2UiCi0JbWVzc2FnZSB0byBjb25maWcuaC4KLQotCVBJQyBpbXBsZW1lbnRhdGlvbiBmb3IgaTM4Ni1saW51eCwgYmFzZWQgb24gY29kZSBmcm9tIEVyaWMKLQlZb3VuZ2RhbGUgYW5kIFBhdWwgS3JhbmVuYnVyZywgd2l0aCBzb21lIHdvcmsgb2YgbXkgb3duOgotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogVGVzdCBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAgb24gZml4dXAKLQliZWZvcmUgcHJvY2Vzc2luZyBzYW1lLXNlY3Rpb24gcGNyZWwgcmVsb2NhdGlvbnMuCi0JKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmF1bHQgdG8gMS4KLQotCSogZXhwci5jIChtYWtlX2V4cHJfc3ltYm9sKTogSWYgb3BlcmF0b3IgaXMgT19zeW1ib2wgYW5kCi0JWF9hZGRfbnVtYmVyIGlzIHplcm8sIGp1c3QgcmV0dXJuIHRoZSBzeW1ib2wuICBJZiBvcGVyYXRvciBpcwotCU9fY29uc3RhbnQsIHJlc29sdmUgdGhlIHN5bWJvbCdzIHZhbHVlIGJlZm9yZSByZXR1cm5pbmcuCi0JKG9wZXJhbmQpOiBQZXJtaXQgdXNlIG9mICJbXSIgZm9yIGdyb3VwaW5nLgotCShjbGVhbl91cF9leHByZXNzaW9uKTogRm9yIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gdGhlIHNhbWUKLQlmcmFnLCBhZGQgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlaXIgb2Zmc2V0cyBpbnRvIFhfYWRkX251bWJlci4KLQkoZXhwcik6IFJlZHVjZSBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIGluIHNhbWUgZnJhZyB0byB0aGVpcgotCWRpZmZlcmVuY2UuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKFRDX1JFTE9DKTogTmV3IG1hY3JvLgotCShzdHJ1Y3QgX2kzODZfaW5zbik6IE5ldyBmaWVsZCBkaXNwX3JlbG9jLgotCShHT1Rfc3ltYm9sKTogTmV3IHZhcmlhYmxlLgotCShvcGVyYW5kX3NwZWNpYWxfY2hhcnMpOiBBZGRlZCBzcXVhcmUtYnJhY2tldHMgYW5kIGF0LXNpZ24uCi0JKHJlbG9jKSBbQkZEX0FTU0VNQkxFUl06IEFkZGVkIG5ldyBhcmd1bWVudCBPVEhFUjsgaWYgaXQgaXMgbm90Ci0JTk9fUkVMT0MsIGp1c3QgcmV0dXJuIGl0LgotCShyZWxvYykgWyEgQkZEX0FTU0VNQkxFUl06IEFkZCB0aGlyZCBhcmd1bWVudCB0byBkdW1teSBtYWNyby4KLQkoQkZEX1JFTE9DXzM4Nl9QTFQzMiwgX0dPVDMyLCBfR09UT0ZGKSBbISBCRkRfQVNTRU1CTEVSXTogTW9yZQotCWR1bW15IG1hY3Jvcy4KLQkodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4gIFJldHVybnMgemVybyBpZiBzeW1ib2wgaW4KLQlmaXh1cCBpcyBub3QgbG9jYWwsIHRvIHByZXZlbnQgcmVsb2NhdGlvbnMgYWdhaW5zdCBleHRlcm5hbHMgZnJvbQotCWJlaW5nIGRyb3BwZWQuCi0JKG1kX2Fzc2VtYmxlKTogSW5pdGlhbGl6ZSBkaXNwX3JlbG9jIGZpZWxkIHRvIE5PX1JFTE9DLiAgUGFzcwotCWRpc3BfcmVsb2MgZmllbGQgdG8gcmVsb2MoKSBmdW5jdGlvbiwgYW5kIHVzZSBUQ19SRUxPQyB0byBnZW5lcmF0ZQotCXZhbHVlIHRvIHBhc3MgdG8gZml4X25ld19leHAuCi0JKG1kX2Fzc2VtYmxlKTogQ2hhbmdlIDMyLWJpdCByZWxvYyBhZ2FpbnN0IEdPVF9zeW1ib2wgaW50byBhIEdPVFBDCi0JcmVsb2MuCi0JKGkzODZfb3BlcmFuZCk6IEluaXRpYWxpemUgZGlzcF9yZWxvYyBmaWVsZCB0byBOT19SRUxPQy4gIEhhbmRsZQotCUBHT1RPRkYsIEBQTFQsIEBHT1Qgb3BlcmFuZHMuICBGb3IgR09UT0ZGIHJlbG9jYXRpb25zIHdpdGggbG9jYWwKLQlzeW1ib2xzLCBmb3JjZSBnZW5lcmF0aW9uIG9mIHRoZSBzZWN0aW9uIHN5bWJvbC4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJZiBHT1Rfc3ltYm9sIGV4aXN0cywgZGVjaWRlCi0Jd2UncmUgZ2VuZXJhdGluZyBQSUMgY29kZSwgYW5kIGNvbnZlcnQgcmVsb2NhdGlvbnMgYWdhaW5zdAotCXVuZGVmaW5lZCBzeW1ib2xzIGZyb20gUENSRUwgdG8gUExUMzIuCi0JKG1kX2FwcGx5X2ZpeF8xKSBbT0JKX0VMRl06IEZpeCB1cCB2YWx1ZXMgZm9yIGR5bmFtaWMtbGlua2luZwotCXJlbG9jcy4KLQkobWRfdW5kZWZpbmVkX3N5bWJvbCk6IE5vdGljZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgYW5kIHNldAotCWFuZCByZXR1cm4gR09UX3N5bWJvbCBpZiBpdCBtYXRjaGVzLgotCShGLCBNQVApOiBNb3ZlIG1hY3JvIGRlZmluaXRpb25zIG91dHNpZGUgZnVuY3Rpb24uCi0JKHRjX2dlbl9yZWxvYyk6IE9ubHkgc3dpdGNoIG9uIHNpemUgYW5kIHBjcmVsIGlmIGNvZGUgd2Fzbid0Ci0JYWxyZWFkeSBzdXBwbGllZCBhcyBQTFQzMi4gR09UMzIsIEdPVE9GRiwgb3IgR09UUEMuICBDb252ZXJ0Ci0JQkZEX1JFTE9DXzMyIHVzaW5nIEdPVF9zeW1ib2wgaW50byBHT1RQQy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRDX1JFTE9DLCB0Y19maXhfYWRqdXN0YWJsZSwKLQlUQ19SRUxPQ19HTE9CQUxfT0ZGU0VUX1RBQkxFLCBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVApOiBOZXcKLQltYWNyb3MuCi0JKE5FRURfRlhfUl9UWVBFKTogRGVmaW5lLgotCShMT0NBTF9MQUJFTCk6IEFjY2VwdCAiLlgiIHByZWZpeCB0b28uCi0JKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk6IERlZmF1bHQgdG8gIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIuCi0KLU1vbiBTZXAgMTIgMTc6NTE6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3R5cGUpOiBSZXdyaXRlIHRvIGFjY2VwdCBzeW50YXgKLQlyZXBvcnRlZGx5IHRvIGJlIHVzZWQgb24gSXJpeCA2LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBIYW5kbGUgLmdsb2JsIGFuZCAuZ2xvYmFsLgotCShzX21pcHNfZ2xvYmwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uOyBuZWVkZWQgZm9yIElyaXggNSBzdXBwb3J0LgotCSogZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IElmIEJTRl9GVU5DVElPTiBpcyBzZXQgZm9yIGFuCi0JZXh0ZXJuYWwgc3ltYm9sIHdpdGggbm8gdHlwZSwgc2V0IHRoZSB0eXBlIHRvIHN0X1Byb2MgcmF0aGVyIHRoYW4KLQlzdF9HbG9iYWwuICBEb24ndCBzZXQgdGhlIGluZGV4IG9mIGFuIGV4dGVybmFsIHN0X1Byb2Mgb3IKLQlzdF9TdGF0aWNQcm9jIHN5bWJvbCB1bmxlc3MgaXQgaXMgYWxzbyBhIGxvY2FsIHN5bWJvbC4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIGFzX3doZXJlIGlzCi0JdW5zaWduZWQgaW50ICosIG5vdCBpbnQgKi4KLQotVGh1IFNlcCAgOCAxNzoxODoyNCAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggOiBDaGFuZ2UgbmFtZXMgdG8gIE9CSl9HRU5FUkFURV9BU01fTElORU5PLAotCWFuZCBnZW5lcmF0ZV9hc21fbGluZW5vLgotCSogY29uZmlnL29iai1lbGYuaCA6IGRpdHRvLgotCSogcmVhZC5oIDogZGl0dG8uCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGlmIG5vIGZpbGUgd2hlbiBpbnN0IGlzIHJlYWQsIHNldAotCWdlbmVyYXRlX2FzbV9saW5lbm8gdG8gdHJ1ZS4KLQkqIGVjb2ZmLmggOiBjaGFuZ2UgbmFtZSB0byBnZW5lcmF0ZV9hc21fbGluZW5vIGFuZCBhZGQgZnVuY3Rpb24KLQllY29mZl9ub19jdXJyZW50X2ZpbGUuCi0JKiBlY29mZi5jIDogY2hhbmdlIG5hbWUgdG8gZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pIDogbmV3IGZ1bmN0aW9uLCB0byBnZW5lcmF0ZQotCWVjb2ZmIHN0eWxlIGxpbmUgZm9yIGFzbSBmaWxlLgotCi1UaHUgU2VwICA4IDE5OjQzOjQ5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IERvIGFuIGZwcmludGYgdG8gc3RkZXJyIHJhdGhlcgotCXRoYW4gYSBwcmludGYuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgYXNfYmFkX3doZXJlIHJhdGhlciB0aGFuIGFzX2JhZC4KLQotV2VkIFNlcCAgNyAxNzoyMToxMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMte2g4MzAwLHNofS5bY2hdICh0Y19jb2ZmX3N5bWJvbF9lbWl0KTogRnVuY3Rpb24gZG9pbmcKLQlub3RoaW5nIGJlY29tZXMgbWFjcm8gZG9pbmcgbm90aGluZy4KLQotV2VkIFNlcCAgNyAxOToxMDowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBEZXBlbmQgb24gY29uZmlnLnN0YXR1cy4KLQkoY29uZmlnLnN0YXR1cyk6IFJ1biBjb25maWcuc3RhdHVzIGZyb20gLiBpbnN0ZWFkIG9mIHNyY2Rpci4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogVXNlIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIHRvCi0JZGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgcmVsb2NhdGlvbiB0eXBlIHRoYXQgY291bGRuJ3QgYmUgaGFuZGxlZC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jICh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4gIERlbGV0ZWQgYWJvcnQgY2FsbAotCWFmdGVyIGNhbGwgdG8gYXNfZmF0YWwuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWxpbnV4Kik6IERvbid0IHNldCBiZmRfZ2FzLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0NfRk9SX1RBUkdFVCwgTk1fRk9SX1RBUkdFVCwgT0JKRFVNUF9GT1JfVEFSR0VULAotCWluc3RhbGwsIHVuaW5zdGFsbCk6IERvbid0IHVzZSAiYnJva2Vuc2VkIiBoYWNrIGFueSBtb3JlLCB0aGUgbmV3Ci0JYXV0b2NvbmYgY29kZSBzaG91bGQgbmV2ZXIgbGV0IHByb2dyYW1fdHJhbnNmb3JtX25hbWUgYmUgZW1wdHkuCi0KLQlVcGRhdGUgZm9yIGF1dG9jb25mIGJldGEgMS4xMTI6Ci0JKiBhY2xvY2FsLm00IChHQVNfQ0hFQ0tfREVDTF9ORUVERUQsIEdBU19XT1JLSU5HX0FTU0VSVCk6IE5ldwotCW1hY3Jvcy4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIHRoZW0uICBVc2UgQUNfQVJHX1BST0dSQU0gKG5vdyBwcm92aWRlZCBieQotCWF1dG9jb25mKSBpbnN0ZWFkIG9mIG15IGhhY2tlZC11cCBBQ19QUk9HUkFNX1RSQU5TRk9STV9OQU1FLiAgTW92ZQotCXRlc3QgZm9yIENST1NTX0NPTVBJTEUganVzdCBiZWZvcmUgQUNfRlVOQ19BTExPQ0EsIGFuZCBlbWl0IGEKLQltZXNzYWdlIHRvIHRyeSB0byBlYXNlIGNvbmZ1c2lvbiBhYm91dCBhdXRvY29uZidzCi0JImNyb3NzLWNvbXBpbGluZyIgbWVzc2FnZS4KLQkqIGFjY29uZmlnLmggKE5FRURfREVDTEFSQVRJT05fTUFMTE9DLCBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUsCi0JTkVFRF9ERUNMQVJBVElPTl9FUlJOTyk6IFJlbmFtZWQgZnJvbSBORUVEXypfREVDTEFSQVRJT04uCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlZ2VuZXJhdGVkLgotCi1XZWQgU2VwICA3IDEyOjQ5OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGVjayAke2hvc3R9IGFuZCAke3RhcmdldH0gcmF0aGVyIHRoYW4KLQkke2hvc3RfY2Fub259IGFuZCAke3RhcmdldF9jYW5vbn0uCi0JKiBjb25maWd1cmU6IExpa2V3aXNlLgotCi1UdWUgU2VwICA2IDExOjQyOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19jcHUpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShpbnNuc19zaW5jZV9jYWNoZV9hY2Nlc3MpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9iZWdpbik6IFNldCBtaXBzX2NwdSBhcyB3ZWxsIGFzIG1pcHNfaXNhLgotCShhcHBlbmRfaW5zbik6IElmIG1pcHNfY3B1IGlzIDQ2MDAsIHJlcXVpcmUgZm91ciBub3AgaW5zdHJ1Y3Rpb25zCi0JYmV0d2VlbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBhY2Nlc3NlcyB0aGUgY2FjaGUgYW5kIGNlcnRhaW4gQ0FDSEUKLQlpbnN0cnVjdGlvbnMuICBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHNlZW4gc2luY2UKLQlhbiBpbnN0cnVjdGlvbiB3aGljaCBhY2Nlc3NlcyB0aGUgY2FjaGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBtaXBzX2NwdSBhcyB3ZWxsIGFzIG1pcHNfaXNhLgotCi1Nb24gU2VwICA1IDA3OjA5OjAwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKFZQQVRIKTogRGVmaW5lIHVzaW5nIEBzcmNkaXJALgotCShwcmVmaXgsIHByb2dyYW1fdHJhbnNmb3JtX25hbWUsIGV4ZWNfcHJlZml4KTogVXNlIGF1dG9jb25mIHN0eWxlCi0JQC1zdWJzdGl0dXRpb25zLgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGNvbmZpZy9oby1yaXNjaXguaCwgY29uZmlnL3RjLWFybS5jLCBjb25maWcvdGMtYXJtLmg6IE5ldyBmaWxlcwotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgdGhlIGFybS4KLQotRnJpIFNlcCAgMiAxNjowNTo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGFkZF9maWxlKTogRG9uJ3QgdHJ5IHRvIGdlbmVyYXRlIGxpbmUgbnVtYmVycyBpZiB0aGUKLQlzeW1ib2wgdGFibGUgaGFzIGJlZW4gZnJvemVuLgotCi1UaHUgU2VwICAxIDE5OjQ4OjAxIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFjbG9jYWwubTQgKEFDX1BST0dfQ0MpOiBVc2UgQUNfREVGVU4sIGFuZCBvbWl0IEFDX1BST1ZJREUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSGFuZGxlIHVzZXItc3BlY2lmaWVkIGJmZC1hc3NlbWJsZXIgb3B0aW9uIHdpdGgKLQlzZXBhcmF0ZSB2YXJpYWJsZSBmcm9tIHByZWZlcnJlZCBjb25maWd1cmF0aW9uLCB1bnRpbCB0aGUgdHdvIGFyZQotCXJlc29sdmVkLiAgSW5kaWNhdGUgYmZkX2dhcz1wcmVmZXJyZWQgZm9yIGxpbnV4IGEub3V0LiAgVXNlCi0JQUNfUFJPR1JBTV9UUkFOU0ZPUk1fTkFNRSwgZm9yIHdoaWNoIGEgcGF0Y2ggaGFzIGJlZW4gc2VudCB0byBkam0uCi0JKiBNYWtlZmlsZS5pbiAodGFyZ2V0X2FsaWFzLCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKTogRGVmaW5lLAotCXVzaW5nIGF1dG9jb25mIEAtc3Vic3RpdHV0aW9ucy4KLQotV2VkIEF1ZyAzMSAxNzo0MzowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBhdG9mLWdlbmVyaWMuYzogRGVsZXRlZCBhbGxvY2EgaGFuZGxpbmcgaGVyZS4KLQotCSogTWFrZWZpbGUuaW4gKHByZWZpeCwgZXhlY19wcmVmaXgpOiBVc2UgQC1zdWJ0aXR1dGlvbnMuCi0KLQkqIGFjbG9jYWwubTQgKEFDX09VVFBVVF9MSU5LUyk6IERlbGV0ZWQgcmVkZWZpbml0aW9uLCBzaW5jZQotCWF1dG9jb25mIDEuMTA5IGhhcyB0aGlzIGZpeGVkLgotCSogY29uZmlndXJlLmluOiBEb24ndCBjaGFuZ2UgcXVvdGUgY2hhcmFjdGVycyBhcm91bmQgQUNfTVNHX0VSUk9SCi0JaW52b2NhdGlvbi4gIERvbid0IHVzZSBBQ19IRUFERVJfU1REQywgc2luY2UgaXQgcmVxdWlyZXMgcnVubmluZyBhCi0JcHJvZ3JhbS4gIENhY2hlIE5FRURfKl9ERUNMQVJBVElPTiB2YWx1ZXMuCi0JKiBjb25maWd1cmUsIGNvbmYuaW46IFJlZ2VuZXJhdGVkIHdpdGggYSBtb2RpZmllZCBhdXRvY29uZiAxLjEwOS4KLQotCSogYXMuaCAodm9sYXRpbGUpOiBEb24ndCB0ZXN0IG9yIGRlZmluZSBoZXJlOyBub3QgbmVlZGVkLgotCShhbGxvY2EpOiBSZXBsYWNlIGFsbG9jYS1jb25mLmggaW5jbHVzaW9uIHdpdGggY29kZSByZWNvbW1lbmRlZCBpbgotCWF1dG9jb25mIGRvY3VtZW50YXRpb24uICBJbmNsdWRlIGNvbmZpZy5oIGZpcnN0LgotCi1XZWQgQXVnIDMxIDExOjIwOjQ4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfREVGSU5FRCk6IEFic29sdXRlIHN5bWJvbHMgYXJlIGRlZmluZWQKLQlhbHNvLgotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZ3VyZTogSW5pdGlhbGl6ZSBiZmRfZ2FzIHRvIG5vLgotCi1UdWUgQXVnIDMwIDE5OjMxOjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IEluY2x1ZGUgYWxsb2NhLWNvbmYuaCBmcm9tICJsaWJpYmVydHkiLCBub3QKLQkiLi4vbGliaWJlcnR5Ii4KLQotTW9uIEF1ZyAyOSAxNjoxMTozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWRfYXBwbHlfZml4KTogRG9uJ3QgZ2VuZXJhdGUgYSByZWxvYyB3aGVuIGEKLQlzeW1ib2wgaXMgdXNlZCBhcyBhbiBvZmZzZXQgaW50byBhIENTRUNUIHRoYXQgaXMgbm90IGEgVE9DLiAgVGhlc2UKLQl0eXBlcyBvZiBsb2FkcyBhcmUgZ2VuZXJhdGVkIGJ5IGdjYyAtbW1pbmltYWwtdG9jLgotCi1TdW4gQXVnIDI4IDEzOjIyOjUyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoZmxhZ18qKTogQWRkZWQgY29tbWVudHMgZGVzY3JpYmluZyBtZWFuaW5ncyBvZiBzb21lIG9mCi0JdGhlc2UgdmFyaWFibGVzLgotCShzdHJ1Y3QgZnJhZyk6IEFkZCBzb21lIGNvbW1lbnRzIGFib3V0IHRoZSBuczMyay1zcGVjaWZpYyBmaWVsZHMKLQlhbmQgd2h5IHRoZXkncmUgaGVyZS4KLQkoU0laRU9GX1NUUlVDVF9GUkFHKTogQ2FzdCBhZGRyZXNzZXMgdG8gY2hhciosIG5vdCBpbnQuCi0JKGZsYWdfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBTZXQgZmxhZ19wcmludF9zdGF0aXN0aWNzIGluc3RlYWQgb2YKLQlzdGF0aXN0aWNzX2ZsYWcuICBPcHRpb25zIGFycmF5IGlzIG5vdyBjb25zdC4gIEFkZGVkIG5ldyBvcHRpb24KLQkiZHVtcC1jb25maWciOyBpZiBzcGVjaWZpZWQsIHByaW50IFRBUkdFVF9BTElBUywgVEFSR0VUX0NBTk9OSUNBTCwKLQlUQVJHRVRfQ1BVLCBUQVJHRVRfT0JKX0ZPUk1BVCwgYW5kIFRBUkdFVF9GT1JNQVQsIGlmIGRlZmluZWQuCi0JKG1haW4pOiBDaGFuZ2UgdGVzdCB0byBjaGVjayBmbGFnX3ByaW50X3N0YXRpc3RpY3MuCi0JKHN0YXRpc3RpY3NfZmxhZyk6IERlbGV0ZWQuCi0KLQkqIGZyYWdzLmMgKGZyYWdfdmFyaWFudCk6IFJlbW92ZWQgUENSRUxfQURKVVNUIGFuZCBCU1IgYXJndW1lbnRzLgotCUFsd2F5cyBpbml0aWFsaXplIHRoZW0gdG8gemVyby4KLQkqIGZyYWdzLmggKGZyYWdfdmFyaWFudCk6IEZpeGVkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGdldF9jZGlzcCk6IERvbid0IHBhc3MgdGhlIGV4dHJhIHplcm8gYXJncy4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChjb252ZXJ0X2lpZik6IERvbid0IHBhc3MgdGhlIGFyZ3VtZW50czsgY2FjaGUKLQl0aGUgdmFsdWUgb2YgZnJhZ19ub3cgYW5kIGZpbGwgaW4gdGhlIGZpZWxkcyBsYXRlci4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogUmVtb3ZlIG5ldwotCWNvbmZpZ3VyZS1nZW5lcmF0ZWQgZmlsZXMuCi0KLVNhdCBBdWcgMjcgMjA6MjY6MTIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tKQotCi0JQ29udmVyc2lvbiB0byBhdXRvY29uZjoKLQkqIGFjY29uZmlnLmgsIGFjbG9jYWwubTQ6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbjogUmV3cml0dGVuIChleGNlcHQgZm9yIHNvbWUgdGFyZ2V0LXNwZWNpZmljIGNvZGUpCi0JZm9yIGF1dG9jb25mLgotCSogY29uZi5pbiwgY29uZmlndXJlOiBOZXcgZmlsZXMsIGdlbmVyYXRlZCBmcm9tIHRoZSBhYm92ZS4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIG1hZ2ljIHNlcXVlbmNlIGluZGljYXRpbmcgaW5zZXJ0aW9uIG9mCi0JbWFrZWZpbGUgZnJhZ21lbnRzLgotCShWUEFUSCwgc3JjZGlyLCBDQywgTElCUywgT0JKUyBkZXBlbmRlbmNpZXMpOiBVc2UgQC1zdWJzdGl0dXRpb25zCi0JZnJvbSBjb25maWd1cmUuCi0JKExJTktFRF9IRUFERVJTKTogRGVsZXRlZCBhLm91dC5nbnUuaCwgYS5vdXQuaCwgYW5kIGhvc3QuaC4KLQkoY29uZmlnLnN0YXR1cywgY29uZmlndXJlKTogUmV3cml0ZSBydWxlcy4KLQkoY29uZmlnLXN0YW1wKTogRGVwZW5kIG9uIGNvbmYuICBTa2lwIHZhcmlhYmxlcyB0aGF0IGNvbmZpZ3VyZSBpcwotCW5vdyBzdWJzdGl0dXRpbmcgaXRzZWxmLgotCSgqLm8gZGVwZW5kZW5jaWVzKTogRGVsZXRlZCBob3N0LmguCi0JKGRpc3RjbGVhbiwgcmVhbGNsZWFuKTogRG9uJ3QgZGVsZXRlIGhvc3QuaC4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgc3RkaW8uaCwgc3RyaW5nLmgsIHN5cy90eXBlcy5oLiAgSW5jbHVkZQotCXNpZ25hbC5oIGFmdGVyIGFzLmguCi0JKiBhcy5oOiBJbmNsdWRlIGFsbG9jYS1jb25mLmggZmlyc3QuICBJbmNsdWRlIGN0eXBlLmgsIHN0cmluZy5oLAotCXN0cmluZ3MuaCwgc3RkbGliLmgsIHVuaXN0ZC5oLCBzeXMvdHlwZXMuaCwgZm9wZW4tYmluLmgsCi0JZm9wZW4tc2FtZS5oLCBhcyBzdWdnZXN0ZWQgYnkgYXV0b2NvbmYgdGVzdCByZXN1bHRzLgotCVtCUk9LRU5fQVNTRVJUXTogRG9uJ3QgaW5jbHVkZSBhc3NlcnQuaC4KLQkoc3RyZHVwKTogRGVjbGFyZS4KLQkodm9sYXRpbGUsIGNvbnN0KTogRGVmaW5lIGlmIG5vdCBfX1NURENfXyBhbmQgbm90IGFscmVhZHkgZGVmaW5lZC4KLQkobWFsbG9jLCByZWFsbG9jKSBbTkVFRF9NQUxMT0NfREVDTEFSQVRJT05dOiBEZWNsYXJlLgotCShmcmVlKSBbTkVFRF9GUkVFX0RFQ0xBUkFUSU9OXTogRGVjbGFyZS4KLQkqIGdhc3AuYzogSW5jbHVkZSBjb25maWcuaCwgc3RkbGliLmggKGlmIEhBVkVfU1RETElCX0gpLiAgRG9uJ3QKLQlpbmNsdWRlIGhvc3QuaC4KLQkobWFsbG9jKSBbTkVFRF9NQUxMT0NfREVDTEFSQVRJT05dOiBEZWNsYXJlLgotCSogbWVzc2FnZXMuYzogSW5jbHVkZSBhcy5oIGZpcnN0LiAgSW5jbHVkZSBlcnJuby5oIG9ubHkgaWYKLQlIQVZFX0VSUk5PX0guICBJZiBIQVZFX1ZBUkFSR1NfSCBhbmQgbm90IF9fU1REQ19fLCB1bmRlZmluZQotCUhBVkVfU1REQVJHX0guICBTZXQgTk9fU1REQVJHIGFuZCBOT19WQVJBUkdTIGFzIGFwcHJvcHJpYXRlLgotCSogZG9jL01ha2VmaWxlLmluIChzcmNkaXIsIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSwKLQlJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYgQC1zdWJzdGl0dXRpb25zLgotCi0JKiBpbnB1dC1maWxlLmM6IERvbid0IGluY2x1ZGUgYXNzZXJ0LmggaGVyZSwgJ2NhdXNlIGFzLmggYWxyZWFkeQotCWluY2x1ZGVzIGl0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYzogQWRkZWQgdmFyaW91cyBwcm90b3R5cGVzIGZvciBzdGF0aWMKLQlmdW5jdGlvbnMuCi0JKGluX3JhbmdlKTogTmV3IGZ1bmN0aW9uLCB0ZXN0cyB3aGV0aGVyIGEgdmFsdWUgY2FuIGZpdCBpbiBhbgotCU4tYml0IGZpZWxkLgotCShidWlsZF9tZW0sIGJ1aWxkX29wZXJhdGVfbik6IE5ldyBmdW5jdGlvbnMgZm9yIGNvbnN0cnVjdGluZwotCW9wY29kZSB2YWx1ZXMuCi0JKGVtaXRfc2xsX24sIGVtaXRfbGRhaF9udW0sIGVtaXRfYWRkcV9yLCBlbWl0X2xkYV9uKTogTmV3Ci0JZnVuY3Rpb25zIGZvciBlbWl0dGluZyBzaW5nbGUgaW5zdHJ1Y3Rpb25zLCBubyBsb25nZXIgcmVxdWlyaW5nIGEKLQlyZWN1cnNpdmUgY2FsbCB0byBtZF9hc3NlbWJsZS4KLQkoZW1pdF9hZGQ2NCk6IE5ldyBmdW5jdGlvbiBmb3IgZXhwYW5kaW5nIGEgUkVHOj1SRUcrQ09OU1QKLQlvcGVyYXRpb24gaW50byBvbmUgb3IgbW9yZSBpbnN0cnVjdGlvbnMsIHRvIGhhbmRsZSB3aWRlIGNvbnN0YW50cy4KLQkoY2xlYXJfaW5zbik6IE5ldyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBGaWxsIGl0IGluIHdpdGggemVyb3MgYW5kIEJGRF9SRUxPQ19OT05FIHZhbHVlcy4KLQkoYWxwaGFfaXApOiBVc2UgaXQgdG8gaW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZSBpbnNucy4KLQkoYWxwaGFfaXAsIGxhYmVsICJpbW1lZGlhdGUiIGFuZCBjYXNlcyAnUCcsICdHJyk6IFVzZSBlbWl0X2FkZDY0Ci0JZm9yIGNhbGN1bGF0aW9ucy4KLQotRnJpIEF1ZyAyNiAxNDo0NjoxNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc2VjdGlvbl9zeW1ib2wpOiBSZXZlcnNlIHN0aWxsLXdyb25nIHRlc3Qgb2YKLQlFTUlUX1NFQ1RJT05fU1lNQk9MUy4KLQotCSogd3JpdGUuYyAoQkZEX0ZBU1RfU0VDVElPTl9GSUxMKTogQWx3YXlzIGRlZmluZS4KLQkod3JpdGVfY29udGVudHMpOiBJZiBmaWxsX3NpemUgaXMgMSwgdXNlIG1lbXNldCBpbnN0ZWFkIG9mIGxvb3BpbmcKLQljYWxsaW5nIG1lbWNweS4KLQotV2VkIEF1ZyAyNCAxMjo0NjowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMKTogRGVmaW5lIGFzIDAsIGZvciBjb21wYXRpYmlsaXR5Ci0Jd2l0aCBuYXRpdmUgTUlQUyBhc3NlbWJsZXIuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1pcml4Kik6IERvbid0IHNldCBlbXVsYXRpb24uCi0JKiBjb25maWcvdGUtaXJpeC5oOiBSZW1vdmUuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N5bWJvbF9uZXdfaG9vayk6IERvbid0IGFkZCBhIG5ldyBmaWxlIGlmIHdlCi0JaGF2ZW4ndCBzZWVuIGFueSBpbnB1dCBmaWxlcyB5ZXQuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfYmVnaW4pOiBKdXN0IGNhbGwgc3ltYm9sX2NyZWF0ZSwgcmF0aGVyCi0JdGhhbiBjYWxsaW5nIHN5bWJvbF9uZXcgYW5kIHRoZW4gcmVtb3ZpbmcgdGhlIHN5bWJvbCBmcm9tIHRoZQotCWxpc3QuCi0KLQkqIGFzLmMgKG1haW4pOiBNb3ZlIGEgaW5zaWRlIHRoZSAjaWYgMCBibG9jayB3aGljaCB1c2VzIGl0LgotCSogZWNvZmYuYyAoY3VycmVudF9zdGFic19maWxlbmFtZSk6IE1ha2UgY29uc3QuCi0JKiBmcmFncy5oIChmcmFnX2FsaWduX3BhdHRlcm4pOiBEZWNsYXJlLgotCSogZ2FzcC5jIChuZXdfZmlsZSk6IENhc3QgaXNwIHRvIGxvbmcsIGFuZCB1c2UgJWxkIHRvIHByaW50IGl0LgotCSogY29uZmlnL3RjLWFscGhhLmggKG1kX29wZXJhbmQpOiBBZGQgY2FzdCB0byB2b2lkLgotCShhbHBoYV9kb19hbGlnbik6IERlY2xhcmUgYXJndW1lbnQgdHlwZXMuCi0JKHRjX2dldF9yZWdpc3Rlcik6IERlY2xhcmUuCi0JKGFscGhhX2Zyb2JfZWNvZmZfZGF0YSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtYWxwaGEuYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKHNfbWFzayk6IERvbid0IGRlY2xhcmU7IGRvZXMgbm90IGV4aXN0LgotCShsaW5lX2NvbW1lbnRfY2hhcnMpOiBSZW1vdmUgLyogZnJvbSBkZXNjcmlwdGl2ZSBjb21tZW50LgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBSZW1vdmUgdW51c2VkIGxvY2FsIHJlZy4KLQkodGNfZ2VuX3JlbG9jKTogRG9uJ3QgYm90aGVyIHRvIGNvbXBhcmUgdW5zaWduZWQgdG8gemVyby4KLQkoc19iYXNlKTogQ29ycmVjdCB3YXJuaW5nIHRvIGFjdHVhbGx5IHByaW50IHJlZ2lzdGVyIG51bWJlci4KLQkobWRfYmVnaW4pOiBSZW1vdmUgdW51c2VkIGxvY2FscyByZXR2YWwsIGxvc2UsIGFuZCBpLgotCShhbHBoYV9maXhfYWRqdXN0YWJsZSk6IE1vdmUgZGVmYXVsdCBjYXNlIGluc2lkZSBzd2l0Y2ggdG8gYXZvaWQKLQl3YXJuaW5nLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogUmVtb3ZlIHVudXNlZCBsb2NhbHMgcmVsb2NfYWRkciwgcCwgc3ltLAotCWFuZCBhZGRlbmQuCi0JKGVtaXRfYnl0ZV9tYW5pcF9yKTogRGVjbGFyZSB0eXBlcyBmb3IgYWxsIGFyZ3VtZW50cy4KLQkoZW1pdF9leHRyYWN0X3IsIGVtaXRfaW5zZXJ0X3IsIGVtaXRfbWFza19yKTogTGlrZXdpc2UuCi0JKGVtaXRfc2lnbl9leHRlbmQsIGVtaXRfYmlzX3IsIHNfcHJvYyk6IExpa2V3aXNlLgotCShhbHBoYV9pcCk6IFVzZSBzcHJpbnRfdmFsdWUgdG8gcHJpbnQgb2Zmc2V0VCB2YWx1ZS4gIFJlbW92ZQotCXVudXNlZCBsb2NhbCBzaXplLiAgUmVtb3ZlIHVudXNlZCBsYWJlbCBnZXRfbWFjcm8uCi0JKGFscGhhX2RvX2FsaWduKTogTWFrZSBmaWxsIGNvbnN0LgotCShtZF9hcHBseV9maXgpOiBSZW1vdmUgdW51c2VkIGxhYmVsIGNoZWNrX3pvdi4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaTU4NiBhcyBhIHN5bm9ueW0gZm9yIGlbMzRdODYuCi0KLVR1ZSBBdWcgMjMgMTI6MzI6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY19saW5lX25ldyk6IENoYW5nZSBsaW5lX251bWJlciBhcmd1bWVudCBmcm9tCi0JdW5zaWduZWQgc2hvcnQgdG8gaW50IHNvIHRoYXQgdGhlIHR5cGUgaW4gdGhlIHByb3RvdHlwZSBtYXRjaGVzCi0JdGhlIHByb21vdGVkIHR5cGUgaW4gdGhlIGRlZmluaXRpb24uCi0JKHN0YWNrX2RlbGV0ZSk6IENvbW1lbnQgb3V0OyBub3QgdXNlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBEZWNsYXJlIGlmIG5vdAotCUJGRF9BU1NFTUJMRVIsIG5vdCBpZiBCRkRfQVNTRU1CTEVSLiAgRGVjbGFyZSBhcmd1bWVudCB0eXBlLgotCSogY29uZmlnL3RjLW02OGsuaCAodGNfY29mZl9zaXplbWFjaGRlcCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbTY4ay5jICh0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2spOiBBZGQgaWdub3JlZAotCWFyZ3VtZW50LgotCi1UdWUgQXVnIDE2IDAxOjQ4OjIwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFVuZG8gbGFzdCBjaGFuZ2UuICBTZXQgc3lfZnJhZyBmb3IKLQl0aGUgY29tbW9uIHN5bWJvbCB0byB0aGUgemVybyBhZGRyZXNzIGZyYWcgKHRoZSBjb3JyZWN0IGZpeCkuCi0KLVR1ZSBBdWcgMTYgMDE6NDg6MjAgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9jb25maWcvdGMtaHBwYS5jIChwYV9jb21tKTogVW5kbyBsYXN0IGNoYW5nZS4gIFNldCBzeV9mcmFnIGZvcgotCXRoZSBjb21tb24gc3ltYm9sIHRvIHRoZSB6ZXJvIGFkZHJlc3MgZnJhZyAodGhlIGNvcnJlY3QgZml4KS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IFNldCBzeV9yZXNvbHZlZCBmb3IgdGhlIGNvbW1vbgotCXN5bWJvbC4KLQotRnJpIEF1ZyAxMiAxNzo1MTo0OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRHJvcCAiZWwiIGZyb20gdGhlIGVuZCBvZgotCVRBUkdFVF9DUFUuICBDaGVjayBmb3IgbWlwczY0b3Jpb24uCi0KLVR1ZSBBdWcgIDkgMTk6NDM6NDUgMTk5NCAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgUmVjb2duaXplIHBwYy0qLW5ldHdhcmUuCi0JKiBjb25maWcvdGUtcHBjbncuaDogIE5ldyBmaWxlIHRvIHN1cHBvcnQgUG93ZXItUEMvTmV0d2FyZQotCWNvbmZpZ3VyYXRpb25zLiAgQ3VycmVudGx5LCBpdCBqdXN0IGVuYWJsZXMgdGhlIHVzZSBvZiBiYWNrc2xhc2gKLQllc2NhcGVzIGluIHN0cmluZyBkaXJlY3RpdmVzLgotCi1UdWUgQXVnICA5IDExOjEyOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfc3RhYngpOiBDYWxsIGV4cHJlc3Npb24gZGlyZWN0bHksIHJhdGhlcgotCXRoYW4gdmlhIHBzZXVkb19zZXQuICBJZiBleHByZXNzaW9uIGlzIGEgc3ltYm9sLCBtb3ZlIHN0YWIgc3ltYm9sCi0JdG8ganVzdCBhZnRlciBzeW1ib2wgZnJvbSBleHByZXNzaW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9wcm9jcyk6IERvbid0IGZvcmNlIGFkciBvZiBmaXJzdCBmZHIgdG8gYmUKLQl6ZXJvLiAgVW5kb2VzIGNoYW5nZSBvZiBKdW5lIDQsIDE5OTMuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3BhcnNlX29wdGlvbik6IEFjY2VwdCAtbWNwdT00NDAwLCA0NjAwLCBhbmQKLQlvcmlvbi4KLQotTW9uIEF1ZyAgOCAxNjoyODowOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBSZW1vdmUgRk9QRU5fV0IgcGF0Y2ggb2YgQXVnIDYuCi0JKiBjb25maWd1cmUuaW46IENvbmZpZ3VyZSBmb3IgaG8tZ28zMiBjb3JyZWN0bHkuCi0JKiBjb25maWcvaG8tZ28zMi5oOiBGaXggY29weXJpZ2h0LgotCi1Nb24gQXVnICA4IDExOjU5OjUxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogRGVsZXRlIHJlZHVuZGFudAotCXVwcGVyLWNhc2UgdmVyc2lvbnMgb2YgdGhlIHBzZXVkby1vcHMuCi0KLU1vbiBBdWcgIDggMTM6NDI6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogSWYgd2UgYXJlIGdvaW5nIHRvIGdlbmVyYXRlIGEKLQlub24gUEMgcmVsYXRpdmUgcmVsb2MsIGRvbid0IHB1dCB0aGUgYWRkZW5kIGluIHRoZSBvYmplY3QgZmlsZS4KLQotU2F0IEF1ZyAgNiAwMToxNTowMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBJZiBGT1BFTl9XQiBpcyBub3QgZGVmaW5lZCwgZG8gdGhlIHJpZ2h0IHRoaW5nIGluIGEgZ28zMgotCWVudmlyb25tZW50LgotCi1Nb24gSnVsIDExIDExOjM0OjUyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChwaW50KTogTmV3IGZ1bmN0aW9uIGZvciBoYW5kbGluZyB2YXJ5aW5nCi0Jc2l6ZSBvZiBpbnQgcHNldWRvIG9wLgotCSogZG9jL2FzLnRleGluZm86IEZpeCB0eXBvIGRlc2NyaWJpbmcgLmg4MzAwaCBwc2VkdW9wLgotCi1Nb24gQXVnICAxIDAyOjQwOjQzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3NwYWNlKTogSW5pdGlhbGl6ZSBzZF9zdWJzcGFjZXMKLQlmaWVsZCBpbiB0aGUgc3BhY2UgY2hhaW4uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IENhc3QgcmV0dXJuIHZhbHVlIGZyb20KLQlocHBhX2dlbl9yZWxvY190eXBlLgotCi1UaHUgSnVsIDI4IDE1OjQ1OjM3IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IENoZWNrIG1vcmUgY2FyZWZ1bGx5IGZvcgotCWNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyZXMuCi0JKG1kX3BhcnNlX29wdGlvbikgW05PX1Y5XTogQ29tcGxhaW4gaWYgdjkgd2FzIHNlbGVjdGVkLgotCShtZF9zaG93X3VzYWdlKTogRGVyaXZlIGFyY2hpdGVjdHVyZSBsaXN0IGluIHVzYWdlIG1lc3NhZ2UgZnJvbQotCWFyY2hpdGVjdHVyZV9wbmFtZSBhcnJheS4KLQkoY3lwcmVzcyk6IE1hY3JvIGRlbGV0ZWQuCi0JKG9wX2hhc2gpOiBEb24ndCBpbml0aWFsaXplLgotCShzX2NvbW1vbik6IFVzZSBiZmRfdW5kX3NlY3Rpb25fcHRyIGluc3RlYWQgb2YgYmZkX3VuZF9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoQlNSKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19pcCk6IFVzZSBpdCBmb3IgcmlnaHQtc2hpZnQgb3BlcmF0aW9ucyBvZiAzMiBiaXRzIG9yIG1vcmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEltcGxlbWVudCBuZXcgb3BlcmFuZCB0eXBlICd4Jy4KLQotVHVlIEp1bCAyNiAxODoyMToyNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogTW92ZWQgY29tbW9uIGluY2x1ZGVzIGFuZCBUQVJHRVRfRk9STUFUCi0JZGVmaW5pdGlvbnMgdG9nZXRoZXIuCi0JKFdPUktJTkdfRE9UX1dPUkQsIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQsCi0JT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIsIEJGRF9IRUFERVJTLCBCRkQpIFshQkZEX0FTU0VNQkxFUl06Ci0JTW92ZWQgdGhlc2UgZGVmaW5pdGlvbnMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLCBiZWZvcmUgdGhlCi0JaW5jbHVkZXMuCi0JKFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMsIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTKTogQWx3YXlzCi0JZGVmaW5lIHRoZXNlLgotCShTX0dFVF9aRVJPRVMpOiBEZWxldGVkLgotCShTX1NFVF9aRVJPRVMpOiBNb3ZlZCB0byBvYmotY29mZi5jLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfKiBwc3VlZG8tb3AgZm5zKTogRGVsZXRlZAotCWZvcndhcmQgZGVjbGFyYXRpb25zLgotCShvYmpfcHNldWRvX3RhYmxlKTogTW92ZWQgdG8gb25lIHZlcnNpb24gZW5kIG9mIGZpbGUsCi0JY29uZGl0aW9uYWxpemVkIGludGVybmFsbHkuCi0JKHN0YWNrIHR5cGVkZWYsIHN0YWNrX2luaXQsIHN0YWNrX2RlbGV0ZSwgc3RhY2tfcHVzaCwgc3RhY2tfcG9wLAotCXRhZ19oYXNoLCB0YWdfaW5pdCwgdGFnX2luc2VydCwgdGFnX2ZpbmQsIHRhZ19maW5kX29yX21ha2UpOiBNb3ZlZAotCXRvIG9uZSBjb21iaW5lZCB2ZXJzaW9uIGF0IHRvcCBvZiBmaWxlLCB1bmNvbmRpdGlvbmFsLiAgRGVsZXRlZAotCWZvcndhcmQgZGVjbGFyYXRpb25zLgotCShzX2dldF9uYW1lKTogTW92ZWQgb25lIGNvcHkgb2YgZGVjbGFyYXRpb25zIHRvIHN0YXJ0IG9mIGZpbGUuCi0JKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOiBEaXR0by4gIERvbid0IGluaXRpYWxpemUuCi0JKFNfU0VUX1pFUk9FUyk6IE1vdmVkIGhlcmUgZnJvbSBvYmotY29mZi5oLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IElmIFRDX0NPRkZfU0VUX01BQ0hJTkUgaXMgZGVmaW5lZCwgY2FsbCBpdCBvbgotCXRoZSBmaWxlIGhlYWRlcnMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzZWdfaW5mb19vZmZfYnlfNCk6IE5vdyBjb25zdCBhbmQgc3RhdGljLgotCShTRUdfSU5GT19GUk9NX1NFR19OVU1CRVIpOiBVbnVzZWQgbWFjcm8gZGVsZXRlZC4KLQkocHJldmlvdXNfZmlsZV9zeW1ib2wsIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9leHRlcm5QLAotCXN5bWJvbF9leHRlcm5fbGFzdFAsIGxhc3RfZnVuY3Rpb25QKSBbIUJGRF9BU1NFTUJMRVJdOiBEb24ndAotCWJvdGhlciBleHBsaWNpdGx5IGluaXRpYWxpemluZyB0byB6ZXJvIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCkgW1RDX0k5NjBdOiBVc2UgU0ZfR0VUX0JBTE5BTUUKLQlhbmQgU0ZfR0VUX0NBTExOQU1FIGluc3RlYWQgb2YgdGhlIFRDX1NfSVNfIHZlcnNpb25zLgotCi0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19DT0ZGX1NFVF9NQUNISU5FKTogTmV3IG1hY3JvLiAgQ2FsbHMKLQl0Y19oZWFkZXJzX2hvb2suCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRhcmdfaGFzX2ljbGFzcyk6IFVzZSBJX0NYIHwgSV9DWDIgd2hlcmUgSV9DWAotCXdhcyB1c2VkIHByZXZpb3VzbHkuCi0JKHRjX2hlYWRlcnNfaG9vayk6IElmIElfQ1gyIGlzIGZvdW5kLCBzZXQgZmxhZ3MgdG8gRl9JOTYwQ0EuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHBvX2hhc2gpOiBEZWNsYXJhdGlvbiBkZWxldGVkLgotCShuZXh0X29iamVjdF9maWxlX2NoYXJQKTogRGl0dG8uCi0JKHJlZ25hbWVzLCBhcmVncywgY29qKTogTm93IGNvbnN0LgotCShwYXJzZV9tZW1vcCk6IFN0YXRpYyBhcnJheSBkZWZfc2NhbGUgbm93IGNvbnN0LgotCShtZF9iZWdpbik6IENhc3QgYXdheSBjb25zdCB3aGVuIHBhc3NpbmcgaGFzaCByb3V0aW5lcyBhZGRyZXNzZXMKLQlvZiB2YWx1ZXMgaW4gcmVnbmFtZXMgb3IgYXJlZ3MuCi0JKG1kX2xvbmdvcHRzKTogQWRkZWQgImxpbmstcmVsYXgiIGFuZCAibm8tcmVsYXgiIGh5cGhlbmF0ZWQgZm9ybXMuCi0JQ29udGludWUgdG8gYWNjZXB0IG9uZS13b3JkIGZvcm1zLgotCShzdHJ1Y3QgdGFiZW50cnksIGFyY2hfdGFiKTogTW92ZWQgdG8gdG9wIGxldmVsIGZyb20gaW5zaWRlCi0JbWRfcGFyc2Vfb3B0aW9uLiAgTm93IGNvbnN0LgotCShtZF9zaG93X3VzYWdlKTogVXNlIGFyY2hfdGFiIHRvIGdlbmVyYXRlIHVzYWdlIG1lc3NhZ2UuICBQcmludAotCWh5cGhlbmF0ZWQgZm9ybXMgb2YgcmVsYXggb3B0aW9ucy4KLQotCSogY29uZmlnL3RjLWk5NjAuaCAoREVGSU5FX0k5NjBfQU9VVCwgVENfU19JU18qLCBUQ19TXypfU1lTUFJPQywKLQlUQ19TX0ZPUkNFX1RPXyopOiBNb3ZlZCBmcm9tIGhlcmUuLi4KLQkqIGNvbmZpZy90Yy1pOTYwLmM6IC4uLiB0byBoZXJlLiAgQ2hhbmdlZCBERUZJTkVfSTk2MF9BT1VUIHN0dWZmCi0JdG8gdGVzdCBPQkpfQU9VVCBhbmQgT0JKX0JPVVQgZGlyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmggKENUUkwsIENPQlIsIENPSiwgUkVHLCBNRU0qLCBGQlJBLCBDQUxMSiwKLQlNMS1NMywgUkVHX09QQywgUl8qLCBTRlIsIExJVCwgRlAsIE9QLCBSLCBSUywgUkwsIFJTTCwgRiwKLQl7UixGfXssTH17Miw0fSwgTSwgU0ZSX09LLCBMSVRfT0ssIEZQX09LLCBSRUdfQUxJR04sIE1FTU9QLCBJXyopOgotCU1hY3JvcyBkZWxldGVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChBUkNIX0pYKTogRGVmaW5lLgotCShhcmNoX3RhYik6IEluY2x1ZGUgSlguCi0JKHRhcmdfaGFzX3NmciwgdGFyZ19oYXNfaWNsYXNzKTogSGFuZGxlIEpYLgotCSh0Y19oZWFkZXJzX2hvb2spOiBTZXQgZmxhZ3MgdG8gRl9JOTYwSlggZm9yIGk5NjBKWC4KLQotRnJpIEp1bCAxNSAxNTozNjo1MSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSGFkIGxhc3QgY2hhbmdlIGJhY2t3YXJkcy4KLQotVGh1IEp1bCAxNCAxMzoyMTowNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYXRvZi1uczMyay5jOiBEZWxldGVkLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBVc2UKLQliZmRfaW5kX3NlY3Rpb25fcHRyIGFuZCBiZmRfdW5kX3NlY3Rpb25fcHRyLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENvbXBhcmUgc2VnVCB2YWx1ZXMgZGlyZWN0bHksCi0Jd2l0aG91dCBjYXN0aW5nIHRvIGludCBmaXJzdC4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKG1kX2JlZ2luKTogUmV0dXJuIHZhbHVlIGZyb20gaGFzaF9pbnNlcnQKLQlzaG91bGQgYmUgcG9pbnRlciB0byBjb25zdC4gIERvbid0IGNhbGwgZXhpdCBleHBsaWNpdGx5IGFmdGVyCi0JY2FsbGluZyBhc19mYXRhbDsgaXQgd29uJ3QgcmV0dXJuLgotCShjb252ZXJ0X2lpZik6IE1ha2UgbG9jYWwgdmFyaWFibGUgaiBiZSBwb2ludGVyIHRvIGJpdF9maXhTLCBzaW5jZQotCXRoYXQncyBob3cgaXQncyB1c2VkLgotCShlbmNvZGVfb3BlcmFuZCwgY2FzZSAnYicpOiBJZ25vcmUgc3ByaW50ZiByZXR1cm4gdmFsdWUuICBEb24ndCB0cnkKLQljb252ZXJ0aW5nIGZyZWVwdHIgdG8gaW50IGFuZCBiYWNrLgotCi0JTWVyZ2VkIGluIE5TMzJLIHN1cHBvcnQgdXBkYXRlIGZyb20gSWFuIERhbGwgKGRhbGxAaGZyZC5kc3RvLmdvdi5hdSk6Ci0KLQkqIGNvbmZpZy90ZS1wYzUzMm1hY2guaDogTmV3IGZpbGUuIHBjNTMyLW1hY2ggdGFyZ2V0IGVtdWxhdGlvbi4KLQotCSogY29uZmlnL3RlLW5ldGJzZDUzMi5oOiBOZXcgZmlsZS4gTmV0YnNkNTMyIHRhcmdldCBlbXVsYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgZGVmaW5pdGlvbiBvZiBOT1BfT1BDT0RFLgotCi0JKiBjb25maWcvdGMtbnMzMmsuaDogQWRkIHByb3RvdHlwZSBmb3IgZml4X25ld19uczMya19leHAuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBBZGQgQkZEX0FTU0VNQkxFUiBzdXBwb3J0LgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAodGNfZ2VuX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZml4X25ld19uczMya19leHApOiBHZXQgcmVsb2MgdHlwZQotCWRpZmZlcmVudGx5IGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBHZXQgcmVsb2MKLQl0eXBlIGRpZmZlcmVudGx5IGZvciBCRkRfQVNTRU1CTEVSLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfY3JlYXRlX2xvbmdfanVtcCk6IFNpemUgb2Ygb3Bjb2RlIGlzIG9uZQotCW5vdCAyLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfY29udmVydF9mcmFnKTogQ29kZSBmb3IgdGhlIEJGRF9BU1NFTUJMRVIKLQljYXNlLiBBbHNvIHVzZSBzbWFydCBtZF9wY3JlbF9hZGp1c3QgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9hcHBseV9maXgpOiBDb2RlIGZvciB0aGUgQkZEX0FTU0VNQkxFUgotCWNhc2UuIEFsc28gdXNlIHNtYXJ0IG1kX2ZpeF9wY3JlbF9hZGp1c3QgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9maXhfcGNyZWxfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGNhbgotCWZpbmQgb2Zmc2V0IGZyb20gb3Bjb2RlIHRvIG9wZXJhbmQgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcKLQlhbmQgaW4gdGhlIHByZXNlbmNlIG9mIHJlbGF4aW5nLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfcGNyZWxfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIHdoaWNoIGNhbgotCWZpbmQgb2Zmc2V0IGZyb20gb3Bjb2RlIHRvIG9wZXJhbmQgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcKLQlhbmQgaW4gdGhlIHByZXNlbmNlIG9mIHJlbGF4aW5nLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAobWRfbnVtYmVyX3RvX2Rpc3ApOiBDaGVjayByYW5nZXMgcHJvcGVybHkuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jIChtZF9hdG9mKTogdXNlIGF0b2ZfaWVlZSBpbnN0ZWFkIG9mIHNwZWNpYWwKLQlhdG9mX25zMzJrLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAocmVsb2MpOiBOZXcgKHN0YXRpYykgZnVuY3Rpb24gZm9yCi0JQkZEX0FTU0VNQkxFUi4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogTW9yZSBjb3JyZWN0IHBjIHJlbGF0aXZlIGNvZGUuCi0JbWRfcmVsYXggbXVzdCBiZSBhYmxlIHRvIGZpbmQgb3Bjb2RlIGFkZHJlc3MgZXZlbiBpZiBpbiBhbm90aGVyIGZyYWcuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBNb3JlIGV4dGVuc2l2ZSBjb21tZW50cy4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGVuY29kZV9vcGVyYW5kKTogU3VwcG9ydCBuZXcgb3BlcmFuZCBjbGFzc2VzIEkKLQlhbmQgWi4gRHJvcCBRLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoZml4X25ld19uczMya19leHApOiBuZXcgZnVuY3Rpb24gYW5kCi0JY29ycmVzcG9uZGluZyBwcm90b3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBtYWtlIDMyNTMyIGRlZmF1bHQgbWFjaGluZSBpbnN0ZWFkIG9mIDMyMDMyLgotCi0JKiBjb25maWcvdGMtbnMzMmsuYzogaW5jbHVkZSBvcGNvZGUvbnMzMmsuaCBhZnRlciBhcy5oCi0KLQkqIGFvdXRfZ251Lmg6IHJfZGlzcCBuZWVkcyB0byBiZSAyIGJpdHMgZm9yIFRDX05TMzJLCi0KLQkqIHdyaXRlLmg6IGZ4X2ltX2Rpc3AgbmVlZHMgdG8gYmUgMiBiaXRzIGJpZyBmb3IgVENfTlMzMksKLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IFVzZSBUQ19QQ1JFTF9BREpVU1QgbWFjcm8gKGlmIGRlZmluZWQpCi0JaW5zdGVhZCBvZiBhZGRpbmcgcGNyZWxfYWRqdXN0LgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEFkanVzdCB0b19hZGRyIGZvciB0aGUKLQlCUk9LRU5fRE9UX1dPUkQgZmVhdHVyZSBmb3IgdGhlIEJGRF9BU1NFTUJMRVIgY2FzZS4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBVc2UgVENfQ09OU19GSVhfTkVXIGlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogQWRkIGNvZGUgKGN1cnJlbnRseSBpZgotCUJGRF9GQVNUX1NFQ1RJT05fRklMTCBpcyBkZWZpbmVkKSB0byBtYWtlIGxhcmdlIGZpbGxzIGEgbG90IGZhc3Rlci4KLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgbnMzMmsgZnJvbSBzcGVjaWFsIEZQIGxpc3QuIEFsbCB0aGUgbnMzMmsKLQlzZXJpZXMgdXNlIGllZWUgZmxvYXQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIG5zMzJrLXBjNTMyLW1hY2ggYW5kIG5zMzJrLXBjNTMyLW5ldGJzZCB0YXJnZXRzCi0KLQkqIGFzLmg6IGluY2x1ZGUgZXhwci5oIGJlZm9yZSB0YXJnLWVudi5oLiBTb21lIHRhcmdldCBkZXBlbmRlbnQgZmlsZQotCXdhbnQgdG8gdXNlIGV4cHIgc3RydWN0dXJlcy4KLQotV2VkIEp1bCAxMyAxNDo0OTowNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDaGFuZ2UgcnAgdG8gYmUgYSBjb25zdCBwb2ludGVyLgotCShtZF9wYXJzZV9vcHRpb24pOiBDbGVhciBjcHUgZmllbGQgb2YgY3VycmVudF9hcmNoaXRlY3R1cmUgYmVmb3JlCi0Jc2V0dGluZyBhIG5ldyBjcHUgdHlwZS4gIENsZWFyIG5vXzY4ODgxIGZvciBtNjg4ODEgb3IgbTY4ODgyLgotCUNsZWFyIG5vXzY4ODUxIGZvciBtNjg4NTEuCi0KLVR1ZSBKdWwgMTIgMjE6Mjc6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXN5c3YuaCAocmVhbGxvYyk6IERlY2xhcmUuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IE5ldyBmdW5jdGlvbiwgbW9zdCBvZiB0aGUgZ3V0cyBvZiB0aGUKLQlvbGQgc3ltYm9sX25ldyBmdW5jdGlvbi4KLQkoc3ltYm9sX25ldyk6IE5vdyBqdXN0IGNoZWNrcyBzeW1ib2xfdGFibGVfZnJvemVuLCBjYWxscwotCXN5bWJvbF9jcmVhdGUsIGFuZCBlbnRlcnMgdGhlIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSWYgRU1JVF9TRUNUSU9OX1NZTUJPTFMgaXMgbm90IHRydWUsCi0JYW5kIHRoZSBzeW1ib2wgdGFibGUgaXMgZnJvemVuLCBjYWxsIHN5bWJvbF9jcmVhdGUgaW5zdGVhZCBvZgotCXN5bWJvbF9uZXcuCi0JKiBzeW1ib2xzLmggKHN5bWJvbF9jcmVhdGUsIHN5bWJvbF90YWJsZV9mcm96ZW4pOiBEZWNsYXJlLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKTogQWx3YXlzIGEgZnVuY3Rpb24gbm93LgotCSogc3RydWMtc3ltYm9sLmggKHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKTogRGVsZXRlZCBtYWNybwotCXZlcnNpb24uCi0KLQkqIHN5bWJvbHMuYyAoZGVidWdfdmVyaWZ5X3N5bWNoYWluKTogTmV3IG1hY3JvLCBkZWZpbmVkIHRvIGJlCi0JdmVyaWZ5X3N5bWJvbF9jaGFpbiBvciBhIGNhc3QgdG8gdm9pZCwgZGVwZW5kaW5nIG9uIERFQlVHX1NZTVMuCi0JKG1hbnkgZnVuY3Rpb25zKTogSW52b2tlIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiB1bmNvbmRpdGlvbmFsbHkuCi0KLVR1ZSBKdWwgMTIgMTI6MDY6NDIgMTk5NCAgS3VuZyBIc3UgIChrdW5nQHgxLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogY2hhbmdlIGNhbGxpbmcgaW50ZXJmYWNlIG9mCi0JT0JKX0dFTkVSQVRFX0FTTV9MSU5FX1NUQUIuCi0JKiBjb25maWcvb2JqLWVsZi5oOiBkaXR0by4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogZGl0dG8uCi0JKiBlY29mZi5oOiBjaGFuZ2UgY2FsbGluZyBpbnRlcmZhY2Ugb2YKLQllY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiByZWNvcmQgb2YgZmlsZW5hbWUgdG8gaGFuZGxlIGNhc2Ugb2YgaW5jbHVkZQotCWZpbGVzLCBhbHNvIGNoYW5nZSBkZWZhdWx0IGJ1aWx0LWluIHR5cGUgZnJvbSBpbnQgdG8gdm9pZCBmb3IKLQlhc20gZmlsZS4KLQkqIGVjb2ZmLmMgKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBoYW5kbGUgY2FzZSBvZiBpbmNsdWRlCi0JZmlsZXMuCi0KLU1vbiBKdWwgMTEgMTc6MjA6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEluIGNhc2UgTV9MQV9BQiwgU1ZSNF9QSUMsIGxhcmdlCi0JY29uc3RhbnQsIGFuZCBjYXNlIGxkZF9zdGQsIHNldCBtaXBzX29wdGltaXplIHRvIDIgdGVtcG9yYXJpbHkgdG8KLQlhdm9pZCBpbnNlcnRpbmcgYW4gdW5leHBlY3RlZCBub3AgaW5zdHJ1Y3Rpb24uCi0KLVNhdCBKdWwgIDkgMDA6MDU6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9saW5lbm8pOiBIYW5kbGUgY291bnQgY29ycmVjdGx5IGZvciBsYXN0Ci0JbGluZSBudW1iZXIuCi0KLUZyaSBKdWwgIDggMTU6MjI6MDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChwcm9jZXNzX3BzZXVkb19vcCk6IFBhc3MgcmlnaHQgYXJncyB0byBkbyBkb19haWYuCi0JKGdldF9hbnlfc3RyaW5nKTogTmV3IGFyZyAncHJldGVuZF9xdW90ZScuCi0JKGdldF9hbmRfcHJvY2VzcywgZG9fZm9ybWFscywgbWFjcm9fZXhwYW5kLCBkb19zZGF0YSwKLQlwcm9jZXNzX3BzZXVkb19vcCk6IFVzZSBuZXcgYXJnLgotCi1GcmkgSnVsICA4IDEyOjIzOjQ0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaDogZGVmaW5lIG1hY3JvIE9CSl9HRU5FUkFURV9BU01fTElORV9TVEFCLgotCSogY29uZmlnL29iai1lbGYuaDogZGl0dG8uCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IGdlbmVyYXRlIGxpbmUgc3RhYnMgZm9yIGFzbSBmaWxlLgotCSogcmVhZC5oOiBhZGQgZXh0ZXJuIGdlbmVyYXRlX2FzbV9saW5lX3N0YWIuCi0JKiBlY29mZi5oIDogYWRkIHByb3RvdHlwZSBmb3IgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVfc3RhYigpLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBpZiB0aGVyZSdzIG5vIGZpbGVuYW1lIHByb3ZpZGVkLCBzZXQgc3dpdGNoCi0JdG8gZ2VuZXJhdGUgbGluZSBzdGFicyBmb3IgLnMgZmlsZS4KLQkqIGVjb2ZmLmMgKGFkZF9wcm9jZWR1cmUpOiBhZGQgc3RhYnMgc3ltYm9sIGZvciAuZW50IGRpcmVjdGl2ZS4KLQkqIGVjb2ZmLmMgKGdlbmVyYXRlX2Vjb2ZmX3N0YWIpOiBjcmVhdGVzIGFuIGFydGlmaWNpYWwgc3RhYnMuCi0JKiBlY29mZi5jIChnZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogZ2VuZXJhdGUgYSBhcnRpZml0aWFsIGxhYmVsCi0JZm9yIGVhY2ggbGluZSBhbmQgZ2VuZXJhdGUgYSBzdGFibiBmb3IgdGhlIGxpbmUuCi0KLVRodSBKdWwgIDcgMTc6MDQ6MDMgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jIChnZXRfYW55X3N0cmluZyk6IENvcGUgd2l0aCBnZXR0aW5nIGEgc3RyaW5nIHdpdGggYW4KLQlhbHRlcm5hdGUgYmFzZSBzcGVjaWZpZXIuCi0JKGRvX2FpZiwgZG9fYWVsc2UpOiBPbmx5IGVuYWJsZSBvdXRwdXQgaWYgZXhwcmVzc2lvbiBpcyB0cnVlIGFuZCBwcmV2aW91cwotCWxldmVsIHdhcyBvbi4KLQkoY2hhcnR5cGVfaW5pdCk6ICBBZGQgQkFTRUJJVCBjaGFydHlwZS4KLQkocHJvY2Vzc19wc2V1ZG9fb3ApOiAgTm90aWNlIG5lc3RlZWQgQUlGcy4KLQotVGh1IEp1bCAgNyAxMjozMDoyMiAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBoODMwMC5jIChkb19hX2ZpeF9pbW0pOiBDb2RlIGZvciAyIGJpdCByZWxvYyB0eXBlIHVzaW5nIGluIHRyYXBhCi0JaW5zbi4gIChmaXggcHIgNTE2NSwgNTE3NCkKLQotVGh1IEp1bCAgNyAxMTozMTozMiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoUl9ETFRfUkVMKTogSWYgaXQgaXNuJ3QgZGVmaW5lZCwgdGhlbiBkZWZpbmUKLQl0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZSB0byBhdm9pZCBsb3Npbmcgb24gb2xkIGhwdXggc3lzdGVtcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfYWRqdXN0YWJsZSk6IFJlamVjdCByZWR1Y3Rpb25zIGZvcgotCXN5bWJvbHMgaW4gRExUIHJlbGF0aXZlIHJlbG9jcy4KLQkodGNfZ2VuX3JlbG9jKTogWmVybyBvdXQgdGhlIGFkZGVuZCBmaWVsZCBmb3IgRExUIHJlbGF0aXZlIHJlbG9jcy4KLQotV2VkIEp1bCAgNiAwMTowNzo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3RjKTogSWYgbm90IE9CSl9DT0ZGLCBmb3JjZSBUT0MgZW50cnkgdG8KLQlhbGlnbiB0byBhIGZvdXIgYnl0ZSBib3VuZGFyeS4KLQotVHVlIEp1bCAgNSAxNTo0MjowOSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogSGFuZGxlIDMyLWJpdCBhZGRlbmRzLgotCShncGRpc3BfaGkxNl9ob3d0byk6IE5vdyBwb2ludHMgdG8gY29uc3QuCi0JKGxvYWRfaW5zbl90YWJsZSwgYWxwaGFfaXApOiBGaXggdXNlcyBvZiBjb25zdC4KLQotCSogZG9jL2ludGVybmFscy50ZXhpOiBVcGRhdGVzIHRvIENPRkYgZGVzY3JpcHRpb24uICBBZGRlZCAiQGVuZAotCWRlZm1hYyIgYXMgbmVlZGVkLCBhbmQgc29tZSBleHRyYSBoZWFkaW5nIGFuZCAiQGJ5ZSIgc28gaXQnbGwKLQlmb3JtYXQgYXMgYSBzZXBhcmF0ZSBkb2N1bWVudC4KLQotVHVlIEp1bCAgNSAxMzo1NDowMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfR0VUX0FMSUdOLCBTX1NFVF9BTElHTik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogU2V0IGFsaWdubWVudCBvZiBjb21tb24KLQlzeW1ib2wuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBJZiBPQkpfRUxGLCBzZXQgYWxpZ25tZW50IG9mCi0JY29tbW9uIHN5bWJvbC4KLQotTW9uIEp1bCAgNCAxODoyOTo0MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaXNfY29tcGxleCk6IE5ldyBtYWNyby4KLQkoY29uc19maXhfbmV3X2hwcGEpOiAiSGFuZGxlIiBjb21wbGV4IGV4cHJlc3Npb25zLgotCi1GcmkgSnVsICAxIDAwOjQ4OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IHNfYWxpZ24gZmllbGQgZnJvbQotCXNlY3Rpb25fYWxpZ25tZW50IGFycmF5LgotCi1UaHUgSnVuIDMwIDE1OjA1OjI4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIGJmZF9jb21fc2VjdGlvbl9wdHIuCi0JKiBhcy5oIChhYnNvbHV0ZV9zZWN0aW9uLCB1bmRlZmluZWRfc2VjdGlvbik6IFVzZSBuZXcgQkZEIG1hY3JvcwotCWJmZF9hYnNfc2VjdGlvbl9wdHIgYW5kIGJmZF91bmRfc2VjdGlvbl9wdHIuCi0KLVRodSBKdW4gMzAgMTQ6MzY6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEZvciBNX0xJX1NTLCBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdAotCWJhc2VkIG9uIGNvbnRlbnRzIG9mIGltbV9leHByIGFuZCBvZmZzZXRfZXhwciwgcmF0aGVyIHRoYW4KLQltaXBzX3BpYy4gIEZvciBNX0xJX0RELCBkZWNpZGUgaG93IHRvIGhhbmRsZSBpdCBiYXNlZCBvbiBzZWdtZW50Ci0JbmFtZSBvZiBvZmZzZXRfZXhwciwgcmF0aGVyIHRoYW4gbWlwc19waWMuCi0JKG1pcHNfaXApOiBJZiBnX3N3aXRjaF92YWx1ZSA8IDQsIHVzZSBpbW1lZGlhdGUgdmFsdWVzIGZvciAnbCcuCi0JSWYgZ19zd2l0Y2hfdmFsdWUgPCA4LCB1c2UgLnJkYXRhIHJhdGhlciB0aGFuIC5saXQgZm9yICdMJy4KLQotV2VkIEp1biAyOSAxNzozMDo0NiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBCcmVhayBsb25nIHN0cmluZyBpbnRvIHNob3J0ZXIgb25lcy4KLQkocGFyc2VfYXJncyk6IEFkZCAtdiwgcHJpbnRzIHZlcnNpb24gaWQgYW5kIGNvbnRpbnVlcy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3Nob3dfdXNhZ2UpOiBCcmVhayBsb25nIHN0cmluZy4KLQotTW9uIEp1biAyNyAwOTo0NzoxNiAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcGhpc2hoZWFkLmN5Z251cy5jb20pCi0KLQkqICBjb25maWcvdGMtaTM4Ni5jIChtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgIi1WIiBhbmQgIi1RIiBpZgotCU9CSl9FTEYgaXMgZGVmaW5lZC4KLQotU3VuIEp1biAyNiAxNjozMDo0OCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKG1haW4pIFtIT1NUX1NQRUNJQUxfSU5JVF06IE5ldyBob29rLCBmb3IgaG9zdC1zcGVjaWZpYwotCWluaXRpYWxpemF0aW9uLgotCi1XZWQgSnVuIDIyIDAwOjI0OjU1IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUgZm9yIE9CSl9FTEYuCi0JTW9yZSBnYXMvYmZkIGxvc3NhZ2UgZXhwb3NlZCBieSB0aGUgbmV3IGxpbmtlciBjb2RlLgotCi1UdWUgSnVuIDIxIDExOjMyOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKTogQ2xlYXIgc2VnaW5mbyBhZnRlciBhbGxvY2F0aW5nIGl0LgotCShzdWJzZWdfZ2V0KTogUGFzcyBhY3R1YWwgc2l6ZSBvZiBzZWdpbmZvIHRvIG1lbXNldC4KLQotCSogc3Vic2Vncy5jIChhYnNfc2VnX2luZm8sIHVuZF9zZWdfaW5mbyk6IERlZmluZSBpZiBCRkRfQVNTRU1CTEVSLgotCShzdWJzZWdfY2hhbmdlKTogU3RvcmUgc2VnX2luZm8gZm9yIGJmZF9hYnNfc2VjdGlvbl9wdHIgaW4KLQlhYnNfc2VnX2luZm8sIGFuZCBzdG9yZSBzZWdfaW5mbyBmb3IgYmZkX3VuZF9zZWN0aW9uX3B0ciBpbgotCXVuZF9zZWdfaW5mby4KLQkoc3Vic2VnX2dldCk6IExpa2V3aXNlLiAgQWxzbywgZG9uJ3Qgc2V0IG91dHB1dF9zZWN0aW9uIGlmIGl0IGlzCi0JYWxyZWFkeSBzZXQuCi0JKHNlZ19pbmZvKTogRGVmaW5lIGFzIGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWdfaW5mbyk6IERlY2xhcmUgYXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gZGVmaW5pbmcKLQlhcyBtYWNyby4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IENhbGwgc2VnX2luZm8gcmF0aGVyIHRoYW4KLQliZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEuCi0KLU1vbiBKdW4gMjAgMTY6MzA6NTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChwcGMtKi1lbGYqKTogTmV3IHRhcmdldCwgbGlrZSAtc3lzdjQqLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiAiMGYiIGlzIGZvbGxvd2VkIGJ5ICdcMCcsIGRvbid0IGRvIGVvbAotCWNoZWNrcy4KLQotTW9uIEp1biAyMCAxNToxNzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2F1eCk6IENhbGwgc3dhcF90aXJfb3V0IGFuZCBzd2FwX3JuZHhfb3V0Ci0JdmlhIGJhY2tlbmQgcG9pbnRlciwgbm90IGRpcmVjdGx5LgotCi1GcmkgSnVuIDE3IDE4OjA1OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IE1ha2Ugc3VyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUKLQllbGVtZW50IGluIHRoZSBmb3IgbG9vcC4KLQotRnJpIEp1biAxNyAxMTowMTowNCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogTWlzYyB0cml2aWFsIGNoYW5nZXMgdG8gbWFrZSBnY2MgLVdhbGwgaGFwcHkuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBEZWNsYXJlLgotCi1XZWQgSnVuIDE1IDIwOjQ0OjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBDYXN0IHhtYWxsb2MgcmV0dXJuIHZhbHVlLgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLXN0YW1wKTogSWYgJChkZWZzKSBjb250YWlucyBtdWx0aXBsZSB3b3JkcywKLQllbWl0IGEgI2RlZmluZSBsaW5lIGZvciBlYWNoLgotCSogY29uZmlndXJlLmluOiBGb3Igc3BhcmM2NCB0YXJnZXQsIHVzZSBzcGFyYyBjcHUgZmlsZXMgYW5kIGFkZAotCXNwYXJjdjkgdG8gZXh0cmFfZGVmcy4gIE5vIGxvbmdlciB0cmVhdCBzcGFyYzY0LSotYW91dCogc3BlY2lhbGx5LgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWVtYmFyX21hc2tzKTogTm93IHN0YXRpYyBhbmQgY29uc3QuCi0JKG1kX3Nob3dfdXNhZ2UpIFshTk9fVjldOiBBZGQgLUF2OSB0byB1c2FnZSBtZXNzYWdlLgotCShjdXJyZW50X2FyY2hpdGVjdHVyZSkgW3NwYXJjdjldOiBJbml0aWFsaXplIHRvIHY5LgotCShtZF9iZWdpbikgW3NwYXJjdjldOiBEb24ndCBib3RoZXIgY2hhbmdpbmcgaXQgdW5jb25kaXRpb25hbGx5Ci0JaGVyZS4KLQkoc19yZXNlcnZlKTogRG9uJ3QgcGFzcyB1bmV4cGVjdGVkIGFyZ3VtZW50IHRvIGFzX2JhZCB3aXRoCi0JYmFkLXNlZ21lbnQgbWVzc2FnZS4KLQotCSogYXMuaCAoYmZkX2FsbG9jX2J5X3NpemVfdCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGludF90b19nZW4pOiBDb21tZW50ZWQgb3V0IHVudXNlZCByb3V0aW5lLgotCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2Fzc2VtYmxlKTogUmVtb3ZlZCBjaGVjayBvZiBvcGVyYW5kIHNlY3Rpb24uCi0KLQlGcmkgSnVuICAzIDE3OjI1OjA4IDE5OTQgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiBjb25maWcvb2JqLXZtcy5oIChEQkdfU19DX0NPTVBMWDQsIERCR19TX0NfQ09NUExYOCk6IGRlZmluZQotCXRoZXNlIG5ldyBWTVMgc3ltYm9sLXR5cGUgbWFjcm9zIGZvciBgY29tcGxleCBmbG9hdCcgYW5kCi0JYGNvbXBsZXggZG91YmxlJyBzdXBwb3J0LiAgVGhlaXIgdmFsdWVzIGNvbWUgZnJvbSB0aGUgZXhpc3RpbmcKLQlEU0MkS19EVFlQRV9GQyBhbmQgRFNDJEtfRFRZUEVfREMgbWFjcm9zIGluIDxkZXNjcmlwLmg+LgotCShEQkdfU19DX1JFQUw4X0csIERCR19TX0NfQ09NUExYOF9HKTogR19mbG9hdCB2ZXJzaW9ucyBvZgotCVJFQUw4IGFuZCBDT01QTFg4OyBub3QgdXNlZCB5ZXQsIGJlY2F1c2UgZ2NjIG91dHB1dHMgdGhlIHNhbWUKLQkuc3RhYnMgZm9yIGBkb3VibGUnIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgLW1nJyBpcyB1c2VkLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3R5cGVkZWZfcGFyc2UpIFtjYXNlICdyJ106IGFkZCBlbnRyaWVzCi0JZm9yIGdjYzIncyBwcmVkZWZpbmVkIHR5cGVzICJjb21wbGV4IGZsb2F0IiwgImNvbXBsZXggZG91YmxlIiwKLQlhbmQgImNvbXBsZXggbG9uZyBkb3VibGUiIChpZGVudGljYWwgdG8gY29tcGxleCBkb3VibGUpLgotCi1XZWQgSnVuIDE1IDEyOjMyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfZnJvYl9zeW1ib2wpOiBVc2UgQ19TVEFUIGZvciB0aGUgLnRleHQKLQlzZWN0aW9uIHN5bWJvbCwgbm90IENfTEFCRUwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBQZXJtaXQgYSBtb2RpZmllciBpbiAnbycgY2FzZSwgYW5kCi0JcGVybWl0IG5vbiBjb25zdGFudCBleHByZXNzaW9ucyBpbiAndScgY2FzZS4gIExldHMgYGBsdWkKLQkkOCwlaGkoZm9vKTsgbHcgJDgsJWxvKGZvbykoJDgpJycgd29yayBjb3JyZWN0bHkuCi0KLU1vbiBKdW4gMTMgMTI6MDg6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX2FvdXRfZnJvYl9zeW1ib2wpOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQKLQl0byBwdXQgYSBjb21tb24gc3ltYm9sIGluIGEgc2V0LgotCi1TYXQgSnVuIDExIDE2OjQxOjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCB3ZWFrIHN5bWJvbHMgYXMgYW4gZXh0ZW5zaW9uIHRvIGEub3V0LgotCSogcmVhZC5jIChwc2V1ZG9fc2V0KTogT25seSBwcmVzZXJ2ZSBleHRlcm5hbCBiaXQgZm9yIE9CSl9BT1VUIGFuZAotCU9CSl9CT1VUIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL2FvdXRfZ251LmggKE5fV0VBS1UsIE5fV0VBS0EsIE5fV0VBS1QsIE5fV0VBS0QsIE5fV0VBS0IpOgotCURlZmluZSBhcyBpbiAuLi9pbmNsdWRlL2FvdXQvYW91dDY0LmguCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoT0JKX1NZTUZJRUxEX1RZUEUpOiBJZiBub3QgQkZEX0FTU0VNQkxFUiwKLQlkZWZpbmUgYXMgY2hhci4KLQkoU19HRVRfV0VBSywgU19TRVRfV0VBSyk6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkICJ3ZWFrIi4KLQkob2JqX2VtaXRfc3ltYm9scyk6IEFkanVzdCB0eXBlIG9mIHdlYWsgc3ltYm9scy4KLQkob2JqX2FvdXRfd2Vhayk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLUZyaSBKdW4gMTAgMTM6NDg6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBEb24ndCBzZXQgYW55IGZsYWdzIGJhc2VkIG9uCi0JdGhlIHR5cGUgb2YgYSBzcGVjaWFsIHNlY3Rpb24uCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiBJbmNsdWRlIDxzdGRsaWIuaD4uICBEb24ndCBkZWNsYXJlIG1hbGxvYywKLQlyZWFsbG9jLCBmcmVlLCBvciBhdG9sLgotCi1XZWQgSnVuICA4IDA2OjI4OjM3IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBEZWxldGUgYXMubmV3IGRlcGVuZGVuY3ksIHNvIHRoYXQKLQlyZWdyZXNzaW9uIHRlc3QgZG9lc24ndCB0cmlnZ2VyIGFuIGFzc2VtYmxlciBidWlsZC4KLQotVHVlIEp1biAgNyAxMzozMzoxOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbiwgcmVhbGNsZWFuKTogTmV3IHRhcmdldHMuCi0JKiBkb2MvTWFrZWZpbGUuaW4sIHRlc3RzdWl0ZS9NYWtlZmlsZS5pbjogTGlrZXdpc2UuCi0KLU1vbiBKdW4gIDYgMTM6MTA6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChSREFUQV9TRUNUSU9OX05BTUUpOiBEZWZpbmUuCi0JKG1hY3JvKTogQ29ycmVjdCBNX0xJX1NTIFNWUjRfUElDL0VNQkVEREVEX1BJQyBjYXNlLiAgQWZ0ZXIgTV9MSV9ECi0Jb3IgTV9MX0RPQiBvciBsYWJlbCBkb2IsIGZvcmNlIGEgbmV3IGZyYWcgdG8gYXZvaWQgZ2V0dGluZwotCWNvbmZ1c2VkIGluIHRjX2dlbl9yZWxvYy4KLQkobWlwc19pcCk6IFVzZSBSREFUQV9TRUNUSU9OX05BTUUsIG5vdCAucmRhdGEuCi0JKHNfY2hhbmdlX3NlYyk6IExpa2V3aXNlLgotCi1GcmkgSnVuICAzIDIzOjM1OjM2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgbWVtc2V0IHRvIHplcm8gb3V0IG1lbW9yeSwgcmF0aGVyIHRoYW4KLQlnb2luZyB0aHJvdWdoIG1kX251bWJlcl90b19jaGFycy4gIFRoaXMgcGVybWl0cyBoYW5kbGluZyBzeW1ib2xpYwotCWFyZ3VtZW50cyB3aGVuIHRoZSBzaXplIGlzIGxhcmdlciB0aGFuIHNpemVvZiAodmFsdWVUKSwgaWYKLQlUQ19DT05TX0ZJWF9ORVcgaXMgcHJlcGFyZWQgdG8gaGFuZGxlIHRoZSBjYXNlIChhcyBpdCBpcyBvbiBNSVBTKS4KLQotRnJpIEp1biAgMyAxMjo1MDoxMyAxOTk0ICBEYXZpZCBKLiBNYWNLZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHNob3dfdXNhZ2UpLCBjb25maWcvdGMtYWxwaGEuYyAobWRfc2hvd191c2FnZSksCi0JY29uZmlnL3RjLW1pcHMuYyAobWRfc2hvd191c2FnZSk6IEZpeCB1cCBtZXNzYWdlcy4KLQotCSogYXMuaDogUmVwbGFjZSBmbGFnc2VlbiB3aXRoIHNlcGFyYXRlIHZhcmlhYmxlcy4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBTZXQgdGhlbS4gIERvbid0IGFjY2VwdCAtMSBvcHRpb24sIG9yIC12Ci0JZXhwbGljaXRseSAoaXQncyBhIHN5bm9ueW0gZm9yIC0tdmVyc2lvbikuCi0JKiBhcy5jLCBpbnB1dC1zY3J1Yi5jLCBtZXNzYWdlcy5jLCByZWFkLmMsIHN5bWJvbHMuYywgd3JpdGUuYywKLQljb25maWcvb2JqLWFvdXQuYywgY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotYm91dC5jLAotCWNvbmZpZy9vYmotYm91dC5oLCBjb25maWcvb2JqLWNvZmYuYywgY29uZmlnL29iai1jb2ZmLmgsCi0JY29uZmlnL29iai12bXMuYywgY29uZmlnL3RjLWhwcGEuYywgY29uZmlnL3RjLWkzODYuYywKLQljb25maWcvdGMtaTk2MC5jLCBjb25maWcvdGMtbTY4ay5jLCBjb25maWcvdGMtbWlwcy5jLAotCWNvbmZpZy90Yy12YXguYzogVXNlIHRoZSBuZXcgZmxhZyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBmbGFnc2Vlbi4KLQkqIGNvbmZpZy90Yy12YXguYyBbT0JKX1ZNU106IFJlY29nbml6ZSAtKywgLTEsIC12LCBhbmQgZG9jdW1lbnQgaW4KLQl1c2FnZS4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFJlbW92ZSB0YXJnZXQgc3BlY2lmaWMgbWVzc2FnZXM7Ci0JaW5zdGVhZCwgY2FsbCBtZF9zaG93X3VzYWdlLgotCShwYXJzZV9hcmdzKTogVXNlIGdldG9wdF9sb25nX29ubHkuICBUYWtlIHBvaW50ZXJzIHRvIGFyZ2MgYW5kCi0JYXJndi4KLQkobWFpbik6IFBhc3MgcGFyc2VfYXJncyBwb2ludGVycy4KLQkqIGFzLmg6IFJlbW92ZSAzIHZhcmlhYmxlcyB0aGF0IGFyZSByZWR1bmRhbnQgd2l0aCBmbGFnc2Vlbi4KLQkqIGFzLmMsIG1lc3NhZ2VzLmM6IENoYW5nZSB0aGVpciB1c2VycyB0byB1c2UgZmxhZ3NlZW4uCi0JRGVmaW5lIGdldG9wdCBzdHVmZi4KLQkqIHRjLmg6IFVwZGF0ZSBtZF9wYXJzZV9vcHRpb24gZGVjbC4gIEFkZCBtZF9zaG93X3VzYWdlIGRlY2wuCi0JKiBjb25maWcvdGMtKi5jOiBBZGQgbWRfc2hvcnRvcHRzLCBtZF9sb25nb3B0cywKLQltZF9sb25nb3B0c19zaXplLCBtZF9zaG93X3VzYWdlLiAgQ2hhbmdlIGNhbGxpbmcgY29udmVudGlvbiBmb3IKLQltZF9wYXJzZV9vcHRpb24uICBSZW1vdmUgbWRfcGFyc2VfbG9uZ19vcHRpb24uCi0JKiBjb25maWcvdGMtbnMzMmsuYzogUmVuYW1lIGBzdHJ1Y3Qgb3B0aW9uJyB0byBgc3RydWN0IG5zMzJrX29wdGlvbicuCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBEb24ndCBkZWZpbmUgbWRfcGFyc2Vfb3B0aW9uLgotCi1UaHUgSnVuICAyIDEzOjU0OjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoc2hvd191c2FnZSk6IE5ldyBmdW5jdGlvbi4KLQkocGFyc2VfYXJncyk6IENvZGUgbW92ZWQgZnJvbSBtYWluLgotCVJlY29nbml6ZSAtLWhlbHAgYW5kIC0tdmVyc2lvbi4KLQkqIGNvbmZpZy90Yy1uczMyay5oOiBEZWZpbmUgVENfTlMzMksuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgYWxsIG9mIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgY29tbWFuZAotCWxpbmUgb3B0aW9ucy4KLQotVGh1IEp1biAgMiAxMjowNzoyNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXNwLmMgKGhhc2hfbmV3X3RhYmxlKTogQ2xlYXIgbmV3bHkgYWxsb2NhdGVkIHRhYmxlLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChlbnVtIF9yZWdpc3Rlcik6IEFkZCA2ODA2MCBjb250cm9sIHJlZ2lzdGVycwotCUJVU0NSIGFuZCBQQ1IuCi0JKGxhc3RfbW92ZWNfcmVnKTogTmV3IG1hY3JvLgotCShtNjgwMDBfY29udHJvbF9yZWdzLCBtNjgwMTBfY29udHJvbF9yZWdzLCBtNjgwMjBfY29udHJvbF9yZWdzLAotCW02ODA0MF9jb250cm9sX3JlZ3MsIG02ODA2MF9jb250cm9sX3JlZ3MpOiBOZXcgYXJyYXlzLgotCShjb250cm9sX3JlZ3MpOiBOZXcgcG9pbnRlci4KLQkobTY4a19pcCk6IFVzZSBjb250cm9sX3JlZ3MgaW5zdGVhZCBvZiB0ZXN0aW5nIENQVSBldmVyeSB0aW1lLgotCVVzZSBsYXN0X21vdmVjX3JlZyB0b28uICBJbiBlcnJvciBtZXNzYWdlcywgaGFuZGxlIDY4MDYwLCBhbmQKLQlwcmludCA2ODA2MCBmb3IgbWZsb2F0LCB0b28uCi0JKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogSGFuZGxlICI2ODA2MCIuICBVc2UgbTY4MDQwdXAgZm9yIG1ha2luZwotCW02ODg1MSBjaG9pY2UuICBTZXQgY29udHJvbF9yZWdzLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgIjY4MDYwIi4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0dGluZyBjcHVfdHlwZSwgcmVjb2duaXplIG02ODA2MCB0b28uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KSBbIUJGRF9BU1NFTUJMRVJdCi0JW0RJRkZfRVhQUl9PS106IERvIGNvbnZlcnNpb24gdG8gcGMtcmVsYXRpdmUgZm9yIGRpZmZlcmVuY2UsIGV2ZW4KLQlpZiBwY3JlbCBpcyBhbHJlYWR5IHNldC4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIHRoaXNfZ2NjX3JlcXVpcmVzX3RoZV9nbnVfYXNzZW1ibGVyIGluIGFsbAotCWxvd2VyLWNhc2UsIGluIGNhc2Ugd2UncmUgaWdub3JpbmcgY2FzZSBvZiBvcGNvZGVzIGluIHRoZSBpbnB1dAotCWZpbGUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvICguc2VjdGlvbik6IERvY3VtZW50IGFzIHVuYXZhaWxhYmxlIGZvciBhLm91dAotCXR5cGUgZm9ybWF0cy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1hY2hpbmUpOiBOZXcgdmFyaWFibGUuCi0JKGxvYWRfaW5zbik6IE5ldyBtYWNyby4KLQkobG9hZF9pbnNuX3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9iZWdpbik6IENhbGwgbG9hZF9pbnNuX3RhYmxlLCBvbmNlIGZvciBiYXNpYyBpbnN0cnVjdGlvbnMgYW5kCi0Jb25jZSBmb3IgYXBwcm9wcmlhdGUgUEFMIGluc3RydWN0aW9uIHRhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgYG1hY2hpbmUnIGJhc2VkIG9uIC1tIyMjIyMgYXJndW1lbnRzLgotCSogY29uZmlnL2FscGhhLW9wY29kZS5oIChhbHBoYV9wYWwyMTA2NF9vcGNvZGVzKTogU3BsaXQgb3V0IGZyb20KLQlhbHBoYV9vcGNvZGVzLgotCShhbHBoYV9wYWwyMTE2NF9vcGNvZGVzKTogTmV3IHRhYmxlLgotCShOVU0yMTA2NE9QQ09ERVMsIE5VTTIxMTY0T1BDT0RFUyk6IE5ldyBtYWNyb3MuCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0IGkzODYtKi1uZXRic2QwLjgpOiBVc2UgMzg2YnNkIGVtdWxhdGlvbi4KLQotCSogZG9jL01ha2VmaWxlLmluIChpbnN0YWxsLWluZm8tZ2FzcCk6IFVzZSAkJGRpciB3aGVuIGluc3RhbGxpbmcKLQlmaWxlLgotCi1XZWQgSnVuICAxIDEwOjQ4OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEZvcmNlIGZsb2F0aW5nIHBvaW50IHZhbHVlcyB0byBiZQotCWFsaWduZWQgY29ycmVjdGx5LgotCi1GcmkgTWF5IDI3IDEwOjA1OjUzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JTWVyZ2VkIGluIGNoYW5nZXMgZnJvbSBnYXMtMi4zIG5ldCByZWxlYXNlOgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgdG8gY3lnbnVzLTIuMy4xLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBSZXBsYWNlZCB1bmNoZWNrZWQgdXNlcyBvZiBtYWxsb2Mgd2l0aAotCXhtYWxsb2MuCi0KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBPbmx5IHRlc3QgQkZENjQsIG5vdAotCUJGRF9BU1NFTUJMRVIgdG9vLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCkgW0JGRF9BU1NFTUJMRVJdCi0JW0RJRkZfRVhQUl9PS106IERvbid0IGNoZWNrIHBjcmVsLCBqdXN0IGNvbnZlcnQgaXQuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmM6IFJlbW92ZWQgbG90cyBvZiBleHRyYSBzZW1pY29sb25zIGFmdGVyCi0JY29tcG91bmQgc3RhdGVtZW50cy4KLQkoc3RyY2hyKTogRG9uJ3QgZGVjbGFyZSBoZXJlLgotCi0JKiBjb25maWcvaG8tdmF4LmggKHJlYWxsb2MpOiBEZWNsYXJlLgotCi0JKiBjb25maWcvaG8tdm1zLmggKHN0cmNociwgc3RyZHVwKTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BhcnNlX29wdGlvbikgW09CSl9FTEZdOiBBY2NlcHQgYW5kIGlnbm9yZQotCW9wdGlvbiBgLXEnLgotCi0JV2VkIE1heSAxOCAyMDo1MDozNSAxOTk0ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogY29uZmlnL29iai12bXMuaCAoREJHX1NfQ19TUVVBRCwgREJHX1NfQ19VUVVBRCk6IGRlZmluZSB0aGVzZQotCW5ldyBWTVMgc3ltYm9sLXR5cGUgbWFjcm9zOyBzaWduZWQgYW5kIHVuc2lnbmVkIHF1YWR3b3JkIGludGVnZXJzLAotCWZvciBgbG9uZyBsb25nJyBzdXBwb3J0LiAgVGhlaXIgdmFsdWVzIGNvbWUgZnJvbSB0aGUgZXhpc3RpbmcKLQlEU0MkS19EVFlQRV9RVSBhbmQgRFNDJEtfRFRZUEVfUSBtYWNyb3MgaW4gPGRlc2NyaXAuaD4uICBUaGUKLQlWTVMgZGVidWdnZXIgbm93IHJlY29nbml6ZXMgYGxvbmcgbG9uZycgdmFyaWFibGVzIGNvcnJlY3RseS4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU190eXBlZGVmX3BhcnNlKSBbY2FzZSAnciddOiBhZGQgZW50cmllcwotCWZvciBnY2MyJ3MgcHJlZGVmaW5lZCB0eXBlcyAibG9uZyBkb3VibGUiIChzYW1lIGFzIGRvdWJsZSwgYXMKLQlwZXIgZ2NjJ3MgY3VycmVudCBzdGF0ZSksICJsb25nIGxvbmcgaW50IiwgImxvbmcgbG9uZyB1bnNpZ25lZAotCWludCIsIGFuZCBmaW5hbCBgb3RoZXJ3aXNlJyBjYXNlICh0byBhdm9pZCB1bmluaXRpYWxpemVkIHR5cGUKLQlhbmQgc2l6ZSBmaWVsZHMpLiAgW2NhdmVhdDogIHByZWRlZmluZWQgdHlwZXMgImNvbXBsZXggaW50IiwKLQkiY29tcGxleCBmbG9hdCIsICJjb21wbGV4IGRvdWJsZSIsIGFuZCAiY29tcGxleCBsb25nIGRvdWJsZSIgYXJlCi0Jc3RpbGwgbWlzc2luZy5dCi0KLQkqIGNvbmZpZy9oby12bXMuaCAoRVhJVF9GQUlMVVJFKTogZGVmaW5lIGFzIDB4MTAwMDAwMDIgaW5zdGVhZAotCW9mIDAsIGJlY2F1c2UgdGhlIGxhdHRlciBpbmRpY2F0ZXMgc3VjY2VzcyByYXRoZXIgdGhhbiBmYWlsdXJlCi0Jd2hlbiBwYXNzZWQgdG8gYGV4aXQnIG9yIHJldHVybiBmcm9tIGBtYWluJyBjb21waWxlZCBieSBnY2MyLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChhcnJheV9zdWZmaXgsIGdlbmVyYXRlX3N1ZmZpeCk6IHJlcGxhY2UgdHdvCi0JaGFyZGNvZGVkIGAweGEzJ3Mgd2l0aCBtYWNybyBEQkdfU19DX0FEVkFOQ0VEX1RZUEUgZnJvbSBvYmotdm1zLmguCi0JKFZNU190eXBlZGVmX3BhcnNlKTogZWxpbWluYXRlIHJlZHVuZGFudCBpZi10aGVuLWVsc2Ugd2hlbgotCWFsbG9jYXRpbmcgbmV3IHN5bWJvbCBlbnRyeSBhbmQgbGlua2luZyBpdCB0byBWTVNfU3ltYm9sX3R5cGVfbGlzdC4KLQotCVR1ZSBNYXkgMTcgMjA6NDc6MzEgMTk5NCAgUGF0IFJhbmtpbiAgKHJhbmtpbkBlcWwuY2FsdGVjaC5lZHUpCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFdyaXRlX1ZNU19NSERfUmVjb3Jkcyk6IGRvbid0IHRyeSB0byBpbnRlcnByZXQKLQl0aGUgY29udGVudHMgb2YgdGhlIEdBU19WRVJTSU9OIHN0cmluZyB3aGVuIGZhbGxpbmcgYmFjayB0byBpdCBmb3IKLQlsYW5ndWFnZSBwcm9jZXNzb3IgaWRlbnRpZmljYXRpb24uCi0KLQkqIG1ha2UtZ2FzLmNvbSwgdm1zY29uZi5zaCAoRU5WSVJPTik6IGZpeCBtaXNzcGVsbGluZyBvZgotCWBwc2VjdF9hdHRyJyBpbiBsaW5rZXIgb3B0aW9ucy4KLQotCVdlZCBNYXkgMTEgMjI6MzI6MDAgMTk5NCAgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgdG8gbGF0ZXN0IG1ha2VmaWxlLmluCi0JKiBjb25maWcvdGUtZ28zMi5oOiBbbmV3XSBnbzMyJ3MgZW52aXJvbm1lbnQKLQotRnJpIE1heSAyMCAxNzo1OTozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFzLmg6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVycyBmb3Igc3Ryc3RyLgotCi1UaHUgTWF5IDE5IDE1OjQwOjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEb24ndCBjaGFuZ2UgdGhlIHNpemUgaWYKLQlPQkpfRUxGLgotCi1XZWQgTWF5IDE4IDEzOjA4OjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZWRpcmVjdCBsbiBvdXRwdXQgdG8gL2Rldi9udWxsLiAgSWYgbG4KLQlmYWlscyBvbiBnYXNwLCBpbnN0YWxsIGdhc3AubmV3LCBub3QgZ2FzcC4KLQotV2VkIE1heSAxOCAwOToxNjozNiAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBVc2UgUl9IUFBBX0FCU19DQUxMLCBub3QgUl9IUFBBIGZvcgotCWFic29sdXRlIGNhbGxzLgotCi1UdWUgTWF5IDE3IDEyOjUwOjQ2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9mcF9jbXBfY29uZCk6IFJlcG9ydCBhbiBlcnJvcgotCW9uIGEgcGFydGlhbCBjb21wbGV0ZXIgbWF0Y2guCi0KLU1vbiBNYXkgMTYgMTI6MDM6NDkgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IENoYW5nZSAuaHBwYV91bndpbmQgdG8gLlBBUklTQy51bndpbmQKLQl0aHJvdWdob3V0IGNvZGUuCi0JKGlzX2NvbXBsZXgpOiBEZWxldGUgZGVmaW5pdGlvbiBhbmQgc3VwcG9ydCBmb3IgY29tcGxleCByZWxvY2F0aW9uCi0JdHlwZXMuCi0JKHRjX2dlbl9yZWxvYyk6IERlbGV0ZSBzcGVjaWFsIHVud2luZCBjcnVkIGZvciBFTEYuICBTaW1wbGlmeSBhbmQKLQlyZXdyaXRlIEVMRiBjb2RlIGJhc2VkIG9uIDk0LTAyLTAyIFBBIEVMRiBkcmFmdCBzcGVjLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UpOiBVc2Ugc3RhbmRhcmQgUEFSSVNDX0RJUjMyIHJlbG9jcyBmb3IKLQl0aGUgdW53aW5kIGRlc2NyaXB0b3JzLgotCi1GcmkgTWF5ICA2IDE0OjEzOjE1IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9nbzMyLm1oOiBOZXcgbWFrZWZpbGUgZnJhZ21lbnQgZm9yIGdvMzIgY3Jvc3NpbmcuCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PWdvMzIpOiBVc2UgbmV3IGZyYWdtZW50LgotCi1GcmkgTWF5ICA2IDE0OjM1OjU4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZ2FzcC5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCShtYWluKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2JlZ2luKTogV2hlbiB1c2luZyAtbWFueSwgcGVybWl0IGNvbXBhcmlzb24KLQlpbnN0cnVjdGlvbnMgdG8gYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIHRoZSBvcGNvZGUgdGFibGUuCi0KLVRodSBNYXkgIDUgMTk6MTQ6NDMgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFZFUlNJT04pOiBVcGRhdGUgdG8gMi4yLjkwLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgcGVybWl0IGFkZGl0aW9ucwotCXRvIHRoZSBzeW1ib2wgdGFibGUgaWYgaXQncyBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZSBvdXRwdXQgYmZkLgotCShzeW1ib2xfYmVnaW4pIFshIEVNSVRfU0VDVElPTl9TWU1CT0xTXSBbUkVMT0NfUkVRVUlSRVNfU1lNQk9MXToKLQlEb24ndCB1c2UgYmZkX2Fic19zZWN0aW9uLnN5bWJvbCBmb3IgZ2FzIGFic29sdXRlIHN5bWJvbC4KLQotCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4sIGNsZWFuLWR2aSwgY2xlYW4taW5mbyk6IERlbGV0ZSBnYXNwCi0JZmlsZXMgdG9vLgotCi1UaHUgTWF5ICA1IDE4OjEyOjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19lbWl0X2RlbGF5cyk6IE1ha2UgY2FsbCB0bwotCW1pcHNfbm9fcHJldl9pbnNuIHVuY29uZGl0aW9uYWwuCi0KLVRodSBNYXkgIDUgMTc6MjU6MzggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmKi4qOiBNZXJnZWQgY29mZmJmZCB2ZXJzaW9ucyBpbnRvIGNvZmYgdmVyc2lvbnMsCi0Jd2l0aCBhIHNpbmdsZSAiI2lmZGVmIEJGRF9BU1NFTUJMRVIiIGNvbnRyb2xsaW5nIG1vc3Qgb2YgaXQgZm9yCi0Jbm93LiAgRGVsZXRlZCBvYmotY29mZmJmZC4qIGZpbGVzLgotCSogY29uZmlndXJlLmluOiBBbHdheXMgdXNlIG9iai1jb2ZmLiogZm9yIENPRkYgdGFyZ2V0cy4KLQotV2VkIE1heSAgNCAxMzozNDoxMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGUtZHB4Mi5oIChUQVJHRVRfRk9STUFULCBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpOgotCURlZmluZS4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay1idWxsLXN5c3YzKik6IEVuYWJsZS4KLQotCSogY29uZmlnL2NvZmZfZ251Lmg6IERlbGV0ZWQuCi0KLVdlZCBNYXkgIDQgMTE6Mjk6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQVJHRVRfRk9STUFUKTogSWYgbm90IFRFX1NVTjMsIGRlZmluZSBhcwotCSJhLm91dC16ZXJvLmJpZyIuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogTWFrZSBjb21tb24gc3ltYm9sIGFuZCBQQwotCXJlbGF0aXZlIGFkanVzdG1lbnRzIHdoZW4gVEVfTFlOWCBpcyBkZWZpbmVkIGFzIHdlbGwgYXMgd2hlbgotCVRDX0kzODYgaXMgZGVmaW5lZC4KLQotV2VkIE1heSAgNCAwMjoyOToyMSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYXMuaCAoc3Ryc3RyKTogUmVzdG9yZSBkZWNsYXJhdGlvbi4KLQkoc3Vic2VnX2dldCkgW0JGRF9BU1NFTUJMRVJdOiBEZWNsYXJlLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIG9ial9hZGp1c3Rfc3ltdGFiIGlzIGRlZmluZWQsCi0JaW52b2tlIGl0LiAgVGhlbiBjYWxsIHNldF9zeW10YWIsIGFuZCBmaW5hbGx5IGludm9rZSAqX2Zyb2JfZmlsZQotCWhvb2tzLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfYWRqdXN0X3N5bXRhYik6IFJlbmFtZWQgZnJvbQotCWNvZmZfZnJvYl9maWxlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfYWRqdXN0X3N5bXRhYik6IENoYW5nZWQgZGVjbGFyYXRpb24KLQlhY2NvcmRpbmdseS4KLQkob2JqX2FkanVzdF9zeW10YWIpOiBNYWNybyBhbHNvIGNoYW5nZWQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWdudSopOiBOZXcgdGFyZ2V0LCBoYW5kbGVkIGxpa2UgaTM4Ni1tYWNoLgotCi1UdWUgTWF5ICAzIDIxOjA0OjE2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKSBbVENfSTk2MF06IFNlbGVjdCBsaXR0bGUKLQllbmRpYW4gdmVyc2lvbi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKFRBUkdFVF9GT1JNQVQpIFtUQ19JOTYwXTogRGl0dG8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc2VjdGlvbik6IFJvdW5kIHVwIHRoZSBzaXplIG9mCi0JZXZlcnkgc2VjdGlvbiB0byBhIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQsIHNvIHRoYXQgQkZEIGRvZXNuJ3QKLQlzdXJwcmlzZSB1cy4KLQotCUVsaW1pbmF0ZSBtYW55IHNpbXBsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gQ09GRiBiYWNrIGVuZHM6Ci0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBSZW1vdmVkIGFsbCB1c2VzIG9mIERFRlVOIGFuZCBERUZVTl9WT0lELgotCU1hZGUgbWlub3Igc3R5bGlzdGljIGNoYW5nZXMsIGRlbGV0ZWQgc29tZSByZWdpc3RlciBkZWNsYXJhdGlvbnMuCi0JKHN0YWNrX3RvcCk6IERlbGV0ZWQuCi0JKHN5bWJvbF90b19jaGFycyk6IFVzZSBhYnNvbHV0ZV9zZWN0aW9uIGFuZCByZWdfc2VjdGlvbiBpbnN0ZWFkIG9mCi0JdGhlIGNvcnJlc3BvbmRpbmcgU0VHXyogc3ltYm9scy4KLQkob2JqX2NvZmZfZW5kZWYsIHRhZ19maW5kX29yX21ha2UsIGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQkoc3RhY2sgdHlwZWRlZiwgc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3ApOgotCU1vdmVkIHRvIGp1c3QgYWZ0ZXIgcHNldWRvLW9wIHRhYmxlLiAgQWxsIGZ1bmN0aW9ucyBub3cgc3RhdGljLgotCShzdGFja19kZWxldGUpOiBSZW1vdmVkIGRlY2xhcmF0aW9uLgotCSh0YWdfaW5pdCwgdGFnX2luc2VydCwgdGFnX2ZpbmRfb3JfbWFrZSwgdGFnX2ZpbmQpOiBNb3ZlZCB0byBqdXN0Ci0JYWZ0ZXIgc3RhY2sgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IFJlb3JkZXJlZCBzb21lIGRlY2xhcmF0aW9ucyBhbmQgbWFjcm9zLgotCShzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6IERvbid0IGRlY2xhcmUuCi0JKHN0YWNrIHR5cGVkZWYpOiBEZWxldGVkLgotCShTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTKTogQWx3YXlzIHVuZGVmIHRoZW4gZGVmaW5lOyBkb24ndCB0ZXN0LgotCShTWU1fQVVYRU5UKTogTmV3IG1hY3JvLgotCShTQV9HRVRfKiwgU0FfU0VUXyopOiBEZWZpbmUgaW4gdGVybXMgb2YgU1lNX0FVWEVOVCB3aGVuIGZlYXNpYmxlLgotCShTRl9HRVRfKiwgU0ZfU0VUXyopOiBEZWZpbmUgaW4gdGVybXMgb2YgU0ZfR0VUIHdoZW4gZmVhc2libGUuCi0JKFNBX0dFVF9TWU1fVEFHTkRYLCBTQV9HRVRfU1lNX0VORE5EWCwgU0FfU0VUX1NZTV9UQUdORFgsCi0JU0FfU0VUX1NZTV9FTkRORFgsIG9iamVjdF9oZWFkZXJzIHR5cGVkZWYsIGRhdGFfc2VjdGlvbl9oZWFkZXIsCi0JdGV4dF9zZWN0aW9uX2hlYWRlcik6IERlbGV0ZSBub24tQkZEX0hFQURFUlMgdmVyc2lvbnMsIHNpbmNlIHdlCi0JYWx3YXlzIGRlZmluZSB0aGF0IHN5bWJvbCBub3cuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzdGFja190b3ApOiBEZWxldGVkLgotCShvYmpfY29mZl9lbmRlZiwgb2JqX2NvZmZfZGltLCBvYmpfY29mZl9saW5lLCBvYmpfY29mZl9zaXplLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLCBvYmpfY29mZl92YWwpOiBDaGFuZ2UKLQlhcmd1bWVudCBuYW1lIGZyb20gImlnbm9yZWQiIHRvICJpZ25vcmUiLgotCShvYmpfY29mZl92YWwpOiBVc2UgZnJhZ19ub3dfZml4LgotCShvYmpfcHNldWRvX3RhYmxlKTogUmVtb3ZlZCBJR05PUkVfREVCVUcgdmVyc2lvbiwgc2luY2UgaXQgZG9lc24ndAotCWdldCB1c2VkLgotCShzdGFjayB0eXBlZGVmLCBzdGFja19pbml0LCBzdGFja19kZWxldGUsIHN0YWNrX3B1c2gsIHN0YWNrX3BvcCk6Ci0JTW92ZWQgdG8ganVzdCBhZnRlciBwc2V1ZG8tb3AgdGFibGUuICBBbGwgZnVuY3Rpb25zIG5vdyBzdGF0aWMuCi0JKHRhZ19pbml0LCB0YWdfaW5zZXJ0LCB0YWdfZmluZF9vcl9tYWtlLCB0YWdfZmluZCk6IE1vdmVkIHRvIGp1c3QKLQlhZnRlciBzdGFjayBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogUmVvcmRlcmVkIHNvbWUgZGVjbGFyYXRpb25zIGFuZCBtYWNyb3MuCi0JUHJvdGVjdGVkIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQkoc3RhY2tfaW5pdCwgc3RhY2tfZGVsZXRlLCBzdGFja19wdXNoLCBzdGFja19wb3ApOiBEb24ndCBkZWNsYXJlLgotCShzdGFjayB0eXBlZGVmKTogRGVsZXRlZC4KLQkoU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyk6IEFsd2F5cyB1bmRlZiB0aGVuIGRlZmluZTsgZG9uJ3QgdGVzdC4KLQkoc3Rkb3V0cHV0KTogRGVsZXRlZCBkZWNsYXJhdGlvbi4KLQkoVEFSR0VUX0ZPUk1BVCkgW1RDX0kzODZdOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeSBkZWZpbmVkLgotCi1Nb24gTWF5ICAyIDE3OjA5OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IFVzZSBmaXhfdGFpbCBmaWVsZCBldmVuIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2NoYW5nZSk6IEluaXRpYWxpemUgZml4X3RhaWwgZmllbGQuCi0JKHN1YnNlZ19nZXQpOiBMaWtld2lzZS4KLQkqIHdyaXRlLmMgKGZyYWdzX2NoYWluZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShmaXhfbmV3X2ludGVybmFsKTogSWYgZnJhZ3NfY2hhaW5lZCBpcyBzZXQsIHVzZSBmaXhfcm9vdCBhbmQKLQlmaXhfdGFpbCBmcm9tIHNlZ19pbmZvIChub3dfc2VnKSwgcmF0aGVyIHRoYW4gZnJjaGFpbl9ub3cuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBTZXQgZml4X3RhaWwgZmllbGQuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogU2V0IGZyYWdzX2NoYWluZWQuCi0KLVRodSBBcHIgMjggMDE6Mzk6MTUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfb3B0aW9uKTogT25seSByZWZlciB0byBnX3N3aXRjaF8qIHZhcmlhYmxlcwotCWlmIEdQT1BUIGlzIGRlZmluZWQuCi0JKHNfYWJpY2FsbHMpOiBEaXR0by4KLQkobWRfYXBwbHlfZml4KTogQ2FzdCBjaGFyKiB0byB1bnNpZ25lZCBjaGFyKiB0byBhdm9pZCBwb2ludGVyCi0JbWlzbWF0Y2guCi0KLVdlZCBBcHIgMjcgMTE6MDY6MzIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LSotZ28zMik6IFVzZXMgY29mZiBub3cuCi0JKiBnYXNwLmMgKG1haW4pOiBOb3cgdGFrZXMgLUQgb24gY29tbWFuZCBsaW5lLgotCShzaG93X3VzYWdlKTogRGVzY3JpYmUgbmV3IG9wdGlvbnMuCi0KLVR1ZSBBcHIgMjYgMTc6MTA6MzAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IFByaW50ICJOTyBERUZJTkVEIFNZTUJPTFMiIGFuZAotCSJOTyBVTkRFRklORUQgU1lNQk9MUyIgaWYgdGhlcmUgYXJlbid0IGFueSwgaW5zdGVhZCBvZiBkaXNwbGF5aW5nCi0JdGhlIGhlYWRlciB3aXRoIGFuIGVtcHR5IGxpc3QuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaWxsX3NlY3Rpb24pOiBDaGVjayBDT0ZGX05PTE9BRF9QUk9CTEVNCi0JYWxzbyBiZWZvcmUgc2V0dGluZyBTVFlQX05PTE9BRCBmb3IgLmJzcyBzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpOiBOZXcgdmFyaWFibGUuCi0JSW5pdGlhbGl6ZWQgdG8gdmFsdWUgb2YgUkVHSVNURVJfUFJFRklYX09QVElPTkFMLCBpZiBkZWZpbmVkLCBvcgotCXplcm8uCi0JKG02OGtfcmVnX3BhcnNlKTogSWYgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsIGlzIHNldCwgcGVybWl0Ci0JcmVnaXN0ZXIgcHJlZml4IHRvIGJlIGFic2VudC4KLQkobTY4a19pcF9vcCk6IEFjY2VwdCBgJicgYWxzbyBmb3IgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQkoaW5zZXJ0X3JlZyk6IERvbid0IGJvdGhlciB3aXRoICh0d28hPykgc2FuaXR5IGNoZWNrcyBvZiB0aGUKLQlzeW1ib2wgdGFibGUgd2hlbiBpbnNlcnRpbmcgZWFjaCByZWdpc3Rlci4KLQkobTY4a19wYXJzZV9sb25nX29wdGlvbik6IE5ldyBmdW5jdGlvbi4gIFNldAotCWZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCBpZiAicmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIiBpcyBwYXNzZWQuCi0JKiBjb25maWcvdGMtbTY4ay5oIChSRUdJU1RFUl9QUkVGSVgpOiBBbHdheXMgZGVmaW5lIGlmIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQkoT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYKTogRG9uJ3QgZGVmaW5lLgotCShSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwpOiBJZiBub3QgYWxyZWFkeSBkZWZpbmVkLCBkZWZpbmUgYXMgemVybwotCW9yIG9uZSBkZXBlbmRpbmcgb24gTTY4S0NPRkYuCi0KLQlTb21lIGNoYW5nZXMgdG8gaGVscCBBcG9sbG8gc3VwcG9ydCwgZnJvbSB0cm95QGNibWUudW5zdy5lZHUuYXU6Ci0JKiBjb25maWcvdGMtbTY4ay5jIChEQVRBLCBBRERSLCBTUCwgRlBSRUcsIENPUE5VTSwgQkFELCBCQUMpOgotCURlZmluZSBhcyBtYWNyb3MgaW5zdGVhZCBvZiBlbnVtZXJhdG9ycywgc2luY2UgdGhlIEFwb2xsbyBjb21waWxlcgotCWNhbid0IGhhbmRsZSAiZW51bVZhbDEsIGVudW1WYWwyID0gZW51bVZhbDEiIHdoZW4gZGVmaW5pbmcgYW4gZW51bQotCXR5cGUuCi0JKG1ha2VfcGNyZWxfYWJzb2x1dGUpIFtOT19QQ1JFTF9SRUxPQ1NdOiBOZXcgZnVuY3Rpb24uCi0JKHRjX2NvZmZfZml4MnJ0eXBlKSBbTk9fUENSRUxfUkVMT0NTXTogR2VuZXJhdGUgb25seSBSX1JFTEJZVEUsCi0JUl9ESVIxNiwgYW5kIFJfRElSMzIgcmVsb2NzLgotCSogY29uZmlnL3RjLW02OGsuaCBbVEVfQVBPTExPXSAoQ09GRl9NQUdJQywgQ09GRl9BT1VUSERSX01BR0lDKToKLQlVc2UgQXBvbGxvIHZlcnNpb25zLgotCVtURV9BUE9MTE9dIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUik6IFVuZGVmaW5lLiAgVGhhdCBpcywKLQlkbyBpbmNsdWRlIHRoZSBvcHRpb25hbCBoZWFkZXIgZm9yIEFwb2xsbyB0YXJnZXQuCi0JKENPRkZfTUFHSUMpOiBEb24ndCBkZWZpbmUgYXMgTUM2OE1BR0lDIGlmIGl0J3MgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5oIFtURV9ERUxUQV0gKExFWF9QQ1QpOiBEZWZpbmUgYXMgMSwgc28gdGhhdCBgJScKLQljYW4gYmUgdXNlZCB3aXRoaW4gYSBsYWJlbCBuYW1lLgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChtNjhrX2luaXRfYWZ0ZXJfYXJncyk6IERlY2xhcmUuCi0JKHRjX2luaXRfYWZ0ZXJfYXJncyk6IERlZmluZSBhcyBtNjhrX2luaXRfYWZ0ZXJfYXJncy4KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaW5pdF9hZnRlcl9hcmdzKTogTmV3IGZ1bmN0aW9uLAotCWNvbnRhaW5pbmcgb25lLXNob3QgY29kZSBmcm9tIG1kX2Fzc2VtYmxlLiAgQWRkZWQgd2FybmluZyBmb3IKLQljb21iaW5hdGlvbiBvZiA2ODA0MCBhbmQgNjg4NTEuCi0JKG1kX2Fzc2VtYmxlKTogU3RhcnR1cC10aW1lIGNvZGUgZGVsZXRlZC4KLQotTW9uIEFwciAyNSAxNjoxOToxNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoY2xlYW4sIGRpc3RjbGVhbik6IFJlbW92ZSBhc2NvbmZpZy50ZXhpLgotCi1TdW4gQXByIDI0IDAwOjEzOjA4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IDEzIGJpdCBpbW1lZGlhdGUgY29uc3RhbnQgKGZvciBicmVhawotCWluc3RydWN0aW9uKSBpcyB1bnNpZ25lZC4KLQotRnJpIEFwciAyMiAxNzo1ODoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogVXNlIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUKLQlhbmQgYmZkX2Vjb2ZmX3NldF9yZWdtYXNrcyB0byBzZXQgdGhlIEdQIHZhbHVlIGFuZCB0aGUgcmVnaXN0ZXIKLQltYXNrcywgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIG5vdyBvYnNvbGV0ZSBmYWtlIC5yZWdpbmZvIHNlY3Rpb24uCi0KLUZyaSBBcHIgMjIgMTU6MTc6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IERvbid0IHByaW50IHJlZ2lzdGVyIHN5bWJvbHMgYXMKLQl1bmRlZmluZWQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogRG9uJ3QgbmVlZCB0byBzdHJpcAotCXVuZGVyc2NvcmVzLCBzaW5jZSBzeW1ib2xfbmV3IHdpbGwgYWxyZWFkeSBoYXZlIGRvbmUgaXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IERpdHRvLgotCi0JKiBhcy5jIChtYWluKTogSWYgdGNfaW5pdF9hZnRlcl9hcmdzIGlzIGRlZmluZWQsIGludm9rZSBpdCBhZnRlcgotCWFsbCBhcmd1bWVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KLQotCVNvbWUgY2hhbmdlcyB0byBoZWxwIEFwb2xsbyBzdXBwb3J0LCBmcm9tIHRyb3lAY2JtZS51bnN3LmVkdS5hdToKLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcykgW1RFX0FQT0xMT106IENyZWF0ZSAud3RleHQKLQlzZWN0aW9uIGluc3RlYWQgb2YgLnRleHQuICBDYWxsIGNyZWF0ZV90YXJnZXRfc2VnbWVudHMuCi0JKiByZWFkLmMgKGRlbWFuZF9jb3B5X3N0cmluZyk6IE5vIGxvbmdlciBzdGF0aWMuCi0KLVRodSBBcHIgMjEgMTU6NTA6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IFBlcm1pdCBicmFuY2hlcyB0byBiZSBzd2l0Y2hlZAotCXdpdGggdGhlIHByZWNlZGluZyBpbnN0cnVjdGlvbiBldmVuIGlmIC5zZXQgbm9ib3B0IGhhcyBiZWVuIHNlZW4uCi0JLnNldCBub2JvcHQgYWN0dWFsbHkgY29udHJvbHMgd2hldGhlciB0byBicmluZyB1cCBhbiBpbnN0cnVjdGlvbgotCWZyb20gdGhlIGJyYW5jaCB0YXJnZXQsIHdoaWNoIGdhcyBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydC4KLQotV2VkIEFwciAyMCAxODo0NjoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCwgY29uZmlnL29iai1jb2ZmLmM6IERlbGV0ZWQgYWxsIGNvZGUgdXNlZCBvbmx5Ci0Jd2hlbiBCRkRfQVNTRU1CTEVSIGlzIG5vdCBkZWZpbmVkLCBhbmQgYWxsIGNvbmRpdGlvbmFscyByZWxhdGluZwotCXRvIHN1Y2ggY29kZS4gIE5vIHN1Y2ggdGFyZ2V0cyByZW1haW4uCi0KLQlGaXhlcyBmb3Igc3RhYnMtaW4tY29mZjoKLQkqIGNvbmZpZy9vYmotY29mZi5jOiBJbmNsdWRlIHN1YnNlZ3MuaC4KLQkoY29mZl9mcm9iX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1jb2ZmLmggKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uLAotCWNvZmZfZnJvYl9zZWN0aW9uKTogRGVjbGFyZS4KLQkob2JqX2Zyb2Jfc2VjdGlvbik6IE5ldyBtYWNybzsgdXNlcyBjb2ZmX2Zyb2Jfc2VjdGlvbi4KLQkoSU5JVF9TVEFCX1NFQ1RJT04pOiBOZXcgbWFjcm87IHVzZXMgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9zZWN0aW9uX2FsaWduKTogQWx3YXlzIHJvdW5kIHVwIHRvCi0JbXVsdGlwbGUgb2YgYWxpZ25tZW50IHBvd2VyIHNwZWNpZmllZCBpbiBiZmQgdGFyZ2V0IHZlY3Rvci4KLQotCSogZ2FzcC5jOiBJbmNsdWRlIGN0eXBlLmguCi0KLU1vbiBBcHIgMTggMjE6MDg6MDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvYXMudGV4aW5mbzogUmVuYW1lZCBhc2RvYy1jb25maWcudGV4aSB0bwotCWFzY29uZmlnLnRleGkuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvLWFzLCBpbnN0YWxsLWluZm8tZ2FzcCk6IEdldCBmaWxlCi0JbmFtZXMgZnJvbSBzb3VyY2UgZGlyZWN0b3J5IHdpdGhvdXQgcGF0aG5hbWUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmMgKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IFdoaWxlIGxvb2tpbmcgZm9yCi0JcmVnaXN0ZXIgbWFzaywgc2tpcCBlbXB0eSBmaWxsIGZyYWdzIGNhdXNlZCBieSBlbmFibGluZyBsaXN0aW5nCi0Jb3V0cHV0LgotCi0JKiBjb25maWcvaG8tc3lzdi5oOiBJbmNsdWRlIHN0cmluZy5oLgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IE5ldyAod2VsbCwgcmVjZW50bHkgYWRkZWQpIGZpbGUuICBKdXN0IGFkZGVkCi0JaW5mbyBvbiBhc193YXJuIGFuZCBmcmllbmRzLgotCi1Nb24gQXByIDE4IDE0OjI4OjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9wYXJzZV9zcGFjZV9zdG10KTogVXNlIHRoZSBidWlsdC1pbgotCWRlZmF1bHRzIGZvciBkZWZpbmVkLCBwcml2YXRlLCBhbmQgc3BudW0gZmllbGRzIGZvciB0aGUKLQkkVEVYVCQgYW5kICRQUklWQVRFJCBzcGFjZXMuICBEbyBub3QgY2xvYmJlciBzcG51bS4gIERvCi0Jbm90IHJlc2V0IHRoZSBzZWdtZW50IGlmIGp1c3QgdXBkYXRpbmcgYSBzcGFjZS4KLQkocGFfc3BhY2VzX2JlZ2luKTogU2V0IEJGRCBzZWN0aW9uIGZsYWdzIGZvciBhbGwgYnVpbHQtaW4KLQlzdWJzcGFjZXMuCi0KLUZyaSBBcHIgMTUgMTA6NTE6NTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChmaXJzdF9wcm9jX3B0cik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFkZF9wcm9jZWR1cmUpOiBTZXQgZmlyc3RfcHJvY19wdHIgaWYgaXQgaGFzbid0IGJlZW4gc2V0LgotCShlY29mZl9idWlsZF9saW5lbm8pOiBJZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGRvZXMgbm90IHN0YXJ0IGF0Ci0JYWRkcmVzcyB6ZXJvLCBpbnNlcnQgYSBkdW1teSBsaW5lIHRvIGNvbXBlbnNhdGUuCi0KLQkqIE1ha2VmaWxlLmluIChib290c3RyYXAsIGJvb3RzdHJhcDIsIGJvb3RzdHJhcDMpOiBNYWtlIGdhc3AubmV3Ci0JYXMgd2VsbCBhcyBhcy5uZXcuCi0KLVRodSBBcHIgMTQgMTU6MTI6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChvcGVyYW5kKTogVHJ5IHRvIHBhcnNlICIwZiIgYW5kICIwYiIgc2VxdWVuY2VzIGFzCi0JZmxvYXRpbmcgcG9pbnQgYW5kIGJpbmFyeSBudW1iZXJzIHJlc3BlY3RpdmVseTsgaWYgaXQgZG9lc24ndAotCXdvcmssIHRyZWF0IHRoZW0gYXMgbG9jYWwgbGFiZWxzLgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSAkKE9CSlMpIGRlcGVuZCBvbiAkKEFMTF9PQkpfREVQUykuCi0JKiBjb25maWd1cmUuaW46IFNldCBBTExfT0JKX0RFUFMgaW4gb3V0cHV0IE1ha2VmaWxlLgotCi0JQmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSA8QkFJTEVZQGhtaXZheC5odW1nZW4udXBlbm4uZWR1PgotCShDaGFybGVzIEJhaWxleSk6Ci0JKiB2bXNjb25mLnNoOiBJbiBnZW5lcmF0ZWQgZmlsZSwgZ2V0ICIub2JqIiBzdWZmaXggcmlnaHQsIGJ1aWxkCi0Jc291cmNlIGZpbGVzIGZyb20gb3RoZXIgZGlyZWN0b3JpZXMgaW50byBvYmplY3RzIGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LCBhbmQgc3BlY2lmeSBQU0VDVCBhdHRyaWJ1dGVzIGV4cGxpY2l0bHkgdG8gbGlua2VyLgotCUFsc28gYWRkZWQgbWlzc2luZyBsYWJlbC4KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1tay5jb20pOiBSZWZlcmVuY2UgbmV3IHZhcmlhYmxlCi0JVk1TX09USEVSX09CSlMgZm9yIGxpc3Qgb2Ygbm9uLWxvY2FsIG9iamVjdCBmaWxlcywgaW5zdGVhZCBvZgotCWxpc3RpbmcgdGhlbSBoZXJlLgotCShWTVNfT1RIRVJfT0JKUyk6IE5ldyB2YXJpYWJsZSwgYWRkZWQgbW9yZSBsaWJpYmVydHkgZmlsZXMuCi0JKiBtYWtlLWdhcy5jb206IFJlZ2VuZXJhdGVkLgotCi0JKiBjb25maWcvaG8tdm1zLmggKHVubGluayk6IERlZmluZSBhcyBkZWxldGUuCi0KLQkqIGNvbmZpZy1nYXMuY29tOiBGaXggcXVvdGluZyBvbiBUQVJHRVRfQ0FOT05JQ0FMIGRlZmluaXRpb24uCi0JRGVsZXRlIGZpbGVzIGJlZm9yZSBjcmVhdGluZyB0aGVtLgotCi1UaHUgQXByIDE0IDEzOjM0OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlLXN0YWdlMSwgZGUtc3RhZ2UyLCBkZS1zdGFnZTMpOiBVc2Ugcm0gLWYuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKERJRkZfRVhQUl9PSyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogUGVybWl0IEJGRF9SRUxPQ19QQ1JFTF9MTzE2IGZvcgotCWNlcnRhaW4gY2FzZXMgb2YgJ2knLCAnaicgYW5kICdvJy4gIENoYW5nZSAndScgdG8gdGFrZSBhbgotCWFyZ3VtZW50LCB0aGUgcmVsb2MgdHlwZS4KLQkobG9hZF9yZWdpc3Rlcik6IFBhc3MgcmVsb2MgdHlwZSB0byBtYWNyb19idWlsZCBmb3IgJ3UnLgotCShtYWNybyk6IExpa2V3aXNlLiAgRm9yIE1fTEFfQUIgcGVybWl0IGEgZGlmZmVyZW5jZSBleHByZXNzaW9uCi0Jd2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlIGJldHdlZW4gYW4gYXJiaXRyYXJ5IHN5bWJvbCBhbmQKLQlhIHN5bWJvbCBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUyBhbmQKLQlCRkRfUkVMT0NfUENSRUxfTE8xNiB0byBiZSBlbWl0dGVkLgotCShtZF9hcHBseV9maXgpOiBDaGVjayB0aGF0IG1vc3QgcmVsb2NzIGFyZSBub3QgUEMgcmVsYXRpdmUuCi0JSGFuZGxlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgYW5kIEJGRF9SRUxPQ19QQ1JFTF9MTzE2LgotCSh0Y19nZW5fcmVsb2MpOiBDaGFuZ2UgI2Vycm9yIHRvIGFzX2ZhdGFsLiAgSGFuZGxlCi0JQkZEX1JFTE9DX1BDUkVMX0xPMTYgYW5kIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MuCi0KLVR1ZSBBcHIgMTIgMTg6MjU6MTMgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ3NfYmVnaW4pOiBDYWxsIG1lbXNldCB3aXRoIGFyZ3MgaW4gdGhlIGNvcnJlY3QKLQlvcmRlci4KLQkoc3Vic2VnX2dldCk6IENsZWFyIG5ld2x5IGFsbG9jYXRlZCBzZWdpbmZvLCBzZXQgaXRzIHBvaW50ZXIgc2xvdHMKLQl0byBOVUxMIGluc3RlYWQgb2YgMC4KLQotTW9uIEFwciAxMSAwOTowMDo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IEhhbmRsZSBjYXNlIHdoZXJlIGxhYmVsIHdhcwotCWRlZmluZWQgYWZ0ZXIgdGhlIC5wcm9jIGRpcmVjdGl2ZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IEdpdmUgYW4gZXJyb3IgaWYgd2UgZW5jb3VudGVyIGEKLQlwcm9jZW5kIGZvciBhIHByb2NlZHVyZSB3aXRob3V0IGEgbmFtZS4KLQotVGh1IEFwciAgNyAxNDoyODozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogUGFzcyBOVUxMIGZvciBleHByZXNzaW9uIGFyZ3VtZW50IHRvCi0JbWFjcm9fYnVpbGQgZm9yIG5vcmkgY2FzZS4KLQkoU1dJVENIX1RBQkxFKTogRGVmaW5lLgotCShtaXBzX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBhIHJlbG9jYXRpb24gZm9yIGEgc3dpdGNoIHRhYmxlCi0JZW50cnkuCi0JKG1kX2FwcGx5X2ZpeCk6IFdyaXRlIHN3aXRjaCB0YWJsZSBlbnRyeSB2YWx1ZSBpbnRvIGZpbGUuCi0JKHRjX2dlbl9yZWxvYyk6IFVzZSBCRkRfUkVMT0NfR1BSRUwzMiBmb3IgYSBzd2l0Y2ggdGFibGUgZW50cnksCi0JYW5kIHNldCB0aGUgYWRkZW5kIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kCi0JdGhlIHN1YnRyYWhlbmQuCi0KLVRodSBBcHIgIDcgMTA6Mzg6MTggMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGVsZl90Y19zeW1ib2wpOiBEZWxldGUuICBObyBsb25nZXIgdXNlZC4KLQkoZWxmX3RjX21ha2Vfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zLCBocHBhX3RjX3N5bWJvbCk6IERlbGV0ZSBleHRlcm4gZGVjbHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IERlbGV0ZSBmdW5jdGlvbi4KLQkoaHBwYV90Y19zeW1ib2wpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IERlbGV0ZSBlbGZfdGNfc3ltYm9sIGFuZAotCWVsZl90Y19tYWtlX3NlY3Rpb25zIHN0dWZmLiAgSXQgd2FzIHRoZXJlIHRvIHN1cHBvcnQgUEEgYnJhaW5kYW1hZ2UKLQl3aGljaCBoYXMgYmVlbiBmaXhlZCwgYW5kIGluIHRoZSBjYXNlIG9mIGVsZl90Y19tYWtlX3NlY3Rpb25zIGlzCi0JcmVkdW5kYW50IHdpdGggZWxmX3RjX2ZpbmFsX3Byb2Nlc3NpbmcuCi0KLVdlZCBBcHIgIDYgMjA6NDg6MzAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi0qZWxmKik6IERvbid0IHJlcXVpcmUgIi1ocC0iIGZvciB0aGUKLQltYW51ZmFjdHVyZXIuCi0KLVR1ZSBBcHIgIDUgMTU6NDg6MDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogRm9yIGNhc2UgJ28nLCB3aGVuIGdlbmVyYXRpbmcKLQllbWJlZGRlZCBQSUMgY29kZSwgYWNjZXB0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGxvY2FsIHN5bWJvbHMKLQlhcyBiZWluZyBjb25zdGFudC4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogT25seSBmb3JjZSBhIHJlbG9jIHRvIGJlIGdlbmVyYXRlZCBmb3IgYQotCVBDIHJlbGF0aXZlIGZpeHVwLgotCShtZF9hcHBseV9maXgpOiBGb3IgQkZEX1JFTE9DXzMyIGFuZCBCRkRfUkVMT0NfTE8xNiwgcHV0IHRoZSBmaXh1cAotCXZhbHVlIGludG8gdGhlIGZpbGUgaWYgdGhlIGZpeHVwIHdpbGwgbm90IGdlbmVyYXRlIGEgcmVsb2MuCi0KLVR1ZSBBcHIgIDUgMTE6MTQ6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogSWYgc2VjdGlvbiBwYXNzZWQgaXNuJ3QgYnNzLAotCWRvbid0IHNwZXcgcmVtYWluZGVyIG9mIGlucHV0IGZpbGUgaW4gZXJyb3IgbWVzc2FnZS4KLQkodGNfZ2VuX3JlbG9jKTogSWYgYmZkX3JlbG9jX3R5cGVfbG9va3VwIHJldHVybnMgbnVsbCwgcHJpbnQgZXJyb3IKLQltZXNzYWdlIHdpdGggcmVsb2MgdHlwZSBhbmQgdHJ5IHRvIHByb2Nlc3MgcmVtYWluZGVyIG9mIGZpbGUuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvLWFzLCBpbnN0YWxsLWluZm8tZ2FzcCk6IE5ldwotCXRhcmdldHMsIG5vdyBleHBsaWNpdGx5IGNoZWNraW5nICQoc3JjZGlyKSBmb3IgaW5mbyBmaWxlcy4KLQkoaW5zdGFsbC1pbmZvKTogRGVwZW5kIG9uIGJvdGggb2YgdGhlbTsgZG8gbm90aGluZyBtb3JlLgotCi1Nb24gQXByICA0IDE3OjA2OjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCB0aGlua28gaW4gRUxGIHZlcnNpb24uCi0KLU1vbiBBcHIgIDQgMTI6Mzk6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19pbnNlcnRfb3BlcmFuZCk6IENoZWNrIFBQQ19PUEVSQU5EX1NJR05FRAotCWZsYWcgcmF0aGVyIHRoYW4gc2lnbmVkcCBmaWVsZC4gIE9ubHkgcGVybWl0IGV4dGVuZGVkIHJhbmdlIGlmCi0JUFBDX09QRVJBTkRfU0lHTk9QVCBmbGFnIGlzIHNldCBhbmQgYXNzZW1ibGluZyBpbiAzMiBiaXQgbW9kZS4KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIERhdmlkIEVkZWxzb2huIChlZGVsc29obkBucGFjLnN5ci5lZHUpLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19zaXplKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHBjX2FyY2gpOiBDaGVjayBmb3IgUFBDX09QQ09ERV9QUEMgYmVmb3JlIFBQQ19PUENPREVfUE9XRVIuCi0JKG1kX2JlZ2luKTogSWYgYW4gaW5zdHJ1Y3Rpb24gaGFzIGEgc2l6ZSBzcGVjaWZpYyBmbGFnIHNldCwgb25seQotCWFkZCBpdCBpZiB3ZSBhcmUgYXNzZW1ibGluZyB0aGF0IHNpemUuCi0KLVRodSBNYXIgMzEgMTY6NTE6MTYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogQWRkIGEgZ3J1ZXNvbWUgaGFjayB0byBnZXQKLQljcm9zcyBzZWN0aW9uIFBDIHJlbGF0aXZlIHJlbG9jcyByaWdodCBmb3IgQ09GRiBhbmQgRUxGLgotCi1Nb24gTWFyIDI4IDE0OjM4OjIzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogQWx3YXlzIGRlZmluZS4KLQkoT0JKX1BST0NFU1NfU1RBQik6IERvbid0IGRlZmluZS4KLQotTW9uIE1hciAyOCAxMjo0MDoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbHMpOiBEb24ndCBsZXQgQkZEIGNsb2JiZXIKLQl0aGUgdHlwZSBvZiBzeW1ib2wgc2V0IHN5bWJvbHMgd2hpY2ggaGFwcGVuIHRvIGJlIGluIHRoZSBhYnNvbHV0ZQotCW9yIHVuZGVmaW5lZCBzZWN0aW9uLgotCi1Nb24gTWFyIDI4IDEyOjM1OjAwIDE5OTQgIERhdmlkIEVkZWxzb2huICAoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KQotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCAtbXB3cnggKFBPV0VSLzIgYWthCi0JUklPUzIpLCAtbXB3ciAoUE9XRVIgYWthIFJJT1MxKSwgLW1wcGMgKFBvd2VyUEMgYWthIE1QQzYwMy82MDQpLAotCWFuZCAtbWFueSAoYWxsIGFyY2hpdGVjdHVyZXMpLgotCi1TdW4gTWFyIDI3IDE0OjA0OjE5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MpOiBTZXQgYWRkZW5kIGZvciByZWxvY2F0aW9uCi0JaW52b2x2aW5nIGEgZnVuY3Rpb24gc3ltYm9sIHdoaWNoIGlzIG5vdCBhIHBsYWJlbCB0byB6ZXJvLgotCShtZF9hcHBseV9maXgpOiBOZXZlciBwYXNzIGEgZnVuY3Rpb24gc3ltYm9sIHRvIGZpZWxkX2FkanVzdC4KLQotRnJpIE1hciAyNSAxNzozNTo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IElmIE5fRVhUIGlzIHNldCBmb3IgYW4KLQlOX0lORFIgc3ltYm9sLCBzZXQgQlNGX0VYUE9SVCBhbmQgY2xlYXIgQlNGX0xPQ0FMLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IElmIEVNQkVEREVEX1BJQywgZG9uJ3Qgc3dhcCBhCi0JYnJhbmNoIHdpdGggYW4gaW5zdHJ1Y3Rpb24gdGhhdCB1c2VzICRhdCwgaW4gY2FzZSB0aGUgYnJhbmNoIGlzCi0JbGF0ZXIgZXhwYW5kZWQuCi0JKG1hY3JvKTogSWYgRU1CRURERURfUElDLCBjYXNlIE1fSkFMX0EgbWF5IHVzZSAkYXQuCi0JKG1kX3BjcmVsX2Zyb20pOiBJZiBub3QgT0JKX0FPVVQsIHJldHVybiA0IGZvciBhbiB1bmRlZmluZWQgc3ltYm9sCi0JdG8gbWFrZSBpdCBwY3JlbF9vZmZzZXQuCi0JKHRjX2dlbl9yZWxvYyk6IElmIG5vdCBPQkpfQU9VVCwgc2V0IHRoZSByZWxvYyBhZGRlbmQgdG8KLQlyZWxvYy0+YWRkcmVzczsgYW5vdGhlciBncnVlc29tZSBoYWNrIHRvIGdldCBnYXMgcmVsb2MgaGFuZGxpbmcgdG8KLQlkbyB0aGUgcmlnaHQgdGhpbmcuCi0KLVRodSBNYXIgMjQgMjE6Mjk6MjkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogT25seSBzZXQgR1AgcHJvbG9nIHNpemUgaWYgdXNpbmcKLQlQViByZWdpc3Rlci4KLQkoVDEyKTogTmV3IG1hY3JvLgotCShlbWl0X2luc24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogQ2FsbCBpdC4KLQkoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IEhhbmRsZSBCRkRfUkVMT0NfMjYsIGZvciBjYWxsX3BhbAotCWluc3RydWN0aW9ucy4KLQkobGl0dXNlX3BlbmRpbmcpOiBOZXcgdmFyaWFibGUuICBTZXQgYnkgYW55dGhpbmcgdGhhdCBnZW5lcmF0ZXMgYQotCUxJVEVSQUwgcmVsb2MsIGNsZWFyZWQgYnkgYW55dGhpbmcgdGhhdCBnZW5lcmF0ZXMgYSBMSVRVU0UgcmVsb2MsCi0JdGVzdGVkIGJ5IGNvZGUgdGhhdCBtaWdodCB3YW50IHRvIGVtaXQgYSBMSVRVU0UgcmVsb2MuCi0JKGVtaXRfdW5hbGlnbmVkX2lvKTogTmV3IGZ1bmN0aW9uLiAgQ3VycmVudGx5IGNhbGxzIG1kX2Fzc2VtYmxlLAotCWJ1dCBpdCBzaG91bGQgZXZlbnR1YWxseSBiZSBjb252ZXJ0ZWQgdG8gZ2VuZXJhdGUgdGhlIGluc24gaXRzZWxmCi0JYW5kIGNhbGwgZW1pdF9pbnNuIGRpcmVjdGx5LgotCShlbWl0X2xvYWRfdW5hbCwgZW1pdF9zdG9yZV91bmFsLCBlbWl0X2J5dGVfbWFuaXBfciwKLQllbWl0X2V4dHJhY3RfciwgZW1pdF9pbnNlcnRfciwgZW1pdF9tYXNrX3IsIGVtaXRfc2lnbl9leHRlbmQsCi0JZW1pdF9iaXNfcik6IExpa2V3aXNlLgotCShhbHBoYV9pcCwgY2FzZSAnSScpOiBIYW5kbGUgd2l0aCBCRkRfUkVMT0NfMjMuCi0JKGFscGhhX2lwLCBsYWJlbCBnZXRfbWFjcm8pOiBEb24ndCBlbWl0IHRoZSBmaW5hbCBpbnN0cnVjdGlvbiBpZgotCXRoZSBvcGNvZGUgaXMgemVyby4KLQkoYWxwaGFfaXAsIGNhc2UgJ0InLCBzdWJjYXNlICdkJyk6IE5ldyBjYXNlLCBmb3Igc3Vid29yZCBhbmQKLQl1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBtYWNyb3MuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfMjYuICBHZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIGlmCi0JdGhlIHZhbHVlIGNhbid0IGJlIHJlc29sdmVkLgotCi1XZWQgTWFyIDIzIDE2OjA2OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogRm9yIC1tZW1iZWRkZWQtcGljLCBmb3JjZQotCXRoZSAtRyB2YWx1ZSB0byAweDdmZmZmZmZmLiAgRm9yIFNWUjQgUElDIG9wdGlvbnMsIGRvbid0IGNhbGwKLQliZmRfc2V0X2dwX3NpemUgaGVyZSwgaXQncyBkb25lIGluIG1kX2JlZ2luLiAgRG9uJ3QgcGVybWl0IC1HIHdpdGgKLQktbWVtYmVkZGVkLXBpYy4KLQkobWlwc19mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXgpOiBTZXQgZml4UC0+ZnhfZG9uZSBhcHByb3ByaWF0ZWx5LgotCShzX2NoYW5nZV9zZWMpOiBGb3IgRU1CRURERURfUElDLCBjaGFuZ2UgLmRhdGEgYW5kIC5yZGF0YSB0bwotCS5zZGF0YS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRDX0ZPUkNFX1JFTE9DQVRJT04pOiBEZWZpbmUuCi0JKG1pcHNfZm9yY2VfcmVsb2NhdGlvbik6IERlY2xhcmUuCi0JKFRDX0hBTkRMRV9GWF9ET05FKTogRGVmaW5lLgotCi1UdWUgTWFyIDIyIDEzOjU4OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoZW51bSBtaXBzX3BpY19sZXZlbCk6IE5ldyBlbnVtLgotCShtaXBzX3BpYyk6IENoYW5nZSBmcm9tIGludCB0byBlbnVtIG1pcHNfcGljX2xldmVsLiAgQ2hhbmdlIGFsbAotCXVzZXMgKDAgYmVjb21lcyBOT19QSUMsIDIgYmVjb21lcyBTVlI0X1BJQykuCi0JKGxvYWRfYWRkcmVzcyk6IEhhbmRsZSBFTUJFRERFRF9QSUMuCi0JKG1hY3JvKTogSGFuZGxlIEVNQkVEREVEX1BJQyBpbiBhbGwgUElDIGNhc2VzLgotCShtZF9wYXJzZV9vcHRpb24pOiBBY2NlcHQgLW1lbWJlZGRlZC1waWMgdG8gdXNlIEVNQkVEREVEX1BJQy4gIElmCi0JT0JKX0VMRiwgYWNjZXB0IC1LUElDIGFuZCAtY2FsbF9zaGFyZWQgdG8gdXNlIFNWUjRfUElDIGFuZCBhY2NlcHQKLQktbm9uX3NoYXJlZCB0byB1c2UgTk9fUElDICh0aGlzIGlzIGhvdyB0aGUgSXJpeCA1IGFzc2VtYmxlcgotCXdvcmtzKS4gIERvIG5vdCBwZXJtaXQgLUcgd2l0aCBTVlI0X1BJQy4KLQkoc19hYmljYWxscyk6IFdhcm4gaWYgLUcgd2FzIHVzZWQsIGFuZCBmb3JjZSAtRyAwLgotCSh0Y19nZW5fcmVsb2MpOiBTZXQgcmVsb2MtPmFkZGVuZCB0byAwIGZvciBhIFBDIHJlbGF0aXZlIHJlbG9jIGZvcgotCWFueXRoaW5nIGJ1dCBhLm91dCwgbm90IGp1c3QgZm9yIEVMRi4gIEZvciBFQ09GRiwgZG9uJ3QgZ2VuZXJhdGUgYQotCUJGRF9SRUxPQ18xNl9QQ1JFTF9TMiByZWxvYyB1bmxlc3MgdXNpbmcgRU1CRURERURfUElDLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IERlZmluZSB0byBiZSAxLgotCi1TdW4gTWFyIDIwIDE2OjMxOjU1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjcmVhdGVfbmV3X3NwYWNlKTogVXNlIGludHMsIG5vdCBjaGFycyBhcwotCXBhcmFtZXRlcnMgdG8gYXZvaWQgbG9zaW5nIHdoZW4gY29tcGlsaW5nIHdpdGggSFAgQ0MuCi0JKGNyZWF0ZV9uZXdfc3Vic3BhY2UsIHVwZGF0ZV9zdWJzcGFjZSwgZml4X25ld19ocHBhKTogTGlrZXdpc2UuCi0KLVN1biBNYXIgMjAgMTQ6NDM6MTQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy1zdGFtcCk6IElmIGBkZWZzJyBpcyBkZWZpbmVkLCBlbWl0IGEKLQlwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIHRvIGNyZWF0ZSBhIG1hY3JvIG5hbWVkIGJ5IHRoaXMgdmFsdWUgaW50bwotCWNvbmZpZy5uZXc7IGRvbid0IGV4cGxpY2l0bHkgZ28gZm9yIEJGRF9BU1NFTUJMRVIuCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBgZGVmcycsIG5vdCBgQkZEREVGJy4gIFNldCBpdCB0bwotCU1BTllfU0VHTUVOVFMgZm9yIGFueSBvYmotY29mZmJmZCB0YXJnZXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoQkZEX0hFQURFUlMsIEJGRCk6IERlZmluZS4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdCAoVERFRklORVMpOiBEb24ndCBkZWZpbmUgQkZELCBNQU5ZX1NFR01FTlRTLAotCW9yIEJGRF9IRUFERVJTLgotCShMT0NBTF9MT0FETElCRVMpOiBEZWxldGVkLgotCSogY29uZmlnL202OGtjb2ZmLm10IChUREVGSU5FUyk6IERvbid0IGRlZmluZSB0aG9zZSBtYWNyb3MuCi0JKiBjb25maWcvbTg4a2NvZmYubXQgKFRERUZJTkVTKTogRGl0dG8uCi0JKiBjb25maWcvZWJtb24yOWsubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaDgzMDBoZHMubXQ6IERlbGV0ZWQuCi0JKiBjb25maWcvaWM5NjBjb2ZmLm10OiBEZWxldGVkLgotCSogY29uZmlnL3NwYXJjLm10OiBEZWxldGVkLgotCSogY29uZmlnL2g4MzAwLm10IChMT0NBTF9MT0FETElCRVMsIFRERUZJTkVTKTogRGVsZXRlZC4KLQkqIGNvbmZpZy9oODUwMC5tdCAoTE9DQUxfTE9BRExJQkVTLCBUREVGSU5FUyk6IERlbGV0ZWQuCi0JKiBjb25maWcvc2gubXQgKExPQ0FMX0xPQURMSUJFUywgVERFRklORVMpOiBEZWxldGVkLgotCSogY29uZmlnL3o4ay5tdCAoTE9DQUxfTE9BRExJQkVTKTogRGVsZXRlZC4KLQkoVERFRklORVMpOiBEb24ndCBkZWZpbmUgdGhlIGNvZmZiZmQgbWFjcm9zLgotCi0JKiBNYWtlZmlsZS5pbjogSW5zZXJ0IG1ha2VmaWxlIGZyYWdtZW50cyBiZWZvcmUgT0JKUyBkZWZpbml0aW9uLgotCShPQkpTKTogQWRkICQoVEVfT0JKUykuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogU3VwcGx5ICJzZWN0aW9uIgotCXVuY29uZGl0aW9uYWxseS4KLQotCSogd3JpdGUuYyAoc2V0X3N5bXRhYik6IERlZmluZSBvbmx5IGlmIEJGRF9BU1NFTUJMRVIuCi0KLVN1biBNYXIgMjAgMTI6MDY6MDUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChTVEFHRVNUVUZGKTogQWRkIGdhc3AubmV3LgotCi1GcmkgTWFyIDE4IDIwOjA5OjE2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHN5bWJvbF90YWJsZV9mcm96ZW4pOiBOZXcgdmFyaWFibGUsIHRvIGJlIHNldCBhZnRlcgotCWJmZF9zZXRfc3ltdGFiIGlzIGNhbGxlZC4KLQkoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IE5vdGUgd2hldGhlciBhIHN5bWJvbCBpcyBhIHNlY3Rpb24gc3ltYm9sCi0Jb3Igbm90LgotCShhZGp1c3RfcmVsb2Nfc3ltcyk6IEZvciBub3csIGFsd2F5cyBzdXBwbHkgYW4gYWJzb2x1dGUgc3ltYm9sIGZvcgotCWZpeHVwcyB3aXRob3V0IHN5bWJvbHMgYnV0IG5vdCB5ZXQgYGRvbmUnLiAgVXNlIHNlY3Rpb25fc3ltYm9sIHRvCi0JZ2V0IHRoZSBzeW1ib2wsIGluc3RlYWQgb2YgZ29pbmcgZGlyZWN0bHkgZm9yIGFic19zeW1ib2wuCi0JKHdyaXRlX3JlbG9jcykgW0RFQlVHNF06IEFib3J0IGlmIGFueSBzeW1ib2wgcmVmZXJyZWQgdG8gYnkgYQotCXJlbG9jIGlzIG5vdCBhIHNlY3Rpb24gc3ltYm9sIGFuZCBpcyBub3QgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQkoc2V0X3N5bXRhYik6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBmcm9tIHdyaXRlX29iamVjdF9maWxlLgotCUNvdW50cyBzeW1ib2wgdGFibGUgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGFuIGVhcmxpZXIgY291bnQuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBzZXRfc3ltdGFiLCBidXQgZG8gaXQgYWZ0ZXIgcG90ZW50aWFsbHkKLQlpbnZva2luZyB0aGUgKl9mcm9iX2ZpbGUgbWFjcm9zLiAgRG9uJ3QgYm90aGVyIGNvdW50aW5nIHN5bWJvbHMuCi0JQ2FsbCBzeW1ib2xfcmVtb3ZlLCBpbnN0ZWFkIG9mIGV4cGFuZGluZyBpdCBpbiBwbGFjZS4gIE1vdmVkIHRoZQotCWNvbmRpdGlvbmFsaXplZCBgb2JqZWN0X2ZpbGVfc2l6ZScgZGVjbGFyYXRpb24gZG93biB0bwotCWNvbmRpdGlvbmFsaXplZCBibG9jayB3aGVyZSBpdCdzIHVzZWQuICBXaGVuIHVzaW5nIHRoZSBhYnNvbHV0ZQotCXN5bWJvbCBmb3IgYSBmaXh1cCB3aXRob3V0IGEgc3ltYm9sLCBzZXQgc3lfdXNlZF9pbl9yZWxvYy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBzZWN0aW9uX3N5bWJvbCB0byBnZXQKLQl0aGUgY29ycmVjdCBzeW1ib2wgZm9yIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogVXNlIHN5bWJvbF9uZXcgaW5zdGVhZCBvZgotCXN5bWJvbF9tYWtlLCBzaW5jZSB3ZSBtYXkgd2FudCBpdCB0byBnbyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuCi0JTWFrZSB0aGUgbmV3IHN5bWJvbCBoYXZlIGludGVybmFsIGxpbmthZ2UuICBJZgotCW9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyBzYXlzIGl0J3Mgb2theSwgdXNlIHRoZSBCRkQgc2VjdGlvbgotCXN5bWJvbCB3aXRoIHRoZSBuZXdseSBjcmVhdGVkIEdBUyBzeW1ib2wuCi0JKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IERlZmF1bHQgdG8gYWx3YXlzIHJldHVybmluZyAwLgotCSogY29uZmlnL29iai1hb3V0LmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYykgW0JGRF9BU1NFTUJMRVJdOgotCU5ldyBtYWNyby4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL3RjLXNwYXJjLmM6IEluY2x1ZGUgc3Vic2Vncy5oLgotCShpbl9zaWduZWRfcmFuZ2UpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogVXNlIGl0LgotCShzcGFyY19pcCwgY2FzZSAnaScpOiBVc2UgQkZEX1JFTE9DX1NQQVJDMTMsIG5vdCBfQkFTRTEzLgotCShzcGFyY19pcCwgbGFiZWwgImltbWVkaWF0ZSIpOiBSZWplY3QgY29uc3RhbnRzIGZvciBwY3JlbAotCWluc3RydWN0aW9ucyBvbmx5IGlmIHRoZSByZWxvY2F0aW9uIHR5cGUgaW5kaWNhdGVzIGEgImNhbGwiCi0JaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvZmZzZXQgaXMgd2l0aGluIHJhbmdlIG9mIGEgImptcGwgJWcwIi4gIElmCi0JaXQncyBub3QgaW4gcmFuZ2UsIHVzZSB0aGUgYWJzb2x1dGUgc2VjdGlvbiBzeW1ib2wgcGx1cyBhbiBvZmZzZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBpbl9zaWduZWRfcmFuZ2UuICBDb21iaW5lZCBfU1BBUkMxMyBhbmQKLQlfQkFTRTEzIGNhc2VzLgotCSh0Y19nZW5fcmVsb2MpOiBQZXJtaXQgQkZEX1JFTE9DX1NQQVJDMTMuCi0KLQkqIGNvbmZpZy9pYzk2MGNvZmYubXQgKFRERUZJTkVTKTogRml4ZWQgdHlwbyAoTUFOWV9TRUNUSU9OUywgbm90Ci0JTUFOWV9TRUdNRU5UUykuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRWxpbWluYXRlZCBhbGwgdGFyZ2V0cyB1c2luZyBvYmotY29mZiBidXQgbm90Ci0JZGVmaW5pbmcgQkZEX0FTU0VNQkxFUjsgSSB0aGluayBhbGwgc3VjaCB0YXJnZXRzIHRoYXQgYXJlCi0Jc3VwcG9ydGVkIHdpbGwgYmUgbWF0Y2hlZCBieSByZWFsIENQVS1PUyBjb21iaW5hdGlvbnMgZWFybGllciBpbgotCXRoZSBjYXNlIHN0YXRlbWVudC4KLQkodGFyZ2V0cyAqLSotY29mZiosICotc3lzdiosICotKi1zY28qLCAqLSotc3lzdjMyKTogRGVsZXRlZC4gIE1hZGUKLQlzb21lIGNvbW1lbnRzIGFib3V0IHRoZSBkcHgyIGNvbmZpZ3VyYXRpb24sIGJ1dCBsZWZ0IGl0IGRpc2FibGVkLAotCXNpbmNlIGl0IGNvdWxkbid0IGJlIHJlYWNoZWQgYmVmb3JlLgotCSh0YXJnZXQgYTI5ay1hbWQtZWJtb25vbGQpOiBEZWxldGVkLgotCi1UaHUgTWFyIDE3IDEzOjM2OjA5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pbXBvcnQpOiBDb3JyZWN0bHkgaGFuZGxlIGltcG9ydGluZyBvZiBhbgotCWFscmVhZHkgZGVmaW5lZCBzeW1ib2wuCi0KLVdlZCBNYXIgMTYgMTc6MTE6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogT25seSBhY2NlcHQgb3Zlcmx5IGxhcmdlIHZhbHVlcyBmb3IKLQl0aGUgJ2onIG9wZXJhbmQgaWYgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgYWx0ZXJuYXRpdmVzIGZvciB0aGlzCi0JaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChhZGp1c3Rfc3RhYl9zZWN0aW9uKTogSW5pdGlhbGl6ZQotCXN0YWJzdHJzZWcgdG8gU0VHX1VOS05PV04sIG5vdCAtMS4gIEFmdGVyIGxvb3AsIGNoZWNrIHdoZXRoZXIgaXQKLQlpcyBub3QgU0VHX1VOS05PV04gcmF0aGVyIHRoYW4gY2hlY2tpbmcgd2hldGhlciBpdCBpcyA+PSAwLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2FsaWduKTogVGFrZSBuZXcgYXJndW1lbnQsIGxhYmVsLCBhbmQgdXNlCi0JaXQgaW5zdGVhZCBvZiBnbG9iYWwgaW5zbl9sYWJlbC4KLQkoc19hbGlnbiwgc19jb25zLCBzX2Zsb2F0X2NvbnMsIHNfZ3B3b3JkKTogU2F2ZSBpbnNuX2xhYmVsIGJlZm9yZQotCWNhbGwgdG8gbWlwc19lbWl0X2RlbGF5IGFuZCBwYXNzIGl0IHRvIG1pcHNfYWxpZ24uCi0KLVdlZCBNYXIgMTYgMTE6NTQ6MTIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2VxdSk6IEhhbmRsZSBib3RoIC5yZWcgYW5kIC5lcXUgY29ycmVjdGx5LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jYWxsaW5mbyk6IEFjY2VwdCAibWlsbGljb2RlIiBhcyBhbgotCWFyZ3VtZW50IHRvIGEgLmNhbGxpbmZvIGRpcmVjdGl2ZS4gIERvbid0IGxvb3AgZm9yZXZlciBvbiBlcnJvcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2VxdSk6IFVzZSBwYV9wYXJzZV9udW1iZXIgc28gdGhhdCB3ZSBjYW4KLQl1c2UgcHJlLWRlZmluZWQgcmVnaXN0ZXJzIGFzIGFyZ3VtZW50cy4KLQotTW9uIE1hciAxNCAxNDoyOTo0NSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IENoZWNrIGJvdGggU19JU19MT0NBTCBhbmQKLQlTX0lTX0VYVEVSTkFMIHdoZW4gZGVjaWRpbmcgd2hldGhlciB0byBkaXNjYXJkIGEgc3ltYm9sLgotCi0JKiBjb25maWctZ2FzLmNvbTogU2NhbiBNYWtlZmlsZS5pbiwgbm90IHZlcnNpb24uYywgZm9yIGN1cnJlbnQKLQl2ZXJzaW9uIG51bWJlci4gIERlbGV0ZSBhbGwgdmVyc2lvbnMgb2YgdGVtcCBmaWxlcyB3aGVuIGZpbmlzaGVkCi0Jd2l0aCB0aGVtLiAgQ3JlYXRlIGNvbmZpZy5oLgotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplKTogQ2FjaGUgc3ltYm9sCi0JdmFsdWVzIHRvIHJlZHVjZSBudW1iZXIgb2YgbG9va3VwcyB3aXRoIFNfR0VUX1ZBTFVFLiAgU2tpcCBkZWJ1ZwotCXN5bWJvbHMgdG8gYXZvaWQgImEgcmVhbGx5IG5hc3R5IGJ1ZyIuICAoRnJvbSBIb2xnZXIgVGV1dHNjaCwKLQlob2xnZXJAYm90YnNvLnJoZWluLW1haW4uZGUuKQotCShWTVNfd3JpdGVfb2JqZWN0X2ZpbGUpOiBGb3IgIl9fdnQuKiIgc3ltYm9scywgc2V0IFNfR0VUX09USEVSCi0JZmllbGQuICAoQWxzbyBmcm9tIEhvbGdlciBUZXV0c2NoLikgIFdhdGNoIGZvciBhIHdvdWxkLWJlIHJlZ2lzdGVyCi0JbWFzayB0aGF0IHNwYW5zIGZyYWdzLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfbGluZSk6IFNldCBzeW1ib2wgbG5ubyBmaWVsZCB3aXRoCi0JdGhpc19iYXNlLCBub3QgbGluZV9iYXNlLiAgKFBhdGNoIGZyb20gQW5kcmVhcyBBcmVucywKLQlhcmlAb2JlbGl4LmF2LnJ3dGgtYWFjaGVuLmRlLikKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBSZXRhaW4gc3ltYm9scyB0aGF0Ci0JbG9vayBsb2NhbCBpZiB0aGV5J3JlIGV4cG9ydGVkIG9yIHVuZGVmaW5lZC4gIFVzZWQgdG8gYmUgZG9uZSBmb3IKLQlpOTYwIG9ubHkuCi0KLQkqIHJlYWQuYyAoc19sY29tbSwgc19jb21tKTogUHJpbnQgc3ltYm9sIG5hbWUgYmVpbmcgcmVkZWZpbmVkLgotCUdldCBpdCBmcm9tIHRoZSBsb29rZWQtdXAgc3ltYm9sLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBzdHJpbmcgZnJvbQotCXRoZSBpbnB1dCBzdHJlYW0sIHdoaWNoIGlzIG5vIGxvbmdlciBudWxsLXRlcm1pbmF0ZWQuCi0JKExFWF9QQ1QpOiBOZXcgbWFjcm8sIGRlZmF1bHRzIHRvIDAuCi0JKGxleF90eXBlKTogVXNlIGl0IGZvciBgJScuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIGAtaCMnIG9wdGlvbiBmb3IgVk1TLgotCSh2aXBfb3ApOiBOb3cgc3RhdGljLCBhbmQgcmV0dXJucyB2b2lkLiAgQ2FsbGVycyBjaGFuZ2VkLiAgQWRkZWQKLQlmb3J3YXJkIGRlY2wuCi0JKHZpcCk6IERpdHRvLiAgQ2FsbCBhc19mYXRhbCBkaXJlY3RseSBpZiBhIHByb2dyYW0gYnVnIGlzCi0JZGV0ZWN0ZWQuCi0JKG9wX2hhc2gpOiBMZXQgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBzdWZmaWNlLgotCi0JKiBNYWtlZmlsZS5pbiAobGl0ZXJhbC5vKTogUHJvdmlkZSBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IG5ldyBtYWtlZmlsZSB2YXJpYWJsZSBPUENPREVTX0xJQi4KLQkqIE1ha2VmaWxlLmluIChMSUJTKTogVXNlIGl0LgotCi0JKiBNYWtlZmlsZS5pbiAobWFrZS1nYXMuY29tLCBzdGFtcC1tay5jb20pOiBOZXcgdGFyZ2V0cy4KLQkqIHZtc2NvbmYuc2g6IE5ldyBmaWxlLgotCSogbWFrZS1nYXMuY29tOiBSZWdlbmVyYXRlZCBmcm9tIG5ldyBzY3JpcHQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbHlueG9zKik6IEhhbmRsZSBhbnkgdmVyc2lvbiBudW1iZXIKLQlzdWZmaXggYWZ0ZXIgImx5bnhvcyIuICBTZXQgZW11bGF0aW9uIHRvIGx5bnguCi0KLU1vbiBNYXIgMTQgMTE6MzA6NDkgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCi1GcmkgTWFyIDExIDIyOjI1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wY3JlbF9mcm9tKTogUmV0dXJuIDAgZm9yIHVuZGVmaW5lZCBFTEYKLQlzeW1ib2xzLgotCShwcGNfaXNfdG9jX3N5bSk6IENoYW5nZSAudG9jIHRvIC5nb3QuCi0JKG1kX2FwcGx5X2ZpeCk6IENoYW5nZSBoYW5kbGluZyBvZiBFTEYgcmVsb2NzLgotCSh0Y19nZW5fcmVsb2MpOiBMaWtld2lzZS4KLQotRnJpIE1hciAxMSAxNzo0MjoyMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChDbG9zZV9WTVNfT2JqZWN0X0ZpbGUpOiBBZGQgY29tbWVudCBwb2ludGluZwotCW91dCBzb21lIGNvZGUgdGhhdCBkb2Vzbid0IGJlbG9uZyBpbiB0aGlzIGZpbGUuCi0KLQkqIGNvbmZpZy9vYmotdm1zLmg6IEluY2x1ZGUgYW91dC9zdGFiX2dudS5oLgotCShOX0dTWU0sIC4uLiwgTl9MRU5HKTogRGVsZXRlZC4KLQkoTk9fUkVMT0MpOiBVbmRlZmluZSBiZWZvcmUgZGVmaW5pbmcgYXMgcGFydCBvZiBlbnVtIHJlbG9jX3R5cGUuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgY29tbWVudCBxdWVzdGlvbmluZyBuZWVkIGZvciBhbGwgdGhlCi0JY2hhcmFjdGVycyBpbiBGTFRfQ0hBUlMuCi0KLQkqIGFzLmMgKG1haW4pIFtPQkpfVk1TXTogRG9uJ3QgY2FsbCBvdXRwdXRfZmlsZV9jbG9zZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBTZXQgc3RyaWN0IG9yZGVyIGZvcgotCXNlY3Rpb25zIHdpdGggcmVjb2duaXplZCBuYW1lcywgYmVmb3JlIGNvbXB1dGluZyBWTUEgdmFsdWVzLgotCi1GcmkgTWFyIDExIDE3OjU2OjIzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEFjY2VwdCBudW1iZXJzIGJldHdlZW4gMHg4MDAwIGFuZAotCTB4ZmZmZiBmb3IgJ2onIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBNSVBTIGFzc2VtYmxlci4gIFRoZXNlCi0JbnVtYmVycyBhcmUgYWN0dWFsbHkgdHJlYXRlZCBhcyBuZWdhdGl2ZS4KLQotVGh1IE1hciAxMCAxMzozNjoyOSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpOiBMb2NhbCBsYWJlbHMgYXJlIC5MZm9vLgotCi1UdWUgTWFyICA4IDIxOjE3OjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBNaW5vciBmb3JtYXR0aW5nL3N0eWxpc3RpYyBjaGFuZ2VzLCBwbHVzOgotCShvYmpfY29mZl9zZWN0aW9uKTogRGVjbGFyZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IE1ha2UgaXQgYXZhaWxhYmxlIG9ubHkgaWYgTUFOWV9TRUNUSU9OUy4KLQkob2JqX3N5bWJvbF90b19jaGFycykgW0NST1NTX0NPTVBJTEVdOiBTb21lIGF0dGVtcHMgdG8gbWFrZSB0aGlzCi0Jd29yay4gIEl0IHN0aWxsIGRvZXNuJ3QuICBJdCBub3cgZmFpbHMgdG8gY29tcGlsZSwgaW5zdGVhZCBvZgotCXNpbGVudGx5IGNvbXBpbGluZyB0byBkbyBub3RoaW5nLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpOiBEZWZpbmUgb25seSBpZgotCU1BTllfU0VDVElPTlMuCi0JKE9CSl9QUk9DRVNTX1NUQUIpIFshIE1BTllfU0VDVElPTlNdOiBOZXcgbWFjcm8sIGp1c3QgZW1pdHMKLQl3YXJuaW5nLgotCi0JSGFuZGxlIEFscGhhIGxvYWQtaW1tZWRpYXRlLUZQIHBzZXVkby1pbnN0cnVjdGlvbnM6Ci0JKiBjb25maWcvYWxwaGEtb3Bjb2RlLmggKGxkaWYsIGxkaWcsIGxkaXMsIGxkaXQpOiBOZXcgcGF0dGVybnMuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobGl0OF9zZWMsIGxpdDRfc2VjLCBsaXQ4X3N5bSwgbGl0NF9zeW0pOiBOZXcKLQl2YXJpYWJsZXMuCi0JKGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGNyZWF0ZV9saXRhX3NlY3Rpb24pOiBOb3cgYSBtYWNyby4KLQkoZ2V0X2xpdDhfb2Zmc2V0LCBnZXRfbGl0NF9vZmZzZXQpOiBOZXcgZnVuY3Rpb25zLgotCShtYXliZV9zZXRfZ3ApOiBOZXcgZnVuY3Rpb24uCi0JKHNlbGVjdF9ncF92YWx1ZSk6IENhbGwgaXQuCi0JKGxvYWRfZXhwcmVzc2lvbik6IFByZXNlcnZlIGFkZGVuZCBpZiBzeW1ib2wgaXMgYSBzZWN0aW9uIHN5bWJvbC4KLQkoYWxwaGFfaXApOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZSBgRicgZm9yIGZsb2F0aW5nLXBvaW50Ci0JY29uc3RhbnRzOyBzdG9yZSB0aGVtIGluIC5saXR7NCw4fSBzZWN0aW9ucy4KLQkoYWxwaGFfaXAsIGNhc2UgJ0cnKTogRW1pdCBMSVRVU0UgcmVsb2NhdGlvbnMgZm9yIHN5bWJvbCBleHBycy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoc21hbGxlc3RfaW1tX3R5cGUpOiBOZXZlciByZXR1cm4gSW1tMS4KLQotVHVlIE1hciAgOCAxNDoxODoxNSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAod19zdHJpbmdzKTogT25seSBjb3B5IHN0cmluZ3Mgb3V0IGlmCi0JdGhlaXIgc3ltYm9scyBhcmUgZ29pbmcgdG8gYmUgd3JpdHRlbi4KLQotVHVlIE1hciAgOCAxMTo0OToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcik6IERlY2xhcmUgYXJndW1lbnRzIGNvbnN0LgotCSogYXMuaCAoYXNfcGVycm9yKTogQ2hhbmdlIGRlY2xhcmF0aW9uLgotCi1Nb24gTWFyICA3IDE2OjA4OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogV2hlbiBjYWxsaW5nIGZyYWdfZ3JvdywgYWxsb3cKLQlmb3IgdGhlICh1cCB0bykgdHdvIG5vcHMgd2hpY2ggbWF5IGJlIGluc2VydGVkIGJ5IGFwcGVuZF9pbnNuIGlmCi0JbWlwc19vcHRpbWl6ZSBpcyAwLgotCShtYWNybyk6IExpa2V3aXNlLgotCi1UaHUgTWFyICAzIDExOjM3OjU1IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAobWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlcik6Ci0JQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZyBmcm9tIGdjYy4KLQotV2VkIE1hciAgMiAxMDozMTowMSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQWRkIGEgZmV3IGNhc3RzIHRvIG1ha2UgSFAgQyBjb21waWxlciBoYXBweS4KLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uLCBvYmpfc29tX2NvcHlyaWdodCk6IEJlCi0JcHJlcGFyZWQKLQl0byBoYW5kbGUgYW4gZXJyb3IgZnJvbSBiZmRfc29tX2F0dGFjaF9hdXhfaGRyLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBXcmFwIEVMRiBzcGVjaWZpYyBkZWNscyBpbnNpZGUgYW4gaWZkZWYuCi0KLU1vbiBGZWIgMjggMTU6MDM6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2F0b2YpOiBPbWl0IHdhcm5pbmcgYWJvdXQgRlAgdmFsdWVzLgotCShsaW5lX2NvbW1lbnRfY2hhcnMpOiBBZGQgISB0byBsaXN0LgotCShtZF9hcHBseV9maXgpOiBEbyBwcm9jZXNzIDMyLSBhbmQgNjQtYml0IHJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfbGNvbW0pOiBQdXQgIiNpZiAwIiBhcm91bmQgdGhlCi0JdW51c2VkIHBhcnRzIChtb3N0IG9mIHRoZSBmdW5jdGlvbikuCi0JKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogQ2FzdCBhbGxvY2EgcmVzdWx0LgotCi0JKiBjb25maWd1cmUuaW4gKGk5NjAtKi1jb2ZmLCBpOTYwLSotdnh3b3JrczUuKik6IFVzZSBjb2ZmYmZkLCBhbmQKLQlnYXNfdGFyZ2V0IGljOTYwY29mZi4KLQkqIGNvbmZpZy9pYzk2MGNvZmYubXQ6IE5ldyBmaWxlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggW1RDX0k5NjBdOiBJbmNsdWRlIGNvZmYvaTk2MC5oLgotCShUQVJHRVRfRk9STUFUKSBbVENfSTk2MF06IFVzZSBjb2ZmLUludGVsLWxpdHRsZS4KLQkqIGNvbmZpZy90ZS1pYzk2MC5oIChDUk9TU19DT01QSUxFKTogRG9uJ3QgdW5kZWYgdGhpcy4gIFdlJ2xsCi0JYWx3YXlzIGJ1aWxkIGxpdHRsZS1lbmRpYW4gb2JqZWN0IGZpbGVzLgotCSogY29uZmlnL3RjLWk5NjAuYyAobWRfcmVsb2Nfc2l6ZSk6IERvbid0IGRlZmluZSBhdCBhbGwgaWYgQkZEIG9yCi0JQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLgotCShtZW1fZm10KTogU2luY2UgQ09GRiBkb2Vzbid0IGhhbmRsZSBjYWxseCByZWxvY2F0aW9ucyB5ZXQsIHRyZWF0Ci0JdGhlbSBsaWtlIG5vcm1hbCAzMi1iaXQgcmVsb2NhdGlvbnMuCi0JKG1kX2FwcGx5X2ZpeCk6IEZvciBjYWxseCByZWxvY2F0aW9ucywgc3RvcmUgemVyby4KLQkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBTdG9yZSBzeW1ib2wgaW5kZXggZm9yIGFsbCBjYWxseAotCXJlbG9jYXRpb25zLCByZWdhcmRsZXNzIG9mIGxpbmstcmVsYXggc2V0dGluZy4KLQkodGNfY29mZl9maXgycnR5cGUsIHRjX2NvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb25zLgotCShpOTYwX2hhbmRsZV9hbGlnbikgWyEgT0JKX0JPVVRdOiBJZiBsaW5rLXJlbGF4IG9wdGlvbiBpcwotCXNlbGVjdGVkLCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCBjbGVhciBpdC4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKEJGRF9BUkNILCBDT0ZGX0ZMQUdTLCBDT0ZGX01BR0lDLAotCVRDX0NPVU5UX1JFTE9DLCBUQ19DT0ZGX0ZJWDJSVFlQRSwgVENfQ09GRl9TSVpFTUFDSERFUCwKLQl0Y19maXhfYWRqdXN0YWJsZSk6IE5ldyBtYWNyb3MuCi0JKHRjX2NvZmZfZml4MnJ0eXBlLCB0Y19jb2ZmX3NpemVtYWNoZGVwKTogRGVjbGFyZS4KLQotRnJpIEZlYiAyNSAyMDo1Njo1NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19zeW1ib2wpOiBDYWxsIFBBIEVMRiBCRkQgdmVyc2lvbi4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKHBhX2J1aWxkX3N5bWV4dG5fc2VjdGlvbik6IERlbGV0ZSB1bnVzZWQgZnVuY3Rpb24uCi0JKGhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBMaWtld2lzZS4KLQkocGFfZXhwb3J0KTogRGVsZXRlIGNhbGwgdG8gcGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChocHBhX3RjX3N5bWJvbCk6IEFkZCBleHRlcm4gZGVjbC4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IERlbGV0ZSBleHRlcm4gZGVjbC4KLQkoaHBwYV90Y19zeW1ib2wpOiBEZWxldGUgZXh0ZXJuIGRlY2wuCi0KLUZyaSBGZWIgMjUgMTM6MTU6MzEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogQ29ycmVjdCB0ZXN0IGZvciB3aGV0aGVyIHRvCi0JZmlsbCBhIHNlY3Rpb24gKGZyb20gTWluaCBUcmFuLUxlIDxUUkFOTEVAaW50ZWxsaWNvcnAuY29tPikuCi0KLVRodSBGZWIgMjQgMTE6MzA6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBEb24ndCByZXF1aXJlIHZlcnNpb24gbnVtYmVyIGZvciBpMzg2LSotbWFjaC4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkZWQgIi50aGlzX0dDQ19yZXF1aXJlc190aGVfR05VX2Fzc2VtYmxlciIsCi0Jd2hpY2ggaXMgaWdub3JlZCBieSBnYXMsIGJ1dCB3aWxsIGNhdXNlIG90aGVyIGFzc2VtYmxlcnMgdG8gY2hva2UuCi0JSW50ZW5kZWQgZm9yIHVzZSBieSBnY2MgcG9ydHMgdGhhdCByZXF1aXJlIGdhcyBpbnN0ZWFkIG9mIG5hdGl2ZQotCWFzc2VtYmxlcnMuCi0KLVRodSBGZWIgMjQgMDc6MTA6MzEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy9oby1ocHBhb3NmLmg6IEZpeCBicmFpbm8gaW4gdGVzdCBmb3IgQU5TSS1DLgotCi1XZWQgRmViIDIzIDE2OjUxOjQzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IEdpdmUgdGhlIHVzZXIgYSByZWFzb25hYmxlIGVycm9yCi0JbWVzc2FnZSByYXRoZXIgdGhhbiAiYXNzZXJ0aW9uIGZhaWxlZCIgaWYgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0JZmFpbHMuCi0KLVR1ZSBGZWIgMjIgMTA6MDc6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tbWFjaDMuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgMjEgMTE6NDE6MTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9kZWJ1Zyk6IERvbid0IHNldCBoZHItPm1hZ2ljIGhlcmUuICBJdCBpcwotCW5vdyBzZXQgaW4gYmZkL2Vjb2ZmbGluay5jOmVjb2ZmX3dyaXRlX3N5bWhkci4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHdyaXRlX29iamVjdF9maWxlKTogdXNlIGJmZF9nZXRfZXJyb3IgKCksCi0Jbm90IGJmZF9lcnJvci4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChzX2xjb21tKTogVXNlIGFuIGFsaWdubWVudCBwb3dlciBvZiAzIGZvciA4IGJ5dGUgLmxjb21tCi0JdmFyaWFibGVzLgotCi0JKiBjb25maWcvaG8taHB1eC5oIChCUk9LRU5fQVNTRVJUKTogRGVmaW5lIGlmIG5vdCBfX0dOVUNfXy4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBVc2UgY29ycmVjdCBhcmd1bWVudHMgdG8gbWVtY3B5Ci0JKGJyb2tlbiAxOSBKdWwgMTk5MykuICBGcm9tIGtqZEBwZXNjYWRlcm8uc3RhbmZvcmQuZWR1IChLZW5uZXRoCi0JRHVkYSkuCi0KLVN1biBGZWIgMjAgMTg6MDE6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChvYmpfY29mZl9zZWN0aW9uKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogRm9yICJzZWN0aW9uIiwgdXNlCi0Jb2JqX2NvZmZfc2VjdGlvbi4KLQkob2JqX2NvZmZfc2VjdGlvbik6IFJld3JpdGUuCi0KLUZyaSBGZWIgMTggMTQ6MTY6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbWFjaDMqKTogTmV3IHRhcmdldDsgdXNlcyBCRkQuCi0JKiBjb25maWcvdGUtbWFjaC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvb2JqLWFvdXQuaCAob2JqX2FvdXRfZnJvYl9maWxlKTogRGVjbGFyZSBpdC4KLQkoZnJvYl9maWxlKTogTmV3IG1hY3JvLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4XzEpIFtURV9NYWNoXTogRG9uJ3QgYWRqdXN0Ci0JcGNyZWwzMiByZWxvY2F0aW9ucy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRBUkdFVF9GT1JNQVQpIFtURV9NYWNoXTogVXNlIGEub3V0LW1hY2gzLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFJlbW92ZWQgcmVnaXN0ZXIgZGVjbGFyYXRpb25zLgotCi1UaHUgRmViIDE3IDE2OjI1OjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCVNvbWUgc3VwcG9ydCBmb3IgUG93ZXJQQyBFTEYuCi0JKiBjb25maWd1cmUuaW46IElmIGNwdSBpcyBwb3dlcnBjKiwgdXNlIHBwYy4KLQkocHBjLSotc3lzdjQqKTogVXNlIG9iamVjdCBmb3JtYXQgZWxmLgotCSogY29uZmlnL3RjLXBwYy5oOiBPbmx5IGRlY2xhcmUgYSBudW1iZXIgb2YgdGhpbmdzIGlmIE9CSl9DT0ZGIGlzCi0JZGVmaW5lZC4KLQkoVEFSR0VUX0FSQ0gpOiBNYWtlIGl0IGNhbGwgcHBjX2FyY2guCi0JKHBwY19hcmNoKTogRGVjbGFyZS4KLQkoVEFSR0VUX0ZPUk1BVCk6IFNldCBiYXNlZCBvbiBPQkpfQ09GRiBvciBPQkpfRUxGLgotCShOT19TVFJJTkdfRVNDQVBFUyk6IERlZmluZS4KLQkoTE9DQUxfTEFCRUwsIEZBS0VfTEFCRUxfTkFNRSk6IERlZmluZSBmb3IgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1wcGMuYzogT25seSBkZWZpbmUgYSBudW1iZXIgb2YgZnVuY3Rpb25zIG9mIE9CSl9DT0ZGCi0JaXMgZGVmaW5lZC4KLQkobWRfcHNldWRvX3RhYmxlKTogTW9zdCBwc2V1ZG8tb3BzIGFyZSBPQkpfQ09GRiBzcGVjaWZpYy4gIEFkZGVkCi0JT0JKX0NPRkYgc3BlY2lmaWMgImJpIiBhbmQgImVpIi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogRml4IGhhbmRsaW5nIG9mIC11LiAgTWFrZSAtbTYwMSBzZXQKLQlQUENfT1BDT0RFXzYwMS4gIElmIE9CSl9FTEYsIGFjY2VwdCAtViBhbmQgLVEuCi0JKHBwY19zZXRfY3B1KTogTmV3IGZ1bmN0aW9uLgotCShwcGNfYXJjaCk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYmVnaW4pOiBDYWxsIHBwY19zZXRfY3B1LgotCShwcGNfaW5zZXJ0X29wZXJhbmQpOiBGb3IgYSBzaWduZWQgb3BlcmFuZCBhY2NlcHQgYW4gdW5zaWduZWQKLQl2YWx1ZSwgZm9yIElCTSBjb21wYXRpYmlsaXR5LgotCShwcGNfYnl0ZSk6IERvbid0IGNhbGwgc3RyaW5nZXIgZm9yIHN0cmluZ3M7IGluc3RlYWQsIHRyZWF0IHR3bwotCWRvdWJsZSBxdW90ZXMgYXMgYSBzaW5nbGUgZG91YmxlIHF1b3RlLgotCShwcGNfY29tbSk6IFNldCBzeV90Yy5vdXRwdXQgZm9yIGEgLmxjb21tIHN5bWJvbC4KLQkocHBjX2JpZWkpOiBOZXcgZnVuY3Rpb24uCi0JKHBwY190Yyk6IElmIG5vdCBPQkpfQ09GRiwgaWdub3JlIGZpcnN0IGFyZ3VtZW50LgotCShwcGNfZml4X2FkanVzdGFibGUpOiBDYWxsIGFzX2JhZF93aGVyZSwgbm90IGFzX2JhZC4KLQkocHBjX2lzX3RvY19zeW0pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2FwcGx5X2ZpeCk6IFVzZSBwcGNfaXNfdG9jX3N5bS4gIEhhbmRsZSBCRkRfUkVMT0NfMTYgYW5kCi0JQkZEX1JFTE9DXzguCi0KLVRodSBGZWIgMTcgMDk6Mjk6MzcgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jIChhc19wZXJyb3IpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9nZXRfZXJyb3IgYW5kCi0JYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgotCi1UdWUgRmViIDE1IDIwOjIzOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU3VwcG9ydCBpOTYwLXZ4d29ya3MgdmVyc2lvbnMgPiA1LjAgYXMgY29mZi4KLQlEZWZhdWx0IGlzIHN0aWxsIGJvdXQgaWYgbm8gdmVyc2lvbiBpcyBzcGVjaWZpZWQuCi0KLQkqIGF0b2YtZ2VuZXJpYy5jIChhdG9mX2dlbmVyaWMpOiBVc2Ugc3dpdGNoIGFuZCBzdHJjYXNlY21wIGluc3RlYWQKLQlvZiBsYXJnZSBudW1iZXIgb2YgY29tcGFyZXMgd2hlbiBsb29raW5nIGZvciBpbmYvbmFuIHZhbHVlcy4KLQotRnJpIEZlYiAxMSAxMzoxMzoyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRG8gdW5hbGlnbmVkIGxvYWRzIGFuZCBzdG9yZXMKLQljb3JyZWN0bHkgd2hlbiBiaWcgZW5kaWFuLCBhbmQgZ2l2ZSBlcnJvcnMgb24gb3ZlcmZsb3cgcmF0aGVyIHRoYW4KLQlnZW5lcmF0aW5nIGluY29ycmVjdCBjb2RlLgotCi1UaHUgRmViIDEwIDExOjI0OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuYzogSW5jbHVkZSBsaWJpYmVydHkuaC4KLQotCSogcmVhZC5jIChkb19hbGlnbik6IERvbid0IGRlZmluZSBsYWJlbCBqdXN0X3JlY29yZF9hbGlnbm1lbnQKLQl1bmxlc3MgaXQgbWlnaHQgYmUgdXNlZC4KLQotCSogYXMuYyAobWFpbik6IElmIG1kX3BhcnNlX2xvbmdfb3B0aW9uIGlzIGRlZmluZWQsIGNhbGwgaXQgd2l0aCBhCi0JbG9uZyBvcHRpb24uCi0JKiBjb25maWcvdGMtbWlwcy5oIChtZF9wYXJzZV9sb25nX29wdGlvbik6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfdHJhcCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2JlZ2luKTogUmVwb3J0IGFuIGVycm9yIGlmIG1pcHNfdHJhcCBpcyBzZXQgYXQgSVNBIGxldmVsIDEuCi0JKG1hY3JvKTogSWYgbWlwc190cmFwLCB1c2UgdHJhcCBpbnN0cnVjdGlvbnMgaW5zdGVhZCBvZiBicmVhawotCWluc3RydWN0aW9ucyBmb3Igb3ZlcmZsb3cgYW5kIGRpdmlkZSBieSB6ZXJvIGRldGVjdGlvbi4KLQkobWlwc19wYXJzZV9sb25nX29wdGlvbik6IE5ldyBmdW5jdGlvbi4gIFN1cHBvcnQgLS10cmFwLAotCS0tbm8tYnJlYWssIC0tYnJlYWsgYW5kIC0tbm8tdHJhcC4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJ6ZXJvIi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IFJlbW92ZSAiemVybyIuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBMaWtld2lzZS4KLQotVGh1IEZlYiAxMCAwMToyNDoyNyAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZWplY3QgaW50ZWdlciB2YWx1ZXMgZm9yCi0JcGMtcmVsYXRpdmUgb3BlcmFuZCBmaWVsZHMuICBUaGlzIGZvcmNlcyAiY2FsbCAwIiB0byBiZWNvbWUgImptcGwKLQklZzAsJW83IiB3aXRoIG5vIHJlbG9jYXRpb25zIG5lZWRlZC4KLQotV2VkIEZlYiAgOSAxMzowODozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFzLmggKHhtYWxsb2MsIHhyZWFsbG9jKTogRGVjbGFyZSB1c2luZyBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IFVzZSBQVFIgcmF0aGVyIHRoYW4gY2hhciAqLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogSWYgTk9fU1RSSU5HX0VTQ0FQRVMgaXMgZGVmaW5lZCwKLQlkb24ndCB0cmVhdCBiYWNrc2xhc2ggc3BlY2lhbGx5IGluc2lkZSBzdHJpbmdzLgotCSogcmVhZC5jIChuZXh0X2NoYXJfb2Zfc3RyaW5nKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgIDkgMDk6NDI6NDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24pOiBVc2UgbWVtc2V0Ci0JaW5zdGVhZCBvZiBtZW1jcHkgdG8gemVybyB0aGUgaW5pdGlhbCBzdGFiIHN5bWJvbCwgZHVoLgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCi1UdWUgRmViICA4IDE3OjI1OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IFVzZSBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogQ2FsbCBtZW1zZXQgd2l0aCB0aGUgYXJndW1lbnRzIGluCi0JdGhlIHJpZ2h0IG9yZGVyLiAgRXhwbGljaXRseSBjbGVhciBmaXhfcm9vdCBhbmQgZml4X3RhaWwgZmllbGRzLgotCi1UdWUgRmViICA4IDE2OjAwOjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogRm9yIGFic19zeW1ib2wsIHNldCAqcHVudAotCWFuZCBkbyBub3RoaW5nIGVsc2UuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2JlZ2luKTogSW5pdGlhbGl6ZSB2YWx1ZSBvZiBhYnNfc3ltYm9sCi0JcHJvcGVybHkuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogVXNlIGFic19zeW1ib2wgaW5zdGVhZCBvZiBjYWxsaW5nCi0Jc2VjdGlvbl9zeW1ib2wuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKTogRml4ICIvKiIgaW4gY29tbWVudCB0byBzaWxlbmNlCi0JY29tcGxhaW50IGZyb20gImdjYyAtV2FsbCIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEtKi1uZXR3YXJlKik6IE5ldyB0YXJnZXQsIGxpa2UgYWxwaGEtKi1vc2YqLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoR1BfQURKVVNUTUVOVCk6IE1vdmUgZGVmaW5pdGlvbiB0byBzdGFydCBvZgotCWZpbGUuCi0JKHRjX2dlbl9yZWxvYyk6IFJlbW92ZSB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGBjb2RlJywgYW5kIGNvZGUKLQl0aGF0IHRyaWVkIHRvIHVzZSBpdCAoaW5jb3JyZWN0bHkpLiAgRm9yIExJVEVSQUwgcmVsb2MsIHNldCBhZGRlbmQKLQl0byBuZWdhdGl2ZSBvZiBHUCB2YWx1ZS4KLQkobG9hZF9zeW1ib2xfYWRkcmVzcyk6IERvbid0IGFkanVzdCByZXR1cm4gdmFsdWUgYnkgR1BfQURKVVNUTUVOVC4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogUHJpbnQgc29tZSBzZW5zaWJsZSBlcnJvciBtZXNzYWdlIGlmCi0JYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiByZXR1cm5zIGJmZF9yZWxvY19vdmVyZmxvdy4KLQotTW9uIEZlYiAgNyAxNTo0OToyNCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChocHBhKi0qZWxmKik6IE5ldyBjb25maWd1cmF0aW9uIGZvciBQQSBFTEYuCi0JKGhwcGEqLSotb3NmKik6IERlZmF1bHQgb2JqZWN0IGZvcm1hdCBpcyBTT00uCi0KLU1vbiBGZWIgIDcgMTY6MDc6MzUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2F0b2YpOiBXYXJuIHRoYXQgZmxvYXRpbmctcG9pbnQgdmFsdWVzCi0JbWlnaHQgbm90IGFzc2VtYmxlIHByb3Blcmx5LgotCi0JKiBjb25maWd1cmUuaW4gKHRhcmdldCBhbHBoYS0qLW9zZiopOiBEb24ndCBzZXQgImRldj15ZXMiIGFueQotCW1vcmUuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBQYXJlbnRoZXNpemUgb3BlcmF0aW9ucyBpbgotCXJhbmdlIGNoZWNraW5nLCB0byBhdm9pZCBwcmVjZWRlbmNlIHF1ZXN0aW9ucy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFkZHIzMik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IFNldCBpdCBmb3IgIi0zMmFkZHIiLgotCShsb2FkX3N5bWJvbF9hZGRyZXNzKTogSWYgYWRkcjMyIGlzIHNldCwgdXNlIGxkbCBpbnN0ZWFkIG9mIGxkcS4KLQotCSogYXRvZi1nZW5lcmljLmMgKGF0b2ZfZ2VuZXJpYyk6IENhbGN1bGF0ZSBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMKLQlhbmQgbW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMgaW4gaW50ZWdlciBhcml0aG1ldGljLCB0bwotCWVsaW1pbmF0ZSB0aGUgb25seSBzb3VyY2VzIG9mIGRlcGVuZGVuY2Ugb24gZmxvYXRpbmcgcG9pbnQKLQlzdXBwb3J0LCB3aGljaCBkb2Vzbid0IHdvcmsgeWV0IG9uIHRoZSBBbHBoYS4KLQotTW9uIEZlYiAgNyAwMzo1NjowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX2RlYnVnKSBbVENfQUxQSEFdOiBTcGVjaWZ5IHZlcnNpb24gc3RhbXAgYXMKLQkweDMwYiBmb3IgQWxwaGEgZm9yIG5vdywgdW50aWwgIi52ZXJzdGFtcCIgaXMgaGFuZGxlZC4KLQotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogVXNlIHNlZ2luZm8tPmZyY2hhaW5QLCB3aGljaAotCWFjdHVhbGx5IHJlZmVycyB0byB0aGUgbGl0ZXJhbCBwb29sIHNlY3Rpb24sIHJhdGhlciB0aGFuCi0JZnJjaGFpbl9ub3csIHdoaWNoIHJlZmVycyB0byB3aGF0ZXZlciBzZWN0aW9uIHRoZSBhc3NlbWJsZXIgd2FzCi0JaW4uCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBPbmx5IGRvIHJhbmdlIGNoZWNraW5nIGlmIHNpemUgb2YgZml4dXAKLQlpcyBzbWFsbGVyIHRoYW4gd29yZCBzaXplLiAgT3RoZXJ3aXNlLCB3ZSBhbHdheXMgd2luZCB1cCB3aXRoCi0JemVyb3MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9zZWN0aW9uX2FsaWduKTogQ2hhbmdlIHNlY29uZCBhcmd1bWVudCBhbmQKLQlyZXR1cm4gdHlwZSB0byB2YWx1ZVQsIHRvIGFncmVlIHdpdGggdGMuaC4KLQkoYWxwaGFfZG9fYWxpZ24pOiBMb2NhbCBzdGF0aWMgYXJyYXkgbm9wX3BhdHRlcm4gaXMgbm93IHVuc2lnbmVkCi0JY2hhciwgdG8gYXZvaWQgb3ZlcmZsb3cgd2FybmluZ3MuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfc2VjdGlvbl9hbGlnbik6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9mcm9iX2ZpbGUpOiBFbnN1cmUgdGhhdCBlY29mZl9kYXRhIGZvcgotCW91dHB1dCBiZmQgaXMgbm9uLW51bGwgYmVmb3JlIGluZGlyZWN0aW5nIHRocm91Z2ggaXQuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9mcm9iX2Vjb2ZmX2RhdGEpOiBSZW5hbWVkIGZyb20KLQlhbHBoYV9mcm9iX2ZpbGUuCi0JKiBjb25maWcvdGMtYWxwaGEuaCAodGNfZnJvYl9maWxlKTogTWFjcm8gZGVsZXRlZC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKSBbVENfQUxQSEFdOiBDYWxsCi0JYWxwaGFfZnJvYl9lY29mZl9kYXRhLCB0aGVuIGZpbGwgaW4gb3B0aW9uYWwtaGVhZGVyIGluZm8gd2l0aCBncAotCXZhbHVlIGFuZCByZWdpc3RlciBtYXNrcy4KLQotU3VuIEZlYiAgNiAxNjoxMzo0NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlndXJlLmluIChoaXV4KTogRml4ZXMgZnJvbSBtLWthc2FockBzcmFtaGMuc3JhLmNvLkpQLgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChvYmpfc29tX2luaXRfc3RhYl9zZWN0aW9uKTogU2FtZSBjaGFuZ2UKLQlhcyBjb2ZmYmZkIGFuZCBlbGYgYmVsb3cuICBaZXJvIHRoZSBpbml0aWFsIHN0YWIgc3ltYm9sIGFmdGVyCi0JYWxsb2NhdGluZyBpdC4KLQotU2F0IEZlYiAgNSAxMjozMDozMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFplcm8gdGhlCi0JaW5pdGlhbCBzdGFiIHN5bWJvbCBhZnRlciBhbGxvY2F0aW5nIGl0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IERpdHRvLgotCi1TYXQgRmViICA1IDExOjUzOjMxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IGFkZGJbdGZdIHNob3VsZCBvbmx5IGFjY2VwdAotCW5vbi1uZWdhdGVkIGNvbmRpdGlvbiBjb21wbGV0ZXJzLiAgQWRkIHN1cHBvcnQgZm9yIGFkZGIgcHNldWRvLW9wCi0Jd2hpY2ggYWNjZXB0cyBib3RoIG5lZ2F0ZWQgYW5kIG5vbi1uZWdhdGVkIGNvbXBsZXRlcnMuCi0KLVNhdCBGZWIgIDUgMDA6MTU6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKHJzNjAwMCopOiBVc2UgY3B1X3R5cGUgcHBjLgotCShwcGMtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIGNvZmYgYW5kIGZvcmNlIGJmZF9nYXMuCi0JKiBjb25maWcvdGMtcHBjLmgsIGNvbmZpZy90Yy1wcGMuYzogTmV3IGZpbGVzIGZvciBQb3dlclBDL1BPV0VSCi0JKFJTLzYwMDApIHN1cHBvcnQuICBBdCB0aGUgbW9tZW50LCBvbmx5IFhDT0ZGIGlzIHN1cHBvcnRlZC4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKFNBX1NFVF9TWU1fRU5ETkRYKTogTWFkZSBub24tc3RhdGljLgotCShTX1NFVF9EQVRBX1RZUEUpOiBMaWtld2lzZS4KLQkoY29mZl9sYXN0X2Z1bmN0aW9uKTogUmVuYW1lZCBmcm9tIGxvY2FsIHN0YXRpYyBsYXN0X2Z1bmN0aW9uUCBpbgotCWNvZmZfZnJvYl9zeW1ib2wgYW5kIG1hZGUgZXh0ZXJuYWxseSB2aXNpYmxlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogTmV3IGxvY2FsIHN0YXRpYyBzZXRfZW5kOyB1c2UgaXQgdG8gdHJ5IHRvCi0JYXZvaWQgY2FsbGluZyBTQV9TRVRfU1lNX0VORE5EWCBvbiBhIHN5bWJvbCB0aGF0IHdpbGwgYmUgcHVudGVkLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfU0VUX0RBVEFfVFlQRSk6IERlY2xhcmUuCi0JKFNBX1NFVF9TWU1fRU5ETkRYKTogRGVjbGFyZS4KLQkoY29mZl9sYXN0X2Z1bmN0aW9uKTogRGVjbGFyZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogSWYgRE9MTEFSX0RPVCBpcyBkZWZpbmVkLCBhY2NlcHQgYCQnIGFzCi0JZXF1aXZhbGVudCB0byBgLicgdG8gbWVhbiB0aGUgY3VycmVudCBsb2NhdGlvbi4KLQotCSogcmVhZC5jIChMRVhfQlIpOiBJZiBub3QgZGVmaW5lZCwgZGVmaW5lIGFzIDAuCi0JKGxleF90eXBlKTogVXNlIExFWF9CUiBhcyB0aGUgdHlwZSBvZiBgeycsYH0nLGBbJyxgXScuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IElmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBpcwotCWRlZmluZWQsIGNhbGwgaXQgd2l0aCBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lLiAgSWYKLQl0Y19zeW1ib2xfbmV3X2hvb2sgaXMgZGVmaW5lZCwgY2FsbCBpdCBvbiB0aGUgbmV3IHN5bWJvbC4KLQkoc3ltYm9sX2ZpbmRfYmFzZSk6IElmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSBpcyBkZWZpbmVkLAotCWNhbGwgaXQgb24gYSBjb3B5IG9mIHRoZSBuYW1lIGFyZ3VtZW50LgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFNpbXBsaWZpZWQgdXNhZ2Ugb2Ygb2JqX2Zyb2Jfc3ltYm9sCi0JYW5kIHRjX2Zyb2Jfc3ltYm9sLiAgQWx3YXlzIGNhbGwgYm90aCBpZiB0aGUgc3ltYm9sIGlzIGdvaW5nIHRvIGJlCi0Jb3V0cHV0LgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogVXNlICVsZCByYXRoZXIgdGhhbiAlZCB3aGVuIHByaW50aW5nCi0JZnJhZ1AtPmZyX3ZhciwgYW5kIGNhc3QgaXQgdG8gbG9uZy4KLQotCUNoYW5nZWQgcmVsb2NzIHRvIGJlIGJhc2VkIG9uIHN1YnNlZ21lbnRzICh3aGVuIEJGRF9BU1NFTUJMRVIpLgotCSogc3Vic2Vncy5oIChzdHJ1Y3QgZnJjaGFpbik6IElmIEJGRF9BU1NFTUJMRVIsIGFkZGVkIG5ldyBmaWVsZHMKLQlmaXhfcm9vdCBhbmQgZml4X3RhaWwuCi0JKHNlZ21lbnRfaW5mb190eXBlKTogSWYgQkZEX0FTU0VNQkxFUiwgZG9uJ3QgZGVmaW5lIGZpeF90YWlsCi0JZmllbGQuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSWYgQkZEX0FTU0VNQkxFUiwgc2V0IGZpeF9yb290UCBhbmQKLQlmaXhfdGFpbFAgYmFzZWQgb24gZnJjaGFpbl9ub3csIG5vdCBzZWdfaW5mbyAobm93X3NlZykuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBDaGFpbiB0aGUgc3Vic2VnbWVudCByZWxvY3MgdG9nZXRoZXIuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBEb24ndCBjbGVhciBmaXhfdGFpbCBmaWVsZC4KLQkoc3Vic2VnX2dldCk6IExpa2V3aXNlLgotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgdmlhCi0JZnJjaGFpbl9ub3csIG5vdCBzZWdpbmZvLgotCi1UaHUgRmViICAzIDIzOjA3OjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5oIChUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IENoYW5nZWQKLQllY29mZl91bmRlZmluZWQgdG8gZWNvZmZfZXh0ZXJuX3NpemUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZXh0ZXJuKTogU2V0IGVjb2ZmX2V4dGVybl9zaXplIHRvIHRoZQotCWV4dGVybmFsIHN5bWJvbCBzaXplLCByYXRoZXJuIHRoYW4gc2V0dGluZyB0aGUgc3ltYm9sIHZhbHVlLgotCShtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCk6IENoZWNrIGJvdGggZWNvZmZfZXh0ZXJuX3NpemUgYW5kCi0Jc3ltYm9sIHZhbHVlIHRvIHNlZSBpZiBHUCByZWZlcmVuY2luZyBjYW4gYmUgdXNlZC4KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N5bWJvbF9uZXdfaG9vayk6IENsZWFyIGVjb2ZmX2V4dGVybl9zaXplLCBub3QKLQllY29mZl91bmRlZmluZWQuCi0JKGVjb2ZmX2Zyb2Jfc3ltYm9sKTogRG9uJ3QgY2hlY2sgZWNvZmZfdW5kZWZpbmVkLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogR2V0IHNpemUgb2YgYW4gdW5kZWZpbmVkIHN5bWJvbCBmcm9tCi0Jc3ltLT5lY29mZl9leHRlcm5fc2l6ZSwgbm90IFNfR0VUX1ZBTFVFIChzeW0pLgotCi1XZWQgRmViICAyIDEzOjU1OjA4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIGJ1ZyBpbiBsb3NpbmcgaHB1eCBzZWQuCi0KLVdlZCBGZWIgIDIgMTE6NDA6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChmaWxlX21pcHNfaXNhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBTZXQgaXQuCi0JKHNfbWlwc3NldCk6IEFkZCBzdXBwb3J0IGZvciAuc2V0IG1pcE4gdG8gc2V0IHRoZSBJU0EgbGV2ZWwuCi0KLQkqIGdhc3AuYyAoa2luZm8pOiBGdWxseSBicmFja2V0IGluaXRpYWxpemVyLgotCi1UdWUgRmViICAxIDE5OjI4OjEyIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhc3AuYyAobWFsbG9jKTogRG9uJ3QgZGVjbGFyZSwgc2luY2UgaG9zdC5oIG9yIHN5c3RlbSBoZWFkZXIKLQlmaWxlcyBtYXkgZGVjbGFyZSBpdCBkaWZmZXJlbnRseS4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChpbnRfdG9fZ2VuKTogTm93IHN0YXRpYy4KLQotCSogY29uZmlnL2hvLWkzODZhaXguaDogSW5jbHVkZSBzeXMvdHlwZXMuaCBhbmQgc3RkbGliLmgsIG5vdAotCWhvLXN5c3YuaC4gIEJhc2VkIGxvb3NlbHkgb24gYSBwYXRjaCBmcm9tIE1pbmggVHJhbi1MZS4KLQotVHVlIEZlYiAgMSAxMDo1MDoxNyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBnYXNwLmM6IEluY2x1ZGUgaG9zdC5oLgotCi1UdWUgRmViICAxIDEyOjEzOjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IE1ha2UgYW4gdW5zdXBwb3J0ZWQgaW5zdHJ1Y3Rpb24gYQotCXdhcm5pbmcsIG5vdCBhbiBlcnJvci4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLAotCWRvdF9ic3Nfc3ltYm9sKTogRG9uJ3QgZGVmaW5lIGlmIEJGRF9BU1NFTUJMRVIuCi0JKG9ial9zeW1ib2xfdG9fY2hhcnMpOiBiZmRfY29mZl9zd2FwX2F1eF9vdXQgbm93IHRha2VzIG1vcmUKLQlhcmd1bWVudHMuCi0JKGNvZmZfbGluZV9iYXNlKTogUmVuYW1lZCBmcm9tIGxpbmVfYmFzZS4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKGNvZmZfYWRkX2xpbmVzeW0pOiBSZW5hbWVkIGZyb20gYWRkX2xpbmVfc3ltLiAgTWFkZSBub24tc3RhdGljLgotCUNoYW5nZWQgYWxsIHVzZXMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogSWYgVENfUFBDLCBpbmNsdWRlIGNvZmYvcnM2MDAwLmguCi0JKFNfU0VUX1NUT1JBR0VfQ0xBU1MsIFNfR0VUX1NUT1JBR0VfQ0xBU1MpOiBEZWNsYXJlIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoY29mZl9saW5lX2Jhc2UpOiBEZWNsYXJlLgotCShjb2ZmX2FkZF9saW5lc3ltKTogRGVjbGFyZSBpZiBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHN5bWJvbF90b19jaGFycyk6IGJmZF9jb2ZmX3N3YXBfYXV4X291dAotCW5vdyB0YWtlcyBtb3JlIGFyZ3VtZW50cy4KLQotTW9uIEphbiAzMSAxNzo1NToxNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFzLmMgKHN0YXRpc3RpY3NfZmxhZyk6IFJlbmFtZWQgZnJvbSBxdWlldF9mbGFnLgotCShtYWluKTogR2V0IHN0YXRpc3RpY3Mgd2l0aCAtLXN0YXRpc3RpY3MgaW5zdGVhZCBvZiAtbm9xdWlldC4KLQotTW9uIEphbiAzMSAwNzoxOTozMCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogU3VwcG9ydCBmb3IgR251IEFTc2VtYmxlciBQcmVwcm9jZXNzb3IuCi0JKiBnYXNwLmM6IE5ldyBmaWxlLgotCSogcmVhZC5jIChzX2xjb21tKTogQWxpZ24gbGNvbW0gZGF0YS4KLQkqIGNvbmZpZy90Yy16OGsuYyAodGNfcmVsb2NfbWFuZ2xlKTogRG9uJ3QgYWxsb3cgc3VidHJhY3Rpb24KLQlmcm9tIGRpZmZlcmVudCBzZWN0aW9ucy4KLQotU3VuIEphbiAzMCAxNDo1ODoyNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIHRjX2Zyb2JfZmlsZSBpcyBkZWZpbmVkLCBjYWxsIGl0Ci0JanVzdCBiZWZvcmUgY2FsbGluZyBvYmpfZnJvYl9maWxlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2dwX3ZhbHVlKTogUmVuYW1lZCBmcm9tIGdwX3ZhbHVlCi0JKHJlZmVyZW5jZXMgY2hhbmdlZCksIGFuZCBtYWRlIG5vbi1zdGF0aWMuCi0JKGdldEV4cHJlc3Npb24pOiBSZXR1cm4gdm9pZC4KLQkoc2VsZWN0X2dwX3ZhbHVlKTogQWJvcnQgaWYgZ3BfdmFsdWUgaXMgbm9uLXplcm8uICBEZWxldGUgY2FsbCB0bwotCW5vbi1leGlzdGVudCBiZmRfc2V0X2dwX3ZhbHVlLgotCShhbHBoYV92YWxpZGF0ZV9maXgpOiBGdW5jdGlvbiBkZWxldGVkLgotCShhbHBoYV9mcm9iX3N5bWJvbCk6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGFscGhhX2xvY2FsX2xhYmVsKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoYWxwaGFfZnJvYl9maWxlKTogUmVuYW1lZCBmcm9tIGFscGhhX2VuZC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChhbHBoYV9mcm9iX3N5bWJvbCwgYWxwaGFfdmFsaWRhdGVfZml4LAotCWFscGhhX2xvY2FsX2xhYmVsLCBhbHBoYV9lbmQpOiBEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQkoYWxwaGFfZ3BfdmFsdWUsIGFscGhhX2Zyb2JfZmlsZSk6IERlY2xhcmUuCi0JKHRjX2Zyb2Jfc3ltYm9sLCBUQ19WQUxJREFURV9GSVgsIG1kX2VuZCk6IE1hY3JvcyBkZWxldGVkLgotCShMT0NBTF9MQUJFTCk6IE1vdmUgY29kZSBoZXJlIGZyb20gdGMtYWxwaGEuYzphbHBoYV9sb2NhbF9sYWJlbC4KLQkobWRfY29udmVydF9mcmFnKTogU2ltcGxpZmllZCBzbGlnaHRseS4KLQkodGNfZnJvYl9maWxlKTogTmV3IG1hY3JvLgotCi0JKiByZWFkLmMgKGRvX2FsaWduKTogTmV3IGZ1bmN0aW9uLCBtb3N0IG9mIGd1dHMgb2Ygc19hbGlnbl8qCi0JZnVuY3Rpb25zLiAgTG9vayBmb3IgbWRfZG9fYWxpZ24gbWFjcm8sIGdpdmUgaXQgYSBjaGFuY2UgdG8gYnlwYXNzCi0JYWxsIGJ1dCByZWNvcmRpbmcgb2Ygc2VjdGlvbiBhbGlnbm1lbnQuCi0JKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IENhbGwgZG9fYWxpZ24uCi0JKHNfbGNvbW0pIFtUQ19BTFBIQV06IEFsaWduIG9iamVjdCB0byBsYXJnZXN0IHBvd2VyIG9mIHR3byB0aGF0Ci0JZGl2aWRlcyBvYmplY3Qgc2l6ZS4KLQotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbl9wYXR0ZXJuKTogTmV3IGZ1bmN0aW9uLgotCShmcmFnX2FsaWduKTogUmV3cml0ZSBmb3IgY2xhcml0eS4KLQotCSogY29uZmlnL3RjLXZheC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBPX2NvbnN0YW50IGV4cHJlc3Npb24uCi0JKHZpcF9iZWdpbik6IFJldHVybnMgcG9pbnRlciB0byBjb25zdCBjaGFyLiAgQ2FzdCBoYXNoX2luc2VydCBhcmcKLQl0byBQVFIgdG8gYXZvaWQgY29tcGlsZXIgY29tcGxhaW50cyBhYm91dCBjb25zdC4KLQkobWRfYmVnaW4pOiBMb2NhbCB2YXJpYWJsZSBlcnJ0eHQgbXVzdCBwb2ludCB0byBjb25zdC4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgaG9zdCB2YXgtKi11bHRyaXgqIGxpa2UgdmF4LSotYnNkKi4gIERvbid0Ci0JYm90aGVyIHdpdGggKi0qLXVsdHJpeCBvciAqLSotc3lzdiosIGV4Y2VwdCAqLSotc3lzdiwgc2luY2Ugb25seQotCXRoZSBsYXN0IGhhcyBhbiBleGlzdGluZyBob3N0IHN1cHBvcnQgZmlsZS4gIERvIGhhbmRsZSB2YXgtYnNkIGFuZAotCXZheC11bHRyaXggdGFyZ2V0cy4KLQotRnJpIEphbiAyOCAxMToyNjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uX2hlYWRlcl9hcHBlbmQpOiBEbyBub3QKLQlkZWNsYXJlIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHN0YWNrX3BvcCk6IENvcnJlY3QgdGVzdCBmb3Igc3RhY2sgdW5kZXJmbG93LgotCShvYmpfY29mZl9lbmRlZiwgb2JqX2NvZmZfZGltLCBvYmpfY29mZl9saW5lLCBvYmpfY29mZl9zaXplLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLCBvYmpfY29mZl92YWwpOiBEZWNsYXJlCi0JdHlwZSBvZiBpZ25vcmVkIGFyZ3VtZW50IHRvIGF2b2lkIGdjYyB3YXJuaW5nLgotCShhbGlnbik6IFJlbW92ZWQgdW51c2VkIGZ1bmN0aW9uLgotCi1UaHUgSmFuIDI3IDE4OjE0OjE5IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jLCBjb25maWcvdGMtYWxwaGEuaCwgY29uZmlnL2FscGhhLW9wY29kZS5oOiBOZXcKLQlmaWxlcywgYmFzZWQgb24gcG9ydCBvZiBnYXMtMS4zOCBjb250cmlidXRlZCBieSBDTVUsIHVzaW5nIGEub3V0Ci0JdmFyaWFudC4gIFVwZGF0ZWQgZm9yIGdhcy0yLnggYW5kIEVDT0ZGLiAgRmxvYXRpbmctcG9pbnQgY29uc3RhbnRzCi0JYXJlIHN0aWxsIGJyb2tlbiwgYm9vdHN0cmFwIHRlc3RpbmcgaW5jb21wbGV0ZS4KLQotCSogbGl0ZXJhbC5jOiBDb21tZW50IGNoYW5nZXMuCi0KLQkqIGxpc3RpbmcuYyAobGlzdGluZ19zb3VyY2VfZmlsZSk6IENoZWNrIGZvciBudWxsIGxpc3RpbmdfdGFpbAotCWJlZm9yZSBpbmRpcmVjdGluZyB0aHJvdWdoIGl0LgotCi0JKiBleHByLmggKHN0cnVjdCBleHByZXNzaW9uUyk6IEFkZGVkIHN0cnVjdCB0YWcuCi0KLQkqIGFzLmg6IElmIF9fR05VQ19fIGFuZCBpbmxpbmUgYXJlIGJvdGggdW5kZWZpbmVkLCBkZWZpbmUgaW5saW5lCi0JYXdheS4KLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IERvbid0IGFzc3VtZSB0aGF0IGZyX3ZhciBmb3IKLQlyc19hbGlnbiBvciByc19vcmcgZnJhZ3Mgd2lsbCBiZSAxLgotCShyZWxheF9zZWdtZW50KTogRm9yIHJzX2FsaWduLCBpZiBmcl92YXIgaXMgbm90IDEsIGNvbXBsYWluIGlmCi0JcmVxdWlyZWQgcGFkZGluZyBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgc2l6ZSBvZiB0aGUgcGFkIHBhdHRlcm4uCi0JKGZpeHVwX3NlZ21lbnQpOiBMZWF2ZSBncC1yZWxhdGl2ZSByZWxvY2F0aW9ucyBhbG9uZS4gIEZvciBwY3JlbAotCXJlbG9jYXRpb25zIHJlZmVycmluZyB0byB0aGUgc2FtZSBzZWdtZW50LCBjbGVhciBmeF9wY3JlbCB3aGVuCi0JY2xlYXJpbmcgZnhfYWRkc3kuCi0JKiBhcy5oOiBBZGp1c3QgY29tbWVudHMgb24gcnNfYWxpZ24uCi0KLQkqIGF0b2YtZ2VuZXJpYy5jOiBTb21lIHJlZm9ybWF0dGluZy4KLQkoYXRvZl9nZW5lcmljKTogQmUgY2FyZWZ1bCB3aGVuIG1peGluZyBzaWduZWQvdW5zaWduZWQgdmFsdWVzIG9mCi0JZGlmZmVyZW50IHNpemVzLgotCi0JKiB3cml0ZS5jLCBjb25maWcvb2JqLXthb3V0LGJvdXQsY29mZip9LmMsIGNvbmZpZy90Yy1zcGFyYy5jOgotCVF1ZXJ5IHRoZSBmeF9kb25lIGZpZWxkIGluc3RlYWQgb2YgZnhfYWRkc3kgdG8gc2VlIGlmIHRoZSBmaXh1cAotCXN0aWxsIG5lZWRzIHRvIGJlIGFwcGxpZWQuICBTZXQgZnhfZG9uZSBhbmQgY2xlYXIgZnhfYWRkc3kgYm90aCwKLQlmb3Igbm93LiAgSWYgVENfSEFORExFU19GWF9ET05FIGlzbid0IGRlZmluZWQsIGFzc3VtZSBtZF9hcHBseV9maXgKLQl3aWxsIG9ubHkgY2xlYXIgZnhfYWRkc3ksIGFuZCBzZXQgZnhfZG9uZSBhY2NvcmRpbmdseSBhZnRlcgotCXJldHVybmluZy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQ19IQU5ETEVTX0ZYX0RPTkUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYXBwbHlfZml4KTogU2V0IGZ4X2RvbmUgZm9yIG5vbi1wY3JlbCBmaXgKLQl3aXRoIG5vIGZ4X2FkZHN5LgotCi0JKiBzeW1ib2xzLmMgKGRvdF90ZXh0X3N5bWJvbCwgZG90X2RhdGFfc3ltYm9sLCBkb3RfYnNzX3N5bWJvbCk6Ci0JRGVsZXRlZC4KLQkoc3ltYm9sX2JlZ2luKTogTW92ZWQgdG8gZW5kIG9mIGZpbGUsIHNvIGZ1bmN0aW9uIGlubGluaW5nIGNhbgotCXdvcmsgYmV0dGVyLgotCShmYl9sYWJlbF9jb3VudCwgZmJfbGFiZWxfbWF4KTogRGVmYXVsdCBDIHN0YXRpYyBpbml0aWFsaXplcnMgYXJlCi0Jc3VmZmljaWVudC4KLQkqIHN5bWJvbHMuaCAoZG90X3RleHRfc3ltYm9sLCBkb3RfZGF0YV9zeW1ib2wsIGRvdF9ic3Nfc3ltYm9sKToKLQlEZWNsYXJhdGlvbnMgZGVsZXRlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb3RfdGV4dF9zeW1ib2wsIGRvdF9kYXRhX3N5bWJvbCwKLQlkb3RfYnNzX3N5bWJvbCk6IERlZmluZWQgaGVyZSwgc3RhdGljLgotCi0JKiBjb25maWcvb2JqLWFvdXQuYyBbQkZEX0FTU0VNQkxFUl06IFVuZGVmIE5PX1JFTE9DIGJlZm9yZQotCWluY2x1ZGluZyBhb3V0L2FvdXQ2NC5oLgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIEVNSVRfU0VDVElPTl9TWU1CT0xTIGlzIGZhbHNlLAotCWRvbid0IHdyaXRlIG91dCBhIHNlY3Rpb24gc3ltYm9sIGV2ZW4gaWYgaXQncyB1c2VkIGluIGEKLQlyZWxvY2F0aW9uOyBhc3N1bWUgcmVsb2NhdGlvbnMgd2lsbCBoYW5kbGUgc2VjdGlvbiBudW1iZXJzCi0Jc29tZWhvdy4gIFJlbmFtZSAicHVudF9pdCIgbGFiZWwgdG8gInB1bnRfaXRfaWZfdW51c2VkIiB0byByZWZsZWN0Ci0JaXQncyB0cnVlIHVzZS4KLQkoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEZWZhdWx0IHRvIDEuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3QgY3JlYXRlIGEgbmV3IHN5bWJvbCBmb3IgYW4gYWJzb2x1dGUKLQlyZWZlcmVuY2U7IGp1c3QgdXNlIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHN5bWJvbC4KLQkod3JpdGVfcmVsb2NzKTogTWFrZSBwcmludG91dCBvZiByZWxvYyB2YWx1ZXMgZGVwZW5kZW50IG9uIGZsYWcKLQlERUJVRzMsIG5vdCBERUJVRzIuCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEZWZpbmUgYXMgMC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpOiBEaXR0by4KLQotVGh1IEphbiAyNyAxNjo0Mzo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAobGV4X3R5cGUpOiBObyBsb25nZXIgbWFrZSAneycgYSB2YWxpZCBjaGFyYWN0ZXIgZm9yCi0Jc3ltYm9sIG5hbWVzLgotCi0JKiBhcy5jIChtYWluKTogUHJpbnQgbG9uZyB2YWx1ZXMgdXNpbmcgJWxkLgotCi0JKiBtZXNzYWdlcy5jIChhc193YXJuX2ludGVybmFsKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXNfd2FybiwgMyB2ZXJzaW9ucyk6IFVzZSBhc193YXJuX2ludGVybmFsLgotCShhc193YXJuX3doZXJlLCAzIHZlcnNpb25zKTogTmV3IGZ1bmN0aW9uLgotCSogYXMuaCAoYXNfd2Fybl93aGVyZSk6IERlY2xhcmUuCi0KLVR1ZSBKYW4gMjUgMTg6MzA6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBhcy5jIChxdWlldF9mbGFnKTogTmV3IGZsYWcuCi0JKG1haW4pOiBJZiAtbm9xdWlldCBnaXZlbiwgZGlzcGxheSBleGVjdXRpb24gdGltZSBhbmQgbWVtb3J5IHVzZWQuCi0KLVR1ZSBKYW4gMjUgMTU6NTM6MTEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGRvYy97YWxsLnRleGksYXMudGV4aW5mb306IEFkZCBkb2N1bWVudGF0aW9uIGZvciBIUFBBIHBvcnQuCi0KLU1vbiBKYW4gMjQgMTk6MTg6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5jIChlY29mZl9mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4gIFB1dCB1bmRlZmluZWQKLQlzeW1ib2xzIG9mIGtub3duIHNpemUgaW4gdGhlIHVuZGVmaW5lZCBzZWN0aW9uLiAgUHV0IHNtYWxsIGNvbW1vbgotCXN5bWJvbHMgaW4gYSAuc2NvbW1vbiBzZWN0aW9uLgotCSogZWNvZmYuaCAoZWNvZmZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCSogY29uZmlnL29iai1lY29mZi5oIChvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3dyaXRlX3N5bWJvbF9wLCBvYmpfZWxmX3dyaXRlX3N5bWJvbCwKLQlvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCB1bnVzZWQgZnVuY3Rpb25zLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2Zyb2Jfc3ltYm9sLCBvYmpfd3JpdGVfc3ltYm9sKTogUmVtb3ZlZAotCXVudXNlZCBtYWNyb3MuCi0JKG9ial9lbGZfZnJvYl9zeW1ib2wsIG9ial9lbGZfd3JpdGVfc3ltYm9sKTogUmVtb3ZlZCBkZWNsYXJhdGlvbnMKLQlvZiB1bnVzZWQgZnVuY3Rpb25zLgotCShvYmpfZnJvYl9zeW1ib2wpOiBEZWZpbmUgaWYgRUNPRkZfREVCVUdHSU5HLgotCi0JKiB0Yy1taXBzLmMgKGdfc3dpdGNoX3NlZW4pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgZ19zd2l0Y2hfc2VlbiBmb3IgLUcgb3B0aW9uLgotCShzX29wdGlvbik6IElmIGNyZWF0aW5nIFBJQyBjb2RlLCBmb3JjZSB0aGUgR1Agc2l6ZSB0byBiZSAwLiAgV2FybgotCWlmIC1HIHN3aXRjaCB1c2VkIHdpdGggYSBub24temVybyB2YWx1ZS4KLQotCSogc3ltYm9scy5jIChTX0lTX0NPTU1PTik6IFVzZSBiZmRfaXNfY29tX3NlY3Rpb24gcmF0aGVyIHRoYW4KLQljb21wYXJpbmcgYWdhaW5zdCBiZmRfY29tX3NlY3Rpb24uCi0KLU1vbiBKYW4gMjQgMTQ6MTI6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChzX2xjb21tKTogVHJlYXQgQWxwaGEgbGlrZSBNSVBTIGluIGhhbmRsaW5nIG9mIC5zYnNzCi0Jc2VjdGlvbi4KLQotVGh1IEphbiAyMCAxMzoxNzo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBGb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZCB3aXRoIHVudXN1YWwgZnAKLQljaGFyIGZyb20gRkxUX0NIQVJTLCBwcmVzZXJ2ZSB0aGUgY2hhcmFjdGVyLiAgUGF0Y2ggZnJvbSBMaXNhCi0JUmVwa2EuCi0KLVdlZCBKYW4gMTkgMjM6MTU6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgYWxsIGRhdGEgYWxsb2NhdGlvbgotCXBzZXVkby1vcHM6IC5od29yZCwgLmludCwgLmxvbmcsIC5vY3RhLCAucXVhZCwgLnNob3J0LCAuc2luZ2xlLgotCi1UdWUgSmFuIDE4IDE1OjUxOjU5IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9lbmRlZik6IEZvciBDX0VGQ04sIENfQkxPQ0sgYW5kCi0JQ19GQ04gYXNzdW1lIC52YWwgaGFzIGJlZW4gc2V0IHRvIC4KLQotVHVlIEphbiAxOCAxNjoxOTo1OCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogRGlzYWJsZSBtdWx0aXBsZSAkQ09ERSQgc3Vic3BhY2UgY29kZS4gIEl0Ci0JY29uZnVzZXMgR0RCIGZvciBzb21lIHVua25vd24gcmVhc29uLgotCSogY29mbmlnL29iai1zb20uYzogTGlrZXdpc2UuCi0KLVR1ZSBKYW4gMTggMTk6MDU6MzIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGl0ZXJhbC5jIChhZGRfdG9fbGl0ZXJhbF9wb29sKTogSGFuZGxlIGR1cGxpY2F0ZXMgb2YgdmFsdWVzCi0JYWxyZWFkeSB3cml0dGVuIHRvIGxpdGVyYWwgcG9vbC4KLQotVHVlIEphbiAxOCAxNzoyMzo1MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfYW91dF9mcm9iX3N5bWJvbCk6IFRyeSB0byBnZXQgc3ltYm9scwotCXdpdGggZXhwbGljaXRseSBtYXJrZWQgc3RhYnMgdGhyb3VnaCBCRkQ6IGlmIGEgc3ltYm9sIG1hcmtlZAotCU5fVU5ERiB8IE5fRVhUIGlzIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLCBtb3ZlIGl0IHRvIHRoZQotCXVuZGVmaW5lZCBzZWN0aW9uOyBtb3ZlIGEgc3ltYm9sIG1hcmtlZCBOX0lORFIgaW50bwotCWJmZF9pbmRfc2VjdGlvbiBhbmQgc2V0IHRoZSBCU0ZfSU5ESVJFQ1QgZmxhZzsgc2V0IHRoZQotCUJTRl9XQVJOSU5HIGZsYWcgZm9yIGEgc3ltYm9sIG1ha3JlZCBOX1dBUk5JTkcuCi0KLU1vbiBKYW4gMTcgMTU6NDA6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUpOiBEZWNsYXJlLgotCSogZWNvZmYuYyAoZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplKTogUmV0dXJuIHR5cGUgaXMgdm9pZC4KLQotTW9uIEphbiAxNyAwMDoxODo1NSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBFeHBsaWNpdGx5IGNoZWNrIGZvciBjb21tYSBiZWZvcmUgJ3UnCi0JYW5kICdmJyB0ZW1wbGF0ZSBvcGVyYW5kLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IEhhbmRsZSAnTicsICdPJywgJ28nLCAnMCcsICcxJywgJ3UnLAotCWFuZCAnMicgaW4gY29wciBhbmQgc2Z1IGluc3RydWN0aW9uIHRlbXBsYXRlcy4KLQotU3VuIEphbiAxNiAxNjo0NDoyMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXMuaCAoc3Vic2VnX2ZvcmNlX25ldyk6IEFkZCBwcm90b3R5cGUuCi0KLVNhdCBKYW4gMTUgMDk6MjA6NTUgMTk5NCAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFsbG93IGxpbmVzIGxpa2UgIiBmb29sYWIgOiIuCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogRml4IGNvbXB1dGF0aW9uIG9mIG1hc2suCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBGaXggbG9vcCB0ZXJtaW5hdGlvbiB0ZXN0LgotCi1UaHUgSmFuIDEzIDE2OjE1OjE1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3NldF9ncF9wcm9sb2dfc2l6ZSk6IE5ldyBmdW5jdGlvbi4KLQkoY3VycmVudF9maWxlX2lkeCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFkZF9maWxlKTogVXNlIGFuZCBpbmNyZW1lbnQgY3VycmVudF9maWxlX2lkeCBpbnN0ZWFkIG9mIGluZHgKLQlwYXJhbWV0ZXIuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogTWFrZSBhbGwgYml0ZmllbGRzIHVuc2lnbmVkLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChpOTYwX3ZhbGlkYXRlX2ZpeCk6IEFkZGVkIGFyZ3VtZW50Ci0JYWRkX3N5bWJvbFBQLiAgSW5kaXJlY3QgdGhyb3VnaCBpdCB0byBnZXQgImFkZF9zeW1ib2xQIi4KLQkqIGNvbmZpZy90Yy1pOTYwLmggKGk5NjBfdmFsaWRhdGVfZml4KTogU3VwcGx5IHByb3RvdHlwZS4KLQkoVENfVkFMSURBVEVfRklYKTogUGFzcyBhZGRyZXNzIG9mIGFkZF9zeW1ib2xQLgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1uZXRic2QqKTogTmV3IHRhcmdldCwgdXNpbmcgdGUtbmV0YnNkLmguCi0JKGkzODYtKi1uZXRic2QwLjgpOiBOZXcgdGFyZ2V0LCBsaWtlIDM4NmJzZC4KLQotCSogY29uZmlndXJlLmluOiBTZXQgQkZEREVGIGluIE1ha2VmaWxlIHRvICJkZWZpbmUiIG9yICJ1bmRlZiIuCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLmgpOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9ucy4KLQlEZWZpbmUgb3IgdW5kZWYgQkZEX0FTU0VNQkxFUiBhcyBzcGVjaWZpZWQgYnkgJChCRkRERUYpLgotCShBTExfQ0ZMQUdTKTogT21pdCAkKEJGRERFRikuCi0JKiBhcy5oOiBJbmNsdWRlIGNvbmZpZy5oLgotCShzdHJ1Y3Qgc3ltYm9sKTogQWRkZWQgZm9yd2FyZCBkZWNsYXJhdGlvbi4KLQkoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IEZpeCBkZWNsYXJhdGlvbi4KLQkqIGFzLmM6IERvbid0IGluY2x1ZGUgY29uZmlnLmguCi0KLQkqIGxpdGVyYWwuYyAoYWRkX3RvX2xpdGVyYWxfcG9vbCk6IFRha2Ugc3ltYm9sIGFuZCBhZGRlbmQgYXMKLQlhcmd1bWVudHMsIGluc3RlYWQgb2YgZXhwcmVzc2lvbiwgZm9yIG5vdy4gIEZpeCBjYWxjdWxhdGlvbiBvZgotCW9mZnNldCB0byByZXR1cm4uCi0KLQkqIHN1YnNlZ3MuaCAoc2VnbWVudF9pbmZvX3R5cGUpIFtORUVEX0xJVEVSQUxfUE9PTF06IEFkZCBmaWVsZAotCWxpdGVyYWxfcG9vbF9zaXplLgotCi1UaHUgSmFuIDEzIDEyOjE0OjIxIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1Ci0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2dldCk6IEFjY2VwdCBuZXcgYXJndW1lbnQgImZvcmNlX25ldyIuICBJZgotCXNldCB0aGVuIGEgbmV3IHNlZ21lbnQgaXMgYWx3YXlzIGNyZWF0ZWQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShzdWJzZWdfZm9yY2VfbmV3KTogTmV3IGZ1bmN0aW9uLiAgU2ltaWxhciB0byBzdWJzZWdfbmV3LCBidXQKLQlhbHdheXMgZm9yY2UgYSBuZXcgc2VnbWVudCB0byBiZSBjcmVhdGVkLgotCi0JKiBjb25maWcvb2JqLXNvbS5jIChzb21fZnJvYl9maWxlKTogQ2FsbCBhZGp1c3RfY29kZV9zZWN0aW9ucwotCWZvciBlYWNoIHNlY3Rpb24uCi0JKGFkanVzdF9jb2RlX3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9uLiAgQWRqdXN0cyB0aGUgVk1BIGZvciBhbGwgdGhlCi0JJENPREUkIHN1YnNwYWNlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXNzZW1ibGUpOiBBbHNvIGhhbmRsZSBjcmVhdGluZyBhIGZpeHVwCi0JZm9yIHRoZSB1bndpbmQgZGVzY3JpcHRvcnMgaWYgYSBmdW5jdGlvbidzIGxhYmVsIGZvbGxvd3MgdGhlCi0JLlBST0MgYW5kIC5FTlRSWSBkaXJlY3RpdmVzLgotCShwYV9lbnRyeSk6IERvbid0IHNldCBCU0ZfRlVOQ1RJT04gZm9yIHRoZSBsYWJlbCBzeW1ib2wgaGVyZTsgaXQKLQlpcyBkb25lIGVsc2V3aGVyZS4gIERvbid0IGNyZWF0ZSBhIGZpeHVwIGZvciB0aGUgdW53aW5kCi0JZGVzY3JpcHRvcnMgaWYgdGhlIGZ1bmN0aW9uJ3MgbGFiZWwgaGFzIG5vdCBiZWVuIGRlZmluZWQgeWV0LgotCShwYV9wcm9jKTogRm9yIFNPTSwgcGxhY2UgZWFjaCBwcm9jZWR1cmUgd2l0aGluIGEgbmV3ICRDT0RFJAotCXN1YnNwYWNlLiAgQWRqdXN0IHRoZSBzZWdtZW50IGFuZCBmcmFnIGZvciB0aGUgYXNzb2NpYXRlZAotCWZ1bmN0aW9uIGxhYmVsIGlmIGl0IGV4aXN0cy4KLQotV2VkIEphbiAxMiAyMjowNTozMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV9maXhfc3RydWN0KTogQWRkIG5ldyAic2VnbWVudCIgZmllbGQuCi0JKGhwcGFfZml4X25ldyk6IEluaXRpYWxpemUgc2VnbWVudCBmaWVsZC4KLQkobWRfYXBwbHlfZml4KTogRG8gbm90aGluZyBmb3IgcGMtcmVsYXRpdmUgZml4dXAgd2hpY2ggaW52b2x2ZXMKLQljcm9zc2luZyBhIHNlZ21lbnQgYm91bmRhcnkuCi0JKHBhX3Byb2NlbmQpOiBVbmRlZmluZSB0aGUgY3VycmVudCBsYWJlbCBhZnRlciBoYW5kbGluZyAuUFJPQwotCWFuZCAuUFJPQ0VORCBkaXJlY3RpdmVzLgotCShkdW1teV9zeW1ib2wpOiBNYWtlIHR5cGUgInN5bWJvbFMgKiIuICBDaGFuZ2UgcmVmZXJlbmNlcyBhcwotCWFwcHJvcHJpYXRlLgotCi1XZWQgSmFuIDEyIDEzOjI5OjMxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDYXN0IGFycmF5IGFyZ3VtZW50IHRvIHVuc2lnbmVkCi0JY2hhci4KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBzeW1zZWdpbmZvLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBwdW50X2l0IGlmIGl0IHdvbid0IGJlIHVzZWQuCi0JKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkZWZpbmUgc2tpcCBpZiBpdCB3b24ndCBiZSB1c2VkLgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGFzIG1pcHNfdGFyZ2V0X2Zvcm1hdC4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IERlZmluZSB3aXRoIGFwcHJvcHJpYXRlCi0JZGVmYXVsdCBkZWZpbml0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiAtRUwgb3IgLUVCIGlzIHVzZWQsIGNoYW5nZSBieXRlX29yZGVyIGFuZAotCW1pcHNfdGFyZ2V0X2Zvcm1hdCBhcyBhcHByb3ByaWF0ZS4KLQotVHVlIEphbiAxMSAyMTo1MjozNiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEFub3RoZXIgYXR0ZW1wdCB0byBmaXggYnVncwotCWRlYWxpbmcgd2l0aCBsYWJlbHMgd2l0aG91dCBjb2xvbnMgKGZvciBIUFBBIGFuZCBNUkkpLgotCi1UdWUgSmFuIDExIDE3OjAxOjA2IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFRydW5jYXRlIGFyZ3MgdG8gJWhpLyVsbyB0byAzMiBiaXRzLgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBGaXggY29tcHV0YXRpb24gb2YgdG9vX21hbnlfZGlnaXRzLgotCVZhcmlhYmxlIGRpZ2l0XzIgcmVuYW1lZCB0byBzdGFydC4gIEZpeCBjaGVjayBmb3Igd2hldGhlciBudW1iZXIKLQl3aWxsIGZpdCBpbiAzMiBiaXRzLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgdmFsdWVUIGluc3RlYWQgb2YgbG9uZy4KLQotVHVlIEphbiAxMSAxMzowMToyMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IElmIFRDX01JUFMsIGluY2x1ZGUgZWxmL21pcHMuaC4KLQkoc3BlY2lhbF9zZWN0aW9ucyk6IERlZmluZS4KLQkob2JqX2VsZl9zcGVjaWFsX3NlY3Rpb24pOiBHZXQgZGVmYXVsdCB0eXBlcyBhbmQgYXR0cmlidXRlcyBmcm9tCi0JbGlzdCBvZiBzcGVjaWFsIHNlY3Rpb25zLgotCSogY29uZmlnL3RjLW1pcHMuYyAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRm9yY2UgLnNkYXRhIGFuZCAuc2JzcwotCXNlY3Rpb25zIHRvIGJlIGNsb3NlIHRvZ2V0aGVyLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3RlZCAkYXQgd2FybmluZ3MgaW4gYSBjb3VwbGUgb2YKLQlzcG90cy4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX3ByZXZfbGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxpc3RpbmcuYzogSW5jbHVkZSBzdWJzZWdzLmguCi0JKGxpc3RpbmdfcHJldl9saW5lKTogTmV3IGZ1bmN0aW9uLgotCShjYWxjX2hleCk6IFJlc2V0IGJ5dGVfaW5fZnJhZyB0byB6ZXJvIGZvciBlYWNoIG5ldyBmcmFnLgotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBDYWxsIGxpc3RpbmdfcHJldl9saW5lIGFmdGVyCi0JZW1pdHRpbmcgbm9wIGluc3RydWN0aW9ucy4KLQkqIE1ha2VmaWxlLmluIChsaXN0aW5nLm8pOiBEZXBlbmRzIHVwb24gc3Vic2Vncy5oLgotCi1Nb24gSmFuIDEwIDA5OjUyOjIzIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pcCk6IFB1dCBjaGVjayBmb3IgbWlzc2luZyBsYWJlbCBvbiAuUFJPQwotCWhlcmUuICBIYW5kbGUgY2FzZSB3aGVyZSBsYWJlbCBtYXkgYmUgZGVmaW5lZCBhZnRlciB0aGUgLlBST0MuCi0JKHBhX3Byb2MpOiBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIHByb2NlZHVyZSdzIGxhYmVsIGlzbid0Ci0JZGVmaW5lZCBiZWZvcmUgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotU3VuIEphbiAgOSAwNDo0MzozMCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RlLW5ldGJzZC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKFRBUkdFVF9GT1JNQVQpIFtURV9OZXRCU0RdOiBVc2UgYmZkIHRhcmdldAotCWEub3V0LW5ldGJzZC0zODYgZm9yIHRoaXMgY29uZmlndXJhdGlvbi4KLQotRnJpIEphbiAgNyAxNzozODoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX3N0YWIpOiBEb24ndCBjbG9iYmVyIHRoZSBFQ09GRiBzeW1ib2wgaW5mb3JtYXRpb24KLQl3aXRoIHRoZSBhc3NvY2lhdGVkIHN0YWJzIGluZm9ybWF0aW9uLgotCShlY29mZl9idWlsZF9zeW1ib2xzKTogTmV2ZXIgc2V0IHRoZSB0eXBlIG9mIHN0YWJzIHN5bWJvbHMgdG8KLQlzdF9HbG9iYWwuICBEb24ndCB1cGRhdGUgdGhlIHN5bWJvbCBpbmRleCBvciBpZmQgaWYgdGhlIGdhcyBzeW1ib2wKLQlpcyBub3QgdGhlIHNhbWUgYXMgdGhlIEVDT0ZGIHN5bWJvbCAod2hpY2ggaXMgbm93IHRoZSBjYXNlIGZvcgotCXN0YWJzIHN5bWJvbHMpLgotCi1GcmkgSmFuICA3IDExOjE0OjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBBZGQgYSBMT1NJTkdfQ09NUElMRVIgaWZkZWYgdGhhdAotCXNwbGl0cyB0aGUgZnVuY3Rpb24uCi0JKG1hY3JvMik6IE5ldyBmdW5jdGlvbiwgaWYgTE9TSU5HX0NPTVBJTEVSIGRlZmluZWQuCi0KLUZyaSBKYW4gIDcgMDk6Mzg6MjUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6ICBEb24ndCBldmVyIGZpbGwgcGFzdCB0aGUKLQllbmQgb2YgYSBzZWN0aW9uLiAod3JpdGVfb2JqZWN0X2ZpbGUpOiBUZW1wb3JhcnkgZml4IC0gc2V0dXAKLQlzdGRvdXRwdXQuCi0KLVRodSBKYW4gIDYgMTg6MDU6MjEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEZpeCBoYW5kbGluZyBvZiBhZGRlbmRzIGluCi0Jbm9uLXBjcmVsX29mZnNldCByZWxvY2F0aW9ucy4KLQotVGh1IEphbiAgNiAwMTowNjo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBXYXJuIGFib3V0IHVzaW5nICQxIGFzIHdlbGwgYXMgJGF0Ci0Jd2l0aG91dCAuc2V0IG5vYXQuCi0KLVdlZCBKYW4gIDUgMTQ6MjI6MjIgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGl0ZXJhbC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBMaXN0IGl0LgotCi0JKiBhcy5oIChERUJVRyk6IERvbid0IGRlZmluZS4KLQkoc3RydWN0IGV4cHJlc3Npb25TLCBzdHJ1Y3QgZml4KTogRGVjbGFyZSBpbiBjYXNlIHRoZXkncmUgdXNlZCBpbgotCXByb3RvdHlwZXMuCi0JKGFkZF90b19saXRlcmFsX3Bvb2wpIFtCRkRfQVNTRU1CTEVSXTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9BT1VUXTogRml4IGZvciBuZXcgbmFtZXMKLQlpbiBiZmQuCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX2dldCk6IE5ldyBmdW5jdGlvbi4gIENyZWF0ZXMgc2VnbWVudCBpZgotCW5lZWRlZCwgcmV0dXJucyBwb2ludGVyLCBidXQgZG9lc24ndCBjaGFuZ2UgY3VycmVudCBzZWdtZW50LgotCShzdWJzZWdfbmV3KTogVXNlIGl0LgotCi1UdWUgSmFuICA0IDE1OjEyOjQzIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogQWRkICQoc3JjZGlyKS8uLiB0byBwbGFjZXMgdG8gc2VhcmNoLgotCSogY29uZmlnL29iai1lY29mZi5jOiBJbmNsdWRlIGZpbGVzIGFzICJiZmQvIiBpbnN0ZWFkIG9mICIuLi9iZmQvIi4KLQkqIGFwcC5jLCBmbG9udW0uaCwgaGV4LXZhbHVlLmMgKGNvbnN0KTogQ2hhbmdlICNpZiB0byBiZSBtb3JlCi0JcG9ydGFibGUuCi0KLVR1ZSBKYW4gIDQgMjI6MTE6MzQgMTk5NCAgUm9iIFNhdm95ZSAgKHJvYkBkYXJrc3Rhci5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tdnN0YS5oLCBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBWU1RhCi0JbWljcm8ta2VybmVsLgotCi1UaHUgRGVjIDMwIDE1OjI3OjE2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBub3cgdGFrZXMgYW4KLQlhZGRpdGlvbmFsIGFyZ3VtZW50LCB0byByZXR1cm4gYW4gZXJyb3Igc3RyaW5nICh3aGljaCB3ZSBpZ25vcmUpLgotCi1XZWQgRGVjIDI5IDE0OjM3OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBGaWVsZCB0Y19maXhfZGF0YSBzaG91bGQgYmUgdHlwZSBQVFIsIG5vdAotCXZvaWQqLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1BTlNJIGNvbXBpbGVycy4gIEFkZGVkCi0Jc2luZ2xlLWJpdCBmaWVsZCAiZnhfZG9uZSIuCi0KLVN1biBEZWMgMjYgMTQ6MzE6NDcgMTk5MyAgVG9yYmpvcm4gR3Jhbmx1bmQgICh0ZWdlQGFkZGVyLmN5Z251cy5jb20pCi0KLQkqIHRjLWhwcGEuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQ29udmVydCB0byBsb3dlciBjYXNlLgotCURlbGV0ZSBzcHVyaW91cyByZWdpc3RlciBuYW1lcyAiJXI0TCIsIGV0Yy4KLQkoc2VsZWN0b3JfdGFibGUpOiBTb3J0IGFuZCBjb252ZXJ0IHRvIGxvd2VyIGNhc2UuCi0JKGNvbnNfZml4X25ld19ocHBhKTogYHJlbG9jX3R5cGUnID0+IGByZWxfdHlwZScuCi0JKHBhX2lwKTogQWx3YXlzIHVzZSBzdHJjbXAgZm9yIG5vbi10ZXh0IGFuZCBzdHJjYXNlY21wIGZvciB0ZXh0LgotCShyZWdfbmFtZV9zZWFyY2gpOiBSZXdyaXRlIHRvIGNhbGwgc3RyY2FzZWNtcCBvbmx5IG9uY2UgcGVyCi0JaXRlcmF0aW9uLgotCShwYV9jaGtfZmllbGRfc2VsZWN0b3IpOiBSZXdyaXRlIHRvIHVzZSBiaW5hcnkgc2VhcmNoLgotCShwYV9wYXJzZV9uZWdfYWRkX2NtcGx0cik6IFVzZSBzdHJjYXNlY21wIGZvciBjb21wbGV0ZXIgY29tcGFyaXNvbnMuCi0JKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiAkVEVYVCQgYW5kICRQUklWQVRFJCBhcmUgc3ltYm9sczsgdXNlIGNhc2UKLQlzZW5zaXRpdmUgY29tcGFyaXNvbnMuCi0JKHBhX3BhcnNlX3NwYWNlX3N0bXQpOiBDYW5vbmljYWxpemUgc3RybmNhc2VjbXAgYXJnIHRvIGxvd2VyIGNhc2UuCi0JKHBhX3NwYWNlKTogIiR0ZXh0JCIgPT4gIiRURVhUJCI7ICIkcHJpdmF0ZSQiID0+ICIkUFJJVkFURSQiLiAgVXNlCi0JY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBmb3IgYWxsIHN5bWJvbGljIG5hbWVzLgotCShwYV9zdWJzcGFjZSk6IENhbm9uaWNhbGl6ZSBzdHJuY2FzZWNtcCBhcmcgdG8gbG93ZXIgY2FzZS4KLQkocGFfc3Vic3BhY2Vfc3RhcnQpOiBVc2UgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBmb3Igc3ltYm9saWMgbmFtZXMuCi0KLU1vbiBEZWMgMjAgMTA6Mzc6NDggMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpIFtSRUxPQ19SRVFVSVJFU19TWU1CT0xdOiBJZiBubwotCXN5bWJvbCBpcyBwcmVzZW50IChpLmUuLCByZWxvY2F0aW9uIGFnYWluc3QgYWJzb2x1dGUpLCBjcmVhdGUgYQotCXBob255IGxvY2FsIHN5bWJvbCwgYW5kIHVzZSBpdCBpbiB0aGUgcmVsb2MuCi0JKGZpeHVwX3NlZ21lbnQpOiBXaGVuIGFkanVzdGluZyBhIHJlbG9jIHdpdGggYW4gYWJzb2x1dGUgc3ltYm9sLAotCWhhdmUgVENfRk9SQ0VfUkVMT0NBVElPTiBjb250cm9sIGNsZWFyaW5nIGFkZF9zeW1ib2xQIHRvby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChSRUxPQ19SRVFVSVJFU19TWU1CT0wpOiBEZWZpbmUsIGZvciBPQkpfQ09GRi4KLQotCSogc3ltYm9scy5jIChTX0lTX0VYVEVSTkFMLCBTX0lTX0xPQ0FMKTogRG9uJ3QgdXNlIGJvdGggQlNGX0VYUE9SVAotCWFuZCBCU0ZfR0xPQkFMLCBzaW5jZSB0aGV5J3JlIHRoZSBzYW1lLgotCi0JKiBhcy5jIChtYWluKTogT25seSBpbnZva2UgbWRfZW5kIGlmIGl0J3MgZGVmaW5lZCBhcyBhIG1hY3JvLgotCSogdGMuaCAobWRfZW5kKTogRG9uJ3QgZGVjbGFyZSBpdC4KLQkqIGNvbmZpZy90Yy0qLltjaF0gKG1kX2VuZCk6IERlbGV0ZWQsIGluIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgZG8KLQlhbnl0aGluZy4KLQkqIGNvbmZpZy90Yy12YXguYyAodmlwX2VuZCk6IERlbGV0ZWQgbnVsbCBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX21pcHNfZW5kKTogUmVuYW1lZCBmcm9tIG1kX2VuZC4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1kX21pcHNfZW5kKTogRGVjbGFyZS4KLQkobWRfZW5kKTogTmV3IG1hY3JvLCBjYWxscyBtZF9taXBzX2VuZC4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEb24ndCBjbG9zZSBvdXRwdXQgZmlsZS4KLQkqIGFzLmMgKG1haW4pOiBDbG9zZSBvdXRwdXQgZmlsZSAoaWYgbmVlZGVkKSBhZnRlciBjYWxsaW5nCi0JbGlzdGluZ19wcmludCwgd2hpY2ggc2hvdWxkIGJlIGFmdGVyIGNhbGxpbmcgd3JpdGVfb2JqZWN0X2ZpbGUsCi0Jd2hpY2ggc2V0cyB0aGUgZnJhZyBhZGRyZXNzZXMuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9kaW0sIG9ial9jb2ZmX2VuZGVmLCBvYmpfY29mZl9saW5lLAotCW9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfc2l6ZSwgb2JqX2NvZmZfdGFnLCBvYmpfY29mZl90eXBlLAotCW9ial9jb2ZmX3ZhbCk6IEFkZCB1bnVzZWQgaW50IGFyZ3VtZW50IHRvIHNhdGlzZnkgcHJvdG90eXBlczsgZ29lcwotCXdpdGggSWFuJ3MgMTAgU2VwIGNoYW5nZXMuCi0JKFNfR0VUX0RBVEFfVFlQRSwgU19TRVRfREFUQV9UWVBFLCBTX0dFVF9TVE9SQUdFX0NMQVNTLAotCVNfU0VUX1NUT1JBR0VfQ0xBU1MpOiBOb3cgZnVuY3Rpb24gaW5zdGVhZCBvZiBtYWNyb3MuCi0JKG9ial9lbWl0X2xpbmVubykgW0JGRF9BU1NFTUJMRVJdOiBEZWxldGVkLgotCSh0YWdfaW5zZXJ0KTogTG9jYWwgdmFyIEVSUk9SX1NUUklORyBpcyBjb25zdC4gIFVzZSAiY29uc3QiIG5vdAotCSJDT05TVCIgZm9yIGFyZ3VtZW50IE5BTUUuICBGaXhlZCBwcm90b3R5cGUuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBSZW1vdmVkIGV4cGxpY2l0ICIjaWYgMSIgZGlyZWN0aXZlLiAgSWYKLQlTX0lTX0VYVEVSTkFMLCBzZXQgc3RvcmFnZSBjbGFzcyB0byBDX0VYVC4KLQkoc19nZXRfbmFtZSk6IFVzZSAiY29uc3QiIG5vdCAiQ09OU1QiLgotCSogY29uZmlnL29iai1jb2ZmLmggKFNfR0VUX0RBVEFfVFlQRSwgU19TRVRfREFUQV9UWVBFLAotCVNfR0VUX1NUT1JBR0VfQ0xBU1MsIFNfU0VUX1NUT1JBR0VfQ0xBU1MpOiBEZWxldGVkLgotCShvYmpfZW1pdF9saW5lbm8pOiBEZWNsYXJlIG9ubHkgZm9yIG5vbi1CRkRfQVNTRU1CTEVSLiAgRm9yCi0JQkZEX0FTU0VNQkxFUiwgZGVmaW5lIGFzIG1hY3JvIHRoYXQgYWJvcnRzLgotCShvYmpfZXh0cmFfc3R1ZmYsIHRjX2hlYWRlcnNfaG9vayk6IERlY2xhcmUgb25seSBmb3IKLQlub24tQkZEX0FTU0VNQkxFUi4KLQkoY29mZl9mcm9iX3N5bWJvbCk6IEZpeCBwcm90b3R5cGUuCi0KLVN1biBEZWMgMTkgMDA6Mzc6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogVGVzdCBvZiBwY3JlbF9vZmZzZXQgaGFkIHNlbnNlCi0JcmV2ZXJzZWQuCi0KLVRodSBEZWMgMTYgMjE6MTM6MTEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2JlZ2luKTogSW5pdGlhbGl6ZSAiZHVtbXlfbGFiZWwiLgotCSh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogRm9yIHJlbG9jYXRpb25zIHdoaWNoIGhhdmUgbm8gc3ltYm9sLAotCXNldCBzeW1fcHRyX3B0ciB0byBkdW1teV9sYWJlbC4gIEF2b2lkcyBsb3NzYWdlIGluIGdlbmVyaWMgQkZEIGNvZGUuCi0KLVRodSBEZWMgMTYgMTY6MDc6NTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChsZXhfdHlwZSk6IE5vIGxvbmdlciBtYWtlICdbJyBhIHZhbGlkIGNoYXJhY3RlciBmb3IKLQlzeW1ib2wgbmFtZXMuCi0KLQkqIGNvbmZpZy90Yy12YXguYyAodGNfYW91dF9maXhfdG9fY2hhcnMpOiBMb2NhbCB2YXJpYWJsZQotCU5CWVRFU19SX0xFTkdUSCBub3cgY29uc3QuCi0KLQkqIGNvbmZpZy9vYmotKi5jLCBjb25maWcvdGMtKi5jOiBPbWl0IHN1cGVyZmx1b3VzICJyZXR1cm4iCi0Jc3RhdGVtZW50cyBhdCBlbmRzIG9mIGZ1bmN0aW9ucy4gIERvbid0IGNoZWNrIGZvciBudWxsIHJldHVybiBmcm9tCi0JaGFzaF9uZXcsIHNpbmNlIGl0IHdvbid0IHJldHVybiBhdCBhbGwgaWYgdGhlcmUncyBubyBtZW1vcnkKLQlhdmFpbGFibGUuICBBbHNvLCBjaGVjayBmb3IgbnVsbCByZXR1cm4gZnJvbSBoYXNoX2luc2VydCwgcmF0aGVyCi0JdGhhbiB6ZXJvLWxlbmd0aCBzdHJpbmcsIGFzIHN1Y2Nlc3MgaW5kaWNhdG9yLgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWN0aW9uX3N5bWJvbCk6IERlY2xhcmUuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFVzZSBpdC4KLQotV2VkIERlYyAxNSAxNTozOTo1MyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoUlVOVEVTVCk6IE5ldyB2YXJpYWJsZS4KLQkoQ0hFQ0tGTEFHUyk6IFBhc3MgaXQgZG93bi4KLQotCSogZWNvZmYuYyAoZWNvZmZfZGlyZWN0aXZlX2ZyYW1lKTogUGVybWl0IGV4dHJhIHRyYWlsaW5nIG9wZXJhbmRzOwotCXVudXNlZCBmb3Igbm93LCBidXQgc3VwcGxpZWQgYnkgQWxwaGEgT1NGMSBjb21waWxlci4KLQotCSogYXMuaDogUHJvdGVjdCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbnMuCi0JKGludF90b19nZW4pOiBEb24ndCBkZWNsYXJlLgotCi0JKiBjb25maWcvYXRvZi12YXguYyAoYXRvZl92YXgpOiBOVUxMIGlzIG5vdCBhIHZhbGlkIGNoYXJhY3RlcgotCWNvbnN0YW50LgotCi1UdWUgRGVjIDE0IDIxOjM4OjI1IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotb3NmKik6IERvIG5vdCBjb25zaWRlciB0aGlzIGEgZGV2ZWxvcG1lbnRhbAotCWNvbmZpZ3VyYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBjYXNlcyB3aGVyZSBubwotCXJlbG9jYXRpb24gd2lsbCBiZSBlbWl0dGVkIGZvciAzMmJpdCBmb3JtYXRzLgotCi1Nb24gRGVjIDEzIDIzOjMzOjQwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBEbyBub3QgY2FsbCBocHBhX2ZpZWxkX2FkanVzdAotCWZvciBhbnkgb2YgdGhlICdUJyBmaWVsZCBzZWxlY3RvcnMuCi0KLVNhdCBEZWMgMTEgMTE6MjM6MTIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChidWlsZF9ieXRlcyk6IEdldCByZWxvYyB0eXBlIHJpZ2h0IGZvciBhCi0JJXBhZ2Ugb3BlcmF0aW9uLiAobWRfYXNzZW1ibGUpOiBEb24ndCBtb2RpZnkgaW5wdXRfbGluZV9wb2ludGVyLgotCShtZGNvZmZfc2l6ZW1hY2hkZXApOiBOZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaDg1MDAuaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy16OGsuYyAoZ2V0X29wZXJhbmQpOiBEZWxldGUgYm9ndXMgY2hlY2suCi0KLVdlZCBEZWMgIDggMTY6MzE6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChudW1iZXJfdG9fY2hhcnNfKik6IERlbGV0ZSBib2d1cyByYW5nZSBjaGVjay4KLQotCSogb3V0cHV0LWZpbGUuYyAoVEFSR0VUX0FSQ0gpOiBObyBkZWZhdWx0LgotCi1UdWUgRGVjICA3IDE2OjAyOjUzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBUcnVuY2F0ZSBkaXNwcyBiZWZvcmUgY2FsbGluZwotCW1kX251bWJlcl90b19jaGFycy4gIChtZF9hc3NlbWJsZSk6IERvbid0IG1vZGlmeQotCWlucHV0X2xpbmVfcG9pbnRlci4KLQotTW9uIERlYyAgNiAxMTo0OTowMyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCB1cGRhdGUgaW5wdXRfbGluZV9wb2ludGVyLgotCi1Nb24gRGVjICA2IDExOjIwOjAyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5bY2hdIChvYmpfcmVhZF9iZWdpbl9ob29rKTogUmVtb3ZlIGxhc3QgY2hhbmdlLgotCUJyZWFrcyB3aXRoIHRoZSBIUCBjb21waWxlcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHN0cnVjdCBjYWxsX2luZm8pOiBSZW1vdmUgZmllbGRzIHdoaWNoIHdlcmUKLQlzZXQgYnV0IG5ldmVyIHVzZWQuICBSZW1vdmUgYWxsIGNvZGUgd2hpY2ggc2V0cyB0aG9zZSBmaWVsZHMuCi0JKHN0cnVjdCBzdWJzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogTGlrZXdpc2UuCi0JKHN0cnVjdCBzcGFjZV9kaWN0aW9uYXJ5X2NoYWluKTogTGlrZXdpc2UuCi0JKHBhX2Rlc2MpOiBEZWxldGUgdXNlbGVzcyBmdW5jdGlvbi4gIERlbGV0ZSBhbGwgcmVmZXJlbmNlcy4KLQkoaHBwYV90Y19tYWtlX3NlY3Rpb25zKTogTm8gbmVlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgZm9yCi0JdGhlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4KLQotU3VuIERlYyAgNSAxNzowNToyOSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uKTogUGFzcyB2ZXJzaW9uIHN0cmluZyB0bwotCVNPTSBCRkQgYmFja2VuZC4KLQkob2JqX3NvbV9jb3B5cmlnaHQpOiBOZXcgZnVuY3Rpb24uICBNdWNoIGxpa2Ugb2JqX3NvbV92ZXJzaW9uLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChvYmpfY29weXJpZ2h0KTogRGVmaW5lIGFzIGFwcHJvcHJpYXRlIGZvcgotCVNPTSBhbmQgRUxGLgotCShwYV9jb3B5cmlnaHQpOiBKdXN0IGEgc3R1YiBub3cuCi0KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1zb20uaCAob2JqX3JlYWRfYmVnaW5faG9vayk6IFByb3ZpZGUgZHVtbXkgZGVmaW5pdGlvbi4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBEZWxldGUuICBTT00gaXNuJ3QgbWFraW5nIHVzZSBvZiB0aGVtLgotCi0JKiBjb25maWcvdGMtaHBwYS5jICh0Y19nZW5fcmVsb2MsIFNPTSB2ZXJzaW9uKTogSGFuZGxlIHJlbG9jYXRpb24KLQlleHBhbnNpb24gZHVlIHRvIHJvdW5kaW5nIG1vZGUgc2VsZWN0b3JzLiAgSGFuZGxlIFJfW1JEU05dX01PREUKLQlyZWxvY2F0aW9ucyBmb3Igc2VsZWN0aW5nIHRoZSBjdXJyZW50IHJvdW5kaW5nIG1vZGUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGV2YWx1YXRlX2Fic29sdXRlKTogU3VwcG9ydCBlX3Jyc2VsIGFuZAotCWVfcmxzZWwgZmllbGQgc2VsZWN0b3JzLgotCi1GcmkgRGVjICAzIDE4OjMzOjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuaDogSWYgRUNPRkZfREVCVUdHSU5HLCB1bmRlZgotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMgYW5kIElOSVRfU1RBQl9TRUNUSU9OLCBhbmQgZGVmaW5lCi0JT0JKX1BST0NFU1NfU1RBQiB0byBjYWxsIGVjb2ZmX3N0YWIuCi0JKiBjb25maWcvb2JqLWVsZi5jOiBEb24ndCBjb21waWxlIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gaWYKLQlJTklUX1NUQUJfU0VDVElPTiBpcyBub3QgZGVmaW5lZC4KLQotRnJpIERlYyAgMyAxMDo1Njo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4KTogRGVsZXRlIG9sZCB3cmFwcGVyIGZ1bmN0aW9uLgotCShtZF9hcHBseV9maXhfMSk6IFJlbmFtZSB0byBtZF9hcHBseV9maXguICBGaXggYXJndW1lbnQgZGVjbHMuCi0JRml4IGNvbW1lbnRzIGluIHZhcmlvdXMgcGxhY2VzLiAgQWx3YXlzIHJldHVybiBhIHZhbHVlLgotCUF2b2lkIGRlcmVmZXJlbmNpbmcgYSBOVUxMIGZ4X2FkZHN5LgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBBdm9pZCBkZXJlZmVyZW5jaW5nIGEgTlVMTCBmeF9hZGRzeS4KLQotCUZyaSBEZWMgIDMgMDk6NDc6MzAgMTk5MyAgUGV0ZSBIb29nZW5ib29tICAoaG9vZ2VuQGNzLnV0YWguZWR1KQotCi0JKiB0Yy1ocHBhLmM6ICh0Y19nZW5fcmVsb2MpOiBBZGRlbmQgZm9yIGEgcGxhYmVsIHJlbG9jYXRpb24gc2hvdWxkCi0JYmUgZWl0aGVyIDAgb3IgMiAobm8gc3RhdGljIGxpbmsgb3Igc3RhdGljIGxpbmsgcmVxdWlyZWQpLiAgQWx3YXlzCi0JYXNzdW1lIG5vIHN0YXRpYyBsaW5rLgotCi1UaHUgRGVjICAyIDExOjUyOjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodGNfZ2VuX3JlbG9jKTogTWFrZSBhZGp1c3RtZW50IHRvIGFkZGVuZCBiZQotCWRlcGVuZGVudCBvbiBob3d0byBmaWVsZHMsIG5vdCBvbiBmb3JtYXQgZmxhdm91ci4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpOiBOZXcgZmllbGRzIHN5X29iaiBhbmQgc3lfdGMsCi0JZGVmaW5lZCBhcyB0eXBlcyBPQkpfU1lNRklFTERfVFlQRSBhbmQgVENfU1lNRklFTERfVFlQRSwgaWYgdGhvc2UKLQltYWNyb3MgYXJlIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVENfU1lNRklFTERfVFlQRSwgT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUuCi0JKFRBUkdFVF9TWU1CT0xfRklFTERTLCBJOTYwX1NZTV9GSUVMRFMpOiBEb24ndCBkZWZpbmUuCi0JKHN5X3RjLCBzeV9vYmopOiBEZWZpbmUgc28gdGhhdCB0aGUgZmllbGRzIGxvb2sgbGlrZSB0aGV5IHVzZWQgdG8sCi0JdW50aWwgYWxsIHJlZmVyZW5jZXMgZ2V0IGNoYW5nZWQuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBMb3RzIG9mIHZhcmlhYmxlcyBubyBsb25nZXIgcmVnaXN0ZXIuCi0JUmVvcmRlcmVkIHNvbWUgY29kZSBmb3IgZWFzaWVyIHJlYWRpbmcuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGltKTogZGltX2luZGV4IG5vIGxvbmdlciByZWdpc3Rlci4KLQlEZWxldGVkIHN1cGVyZmx1b3VzIHJldHVybiBzdGF0ZW1lbnQuCi0JKG9ial9jb2ZmX2xpbmUsIG9ial9jb2ZmX3NpemUsIG9ial9jb2ZmX3NjbCwgb2JqX2NvZmZfdHlwZSwKLQlvYmpfY29mZl92YWwsIHRhZ19pbml0LCB0YWdfaW5zZXJ0KTogRGVsZXRlZCBzdXBlcmZsdW91cyByZXR1cm4KLQlzdGF0ZW1lbnQuCi0JKGFsaWduLCBvYmpfY29mZl9zZWN0aW9uKTogRGVsZXRlZCBkZWJ1Z2dpbmcgcHJpbnRmcy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2Fzc2VtYmxlKTogRGlzY2FyZCBzb21lIHJlZ2lzdGVyIGRlY2xzLgotCVVzZSBhc3NpZ25tZW50IHJhdGhlciB0aGFuIG1lbWNweSB0byBjb3B5IHRlbXBsYXRlLgotCShvcF9oYXNoLCByZWdfaGFzaCwgcHJlZml4X2hhc2gpOiBEZWZhdWx0IEMgaW5pdGlhbGl6YXRpb24gb2YKLQlzdGF0aWNzIGlzIHN1ZmZpY2llbnQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAocHJpbnRfaW5zbik6IEFycmF5IFJlbG9jIGlzIG5vdyBjb25zdCwgYW5kCi0JcG9pbnRzIHRvIGNvbnN0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVEFSR0VUX0ZPUk1BVCk6IE9ubHkgdXNlIGNvZmYtc3BhcmMtbHlueCBpZgotCVRFX0xZTlg7IHVzZSBjb2ZmLXNwYXJjIG90aGVyd2lzZS4KLQlbVVNFX05BVElWRV9IRUFERVJTXTogRGVsZXRlIHRoaXMgY29kZTsgaXQgaXNuJ3QgdXNlZC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IENhbGwgVENfVkFMSURBVEVfRklYLCBpZiBkZWZpbmVkLAotCWJlZm9yZSBwcm9jZXNzaW5nIGEgZml4dXAuICBDYWxsIFRDX0FESlVTVF9SRUxPQ19DT1VOVCBqdXN0IGJlZm9yZQotCXJldHVybmluZy4gIFJlbW92ZSBzb21lIGk5NjAtY29mZi1zcGVjaWZpYyBjb2RlLgotCShUQ19BREpVU1RfUkVMT0NfQ09VTlQpOiBEZWZhdWx0IHRvIGRvaW5nIG5vdGhpbmcuCi0JKiBjb25maWcvdGMtaTk2MC5oIChUQ19BREpVU1RfUkVMT0NfQ09VTlQpIFtPQkpfQ09GRl06IERlZmluZS4KLQkoaTk2MF92YWxpZGF0ZV9maXgpOiBEZWNsYXJlLgotCShUQ19WQUxJREFURV9GSVgpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTk2MC5jIChpOTYwX3ZhbGlkYXRlX2ZpeCk6IE5ldyBmdW5jdGlvbi4KLQotCSogd3JpdGUuYyAobnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbik6IE5ldyBmdW5jdGlvbi4gIFdyaXRlIG91dAotCWJ5dGVzIGluIGxpdHRsZSBlbmRpYW4gb3JkZXIsIGRvaW5nIHNpemUgYW5kIHJhbmdlIGNoZWNraW5nLgotCShudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuKTogTmV3IGZ1bmN0aW9uLCBzaW1pbGFyLgotCSogd3JpdGUuaDogRGVjbGFyZSB0aGVtLgotCSogY29uZmlnL3RjLSouYyAobWRfbnVtYmVyX3RvX2NoYXJzKTogVXNlIHRoZW0uCi0JKiBjb25maWcvdGMtdmF4LmMgKG1kX2FwcGx5X2ZpeCk6IERpdHRvLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4KTogRGl0dG8uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jOiBSZWFycmFuZ2VkIGNvZGUgZm9yIGhhbmRsaW5nIGxpbmUgbnVtYmVyCi0JZGF0YS4KLQkobGluZV9mc3ltKTogUmVuYW1lZCBmcm9tIGZ1bmN0aW9uX2xpbmVvZmYgaW4gQkZEX0FTU0VNQkxFUiBjYXNlLAotCXNpbmNlIHRoZSB1c2FnZSBpcyBkaWZmZXJlbnQgZnJvbSBub24tQkZEX0FTU0VNQkxFUiBjYXNlLgotCShpbl9mdW5jdGlvbiwgY2xlYXJfZnVuY3Rpb24sIHNldF9mdW5jdGlvbik6IE5ldyBtYWNyb3MsIHRvCi0JY29tYmluZSBzb21lIG9mIHRoZSBmdW5jdGlvbmFsaXR5IGltcGxlbWVudGVkIGluIGRpZmZlcm5ldCB3YXlzIGluCi0JQkZEX0FTU0VNQkxFUiBhbmQgbm9uLS4uLiBjb2RlLiAgVXNlZCBpbiBvdGhlciBmdW5jdGlvbnMgdGhhdCB1c2VkCi0JdG8gY2hlY2sgZnVuY3Rpb25fbGluZW9mZiAmYy4KLQkob2JqX2VtaXRfbGluZW5vKTogU3BsaXQgaW50byB0d28gY29waWVzLCBvbmUgZm9yIEJGRF9BU1NFTUJMRVIsCi0Jb25lIGZvciBub3QuICBOb24tQkZEX0FTU0VNQkxFUiB2ZXJzaW9uIG5vdyBoYXMgdGVtcG9yYXJ5IHZhcmlhYmxlCi0JdG8gY29udGFpbiBjaGFyKiBwb2ludGVyIHBvaW50ZWQgdG8gYnkgY2hhcioqIGFyZ3VtZW50LiAgQWx3YXlzCi0JZm9sbG93IENST1NTX0NPTVBJTEUgY29kZTsgZWFzaWVyIHRvIHJlYWQgdGhhdCB3YXkuCi0JKG9ial9jb2ZmX2xuKTogRG9uJ3QgY2FsbCBhZGRfbGluZW5vIG9yIGNfbGluZV9uZXcgaWYgYXBwbGluZSBpcwotCXNldC4KLQkob2JqX2NvZmZfZW5kZWYpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IKLQkiLmJmIiwgaXQncyBiZWVuIGRvbmUgZWxzZXdoZXJlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogSWYgaWxuZSBudW1iZXIgZGF0YSBpcyBwZW5kaW5nLCBjYWxsCi0JYWRkX2xpbmVzeW0gdG8gZmx1c2ggaXQuCi0JKGNvZmZfZnJvYl9maWxlKTogRG9uJ3QgZG8gdGhhdCBoZXJlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfZnJvYl9maWxlKTogRGVjbGFyZS4KLQkob2JqX2Zyb2JfZmlsZSk6IERlZmluZSwgdG8gY2FsbCBpdC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2NyZWF0ZV9zaG9ydF9qdW1wLCBtZF9jcmVhdGVfbG9uZ19qdW1wLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4OiBEZWZpbmUgdGhlbSBhcyBtYWNyb3MgY2FsbGluZwotCWFzX2ZhdGFsLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IERvbid0IGRlZmluZSB0aGVtIGFzIGZ1bmN0aW9ucy4KLQotCSogY29uZmlndXJlLmluOiBIYW5kbGUgdGFyZ2V0IGFscGhhLSotb3NmKi4gIChObyBjcHUgZmlsZXMgeWV0LikKLQotV2VkIERlYyAgMSAyMzozNzoxNCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUgKGNsZWFuKTogRGVwZW5kIG9uIGNsZWFuLWhlcmUuCi0KLVdlZCBEZWMgIDEgMTE6MzU6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLWdvMzIuaDogSW5jbHVkZSBmb3Blbi1iaW4uaC4KLQkqIGFzLmg6IElmIEZPUEVOX1dCIGlzbid0IGRlZmluZWQsIGluY2x1ZGUgZm9wZW4tc2FtZS5oLgotCSogb3V0cHV0LWZpbGUuYyAob3V0cHV0X2ZpbGVfY3JlYXRlKTogVXNlIEZPUEVOX1dCIGluc3RlYWQgb2YgInciLgotCSogaW5wdXQtZmlsZS5jIChpbnB1dF9maWxlX29wZW4pOiBVc2UgRk9QRU5fUlQgaW5zdGVhZCBvZiAiciIuCi0JKiBsaXN0aW5nLmMgKGZpbGVfaW5mbyk6IFVzZSBGT1BFTl9SQiBpbnN0ZWFkIG9mICJyYiIuCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IFVzZSBGT1BFTl9SVCBpbnN0ZWFkIG9mICJyIi4KLQotCSogc3RhYnMuYzogSW5jbHVkZSBvYnN0YWNrLmguCi0KLQkqIHRjLmggKG1kX2NyZWF0ZV9sb25nX2p1bXApOiBEb24ndCBkZWNsYXJlIGlmIGl0J3MgYWxyZWFkeQotCWRlZmluZWQgYXMgYSBtYWNyby4KLQkobWRfY3JlYXRlX3Nob3J0X2p1bXAsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRGl0dG8uCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3BlcnJvcikgW0JGRF9BU1NFTUJMRVJdOiBVc2UgYmZkX2Vycm1zZyBpbnN0ZWFkCi0Jb2Ygc3RyZXJyb3IuICBDbGVhciBiZmRfZXJyb3IuCi0KLQkqIGNvbmZpZy90ZS1seW54LmggKExPQ0FMX0xBQkVMU19GQik6IERlZmluZSwgaWYgbm90IGFscmVhZHkKLQlkZWZpbmVkLgotCi1XZWQgRGVjICAxIDEwOjQxOjU2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2VsZl9tYXJrX2VuZF9vZl9mdW5jdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkocGFfcHJvY2Vzc19leGl0LCBwYV9wcm9jZW5kKTogQ2FsbCBpdCBmb3IgRUxGIG9iamVjdHMuCi0KLVdlZCBEZWMgIDEgMTI6MTA6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFN1YnRyYWN0IDggZnJvbSBvZmZzZXQgaW4gbm9uIFBJQyBsLmQKLQljYXNlLiAgU2VlIGNvbW1lbnQuICBGcm9tIHdpbHNvbkBjeWdudXMuY29tOiBmb3IgTV9MX0RBQiwgc2V0Ci0JY29wcm9jIGJlZm9yZSBkb2luZyBnb3RvIGxkLgotCi1UdWUgTm92IDMwIDEzOjQwOjMwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB3cml0ZS5jIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogUHJvdmlkZSBhIGRlZmF1bHQgZGVmaW5pdGlvbi4KLQkoZml4dXBfc2VnbWVudCk6IEFsbG93IHRoZSB0YXJnZXQgbWFjaGluZSB0byBzcGVjaWZ5IHRoYXQgYQotCXJlbG9jYXRpb24gbXVzdCBiZSBnZW5lcmF0ZWQgZm9yIGEgcGFydGljdWxhciBmaXh1cC4gIFJlbW92ZQotCSNpZm5kZWYgVENfSFBQQSBoYWNrLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19GT1JDRV9SRUxPQ0FUSU9OKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXhfMSk6IE5ldmVyIGNoYW5nZSBmeF9hZGRzeSB0bwotCWJlIE5VTEwuICBPbmx5IGZpeHVwX3NlZ21lbnQgaXMgc3VwcG9zZWQgdG8gZG8gdGhhdC4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgTm92IDMwIDExOjIxOjQxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0YWJzLm8pOiBBZGRlZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRG9uJ3QgY2FsbCBiZmRfc2V0X3N5bXRhYi4KLQotU3VuIE5vdiAyOCAxMjoxMTo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IE91dHB1dCBhIFRBQiBiZWZvcmUgYW55Ci0JLmFwcCogZGlyZWN0aXZlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBNYWtlIHN1cmUgYSBzdWJfc3ltYm9sCi0JZXhpc3RzIGJlZm9yZSB0cnlpbmcgdG8gcGVlayBhdCBpdHMgbmFtZS4KLQkocGFfc3BhY2UpOiBEbyBub3QgY2FsbCBwYV9hbGlnbl9zdWJzZWcuICBTZWUgaHBwYS91bnNvcnRlZC9hbGlnbjMucwotCWZvciB0ZXN0Y2FzZS4KLQkocGFfYWxpZ25fc3Vic2VnKTogRGVsZXRlIHVudXNlZC91bndhbnRlZCBmdW5jdGlvbi4KLQotU2F0IE5vdiAyNyAyMjo0OTowNyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBGaXggdGVzdCBmb3Igd2hlbiB0byBzdGljayBhIGNvbG9uCi0Jb24gdGhlIGVuZCBvZiBhIGxhYmVsLiAgTWFrZSBjb2RlIGNvbmRpdGlvbmFsIG9uIGVpdGhlciBNUkkgb3IKLQlMQUJFTFNfV0lUSE9VVF9DT0xPTlMuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBJZiBhIGxpbmUgYmVnaW5zIHdpdGggd2hpdGVzcGFjZSwgbGVhdmUKLQl0aGUgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGFsb25lLiAgRWF0IGFsbCBvdGhlcnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKExBQkVMU19XSVRIT1VUX0NPTE9OUyk6IERlZmluZS4KLQotV2VkIE5vdiAyNCAwMToyMjo1NCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcHJvY2VuZCk6IERvIG5vdCBjYWxsIHByb2Nlc3NfZXhpdC4KLQkoZXhpdF9wcm9jZXNzaW5nX2NvbXBsZXRlKTogRGVsZXRlIHVud2FudGVkIHZhcmlhYmxlIGFuZCBhbGwKLQlyZWZlcmVuY2VzLgotCi1XZWQgTm92IDI0IDAyOjMxOjM4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAoZWNvZmZfc2V0dXBfZXh0KTogUmVuYW1lZCBmcm9tIGVjb2ZmX2J1aWxkX2V4dC4KLQlDaGFuZ2VkIHRvIG5vdCBhY3R1YWxseSBidWlsZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uLCBhcwotCXRoYXQgaXMgbm93IGRvbmUgYnkgdGhlIEVDT0ZGIGJhY2sgZW5kLgotCShlY29mZl9idWlsZF9kZWJ1Zyk6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiBlY29mZi5oIChvYmpfZWNvZmZfc2V0X2V4dCk6IERlY2xhcmUuICAgb2JqLWZvcm1hdC5jIGZ1bmN0aW9uCi0JY2FsbGVkIGJ5IGVjb2ZmX3NldHVwX2V4dC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogSWYgZGVidWdfaW5mbyBjb3VudCBpcyAwLAotCXNldCBjb3JyZXNwb25kaW5nIHBvaW50ZXIgdG8gTlVMTC4gIERvbid0IHNldCByYXdfc2l6ZSBhbmQKLQlyYXdfc3ltZW50cy4KLQkob2JqX2Vjb2ZmX3NldF9zeW1faW5kZXgpOiBSZW1vdmVkLgotCShvYmpfZWNvZmZfc2V0X2V4dCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX3NldF9zeW1faW5kZXgpOiBEb24ndCBkZWZpbmUuCi0JKG9ial9lY29mZl9zZXRfc3ltX2luZGV4KTogRG9uJ3QgZGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lY29mZl9zZXRfZXh0LCBlbGZfZ2V0X2V4dHIsCi0JZWxmX3NldF9pbmRleCk6IE5ldyBmdW5jdGlvbnMgdXNlZCBmb3IgRUNPRkZfREVCVUdHSU5HLgotCShlbGZfZnJvYl9maWxlKTogUmV3b3JrZWQgRUNPRkYgZGVidWcgZ2VuZXJhdGlvbiB0byB1c2UKLQluZXcgZnVuY3Rpb25zIGluIGJmZC9lY29mZmxpbmsuYy4KLQotU3VuIE5vdiAyMSAyMzo1NDo1MiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZGVmX3N1YnNwYWNlcyk6IE9ubHkgY3JlYXRlIHRoZSB1bndpbmQKLQlzdWJzcGFjZSBmb3IgRUxGLiAgSW4gdGhlIFNPTSB3b3JsZCwgdGhlIGxpbmtlciBpcyByZXNwb25zaWJsZQotCWZvciBjcmVhdGluZyB0aGUgdW53aW5kIHN1YnNwYWNlcy4KLQotRnJpIE5vdiAxOSAxNjoyNTowOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBVc2UgUEFSQU1TIHJhdGhlciB0aGFuIEVYRlVOLgotCSh5YW5rX3N5bWJvbHMpOiBEb24ndCBjYWxsIFNfU0VUX0VYVEVSTkFMIGlmIHRoZSBzdG9yYWdlIGNsYXNzIGlzCi0JYWxyZWFkeSBzZXQuICBGaXhlcyAuZGVmIHZhcjsgLnZhbCBleHRlcm5hbF92YXI7IC5zY2wgMzsgLmVuZGVmLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlIHJldHVybiB0eXBlLiAgUmVtb3ZlCi0JdW51c2VkIHZhcmlhYmxlcy4KLQotCSogY29uZmlnL3RjLWkzODYuaDogRGVjbGFyZSB0Y19jb2ZmX2ZpeDJydHlwZSBhbmQKLQl0Y19jb2ZmX3NpemVtYWNoZGVwLgotCi1GcmkgTm92IDE5IDA0OjMzOjU5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEaXNhYmxlIG9ial9jaGVja19maWxlX3N5bWJvbHMKLQlob29rOyBvbmx5IGJhY2sgZW5kIHVzaW5nIGl0IHdhc24ndCB1c2luZyBpdCBjb3JyZWN0bHkuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQWx3YXlzIGNhbGwgb2JqX2Zyb2Jfc3ltYm9sIGFuZAotCXRjX2Zyb2Jfc3ltYm9sOyBhbHdheXMgcmV0YWluIHN5bWJvbCBpZiBpdCdzIHVzZWQgYnkgYSByZWxvY2F0aW9uLAotCXJlZ2FyZGxlc3Mgb2Ygd2hhdCB0aGVzZSByb3V0aW5lcyBpbmRpY2F0ZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb2ZmX2Zyb2Jfc3ltYm9sKTogUmVuYW1lZCBmcm9tCi0JY29mZl9jaGVja19maWxlX3N5bWJvbHMuCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2NoZWNrX2ZpbGVfc3ltYm9scyk6IERlbGV0ZWQuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBEZWNsYXJlLgotCShvYmpfZnJvYl9zeW1ib2wpOiBDYWxsIGl0LgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbiwgb2JqX2VtaXRfc3RyaW5ncywKLQlvYmpfcHJlX3dyaXRlX2hvb2spOiBEb24ndCBkZWZpbmUgZm9yIEJGRF9BU1NFTUJMRVIuCi0JKGNfc2VjdGlvbl9oZWFkZXIpOiBEaXR0by4gIERlbGV0ZSBzdXBlcmZsdW91cyByZXR1cm4gYXQgZW5kIG9mCi0JZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIFtUQ19TUEFSQ106IEluY2x1ZGUgY29mZi9zcGFyYy5oLCBhbmQgc3BlY2lmeQotCWNvZmYtc3BhcmMtbHlueC4KLQkoU0FfR0VUX1NZTV9UQUdORFgpOiBVc2UgQkZEX0hFQURFUlMgdmVyc2lvbiBmb3IgQkZEX0FTU0VNQkxFUgotCXRvby4KLQkoY19zZWN0aW9uX2hlYWRlcik6IFJld3JpdGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY29udGFpbnMgbm8KLQlwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZXMuICBEb24ndCBkZWNsYXJlIGl0IGF0IGFsbCBpZgotCUJGRF9BU1NFTUJMRVIuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbHlueG9zKTogTmV3IHRhcmdldCwgdXNpbmcgY29mZiBhbmQKLQlCRkRfQVNTRU1CTEVSLgotCi0JKiBzdGFicy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBMaXN0IGl0LgotCSogcmVhZC5jIChTVEFCX1NFQ1RJT05fTkFNRSwgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FLAotCWdldF9zdGFiX3N0cmluZ19vZmZzZXQsIHNfc3RhYl9nZW5lcmljLCBzX3N0YWIsIHNfeHN0YWIsIHNfZGVzYyk6Ci0JTW92ZWQgdG8gbmV3IGZpbGUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgY29mZiBmaWxlcyBsaWtlIGVsZgotCWZpbGVzLgotCi1XZWQgTm92IDE3IDE3OjIzOjUzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotaXJpeDUqKTogTmV3IHRhcmdldC4gIFVzZSBlbGYgYW5kIG1pcHMtYmlnLgotCSogY29uZmlnL29iai1lbGYuYzogSWYgRUNPRkZfREVCVUdHSU5HLCBpbmNsdWRlIGVjb2ZmLmguCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGRlZmluZSBFQ09GRgotCXBzZXVkby1vcHMuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2spOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGNhbGwKLQllY29mZl9yZWFkX2JlZ2luX2hvb2suCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGNhbGwKLQllY29mZl9zeW1ib2xfbmV3X2hvb2suCi0JKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBDYXN0IGFsbG9jYSByZXN1bHQuCi0JKGVsZl9mcm9iX2ZpbGUpOiBJZiBFQ09GRl9ERUJVR0dJTkcsIGZpbmlzaCB1cCBFQ09GRiBkZWJ1Z2dpbmcKLQlpbmZvcm1hdGlvbiBhbmQgd3JpdGUgaXQgb3V0IGludG8gLm1kZWJ1ZyBzZWN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoRUxGX1RBUkdFVF9TWU1CT0xfRklFTERTKTogTmV3IG1hY3JvLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IFVzZSBFTEZfVEFSR0VUX1NZTUJPTF9GSUVMRFMuCi0JKEVDT0ZGX0RFQlVHR0lORyk6IERlZmluZSBpZiBUQ19NSVBTLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IElmIEVDT0ZGX0RFQlVHR0lORywgb3ZlcnJpZGUgdG8gYWRkCi0JZmllbGRzIHJlcXVpcmVkIGJ5IEVDT0ZGLgotCSogY29uZmlnL3RjLW1pcHMuYzogQ2hlY2sgRUNPRkZfREVCVUdHSU5HIHJhdGhlciB0aGFuCi0JT0JKX0VDT0ZGIGluIG1hbnkgY2FzZXMuCi0JKG1pcHNfYW55X25vcmVvcmRlcik6IE5ldyB2YXJpYWJsZS4KLQkobWlwc19jcHJlc3RvcmVfb2Zmc2V0KTogSW5pdGlhbGl6ZSB0byAtMS4KLQkobWlwc19mcmFtZV9yZWcpOiBOZXcgdmFyaWFibGUuCi0JKFJFTEFYX0VOQ09ERSwgUkVMQVhfT0xELCBSRUxBWF9ORVcsIFJFTEFYX1JFTE9DMSwKLQlSRUxBWF9SRUxPQzIsIFJFTEFYX1JFTE9DMywgUkVMQVhfV0FSTik6IE5ldyBtYWNyb3MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEhhbmRsZSAiZ3B3b3JkIiBhbmQgImNwYWRkIi4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIG9rIHRvIGZhbHNlLiAgSWYgT0JKX0VMRiwgc2V0IGFsaWdubWVudAotCW9mIHRleHQsIGRhdGEgYW5kIGJzcyBzZWN0aW9ucyB0byA0LiAgU2V0IGFsaWdubWVudCBvZgotCS5yZWdpbmZvIHNlY3Rpb24gdG8gMi4gIElmIEVDT0ZGX0RFQlVHR0lORywgY3JlYXRlIC5tZGVidWcKLQlzZWN0aW9uLgotCShBTElHTl9FUlIsIEFMSUdOX0VSUjIpOiBSZW1vdmVkIHVudXNlZCBhbmQgdXNlbGVzcyBhbGlnbm1lbnQKLQljaGVjay4KLQkoYXBwZW5kX2luc24sIG1hY3JvX2J1aWxkLCBtYWNyb19idWlsZF9sdWkpOiBUYWtlIHBsYWNlCi0JYXJndW1lbnQuICBDaGFuZ2VkIGFsbCBjYWxsZXJzLgotCShhcHBlbmRfaW5zbik6IElmIGFwcGVuZGluZyBhIG5vcCwgZG9uJ3QgZW1pdCBvbmUuCi0JKG1hY3JvX2J1aWxkKTogQ2hhbmdlZCBhc3NlcnRpb24gZm9yICdpJywgJ2onLCAnbycgY2FzZS4KLQkoZ3BfcmVmZXJlbmNlKTogUmVtb3ZlZC4KLQkobG9hZF9hZGRyZXNzKTogTmV3IGZ1bmN0aW9uLgotCShtYWNybyk6IElmIG1pcHNfbm9yZW9yZGVyIGlzIHVzZWQsIHNldCBtaXBzX2FueV9ub3Jlb3JkZXIuCi0JRXh0ZW5zaXZlIGNoYW5nZXMgdG8gaGFuZGxlIEdQIGFuZCBQSUMgc3ltYm9scyBkaWZmZXJlbnRseS4KLQlCdWlsZCBib3RoIHBvc3NpYmxlIGNvZGUgY2hvaWNlcyB1c2luZyBhIHZhcmlhbnQgZnJhZywgYW5kCi0JbWFrZSBhIGZpbmFsIGRlY2lzaW9uIGF0IHRoZSBlbmQgb2YgYXNzZW1ibHkgd2hlbiBhbGwKLQlpbmZvcm1hdGlvbiBpcyBrbm93bi4gIEFkZGVkIFBJQyBzdXBwb3J0IGZvciBhbGwgc3ltYm9sCi0JcmVmZXJlbmNlcy4KLQkobWlwc19pcCk6IERvbid0IHBlcm1pdCBhbnl0aGluZyBidXQgYSBudW1iZXIgYWZ0ZXIgJCBmb3IgYQotCWNvcHJvY2Vzc29yIHJlZ2lzdGVyLiAgRG9uJ3QgdXNlIC5saXQ0IG9yIC5saXQ4IHNlY3Rpb25zIHdoZW4KLQlnZW5lcmF0aW5nIFBJQyBjb2RlLiAgSWYgT0JKX0VMRiwgc2V0IGFsaWdubWVudCBvZiAubGl0NCBvcgotCS5saXQ4IHNlY3Rpb24gdG8gNC4KLQkobWRfYXBwbHlfZml4KTogQWNjZXB0IGFuZCBpZ25vcmUgR09UMTYgYW5kIEdQUkVMMzIgcmVsb2NzLgotCShzX2NoYW5nZV9zZWMpOiBTZXQgYWxpZ25tZW50IG9mIEVMRiAucm9kYXRhIG9yIC5zZGF0YSBzZWN0aW9uCi0JdG8gNC4KLQkoc19taXBzc2V0KTogSWYgLnNldCBub3Jlb3JkZXIsIHNldCBtaXBzX2FueV9ub3Jlb3JkZXIuCi0JKHNfY3Bsb2FkKTogSWdub3JlIC5jcGxvYWQgaWYgbm90IGdlbmVyYXRpbmcgUElDIGNvZGUuICBXYXJuCi0JaWYgLmNwbG9hZCBpcyBub3QgaW4gbm9yZW9yZGVyIHNlY3Rpb24uCi0JKHNfY3ByZXN0b3JlKTogSWdub3JlIC5jcHJlc3RvcmUgaWYgbm90IGdlbmVyYXRpbmcgUElDIGNvZGUuCi0JKHNfZ3B3b3JkLCBzX2NwYWRkKTogTmV3IGZ1bmN0aW9ucy4KLQkodGNfZ2V0X3JlZ2lzdGVyKTogQWRkZWQgZnJhbWUgYXJndW1lbnQ7IGlmIHRydWUsIHNldAotCW1pcHNfZnJhbWVfcmVnIHRvIHJldHVybiB2YWx1ZS4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRG9uJ3QgZXJyb3Igb3V0LCBidXQgaW5zdGVhZAotCWRldGVybWluZSBob3cgbXVjaCBhIGZyYWcgc2hvdWxkIGdyb3cuCi0JKHRjX2dlbl9yZWxvYyk6IFJldHVybiBtdWx0aXBsZSByZWxvY3MgaWYgYXBwcm9wcmlhdGUsIGFzCi0JZGV0ZXJtaW5lZCBieSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheC4KLQkobWRfY29udmVydF9mcmFnKTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogU2V0IEVMRiBoZWFkZXIgZmxhZ3MgYmFzZWQgb24KLQltaXBzX2FueV9ub3Jlb3JkZXIgYW5kIG1pcHNfcGljLgotCSogY29uZmlnL3RjLW1pcHMuaCAoUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFKTogRGVmaW5lLgotCShNQVhfUkVMT0NfRVhQQU5TSU9OKTogRGVmaW5lIHRvIGJlIDMuCi0JKG1kX3JlbGF4X2ZyYWcpOiBEZWZpbmUgdG8gYmUgMC4KLQkobWRfY29udmVydF9mcmFnKTogRG9uJ3QgZGVmaW5lLgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBDaGFuZ2VkIGRlY2xhcmF0aW9uLgotCi0JKiBlY29mZi5oLCBlY29mZi5jOiBOZXcgZmlsZXMgcHVsbGVkIG91dCBvZiBjb25maWcvb2JqLWVjb2ZmLmMgdG8KLQlzdXBwb3J0IGdlbmVyYXRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBNSVBTIEVMRgotCXRhcmdldHMuICBDb21waWxlZCBvbmx5IGlmIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLiAgQ2hhbmdlZAotCWhhbmRsaW5nIG9mIGV4dGVybmFsIHN5bWJvbHM6IGl0IG5vdyBhbHdheXMgZ2VuZXJhdGVzIGV4YWN0bHkKLQl0aG9zZSBleHRlcm5hbCBzeW1ib2xzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzeW1ib2wgbGlzdC4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMpOiBBZGRlZCBlY29mZi5jLgotCShSRUFMX0hFQURFUlMpOiBBZGRlZCBlY29mZi5oLgotCShPQkpTKTogQWRkZWQgZWNvZmYuby4KLQkoZWNvZmYubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IEFsbW9zdCBlbnRpcmVseSBtb3ZlZCBpbnRvIGVjb2ZmLmMuCi0JUmVtYWluaW5nIGNvZGUgbW9zdGx5IGp1c3QgY2FsbHMgZWNvZmYuYyBjb2RlLgotCSogY29uZmlnL29iai1lY29mZi5oOiBEZWZpbmUgRUNPRkZfREVCVUdHSU5HLgotCShUQVJHRVRfU1lNQk9MX0ZJRUxEUyk6IE1ha2UgZWNvZmZfc3ltYm9sIGEgcG9pbnRlciB0byBhCi0Jc3RydWN0IGxvY2Fsc3ltLgotCShvYmpfcmVhZF9iZWdpbl9ob29rLCBvYmpfc3ltYm9sX25ld19ob29rKTogRGVmaW5lIHRvIGNhbGwKLQlmdW5jdGlvbnMgaW4gZWNvZmYuYy4KLQkoZWNvZmZfc3RhYik6IERvbid0IGRlY2xhcmUgKG5vdyBkZWNsYXJlZCBpbiBlY29mZi5oKS4KLQkob2JqX3NldF9zeW1faW5kZXgpOiBEZWZpbmUuCi0JKG9ial9lY29mZl9zZXRfc3ltX2luZGV4KTogRGVjbGFyZS4KLQotCSogZnJhZ3MuaCAoZnJhZ19ncm93KTogRGVjbGFyZS4KLQkqIGZyYWdzLmMgKGZyYWdfZ3Jvdyk6IE1hZGUgbm9uLXN0YXRpYy4KLQotCSogd3JpdGUuYyAoaXNfZG5yYW5nZSk6IERvIG5vdCBkZWZpbmUgaWYgbWRfcmVsYXhfZnJhZyBpcyBkZWZpbmVkLgotCShyZWxheF9zZWdtZW50KTogSWYgbWRfcmVsYXhfZnJhZyBpcyBkZWZpbmVkLCB1c2UgaXQgdG8gaGFuZGxlIGEKLQlmcmFnIG9mIHR5cGUgcnNfbWFjaGluZV9kZXBlbmRlbnQgcmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoCi0JbWRfcmVsYXhfdGFibGUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgd2UgZmluZCBhIGJhZCBwc2V1ZG8tb3AsCi0JZG8gYSBjb250aW51ZSB0byBnbyBvbiB0byB0aGUgbmV4dCBsaW5lIHJhdGhlciB0aGFuIGEgYnJlYWsuCi0JUmVtb3ZlZCBkdXBsaWNhdGUgYmFkIHBzZXVkby1vcCBjb2RlIHdoaWNoIHdhcyBuZXZlciBleGVjdXRlZC4KLQotCSogcmVhZC5jIChzX2xjb21tKTogRG8gbm90IHJlcXVpcmUgYSBjb21tYSBhZnRlciB0aGUgbmFtZS4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IENoYW5nZWQgaGFkb25lIGZpZWxkIHRvIGJpdGZpZWxkLgotCUFkZGVkIGJzcyBiaXRmaWVsZC4KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IFNldCBic3MgZmxhZyBmb3IgYnNzX3NlY3Rpb24uCi0JKiByZWFkLmMgKHNfbGNvbW0pOiBTZXQgYnNzIGZsYWcgZm9yIC5zYnNzIHNlY3Rpb24gaWYgdXNlZC4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IERvbid0IHNldCBTRUNfSEFTX0NPTlRFTlRTIGZvciBhCi0JYnNzIHNlY3Rpb24uICBTZXQgU0VDX1JFTE9DIGlmIHRoZXJlIGFyZSBhbnkgcmVsb2NhdGlvbnMsIGV2ZW4gZm9yCi0JYSB6ZXJvIHNpemUgc2VjdGlvbi4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSW4gUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFIGNhc2UsIGJhc2UKLQlkYXRhIG9mZnNldCBvbiByZWxvY1swXS0+YWRkcmVzcyByYXRoZXIgdGhhbiByZWxvY1tqXS0+YWRkcmVzcywgc28KLQl0aGF0IG11bHRpcGxlIHJlbG9jcyBjYW4gYWZmZWN0IGRpZmZlcmVudCBtZW1vcnkgbG9jYXRpb25zLgotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlciwgcmVsYXhfYW5kX3NpemVfc2VnLAotCWFkanVzdF9yZWxvY19zeW1zLCB3cml0ZV9yZWxvY3MpOiBNYWtlIHRoaXJkIGFyZ3VtZW50IFBUUiwgbm90Ci0JY2hhciAqLCB0byBtYXRjaCBkZWZpbml0aW9uIG9mIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IERvbid0IGludGVycHJldCBhIGNvbW1lbnQgY2hhcmFjdGVyCi0JYXMgc3RhcnRpbmcgYSBDUFAgbGluZSBkaXJlY3RpdmUgdW5sZXNzIGl0IGlzIGEgJyMnIGFuZCBpcyB0aGUKLQl2ZXJ5IGZpcnN0IGNoYXJhY3RlcnMgb24gdGhlIGxpbmUgKGkuZS4sIGRvIG5vdCBwZXJtaXQgbGVhZGluZwotCXdoaXRlc3BhY2UpLgotCi0JKiBtZXNzYWdlcy5jIChpZGVudGlmeSk6IE1ha2UgZmlsZSBhcmd1bWVudCBub24tY29uc3QsIHRvIG1hdGNoCi0JY2FsbGVycy4KLQotVHVlIE5vdiAxNiAyMDozODoyMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfaXApOiBGaXggdGhpbmtvIGluIDIxYml0IHJhbmdlIGNoZWNrLgotCi1TYXQgTm92IDEzIDE4OjIyOjQ4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBDb3BlIHdpdGggSU1NMTYgdHlwZSB0b28uCi0JKiBjb25maWcvdGMtejhrLmMgKGJ1aWxkX2J5dGVzLCBtZF9hcHBseV9maXgpOiBVbmRlcnN0YW5kIG5ESVNQNwotCXJlbG9jcy4KLQotRnJpIE5vdiAxMiAxNjo1MTo0NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuW2NoXTogRml4IGFzc29ydGVkIHRyaXZpYWwgaW5kZW50aW9uIHByb2JsZW1zLgotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV92ZXJzaW9uKTogQWRkIG1pc3NpbmcgJzsnLgotCShzb21fZnJvYl9maWxlKTogRGVsZXRlIHdoaXRlc3BhY2UgYXQgRU9MLgotCi1GcmkgTm92IDEyIDE1OjI2OjIxIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFVwZGF0ZWQgZm9sbG93aW5nIDIuMiByZWxlYXNlLgotCi1GcmkgTm92IDEyIDE0OjUyOjE3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBVc2UgYSByZWFsIHR5cGUgZm9yIHRoZQotCWZpZWxkIHNlbGVjdG9yLCByYXRoZXIgdGhhbiBhbiBpbnQuICBBbGwgdXNlcyBvZiBmaWVsZCBzZWxlY3RvcnMKLQlmaXhlZC4KLQkodGNfZ2VuX3JlbG9jKTogRm9yIFNPTSBQTEFCRUxzLCBhbHdheXMgc2V0IGFkZGVuZCB0byB6ZXJvIGZvciBub3cuCi0JKG1kX2FwcGx5X2ZpeF8xKTogRG8gbm90IGNhbGwgaHBwYV9maWVsZF9hZGp1c3QgZm9yIGFueSBQTEFCRUwKLQlmaWVsZC4KLQotCVRodSBOb3YgMTEgMTU6NDk6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3R5cGVfYXJncyk6IEZvciAuaW1wb3J0IHN0YXRlbWVudHMsCi0Jc2lsZW50bHkgaWdub3JlIGF0dGVtcHQgdG8gY2hhbmdlIHRoZSBzeW1ib2wgdHlwZSBmb3IgYSBmdW5jdGlvbgotCWZyb20gU1RfRU5UUlkgdG8gU1RfQ09ERSBvbiAuaW1wb3J0LgotCi1XZWQgTm92IDEwIDE2OjE5OjEzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuaCAoZml4Uyk6IFJlbmFtZSBmeF9jYWxsaiBmaWVsZCB0byBmeF90Y2JpdC4KLQkqIHdyaXRlLmMsIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmZiZmQuYywKLQljb25maWcvdGMtaTk2MC5jOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLVR1ZSBOb3YgIDkgMDA6NDk6MDEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgY29uZmlnLXN0YW1wIGFuZCBjb25maWcuaAotCi0JKiBjb25maWcvdGMtaHBwYS5jIChldmFsdWF0ZV9hYnNvbHV0ZSk6IEF2b2lkIHJlbHlpbmcgb24KLQlBTlNJLUMgZmVhdHVyZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3R5cGVfYXJncyk6IFJlbmFtZWQgZnJvbSBwYV9leHBvcnRfYXJncy4KLQlBY2NlcHQgbmV3IGFyZ3VtZW50ICJpc19leHBvcnQiLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4gIFdoZW4KLQlwcm9jZXNzaW5nIGEgLmV4cG9ydCBkaXJlY3RpdmUgZm9yIGEgZnVuY3Rpb24sIGRvIG5vdCBhbGxvdwotCXRoZSB1c2VyIHRvIHNldCB0aGUgdHlwZSB0byAiQ09ERSIsIGluc3RlYWQgd2FybiBhbmQgc2V0IHRoZQotCXR5cGUgdG8gIkVOVFJZIi4KLQotTW9uIE5vdiAgOCAxMjowNTowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIHByaW50SW5zbik6IEhhbmRsZSAnaycgKGZyb20gVGVkCi0JTGVtb24gPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4pLgotCShtaXBzX2lwKTogUGVybWl0IG9kZCBudW1iZXJlZCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaWYgLW1pcHMzLgotCShtYWNybyk6IFVzZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMIHJlbG9jYXRpb24gZm9yIE1fTElfU1MuCi0KLU1vbiBOb3YgIDggMDc6NDU6MDEgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZW1vdmUgaDgzMDBoLCB3ZSBoYXZlIG11bHRpbGliIG5vdy4KLQotTW9uIE5vdiAgOCAwNjowOToxOCAxOTkzICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFN1cHBvcnQgZ2VuZXJpYyBuZXR3YXJlIGFzIGJlaW5nIEVMRiBmb3JtYXQuCi0JCQlSZWNvZ25pc2UgdW5peHdhcmUgaWYgdGhlIHVzZXIgc3VwcGxpZXMgaXQuCi0KLVN1biBOb3YgIDcgMDE6MDI6MDggMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIEZpcnN0IGN1dCBhdCBjbGVhbmluZyB1cCBQQSBpbnN0cnVjdGlvbiBwYXJzaW5nLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBBY2NlcHQgcG9pbnRlciB0bwotCWluc24gc3RydWN0dXJlIGFzIGFuIGFyZ3VtZW50LCBhbmQgYSBwb2ludGVyIHRvIGEgc3RyaW5nLiAgQWxsCi0JY2FsbGVycyBjaGFuZ2VkLiAgQWx3YXlzIHJlYWQgYW55IGZpZWxkIHNlbGVjdG9yIGhlcmUuICBDYWxsCi0JZXZhbHVhdGUgYWJzb2x1dGUgdG8gZ2V0IGEgcmV0dXJuIHZhbHVlLgotCShldmFsdWF0ZV9hYnNvbHV0ZSk6IEFkZGVwdCBwb2ludGVyIHRvIGluc24gc3RydWN0dXJlIGFzIGl0cwotCWFyZ3VtZW50LiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkoSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSk6IE5ldyBtYWNybyBmb3IgaW5zZXJ0aW5nIGEgYml0ZmllbGQKLQlpbnRvIGFuIGluc3RydWN0aW9uIGFuZCBjb250aW51aW5nIHRoZSBtYWluIHBhX2lwIGxvb3AuCi0JKENIRUNLX0ZJRUxEKTogTmV3IG1hY3JvIGZvciBzaW1wbGUgcmFuZ2UgY2hlY2tpbmcgb2YgZmllbGRzLgotCShwYV9pcCk6IERlbGV0ZSB1bnVzZWQgdmFyaWFibGVzLiAgVXNlIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUKLQlhbmQgQ0hFQ0tfRklFTEQuICBBbGwgaW1tZWRpYXRlIGZpZWxkcyBub3cgcGFzcyB0aHJvdWdoCi0JcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gd2hpY2ggd2lsbCBhbHNvIGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuCi0JRGVsZXRlIGRlYWQgY29kZS4gIFNpbXBsaWZ5LgotCShtZF9hcHBseV9maXhfMSk6IFVzZSBDSEVDS19GSUVMRCB0byB2ZXJpZnkgYW55IGZpeGVzIHRoYXQgYXJlCi0JYXBwbGllZCBhcmUgaW4gcmFuZ2UuICBVc2UgYmZkX3B1dF8zMiByYXRoZXIgdGhhbiBpbnNlcnRpbmcgZWFjaAotCWJ5dGUgb2YgdGhlIGZpeGVkIGluc3RydXRpb24gaW50byB0aGUgYnVmZmVyIG91cnNlbHZlcy4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERlbGV0ZSB7U0VHLEdMT0JBTH1fRElGRl9BTExPV0VEIGNvZGUsCi0JaXQgd2FzIFBBIHNwZWNpZmljIGFuZCBpcyBubyBsb25nZXIgbmVlZGVkIChpdCdzIG5vdyBoYW5kbGVkCi0Jd2l0aGluIHRoZSBQQSBiYWNrZW5kKS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFNFR19ESUZGX0FMTE9XRUQpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IElmIHRoZSBzdWJ0cmFjdCBzeW1ib2wgZm9yCi0JYSBmaXh1cCBpcyAkZ2xvYmFsJCBjaGFuZ2UgaXQgdG8gTlVMTCBhcyAkZ2xvYmFsJCBpcyByZWFsbHkgb25seQotCW5lZWRlZCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgdGhlIGJhc2UgdHlwZSBvZiByZWxvY2F0aW9uIHRvIHVzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY3JlYXRlX25ld19zdWJzcGFjZSk6IEluaXRpYWxpemUgc3Vic3BhY2VfZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGEtaXAsIGNhc2UgJ3onKTogTWFrZSBmaWVsZCBzZWxlY3RvcnMgd29yawotCWZvciAneicgb3BlcmFuZHMgKHRhcmdldCBvZiBibGUgYnJhbmNoKS4KLQotU2F0IE5vdiAgNiAyMjo0MTo1NyAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogKHVwZGF0ZV9zdWJzcGFjZSk6IEZpeCB0eXBlIGFuZCBuYW1lIG9mIGxhc3QKLQlwYXJhbWV0ZXIuICBBbGwgY2FsbGVycyBmaXhlZC4KLQkobWRfYmVnaW4sIHBhX2Noa19maWVsZF9zZWxlY3RvciwgcGFfZW50cnkpOiBMaW50LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChjb25zX2ZpeF9uZXdfaHBwYSk6IFJlc2V0IGZpZWxkIHNlbGVjdG9yCi0JdG8gZGVmYXVsdCBzdGF0ZSBhZnRlciBpdCdzIGJlZW4gdXNlZC4KLQotRnJpIE5vdiAgNSAxMjowODoyMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL29iai1zb20uYyAob2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbik6IENoYW5nZQotCXNwYWNlL3N1YnNwYWNlIHNvcnQga2V5cyBmb3IgdGhlIHN0YWIgc2VjdGlvbnMgc28gYXMgdG8gYXZvaWQKLQlidWdzIGluIHRoZSBocCBsaW5rZXIgYW5kIHB4ZGIuCi0KLVRodSBOb3YgIDQgMTc6MDA6MDUgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHdyaXRlLmMgKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyKTogVXBkYXRlIHBvaW50ZXIgdG8gbGFzdAotCWZyYWcgZm9yIGEgc2VnbWVudCBpbiB0aGUgc2VnaW5mbyBzdHJ1Y3R1cmUuCi0KLVRodSBOb3YgMDQgMDk6MDk6MzUgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogIE1ha2VmaWxlLmluOiBDaGFuZ2VkIFJVTlRFU1RGTEFHUyB0byBSVU5URVNUX0ZMQUdTCi0KLVdlZCBOb3YgIDMgMTI6MTY6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBIYW5kbGUgY29udmVyc2lvbiBvZiBzdWJ0cmFjdGlvbiB0bwotCXBjLXJlbGF0aXZlIGFkZHJlc3NpbmcgZXZlbiBpZiBwYy1yZWxhdGl2ZSBmbGFnIGlzIGFscmVhZHkgc2V0LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogVXNlIHN0cmNociwgbm90IGluZGV4LiAgRG9uJ3QKLQlkZWNsYXJlIGVpdGhlci4KLQotCSogZG9jL01ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEZWxldGUgaW50ZXJtZWRpYXRlIGZpbGVzIGZyb20gZHZpCi0JYnVpbGQsIGJ1dCBub3QgdGhlIGR2aSBvciBpbmZvIGZpbGVzLgotCSogTWFrZWZpbGUuaW4gKGNsZWFuLWhlcmUpOiBOZXcgdGFyZ2V0OyBjbGVhbnMgdXAgY3VycmVudAotCWRpcmVjdG9yeSBvbmx5LgotCShkaXN0Y2xlYW4pOiBVc2UgaXQgaW5zdGVhZCBvZiBjbGVhbi4KLQotCSogcmVhZC5jIChzX3hzdGFiKTogRG9uJ3QgdXNlIGFsbG9jYS4KLQotCSogbWVzc2FnZXMuYyAoaWRlbnRpZnkpOiBOZXcgcm91dGluZTsgcHJpbnQgbWVzc2FnZSBpZGVudGlmeWluZwotCWZvbGxvd2luZyBtZXNzYWdlcyBhcyBjb21pbmcgZnJvbSBhc3NlbWJsZXIuCi0JKGFzX3Nob3dfd2hlcmUsIGFzX2JhZF9pbnRlcm5hbCwgYXNfYmFkX3doZXJlKTogQ2FsbCBpdC4KLQkoYXNfZmF0YWwpOiBEb24ndCBuZWVkIHRvIGlkZW50aWZ5IHByb2dyYW0gYW55IG1vcmUuCi0KLVR1ZSBOb3YgIDIgMTg6MDQ6MTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBBZGQgZGVmYXVsdCBjYXNlIHRvIHJlbG9jIHN3aXRjaC4KLQotCSogcmVhZC5jIChzX2xjb21tKTogUHV0IHNtYWxsIG9iamVjdHMgaW4gLnNic3MgZm9yIE1JUFMgRUxGIGFzCi0Jd2VsbCBhcyBNSVBTIEVDT0ZGLgotCShnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0KTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBhbGlnbmVkLgotCi1UdWUgTm92ICAyIDE1OjA3OjA3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiB0Yy1ocHBhLmM6IEFkZCAlZHAgYW5kICVycCBhcyBzeW5vbnltcyBmb3IgJXIyNyBhbmQgJXIyIGluIHRoZQotCXByZWRlZmluZWQgcmVnaXN0ZXIgdGFibGUuCi0JKHBhX3BhcnNlX251bWJlcik6IEhhbmRsZSAlcnAgaW4gY29tbW9uIHJlZ2lzdGVyIHNob3J0Y3V0IGNvZGUuCi0JQ29uc2lzdGVudGx5IHNldCByZXR1cm4gdmFsdWUgdG8gLTEgZm9yIGFuIGVycm9yLiAgQ2xlYW4gdXAgZXJyb3IKLQltZXNzYWdlcyBhbmQgb25seSBwcmludCB0aGVtIHdoZW4gInByaW50X2Vycm9ycyIgaXMgdHJ1ZS4gIEhhbmRsZQotCWVtcHR5IHN0cmluZyBjYXNlIGxpa2UgdGhlIEhQIGFzc2VtYmxlciAtLSBhc3N1bWUgYSB2YWx1ZSBvZgotCXplcm8uCi0KLQkqIGNvbmZpZy9oby1ocHV4Lmg6IERvIG5vdCBpbmNsdWRlIGhvLXN5c3YuaC4gIEluc3RlYWQgaW5jbHVkZQotCXN0YW5kYXJkIGhwdXggaW5jbHVkZSBmaWxlcyB0byBwaWNrIHVwIHZhcmlvdXMgZnVuY3Rpb24gZGVjbHMuCi0KLQkqIGNvbmZpZy9oby1ocHBhb3NmLmg6IERlbGV0ZSBfSU8qIG1hY3Jvcy4gIFRoZXkgYXJlIGRlZmluZWQgaW4KLQlzdGRpby5oLiAgRGVsZXRlIGJvZ3VzIGRlY2xhcmF0aW9uIG9mIGZyZWUuICBHZXQgcGF0aCB0bwotCWFsbG9jYS1jb25mLmggcmlnaHQuCi0KLVR1ZSBOb3YgIDIgMTM6NTc6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEZpeCBjaGVja3MgZm9yIGNoYXJhY3RlcnMgZm9sbG93aW5nICIwYiIgb3IKLQkiMGYiLgotCi1Nb24gTm92ICAxIDIxOjM3OjA0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvb2JqLXNvbS5oIChvYmpfYXR0YWNoX3Vud2luZF9pbmZvKTogRGVmaW5lIGFzIGEgaG9vawotCXNvIEdBUyBjYW4gYXR0YWNoIHVud2luZCBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIHRvIGEgQkZEIHN5bWJvbC4KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGZpeF9uZXdfaHBwYSk6IElmIG5lY2Vzc2FyeSBhdHRhY2ggdW53aW5kCi0JZGVzY3JpcHRvciBpbmZvcm1hdGlvbiB0byB0aGUgQkZEIHN5bWJvbC4KLQkobWRfYXBwbHlfZml4KTogUl9IUFBBX0VOVFJZIGFuZCBSX0hQUEFfRVhJVCBjYW4gbmV2ZXIgYmUgImFwcGxpZWQiLAotCXRoZXkgYXJlIHNpbXBseSBtYXJrZXJzLiAgTWFrZSBSX0hQUEFfVU5XSU5EXyogaGFuZGxpbmcgT0JKX0VMRgotCWRlcGVuZGVudC4KLQkocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogV2hvbGUgZnVuY3Rpb24gaXMgT0JKX0VMRiBkZXBlbmRlbnQuCi0JKHBhX2VudHJ5KTogQnVpbGQgYSBSX0hQUEFfRU5UUlkgcmVsb2NhdGlvbiB3aGVuIGNvbmZpZ3VyZWQgZm9yIFNPTS4KLQkocGFfZXhpdCk6IExpa2V3aXNlLCBidXQgYnVpbHQgYSBSX0hQUEFfRVhJVCByZWxvY2F0aW9uLiAgRG8gbm90Ci0JYnVpbGQgImVuZC1vZi1mdW5jdGlvbiIgc3ltYm9scyBmb3IgU09NLCB0aGV5IGFyZSBub3QgbmVlZGVkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwcm9jZXNzX2V4aXQpOiBDcmVhdGUgdGVtcG9yYXJ5IHN5bWJvbHMgd2l0aAotCWNvcnJlY3QgcHJlZml4ZXMgc28gdGhleSBjYW4gYmUgZWxpbWluYXRlZCBsYXRlci4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoY2FsbF9pbmZvIHN0cnVjdCk6IERlbGV0ZSB1bnVzZWQgImZyYW1lIiBmaWVsZC4KLQkocGFfY2FsbGluZm8pOiBJbnNlcnQgZnJhbWVzaXplIGludG8gdGhlIHVud2luZCBpbmZvcm1hdGlvbiBhcwotCXNvb24gYXMgaXQncyBhdmFpbGFibGUuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IERvIG5vdCBpbnNlcnQgZnJhbWVzaXplIGludG8gdGhlIHVud2luZAotCWluZm9ybWF0aW9uIGhlcmUuCi0KLQkqIEFkZCBzdXBwb3J0IGZvciBtYXJrZXIgdHlwZSByZWxvY2F0aW9ucy4gIFRoZXNlIG1hcmsgYXJlYXMKLQlvZiBpbnRlcmVzdCB0byB0aGUgbGlua2VyLiAgRU5UUlkvRVhJVCByZWxvY2F0aW9ucyBmb3IgU09NIGFyZQotCWFuIGV4YW1wbGUgb2YgbWFya2VyIHJlbG9jYXRpb25zLgotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogSW5zdGVhZCBvZiBhc3N1bWluZyBzaXplIG9mIGEgcmVsb2NhdGlvbgotCWlzIDQgYnl0ZXMsIHBpY2sgdXAgdGhlIHNpemUgZnJvbSByZWxvY2F0aW9uIGl0c2VsZi4KLQkoZml4dXBfc2VnbWVudCk6IERvIG5vdCBjb21wbGFpbiB0aGF0IGEgdmFsdWUgaXMgdG9vIHNtYWxsIGZvcgotCW1hcmtlciByZWxvY2F0aW9ucy4KLQotCSogc3RydWMtc3ltYm9sLmg6IEFkZCBuZXcgInN5X3VzZWQiIGZpZWxkIHRvIHRoZSBzeW1ib2wgc3RydWN0dXJlLgotCSogZXhwci5jIChvcGVyYW5kKTogU2V0IHN5X3VzZWQgZm9yIGFueSBzeW1ib2wgdXNlZCBhcyBhbiBvcGVyYW5kLgotCShleHByKTogTGlrZXdpc2UgZm9yIGFueSBzeW1ib2wgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZnJvYl9zeW1ib2wpOiBEZWZpbmUuICBQdW50IGltcG9ydGVkCi0Jc3ltYm9scyB3aGljaCBhcmUgbmV2ZXIgdXNlZCBhbmQgYWJzb2x1dGUgc3ltYm9scyB3aGljaCBsb2NhbCBzY29wZS4KLQotCSogY29uZmlnL29iai1zb20uaCAob2JqX2Zyb2JfZmlsZSk6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotc29tLmMgKG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24pOiBTZXQgYWxpZ25tZW50Ci0Jb2Ygc3RhYiBzZWN0aW9ucy4gIE1ha2Ugc3BhY2UgZm9yIHRoZSBzcGVjaWFsIHN0YWIgZW50cnkuCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogQWRqdXN0IHRoZSBzcGVjaWFsIGVudHJ5IGluIHRoZQotCXN0YWJzIHNlY3Rpb24uCi0JKHNvbV9mcm9iX2ZpbGUpOiBOZXcgZnVuY3Rpb24uICBTaW1wbHkgY2FsbHMgYWRqdXN0X3N0YWJfc2VjdGlvbnMKLQlmb3IgZWFjaCBzZWN0aW9uLgotCi1Nb24gTm92ICAxIDE3OjU0OjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoUElDX0NBTExfUkVHLCBTUCwgRlApOiBEZWZpbmUuCi0JKG1pcHNfcGljLCBtaXBzX2NwcmVzdG9yZV9vZmZzZXQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkobWRfcHNldWRvX3RhYmxlKTogSGFuZGxlIC5hYmljYWxscywgLmNwbG9hZCwgYW5kIC5jcHJlc3RvcmUuCi0JSWdub3JlIC5iZ25iIGFuZCAuZW5kYi4KLQkoZ3BfcmVmZXJlbmNlKTogX2dwX2Rpc3AgaXMgbmV2ZXIgYWRkcmVzc2VkIG9mZiBHUC4KLQkobWFjcm9fYnVpbGQpOiBJZ25vcmUgbWFjcm9zIHdoaWxlIHNlYXJjaGluZyBmb3IgaW5zbi4gIEZvciBjYXNlcwotCWksIGosIGFuZCBvLCBhY2NlcHQgdGhlIHJlbG9jIHR5cGUgYXMgYW4gYXJndW1lbnQgcmF0aGVyIHRoYW4KLQlhc3N1bWluZyBCRkRfUkVMT0NfTE8xNi4gIERvbid0IHRyeSB0byBjb252ZXJ0IEJGRF9SRUxPQ19MTzE2IHRvCi0JQkZEX1JFTE9DX01JUFNfR1BSRUwuICBBZGRlZCBuZXcgY2FzZSBhLgotCShzZXRfYXQsIGxvYWRfcmVnaXN0ZXIsIG1hY3JvKTogQ2hhbmdlZCBjYWxscyB0byBtYWNyb19idWlsZCB0bwotCXBhc3MgbmV3IGFyZ3VtZW50IGZvciBpLCBqIGFuZCBvIGNhc2VzLgotCShtYWNybyk6IEhhbmRsZSBNX0pBTF8xLCBNX0pBTF8yIGFuZCBNX0pBTF9BLiAgVGhlc2UgcmVxdWlyZQotCXNwZWNpYWwgaGFuZGxpbmcgd2hlbiBnZW5lcmF0aW5nIFNWUjQgUElDIGNvZGUuCi0JKG1pcHNfaXAsIHRjX2dldF9yZWdpc3Rlciwgc19mcmFtZSk6IFVzZSBtYWNyb3MgRlAsIFNQLCBHUCBhbmQgQVQKLQlyYXRoZXIgdGhhbiBoYXJkIGNvZGVkIGNvbnN0YW50cy4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwgYW5kCi0JQkZEX1JFTE9DX01JUFNfQ0FMTDE2LgotCShzX29wdGlvbik6IFNldCBtaXBzX3BpYyBiYXNlZCBvbiAub3B0aW9uIHBpY04uCi0JKHNfYWJpY2FsbHMpOiBOZXcgZnVuY3Rpb247IHNldCBtaXBzX3BpYyB0byAyLgotCShzX2NwbG9hZCk6IE5ldyBmdW5jdGlvbjsgaGFuZGxlIC5jcGxvYWQuCi0JKHNfY3ByZXN0b3JlKTogTmV3IGZ1bmN0aW9uOyBoYW5kbGUgLmNwcmVzdG9yZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogQWRkIGVudHJpZXMgZm9yIC5iZ25iLAotCS5lbmRiIGFuZCAudmVyc3RhbXAsIHNldHRpbmcgdGhlbSB0byBzX2lnbm9yZS4KLQotU3VuIE9jdCAzMSAwMDozNjo0MCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbik6IEFkZCBuZXcgc3NkX2RlZmluZWQKLQlmaWVsZC4gIERlZmluZSBTVUJTUEFDRV9ERUZJTkVEIGFjY2Vzc29yIG1hY3JvLgotCShwYV9zdWJzcGFjZSk6IEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgc3Vic3BhY2UgYXR0cmlidXRlcyBmb3IKLQlidWlsdC1pbiBzdWJzcGFjZXMuICBTZXQgc3NkX2RlZmluZWQgYXQgdGhlIGVuZCBvZiBmY24gLS0gdGhhdAotCXdheSB0aGUgYXR0cmlidXRlcyBjYW4gb25seSBiZSBjaGFuZ2VkIG9uY2UuICBQYXNzIG5ld2x5IGFsbG9jYXRlZAotCW5hbWUgdG8gaXNfZGVmaW5lZF9zdWJzcGFjZSwgbm90IGEgcG9pbnRlciB0byB0aGUgaW5wdXQgbGluZS4KLQlGaXggdHlwbyBpbiBzcGFjZS9zdWJzcGFjZSByZXdvcmsuCi0JKGlzX2RlZmluZWRfc3Vic3BhY2UpOiBEZWxldGUgdW51c2VkIDJuZCBhcmcuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9pbXBvcnQpOiBJZiBjdXJyZW50bHkgaW4gdGhlIHRleHQgc2VnbWVudAotCWFuZCBhIHN5bWJvbCBpcyBpbXBvcnRlZCB3aXRob3V0IHR5cGUgaW5mb3JtYXRpb24sIHNldCBCU0ZfRlVOQ1RJT04KLQlmb3IgdGhlIHN5bWJvbC4KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZyk6IENvcnJlY3QgdGVzdCB0byBkZXRlcm1pbmUgaWYKLQl0aGUgc2VjdGlvbidzIHNpemUgd2FzIHJvdW5kZWQgdXAuCi0KLQkqIGNvbmZpZy9vYmotc29tLmggKG9ial9zZXRfc3ltYm9sX3R5cGUpOiBEZWZpbmUgYSBob29rIHNvIEdBUwotCWNhbiBwcm9wZXJseSBzZXQgYWxsIHRoZSBTT00gc3ltYm9sIHR5cGVzLgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3ltYm9sX3R5cGUpOiBOZXcgZW51bSB0byByZXByZXNlbnQgdGhlCi0Jc3ltYm9sIHR5cGVzIHdoaWNoIGNhbiBiZSBzZXQgZnJvbSBhbiBJTVBPUlQvRVhQT1JUIHN0YXRlbWVudC4KLQkocGFfZXhwb3J0X2FyZ3MpOiBTZXQgdGhlIHBhX3N5bWJvbF90eXBlIHR5cGUgYmFzZWQgb24gYXJndW1lbnRzLgotCUlmIGRlZmluZWQsIGNhbGwgb2JqX3NldF9zeW1ib2xfdHlwZSB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gb24KLQl0byB0aGUgQkZEIGJhY2tlbmQuCi0KLQkqIHJlYWQuYyAoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFNldCBTRUNfREVCVUdHSU5HIGZvciBhbnkKLQlzdGFiIHNlY3Rpb24gd2UgbWFrZS4KLQkoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KLQotU2F0IE9jdCAzMCAxNDoyNjoyMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIHZhbHVlIG9mIHRoZSBmYWtlIGxhYmVsLgotCSogd3JpdGUuaCAoTE9DQUxfTEFCRUwpOiBEZWxldGUgRE9UX0xBQkVMX1BSRUZJWCBjb2RlLiAgSW5zdGVhZAotCWFzc3VtZSBiYWNrZW5kcyB3aWxsIGRlZmluZSBMT0NBTF9MQUJFTCBpZiBhbnl0aGluZyBvdGhlciB0aGFuCi0JJ0wnIGlzIHVzZWQgdG8gZGVub3RlIGEgbG9jYWwgbGFiZWwuCi0JKEZBS0VfTEFCRUxfTkFNRSk6IE5ldyBtYWNyby4gIERlZmluZXMgdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGZvcgotCXRoZSAiZmFrZSIgbGFiZWwuCi0JKiBleHByLmMgKG1ha2VfZXhwcl9zeW1ib2wpOiBEZWxldGUgRE9UX0xBQkVMX1BSRUZJWCBjb2RlCi0JYW5kIGluc3RlYWQgc2ltcGx5IHVzZSB0aGUgc3RyaW5nIGRlZmluZWQgYnkgRkFLRV9MQUJFTF9OQU1FLgotCShvcGVyYW5kKTogTGlrZXdpc2UuCi0JKiByZWFkLmMgKHNfc3RhYl9nZW5lcmljKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaHBwYS5oIChGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgYXMgTCQwXDAwMSBzbyBpdCdzCi0Ja25vd24gdG8gYmUgYSBsb2NhbCBsYWJlbC4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKERPVF9MQUJFTF9QUkVGSVgpOiBEZWxldGUuCi0JKExPQ0FMX0xBQkVMLCBGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTY4ay5oIChET1RfTEFCRUxfUFJFRklYKTogRGVsZXRlLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChET1RfTEFCRUxfUFJFRklYKTogRGVsZXRlLgotCShMT0NBTF9MQUJFTCwgRkFLRV9MQUJFTF9OQU1FKTogRGVmaW5lLgotCi0JUmV3b3JrIHNwYWNlL3N1YnNwYWNlIGhhbmRsaW5nIGluIFBBIGNvZGUgdG8gZnVsbHkgc3VwcG9ydAotCVNPTSBzcGFjZXMvc3Vic3BhY2VzLgotCSogY29uZmlnL3RjLWhwcGEuYyAoVVNFX0FMSUFTRVMpOiBOZXcgb2JqZWN0LWZvcm1hdCBkZXBlbmRlbnQgZGVmaW5lCi0JdG8gY29udHJvbCB0aGUgdXNlIG9mIHNwYWNlL3N1YnNwYWNlIG5hbWUgYWxpYXNlcy4KLQkodXBkYXRlX3N1YnNwYWNlKTogQWNjZXB0IHNwYWNlIGNoYWluIGVudHJ5IGZvciBjb250YWluaW5nIHNwYWNlCi0JYXMgYSBuZXcgcGFyYW1ldGVyLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQkocGFfZ2V0X2xhYmVsKTogVXNlIGN1cnJlbnRfc3BhY2UgcmF0aGVyIHRoYW4gcGFfc2VnbWVudF90b19zcGFjZS4KLQkocGFfZGVmaW5lX2xhYmVsKTogTGlrZXdpc2UuCi0JKHBhX3VuZGVmaW5lX2xhYmVsKTogTGlrZXdpc2UuCi0JKG1kX2JlZ2luKTogQ2hhbmdlIGludG8gdGhlIChwb3NzaWJseSBtb2RpZmllZCkgdGV4dF9zZWN0aW9uLgotCShwYV9wYXJzZV9zcGFjZV9zdG10KTogQ3JlYXRlIGEgbmV3IHNlZ21lbnQvc3BhY2UgaWYgY3JlYXRlX2ZsYWcKLQlpcyB0cnVlLCBhbmQgdGhlIHNwYWNlIG5hbWUgaXMgbm90IG9uZSBvZiB0aGUgdHdvIHByZWRlZmluZWQgc3BhY2VzLgotCShwYV9zdWJzcGFjZSk6IFVzZSBjdXJyZW50X3NwYWNlIHJhdGhlciB0aGFuIGEgbG9va3VwIHZpYQotCXBhX3NlZ21lbnRfdG9fc3BhY2UuICBSZXNldCBCRkQgc2VjdGlvbiBmbGFncyBhcyByZXF1aXJlZCBieQotCXRoZSAuc3Vic3BhY2UgZGlyZWN0aXZlLiAgTGlrZXdpc2UgZm9yIHRoZSBzZWN0aW9uIGFsaWdubWVudC4KLQlQYXNzIHRoZSBjdXJyZW50IHNwYWNlIHRvIHVwZGF0ZV9zdWJzcGFjZSBhbmQgY3JlYXRlX25ld19zdWJzcGFjZS4KLQkocGFfc3BhY2VzX2JlZ2luKTogT25seSB1c2Ugc3BhY2Uvc3Vic3BhY2UgYWxpYXNlcyBpZiBVU0VfQUxJQVNFUwotCWlzIHRydWUuICBXaGVuIG5vdCB1c2luZyBhbGlhc2VzLCBjcmVhdGUgYSBCRkQgc2VjdGlvbiBmb3IgZWFjaAotCXN1YnNwYWNlIGVuY291bnRlcmVkLiAgV2hlbiBub3QgdXNpbmcgYWxpYXNlcyByZXBsYWNlIHRoZSBkZWZhdWx0Ci0JdGV4dCwgZGF0YSwgYW5kIGJzcyBzZWdtZW50cyB3aXRoIG5ldyBvbmVzLgotCShjcmVhdGVfbmV3X3N1YnNwYWNlKTogV2hlbiBub3QgdXNpbmcgYWxpYXNlcyBlYWNoIHN1YnNwYWNlIGhhcyBhCi0Jc2VjdGlvbi9zZWdtZW50IGFuZCBzdWJzZWdtZW50cyBhcmUgbm90IG5lZWRlZCwgc28gc2V0IHRoZSBzdWJzZWdtZW50Ci0JdG8gemVyby4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IElmIG5lZWRlZCwgY2FsbAotCW9ial9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzIHRvIHBhc3Mgc3BhY2UgYXR0cmlidXRlcyB0byB0aGUKLQlCRkQgYmFja2VuZC4KLQkoY3JlYXRlX25ld19zcGFjZSk6IExpa2V3aXNlLgotCShjcmVhdGVfbmV3X3N1YnNwYWNlKTogTGlrZXdpc2UgZm9yIHN1YnNwYWNlIGF0dHJpYnV0ZXMgdXNpbmcKLQlvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcy4KLQkodXBkYXRlX3N1YnNwYWNlKTogTGlrZXdpc2UgZm9yIHN1YnNwYWNlIGF0dHJpYnV0ZXMgdXNpbmcKLQlvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IEdldCBzZWdtZW50IGFuZCBzb3J0IGtleQotCWZvciAkVEVYVCQgYW5kICRQUklWQVRFJCBmcm9tIHRoZSBkZWZhdWx0IHNwYWNlIHN0cnVjdHVyZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfZXhwb3J0X2FyZ3MpOiBBbHdheXMgc2V0IEJTRl9GVU5DVElPTgotCWFzIGFwcHJvcHJpYXRlIGZvciB0aGUgZ2l2ZW4gdHlwZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogUHJlbGltaW5hcnkgc3RhYiBhdCBoYW5kbGluZwotCVNPTSByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfY29tbSk6IERlbGV0ZSBpbmNvcnJlY3QgY2hlY2sgZm9yIHN5bWJvbAotCXJlZGVmaW5pdGlvbi4KLQotCSogY29uZmlnL29iai1zb20uW2NoXTogTmV3IGZpbGVzIGZvciBTT00gc3VwcG9ydC4gIE5vdGUgU09NCi0Jc3VwcG9ydCBpcyBub3QgeWV0IGNvbXBsZXRlIGluIEdBUyBvciBCRkQuCi0KLQkqIGNvbmZpZy9oby1ocHBhYnNkLmg6ICBEZWxldGUgSU8qIG1hY3JvcywgdGhleSBhcmUgZGVmaW5lZCBpbgotCXN0ZGlvLmguICBEZWxldGUgZGVjbGFyYXRpb24gb2YgZnJlZS4gIEluY2x1ZGUgc3RkbGliLmgsIHVuaXN0ZC5oLAotCWFuZCBzdHJpbmcuaC4KLQotRnJpIE9jdCAyOSAxMzoyNjoxMiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogQWxsb3cgYmFja2VuZHMgdG8gb3ZlcnJpZGUgdGhlIHNlY3Rpb24gbmFtZXMgdXNlZCBmb3IgZW1iZWRkZWQKLQlzdGFicyBzdXBwb3J0LiAgTmVlZGVkIGZvciBTT00uCi0JKiByZWFkLmMgKFNUQUJfU0VDVElPTl9OQU1FKTogRGVmYXVsdCB0aGUgbmFtZSBvZiB0aGUgc3RhYiBzZWN0aW9uCi0JdG8gIi5zdGFiIi4KLQkoU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FKTogTGlrZXdpc2UgZm9yIHRoZSBzdGFiIHN0cmluZ3Mgc2VjdGlvbi4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IElzIG5vdyBwYXNzZWQgdGhlIGZ1bGwgbmFtZSBmb3IgdGhlCi0Jc3RhYiBzdHJpbmcgc2VjdGlvbiByYXRoZXIgdGhhbiBhIG5hbWUgcHJlZml4LiAgQWxsIHJlZmVyZW5jZXMKLQljaGFuZ2VkLgotCShzX3N0YWJfZ2VuZXJpYyk6IE5ldyBhcmd1bWVudCBmb3IgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24gbmFtZS4KLQlhbGwgcmVmZXJlbmNlcyBjaGFuZ2VkLgotCShzX3hzdGFiKTogQXBwZW5kICJzdHIiIHRvIHRoZSBzdGFiIHNlY3Rpb24gbmFtZSB0byBnZXQgdGhlCi0Jc3RhYiBzdHJpbmcgc2VjdGlvbiBuYW1lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uKTogQXBwZW5kICJzdHIiCi0JdG8gc3RhYiBzZWN0aW9uIG5hbWUgdG8gZ2V0IHRoZSBzdGFiIHN0cmluZyBzZWN0aW9uIG5hbWUuICBQYXNzCi0JdGhlIGZ1bGwgbmFtZSBvZiB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbiB0byBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbik6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9iZWdpbik6IERpc2FibGUgIi1SIiBvcHRpb24gdG8gZm9sZAotCXRleHRhbmQgZGF0YSBzZWdtZW50cy4gIFdhcm4gdXNlciAiLVIiIGlzIHVuc3VwcG9ydGVkIG9uIHRoZQotCVBBLgotCi1UaHUgT2N0IDI4IDEyOjM2OjEzIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBEZWZhdWx0IGFsaWdubWVudCBpcyA4IGZvcgotCS5hbGlnbiBhbmQgLkFMSUdOIGRpcmVjdGl2ZXMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX3NwYWNlKTogRG8gbm90IHJlcG9ydCBhbiBlcnJvciBmb3IgYSAuc3BhY2UKLQlkaXJlY3RpdmUgd2hpY2ggZG9lcyBub3QgZGVmaW5lIGEgIndlbGwta25vd24iIHNwYWNlIGFuZCBkb2VzCi0Jbm90IGluY2x1ZGUgYSBzcGFjZSBudW1iZXIgYXMgYW4gYXJndW1lbnQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMpOiBDb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHRoZQotCSJkZWZpbmVkIiwgImxvYWRhYmxlIiwgImNvZGVfb25seSIgYW5kICJzcGFjZV9pbmRleCIgZmllbGRzLgotCShwYV9kZWZfc3BhY2VzKTogQ29ycmVjdCBpbml0aWFsaXphdGlvbiBvZiB0aGUgInNwbnVtIiwgImRlZmluZWQiLAotCWFuZCAicHJpdmF0ZSIgZmllbGRzLgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIG5ldyB0Y19maXhfZGF0YSBmaWVsZCBmb3IgdGhlIHZhcmlvdXMKLQliYWNrZW5kcyB0byBhdHRhY2ggbWFjaGluZSBkZXBlbmRlbnQgZml4dXAgaW5mb3JtYXRpb24gdG8uCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogSW5pdGlhbGl6ZSBuZXcgdGNfZml4X2RhdGEgZmllbGQuCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9zdHJ1Y3QpOiBEZWxldGUgdW5uZWNlc3NhcnkgZml4X2ZpeFAgYW5kCi0JZnhfbmV4dCBmaWVsZHMuCi0JKGhwcGFfZmluZF9ocHBhX2ZpeCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSBmdW5jdGlvbi4gIEZpeCBhbGwKLQljYWxsZXJzIHRvIGdldCBIUFBBIGZpeHVwIGluZm9ybWF0aW9uIGZyb20gdGhlIHRjX2ZpeF9kYXRhIGZpZWxkCi0JaW4gdGhlIEdBUyBmaXh1cC4KLQkoaHBwYV9maXhfcm9vdCk6IERlbGV0ZSB1bm5lY2Vzc2FyeSB2YXJpYWJsZS4KLQkoZml4X25ld19ocHBhKTogQXR0YWNoIEhQUEEgZml4dXAgZGF0YSB0byB0aGUgR0FTIGZpeHVwLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zZXRfc3RhcnRfc3ltYm9sKTsgRGVsZXRlIHVud2FudGVkCi0JZnVuY3Rpb24uICBGaXggYWxsIGNhbGxlcnMuCi0JKHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4pOiBEZWxldGUgdW51c2VkIHNzZF9zdGFydF9zeW0gZmllbGQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBOZXcgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lCi0JaWYgYSBwYXJ0aWN1bGFyIGZpeHVwIGlzIGFkanVzdGFibGUuCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19maXhfYWRqdXN0YWJsZSk6IENhbGwgaHBwYV9maXhfYWRqdXN0YWJsZSB0bwotCXBlcmZvcm0gdGhlIHJlYWwgd29yay4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFKTogTW92ZSBkZWZpbml0aW9uIG91dAotCW9mIE9CSl9YWFggY29uZGl0aW9uYWxzLgotCShNQVhfUkVMT0NfRVhQQU5TSU9OKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGxvZzIpOiBSZW5hbWVkIGZyb20gaXNfcG93ZXJfb2ZfMi4gIEZpeCBhbGwKLQljYWxsZXJzLiBOb3cgcmV0dXJucyBsb2cyIChOKSBmb3IgcG9zaXRpdmUgTiB3aGljaCBhcmUgYW4gZXhhY3QKLQlwb3dlciBvZiB0d28gb3IgLTEgZm9yIGFuIGVycm9yLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9jYWxsaW5mbyk6IFJhbmdlIGNoZWNrIHZhbHVlcyBwcm92aWRlZCBmb3IKLQlFTlRSWV9HUiwgRU5UUllfRlIgYW5kIEVOVFJZX1NSLiAgUHJvcGVybHkgYWRqdXN0IHZhdWVzIGJlZm9yZQotCWluc2VydGluZyB0aGVtIGludG8gdGhlIHVud2luZCB0YWJsZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoTkVFRFNfRklYVVApOiBEZWxldGUgZGVmaW5pdGlvbiBhbmQgYWxsIHJlZmVyZW5jZXMuCi0JKGhwcGFfZ2VuX3JlbG9jX3R5cGUpOiBOZXcgb2JqZWN0IGZvcm1hdCBkZXBlbmRlbnQgbWFjcm8uCi0JKHBhX2lwKTogRGVsZXRlIHRvbnMgb2YgY29kZSB3aGljaCB3YXMgZWl0aGVyIE9CSl9TT00gb3IgT0JKX0VMRgotCWNvbmRpdGlvbmFsLiAgVGhlIGNvZGUgY2FuIChhbmQgd2lsbCkgYmUgc2hhcmVkIGJldHdlZW4gU09NICYgRUxGCi0JZm9ybWF0cyBpbiB0aGUgbmVhciBmdXR1cmUuCi0JKGNvbnNfZml4X25ld19ocHBhLCBtZF9hcHBseV9maXhfMSk6IExpa2V3aXNlLgotCShwYV9idWlsZF91bndpbmRfc3Vic3BhY2UsIHByb2Nlc3NfZXhpdCwgcGFfZXhpdCk6IExpa2V3aXNlLgotCSh0Y19nZW5fcmVsb2MpOiBVc2UgaHBwYV9nZW5fcmVsb2MgcmF0aGVyIHRoYW4gYW4gb2JqZWN0IGZvcm1hdAotCXNwZWNpZmljIGNhbGwuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2NvbW0pOiBTZXQgdGhlIHNlZ21lbnQgZm9yIGEgY29tbW9uIHN5bWJvbAotCXRvIGJmZF91bmRfc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl92ZXJzaW9uKTogQWRkIGV4dGVybiBwcm90b3R5cGUuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYS0qLWJzZCopOiBOZXcgY29uZmlndXJhdGlvbi4KLQlCRkQgaXMgYWx3YXlzIHVzZWQgZm9yIEdBUyBnZW5lcmF0aW5nIFNPTSBvYmplY3RzLgotCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jIGlmIGFuCi0JYWRqdXN0bWVudCBpcyByZWplY3RlZCBieSB0aGUgdGFyZ2V0IG1hY2hpbmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2JpZ19jb25zKTogRGVsZXRlIGZ1bmN0aW9uIGFuZCBpdHMKLQlkZWNsYXJhdGlvbi4gIEFsbCBjYWxsZXJzIGNoYW5nZWQgdG8gdXNlIHBhX2NvbnMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBGaXggaW5kZW50aW9uIGFuZCBvcGVuL2Nsb3NlIGJyYWNlCi0JcHJvYmxlbS4KLQotCUZyb20gUGV0ZSBIb29nZW5ib29tOgotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXRvZik6IFJldHVybiBhIE5VTEwgb24gc3VjY2VzcyByYXRoZXIgdGhhbgotCWFuIGVtcHR5IHN0cmluZy4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfc3BhY2Vfc3RtdCk6IEFkdmFuY2UKLQlpbnB1dF9saW5lX3BvaXRuZXIgd2hlbiBhbiBpbnZhbGlkIGFyZ3VtZW50IGlzIGVuY291bnRlcmVkLgotCi1UaHUgT2N0IDI4IDEzOjA5OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWEyOWsuYyAobWRfYmVnaW4pOiBXaGVuIG9wY29kZXMgYXJlIG1hc2hlZCB0b2dldGhlciBpbgotCXRoZSB0YWJsZSwgcmVxdWlyZSB0aGF0IHRoZSBvbmUgd2l0aG91dCBiaXQgMHgxMDAwMDAwIHNldCBjb21lCi0JZmlyc3QuICBSZXF1aXJlIGZ1cnRoZXIgdGhhdCBpdCBiZSBjYXNlICdiJyBvciAnUCcuICBUaGUgYTI5awotCW9wY29kZSB0YWJsZSBhbHJlYWR5IG1lZXRzIHRoZXNlIGNvbnN0cmFpbnRzLgotCShtYWNoaW5lX2lwKTogV2hlbiBoYW5kbGluZyBjYXNlICdpJyBvciAnQScsIG1ha2Ugc3VyZSB0aGF0IHRoZQotCWFwcHJvcHJpYXRlIG9wY29kZSByZWFsbHkgZXhpc3RzIGJ5IGxvb2tpbmcgYXQgdGhlIG5leHQgZW50cnkgaW4KLQl0aGUgb3Bjb2RlIHRhYmxlLgotCi1XZWQgT2N0IDI3IDExOjQ4OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEFkanVzdCBvZmZzZXRzIGZvciBQQyByZWxhdGl2ZQotCWZpeHVwcy4gIEFkZCA2IGZvciBsb25nIDcuMyBjYXNlLCAyIGZvciBzaG9ydCA3LjIgY2FzZS4KLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfZWNvZmZfZW50KTogSWdub3JlIGFuIG9wdGlvbmFsIG51bWJlcgotCWFmdGVyIGEgLmVudCBkaXJlY3RpdmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBIYW5kbGUgJz4nIGNhc2UgKHNoaWZ0IGFtb3VudAotCWJldHdlZW4gMzIgYW5kIDYzIGZvciBkb3VibGUgc2hpZnQgaW5zdHJ1Y3Rpb24pLiAgRG8gJiAweDFmIHJhdGhlcgotCXRoYW4gJSAzMi4KLQkocHJpbnRJbnNuKTogSGFuZGxlICc+Jy4KLQotVHVlIE9jdCAyNiAxNjo1ODozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jICh0Y19hb3V0X2ZpeF90b19jaGFycyk6IE91dHB1dCB0aGUgc3ltYm9sCi0JbnVtYmVyIGluIHRoZSByaWdodCBwbGFjZS4gIFVudGVzdGVkLiAgUHJvYmFibHkgZG9lcyBub3Qgd29yayBmb3IKLQljcm9zcyBhc3NlbWJseS4gIEZyb20gY2FnbmV5QGNzLmFkZWxhaWRlLmVkdS5hdSAoQW5kcmV3IENhZ25leSkuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogRXJyb3IgaWYgYSBzaG9ydCBicmFuY2ggdXNlcwotCWFuIGlsbGVnYWwgb2Zmc2V0IG9mIDAgb3IgLTEuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBBbGlnbiAuc3RhYgotCXNlY3Rpb24gdG8gYSBsb25nd29yZCBib3VuZGFyeS4KLQotVHVlIE9jdCAyNiAxMDoyNDozMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENIRUNLRkxBR1MpOiBQYXNzIGRvd24gUlVOVEVTVEZMQUdTLgotCi0JRnJvbSBKZWZmIExhdzoKLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IEVMRjMyX0hQUEFfUl9BRERFTkQgLT4KLQlIUFBBX1JfQURERU5ELgotCi1Nb24gT2N0IDI1IDE0OjA2OjE3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogRml4IHVwIG1lbWJhciBhcmd1bWVudCBoYW5kbGluZy4KLQotTW9uIE9jdCAyNSAxMToxNzo1OCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc2guYyAoYnVpbGRfTWJ5dGVzKTogV3JpdGUgdGhlIHJlbG9jcyB0byB0aGUgY29ycmVjdAotCWFkZHJlc3MuIChtZF9hc3NlbWJsZSk6IE1ha2UgZXJyb3IgaGFuZGxpbmcgYSBiaXQgbW9yZSBncmFjZWZ1bC4KLQkobWRfYXBwbHlfZml4KTogIERvbid0IHdhcm4gb24gbm9uIGFsaWduZWQgZGlzcGxhY2VtZW50LgotCi0JKiBjb25maWcvdGMtejhrLmMgKGdldF9zcGVjaWZpYywgYnVpbHRfYnl0ZXMpOiAgVW5kZXJzdGFuZCBhbGwgdGhlCi0JYXNwZWN0cyBvZiBsZGEuCi0KLU1vbiBPY3QgMjUgMTA6MjA6MzEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogVXNlICIkPCoiIHNvIFZQQVRIIHdpbGwgZmluZAotCWFzLmluZm8qIGV2ZW4gaWYgdGhleSdyZSBpbiAkKHNyY2RpcikgKGUuZy4sIGZvciBGU0YKLQlkaXN0cmlidXRpb25zKS4KLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKTogRm9yIHJlbG9jcyB0aGF0IGFyZSBwY19yZWxhdGl2ZSBhbmQKLQlwY3JlbF9vZmZzZXQgYW5kIG5vdCBwYXJ0aWFsX2lucGxhY2UsIGFkanVzdCByZWxvYy0+YWRkZW5kIHRvCi0JY29tcGVuc2F0ZSBmb3IgYSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGJ1Zy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmg6IFJlbW92ZWQgcmVtYWluaW5nIG5vbi1CRkRfQVNTRU1CTEVSIGNvZGUuCi0JKiBjb25maWcvdGMtc3BhcmMuYzogRGl0dG8uCi0JKHRjX2dlbl9yZWxvYyk6IEluY2x1ZGUgZnhfb2Zmc2V0IGZvciBwY3JlbCBmaXh1cHMuCi0KLVN1biBPY3QgMjQgMTY6NDk6MDAgMTk5MyAgSmltIFdpbHNvbiAgKHdpbHNvbkB4MS5jeWdudXMuY29tKQotCi0JKiB0Yy1taXBzLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCBkd29yZCBwc2V1ZG8gb3AuCi0KLUZyaSBPY3QgMjIgMjA6NDA6NTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtZXNzYWdlcy5jOiByZXBsYWNlZCBhbGwgdmFyaWFibGVzIGNhbGxlZCBGb3JtYXQgd2l0aCAnZm9ybWF0JywKLQkgIGZvciBjb25zaXN0ZW5jeSB0aHJvdWdob3V0Ci0KLQkqIGNvbmZpZ3VyZS5pbjogaGFuZGxlIG1pcHMqLSBpbnN0ZWFkIG9mIG1pcHMsIG1pcHMqZWwgZm9yIGxpdHRsZQotCWVuZGlhbiBjb25maWd1cmF0aW9ucwotCi1GcmkgT2N0IDIyIDE0OjQ1OjQ5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW5wdXQtc2NydWIuYyAocGh5c2ljYWxfaW5wdXRfZmlsZSwgbG9naWNhbF9pbnB1dF9maWxlLAotCXBoeXNpY2FsX2lucHV0X2xpbmUsIGxvZ2ljYWxfaW5wdXRfbGluZSk6IE1hZGUgc3RhdGljLgotCShhc193aGVyZSk6IFJldHVybiBjdXJyZW50IGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIsIGRvbid0IHByaW50Ci0JdGhlbSBvdXQuCi0JKiBtZXNzYWdlcy5jIChhc19zaG93X3doZXJlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4gIE90aGVyCi0JZnVuY3Rpb25zIHVzZSBpdCBpbnN0ZWFkIG9mIGFzX3doZXJlLgotCShhc19iYWRfaW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShhc19iYWQpOiBVc2UgYXNfYmFkX2ludGVybmFsLgotCShhc19iYWRfd2hlcmUpOiBOZXcgZnVuY3Rpb24sIGxpa2UgYXNfYmFkIGJ1dCB0YWtpbmcgYSBmaWxlIG5hbWUKLQlhbmQgbGluZSBudW1iZXIuCi0JKiBhcy5oIChhc19iYWRfd2hlcmUpOiBEZWNsYXJlLgotCShhc193aGVyZSk6IENoYW5nZSBwcm90b3R5cGUgZm9yIG5ldyBhcmd1bWVudHMuCi0JKiB3cml0ZS5oIChmaXhTKTogQWRkZWQgZmllbGRzIGZ4X2ZpbGUgYW5kIGZ4X2xpbmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2ludGVybmFsKTogU2F2ZSBmaWxlIGFuZCBsaW5lIG51bWJlciBpbiBmaXguCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgYXNfYmFkX3doZXJlLCBub3QgYXNfYmFkLgotCSogaW5wdXQtZmlsZS5jIChmX2luLCBmaWxlX25hbWUpOiBNYWRlIHN0YXRpYy4KLQkqIGNvbmQuYyAoc3RydWN0IGZpbGVfbGluZSk6IEp1c3QgdXNlIGZpbGUgYW5kIGxpbmUgZmllbGRzLgotCShzX2Vsc2UpOiBVc2UgYXNfd2hlcmUgYW5kIGFzX2JhZF93aGVyZSwgbm90IGdldF9maWxlX2xpbmUgYW5kCi0Jc2V0X2ZpbGVfbGluZS4KLQkoZ2V0X2ZpbGVfbGluZSwgc2V0X2ZpbGVfbGluZSk6IFJlbW92ZWQuCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfbmV3bGluZSk6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSBhc193aGVyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUpOiBVc2UgYXNfd2hlcmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uKTogVXNlIGFzX3doZXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBVc2UgYXNfYmFkX3doZXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAodGNfZ2VuX3JlbG9jKTogVXNlIGFzX2JhZF93aGVyZSwgbm90IGFzc2VydC4KLQotVGh1IE9jdCAyMSAxMjo1MjowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuaDogRG9uJ3QgZGVmaW5lIFJFR0lTVEVSX1BSRUZJWCBvcgotCU9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCBpZiBlaXRoZXIgaXMgYWxyZWFkeSBkZWZpbmVkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRGVsZXRlIHNvbWUgY29kZSBpbiAiI2lmIDAiLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBiZmRfZ2FzIGZvciBhbGwgc3BhcmMgdGFyZ2V0cy4gIEFkZGVkIGZhY2lsaXR5Ci0JZm9yIGtlZXBpbmcgb3IgcmVqZWN0aW5nIGNvbmZpZ3VyYXRpb25zIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50OwotCWRlZmF1bHQgaXMgdG8gYXNzdW1lIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIGFuZCByZWplY3QgY29uZmlncwotCXN0aWxsIGJlaW5nIHdvcmtlZCBvbi4gIE1hcmsgRWxmIGNvbmZpZ3VyYXRpb25zIChleGNlcHQgc3BhcmMgYW5kCi0JaTM4NikgYXMgZGV2ZWxvcG1lbnRhbC4gIERlbGV0ZWQgY2FzZXMgbWF0Y2hpbmcgc29tZSBnZW5lcmljIG5hbWVzCi0JaW4gZmF2b3Igb2YgbW9yZSBzcGVjaWZpYyBuYW1lcy4gIChFLmcuLCB3aGVuIHdlIGdldCBBbHBoYQotCXN1cHBvcnQsIHdlJ2xsIHN0aWxsIG9ubHkgc3VwcG9ydCBWTVMgZm9yIFZheC4pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChtZF9lbmQpOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfZW5kKTogRnVuY3Rpb24gZGVsZXRlZC4KLQkoQkZEX1JFTE9DXyopOiBEZWxldGUgbWFjcm9zIHRoYXQgdXNlZCB0byBoZWxwIGtlZXAgdGhlIG5vbi1iZmQKLQl2ZXJzaW9uIGNvbXBpbGluZy4gIEFsbCBzcGFyYyB0YXJnZXRzIHdpbGwgdXNlIGJmZCBub3cuCi0JKiB0Yy5oIChtZF9lbmQpOiBEb24ndCBkZWNsYXJlIGlmIGl0J3MgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlciBIb29nZW5ib29tOgotCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBMaW1pdCBvY3RhbCBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvCi0JdGhyZWUgZGlnaXRzLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBNYWpvciBjbGVhbnVwLiAgVXNlIEdOVS1zdHlsZSBjb21tZW50cy4gIFdhcm4KLQlhZ2FpbnN0IHBsYWNpbmcgYWRkaXRpb25hbCBvYmplY3QtZmlsZSBkZXBlbmRlbnQgY29kZSBoZXJlLiAgV2FybgotCWFnYWluc3QgY29udGFtaW5hdGluZyBhbGwgb2YgR0FTIHdpdGggdGhlIGludGVybmFscyBvZiB0Yy1ocHBhLmMKLQl0aHJvdWdoIGluY2x1c2lvbiBvZiB0Yy1ocHBhLmguICBEZWxldGUgYWxsIGZvcndhcmQgZGVjbGFyYXRpb25zCi0JZm9yIGZ1bmN0aW9ucyBvbmx5IHVzZWQgd2l0aGluIHRjLWhwcGEuYywgbGlrZXdpc2UgZm9yIHN0cnVjdHVyZXMsCi0JdmFyaWFibGVzLCBhbmQgI2RlZmluZXMuICBUcnkgdG8gZ3JvdXAgT0JKX0VMRiBhbmQgT0JKX1NPTQotCWNvbmRpdGlvbmFsIGNvZGUgaW4gYSBmZXcgc21hbGwgcGxhY2VzLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBNYWpvciBjbGVhbnVwLiAgVXNlIEdOVS1zdHlsZSBjb21tZW50cy4gIEdyb3VwCi0Jc3RydWN0dXJlcywgZ2xvYmFsIHZhcmlhYmxlcywgZm9yd2FyZCBkZWNsYXJhdGlvbnMgdG9nZXRoZXIuCi0JUmVkdWNlIChvciBpbiBzb21lIGNhc2VzIGVsaW1pbmF0ZSkgT0JKX0VMRiBhbmQgT0JKX1NPTQotCWNvbmRpdGlvbmFsIGNvZGUgLS0gdHJ5IHRvIGdyb3VwIGNvbmRpdGlvbmFsIGNvZGUgdG9nZXRoZXIKLQlpbnRvIGEgZmV3IHBsYWNlcy4gICBNYWtlIGFsbCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyB3aGljaAotCWFyZSBvbmx5IHVzZWQgd2l0aGluIHRjLWhwcGEuYyBzdGF0aWMuICBQQVJBTWl6ZSBhbGwgZnVuY3Rpb25zLgotCUFkZCBjb21tZW50cyB0byBmdW5jdGlvbnMuICBEZWxldGUgdW51c2VkIGZ1bmN0aW9ucywgdmFyaWFibGVzLAotCSNkZWZpbmVzLCBldGMuICBEZWxldGUgdW51c2VkIG1lbWJlcnMgd2l0aGluIHN0cnVjdHVyZXMuICBEZWxldGUKLQlsZGlsO2JsZSBoYWNrcyAtLSBpdCBpcyBiZWxpZXZlZCB0aGV5IHdlcmUgaW5zdGFsbGVkIHRvIHdvcmsKLQlhcm91bmQgb2xkIGdhcyBidWdzLiAgIEF2b2lkIHVzaW5nIG1peGVkIGNhc2UgZm9yIGxvY2FsCi0JZnVuY3Rpb25zLCB2YXJpYWJsZXMsIGFuZCBzdHJ1Y3R1cmVzLiAgRml4IGZvcm1hdHRpbmcgcHJvYmxlbXMKLQlub3QgZm91bmQgYnkgR05VLWluZGVudC4gIEFkZCBGSVhNRSBub3RpY2VzIGZvciB0aGluZ3Mgd2hpY2gKLQlzaG91bGQgYmUgd29ya2VkIG9uIHRoZSBuZWFyIGZ1dHVyZS4gIERlbGV0ZSBsb3RzIG9mIG9sZAotCXVzZWxlc3MgKDEuMzYgUEEtU09NKSBjb2RlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiAoZml4X25ld19ocHBhKTogSW5pdGlhbGl6ZSB0aGUgZnhfcl90eXBlCi0JZmllbGQgb2YgdGhlIGZpeFMgc3RydWN0dXJlLiAgTmVlZGVkIHRvIGJ1aWxkIHVud2luZAotCWRlc2NyaXB0b3JzIGNvcnJlY3RseS4KLQotCSogd3JpdGUuYzogKGZpeHVwX3NlZ21lbnQpOiBBbGxvdyBleHByZXNzaW9ucyBzdWNoIGFzCi0Jc3ltMS1zeW0yK2NvbnN0IGFzIGxvbmcgYXMgc3ltMiBpcyAkZ2xvYmFsJC4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBQcm92aWRlIGEgaG9vayBzbyB0aGF0IGEgdGFyZ2V0Ci0JY3B1IGNvbmZpZ3VyYXRpb24gY2FuIHJlamVjdCBjZXJ0YWluIHJlbG9jYXRpb24gcmVkdWN0aW9ucy4KLQkqIHRjLWhwcGEuaCAodGNfZml4X2FkanVzdGFibGUpOiBOZXcgbWFjcm8uICBPbmx5IGFjY2VwdCByZWxvY2F0aW9ucwotCXdoaWNoIGRvIG5vdCBpbnZvbHZlIGZ1bmN0aW9uIHN5bWJvbHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmg6IFJlaW5kZW50IHdpdGggR05VLWluZGVudC4gIERlbGV0ZSByZWZlcmVuY2VzCi0JdG8gT0JKX09TRlJPU0UuICBGaXggdHlwb3MgKE9CSl9TT01FIC0+IE9CSl9TT00pLiAgRGVsZXRlIHVudXNlZAotCVNUQUJfRklYVVAgbWFjcm8uCi0JKiBjb25maWcvdGMtaHBwYS5jOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4XzEpOiBVc2UgZWxmX3N5bWJvbF90eXBlLCBpbnN0ZWFkCi0Jb2YgZWxmMzJfc3ltYm9sX3R5cGUuCi0JKHBhX2V4cG9ydF9hcmdzKTogTGlrZXdpc2UuCi0JKGVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcpOiBMaWtld2lzZS4KLQkocGFfZGVzYyk6IERvIG5vdCBjYWxsIG9ial9lbGZfZGVzYy4gIChJcyBwYV9kZXNjIGV2ZW4gbmVlZGVkCi0JYW55bW9yZT8pCi0JKGhwcGFfdGNfbWFrZV9zZWN0aW9ucyk6IERvIG5vdCBkZWNsYXJlIGVsZl9nZXRfc3ltdGFiX21hcCBhbnkKLQlvcmUuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IChtZF9zZWN0aW9uX2FsaWduKTogQWxpZ24gYWxsIHNlY3Rpb25zIHRvCi0JYSBtdWx0aXBsZSBvZiB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgcmF0aGVyIHRoYW4gYWx3YXlzIGEKLQltdWx0aXBsZSBvZiA4LgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX3N5bWJvbCk6IElmIHRoZSBhcmd1bWVudCByZWxvY2F0aW9uCi0JYml0cyBhcmUgemVybyAoZWcgdGhleSBzcGVjaWZ5IG5vIHJlbG9jYXRpb25zKSwgdGhlbiBkbyBub3QgZXZlbgotCWJvdGhlciBhZGRpbmcgdGhlaXIgZW50cmllcyB0byB0aGVzeW1leHRuIHNlY3Rpb24uCi0KLVRodSBPY3QgMjEgMTU6NDQ6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgLXNwYXJjCi0Jb3B0aW9uLCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBTdW5PUyBtYWtlIGRlZmF1bHQgLnMubyBydWxlLgotCi1XZWQgT2N0IDIwIDEyOjI2OjMzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXAsIGxhYmVsICJpbW1lZGlhdGUiKTogQ29udmVydCByZWxvY3MKLQlvcGVyYXRpbmcgb24gdXBwZXIgMzIgYml0cyBvZiBpbW1lZGlhdGUgY29uc3RhbnRzIHRvIGxvd2VyLWhhbGYKLQlyZWxvY3Mgd2l0aCBhZGp1c3RlZCBjb25zdGFudHMuCi0KLVR1ZSBPY3QgMTkgMTg6MTM6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIHRvIGJlIGV4dGVybmFsIHZhcmlhYmxlCi0JbTY4a19hb3V0X21hY2h0eXBlLgotCSogY29uZmlnL3RjLW02OGsuYyAob21hZ2ljKTogUmVtb3ZlIG9ic29sZXRlIGFuZCB1bnVzZWQgdmFyaWFibGUuCi0JKG02OGtfYW91dF9tYWNodHlwZSk6IE5ldyB2YXJpYWJsZSwgaWYgT0JKX0FPVVQuCi0JKG1kX2Fzc2VtYmxlKTogSW5pdGlhbGl6ZSBtNjhrX2FvdXRfbWFjaHR5cGUgYmFzZWQgb24KLQljdXJyZW50X2FyY2hpdGVjdHVyZSwgaWYgT0JKX0FPVVQuCi0JKG1kX3BhcnNlX29wdGlvbik6IFJlbW92ZSBvYnNvbGV0ZSByZWZlcmVuY2UgdG8gb21hZ2ljLgotCi1UaHUgT2N0IDE0IDE2OjUxOjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcHNldWRvX3RhYmxlKTogSWdub3JlIC5saXZlcmVnIHBzZXVkby1vcC4KLQkoc19vcHRpb24pOiBJZ25vcmUgLm9wdGlvbiBPKiBhbmQgLm9wdGlvbiBwaWMqLgotCShzX2VudCk6IFNraXAgd2hpdGVzcGFjZSBiZXR3ZWVuIHN5bWJvbCBhbmQgb3B0aW9uYWwgZGlnaXQuCi0JKG15X2dldFNtYWxsRXhwcmVzc2lvbik6IEhhbmRsZSAoJHh4KSBjb3JyZWN0bHk6IGFzc3VtZSAwKCR4eCkuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBbHdheXMgYWNjZXB0ICd4JyBhbmQgJ1gnIGFzIGVzY2FwZQotCWNoYXJhY3RlcnMgaW4gc3RhdGUgNi4KLQkqIHJlYWQuYyAobmV4dF9jaGFyX29mX3N0cmluZyk6IEFjY2VwdCBcWGgqIGFuZCBceGgqIHdoZXJlIGgqIGFyZQotCWhleGlkZWNpbWFsIGRpZ2l0cy4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4XzEpOiBNYWtlIGNyb3NzIHNlZ21lbnQgY2FsbHMgd29yawotCWZvciBFTEYgYnkgaGFja2luZyBhcm91bmQgYml6YXJyZSBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGJlaGF2aW91cgotCXRoYXQgSSBkb24ndCBkYXJlIGNoYW5nZS4KLQotVGh1IE9jdCAxNCAxMTozMzoyNSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogY29uZmlnL3RjLWkzODYuYzogKG1kX2JlZ2luKTogRG8gbm90IHplcm8gc3RhdGljIGFycmF5cy4gIERvbid0Ci0JY2FsbCBzdHJjaHIgZm9yIGVhY2ggY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgY2hhciwKLQlpbnN0ZWFkIGFkZCBhIHNlY29uZCBsb29wIG92ZXIgc3BlY2lhbF9jaGFycy4gIFNldCBhbGlnbm1lbnQKLQlvZiB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdG8gNC4KLQkocGksIHRlLCBwdCwgcGUsIHBzKTogQWRkIGRlY2xhcmF0aW9ucyBzbyB0aGF0IERFQlVHMzg2IGNhbiBiZQotCXVzZWQgYWdhaW4uCi0JKHJlbG9jKTogRG9uJ3QgcmV0dXJuIDggYW5kIDE2IGJpdCBub24tUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgb24KLQlFTEYsIHNpbmNlIHRoZSBFTEYgb2JqZWN0IGZvcm1hdCBkb2VzIG5vdCBoYXZlIHRoZXNlIHR5cGUgb2YKLQlyZWxvY2F0aW9ucy4gIENoYW5nZSB0aGUgYWJvcnQgaW50byBhcyBhc19iYWQgYW5kIHJldHVybgotCUJGRF9SRUxPQ19OT05FIHRvIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MuCi0JKG1kX2Fzc2VtYmxlKTogS2VlcCB0cmFjayBvZiB0aGUgaW5zdHJ1Y3Rpb24gc2l6ZS4gIEFsbG93IHdoaXRlCi0Jc3BhY2UgYmV0d2VlbiB0aGUgJCBhbmQgdGhlIGNvbnN0YW50IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKLQlnYXNlcyBhbmQgb3RoZXIgYXNzZW1ibGVycy4KLQkoaTM4Nl9vcGVyYW5kKTogU2tpcCBzcGFjZXMgYmV0d2VlbiAkIGFuZCBleHByZXNzaW9uLgotCSh0Y19nZW5fcmVsb2MpOiBEb24ndCBhbGxvdyBhbnl0aGluZyBidXQgMzIgYml0IHJlbG9jYXRpb25zIG9uCi0JRUxGLiAgQ29udmVydCBhYm9ydCBpbnRvIGFuIGFzX2JhZCBhbmQgYXNzZXJ0IGludG8gYXNfZmF0YWwuCi0KLVdlZCBPY3QgMTMgMTY6NTA6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZml4dXBfc2VnbWVudCkgW0RJRkZfRVhQUl9PS106IElmCi0Jc3ViX3N5bWJvbFAgaXMgaW4gdGhlIGN1cnJlbnQgc2VnbWVudCwgY29udmVydCB0byBhIFBDLXJlbGF0aXZlCi0JZml4dXAgYW5kIGRpc2NhcmQgdGhlIHN5bWJvbC4KLQotV2VkIE9jdCAxMyAxNDowMDowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEhhbmRsZSBzdF9FbmQgc3ltYm9sCi0JZm9yIHN0X1N0YXRpY1Byb2MganVzdCBsaWtlIHN0X1Byb2MuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IE1vdmVkICNlbmRpZiBmb3IgT0JKX0JPVVQKLQlzbyB0aGF0IE9CSl9CT1VUIGRvZXNuJ3QgZm9yZ2V0IHRvIGFkanVzdCBhbGwgdGhlIGZyYWdtZW50cyBpbiB0aGUKLQkuYnNzIHNlY3Rpb24uCi0KLVR1ZSBPY3QgMTIgMTc6MjY6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJZiBPQkpfRUxGLCBpbmNsdWRlIGVsZi9taXBzLmguCi0JKG1pcHNfcmVnbWFza19mcmFnKTogTmV3IHN0YXRpYyB2YXJpYWJsZSwgaWYgT0JKX0VMRi4KLQkobWRfYmVnaW4pOiBJZiBPQkpfRUxGLCBjcmVhdGUgLnJlZ2luZm8gc2VjdGlvbiBhbmQgc2V0Ci0JbWlwc19yZWdtYXNrX2ZyYWcgdG8gYSBmcmFnLgotCShtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nKTogTmV3IGZ1bmN0aW9uLCBpZiBPQkpfRUxGLiAgU2V0Ci0JbWlwc19yZWdtYXNrX2ZyYWcgdG8gcmVnaXN0ZXIgbWFzayBpbmZvcm1hdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKGVsZl90Y19maW5hbF9wcm9jZXNzaW5nKTogTmV3IG1hY3JvLCBkZWZpbmVkCi0JaWYgT0JKX0VMRi4KLQotVHVlIE9jdCAxMiAwMzozMzoyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX2ZhdGFsKTogVXNlIG15bmFtZSB3aGVuIHByaW50aW5nIG1lc3NhZ2VzLgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9iZWdpbik6IFVzZSBudWxsIHBvaW50ZXIsIG5vdCBlbXB0eSBzdHJpbmcsCi0JYXMgaW5pdGlhbCAicmV0dXJuIiB2YWx1ZSBpbiBjYXNlIGhhc2hpbmcgaXNuJ3QgbmVlZGVkLgotCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9hdG9mKTogUmV0dXJuIG51bGwsIG5vdCBlbXB0eSBzdHJpbmcsIG9uCi0Jc3VjY2Vzcy4KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChtZF9hdG9mKSwgY29uZmlnL3RjLWg4NTAwLmMgKG1kX2F0b2YpLAotCWNvbmZpZy90Yy1ocHBhLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtaTg2MC5jIChtZF9hdG9mKSwKLQljb25maWcvdGMtaTk2MC5jIChtZF9hdG9mKSwgY29uZmlnL3RjLW04OGsuYyAobWRfYXRvZiksCi0JY29uZmlnL3RjLW5zMzJrLmMgKG1kX2F0b2YpLCBjb25maWcvdGMtc2guYyAobWRfYXRvZik6IERpdHRvLgotCi1Nb24gT2N0IDExIDE2OjQ2OjMxIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQlmaXggZm9yIHByIDM1NzEKLQkqIGNvbmZpZy90Yy1oODMwMC5jIChnZXRfc3BlY2lmaWMpOiBTcGVjaWFsIGFjdGlvbiBpZiA4IGJpdAotCWFkZHJlc3Mgc2Vlbi4gKGNoZWNrX29wZXJhbmQpOiBEb24ndCBjb21wbGFpbiBpZiB0cnVuY2F0aW5nIHRvcAotCWJpdHMgb2YgYW4gOCBiaXQgYWRkcmVzcy4gIChidWlsZF9ieXRlcyk6IEFsbG93IGFuIGltbWVkaWF0ZSBhbmQKLQlhbiBhYnNvbHV0ZSBpbiB0aGUgc2FtZSBpbnNuLgotCi1Nb24gT2N0IDExIDE3OjE4OjUxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfY29udGVudHMpOiBEb24ndCBjcmFzaCBpZiBzZWdpbmZvIGlzIE5VTEwuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogV3JpdGUgb3V0IHJlZ2lzdGVyIG1hc2tzCi0JYnkgbW9kaWZ5aW5nIC5yZWdpbmZvIHNlY3Rpb24sIG5vdCBieSBkaXJlY3RseSBtb2RpZnlpbmcgQkZECi0JYmFja2VuZCBkYXRhLgotCi1Nb24gT2N0IDExIDE0OjExOjMyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLXN1bm9zLmg6IHJlbW92ZSBleHRlcm4gdGltZSBkZWNsYXJhdGlvbgotCi1Nb24gT2N0IDExIDE2OjE0OjQzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfZmF0YWwpOiBEbyBtZW50aW9uIHRoYXQgaXQncyB0aGUgYXNzZW1ibGVyIHRoYXQKLQlnb3QgdGhlIGZhdGFsIGVycm9yLgotCi1GcmkgT2N0ICA4IDE0OjA5OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19ncHJtYXNrLCBtaXBzX2Nwcm1hc2spOiBOZXcgdmFyaWFibGVzIHRvCi0JaG9sZCByZWdpc3RlciBtYXNrcy4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIHRoZW0gdG8gemVyby4KLQkoYXBwZW5kX2luc24pOiBVcGRhdGUgbWlwc19ncHJtYXNrIGFuZCBtaXBzX2Nwcm1hc2suICBBbHNvIGFkZAotCXJlZ2lzdGVyIHZhcmlhYmxlcyBwaW5mbyBhbmQgcHJldl9waW5mby4KLQkqIGNvbmZpZy90Yy1taXBzLmggKG1pcHNfZ3BybWFzaywgbWlwc19jcHJtYXNrKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogSWYgVENfTUlQUywgc2V0IGdwcm1hc2sKLQlhbmQgY3BybWFzayBmcm9tIG1pcHNfZ3BybWFzayBhbmQgbWlwc19jcHJtYXNrLgotCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgVEFSR0VUX0ZPUk1BVCBpZiBPQkpfRUxGLgotCSogY29uZmlnL3RjLW1pcHMuYyAoR1BPUFQpOiBEZWZpbmUgaWYgT0JKX0VDT0ZGIG9yIE9CSl9FTEYuCi0JKHZhcmlvdXMpOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgdG8gR1AgcmVmZXJlbmNlcyB0byBhcHBseSBpZgotCUdQT1BULCBub3QgaWYgT0JKX0VDT0ZGLgotCShzX2NoYW5nZV9zZWMpOiBSZWFycmFuZ2Ugc29tZXdoYXQuICBJZiBPQkpfRUxGLCB1c2UgLnJvZGF0YQotCWluc3RlYWQgb2YgLnJkYXRhLiAgSWYgT0JKX0VMRiwgc2V0IHNlY3Rpb24gZmxhZ3MgZm9yIC5yb2RhdGEgYW5kCi0JLnNkYXRhIHNlY3Rpb25zLgotCShzX2ZyYW1lLCBzX2xvYywgc19tYXNrKTogQ29tbWVudCBvdXQgZW50aXJlIGZ1bmN0aW9ucywgcmF0aGVyCi0JdGhhbiBqdXN0IGJvZHkuICBUaGV5J3JlIG5vdCB1c2VkIGFueWhvdy4KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGNwdV90eXBlIHRvIG1pcHMgZm9yIG1pcHMqLiAgQWNjZXB0Ci0JbWlwcy0qLWVsZmwqIGFuZCBtaXBzLSotZWxmKi4KLQotVGh1IE9jdCAgNyAxODozNjoyOSAxOTkzICBNaWNoYWVsIE1laXNzbmVyICAobWVpc3NuZXJAb3NmLm9yZykKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBBbGxvdyB0aGUgYWxpZ25tZW50IGZpZWxkIHRvCi0Jbm90IGJlIHNwZWNpZmllZC4KLQotV2VkIE9jdCAgNiAxMzowMTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNvbnNfZml4X25ld19taXBzKTogTmV3IGZ1bmN0aW9uLiAgVHVybgotCUJGRF9SRUxPQ182NCBpbnRvIEJGRF9SRUxPQ18zMi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKFRDX0NPTlNfRklYX05FVyk6IERlZmluZS4KLQkoY29uc19maXhfbmV3X21pcHMpOiBEZWNsYXJlLgotCi0JQ2hhbmdlcyB0byBsZXQgY29ucyBoYW5kbGUgYmlnbnVtcyBsaWtlIGdlbmVyYWwgZXhwcmVzc2lvbnMuCi0JKiBleHByLmggKGV4cHJlc3Npb25TKTogTmV3IGZpZWxkIFhfdW5zaWduZWQuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJbml0aWFsaXplIFhfdW5zaWduZWQgdG8gMS4gIFNldCBpdCB0byAwIGZvcgotCXVuYXJ5IG1pbnVzIGNhc2UuCi0JKGV4cHIpIEZpeCB0eXBvIHJlc3VsdFAgdG8gcmlnaHQgaWYgbWlzc2luZyBvcGVyYW5kLiAgU2V0Ci0JWF91bnNpZ25lZCB0byAxIHdoZW4gYnVpbGRpbmcgbmV3IGV4cHJlc3Npb24uCi0JKiByZWFkLmMgKHBvdGFibGUpOiBNYWtlICJvY3RhIiBhbmQgInF1YWQiIGNhbGwgY29ucywgbm90Ci0JYmlnX2NvbnMuCi0JKGNvbnMpOiBIYW5kbGUgYmlnbnVtcy4gIElmIGdpdmVuIGFuIE9fY29uc3RhbnQgKHNtYWxsIGludGVnZXIpIHRvCi0JZmlsbCBhIGJpZyBzcGFjZSwgdHVybiBpdCBpbnRvIGEgYmlnbnVtLgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogU2V0IFhfdW5zaWduZWQgZmllbGQuCi0JKGJpZ251bV9sb3csIGJpZ251bV9saW1pdCwgYmlnbnVtX2hpZ2gsIGdyb3dfYmlnbnVtLCBiaWdfY29ucyk6Ci0JUmVtb3ZlZC4KLQkqIHJlYWQuaCAoYmlnX2NvbnMpOiBSZW1vdmUgcHJvdG90eXBlLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IERvbid0IGdpdmUgYSB3YXJuaW5nIGlmIGEKLQlzeW1ib2wgaW4gZXhwcl9zZWN0aW9uIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JKFNfU0VUX1ZBTFVFKTogQ2xlYXIgWF91bnNpZ25lZC4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogSWYgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgZmFpbGVkIG9uIGEKLQlzeW1ib2wgd2UgYXJlIHdyaXRpbmcgb3V0LCBnaXZlIGEgd2FybmluZy4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChwYXJzZV9yZWdsaXN0KTogU2V0IFhfdW5zaWduZWQuCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9wc2V1ZG9fdGFibGUpOiBDaGFuZ2UgIm9jdGEiIGFuZCAicXVhZCIgdG8KLQljYWxsIHBhX2NvbnMsIG5vdCBwYV9iaWdfY29ucy4KLQkocGFfYmlnX2NvbnMpOiBSZW1vdmUuCi0JKiBjb25maWcvdGMtaHBwYS5oIChwYV9iaWdfY29ucyk6IFJlbW92ZSBkZWNsYXJhdGlvbi4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSAicXVhZCIgdG8gY2FsbCBjb25zLAotCW5vdCBiaWdfY29ucy4KLQotVHVlIE9jdCAgNSAxMDo1MzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChDb3B5aW5nKTogbmV3IG5vZGUsIHRvIGhhbmRsZSB0aGUgcmVjZW50IGNoYW5nZXMKLQlpbiB0aGUgdGV4aW5mby9ncGwudGV4aW5mbyBmaWxlCi0KLU1vbiBPY3QgIDQgMTc6MTA6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGJpZ19jb25zKTogSGFuZGxlICIwIiBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogU2V0IHRhcmdldF9iaWdfZW5kaWFuIGNvcnJlY3RseS4KLQotTW9uIE9jdCAgNCAxNTozNzo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBNb2RlIDcuMyBvcGVyYW5kIHVzaW5nIFBDIHNob3VsZAotCWhhdmUgcGMtcmVsYXRpdmUgZml4dXAuCi0JKG1kX3BhcnNlX29wdGlvbik6IE1vdmUgIi1rIiBjYXNlIGRvd24gbmVhciAiLXBpYyIgY2FzZS4KLQotCSogY29uZmlndXJlLmluOiBBbHBoYWJldGl6ZSBsaXN0IG9mIGNwdSB0eXBlIGFsdGVybmF0aXZlcy4gIEVuYWJsZQotCU9TIHZhbHVlcyBvZiAibGludXgqZWxmKiIgYW5kICJsaW51eCpjb2ZmKiIgdG8gc2VsZWN0IHRob3NlCi0JZm9ybWF0cywgd2l0aCBsaW51eCBlbXVsYXRpb24uICBEb24ndCBib3RoZXIgY2hlY2tpbmcgZm9yIHVwcGVyLQotCW9yIG1peGVkLWNhc2UgdmVyc2lvbnMgb2YgIm9zZSIuCi0KLVRodSBTZXAgMzAgMTE6MDU6MzUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3o4ay5jIChtZF9wc2V1ZG9fdGFibGUpOiBhZGQgInVuc2VnIi4KLQotV2VkIFNlcCAyOSAxNjoxNToxMSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tODhrLW9wY29kZS5oIChtODhrX29wY29kZXMpOiBjb3JyZWN0IGEgZmV3IG1pc3Rha2VzCi0JICBmb3VuZCB3aGlsZSBleHRlbmRpbmcgdGhlIGRpc3Nhc3NlbWJsZXIuCi0KLVR1ZSBTZXAgMjggMTI6MDI6MDQgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFNwbGl0IGkzODYgTHlueE9TIG91dCBmcm9tIG90aGVyIGNvZmYgdGFyZ2V0cywKLQlhZGQgYSBzcGVjaWZpYyBMeW54IGVtdWxhdGlvbi4KLQlBZGQgbTY4ayBMeW54T1MgdGFyZ2V0LgotCSogY29uZmlnL3RjLWkzODYuYzogRGVmaW5lIHNwZWNpZmljIEx5bnggdGFyZ2V0IGZvcm1hdC4KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IERlZmluZSBzcGVjaWZpYyBMeW54IHRhcmdldCBmb3JtYXQuCi0JKiBjb25maWcvdGUtbHlueC5oOiBOZXcgZmlsZS4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IERvbid0IHNldCBUQVJHRVRfRk9STUFUIHRvIGJlCi0JImNvZmYte2kzODYsbTY4a30iIGlmIFRBUkdFVF9GT1JNQVQgYWxyZWFkeSBkZWZpbmVkLgotCShJTklUX1NUQUJfU0VDVElPTik6IERlZmluZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBJbmNsdWRlIDx0aW1lLmg+LgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IExvb2sgZm9yIC5zdGFiIHNlY3Rpb25zIGFuZCBjYWxsCi0JYWRqdXN0X3N0YWJfc2VjdGlvbi4KLQkoYWRqdXN0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwgZmlsbHMgaW4gdGhlIGZpcnN0IHN5bWJvbAotCW9mIGEgc3RhYiBzZWN0aW9uIHdpdGggbnVtYmVyIG9mIHN5bWJvbHMgYW5kIHN0cmluZyB0YWJsZSBzaXplLgotCShvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IE5ldyBmdW5jdGlvbiwgY3JlYXRlcyB0aGUgaW5pdGlhbAotCXN5bWJvbCBmb3IgYSBzdGFiIHNlY3Rpb24uCi0KLU1vbiBTZXAgMjcgMTU6MjE6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvYXRvZi12YXguYyAobWRfYXRvZik6IFJldHVybiBudWxsIG9uIHN1Y2Nlc3MgaW5zdGVhZCBvZgotCWVtcHR5IHN0cmluZy4KLQkqIGNvbmZpZy9hdG9mLXRhaG9lLmMgKG1kX2F0b2YpOiBEaXR0by4KLQkqIHJlYWQuYyAoZmxvYXRfY29ucyk6IEV4cGVjdCBhIG51bGwgcG9pbnRlciBmb3Igc3VjY2Vzcywgbm90IGFuCi0JZW1wdHkgc3RyaW5nLgotCi0JKiBoYXNoLmMgKGhhc2hfaW5zZXJ0LCBoYXNoX2phbSwgaGFzaF9ncm93KTogUmV0dXJuIG51bGwgcG9pbnRlcgotCW9uIHN1Y2Nlc3MsIGluc3RlYWQgb2YgZW1wdHkgc3RyaW5nLiAgQWxsIGNhbGxlcnMgY2hhbmdlZC4KLQotCSogY29uZmlnL3RjLXZheC5jOiBVc2UgUEFSQU1TIGluIGRlY2xhcmF0aW9ucy4KLQkodmlwX29wKTogVXNlIE5VTEwgaW5zdGVhZCBvZiBlbXB0eSBzdHJpbmcgZm9yIHN1Y2Nlc3MgaW4gZXJyb3IKLQlhbmQgd2FybmluZyBmaWVsZHMuCi0KLVN1biBTZXAgMjYgMjM6NDU6MjkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKGV4cHIpIFtESUZGX0VYUFJfT0tdOiBQZXJtaXQgc3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMKLQlpbiBkaWZmZXJlbnQgZGVmaW5lZCBzZWdtZW50cy4KLQotCSogd3JpdGUuYyAocmVsYXhfc2VnbWVudCk6IExvY2FsaXplICJhaW0iIHZhcmlhYmxlLiAgSWYKLQlESUZGX0VYUFJfT0ssIGRvbid0IGltcG9zZSBjaGVja3Mgb24gc3ltYm9sIHNlZ21lbnQgdHlwZXMuCi0JKGZpeHVwX3NlZ21lbnQpIFtESUZGX0VYUFJfT0tdOiBJZiBzdWJfc3ltYm9sUCBpcyBpbiB0aGUgY3VycmVudAotCXNlZ21lbnQsIGNvbnZlcnQgdG8gYSBQQy1yZWxhdGl2ZSBmaXh1cCBhbmQgZGlzY2FyZCB0aGUgc3ltYm9sLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChmbGFnX3dhbnRfcGljKTogTmV3IHZhcmlhYmxlLCBtb3N0bHkgaWdub3JlZC4KLQkobWRfcGFyc2Vfb3B0aW9uKSBbVEVfU1VOM106IFNldCBpdCBmb3IgIi1rIi4KLQkobTY4a19pcCk6IEdlbmVyYXRlIHByb3BlciBmaXh1cCBmb3IgbW9kZSA3LjMuCi0JKiBjb25maWcvdGMtbTY4ay5oIChESUZGX0VYUFJfT0spOiBEZWZpbmUuCi0KLVNhdCBTZXAgMjUgMDU6MDg6MTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19pbmNhbnQsIGdldG9uZSwgZ2V0dHdvKTogTW92ZWQKLQllYXJsaWVyIGluIHRoZSBmaWxlLgotCShpbnNvcCwgYWRkX2V4cCk6IE5vdyBkZWZpbmVkIGFzIGZ1bmN0aW9ucywgZm9yIHJlYWRhYmlsaXR5LgotCShpbnNvcCk6IE5vdyB0YWtlcyB0d28gYXJndW1lbnRzOyBjYWxsZXJzIGNoYW5nZWQuCi0KLUZyaSBTZXAgMjQgMTI6Mzc6NTkgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTg4ay5jIChnZXRfbzYpOiBuZXcgZnVuY3Rpb24uCi0JICAoZ2V0X2JmLCBnZXRfY21wLCBnZXRfY25kLCBnZXRfY3IsIGdldF9mY3IsIGdldF9pbW0xNiwgZ2V0X3JlZywKLQkgIGdldF92ZWM5LCBnZXR2YWwsIGdldF9wY3IsIGNhbGNvcCwgbWF0Y2hfbmFtZSk6IG1ha2Ugc3RhdGljIGFuZAotCSAgcHJvdG90eXBlLgotCSAgKHNfZmlsZSk6IHJlbW92ZSBleHRyYW5lb3VzIGZvcndhcmQgZGVjbC4KLQkgIChtZF9iZWdpbik6IGFkZCBjb25zdCB0byByZXR2YWwgZGVjbC4KLQkgIChjYWxjb3ApOiBjb3BlIHdpdGggaW5zdHJ1Y3Rpb25zIHdpdGhvdXQgYXJndW1lbnRzLiAgSGFuZGxlICdvJwotCSAgdHlwZSBhcmd1bWVudCwgdGhlIG82IGZpZWxkIG9mIHRoZSBwcm90IGluc24uCi0JICAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiByZXR1cm4gYSBkdW1teSB2YWx1ZS4KLQotCSogY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IGNvbW1lbnQgY2hhbmdlOyBvNiBmaWVsZCBpcwotCSAgaW4gYml0cyAxMCB0aHJvdWdoIDcuICBmbHQuW2R4c11zIHJlcXVpcmVzIGFuIHIgcmVnaXN0ZXIgaW4gdGhlCi0JICBzZWNvbmQgYXJndW1lbnQuICBOZXcgaW5zdHJ1Y3Rpb24gbGRhLnguICBOZXcgaW5zdHJ1Y3Rpb24gbXVscwotCSAgKGFsaWFzIGZvciBtdWwpLgotCi1GcmkgU2VwIDI0IDEzOjQzOjMwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlY3Vyc2UgbGlrZSBjbGVhbi4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogTmV3IHRhcmdldC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBTZXQgQkZEIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZQotCWJhc2VkIG9uIE1JUFMgSVNBIGxldmVsLgotCi1UaHUgU2VwIDIzIDE3OjU4OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAobWFpbik6ICJleGhhdXN0ZWQiLCBub3QgImV4aHVhc3RlZCIuCi0KLQkqIHN0cnVjLXN5bWJvbC5oIChzdHJ1Y3Qgc3ltYm9sKTogQWRkIHN5X3VzZWRfaW5fcmVsb2MgZmllbGQuCi0JKiB3cml0ZS5jIChhZGp1c3RfcmVsb2Nfc3ltcyk6IFNldCBzeV91c2VkX2luX3JlbG9jLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IE5ldmVyIHN0cmlwIHN5bWJvbHMgd2l0aCBzeV91c2VkX2luX3JlbG9jCi0Jc2V0LgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBSZXdyb3RlIHRvIGhhbmRsZSBib3RoCi0JU29sYXJpcyBhbmQgU1ZSNCBzdHlsZSAuc2VjdGlvbiBwc2V1ZG8tb3BzLgotCShvYmpfZWxmX2lkZW50KTogU2V0IFNFQ19SRUFET05MWSBmb3IgLmNvbW1lbnQgc2VjdGlvbi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJZiB0aGlzIGlzIEVMRiwgYW5kIHdlJ3JlCi0JZ2VuZXJhdGluZyBhIHJlbG9jLCBkb24ndCBhcHBseSBhIGZpeC4KLQotVGh1IFNlcCAyMyAxMzoxNjo1OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChyZWxheF9hbGlnbik6IE5vdyBzdGF0aWMuCi0KLU1vbiBTZXAgMjAgMTk6MjM6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBNYWtlIG5vbi1zdGF0aWMuICBNYWtlCi0JYXJndW1lbnRzIGNvbnN0LiAgRG9uJ3QgYWxpZ24gc3RyaW5ncyB0byA0IGJ5dGUgYm91bmRhcmllcy4KLQkqIHJlYWQuaDogRGVjbGFyZSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogU2V0IFNFQ19BTExPQyBhcyB3ZWxsIGFzCi0JU0VDX0xPQUQgZm9yIHByb2diaXRzIHNlY3Rpb24uCi0JKG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogY29uZmlnL29iai1lbGYuaCAoSU5JVF9TVEFCX1NFQ1RJT04pOiBDYWxsCi0Jb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbi4KLQkoT0JKX1BST0NFU1NfU1RBQik6IFJlbW92ZWQgZGVmaW5pdGlvbi4KLQotRnJpIFNlcCAxNyAxODoxMjozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfR0VUX1NJWkUpOiBEZWZpbmUuCi0JKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobGluZV9jb21tZW50X2NoYXJzKTogSW5pdGlhbGl6ZSBpbiBhbGwgY2FzZXMuCi0KLVRodSBTZXAgMTYgMTQ6MjM6MDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB0Yy5oOiBEZWNsYXJlIHRjX2dlbl9yZWxvYyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgdXBvbgotCVJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbik6IE9ubHkgc2V0IGZsYWdzIHdoZW4gZmlyc3QKLQljcmVhdGluZyB0aGUgc2VjdGlvbi4KLQotV2VkIFNlcCAxNSAxMjoxNTo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBhIHRyYXAgaW5zdHJ1Y3Rpb24KLQl3aXRoIGEgYnJhbmNoLgotCi1UdWUgU2VwIDE0IDEzOjMxOjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9kYXRhLCBvYmpfZWxmX3RleHQpOiBOZXcgZnVuY3Rpb25zOwotCXNldCBwcmV2aW91c19zZWN0aW9uIGFuZCBwcmV2aW91c19zdWJzZWN0aW9uIGFuZCB0aGVuIGNhbGwgc19kYXRhCi0JYW5kIHNfdGV4dCwgcmVzcGVjdGl2ZWx5LgotCShvYmpfcHNldWRvX3RhYmxlKTogQWRkIGRhdGEgYW5kIHRleHQuCi0JKG9ial9lbGZfc2VjdGlvbik6IEFkZCBTRUNfTE9BRCB0byBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mCi0JZmxhZ3MuICBUcmVhdCAucm9kYXRhMSBsaWtlIC5yb2RhdGEuICBTZXQgU0VDX0xPQUQgYXMgd2VsbCBhcwotCVNFQ19BTExPQyBmb3IgImFsbG9jIiBzdHJpbmcuICBEb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZpbmQgdGhlCi0Jc2VjdGlvbjsganVzdCB1c2Ugc3Vic2VnX25ldy4KLQotCSogcmVhZC5jIChjaGFuZ2VfdG9fc2VjdGlvbik6IFJlbW92ZWQuICBUaGlzIGlzIG5vdyBkb25lIGJ5Ci0Jc3Vic2VnX25ldy4KLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFJlYXJyYW5nZWQgc29tZXdoYXQuICBDcmVhdGUgdGhlIHNlY3Rpb24KLQl1c2luZyBzdWJzZWdfbmV3LiAgU3RvcmUgdGhlIHN0cmluZyBpbmRleCBpbiBzZWdfaW5mbywgcmF0aGVyIHRoYW4KLQlpbiBhIHN0YXRpYyB2YXJpYWJsZS4gIEZvcmNlIHRoZSBmaXJzdCBzdHJpbmcgdG8gYmUgZW1wdHkuICBVc2UKLQlmcmFnX21vcmUgcmF0aGVyIHRoYW4gRlJBR19BUFBFTkRfMV9DSEFSLgotCShzX3N0YWJfZ2VuZXJpYyk6IFJld3JvdGUuCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWRkZWQgc3RhYnUgdW5pb24uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBJbml0aWFsaXplIHN0YWJfc3RyaW5nX3NpemUgdG8gMC4KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBEb24ndCBpbmNsdWRlIGFvdXQvc3RhYl9nbnUuaC4KLQkob2JqX2FvdXRfc3RhYiwgb2JqX2FvdXRfZGVzYyk6IFJlbW92ZWQuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRlc2MgYW5kIHN0YWJYIGVudHJpZXMuCi0JKiBjb25maWcvb2JqLWJvdXQuYzogU2FtZSBjaGFuZ2VzIGFzIGNvbmZpZy9vYmotYW91dC5jLgotCSogY29uZmlnL29iai1ib3V0LmggKFNfU0VUX1RZUEUpOiBEZWZpbmUuCi0JKHRjX2JvdXRfZml4X3RvX2NoYXJzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zdGFiKTogUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgZGVzYyBhbmQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKTogRGVmaW5lLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGN1cnJlbnRfc3RhYl9zeW1ib2wpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9zeW1ib2xfdHlwZSk6IFJlbW92ZWQgbl9zdHJ4LCBuX3R5cGUsCi0Jbl9vdGhlciwgbl9kZXNjIGFuZCBuX3ZhbHVlIGZpZWxkcy4KLQkoU197UyxHfUVUX3tPRkZTRVQsT1RIRVIsVFlQRSxERVNDfSk6IFJlbW92ZWQuCi0JKE1BS0VfU1RBQl9TWU1CT0wpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfZWNvZmZfc3RhYik6IFJlbmFtZWQgdG8gZWNvZmZfc3RhYi4KLQlDaGFuZ2VkIGFyZ3VtZW50cyBhbmQgcmVtb3ZlZCBwYXJzaW5nIGNvZGUuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIHN0YWJYIGVudHJpZXMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKGVjb2ZmX3N0YWIpOiBEZWNsYXJlLgotCShPQkpfUFJPQ0VTU19TVEFCKTogRGVmaW5lLgotCSogY29uZmlnL29iai1lbGYuYzogRG9uJ3QgaW5jbHVkZSBhb3V0L3N0YWJfZ251LmguCi0JKG9ial9lbGZfc3RhYiwgb2JqX2VsZl94c3RhYiwgb2JqX2VsZl9kZXNjLAotCWVsZl9zdGFiX3N5bWJvbF9zdHJpbmcsIGVsZl9zdGFiX3N5bWJvbCwgb2JqX2VsZl9zdGFiX2dlbmVyaWMpOgotCVJlbW92ZWQuCi0JKG9ial9wc2V1ZG9fdGFibGUpOiBSZW1vdmVkIGRlc2MsIHN0YWJYIGFuZCB4c3RhYnMgZW50cmllcy4KLQkob2JqX2VsZl92ZXJzaW9uKTogVXNlIHN1YnNlZ19uZXcsIG5vdCBiZmRfbWFrZV9zZWN0aW9uLiAgRG9uJ3QKLQlzZXQgU0VDX0xPQUQgZm9yIC5ub3RlIHNlY3Rpb24uCi0JKGFkanVzdF9zdGFiX3NlY3Rpb25zKTogR2V0IGZyYWcgcG9pbnRlciBmcm9tIHNlZ19pbmZvLCByYXRoZXIKLQl0aGFuIGxvb2tpbmcgdGhyb3VnaCBmcmFncy4KLQkqIGNvbmZpZy9vYmotZWxmLmggKFNfe1MsR31FVF97T1RIRVIsVFlQRSxERVNDfSk6IFJlbW92ZWQuCi0JKFNFUEFSQVRFX1NUQUJfU0VDVElPTlMsIElOSVRfU1RBQl9TRUNUSU9OLCBPQkpfUFJPQ0VTU19TVEFCKToKLQlEZWZpbmUuCi0JKiBjb25maWcvb2JqLXZtcy5jIChvYmpfYW91dF9zdGFiKTogUmVtb3ZlZC4KLQkob2JqX3BzZXVkb190YWJsZSk6IFJlbW92ZWQgc3RhYlggZW50cmllcy4KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNfU0VUX1RZUEUpOiBEZWZpbmUuCi0KLQkqIGFzLmg6IERlY2xhcmUgbGlzdGluZy4KLQkqIHJlYWQuYzogRG9uJ3QgZGVjbGFyZSBsaXN0aW5nLgotCShlbWl0X2V4cHIpOiBDYXN0IGZpeF9uZXdfZXhwIGFyZ3VtZW50LgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogQ29ycmVjdCBwcmludGYgZm9ybWF0LgotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkqIHdyaXRlLmg6IERlY2xhcmUgdGV4dF9sYXN0X2ZyYWcgYW5kIGRhdGFfbGFzdF9mcmFnLgotCSogY29uZmlnL29iai1ib3V0LmMgKG9ial9ib3V0X2xpbmUpOiBBZGRlZCBkdW1teSBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBBZGQgc29tZSBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWk5NjAuYzogTGlrZXdpc2UuICBBbHNvIGZ1bGx5IGJyYWNrZXQgc3RydWN0dXJlCi0JaW5pdGlhbGl6YXRpb25zLCBmaXggcHJpbnRmIGZvcm1hdHMsIGFuZCByZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4KLQotTW9uIFNlcCAxMyAxNjo0ODozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19kZXNjKTogT25seSBjb21waWxlIGFuZCB1c2UgaWYgU19TRVRfREVTQyBpcyBkZWZpbmVkLgotCSogc3RydWMtc3ltYm9sLmg6IERlY2xhcmUgdmVyaWZ5X3N5bWJvbF9jaGFpbiBhbmQKLQl2ZXJpZnlfc3ltYm9sX2NoYWluXzIgZXZlbiBpZiBub3QgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUy4KLQkqIHN5bWJvbHMuYyAodmVyaWZ5X3N5bWJvbF9jaGFpbik6IFJlbW92ZWQgdXNlbGVzcyBleHByZXNzaW9uLgotCSogd3JpdGUuYyAoaGVhZGVycywgdGhlX29iamVjdF9maWxlKTogT25seSB1c2UgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUiBhbmQgbm90IEJGRC4KLQkoZml4dXBfc2VnbWVudCwgY3ZzX2ZyYWdfdG9fZmlsbCk6IE9ubHkgdXNlIGlmIEJGRF9BU1NFTUJMRVIgb3IKLQlub3QgQkZELgotCShtZXJnZV9kYXRhX2ludG9fdGV4dCk6IE9ubHkgdXNlIGlmIEJGRF9BU1NFTUJMRVIgb3IgKG5vdCBCRkQgYW5kCi0Jbm90IE9CSl9BT1VUKS4KLQkqIHdyaXRlLmg6IERlY2xhcmUgcmVsYXhfc2VnbWVudC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChzdGFja19wb3AsIHN0YWNrX3B1c2gsIHN0YWNrX2luaXQpOiBNYWRlCi0Jc3RhdGljLgotCShzdGFja190b3ApOiBDb21tZW50ZWQgb3V0LCBzaW5jZSBpdCdzIG5vdCB1c2VkLgotCUZpeGVkIHVwIHBzZXVkby1vcCBmdW5jdGlvbnMgdG8gdGFrZSBhbiBpZ25vcmVkIGludCBhcmd1bWVudC4KLQkoc2l6ZV9zZWN0aW9uKTogQWRkZWQgZGVmYXVsdCBCQURfQ0FTRSB0byBzd2l0Y2guCi0JQ2hhbmdlZCBiemVybyBjYWxscyB0byBtZW1zZXQuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoU19JU19MT0NBTCk6IENhbGwgc3RyY2hyIG9uIFNfR0VUX05BTUUKLQkocyksIG5vdCBvbiBzIGl0c2VsZi4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKHNfdXNlKTogVGFrZSBpZ25vcmVkIGludCBhcmd1bWVudC4gIE9ubHkKLQlkZWZpbmUgaWYgT0JKX0NPRkYgaXMgbm90IGRlZmluZWQuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiAoZml0c19pbl9zaWduZWRfYnl0ZSwgc21hbGxlc3RfaW1tX3R5cGUpOiBNYWtlCi0JYXJndW1lbnQgc2lnbmVkIGFnYWluLgotCSogY29uZmlnL3RjLW02OGsuYyAoc19ic3MsIHNfZXZlbiwgc19wcm9jKTogVGFrZSBpZ25vcmVkIGludAotCWFyZ3VtZW50LgotCShtNjhrX2lwKTogRnVsbHkgYnJhY2tldCBpbml0aWFsaXphdGlvbiBvZiBhcmNocy4KLQlDb3JyZWN0IHNldmVyYWwgZm9ybWF0cyBmb3IgX19MSU5FX18gdG8gYmUgJWQgcmF0aGVyIHRoYW4gJXMuCi0JKGluaXRfdGFibGUpOiBGdWxseSBicmFja2V0IGluaXRpYWxpemF0aW9uLgotCUNhc3QgdmFsdWVzIGxhcmdlciB0aGFuIDB4N2YgYXNzaWduZWQgdG8gZnJfb3Bjb2RlIHRvIGNoYXIuCi0KLQkqIHN1YnNlZ3MuYzogUmVuYW1lZCBub24tQkZEX0FTU0VNQkxFUiBzdWJzZWdfbmV3IHRvIHN1YnNlZ19zZXQuCi0JV3JvdGUgbm9uLUJGRF9BU1NFTUJMRVIgc3Vic2VnX25ldy4gIE5vdyBzdWJzZWdfbmV3IGFsd2F5cyB0YWtlcyBhCi0Jc2VjdGlvbiBuYW1lLCBhbmQgc3Vic2VnX3NldCBhbHdheXMgdGFrZXMgYSBzZWdULiAgQ2hhbmdlZCBhbGwKLQljYWxsZXJzIGFzIGFwcHJvcHJpYXRlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgIChjaGFuZ2VfdG9fc2VjdGlvbik6IFJlbmFtZWQgdG8KLQlvYmpfY29mZl9hZGRfc2VnbWVudC4gIENvcnJlY3RlZC4gIE1hZGUgY2FsbGVycyB1c2Ugc3Vic2VnX25ldy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oIChvYmpfc2VnbWVudF9uYW1lLCBvYmpfYWRkX3NlZ21lbnQpOgotCURlZmluZS4KLQotTW9uIFNlcCAxMyAxMzoxNTowMyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpOiBSZW1vdmUgdGVzdCBmb3IgbmFtZVswXSA9PSAnTCcuCi0KLUZyaSBTZXAgMTAgMTE6MjI6MDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX1NFVF9TSVpFKTogQWN0dWFsbHkgc2V0IHRoZSBzaXplLgotCi0JR2NjIGxpbnQuCi0JKiBBZGRlZCBhIG51bWJlciBvZiBjYXN0cyB0byBmdW5jdGlvbiBjYWxscy4KLQkqIGFwcC5jIChkb19zY3J1Yl9iZWdpbiksIGFzLmMgKG1haW4pLCBleHByLmMgKGludGVnZXJfY29uc3RhbnQsCi0Jb3BlcmFuZCwgZXhwciksIHJlYWQuYyAocmVhZF9iZWdpbiwgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZLAotCXJlYWRfYV9zb3VyY2VfZmlsZSwgc19hbGlnbl9ieXRlcywgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSwKLQlpZ25vcmVfcmVzdF9vZl9saW5lLCBiaWdfY29ucywgaXNfaXRfZW5kX29mX3N0YXRlbWVudCwgc19pZ25vcmUpLAotCXJlYWQuaCAoaXNfbmFtZV9iZWdpbm5lciwgaXNfcGFydF9vZl9uYW1lKSwgY29uZmlnL29iai1lbGYuYwotCShvYmpfZWxmX3NlY3Rpb24pLCBjb25maWcvdGMtaTM4Ni5jIChwYXJzZV9yZWdpc3RlciksCi0JY29uZmlnL3RjLXNwYXJjLmMgKGlzb2N0YWwsIHNfcHJvYyk6IENhc3QgY2hhcgotCWFycmF5IGluZGljZXMgdG8gdW5zaWduZWQgY2hhci4KLQkqIGFwcC5jIChwcm9jZXNzX2VzY2FwZSk6IE1ha2Ugc3RhdGljLiAgQWRkIHByb3RvdHlwZS4gIENoYW5nZQotCWFyZ3VtZW50IGZyb20gY2hhciB0byBpbnQuCi0JKiBhcy5jOiBJbmNsdWRlIG91dHB1dC1maWxlLmggZm9yIHByb3RvdHlwZXMuICBDb21tZW50IG91dCB1bnVzZWQKLQlmdW5jdGlvbiBnb3Rfc2lnLgotCSogTWFrZWZpbGUuaW4gKGFzLm8pOiBEZXBlbmQgb24gb3V0cHV0LWZpbGUuaC4KLQkqIGFzLmggKEJBRF9DQVNFKTogQ2FzdCB2YWwgYXJndW1lbnQgdG8gbG9uZywgYW5kIHVzZSAlbGQuCi0JKHBzZXVkb190eXBlUyk6IEFkZCBwcm90b3R5cGUgdG8gcG9jX2hhbmRsZXIgZmllbGQuCi0JKHByaW50X3ZlcnNpb25faWQpOiBBZGQgcHJvdG90eXBlLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IENoYW5nZSBzaXplIGFyZ3VtZW50cyB0byB1bnNpZ25lZCBsb25nLgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGQgcHJvdG90eXBlcyBmb3IgZnVuY3Rpb24gYXJndW1lbnRzLgotCShoYWRfZXJyb3JzLCBoYWRfd2FybmluZ3MsIHNjcnViX2Zyb21fZmlsZSk6IFJlbW92ZSBkdXBsaWNhdGUKLQlkZWNsYXJhdGlvbnMuCi0JKiBhdG9mLWdlbmVyaWMuYyAoYXRvZl9nZW5lcmljKTogTWFrZSBzaXplIHZhcmlhYmxlcyB1bnNpZ25lZC4KLQkqIGNvbmQuYyAoaWdub3JlX2lucHV0KTogUmVtb3ZlZCB1bnVzZWQgbG9jYWwgdmFyaWFibGUgcHRyLgotCSogZXhwci5jIChmbG9hdGluZ19jb25zdGFudCwgaW50ZWdlcl9jb25zdGFudCk6IE1ha2Ugc3RhdGljLiAgQWRkCi0JcHJvdG90eXBlcy4KLQkqIGZsb251bS1jb3B5LmMgKGZsb251bV9jb3B5KTogTWFrZSBzaXplIHZhcmlhYmxlcyB1bnNpZ25lZC4KLQkqIGZyYWdzLmg6IEFkZCBwcm90b3R5cGUgZm9yIGZyYWdfaW5pdC4KLQkqIGhhc2guaCwgaGFzaC5jOiBDaGFuZ2UgaGFzaCB2YWx1ZXMgZnJvbSBjaGFyICogdG8gUFRSLCBtYWtlIGhhc2gKLQlzdHJpbmdzIGNvbnN0LCBtYWtlIHJldHVybmVkIGVycm9yIHN0cmluZ3MgY29uc3QgY2hhciAqLiAgQWRkZWQKLQlwcm90b3R5cGVzIGZvciBmdW5jdGlvbnMuCi0JKiBpbnB1dC1maWxlLmgsIGlucHV0LWZpbGUuYyAoaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSk6IFJldHVybgotCXVuc2lnbmVkIGludC4KLQkqIGlucHV0LXNjcnViLmMgKGJ1ZmZlcl9sZW5ndGgpOiBNYWtlIHVuc2lnbmVkLgotCShpbnB1dF9zY3J1Yl9wdXNoLCBpbnB1dF9zY3J1Yl9wb3ApOiBNYWtlIHN0YXRpYy4KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBDYXN0IHNwcmludGYgYXJndW1lbnQgdG8gdW5zaWduZWQKLQlsb25nIGFuZCB1c2UgJWx4LiAgUHJpbnQgbmFtZSBvZiBzZWdtZW50IHJhdGhlciB0aGFuIGFkZHJlc3Mgb2YKLQlzdHJ1Y3R1cmUuCi0JKGxpc3RpbmdfbGlzdCwgbGlzdGluZ190aXRsZSk6IENoYW5nZSBhcmd1bWVudCB0byBpbnQuCi0JKGxpc3RpbmdfZWplY3QsIGxpc3RpbmdfZmxhZ3MsIGxpc3RpbmdfcHNpemUpOiBBZGQgaW50IGFyZ3VtZW50LgotCSogbGlzdGluZy5oOiBDb3JyZXNwb25kaW5nIGRlY2xhcmF0aW9uIGNoYW5nZXMuCi0JKiBvYmouaCAob2JqX2VtaXRfc3ltYm9scyk6IFJlbmFtZSBwcm90b3R5cGUgYXJndW1lbnQgdG8gYXZvaWQKLQlzaGFkb3dpbmcuCi0JKiByZWFkLmg6IENoYW5nZSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiBwcm90b3R5cGUgdG8gcmV0dXJuCi0Jb2Zmc2V0VC4gIEFkZCBwcm90b3R5cGUgZm9yIG5leHRfY2hhcl9vZl9zdHJpbmcuICBWYXJpb3VzCi0JcHJvdG90eXBlIGNoYW5nZXMuCi0JKiByZWFkLmM6IFJlbW92ZSBwcm90b3R5cGUgZm9yIG5leHRfY2hhcl9vZl9zdHJpbmcuCi0JKHBvYmVnaW4pOiBNYWtlIGVycnR4dCBjb25zdC4gIE1ha2UgbmV3X2xlbmd0aCwgdG1wX2xlbiBhbmQgbnVtCi0JdW5zaWduZWQuCi0JKHNfYWJvcnQsIHNfYWxpZ25fcHR3bywgc19jb21tLCBzX2RhdGEsIHNfYXBwX2xpbmUsIHNfZmlsbCwKLQlzX2dsb2JsLCBzX2xzeW0sIHNfb3JnLCBzX3NldCwgc190ZXh0LCBzX2Rlc2MpOiBBZGQgaW50IGFyZ3VtZW50LgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoc19jb21tKTogQ2hhbmdlIHRlbXAgZnJvbSB2YWx1ZVQgdG8gb2Zmc2V0VC4gIENhc3QgdG8gbG9uZyB3aGVuCi0JcHJpbnRpbmcgYW5kIHVzZSAlbGQgKG9ubHkgZm9yIGVycm9yIG1lc3NhZ2VzIGFueWhvdykuCi0JKHNfbG9uZywgc19pbnQpOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9ucy4KLQkoY29ucyk6IENoYW5nZSBhcmd1bWVudCB0byBpbnQuCi0JKGVtaXRfZXhwcik6IFVzZSAlbHggd2hlbiBwcmludGluZyBsb25ncy4KLQkoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24pOiBSZXR1cm4gb2Zmc2V0VCwgbm90IGxvbmcuCi0JKGdldF9zdGFiX3N0cmluZ19vZmZzZXQpOiBDb21tZW50IG91dCB1bmxlc3MKLQlTRVBBUkFURV9TVEFCX1NFQ1RJT05TLgotCShzX3N0YWJfZ2VuZXJpYyk6IFJlbW92ZSB1bnVzZWQgb2Zmc2V0LiAgRGVmaW5lIHNlZ19pc19uZXcgb25seQotCWlmIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMuICBVc2UgdG9QIG9ubHkgaW4gbG9jYWwgYmxvY2suCi0JKiBzdHJ1Yy1zeW1ib2wuaCAodmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogQWRkIHByb3RvdHlwZS4KLQkqIHN5bWJvbHMuYzogUmVtb3ZlIG5lc3RlZCBjb21tZW50LgotCShzeW1ib2xfbmV3KTogUmVuYW1lIHZhbHVlIHRvIHZhbHUuCi0JKGNvbG9uKTogVXNlICVsZCBhbmQgY2FzdCB0byBsb25nIGluIGVycm9yIG1lc3NhZ2UuCi0JKiBzeW1ib2xzLmg6IFJlbW92ZSBkdXBsaWNhdGUgdmVyaWZ5X3N5bWJvbF9jaGFpbiBkZWNsYXJhdGlvbi4KLQkqIHRjLmg6IFJlbW92ZSB1bnVzZWQgbWRfZW1pdF9yZWxvY2F0aW9ucyBkZWNsYXJhdGlvbi4KLQkodGNfZ2VuX3JlbG9jKTogQWRkIGRlY2xhcmF0aW9uLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IENoYW5nZSBmaXJzdCBhcmd1bWVudCBuYW1lIGRlcGVuZGluZwotCW9uIEJGRF9BU1NFTUJMRVIuCi0JKHdyaXRlX3JlbG9jcyk6IFJlbW92ZSB1bnVzZWQgb2Zmc2V0LCBmcmFncy4gIFJlbW92ZSB0Y19nZW5fcmVsb2MKLQlkZWNsYXJhdGlvbnMuICBNYWtlIG4gdW5zaWduZWQuCi0JKHdyaXRlX2NvbnRlbnRzKTogUmVtb3ZlIHVudXNlZCBpLCBuLCByZWxvY3MsIGZpeHAuICBSZW5hbWUgZnJhZ3MKLQl0byBmIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBEZWZpbmUgZnJhZ1Agb25seSBpZiBub3QgQkZEX0FTU0VNQkxFUiBvciBub3QKLQlXT1JLSU5HX0RPVF9XT1JELiAgUmVtb3ZlIHVudXNlZCBrZWVwLiAgT25seSBkZWNsYXJlIHB1bnQgYW5kCi0JcHVudF9pdCBpZiB0aGV5IHdpbGwgYmUgdXNlZC4gIE1ha2UgaSBhbmQgbiB1bnNpZ25lZC4KLQkoZml4dXBfc2VnbWVudCk6IENhc3QgdG8gbG9uZyBhbmQgdXNlICVsZCBpbiBlcnJvciBtZXNzYWdlLgotCSogeG1hbGxvYy5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IE1ha2Ugc2l6ZSBhcmd1bWVudCB1bnNpZ25lZC4KLQkqIGNvbmZpZy9vYmotYW91dC5oOiBSZW1vdmUgbmVzdGVkIGNvbW1lbnQuICBBZGQgcHJvdG90eXBlIGZvcgotCW9ial9hb3V0X2Zyb2Jfc3ltYm9sLgotCShvYmpfYW91dF9saW5lLCBvYmpfYW91dF9kZXNjKTogQWRkIGludCBhcmd1bWVudC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYzogQ2hhbmdlZCBidWlsZCByb3V0aW5lcyB0byB1c2UgYW4gdW5zaWduZWQKLQlvZmZzZXQuCi0JKGFkZF9zdHJpbmcpOiBNYWtlIGxlbiB1bnNpZ25lZCBsb25nLgotCShvYmpfZWNvZmZfc3RhYik6IFVzZSAlbHUgaW4gZXJyb3IgbWVzc2FnZS4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfY29tbW9uKTogQ29tbWVudCBvdXQgdW51c2VkIGxhYmVsCi0JYWxsb2NhdGVfYnNzLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogUmV0dXJuIDAgKGN1cnJlbnRseSBicm9rZW4pLgotCShvYmpfZWxmX2Rlc2MsIG9ial9lbGZfdmVyc2lvbiwgb2JqX2VsZl9zaXplLCBvYmpfZWxmX3R5cGUsCi0Jb2JqX2VsZl9pZGVudCwgb2JqX2VsZl93ZWFrLCBvYmpfZWxmX2xvY2FsLCBvYmpfZWxmX2NvbW1vbiwKLQlvYmpfZWxmX2xpbmUsIG9ial9lbGZfcHJldmlvdXMpOiBBZGQgaW50IGFyZ3VtZW50LgotCShvYmpfZWxmX3dyaXRlX3N5bWJvbF9wKTogTWFrZSBzdGF0aWMuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX3dyaXRlX3N5bWJvbCk6IEFkZCBwcm90b3R5cGUuCi0JKiBjb25maWcvdGMtaHBwYS5oOiBSZW1vdmUgZGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbgotCXJlYWQuaC4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKEVOQ09ERV9SRUxBWF9TVEFURSk6IENhc3QgdG8gcmVsYXhfc3Vic3RhdGVULgotCShzX2Jzcyk6IEFkZCBpbnQgYXJndW1lbnQuCi0JKGZpdHNfaW5fc2lnbmVkX2J5dGUsIHNtYWxsZXN0X2ltbV90eXBlKTogTWFrZSBhcmd1bWVudCB1bnNpZ25lZC4KLQkoZHVtbXkpOiBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IFJlbmFtZSBsb2NhbCBvIHRvIG9wIHRvIGF2b2lkIHNoYWRvd2luZy4KLQkodGNfZ2VuX3JlbG9jKTogUmVuYW1lIGxvY2FsIHJlbG9jIHRvIHJlbCB0byBhdm9pZCBzaGFkb3dpbmcuCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2RhdGExLCBzX2RhdGEyKTogQWRkIGludCBhcmd1bWVudC4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXAsIG1kX2FwcGx5X2ZpeCk6IENhc3QgdG8gbG9uZyBhbmQgdXNlCi0JJWxkIGluIGVycm9yIG1lc3NhZ2VzLgotCSogY29uZmlnL3RjLXNwYXJjLmM6IFJlbW92ZSBkdXBsaWNhdGUgZGVjbGFyYXRpb25zLgotCShnZXRFeHByZXNzaW9uKTogUmV3cml0ZSBjb25kaXRpb24gdG8gYXZvaWQgZW1wdHkgY29uZGl0aW9uYWwKLQlib2R5LgotCShzX3JlZywgc19wcm9jLCBzX3Jlc2VydmUsIHNfY29tbW9uLCBzX3NlZywgc194d29yZCk6IEFkZCBpbnQKLQlhcmd1bWVudC4KLQotVGh1IFNlcCAgOSAxNzoxMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXc6Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX2Fzc2VtYmxlKTogRml4IHR5cG8uCi0JKHBhX2lwKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGxhYmVscy4gIERvIG5vdCBjaGVjayBmb3IKLQl1bnNpZ25lZCB2YWx1ZXMgYmVpbmcgPCAwLCBpdCBjYW4ndCBoYXBwZW4uCi0JKGlzX3NhbWVfZnJhZyk6IFJldHVybiBhIHZhbHVlIGluIHJlY3Vyc2l2ZSBjYWxsIGNhc2UuCi0JKHBhX2NhbGxpbmZvKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZXMgYW5kIGxhYmVscy4KLQkocGFfY29tbSk6IExpa2V3aXNlLgotCShwYV9jb3B5cmlnaHQpOiBMaWtld2lzZS4KLQkocGFfZXhwb3J0KTogTGlrZXdpc2UuCi0JKHBhX2ltcG9ydCk6IExpa2V3aXNlLgotCShwYV9wYXJhbSk6IExpa2V3aXNlLgotCShwYV9zcGFjZSk6IExpa2V3aXNlLgotCShwYV9zdWJzcGFjZSk6IExpa2V3aXNlLgotCi1UaHUgU2VwICA5IDE1OjA1OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0LCBzX3N0YWJfZ2VuZXJpYyk6IElmCi0JQkZEX0FTU0VNQkxFUiwgY2FsbCBzdWJzZWdfc2V0IHJhdGhlciB0aGFuIHN1YnNlZ19uZXcuCi0KLVdlZCBTZXAgIDggMTU6MDk6MTcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBTZXQgU0VDX0xPQUQgd2hlbiB1c2luZwotCWRlZmF1bHQgZmxhZyB2YWx1ZXMuCi0KLVR1ZSBTZXAgIDcgMTA6MjI6NTIgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiByZWFkLmM6IChjaGFuZ2VfdG9fc2VjdGlvbik6IERvbid0IGluY2x1ZGUgYm9keSBpZiBub3QgTUFOWV9TRUNUSU9OUy4KLQotCSogcmVhZC5jOiAoc19zdGFiLCBzX3hzdGFiLCBzX2Rlc2MpOiBOZXcgZnVuY3Rpb25zIHRvIHBhcnNlCi0JdmFyaW91cyBzdGFiLXJlbGF0ZWQgZGlyZWN0aXZlcy4KLQkqIHJlYWQuaDogKHNfc3RhYiwgc194c3RhYiwgc19kZXNjKTogTmV3IGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiB3cml0ZS5jOiAobWVyZ2VfZGF0YV9pbnRvX3RleHQpOiBGaXggaWZkZWYgdGFuZ2xlLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGN1cnJlbnRfc3RhYl9zeW1ib2wpOiBGYWtlIHN5bWJvbAotCWZvciBzdGFiIHJlYWRlciB0byB1c2UuCi0JKiBjb25maWcvb2JqLWNvZmZiZmRoLmggKG9ial9zeW1ib2xfdHlwZSk6IEFkZGVkIGZpZWxkcyBmb3IKLQlzdGFiIHJlYWRlciwgbWFjcm9zIHRvIGFjY2Vzcy4KLQotRnJpIFNlcCAgMyAxNjo0NDowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9zeW1ib2wpOiBObyBsb25nZXIgc3BlY2lhbC1jYXNlZCBvbgotCXNwYXJjdjksIHNpbmNlIGVsZl9zeW1ib2xfdHlwZSBpcyBub3cgaW5kZXBlbmRlbnQgb2Ygc2l6ZS4KLQotCSogY29uZmlnL29iai1lbGYuaCAoZWxmX3N5bWJvbCk6IEZpeGVkIG5hbWUgb2YgZWxmX3N5bWJvbF90eXBlLgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChzdHJ1Y3QgZGVmYXVsdF9zdWJzcGFjZV9kaWN0LCBzdHJ1Y3QKLQlkZWZhdWx0X3NwYWNlX2RpY3QpOiBGaWVsZCAic29ydCIgaXMgbm93IHVuc2lnbmVkIGNoYXIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMsIHBhX2RlZl9zcGFjZXMpOiBBbGlnbgotCWNvbHVtbnMgZm9yIGVhc2llciByZWFkaW5nLgotCShiY21wLCBpbmRleCk6IERlbGV0ZWQgVVNHLXNwZWNpZmljIGRlZmluaXRpb25zLiAgU2hvdWxkIGJlIGRlYWx0Ci0Jd2l0aCBpbiBoby0qLmgsIG9yIGluIGxpYmliZXJ0eS4gIENoYW5nZWQgbWVudGlvbiBvZiBpbmRleCB0bwotCXN0cmNoci4KLQkobGFiZWxfc3ltYm9sUCwgbGFiZWxfc3ltYm9sX2RlZmluZWQsIGNhbGxpbmZvX2ZvdW5kLAotCXdpdGhpbl9lbnRyeV9leGl0LCBleGl0X3Byb2Nlc3NpbmdfY29tcGxldGUsIHdpdGhpbl9wcm9jZWR1cmUsCi0JcGFfZGVmX3N1YnNwYWNlcywgcGFfZGVmX3NwYWNlcywgcGFfcHNldWRvX29wX21vdmVzX3BjLAotCWxhYmVsX3N5bWJvbHNfcm9vdFAsIHBhX2dldF9sYWJlbCwgcGFfbGFiZWxfaXNfZGVmaW5lZCwKLQlwYV91bmRlZmluZV9sYWJlbCk6IE5vdyBzdGF0aWMuCi0JKG1vdmVycyk6IE5vdyBjb25zdCwgaW4gYWRkaXRpb24gdG8gcG9pbnRpbmcgdG8gY29uc3QgZGF0YS4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKGxhYmVsX3N5bWJvbFNfcm9vdFAsIHBhX2dldF9sYWJlbCwKLQlwYV9sYWJlbF9pc19kZWZpbmVkLCBwYV91bmRlZmluZV9sYWJlbCwgcGFfcHNldWRvX29wX21vdmVzX3BjKToKLQlEZWxldGUgZGVjbGFyYXRpb25zLgotCi0JTWVyZ2VkIG1vcmUgY2hhbmdlcyBmcm9tIEplZmYgTGF3IGFuZCBQZXRlIEhvb2dlbmJvb206Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2RlZl9zdWJzcGFjZXMsIHBhX2RlZl9zdWJzcGFjZXMpOiBSZW1vdmUKLQllbnRyaWVzIGZvciAuc3RhYiBhbmQgLnN0YWJzdHIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogIFNldCB0aGUKLQlTRUNfTE9BRCBhdHRyaWJ1dGUgZm9yIHRoZSAuc3RhYnN0ciBzZWN0aW9uLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6ICBTZXQgdGhlIFNFQ19MT0FEIGF0dHJpYnV0ZSBmb3IgdGhlCi0JLnN0YWIgc2VjdGlvbi4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiAgQ2hhbmdlICcjaWYgMScgdG8gJyNpZiAwJy4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiAgSW5jb3JyZWN0IGJ5dGUgY291bnQgb24gY2FsbCB0bwotCW1kX251bWJlcl90b19jaGFycyBmdW5jdGlvbi4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoaHBwYV90Y19zeW1ib2wpOiBTdGF0aWMgZnVuY3Rpb25zIG5lZWQKLQlhcmd1bWVudCByZWxvY2F0aW9uIGJpdHMgdG9vLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zdHJpbmdlcik6IENvcnJlY3RseSBoYW5kbGUgZXNjYXBpbmcKLQljaGFyYWN0ZXJzIHdoaWNoIHNob3VsZCBhcHBlYXIgdW5hbHRlcmVkIGluIHRoZSBvdXRwdXQgc3RyaW5nIChmb3IKLQlleGFtcGxlIGFuIGVzY2FwZWQgZG91YmxlLXF1b3RlKS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIpOiBBbHdheXMKLQlpbml0aWFsaXplIG5hbWUuCi0JKHBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhKTogUmVtb3ZlIHByb3RvdHlwZQotCWZvciBub3cuCi0JKGNvbnNfZml4X25ld19ocHBhKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBGaXggdHlwZSBvZiB2YWxwIHRvIG1hdGNoCi0JcHJvdG90eXBlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBJbmNsdWRlIGxpYmhwcGEuaC4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogRGVsZXRlIGV4dGVybiBkZWNsYXJhdGlvbnMgb2YgZnVuY3Rpb25zCi0JZm91bmQgaW4gbGliaHBwYS5oLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYV9zcGFjZSk6IFJld29yayB0byBhdm9pZCB1bndhbnRlZCAjaWZkZWYKLQlPQkpfRUxGIGNvbmRpdGlvbmFscy4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKExPQ0FMX0xBQkVMKTogQ29ycmVjdGx5IGlkZW50aWZ5IGxvY2FsIGxhYmVscwotCW9uIHRoZSBQQS4KLQotVGh1IFNlcCAgMiAxMDo0Mzo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogQWNjZXB0ICd6JywgYW5kIGlnbm9yZSBpdC4KLQkobWFjcm8pOiBVc2UgInoscyx0IiBmb3IgZGl2IGluc3RydWN0aW9ucyB0byBtYXRjaCBjb3JyZXNwb25kaW5nCi0JY2hhbmdlIGluIG9wY29kZSB0YWJsZS4KLQkobWlwc19pcCk6IEFkZGVkICd6Jy0tbXVzdCBiZSB6ZXJvIHJlZ2lzdGVyLgotCi1XZWQgU2VwICAxIDE1OjU2OjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfcmVsb2NzKSBbUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFXTogRGVjbGFyZQotCXRjX2dlbl9yZWxvYyBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICJjYXNlIiBpbnN0ZWFkIG9mICJpZiIgd2hlbiBwb3NzaWJsZS4gIFJld3JvdGUKLQlNYWtlZmlsZSBlZGl0aW5nIHRvIHJlZHVjZSB3b3JrIGRvbmUuICBUcmVhdCAiaHBwYSoiIGFzICJocHBhIi4KLQotV2VkIFNlcCAgMSAxMjoxOTowNyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9zZWN0aW9uKTogYWRkICdkJyBhcyBhbiBhbGlhcyBmb3IKLQkgIHNlY3Rpb24gdHlwZSBvZiBkYXRhLiAgJ2QnIHNlZW1zIHRvIGJlIHVzZWQgZm9yIG04OGsuCi0KLVdlZCBBdWcgMjUgMjI6MzM6MjIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2FsaWduLCBzX3N0cmluZ2VyLCBzX2NvbnMsIHNfZmxvYXRfY29ucywKLQlzX21pcHNfc3BhY2UpOiBTZXQgaW5zbl9sYWJlbCB0byBOVUxMIHRvIGF2b2lkIGNoYW5naW5nIGl0IGF0IHRoZQotCW5leHQgLmFsaWduIHN0YXRlbWVudC4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGphbCB3aXRoIGluc3RydWN0aW9uIHRoYXQgc2V0cyB0aGUKLQlyZWdpc3RlciB0aGF0IGphbCBzZXRzLgotCi1XZWQgQXVnIDI1IDE2OjE1OjU3IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgbTg4MTEwLgotCi1XZWQgQXVnIDI1IDEzOjM3OjQ2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCU1lcmdlZCBjaGFuZ2VzIGZyb20gUGV0ZSBIb29nZW5ib29tIGFuZCBKZWZmIExhdyBhdCBVdGFoOgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlKTogU0VDX0FMTE9DIHNob3VsZAotCW5vdCBiZSBvbiBmb3IgLmhwcGFfdW53aW5kLgotCShtZF9wc2V1ZG9fdGFibGUpOiAuUEFSQU0gYW5kIC5wYXJhbSBhcmUgdmFsaWQgcHNldWRvLW9wcyBmb3IgR0FTLgotCShwYV9wYXJhbSk6IE5ldyBmdW5jdGlvbiB0byBoYW5kbGUgLlBBUkFNIGRpcmVjdGl2ZXMuCi0JKHBhX2lwKTogUGFzcyAiaXNicmFuY2giIGFyZ3VtZW50IGRvd24gdG8gcGFfcGFyc2VfKl9jb21wbHRyCi0JZnVuY3Rpb25zLiAgSGFuZGxlICd8JyBmb3IgbW92YjsgYWxsb3cgbW92YixuLgotCShwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0cik6IERlbGV0ZSBvbGQgdXNlbGVzcwotCXZlcnNpb24uICBIYW5kbGUgY2FzZXMgd2hlcmUgbm8gY29tcGxldGVyIGV4aXN0cyBmb3IKLQljb21iLG4gb3IgYWRkYixuLgotCShwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0cik6IEhhbmRsZSBjYXNlcyB3aGVyZSBubwotCWNvbXBsZXRlciBleGlzdHMgZm9yIGNvbWIsbiBvciBhZGRiLG4uICBNYWtlIGxvZ2ljCi0JbWlycm9yIHRoYXQgb2YgcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIuCi0JKHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKHBhX3BhcnNlX25lZ19hZGRfY21wbHRyKTogTGlrZXdpc2UuCi0JKiB0Yy1ocHBhLmggKHBhX3BhcmFtKTogRGVjbGFyZS4KLQotVHVlIEF1ZyAyNCAxNTo0MTozNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBOb3cgc3RhdGljLgotCUFkZGVkIGZvcndhcmQgZGVjbGFyYXRpb24uCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIFBldGUgSG9vZ2VuYm9vbSBhbmQgSmVmZiBMYXcgYXQgVXRhaDoKLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IEFyZ3VtZW50cyB3ZXJlIGluY29ycmVjdCBvbgotCWNhbGwgdG8gZWxmX3RjX21ha2Vfc2VjdGlvbnMuCi0JKG9ial9lbGZfdmVyc2lvbik6IEEgLm5vdGUgc2VjdGlvbiBzaG91bGRuJ3QgaGF2ZSB0aGUgU0VDX0FMTE9DCi0JYXR0cmlidXRlLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX3RjX21ha2Vfc2VjdGlvbnMpOiBBZGQgc29tZSBwcm9jZXNzaW5nIHRvCi0JaGFuZGxlIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2J1aWxkX3N5bWV4dG5fc2VjdGlvbik6IE5ldyBmdW5jdGlvbiB0bwotCWNyZWF0ZSBhIHN5bWJvbCBleHRlbnNpb24gc2VjdGlvbi4KLQkocGFfZXhwb3J0X2FyZ3MpOiBNYWtlIGNhbGwgdG8gcGFfYnVpbGRfc3ltZXh0bl9zZWN0aW9uLgotCShocHBhX3RjX3N5bWJvbCwgaHBwYV90Y19tYWtlX3NlY3Rpb25zLAotCWhwcGFfdGNfbWFrZV9zeW1leHRuX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb25zLgotCSogY29uZmlnL3RjLWhwcGEuaDogVXBkYXRlIGVsZl90Y19zeW1ib2wgYW5kIGVsZl90Y19tYWtlX3NlY3Rpb25zCi0JbWFjcm9zLgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IFBsYWNlIGNoZWNrIGZvciBUQ19DT05TX0ZJWF9ORVcgaW4gdGhlCi0JQkZEX0FTU0VNQkxFUiBicmFuY2ggYXMgd2VsbC4KLQotCSogY29uZmlnL3RjLWhwcGEuaDogSWYgRUxGIGlzIHRoZSB0YXJnZXQgb2JqZWN0IGZvcm1hdCwgZGVmaW5lCi0Jc29tZSBFTEYtIGFuZCBocHBhLXNwZWNpZmljIHR5cGVzIGFuZCBjb25zdGFudHMuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGdldEV4cHJlc3Npb24pOiBGaXggYSB0eXBvLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBUQ19FUVVBTF9JTl9JTlNOIHRvIGRldGVybWluZQotCWlmIGEgYD0nIGlzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEhhbmRsZSBjYXNlIHdoZXJlIGVuZC1vZi1saW5lIG1hcmtlcnMgYXJlCi0JYWxzbyB1c2VkIHdpdGhpbiBpbnN0cnVjdGlvbnMuCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19FUVVBTF9JTl9JTlNOLCBUQ19FT0xfSU5fSU5TTik6IERlZmluZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfYXBwbHlfZml4XzEpOiBLZWVwIHJlbG9jYXRpb25zIGZvcgotCW91dC1vZi1yYW5nZSBicmFuY2hlcy8nY2FsbHMgdXNpbmcgImJsIiBvciBjYWxscyB3aGljaCBtYXkgbmVlZAotCWFyZ3VtZW50IHJlbG9jYXRpb24gc3R1YnMuICBEbyBub3QgbmVlZC9rZWVwIHJlbG9jYXRpb25zIGZvcgotCWNvbmRpdGlvbmFsIGJyYW5jaGVzLgotCShlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nKTogRml4IGNhbGN1bGF0aW9uIG9mIGZ1bmN0aW9uIHNpemUuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdmVyc2lvbik6IE1hcmsgLm5vdGUgc2VjdGlvbiBhcwotCVJFQURPTkxZLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSk6IFBhc3MgZXhwLCBub3QgdGhlCi0JYWRkcmVzcyBvZiBleHAsIHRvIGV4cHJlc3Npb24uCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSk6IFR1cm4gU0VDX0hBU19DT05URU5UUyBmbGFnIG9uLgotCShtZF9hcHBseV9maXhfMSk6IERlbGV0ZSB1bndhbnRlZCBjb21tZW50cy4KLQkocHJvY2Vzc19leGl0KTogU3ltYm9scyBtYXJraW5nIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBhcmUgYWx3YXlzCi0JQlNGX0xPQ0FMLgotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBJbmNsdWRlIGVsZjMyLWhwcGEuaCBmcm9tIEJGRCB0cmVlLgotCShwYV9zcGFjZSk6IERlY2xhcmUgYW5kIGluaXRpYWxpemUgZ2RiX3NlY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBDaGFuZ2UKLQllbGZfdGNfZmluYWxfcHJvY2Vzc2luZ19ob29rIHRvIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nLgotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBGaXggYXJndW1lbnQgbGlzdCB0byBtYXRjaAotCWFyZ3VtZW50IHR5cGUgZGVjbGFyYXRpb25zLgotCShnZXRFeHByZXNzaW9uKTogRml4IHR5cG8uCi0JKHBhX2V4cG9ydF9hcmdzKTogQ2hhbmdlIGVsZl9zeW1ib2xfdHlwZSB0byBlbGYzMl9zeW1ib2xfdHlwZS4KLQkoZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLiAgTmFtZSBjaGFuZ2VkIGZyb20KLQllbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nX2hvb2suCi0JKHN0YXJ0X3N5bWJvbF9yb290LCBzdGFydF9zeW1ib2xfbGFzdCk6IERlbGV0ZWQuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTik6IEZpeCB0eXBvLgotCi0JKiBjb25maWcvdGMtaHBwYS5oOiBSZXBsYWNlICJzeW1ib2xTIiB3aXRoICJzdHJ1Y3Qgc3ltYm9sIiB0bwotCWF2b2lkIGNoYW5naW5nIGluY2x1ZGUgb3JkZXJpbmcuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHBhX2lwLCBjYXNlICd5Jyk6IEhhbmRsZSBqdXN0IGxpa2UgJ3QnLgotCi1Nb24gQXVnIDIzIDEyOjQ3OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc2V0X2F0KTogQWRkZWQgdW5zaWduZWRwIGFyZ3VtZW50LiAgVXNlCi0JbG9hZF9yZWdpc3Rlci4KLQkoc2V0X2F0X3Vuc2lnbmVkKTogUmVtb3ZlZDsgY2hhbmdlZCBjYWxsZXJzIHRvIHVzZSBzZXRfYXQuCi0JKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmVkIHVudXNlZCBpcCBhcmd1bWVudC4gIENoYW5nZWQgY2FsbGVycy4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGJyYW5jaCBhbmQgYnJhbmNoIGxpa2VseS4KLQkobWFjcm9fYnVpbGQpOiBIYW5kbGUgJ3UnLgotCShsb2FkX3JlZ2lzdGVyKTogSGFuZGxlIDY0IGJpdCBjb25zdGFudHMuCi0JKG1hY3JvKTogQWRkZWQgTV9EQUJTLCByZW1vdmVkIE1fQUJTVS4gIE51bWVyb3VzIGNoYW5nZXMgdG8KLQlzdXBwb3J0IDY0IGJpdCBjb25zdGFudHMuCi0JKG1pcHNfaXApOiBVc2UgaGV4IGNvbnN0YW50cyBpbiByYW5nZSBjaGVja3MgZm9yIGNsYXJpdHkuCi0JKG1kX251bWJlcl90b19jaGFycyk6IFN1cHBvcnQgOCBieXRlIHZhbHVlcy4KLQotRnJpIEF1ZyAyMCAxNjo1MDo1OSAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tODhrLmg6IHVwZGF0ZWQgY29weXJpZ2h0cy4KLQkgIChUQ19DT05TX1JFTE9DKTogZGVjbGFyZSB0byBiZSBSRUxPQ18zMi4KLQotRnJpIEF1ZyAyMCAxMToxNjo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXNhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIG1pcHNfaXNhIGJhc2VkIG9uIFRBUkdFVF9DUFUuICBEb24ndCBzYW5pdHkKLQljaGVjayBtYWNyb3MuICBTZXQgdGV4dCBhbGlnbm1lbnQgYW5kIEdQIHNpemUgaGVyZS4KLQkobWRfYXNzZW1ibGUpOiBEb24ndCBzZXQgdGV4dCBhbGlnbm1lbnQgYW5kIEdQIHNpemUgaGVyZS4KLQkoYXBwZW5kX2luc24pOiBEb24ndCBpbnNlcnQgTk9QcyBmb3IgbG9hZCBkZWxheXMgaWYgbWlwc19pc2EgPj0gMi4KLQlVc2UgdGhlIHJpZ2h0IG1hc2sgYW5kIHNoaWZ0IGZvciBXUklURV9GUFJfVCBhbmQgV1JJVEVfRlBSX1MuICBBZGQKLQlhIE5PUCBhZnRlciBhIGJyYW5jaCBsaWtlbHkuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBEb24ndCBpbnNlcnQgTk9QUyBmb3IgbG9hZCBkZWxheXMgaWYgbWlwc19pc2EKLQk+PSAyLgotCShtYWNybyk6IFN1cHBvcnQgcjYwMDAgYW5kIHI0MDAwIG1hY3Jvcy4KLQkobWlwc19pcCk6IENoZWNrIGluc24gSVNBIGxldmVsIGFnYWluc3QgbWlwc19pc2EgYmVmb3JlIHVzaW5nIGl0LgotCUFkZGVkICd4JyBjYXNlIGZvciBpZ25vcmVkIHJlZ2lzdGVyLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLW1pcHNOIGFuZCAtbWNwdT1YWC4KLQotRnJpIEF1ZyAyMCAwMToyNjo1MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSkgW09CSl9FTEZdOiBIYW5kbGUgIi56ZXJvIi4KLQotVGh1IEF1ZyAxOSAxMjoxNToxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2xvY2FsKTogRnVuY3Rpb24gbW92ZWQgYW5kIHJlbmFtZWQuLi4KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfbG9jYWwpOiAuLi50byBoZXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSksIGNvbmZpZy9vYmotZWxmLmMKLQkob2JqX3BzZXVkb190YWJsZSk6IE1vdmUgaGFuZGxpbmcgb2YgIi5sb2NhbCIuCi0KLQkqIHRjLmggKG1kX3BhcnNlX29wdGlvbik6IERvbid0IGRlY2xhcmUgaWYgZGVmaW5lZCBhcyBhIG1hY3JvLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChOT19SRUxPQykgW0JGRF9BU1NFTUJMRVJdOiBEZWZpbmUgYXMKLQlCRkRfUkVMT0NfTk9ORS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogTmV3IG1hY3JvLCBjb252ZXJ0ZWQgZnJvbSBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IEZ1bmN0aW9uIGRlbGV0ZWQuCi0JKGNvbW1lbnRfY2hhcnMpIFtPQkpfRUxGXTogSW5jbHVkZSAiLyIuCi0JKGxpbmVfY29tbWVudF9jaGFycykgW09CSl9FTEYgfHwgVEVfSTM4NkFJWF06IERvbid0IGluY2x1ZGUgIi8iLgotCShtZF9hc3NlbWJsZSk6IENhc3QgMHhlOSB0byBjaGFyIGV4cGxpY2l0bHksIHRvIGF2b2lkIGNvbXBpbGVyCi0Jd2FybmluZy4KLQkobWRfYXNzZW1ibGUsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKToKLQlDYWxsIHJlbG9jIGZvciBmaXhfbmV3IHR5cGUsIG9yIHVzZSBjb3JyZWN0IGVudW1lcmF0b3IsIGluc3RlYWQgb2YKLQlhbHdheXMgdXNpbmcgTk9fUkVMT0MuCi0JKGkzODZfb3BlcmFuZCk6IENoYW5nZSAiaWZuZGVmIEkzODZDT0ZGIiB0byAiaWZkZWYgT0JKX0FPVVQiIGZvcgotCXRlc3RzIGZvciB2YWxpZCBzZWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogQ29tcGVuc2F0ZSBmb3IgZnJhZyBzdGFydAotCWFkZHJlc3MuCi0JKG1kX2FwcGx5X2ZpeF8xKSBbQkZEX0FTU0VNQkxFUl06IEZvciBwYy1yZWxhdGl2ZSByZWxvYyB3aXRoCi0Jc3ltYm9sLCBjb21wZW5zYXRlIGZvciBsb2NhdGlvbiBvZiByZWxvYy4KLQkocmVsb2MsIEJGRF9SRUxPQ18zMiwgQkZEX1JFTE9DXzMyX1BDUkVMKSBbIUJGRF9BU1NFTUJMRVJdOiBEZWZpbmUKLQl0byByZXR1cm4gemVyby4KLQotV2VkIEF1ZyAxOCAxNjo1MToyOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmM6IFVuZGVmIE5PX1JFTE9DIGJlZm9yZSBpbmNsdWRpbmcgYW91dC9hb3V0NjQuaC4KLQkob2JqX2VsZl93ZWFrKTogTmV3IGZ1bmN0aW9uLgotCShvYmpfcHNldWRvX3RhYmxlKTogSGFuZGxlICIud2VhayIuCi0JKG9ial9lbGZfc2VjdGlvbik6IElmIHNlY3Rpb24gZGlyZWN0aXZlIGluY2x1ZGVzIGEgc3RyaW5nLCBpZ25vcmUKLQlpdCBmb3Igbm93LiAgQWNjZXB0ICJwcm9nYml0cyIgZmxhZy4KLQkob2JqX2VsZl90eXBlKTogQWNjZXB0IGBAJyBiZWZvcmUgZmxhZyBuYW1lLgotCi0JKiB3cml0ZS5jIChyZWxheF9hbmRfc2l6ZV9zZWcpIFtCRkRfQVNTRU1CTEVSXTogR2V0IHJpZCBvZiBgaWYoMSknCi0JY29uZGl0aW9uLgotCShmaXh1cF9zZWdtZW50KSBbQkZEX0FTU0VNQkxFUl06IFVzZSBiZmRfaXNfY29tX3NlY3Rpb24sIHJhdGhlcgotCXRoYW4gY2hlY2tpbmcgZm9yIGJmZF9jb21fc2VjdGlvbiBkaXJlY3RseS4KLQkoZml4dXBfc2VnbWVudCk6IFNpbXBsaWZ5IHJhbmdlIGNoZWNrLgotCShmaXh1cF9zZWdtZW50KSBbT0JKX0NPRkYgJiYgVENfSTk2MF06IFNpbXBsaWZ5IGNwcCBjb25kaXRpb24KLQl0ZXN0LgotCi0JKiBzeW1ib2xzLmggKFNfU0VUX1dFQUspOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChTX1NFVF9XRUFLKTogTmV3IGZ1bmN0aW9uLgotCShTX1NFVF9FWFRFUk5BTCwgU19DTEVBUl9FWFRFUk5BTCk6IERvbid0IGJvdGhlciB3aXRoIEJTRl9FWFBPUlQsCi0JaXQncyBub3QgYSBzZXBhcmF0ZSBmbGFnIGFueSBtb3JlLiAgQ2xlYXIgQlNGX1dFQUsuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFRyZWF0ICJzdHJpbmciIGxpa2UgImFzY2l6Ii4KLQotV2VkIEF1ZyAxOCAxNTozMDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBicmFuY2ggaW5zdHJ1Y3Rpb25zCi0JaWYgLnNldCBub2JvcHQgb3IgLnNldCB2b2xhdGlsZS4KLQkoZ3BfcmVmZXJlbmNlKTogLmxpdDggYW5kIC5saXQ0IGFyZSBhY2Nlc3NlZCB2aWEgdGhlIEdQIHJlZ2lzdGVyLgotCShtYWNybyk6IEFkZGVkIGNhc2VzIE1fTElfUywgTV9MSV9TUy4gIEZpeGVkIE1fTElfRCBhbmQgTV9MSV9ERC4KLQkobWlwc19pcCk6IEFkZGVkIGNhc2VzICdGJywgJ0wnLCAnZicsICdsJyBmb3IgZmxvYXRpbmcgcG9pbnQuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IFJlbmFtZWQgc29tZSB2YXJpYWJsZXMgdG8gYXZvaWQgc2hhZG93Ci0Jd2FybmluZ3MuCi0KLU1vbiBBdWcgMTYgMTQ6MTY6MDIgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU19JU19DT01NT04pOiBhZGQgbWlzc2luZyBiYWNrc2xhc2gKLQotCSogY29uZmlndXJlLmluICh6OGstKi17Y29mZixzaW19KTogdXNlIGNvZmZiZmQgZm9yIHRoaXMgdGFyZ2V0Ci0KLVRodSBBdWcgMTIgMTE6NDc6NTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogU3VnZ2VzdGVkIGJ5Ci0JZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKTogRG9uJ3QgYWNjZXB0IHN5bWJvbGljCi0JbmFtZXMgZm9yICdFJyBhbmQgJ0cnIGFyZ3VtZW50IHR5cGVzIChjb3Byb2Nlc3NvciByZWdpc3RlcnMpIGFuZAotCWRvbid0IHdhcm4gaWYgJDEgaXMgdXNlZCBvbiB0aGUgY29wcm9jZXNzb3IuCi0JKG1hY3JvKTogSGFuZGxlIE1fe0wsU31XQ3swLDIsM31fQUIgY29ycmVjdGx5LgotCi1Nb24gQXVnICA5IDEyOjA5OjE0IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoZW1pdF9leHByKTogVXNlIEJGRF9SRUxPQ18xNiBmb3IgMi1ieXRlIHZhbHVlcy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZQotCUJGRF9SRUxPQ18xNi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotCi1Nb24gQXVnICA5IDEzOjM2OjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAobWVyZ2VfZGF0YV9pbnRvX3RleHQpOiBEZWZpbmUgb25seSBpZiBCRkRfQVNTRU1CTEVSIGlzCi0JZGVmaW5lZCBvciBCRkQgaXMgbm90LgotCShyZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMpOiBEZWNsYXJlIGxvY2FsIHZhcmlhYmxlIGZyYWdQLgotCi1GcmkgQXVnICA2IDE1OjIyOjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeCwgY2FzZSBCRkRfUkVMT0NfMzIpOiBGaWxsIGluCi0JYnl0ZXMgd2l0aCByZWFsIHZhbHVlcywgbm90IHplcm9zLgotCi1GcmkgQXVnICA2IDEwOjU3OjU5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChtaXBzLSotcmlzY29zKiwgbWlwcy0qLXN5c3YqKTogTmV3ICh1bnRlc3RlZCkKLQl0YXJnZXRzLCB1c2luZyBlY29mZiBhbmQgbWlwcy1iaWcuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQKLQlKb2huc29uKTogQWRkZWQgY2FzZSBmb3IgJ0MnIGZvciBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjb2Rlcy4KLQotVGh1IEF1ZyAgNSAxMzowODo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIGNhc2UgQkZEX1JFTE9DXzY0KTogRmlsbCBpbgotCWJ5dGVzIHdpdGggcmVhbCB2YWx1ZXMsIG5vdCB6ZXJvcy4KLQkobWRfcHNldWRvX3RhYmxlKTogQ2FsbCBjb25zIGZvciAudWF4d29yZC4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX3BzZXVkb190YWJsZSk6IEhhbmRsZSAiLjhieXRlIi4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBVc2UgQkZEX1JFTE9DXzY0IGZvciA4LWJ5dGUgZXhwcmVzc2lvbnMuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVGVzdCBERUJVR19TWU1TIGluc3RlYWQgb2YgREVCVUcKLQlmb3IgdmVyaWZ5aW5nIHN5bWJvbCBjaGFpbi4KLQkobWVyZ2VfZGF0YV9pbnRvX3RleHQsIHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyk6IE5ldwotCWZ1bmN0aW9ucywgc3BsaXQgb3V0IGZyb20gd3JpdGVfb2JqZWN0X2ZpbGUuCi0KLVR1ZSBBdWcgIDMgMTU6NDM6NTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYywgaW4gZGlzYWJsZWQgY29kZSk6IElmCi0JZGVidWcgc2VjdGlvbiBpcyBuZXcsIGFsbG9jYXRlIGFuIGV4dHJhIDEyIGJ5dGVzIGF0IGl0cyBzdGFydC4gIElmCi0JIi5zdGFicyIgdHlwZSBpcyBOX1NPLCBmaWxsIGluIGZpbGVuYW1lIHN5bWJvbCBmaWVsZCBvZiB0aGF0IGZpcnN0Ci0JZW50cnkuICBSZXR1cm4gZWFybHkgaWYgImdvb2YiLCB0byBzaW1wbGlmeSBsYXRlciBjb2RlIHNsaWdodGx5LgotCShhZGp1c3Rfc3RhYl9zZWN0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQkoZWxmX2Zyb2JfZmlsZSk6IEFwcGx5IGFkanVzdF9zdGFiX3NlY3Rpb25zIHRvIGVhY2ggc2VjdGlvbi4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3ByZXZpb3VzKTogTm8gbG9uZ2VyCi0Jc3RhdGljLgotCSogY29uZmlnL29iai1lbGYuaCAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3ByZXZpb3VzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBDYWxsIHRoZW0gZm9yICJwdXNoc2VjdGlvbiIKLQlhbmQgInBvcHNlY3Rpb24iLCBhbmQgY2FsbCBjb25zIGZvciAidWF3b3JkIiBhbmQgInVhaGFsZiIuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfdmVyc2lvbik6IFVzZSBFbmdsaXNoIGluIGVycm9yCi0JbWVzc2FnZXMuCi0KLVR1ZSBBdWcgIDMgMTE6Mjk6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmM6IFVwZGF0ZWQgZm9yIEJGRCBFQ09GRiBjaGFuZ2VzLiAgTm93IGdldHMgdGhlCi0Jc3dhcHBpbmcgcm91dGluZXMgYW5kIGV4dGVybmFsIHN0cnVjdHVyZSBzaXplcyB2aWEgdGhlCi0JZWNvZmZfYmFja2VuZCBpbmZvcm1hdGlvbi4gIE5vIGxvbmdlciBpbmNsdWRlcyBjb2ZmL21pcHMuaC4KLQotTW9uIEF1ZyAgMiAxNzozNTo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZ2V0X3RhZyk6IFNhdmUgdGFnIG5hbWUgaW4gcGVybWFuZW50IG1lbW9yeQotCWFuZCBpbiBoYXNoX3B0ci0+c3RyaW5nLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogUmVzZXQgc3RhdGUgdG8gMCBhZnRlciAuYXBwbGluZSBpZgotCWZpbGUgbmFtZSBpcyBub3Qgc2Vlbi4KLQotTW9uIEF1ZyAgMiAxMTo1MTo0MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgsIGNhc2UgQkZEX1JFTE9DXzY0KTogTmV3IGNhc2UsCi0JcGFyYWxsZWwgdG8gQkZEX1JFTE9DXzMyLgotCSh0Y19nZW5fcmVsb2MpOiBBY2NlcHQgQkZEX1JFTE9DXzY0LgotCi1UaHUgSnVsIDI5IDIyOjIxOjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYzogRG9uJ3QgdXNlIHNob3J0IGludCBpbiBhIHByb3RvdHlwZS4KLQotCSogZXhwci5jIChvcGVyYW5kKTogTWFrZSByZXR1cm4gdmFsdWUgc2ltcGx5IGRlcGVuZCBvbiBjb250ZW50cyBvZgotCXJldHVybmVkIGV4cHJlc3Npb24uCi0KLVRodSBKdWwgMjkgMTg6Mzg6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHNwYXJjKi1hb3V0IGFuZCBzcGFyYyotdnh3b3JrcyBhcmUgQkZEIGFzc2VtYmxlcnMKLQotVGh1IEp1bCAyOSAxODozODozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9oby1zdW5vcy5oOiByZW1vdmUgc29tZSBvbGQgZnVuY3Rpb24gZGVjbHMgdGhhdCBjb25mbGljdAotCXcvIEFOU0ksIGFuZCB3aGljaCB3ZXJlbid0IG5lZWRlZCBhbnl3YXkKLQotV2VkIEp1bCAyOCAxNjozNDo1NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9iX3N5bWJvbCk6IFJlbmFtZWQgZnJvbSB0Y19mcm9iX3N5bWJvbCwKLQlhbmQgZGlzYWJsZWQgc2luY2UgaXQgYnJlYWtzIElhbidzIG5ldyBzeW1ib2wtdmFsdWUgY29kZS4KLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogQWNjZXB0IG1vcmUgZGlnaXRzIGlmIEJGRDY0LgotCi1XZWQgSnVsIDI4IDExOjMwOjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IElmIHdlIGhhdmUgYSBub3JtYWwgY29uc3RhbnQgd2hlbiB3ZQotCWV4cGVjdCBhIGJpZ251bSwgdHVybiBpdCBpbnRvIGEgYmlnbnVtLiAgT3V0cHV0IGV4dHJhIHplcm9lcwotCWJlZm9yZSBhIHNob3J0IGJpZ251bSwgcmF0aGVyIHRoYW4gYWZ0ZXIuCi0KLVR1ZSBKdWwgMjcgMTU6NTQ6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBDb25kaXRpb25hbGl6ZSB2ZXJpZnlfc3ltYm9sX2NoYWluIGNhbGwKLQlvbiBERUJVR19TWU1TLCBub3QgREVCVUcuCi0JKHN5bWJvbF9yZW1vdmUpOiBMaWtld2lzZS4KLQkoc3ltYm9sX2luc2VydCk6IExpa2V3aXNlLgotCi1UdWUgSnVsIDI3IDA4OjQ1OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19vcHRpbWl6ZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGFwcGVuZF9pbnNuKTogSWYgbWlwc19vcHRpbWl6ZSA9PSAwLCBhbHdheXMgaW5zZXJ0IE5PUAotCWluc3RydWN0aW9ucy4gIElmIG1pcHNfb3B0aW1pemUgPCAyLCBkb24ndCBzd2FwIGJyYW5jaGVzLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZiAtT3ggb3IgLWd4LCBzZXQgbWlwc19vcHRpbWl6ZSBhY2NvcmRpbmdseS4KLQotTW9uIEp1bCAyNiAxODowMjo0MyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IGlmIHRlc3RzdWl0ZSBkb2VzIG5vdCBleGlzdCwgdGhlbiBza2lwIGl0LgotCi1GcmkgSnVsIDIzIDE0OjEzOjI1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAocHJldl9pbnNuX3VucmVvcmRlcmVkLAotCXByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKGFwcGVuZF9pbnNuKTogRG9uJ3Qgc3dhcCBicmFuY2ggaW5zdHJ1Y3Rpb24gaWYKLQlwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCAoc2VlIGNvbW1lbnQpLgotCShtaXBzX25vX3ByZXZfaW5zbik6IENsZWFyIHRoZSB1bnJlb3JkZXJlZCB2YXJpYWJsZXMuCi0JKHNfbWlwc3NldCk6IFdoZW4gdHVybmluZyBvbiByZW9yZGVyaW5nLCBzZXQgdGhlIHVucmVvcmRlcmVkCi0JdmFyaWFibGVzLgotCi1GcmkgSnVsIDIzIDEzOjA5OjQ0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogU2VjdGlvbnMgIi5pbml0IiBhbmQgIi5maW5pIgotCWFyZSBhbHNvIG1hZ2ljLCBhbmQgaGF2ZSBzcGVjaWFsIGRlZmF1bHQgZmxhZyBzZXR0aW5ncy4KLQkob2JqX2VsZl9mcm9iX3N5bWJvbCk6IFNpbmNlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIGZ1bmN0aW9uCi0JaXNuJ3QgdXNlZCwgZG9uJ3QgYm90aGVyIGNhbGxpbmcgb2JqX2VsZl93cml0ZV9zeW1ib2xfcCwgc2luY2UgaXQKLQlkb2Vzbid0IGFjY29tcGxpc2ggYW55dGhpbmcgZWxzZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBSb3VuZCB1cCBzZWN0aW9uIHNpemUgb25seQotCWZvciBhLm91dCBmb3JtYXQuCi0KLQkqIHN5bWJvbHMuYzogRG9uJ3QgZGVmaW5lIERFQlVHIGJ5IGRlZmF1bHQuCi0KLVRodSBKdWwgMjIgMTI6MDk6NDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IEhhbmRsZSBhIE9fdW1pbnVzIGV4cHJlc3Npb24uCi0KLQkqIGV4cHIuYyAoZXhwcik6IERvbid0IGxldCBhYnNvbHV0ZV9zZWN0aW9uIG92ZXJyaWRlCi0JdW5kZWZpbmVkX3NlY3Rpb24gZm9yIHRoZSByZXR1cm4gdmFsdWUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSW4gTk9fUFNFVURPX0RPVCBjYXNlLCBpZiB3ZSBmaW5kIGEKLQlwc2V1ZG8tb3Agd2l0aCBhIHBvY19oYW5kbGVyIGZpZWxkIG9mIE5VTEwsIGlnbm9yZSBpdCBhbmQgdHJlYXQgaXQKLQlhcyBhbiBpbnN0cnVjdGlvbiBpbnN0ZWFkLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICJzZXQiIHdpdGggYSBOVUxMCi0JcG9jX2hhbmRsZXIgZmllbGQuCi0KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChtZF9iZWdpbik6IFVzZSBhIGxvY2FsIHZhcmlhYmxlIHdoZW4KLQlpbml0aWFsaXppbmcgbWRfcmVsYXhfdGFibGUgdG8gYXZvaWQgd2FybmluZ3MgYWJvdXQgbW9kaWZ5aW5nIGEKLQlzdXBwb3NlZGx5IGNvbnN0IGRhdGEgc3RydWN0dXJlLgotCi1UaHUgSnVsIDIyIDEwOjU4OjUxIDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmM6IE9ubHkgaW5jbHVkZSBhb3V0L2FvdXQ2NC5oIGlmIEJGRF9BU1NFTUJMRVIKLQlpcyBkZWZpbmVkLgotCi1XZWQgSnVsIDIxIDE3OjMyOjAyIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGNhc2UgJHtob3N0fSk6ICBNYXAgKi0qLXN5c3Y0KiB0byBnYXNfaG9zdD1zeXN2LgotCSogY29uZmlndXJlLmluIChjYXNlICR7Z2VuZXJpY190YXJnZXR9KTogIEFkZCBpWzM0XTg2LSotc3lzdjQqCi0JY2FzZSB0byBzZXQgb2JqX2Zvcm1hdD1lbGYuICBNdXN0IGdvIGJlZm9yZSBpMzg2LSotc3lzdiogY2FzZSB0aGF0Ci0Jc2V0cyBvYmpfZm9ybWF0PWNvZmZic2QuICBBZGQgKi0qLXN5c3Y0KiB0byAqLSotZWxmIGFuZAotCSotKi1zb2xhcmlzIGNhc2UsIGFuZCBtb3ZlIHRvIGJlZm9yZSAqLXN5c3YqIGNhc2UgdGhhdCB3YW50cyB0bwotCXNldCBvYmpfZm9ybWF0IHRvIGNvZmYuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBDaGFuZ2UgYWxsICdleHAuWF9vcCcgdG8KLQknZXhwLT5YX29wJy4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX2FwcGx5X2ZpeCk6ICBGaXggdmFscCB0byBiZSAndmFsdWVUIConIGZvcgotCUJGRF9BU1NFTUJMRVIgY2FzZS4KLQotV2VkIEp1bCAyMSAxMjo0Nzo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jOiBJbmNsdWRlIGFvdXQvYW91dDY0LmguCi0JKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogU2V0IEJTRl9ERUJVR0dJTkcgZm9yIGEgY29uc3RydWN0b3IKLQlzeW1ib2wsIHNvIHRoYXQgQkZEIGRvZXNuJ3QgdGFtcGVyIHdpdGggdGhlIHR5cGUuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgTk9fUFNFVURPX0RPVCBpcyBkZWZpbmVkLCBsb29rCi0JdXAgb3Bjb2RlcyBhcyBwc2V1ZG8tb3BzIGV2ZW4gaWYgdGhleSBkb24ndCBzdGFydCB3aXRoICcuJy4KLQkqIGNvbmZpZy90Yy1tODhrLmggKE5PX1BTRVVET19ET1QpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtZF9hc3NlbWJsZSk6IFJlbW92ZWQgc3BlY2lhbCBwc2V1ZG8tb3AKLQloYW5kbGluZy4KLQkobWRfYXBwbHlfZml4KTogU2V0IGZ4X29mZnNldCB0byB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgcmVsb2MuCi0JT3V0cHV0IHRoZSBsb3cgMTYgYml0cyBmb3IgUkVMT0NfSEkxNiwgbm90IHRoZSBoaWdoIDE2IGJpdHMuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IElmIFRDX004OEssIHNldCB0aGUKLQlyX29mZnNldCBmaWVsZCBvZiB0aGUgcmVsb2MgdG8gdGhlIGZpeHVwIG9mZnNldC4KLQkoZml4dXBfc2VnbWVudHMpOiBJZiBUQ19NODhLLCBkb24ndCB3YXJuIGFib3V0IGZpeHVwIG92ZXJmbG93cy4KLQkqIGRvYy9hcy50ZXhpbmZvOiBNaW5vciB1cGRhdGVzLgotCi1UdWUgSnVsIDIwIDE5OjI4OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogRXh0ZW5zaXZlIGNoYW5nZXMgdG8gcGVybWl0IHN5bWJvbHMgdG8gY29udGFpbiBhbnkgZXhwcmVzc2lvbgotCXR5cGUgYW5kIHRvIGRlbGF5IHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiB1bnRpbCB0aGUKLQl2YWx1ZSBpcyBhY3R1YWxseSBuZWVkZWQuICBUaGlzIHBlcm1pdHMgc2V0dGluZyBzeW1ib2xzIHRvIHZhbHVlcwotCWNhbGN1bGF0ZWQgYmFzZWQgb24gb2JqZWN0IGNvZGUgc2l6ZS4gIEV4cHJlc3Npb25zIHdlcmUgY2hhbmdlZCB0bwotCW5vIGxvbmdlciBiZSBpbiBhIHNlY3Rpb24sIHRvIHN0b3AgdGhlIG92ZXJsb2FkaW5nIG9mIHNlZ21lbnQgYW5kCi0JZXhwcmVzc2lvbiB0eXBlIHRoYXQgcHJldmlvdXNseSBvY2N1cnJlZC4KLQotCSogYXMuYyAoYmlnX3NlY3Rpb24sIHBhc3MxX3NlY3Rpb24sIGRpZmZfc2VjdGlvbiwgYWJzZW50X3NlY3Rpb24pOgotCVJlbW92ZWQuCi0JKGV4cHJfc2VjdGlvbik6IEFkZGVkICh1c2VkIGZvciBkdW1teSBzeW1ib2xzIHdoaWNoIGhvbGQKLQlpbnRlcm1lZGlhdGUgZXhwcmVzc2lvbiB2YWx1ZXMpLgotCShwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDcmVhdGUgZXhwcl9zZWN0aW9uLCBkbyBub3QgY3JlYXRlIHRoZQotCXNlY3Rpb25zIG5vdyByZW1vdmVkLgotCSogYXMuaCAoc2VnVCk6IFJlbW92ZWQgU0VHX0FCU0VOVCwgU0VHX1BBU1MxLCBTRUdfQklHLCBhbmQKLQlTRUdfRElGRkVSRU5DRS4gIEFkZGVkIFNFR19FWFBSLgotCShTRUdfTk9STUFMKTogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCSogc3Vic2Vncy5jIChzZWdfbmFtZSwgc3Vic2Vnc19iZWdpbik6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IERpdHRvLgotCSogY29uZmlnL29iai1hb3V0LmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotYm91dC5jIChzZWdfTl9UWVBFKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc2VnX05fVFlQRSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotdm1zLmMgKHNlZ19OX1RZUEUpOiBEaXR0by4KLQotCSogZXhwci5oIChvcGVyYXRvclQpOiBNb3ZlZCBpbiBmcm9tIGV4cHIuYywgYWRkZWQgc29tZSB2YWx1ZXMuCi0JKGV4cHJlc3Npb25TKTogQWRkZWQgWF9vcCBmaWVsZCwgcmVtb3ZlZCBYX3NlZyBmaWVsZDsgcmVuYW1lZAotCVhfc3VidHJhY3Rfc3ltYm9sIHRvIFhfb3Bfc3ltYm9sLgotCSogZXhwci5jOiBFeHRlbnNpdmUgY2hhbmdlcyB0byBhc3NpZ24gZXhwcmVzc2lvbiB0eXBlcyByYXRoZXIgdGhhbgotCXNlY3Rpb25zIGFuZCB0byBzaW1wbGlmeSB0aGUgcGFyc2luZy4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShmaXhfbmV3KTogUmVtb3ZlZCBzdWJfc3ltYm9sIGFyZ3VtZW50LgotCShmaXhfbmV3X2V4cCk6IE5ldyBmdW5jdGlvbiwgdGFrZXMgZXhwcmVzc2lvbiBhcmd1bWVudC4KLQkqIHdyaXRlLmg6IFByb3RvdHlwZSBjaGFuZ2VzIGZvciBmaXhfbmV3IGFuZCBmaXhfbmV3X2V4cC4KLQkqIGNvbmQuYyAoc19pZik6IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0JKiByZWFkLmMgKHNfbHN5bSwgcHNldWRvX3NldCwgZW1pdF9leHByLCBwYXJzZV9iaXRmaWVsZF9jb25zLAotCXBhcnNlX3JlcGVhdF9jb25zLCBnZXRfc2VnbWVudGVkX2V4cHJlc3Npb24sCi0JZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbik6IERpdHRvLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSwgU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKToKLQlEaXR0by4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGVmLCBvYmpfY29mZl92YWwpOiBEaXR0by4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9kZWYsIG9ial9jb2ZmX3ZhbCwKLQlvYmpfY29mZl9lbmRlZiwgeWFua19zeW1ib2xzKTogRGl0dG8uCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYywgb2JqX2VsZl9zaXplKTogRGl0dG8uCi0JKiBjb25maWcvdGMtYTI5ay5jIChtZF9hc3NlbWJsZSwgcGFyc2Vfb3BlcmFuZCwgbWFjaGluZV9pcCwKLQlwcmludF9pbnNuLCBtZF9vcGVyYW5kKTogRGl0dG8uCi0JKiBjb25maWcvdGMtaDgzMDAuYyAocGFyc2VfZXhwLCBjb2xvbm1vZDI0LCBjaGVja19vcGVyYW5kLAotCWRvX2FfZml4X2ltbSwgYnVpbGRfYnl0ZXMpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1oODUwMC5jIChwYXJzZV9leHAsIHNraXBfY29sb250aGluZywgcGFyc2VfcmVnbGlzdCwKLQlnZXRfc3BlY2lmaWMsIGNoZWNrLCBpbnNlcnQsIG1kX2NvbnZlcnRfZnJhZyk6IERpdHRvLgotCSogY29uZmlnL3RjLWhwcGEuYyAodGhlX2luc24sIGZpeF9uZXdfaHBwYSwgY29uc19maXhfbmV3X2hwcGEsCi0JbWRfYXNzZW1ibGUsIHBhX2lwLCBnZXRFeHByZXNzaW9uLCBnZXRBYnNvbHV0ZUV4cHJlc3Npb24sCi0JZXZhbHVhdGVBYnNvbHV0ZSwgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlLCBwYV9lbnRyeSwKLQlwcm9jZXNzX2V4aXQpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1ocHBhLmggKFNUQUJfRklYVVAsIGlzX0RQX3JlbGF0aXZlLCBpc19QQ19yZWxhdGl2ZSwKLQlpc19jb21wbGV4KTogRGl0dG8uCi0JKiBjb25maWcvdGMtaTM4Ni5jIChwZSwgbWRfYXNzZW1ibGUsIGkzODZfb3BlcmFuZCwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfY3JlYXRlX2xvbmdfanVtcCk6IERpdHRvLgotCSogY29uZmlnL3RjLWk4NjAuYyAobWRfYXNzZW1ibGUsIGdldEV4cHJlc3Npb24sIHByaW50X2luc24pOgotCURpdHRvLgotCSogY29uZmlnL3RjLWk5NjAuYyAocGFyc2VfZXhwciwgc3Vicywgc2VncywgbWRfY29udmVydF9mcmFnLAotCWdldF9jZGlzcCwgbWVtX2ZtdCwgcGFyc2VfbGRjb25zdCwgcmVsYXhfY29iciwgc19zeXNwcm9jLAotCWk5NjBfaGFuZGxlX2FsaWduKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19leHAsIHN0cnVjdCBtNjhrX2l0LCBzZWcsIG9wLAotCXN1YnMsIGFkZF9maXgsIGlzdmFyLCBtNjhrX2lwLCBtZF9hc3NlbWJsZSwgbWRfY29udmVydF9mcmFnXzEsCi0JbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgsIG1kX2NyZWF0ZV9sb25nX2p1bXAsIGdldF9udW0pOgotCURpdHRvLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfYXNzZW1ibGUsIGdldF9pbW0xNiwgZ2V0X3BjciwKLQltZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCk6IERpdHRvLgotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYXNzZW1ibGUsIGFwcGVuZF9pbnNuLCBncF9yZWZlcmVuY2UsCi0JbWFjcm9fYnVpbGQsIG1hY3JvLCBteV9nZXRFeHByZXNzaW9uKTogRGl0dG8uICBBbHNvIHJlbW92ZWQKLQlnZXRfb3B0aW9uYWxfYWJzb2x1dGVfZXhwcmVzc2lvbjsganVzdCB1c2UgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24KLQlpbnN0ZWFkLgotCSogY29uZmlnL3RjLW5zMzJrLmMgKGdldF9hZGRyX21vZGUsIGV2YWx1YXRlX2V4cHIsIGNvbnZlcnRfaWlmLAotCWZpeF9uZXdfbnMzMmssIGZpeF9uZXdfbnMzMmtfZXhwLCBjb25zX2ZpeF9uZXdfbnMzMmspOiBEaXR0by4KLQkqIGNvbmZpZy90Yy1uczMyay5oIChmaXhfbmV3X25zMzJrIHByb3RvdHlwZSk6IERpdHRvLgotCSogY29uZmlnL3RjLXNoLmMgKHBhcnNlX2V4cCwgY2hlY2ssIGluc2VydCwgbWRfY29udmVydF9mcmFnKToKLQlEaXR0by4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hc3NlbWJsZSwgc3BhcmNfaXAsIGdldEV4cHJlc3Npb24sCi0JcHJpbnRfaW5zbik6IERpdHRvLgotCSogY29uZmlnL3RjLXRhaG9lLmMgKHN0cnVjdCB0b3AsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LAotCXRpcF9vcCwgbWRfYXNzZW1ibGUpOiBEaXR0by4KLQkqIGNvbmZpZy90Yy12YXguYyAoc2VnX29mX29wZXJhbmQsIG1kX2Fzc2VtYmxlLAotCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LCBtZF9jcmVhdGVfbG9uZ19qdW1wKTogRGl0dG8uCi0JKiBjb25maWcvdGMtejhrLmMgKHBhcnNlX2V4cCwgY2hlY2tfb3BlcmFuZCwgbmV3Zml4KTogRGl0dG8uCi0KLVR1ZSBKdWwgMjAgMTI6MTc6MTYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGkzODYtbHlueCBpcyB0aGUgc2FtZSBhcyBpMzg2LWNvZmYKLQotTW9uIEp1bCAxOSAxNToyMToyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfcHJldmlvdXMpOiBOZXcgZnVuY3Rpb24uCi0JKHByZXZpb3VzX3NlY3Rpb24sIHByZXZpb3VzX3N1YnNlY3Rpb24pOiBOZXcgdmFycy4KLQkob2JqX2VsZl9zZWN0aW9uKTogU2F2ZSBjdXJyZW50IHBsYWNlIGluIGNhc2UgRFdBUkYgY29kZSB3YW50cyB1cwotCXRvIHBvcCBiYWNrIHRvIGl0LiAgSGFuZGxlIHVucXVvdGVkIHNlY3Rpb24gbmFtZSBhcyB3ZWxsIGFzIHF1b3RlZAotCXNlY3Rpb24gbmFtZS4gIERvbid0IGNyYXNoIG9uIGludmFsaWQgc3RyaW5ncy4KLQkob2JqX3BzZXVkb190YWJsZSk6IEhhbmRsZSBuZXcgcHNldWRvcyAicHJldmlvdXMiLCAiMmJ5dGUiLCBhbmQKLQkiNGJ5dGUiLgotCi0JKiBjb25maWcvb2JqLWVsZi5oOiBEb24ndCBpbmNsdWRlIHN0cnVjLXN5bWJvbC5oLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKTogRGVjbGFyZSBhcmcgYXMgc3RydWN0IHN5bWJvbCAqLgotCi0JKiB0Yy1zcGFyYy5oIChMT0NBTF9MQUJFTCkgW09CSl9FTEZdOiBMb2NhbCBsYWJlbHMgY2FuIHN0YXJ0IHdpdGgKLQkiTCIgb3IgIl8uTF8iLgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG9mZiBmcm9tCi0Jd3JpdGVfY29udGVudHMuICBVc2UgbWVtc2V0IGluc3RlYWQgb2YgYnplcm8uCi0JKHdyaXRlX29iamVjdF9maWxlKTogQXBwbHkgd3JpdGVfcmVsb2NzIHRvIGVhY2ggc2VjdGlvbiBiZWZvcmUKLQlhcHBseWluZyB3cml0ZV9jb250ZW50cy4KLQotCSogcmVhZC5jIChyZWFkX2JlZ2luKTogQ2FsbCBvYnN0YWNrX2JlZ2luIHdpdGggdmFsdWVzIGNsb3NlciB0byAxSwotCW11bHRpcGxlcy4KLQkocmVhZF9hX3NvdXJjZV9maWxlLCBiaWdfY29ucywgZmxvYXRfY29ucyk6IFVzZSBtZW1jcHkgaW5zdGVhZCBvZgotCWJjb3B5LgotCi1Nb24gSnVsIDE5IDE0OjMwOjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcF9vcCk6IERvbid0IGRlY3JlbWVudCBzdHJlbmQgd2hlbgotCWNhbGN1bGF0aW5nIG9wUC0+aXNpejsgdGhpcyBwZXJtaXRzIHRoZSBleHByZXNzaW9uIHNpemUgdG8gYmUKLQlkZXRlcm1pbmVkIGFzIHdlbGwsIGxhdGVyIG9uLgotCi0JKiBleHByLmMgKGNsZWFuX3VwX2V4cHJlc3Npb24pOiBEb24ndCBjYW5jZWwgdGhlIHN1YnRyYWN0aW9uIG9mCi0JdW5kZWZpbmVkIHN5bWJvbHMuCi0KLQkqIHJlYWQuYyAoc19kYXRhKSwgY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2RhdGEpOiBJZiAtUiwKLQlzd2l0Y2ggdG8gdGV4dCBzZWN0aW9uIHJhdGhlciB0aGFuIGRhdGEgc2VjdGlvbi4KLQotTW9uIEp1bCAxOSAxMjozNTozOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2UgQUlORFgpOiBBZGQgNiB0byBvcGVyYW5kCi0JZXhwcmVzc2lvbiAodG8gdGFrZSB0aGUgcGMtcmVsIGluc3RydWN0aW9uIGl0c2VsZiBpbnRvIGFjY291bnQpCi0JYmVmb3JlIHVzaW5nIHRoZSBleHByZXNzaW9uLCBpbnN0ZWFkIG9mIGFmdGVyLgotCi1GcmkgSnVsIDE2IDA4OjU2OjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChmbG9hdF9jb25zKTogU2ltcGxpZmllZCBwYXJzaW5nIGxvZ2ljLiAgSWYKLQlSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLCBhY2NlcHQgYSByZXBlYXQgY291bnQuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBSYXRoZXIgdGhhbiBhIHNwZWNpYWwgY2FzZSBmb3IgVENfSFBQQSwKLQl1c2UgbmV3IG1hY3JvIHRjX2Zyb2JfbGFiZWwuCi0JKiBjb25maWcvdGMtaHBwYS5oICh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBNYW55IGNoYW5nZXMgdG8gc3VwcG9ydCBzaW1wbGUgYXNzZW1ibGVyCi0Jb3B0aW1pemF0aW9uLgotCShpbnNuX2xhYmVsLCBwcmV2X2luc24sIHByZXZfcHJldl9pbnNuLCBkdW1teV9vcGNvZGUsCi0JcHJldl9pbnNuX3ZhbGlkLCBwcmV2X2luc25fZnJhZywgcHJldl9pbnNuX3doZXJlLAotCXByZXZfaW5zbl9maXhwLCBwcmV2X2luc25faXNfZGVsYXlfc2xvdCk6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZXMuCi0JKGluc25fdXNlc19yZWcsIG1pcHNfbm9fcHJldl9pbnNuLCBtaXBzX2VtaXRfZGVsYXlzLAotCW1pcHNfYWxpZ24sIHNfc3RyaW5nZXIsIHNfbWlwc19zcGFjZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShtaXBzX2RlZmluZV9sYWJlbCk6IE5ldyBnbG9iYWwgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEZvciAiYXNjaWkiLCAiYXNjaXoiLCAiYXNjaWl6IiwgY2FsbAotCXNfc3RyaW5nZXIuICBDaGFuZ2VkIGFyZ3VtZW50IHRvIGZsb2F0X2NvbnMgZnJvbSAwIG9yIDEgdG8gJ2YnCi0Jb3IgJ2QnLiAgRm9yICJzcGFjZSIgY2FsbCBzX21pcHNfc3BhY2UuCi0JKG1kX2JlZ2luKTogQ2FsbCBtaXBzX25vX3ByZXZfaW5zbi4KLQkoYXBwZW5kX2luc24pOiBPbmx5IGluc2VydCBuZWNlc3NhcnkgTk9QIGluc3RydWN0aW9ucy4KLQkobWFjcm8pOiBDYWxsIG1pcHNfZW1pdF9kZWxheXMgYmVmb3JlIHNldHRpbmcgbWlwc19ub3Jlb3JkZXIuCi0JSW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgbWlwc19ub3Jlb3JkZXIgcmF0aGVyIHRoYW4gdXNpbmcKLQlzYXZlX3Jlb3JkZXJfY29uZGl0aW9uLiAgRG9uJ3QgYm90aGVyIHRvIHVzZSBub3Jlb3JkZXIgaW4KLQlNX0xfRE9CIGFuZCBNX0xfREFCLCBzaW5jZSBhcHBlbmRfaW5zbiB3aWxsIG5vdCBpbnNlcnQgYSBOT1AuCi0JKG1kX2F0b2YpOiBIYW5kbGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBjb3JyZWN0bHkgZm9yIGJvdGgKLQliaWcgYW5kIGxpdHRsZSBlbmRpYW4gdGFyZ2V0cy4KLQkoc19hbGlnbiwgc19jb25zKTogQ2FsbCBtaXBzX2FsaWduIHJhdGhlciB0aGFuIGZyYWdfYWxpZ24uCi0JKHNfY2hhbmdlX3NlZywgc19jb25zKTogQ2FsbCBtaXBzX2VtaXRfZGVsYXlzLgotCShzX2Zsb2F0X2NvbnMpOiBMZXQgZmxvYXRfY29ucyBkbyB0aGUgd29yay4KLQkoc19taXBzc2V0KTogQ2FsbCBtaXBzX2VtaXRfZGVsYXlzIHdoZW4gc2V0dGluZyBub3Jlb3JkZXIuCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2xhYmVsKTogRGVmaW5lIHRvIGJlCi0JbWlwc19kZWZpbmVfbGFiZWwuCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfYnVpbGRfc3ltYm9scywgZWNvZmZfYnVpbGRfcHJvY3MsCi0JZWNvZmZfZnJvYl9maWxlcyk6IENvbnNpc3RlbnRseSB1c2UgU19HRVRfVkFMVUUgcmF0aGVyIHRoYW4KLQliZmRfYXN5bWJvbF92YWx1ZS4gIFdhcm4gaWYgdGFraW5nIGRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbgotCWRpZmZlcmVudCBzZWdtZW50cy4KLQotVGh1IEp1bCAxNSAxMTo1MTowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoZWNvZmZfZnJvYl9maWxlKTogRGlzY2FyZCBhbGwgb3BlbiBzY29wZXMsCi0Jd2l0aCBhIHdhcm5pbmcuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogSWYgVENfTTg4SywgZG9uJ3QgYWRqdXN0Ci0JYnkgbWRfcGNyZWxfZnJvbSBpZiB3ZSBhcmUgcmVsb2NhdGluZyBhZ2FpbnN0IGEgc3ltYm9sICh3ZSBzdGlsbAotCW5lZWQgbWRfcGNyZWxfZnJvbSBmb3IgYSBQQyByZWxhdGl2ZSByZWxvY2F0aW9uIHdpdGhpbiB0aGUgc2FtZQotCWZpbGUpLgotCSogY29uZmlnL3RjLW04OGsuYyAobWRfcGNyZWxfZnJvbSk6IENvcnJlY3RlZCByZXR1cm4gdmFsdWUuCi0JKG9tYWdpYyk6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlLgotCi0JKiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBtODhrLWNvZmYuCi0JKiBjb25maWd1cmUuaW4gKG04OGstKi1jb2ZmKik6IE5ldyB0YXJnZXQuICBVc2UgY29mZmJmZCBhbmQKLQltODhrY29mZi4KLQkqIGNvbmZpZy9tODhrY29mZi5tdDogTmV3IGZpbGUuCi0JKiByZWFkLmMgKGxleF90eXBlKTogTmV3IG1hY3JvIExFWF9BVCB0byBzZXQgbGV4IHR5cGUgb2YgJ0AnLgotCShwc2V1ZG9fc2V0KTogSGFuZGxlIGRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbiBkaWZmZXJlbnQgZnJhZ21lbnRzCi0JYnkgc2F2aW5nIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiBhcyB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBSZXNvbHZlIGRpZmZlcmVuY2UKLQlleHByZXNzaW9ucy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfcHNldWRvX3RhYmxlKTogSWYgVENfTTg4SywgYWNjZXB0Ci0JInNkZWYiIGFzIGEgc3lub255bSBmb3IgImRlZiIuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaDogSWYgVENfTTg4SywgaW5jbHVkZSBjb2ZmL204OGsuaCBhbmQgc2V0Ci0JVEFSR0VUX0ZPUk1BVC4KLQkoU19JU19MT0NBTCk6IEFueSBzeW1ib2wgd2hpY2ggaW5jbHVkZXMgXDAwMSBpbiB0aGUgbmFtZSBpcyBsb2NhbC4KLQkqIGNvbmZpZy90Yy1tODhrLmMsIGNvbmZpZy90Yy1tODhrLmg6IE51bWVyb3VzIGNoYW5nZXMgdG8gYnJpbmcKLQltODhrIHBvcnQgdXAgdG8gZGF0ZSwgYW5kIHRvIGFkZCBDT0ZGIHN1cHBvcnQuCi0KLVdlZCBKdWwgMTQgMTU6MDk6MzIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBSZW1vdmVkIHN5X2ZvcndhcmQgYW5kIHJlcGxhY2VkIGl0IHdpdGggYW4gdW5kZWZpbmVkIGV4cHJlc3Npb24KLQlhcyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoc3RydWN0IHN5bWJvbCk6IFJlbW92ZWQgc3lfZm9yd2FyZCBmaWVsZC4gIEFkZGVkCi0Jc3lfcmVzb2x2ZWQgYW5kIHN5X3Jlc29sdmluZyBzaW5nbGUgYml0IGZpZWxkcy4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IERvbid0IGluaXRpYWxpemUgc3lfZm9yd2FyZCBmaWVsZC4KLQkocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBOZXcgZnVuY3Rpb24gdG8gYWRqdXN0IHN5bWJvbCB2YWx1ZSBieQotCWZyYWdtZW50IGFkZHJlc3MsIHVzaW5nIHJlY3Vyc2lvbiB0byByZXNvbHZlIGZvcndhcmQgc3ltYm9scy4KLQkqIHN5bWJvbHMuaDogQWRkZWQgcHJvdG90eXBlIGZvciBuZXcgZnVuY3Rpb24uCi0JKiByZWFkLmMgKHBzZXVkb19zZXQpOiBTZXQgc3ltYm9sUC0+c3lfdmFsdWUgdG8gYW4gdW5kZWZpbmVkCi0JZXhwcmVzc2lvbiByYXRoZXIgdGhhbiBzZXR0aW5nIHN5bWJvbFAtPnN5X2ZvcndhcmQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IFVzZSByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgotCXN5bWJvbHMsIGtlZXBpbmcgdGhlIGNvbW1vbiBjYXNlICh0aGUgb2xkIGJlaGF2aW91cikgaW5saW5lLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X2Zyb2Jfc3ltYm9sKTogUmVtb3ZlZCBzeV9mb3J3YXJkCi0JaGFuZGxpbmcgKHN1YnN1bWVkIGJ5IHdyaXRlLmMgY2hhbmdlKS4KLQkqIGNvbmZpZy9vYmotY29mZi5jLCBjb25maWcvb2JqLWNvZmZiZmQuYyAob2JqX2NvZmZfdmFsKTogU2V0Ci0Jc3lfdmFsdWUgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfY29mZl9lbmRlZiwgeWFua19zeW1ib2xzKTogQ2hlY2sKLQlleHByZXNzaW9uIHNlZ21lbnQgcmF0aGVyIHRoYW4gc3lfZm9yd2FyZC4KLQkoeWFua19zeW1ib2xzKTogVXNlIHJlc29sdmVfc3ltYm9sX3ZhbHVlLgotCShjcmF3bF9zeW1ib2xzKTogUmVtb3ZlZCBleHRyYSBwYXNzIG92ZXIgc3ltYm9scy4KLQkqIGNvbmZpZy9vYmotYW91dC5jLCBjb25maWcvb2JqLWJvdXQuYywgY29uZmlnL29iai1jb2ZmLmMsCi0JY29uZmlnL29iai12bXMuYyAob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFJlbW92ZWQgZXh0cmEgcGFzcyBvdmVyCi0Jc3ltYm9scyB3aGljaCBoYW5kbGVkIHN5X2ZvcndhcmQ7IHVzZSByZXNvbHZlX3N5bWJvbF92YWx1ZQotCWluc3RlYWQuCi0JKiBjb25maWcvb2JqLWNvZmYuaCwgY29uZmlnL29iai1jb2ZmYmZkLmggKG9ial9mcm9iX2ZvcndhcmRfc3ltYm9sKToKLQlEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IENoZWNrIGV4cHJlc3Npb24KLQlzZWdtZW50IHJhdGhlciB0aGFuIHN5X2ZvcndhcmQuCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfQ2hlY2tfRm9yX01haW4pOiBEb24ndCBpbml0aWFsaXplCi0Jc3lfZm9yd2FyZDsgZG8gaW5pdGlhbGl6ZSBzeV9yZXNvbHZlZCBhbmQgc3lfcmVzb2x2aW5nLgotCSogY29uZmlnL3RjLWhwcGEuaCAoU1RBQl9GSVhVUCk6IFVzZSBzeV92YWx1ZSwgbm90IHN5X2ZvcndhcmQuCi0KLQkqIENoYW5nZXMgdG8ga2VlcCBhIGZ1bGwgZXhwcmVzc2lvbiBhcyB0aGUgdmFsdWUgb2YgYSBzeW1ib2wsIG5vdAotCWp1c3QgYSBsb25nd29yZDoKLQkqIHN0cnVjLXN5bWJvbC5oOiBOZXcgZmllbGQgc3lfdmFsdWUuCi0JKiBhcy5oOiBJbmNsdWRlIGV4cHIuaCBiZWZvcmUgc3RydWMtc3ltYm9sLmguCi0JKiBleHByLmg6IFVzZSBzdHJ1Y3Qgc3ltYm9sIHJhdGhlciB0aGFuIHN5bWJvbFMuCi0JKiBzeW1ib2xzLmMgKFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IFJld3JvdGUgdG8gcmV0cmlldmUgdmFsdWUKLQlvZiBzeV92YWx1ZSBmaWVsZDsgY29tcGlsZSB1bmNvbmRpdGlvbmFsbHksIG5vdCBqdXN0IGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkqIHN5bWJvbHMuaDogQ29tcGlsZSBTX3tTR31FVF9WQUxVRSBwcm90b3R5cGVzIHVuY29uZGl0aW9uYWxseS4KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogU2V0IEJGRCBzeW1ib2wgdmFsdWUgdG8gZ2FzIHN5bWJvbAotCXZhbHVlLgotCSogY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotYm91dC5oLCBjb25maWcvb2JqLWNvZmYuaCwKLQljb25maWcvb2JqLWNvZmZiZmQuaCwgY29uZmlnL29iai1nZW5lcmljLmgsIGNvbmZpZy9vYmotdm1zLmgKLQkoU19HRVRfVkFMVUUsIFNfU0VUX1ZBTFVFKTogUmVtb3ZlZCBtYWNybyBkZWZpbml0aW9ucy4KLQkqIGNvbmZpZy9vYmotaWVlZS5jIChTX0dFVF9WQUxVRSwgU19TRVRfVkFMVUUpOiBSZW1vdmVkLgotCSogY29uZmlnL29iai1jb2ZmLmgsIG9iai1jb2ZmYmZkLmg6IFJld3JvdGUgc2V2ZXJhbCBtYWNyb3MgdG8gdXNlCi0JU19HRVRfVkFMVUUgcmF0aGVyIHRoYW4gb3N0X2VudHJ5Lm5fdmFsdWUuCi0JKiBjb25maWcvb2JqLWFvdXQuYyAob2JqX3N5bWJvbF90b19jaGFycyksIGNvbmZpZy9vYmotYm91dC5jCi0JKG9ial9zeW1ib2xfdG9fY2hhcnMpLCBjb25maWcvb2JqLWNvZmYuYyAob2JqX3N5bWJvbF90b19jaGFycyksCi0JY29uZmlnL29iai1jb2ZmYmZkLmMgKHN5bWJvbF90b19jaGFycyk6IEdldCB2YWx1ZSB0byB3cml0ZSBvdXQKLQl1c2luZyBTX0dFVF9WQUxVRS0tZG9uJ3QgYXNzdW1lIGl0IGlzIGFscmVhZHkgc2V0LgotCSogY29uZmlnL29iai1pZWVlLmMgKGRvX3N5bWJvbHMpOiBTZXQgQkZEIHN5bWJvbCB2YWx1ZSB0byBnYXMKLQlzeW1ib2wgdmFsdWUuCi0JKiBjb25maWcvb2JqLXZtcy5jICh2YXJpb3VzKTogRG9uJ3QgYXNzaWduIGRpcmVjdGx5IHRvCi0JU19HRVRfVkFMVUU7IHVzZSBTX1NFVF9WQUxVRSBpbnN0ZWFkLgotCi1XZWQgSnVsIDE0IDA5OjM1OjIzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogTWFrZSBzcGFyYzY0LSotYW91dCogdXNlIGJmZCBnYXMuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGg4MzAwaC4KLQotVHVlIEp1bCAxMyAxMjowOTo0NCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDg1MDAuYyAobGluZV9jb21tZW50X2NoYXJzKTogQWRkIGhhc2guCi0JKHBhcnNlX2V4cCwgc2tpcF9jb2xvbnRoaW5nLCBidWlsZF9ieXRlcyk6IEFkZCBzdXBwb3J0IGZvcgotCVJfSDg1MDBfSElHSDE2IHJlbG9jYXRpb24gdHlwZS4KLQotTW9uIEp1bCAxMiAxMToxNTozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgYEAnIHRvIGludHJvZHVjZSBhbgotCWF0dHJpYnV0ZSBuYW1lLiAgSGFuZGxlIGBleGVjaW5zdHInIGF0dHJpYnV0ZS4KLQotTW9uIEp1bCAxMiAwNzoyMjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB3YXJuIG9uICdpJyBvciAnaicgbWlzbWF0Y2ggaWYKLQl0aGVyZSBpcyBhbm90aGVyIGFsdGVybmF0aXZlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBKdWwgIDkgMTc6MzE6MzQgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogZG9jL2FzLnRleGluZm86IHVwZGF0ZXMgZm9yIEg4LzMwMEgKLQotVGh1IEp1bCAgOCAxNDo0MTo0MyAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTk2MC5jIChtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwKLQltZF9udW1iZXJfdG9fY2hhcnMsIG1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZCB0byB1c2UgdmFsdWVULAotCWFkZHJlc3NULCB0byBtYXRjaCB0Yy5oLgotCi1UaHUgSnVsICA4IDE0OjE1OjA1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogUmV2YW1wIHRvIGhhbmRsZSBib3RoIHN5bnRheGVzLAotCWluZGVwZW5kZW50IG9mIGZvcm1hdC4KLQotVGh1IEp1bCAgOCAwNzoyNToyNSAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuaCAoVENfQ09OU19SRUxPQyk6IFVzZSBSX1JFTExPTkcgaWYgaDgvMzAwaC4KLQotV2VkIEp1bCAgNyAxODoxMTowNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZGVmaW5lIENST1NTPS1EQ1JPU1NfQ09NUElMRSBpZiBpdCBpcyBhIGNyb3NzCi0JYnVpbGQ7IGFsc28gcmVjb2duaXplIGg4MzAwLSotY29mZgotCi1XZWQgSnVsICA3IDEwOjIxOjI0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc3ltYm9scy5jIChmYl9sYWJlbF9pbnN0YW5jZSwgZmJfbGFiZWxfaW5zdGFuY2VfaW5jKTogRG9uJ3QgZHVtcAotCWNvcmUganVzdCBiZWNhdXNlIHNvbWVib2R5IHVzZXMgYSBsYWJlbCBiZWZvcmUgaXQgaXMgZGVmaW5lZC4KLQotCSogY29uZmlnL21pcHMtb3Bjb2RlLmg6IE1vdmVkIHRvIG9wY29kZS9taXBzLmguCi0JKiBjb25maWcvdGMtbWlwcy5jOiBJbmNsdWRlIG9wY29kZS9taXBzLmggcmF0aGVyIHRoYW4KLQltaXBzLW9wY29kZS5oLgotCShhcHBlbmRfaW5zbik6IEFuIGV4dHJhIE5PUCBpcyBvbmx5IG5lZWRlZCBhZnRlciBpbnN0cnVjdGlvbnMKLQl3aGljaCBzZXQgSEkgb3IgTE8sIG5vdCBhZnRlciBpbnN0cnVjdGlvbnMgd2hpY2ggcmVhZCBpdC4KLQkobWFjcm9fYnVpbGQsIG1pcHNfaXApOiBTdXBwb3J0IG5ldyAnRScsICdHJyBhbmQgJ0InIGFyZ3VtZW50cy4KLQkobWFjcm8pOiBjZmMxIGFuZCBjdGMxIG5vdyB0YWtlICJ0LEciIHJhdGhlciB0aGFuICJ0LGQiLgotCSogY29uZmlnL3RjLW1pcHMuaCAoc3RydWN0IG1pcHNfb3Bjb2RlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL21pcHMtYmlnLm10LCBjb25maWcvbWlwcy1saXQubXQgKFRBUkdfQ1BVX0RFUEVOREVOVFMpOgotCVNldCB0byAkKHNyY2RpcikvLi4vaW5jbHVkZS9vcGNvZGUvbWlwcy5oLgotCi0JR2V0IHRoZSBNSVBTIGFzc2VtYmxlciB1cCB0byBzcGVlZCB3aXRoIG90aGVyIGdhcyBjaGFuZ2VzOgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX3NldF92bWEsIGVjb2ZmX2Zyb2Jfc3ltYm9sKToKLQlSZW1vdmVkOyBkb24ndCBjaGFuZ2UgdGhlIHN5bWJvbCB2YWx1ZS4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scywgZWNvZmZfYnVpbGRfcHJvY3MsIGVjb2ZmX2Zyb2JfZmlsZSk6IFVzZQotCWJmZF9hc3ltYm9sX3ZhbHVlIHJhdGhlciB0aGFuIFNfR0VUX1ZBTFVFIHRvIGluY2x1ZGUgc2VjdGlvbgotCXZtYSBpbiBzeW1ib2wgdmFsdWUuCi0JKGVjb2ZmX2Zyb2JfZmlsZSk6IElnbm9yZSBCU0ZfU0VDVElPTl9TWU0gc3ltYm9scywgc2luY2UgRUNPRkYKLQlkb2Vzbid0IG91dHB1dCB0aGVtLiAgU2V0IHRoZSB2bWEgb2Ygc2VjdGlvbnMuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmg6IERvbid0IGRlZmluZSBvYmpfZnJvYl9zeW1ib2wuCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBBZGp1c3RtZW50IGJ5IHNlY3Rpb24gdm1hIGlzIG5vCi0JbG9uZ2VyIG5lY2Vzc2FyeS4KLQkodmFyaW91cyk6IHVzZSB2YWx1ZVQgcmF0aGVyIHRoYW4gbG9uZy4KLQotV2VkIEp1bCAgNyAwODozMzozMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChFTlY2NCk6IERlZmluZSBmb3IgdjkuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX3h3b3JkKTogRm9yIG51bWJlcnMsIGNhbGwgYmlnX2NvbnMuCi0JKHNwYXJjX2lwLCBtZF9hcHBseV9maXgsIHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBzb21lIHNwYXJjNjQKLQlyZWxvY2F0aW9uIHR5cGVzLgotCShtZF9udW1iZXJfdG9fY2hhcnMpOiBIYW5kbGUgOC1ieXRlIHZhbHVlLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChlbGZfc3ltYm9sKTogRm9yIHY5LCB1c2UgNjQtYml0IHN5bWJvbCB0eXBlLgotCi0JKiBhcy5oICh2YWx1ZVQpOiBUeXBlZGVmIG1vdmVkIGhlcmUuCi0JKiBzdHJ1Yy1zeW1ib2wuaCAodmFsdWVUKTogLi4uZnJvbSBoZXJlLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBMb2NhbHMgZnJvbV9hZGRyLCB0b19hZGRyLAotCXRhYmxlX2FkZHIgYXJlIG5vdyBhZGRyZXNzVC4gIFN1cHBseSBwcm90b3R5cGUgZm9yIGJmZF9hbGxvYyBmb3IKLQlub3cuCi0JKGZpeHVwX3NlZ21lbnQpOiBMb2NhbCBhZGRfbnVtYmVyIGlzIG5vdyB2YWx1ZVQuICBDb3JyZWN0IHNvbWUKLQlyYW5nZS1jaGVja2luZyBidWdzLgotCShyZWxheF9hbGlnbik6IFR5cGUgYGludCcgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIHRoZSBleHBvbmVudC4KLQkoZml4X25ldyk6IEFyZ3VtZW50IG9mZnNldCBpcyB0eXBlIG9mZnNldFQuICBMb2NhbHMgc2l6ZSBhbmQKLQluZXdzaXplIGFyZSB0eXBlIHZhbHVlVC4KLQkqIHdyaXRlLmggKHN0cnVjdCBmaXgpOiBGaWVsZHMgZnhfb2Zmc2V0IGFuZCBmeF9hZGRudW1iZXIgYXJlIG5vdwotCXR5cGUgdmFsdWVULgotCShmaXhfbmV3KTogRml4IHByb3RvdHlwZS4KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX25ldyk6IFN5bWJvbCB2YWx1ZSBpcyB0eXBlIHZhbHVlVC4KLQkoU19TRVRfVkFMVUUsIFNfR0VUX1ZBTFVFKTogTGlrZXdpc2UuCi0JKFNfSVNfKik6IFNwZWNpZnkgaW50IHJldHVybiB0eXBlIGV4cGxpY2l0bHkuCi0JKiBzeW1ib2xzLmggKHN5bWJvbF9uZXcsIFNfR0VUX1ZBTFVFLCBTX1NFVF9WQUxVRSk6IEZpeGVkCi0JcHJvdG90eXBlcy4KLQkqIHJlYWQuYyAoc19jb21tKTogVmFsdWVzIHJlYWQgYXJlIHR5cGUgdmFsdWVULgotCSogZXhwci5oIChleHByZXNzaW9uUyk6IEZpZWxkIFhfYWRkX251bWJlciBpcyBhbiBvZmZzZXRULgotCSogdGMuaCAobWRfY3JlYXRlX2xvbmdfanVtcCwgbWRfY3JlYXRlX3Nob3J0X2p1bXAsCi0JbWRfc2VjdGlvbl9hbGlnbik6IEFkZHJlc3NlcyBhcmUgbm93IHR5cGUgYWRkcmVzc1QuCi0JKG1kX251bWJlcl90b19jaGFycywgbWRfYXBwbHlfZml4KTogUGFzcyB2YWx1ZSBhcyB2YWx1ZVQuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwKLQltZF9udW1iZXJfdG9fY2hhcnMsIG1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEluaXRpYWxpemUgYGxlbicgdmFyaWFibGUgdG8gbWFrZQotCWdjYyBzaHV0IHVwLgotCShtZF9jcmVhdGVfc2hvcnRfanVtcCwgbWRfY3JlYXRlX2xvbmdfanVtcCwgbWRfbnVtYmVyX3RvX2NoYXJzLAotCW1kX3NlY3Rpb25fYWxpZ24pOiBBZGp1c3RlZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfcmVzZXJ2ZSk6IFBlcm1pdCB1c2UgZm9yIG90aGVyIHRoYW4gYS5vdXQKLQlmb3JtYXQuCi0JKHNfY29tbW9uKTogSGFuZGxlIFNvbGFyaXMtMiB2ZXJzaW9uLgotCi0JKiBjb25maWcvaG8tZ2VuZXJpYy5oIChmcmVlKTogUmV0dXJucyB2b2lkIGlmIF9fU1REQ19fLgotCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfZWxmX2Zyb2Jfc3ltYm9sLCBlbGZfZnJvYl9maWxlLAotCWVsZl9maWxlX3N5bWJvbCk6IERlY2xhcmUuCi0KLQkqIGV4cHIuYyAoZmxvYXRpbmdfY29uc3RhbnQsIGludGVnZXJfY29uc3RhbnQpOiBOb3cgcmV0dXJuIHZvaWQuCi0KLVRodSBKdWwgIDEgMTI6MTM6NDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IE1hdGNoIG9uIHNwYXJjKi1mdWppdHN1LW5vbmUgcmF0aGVyIHRoYW4KLQlzcGFyY2xpdGUqLWZ1aml0c3Utbm9uZS4KLQotV2VkIEp1biAzMCAxMToxMjowMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoY29ucyk6IENvbmRpdGlvbmFsaXplIHBhcnNpbmcgb2YgZXhwcmVzc2lvbi4gIE1vdmUKLQlwdXR0aW5nIHZhbHVlIGludG8gb2JqZWN0IGZpbGUgaW50byBzZXBhcmF0ZSBmdW5jdGlvbi4gIFNlcGFyYXRlCi0Jb3V0IE1SSSBhbmQgV0FOVF9CSVRGSUVMRFMgY2FzZXMgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMuCi0JKGVtaXRfZXhwcik6IE5ldyBmdW5jdGlvbiB0byB3cml0ZSBkYXRhIGludG8gb2JqZWN0IGZpbGUuCi0JQ29uZGl0aW9uYWxpemUgb24gVENfQ09OU19GSVhfTkVXIGFuZCBUQ19DT05TX1JFTE9DIHJhdGhlciB0aGFuIG9uCi0JcHJvY2Vzc29yIHR5cGVzLgotCShwYXJzZV9iaXRmaWVsZF9jb25zKTogTmV3IGZ1bmN0aW9uIHRvIHBhcnNlIGJpdGZpZWxkIGV4cHJlc3Npb25zCi0JYXMgdXNlZCBieSBpOTYwIGFzc2VtYmxlcnMuICBPbmx5IGNvbXBpbGVkIGlmCi0JQklURklFTERfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLgotCShwYXJzZV9tcmlfY29ucyk6IE5ldyBmdW5jdGlvbiB0byBwYXJzZSBNUkkgc3R5bGUgc3RyaW5ncy4gIE9ubHkKLQljb21waWxlZCBpZiBNUkkgaXMgZGVmaW5lZC4KLQkocGFyc2VfcmVwZWF0X2NvbnMpOiBOZXcgZnVuY3Rpb24gdG8gcGFyc2UgcmVwZWF0IGNvdW50cy4gIE9ubHkKLQljb21waWxlZCBpZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBpcyBkZWZpbmVkLgotCSogcmVhZC5oIChlbWl0X2V4cHIpOiBBZGRlZCBkZWNsYXJhdGlvbiBvZiBuZXcgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtYTI5ay5oIChUQ19DT05TX1JFTE9DKTogRGVmaW5lIHRvIGJlIFJFTE9DXzMyLgotCSogY29uZmlnL3RjLWg4MzAwLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gYmUgUl9SRUxXT1JELgotCSogY29uZmlnL3RjLWhwcGEuYyAocGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEpOiBOZXcgZnVuY3Rpb24gdG8KLQlwYXJzZSBhIEhQUEEgZXhwcmVzc2lvbiwgcmF0aGVyIHRoYW4gc3BlY2lhbCBjYXNlIGluIGNvbnMKLQlmdW5jdGlvbi4KLQkoY29uc19maXhfbmV3X2hwcGEpOiBOZXcgZnVuY3Rpb24gdG8gZW1pdCBhbiBIUFBBIGZpeHVwLCByYXRoZXIKLQl0aGFuIHNwZWNpYWwgY2FzZSBpbiBlbWl0X2V4cHIgZnVuY3Rpb24uCi0JKiBjb25maWcvdGMtaHBwYS5oIChUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04sIFRDX0NPTlNfRklYX05FVyk6Ci0JRGVmaW5lIHRvIHVzZSBuZXcgZnVuY3Rpb25zIGZyb20gdGMtaHBwYS5jLgotCSogY29uZmlnL3RjLWk5NjAuaCAoQklURklFTERfQ09OU19FWFBSRVNTSU9OUyk6IERlZmluZS4KLQkoV0FOVF9CSVRGSUVMRFMpOiBSZW1vdmVkOyBub3cgb2Jzb2xldGUuCi0JKiBjb25maWcvdGMtbWlwcy5oIChSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1uczMyay5jIChjb25zX2ZpeF9uZXdfbnMzMmspOiBOZXcgZnVuY3Rpb24gdG8gZW1pdCBhbgotCU5TMzJLIGZpeHVwLCByYXRoZXIgdGhhbiBzcGVjaWFsIGNhc2UgaW4gZW1pdF9leHByIGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLW5zMzJrLmggKFRDX0NPTlNfRklYX05FVyk6IERlZmluZSB0byBiZQotCWNvbnNfZml4X25ld19uczMyay4gIEFsc28gdXNlIFBBUkFNUyByYXRoZXIgdGhhbiBjaGVja2luZwotCV9fU1REQ19fLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX0NPTlNfUkVMT0MpOiBEZWZpbmUgdG8gUkVMT0NfMzIuCi0KLQkqIHdyaXRlLmMgKHJlbGF4X2FuZF9zaXplX3NlZywgYWRqdXN0X3JlbG9jX3N5bXMsIHdyaXRlX2NvbnRlbnRzKToKLQlEb24ndCBjb3JlIGR1bXAgaWYgZ2FzIGhhcyBubyBpbmZvcm1hdGlvbiBhYm91dCBhIHNlY3Rpb24uCi0KLVdlZCBKdW4gMzAgMDY6MjE6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBJZiBzcGFyY3Y5IGlzIGRlZmluZWQsIHJlc2V0Ci0JY3VycmVudF9hcmNoaXRlY3R1cmUgdG8gdjkgYXV0b21hdGljYWxseS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9GT1JNQVQpOiBVc2UgZWxmNjQtc3BhcmMgZm9yIHY5LgotCi0JKiBjb25maWcvdGMtc3BhcmM2NC5oLCBjb25maWcvdGMtc3BhcmM2NC5jOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFVzZSBzcGFyYzY0IGNwdSBmaWxlcyBmb3IgdjksIGFuZCBkZWZhdWx0IHRvIGVsZgotCWZvcm1hdC4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogQWx3YXlzIGZ1bGx5IHByb2Nlc3MgYSBzZWN0aW9uLgotCVNlY3Rpb24gc2l6ZSBpcyBsYXN0IGZyYWcncyAodm0pYWRkcmVzcyBwbHVzIGl0cyBzaXplLiAgSWYgbm8KLQlyZWxvY2F0aW9ucyBhcmUgcHJlc2VudCwgZm9yY2UgU0VDX1JFTE9DIGZsYWcgY2xlYXIuCi0JKGR1bXBfc2VjdGlvbl9yZWxvY3MpOiBOZXcgZGVidWdnaW5nIHJvdXRpbmUuCi0JKGFkanVzdF9yZWxvY19zeW1zKTogTmV3IHJvdXRpbmUsIGJyb2tlbiBvdXQgZnJvbSB3cml0ZV9jb250ZW50cy4KLQlEb24ndCBhZGp1c3QgcmVsb2NzIHRoYXQgYXJlIGFscmVhZHkgcmVsYXRpdmUgdG8gc2VjdGlvbiBzeW1ib2wuCi0JTG9vayBmb3Igb2JqX2ZpeF9hZGp1c3RhYmxlIG1hY3JvIHRvIGtub3cgd2hhdCBlbHNlIHRvIHNraXAsCi0JaW5zdGVhZCBvZiBvYmpfd3JpdGVfc3ltYm9sLiAgTG9vayBmb3Igc2VjdGlvbiBzeW1ib2wgc3RvcmVkIGluCi0Jc2VjdGlvbiBpbmZvcm1hdGlvbi4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBNYXAgYWRqdXN0X3JlbG9jX3N5bXMgb3ZlciBhbGwgc2VjdGlvbnMuCi0JKHdyaXRlX2NvbnRlbnRzKTogQ2xlYXIgU0VDX1JFTE9DIGZsYWcgaWYgbm8gcmVsb2NhdGlvbnMgYXJlCi0JZm91bmQuCi0KLQkqIGFzLmggKF9fUFRSX1RPX0lOVCwgX19JTlRfVE9fUFRSKTogTmV3IHZlcnNpb25zIGZvciBTYWJlciwgdG8KLQlrZWVwIGl0IHF1aWV0LgotCi0JKiB3cml0ZS5jIChyZW1vdmVfc3Vic2Vncyk6IERvbid0IGRlZmluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQotRnJpIEp1biAyNSAxNDo0Mjo1MyAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhbGwsIGR2aSwgaW5mbywgaW5zdGFsbC1pbmZvLCBjbGVhbi1pbmZvKTogZG8gbm90Ci0JICBlY2hvIHJlY3Vyc2lvbiBsaW5lcy4KLQkgIChpbnN0YWxsLWluZm8sIGNsZWFuLWluZm8pOiBjb2xsYXBzZSBpbnRvIHRoZSBkdmkgYW5kIGluZm8gcnVsZS4KLQotRnJpIEp1biAyNSAxMDo0NzoyNCAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBSZW1vdmUgc3VwcG9ydCBmb3IgJWQvJXEgZnAgcmVncy4KLQlBbGwgZnAgcmVncyBhcmUgbm93IHNwZWNpZmllZCBhcyAlZi4KLQkocHJpdl9yZWdfdGFibGUpOiBmcHEgLT4gZnEuCi0KLUZyaSBKdW4gMjUgMDM6NDM6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGFzLmggKHN0cnN0cik6IERpc2FibGUgZGVjbGFyYXRpb24gZm9yIG5vdy4KLQkoZnByaW50X3ZhbHVlLCBzcHJpbnRfdmFsdWUpOiBEZWNsYXJlLgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IFVzZSBtZW1zZXQgdG8gY2xlYXIgbmV3IGZyYWcuCi0JKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogSW5pdGlhbGl6ZSBhbGwgc2VnaW5mbyBmaWVsZHMuCi0KLQkqIGV4cHIuYyAoZXhwcl9wYXJ0KTogTWFkZSBzYW5pdHkgY2hlY2tzIGEub3V0LXNwZWNpZmljLgotCShleHByKTogRGlzYWJsZWQgc2FuaXR5IGNoZWNrcy4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSkgW0JGRF9BU1NFTUJMRVJdOiBBZGQgZmllbGQgZm9yCi0Jc2VjdGlvbiBzeW1ib2wuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19jaGFuZ2UpOiBJbml0aWFsaXplIHNlY3Rpb24gc3ltYm9sIHBvaW50ZXIKLQl3aGVuIHNldHRpbmcgdXAgYSBuZXcgc2VjdGlvbi4KLQotCSogc3ltYm9scy5jIChzeW1ib2xfbmV3KSBbQkZEX0FTU0VNQkxFUl06IFBvaW50IEJGRCBzeW1ib2wncyB1ZGF0YQotCWZpZWxkIGJhY2sgYXQgZ2FzIHN5bWJvbCBzdHJ1Y3R1cmUuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDYXN0IG9ic3RhY2tfbmV4dF9mcmVlIHZhbHVlIHRvIGNoYXIqIGJlZm9yZQotCWRvaW5nIGFyaXRobWV0aWMgb24gaXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IExpa2V3aXNlLgotCSogYXMuaCAoZnJhZ19ub3dfZml4KTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9maWxlX3N5bWJvbCk6IFVzZSBzdWJzZWdfbmV3IGluc3RlYWQgb2YKLQljYWxsaW5nIGJmZF9tYWtlX3NlY3Rpb25fb2xkX3dheSBkaXJlY3RseSwgYW5kIGNhbGwgc3Vic2VnX3NldAotCWluc3RlYWQgb2Ygc3Vic2VnX2NoYW5nZS4gIE5vdyByZXR1cm5zIHZvaWQuCi0JKG9ial9lbGZfd3JpdGVfc3ltYm9sKTogT25seSBjaGVjayBsb2NhbCBzeW1ib2xzIGZvciBub3cuCi0JKGVsZl9zdGFiX3N5bWJvbCk6IE5vdyBzdGF0aWMgYW5kIHZvaWQsIGFuZCBkaXNhYmxlZCB1bnRpbCBpdAotCXdvcmtzIGNvbXBsZXRlbHkuCi0JKG9ial9lbGZfc2l6ZSk6IEZvciBleHByZXNzaW9uIHZhbHVlcywgZmFpbCBzaWxlbnRseSBmb3Igbm93LgotCShvYmpfc3ltYm9sX25ld19ob29rKTogRG8gbm90aGluZy4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AyMgotCXJlbG9jYXRpb24uCi0JKHNfbG9jYWwpIFtPQkpfRUxGXTogTmV3IGZ1bmN0aW9uLgotCShtZF9wc2V1ZG9fdGFibGUpIFtPQkpfRUxGXTogQ2FsbCBpdCBmb3IgImxvY2FsIi4KLQkoc19jb21tb24pOiBSZWFycmFuZ2UgdG8gaGFuZGxlIFNvbGFyaXMgLmNvbW1vbiBwc2V1ZG8sIHdoaWNoIG1heQotCXNvbWV0aW1lcyB1c2UgYnNzIHNwYWNlIGluc3RlYWQgb2YgY29tbW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBBZGQgbmV3IGBsb2NhbCcgZmllbGQuCi0KLVRodSBKdW4gMjQgMTY6MzM6NTMgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHNldCBob3N0IGNvbmZpZyB0byBocHV4IGZvciBocHBhKi1ocC1ocHV4Ci0KLVRodSBKdW4gMjQgMTM6MzU6MDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChhcHBfcG9wLCBhcHBfcHVzaCk6IEZpeCBidWcgcmVwb3J0ZWQgYnkgQ2hyaXMgQXJ0aHVyLgotCi1UdWUgSnVuIDIyIDAxOjA0OjIzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBEb24ndCBzcGVjaWFsLWNhc2UgYS5vdXQgLVIgZmxhZyBoZXJlLgotCSogY29uZmlnL29iai1hb3V0LmMgKHNfc2VjdCk6IERvIGl0IGhlcmUuCi0KLQkqIGFzLmggKEJBRF9DQVNFKTogRG9uJ3QgbWFrZSBzb21lIGxhbWUgY29tcGlsZXJzIHRoaW5rIHdlIHdhbnQKLQlzdWJzdGl0dXRpb24gaW5zaWRlIHN0cmluZ3MuCi0KLQkqIGFzLmMgKHByaW50X3ZlcnNpb25faWQpOiBOZXcgZnVuY3Rpb24sIHNwbGl0IG9mZiBmcm9tIG1haW4uCi0JKG1haW4pOiBDYWxsIGl0LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BhcnNlX29wdGlvbikgW09CSl9FTEZdOiBQcmludCB2ZXJzaW9uIGlkCi0JZm9yIC1WLiAgSWdub3JlIC1RIGFuZCAtcyBvcHRpb25zIGZvciBub3cuCi0KLU1vbiBKdW4gMjEgMTc6Mzc6NTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbWFrZSBpbnN0YWxsYXRpb24gJiBidWlsZHMgd29yayBhZ2FpbiBmb3IgY3Jvc3NlcwotCi1TdW4gSnVuIDIwIDE4OjE4OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmMgKGxpc3Rfc3ltYm9sX3RhYmxlKTogUmV3cml0ZSB0byBwcmludCB3aWRlICg+MzIgYml0cykKLQlzeW1ib2wgdmFsdWVzIGNvcnJlY3RseS4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBEZWxldGVkIHVudXNlZCB2YXJpYWJsZXMuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2Ugc3ByaW50X3ZhbHVlLgotCi0JKiBtZXNzYWdlcy5jIChzcHJpbnRfdmFsdWUsIGZwcmludF92YWx1ZSk6IE5ldyByb3V0aW5lcy4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3N0YWJfc3ltYm9sKTogTm93IHJldHVybnMgdm9pZC4KLQkob2JqX2VsZl9zdGFiX2dlbmVyaWMpOiBGaXggdHlwbyBpbiBsb2dpYy4KLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogTG9vayBpbiAuLi9iZmQgZm9yIGJmZC5oLgotCi0JKiBhcy5oIChhZGRyZXNzVCwgb2Zmc2V0VCk6IE5ldyB0eXBlcywgdXNpbmcgQkZEIHR5cGVzIGlmCi0JYXZhaWxhYmxlLgotCShyZWxheF9hZGRyZXNzVCwgc3RydWN0IGZyYWcpOiBVc2UgdGhlbS4KLQkqIHN0cnVjLXN5bWJvbC5oICh2YWx1ZVQsIHN0cnVjdCBicm9rZW5fd29yZCk6IExpa2V3aXNlLgotCi0JKiBhcy5oIChzdWJzZWdfbmV3KSBbQkZEX0FTU0VNQkxFUl06IE5hbWUgYXJndW1lbnQgaXMgY29uc3QuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogTmFtZSBhcmd1bWVudCBpcyBjb25zdC4KLQotVGh1IEp1biAxNyAxNjo1Mzo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2Fub25pY2FsaXplIGluc3RhbGwuc2g7IGZvciB1c2Ugd2l0aGluCi0JdGhpcyBkaXJlY3RvcnkgKGFuZCBzdWJkaXJzKQotCi1TdW4gSnVuIDIwIDAyOjM0OjA0IDE5OTMgIEFzaGxleSBTYXVsc2J1cnkgKGFuc0BzaWNzLnNlKQotCi0JKiBtODhrLW9wY29kZS5oIDogZml4ZWQgdGlueSB0aW55IG1pc3Rha2UgLSB4Y3Igd2FzIGluY29ycmVjdGx5Ci0Jc3BlY2lmaWVkLCBzaG91bGQgaGF2ZSBib3RoIFMxIGFuZCBTMiBmaWVsZHMgaWRlbnRpY2FsCi0JSWYgb25seSBmaW5kaW5nIHRoZSBwcm9ibGVtIHdhcyBhcyBmYXN0IGFzIGZpeGluZyB0aGUgYnVnICEhISEKLQotVHVlIEp1biAxNSAxNjowMTo1NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX2NvbnRlbnRzKTogRG8gd3JpdGUgb3V0IG5vbi1sb2FkYWJsZSBzZWN0aW9ucy4KLQlEZWJ1ZyBzZWN0aW9ucyBjYW4gZmFsbCBpbiB0aGlzIGNhdGVnb3J5LgotCi0JKiByZWFkLmMgKHNfYXBwX2ZpbGUpOiBDYWxsIGVsZl9maWxlX3N5bWJvbCBmb3IgRUxGIGZpbGVzLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2ZpbGVfc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogUmVuYW1lZCBmcm9tIHBhXy4uLiwKLQlhZGRlZCBhcmd1bWVudCB0byBzcGVjaWZ5IHNlY3Rpb24gYmFzZSBuYW1lLgotCShvYmpfZWxmX3N0YWJfZ2VuZXJpYyk6IFJlbmFtZWQgZnJvbSAuLi5fc3RhYi4gIE5ldyBhcmd1bWVudAotCXNwZWNpZmllcyBzZWN0aW9uIGJhc2UgbmFtZS4KLQkob2JqX2VsZl9zdGFiKTogTmV3IGZ1bmN0aW9uLCBjYWxscyBvYmpfZWxmX3N0YWJfZ2VuZXJpYyB3aXRoCi0JIi5zdGFiIiBhcyBzZWN0aW9uIGJhc2UgbmFtZS4KLQkob2JqX2VsZl94c3RhYik6IE5ldyBmdW5jdGlvbiwgY2FsbHMgb2JqX2VsZl9zdGFiX2dlbmVyaWMuCi0JKG9ial9lbGZfdHlwZSk6IEhhbmRsZSAib2JqZWN0Ii4gIFVzZSBiaXR3aXNlLW9yIHRvIG1lcmdlIGluCi0Jc3ltYm9sIGZsYWdzIHJhdGhlciB0aGFuIHNpbXBseSByZXBsYWNpbmcsIHNvIGdsb2JhbC9sb2NhbCBmbGFncwotCWFyZSBwcmVzZXJ2ZWQuCi0JKG9ial9lbGZfaWRlbnQpOiBSZXdyaXRlLgotCi1UdWUgSnVuIDE1IDE3OjAzOjI1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHJlbW92ZSBwYXJlbnRkaXIgc3VwcG9ydDsgdXNlIElOU1RBTExfWEZPUk0KLQotV2VkIEp1biAgOSAxMToyNjowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IC5hbGlnbiB1c2VzIGEgcG93ZXIgb2YgdHdvCi0JZm9yIGFueSBhLm91dCB0YXJnZXQsIG5vdCBqdXN0IExpbnV4IGFuZCAzODZCU0QuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChET1RfTEFCRUxfUFJFRklYKTogRG8gbm90IGRlZmluZSBmb3IgYW55IGEub3V0Ci0JdGFyZ2V0LgotCi1Nb24gSnVuICA3IDEzOjMzOjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW04OGsuYzogRG9uJ3QgaW5jbHVkZSBmbG9udW0uaCwgbWQuaCwgbTg4ay5oLiAgVGhleQotCWRvbid0IGV4aXN0IG9yIGR1cGxpY2F0ZSBvdGhlciBpbmNsdXNpb25zLgotCi0JKiBjb25maWcvdGMtdmF4LmggKE5PX1JFTE9DKTogRGVmaW5lLgotCi1Nb24gSnVuICA3IDA5OjU1OjAzIDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEZpeCBwYXJzaW5nIG9mIGFzaSBudW1iZXIuCi0JRml4IGVycm9yIG1lc3NhZ2UuCi0KLVNhdCBKdW4gIDUgMTk6MzI6NTIgMTk5MyAgVG9yYmpvcm4gR3Jhbmx1bmQgICh0ZWdlQG5hZGEua3RoLnNlKQotCi0JKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IEFkZCA4ODExMCBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvY29uZmlnL3RjLW04OGsuYyAoZ2V0X3JlZyk6IE5ldyBhcmcgcmVnX3ByZWZpeC4gIENvbXBhcmUgZmlyc3QKLQljaGFyIHRvIHJlZ19wcmVmaXggaW5zdGVhZCBvZiB0byAncicuCi0JKGNhbGNvcCk6IENoYW5nZSBjYWxscyB0byBnZXRfcmVnLgotCShjYWxjb3ApOiBIYW5kbGUgbmV3IGNhc2UgJ3gnIHRvIHNldCByZWdfcHJlZml4LgotCShjYWxjb3ApOiBTZXQgcmVnX3ByZWZpeCB0byAncicgYWZ0ZXIgZWFjaCBjYWxsIHRvIGdldF9yZWcuCi0JKGNtcHNsb3QpOiBBZGQgODgxMTAgY29uZGl0aW9ucy4KLQotCSogZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oOiBTd2FwIGNhc2VzIGZvciAicm90IiBmb3IgY29uc2lzdGVuY3kuCi0KLQkqIGdhcy9jb25maWcvdGMtbTg4ay5jIChnZXRfYmYpOiBBbHdheXMgcmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIKLQliZWZvcmUgcmV0dXJuaW5nLgotCi0JKiBnYXMvY29uZmlnL204OGstb3Bjb2RlLmggKG04OGtfb3Bjb2Rlcyk6IE1ha2UgZXF1YWwgbW5lbW9uaWNzCi0JYWRqYWNlbnQ7IG1vdi5zIGFuZCBtb3YuZCBzd2FwcGVkLgotCShtODhrX29wY29kZXMpOiBGaXggdHlwbyBgcjInIC0+IGAyJy4KLQotRnJpIEp1biAgNCAxNTo1OTozMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvaDgzMDAuYzogU3VwcG9ydCBmb3IgSDgvMzAwLUggb3Bjb2Rlcy4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKHdfc3RyaW5ncyk6IFN0cmluZyB0YWJsZSBsZW5ndGggaXMgNAotCWJ5dGVzLCBubyBtYXR0ZXIgd2hhdCB0aGUgaG9zdCBpbnQgc2l6ZSBpcy4KLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW9zZiopOiBOZXcuCi0KLUZyaSBKdW4gIDQgMDc6NTE6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lY29mZmwqKTogTmV3IHRhcmdldDsgdXNlIGVjb2ZmIGFuZAotCW1pcHMtbGl0LgotCShtaXBzLSotZWNvZmYqKTogQWRkZWQgdHJhaWxpbmcgJyonLgotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3Byb2NzKTogRm9yY2UgdGhlIGFkciBvZiB0aGUKLQlmaXJzdCBGRFIgaW4gYSBmaWxlIHRvIGJlIHplcm8uCi0KLVRodSBKdW4gIDMgMTQ6MDk6NTkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IEp1bXAgdG8gMi4xLjQuCi0KLQkqIGNvbmZpZy9oby1ocHBhYnNkLmg6IE5ldyBmaWxlLCBmcm9tIFBldGVyIEhvb2dlbmJvb20uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2Fzc2VtYmxlKTogQ2FsbCBiZmRfc2V0X2dwX3NpemUgb25seSBmb3IKLQlFQ09GRiBmb3JtYXQuCi0KLVR1ZSBKdW4gIDEgMTU6MjE6NTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hc3NlbWJsZSk6IFRoZSA2ODA0MCBjcHUgZG9lc24ndCB3YW50IGEKLQlzZXBhcmF0ZSAnODUxIG1tdS4KLQotCSogY29uZmlnL29iai1lbGYuYywgY29uZmlnL29iai1lbGYuaDogVXBkYXRlIGZvciBuZXcgdHlwZSwgbWFjcm8sCi0JYW5kIHJvdXRpbmUgbmFtZXMuICBBc3N1bWluZyAzMiBiaXRzIGZvciBub3cuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX2ZpbGUpOiBMb29rIGZvciBtYWNybwotCWVsZl90Y19maW5hbF9wcm9jZXNzaW5nX2hvb2ssIGluc3RlYWQgb2YgYXNzdW1pbmcgYSBmdW5jdGlvbgotCWFsd2F5cyBleGlzdHMuCi0JKiBjb25maWcvdGMtaHBwYS5jIChlbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nX2hvb2spOiBSZW5hbWVkIGZyb20KLQl0Y19maW5hbF9wcm9jZXNzaW5nX2hvb2suCi0JKiBjb25maWcvdGMtaHBwYS5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZ19ob29rKTogVXNlIGl0LgotCi0JKiBjb25maWcvdGMtaHBwYS5oIChlbGZfdGNfc3ltYm9sLCBlbGZfdGNfbWFrZV9zZWN0aW9ucyk6IE1hY3JvcwotCW1vdmVkIGhlcmUgZnJvbSBvYmotZWxmLmguCi0JKiBjb25maWcvb2JqLWVsZi5oOiBEb24ndCBpbmNsdWRlIENQVS1zcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0KLVN1biBNYXkgMzAgMTY6NDk6MzcgMTk5MyAgUGV0ZXIgSG9vZ2VuYm9vbSAgKGhvb2dlbkBmYXN0LmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyYXRpb25zIHNob3VsZCBtYXRjaCBvbiAnaHBwYSonIG5vdCAnaHBwYScuCi0KLQkqIHJlYWQuYzogQWRkIHN1cHBvcnQgZm9yIEhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4IChkZW5vdGVkCi0Jd2l0aCAnI2lmZGVmIFRDX0hQUEEnKS4KLQotCSogc3ltYm9scy5jOiBBZGQgc3VwcG9ydCBmb3IgSFBQQSBhc3NlbWJseSBsYW5ndWFnZSBzeW50YXggKGRlbm90ZWQKLQl3aXRoICcjaWZkZWYgVENfSFBQQScpLgotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6ICBBZGQgc3VwcG9ydCBmb3IgSFBQQS1zdHlsZQotCXJlbG9jYXRpb25zLgotCi0JKiBjb25maWcvb2JqLWVsZi5jOiBTdGFiIHN5bWJvbHMgd2VyZW4ndCB3cml0dGVuIHByb3Blcmx5LgotCShvYmpfZWxmX3ZlcnNpb24pOgotCShvYmpfZWxmX2Rlc2MpOgotCShvYmpfZWxmX3dyaXRlX3N5bWJvbCk6Ci0JKG9ial9lbGZfd3JpdGVfc3ltYm9sX3ApOgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sKToKLQkoZWxmX3N0YWJfc3ltYm9sKToKLQkoZWxmX2Zyb2JfZmlsZSk6Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmM6IFN1cHBvcnQgZm9yIEhQUEEgc3ltYm9sIGV4dGVuc2lvbiBzZWN0aW9ucy4KLQlSZW1vdmUgc29tZSB1bnVzZWQgY29kZS4gIFN1cHBvcnQgZm9yIEhQUEEgYXNzZW1ibHkgbGFuZ3VhZ2UKLQlzeW50YXguCi0KLQkqIGFwcC5jOgotCi0JKiBzeW1ib2xzLmM6Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmg6Ci0JKG9ial93cml0ZV9zeW1ib2wpOgotCShvYmpfZnJvYl9maWxlKToKLQkoZWxmX3RjX3N5bWJvbCk6Ci0JKGVsZl90Y19tYWtlX3NlY3Rpb25zKToKLQotCSogY29uZmlnL3RjLWhwcGEuaDoKLQotU3VuIE1heSAzMCAyMTo0NDo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfcmVhZF9iZWdpbl9ob29rLCBhZGRfZmlsZSk6IEFzc3VtZQotCWhhc2hfbmV3IHdpbGwgaGF2ZSBzdWNjZWVkZWQgaWYgaXQgcmV0dXJucy4KLQkqIGNvbmZpZy90Yy1hMjlrLmMgKG1kX2JlZ2luKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogTm93IG5ieXRlc19yX2xlbmd0aCBpcwotCWNvbnN0LgotCShtb2RlX2Zyb21fZGlzcF9zaXplLCBvcGNvZGVfc3VmZmljX3RvX3R5cGUpOiBOb3cgaW5saW5lIHVuZGVyCi0JZ2NjLgotCShmaXRzX2luX3tzaWduZWQsdW5zaWduZWR9X3tieXRlLHdvcmR9KTogTGlrZXdpc2UuCi0KLQkqIGV4cHIuYzogRGVsZXRlIHJlZ2lzdGVyIGRlY2xhcmF0aW9uczsgZ2NjIGlnbm9yZXMgdGhlbSBhbnl3YXlzLgotCi1GcmkgTWF5IDI4IDE5OjAzOjMyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaGFzaC5jIChoYXNoX25ldyk6IFVzZSB4bWFsbG9jLCBzaW5jZSBtYW55IGNhbGxlcnMgZG9uJ3QgY2hlY2sKLQlmb3IgZmFpbHVyZS4KLQotVGh1IE1heSAyNyAxMzowMjoxNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGZyYWdzLmMgKHplcm9fYWRkcmVzc19mcmFnLCBic3NfYWRkcmVzc19mcmFnKTogVGhlc2UgYXJlCi0JZXh0ZXJuYWwuCi0KLQkqIHRjLmggKG1kX3JlbG9jX3NpemUpOiBUaGlzIGlzIGNvbnN0LgotCSogY29uZmlnL3RjLXthMjlrLGg4MzAwLGg4NTAwLGkzODYsaTg2MCxpOTYwLG02OGssbnMzMmssejhrfS5jCi0JKG1kX3JlbG9jX3NpemUpOiBOb3cgY29uc3QuCi0KLQkqIGNvbmZpZy9hb3V0X2dudS5oIChlbnVtIG1hY2hpbmVfdHlwZSwgZW51bSByZWxvY190eXBlKTogRGVsZXRlCi0JdHJhaWxpbmcgY29tbWFzLgotCSogYXMuaCAoZW51bSBfc2VnVCk6IERpdHRvLgotCi0JKiBzdHJ1Yy1zeW1ib2wuaCAoTl9UWVBFX3NlZyk6IFRoaXMgc2hvdWxkIGJlIGNvbnN0LgotCi1UaHUgTWF5IDI3IDExOjQzOjU5IDE5OTMgIE1pY2hhZWwgTWVpc3NuZXIgIChtZWlzc25lckBvc2Yub3JnKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGFkZF9maWxlKTogQ2FzdCBmaWxlX25hbWUgdG8gY2hhciAqIGluCi0JbGlzdGluZ19zb3VyY2VfZmlsZSBjYWxsLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfc3RhYl9zeW1ib2xfc3RyaW5nKTogQ2FzdCBmaXJzdCBhcmd1bWVudAotCW9mIHN1YnNlZ19uZXcgY2FsbCB0byBlbGltaW5hdGUgY29uc3QgYXR0cmlidXRlLgotCShvYmpfZWxmX3N0YWIpOiBEaXR0by4KLQkob2JqX3N5bWJvbF9uZXdfaG9vayk6IENhc3QgZmlyc3QgYXJndW1lbnQgb2YgYnplcm8gY2FsbCB0byBjaGFyICouCi0KLQkqIHJlYWQuYyAoc19hbGlnbl9ieXRlcyk6IFByb3Blcmx5IHJlY29yZCBhbGlnbm1lbnQuCi0KLQkqIGV4cHIuYyAoX18pOiBVbmRlZmluZSBfXyBtYWNybyBiZWZvcmUgdXNlLCBzaW5jZSBPU0YvMSB1c2VzIGl0Ci0JZm9yIHRoZSBwcm90b3R5cGUvbm8gcHJvdG90eXBlIG1hY3JvLgotCi0JKiBhcy5jIChnb3Rfc2lnKTogRG9uJ3QgZG8gcmV0dXJuICgoU0lHVFkpIDApLCBTSUdUWSBtaWdodCB3ZWxsIGJlCi0Jdm9pZC4KLQotCSogYXMuaCAocmVsYXhfc3RhdGVUIGVudW0pOiBEZWxldGUgdHJhaWxpbmcgY29tbWEuCi0KLVRodSBNYXkgMjcgMTE6MDc6NTAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBMZXQgbGluZV9jb21tZW50X2NoYXJzIG92ZXJyaWRlCi0JY29tbWVudF9jaGFycy4KLQkoZG9fc2NydWJfbmV4dF9jaGFyKTogSWYgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIGlzIG5vdCBhdCB0aGUKLQlzdGFydCBvZiBhIGxpbmUsIHRyZWF0IGl0IGFzIGEgY29tbWVudCBjaGFyYWN0ZXIgaWYgaXQgaXMgb25lLgotCUZvciBhIENQUCBsaW5lIGNvbW1lbnQgdXNlIHBzZXVkby1vcCAuYXBwbGluZSByYXRoZXIgdGhhbiAubGluZS4KLQkqIGlucHV0LXNjcnViLmMgKGxvZ2ljYWxfaW5wdXRfbGluZSk6IE1ha2UgaW50IHJhdGhlciB0aGFuCi0JdW5zaWduZWQuCi0JKGlucHV0X3NjcnViX3B1c2gsIGlucHV0X3NjcnViX2JlZ2luKTogSW5pdGlhbGl6ZQotCWxvZ2ljYWxfaW5wdXRfbGluZSB0byAtMSByYXRoZXIgdGhhbiAwLgotCShidW1wX2xpbmVfY291bnRlcnMpOiBJbmNyZW1lbnQgbG9naWNhbF9pbnB1dF9saW5lLgotCShuZXdfbG9naWNhbF9saW5lKTogSWYgbGluZV9udW1iZXIgaXMgLTIsIGRlY3JlbWVudAotCWxvZ2ljYWxfaW5wdXRfbGluZS4KLQkoYXNfd2hlcmUpOiBVc2UgbG9naWNhbF9pbnB1dF9saW5lIGV2ZW4gaWYgaXQgaXMgMC4KLQkqIHJlYWQuaCAoc19hcHBfZmlsZSBwcm90b3R5cGUpOiBOb3cgdGFrZXMgYW4gaW50IGFyZ3VtZW50LgotCSogcmVhZC5jIChwb3RhYmxlKTogTWFrZSAuYXBwZmlsZSBjYWxsIHNfYXBwX2ZpbGUgd2l0aCAxLiAgTmV3Ci0JLmFwcGxpbmUgcHNldWRvLW9wIGNhbGxzIHNfYXBwX2xpbmUuCi0JKHNfYXBwX2ZpbGUpOiBJZiAuYXBwZmlsZSwgY2FsbCBuZXdfbG9naWNhbF9saW5lIHdpdGggLTIgdG8KLQlhY2NvdW50IGZvciBuZXdsaW5lIGluc2VydGVkIGJ5IGRvX3NjcnViX25leHRfY2hhci4gIElmIGxpc3RpbmcsCi0JY2FsbCBsaXN0aW5nX3NvdXJjZV9maWxlLgotCShzX2FwcF9saW5lKTogTmV3IGZ1bmN0aW9uIHRvIGhhbmRsZSBmYWtlIHBzZXVkby1vcCAuYXBwbGluZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfcHNldWRvX3RhYmxlKTogTWFrZSAuYXBwbGluZSBjYWxsCi0Jb2JqX2NvZmZfbG4uCi0JKG9ial9jb2ZmX2xuKTogQWRkZWQgYXJndW1lbnQgdG8gaW5kaWNhdGUgd2hldGhlciAuYXBwbGluZS4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChvYmpfcHNldWRvX3RhYmxlKTogTWFrZSAuYXBwbGluZSBjYWxsCi0Jb2JqX2NvZmZfbG4uCi0JKG9ial9jb2ZmX2xuKTogQWRkZWQgYXJndW1lbnQgdG8gaW5kaWNhdGUgd2hldGhlciAuYXBwbGluZS4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfZmlsZSk6IFBhc3MgYXJndW1lbnQgdG8gc19hcHBfZmlsZS4KLQotVHVlIE1heSAyNSAxMTo1OTowNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0dFVF9WQUxVRSk6IFJlbW92ZWQgdW5uZWNlc3NhcnkgY2FzdC4KLQotVGh1IE1heSAyMCAxOToxNDoyNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2FwcGx5X2ZpeF8yKTogU3RyYWlnaHRlbiBvdXQgY2hlY2sgZm9yCi0JaW52YWxpZCB2YWx1ZXMuCi0KLVdlZCBNYXkgMTkgMDc6MzM6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg1MDAwLmMgKGJ1aWxkX2J5dGVzKTogVW5kZXJzdGFuZCBAcmQgbW9kZSBhbmQgYnVpbGQKLQlyZWxvY2F0aW9ucyBjb3JyZWN0bHkuCi0KLU1vbiBNYXkgMTcgMTU6MDY6MjYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogTGVhdmUgb3V0IFRFWEkyRFZJIGZvciBub3csIGJlY2F1c2UKLQlpdCdzIHdyb25nLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9hcHBseV9maXhfMik6IEFwcGx5IHJhbmdlIGNoZWNrcyBhbmQgd2FybgotCWlmIHZhbHVlIGlzIG91dCBvZiByYW5nZS4KLQotCVBhdGNoIGZyb20gTWluaCBUcmFuLUxlOgotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9vcGVyYW5kKTogRm9yIGluL291dCBwb3J0IHJlZ2lzdGVyIHVzZWQKLQlhcyBiYXNlIHJlZywgaW5jbHVkZSBJbk91dFBvcnRSZWcgaW4gb3BlcmFuZCB0eXBlLgotCShNQVRDSCk6IEFjY2VwdCBvdmVybGFwIHZhbHVlIG9mIEluT3V0UG9ydFJlZy4KLQotTW9uIE1heSAxNyAwOToyOTozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoYWRkX2ZpbGUsIG9ial9lY29mZl9sb2MsIG9ial9lY29mZl9zdGFiKToKLQlBZGQgY2FsbHMgdG8gbGlzdGluZyByb3V0aW5lcyB0byBwcm9kdWNlIGNvbWJpbmVkIHNvdXJjZS9hc3NlbWJsZXIKLQlsaXN0aW5ncy4KLQkob2JqX2Vjb2ZmX3N0YWIpOiBDcmVhdGUgYSBmaWxlIHBvaW50ZXIgaWYgbm9uZSB1c2VkIHlldC4KLQkoZWNvZmZfZnJvYl9maWxlKTogU2V0IHN5bWNvdW50IHRvIGNvcnJlY3QgdmFsdWUuCi0KLUZyaSBNYXkgMTQgMDY6NTM6MzMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChWRVJTSU9OKTogQnVtcCB0byB2ZXJzaW9uIDIuMSwgaW4gcHJlcGFyYXRpb24gZm9yCi0JcmVsZWFzZS4KLQotCSogY29uZmlnL29iai1hb3V0LmggKEhfR0VUX0hFQURFUl9TSVpFLCBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSk6Ci0JRGVmaW5lIGluIHRlcm1zIG9mIGNvbnN0YW50cywgbm90IEMgc3RydWN0dXJlIHNpemVzLgotCi0JKiBjb25maWcvdGMtcnM2MDAwLmMsIGNvbmZpZy90Yy1yczYwMDAuaDogRGVsZXRlIGVtcHR5IGZpbGVzLgotCi1UaHUgTWF5IDEzIDE3OjAxOjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9oZWFkZXJfYXBwZW5kKTogRG9uJ3QgZGVmaW5lIGlmIGl0J3MKLQlkZWZpbmVkIGFzIGEgbWFjcm8uCi0JKiBjb25maWcvb2JqLWhwMzAwLmggKG9ial9oZWFkZXJfYXBwZW5kKTogRGVmaW5lIGl0IGFzIGEgbWFjcm8uCi0JKiBjb25maWcvb2JqLWhwMzAwLmMgKGhwMzAwX2hlYWRlcl9hcHBlbmQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCBib3RoZXIgY2xlYW5pbmcgdXAgZG9jIGZpbGVzOwotCXRoZXkgYXJlbid0IGdvaW5nIHRvIGJlIGluIHRoaXMgZGlyZWN0b3J5LgotCi1UaHUgTWF5IDEzIDA3OjUxOjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSGFuZGxlIGFic29sdXRlCi0Jc3ltYm9scy4KLQotCSogdGMuaCAoVENfQ09GRl9TSVpFTUFDSERFUCk6IERvbid0IGRlZmluZSBoZXJlLgotCSogY29uZmlnL3RjLXNoLmggKFRDX0NPRkZfU0laRU1BQ0hERVApOiBEZWZpbmUgaGVyZSBpbnN0ZWFkLgotCi1Nb24gTWF5IDEwIDA2OjAxOjEyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLXZtcy5jIChWTVNfU3ltYm9sX3R5cGVfbGlzdCk6IERvbid0IGJvdGhlciB3aXRoCi0JaW5pdGlhbGl6YXRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAodGFyZ2V0cyk6IFRyZWF0IG02OCotKi1zeXN2KiBsaWtlIG02OGstKi1jb2ZmLgotCi1XZWQgTWF5ICA1IDE0OjAwOjQ5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBDb3JyZWN0IGZsb2F0aW5nIHBvaW50IGRvdWJsZSB3b3JkCi0JbG9hZHMgYW5kIHN0b3JlcyBmb3IgYmlnIGVuZGlhbiB0YXJnZXQuCi0KLVdlZCBNYXkgIDUgMDg6Mzk6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmM6IFJlcGxhY2UgU0VHXyogd2l0aCAqX3NlY3Rpb24sIGZpeCB1cCBzdWJzZWdfKgotCWNhbGxzLiAgRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLgotCSogY29uZmlnL29iai1jb2ZmLmM6IExpa2V3aXNlLgotCi0JRUxGIHN1cHBvcnQsIG1vc3RseSBjb250cmlidXRlZCBieSBVdGFoOgotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uLCBvYmpfZWxmX3N0YWIsIG9ial9lbGZfbGluZSwKLQlvYmpfZWxmX3R5cGUpOiBSZXdyaXRlLgotCShvYmpfZWxmX2Zyb2Jfc3ltYm9sLCBlbGZfc3RhYl9zeW1ib2xfc3RyaW5nLCBlbGZfc3RhYl9zeW1ib2wsCi0Jb2JqX2VsZl9kZXNjLCBvYmpfZWxmX3ZlcnNpb24sIG9ial9zeW1ib2xfbmV3X2hvb2ssIG9ial9lbGZfc2l6ZSk6Ci0JTmV3IGZ1bmN0aW9ucy4KLQkob2JqX2VsZl9pZGVudCk6IER1bW15LgotCSogY29uZmlnL29iai1lbGYuaCAoRkFMU0UsIFRSVUUsIFNfKiwgdGNfZnJvYl9zeW1ib2wsCi0JVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBOZXcgbWFjcm9zLgotCShnZGJfc2VjdGlvbik6IE5ldyB2YXJpYWJsZSBkZWNsLgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hdG9mKTogUmV0dXJuIHplcm8sIG5vdCBlbXB0eSBzdHJpbmcsIG9uCi0Jc3VjY2Vzcy4KLQotCUJGRF9BU1NFTUJMRVIgY29uZGl0aW9uYWwgY2hhbmdlczoKLQkqIGNvbmZpZy9vYmotY29mZi5jIChsaW5lbm9fcm9vdFAsIHNlZ19OX1RZUEUsICpfc2VjdGlvbl9oZWFkZXIpOgotCURvbid0IGRlZmluZSB0aGVzZS4KLQkoU0FfU0VUX1NZTV9FTkRORFgsIFNBX1NFVF9TWU1fVEFHTkRYKTogTmV3IGZ1bmN0aW9ucy4KLQkoZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uKTogRGl0dG8uCi0JKG9ial9jb2ZmX2VuZGVmKTogQ2FsbCBmZXRjaF9jb2ZmX2RlYnVnX3NlY3Rpb24uCi0JKHN0cnVjdCBsaW5lX25vKTogTmV3IHR5cGUuCi0JKGNfc3ltYm9sX21lcmdlKTogTmV3IHdheSBmb3IgY29weWluZyBhdXggZmllbGRzLgotCShjX2RvdF9maWxlX3N5bWJvbCk6IFB1dCBzeW1ib2wgaW4gYWJzb2x1dGUgc2VjdGlvbiwgYW5kIHNldCBmbGFnCi0JQlNGX0RFQlVHR0lORy4KLQkoZnVuY3Rpb25fbGluZW9mZik6IE5ldyBzeW1ib2wuCi0JKGZ1bmN0aW9uX2xpbmVvZmYsIHRleHRfbGluZW5vX251bWJlciwgb3VyX2xpbmVub19udW1iZXIsCi0JbGluZW5vX2xhc3RQKTogRG9uJ3QgZGVmaW5lLgotCShjX2xpbmVfbmV3KTogRG9uJ3QgZGVmaW5lLgotCShvYmpfZW1pdF9saW5lbm8sIG9ial9jb2ZmX2VuZGVmKTogVXNlIGFib3J0IGNhbGxzIGFzLCB1aCwKLQlwbGFjZWhvbGRlcnMsIHVudGlsCi0JbGluZS1udW1iZXIgcmVjb3JkaW5nIGdldHMgaW1wbGVtZW50ZWQuCi0JKG9ial9uZXdfc3ltYm9sX2hvb2spOiBOZXcgY29kZSBmb3IgaGFuZGxpbmcgYXV4IGZpZWxkcy4KLQkoYWRkX2xpbmVubywgYWRkX2xpbmVzeW0pOiBOZXcgZnVuY3Rpb25zLgotCShvYmpfY29mZl9sbik6IENhbGwgYWRkX2xpbmVubywgbm90IGNfbGluZV9uZXcuCi0JKG9ial9jb2ZmX2VuZGVmKTogTmV3IGNvZGUgZm9yIGhhbmRsaW5nIHN5bWJvbCBuYW1lcy4gIE5ldyBsaW5lbm8KLQljb2RlLiAgTG9vayBmb3Igc2VjdGlvbiBuYW1lICIqREVCVUcqIiBmb3IgZGVidWdnaW5nIHNlY3Rpb24uCi0JKGFsaWduLCBjb2ZmX2NoZWNrX2ZpbGVfc3ltYm9scywgb2JqX2NvZmZfc2VjdGlvbiwKLQljb2ZmX2Zyb2JfZmlsZSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvb2JqLWNvZmYuaDogUmVvcmRlcmVkIHNvbWUgaW5jbHVkZXMuCi0JKEJZVEVfT1JERVJJTkcsIEZJTEVfSEVBREVSX01BR0lDLCBzZWdfTl9UWVBFLCBOX1RZUEVfc2VnLAotCURFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSwgQU9VVEhEUiwgQU9VVEhEUlNJWkUpOiBEb24ndAotCWRlZmluZSB0aGVzZS4KLQkoVEFSR0VUX1NZTUJPTF9GSUVMRFMsIEk5NjBfU1lNX0ZJRUxEUyk6IE5ldyBtYWNyb3MuCi0JKFNZTV9BVVhFTlQpOiBOZXcgbWFjcm8gKGZvciBub24tQkZEX0FTU0VNQkxFUiB0b28pIGZvciBhY2Nlc3NpbmcKLQlhdXggZW50cmllcy4gIE1vc3QgU0FfKiBtYWNyb3Mgbm93IHVzZSBpdCB1bmNvbmRpdGlvbmFsbHkuCi0JKFNfKik6IFVzZSBgYnN5bScgZmllbGQsIGFuZCBhY2Nlc3MgQkZEIHByaXZhdGUgZGF0YS4KLQkoU0ZfKik6IFVzZSBgc3lfZmxhZ3MnIHN5bWJvbCBmaWVsZCBmb3IgbW9zdCBvZiB0aGVzZS4KLQkoSF8qLCBvYmplY3RfaGVhZGVycywgbGluZW5vLCBsaW5lbm9fKlAsIE9CSl9FTUlUX0xJTkVOTyk6IERvbid0Ci0JZGVmaW5lLgotCSgqX3NlY3Rpb25faGVhZGVyKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAobWRfY29udmVydF9mcmFnLCBtZF9hcHBseV9maXgpOiBDaGFuZ2VkCi0JaW50ZXJmYWNlLgotCSh0Y19nZW5fcmVsb2MpIFtJMzg2Q09GRl06IE5ldyBmdW5jdGlvbi4KLQkodGNfYW91dF9maXhfdG9fY2hhcnMsIHRjX2NvZmZfZml4MnJ0eXBlKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0FSQ0gsIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogTmV3Ci0JbWFjcm9zLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoc3RhY2tfaW5pdCk6IERvbid0IGRvIGFzc2lnbm1lbnRzIGluc2lkZQotCWNvbmRpdGlvbnMuCi0JKG9ial9jb2ZmX2RlZik6IFNpbXBsaWZpZWQgaGFuZGxpbmcgb2Ygc3ltYm9sIG5hbWUgYSBiaXQuCi0JKHRhZ19pbnNlcnQpOiBOYW1lIGFyZ3VtZW50IGlzIG5vdyBwb2ludGVyIHRvIENPTlNULgotCShvYmpfY3Jhd2xfc3ltYm9sX2NoYWluKTogQ29tbWVudGVkIG91dC4KLQotCSogY29uZmlnL29iai1jb2ZmLmg6IFVzZSBQQVJBTVMgbWFjcm8gaW4gcHJvdG90eXBlcy4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKSBbQkZEX0FTU0VNQkxFUl06IERvbid0IGluZGlyZWN0Ci0JdGhyb3VnaCBmcmNoYWluUCBwb2ludGVyIGlmIGl0IGlzIG51bGwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogV2FybiBpZiBCRkQgbW9kZSBpcyBleHBsaWNpdGx5IHR1cm5lZCBvZmYgYnV0IGlzCi0JcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHRhcmdldC4KLQkobWlwcyBlY29mZiB0YXJnZXRzKTogRG9uJ3QgbmVlZCB0byBzZXQgYmZkX2dhcyBoZXJlOyBpdCBnZXRzCi0JdGFrZW4gY2FyZSBvZiBsYXRlci4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGNyYXdsX3N5bWJvbHMpOiBEb24ndCBjbGVhciBzeV9mb3J3YXJkCi0JZmllbGQuCi0JKHlhbmtfc3ltYm9scyk6IE1lcmdlIHN5bWJvbHMgb25seSBpZiBzeV9mb3J3YXJkIGlzIG51bGwuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKEFPVVRfTUFDSFRZUEUpOiBEb24ndCBkZWZpbmUgaWYgYWxyZWFkeQotCWRlZmluZWQuCi0KLQkqIHRjLmggKG1kX2NvbnZlcnRfZnJhZykgW0JGRF9BU1NFTUJMRVJdOiBTZWN0aW9uIGFyZyBpcyBub3QKLQlwb2ludGVyLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfY29udmVydF9mcmFnKSBbQkZEX0FTU0VNQkxFUl06IERpdHRvLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTE9DQUxfTEFCRUwpIFtPQkpfRUxGXTogQW55dGhpbmcgc3RhcnRpbmcKLQl3aXRoICIuIiBpcyBhIGxvY2FsIGxhYmVsLgotCi0JKiBjb25maWcvdGUtaHBwYS5oLCBjb25maWcvdGMtaHBwYS5oLCBjb25maWcvdGMtaHBwYS5jOiBOZXcgY29uZmlnCi0JZmlsZXMuCi0KLQkqIGNvbmZpZy90ZS1saW51eC5oLCBjb25maWcvdGUtMzg2YnNkLmg6IE5ldyBjb25maWcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1saW51eCwgaTM4Ni0qLWJzZCk6IFVzZSB0aGVtLgotCSogY29uZmlnL3RjLWkzODYuaCAoVEFSR0VUX0ZPUk1BVCk6IFNlbGVjdCBmb3JtYXQgYmFzZWQgb24gdGFyZ2V0Ci0JZW52aXJvbm1lbnQuCi0JKERPVF9MQUJFTF9QUkVGSVgpOiBEb24ndCBkZWZpbmUgZm9yIDM4NmJzZCBvciBMaW51eC4KLQotV2VkIE1heSAgNSAxMzoxNDowMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAoaW5pdF9maWxlKTogU2V0IGZNZXJnZSB0byAwIHNpbmNlIGRieCBzZWVtcwotCXRvIHdhbnQgaXQgdGhhdCB3YXkuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBUdXJuIGxvY2FsIHN0X1Byb2Mgc3ltYm9scyBpbnRvCi0Jc3RfU3RhdGljUHJvYyBzeW1ib2xzLiAgU2V0IGluZGV4IGZpZWxkIG9mIGV4dGVybmFsIHN0X1Byb2MgYW5kCi0Jc3Rfc3RhdGljUHJvYyBzeW1ib2xzIGNvcnJlY3RseS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKE5PX0xJU1RJTkcpOiBEb24ndCBkZWZpbmUuICBQZW9wbGUgbWlnaHQgd2FudAotCWxpc3RpbmdzLgotCi1UdWUgTWF5ICA0IDIxOjIyOjU0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1ocDMwMC5oLCBjb25maWcvb2JqLWhwMzAwLmMsIGNvbmZpZy90ZS1ocDMwMC5oOiBOZXcKLQlmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWhwdXgpOiBVc2UgdGhlbS4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9wcmVfd3JpdGVfaG9vayk6IFVzZSBBT1VUX1ZFUlNJT04gaWYKLQlkZWZpbmVkLCBvdGhlcndpc2UgemVyby4KLQotCSogY29uZmlnL2FvdXRfZ251LmggKE9NQUdJQyk6IERvbid0IGRlZmluZSBpZiBhbHJlYWR5IGRlZmluZWQuCi0KLU1vbiBNYXkgIDMgMTU6NTk6MzIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFsbG93IGFueSBhYnMgZXhwcmVzc2lvbiBhcyBhbgotCWFkZHJlc3Mgc3BhY2UgbnVtYmVyLgotCi1XZWQgQXByIDI4IDE5OjExOjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoVEFSR0VUX0RFRkFVTFQpOiBEb24ndCBkZWZhdWx0IHRoaXMgYXQgYWxsLgotCi0JKiBjb25maWcvdGMtYTI5ay5jOiBJbmNsdWRlIGN0eXBlLmguCi0JKGRlZmluZV9zb21lX3JlZ3MpOiBBZGRlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXJzIGZvciAyOTA1MC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoY29tbWVudF9jaGFycykgW1RFX0kzODZBSVhdOiBJbmNsdWRlICIvIi4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBTVFlQX1JFRyBoZXJlLgotCShjaGFuZ2VfdG9fc2VjdGlvbik6IFNldCBpdCBoZXJlIGluc3RlYWQuCi0KLVdlZCBBcHIgMjggMTM6NDA6MjkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1lY29mZi5jIChvYmpfc3ltYm9sX25ld19ob29rKTogTWFrZSB1cCBhIC5maWxlIGlmIG9uZQotCWhhc24ndCBiZWVuIHNlZW4geWV0LgotCShhZGRfZWNvZmZfc3ltYm9sKTogRG9uJ3QgcmVmZXIgdG8gY3VyX2ZpbGVfcHRyIGlmIGl0IGlzIE5VTEwuCi0KLU1vbiBBcHIgMjYgMTg6Mjk6MDUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zaC5jaCwgY29uZmlnL3RjLXNoLmg6IE5ldyBmaWxlcyBzdXBwb3J0aW5nIEhpdGFjaGkKLQlTSC4KLQotTW9uIEFwciAyNiAxMjoyODoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IEZpeCB1bmFyeSBwbHVzIG9wZXJhdG9yIChwcmV2aW91c2x5IHdhcyB0aGUKLQlzYW1lIGFzICd+JyBvcGVyYXRvciEpLgotCi1XZWQgQXByIDIxIDAwOjIwOjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCk6IERlZmluZSBldmVuIGlmIEJGRCBpcyBkZWZpbmVkLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvIGRlZmluZSBpZiBCRkRfQVNTRU1CTEVSLiAgSW52b2tlCi0Jb2JqX2NoZWNrX2ZpbGVfc3ltYm9scyBpZiBkZWZpbmVkLiAgQ2FsbCB2ZXJpZnlfc3ltYm9sX2NoYWluXzIKLQlpbnN0ZWFkIG9mIG9wZW4tY29kaW5nIGl0LiAgRml4IHNvbWUgYnVncyBpbiBwYXRjaGluZyB1cCBzeW1ib2wKLQljaGFpbi4KLQkocmVsYXhfc2VnbWVudCk6IE1ha2Ugc29tZSBjb2RlIHdlICJvdWdodCB0byBiZSBhYmxlIHRvIiB1c2UgZm9yCi0JYWxsIHRhcmdldHMgbm8gbG9uZ2VyIGNvbmRpdGlvbmFsaXplZCBvbiBuczMyayB0YXJnZXQ7IGluc3RlYWQsIGRvCi0JaXQgYWx3YXlzLCBhbmQgaWYgdGhlIGFwcHJvcHJpYXRlIGNvbmRpdGlvbnMgZmFpbCwgYWJvcnQuCi0KLQkqIHN5bWJvbHMuYyAoREVCVUcpOiBFbmFibGVkLgotCShzeW1ib2xfbmV3KTogTWFrZSBzdXJlIGJmZF9tYWtlX2VtcHR5X3N5bWJvbCB3b3Jrcy4KLQkodmVyaWZ5X3N5bWJvbF9jaGFpbl8yKTogTmV3IGZ1bmN0aW9uOyB0YWtlcyBvbmUgc3ltYm9sIGFzCi0JYXJndW1lbnQsIGFueXdoZXJlIGluIHRoZSBjaGFpbi4KLQkoZG9sbGFyX2xhYmVsKik6IFVzZSBkZWZhdWx0IGluaXRpYWxpemVycy4KLQotCSogYXMuYyAocGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzKTogQ2FsbCBtZF9iZWdpbiBoZXJlLi4uCi0JKG1haW4pOiAuLi5hbmQgbm90IGhlcmUuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBVc2UgYS5vdXQtc3Vub3MtYmlnIGZvciBhLm91dC4KLQkodGNfZnJvYl9zeW1ib2wpOiBOZXcgbWFjcm86IEdldCByaWQgb2Ygc3ltYm9scyBpbiByZWdfc2VjdGlvbi4KLQotCSogY29uZmlnL3RjLW02OGsuYyAob21hZ2ljKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShhZGRfZml4LCBhZGRfZnJhZyk6IE5vdyBmdW5jdGlvbnMgaW5zdGVhZCBvZiBtYWNyb3MuCi0JKG02OGtfcmVnX3BhcnNlLCBtNjhrX2lwLCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgZ2V0X251bSwKLQlzX2RhdGExLCBzX2RhdGEyLCBzX2Jzcyk6IFVzZSBuZXcgKl9zZWN0aW9uIG5hbWVzLCBmb3IKLQljb21wYXRpYmlsaXR5IHdpdGggQkZEX0FTU0VNQkxFUiBtb2RlOyByZXdyaXRlIHN3aXRjaCBzdGF0ZW1lbnRzCi0JdG8gaGFuZGxlIG5vbi1pbnRlZ3JhbCBzZWdULgotCSh0Y19jb2ZmX2ZpeDJydHlwZSwgdGNfYW91dF9maXhfdG9fY2hhcnMsCi0JdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCSh0Y19nZW5fcmVsb2MpOiBOZXcgcm91dGluZSBmb3IgQkZEX0FTU0VNQkxFUi4KLQkobWRfYXBwbHlfZml4LCBtZF9hcHBseV9maXhfMik6IFJlbmFtZWQgb2xkIG1kX2FwcGx5X2ZpeCB0bwotCW1kX2FwcGx5X2ZpeF8yOyBuZXcgbWRfYXBwbHlfZml4IGRlZmluaXRpb24gdmFyaWVzIGludGVyZmFjZQotCWRlcGVuZGluZyBvbiBCRkRfQVNTRU1CTEVSLgotCShtZF9jb252ZXJ0X2ZyYWcsIG1kX2NvbnZlcnRfZnJhZ18xKTogTGlrZXdpc2UuICBVc2UgbmV3ICpfc2VjdGlvbgotCW5hbWVzLgotCi0JKiBjb25maWcvb2JqLXZtcy5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCSh2ZXJzaW9uX3N0cmluZyk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkoV3JpdGVfVk1TX01IRF9SZWNvcmRzKTogVXNlIEdBU19WRVJTSU9OIGluc3RlYWQuCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZik6IE5ldyBmdW5jdGlvbiwgdGFrZW4gZnJvbSBWTVMgY29kZSBpbgotCXN5bWJvbHMuYy4KLQkoX2RvcHJudCk6IERlbGV0ZWQuCi0JKFZNU19TdG9yZV9TdHJ1Y3QsIFZNU19EZWZfU3RydWN0LCBWTVNfU2V0X1N0cnVjdCwKLQlWTVNfVEJUX0Jsb2NrX0VuZCwgZ2V0X1ZNU190aW1lX29uX3VuaXgsIGdlbmVyYXRlX3N1ZmZpeCwKLQlWTVNfUHNlY3RfU3BlYyk6IEZpeGVkIHRvIGNvbXBpbGUgdW5kZXIgdHJhZGl0aW9uYWwgQy4KLQkqIGNvbmZpZy9vYmotdm1zLmg6IFVzZSBQQVJBTVMgbWFjcm8uCi0JKHZtc19yZXNvbHZlX3N5bWJvbF9yZWRlZik6IERlY2xhcmUuCi0JKFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTik6IE5ldyBtYWNyby4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBSZW1vdmUgc29tZSBWTVMtc3BlY2lmaWMgY29kZSwgbG9vayBmb3IKLQlSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04gbWFjcm8gaW5zdGVhZC4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IERvbid0IHRyeSBleHBhbmRpbmcgREJjYwotCWluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLWkzODYuYzogUmVvcmRlcmVkIHNvbWUgZnVuY3Rpb25zIHNvIGlubGluaW5nIG1pZ2h0Ci0Jd29yay4gIFVzZSBQQVJBTVMgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCShyZWxvYyk6IE5ldyByb3V0aW5lLgotCShtZF9hc3NlbWJsZSk6IFJlYXJyYW5nZSBzd2l0Y2ggc3RhdGVtZW50cyB0byB3b3JrIHdpdGgKLQlub24taW50ZWdyYWwgc2VnVC4KLQotCSogc3RydWMtc3ltYm9sLmggW0JGRF9BU1NFTUJMRVJdOiBVbmRlZmluZQotCVNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgYmVmb3JlIGRlZmluaW5nIGl0LgotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXdfcmVzdCk6IE5vdyBzdGF0aWMuCi0KLQkqIHJlYWQuYyAocHNldWRvX3NldCk6IEJldHRlciBlcnJvciBtZXNzYWdlIGZvciBkaWZmZXJlbmNlIG9mCi0Jc3ltYm9scyBpbiBkaWZmZXJlbnQgZnJhZ3MuCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IFBhc3MgZG93biBzb21lIG5ldyB2YXJpYWJsZXMsIGluZGljYXRpbmcKLQlwYXRobmFtZSBvciBwcm9ncmFtIG5hbWUgZm9yIGNjLCBubSwgb2JqZHVtcC4KLQotCSogYXMuaCAoT1VUUFVUX0ZMQVZPUik6IE5ldyBtYWNyby4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jICh0Y19nZW5fcmVsb2MpOiBVc2UgT1VUUFVUX0ZMQVZPUi4KLQotCSogY29uZmlndXJlLmluOiBJbml0aWFsaXplIGJmZF9nYXMgcHJvcGVybHkuICBXYXJuIHRoYXQgRUxGCi0Jc3VwcG9ydCBpcyBpbmNvbXBsZXRlLgotCi1UaHUgQXByIDE1IDIyOjM5OjA1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChmbG9hdF9jb25zKTogQWNjZXB0IG51bGwgcG9pbnRlciByZXR1cm4gZnJvbSBtZF9hdG9mLgotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXRvZik6IFJldHVybiBudWxsIGZvciBzdWNjZXNzLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2F0b2YpOiBEaXR0by4KLQotVGh1IEFwciAxNSAxNjowNDozOSAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMudGV4aW5mbzogZm9ybWF0dGluZyBhbmQgY29tbWVudCBjbGVhbnVwczsgc2hvdyBTUEFSQwotCWFsdGVybmF0aXZlIG9wdGlvbnMgaW4gc2FtZSBzdHlsZSBhcyBvdGhlciBtYWNoaW5lczsgc2ltcGxpZnkgc29tZQotCWNvbmRpdGlvbmFsIHVzZTsgaW5jbHVkZSBHUEwgYXMgc2VwYXJhdGUgZmlsZSAoZnJvbSB0ZXhpbmZvIGRpcikKLQotCSogZG9jL01ha2VmaWxlLmluOiAoYXMuaW5mbykgaW5jbHVkZSBkaXJlY3RvcnkgY29udGFpbmluZyBHUEwgaW4KLQltYWtlaW5mbyBzZWFyY2ggcGF0aAotCi0JKiBkb2MvaDgudGV4aTogbmV3IGZpbGU7IGNvbmRpdGlvbmFsIHNldHRpbmdzIGZvciBHQVMgbWFudWFsCi0Jb24gSGl0YWNoaSBjaGlwcwotCi1UdWUgQXByIDEzIDE1OjMxOjQwIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBtZW50aW9uIFNQQVJDIGFyY2hpdGVjdHVyZSBvcHRpb25zLgotCi1GcmkgQXByICA5IDE3OjQzOjExIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlYXJyYW5nZWQgd2hpdGVzcGFjZSBpbiBwZXItaG9zdC9wZXItdGFyZ2V0Ci0Jc2VjdGlvbnMuICBBZGRlZCBob29rcyBmb3IgZHJvcHBpbmcgaW4gSFBQQSBzdXBwb3J0IChub3QgaW5jbHVkZWQKLQl5ZXQpLiAgU2VwYXJhdGUgb3V0IG92ZXJyaWRlcyBvZiB2YXJpYWJsZXMgYmFzZWQgb24gdGFyZ2V0IGZvcm1hdAotCWFuZCBiZmQtZ2FzIHNlbGVjdGlvbiBmcm9tIGFjdHVhbCB0YXJnZXQtc3BlY2lmaWMgY29tbWFuZHMuICBBZGQKLQllcnJvciBtZXNzYWdlIGZvciByZWNvZ25pemVkIGJ1dCB1bnN1cHBvcnRlZCBmb3JtYXQgbmFtZS4KLQotRnJpIEFwciAgOSAwOTowNTo0NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoZWNvZmZfYnVpbGRfbGluZW5vKTogTWFrZSBpbGluZU1heCBpbgotCXN5bWJvbGljIGhlYWRlciBtYXRjaCBjbGluZSBpbiBGRFI7IHRoZSBuYXRpdmUgbGlua2VyIHNlZW1zIHRvCi0Jd2FudCB0aGF0LgotCi1UaHUgQXByICA4IDE1OjUxOjI4IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluOiBhcy50ZXhpbmZvIGlzIGluICQoc3JjZGlyKS4gIFVzZQotCSQoc3JjZGlyKS9hcy50ZXhpbmZvIGV4cGxpY2l0bHkgaW4gc2V2ZXJhbCBwbGFjZXMKLQotVGh1IEFwciAgOCAxNToxNTowMiAxOTkzICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVwZGF0ZSBkdmksIGNsZWFuIHRhcmdldHMgZm9yIG5ldyBzb3VyY2UKLQkJCSAgIGZpbGUgc3RydWN0dXJlCi0KLVRodSBBcHIgIDggMTI6NTI6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvaG8tZGVjc3RhdG4uaDogRGVmaW5lIEJST0tFTl9BU1NFUlQgaWYgbm90IF9fR05VQ19fLAotCXJhdGhlciB0aGFuIHVuZGVmaW5pbmcga25vdy4KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggdWx0cml4Kiwgbm90IGp1c3QgdWx0cml4LgotCi1XZWQgQXByICA3IDIwOjE4OjEwIDE5OTMgIFJvbGFuZCBILiBQZXNjaCAgKHBlc2NoQGZvd2FudG9uLmN5Z251cy5jb20pCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBjb252ZXJ0ZWQgY29uZGl0aW9uYWwgbWFya3VwIHRvIHVzZSBuZXcKLQlUZXhpbmZvIGZhY2lsaXRpZXMsIGF2b2lkaW5nIG00LgotCi0JKiBkb2MvYXMtYWxsLnRleGluZm8sIGFsbC5tNCwgcHJldGV4Lm00OiBkZWxldGVkLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHJlY2FzdCBkb2MgY29uZmlndXJhdGlvbiB0byB1c2UgYSBsaW5rIHRvIGFuCi0JaW5jbHVkZWQgdGV4aW5mbyBmaWxlLgotCi0JKiBkb2MvYWxsLnRleGk6IHNldHRpbmdzIGZvciBnZW5lcmljIGZvcm0gb2YgZG9jdW1lbnRhdGlvbi4KLQotVHVlIEFwciAgNiAxMTo1NjoyMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoY29ucyk6IFplcm8gb3V0IGZyYWcgd2hlbiBjcmVhdGluZyByZWxvYy4KLQotTW9uIEFwciAgNSAwOTo0MTo1OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGdwX3JlZmVyZW5jZSk6IENlcnRhaW4gbWFnaWMgc3ltYm9scyBjYW4gbmV2ZXIKLQliZSByZWZlcmVuY2VkIG9mZiB0aGUgR1AgcmVnaXN0ZXIuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBIYW5kbGUgc3RhdGVzIDkgYW5kIDEwIGNvcnJlY3RseQotCXdoZW4gZGVhbGluZyB3aXRoIGNoYXJhY3RlcnMgb2YgdHlwZSBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVCwKLQlMRVhfSVNfU1RSSU5HUVVPVEUsIGFuZCBMRVhfSVNfT05FQ0hBUl9RVU9URS4KLQotCSogY29uZmlnL3RlLWlyaXguaDogTmV3IGZpbGU7IGlyaXggbmVlZHMgYSBkaWZmZXJlbnQgTE9DQUxfTEFCRUwKLQlkZWZpbml0aW9uIGZyb20gb3RoZXIgTUlQUyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluIChtaXBzLSotaXJpeCk6IFVzZSBlbXVsYXRpb24gaXJpeC4KLQotU3VuIEFwciAgNCAxNToyMTowOSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4NTAwLmM6IEdldCByZWxheCBzaXplIG9mIGJyYW5jaCBpbnN0cnVjdGlvbnMgcmlnaHQsCi0JKGdldF9vcGVyYW5kKTogUGFyc2UgQHNwKyBjb3JyZWN0bHkuCi0KLUZyaSBBcHIgIDIgMTU6NTk6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKSBbQkZEX0FTU0VNQkxFUl06IERvbid0IGluY2x1ZGUKLQlDT0ZGIHNlY3Rpb24gaGVhZGVyIGZpZWxkLgotCi0JKiBjb25maWd1cmUuaW46IFByaW50IGVycm9yIG1lc3NhZ2UgaWYgaG9zdCBvciB0YXJnZXQgaXMgbm90Ci0Jc3VwcG9ydGVkLgotCi0JKiBjb25maWd1cmUuaW46IElmIHdpdGgtYmZkLWFzc2VtYmxlciwgdXNlIG9iai1jb2ZmIGluc3RlYWQgb2YKLQlvYmotY29mZmJmZC4KLQotCSogY29uZmlnL2hvLWdlbmVyaWMuaDogSW5jbHVkZSBzdHJpbmcuaC4KLQotRnJpIEFwciAgMiAwODo1NDo1NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMKTogVHJlYXQgYW55IGxhYmVsIHN0YXJ0aW5nIHdpdGgKLQknJCcgYXMgbG9jYWwsIGZvciBhbnkgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IE9wdGltaXphdGlvbnMgdG8gYnJhbmNoaW5nIGNvZGUgYW5kIGEKLQljb3VwbGUgb2YgYnVnIGZpeGVzIGZyb20gcmFscGhjQHB5cnBzNS5lbmcucHlyYW1pZC5jb20gKFJhbHBoCi0JQ2FtcGJlbGwpLgotCi0JKiBjb25maWcvaG8taXJpeC5oOiBOZXcgZmlsZTsgaWYgbm90IGdjYywgZGVmaW5lIEJST0tFTl9BU1NFUlQuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtc2dpLWlyaXgqKTogU2V0IGdhc19ob3N0IHRvIGlyaXguCi0KLVdlZCBNYXIgMzEgMTc6NTM6NTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBTZXQgb3V0cHV0X3NlY3Rpb24gb2YgbmV3IHNlY3Rpb24uCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtbHlfcGFzcyk6IERvbid0IHNldCBvdXRwdXRfc2VjdGlvbiBoZXJlLgotCSogZXhwci5jIChleHByX3BhcnQsIGV4cHIpOiBUdXJuIG9mZiBzZWN0aW9uIGFzc2VydGlvbnMgZm9yIEVDT0ZGLAotCXNpbmNlIGl0IGhhcyBhZGRpdGlvbmFsIHNlY3Rpb25zLgotCSogcmVhZC5jIChzX2xjb21tKTogRm9yIE1JUFMgRUNPRkYsIHB1dCBzbWFsbCBvYmplY3RzIGluIC5zYnNzLAotCW5vdCBic3Nfc2VjdGlvbi4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAoVEFSR0VUX1NZTUJPTF9GSUVMRFMpOiBBZGRlZAotCWVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuYyAob2JqX3N5bWJvbF9uZXdfaG9vayk6IEluaXRpYWxpemUKLQllY29mZl91bmRlZmluZWQgZmllbGQuCi0JKGFkZF9maWxlKTogSWYgdXNpbmcgc3RhYnMsIGp1c3Qgb3V0cHV0IGEgc3RhYnMgc3ltYm9sIHJhdGhlciB0aGFuCi0JY3JlYXRpbmcgYSBuZXcgZmRyLgotCShvYmpfZWNvZmZfYmVnaW4sIG9ial9lY29mZl9iZW5kKTogSWdub3JlIGxpbmUgbnVtYmVyIGJ5IHJlYWRpbmcKLQlpdCB3aXRoIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uLCByYXRoZXIgdGhhbiBza2lwcGluZyBpdCBieSBoYW5kLgotCShvYmpfZWNvZmZfbG9jKTogSWYgdXNpbmcgc3RhYnMsIGp1c3Qgb3V0cHV0IGEgc3RhYnMgc3ltYm9sIHJhdGhlcgotCXRoYW4gRUNPRkYgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uCi0JKG9ial9lY29mZl9zdGFiKTogQWNjZXB0IG5vbi16ZXJvIHZhbHVlcyBmb3Igc3RhYnMgbGluZSBudW1iZXIuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBTZXQgaWZpbGVzeW0gY29ycmVjdGx5LiAgU2V0IHN0b3JhZ2UgY2xhc3MKLQl0byBzbWFsbCwgdW5kZWZpbmVkIGFuZC9vciByZWFkb25seSBzZWN0aW9ucyBpZiBhcHByb3ByaWF0ZS4KLQlEb24ndCBvdXRwdXQgc3ltYm9sIG5hbWVzIGNvbnRhaW5pbmcgXDAwMSBjaGFyYWN0ZXJzLgotCShlY29mZl9mcm9iX2ZpbGUpOiBNYWtlIHN1cmUgYXQgbGVhc3Qgb25lIGZkciBpcyBvdXRwdXQuCi0JKiBjb25maWcvdGMtbWlwcy5oOiBEZWZpbmUgVENfTUlQUy4KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGdfc3dpdGNoX3ZhbHVlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWRfYXNzZW1ibGUpOiBTZXQgZ3Agc2l6ZSBvZiBvdXRwdXQgQkZELgotCShncF9yZWZlcmVuY2UpOiBOZXcgZnVuY3Rpb247IHJldHVybnMgMSBpZiBleHByZXNzaW9uIGNhbiBiZQotCWFjY2Vzc3NlZCB2aWEgZ3AuICBBbHdheXMgcmV0dXJucyAwIGlmIG5vdCB1c2luZyBFQ09GRi4KLQkobWFjcm9fYnVpbGQpOiBDb252ZXJ0IEJGRF9SRUxPQ19MTzE2IHRvIEJGRF9SRUxPQ19NSVBTX0dQUkVMIGlmCi0JcG9zc2libGUuCi0JKG1hY3JvKTogR2VuZXJhdGUgc2VxdWVuY2VzIHVzaW5nIGdwIGlmIHBvc3NpYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBJZ25vcmUgLUVMIGFuZCAtRUIuICBQYXJzZSAtRy4KLQkobWRfYXBwbHlfZml4KTogQWRkZWQgQkZEX1JFTE9DX01JUFNfR1BSRUwgdG8gaWdub3JlZCBjYXNlLgotCShzX2NoYW5nZV9zZWMpOiBIYW5kbGUgLnJkYXRhIGFuZCAuc2RhdGEgZm9yIEVDT0ZGLgotCShzX2V4dGVybik6IE1hcmsgc3ltYm9sIGFzIGV4dGVybmFsLiAgU2V0IGVjb2ZmX3VuZGVmaW5lZCBmaWVsZC4KLQotVHVlIE1hciAzMCAxMDoxMTo0MSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IERvbid0IGNhbGwgYXNfcGVycm9yIGZvcgotCWZpbGVuYW1lIHJlamVjdGVkIGJ5IGFwcGxpY2F0aW9uLgotCi0JKiBhcy5jIChtYWluKSBbQkZEX0FTU0VNQkxFUl06IElmIGVycm9ycyBvY2N1ciwgY2xvc2UgYW5kIHVubGluawotCXRoZSBvdXRwdXQgZmlsZS4KLQotCSogZG9jL2FzLnRleGluZm86IERvbid0IHVzZSBAdmFsdWUgaW4gbm9kZSBuYW1lcyBmb3IgdGhlIG1vbWVudDsKLQlyZWZlcmVuY2VzIGRvbid0IGFwcGVhciB0byB3b3JrIHJpZ2h0LgotCi0JKiBhcy5oIChjb25zdCwgdm9sYXRpbGUpOiBQdXQgdGhlc2UgZGVmaW5pdGlvbnMgYmFjaywgYW5kIHVzZQotCXRoZW0uCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBGaXJzdCBwYXNzIGF0IHVzaW5nIG5ldyB0ZXhpbmZvIGZlYXR1cmVzIC0tCi0JdmFyaWFibGVzLCBjb25kaXRpb25hbCB0ZXN0cy4gIEZhciBmcm9tIGNvbXBsZXRlLgotCi1Nb24gTWFyIDI5IDE2OjA1OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiBUZW1wb3JhcnkgaGFjayB0byBoYW5kbGUgc29tZSA2NC1iaXQgY29uc3RhbnRzLiAgVGhpcwotCXNob3VsZCBiZSByZWRvbmUgbGF0ZXIuCi0JKHRhcmdldF9iaWdfZW5kaWFuKTogRGVjbGFyZS4KLQkoYmlnX2NvbnMpOiBJZiBpdCdzIHNldCwgcmV2ZXJzZSBvcmRlciBvZiBieXRlcyBiZWluZyBjb3BpZWQuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBTZXQgdGFyZ2V0X2JpZ19lbmRpYW4uCi0KLQkqIHJlYWQuYyAoc19pZ25vcmUpOiBEZWxldGUgZGVjbGFyYXRpb24gb2YgaXNfZW5kX29mX2xpbmUuCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jICh5YW5rX3N5bWJvbHMpOiBCdWlsZCBsaXN0IG9mIGZpbGUgc3ltYm9sCi0JZm9yd2FyZCBwb2ludGVycyBwcm9wZXJseS4KLQotTW9uIE1hciAyOSAxMzo0NzozMyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IpOiBGaXggYnVnIHdoZXJlIG5yZWxvY3MKLQl3YXNuJ3QgYmVpbmcgc3RvcmVkIGludG8gc2NuaGRyLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmg6IEFkZCBwcm90b3R5cGUgb2Ygc19nZXRfc2VnbWVudC4KLQkqIHJlYWQuYyAoVENfU1RBUlRfTEFCRUwpOiBEZWZhdWx0IGRlZmluaXRpb24uCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IFVzZSBUQ19TVEFSVF9MQUJFTCBtYWNybyB0byB3b3JrIG91dAotCWlmIGEgbGFiZWwgaGFzIGJlZW4gc2Vlbi4KLQotTW9uIE1hciAyOSAxMjo1Njo1NiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IEJGRERFRiBhbmQgQkZETElCIGF0IHRoZSB0b3Agb2YgTWFrZWZpbGUsIG5vdAotCXRoZSBib3R0b20gKG1ha2UgZXhwYW5kcyB2YXJpYWJsZXMgaW4gZGVwZW5kZW5jaWVzIHdoZW4gdGhlCi0JZGVwZW5kZW5jaWVzIGFyZSByZWFkLCBub3Qgd2hlbiB0aGV5IGFyZSB1c2VkKS4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGZpbGxfc2VjdGlvbik6IERvbid0IHNldCBOT0xPQUQgYml0IGZvcgotCWEyOWsgLmJzcyBzZWN0aW9uOyB0aGUgbW9uZGZlIHByb2dyYW0gZG9lc24ndCBsaWtlIGl0LgotCi1TdW4gTWFyIDI4IDA4OjEyOjUzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbTY4ay5jOiBVc2UgUEFSQU1TIG1hY3JvLCBhbmQgdXNlIENPTlNUIGluc3RlYWQgb2YKLQljb25zdC4KLQkoY3VycmVudF9hcmNoaXRlY3R1cmUpOiBEb24ndCBuZWVkIGluaXRpYWxpemVyLgotCi1GcmkgTWFyIDI2IDA4OjEyOjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogZG9jL25vbmUubTQ6IERlZmluZSBaODAwMC4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoYXMtKi50ZXhpbmZvKTogUmVmZXIgdG8gJChzcmNkaXIpLiAgUmVtb3ZlIHRoZQotCXRleGluZm8gZmlsZSBiZWZvcmUgcmVjcmVhdGluZyBpdC4KLQkoVEVYSTJEVkkpOiBOZWVkIHRvIHNldCBURVhJTlBVVFMgaWYgIm1ha2UgYXMuZHZpIiBpcyB0byB3b3JrIGluCi0JdGhpcyBkaXJlY3RvcnkuCi0JKHNyY2Rpcik6IERlbGV0ZSBzZWNvbmQsIGJvZ3VzIGRlZmluaXRpb24uCi0JKGFzLmluZm8pOiBMb29rIGZvciBhcy0qLnRleGluZm8gaW4gY3VycmVudCBkaXJlY3RvcnkgcmF0aGVyIHRoYW4KLQlpbiAkKHNyY2RpcikuCi0JKGFzLmR2aSk6IERpdHRvLgotCShkdmkpOiBOZXcgcnVsZS4KLQkqIGRvYy9jb25maWd1cmUuaW46IENyZWF0ZSBsaW5rcyB0byBhbGwgYXMtKi50ZXhpbmZvIGZpbGVzIGluIHRoZQotCXNvdXJjZSBkaXJlY3RvcnksIGlmIHRoYXQncyBub3QgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCi0JKiBjb25maWd1cmUuaW4gKHBlci1ob3N0KTogIEFjY2VwdCBNSVBTIGhvc3Qgd2l0aCBCU0QgdmVyc2lvbgotCW51bWJlci4KLQkocGVyLXRhcmdldCk6IENsYXNzaWZ5IGk0ODYgYXMgaTM4Ni4gIFVzZSBnZW5lcmljIGNwdV90eXBlIGluc3RlYWQKLQlvZiB0YXJnZXRfY3B1IGluIHNlbGVjdGluZyBmb3JtYXQgZXRjLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogVXNlIC5hcHBmaWxlLCBub3QgLmFwcC1maWxlLgotCSogcmVhZC5jIChwb3RhYmxlKTogQ2hhbmdlIC5hcHAtZmlsZSB0byAuYXBwZmlsZS4KLQotCSogY29uZmlnL2hvLWRlY3N0YXRuLmg6IFJlbmFtZWQgZnJvbSBoby1kZWNzdGF0aW9uLmguCi0JKiBjb25maWd1cmUuaW46IEFkanVzdGVkLgotCi0JKiBjb25maWcvb2JqLWJmZC1zdW5vcy4qOiBVbnVzZWQ7IGRlbGV0ZWQuCi0KLQkqIE1ha2VmaWxlLmluICh2ZXJzaW9uLmMsIHZlcnMtc3RhbXApOiBEZWxldGVkLgotCShjb25maWcuaCk6IERlZmluZSBHQVNfVkVSU0lPTi4KLQkqIGFzLmMgKHZlcnNpb25fc3RyaW5nKTogRGVsZXRlZCBkZWNsYXJhdGlvbi4KLQkobWFpbik6IExvb2sgZm9yIEdBU19WRVJTSU9OIGluc3RlYWQuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBVcGRhdGVkIGRlc2NyaXB0aW9uIG9mIC1hKiAobGlzdGluZykgb3B0aW9ucywKLQlhbmQgZGVzY3JpYmUgaG93IHRvIHBhc3MgdGhlbSB0aHJvdWdoIGZyb20gZ2NjLgotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvcik6IERvbid0IGFsbG9jYXRlIHN0b3JhZ2Ugb3IKLQlwcm9jZXNzIHJlbG9jcyBpZiB0aGVyZSBhcmVuJ3QgYW55IHJlbG9jcyB0byBwcm9jZXNzLiAgQXZvaWRzCi0JbWFsbG9jL2ZyZWUgYnVnIG9uIFNDTyB0b28uCi0KLQkqIGFzLmg6IE1vdmUgbG9jYWwgaW5jbHVkZSBmaWxlcyBiZWxvdyBzeXN0ZW0gaW5jbHVkZSBmaWxlcywgdG8KLQlhdm9pZCBzb21lIHJlZGVmaW5pdGlvbiBjb21wbGFpbnRzIG9uIHNvbWUgc3lzdGVtcy4KLQkoY29uc3QsIHZvbGF0aWxlKTogRG9uJ3QgbmVlZCB0aGVzZSBjb25kaXRpb25hbGx5IGRlZmluZWQgaWYgd2UKLQl1c2UgQ09OU1QgYW5kIFZPTEFUSUxFIGZyb20gYW5zaWRlY2wuaC4KLQkoc2VnX25hbWUpOiBVc2UgQ09OU1QsIG5vdCBjb25zdC4KLQotRnJpIE1hciAyNiAxMDoyMjowNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlaW5kZW50ZWQgdG8gR05VIHN0YW5kYXJkcy4KLQotVGh1IE1hciAyNSAwODo1OToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogUmVtb3ZlIGEyOWsgc3BlY2lhbCBjYXNlLgotCShmaXh1cF9zZWdtZW50KTogQWRkIGEyOWsgc3BlY2lhbCBjYXNlOyB0aGUgbGlua2VyIGlzIG5vdCBwcmVwYXJlZAotCXRvIHNlZSBhIHNlZ21lbnQgb2Zmc2V0IGhlcmUuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9uZXh0X2NoYXIpOiBBZGRlZCBuZXcgc3RhdGUsIDEwLCBtb2RpZnlpbmcgc3RhdGUKLQk5IHRvIG9ubHkga2VlcCBhIHNwYWNlIGluIGJldHdlZW4gaWRlbnRpZmllciBjaGFyYWN0ZXJzLgotCi1XZWQgTWFyIDI0IDAyOjE2OjIyIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkIGR2aSB0YXJnZXQ7IGFzLSQoY29uZmlnKS50ZXhpbmZvIG1pZ2h0IGxpdmUgaW4KLQlzcmNkaXIsIG1pZ2h0IGJlIGluIG9iamRpci4KLQotCSogZG9jL01ha2VmaWxlLmluOiBkdmkgZGVwZW5kcyBvbiBhcy5kdmkKLQotTW9uIE1hciAyMiAyMzo1OToxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrIHRhcmdldAotCi1Nb24gTWFyIDIyIDE2OjI1OjU3IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX2lwKTogQWRkIHN1cHBvcnQgZm9yIG1lbWJhciBtYXNrIG5hbWVzLgotCUFkZCBtaXNzaW5nIGNvbG9ucyBpbiBwcmVmZXRjaCBlcnJvciBtZXNzYWdlcy4gIEFkZCBzdXBwb3J0IGZvcgotCUFTSSBuYW1lcy4KLQotTW9uIE1hciAyMiAxMDoxOTowMCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogVXNlICRBVCBmb3IgYW55IGZsb2F0aW5nIHBvaW50IGxvYWQuCi0KLVNhdCBNYXIgMjAgMTI6NTA6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHVydGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEZvciBvcGVyYW5kIHR5cGUgJ00nLCByZWplY3QKLQliaWdudW1zLCBidXQgZG9uJ3QgZW1pdCBlcnJvciBtZXNzYWdlLgotCi1GcmkgTWFyIDE5IDIxOjAyOjE5IDE5OTMgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHRhcmctY3B1Lm8pOiBEZXBlbmQgb24gY29uZmlnLmguCi0KLVdlZCBNYXIgMTcgMTY6NDQ6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogQWRkZWQgbmV3IHN0YXRlLCA5LCB0byBhdm9pZAotCWRyb3BwaW5nIGEgc3BhY2UgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFuIGlkZW50aWZpZXIuCi0JKiBleHByLmMsIHdyaXRlLmM6IFJld3JvdGUgYXNzZXJ0IGV4cHJlc3Npb25zIHRvIG5vdCB1c2UgbXVsdGlwbGUKLQlsaW5lczsgSSBkb24ndCB0aGluayB0aGF0IGNhbiBiZSBkb25lIHBvcnRhYmx5LgotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBVc2UgJEFUIGlmIHRhcmdldCByZWdpc3RlciBpcyB6ZXJvIGluCi0JbG9hZCBpbnN0cnVjdGlvbiwgd2hpY2ggaXQgY2FuIGJlIGZvciBhIGZsb2F0aW5nIHBvaW50IGxvYWQuCi0KLU1vbiBNYXIgMTUgMTI6MTc6MjggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jICh3cml0ZV9jb250ZW50cyk6IENvbXB1dGUgdGhlIHJlbG9jcyBiZWZvcmUgd3JpdGluZyBvdXQKLQl0aGUgc2VjdGlvbiBjb250ZW50cy4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCwgY29uZmlnL29iai1lY29mZi5jOiBOdW1lcm91cyBjaGFuZ2VzIHRvIGdldAotCXN5bWJvbCB0YWJsZSBhbmQgdmFsdWVzIHJpZ2h0LgotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUwpOiBJZiBPQkpfRUNPRkYsIGFueSBsYWJlbCBzdGFydGluZwotCXdpdGggJEwgaXMgbG9jYWwuCi0JKiBjb25maWcvdGMtbWlwcy5jICh0Y19nZW5fcmVsb2MpOiBJZiBPQkpfRUNPRkYsIGFkanVzdCB0aGUgYWRkZW5kCi0JYnkgdGhlIHNlY3Rpb24gdm1hLgotCi0JKiBjb25maWcvejhrLm10IChUQVJHX0NQVV9ERVBFTkRFTlRTKTogVGhlIHJlbGV2YW50IGZpbGUgaXMKLQl6OGstb3BjLmgsIG5vdCB6OGsuaC4KLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKG9ial9jb2ZmX2VuZGVmKTogQ29ycmVjdCB0ZXN0IGZvciAuYmYKLQlzeW1ib2wuCi0KLUZyaSBNYXIgMTIgMTg6MzM6MzYgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBzcGFyYy1zdW4tc29sYXJpczIqIGluc3RlYWQgb2YgLXNvbGFyaXMyCi0KLUZyaSBNYXIgMTIgMTI6MDA6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBleHByLmMsIHdyaXRlLmM6IFVsdHJpeCBuYXRpdmUgNC4yIGNjIHJlcXVpcmVzIGFzc2VydCBjb25kaXRpb24KLQl0byBiZSBvbiBhIHNpbmdsZSBsaW5lLgotCi1UaHUgTWFyIDExIDE3OjU2OjIyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5oKTogQ3JlYXRlIGZpbGUsIHdyaXRpbmcgb3V0IGRlZmluaXRpb25zIG9mCi0JdGFyZ2V0IGNwdSwgYWxpYXMsIGFuZCBjYW5vbmljYWwgbmFtZS4KLQkoQUxMX0NGTEFHUyk6IE5vIGxvbmdlciBkZWZpbmUgVEFSR0VUX0NQVS4KLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogUHJpbnQgYSBtZXNzYWdlLCBpbnN0ZWFkIG9mIHF1aXR0aW5nCi0Jc2lsZW50bHkuCi0KLQkqIGFzLmMgKG1haW4pOiBEb24ndCBjYXRjaCBhbnkgc2lnbmFscywgZm9yIG5vdy4KLQotCSogdmVyc2lvbi5jOiBEZWxldGVkLgotCSogTWFrZWZpbGUuaW46IEdlbmVyYXRlIGl0LCBwdXR0aW5nIGluIG9ubHkgdGhlIHZlcnNpb24gbnVtYmVyCi0JaXRzZWxmLgotCShWRVJTSU9OKTogTmV3IHZhcmlhYmxlLgotCSogYXMuYzogSW5jbHVkZSBjb25maWcuaC4KLQkobWFpbik6IFJlZm9ybWF0dGVkIHZlcnNpb24gc3RyaW5nLiAgSW5jbHVkZSB0YXJnZXQgYWxpYXMuICBEb24ndAotCXByaW50IGlmIG5vdCByZXF1ZXN0ZWQgKGkuZS4sIHVua25vd24gLXYgYXJndW1lbnQpLgotCi0JKiBhcy5jIChzdHJhbGxvYyk6IERlbGV0ZWQuCi0JKG1haW4pOiBDYWxsIHN0cmR1cCBpbnN0ZWFkLgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBhbGwgNjgzMDAgc2VyaWVzIGNoaXBzLgotCSogY29uZmlnL3RjLW02OGsuYzogSW5jbHVkZSBjb25maWcuaC4KLQkobWRfYXNzZW1ibGUpOiBBc3N1bWUgVEFSR0VUX0NQVSBpcyBkZWZpbmVkLiAgQWNjZXB0IHNvbWUgNjgzMDAKLQlzZXJpZXMgY3B1cyBhcyBkZWZhdWx0cy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogQWNjZXB0IHNvbWUgbTY4MzAwIHNlcmllcyBDUFVzIGFzIGRlZmF1bHRzLgotCi1XZWQgTWFyIDEwIDE3OjQxOjE2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogYXMuYyAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBEZWZpbmUgdG8gbm9ybWFsIHZhbHVlcyBpZgotCW5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKG1haW4sIGdvdF9zaWcpOiBVc2UgdGhlbS4KLQkqIGNvbmZpZy9oby12bXMuaCAoRVhJVF9TVUNDRVNTLCBFWElUX0ZBSUxVUkUpOiBSZXZlcnNlIGRlZmF1bHQKLQl2YWx1ZXMuCi0KLVR1ZSBNYXIgIDkgMDc6NDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMsIGNvbmZpZy9vYmotZWNvZmYuaDogUHJlbGltaW5hcnkgRUNPRkYKLQlzdXBwb3J0LgotCi0JKiBjb25maWcvdGMtbWlwcy5oIChUQVJHRVRfRk9STUFUKTogRGVmaW5lIGJhc2VkIG9uIE9CSl9BT1VUIHZzLgotCU9CSl9FQ09GRiBhcyB3ZWxsIGFzIFRBUkdFVF9CWVRFU18qX0VORElBTi4KLQkoc3RydWN0IGxvYywgc3RydWN0IHByb2MsIHN0cnVjdCBmaWxlKTogTW92ZWQgdG8gdGMtbWlwcy5jIHdpdGhpbgotCSNpZm5kZWYgT0JKX0VDT0ZGIGJsb2NrLCBzaW5jZSBFQ09GRiB1c2VzIGRpZmZlcmVudCB2ZXJzaW9ucy4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlYXJyYW5nZWQgZm9yIEVDT0ZGIHN1cHBvcnQuICBBZGRlZAotCXByb3RvdHlwZXMgZm9yIGFsbCBzdGF0aWMgZnVuY3Rpb25zLiAgTW92ZWQgZXhpc3RpbmcgbWluaW1hbAotCWRlYnVnZ2luZyBmb3JtYXQgc3VwcG9ydCBpbmZvICNpZm5kZWYgT0JKX0VDT0ZGIGJsb2Nrcy4KLQkobWFjcm9fYnVpbGRfbHVpKTogRWxpbWluYXRlZCBzaWduX2V4dGVuZCBhcmd1bWVudCwgYmVjYXVzZSBFQ09GRgotCWRvZXMgbm90IHN1cHBvcnQgYSBub24gc2lnbiBleHRlbmRlZCBoaWdoIDE2IGJpdHMgcmVsb2MuICBBZGp1c3RlZAotCWFsbCBjYWxsZXJzIGFjY29yZGluZ2x5LgotCSh0Y19nZXRfcmVnaXN0ZXIpOiBSZW5hbWVkIGZyb20gZ2V0X3JlZ2lzdGVyLCBhbmQgbWFkZSBub24tc3RhdGljLgotCi0JKiBjb25maWcvbWlwcy1iaWcubXQsIGNvbmZpZy9taXBzLWxpdC5tdDogTmV3IGZpbGVzLiAgRGVmaW5lCi0JVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gYW5kIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOLAotCXJlc3BlY3RpdmVseS4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLWJzZCopOiBVc2UgZ2FzX3RhcmdldCBtaXBzLWxpdC4KLQkobWlwcy0qLXVsdHJpeCosIG1pcHMtKi1pcml4KiwgbWlwcy0qLWVjb2ZmKTogTmV3IHRhcmdldHMsIHVzaW5nCi0Jb2JqX2Zvcm1hdCBlY29mZiBhbmQgZ2FzX3RhcmdldCBtaXBzLWxpdCBvciBtaXBzLWJpZy4KLQotVHVlIE1hciAgOSAwNzo0MzowMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogdmVyc2lvbi5jOiBCdW1wIHRvIHZlcnNpb24gMi4wLjEuCi0KLVR1ZSBNYXIgIDkgMDc6NDA6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChjaGFpbl9mcmNoYWluc190b2dldGhlcik6IENoZWNrIHRoYXQgc2VnX2luZm8gKHNlY3Rpb24pCi0JaXMgbm90IE5VTEwuCi0JKHdyaXRlX29iamVjdF9maWxlKTogQ2FsbCBvYmpfZnJvYl9maWxlIGFmdGVyIHNldHRpbmcgdGhlIHN5bWJvbHMsCi0Jbm90IGJlZm9yZS4KLQotVHVlIE1hciAgOSAwMDowMDowMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogVmVyc2lvbiAyLjAgcmVsZWFzZWQuCi0KLU1vbiBNYXIgIDggMTQ6NTc6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChUQ19DT1VOVF9SRUxPQyk6IExvb2sgZm9yIGZ4X2FkZHN5IG9ubHkuCi0KLUZyaSBNYXIgIDUgMDk6MDU6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkLmg6IERlZmluZSBzdHJpbmdlciBoZXJlLgotCXJlYWQuYywgY29uZmlnL29iai1pZWVlLmMsIGNvbmZpZy9vYmotdGNtODhrLmM6IE5vdCBhbnkgb2YgdGhlc2UKLQlwbGFjZXMuCi0KLVRodSBNYXIgIDQgMTE6NTI6MjMgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19zcGFjZSk6IE11bHRpcGx5IHJlcGVhdCBjb3VudCBieSBtdWx0LCBub3QgZmlsbC4KLQotVGh1IE1hciAgNCAwNToyMDo0MiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jOiBJbmNsdWRlIGN0eXBlLmguCi0KLVdlZCBNYXIgIDMgMTA6NDE6NDYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JUGF0Y2hlcyBmcm9tIEVyaWMgWW91bmdkYWxlOgotCSogbWFrZS1nYXMuY29tOiBGaW5kIG9ic3RhY2sub2JqIGlmIGl0J3Mgbm90IGluIHRoZSBjdXJyZW50Ci0JZGlyZWN0b3J5LgotCSogcmVhZC5jIChzX2lnbm9yZSk6IERvbid0IGRlY2xhcmUgaXNfZW5kX29mX2xpbmUuICBJdCdzCi0JcmVkdW5kYW50LCBhbmQgdHJpZ2dlcnMgYSBWTVMgZ2NjIGNvbXBpbGVyIGJ1Zy4KLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBNYWNybyBTVUJfU0VHTUVOVF9BTElHTiBub3cgdGFrZXMKLQljdXJyZW50IHNlZ21lbnQgYXMgYW4gYXJndW1lbnQuICAoSWdub3JlZCBpbiBhbGwgY2FzZXMgYnV0IFZNUy4pCi0JQWxsIGNhbGxlcnMgYW5kIGRlZmluaXRpb25zIGNoYW5nZWQuCi0KLVR1ZSBNYXIgIDIgMTE6NTY6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsaXN0aW5nLmM6IENsZWFuZWQgdXAgYSBiaXQsIGFkZGVkIHByb3RvdHlwZXMsIG1hZGUgTk9fTElTVElORwotCWNhc2UgY29tcGlsZSBhZ2Fpbi4KLQotVHVlIE1hciAgMiAwODo1MzozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAoaXNieXRlKTogQWNjZXB0IGFsbCB2YWx1ZXMgZnJvbSAtMjU1IHRvICsyNTUsCi0Jc28gIn4weDgwIiB3b24ndCBiZSByZWplY3RlZC4KLQotCSogY29uZmlnL29iai1lbGYuYzogTm8gbG9uZ2VyIGluY2x1ZGUgZWxmL3JlbG9jLmguCi0JKG9ial9lbGZfc2VjdGlvbik6IFNldCBTRUNfUkVBRE9OTFkgYW5kIFNFQ19DT0RFIGZvciB0ZXh0IHNlY3Rpb24uCi0JKG9ial9lbGZfc3RhYiwgb2JqX2VsZl9kZXNjKTogRGVsZXRlZCBkby1ub3RoaW5nIGFuZCBjb21tZW50ZWQtb3V0Ci0Jcm91dGluZXMuCi0JKG9ial9lbGZfeHN0YWIpOiBOZXcgcm91dGluZS4KLQkob2JqX2VsZl9zZXRfc2l6ZSk6IENhbGwgYXNfd2Fybiwgbm90IGZwcmludGYuICBQYXNzIGRlc2lyZWQKLQlhcmd1bWVudCB0byBzX2lnbm9yZS4gIFB1dCAiI2lmIDAiIGFyb3VuZCB1bnVzZWQgY29kZS4KLQkob2JqX3BzZXVkb190YWJsZSk6IFVzZSBzX2lnbm9yZSBpbnN0ZWFkIG9mIGRvLW5vdGhpbmcgcm91dGluZXMuCi0JQ2FsbCBlbGZfeHN0YWJzIGZvciAuc3RhYnMgYW5kIC54c3RhYnMgb3BlcmF0b3JzLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCkgW09CSl9FTEZdOiBOb3cgImVsZjMyLXNwYXJjIi4KLQotCSogd3JpdGUuYyAocmVsYXhfYW5kX3NpemVfc2VnKTogU2V0IFNFQ19SRUxPQyBvbmx5IGlmIGZpeHVwcyBhcmUKLQlwcmVzZW50LgotCi0JKiBjb25maWd1cmUuaW46IG1pcHMtYnNkIGNvbmZpZ3VyYXRpb24gd2FzIG1pc3NpbmcgZm9ybWF0IHNwZWMuCi0JU2hvdWxkIHVzZSBhb3V0LgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBEZXBlbmRzIG9uIGNvbmZpZ3VyZS5pbi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBjaGVjayBmb3IgYWxpZ25tZW50IG9mCi0JZnJhZyBpbiBtZW1vcnk7IGFsaWdubWVudCBvZiBpbnN0cnVjdGlvbnMgaW4gc2VjdGlvbiBpcyBhIHNlcGFyYXRlCi0JbWF0dGVyLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNyb19idWlsZF9sdWkpOiBGaXggc29tZSBhc3N1bXB0aW9ucyBvZiBBTlNJCi0JQyBhdmFpbGFiaWxpdHkuCi0KLQkqIGxpc3RpbmcuaDogQWx3YXlzIHByb3ZpZGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zLCBub3QgbWFjcm9zLCBzbwotCXBjYyB3b24ndCBsb3NlLgotCi1UdWUgTWFyICAyIDAwOjUwOjQzIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBDT05UUklCVVRPUlM6ICBVcGRhdGUgR2lsbW9yZSBlbnRyeS4KLQotTW9uIE1hciAgMSAxMjowMzoxNiAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6ICBDb3JyZWN0bHkgYXNzZW1ibGUgcHJlZmV0Y2gKLQlpbnN0cnVjdGlvbnMuICBBY2NlcHQgaW50ZWdlciBwcmVmZXRjaCBmdW5jdGlvbiBudW1iZXJzLgotCi1XZWQgRmViIDI0IDE0OjU4OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfeHdvcmQpOiBOb3cgY2FsbCBiaWdfY29ucywgc28gbGFyZ2UKLQljb25zdGFudHMgYXJlIGFjY2VwdGVkLCBidXQgc3ltYm9saWMgdmFsdWVzIGFyZSBub3QuICBHQ0Mgd2lsbCBub3QKLQlnZW5lcmF0ZSB0aGUgbGF0dGVyIGN1cnJlbnRseS4KLQotCSogZnJhZ3MuYyAoZnJhZ19pbml0KTogTmV3IGZ1bmN0aW9uLgotCSh6ZXJvX2FkZHJlc3NfZnJhZywgYnNzX2FkZHJlc3NfZnJhZyk6IE5vdyBpbml0aWFsaXplZCBhdCBydW4KLQl0aW1lLgotCSogYXMuYyAobWFpbik6IENhbGwgZnJhZ19pbml0LgotCi1XZWQgRmViIDI0IDEwOjMyOjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IEluIExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQgY2FzZToKLQlEb24ndCB1bmdldCBjaDIgaWYgd2UgZGlkbid0IGdldCBpdC4KLQotV2VkIEZlYiAyNCAwNDoxNDowNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZG9jL01ha2VmaWxlLmluIChURVhJRElSKTogVXBkYXRlZCBmb3IgbmV3IGxheW91dC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNfY29tbW9uKTogQWRkIHN1cHBvcnQgZm9yIEVMRiB2ZXJzaW9uLgotCSh0Y19nZW5fcmVsb2MpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9BUkNILCBUQVJHRVRfRk9STUFUKSBbQkZEX0FTU0VNQkxFUl06Ci0JTmV3IG1hY3Jvcy4KLQkobWRfY29udmVydF9mcmFnKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRm9yIFBDLXJlbGF0aXZlIGFkZHJlc3Npbmcgb2YgYQotCXN5bWJvbCwgZml4IHRoZSBvZmZzZXQgc28gIisyIiBpc24ndCByZXF1aXJlZC4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobGluZV9jb21tZW50X2NoYXJzLCBsaW5lX3NlcGFyYXRvcl9jaGFycyk6Ci0JRGVmaW5lIGFzIGNvbW1vbi9ic3MuCi0JKG9wX2hhc2gsIHJlZ19oYXNoLCBhcmVnX2hhc2gsIGljbGFzc2VzX3NlZW4sIGJyX2NudCk6IERlZmF1bHQgQwotCWluaXRpYWxpemVycyBhcmUgc3VmZmljaWVudC4KLQotCSogY29uZmlnL29iai1hb3V0LmggW0JGRF9BU1NFTUJMRVJdOiBJbmNsdWRlIGxpYmFvdXQuaCBmcm9tIGJmZC4KLQkoVEFSR0VUX0ZPUk1BVCkgW0JGRF9BU1NFTUJMRVJdOiBEZWZhdWx0IHRvICJhLm91dCIuCi0JKFNfU0VUXyosIFNfR0VUXyosIG9ial9mcm9iX3N5bWJvbCkgW0JGRF9BU1NFTUJMRVJdOiBOZXcgbWFjcm9zLgotCShTX1NFVF9UWVBFKSBbIUJGRF9BU1NFTUJMRVJdOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvb2JqLWFvdXQuYzogVXNlIFBBUkFNUyBtYWNybyBmb3IgZGVjbGFyYXRpb25zLiAgUmVtb3ZlCi0JIklHTk9SRV9ERUJVRyIgY29uZGl0aW9uYWwsIHNpbmNlIGJvdGggYnJhbmNoZXMgYXJlIGlkZW50aWNhbC4KLQlVc2UgU19TRVRfVFlQRSwgU19HRVRfVFlQRSwgYW5kIFNfR0VUX0RFU0MgaW5zdGVhZCBvZiBkaXJlY3RseQotCXJlZmVyZW5jaW5nIHN5bWJvbCBzdHJ1Y3R1cmUgbWVtYmVycy4KLQkob2JqX2FvdXRfZnJvYl9zeW1ib2wpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCi0JKiBhcy5oIChzdHJ1Y3QgZnJhZyk6IFJlb3JkZXJlZCBhIGNvdXBsZSBvZiBmaWVsZHMgZm9yIGJldHRlcgotCXBhY2tpbmcuCi0KLQkqIHdyaXRlLmMgKHJlY29yZF9hbGlnbm1lbnQpIFtCRkRfQVNTRU1CTEVSXTogUmVjb3JkIGl0IGluIHRoZQotCXNlY3Rpb24gaW5mby4KLQkod3JpdGVfY29udGVudHMpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uLgotCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBBbHdheXMgaGFuZGxlIC1SIGhlcmUuICBDYWxsCi0JZml4X25ldyB3aXRoIEJGRF9SRUxPQ19OT05FIGluc3RlYWQgb2YgMCBvciBOT19SRUxPQy4gIENhbGwKLQlvYmpfZnJvYl9maWxlLCBvYmpfZnJvYl9zeW1ib2wsIHRjX2Zyb2Jfc3ltYm9sIGlmIGRlZmluZWQuCi0JKGZpeHVwX3NlZ21lbnQpOiBNYWtlIHN1cmUgY29tbW9uLXNlY3Rpb24gc3ltYm9scyBnZXQgdHJlYXRlZCB0aGUKLQlzYW1lIGFzIHVuZGVmaW5lZCBzeW1ib2xzLgotCShmaXhfbmV3KSBbQkZEX0FTU0VNQkxFUl06IEFyZ3VtZW50IHJfdHlwZSBpcyBvZiB0eXBlCi0JYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLiAgVXNlIHNlZ19maXhfe3Jvb3QsdGFpbH1QIGRlcml2ZWQgZnJvbQotCXNlY3Rpb24gaW5mby4KLQkqIHdyaXRlLmggKGZpeF9uZXcpOiBVcGRhdGUgcHJvdG90eXBlLgotCi0JKiB0Yy5oIChtZF9vcGVyYW5kLCBtZF9jb252ZXJ0X2ZyYWcsIHRjX2hlYWRlcnNfaG9vaywKLQltZF9zZWN0aW9uX2FsaWduLCBtZF91bmRlZmluZWRfc3ltYm9sKTogRG9uJ3QgcHJvdmlkZSBwcm90b3R5cGVzCi0JaWYgdGhlc2UgYXJlIGRlZmluZWQgYXMgbWFjcm9zLgotCShtZF9jb252ZXJ0X2ZyYWcpIFtCRkRfQVNTRU1CTEVSXTogQkZEIHZlcnNpb24gbmVlZHMgYmZkIGFuZAotCXNlY3Rpb24gcGFzc2VkLgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBBcmd1bWVudCBOQU1FIGlzIG5vdyBwb2ludGVyIHRvIGNvbnN0LgotCVNpbXBsaWZpZWQgU1RSSVBfVU5ERVJTQ09SRSBjb2RlLiAgUmVtb3ZlIGFzc3VtcHRpb25zIGFib3V0IG51bGwKLQlwb2ludGVycyBpbiBmcmVzaGx5IGFsbG9jYXRlZCBzdG9yYWdlLiAgW0JGRF9BU1NFTUJMRVJdOiBHZXQgbmV3Ci0JQkZEIHN5bWJvbC4KLQkoY29sb24pOiBEaXNwbGF5IG90aGVyL2Rlc2MgZmllbGRzIG9mIHJlZGVmaW5lZCBzeW1ib2wgb25seSBpZgotCVNfR0VUX09USEVSIGFuZCBTX0dFVF9ERVNDIGFyZSBkZWZpbmVkLgotCShzeW1ib2xfbWFrZSk6IEFyZ3VtZW50IE5BTUUgaXMgbm93IHBvaW50ZXIgdG8gY29uc3QuCi0JKHN5bWJvbF9maW5kLCBzeW1ib2xfZmluZF9iYXNlKTogTGlrZXdpc2UuCi0JKFNfSVNfKiwgU19HRVRfKiwgU19TRVRfKikgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb25zLgotCSogc3ltYm9scy5oOiBGaXggcHJvdG90eXBlcyBmb3IgbmV3IGNvbnN0IGFyZ3VtZW50cy4gIEFkZAotCXByb3RvdHlwZXMgZm9yIEJGRF9BU1NFTUJMRVIgU18qIGZ1bmN0aW9ucy4KLQotCSogc3Vic2Vncy5jIChzdWJzZWdfY2hhbmdlKSBbQkZEX0FTU0VNQkxFUl06IEJGRCB2ZXJzaW9uIG9mIGNvZGUKLQlmb3IgY2hhbmdpbmcgdG8gYW4gZXhpc3Rpbmcgc2VjdGlvbi4KLQkoc3Vic2VnX25ld19yZXN0KSBbQkZEX0FTU0VNQkxFUl06IFNwbGl0IG9mZiBmcm9tIHN1YnNlZ19uZXcsCi0JY2FsbGVkIGJ5IHN1YnNlZ19uZXcgYW5kIHN1YnNlZ19zZXQuCi0JKHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogUmV3cml0dGVuIHRvIGNoYW5nZSB0byBuZXcgc2VjdGlvbiwKLQlnaXZlbiBzZWN0aW9uIG5hbWUgYW5kIHN1YnNlZyBudW1iZXIuCi0JKHN1YnNlZ19zZXQpIFtCRkRfQVNTRU1CTEVSXTogTmV3IGZ1bmN0aW9uOyBjaGFuZ2UgdG8gYSBwb3NzaWJseQotCW5ldyBzZWN0aW9uL3N1YnNlY3Rpb24uCi0KLQkqIHJlYWQuYzogRG9uJ3QgaW5jbHVkZSBjdHlwZS5oLgotCShjb25zKSBbQkZEX0FTU0VNQkxFUl06IEZvciB1bmRlZmluZWQgc3ltYm9scywgdXNlIEJGRF9SRUxPQ18zMgotCWZvciBub3c7IHNob3VsZCBiZSBtYWNoaW5lLWRlcGVuZGVudC4KLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgKi0qLWVsZiBhbmQgKi0qLXNvbGFyaXMqIGFzIEVMRiBmb3JtYXQKLQl0YXJnZXRzLCBmb3JjaW5nIEJGRCB1c2UuCi0KLVdlZCBGZWIgMTcgMTg6NTk6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYzogVXNlIFBBUkFNUyBtYWNybyBmb3Igc3RhdGljIGZ1bmN0aW9uCi0JZGVjbGFyYXRpb25zLiAgVXNlIEJGRF9SRUxPQ18gbWFjcm9zIGV2ZXJ5d2hlcmUsIHdpdGgKLQljb21wYXRpYmlsaXR5IG1hY3JvcyBkZWNsYXJlZCBmb3Igbm9uLUJGRCBtb2RlLgotCShzdHJ1Y3Qgc3BhcmNfaXQpIFtCRkRfQVNTRU1CTEVSXTogVXNlIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotCWluc3RlYWQgb2YgZW51bSByZWxvY190eXBlLgotCShlbWl0X3NwYXJjX3JlbG9jKTogQ29tbWVudGVkLW91dCBmdW5jdGlvbiBkZWxldGVkLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEZWxldGVkLgotCSh0Y19hb3V0X3ByZV93cml0ZV9ob29rKTogRG9uJ3QgZGVmaW5lIGZvciBCRkRfQVNTRU1CTEVSLgotCShtZF9hcHBseV9maXgpOiBDaGFuZ2VkIGNhbGxpbmcgc2VxdWVuY2UgKGNvbmRpdGlvbmFsbHkpIGZvciBCRkQKLQl2ZXJzaW9uLgotCSogY29uZmlnL3RjLXNwYXJjLmggKG1kX2NvbnZlcnRfZnJhZyk6IE5ldyBtYWNyby4KLQotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9hb3V0X3N0YWIpOiBSZWZlciB0byB1bmRlZmluZWRfc2VjdGlvbiwKLQlub3QgU0VHX1VOS05PV04uICBVc2UgU19TRVRfVFlQRSwgU19HRVRfVFlQRSwgU19HRVRfREVTQyBpbnN0ZWFkCi0Jb2YgcmVmZXJlbmNpbmcgZmllbGRzIGRpcmVjdGx5LgotCi0JKiB3cml0ZS5jIChjdnRfZnJhZ190b19maWxsKTogTmV3IGZ1bmN0aW9uOyBleHRyYWN0ZWQgZnJvbQotCXdyaXRlX29iamVjdF9maWxlLgotCSh3cml0ZV9vYmplY3RfZmlsZSkgWyEgQkZEX0FTU0VNQkxFUl06IENhbGwgaXQuCi0JKHJlbGF4X2FuZF9zaXplX3NlZykgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb247IHJlbGF4IHNlY3Rpb24KLQlhbmQgc2V0IGl0cyBzaXplIGFuZCBmbGFncy4KLQotCSogc3RydWMtc3ltYm9sLmggKHN0cnVjdCBzeW1ib2wpIFtCRkRfQVNTRU1CTEVSXTogUmVwbGFjZSBzb21lCi0JZmllbGRzIHdpdGggQkZEIGVxdWl2YWxlbnRzLiAgVHVybiBvbiBiYWNrLXBvaW50ZXJzLCBhbmQgYWRkCi0JdGFyZ2V0LXNwZWNpZmljIGZpZWxkcyBhdCBlbmQuCi0KLVRodSBGZWIgMTEgMDk6MjA6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogRG9uJ3Qgc2V0IHZhZGRyIGhlcmUuCi0JKHdyaXRlX29iamVjdF9maWxlKTogU2V0IGl0IGhlcmUgaW5zdGVhZCwgc28gdGhhdCBmaXh1cF9zZWdtZW50Ci0JY2FuIHNlZSB0aGUgY29ycmVjdCB2YWx1ZS4KLQotTW9uIEZlYiAgOCAxMzo1NjoxNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogQ2hlY2sgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYW5kCi0JYmFpbCBvdXQgYmVmb3JlIHByb2Nlc3NpbmcgY29udGVudHMuCi0JKGNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEpOiBOZXcgZnVuY3Rpb24sIGRvZXMgbW9zdCBvZiB0aGUgd29yawotCW9mIHJlbW92ZV9zdWJzZWdzLgotCShjaGFpbl9mcmNoYWluc190b2dldGhlcikgW0JGRF9BU1NFTUJMRVJdOiBOZXcgZnVuY3Rpb24uCi0JKHJlbW92ZV9zdWJzZWdzKSBbISBCRkRdOiBDYWxsIGl0LgotCSh3cml0ZV9vYmplY3RfZmlsZSkgW0JGRF9BU1NFTUJMRVJdOiBDb252ZXJ0ZWQgdG8gdXNlIEJGRAotCXN0cnVjdHVyZXMgYW5kIHJvdXRpbmVzLgotCi0JKiBjb25maWcvb2JqLWVsZi4qOiBOZXcgZmlsZXMuCi0KLQkqIGNvbmZpZy9taXBzLm10LCBjb25maWcvcnM2MDAwLm10OiBEZWxldGVkLgotCi0JKiBjb25maWcvaDgzMDAubXQ6IERvbid0IHNwZWNpZnkgY29tcGlsZXIgaGVyZS4KLQotCSogY29uZmlnL3o4ay5tdDogVGhlIHo4ayBjb2RlIGRlcGVuZHMgb24gdGhlIHo4ayBvcGNvZGUgdGFibGUsCi0Jbm90IHRoZSBoODMwMCBvbmUuCi0JKiBjb25maWcvdGMtejhrLmg6IENvbW1lbnQgZml4LgotCi0JKiB3cml0ZS5jOiBSZW9yZGVyZWQgc29tZSBmdW5jdGlvbnMgZm9yIGJldHRlciBpbmxpbmluZy4KLQkoZml4dXBfc2VnbWVudCk6IExpbmtyZWxheCBjb2RlIGlzIG5vIGxvbmdlciBjb25kaXRpb25hbCBvbgotCVRDX0k5NjAuCi0KLVRodSBGZWIgIDQgMTI6NDU6MTYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy97aDg1MDAubXQsIHRjLWg4NTAwLmMsIHRjLWg4NTAwLmgsIG9iai1jb2ZmYmZkLmMsCi0Jb2JqLWNvZmZiZmQuaH06IHN1cHBvcnQgZm9yIHRoZSBIOC81MDAKLQotV2VkIEZlYiAgMyAxOToyODoxOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9vYmotdm1zLmggKFNVQl9TRUdNRU5UX0FMSUdOKTogRGVmaW5lIFZNUyB2ZXJzaW9uIGhlcmUuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IE5vdCBoZXJlLgotCShmaXhfbmV3KTogSW5pdGlhbGl6ZSBmeF9hZGRudW1iZXIuCi0KLQkqIGxpc3RpbmcuYzogRG9uJ3QgaW5jbHVkZSB0YXJnZXQtY3B1LmggZXhwbGljaXRseSwgc2luY2UgYXMuaAotCWluY2x1ZGVzIGl0LgotCi1UaHUgSmFuIDI4IDAwOjM1OjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5oIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVjbGFyZSBuZXh0X29iamVjdF9maWxlX2NoYXJQLAotCSpfZml4X3Jvb3QsICpfZml4X3RhaWwsIHNlZ19maXhfcm9vdFAsIHNlZ19maXhfdGFpbFAuCi0JKHN0cnVjdCBmaXgpOiBSZW9yZGVyZWQgZmllbGRzIGZvciBjb21wYWN0bmVzcyBhbmQgZWZmaWNpZW5jeS4KLQlDb252ZXJ0ZWQgc29tZSBsb2dpY2FsIGZpZWxkcyB0byAxLWJpdCBmaWVsZHMuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oOiBVc2UgUEFSQU1TLgotCVtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVmaW5lL2RlY2xhcmUgQU9VVF9NQUNIVFlQRSwgc2VnX05fVFlQRSwKLQlOX1RZUEVfc2VnLCBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUuCi0KLQkqIHJlYWQuYzogRG9uJ3QgaW5jbHVkZSBsaXN0aW5nLmg7IGFzLmggaW5jbHVkZXMgaXQuICBSZW1vdmVkCi0JRE9OVERFRiBjb2RlLgotCVtCRkRfQVNTRU1CTEVSXTogSW5jbHVkZSBzdWJzZWdzLmguCi0JKG9sZF9idWZmZXIsIG5ld19icm9rZW5fd29yZHMpOiBEZWZhdWx0IGluaXRpYWxpemF0aW9uIGlzCi0Jc3VmZmljaWVudC4KLQotCSogb3V0cHV0LWZpbGUuYyBbQkZEX0FTU0VNQkxFUl06IEluY2x1ZGUgYmZkLmgsIGRlZmF1bHQgVEFSR0VUX01BQ0gKLQl0byAwLCBkZWZpbmUgc3Rkb3V0cHV0LgotCShvdXRwdXRfZmlsZV9jcmVhdGUpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBiZmRfcGVycm9yIG9uIGZhaWx1cmUuCi0JQ2FsbCBiZmRfc2V0X2FyY2hfbWFjaC4KLQkob3V0cHV0X2ZpbGVfY2xvc2UpIFtCRkRfQVNTRU1CTEVSXTogQ2FsbCBiZmRfY2xvc2UsIG5vdAotCWJmZF9jbG9zZV9hbGxfZG9uZS4gIENhbGwgYmZkX3BlcnJvciBvbiBmYWlsdXJlLgotCShvdXRwdXRfZmlsZV9hcHBlbmQpIFtCRkRfQVNTRU1CTEVSXTogRG9uJ3QgZGVmaW5lLgotCi0JKiBjb25maWcvbTY4a2NvZmYubXQgKExPQ0FMX0xPQURMSUJFUyk6IERlbGV0ZSBkZWZpbml0aW9uLgotCi0JKiBzdWJzZWdzLmggKHNlZ21lbnRfaW5mb190eXBlKTogQWx3YXlzIGRlZmluZS4gIE9taXQgZmllbGQgc2NuaGRyCi0JaWYgbm90IE1BTllfU0VHTUVOVFMuICBEZWZpbmUgbmV3IGZpZWxkIGJmZF9zZWN0aW9uIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoc2VnX2luZm8pOiBOZXcgbWFjcm8uCi0KLQkqIGV4cHIuYywgaW5wdXQtc2NydWIuYzogVXNlIFBBUkFNUyBtYWNyby4gIERlbGV0ZWQgdW51c2VkCi0JdmFyaWFibGVzLCBhbmQgc29tZSBpcnJlbGV2YW50IGNvbW1lbnRzLgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IEluY2x1ZGUgJChCRkRERUYpLgotCShMSUJTKTogSW5jbHVkZSAkKEJGRExJQikuICBEb24ndCBib3RoZXIgd2l0aCAkKENMSUIpLgotCSogY29uZmlndXJlLmluOiAgUGVybWl0IC0td2l0aC1iZmQtYXNzZW1ibGVyIG5vdywgd2l0aCBhIHdhcm5pbmcuCi0JVmFyaWFibGUgbmVlZF9iZmQgaXMgbm93IGEgYm9vbGVhbiwgYXMgaXMgbmV3IHZhcmlhYmxlIGJmZF9nYXMuCi0JU2V0IEJGRERFRiBhbmQgQkZETElCIGluIE1ha2VmaWxlIHdoZW4gYXBwcm9wcmlhdGUuCi0KLQkqIGFzLmM6IFJlbW92ZWQgIiNpZmRlZiBET05UREVGIiBhbmQgIiNpZmRlZiBjb21tZW50IiBjb2RlLgotCShtYWluKTogUmVmZXIgdG8gZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0IGluc3RlYWQgb2YKLQlmbGFnc2VlblsnWiddLgotCi0JKiBhcy5jIChtYWluKSBbQkZEX0FTU0VNQkxFUl06IE9wZW4gb3V0cHV0IGJmZC4KLQkoKl9zZWN0aW9uKSBbQkZEX0FTU0VNQkxFUl06IERlZmluZSB0aGVtLgotCShwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpIFtCRkRfQVNTRU1CTEVSXTogSW5pdGlhbGl6ZSB0aGVtLCBhbmQKLQlzZXQgc2VjdGlvbiBmbGFncyB3aGVuIGFwcHJvcHJpYXRlLgotCSogYXMuaCAoU0VHX05PUk1BTCkgW0JGRF9BU1NFTUJMRVJdOiBSZXF1aXJlIHRoYXQgdGhlIHNwZWNpZmllZAotCXNlY3Rpb24gaXMgbm90IGFic29sdXRlLCB1bmRlZmluZWQsIG9yIGFuIGFzc2VtYmxlciBpbnRlcm5hbCBvbmUuCi0JKGFic29sdXRlX3NlY3Rpb24sIHVuZGVmaW5lZF9zZWN0aW9uKTogQWx3YXlzIGRlZmluZS4KLQkqIGV4cHIuYywgcmVhZC5jLCBzeW1ib2xzLmM6IFJlZmVyIHRvICpfc2VjdGlvbiwgbm90IFNFR18qOyBicmVhawotCXN3aXRjaCBzdGF0ZW1lbnRzIGludG8gaWYtZWxzZSB0cmVlcy4KLQkqIHN5bWJvbHMuYyBbTUFOWV9TRUdNRU5UU106IERlbGV0ZWQgcmVkdW5kYW50IGRlZmluaXRpb25zIG9mCi0JU0VHX0JTUyBhbmQgU0VHX0RBVEEuCi0KLQkqIGFzLmggKGZyYWdfbm93X2ZpeCk6IE5ldyBtYWNyby4KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBVc2UgaXQuCi0KLVdlZCBKYW4gMjcgMjE6NDM6NTMgUFNUIDE5OTMgIFJhbHBoIENhbXBiZWxsICAocmFscGhjQHB5cmFtaWQuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvdGMtbWlwcy5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvaG8tbWlwc2JzZC5oOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBjb25maWcvbWlwcy1vcGNvZGUuaDogIEFkZGVkIG1pcHMgc3VwcG9ydCBmb3IgbWlwcy1kZWMtYnNkLgotCSogY29uZmlndXJlLmluOiAgQWRkZWQgbWlwcyBzdXBwb3J0IGZvciBtaXBzLWRlYy1ic2QuCi0JKiBhdG9mLWdlbmVyaWMuYzogIERlZmluZSBUUlVFIGFuZCBGQUxTRSBpZiBub3QgZGVmaW5lZC4KLQotVGh1IEphbiAyMSAxMjo0ODoxOSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHZlcnNpb24uYzogQnVtcGVkIHZlcnNpb24gbnVtYmVyIHRvIDEuOTMuMDUuCi0KLVdlZCBKYW4gMjAgMTc6MTE6NTMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBEb24ndCB1c2UgI2VsaWYuCi0JKG9ial9lbWl0X2xpbmVubyk6IERvbid0IG5lZWQgcmV0dXJuIGF0IGVuZCBvZiB2b2lkIGZ1bmN0aW9uLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogRGl0dG8uCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IFJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KLQkodGNfYW91dF9maXhfdG9fY2hhcnMpOiBBcnJheSBuYnl0ZXNfcl9sZW5ndGggaXMgbm93IGNvbnN0LgotCi0JKiBjb25maWcvdGMtbTY4ay5oIChUQ19DT1VOVF9SRUxPQyk6IERvbid0IGVtaXQgcmVsb2MgaWYgb25seQotCW9mZnNldCBmaWVsZCBpcyBzZXQuCi0KLUZyaSBKYW4gIDggMDU6NDQ6NDkgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBGb3IgJXVoaSBhbmQgJXVsbywgaWYgbm90Ci0JRU5WNjQsIGVtaXQgbm8gcmVsb2MuCi0JKG1kX3BzZXVkb190YWJsZSk6IEZvciAiLnh3b3JkIiwgY2FsbCBzX3h3b3JkLgotCShzX3h3b3JkKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoYXJjaGl0ZWN0dXJlX3JlcXVlc3RlZCwgd2Fybl9vbl9idW1wLAotCW1kX3JlbGF4X3RhYmxlKTogVXNlIGRlZmF1bHQgemVybyBpbml0aWFsaXphdGlvbi4KLQkoc19yZXNlcnZlKTogU2luY2UgU0VHX0UyIGlzIGVxdWl2YWxlbnQgdG8gU0VHX0JTUywganVzdCB1c2UgdGhlCi0JbGF0dGVyLCBpbnN0ZWFkIG9mIHNlbGVjdGluZyB3aXRoIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCi0KLVRodSBKYW4gIDcgMDg6NTg6MjEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbmlzZSBhbGwgc3BhcmNsaXRlIHZhcmlhbnRzCi0KLVRodSBKYW4gIDcgMDU6MjU6MjUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfZGF0YSkgWyFCRkRfQVNTRU1CTEVSXTogRml4IHR5cG8gaW4gNCBKYW4gY2hhbmdlIC0tCi0JYWNjaWRlbnRhbGx5IGNoYW5nZWQgdG8gdXNlIHN1YnNlZ19jaGFuZ2Ugd2hlcmUgaXQgc2hvdWxkIGhhdmUKLQliZWVuIHN1YnNlZ19uZXcuCi0KLVR1ZSBKYW4gIDUgMDg6NDI6MTYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBjb21tYSBvciBuZXdsaW5lIGlzIGEKLQlsb2dpY2FsIGVuZC1vZi1saW5lIGNoYXJhY3RlciwgdXNlIHRoZSBuZXdsaW5lIGNhc2UuCi0JRnJvbSBFcmljIFlvdW5nZGFsZToKLQkob3BlcmFuZCk6IFNldCBYX2FkZF9udW1iZXIgZmllbGQgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0JKG9wZXJhbmQpOiBUcmVhdCB6ZXJvIGJ5dGUgYXMgZW5kLW9mLW9wZXJhbmQuCi0KLQkqIGNvbmZpZ3VyZS5pbiAocGVyLXRhcmdldCk6IExvb2sgZm9yIHdpdGhfYmZkX2Fzc2VtYmxlciBvcHRpb24uCi0JRm9yIG5vdywgb25seSBhY2NlcHQgIm5vIiwgdW50aWwgdGhlIG1lcmdlIGlzIGRvbmUuCi0KLQlNZXJnZWQgY2hhbmdlcyBmcm9tIEVyaWMgWW91bmdkYWxlICh5b3VuZ2RhbGVAdjY1NTBjLm5ybC5uYXZ5Lm1pbCk6Ci0JKiBhcy5jLCBmbG9udW0ta29uc3QuYywgaGV4LXZhbHVlLmMsIGlucHV0LWZpbGUuYywgdmVyc2lvbi5jLAotCSAgY29uZmlnL29iai1hb3V0LmgsIGNvbmZpZy9vYmotdm1zLmM6IFZNUyAtPiBIT19WTVMuCi0JKiByZWFkLmM6IEZpbmlzaCBjb252ZXJzaW9uIHRvIFNfKiBtYWNyb3MgaW4gdGhlIFZNUyBvbmx5Ci0JICBwYXJ0cyBvZiB0aGUgcHJvZ3JhbS4gQWRkICJjb25zdCIgbW9kaWZpZXIgdG8gaGV4X3ZhbHVlLgotCSogYXMuYywgcmVhZC5jLCBzeW1ib2xzLmMsIHdyaXRlLmM6IENoYW5nZSAiaWZkZWYgVk1TIiB0bwotCSAgImlmZGVmIE9CSl9WTVMiLgotCSogZXhwci5jOiBBZGQgImNvbnN0IiBtb2RpZmllciB0byBoZXhfdmFsdWUuCi0JKiBzeW1ib2xzLmM6IEZpbmlzaCBjb252ZXJzaW9uIHRvIFNfKiBtYWNyb3MgaW4gdGhlIFZNUyBvbmx5Ci0JICBwYXJ0cyBvZiB0aGUgcHJvZ3JhbS4gIEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvCi0JICBtZF9bbG9uZyxzaG9ydF1fanVtcF9zaXplLiBSZW1vdmUgZGVjbGFyYXRpb24gb2YgY29uc3RfZmxhZwotCSAgKHdoaWNoIHdpbGwgYmUgZGVjbGFyZWQgaW4gb2JqLXZtcy5oKS4KLQkqIHdyaXRlLmM6IEFkZCAiY29uc3QiIG1vZGlmaWVyIHRvIG1kX1tsb25nLHNob3J0XV9qdW1wX3NpemUuCi0JICBGaXggYXJndW1lbnRzIHRvIFZNU193cml0ZV9vYmplY3RfZmlsZS4KLQkqIGNvbmZpZy1nYXMuY29tOiBOZXcgZmlsZS4gIFNjcmlwdCBmb3IgVk1TIHN5c3RlbXMgdG8gc2V0IHVwIHRoZQotCSAgY29uZmlndXJhdGlvbiB0byBidWlsZCBnYXMgZm9yIFZNUywgYW5kIGNyZWF0ZSBjb25maWcuc3RhdHVzLgotCSogbWFrZS1nYXMuY29tOiBSZWRvbmUgdG8gd29yayB3aXRoIG5ldyBzY2hlbWUuCi0JKiBvYmotdm1zLmM6IFBhdGNoIHRvIGZpeCBidWcgd2hlcmUgd2Ugd2VyZSBub3QgY29ycmVjdGx5IHBhcnNpbmcgdGhlCi0JICBzdGFicyBkaXJlY3RpdmVzLgotCSogb2JqLXZtcy5jOiAgRGVmaW5lIG1hY3JvcyBDT1BZX0xPTkcgYW5kIENPUFlfU0hPUlQgd2hpY2gKLQkgIHdpbGwgc3dhcCBieXRlcyBpZiBuZWVkZWQgb24gYSBiaWcgZW5kaWFuIHN5c3RlbS4gIFVzZSB0aHJvdWdob3V0Ci0JICBhcyBuZWVkZWQuCi0JKiBvYmotdm1zLmMgKG9ial9hb3V0X3N0YWIpOiAgQWRkIGNvZGUgdG8gZ2VuZXJhdGUgbGlzdGluZyBmaWxlLgotCSogb2JqLXZtcy5jIChWTVNfdHlwZWRlZl9wYXJzZSk6IEFkZCBhbGlhcyB0byBjb3JyZWN0bHkgaGFuZGxlIGNlcnRhaW4KLQkgIHR5cGVzIG9mIG1hbGZvcm1lZCBzdGFicy4gIENoYW5nZSBwYXJzaW5nIGFsZ29yaXRobSBzbyB0aGF0IHdlIGFyZQotCSAgbW9yZSBjZXJ0YWluIG9mIGhhdmluZyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgbmVlZCBvbiBoYW5kLgotCSogb2JqLXZtcy5jIChmaW5hbF9mb3J3YXJkX3JlZmVyZW5jZSk6ICBOZXcgZnVuY3Rpb24sIHVzZWQgdG8gaGVscAotCSAgcmVzb2x2ZSB0aGUgZGF0YSB0eXBlcyBvZiBhcyBtYW55IHN0cnVjdCBlbGVtZW50cyBhcyBwb3NzaWJsZQotCSAgd2hlbiBzb21lIHBhcnQgb2YgdGhlIHN0cnVjdCBpcyBub3QgZnVsbHkgZGVmaW5lZCBieSB0aGUgY29tcGlsZXIuCi0JKiBvYmotdm1zLmMgKFZNU19MU1lNX1BhcnNlKTogIENvcnJlY3RseSBoYW5kbGUgY2FzZSBvZiBjb250aW51YXRpb24KLQkgIHN0YWJzIGRpcmVjdGl2ZXMuCi0JKiBvYmotdm1zLmMgKFZNU193cml0ZV9vYmplY3RfZmlsZSk6IERlZmluZSBhbGwgdnRhYmxlIHBzZWN0cwotCSAgYXMgc3ltYm9scyBhcyB3ZWxsIGluIHRoZSBvYmplY3QgZmlsZS4gIExvb2sgZm9yIGV4dGVybmFsIGZ1bmN0aW9ucwotCSAgdGhhdCBzdGFydCB3aXRoICJfX3Z0LiIsIGFuZCB0dXJuIHRoZW0gaW50byB2YXJpYWJsZXMsIHNpbmNlIHRoZQotCSAgZysrIGNvbXBpbGVyIGlzIGluY2FwYWJsZSBvZiBkb2luZyB0aGlzLgotCSogdGMtdmF4LmM6IEFkZCAnMScgb3B0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgR0NDCi0JICB2ZXJzaW9ucy4KLQkqIGJpZ251bS1jb3B5LmMgKGJpZ251bV9jb3B5KTogRml4IGJ1ZyB3aGVyZSB3ZSBwYWQgd2l0aCB6ZXJvZXMuCi0JKiBpbnB1dC1zY3J1Yi5jIChhc193aGVyZSk6IEZpeCBidWcgd2hlcmUgYXMgd291bGQgY3Jhc2ggaWYgd2UgZGlkIG5vdAotCSAgaGF2ZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUgeWV0LgotCSogY29uZmlnL2hvLXZtcy5oOiBkZWZpbmUgSE9fVk1TLCBub3QgSE9fVkFYLgotCi1Nb24gSmFuICA0IDA1OjE3OjI2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiByZWFkLmMgKHNfZGF0YSk6IEFsd2F5cyB1c2UgImRhdGFfc2VjdGlvbiIsIHNpbmNlIGl0J2xsIG1hcCB0bwotCVNFR19EQVRBIG9yIFNFR19FMSBpZiBuZWVkZWQuCi0JKHNfbGNvbW0pOiBMaWtld2lzZSB3aXRoIGJzc19zZWN0aW9uLgotCShzX2ZpbGwpOiBVc2UgbWVtc2V0LCBub3QgYnplcm8uCi0KLVRodSBEZWMgMzEgMDQ6Mjk6MjcgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYzogRGVsZXRlZCBzb21lIGNvZGUgdW5kZXIgIiNpZmRlZiBET05UREVGIiB0aGF0IHdhcyBmb3IKLQloYW5kbGluZyBHREIgc3ltYm9sIHRhYmxlIGRhdGEuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5oIChzZWdtZW50X25hbWUpOiBEZWxldGUgZGVmaW5pdGlvbi4KLQkoc2VnX25hbWUpOiBEZWxldGUgZGVjbGFyYXRpb24uCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoc2VnbWVudF9uYW1lLCBzZWdfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai12bXMuaCAoc2VnbWVudF9uYW1lLCBzZWdfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmLmggKHNlZ21lbnRfbmFtZSk6IERpdHRvLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmggKHNlZ21lbnRfbmFtZSk6IERpdHRvLgotCi0JKiBDaGFuZ2VzIGZvciBCRkRfQVNTRU1CTEVSOgotCSogb2JqLmggKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBEZWNsYXJlIG9ubHkgaWYgbm90Ci0JQkZEX0FTU0VNQkxFUi4KLQkob2JqX2hlYWRlcl9hcHBlbmQsIG9ial9wcmVfd3JpdGVfaG9vayk6IERpdHRvLgotCSogYXMuaCAoc3Rkb3V0cHV0KTogTmV3IHZhciwgZGVmaW5lZCBvbmx5IGlmIEJGRF9BU1NFTUJMRVIuCi0JKHNlZ1QpIFtCRkRfQVNTRU1CTEVSXTogTmV3IHR5cGVkZWYgZm9yICJhc2VjdGlvbiAqIi4KLQkoc2VnbWVudF9uYW1lKSBJZiBCRkRfQVNTRU1CTEVSLCBsb29rIHVwIEJGRCBzZWN0aW9uIG5hbWU7Ci0Jb3RoZXJ3aXNlLCB1c2Ugc2VnX25hbWUgYXJyYXkuCi0JKHNlZ19uYW1lKTogRGVjbGFyZSBvbmx5IGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShzZWN0aW9uX2FsaWdubWVudCk6IERlY2xhcmUgb25seSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkoYmlnX3NlY3Rpb24sIHJlZ19zZWN0aW9uLCBwYXNzMV9zZWN0aW9uLCBkaWZmX3NlY3Rpb24sCi0JYWJzZW50X3NlY3Rpb24sIHRleHRfc2VjdGlvbiwgZGF0YV9zZWN0aW9uLCBic3Nfc2VjdGlvbik6IElmCi0JQkZEX0FTU0VNQkxFUiwgZGVjbGFyZSBhcyB2YXJpYWJsZXM7IG90aGVyd2lzZSwgZGVjbGFyZSBhcyBtYWNyb3MsCi0JbWFwcGluZyB0byBzZWdUIGVudW0gdmFsdWVzLgotCSh0Y19hb3V0X2ZpeF90b19jaGFycywgbmV4dF9vYmplY3RfZmlsZV9jaGFyUCk6IEZvcmNlIHBhcnNlIGVycm9ycwotCWlmIHRoZXNlIGFyZSB1c2VkIG9yIGRlZmluZWQsIGlmIEJGRF9BU1NFTUJMRVIuCi0JKHN1YnNlZ19zZXQsIHN1YnNlZ19uZXcpIFtCRkRfQVNTRU1CTEVSXTogRnVuY3Rpb25hbGl0eSBvZiBvbGQKLQlzdWJzZWdfbmV3IHNwbGl0IGludG8gdHdvIGZ1bmN0aW9ucy4KLQkoU0VHX05PUk1BTCk6IEZvciBCRkRfQVNTRU1CTEVSLCBhbHdheXMgcmV0dXJuIHRydWUsIGZvciBub3cuCi0KLQkqIGFzLmggKHZvbGF0aWxlKTogRG9uJ3QgZGVmaW5lIGlmIGFscmVhZHkgZGVmaW5lZC4KLQkoaGFkX2Vycm9ycywgaGFkX3dhcm5pbmdzKTogUHJvdmlkZSBwcm90b3R5cGVzIGZvciBBTlNJIEMgZXZlbiBpZgotCU5PX1NUREFSRy4KLQkoYXNfYmFkLCBhc19mYXRhbCwgYXNfdHNrdHNrLCBhc193YXJuKTogRm9yIEdOVSBDIHZlcnNpb24gMiwKLQlkZWNsYXJlIHdpdGggZm9ybWF0IGF0dHJpYnV0ZSBmb3IgLVdmb3JtYXQgY2hlY2tpbmcuCi0KLVdlZCBEZWMgMzAgMTA6MTg6NTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhcHAuYywgY29uZmlnL3RjLSouYzogRG9uJ3QgaW5jbHVkZSByZWFkLmgsIHNpbmNlIGl0IGlzIGFscmVhZHkKLQlpbmNsdWRlZCBieSBhcy5oLgotCi0JKiBUaGVzZSBhcmUgYmFzZWQgb24gcGF0Y2hlcyBmcm9tIE1pbmggVHJhbi1sZQotCTxtdHJhbmxlQHBhcmlzLmludGVsbGljb3JwLmNvbT4uCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtaWJtLWFpeCopOiBBY2NlcHQgaTQ4NiBmb3IgaG9zdC4gIFVzZQotCW9ial9mb3JtYXQgY29mZmJmZCBhbmQgZ2FzX3RhcmdldCBpMzg2Y29mZiBmb3IgdGFyZ2V0LgotCShpWzM0XTg2LSotaXNjKik6IE5ldyBob3N0ICh1c2VzIHN5c3YpLgotCSogY29uZmlnL2kzODZhaXgubXQ6IFJlbW92ZWQgKG5vIGxvbmdlciB1c2VkKS4KLQkqIGNvbmZpZy9taC1pMzg2YWl4IChSQU5MSUIpOiBVc2UgdHJ1ZSByYXRoZXIgdGhhbiAvYmluL3RydWUuCi0JKE1JTlVTX0cpOiBSZW1vdmVkLgotCShMREZMQUdTKTogQWRkZWQsIGRlZmluZWQgYXMgLXNobGliLgotCSogY29uZmlnL3RlLWkzODZhaXguaCAoUkVWRVJTRV9TT1JUX1JFTE9DUyk6IFVuZGVmaW5lLgotCSogY29uZmlnL3RlLXNjbzM4Ni5oIChMT0NBTF9MQUJFTCk6IERvbid0IGRlZmluZS4KLQkoRE9UX0xBQkVMX1BSRUZJWCk6IERlZmluZS4KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIERPVF9MQUJFTF9QUkVGSVgsIHVzZSAuTDBcMDAxIGFzIGEgbGFiZWwKLQluYW1lIHJhdGhlciB0aGFuIEwwXDAwMS4KLQkqIHJlYWQuYyAoc19sY29tbSk6IE1ha2UgYSBmcmFnIGluIFNFR19CU1MgcmF0aGVyIHRoYW4gdXNpbmcKLQlsb2NhbF9ic3NfY291bnRlci4KLQkqIHN5bWJvbHMuYywgc3ltYm9scy5oIChsb2NhbF9ic3NfY291bnRlcik6IFJlbW92ZWQuCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IGJzcyBubyBsb25nZXIgdXNlcwotCWxvY2FsX2Jzc19jb3VudGVyLiAgUGFzcyBjb3JyZWN0IGRhdGEgYW5kIGJzcyBzaXplIHRvCi0JVk1TX3dyaXRlX29iamVjdF9maWxlLgotCSogY29uZmlnL29iai12bXMuYyAoVk1TX3dyaXRlX29iamVjdF9maWxlKTogQWNjZXB0IGJzcyBzaXplIGFzCi0JYXJndW1lbnQsIHJhdGhlciB0aGFuIHVzaW5nIGxvY2FsX2Jzc19jb3VudGVyLgotCSogY29uZmlnL3RjLW04OGsuYyAoc19ic3MpOiBEb24ndCB1c2UgbG9jYWxfYnNzX2NvdW50ZXIuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19yZXNlcnZlKTogRG9uJ3QgdXNlIGxvY2FsX2Jzc19jb3VudGVyLgotCSogY29uZmlnL29iai1jb2ZmYmZkLmMgKGhhZF9saW5lbm8sIGhhZF9yZWxvYyk6IFJlbW92ZWQuCi0JKHNpemVfc2VjdGlvbik6IFJlc3RvcmVkIHNhbml0eSBjaGVjay4KLQkoZG9fcmVsb2NzX2Zvcik6IEJhc2Ugc2VjdGlvbiBhZGRyZXNzIG9uIHNfcGFkZHIgcmF0aGVyIHRoYW4KLQljb21wdXRpbmcgaXQuICBBZGp1c3QgYTI5ayBSX0lISUhBTEYgc3BlY2lhbCBjYXNlIHRvIGFjY291bnQgZm9yCi0Jc2VjdGlvbiBwYWRkciAodXNlZCB0byByZXF1aXJlIHBhZGRyIHRvIGJlIHplcm8pLiAgSWYgdGhlcmUgYXJlIG5vCi0JcmVjbG9zLCBzZXQgc19yZWxwdHIgdG8gMC4gIFNldCByZWxvY2F0aW9uIHNpemUgaW4gb2JqZWN0X2hlYWRlcnMuCi0JKGZpbGxfc2VjdGlvbik6IEFsd2F5cyBzZXQgc192YWRkciBoZXJlLCByZW1vdmluZwotCVpFUk9fQkFTRURfU0VHTUVOVFMgY2FzZS4gIEZvcmNlIHNfc2NucHRyIGZvciBic3MgdG8gMC4gIERvbid0IHNldAotCU5PTE9BRCBmb3IgaTM4NiAuYnNzLCBiZWNhdXNlIGl0IGNvbmZ1c2VzIHRoZSBTVlIzIG5hdGl2ZSBsaW5rZXIuCi0JU2V0IFNUWVBfSU5GTyBmb3IgLmNvbW1lbnQuCi0JKGNvZmZfaGVhZGVyX2FwcGVuZCk6IFVzZSBvYmplY3QgaGVhZGVycyBhbmQgSF97U0VULEdFVH1fKiBtYWNyb3MuCi0JTWFrZSBhb3V0aGRyIHdyaXRpbmcgZGVwZW5kIG9uIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSLgotCShjcmF3bF9zeW1ib2xzKTogSGFuZGxlIDggY2hhcmFjdGVyIHNlY3Rpb24gbmFtZSBjb3JyZWN0bHkuICBVc2UKLQlIX3tTRVQsR0VUfV8qIG1hY3Jvcy4KLQkoZG9fbGluZW5vc19mb3IpOiBTZXQgbGluZW5vIHNpemUgaW4gb2JqZWN0X2hlYWRlcnMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogVXNlIEhfe1NFVCxHRVR9XyogbWFjcm9zLiAgRG9uJ3QgYm90aGVyIHRvCi0Jc2V0IHNfdmFkZHIgaGVyZS4gIElmIHN0cmluZ19ieXRlX2NvdW50IHJlbWFpbnMgNCwgc2V0IGl0IGJhY2sgdG8KLQkwLCBhbmQgb25seSB3cml0ZSBzdHJpbmdzIG91dCBpZiB0aGVyZSBhcmUgc29tZS4gIENhbGwKLQlmaWxsX3NlY3Rpb24gYmVmb3JlIGRvX3JlbG9jc19mb3IgYW5kIGRvX2xpbmVub3NfZm9yLgotCShvYmpfY29mZl9zZWN0aW9uKTogSGFuZGxlIG9wdGlvbmFsIHF1b3RlZCBzZWNvbmQgYXJndW1lbnQgZ2l2aW5nCi0Jc2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MuCi0JKG9ial9jb2ZmX2Jzcyk6IEFkZGVkIHRvIGhhbmRsZSAuYnNzLgotCShvYmpfY29mZl9pZGVudCk6IEFkZGVkIHRvIGhhbmRsZSAuaWRlbnQgKHB1dHMgc3RyaW5nIGluIC5jb21tZW50Ci0Jc2VjdGlvbikuCi0JKG9ial9jb2ZmX2xjb21tKTogUHV0IGNvbW1vbiBzeW1ib2xzIGluIC5ic3MsIG5vdCAuZGF0YS4KLQkoZml4dXBfbWRlcHMpOiBDaGFuZ2UgdG8gc2VnbWVudC4gIENhbGwgZnJhZ193YW5lIGFmdGVyCi0JbWRfY29udmVydF9mcmFnLgotCShmaXh1cF9zZWdtZW50KTogRXhwbGljaXRseSBjaGVjayBTX0lTX0NPTU1PTiBiZWZvcmUgbWFraW5nIDM4NgotCWFkanVzdG1lbnQgKGFscmVhZHkgaGFwcGVuZWQgb25seSBmb3IgY29tbW9uIHN5bWJvbHMsIGJ1dCB0aGlzIGlzCi0JY2xlYXJlcikuCi0JKiBjb25maWcvb2JqLWNvZmZiZmQuaCAoT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzX2Jzcyk6IERvbid0IHVzZSBpZiBJMzg2Q09GRi4KLQkobWRfcHNldWRvX3RhYmxlKTogSWdub3JlIC5vcHRpbSBhbmQgLm5vb3B0LgotCSh0Y19jb2ZmX3NpemVtYWNoZGVwKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLWkzODYuaCAoUkVWRVJTRV9TT1JUX1JFTE9DUyk6IFVuZGVmLCBmb3IgU1ZSMwotCWNvbXBhdGliaWxpdHkuCi0JKExPQ0FMX0xBQkVMKTogUmVtb3ZlZCBkZWZpbml0aW9uLgotCShET1RfTEFCRUxfUFJFRklYKTogRGVmaW5lZC4KLQotTW9uIERlYyAyOCAxMDozMjowNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYXBwLmMgKGFwcF9wdXNoKTogVXNlIG1lbWNweSwgbm90IGJjb3B5LgotCShkb19zY3J1Yl9uZXh0X2NoYXIpOiBGb3IgXCIsIHJldHVybiAiIG5vdCAnLgotCShzeW1ib2xfY2hhcnMpOiBOb3cgY29uc3QuCi0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IElmIG5vdCBMT0NBTF9MQUJFTFNfRkIsIGRvbid0IGxvb2sgZm9yICIwZiIKLQlhbmQgIjBiIi4gIElmIExPQ0FMX0xBQkVMU19ET0xMQVIsIGNoZWNrIGZvciAiMCQiLgotCi0JKiBjb25maWcvb2JqLWNvZmYuaDogRG9uJ3QgdXNlICNlbGlmLgotCi0JKiBjb25maWcvaG8tc3Vub3MuaDogRG9uJ3QgaW5jbHVkZSBzeXMvc3RkdHlwZXMuaDsgNC4wLjMgZG9lc24ndAotCWhhdmUgaXQuICAoUmVwb3J0ZWQgYnkgTm9haCBGcmllZG1hbiwgZnJpZWRtYW5AZ251LmFpLm1pdC5lZHUuKQotCi1XZWQgRGVjIDE2IDEyOjEyOjMzIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYywgb2JqLWllZWUuYzogZG9uJ3QgZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOIGlmIGl0IGlzCi0JYWxyZWFkeSBkZWZpbmVkLgotCi1UdWUgRGVjIDE1IDEyOjQwOjExIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBhbGxvdyBzaW5nbGUgcXVvdGUgc3RyaW5ncyBpZiBzbwotCWNvbmZpZ3VyZWQuCi0KLQkqIGNvbmZpZy8qejhrKjogY2hlY2twb2ludAotCi1TdW4gRGVjIDEzIDAwOjA0OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBhdm9pZCBjYWxsaW5nIHhtYWxsb2MgKDApLgotCi1TYXQgRGVjIDEyIDE1OjI2OjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jOiBDYWxsIHhtYWxsb2MsIG5vdCBtYWxsb2M7IGRvbid0IGRlY2xhcmUgbWFsbG9jLgotCi0JKiBDaGFuZ2VzIHRvIHN1cHBvcnQgU0NPIDMuMnY0OgotCSogcmVhZC5jIChzX2FsaWduX2J5dGVzLCBzX2FsaWduX3B0d28pOiBJZiBub3QgU0VHX0RBVEEgb3IKLQlTRUdfQlNTLCBmaWxsIHdpdGggTk9QX09QQ09ERS4KLQkqIGNvbmZpZy9pMzg2Y29mZi5tdDogQWRkIG9wY29kZS9pMzg2LmggdG8gVEFSR19DUFVfREVQRU5ERU5UUy4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jIChkb19yZWxvY3NfZm9yKTogSW5jcmVtZW50IGFkZHIgZXZlbiBpZiBub3QKLQl1c2luZyBaRVJPX0JBU0VEX1NFR01FTlRTLgotCShmaWxsX3NlY3Rpb24pOiBJZiBaRVJPX0JBU0VEX1NFR01FTlRTLCBzZXQgc2VnbWVudCBhZGRyZXNzZXMsIGJ1dAotCW5ldmVyIHNldCBzZWdtZW50IGFkZHJlc3MgZm9yIFNFR19FMiAoLmJzcykgYW5kIGRvbid0IHdyaXRlIG91dAotCVNFR19FMiBjb250ZW50cy4gIFNldCAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgdG8gU1RZUF9URVhULgotCShvYmpfY29mZl9lbmRlZik6IERvbid0IG1lcmdlIGxhYmVscyBvciBzeW1ib2xzIGF3YWl0aW5nIGZvcndhcmQKLQlkZWZpbml0aW9ucywgYW5kIGRvbid0IG1lcmdlIHRhZ3Mgd2l0aCBub24tdGFncy4gIENoZWNrIGZvciAuYmYKLQlyYXRoZXIgdGhhbiBqdXN0IGNoZWNraW5nIHdoZXRoZXIgdGhlIHNlY29uZCBjaGFyYWN0ZXIgaXMgYiBhbmQKLQl0aGUgdGhpcmQgY2hhcmFjdGVyIGlzIGYuCi0JKG9ial9jb2ZmX3ZhbCk6IGdjYyBjYW4gZ2VuZXJhdGUgdmFsdWVzIHdoaWNoIHdlIGRvbid0IGhhbmRsZQotCWNvcnJlY3RseTsgZGlzY2FyZCBpbmZvcm1hdGlvbiBmb3Igbm93LCBzaW5jZSBpdCBvbmx5IGFmZmVjdHMgdGhlCi0JZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCSh0YWdfZmluZF9vcl9uYW1lKTogRG9uJ3QgaW5zZXJ0IHRhZ3MgaW4gdGhlIHN5bWJvbCB0YWJsZS4KLQkoeWFua19zeW1ib2xzKTogRG9uJ3QgbWVyZ2UgbGFiZWxzLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IERvbid0IGRlZmluZSBTVUJfU0VHTUVOVF9BTElHTiBpZiBpdCBpcwotCWFscmVhZHkgZGVmaW5lZC4gIEZpbGwgc3Vic2VnbWVudHMgd2l0aCBOT1BfT1BDT0RFLCBub3QgMC4gIERvbid0Ci0Jc2V0IHNlZ21lbnQgYWRkcmVzcyBpZiBaRVJPX0JBU0VEX1NFR01FTlRTLgotCShvYmpfY29mZl9zZWN0aW9uKTogQWNjZXB0IGFuZCBpZ25vcmUgYSB0cmFpbGluZyBxdW90ZWQgc3RyaW5nLCBhcwotCXVzZWQgaW4gQVQmVCBpMzg2IHN5bnRheC4KLQkoZml4dXBfc2VnbWVudCk6IFRha2Ugc2VnbWVudCBhcyBhcmd1bWVudC4gIE9uIHRoZSBpMzg2LCBhZGp1c3QgUEMKLQlyZWxhdGl2ZSBhZGRlbmRzIGJ5IHRoZSBzZWdtZW50IHZhZGRyLgotCSogdGMtaTM4Ni5oOiBEZWZpbmUgU1VCX1NFR01FTlRfQUxJR04uCi0JKiB0Yy1hMjlrLmg6IERlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTLgotCSogdGMtaTM4Ni5jOiAoaTM4Nl9vcGVyYW5kKTogSWYgSTM4NkNPRkYsIGFjY2VwdCBhbnkgc2VnbWVudCB0eXBlLgotCi1UdWUgRGVjICA4IDAwOjA2OjQ4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL29iai1jb2ZmYmZkLmM6IEluY2x1ZGUgbGliY29mZi5oLgotCi0JKiB2ZXJzaW9uLmM6IE5vdyB2ZXJzaW9uIDEuOTMuCi0KLU1vbiBEZWMgIDcgMDA6Mzk6MDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IEZvciAzODZic2QgYW5kIGxpbnV4LCBkbwotCXBvd2VyLW9mLXR3byBhbGlnbm1lbnQgZm9yIC5hbGlnbi4KLQotCSogYXMuaDogSWYgQlJPS0VOX0FTU0VSVCwganVzdCByZWRlZmluZSBgYXNzZXJ0JyB0byBiZSB0cml2aWFsLAotCWFuZCBsZWF2ZSBldmVyeXRoaW5nIGVsc2UgYWxvbmUuCi0KLUZyaSBEZWMgIDQgMTY6NTg6NDIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoYXMubmV3KTogRG9uJ3QgYm90aGVyIHNhdmluZyBhcy5vbGQuCi0KLQkqIHdyaXRlLmM6IENvbmRpdGlvbmFsaXplIG9uIE9CSl9WTVMsIG5vdCBWTVMuCi0JKG1hZ2ljX251bWJlcl9mb3Jfb2JqZWN0X2ZpbGUpOiBEb24ndCBkZWZpbmUgaWYgT0JKX1ZNUy4KLQotCSogY29uZmlnL29iai12bXMuYzogQ2hhbmdlcyBmb3IgdHJhZGl0aW9uYWwgQy4KLQotVGh1IERlYyAgMyAwMToyNDowNyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2hvLWdlbmVyaWMuaCAobWFsbG9jLCByZWFsbG9jKTogRGVjbGFyZS4KLQotCSogTG90cyBvZiBjb21tZW50L3doaXRlc3BhY2UgY2hhbmdlcy4KLQotCSogd3JpdGUuaCAoc3RydWN0IGZpeCk6IFNvbWUgZmllbGRzIHJlb3JkZXJlZCwgbmFycm93ZWQuCi0KLQkqIHJlYWQuYyAoTUFTS19DSEFSKTogRGVmaW5lIHVzaW5nIEMgdHlwZXMsIG5vdCBtYWdpYyBudW1iZXIuCi0KLQkqIGFzLmMsIGlucHV0LWZpbGUuYzogRGVsZXRlZCBzb21lIHVudXNlZCBjb2RlLgotCi0JKiBhcHAuYywgYXMuaDogRG9jIGZpeC4KLQotCSogZmxvbnVtLWtvbnN0LmMsIGZsb251bS1tdWx0LmM6IEluY2x1ZGUgYW5zaWRlY2wuaC4KLQotCSogYXMuaCAoeG1hbGxvYyk6IEFyZ3VtZW50IGlzIGxvbmcuCi0KLQkqIHhtYWxsb2MuYyAoZXJyb3IpOiBSZW1vdmUgZGVjbGFyYXRpb247IGFzLmggdGFrZXMgY2FyZSBvZiBpdC4KLQotCSogZG9jL2FzLnRleGluZm86IFJlZ3JvdXBlZCBkb2N1bWVudGF0aW9uIG9mIHNvbWUgY29tbWFuZC1saW5lCi0Jb3B0aW9ucy4gIFVwZGF0ZWQgb3B0aW9ucyBkb2N1bWVudGF0aW9uIGZvciBtNjhrLiAgU29tZSBtaW5vcgotCXdvcmRpbmcvcHVuY3R1YXRpb24gY2hhbmdlcy4KLQotTW9uIE5vdiAzMCAxMTo0MjoxMSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWNjZXB0IHRhcmdldCBPUyAidm1zIi4KLQotCSogc3ltYm9scy5jOiAgTWVyZ2VkIEFOU0kgYW5kIG5vbi1BTlNJIGZ1bmN0aW9uIGRlY2xzLCB1c2luZwotCVBBUkFNUyBtYWNyby4KLQotCSogeG1hbGxvYy5jOiBKdXN0IGluY2x1ZGUgYXMuaCwgZG9uJ3QgYm90aGVyIHRyeWluZyB0byBmaWd1cmUgb3V0Ci0Jb3RoZXIgaGVhZGVyIGZpbGVzLgotCi0JKiBzdHJzdHIuYywgc3RyZXJyb3IuYzogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluOiBEZWxldGVkIHJlZmVyZW5jZXMuCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBEb24ndCBpbmNsdWRlIGhlYWRlciBmaWxlIGZvciBzdHJpbmcKLQlkZWNsYXJhdGlvbnM7IGxlYXZlIHRoYXQgdG8gaG8tKi5oLgotCi1GcmkgTm92IDI3IDA0OjExOjM2IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybiBhdCBjYW1icmlkZ2UtbGFwdG9wLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9jb2ZmX2dudS5oIFtUQ19JODYwXTogR3Vlc3NlcyBmb3IgcmVsb2MgdHlwZSB2YWx1ZXMsCi0JaW1wb3J0ZWQgZnJvbSBGU0Ygc291cmNlcy4KLQotCSogbWVzc2FnZXMuYyAoc3RyZXJyb3IpOiBEZWNsYXJlIHVuY29uZGl0aW9uYWxseS4KLQotCSogYXMuaDogRGVsZXRlIGFsbG9jYSBhbmQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAobWFzayk6IE5vdyBjb25zdC4KLQotCSogb2JzdGFjay5jLCBvYnN0YWNrLmg6IERlbGV0ZWQuCi0KLQkqIGFzLmggKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KTogTmV3IGZsYWcuCi0JKiBhcy5jIChtYWluKTogU2V0IGl0IGZvciAtUi4KLQotCSogYXMuaCAoZmxhZ19zdXBwcmVzc193YXJuaW5ncyk6IE5ldyBmbGFnLgotCSogYXMuYyAobWFpbik6IFNldCBpdCBmb3IgLVcuCi0JKiBtZXNzYWdlcy5jIChhc193YXJuKTogQ2hlY2sgaXQgaW5zdGVhZCBvZiBmbGFnc2VlblsnVyddLgotCi0JKiBhcy5oIChmbGFnX2Fsd2F5c19nZW5lcmF0ZV9vdXRwdXQpOiBOZXcgZmxhZy4KLQkqIGFzLmMgKG1haW4pOiBTZXQgaXQgZm9yIC1aLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaDogRGVmaW5lIE5FRURfRlhfUl9UWVBFLgotCSogY29uZmlnL3RjLWEyOWsuaDogRGl0dG8uCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogRG9uJ3QgY29uZGl0aW9uYWxpemUgZnhfcl90eXBlIGZpZWxkIG9uIFRDCi0JbWFjcm9zLgotCi0JKiBhcy5oOiBNZXJnZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbHMsIHVzaW5nIFBBUkFNUwotCW1hY3JvLgotCSogYmlnbnVtLmgsIGV4cHIuaCwgZmxvbnVtLmgsIGZyYWdzLmgsIGlucHV0LWZpbGUuaCwgbGlzdGluZy5oLAotCW9iai5oLCBvdXRwdXQtZmlsZS5oLCByZWFkLmgsIHN0cnVjLXN5bWJvbC5oLCBzeW1ib2xzLmgsIHRjLmgsCi0Jd3JpdGUuaDogTGlrZXdpc2UuCi0JKiByZWFkLmM6IExpa2V3aXNlLgotCi0JKiB4bWFsbG9jLmM6IENvbmRpdGlvbmFsaXplIG9uIEhBVkVfTUFMTE9DX0gsIG5vdCBVU0cuICBGb2xkIGluCi0JeHJlYWxsb2MgZnJvbSB4cmVhbGxvYy5jLgotCSogeHJlYWxsb2MuYzogRGVsZXRlZC4KLQkqIE1ha2VmaWxlLmluIChSRUFMX1NPVVJDRVMsIE9CSlMpOiBBZGp1c3RlZC4KLQotCSogY29uZmlndXJlLmluOiBGb3IgaG9zdCBDUFUgYTI5aywgcnM2MDAwLCB2YXgsIGNvbnNpZGVyIHVzaW5nIGJzZAotCW9yIHZtcyBoby0gZmlsZXMuCi0KLQkqIGNvbmZpZy9oby1zeXN2LmggKHNldGJ1ZmZlciwgSE9fVVNHKTogRGVsZXRlZC4KLQotCSogY29uZmlnL2F0b2YtaWVlZS5jIChhdG9mX2llZWUpOiBFeHBvbmVudCBmaWVsZCBpc24ndCBhIHBvaW50ZXI7Ci0JZG9uJ3QgaW5pdGlhbGl6ZSBpdCB3aXRoIE5VTEwuCi0KLQkqIGNvbmZpZy9oby12YXguaCAoTV9WQVgpOiBEZWxldGVkOyB3YXMgdW51c2VkLgotCi0JKiBSRUFETUUtdm1zLCBjb25maWcvaG8tdm1zLmgsIGNvbmZpZy9vYmotdm1zLmMsIGNvbmZpZy9vYmotdm1zLmg6Ci0JTmV3IGZpbGVzIGltcG9ydGVkIGZyb20gRlNGIHZlcnNpb24sIGNvbnRyaWJ1dGVkIGJ5IEVyaWMgWW91bmdkYWxlLgotCSogUkVBRE1FLXZtcy1kYmcsIGNvbmZpZy92bXM6IERlbGV0ZWQuCi0KLQkqIENoYW5nZUxvZywgY29uZmlnL0NoYW5nZUxvZzogTWVyZ2VkLgotCi0JKiBjb25maWcvKnRhaG9lKiwgY29uZmlndXJlLmluOiBUYWhvZSBzdXBwb3J0IGJyb3VnaHQgaW4gZnJvbSBGU0YKLQl2ZXJzaW9uLgotCi0JKiBpbnB1dC1maWxlLmMgKGlucHV0X2ZpbGVfb3Blbik6IEVsaW1pbmF0ZSBjYWxsIHRvIHNldHZidWYuCi0JW1VTR10gKHNldGJ1ZmZlcik6IERlbGV0ZWQgbWFjcm8uCi0KLU1vbiBOb3YgMjMgMTE6MDA6MTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFsbCBmaWxlczogV2hpdGVzcGFjZSBjaGFuZ2VzIGZvciBHTlUgaW5kZW50YXRpb24gc3R5bGUsIGRvbmUgYnkKLQlHTlUgYGluZGVudCcuICBTb21lIGNsZWFudXAgc3RpbGwgbmVlZGVkLCBlc3BlY2lhbGx5IG9mIGNvbW1lbnRzLgotCi0JKiBjb25maWd1cmUuaW46IE5vIHRlLTM4NmJzZC5oIGZpbGUgZXhpc3RzOyBkb24ndCB0cnkgdG8gdXNlIGl0LgotCi0JKiBvYmotY29mZi5jIChvYmpfY29mZl9lbmRlZik6IFVzZSBhc193YXJuLCBub3QgZnByaW50Zi4KLQotCSogdGMtbTY4ay5jIChtZF9hc3NlbWJsZSk6IERvbid0IGNvbXBsYWluIGFib3V0IDY4MDAwIHdpdGggNjg4ODE7Ci0JY291bGQgYmUgZG9pbmcgZW11bGF0aW9uLgotCi1UaHUgTm92IDE5IDExOjQ3OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JejgwMDAgZG9jdW1lbnRhdGlvbgotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvYWxsLm00LCBkb2MvYXMtYWxsLnRleGluZm8sIGRvYy9hcy50ZXhpbmZvOgotCWFsbCBtb2RpZmllZC4KLQotVHVlIE5vdiAxMCAwOTo0OToyNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5vLCBvYmotZm9ybWF0Lm8pOiBhZGRlZCBkZXBlbmRlbmN5IG9uIHN1YnNlZ3MuaC4KLQotCSogc3Vic2Vncy5oOiBhZGQgZXh0ZXJuIHRvIHNlZ21lbnRfaW5mbyBkZWNsYXJhdGlvbi4KLQotCSogcmVhZC5oOiBhZGRlZCBleHRlcm4gZGVjbGFyYXRpb25zIGZvciBjb21tZW50X2NoYXJzLAotCWxpbmVfY29tbWVudF9jaGFycywgYW5kIGxpbmVfc2VwYXJhdG9yX2NoYXJzLgotCXJlYWQuYywgYXBwLmM6IHJlbW92ZWQgZGVmaW5pdGlvbnMgb2YgY29tbWVudF9jaGFycywKLQlsaW5lX2NvbW1lbnRfY2hhcnMsIGFuZCBsaW5lX3NlcGFyYXRvcl9jaGFycy4KLQotCSogdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IElmIFJFR0lTVEVSX1BSRUZJWCBpc24ndCBkZWZpbmVkLAotCXN0aWxsIGFjY2VwdCAoYnV0IGRvbid0IHJlcXVpcmUpIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCBiZWZvcmUKLQl0aGUgcmVnaXN0ZXIgbmFtZS4KLQkoaW5zZXJ0X3JlZyk6IHB1dCBSRUdJU1RFUl9QUkVGSVggYmVmb3JlIHJlZ2lzdGVyIG5hbWVzIGJlZm9yZQotCXB1dHRpbmcgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlLgotCSogdGMtbTY4ay5oIChPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgpOiBEZWZpbmUgdG8gYmUgIiUiLCBpZiBub3QKLQlNNjhLQ09GRi4KLQotCSogb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogc2V0IFNUWVBfTk9MT0FEIGJpdCBmb3IgLmJzcwotCXNlY3Rpb24uCi0KLQkqIGF0b2YtaWVlZS5jLCBhdG9mLW5zMzJrLmMsIHRjLSouYzogbWFkZSBFWFBfQ0hBUlMsIEZMVF9DSEFSUywKLQljb21tZW50X2NoYXJzLCBsaW5lX2NvbW1lbnRfY2hhcnMgYW5kIGxpbmVfc2VwZXJhdG9yX2NoYXJzCi0JY29uc2lzdGVudGx5IGNvbnN0LCBhbmQgYWx3YXlzIGluaXRpYWxpemVkIHRoZW0uICBJbmNsdWRlZCByZWFkLmguCi0KLVRodSBOb3YgIDUgMTc6NTU6NDEgMTk5MiAgSmltIFdpbHNvbiAgKHdpbHNvbkBzcGhhZ251bS5jeWdudXMuY29tKQotCi0JKiB0Yy1zcGFyYy5jIChzcGFyY19pcCk6IEFkZCBjb2RlIHRvIGZsYWcgZXJyb3IgaWYgYW4gYWJzb2x1dGUKLQljb25zdGFudCB3aWxsIG5vdCBmaXQgaW4gYW4gaW1tZWRpYXRlIGZpZWxkLgotCShtZF9hcHBseV9maXgsIFJFTE9DX0JBU0UxMyBjYXNlKTogQ2hlY2sgZm9yIHJlbG9jYXRpb24gb3ZlcmZsb3cuCi0KLVdlZCBOb3YgIDQgMDc6NTA6NDYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmLmMgKGNhbGxqX3RhYmxlKTogRGVsZXRlIGdsb2JhbCB2YXJpYWJsZS4KLQkob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBEZWZpbmUgaXQgbG9jYWxseSBoZXJlLCBhbmQgb25seSBpZgotCVRDX0k5NjAgaXMgZGVmaW5lZC4KLQotCSogdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IFVuZGVyc2NvcmUgaXMgcGFydCBvZiBhIHN5bWJvbCBuYW1lLgotCShtNjhrX2lwKTogRG9uJ3Qgd2FybiBhYm91dCBiaWdudW0gdXNlZCBhcyBmbG9hdCBiaXQtcGF0dGVybi4KLQotCSogb2JqLWNvZmYuYzogUmVwbGFjZWQgQU5TSSBhbmQgbm9uLUFOU0kgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0Jd2l0aCBhIHNpbmdsZSBzZXQgdXNpbmcgUEFSQU1TIG1hY3JvLgotCi0JKiB0Yy1pOTYwLmMgKHRjX2JvdXRfZml4X3RvX2NoYXJzKTogQml0LWZpZWxkIGZpeHVwcyB3YW50IGEgbGVuZ3RoCi0Jb2YgMi4KLQotCSogdGMtaTk2MC5jOiBNaXNzZWQgYSBjb3VwbGUgb2YgMC0+Tk9fUkVMT0MgY29udmVyc2lvbnMuCi0KLQkqIHRjLWk5NjAuaCAoTl9CQUxOQU1FLCBOX0NBTExOQU1FKTogRGVmaW5lIGFzIGNoYXItdHlwZSB2YWx1ZXMsCi0Jc28gd2lkZW5pbmcgd29ya3MgY29uc2lzdGVudGx5LgotCi1XZWQgT2N0IDI4IDA4OjUyOjM0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiB2ZXJzaW9uLmM6IFB1dCBjb25kaXRpb25hbCAiY29uc3QiIGJlZm9yZSB2ZXJzaW9uX3N0cmluZywgbm90Ci0JYmVmb3JlIGR1bW15IGZ1bmN0aW9uIGZvciBWTVMuICBOb3cgdmVyc2lvbiAxLjkxLjAzLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfbmV4dF9jaGFyKTogTmVlZCBkb3VibGUtXCBiZWZvcmUgYDAwMCcgdG8gc2hvdwotCXByaW50ZWQgcmVwIG9mIG51bGwgY2hhcmFjdGVyLgotCi1GcmkgT2N0IDIzIDE0OjQwOjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBjaGVjayByZXR1cm4gdmFsdWUgb2YKLQliZmRfY2xvc2VfYWxsX2RvbmUuCi0KLVR1ZSBPY3QgMjAgMTI6MTg6MDggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBTdXBwb3J0IGZvciBpMzg2LXN5c3YuCi0Jb2JqLWNvZmZiZmQuYyAoZG9fcmVsb2NzX2Zvciwgd3JpdGVfb2JqZWN0X2ZpbGUpOiBzZXQgc2VnbWVudAotCWFkZHJlc3NlcyB0byByZWFzb25hYmxlIHNpemVzLiAgTmV3IGRlZmluZSBaRVJPX0JBU0VEX1NFR01FTlRTIGNhbgotCWJlIHVzZWQgdG8gc2V0IHRoZW0gYWxsIHRvIHplcm8gYXMgd2FzIGRvbmUgYmVmb3JlLgotCShmaWxsX3NlY3Rpb24pOiBzZWdtZW50IGFkZHJlc3NlcyBub3cgc2V0IGluIHdyaXRlX29iamVjdF9maWxlLgotCShmaWxsX3NlY3Rpb24pOiBEb24ndCBzZXQgU1RZUF9OT0xPQUQgZm9yIC5ic3Mgc2VjdGlvbi4KLQkoZml4dXBfc2VnbWVudCk6IDM4NiB1c2VzIHN0cmFuZ2UgY29tbW9uIHN5bWJvbCBmb3JtYXQuCi0JdGMtaTM4Ni5jICh0Y19jb2ZmX2ZpeDJydHlwZSk6IHVzZSBSX0RJUjMyLCBub3QgUl9SRUxMT05HLCBmb3IKLQljb21wYXRpYmlsaXR5IHdpdGggU1ZSMy4yIGxpbmtlci4KLQkqIGNvbmZpZ3VyZS5pbjogaTM4Ni1zeXN2IGFuZCBpMzg2LXNjbyB1c2UgY29mZmJmZC4KLQotCSogYXBwLmMgKGRvX3NjcnViX25leHRfY2hhcik6IGRpc2NhcmQgd2hpdGVzcGFjZSBhZnRlciBhIGxhYmVsLgotCi1TYXQgT2N0IDEwIDEyOjMzOjQ1IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gU3VuT1MgNCBhbmQgU29sYXJpczIgZm9yIFN1bjQKLQlob3N0cywgdXNlIHRoZSBzeXN2IGNvbmZpZ3VyYXRpb24gZm9yIHNvbGFyaXMyCi0KLU1vbiBPY3QgIDUgMDk6Mjg6NTcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkgZml4IGk5NjArbm9uLWJmZCBjb2ZmIGJpdCByb3QuCi0JKiBvYmotY29mZi5jIChjX2RvdF9maWxlX3N5bWJvbCwgb2JqX2NvZmZfbG4sIG9ial9jb2ZmX2xpbmUpOgotCXN1cHBvcnQgZm9yIEMgc291cmNlIGxpc3RpbmdzLiAob2JqX2NvZmZfZW5kZWYpOiBsb29rIGluIHRoZSByaWdodAotCXBhcnQgb2YgdGhlIHN5bWJvbCBmb3IgdGhlIHN5bWJvbCBuYW1lCi0KLQkqIHRjLW02OGsuYyAoZ2V0X251bSk6IG1ha2UgaXQgd29yayBmb3IgYWxsIHNlZ21lbnRzLCBub3QganVzdCB0aGUKLQlmaXJzdCB0aHJlZS4KLQotTW9uIE9jdCAgNSAwMzozMDozNiAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCB0d2VlZGxlZHVtYmVyLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIGkzODYtKi1ic2QgZW11bGF0aW9uLgotCi1UaHUgT2N0ICAxIDIzOjA1OjEyIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgdGhlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGZvciBob3N0IGFuZCB0YXJnZXQKLQotVHVlIFNlcCAyOSAxMjoyMjo1MiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBkb24ndCBmaXh1cCBmb3IgdGhlIHo4awotCSogdGMtejhrLmM6IGxvdHMgb2YgYnVnIGZpeGVzCi0KLVR1ZSBTZXAgMjkgMTA6NTE6NTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiB0Yy1pOTYwLmgsIHRjLWk5NjAuYzogYXZvaWQgdGhlIEFOU0kgcHJlcHJvY2Vzc29yIGFkZGl0aW9uCi0JI2VsaWYsIHNpbmNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgb2xkIGNvbXBpbGVycy4KLQloby1yczYwMDAuaCwgdGMtbTY4ay5jOiB0aGUgbmF0aXZlIFJTLzYwMDAgY29tcGlsZXIgbWlzY29tcGlsZXMgYQotCWNvdXBsZSBvZiBleHByZXNzaW9ucyBpbiB0Yy1tNjhrLmMuCi0KLU1vbiBTZXAgMjggMjE6MTg6MjQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiByZWFkLmMgKGNvbnMpOiBJZiBOT19SRUxPQyBpcyBkZWZpbmVkLCB1c2UgaXQuCi0KLQkqIHRjLWk5NjAuYyAoZ2V0X2NkaXNwKTogVXNlIE5PX1JFTE9DLCBub3QgMCwgaW4gY2FsbCB0byBmaXhfbmV3LgotCi1GcmkgU2VwIDI1IDE4OjE4OjUyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5oOiBpZiBNNjhLQ09GRiwgZGVmaW5lIERPVF9MQUJFTF9QUkVGSVggKHRvIHJlcXVpcmUKLQlsb2NhbCBsYWJlbHMgdG8gc3RhcnQgd2l0aCBhIC4pIGFuZCBzZXQgUkVHSVNURVJfUFJFRklYIHRvICUuCi0JdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IGFjY2VwdCBSRUdJU1RFUl9QUkVGSVggaWYgZGVmaW5lZC4KLQotRnJpIFNlcCAyNSAxNzo1Mzo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYzogIENvbW1lbnQgY2hhbmdlcy4KLQotRnJpIFNlcCAyNSAxNDoxMjo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3lyaWF0aC5jeWdudXMuY29tKQotCi0JKiBhcy5oOiBUZXN0IGlmIF9fU1REQ19fIGlzIGRlZmluZWQgb25seSwgZG9uJ3QgdGVzdCBpdHMgdmFsdWUuCi0JKiBtZXNzYWdlcy5jOiBJZiBfX1NURENfXyBpcyBub3QgZGVmaW5lZCwgZGVmaW5lIE5PX1NUREFSRy4KLQotVGh1IFNlcCAyNCAxMjo0MjozMiAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBydGwuY3lnbnVzLmNvbSkKLQotCSogbGlzdGluZy5jIChkZWJ1Z2dpbmdfcHNldWRvKTogQWRkIHN0YWJzIGFuZCBzdGFibiBhcyB0aGluZ3MgdG8KLQlpZ25vcmUuCi0KLVR1ZSBTZXAgMjIgMTM6MDI6MDcgMTk5MiAgU2VhbiBFcmljIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmMgKGRvX3JlbG9jc19mb3IsZmlsbF9zZWN0aW9uKTogbm93IGFsbG9jYXRlIGFsbAotCXNlY3Rpb25zIHN0YXJ0aW5nIGZyb20gemVybywgcmF0aGVyIHRoYW4gbWFraW5nIHRoZW0gY29uc2VjdXRpdmUuCi0JVGhpcyBtYWtlcyBzdWJzZXF1ZW50IHJlbG9jIGNhbGN1bGF0aW9ucyBlYXNpZXIsIGVzcCBpZiB0aGUgb2JqZWN0Ci0JZm9ybWF0IGRvZXNuJ3QgdW5kZXJzdGFuZCBhZGRlbmRzLiAob2JqX2NvZmZfbGNvbW0pOiAobWF5YmUgdGVtcG9yYXJpbHkpCi0JYWxsb2NhdGUgbGNvbW0gaW4gLmRhdGEgcmF0aGVyIHRoYW4gaW4gLmJzcy4gIEl0IHNlZW1zIHRoYXQgc29tZQotCXRvb2xzIGNhbid0IGNvcGUgd2l0aCBhIG5vbi16ZXJvIHNpemVkIGJzcyBiZWZvcmUgbGlua2FnZS4KLQotVHVlIFNlcCAyMiAxNToxMDo1MSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYzogUmVwbGFjZSAiZW51bSBtNjhrX2FyY2hpdGVjdHVyZSIgd2l0aCAiaW50IgotCXRocm91Z2hvdXQuICBUaGF0IGVudW0gbm8gbG9uZ2VyIG1lYW5zIHdoYXQgd2UgdGhvdWdodCBpdCBtZWFudC4KLQotCSogdGMtbTY4ay5jIChtZF9hc3NlbWJsZSwgbWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldwotCSItbW5vLTY4OFs1OF0xIiBvcHRpb25zLgotCi0JKiB0Yy1tNjhrLmM6IEFkZGVkIENQVTMyIHN1cHBvcnQuCi0KLUZyaSBTZXAgMTggMDg6MDI6MTggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHRjLW02OGsuYyAobTY4a19pcCk6IEFuKGRpc3ApIGlzIG5vdCBwYyByZWxhdGl2ZS4KLQotVHVlIFNlcCAxNSAxNzoyNTowNSAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChhcy5uZXcpOiBSZW1vdmUgZGVwZW5kZW5jZSBvbiBMT0NBTF9MT0FETElCRVMuCi0JQ2hhbmdlIExJQkRFUFMgZGVwZW5kZW5jZSB0byBMSUJTLgotCi1UdWUgU2VwIDE1IDE1OjMyOjAyIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBpZiAkKHRvb2xkaXIpIGV4aXN0cywgaW5zdGFsbCBhcyBpbgotCSQodG9vbGRpcikvYmluLgotCi1TdW4gU2VwIDEzIDIwOjMwOjEwIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQWRkZWQgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRCBkZWZpbmUgdG8gZ2l2ZSBhbiBlcnJvciBpZiBhbnkKLQkud29yZCBpcyA8IC0zMjc2OCBvciA+IDMyNzY3LiAgVGhlIC1KIGZsYWcgY2F1c2VzIHRoZSBlcnJvciB0byBiZQotCWlnbm9yZWQuICBUaGlzIGlzIHRvIGNhdGNoIG92ZXItc2l6ZWQgc3dpdGNoZXMgZ2VuZXJhdGVkIGJ5IGdjYyBvbgotCXN5c3RlbXMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgYnJva2VuIC53b3JkIGhhY2suCi0JYXMuYyAobWFpbik6IHBlcm1pdCAtSiBpZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JELgotCXdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBjaGVjayBmb3Igc2lnbmVkIC53b3JkIG92ZXJmbG93IGlmCi0JV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IGZpeGVkIG1pc3NpbmcgcGFyZW5zIGluIGV4cHJlc3Npb24KLQljaGVja2luZyBmb3IgYnl0ZSBvciB3b3JkIG92ZXJmbG93LgotCi0JKiBvYmotY29mZmJmZC5oOiBkZWZpbmUgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRC4KLQlvYmotY29mZmJmZC5jIChmaXh1cF9zZWdtZW50KTogY2hlY2sgZm9yIHNpZ25lZCAud29yZCBvdmVyZmxvdyBpZgotCVdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQuCi0KLQkqIG9iai1jb2ZmYmZkLmMgKGZpeHVwX3NlZ21lbnQpOiBmaXhlZCBtaXNzaW5nIHBhcmVucyBpbgotCWV4cHJlc3Npb24gY2hlY2tpbmcgZm9yIGJ5dGUgb3Igd29yZCBvdmVyZmxvdy4KLQotRnJpIFNlcCAxMSAxMDoyMTowNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCVN1cHBvcnQgZm9yIGkzODYgY29mZgotCSogb2JqLWNvZmZiZmQuaCA6IGFkZGVkIHN0dWZmCi0JKiB0Yy1pMzg2LmMgKHRjX2NvZmZfZml4MnJ0eXBlKTogbmV3IGZ1bmN0aW9uCi0JKiB0Yy1pMzg2LmggOiBuZXcgY29mZiBkZWZpbmVzCi0KLVRodSBTZXAgMTAgMDk6MjM6MTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wdXNoKTogY2FsbCBpbnB1dF9maWxlX2JlZ2luLCBub3QKLQlpbnB1dF9zY3J1Yl9iZWdpbi4KLQltZXNzYWdlcy5jIChhc19wZXJyb3IpOiBwcmludCAiOiAiIGJldHdlZW4gdGhlIHBhc3NlZCBpbiBlcnJvciBhbmQKLQl0aGUgc3RyZXJyb3IsIGxpa2UgcGVycm9yIGRvZXMuCi0KLVdlZCBTZXAgIDkgMTE6MDY6MjUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogdXNlIGdhc190YXJnZXQgaW5zdGVhZCBvZiBtb2RpZnlpbmcgdGFyZ2V0X2NwdS4KLQlGcm9tIFN0ZXZlIENoYW1iZXJsYWluOgotCU1ha2VmaWxlLmluOiBIYW5kbGUgbTY4Ki0qLWNvZmYqLgotCXJlYWQuYywgcmVhZC5oOiBhZGQgbXVsdCBhcmd1bWVudCB0byBzX3NwYWNlCi0KLQkqIHRjLW02OGsuYyAobTY4a19pcCwgbTY4a19pcF9vcCwgZ2V0X251bSwgdHJ5X21vdG9faW5kZXgpOiBtZXJnZQotCSBNb3Rvcm9sYSBhbmQgTUlUIHN5bnRheDsgZ2FzIGNhbiBub3cgYXNzZW1ibGUgZWl0aGVyIHR5cGUgb2YKLQkgZmlsZS4KLQl0Yy1tNjhrbW90ZS5jLCB0Yy1tNjhrbW90ZS5oOiByZW1vdmVkIG5vdyBzdXBlcmZsdW91cyBmaWxlcy4KLQlGcm9tIFN0ZXZlIENoYW1iZXJsYWluOgotCW02OGtjb2ZmLm10OiBmb3IgbTY4ayBDT0ZGLgotCW9iai1jb2ZmYmZkLmM6IChmaXh1cF9tZGVwcykgYWRkZWQKLQkgKHNpemVfc2VjdGlvbikgcmVtb3ZlZCBiYWQgc2FuaXR5IGNoZWNrCi0JIChmaWxsX3NlY3Rpb24pIGFkZGVkIHJzX21hY2hpbmVfZGVwZW5kZW50IGNhc2UKLQkgKHdyaXRlX29iamVjdF9maWxlKSBjYWxsIGZpeHVwX21kZXBzCi0JIChmaXh1cF9zZWdtZW50KSBzZXQgZnhfc3Vic3kgdG8gMC4KLQlvYmotY29mZmJmZC5oOiBkZWZpbmUgV09SS0lOR19ET1RfV09SRCAodG9vIGhhcmQgdG8gc3VwcG9ydCkgYW5kCi0JIGhhbmRsZSBtNjhrLgotCXRjLW02OGsuYywgY29uZmlnL3RjLW02OGsuaDogYWRkZWQgbTY4ayBDT0ZGIHN1cHBvcnQgYW5kIE1vdG9yYWxhCi0JIHBzZXVkbyBvcHMuCi0KLVR1ZSBTZXAgIDggMTc6MTA6NTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTElCUyk6IEluY2x1ZGUgb3Bjb2RlIGxpYnJhcnkuCi0KLUZyaSBTZXAgIDQgMTg6MjA6NTYgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGdldF9udW0sIGNhc2UgU0VHX0JJRyk6IElmIG9ubHkgc21hbGwgaW50ZWdlcnMKLQlpbmNsdWRpbmcgemVybyBhcmUgYWNjZXB0ZWQsIHBhc3MgKzAuMC4KLQotU3VuIEF1ZyAzMCAyMToyNDo0NiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBtYXAgImFzIiB0aHJvdWdoIHByb2dyYW1fdHJhbnNmb3JtX25hbWUgd2hlbgotCWluc3RhbGxpbmcuCi0KLQkqIGRvYy9NYWtlZmlsZS5pbjogbWFwICJhcyIgdGhyb3VnaCBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIHdoZW4KLQlpbnN0YWxsaW5nLgotCi1TYXQgQXVnIDI5IDEyOjExOjEyIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGFzLm5ldyk6IERlcGVuZCBvbiBMT0NBTF9MT0FETElCRVMuCi0KLUZyaSBBdWcgMjggMTY6MjU6MjIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBvYmotYm91dC5oLCBvYmotYm91dC5jIChvYmpfaGVhZGVyX2FwcGVuZCwgb2JqX3N5bWJvbF90b19jaGFycyksCi0JdGMtaTk2MC5jIChtZF9yaV90b19jaGFycyk6IEFsd2F5cyBvdXRwdXQgYm91dCBvYmplY3QgZmlsZSBpbgotCWxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciAodXNlZCB0byB1c2UgZW5kaWFubmVzcyBvZiBob3N0KS4KLQotVHVlIEF1ZyAyNSAxNTo1MDo0OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGluaXRfdGFibGUpOiBOb3cgY29uc3QuICBBbHdheXMgaW5jbHVkZSA2ODg1MQotCWRhdGEsIHNvIHRoYXQgImJjIiBpcyBhdmFpbGFibGUgdG8gNjgwNDAgY2FjaGUgaW5zdHJ1Y3Rpb25zLgotCUFkZGVkICJ0dDAiLCAidHQxIiwgYW5kIDY4ZWMwMzAgdmFyaWFudHMuCi0JKG1kX2Fzc2VtYmxlKTogQ29tcGxhaW4gaWYgNjgwMDAgKG9ubHkpIGFuZCA2ODg4MSBhcmUgc3BlY2lmaWVkLgotCShlbnVtIF9yZWdpc3Rlcik6IEFkZGVkIFRUMCwgVFQxLgotCShtNjhrX2lwLCBjYXNlcyAnMycgYW5kICd0Jyk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlIGNvZGVzLiAgUGFzcwotCWxpbmUgbnVtYmVyIGNvcnJlY3RseSBpbiAiaW50ZXJuYWwgZXJyb3IiIG1lc3NhZ2VzLiAgRG9uJ3QgcHJpbnQKLQlhcmNoaXRlY3R1cmUtbWlzbWF0Y2ggbWVzc2FnZSBmb3Igb3BlcmFuZCBlcnJvcnMuCi0KLQlGcm9tIENvbGluIFNtaXRoIChjb2xpbkB3cnMuY29tKToKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXAsIGNhc2UgJ18nKTogVXNlIGFkZHdvcmQgdHdpY2UgcmF0aGVyCi0JdGhhbiBpbnN0YWxsX29wZXJhbmQuCi0KLVR1ZSBBdWcgMjUgMTU6MTM6NDggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxpc3RpbmcuYyAoYnVmZmVyX2xpbmUpOiByZXdpbmQgdG8gdGhlIHN0YXJ0IG9mIGluY2x1ZGUKLQlmaWxlcywgdGhleSBtaWdodCBiZSBpbmNsdWRlZCB0d2ljZS4KLQotCSogejhrLmMsIHo4ay5oLCB6OGsubXQ6IHo4MDAwIHN1cHBvcnQgc3R1ZmYKLQotTW9uIEF1ZyAyNCAxMjo0NTo0MyAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmVkIFRBUkdFVF9DUFUgZm9yIEMgY29kZSBzbyB0aGF0IGl0IGNhbiBjaG9vc2UKLQlvbmUgZWxlbWVudCBvZiBhIGZhbWlseS4KLQotCSogdGMtbTY4ay5jOiB1c2UgVEFSR0VUX0NQVSB0byBjaG9vc2UgZGVmYXVsdCBjcHUgdHlwZS4KLQotCSogdGUtZ2VuZXJpYy5oOiBkZWZhdWx0IHRvIExPQ0FMX0xBQkVMU19ET0xMQVIgYW5kIExPQ0FMX0xBQkVMU19GQgotCXNvIHRoYXQgd2UgY2FuIGFzc2VtYmxlIGhhbmQtd3JpdHRlbiBsaWJnY2MgY29kZS4KLQotRnJpIEF1ZyAyMSAxNDozODo0NCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1lc3NhZ2VzLmMgKGFzX3dhcm4pOiBVc2UgZnB1dHMsIG5vdCBmcHJpbnRmLCB3aXRoIGEgYnVmZmVyIHRoYXQKLQloYXMgYWxyZWFkeSBiZWVuIGZvcm1hdHRlZCAoYnV0IG1heSBzdGlsbCBjb250YWluICUtY2hhcmFjdGVycykuCi0JKGFzX2JhZCk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDE5IDExOjIwOjU5IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jLCB0Yy1tNjhrbW90ZS5jOiB0aGUgY2FzMiBpbnN0cnVjdGlvbiBpcyBzdXBwb3NlZCB0byBiZQotCXdyaXR0ZW4gd2l0aCBpbmRpcmVjdGlvbiBvbiB0aGUgbGFzdCB0d28gb3BlcmFuZHMsIHdoaWNoIGNhbiBiZQotCWVpdGhlciBkYXRhIG9yIGFkZHJlc3MgcmVnaXN0ZXJzLiAgQWRkZWQgYSBuZXcgb3BlcmFuZCB0eXBlICdyJwotCXdoaWNoIGFjY2VwdHMgZWl0aGVyIHJlZ2lzdGVyIHR5cGUuICBBZGRlZCAnKCcgdG8gbm90ZW5kIHN0dWZmIGluCi0JdGMtbTY4a21vdGUuYyB0byBhY2NlcHQgKGEwKTooYTIpIGluIGNhczIgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBBdWcgMTkgMDk6MjU6MDkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGFzLmggKGVudW0gX3JlbGF4X3N0YXRlKTogU3RhcnQgb2ZmIGF0IG9uZSwgbm90IHplcm8sIHRvIGJldHRlcgotCWNhdGNoIHVuaW5pdGlhbGl6ZWQtdmFyaWFibGUgZXJyb3JzLgotCShsaW5rcmVsYXgpOiBEZWNsYXJlIG5ldyB2YXJpYWJsZS4KLQotCSogbWVzc2FnZXMuYyAod2FybmluZ19jb3VudCwgZXJyb3JfY291bnQpOiBEZWZhdWx0IGluaXRpYWxpemVyIGlzCi0Jc3VmZmljaWVudC4KLQotCSogd3JpdGUuYzogTWVyZ2VkIHNvbWUgZGVjbGFyYXRpb25zLCB1c2luZyBQQVJNUyBtYWNyby4KLQkodGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290LCBic3NfZnJhZ19yb290LCB0ZXh0X2xhc3RfZnJhZywKLQlkYXRhX2xhc3RfZnJhZyk6IE5vIGxvbmdlciBzdGF0aWMuCi0JKHdyaXRlX29iamVjdF9maWxlLCBjYXNlIHJzX2FsaWduIG9yIHJzX29yZyk6IElmIEhBTkRMRV9BTElHTiBpcwotCWRlZmluZWQsIGNhbGwgaXQuICBDaGFuZ2Ugc2VnbWVudHMgYmVmb3JlIGNhbGxpbmcgZml4dXBfc2VnbWVudC4KLQkocmVsYXhfYWxpZ24pOiBJZiBsaW5rcmVsYXgsIHByb3ZpZGUgZXh0cmEgcGFkZGluZy4KLQotCSogb2JqLWJvdXQuYyAob2JqX2VtaXRfcmVsb2NhdGlvbnMpOiBFbWl0IGFsaWdubWVudCByZWxvY3MgZGVzcGl0ZQotCXRoZWlyIG5vdCBoYXZpbmcgc3ltYm9scyBhc3NvY2lhdGVkLgotCi0JKiB0Yy1pOTYwLmMgKG5vcmVsYXgsIGluc3RydW1lbnRfYnJhbmNoZXMpOiBEZWZhdWx0IGluaXRpYWxpemVyIGlzCi0Jc3VmZmljaWVudC4KLQkobGlua3JlbGF4KTogRGVsZXRlIHZhcmlhYmxlIGRlZmluaXRpb24uCi0JKG1lbV9mbXQpOiBDYWxsIGZpeF9uZXcgd2l0aCBOT19SRUxPQy4KLQkodGNfYm91dF9maXhfdG9fY2hhcnMpOiBIYW5kbGUgYWxpZ25tZW50IHJlbG9jcy4KLQkoaTk2MF9oYW5kbGVfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKiB0Yy1pOTYwLmggKGxpbmtyZWxheCk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkoSEFORExFX0FMSUdOKTogTmV3IG1hY3JvOyBjYWxscyBpOTYwX2hhbmRsZV9hbGlnbi4KLQkoTkVFRF9GWF9SX1RZUEUsIE5PX1JFTE9DKTogTmV3IG1hY3Jvcy4KLQotVHVlIEF1ZyAxOCAxNDo1OToyMSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NwYXJjLm10OiBOZXcgZmlsZS4gIEdyYWIgc3BhcmMgb3Bjb2RlIHRhYmxlIGZyb20gYmZkCi0JbGlicmFyeS4KLQotVHVlIEF1ZyAxOCAxNDoxNjozOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4gIFJlbW92ZWQKLQlNSU5VU19HLCBzZXQgQ0ZMQUdTIHRvIGRlZmF1bHQgdG8gLWcsIGFkZGVkIEZMQUdTX1RPX1BBU1MsIHBhc3NlZAotCUZMQUdTX1RPX1BBU1MgdG8gcmVjdXJzaXZlIG1ha2VzLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotCi1Nb24gQXVnIDE3IDE1OjA5OjU2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9wb3AsIGlucHV0X3NjcnViX3B1c2gpOiBtZW1jcHkgd2FzCi0JYmVpbmcgdXNlZCB3aXRoIGFyZ3Mgc3dhcHBlZCwgY2F1c2luZyBvY2Nhc2lvbmFsIGxvc3NhZ2Ugd2hlbgotCXJlZmlsbGluZyBidWZmZXJzIGFmdGVyIGFuIGluY2x1ZGUgZmlsZS4KLQotTW9uIEF1ZyAxNyAxMzoxODo1MSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbWVzc2FnZXMuYyAoYXNfdHNrdHNrKTogVXNlIGNvcnJlY3QgQU5TSSBmb3JtIGZvciBzdGRhcmcKLQl2ZXJzaW9uLiAgRGlzY2FyZCBib2d1cyBET05UREVGIHZlcnNpb24uCi0JKGFzX3dhcm4sIGFzX2JhZCwgYXNfZmF0YWwpOiBMaWtld2lzZS4KLQotRnJpIEF1ZyAxNCAxODozMToxNCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IElmIGluc3RydWN0aW9uIGlzIGludmFsaWQgZm9yIHRoZQotCXNlbGVjdGVkIGFyY2hpdGVjdHVyZSwgcHJpbnQgYSBtZXNzYWdlIHNheWluZyBzbyBhbmQgbGlzdGluZyB3aGF0Ci0JcHJvY2Vzc29ycyBzdXBwb3J0IGl0LCByYXRoZXIgdGhhbiBzYXlpbmcgIm9wZXJhbmRzIG1pc21hdGNoIi4KLQotVGh1IEF1ZyAxMyAxMzo1MzoxOSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogYXMuaCBbQlJPS0VOX0FTU0VSVF06IElmIGRlZmluZWQsIHR1cm4gb2ZmIGFsbCBhc3NlcnRpb24gY2hlY2tzLgotCi0JKiBjb25maWcvaG8tcnM2MDAwLmggKE1fUlM2MDAwKTogRG9uJ3QgZGVmaW5lIGl0LgotCShmcmVlKTogRGVjbGFyZSBpdC4KLQkoQlJPS0VOX0FTU0VSVCk6IERlZmluZSBpdCBpZiBub3QgX19TVERDX18uCi0KLVR1ZSBBdWcgMTEgMTI6NTg6MTQgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLm10OiBOZXcgZmlsZS4KLQotTW9uIEF1ZyAxMCAxNDozNzowOCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jOiAiLmFsaWduIE4iIG1lYW5zIGFsaWduIHRvIE4tYnl0ZSBib3VuZGFyeSAqb25seSoKLQlpZiBUTl9TVU4zOyBvdGhlcndpc2UgYWxpZ24gdG8gMioqTi1ieXRlIGJvdW5hcnkuCi0KLVRodSBBdWcgIDYgMTI6MTA6MzkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAoc19maWxsKTogbWFrZSB0aGUgLmZpbGwgc2l6ZSBjbGFtcGVkIGVycm9yIGEgd2FybiBhbmQKLQlmaXggYnVnIHdoZXJlIDAncyB3ZXJlIGFsd2F5cyBwbGFjZWQuCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBpZiBhIDo4IGlzIHNlZW4gYWZ0ZXIgYW4gb3BlcmFuZCwgZmlsbCB0b3AKLQl0d28gYnl0ZXMgb2YgYW55IGNvbnN0YW50IHdpdGggMHhmZjoKLQotV2VkIEF1ZyAgNSAxMjowMjo0MCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfcHNldWRvX3RhYmxlKTogZml4IHRoZSAuYWxpZ24gdGhpbmcKLQl0aGUgcmlnaHQgd2F5OyBmb3IganVzdCB0aGUgNjhrLiBTdW4gMyAuYWxpZ24gaXMgbmJ5dGVzLCBub3QgcHR3by4KLQotV2VkIEF1ZyAgNSAwMTo1NDozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5jICh0cnlfaW5kZXgpOiAgRXJyb3IgaWYgaW5kZXggc2NhbGluZyBzcGVjaWZpZWQgYW5kCi0JYXNzZW1ibGluZyBmb3IgYW4gb2xkZXIgQ1BVIHRoYW4gYSA2ODAyMC4KLQotU2F0IEF1ZyAgMSAxOToxMDoxMyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHRjX2FvdXRfZml4X3RvX2NoYXJzKTogSWYgcGMtcmVsYXRpdmUsIHRha2UKLQlmeF9vZmZzZXQgaW50byBhY2NvdW50LgotCi1GcmkgSnVsIDMxIDIxOjUzOjI4IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMgaG9zdCk6IEFjY2VwdCAidWx0cml4IiB3aXRoIHZlcnNpb24gbnVtYmVyLgotCi0JKiBleHByLmMgKGZsb2F0aW5nX2NvbnN0YW50KTogU2VwYXJhdGUgIj0tIiB0byBhdm9pZCBjb25mdXNpbmcKLQlhbmNpZW50IG9yIGJyb2tlbiBjb21waWxlcnMuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBNaXNtYXRjaCBlcnJvciBjb3VsZCBhbHNvIGluZGljYXRlCi0JcHJvY2Vzc29yL29wY29kZSBtaXNtYXRjaCwgc28gcmV3b3JkIHRoZSBlcnJvciBtZXNzYWdlLgotCShtZF9hc3NlbWJsZSk6IElmIG5vIENQVSBoYXMgYmVlbiBzZXQgKGV2ZW4gaWYgRlBVL1BNTVUKLQljaGFyYWN0ZXJpc3RpY3MgaGF2ZSBiZWVuKSwgZGVmYXVsdCB0byA2ODAyMC4gIERvbid0IG5lZWQgZXh0cmEKLQlxdW90ZXMgYXJvdW5kIGVycm9yIHN0cmluZy4KLQotRnJpIEp1bCAzMSAxMjoyNjozNCAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFJldmVydCBzYWMncyBpbmNvcnJlY3QgY2hhbmdlIG1hZGUgSnVsIDEzLgotCUFsaWduIHJlYWxseSBpcyBzdXBwb3NlZCB0byBiZSBwdHdvIG5vdCBuYnl0ZXMuCi0KLU1vbiBKdWwgMjAgMDI6NTE6NTkgMTk5MiAgRC4gVi4gSGVua2VsLVdhbGxhY2UgIChndW1ieUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogX0RvXyBpbmNsdWRlIGxpYmliZXJ0eS4gIChmcm9tIHNlZikKLQotRnJpIEp1bCAxNyAxNToxNToyOCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogZXhwci5jIChpbnRlZ2VyX2NvbnN0YW50KTogSGFuZGxlICIwZiIgYW5kICIwYiIgbGFiZWwgcmVmZXJlbmNlcwotCXByb3Blcmx5LgotCi1UaHUgSnVsIDE2IDA4OjIwOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB3cml0ZS5jIChmaXh1cF9zZWdtZW50KTogaWYgcmVsYXhpbmcsIGRvbid0IGRvIGFueXRoaW5nLgotCSogY29uZmlnL29iai1ib3V0LltjaF0gOiBtYWludGFpbiB0aGUgYV9yZWxheGFibGUgZmlsZSBoZWFkZXIgaW5mbwotCSogY29uZmlnL3RjLWk5NjAuYzogbmV3IG9wdGlvbiAtbGlua3JlbGF4Ci0KLU1vbiBKdWwgMTMgMTQ6MTE6MzYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGV4cHIuYyAoZXhwcik6IGFsbG93IFNFR19CU1MgaW4gZXhwcmVzc2lvbnMKLQkqIHJlYWQuYyAocG90YWJsZSk6IGFsaWduIHNob3VsZCBiZSBuYnl0ZXMsIG5vdCBwdHdvIQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBleHRyYSBnbHVlIGZvciBuZXcgYnNzIGF0dHJpYnV0ZXMKLQkocmVsYXhfc2VnbWVudCk6IFNFR19CU1MgaXMgb2sgbm93Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwX29wKTogY2FuIG5vdyBwYXJzZSBtb3JlIEAoIG1vZGVzCi0KLU1vbiBKdWwgIDYgMTc6MDk6MzIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogb2JqLWNvZmZiZmQuYyAoZmlsbF9zZWN0aW9uKTogbWFyayAubGl0IHNlY3Rpb25zIGFzIFNUWVBfTElUCi0KLU1vbiBKdW4gIDEgMTY6MjA6MjIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgaGF2aW5nIHN1bjMgZW11bGF0aW9uIG1vZGUgZm9yCi0Jdnh3b3JrcyBlbnZpcm9ubWVudC4KLQotCi1UdWUgSnVuIDMwIDIwOjI1OjU0IDE5OTIgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBwcm9ncmFtX3N1ZmZpeCAocGFyYWxsZWwgdG8gcHJvZ3JhbV9wcmVmaXgpCi0KLVdlZCBKdW4gMjQgMTA6NTc6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGFwcC5jIChwcm9jZXNzX2VzY2FwZSk6IG5ldyBmdW5jdGlvbiB0byBoYW5kbGUgZXNjYXBlcyB0aGUgcmlnaHQKLQl3YXksIChkb19zY3J1Yl9uZXh0X2NoYXIpOiB1c2UgbmV3IGZ1bmN0aW9uCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBkbyBpZmRlZi9pZm5kZWYgcmlnaHQKLQkqIHJlYWQuYyAoc19maWxsKTogbWFrZSB0aGUgLCBleHByZXNzaW9ucyBvcHRpb25hbCBsaWtlIHRoZSBkb2MKLQlzYXlzCi0JKiBjb25maWcvdGMtaDgzMDAuW2NoXTogYmV0dGVyIHdhcm5pbmdzCi0KLVR1ZSBKdW4gIDkgMDc6NTQ6NTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHN1YnNlZ3MuYyAoc3Vic2Vnc19iZWdpbik6IGNyZWF0ZSBic3MwX2ZyY2hhaW5QIGluIHRoZSBzYW1lIHdhcwotCWFzIGRhdGEwX2ZyY2hhaW5QCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogdmFyaW91cyBjaGFuZ2VzIHRvIGhhbmRsZSBkYXRhIGluCi0JdGhlIEJTUyBzZWdtZW50IGluIG11Y2ggdGhlIHNhbWUgd2FzIGFzIHN0dWZmIGluIHRoZSBEQVRBIHNlZ21lbnQuCi0KLQkqIHRjLW02OGsuYyAobTY4a2lwKTogRml4IHR5cG8gc28gdGhhdCBvbmx5IGFyY2gncyA+PTY4MDIwIGRvCi0JcGNyZWwgZGF0YSBzdHVmZi4gKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogd2hlbiByZWxheGluZyBhCi0JNjgwMTAgYnh4IGludG8gYSBicmErNiBqbXB4eCwgcHV0IHRoZSBieXRlcyBvZiB0aGUgam1wIG9wY29kZSBpbnRvCi0JdGhlIHJpZ2h0IHBsYWNlLiAoc19ic3MpOiBEb24ndCBwdXQgLmJzcyBzdHVmZiBpbnRvIFNFR19EQVRBLCBwdXQKLQlpdCBpbnRvIFNFR19CU1MKLQotVGh1IEp1biAgNCAxMTo1OToxMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jKGV4cHIpOiBhbGxvdyBTRUdfUkVHSVNURVIgaW4gZXhwcmVzc2lvbnMuCi0JKiByZWFkLmMocHNldWRvX3NldCk6IHJlZ2lzdGVyIGV4cHJlc3Npb25zIGNhbiBiZSB0aGUgc291cmNlIG9mIGEKLQlzZXQuCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19uZXcpOiBOb3cgLVIgZm9yY2VzIGFsbCBjaGFuZ2VzIHRvIFNFR19EQVRBIHRvCi0JZ290byBTRUdfVEVYVCAoaWYgYS5vdXQpCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIGEub3V0IGRvbid0IHVzZSB0aGUgb2xkIHdheSBmb3IKLQktUi4KLQkqIGNvbmZpZy9vYmotYS5vdXQgKHNfc2VjdCk6IGNvbXBsYWluIGlmIHRoZSB1c2VyIHRyaWVzIHRvIHVzZSBhCi0Jc3Vic2VnbWVudCB3aXRoIGEgdmFsdWUgd2hpY2ggbWlnaHQgaW50ZXJmZXJlIHdpdGggb3V0IC1SIGhhY2tlcnkuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX3JlZ19wYXJzZSk6IGxvb2t1cCBuYW1lcyBpbiBzeW1ib2wgdGFibGUKLQlyYXRoZXIgdGhhbiB1c2UgdWdseSBpZiB0cmVlLiAoaW5pdF9yZWd0YWJsZSk6IGluc2VydCByZWdpc3RlcgotCW5hbWVzIGludG8gc3ltYm9sIHRhYmxlLgotCi1UdWUgSnVuICAyIDE2OjQ3OjA5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLQotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBrZWVwIHRoZSBmaXhfdGFpbCBjbGVhbiwgd2hpY2gKLQlmaXhlcyBhIGJ1ZyBpbiAtUiB3aGVyZSByZWxvY2F0aW9ucyB3ZXJlIGJlaW5nIGxvc3QuCi0KLU1vbiBKdW4gIDEgMTY6MjA6MjIgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgaGF2aW5nIHN1bjMgZW11bGF0aW9uIG1vZGUgZm9yCi0Jdnh3b3JrcyBlbnZpcm9ubWVudC4KLQotU3VuIE1heSAzMSAwNTozMzowMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHJlY29nbml6ZSBtNjgweDAgYXMgYW4gbTY4awotCi1UaHUgTWF5IDI4IDExOjIyOjAyIDE5OTIgIEppbSBXaWxzb24gICh3aWxzb25Ac3BoYWdudW0uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgc3BhcmNsaXRlIGFzIGEgc3BhcmMgdmFyaWFudC4KLQotCSogdGMtc3BhcmMuYzogVXNlIG5ldyBBUkNISVRFQ1RVUkVTX0NPTkZMSUNUX1AgbWFjcm8uICBNZW50aW9uIG5ldwotCS1Bc3BhcmNsaXRlIGZsYWcuCi0KLVR1ZSBNYXkgMjYgMTY6NDc6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1hMjlrLmM6IGxpbnQKLQkqIGxpc3RpbmcuYywgZXhwci5jOiBwYXRjaGVzIGZyb20gQW5kcmV3IFNtaXRoCi0KLVRodSBNYXkgMTQgMTc6MjI6NDggMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVzZSBtNCByYXRoZXIgdGhhbiBnbTQuCi0KLU1vbiBNYXkgIDQgMTg6NTY6MTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9iai1jb2ZmYmZkLmM6IHVzZSBpcyBhIHN5bm9ueW0gZm9yIHNlY3Rpb24sIChkb19yZWxvY3NfZm9yKToKLQljYWxjIHRoZSBiYXNlIG9mIHJlbG9jcyBjb3JyZWN0bHkuCi0JKiB0Yy1hMjlrLmMgKHBhcnNlX29wZXJhbmQpOiBhbGxvdyBleHByZXNzaW9ucyB0byBiZSBpbiBhbnkgc2VjdGlvbi4KLQotTW9uIEFwciAyNyAxMzoxMzozMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogYXMuYywgd3JpdGUuYzogdXNlIC1LIHJhdGhlciB0aGFuIC1rIGZvciB0aGUgYnJva2VuIHdvcmQgd2FybmluZwotCSAgb3B0aW9uLgotCi1UdWUgQXByIDIxIDEzOjM1OjMwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogZG8gbm90IHByaW50IHJlY3Vyc2lvbiBsaW5lcy4KLQotV2VkIEFwciAxNSAyMToxOTozMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB0aGUgdG9vbGRpciBjb3B5IG9mIGdhcyBnb2VzIGRpcmVjdGx5IGluIHRvb2xkaXIuCi0KLVR1ZSBBcHIgMTQgMTQ6NTA6MjIgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogRm9yIGIub3V0IGZvcm1hdCwgcm91bmQgdXAgc2VjdGlvbgotCXN0YXJ0IGFkZHJlc3NlcyB0byBtYXRjaCByZXF1aXJlZCBhbGlnbm1lbnQuCi0KLVRodSBBcHIgIDkgMDU6NDU6MjkgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogSW5zdGFsbCBpbnRvICQodG9vbGRpcikvYmluLCBzaW5jZSB0aGF0J3MKLQl3aGVyZSBnY2MgbG9va3MgZm9yIGl0LgotCi1UdWUgQXByICA3IDE1OjEyOjE1IDE5OTIgIFNlYW4gRXJpYyBGYWdhbiAgKHNlZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENoYW5nZWQgc29tZSBsaW5lcyB0byBiZSBsZXNzIGNvbmZ1c2luZyBmb3Igc29tZQotCW1ha2VzLgotCi0JKiBpbnB1dC1maWxlLmM6ICBDb25kaXRpb25hbGl6ZSBvbiBfSU9GQkYsIG5vdCBWTVMuCi0KLQkqIHJlYWQuYywgd3JpdGUuYzogIENoYW5nZSBhIHNlcmllcyBvZiBpZmRlZi9lbGlmIHRvCi0JaWZkZWYvZWxzZS9pZmRlZiBldGMuCi0KLUZyaSBNYXIgMjcgMTI6MjE6MTYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIHN5bWJvbHMuYyAoZmJfbGFiZWxfaW5pdCk6IGZpeCBzaXplb2YgdG8gbWVtc2V0LgotCi1GcmkgTWFyIDEzIDE1OjQ1OjQ0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5zdGFsbCB0aGUgbWFuIHBhZ2UuCi0KLQkqIE1ha2VmaWxlLmluOiBwYXNzIGRvd24gTUFLRUlORk8gZXhwbGljaXRseSBvbiBpbmZvLgotCi0JKiBkb2MvTWFrZWZpbGUuaW46IHVzZSAkKE1BS0VJTkZPKSBub3QgbWFrZWluZm8uCi0KLUZyaSBNYXIgMTMgMDg6MDM6MDMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGZsb251bS1jb25zdC5jOiByZW5hbWVkIGZsb251bS1rb25zdC5jIHRvIHN0b3AgZG9zIG5hbWUKLQljb25mbGljdC4KLQotVGh1IE1hciAxMiAwNDo0MjozOCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogdGMtbTY4ay5oLCB0ZS1zdW4zLmg6IG1vdmVkIExPQ0FMX0xBQkVMU19GQiBkZWZpbml0aW9uIGZyb20KLQkgIHRjLW02OGsuaCB0byB0ZS1zdW4zLmguCi0KLVdlZCBNYXIgMTEgMjM6MzI6NDIgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdnh3b3JrczY4IGdldHMgdGUtc3VuMy5oLgotCi0JKiBleHByLmM6IHJlbW92ZSBsaW1pdGF0aW9uIHRoYXQgbG9jYWxfbGFiZWxzX2RvbGxhciBvcgotCSAgbG9jYWxfbGFiZWxzX2ZiIG11c3QgYmUgPCAxMC4KLQotCSogc3ltYm9scy5jOiByZW1vdmUgbG9jYWxfbGFiZWxzX2RvbGxhciwgcmVwbGFjZSB3aXRoIGEgZnVuY3Rpb24KLQkgIGludGVyZmFjZSBmb3IgYSBzcGFyc2UgYXJyYXkuICBBbGwgdXNlcnMgYWRqdXN0ZWQuCi0KLQkqIHRlLXN1bjMuaDogYWRkIExPQ0FMX0xBQkVMU19ET0xMQVIuCi0KLVNhdCBNYXIgIDcgMDA6MDY6MjUgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkb2MvTWFrZWZpbGUuaW46IGNvbW1lbnRlZCBvdXQgbGluZSBmb3IgYnVpbGRpbmcgYXMtYWxsLnRleGluZm8uCi0JICBUaGlzIGlzIHRlbXBvcmFyeS4KLQotCSogZG9jL2FzLnRleGluZm8sIGRvYy9hcy1hbGwudGV4aW5mbzogYWRkZWQgbWVudSBpdGVtIGhvb2tzLgotCi1GcmkgTWFyICA2IDIxOjU3OjE4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UdWUgTWFyICAzIDE1OjQ1OjU2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LgotCi1TdW4gTWFyICAxIDA0OjQzOjE5IDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogd3JpdGUue2MsaH0gKGZpeF9uZXcpOiBNYWtlIHRoZXNlIGRlY2xhcmF0aW9ucyBjb25zaXN0ZW50LgotCi1TYXQgRmViIDI5IDEzOjU5OjEwIDE5OTIgIE1pY2hhZWwgVGllbWFubiAgKHRpZW1hbm5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHN0cmVycm9yLm8pOiBBZGQgcnVsZSBzbyB0aGF0IGJyb2tlbiBTdW4gbWFrZSBjYW4KLQl3b3JrIGluIHN1YmRpcnMuCi0KLVdlZCBGZWIgMjYgMTk6MjY6MjggMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlYWQuYywgb2JqLWNvZmZiZmQuYyA6IGZpeCBoODMwMCBzcGVjaWZpYyBiaXQgcm90Ci0KLQkqIGV4cHIuYyAob3BlcmFuZCk6IGlmIGNhbid0IHdvcmsgb3V0IHdoYXQgc29ydCBvZiBvcGVyYW5kIGl0IGlzLAotCXRoZW4gbG9vayB0aHJvdWdoIEZMVF9DSEFSUyBmb3IgYSBoaW50LgotCi1XZWQgRmViIDI2IDE4OjA0OjQwIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotCSogZG9jL01ha2VmaWxlLmluLCBkb2MvY29uZmlndXJlLmluOiByZW1vdmVkIHRyYWNlcyBvZiBuYW1lc3ViZGlyLAotCSAgLXN1YmRpcnMsICQoc3ViZGlyKSwgJCh1bnN1YmRpciksIHNvbWUgcmNzIHRyaWdnZXJzLiAgRm9yY2VkCi0JICBjb3B5cmlnaHRzIHRvICc5MiwgY2hhbmdlZCBzb21lIGZyb20gQ3lnbnVzIHRvIEZTRi4KLQotVHVlIEZlYiAyNSAxNDoxNzoxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogZXhwci5jOiBJZiBhbiBleHByZXNzaW9uIGlzIHNpbmdsZSBjb21tYSwgdGhlbiByZXR1cm4gd2l0aAotCVNFR19BQlNFTlQgcmF0aGVyIHRoYW4gYW4gZXJyb3IgLSBzaW5jZSB0aGUgc3BhcmMgZnJvbnQgZW5kIGRvZXMKLQlyZWFsbHkgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0aGluZ3MgbGlrZSBmYmdlLGEKLQotCSogYXMuaDogaW5jbHVkZSBiZmQuaCBpZiB1c2luZyBtYW55IHNlY3Rpb25zCi0JKiBleHByLmM6IExPQ0FMX0xBQkVMU19GQiBoYWQgYmVlbiBjaGFuZ2VkIHRvIGxvd2VyIGNhc2UgLSBzbwotCWxvY2FsIGxhYmVscyBkaWRuJ3Qgd29yay4KLQkqIGxpc3RpbmcuYyAobGlzdF9zeW1ib2xfdGFibGUpOiBkb24ndCBjb3JlIGR1bXAgd2hlbiB0aGVyZSdzIG5vCi0Jc3ltYm9sIHRoZXJlLgotCSogd3JpdGUuYywgd3JpdGUuaDogY2FsbCBmaXhfbmV3IHdpdGggdGhlIHJpZ2h0IG51bWJlciBvZiBhcmdzIG9uCi0JdGhlIEg4LgotCSogY29uZmlnL3RjLWg4MzAwLltjaF0gOiBmaXggYnVncyByZXBvcnRlZCBieSBITVNJLCBhbmQgbWFrZQotCWVycm9ycyBuaWNlcwotCi1TYXQgRmViIDIyIDEyOjI2OjI4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBhcHAuYzogTVJJIGNvbXBhdGliaWxpdHkgLSBhbGxvdyBzaW5nbGUgcXVvdGUgdG8gc3RhcnQgYSBzdHJpbmcuCi0JKiBhcy5jOiBmaXggdHlwbyByZWNlbnRseSBpbnRyb2R1Y2VkLgotCSogYXMuaCA6IERvbid0IGluY2x1ZGUgYW91dC9yZWxvYy5oIC0gaXQncyBub3QgcmlnaHQgZm9yIENPRkYhCi0JKiBleHByLmM6IE11Y2ggcmV3cml0aW5nLCB0byBhY2NvbW9kYXRlIE1SSSBzeW50YXggZm9yCi0JZXhwcmVzc2lvbnMuIEFsc28gZWFzaWVyIHRvIHJlYWQgbm93LgotCSogbGlzdGluZy5jOiBQdXQgYmFjayBkZWZ1bnMKLQkqIHJlYWQuYzogbW9kaWZpZWQgdG8gYWNjZXB0IE1SSSBzeW50YXgsIHB1dCBiYWNrIGxpc3RpbmcgcHNldWRvCi0Jb3BzIHNvIHRoYXQgYW4gYXNzZW1ibGVyIGJ1aWx0IHdpdGggTk9fTElTVElORyBpZ25vcmVzIGxpc3Qgb3BzCi0JcmF0aGVyIHRoYW4gcHVrZXMuCi0JKiB3cml0ZS5jLCB3cml0ZS5oOiBmaXhzIC0gb25seSBrZWVwIGEgcmVsb2MgdHlwZSBpbiBhIGZpeCBpZiB0aGUgdGFyZ2V0Ci0JbWFjaGluZSBpcyBhIFNQQVJDIG9yIGEgMjlLLgotCSogY29uZmlnL29iai1hb3V0LmM6IGFkZGVkIHNfc2VjdCBwc2V1ZG8gb3AKLQkqIGNvbmZpZy9vYmotY29mZmJmZC5jOiBsaW50cywgc2V0IHRoZSBmaWxlaGRyIGZsYWdzIHJpZ2h0IGFuZAotCWZpbGwgaW4gdGhlIHRpbWVzdGFtcC4KLQkqIGNvbmZpZy9vYmotY29mZmJmZC5oOiBTaW5jZSB3ZSBkb24ndCBpbmNsdWRlIGFvdXQvcmVsb2MuaAotCWFueW1vcmUsIGRlZmluZSBhbGwgdGhlIHJlbG9jcyB3aGljaCB0aGUgdGMtPHg+IGJpdCB3aWxsIHVzZSBzbyB3ZQotCWNhbiB0cmFuc2xhdGUgZnJvbSB0aGVtIHRvIHRoZSBjb2ZmIHR5cGVzLgotCSogY29uZmlnL3RjLWEyOWsuYzogcmVsb2NfdHlwZSBpc24ndCBhbmUgZW51bSBhbnkgbW9yZQotCSogY29uZmlnL3RjLW02OGsuYzogQWRkZWQgTk9fUkVMT0MgZGVmaW5pdGlvbi4KLQotRnJpIEZlYiAyMSAwNjoyMTowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBwdXQgaGVhZGVyIGZpbGVzIGJlZm9yZSBDIHNvdXJjZSBmb3IgVEFHUzsgcmVtb3ZlCi0JICByZWZlcmVuY2VzIHRvIG5vbi1leGlzdGVudCBzeXNjYWxscy5oLgotCi0JKiByZWFkLmMsIHdyaXRlLmMgc3Vic2Vncy5jOiBiYWNrIG91dCB0aGUgLmJzcyBjaGFuZ2VzLgotCi0JKiBvYmotYW91dC5jOiBkbyBub3QgaW5jbHVkZSBzdGFiLmdudS5oIGlmIE5PX0xJU1RJTkcuCi0KLQkqIHRjLWk4NjAuYywgYS5vdXQuZ251Lmg6IG1vdmUgaTg2MCByZWxvY3MgdG8gYSBwcm9wZXIgcGxhY2UuCi0KLQkqIGEub3V0Lmg6IHJlbW92ZWQuCi0KLUZyaSBGZWIgMjEgMDE6MDg6NDggMTk5MiAgTWluaCBUcmFuLUxlIChUUkFOTEVASU5URUxMSUNPUlAuQ09NKQotCi0JKiBzeW1ib2xzLmMgKGxvY2FsX2xhYmVsX25hbWUpOiBzeW1ib2xzIG5vdyBzdGFydCB3aXRoIF5BLgotCi0JKiByZWFkLmMsIHN1YnNlZ3MuYywgd3JpdGUuYyBvYmotY29mZi5jOiBhZGRlZCBoYW5kbGluZyBvZgotCSAgYC5ic3NgIHBzZXVkbyBvcCBmb3IgdW5pdGlhbGl6ZWQgZGF0YS4gVGhlIG5ldyBnY2MgKDEuMzcuOXgpCi0JICBnZW5lcmF0ZSB0aGVzZSBzZWN0aW9ucy4gIC5hbGlnbjogd2lsbCB1c2UgTk9QX09QQ09ERSBvciAwCi0JICBmb3IgcGFkZGluZy4gVGhpcyBpcyBqdXN0IGZvciBiZWluZyBuaWNlIHRvIHRoZQotCSAgZGlzYXNzZW1ibGVyLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBjaGFuZ2VkIHRvIGdlbmVyYXRlIGxvY2FsIGxhYmVsICJcMDAxTDAiCi0JICBzdGFydGluZyB3aXRoIGEgXkEgc28gdGhhdCBpdCBpcyByZWNvZ25pemVkIGFzIGEgbG9jYWwgbGFiZWwuCi0KLQkqIGFzLmMgKHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyk6IHplcm8gYnNzX2ZpeF9yb290LCB0b28uCi0KLQkqIHRjLWkzODYuYzogdGMtaTM4Ni5jOiBhZGRlZCBoYW5kbGluZyBvZiB0aGUgZm9sbG93aW5nIG9wY29kZXM6Ci0JICBpL28gb3Bjb2RlcyAtIGluYiwgaW53LCBvdXRiIGFuZCBvdXR3LiAgc3RyaW5nIG1hbmlwdWxhdGlvbiB3aXRoCi0JICBhdHQgc3ludGF4IC0gc2NtcCwgc2xvZCwgc21vdiwgc3NjYSwgc3N0by4KLQotCSogb2JqLWNvZmYuYzogKGZvciBhaXgzODYpIE1vdmVkIHRoZSBzeW1ib2xzIC50ZXh0LCAuZGF0YSBhbmQgLmJzcwotCSAgdG8ganVzdCBhZnRlciAuZmlsZSAuCi0KLQkgIEluIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4oKSB3aGVyZSBpdCB0cmllcyB0byBwdXQgdGhlIGV4dGVybmFsCi0JICBzeW1ib2xzIGFwYXJ0LCB3aXRoIHRoZSBjb25kaXRpb246Ci0JICAgICghU19JU19ERUZJTkVEKHN5bWJvbFApICYmCi0JICAgICAhU19JU19ERUJVRyhzeW1ib2xQKSAmJgotCSAgICAgIVNGX0dFVF9TVEFUSUNTKHN5bWJvbFApKQotCSAgaXQgd2FzIG1vdmluZyB0b28gbWFueSBzeW1ib2xzIG91dC4gU28gSSBzd2l0Y2ggaXQgYmFjayB0byB0aGUKLQkgIGNvbmRpdGlvbjoKLQkgICAgKFNfR0VUX1NUT1JBR0VfQ0xBU1Moc3ltYm9sUCkgPT0gQ19FWFQgJiYgIVNGX0dFVF9GVU5DVElPTihzeW1ib2xQKSkKLQotCSAgSW4gb2JqX2VtaXRfcmVsb2NhdGlvbnMoKSBhZGRlZCB0aGUgY29uZGl0aW9uYWwgb24gS0VFUF9SRUxPQ19JTkZPCi0JICBzbyB0aGF0IHdlIGRvbid0IHVzZSB0aGUgRl9SRUxGTEcgd2hpY2ggbWFrZSB0aGUgbGlua2VyIGNvbXBsYWluCi0JICB0aGF0IHNvbWVib2R5IGhhcyBzdHJpcHBlZCB0aGUgcmVsb2NhdGlvbiBpbmZvLgotCi0JICBBbHNvLCB0aGUgQUlYIGxkIHByb2dyYW0gcmVxdWlyZSB0aGF0IHRoZSByZWxvY2F0aW9uIHRhYmxlCi0JICBpcyBzb3J0ZWQgYnkgcl92YWRkciBsaWtlIHRoZSBzdGFuZGFyZCBBVFQgYXNzZW1ibGVyIGRvZXMuCi0KLQkgIFtoZSBhbHNvIGNoYW5nZWQgdGhlIHNpemVvZihzdHJ1Y3QgLi4uKSdzIGludG8gdGhlIGNvZmYKLQkgIHN0eWxlIEZPT1NaIG1hY3Jvcy4gIEknbSBub3Qgc3VyZSB0aGlzIGlzIHJpZ2h0LCBidXQgSSBjYW4ndAotCSAgcmVtZW1iZXIgd2h5LiAgeG94b3JpY2guXQotCi1GcmkgRmViIDIxIDAxOjA4OjQ4IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluLCBkb2M6IHVzZSB0aGUgZG9jLiAgQnVpbGQgaXQsIGluc3RhbGwKLQkgIGl0LCBjbGVhbiBpdCwgZXRjLgotCi1UdWUgRmViIDE4IDAyOjIxOjI1IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkLmM6IHdoaXRlIHNwYWNlIGFuZCBjb21tZW50cyBvbmx5LgotCi0JKiBjb25maWd1cmUuaW46IHVzZSB0aGUgbmV3IGF0b2YtbnMzMi5jIGZvciBuczMyay4KLQotCSogd3JpdGUuYzogY29tbWVudCBjaGFuZ2Ugb25seS4KLQotCSogdGMtbTg4ay5baGNdOiBwdWxsZWQgaW4gZnJvbSBoYWNrJ3MgdW5maW5pc2hlZCB3b3JrLiAgVGhlc2UKLQkgIGFyZW4ndCB5ZXQgaW50ZWdyYXRlZC4KLQotCSogdGMtaTg2MC5baGNdOiBibGV3IG9mZiB0aGUgZHVzdC4gIFNvbWV0aGluZyBtdXN0IHN0aWxsIGJlIGRvbmUKLQkgIGFib3V0IGNvbmZsaWN0aW5nIHJlbG9jYXRpb24gdHlwZXMuCi0KLQkqIHRjLW5zMzJrLmM6IFJlcGxhY2VkIHByZXZpb3VzIHRjX2FvdXRfZml4X3RvX2NoYXJzIHN0dWIgd2l0aCB0aGUKLQkgIHJlYWwgdGhpbmcuCi0KLQkqIHRjLWk5NjAuYywgdGMtc3BhcmMuYzogd2hpdGUgc3BhY2UgYW5kIGNvbW1lbnRzIG9ubHkuCi0KLQkqIHRjLWEyOWsuaDogZGVsZXRlIGR1cGxpY2F0ZSBtYWNybyBkZWZpbml0aW9uLgotCi0JKiBuZXcgZmlsZSBhdG9mLW5zMzJrLmMgY29waWVkIGZyb20gaGFjaydzIGxhc3QgdW5yZWxlYXNlZCBnYXMuCi0KLU1vbiBGZWIgMTcgMDc6NTE6MDYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1uczMyay5jOiBhY3R1YWxseSBtYWtlIHRjX2FvdXRfZml4X3RvX2NoYXJzIHdvcmsKLQkgIHJhdGhlciB0aGFuIGFib3J0LgotCi0JKiBuZWFybHkgZXZlcnl0aGluZy4gIGZsdXNoIENoYW5nZUxvZywgcGFja2FnZSBhcyBnYXMtMS45Mi4xLgotCSAgQ2hhbmdlTG9nJ3MgcHJpb3IgdG8gdGhpcyBhcmUgc2tldGNoeSBhdCBiZXN0LiAgSSBoYXZlIGxvZ3MuCi0JICBUaGV5IGp1c3QgYXJlbid0IENoYW5nZUxvZ3MuCmRpZmYgLS1naXQgYS9nYXMvQ2hhbmdlTG9nLTk2OTcgYi9nYXMvQ2hhbmdlTG9nLTk2OTcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMmFmODIuLjAwMDAwMDAKLS0tIGEvZ2FzL0NoYW5nZUxvZy05Njk3CisrKyAvZGV2L251bGwKQEAgLTEsNTk2MCArMCwwIEBACi1XZWQgRGVjIDMxIDEyOjI5OjQ3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBDb3JyZWN0IGJyYW5jaCByYW5nZXMuCi0KLU1vbiBEZWMgMjIgMTM6MDY6MDUgMTk5NyAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW4gKGkzODYqLWdvMzItcnRlbXMqKTogRml4IHRvIGJlIHRoZSBzYW1lIGFzCi0JaVszNDU2XTg2LWdvMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBEZWMgMjIgMTI6NTQ6MDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IFRoZSA0NjUwIGRvZXNuJ3QgcGVybWl0IE1fTERDMV9BQiwKLQlNX1NEQzFfQUIsIE1fTF9ET0IsIE1fTF9EQUIsIE1fU19EQUIsIG9yIE1fU19ET0IuCi0JKG1pcHNfaXApOiBBbHdheXMgY2hlY2sgZm9yIEZQX0QsIG5vdCBqdXN0IGZvciBpbnN0cnVjdGlvbnMgdGhhdAotCWFyZSBub3QgcGFydCBvZiB0aGUgcmVndWxhciBJU0EuCi0KLVRodSBEZWMgMTggMTY6NDk6MjggMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoYnVpbGRfaW5zbik6IE1ha2UgYG51bWJlcicgYSBsb25nIGZvciA2NC1iaXQgaG9zdHMuCi0KLVRodSBEZWMgMTggMTY6NDI6NTcgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGNwdV90eXBlcyk6IDIxMTY0cGMvcGNhNTYgZG9lcyBub3QgaGF2ZSBDSVguCi0KLVdlZCBEZWMgMTcgMjE6MjM6MDcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQgMzJiaXQgYmlnbnVtKTogTWFzayBvZmYgYml0cyBvdXRzaWRlCi0JdGhlIHJhbmdlIHdlIGNhcmUgYWJvdXQuCi0KLVdlZCBEZWMgMTcgMTU6Mjk6MDMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3Nob3J0b3B0cyk6IEFkZCAnbicgYW5kICdOJyBvcHRpb25zLgotCShleGVjX3R5cGVfZW51bSk6IEVudW1lcmF0aW9uIGdpdmluZyBhbGwgb2YgdGhlIGV4ZWMgdHlwZXMuCi0JKHdhcm5fbm9wcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUgdG8gZ2l2ZSBub3Agd2FybmluZyBsZXZlbC4KLQkoe2N1cixwcmV2fV9tdWwzMl9wKTogTmV3IHN0YXRpYyB2YXJpYWJsZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIKLQl0aGUgY3VycmVudC9wcmV2aW91cyBpbnN0cnVjdGlvbiBpcyBhIDMyLWJpdCBtdWx0aXBseS4KLQkoT3B0aW1pemluZyk6IE1ha2Ugc3RhdGljLgotCShOT1B7MixfTEVGVCxfUklHSFR9KTogTWFjcm9zIGZvciB3b3JkIG9mIG5vcHMgYW5kIGxlZnQvcmlnaHQKLQlub3BzLgotCShkMzB2X2luc2VydF9vcGVyYW5kKTogRGVsZXRlIGRlY2xhcmF0aW9uIG9mIHVudXNlZCBmdW5jdGlvbi4KLQkod3JpdGVfMl9zaG9ydCk6IE1ha2UgZXhlY190eXBlIGFyZ3VtZW50IGVudW0sIG5vdCBpbnQuCi0JKHBhcmFsbGVsX29rKTogRGl0dG8uCi0JKGNoZWNrX3JhbmdlKTogRGVsZXRlIHVudXNlZCB2YXJpYWJsZShzKS4KLQkoYnVpbGRfaW5zbik6IERpdHRvLgotCShmaW5kX2Zvcm1hdCk6IERpdHRvLgotCShtZF9hcHBseV9maXgzKTogRGl0dG8uCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCAtbiBhbmQgLU4uCi0JKG1kX3BhcnNlX29wdGlvbik6IFBhcnNlIC1uIGFuZCAtTi4KLQkod3JpdGVfMV9zaG9ydCk6IElmIC1uLCB3YXJuIGFib3V0IGFkZGluZyBhIG5vcC4gIFVzZQotCU5PUF97TEVGVCxSSUdIVH0uCi0JKHdyaXRlXzJfc2hvcnQpOiBVc2UgZW51bWVyYXRpb24gdmFsdWVzIGluc3RlYWQgb2YgaGFyZCBjb2RlZAotCWludGVnZXJzLiAgUmVzZXQgZXhlY190eXBlIGZvciBkZWZhdWx0IG9wZXJhdGlvbnMuICBGb3IgZXhwbGljaXQKLQlwYXJhbGxlbCBvcGVyYXRpb25zLCBjYWxsIHBhcmFsbGVsX29rIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzCi0Jb2suICBJZiB3cml0aW5nIG91dCBhIHBhcmFsbGVsIG9wZXJhdGlvbiwgYW5kIHRoZSBwcmV2aW91cwotCWluc3RydWN0aW9uIHdhcyBhIDMyLWJpdCBtdWx0aXBseSwgaW5kaWNhdGUgY3VycmVudCBpbnN0cnVjdGlvbgotCWlzLgotCShwYXJhbGxlbF9vayk6IEFsbG93IGFkZC90eCAuLi4gdG8gYmUgZG9uZSBpbiBwYXJhbGxlbCB3aXRoCi0JYW5vdGhlciBhZGQvdHggLi4uIGFzc3VtaW5nIHRoZSBncHIgcmVnaXN0ZXJzIGRvbid0IG92ZXJsYXAuCi0JKG1kX2Fzc2VtYmxlKTogVXNlIGV4ZWMgdHlwZSBlbnVtZXJhdGlvbiB2YWx1ZXMsIG5vdCBoYXJkIGNvZGVkCi0JaW50cy4gIENoZWNrIGZvciBsb2FkcyBvciAxNi1iaXQgbXVsdGlwbGllcyBmb2xsb3dpbmcgaW4gdGhlIG5leHQKLQljeWNsZSBhZnRlciBhIDMyLWJpdCBtdWx0aXBseS4gIEFkZCBub3BzIGlmIHRoYXQgaXMgdGhlIGNhc2UuCi0JKGRvX2Fzc2VtYmxlKTogQ29weSBwcmV2X211bDMyX3AgdG8gY3VyX211bDMyX3AsIGFuZCBzZXQKLQljdXJfbXVsMzJfcCBpZiBjdXJyZW50IGluc3RydWN0aW9uIGlzIGEgMzItYml0IG11bHRpcGx5LgotCShmaW5kX2Zvcm1hdCk6IENoYW5nZSBzcGFjaW5nIGFuZCBsYXlvdXQuCi0KLVR1ZSBEZWMgMTYgMTY6NTU6NDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jICh0aWM4MF9yZWxheCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1kX2xvbmdvcHRzKTogQWRkIG5ldyBPUFRJT05fUkVMQVggYW5kIE9QVElPTl9OT19SRUxBWCBvcHRpb25zLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgbmV3IHJlbGF4IG9wdGlvbnMuCi0JKG1kX3Nob3dfdXNhZ2UpOiBEb2N1bWVudCBuZXcgcmVsYXggb3B0aW9ucy4KLQkoZmluZF9vcGNvZGUpOiBEb24ndCB1c2Ugc2hvcnQgZm9ybXMgb2YgUEMgcmVsYXRpdmUgYnJhbmNoZXMgaWYKLQl0aWM4MF9yZWxheCBpcyBzZXQuCi0KLVR1ZSBEZWMgMTYgMTU6MjY6MDMgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogUmVtb3ZlIG5vbi1yZWdpc3RlciBiaXRzIGZyb20KLQl1c2VkL3NldCBmbGFnIGZpZWxkcy4gIE1ha2UgZmxhZyB2YXJzIHVuc2lnbmVkIGxvbmcuICBVc2UKLQlGTEFHX0F7MCwxfSBmb3IgYWNjdW11bGF0b3JzLiAgQWxsb3cgYW55IDIgaW5zbnMgdG8gYmUgZG9uZSBpbgotCXBhcmFsbGVsIGlmIHRoZXkgdXNlIHRoZSBzYW1lIGNvbmRpdGlvbmFsIGZsYWcgd2l0aCByZXZlcnNlZAotCW1lYW5pbmcuICBBbGxvdyAyIGFkZC9zdWIgaW5zbnMgdGhhdCBzZXQgdGhlIGNhcnJ5IG9yIG92ZXJmbG93Ci0JZmxhZ3MgYnV0IGRvIG5vdCBxdWVyeSB0aGVtIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwuICBEb24ndCBhbGxvdyAyCi0Jd29yZCBzdG9yZSBvcGVyYXRpb25zIHRvIGJlIGRvbmUgaW4gcGFyYWxsZWwgd2l0aCBBRERwcHAgb3IKLQlTVUJwcHAuICBEb24ndCBhbGxvdyBsb2FkcyB0byBiZSBkb25lIGluIHBhcmFsbGVsIHdpdGggMTYgYml0Ci0JbXVsdGlwbGllcy4KLQotVHVlIERlYyAxNiAwOToyMDo0MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IFByZXZlbnQgdXNlIG9mIGludGVyd29ya2luZyBzdXBwb3J0IGZvcgotCW5vbi1DT0ZGIHRhcmdldHMuCi0KLU1vbiBEZWMgMTUgMTU6MjA6MzIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FsbC50ZXhpOiBBZGQgTTMyUiBjcHUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbiBvZiBtMzJyIHByb2Nlc3Nvci4KLQotCSogZG9jL2MtbTMyci50ZXhpOiBOZXcgZmlsZSwgZG9jdW1lbnRpbmcgbTMyciBzcGVjaWZpYyBmZWF0dXJlcy4gIAotCi0KLU1vbiBEZWMgMTUgMTA6MzI6MjggMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogQ29ycmVjdGx5IGluc2VydCAnUCcgb3BlcmFuZHMgaW50bwotCXRoZSBpbnN0cnVjdGlvbi4KLQotRnJpIERlYyAxMiAxMTo0NDoyMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBIYW5kbGUgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZQotCWxvbmcgKDMyIGJpdCkgUEMgcmVsYXRpdmUgb2Zmc2V0cy4gIEZpeCBwbGFjZXMgdGhhdCBwcmV2aW91c2x5Ci0JbWlzdXNlZCBSX01QUENSIGZvciAxNSBiaXQgb2Zmc2V0cyB0byB1c2UgdGhlIG5ldyBSX01QUENSMTVXIHR5cGUuCi0JKG1kX2FwcGx5X2ZpeCk6IEFkZCBjYXNlIHRvIGhhbmRsZSBsb25nIFBDIHJlbGF0aXZlIG9mZnNldHMuCi0KLUZyaSBEZWMgMTIgMTA6MzU6MDEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtYXJtLnRleGkgKEFSTSBPcHRpb25zKTogRG9jdW1lbnQgc3VwcG9ydCBmb3IgbmV3IEFSTQotCXByb2Nlc3NvciBuYW1lcy4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBBZGQgc3VwcG9ydCBmb3IgbmV3IEFSTQotCXByb2Nlc3NvciBuYW1lcy4KLQotVGh1IERlYyAxMSAxNzo0Njo1MCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogRG9uJ3Qgb3ZlcndyaXRlIG9wY29kZSB0YWJsZSBkYXRhLgotCShpbnNvcCwgbTY4a19pcCk6IE1ha2UgYG9wY29kZScgY29uc3Qgc28gaXQgZG9lc24ndCBoYXBwZW4gYWdhaW4uCi0KLUZyaSBEZWMgIDUgMTE6MjM6NTkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBGaXggQkZEX1JFTE9DXzMyIGFnYWluc3QgYQotCXN5bWJvbCArIG9mZnNldC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBVc2UKLQlTSFRfVjg1MF97U3xUfFp9Q09NTU9OIHRvIG1hcmsgc3BlY2lhbCBjb21tb24gc2VjdGlvbnMuCi0KLVR1ZSBEZWMgIDIgMTc6MDU6MTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogQnJvdWdodCB1cCB0byBkYXRlIHdpdGggdGhlIGJyYW5jaC4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChTV0lUQ0hfVEFCTEVfQ09OUyk6IEhhbmRsZSAoZml4KS0+Znhfc2l6ZSA9PSAxLgotCShTV0lUQ0hfVEFCTEUpOiBIYW5kbGUgQkZEX1JFTE9DXzguCi0JKG1kX2FwcGx5X2ZpeCk6ICNpZm5kZWYgQkZEX0FTU0VNQkxFUiBjb2RlOiBIYW5kbGUgZml4UC0+Znhfc2l6ZSA9PSAxLgotCShjb2ZmX3JlbG9jX21hcCk6IEFkZCBCRkRfUkVMT0NfOF9QQ1JFTCBlbnRyeS4KLQkoc2hfY29mZl9yZWxvY19tYW5nbGUpOiBTV0lUQ0hfVEFCTEUgY2FzZTogSGFuZGxlIEJGRF9SRUxPQ184LgotCi1TYXQgTm92IDIyIDE2OjE5OjIyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHRjLWFscGhhLmMgKHJhbmdlX3NpZ25lZF8xNiwgcmFuZ2Vfc2lnbmVkXzMyKTogV29yayBhcm91bmQgYW4KLQlhcHBhcmVudCBidWcgaW4gZ2NjJ3MgbG9uZyBsb25nIHN1cHBvcnQgY3Jvc3NpbmcgZnJvbSB4ODYuCi0KLVNhdCBOb3YgMjIgMTQ6MjY6MDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jOiBCcm91Z2h0IHVwIHRvIGRhdGUgd2l0aCBsYXRlc3QgY2hhbmdlcyBvbiBhcm0KLQlicmFuY2guIAotCi1TYXQgTm92IDIyIDE1OjUwOjA5IDE5OTcgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBjb25maWctZ2FzLmNvbTogR2V0IHZlcnNpb24gaW5mbyBmcm9tIGNvbmZpZ3VyZS5pbi4KLQotCSogbWFrZWZpbGUudm1zOiBpbmNsdWRlIGRlcGVuZC5vYmogaW4gT0JKUy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfc2VjdGlvbik6IFJlbW92ZSAiLmxjb21tIiBoYW5kbGluZy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2Jhc2VyZWdfY2xvYmJlcmVkKTogUmVtb3ZlIHZhcmlhYmxlIGFuZAotCWFsbCBjb3JyZXNwb25kaW5nIGNvZGUuCi0KLVRodSBOb3YgMjAgMTU6MDY6MDggMTk5NyAgUmljaGFyZCBFYXJuc2hhdyA8cmVhcm5zaGFAYXJtLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5oIChUQVJHRVRfRk9STUFUIGZvciBnZW5lcmljIGEub3V0IHRhcmdldHMpOiBBbGxvdwotCXJ1bi10aW1lIGVuZGlhbiBzZWxlY3Rpb24uCi0KLVdlZCBOb3YgMTkgMTc6NDQ6NDIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHRjLXNoLmMgKHBhcnNlX3JlZyk6IFByb3Blcmx5IHF1b3RlIGZvciBmdjQuCi0KLVdlZCBOb3YgMTkgMjM6NDY6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogQWRkIG1pc3NpbmcgYnJlYWtzIGluIGNhc2Ugb24KLQlzeW1ib2wgdmFsdWUgb3BlcmF0b3IuCi0KLVR1ZSBOb3YgMTggMTg6NDU6MTQgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2ssIGZpbmRfb3Bjb2RlKTogCi0JU3BsaXQgT1BFUkFORF9GTEFHIGludG8gT1BFUkFORF9GRkxBRyBhbmQgT1BFUkFORF9DRkxBRy4KLQotU3VuIE5vdiAxNiAxMDowNTowNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDYXN0IHNlY29uZCBhcmcgb2YKLQltZF9hcHBseV9maXgzIGNhbGwgdG8gdHlwZSAidmFsdWVUICoiLgotCi1UaHUgTm92IDEzIDEzOjUzOjEwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogTWFrZSBGcmVlQlNEIGFuIGFvdXQgLyBpMzg2YnNkCi0gCXZhcmlhbnQuCi0JKiBjb25maWd1cmU6IFJlLWdlbmVyYXRlLgotCQotVGh1IE5vdiAxMyAxMTowNzoxNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBVc2UgdGhlIG1lbWJlcnNoaXAgZmllbGQKLQlmb3IgSU5TTl9NQUNSTydzLgotCShtaXBzX2lwKTogU2FtZS4KLQotVGh1IE5vdiAxMyAwMjowNDo1NSAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChmaW5kX29wY29kZSk6IEZvciBPUENPREVfRkFLRSwgYWRkIGNoZWNrIGZvcgotCWZpcnN0IGFyZ3VtZW50IGlmIGl0J3Mgc3VwcG9zZWQgdG8gYmUgYSByZWdpc3Rlci4KLQotVHVlIE5vdiAxMSAxOToyNTowNSAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiAgSWYgZDEwdiwgcmUtaW5zZXJ0IGEgc3BhY2UgYmVmb3JlCi0JYSAnIycgd2hlbiBpbiBzdGF0ZSAxMC4KLQotVHVlIE5vdiAxMSAxMzozMzoxNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1oODMwMC5jOiBJbmNsdWRlICJzdWJzZWdzLmgiLgotCSh0Y19yZWxvY19tYW5nbGUpOiBIYW5kbGUgcmVmZXJlbmNlcyB0byBzeW1ib2xzIHdoaWNoIGFyZSBub3QKLQliZWluZyBvdXRwdXQsIHNvIHRoYXQgcmVmZXJlbmNlcyB0byBgLicgd29yay4KLQotTW9uIE5vdiAxMCAxMzo0MzozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBDYWxsIGFkZF9maXggd2hlbiBuZWVkZWQgZm9yICdfJwotCWNhc2UuCi0KLQkqIG1hY3JvLmMgKHN1Yl9hY3R1YWwpOiBJZiB3ZSBkb24ndCBmaW5kIGEgcGFyYW1ldGVyIGZvciBhbiAmLAotCWp1c3Qgc3Vic3RpdHV0ZSAmLgotCi1GcmkgTm92ICA3IDIxOjI5OjMyIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogSW4gZGVmYXVsdCBjYXNlLCBjYWxsIGFzX2JhZAotCWluc3RlYWQgb2YgZnByaW50ZiwgdG8gZ2V0ICJhc3NlbWJsZXIgbWVzc2FnZXM6IiBtZXNzYWdlIG91dHB1dAotCWJlZm9yZSBpbnN0ZWFkIG9mIGFmdGVyLgotCi1GcmkgTm92ICA3IDEwOjM2OjIyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGZyYWdzLmg6IEhhbmRsZSBtdWx0aXBsZSBpbmNsdXNpb24uCi0KLVdlZCBOb3YgIDUgMTA6NTE6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1LgotCSogYXMuaCAoc3RydWN0IGZyYWcsIGZyYWcgc3VwcG9ydCk6IE1vdmVkIGZyb20gaGVyZS4KLQkqIGZyYWdzLmg6IFRvIGhlcmUuCi0JKHN0cnVjdCBmcmFnLCBtZW1iZXIgdGNfZnJhZ19kYXRhKTogTmV3IG1lbWJlciBpZiBUQ19GUkFHX1RZUEUKLQlpcyBkZWZpbmVkLgotCShzdHJ1Y3QgZnJhZywgbWVtYmVyIGZyX2NnZW4pOiBSZW5hbWVkIGZyb20gZnJfdGFyZy5jZ2VuLgotCSogY2dlbi5jIChjZ2VuX2FzbV9maW5pc2hfaW5zbik6IFVwZGF0ZS4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXBkYXRlLgotCSogY29uZmlnL3RjLW0zMnIuaCAoVENfRlJBR19JTklUKTogUmVuYW1lZCBmcm9tIG1kX2luaXRfZnJhZy4KLQkobWRfY29udmVydF9mcmFnKTogRGl0dG8uCi0JKiBjb25maWcvdGMtbnMzMmsuaCAoVENfRlJBR19UWVBFKTogRGVmaW5lLgotCShmcmFnX29wY29kZV9mcmFnLGZyYWdfb3Bjb2RlX29mZnNldCxmcmFnX2Jzcik6IFVwZGF0ZS4KLQkoVENfRlJBR19JTklUKTogVXBkYXRlLgotCi1UdWUgTm92ICA0IDE2OjM1OjU3IDE5OTcgIElhbiBEYWxsICA8SWFuLkRhbGxAZHN0by5kZWZlbmNlLmdvdi5hdT4KLQotCSogd3JpdGUuYyAocHJpbnRfZml4dXApOiBVc2UgVENfRklYX0RBVEFfUFJJTlQgKGlmIGRlZmluZWQpIHRvCi0JcHJpbnQgb3V0IE1EIGZpZWxkcyBvZiBmaXguCi0JKiBmcmFncy5jIChmcmFnX3ZhciwgZnJhZ192YXJpYW50KTogVXNlIFRDX0ZSQUdfSU5JVCBtYWNybyAoaWYKLSAJZGVmaW5lZCkgdG8gaW5pdGlhbGl6ZSBNRCBmaWVsZHMgaW4gZnJhZy4KLQkqIGFzLmggKHN0cnVjdCBmcmFnLCBuczMyayBzdXBwb3J0KTogUmVuYW1lIG5zMzJrIHRvIGZyX25zMzJrLgotCURlbGV0ZSBwY3JlbF9hZGp1c3QuICBBZGQgZnJfb3Bjb2RlX2ZyYWdQLCBmcl9vcGNvZGVfb2Zmc2V0LgotCSogY29uZmlnL3RjLW5zMzJrLmg6IEFkZCBjb21tZW50cy4gUmVtb3ZlIG9ic29sZXRlCi0gCUJGRF9GQVNUX1NFQ1RJT05fRklMTCBkZWZpbml0aW9uLCBjaGFuZ2UgcHJvdG90eXBlcyBmb3IKLSAJZml4X25ld19uczMyayBhbmQgZml4X25ld19uczMya19leHAgdG8gYWRkIG5ldyBhcmd1bWVudHMKLSAJb3Bjb2RlX2ZyYWcgYW5kIG9wY29kZV9vZmZzZXQgYW5kIHJlbW92ZSBwY3JlbF9hZGp1c3QuCi0JKFRDX0ZJWF9UWVBFKTogYWRkIG9wY29kZV9mcmFnUCBhbmQgb3Bjb2RlX29mZnNldCBmaWVsZHMuCi0JKFRDX0ZJWF9EQVRBX1BSSU5UKTogbmV3IG1hY3JvIHRvIHByaW50IG91dCBUQ19GSVhfVFlQRS4KLQkoVENfRlJBR19JTklUKTogbmV3IG1hY3JvIHRvIGluaXRpYWxpemUgbWFjaGluZSBkZXBlbmRlbnQgZmllbGQgaW4KLSAJZnJhZ3MuCi0JKGZyYWdfb3Bjb2RlX2ZyYWcsIGZyYWdfb3Bjb2RlX29mZnNldCwgZnJhZ19ic3IpOiBtYWNyb3MgdG8gYWNjZXNzCi0gCU1EIGZpZWxkcyBpbiBmcmFnIHN0cnVjdHVyZS4KLQkoZml4X2ltX2Rpc3AsIGZpeF9iaXRfZml4UCwgZml4X29wY29kZV9mcmFnLCBmaXhfb3Bjb2RlX29mZnNldCwKLSAJZml4X2Jzcik6IG1hY3JvcyB0byBhY2Nlc3MgTUQgZmllbGRzIGluIGZpeCBzdHJ1Y3R1cmUuCi0JKiBjb25maWcvdGMtbnMzMmsuYzogQXZvaWQgb3Zlcmxlbmd0aCBsaW5lcy4gQWxpZ24gY29tbWVudHMuICBEb24ndAotIAl1c2Ugc3RydWN0IG9wY29kZV9sb2NhdGlvbiBhcyB0aGVzZSBmaWVsZHMgYXJlIG5vdyBpbiB0aGUgZnJhZwotCXN0cnVjdHVyZS4KLQkoY29udmVydF9paWYpOiBDYWxsIGZyYWdfbW9yZSBhcyBpdCBpcyBuZWVkZWQgaW5zdGVhZAotIAlvZiB0cnlpbmcgdG8gYWxsb2NhdGUgZm9yIHRoZSB3aG9sZSBpbnNuLiBBdm9pZCBjYWxsIG9mIGZyYWdfbW9yZQotIAl3aXRoIG5lZ2F0aXZlIGFyZ3VtZW50LgotCShtZF9wY3JlbF9hZGp1c3QsIG1kX2ZpeF9wY3JlbF9hZGp1c3QsIG1kX2FwcGx5X2ZpeCwKLQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCwgbWRfcGNyZWxfZnJvbSwKLQl0Y19hb3V0X2ZpeF90b19jaGFycyk6IHVzZSBhY2Nlc3NvciBtYWNyb3MgdG8gZ2V0IG1kIGZpZWxkcyBpbiBmaXgKLSAJYW5kIGZyYWcgc3RydWN0dXJlcy4KLQkoZml4X25ld19uczMyaywgZml4X25ld19uczMya19leHApOiBhZGQgbmV3IGFyZ3VtZW50cyBvcGNvZGVfZnJhZyBhbmQKLQlvcGNvZGVfb2Zmc2V0IGFuZCByZW1vdmUgcGNyZWxfYWRqdXN0LgotCShjb252ZXJ0X2lpZiwgY29uc19maXhfbmV3X25zMzJrKTogY2FsbCBmaXhfbmV3X25zMzJrLAotIAlmaXhfbmV3X25zMzJrX2V4cCB3aXRoIGNoYW5nZWQgYXJndW1lbnRzLgotCi1Nb24gTm92ICAzIDEzOjMwOjE3IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1kX2JlZ2luKTogUmVvcmdhbml6ZSBzZXR0aW5nIG9mIGRlZmF1bHQgdmFsdWVzIHNvCi0JdGhhdCBtaXBzX2NwdSBkZXBlbmRzIG9uIFRBUkdFVF9DUFUsIGFuZCBtaXBzX29wdHMuaXNhIGRlcGVuZHMgb24KLQltaXBzX2NwdS4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVtb3ZlIGFsbCBjb2RlIHRoYXQgc2V0cyBkZWZhdWx0czsgbWRfYmVnaW4KLQloYW5kbGVzIGFsbCBvZiB0aGlzIG5vdy4KLQotU3VuIE5vdiAgMiAxNDo0NjowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChTVEFHRVNUVUZGKTogQ2hhbmdlIGJpbl9QUk9HUkFNUyB0bwotCW5vaW5zdF9QUk9HUkFNUy4KLQkoYm9vdHN0cmFwLCBib290c3RyYXAyLCBib290c3RyYXAzKTogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzIGluIHRoZQotCVRPQyBzZWN0aW9uIHRvIGJlIGFnYWluc3QgdGhlIGNzZWN0LgotCi1GcmkgT2N0IDMxIDE4OjE5OjU1IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jICh2YWxpZGF0ZV9taXBzX2luc24pOiBOZXcgZnVuY3Rpb24sIGNoZWNrcwotCW1hdGNoIHZlcnN1cyBtYXNrIGJpdHMsIGFuZCBhbHNvIHZlcmlmaWVzIHRoYXQgYWxsIGJpdHMgdG8gYmUKLQlvdXRwdXQgYXJlIGFjdHVhbGx5IHNwZWNpZmllZCBzb21ld2hlcmUuCi0JKG1kX2JlZ2luKTogQ2FsbCBpdCBmb3IgMzItYml0IGluc3RydWN0aW9ucywgaW5zdGVhZCBvZiBkb2luZwotCW1hdGNoL21hc2sgY2hlY2sgaGVyZS4gIEluIGNhc2Ugb2YgZmFpbHVyZSwgcHJpbnQgYSBtZXNzYWdlLCBidXQKLQljaGVjayB0aGUgcmVzdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGJlZm9yZSBleGl0aW5nLgotCi1UaHUgT2N0IDMwIDEzOjQ2OjIwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYXBwbHlfZml4Myk6IEZpeCB0aHVtYiBBRFIgcHNldWRvIG9wLiAgUGF0Y2gKLQlmcm9tIFRvbnkgVGhvbXBzb24gYXQgQVJNOiBhdGhvbXBzb0Bhcm0uY29tCi0KLVRodSBPY3QgMzAgMTE6MTE6MjYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBBbGxvdyBvZGQgcmVnaXN0ZXJzIGZvciBsZDJ3IGFuZAotCWZyaWVuZHMuCi0KLUZyaSBPY3QgMjQgMTU6NTY6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogV2hlbiBoYW5kbGluZyBAbCwgYWx3YXlzIHNpZ24KLQlleHRlbmQgaWYgdGhlIG9wZXJhbmQgZXhwZWN0cyBhIHNpZ25lZCB2YWx1ZS4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoTE9DQUxfTEFCRUxTX0RPTExBUik6IERvbid0IGRlZmluZTsgdXNlCi0JZGVmYXVsdCB3aGljaCBpcyB0byBwZXJtaXQgZG9sbGFyIGxhYmVscy4KLQotRnJpIE9jdCAyNCAxMToxOToyMiAxOTk3ICBKYWt1YiBKZWxpbmVrICA8ampAc3Vuc2l0ZS5tZmYuY3VuaS5jej4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX21lbW9yeV9tb2RlbCk6IE5ldyB2YXJpYWJsZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgLVRTTy8tUFNPLy1STU8gb3B0aW9ucy4KLQkobWRfcGFyc2Vfb3B0aW9ucyk6IEhhbmRsZSB0aGVtLgotCShzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IEZvciA2NCBFTEYsIHNldCByZXF1aXJlZAotCW1lbW9yeSBvcmRlcmluZyBpbiBlX2ZsYWdzLiBEZWZhdWx0IHRvIFJNTyBhbmQgbGV0IHRoZSB1c2VyCi0Jb3ZlcnJpZGUgaXQgdGhyb3VnaCBjb21tYW5kIGxpbmUuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyk6IEFkZC4KLQotV2VkIE9jdCAyMiAxNzo0MjoxMiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAodjlhX2Fzcl90YWJsZSk6IE5ldyB2YXJpYWJsZS4KLQkoc3BhcmNfaXApOiBIYW5kbGUgdjlhIGFzcidzLgotCVBhdGNoIGZyb20gRGF2aWQgTWlsbGVyIDxkYXZlbUB2Z2VyLnJ1dGdlcnMuZWR1Pi4KLQotV2VkIE9jdCAyMiAxNzoyMjo1OSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfZG9fYWxpZ24pOiBOZXcgbWFjcm8uCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaGFuZGxlX2FsaWduKTogSGFuZGxlIHJzX2FsaWduX2NvZGUuCi0JUGF0Y2ggZnJvbSBKYWt1YiBKZWxpbmVrIDxqakBzdW5zaXRlLm1mZi5jdW5pLmN6Pi4KLQotV2VkIE9jdCAyMiAxMjo1MToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9zbWFsbCk6IE5ldyB2YXJpYWJsZS4KLQkoT1BUSU9OX1NNQUxMKTogRGVmaW5lLgotCShtZF9sb25nb3B0cyk6IEFkZCAic21hbGwiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgT1BUSU9OX1NNQUxMLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiAtc21hbGwuCi0JKiBjb25maWcvdGMtc2guaCAoc2hfc21hbGwpOiBEZWNsYXJlLgotCShTVUJfU0VHTUVOVF9BTElHTik6IEhhbmRsZSBzaF9zbWFsbC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChUQVJHRVRfRk9STUFUKTogQ2hlY2sgc2hfc21hbGwgaW4gVENfU0gKLQljYXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgY29uc3RhbnQgaW4gTV9MSV9ECi0JY2FzZSBpbiBsaXR0bGUgZW5kaWFuIG1vZGUuCi0KLVR1ZSBPY3QgMjEgMTA6MjA6MTEgMTk5NyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX2FwcGx5X2ZpeDMsIGNhc2VzIC4uLl9INDQsIC4uLl9ISVgyMik6IExlYXZlCi0Jb3ZlcmZsb3cgc2lnbmFsbGluZyB0byBsaW5rZXIuCi0KLU1vbiBPY3QgMjAgMTQ6NTQ6MDYgMTk5NyAgS2xhdXMgSyJhbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogRml4IGZvciBkZWMgYy4KLQotCSogY29uZmlnLWdhcy5jb206IEdpdmUgZXhwbGFuYXRpb24gZm9yIGRlYyBjIHNldHVwIGluIGVycm9yCi0JbWVzc2FnZS4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IE1ha2UgLmNvbW0gc3ltYm9scyBzZXBhcmF0ZQotCXNlY3Rpb25zIG9uIG9wZW52bXMvYWxwaGEuCi0KLQkqIGNvbmZpZy9vYmotZXZheC5jOiBzdXBwb3J0IC53ZWFrIHBzZXVkby1vcAotCi1Nb24gT2N0IDIwIDEwOjEzOjMyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChkZWZhdWx0X2FyY2hfc2l6ZSk6IE5ldyBzdGF0aWMgbG9jYWwuCi0JKHN0cnVjdCBzcGFyY19hcmNoKTogUmVuYW1lIGFyY2hfc2l6ZSB0byBkZWZhdWx0X2FyY2hfc2l6ZS4KLQlOZXcgbWVtYmVyIHVzZXJfb3B0aW9uX3AuCi0JKHNwYXJjX2FyY2hfdGFibGUpOiBBbHdheXMgaW5jbHVkZSB2OSwgdjlhLiAgTmV3IGVudHJ5IHY5LTY0LgotCShpbml0X2RlZmF1bHRfYXJjaCk6IENoZWNrIHdoZXRoZXIgZGVmYXVsdCBhcmNoIGlzIHZhbGlkLgotCVNldCBkZWZhdWx0X2FyY2hfc2l6ZSBpbiBhZGRpdGlvbiB0byBzcGFyY19hcmNoX3NpemUuCi0JKE9QVElPTl8zMixPUFRJT05fNjQpOiBEZWZpbmUuCi0JKG1kX2xvbmdvcHRzKTogTmV3IGVudHJpZXMgZm9yIC0zMiwgLTY0LgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgdGhlbS4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IHRoZW0uICBFbnN1cmUgaW5pdF9kZWZhdWx0X2FyY2ggY2FsbGVkLgotCSogY29uZmlndXJlLmluIChzcGFyYzY0KTogU2V0IGFyY2ggdG8gdjktNjQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1TdW4gT2N0IDE5IDEzOjUwOjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoc3Vic2Vnc19maW5pc2gpOiBOZXcgZnVuY3Rpb24sIGJyb2tlbiBvdXQgb2YKLQl3cml0ZV9vYmplY3RfZmlsZS4KLQkod3JpdGVfb2JqZWN0X2ZpbGUpOiBTb21lIGNvZGUgbW92ZXMgaW50byBzdWJzZWdzX2ZpbmlzaC4KLQkqIHdyaXRlLmMgKHN1YnNlZ3NfZmluaXNoKTogRGVjbGFyZS4KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHN1YnNlZ3NfZmluaXNoLgotCi0JKiByZWFkLmMgKHNfaW5jbHVkZSk6IENoZWNrIGZvciBlcnJvciByZXR1cm4gZnJvbQotCWRlbWFuZF9jb3B5X3N0cmluZy4KLQotVHVlIE9jdCAxNCAyMDo1MDo1OCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGdldF9saW5lX3NiKTogQWNjZXB0IGFueSBlb2wgbWFya2VyIHdoaWxlIHNjYW5uaW5nIG1hY3Jvcy4KLQotVHVlIE9jdCAxNCAxOToxMjo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuaCAoRElGRl9FWFBSX09LKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWFscGhhLmMgKG1kX2FwcGx5X2ZpeCk6IE5vdGljZSBmeF9wY3JlbCBhbmQgc3Vic3RpdHV0ZQotCXRoZSBjb3JyZWN0IHJlbG9jYXRpb24gd2hlbiBpdCBleGlzdHMuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hcHBseV9maXgzKTogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0JKiBjb25maWcvdGMtdjg1MC5oOiBMaWtld2lzZS4KLQotRnJpIE9jdCAxMCAxNjowOTozNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogQWxsb3cgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gaXNzdWUKLSAJd2hlbiBzZWNvbmQgaW5zdHJ1Y3Rpb24gaXMgd3JpdGluZyB0byBmaXJzdCBpbnN0cnVjdGlvbnMgaW5wdXRzLgotCQotTW9uIE9jdCAxMyAxNToyNzoxNyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChQQUdFX1NJWkUpOiBEb3VibGUgdG8gOGsgYXMgYSBoYWNrIHRvIGFsbG93IHNvbWUgQysrCi0JdGVtcGxhdGVkIHByb2dyYW1zIHRvIGJ1aWxkIHdpdGggLWcuCi0KLUZyaSBPY3QgMTAgMTc6NDg6MjkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfcmVsYXhfdGFibGUpOiBBZGQgc3VwcG9ydCBmb3IgcmVsYXhpbmcKLQl1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgVGhpcyBwYXRjaCBpcyBjb3VydGVzeSBvZiBKaW0gV2lsc29uLiAKLQkobWRfY29udmVydF9mcmFnKTogRml4IHJlbGF4aW5nIG9mIGJyYW5jaGVzLiAgVGhpcyBwYXRjaCBpcwotCWNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uCi0JKG1kX2Fzc2VtYmxlKTogQ3JlYXRlIGRpZmZlcmVudCBmaXh1cHMgZm9yIGNvbmRpdGlvbmFsIGFuZAotCXVuY29uZGl0aW9uYWwgYnJhbmNoZXMuICBUaGlzIHBhdGNoIGlzIGNvdXJ0ZXN5IG9mIEppbSBXaWxzb24uCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogRXN0aW1hdGUgc2l6ZSBvZiB2YXJpYWJsZSBwYXJ0IG9mCi0JZml4dXAgYmFzZWQgb24gd2hldGhlciBpdCBpcyBmb3IgYSBjb25kaXRpb25hbCBvciBhbiB1bmNvbmRpdGlvbmFsCi0JYnJhbmNoLiAgVGhpcyBwYXRjaCBpcyBjb3VydGVzeSBvZiBKaW0gV2lsc29uLgotCSh2ODUwX3NkYXRhLCB2ODUwX3RkYXRhLCB2ODUwX3pkYXRhLCB2ODUwX3Nic3MsIHY4NTBfdGJzcywKLQl2ODUwX3pic3MsIHY4NTBfcm9zZGF0YSwgdjg1MF9yb3pkYXRhLCB2ODUwX2Jzcyk6IEFkZCBjYWxsIHRvCi0Jb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCkuIAotCSh2ODUwX2NvbW0pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZCBuZXcgcHNldWRvIG9wcyAuemNvbW0sIC5zY29tbSBhbmQgLnRjb21tLgotCShtZF9iZWdpbik6IEFkZCBic3MgZmxhZyB0byBzZWdfaW5mbyBvZiBic3Mgc2VjdGlvbnMuCi0KLQlBZGQgc3VwcG9ydCBmb3IgLnNjb21tb24sIC50Y29tbW9uIGFuZCAuemNvbW1vbiBzZWN0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBBZGQgLnNjb21tb24sCi0JLnpjb21tb24sIC50YnNzLCAuY2FsbF90YWJsZV9kYXRhIGFuZCAuY2FsbF90YWJsZV90ZXh0LgotCi1GcmkgT2N0IDEwIDE1OjAxOjE0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMpOiBTZXQgREVGQVVMVF9BUkNIIGZyb20gY29ycmVjdCB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1GcmkgT2N0IDEwIDExOjIyOjQ1IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXhlcyB0byBtYWtlIHN1cmUgdGhlIEFUX1dPUkQKLQlleHByZXNzaW9uIGlzIG5vdCBjb25mdXNlZCB3aXRoIC0xLgotCi1GcmkgT2N0IDEwIDExOjU0OjUwIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBGbGFnIFNQIGFzIG1vZGlmaWVkIGZvciBALXNwCi0gCW9wZXJhbmQgLSBPUEVSQU5EX0FUTUlOVVMuCi0KLUZyaSBPY3QgMTAgMDA6NDc6NDQgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogTm90ZSB0aGF0IGF1dG8gaW5jcmVtZW50IGFuZAotCWRlY3JlbWVudCBtb2RpZnkgdGhlIGluZGV4IHJlZ2lzdGVyLgotCi1UaHUgT2N0ICA5IDE1OjE3OjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUm9iaW4gS2lya2hhbSA8Um9iaW4uS2lya2hhbUBtbGIuZG10LmNzaXJvLmF1PjoKLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGFyY2hzKTogQWRkIDY4MzA2LCA2ODMwNywgNjgzMjIsIDY4MzU2LCA2ODMzNCwKLQk2ODMzNiwgNjgzNDEsIDY4MzQ5LgotCSogZG9jL2MtbTY4ay50ZXhpIChNNjhLLU9wdHMpOiBBZGQgLW02OGVjMDAwIC1tNjhoYzAwMCAtbTY4aGMwMDEKLQktbTY4MzA2LCAtbTY4MzA3LCAtbTY4MzIyLCAtbTY4MzU2LCAtbTY4ZWMwMjAsIC1tNjhlYzAzMCwKLQktbTY4ZWMwNDAsIC1tNjhlYzA2MCwgLW02ODMzMCwgLW02ODMzNCwgLW02ODMzNiwgLW02ODM0MSwKLQktbTY4MzQ5LgotCi0JKiBkb2MvTWFrZWZpbGUuYW0gKENQVV9ET0NTKTogRGVmaW5lLgotCShhcy5pbmZvKTogRGVwZW5kIHVwb24gJChDUFVfRE9DUykuCi0JKiBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUmVtb3ZlIEFNX1BST0dfSU5TVEFMTDsgaXQncyBjYWxsZWQgYnkKLQlBTV9JTklUX0FVVE9NQUtFLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgT2N0ICA5IDAxOjQ0OjM2IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIHRjLWQxMHYuaCAoVENfU1RBUlRfTEFCRUwpOiBEb24ndCBkZWZpbmUuCi0JKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0KLVRodSBPY3QgIDkgMDA6MDc6MjMgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAod3JpdGVfMl9zaG9ydCk6IEZpeCBidWcgdGhhdCB3b3VsZG4ndCBhbGxvdwotCXRvIHBhaXIgYSBicmFuY2ggYW5kIGxpbmsgd2l0aCBhbnl0aGluZyBidXQgYW4gZXhlIGluc3RydWN0aW9uLgotCi1XZWQgT2N0ICA4IDE2OjI4OjUzIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChsb2FkX2V4cHJlc3Npb24pOiBEaXNhYmxlIHRoZSBzeW0rY29uc3QgLmdvdAotCW9wdGltaXphdGlvbiB0byByZWR1Y2UgdGhlIGFsaWdubWVudCBzdXJwcmlzZXMgZm9yIGdjYy4KLQotV2VkIE9jdCAgOCAxNjoxMToxNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoVENfU1BBUkMpOiBEb24ndCBkZWZpbmUgVEFSR0VUX0ZPUk1BVC4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY190YXJnZXRfZm9ybWF0KTogSGFuZGxlIGNvZmYgaGVyZS4KLQkoc3BhcmNfaXApOiBBZGQgJWhpeCwlbG94LgotCShtZF9hcHBseV9maXgzKTogQ2FsbCBhc19iYWRfd2hlcmUsIG5vdCBhc19iYWQuCi0JQWRkIHN1cHBvcnQgZm9yIEJGRF9SRUxPQ19TUEFSQ197SElYMjIsTE9YMTB9LgotCSh0Y19nZW5fcmVsb2MpOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DX1NQQVJDX3tISVgyMixMT1gxMH0uCi0KLVdlZCBPY3QgIDggMTI6MzM6MzIgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgYWxwaGEtKi0qIHRvIGFscGhhKi0qLSo7IGNvbmZpZy5ndWVzcyBub3cKLQlyZWNvZ25pemVzIGFscGhhZXY1IGV0Yy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIE9jdCAgOCAwMDowNDowNSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBSZXBsYWNlIHRoZSBUQVJHRVRfQ1BVIHZhbHVlCi0Jb2YgbWlwc3IzOTAwIHdpdGggbWlwc3R4MzkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCBwcmludCB0aGUgJ29wY29kZSByZXF1aXJlcyAKLQktbWlwc1hYIG1lc3NhZ2UnIGlmIHRoZSBpbnNuIGlzbid0IGFuIElTQSBpbnNuLgotCi1UdWUgT2N0ICA3IDEyOjQ4OjMwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUIHN1cHBvcnQpOiBNb3ZlZCB0byB0Yy1zcGFyYy5jLgotCVJlZGVmaW5lIFRBUkdFVF9GT1JNQVQgdG8gY2FsbCBzcGFyY190YXJnZXRfZm9ybWF0LgotCSogY29uZmlnL3RjLXNwYXJjLmMgKGluX3Vuc2lnbmVkX3JhbmdlKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19hcmNoX3NpemUpOiBNYWtlIHN0YXRpYy4KLQkoc3BhcmNfdGFyZ2V0X2Zvcm1hdCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBEZWxldGUgdmFyaWFibGUgaW1tZWRpYXRlX21heC4gIFJld3JpdGUgJWhpL2V0YyByZWxvYwotCWhhbmRsaW5nLiAgQWRkIHN1cHBvcnQgZm9yICVoaCwlaG0sJWxtLCVoNDQsJW00NCwlbDQ0LgotCShvdXRwdXRfaW5zbik6IFNldCBgZnhfbm9fb3ZlcmZsb3cnLgotCShtZF9hcHBseV9maXgzKTogSGFuZGxlIEJGRF9SRUxPQ19TUEFSQ197NyxINDQsTTQ0LEw0NH0uCi0JKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1Nb24gT2N0ICA2IDE0OjA0OjUwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfc2VjdGlvbik6IFJlbW92ZS4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogRW5oYW5jZSBlcnJvciBtZXNzYWdlLgotCi1GcmkgT2N0ICAzIDE1OjQwOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kZWYgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMgYmVmb3JlCi0JaW5jbHVkaW5nIG9iai1lbGYuaCBpbiBPQkpfTUFZQkVfRUxGIGNhc2UuCi0JKG1pcHNfdGFyZ2V0X2Zvcm1hdCk6IFJldHVybiBOVUxMIGFmdGVyIGFib3J0IHRvIGF2b2lkIHdhcm5pbmcuCi0KLQkqIGVjb2ZmLmMgKGdlbmVyYXRlX2Vjb2ZmX3N0YWIpOiBSZW1vdmUgdW51c2VkIHN0YXRpYyBmdW5jdGlvbi4KLQotCSogZXhwci5jIChvcGVyYXRvcik6IEFjY2VwdCA9PS4gIEZyb20gQW5kZXJzIEJsb21kZWxsCi0JPGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZT4uCi0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYyAoZ2VuX3RvX3dvcmRzKTogV2hlbiBnZW5lcmF0aW5nIGEgZGVub3JtYWwKLQludW1iZXIsIGhhbmRsZSBhbiBvdmVyZmxvdyBpbnRvIHRoZSBzbWFsbGVzdCBub3JtYWxpemVkIG51bWJlci4KLQotTW9uIFNlcCAyOSAxNToyNDo1MiAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGFzLmgsIGlucHV0LXNjcnViLmMgKG5ld19sb2dpY2FsX2xpbmUpOiBOZXcgcmV0dXJuIHZhbHVlLgotCSogcmVhZC5jIChzX2FwcF9maWxlKTogRG9uJ3Qgbm90ZSB0aGUgc2FtZSBmaWxlIHNldmVyYWwgdGltZXMKLQlpbiBhIHJvdy4KLQotVGh1IFNlcCAyNSAxMzowODowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZW1vdmUgYCBvcGVyYW5kIHNwZWNpZmllci4KLQotV2VkIFNlcCAyNCAxNjo1NDo0MCAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbiAoc2gqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBzaC0qLWVsZiouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBTZXAgMjQgMTE6MzA6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSGFuZGxlIHEgYW5kIHYgb3BlcmFuZCBzcGVjaWZpZXJzLgotCi0JKiBkb2MvYy1pMzg2LnRleGkgKGkzODYtRmxvYXQpOiBSZW1vdmUgaW5jb3JyZWN0IGFzc2VydGlvbiB0aGF0Ci0JZm4qIGluc3RydWN0aW9ucyBkbyBub3QgaW5zZXJ0IGltcGxpY2l0IGZ3YWl0LiAgVGhpcyB3YXMgY2hhbmdlZAotCUphbiAyOSwgMTk5Ni4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAoeXlsZXgpOiBQZXJtaXQgYW4gZXhwcmVzc2lvbiB0byBiZSB1c2VkIGZvcgotCXRoZSBzY2FsZSBmYWN0b3IuCi0KLQkqIE1ha2VmaWxlLmFtIChFWFRSQV9hc19uZXdfU09VUkNFUyk6IFNldCB0byBjb25maWcvbTY4ay1wYXJzZS55LAotCW5vdCBtNjhrLXBhcnNlLnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgU2VwIDIzIDE3OjQ4OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogQ2xlYXIgbXJpX3N0YXRlIGF0IGVuZCBvZiAubXJpCi0JcHNldWRvLW9wLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChoaWxvX2ludGVybG9ja3MpOiBDaGFuZ2UgZnJvbSBhIHN0YXRpYwotCXZhcmlhYmxlIHRvIGEgbWFjcm8sIHNvIHRoYXQgaXQgdmFyaWVzIHdpdGggdGhlIHZhcmlhYmxlcyB1cG9uCi0Jd2hpY2ggaXQgZGVwZW5kcy4KLQkoZ3ByX2ludGVybG9ja3MsIGNvcF9pbnRlcmxvY2tzKTogTGlrZXdpc2UuCi0JKG1kX2JlZ2luKTogRG9uJ3QgaW5pdGlhbGl6ZSB0aGVtLgotCi1GcmkgU2VwIDE5IDE3OjA4OjQxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBVc2Ugc3RyY2FzZWNvbXAgaW5zdGVhZAotCW9mIHN0cmNtcCB3aGVyZSBhcHByb3ByaWF0ZS4KLQotVGh1IFNlcCAxOCAxNDoxMTo1NiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvcGUgd2l0aCBhIHplcm8gZGF0YSBhcmVhCi0JcmVsb2NhdGlvbiB3aXRoIGEgY29uc3RhbnQgb2Zmc2V0LgotCShtZF9hc3NlbWJsZSk6IFByb2R1Y2UgZXJyb3IgbWVzc2FnZSB3aGVuIHNwZWNpYWwgZGF0YSBhcmVhCi0JcmVsb2NhdGlvbnMgYXJlIHVzZWQgb24gaW5zdHJ1Y3Rpb25zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZW0uCi0JKG1kX2Fzc2VtYmxlKTogUmVzZXQgcHJvY2Vzc29yIG1hc2sgaWYgZGVmaW5lZCBieSBjb21tYW5kIGxpbmUKLQlzd2l0Y2guIAotCi1UaHUgU2VwIDE4IDExOjI0OjAxIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jOiBSZW9yZ2FuaXplIGZpbGUuCi0JKHBhcnNlX2tleXdvcmRfYXJnKTogQWxsb3cgbnVtYmVycyBpbiByZWcgbmFtZXMuCi0JKFNQRUNJQUxfQ0FTRV9OT05FKTogTmV3IG1hY3JvLgotCShtZF9hc3NlbWJsZSk6IFVzZSBpdC4KLQkobG9va3VwX2FyY2gsaW5pdF9kZWZhdWx0X2FyY2gpOiBOZXcgZnVuY3Rpb25zLgotCShkZWZhdWx0X2FyY2gsZGVmYXVsdF9pbml0X3Asc3BhcmNfYXJjaF90YWJsZSk6IE5ldyBzdGF0aWMgbG9jYWxzLgotCShzcGFyY19hcmNoX3NpemUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtYXhfYXJjaGl0ZWN0dXJlKTogSW5pdGlhbGl6ZSBpbiBpbml0X2RlZmF1bHRfYXJjaC4KLQkobWRfcGFyc2Vfb3B0aW9ucyk6IENhbGwgaW5pdF9kZWZhdWx0X2FyY2ggaWYgbmVjZXNzYXJ5LgotCVJld3JpdGUgLXhhcmNoLy1BIHByb2Nlc3NpbmcuCi0JKG1kX3Nob3dfdXNhZ2UpOiBQcmludCAtQSB2YWx1ZXMgZnJvbSBzcGFyY19hcmNoX3RhYmxlLgotCShtZF9iZWdpbik6IENhbGwgaW5pdF9kZWZhdWx0X2FyY2ggaWYgbmVjZXNzYXJ5LgotCShzcGFyY19tZF9lbmQpOiBIYW5kbGUgYm90aCAzMiBhbmQgNjQgYml0IGVudmlyb25tZW50cy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oIChUQVJHRVRfRk9STUFUKTogTGlrZXdpc2UuCi0JKiBhY2NvbmZpZy5oIChTUEFSQ19WOSxTUEFSQ19BUkNINjQpOiBEZWxldGUuCi0JKERFRkFVTFRfQVJDSCk6IEFkZC4KLQkqIGNvbmZpZy5pbjogUmVnZW5lcmF0ZS4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMpOiBEZWZhdWx0IERFRkFVTFRfQVJDSCBiYXNlZCBvbiB0YXJnZXQgY3B1LgotCShTUEFSQ19WOSxTUEFSQ19BUkNINjQpOiBEZWxldGUuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBjb25maWcvdm1zLWNvbmYuaCAoU1BBUkNfVjksU1BBUkNfQVJDSDY0KTogRGVsZXRlLgotCi1XZWQgU2VwIDE3IDE2OjU0OjIwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogUmVjb2RlZCB0byB1c2UgQ0hFQ0tfICgpCi0JbWFjcm8uIAotCShoYW5kbGVfdGRhb2ZmLCBoYW5kbGVfemRhb2ZmLCBoYW5kbGVfc2Rhb2ZmKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0ZWQgdHlwby4KLQkqIGNvbmZpZy90Yy12ODUwLmMgQWRkIG5ldyBzZWN0aW9uczogY2FsbF90YWJsZV9kYXRhIGFuZAotCWNhbGxfdGFibGVfdGV4dC4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBBZGQgc3VwcG9ydCBmb3IgY3RvZmYoKSByZWxvY2F0aW9uIHByZWZpeC4gCi0JKGhhbmRsZV9jdG9mZik6IE5ldyBGdW5jdGlvbi4KLQotCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBEb2N1bWVudCBjYWxsIHRhYmxlIHJlbG9jYXRpb25zLgotCi1UdWUgU2VwIDE2IDE0OjE4OjIyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHY4NTBfcmVsb2NfcHJlZml4KTogQWRkIHN1cHBvcnQgZm9yIGEgMTYgYml0Ci0JZGlzcGxhY2VtZW50IGZyb20gdGhlIHRpbnkgZGF0YSBhcmVhIHBvaW50ZXIuCi0KLU1vbiBTZXAgMTUgMjE6Mjg6MDkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChmaXhfbmV3X2hwcGEpOiBNYWtlIGRlY2xhcmF0aW9uIG1hdGNoCi0JZGVmaW5pdGlvbi4KLQotTW9uIFNlcCAxNSAxODozMzowNiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChwcm9jZXNzb3JfbWFzayk6IE5ldyB2YXJpYWJsZS4KLQkoc2V0X21hY2hpbmUsIG1kX3BhcnNlX29wdGlvbik6IFNldCBwcm9jZXNzb3JfbWFzay4KLQkobWRfYXNzZW1ibGUpOiBDaGVjayB0aGF0IGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSB0byB0YXJnZXQKLQlwcm9jZXNzb3IuIAotCi0JKiBjb25maWcvdGMtdjg1MC5oIChUQVJHRVRfUFJPQ0VTU09SKTogTmV3IGNvbnN0YW50LgotCi1Nb24gU2VwIDE1IDExOjI4OjA0IDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gd29yayBmcm9tIE1hcnRpbiBIdW50OgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChidWlsZF9pbnNuKTogRm9yIG12ZnN5cyBhbmQgbXZ0c3lzLAotCUNSIGlzIDAgZm9yIFBTV0wgYW5kIFBTV0guCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGRvX2Fzc2VtYmxlKTogRG9uJ3QgYWNjZXB0Ci0JaWxsZWdhbCBjb25kaXRpb24gY29kZXMgZm9yIGNtcHUgaW5zdHJ1Y3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmM6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfRDMwVl85X1BDUkVMCi0JdXNlZCBpbiBkKmkgaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChjaGVja19zaXplKTogTmV3IGZ1bmN0aW9uLiAgQ2hlY2sKLQlyZWxvY2F0aW9ucyBmb3Igb3ZlcmZsb3dzLgotCShtZF9wY3JlbF9mcm9tX3NlY3Rpb24pOiBGaXggcmVsb2NhdGlvbnMgYmV0d2VlbiBzZWN0aW9ucy4KLQkobWRfYXBwbHlfZml4Myk6IFVzZSBuZXcgcmVsb2NhdGlvbiB0eXBlcyBmb3IgMTUgYW5kIDIxCi0JYml0IHJlbG9jYXRpb25zIGluIHRoZSByaWdodCBjb250YWluZXIuIE5lZWRlZCBiZWNhdXNlCi0JdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBlaWdodC1ieXRlIGFsaWduZWQKLQlidXQgdGhlIHJlbG9jYXRpb25zIG11c3QgYmUuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBDaGVjayBmb3Igb3ZlcmZsb3cuCi0JKGZpbmRfZm9ybWF0KTogSWYgIi5zIiBvciAiLmwiIGFyZSB1c2VkLCBkb24ndCB0cnkKLQl0byBjb21wdXRlIGJyYW5jaCBzaXplcy4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoZG9fYXNzZW1ibGUpOiBDaGVjayBmb3IgIi5zIiBvcgotCSIubCIgZXh0ZW5zaW9ucyB0byBvcGNvZGUgbmFtZXMuCi0JKGZpbmRfZm9ybWF0KTogR2VuZXJhdGUgdGhlIGNvcnJlY3QgaW5zdHJ1Y3Rpb25zIHdoZW4KLQkiLnMiIG9yICIubCIgYXJlIHVzZWQuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKGJ1aWxkX2luc24pOiBDaGVjayBmb3Igb2RkIHJlZ2lzdGVycwotCW9uIGluc3RydWN0aW9ucyB0aGF0IHJlcXVpcmUgZXZlbiByZWdpc3RlcnMuCi0KLQkqIGNvbmZpZy90Yy1kMzB2LmggKG1kX3N0YXJ0X2xpbmVfaG9vayk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX3N0YXJ0X2xpbmVfaG9vayk6IE5ldyBob29rLgotCUNoZWNrcyB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBmb3IgYSAiLiIuICBJZiBpdAotCWZpbmRzIG9uZSwgYXNzdW1lIGEgcHNldWRvLW9wIGFuZCBmbHVzaCBhbnkgdW53cml0dGVuCi0JaW5zdHJ1Y3Rpb25zLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChtZF9hcHBseV9maXgzKTogRml4IHByb2JsZW0KLQl3aXRoIGRldGVybWluaW5nIHdoZW4gZml4dXBzIHdlcmUgZG9uZS4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEZpeCBidWcgd2hlcmUgdGhlIG51bWVyaWMKLQlwYXJ0IG9mIGEgc3ltYm9sIChmb3IgZXhhbXBsZSwgImZvbys4Iikgd2FzIGJlaW5nIHdyaXR0ZW4KLQlpbnRvIHRoZSBpbnN0cnVjdGlvbi4KLQkobWRfcHNldWRvX3RhYmxlKTogQ2hhbmdlIC53b3JkIHRvIGJlIDMyIGJpdHMgYW5kIGFkZAotCS5od29yZCBhcyAxNiBiaXRzLgotCi0JKiBjb25maWcvdGMtZDMwdi5jIChwYXJhbGxlbF9vayk6IENoZWNrIHRvIHNlZSBpZiBmaXJzdAotCWluc3RydWN0aW9uIGlzIGEganVtcC4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAocGFyYWxsZWxfb2spOiBNYWpvciBjb2RlIHJlb3JnYW5pemF0aW9uLgotCi1XZWQgU2VwIDEwIDEwOjA3OjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogQ29ycmVjdGVkIHNwZWxsaW5nIG1pc3Rha2UuCi0JKiBjb25maWd1cmUuaW4gKGVtdWxhdGlvbnMpOiBBZGQgdjg1MCBlbXVsYXRpb24uCi0KLVR1ZSBTZXAgIDkgMTc6MTQ6MzMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKENQVV9UWVBFUyk6IEFkZCBhcmMuCi0JKFRBUkdFVF9DUFVfQ0ZJTEVTKTogQWRkIHRjLWFyYy5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCB0Yy1hcmMuaC4KLQkoZGVwZW5kZW5jaWVzKTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXJjLSotZWxmKi4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcvdGMtYXJjLltjaF06IE5ldyBmaWxlcy4KLQotVHVlIFNlcCAgOSAxMDoxOTozNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IERvY3VtZW50IGhpMCgpIHJlbG9jIHByZWZpeC4KLQlDb3JyZWN0IGRlc2NyaXB0aW9uIG9mIGhpKCkgcmVsb2MgcHJlZml4LgotCi0JKiBkb2MvYy12ODUwLnRleGkgKFY4NTAgT3Bjb2Rlcyk6IERvY3VtZW50IG5ldyByZWxvYyBwcmVmaXguCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IEFkZCBoaWxvKCkgcmVsb2MgcHJlZml4LgotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3IgQkZEX1JFTE9DXzMyLgotCi0JKiBkb2MvYy12ODUwLnRleGk6IERvY3VtZW50IG5ldyBwc2V1ZG8gb3BzIGFuZCBjb21tYW5kIGxpbmUKLQlvcHRpb25zLgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChzZXRfbWFjaGluZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKC52ODUwKTogTmV3IHBzZXVkbyBvcC4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKC52ODUwZSk6IE5ldyBwc2V1ZG8gb3AuCi0JKiBjb25maWcvdGMtdjg1MC5jICgudjg1MGVhKTogTmV3IHBzZXVkbyBvcC4KLQkKLQotTW9uIFNlcCAgOCAyMzowODowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IC1hbGggYW5kIC1hbGQgZm9yIERXQVJGIDE6Ci0JKiBsaXN0aW5nLmMgKHN0cnVjdCBsaXN0X2luZm9fc3RydWN0KTogQWRkIGRlYnVnZ2luZyBmaWVsZC4KLQkobGlzdGluZ19uZXdsaW5lKTogSW5pdGlhbGl6ZSB0aGUgZGVidWdnaW5nIGZpZWxkLiAgSWYgRUxGLCBpZiB0aGUKLQlzZWN0aW9uIHN0YXJ0cyB3aXRoIC5kZWJ1ZyBvciAubGluZSwgc2V0IHRoZSBkZWJ1Z2dpbmcgZmllbGQgaW4KLQl0aGUgbGlzdGluZyBzdHJ1Y3R1cmUuCi0JKGRlYnVnZ2luZ19wc2V1ZG8pOiBBZGQgbGlzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBJZgotCXRoZSBkZWJ1Z2dpbmcgZmllbGQgaXMgc2V0LCBjb25zaWRlciBpdCB0byBiZSBhIGRlYnVnZ2luZyBwc2V1ZG8uCi0JSWYgRUxGLCBza2lwIGJsYW5rIGxpbmVzIGJldHdlZW4gZGVidWdnaW5nIGxpbmVzLgotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBJZiBFTEYsIGxvb2sgZm9yIGxpbmUgbnVtYmVycy4KLQkoc3RyaW5nZXIpOiBJZiBFTEYsIGxvb2sgZm9yIGZpbGUgbmFtZXMuCi0KLU1vbiBTZXAgIDggMTI6MzM6NDAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9pbnNlcnRfb3BlcmFuZCk6IE9ubHkgdGVzdCBmb3Igb3ZlcmZsb3cKLQlpZiB0aGVyZSBpcyBubyBpbnNlcnQgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy12ODUwLmggKFRBUkdFVF9NQUNISU5FKTogTmV3IGNvbnN0YW50LgotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX2luc2VydF9vcGVyYW5kKTogQWRkCi0JLW13YXJuX3Vuc2lnbmVkX292ZXJmbG93LiAKLQkobWRfYmVnaW4pOiBTZXQgQkZEIG1hY2hpbmUgbnVtYmVyIGJhc2VkIG9uIG1hY2hpbmUgdmFyaWFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCAtbXY4NTAsIC1tdjg1MGUgYW5kIC1tdjg1MGVhIG9wdGlvbnMuCi0KLU1vbiBTZXAgIDggMTE6MjA6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oOiBEb24ndCBkZWNsYXJlIGFsbG9jYSBpZiBpdCBpcyBhIG1hY3JvLgotCSogbWFjcm8uYzogTGlrZXdpc2UuCi0KLVN1biBTZXAgIDcgMDA6MzA6MTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZy90Yy1hbHBoYS5jIChtZF9wYXJzZV9vcHRpb24pOiBNb3ZlIG1bXSBvdXQgdG8gdG9wIGxldmVsIGFuZAotICAgICAgICByZW5hbWUgdG8gY3B1X3R5cGVzW10uCi0gICAgICAgIChzX2FscGhhX2FyY2gpOiBOZXcgZnVuY3Rpb24uCi0gICAgICAgIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImFyY2giLgotCi0gICAgICAgICogY29uZmlnL3RjLWFscGhhLmMgKG1kX2JlZ2luKTogTWVyZ2UgdGhlIHR3byBsb29wcyB0aHJvdWdoIHRoZQotICAgICAgICBvcGNvZGUgdGFibGUuCi0gICAgICAgIChzX2FscGhhX3Byb2MpOiBBZGQgaW5pdGlhbCBTS0lQX1dISVRFU1BBQ0UuCi0gICAgICAgIChzX2FscGhhX3NldCk6IExpa2V3aXNlLiAgVXNlIGdldF9zeW1ib2xfZW5kIGluc3RlYWQgbG9jYWwgd2hpbGUgbG9vcC4KLQotU2F0IFNlcCAgNiAxOTozODoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogcmVhZC5oIChzX2xjb21tX2J5dGVzKTogQWRkIHByb3RvdHlwZSAoZm9yIHJlYWwgdGhpcyB0aW1lKS4KLQotVGh1IFNlcCAgNCAxMjoxMDowMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9mcm9iX3N5bWJvbCk6IE9ubHkgc2V0IEJTRl9PQkpFQ1QgZm9yCi0Jc3ltYm9scyBvbiBJcml4LgotCi1XZWQgU2VwICAzIDExOjIxOjMzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBCRkRfUkVMT0NfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAxODozMjozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgYXJleAotCXJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLCBub3QgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogU2ltaWxhcmx5LgotCi1UdWUgU2VwICAyIDE1OjU4OjUyIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLXY4NTAudGV4aTogRXhwbGFuYXRpb25zIG9mIG9mZnNldHMgaW4gU0RBL1pEQSBhcmVhcwotCWNvcnJlY2V0ZC4gCi0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEFkZCBzdXBwb3J0IGZvciBTREEvVERBL1pEQSBzZWN0aW9ucy4KLQkodjg1MF9yZWxvY19wcmVmaXgpOiBEdXBsaWNhdGUgY29kZSBlbGltaW5hdGVkLiAgQWRkIGNvZGUgdG8KLQlyZWNvZ25pc2Ugc3BlY2lhbCBpbnN0cnVjdGlvbnMuCi0JKG1kX2Fzc2VtYmxlKTogQ2FsY3VsYXRpb24gb2YgdGhlIHNpemUgb2YgYSBmaXh1cHMgY29ycmVjdGVkLgotCi0JKiBjb25maWcvdGMtdjg1MC5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IEFkZCBTREEvVERBL1pEQQotCXNlY3Rpb25zLiAJCi0KLVR1ZSBTZXAgIDIgMTU6NDA6NTYgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IFVzZSBvcGNvZGUtPm5hbWUgaW5zdGVhZCBvZgotIAlvcGNvZGUtPm9wY29kZSBhcyB0aGUgc2VudGluYWwuIFplcm8gaXMgYSB2YWxpZCBvcGNvZGUuCi0KLVR1ZSBBdWcgMjYgMTY6NTE6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYXMudGV4aW5mbyAoTWFjaGluZSBEZXBlbmRlbmNpZXMpOiBBZGQgdjg1MCB0byBtZW51LgotCSogZG9jL2Mtdjg1MC50ZXhpOiBDaGFuZ2Ugbm9kZSBuYW1lIHRvIG1hdGNoIG90aGVyIGNoYXB0ZXIgbm9kZXMuCi0KLVR1ZSBBdWcgMjYgMDk6NDY6MjIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZG9jL2Mtdjg1MC50ZXhpIChWODUwIE9wY29kZXMpOiBDb3JyZWN0IG5hbWUgZm9yIHRpbnkgZGF0YSBhcmVhCi0JcG9pbnRlci4gCi0KLVR1ZSBBdWcgMjYgMTI6MjM6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKGludGVnZXJfY29uc3RhbnQpOiBJZiBCRkQ2NCwgZG9uJ3QgbWFrZSBhIGJpZ251bSBpZiB0aGUKLQludW1iZXIgd2lsbCBmaXQgaW4gNjQgYml0cy4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IENoZWNrIGV4cGxpY2l0bHkgZm9yIE9fYmlnLAotCXJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLQkqIGFzLmg6IERvbid0IGRlZmluZSBhbGxvY2EgaWYgX19HTlVDX18uICBKdXN0IGRlY2xhcmUgaXQuCi0JKiBtYWNyby5jOiBDb3B5IGFsbG9jYSBoYW5kbGluZyBmcm9tIGFzLmguCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKGkzODZfYWxpZ25fY29kZSk6IENvcnJlY3QgMTYgYml0IG5vb3BzLiAgRnJvbQotCUdhYnJpZWwgUGF1YmVydCA8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBJbiBKdW1wQnl0ZSBjYXNlLCB3aGVuIGxvb2tpbmcKLQlmb3IgYSBXT1JEX1BSRUZJWF9PUENPREUsIGNoYW5nZSBpdCB0byBBRERSX1BSRUZJWF9PUENPREUgaWYgdGhpcwotCWlzIGpjeHogb3IgYSBsb29wIGluc3RydWN0aW9uLgotCi1Nb24gQXVnIDI1IDE2OjA0OjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZCAnaHAnIGFzIGFsaWFzIGZvcgotCXIyLgotCShtZF9iZWdpbik6IFNldCB1cCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBhbmQgdHlwZS4KLQotTW9uIEF1ZyAyNSAxNDoyNTo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBTdG9yZSB0aGUgdmFsdWUgYmFjayBpbnRvIHRoZQotCXN5bWJvbCBleHByZXNzaW9uLCB0byBoYW5kbGUgYWRkIG9yIHN1YnRyYWN0IHNpbXBsaWZpY2F0aW9uCi0JY29ycmVjdGx5LiAgSGFuZGxlIE9fc3ltYm9sX3J2YS4gIEFkZCBkZWZhdWx0IGNhc2UuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2NoYW5nZV9jc2VjdCk6IFRlbXBvcmFyaWx5IGxvd2VyIHRoZQotCWNodW5rc2l6ZSB3aGlsZSBjcmVhdGluZyB0aGUgbmV3IHN1YnNlY3Rpb24uCi0JKiBhcy5jIChjaHVua3NpemUpOiBJbml0aWFsaXplIHRvIHplcm8uCi0JKiBzdWJzZWdzLmMgKHN1YnNlZ19zZXRfcmVzdCk6IENoYW5nZSA1MDAwIHRvIGNodW5rc2l6ZSB3aGVuCi0JY2FsbGluZyBvYnN0YWNrX2JlZ2luLgotCi1Nb24gQXVnIDI1IDExOjIxOjQ4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogUmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgdXBvbgotCWV4aXQuIAotCQotCSogY29uZmlnL3RjLXY4NTAuYyAocGFyc2VfcmVnaXN0ZXJfbGlzdCk6IFN1cHBvcnQgY29uc3RhbnQKLQlleHByZXNzaW9ucyBhcyByZWdpc3RlciBsaXN0cy4KLQotTW9uIEF1ZyAyNSAxMDoxOTozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkb2MvYy12ODUwLnRleGk6IENoYW5nZSB0aGUgbWFqb3Igbm9kZSB0byB2ODUwIE1hY2hpbmUKLQlEZXBlbmRlbmNpZXMuIAotCi1GcmkgQXVnIDIyIDExOjE2OjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGQgaW5jbHVzaW9uIG9mIGMtdjg1MC50ZXhpCi0KLQkqIGRvYy9jLXY4NTAudGV4aTogTmV3IGZpbGUuCi0KLQkqIHJlYWQuYyAoaXNfZW5kX29mX2xpbmUpOiBNYWtlIE5VTCBjaGFyYWN0ZXIgYmUgY29uc2lkZXJlZCB0byBiZQotCWEgbGluZSB0ZXJtaW5hdG9yLgotCi1GcmkgQXVnIDIyIDEwOjQ1OjMzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHBhcnNlX3JlZ2lzdGVyX2xpc3QpOiBBZGQgc3VwcG9ydCBmb3IgY3VybHkKLQlicmFjZSBzeW50YXguCi0JKGNjX25hbWVzKTogQWRkICJlIiBhbmQgIm5lIiBjb25kaXRpb25zLgotCi1UaHUgQXVnIDIxIDExOjAwOjM2IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFN1cHBvcnQgYSBkb3VibGUgZGFzaCBhcyBzdGFydGluZyBhCi0JY29tbWVudCB0aGF0IGV4dGVuZHMgdG8gZW5kIG9mIGxpbmUuCi0KLVRodSBBdWcgMjEgMTA6NTQ6MjcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9zZWN0aW9uLCB2ODUwX2Jzcywgdjg1MF9vZmZzZXQpOiBOZXcKLQlmdW5jdGlvbnMuCi0JKG1kX3BzZXVkb190YWJsZSk6IE5ldyBwc2V1ZG8gb3BzOiAuYnNzLCAub2Zmc2V0LCAuc2VjdGlvbgotCi1UaHUgQXVnIDIxIDAwOjU5OjUzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogVXBkYXRlIHJlY29yZGVkCi0JaW5zbiB3aGVuIGNoYW5naW5nIHRvIGEgZGlmZmVyZW50IGluc3RydWN0aW9uLgotCi1XZWQgQXVnIDIwIDAwOjQ1OjIwIDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogdGMtc2guYyAocGFyc2VfcmVnLCBnZXRfc3BlY2lmaWMsIGJ1aWxkX015dGVzKTogQWRkIFNINAotCWZsb2F0aW5nIHBvaW50IGV4dGVuc2lvbnMuCi0JKHBhcnNlX3JlZyk6IHBhcnNlIHNnciBhbmQgZGJyLgotCi1UdWUgQXVnIDE5IDE3OjA3OjM0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHN5c3RlbV9yZWdpc3Rlcl9uYW1lKTogU3VwcG9ydCBudW1iZXJzIGZvcgotCXN5c3RlbSByZWdpc3RlciBJRHMuCi0KLVR1ZSBBdWcgMTkgMDg6NTk6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19sY29tbV9pbnRlcm5hbCk6IFJlbmFtZWQgZnJvbSBzX2xjb21tLCBhZGRlZCBhcmcgdG8KLQlmbGFnIHdoZW4gYWxpZ25tZW50IGlzIGluIGJ5dGVzIGluc3RlYWQgb2YgcG93ZXIgb2YgMiwgYW5kIGNvZGUgdG8KLQl1c2UgdGhhdCBmbGFnIHRvIGNvbnZlcnQgYWxpZ25tZW50IHRvIGJ5dGVzLgotCShzX2xjb21tLCBzX2xjb21tX2J5dGVzKTogIE5ldyBoZWxwZXJzIHRoYXQgY2FsbCBzX2xjb21tX2ludGVybmFsLgotCSogcmVhZC5oIChzX2xjb21tX2J5dGVzKTogQWRkIHByb3RvdHlwZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jICh3cml0ZV9vYmplY3RfZmlsZSk6IElmIEFMSUdOTUVOVF9JTl9TX0ZMQUdTIGlzCi0JZGVmaW5lZCwgd3JpdGUgYWxpZ25tZW50IHRvIGFsaWdubWVudCBiaXRzIGluIHNlY3Rpb24gaGVhZGVyIHNfZmxhZ3MKLQlyYXRoZXIgdGhhbiB0aGUgc19hbGlnbiBmaWVsZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChBTElHTk1FTlRfSU5fU19GTEFHUyk6IERlZmluZSBmb3IgVENfVElDODAuCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfcHNldWRvX3RhYmxlKTogVXNlIHNfbGNvbW1fYnl0ZXMgZm9yIGJzcwotCXBzZXVkbywgaW5zdGVhZCBvZiBzX2xjb21tIHdoaWNoIHdhbnRzIGEgcG93ZXIgb2YgdHdvIGZvciBhbGlnbm1lbnQuCi0KLU1vbiBBdWcgMTggMjA6NDI6MjMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAoY2hlY2tfbWFjcm8pOiB1c2UgYWxsb2NhIGluc3RlYWQgb2YgeG1hbGxvYyB0byBwbHVnIGxlYWsuCi0KLU1vbiBBdWcgMTggMjA6MzM6MDYgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IEFkZCAtYW0uCi0JKiBpbnB1dC1zY3J1Yi5jIChpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiKTogRG9uJ3QgYWRkIGxlYWRpbmcgXG4KLQlpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBvbmUuCi0JKiBsaXN0aW5nLmMgKHN0cnVjdCBsaXN0X2luZm9fc3RydWN0KTogQWRkIGxpbmVfY29udGVudHMuCi0JKGxpc3RpbmdfbmV3bGluZSk6IFB1dCB1bnVzZWQgYXJndW1lbnQgdG8gd29yazogaWYgbm9uLW51bGwsIHNhdmUgaXQuLi4KLQkobGlzdGluZ19saXN0aW5nKTogLi4uIGFuZCByZWd1cmdpdGF0ZSBkdXJpbmcgbGlzdGluZyBpbnN0ZWFkIG9mIGxpbmUKLQlmcm9tIGZpbGUuCi0JKiBsaXN0aW5nLmggKExJU1RJTkdfTUFDRVhQKTogTmV3IGRlZmluZS4KLQkoTElTVElOR19ORVdMSU5FKTogQXJndW1lbnQgaXMgTlVMTC4KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogSWYgZXhwYW5kaW5nIG1hY3JvcywgYnJlYWsgdXAgaW5wdXQKLQlsaW5lcyBhbmQgcGFzcyB0aGVtIHRvIGxpc3RpbmdfbmV3bGluZS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAtYWMgYW5kIC1hbS4KLQotCSogY29uZC5jIChzX2lmYyk6IEFkZCBtaXNzaW5nIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUuCi0KLU1vbiBBdWcgMTggMTE6MjY6MzYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBuZXcgMTYgYml0IFBDCi0JcmVsYXRpdmUgcmVsb2MuCi0KLU1vbiBBdWcgMTggMTE6MjQ6MjEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogUmVtb3ZlIHN1cHBvcnRfdjg1MGUgZmxhZyBhbmQgY29tbWFuZCBsaW5lCi0Jb3B0aW9uLiAKLQkKLQkqIGNvbmZpZ3VyZS5pbiAoZW11bGF0aW9ucyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQKLQotCSogY29uZmlndXJlIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldAotCi1Nb24gQXVnIDE4IDExOjI0OjIxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBzdXBwb3J0X3Y4NTBlYSBmbGFnIGFuZCBjb21tYW5kIGxpbmUKLQlvcHRpb24uIAotCQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQKLQotCSogY29uZmlndXJlIChlbXVsYXRpb25zKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSB0YXJnZXQKLQotRnJpIEF1ZyAxNSAxNDowMDoxMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogRG9uJ3QgY2QgaW50byB0ZXN0c3VpdGUgdW50aWwgYWZ0ZXIKLQlzZXR0aW5nIEVYUEVDVCBhbmQgVENMX0xJQlJBUlkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogYXMuaCAoZW51bSBkZWJ1Z19pbmZvX3R5cGUpOiBEZWZpbmUuCi0JKGRlYnVnX3R5cGUpOiBEZWNsYXJlLgotCSogYXMuYyAoZGVidWdfdHlwZSk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKHNob3dfdXNhZ2UpOiBBZGQgLS1nc3RhYnMuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1nc3RhYnMuCi0JKiByZWFkLmMgKGdlbmVyYXRlX2FzbV9saW5lbm8pOiBSZW1vdmUuCi0JKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE91dHB1dCBzdGFicyBkZWJ1Z2dpbmcgaWYgYXBwcm9wcmlhdGUuCi0JQ2hhbmdlIGNoZWNrcyBvZiBnZW5lcmF0ZV9hc21fbGluZW5vIHRvIGNoZWNrIGRlYnVnX3R5cGUuICBPbmx5Ci0JZ2VuZXJhdGUgRUNPRkYgZGVidWdnaW5nIGlmIEVDT0ZGX0RFQlVHR0lORyBpcyBkZWZpbmVkLgotCSogcmVhZC5oIChnZW5lcmF0ZV9hc21fbGluZW5vKTogRG9uJ3QgZGVjbGFyZS4KLQkoc3RhYnNfZ2VuZXJhdGVfYXNtX2xpbmVubyk6IERlY2xhcmUuCi0JKiBzdGFicy5jIChzdGFic19nZW5lcmF0ZV9hc21fbGluZW5vKTogTmV3IGZ1bmN0aW9uLgotCSogZWNvZmYuYyAoYWRkX2ZpbGUpOiBVc2UgZGVidWdfdHlwZSwgbm90IGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JRG9uJ3QgdHVybiBvZmYgZGVidWdnaW5nLgotCShhZGRfZmlsZSk6IFJlbW92ZSBvbGQgI2lmIDAgY29kZS4KLQkoZWNvZmZfbmV3X2ZpbGUpOiBTZXQgZGVidWdfdHlwZSwgbm90IGdlbmVyYXRlX2FzbV9saW5lbm8uCi0JKGVjb2ZmX2RpcmVjdGl2ZV9lbmQpOiBEb24ndCBnZW5lcmF0ZSBzdGFicyBsaW5lIHN5bWJvbHMuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBEb24ndCBjaGVjayBzdGFic19zZWVuLiAgRG9uJ3Qgc2V0Ci0JZ2VuZXJhdGVfYXNtX2xpbmVuby4KLQkobGluZV9sYWJlbF9jbnQpOiBSZW1vdmUuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lX3N0YWIpOiBSZW1vdmUuCi0JKiBlY29mZi5oIChlY29mZl9nZW5lcmF0ZV9hc21fbGluZV9zdGFiKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGRvYy9hcy50ZXhpbmZvLCBkb2MvYXMuMTogRG9jdW1lbnQgLS1nc3RhYnMuCi0KLVdlZCBBdWcgMTMgMTg6NTg6NTYgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUsIG1kX3Nob3dfdXNhZ2UsIG1kX3BhcnNlX29wdGlvbik6Ci0JQWRkIHN1cHBvcnQgZm9yIHY4NTBlYSBpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlLCBtZF9zaG93X3VzYWdlLCBtZF9wYXJzZV9vcHRpb24pOgotCUFkZCBzdXBwb3J0IGZvciB2ODUwZSBpbnN0cnVjdGlvbnMuCi0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEZpeCBlcnJvciByZWNvdmVyeSB0byByZWxvYWQKLQl0ZXh0IG9mIGVudGlyZSBvcGNvZGUuIAotCi1UdWUgQXVnIDEyIDEwOjI3OjM0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9pbnRlcm5hbHMudGV4aTogRG9jdW1lbnQgcnNfbGViMTI4LgotCi1UdWUgQXVnIDEyIDEyOjE3OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgU0laRV9CWVRFCi0JaW4gQUJTTCBjYXNlLCByYXRoZXIgdGhhbiBjYWxsaW5nIGFib3J0LgotCi1Nb24gQXVnIDExIDIxOjQ4OjAwIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFzLmggKGVudW0gX3JlbGF4X3N0YXRlKTogQWRkIHJzX2xlYjEyOC4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBzbGViMTI4IGFuZCB1bGViMTI4LgotCShzaXplb2ZfKmxlYjEyOCwgb3V0cHV0XypsZWIxMjgsIGVtaXRfbGViMTI4X2V4cHIsIHNfbGViMTI4KTogTmV3Ci0JZnVuY3Rpb25zLgotCSogcmVhZC5oOiBVcGRhdGUgcHJvdG90eXBlcy4KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBTdHJlYW1saW5lIHF1aXRlIGEgYml0LiAgUmV0dXJuCi0JdGhlIHN5bWJvbCB2YWx1ZSwgYWRkIGEgc2Vjb25kIEZJTkFMSVpFIGFyZ3VtZW50IHRoYXQgcHJldmVudHMgCi0JY2hhbmdlcyBmcm9tIGJlaW5nIGNvbWl0dGVkLiAgVXBkYXRlIGFsbCBjYWxsZXJzLgotCSogd3JpdGUuYyAoY3Z0X2ZyYWdfdG9fZmlsbCwgcmVsYXhfc2VnbWVudCk6IEhhbmRsZSByc19sZWIxMjguCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgdGhlIG5ldyBwc2V1ZG9zLgotCi1TdW4gQXVnIDEwIDE0OjUxOjQ5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBBZGQgc2l0ZS5iYWssIHNpdGUuZXhwLCBzdGFnZSwKLQlzdGFnZTEsIGFuZCBzdGFnZTIuCi0JKERJU1RDTEVBTkZJTEVTKTogRGVmaW5lLgotCSogZG9jL01ha2VmaWxlLmFtIChESVNUQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluLCBkb2MvTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVdlZCBBdWcgIDYgMDA6MzA6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiBpZiBlbmRpYW4gaXMgc2V0LgotCURvbid0IHNldCB0YXJnIG9yIGdhc190YXJnZXQuICBEZWZpbmUgU0NPX0VMRiBhbmQKLQlUQVJHRVRfU09MQVJJU19DT01NRU5UIHdoZW4gYXBwcm9wcmlhdGUuICBEb24ndCBzdWJzdGl0dXRlIGZvcgotCXRhcmdldF9mcmFnLgotCSogTWFrZWZpbGUuYW06IFJlbW92ZSBAdGFyZ2V0X2ZyYWdALgotCShJTkNMVURFUyk6IFJlbW92ZSAkKElOVEVSTkFMX0NGTEFHUyksICQoQ1JPU1MpLCAkKEhERUZJTkVTKSwgYW5kCi0JJChUREVGSU5FUykuCi0JKGRlcC1hbSk6IE1hcmsgYXMgcGhvbnkuCi0JKiBhY2NvbmZpZy5oOiBBZGQgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQsCi0JYW5kIFNDT19FTEYuCi0JKiBjb25maWcvYXJtLWJpZy5tdCwgY29uZmlnL2FybS1saXQubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9taXBzLWJpZy5tdCwgY29uZmlnL21pcHMtbGl0Lm10OiBSZW1vdmUuCi0JKiBjb25maWcvcHBjLWJpZy5tdCwgY29uZmlnL3BwYy1saXQubXQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9wcGMtc29sLm10OiBSZW1vdmUuCi0JKiBjb25maWcvaTM4NmNvZmYubXQsIGNvbmZpZy9tNjhrY29mZi5tdDogUmVtb3ZlLgotCSogY29uZmlnL204OGtjb2ZmLm10OiBSZW1vdmUuCi0JKiBjb25maWcvc2NvNS5tdDogUmVtb3ZlLgotCSogY29uZmlndXJlLCBjb25maWcuaW4sIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbSAoJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgpOiBOZXcgdGFyZ2V0LCB0bwotCWZ1cnRoZXIgdHJ5IHRvIGNpcmN1bXZlbnQgdGhlIC55LmggcnVsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXVnICA1IDEyOjMyOjA3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY2luY2x1ZGUubTQ6IE5ldyBmaWxlLCBmcm9tIG9sZCBhY2xvY2FsLm00LgotCSogY29uZmlndXJlLmluOiBDYWxsIEFNX0lOSVRfQVVUT01BS0UgYW5kIEFNX1BST0dfTElCVE9PTC4gIFJlbW92ZQotCXNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieSBsaWJ0b29sLiAgUmVwbGFjZQotCUFDX0NPTkZJR19IRUFERVIgd2l0aCBBTV9DT05GSUdfSEVBREVSLiAgQ2FsbCBBQ19QUk9HX1lBQ0MsCi0JQUNfUFJPR19MRVgsIGFuZCBBQ19ERUNMX1lZVEVYVC4gIENhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLAotCUFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgRG9uJ3QgY2FsbCBDWV9DWUdXSU4zMiBvciBDWV9FWEVFWFQuCi0JKiBjb25maWcuaW46IE5ldyBmaWxlLCBjcmVhdGVkIGJ5IGF1dG9oZWFkZXIuCi0JKiBjb25mLmluOiBSZW1vdmUuCi0JKiBhY2NvbmZpZy5oOiBNZW50aW9uIFBBQ0tBR0UsIFZFUlNJT04sIGFuZCBVU0lOR19DR0VOLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBhcy5jIChwcmludF92ZXJzaW9uX2lkKTogQ2hhbmdlIEdBU19WRVJTSU9OIHRvIFZFUlNJT04uCi0JKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotdm1zLmM6IChXcml0ZV9WTVNfTUhEX1JlY29yZHMpOiBMaWtld2lzZS4KLQkqIGRvYy9NYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBkb2MvTWFrZWZpbGUuaW4uCi0JKiBNYWtlZmlsZS5pbiwgZG9jL01ha2VmaWxlLmluOiBOb3cgYnVpbHQgd2l0aCBhdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IE5vdyBidWlsdCB3aXRoIGFjbG9jYWwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmQuYyAoc19lbHNlKTogSWYgbm90IGxpc3RpbmcgZmFsc2UgY29uZGl0aW9uYWxzLCB0dXJuIGxpc3RpbmcKLQlvZmYgaW4gdGhlIGZhbHNlIGJyYW5jaCBvZiB0aGUgZWxzZS4KLQotTW9uIEF1ZyAgNCAxMToyODozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogRml4IGhhbmRsaW5nIG9mIGEgZG91YmxlIGxvYWQgZnJvbSBhCi0Jc3ltYm9sIHBsdXMgYW4gb2Zmc2V0LgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogU2V0IGZNZXJnZSB0byAwIGZvciBhbiBGRFIgd2hpY2gKLQloYXMgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBzeW1ib2wuCi0KLVN1biBBdWcgIDMgMjM6MjM6NTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBjb25maWcvdGMtYWxwaGEuYyAoc19hbHBoYV91Y29ucyk6IE5ldyBmdW5jdGlvbi4KLSAgICAgICAgKG1kX3BzZXVkb190YWJsZSk6IEFkZCB1bmFsaWduZWQgZGF0YSBwc2V1ZG9zIGZvciBEV0FSRi4KLQotVGh1IEp1bCAzMSAxNToxMzo0MyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogSWdub3JlIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50Ci0JbGluZSBpZiB3ZSBlbmNvdW50ZXIgYW4gZXJyb3IuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogU2lnbiBleHRlbmQgY29uc3RhbnRzIHZhbHVlCi0JZm9yIGhpIGFuZCBoaTAgZXhwcmVzc2lvbnMuCi0JKHY4NTBfaW5zZXJ0X29wZXJhbmQpOiBFbmFibGUgcmFuZ2UgY2hlY2tpbmcgZm9yIGdlbmVyaWMgMTZiaXQKLQlvcGVyYW5kcy4KLQotVHVlIEp1bCAyOSAxNDoyMDo0MyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2Fzc2VtYmxlKTogVHVybiBvbiBmeF9ub19vdmVyZmxvdyBmb3IKLQlMTzE2LCBISTE2IGFuZCBISTE2X1MgcmVsb2NzLgotCi1Nb24gSnVsIDI4IDE4OjQxOjQxIDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNybyB0byBsb29rIGZvcgotICAgICAgICB3aW4zMiBkZXBlbmRlbmNpZXMuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0gICAgICAgICogTWFrZWZpbGUuaW46IEFkZCAkKEVYRUVYVCkgdG8gYWxsIGV4ZWN1dGFibGVzLgotCi1GcmkgSnVsIDI1IDEwOjU0OjQzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdGMtaHBwYS5jIChtZF9hcHBseV9maXgpOiBJbXByb3ZlIHdhcm5pbmdzIGZvciBvdXQgb2YgcmFuZ2UKLQl1bmNvbmRpdGlvbmFsIGJyYW5jaGVzLgotCShocHBhX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IGFueXRoaW5nIHdpdGggYSBSUiUgb3IgTFIlCi0JZmllbGQgc2VsZWN0b3IuCi0KLVRodSBKdWwgMjQgMTU6MjE6NDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogdGMtc3BhcmMuYyAobWRfYmVnaW4pOiBDYXN0IHNwYXJjX29wY29kZXMgdG8gUFRSIGZvciBoYXNoX2luc2VydC4KLQotVGh1IEp1bCAyNCAxNzo1MToyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1hY3JvLmMgKGRlZmluZV9tYWNybyk6IE1ha2Ugc3VyZSB0aGUgaW5kZXggaXMgaW4gcmFuZ2UgYmVmb3JlCi0JY2hlY2tpbmcgZm9yICcoJy4KLQotVGh1IEp1bCAyNCAxMjoxMzoxOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBSZW1vdmUgImV4dGVuZGVkIiBhbmQgcmVwbGFjZSB3aXRoCi0gCSJmeCIgYW5kICJmeGZyYWciLiAgQWRkICJmZnJhZyIuICBDaGFuZ2UgY29kZSB0byBpbml0aWFsaXplIGFuZCB1c2UKLQl0aGUgcmlnaHQgZi9mZnJhZyBhbmQgZngvZnhmcmFnIHBhaXJzIHNpbmNlIGluc3RydWN0aW9uIG1heSBiZSBzcGxpdAotIAlhY3Jvc3MgZnJhZ3MuCi0KLVR1ZSBKdWwgMjIgMTg6Mzg6NTYgMTk5NyAgUm9iZXJ0IEhvZWhuZSA8cm9iZXJ0LmhvZWhuZUBNYXRoZW1hdGlrLlRVLUNoZW1uaXR6LkRFPgotCi0JKiBjb25maWcvdGUtZ28zMi5oIChVU0VfQUxJR05fUFRXTyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BzZXVkb190YWJsZSk6IElmIFVTRV9BTElHTl9QVFdPIGlzCi0JZGVmaW5lZCwgdXNlIHNfYWxpZ25fcHR3byBmb3IgLmFsaWduLgotCSogY29uZmlndXJlLmluIChpMzg2LSotbXNkb3NkamdwcCopOiBOZXcgdGFyZ2V0LgotCShpMzg2LSotZ28zMiopOiBTZXQgZW0gdG8gZ28zMiBhbmQgdGFyZyB0byBjb2ZmZ28zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIEp1bCAyMiAxMjo0MTo0MCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobGFzdF9vcGNvZGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShtZF9hc3NlbWJsZSk6IERvbid0IGlzc3VlICJGUCBicmFuY2ggaW4gZGVsYXkgc2xvdCIgd2FybmluZyBpZgotCXRoZSBkZWxheSBzbG90IGhhcyBiZWVuIGFubnVsbGVkLgotCi1UdWUgSnVsIDIyIDEzOjI1OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfYXBwbHlfZml4XzIpOiBDaGVjayBmb3IgUEMgcmVsYXRpdmUgcmVsb2MKLQljb2RlIGlmIEJGRF9BU1NFTUJMRVIuCi0KLU1vbiBKdWwgMjEgMDg6NTc6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChzeXN0ZW1fcmVnaXN0ZXJzKTogRml4IG9yZGVyaW5nIG9mIHJlZ2lzdGVycy4KLQotVHVlIEp1bCAxNSAxNjoyOTo1NCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBJbml0aWFsaXplIGV4dGVuZGVkIHdvcmQgdG8gemVybwotCXdoZW4gaXQgd2lsbCBiZSBmaWxsZWQgaW4gbGF0ZXIgYnkgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLQotTW9uIEp1bCAxNCAyMzoxMDo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkKTogUmVzdG9yZSBjaGVjayBvZiBmbXQgYXJndW1lbnQuCi0JKG1pcHNfaXApOiBGaXggSVNBIGNoZWNrcy4KLQotTW9uIEp1bCAxNCAxOTozMDo1NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGJ1aWxkX2luc24pOiBGaXggZW5kaWFubmVzcyBwcm9ibGVtIHdpdGgKLQlPX2JpZyBvcGVyYW5kcy4KLQotU3VuIEp1bCAxMyAyMDo0Mzo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNoZWNrX2Fic29sdXRlX2V4cHIpOiBDaGFuZ2Ugd2FybmluZyB0bwotCWVycm9yLgotCi1GcmkgSnVsIDExIDEwOjE4OjQ3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm9fYnVpbGQpOiBSZWZpbmUgY29kZSB0byBjaGVjayBpZiBhbgotCWluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSBvbiBhIHBhcnRpY3VsYXIgY3B1IHZhcmlhbnQuCi0JKG1pcHNfaXApOiBMaWtld2lzZS4KLQotTW9uIEp1bCAgNyAyMjo1MzowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBDaGFuZ2UgaWZuZGVmCi0JT0JKX0FPVVQgdG8gaWZkZWYgT0JKX0VMRi4KLQkobWRfYXBwbHlfZml4Myk6IFdoZW4gbWFuZ2xpbmcgMzIgYml0IFBDIHJlbGF0aXZlIHJlbG9jIGZvcgotCUJGRF9BU1NFTUJMRVIsIGhhbmRsZSBvbmUgRUxGIGNhc2UgZm9yIENPRkYgYXMgd2VsbCwgYW5kIGFkZCBhIFBFCi0JY2FzZS4KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGFuZ2Ugc3BlY2lhbCBjYXNlIGZvciBpMzg2LWNvZmYgdG8KLSAJbm90IGFwcGx5IGZvciBpMzg2LXBlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IE9ubHkgY291bnQgZml4dXBzCi0Jd2hpY2ggd2VyZSBub3QgZG9uZS4KLQkoY29mZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogUmVuYW1lIGZyb20gY29mZl9mcm9iX2ZpbGUuCi0JKGNvZmZfZm9ybWF0X29wcyk6IEluaXRpYWxpemUgZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBmaWVsZCByYXRoZXIKLQl0aGFuIGZyb2JfZmlsZSBmaWVsZC4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmX2Zyb2JfZmlsZSk6IERvbid0IGRlY2xhcmUuCi0JKGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyk6IERlY2xhcmUuCi0JKG9ial9mcm9iX2ZpbGUpOiBEb24ndCBkZWZpbmUuCi0JKG9ial9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBTZXQgYmZkX2dhcyB0byB5ZXMgZm9yIGkzODYtKi1jeWd3aW4zMi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEp1bCAgMiAxMjowNTowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTmV2ZXIgc3VidHJhY3Qgc2VjdGlvbgotCWFkZHJlc3MgZnJvbSBQQyByZWxhdGl2ZSByZWxvYyB3aGljaCB3aWxsIGJlIGZ1bGx5IHJlc29sdmVkLgotCi1UdWUgSnVsICAxIDE1OjIzOjA3IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuYyAocGFnZV90eXBlKTogUmVuYW1lZCBmcm9tIHBhZ2VfdCB0byBhdm9pZCBjb25mbGljdAotCXdpdGggaHB1eDEwIGhlYWRlciBmaWxlcy4KLQotTW9uIEp1biAzMCAxMjoyNzoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEphc29uIE1lcnJpbGwgPGphc29uQGN5Z251cy5jb20+OgotCSogcmVhZC5jIChkb19hbGlnbik6IElmIEJGRF9BU1NFTUJMRVIsIG9ubHkgdXNlIE5PUF9PUENPREUgaWYKLQlTRUNfQ09ERSBpcyBzZXQuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChtZF9tYXliZV90ZXh0KTogRGVmaW5lLgotCShtZF9kb19hbGlnbik6IFVzZSBtZF9tYXliZV90ZXh0LgotCi1GcmkgSnVuIDI3IDE5OjE1OjI3IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogT25seSBjaGVjayBmb3IgR09UIHR5cGUKLQlyZWxvY2F0aW9ucywgZG9uJ3QgY2hlY2sgZm9yIHN5bWJvbCBiZWluZyBleHRlcm5hbCwgd2VhaywgZXRjLgotCi1Nb24gSnVuIDE2IDE5OjEyOjUxIDE5OTcgIEdlb2ZmIEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBsZXQgdGhlIGFzc2VtYmxlcgotCWNhbGN1bGF0ZSByZWxvY2F0aW9ucyB0byBhbnkgZXh0ZXJuYWwgc3ltYm9sLCBiZWNhdXNlIHdlIG1pZ2h0IGJlCi0JbGlua2luZyBhIHNoYXJlZCBvYmplY3QgYW5kIHRoZSBzeW1ib2wgbWlnaHQgYmUgb3ZlcnJpZGVuIG9yIG1vdmVkCi0JKGZvciBpbnN0YW5jZSwgbW92ZWQgaW50byBhIHN0YXRpYyBleGVjdXRhYmxlJ3MgLmJzcyBzZWN0aW9uKS4KLQkoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTogRGVsZXRlLiBUaGlzIGlzIGFuIGkzODYgd2llcmRuZXNzLgotCi0JKiBjb25maWcvdGMtcHBjLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogR09ULWJhc2VkIHJlbG9jYXRpb25zIGNhbid0Ci0JYmUgY2FsY3VsYXRlZCBieSB0aGUgYXNzZW1ibGVyLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBIYW5kbGUgQHBsdCBvciBAbG9jYWwgYnJhbmNoCi0Jd2hvc2UgZGVzdGluYXRpb24gbGllcyBpbiB0aGUgc2FtZSBmaWxlLCBieSBpZ25vcmluZyB0aGUgQHBsdCBvcgotCUBsb2NhbCBhbmQgYWltaW5nIHRoZSBicmFuY2ggYXQgaXRzIGRlc3RpbmF0aW9uLgotCi1Nb24gSnVuIDE2IDEzOjU5OjE4IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIHN5bWJvbHMuYyAoY29weV9zeW1ib2xfYXR0cmlidXRlcyk6IENvcHkgQlNGX09CSkVDVCBmbGFnLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBDb3B5IHNpemUKLQlleHByZXNzaW9uLgotCi0JKiBjb25maWcvb2JqLW11bHRpLmggKE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKTogRGVmaW5lIGluc3RlYWQKLQlvZiBvYmpfY29weV9zeW1ib2xfYXR0cmlidXRlcy4KLQotTW9uIEp1biAxNiAxMjo0NTo1NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogSW4gMzIgYml0IG1vZGUsIHdpdGggYQotCXNpZ25lZCBvcGVyYW5kLCBzaWduIGV4dGVuZCBhIDMyIGJpdCB2YWx1ZSB0byB0aGUgaG9zdCBzaXplLgotCi0JKiBNYWtlZmlsZS5pbiAoQ0ZMQUdTKTogU3Vic2l0dXRlIGZyb20gY29uZmlndXJlIHNjcmlwdC4gIEZyb20KLQlKZWZmIE1ha2V5IDxqZWZmQGN0cy5jb20+LgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X29wZXJhbmQpOiBVc2UgYWxsb2NhIHJhdGhlciB0aGFuIGEgZml4ZWQKLQlidWZmZXIgc2l6ZSB0byBtYWtlIGEgY29weSBvZiB0aGUgc3ltYm9sLgotCi0JKiBNYWtlZmlsZS5pbiAoT0JKUyk6IFB1dCBAZXh0cmFfb2JqZWN0c0Agb24gdGhlIHNhbWUgbGluZSBhcwotCW1hY3JvLm8uCi0KLVRodSBKdW4gMTIgMTI6MTY6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9vYmplY3RfZmlsZSk6IEluIG5vbiBCRkRfQVNTRU1CTEVSIGNvZGUsIGFzIHdlCi0Jc3RlcCB0aHJvdWdoIHRoZSBmcmFncyBjYWxsaW5nIGN2dF9mcmFnX3RvX2ZpbGwsIHN3aXRjaCB0bwotCVNFR19EQVRBIHdoZW4gd2UgcmVhY2ggZGF0YV9mcmFnX3Jvb3QuCi0KLVR1ZSBKdW4gMTAgMTc6MDg6MzQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IEFsbG93IGFuIGVtcHR5IHJlZ2lzdGVyCi0JbGlzdCBmb3IgaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSByZWdpc3RlciBsaXN0cy4KLQotVHVlIEp1biAxMCAxMToxODowOSAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2FwcGx5X2ZpeDMpOiBNYWtlIHRlbXAgdW5zaWduZWQgbG9uZy4KLQotCSogY29uZmlnL3RjLWFybS5jIChhcm1fYWRqdXN0X3N5bXRhYik6IE9ubHkgc2V0IHN0b3JhZ2UgY2xhc3NlcyBpZgotCU9CSl9DT0ZGLgotCi0JKiBjb25maWcvdGMtYXJtLmM6IEFkZCBwcm90b3R5cGVzIGZvciBtYW55IHN0YXRpYyBmdW5jdGlvbnMuCi0JKHN0cnVjdCBhc21fb3Bjb2RlICk6IEFkZCBwcm90b3R5cGVzIGZvciBwYXJtcyBmaWVsZC4KLQkoc3RydWN0IHRodW1iX29wY29kZSApOiBMaWtld2lzZS4KLQkoZnBfb3AyKTogUmVtb3ZlIHVudXNlZCBmbGFncyBwYXJhbWV0ZXIuCi0JKG91dHB1dF9pbnN0KTogTWFrZSBzdGF0aWMuCi0JKGFybV9hZnRlcl9wYXNzX2hvb2spOiBSZW1vdmUgdW51c2VkIGlnbm9yZSBwYXJhbWV0ZXIuCi0JKiBjb25maWcvdGMtYXJtLmggKGFybV9hZnRlcl9wYXNzX2hvb2spOiBEZWNsYXJlLgotCShhcm1fc3RhcnRfbGluZV9ob29rKTogRGVjbGFyZS4KLQkoYXJtX2Zyb2JfbGFiZWwpOiBEZWNsYXJlLgotCi1Nb24gSnVuICA5IDEyOjU1OjQ1IDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGRlcGVuZC5jICh3cmFwX291dHB1dCk6IG5ldyBwcm90b3R5cGUuCi0KLU1vbiBKdW4gIDkgMTI6NTI6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAobWRfYXBwbHlfZml4KTogQ2hlY2sgZm9yIG92ZXJmbG93LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtZF9zZWN0aW9uX2FsaWduKTogSWYgYS5vdXQgYW5kIEJGRCwgZm9yY2UKLQlzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4KLQotRnJpIEp1biAgNiAxNzoxNTo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5oIChtZF9jb25zX2FsaWduKTogRGVmaW5lLgotCShzaF9jb25zX2FsaWduKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgLnVhd29yZCBhbmQgLnVhbG9uZy4KLQkoc2hfbm9fYWxpZ25fY29ucyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHNfdWFjb25zKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc2hfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbi4KLQkoc2hfaGFuZGxlX2FsaWduKTogV2FybiBhYm91dCBtaXNhbGlnbmVkIGRhdGEuCi0JKiBkb2MvYy1zaC50ZXhpOiBEb2N1bWVudCAudWF3b3JkIGFuZCAudWFsb25nLgotCi1UaHUgSnVuICA1IDE1OjM4OjE3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWFjcm8uYyAobWFjcm9fZXhwYW5kKTogSW4gTVJJIG1vZGUsIHRyZWF0IHNpbmdsZSBxdW90ZSBhcyBhCi0Jc2VwYXJhdG9yIGNoYXJhY3RlciB3aGVuIGNoZWNraW5nIGZvciBhIHBvc2l0aW9uYWwgYXJndW1lbnQuCi0KLVR1ZSBKdW4gIDMgMTY6MTU6MTMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9wYXJzZV9vcHRpb24pOiBNZXJnZSBpbiBjaGFuZ2VzIGZyb20KLQlhcm1ULTk3MDMyOC1icmFuY2guCi0KLQkqIGNvbmZpZy90Yy1hcm0uaDogTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGFybVQtOTcwMzI4LWJyYW5jaC4KLQotCSogY29uZmlndXJlLmluIChlbXVsYXRpb25zKTogQWRkIFRodW1iIGFyY2hpdGVjdHVyZSBzdXBwb3J0IGZyb20KLQlhcm1ULTk3MDMtMjgtYnJhbmNoLgotCi1Nb24gSnVuICAyIDE2OjI1OjA3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hbGwudGV4aTogQWRkIGVuYWJsaW5nIG9mIEFSTSBkb2N1bWVudGF0aW9uLgotCi0JKiBkb2MvYXMudGV4aW5mbzogQWRkIEFSTSBkb2N1bWVudGF0aW9uIGZyb20gYXJtVC05NzAzMjgtYnJhbmNoLgotCi1Nb24gSnVuICAyIDExOjU1OjEyIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCByMzkwMCBzdXBwb3J0LgotCi1UaHUgTWF5IDI5IDEyOjU4OjI2IDE5OTcgIEJlbiBQZmFmZiAgPHBmYWZmYmVuQHBpbG90Lm1zdS5lZHU+Ci0KLQkqIGFzLmM6IChwYXJzZV9hcmdzKSBgLXQnIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudC4KLQotV2VkIE1heSAyOCAxNTo0NTowNyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG1kX2JlZ2luKTogQ2hhbmdlIGNhbGwgdG8KLQljb2ZmX2FybV9iZmRfc2V0X3ByaXZhdGVfZmxhZ3MoKSB0byBhIGNhbGwgdG8KLQliZmRfc2V0X3ByaXZhdGVfZmxhZ3MoKS4gCi0KLVdlZCBNYXkgMjggMTY6MTc6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2dlbl9yZWxvYyk6IERvbid0IHRyeSB0byBjb252ZXJ0IHRoZSB0eXBlCi0gCW9mIGEgQkZEX1JFTE9DX1JWQSByZWxvYy4KLQotV2VkIE1heSAyOCAxMDo0ODoxNCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2ZpeF9hZGp1c3RhYmxlKTogUmVqZWN0IGFic29sdXRlIGNhbGxzL2p1bXBzLgotCShocHBhX2ZvcmNlX3JlbG9jYXRpb24pOiBGb3JjZSBhIHJlbG9jYXRpb24gZm9yIGFuIGFic29sdXRlCi0JY2FsbC9qdW1wLgotCi1Nb24gTWF5IDI2IDEzOjI0OjI1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IERvbid0IHVzZSBAdmFsdWUgaW4gc2VjdGlvbiBuYW1lcyBvciBpbmRleAotCWVudHJpZXM7IGl0IGNvbmZ1c2VzIHRleGluZm8udGV4LgotCi1GcmkgTWF5IDIzIDAwOjA5OjM1IDE5OTcgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IFVwZGF0ZWQgZm9yIC1NRCBvcHRpb24uCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkZWQgZGVwZW5kLmMuCi0JKE9CSlMpOiBBZGRlZCBkZXBlbmQuby4KLQkqIGFzLmggKHN0YXJ0X2RlcGVuZGVuY2llcywgcmVnaXN0ZXJfZGVwZW5kZW5jeSwKLQlwcmludF9kZXBlbmRlbmNpZXMpOiBOZXcgZGVjbGFyYXRpb25zLgotCSogZGVwZW5kLmM6IE5ldyBmaWxlLgotCSogYXMuYyAocGFyc2VfYXJncyk6IEFkZGVkIC1NRCBvcHRpb24uCi0JKG1haW4pOiBDYWxsIHByaW50X2RlcGVuZGVuY2llcy4KLQkoc2hvd191c2FnZSk6IEFkZGVkIGhlbHAgZm9yIC1NRC4KLQkqIHJlYWQuYyAoc19hcHBfZmlsZSk6IENhbGwgcmVnaXN0ZXJfZGVwZW5kZW5jeS4KLQkoc19pbmNsdWRlKTogQ2FsbCByZWdpc3Rlcl9kZXBlbmRlbmN5IHdoZW4gZmlsZSBpcyBmb3VuZC4KLQkocmVhZF9hX3NvdXJjZV9maWxlKTogQ2FsbCByZWdpc3Rlcl9kZXBlbmRlbmN5LgotCi1XZWQgTWF5IDIxIDE3OjM5OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHN5bWJvbF90b19jaGFycyk6IElmIFRFX1BFLCBkb24ndCBhZGQgdGhlCi0Jc2VjdGlvbiBhZGRyZXNzIHRvIHRoZSBzeW1ib2wgdmFsdWUuCi0KLVR1ZSBNYXkgMjAgMTE6MjM6MzEgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvX2J1aWxkLG1pcHNfaXApOiBNb3ZlIHRoZSBJTlNOX0lTQSBmaWVsZAotCWludG8gdGhlIG5ldyBtZW1iZXJzaGlwIGZpZWxkLgotCi1UaHUgTWF5IDE1IDEwOjAwOjUzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAobWRfYmVnaW4pOiBJZiBubyBjcHUgdHlwZSBpcyBzcGVjaWZpZWQgb24gdGhlCi0JY29tbWFuZCBsaW5lIHRoZW4gdGhlIEFSTTcgaXMgbm93IGNob3NlbiBieSBkZWZhdWx0IHdoZW4gc2V0dGluZwotCXRoZSBCRkQgbWFjaGluZSBhbmQgYXJjaGl0ZWN0dXJlLgotCi1XZWQgTWF5IDE0IDA5OjU0OjUzIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1hcm0uYyAoZ2xvYmFsIHZhcmlhYmxlcyk6IEFkZGVkICd1c2VzX2FwY3NfMjYnIGZsYWcgdG8KLQlob2xkIEFQQ1Mgc2VsZWN0aW9uLgotICAJKG1kX2JlZ2luKTogQWRkZWQgY29kZSB0byBnZW5lcmF0ZSBmbGFncyB0byBiZSBzZXQgaW50byB0aGUgQ09GRgotCWhlYWRlciBhbmQgdGhlIGNhbGxzIHRvIHRoZSBCRkQgZnVuY3Rpb25zIHRvIGRvIHRoaXMuCi0gIAkobWRfcGFyc2Vfb3B0aW9uLCBtZF9zaG93X3VzYWdlKTogQWRkZWQgbmV3IGNvbW1hbmQgbGluZQotCW9wdGlvbnMgLW1hcGNzLTMyLCAtbWFwY3MtMjYsIC1tYXJtdjIsIC1tYXJtdjJhLCAtbWFybXYzLAotCS1tYXJtdjNtLCAtbWFybXY0LCAtbWFybXY0dC4gCi0KLQkqIHRjLWFybS5oIChMT0NBTF9MQUJFTCk6IFJlbW92ZWQgdGhlIGRlZmluaXRpb24gb2YgdGhpcyBtYWNybwotCWFzIGl0IGlzIG5ldmVyIHVzZWQuCi0KLVR1ZSBNYXkgMTMgMjI6MjY6MTQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9jb252ZXJ0X2ZyYWcpOiBQcmVmaXggdGVtcG9yYXJ5Ci0JbGFiZWwgbmFtZSB3aXRoICIuIi4KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCi1UdWUgTWF5IDEzIDE0OjQ0OjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc2V0X2F0KTogQ2hlY2sgZm9yIGJpZ251bS4KLQkoY2hlY2tfYWJzb2x1dGVfZXhwciwgbWFjcm8sIG1pcHMxNl9tYWNybyk6IExpa2V3aXNlLgotCi1UdWUgTWF5IDEzIDEwOjQ1OjU2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfYXBwbHlfZml4KTogQ2hlY2sgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMKLQlmb3Igb3ZlcmZsb3cvdW5kZXJmbG93LCBvbmx5IGluc2VydCBsb3dlciAxNSBiaXRzIGludG8gaW5zdHJ1Y3Rpb24uCi0KLU1vbiBNYXkgMTIgMTM6MzM6MDggMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAocGkpOiBDaGVjayBmb3IgUmVnTU1YLgotCi1UaHUgTWF5ICA4IDExOjEwOjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChleHByKTogV2hlbiBzdWJ0cmFjdGluZyB2YWx1ZXMgaW4gdGhlIHNhbWUgZnJhZywKLQlzdWJ0cmFjdCBYX2FkZF9udW1iZXIgcmF0aGVyIHRoYW4gYWRkaW5nIGl0LgotCi1XZWQgTWF5ICA3IDE1OjM5OjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogSnVzdCBwYXNzIE5VTEwgdG8KLSAJbWRfZG9fYWxpZ24sIG5vdCB0aGUgYWRkcmVzcyBvZiBhIGNoYXIgaG9sZGluZyBOT1BfT1BDT0RFLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtYWNybyk6IEhhbmRsZSBjb25zdGFudHMgZm9yIE1fTElfRCBhbmQKLQlNX0xJX0RELgotCShtaXBzX2lwKTogRm9yICdGJywgJ0wnLCAnZicsIGFuZCAnbCcsIGdlbmVyYXRlIGEgY29uc3RhbnQgcmF0aGVyCi0JdGhhbiBhbiBhZGRyZXNzIGlmIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBsb29rcyBzdWZmaWNpZW50bHkKLQlzaW1wbGUuCi0KLVR1ZSBNYXkgIDYgMTI6MTg6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9zZWN0aW9uX2FsaWduKTogSWYgYS5vdXQgYW5kIEJGRCwgZm9yY2UKLQlzZWN0aW9uIHNpemUgdG8gYmUgYWxpZ25lZC4KLQotTW9uIE1heSAgNSAxNzoxNjo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmQuYzogSW5jbHVkZSAibWFjcm8uaCIuCi0JKHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSk6IEFkZCBtYWNyb19uZXN0IGZpZWxkLgotCShpbml0aWFsaXplX2NmcmFtZSk6IEluaXRpYWxpemUgbWFjcm9fbmVzdC4KLQkoY29uZF9maW5pc2hfY2hlY2spOiBBZGQgbmVzdCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvbmRfZXhpdF9tYWNybyk6IE5ldyBmdW5jdGlvbi4KLQkqIGFzLmggKGNvbmRfZmluaXNoX2NoZWNrKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCShjb25kX2V4aXRfbWFjcm8pOiBEZWNsYXJlLgotCSogaW5wdXQtc2NydWIuYyAobWFjcm9fbmVzdCk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4KLQkoaW5wdXRfc2NydWJfbmV4dF9idWZmZXIpOiBDYWxsIGNvbmRfZmluaXNoX2NoZWNrLgotCSogbWFjcm8uaCAobWFjcm9fbmVzdCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKHNfbWV4aXQpOiBDYWxsIGNvbmRfZXhpdF9tYWNyby4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoUmVnTU1YKTogRGVmaW5lLgotCSogY29uZmlnL3RjLWkzODYuYyAocGkpOiBDaGVjayBmb3IgYWxsIHJlZ2lzdGVyIHR5cGVzLgotCSh0eXBlX25hbWVzKTogQWRkIFJlZ01NWC4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgUmVnTU1YLgotCi1XZWQgQXByIDMwIDEyOjQ3OjAwIDE5OTcgIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNfc2VjdGlvbl9zeW1ib2wpOiBDbGVhciB0aGUgTE9DQUwgYml0ICNpZmRlZgotCVRFX0RFTFRBLgotCi1UdWUgQXByIDI5IDIwOjIzOjEwIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IEFkZCBuZXcgcGFyYW1ldGVyCi0JYmVmb3JlX3JlbGF4aW5nLiAgVXNlIGl0IHdoZW4gdGVzdGluZyBlY29mZl9leHRlcm5fc2l6ZS4KLQkobG9hZF9hZGRyZXNzLCBtYWNybywgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBGaXggYWxsCi0JY2FsbGVycy4KLQotVHVlIEFwciAyOSAxOTo1NDozNiAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCAic3Vic2VjdGlvbiIuCi0gCShvYmpfZWxmX3N1YnNlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1UdWUgQXByIDI5IDE5OjUyOjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGNvZmZfaGVhZGVyX2FwcGVuZCk6IERvbid0IHJlc2V0IHN0cmluZ19zaXplCi0JZWFjaCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuCi0KLUZyaSBBcHIgMjUgMTQ6MTc6NDYgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RTVFVGRik6IEFkZCBpdGJsLXBhcnNlLmguCi0KLUZyaSBBcHIgMjUgMTI6MDM6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKFBvcnRpbmcgR0FTKTogQ29ycmVjdCBkb2N1bWVudGF0aW9uIGZvcgotCWN1cnJlbnQgY29uZmlndXJlIGhhbmRsaW5nIG9mIHRhcmctY3B1LmgsIGV0LiBhbC4KLQkoQ1BVIGJhY2tlbmQpOiBEb2N1bWVudCBsaXN0aW5nIG1hY3Jvcy4KLQotCSogbGlzdGluZy5jIChkYXRhX2J1ZmZlcik6IFNldCBzaXplIGJhc2VkIG9uIG90aGVyIGxpc3RpbmcgbWFjcm9zLAotCXJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyAxMDAuCi0JKGRhdGFfYnVmZmVyX3NpemUpOiBSZW1vdmUgc3RhdGljIHZhcmlhYmxlLgotCShjYWxjX2hleCk6IE1ha2UgZGF0YV9idWZmZXJfc2l6ZSBhIGxvY2FsIHZhcmlhYmxlLiAgRG9uJ3QgbGVhdmUKLQlhbnkgc2xvcCB3aGVuIGZpbGxpbmcgZGF0YV9idWZmZXIuCi0KLU1vbiBBcHIgMjEgMTU6MzM6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC5zZXQgYXV0b2V4dGVuZC4KLQotU2F0IEFwciAxOSAyMzowOToyNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQHBldHJhLmFwcGxpLnNlPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1vcGVuYnNkKiwgbTY4ay0qLW9wZW5ic2QqLAotCW1pcHMtZGVjLW9wZW5ic2QqLCBwcGMtKi0qYnNkKiwgbnMzMmstcGM1MzItb3BlbmJzZCosCi0Jc3BhcmMtKi1vcGVuYnNkKik6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgQXByIDE5IDIyOjUyOjAzIDE5OTcgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogSWYgVENfTUlQUywgc2V0IEJTRl9PQkpFQ1QKLQlmb3IgYWxsIHVuZGVmaW5lZCBzeW1ib2xzLgotCi1GcmkgQXByIDE4IDEzOjM3OjM1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZml4X2FkanVzdGFibGUpOiBIYW5kbGUgemVybyBsZW5ndGggY3NlY3RzCi0JY29ycmVjdGx5LgotCi1GcmkgQXByIDE4IDExOjUxOjM1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYWxwaGEqLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXByIDE3IDEzOjU5OjQ3IDE5OTcgIFBlciBGb2dlbHN0cm9tICA8cGVmb0BvcGVuYnNkLm9yZz4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotb3BlbmJzZCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXByIDE2IDEyOjMxOjI0IDE5OTcgIE1hcnRpbiBIdW50IDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogRml4IHBhcmFsbGVsIGNoZWNraW5nCi0JZm9yIGluc3RydWN0aW9ucyB1c2luZyBjb25kaXRpb25hbCBleGVjdXRpb24uCi0KLVR1ZSBBcHIgMTUgMTg6MTE6NDQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25fdXNlc19yZWcpOiBDb3JyZWN0IHRlc3QgZm9yIGZwciBwYWlycy4KLQotVHVlIEFwciAxNSAxMzowNDo0NyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzcmNyb290KTogUmVtb3ZlLgotIAkoSU5TVEFMTCk6IFNldCB0byBASU5TVEFMTEAuCi0JKElOU1RBTExfWEZPUk0sIElOU1RBTExfWEZPUk0xKTogUmVtb3ZlLgotCShhbGwsIGR2aSk6IERvbid0IHNldCBzcmNyb290LgotCShpbnN0YWxsKTogRGVwZW5kIHVwb24gYXMubmV3LCBnYXNwLm5ldywgYW5kIGluc3RhbGxkaXJzLiAgVXNlCi0JJChwcm9ncmFtX3RyYW5zZm9ybV9uYW1lKSBkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcKLQkkKElOU1RBTExfWEZPUk0pIGFuZCAkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCSogZG9jL01ha2VmaWxlLmluIChJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLiAgVXNlICQocHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSkKLQlkaXJlY3RseSwgcmF0aGVyIHRoYW4gdXNpbmcgJChJTlNUQUxMX1hGT1JNKSBhbmQKLQkkKElOU1RBTExfWEZPUk0xKS4KLQkoaW5zdGFsbGRpcnMpOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsLWluZm8tYXMpOiBSdW4gbWtpbnN0YWxsZGlycy4KLQkoaW5zdGFsbC1pbmZvLWdhc3ApOiBMaWtld2lzZS4KLQotTW9uIEFwciAxNCAxMTo1OTowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChJTlNUQUxMKTogQ2hhbmdlIGluc3RhbGwuc2ggdG8gaW5zdGFsbC1zaC4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IENoZWNrIGZvciBkaXZpc2lvbiBieSB6ZXJvLgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogTWFrZWZpbGUuaW46IEFsd2F5cyB1c2UgJChTSEVMTCkgd2hlbiBydW5uaW5nIG1vdmUtaWYtY2hhbmdlLgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEFwciAxMCAxNDo0MDowMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmMgKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9wYXJzZV9vcGVyYW5kLgotCU5ldyBhcmd1bWVudCBgd2FudCcuICBVcGRhdGUgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHZhbHVlcy4KLQlJbml0aWFsaXplIGlmIENHRU5fUEFSU0VfT1BFUkFORF9JTklULgotCSogY29uZmlnL3RjLW0zMnIuYyAobWRfYmVnaW4pOiBTZXQgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuLgotCShtZF9hc3NlbWJsZSk6IENhbGwgY2dlbl9hc21faW5pdF9wYXJzZS4KLQlVcGRhdGUgY2FsbCB0byBtMzJyX2NnZW5fYXNzZW1ibGVfaW5zbiwgY2FsbCBhc19iYWQgaWYgYXNzZW1ibHkgZmFpbGVkLgotCi1XZWQgQXByICA5IDExOjQ5OjQxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19pcCk6IEhhbmRsZSAjai4KLQotVHVlIEFwciAgOCAxNjozNzo1NyAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IENyZWF0ZSBmaXh1cCBhdCB0aGUKLQlyaWdodCBhZGRyZXNzIGZvciBjYWxsIGxhYmVsOjMyLHJlZ3MsaW1tLgotCi1Nb24gQXByICA3IDE0OjU4OjIyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAocGFfc3Vic3BhY2Vfc3RhcnQpOiBJZiBPQkpfRUxGLCB0aGVuIGFsd2F5cyByZXR1cm4KLQl6ZXJvLgotCSogY29uZmlnL3RjLWhwcGEuaCAodGNfZnJvYl9zeW1ib2wpOiBEb24ndCByZXNldCB0aGUgdmFsdWUgb2YgdGhlCi0Jc3ltYm9sIGZvciBPQkpfRUxGIGFueW1vcmUuCi0KLU1vbiBBcHIgIDcgMTA6NTQ6NTkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUgZGVwZW5kZW5jaWVzLgotIAkoVEFSR19DUFUpOiBOZXcgdmFyaWFibGUuCi0JKGNnZW4ubyk6IERlcGVuZCBvbiBjZ2VuLmgsICQoVEFSR19DUFUpLW9wYy5oLgotCSguZGVwMSk6IERlbGV0ZSBjcmVhdGluZyBvZiBjZ2VuLW9wYy5oLgotCSgudGNkZXApOiBQdXQgcHJvcGVyIGNvbnRlbnRzIGluIGNnZW4tb3BjLmguCi0JKiBjb25maWd1cmUuaW4gKG0zMnIpOiBEZWxldGUgc2V0dGluZyBvZiBleHRyYV9maWxlcywgZXh0cmFfbGlua3MuCi0JKEFDX09VVFBVVCk6IENyZWF0ZSBjZ2VuLW9wYy5oLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotU2F0IEFwciAgNSAxMzoxOToxMiAxOTk3ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgdG8gYnVpbGQgZ2FzcC5leGUuCi0KLUZyaSBBcHIgIDQgMTY6MTA6MDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAocmVsYXhfZnJhZyk6IE1ha2Ugbm9uLXN0YXRpYy4KLQkqIHdyaXRlLmggKHJlbGF4X2ZyYWcpOiBBZGQgcHJvdG90eXBlIGZvci4KLQkqIGNvbmZpZy90Yy1tMzJyLmggKG1kX2RvX2FsaWduKTogTmV3IGFyZyBgbWF4Jy4KLQkqIGNvbmZpZy90Yy1tMzJyLmMgKG0zMnJfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQlVcGRhdGUgY2FsbHMgdG8gZnJhZ19hbGlnbiwgZnJhZ19hbGlnbl9wYXR0ZXJuLgotCShmaWxsX2luc24pOiBVcGRhdGUgY2FsbCB0byBtMzJyX2RvX2FsaWduLgotCShtMzJyX3Njb21tKTogVXBkYXRlIGNhbGwgdG8gZnJhZ19hbGlnbi4KLQotCSogY29uZmlnL3RjLW0zMnIuW2NoXTogTmV3IGZpbGVzLgotCSogY2dlbi5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDUFVfVFlQRVMpOiBBZGQgbTMyci4KLQkoVEFSR0VUX0NQVV9DRklMRVMpOiBBZGQgdGMtbTMyci5jLgotCShUQVJHRVRfQ1BVX0hGSUxFUyk6IEFkZCB0Yy1tMzJyLmguCi0JKERJU1RDTEVBTl9IRVJFKTogQWRkIGNnZW4tb3BjLmguCi0JKC5kZXAxLC50Y2RlcCk6IENyZWF0ZSBlbXB0eSBjZ2VuLW9wYy5oLgotCShjZ2VuLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCShkZXBlbmRlbmNpZXMpOiBSZWdlbmVyYXRlLgotCSogYXMuaCAoc3RydWN0IGZyYWcpOiBOZXcgbWVtYmVyIGZyX3RhcmcuCi0JKGZyX3BjcmVsX2FkanVzdCxmcl9ic3IpOiBNb3ZlIGludG8gdW5pb24gZnJfdGFyZy5uczMyay4KLQkqIGNvbmYuaW4gKFVTSU5HX0NHRU4pOiBOZXcgbWFjcm8uCi0JKiBjb25maWd1cmUuaW4gKG0zMnItKi0qKTogQWRkIGVudHJ5IGZvci4KLQlBZGQgY2dlbi5vIHRvIGV4dHJhX29iamVjdHMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0JKiBmcmFncy5jIChmcmFnX3Zhcik6IGZyX3BjcmVsX2FkanVzdCByZW5hbWVkIHRvCi0JZnJfdGFyZy5uczMyay5wY3JlbF9hZGp1c3QuICBmcl9ic3IgcmVuYW1lZCB0byBmcl90YXJnLm5zMzJrLmJzci4KLQkoZnJhZ192YXJpYW50KTogTGlrZXdpc2UuCi0JKiB3cml0ZS5jIChyZWxheF9mcmFnKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbnMzMmsuYyAoKik6IExpa2V3aXNlLgotCi1GcmkgQXByICA0IDEzOjI2OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuaCAoVENfRU9MX0lOX0lOU04pOiBDaGVjayBleHBsaWNpdGx5IGZvciAnIScsCi0JcmF0aGVyIHRoYW4gZm9yIGFueSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKHRjX2dlbl9yZWxvYyk6IElmIGhwcGFfcmVuX3JlbG9jX3R5cGUgZmFpbHMsCi0JY2FsbCBhYm9ydCAoaS5lLiwgYXNfYWJvcnQpIHJhdGhlciB0aGFuIGNyYXNoaW5nLgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBQcm90ZWN0IHVzZXMgb2YgU1RPX01JUFMxNiB3aXRoIGFuIGlmZGVmIG9mCi0JT0JKX0VMRiwgcmF0aGVyIHRoYW4gb2YgU19HRVRfT1RIRVIuCi0KLQkqIE1ha2VmaWxlLmluIChESVNUQ0xFQU5fSEVSRSk6IEFkZCBzaXRlLmV4cCBhbmQgc2l0ZS5iYWsuCi0KLVRodSBBcHIgIDMgMTM6MTY6MTggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byAyLjguMS4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1XZWQgQXByICAyIDEyOjI0OjEwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfbWFjcm8pOiBIYW5kbGUgTV9ETVVMIGFuZCBNX01VTC4KLQotVHVlIEFwciAgMSAxODoyOTo0NyAxOTk3ICBKaW0gV2lsc29uICA8d2lsc29uQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRG9uJ3Qgc2V0IGludGVybG9ja3MgZm9yIDQxMDAuCi0KLVR1ZSBBcHIgIDEgMTY6MjQ6MjggMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGNvbmZpZy1nYXMuY29tOiBVcGRhdGUgdG8gaGFuZGxlIGJvdGggdmF4IGFuZCBhbHBoYS4KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIHRvIHVzZSBjb25maWctZ2FzLgotCSogY29uZi1hLWdhcy5jb206IFJlbW92ZSBmaWxlLgotCi1UdWUgQXByICAxIDE2OjA4OjIxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSB1bm5lY2Vzc2FyeSBpdGJsLXBhcnNlLmgsIGlidGwtcGFyc2UuYywgYW5kCi0JaXRibC1sZXguYyBkZXBlbmRlbmNpZXMuICBSZW1vdmUgcnVsZXMgZm9yIGl0YmwtbGV4Lm8sCi0JaXRibC1wYXJzZS5vLCBhbmQgaXRibC1vcHMubzsganVzdCB1c2UgdGhlIG5vcm1hbCAuYy5vIHJ1bGUuCi0KLVR1ZSBBcHIgIDEgMTE6MjU6NTYgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChsaW5lX2NvbW1lbnRfY2hhcik6IE1ha2UgJyMnIHN0YXJ0IGNvbW1lbnRzCi0JYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAuUyBmaWxlcyB3aGVyZQotCWNwcCBsZWF2ZXMgdGhlIGZpbGVuYW1lIHRyYW5zaXRpb25zIGJlZ2lubmluZyB3aXRoICcjJy4KLQotVHVlIEFwciAgMSAwMDowNzozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IE9ubHkgY29tcGlsZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgYW5kCi0JdGNfY29mZl9zaXplbWFjaGRlcCBpZiBPQkpfQ09GRi4KLQotTW9uIE1hciAzMSAyMzo1Mzo0NCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHJlZ2lzdGVyX25hbWUpOiBEZWNsYXJlLgotCi1Nb24gTWFyIDMxIDE2OjMxOjA0IDE5OTcgIEpvZWwgU2hlcnJpbGwgIDxqb2VsQG9hcmNvcnAuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluIChocHBhKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgaHBwYS0qLSplbGYqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMxIDE0OjE1OjE5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19wc2V1ZG9fdGFibGUpOiBBZGQgInN0YWJuIi4KLQkobWlwczE2X21hcmtfbGFiZWxzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXBwZW5kX2luc24pOiBDYWxsIG1pcHMxNl9tYXJrX2xhYmVscy4KLQkobWlwc19lbWl0X2RlbGF5cyk6IExpa2V3aXNlLgotCShzX2luc24pOiBMaWtld2lzZS4gIERvbid0IGNhbGwgbWlwc19jbGVhcl9pbnNuX2xhYmVscy4KLQkoc19taXBzX3N0YWIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBFTEYgZm9yIG1pcHMtKi1nbnUqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTWFyIDMxIDE0OjAxOjQwIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBTZXQgdG8gImNvZmYtbTY4ay1zeXN2IiBpZgotCVRFX0RFTFRBLgotCi1GcmkgTWFyIDI4IDE4OjAzOjE5IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX0VOQUJMRSBmb3IgY29tbW9uYmZkbGliLiAgSWYgaXQgaXMgc2V0LAotCXNldCBPUENPREVTX0xJQiB0byBlbXB0eS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyOCAxNToyNToyNCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotbGludXgqYW91dCosIHNwYXJjLSotbGludXgqKTogTmV3Ci0JdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE1hciAyOCAxMzowODozMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGl0YmwtcGFyc2UueSAoeXllcnJvcik6IE1ha2Ugc3RhdGljLiAgRGVjbGFyZS4KLQotCUZyb20gUmFsZiBCYWVjaGxlIDxyYWxmQGdudS5haS5taXQuZWR1PjoKLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGVtdWxhdGlvbnMgZm9yIG1pcHMtKi1saW51eCotKi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoc3RydWN0IG1pcHNfc2V0X29wdGlvbnMpOiBEZWZpbmUuCi0JKG1pcHNfb3B0cyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1pcHNfaXNhKTogUmVtb3ZlLiAgTm93IGEgZmllbGQgaW4gbWlwc19vcHRzLiAgQ2hhbmdlIGFsbAotCXJlZmVyZW5jZXMuCi0JKG1pcHMxNiwgbWlwczE2X2F1dG9leHRlbmQsIG1pcHNfd2Fybl9hYm91dF9tYWNyb3MpOiBMaWtld2lzZS4KLQkobWlwc19ub3Jlb3JkZXIsIG1pcHNfbm9tb3ZlLCBtaXBzX25vYXQsIG1pcHNfbm9ib3B0KTogTGlrZXdpc2UuCi0JKHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayk6IERlZmluZS4KLQkobWlwc19vcHRzX3N0YWNrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19taXBzc2V0KTogQWRkIHN1cHBvcnQgZm9yIC5zZXQgcHVzaCBhbmQgLnNldCBwb3AuCi0JKiBkb2MvYy1taXBzLnRleGk6IERvY3VtZW50IC5zZXQgcHVzaCBhbmQgLnNldCBwb3AuCi0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayk6IERlY2xhcmUgaXQuCi0JKiBjb25maWcvdGMtbWlwcy5jIChzX2NoYW5nZV9zZWMpOiBDYWxsIGl0IGlmIE9CSl9FTEYuCi0KLVRodSBNYXIgMjcgMTI6MjM6NTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogVXBkYXRlIGNvcHlyaWdodCBkYXRlIGluIHZlcnNpb24gbWVzc2FnZS4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuLWhlcmUpOiBSZW1vdmUgZGVwZW5kZW5jeSBmaWxlcy4KLQotCSogcmVhZC5jIChzX2NvbW0pOiBDaGVjayBTX0lTX0NPTU1PTiBhcyB3ZWxsIGFzIFNfSVNfREVGSU5FRC4KLQkoc19tcmlfY29tbW9uKTogQ2hlY2sgU19JU19DT01NT04gdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5jIChjb2xvbik6IENoZWNrIFNfSVNfQ09NTU9OIGFzIHdlbGwgYXMgU19JU19ERUZJTkVELgotCSogY29uZmlnL3RjLWFscGhhLmMgKHNfYWxwaGFfY29tbSk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYyAobm9waWNfbmVlZF9yZWxheCk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogTGlrZXdpc2UuCi0JKHBwY19wZV9jb21tKTogTGlrZXdpc2UuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2NvbW1vbik6IExpa2V3aXNlLiAgU2V0IHNlZ21lbnQgb2YKLQljb21tb24gc3ltYm9sIHRvIGJmZF9jb21fc2VjdGlvbl9wdHIuCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc19jb21tb24pOiBMaWtld2lzZS4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjcgMDA6Mjk6NDYgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKG1kX2FwcGx5X2ZpeDMpOiBHZXQgdGhlIHJlbG9jcyByaWdodC4KLQotV2VkIE1hciAyNiAxMzozNToxNSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfaTM4Nl9maXhfYWRqdXN0YWJsZSk6IE9ubHkgZGVmaW5lIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQotV2VkIE1hciAyNiAxMTozMjo1MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX25leHRfYnVmZmVyKTogSGFuZGxlIHZlcnkgbG9uZyBpbnB1dAotCWxpbmVzIGNvcnJlY3RseS4KLQotCSogbGlzdGluZy5jIChwcmludF9saW5lcyk6IEFkZCBsaW5lbm8gcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuCi0JKGxpc3RpbmdfbGlzdGluZyk6IE9ubHkgY2FsbCBjYWxjX2hleCBmb3IgdGhlIHJpZ2h0IGxpbmUuCi0JKGxpc3RpbmdfbGlzdCk6IFNldCB0aGUgbmV3IGVkaWN0IGJhc2VkIG9uIHRoZSBjdXJyZW50IGVkaWN0LCBpbgotCW9yZGVyIHRvIGhhbmRsZSBsaXN0aW5nIGNvbW1hbmRzIGluIG1hY3JvcyBjb3JyZWN0bHkuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGluc25fdXNlc19yZWcpOiBNYXAgcmVnaXN0ZXIgbnVtYmVycyBpbiBtaXBzMTYKLQlpbnN0cnVjdGlvbnMuCi0KLQkqIGNvbmQuYyAoY29uZF9maW5pc2hfY2hlY2spOiBOZXcgZnVuY3Rpb24uCi0JKiBhcy5oIChjb25kX2ZpbmlzaF9jaGVjayk6IERlY2xhcmUuCi0JKiBhcy5jIChtYWluKTogQ2FsbCBjb25kX2ZpbmlzaF9jaGVjay4KLQotVHVlIE1hciAyNSAxNDo0NTo1NCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAobWRfYXNzZW1ibGUpOiBJZiB0d28gaW5zdHJ1Y3Rpb25zCi0JYXJlIHN1cHBvc2VkIHRvIGJlIGFzc2VtYmxlZCBpbiBwYXJhbGxlbCBhbmQgdGhlIGZpcnN0IG9uZSBpcwotCWxvbmcsIHByaW50IGFuIGVycm9yIGFuZCBzdG9wLgotCShtZF9hcHBseV9maXgzKTogRG9uJ3QgY2FsY3VsYXRlIGFic29sdXRlIHJlbG9jcy4gIEp1c3Qgd3JpdGUKLQl0aGVtIG91dC4KLQotTW9uIE1hciAyNCAxMjoxMToxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmggKGljbHJLbHVkZ2UpOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBpY2xyS2x1ZGdlLgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAodGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWZpbmUgaWYKLQlPQkpfRUNPRkYuCi0JKGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogRGVjbGFyZSBpZiBPQkpfRUNPRkYuCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZGVidWcpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgYWxwaGFfZGVidWcgaWYgLWcgaXMgc2Vlbi4KLSAJKGFscGhhX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogTmV3IGZ1bmN0aW9uIGlmIE9CSl9FQ09GRi4KLQotU3VuIE1hciAyMyAxODowMzozMSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQzMHYuYyAoYnVpbGRfaW5zbik6IEVuYWJsZSByYW5nZS1jaGVja2luZyBjb2RlLgotCShwb3N0Zml4KTogU3RvcCBhdCBzcGFjZSBvciBjb21tYS4KLQkobWRfYXNzZW1ibGUpOiBDaGFuZ2UgZXJyb3IgbWVzc2FnZS4KLQotU2F0IE1hciAyMiAxMzo0NDoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBhdXRvbWF0aWMgZGVwZW5kZW5jeSBidWlsZGluZy4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLgotCi1GcmkgTWFyIDIxIDE1OjQyOjM3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1pZWVlLmMgKHNlZ21lbnRfbmFtZSk6IERvbid0IGRlZmluZSBmdW5jdGlvbiBpZiB0aGlzCi0JaXMgYSBtYWNyby4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWg4MzAwLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLWg4NTAwLmggKERPX1NUUklQKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3RjLXc2NS5oIChET19TVFJJUCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy90Yy16OGsuaCAoRE9fU1RSSVApOiBEb24ndCBkZWZpbmUuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDYWxsIG9ial9mcm9iX2xhYmVsIGlmIGl0IGlzIGRlZmluZWQuCi0JKiBjb25maWcvb2JqLXZtcy5oIChvYmpfZnJvYl9sYWJlbCk6IFJlbmFtZSBmcm9tIHRjX2Zyb2JfbGFiZWwuCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IGZpbGVzIGFuZCBsaW5rcy4gIERvbid0IGNhbGwKLQlBQ19MSU5LX0ZJTEVTLiAgU3Vic3RpdHV0ZSB0ZV9maWxlLiAgQ3JlYXRlIHRhcmctY3B1LmgsCi0Jb2JqLWZvcm1hdC5oLCB0YXJnLWVudi5oLCBhbmQgaXRibC1jcHUuaCBpbiBBQ19PVVRQVVQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfQyk6IE5ldyB2YXJpYWJsZS4KLQkoVEFSR19DUFVfTywgVEFSR19DUFVfSCk6IE5ldyB2YXJpYWJsZXMuCi0JKE9CSl9GT1JNQVRfQywgT0JKX0ZPUk1BVF9PLCBPQkpfRk9STUFUX0gpOiBOZXcgdmFyaWFibGVzLgotCShUQVJHX0VOVl9ILCBBVE9GX1RBUkdfQywgQVRPRl9UQVJHX08pOiBOZXcgdmFyaWFibGVzLgotCShTT1VSQ0VTKTogUmVuYW1lIGZyb20gUkVBTF9TT1VSQ0VTLiAgRGVsZXRlIG9sZCBkZWZpbml0aW9uLgotCShMSU5LRURfU09VUkNFUyk6IFJlbW92ZS4KLQkoSEVBREVSUyk6IFJlbmFtZSBmcm9tIFJFQUxfSEVBREVSUy4gIERlbGV0ZSBvbGQgZGVmaW5pdGlvbi4KLQkoTElOS0VEX0hFQURFUlMpOiBSZW1vdmUuCi0JKE9CSlMpOiBVc2UgJChUQVJHX0NQVV9PKSwgZXRjLiwgcmF0aGVyIHRoYW4gdGFyZy1jcHUubywgZXRjLgotCSgkKE9CSlMpKTogRGVwZW5kIHVwb24gJChUQVJHX0VOVl9IKSwgZXRjLiwgcmF0aGVyIHRoYW4KLQl0YXJnLWNwdS5oLCBldGMuCi0JKCQoVEFSR19DUFVfTyksICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSk6IE5ldyB0YXJnZXRzLgotCSh0YXJnLWNwdS5vLCBvYmotZm9ybWF0Lm8sIGF0b2YtdGFyZy5vKTogUmVtb3ZlIHRhcmdldHMuCi0JKGl0YmwtY3B1LmgpOiBSZW1vdmUgdGFyZ2V0LgotCShESVNUQ0xFQU5fSEVSRSk6IFJlbW92ZSB0YXJnLWNwdS5jLCBvYmotZm9ybWF0LmMsIGF0b2YtdGFyZy5jLAotCWF0b2YtdGFyZy5oLgotCi1UaHUgTWFyIDIwIDE5OjE4OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKFN5bWJvbCBOYW1lcyk6IERvbid0IHVzZSBvYnNvbGV0ZSBAY3RybCBtYWNyby4KLQotVGh1IE1hciAyMCAxNjo0OToxNCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobXJpX2NoaXApOiBSZXBsYWNlIGNhbGxzIHRvIGdldF9zeW1ib2xfZW5kIGJ5Ci0Jb3BlbiBjb2RlZCBsb29wIHRoYXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgbmFtZSB0byBzdGFydCB3aXRoIGEKLQluYW1lIGJlZ2lubmVyLgotCi1UaHUgTWFyIDIwIDEzOjQyOjAxIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBmcmFncy5jIChmcmFnX3Zhcik6IENoYW5nZSBvZmZzZXQgcGFyYW1ldGVyIHRvIG9mZnNldFQuCi0JKGZyYWdfdmFyaWFudCk6IExpa2V3aXNlLgotCSogZnJhZ3MuaCAoZnJhZ192YXJpYW50LCBmcmFnX3Zhcik6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKiBjb25maWcvdGMtbTY4ay5jIChzdHJ1Y3QgbTY4a19pdCk6IENoYW5nZSBmb2ZmIGZpZWxkIHRvCi0Jb2Zmc2V0VC4KLQkoYWRkX2ZyYWcpOiBDaGFuZ2Ugb2ZmIHBhcmFtZXRlciB0byBvZmZzZXRULgotCSogU2V2ZXJhbCBmaWxlczogQWRkIGNhc3RzIHRvIGNhbGxzIHRvIGZyYWdfdmFyLgotCi0JKiBNYWtlZmlsZS5pbiAobTY4ay1wYXJzZS5jKTogRGVwZW5kIHVwb24gaXRibC1wYXJzZS5jLCB0bwotCXNlcmlhbGl6ZSBhIHBhcmFsbGVsIG1ha2UuCi0JKGl0YmwtcGFyc2UuaCk6IFNwbGl0IHRhcmdldCBvdXQgZnJvbSBpdGJsLXBhcnNlLmMuCi0KLVRodSBNYXIgMjAgMTI6NDg6NDUgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL202OGstcGFyc2UueSAobW90b3JvbGFfb3BlcmFuZCk6IEFsbG93ICh6ZGlyZWcsRVhQUikuCi0KLQkqIGNvbmZpZy90ZS1kZWx0YS5oIChDT0ZGX0NPTU1PTl9BRERFTkQpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IENoZWNrIENPRkZfQ09NTU9OX0FEREVORCB3aGVuCi0Jc3RvcmluZyB0aGUgdmFsdWUgb2YgYSBjb21tb24gc3ltYm9sLgotCi1XZWQgTWFyIDE5IDExOjM3OjU3IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChnbHVlX3N5bWJvbHMpOiBVbnVzZWQgdmFyaWFibGUgc3ltYm9sUAotCXJlbW92ZWQuCi0JKGNyYXdsX3N5bWJvbHMpOiBEbyBub3QgbW9kaWZ5IHN5bWJvbF9yb290UCBhbmQgc3ltYm9sX2xhc3RQIGhlcmU7Ci0JdGhhdCBpcyBkb25lIGJ5IHN5bWJvbF9yZW1vdmUgYW5kIHN5bWJvbF9pbnNlcnQuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5oIChTX0lTX0xPQ0FMKTogUmV0dXJuIDAgZm9yIGEgZGVidWdnaW5nCi0Jc3ltYm9sLgotCi1XZWQgTWFyIDE5IDExOjA2OjI5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEluIDMyIGJpdCBtb2RlLCB3aGVuIG5vdAotCWRlYWxpbmcgd2l0aCBhIDY0IGJpdCBudW1iZXIsIHBlcm1pdCB0aGUgdXBwZXIgMzIgYml0cyB0byBiZSBzZXQKLQlldmVuIGlmIGJpdCAzMSBpcyBub3Qgc2V0LgotCi1UdWUgTWFyIDE4IDIzOjMwOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkICJlcXVpdiIuCi0JKHNfc2V0KTogSGFuZGxlIC5lcXVpdiBiYXNlZCBvbiBhcmd1bWVudC4KLQkqIGRvYy9hcy50ZXhpbmZvIChFcXVpdik6IE5ldyBub2RlIHRvIGRvY3VtZW50IC5lcXVpdi4KLQkoRXJyKTogTmV3IG5vZGUgdG8gZG9jdW1lbnQgLmVyci4KLQotVHVlIE1hciAxOCAxNTo1MDoxMyAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogTWFueSBmaWxlczogQWRkIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0JKiBhcy5jIChzaG93X3VzYWdlLCBwYXJzZV9hcmdzKTogTWFrZSBzdGF0aWMuCi0JKiBmcmFncy5oIChmcmFnX2FsbG9jKTogRGVjbGFyZS4KLQkqIHN1YnNlZ3MuYyAoc3Vic2VnX3NldF9yZXN0KTogRG9uJ3QgZGVjbGFyZSBmcmFnX2FsbG9jLgotCSogc3ltYm9scy5jIChkb2xsYXJfbGFiZWxfaW5zdGFuY2UpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gbG9uZy4KLQkqIHN5bWJvbHMuaCAocHJpbnRfc3ltYm9sX3ZhbHVlKTogRGVjbGFyZS4KLQkocHJpbnRfZXhwciwgcHJpbnRfZXhwcl8xLCBwcmludF9zeW1ib2xfdmFsdWVfMSk6IERlY2xhcmUuCi0JKiB3cml0ZS5jIChmaXhfbmV3X2V4cCk6IERvbid0IGRlY2xhcmUgbWFrZV9leHByX3N5bWJvbC4KLQkocmVtb3ZlX3N1YnNlZ3MsIHJlbGF4X2ZyYWcpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZy9hdG9mLXZheC5jIChhdG9mX3ZheF9zaXplb2YpOiBDaGFuZ2UgbGV0dGVyIHRvIGludC4KLQkod2hhdF9raW5kX29mX2Zsb2F0KTogTGlrZXdpc2UuCi0JKGF0b2ZfdmF4KTogTWFrZSBzdGF0aWMuICBDaGFuZ2Ugd2hhdF9raW5kIHRvIGludC4KLQkobWRfYXRvZik6IENoYW5nZSB3aGF0X3N0YXRlbWVudF90eXBlIHRvIGludC4KLQkqIGNvbmZpZy9vYmotZWNvZmYuaCAob2JqX2Vjb2ZmX3NldF9leHQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWFscGhhLmMgKHZheF9tZF9hdG9mKTogRGVjbGFyZS4KLQkobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlIGFuZCB2YXhfbWRfYXRvZi4KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNldF8xNmJpdF9jb2RlX2ZsYWcpOiBNYWtlIHN0YXRpYy4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAoYWRkX2ZpeCk6IENoYW5nZSB3aWR0aCB0byBpbnQuCi0JKGluc2VydF9yZWcpOiBDaGFuZ2UgcmVnbmFtZSB0byBjb25zdC4KLQkobWRfYXRvZik6IERvbid0IGRlY2xhcmUgYXRvZl9pZWVlLgotCShkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lKTogRG9uJ3QgZGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1tODhrLmMgKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChjbXBfcmVnX2VudHJ5KTogQ2hhbmdlIGFyZ3MgdG8gY29uc3QgUFRSLgotCShwYXJzZV9rZXl3b3JkX2FyZyk6IENoYW5nZSBsb29rdXBfZm4gdG8gdGFrZSBjb25zdCBhcmcuCi0JKG1kX2F0b2YpOiBEb24ndCBkZWNsYXJlIGF0b2ZfaWVlZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5oOiBBZGQgaWZkZWYgZm9yIG11bHRpcGxlIGluY2x1c2lvbi4KLQkodGNfYW91dF9wcmVfd3JpdGVfaG9vayk6IERvbid0IGRlY2xhcmUuCi0KLU1vbiBNYXIgMTcgMTE6MjE6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oIChiZmRfYWxsb2NfYnlfc2l6ZV90KTogRG9uJ3QgZGVjbGFyZS4KLQkqIE1hbnkgZmlsZXM6IFVzZSB4bWFsbG9jIHJhdGhlciB0aGFuIGJmZF9hbGxvY19ieV9zaXplX3QuCi0KLVN1biBNYXIgMTYgMTM6NDk6MjEgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBzeW1ib2xzLmMgKHN5bWJvbF9uZXcpOiBEb24ndCBjYWxsIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbi4KLQkoc3ltYm9sX2FwcGVuZCk6IFNldCBzeV9uZXh0IGFuZCBzeV9wcmV2aW91cyB3aGVuIGFkZGluZyBhIHNpbmdsZQotCXN5bWJvbCB0byBhbiBlbXB0eSBsaXN0LiAgQ2FsbCBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4uCi0JKHZlcmlmeV9zeW1ib2xfY2hhaW4pOiBVc2UgYXNzZXJ0LCBub3Qga25vdy4KLQotU2F0IE1hciAxNSAyMDoyNzoxMiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTkVXUzogTm90ZSBCZU9TIHN1cHBvcnQuCi0JKiBjb25maWd1cmUuaW46IChwcGMtKi1iZW9zKTogTmV3IHRhcmdldCwgdXNlIGNvZmYgYXMgb2JqZWN0IGZvcm1hdC4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZSB3aXRoIGF1dG9jb25mLgotCQotU2F0IE1hciAxNSAxOToxNDowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2FwcGx5X2ZpeCk6IEltcHJvdmUgZXJyb3IgbWVzc2FnZSBmb3Igb3V0Ci0Jb2YgcmFuZ2UgYnJhbmNoLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY2llcyBvbiBvYnN0YWNrLmggd2hlcmUgbmVlZGVkLgotCi1GcmkgTWFyIDE0IDE1OjMzOjM4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBIYW5kbGUgdGhlCi0JY2FzZSBvZiBhIHN5bWJvbCBlcXVhdGVkIHRvIGFub3RoZXIgc3ltYm9sIHdoZW4gdXNpbmcgU1ZSNF9QSUMuCi0KLQkqIE1ha2VmaWxlLmluIChUQVJHX0NQVV9ERVBfc3BhcmMpOiBBZGQgb3Bjb2RlL3NwYXJjLmguCi0KLVRodSBNYXIgMTMgMTE6MjA6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IENhbGwgTElTVElOR19ORVdMSU5FIGJlZm9yZQotCUhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSB3aGVuIGhhbmRsaW5nIGFuIE1SSSBsaW5lIGxhYmVsLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX2RhdGEpOiBDYWxsIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0JYW5kIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIGlmIHRoZXkgYXJlIGRlZmluZWQuCi0JKG9ial9lbGZfdGV4dCwgb2JqX2VsZl9wcmV2aW91cyk6IExpa2V3aXNlLgotCi1XZWQgTWFyIDEyIDExOjQwOjIwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1tdWx0aS5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IERlZmluZSBpZgotCU9CSl9NQVlCRV9FTEYuCi0JKE9CSl9TWU1GSUVMRF9UWVBFKTogRGVmaW5lIGFzIHN0cnVjdCBlbGZfb2JqX3N5IGlmCi0JT0JKX01BWUJFX0VMRi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKHN0cnVjdCBlbGZfb2JqX3N5KTogRG9uJ3QgZGVmaW5lIGlmCi0JT0JKX1NZTUZJRUxEX1RZUEUgaXMgZGVmaW5lZC4KLQotCSogZG9jL2FzLnRleGluZm8gKGJzcyk6IEltcHJvdmUgZGVzY3JpcHRpb24gb2YgLmJzcyBzZWN0aW9uLiAgSW4KLQlFTEYgb3IgQ09GRiwgeW91IGFyZSBwZXJtaXR0ZWQgdG8gc3dpdGNoIGludG8gdGhlIHNlY3Rpb24uCi0JKENvbW0pOiBSZXdyaXRlIGRlc2NyaXB0aW9uIG9mIGNvbW1vbiBzeW1ib2xzLgotCShMY29tbSk6IE1lbnRpb24gdGhhdCBzb21lIHRhcmdldHMgcGVybWl0IGEgdGhpcmQgYXJndW1lbnQuCi0KLVR1ZSBNYXIgMTEgMDE6MTM6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfbGNvbW0pOiBEb24ndCBjYWxsIFNfQ0xFQVJfRVhURVJOQUwuCi0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBDaGFuZ2UgdHlwZSBvZiBsb2NhbCB0byBpbnQuICBGcm9tIEFsYW4gTW9kcmEKLQk8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+LgotCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogRG9uJ3QgdXNlIGEgc3BlY2lhbCBub3AKLQlhbGlnbm1lbnQgaWYgYSB6ZXJvIGZpbGwgcGF0dGVybiB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQotCSogcmVhZC5jIChlcXVhbHMpOiBBbHdheXMgcGVybWl0IHJlZ2lzdGVyIG5hbWVzIHRvIGJlIHJlZGVmaW5lZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19maXhfYWRqdXN0YWJsZSk6IFBlcm1pdCBhIHJlbG9jIGFnYWluc3QgYQotCW1pcHMxNiBzeW1ib2wgdG8gYmUgYWRqdXN0ZWQgaWYgYSBzeW1ib2wgaXMgYmVpbmcgc3VidHJhY3RlZCBmcm9tCi0JaXQuCi0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N5bXZlcik6IENoZWNrIGZvciBkdXBsaWNhdGUgb3IKLQlpbGxlZ2FsIHN5bWJvbCB2ZXJzaW9uIG5hbWVzLgotCShlbGZfZnJvYl9zeW1ib2wpOiBDaGVjayBmb3IgZXh0ZXJuYWwgZGVmYXVsdCB2ZXJzaW9ucy4KLQotU3VuIE1hciAgOSAyMzo0OToxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBjb25maWcvb2JqLWVsZi5oIChzdHJ1Y3QgZWxmX29ial9zeSk6IERlZmluZS4KLQkoT0JKX1NZTUZJRUxEX1RZUEUpOiBEZWZpbmUgdG8gZWxmX29ial9zeSBzdHJ1Y3QuICBDaGFuZ2UgYWxsCi0JdXNlcnMuCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3N5bXZlcik6IEp1c3QgcmVjb3JkIHRoZSBuYW1lLgotCShvYmpfc3ltYm9sX25ld19ob29rKTogSW5pdGlhbGl6ZWQgdmVyc2lvbmVkX25hbWUgZmllbGQuCi0JKGVsZl9mcm9iX3N5bWJvbCk6IElmIHRoZXJlIGlzIGEgdmVyc2lvbmVkX25hbWUsIGVpdGhlciByZW5hbWUgdGhlCi0Jc3ltYm9sLCBvciBhZGQgYW4gYWxpYXMgd2l0aCB0aGF0IG5hbWUuCi0KLVRodSBNYXIgIDYgMTM6NTU6MzIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9yZWxheF90YWJsZSk6IERlZmluZS4KLQkobWRfY29udmVydF9mcmFnKTogSW1wbGVtZW50LgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSByZWxheGFibGUgb3BlcmFuZHMvaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJbXBsZW1lbnQuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRGVmaW5lLgotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IEZpeCB0eXBvcy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCB1c2UgYW55IE1OMTAzMDAgc3BlY2lmaWMKLQlyZWxvY3MgYW55bW9yZS4gIFR3ZWFrIGZ4X29mZnNldCBmb3IgcGMtcmVsYXRpdmUgcmVsb2NzLgotCi1XZWQgTWFyICA1IDE1OjQ2OjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZC5jIChzX2lmYyk6IENhbGwgbXJpX2NvbW1lbnRfZmllbGQgYW5kIG1yaV9jb21tZW50X2VuZCB3aGVuCi0JaW4gTVJJIG1vZGUuCi0KLVR1ZSBNYXIgIDQgMTk6MzQ6MjEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgInNlY3QiIGFuZCAic2VjdGlvbiIKLQlwc2V1ZG8tb3BzLgotCSogY29uZmlnL3RjLXRpYzgwLmMgKG1kX2JlZ2luKTogRGVjbGFyZSBleHRlcm5hbCB2YXJpYWJsZQotCWNvZmZfZmxhZ3MgYW5kIGluc2VydCBhbiBGX0FSMzJXUiBiaXQgaW50byBpdC4KLQotVHVlIE1hciAgNCAxMDowMTowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZXF1YWxzKTogQWRkIHJlYXNzaWduIHBhcmFtZXRlci4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkqIHJlYWQuaCAoZXF1YWxzKTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCi1TYXQgTWFyICAxIDAxOjA0OjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBEb24ndCBhc3N1bWUgdGhhdCB3ZQotCWNhbiByZWx5IG9uIHRoZSBmcmFnIGFkZHJlc3MgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmcmFnIGlzCi0JZWFybGllciBvciBsYXRlci4KLQotRnJpIEZlYiAyOCAxNDo0MDowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmggKExPQ0FMX0xBQkVMKTogT25seSBkZWZpbmUgaWYgbm90IEJGRF9BU1NFTUJMRVIuCi0JKFNfTE9DQUxfTkFNRSk6IExpa2V3aXNlLgotCShGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgdW5jb25kaXRpb25hbGx5LgotCSogc3ltYm9scy5jIChjb2xvbik6IENhbGwgYmZkX2lzX2xvY2FsX2xhYmVsLCBub3QgTE9DQUxfTEFCRUwsIGlmCi0JQkZEX0FTU0VNQkxFUi4KLQkoU19JU19MT0NBTCk6IENhbGwgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUsIG5vdCBMT0NBTF9MQUJFTC4KLQkqIGNvbmZpZy90Yy0qLmg6IE9ubHkgZGVmaW5lIExPQ0FMX0xBQkVMIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCURvbid0IGRlZmluZSBGQUtFX0xBQkVMX05BTUUuCi0JKiBjb25maWcvdGUtaWM5NjAuaDogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbWlwcy5oICh0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlZmluZS4KLQkobWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KTogTmV3IGZ1bmN0aW9uLgotCShtaXBzX2xvY2FsX2xhYmVsKTogUmVtb3ZlLgotCi0JKiBjb25maWcvdGUtc2NvMzg2Lmg6IFJlbW92ZTsgbm90IHVzZWQuCi0KLVRodSBGZWIgMjcgMTU6Mzk6MTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy10aWM4MCAobWRfcHNldWRvX3RhYmxlKTogQWRkIGFsaWduIHBzZXVkbyBvcCB0byBkbwotCWJ5dGUgYWxpZ25tZW50IHJhdGhlciB0aGFuIHBvd2VyLW9mLXR3byBhbGlnbm1lbnQgdGhhdCBpcyB0aGUKLQlHQVMgZGVmYXVsdC4KLQotVGh1IEZlYiAyNyAxMzoyOTowNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2Fzc2VtYmxlKTogSGFuZGxlIGEgcmVsb2Mgd2lkdGggb2YgJ1cnLgotCi0JKiBnYXNwLmMgKGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSk6IENvcnJlY3QgbWlzc3BlbGxpbmcgaW4gZXJyb3IKLQltZXNzYWdlLCBhbmQgYWRkIG5ld2xpbmUuCi0JKHByb2Nlc3NfZmlsZSk6IERvbid0IHByb2Nlc3MgYXNzaWdubWVudHMgaW4gdGhlIGxhYmVsIGlmIHRoaXMgaXMKLQlhIGVxdSBvciBhc3NpZ24gcHNldWRvLW9wLgotCShwcm9jZXNzX3BzZXVkb19vcCk6IFN3YXAgZmlyc3QgYXJndW1lbnQgdG8gZG9fYXNzaWduIGZvciBLX0FTU0lHTgotCWFuZCBLX0VRVSwgdG8gbWF0Y2ggZG9jdW1lbnRhdGlvbi4KLQotVGh1IEZlYiAyNyAxMjowMDowMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX3NlY3Rpb24pOiBBZGQgJ3InIHNlY3Rpb24gYXR0cmlidXRlCi0JdG8gZGVub3RlIHJlYWQtb25seSBkYXRhIHNlY3Rpb25zLgotCi1UaHUgRmViIDI3IDAwOjI2OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9jb21tb24pOiBTZXQgQlNGX09CSkVDVCBpbiBmbGFncy4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IExpa2V3aXNlLCBpZiBCRkRfQVNTRU1CTEVSLgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBTaW1wbGlmeSAwYiBoYW5kbGluZy4gIERvbid0IHRyZWF0IDBiIGFzIGEKLQliaW5hcnkgbnVtYmVyIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnKycgb3IgJy0nLgotCi1XZWQgRmViIDI2IDIwOjQ3OjEyIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAoRkxUX0NIQVJTKTogQ2hhbmdlIGZyb20gImREIiB0byAiZkYiLgotCShmaW5kX29wY29kZSk6IE1hdGNoIG9wZXJhbmRzIHRoYXQgY2FuIGJlIGZsb2F0cy4KLQkoYnVpbGRfaW5zbik6IEhhbmRsZSBPX2JpZyAoZmxvYXQpIGV4cHJlc3Npb25zIGFuZCBidWlsZAotCWNvcnJlY3Qgb3Bjb2RlLgotCi1XZWQgRmViIDI2IDE4OjE5OjAwIDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzKi0qLWxuZXdzKik6IE5ldyB0YXJnZXQsIGFsc28gbWFrZSBlbXB0eQotCWVtdWxhdGlvbiBsaXN0IGZvciB0aGlzIHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogVXBkYXRlLgotCSogdGMtbWlwcy5jIChFQ09GRl9MSVRUTEVfRk9STUFUKTogRGVmaW5lLgotCShtaXBzX3RhcmdldF9mb3JtYXQpOiBVc2UuCi0JKiB0ZS1sbmV3cy5oOiBOZXcgZmlsZS4KLQotV2VkIEZlYiAyNiAxNTozMzo0NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXRpYzgwLmMgKGZpbmRfb3Bjb2RlLCBidWlsZF9pbnNuKTogQ2hhbmdlcyB0byBtYXRjaAotCW9wZXJhbmRzIHdpdGggOm0gb3IgOnMgbW9kaWZpZXJzIGFuZCBnZW5lcmF0ZSB0aGUgcmlnaHQgb3Bjb2RlcwotCWZvciB0aGVtLgotCi1XZWQgRmViIDI2IDExOjU2OjExIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmgpOiBVc2UgJChCSVNPTikgYW5kCi0JJChCSVNPTkZMQUdTKSwgbm90ICQoWUFDQykgYW5kICQoWUFDQ0ZMQUdTKS4KLQotVHVlIEZlYiAyNSAyMjowMjoyMyAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbnN0cmluZyk6IFVzZWxlc3MgbG9jYWwgZGVjbGFyYXRpb24gb2YKLQljcmFja19vcGVyYW5kIHJlbW92ZWQuCi0JKiBleHByLmggKGV4cHJlc3Npb25TKTogQ2hhbmdlZCB0eXBlIG9mIFhfb3AgZmllbGQgdG8gb3BlcmF0b3JUIGlmCi0JX19HTlVDX18uCi0KLVR1ZSBGZWIgMjUgMTM6MTc6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGRnaWkuY29tPjoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGkzODZjb2ZmIGFuZCBpMzg2ZWxmIHRvIGVtdWxhdGlvbiBsaXN0LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogYXMuYyAoaTM4NmNvZmYsIGkzODZlbGYpOiBEZWNsYXJlLgotCSogb2JqLmggKGNvZmZfZm9ybWF0X29wcyk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoT0JKX0hFQURFUik6IERlZmluZS4KLQkoY29mZl9vYmpfc3ltYm9sX25ld19ob29rKTogUmVuYW1lIGZyb20gb2JqX3N5bWJvbF9uZXdfaG9vay4KLQkoY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rKTogUmVuYW1lIGZyb20gb2JqX3JlYWRfYmVnaW5faG9vay4KLQkob2JqX3BzZXVkb190YWJsZSk6IEFkZCAidmVyc2lvbiIuCi0JKGNvZmZfcG9wX2luc2VydCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShub19mdW5jKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoY29mZl9mb3JtYXRfb3BzKTogTmV3IHZhcmlhYmxlLgotCSogY29uZmlnL29iai1jb2ZmLmggKGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayk6IERlY2xhcmUuCi0JKG9ial9zeW1ib2xfbmV3X2hvb2spOiBEZWZpbmUuCi0JKGNvZmZfb2JqX3JlYWRfYmVnaW5faG9vayk6IERlY2xhcmUuCi0JKG9ial9yZWFkX2JlZ2luX2hvb2spOiBEZWZpbmUuCi0JKiBjb25maWcvdGMtaTM4Ni5oIChpMzg2X3RhcmdldF9mb3JtYXQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLWkzODYuYzogQ2hlY2sgT0JKX01BWUJFX0VMRiBhcyB3ZWxsIGFzIE9CSl9FTEY7IGNoZWNrCi0JT1VUUFVUX0ZMQVZPUiB3aGVuIGFwcHJvcHJpYXRlLgotCShpMzg2X3RhcmdldF9mb3JtYXQpOiBOZXcgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbiAob2JqLWNvZmYubyk6IE5ldyB0YXJnZXQuCi0JKGUtaTM4NmNvZmYubywgZS1pMzg2ZWxmLm8pOiBOZXcgdGFyZ2V0cy4KLQotCUZyb20gU3RlcGhlbiBXaWxsaWFtcyA8c3RldmVAaWNhcnVzLmljYXJ1cy5jb20+OgotCSogY29uZmlnL3RjLWk5NjAuaCAoVENfU1lNRklFTERfVFlQRSk6IERlZmluZSBpZiBPQkpfQ09GRi4KLQkoX3RjX2dldF9iYWxfb2ZfY2FsbCk6IERvbid0IGRlY2xhcmUuCi0JKHRjX2dldF9iYWxfb2ZfY2FsbCk6IERlY2xhcmUgYXMgZnVuY3Rpb24sIGRvbid0IGRlZmluZSBhcyBtYWNyby4KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRjX3NldF9iYWxfb2ZfY2FsbCk6IElmIE9CSl9DT0ZGLCBzdG9yZSBiYWxQCi0JaW4gc3lfdGMgZmllbGQsIG5vdCB4X2JhbG50cnkgZmllbGQuCi0JKHRjX2dldF9iYWxfb2ZfY2FsbCk6IFJlbmFtZSBmcm9tIF90Y19nZXRfYmFsX29mX2NhbGwuICBDaGFuZ2UKLQlyZXR1cm4gdHlwZSB0byBzeW1ib2xTICouICBJZiBPQkpfQ09GRiwgcmV0cmlldmUgdmFsdWUgZnJvbSBzeV90YwotCWZpZWxkLCBub3QgeF9iYWxudHJ5IGZpZWxkLgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBQZXJtaXQgYSAubm90ZSBzZWN0aW9uIHRvCi0JaGF2ZSB0aGUgU0hGX0FMTE9DIGF0dHJpYnV0ZS4KLQotCSogTWFrZWZpbGUuaW4gKCQoT0JKUykpOiBEb24ndCBkZXBlbmQgdXBvbiAkKElUX0hEUlMpLgotCShUQVJHX0NQVV9ERVBfbWlwcyk6IERlcGVuZCB1cG9uICQoc3JjZGlyKS9pdGJsLW9wcy5oLgotCShpdGJsLWxleC5vKTogRGVwZW5kIHVwb24gaXRibC1wYXJzZS5oLgotCi0JKiBpdGJsLXBhcnNlLnkgKHl5ZXJyb3IpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gaW50LiAgQ2hhbmdlIHRvCi0JdXNlIG9sZCBzdHlsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KLQotCSogTWFrZWZpbGUuaW4gKGl0YmwtbGV4Lm8pOiBSZW1vdmUgLVdhbGwuCi0JKGl0YmwtcGFyc2Uubyk6IExpa2V3aXNlLgotCi0JKiBjb25kLmMgKHNfaWZkZWYpOiBJZiB3ZSBzaG91bGQgb21pdCBjb25kaXRpb25hbHMgZnJvbSBsaXN0aW5ncywKLQljYWxsIGxpc3RpbmdfbGlzdC4KLQkoc19pZiwgc19pZmMsIHNfZW5kaWYsIHNfZWxzZSwgc19pZmVxcyk6IExpa2V3aXNlLgotCSogbGlzdGluZy5jIChsaXN0X2luZm9fc3RydWN0KTogQWRkIEVESUNUX05PTElTVF9ORVhULgotCShsaXN0aW5nX2xpc3RpbmcpOiBIYW5kbGUgRURJQ1RfTk9MSVNUX05FWFQuCi0JKGxpc3RpbmdfbGlzdCk6IEFuIGFyZ3VtZW50IG9mIDIgbWVhbnMgRURJQ1RfTk9MSVNUX05FWFQuCi0JKiBsaXN0aW5nLmggKExJU1RJTkdfTk9DT05EKTogRGVmaW5lLgotCShMSVNUSU5HX1NLSVBfQ09ORCk6IERlZmluZS4KLQkqIGFzLmMgKHNob3dfdXNhZ2UpOiBNZW50aW9uIGMgYXMgYSBzdWJvcHRpb24gb2YgLWEuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgYyBhcyBhIHN1Ym9wdGlvbiBvZiAtYS4KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAtYWxjLgotCi1Nb24gRmViIDI0IDIzOjM0OjE0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYyAobWRfYXBwbHlfZml4KTogSGFuZGxlIFJfQUJTIHR5cGUgZml4dXBzLgotCi1Nb24gRmViIDI0IDE4OjI3OjQzIDE5OTcgIEVyaWMgWW91bmdkYWxlICA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBEb2N1bWVudCAuc3ltdmVyLgotCi1Nb24gRmViIDI0IDE1OjE5OjU3IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBDaGFuZ2UgcHJlX2RlZmluZWRfcmVnaXN0ZXJzIHRvIAotCWQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgYW5kIHJlZ19uYW1lX2NudCB0byBkMTB2X3JlZ19uYW1lX2NudC4KLQotTW9uIEZlYiAyNCAxMDo0MDo0NSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IEZpeCB0eXBvIGluIGNvbW1lbnQgc2VjdGlvbi4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgZW50cnkgZm9yIGJzcywgd2hpY2ggdGFrZXMKLSAJYW4gYWRkaXRpb25hbCBhbGlnbm1lbnQgYXJndW1lbnQuCi0JKGZpbmRfb3Bjb2RlKTogQWxsb3cgT19zeW1ib2wgcmVsb2NzIGZvciBhbnkgMzIgYml0IGZpZWxkLCBub3QganVzdAotIAliYXNlIHJlbGF0aXZlIG9uZXMuCi0JKGJ1aWxkX2luc24pOiBIYW5kbGUgT19zeW1ib2wgcmVsb2NzIGZvciBhbnkgMzIgYml0IGZpZWxkLCBub3QganVzdAotIAliYXNlIHJlbGF0aXZlIG9uZXMuCi0KLU1vbiBGZWIgMjQgMDI6MjM6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIGRlcGVuZGFuY2llcyBvbiBpdGJsLWNwdS5oLgotCSogYXMuYzogRGVmaW5lIHN0dWJzIGZvciBpdGJsX3BhcnNlIGFuZCBpdGJsX2luaXQgaWYgSEFWRV9JVEJMX0NQVSAKLQlpcyBub3QgZGVmaW5lZC4KLQotTW9uIEZlYiAyNCAwMjowMzowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0Ymwtb3BzLmg6IEluY2x1ZGUgYXMuaC4KLQotTW9uIEZlYiAyNCAwMTowNDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGFzLmM6IFJlbW92ZSAtdCBvcHRpb24uCi0JKiBjb25maWd1cmUsIGNvbmZpZ3VyZS5pbjogTW92ZSBpdGJsLWNwdS5oIHRvIG1pcHMgc3BlY2lmaWMgY29uZmlndXJlLgotCSogaXRibC1vcHMuaDogSW5jbHVkZSBpdGJsLWNwdS5oIG9ubHkgaWYgSEFWRV9JVEJMX0NQVSBpcyBkZWZpbmVkLgotCSogY29uZmlnL3RjLW1pcHMuaDogRGVmaW5lIEhBVkVfSVRCTF9DUFUuCi0KLVN1biBGZWIgMjMgMTg6MDE6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBpdGJsLW9wcy5jOiBEb24ndCBkZWZpbmUgREVCVUcuCi0KLVN1biBGZWIgMjMgMTc6NDk6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGl0YmwtdGVzdC5jIHRvIHJlZmxlY3QgaXRzIG5ldyBsb2NhdGlvbi4KLQotU3VuIEZlYiAyMyAxNTo1MDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0Ymwtb3BzLmM6IEFkZCB0ZXN0IGZvciBpdGJsX2hhdmVfZW50cmllcy4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IFJlbW92ZSB0ZXN0IGZvciBpdGJsX2hhdmVfZW50cmllcy4KLQkqIGNvbmZpZy90Yy1taXBzLmg6IERlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MgdG8gbWlwc19pbml0X2FmdGVyX2FyZ3MuCi0KLVN1biBGZWIgMjMgMTg6MTM6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogUmVtb3ZlIGl0YmwtcGFyc2UueSwgaXRibC1sZXgubCwgYW5kCi0JaXRibC1vcHMuYy4gIEFkZCBpdGJsLXBhcnNlLmMgYW5kIGl0YmwtbGV4LmMuCi0JKExFWCwgTEVYRkxBR1MpOiBEZWZpbmUuCi0JKiBpdGJsLW9wcy5jIChhcHBlbmRfaW5zbnNfYXNfbWFjcm9zKTogUmVtb3ZlIGJvZ3VzIEFTU0VSVC4KLQotU2F0IEZlYiAyMiAyMToyNTowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGl0YmwtcGFyc2UueTogRml4IGluZGVudGF0aW9uIG1pc3Rha2VzIGZyb20gaW5kZW50IHByb2dyYW0uCi0JKiBpdGJsLWxleC5sOiBGaXggaW5kZW50YXRpb24gbWlzdGFrZXMgZnJvbSBpbmRlbnQgcHJvZ3JhbS4KLQkqIGl0Ymwtb3BzLmg6IEFkZCBpbmNsdWRlIGZvciBhbnNpZGVjbC5oLgotCUFkZCBQQVJBTVMgYXJvdW5kIGZ1bmN0aW9uIGFyZ3VtZW50cy4KLQlBZGQgZGVjbGFyYXRpb24gZm9yIGl0YmxfaGF2ZV9lbnRyaWVzLgotCSogaXRibC1vcHMuYzogQWRkIFBBUkFNUyBhcm91bmQgZnVuY3Rpb24gYXJndW1lbnRzLgotCSogTWFrZWZpbGUuaW46IEFkZCBpdGJsIGJ1aWxkIHJ1bGVzLgotCUFkZCBkZXBlbmRhbmNpZXMgZm9yIGl0YmwgZmlsZXMgdG8gbWlwcyB0YXJnZXQuCi0JKiBhcy5jOiBBZGQgaXRibCBzdXBwb3J0LgotCUFkZCBuZXcgb3B0aW9uICItLWluc3R0YmwiIGZvciBkeW5hbWljYWxseSBleHRlbmRpbmcgaW5zdHJ1Y3Rpb24gc2V0LgotCSogYXMuaDogRGVjbGFyZSBpbnN0dGJsX2ZpbGVfbmFtZTsKLQl0aGUgbmFtZSBvZiBmaWxlIGRlZmluaW5nIGV4dGVuc2lvbnMgdG8gdGhlIGJhc2ljIGluc3RydWN0aW9uIHNldCAKLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlndXJlOiBBZGQgaXRibC1wYXJzZS5vLCBpdGJsLWxleC5vLCBhbmQgCi0JaXRibC1vcHMubyB0byBleHRyYV9vYmplY3RzIGZvciBtaXBzIGNvbmZpZ3VyYXRpb24uCi0JQWRkIGluY2x1ZGUgZmlsZSBsaW5rIGZyb20gaXRibC1jcHUuaCB0byAKLQljb25maWcvaXRibC0ke3RhcmdldF9jcHVfdHlwZX0uaC4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IEFsbG93IGNvcHogaW5zdHJ1Y3Rpb25zLgotCUFkZCBub3RlcyBmb3IgZnV0dXJlIGFkZGl0aW9ucyB0byB0aGUgaXRibCBzdXBwb3J0LgotCUFkZCBkZWJ1ZyBtYWNyb3MuCi0JKG1hY3JvKTogQ2FsbCBpdGJsX2Fzc2VtYmxlIHRvIGFzc2VtYmxlIGl0YmwgaW5zdHJ1Y3Rpb25zLgotCVNlZSBpZiBhbiB1bmtub3duIHJlZ2lzdGVyIGlzIHNwZWNpZmllZCBpbiBhbiBpdGJsIGVudHJ5LgotCi1TYXQgRmViIDIyIDIwOjUzOjAxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IEZpeCB0eXBvIGluIG1kX3NlY3Rpb25fYWxpZ24KLQlkZXNjcmlwdGlvbi4KLQkqIGNvbmZpZy90Yy10aWM4MC5oIChORUVEX0ZYX1JfVFlQRSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy10aWM4MC5jIChmaW5kX29wY29kZSk6IEFkZCBjb2RlIHRvIHN1cHBvcnQgT19zeW1ib2wKLQlvcGVyYW5kcy4KLQkoYnVpbGRfaW5zbik6IEdyYWIgYSBmcmFnIGVhcmx5IHNvIHdlIGNhbiB1c2UgdGhlIGFkZHJlc3MgaW4KLSAJZml4dXBzLiAgVGFrZSBvbmUncyBjb21wbGVtZW50IG9mIEJJVE5VTSB2YWx1ZXMgYmVmb3JlIGluc2VydGlvbgotIAlpbiBvcGNvZGUuICBBZGQgY29kZSB0byBzdXBwb3J0IE9fc3ltYm9sIG9wZXJhbmRzLgotCShtZF9hcHBseV9maXgpOiBSZXBsYWNlIHVuaW1wbGVtZW50ZWQgd2FybmluZyB3aXRoIGltcGxlbWVudGF0aW9uLgotCShtZF9wY3JlbF9mcm9tKTogRGl0dG8uCi0JKHRjX2NvZmZfZml4MnJ0eXBlKTogRGl0dG8uCi0KLUZyaSBGZWIgMjEgMTQ6MzQ6MzEgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMzB2LmMgKHBhcmFsbGVsX29rKTogTmV3IGZ1bmN0aW9uLiAKLQkqIGNvbmZpZy90Yy1kMzB2Lmg6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTi4KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IFJldHVybiAwIGlmCi0gICAgICAgIHJlbG9jYXRpb24gaXMgaW4gZGlmZmVyZW50IHNlY3Rpb24uCi0KLUZyaSBGZWIgMjEgMTA6MDg6MjUgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiB0Yy1taXBzLmMgKG1pcHNfaXApOiBJZiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYgc3lzdGVtLAotCWRvbid0IHNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4KLQotRnJpIEZlYiAyMSAxMTo1NTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKGxpbmVfY29tbWVudF9jaGFycyk6IEFkZCAnKicuCi0KLQkqIGFwcC5jIChMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzJORCk6IERvbid0IGRlZmluZS4KLQkoZG9fc2NydWJfYmVnaW4pOiBEb24ndCBzZXQgbGV4WycqJ10uCi0JKGRvX3NjcnViX2NoYXJzKTogV2hlbiBoYW5kbGluZyBMRVhfSVNfVFdPQ0hBUl9DT01NRU5UXzFTVCwgZG9uJ3QKLSAJY2hlY2sgZm9yIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMk5ELiAgSW5zdGVhZCwganVzdCBjaGVjayBmb3IKLQlhIGxpdGVyYWwgJyonLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBlbT1zdnI0IGZvciBtNjhrLSotc3lzdjQqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnL3RlLXN2cjQuaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2NvbW1lbnRfY2hhcnMpOiBPbmx5IGluY2x1ZGUgYCMnIGlmCi0JVEVfU1ZSNCBvciBURV9ERUxUQS4KLQotVGh1IEZlYiAyMCAyMjoyNDozOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IENyZWF0ZSBhIGZpeHVwIGZvciB0aGUKLQlzaG9ydCBjb25kaXRpb25hbCBicmFuY2ggYXJvdW5kIGEgbG9uZyB1bmNvbmRpdGlvbmFsIGJyYW5jaC4KLQotVGh1IEZlYiAyMCAxMzo1NjowMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9sbiBbYm90aCB2ZXJzaW9uc10pOiBDYWxsCi0JbmV3X2xvZ2ljYWxfbGluZS4KLQotCSogY29uZmlnL3RjLWFybS5jIChmaXhfbmV3X2FybSk6IFVzZSBtYWtlX2V4cHJfc3ltYm9sIHRvIGhhbmRsZSBhCi0JY29tcGxleCBleHByZXNzaW9uLgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogSWYgYm90aCBsZWZ0IGFuZCByaWdodAotCW9wZXJhbmRzIGFyZSB1bmRlZmluZWQsIHdhcm4gYWJvdXQgYm90aCBvZiB0aGVtLgotCi1XZWQgRmViIDE5IDAwOjUzOjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX3BzZXVkb190YWJsZSk6IEFkZCAic3ltdmVyIi4KLQkob2JqX2VsZl9zeW12ZXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogY29uZmlnL29iai1lbGYuaCAoT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMpOiBDb3B5IHRoZSBzdF9vdGhlcgotCWZpZWxkLgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTWFrZSB0eXBlIGFuZCBwcmludGYgZm9ybWF0IGFncmVlLgotCi0JKiByZWFkLmMgKGdldF9saW5lX3NiKTogRG9uJ3QgZW5kIHRoZSBsaW5lIG9uIGEgc2VtaWNvbG9uIGluc2lkZSBhCi0Jc3RyaW5nLgotCi1UdWUgRmViIDE4IDE4OjQyOjUxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDMwdi5jLCBjb25maWcvdGMtZDMwdi5oOiBOZXcgZmlsZXMuCi0KLSAJKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JCi0JKiBjb25maWd1cmUuaW46IEFkZCBjYXNlIGZvciBkMzB2LgotCi1TdW4gRmViIDE2IDE3OjQ3OjI5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYWxwaGEuaCAobWRfb3BlcmFuZCk6IERlZmluZSB3aXRoIGEgbnVsbCBleHBhbnNpb24sCi0JbGlrZSBhbGwgdGhlIG90aGVyIHRhcmdldHMuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKENQVSBiYWNrZW5kKTogQWRkIG1pc3Npbmcgd29yZCBpbiAKLQltZF9mbHVzaF9wZW5kaW5nX291dHB1dCBkZXNjcmlwdGlvbi4gIEZpeCB0eXBvIGluIG1kX2NvbnZlcnRfZnJhZwotCWRlc2NyaXB0aW9uLgotCSogY29uZmlnL3RjLXRpYzgwOiBNaW5vciBjb21tZW50IGFkZGl0aW9ucy9jaGFuZ2VzLgotCQotRnJpIEZlYiAxNCAxODowOTo1OSAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChMT0NBTF9MQUJFTCk6IE1hY3JvIHJlZGVmaW5lZCBpZiBURV9ERUxUQS4KLQkodGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogTWFjcm8gZGVmaW5lZCBpZiBURV9ERUxUQS4KLSAJKiBjb25maWcvb2JqLWNvZmYuYyAob2JqX2NvZmZfZGVmKTogVXNlCi0JdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIGlmIGRlZmluZWQuCi0JKG9ial9jb2ZmX3RhZywgb2JqX2NvZmZfdmFsKTogTGlrZXdpc2UuCi0JKiBleHByLmMgKG9wZXJhbmQpOiBSZWplY3QgJ34nIGFzIG9wZXJhdG9yIGlmIGlzX25hbWVfYmVnaW5uZXIuCi0KLUZyaSBGZWIgMTQgMTc6MjQ6NDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gbm90ZXMgZnJvbSBQZXRlciBFcmlrc3NvbiA8cGV0ZXJAaWZtLmxpdS5zZT4uICBUaGUgdGFyZ2V0Ci0JZG9lcyBub3QgYWN0dWFsbHkgd29yaywgdGhvdWdoOgotCSogY29uZmlndXJlLmluIChpMzg2LXNlcXVlbnQtYnNkKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGMtZHluaXguaDogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtaTM4Ni5oOiBEZWZpbmUgVEFSR0VUX0ZPUk1BVCBpZiBURV9EWU5JWC4KLQotCSogcmVhZC5jIChkb19hbGlnbik6IEFkZCBtYXggcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCVJlbW92ZSB1c2VsZXNzIHN0YXRpYyB2YXJpYWJsZXMuCi0JKHNfYWxpZ24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLiAgRG8gY29tbW9uIHBvcnRpb24gb2YKLQlzX2FsaWduX2J5dGVzIGFuZCBzX2FsaWduX3B0d28uCi0JKHNfYWxpZ25fYnl0ZXMsIHNfYWxpZ25fcHR3byk6IEp1c3QgY2FsbCBzX2FsaWduLgotCSogZnJhZ3MuYyAoZnJhZ19hbGlnbik6IEFkZCBtYXggcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShmcmFnX2FsaWduX3BhdHRlcm4pOiBMaWtld2lzZS4KLQkqIGZyYWdzLmggKGZyYWdfYWxpZ24sIGZyYWdfYWxpZ25fcGF0dGVybik6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogTGltaXQgYWxpZ25tZW50IGNoYW5nZSB0byBmcl9zdWJ0eXBlLgotCUZpeCBzb21lIHR5cGVzIHRvIGJlIGFkZHJlc3NULgotCSogY29uZmlnL29iai1jb2ZmLmMgKHNpemVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1pZWVlLmMgKHNpemVfc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLWQxMHYuaCAobWRfZG9fYWxpZ24pOiBBZGQgbWF4IHBhcmFtZXRlci4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5oIChtZF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW04OGsuYyAobTg4a19kb19hbGlnbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXNoLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGFzLmg6IEltcHJvdmUgY29tbWVudHMgb24gcnNfYWxpZ24gYW5kIHJzX2FsaWduX2NvZGUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgbmV3IGFsaWdubWVudCBhcmd1bWVudHMuCi0JKiBkb2MvaW50ZXJuYWxzLnRleGkgKEZyYWdzKTogRG9jdW1lbnQgdXNlIG9mIGZyX3N1YnR5cGUgZmllbGQgZm9yCi0JcnNfYWxpZ24gYW5kIHJzX2FsaWduX2NvZGUuCi0KLUZyaSBGZWIgMTQgMTU6NTY6MDYgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmM6IENoYW5nZWQgb3Bjb2RlIHBhcnNpbmcuCi0KLVRodSBGZWIgMTMgMjA6MDI6MTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy97dGMtYWxwaGEuaCwgdGMtZDEwdi5oLCB0Yy1nZW5lcmljLmgsIHRjLWk5NjAuaCwKLQl0Yy1tbjEwMjAwLmgsIHRjLW1uMTAzMDAuaCwgdGMtc2guaCwgdGMtdmF4LmgsIHRjLXc2NS5ofToKLQlBZGQgZGVmYXVsdCBkZWZpbml0aW9uIG9mIHplcm8gZm9yIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLgotCSogY29uZmlnL3t0Yy1hcm0uaCwgdGMtaHBwYS5oLCB0Yy1pMzg2LmgsIHRjLW1pcHMuaCwgdGMtbnMzMmsuaCwKLSAJdGMtcHBjLmgsIHRjLXNwYXJjLmh9OiBNb3ZlIGRlZmluaXRpb24gb2YgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLQl0byBhIGxvY2F0aW9uIGNvbnNpc3RlbnQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGluY2x1ZGUgZmlsZXMuCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBSZW1vdmUgbWlzbGVhZGluZyBjb21tZW50LgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IEFkZCBkZXNjcmlwdGlvbiBvZiBmdW5jdGlvbgotCW1kX3VuZGVmaW5lZF9zeW1ib2wuCi0JKiBjb25maWcvdGMtdGljODAuYzogQWRkIGNvZGUgdG8gaW5zZXJ0IHByZWRlZmluZWQgc3ltYm9scyBpbnRvIHRoZQotCXN5bWJvbCB0YWJsZSBzbyB0aGV5IGNhbiBiZSBwYXJzZWQgYnkgdGhlIHN0YW5kYXJkIGV4cHJlc3Npb24gcGFyc2VyLgotCVJlbW92ZSBjdXN0b20gY29kZSB0aGF0IHVzZSB0byBwYXJzZSB0aGVtLgotCSogY29uZmlnL3RjLXRpYzgwLmg6IE1vdmUgZGVmaW5pdGlvbiBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotCXRvIGEgbG9jYXRpb24gY29uc2lzdGVudCB3aXRoIHRoZSByZXN0IG9mIHRoZSB0YXJnZXQgaW5jbHVkZSBmaWxlcy4KLQkKLVRodSBGZWIgMTMgMjE6NDQ6MTggMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIGFzLmg6IEdOVSBjIHByb3ZpZGVzIHVubGluaygpIGZ1bmN0aW9uLgotCi0JVW5pZnkgc2VjdGlvbiBoYW5kbGluZyBvbiBvcGVuVk1TL0FscGhhOgotCSogY29uZmlnL3RjLWFscGhhLmMoc19hbHBoYV9saW5rKTogUmVtb3ZlLgotCShzX2FscGhhX3NlY3Rpb24pOiBOZXcgZnVuY3Rpb24uCi0JUmVtb3ZlIGNhc2UtaGFja2luZyBvZiBzeW1ib2xzCi0JQWRkIC5jb2RlX2FkZHJlc3MgcHNldWRvLW9wLgotCShCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFIpOiBOZXcgcmVsb2NhdGlvbi4KLQkoc19hbHBoYV9jb2RlX2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0JKGFscGhhX2N0b3JzX3NlY3Rpb24sIGFscGhhX2R0b3JzX3NlY3Rpb24pOiBOZXcgc2VjdGlvbnMgZm9yIEMrKwotCXN0YXRpYyBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuCi0JQWRkIGRlYnVnIGNvZGUgZm9yIGNyYXNoIGRlYnVncywgdG8gYmUgcmVtb3ZlZCB3aGVuIHRyYWNlYmFjayBjb2RlCi0JaXMgYWRkZWQgdG8gb2JqZWN0IGNvZGUuCi0JKHNfYWxwaGFfbmFtZSk6IE5ldyBmdW5jdGlvbiBmb3IgLm5hbWUgcHNldWRvLW9wLgotCShhbHBoYV9wcmludF90b2tlbik6IE5ldyBmdW5jdGlvbiB0byBwcmludCB0b2tlbiBleHByZXNzaW9ucyB3aXRoCi0JYWxwaGEgc3BlY2lmaWMgZXh0ZW5zaW9ucy4KLQotCSogbWFrZWZpbGUudm1zOiBBbGxvdyBjb21waWxhdGlvbiB3aXRoIGN1cnJlbnQgZ2NjIHNuYXBzaG90LgotCi1UaHUgRmViIDEzIDE2OjI5OjA0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkb2MvTWFrZWZpbGUuaW4gKFRFWEkyRFZJKTogU2V0IHRvIGp1c3QgbmFtZSBvZiBwcm9ncmFtLgotCShEVklQUyk6IFNldCB0byBkdmlwcy4KLQkocHMsIGFzLnBzLCBnYXNwLnBzKTogTmV3IHRhcmdldHMuCi0JKGludGVybmFscy5pbmZvLCBnYXNwLmR2aSwgaW50ZXJuYWxzLmR2aSk6IFNldCBib3RoIFRFWElOUFVUUwotIAlhbmQgTUFLRUlORk8gZW52IHZhcmlhYmxlcy4KLQkoaW50ZXJuYWxzLnBzKTogVXNlIERWSVBTIG1hY3JvLgotCShjbGVhbik6IFJlbW92ZSBjb3JlIGFuZCBiYWNrdXAgZmlsZXMuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMgZnJvbSBidWlsZGluZyBpbnRlcm5hbHMuCi0JKGNsZWFuLWR2aSk6IERpdHRvLgotCSogZG9jL2ludGVybmFscy50ZXhpIChGcmFncyk6IEZpeCB0eXBvLgotCShHQVMgcHJvY2Vzc2luZyk6IERpdHRvLgotCShDUFUgYmFja2VuZCk6IERpdHRvLgotCSogZWNvZmYuYyAoaW5pdF9maWxlKTogVXNlIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHZhbHVlIGRpcmVjdGx5LgotCSogbXB3LWNvbmZpZy5pbjogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGFzIDEuCi0JKiByZWFkLmM6IFJlbW92ZSB1Z2x5IGhhY2sgdGhhdCBkZWFsdCB3aXRoIGNvbmZpZyBmaWxlcyBub3QKLQljb3JyZWN0bHkgZGVmaW5pbmcgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4uCi0JKHRhcmdldF9iaWdfZW5kaWFuKTogVXNlIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIGRpcmVjdGx5LgotCSogY29uZmlnL2FybS1iaWcubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAxLgotCSogY29uZmlnL2FybS1saXQubXQ6IERlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiB0byAwLgotCSogY29uZmlnL21pcHMtYmlnLm10OiBEZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gdG8gMS4KLQkqIGNvbmZpZy9taXBzLWxpdC5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDAuCi0JKiBjb25maWcvcHBjLWxpdC5tdDogRGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIHRvIDEuCi0JKiBjb25maWcvcHBjLXNvbC5tdDogUmVwbGFjZSBUQVJHRVRfQllURVNfTElUVExFX0VORElBTgotCXdpdGggVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gZGVmaW5lZCB0byAwLgotCSogY29uZmlnL3RjLWFybS5oOiBSZW1vdmUgdXNlIG9mIFRBUkdFVF9CWVRFU19MSVRUTEVfRU5ESUFOCi0JYW5kIHNpbXBsaWZ5LiAgVGVzdCB2YWx1ZSBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTiwgbm90IGp1c3QKLQl3aGV0aGVyIGl0IGlzIGRlZmluZWQgb3Igbm90LgotCSogY29uZmlnL3RjLW1pcHMuaDogUmVtb3ZlIHVzZSBvZiBUQVJHRVRfQllURVNfTElUVExFX0VORElBTi4KLQkqIGNvbmZpZy90Yy1wcGMuaDogUmVtb3ZlIHVzZSBvZiBUQVJHRVRfQllURVNfTElUVExFX0VORElBTgotCWFuZCBzaW1wbGlmeS4gVGVzdCB2YWx1ZSBvZiBUQVJHRVRfQllURVNfQklHX0VORElBTiwgbm90IGp1c3QKLQl3aGV0aGVyIGl0IGlzIGRlZmluZWQgb3Igbm90LgotCSogY29uZmlnL3RpYzgwLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgdG8gY29mZi10aWM4MC4KLQkoVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4pOiBEZWZpbmUgdG8gMC4KLQotVGh1IEZlYiAxMyAxNDo0MDoxNiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBDb3JyZWN0IHRleHQgaW4gYXNfZmF0YWwgZXJyb3IgbWVzc2FnZSwKLQliZmRfcGVyZm9ybV9yZWxvY2F0aW9uIC0+IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uCi0KLVRodSBGZWIgMTMgMTQ6NDg6MDMgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoTEVYX1RJTERFKTogRGVmaW5lIGlmIFRFX0RFTFRBLgotCSogcmVhZC5jIChMRVhfVElMREUpOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKGxleF90eXBlKTogVXNlIExFWF9USUxERS4KLQkqIGV4cHIuYyAoZ2V0X3N5bWJvbF9lbmQpOiBDaGVjayBmaXJzdCBjaGFyIHdpdGggaXNfbmFtZV9iZWdpbm5lciwKLQlub3QgaXNfcGFydF9vZl9uYW1lLgotCi1UaHUgRmViIDEzIDExOjQwOjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3Nob3dfdXNhZ2UpOiBBZGQgbWlzc2luZyBiYWNrc2xhc2ggYXQgZW5kCi0Jb2YgY29udGludWVkIGxpbmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogQ29ycmVjdCBiYXNlIGFkZHJlc3MKLQlmb3IgYW4gZXh0ZW5kZWQgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24uCi0JKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChwcmV2X25vcF9mcmFnKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJldl9ub3BfZnJhZ19ob2xkcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKHByZXZfbm9wX2ZyYWdfcmVxdWlyZWQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShwcmV2X25vcF9mcmFnX3NpbmNlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoYXBwZW5kX2luc24pOiBJZiB3ZSBhcmVuJ3QgcmVvcmRlcmluZywgYW5kIHByZXZfbm9wX2ZyYWcgaXMgbm90Ci0JTlVMTCwgYW5kIHdlIGRvbid0IG5lZWQgYW55IG5vcHMsIHRoZW4gZGVjcmVhc2UgdGhlIHNpemUgb2YKLQlwcmV2X25vcF9mcmFnLiAgRG9uJ3QgaW5zZXJ0IG5vcHMgYmVjYXVzZSBvZiBpbnN0cnVjdGlvbnMgaW4KLQlub3Jlb3JkZXIgc2VjdGlvbnMuICBSZW1lbWJlciB3aGV0aGVyIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbnMKLQl3aGVyZSBpbiBub3Jlb3JkZXIgc2VjdGlvbnMgZXZlbiB3aGVuIG5vdCByZW9yZGVyaW5nLgotCShtaXBzX25vX3ByZXZfaW5zbik6IEFkZCBwcmVzZXJ2ZXIgcGFyYW1ldGVyLiAgQ2hhbmdlIGFsbAotCWNhbGxlcnMuICBSZWZlciBwcmV2X25vcF9mcmFnIHZhcmlhYmxlcyB3aGVuIGFwcHJvcHJpYXRlLgotCShtaXBzX2VtaXRfZGVsYXlzKTogU2V0IHVwIHByZXZfbm9wX2ZyYWcuCi0JKHNfbWlwc3NldCk6IENsZWFyIHByZXZfbm9wX2ZyYWcgaWYgcmVvcmRlcmluZy4KLQotV2VkIEZlYiAxMiAxNDozNjoyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUmVtb3ZlIHVzZWxlc3MgY29kZSB3aGljaAotCWhhbmRsZWQgc3dhcHBpbmcgYSBtaXBzMTYganVtcCB3aXRoIGEgbWlwczE2IGluc3RydWN0aW9uIHdpdGggYQotCXJlbG9jLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9wYXJzZV9vcHRpb24pOiBXaGVuIGRlYnVnZ2luZywgc2V0Ci0JbWlwc19vcHRpbWl6ZSB0byAxLCBub3QgMC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2lwKTogSGFuZGxlIGFuIGV4dGVuZCBvcGVyYW5kLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChteV9nZXRFeHByZXNzaW9uKTogSW4gbWlwczE2IG1vZGUsIGlmIGl0IGxvb2tzCi0JbGlrZSB0aGUgZXhwcmVzc2lvbiB3YXMgYmFzZWQgb24gYC4nLCBhZGp1c3QgdGhlIHZhbHVlIG9mIHRoZQotCXN5bWJvbC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBXYXJuIGFib3V0IGFuIGF0dGVtcHQgdG8gcHV0IGFuCi0gCWV4dGVuZGVkIGluc3RydWN0aW9uIGluIGEgZGVsYXkgc2xvdCB3aGVuIG5vdCByZW9yZGVyaW5nLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBXYXJuIGlmIGFuIGV4dGVuZGVkIGluc3RydWN0aW9uIGFwcGVhcnMgaW4gYQotCWRlbGF5IHNsb3QuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfcHNldWRvX3RhYmxlKTogQWRkICJpbnNuIi4KLQkoc19pbnNuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGRvYy9jLW1pcHMudGV4aTogRG9jdW1lbnQgLmluc24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogQWRkIHRoZSBnZW5lcmFsIHJlZ2lzdGVycyB0byB0aGUKLQlzeW1ib2wgdGFibGUuCi0JKG1pcHMxNl9pcCk6IEZpcnN0IHBhcnNlIHRoZSBleHByZXNzaW9uLCBhbmQgdGhlbiBzZWUgd2hldGhlciBpdAotCWNhbWUgdXAgd2l0aCBhIHJlZ2lzdGVyLCByYXRoZXIgdGhhbiB0cnlpbmcgdG8gZmlyc3Qgc2VlIHdoZXRoZXIKLQl3ZSBhcmUgbG9va2luZyBhdCBhIHJlZ2lzdGVyLgotCi1UdWUgRmViIDExIDE1OjEzOjM5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtdGljODAuYzogTnVtZXJvdXMgY2hhbmdlcyBhbmQgYWRkaXRpb25zIHRvIGZsZXNoCi0Jb3V0IGZ1bmN0aW9ucyB0aGF0IHdlcmUgcHJldmlvdXNseSBqdXN0IHN0dWJzLCBhbmQgZml4IHNvbWUKLQlwcm9ibGVtcyBmb3VuZCB1c2luZyB0aGUgbmV3IFRJYzgwIHRlc3RzdWl0ZSBjYXNlcy4KLQotVHVlIEZlYiAxMSAxNTo1MjoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEhhbmRsZSAlZ3ByZWwgbW9kaWZpZXIuCi0JKG1kX2FwcGx5X2ZpeCk6IEhhbmRsZSBCRkRfUkVMT0NfTUlQUzE2X0dQUkVMLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChhcHBlbmRfaW5zbik6IE91dHB1dCBqdW1wIGluc3RydWN0aW9uIGFzIGEKLQlwYWlyIG9mIDIgYnl0ZSBpbnN0cnVjdGlvbnMsIHJhdGhlciB0aGFuIGFzIGEgc2luZ2xlIDQgYnl0ZQotCWluc3RydWN0aW9uLgotCi1Nb24gRmViIDEwIDIyOjA2OjAwIDE5OTcgIERhd24gUGVyY2hpayAgKGRhd25AY3lnbnVzLmNvbSkKLQotCSogaXRibC1vcHMuYywgaXRibC1sZXgubCwgaXRibC1wYXJzZS55LCBpdGJsLW9wcy5oLAotCWNvbmZpZy9pdGJsLW1pcHMuaDogQWRkIGNvcHlyaWdodCBtZXNzYWdlIGFuZCBmaXggaW5kZW50YXRpb24uCi0KLU1vbiBGZWIgMTAgMTg6MDk6MDAgMTk5NyAgRGF3biBQZXJjaGlrICAoZGF3bkBjeWdudXMuY29tKQotCi0JKiBpdGJsLW9wcy5jOiBOZXcgZmlsZS4gIEFkZCBzdXBwb3J0IGZvciBkeW5hbWljYWxseSByZWFkIAotCWluc3RydWN0aW9uIHJlZ2lzdGVycywgb3Bjb2RlcyBhbmQgZm9ybWF0cy4gIEJ1aWxkIGludGVybmFsIHRhYmxlIAotCWZvciBuZXcgaW5zdHJ1Y3Rpb25zIGFuZCBwcm92aWRlIGNhbGxiYWNrcyBmb3IgYXNzZW1ibGVyIGFuZCAKLQlkaXNhc3NlbWJsZXIuCi0JKiBpdGJsLWxleC5sLCBpdGJsLXBhcnNlLnk6IExleCBhbmQgeWFjYyBwYXJzZXJzIGZvciBpbnN0cnVjdGlvbiAKLQlzcGVjIHRhYmxlLgotCSogaXRibC1vcHMuaDogTmV3IGZpbGUuICBIZWFkZXIgZmlsZSBmb3IgaXRibCBzdXBwb3J0LgotCSogY29uZmlnL2l0YmwtbWlwcy5oOiBOZXcgZmlsZS4gIE1pcHMgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yCi0JaXRibCBzdXBwb3J0LgotCi1GcmkgRmViICA3IDA5OjUyOjM0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBJZiBhIGNvbnN0YW50IG9wZXJhbmQgd29uJ3QKLQlmaXQgaW50byB0aGUgY29uc3RhbnQgZmllbGQgb2YgYSByZWxheGFibGUgb3BlcmFuZCwgdGhlbiBpdCBkb2VzCi0Jbm90IG1hdGNoLgotCi1UaHUgRmViICA2IDIwOjA4OjEyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBUcmVhdAotCWEganNyIHRhcmdldCBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIGp1c3QgbGlrZSBhIGpzciB0bwotCWFuIHVuZGVmaW5lZCB0YXJnZXQuCi0KLVRodSBGZWIgIDYgMTY6NTI6NTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jYXRpb25zCi0JYWdhaW5zdCBhbnkgbWlwczE2IHN5bWJvbHMsIG5vdCBqdXN0IGV4dGVybmFsbHkgdmlzaWJsZSBvbmVzLgotCShtZF9hcHBseV9maXgpOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotV2VkIEZlYiAgNSAxMToxMTowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IEFjY2VwdCBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaW4KLQl0aGUgb3BlcmFuZCBvZiB0aGUgZXhpdCBpbnN0cnVjdGlvbi4KLQotVHVlIEZlYiAgNCAxNDoxMjozOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJZiB3ZSBsZWF2ZSBhbiBlcXVhdGVkIHN5bWJvbAotCWFzIE9fc3ltYm9sLCBjb3B5IG92ZXIgdGhlIHNlZ21lbnQuCi0KLU1vbiBGZWIgIDMgMTI6MzU6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9hcHBseV9maXgpOiBJZiB3ZSBhcmVuJ3QgYWRqdXN0aW5nIHRoaXMKLQlmaXh1cCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbCwgYWRqdXN0IHRoZSB2YWx1ZQotCWFjY29yZGluZ2x5LgotCi0JKiBzeW1ib2xzLmMgKHJlc29sdmVfc3ltYm9sX3ZhbHVlKTogRG9uJ3QgY2hhbmdlIFhfYWRkX251bWJlciBmb3IKLQlhbiBlcXVhdGVkIHN5bWJvbC4KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IEF2b2lkIGxvb3Bpbmcgb24gZXF1YXRlZCBzeW1ib2xzLgotCUFkanVzdCBmeF9vZmZzZXQgYnkgWF9hZGRfbnVtYmVyIGZvciBlYWNoIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogQXZvaWQgbG9vcGluZyBvbiBlcXVhdGVkCi0Jc3ltYm9scy4KLQkoZml4dXBfc2VnbWVudCk6IEFkZCBhIGxvb3AgdG8gdHJhY2sgZG93biBlcXVhdGVkIHN5bWJvbHMgYW5kCi0JYWRqdXN0IGZ4X29mZnNldCBhcHByb3ByaWF0ZWx5LgotCi1GcmkgSmFuIDMxIDE1OjIxOjAyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfcmVsYXhfdGFibGUpOiBBZGQgZW50cmllcyB0byBhbGxvdwotCWptcCAtPiBicmEgcmVsYXhpbmcuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IEhhbmRsZSBqbXAtPmJyYSByZWxheGluZy4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgam1wLT5icmEgcmVsYXhpbmcuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0KLUZyaSBKYW4gMzEgMTM6MTU6MDUgMTk5NyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChpMzg2X2FsaWduX2NvZGUpOiBBZGQgY29tbWVudHMgZXhwbGFpbmluZyB0aGUKLQlub3AgaW5zdHJ1Y3Rpb25zLgotCi1GcmkgSmFuIDMxIDEwOjQ2OjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKGVuZm9yY2VfYWxpZ25lZF9kYXRhKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc3BhcmNfY29uc19hbGlnbik6IERvbid0IGRvIGFueXRoaW5nIHVubGVzcyBlbmZvcmNlX2FsaWduZWRfZGF0YQotCWlzIHNldC4KLQkobWRfbG9uZ29wdHMpOiBBZGQgImVuZm9yY2UtYWxpZ25lZC1kYXRhIi4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLS1lbmZvcmNlLWFsaWduZWQtZGF0YS4KLQkqIGRvYy9jLXNwYXJjLnRleGkgKFNwYXJjLUFsaWduZWQtRGF0YSk6IE5ldyBub2RlOyBkb2N1bWVudAotCWVuZm9yY2UtYWxpZ25lZC1kYXRhLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BzZXVkb190YWJsZSk6IElmIE9CSl9YQ09GRiwgYWRkICJsb25nIiwKLSAJIndvcmQiLCBhbmQgInNob3J0Ii4KLQkocHBjX3hjb2ZmX2NvbnMpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi0JKiB3cml0ZS5jIChyZWxheF9zZWdtZW50KTogR2l2ZSBhbiBlcnJvciBpZiBhIC5zcGFjZSBzeW1ib2wgaXMKLQljb21tb24gb3IgdW5kZWZpbmVkLgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IERvbid0IGhhbmRsZSBtcmlfcGVuZGluZ19hbGlnbiBpZgotCXRoZSBoYW5kbGVyIGlzIHNfZ2xvYmwgb3Igc19pZ25vcmUuCi0KLVRodSBKYW4gMzAgMTE6NDY6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSAibnVtb3BzIi4KLQkqIGNvbmZpZy90Yy10aWM4MC5jOiBNYW55IGFkZGl0aW9ucyB0byBwcmV2aW91cyBwbGFjZWhvbGRlciBmaWxlLgotCSogY29uZmlnL3RjLXRpYzgwLmg6IERpdHRvLgotCi1UaHUgSmFuIDMwIDEyOjI4OjE4IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlnL3RjLWkzODYuYyAoaTM4Nl9hbGlnbl9jb2RlKTogSW1wcm92ZSB0aGUgbm9wIHBhdHRlcm5zLgotCi1UaHUgSmFuIDMwIDEyOjA4OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19maXhfYWRqdXN0YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogQ2FsbCBtaXBzX2ZpeF9hZGp1c3RhYmxlLgotCShtaXBzX2ZpeF9hZGp1c3RhYmxlKTogRGVjbGFyZS4KLQotCUlkZWFzIGZyb20gU3Jpbml2YXMgQWRkYWdhcmxhIDxzcmluaXZhc0BjZG90ZC5lcm5ldC5pbj46Ci0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IEFmdGVyIGRvaW5nIGFuIG1yaV9wZW5kaW5nX2FsaWduLAotCWFkanVzdCB0aGUgbGluZV9sYWJlbCBpZiB0aGVyZSBpcyBvbmUuCi0JKHNfc3BhY2UpOiBTZXQgbXJpX3BlbmRpbmdfYWxpZ24gaWYgYW4gb2RkIG51bWJlciBvZiBieXRlcyB3ZXJlCi0Jb3V0cHV0LgotCi1XZWQgSmFuIDI5IDE1OjMxOjEyIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9kb19hbGlnbik6IEFkZCB0aGlzIGhvb2sgdG8gY2FsbAotCWQxMHZfY2xlYW51cCgpIHdoZW4gYSAiLmFsaWduIiBpcyBkZXRlY3RlZC4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAoZmluZF9vcGNvZGUpOiBDb3JyZWN0bHkgY2FsY3VsYXRlCi0JYnJhbmNoIGRpc3BsYWNlbWVudCB3aGVuIC5hbGlnbnMgYXJlIHByZXNlbnQuCi0KLVdlZCBKYW4gMjkgMDk6NDI6MTEgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9yZWxheF90YWJsZSk6IERlZmluZS4KLQkobWRfY29udmVydF9mcmFnKTogSW1wbGVtZW50LgotCShtZF9hc3NlbWJsZSk6IEhhbmRsZSByZWxheGFibGUgb3BlcmFuZHMvaW5zdHJ1Y3Rpb25zIGNvcnJlY3RseS4KLQkobWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgpOiBJbXBsZW1lbnQuCi0JKiBjb25maWcvdGMtbW4xMDIwMC5oIChUQ19HRU5FUklDX1JFTEFYX1RBQkxFKTogRGVmaW5lLgotCi1UdWUgSmFuIDI4IDE1OjI3OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBHaXZlIGFuIGVycm9yIGZvciBqdW1wcyB0byBhCi0JbWlzYWxpZ25lZCBhZGRyZXNzLgotCShtZF9hcHBseV9maXgpOiBNYWtlIGEgYnJhbmNoIHRvIGFuIG9kZCBhZGRyZXNzIGFuIGVycm9yIHJhdGhlcgotCXRoYW4gYSB3YXJuaW5nLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtZF9jb252ZXJ0X2ZyYWcpOiBJZiB0aGUgdXNlciBleHBsaWNpdGx5Ci0JcmVxdWVzdGVkIGFuIGV4dGVuZGVkIG9wY29kZSwgcGFzcyB3YXJuIGFzIHRydWUgdG8gbWlwczE2X2ltbWVkLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfaXApOiBIYW5kbGUgYSBtaXNzaW5nIGV4cHJlc3Npb24gbGlrZQotCWFuIGV4cGxpY2l0IDAsIHNvIHRoYXQgZXhwbGljaXRseSBleHRlbmRlZCBpbnN0cnVjdGlvbnMgd29yawotCWNvcnJlY3RseS4KLQotTW9uIEphbiAyNyAxNzo0MToyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBEb24ndCBnZW5lcmF0ZSBhIGxvY2FsIEVDT0ZGCi0Jc3ltYm9sIGZvciBhIGNvbW1vbiBzeW1ib2wuCi0KLVdlZCBKYW4gMjIgMTA6Mzk6MzkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCVBhdGNoIHByZXN1bWVkIHRvIGhhdmUgYmVlbiBjaGVja2VkIGluIGF3aGlsZSBhZ28gYnV0IHdhc24ndC4KLQlNb24gTm92IDI1IDEwOjQ1OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCSogd3JpdGUuYzogRGVsZXRlICJpZm5kZWYgbWRfcmVsYXhfZnJhZyIgYXJvdW5kIGlzX2RucmFuZ2UuCi0JKHJlbGF4X3NlZ21lbnQsIGNhc2UgcnNfb3JnKTogTW92ZSBjb2RlIGluc2lkZSBicmFjZXMuICBNb3ZlIGxvY2FscwotCXRhcmdldCxhZnRlciBpbnNpZGUgdG9vLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX21hY2hpbmVfZGVwZW5kZW50KTogR3V0cyBtb3ZlZCB0byAuLi4KLQkocmVsYXhfZnJhZyk6IE5ldyBmdW5jdGlvbi4KLQlDYWxsIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiBpZiBkZWZpbmVkLgotCi1Nb24gSmFuIDIwIDEwOjU2OjQ3IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUmVqZWN0IHBjLXJlbGF0aXZlIGFkZHJlc3NlcyBmb3IgdGhlCi0gCSdwJyBvcGVyYW5kIHNwZWNpZmllci4KLQotTW9uIEphbiAyMCAxMDozOTozNiAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoSEFWRV9MT05HX0JSQU5DSCk6IE5ldyBtYWNybywgcmV0dXJucyB0cnVlIGZvcgotIAltNjhrIGZhbWlseSBjcHVzIHdoaWNoIHN1cHBvcnQgbG9uZyBicmFuY2ggYWRkcmVzc2luZyBtb2Rlcy4KLQkobTY4a19pcCwgbWRfY29udmVydF9mcmFnXzEsIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4LAotIAltZF9jcmVhdGVfbG9uZ19qdW1wKTogVXNlIGl0LgotCi1Nb24gSmFuIDIwIDEyOjQyOjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBEb24ndCBzZXQgU0VDX0FMTE9DIG9yIFNFQ19MT0FEIGZvcgotCXRoZSAucmVnaW5mbyBvciAuTUlQUy5vcHRpb25zIHNlY3Rpb24gaWYgY29uZmlndXJlZCBmb3IgYW4KLQllbWJlZGRlZCB0YXJnZXQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogRG9uJ3Qgc2V0IGludGVybG9ja3MgZm9yCi0JbWlwc180NjUwLgotCi1XZWQgSmFuIDE1IDEzOjUxOjUwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBNYWtlIHN1cmUgdGhlIHN5bWJvbCBlbmRzIHdpdGgKLQl3aGl0ZXNwYWNlIGJlZm9yZSBjaGVja2luZyB3aGV0aGVyIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnPScuCi0KLVR1ZSBKYW4gMTQgMTU6MDc6MjcgMTk5NyAgUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHNjb19pZCk6IE1vdmVkIGZyb20gaGVyZS4uLgotCSogY29uZmlnL29iai1lbGYuYyAoc2NvX2lkKTogLi4udG8gaGVyZS4gIEFkZGluZyB0aGUgaWRlbnRpZmllcgotCXJlYWxseSBpcyBhbiBTQ08gRUxGIHNwZWNpZmljIHRoaW5nLCBub3QganVzdCBhIFNDTyB4ODYgc3BlY2lmaWMKLQl0aGluZy4KLQotTW9uIEphbiAxMyAyMjo0MzowMSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodGljODAtKi0qKTogRG9uJ3QgcmVxdWlyZSAnY29mZicuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGUuCi0KLVRodSBKYW4gIDkgMDk6MDg6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKGVtaXRfZXhwcik6IENoZWNrIGZvciBvdmVyZmxvdyBvZiBhIG5lZ2F0aXZlIHZhbHVlCi0JY29ycmVjdGx5LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IGxhYmVsX2xpbmUpOiBEZWZpbmUuCi0JKGxhYmVscywgY3VycmVudF9sYWJlbCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtZF9hc3NlbWJsZSk6IE1hcmsgY3VycmVudF9sYWJlbCBhcyB0ZXh0LCBhbmQgY2xlYXIgaXQuCi0JKG02OGtfZnJvYl9sYWJlbCk6IE5ldyBmdW5jdGlvbi4KLQkobTY4a19mbHVzaF9wZW5kaW5nX291dHB1dCk6IE5ldyBmdW5jdGlvbi4KLQkobTY4a19mcm9iX3N5bWJvbCk6IE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2Zyb2JfbGFiZWwpOiBEZWZpbmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVmaW5lLgotCSh0Y19mcm9iX3N5bWJvbCk6IERvbid0IHdhcm4sIGp1c3QgY2FsbCBtNjhrX2Zyb2Jfc3ltYm9sLgotCSh0Y19mcm9iX2NvZmZfc3ltYm9sKTogTGlrZXdpc2UuCi0KLQkqIHJlYWQuYyAocmVhZF9hX3NvdXJjZV9maWxlKTogV2hlbiBkZWZpbmluZyBhIG1hY3JvIGluIE1SSSBtb2RlLAotCWRvbid0IGFkZCB0aGUgc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0KLVR1ZSBKYW4gIDcgMTE6MjE6NDIgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jICh0Y19nZW5fcmVsb2MpOiBIYW5kbGUgc3ltMS1zeW0yIGZpeHVwcwotCWhlcmUgc2luY2UgZml4dXBfc2VnbWVudCBkb2Vzbid0IChsaW5rcmVsYXggaXMgc2V0KS4KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKHRjX2dlbl9yZWxvYyk6IExpa2V3aXNlLgotCi1Nb24gSmFuICA2IDE1OjE5OjMyIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBUd2VhayBmeF9vZmZzZXQgZm9yIHBjLXJlbGF0aXZlCi0JcmVsb2NzLgotCi1GcmkgSmFuICAzIDE2OjQ3OjA4IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCk6IFR3ZWFrIGZ4X3JfZmllbGQncyB0eXBlCi0JdG8gYXZvaWQgd2FybmluZ3Mgd2l0aCB0aGUgbmF0aXZlIEhQIGNvbXBpbGVyLgotCShmaXhfbmV3X2hwcGEpOiBTaW1pbGFybHkgZm9yIHRoZSByX3R5cGUgYXJndW1lbnQuCi0JKHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSwgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24pOiBFbmNsb3NlCi0JaW4gYW4gI2lmIE9CSl9FTEYgdG8ga2VlcCBnY2MgLVdhbGwgcXVpZXQuCi0JKG1kX2FwcGx5X2ZpeCk6IEFsd2F5cyBpbml0aWFsaXplICJyZXN1bHQiLgotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtZF9hc3NlbWJsZSk6IEdlbmVyYXRlIHJlbG9jYXRpb25zLgotCi1GcmkgSmFuICAzIDE4OjE3OjIzIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChzX2V2ZW4pOiBBZGp1c3QgdGhlIGFsaWdubWVudCBvZiB0aGUgY3VycmVudAotCXNlY3Rpb24uCi0KLUZyaSBKYW4gIDMgMTc6MTA6MzMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy9vYmotZWxmLmMgKGVsZl9maWxlX3N5bWJvbCk6IFdoZW4gdXNpbmcgRUNPRkYgZGVidWdnaW5nLAotCXBhc3Mgb24gdGhlIG5ldyBmaWxlIGhvb2suCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jIChhbHBoYV9maXhfYWRqdXN0YWJsZSk6IE5vdCBxdWl0ZSB0aGUgc2FtZSBhcwotCSFhbHBoYV9mb3JjZV9yZWxvY2F0aW9uLCBhcyBsb2NhbCBMSVRFUkFMcyBjYW4gYmUgYWRqdXN0ZWQgdG8gYmUKLQlyZWxhdGl2ZSB0byB0aGUgc2VjdGlvbi4KLQotRnJpIEphbiAgMyAxMjowOToyNCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jICh5YW5rX3N5bWJvbHMpOiBJZiB0Y19mcm9iX2NvZmZfc3ltYm9sIGlzCi0JZGVmaW5lZCwgY2FsbCBpdC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKHRjX2Zyb2Jfc3ltYm9sKTogQ2hlY2sgd2hldGhlciB0ZXh0IGxhYmVsIGlzCi0JYWxpZ25lZCB0byBvZGQgYm91bmRhcnkuCi0JKHRjX2Zyb2JfY29mZl9zeW1ib2wpOiBEZWZpbmUuCi0KLQkqIGRvYy9hcy50ZXhpbmZvIChTZXQpOiBDaGFuZ2UgcGFyZW50aGVzaXplZCBAeHJlZiB0byBAcHhyZWYuCi0KLQkqIG1hY3JvLmMgKG1hY3JvX2V4cGFuZF9ib2R5KTogSW4gTVJJIG1vZGUsIGp1c3QgY29weSBhIHNpbmdsZSAmLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQ2FsbCBmcmFnX2dyb3cgYmVmb3JlIGFkZGluZyBhCi0JUENJTkRFWCBmcmFnLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogQWNjZXB0ICdCJyBhcyBhIHNpemUgZm9yIGFuCi0JaW1tZWRpYXRlIHZhbHVlLgotCShtZF9hc3NlbWJsZSk6IElmIHRoZSBzaXplIGlzICdCJywgc2V0IGZ4X3NpZ25lZC4KLQkobWRfYXBwbHlfZml4XzIpOiBVc2UgZnhfc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotCi0JKiB3cml0ZS5oIChzdHJ1Y3QgZml4KTogQWRkIGZ4X3NpZ25lZCBmaWVsZC4KLQkqIHdyaXRlLmMgKGZpeF9uZXdfaW50ZXJuYWwpOiBJbml0aWFsaXplIGZ4X25vX292ZXJmbG93IGFuZAotCWZ4X3NpZ25lZCBmaWVsZHMuCi0JKGZpeHVwX3NlZ21lbnQpOiBVc2UgZnhfc2lnbmVkIHdoZW4gY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBDaGVjayBmeF9ub19vdmVyZmxvdyBhbmQKLQlmeF9zaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCi0KLVRodSBKYW4gIDIgMTM6Mzc6MjkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBOT1RFUywgTk9URVMuY29uZmlnOiBSZW1vdmVkLiAgVGhlc2UgYXJlIHJhcmVseSwgaWYgZXZlciwKLQl1cGRhdGVkLCBhbmQgYWxsIHRoZSB1c2VmdWwgaW5mb3JtYXRpb24gaXMgaW4gZG9jL2ludGVybmFscy50ZXhpLgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+OgotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGVjayBmb3IgY29uZGl0aW9uYWwgb3BlcmF0b3JzCi0JYmVmb3JlIGRvaW5nIGFuIE1SSSBwZW5kaW5nIGFsaWdubWVudC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3ApOiBEZWNsYXJlLgotCSh0Y19jb25kaXRpb25hbF9wc2V1ZG9wKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19jb25kaXRpb25hbF9wc2V1ZG9wKTogTmV3IGZ1bmN0aW9uLgotCSogZG9jL2ludGVybmFscy50ZXhpIChDUFUgYmFja2VuZCk6IERlc2NyaWJlCi0JdGNfY29uZGl0aW9uYWxfcHNldWRvb3AuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX3JlbDMyX2Zyb21fY21kbGluZSk6IE5ldyBzdGF0aWMKLQl2YXJpYWJsZS4KLQkobWRfYmVnaW4pOiBDaGVjayBtNjhrX3JlbDMyX2Zyb21fY21kbGluZSBiZWZvcmUgc2V0dGluZwotCW02OGtfcmVsMzIuCi0JKG02OGtfbXJpX21vZGVfY2hhbmdlKTogTGlrZXdpc2UuCi0JKG1kX2xvbmdvcHRzKTogQWRkIC0tZGlzcC1zaXplLWRlZmF1bHQtMTYgYW5kCi0JLS1kaXNwLXNpemUtZGVmYXVsdC0zMi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1PcHRzKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQlCYXNlZCBvbiBwYXRjaCBmcm9tIFJvbmFsZCBGLiBHdWlsbWV0dGUgPHJmZ0Btb25rZXlzLmNvbT46Ci0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQpOiBOZXcgc3RhdGljCi0JdmFyaWFibGUuCi0JKG02OGtfaXApOiBVc2UgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0IHRvIHNldCB0aGUgc2l6ZSBvZiBhIGJhc2UKLQlyZWdpc3RlciB3aG9zZSBzaXplIHdhcyBub3QgZ2l2ZW4uCi0JKG1kX2xvbmdvcHRzKTogQWRkIC0tYmFzZS1zaXplLWRlZmF1bHQtMTYgYW5kCi0JLS1iYXNlLXNpemUtZGVmYXVsdC0zMi4KLQkobWRfcGFyc2Vfb3B0aW9uKTogSGFuZGxlIG5ldyBvcHRpb25zLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkqIGRvYy9jLW02OGsudGV4aSAoTTY4Sy1PcHRzKTogRG9jdW1lbnQgbmV3IG9wdGlvbnMuCi0KLQkqIGRvYy9jLW1pcHMudGV4aTogTWVudGlvbiBJU0EgbGV2ZWwgNCwgYW5kIHRoZSAtbWlwczE2IG9wdGlvbi4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbWlwcy0qLWxpbnV4KiB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZXdyaXRlIDY0IGJpdCBoYW5kbGluZyB0bwotCXdvcmsgaWYgdmFsdWVUIGlzIG9ubHkgMzIgYml0cy4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVGhyb3VnaG91dCwgY2hlY2sgdGFyZ2V0X2JpZ19lbmRpYW4gcmF0aGVyCi0gCXRoYW4gYnl0ZV9vcmRlci4KLSAJKGJ5dGVfb3JkZXIpOiBSZW1vdmUuCi0JKG1pcHNfaW5pdF9hZnRlcl9hcmdzKTogUmVtb3ZlLgotCSogY29uZmlnL3RjLW1pcHMuaCAoTElUVExFX0VORElBTiwgQklHX0VORElBTik6IERvbid0IGRlZmluZS4KLQkobWlwc19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWNsYXJlLgotCSh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEb24ndCBkZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfYWZ0ZXJfcmVsb2NzKTogRGVmaW5lIGlmCi0JT0JKX01BWUJFX0VMRi4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IExpa2V3aXNlLgotCShFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDMxIDE1OjEyOjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBJZiB0aGlzIGlzIHNzdC57aCx3fSBvcgotCXNsZC57aCx3fSBhbmQgdGhlIG9wZXJhbmQgaXMgcmVsb2NhdGFibGUsIGFkanVzdCB0aGUgYWRlbmQgYnkKLQlzaGlmdGluZyBpdCByaWdodCBvbmUgYml0LgotCi1UdWUgRGVjIDMxIDEyOjU2OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChyZWFkX2Ffc291cmNlX2ZpbGUpOiBDaGVjayBtcmlfcGVuZGluZ19hbGlnbiBhZnRlcgotCWNoZWNraW5nIGZvciBhIG1hY3JvLiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlCi0JPHJmZ0Btb25rZXlzLmNvbT4uCi0KLQkqIE1ha2VmaWxlLmluIChBTExfQ0ZMQUdTKTogQWRkIC1EX0dOVV9TT1VSQ0UuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgzKTogUmVuYW1lIGZyb20gbWRfYXBwbHlfZml4LCBhbmQKLSAJYWRkIHNlZ21lbnQgYXJndW1lbnQuICBJZiBPQkpfRUxGLCB0cmVhdCBhIHJlbG9jYXRpb24gYWdhaW5zdCBhCi0gCXN5bWJvbCBpbiBhIGxpbmtvbmNlIHNlY3Rpb24gbGlrZSBhIHJlbG9jYXRpb24gYWdhaW5zdCBhbiBleHRlcm5hbAotIAlzeW1ib2wuCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQotTW9uIERlYyAzMCAxMTozNTo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9tYWNybyk6IEFkZCBjYXNlIGZvciBNX0FCUy4KLQotRnJpIERlYyAyNyAyMjo1MTo1MSAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTk9URVMuY29uZmlnIChJbXBsZW1lbnRhdGlvbik6IGFzLmggI2RlZmluZSdzICJHQVMiIG5vdCAiZ2FzIiwKLQlpbmNsdWRlcyBjb25maWcuaCBpbnN0ZWFkIG9mIGhvc3QuaCwgdGMuaCBpbnN0ZWFkIG9mIHRwLmgsIGFuZAotCXRhcmctZW52LmggaW5zdGVhZCBvZiB0YXJnZXQtZW52aXJvbm1lbnQuaC4KLQlBbHNvLCBvYmotZm9ybWF0LmggaW5jbHVkZXMgdGFyZy1jcHUuaCBpbnN0ZWFkIG9mCi0gCXRhcmdldC1wcm9jZXNzb3IuaC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2FzZSAke2dlbmVyaWNfdGFyZ2V0fSk6IEFkZCB0aWM4MC0qLWNvZmYgZW50cnkuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZi4KLQkqIGNvbmZpZy9vYmotY29mZi5oIChjb2ZmL3RpYzgwLmgpOiBJbmNsdWRlIGlmIFRDX1RJQzgwIGRlZmluZWQuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgdG8gImNvZmYtdGljODAiLgotCSogY29uZmlnL3RjLXRpYzgwLmM6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCSogY29uZmlnL3RjLXRpYzgwLmg6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCQotRnJpIERlYyAyNyAxMTo0MjoyOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvIChNKTogTWVudGlvbiBleHBsaWNpdGx5IHRoYXQgLU0gY2hhbmdlcyBtYWNybwotCWhhbmRsaW5nLgotCi1UaHUgRGVjIDE5IDEyOjA2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBJZiB0aGUgZml4dXAgc3ltYm9sIGhhcyBiZWVuCi0JZXF1YXRlZCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLCBjb252ZXJ0IHRoZSBmaXh1cCB0byBiZWluZyBhZ2FpbnN0Ci0JdGhlIHRhcmdldCBzeW1ib2wuICBSZW1vdmUgb2Jzb2xldGUgY29kZSBoYW5kbGluZyBhIHNwZWNpYWwgY2FzZQotCWZvciBpMzg2IFBJQy4KLQotV2VkIERlYyAxOCAyMjo1NDozOSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXNlIE5ld0ZvbGRlclJlY3Vyc2l2ZSBmb3IgaW5zdGFsbGF0aW9uLgotCi1XZWQgRGVjIDE4IDE2OjAwOjQyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkb19hc3NlbWJsZSk6IENvcnJlY3QgcHJldmlvdXMgYnVnIGZpeC4KLQotV2VkIERlYyAxOCAxNToyNzo0MCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBGaXggYnVnIHdoaWNoIGNhdXNlZAotCXNlY29uZCBpbnN0cnVjdGlvbiBpbiBhIGxpbmUgdG8gYmUgY2FzZSBzZW5zaXRpemUuCi0KLVdlZCBEZWMgMTggMTA6MDg6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDIwMC5jIChtbjEwMjAwX2luc2VydF9vcGVyYW5kKTogRG9uJ3QKLQlyYW5nZSBjaGVjayBvcGVyYW5kcyB3aXRoIE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLIHNldC4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1UdWUgRGVjIDE3IDEwOjU5OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kbyBwYXJ0IG9mIGxhc3QgRnJpZGF5J3MgYWxpZ25tZW50IGNoYW5nZXMuCi0gCShtZF9iZWdpbik6IEFsd2F5cyBhbGlnbiB0aGUgdGV4dCBzZWN0aW9uIHRvIGEgZm91ciBieXRlCi0JYm91bmRhcnkuCi0JKGFwcGVuZF9pbnNuKTogUmVtb3ZlIGNhbGwgdG8gcmVjb3JkX2FsaWduLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChpbnNuX2xhYmVsKTogUmVtb3ZlLgotCShzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0KTogRGVmaW5lLgotCShpbnNuX2xhYmVscywgZnJlZV9pbnNuX2xhYmVscyk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShtaXBzX2NsZWFyX2luc25fbGFiZWxzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoYXBwZW5kX2luc24pOiBNYXJrIGFsbCBtaXBzMTYgdGV4dCBsYWJlbHMsIGFuZCBtYWtlIHRoZW0gb2RkLgotCUhhbmRsZSBhbGwgbGFiZWxzIGFmdGVyIGVtaXR0aW5nIGEgbm9wLCBub3QganVzdCBvbmUuICBDYWxsCi0JbWlwc19jbGVhcl9pbnNuX2xhYmVscyByYXRoZXIgdGhhbiBqdXN0IGNsZWFyaW5nIGluc25fbGFiZWwuCi0JKG1pcHNfZW1pdF9kZWxheXMpOiBBZGQgaW5zbnMgcGFyYW1ldGVyLCBhbmQgdXNlIGl0IHRvIGRlY2lkZQotCXdoZXRoZXIgdG8gbWFyayBtaXBzMTYgbGFiZWxzLiAgSGFuZGxlIGFsbCBsYWJlbHMsIG5vdCBqdXN0IG9uZS4KLQlGb3JjZSBtaXBzMTYgbGFiZWxzIHRvIGJlIG9kZC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWlwczE2X2ltbWVkKTogRG9uJ3QgY2hlY2sgZm9yIGFuIG9kZCBicmFuY2ggdGFyZ2V0LgotCShtZF9hcHBseV9maXgpOiBEb24ndCBjaGVjayBtaXBzMTYgbW9kZSBmb3IgYSBicmFuY2ggcmVsb2MuCi0JKG1pcHMxNl9leHRlbmRlZF9mcmFnKTogSWdub3JlIHRoZSBsb3cgYml0IGluIGEgYnJhbmNoIHRhcmdldC4KLQkobWRfY29udmVydF9mcmFnKTogTGlrZXdpc2UuCi0JKG1pcHNfbm9fcHJldl9pbnNuKTogQ2FsbCBtaXBzX2NsZWFyX2luc25fbGFiZWxzIHJhdGhlciB0aGFuIGp1c3QKLQljbGVhcmluZyBpbnNuX2xhYmVsLgotCShtaXBzX2FsaWduLCBtaXBzX2ZsdXNoX3BlbmRpbmdfb3V0cHV0LCBzX2NvbnMpOiBMaWtld2lzZS4KLQkoc19mbG9hdF9jb25zLCBzX2dwd29yZCk6IExpa2V3aXNlLgotCShzX2FsaWduKTogVXNlIGluc25fbGFiZWxzIHJhdGhlciB0aGFuIGluc25fbGFiZWwuCi0JKHNfY29ucywgc19mbG9hdF9jb25zLCBzX2dwd29yZCk6IExpa2V3aXNlLgotCShtaXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBOZXcgZnVuY3Rpb24uCi0JKG1pcHNfZGVmaW5lX2xhYmVsKTogUmV3cml0ZSB0byBhZGQgdG8gaW5zbl9sYWJlbHMgbGlzdC4KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWZpbmUuCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9zeW1ib2xzKTogSWYgdGhlIHNpemUgb2YgYSBmdW5jdGlvbiBjb21lcwotCW91dCBvZGQsIGluY3JlbWVudCBpdC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBPbmx5IHVwZGF0ZSBwcmV2X2luc24gd2hlbiBub3QKLQlyZW9yZGVyaW5nIGlmIHBsYWNlIGlzIE5VTEwuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pcCk6IENoZWNrIGZvciBhIG1pc3NpbmcgZXhwcmVzc2lvbgotCXdoZW4gdXNpbmcgdGhlIHJlZ2lzdGVyIGluZGlyZWN0IGFkZHJlc3NpbmcgbW9kZS4KLQotTW9uIERlYyAxNiAxMDowODo0NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMjAwLmMgKG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQpOiBEb24ndAotCWNoZWNrIDI0Yml0IG9wZXJhbmRzIGZvciBvdmVyZmxvdy4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1Nb24gRGVjIDE2IDExOjUwOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm8gKFNlY3Rpb24pOiBEb2N1bWVudCBob3cgdG8gdXNlIHRoZSAuc2VjdGlvbgotCXBzZXVkby1vcCBmb3IgQ09GRiBhbmQgRUxGLgotCi1TdW4gRGVjIDE1IDE1OjI2OjM3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogd3JpdGUuYyAoYWRqdXN0X3JlbG9jX3N5bXMpOiBGaXggbGlua29uY2UgY2hlY2sgZm9yIEVMRi4KLQotU2F0IERlYyAxNCAyMjozNzoyNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHByZXZfaW5zbl9yZWxvY190eXBlKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoUkVMQVhfTUlQUzE2X0VOQ09ERSk6IEFkZCBkc2xvdCBhbmQgamFsX2RzbG90IGFyZ3VtZW50cywgYW5kCi0Jc3RvcmUgdGhlbS4gIEFkanVzdCBvdGhlciBSRUxBWF9NSVBTMTYgbWFjcm9zLgotCShSRUxBWF9NSVBTMTZfRFNMT1QpOiBEZWZpbmUuCi0JKFJFTEFYX01JUFMxNl9KQUxfRFNMT1QpOiBEZWZpbmUuCi0JKGFwcGVuZF9pbnNuKTogUGFzcyBuZXcgYXJndW1lbnRzIHRvIFJFTEFYX01JUFMxNl9FTkNPREUuICBDb3JyZWN0Ci0JaGFuZGxpbmcgb2Ygd2hldGhlciBwcmV2aW91cyBpbnN0cnVjdGlvbiBoYXMgYSBmaXh1cC4gIFNldAotCXByZXZfaW5zbl9yZWxvY190eXBlLgotCShtaXBzX25vX3ByZXZfaW5zbik6IENsZWFyIHByZXZfaW5zbl9yZWxvY190eXBlLgotCShtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IFVzZSB0aGUgcmlnaHQgYmFzZSBhZGRyZXNzIGZvciBhIFBDCi0JcmVsYXRpdmUgYWRkIG9yIGxvYWQuCi0JKG1kX2NvbnZlcnRfZnJhZyk6IExpa2V3aXNlLiAgSWYgYSBQQyByZWxhdGl2ZSBhZGQgb3IgbG9hZCBpcwotCXVzZWQsIHJlY29yZCB0aGUgYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbi4KLQotRnJpIERlYyAxMyAxMzowMDozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3QgcmVkdWNlIGEgcmVsb2MgYWdhaW5zdCBhCi0JbGlua29uY2Ugc2VjdGlvbiBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUgc2VjdGlvbiBzeW1ib2wuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9tYWNybyk6IFJlbW92ZSBub3AgaW5zdHJ1Y3Rpb25zIGFmdGVyCi0JYnJhbmNoIGluc3RydWN0aW9ucy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiBjb25maWd1cmVkIGZvciBhbiBlbWJlZGRlZCBFTEYKLQlzeXN0ZW0sIGRvbid0IHNldCB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgdG8gMioqNC4KLQkoc19jaGFuZ2Vfc2VjKTogTGlrZXdpc2UuCi0JKGFwcGVuZF9pbnNuKTogQ2FsbCByZWNvcmRfYWxpZ25tZW50IGZvciB0aGUgc2VjdGlvbi4KLQkobWRfc2VjdGlvbl9hbGlnbik6IERvbid0IGFsaWduIHRoZSBzZWN0aW9uIHNpemUgZm9yIGFuIGVtYmVkZGVkCi0JRUxGIHN5c3RlbS4KLQotVGh1IERlYyAxMiAxNjo0MDo0NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogTWFrZSBzdXJlIHRoYXQgc3ltYm9scyBhcmUKLQlyZXNvbHZlZDsgZXhwcmVzc2lvbiBzeW1ib2xzIG1heSBoYXZlIGJlZW4gc2tpcHBlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChmaXh1cF9zZWdtZW50KTogTGlrZXdpc2UuCi0KLVRodSBEZWMgMTIgMTU6MTg6MjEgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfc3VmZml4KTogTW92ZSBAcGx0IHRvCi0JQkZEX1JFTE9DXzI0X1BMVF9QQ1JFTCByZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogU3VwcG9ydCBCRkRfUkVMT0NfMjRfUExUX1BDUkVMLgotCi1UdWUgRGVjIDEwIDEzOjUxOjU1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogUmVtb3ZlIGNvZGUgdGhhdCBjYWxsZWQKLQlwYXJhbGxlbF9vaygpIHdoZW4gdGhlIHByb2dyYW1tZXIgc3BlY2lmaWVkIHBhcmFsbGVsIGluc3RydWN0aW9ucy4KLQotVHVlIERlYyAxMCAxMjoyMzoxOSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogVXBkYXRlIHRvIGhhbmRsZSBlbmRpYW5uZXNzCi0JaXNzdWVzIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYyAobWRfYXNzZW1ibGUpOiBPcGNvZGUgMHgwIGlzIHZhbGlkIQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotVHVlIERlYyAxMCAxMTozNzoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCByb29tCi0JaW4gYSBmcmFnIGFmdGVyIGEgbWlwczE2IGluc3RydWN0aW9uIHRvIHN3aXRjaCBpdCB3aXRoIGEganVtcAotCWluc3RydWN0aW9uLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IEdpdmUgYW4gZXJyb3IgZm9yIGFuCi0JYXR0ZW1wdCB0byB1c2UgYSBub24gYWJzb2x1dGUgc3ltYm9sIGluIGFuIGV4dGVuZGluZyBmcmFnLgotCi1Nb24gRGVjICA5IDE2OjQ4OjIwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAyMDAuYzogRmxlc2ggb3V0IGFzc2VtYmxlciBzdXBwb3J0IGZvciBNTjEwMjAwLgotCSogY29uZmlnL3RjLW1uMTAyMDAuaDogTGlrZXdpc2UuCi0KLU1vbiBEZWMgIDkgMTc6MDk6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBBdCB0aGUgZW5kIG9mIGEgQyBjb21tZW50LCBwYXNzIHNwYWNlIHRvCi0JVU5HRVQgcmF0aGVyIHRoYW4gUFVULiAgU2V0IG9sZF9zdGF0ZSBiZWZvcmUgc2V0dGluZyBzdGF0ZSB0byAtMi4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwczE2X2V4dGVuZGVkX2ZyYWcpOiBBdm9pZCBhbiBpbmZpbml0ZSBsb29wCi0Jd2hlbiBleHRlbmRpbmcgYmVjYXVzZSB0aGUgdmFsdWUgaXMgZXhhY3RseSBtYXh0aW55ICsgMS4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoUkVMQVhfTUlQUzE2X0VOQ09ERSk6IEFkZCBzbWFsbCBhbmQgZXh0Ci0JYXJndW1lbnRzLCBhbmQgc3RvcmUgdGhlbS4gIEFkanVzdCBvdGhlciBSRUxBWF9NSVBTMTYgbWFjcm9zLgotCShSRUxBWF9NSVBTMTZfVVNFUl9TTUFMTCk6IERlZmluZS4KLQkoUkVMQVhfTUlQUzE2X1VTRVJfRVhUKTogRGVmaW5lLgotCShtaXBzMTZfc21hbGwsIG1pcHMxNl9leHQpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoYXBwZW5kX2luc24pOiBQYXNzIG1pcHMxNl9zbWFsbCBhbmQgbWlwczE2X2V4dCB0bwotCVJFTEFYX01JUFMxNl9FTkNPREUuCi0JKG1pcHMxNl9pcCk6IFNldCBtaXBzMTZfc21hbGwgYW5kIG1pcHMxNl9leHQuCi0JKG1pcHMxNl9pbW1lZCk6IERvbid0IGNoZWNrIG1pcHMxNl9hdXRvZXh0ZW5kLgotCShtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IENoZWNrIFVTRVJfU01BTEwgYW5kIFVTRVJfRVhULgotCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBQcmludCBhbiBlcnJvciBmb3IgYW4gb3V0IG9mIHJhbmdlCi0JZml4dXAsIHJhdGhlciB0aGFuIGNhbGxpbmcgYWJvcnQuCi0KLQkqIGFzLmMgKG1haW4pOiBVbmxpbmsgdGhlIG91dHB1dCBmaWxlIGlmIHRoZXJlIGFyZSBlcnJvcnMgd2hpbGUKLQlnZW5lcmF0aW5nIHRoZSBmaXh1cHMuCi0KLUZyaSBEZWMgIDYgMTg6NDg6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyk6IERvbid0IGNhbGwKLQlTX0dFVF9WQUxVRS4KLQkobWRfY29udmVydF9mcmFnKTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBiZWZvcmUgY2FsbGluZwotCVNfR0VUX1ZBTFVFLCBhbmQgZG9uJ3QgYWRkIGluIHRoZSBmcmFnIGFkZHJlc3MuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHMxNl9pbW1lZCk6IEFkZCBmaWxlIGFuZCBsaW5lIHBhcmFtZXRlcnMsCi0JYW5kIHVzZSB0aGVtIHdoZW4gcmVwb3J0aW5nIGVycm9ycy4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQotRnJpIERlYyAgNiAxNTozNjozMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmM6IEZpeCB2YXJpb3VzIGdjYyAtV2FsbCB3YXJuaW5ncy4KLQlSZW1vdmUgJyQnIHByZWZpeGluZyBmb3IgcmVnaXN0ZXJzLgotCi1GcmkgRGVjICA2IDAwOjU1OjQ4IDE5OTYgIE1hcnRpbiAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBDaGVjayB0byBzZWUgaWYgcHJldl9zZWcKLQlpcyBpbml0aWFsaXplZCBiZWZvcmUgdXNpbmcgaXQuCi0JKGQxMHZfY2xlYW51cCk6IE5vIGxvbmdlciB1c2VzIGl0cyBhcmd1bWVudCwgc28gbWFrZSBpdCB2b2lkLgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChkMTB2X2NsZWFudXApOiBDaGFuZ2UgcHJvdG90eXBlLgotCQotVGh1IERlYyAgNSAxMTowMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBkaXNjYXJkIHRoZSBzeW1ib2wgZm9yIGEgUEMKLQlyZWxhdGl2ZSBmaXh1cCB0byBhbiBhYnNvbHV0ZSBzeW1ib2wuCi0KLVdlZCBEZWMgIDQgMTU6NDI6NDEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKG1kX2Fzc2VtYmxlLCBkMTB2X2NsZWFudXApOiBGaXggYnVnCi0Jd2l0aCBtdWx0aXBsZSBzZWN0aW9ucy4KLQotV2VkIERlYyAgNCAxMzowMDowNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2xvbmdvcHRzKTogUmVuYW1lIG1pcHMtMTYgdG8gbWlwczE2LCBhbmQKLQluby1taXBzLTE2IHRvIG5vLW1pcHMxNi4KLQkoc19taXBzc2V0KTogQWNjZXB0IC5zZXQgbWlwczE2IGFuZCAuc2V0IG5vbWlwczE2LgotCi1XZWQgRGVjICA0IDEwOjM1OjMzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3N1ZmZpeCk6IFRha2UgZXhwcmVzc2lvblMgcG9pbnRlcgotCWFyZ3VtZW50LCBhbmQgY2hlY2sgZm9yICsvLSBjb25zdGFudCBmb2xsb3dpbmcgdGhlIHN1ZmZpeCwgZm9sZGluZwotCWl0IGludG8gdGhlIGV4cHJlc3Npb24uCi0JKHBwY19lbGZfY29ucyk6IENoYW5nZSBwcGNfZWxmX3N1ZmZpeCBjYWxscy4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkoc2hsaWIpOiBSZXBsYWNlIGJvb2xlYW4gbXJlbG9jYXRhYmxlIHdpdGggZW51bWVyYXRpb24gc2hsaWIuCi0JKG1kX3BhcnNlX29wdGlvbik6IERpc2NyaW1pbmF0ZSBiZXR3ZWVuIFBJQyBzdHlsZSBzaGFyZWQgbGlicmFyaWVzCi0JYW5kIC1tcmVsb2NhdGFibGUuCi0JKHBwY19lbGZfdmFsaWRhdGVfZml4KTogRG9uJ3QgcmVwb3J0IHdhcm5pbmdzIGZvciBQSUMgc3R5bGUgc2hhcmVkCi0JbGlicmFyaWVzLgotCi1UdWUgRGVjICAzIDIzOjE4OjI5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5oICh7dGMscHBjfV9jb21tZW50X2NoYXJzKTogRGVmaW5lLCBzbyB0aGF0IHdlIGNhbgotCWNoYW5nZSB0aGUgY29tbWVudCBjaGFyYWN0ZXJzLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKGNvbW1lbnRfY2hhcnMpOiBEZWxldGUgaW4gZmF2b3Igb2YKLQl0Y19jb21tZW50X2NoYXJzLgotCShwcGNfe2VhYmksc29sYXJpc31fY29tbWVudF9jaGFycyk6IEVhYmkgYW5kIFNvbGFyaXMgdmVyc2lvbnMgb2YKLQljb21tZW50IGNoYXJzLgotCShwcGNfY29tbWVudF9jaGFycyk6IFNlbGVjdCBhcHByb3ByaWF0ZSBjb21tZW50IGNoYXJzIGJ5IGRlZmF1bHQuCi0JKG1zb2xhcmlzKTogTmV3IGZsYWcgZm9yIC1teyxuby19c29sYXJpcy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1LIHBpYy4gIEFkZCBzdXBwb3J0IGZvcgotCS1teyxuby19c29sYXJpcy4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZS4KLQkobWRfYmVnaW4pOiBEbyBub3Qgc2V0IEVMRiBmbGFncyBpZiBTb2xhcmlzLgotCShwcGNfZWxmX3N1ZmZpeCk6IEBsb2NhbCBzZXRzIFJfUFBDX0xPQ0FMMjRQQyByZWxvY2F0aW9uLgotCShtZF9hcHBseV9maXgzKTogQWRkIHN1cHBvcnQgZm9yIFJfUFBDX0xPQ0FMMjRQQy4KLQotTW9uIERlYyAgMiAxMzo0ODo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDb3JyZWN0IGhhbmRsaW5nIG9mIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dC4KLQotU3VuIERlYyAgMSAyMTo0NjowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKHRjX2dlbl9yZWxvYyk6IEdldCB0aGUgYWRkZW5kIGZyb20KLQlmeF9vZmZzZXQsIG5vdCBmeF9hZGRudW1iZXIuCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgZG8gYW55Ci0JcmVsb2MgYWRqdXN0bWVudHMuCi0KLVNhdCBOb3YgMzAgMTc6MzQ6NDggMTk5NiAgRWxpb3QgRHJlc3NlbGhhdXMgIDxlbGlvdEB3YWxseS5lZGMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jOiBDb3JyZWN0IG1pc3NwZWxsaW5nOiBiYWxlbmNlZCB0byBiYWxhbmNlZC4KLQotV2VkIE5vdiAyNyAxMzoyNTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBDaGVjayBmb3IgYW4gYWxpZ25tZW50IG9mCi0JNCwgbm90IGFuIGFsaWdubWVudCBvZiAxNi4gIENvcnJlY3RzIEF1Z3VzdCA3IHBhdGNoLgotCi1UdWUgTm92IDI2IDEwOjMzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX2xjb21tKTogRG9uJ3QgZ2l2ZSBhbiBlcnJvciBpZiBubwotCWFsaWdubWVudCBpcyBzcGVjaWZpZWQuCi0KLQlBZGQgc3VwcG9ydCBmb3IgbWlwczE2ICgxNiBiaXQgTUlQUyBpbXBsZW1lbnRhdGlvbik6Ci0JKiBjb25maWcvdGMtbWlwcy5jOiBFeHRlbnNpdmUgYWRkaXRpb25zIGZvciBtaXBzMTYgc3VwcG9ydCwgbm90Ci0JbGlzdGVkIGhlcmUuCi0JKFJFTEFYX09MRCwgUkVMQVhfTkVXKTogVXNlIG9ubHkgNyBiaXRzIGVhY2guCi0JKGluc25fdXNlc19yZWcpOiBDaGFuZ2UgbGFzdCBwYXJhbWV0ZXIgdG8gYW4gZW51bS4KLQkqIGNvbmZpZy90Yy1taXBzLmggKExPQ0FMX0xBQkVMU19ET0xMQVIpOiBEZWZpbmUgYXMgMC4KLQkobWRfcmVsYXhfZnJhZyk6IERlZmluZSBhcyBtaXBzX3JlbGF4X2ZyYWcuCi0JKG1pcHNfcmVsYXhfZnJhZyk6IERlY2xhcmUuCi0JKHN0cnVjdCBtaXBzX2NsX2luc24pOiBBZGQgdXNlX2V4dGVuZCBhbmQgZXh0ZW5kIGZpZWxkcy4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChTX0dFVF9PVEhFUik6IERlZmluZS4KLQkoU19TRVRfT1RIRVIpOiBEZWZpbmUuCi0KLU1vbiBOb3YgMjUgMTg6MDI6MjkgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGJlYXV0eS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogSW1wbGVtZW50IGNhc2VzIGZvciBuZXcgPCwgPiwgbSwgbiwKLSAJbyBhbmQgcCBvcGVyYW5kIHNwZWNpZmllcnMuCi0KLU1vbiBOb3YgMjUgMTA6NDU6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmM6IERlbGV0ZSAiaWZuZGVmIG1kX3JlbGF4X2ZyYWciIGFyb3VuZCBpc19kbnJhbmdlLgotCShyZWxheF9zZWdtZW50LCBjYXNlIHJzX29yZyk6IE1vdmUgY29kZSBpbnNpZGUgYnJhY2VzLiAgTW92ZSBsb2NhbHMKLQl0YXJnZXQsYWZ0ZXIgaW5zaWRlIHRvby4KLQkocmVsYXhfc2VnbWVudCwgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudCk6IEd1dHMgbW92ZWQgdG8gLi4uCi0JKHJlbGF4X2ZyYWcpOiBOZXcgZnVuY3Rpb24uCi0JQ2FsbCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4gaWYgZGVmaW5lZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKG1kX3ByZXBhcmVfcmVsYXhfc2Nhbik6IFJlbmFtZWQgZnJvbQotCU02OEtfQUlNX0tMVURHRS4KLQotTW9uIE5vdiAyNSAwODo0OTozNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKGFkZHJlc3NfcmVnaXN0ZXJzKTogVXNlICckJyBhcyByZWdpc3RlcgotCXByZWZpeCBpbnN0ZWFkIG9mICclJy4KLQkoZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycywgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAoYWRkcmVzc19yZWdpc3RlcnMpOiBVc2UgJyUnIHByZWZpeCBmb3IgcmVncy4KLQkoZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycywgbWRfYXNzZW1ibGUpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0bHkgZGV0ZXJtaW5lIHRoZQotCWNvcnJlY3QgbG9jYXRpb24gYW5kIHR5cGUgZm9yIGVhY2ggcmVsb2NhdGlvbi4KLQkobWRfcGNyZWxfZnJvbSk6IFNpbXBsaWZ5LgotCi1GcmkgTm92IDIyIDE1OjQyOjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmMgKG1kX2NvbnZlcnRfZnJhZyk6IEltcHJvdmUgd2FybmluZyB3aGVuIGJyYW5jaCBpcwotCWNvbnZlcnRlZCBpbnRvIGJyYW5jaCBhcm91bmQgYnJhbmNoLgotCi1UaHUgTm92IDIxIDExOjU2OjExIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuaCAoRElGRl9FWFBSX09LKTogRG9uJ3QgZGVmaW5lIHRoaXMuCi0JKHRjX2ZpeF9hZGp1c3RhYmxlKTogRG9uJ3QgYWRqdXN0IHJlbG9jcyBhZ2FpbnN0IHdlYWsgc3ltYm9scyBvciAKLQlwYy1yZWxhdGl2ZSByZWxvY3MuCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9iZWdpbik6IFNldCBsaW5rcmVsYXguCi0JKG1kX2Fzc2VtYmxlKTogQ3JlYXRlIGZpeHVwcyBhcyBuZWVkZWQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBHdXQuICBJdCBzaG91bGRuJ3QgZXZlciBnZXQgY2FsbGVkIGFueW1vcmUuCi0KLVR1ZSBOb3YgMTkgMTc6NDg6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChwYXJhbGxlbF9vayk6IFdoZW4gYXV0b21hdGljYWxseSBjb252ZXJ0aW5nCi0Jc2VyaWFsIG9wcyB0byBwYXJhbGxlbCwgZG8gbm90IGNvbnNpZGVyIGEgYnJhbmNoIGFzIHRoZSBmaXJzdAotCWluc3RydWN0aW9uLgotCi1UdWUgTm92IDE5IDEzOjM1OjIyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBIYW5kbGUgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNULgotCi1Nb24gTm92IDE4IDE1OjI2OjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IFByb3ZpZGUgcHJvdG90eXBlCi0JdmlhIFBBUkFNUy4KLQkoY2hlY2tfb3BlcmFuZCk6IExpa2V3aXNlLgotCi1Nb24gTm92IDE4IDE1OjIyOjI4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBCcmFuY2ggYW5kIGxpbmsgaW5zdHJ1Y3Rpb25zCi0JbW9kaWZ5IHIxMy4KLQkod3JpdGVfMl9zaG9ydCk6IENhbGwgcGFyYWxsZWxfb2sgdG8gY2hlY2sgd2hldGhlciB0d28gc2hvcnQKLQlpbnN0cnVjdGlvbnMgdGhlIHVzZXIgcmVxdWVzdGVkIGV4ZWN1dGUgaW4gcGFyYWxsZWwsIGNhbiBiZQotCWV4ZWN1dGVkIHRoYXQgd2F5LgotCi1UaHUgTm92IDE0IDExOjE3OjQ5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jICh3cml0ZV8yX3Nob3J0KTogRml4IGJ1ZyB0aGF0IHdvdWxkbid0Ci0JYWxsb3cgYSBicmFuY2ggYW5kIGxpbmsgaW4gcGFyYWxsZWwgd2l0aCBhbiBleGUgaW5zdHJ1Y3Rpb24uCi0KLUZyaSBOb3YgIDggMTM6NTU6MDMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWQxMHYudGV4aTogQWRkIGluZm8gb24gQHdvcmQgbW9kaWZpZXIuCi0KLVdlZCBOb3YgIDYgMTM6NDY6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IE1OMTAzMDBfT1BFUkFORF9TUExJVAotCW9wZXJhbmRzIGFyZSBhc3N1bWVkIHRvIGJlIDMyYml0cy4gIFVzZSAiYml0cyIgZmllbGQgdG8gaG9sZCB0aGUKLQludW1iZXIgb2YgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQuCi0JKG1uMTAzMDBfY2hlY2tfb3BlcmFuZCk6IE1OMTAzMDBfT1BFUkFORF9TUExJVCBvcGVyYW5kcyBhcmUgYXNzdW1lZAotCXRvIGJlIDMyYml0cy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IFNoaWZ0IGxvdyBwYXJ0Ci0Jb2YgYSBNTjEwMzAwX09QRVJBTkRfU1BMSVQgb3BlcmFuZCBieSBvcGVyYW5kLT5zaGlmdC4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEhhbmRsZQotCU1OMTAzMDBfT1BFUkFORF9TUExJVC4KLQotVHVlIE5vdiAgNSAxMzozMDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmMgKG1kX2Fzc2VtYmxlKTogSW5zZXJ0IG9wZXJhbmRzIGludG8KLQl0aGUgZXh0ZW5zaW9uIHBhcnQgb2YgdGhlIGluc3RydWN0aW9uIGlmIG5lY2Vzc2FyeS4KLQkobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBwb2ludGVyIHRvIGV4dGVuc2lvbiB3b3JkCi0JYXJndW1lbnQuICBNYWtlIGluc24gYSBwb2ludGVyIGFyZ3VtZW50IHRvby4gIFJldHVybiB0eXBlCi0JaXMgbm93IHZvaWQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCi1Nb24gTm92ICA0IDEyOjUzOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEhhbmRsZQotCXJlcGVhdGVkIHJlZ2lzdGVyIG9wZXJhbmRzLgotCi1GcmkgTm92ICAxIDEwOjQyOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZG9jL2FzLnRleGluZm86IEFkZGVkIHNlY3Rpb24gb24gcmVwb3J0aW5nIGJ1Z3MuCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBDaGFuZ2UgdXNlcyBvZiB2b2lkICogdG8gUFRSLiAgQ2hhbmdlIHRoZQotCWFscGhhX21hY3JvIGVtaXQgZmllbGQgdG8gZXhwZWN0IGEgY29uc3QgYXJndW1lbnQsIGFuZCBjaGFuZ2UgdGhlCi0JYXJnIGZpZWxkIHRvIGJlIGNvbnN0LiAgRml4IHNvbWUgc3BhY2luZyB0byBmb2xsb3cgdGhlIEdOVQotCXN0YW5kYXJkLgotCi1GcmkgTm92ICAxIDEwOjMyOjAzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobWRfcGFyc2Vfb3B0aW9uKTogQWRkIGtub3dsZWRnZSBvZiAyMTE2NHBjCi0JKHBjYTU2KSBhbmQgMjEyNjQgKGV2NikgY3B1cy4KLQkobWRfYXBwbHlfZml4KTogUHJpdmF0ZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBub3cgbmVnYXRpdmUuCi0JKGFscGhhX2ZvcmNlX3JlbG9jYXRpb24pOiBMaWtld2lzZS4KLQkodGNfZ2VuX3JlbG9jKTogTGlrZXdpc2UuCi0JKGVtaXRfaW5zbik6IExpa2V3aXNlLgotCShlbWl0X2xkWHUpOiBEbyB0aGUgcmlnaHQgdGhpbmcgd2hlbiB0aGUgaGFyZHdhcmUgY2FuIGRvIGJ5dGUgaW5zbnMuCi0JKGVtaXRfc3RYKTogTGlrZXdpc2UuCi0JKGVtaXRfc2V4dFgpOiBMaWtld2lzZS4KLQotVGh1IE9jdCAzMSAxNjozMzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogQ2FsbCByZXNvbHZlX3N5bWJvbF92YWx1ZSBvbgotCWEgc3ltYm9sIGZvdW5kIGluIGEgcmVsb2MuCi0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJbXByb3ZlIHRoZSBlcnJvciBtZXNzYWdlIGlmCi0JYW4gdW5kZWZpbmVkIHN5bWJvbCBpcyB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLVdlZCBPY3QgMzAgMjA6MTU6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkb2MvaW50ZXJuYWxzLnRleGk6IFJld3JpdGUsIGFuZCBhZGQgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbi4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoaW50ZXJuYWxzLmluZm8pOiBOZXcgdGFyZ2V0LgotCi1XZWQgT2N0IDMwIDE0OjU1OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuaCAodGNfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzCi0JYWdhaW5zdCB3ZWFrIHN5bWJvbHMuCi0KLVR1ZSBPY3QgMjkgMTI6Mjg6MTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IERvbid0IGxvc2UgZm9yIHJlbGF4YWJsZQotCWFkZHJlc3NlcyBsaWtlIC4rNi4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfY29udmVydF9mcmFnKTogTWFrZSBzdXJlIHdlIGluc2VydCB0aGUKLQlmaXh1cCBhdCB0aGUgcmlnaHQgYWRkcmVzcyB3aXRoaW4gdGhlIGZyYWcuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2NvbnZlcnRfZnJhZyk6IERvbid0IHNldCBmcmFnUC0+ZnJfZml4Ci0JdG8gYW4gYWJzb2x1dGUgdmFsdWUsIGluc3RlYWQgaW5jcmVtZW50IGl0IGFzIG5lZWRlZC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy12ODUwLmM6IEZpeCBzb21lIGluZGVudGlvbiBwcm9ibGVtcy4KLQkobWRfcmVsYXhfdGFibGUpOiBEZWZpbmUgZm9yIEQ5LT5EOTkgYnJhbmNoIGRpc3BsYWNlbWVudAotCXJlbGF4aW5nLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBEbyBzb21ldGhpbmcgdXNlZnVsIGluc3RlYWQgb2YgYWJvcnRpbmcuCi0JKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogTGlrZXdpc2UuCi0JKG1kX2Fzc2VtYmxlKTogTm90ZSBpZiB0aGUgbWF0Y2hpbmcgaW5zdHJ1Y3Rpb24gaGFzIGEgcmVsYXhhYmxlCi0Jb3BlcmFuZC4gIElmIGl0IGRvZXMsIGFsbG9jYXRlIGZyYWcgd2l0aCBmcmFnX3ZhciBhbmQgZG9uJ3QKLQlkbyBhbnkgZml4dXBzLgotCi1Nb24gT2N0IDI4IDEwOjQ4OjQwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5oIChtZF9jbGVhbnVwKTogTmV3IGZ1bmN0aW9uLiAgVGhpcyBpcyBuZWVkZWQgdG8KLQl3cml0ZSBvdXQgYW55IGJ1ZmZlcmVkIGluc3RydWN0aW9ucyB3aGVuIGEgIi5lbmQiIGlzIGZvdW5kLgotCi1Nb24gT2N0IDI4IDEwOjQzOjQ1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHJlYWRfYV9zb3VyY2VfZmlsZSk6IE5ldyBob29rIG1kX2NsZWFudXAoKS4KLQotRnJpIE9jdCAyNSAwMDowMTowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGZpeF9uZXdfZXhwKTogVXNlIG1ha2VfZXhwcl9zeW1ib2wgdG8gYnVpbGQgYW4KLQlleHByZXNzaW9uIHN5bWJvbCBmb3IgYSBjb21wbGV4IGZpeHVwLgotCi1UaHUgT2N0IDI0IDE0OjMxOjA0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAodjg1MF9yZWxvY19wcmVmaXgpOiBTZXZlcmFsIGRpc2d1c3RpbmcKLQloYWNrcyB0byBpbXByb3ZlIHBhcnNpbmcgb2YgY29tcGxleCBoaSwgbG8sIHpkYSwgZXRjCi0JZXhwcmVzc2lvbnMuCi0JKG1kX2Fzc2VtYmxlKTogRG9uJ3QgZGVtYW5kIGFuZCBlYXQgYSB0cmFpbGluZyAnKScgYWZ0ZXIgZmluZGluZwotCWEgdjg1MCByZWxvY2F0aW9uIHByZWZpeC4gIFNpZ24gZXh0ZW5kIHRoZSBjb25zdGFudCBpbiBhCi0JQkZEX1JFTE9DX0xPMTYgZXhwcmVzc2lvbi4gIERvIGVhdCBhIHRyYWlsaW5nICcpJyBhZnRlciBhIGNvbXBsZXRlCi0Jb3BlcmFuZC4KLQkocGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTApOiBEb24ndCBlYXQgYSB0cmFpbGluZyAnKScgYWZ0ZXIKLQlmaW5kaW5nIGEgdjg1MCByZWxvY2F0aW9uIHByZWZpeC4KLQotCSogY29uZmlnL3RjLXY4NTAuaCAoVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKTogRGVmaW5lLgotCShUQ19DT05TX0ZJWF9ORVcpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy12ODUwLmMgKHBhcnNlX2NvbnNfZXhwcmVzc2lvbl92ODUwKTogTmV3IGZ1bmN0aW9uLgotCShjb25zX2ZpeF9uZXdfdjg1MCk6IExpa2V3aXNlLgotCi0JKiBjb25maWcvdGMtdjg1MC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBUREEgcmVsb2NzLgotCi1XZWQgT2N0IDIzIDE4OjIwOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogR2l2ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UKLQlmb3IgYW4gdW5rbm93biByZWxvY2F0aW9uIHR5cGUuCi0KLVdlZCBPY3QgMjMgMTY6MjE6MjggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgLndvcmQ7IGFsbG9jYXRlcwotCTQgYnl0ZXMgb2Ygc3BhY2UuCi0KLVR1ZSBPY3QgMjIgMjI6MDE6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBUREFPRkYgcmVsb2NzCi0JZGlmZmVyZW50bHkgZm9yIG1vdmVhICYgc3N0L3NsZCBpbnNucy4KLQotVHVlIE9jdCAyMiAxNzowOTozMiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKHBhcmFsbGVsX29rKTogRG9uJ3QgYWxsb3cgaWxsZWdhbCBjb21iaW5hdGlvbnMKLQlvZiBpbnN0cnVjdGlvbnMuCi0KLVR1ZSBPY3QgMjIgMTE6Mjg6MzkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmouaCAoc3RydWN0IGZvcm1hdF9vcHMpOiBBZGQgZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBmaWVsZC4KLQkqIGNvbmZpZy9vYmotbXVsdGkuaCAob2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiBEZWZpbmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmMgKGVjb2ZmX2Zvcm1hdF9vcHMpOiBJbml0aWFsaXplIG5ldwotCWZyb2JfZmlsZV9hZnRlcl9yZWxvY3MgZmllbGQuCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGZfZm9ybWF0X29wcyk6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLW1pcHMuYzogVW5kZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgYmVmb3JlCi0JaW5jbHVkaW5nIG9iai1lbGYuaC4KLQotTW9uIE9jdCAyMSAxMTozODozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGNvbnNfZml4X25ld19taXBzKTogT25seSB0cmVhdCA4IGJ5dGUgcmVsb2MKLQlzcGVjaWFsbHkgaWYgbm90IEVMRi4KLQkobWRfYXBwbHlfZml4KTogSGFuZGxlIEJGRF9SRUxPQ182NC4KLQkodGNfZ2VuX3JlbG9jKTogSGFuZGxlIEJGRF9SRUxPQ182NC4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXBwbHlfZml4Myk6IERvbid0IGluY3JlbWVudCB2YWx1ZSBmb3IgYSBQQwotIAlyZWxhdGl2ZSByZWxvYyB3aGVuIEJGRF9BU1NFTUJMRVIgYW5kIE9CSl9BT1VUIChtb3JlIHVnbHkgZ2FzCi0gCXJlbG9jIGhhY2tpbmcpLgotCi0JKiBjb25maWcvb2JqLWFvdXQuaCAoU19JU19ERUZJTkUpOiBub24gQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOgotCURvbid0IGNoZWNrIFNfR0VUX09USEVSLgotCi1GcmkgT2N0IDE4IDE0OjA2OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEFjY2VwdCBhbiBvZGQgZmxvYXRpbmcgcG9pbnQKLQlyZWdpc3RlciB3aXRoIGwucyBvciBzLnMuCi0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfcHNldWRvX3RhYmxlKTogVXNlIG9ial9hb3V0X3R5cGUgZm9yCi0JLnR5cGUgcHNldWRvLW9wLgotCShvYmpfYW91dF90eXBlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotVGh1IE9jdCAxNyAxNzo1NToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKE9CSlMpKTogRGVwZW5kIHVwb24gbGliaWJlcnR5LmguCi0KLVdlZCBPY3QgMTYgMTE6Mjg6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jICh2ODUwX3JlbG9jX3ByZWZpeCk6IFJlY29nbml6ZSB6ZGFvZmYsIHRkYW9mZgotCWFuZCBzZGFvZmYgZXhwcmVzc2lvbnMuCi0KLQkqIHdyaXRlLmMgKGZpeHVwX3NlZ21lbnQpOiBEb24ndCBhZGQgc3ltYm9sIHZhbHVlIHRvIGFkZGVuZCBpZgotCVRDX1Y4NTAgYW5kIE9CSl9FTEYuCi0JKiBjb25maWcvdGMtdjg1MC5oICh0Y19maXhfYWRqdXN0YWJsZSk6IERvbid0IGFkanVzdCBhbnkKLQlwYy1yZWxhdGl2ZSBmaXh1cHMuCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX3BjcmVsX2Zyb20pOiBVbmRvIHllc3RlcmRheSdzIGNoYW5nZXMuCi0JKG1kX3BjcmVsX2Zyb21fc2VjdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMTUgMjM6MTk6MDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9wY3JlbF9mcm9tKTogRGVsZXRlIHVudXNlZCBmdW5jdGlvbi4KLQkobWRfcGNyZWxfZnJvbV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCSogY29uZmlnL3RjLXY4NTAuaCAoTURfUENSRUxfRlJPTV9TRUNUSU9OKTogRGVmaW5lLgotCi1Nb24gT2N0IDE0IDEzOjU5OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IEFkZCBjYXN0IHRvIG9mZnNldFQgd2hlbiB1c2luZwotCWEgY29uc3RhbnQgd2l0aCAmfi4KLQotTW9uIE9jdCAxNCAxMToyNDoyOCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2JfZmlsZSk6IE1vdmUgRUNPRkYgZGVidWcgcHJvY2Vzc2luZyB0byAuLi4KLQkoZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MpOiAuLi4gaGVyZS4gIE5ldyBmdW5jdGlvbi4KLQkqIGNvbmZpZy9vYmotZWxmLmggKG9ial9mcm9tX2ZpbGVfYWZ0ZXJfcmVsb2NzKTogTmV3IG1hY3JvLgotCSogd3JpdGUuYyAod3JpdGVfb2JqZWN0X2ZpbGUpOiBDYWxsICpmcm9iX2FmdGVyX3JlbG9jcyBhZnRlciB0aGUKLQljYWxsIHRvIHdyaXRlX3JlbG9jcy4KLQotCSogY29uZmlnL3RjLWFscGhhLmM6IFVzZSBuZXcgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMIHJlbG9jLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAobG9hZF9leHByZXNzaW9uKTogRG9uJ3QgU0VUX1ZBTFVFIG9uIHRoZSBzZWN0aW9uCi0Jc3ltYm9sLCBhcyB0aGlzIG1lc3NlcyB1cCBsaW5raW5nLiAgSW5zdGVhZCwgZXhwYW5kIHRoZSByZWN1cnNpdmUgY2FsbAotCWlubGluZSBhbmQgY2hhbmdlIHVwIHRoZSBhcHByb3ByaWF0ZSBiaXRzIHRvIGdldCB0aGUgMHg4MDAwIG9mZnNldAotCWluIHRoZSByZWxvYyBhZGRlbmQuCi0KLVRodSBPY3QgMTAgMTc6MzA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAodGNfZml4X2FkanVzdGFibGUpOiBQZXJtaXQgdGhlIGRpZmZlcmVuY2Ugb2YKLQl0d28gc3ltYm9scyBpbiB0aGUgc2FtZSBzZWdtZW50IHRvIGJlIGFkanVzdGVkLgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IGdldCBjb25mdXNlZCBieSBDUFUtVkVORE9SLWxpbnV4LWdudS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE9jdCAxMCAxNzoyMjoxOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2luc2VydF9vcGVyYW5kKTogQ2hhbmdlIG1vc3Qgd2FybmluZ3MgaW50bwotCWVycm9ycy4KLQkocHBjX2VsZl92YWxpZGF0ZV9maXgpOiBEaXR0by4KLQkobWRfYXNzZW1ibGUpOiBEaXR0by4KLQkocHBjX3RjKTogRGl0dG8uCi0JKHBwY19wZV9zZWN0aW9uKTogRGl0dG8uCi0JKHBwY19mcm9iX3N5bWJvbCk6IERpdHRvLgotCi1UaHUgT2N0IDEwIDEyOjA1OjQ1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBQYXNzIGFuIGV4dHJhIHNoaWZ0IGNvdW50Ci0JdG8gbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCBiYXNlZCBvbiB0aGUgb3Bjb2RlIGZvcm1hdC4KLQkobW4xMDMwMF9pbnNlcnRfb3BlcmFuZCk6IEFjY2VwdCBhbmQgdXNlIGV4dHJhIHNoaWZ0IGNvdW50Ci0JcGFyYW1ldGVyLgotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFVzZSBGTVRfKiBtYWNyb3MgZm9yCi0JZm9ybWF0cyByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIGNvbnN0YW50cy4KLQotCSogY29uZmlnL3RjLW1uMTAzMDAuYyAobWRfYXNzZW1ibGUpOiBGb3JtYXQgRDUgaW5zdHJ1Y3Rpb25zCi0JYXJlIDcgYnl0ZXMgbG9uZy4gIFdyaXRlIG91dCBpbnN0cnVjdGlvbnMgaW4gYmlnLWVuZGlhbiBmb3JtYXQuCi0KLVR1ZSBPY3QgIDggMTQ6NTY6MTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtbW4xMDMwMC5jIChtZF9hc3NlbWJsZSk6IFR3ZWFrIGZ1cnRoZXIgc28KLQl0aGF0IGFsbCBpbnN0cnVjdGlvbnMgYXJlIHBhcnNlZCBjb3JyZWN0bHkuCi0KLVR1ZSBPY3QgIDggMTM6MDI6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcy5oOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IERvbid0IGRlY2xhcmUuCi0JKiBhcy5jOiBEb24ndCBpbmNsdWRlIGxpYmliZXJ0eS5oLgotCSogZXhwci5jLCByZWFkLmMsIHN0YWJzLmMsIGNvbmZpZy9vYmotY29mZi5jOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1taXBzLmM6IExpa2V3aXNlLgotCSogbWVzc2FnZXMuYzogTGlrZXdpc2UuCi0JKHhzdHJlcnJvcik6IERvbid0IGRlY2xhcmUuCi0JKiB4bWFsbG9jLmM6IFJlbW92ZS4KLQotTW9uIE9jdCAgNyAxNjo1MzoyMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEwMzAwLmggKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgUmVtb3ZlLgotCShzeXN0ZW1fcmVnaXN0ZXJzLCBjY19uYW1lcyk6IExpa2V3aXNlLgotCShhZGRyZXNzX3JlZ2lzdGVycywgZGF0YV9yZWdpc3RlcnMsIG90aGVyX3JlZ2lzdGVycyk6IE5ldyByZWdpc3RlcgotCWFycmF5cy4KLQkocmVnaXN0ZXJfbmFtZSwgc3lzdGVtX3JlZ2lzdGVyX25hbWUsIGNjX25hbWUpOiBSZW1vdmUuCi0JKG1uMTAzMDBfcmVsb2NfcHJlZml4KTogTGlrZXdpc2UuCi0JKGRhdGFfcmVnaXN0ZXJfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkoYWRkcmVzc19yZWdpc3Rlcl9uYW1lLCBvdGhlcl9yZWdpc3Rlcl9uYW1lKTogTGlrZXdpc2UuCi0JKG1kX2Fzc2VtYmxlKTogUm91Z2ggY3V0IGF0IHBhcnNpbmcgb3BlcmFuZHMuICBSZW1vdmUgbG90cyBvZgotCXVud2FudGVkIGNvZGUuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEaXNhYmxlIGZvciBub3cuCi0KLU1vbiBPY3QgIDcgMTE6Mzg6MzQgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHNlbGVjdF9jb250cm9sX3JlZ3MpOiBOZXcgZnVuY3Rpb24sIGV4dHJhY3RlZAotCW91dCBvZiBtNjhrX2luaXRfYWZ0ZXJfYXJncy4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBVc2UgaXQuCi0JKG1yaV9jaGlwKTogVXNlIGl0IGhlcmUgYXMgd2VsbCB0byB1cGRhdGUgc2V0IG9mIGFsbG93ZWQgY29udHJvbAotCXJlZ3MgZm9yIG1vdmVjLgotCi1Nb24gT2N0ICA3IDExOjI0OjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2JlZ2luKTogTmV3IGZ1bmN0aW9uLgotCShvYmpfZWxmX3NlY3Rpb24pOiBBZGQgdGhlIHNlY3Rpb24gc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0JKiBjb25maWcvb2JqLWVsZi5oIChvYmpfYmVnaW4pOiBEZWZpbmUuCi0JKGVsZl9iZWdpbik6IERlY2xhcmUuCi0JKiBhcy5jIChwZXJmb3JtX2FuX2Fzc2VtYmx5X3Bhc3MpOiBDYWxsIG9ial9iZWdpbiBpZiBpdCBpcwotCWRlZmluZWQuCi0KLUZyaSBPY3QgIDQgMTg6Mzc6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IFN1YnRyYWN0IHRoZSBzZWN0aW9uIGFkZHJlc3MKLQlmcm9tIGEgUEMgcmVsYXRpdmUgcmVsb2MgaWYgVENfTTY4Sy4KLQotVGh1IE9jdCAgMyAxNToxNTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBNYWtlIC51YWhhbGYsIC51YXdvcmQsIGFuZAotCS51YXh3b3JkIGF2YWlsYWJsZSBldmVuIGlmIG5vdCBPQkpfRUxGLgotCShtZF9hdG9mKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSB3b3JkUC4KLQotVGh1IE9jdCAgMyAwMDoxNjo1MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1tbjEweDAwLmMsIGNvbmZpZy90Yy1tbjEweDAwLmg6IE5ldyBmaWxlcwotCWZvciBNYXRzdXNoaXRhIE1OMTB4MDAgc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIG1uMTB4MDAtKi0qCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVdlZCBPY3QgIDIgMTU6NTQ6MDMgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG9iai1ldmF4Lmg6IG1vdmUgb3BlbnZtcyBkZWZpbml0aW9ucyBmcm9tIGhlcmUgdG8gdGMtYWxwaGEuYy4KLQkqIHRjLWFscGhhLmM6IGFkZCBzdXBwb3J0IGZvciB2bXNfY2FzZV9oYWNrIGxpa2UgaW4gdmF4L3Ztcy4KLQkobG9hZF9leHByZXNzaW9uKTogdHJhY2sgY2xvYmJlcmluZyBvZiBiYXNlIHJlZyBiZWZvcmUgam1wL2pzci4KLQkoc19hbHBoYV9maWxlKTogcGFzcyBjYXNlX2hhY2sgZmxhZ3MgYW5kIHNvdXJjZSBmaWxlbmFtZSB2aWEKLQlzeW1ib2wgdGFibGUgdG8gYmZkLgotCSogdGMtYWxwaGEuaCAoVENfQ09OU19GSVhfTkVXKTogZGVmaW5lCi0KLVR1ZSBPY3QgIDEgMTY6MTY6MDEgMTk5NiAgSm9lbCBTaGVycmlsbCAgPGpvZWxAb2FyY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2UgbWlwcy0qLWVsZiouCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBPY3QgIDEgMTI6Mzc6NDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfbWFjcm8pOiBXYXJuIGlmIGEgbWFjcm8gaGFzIHRoZSBzYW1lIG5hbWUgYXMgYQotCXBzZXVkby1vcC4KLQkoc19zcGFjZSk6IEluIG02OGsgTVJJIG1vZGUsIGFsaWduIHRvIGEgd29yZCBib3VuZGFyeS4KLQkqIG1hY3JvLmMgKGRlZmluZV9tYWNybyk6IEFkZCBuYW1lcCBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsCi0JY2FsbGVycy4KLQkqIG1hY3JvLmggKGRlZmluZV9tYWNybyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotCSogYXMuYyAoc2hvd191c2FnZSk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQkocGFyc2VfYXJncyk6IENoYW5nZSB2ZXJzaW9uIHByaW50aW5nIHRvIG1hdGNoIGN1cnJlbnQgR05VCi0Jc3RhbmRhcmRzLgotCSogZ2FzcC5jIChzaG93X3VzYWdlKTogUHJpbnQgYnVnIHJlcG9ydCBhZGRyZXNzLgotCShtYWluKTogQ2hhbmdlIHZlcnNpb24gcHJpbnRpbmcgdG8gbWF0Y2ggY3VycmVudCBHTlUgc3RhbmRhcmRzLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChpbml0X3RhYmxlKTogQ29ycmVjdCBhY2Nlc3MgY29udHJvbCB1bml0Ci0JcmVnaXN0ZXIgbnVtYmVycy4gIEZyb20gS2VuIFJvc2UgPHJvc2VAbmV0Y29tLmNvbT4uCi0KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgc29tZSBzdGF0aWMgZnVuY3Rpb24gcHJvdG90eXBlcy4KLSAJKGFscGhhX21hY3Jvcyk6IE1vdmUgdG8gdG9wIG9mIGZpbGUuICBNYWtlIHN0YXRpYy4KLQkoYWxwaGFfbnVtX21hY3Jvcyk6IE1vdmUgdG8gdG9wIG9mIGZpbGUuCi0KLVR1ZSBPY3QgIDEgMDk6MzY6MTkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdGMtdjg1MC5oOiAgRGVmaW5lIExPQ0FMX0xBQkVMIHRvIHJlY29nbmlzZSBfLkxfKiBzeW1ib2xzCi0JZ2VuZXJhdGVkIGJ5IERXQVJGLgotCi1TYXQgU2VwIDI4IDAzOjM4OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0X3N5bWJvbF90YWJsZSk6IFJlbW92ZSBib2d1cyBjb2RlIGluIEJGRDY0IGNhc2UsCi0JYW5kIGp1c3QgY2FsbCBzcHJpbnRmX3ZtYS4KLQotVGh1IFNlcCAyNiAxNjowNDoxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGV4cHIuYyAoZXhwcik6IENoYW5nZSA+Pj0gdG8gPj4gKGZpeCB0eXBvKS4gIChGcm9tIG1laXNzbmVyKS4KLQotVHVlIFNlcCAyNCAxOTowNTowOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZmxvYXRfY29ucyk6IENhbGwgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgaWYgaXQgaXMKLQlkZWZpbmVkLgotCi1UdWUgU2VwIDI0IDEyOjIyOjE4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9vcGVyYW5kKTogQ3JlYXRlZC4gIEFsbG93cyBvcGVyYW5kcyB0byAKLQlzdGFydCB3aXRoICcjJy4KLQkqIGNvbmZpZy90Yy1kMTB2LmggKG1kX29wZXJhbmQpOiBVbmRlZmluZWQuCi0KLU1vbiBTZXAgMjMgMTI6MTM6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChhZGRfZml4KTogVHJlYXQgYSB3aWR0aCBvZiAnMycgbGlrZSAnQicuCi0JKG1kX2Fzc2VtYmxlKTogQSBmaXh1cCB3aWR0aCBvZiAnMycgbWVhbnMgYSAxIGJ5dGUgcmVsb2MuCi0KLVRodSBTZXAgMTkgMTI6MjE6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkanVzdCBQQyByZWxhdGl2ZQotCXJlbG9jIGZvciB0aGUgaTk2MCBmb3IgYSByZWxvYyBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgVGhpcyB1bmRvZXMKLQlvbmUgb2YgdGhlIHR3byBjaGFuZ2VzIG1hZGUgQXVnIDE5LgotCi1XZWQgU2VwIDE4IDEyOjExOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogQm90aCB2ZXJzaW9uczogTW92ZSBDX1NUQVQKLQlzeW1ib2xzIHRvIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLgotCi1Nb24gU2VwIDE2IDExOjQxOjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXhwci5jIChleHByKTogQWx3YXlzIHVzZSB1bnNpZ25lZCByaWdodCBzaGlmdHMgZm9yID4+LgotCi1UaHUgU2VwIDEyIDEwOjI1OjQ1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jIChtZF9hcHBseV9maXgzKTogVXBkYXRlIHR3byB0aHVtYiBpbnN0cnVjdGlvbgotIAlzbG90cyB3aGVuIHByb2Nlc3NpbmcgQkwgZml4dXBzLgotCi0JKiBjb25maWcvdGMtYXJtLmMgKG91dHB1dF9pbnN0KTogRW5zdXJlIFRodW1iIEJMIGZpeHVwIGlzIG1hcmtlZAotIAlvbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBTZXAgMTEgMDA6MDk6MzUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogQ3JlYXRlIGFuIGV4cHJlc3Npb24gc3ltYm9sIGZvciBhIGNvbXBsZXgKLQlzdGFicyBleHByZXNzaW9uLCByYXRoZXIgdGhhbiBnaXZpbmcgYW4gZXJyb3IuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX25ld19maWxlKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UgYXJlIHN0aWxsIGluCi0JdGhlIHNhbWUgZmlsZS4KLQotVHVlIFNlcCAxMCAxMTo0NTozNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogRmlsbCBpbiB0aGUgdmFsdWUgZm9yIGEgY29uc3RhbnQKLQlqdW1wLCByYXRoZXIgdGhhbiBjcmVhdGluZyBhIHJlbG9jLgotCi1Nb24gU2VwICA5IDEwOjU3OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBEb24ndCBzd2FwIGFuIGluc3RydWN0aW9uIHdoaWNoCi0Jc2V0cyBhIGNvbmRpdGlvbiBjb2RlIHdpdGggYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyBhIGNvbmRpdGlvbgotCWNvZGUuCi0JKG1pcHNfaXApOiBJbiBjYXNlcyAnTicgYW5kICdNJywgbG9vayBmb3IgJGZjY04gcmF0aGVyIHRoYW4gYW4KLQlpbW1lZGlhdGUgdmFsdWUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX2JlZ2luKTogUmVjb2duaXplIHI1MDAwIGZvciBjcHUuCi0JKG1pcHNfaXApOiBHaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgaWYgdGhlIElTQSBsZXZlbCBpcyB3cm9uZy4KLQkobWRfcGFyc2Vfb3B0aW9uKTogUmVjb2duaXplIC1tY3B1PVt2XVtyXTUwMDAuCi0KLVNhdCBTZXAgIDcgMTM6MjU6NTUgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChDT1VOVF9UT1BfWkVST0VTKTogQWRkZWQgbWFjcm8gdG8gY291bnQKLSAJbGVhZGluZyB6ZXJvZXMuCi0JKGxvYWRfcmVnaXN0ZXIpOiBFbnN1cmUgaGkzMiBiaXRzIGFyZSBub3QgbG9zdCBkdXJpbmcgbG8zMmJpdAotIAlwcm9jZXNzaW5nLiBGaXggc2hpZnQgb2Zmc2V0IHRoYXQgd2FzIG92ZXJmbG93aW5nIGludG8gdGhlIG5leHQKLSAJaW5zdHJ1Y3Rpb24gZmllbGQuIEFkZCBjb2RlIHRvIGdlbmVyYXRlIHNob3J0ZXIgc2VxdWVuY2VzIGZvcgotIAljb25zdGFudHMgd2l0aCBhIHNpbmdsZSBjb250aWd1b3VzIHNlcWV1ZW5jZSBvZiBvbmVzLgotCi1GcmkgU2VwICA2IDE3OjA3OjEyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChkMTB2X2RvdF93b3JkKTogTmV3IGZ1bmN0aW9uIHRvIHN1cHBvcnQKLQkiQHdvcmQiIHdpdGggdGhlIHdvcmQgcHNldWRvLW9wLgotCShtZF9hcHBseV9maXgzKTogQ2xlYW51cCBhbmQgY2hhbmdlcyB0byBzdXBwb3J0IGNvcnJlY3Qgc2l6ZXMKLQlmb3IgMTYgYW5kIDE4LWJpdCByZWxvY3MuCi0KLUZyaSBTZXAgIDYgMTY6MDA6MjkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzcGFyYy0qLWFvdXQpOiBTZXQgYGVtJy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWcvdGUtc3BhcmNhb3V0Lmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLXNwYXJjLmggKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOKTogRGVmaW5lLgotCUlmZGVmIFRFX1NQQVJDT1VUIGRlZmluZSBUQVJHRVRfRk9STUFUIGFuZCBTUEFSQ19CSUVORElBTi4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChJTlNOX0JJR19FTkRJQU4pOiBOZXcgbWFjcm8uCi0JKFNQRUNJQUxfQ0FTRV97U0VUU1csU0VUWH0pOiBEZWZpbmUuCi0JKHtOT1AsT1IsRk1PVlMsU0VUSEksU0xMWCxTUkF9X0lOU04pOiBEZWZpbmUuCi0JKG1kX2JlZ2luKTogRGVsZXRlIHNldHRpbmcgb2YgYHRhcmdldF9iaWdfZW5kaWFuJy4KLQkob3V0cHV0X2luc24pOiBOZXcgZnVuY3Rpb24uCi0JKG1kX2Fzc2VtYmxlKTogUmV3cml0ZS4gIEFkZCBgc2V0eCcgc3VwcG9ydC4KLQkoc3BhcmNfaXApOiBIYW5kbGUgYDAnIG9wZXJhbmQgY2hhci4gIFJlY29nbml6ZSBzZXR1dywgc2V0c3csIHNldHgKLQlzcGVjaWFsIGNhc2VzLgotCShtZF9hdG9mKTogQWRkIGxpdHRsZSBlbmRpYW4gc3VwcG9ydC4KLQkobWRfbnVtYmVyX3RvX2NoYXJzKTogTGlrZXdpc2UuCi0JKG1kX2FwcGx5X2ZpeCk6IExpa2V3aXNlLgotCShtZF9sb25nb3B0cyk6IFJlY29nbml6ZSAtRUwsLUVCIGlmZGVmIFNQQVJDX0JJRU5ESUFOLgotCShtZF9wYXJzZV9vcHRpb24pOiBMaWtld2lzZS4KLQkobWRfc2hvd191c2FnZSk6IFByaW50IC1FTCwgLUVCIGlmZGVmIFNQQVJDX0JJRU5ESUFOLgotCi1UaHUgU2VwICA1IDEzOjQwOjI5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuYyAoZWNvZmZfbmV3X2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBlY29mZi5oIChlY29mZl9uZXdfZmlsZSk6IERlY2xhcmUuCi0JKiBjb25maWcvb2JqLWVjb2ZmLmggKG9ial9hcHBfZmlsZSk6IERlZmluZS4KLQotVGh1IFNlcCAgNSAxMzozOToyNSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGxvYWRfZXhwcmVzc2lvbik6IEJpYXMgdGhlIC5saXQ4IHNlY3Rpb24KLQlzeW1ib2wgYnkgMzJrIHNvIHRoYXQgb3VyIDE2LWJpdCBzaWduZWQgb2Zmc2V0IGNhbiBhZGRyZXNzIHRoZQotCWVudGlyZSBjaHVuay4gIFJlcG9ydGVkIGJ5IDxtYXR0QGxrZy5kZWMuY29tPi4KLQotV2VkIFNlcCAgNCAxMDoyMzoyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIHRtcC4KLQotV2VkIFNlcCAgNCAxMToyNDoyOSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBSZW1vdmUgdW5uZWNlc3NhcnkgY29kZSB0aGF0Ci0gCXdhcyBjYXVzaW5nIHRoZSBoaWdoIDMyYml0cyBvZiA2NGJpdCBjb25zdGFudHMgdG8gYmUgbG9zdC4KLQkKLVR1ZSBTZXAgIDMgMTM6NTI6NTYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEFkZGVkIGNoYW5nZXMgdG8gc3VwcG9ydCBmdW5jdGlvbgotCXBvaW50ZXJzIGFuZCAiQHdvcmQiIHN5bnRheC4KLQotVHVlIFNlcCAgMyAxMTo1NzoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmM6IFJlbW92ZSBjb21tZW50ZWQgb3V0IGFuZCAjaWYgMCdkIGNvZGUuCi0JKHY4NTBfcmVsb2NfcHJlZml4KTogUHJvdmlkZSBwcm90b3R5cGUuCi0JKHBvc3RmaXgsIGdldF9yZWxvYywgYnVpbGRfaW5zbik6IFJlbW92ZSBwcm90b3R5cGVzIGZvciBub25leGlzdGFudAotCWZ1bmN0aW9ucy4KLQkobWRfYmVnaW4sIG1kX2Fzc2VtYmxlLCBtZF9hcHBseV9maXgzKTogUmVtb3ZlIHVudXNlZCB2YXJpYWJsZXMuCi0JKG1kX2Fzc2VtYmxlKTogQWRkIGRlZmF1bHQgdG8gY2FzZSBzdGF0ZW1lbnQuCi0KLVNhdCBBdWcgMzEgMTY6MDM6MDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IENvbXB1dGUgc2l6ZSBvZiB0aGUgaW5zdHJjdGlvbgotCWZyb20gdGhlIG9wY29kZS4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXBwbHlfZml4Myk6IERvIHNpbXBsZSBieXRlLCBzaG9ydCBhbmQKLQl3b3JkIGZpeHVwcyB0b28uCi0KLUZyaSBBdWcgMzAgMjM6NTA6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hcHBseV9maXgzKTogVXNlIGxpdHRsZSBlbmRpYW4gZ2V0L3B1dAotCXJvdXRpbmVzIHRvIGZldGNoL3N0b3JlIHRoZSB1cGRhdGVkIGluc3RydWN0aW9uIGZyb20vdG8gbWVtb3J5LgotCSh2ODUwX2luc2VydF9vcGVyYW5kKTogSWYgdGhlIG9wZXJhbmQgaGFzIGEgc3BlY2lhbGl6ZWQgaW5zZXJ0Ci0Jcm91dGluZSwgY2FsbCBpdC4KLQotRnJpIEF1ZyAzMCAxODozNToyNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogQWxpZ24gY2FsbGluZyBjb252ZW50aW9uIHRvCi0gCWJlIGxpa2UgaWRlbnRpY2FsIGZ1bmN0aW9uIGZvdW5kIGluIHRjLXBwYy5jLgotCShnZXRfcmVsb2MpOiBSZW1vdmVkLgotCSh2ODUwX3JlbG9jX3ByZWZpeCk6IE5ldyBmdW5jdGlvbiwgcGFyc2UgbG8oKSwgaGkoKSBhbmQgaGkwKCkuCi0JKG1kX2Fzc2VtYmxlKTogZW1pdCBmaXh1cHMuCi0JKG1kX3BjcmVsX2Zyb20pOiByZW5hbWVkIGZyb20gbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBlbWl0IHByb3BlcgotIAlkaXNwbGFjZW1lbnQuCi0JKG1kX2FwcGx5X2ZpeDMpOiBoYW5kbGUgZml4dXBzL3JlbG9jcy4KLQkqIGNvbmZpZy90Yy12ODUwLmggKE1EX1BDUkVMX0ZST01fU0VDVElPTik6IFJlbW92ZWQgZGVmaW5pdGlvbi4KLQkKLUZyaSBBdWcgMzAgMTg6MTI6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIFNIIEVMRiBzdXBwb3J0LgotCSogY29uZmlndXJlLmluIChzaC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RjLXNoLmggKFRBUkdFVF9BUkNIKTogRGVmaW5lLgotCShXT1JLSU5HX0RPVF9XT1JEKTogRGVmaW5lLgotIAkoVENfQ09GRl9GSVgyUlRZUEUpOiBPbmx5IGRlZmluZSBpZiBPQkpfQ09GRi4KLQkoQkZEX0FSQ0gsIENPRkZfTUFHSUMsIFRDX0NPVU5UX1JFTE9DKTogTGlrZXdpc2UuCi0JKFRDX1JFTE9DX01BTkdMRSwgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKTogTGlrZXdpc2UuCi0JKERPX05PVF9TVFJJUCwgTkVFRF9GWF9SX1RZUEUsIFRDX0tFRVBfRlhfT0ZGU0VUKTogTGlrZXdpc2UuCi0JKFRDX0NPRkZfU0laRU1BQ0hERVAsIHRjX2Zyb2JfZmlsZSk6IExpa2V3aXNlLgotCShTVUJfU0VHTUVOVF9BTElHTik6IExpa2V3aXNlLgotCShSRUxPQ18zMik6IERvbid0IGRlZmluZS4KLQkodGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QpOiBEZWZpbmUgaWYgQkZEX0FTU0VNQkxFUi4KLQkodGFyZ2V0X2JpZ19lbmRpYW4pOiBEZWNsYXJlIGlmIE9CSl9FTEYuCi0JKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy90Yy1zaC5jOiBVc2UgQkZEIHJlbG9jIGNvZGVzIGluc3RlYWQgb2YgU0ggQ09GRiByZWxvYwotCW51bWJlcnMgdGhyb3VnaG91dC4KLQkodGNfY3Jhd2xfc3ltYm9sX2NoYWluKTogT25seSBkZWZpbmUgaWYgT0JKX0NPRkYuCi0JKHRjX2hlYWRlcnNfaG9vaywgdGNfY29mZl9zaXplbWFjaGRlcCk6IExpa2V3aXNlLgotCShzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzKTogRGVmaW5lLgotCShzaF9jb3VudF9yZWxvY3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBicm9rZW4gb3V0IG9mCi0Jc2hfZnJvYl9maWxlLiAgQWRkIEJGRF9BU1NFTUJMRVIgY29kZS4KLQkoc2hfZnJvYl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKHNoX2Zyb2JfZmlsZSk6IENhbGwgc2hfZnJvYl9zZWN0aW9uLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBJZiBCRkRfQVNTRU1CTEVSLCBjaGFuZ2UgdHlwZSBvZiBoZWFkZXJzLCBhbmQKLQljYWxsIHNlY3Rpb25fc3ltYm9sIHJhdGhlciB0aGFuIHNlZ19pbmZvIChzZWcpLT5kb3QuCi0JKG1kX3NlY3Rpb25fYWxpZ24pOiBBZGQgT0JKX0VMRiB2ZXJzaW9uLgotCShTV0lUQ0hfVEFCTEVfQ09OUyk6IERlZmluZS4KLQkoU1dJVENIX1RBQkxFKTogVXNlIFNXSVRDSF9UQUJMRV9DT05TLgotCShtZF9hcHBseV9maXgpOiBDaGFuZ2UgcGFyYW1ldGVyIHR5cGVzIGlmIEJGRF9BU1NFTUJMRVIuICBPbmx5Ci0JaGFuZGxlIGZ4X3JfdHlwZSA9PSAwIGlmIG5vdCBCRkRfQVNTRU1CTEVSLiAgUmV0dXJuIDAgaWYKLQlCRkRfQVNTRU1CTEVSLgotCShzdHJ1Y3QgcmVsb2NfbWFwKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCShjb2ZmX3JlbG9jX21hcCk6IExpa2V3aXNlLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IFVzZSBjb2ZmX3JlbG9jX21hcCB0byBjb252ZXJ0IGZ4X3JfdHlwZS4KLQkodGNfZ2VuX3JlbG9jKTogTmV3IGZ1bmN0aW9uIGlmIEJGRF9BU1NFTUJMRVIuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJZmRlZiBvdXQgZnhfd2hlcmUgdGVzdCB3aGljaCB0cmlnZ2VycwotCWluYXBwcm9wcmlhdGVseSBmb3IgU0ggRUxGLgotCSh3cml0ZV9vYmplY3RfZmlsZSk6IENhbGwgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgYW5kCi0Jb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0IGlmIHRoZXkgYXJlIGRlZmluZWQuCi0KLQkqIHdyaXRlLmMgKHdyaXRlX29iamVjdF9maWxlKTogVXNlIEJGRF9SRUxPQ18xNiwgbm90Ci0JQkZEX1JFTE9DX05PTkUsIHdoZW4gY2FsbGluZyBmaXhfbmV3X2V4cCBmb3IgYSBicm9rZW4gd29yZC4KLQotCSogcmVhZC5jIChlbWl0X2V4cHIpOiBGaXggY29udmVyc2lvbiBvZiBieXRlIGNvdW50IHRvIEJGRCByZWxvYwotCWNvZGUuCi0KLUZyaSBBdWcgMzAgMTQ6NDc6MzggMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogRml4IHByb2JsZW0gd2l0aCBjYWxjdWxhdGluZyAKLQlicmFuY2ggc2l6ZXMgaW4gYWNyb3NzIHNlY3Rpb25zLgotCi1GcmkgQXVnIDMwIDAwOjQ0OjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLTg1MC5jIChtZF9hc3NlbWJsZSk6IEhhbmRsZSBoaSgpIGNvcnJlY3RseS4gIEhhbmRsZQotCWhpMCgpIHRvby4KLQotV2VkIEF1ZyAyOCAyMzoxMTowOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy12ODUwLmMgKG1kX2JlZ2luKTogRGVhbCB3aXRoIGVuZCBvZiBvcGNvZGUKLQl0YWJsZSBtYXJrZXIuCi0KLVdlZCBBdWcgMjggMTk6MjA6MDQgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmMgKGZpbmRfb3Bjb2RlKTogRml4IGEgYnVnIHdoaWNoIGNvdWxkIGdlbmVyYXRlCi0JdGhlIHdyb25nIG9wY29kZSBmb3IgY2FzZXMgbGlrZSBzdDJ3IHdoZXJlIHRoZXJlIGFyZSBtYW55IGZvcm1zCi0Jb2YgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uCi0KLVR1ZSBBdWcgMjcgMTM6NTM6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBJZiBtZF9wYXJzZV9uYW1lIGlzIGRlZmluZWQsIGNhbGwgaXQgYmVmb3JlCi0JY2FsbGluZyBzeW1ib2xfZmluZF9vcl9tYWtlLgotCSogY29uZmlnL3RjLXBwYy5oIChtZF9wYXJzZV9uYW1lKTogRGVmaW5lLgotCShwcGNfcGFyc2VfbmFtZSk6IERlY2xhcmUuCi0JKiBjb25maWcvdGMtcHBjLmMgKHJlZ19uYW1lX3NlYXJjaCk6IEFkZCByZWdzIGFuZCByZWdjb3VudAotCXBhcmFtZXRlcnMuCi0JKHJlZ2lzdGVyX25hbWUpOiBVcGRhdGUgY2FsbCB0byByZWdfbmFtZV9zZWFyY2guCi0JKGNyX29wZXJhbmQpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjcl9uYW1lcyk6IE5ldyBzdGF0aWMgY29uc3QgYXJyYXkuCi0JKHBwY19wYXJzZV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCShtZF9hc3NlbWJsZSk6IElmIFBQQ19PUEVSQU5EX0NSIGlzIHNldCBpbiB0aGUgb3BlcmFuZCBmbGFncywgc2V0Ci0JY3Jfb3BlcmFuZCBiZWZvcmUgY2FsbGluZyBleHByZXNzaW9uLgotCi1UdWUgQXVnIDI3IDA5OjA1OjUwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogQWRkIG5ldyBhcmd1bWVudCB0bwotCWhwcGFfZ2VuX3JlbG9jX3R5cGUgY2FsbC4KLQotTW9uIEF1ZyAyNiAxODoyNDo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4ZWQgIi53b3JkIi4gIEZpeGVkIHByb2JsZW0gd2l0aCByYW5nZSBjaGVja2luZwotCW9uIGFkZHJlc3Nlcy4gIEltcHJvdmVkIGVycm9yIG1lc3NhZ2VzLgotCSogZG9jL2MtZDEwdi50ZXhpOiBBZGRlZCBkb2NzIGZvciByZWdpc3RlciBwYWlycy4KLQotTW9uIEF1ZyAyNiAxMzozOToyNyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAocGFyYWxsZWxfb2spOiBGaXggYnVnIGluIHBhcmFsbGVsIAotCWNoZWNraW5nIGNvZGUuCi0KLU1vbiBBdWcgMjYgMTQ6Mzg6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChpbml0X2ZpbGUpOiBJbml0aWFsaXplIGZNZXJnZSB0byAxLgotCShhZGRfZmlsZSk6IFJlc3RvcmUgb2xkIGZpbGUgbWVyZ2luZyBjb2RlLCBidXQgb25seSBtZXJnZSBmaWxlcyBpZgotCWZNZXJnZSBpcyBzZXQuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9sb2MpOiBDbGVhciBmTWVyZ2UgZmllbGQgb2YgY3VycmVudCBmaWxlLgotCShlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vKTogTGlrZXdpc2UuCi0KLUZyaSBBdWcgMjMgMTE6NDA6NDcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLWQxMHYudGV4aTogRml4IHR5cG8uIAotCi1GcmkgQXVnIDIzIDEwOjQxOjMyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBDb3JyZWN0IGJpdCBtYXNraW5nIGZvcgotCWhpIGFuZCBsbyBleHByZXNzaW9ucy4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBSb3VnaCBjdXQgYXQgZGVtYW5kaW5nCi0JImVwIiBvciAicjMwIiBpbiBzc3QgYW5kIHNsZCBpbnN0cnVjdGlvbnMuCi0JKG1kX2FwcGx5X2ZpeDMpOiBEb24ndCBhYm9ydC4gIEp1c3Qgd2FybiB0aGF0IHdlIGRvbid0Ci0JaGF2ZSByZWxvY3MgeWV0LgotCi0JKiBjb25maWcvdGMtdjg1MC5jIChDQ19OQU1FX0NOVCk6IERlZmluZS4KLQkoY2NfbmFtZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgVjg1MF9PUEVSQU5EX0NDIGNvcnJlY3RseS4KLQotCSogY29uZmlnL3RjLXY4NTAuYyAobWRfYXNzZW1ibGUpOiBEb24ndCBmb3JnZXQgdG8gaW5pdGlhbGl6ZQotCSJpbnNuIiEKLQotCSogY29uZmlnL3RjLXY4NTAuYyAocmVnX25hbWVfc2VhcmNoKTogR2VuZXJhbGl6ZSB0byBzZWFyY2gKLQlhbnkgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUuCi0JKHJlZ2lzdGVyX25hbWUpOiBQYXNzIGFwcHJvcHJpYXRlIHRhYmxlIGFuZCBzaXplIHRvIHJlZ19uYW1lX3NlYXJjaC4KLQkoc3lzdGVtX3JlZ2lzdGVyX25hbWUpOiBOZXcgZnVuY3Rpb24uCi0JKFNZU1JFR19OQU1FX0NOVCk6IERlZmluZS4KLQkobWRfYXNzZW1ibGUpOiBIYW5kbGUgb3BlcmFuZHMgd2hpY2ggYXJlIHN5c3RlbSByZWdpc3RlcnMuCi0JCi0JKiBjb25maWcvdGMtdjg1MC5jIChtZF9hc3NlbWJsZSk6IElmIHdlIGZpbmQgYSByZWdpc3RlciwgYnV0IHRoZQotCW9wY29kZSBkb2Vzbid0IHdhbnQgYSByZWdpc3RlciwgdGhlbiB3ZSBkb24ndCBoYXZlIGEgbWF0Y2guCi0JKG1kX2Fzc2VtYmxlKTogR2V0IHNpemUgb2YgdGhlIGluc3RydWN0aW9uIGZyb20gdGhlIG9wY29kZSB0YWJsZS4KLQotVGh1IEF1ZyAyMiAxMDoyMDozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuCi0JKGFzLm5ldyk6IFVzZSAkKEhMREVOVikuCi0KLQkqIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZik6IEF2b2lkIGEgZGl2aXNpb24gYnkgemVybyBlcnJvcgotCWlmIGFuIGFycmF5IGRpbWVuc2lvbiBpcyBub3Qga25vd24uCi0KLVRodSBBdWcgMjIgMTA6NTA6MDAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeCBhIHJlbG9jIGJ1ZyBjYXVzZWQgYnkgbXkgbGFzdCBjaGFuZ2UuIAotCSogZG9jL2MtZDEwdi50ZXhpOiBDbGVhbnVwLgotCQotVHVlIEF1ZyAyMCAxNToxNToxNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXY4NTAuYzogTmV3IGZpbGUuCi0JKiBjb25maWcvdGMtdjg1MC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZSAodjg1MC0qLWVsZik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUuaW4gKHY4NTAtKi1lbGYpOiBOZXcgdGFyZ2V0LgotCQotV2VkIEF1ZyAyMSAxNTo1MDo1NCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZG9jL2MtZDEwdi50ZXhpOiBOZXcgZmlsZS4KLQkqIGRvYy9hbGwudGV4aTogQWRkZWQgRDEwViBzdHVmZi4KLQkqIGRvYy9hcy50ZXhpbmZvOiBBZGRlZCBEMTBWIHN0dWZmLgotCi1UdWUgQXVnIDIwIDE0OjEwOjAyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBbGwgcmVmZXJlbmNlcyB0byBkZWZpbmVkIHN5bWJvbHMgc2hvdWxkCi0gCW5vdyB1c2UgdGhlIG9wdGltYWwgaW5zdHJ1Y3Rpb24uICAuZmxvYXQgYW5kIC5kb3VibGUgbm93IHdvcmsuIAotCi1Nb24gQXVnIDE5IDE0OjQxOjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKGZpeHVwX3NlZ21lbnQpOiBBZGp1c3QgUEMgcmVsYXRpdmUgcmVsb2MgYnkKLQlzZWN0aW9uIGFkZHJlc3MgZm9yIHRoZSBpOTYwIGFzIGlzIGRvbmUgZm9yIHRoZSBpMzg2LgotCi1UaHUgQXVnIDE1IDE2OjM3OjU5IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIHdpbGRjYXJkcyBmb3IgY29uZmlnIG1hdGNoaW5nLCBhZGQgbWlwcy0qLSoKLQljYXNlLCBmb3J3YXJkLWluY2x1ZGUgYmZkL2VsZi1iZmQuaC4KLQotVGh1IEF1ZyAxNSAxMzoyNDozMCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIG9wY29kZQotICAgICAgICB0YWJsZSB0byBoZWxwIGRldGVybWluaW5lIHdoaWNoIGluc3RydWN0aW9ucyBjYW4gYmUgZG9uZQotICAgICAgICBpbiBwYXJhbGxlbC4gCi0KLVRodSBBdWcgMTUgMTc6MDE6MzEgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtYXJtLmM6IE1ham9yIGNoYW5nZXMgdG8gYWRkIFRodW1iIHN1cHBvcnQsIHdpdGggbG90cwotIAlvZiBjaGFuZ2UgaW5wdXQgZnJvbSA8cmVhcm5zaGFAYXJtbHRkLmNvLnVrPi4KLQlSZXZlcnRlZCB0byBJTlNOX1NJWkUgbWFjcm8sIHJhdGhlciB0aGFuIGluc25fc2l6ZSB2YXJpYWJsZS4KLQkoaW5zbnMpOiBBZGRlZCBBUk0gImJ4IiBpbnN0cnVjdGlvbiBzdXBwb3J0LgotCSh0aW5zbnMpOiBBZGRlZCBUaHVtYiBpbnN0cnVjdGlvbiBkZWZpbml0aW9uIHN0cnVjdHVyZS4KLQkoYXJtX3RvcHNfaHNoKTogQWRkZWQgaGFzaCBzdHJ1Y3R1cmUgZm9yIFRodW1iIG9wY29kZXMuCi0JKG1kX3BzZXVkb190YWJsZSk6IEFkZGVkICIuYXJtIiwgIi50aHVtYiIgYW5kICIuY29kZSIgcHNldWRvLW9wcy4KLQkob3Bjb2RlX3NlbGVjdCxzX2FybSxzX3RodW1iLHNfY29kZSk6IEFkZGVkLgotCShkZWNvZGVfc2hpZnQpOiBBbGxvdyB1cHBlci1jYXNlIFJSWC4KLQkoZG9fbGRzdCk6IFNpbXBsZXIgaGFsZndvcmQgc3VwcG9ydC4KLQkoZG9fbGRtc3RtKTogSW1wcm92ZWQuCi0JKHJlZ19saXN0LCBkb19ieCwgdGh1bWJfcmVnLCB0aHVtYl9hZGRfc3ViLCB0aHVtYl9zaGlmdCwKLSAJdGh1bWJfbW92X2NvbXBhcmUsIHRodW1iX2xvYWRfc3RvcmUsIGRvX3RfYXJpdCwgZG9fdF9hZGQsCi0gCWRvX3RfYXNyLCBkb190X2JyYW5jaCwgZG9fdF9ieCwgZG9fdF9jb21wYXJlLCBkb190X2xkbXN0bSwKLSAJZG9fdF9sZHJiLCBkb190X2xkcmgsIGRvX3RfbGRzLCBkb190X2xzbCwgZG9fdF9sc3IsIGRvX3RfbW92LAotIAlkb190X3B1c2hfcG9wLCBkb190X3N0ciwgZG9fdF9zdHJiLCBkb190X3N0cmgsIGRvX3Rfc3ViLCBkb190X3N3aSwKLSAJZG9fdF9hZHIpOiBBZGRlZC4KLQkobWRfYXBwbHlfZml4Myk6IEFkZCBzdXBwb3J0IGZvciBCRkRfUkVMT0NfQVJNX1RIVU1CXyogcmVsb2NhdGlvbnMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXRodW1iLgotCShtZF9zaG93X3VzYWdlKTogVXBkYXRlZCB0byByZWZsZWN0IG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uLgotCShhcm1fZGF0YV9pbl9jb2RlLCBhcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lKTogQWRkZWQuCi0JKiBjb25maWcvdGMtYXJtLmg6IFByb3ZpZGUgVENfRklYX1RZUEUgdG8gYWxsb3cgcHJpdmF0ZSBBUk0KLSAJZnJhZ21lbnQgaW5mb3JtYXRpb24gdG8gYmUgaGVsZC4KLQotVGh1IEF1ZyAxNSAxNjoxMjowMCAxOTk2ICBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQkqIHRjLWFybS5jIChtZF9hcHBseV9maXgzKTogQWxzbyBzZXQgZml4UC0+ZnhfZG9uZSBpZiBmeF9hZGRzeSBpcyAKLQlub24tbnVsbCwgYnV0IGlzIGEgY29uc3RhbnQuCi0JKGZpeF9uZXdfYXJtKTogQ2FsbCBtYWtlX2V4cHJfc3ltYm9sIHRvIG1ha2UgdGhlIGV4cHJlc3Npb24gc3ltYm9sCi0Jc28gdGhhdCBlcnJvciByZXBvcnRpbmcgd2lsbCB3b3JrIGNvcnJlY3RseS4KLQotV2VkIEF1ZyAxNCAxMDozNzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKHRjX2kzODZfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QgcmVsb2NzCi0JYWdhaW5zdCB3ZWFrIHN5bWJvbHMuCi0KLVR1ZSBBdWcgMTMgMTc6Mzk6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmggKFRDX0ZPUkNFX1JFTE9DVElPTik6IERlZmluZSBpZiBPQkpfWENPRkYuCi0JKHBwY19mb3JjZV9yZWxvY2F0aW9uKTogRGVjbGFyZSBpZiBPQkpfWENPRkYuCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19mb3JjZV9yZWxvY2F0aW9uKTogTmV3IGZ1bmN0aW9uIGlmCi0JT0JKX1hDT0ZGLgotCi1Nb24gQXVnIDEyIDE2OjQ5OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuaCAoQllURV9PUkRFUik6IERvbid0IGRlZmluZS4gIE5vIGxvbmdlciB1c2VkLgotCi1GcmkgQXVnICA5IDE3OjQ4OjI4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBGaXggcHJvYmxlbSB3aXRoIHJlbG9jcy4gCi0KLUZyaSBBdWcgIDkgMTQ6MTY6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBJZiBub3QgQkZEX0FTU0VNQkxFUiwgYWx3YXlzIGFsaWduCi0Jd2l0aCBub3BzIGlmIG5vdCBpbiBkYXRhX3NlY3Rpb24gb3IgYnNzX3NlY3Rpb24uCi0KLVRodSBBdWcgIDggMTI6MzI6NTYgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQlBZGQgc3VwcG9ydCBmb3Igb3BlblZNUy9BbHBoYS4KLQkqIGFzLmggKFBSSU5URl9MSUtFKTogRG9uJ3QgZGVmaW5lIGlmIFZNUywgZm9yIG5vdy4KLQkqIGNvbmZpZy9vYmotZXZheC5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotZXZheC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBBZGQgc3VwcG9ydCBmb3IgRVZBWCBmb3JtYXQgaWYgT0JKX0VWQVggaXMKLQlkZWZpbmVkLgotCSogY29uZmlnL3RjLWFscGhhLmg6IEFkZCBzdXBwb3J0IGZvciBFVkFYIGZvcm1hdCBpZiBPQkpfRVZBWCBpcwotCWRlZmluZWQuICBBZGQgY2FzZSBmb3IgYmZkX3RhcmdldF9ldmF4X2ZsYXZvdXIuCi0JKiBjb25maWcvdm1zLWEtY29uZi5oOiBOZXcgZmlsZS4KLQkqIGNvbmYtYS1nYXMuY29tOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHRhcmdldCBhbHBoYS0qLSp2bXMqLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogbWFrZWZpbGUudm1zOiBOZXcgZmlsZS4KLQkqIHJlYWQuYyAoc19sY29tbSk6IEFsaWduIGJzc19zZWcgb24gOCBieXRlIGJvdW5kYXJ5IGlmIE9CSl9FVkFYLgotCURvbid0IGNhbGwgZmZzIG9uIG9wZW5WTVMvQWxwaGEuCi0KLVdlZCBBdWcgIDcgMTQ6MTk6MDMgMTk5NiAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogY29uZmlndXJlLmluOiBNYWtlIEdBU19DSEVDS19ERUNMX05FRURFRCBpbmNsdWRlIDxzdHJpbmcuaD4gb3IKLQk8c3RyaW5ncy5oPiBpZiB0aGV5IGV4aXN0LiAgQ2FsbCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQgb24gc3Ryc3RyCi0JYW5kIHNicmsuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUik6IE5ldyBtYWNyby4KLQkoTkVFRF9ERUNMQVJBVElPTl9TQlJLKTogTmV3IG1hY3JvLgotCSogY29uZmlndXJlLCBjb25mLmluOiBSZWJ1aWxkLgotCSogYXMuaDogT25seSBpbmNsdWRlIDxzdHJpbmdzLmg+IGlmIEhBVkVfU1RSSU5HU19ILgotCShzdHJzdHIpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSLgotCSogYXMuYzogSWYgSEFWRV9TQlJLIGFuZCBORUVEX0RFQ0xBUkFUSU9OX1NCUkssIGRlY2xhcmUgc2Jyay4KLQotV2VkIEF1ZyAgNyAxMTo1MDoyNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBIYW5kbGUgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24KLQlieSBhIGNvbnN0YW50IGJlZm9yZSBlbnRlcmluZyB0aGUgbWFpbiBzd2l0Y2guICBSZWplY3QgYXR0ZW1wdHMgdG8KLQlhcHBseSBhbiBhcml0aG1ldGljIGZ1bmN0aW9uIHRvIG5vbi1hYnNvbHV0ZSBzeW1ib2xzLCBleGNlcHQgZm9yCi0JdGhlIHNwZWNpYWwgY2FzZSBvZiBzdWJ0cmFjdGlvbiBvZiB0d28gc3ltYm9scyBpbiB0aGUgc2FtZQotCXNlY3Rpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEbyBhbGlnbiBpZiBPQkpfRUxGLCBidXQKLQlub3QgdG8gbW9yZSB0aGFuIGEgMTYgYnl0ZSBib3VuZGFyeS4KLQotCSogY29uZmlnL3RjLWkzODYuYyAodGNfZ2VuX3JlbG9jKTogQWNjZXB0IGFsbCByZWxvY3M7IHJlbW92ZQotCSNpZm5kZWYgT0JKX0VMRiBsaW5lcy4gIEZyb20gRXJpYyBWYWxldHRlIDx2YWxldHRlQGNyZi5jYW5vbi5mcj4uCi0JKHRjX2dlbl9yZWxvYyk6IElmIG91dCBvZiBtZW1vcnkgY2FsbCBhc19mYXRhbCByYXRoZXIgdGhhbgotCWFzc2VydC4gIElmIG5vIGhvd3RvIGZvdW5kLCBjYWxsIGFzX2JhZF93aGVyZSByYXRoZXIgdGhhbgotCWFzX2ZhdGFsLiAgQ2hhbmdlIHRoZSBlcnJvciBtZXNzYWdlIHNsaWdodGx5LiAgU2V0IGhvd3RvIHRvIGEKLQlub24tTlVMTCB2YWx1ZSBpbiBvcmRlciB0byBrZWVwIGdvaW5nLgotCi1UdWUgQXVnICA2IDEyOjU4OjAzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBBZGRlZCBjb2RlIHRvIHN1cHBvcnQgMzItYml0IGZpeHVwcyBmb3Igc3RhYnMuCi0KLVR1ZSBBdWcgIDYgMTE6MTU6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X3NwZWNpZmljKTogTmV3IG9wZXJhbmQgInNpemUiIGRlcml2ZWQKLQlmcm9tICIuYiIsICIudyIgYW5kICIubCIgZXh0ZW5zaW9ucy4gIEFsbCBjYWxsZXJzIGNoYW5nZWQuICBJZgotCXRoZSBiYXNlIGluc3RydWN0aW9uIGhhcyBubyBvcGVyYW5kcywgdGhlbiB1c2UgdGhlIHNpemUgdG8KLQlkZXRlcm1pbmUgd2hpY2ggc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gdG8gdXNlLgotCi1Nb24gQXVnICA1IDE0OjIxOjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAobWVtX2ZtdCk6IENhbGwgcGFyc2VfZXhwciBiZWZvcmUgZW1pdC4KLQotRnJpIEF1ZyAgMiAxMToyMzozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1kX3NlY3Rpb25fYWxpZ24pOiBEb24ndCBjaGFuZ2UgYWRkciBpZgotCU9CSl9FTEYuCi0KLVRodSBBdWcgIDEgMjM6NTE6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jOiBSZXZlcnQgeWVzdGVyZGF5J3MgY2hhbmdlcy4KLQkKLVdlZCBKdWwgMzEgMTQ6NDY6MTEgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IERpc2FibGUgcmFuZ2UgY2hlY2tpbmcgb24gMTYtYml0IHZhbHVlcy4KLQotV2VkIEp1bCAzMSAxNjoyNzoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBTZXQgb2tfYXJjaCBmb3IgZXZlcnkgaW5zdHJ1Y3Rpb24sCi0Jbm90IGp1c3QgdGhlIG9uZXMgdGhhdCBkb24ndCBtYXRjaC4KLQotV2VkIEp1bCAzMSAxMTo0NToxNSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogRml4ZWQgYnVncyBpbiBzaG9ydCByZWxvY3MgYW5kIHJhbmdlIGNoZWNraW5nLgotCi1XZWQgSnVsIDMxIDE1OjQxOjQyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLWFybS5jOiBDaGFuZ2VkIElOU05fU0laRSB0byB2YXJpYWJsZSBpbnNuX3NpemUsIGFzCi0gCXByZS1jdXJzb3IgdG8gYWRkaW5nIFRodW1iIHN1cHBvcnQuIEFsc28gYWRkZWQgY3B1X3ZhcmlhbnQgZmxhZwotIAlpbmZvcm1hdGlvbiB0byBlYWNoIG9mIHRoZSBhc21fZmxnIHN0cnVjdHVyZXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IFVwZGF0ZWQgQVJNNyBwYXJzaW5nIHRvIGFsbG93ICd0JyBmb3IKLSAJdGh1bWIvaGFsZndvcmQgc3VwcG9ydCwgYXN3ZWxsIGFzICdtJyBmb3IgbG9uZyBtdWx0aXBseS4KLQkobWRfc2hvd191c2FnZSk6IFVwZGF0ZWQgaGVscCBtZXNzYWdlLgotCShtZF9hc3NlbWJsZSk6IENoZWNrIHRoYXQgaW5zdHJ1Y3Rpb24gZmxhZ3MgYXJlIGFwcGxpY2F0ZWQgdG8gdGhlCi0gCWN1cnJlbnQgY3B1IHZhcmlhbnQuCi0JKG1kX2FwcGx5X2ZpeDMsIHRjX2dlbl9yZWxvYyk6IEFkZCBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04IGFuZAotIAlCRkRfUkVMT0NfQVJNX0hXTElURVJBTCByZWxvY2F0aW9uIHN1cHBvcnQgZm9yIG5ldyBoYWxmd29yZCBhbmQKLSAJc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMuCi0JKGRvX2xkc3QpOiBHZW5lcmF0ZSBoYWxmd29yZCBhbmQgc2lnbmV4dGVuc2lvbiB2YXJpYW50cyBpZgotIAltbmVtb25pYyBmbGFncyBtYXRjaC4KLQkobGRzdF9leHRlbmQpOiBEbyBub3QgYWxsb3cgc2hpZnRzIGluIHRoZSBvZmZzZXQgZmllbGQgb2YgaGFsZndvcmQKLSAJb3Igc2lnbmV4dGVuc2lvbiBpbnN0cnVjdGlvbnMuCi0JKHZhbGlkYXRlX29mZnNldF9pbW0pOiBQcm92aWRlIGNoZWNrIG9uIGhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uCi0gCWltbWVkaWF0ZSByYW5nZS4KLQkoYWRkX3RvX2xpdF9wb29sKTogTWVyZ2UgaWRlbnRpY2FsIGxpdGVyYWwgcG9vbCB2YWx1ZXMuCi0KLVR1ZSBKdWwgMzAgMTQ6Mjg6MjMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChzZWxlY3Rvcl90YWJsZSk6IEFkZCAnRScgc2VsZWN0b3IuCi0JKGNvbnNfZml4X25ld19ocHBhKTogRG9uJ3QgY29rZSBvbiBlX2VzZWwuCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgUl9DT01QMiB3aGVuIHVzZWQKLQl0byBoZWxwIGdlbmVyYXRlIGV4Y2VwdGlvbiBoYW5kbGluZyB0YWJsZXMuCi0JKG1kX2FwcGx5X2ZpeCk6IERvbid0IHRyeSB0byBhcHBseSBmaXh1cHMgd2l0aCBhbiBlX2VzZWwKLQlzZWxlY3Rvci4KLQkoaHBwYV9maXhfYWRqdXN0YWJsZSk6IEZpeHVwcyB3aXRoIGVfZXNlbCBzZWxlY3RvcnMKLQlhcmUgbm90IGFkanVzdGFibGUuCi0KLVR1ZSBKdWwgMzAgMTU6NTE6NDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkIDJieXRlLCA0Ynl0ZSwgYW5kIDhieXRlCi0JcHNldWRvLW9wcy4KLQotRnJpIEp1bCAyNiAxMTo0MzowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYzogQWRkZWQgbG90cyBvZiBlcnJvciBjaGVja2luZy4gIEFkZGVkIGhhY2tzCi0JdG8gc3VwcG9ydCBhY2N1bXVsYXRvciBzaGlmdHMuCi0JCi1GcmkgSnVsIDI2IDExOjU2OjA4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3ltYm9scy5jIChTX1NFVF9FWFRFUk5BTCk6IExldCAud2VhayBvdmVycmlkZS4KLQkoU19DTEVBUl9FWFRFUk5BTCk6IExpa2V3aXNlLgotCShTX1NFVF9XRUFLKTogUmVtb3ZlIGVycm9yOyBqdXN0IGxldCAud2VhayBvdmVycmlkZS4KLQotVGh1IEp1bCAyNSAxNToyMjo1MSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWQxMHYuYyAobWRfYXNzZW1ibGUpOiBOb3cgaGFuZGxlcyBtdWx0aWxpbmUKLQlpbnN0cnVjdGlvbnMuCi0KLVRodSBKdWwgMjUgMTI6MDM6MzMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IEZpeCBwYWNrYWdpbmcgYnVnLiBBZGRlZCByYW5nZSBjaGVja2luZy4KLQlBZGRlZCBrbHVkZ2UgZm9yIGRpdnMgaW5zdHJ1Y3Rpb24uICBGaXhlZCBtaW5vciBwcm9ibGVtIHdpdGgKLQltdWx0aXBsZSB0ZXh0IHNlY3Rpb25zLgotCSogY29uZmlnL3RjLWQxMHYuaCAoZDEwdl9jbGVhbnVwKTogQ2hhbmdlIHByb3RvdHlwZS4gCi0JCi1UdWUgSnVsIDIzIDEwOjQ5OjM2IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jIChtZF9hcHBseV9maXgzKTogRml4IGFsbCBpbnN0cnVjdGlvbgotCWFkZHJlc3NlcyB0byBiZSByaWdodC1zaGlmdGVkIGJ5IDIuCi0KLU1vbiBKdWwgMjIgMTE6MzI6MzYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1kMTB2LmM6IE1hbnkgY2hhbmdlcyB0byBnZXQgcmVsb2NzIHdvcmtpbmcuCi0gCShyZWdpc3Rlcl9uYW1lKTogTm8gbG9uZ2VyIGNyZWF0ZXMgYSBzeW1ib2wgZm9yIHJlZ2lzdGVyIG5hbWVzLgotIAkocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogbW92ZWQgdG8gb3Bjb2Rlcy9kMTB2LW9wYy5jLgotCShkMTB2X2luc2VydF9vcGVyYW5kKTogTm93IHdvcmtzIGNvcnJlY3RseSBmb3IgZWl0aGVyIGNvbnRhaW5lci4KLQkqIGNvbmZpZy90Yy1kMTB2LmggKGQxMHZfY2xlYW51cCk6IERlY2xhcmUuIAotCQotTW9uIEp1bCAyMiAxNDowMTozMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHRjX2dlbl9yZWxvYyk6IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MgYW5kCi0JQkZEX1JFTE9DX1BDUkVMX0xPMTYgYXJlIGV4cGVjdGVkIHRvIGJlIFBDIHJlbGF0aXZlLgotCi1Nb24gSnVsIDIyIDEyOjQ2OjU1IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiB0Yy1hbHBoYS5jOiBQYXRjaGVzIHRvIHRyYWNrIGN1cnJlbnQgbWluaW11bSBhbGlnbm1lbnQgdG8gcmVkdWNlCi0JdGhlIG51bWJlciBvZiBmcmFnbWVudHMgY3JlYXRlZCB3aXRoIGZyYWdfYWxpZ24uCi0JKGFscGhhX2N1cnJlbnRfYWxpZ24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX2FscGhhX3RleHQpOiBSZXNldCBhbGlnbm1lbnQgdG8gMC4KLQkoc19hbHBoYV9kYXRhLCBzX2FscGhhX3JkYXRhLCBzX2FscGhhX3NkYXRhKTogTGlrZXdpc2UuCi0JKHNfYWxwaGFfc3RyaW5nZXIsIHNfYWxwaGFfc3BhY2UpOiBOZXcgZnVuY3Rpb25zLgotCShzX2FscGhhX2NvbnMsIGFscGhhX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogUmVtb3ZlIGZ1bmN0aW9ucy4KLQkoYWxwaGFfY29uc19hbGlnbik6IE5ldyBmdW5jdGlvbiB0byByZXBsYWNlIGJvdGggb2YgdGhlbS4KLQkoZW1pdF9pbnNuKTogT25seSBhbGlnbiBpZiBhbHBoYV9jdXJyZW50X2FsaWduIGlzIGxlc3MgdGhhbiAyOwotCXJlc2V0IGFscGhhX2N1cnJlbnRfYWxpZ24gdG8gMi4KLQkoc19hbHBoYV9ncHJlbDMyKTogTGlrZXdpc2UuCi0JKHNfYWxwaGFfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4gIEJhc2ljYWxseSBkdXBsaWNhdGUgdGhlIG90aGVyCi0JYWxwaGEgc2VjdGlvbiBjaGFuZ2UgaG9va3MuICBPbmx5IGRlZmluZSBmb3IgRUxGLgotCShzX2FscGhhX2Zsb2F0X2NvbnMpOiBTaW1wbGlmeSBhbGlnbm1lbnQgaGFuZGxpbmcuCi0JKG1kX3BzZXVkb190YWJsZSk6IE9ubHkgZGVmaW5lICJyZGF0YSIgYW5kICJzZGF0YSIgaWYgT0JKX0VDT0ZGLgotCUlmIE9CSl9FTEYsIGRlZmluZSAic2VjdGlvbiIsICJzZWN0aW9uLnMiLCAic2VjdCIsIGFuZCAic2VjdC5zIi4KLQlEb24ndCBkZWZpbmUgdGhlIHNfYWxwaGFfY29ucyBwc2V1ZG8tb3BzLiAgRG8gZGVmaW5lCi0Jc19hbHBoYV9zdHJpbmdlciBhbmQgc19hbHBoYV9zcGFjZSBwc2V1ZG8tb3BzLgotCShhbHBoYV9hbGlnbik6IFNraXAgaWYgbGVzcyB0aGFuIGN1cnJlbnQgZGVmYXVsdCBhbGlnbm1lbnQuICBTZXQKLQlkZWZhdWx0IGFsaWdubWVudC4KLQkqIHRjLWFscGhhLmggKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogUmVtb3ZlLgotCShtZF9jb25zX2FsaWduKTogQWRkLgotCi0JKiB0Yy1hbHBoYS5jOiBBZGQgb29kbGVzIG9mIGZ1bmN0aW9uIGRlc2NyaXB0aW9uIGNvbW1lbnRzLgotCShtZF9iaWdudW1fdG9fY2hhcnMpOiBSZW1vdmU7IHRoZXJlIGFyZSBubyBjYWxsZXJzLgotCShtZF9zaG93X3VzYWdlKTogTWVudGlvbiBzb21lIG1vcmUgdmFyaWFudHMuCi0KLVRodSBKdWwgMTggMTU6NTQ6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBBbmRyZXcgR2llcnRoIDxBTkRSRVdHQG1pY3JvbGlzZS5jby51az46Ci0JKiBjb25maWd1cmUuaW4gKHNwYXJjLSotc3lzdjQqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKG1kX3BzZXVkb190YWJsZSk6IENoYW5nZSB1YWhhbGYsIHVhd29yZCwgYW5kCi0JdWF4d29yZCB0byB1c2Ugc191YWNvbnMuCi0JKHNwYXJjX25vX2FsaWduX2NvbnMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShzX3VhY29ucyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNwYXJjX2NvbnNfYWxpZ24pOiBJZiBzcGFyY19ub19hbGlnbl9jb25zIGlzIHNldCwganVzdCBjbGVhciBpdAotCWFuZCByZXR1cm4uCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzX2NvbW1vbik6IFJlbW92ZSB1bnVzZWQgbGFiZWwgYWxsb2NhdGVfYnNzLgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBtaXBzLSotaXJpeDYqIHRhcmdldC4gIEhhbmRsZSBJcml4IDYgbGlrZSBJcml4Ci0JNSB3aXRoIHJlZ2FyZCB0byBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogVXNlIHRoZSBjb3JyZWN0IGxlbmd0aCB3aGVuCi0JYWxsb2NhdGluZyBzcGFjZSBmb3IgdGhlIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSBlcnJvciBtZXNzYWdlLgotCi1UaHUgSnVsIDE4IDEyOjU3OjEwIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChkMTB2LSotKik6IEFsbG93IGQxMHYtKi0qLCBkb24ndCByZXF1aXJlIGQxMHYtKi1lbGYqLgotCi1XZWQgSnVsIDE3IDE0OjI1OjEzIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtZDEwdi5jOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy90Yy1kMTB2Lmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlIChkMTB2LSotZWxmKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoZDEwdi0qLWVsZik6IE5ldyB0YXJnZXQuCi0JCi1GcmkgSnVsIDEyIDIwOjU0OjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9wYXJzZV9vcHRpb24pOiBSZWNvZ25pemUgLUsgUElDLgotCi1XZWQgSnVsIDEwIDEyOjM5OjA4IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfYWxpZ24pOiBDaGFuZ2UgZmlsbCBwYXJhbWV0ZXIKLQl0byBhIHBvaW50ZXIuICBUYWtlIE5VTEwgYXMgMCBvciBub3AgZGVwZW5kaW5nIG9uIHNlY3Rpb24uICBDaGFuZ2UKLQlhbGwgY2FsbGVycy4KLQkoc19hbHBoYV9hbGlnbik6IFJlbmFtZSBsb2NhbCB2YXJpYWJsZXMuCi0KLQkqIGRvYy9hcy50ZXhpbmZvICguYWxpZ24pOiBEb2N1bWVudCBhY3Rpb24gb2Ygb21pdHRlZAotCWZpbGwgcGFyYW1ldGVyLgotCi1XZWQgSnVsIDEwIDAwOjIzOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChtZF9hcHBseV9maXgzKTogR2l2ZSBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlCi0Jd2hlbiBhbiB1bnN1cHBvcnRlZCBQQyByZWxhdGl2ZSByZWxvYyBpcyBzZWVuLCByYXRoZXIgdGhhbiBjYWxsaW5nCi0JYWJvcnQuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IFJlbW92ZSBub3RfY3BwX2xpbmUgbG9jYWwgdmFyaWFibGUuCi0JSW5zdGVhZCwgY2hlY2sgc3RhdGUgd2hlbiAnIycgY29tbWVudCBpcyBzZWVuLgotCi1Nb24gSnVsICA4IDE0OjExOjQ5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19yZWdtYXNrX2ZyYWcpOiBPbmx5IGRlZmluZSBpZiBPQkpfRUxGIG9yCi0gCU9CSl9NQVlCRV9FTEYuCi0JKHRjX2dlbl9yZWxvYyk6IElmIGZpeHVwIHdhcyBjaGFuZ2VkIHRvIGJlIFBDIHJlbGF0aXZlLCBjaGFuZ2UKLSAJcmVsb2MgdHlwZSBhY2NvcmRpbmdseS4gIFVzZSBuYW1lIG9mIHJlbG9jIGluIGVycm9yIG1lc3NhZ2UuCi0KLQkqIGFzLmg6IERvbid0IGRlZmluZSBjb25zdCBvciB2b2xhdGlsZS4KLQkqIGZsb251bS5oOiBEb24ndCBkZWZpbmUgY29uc3QuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKHRjX2dlbl9yZWxvYyk6IENoYW5nZSB0aGUgY29kZSBhcHByb3ByaWF0ZWx5Ci0JaWYgZnhfcGNyZWwgaXMgc2V0LiAgQ29ycmVjdCBzZXR0aW5nIHRoZSBhZGRlbmQgY2FzZSBpbiB0aGUKLQlPQkpfRUxGIGNhc2UgKGZyb20gQW5kcmVhcyBTY2h3YWIKLQk8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPikuCi0JKG1kX3Nob3dfdXNhZ2UpOiBDb3JyZWN0IC1tZmM1MjAwIHRvIC1tNTIwMC4KLQotRnJpIEp1bCAgNSAxMDozMjo1OCAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9jLW02OGsudGV4aTogRG9jdW1lbnQgLW01MjAwIGZsYWcuCi0JKiBkb2MvYXMudGV4aW5mbzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBUaGUgY29sZGZpcmUgZG9lcyBub3Qgc3VwcG9ydCA4eAotIAlzY2FsZSBmYWN0b3IuCi0KLUZyaSBKdWwgIDUgMTE6MDc6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeW1ib2xzLmMgKFNfU0VUX0VYVEVSTkFMKTogQ2hhbmdlIGFzX3dhcm4gdG8gYXNfYmFkLgotCShTX0NMRUFSX0VYVEVSTkFMLCBTX1NFVF9XRUFLKTogTGlrZXdpc2UuCi0KLVRodSBKdWwgIDQgMTE6NTk6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoVkVSU0lPTik6IFNldCB0byBjeWdudXMtMi43LjEuCi0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotVGh1IEp1bCAgNCAxMDoxMTozMyAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBPbmx5IHBlcmZvcm0gcmFuZ2UgY2hlY2sgd2hlbgotIAlkZWFsaW5nIHdpdGggT19jb25zdGFudCBleHByZXNzaW9ucy4KLQotV2VkIEp1bCAgMyAxNTowMjoyMSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIG02OGstcGFyc2UuaCAobTY4a19yZWdpc3Rlcik6IEFkZCBuZXcgY29sZGZpbGUgY29udHJvbAotCXJlZ2lzdGVycy4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWNmNTIwMF9jb250cm9sX3JlZ3MpOiBOZXcgdmFyaWFibGUsIAotCWFycmF5IG9mIGNvbnRyb2wgcmVnaXN0ZXJzIGZvciB0aGUgY29sZGZpcmUuCi0JKGNwdV9vZl9hcmNoKTogQWRkZWQgbWNmNTIwMC4KLQkoYXJjaHMpOiBBZGRlZCBtY2Y1MjAwLgotCShpbml0X3RhYmxlKTogQWRkIG5ldyBjb250cm9sIHJlZ2lzdGVycy4KLQkobTY4a19pcCk6IEFkZGVkIHN1cHBvcnQgZm9yIG5ldyBjb250cm9sIHJlZ2lzdGVycy4KLQkobTY4a19pbml0X2FmdGVyX2FyZ3MpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAobWRfc2hvd191c2FnZSk6IEFkZCAtbTUyMDAgdG8gdXNhZ2UgdGV4dC4KLQotV2VkIEp1bCAgMyAxNjowNTo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCk6IERlY2xhcmUuCi0JKiByZWFkLmMgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQpOiBSZW1vdmUgZGVjbGFyYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zdWZmaXgpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gb2YgfHwKLQl3aXRoaW4gJiYuCi0JKG1kX2Fzc2VtYmxlKTogRml4IGhhbmRsaW5nIG9mIEBsIHdpdGggYW4gdW5zaWduZWQgY29uc3RhbnQuICBBZGQKLQlkZWZhdWx0IGNhc2UgdG8gcmVsb2Mgc3dpdGNoLgotCi0JKiBjb25maWcvdGMtaTM4Ni5oIChBT1VUX01BQ0hUWVBFKTogRGVmaW5lIGFzIDAgaWYgVEVfMzg2QlNELgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIFRvbSBRdWlnZ2xlIDxxdWlnZ2xlQHNnaS5jb20+OgotCSogZWNvZmYuYyAobGFzdF9saW5lbm8pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShhZGRfcHJvY2VkdXJlKTogU2V0IGxhc3RfbGluZW5vLgotCShlY29mZl9kaXJlY3RpdmVfbG9jKTogTGlrZXdpc2UuCi0JKGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8pOiBMaWtld2lzZS4KLQkoZWNvZmZfZml4X2xvYyk6IE5ldyBmdW5jdGlvbi4KLQkqIGVjb2ZmLmggKGVjb2ZmX2ZpeF9sb2MpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAoYXBwZW5kX2luc24pOiBXaGVuIGluc2VydGluZyBub3BzLCBhbmQgdXNpbmcKLQlFQ09GRiBkZWJ1Z2dpbmcsIGNhbGwgZWNvZmZfZml4X2xvYy4KLQotVHVlIEp1bCAgMiAyMzowMjoxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1oODMwMC5jIChidWlsZF9ieXRlcyk6IElmIGFuIG9wZXJhbmQgdHlwZSBpcyAKLQltYXJrZWQgYXMgU1JDX0lOX0RTVCByZXRyaWV2ZSBpdCBmcm9tIHRoZSAiZGVzdGluYXRpb24iIG9wLgotCi1TYXQgSnVuIDI5IDEzOjM4OjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChhcm0tKi1yaXNjaXgqKTogU2V0IGVtdWxhdGlvbiB0byByaXNjaXguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtcmlzY2l4Lmg6IE5ldyBmaWxlIHRvIGRlZmluZSBURV9SSVNDSVguCi0KLQkqIGNvbmZpZy90Yy1zaC5oIChTVUJfU0VHTUVOVF9BTElHTik6IERlZmluZS4KLQotRnJpIEp1biAyOCAxNToxNDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjb25maWcuc3RhdHVzKTogSnVzdCBydW4gY29uZmlnLnN0YXR1cyBhcyBvdGhlcgotCXRvb2xzIGRvLgotCi1GcmkgSnVuIDI4IDExOjA5OjM4IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbiAoVEFSR0VUX09TKTogQWRkIGRlZmluaXRpb24gdG8gY29uZi4KLQotVGh1IEp1biAyNyAyMDozOTo0MCAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGFwcGVuZF9pbnNuKTogUGFyZW50aGVzaXplCi0JY29wX2ludGVybG9ja3MgZXhwcmVzc2lvbnMuCi0KLVRodSBKdW4gMjcgMTI6MTg6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfcHJpbnQpOiBDbG9zZSB0aGUgbGlzdGluZyBmaWxlIGlmIGl0IGlzIG5vdAotCXN0ZG91dC4gIENsb3NlIHRoZSBvdGhlciBmaWxlcyBvcGVuZWQgZm9yIHRoZSBsaXN0aW5nLgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAobWRfY29uc19hbGlnbik6IERlZmluZS4KLQkoc3BhcmNfY29uc19hbGlnbik6IERlY2xhcmUuCi0JKEhBTkRMRV9BTElHTik6IERlZmluZS4KLQkoc3BhcmNfaGFuZGxlX2FsaWduKTogRGVjbGFyZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19jb25zX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCShzcGFyY19oYW5kbGVfYWxpZ24pOiBOZXcgZnVuY3Rpb24uCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogQ2FsbCBtZF9jb25zX2FsaWduIGlmIGl0IGlzIGRlZmluZWQuCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogQWRkIGZyX2ZpbGUgYW5kIGZyX2xpbmUgZmllbGRzLgotCSogZnJhZ3MuYyAoZnJhZ19uZXcpOiBTZXQgZnJfZmlsZSBhbmQgZnJfbGluZS4KLQkoZnJhZ192YXIpOiBMaWtld2lzZS4KLQkoZnJhZ192YXJpYW50KTogTGlrZXdpc2UuCi0KLQkqIGFzLmggKHN0cnVjdCBmcmFnKTogUmVtb3ZlIHVudXNlZCBhbGlnbl9tYXNrIGFuZCBhbGlnbl9vZmZzZXQKLQlmaWVsZHMuCi0KLQkqIGxpc3RpbmcuYyAoY2FsY19oZXgpOiBPZmZzZXQgYnkgZnJfZml4IHdoZW4gZXhhbWluaW5nIGZyX3Zhci4KLQlGcm9tIDx1ZGRlYm9yZ0BjYXJtZW4uc2U+LgotCi1XZWQgSnVuIDI2IDEzOjIxOjM0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChtaXBzLSotb3NmKik6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmM6IEFkZCA2OGVjMDYwIGFzIGEgc3lub255bSBmb3IgNjgwNjAuCi0KLVdlZCBKdW4gMjYgMTY6MjM6MDggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBjb25maWcvdGMtbWlwcy5jOiBBZGRlZCBjb3BfaW50ZXJsb2NrcywgdG8gYXZvaWQgTk9QIGluc2VydGlvbgotIAliZXR3ZWVuIGNvLXByb2Nlc3NvciBjb21wYXJpc29ucyBhbmQgYnJhbmNoZXMgZm9yIHRoZSBWUjQzMDAuCi0KLU1vbiBKdW4gMjQgMTg6MDI6NTAgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGJpbmRpciwgbGliZGlyLCBkYXRhZGlyLCBtYW5kaXIsIGluZm9kaXIsIGluY2x1ZGVkaXIsCi0JSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLQkoZG9jZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQkqIGRvYy9NYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwKLQlpbmNsdWRlZGlyKTogVXNlIGF1dG9jb25mIHNldCB2YWx1ZXMuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0KLU1vbiBKdW4gMjQgMTE6NTg6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaXN0aW5nLmMgKGxpc3RpbmdfZWplY3QpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBsaXN0aW5nIGlzIDAuCi0JKGxpc3RpbmdfbGlzdCk6IExpa2V3aXNlLgotCShsaXN0aW5nX3NvdXJjZV9saW5lKTogTGlrZXdpc2UuCi0JKGxpc3RpbmdfdGl0bGUpOiBEb24ndCBzYXZlIHRpdGxlIGlmIGxpc3RpbmcgaXMgMC4KLQkobGlzdGluZ19zb3VyY2VfZmlsZSk6IENoZWNrIGxpc3RpbmcgcmF0aGVyIHRoYW4gbGlzdGluZ190YWlsLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKLQl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDIxIDE4OjIyOjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IEluIGNhc2UgJ2knLydqJywgZG9uJ3QgcmVxdWlyZSBhbgotCWFic29sdXRlIGV4cHJlc3Npb24gaWYgYSByZWxvY2F0aW9uIHR5cGUgd2FzIHNwZWNpZmllZC4KLQotRnJpIEp1biAyMSAxNzo0MDoxNiAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBtZXJsaW4uZ2NzLnJlZHN0b25lLmFybXkubWlsPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciAqLSotcnRlbXMqIGNvbmZpZ3VyYXRpb25zLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgSnVuIDIxIDE2OjAxOjE4IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBhbHBoYS0qLWxpbnV4ZWNvZmYqIHRhcmdldC4gIFVzZSBlbGYgZm9yCi0JYWxwaGEtKi1saW51eCogdGFyZ2V0LiAgRm9yY2UgYmZkX2dhcyBmb3IgYWxwaGEtKi4gIFJlcXVpcmUKLQlvcGNvZGVzIGxpYnJhcnkgZm9yIGFscGhhLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQkqIGNvbmZpZy90Yy1hbHBoYS5jOiBTdWJzdGFudGlhbCByZXdyaXRlIHRvIGFkZCBFTEYgc3VwcG9ydCBhbmQKLQl1c2UgbmV3IG9wY29kZSB0YWJsZS4KLQkqIGNvbmZpZy90Yy1hbHBoYS5oIChtZF91bmRlZmluZWRfc3ltYm9sKTogRG9uJ3QgZGVmaW5lLgotCShMT0NBTF9MQUJFTCk6IERlZmluZSBkaWZmZXJlbnRseSBpZiBPQkpfRUxGLgotCShGQUtFX0xBQkVMX05BTUUpOiBEZWZpbmUgaWYgT0JKX0VMRi4KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogUmVtb3ZlLgotCSogY29uZmlnL29iai1lbGYuaDogSWYgVENfQUxQSEEsIGRlZmluZSBFQ09GRl9ERUJVR0dJTkcuCi0JKiBNYWtlZmlsZS5pbiAoVEFSR19DUFVfREVQX2FscGhhKTogRGVwZW5kIHVwb24KLQlpbmNsdWRlL29wY29kZS9hbHBoYS5oIHJhdGhlciB0aGFuIGNvbmZpZy9hbHBoYS1vcGNvZGUuaC4KLQotVGh1IEp1biAyMCAxOToxMDoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9vYmotYW91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IEdpdmUgYW4gZXJyb3IgaWYgdGhlCi0JcmVsb2NhdGlvbiBzeW1ib2wgd2FzIG5vdCByZXNvbHZlZC4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChkb19yZWxvY3NfZm9yKTogTGlrZXdpc2UuCi0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogUmVmZXRjaCB0aGUgc3ltYm9sIHNlY3Rpb24gYWZ0ZXIKLQljYWxsaW5nIFNfR0VUX1ZBTFVFLCBzaW5jZSBpdCBtYXkgaGF2ZSBjaGFuZ2VkLgotCi0JKiBleHByLmMgKHN0cnVjdCBleHByX3N5bWJvbF9saW5lKTogRGVmaW5lLgotCShleHByX3N5bWJvbF9saW5lcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG1ha2VfZXhwcl9zeW1ib2wpOiBBZGQgZW50cnkgdG8gZXhwcl9zeW1ib2xfbGluZXMuCi0JKGV4cHJfc3ltYm9sX3doZXJlKTogTmV3IGZ1bmN0aW9uLgotCSogZXhwci5oOiBVc2UgZXh0ZXJuIG9uIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KLQkoZXhwcl9zeW1ib2xfd2hlcmUpOiBEZWNsYXJlLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFRyeSB0byB1c2UgZXhwcl9zeW1ib2xfd2hlcmUKLQlyYXRoZXIgdGhhbiBwcmludGluZyB0aGUgbWVhbmluZ2xlc3MgbmFtZSBvZiBhbiBleHByZXNzaW9uCi0Jc3ltYm9sLgotCi1UaHUgSnVuIDIwIDE1OjU3OjQxIDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9udW1iZXJfdG9fY2hhcnMpOiBEZWxldGVkLgotCSogY29uZmlnL3RjLWkzODYuaCAobWRfbnVtYmVyX3RvX2NoYXJzKTogTmV3IG1hY3JvLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYnVpbGRfb3BlcmF0ZV9uLCBidWlsZF9tZW0pOiBNb3ZlZCBlYXJsaWVyIGluCi0JdGhlIGZpbGUuCi0JKGxvYWRfc3ltYm9sX2FkZHJlc3MsIGxvYWRfZXhwcmVzc2lvbik6IFVzZSBidWlsZF9tZW0uCi0JKGJ1aWxkX29wZXJhdGUpOiBOZXcgZnVuY3Rpb24uCi0JKGVtaXRfYWRkcV9yKTogVXNlIGl0LgotCi0JV2VkIE1hciAxMyAyMjoxNDoxNCAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogc3ltYm9scy5jIChjb2xvbik6ICAjaWYgVk1TLCB1c2UgU19TRVRfT1RIRVIgdG8gc3RvcmUgYGNvbnN0X2ZsYWcnLgotCi0JVHVlIE1hciAgNSAxNDozMTo0NSAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL3RjLXZheC5oIChOT1BfT1BDT0RFKTogRGVmaW5lLgotCi0JU3VuIEZlYiAgNCAyMTowMTowMyAxOTk2ICBQYXQgUmFua2luICA8cmFua2luQGVxbC5jYWx0ZWNoLmVkdT4KLQotCSogY29uZmlnL29iai12bXMuaCAoU19JU19DT01NT04pOiBEZWZpbmUuCi0JKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0JKExPTkdXT1JEX0FMSUdOTUVOVCk6IE5ldyBtYWNyby4KLQkoU1VCX1NFR01FTlRfQUxJR04pOiBVc2UgaXQuCi0KLQlGcmkgSmFuIDI2IDE3OjQ0OjA5IDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiBjb25maWcvdm1zLWNvbmYuaDogUmVjb25jaWxlIHdpdGggY29uZi5pbi4KLQotV2VkIEp1biAxOSAxMTozMTo1MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGlzX2RucmFuZ2UpOiBPbmx5IGRlZmluZSBpZiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIGlzCi0JZGVmaW5lZC4KLQotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IHRoYXQgYW55IG51bWJlciBvZiBoZXggZGlnaXRzIGNhbgotCWZvbGxvdyBceC4KLQotCSogYXMuYyAoc3RydWN0IGRlZnN5bV9saXN0KTogRGVmaW5lLgotCShkZWZzeW1zKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocGFyc2VfYXJncyk6IEp1c3QgcHV0IC0tZGVmc3ltIGFyZ3VtZW50cyBvbiBkZWZzeW1zIGxpc3QsIHJhdGhlcgotCXRoYW4gZGVmaW5pbmcgdGhlbS4KLQkobWFpbik6IERlZmluZSBkZWZzeW1zIGFmdGVyIG91dHB1dCBmaWxlIGlzIGNyZWF0ZWQuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBSZWplY3QgUFJFIGFuZCBQT1NUIGluZGV4aW5nIG1vZGUgb24KLQljcHUzMi4gIEZyb20gRXJpYyBOb3J1bSA8RXJpYy5Ob3J1bUB1c2Fzay5jYT4uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBJbiBjYXNlcyAnSScsICdpJywgYW5kICdqJywgc2V0Ci0JaW5zbl9lcnJvciByYXRoZXIgdGhhbiBjYWxsaW5nIGNoZWNrX2Fic29sdXRlX2V4cHIuCi0KLQkqIGFzLmMgKGVtdWxhdGlvbl9uYW1lKTogUmVtb3ZlIHVudXNlZCBzdGF0aWMgdmFyaWFibGUuCi0JKGRlZmF1bHRfZW11bF9iZmRfbmFtZSk6IEFkZCByZXR1cm4gTlVMTCB0byBhdm9pZCB3YXJuaW5nLgotCSogZWNvZmYuYyAoZWNvZmZfc3RhYik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGVzIG5hbWUgYW5kCi0JbmFtZV9lbmQuCi0JKiBmcmFncy5jIChmcmFnX25ldyk6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgdG1wLgotCSogaGFzaC5jIChoYXNoX2dyb3cpOiBQYXJlbnRoZXNpemUgKyB3aXRoaW4gPDwuCi0JKGhhc2hfcHJpbnRfc3RhdGlzdGljcyk6IFVzZSAlbHUsIG5vdCAlZCwgdG8gcHJpbnQgdW5zaWduZWQKLQlsb25nIHZhcmlhYmxlcy4KLQkqIG1lc3NhZ2VzLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoZnByaW50X3ZhbHVlKTogQWRkIGNhc3QgdG8gYXZvaWQgcHJpbnRmIHdhcm5pbmcuCi0JKHNwcmludF92YWx1ZSk6IExpa2V3aXNlLgotCSogcmVhZC5jOiBJbmNsdWRlICJlY29mZi5oIi4KLQkoZW1pdF9leHByKTogQWRkIGNhc3RzIHRvIGF2b2lkIHByaW50ZiB3YXJuaW5ncy4KLQkqIHJlYWQuaDogVXNlIGV4dGVybiBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCShwb3BfaW5zZXJ0KTogRGVjbGFyZS4KLQkqIHN0YWJzLmM6IEluY2x1ZGUgImVjb2ZmLmgiLgotCSogc3Vic2Vncy5jIChzdWJzZWdfc2V0X3Jlc3QpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcyB0bXAsCi0JZm9ybWVyX2xhc3RfZnJhZ1AsIGFuZCBuZXdfZnJhZ1AuCi0JKiBzdWJzZWdzLmggKHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyk6IERlY2xhcmUuCi0JKiBzeW1ib2xzLmMgKGRlYnVnX3ZlcmlmeV9zeW1jaGFpbik6IENoYW5nZSBtYWNybyB0byBkaXNjYXJkCi0JYXJndW1lbnRzLgotCSogd3JpdGUuYyAoZHVtcF9zZWN0aW9uX3JlbG9jcyk6IExpa2V3aXNlLgotCSogd3JpdGUuaDogVXNlIGV4dGVybiBmb3IgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCSh3cml0ZV9wcmludF9zdGF0aXN0aWNzKTogRGVjbGFyZS4KLQkqIGNvbmZpZy9lLW1pcHNlY29mZi5jIChtaXBzZWNvZmZfYmZkX25hbWUpOiBSZXR1cm4gTlVMTCB0byBhdm9pZAotCXdhcm5pbmcuCi0JKiBjb25maWcvZS1taXBzZWxmLmMgKG1pcHNlbGZfYmZkX25hbWUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy9vYmotZWxmLmggKGVsZl9lY29mZl9zZXRfZXh0KTogRGVjbGFyZS4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IElmIE9CSl9FTEYsIGFsd2F5cwotCWVtaXQgcmVsb2NhdGlvbnMgYWdhaW5zdCBleHRlcm5hbCBzeW1ib2xzLgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAodGNfZ2VuX3JlbG9jKTogT3V0cHV0IGEgc2Vuc2libGUgZXJyb3IKLSAJbWVzc2FnZSBpZiBiZmRfcmVsb2NfdHlwZV9sb29rdXAgZmFpbHMsIHJhdGhlciB0aGFuIGNhbGxpbmcKLSAJYXNzZXJ0LgotCi0JKiBjb25maWcvdGMtYWxwaGEuYyAoYWxwaGFfZm9yY2VfcmVsb2NhdGlvbik6IEFkZAotCUJGRF9SRUxPQ18xMl9QQ1JFTCB0byBzd2l0Y2guCi0KLVR1ZSBKdW4gMTggMjA6Mjk6NTcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWkzODYuaCAoTE9DQUxfTEFCRUwsRkFLRV9MQUJFTF9OQU1FKTogVXNlIGRlZmF1bHRzIGZvcgotCVRFX1BFIChMZm9vLCBub3QgLkxmb28pLgotCi1UdWUgSnVuIDE4IDE3OjEzOjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChzX2ZpbGwpOiBEb24ndCB3YXJuIGFib3V0IGEgemVybyByZXBlYXQgY291bnQuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1pcHNfaXApOiBEb24ndCB3YXJuIGFib3V0IHVzaW5nIEFUIGFzIGEKLQljb3Byb2Nlc3NvciByZWdpc3Rlci4KLQotCSogY29uZmlnL3RjLWkzODYuYyAobWRfYXNzZW1ibGUpOiBXaGVuIGNoZWNraW5nIHRoZSBzaXplIG9mIGEKLQlyZWdpc3RlciB0byBzZXQgdGhlIHNpemUgb2YgYW4gaW5zdHJ1Y3Rpb24sIGRvIGEgYml0d2lzZSBhbmQgd2l0aAotCVJlZzggYW5kIFJlZzE2IHJhdGhlciB0aGFuIHJlcXVpcmluZyB0aGUgdHlwZSB0byBiZSBleGFjdGx5IFJlZzgKLQlvciBSZWcxNi4KLQotVHVlIEp1biAxOCAxMzoxOTo1MSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHBhcnNlX3JlZyk6IFR3ZWFrIGVycm9yIG1lc3NhZ2VzLgotCShidWlsZF9ieXRlcyk6IExpa2V3aXNlLgotCShza2lwX2NvbG9udGhpbmcpOiBIYW5kbGUgOjMyIHN1ZmZpeC4KLQkoZ2V0X3NwZWNpZmljKTogUHJvbW90ZSBMXzI0IHRvIExfMzIgaWYgaXQgbWFrZXMgYSBtYXRjaC4KLQlEb24ndCBhbHdheXMgcHJvbW90ZSBMXzggdG8gTF8xNi4KLQkoZG9fYV9maXhfaW1tKTogQ2xlYW4gdXAgTF8zMiBhbmQgTF8yNCBoYW5kbGluZy4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKFNtb2RlKTogTmV3IHZhcmlhYmxlLgotCShoODMwMGhtb2RlKTogVHVybiBvZmYgSG1vZGUuCi0JKGg4MzAwc21vZGUpOiBOZXcgZnVuY3Rpb24uICBUdXJuIG9uIFNtb2RlIGFuZCBIbW9kZS4KLQkobWRfcHNldWRvX3RhYmxlKTogTmV3ICIuaDgzMDBzIiBwc2V1ZG8tb3AuCi0JKHBhcnNlX3JlZyk6IEhhbmRsZSAiZXhyIiByZWdpc3Rlci4KLQkoZ2V0X29wZXJhbmQpOiBIYW5kbGUgYml6YXJyZSBzeW50YXggZm9yICJzdG0ubCIgYW5kICJsZG0ubCIuCi0JSGFuZGxlICJtYWNoIiBhbmQgIm1hY2hsIiBvcGVyYW5kcyBmb3IgbGRtYWMuCi0JKGdldF9zcGVjaWZpYyk6IEhhbmRsZSAic3RtLmwiIGFuZCAibGRtLmwiLgotCShidWlsZF9ieXRlcyk6IEhhbmRsZSAic3RtLmwiIGFuZCAibGRtLmwiOyBoYW5kbGUgTUFDUkVHIG9wZXJhbmRzLgotCSogY29uZmlnL3RjLWg4MzAwLmggKENPRkZfTUFHSUMpOiBIYW5kbGUgSDgvUyBtYWdpYyBudW1iZXIuCi0JKFNtb2RlKTogRGVjbGFyZS4KLQotTW9uIEp1biAxNyAxNTo1MDo1MyAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGRvYy9hcy50ZXhpbmZvOiBSZW9yZGVyIGNoYXB0ZXIgb2YgbWFjaGluZSBkZXBlbmRlbnQgb3B0aW9ucyBzbwotIAl0aGF0IGl0IGlzIHNvcnRlZCBieSBjaGlwIG5hbWUuICAKLQotCSogZG9jL2FzLnRleGluZm86IFVzZSBjb25zaXN0YW50IHNwZWxsaW5nIG9mIFZheC4KLQkqIGRvYy9jLXZheC50ZXhpOiBMaWtld2lzZS4KLQotTW9uIEp1biAxNyAxMToyNjo1NiAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAobWRfcHNldWRvX3RhYmxlKTogQWRkICIuYmVnaW5fdHJ5IiBhbmQgIi5lbmRfdHJ5IgotCXBzZXVkbyBvcHMuCi0JKHRjX2dlbl9yZWxvYywgU09NIHZlcnNpb24pOiBIYW5kbGUgUl9CRUdJTl9UUlkgYW5kIFJfRU5EX1RSWS4KLQkobWRfYXBwbHlfZml4KTogTGlrZXdpc2UuCi0JKHBhX3RyeSk6IE5ldyBmdW5jdGlvbi4KLQkoaHBwYV9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgcmVsb2NzIGZvciBCRUdJTl9UUlkgYW5kIEVORF9UUlkuCi0KLVN1biBKdW4gMTYgMjI6NTc6NDcgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiLmxldmVsIiBwc2V1ZG8gb3AuCi0JKHBhX2xldmVsKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgSnVuIDE0IDIwOjA2OjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGlzdGluZy5jIChsaXN0aW5nX25ld2xpbmUpOiBEb24ndCBkbyBhbnl0aGluZyBpZiBsaXN0aW5nIGlzIDAuCi0KLVRodSBKdW4gMTMgMTc6NTA6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogSWYgc3ltYm9sX3RhYmxlX2Zyb3plbiBpcyBzZXQsIGNhbGwKLQlzeW1ib2xfY3JlYXRlLCBub3Qgc3ltYm9sX25ldy4KLQotV2VkIEp1biAxMiAxNDoxMDo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKGFkanVzdF9yZWxvY19zeW1zKTogRG9uJ3Qgc2V0IHN5X3VzZWRfaW5fcmVsb2MgZm9yIGFuCi0JYWJzb2x1dGUgc3ltYm9sIHVubGVzcyBUQ19GT1JDRV9SRUxPQ0FUSU9OIHJldHVybnMgdHJ1ZS4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHByZXZpb3VzX2ZpbGVfc3ltYm9sKTogUmVtb3ZlIEJGRF9BU1NFTUJMRVIKLQl2ZXJzaW9uLgotCShjX2RvdF9maWxlX3N5bWJvbCk6IEJGRF9BU1NFTUJMRVIgdmVyc2lvbjogRG9uJ3Qgc2V0IHRoZSB2YWx1ZSBvZgotCXRoZSBzeW1ib2wgdG8gYSBwb2ludGVyLiAgRG9uJ3Qgc2V0IHByZXZpb3VzX2ZpbGVfc3ltYm9sLgotCVNpbXBsaWZ5IHN5bWJvbCBsaXN0IHJlYXJyYW5nZW1lbnQuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBEb24ndCBkbyBhbnl0aGluZyB3aXRoIENfRklMRSBzeW1ib2xzLgotCShjb2ZmX2FkanVzdF9zeW10YWIpOiBEb24ndCBjaGVjayBwcmV2aW91c19maWxlX3N5bWJvbC4KLQotTW9uIEp1biAxMCAxNDo1MjoyOSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9sY29tbSk6IE5ldyBmdW5jdGlvbiBmb3IgLmxjb21tCi0JZGlyZWN0aXZlLgotCShtZF9wc2V1ZG9fdGFibGUpOiBBZGQgcHBjX2VsZl9sY29tbS4KLQotTW9uIEp1biAxMCAxMTo0NTo1MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApOiBBY2NlcHQgQUJTTCBmb3IgJ08nLCBzbyB0aGF0IGBiZmV4dHUKLQlkMHsyNDoxfSxkMCcgd29ya3Mgd2l0aG91dCBhbiBpbW1lZGlhdGUgcHJlZml4IG9uIHRoZSBiaXQgbnVtYmVycy4KLQkobWRfYmVnaW4pOiBBZGQgZGlnaXRzIHRvIGFsdF9ub3RlbmRfdGFibGUuCi0JKG1kX3BhcnNlX29wdGlvbik6IE1ha2UgcyBhIGNvbnN0IHBvaW50ZXIuCi0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9wc2V1ZG9fdGFibGUpOiBBZGQgImVtcHR5Ii4KLQkoc19lbXB0eSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChzdHJ1Y3QgZmlsZW5hbWVfbGlzdCk6IE9ubHkgZGVmaW5lIGlmIG5vdAotCUJGRF9BU1NFTUJMRVIuCi0JKGZpbGVuYW1lX2xpc3RfaGVhZCwgZmlsZW5hbWVfbGlzdF90YWlsKTogTGlrZXdpc2UuCi0JKGNfc2VjdGlvbl9zeW1ib2wpOiBSZW1vdmUgdW51c2VkIEJGRF9BU1NFTUJMRVIgdmVyc2lvbi4KLQkob2JqX2NvZmZfZW5kZWYsIEJGRF9BU1NFTUJMRVIgdmVyc2lvbik6IERvbid0IHNldCB0aGUgZGVidWdnaW5nCi0JZmxhZyBmb3IgQ19NT1MsIENfTU9FLCBDX01PVSwgb3IgQ19FT1Mgc3ltYm9scywgc2luY2UgdGhleSBzaG91bGQKLQloYXZlIGEgc2VjdGlvbiBvZiBOX0FCUyByYXRoZXIgdGhhbiBOX0RFQlVHLiAgSWYgd2UgZG8gYSBtZXJnZSwKLQlyZW1vdmUgdGhlIG5ldyBzeW1ib2wgZnJvbSB0aGUgbGlzdC4KLSAJKG9ial9jb2ZmX2VuZGVmLCBib3RoIHZlcnNpb25zKTogQ2FsbCB0YWdfaW5zZXJ0IGV2ZW4gaWYgdGhlcmUgaXMKLQlhbiBvbGQgc3ltYm9sIHdpdGggdGhlIHNhbWUgbmFtZSwgaWYgdGhlIG9sZCBzeW1ib2wgZG9lcyBub3QKLQloYXBwZW4gdG8gYmUgYSB0YWcuCi0JKGNvZmZfZnJvYl9zeW1ib2wpOiBDaGVjayBTRl9HRVRfVEFHLCBDX0VPRiwgYW5kIENfRklMRSBvdXRzaWRlIG9mCi0JdGhlIFNGX0dFVF9ERUJVRyBjb25kaXRpb24uICBEb24ndCBjYWxsIFNBX1NFVF9TWU1fRU5ETkRYIHdpdGggYQotCXN5bWJvbCB0aGF0IHdpbGwgYmUgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QuCi0JKGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyk6IEFsd2F5cyBjYWxsIHNlY3Rpb25fc3ltYm9sIGZvciAudGV4dCwKLQkuZGF0YSwgYW5kIC5ic3MuCi0JKGNvZmZfZnJvYl9zZWN0aW9uKTogTGlrZXdpc2UuICBBbHNvLCByZW1vdmUgdW51c2VkIHZhcmlhYmxlCi0Jc3RybmFtZS4KLQotCSogY29uZmlnL3RjLW5zMzJrLmMgKGNvbnZlcnRfaWlmKTogQ2FsbCBmcmFnX2dyb3cgcmF0aGVyIHRoYW4KLQltYW5pcHVsYXRpbmcgZnJhZ3MgZGlyZWN0bHkuCi0JKG1kX251bWJlcl90b19maWVsZCk6IEFkanVzdCBtZW1fcHRyIGNvcnJlY3RseSBpZiBFTkRJQU4gaXMKLQlkZWZpbmVkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJZiAnLycgaXMgTElORV9DT01NRU5UX1NUQVJULCBjaGVjawotIAl3aGV0aGVyIHRoZSBuZXh0IGNoYXJhY3RlciBpcyAnKicgYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlCi0JYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4gIFBlcm1pdCBMSU5FX0NPTU1FTlRfU1RBUlQgdG8gc3RhcnQgYQotCWNvbW1lbnQgaW4gc3RhdGUgMSAoc2VlbiBzb21lIHdoaXRlc3BhY2UpIGFzIHdlbGwsIHRvIG1hdGNoIHRoZQotCWRvY3VtZW50YXRpb24uCi0KLQkqIGdhc3AuYyAoZG9fYWxpZ24pOiBQZXJtaXQgYSBmaWxsIHZhbHVlIGZvciAuYWxpZ24uCi0KLVdlZCBKdW4gIDUgMTc6MDk6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKG5leHRfY2hhcl9vZl9zdHJpbmcpOiBXYXJuIGlmIGEgbmV3bGluZSBpcyBzZWVuIGluIHRoZQotCW1pZGRsZSBvZiBhIHN0cmluZy4gIENhbGwgYnVtcF9saW5lX2NvdW50ZXJzIHdoZW4gYXBwcm9wcmlhdGUuCi0KLVdlZCBKdW4gIDUgMTc6MDg6MzYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIHN5bWJvbHMuYyAoY29sb24pOiBVc2UgTE9DQUxfTEFCRUwuCi0KLVR1ZSBKdW4gIDQgMTA6NTU6MTYgMTk5NiAgVG9tIFRyb21leSAgPHRyb21leUBjc2szLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogRG9uJ3QgY2hlY2sgdG8gc2VlIGlmIHRvb2xkaXIgZXhpc3RzLgotCU1ha2UgJCh0b29sZGlyKSBhbmQgJCh0b29sZGlyKS9iaW4uCi0KLVR1ZSBKdW4gIDQgMTA6MTQ6NTMgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvcHBjLXNvbC5tdCAoVERFRklORVMpOiBEb24ndCB0dXJuIG9uIC1tcmVnbmFtZXMgYnkKLQlkZWZhdWx0LgotCi1Nb24gSnVuICAzIDExOjM0OjQxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19pcCk6IERvbid0IGNhbGwgYXNfd2FybiBpZiB3ZSBhcmUgc2V0dGluZwotCWluc25fZXJyb3IuICBEb24ndCBwdXQgdGhlIHN0cmluZyAiRVJST1IiIGluIGluc25fZXJyb3IuICBTZXQKLQlpbnNuX2Vycm9yIHJhdGhlciB0aGFuIGNhbGxpbmcgYXNfd2FybiBmb3IgYW4gdW5zdXBwb3J0ZWQgb3Bjb2RlLgotCi1TYXQgSnVuICAxIDIxOjUxOjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfcGFyc2Vfb3B0aW9uKTogQ2hlY2sgZm9yIGEgNjQgYml0IGZvcm1hdAotCWJlZm9yZSBwZXJtaXR0aW5nIC02NC4KLQkqIG91dHB1dC1maWxlLmMgKG91dHB1dF9maWxlX2NyZWF0ZSk6IFJlbW92ZSBkdXBsaWNhdGUKLQliZmRfcGVycm9yLgotCi1GcmkgTWF5IDMxIDAxOjA4OjA2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWRfYmVnaW4pOiBJZiAtNjQsIGNyZWF0ZSBhIC5NSVBTLm9wdGlvbnMKLQlzZWN0aW9uIHJhdGhlciB0aGFuIGEgLnJlZ2luZm8gc2VjdGlvbi4KLQkobWlwc19lbGZfZmluYWxfcHJvY2Vzc2luZyk6IElmIC02NCwgd3JpdGUgb3V0IDY0IGJpdCBSZWdJbmZvCi0JaW5mb3JtYXRpb24uCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKGxvYWRfcmVnaXN0ZXIpOiBJZiBtaXBzX2lzYSA8IDMsIHBlcm1pdCBhIDMyCi0JYml0IHZhbHVlIHdpdGggdGhlIGhpZ2ggYml0IHNldC4KLQotVGh1IE1heSAzMCAxOTowMDoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoc19sY29tbSk6IFNldCBzZWN0aW9uIGZsYWdzIGZvciAuc2JzcyBzZWN0aW9uLgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzXzY0KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobWlwc190YXJnZXRfZm9ybWF0KTogSWYgbWlwc182NCwgcmV0dXJuIGVsZjY0IHRhcmdldHMgcmF0aGVyIHRoYW4KLQllbGYzMiBvbmVzLgotCShtZF9sb25nb3B0cyk6IEFkZCAiMzIiIGFuZCAiNjQiLgotCShtZF9wYXJzZV9vcHRpb24pOiBIYW5kbGUgLTMyIGFuZCAtNjQuCi0JKG1kX3Nob3dfdXNhZ2UpOiBNZW50aW9uIC0zMiBhbmQgLTY0LgotCShjb25zX2ZpeF9uZXdfbWlwcyk6IElmIG1pcHNfNjQsIGRvbid0IGNvbnZlcnQgYW4gOCBieXRlIHJlbG9jIHRvCi0JYSA0IGJ5dGUgb25lLgotCi1UaHUgTWF5IDMwIDEwOjM2OjE5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChjb21tZW50X2NoYXJzKTogTWFrZSAnIScgYSBjb21tZW50IGNoYXJhY3RlcgotCWZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLQkqIHN0YWJzLmMgKHNfc3RhYl9nZW5lcmljKTogVW5kZXIgUG93ZXJQQyBTb2xhcmlzLCBjb252ZXJ0IGEKLQkuc3RhYmQgd2l0aCA0IGFyZ3VtZW50cyBpbnRvIGEgLnN0YWJuLgotCi1XZWQgTWF5IDI5IDE2OjQzOjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWFjcm8pOiBXaGVuIHBhc3NpbmcgWF9hZGRfbnVtYmVyIHRvCi0JbWFjcm9fYnVpbGQsIGNhc3QgaXQgdG8gaW50IGZpcnN0LgotCi1UdWUgTWF5IDI4IDEzOjI5OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXo4ay5jIChtZF9hcHBseV9maXgpOiBIYW5kbGUgZnhfcl90eXBlIG9mIDAsIGFzCi0JY3JlYXRlZCBieSBlbWl0X2V4cHIuCi0KLQkqIHN5bWJvbHMuYyAoc3ltYm9sX2NyZWF0ZSk6IElmIGJmZF9tYWtlX2VtcHR5X3N5bWJvbCBmYWlscywgY2FsbAotCWFzX3BlcnJvciByYXRoZXIgdGhhbiBhc3NlcnQuCi0KLUZyaSBNYXkgMjQgMTg6MjQ6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2lwKTogTWFyayBzZWN0aW9ucyBjcmVhdGVkIHRvIGhvbGQKLQlmbG9hdGluZyBwb2ludCBpbmZvcm1hdGlvbiBhcyByZWFkIG9ubHkuCi0KLUZyaSBNYXkgMjQgMTI6MDc6NTQgMTk5NiAgRGF2aWQgRWRlbHNvaG4gIDxlZGVsc29obkBtaHBjYy5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NldF9jcHUpOiBDaGFuZ2UgZGVmYXVsdHMgdG8gbWF0Y2ggQUlYLgotCi1UaHUgTWF5IDIzIDE3OjM0OjI0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcmVhZC5jIChwb3RhYmxlKTogQWRkIC5za2lwIGFzIGEgc3lub255bSBmb3IgLnNwYWNlLgotCi0JKiBzdGFicy5jIChzX3N0YWJfZ2VuZXJpYyk6IEZvciBQb3dlclBDIEVMRiwgYWxsb3cgLnN0YWJkIHRvIHRha2UKLQk0IGFyZ3VtZW50cywgcHJvdmlkaW5nIHRoZSA0dGggYXJndW1lbnQgaXMgMCwgdG8gYWxsb3cKLQljb21wYXRpYmlsaXR5IHdpdGggdGhlIFNvbGFyaXMgYXNzZW1ibGVyLgotCi1UaHUgTWF5IDE2IDE1OjUxOjQ4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNoLmggKHN0cnVjdCBzaF9zZWdtZW50X2luZm9fdHlwZSk6IERlZmluZS4KLQkoVENfU0VHTUVOVF9JTkZPX1RZUEUpOiBEZWZpbmUuCi0JKHNoX2Zyb2JfbGFiZWwpOiBEZWNsYXJlLgotCSh0Y19mcm9iX2xhYmVsKTogRGVmaW5lLgotCShzaF9mbHVzaF9wZW5kaW5nX291dHB1dCk6IERlY2xhcmUuCi0JKG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogRGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKG1kX2Fzc2VtYmxlKTogSWYgcmVsYXhpbmcsIGVtaXQgYSBSX1NIX0NPREUKLSAJcmVsb2MgYmVmb3JlIHRoZSBpbnN0cnVjdGlvbiBpZiBuZWNlc3NhcnkuCi0JKHNoX2Zyb2JfbGFiZWwpOiBOZXcgZnVuY3Rpb24uCi0JKHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0KTogTmV3IGZ1bmN0aW9uLgotCShzaF9jb2ZmX2Zyb2JfZmlsZSk6IElnbm9yZSBBTElHTiwgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcwotCXdoZW4gbG9va2luZyBmb3IgdGhlIHJlbG9jIGZvciB0aGUgdGFyZ2V0IG9mIC51c2VzLgotCShtZF9jb252ZXJ0X2ZyYWcpOiBGaXggcHJpbnRmIGZvcm1hdCAoJTB4bHggdG8gMHglbHgpLgotCShzaF9mb3JjZV9yZWxvY2F0aW9uKTogRm9yY2UgQ09ERSwgREFUQSwgYW5kIExBQkVMIHJlbG9jcyB0byBiZQotCWVtaXR0ZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IElnbm9yZSBDT0RFLCBEQVRBLCBhbmQgTEFCRUwgcmVsb2NzLgotCShzaF9jb2ZmX3JlbG9jX21hbmdsZSk6IEZvcmNlIENPREUsIERBVEEsIGFuZCBMQUJFTCByZWxvY3MgdG8gdXNlCi0JdGhlIGFic29sdXRlIHN5bWJvbC4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEFkZCB0Y19zZWdtZW50X2luZm9fZGF0YSBmaWVsZCBpZgotCVRDX1NFR01FTlRfSU5GT19UWVBFIGlzIGRlZmluZWQuCi0KLVdlZCBNYXkgMTUgMTI6MjM6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTM4Ni5jIChtZF9hc3NlbWJsZSk6IE1ha2Ugc3VyZSB0aGUgb3Bjb2RlIHN1ZmZpeAotCW1hdGNoZXMgdGhlIHJlZ2lzdGVyIHNpemUuCi0KLVdlZCBNYXkgMTUgMDg6MzM6MzcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY291bnRfZW50cmllc19pbl9jaGFpbik6IElnbm9yZSBGaXh1cHMgd2l0aAotCWZ4X2RvbmUgc2V0LiAKLQkoZG9fcmVsb2NzX2Zvcik6IExpa2V3aXNlLgotCShmaXh1cF9zZWdtZW50KTogRG9uJ3QganVzdCBxdWl0IGlmIGxpbmtyZWxheCBpcyBzZXQuICBUcnkgdG8KLQlhcHBseSBub24gcGMtcmVsYXRpdmUgc3ltMS1zeW0yIGZpeHVwcywgZXZlbiBpZiBsaW5rcmVsYXggaXMKLQlub256ZXJvLgotCi1GcmkgTWF5IDEwIDE0OjE2OjU5IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfZWxmX3ZhbGlkYXRlX2ZpeCk6IEFsbG93IEdPVCBhbmQgc2VjdGlvbgotCXJlbGF0aXZlIHJlbG9jYXRpb25zIHdpdGggLW1yZWxvY2F0YWJsZS4gIEFsc28gYWxsb3cgdW5maXhlZAotCXJlbG9jcyBpbiAuZXhfc2hhcmVkLgotCi1UdWUgTWF5ICA3IDExOjI0OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmMgKHlhbmtfc3ltYm9scyk6IENoZWNrIHRoYXQgRk5BTUVfT0ZGU0VUIGlzCi0Jbm9uLXplcm8gYmVmb3JlIGFzc3VtaW5nIHRoaXMgaXMgYSBsb25nIGZpbGUgbmFtZS4KLQkod19zdHJpbmdzKTogTGlrZXdpc2UuCi0JKGNfZG90X2ZpbGVfc3ltYm9sKTogU2V0IEZOQU1FX09GRlNFVCB0byAxIGZvciBhIGxvbmcgZmlsZSBuYW1lLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAod19zdHJpbmdzKTogTW92ZSBkZWNsYXJhdGlvbiBvZiBpIGluc2lkZQotCSNpZmRlZiBibG9jayB3aGljaCB1c2VzIGl0LgotCi1UdWUgTWF5ICA3IDAwOjQ5OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IFJlbmFtZSBsYXN0IGFyZ3VtZW50IHRvCi0JInJlbGF4bW9kZSIuICBPdXRwdXQgcmVsb2NzIHdoaWNoIGlkZW50aWZ5IHZhcmlvdXMgcmVsYXhpbmcKLQlwb3NzaWJpbGl0aWVzIGZvciBtb3YuW2J3bF0gaW5zdHJ1Y3Rpb25zLgotCShidWlsZF9ieXRlcyk6IFBhc3MgaW4gYSByZWxheGluZyBtb2RlIHRvIGRvX2FfZml4X2ltbS4KLQotTW9uIE1heSAgNiAxNToyNjoyOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtYXJtLmggKFRDX0hBTkRMRVNfRlhfRE9ORSk6IERlZmluZS4KLQkoTURfQVBQTFlfRklYMyk6IERlZmluZS4KLQkqIGNvbmZpZy90Yy1hcm0uYyAobXlfZ2V0X2V4cHJlc3Npb24pOiBPbmx5IHdhdGNoIGZvciBiYWQgc2VnbWVudHMKLQlpZiBPQkpfQU9VVC4KLQkobWRfYXBwbHlfZml4Myk6IFJlbmFtZWQgZnJvbSBtZF9hcHBseV9maXguCi0JSWYgcGNyZWwgcmVsb2MgYW5kIHN5bWJvbCBpcyBpbiBkaWZmZXJlbnQgc2VjdGlvbiwgdW5kbyBlZmZlY3RzCi0Jb2YgbWRfcGNyZWxfZnJvbS4KLQotU2F0IE1heSAgNCAxMjo0OTozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKGhwcGFfZml4X2FkanVzdGFibGUpOiBEb24ndCBhZGp1c3QKLQlhbnkgcmVsb2Mgd2l0aCBhbiBMUiUgb3IgUlIlIGZpZWxkIHNlbGVjdG9yIGZvciBTT00uCi0KLVNhdCBNYXkgIDQgMTE6MjY6MTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHN1YnNlZ3MuaCB0byBhcHByb3ByaWF0ZSBUQVJHX0NQVV9ERVBfKgotIAl2YXJpYWJsZXMuCi0KLUZyaSBNYXkgIDMgMTc6NTg6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoY29mZl9mcm9iX3N5bWJvbCk6IERvbid0IG1lcmdlIGEgc3ltYm9sIHdpdGgKLQlTRl9HRVRfU1RBVElDUyBzZXQuCi0JKHlhbmtfc3ltYm9scyk6IExpa2V3aXNlLgotCi1XZWQgTWF5ICAxIDEzOjM4OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IElmIE1BTllfU0VHTUVOVFMgYW5kIG5vdAotCUJGRF9BU1NFTUJMRVIsIGFkZCBuYW1lIGZpZWxkLgotCSogY29uZmlnL29iai1jb2ZmLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoY29mZl9oZWFkZXJfYXBwZW5kKTogSGFuZGxlIGxvbmcgc2VjdGlvbiBuYW1lcy4KLQkoY3Jhd2xfc3ltYm9scyk6IEp1c3QgdXNlIHRoZSBuYW1lIGZpZWxkIGZvciB0aGUgc3ltYm9sIG5hbWUsCi0Jd2l0aG91dCB3b3JyeWluZyBhYm91dCBudWxsIGJ5dGUgdGVybWluYXRpb24uCi0JKHdfc3RyaW5ncyk6IEhhbmRsZSBsb25nIHNlY3Rpb24gbmFtZXMuCi0JKHdyaXRlX29iamVjdF9maWxlKTogTGlrZXdpc2UuICBBbHNvLCB1c2UgdGhlIG5hbWUgZmllbGQsIHJhdGhlcgotCXRoYW4gc2NuaGRyLnNfbmFtZS4KLQkob2JqX2NvZmZfYWRkX3NlZ21lbnQpOiBQZXJtaXQgbG9uZyBzZWN0aW9uIG5hbWVzLgotCShvYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbik6IFVzZSB0aGUgbmFtZSBmaWVsZCwgcmF0aGVyIHRoYW4KLQlzY25oZHIuc19uYW1lLgotCShhZGp1c3Rfc3RhYl9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGUtcGUuaCAoQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMpOiBEZWZpbmUuCi0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKGJydGFiX2VtaXQpOiBEb24ndCBzZXQgZnhfaW1fZGlzcCBmaWVsZC4KLQkobWVtX2ZtdCk6IExpa2V3aXNlLgotCShtZF9hcHBseV9maXgpOiBEb24ndCBjaGVjayBmeF9pbV9kaXNwIGZpZWxkLgotCi1UaHUgQXByIDI1IDExOjM5OjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGQgKiBhZnRlciBzcGFyYyotKi12eHdvcmtzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JKiBhcHAuYyAoZG9fc2NydWJfYmVnaW4pOiBJZiB0Y19jb21tZW50X2NoYXJzIGlzIG5vdCBkZWZpbmVkLAotCWRlZmluZSBpdCB0byBjb21tZW50X2NoYXJzLiAgVXNlIHRjX2NvbW1lbnRfY2hhcnMgcmF0aGVyIHRoYW4KLQljb21tZW50X2NoYXJzLgotCShkb19zY3J1Yl9jaGFycyk6IFVzZSB0Y19jb21tZW50X2NoYXJzIHJhdGhlciB0aGFuIGNvbW1lbnRfY2hhcnMuCi0JKiBjb25maWcvdGMtbTY4ay5oICh0Y19jb21tZW50X2NoYXJzKTogRGVmaW5lLgotCShtNjhrX2NvbW1lbnRfY2hhcnMpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW02OGsuYyAobTY4a19jb21tZW50X2NoYXJzKTogUmVuYW1lIGZyb20KLQljb21tZW50X2NoYXJzLiAgQ2hhbmdlIGludG8gYSBwb2ludGVyIHJhdGhlciB0aGFuIGFuIGFycmF5LgotCShtZF9sb25nb3B0cyk6IEFkZCAiYml0d2lzZS1vciIuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSBPUFRJT05fQklUV0lTRV9PUi4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLS1iaXR3aXNlLW9yLgotCSogZG9jL2MtbTY4ay50ZXhpOiBEb2N1bWVudCAtLWJpdHdpc2Utb3IuCi0KLVdlZCBBcHIgMjQgMTE6Mjg6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbTY4ay5jIChtNjhrX2lwKTogUHJldmVudCBhdHRlbXB0cyB0byB1c2UgbG9uZyBvZmZzZXRzCi0gCWluIDY4MDAwIG1vZGUuCi0KLQkqIGNvbmZpZy9vYmotY29mZi5jIChvYmpfY29mZl9zZWN0aW9uKTogQkZEX0FTU0VNQkxFUiB2ZXJzaW9uOgotCWNhbGwgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4gIE5vbiBCRkRfQVNTRU1CTEVSIHZlcnNpb246Ci0JY29ycmVjdCBoYW5kbGluZyBvZiBpbnB1dCBsaW5lIHBvaW50ZXIsIGFuZCBjYWxsCi0JZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZS4KLQotTW9uIEFwciAyMiAxODowMjozNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGJsdWVzLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChpbl9iaXRmaWVsZF9yYW5nZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHNwYXJjX2lwKTogTmV3IGNhc2VzIFgsWS4gIFVzZSBTUEFSQ19PUENPREVfQVJDSF9WOV9QLgotCShtZF9hcHBseV9maXgsIGNhc2VzIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMiwKLQlCRkRfUkVMT0NfU1BBUkNfe1dESVNQMTYsV0RJU1AxOX0pOiBGaXggdW5kZWZpbmVkIGNvZGUuCi0JKG1kX2FwcGx5X2ZpeCk6IE5ldyBjYXNlcyBCRkRfUkVMT0NfU1BBUkNfWzU2XS4KLQkodGNfZ2VuX3JlbG9jKTogTmV3IGNhc2VzIEJGRF9SRUxPQ19TUEFSQ19bNTZdLgotCi1UaHUgQXByIDE4IDE4OjU4OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmM6IEJGRF9BU1NFTUJMRVI6Ci0gCShjb2ZmX2xhc3RfYmYpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShjb2ZmX2Zyb2Jfc3ltYm9sKTogU2V0IGVuZG5keCBvZiBhIC5iZiBzeW1ib2wuCi0JTm9uIEJGRF9BU1NFTUJMRVI6Ci0JKG9ial9jb2ZmX2VuZGVmKTogQ2FsbCBTRl9TRVRfUFJPQ0VTUyBvbiBhIC5iZiBzeW1ib2wuCi0JKGxhc3RfYmZQKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoeWFua19zeW1ib2xzKTogU2V0IGVuZG5keCBvZiBhIC5iZiBzeW1ib2wuCi0KLVRodSBBcHIgMTggMTE6NTM6NTggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciBTb2xhcmlzJ3MgLWxlCi0JYW5kIC1zIG9wdGlvbnMuICBBZGQgLWJlIGZvciBnb29kIG1lYXN1cmUuCi0KLVdlZCBBcHIgMTcgMTI6MzE6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByZWFkLmMgKHNfc3BhY2UpOiBTdXBwb3J0IG5vbi1jb25zdGFudCBmaWxsIHZhbHVlLiAgSGFuZGxlIGZpbGwKLQl2YWx1ZSBjb3JyZWN0bHkgZm9yIGEgc2l6ZSBvdGhlciB0aGFuIDEuCi0KLVR1ZSBBcHIgMTYgMTU6MTc6NDAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFybS5jIChteV9nZXRfZmxvYXRfZXhwcmVzc2lvbik6IFVwZGF0ZSBjYWxsIHRvCi0JZ2VuX3RvX3dvcmRzLCBYX1BSRUNJU0lPTiBjaGFuZ2VkIGZyb20gNiB0byA1LgotCi1UdWUgQXByIDE2IDEwOjI1OjQyIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChyZWdpc3Rlcl9uYW1lLHJlZ19uYW1lX3NlYXJjaCk6IE1vdmUgcmVnaXN0ZXIKLQluYW1lIGxvb2t1cCBmcm9tIFBFIHNwZWNpZmljIGNvZGUgdG8gYWxsIHRhcmdldHMuICBBZGQgc3VwcG9ydCBmb3IKLQktbXJlZ25hbWVzLy1tbm8tcmVnbmFtZXMgdG8gY29udHJvbCB3aGV0aGVyIHJlZ2lzdGVyIG5hbWVzIGFyZQotCWV4cGFuZGVkIG9yIG5vdC4KLQkobWRfYXNzZW1ibGUpOiBDYWxsIHJlZ2lzdGVyX25hbWUgZm9yIGFsbCBwbGF0Zm9ybXMuCi0JKG1kX3BhcnNlX29wdGlvbik6IEFkZCBzdXBwb3J0IGZvciAtbXJlZ25hbWVzLy1tbm8tcmVnbmFtZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwY2xlKi0qLXNvbGFyaXMpOiBBZGQgc3VwcG9ydC4KLQkocG93ZXJwYyotKi1saW51eCk6IERpdHRvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWcvcHBjLXNvbC5tdDogTmV3IGNvbmZpZyBmaWxlIGZvciBQb3dlclBDIFNvbGFyaXMuCi0KLU1vbiBBcHIgMTUgMTI6MjY6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtbWlwcy5jIChtaXBzX2Zyb2JfZmlsZSk6IFBlcm1pdCBtdWx0aXBsZSAlaGkgcmVsb2NzIHRvCi0JYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlICVsbyByZWxvYy4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9hZGRyZXNzKTogQ2FzdCBYX2FkZF9udW1iZXIgdG8gdmFsdWVUCi0JYmVmb3JlIGNvbXBhcmluZyBhZ2FpbnN0IE1BWF9HUFJFTF9PRkZTRVQsIHNvIHRoYXQgbmVnYXRpdmUKLQludW1iZXJzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQkobWFjcm8pOiBMaWtld2lzZS4KLQotVGh1IEFwciAxMSAxMjozOTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChsYXN0X2luc24pOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IFdhcm4gYWJvdXQgcHV0dGluZyBmbG9hdGluZyBwb2ludCBicmFuY2hlcyBpbiBhCi0JZGVsYXkgc2xvdC4gIElmIGFyY2hpdGVjdHVyZSBpcyBsZXNzIHRoYW4gdjksIGluc2VydCBOT1AKLQlpbnN0cnVjdGlvbnMgYmV0d2VlbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgYW5kIGZsb2F0aW5nCi0JcG9pbnQgYnJhbmNoZXMuICAoVGhlIFN1bk9TIGFzc2VtYmxlciBkb2VzIGJvdGggdGhlc2Ugb3BlcmF0aW9ucy4pCi0JU2F2ZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvcGNvZGUuCi0JKHNwYXJjX2lwKTogQWRkIHBpbnNuIHBhcmFtZXRlci4gIENoYW5nZSBjYWxsZXIuCi0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KTogQ29ycmVjdCBjaGVjawotCWZvciBieXRlIGp1bXAgdG8gbmV4dCBpbnN0cnVjdGlvbiB0byBza2lwIGVtcHR5IGZyYWdzLgotCi1XZWQgQXByIDEwIDE2OjQ4OjEyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWFscGhhLmMgKGFscGhhX2lwKTogSWYgd2UgYXJlIGdvaW5nIHRvIGNhbGwgZW1pdF9hZGQ2NAotCWZvciBhZGRxIHdpdGggYSAxNiBiaXQgc2lnbmVkIHZhbHVlLCBqdXN0IGVtaXQgYSBsZGEgaW5zdHJ1Y3Rpb24KLQlpbnN0ZWFkLgotCi1XZWQgQXByIDEwIDE0OjM0OjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKGRvX2FfZml4X2ltbSk6IERvbid0IGN1dCBvZmYgaGlnaCBiaXRzCi0Jb2YgYSAzMmJpdCBvcGVyYW5kLgotCi1Nb24gQXByICA4IDE0OjQyOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBBcHIgIDUgMTc6MDE6MzUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoZ2V0X3NwZWNpZmljKTogUmVtb3ZlIHNvbWUgI2lmIDAgY29kZS4KLQkoYnVpbGRfYnl0ZXMpOiBSZW1vdmUgYWxsIEFCU01PViByZWxhdGVkIGNvZGU7IGl0J3MgdW5uZWNlc3NhcnkuCi0KLUZyaSBBcHIgIDUgMTU6MTM6MTAgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy9hdG9mLWllZWUuYzogRml4IGhhbmRsaW5nIG9mIGRlbm9ybWFsaXplZCBleHRlbmRlZAotCXByZWNpc2lvbiBudW1iZXJzIGFuZCBvdmVyZmxvdy91bmRlcmZsb3cgZGV0ZWN0aW9uLgotCShNQVhfUFJFQ0lTSU9OLCBYX1BSRUNJU0lPTiwgUF9QUkVDSVNJT04pOiBDaGFuZ2VkIGZyb20gNiB0byA1LCB0bwotCW5vdCBpbmNsdWRlIHRoZSAxNiBiaXQgZ2FwIGluIHRoZSBtNjhrIGV4dGVuZGVkIHByZWNpc2lvbiBmb3JtYXQuCi0KLUZyaSBBcHIgIDUgMTQ6Mjk6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBpMzg2LSotZnJlZWJzZGVsZiogdGFyZ2V0OyBmcm9tIEpvaG4gUG9sc3RyYQotCTxqZHBAcG9sc3RyYS5jb20+LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1GcmkgQXByICA1IDE4OjM5OjI4IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYzogQWxsb3cgbm9uLXplcm8gb2Zmc2V0cyBmcm9tIC5zZGF0YSBzeW1ib2xzIHRvCi0gCWJlIGFjY2Vzc2VkIHVzaW5nIHRoZSAkZ3AgcmVnaXN0ZXIuCi0JKiBjb25maWcvdGMtbWlwcy5oIChNQVhfR1BSRUxfT0ZGU0VUKTogQWRkZWQuCi0KLVdlZCBBcHIgIDMgMTA6NTY6MTQgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmMgKHNwYXJjX21kX2VuZCk6IFNldCBiZmQgbWFjaGluZSBudW1iZXIgdG8KLQliZmRfbWFjaF9zcGFyY19zcGFyY2xldCBpZiBjdXJyZW50X2FyY2hpdGVjdHVyZSBpcyBzcGFyY2xldC4KLQotTW9uIEFwciAgMSAxNjo1NTo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAoZ2V0X2xpbmVfc2IpOiBCdW1wIGxpbmUgY291bnRlcnMgYmFzZWQgb24KLQlpbnB1dF9saW5lX3BvaW50ZXJbLTFdLCBub3QgKmlucHV0X2xpbmVfcG9pbnRlci4gIERvbid0IGJvdGhlciB0bwotCWNhbGwgTElTVElOR19ORVdMSU5FLgotCShzX21hY3JvKTogRG9uJ3QgY2FsbCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lLgotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogV2hlbiBoYW5kbGluZyBDIHN0eWxlIGNvbW1lbnRzLCB1bmdldAotCWNoMiByYXRoZXIgdGhhbiBjaC4KLQotRnJpIE1hciAyOSAxNjoxNTowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuaCAoZW51bSBsaW5rb25jZV90eXBlKTogRGVmaW5lLgotCShzX2xpbmtvbmNlKTogRGVjbGFyZS4KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAibGlua29uY2UiLgotCShzX2xpbmtvbmNlKTogTmV3IGZ1bmN0aW9uLgotCSogc3Vic2Vncy5oIChzZWdtZW50X2luZm9fdHlwZSk6IEFkZCBsaW5rb25jZSBmaWVsZCB0bwotCU1BTllfU0VHTUVOVFMgJiYgISBCRkRfQVNTRU1CTEVSIHNlY3Rpb24uCi0JKiBjb25maWcvb2JqLWNvZmYuaCAob2JqX2hhbmRsZV9saW5rX29uY2UpOiBEZWZpbmUgaWYgVEVfUEUuCi0JKG9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UpOiBEZWNsYXJlIGlmIFRFX1BFLgotCSogY29uZmlnL29iai1jb2ZmLmM6IElmIFRFX1BFIGFuZCBub3QgQkZEX0FTU0VNQkxFUiwgI2luY2x1ZGUKLQkiY29mZi9wZS5oIi4KLQkob2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSk6IE5ldyBmdW5jdGlvbiwgZGVmaW5lZCBpZiBURV9QRS4KLQkoY19zZWN0aW9uX3N5bWJvbCk6IElmIFRFX1BFLCBzZXQgdGhlIHhfY29tZGF0IGZpZWxkIGluIHRoZSBhdXgKLQllbnRyeSBiYXNlZCBvbiB0aGUgbGlua29uY2UgZmllbGQgaW4gc2VnbWVudF9pbmZvLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IC5saW5rb25jZS4KLQotRnJpIE1hciAyOSAxMTozMToyNyAxOTk2ICBKLlQuIENvbmtsaW4gIChqdGNAbGlzYS5jeWdudXMuY29tKQotCi0JKiBkb2MvYXMuMTogQ2hhbmdlZCB0byBiZSByZWNvZ25pemVkIGJ5IGNhdG1hbiAtdyBvbiBTb2xhcmlzLgotCi1UaHUgTWFyIDI4IDE1OjI3OjQ3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYnMuYyAoc19zdGFiX2dlbmVyaWMpOiBDYWxsIHRoZSBsaXN0aW5nIGZ1bmN0aW9ucyBiZWZvcmUKLQlkb2luZyB0aGUgcmVzdCBvZiB0aGUgcHJvY2Vzc2luZywgd2hpY2ggbWF5IGludm9sdmUgZnJlZWluZyB0aGUKLQlzdHJpbmcuICBQYXNzIHN0cmluZywgbm90IHN0cmluZyArIHN0cm9mZiwgdG8gT0JKX1BST0NFU1NfU1RBQiBpbgotCVNFUEFSQVRFX1NUQUJfU0VDVElPTlMgY2FzZS4KLQotCSogY29uZmlnL3RjLWhwcGEuYzogUmVtb3ZlIG5lc3RlZCBjb21tZW50LgotCSh0Y19nZW5fcmVsb2MpOiBNb3ZlIGxhYmVsIGRvbmUgaW5zaWRlIHRoZSBpZmRlZiBpbiB3aGljaCBpdCBpcwotCXVzZWQuCi0JKG1kX2FwcGx5X2ZpeCk6IFBhc3MgcG9pbnRlcnMgdG8gY29ycmVjdCB0eXBlcyB0byBsaWJocHBhLmgKLQlmdW5jdGlvbnMuICBBbHdheXMgcmV0dXJuIGEgdmFsdWUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmggKHRjX2Zyb2JfZmlsZSk6IERlZmluZS4KLQkobWlwc19mcm9iX2ZpbGUpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLW1pcHMuYyAoc3RydWN0IG1pcHNfaGlfZml4dXApOiBEZWZpbmUuCi0JKG1pcHNfaGlfZml4dXBfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGltbV91bm1hdGNoZWRfaGkpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShtZF9hc3NlbWJsZSk6IENsZWFyIGltbV9yZWxvYywgaW1tX3VubWF0Y2hlZF9oaSwgYW5kCi0Jb2Zmc2V0X3JlbG9jLiAgUGFzcyBpbW1fdW5tYXRjaGVkX2hpIHRvIGFwcGVuZF9pbnNuLgotCShhcHBlbmRfaW5zbik6IEFkZCB1bm1hdGNoZWRfaGkgcGFyYW1ldGVyLiAgSWYgaXQgaXMgc2V0LCBhZGQgdGhlCi0JbmV3IGZpeHVwIHRvIG1pcHNfaGlfZml4dXBfbGlzdC4gIENoYW5nZSBhbGwgY2FsbGVycy4KLQkobWlwc19pcCk6IFNldCBpbW1fdW5tYXRjaGVkX2hpIHdoZW4gYXBwcm9wcmlhdGUuCi0JKG1pcHNfZnJvYl9maWxlKTogTmV3IGZ1bmN0aW9uLgotCi1UaHUgTWFyIDI4IDExOjQ3OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMtKi1zb2xhcmlzMiopOiBSZW5hbWVkIGZyb20gc3BhcmMqLSotc29sYXJpczIqLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVHVlIE1hciAyNiAxODoxOToxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFzLmMgKG1haW4pOiBDYWxsIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lLgotCi1GcmkgTWFyIDIyIDExOjEzOjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoc3RyZHVwKTogRG9uJ3QgZGVjbGFyZS4KLQkqIHN0YWJzLmM6IEluY2x1ZGUgbGliaWJlcnR5LmgKLQkoZ2V0X3N0YWJfc3RyaW5nX29mZnNldCk6IFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkoc19zdGFiX2dlbmVyaWMpOiBMaWtld2lzZS4KLQkqIGFzLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCk6IExpa2V3aXNlLgotCi0JKiBnYXNwLmMgKGNoYW5nZV9iYXNlKTogUmVjb2duaXplIFwoLi4uKSBjb25zdHJ1Y3QgZG9jdW1lbnRlZCB0bwotCXBhc3MgdGhyb3VnaCBlbmNsb3NlZCBjaGFyYWN0ZXJzIGxpdGVyYWxseSB0aHJvdWdoIHRvIHRoZSBvdXRwdXQuCi0JKHByb2Nlc3NfYXNzaWducyk6IExpa2V3aXNlLiAgQWxzbywgYmUgbW9yZSBjYXJlZnVsIHRvIGF2b2lkCi0JbG9va2luZyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KLQotVGh1IE1hciAyMSAxMzoxODo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pMzg2LmMgKG1kX3BhcnNlX29wdGlvbik6IElmIE9CSl9FTEYsIGlnbm9yZSAtayBmb3IKLQlGcmVlQlNEIGNvbXBhdGliaWxpdHkuICBGcm9tIEpvaG4gUG9sc3RyYSA8amRwQHBvbHN0cmEuY29tPi4KLQotV2VkIE1hciAyMCAxODoxMzozMiAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZG9jL2FzLnRleGluZm8sIGRvYy9jLWk5NjAudGV4aTogRml4IHR5cG9zLgotCi1XZWQgTWFyIDIwIDE3OjA1OjE2IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvbmZpZy9hbHBoYS1vcGNvZGUuaDogQWRkZWQgY3Z0c3QgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBNYXIgMTggMTM6MTI6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9zdGFiKTogRG9uJ3QgdHJ5IHRvIG1ha2UgYSBzeW1ib2wgb3V0IG9mIHRoZSBzdGFiCi0Jc3RyaW5nLiAgRXh0cmFjdCB0aGUgYWRkZW5kIGZyb20gdGhlIHJlc3VsdCBvZiBleHByZXNzaW9uLgotCi1GcmkgTWFyIDE1IDE3OjEwOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXBwLmMgKGRvX3NjcnViX2NoYXJzKTogSWYgd2hpdGVzcGFjZSBpcyBzZWVuIGluIHN0YXRlIDExLCBhbmQKLQlMQUJFTFNfV0lUSE9VVF9DT0xPTlMgaXMgbm90IGRlZmluZWQsIGFuZCB3ZSBhcmUgbm90IGluIG02OGsgTVJJCi0JbW9kZSwgY2hhbmdlIHRoZSBzdGF0ZSB0byAzIHJhdGhlciB0aGFuIDEuCi0KLVRodSBNYXIgMTQgMTg6MTg6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoQ19SRUdJU1RFUl9TRUNUSU9OKTogQ2hhbmdlIGZyb20gMjAgdG8gNTAsIHRvCi0JY29ycmVzcG9uZCB0byAxMSBNYXJjaCBjaGFuZ2UuCi0KLVRodSBNYXIgMTQgMTU6Mjc6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaDgzMDAuYyAoYnVpbGRfYnl0ZXMsIE1FTUlORCBjYXNlKTogR2VuZXJhdGUKLQlhbiBSX01FTV9JTkRJUkVDVCByZWxvYyByYXRoZXIgdGhhbiBSX1JFTEJZVEUuCi0KLVR1ZSBNYXIgMTIgMTI6MjE6MTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLU1vbiBNYXIgMTEgMTg6NTc6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvYXRvZi1pZWVlLmMgKGdlbl90b193b3Jkcyk6IEltcHJvdmUgaGFuZGxpbmcgb2YKLQlYX1BSRUNJU0lPTiBudW1iZXJzLiAgQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEFuZHJlYXMgU2Nod2FiCi0JPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4uCi0KLU1vbiBNYXIgMTEgMDk6NTk6NTMgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoU0VHX05PUk1BTCwgU0VHX0xJU1QpOiBCdW1wIHNlZ21lbnQgbGltaXQgZnJvbSAxMCB0byA0MC4KLQkoU0VHX0xBU1QpOiBOZXcuCi0JKiBzdWJzZWdzLmMgKE1BTllfU0VHTUVOVFMpOiBJbmNyZWFzZSBzZWdtZW50IGxpbWl0LgotCSogb2JqLWNvZmYuYyAoc2VnX05fVFlQRSwgc2VnX2luZm9fb2ZmX2J5XzQpOiBMaWtld2lzZS4KLQkoZG9fcmVsb2NzX2Zvciwgd19zeW1ib2xzLCBvYmpfY29mZl9hZGRfc2VnbWVudCwgZG9fbGluZW5vc19mb3IsCi0JY3Jhd2xfc3ltYm9scywgY29mZl9oZWFkZXJfYXBwZW5kKTogTG9vcCB0byBTRUdfTEFTVCByYXRoZXIgdGhhbgotCVNFR19FOS4KLQkKLVRodSBNYXIgIDcgMTU6MTc6MzkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IEhhbmRsZSBvcGVyYW5kIGNoYXIgJ08nIChuZWcgcmVnKS4KLQotVGh1IE1hciAgNyAwOToxOToxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy90Yy1ocHBhLmMgKFNVQlNFR19NSUxMSSk6IERlZmluZS4KLQkocGFfZGVmX3N1YnNwYWNlcyk6IEFkZCAkTUlMTElDT0RFJC4KLQkocGFfc3BhY2VzX2JlZ2luKTogU2V0IHNlY3Rpb24gZmxhZ3MgZm9yICRNSUxMSUNPREUkLgotCi1XZWQgTWFyICA2IDE0OjExOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogT25seSBTRUNfTE9BRCBpZiB0aGUgdHlwZSBpcwotCW5vdCBTSFRfTk9CSVRTLiAgRG9uJ3QgdGFtcGVyIHdpdGggZmxhZ3MgYmFzZWQgb24gdHlwZSBpZiBhCi0Jc3BlY2lhbCBzZWN0aW9uIHdhcyBmb3VuZCAocmV2ZXJ0IEZlYiAyOSBjaGFuZ2UpLgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBPbmx5IGFsaWduIHVzaW5nIHRoZSBub3AgcGF0dGVybgotCWlmIGFsaWduaW5nIHRvIGEgbG9uZ3dvcmQgYm91bmRhcnkgb3IgZ3JlYXRlci4KLQotVHVlIE1hciAgNSAxNToxMDo0MyAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IFBhc3MgMSBub3QgMiB0byBmcmFnX2FsaWduLgotCi1Nb24gTWFyICA0IDIwOjUwOjU3IDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWN5Z3dpbjMyKTogRG9uJ3QgdXNlIGJmZF9nYXMuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCi1Nb24gTWFyICA0IDEwOjEzOjA2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3RjLWhwcGEuYzogQWRkIGRlZmF1bHQgZGVmaW5pdGlvbnMgZm9yIFJfTjBTRUwgYW5kCi0JUl9OMVNFTCBzaW5jZSB0aGV5J3JlIG5vdCBkZWZpbmVkIGZvciBvbGQgdmVyc2lvbnMgb2YgaHB1eC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAodGNfZ2VuX3JlbG9jKTogRml4IHR5cG8gaW4gUl9DT01QMiBjb2RlLgotCVNldCAic3ltX3B0cl9wdHIiIGFuZCAiYWRkZW5kIiBmaWVsZHMgdG8gZHVtbXkgdmFsdWVzIGZvcgotCVJfTjBTRUwgYW5kIFJfTjFTRUwuCi0KLUZyaSBNYXIgIDEgMTA6MjA6NTIgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGZsb251bS1rb25zdC5jOiBBZGQgdHdvIG1vcmUgY29uc3RhbnRzIGZvciAxZSstMjA0OCBhbmQKLQkxZSstNDA5NiwgYW5kIGNvcnJlY3QgdGhlIG90aGVyIGNvbnN0YW50cy4KLQotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IEhhbmRsZSBPX2xvZ2ljYWxfbm90LgotCi1UaHUgRmViIDI5IDEzOjU4OjM1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl9zZWN0aW9uKTogQWxsb3cgcHJlZGVmaW5lZCBzZWN0aW9uCi0JdHlwZXMgdG8gc2V0IHRoZSBub2JpdHMgdHlwZS4gIEF2b2lkIGEgc2hhZG93ZWQgZGVjbGFyYXRpb24uCi0KLVdlZCBGZWIgMjggMTU6Mzg6NTYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb25maWcvdGMtaHBwYS5jIChocHBhX2ZpeF9hZGp1c3RhYmxlKTogRm9yIFNPTSwgZG9uJ3QKLQlyZWR1Y2UgcmVsb2NzIHVzaW5nIGVfbmxyc2VsIGZpZWxkIHNlbGVjdG9ycy4KLQotCSogd3JpdGUuYyAoZml4X25ld19leHApOiBEb24ndCB1c2UgI2VsaWYuICBTb21lIGNvbXBpbGVycwotCWRvbid0IGhhbmRsZSBpdC4KLQotCSogY29uZmlnL3RjLWhwcGEuYyAoc2VsZWN0b3JfdGFibGUpOiBBZGQgIm4iLCAibmwiLCBhbmQgIm5sciIgdG8KLQl0aGUgc2VsZWN0b3IgdGFibGUuCi0JKHBhX2Noa19maWVsZF9zZWxlY3Rvcik6IEhhbmRsZSBuZXcgZmllbGQgc2VsZWN0b3JzIGZvciBTT00uCi0KLVR1ZSBGZWIgMjcgMTQ6NDI6MjcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLWxpbnV4KmFvdXQqLCBtNjhrLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvdGUtbGludXguaCAoTE9DQUxfTEFCRUxTX0ZCKTogRGVmaW5lLgotCSogY29uZmlnL3RjLW02OGsuaCAoVEFSR0VUX0ZPUk1BVCkgW1RFX0xJTlVYXTogRGVmaW5lIHRvCi0JImEub3V0LW02OGstbGludXgiLgotCSogY29uZmlnL3RjLW02OGsuYyAoY29tbWVudF9jaGFycyk6IERvbid0IGluY2x1ZGUgJyMnIGlmIFRFX0xJTlVYCi0JaXMgZGVmaW5lZC4KLQotTW9uIEZlYiAyNiAxODo1ODo1OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogVXBkYXRlIHRvIGhhbmRsZSBzaGFyZWQgbGlicmFyeSBzdXBwb3J0LgotCi1Nb24gRmViIDI2IDEwOjM0OjEwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoc3BhcmNfaXApOiBQcmludCBhbGwgYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQKLQl0aGUgaW5zbiBvbiBtaXNtYXRjaC4KLQotRnJpIEZlYiAyMyAyMTo0NDozOSAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBhMjktY29mZi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEZlYiAyMiAxNjozOTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9jb2ZmX2Zyb2JfZmlsZSk6IERvbid0IGNvbnNpZGVyIHRoZSBhZGRyZXNzCi0Jb2YgdGhlIHNlY3Rpb24gd2hlbiBsb29raW5nIGZvciB0aGUgUl9TSF9VU0VTIGZpeHVwLCBiZWNhdXNlIHRoZQotCWZyYWcgYWRkcmVzc2VzIGhhdmUgbm90IHlldCBiZWVuIGFkanVzdGVkLgotCi0JKiBnZGJpbml0LmluOiBTZXQgYSBicmVha3BvaW50IG9uIGFzX3dhcm5fd2hlcmUuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKG1hY3JvKTogQWRkIG1pc3NpbmcgYXJndW1lbnRzIHRvIG1hY3JvX2J1aWxkCi0Jb21pdHRlZCBpbiBsYXN0IGNoYW5nZS4gIEZyb20gSmltIFdpbHNvbiA8d2lsc29uQGN5Z251cy5jb20+LgotCi1XZWQgRmViIDIxIDE3OjAwOjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWg4MzAwLmMgKHRjX3JlbG9jX21hbmdsZSk6IENoYW5nZSByZWxvYyBiYXNlZCBvbiBzaXplCi0JaWYgaXQgaXMgVENfQ09OU19SRUxPQy4gIFNldCBhIHNpemUgb2YgNCB0byBSX1JFTExPTkcuCi0KLVdlZCBGZWIgMjEgMDk6MjU6MzkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChzcGFyY19pcCk6IFJlY29nbml6ZSAlYXNyMCBmb3IgdjguCi0KLVR1ZSBGZWIgMjAgMjE6NDg6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChwYXJzZV9rZXl3b3JkX2FyZyk6IEFjY2VwdCBsZWFkaW5nICclJy4KLQkoc3BhcmNfaXApOiBBY2NlcHQgJWFzclsxLi4zMV0gZm9yIHY4IGFuZCAlYXNyWyUxNi4uMzFdIGZvciB2OS4KLQlSZWNvZ25pemUgW3VVXSBmb3JtYXQgYXJncyBhcyBzcGFyY2xldCBjcHJlZ3MuCi0KLVR1ZSBGZWIgMjAgMjI6MjU6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfaGFuZGxlX2FsaWduKTogRG9uJ3QgZW1pdCBSX1NIX0FMSUdOIHJlbG9jcwotCWluIGJzc19zZWN0aW9uLgotCi1Nb24gRmViIDE5IDE0OjE2OjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXNwYXJjLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IENoZWNrIFNfSVNfV0VBSyBhcwotCXdlbGwgYXMgU19JU19FWFRFUk5BTC4KLQkodGNfZml4X2FkanVzdGFibGUpOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zcGFyYy5jIChtZF9hcHBseV9maXgpOiBJbiBPQkpfRUxGIGNhc2UsIGNoZWNrIGZvcgotCVNfSVNfV0VBSyBhcyB3ZWxsIGFzIFNfSVNfRVhURVJOQUwgd2hlbiBkZWNpZGluZyB3aGV0aGVyIHRvIHJldHVybgotCWVhcmx5LgotCSh0Y19nZW5fcmVsb2MpOiBDaGVjayBTX0lTX1dFQUsgYXMgd2VsIGFzIFNfSVNfRVhURVJOQUwgd2hlbgotCWRlY2lkaW5nIHdoZXRoZXIgdG8gY29udmVydCBCRkRfUkVMT0NfMzJfUENSRUxfUzIgaWYgUElDLgotCi1Nb24gRmViIDE5IDAyOjE1OjU3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAobWF4X2FyY2hpdGVjdHVyZSk6IENoYW5nZSB0byBzcGFyY2xpdGUgZm9yCi0JMzIgYml0IGFyY2guCi0JKGRlZmF1bHRfY29tcGF0aWJsZSk6IERlbGV0ZS4KLQkoc3BhcmNfZmZzKTogTmV3IGZ1bmN0aW9uLgotCShtZF9iZWdpbik6IE9ubHkgY2FsbCBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCBvbmNlLgotCShzcGFyY19pcCk6IFJld3JpdGUgYXJjaGl0ZWN0dXJlIG1hdGNoIGFuZCBidW1wIGxvZ2ljLgotCi1TdW4gRmViIDE4IDE1OjAzOjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLSAJdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBGZWIgMTYgMTY6NTM6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWNvZmYuaCAoU0ZfQURKX0xOTk9QVFIpOiBEZWZpbmUgKG5vbiBCRkRfQVNTRU1CTEVSKS4KLQkoU0ZfR0VUX0FESl9MTk5PUFRSKTogRGVmaW5lIChub24gQkZEX0FTU0VNQkxFUikuCi0JKFNGX1NFVF9BREpfTE5OT1BUUik6IERlZmluZSAobm9uIEJGRF9BU1NFTUJMRVIpLgotCSogY29uZmlnL29iai1jb2ZmLmMgKG9ial9jb2ZmX2VuZGVmKTogU2V0IEFESl9MTk5PUFRSIHdoZW4gTE5OT1BUUgotCWlzIHNldC4KLQkod19zeW1ib2xzKTogSWYgQURKX0xOTk9QVFIgaXMgc2V0LCBhZGQgdGhlIHNlY3Rpb24gbG5ub3B0ciBmaWVsZAotCXRvIHRoZSBzeW1ib2wgbG5ub3B0ciBmaWVsZCwgdG8gZ2V0IHRoZSBjb3JyZWN0IGZpbGUgb2Zmc2V0LgotCi1UaHUgRmViIDE1IDE0OjQ4OjM4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogT24gdGhlIFBvd2VyUEMsIGZvcmNlIGFsbAotCXN5bWJvbHMgdGhhdCBhcmUgbm90IGZ1bmN0aW9uLCBmaWxlLCBvciBzZWN0aW9uIHN5bWJvbHMgdG8gYmUKLQlvYmplY3QgdHlwZXMuCi0KLVRodSBGZWIgMTUgMTE6MjA6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFNldCBhbmQgc3Vic3RpdHV0ZSBSUEFUSF9FTlZWQVIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShjaGVjayk6IFVzZSAkKFJQQVRIX0VOVlZBUikgcmF0aGVyIHRoYW4gTERfTElCUkFSWV9QQVRILgotCi0JKiBjb25maWd1cmUuaW46IEFjY2VwdCBpNjg2LiAgRnJvbSBILkouIEx1IDxoamxAem9vbS5jb20+OiBpMzg2Ci0JZG9lc24ndCBuZWVkIG9wY29kZXMuICBJZiBjb25maWd1cmluZyBzaGFyZWQsIG9wY29kZXMgbmVlZHMgYmZkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgRmViIDE0IDE2OjMzOjEyIDE5OTYgIE1hcnRpbiBBbmFudGhhcmFtYW4gIDxtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGU+Ci0KLQkqIHJlYWQuYyAoc19tcmlfc2VjdCk6IERvbid0IHJldHVybiAnXDAnIGluIHR5cGUuICBTZXQgYWxsCi0JYXBwcm9wcmlhdGUgZmxhZ3MgaW4gQkZEIHNlY3Rpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTY4ay0qLXBzb3MqKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZy90ZS1wc29zLmg6IE5ldyBmaWxlLgotCSogY29uZmlnL3RjLW02OGsuYyAoY29tbWVudF9jaGFycyk6IERvbid0IGluY2x1ZGUgJyMnIGlmIFRFX1BTT1MKLQlpcyBkZWZpbmVkLgotCi1XZWQgRmViIDE0IDEzOjQzOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluOiBSZW1vdmUgZHVwbGljYXRlIHNldHRpbmcgb2YgY3B1X3R5cGUuICBDaGVjawotCXdoZXRoZXIgb3Bjb2RlcyBsaWJyYXJ5IGlzIHJlcXVpcmVkIGZvciBvbiBhbGwgdGFyZ2V0cywgbm90IGp1c3QKLQlwcmltYXJ5IG9uZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobWlwc19iaWdfZ290KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoc19leHRlcm4pOiBEb24ndCBkZWNsYXJlLgotCShyZWdfbmVlZHNfZGVsYXkpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYWNyb19idWlsZCk6IFBlcm1pdCBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0JKG1hY3JvX2J1aWxkX2x1aSk6IElmIHBsYWNlIGlzIG5vdCBOVUxMLCB1c2UgdGhlIG51bWJlciBpbiB0aGUKLQlleHByZXNzaW9uLgotCShsb2FkX2FkZHJlc3MpOiBIYW5kbGUgbWlwc19iaWdfZ290IGNhc2UuCi0JKG1hY3JvKTogSGFuZGxlIG1pcHNfYmlnX2dvdCBmb3IgTV9MQV9BQiwgTV9KQUxfQSwgYW5kIGxvYWQgYW5kCi0Jc3RvcmUgbWFjcm9zLgotCShPUFRJT05fWEdPVCk6IERlZmluZS4KLQkobWRfbG9uZ29wdHMpOiBBZGQgInhnb3QiIGlmIE9CSl9FTEYuCi0JKG1kX3BhcnNlX29wdGlvbik6IEhhbmRsZSAteGdvdC4KLQkobWRfc2hvd191c2FnZSk6IE1lbnRpb24gLXhnb3QuCi0JKG1kX2FwcGx5X2ZpeCk6IFBlcm1pdCBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0JKHRjX2dlbl9yZWxvYyk6IEhhbmRsZSBHT1QvQ0FMTF9ISS9MTyByZWxvY3MuCi0KLVdlZCBGZWIgMTQgMTE6MjI6MjcgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG02OGtfaXApIFtvcGVyYW5kIGtpbmQgJyMnXTogV2hlbiBmaXhpbmcKLQl0aGUgYnl0ZSByZWxvY2F0aW9uLCBwb2ludCBpdCB0byB0aGUgbG93IGJ5dGUgb2YgdGhlIHdvcmQuCi0KLVR1ZSBGZWIgMTMgMTU6MzE6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLU1vbiBGZWIgMTIgMTU6NTM6NDYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGFueSBzcGFyYyogY3B1LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotTW9uIEZlYiAxMiAxNTo0MToyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCAibXJpIiBhbmQgIi5tcmkiLgotCShzX21yaSk6IE5ldyBmdW5jdGlvbi4KLQkqIHJlYWQuaCAoc19tcmkpOiBEZWNsYXJlLgotCSogYXBwLmMgKHNjcnViX202OGtfbXJpKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkobXJpX3BzZXVkbyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGRvX3NjcnViX2JlZ2luKTogQWRkIG02OGtfbXJpIHBhcmFtZXRlci4gIFVzZSBpdCByYXRoZXIgdGhhbgotCWZsYWdfbTY4a19tcmkuICBJbml0aWFsaXplIHNjcnViX202OGtfbXJpLgotCShtcmlfc3RhdGUsIG1yaV9sYXN0X2NoKTogTmV3IHN0YXRpYyB2YXJpYWJsZXMuCi0JKHN0cnVjdCBhcHBfc2F2ZSk6IEFkZCBzY3J1Yl9tNjhrX21yaSwgbXJpX3N0YXRlLCBhbmQgbXJpX2xhc3RfY2gKLQlmaWVsZHMuCi0JKGFwcF9wdXNoKTogU2F2ZSBuZXcgZmllbGRzLgotCShhcHBfcG9wKTogUmVzdG9yZSBuZXcgZmllbGRzLgotCShkb19zY3J1Yl9jaGFycyk6IENoZWNrIHNjcnViX202OGtfbXJpIHJhdGhlciB0aGFuIGZsYWdfbXJpX21yaS4KLQlJZiBUQ19NNjhLLCB1c2UgYSB0cml2aWFsIHN0YXRlIG1hY2hpbmUgdG8gbG9vayBmb3Igb2NjdXJyZW5jZXMgb2YKLQl0aGUgLm1yaSBwc2V1ZG8tb3AsIGFuZCBjaGFuZ2UgdGhlIG1vZGUgYXBwcm9wcmlhdGVseS4KLQkqIGFzLmggKGRvX3NjcnViX2JlZ2luKTogVXBkYXRlIHByb3RvdHlwZS4KLQkqIGlucHV0LXNjcnViLmMgKGlucHV0X3NjcnViX2JlZ2luKTogUGFzcyBmbGFnX202OGtfbXJpIHRvCi0JZG9fc2NydWJfYmVnaW4uCi0JKiBjb25maWcvdGMtbTY4ay5jIChyZWdfcHJlZml4X29wdGlvbmFsX3NlZW4pOiBOZXcgc3RhdGljCi0JdmFyaWFibGUuCi0JKG02OGtfbXJpX21vZGVfY2hhbmdlKTogTmV3IGZ1bmN0aW9uLgotCShtZF9wYXJzZV9vcHRpb24pOiBTZXQgcmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuLgotCSogY29uZmlnL3RjLW02OGsuaCAobTY4a19tcmlfbW9kZV9jaGFuZ2UpOiBEZWNsYXJlLgotCShNUklfTU9ERV9DSEFOR0UpOiBEZWZpbmUuCi0JKiBkb2MvYXMudGV4aW5mbzogRG9jdW1lbnQgLm1yaSBwc2V1ZG8tb3AuCi0KLQkqIGFwcC5jIChkb19zY3J1Yl9jaGFycyk6IEluIE1SSSBtb2RlLCBkb24ndCB0cmVhdCAnIycgYXMgYQotCWNvbW1lbnQgY2hhcmFjdGVyLgotCi1Nb24gRmViIDEyIDE1OjE2OjI5IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JU3VwcG9ydCBmb3IgT0JKX0VMRiBvbiBtNjhrLCBtb3N0bHkgaW5zaWRlICNpZmRlZiBPQkpfRUxGOgotCSogY29uZmlnL202OGstcGFyc2UuaCAoZW51bSBwaWNfcmVsb2NhdGlvbik6IERlZmluZS4KLQkoc3RydWN0IG02OGtfZXhwKTogQWRkIHBpY19yZWxvYyBmaWVsZC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCk6IERlZmluZS4KLQkodGNfZml4X2FkanVzdGFibGUpOiBEZWZpbmUgdG8gY2FsbCB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlLgotCShOT19SRUxPQyk6IERlZmluZSB0byBCRkRfUkVMT0NfTk9ORSBpZiBCRkRfQVNTRU1CTEVSLCB0byB6ZXJvCi0Jb3RoZXJ3aXNlLgotCSogY29uZmlnL3RjLW02OGsuYzogRGVsZXRlIGRlZmluaXRpb24gb2YgTk9fUkVMT0MuCi0gCShzdHJ1Y3QgbTY4a19pdCk6IEFkZCBwaWNfcmVsb2MgZmllbGQuCi0JKGFkZF9maXgpOiBDb3B5IG92ZXIgcGljX3JlbG9jIGZpZWxkLgotCShtZF9wc2V1ZG9fdGFibGUpOiBJbnRlcnByZXQgLmFsaWduIHBhcmFtZXRlciBhcyBieXRlIGNvdW50LgotCShtb3RlX3BzZXVkb190YWJsZSk6IExpa2V3aXNlLgotCSh0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlKTogTmV3IGZ1bmN0aW9uLgotCShnZXRfcmVsb2NfY29kZSk6IE5ldyBmdW5jdGlvbi4KLQkobWRfYXNzZW1ibGUpOiBVc2UgaXQgYXMgbGFzdCBhcmd1bWVudCB0byBmaXhfbmV3X2V4cC4KLQkobWRfYXBwbHlfZml4XzIpOiBGb3IgYSByZWxvY2F0aW9uIGFnYWluc3QgYSBzeW1ib2wgZG9uJ3QgcHV0IHRoZQotCWFkZGVuZCBpbnRvIHRoZSBkYXRhLgotCSh0Y19nZW5fcmVsb2MpOiBEaWZmZXJlbnQgYWRkZW5kIGNvbXB1dGF0aW9uIGZvciBPQkpfRUxGLgotCShtNjhrX2lwKTogRG9uJ3QgcmVsYXggYW4gb3BlcmFuZCB0aGF0IHJlcXVpcmVzIHBpYyByZWxvY2F0aW9uLgotCShtZF9iZWdpbik6IEFsaWduIC50ZXh0LCAuZGF0YSBhbmQgLmJzcyBvbiA0IGJ5dGUgYm91bmRhcnkgYnkKLQlkZWZhdWx0LgotCSogd3JpdGUuYyAoZml4dXBfc2VnbWVudCk6IERvbid0IGFkZCBzeW1ib2wgdmFsdWUgdG8gYWRkZW5kIGlmCi0gCVRDX002OEsgYW5kIE9CSl9FTEYuCi0JKiBjb25maWcvbTY4ay1wYXJzZS55ICh5eWxleCk6IEhhbmRsZSBAUExUUEMsIGV0Yy4KLQkobW90b3JvbGFfb3BlcmFuZCk6IEFkZCBydWxlIGZvciBgKHphcGMsIEVYUFIpJy4KLQotTW9uIEZlYiAxMiAxMDowNzozMyAxOTk2ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBlY29mZi5jIChlY29mZl9kaXJlY3RpdmVfd2Vha2V4dCk6IEZpeGVkIHNvIHRoYXQgd2hpdGVzcGFjZQotCSpyZWFsbHkqIGlzIHBlcm1pc3NpYmxlIGJlZm9yZSB0aGUgY29tbWEuCi0KLU1vbiBGZWIgMTIgMDA6MTI6MTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc2guYyAoc2hfZG9fYWxpZ24pOiBBbGlnbiB0byBhIDIgYnl0ZSBib3VuZGFyeSBiZWZvcmUKLQlpbnNlcnRpbmcgbm9wIGluc3RydWN0aW9ucy4KLQotRnJpIEZlYiAgOSAxMDo1NDoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90ZS1hdXguaDogQ2hhbmdlIGluY2x1ZGUgb2YgYXV4LmggdG8gYXV4LWNvZmYuaC4KLQotVGh1IEZlYiAgOCAyMDowMjo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1pOTYwLmMgKHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayk6IENvcnJlY3Qgc3RvcmFnZQotCWNsYXNzIHNldHRpbmcgZm9yIGEgQ0FMTE5BTUUgc3ltYm9sIGluIENPRkYuCi0KLQkqIHJlYWQuYyAocG90YWJsZSk6IFBhc3MgbmVnYXRpdmUgbnVtYmVycyBmb3IgbmV3IC5iYWxpZ25bd2xdIGFuZAotCS5wMmFsaWduW3dsXSBwc2V1ZG8tb3BzLgotCShzX2FsaWduX2J5dGVzKTogVHJlYXQgYSBuZWdhdGl2ZSBhcmd1bWVudCBhcyBzcGVjaWZ5aW5nIHRoZSBmaWxsCi0JbGVuZ3RoLgotCShzX2FsaWduX3B0d28pOiBMaWtld2lzZS4KLQotV2VkIEZlYiAgNyAxNDoxMjowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJlYWQuYyAocG90YWJsZSk6IEFkZCBiYWxpZ253LCBiYWxpZ25sLCBwMmFsaWdudywgYW5kIHAyYWxpZ25sLgotCShkb19hbGlnbik6IFRha2UgbmV3IGxlbiBwYXJhbWV0ZXIuICBDaGFuZ2UgYWxsIGNhbGxlcnMuICBQYXNzIGl0Ci0JdG8gbWRfZG9fYWxpZ24uCi0JKHNfYWxpZ25fYnl0ZXMpOiBBcmcgbm93IGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxsIHBhdHRlcm4uCi0JKHNfYWxpZ25fcHR3byk6IExpa2V3aXNlLgotCSogY29uZmlnL29iai1jb2ZmLmMgKHdyaXRlX29iamVjdF9maWxlKTogUGFzcyBsZW5ndGggdG8KLQltZF9kb19hbGlnbi4KLQkqIGNvbmZpZy90Yy1pMzg2LmggKG1kX2RvX2FsaWduKTogVGFrZSBuZXcgbGVuIHBhcmFtZXRlci4KLQkqIGNvbmZpZy90Yy1tODhrLmggKG1kX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtbTg4ay5jIChtODhrX2RvX2FsaWduKTogTGlrZXdpc2UuCi0JKiBjb25maWcvdGMtc2guaCAobWRfZG9fYWxpZ24pOiBMaWtld2lzZS4KLQkqIGNvbmZpZy90Yy1zaC5jIChzaF9kb19hbGlnbik6IExpa2V3aXNlLgotCSogZG9jL2FzLnRleGluZm86IERvY3VtZW50IG5ldyBwc2V1ZG8tb3BzLgotCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZml4dXBfbWRlcHMpOiBEaXZpZGUgb2Zmc2V0IGJ5IGZyX3ZhciwgYXMgaXMKLQlkb25lIGluIGN2dF9mcmFnX3RvX2ZpbGwuCi0KLQkqIGNvbmZpZy90Yy1zaC5oIChzaF9kb19hbGlnbik6IERlY2xhcmUuCi0JKG1kX2RvX2FsaWduKTogRGVmaW5lLgotCSogY29uZmlnL3RjLXNoLmMgKHNoX2RvX2FsaWduKTogTmV3IGZ1bmN0aW9uLgotCi0JKiBlY29mZi5jIChlY29mZl9idWlsZF9saW5lbm8pOiBEb24ndCB0cnkgdG8gc3RvcmUgdGhlIGFkZHJlc3MKLQlkaWZmZXJlbmNlIGlmIHRoZSBuZXh0IGFkZHJlc3MgaXMgYmVmb3JlIHRoZSBjdXJyZW50IG9uZS4KLQotCSogY29uZmlnL3RjLW02OGsuYyAoc3RydWN0IG02OGtfY3B1KTogQWRkIGFsaWFzIGZpZWxkLgotCShhcmNocyk6IEluaXRpYWxpemUgbmV3IGZpZWxkLgotCShtNjhrX2lwKTogRG9uJ3QgbGlzdCBhbGlhcyBuYW1lcyB3aGVuIGxpc3RpbmcgQ1BVcyB3aGljaCBzdXBwb3J0Ci0JYW4gaW5zdHJ1Y3Rpb24uCi0KLQkqIGFzLmMgKG1haW4pOiBDYWxsIHBhcnNlX2FyZ3MgYmVmb3JlIHJlYWRfYmVnaW4uCi0JKiBhcHAuYyAoZG9fc2NydWJfY2hhcnMpOiBJZiBmbGFnX202OGtfbXJpLCBkb24ndCBwdXQgYSBkb3QgaW4KLQlmcm9udCBvZiBnZW5lcmF0ZWQgcHNldWRvLW9wcy4KLQkqIHJlYWQuYyAocG90YWJsZSk6IElnbm9yZSAibmFtZSIuCi0JKHNfYXBwX2ZpbGUpOiBQZXJtaXQgYSBzaW5nbGUgcXVvdGUgYWZ0ZXIgdGhlIHN0cmluZywgc2luY2Ugb25lCi0JbWF5IGFwcGVhciBpbiBtNjhrIE1SSSBtb2RlLgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciAtLWVuYWJsZS1zaGFyZWQuICBJZiBsaW5raW5nIGFnYWluc3QKLQlzaGFyZWQgQkZEIGFuZCBvcGNvZGVzLCBmaXggbGlicmFyeSBuYW1lIG9uIFN1bk9TLCBhbmQgdHJ5IHRvIHNldAotCS1ycGF0aCByZWFzb25hYmx5LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UdWUgRmViICA2IDE1OjE2OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXMuaCAoZmxhZ19tNjhrX21yaSk6IERlY2xhcmUuCi0JKiBhcy5jIChwYXJzZV9hcmdzKTogSWYgVENfTTY4Sywgc2V0IGZsYWdfbTY4a19tcmkgZm9yIC1NLgotCSogTWFueSBmaWxlczogRm9yIE1SSSBzeW50YXggdGhhdCBpcyBzcGVjaWZpYyB0byB0aGUgbTY4ayBNUkkKLQlhc3NlbWJsZXIsIGNoZWNrIGZsYWdfbTY4a19tcmkgcmF0aGVyIHRoYW4gZmxhZ19tcmkgb3IKLQlNUklfTU9ERV9ORUVEU19QU0VVRE9fRE9ULgotCi1Nb24gRmViICA1IDE2OjI5OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLWk5NjAuYyAoQVJDSF9IWCk6IERlZmluZS4KLQkoYXJjaF90YWIpOiBBZGQgSFguCi0JKHRhcmdfaGFzX3Nmcik6IEhhbmRsZSBBUkNIX0hYLgotCSh0YXJnX2hhc19pY2xhc3MpOiBIYW5kbGUgQVJDSF9IWC4KLQkodGNfY29mZl9maXgycnR5cGUpOiBBZGQgcmV0dXJuIDAgdG8gYXZvaWQgd2FybmluZy4KLQkodGNfaGVhZGVyc19ob29rKTogSWYgdGhlIGFyY2hpdGVjdHVyZSB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHksCi0JdXNlIGl0IHdoZW4gc2V0dGluZyB0aGUgZmxhZ3MuICBTZXQgdGhlIGV4dGVybiB2YXJpYWJsZSBjb2ZmX2ZsYWdzCi0JcmF0aGVyIHRoYW4gaGVhZGVycy0+ZmlsZWhkci5mX2ZsYWdzLCBzaW5jZSB0aGUgbGF0dGVyIGlzIHNldAotCXVuY29uZGl0aW9uYWxseSBpbiBvYmotY29mZi5jLgotCShpOTYwX2hhbmRsZV9hbGlnbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgZml4cC4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGJmZCBhbmQgb3Bjb2RlcyBhcyBzaGFyZWQgbGlicmFyaWVzLCBiYXNlZCBvbgotCXBhdGNoZXMgZnJvbSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT46Ci0JKiBjb25maWd1cmUuaW46IFNldCBPUENPREVTIGFuZCBCRkQgdG8gc2VhcmNoIGRpcmVjdG9yaWVzLgotCVN1YnN0aXR1dGUgT1BDT0RFU19ERVAgYW5kIEJGRERFUC4gIE9uIFN1bk9TLCBzZXQgSExERkxBR1MuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoTERGTEFHUywgSExERkxBR1MpOiBOZXcgdmFyaWFibGVzLgotCShMSUJERVBTKTogTmV3IHZhcmlhYmxlLgotCShhcy5uZXcwOiBEZXBlbmQgdXBvbiAkKExJQkRFUFMpIHJhdGhlciB0aGFuICQoTElCUykuICBVc2UKLQkkKEhMREZMQUdTKSBpbiBsaW5rLgotCShjaGVjayk6IFNldCBMRF9MSUJSQVJZX1BBVEggaW4gdGhlIGVudmlyb25tZW50LgotCi1GcmkgRmViICAyIDE3OjQxOjUzIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuaCAoRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMpOiBNYWtlIC5zZGF0YTIsIC5zYnNzMiwKLQkuUFBDLkVNQi5zZGF0YTAsIGFuZCAuUFBDLkVNQi5zYnNzMCBzZWN0aW9ucyBhbGwgZGVmYXVsdCB0bwotCXJlYWQtb25seSwgbm90IHJlYWQvd3JpdGUuCi0KLUZyaSBGZWIgIDIgMTQ6MDk6MjUgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTF9YRk9STSk6IFJlbW92ZSAtZS4KLQotRnJpIEZlYiAgMiAxMjozMjoxNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHdyaXRlLmMgKHdyaXRlX3JlbG9jcyk6IFVzZSBTX0lTX0RFRklORUQgYW5kIFNfSVNfQ09NTU9OIHJhdGhlcgotCXRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8gdW5kZWZpbmVkX3NlY3Rpb24uCi0JKHdyaXRlX29iamVjdF9maWxlKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbgotCXVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLgotCSogc3ltYm9scy5jIChyZXNvbHZlX3N5bWJvbF92YWx1ZSk6IFVzZSBTX0lTX0RFRklORUQgYW5kCi0JU19JU19DT01NT04gcmF0aGVyIHRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8KLQl1bmRlZmluZWRfc2VjdGlvbi4KLQkoU19HRVRfVkFMVUUpOiBMaWtld2lzZS4gIEF2b2lkIHJlY3Vyc2lvbiBwcm9ibGVtcyBpZiBTX0lTX0RFRklORUQKLQlvciBTX0lTX0NPTU1PTiBjYWxsIFNfR0VUX1ZBTFVFLgotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfQ09NTU9OKTogRGVmaW5lIGlmIG5vdCBCRkRfQVNTRU1CTEVSLgotCSogY29uZmlnL29iai1hb3V0LmMgKG9ial9lbWl0X3JlbG9jYXRpb25zKTogSWYgYSByZWxvYyBpcyBlcXVhdGVkCi0JdG8gYW4gdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wsIGNvbnZlcnQgdGhlIHJlbG9jIHRvIGJlIGFnYWluc3QKLQl0aGUgdGFyZ2V0IHN5bWJvbC4KLQkob2JqX2NyYXdsX3N5bWJvbF9jaGFpbik6IFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gYW4KLQl1bmRlZmluZWQgb3IgY29tbW9uIHN5bWJvbC4KLQkqIGNvbmZpZy9vYmotYm91dC5oIChTX0lTX0NPTU1PTik6IERlZmluZSBpZiBub3QgQkZEX0FTU0VNQkxFUi4KLQkqIGNvbmZpZy9vYmotYm91dC5jIChvYmpfZW1pdF9yZWxvY2F0aW9ucyk6IElmIGEgcmVsb2MgaXMgZXF1YXRlZAotCXRvIGFuIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sLCBjb252ZXJ0IHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0Ci0JdGhlIHRhcmdldCBzeW1ib2wuCi0JKG9ial9jcmF3bF9zeW1ib2xfY2hhaW4pOiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIG9yIGNvbW1vbiBzeW1ib2wuCi0JKiBjb25maWcvb2JqLWNvZmYuYyAoZG9fcmVsb2NzX2Zvcik6IFVzZSBTX0lTX0RFRklORUQgYW5kCi0JU19JU19DT01NT04gcmF0aGVyIHRoYW4gY29tcGFyaW5nIFNfR0VUX1NFR01FTlQgdG8KLQl1bmRlZmluZWRfc2VjdGlvbi4KLQkoeWFua19zeW1ib2xzKTogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byBhbiB1bmRlZmluZWQgb3IKLQljb21tb24gc3ltYm9sLgotCi1UaHUgRmViICAxIDE1OjM0OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1hb3V0LmggKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0JKiBjb25maWcvb2JqLWJvdXQuaCAoU19JU19MT0NBTCk6IExpa2V3aXNlLgotCi0JKiBjb25maWd1cmUuaW46IE1ha2Ugc3VyZSB3ZSBvbmx5IGFkZCBtNjhrLXBhcnNlLm8gdG8KLQkke2V4dHJhX29iamVjdHN9IG9uY2UsIG5vIG1hdHRlciBob3cgbWFueSBtNjhrIHRhcmdldHMgaGF2ZSBiZWVuCi0JZW5hYmxlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEphbiAzMSAxODozMTo0NiAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1jeWd3aW4zMiwgcHBjLSotY3lnd2luMzIpOiBOZXcuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBKYW4gMzEgMTQ6MDM6MTcgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGNvbmZpZy90Yy1tNjhrLmMgKG1kX3BzZXVkb190YWJsZSk6IEFkZCAiZXh0ZW5kIiBhbmQgImxkb3VibGUiLgotCSogZG9jL2MtbTY4ay50ZXhpOiBEb2N1bWVudCAuZXh0ZW5kIGFuZCAubGRvdWJsZS4KLQotCSogY29uZmlndXJlLmluIChtNjgqLWFwcGxlLWF1eCopOiBOZXcgdGFyZ2V0LgotCSogY29uZmlnL3RlLWF1eC5oOiBOZXcgZmlsZS4KLQkqIGNvbmZpZy9vYmotY29mZi5jIChjb21wYXJlX2V4dGVybmFsX3JlbG9jcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24KLQlpZiBURV9BVVguCi0JKGRvX3JlbG9jc19mb3IpOiBTb3J0IHJlbG9jcyBpZiBURV9BVVguCi0JKGZpeHVwX3NlZ21lbnQpOiBJZiBURV9BVVgsIHN0b3JlIGNvbW1vbiBzeW1ib2wgdmFsdWUgaW4gc2VnbWVudC4KLQkqIGNvbmZpZy90Yy1tNjhrLmggKFRBUkdFVF9GT1JNQVQpOiBEZWZpbmUgaWYgVEVfQVVYLgotCi1XZWQgSmFuIDMxIDEyOjI0OjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1jb2ZmLmggKFNfSVNfTE9DQUwpOiBDaGVjayBmb3IgXDAwMiBhcyB3ZWxsIGFzIFwwMDEuCi0KLQkqIGNvbmZpZy90Yy1taXBzLmMgKHNfbWlwc19nbG9ibCk6IFNldCBCU0ZfT0JKRUNUIGlmIGl0IGlzIG5vdAotCUJTRl9GVU5DVElPTi4KLQkoc19jcGxvYWQpOiBTZXQgQlNGX09CSkVDVCBmb3IgX2dwX2Rpc3Agc3ltYm9sLgotCSogcmVhZC5jIChzX2xjb21tKTogSWYgU19TRVRfU0laRSBpcyBkZWZpbmVkLCBzZXQgdGhlIHNpemUgb2YgdGhlCi0Jc3ltYm9sLgotCSogZWNvZmYuYyAoYWRkX3Byb2NlZHVyZSk6IFNldCB0aGUgQlNGX0ZVTkNUSU9OIGZsYWcuCi0JKGVjb2ZmX2J1aWxkX3N5bWJvbHMpOiBJZiBTX1NFVF9TSVpFIGlzIGRlZmluZWQsIHNldCB0aGUgc2l6ZSBvZgotCWFuIHVuZGVmaW5lZCBzeW1ib2wgYW5kIHRoZSBzaXplIG9mIGEgZnVuY3Rpb24gc3ltYm9sLgotCSogY29uZmlnL29iai1lbGYuYyAoZWxmX2Zyb2Jfc3ltYm9sKTogSWYgVENfTUlQUywgc2V0IEJTRl9PQkpFQ1QKLQlmb3IgYWxsIGNvbW1vbiBzeW1ib2xzLgotCi1UdWUgSmFuIDMwIDEyOjM1OjI0IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtaTk2MC5jIChwYXJzZV9tZW1vcCk6IEluIE1SSSBtb2RlLCBkb24ndCB1c2UgaW1wbGljaXQKLQlzY2FsaW5nIG9mIGluZGV4LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBBY2NlcHQgMHggaGV4IGNvbnN0YW50cyBpbiBNUkkgbW9kZSBpZiBub3Qgb24KLQltNjhrLgotCi1Nb24gSmFuIDI5IDEyOjIxOjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL29iai1lbGYuYyAob2JqX2VsZl90eXBlKTogU2V0IEJTRl9PQkpFQ1QgZmxhZyBmb3IgYSB0eXBlCi0Jb2Ygb2JqZWN0LiAgRnJvbSBSb25hbGQgRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi0JKiBlY29mZi5jIChsb2NhbHN5bV90KTogQWRkIGFkZGVuZCBmaWVsZC4KLQkoYWRkX2Vjb2ZmX3N5bWJvbCk6IEFkZCBhZGRlbmQgYXJndW1lbnQuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGNvZmZfc3ltX3ZhbHVlKTogTWFrZSBzdGF0aWMuCi0JKGNvZmZfc3ltX2FkZGVuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGVjb2ZmX2RpcmVjdGl2ZV9kZWYpOiBJbml0aWFsaXplIGNvZmZfc3ltX2FkZGVuZC4KLQkoZWNvZmZfZGlyZWN0aXZlX3ZhbCk6IEFjY2VwdCBzeW1ib2wgKyBjb25zdGFudC4KLQkoZWNvZmZfZGlyZWN0aXZlX2VuZGVmKTogUGFzcyBjb2ZmX3N5bV9hZGRlbmQgdG8gYWRkX2Vjb2ZmX3N5bWJvbC4KLQkoZWNvZmZfYnVpbGRfc3ltYm9scyk6IEluY2x1ZGUgdGhlIGFkZGVuZCBpbiB0aGUgc3ltYm9sIHZhbHVlLgotCi1GcmkgSmFuIDI2IDE5OjI4OjUyIDE5OTYgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2Fzc2VtYmxlKTogSWdub3JlIG92ZXJmbG93IG9uIAotCUJGRF9SRUxPQ18xNl9HT1RPRkYgYW5kIEJGRF9SRUxPQ19QUENfVE9DMTYuCi0KLUZyaSBKYW4gMjYgMTY6MTQ6MTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBTREEyMSByZWxvY2F0aW9ucyBhcmUgbm93IDQKLQlieXRlcyBpbiBzaXplLCBzbyBvZmZzZXQgYXBwcm9wcmlhdGVseSBpbiBiaWcgZW5kaWFuIG1vZGUgd2hlbgotCXdyaXRpbmcgdGhlIGJvdHRvbSAyIGJ5dGVzLgotCi1UaHUgSmFuIDI1IDIwOjI2OjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoZGVmYXVsdF9jb21wYXRpYmxlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkobWRfYmVnaW4pOiBJbml0aWFsaXplIGl0LiAgUmV3cml0ZSB3YXJuX29uX2J1bXAgaGFuZGxpbmcuCi0JKHNwYXJjX2lwKTogSWYgbm8gYXJjaGl0ZWN0dXJlIG9yIC1idW1wIHNwZWNpZmllZCwgZG9uJ3QgbWFyayBhcwotCW1pc21hdGNoZWQgdGhvc2UgaW4gZGVmYXVsdF9jb21wYXRpYmxlLgotCi1UaHUgSmFuIDI1IDEyOjIxOjUzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCVNDTyBFTEYgc3VwcG9ydCBmcm9tIFJvYmVydCBMaXBlIDxyb2JlcnRsQGFybmV0LmNvbT46Ci0JKiBjb25maWd1cmUuaW4gKGkzODYtKi1zY28qZWxmKik6IFVzZSBmbXQgZWxmLCB0YXJnIHNjbzUuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWcvc2NvNS5tdDogTmV3IGZpbGU7IHNldCBUREVGSU5FUyB0byAtRFNDT19FTEYuCi0JKiBjb25maWcvdGMtaTM4Ni5jIChzY29faWQpOiBOZXcgZnVuY3Rpb24sIGlmIFNDT19FTEYuCi0JKiBjb25maWcvdGMtaTM4Ni5oICh0Y19pbml0X2FmdGVyX2FyZ3MpOiBEZWZpbmUgaWYgU0NPX0VMRi4KLQkoc2NvX2lkKTogRGVjbGFyZSBpZiBTQ09fRUxGLgotCi1UaHUgSmFuIDI1IDAzOjEwOjUzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuYyAoaW5pdGlhbF9hcmNoaXRlY3R1cmUsY2FuX2J1bXBfdjlfcCk6IERlbGV0ZWQuCi0JKHttYXgsd2Fybl9hZnRlcn1fYXJjaGl0ZWN0dXJlKTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKG1kX2JlZ2luKTogUmVwbGFjZSBOVU1PUENPREVTIHdpdGggc3BhcmNfbnVtX29wY29kZXMuCi0JSWYgYm90aCBhcmNoaXRlY3R1cmUgYW5kIC1idW1wIHJlcXVlc3RlZCwgc2V0IG1heF9hcmNoaXRlY3R1cmUgdG8gbWF4LgotCShzcGFyY19tZF9lbmQpOiBTaW1wbGlmeS4KLQkoc3BhcmNfaXApOiBSZXBsYWNlIHJlZmVyZW5jZXMgdG8gY2FuX2J1bXBfdjlfcCB3aXRoIG1heF9hcmNoaXRlY3R1cmUuCi0JUmV3cml0ZSBjb2RlIHRvIGJ1bXAgYXJjaGl0ZWN0dXJlIGFuZCBjaGVjayBmb3IgY29uZmxpY3RzLgotCShtZF9sb25nb3B0cyk6IFJlY29nbml6ZSAteGFyY2g9e3Y4cGx1cyx2OHBsdXNhfSBmb3IgY29tcGF0aWJpbGl0eQotCXdpdGggU29sYXJpcyBhc3NlbWJsZXIuCi0JKG1kX3BhcnNlX29wdGlvbik6IExpa2V3aXNlLiAgQ2FsbCBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2guCi0JKG1kX3Nob3dfdXNhZ2UpOiBVcGRhdGUuCi0KLVdlZCBKYW4gMjQgMjI6MTE6MDMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSVU5URVNUKTogRml4IHJlZmVyZW5jZSB0byAkJHtzcmNkaXJ9LgotCi1Nb24gSmFuIDIyIDA5OjIxOjM2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtc3BhcmMuaCAoVEFSR0VUX0ZPUk1BVCk6IFVzZSAjaWZkZWYgU1BBUkNfQVJDSDY0IGluc3RlYWQgb2YKLQkjaWZkZWYgc3BhcmN2OSB3aGVuIGNob29zaW5nIHZhbHVlLgotCShFTlY2NCk6IERlbGV0ZS4KLQkobWRfZW5kKTogRGVmaW5lLgotCShzcGFyY19tZF9lbmQpOiBEZWNsYXJlLgotCSogY29uZmlnL3RjLXNwYXJjLmMgKFNQQVJDX1Y5KTogUmVuYW1lZCBmcm9tIHNwYXJjdjkuCi0JKGluaXRpYWxfYXJjaGl0ZWN0dXJlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoY2FuX2J1bXBfdjlfcCk6IExpa2V3aXNlLgotCShOT19WOSk6IERlbGV0ZSBhbGwgb2NjdXJyZW5jZXMuCi0JKHNwYXJjX21kX2VuZCk6IE5ldyBmdW5jdGlvbi4KLQkoc3BhcmNfaXApOiBOZXcgbG9jYWwgdjlfYXJnX3AuICBSZXdvcmsgZnAgcmVnIG51bWJlciB0ZXN0LgotCURvbid0IGJ1bXAgYXJjaGl0ZWN0dXJlIHRvIHY5IHVubGVzcyBjYW5fYnVtcF92OV9wIHNldC4KLQkobWRfcGFyc2Vfb3B0aW9uKTogLUE8YXJjaD4gcGFzc2VkLCBzZXQgY2FuX2J1bXBfdjlfcCBhY2NvcmRpbmdseS4KLQkqIGNvbmZpZ3VyZS5pbiAoc3BhcmM2NCB0YXJnZXQgY3B1KTogRG9uJ3Qgc2V0IG9ial9mb3JtYXQgaGVyZS4KLQkoU1BBUkNfVjkpOiBSZW5hbWVkIGZyb20gc3BhcmN2OS4KLQkoc3BhcmM2NC0qLWVsZiopOiBEZWZpbmUgU1BBUkNfQVJDSDY0LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQkqIGFjY29uZmlnLmggKFNQQVJDX1Y5KTogUmVuYW1lZCBmcm9tIHNwYXJjdjkuCi0JKFNQQVJDX0FSQ0g2NCk6IEFkZC4KLQkqIGNvbmYuaW46IFJlZ2VuZXJhdGVkLgotCSogY29uZmlnL3Ztc2NvbmYuaDogVXBkYXRlLgotCi1Nb24gSmFuIDIyIDE3OjI0OjQ3IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogY29uZmlnL3RjLW1pcHMuYyAobG9hZF9yZWdpc3Rlcik6IE9wdGltaXNlICJkbGkiIGxvYWRzLgotCShtZF9zaG93X3VzYWdlKTogYWRkICItbWNwdT12cjQxMDAiIHRvIGhlbHAgdGV4dC4KLQotTW9uIEphbiAyMiAxMTo1MzowMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHN5bWJvbHMuYyAocmVzb2x2ZV9zeW1ib2xfdmFsdWUpOiBJZiBhIHN5bWJvbCBpcyBlcXVhdGVkIHRvIGFuCi0JdW5kZWZpbmVkIHN5bWJvbCwgcHJlc2VydmUgdGhlIFhfb3Agb2YgT19zeW1ib2wuCi0JKFNfR0VUX1ZBTFVFKTogRml4IGNoZWNrIHRvIHBlcm1pdCB0aGlzIGNhc2UuCi0JKiB3cml0ZS5jICh3cml0ZV9yZWxvY3MpOiBJZiBhIHJlbG9jIGlzIGFnYWluc3QgYW4gdW5kZWZpbmVkCi0Jc3ltYm9sIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wsIGNoYW5nZSB0aGUgcmVsb2MgdG8gYmUgYWdhaW5zdAotCXRoZSBsYXR0ZXIgc3ltYm9sLgotCSogY29uZmlnL29iai1jb2ZmLmMgKGRvX3JlbG9jc19mb3IpOiBMaWtld2lzZS4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfY3NlY3QpOiBBbiB1bm5hbWVkIGNzZWN0IGlzIHN0b3JhZ2UgY2xhc3MKLQlYTUNfUFIuCi0KLU1vbiBKYW4gMjIgMTA6NTk6NDggMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChlbGYvcHBjLmgpOiBJbmNsdWRlIGVsZi9wcGMuaCBpZiB0YXJnZXQKLQljb21wdXRlciBpcyBQb3dlclBDLgotCi0JKiBjb25maWcvdGMtcHBjLmMgKG1kX2FwcGx5X2ZpeDMpOiBBZGQgbW9yZSBlbWJlZGRlZCByZWxvY2F0aW9ucy4KLQotCSogY29uZmlnL3RjLXBwYy5oIChFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyk6IEFkZCBzZWN0aW9ucwotCW1lbnRpb25lZCBpbiB0aGUgZWFiaS4KLQotVGh1IEphbiAxOCAxNzo1ODoxOSAxOTk2ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL3RjLXBwYy5jIChwcGNfcmVsZGF0YSk6IENoYW5nZWQgYWxpZ25lbWVudCBvbiByZWxkYXRhX3NlY3Rpb24KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3BkYXRhKTogQ2hhbmdlZCB0aGUgYWxpZ25tZW50IG9uIHBkYXRhX3NlY3Rpb24KLQotTW9uIEphbiAxNSAxNzo0Mzo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAobWFwcGluZyk6IEFkZCBtb3JlIHJlbG9jYXRpb24gc3VmZml4ZXMuCi0KLVN1biBKYW4gMTQgMjE6Mjk6MzYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvdGMtcHBjLmMgKHBwY19lbGZfdmFsaWRhdGVfZml4KTogQWxsb3cgLmdjY19leGNlcHRfdGFibGUKLQlhcyBhIHNlY3Rpb24gaXQgaXMgb2sgdG8gaGF2ZSB1bmFkb3JuZWQgLW1yZWxvY2F0YWJsZSBwb2ludGVycyBpbi4KLQotU2F0IEphbiAxMyAxMTowOTowOCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX3NlY3Rpb24qKTogV3JhcCB0aGVzZSBmdW5jdGlvbnMgaW5zaWRlCi0JI2lmZGVmIE9CSl9FTEYuCi0KLUZyaSBKYW4gMTIgMTU6MzI6MDcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcvb2JqLWVsZi5jIChvYmpfZWxmX3NlY3Rpb24pOiBBZGQgaG9va3Mgc28gbWFjaGluZQotCWRlcGVuZGVudCBzZWN0aW9uIGF0dHJpYnV0ZXMgY2FuIGJlIGhhbmRsZWQuCi0KLQkqIGNvbmZpZy90Yy1wcGMuaDogKG1kX2VsZl9zZWN0aW9uX3tsZXR0ZXIsdHlwZSx3b3JkLGZsYWdzfSk6IE5ldwotCW1hY3JvcyB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkZSBzZWN0aW9uIGZsYWcgYW5kIG9yZGVyZWQgc2VjdGlvbgotCXR5cGUuCi0KLQkqIGNvbmZpZy90Yy1wcGMuYyAocHBjX2VsZl9zZWN0aW9uX3tsZXR0ZXIsdHlwZSx3b3JkLGZsYWdzfSk6IE5ldwotCWZ1bmN0aW9ucyB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkZSBzZWN0aW9uIGZsYWcgYW5kIG9yZGVyZWQKLQlzZWN0aW9uIHR5cGUuCi0KLUZyaSBKYW4gMTIgMTI6MDQ6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdWJzZWdzLmMgKHNlY3Rpb25fc3ltYm9sKTogRG9uJ3QgdHJ5IHRvIGxvb2sgdXAgdGhlIHNlY3Rpb24KLQlzeW1ib2wgaW4gdGhlIGhhc2ggdGFibGUuICBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gaGF2ZSBhIHN5bWJvbAotCXdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIHNlY3Rpb24sIGJ1dCBubyBjb25uZWN0aW9uIHRvIGl0LgotCi0JKiByZWFkLmMgKGNvbnNfd29ya2VyKTogT25seSBjYWxsIG1yaV9jb21tZW50X2VuZCBmcm9tIGZsYWdfbXJpLgotCUZyb20gSmFtZXMgQ2FybHNvbiA8Y2FybHNvbkB4eWxvZ2ljcy5jb20+LgotCi0JKiBleHByLmMgKG9wZXJhbmQpOiBTa2lwIHdoaXRlc3BhY2UgYWZ0ZXIgYSBjbG9zZSBwYXJlbnRoZXNpcy4KLQlGcm9tIEphbWVzIENhcmxzb24gPGNhcmxzb25AeHlsb2dpY3MuY29tPi4KLQotVHVlIEphbiAgMiAxMjo0MzoyMyAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy90Yy1zaC5jIChtZF9hcHBseV9maXgpOiBDYWxsIGFzX2JhZF93aGVyZSBpbnN0ZWFkIG9mCi0JYXNfd2Fybl93aGVyZSBmb3IgcmVsb2NhdGlvbiBvdmVyZmxvdy4KLQkocGFyc2VfcmVnKTogQWNjZXB0IHJlZ2lzdGVyIG5hbWUgb25seSBpZiBuZXh0IGNoYXJhY3RlciBpcwotCW5vdCBhbHBoYW51bWVyaWMuCi0KLUZvciBvbGRlciBjaGFuZ2VzIHNlZSBDaGFuZ2VMb2ctOTI5NQpkaWZmIC0tZ2l0IGEvZ2FzL01ha2VmaWxlLmFtIGIvZ2FzL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWQ1YjlkLi4wMDAwMDAwCi0tLSBhL2dhcy9NYWtlZmlsZS5hbQorKysgL2Rldi9udWxsCkBAIC0xLDE3MDkgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi0jIyBXb3JrIGFyb3VuZCBhcHBhcmVudCBhdXRvbWFrZSBidWcuCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBkb2MgcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXSA7IHRoZW4gZWNobyAuLi9iaXNvbi9iaXNvbiAteSAtTC4uL2Jpc29uL2Jpc29uIDsgZWxzZSBlY2hvIGJpc29uIC15IDsgZmlgCi1MRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXSA7IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXggOyAgZWxzZSBlY2hvIGZsZXggOyBmaWAKLQotREVQID0gJChzcmNkaXIpLy4uL21rZGVwCi0KLVRBUkdfQ1BVID0gQHRhcmdldF9jcHVfdHlwZUAKLVRBUkdfQ1BVX0MgPSAkKHNyY2RpcikvY29uZmlnL3RjLUB0YXJnZXRfY3B1X3R5cGVALmMKLVRBUkdfQ1BVX08gPSB0Yy1AdGFyZ2V0X2NwdV90eXBlQC5vCi1UQVJHX0NQVV9IID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5oCi1PQkpfRk9STUFUX0MgPSAkKHNyY2RpcikvY29uZmlnL29iai1Ab2JqX2Zvcm1hdEAuYwotT0JKX0ZPUk1BVF9PID0gb2JqLUBvYmpfZm9ybWF0QC5vCi1PQkpfRk9STUFUX0ggPSAkKHNyY2RpcikvY29uZmlnL29iai1Ab2JqX2Zvcm1hdEAuaAotVEFSR19FTlZfSCA9ICQoc3JjZGlyKS9jb25maWcvdGUtQHRlX2ZpbGVALmgKLUFUT0ZfVEFSR19DID0gJChzcmNkaXIpL2NvbmZpZy9hdG9mLUBhdG9mQC5jCi1BVE9GX1RBUkdfTyA9IGF0b2YtQGF0b2ZALm8KLQotIyB1c2UgQHRhcmdldF9jcHVfdHlwZUAgZm9yIHJlZmVyaW5nIHRvIGNvbmZpZ3VyZWQgdGFyZ2V0IG5hbWUKLUlUX0hEUlM9aXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAotSVRfU1JDUz1pdGJsLXBhcnNlLmMgaXRibC1sZXguYyAkKHNyY2RpcikvaXRibC1vcHMuYwotSVRfREVQUz0kKHNyY2RpcikvaXRibC1wYXJzZS55ICQoc3JjZGlyKS9pdGJsLWxleC5sICQoc3JjZGlyKS9jb25maWcvaXRibC1AdGFyZ2V0X2NwdV90eXBlQC5oCi1JVF9PQkpTPWl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KLQotIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQotQ1BVX1RZUEVTID0gXAotCWEyOWsgXAotCWFscGhhIFwKLQlhcmMgXAotCWFybSBcCi0JZDEwdiBcCi0JZDMwdiBcCi0JZnIzMCBcCi0JaDgzMDAgXAotCWg4NTAwIFwKLQlocHBhIFwKLQlpMzg2IFwKLQlpODYwIFwKLQlpOTYwIFwKLQltMzJyIFwKLQltNjhrIFwKLQltODhrIFwKLQltY29yZSBcCi0JbWlwcyBcCi0JbW4xMDIwMCBcCi0JbW4xMDMwMCBcCi0JbnMzMmsgXAotCXBwYyBcCi0Jc2ggXAotCXNwYXJjIFwKLQl0YWhvZSBcCi0JdGljMzAgXAotCXRpYzgwIFwKLQl2YXggXAotCXc2NSBcCi0Jdjg1MCBcCi0JejhrCi0KLSMgT2JqZWN0IGZvcm1hdCB0eXBlcy4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLgotIyBXZSBkZWxpYmVyYXRlbHkgb21pdCBzb20sIHNpbmNlIGl0IGRvZXMgbm90IHdvcmsgYXMgYSBjcm9zcyBhc3NlbWJsZXIuCi0KLU9CSl9GT1JNQVRTID0gXAotCWFvdXQgXAotCWJvdXQgXAotCWNvZmYgXAotCWVjb2ZmIFwKLQllbGYgXAotCWV2YXggXAotCWhwMzAwIFwKLQlpZWVlIFwKLQl2bXMKLQotIyBUaGlzIGlzIGFuIHNoIGNhc2Ugd2hpY2ggc2V0cyB2YWxpZCBhY2NvcmRpbmcgdG8gd2hldGhlciB0aGUgQ1BVCi0jIHR5cGUgaW4gdGhlIHNoZWxsIHZhcmlhYmxlIGMgYW5kIHRoZSBPUyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBvCi0jIGFyZSBzdXBwb3J0ZWQuICBUaGlzIGhlbHBzIGN1dHMgZG93biBvbiB0aGUgYW1vdW50IG9mIGRlcGVuZGVuY3kKLSMgaW5mb3JtYXRpb24uCi0KLUNQVV9PQkpfVkFMSUQgPSBcCi0JdmFsaWQ9IDsgXAotCWNhc2UgJCRvIGluIFwKLQlhb3V0KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBhMjlrIHwgYXJtIHwgaTM4NiB8IGk4NjAgfCBtNjhrIHwgbWlwcyB8IG5zMzJrIHwgc3BhcmMgfCB0YWhvZSB8IHRpYzMwIHwgdmF4KSBcCi0JICAgIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQlib3V0KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBpOTYwKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JY29mZikgdmFsaWQ9eWVzIDs7IFwKLQllY29mZikgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgbWlwcyB8IGFscGhhKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JZWxmKSB2YWxpZD15ZXMgOzsgXAotCWV2YXgpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIGFscGhhKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JaHAzMDApIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIG02OGspIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQl2bXMpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIHZheCkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWVzYWM7Ci0KLSMgVGhpcyBpcyBsaWtlIENQVV9PQkpfVkFMSUQsIGZvciB0aGUgb2JqPW11bHRpIGNhc2UuCi0KLUNQVV9NVUxUSV9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJGMgaW4gXAotCWkzODYgfCBtaXBzKSB2YWxpZD15ZXMgOzsgXAotCWVzYWM7Ci0KLSMgUmVndWxhciBzb3VyY2UgZmlsZXMuCi0KLUdBU19DRklMRVMgPSBcCi0JYXBwLmMgXAotCWFzLmMgXAotCWF0b2YtZ2VuZXJpYy5jIFwKLQliaWdudW0tY29weS5jIFwKLQljb25kLmMgXAotCWRlcGVuZC5jIFwKLQlkd2FyZjJkYmcuYyBcCi0JZWNvZmYuYyBcCi0JZWhvcHQuYyBcCi0JZXhwci5jIFwKLQlmbG9udW0tY29weS5jIFwKLQlmbG9udW0ta29uc3QuYyBcCi0JZmxvbnVtLW11bHQuYyBcCi0JZnJhZ3MuYyBcCi0JaGFzaC5jIFwKLQlpbnB1dC1maWxlLmMgXAotCWlucHV0LXNjcnViLmMgXAotCWxpc3RpbmcuYyBcCi0JbGl0ZXJhbC5jIFwKLQltYWNyby5jIFwKLQltZXNzYWdlcy5jIFwKLQlvdXRwdXQtZmlsZS5jIFwKLQlyZWFkLmMgXAotCXNiLmMgXAotCXN0YWJzLmMgXAotCXN1YnNlZ3MuYyBcCi0Jc3ltYm9scy5jIFwKLQl3cml0ZS5jCi0KLUNGSUxFUyA9ICQoR0FTX0NGSUxFUykgZ2FzcC5jIGl0Ymwtb3BzLmMKLQotSEZJTEVTID0gXAotCWFzLmggXAotCWFzaW50bC5oIFwKLQliaWdudW0uaCBcCi0JYml0X2ZpeC5oIFwKLQljZ2VuLmggXAotCWR3YXJmMmRiZy5oIFwKLQllY29mZi5oIFwKLQllbXVsLXRhcmdldC5oIFwKLQllbXVsLmggXAotCWV4cHIuaCBcCi0JZmxvbnVtLmggXAotCWZyYWdzLmggXAotCWhhc2guaCBcCi0JaW5wdXQtZmlsZS5oIFwKLQlpdGJsLW9wcy5oIFwKLQlsaXN0aW5nLmggXAotCW1hY3JvLmggXAotCW9iai5oIFwKLQlvdXRwdXQtZmlsZS5oIFwKLQlyZWFkLmggXAotCXNiLmggXAotCXN0cnVjLXN5bWJvbC5oIFwKLQlzdWJzZWdzLmggXAotCXN5bWJvbHMuaCBcCi0JdGMuaCBcCi0Jd3JpdGUuaAotCi0jIENQVSBmaWxlcyBpbiBjb25maWcuCi0KLVRBUkdFVF9DUFVfQ0ZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmMgXAotCWNvbmZpZy90Yy1hbHBoYS5jIFwKLQljb25maWcvdGMtYXJjLmMgXAotCWNvbmZpZy90Yy1hcm0uYyBcCi0JY29uZmlnL3RjLWQxMHYuYyBcCi0JY29uZmlnL3RjLWQzMHYuYyBcCi0JY29uZmlnL3RjLWZyMzAuYyBcCi0JY29uZmlnL3RjLWg4MzAwLmMgXAotCWNvbmZpZy90Yy1oODUwMC5jIFwKLQljb25maWcvdGMtaHBwYS5jIFwKLQljb25maWcvdGMtaTM4Ni5jIFwKLQljb25maWcvdGMtaTg2MC5jIFwKLQljb25maWcvdGMtaTk2MC5jIFwKLQljb25maWcvdGMtbTMyci5jIFwKLQljb25maWcvdGMtbTY4ay5jIFwKLQljb25maWcvdGMtbTg4ay5jIFwKLQljb25maWcvdGMtbWNvcmUuYyBcCi0JY29uZmlnL3RjLW1pcHMuYyBcCi0JY29uZmlnL3RjLW1uMTAyMDAuYyBcCi0JY29uZmlnL3RjLW1uMTAzMDAuYyBcCi0JY29uZmlnL3RjLW5zMzJrLmMgXAotCWNvbmZpZy90Yy1wcGMuYyBcCi0JY29uZmlnL3RjLXNoLmMgXAotCWNvbmZpZy90Yy1zcGFyYy5jIFwKLQljb25maWcvdGMtdGFob2UuYyBcCi0JY29uZmlnL3RjLXRpYzMwLmMgXAotCWNvbmZpZy90Yy10aWM4MC5jIFwKLQljb25maWcvdGMtdmF4LmMgXAotCWNvbmZpZy90Yy13NjUuYyBcCi0JY29uZmlnL3RjLXY4NTAuYyBcCi0JY29uZmlnL3RjLXo4ay5jCi0KLVRBUkdFVF9DUFVfSEZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmggXAotCWNvbmZpZy90Yy1hbHBoYS5oIFwKLQljb25maWcvdGMtYXJjLmggXAotCWNvbmZpZy90Yy1hcm0uaCBcCi0JY29uZmlnL3RjLWQxMHYuaCBcCi0JY29uZmlnL3RjLWQzMHYuaCBcCi0JY29uZmlnL3RjLWZyMzAuaCBcCi0JY29uZmlnL3RjLWg4MzAwLmggXAotCWNvbmZpZy90Yy1oODUwMC5oIFwKLQljb25maWcvdGMtaHBwYS5oIFwKLQljb25maWcvdGMtaTM4Ni5oIFwKLQljb25maWcvdGMtaTg2MC5oIFwKLQljb25maWcvdGMtaTk2MC5oIFwKLQljb25maWcvdGMtbTMyci5oIFwKLQljb25maWcvdGMtbTY4ay5oIFwKLQljb25maWcvdGMtbTg4ay5oIFwKLQljb25maWcvdGMtbWNvcmUuaCBcCi0JY29uZmlnL3RjLW1pcHMuaCBcCi0JY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0JY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0JY29uZmlnL3RjLW5zMzJrLmggXAotCWNvbmZpZy90Yy1wcGMuaCBcCi0JY29uZmlnL3RjLXNoLmggXAotCWNvbmZpZy90Yy1zcGFyYy5oIFwKLQljb25maWcvdGMtdGFob2UuaCBcCi0JY29uZmlnL3RjLXRpYzMwLmggXAotCWNvbmZpZy90Yy10aWM4MC5oIFwKLQljb25maWcvdGMtdmF4LmggXAotCWNvbmZpZy90Yy13NjUuaCBcCi0JY29uZmlnL3RjLXY4NTAuaCBcCi0JY29uZmlnL3RjLXo4ay5oCi0KLSMgT0JKIGZpbGVzIGluIGNvbmZpZwotCi1PQkpfRk9STUFUX0NGSUxFUyA9IFwKLQljb25maWcvb2JqLWFvdXQuYyBcCi0JY29uZmlnL29iai1ib3V0LmMgXAotCWNvbmZpZy9vYmotY29mZi5jIFwKLQljb25maWcvb2JqLWVjb2ZmLmMgXAotCWNvbmZpZy9vYmotZWxmLmMgXAotCWNvbmZpZy9vYmotZXZheC5jIFwKLQljb25maWcvb2JqLWhwMzAwLmMgXAotCWNvbmZpZy9vYmotaWVlZS5jIFwKLQljb25maWcvb2JqLXNvbS5jIFwKLQljb25maWcvb2JqLXZtcy5jCi0KLU9CSl9GT1JNQVRfSEZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5oIFwKLQljb25maWcvb2JqLWJvdXQuaCBcCi0JY29uZmlnL29iai1jb2ZmLmggXAotCWNvbmZpZy9vYmotZWNvZmYuaCBcCi0JY29uZmlnL29iai1lbGYuaCBcCi0JY29uZmlnL29iai1ldmF4LmggXAotCWNvbmZpZy9vYmotaHAzMDAuaCBcCi0JY29uZmlnL29iai1pZWVlLmggXAotCWNvbmZpZy9vYmotc29tLmggXAotCWNvbmZpZy9vYmotdm1zLmgKLQotIyBFbXVsYXRpb24gaGVhZGVyIGZpbGVzIGluIGNvbmZpZwotCi1UQVJHX0VOVl9IRklMRVMgPSBcCi0JY29uZmlnL3RlLTM4NmJzZC5oIFwKLQljb25maWcvdGUtYXV4LmggXAotCWNvbmZpZy90ZS1kZWx0YS5oIFwKLQljb25maWcvdGUtZGVsdDg4LmggXAotCWNvbmZpZy90ZS1kcHgyLmggXAotCWNvbmZpZy90ZS1keW5peC5oIFwKLQljb25maWcvdGUtZXBvYy1wZS5oIFwKLQljb25maWcvdGUtZ2VuZXJpYy5oIFwKLQljb25maWcvdGUtZ28zMi5oIFwKLQljb25maWcvdGUtaHAzMDAuaCBcCi0JY29uZmlnL3RlLWhwcGEuaCBcCi0JY29uZmlnL3RlLWkzODZhaXguaCBcCi0JY29uZmlnL3RlLWljOTYwLmggXAotCWNvbmZpZy90ZS1saW51eC5oIFwKLQljb25maWcvdGUtbG5ld3MuaCBcCi0JY29uZmlnL3RlLWx5bnguaCBcCi0JY29uZmlnL3RlLW1hY2guaCBcCi0JY29uZmlnL3RlLW1hY29zLmggXAotCWNvbmZpZy90ZS1tdWx0aS5oIFwKLQljb25maWcvdGUtbmJzZC5oIFwKLQljb25maWcvdGUtbmJzZDUzMi5oIFwKLQljb25maWcvdGUtcGM1MzJtYWNoLmggXAotCWNvbmZpZy90ZS1wZS5oIFwKLQljb25maWcvdGUtcHBjbncuaCBcCi0JY29uZmlnL3RlLXBzb3MuaCBcCi0JY29uZmlnL3RlLXJpc2NpeC5oIFwKLQljb25maWcvdGUtc3BhcmNhb3V0LmggXAotCWNvbmZpZy90ZS1zdW4zLmggXAotCWNvbmZpZy90ZS1zdnI0LmggXAotCWNvbmZpZy90ZS1zeXN2MzIuaAotCi0jIE11bHRpIGZpbGVzIGluIGNvbmZpZwotCi1NVUxUSV9DRklMRVMgPSBcCi0JY29uZmlnL2UtaTM4NmNvZmYuYyBcCi0JY29uZmlnL2UtaTM4NmVsZi5jIFwKLQljb25maWcvZS1taXBzZWNvZmYuYyBcCi0JY29uZmlnL2UtbWlwc2VsZi5jCi0KLUNPTkZJR19PQkpTID0gXAotCSQoVEFSR19DUFVfTykgXAotCSQoT0JKX0ZPUk1BVF9PKSBcCi0JJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykKLQotR0VORVJJQ19PQkpTID0gXAotCWFwcC5vIFwKLQlhcy5vIFwKLQlhdG9mLWdlbmVyaWMubyBcCi0JYmlnbnVtLWNvcHkubyBcCi0JY29uZC5vIFwKLQlkZXBlbmQubyBcCi0JZHdhcmYyZGJnLm8gXAotCWVob3B0Lm8gXAotCWV4cHIubyBcCi0JZmxvbnVtLWtvbnN0Lm8gXAotCWZsb251bS1jb3B5Lm8gXAotCWZsb251bS1tdWx0Lm8gXAotCWZyYWdzLm8gXAotCWhhc2gubyBcCi0JaW5wdXQtZmlsZS5vIFwKLQlpbnB1dC1zY3J1Yi5vIFwKLQlsaXRlcmFsLm8gXAotCW1lc3NhZ2VzLm8gXAotCW91dHB1dC1maWxlLm8gXAotCXJlYWQubyBcCi0Jc3Vic2Vncy5vIFwKLQlzeW1ib2xzLm8gXAotCXdyaXRlLm8gXAotCWxpc3RpbmcubyBcCi0JZWNvZmYubyBcCi0Jc3RhYnMubyBcCi0Jc2IubyBcCi0JbWFjcm8ubwotCi1PQkpTID0gJChDT05GSUdfT0JKUykgJChHRU5FUklDX09CSlMpCi0KLVBPVEZJTEVTID0gJChNVUxUSV9DRklMRVMpICQoVEFSR0VUX0VOVl9IRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpIFwKLQkkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCi0JJChIRklMRVMpICQoQ0ZJTEVTKSAkKEdBU19DRklMRVMpCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi1ub2luc3RfUFJPR1JBTVMgPSBhcy1uZXcgZ2FzcC1uZXcKLW5vaW5zdF9TQ1JJUFRTID0gLmdkYmluaXQKLQotJChzcmNkaXIpL21ha2UtZ2FzLmNvbTogc3RhbXAtbWsuY29tCi1zdGFtcC1tay5jb206IHZtc2NvbmYuc2ggTWFrZWZpbGUKLQlzaCAkKHNyY2Rpcikvdm1zY29uZi5zaCAkKEdFTkVSSUNfT0JKUykgPiBuZXctbWFrZS5jb20KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgbmV3LW1ha2UuY29tICQoc3JjZGlyKS9tYWtlLWdhcy5jb20KLQl0b3VjaCBzdGFtcC1tay5jb20KLQotRVhUUkFfRElTVCA9IG1ha2UtZ2FzLmNvbQotCi1ESVNUU1RVRkYgPSBtYWtlLWdhcy5jb20gbTY4ay1wYXJzZS5jIGl0YmwtcGFyc2UuYyBpdGJsLXBhcnNlLmggaXRibC1sZXguYwotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi1ESVNUQ0xFQU5GSUxFUyA9IHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIHRhcmctZW52LmggaXRibC1jcHUuaCBjZ2VuLWRlc2MuaAotCi0jIE5vdyBmaWd1cmUgb3V0IGZyb20gdGhvc2UgdmFyaWFibGVzIGhvdyB0byBjb21waWxlIGFuZCBsaW5rLgotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi0KLSMgVGhpcyBpcyB0aGUgdmFyaWFibGUgYWN0dWFsbHkgdXNlZCB3aGVuIHdlIGNvbXBpbGUuCi0jIFNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHRvIGJlIHNlYXJjaGVkIGZvciBoZWFkZXIgZmlsZXMuCi0jIEJvdGggLiBhbmQgc3JjZGlyIGFyZSB1c2VkLCBpbiB0aGF0IG9yZGVyLAotIyBzbyB0aGF0IHRtLmggYW5kIGNvbmZpZy5oIHdpbGwgYmUgZm91bmQgaW4gdGhlIGNvbXBpbGF0aW9uCi0jIHN1YmRpcmVjdG9yeSByYXRoZXIgdGhhbiBpbiB0aGUgc291cmNlIGRpcmVjdG9yeS4KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKHNyY2RpcikvY29uZmlnIC1JJChJTkNESVIpIC1JJChzcmNkaXIpLy4uIC1JJChCRkRESVIpIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBUaGlzIHNob3VsZCBiZSBwYXJhbGxlbCB0byBJTkNMVURFUywgYnV0IHNob3VsZCByZXBsYWNlICQoc3JjZGlyKQotIyB3aXRoICQke3NyY2Rpcn0sIGFuZCBzaG91bGQgd29yayBpbiBhIHN1YmRpcmVjdG9yeS4gIFRoaXMgaXMgdXNlZAotIyB3aGVuIGJ1aWxkaW5nIGRlcGVuZGVuY2llcywgYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBidWlsZGluZyBpcyBkb25lCi0jIGluIGEgc3ViZGlyZWN0b3J5LgotREVQX0lOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAtSSQke3NyY2Rpcn0vY29uZmlnIC1JJCR7c3JjZGlyfS8uLi9pbmNsdWRlIC1JJCR7c3JjZGlyfS8uLiAtSSQke3NyY2Rpcn0vLi4vYmZkIC1JJCR7c3JjZGlyfS8uLi9pbnRsIC1JLi4vLi4vaW50bCAtRExPQ0FMRURJUj0iXCIkKHByZWZpeCkvc2hhcmUvbG9jYWxlXCIiCi0KLSMgSG93IHRvIGxpbmsgd2l0aCBib3RoIG91ciBzcGVjaWFsIGxpYnJhcnkgZmFjaWxpdGllcwotIyBhbmQgdGhlIHN5c3RlbSdzIGluc3RhbGxlZCBsaWJyYXJpZXMuCi0KLUdBU0xJQlMgPSBAT1BDT0RFU19MSUJAIEBCRkRMSUJAIC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotCi0jIEZpbGVzIHRvIGJlIGNvcGllZCBhd2F5IGFmdGVyIGVhY2ggc3RhZ2UgaW4gYnVpbGRpbmcuCi1TVEFHRVNUVUZGID0gKi5vICQobm9pbnN0X1BST0dSQU1TKQotCi0kKE9CSlMpOiBAQUxMX09CSl9ERVBTQAotCi1hc19uZXdfU09VUkNFUyA9ICQoR0FTX0NGSUxFUykKLWFzX25ld19MREFERCA9ICQoVEFSR19DUFVfTykgJChPQkpfRk9STUFUX08pICQoQVRPRl9UQVJHX08pIFwKLQkkKGV4dHJhX29iamVjdHMpICQoR0FTTElCUykgJChJTlRMTElCUykKLWFzX25ld19ERVBFTkRFTkNJRVMgPSAkKFRBUkdfQ1BVX08pICQoT0JKX0ZPUk1BVF9PKSAkKEFUT0ZfVEFSR19PKSBcCi0JJChleHRyYV9vYmplY3RzKSAkKEdBU0xJQlMpICQoSU5UTERFUFMpCi0KLSMgU3R1ZmYgdGhhdCBldmVyeSBvYmplY3QgZmlsZSBkZXBlbmRzIHVwb24uICBJZiBhbnl0aGluZyBpcyByZW1vdmVkCi0jIGZyb20gdGhpcyBsaXN0LCByZW1vdmUgaXQgZnJvbSBkZXAtaW4uc2VkIGFzIHdlbGwuCi0kKE9CSlMpOiBjb25maWcuaCBhcy5oICQoVEFSR19FTlZfSCkgJChPQkpfRk9STUFUX0gpICQoVEFSR19DUFVfSCkgZmxvbnVtLmggXAotCWV4cHIuaCB3cml0ZS5oIGZyYWdzLmggaGFzaC5oIHJlYWQuaCBzeW1ib2xzLmggdGMuaCBcCi0Jb2JqLmggbGlzdGluZy5oIGJpZ251bS5oIGJpdF9maXguaCAkKElOQ0RJUikvbGliaWJlcnR5LmggYXNpbnRsLmgKLQotZ2FzcF9uZXdfU09VUkNFUyA9IGdhc3AuYyBtYWNyby5jIHNiLmMgaGFzaC5jCi1nYXNwX25ld19MREFERCA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExMSUJTKQotZ2FzcF9uZXdfREVQRU5ERU5DSUVTID0gLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hICQoSU5UTERFUFMpCi0KLUVYUEVDVCA9IGBpZiBbIC1mICQke3Jvb3RtZX0vLi4vZXhwZWN0L2V4cGVjdCBdIDsgdGhlbiBcCi0gICAgICAgICAgZWNobyAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgOyBcCi0gICAgICAgICAgZWxzZSBlY2hvIGV4cGVjdCA7IGZpYAotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKLQkgICBmaWAKLVJVTlRFU1RGTEFHUz0KLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlpZiBbIC1kIHRlc3RzdWl0ZSBdOyB0aGVuIFwKLQkgIHRydWU7IFwKLQllbHNlIFwKLQkgIG1rZGlyIHRlc3RzdWl0ZTsgXAotCWZpCi0Jcm0gLWYgdGVzdHN1aXRlL3NpdGUuZXhwCi0JY3Agc2l0ZS5leHAgdGVzdHN1aXRlL3NpdGUuZXhwCi0Jcm9vdG1lPWBwd2RgOyBleHBvcnQgcm9vdG1lOyBcCi0Jc3JjZGlyPWBjZCAke3NyY2Rpcn07IHB3ZGAgOyBleHBvcnQgc3JjZGlyIDsgXAotCUVYUEVDVD0ke0VYUEVDVH0gOyBleHBvcnQgRVhQRUNUIDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWNkIHRlc3RzdWl0ZTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3JjZGlyfS90ZXN0c3VpdGUgXAotCQkkKFJVTlRFU1RGTEFHUyk7IFwKLQllbHNlIGVjaG8gIldBUk5JTkc6IGNvdWxkIG5vdCBmaW5kIFxgcnVudGVzdCciIDE+JjI7IDo7XAotCWZpCi0KLSMgVGhlIGltcGxpY2l0IC5jLm8gcnVsZSBkb2Vzbid0IHdvcmsgZm9yIHRoZXNlLCBwZXJoYXBzIGJlY2F1c2Ugb2YKLSMgdGhlIHZhcmlhYmxlcywgb3IgcGVyaGFwcyBiZWNhdXNlIHRoZSBzb3VyY2VzIGFyZSBub3Qgb24gdnBhdGguCi0kKFRBUkdfQ1BVX08pOiAkKFRBUkdfQ1BVX0MpICQoVEFSR19DUFVfREVQX0B0YXJnZXRfY3B1X3R5cGVAKQotCSQoQ09NUElMRSkgLWMgJChUQVJHX0NQVV9DKQotJChBVE9GX1RBUkdfTyk6ICQoQVRPRl9UQVJHX0MpCi0JJChDT01QSUxFKSAtYyAkKEFUT0ZfVEFSR19DKQotCi0jIGVjb2ZmLmMgb25seSBoYXMgZnVsbCBkZXBlbmRlbmNpZXMgd2hlbiBFQ09GRl9ERUJVR0dJTkcgaXMgZGVmaW5lZCwKLSMgc28gdGhlIGF1dG9tYXRpYyBkZXBlbmRlbmN5IHN0dWZmIGRvZXNuJ3Qgd29yay4KLWVjb2ZmLm8gOiBlY29mZi5jIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0JJChJTkNESVIpL2NvZmYvZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW1jb25zdC5oIFwKLQkkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oCi0KLSMgV2UgbmVlZCBhbGwgdGhlc2UgZXhwbGljaXQgcnVsZXMgZm9yIHRoZSBtdWx0aSBzdHVmZi4gIEJlY2F1c2Ugb2YKLSMgdGhlc2UgcnVsZXMsIHdlIGRvbid0IG5lZWQgb25lIGZvciBPQkpfRk9STUFUX08uCi0KLW9iai1hb3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYwotb2JqLWJvdXQubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5jCi1vYmotY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuYwotb2JqLWVjb2ZmLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5jCi1vYmotZWxmLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKLW9iai1ldmF4Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguYwotb2JqLWhwMzAwLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5jCi1vYmotaWVlZS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1pZWVlLmMKLW9iai1tdWx0aS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotbXVsdGkuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotbXVsdGkuYwotb2JqLXNvbS5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotc29tLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCi1vYmotdm1zLm8gOiAkKHNyY2RpcikvY29uZmlnL29iai12bXMuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKLQotZS1taXBzZWxmLm8gOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jCi1lLW1pcHNlY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMKLWUtaTM4NmNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZjb2ZmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jCi1lLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYwotCi0jIFRoZSBtNjhrIG9wZXJhbmQgcGFyc2VyLgotCi1FWFRSQV9hc19uZXdfU09VUkNFUyA9IGNvbmZpZy9tNjhrLXBhcnNlLnkKLQotIyBJZiBtNjhrLXBhcnNlLnkgaXMgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LCB0aGVuIHlsd3JhcCB3aWxsIHVzZSBhbgotIyBhYnNvbHV0ZSBwYXRoIHdoZW4gaXQgaW52b2tlcyB5YWNjLCB3aGljaCB3aWxsIGNhdXNlIHlhY2MgdG8gcHV0IHRoZQotIyBhYnNvbHV0ZSBwYXRoIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiAgVGhhdCdzIGEgcGFpbiB3aGVuIGl0IGNvbWVzCi0jIHRvIGdlbmVyYXRpbmcgc25hcHNob3RzLCBiZWNhdXNlIGl0IGludHJvZHVjZXMgc3B1cmlvdXMgZGlmZnMuCi0jIFNpbmNlIHdoZW4gd2UgbWFrZSB0aGUgc25hcHNob3RzICQoc3JjZGlyKSA9ICIuIiwgd2UgY2hlY2sgZm9yIHRoYXQKLSMgY2FzZSBhbmQgaGFuZGxlIGl0IGRpZmZlcmVudGx5LiAgVGhpcyBtZWFucyB0aGF0IGFueWJvZHkgd2hvCi0jIGNvbmZpZ3VyZXMgd2l0aCAkKHNyY2RpcikgPSAiLiIgd2lsbCBoYXZlIHRvIHNldCB0aGVpciBwYXRoIGluIHRoZQotIyBkZWJ1Z2dlciBpZiB0aGV5IHdhbnQgdG8gZGVidWcgbTY4ay1wYXJzZS55LiAgVGhpcyBpcyBiYWQsIGJ1dCBvbgotIyB0aGUgb3RoZXIgaGFuZCBpdCdzIGdvb2QgdGhhdCBwZW9wbGUgd2hvIHVzZSB0aGUgcHJlYnVpbHQKLSMgbTY4ay1wYXJzZS5jIGRvbid0IGdldCBhIHNwdXJpb3VzIGFic29sdXRlIHBhdGguCi1tNjhrLXBhcnNlLmM6ICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55Ci0JZj0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueTsgXAotCWlmIFsgJCRmID0gIi4vY29uZmlnL202OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBsbiAtcyBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGxuIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgY3AgY29uZmlnL202OGstcGFyc2UueSAuID4vZGV2L251bGwgMj4vZGV2L251bGw7IFwKLQkgIGY9bTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaTsgXAotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJCRmIHkudGFiLmMgbTY4ay1wYXJzZS5jIC0tOyBcCi0JaWYgWyAkJGYgPSAibTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIHJtIC1mIG02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmkKLW02OGstcGFyc2UubzogbTY4ay1wYXJzZS5jICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLSMgRG9uJ3QgbGV0IHRoZSAueS5oIHJ1bGUgY2xvYmJlciBtNjhrLXBhcnNlLmguCi1tNjhrLXBhcnNlLmg6IDsgQHRydWUKLSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0KLSMgVGhlIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gbGV4aWNhbCBhbmFseXplciBhbmQgcGFyc2VyLgotCi1pdGJsLWxleC5jOiAkKHNyY2RpcikvaXRibC1sZXgubAotaXRibC1sZXgubzogaXRibC1sZXguYyBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5vOiBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0KLWl0Ymwtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oOiAkKHNyY2RpcikvaXRibC1wYXJzZS55Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvaXRibC1wYXJzZS55IHkudGFiLmMgaXRibC1wYXJzZS5jIHkudGFiLmggaXRibC1wYXJzZS5oIC0tIC1kCi0KLSMgc3RhbmQtYWxvbmUgaXRibCBhc3NlbWJsZXIgJiBkaXNhc3NlbWJsZXIKLQotRVhUUkFfUFJPR1JBTVMgPSBpdGJsLXRlc3QKLWl0YmxfdGVzdF9TT1VSQ0VTID0gaXRibC1wYXJzZS55IGl0YmwtbGV4LmwKLWl0YmxfdGVzdF9MREFERCA9IGl0YmwtdGVzdC1vcHMubyBpdGJsLXRlc3QubyAkKEdBU0xJQlMpIEBMRVhMSUJACi0KLWl0YmwtdGVzdC1vcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0JJChDT01QSUxFKSAtbyBpdGJsLXRlc3Qtb3BzLm8gLURTVEFORF9BTE9ORSAtYyAkKHNyY2RpcikvaXRibC1vcHMuYwotCi1pdGJsLXRlc3QubzogJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0JJChDT01QSUxFKSAtYyAtRFNUQU5EX0FMT05FICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYwotCi0jIENHRU4gaW50ZXJmYWNlLgotCi1DR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAotCi1jZ2VuLm86IGNnZW4uYyBjZ2VuLmggY2dlbi1kZXNjLmggc3Vic2Vncy5oIFwKLQkkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktb3BjLmgKLQotIyBSZW1ha2UgdGhlIGluZm8gZmlsZXMuCi0KLU1PU1RMWUNMRUFORklMRVMgPSAkKFNUQUdFU1RVRkYpIGNvcmUgc3RhbXAtbWsuY29tIFwKLQl0ZXN0c3VpdGUvKi5vIHRlc3RzdWl0ZS8qLm91dCB0ZXN0c3VpdGUvZ2FzLmxvZyB0ZXN0c3VpdGUvZ2FzLnN1bSBcCi0JdGVzdHN1aXRlL3NpdGUuZXhwIHNpdGUuYmFrIHNpdGUuZXhwIHN0YWdlIHN0YWdlMSBzdGFnZTIKLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLnRjZGVwIC5vYmpkZXAgLmRlcDIgLmRlcDEgLmRlcGEgLmRlcCAuZGVwZGlyCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtYmluZGlyIGluc3RhbGwtZXhlYy10b29sZGlyCi0KLWluc3RhbGwtZXhlYy1sb2NhbDogaW5zdGFsbC1leGVjLWJpbmRpciBAaW5zdGFsbF90b29sZGlyQAotCi1pbnN0YWxsLWV4ZWMtYmluZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKQotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi1pbnN0YWxsLWV4ZWMtdG9vbGRpcjogJChub2luc3RfUFJPR1JBTVMpCi0JJChta2luc3RhbGxkaXJzKSAkKHRvb2xkaXIpL2JpbgotCW49YGVjaG8gYXMgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2FzJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBhcy1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQllbHNlIFwKLQkgIHRydWUgOyBcCi0JZmkKLQotIyBUaGVzZSBleGlzdCBmb3IgbWFpbnRlbmFuY2UgcHVycG9zZXMuCi0KLS5QSE9OWTogYm9vdHN0cmFwIGJvb3RzdHJhcDIgYm9vdHN0cmFwMyBzdGFnZTEgc3RhZ2UyIHN0YWdlMyBjb21wYXJpc29uCi0KLWJvb3RzdHJhcDogYXMtbmV3Ci0JJChNQUtFKSBzdGFnZTEKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTEgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIHN0YWdlMgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMiBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgY29tcGFyaXNvbiBhZ2FpbnN0PXN0YWdlMgotCi1ib290c3RyYXAyOgotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDM6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLSMgQ29weSB0aGUgb2JqZWN0IGZpbGVzIGZyb20gYSBwYXJ0aWN1bGFyIHN0YWdlIGludG8gYSBzdWJkaXJlY3RvcnkuCi1zdGFnZTE6Ci0JLW1rZGlyIHN0YWdlMQotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMQotCWlmIFsgLWYgc3RhZ2UxL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMS9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UxIDsgbG4gLXMgYXMtbmV3JChFWEVFWFQpIGFzJChFWEVFWFQpKSA7IGZpCi0KLXN0YWdlMjoKLQktbWtkaXIgc3RhZ2UyCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UyCi0JaWYgWyAtZiBzdGFnZTIvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UyL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTIgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UzOgotCS1ta2RpciBzdGFnZTMKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTMKLQlpZiBbIC1mIHN0YWdlMy9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTMvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMyA7IGxuIC1zIGFzLW5ldyBhcyQoRVhFRVhUKSkgOyBmaQotCi1hZ2FpbnN0PXN0YWdlMgotCi0jIFRoaXMgcnVsZSBpcyBkZXJpdmVkIGZyb20gY29ycmVzcG9uZGluZyBjb2RlIGluIHRoZSBNYWtlZmlsZS5pbiBmb3IgZ2NjLgotIyBUaGUgInRhaWwgKzE2YyIgaXMgdG8gYnlwYXNzIGhlYWRlcnMgd2hpY2ggbWF5IGluY2x1ZGUgdGltZXN0YW1wcyBvcgotIyB0ZW1wb3JhcnkgYXNzZW1ibHkgZmlsZSBuYW1lcy4KLWNvbXBhcmlzb246Ci0JeD0wIDsgXAotCWZvciBmaWxlIGluICoubyA7IGRvIFwKLQkgIHRhaWwgKzE2YyAuLyQkZmlsZSA+IHRtcC1mb28xOyBcCi0JICBpZiB0YWlsICsxNmMgJHthZ2FpbnN0fS8kJGZpbGUgPiB0bXAtZm9vMiAyPi9kZXYvbnVsbCA7IHRoZW4gXAotCSAgICBpZiBjbXAgdG1wLWZvbzEgdG1wLWZvbzIgOyB0aGVuIFwKLQkgICAgICB0cnVlIDsgXAotCSAgICBlbHNlIFwKLQkgICAgICBlY2hvICQkZmlsZSBkaWZmZXJzIDsgXAotCSAgICAgIHg9MSA7IFwKLQkgICAgZmkgOyBcCi0JICBlbHNlIHRydWU7IGZpIDsgXAotCWRvbmUgOyBcCi0JZXhpdCAkJHgKLQktcm0gLWYgdG1wLWZvbyoKLQotLlBIT05ZOiBkZS1zdGFnZTEgZGUtc3RhZ2UyIGRlLXN0YWdlMwotCi1kZS1zdGFnZTE6Ci0JLSAoY2Qgc3RhZ2UxIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UxCi0KLWRlLXN0YWdlMjoKLQktIChjZCBzdGFnZTIgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTIKLQotZGUtc3RhZ2UzOgotCS0gKGNkIHN0YWdlMyA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMwotCi0jIEF1dG9tYXRpYyBkZXBlbmRlbmN5IGNvbXB1dGF0aW9uLiAgVGhpcyBpcyBhIHJlYWwgcGFpbiwgYmVjYXVzZSB0aGUKLSMgZGVwZW5kZW5jaWVzIGNoYW5nZSBiYXNlZCBvbiB0YXJnZXRfY3B1X3R5cGUgYW5kIG9ial9mb3JtYXQuICBXZQotIyBjdXJyZW50bHkgaWdub3JlIGFueSBkZXBlbmRlbmNpZXMgY2F1c2VkIGJ5IGVtdWxhdGlvbiBmaWxlcy4KLQotREVQX0ZJTEVfREVQUyA9ICAkKENGSUxFUykgJChIRklMRVMpICQoVEFSR0VUX0NQVV9DRklMRVMpIFwKLQkkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfQ0ZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCi0uZGVwOiBkZXAuc2VkICQoREVQX0ZJTEVfREVQUykgLnRjZGVwIC5vYmpkZXAgLmRlcDIKLQlybSAtZiAuZGVwMQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JJChNQUtFKSBERVA9JChERVApIHNyY2Rpcj0kJHtzcmNkaXJ9IFZQQVRIPSQke3NyY2Rpcn0gLmRlcDEKLQlybSAtcmYgLmRlcGRpcgotCXNlZCAtZiBkZXAuc2VkIDwgLmRlcDEgPiAuZGVwYQotCXNlZCAtZiBkZXAuc2VkIDwgLnRjZGVwID4+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAub2JqZGVwID4+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAuZGVwMiA+PiAuZGVwYQotCWVjaG8gJyQkKE9CSlMpOiAkJChERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IC5kZXBhCi0JZWNobyAnJCQoVEFSR19DUFVfTyk6ICQkKFRDREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiAuZGVwYQotCWVjaG8gJyQkKE9CSl9GT1JNQVRfTyk6ICQkKE9CSkRFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gLmRlcGEKLQllY2hvICcjIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVknID4+IC5kZXBhCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXBhIC5kZXAKLQotIyBUaGlzIHJ1bGUgbmVlZHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKE1VTFRJX0NGSUxFUykKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZWNobyAnJyA+IHRhcmctY3B1Lmg7IFwKLQllY2hvICcnID4gb2JqLWZvcm1hdC5oOyBcCi0JZWNobyAnJyA+IHRhcmctZW52Lmg7IFwKLQllY2hvICcnID4gaXRibC1jcHUuaDsgXAotCWVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSAkPwotCXNlZCAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgPCAuZGVwZGlyLy5kZXAgPiAuZGVwMQotCXJtIC1mIC5kZXBkaXIvLmRlcAotCi0jIFdvcmsgb3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcyBmb3IgdGhlIHRjLSouYyBmaWxlcy4KLS50Y2RlcDogJChUQVJHRVRfQ1BVX0NGSUxFUykKLQlybSAtZiAudGNkZXBhCi0JaWYgWyAtZCAuZGVwZGlyIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAuZGVwZGlyOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgLmRlcGRpcjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gb2JqLWZvcm1hdC5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRlLWdlbmVyaWMuaCInID4gdGFyZy1lbnYuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtcGFyc2UuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvcGNvZGVzLyciJCR7Y30iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL3RjLSQke2N9LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9UQ0RFUF8kJHtjfV8kJHtvfSA9LyIgXAotCQkgIC1lICcxLC9ETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSL2QnIFwKLQkJICAtZSAnL0lGIFlPVSBQVVQgQU5ZVEhJTkcvLCQkZCcgXAotCQkgIC1lICcvXiQkL2QnIDwgLmRlcCA+PiAuLi8udGNkZXBhOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ1RDREVQX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIHN1YnNlZ3MuaCBcJyA+PiAudGNkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL29ic3RhY2suaCAkJChCRkRESVIpL2xpYmhwcGEuaCBcJyA+PiAudGNkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL29wY29kZS9ocHBhLmggJCQoQkZERElSKS9zb20uaCcgPj4gLnRjZGVwYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnVENERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLnRjZGVwYTsgXAotCSAgICBlY2hvICckJChUQ0RFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLnRjZGVwYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKFRDREVQXyciJCR7Y30iJ19lY29mZikgXCcgPj4gLnRjZGVwYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKFRDREVQXyciJCR7Y30iJ19lbGYpJyA+PiAudGNkZXBhOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIC50Y2RlcGEgLnRjZGVwCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgb2JqLSouYyBmaWxlcy4KLS5vYmpkZXA6ICQoT0JKX0ZPUk1BVF9DRklMRVMpCi0Jcm0gLWYgLm9iamRlcGEKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICAgIGNwICQke3NyY2Rpcn0vY29uZmlnL29iai0kJHtvfS5jIGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvT0JKREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5vYmpkZXBhOyBcCi0JICAgICAgcm0gLWYgZHVtbXkuYzsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ09CSkRFUF9ocHBhX3NvbSA9ICQkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXCcgPj4gLm9iamRlcGEKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IC5vYmpkZXBhCi0JZWNobyAnICAkJChCRkRESVIpL3NvbS5oICAkJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCBcJyA+PiAub2JqZGVwYQotCWVjaG8gJyAgJCQoSU5DRElSKS9hb3V0L3N0YWIuZGVmJyA+PiAub2JqZGVwYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnT0JKREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5vYmpkZXBhOyBcCi0JICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLm9iamRlcGE7IFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICckJChPQkpERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiAub2JqZGVwYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfZWxmKScgPj4gLm9iamRlcGE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgLm9iamRlcGEgLm9iamRlcAotCi0jIFdvcmsgb3V0IHRoZSBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggQ1BVL09CSiBjb21iaW5hdGlvbi4KLSMgTm90ZSB0aGF0IFNPTSBpcyBhIHNwZWNpYWwgY2FzZSwgYmVjYXVzZSBpdCBvbmx5IHdvcmtzIG5hdGl2ZS4KLS5kZXAyOiAkKFRBUkdFVF9DUFVfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKQotCXJtIC1mIC5kZXAyYQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IGR1bW15LmM7IFwKLQkgICAgICBlY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXA7IFwKLQkgICAgICAkKERFUCkgLWYgLmRlcCAtREJGRF9BU1NFTUJMRVIgLUkuIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkICQoREVQX0lOQ0xVREVTKSBkdW1teS5jOyBcCi0JICAgICAgc2VkIC1lICJzL2R1bW15Lm86IGR1bW15LmMvREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy5kZXAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCWVjaG8gJ0RFUF9ocHBhX3NvbSA9ICQkKEJGRERJUikvc29tLmgnID4+IC5kZXAyYQotCSMgV2UgZG9uJ3QgdHJ5IHRvIGhhbmRsZSBhbGwgbXVsdGkgY2FzZXMuCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICAkKENQVV9NVUxUSV9WQUxJRCkgXAotCSAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgbz1lY29mZjsgXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgZWNobyAnREVQXyciJCR7Y30iJ19tdWx0aSA9IFwnID4+IC5kZXAyYTsgXAotCSAgICBlY2hvICckJChERVBfJyIkJHtjfSInX2NvZmYpIFwnID4+IC5kZXAyYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC5kZXAyYTsgXAotCSAgICBlbHNlIHRydWU7IGZpOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfZWxmKScgPj4gLmRlcDJhOyBcCi0JICBlbHNlIHRydWU7IGZpOyBcCi0JZG9uZQotCW12IC1mIC5kZXAyYSAuZGVwMgotCi1kZXAuc2VkOiBkZXAtaW4uc2VkIGNvbmZpZy5zdGF0dXMKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQgXAotCQktZSAicyFASU5DRElSQCEkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUhIiBcCi0JCS1lICJzIUBCRkRESVJAISQke3NyY2Rpcn0vLi4vYmZkISIgXAotCQktZSAicyFAU1JDRElSQCEkJHtzcmNkaXJ9ISIKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotCi1hcHAubzogYXBwLmMKLWFzLm86IGFzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaCBcCi0gIHNiLmggbWFjcm8uaAotYXRvZi1nZW5lcmljLm86IGF0b2YtZ2VuZXJpYy5jCi1iaWdudW0tY29weS5vOiBiaWdudW0tY29weS5jCi1jb25kLm86IGNvbmQuYyBtYWNyby5oIHNiLmggJChJTkNESVIpL29ic3RhY2suaAotZGVwZW5kLm86IGRlcGVuZC5jCi1kd2FyZjJkYmcubzogZHdhcmYyZGJnLmMgZHdhcmYyZGJnLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1lY29mZi5vOiBlY29mZi5jIGVjb2ZmLmgKLWVob3B0Lm86IGVob3B0LmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9kd2FyZjIuaAotZXhwci5vOiBleHByLmMgJChJTkNESVIpL29ic3RhY2suaAotZmxvbnVtLWNvcHkubzogZmxvbnVtLWNvcHkuYwotZmxvbnVtLWtvbnN0Lm86IGZsb251bS1rb25zdC5jCi1mbG9udW0tbXVsdC5vOiBmbG9udW0tbXVsdC5jCi1mcmFncy5vOiBmcmFncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1oYXNoLm86IGhhc2guYyAkKElOQ0RJUikvb2JzdGFjay5oCi1pbnB1dC1maWxlLm86IGlucHV0LWZpbGUuYyBpbnB1dC1maWxlLmgKLWlucHV0LXNjcnViLm86IGlucHV0LXNjcnViLmMgaW5wdXQtZmlsZS5oIHNiLmgKLWxpc3RpbmcubzogbGlzdGluZy5jIGlucHV0LWZpbGUuaCBzdWJzZWdzLmgKLWxpdGVyYWwubzogbGl0ZXJhbC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1tYWNyby5vOiBtYWNyby5jIHNiLmggbWFjcm8uaAotbWVzc2FnZXMubzogbWVzc2FnZXMuYwotb3V0cHV0LWZpbGUubzogb3V0cHV0LWZpbGUuYyBvdXRwdXQtZmlsZS5oCi1yZWFkLm86IHJlYWQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBzYi5oIG1hY3JvLmggXAotICBlY29mZi5oCi1zYi5vOiBzYi5jIHNiLmgKLXN0YWJzLm86IHN0YWJzLmMgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggZWNvZmYuaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYKLXN1YnNlZ3Mubzogc3Vic2Vncy5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1zeW1ib2xzLm86IHN5bWJvbHMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBcCi0gIHN0cnVjLXN5bWJvbC5oCi13cml0ZS5vOiB3cml0ZS5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIG91dHB1dC1maWxlLmgKLWdhc3AubzogZ2FzcC5jIHNiLmggbWFjcm8uaAotaXRibC1vcHMubzogaXRibC1vcHMuYyBpdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotZS1pMzg2Y29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYyBlbXVsLmggXAotICBlbXVsLXRhcmdldC5oCi1lLWkzODZlbGYubzogJChzcmNkaXIpL2NvbmZpZy9lLWkzODZlbGYuYyBlbXVsLmggZW11bC10YXJnZXQuaAotZS1taXBzZWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtbWlwc2VsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2VsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi0KLVRDREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotVENERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLVRDREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLVRDREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotVENERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotVENERVBfYWxwaGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgJChJTkNESVIpL29wY29kZS9hbHBoYS5oICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1UQ0RFUF9hbHBoYV9ldmF4ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9hdG9mLXZheC5jCi1UQ0RFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1UQ0RFUF9hcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggJChJTkNESVIpL2VsZi9hcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLVRDREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1UQ0RFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvYXJtLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1UQ0RFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1UQ0RFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLVRDREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotVENERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9zeW1jYXQuaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9mcjMwLWRlc2MuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtb3BjLmggXAotICBjZ2VuLmgKLVRDREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaDgzMDAuaAotVENERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi1UQ0RFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9oODUwMC1vcGMuaAotVENERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvaDg1MDAtb3BjLmgKLVRDREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotVENERVBfaHBwYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCAkKEJGRERJUikvZWxmMzItaHBwYS5oIFwKLSAgJChCRkRESVIpL2xpYmhwcGEuaCAkKElOQ0RJUikvZWxmL2hwcGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmJmZC5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1UQ0RFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotVENERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLVRDREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2kzODYuaAotVENERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1UQ0RFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1UQ0RFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi1UQ0RFUF9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi1UQ0RFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi1UQ0RFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotVENERVBfbTMycl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvc3ltY2F0LmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1kZXNjLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tMzJyLW9wYy5oIFwKLSAgY2dlbi5oCi1UQ0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotVENERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLVRDREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLVRDREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9tNjhrLXBhcnNlLmgKLVRDREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotVENERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotVENERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvbWNvcmUtb3BjLmgKLVRDREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL21jb3JlLW9wYy5oIFwKLSAgJChJTkNESVIpL2VsZi9tY29yZS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLVRDREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLVRDREVQX21pcHNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggXAotICBpdGJsLW9wcy5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotVENERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmgKLVRDREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBpdGJsLW9wcy5oIFwKLSAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotVENERVBfbW4xMDIwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotVENERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi1UQ0RFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1UQ0RFUF9tbjEwMzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9tbjEwMzAwLmgKLVRDREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLVRDREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggJChJTkNESVIpL29ic3RhY2suaAotVENERVBfbnMzMmtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oICQoSU5DRElSKS9vcGNvZGUvbnMzMmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLVRDREVQX3BwY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3JzNjAwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmgKLVRDREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaCAkKElOQ0RJUikvZWxmL3BwYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvc2gtb3BjLmgKLVRDREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3NoLW9wYy5oCi1UQ0RFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotVENERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oCi1UQ0RFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2VsZi9zcGFyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotVENERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotVENERVBfdGFob2VfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS90YWhvZS5oCi1UQ0RFUF90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotVENERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi1UQ0RFUF90aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLVRDREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzMwLmgKLVRDREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotVENERVBfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotVENERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLVRDREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLVRDREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotVENERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92YXguaAotVENERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi1UQ0RFUF93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL3c2NS1vcGMuaAotVENERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaAotVENERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi1UQ0RFUF96OGtfY29mZiA9ICQoc3JjZGlyKS8uLi9vcGNvZGVzL3o4ay1vcGMuaCAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggXAotICAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggXAotICAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLVRDREVQX3o4a19lbGYgPSAkKHNyY2RpcikvLi4vb3Bjb2Rlcy96OGstb3BjLmggJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggXAotICAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaAotVENERVBfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmggXAotICAkKEJGRERJUikvc29tLmgKLVRDREVQX2kzODZfbXVsdGkgPSAkKFRDREVQX2kzODZfY29mZikgJChUQ0RFUF9pMzg2X2VsZikKLVRDREVQX21pcHNfbXVsdGkgPSAkKFRDREVQX21pcHNfY29mZikgJChUQ0RFUF9taXBzX2Vjb2ZmKSBcCi0gICQoVENERVBfbWlwc19lbGYpCi1PQkpERVBfYTI5a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfYWxwaGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLU9CSkRFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL2FscGhhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLU9CSkRFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaHBwYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfaTg2MF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9pOTYwX2JvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi1PQkpERVBfaTk2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pOTYwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoQkZERElSKS9saWJlY29mZi5oCi1PQkpERVBfbWlwc19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfbW4xMDIwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfbW4xMDMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX25zMzJrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9wcGNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9lbGYvcHBjLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3NwYXJjX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF90YWhvZV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF90YWhvZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3RpYzMwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfdGljMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF90aWM4MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljODAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi1PQkpERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLU9CSkRFUF92YXhfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF92YXhfdm1zID0gJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9hb3V0L3N0YWJfZ251LmggJChJTkNESVIpL2FvdXQvc3RhYi5kZWYgc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotT0JKREVQX3c2NV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3c2NS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi1PQkpERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotT0JKREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLU9CSkRFUF92ODUwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotT0JKREVQX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLU9CSkRFUF9ocHBhX3NvbSA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvc29tLmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1PQkpERVBfaTM4Nl9tdWx0aSA9ICQoT0JKREVQX2kzODZfY29mZikgJChPQkpERVBfaTM4Nl9lbGYpCi1PQkpERVBfbWlwc19tdWx0aSA9ICQoT0JKREVQX21pcHNfY29mZikgJChPQkpERVBfbWlwc19lY29mZikgXAotICAkKE9CSkRFUF9taXBzX2VsZikKLURFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hMjlrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2EyOWsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmgKLURFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotREVQX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1ERVBfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJjLmgKLURFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfYXJtX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYXJtLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9hcm1fZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcm0uaAotREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaAotREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaAotREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfZnIzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaAotREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oCi1ERVBfaDg1MDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4NTAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmgKLURFUF9ocHBhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2kzODZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTM4Ni5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaAotREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX2k4NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTg2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaAotREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfaTk2MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaAotREVQX202OGtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX202OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTY4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaAotREVQX202OGtfaHAzMDAgPSAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX204OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbTg4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaAotREVQX21jb3JlX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tY29yZS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbWNvcmVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tY29yZS5oCi1ERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmgKLURFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmgKLURFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmgKLURFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmgKLURFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oCi1ERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmgKLURFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oCi1ERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oCi1ERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF90aWMzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdGljMzAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3RpYzMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaAotREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdGljODBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oCi1ERVBfdmF4X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oCi1ERVBfdmF4X3ZtcyA9ICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oICQoSU5DRElSKS9hb3V0L3N0YWIuZGVmCi1ERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLURFUF93NjVfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaAotREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaAotREVQX3o4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi1ERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLURFUF9ocHBhX3NvbSA9ICQoQkZERElSKS9zb20uaAotREVQX2kzODZfbXVsdGkgPSAkKERFUF9pMzg2X2NvZmYpICQoREVQX2kzODZfZWxmKQotREVQX21pcHNfbXVsdGkgPSAkKERFUF9taXBzX2NvZmYpICQoREVQX21pcHNfZWNvZmYpIFwKLSAgJChERVBfbWlwc19lbGYpCi0kKE9CSlMpOiAkKERFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0kKFRBUkdfQ1BVX08pOiAkKFRDREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoT0JKX0ZPUk1BVF9PKTogJChPQkpERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9nYXMvTWFrZWZpbGUuaW4gYi9nYXMvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2Y2FjZDEuLjAwMDAwMDAKLS0tIGEvZ2FzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjUwMyArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BTExfT0JKX0RFUFMgPSBAQUxMX09CSl9ERVBTQAotQVMgPSBAQVNACi1CRkRMSUIgPSBAQkZETElCQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1EQVRBRElSTkFNRSA9IEBEQVRBRElSTkFNRUAKLURMTFRPT0wgPSBARExMVE9PTEAKLUVYRUVYVCA9IEBFWEVFWFRACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLUdNU0dGTVQgPSBAR01TR0ZNVEAKLUdUX05PID0gQEdUX05PQAotR1RfWUVTID0gQEdUX1lFU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTk0gPSBATk1ACi1PUENPREVTX0xJQiA9IEBPUENPREVTX0xJQkAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLWF0b2YgPSBAYXRvZkAKLWNnZW5fY3B1X3ByZWZpeCA9IEBjZ2VuX2NwdV9wcmVmaXhACi1leHRyYV9vYmplY3RzID0gQGV4dHJhX29iamVjdHNACi1pbnN0YWxsX3Rvb2xkaXIgPSBAaW5zdGFsbF90b29sZGlyQAotbCA9IEBsQAotb2JqX2Zvcm1hdCA9IEBvYmpfZm9ybWF0QAotdGFyZ2V0X2NwdV90eXBlID0gQHRhcmdldF9jcHVfdHlwZUAKLXRlX2ZpbGUgPSBAdGVfZmlsZUAKLQotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gZG9jIHBvCi0KLXRvb2xkaXIgPSAkKGV4ZWNfcHJlZml4KS8kKHRhcmdldF9hbGlhcykKLQotWUFDQyA9IGBpZiBbIC1mIC4uL2Jpc29uL2Jpc29uIF0gOyB0aGVuIGVjaG8gLi4vYmlzb24vYmlzb24gLXkgLUwuLi9iaXNvbi9iaXNvbiA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotTEVYID0gYGlmIFsgLWYgLi4vZmxleC9mbGV4IF0gOyB0aGVuIGVjaG8gLi4vZmxleC9mbGV4IDsgIGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLURFUCA9ICQoc3JjZGlyKS8uLi9ta2RlcAotCi1UQVJHX0NQVSA9IEB0YXJnZXRfY3B1X3R5cGVACi1UQVJHX0NQVV9DID0gJChzcmNkaXIpL2NvbmZpZy90Yy1AdGFyZ2V0X2NwdV90eXBlQC5jCi1UQVJHX0NQVV9PID0gdGMtQHRhcmdldF9jcHVfdHlwZUAubwotVEFSR19DUFVfSCA9ICQoc3JjZGlyKS9jb25maWcvdGMtQHRhcmdldF9jcHVfdHlwZUAuaAotT0JKX0ZPUk1BVF9DID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmMKLU9CSl9GT1JNQVRfTyA9IG9iai1Ab2JqX2Zvcm1hdEAubwotT0JKX0ZPUk1BVF9IID0gJChzcmNkaXIpL2NvbmZpZy9vYmotQG9ial9mb3JtYXRALmgKLVRBUkdfRU5WX0ggPSAkKHNyY2RpcikvY29uZmlnL3RlLUB0ZV9maWxlQC5oCi1BVE9GX1RBUkdfQyA9ICQoc3JjZGlyKS9jb25maWcvYXRvZi1AYXRvZkAuYwotQVRPRl9UQVJHX08gPSBhdG9mLUBhdG9mQC5vCi0KLSMgdXNlIEB0YXJnZXRfY3B1X3R5cGVAIGZvciByZWZlcmluZyB0byBjb25maWd1cmVkIHRhcmdldCBuYW1lCi1JVF9IRFJTID0gaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oIAotSVRfU1JDUyA9IGl0YmwtcGFyc2UuYyBpdGJsLWxleC5jICQoc3JjZGlyKS9pdGJsLW9wcy5jCi1JVF9ERVBTID0gJChzcmNkaXIpL2l0YmwtcGFyc2UueSAkKHNyY2RpcikvaXRibC1sZXgubCAkKHNyY2RpcikvY29uZmlnL2l0YmwtQHRhcmdldF9jcHVfdHlwZUAuaAotSVRfT0JKUyA9IGl0YmwtcGFyc2UubyBpdGJsLWxleC5vIGl0Ymwtb3BzLm8KLQotIyBDUFUgdHlwZXMuICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbi4KLQotQ1BVX1RZUEVTID0gXAotCWEyOWsgXAotCWFscGhhIFwKLQlhcmMgXAotCWFybSBcCi0JZDEwdiBcCi0JZDMwdiBcCi0JZnIzMCBcCi0JaDgzMDAgXAotCWg4NTAwIFwKLQlocHBhIFwKLQlpMzg2IFwKLQlpODYwIFwKLQlpOTYwIFwKLQltMzJyIFwKLQltNjhrIFwKLQltODhrIFwKLQltY29yZSBcCi0JbWlwcyBcCi0JbW4xMDIwMCBcCi0JbW4xMDMwMCBcCi0JbnMzMmsgXAotCXBwYyBcCi0Jc2ggXAotCXNwYXJjIFwKLQl0YWhvZSBcCi0JdGljMzAgXAotCXRpYzgwIFwKLQl2YXggXAotCXc2NSBcCi0Jdjg1MCBcCi0JejhrCi0KLQotIyBPYmplY3QgZm9ybWF0IHR5cGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24uCi0jIFdlIGRlbGliZXJhdGVseSBvbWl0IHNvbSwgc2luY2UgaXQgZG9lcyBub3Qgd29yayBhcyBhIGNyb3NzIGFzc2VtYmxlci4KLQotT0JKX0ZPUk1BVFMgPSBcCi0JYW91dCBcCi0JYm91dCBcCi0JY29mZiBcCi0JZWNvZmYgXAotCWVsZiBcCi0JZXZheCBcCi0JaHAzMDAgXAotCWllZWUgXAotCXZtcwotCi0KLSMgVGhpcyBpcyBhbiBzaCBjYXNlIHdoaWNoIHNldHMgdmFsaWQgYWNjb3JkaW5nIHRvIHdoZXRoZXIgdGhlIENQVQotIyB0eXBlIGluIHRoZSBzaGVsbCB2YXJpYWJsZSBjIGFuZCB0aGUgT1MgdHlwZSBpbiB0aGUgc2hlbGwgdmFyaWFibGUgbwotIyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBoZWxwcyBjdXRzIGRvd24gb24gdGhlIGFtb3VudCBvZiBkZXBlbmRlbmN5Ci0jIGluZm9ybWF0aW9uLgotCi1DUFVfT0JKX1ZBTElEID0gXAotCXZhbGlkPSA7IFwKLQljYXNlICQkbyBpbiBcCi0JYW91dCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgYTI5ayB8IGFybSB8IGkzODYgfCBpODYwIHwgbTY4ayB8IG1pcHMgfCBuczMyayB8IHNwYXJjIHwgdGFob2UgfCB0aWMzMCB8IHZheCkgXAotCSAgICB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0JYm91dCkgXAotCSAgY2FzZSAkJGMgaW4gXAotCSAgaTk2MCkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWNvZmYpIHZhbGlkPXllcyA7OyBcCi0JZWNvZmYpIFwKLQkgIGNhc2UgJCRjIGluIFwKLQkgIG1pcHMgfCBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWVsZikgdmFsaWQ9eWVzIDs7IFwKLQlldmF4KSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBhbHBoYSkgdmFsaWQ9eWVzIDs7IFwKLQkgIGVzYWMgOzsgXAotCWhwMzAwKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICBtNjhrKSB2YWxpZD15ZXMgOzsgXAotCSAgZXNhYyA7OyBcCi0Jdm1zKSBcCi0JICBjYXNlICQkYyBpbiBcCi0JICB2YXgpIHZhbGlkPXllcyA7OyBcCi0JICBlc2FjIDs7IFwKLQllc2FjOwotCi0KLSMgVGhpcyBpcyBsaWtlIENQVV9PQkpfVkFMSUQsIGZvciB0aGUgb2JqPW11bHRpIGNhc2UuCi0KLUNQVV9NVUxUSV9WQUxJRCA9IFwKLQl2YWxpZD0gOyBcCi0JY2FzZSAkJGMgaW4gXAotCWkzODYgfCBtaXBzKSB2YWxpZD15ZXMgOzsgXAotCWVzYWM7Ci0KLQotIyBSZWd1bGFyIHNvdXJjZSBmaWxlcy4KLQotR0FTX0NGSUxFUyA9IFwKLQlhcHAuYyBcCi0JYXMuYyBcCi0JYXRvZi1nZW5lcmljLmMgXAotCWJpZ251bS1jb3B5LmMgXAotCWNvbmQuYyBcCi0JZGVwZW5kLmMgXAotCWR3YXJmMmRiZy5jIFwKLQllY29mZi5jIFwKLQllaG9wdC5jIFwKLQlleHByLmMgXAotCWZsb251bS1jb3B5LmMgXAotCWZsb251bS1rb25zdC5jIFwKLQlmbG9udW0tbXVsdC5jIFwKLQlmcmFncy5jIFwKLQloYXNoLmMgXAotCWlucHV0LWZpbGUuYyBcCi0JaW5wdXQtc2NydWIuYyBcCi0JbGlzdGluZy5jIFwKLQlsaXRlcmFsLmMgXAotCW1hY3JvLmMgXAotCW1lc3NhZ2VzLmMgXAotCW91dHB1dC1maWxlLmMgXAotCXJlYWQuYyBcCi0Jc2IuYyBcCi0Jc3RhYnMuYyBcCi0Jc3Vic2Vncy5jIFwKLQlzeW1ib2xzLmMgXAotCXdyaXRlLmMKLQotCi1DRklMRVMgPSAkKEdBU19DRklMRVMpIGdhc3AuYyBpdGJsLW9wcy5jCi0KLUhGSUxFUyA9IFwKLQlhcy5oIFwKLQlhc2ludGwuaCBcCi0JYmlnbnVtLmggXAotCWJpdF9maXguaCBcCi0JY2dlbi5oIFwKLQlkd2FyZjJkYmcuaCBcCi0JZWNvZmYuaCBcCi0JZW11bC10YXJnZXQuaCBcCi0JZW11bC5oIFwKLQlleHByLmggXAotCWZsb251bS5oIFwKLQlmcmFncy5oIFwKLQloYXNoLmggXAotCWlucHV0LWZpbGUuaCBcCi0JaXRibC1vcHMuaCBcCi0JbGlzdGluZy5oIFwKLQltYWNyby5oIFwKLQlvYmouaCBcCi0Jb3V0cHV0LWZpbGUuaCBcCi0JcmVhZC5oIFwKLQlzYi5oIFwKLQlzdHJ1Yy1zeW1ib2wuaCBcCi0Jc3Vic2Vncy5oIFwKLQlzeW1ib2xzLmggXAotCXRjLmggXAotCXdyaXRlLmgKLQotCi0jIENQVSBmaWxlcyBpbiBjb25maWcuCi0KLVRBUkdFVF9DUFVfQ0ZJTEVTID0gXAotCWNvbmZpZy90Yy1hMjlrLmMgXAotCWNvbmZpZy90Yy1hbHBoYS5jIFwKLQljb25maWcvdGMtYXJjLmMgXAotCWNvbmZpZy90Yy1hcm0uYyBcCi0JY29uZmlnL3RjLWQxMHYuYyBcCi0JY29uZmlnL3RjLWQzMHYuYyBcCi0JY29uZmlnL3RjLWZyMzAuYyBcCi0JY29uZmlnL3RjLWg4MzAwLmMgXAotCWNvbmZpZy90Yy1oODUwMC5jIFwKLQljb25maWcvdGMtaHBwYS5jIFwKLQljb25maWcvdGMtaTM4Ni5jIFwKLQljb25maWcvdGMtaTg2MC5jIFwKLQljb25maWcvdGMtaTk2MC5jIFwKLQljb25maWcvdGMtbTMyci5jIFwKLQljb25maWcvdGMtbTY4ay5jIFwKLQljb25maWcvdGMtbTg4ay5jIFwKLQljb25maWcvdGMtbWNvcmUuYyBcCi0JY29uZmlnL3RjLW1pcHMuYyBcCi0JY29uZmlnL3RjLW1uMTAyMDAuYyBcCi0JY29uZmlnL3RjLW1uMTAzMDAuYyBcCi0JY29uZmlnL3RjLW5zMzJrLmMgXAotCWNvbmZpZy90Yy1wcGMuYyBcCi0JY29uZmlnL3RjLXNoLmMgXAotCWNvbmZpZy90Yy1zcGFyYy5jIFwKLQljb25maWcvdGMtdGFob2UuYyBcCi0JY29uZmlnL3RjLXRpYzMwLmMgXAotCWNvbmZpZy90Yy10aWM4MC5jIFwKLQljb25maWcvdGMtdmF4LmMgXAotCWNvbmZpZy90Yy13NjUuYyBcCi0JY29uZmlnL3RjLXY4NTAuYyBcCi0JY29uZmlnL3RjLXo4ay5jCi0KLQotVEFSR0VUX0NQVV9IRklMRVMgPSBcCi0JY29uZmlnL3RjLWEyOWsuaCBcCi0JY29uZmlnL3RjLWFscGhhLmggXAotCWNvbmZpZy90Yy1hcmMuaCBcCi0JY29uZmlnL3RjLWFybS5oIFwKLQljb25maWcvdGMtZDEwdi5oIFwKLQljb25maWcvdGMtZDMwdi5oIFwKLQljb25maWcvdGMtZnIzMC5oIFwKLQljb25maWcvdGMtaDgzMDAuaCBcCi0JY29uZmlnL3RjLWg4NTAwLmggXAotCWNvbmZpZy90Yy1ocHBhLmggXAotCWNvbmZpZy90Yy1pMzg2LmggXAotCWNvbmZpZy90Yy1pODYwLmggXAotCWNvbmZpZy90Yy1pOTYwLmggXAotCWNvbmZpZy90Yy1tMzJyLmggXAotCWNvbmZpZy90Yy1tNjhrLmggXAotCWNvbmZpZy90Yy1tODhrLmggXAotCWNvbmZpZy90Yy1tY29yZS5oIFwKLQljb25maWcvdGMtbWlwcy5oIFwKLQljb25maWcvdGMtbW4xMDIwMC5oIFwKLQljb25maWcvdGMtbW4xMDMwMC5oIFwKLQljb25maWcvdGMtbnMzMmsuaCBcCi0JY29uZmlnL3RjLXBwYy5oIFwKLQljb25maWcvdGMtc2guaCBcCi0JY29uZmlnL3RjLXNwYXJjLmggXAotCWNvbmZpZy90Yy10YWhvZS5oIFwKLQljb25maWcvdGMtdGljMzAuaCBcCi0JY29uZmlnL3RjLXRpYzgwLmggXAotCWNvbmZpZy90Yy12YXguaCBcCi0JY29uZmlnL3RjLXc2NS5oIFwKLQljb25maWcvdGMtdjg1MC5oIFwKLQljb25maWcvdGMtejhrLmgKLQotCi0jIE9CSiBmaWxlcyBpbiBjb25maWcKLQotT0JKX0ZPUk1BVF9DRklMRVMgPSBcCi0JY29uZmlnL29iai1hb3V0LmMgXAotCWNvbmZpZy9vYmotYm91dC5jIFwKLQljb25maWcvb2JqLWNvZmYuYyBcCi0JY29uZmlnL29iai1lY29mZi5jIFwKLQljb25maWcvb2JqLWVsZi5jIFwKLQljb25maWcvb2JqLWV2YXguYyBcCi0JY29uZmlnL29iai1ocDMwMC5jIFwKLQljb25maWcvb2JqLWllZWUuYyBcCi0JY29uZmlnL29iai1zb20uYyBcCi0JY29uZmlnL29iai12bXMuYwotCi0KLU9CSl9GT1JNQVRfSEZJTEVTID0gXAotCWNvbmZpZy9vYmotYW91dC5oIFwKLQljb25maWcvb2JqLWJvdXQuaCBcCi0JY29uZmlnL29iai1jb2ZmLmggXAotCWNvbmZpZy9vYmotZWNvZmYuaCBcCi0JY29uZmlnL29iai1lbGYuaCBcCi0JY29uZmlnL29iai1ldmF4LmggXAotCWNvbmZpZy9vYmotaHAzMDAuaCBcCi0JY29uZmlnL29iai1pZWVlLmggXAotCWNvbmZpZy9vYmotc29tLmggXAotCWNvbmZpZy9vYmotdm1zLmgKLQotCi0jIEVtdWxhdGlvbiBoZWFkZXIgZmlsZXMgaW4gY29uZmlnCi0KLVRBUkdfRU5WX0hGSUxFUyA9IFwKLQljb25maWcvdGUtMzg2YnNkLmggXAotCWNvbmZpZy90ZS1hdXguaCBcCi0JY29uZmlnL3RlLWRlbHRhLmggXAotCWNvbmZpZy90ZS1kZWx0ODguaCBcCi0JY29uZmlnL3RlLWRweDIuaCBcCi0JY29uZmlnL3RlLWR5bml4LmggXAotCWNvbmZpZy90ZS1lcG9jLXBlLmggXAotCWNvbmZpZy90ZS1nZW5lcmljLmggXAotCWNvbmZpZy90ZS1nbzMyLmggXAotCWNvbmZpZy90ZS1ocDMwMC5oIFwKLQljb25maWcvdGUtaHBwYS5oIFwKLQljb25maWcvdGUtaTM4NmFpeC5oIFwKLQljb25maWcvdGUtaWM5NjAuaCBcCi0JY29uZmlnL3RlLWxpbnV4LmggXAotCWNvbmZpZy90ZS1sbmV3cy5oIFwKLQljb25maWcvdGUtbHlueC5oIFwKLQljb25maWcvdGUtbWFjaC5oIFwKLQljb25maWcvdGUtbWFjb3MuaCBcCi0JY29uZmlnL3RlLW11bHRpLmggXAotCWNvbmZpZy90ZS1uYnNkLmggXAotCWNvbmZpZy90ZS1uYnNkNTMyLmggXAotCWNvbmZpZy90ZS1wYzUzMm1hY2guaCBcCi0JY29uZmlnL3RlLXBlLmggXAotCWNvbmZpZy90ZS1wcGNudy5oIFwKLQljb25maWcvdGUtcHNvcy5oIFwKLQljb25maWcvdGUtcmlzY2l4LmggXAotCWNvbmZpZy90ZS1zcGFyY2FvdXQuaCBcCi0JY29uZmlnL3RlLXN1bjMuaCBcCi0JY29uZmlnL3RlLXN2cjQuaCBcCi0JY29uZmlnL3RlLXN5c3YzMi5oCi0KLQotIyBNdWx0aSBmaWxlcyBpbiBjb25maWcKLQotTVVMVElfQ0ZJTEVTID0gXAotCWNvbmZpZy9lLWkzODZjb2ZmLmMgXAotCWNvbmZpZy9lLWkzODZlbGYuYyBcCi0JY29uZmlnL2UtbWlwc2Vjb2ZmLmMgXAotCWNvbmZpZy9lLW1pcHNlbGYuYwotCi0KLUNPTkZJR19PQkpTID0gXAotCSQoVEFSR19DUFVfTykgXAotCSQoT0JKX0ZPUk1BVF9PKSBcCi0JJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykKLQotCi1HRU5FUklDX09CSlMgPSBcCi0JYXBwLm8gXAotCWFzLm8gXAotCWF0b2YtZ2VuZXJpYy5vIFwKLQliaWdudW0tY29weS5vIFwKLQljb25kLm8gXAotCWRlcGVuZC5vIFwKLQlkd2FyZjJkYmcubyBcCi0JZWhvcHQubyBcCi0JZXhwci5vIFwKLQlmbG9udW0ta29uc3QubyBcCi0JZmxvbnVtLWNvcHkubyBcCi0JZmxvbnVtLW11bHQubyBcCi0JZnJhZ3MubyBcCi0JaGFzaC5vIFwKLQlpbnB1dC1maWxlLm8gXAotCWlucHV0LXNjcnViLm8gXAotCWxpdGVyYWwubyBcCi0JbWVzc2FnZXMubyBcCi0Jb3V0cHV0LWZpbGUubyBcCi0JcmVhZC5vIFwKLQlzdWJzZWdzLm8gXAotCXN5bWJvbHMubyBcCi0Jd3JpdGUubyBcCi0JbGlzdGluZy5vIFwKLQllY29mZi5vIFwKLQlzdGFicy5vIFwKLQlzYi5vIFwKLQltYWNyby5vCi0KLQotT0JKUyA9ICQoQ09ORklHX09CSlMpICQoR0VORVJJQ19PQkpTKQotCi1QT1RGSUxFUyA9ICQoTVVMVElfQ0ZJTEVTKSAkKFRBUkdFVF9FTlZfSEZJTEVTKSAkKE9CSl9GT1JNQVRfSEZJTEVTKSBcCi0JJChPQkpfRk9STUFUX0NGSUxFUykgJChUQVJHRVRfQ1BVX0hGSUxFUykgJChUQVJHRVRfQ1BVX0NGSUxFUykgXAotCSQoSEZJTEVTKSAkKENGSUxFUykgJChHQVNfQ0ZJTEVTKQotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGFzLW5ldyBnYXNwLW5ldwotbm9pbnN0X1NDUklQVFMgPSAuZ2RiaW5pdAotCi1FWFRSQV9ESVNUID0gbWFrZS1nYXMuY29tCi0KLURJU1RTVFVGRiA9IG1ha2UtZ2FzLmNvbSBtNjhrLXBhcnNlLmMgaXRibC1wYXJzZS5jIGl0YmwtcGFyc2UuaCBpdGJsLWxleC5jCi0KLURJU1RDTEVBTkZJTEVTID0gdGFyZy1jcHUuaCBvYmotZm9ybWF0LmggdGFyZy1lbnYuaCBpdGJsLWNwdS5oIGNnZW4tZGVzYy5oCi0KLSMgTm93IGZpZ3VyZSBvdXQgZnJvbSB0aG9zZSB2YXJpYWJsZXMgaG93IHRvIGNvbXBpbGUgYW5kIGxpbmsuCi0KLUJBU0VESVIgPSAkKHNyY2RpcikvLi4KLUJGRERJUiA9ICQoQkFTRURJUikvYmZkCi1JTkNESVIgPSAkKEJBU0VESVIpL2luY2x1ZGUKLQotIyBUaGlzIGlzIHRoZSB2YXJpYWJsZSBhY3R1YWxseSB1c2VkIHdoZW4gd2UgY29tcGlsZS4KLSMgU3BlY2lmeSB0aGUgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgZm9yIGhlYWRlciBmaWxlcy4KLSMgQm90aCAuIGFuZCBzcmNkaXIgYXJlIHVzZWQsIGluIHRoYXQgb3JkZXIsCi0jIHNvIHRoYXQgdG0uaCBhbmQgY29uZmlnLmggd2lsbCBiZSBmb3VuZCBpbiB0aGUgY29tcGlsYXRpb24KLSMgc3ViZGlyZWN0b3J5IHJhdGhlciB0aGFuIGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoc3JjZGlyKS9jb25maWcgLUkkKElOQ0RJUikgLUkkKHNyY2RpcikvLi4gLUkkKEJGRERJUikgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi0jIFRoaXMgc2hvdWxkIGJlIHBhcmFsbGVsIHRvIElOQ0xVREVTLCBidXQgc2hvdWxkIHJlcGxhY2UgJChzcmNkaXIpCi0jIHdpdGggJCR7c3JjZGlyfSwgYW5kIHNob3VsZCB3b3JrIGluIGEgc3ViZGlyZWN0b3J5LiAgVGhpcyBpcyB1c2VkCi0jIHdoZW4gYnVpbGRpbmcgZGVwZW5kZW5jaWVzLCBiZWNhdXNlIHRoZSBkZXBlbmRlbmN5IGJ1aWxkaW5nIGlzIGRvbmUKLSMgaW4gYSBzdWJkaXJlY3RvcnkuCi1ERVBfSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLi4gLUkkJHtzcmNkaXJ9IC1JLi4vLi4vYmZkIC1JJCR7c3JjZGlyfS9jb25maWcgLUkkJHtzcmNkaXJ9Ly4uL2luY2x1ZGUgLUkkJHtzcmNkaXJ9Ly4uIC1JJCR7c3JjZGlyfS8uLi9iZmQgLUkkJHtzcmNkaXJ9Ly4uL2ludGwgLUkuLi8uLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotIyBIb3cgdG8gbGluayB3aXRoIGJvdGggb3VyIHNwZWNpYWwgbGlicmFyeSBmYWNpbGl0aWVzCi0jIGFuZCB0aGUgc3lzdGVtJ3MgaW5zdGFsbGVkIGxpYnJhcmllcy4KLQotR0FTTElCUyA9IEBPUENPREVTX0xJQkAgQEJGRExJQkAgLi4vbGliaWJlcnR5L2xpYmliZXJ0eS5hCi0KLSMgRmlsZXMgdG8gYmUgY29waWVkIGF3YXkgYWZ0ZXIgZWFjaCBzdGFnZSBpbiBidWlsZGluZy4KLVNUQUdFU1RVRkYgPSAqLm8gJChub2luc3RfUFJPR1JBTVMpCi0KLWFzX25ld19TT1VSQ0VTID0gJChHQVNfQ0ZJTEVTKQotYXNfbmV3X0xEQUREID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExMSUJTKQotCi1hc19uZXdfREVQRU5ERU5DSUVTID0gJChUQVJHX0NQVV9PKSAkKE9CSl9GT1JNQVRfTykgJChBVE9GX1RBUkdfTykgXAotCSQoZXh0cmFfb2JqZWN0cykgJChHQVNMSUJTKSAkKElOVExERVBTKQotCi0KLWdhc3BfbmV3X1NPVVJDRVMgPSBnYXNwLmMgbWFjcm8uYyBzYi5jIGhhc2guYwotZ2FzcF9uZXdfTERBREQgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLWdhc3BfbmV3X0RFUEVOREVOQ0lFUyA9IC4uL2xpYmliZXJ0eS9saWJpYmVydHkuYSAkKElOVExERVBTKQotCi1FWFBFQ1QgPSBgaWYgWyAtZiAkJHtyb290bWV9Ly4uL2V4cGVjdC9leHBlY3QgXSA7IHRoZW4gXAotICAgICAgICAgIGVjaG8gJCR7cm9vdG1lfS8uLi9leHBlY3QvZXhwZWN0IDsgXAotICAgICAgICAgIGVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3JjZGlyfS8uLi9kZWphZ251L3J1bnRlc3QgXSA7IHRoZW4gXAotCQllY2hvICQke3NyY2Rpcn0vLi4vZGVqYWdudS9ydW50ZXN0IDsgZWxzZSBlY2hvIHJ1bnRlc3Q7IFwKLQkgICBmaWAKLQotUlVOVEVTVEZMQUdTID0gCi0KLSMgVGhlIG02OGsgb3BlcmFuZCBwYXJzZXIuCi0KLUVYVFJBX2FzX25ld19TT1VSQ0VTID0gY29uZmlnL202OGstcGFyc2UueQotCi0jIHN0YW5kLWFsb25lIGl0YmwgYXNzZW1ibGVyICYgZGlzYXNzZW1ibGVyCi0KLUVYVFJBX1BST0dSQU1TID0gaXRibC10ZXN0Ci1pdGJsX3Rlc3RfU09VUkNFUyA9IGl0YmwtcGFyc2UueSBpdGJsLWxleC5sCi1pdGJsX3Rlc3RfTERBREQgPSBpdGJsLXRlc3Qtb3BzLm8gaXRibC10ZXN0Lm8gJChHQVNMSUJTKSBATEVYTElCQAotCi0jIENHRU4gaW50ZXJmYWNlLgotCi1DR0VOX0NQVV9QUkVGSVggPSBAY2dlbl9jcHVfcHJlZml4QAotCi0jIFJlbWFrZSB0aGUgaW5mbyBmaWxlcy4KLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgY29yZSBzdGFtcC1tay5jb20gXAotCXRlc3RzdWl0ZS8qLm8gdGVzdHN1aXRlLyoub3V0IHRlc3RzdWl0ZS9nYXMubG9nIHRlc3RzdWl0ZS9nYXMuc3VtIFwKLQl0ZXN0c3VpdGUvc2l0ZS5leHAgc2l0ZS5iYWsgc2l0ZS5leHAgc3RhZ2Ugc3RhZ2UxIHN0YWdlMgotCi0KLUNMRUFORklMRVMgPSBkZXAuc2VkIC50Y2RlcCAub2JqZGVwIC5kZXAyIC5kZXAxIC5kZXBhIC5kZXAgLmRlcGRpcgotCi1hZ2FpbnN0ID0gc3RhZ2UyCi0KLSMgQXV0b21hdGljIGRlcGVuZGVuY3kgY29tcHV0YXRpb24uICBUaGlzIGlzIGEgcmVhbCBwYWluLCBiZWNhdXNlIHRoZQotIyBkZXBlbmRlbmNpZXMgY2hhbmdlIGJhc2VkIG9uIHRhcmdldF9jcHVfdHlwZSBhbmQgb2JqX2Zvcm1hdC4gIFdlCi0jIGN1cnJlbnRseSBpZ25vcmUgYW55IGRlcGVuZGVuY2llcyBjYXVzZWQgYnkgZW11bGF0aW9uIGZpbGVzLgotCi1ERVBfRklMRV9ERVBTID0gJChDRklMRVMpICQoSEZJTEVTKSAkKFRBUkdFVF9DUFVfQ0ZJTEVTKSBcCi0JJChUQVJHRVRfQ1BVX0hGSUxFUykgJChPQkpfRk9STUFUX0NGSUxFUykgJChPQkpfRk9STUFUX0hGSUxFUykKLQotCi1UQ0RFUF9hMjlrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLQotVENERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS9hMjlrLmgKLQotVENERVBfYTI5a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotCi1UQ0RFUF9hbHBoYV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggZWNvZmYuaCAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLQotVENERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1UQ0RFUF9hbHBoYV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmggJChJTkNESVIpL2VsZi9hbHBoYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKHNyY2RpcikvY29uZmlnL2F0b2YtdmF4LmMKLQotVENERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvYXRvZi12YXguYwotCi1UQ0RFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKElOQ0RJUikvZWxmL2FyYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1UQ0RFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX2FybV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2FybS5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX2FybV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2VsZi9hcm0uaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMTB2LmggXAotICAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotVENERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oICQoSU5DRElSKS9lbGYvcHBjLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX2QzMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLQotVENERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi0KLVRDREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9mcjMwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2ZyMzAtZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvZnIzMC1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9oODMwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDgzMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmgKLQotVENERVBfaDgzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9oODMwMC5oCi0KLVRDREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi0KLVRDREVQX2g4NTAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL2g4NTAwLW9wYy5oCi0KLVRDREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChCRkRESVIpL2xpYmhwcGEuaCAkKEJGRERJUikvbGliYmZkLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaAotCi1UQ0RFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKEJGRERJUikvbGliYmZkLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLQotVENERVBfaTM4Nl9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIFwKLSAgJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotVENERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9pMzg2LmgKLQotVENERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTM4Ni5oCi0KLVRDREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL2k4NjAuaAotCi1UQ0RFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTg2MC5oCi0KLVRDREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggJChJTkNESVIpL29wY29kZS9pODYwLmgKLQotVENERVBfaTk2MF9ib3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYm91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL2k5NjAuaAotCi1UQ0RFUF9pOTYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2k5NjAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLVRDREVQX2k5NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pOTYwLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvaTk2MC5oCi0KLVRDREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9tMzJyX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbTMyci5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL3N5bWNhdC5oICQoc3JjZGlyKS8uLi9vcGNvZGVzL20zMnItZGVzYy5oIFwKLSAgJChJTkNESVIpL29wY29kZS9jZ2VuLmggJChzcmNkaXIpLy4uL29wY29kZXMvbTMyci1vcGMuaCBcCi0gIGNnZW4uaAotCi1UQ0RFUF9tNjhrX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi1UQ0RFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLVRDREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaCAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaCBcCi0gICQoSU5DRElSKS9lbGYvbTY4ay5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotVENERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmggJChJTkNESVIpL29wY29kZS9tNjhrLmggXAotICAkKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UuaAotCi1UQ0RFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvY29uZmlnL204OGstb3Bjb2RlLmgKLQotVENERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoc3JjZGlyKS9jb25maWcvbTg4ay1vcGNvZGUuaAotCi1UQ0RFUF9tY29yZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvbWNvcmUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaAotCi1UQ0RFUF9tY29yZV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9tY29yZS1vcGMuaCBcCi0gICQoSU5DRElSKS9lbGYvbWNvcmUuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi0KLVRDREVQX21pcHNfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCBcCi0gICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotVENERVBfbWlwc19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBcCi0gIGl0Ymwtb3BzLmggZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oCi0KLVRDREVQX21pcHNfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgZWNvZmYuaCAkKElOQ0RJUikvY29mZi9zeW0uaCAkKElOQ0RJUikvY29mZi9lY29mZi5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9taXBzLmggXAotICBpdGJsLW9wcy5oCi0KLVRDREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBpdGJsLW9wcy5oIFwKLSAgJChJTkNESVIpL2VsZi9taXBzLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaAotCi1UQ0RFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDIwMC5oCi0KLVRDREVQX21uMTAyMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotCi1UQ0RFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi0KLVRDREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotCi1UQ0RFUF9uczMya19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLVRDREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggJChJTkNESVIpL29ic3RhY2suaAotCi1UQ0RFUF9uczMya19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1UQ0RFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi0KLVRDREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9wcGMuaCAkKElOQ0RJUikvZWxmL3BwYy5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotCi1UQ0RFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotCi1UQ0RFUF9zaF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKHNyY2RpcikvLi4vb3Bjb2Rlcy9zaC1vcGMuaAotCi1UQ0RFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotCi1UQ0RFUF9zcGFyY19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3BhcmMuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLQotVENERVBfc3BhcmNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS9zcGFyYy5oICQoSU5DRElSKS9lbGYvc3BhcmMuaCBcCi0gICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotVENERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvdGFob2UuaAotCi1UQ0RFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotVENERVBfdGFob2VfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oICQoSU5DRElSKS9vYnN0YWNrLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL3RhaG9lLmgKLQotVENERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLVRDREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotCi1UQ0RFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggJChJTkNESVIpL29wY29kZS90aWMzMC5oCi0KLVRDREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotCi1UQ0RFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi0KLVRDREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLVRDREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdmF4LWluc3QuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotVENERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggJChzcmNkaXIpL2NvbmZpZy92YXgtaW5zdC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oCi0KLVRDREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiAkKHNyY2RpcikvY29uZmlnL3ZheC1pbnN0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdmF4LmgKLQotVENERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi0KLVRDREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChzcmNkaXIpLy4uL29wY29kZXMvdzY1LW9wYy5oCi0KLVRDREVQX3Y4NTBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL29wY29kZS92ODUwLmgKLQotVENERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oCi0KLVRDREVQX3o4a19jb2ZmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCBcCi0gICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9jb2ZmL3o4ay5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1UQ0RFUF96OGtfZWxmID0gJChzcmNkaXIpLy4uL29wY29kZXMvejhrLW9wYy5oICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oIFwKLSAgJChCRkRESVIpL2VsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmgKLQotVENERVBfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmggXAotICAkKEJGRERJUikvc29tLmgKLQotVENERVBfaTM4Nl9tdWx0aSA9ICQoVENERVBfaTM4Nl9jb2ZmKSAkKFRDREVQX2kzODZfZWxmKQotVENERVBfbWlwc19tdWx0aSA9ICQoVENERVBfbWlwc19jb2ZmKSAkKFRDREVQX21pcHNfZWNvZmYpIFwKLSAgJChUQ0RFUF9taXBzX2VsZikKLQotT0JKREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX2EyOWtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvYTI5ay5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9hMjlrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfYWxwaGFfZWNvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLQotT0JKREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9lbGYvYWxwaGEuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2FscGhhX2V2YXggPSAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oCi1PQkpERVBfYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hcmMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2FybV9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfZDEwdl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfZDEwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9kMzB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDMwdi5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2ZyMzBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWZyMzAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfaDgzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2g4MzAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2g4MzAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaDgzMDAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9oODUwMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaDg1MDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaDg1MDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfaDg1MDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX2hwcGFfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggJChCRkRESVIpL2VsZjMyLWhwcGEuaCBcCi0gICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL2VsZi9ocHBhLmggJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaCBcCi0gIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9pMzg2X2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9pMzg2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL2kzODYuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfaTM4Nl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9pODYwX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9pODYwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9pODYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX20zMnJfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX20zMnJfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfbTY4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tNjhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX202OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuYyAkKHNyY2RpcikvY29uZmlnL29iai1ocDMwMC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfbTg4a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbTg4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9tODhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX204OGtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9taXBzX2FvdXQgPSAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9taXBzX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1pcHMuaCBcCi0gIGVjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltLmggJChJTkNESVIpL2NvZmYvZWNvZmYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChCRkRESVIpL2xpYmVjb2ZmLmgKLQotT0JKREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggXAotICAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9tbjEwMjAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMjAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX21uMTAzMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX21uMTAzMDBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF9uczMya19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9wcGNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9yczYwMDAuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfcHBjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtcHBjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL3BwYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfc2hfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNoLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NoLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3NoX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX3NwYXJjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zcGFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9zcGFyYy5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF9zcGFyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF90YWhvZV9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF90aWMzMF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljMzAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmgKLQotT0JKREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oCi0KLU9CSkRFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfdGljODBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3RpYzgwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3RpYzgwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGljODAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF92YXhfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaAotCi1PQkpERVBfdmF4X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12YXguaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCBzdWJzZWdzLmgKLQotT0JKREVQX3ZheF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIHN1YnNlZ3MuaCBcCi0gICQoSU5DRElSKS9vYnN0YWNrLmggJChJTkNESVIpL2FvdXQvYW91dDY0LmgKLQotT0JKREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZiBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oCi0KLU9CSkRFUF93NjVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi93NjUuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfdzY1X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdzY1Lmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfdjg1MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdjg1MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9hb3V0L2FvdXQ2NC5oCi0KLU9CSkRFUF96OGtfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi96OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaAotCi1PQkpERVBfejhrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtejhrLmggc3Vic2Vncy5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYW91dC9hb3V0NjQuaAotCi1PQkpERVBfaHBwYV9zb20gPSAkKHNyY2RpcikvY29uZmlnL29iai1zb20uaCBzdWJzZWdzLmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoQkZERElSKS9saWJocHBhLmggJChCRkRESVIpL3NvbS5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotCi1PQkpERVBfaTM4Nl9tdWx0aSA9ICQoT0JKREVQX2kzODZfY29mZikgJChPQkpERVBfaTM4Nl9lbGYpCi1PQkpERVBfbWlwc19tdWx0aSA9ICQoT0JKREVQX21pcHNfY29mZikgJChPQkpERVBfbWlwc19lY29mZikgXAotICAkKE9CSkRFUF9taXBzX2VsZikKLQotREVQX2EyOWtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWEyOWsuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYTI5a19jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtYTI5ay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hMjlrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2EyOWtfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hMjlrLmgKLQotREVQX2FscGhhX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1hbHBoYS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FscGhhX2Vjb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQX2FscGhhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYWxwaGEuaAotCi1ERVBfYWxwaGFfZXZheCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWV2YXguaCAkKHNyY2RpcikvY29uZmlnL3RjLWFscGhhLmgKLURFUF9hcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2FyY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFyYy5oCi0KLURFUF9hcm1fYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9hcm1fY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWFybS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9hcm0uaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfYXJtX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtYXJtLmgKLQotREVQX2QxMHZfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQxMHYuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9kMTB2X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtZDEwdi5oCi0KLURFUF9kMzB2X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1kMzB2LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfZDMwdl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWQzMHYuaAotCi1ERVBfZnIzMF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtZnIzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2ZyMzBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1mcjMwLmgKLQotREVQX2g4MzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODMwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODMwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9oODMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4MzAwLmgKLQotREVQX2g4NTAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1oODUwMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9oODUwMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9oODUwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLWg4NTAwLmgKLQotREVQX2hwcGFfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWhwcGEuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9ocHBhX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaHBwYS5oICQoQkZERElSKS9lbGYzMi1ocHBhLmggXAotICAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9lbGYvaHBwYS5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLQotREVQX2kzODZfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWkzODYuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTM4Nl9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTM4Ni5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi9pMzg2LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2kzODZfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pMzg2LmgKLQotREVQX2k4NjBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk4NjAuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfaTg2MF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtaTg2MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX2k4NjBfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1pODYwLmgKLQotREVQX2k5NjBfYm91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaAotREVQX2k5NjBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLWk5NjAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvaTk2MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9pOTYwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtaTk2MC5oCi0KLURFUF9tMzJyX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tMzJyLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTMycl9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW0zMnIuaAotCi1ERVBfbTY4a19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbTY4ay5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tNjhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL202OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTY4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW02OGsuaAotCi1ERVBfbTY4a19ocDMwMCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWhwMzAwLmggJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oIFwKLSAgJChzcmNkaXIpL2NvbmZpZy90Yy1tNjhrLmggJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tODhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tODhrLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL204OGsuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbTg4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW04OGsuaAotCi1ERVBfbWNvcmVfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1jb3JlLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL21jb3JlLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX21jb3JlX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbWNvcmUuaAotCi1ERVBfbWlwc19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtbWlwcy5oIFwKLSAgJChCRkRESVIpL2xpYmFvdXQuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9taXBzX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbWlwc19lY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVjb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmggXAotICBlY29mZi5oICQoSU5DRElSKS9jb2ZmL3N5bS5oICQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmgKLQotREVQX21pcHNfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1taXBzLmgKLQotREVQX21uMTAyMDBfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF9tbjEwMjAwX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbW4xMDIwMC5oCi0KLURFUF9tbjEwMzAwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1tbjEwMzAwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfbW4xMDMwMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLW1uMTAzMDAuaAotCi1ERVBfbnMzMmtfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLW5zMzJrLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX25zMzJrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1uczMyay5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX25zMzJrX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtbnMzMmsuaAotCi1ERVBfcHBjX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy1wcGMuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvcnM2MDAwLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3BwY19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXBwYy5oCi0KLURFUF9zaF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtc2guaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc2guaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc2hfZWxmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChzcmNkaXIpL2NvbmZpZy90Yy1zaC5oCi0KLURFUF9zcGFyY19hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaCBcCi0gICQoQkZERElSKS9saWJhb3V0LmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfc3BhcmNfY29mZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWNvZmYuaCAkKHNyY2RpcikvY29uZmlnL3RjLXNwYXJjLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoSU5DRElSKS9jb2ZmL3NwYXJjLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3NwYXJjX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtc3BhcmMuaAotCi1ERVBfdGFob2VfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRhaG9lLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RhaG9lX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10YWhvZS5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RhaG9lX2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdGFob2UuaAotCi1ERVBfdGljMzBfYW91dCA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWFvdXQuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3RpYzMwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWMzMC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWMzMC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF90aWMzMF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzMwLmgKLQotREVQX3RpYzgwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy10aWM4MC5oIFwKLSAgJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKElOQ0RJUikvY29mZi90aWM4MC5oICQoQkZERElSKS9saWJjb2ZmLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oCi0KLURFUF90aWM4MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXRpYzgwLmgKLQotREVQX3ZheF9hb3V0ID0gJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKEJGRERJUikvbGliYW91dC5oICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3ZheF9jb2ZmID0gJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdmF4X2VsZiA9ICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoc3JjZGlyKS9jb25maWcvdGMtdmF4LmgKLQotREVQX3ZheF92bXMgPSAkKHNyY2RpcikvY29uZmlnL29iai12bXMuaCAkKHNyY2RpcikvY29uZmlnL3RjLXZheC5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotCi1ERVBfdzY1X2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy13NjUuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvdzY1LmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3c2NV9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXc2NS5oCi0KLURFUF92ODUwX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy12ODUwLmggXAotICAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oICQoQkZERElSKS9saWJjb2ZmLmggJChJTkNESVIpL2JmZGxpbmsuaAotCi1ERVBfdjg1MF9lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXY4NTAuaAotCi1ERVBfejhrX2NvZmYgPSAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmggJChzcmNkaXIpL2NvbmZpZy90Yy16OGsuaCBcCi0gICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvejhrLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmgKLQotREVQX3o4a19lbGYgPSAkKHNyY2RpcikvY29uZmlnL29iai1lbGYuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKHNyY2RpcikvY29uZmlnL3RjLXo4ay5oCi0KLURFUF9ocHBhX3NvbSA9ICQoQkZERElSKS9zb20uaAotREVQX2kzODZfbXVsdGkgPSAkKERFUF9pMzg2X2NvZmYpICQoREVQX2kzODZfZWxmKQotREVQX21pcHNfbXVsdGkgPSAkKERFUF9taXBzX2NvZmYpICQoREVQX21pcHNfZWNvZmYpIFwKLSAgJChERVBfbWlwc19lbGYpCi0KLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gIC5nZGJpbml0Ci1ub2luc3RfUFJPR1JBTVMgPSAgYXMtbmV3JChFWEVFWFQpIGdhc3AtbmV3JChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKG5vaW5zdF9QUk9HUkFNUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotaXRibF90ZXN0X09CSkVDVFMgPSAgaXRibC1wYXJzZS5vIGl0YmwtbGV4Lm8KLWl0YmxfdGVzdF9ERVBFTkRFTkNJRVMgPSAgaXRibC10ZXN0LW9wcy5vIGl0YmwtdGVzdC5vIFwKLS4uL2xpYmliZXJ0eS9saWJpYmVydHkuYQotaXRibF90ZXN0X0xERkxBR1MgPSAKLWFzX25ld19PQkpFQ1RTID0gIGFwcC5vIGFzLm8gYXRvZi1nZW5lcmljLm8gYmlnbnVtLWNvcHkubyBjb25kLm8gXAotZGVwZW5kLm8gZHdhcmYyZGJnLm8gZWNvZmYubyBlaG9wdC5vIGV4cHIubyBmbG9udW0tY29weS5vIFwKLWZsb251bS1rb25zdC5vIGZsb251bS1tdWx0Lm8gZnJhZ3MubyBoYXNoLm8gaW5wdXQtZmlsZS5vIGlucHV0LXNjcnViLm8gXAotbGlzdGluZy5vIGxpdGVyYWwubyBtYWNyby5vIG1lc3NhZ2VzLm8gb3V0cHV0LWZpbGUubyByZWFkLm8gc2IubyBcCi1zdGFicy5vIHN1YnNlZ3MubyBzeW1ib2xzLm8gd3JpdGUubwotYXNfbmV3X0xERkxBR1MgPSAKLWdhc3BfbmV3X09CSkVDVFMgPSAgZ2FzcC5vIG1hY3JvLm8gc2IubyBoYXNoLm8KLWdhc3BfbmV3X0xERkxBR1MgPSAKLVNDUklQVFMgPSAgJChub2luc3RfU0NSSVBUUykKLQotTEVYX09VVFBVVF9ST09UID0gQExFWF9PVVRQVVRfUk9PVEAKLUxFWExJQiA9IEBMRVhMSUJACi1ZTFdSQVAgPSAkKHRvcF9zcmNkaXIpLy4uL3lsd3JhcAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICBSRUFETUUgLi9zdGFtcC1oLmluIENPUFlJTkcgQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIFwKLU1ha2VmaWxlLmluIE5FV1MgYWNpbmNsdWRlLm00IGFjbG9jYWwubTQgY29uZmlnLmluIGNvbmZpZy9tNjhrLXBhcnNlLmMgXAotY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBnZGJpbml0LmluIGl0YmwtbGV4LmMgaXRibC1wYXJzZS5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGl0YmxfdGVzdF9TT1VSQ0VTKSAkKGFzX25ld19TT1VSQ0VTKSAkKEVYVFJBX2FzX25ld19TT1VSQ0VTKSAkKGdhc3BfbmV3X1NPVVJDRVMpCi1PQkpFQ1RTID0gJChpdGJsX3Rlc3RfT0JKRUNUUykgJChhc19uZXdfT0JKRUNUUykgJChnYXNwX25ld19PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAubCAubG8gLm8gLnMgLnkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgTWFrZWZpbGUKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiAgJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMKLQljZCAkKHRvcF9idWlsZGRpcikgXAotCSAgJiYgQ09ORklHX0ZJTEVTPSRAIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotJChBQ0xPQ0FMX000KTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBjb25maWd1cmUuaW4gIGFjaW5jbHVkZS5tNAotCWNkICQoc3JjZGlyKSAmJiAkKEFDTE9DQUwpCi0KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfU1RBVFVTX0RFUEVOREVOQ0lFUykKLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0kKHNyY2RpcikvY29uZmlndXJlOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpICQoQ09ORklHVVJFX0RFUEVOREVOQ0lFUykKLQljZCAkKHNyY2RpcikgJiYgJChBVVRPQ09ORikKLQotY29uZmlnLmg6IHN0YW1wLWgKLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgc3RhbXAtaDsgXAotCQkkKE1BS0UpIHN0YW1wLWg7IFwKLQllbHNlIDo7IGZpCi1zdGFtcC1oOiAkKHNyY2RpcikvY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Y29uZmlnLmg6Y29uZmlnLmluIFwKLQkgICAgICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCUBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWggMj4gL2Rldi9udWxsCi0kKHNyY2RpcikvY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgY29uZmlnLmgKLQotbWFpbnRhaW5lci1jbGVhbi1oZHI6Ci0uZ2RiaW5pdDogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5zdGF0dXMgZ2RiaW5pdC5pbgotCWNkICQodG9wX2J1aWxkZGlyKSAmJiBDT05GSUdfRklMRVM9JEA6Z2RiaW5pdC5pbiBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQktdGVzdCAteiAiJChub2luc3RfUFJPR1JBTVMpIiB8fCBybSAtZiAkKG5vaW5zdF9QUk9HUkFNUykKLQotZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi1tYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TOgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLnMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLm8gY29yZSAqLmNvcmUKLQotY2xlYW4tY29tcGlsZToKLQotZGlzdGNsZWFuLWNvbXBpbGU6Ci0JLXJtIC1mICoudGFiLmMKLQotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlOgotCi0uYy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotLnMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5TLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi1tb3N0bHljbGVhbi1saWJ0b29sOgotCS1ybSAtZiAqLmxvCi0KLWNsZWFuLWxpYnRvb2w6Ci0JLXJtIC1yZiAubGlicyBfbGlicwotCi1kaXN0Y2xlYW4tbGlidG9vbDoKLQotbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sOgotCi1pdGJsLXRlc3QkKEVYRUVYVCk6ICQoaXRibF90ZXN0X09CSkVDVFMpICQoaXRibF90ZXN0X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgaXRibC10ZXN0JChFWEVFWFQpCi0JJChMSU5LKSAkKGl0YmxfdGVzdF9MREZMQUdTKSAkKGl0YmxfdGVzdF9PQkpFQ1RTKSAkKGl0YmxfdGVzdF9MREFERCkgJChMSUJTKQotCi1hcy1uZXckKEVYRUVYVCk6ICQoYXNfbmV3X09CSkVDVFMpICQoYXNfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgYXMtbmV3JChFWEVFWFQpCi0JJChMSU5LKSAkKGFzX25ld19MREZMQUdTKSAkKGFzX25ld19PQkpFQ1RTKSAkKGFzX25ld19MREFERCkgJChMSUJTKQotCi1nYXNwLW5ldyQoRVhFRVhUKTogJChnYXNwX25ld19PQkpFQ1RTKSAkKGdhc3BfbmV3X0RFUEVOREVOQ0lFUykKLQlAcm0gLWYgZ2FzcC1uZXckKEVYRUVYVCkKLQkkKExJTkspICQoZ2FzcF9uZXdfTERGTEFHUykgJChnYXNwX25ld19PQkpFQ1RTKSAkKGdhc3BfbmV3X0xEQUREKSAkKExJQlMpCi0ubC5jOgotCSQoTEVYKSAkKEFNX0xGTEFHUykgJChMRkxBR1MpICQ8ICYmIG12ICQoTEVYX09VVFBVVF9ST09UKS5jICRACi0ueS5jOgotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJDwgeS50YWIuYyAkKi5jIHkudGFiLmggJCouaCAtLSAkKEFNX1lGTEFHUykgJChZRkxBR1MpCi1jb25maWcvbTY4ay1wYXJzZS5oOiBjb25maWcvbTY4ay1wYXJzZS5jCi1pdGJsLXBhcnNlLmg6IGl0YmwtcGFyc2UuYwotCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1ERUpBVE9PTCA9ICQoUEFDS0FHRSkKLQotUlVOVEVTVERFRkFVTFRGTEFHUyA9IC0tdG9vbCAkKERFSkFUT09MKSAtLXNyY2RpciAkJHNyY2Rpcgotc2l0ZS5leHA6IE1ha2VmaWxlCi0JQGVjaG8gJ01ha2luZyBhIG5ldyBzaXRlLmV4cCBmaWxlLi4uJwotCUB0ZXN0ICEgLWYgc2l0ZS5iYWsgfHwgcm0gLWYgc2l0ZS5iYWsKLQlAZWNobyAnIyMgdGhlc2UgdmFyaWFibGVzIGFyZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBtYWtlICMjJyA+ICRALXQKLQlAZWNobyAnIyBEbyBub3QgZWRpdCBoZXJlLiAgSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhlc2UgdmFsdWVzJyA+PiAkQC10Ci0JQGVjaG8gJyMgZWRpdCB0aGUgbGFzdCBzZWN0aW9uJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0b29sICQoREVKQVRPT0wpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBzcmNkaXIgJChzcmNkaXIpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBvYmpkaXInIGBwd2RgID4+ICRALXQKLQlAZWNobyAnc2V0IGhvc3RfYWxpYXMgJChob3N0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF90cmlwbGV0ICQoaG9zdF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X2FsaWFzICQodGFyZ2V0X2FsaWFzKScgPj4gJEAtdAotCUBlY2hvICdzZXQgdGFyZ2V0X3RyaXBsZXQgJCh0YXJnZXRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX2FsaWFzICQoYnVpbGRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBidWlsZF90cmlwbGV0ICQoYnVpbGRfdHJpcGxldCknID4+ICRALXQKLQlAZWNobyAnIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUgZ2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gRG8gTm90IEVkaXQgIyMnID4+ICRALXQKLQlAdGVzdCAhIC1mIHNpdGUuZXhwIHx8IHNlZCAnMSwvXiMjIEFsbCB2YXJpYWJsZXMgYWJvdmUgYXJlLiojIy8gZCcgc2l0ZS5leHAgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgbXYgc2l0ZS5leHAgc2l0ZS5iYWsKLQlAbXYgJEAtdCBzaXRlLmV4cAotaW5mby1hbToKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06Ci1kdmk6IGR2aS1yZWN1cnNpdmUKLWNoZWNrLWFtOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGNoZWNrLURFSkFHTlUKLWNoZWNrOiBjaGVjay1yZWN1cnNpdmUKLWluc3RhbGxjaGVjay1hbToKLWluc3RhbGxjaGVjazogaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbC1pbmZvLWFtOiAKLWluc3RhbGwtaW5mbzogaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZQotYWxsLXJlY3Vyc2l2ZS1hbTogY29uZmlnLmgKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBhbGwtcmVjdXJzaXZlCi0KLWluc3RhbGwtZXhlYy1hbTogaW5zdGFsbC1leGVjLWxvY2FsCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoU0NSSVBUUykgY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChNT1NUTFlDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChNT1NUTFlDTEVBTkZJTEVTKQotCi1jbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKENMRUFORklMRVMpIiB8fCBybSAtZiAkKENMRUFORklMRVMpCi0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIml0YmwtbGV4bGNvbmZpZy9tNjhrLXBhcnNlaGNvbmZpZy9tNjhrLXBhcnNlY2l0YmwtcGFyc2VoaXRibC1wYXJzZWMiIHx8IHJtIC1mIGl0YmwtbGV4bCBjb25maWcvbTY4ay1wYXJzZWggY29uZmlnL202OGstcGFyc2VjIGl0YmwtcGFyc2VoIGl0YmwtcGFyc2VjCi1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1vc3RseWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBcCi0JCW1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdFBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLXRhZ3MgY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1jb21waWxlIFwKLQkJZGlzdGNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLXRhZ3MgZGlzdGNsZWFuLWdlbmVyaWMgXAotCQljbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBcCi0JCW1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi10YWdzIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBcCi0JCWRpc3RjbGVhbi1hbQotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCi1tYWludGFpbmVyLWNsZWFuOiBtYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLS5QSE9OWTogbW9zdGx5Y2xlYW4taGRyIGRpc3RjbGVhbi1oZHIgY2xlYW4taGRyIG1haW50YWluZXItY2xlYW4taGRyIFwKLW1vc3RseWNsZWFuLW5vaW5zdFBST0dSQU1TIGRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUyBcCi1jbGVhbi1ub2luc3RQUk9HUkFNUyBtYWludGFpbmVyLWNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBpbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBcCi1kdmktcmVjdXJzaXZlIG1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBjaGVjay1ERUpBR05VIFwKLWluZm8tYW0gaW5mbyBkdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgXAotaW5zdGFsbC1pbmZvLWFtIGluc3RhbGwtaW5mbyBhbGwtcmVjdXJzaXZlLWFtIGluc3RhbGwtZXhlYy1sb2NhbCBcCi1pbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBcCi1pbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi1wby9QT1RGSUxFUy5pbjogQE1BSU5UQCBNYWtlZmlsZQotCWZvciBmaWxlIGluICQoUE9URklMRVMpOyBkbyBlY2hvICQkZmlsZTsgZG9uZSB8IHNvcnQgPiB0bXAgXAotCSAgJiYgbXYgdG1wICQoc3JjZGlyKS9wby9QT1RGSUxFUy5pbgotCi0kKHNyY2RpcikvbWFrZS1nYXMuY29tOiBzdGFtcC1tay5jb20KLXN0YW1wLW1rLmNvbTogdm1zY29uZi5zaCBNYWtlZmlsZQotCXNoICQoc3JjZGlyKS92bXNjb25mLnNoICQoR0VORVJJQ19PQkpTKSA+IG5ldy1tYWtlLmNvbQotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSBuZXctbWFrZS5jb20gJChzcmNkaXIpL21ha2UtZ2FzLmNvbQotCXRvdWNoIHN0YW1wLW1rLmNvbQotZGlzdHN0dWZmOiAkKERJU1RTVFVGRikgaW5mbwotCi0kKE9CSlMpOiBAQUxMX09CSl9ERVBTQAotCi0jIFN0dWZmIHRoYXQgZXZlcnkgb2JqZWN0IGZpbGUgZGVwZW5kcyB1cG9uLiAgSWYgYW55dGhpbmcgaXMgcmVtb3ZlZAotIyBmcm9tIHRoaXMgbGlzdCwgcmVtb3ZlIGl0IGZyb20gZGVwLWluLnNlZCBhcyB3ZWxsLgotJChPQkpTKTogY29uZmlnLmggYXMuaCAkKFRBUkdfRU5WX0gpICQoT0JKX0ZPUk1BVF9IKSAkKFRBUkdfQ1BVX0gpIGZsb251bS5oIFwKLQlleHByLmggd3JpdGUuaCBmcmFncy5oIGhhc2guaCByZWFkLmggc3ltYm9scy5oIHRjLmggXAotCW9iai5oIGxpc3RpbmcuaCBiaWdudW0uaCBiaXRfZml4LmggJChJTkNESVIpL2xpYmliZXJ0eS5oIGFzaW50bC5oCi0KLWNoZWNrLURFSkFHTlU6IHNpdGUuZXhwCi0JaWYgWyAtZCB0ZXN0c3VpdGUgXTsgdGhlbiBcCi0JICB0cnVlOyBcCi0JZWxzZSBcCi0JICBta2RpciB0ZXN0c3VpdGU7IFwKLQlmaQotCXJtIC1mIHRlc3RzdWl0ZS9zaXRlLmV4cAotCWNwIHNpdGUuZXhwIHRlc3RzdWl0ZS9zaXRlLmV4cAotCXJvb3RtZT1gcHdkYDsgZXhwb3J0IHJvb3RtZTsgXAotCXNyY2Rpcj1gY2QgJHtzcmNkaXJ9OyBwd2RgIDsgZXhwb3J0IHNyY2RpciA7IFwKLQlFWFBFQ1Q9JHtFWFBFQ1R9IDsgZXhwb3J0IEVYUEVDVCA7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQljZCB0ZXN0c3VpdGU7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY2Rpcn0vdGVzdHN1aXRlIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFRoZSBpbXBsaWNpdCAuYy5vIHJ1bGUgZG9lc24ndCB3b3JrIGZvciB0aGVzZSwgcGVyaGFwcyBiZWNhdXNlIG9mCi0jIHRoZSB2YXJpYWJsZXMsIG9yIHBlcmhhcHMgYmVjYXVzZSB0aGUgc291cmNlcyBhcmUgbm90IG9uIHZwYXRoLgotJChUQVJHX0NQVV9PKTogJChUQVJHX0NQVV9DKSAkKFRBUkdfQ1BVX0RFUF9AdGFyZ2V0X2NwdV90eXBlQCkKLQkkKENPTVBJTEUpIC1jICQoVEFSR19DUFVfQykKLSQoQVRPRl9UQVJHX08pOiAkKEFUT0ZfVEFSR19DKQotCSQoQ09NUElMRSkgLWMgJChBVE9GX1RBUkdfQykKLQotIyBlY29mZi5jIG9ubHkgaGFzIGZ1bGwgZGVwZW5kZW5jaWVzIHdoZW4gRUNPRkZfREVCVUdHSU5HIGlzIGRlZmluZWQsCi0jIHNvIHRoZSBhdXRvbWF0aWMgZGVwZW5kZW5jeSBzdHVmZiBkb2Vzbid0IHdvcmsuCi1lY29mZi5vIDogZWNvZmYuYyBlY29mZi5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChJTkNESVIpL2NvZmYvc3ltLmggXAotCSQoSU5DRElSKS9jb2ZmL2Vjb2ZmLmggJChJTkNESVIpL2NvZmYvc3ltY29uc3QuaCBcCi0JJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaAotCi0jIFdlIG5lZWQgYWxsIHRoZXNlIGV4cGxpY2l0IHJ1bGVzIGZvciB0aGUgbXVsdGkgc3R1ZmYuICBCZWNhdXNlIG9mCi0jIHRoZXNlIHJ1bGVzLCB3ZSBkb24ndCBuZWVkIG9uZSBmb3IgT0JKX0ZPUk1BVF9PLgotCi1vYmotYW91dC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotYW91dC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1hb3V0LmMKLW9iai1ib3V0Lm8gOiAkKHNyY2RpcikvY29uZmlnL29iai1ib3V0LmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWJvdXQuYwotb2JqLWNvZmYubzogJChzcmNkaXIpL2NvbmZpZy9vYmotY29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1jb2ZmLmMKLW9iai1lY29mZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotZWNvZmYuYwotb2JqLWVsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLWVsZi5jCi1vYmotZXZheC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotZXZheC5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1ldmF4LmMKLW9iai1ocDMwMC5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaHAzMDAuYwotb2JqLWllZWUubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLWllZWUuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9vYmotaWVlZS5jCi1vYmotbXVsdGkubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLW11bHRpLmMKLW9iai1zb20ubyA6ICQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL29iai1zb20uYwotb2JqLXZtcy5vIDogJChzcmNkaXIpL2NvbmZpZy9vYmotdm1zLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvb2JqLXZtcy5jCi0KLWUtbWlwc2VsZi5vIDogJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlbGYuYwotZS1taXBzZWNvZmYubyA6ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWNvZmYuYwotCSQoQ09NUElMRSkgLWMgJChzcmNkaXIpL2NvbmZpZy9lLW1pcHNlY29mZi5jCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jCi0JJChDT01QSUxFKSAtYyAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmNvZmYuYwotZS1pMzg2ZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2ZWxmLmMKLQkkKENPTVBJTEUpIC1jICQoc3JjZGlyKS9jb25maWcvZS1pMzg2ZWxmLmMKLQotIyBJZiBtNjhrLXBhcnNlLnkgaXMgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LCB0aGVuIHlsd3JhcCB3aWxsIHVzZSBhbgotIyBhYnNvbHV0ZSBwYXRoIHdoZW4gaXQgaW52b2tlcyB5YWNjLCB3aGljaCB3aWxsIGNhdXNlIHlhY2MgdG8gcHV0IHRoZQotIyBhYnNvbHV0ZSBwYXRoIGludG8gdGhlIGdlbmVyYXRlZCBmaWxlLiAgVGhhdCdzIGEgcGFpbiB3aGVuIGl0IGNvbWVzCi0jIHRvIGdlbmVyYXRpbmcgc25hcHNob3RzLCBiZWNhdXNlIGl0IGludHJvZHVjZXMgc3B1cmlvdXMgZGlmZnMuCi0jIFNpbmNlIHdoZW4gd2UgbWFrZSB0aGUgc25hcHNob3RzICQoc3JjZGlyKSA9ICIuIiwgd2UgY2hlY2sgZm9yIHRoYXQKLSMgY2FzZSBhbmQgaGFuZGxlIGl0IGRpZmZlcmVudGx5LiAgVGhpcyBtZWFucyB0aGF0IGFueWJvZHkgd2hvCi0jIGNvbmZpZ3VyZXMgd2l0aCAkKHNyY2RpcikgPSAiLiIgd2lsbCBoYXZlIHRvIHNldCB0aGVpciBwYXRoIGluIHRoZQotIyBkZWJ1Z2dlciBpZiB0aGV5IHdhbnQgdG8gZGVidWcgbTY4ay1wYXJzZS55LiAgVGhpcyBpcyBiYWQsIGJ1dCBvbgotIyB0aGUgb3RoZXIgaGFuZCBpdCdzIGdvb2QgdGhhdCBwZW9wbGUgd2hvIHVzZSB0aGUgcHJlYnVpbHQKLSMgbTY4ay1wYXJzZS5jIGRvbid0IGdldCBhIHNwdXJpb3VzIGFic29sdXRlIHBhdGguCi1tNjhrLXBhcnNlLmM6ICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS55Ci0JZj0kKHNyY2RpcikvY29uZmlnL202OGstcGFyc2UueTsgXAotCWlmIFsgJCRmID0gIi4vY29uZmlnL202OGstcGFyc2UueSIgXTsgdGhlbiBcCi0JICBsbiAtcyBjb25maWcvbTY4ay1wYXJzZS55IC4gPiAvZGV2L251bGwgMj4vZGV2L251bGwgfHwgXAotCSAgIGxuIGNvbmZpZy9tNjhrLXBhcnNlLnkgLiA+IC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCBcCi0JICAgY3AgY29uZmlnL202OGstcGFyc2UueSAuID4vZGV2L251bGwgMj4vZGV2L251bGw7IFwKLQkgIGY9bTY4ay1wYXJzZS55OyBcCi0JZWxzZSB0cnVlOyBmaTsgXAotCSQoU0hFTEwpICQoWUxXUkFQKSAiJChZQUNDKSIgJCRmIHkudGFiLmMgbTY4ay1wYXJzZS5jIC0tOyBcCi0JaWYgWyAkJGYgPSAibTY4ay1wYXJzZS55IiBdOyB0aGVuIFwKLQkgIHJtIC1mIG02OGstcGFyc2UueTsgXAotCWVsc2UgdHJ1ZTsgZmkKLW02OGstcGFyc2UubzogbTY4ay1wYXJzZS5jICQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oCi0KLSMgRG9uJ3QgbGV0IHRoZSAueS5oIHJ1bGUgY2xvYmJlciBtNjhrLXBhcnNlLmguCi1tNjhrLXBhcnNlLmg6IDsgQHRydWUKLSQoc3JjZGlyKS9jb25maWcvbTY4ay1wYXJzZS5oOiA7IEB0cnVlCi0KLSMgVGhlIGluc3RydWN0aW9uIHRhYmxlIHNwZWNpZmljYXRpb24gbGV4aWNhbCBhbmFseXplciBhbmQgcGFyc2VyLgotCi1pdGJsLWxleC5jOiAkKHNyY2RpcikvaXRibC1sZXgubAotaXRibC1sZXgubzogaXRibC1sZXguYyBpdGJsLXBhcnNlLmgKLQotaXRibC1wYXJzZS5vOiBpdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0KLWl0Ymwtb3BzLm86ICQoc3JjZGlyKS9pdGJsLW9wcy5jICQoc3JjZGlyKS9pdGJsLW9wcy5oIGl0YmwtcGFyc2UuaAotCi1pdGJsLXBhcnNlLmMgaXRibC1wYXJzZS5oOiAkKHNyY2RpcikvaXRibC1wYXJzZS55Ci0JJChTSEVMTCkgJChZTFdSQVApICIkKFlBQ0MpIiAkKHNyY2RpcikvaXRibC1wYXJzZS55IHkudGFiLmMgaXRibC1wYXJzZS5jIHkudGFiLmggaXRibC1wYXJzZS5oIC0tIC1kCi0KLWl0YmwtdGVzdC1vcHMubzogJChzcmNkaXIpL2l0Ymwtb3BzLmMgJChzcmNkaXIpL2l0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi0JJChDT01QSUxFKSAtbyBpdGJsLXRlc3Qtb3BzLm8gLURTVEFORF9BTE9ORSAtYyAkKHNyY2RpcikvaXRibC1vcHMuYwotCi1pdGJsLXRlc3QubzogJChzcmNkaXIpL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jICQoc3JjZGlyKS9pdGJsLW9wcy5oCi0JJChDT01QSUxFKSAtYyAtRFNUQU5EX0FMT05FICQoc3JjZGlyKS90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsLXRlc3QuYwotCi1jZ2VuLm86IGNnZW4uYyBjZ2VuLmggY2dlbi1kZXNjLmggc3Vic2Vncy5oIFwKLQkkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktZGVzYy5oIFwKLQkkKHNyY2RpcikvLi4vb3Bjb2Rlcy8kKENHRU5fQ1BVX1BSRUZJWCktb3BjLmgKLQotLlBIT05ZOiBpbnN0YWxsLWV4ZWMtbG9jYWwgaW5zdGFsbC1kYXRhLWxvY2FsCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1iaW5kaXIgaW5zdGFsbC1leGVjLXRvb2xkaXIKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBpbnN0YWxsLWV4ZWMtYmluZGlyIEBpbnN0YWxsX3Rvb2xkaXJACi0KLWluc3RhbGwtZXhlYy1iaW5kaXI6ICQobm9pbnN0X1BST0dSQU1TKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0KLWluc3RhbGwtZXhlYy10b29sZGlyOiAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKG1raW5zdGFsbGRpcnMpICQodG9vbGRpcikvYmluCi0Jbj1gZWNobyBhcyB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vYXMkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICAgIHx8ICQoTElCVE9PTCkgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pIGFzLW5ldyQoRVhFRVhUKSAkKHRvb2xkaXIpL2Jpbi9hcyQoRVhFRVhUKTsgXAotCWVsc2UgXAotCSAgdHJ1ZSA7IFwKLQlmaQotCi0jIFRoZXNlIGV4aXN0IGZvciBtYWludGVuYW5jZSBwdXJwb3Nlcy4KLQotLlBIT05ZOiBib290c3RyYXAgYm9vdHN0cmFwMiBib290c3RyYXAzIHN0YWdlMSBzdGFnZTIgc3RhZ2UzIGNvbXBhcmlzb24KLQotYm9vdHN0cmFwOiBhcy1uZXcKLQkkKE1BS0UpIHN0YWdlMQotCXJtIC1mIHN0YWdlICYmIGxuIC1zIHN0YWdlMSBzdGFnZQotCSQoTUFLRSkgQ0M9IiQoQ0MpIiBDRkxBR1M9Ii1PIC1Cc3RhZ2UvICQoQ0ZMQUdTKSIgbGliZGlyPSQobGliZGlyKSBBTExPQ0E9ICQobm9pbnN0X1BST0dSQU1TKQotCSQoTUFLRSkgc3RhZ2UyCi0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UyIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBjb21wYXJpc29uIGFnYWluc3Q9c3RhZ2UyCi0KLWJvb3RzdHJhcDI6Ci0Jcm0gLWYgc3RhZ2UgJiYgbG4gLXMgc3RhZ2UxIHN0YWdlCi0JJChNQUtFKSBDQz0iJChDQykiIENGTEFHUz0iLU8gLUJzdGFnZS8gJChDRkxBR1MpIiBsaWJkaXI9JChsaWJkaXIpIEFMTE9DQT0gJChub2luc3RfUFJPR1JBTVMpCi0JJChNQUtFKSBzdGFnZTIKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotYm9vdHN0cmFwMzoKLQlybSAtZiBzdGFnZSAmJiBsbiAtcyBzdGFnZTIgc3RhZ2UKLQkkKE1BS0UpIENDPSIkKENDKSIgQ0ZMQUdTPSItTyAtQnN0YWdlLyAkKENGTEFHUykiIGxpYmRpcj0kKGxpYmRpcikgQUxMT0NBPSAkKG5vaW5zdF9QUk9HUkFNUykKLQkkKE1BS0UpIGNvbXBhcmlzb24gYWdhaW5zdD1zdGFnZTIKLQotIyBDb3B5IHRoZSBvYmplY3QgZmlsZXMgZnJvbSBhIHBhcnRpY3VsYXIgc3RhZ2UgaW50byBhIHN1YmRpcmVjdG9yeS4KLXN0YWdlMToKLQktbWtkaXIgc3RhZ2UxCi0JLW12ICQoU1RBR0VTVFVGRikgc3RhZ2UxCi0JaWYgWyAtZiBzdGFnZTEvYXMtbmV3JChFWEVFWFQpIC1hICEgLWYgc3RhZ2UxL2FzJChFWEVFWFQpIF0gOyB0aGVuIChjZCBzdGFnZTEgOyBsbiAtcyBhcy1uZXckKEVYRUVYVCkgYXMkKEVYRUVYVCkpIDsgZmkKLQotc3RhZ2UyOgotCS1ta2RpciBzdGFnZTIKLQktbXYgJChTVEFHRVNUVUZGKSBzdGFnZTIKLQlpZiBbIC1mIHN0YWdlMi9hcy1uZXckKEVYRUVYVCkgLWEgISAtZiBzdGFnZTIvYXMkKEVYRUVYVCkgXSA7IHRoZW4gKGNkIHN0YWdlMiA7IGxuIC1zIGFzLW5ldyQoRVhFRVhUKSBhcyQoRVhFRVhUKSkgOyBmaQotCi1zdGFnZTM6Ci0JLW1rZGlyIHN0YWdlMwotCS1tdiAkKFNUQUdFU1RVRkYpIHN0YWdlMwotCWlmIFsgLWYgc3RhZ2UzL2FzLW5ldyQoRVhFRVhUKSAtYSAhIC1mIHN0YWdlMy9hcyQoRVhFRVhUKSBdIDsgdGhlbiAoY2Qgc3RhZ2UzIDsgbG4gLXMgYXMtbmV3IGFzJChFWEVFWFQpKSA7IGZpCi0KLSMgVGhpcyBydWxlIGlzIGRlcml2ZWQgZnJvbSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gdGhlIE1ha2VmaWxlLmluIGZvciBnY2MuCi0jIFRoZSAidGFpbCArMTZjIiBpcyB0byBieXBhc3MgaGVhZGVycyB3aGljaCBtYXkgaW5jbHVkZSB0aW1lc3RhbXBzIG9yCi0jIHRlbXBvcmFyeSBhc3NlbWJseSBmaWxlIG5hbWVzLgotY29tcGFyaXNvbjoKLQl4PTAgOyBcCi0JZm9yIGZpbGUgaW4gKi5vIDsgZG8gXAotCSAgdGFpbCArMTZjIC4vJCRmaWxlID4gdG1wLWZvbzE7IFwKLQkgIGlmIHRhaWwgKzE2YyAke2FnYWluc3R9LyQkZmlsZSA+IHRtcC1mb28yIDI+L2Rldi9udWxsIDsgdGhlbiBcCi0JICAgIGlmIGNtcCB0bXAtZm9vMSB0bXAtZm9vMiA7IHRoZW4gXAotCSAgICAgIHRydWUgOyBcCi0JICAgIGVsc2UgXAotCSAgICAgIGVjaG8gJCRmaWxlIGRpZmZlcnMgOyBcCi0JICAgICAgeD0xIDsgXAotCSAgICBmaSA7IFwKLQkgIGVsc2UgdHJ1ZTsgZmkgOyBcCi0JZG9uZSA7IFwKLQlleGl0ICQkeAotCS1ybSAtZiB0bXAtZm9vKgotCi0uUEhPTlk6IGRlLXN0YWdlMSBkZS1zdGFnZTIgZGUtc3RhZ2UzCi0KLWRlLXN0YWdlMToKLQktIChjZCBzdGFnZTEgOyBybSAtZiBhcyQoRVhFRVhUKSA7IG12IC1mICogLi4pCi0JLSBybWRpciBzdGFnZTEKLQotZGUtc3RhZ2UyOgotCS0gKGNkIHN0YWdlMiA7IHJtIC1mIGFzJChFWEVFWFQpIDsgbXYgLWYgKiAuLikKLQktIHJtZGlyIHN0YWdlMgotCi1kZS1zdGFnZTM6Ci0JLSAoY2Qgc3RhZ2UzIDsgcm0gLWYgYXMkKEVYRUVYVCkgOyBtdiAtZiAqIC4uKQotCS0gcm1kaXIgc3RhZ2UzCi0KLS5kZXA6IGRlcC5zZWQgJChERVBfRklMRV9ERVBTKSAudGNkZXAgLm9iamRlcCAuZGVwMgotCXJtIC1mIC5kZXAxCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQkkKE1BS0UpIERFUD0kKERFUCkgc3JjZGlyPSQke3NyY2Rpcn0gVlBBVEg9JCR7c3JjZGlyfSAuZGVwMQotCXJtIC1yZiAuZGVwZGlyCi0Jc2VkIC1mIGRlcC5zZWQgPCAuZGVwMSA+IC5kZXBhCi0Jc2VkIC1mIGRlcC5zZWQgPCAudGNkZXAgPj4gLmRlcGEKLQlzZWQgLWYgZGVwLnNlZCA8IC5vYmpkZXAgPj4gLmRlcGEKLQlzZWQgLWYgZGVwLnNlZCA8IC5kZXAyID4+IC5kZXBhCi0JZWNobyAnJCQoT0JKUyk6ICQkKERFUF9AdGFyZ2V0JydfY3B1X3R5cGVAX0BvYmonJ19mb3JtYXRAKScgPj4gLmRlcGEKLQllY2hvICckJChUQVJHX0NQVV9PKTogJCQoVENERVBfQHRhcmdldCcnX2NwdV90eXBlQF9Ab2JqJydfZm9ybWF0QCknID4+IC5kZXBhCi0JZWNobyAnJCQoT0JKX0ZPUk1BVF9PKTogJCQoT0JKREVQX0B0YXJnZXQnJ19jcHVfdHlwZUBfQG9iaicnX2Zvcm1hdEApJyA+PiAuZGVwYQotCWVjaG8gJyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWScgPj4gLmRlcGEKLQkkKFNIRUxMKSAkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcGEgLmRlcAotCi0jIFRoaXMgcnVsZSBuZWVkcyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi0uZGVwMTogJChDRklMRVMpICQoTVVMVElfQ0ZJTEVTKQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQllY2hvICcnID4gdGFyZy1jcHUuaDsgXAotCWVjaG8gJycgPiBvYmotZm9ybWF0Lmg7IFwKLQllY2hvICcnID4gdGFyZy1lbnYuaDsgXAotCWVjaG8gJycgPiBpdGJsLWNwdS5oOyBcCi0JZWNobyAnJyA+IGl0YmwtcGFyc2UuaDsgXAotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpICQ/Ci0Jc2VkIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyA8IC5kZXBkaXIvLmRlcCA+IC5kZXAxCi0Jcm0gLWYgLmRlcGRpci8uZGVwCi0KLSMgV29yayBvdXQgdGhlIHNwZWNpYWwgZGVwZW5kZW5jaWVzIGZvciB0aGUgdGMtKi5jIGZpbGVzLgotLnRjZGVwOiAkKFRBUkdFVF9DUFVfQ0ZJTEVTKQotCXJtIC1mIC50Y2RlcGEKLQlpZiBbIC1kIC5kZXBkaXIgXTsgdGhlbiB0cnVlOyBlbHNlIG1rZGlyIC5kZXBkaXI7IGZpCi0Jc3JjZGlyPWBjZCAkKHNyY2Rpcik7IHB3ZGA7IFwKLQljZCAuZGVwZGlyOyBcCi0JZm9yIGMgaW4gJChDUFVfVFlQRVMpOyBkbyBcCi0JICBmb3IgbyBpbiAkKE9CSl9GT1JNQVRTKTsgZG8gXAotCSAgICAkKENQVV9PQkpfVkFMSUQpIFwKLQkgICAgaWYgWyB4JCR7dmFsaWR9ID0geHllcyBdOyB0aGVuIFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGMtJyIkJHtjfSInLmgiJyA+IHRhcmctY3B1Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAib2JqLSciJCR7b30iJy5oIicgPiBvYmotZm9ybWF0Lmg7IFwKLQkgICAgICBlY2hvICcjaW5jbHVkZSAidGUtZ2VuZXJpYy5oIicgPiB0YXJnLWVudi5oOyBcCi0JICAgICAgZWNobyAnJyA+IGl0YmwtY3B1Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1wYXJzZS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIkJHtjfSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvdGMtJCR7Y30uYyBkdW1teS5jOyBcCi0JICAgICAgZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwOyBcCi0JICAgICAgJChERVApIC1mIC5kZXAgLURCRkRfQVNTRU1CTEVSIC1JLiAtSS4uIC1JJCR7c3JjZGlyfSAtSS4uLy4uL2JmZCAkKERFUF9JTkNMVURFUykgZHVtbXkuYzsgXAotCSAgICAgIHNlZCAtZSAicy9kdW1teS5vOiBkdW1teS5jL1RDREVQXyQke2N9XyQke299ID0vIiBcCi0JCSAgLWUgJzEsL0RPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIvZCcgXAotCQkgIC1lICcvSUYgWU9VIFBVVCBBTllUSElORy8sJCRkJyBcCi0JCSAgLWUgJy9eJCQvZCcgPCAuZGVwID4+IC4uLy50Y2RlcGE7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnVENERVBfaHBwYV9zb20gPSAkJChzcmNkaXIpL2NvbmZpZy90Yy1ocHBhLmggc3Vic2Vncy5oIFwnID4+IC50Y2RlcGEKLQllY2hvICcgICQkKElOQ0RJUikvb2JzdGFjay5oICQkKEJGRERJUikvbGliaHBwYS5oIFwnID4+IC50Y2RlcGEKLQllY2hvICcgICQkKElOQ0RJUikvb3Bjb2RlL2hwcGEuaCAkJChCRkRESVIpL3NvbS5oJyA+PiAudGNkZXBhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdUQ0RFUF8nIiQke2N9IidfbXVsdGkgPSBcJyA+PiAudGNkZXBhOyBcCi0JICAgIGVjaG8gJyQkKFRDREVQXyciJCR7Y30iJ19jb2ZmKSBcJyA+PiAudGNkZXBhOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoVENERVBfJyIkJHtjfSInX2Vjb2ZmKSBcJyA+PiAudGNkZXBhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoVENERVBfJyIkJHtjfSInX2VsZiknID4+IC50Y2RlcGE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgLnRjZGVwYSAudGNkZXAKLQotIyBXb3JrIG91dCB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBvYmotKi5jIGZpbGVzLgotLm9iamRlcDogJChPQkpfRk9STUFUX0NGSUxFUykKLQlybSAtZiAub2JqZGVwYQotCWlmIFsgLWQgLmRlcGRpciBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgLmRlcGRpcjsgZmkKLQlzcmNkaXI9YGNkICQoc3JjZGlyKTsgcHdkYDsgXAotCWNkIC5kZXBkaXI7IFwKLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgIGZvciBvIGluICQoT0JKX0ZPUk1BVFMpOyBkbyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiQke2N9IicuaCInID4gdGFyZy1jcHUuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJvYmotJyIkJHtvfSInLmgiJyA+IG9iai1mb3JtYXQuaDsgXAotCSAgICAgIGVjaG8gJyNpbmNsdWRlICJ0ZS1nZW5lcmljLmgiJyA+IHRhcmctZW52Lmg7IFwKLQkgICAgICBlY2hvICcnID4gaXRibC1jcHUuaDsgXAotCSAgICAgIGVjaG8gJycgPiBpdGJsLXBhcnNlLmg7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgICAgY3AgJCR7c3JjZGlyfS9jb25maWcvb2JqLSQke299LmMgZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9PQkpERVBfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLm9iamRlcGE7IFwKLQkgICAgICBybSAtZiBkdW1teS5jOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnT0JKREVQX2hwcGFfc29tID0gJCQoc3JjZGlyKS9jb25maWcvb2JqLXNvbS5oIHN1YnNlZ3MuaCBcJyA+PiAub2JqZGVwYQotCWVjaG8gJyAgJCQoSU5DRElSKS9vYnN0YWNrLmggJCQoQkZERElSKS9saWJocHBhLmggXCcgPj4gLm9iamRlcGEKLQllY2hvICcgICQkKEJGRERJUikvc29tLmggICQkKElOQ0RJUikvYW91dC9zdGFiX2dudS5oIFwnID4+IC5vYmpkZXBhCi0JZWNobyAnICAkJChJTkNESVIpL2FvdXQvc3RhYi5kZWYnID4+IC5vYmpkZXBhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdPQkpERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLm9iamRlcGE7IFwKLQkgICAgZWNobyAnJCQoT0JKREVQXyciJCR7Y30iJ19jb2ZmKSBcJyA+PiAub2JqZGVwYTsgXAotCSAgICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICAgIGVjaG8gJyQkKE9CSkRFUF8nIiQke2N9IidfZWNvZmYpIFwnID4+IC5vYmpkZXBhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoT0JKREVQXyciJCR7Y30iJ19lbGYpJyA+PiAub2JqZGVwYTsgXAotCSAgZWxzZSB0cnVlOyBmaTsgXAotCWRvbmUKLQltdiAtZiAub2JqZGVwYSAub2JqZGVwCi0KLSMgV29yayBvdXQgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBDUFUvT0JKIGNvbWJpbmF0aW9uLgotIyBOb3RlIHRoYXQgU09NIGlzIGEgc3BlY2lhbCBjYXNlLCBiZWNhdXNlIGl0IG9ubHkgd29ya3MgbmF0aXZlLgotLmRlcDI6ICQoVEFSR0VUX0NQVV9IRklMRVMpICQoT0JKX0ZPUk1BVF9IRklMRVMpCi0Jcm0gLWYgLmRlcDJhCi0JaWYgWyAtZCAuZGVwZGlyIF07IHRoZW4gdHJ1ZTsgZWxzZSBta2RpciAuZGVwZGlyOyBmaQotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0JY2QgLmRlcGRpcjsgXAotCWZvciBjIGluICQoQ1BVX1RZUEVTKTsgZG8gXAotCSAgZm9yIG8gaW4gJChPQkpfRk9STUFUUyk7IGRvIFwKLQkgICAgJChDUFVfT0JKX1ZBTElEKSBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgInRjLSciJCR7Y30iJy5oIicgPiB0YXJnLWNwdS5oOyBcCi0JICAgICAgZWNobyAnI2luY2x1ZGUgIm9iai0nIiQke299IicuaCInID4gZHVtbXkuYzsgXAotCSAgICAgIGVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDsgXAotCSAgICAgICQoREVQKSAtZiAuZGVwIC1EQkZEX0FTU0VNQkxFUiAtSS4gLUkuLiAtSSQke3NyY2Rpcn0gLUkuLi8uLi9iZmQgJChERVBfSU5DTFVERVMpIGR1bW15LmM7IFwKLQkgICAgICBzZWQgLWUgInMvZHVtbXkubzogZHVtbXkuYy9ERVBfJCR7Y31fJCR7b30gPS8iIFwKLQkJICAtZSAnMSwvRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUi9kJyBcCi0JCSAgLWUgJy9JRiBZT1UgUFVUIEFOWVRISU5HLywkJGQnIFwKLQkJICAtZSAnL14kJC9kJyA8IC5kZXAgPj4gLi4vLmRlcDJhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JZWNobyAnREVQX2hwcGFfc29tID0gJCQoQkZERElSKS9zb20uaCcgPj4gLmRlcDJhCi0JIyBXZSBkb24ndCB0cnkgdG8gaGFuZGxlIGFsbCBtdWx0aSBjYXNlcy4KLQlmb3IgYyBpbiAkKENQVV9UWVBFUyk7IGRvIFwKLQkgICQoQ1BVX01VTFRJX1ZBTElEKSBcCi0JICBpZiBbIHgkJHt2YWxpZH0gPSB4eWVzIF07IHRoZW4gXAotCSAgICBvPWVjb2ZmOyBcCi0JICAgICQoQ1BVX09CSl9WQUxJRCkgXAotCSAgICBlY2hvICdERVBfJyIkJHtjfSInX211bHRpID0gXCcgPj4gLmRlcDJhOyBcCi0JICAgIGVjaG8gJyQkKERFUF8nIiQke2N9IidfY29mZikgXCcgPj4gLmRlcDJhOyBcCi0JICAgIGlmIFsgeCQke3ZhbGlkfSA9IHh5ZXMgXTsgdGhlbiBcCi0JICAgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19lY29mZikgXCcgPj4gLmRlcDJhOyBcCi0JICAgIGVsc2UgdHJ1ZTsgZmk7IFwKLQkgICAgZWNobyAnJCQoREVQXyciJCR7Y30iJ19lbGYpJyA+PiAuZGVwMmE7IFwKLQkgIGVsc2UgdHJ1ZTsgZmk7IFwKLQlkb25lCi0JbXYgLWYgLmRlcDJhIC5kZXAyCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNyY2Rpcj1gY2QgJChzcmNkaXIpOyBwd2RgOyBcCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZCBcCi0JCS1lICJzIUBJTkNESVJAISQke3NyY2Rpcn0vLi4vaW5jbHVkZSEiIFwKLQkJLWUgInMhQEJGRERJUkAhJCR7c3JjZGlyfS8uLi9iZmQhIiBcCi0JCS1lICJzIUBTUkNESVJAISQke3NyY2Rpcn0hIgotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoU0hFTEwpICQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWFwcC5vOiBhcHAuYwotYXMubzogYXMuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBvdXRwdXQtZmlsZS5oIFwKLSAgc2IuaCBtYWNyby5oCi1hdG9mLWdlbmVyaWMubzogYXRvZi1nZW5lcmljLmMKLWJpZ251bS1jb3B5Lm86IGJpZ251bS1jb3B5LmMKLWNvbmQubzogY29uZC5jIG1hY3JvLmggc2IuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1kZXBlbmQubzogZGVwZW5kLmMKLWR3YXJmMmRiZy5vOiBkd2FyZjJkYmcuYyBkd2FyZjJkYmcuaCBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCBcCi0gICQoSU5DRElSKS9lbGYvZHdhcmYyLmgKLWVjb2ZmLm86IGVjb2ZmLmMgZWNvZmYuaAotZWhvcHQubzogZWhvcHQuYyBzdWJzZWdzLmggJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvZWxmL2R3YXJmMi5oCi1leHByLm86IGV4cHIuYyAkKElOQ0RJUikvb2JzdGFjay5oCi1mbG9udW0tY29weS5vOiBmbG9udW0tY29weS5jCi1mbG9udW0ta29uc3QubzogZmxvbnVtLWtvbnN0LmMKLWZsb251bS1tdWx0Lm86IGZsb251bS1tdWx0LmMKLWZyYWdzLm86IGZyYWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLWhhc2gubzogaGFzaC5jICQoSU5DRElSKS9vYnN0YWNrLmgKLWlucHV0LWZpbGUubzogaW5wdXQtZmlsZS5jIGlucHV0LWZpbGUuaAotaW5wdXQtc2NydWIubzogaW5wdXQtc2NydWIuYyBpbnB1dC1maWxlLmggc2IuaAotbGlzdGluZy5vOiBsaXN0aW5nLmMgaW5wdXQtZmlsZS5oIHN1YnNlZ3MuaAotbGl0ZXJhbC5vOiBsaXRlcmFsLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLW1hY3JvLm86IG1hY3JvLmMgc2IuaCBtYWNyby5oCi1tZXNzYWdlcy5vOiBtZXNzYWdlcy5jCi1vdXRwdXQtZmlsZS5vOiBvdXRwdXQtZmlsZS5jIG91dHB1dC1maWxlLmgKLXJlYWQubzogcmVhZC5jIHN1YnNlZ3MuaCAkKElOQ0RJUikvb2JzdGFjay5oIHNiLmggbWFjcm8uaCBcCi0gIGVjb2ZmLmgKLXNiLm86IHNiLmMgc2IuaAotc3RhYnMubzogc3RhYnMuYyAkKElOQ0RJUikvb2JzdGFjay5oIHN1YnNlZ3MuaCBlY29mZi5oIFwKLSAgJChJTkNESVIpL2FvdXQvc3RhYl9nbnUuaCAkKElOQ0RJUikvYW91dC9zdGFiLmRlZgotc3Vic2Vncy5vOiBzdWJzZWdzLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmgKLXN5bWJvbHMubzogc3ltYm9scy5jICQoSU5DRElSKS9vYnN0YWNrLmggc3Vic2Vncy5oIFwKLSAgc3RydWMtc3ltYm9sLmgKLXdyaXRlLm86IHdyaXRlLmMgc3Vic2Vncy5oICQoSU5DRElSKS9vYnN0YWNrLmggb3V0cHV0LWZpbGUuaAotZ2FzcC5vOiBnYXNwLmMgc2IuaCBtYWNyby5oCi1pdGJsLW9wcy5vOiBpdGJsLW9wcy5jIGl0Ymwtb3BzLmggaXRibC1wYXJzZS5oCi1lLWkzODZjb2ZmLm86ICQoc3JjZGlyKS9jb25maWcvZS1pMzg2Y29mZi5jIGVtdWwuaCBcCi0gIGVtdWwtdGFyZ2V0LmgKLWUtaTM4NmVsZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtaTM4NmVsZi5jIGVtdWwuaCBlbXVsLXRhcmdldC5oCi1lLW1pcHNlY29mZi5vOiAkKHNyY2RpcikvY29uZmlnL2UtbWlwc2Vjb2ZmLmMgZW11bC5oIFwKLSAgZW11bC10YXJnZXQuaAotZS1taXBzZWxmLm86ICQoc3JjZGlyKS9jb25maWcvZS1taXBzZWxmLmMgZW11bC5oIGVtdWwtdGFyZ2V0LmgKLSQoT0JKUyk6ICQoREVQX0B0YXJnZXRfY3B1X3R5cGVAX0BvYmpfZm9ybWF0QCkKLSQoVEFSR19DUFVfTyk6ICQoVENERVBfQHRhcmdldF9jcHVfdHlwZUBfQG9ial9mb3JtYXRAKQotJChPQkpfRk9STUFUX08pOiAkKE9CSkRFUF9AdGFyZ2V0X2NwdV90eXBlQF9Ab2JqX2Zvcm1hdEApCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ2FzL05FV1MgYi9nYXMvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAxN2Q1OC4uMDAwMDAwMAotLS0gYS9nYXMvTkVXUworKysgL2Rldi9udWxsCkBAIC0xLDI4OSArMCwwIEBACi0tKi0gdGV4dCAtKi0KLQotQ2hhbmdlcyBpbiAyLjEwOgotCi1TdXBwb3J0IGZvciB0aGUgTW90b3JvbGxhIE1Db3JlIDIxMCBwcm9jZXNzb3IgYWRkZWQuCi0KLUEgbmV3IHBzZXVkby1vcCAuaW50ZWxfc3ludGF4IGhhcyBiZWVuIGltcGxlbWVudGVkIHRvIGFsbG93IGdhcyB0byBwYXJzZSBpMzg2IGFzc2VtYmx5Ci1wcm9ncmFtcyB3aXRoIGludGVsIHN5bnRheC4KLQotTmV3IHBzZXVkby1vcHMgLmZ1bmMsLmVuZGZ1bmMgdG8gYWlkIGluIGRlYnVnZ2luZyB1c2VyLXdyaXR0ZW4gYXNzZW1ibGVyIGNvZGUuCi0KLUZ1bGwgMTYtYml0IG1vZGUgc3VwcG9ydCBmb3IgaTM4Ni4KLQotR3JlYXRseSBpbXByb3ZlZCBpbnN0cnVjdGlvbiBvcGVyYW5kIGNoZWNraW5nIGZvciBpMzg2LiAgVGhpcyBjaGFuZ2Ugd2lsbAotcHJvZHVjZSBlcnJvcnMgb3Igd2FybmluZ3Mgb24gaW5jb3JyZWN0IGFzc2VtYmx5IGNvZGUgdGhhdCBwcmV2aW91cyB2ZXJzaW9ucyBvZgotZ2FzIGFjY2VwdGVkLiAgSWYgeW91IGdldCB1bmV4cGVjdGVkIG1lc3NhZ2VzIGZyb20gY29kZSB0aGF0IHdvcmtlZCB3aXRoIG9sZGVyCi12ZXJzaW9ucyBvZiBnYXMsIHBsZWFzZSBkb3VibGUgY2hlY2sgdGhlIGNvZGUgYmVmb3JlIHJlcG9ydGluZyBhIGJ1Zy4KLQotV2VhayBzeW1ib2wgc3VwcG9ydCBhZGRlZCBmb3IgQ09GRiB0YXJnZXRzLgotCi1NaXRzdWJpc2hpIEQzMFYgc3VwcG9ydCBhZGRlZC4KLQotVGV4YXMgSW5zdHJ1bWVudHMgYzgwICh0bXMzMjBjODApIHN1cHBvcnQgYWRkZWQuCi0KLWk5NjAgRUxGIHN1cHBvcnQgYWRkZWQuCi0KLUNoYW5nZXMgaW4gMi45OgotCi1UZXhhcyBJbnN0cnVtZW50cyBjMzAgKHRtczMyMGMzMCkgc3VwcG9ydCBhZGRlZC4KLQotVGhlIGFzc2VtYmxlciBub3cgb3B0aW1pemVzIHRoZSBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGJ5IGVnY3MKLWFuZCBnY2MgMi44LiAgVGhlIG5ldyAtLXRyYWRpdGlvbmFsLWZvcm1hdCBvcHRpb24gZGlzYWJsZXMgdGhpcyBvcHRpbWl6YXRpb24uCi0KLUFkZGVkIC0tZ3N0YWJzIG9wdGlvbiB0byBnZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLVRoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBtIChlLmcuLCAtYWxtKSB0byBleHBhbmQgbWFjcm9zIGluIGEKLWxpc3RpbmcuCi0KLUFkZGVkIC1NRCBvcHRpb24gdG8gcHJpbnQgZGVwZW5kZW5jaWVzLgotCi1DaGFuZ2VzIGluIDIuODoKLQotQmVPUyBzdXBwb3J0IGFkZGVkLgotCi1NSVBTMTYgc3VwcG9ydCBhZGRlZC4KLQotTW90b3JvbGEgQ29sZEZpcmUgNTIwMCBzdXBwb3J0IGFkZGVkIChjb25maWd1cmUgZm9yIG02OGsgYW5kIHVzZSAtbTUyMDApLgotCi1BbHBoYS9WTVMgc3VwcG9ydCBhZGRlZC4KLQotbTY4ayBvcHRpb25zIC0tYmFzZS1zaXplLWRlZmF1bHQtMTYsIC0tYmFzZS1zaXplLWRlZmF1bHQtMzIsCi0tLWRpc3Atc2l6ZS1kZWZhdWx0LTE2LCBhbmQgLS1kaXNwLXNpemUtZGVmYXVsdC0zMiBhZGRlZC4KLQotVGhlIGFsaWdubWVudCBkaXJlY3RpdmVzIG5vdyB0YWtlIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUKLW1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcKLW1vcmUgdGhhbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLCB0aGUgYWxpZ25tZW50IGlzIG5vdCBkb25lIGF0IGFsbC4KLQotVGhlIEVMRiBhc3NlbWJsZXIgaGFzIGEgbmV3IHBzZXVkby1vcCwgLnN5bXZlciwgdXNlZCBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCi0KLVRoZSAtYSBvcHRpb24gdGFrZXMgYSBuZXcgc3Vib3B0aW9uLCBjIChlLmcuLCAtYWxjKSwgdG8gc2tpcCBmYWxzZSBjb25kaXRpb25hbHMKLWluIGxpc3RpbmdzLgotCi1BZGRlZCBuZXcgcHNldWRvLW9wLCAuZXF1aXY7IGl0J3MgbGlrZSAuZXF1LCBleGNlcHQgdGhhdCBpdCBpcyBhbiBlcnJvciBpZiB0aGUKLXN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLUNoYW5nZXMgaW4gMi43OgotCi1UaGUgUG93ZXJQQyBhc3NlbWJsZXIgbm93IGFsbG93cyB0aGUgdXNlIG9mIHN5bWJvbGljIHJlZ2lzdGVyIG5hbWVzIChyMCwgZXRjLikKLWlmIC1tcmVnbmFtZXMgaXMgdXNlZC4gIFN5bWJvbGljIG5hbWVzIHByZWNlZGVkIGJ5IGEgJyUnICglcjAsIGV0Yy4pIGNhbiBiZQotdXNlZCBhbnkgdGltZS4gIFBvd2VyUEMgODYwIG1vdmUgdG8vZnJvbSBTUFIgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBhZGRlZC4KLQotQWxwaGEgTGludXggKEVMRikgc3VwcG9ydCBhZGRlZC4KLQotUG93ZXJQQyBFTEYgc3VwcG9ydCBhZGRlZC4KLQotbTY4ayBMaW51eCAoRUxGKSBzdXBwb3J0IGFkZGVkLgotCi1pOTYwIEh4L0p4IHN1cHBvcnQgYWRkZWQuCi0KLWkzODYvUG93ZXJQQyBnbnUtd2luMzIgc3VwcG9ydCBhZGRlZC4KLQotU0NPIEVMRiBzdXBwb3J0IGFkZGVkLiAgRm9yIE9wZW5TZXJ2ZXIgNSB0YXJnZXRzIChpMzg2LXVua25vd24tc2NvMy4ydjUpIHRoZQotZGVmYXVsdCBpcyB0byBidWlsZCBDT0ZGLW9ubHkgc3VwcG9ydC4gIFRvIGdldCBhIHNldCBvZiB0b29scyB0aGF0IGdlbmVyYXRlIEVMRgotKHRoZXknbGwgdW5kZXJzdGFuZCBib3RoIENPRkYgYW5kIEVMRiksIHlvdSBtdXN0IGNvbmZpZ3VyZSB3aXRoCi10YXJnZXQ9aTM4Ni11bmtub3duLXNjbzMuMnY1ZWxmLgotCi1tODhrLW1vdG9yb2xhLXN5c3YzKiBzdXBwb3J0IGFkZGVkLgotCi1DaGFuZ2VzIGluIDIuNjoKLQotR2FzIG5vdyBkaXJlY3RseSBzdXBwb3J0cyBtYWNyb3MsIHdpdGhvdXQgcmVxdWlyaW5nIEdBU1AuCi0KLUdhcyBub3cgaGFzIGFuIE1SSSBhc3NlbWJsZXIgY29tcGF0aWJpbGl0eSBtb2RlLiAgVXNlIC1NIG9yIC0tbXJpIHRvIHNlbGVjdCBNUkkKLW1vZGUuICBUaGUgcHNldWRvLW9wIGBgLm1yaSAxJycgd2lsbCBzd2l0Y2ggaW50byB0aGUgTVJJIG1vZGUgdW50aWwgdGhlIGBgLm1yaQotMCcnIGlzIHNlZW47IHRoaXMgY2FuIGJlIGNvbnZlbmllbnQgZm9yIGlubGluZSBhc3NlbWJsZXIgY29kZS4KLQotQWRkZWQgLS1kZWZzeW0gU1lNPVZBTFVFIG9wdGlvbi4KLQotQWRkZWQgLW1pcHM0IHN1cHBvcnQgdG8gTUlQUyBhc3NlbWJsZXIuCi0KLUFkZGVkIFBJQyBzdXBwb3J0IHRvIFNvbGFyaXMgYW5kIFNQQVJDIFN1bk9TIDQgYXNzZW1ibGVyLgotCi1DaGFuZ2VzIGluIDIuNDoKLQotQ29udmVydGVkIHRoaXMgZGlyZWN0b3J5IHRvIHVzZSBhbiBhdXRvY29uZi1nZW5lcmF0ZWQgY29uZmlndXJlIHNjcmlwdC4KLQotQVJNIHN1cHBvcnQsIGZyb20gUmljaGFyZCBFYXJuc2hhdy4KLQotVXBkYXRlZCBWTVMgc3VwcG9ydCwgZnJvbSBQYXQgUmFua2luLCBpbmNsdWRpbmcgY29uc2lkZXJhYmx5IGltcHJvdmVkIGRlYnVnZ2luZwotc3VwcG9ydC4KLQotU3VwcG9ydCBmb3IgdGhlIGNvbnRyb2wgcmVnaXN0ZXJzIGluIHRoZSA2ODA2MC4KLQotSGFuZGxlcyAoaWdub3JlcykgYSBuZXcgZGlyZWN0aXZlICIudGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLCB0bwotcHJvdmlkZSBmb3IgcG9zc2libGUgZnV0dXJlIGdjYyBjaGFuZ2VzLCBmb3IgdGFyZ2V0cyB3aGVyZSBnYXMgcHJvdmlkZXMgc29tZQotZmVhdHVyZXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgbmF0aXZlIGFzc2VtYmxlci4gIElmIHRoZSBuYXRpdmUgYXNzZW1ibGVyIGlzCi11c2VkLCBpdCBzaG91bGQgYmVjb21lIG9idmlvdXMgcHJldHR5IHF1aWNrbHkgd2hhdCB0aGUgcHJvYmxlbSBpcy4KLQotVXNhZ2UgbWVzc2FnZSBpcyBhdmFpbGFibGUgd2l0aCAiLS1oZWxwIi4KLQotVGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yIChnYXNwKSBpcyBpbmNsdWRlZC4gIChBY3R1YWxseSwgaXQgd2FzIGluIDIuMwotYWxzbywgYnV0IGRpZG4ndCBnZXQgaW50byB0aGUgTkVXUyBmaWxlLikKLQotV2VhayBzeW1ib2wgc3VwcG9ydCBmb3IgYS5vdXQuCi0KLUEgYnVnIGluIHRoZSBsaXN0aW5nIGNvZGUgd2hpY2ggY291bGQgY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBoYXMgYmVlbiBmaXhlZC4KLUJ1Z3MgaW4gbGlzdGluZ3Mgd2hlbiBnZW5lcmF0aW5nIGEgQ09GRiBvYmplY3QgZmlsZSBoYXZlIGFsc28gYmVlbiBmaXhlZC4KLQotSW5pdGlhbCBpMzg2LXN2cjQgUElDIGltcGxlbWVudGF0aW9uIGZyb20gRXJpYyBZb3VuZ2RhbGUsIGJhc2VkIG9uIGNvZGUgYnkgUGF1bAotS3JhbmVuYnVyZy4KLQotSW1wcm92ZWQgQWxwaGEgc3VwcG9ydC4gIEltbWVkaWF0ZSBjb25zdGFudHMgY2FuIGhhdmUgYSBtdWNoIGxhcmdlciByYW5nZSBub3cuCi1TdXBwb3J0IGZvciB0aGUgMjExNjQgaGFzIGJlZW4gY29udHJpYnV0ZWQgYnkgRGlnaXRhbC4KLQotVXBkYXRlZCBuczMyayAocGM1MzItbWFjaCwgbmV0YnNkNTMyKSBzdXBwb3J0IGZyb20gSWFuIERhbGwuCi0KLUNoYW5nZXMgaW4gMi4zOgotCi1NYWNoIGkzODYgc3VwcG9ydCwgYnkgRGF2aWQgTWFja2VuemllIGFuZCBLZW4gUmFlYnVybi4KLQotUlMvNjAwMCBhbmQgUG93ZXJQQyBzdXBwb3J0IGJ5IElhbiBUYXlsb3IuCi0KLVZNUyBjb21tYW5kIHNjcmlwdHMgKG1ha2UtZ2FzLmNvbSwgY29uZmlnLWdhcy5jb20pIGhhdmUgYmVlbiB3b3JrZWQgb24gYSBiaXQsCi1iYXNlZCBvbiBtYWlsIHJlY2VpdmVkIGZyb20gdmFyaW91cyBwZW9wbGUuICBUaGUgYC1oIycgb3B0aW9uIHNob3VsZCB3b3JrIGFnYWluCi10b28uCi0KLUhQLVBBIHdvcmssIGJ5IEplZmYgTGF3LiAgTm90ZSwgZm9yIHRoZSBQQSwgZ2FzLTIuMyBoYXMgYmVlbiBkZXNpZ25lZCB0byB3b3JrCi13aXRoIGdkYi00LjEyIGFuZCBnY2MtMi42LiAgQXMgZ2NjLTIuNiBoYXMgbm90IGJlZW4gcmVsZWFzZWQgeWV0LCBhIHNwZWNpYWwKLXZlcnNpb24gb2YgZ2NjLTIuNS44IGhhcyBiZWVuIHBhdGNoZWQgdG8gd29yayB3aXRoIGdhcy0yLjMuICBZb3UgY2FuIHJldHJpZXZlCi10aGlzIHNwZWNpYWwgdmVyc2lvbiBvZiBnY2MtMi41LjggdmlhIGFub255bW91cyBmdHAgZnJvbSBqYWd1YXIuY3MudXRhaC5lZHUKLWluIHRoZSAiZGlzdCIgZGlyZWN0b3J5LgotCi1WYXggc3VwcG9ydCBpbiBnYXMgZml4ZWQgZm9yIEJTRCwgc28gaXQgYnVpbGRzIGFuZCBzZWVtcyB0byBydW4gYSBjb3VwbGUgc2ltcGxlCi10ZXN0cyBva2F5LiAgSSBoYXZlbid0IHB1dCBpdCB0aHJvdWdoIGV4dGVuc2l2ZSB0ZXN0aW5nLiAgKEdOVSBtYWtlIGlzCi1jdXJyZW50bHkgcmVxdWlyZWQgZm9yIEJTRCA0LjMgYnVpbGRzLikKLQotU3VwcG9ydCBmb3IgdGhlIERFQyBBbHBoYSwgcnVubmluZyBPU0YvMSAoRUNPRkYgZm9ybWF0KS4gIFRoZSBnYXMgc3VwcG9ydCBpcwotYmFzZWQgb24gY29kZSBkb25hdGVkIGJ5IENNVSwgd2hpY2ggdXNlZCBhbiBhLm91dC1iYXNlZCBmb3JtYXQuICBJJ20gYWZyYWlkIHRoZQotYWxwaGEtYS5vdXQgc3VwcG9ydCBpcyBwcmV0dHkgYmFkbHkgbWFuZ2xlZCwgYW5kIG11Y2ggb2YgaXQgcmVtb3ZlZDsgbWFraW5nIGl0Ci13b3JrIHdpbGwgcmVxdWlyZSByZXdyaXRpbmcgaXQgYXMgQkZEIHN1cHBvcnQgZm9yIHRoZSBmb3JtYXQgYW55d2F5cy4KLQotSXJpeCA1IHN1cHBvcnQuCi0KLVRoZSB0ZXN0IHN1aXRlcyBoYXZlIGJlZW4gZml4ZWQgdXAgYSBiaXQsIHNvIHRoYXQgdGhleSBzaG91bGQgd29yayB3aXRoIGEKLWNvdXBsZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgZXhwZWN0IGFuZCBkZWphZ251LgotCi1TeW1ib2xzJyB2YWx1ZXMgYXJlIG5vdyBoYW5kbGVkIGludGVybmFsbHkgYXMgZXhwcmVzc2lvbnMsIHBlcm1pdHRpbmcgbW9yZQotZmxleGliaWxpdHkgaW4gZXZhbHVhdGluZyB0aGVtIGluIHNvbWUgY2FzZXMuICBTb21lIGRldGFpbHMgb2YgcmVsb2NhdGlvbgotaGFuZGxpbmcgaGF2ZSBhbHNvIGNoYW5nZWQsIGFuZCBzaW1wbGUgY29uc3RhbnQgcG9vbCBtYW5hZ2VtZW50IGhhcyBiZWVuIGFkZGVkLAotdG8gbWFrZSB0aGUgQWxwaGEgcG9ydCBlYXNpZXIuCi0KLU5ldyBvcHRpb24gIi0tc3RhdGlzdGljcyIgZm9yIHByaW50aW5nIG91dCBwcm9ncmFtIHJ1biB0aW1lcy4gIFRoaXMgaXMgaW50ZW5kZWQKLXRvIGJlIHVzZWQgd2l0aCB0aGUgZ2NjICItUSIgb3B0aW9uLCB3aGljaCBwcmludHMgb3V0IHRpbWVzIHNwZW50IGluIHZhcmlvdXMKLXBoYXNlcyBvZiBjb21waWxhdGlvbi4gIChZb3Ugc2hvdWxkIGJlIGFibGUgdG8gZ2V0IGFsbCBvZiB0aGVtIHByaW50ZWQgb3V0IHdpdGgKLSJnY2MgLVEgLVdhLC0tc3RhdGlzdGljcyIsIEkgdGhpbmsuKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMi4yOgotCi1SUy82MDAwIEFJWCBhbmQgTUlQUyBTR0kgSXJpeCA1IHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCi0KLUNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHN0aWxsIGluIGRldmVsb3BtZW50IChhbmQgdGhlcmVmb3JlIGFyZSBjb252ZW5pZW50IHRvCi1oYXZlIGxpc3RlZCBpbiBjb25maWd1cmUuaW4pIHN0aWxsIGdldCByZWplY3RlZCB3aXRob3V0IGEgbWlub3IgY2hhbmdlIHRvCi1nYXMvTWFrZWZpbGUuaW4sIHNvIHBlb3BsZSBub3QgZG9pbmcgZGV2ZWxvcG1lbnQgd29yayBzaG91bGRuJ3QgZ2V0IHRoZQotaW1wcmVzc2lvbiB0aGF0IHN1cHBvcnQgZm9yIHN1Y2ggY29uZmlndXJhdGlvbnMgaXMgYWN0dWFsbHkgYmVsaWV2ZWQgdG8gYmUKLXJlbGlhYmxlLgotCi1UaGUgcHJvZ3JhbSBuYW1lICh1c3VhbGx5ICJhcyIpIGlzIHByaW50ZWQgd2hlbiBhIGZhdGFsIGVycm9yIG1lc3NhZ2UgaXMKLWRpc3BsYXllZC4gIFRoaXMgc2hvdWxkIHByZXZlbnQgc29tZSBjb25mdXNpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiBvY2Nhc2lvbmFsCi1tZXNzYWdlcyBhYm91dCAiaW50ZXJuYWwgZXJyb3JzIi4KLQotRUxGIHN1cHBvcnQgaXMgZmFsbGluZyBpbnRvIHBsYWNlLiAgU3VwcG9ydCBmb3IgdGhlIDM4NiBzaG91bGQgYmUgd29ya2luZy4KLVN1cHBvcnQgZm9yIFNQQVJDIFNvbGFyaXMgaXMgaW4uICBIUFBBIHN1cHBvcnQgZnJvbSBVdGFoIGlzIGJlaW5nIGludGVncmF0ZWQuCi0KLVN5bWJvbCB2YWx1ZXMgYXJlIG1haW50YWluZWQgYXMgZXhwcmVzc2lvbnMgaW5zdGVhZCBvZiBiZWluZyBpbW1lZGlhdGVseSBib2lsZWQKLWRvd24gdG8gYWRkLXN5bWJvbCwgc3ViLXN5bWJvbCwgYW5kIGNvbnN0YW50LiAgVGhpcyBwZXJtaXRzIHNsaWdodGx5IG1vcmUKLWNvbXBsZXggY2FsY3VsYXRpb25zIGludm9sdmluZyBzeW1ib2xzIHdob3NlIHZhbHVlcyBhcmUgbm90IGFscmVhZGV5IGtub3duLgotCi1EQlgtc3R5bGUgZGVidWdnaW5nIGluZm8gKCJzdGFicyIpIGlzIG5vdyBzdXBwb3J0ZWQgZm9yIENPRkYgZm9ybWF0cy4KLUlmIGFueSBzdGFicyBkaXJlY3RpdmVzIGFyZSBzZWVuIGluIHRoZSBzb3VyY2UsIEdBUyB3aWxsIGNyZWF0ZSB0d28gbmV3Ci1zZWN0aW9uczogYSAiLnN0YWIiIGFuZCBhICIuc3RhYnN0ciIgc2VjdGlvbi4gIFRoZSBmb3JtYXQgb2YgdGhlIC5zdGFiCi1zZWN0aW9uIGlzIG5lYXJseSBpZGVudGljYWwgdG8gdGhlIGEub3V0IHN5bWJvbCBmb3JtYXQsIGFuZCAuc3RhYnN0ciBpcwotaXRzIHN0cmluZyB0YWJsZS4gIEZvciB0aGlzIHRvIGJlIHVzZWZ1bCwgeW91IG11c3QgaGF2ZSBjb25maWd1cmVkIEdDQwotdG8gZ2VuZXJhdGUgc3RhYnMgKGJ5IGRlZmluaW5nIERCWF9ERUJVR0dJTkdfSU5GTyksIGFuZCBtdXN0IGhhdmUgYSBHREIKLXRoYXQgY2FuIHVzZSB0aGUgc3RhYiBzZWN0aW9ucyAoNC4xMSBvciBsYXRlcikuCi0KLUx5bnhPUywgb24gaTM4NiBhbmQgbTY4ayBwbGF0Zm9ybXMsIGlzIG5vdyBzdXBwb3J0ZWQuICBTUEFSQyBMeW54T1MKLXN1cHBvcnQgaXMgaW4gcHJvZ3Jlc3MuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjE6Ci0KLVNldmVyYWwgc21hbGwgZml4ZXMgZm9yIGkzODYtYWl4IChQUy8yKSBzdXBwb3J0IGZyb20gTWluaCBUcmFuLUxlIGhhdmUgYmVlbgotaW5jb3Jwb3JhdGVkLCBidXQgbm90IHdlbGwgdGVzdGVkIHlldC4KLQotQWx0ZXJlZCB0aGUgb3Bjb2RlIHRhYmxlIHNwbGl0IGZvciBtNjhrOyBpdCBzaG91bGQgcmVxdWlyZSBsZXNzIFZNIHRvIGNvbXBpbGUKLXdpdGggZ2NjIG5vdy4KLQotU29tZSBtaW5vciBhZGp1c3RtZW50cyB0byBhZGQgKENvbnZlcmdlbnQgVGVjaG5vbG9naWVzJykgTWluaWZyYW1lIHN1cHBvcnQsCi1zdWdnZXN0ZWQgYnkgUm9uYWxkIENvbGUuCi0KLUhQUEEgc3VwcG9ydCAocnVubmluZyBPU0Ygb25seSwgbm90IEhQVVgpIGhhcyBiZWVuIGNvbnRyaWJ1dGVkIGJ5IFV0YWguICBUaGlzCi1pbmNsdWRlcyBpbXByb3ZlZCBFTEYgc3VwcG9ydCwgd2hpY2ggSSd2ZSBzdGFydGVkIGFkYXB0aW5nIGZvciBTUEFSQyBTb2xhcmlzCi0yLnguICBJbnRlZ3JhdGlvbiBpc24ndCBjb21wbGV0ZWx5LCBzbyBpdCBwcm9iYWJseSB3b24ndCB3b3JrLgotCi1IUDkwMDAvMzAwIHN1cHBvcnQsIGRvbmF0ZWQgYnkgSFAsIGhhcyBiZWVuIG1lcmdlZCBpbi4KLQotSWFuIFRheWxvciBoYXMgZmluaXNoZWQgdGhlIE1JUFMgRUNPRkYgKFVsdHJpeCwgSXJpeCkgc3VwcG9ydC4KLQotQmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciB1bnN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAoZS5nLiwgaHBwYS1ocHV4KS4KLQotVGVzdCBzdWl0ZSBmcmFtZXdvcmsgaXMgc3RhcnRpbmcgdG8gYmVjb21lIHJlYXNvbmFibGUuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ2hhbmdlcyBpbiAyLjA6Ci0KLU1vc3RseSBidWcgZml4ZXMuCi0KLVNvbWUgbW9yZSBtZXJnaW5nIG9mIEJGRCBhbmQgRUxGIGNvZGUsIGJ1dCBFTEYgc3RpbGwgZG9lc24ndCB3b3JrLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNoYW5nZXMgaW4gMS45NDoKLQotQkZEIG1lcmdlIGlzIHBhcnRseSBkb25lLiAgQWR2ZW50dXJvdXMgc291bHMgbWF5IHRyeSBnaXZpbmcgY29uZmlndXJlIHRoZQotIi0td2l0aC1iZmQtYXNzZW1ibGVyIiBvcHRpb24uICBDdXJyZW50bHksIEVMRiBmb3JtYXQgcmVxdWlyZXMgaXQsIGEub3V0IGZvcm1hdAotYWNjZXB0cyBpdDsgU1BBUkMgQ1BVIGFjY2VwdHMgaXQuICBJdCdzIHRoZSBkZWZhdWx0IG9ubHkgZm9yIE9TICJlbGYiIG9yCi0ic29sYXJpcyIuICAoRUxGIGlzbid0IHJlYWxseSBzdXBwb3J0ZWQgeWV0LiAgSXQgbmVlZHMgd29yay4gIEkndmUgZ290IHNvbWUKLWNvZGUgZnJvbSBVdGFoIGZvciBIUC1QQSBFTEYsIGFuZCBmcm9tIERHIGZvciBtODhrIEVMRiwgYnV0IHRoZXkncmUgbm90IGZ1bGx5Ci1tZXJnZWQgeWV0LikKLQotVGhlIDY4SyBvcGNvZGUgdGFibGUgaGFzIGJlZW4gc3BsaXQgaW4gaGFsZi4gIEl0IHNob3VsZCBub3cgY29tcGlsZSB1bmRlciBnY2MKLXdpdGhvdXQgY29uc3VtaW5nIHJpZGljdWxvdXMgYW1vdW50cyBvZiBtZW1vcnkuCi0KLUEgY291cGxlIGRhdGEgc3RydWN0dXJlcyBoYXZlIGJlZW4gcmVkdWNlZCBpbiBzaXplLiAgVGhpcyBzaG91bGQgcmVzdWx0IGluCi1zYXZpbmcgYSBsaXR0bGUgYml0IG9mIHNwYWNlIGF0IHJ1bnRpbWUuCi0KLVN1cHBvcnQgZm9yIE1JUFMsIGZyb20gT1NGIGFuZCBSYWxwaCBDYW1wYmVsbCwgaGFzIGJlZW4gbWVyZ2VkIGluLiAgVGhlIE9TRgotY29kZSBwcm92aWRlZCBST1NFIGZvcm1hdCBzdXBwb3J0LCB3aGljaCBJIGhhdmVuJ3QgbWVyZ2VkIGluIHlldC4gIChJIGNhbiBtYWtlCi1pdCBhdmFpbGFibGUsIGlmIGFueW9uZSB3YW50cyB0byB0cnkgaXQgb3V0LikgIFJhbHBoJ3MgY29kZSwgZm9yIEJTRCA0LjQsCi1zdXBwb3J0cyBhLm91dCBmb3JtYXQuICBXZSBkb24ndCBoYXZlIEVDT0ZGIHN1cHBvcnQgaW4ganVzdCB5ZXQ7IGl0J3MgY29taW5nLgotCi1TdXBwb3J0IGZvciB0aGUgSGl0YWNoaSBIOC81MDAgaGFzIGJlZW4gYWRkZWQuCi0KLVZNUyBob3N0IGFuZCB0YXJnZXQgc3VwcG9ydCBzaG91bGQgYmUgd29ya2luZyBub3csIHRoYW5rcyBjaGllZmx5IHRvIEVyaWMKLVlvdW5nZGFsZS4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DaGFuZ2VzIGluIDEuOTMuMDE6Ci0KLUZvciBtNjhrLCBzdXBwb3J0IGZvciBtb3JlIHByb2Nlc3NvcnMgaGFzIGJlZW4gYWRkZWQ6IDY4MDQwLCBDUFUzMiwgNjg4NTEuCi0KLUZvciBpMzg2LCAuYWxpZ24gaXMgbm93IHBvd2VyLW9mLXR3bzsgd2FzIG51bWJlci1vZi1ieXRlcy4KLQotRm9yIG02OGssICIlIiBpcyBub3cgYWNjZXB0ZWQgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLiAgRm9yIENPRkYgZm9ybWF0LCB3aGljaAotZG9lc24ndCB1c2UgdW5kZXJzY29yZSBwcmVmaXhlcyBmb3IgQyBsYWJlbHMsIGl0IGlzIHJlcXVpcmVkLCBzbyB2YXJpYWJsZSAiYTAiCi1jYW4gYmUgZGlzdGluZ3Vpc2hlZCBmcm9tIHRoZSByZWdpc3Rlci4KLQotTGFzdCBwdWJsaWMgcmVsZWFzZSB3YXMgMS4zOC4gIExvdHMgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHNpbmNlIHRoZW4sIGxvdHMKLW9mIG5ldyBDUFVzIGFuZCBmb3JtYXRzLCBsb3RzIG9mIGJ1Z3MgZml4ZWQuCi0KLQwKLUxvY2FsIHZhcmlhYmxlczoKLWZpbGwtY29sdW1uOiA3OQotRW5kOgpkaWZmIC0tZ2l0IGEvZ2FzL1JFQURNRSBiL2dhcy9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzI3ZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0JCVJFQURNRSBmb3IgR0FTCi0KLUEgbnVtYmVyIG9mIHRoaW5ncyBoYXZlIGNoYW5nZWQgc2luY2UgdmVyc2lvbiAxIGFuZCB0aGUgd29uZGVyZnVsIHdvcmxkIG9mIGdhcwotbG9va3MgdmVyeSBkaWZmZXJlbnQuICBUaGVyZSdzIHN0aWxsIGEgbG90IG9mIGlycmVsZXZhbnQgZ2FyYmFnZSBseWluZyBhcm91bmQKLXRoYXQgd2lsbCBiZSBjbGVhbmVkIHVwIGluIHRpbWUuICBEb2N1bWVudGF0aW9uIGlzIHNjYXJjZSwgYXMgYXJlIGxvZ3Mgb2YgdGhlCi1jaGFuZ2VzIG1hZGUgc2luY2UgdGhlIGxhc3QgZ2FzIHJlbGVhc2UuICBNeSBhcG9sb2dpZXMsIGFuZCBJJ2xsIHRyeSB0byBnZXQKLXNvbWV0aGluZyB1c2VmdWwuCi0KLVVucGFja2luZyBhbmQgSW5zdGFsbGF0aW9uIC0gU3VtbWFyeQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLVRvIGJ1aWxkIGp1c3QgdGhlIGFzc2VtYmxlciwgbWFrZSB0aGUgdGFyZ2V0IGFsbC1nYXMuCi0KLURvY3VtZW50YXRpb24KLT09PT09PT09PT09PT0KLQotVGhlIEdBUyByZWxlYXNlIGluY2x1ZGVzIHRleGluZm8gc291cmNlIGZvciBpdHMgbWFudWFsLCB3aGljaCBjYW4gYmUgcHJvY2Vzc2VkCi1pbnRvIGBpbmZvJyBvciBgZHZpJyBmb3Jtcy4KLQotVGhlIERWSSBmb3JtIGlzIHN1aXRhYmxlIGZvciBwcmludGluZyBvciBkaXNwbGF5aW5nOyB0aGUgY29tbWFuZHMgZm9yIGRvaW5nCi10aGlzIHZhcnkgZnJvbSBzeXN0ZW0gdG8gc3lzdGVtLiAgT24gbWFueSBzeXN0ZW1zLCBgbHByIC1kJyB3aWxsIHByaW50IGEgRFZJCi1maWxlLiAgT24gb3RoZXJzLCB5b3UgbWF5IG5lZWQgdG8gcnVuIGEgcHJvZ3JhbSBzdWNoIGFzIGBkdmlwcycgdG8gY29udmVydCB0aGUKLURWSSBmaWxlIGludG8gYSBmb3JtIHlvdXIgc3lzdGVtIGNhbiBwcmludC4KLQotSWYgeW91IHdpc2ggdG8gYnVpbGQgdGhlIERWSSBmaWxlLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgVGVYIGluc3RhbGxlZCBvbiB5b3VyCi1zeXN0ZW0uICBZb3UgY2FuIHJlYnVpbGQgaXQgYnkgdHlwaW5nOgotCi0JY2QgZ2FzL2RvYwotCW1ha2UgYXMuZHZpCi0KLVRoZSBJbmZvIGZvcm0gaXMgdmlld2FibGUgd2l0aCB0aGUgR05VIEVtYWNzIGBpbmZvJyBzdWJzeXN0ZW0sIG9yIHRoZQotc3RhbmRhbG9uZSBgaW5mbycgcHJvZ3JhbSwgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIEdOVSBUZXhpbmZvIGRpc3RyaWJ1dGlvbi4KLVRvIGJ1aWxkIHRoZSBpbmZvIGZpbGVzLCB5b3Ugd2lsbCBuZWVkIHRoZSBgbWFrZWluZm8nIHByb2dyYW0uICBUeXBlOgotCi0JY2QgZ2FzL2RvYwotCW1ha2UgaW5mbwotCi1TcGVjaWZ5aW5nIG5hbWVzIGZvciBob3N0cyBhbmQgdGFyZ2V0cwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAgVGhlIHNwZWNpZmljYXRpb25zIHVzZWQgZm9yIGhvc3RzIGFuZCB0YXJnZXRzIGluIHRoZSBgY29uZmlndXJlJwotc2NyaXB0IGFyZSBiYXNlZCBvbiBhIHRocmVlLXBhcnQgbmFtaW5nIHNjaGVtZSwgYnV0IHNvbWUgc2hvcnQKLXByZWRlZmluZWQgYWxpYXNlcyBhcmUgYWxzbyBzdXBwb3J0ZWQuICBUaGUgZnVsbCBuYW1pbmcgc2NoZW1lIGVuY29kZXMKLXRocmVlIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUgZm9sbG93aW5nIHBhdHRlcm46Ci0KLSAgICAgQVJDSElURUNUVVJFLVZFTkRPUi1PUwotCi0gICBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzIGBzdW40JyBhcyBhIEhPU1QgYXJndW1lbnQgb3IgaW4gYQotYC0tdGFyZ2V0PVRBUkdFVCcgb3B0aW9uLiAgVGhlIGVxdWl2YWxlbnQgZnVsbCBuYW1lIGlzCi1gc3BhcmMtc3VuLXN1bm9zNCcuCi0KLSAgIFRoZSBgY29uZmlndXJlJyBzY3JpcHQgYWNjb21wYW55aW5nIEdBUyBkb2VzIG5vdCBwcm92aWRlIGFueSBxdWVyeQotZmFjaWxpdHkgdG8gbGlzdCBhbGwgc3VwcG9ydGVkIGhvc3QgYW5kIHRhcmdldCBuYW1lcyBvciBhbGlhc2VzLiAKLWBjb25maWd1cmUnIGNhbGxzIHRoZSBCb3VybmUgc2hlbGwgc2NyaXB0IGBjb25maWcuc3ViJyB0byBtYXAKLWFiYnJldmlhdGlvbnMgdG8gZnVsbCBuYW1lczsgeW91IGNhbiByZWFkIHRoZSBzY3JpcHQsIGlmIHlvdSB3aXNoLCBvcgoteW91IGNhbiB1c2UgaXQgdG8gdGVzdCB5b3VyIGd1ZXNzZXMgb24gYWJicmV2aWF0aW9ucy0tZm9yIGV4YW1wbGU6Ci0KLSAgICAgJSBzaCBjb25maWcuc3ViIHN1bjQKLSAgICAgc3BhcmMtc3VuLXN1bm9zNDExCi0gICAgICUgc2ggY29uZmlnLnN1YiBzdW4zCi0gICAgIG02OGstc3VuLXN1bm9zNDExCi0gICAgICUgc2ggY29uZmlnLnN1YiBkZWNzdGF0aW9uCi0gICAgIG1pcHMtZGVjLXVsdHJpeDQyCi0gICAgICUgc2ggY29uZmlnLnN1YiBocDMwMGJzZAotICAgICBtNjhrLWhwLWJzZAotICAgICAlIHNoIGNvbmZpZy5zdWIgaTM4NnYKLSAgICAgaTM4Ni11bmtub3duLXN5c3YKLSAgICAgJSBzaCBjb25maWcuc3ViIGk3ODZ2Ci0gICAgIEludmFsaWQgY29uZmlndXJhdGlvbiBgaTc4NnYnOiBtYWNoaW5lIGBpNzg2dicgbm90IHJlY29nbml6ZWQKLQotCi1gY29uZmlndXJlJyBvcHRpb25zCi09PT09PT09PT09PT09PT09PT09Ci0KLSAgIEhlcmUgaXMgYSBzdW1tYXJ5IG9mIHRoZSBgY29uZmlndXJlJyBvcHRpb25zIGFuZCBhcmd1bWVudHMgdGhhdCBhcmUKLW1vc3Qgb2Z0ZW4gdXNlZnVsIGZvciBidWlsZGluZyBHQVMuICBgY29uZmlndXJlJyBhbHNvIGhhcyBzZXZlcmFsIG90aGVyCi1vcHRpb25zIG5vdCBsaXN0ZWQgaGVyZS4KLQotICAgICBjb25maWd1cmUgWy0taGVscF0KLSAgICAgICAgICAgICAgIFstLXByZWZpeD1ESVJdCi0gICAgICAgICAgICAgICBbLS1zcmNkaXI9UEFUSF0KLSAgICAgICAgICAgICAgIFstLWhvc3Q9SE9TVF0KLSAgICAgICAgICAgICAgIFstLXRhcmdldD1UQVJHRVRdCi0gICAgICAgICAgICAgICBbLS13aXRoLU9QVElPTl0KLSAgICAgICAgICAgICAgIFstLWVuYWJsZS1PUFRJT05dCi0KLVlvdSBtYXkgaW50cm9kdWNlIG9wdGlvbnMgd2l0aCBhIHNpbmdsZSBgLScgcmF0aGVyIHRoYW4gYC0tJyBpZiB5b3UKLXByZWZlcjsgYnV0IHlvdSBtYXkgYWJicmV2aWF0ZSBvcHRpb24gbmFtZXMgaWYgeW91IHVzZSBgLS0nLgotCi1gLS1oZWxwJwotICAgICBQcmludCBhIHN1bW1hcnkgb2YgdGhlIG9wdGlvbnMgdG8gYGNvbmZpZ3VyZScsIGFuZCBleGl0LgotCi1gLXByZWZpeD1ESVInCi0gICAgIENvbmZpZ3VyZSB0aGUgc291cmNlIHRvIGluc3RhbGwgcHJvZ3JhbXMgYW5kIGZpbGVzIHVuZGVyIGRpcmVjdG9yeQotICAgICBgRElSJy4KLQotYC0tc3JjZGlyPVBBVEgnCi0gICAgIExvb2sgZm9yIHRoZSBwYWNrYWdlJ3Mgc291cmNlIGNvZGUgaW4gZGlyZWN0b3J5IERJUi4gIFVzdWFsbHkKLSAgICAgYGNvbmZpZ3VyZScgY2FuIGRldGVybWluZSB0aGF0IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgotCi1gLS1ob3N0PUhPU1QnCi0gICAgIENvbmZpZ3VyZSBHQVMgdG8gcnVuIG9uIHRoZSBzcGVjaWZpZWQgSE9TVC4gIE5vcm1hbGx5IHRoZQotICAgICBjb25maWd1cmUgc2NyaXB0IGNhbiBmaWd1cmUgdGhpcyBvdXQgYXV0b21hdGljYWxseS4KLQotICAgICBUaGVyZSBpcyBubyBjb252ZW5pZW50IHdheSB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZQotICAgICBob3N0cy4KLQotYC0tdGFyZ2V0PVRBUkdFVCcKLSAgICAgQ29uZmlndXJlIEdBUyBmb3IgY3Jvc3MtYXNzZW1ibGluZyBwcm9ncmFtcyBmb3IgdGhlIHNwZWNpZmllZAotICAgICBUQVJHRVQuICBXaXRob3V0IHRoaXMgb3B0aW9uLCBHQVMgaXMgY29uZmlndXJlZCB0byBhc3NlbWJsZSAubyBmaWxlcwotICAgICB0aGF0IHJ1biBvbiB0aGUgc2FtZSBtYWNoaW5lIChIT1NUKSBhcyBHQVMgaXRzZWxmLgotCi0gICAgIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlCi0gICAgIHRhcmdldHMuCi0KLWAtLWVuYWJsZS1PUFRJT04nCi0gICAgIFRoZXNlIGZsYWdzIHRlbGwgdGhlIHByb2dyYW0gb3IgbGlicmFyeSBiZWluZyBjb25maWd1cmVkIHRvIAotICAgICBjb25maWd1cmUgaXRzZWxmIGRpZmZlcmVudGx5IGZyb20gdGhlIGRlZmF1bHQgZm9yIHRoZSBzcGVjaWZpZWQKLSAgICAgaG9zdC90YXJnZXQgY29tYmluYXRpb24uICBTZWUgYmVsb3cgZm9yIGEgbGlzdCBvZiBgLS1lbmFibGUnCi0gICAgIG9wdGlvbnMgcmVjb2duaXplZCBpbiB0aGUgZ2FzIGRpc3RyaWJ1dGlvbi4KLQotYGNvbmZpZ3VyZScgYWNjZXB0cyBvdGhlciBvcHRpb25zLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGNvbmZpZ3VyaW5nCi1vdGhlciBHTlUgdG9vbHMgcmVjdXJzaXZlbHk7IGJ1dCB0aGVzZSBhcmUgdGhlIG9ubHkgb3B0aW9ucyB0aGF0IGFmZmVjdAotR0FTIG9yIGl0cyBzdXBwb3J0aW5nIGxpYnJhcmllcy4KLQotVGhlIGAtLWVuYWJsZScgb3B0aW9ucyByZWNvZ25pemVkIGJ5IHNvZnR3YXJlIGluIHRoZSBnYXMgZGlzdHJpYnV0aW9uIGFyZToKLQotYC0tZW5hYmxlLXRhcmdldHM9Li4uJwotICAgICBUaGlzIGNhdXNlcyBvbmUgb3IgbW9yZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbnMgdG8gYmUgYWRkZWQgdG8gdGhvc2UgZm9yCi0gICAgIHdoaWNoIEJGRCBzdXBwb3J0IGlzIGNvbXBpbGVkLiAgQ3VycmVudGx5IGdhcyBjYW5ub3QgdXNlIGFueSBmb3JtYXQgb3RoZXIKLSAgICAgdGhhbiBpdHMgY29tcGlsZWQtaW4gZGVmYXVsdCwgc28gdGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsLgotCi1gLS1lbmFibGUtYmZkLWFzc2VtYmxlcicKLSAgICAgVGhpcyBjYXVzZXMgdGhlIGFzc2VtYmxlciB0byB1c2UgdGhlIG5ldyBjb2RlIGJlaW5nIG1lcmdlZCBpbnRvIGl0IHRvIHVzZQotICAgICBCRkQgZGF0YSBzdHJ1Y3R1cmVzIGludGVybmFsbHksIGFuZCB1c2UgQkZEIGZvciB3cml0aW5nIG9iamVjdCBmaWxlcy4KLSAgICAgRm9yIG1vc3QgdGFyZ2V0cywgdGhpcyBpc24ndCBzdXBwb3J0ZWQgeWV0LiAgRm9yIG1vc3QgdGFyZ2V0cyB3aGVyZSBpdCBoYXMKLSAgICAgYmVlbiBkb25lLCBpdCdzIGFscmVhZHkgdGhlIGRlZmF1bHQuICBTbyBnZW5lcmFsbHkgeW91IHdvbid0IG5lZWQgdG8gdXNlCi0gICAgIHRoaXMgb3B0aW9uLgotCi1TdXBwb3J0ZWQgcGxhdGZvcm1zCi09PT09PT09PT09PT09PT09PT09Ci0KLUF0IHRoaXMgcG9pbnQgSSBiZWxpZXZlIGdhcyB0byBiZSBhbnNpIG9ubHkgY29kZSBmb3IgbW9zdCB0YXJnZXQgY3B1J3MuICBUaGF0Ci1pcywgdGhlcmUgc2hvdWxkIGJlIHJlbGF0aXZlbHkgZmV3LCBpZiBhbnkgaG9zdCBzeXN0ZW0gZGVwZW5kZW5jaWVzLiAgU28KLXBvcnRpbmcgKGFzIGEgY3Jvc3MtYXNzZW1ibGVyKSB0byBob3N0cyBub3QgeWV0IHN1cHBvcnRlZCBzaG91bGQgYmUgZmFpcmx5Ci1lYXN5LiAgUG9ydGluZyB0byBhIG5ldyB0YXJnZXQgc2hvdWxkbid0IGJlIHRvbyB0b3VnaCBpZiBpdCdzIGEgdmFyaWFudCBvZiBvbmUKLWFscmVhZHkgc3VwcG9ydGVkLgotCi1OYXRpdmUgYXNzZW1ibGluZyBzaG91bGQgd29yayBvbjoKLQotCXN1bjMKLQlzdW40Ci0JMzg2YnNkCi0JYnNkLzM4NgotCWRlbHRhIChtNjhrLXN5c3YgZnJvbSBNb3Rvcm9sYSkKLQlkZWx0YTg4IChtODhrLXN5c3YgZnJvbSBNb3Rvcm9sYSkKLQlHTlUvbGludXgKLQltNjhrIGhwdXggOC4wIChocHV4IDcuMCBtYXkgYmUgYSBwcm9ibGVtKQotCXZheCBic2QsIHVsdHJpeCwgdm1zCi0JaHA5MDAwczMwMAotCWRlY3N0YXRpb24KLQlpcml4IDQKLQlpcml4IDUKLQltaW5pZnJhbWUgKG02OGstc3lzdiBmcm9tIENvbnZlcmdlbnQgVGVjaG5vbG9naWVzKQotCWkzODYtYWl4IChwcy8yKQotCWhwcGEgKGhwdXggNC4zYnNkLCBvc2YxKQotCUFJWAotCXVuaXh3YXJlCi0Jc2NvIDMuMnY0LjIKLQlzY28gb3BlbnNlcnZlciA1LjAgKGEuay5hLiAzLjJ2NS4wICkKLQlzcGFyYyBzb2xhcmlzCi0JbnMzMmsgKG5ldGJzZCwgbGl0ZXMpCi0KLUkgYmVsaWV2ZSB0aGF0IGdhcyBhcyBhIGNyb3NzLWFzc2VtYmxlciBjYW4gY3VycmVudGx5IGJlIHRhcmdldHRlZCBmb3IKLW1vc3Qgb2YgdGhlIGFib3ZlIGhvc3RzLCBwbHVzCi0KLQlkZWNzdGF0aW9uLWJzZCAoYS5vdXQgZm9ybWF0LCB0byBiZSB1c2VkIGluIEJTRCA0LjQpCi0JZWJtb24yOWsKLQlnbzMyIChET1Mgb24gaTM4Niwgd2l0aCBESkdQUCAtLSBvbGQgYS5vdXQgdmVyc2lvbikKLQloOC8zMDAsIGg4LzUwMCAoSGl0YWNoaSkKLQlpMzg2LWFpeCAocHMvMikKLQlpOTYwLWNvZmYKLQltaXBzIGVjb2ZmIChkZWNzdGF0aW9uLXVsdHJpeCwgaXJpcywgbWlwcyBtYWdudW0sIG1pcHMtaWR0LWVjb2ZmKQotCU1pdHN1YmlzaGkgZDEwdiBhbmQgZDMwdgotCW5pbmR5OTYwCi0JcG93ZXJwYyBFQUJJCi0JU0ggKEhpdGFjaGkpCi0Jc2NvMzg2Ci0JVEkgdGljMzAgYW5kIHRpYzgwCi0JdmF4IGJzZCBvciB1bHRyaXg/Ci0Jdm1zCi0Jdnh3b3JrczY4awotCXZ4d29ya3M5NjAKLQl6ODAwMCAoWmlsb2cpCi0KLU1JUFMgRUNPRkYgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCwgYnV0IEdBUyB3aWxsIG5vdCBydW4gYSBDLXN0eWxlCi1wcmVwcm9jZXNzb3IuICBJZiB5b3Ugd2FudCB0aGF0LCByZW5hbWUgeW91ciBmaWxlIHRvIGhhdmUgYSAiLlMiIHN1ZmZpeCwgYW5kCi1ydW4gZ2NjIG9uIGl0LiAgT3IgcnVuICJnY2MgLXhhc3NlbWJsZXItd2l0aC1jcHAgZm9vLnMiLgotCi1TdXBwb3J0IGZvciBFTEYgc2hvdWxkIHdvcmsgbm93IGZvciBzcGFyYywgaHBwYSwgaTM4NiwgYWxwaGEsIG02OGssCi1NSVBTLCBwb3dlcnBjLgotCi1TdXBwb3J0IGZvciBzZXF1ZW50IChuczMyayksIHRhaG9lLCBpODYwLCBtODhrIG1heSBiZSBzdWZmZXJpbmcgZnJvbSBiaXRyb3QuCi0KLUlmIHlvdSB0cnkgb3V0IGdhcyBvbiBzb21lIGhvc3Qgb3IgdGFyZ2V0IG5vdCBsaXN0ZWQgYWJvdmUsIHBsZWFzZSBsZXQgbWUga25vdwotdGhlIHJlc3VsdHMsIHNvIEkgY2FuIHVwZGF0ZSB0aGUgbGlzdC4KLQotQ29tcGlsZXIgU3VwcG9ydCBIYWNrcwotPT09PT09PT09PT09PT09PT09PT09PQotCi1PbiBhIGZldyB0YXJnZXRzLCB0aGUgYXNzZW1ibGVyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIHN1cHBvcnQgYSBmZWF0dXJlCi10aGF0IGlzIHBvdGVudGlhbGx5IHVzZWZ1bCB3aGVuIGFzc2VtYmxpbmcgY29tcGlsZXIgb3V0cHV0LCBidXQgd2hpY2gKLW1heSBjb25mdXNlIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzLiAgSWYgYXNzZW1ibGVyIGVuY291bnRlcnMgYQotLndvcmQgcHNldWRvLW9wIG9mIHRoZSBmb3JtIHN5bWJvbDEtc3ltYm9sMiAodGhlIGRpZmZlcmVuY2Ugb2YgdHdvCi1zeW1ib2xzKSwgYW5kIHRoZSBkaWZmZXJlbmNlIG9mIHRob3NlIHR3byBzeW1ib2xzIHdpbGwgbm90IGZpdCBpbiAxNgotYml0cywgdGhlIGFzc2VtYmxlciB3aWxsIGNyZWF0ZSBhIGJyYW5jaCBhcm91bmQgYSBsb25nIGp1bXAgdG8KLXN5bWJvbDEsIGFuZCBpbnNlcnQgdGhpcyBpbnRvIHRoZSBvdXRwdXQgZGlyZWN0bHkgYmVmb3JlIHRoZSBuZXh0Ci1sYWJlbDogVGhlIC53b3JkIHdpbGwgKGluc3RlYWQgb2YgY29udGFpbmluZyBnYXJiYWdlLCBvciBnaXZpbmcgYW4KLWVycm9yIG1lc3NhZ2UpIGNvbnRhaW4gKHRoZSBhZGRyZXNzIG9mIHRoZSBsb25nIGp1bXApLXN5bWJvbDIuICBUaGlzCi1hbGxvd3MgdGhlIGFzc2VtYmxlciB0byBhc3NlbWJsZSBqdW1wIHRhYmxlcyB0aGF0IGp1bXAgdG8gbG9jYXRpb25zCi12ZXJ5IGZhciBhd2F5IGludG8gY29kZSB0aGF0IHdvcmtzIHByb3Blcmx5LiAgSWYgdGhlIG5leHQgbGFiZWwgaXMKLW1vcmUgdGhhbiAzMksgYXdheSBmcm9tIHRoZSAud29yZCwgeW91IGxvc2UgKHNpbGVudGx5KTsgUk1TIGNsYWltcwotdGhpcyB3aWxsIG5ldmVyIGhhcHBlbi4gIElmIHRoZSAtSyBvcHRpb24gaXMgZ2l2ZW4sIHlvdSB3aWxsIGdldCBhCi13YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGlzIGhhcHBlbnMuCi0KLQotUkVQT1JUSU5HIEJVR1MgSU4gR0FTCi09PT09PT09PT09PT09PT09PT09PT0KLQotQnVncyBpbiBnYXMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZy4gIFRoZXkgbWF5IGJlCi1jcm9zcy1wb3N0ZWQgdG8gYnVnLWdjYyBpZiB0aGV5IGFmZmVjdCB0aGUgdXNlIG9mIGdhcyB3aXRoIGdjYy4gIFRoZXkKLXNob3VsZCBub3QgYmUgcmVwb3J0ZWQganVzdCB0byBidWctZ2NjLCBzaW5jZSBJIGRvbid0IHJlYWQgdGhhdCBsaXN0LAotYW5kIHRoZXJlZm9yZSB3b3VsZG4ndCBzZWUgdGhlbS4KLQotSWYgeW91IHJlcG9ydCBhIGJ1ZyBpbiBHQVMsIHBsZWFzZSByZW1lbWJlciB0byBpbmNsdWRlOgotCi1BIGRlc2NyaXB0aW9uIG9mIGV4YWN0bHkgd2hhdCB3ZW50IHdyb25nLCBhbmQgZXhhY3RseSB3aGF0IHNob3VsZCBoYXZlCi1oYXBwZW5lZCBpbnN0ZWFkLgotCi1UaGUgdHlwZSBvZiBtYWNoaW5lIChWQVgsIDY4MDIwLCBldGMpIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChCU0QsIFN1bk9TLCBEWU5JWCwKLVZNUywgZXRjKSBHQVMgd2FzIHJ1bm5pbmcgb24uCi0KLVRoZSBjb25maWd1cmF0aW9uIG5hbWUocykgZ2l2ZW4gdG8gdGhlICJjb25maWd1cmUiIHNjcmlwdC4gIFRoZQotImNvbmZpZy5zdGF0dXMiIGZpbGUgc2hvdWxkIGhhdmUgdGhpcyBpbmZvcm1hdGlvbi4KLQotVGhlIG9wdGlvbnMgZ2l2ZW4gdG8gR0FTIGF0IHJ1biB0aW1lLgotCi1UaGUgYWN0dWFsIGlucHV0IGZpbGUgdGhhdCBjYXVzZWQgdGhlIHByb2JsZW0uCi0KLUl0IGlzIHNpbGx5IHRvIHJlcG9ydCBhIGJ1ZyBpbiBHQVMgd2l0aG91dCBpbmNsdWRpbmcgYW4gaW5wdXQgZmlsZSBmb3IgR0FTLgotRG9uJ3QgYXNrIHVzIHRvIGdlbmVyYXRlIHRoZSBmaWxlIGp1c3QgYmVjYXVzZSB5b3UgbWFkZSBpdCBmcm9tIGZpbGVzIHlvdQotdGhpbmsgd2UgaGF2ZSBhY2Nlc3MgdG8uCi0KLTEuIFlvdSBtaWdodCBiZSBtaXN0YWtlbi4KLTIuIEl0IG1pZ2h0IHRha2UgdXMgYSBsb3Qgb2YgdGltZSB0byBpbnN0YWxsIHRoaW5ncyB0byByZWdlbmVyYXRlIHRoYXQgZmlsZS4KLTMuIFdlIG1pZ2h0IGdldCBhIGRpZmZlcmVudCBmaWxlIGZyb20gdGhlIG9uZSB5b3UgZ290LCBhbmQgbWlnaHQgbm90IHNlZSBhbnkKLSAgIGJ1Zy4KLQotVG8gc2F2ZSB1cyB0aGVzZSBkZWxheXMgYW5kIHVuY2VydGFpbnRpZXMsIGFsd2F5cyBzZW5kIHRoZSBpbnB1dCBmaWxlIGZvciB0aGUKLXByb2dyYW0gdGhhdCBmYWlsZWQuICBBIHNtYWxsZXIgdGVzdCBjYXNlIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtIGlzIG9mCi1jb3Vyc2UgcHJlZmVyYWJsZSwgYnV0IGJlIHN1cmUgaXQgaXMgYSBjb21wbGV0ZSBpbnB1dCBmaWxlLCBhbmQgdGhhdCBpdCByZWFsbHkKLWRvZXMgZGVtb25zdHJhdGUgdGhlIHByb2JsZW07IGJ1dCBpZiBwYXJpbmcgaXQgZG93biB3b3VsZCBjYXVzZSBsYXJnZSBkZWxheXMKLWluIGZpbGluZyB0aGUgYnVnIHJlcG9ydCwgZG9uJ3QgYm90aGVyLgotCi1JZiB0aGUgaW5wdXQgZmlsZSBpcyB2ZXJ5IGxhcmdlLCBhbmQgeW91IGFyZSBvbiB0aGUgaW50ZXJuZXQsIHlvdSBtYXkgd2FudCB0bwotbWFrZSBpdCBhdmFsaWFibGUgZm9yIGFub255bW91cyBGVFAgaW5zdGVhZCBvZiBtYWlsaW5nIGl0LiAgSWYgeW91IGRvLCBpbmNsdWRlCi1pbnN0cnVjdGlvbnMgZm9yIEZUUCdpbmcgaXQgaW4geW91ciBidWcgcmVwb3J0LgotCi1JZiB5b3UgZXhwZWN0IHRvIGJlIGNvbnRyaWJ1dGluZyBhIGxhcmdlIG51bWJlciBvZiB0ZXN0IGNhc2VzLCBpdCB3b3VsZCBiZQotaGVscGZ1bCBpZiB5b3Ugd291bGQgbG9vayBhdCB0aGUgdGVzdCBzdWl0ZSBpbmNsdWRlZCBpbiB0aGUgcmVsZWFzZSAoYmFzZWQgb24KLXRoZSBEZWphIEdudSB0ZXN0aW5nIGZyYW1ld29yaywgYXZhaWxhYmxlIGZyb20gdGhlIHVzdWFsIGZ0cCBzaXRlcykgYW5kIHdyaXRlCi10ZXN0IGNhc2VzIHRvIGZpdCBpbnRvIHRoYXQgZnJhbWV3b3JrLiAgVGhpcyBpcyBjZXJ0YWlubHkgbm90IHJlcXVpcmVkLgpkaWZmIC0tZ2l0IGEvZ2FzL1JFQURNRS12bXMgYi9nYXMvUkVBRE1FLXZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2YzYwMy4uMDAwMDAwMAotLS0gYS9nYXMvUkVBRE1FLXZtcworKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0JVGhpcyBkb2N1bWVudCBleHBsYWlucyBhIGNvdXBsZSBvZiB0aGluZ3MgdGhhdCBhcmUgc3BlY2lmaWMgdG8gVk1TLgotVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gImNoYXB0ZXJzIiwgdGhlIGZpcnN0IGRlYWxzIHdpdGggY3Jvc3MtYXNzZW1ibHkgCi1pc3N1ZXMsIGFuZCB0aGUgc2Vjb25kIGRlYWxzIHdpdGggdGhlIFZNUyBkZWJ1Z2dlciBhbmQgR05VLUNDLgotCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKiogTm90ZXMgZm9yIENyb3NzIEFzc2VtYmx5IHdpdGggVk1TICoqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUlmIHlvdSB3aXNoIHRvIGJ1aWxkIGdhcyBvbiBhIG5vbi1WTVMgc3lzdGVtIHRvIGNyb3NzLWFzc2VtYmxlLCAKLXlvdSBzaG91bGQgdXNlOgotCi1jb25maWd1cmUgJHtob3N0dHlwZX0gLXRhcmdldD12bXMKLQotYW5kIHRoZW4gZm9sbG93IHRoZSB1c3VhbCBwcm9jZWR1cmUuICBUaGUgb2JqZWN0IGZpbGVzIGdlbmVyYXRlZCBvbgotVW5peCB3aWxsIGJlIGNvcnJlY3QgZnJvbSBhIGJpbmFyeSBwb2ludCBvZiB2aWV3LCBidXQgdGhlIHJlYWwgdHJpY2sgaXMKLWdldHRpbmcgdGhlbSB0byB0aGUgVk1TIG1hY2hpbmUuICBUaGUgZm9ybWF0IG9mIHRoZSBvYmplY3QgZmlsZSBpcwotYSB2YXJpYWJsZS1sZW5ndGggcmVjb3JkLCBidXQgZWFjaCByZWNvcmQgY29udGFpbnMgYmluYXJ5IGRhdGEuICBnYXMKLXdyaXRlcyB0aGUgcmVjb3JkcyBpbiB0aGUgc2FtZSBmb3JtYXQgdGhhdCBWTVMgd291bGQgZXhwZWN0LAotbmFtZWx5IGEgdHdvLWJ5dGUgY291bnQgZm9sbG93ZWQgYnkgdGhhdCBudW1iZXIgb2YgYnl0ZXMuCi0KLQlJZiB5b3UgdHJ5IHRvIGNvcHkgdGhlIGZpbGUgdG8gYSBWTVMgc3lzdGVtIHVzaW5nIGZ0cCwgdGhlIGZ0cAotcHJvdG9jb2wgd2lsbCBzY3JldyB1cCB0aGUgZmlsZSBieSBsb29raW5nIGZvciBudWxscyAocmVjb3JkIHRlcm1pbmF0b3IgZm9yCi11bml4KSBhbmQgaXQgd2lsbCBpbnNlcnQgaXQncyBvd24gcmVjb3JkIHRlcm1pbmF0b3JzIGF0IHRoYXQgcG9pbnQuICBUaGlzCi13aWxsIG9idmlvdXNseSBjb3JydXB0IHRoZSBmaWxlLiAKLQotCUlmIHlvdSB0cnkgdG8gdHJhbnNmZXIgdGhlIGZpbGUgd2l0aCBmdHAgaW4gYmluYXJ5IG1vZGUsIHRoZQotZmlsZSBpdHNlbGYgd2lsbCBub3QgYmUgY29ycnVwdCwgYnV0IFZNUyB3aWxsIHRoaW5rIHRoYXQgdGhlIGZpbGUgY29udGFpbnMKLWZpeGVkLWxlbmd0aCByZWNvcmRzIG9mIDUxMiBieXRlcy4gIFlvdSBjYW4gdXNlIHRoZSBwdWJsaWMtZG9tYWluIEZJTEUgCi11dGlsaXR5IHRvIGNoYW5nZSB0aGlzIHdpdGggYSBjb21tYW5kIGxpa2U6Ci0KLSRGSUxFIGZvby5vL3R5cGU9dmFyaWFibGUKLQotSWYgeW91IGRvIG5vdCBoYXZlIHRoaXMgdXRpbGl0eSBhdmFpbGFibGUsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSBjYW4gYmUgCi11c2VkIHRvIHBlcmZvcm0gdGhpcyB0YXNrOgotCi0JI2luY2x1ZGUgPGZhYi5oPgotCQotCSNkZWZpbmUgUk1FJENfU0VUUkZNIDEKLQkgCi0Jc3RydWN0IEZBQiAqIGZhYjsKLQkKLQltYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKXsKLQkJaW50IGksIHN0YXR1czsKLQkJZmFiID0gKHN0cnVjdCBGQUIqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBGQUIpKTsKLQkJKmZhYiA9IGNjJHJtc19mYWI7CS8qIGluaXRpYWxpemUgRkFCKi8KLQkJZmFiLT5mYWIkYl9mYWMgPSBGQUIkTV9QVVQ7Ci0JCWZhYi0+ZmFiJGxfZm9wIHw9IEZBQiRNX0VTQzsKLQkJZmFiLT5mYWIkbF9jdHggPSBSTUUkQ19TRVRSRk07Ci0JCWZhYi0+ZmFiJHdfaWZpID0gMDsKLQkJZm9yKGk9MTtpPGFyZ2M7aSsrKXsKLQkJICBwcmludGYoIlNldHRpbmcgJXMgdG8gdmFyaWFibGUgbGVuZ3RoIHJlY29yZHMuXG4iLGFyZ3ZbaV0pOwotCQkgIGZhYi0+ZmFiJGxfZm5hID0gYXJndltpXTsKLQkgICAgICAgCSAgZmFiLT5mYWIkYl9mbnMgPSBzdHJsZW4oYXJndltpXSk7Ci0JCSAgc3RhdHVzID0gc3lzJG9wZW4oZmFiLDAsMCk7Ci0JCSAgaWYoKHN0YXR1cyAmIDcpICE9IDEpIGxpYiRzaWduYWwoc3RhdHVzKTsKLQkJICBmYWItPmZhYiRiX3JmbSA9IEZBQiRDX1ZBUjsKLQkJICBzdGF0dXMgPSBzeXMkbW9kaWZ5KGZhYiwwLDApOwotCQkgIGlmKChzdGF0dXMgJiA3KSAhPSAxKSBsaWIkc2lnbmFsKHN0YXR1cyk7Ci0JCSAgc3RhdHVzID0gc3lzJGNsb3NlKGZhYiwwLDApOwotCQkgIGlmKChzdGF0dXMgJiA3KSAhPSAxKSBsaWIkc2lnbmFsKHN0YXR1cyk7Ci0JCX07Ci0JfQotCi0JSWYgeW91IGhhdmUgTkZTIHJ1bm5pbmcgb24gdGhlIFZNUyBzeXN0ZW0sIHdoYXQgeW91IG5lZWQgdG8gZG8KLWRlcGVuZHMgdXBvbiB3aGljaCBORlMgc29mdHdhcmUgeW91IGFyZSBydW5uaW5nIG9uIHRoZSBWTVMgc3lzdGVtLiAgVGhlcmUKLWFyZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgVENQL0lQIHBhY2thZ2VzIGZvciBWTVMgYXZhaWxhYmxlLCBhbmQgb25seSB2ZXJ5Ci1saW1pdGVkIHRlc3RpbmcgaGFzIGJlZW4gcGVyZm9ybWVkLiAgIEluIHRoZSB0ZXN0cyB0aGF0IGhhcyBiZWVuIGRvbmUgc28KLWZhciwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIHdpbGwgYWx3YXlzIGJlIGNvcnJlY3Qgd2hlbiB0cmFuc2ZlcnJpbmcgdGhlCi1maWxlIHZpYSBORlMsIGJ1dCB0aGUgcmVjb3JkIGF0dHJpYnV0ZXMgbWF5IG9yIG1heSBub3QgYmUgY29ycmVjdC4gCi0KLQlPbmUgcHJvcHJpZXRhcnkgVENQL0lQL05GUyBwYWNrYWdlIGZvciBWTVMgaXMga25vd24gdG8gCi1hdXRvbWF0aWNhbGx5IGZpeCB0aGUgcmVjb3JkIGF0dHJpYnV0ZXMgb2YgdGhlIG9iamVjdCBmaWxlIGlmIHlvdSBORlMgbW91bnQKLWEgdW5peCBkaXNrIGZyb20gdGhlIFZNUyBzeXN0ZW0sIGFuZCBpZiB0aGUgZmlsZSBoYXMgYSAiLm9iaiIgZXh0ZW5zaW9uIG9uCi10aGUgdW5peCBzeXN0ZW0uICBPdGhlciBUQ1AvSVAgcGFja2FnZXMgbWlnaHQgZG8gdGhpcyBmb3IgeW91IGFzIHdlbGwsIGJ1dAotdGhleSBoYXZlIG5vdCBiZWVuIGNoZWNrZWQuCi0KLU5vIG1hdHRlciB3aGF0IG1ldGhvZCB5b3UgdXNlIHRvIGdldCB0aGUgZmlsZSB0byB0aGUgVk1TIHN5c3RlbSwgaXQgaXMKLWFsd2F5cyBhIGdvb2QgaWRlYSB0byBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyB0aGUgY29ycmVjdCB0eXBlIGJ5Ci1kb2luZyBhICIkZGlyL2Z1bGwiIG9uIHRoZSBvYmplY3QgZmlsZS4gVGhlIGRlc2lyZWQgcmVjb3JkIGF0dHJpYnV0ZXMgd2lsbAotYmUgIk5vbmUiLiAgVW5kZXNpcmFibGUgcmVjb3JkIGF0dHJpYnV0ZXMgd2lsbCBiZSAiU3RyZWFtLUxGIiBvciBhbnl0aGluZwotZWxzZS4gCi0KLU9uY2UgeW91IGdldCB0aGUgZmlsZXMgb24gdGhlIFZNUyBzeXN0ZW0sIHlvdSBjYW4gY2hlY2sgdGhlaXIgaW50ZWdyaXR5IAotd2l0aCB0aGUgIiRhbmFsL29iaiIgY29tbWFuZC4gIChOYXR1cmFsbHkgYXQgc29tZSBwb2ludCB5b3Ugc2hvdWxkIHJlbmFtZQotdGhlIC5vIGZpbGVzIHRvIC5vYmopLiAgQXMgZmFyIGFzIHRoZSBkZWJ1Z2dlciBpcyBjb25jZXJuZWQsIHRoZSByZWNvcmRzIAotd2lsbCBiZSBjb3JyZWN0LCBidXQgdGhlIGRlYnVnZ2VyIHdpbGwgbm90IGJlIGFibGUgdG8gZmluZCB0aGUgc291cmNlIGZpbGVzLAotc2luY2UgaXQgb25seSBoYXMgdGhlIGZpbGUgbmFtZSwgYW5kIG5vdCB0aGUgZnVsbCBkaXJlY3Rvcnkgc3BlY2lmaWNhdGlvbi4KLVlvdSBtdXN0IGdpdmUgdGhlIGRlYnVnZ2VyIHNvbWUgaGVscCBieSB0ZWxsaW5nIGl0IHdoaWNoIGRpcmVjdG9yaWVzIHRvIAotc2VhcmNoIGZvciB0aGUgaW5kaXZpZHVhbCBmaWxlcyAtIG9uY2UgeW91IGhhdmUgZG9uZSB0aGlzIHlvdSBzaG91bGQgYmUgCi1hYmxlIHRvIHByb2NlZWQgbm9ybWFsbHkuCi0KLQlJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2UgbmFtZXMgZm9yIHlvdXIgZmlsZXMgd2hpY2ggd2lsbCBiZSB2YWxpZAotdW5kZXIgVk1TLCBzaW5jZSBvdGhlcndpc2UgeW91IHdpbGwgaGF2ZSBubyB3YXkgb2YgZ2V0dGluZyB0aGUgZGVidWdnZXIgdG8KLWZpbmQgdGhlIHNvdXJjZSBmaWxlIHdoZW4gZGV1Z2dpbmcuCi0KLVRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGUgb2JqZWN0IGZpbGUgbm9ybWFsbHkgY29udGlucyBzcGVjaWZpYwotaW5mb3JtYXRpb24gdGhhdCB0aGUgZGVidWdnZXIgY2FuIHVzZSB0byBwb3NpdGl2ZWx5IGlkZW50aWZ5IGEgZmlsZSwgYW5kIGlmCi15b3UgYXJlIGFzc2VtYmxpbmcgb24gYSB1bml4IHN5c3RlbSB0aGlzIGluZm9ybWF0aW9uIHNpbXBseSBkb2VzIG5vdCBleGlzdAotaW4gYSBtZWFuaW5nZnVsIHdheS4gIFlvdSBtdXN0IGhlbHAgdGhlIGRlYnVnZ2VyIGJ5IHVzaW5nIHRoZSAiU0VUIEZJTEU9IgotY29tbWFuZCB0byB0ZWxsIHRoZSBkZWJ1Z2dlciB3aGVyZSB0byBsb29rIGZvciBzb3VyY2UgZmlsZXMuIFRoZSBkZWJ1Z2dlcgotcmVjb3JkcyB3aWxsIGJlIGNvcnJlY3QsIGV4Y2VwdCB0aGF0IHRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBiZSBpbml0aWFsbHkKLWFibGUgdG8gZmluZCB0aGUgc291cmNlIGZpbGVzLiAgWW91IGNhbiB1c2UgdGhlICJTRVQgRklMRSIgY29tbWFuZCB0byB0ZWxsCi10aGUgZGVidWdnZXIgd2hlcmUgdG8gbG9vayBmb3IgdGhlIHNvdXJjZSBmaWxlcy4gCi0KLUkgaGF2ZSBvbmx5IHRlc3RlZCB0aGlzIHdpdGggYSBTVnI0IGk0ODYgbWFjaGluZSwgYW5kIGV2ZXJ5dGhpbmcgc2VlbXMgdG8KLXdvcmsgT0ssIHdpdGggdGhlIGxpbWl0ZWQgdGVzdGluZyB0aGF0IEkgaGF2ZSBkb25lLiAgT3RoZXIgbWFjaGluZXMgbWF5Ci1vciBtYXkgbm90IHdvcmsuICBZb3Ugc2hvdWxkIHJlYWQgdGhlIGNoYXB0ZXJzIG9uIGNyb3NzLWNvbXBpbGVycyBpbiB0aGUgZ2NjCi1tYW51YWwgYmVmb3JlIGZvb2xpbmcgd2l0aCB0aGlzLiAgU2luY2UgZ2FzIGRvZXMgbm90IG5lZWQgdG8gZG8gYW55IGZsb2F0aW5nCi1wb2ludCBhcml0aG1ldGljLCB0aGUgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIHRoYXQgYXJlIGdlbmVyYXRlZCBoZXJlIHNob3VsZAotYmUgY29ycmVjdCAtIHRoZSBvbmx5IGNvbmNlcm4gaXMgd2l0aCBjb25zdGFudCBmb2xkaW5nIGluIHRoZSBtYWluIGNvbXBpbGVyLgotVGhlIHJhbmdlIGFuZCBwcmVjaXNpb24gb2YgZmxvYXRzIGFuZCBkb3VibGVzIGFyZSBzaW1pbGFyIG9uIHRoZSA0ODYgKHdpdGggCi1hIGJ1aWx0aW4gODAzODcpIGFuZCB0aGUgVkFYLCBhbHRob3VnaCB0aGVyZSBpcyBhIGZhY3RvciBvZiAyIHRvIDQKLWRpZmZlcmVuY2UgaW4gdGhlIHJhbmdlLiAgVGhlIGRvdWJsZSwgYXMgaW1wbGVtZW50ZWQgb24gdGhlIDQ4NiwgaXMgcXVpdGUKLXNpbWlsYXIgdG8gdGhlIEdfRkxPQVQgb24gdGhlIFZBWC4gCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKioqKioqKioqKioqKioqKiogTm90ZXMgZm9yIHVzaW5nIEdOVSBDQyB3aXRoIHRoZSBWTVMgZGVidWdnZXIqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi0JMSkgWW91IHNob3VsZCBiZSBhd2FyZSB0aGF0IEdOVS1DLCBhcyB3aXRoIGFueSBvdGhlciBkZWNlbnQgY29tcGlsZXIsCi13aWxsIGRvIHRoaW5ncyB3aGVuIG9wdGltaXphdGlvbiBpcyB0dXJuZWQgb24gdGhhdCB5b3UgbWF5IG5vdCBleHBlY3QuIAotU29tZXRpbWVzIGludGVybWVkaWF0ZSByZXN1bHRzIGFyZSBub3Qgd3JpdHRlbiB0byB2YXJpYWJsZXMsIGlmIHRoZXkgYXJlIG9ubHkKLXVzZWQgaW4gb25lIHBsYWNlLCBhbmQgc29tZXRpbWVzIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBhdCBhbGwgd2lsbCBub3QgYmUKLXdyaXR0ZW4gdG8gdGhlIHN5bWJvbCB0YWJsZS4gIEFsc28sIHBhcmFtZXRlcnMgdG8gaW5saW5lIGZ1bmN0aW9ucyBhcmUgb2Z0ZW4KLWluYWNjZXNzaWJsZS4gWW91IGNhbiBzZWUgdGhlIGFzc2VtYmx5IGNvZGUgZXF1aXZhbGVudCBieSB1c2luZyBLUDcgaW4gdGhlCi1kZWJ1Z2dlciwgYW5kIGZyb20gdGhpcyB5b3UgY2FuIHRlbGwgaWYgaW4gZmFjdCBhIHZhcmlhYmxlIHNob3VsZCBoYXZlIHRoZQotdmFsdWUgdGhhdCB5b3UgZXhwZWN0LiAgWW91IGNhbiBmaW5kIG91dCBpZiBhIHZhcmlhYmxlIGxpdmVzIHdpdGhpbmcgYSByZWdpc3RlcgotYnkgZG9pbmcgYSAnc2hvdyBzeW1ib2wvYWRkcicuCi0KLQkyKSBPdmVybHkgY29tcGxleCBkYXRhIHR5cGVzLCBzdWNoIGFzOgotCi1pbnQgKCooKigqKCooKigqIHNhcnI2KVsxXSlbMV0pWzJdKVszXSlbNF0pWzVdOwotCi13aWxsIG5vdCBiZSBkZWJ1Z2dlZCBwcm9wZXJseSwgc2luY2UgdGhlIGRlYnVnZ2luZyByZWNvcmQgb3ZlcmZsb3dzIGFuIGludGVybmFsCi1kZWJ1Z2dlciBidWZmZXIuICBnY2MtYXMgd2lsbCBjb252ZXJ0IHRoZXNlIHRvICp2b2lkIGFzIGZhciBhcyB0aGUgZGVidWdnZXIKLXN5bWJvbCB0YWJsZSBpcyBjb25jZXJuZWQsIHdoaWNoIHdpbGwgYXZvaWQgYW55IHByb2JsZW1zLCBhbmQgdGhlIGFzc2VtYmxlcgotd2lsbCBnaXZlIHlvdSBhIG1lc3NhZ2UgaW5mb3JtaW5nIHlvdSB0aGF0IHRoaXMgaGFzIGhhcHBlbmVkLgotCi0JMykgWW91IG11c3QsIG9mIGNvdXJzZSwgY29tcGlsZSBhbmQgbGluayB3aXRoIC9kZWJ1Zy4gIElmIHlvdSBsaW5rCi13aXRob3V0IGRlYnVnLCB5b3Ugc3RpbGwgZ2V0IHRyYWNlYmFjayB0YWJsZSBpbiB0aGUgZXhlY3V0YWJsZSwgYnV0IHRoZXJlIGlzIG5vCi1zeW1ib2wgdGFibGUgZm9yIHZhcmlhYmxlcy4KLQotCTQpIEluY2x1ZGVkIGluIHRoZSBwYXRjaGVzIHRvIFZNUy5DIGFyZSBmaXhlcyB0byB0d28gYnVncyB0aGF0IGFyZQotdW5yZWxhdGVkIHRvIHRoZSBjaGFuZ2VzIHRoYXQgSSBoYXZlIG1hZGUuICBPbmUgb2YgdGhlc2UgbWFkZSBpdCBpbXBvc3NpYmxlIHRvCi1kZWJ1ZyBzbWFsbCBwcm9ncmFtcyBzb21ldGltZXMsIGFuZCB0aGUgb3RoZXIgY2F1c2VkIHRoZSBkZWJ1Z2dlciB0byBiZWNvbWUKLWNvbmZ1c2VkIGFib3V0IHdoaWNoIHJvdXRpbmUgaXQgd2FzIGluLCBhbmQgZ2l2ZSB0aGlzIGluY29ycmVjdCBpbmZvIGluCi10cmFjZWJhY2tzLgotCi0JNSkgSWYgeW91IGFyZSB1c2luZyB0aGUgR05VLUMrKyBjb21waWxlciwgeW91IHNob3VsZCBtb2RpZnkgdGhlCi1jb21waWxlciBkcml2ZXIgZmlsZSBHTlVfQ0M6WzAwMDAwMF1HQ0MuQ09NIChvciBHWFguQ09NKS4gIElmIHlvdSBoYXZlIGEKLXNlcGVyYXRlIEdYWC5DT00sIHRoZW4geW91IG5lZWQgdG8gY2hhbmdlIG9uZSBsaW5lIGluIEdYWC5DT00gdG86Ci0kIGlmIGYkbG9jYXRlKCJEIixwMikgLm5lLiBQMl9MZW5ndGggdGhlbiBEZWJ1ZyA9ICIgIiItRzAiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGljZSB6ZXJvLS0tPiAgXgotSWYgeW91IGFyZSB1c2luZyBhIEdDQy5DT00gdGhhdCBkb2VzIGJvdGggQyBhbmQgQysrLCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0bwotR0NDLkNPTToKLQotJCEKLSQhIFVzZSBvbGQgc3R5bGUgZGVidWdnaW5nIHJlY29yZHMgZm9yIFZNUwotJCEKLSQgaWYgKERlYnVnLm5lcy4iIiApLmFuZC4gUGx1cyB0aGVuIERlYnVnID0gIiAiIi1HMCIiIgotCi1hZnRlciB0aGUgdmFyaWFibGVzIFBsdXMgYW5kIERlYnVnIGFyZSBzZXQuICBUaGUgcmVhc29uIGZvciB0aGlzLCBpcyB0aGF0IEMrKwotY29tcGlsZXIgYnkgZGVmYXVsdCBnZW5lcmF0ZXMgZGVidWdnaW5nIHJlY29yZHMgdGhhdCBhcmUgbW9yZSBjb21wbGV4LAotd2l0aCBtYW55IG5ldyBzeW50YWN0aWNhbCBlbGVtZW50cyB0aGF0IGFsbG93IGZvciB0aGUgbmV3IGZlYXR1cmVzIG9mIHRoZQotbGFuZ3VhZ2UuICBUaGUgLUcwIHN3aXRjaCB0ZWxscyB0aGUgQysrIGNvbXBpbGVyIHRvIHVzZSB0aGUgb2xkIHN0eWxlIGRlYnVnZ2luZwotcmVjb3Jkcy4gIFVudGlsIHRoZSBkZWJ1Z2dlciB1bmRlcnN0YW5kcyBDKysgdGhlcmUgaXMgbm90IGFueSBwb2ludCB0byB0cnkgYW5kCi11c2UgdGhlIGV4cGFuZGVkIHN5bnRheC4KLQotCTYpIFdoZW4geW91IGhhdmUgbmVzdGVkIHNjb3BlcywgaS5lLjoKLW1haW4oKXsKLQlpbnQgaTsKLQl7aW50IGk7Ci0JCXtpbnQgaTsKLX07fTt9Ci1hbmQgeW91IHNheSAiRVhBTSBpIiB0aGUgZGVidWdnZXIgbmVlZHMgdG8gZmlndXJlIG91dCB3aGljaCB2YXJpYWJsZSB5b3UKLWFjdHVhbGx5IHdhbnQgdG8gcmVmZXJlbmNlLiAgSSBoYXZlIGFycmFuZ2VkIHRoaW5ncyB0byBkZWZpbmUgYSBibG9jayB0byB0aGUKLWRlYnVnZ2VyIHdoZW4geW91IHVzZSBicmFja2V0cyB0byBlbnRlciBhIG5ldyBzY29wZSwgc28gaW4gdGhlIGV4YW1wbGUgYWJvdmUsCi10aGUgdmFyaWFibGVzIHdvdWxkIGJlIGRlc2NyaWJlZCBhczoKLVRFU1RcbWFpblxpCi1URVNUXG1haW5cJDBcaQotVEVTVFxtYWluXCQwXCQwXGkKLUF0IGVhY2ggbGV2ZWwsIHRoZSBibG9jayBuYW1lIGlzIGEgbnVtYmVyIHdpdGggYSBkb2xsYXIgc2lnbiBwcmVmaXgsIHRoZQotbnVtYmVycyBzdGFydCB3aXRoIDAgYW5kIGNvdW50IHVwd2FyZC4gIFdoZW4geW91IHNheSBFWEFNIGksIHRoZSBkZWJ1Z2dlciBsb29rcwotYXQgdGhlIGN1cnJlbnQgUEMsIGFuZCBkZWNpZGVzIHdoaWNoIGJsb2NrIGl0IGlzIGN1cnJlbnRseSBpbi4gIEl0IHdvcmtzIGZyb20KLXRoZSBpbm5lcm1vc3QgbGV2ZWwgb3V0d2FyZCB1bnRpbCBpdCBmaW5kcyBhIGJsb2NrIHRoYXQgaGFzIHRoZSB2YXJpYWJsZSAiaSIKLWRlZmluZWQuICBZb3UgY2FuIGFsd2F5cyBzcGVjaWZ5IHRoZSBzY29wZSBleHBsaWNpdGx5LgotCi0JNykgIFdpdGggQysrLCB0aGVyZSBjYW4gYmUgYSBsb3Qgb2YgaW5saW5lIGZ1bmN0aW9ucywgYW5kIGl0IHdvdWxkIGJlCi1yYXRoZXIgcmVzdHJpY3RpdmUgdG8gZm9yY2UgdGhlIHVzZXIgdG8gZGVidWcgdGhlIHByb2dyYW0gYnkgY29udmVydGluZyBhbGwgb2YKLXRoZSBpbmxpbmUgZnVuY3Rpb25zIHRvIG5vcm1hbCBmdW5jdGlvbnMuICBXaGF0IEkgaGF2ZSBkb25lIGlzIHRvIGVzc2VudGlhbGx5Ci0iYWRkIiAod2l0aCB0aGUgZGVidWdnZXIpIHNvdXJjZSBsaW5lcyBmcm9tIHRoZSBpbmNsdWRlIGZpbGVzIHRoYXQgY29udGFpbiB0aGUKLWlubGluZSBmdW5jdGlvbnMuICBUaHVzIHdoZW4geW91IHN0ZXAgaW50byBhbiBpbmxpbmUgZnVuY3Rpb24gaXQgYXBwZWFycyBhcyBpZgoteW91IGhhdmUgY2FsbGVkIHRoZSBmdW5jdGlvbiwgYW5kIHlvdSBjYW4gZXhhbWluZSB2YXJpYWJsZXMgYW5kIHNvIGZvcnRoLiAKLVRoZXJlIGFyZSBzZXZlcmFsICp2ZXJ5KiBpbXBvcnRhbnQgZGlmZmVyZW5jZXMsIGhvd2V2ZXIuICBGaXJzdCBvZiBhbGwsIHNpbmNlCi10aGVyZSBpcyBubyBmdW5jdGlvbiBjYWxsIGludm9sdmVkLCB5b3UgY2Fubm90IHN0ZXAgb3ZlciB0aGUgaW5saW5lIGZ1bmN0aW9uCi1jYWxsIC0geW91IGFsd2F5cyBzdGVwIGludG8gaXQuIFNlY29uZGx5LCBzaW5jZSB0aGUgc2FtZSBzb3VyY2UgbGluZXMgYXJlIHVzZWQKLWluIG1hbnkgbG9jYXRpb25zLCB0aGVyZSBpcyBhIHNlcGVyYXRlIGNvcHkgb2YgdGhlIHNvdXJjZSBmb3IgKmVhY2gqIHVzYWdlLiAKLVdpdGhvdXQgdGhpcywgYnJlYWtwb2ludHMgZG8gbm90IHdvcmssIHNpbmNlIHdlIG11c3QgaGF2ZSBhIDEtdG8tMSBtYXBwaW5nCi1iZXR3ZWVuIHNvdXJjZSBsaW5lcyBhbmQgUEMuCi0JU2luY2UgeW91IGNhbm5vdCBzdGVwIG92ZXIgaW5saW5lIGZ1bmN0aW9uIGNhbGxzLCBpdCBjYW4gYmUgYSByZWFsIHBhaW4KLWlmIHlvdSBhcmUgbm90IHJlYWxseSBpbnRlcmVzdGVkIGluIHdoYXQgaXMgZ29pbmcgb24gZm9yIHRoYXQgZnVuY3Rpb24gY2FsbC4KLVdoYXQgSSBoYXZlIGRvbmUgaXMgdG8gdXNlIHRoZSAiLUQiIHN3aXRjaCBmb3IgdGhlIGFzc2VtYmxlciB0byB0b2dnbGUgdGhlCi1mb2xsb3dpbmcgYmVoYXZpb3IuICBXaXRoIHRoZSAiLUQiIHN3aXRjaCwgYWxsIGlubGluZSBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkIGluCi10aGUgb2JqZWN0IGZpbGUsIGFuZCB5b3UgY2FuIGRlYnVnIGV2ZXJ5dGhpbmcuICBXaXRob3V0IHRoZSAiLUQiIHN3aXRjaAotKGRlZmF1bHQgY2FzZSB3aXRoIFZNUyBpbXBsZW1lbnRhdGlvbiksIGlubGluZSBmdW5jdGlvbnMgYXJlIGluY2x1ZGVkICpvbmx5KiBpZgotdGhleSBkaWQgbm90IGNvbWUgZnJvbSBzeXN0ZW0gaGVhZGVyIGZpbGVzIChpLmUuIGZyb20gR05VX0NDX0lOQ0xVREU6IG9yCi1HTlVfR1hYX0lOQ0xVREU6KS4gIFRodXMsIHdpdGhvdXQgdGhlIHN3aXRjaCB0aGUgdXNlciBvbmx5IGRlYnVncyBoaXMvaGVyIG93bgotaW5saW5lIGZ1bmN0aW9ucywgYW5kIG5vdCB0aGUgc3lzdGVtIG9uZXMuIChUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSBkbwotYSBsb3Qgb2Ygc3RyZWFtIEkvTyBpbiBDKyspLiAgVGhpcyBwcm9iYWJseSB3aWxsIG5vdCBwcm92aWRlIGVub3VnaCBncmFudWxhcml0eQotZm9yIG1hbnkgdXNlcnMsIGJ1dCBmb3Igbm93IHRoaXMgaXMgc3RpbGwgc29tZXdoYXQgZXhwZXJpbWVudGFsLCBhbmQgSSB3b3VsZAotbGlrZSB0byByZWZsZWN0IHVwb24gaXQgYW5kIGdldCBzb21lIGZlZWRiYWNrIGJlZm9yZSBJIGdvIGFueSBmdXJ0aGVyLiAKLVBvc3NpYmxlIHNvbHV0aW9ucyBpbmNsdWRlIGFuIGludGVyYWN0aXZlIHByb21wdGluZywgYSBsb2dpY2FsIG5hbWUsIG9yIGEgbmV3Ci1jb21tYW5kIGxpbmUgb3B0aW9uIGluIGdjYy5jICh3aGljaCBpcyB0aGVuIHBhc3NlZCB0aHJvdWdoIHNvbWVob3cgdG8gdGhlIGd1dHMKLW9mIHRoZSBhc3NlbWJsZXIpLgotCVRoZSBpbmxpbmUgZnVuY3Rpb25zIGZyb20gaGVhZGVyIGZpbGVzIGFwcGVhciBhZnRlciB0aGUgc291cmNlIGNvZGUKLWZvciB0aGUgc291cmNlIGZpbGUuICBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgdGhlIHNvdXJjZSBmaWxlIGl0c2VsZiBpcwotbnVtYmVyZWQgd2l0aCB0aGUgc2FtZSBsaW5lIG51bWJlcnMgdGhhdCB5b3UgZ2V0IHdpdGggYW4gZWRpdG9yLiAgSW4gYWRkaXRpb24sCi10aGUgZW50aXJlIGhlYWRlciBmaWxlIGlzIG5vdCBpbmNsdWRlZCwgc2luY2UgdGhlIGFzc2VtYmxlciBtYWtlcyBhIGxpc3Qgb2YKLXRoZSBtaW4gYW5kIG1heCBzb3VyY2UgbGluZXMgdGhhdCBhcmUgdXNlZCwgYW5kIG9ubHkgaW5jbHVkZXMgdGhvc2UgbGluZXMgZnJvbQotdGhlIGZpcnN0IHRvIHRoZSBsYXN0IGFjdHVhbGx5IHVzZWQuIChJdCBpcyBlYXN5IHRvIGNoYW5nZSBpdCB0byBpbmNsdWRlIHRoZQotd2hvbGUgZmlsZSkuCi0KLQk4KSBXaGVuIHlvdSBhcmUgZGVidWdnaW5nIEMrKyBvYmplY3RzLCB0aGUgb2JqZWN0ICJ0aGlzIiBpcyByZWZlcmVkIHRvCi1hcyAiJHRoaXMiLiAgQWN0dWFsbHksIHRoZSBjb21waWxlciB3cml0ZXMgaXQgYXMgIi50aGlzIiwgYnV0IHRoZSBwZXJpb2QgaXMKLW5vdCBnb29kIGZvciB0aGUgZGVidWdnZXIsIHNvIEkgaGF2ZSBhIHJvdXRpbmUgdG8gY29udmVydCBpdCB0byBhICQuICAoSXQKLWFjdHVhbGx5IGNvbnZlcnRzIGFsbCBwZXJpb2RzIHRvICQsIGJ1dCBvbmx5IGZvciB2YXJpYWJsZXMsIHNpbmNlIHRoaXMgd2FzCi1pbnRlbmRlZCB0byBhbGxvdyB1cyB0byBhY2Nlc3MgInRoaXMiLgotCi0JOSkgSWYgeW91IHVzZSB0aGUgYXNtKCIuLi4iKSBrZXl3b3JkIGZvciBnbG9iYWwgc3ltYm9scywgeW91IHdpbGwgbm90Ci1iZSBhYmxlIHRvIHNlZSB0aGF0IHN5bWJvbCB3aXRoIHRoZSBkZWJ1Z2dlci4gIFRoZSByZWFzb24gaXMgdGhhdCB0aGVyZSBhcmUgdHdvCi1yZWNvcmRzIGZvciB0aGUgc3ltYm9sIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIG9mIHRoZSBhc3NlbWJsZXIuICBPbmUKLWNvbnRhaW5zIHRoZSBpbmZvIHN1Y2ggYXMgcHNlY3QgbnVtYmVyIGFuZCBvZmZzZXQsIGFuZCB0aGUgb3RoZXIgb25lIGNvbnRhaW5zCi10aGUgaW5mb3JtYXRpb24gaGF2aW5nIHRvIGRvIHdpdGggdGhlIGRhdGEgdHlwZSBvZiB0aGUgdmFyaWFibGUuICBJbiBvcmRlciB0bwotZGVidWcgYXMgc3ltYm9sLCB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGNvb3JlbGF0ZSB0aGVzZSByZWNvcmRzLCBhbmQgdGhlIG9ubHkKLXdheSB0byBkbyB0aGlzIGlzIGJ5IG5hbWUuICBUaGUgcmVjb3JkIHdpdGggdGhlIHN0b3JhZ2UgYXR0cmlidXRlcyB3aWxsIHRha2UKLXRoZSBuYW1lIHVzZWQgaW4gdGhlIGFzbSBkaXJlY3RpdmUsIGFuZCB0aGUgcmVjb3JkIHRoYXQgc3BlY2lmaWVzIHRoZSBkYXRhIHR5cGUKLWhhcyB0aGUgYWN0dWFsIHZhcmlhYmxlIG5hbWUsIGFuZCB0aHVzIHdoZW4geW91IHVzZSB0aGUgYXNtIGRpcmVjdGl2ZSB0byBjaGFuZ2UKLWEgdmFyaWFibGUgbmFtZSwgdGhlIHN5bWJvbCBiZWNvbWVzIGludmlzaWJsZS4KLQotCTEwKSBPbGRlciB2ZXJzaW9ucyBvZiB0aGUgY29tcGlsZXIgKCBHTlUtQyAxLjM3LjkyIGFuZCBlYXJsaWVyKSBwbGFjZQotZ2xvYmFsIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdC4gIFRoaXMgaXMgdW5mb3J0dW5hdGUsIHNpbmNlIHRvIHRoZSBsaW5rZXIKLXRoaXMgYXBwZWFycyB0byBiZSBhbiBlbnRyeSBwb2ludC4gIEkgc2VudCBhIHBhdGNoIHRvIHRoZSBjb21waWxlciB0byBSTVMsCi13aGljaCB3aWxsIGdlbmVyYXRlIGEgLmNvbnN0IHNlY3Rpb24gZm9yIHRoZXNlIHZhcmlhYmxlcywgYW5kIHBhdGNoZWQgdGhlCi1hc3NlbWJsZXIgdG8gcHV0IHRoZXNlIHZhcmlhYmxlcyBpbnRvIGEgcHNlY3QganVzdCBsaWtlIHRoYXQgZm9yIG5vcm1hbAotdmFyaWFibGVzLCBleGNlcHQgdGhhdCB0aGV5IGFyZSBtYXJrZWQgTk9XUlQuICBzdGF0aWMgY29uc3RhbnRzIGFyZSBzdGlsbAotcGxhY2VkIGluIHRoZSB0ZXh0IHBzZWN0LCBzaW5jZSB0aGVyZSBpcyBubyBuZWVkIGZvciBhbnkgZXh0ZXJuYWwgYWNjZXNzLgpkaWZmIC0tZ2l0IGEvZ2FzL2FjaW5jbHVkZS5tNCBiL2dhcy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYTJjMTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2FjaW5jbHVkZS5tNAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLWRubCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQobmFtZSwgdHlwZWRlZm5hbWUsIHR5cGVkZWYsIGhlYWRlcnMpCi1BQ19ERUZVTihHQVNfQ0hFQ0tfREVDTF9ORUVERUQsWwotQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yICQxKQotQUNfQ0FDSEVfVkFMKGdhc19jdl9kZWNsX25lZWRlZF8kMSwKLUFDX1RSWV9MSU5LKFskNF0sCi1bCi10eXBlZGVmICQzOwotJDIgeDsKLXggPSAoJDIpICQxOwotXSwgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKSlkbmwKLUFDX01TR19SRVNVTFQoJGdhc19jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi1kbmwKLWRubCBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAotZG5sIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi1kbmwgd29ya2luZyBwcm9wZXJseSEKLWRubCBHQVNfV09SS0lOR19BU1NFUlQKLUFDX0RFRlVOKEdBU19XT1JLSU5HX0FTU0VSVCwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3b3JraW5nIGFzc2VydCBtYWNyb10pCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2Fzc2VydF9vaywKLUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD5dLCBbCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotXSwgZ2FzX2N2X2Fzc2VydF9vaz15ZXMsIGdhc19jdl9hc3NlcnRfb2s9bm8pKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2Fzc2VydF9vaykKLXRlc3QgJGdhc19jdl9hc3NlcnRfb2sgPSB5ZXMgfHwgQUNfREVGSU5FKEJST0tFTl9BU1NFUlQsIDEsIFthc3NlcnQgYnJva2VuP10pCi1dKWRubAotZG5sCi1kbmwgU2luY2UgbWFueSBCb3VybmUgc2hlbGwgaW1wbGVtZW50YXRpb25zIGxhY2sgc3Vicm91dGluZXMsIHVzZSB0aGlzCi1kbmwgaGFjayB0byBzaW1wbGlmeSB0aGUgY29kZSBpbiBjb25maWd1cmUuaW4uCi1kbmwgR0FTX1VOSVEobGlzdHZhcikKLUFDX0RFRlVOKEdBU19VTklRLAotW19nYXNfdW5pcV9saXN0PSJbJF0kMSIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1kbmwgUHJvdGVjdCBhZ2FpbnN0IGVtcHR5IGlucHV0IGxpc3QuCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15IFskXV9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSBbJF1fZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiBbJF1fZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgWyRdX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IlskXV9nYXNfdW5pcV9uZXdsaXN0IFskXV9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLSQxPVskXV9nYXNfdW5pcV9uZXdsaXN0Ci1dKWRubApkaWZmIC0tZ2l0IGEvZ2FzL2FjbG9jYWwubTQgYi9nYXMvYWNsb2NhbC5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiZTQ2OC4uMDAwMDAwMAotLS0gYS9nYXMvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExNzUgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLWRubCBHQVNfQ0hFQ0tfREVDTF9ORUVERUQobmFtZSwgdHlwZWRlZm5hbWUsIHR5cGVkZWYsIGhlYWRlcnMpCi1BQ19ERUZVTihHQVNfQ0hFQ0tfREVDTF9ORUVERUQsWwotQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yICQxKQotQUNfQ0FDSEVfVkFMKGdhc19jdl9kZWNsX25lZWRlZF8kMSwKLUFDX1RSWV9MSU5LKFskNF0sCi1bCi10eXBlZGVmICQzOwotJDIgeDsKLXggPSAoJDIpICQxOwotXSwgZ2FzX2N2X2RlY2xfbmVlZGVkXyQxPW5vLCBnYXNfY3ZfZGVjbF9uZWVkZWRfJDE9eWVzKSlkbmwKLUFDX01TR19SRVNVTFQoJGdhc19jdl9kZWNsX25lZWRlZF8kMSkKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF8kMSA9IHllczsgdGhlbgotIEFDX0RFRklORShbTkVFRF9ERUNMQVJBVElPTl9ddHJhbnNsaXQoJDEsIFthLXpdLCBbQS1aXSksIDEsCi0JICAgW0RlZmluZSBpZiAkMSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy5dKQotZmkKLV0pZG5sCi1kbmwKLWRubCBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAotZG5sIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi1kbmwgd29ya2luZyBwcm9wZXJseSEKLWRubCBHQVNfV09SS0lOR19BU1NFUlQKLUFDX0RFRlVOKEdBU19XT1JLSU5HX0FTU0VSVCwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB3b3JraW5nIGFzc2VydCBtYWNyb10pCi1BQ19DQUNIRV9WQUwoZ2FzX2N2X2Fzc2VydF9vaywKLUFDX1RSWV9MSU5LKFsjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD5dLCBbCi0vKiBjaGVjayBmb3IgcmVxdW90aW5nIHByb2JsZW1zICovCi1zdGF0aWMgaW50IGEsIGIsIGMsIGQ7Ci1zdGF0aWMgY2hhciAqczsKLWFzc2VydCAoIXN0cmNtcChzLCAiZm9vIGJhciBiYXogcXV1eCIpKTsKLS8qIGNoZWNrIGZvciBuZXdsaW5lIGhhbmRsaW5nICovCi1hc3NlcnQgKGEgPT0gYgotICAgICAgICB8fCBjID09IGQpOwotXSwgZ2FzX2N2X2Fzc2VydF9vaz15ZXMsIGdhc19jdl9hc3NlcnRfb2s9bm8pKWRubAotQUNfTVNHX1JFU1VMVCgkZ2FzX2N2X2Fzc2VydF9vaykKLXRlc3QgJGdhc19jdl9hc3NlcnRfb2sgPSB5ZXMgfHwgQUNfREVGSU5FKEJST0tFTl9BU1NFUlQsIDEsIFthc3NlcnQgYnJva2VuP10pCi1dKWRubAotZG5sCi1kbmwgU2luY2UgbWFueSBCb3VybmUgc2hlbGwgaW1wbGVtZW50YXRpb25zIGxhY2sgc3Vicm91dGluZXMsIHVzZSB0aGlzCi1kbmwgaGFjayB0byBzaW1wbGlmeSB0aGUgY29kZSBpbiBjb25maWd1cmUuaW4uCi1kbmwgR0FTX1VOSVEobGlzdHZhcikKLUFDX0RFRlVOKEdBU19VTklRLAotW19nYXNfdW5pcV9saXN0PSJbJF0kMSIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1kbmwgUHJvdGVjdCBhZ2FpbnN0IGVtcHR5IGlucHV0IGxpc3QuCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15IFskXV9nYXNfdW5pcV9saXN0IDsgZG8KLSAgY2FzZSBbJF1fZ2FzX3VuaXFfaSBpbgotICBfZ2FzX3VuaXFfZHVtbXkpIDs7Ci0gICopIGNhc2UgIiBbJF1fZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgWyRdX2dhc191bmlxX2kgIiopIDs7Ci0gICAgICAgKikgX2dhc191bmlxX25ld2xpc3Q9IlskXV9nYXNfdW5pcV9uZXdsaXN0IFskXV9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLSQxPVskXV9nYXNfdW5pcV9uZXdsaXN0Ci1dKWRubAotCi0jIERvIGFsbCB0aGUgd29yayBmb3IgQXV0b21ha2UuICBUaGlzIG1hY3JvIGFjdHVhbGx5IGRvZXMgdG9vIG11Y2ggLS0KLSMgc29tZSBjaGVja3MgYXJlIG9ubHkgbmVlZGVkIGlmIHlvdXIgcGFja2FnZSBkb2VzIGNlcnRhaW4gdGhpbmdzLgotIyBCdXQgdGhpcyBpc24ndCByZWFsbHkgYSBiaWcgZGVhbC4KLQotIyBzZXJpYWwgMQotCi1kbmwgVXNhZ2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShwYWNrYWdlLHZlcnNpb24sIFtuby1kZWZpbmVdKQotCi1BQ19ERUZVTihBTV9JTklUX0FVVE9NQUtFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfSU5TVEFMTF0pCi1QQUNLQUdFPVskMV0KLUFDX1NVQlNUKFBBQ0tBR0UpCi1WRVJTSU9OPVskMl0KLUFDX1NVQlNUKFZFUlNJT04pCi1kbmwgdGVzdCB0byBzZWUgaWYgc3JjZGlyIGFscmVhZHkgY29uZmlndXJlZAotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICBBQ19NU0dfRVJST1IoW3NvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdF0pCi1maQotaWZlbHNlKFskM10sLAotQUNfREVGSU5FX1VOUVVPVEVEKFBBQ0tBR0UsICIkUEFDS0FHRSIsIFtOYW1lIG9mIHBhY2thZ2VdKQotQUNfREVGSU5FX1VOUVVPVEVEKFZFUlNJT04sICIkVkVSU0lPTiIsIFtWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlXSkpCi1BQ19SRVFVSVJFKFtBTV9TQU5JVFlfQ0hFQ0tdKQotQUNfUkVRVUlSRShbQUNfQVJHX1BST0dSQU1dKQotZG5sIEZJWE1FIFRoaXMgaXMgdHJ1bHkgZ3Jvc3MuCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotQU1fTUlTU0lOR19QUk9HKEFDTE9DQUwsIGFjbG9jYWwsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPQ09ORiwgYXV0b2NvbmYsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPTUFLRSwgYXV0b21ha2UsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhBVVRPSEVBREVSLCBhdXRvaGVhZGVyLCAkbWlzc2luZ19kaXIpCi1BTV9NSVNTSU5HX1BST0coTUFLRUlORk8sIG1ha2VpbmZvLCAkbWlzc2luZ19kaXIpCi1BQ19SRVFVSVJFKFtBQ19QUk9HX01BS0VfU0VUXSldKQotCi0jCi0jIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lLgotIwotCi1BQ19ERUZVTihBTV9TQU5JVFlfQ0hFQ0ssCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmVdKQotIyBKdXN0IGluIGNhc2UKLXNsZWVwIDEKLWVjaG8gdGltZXN0YW1wID4gY29uZnRlc3RmaWxlCi0jIERvIGBzZXQnIGluIGEgc3Vic2hlbGwgc28gd2UgZG9uJ3QgY2xvYmJlciB0aGUgY3VycmVudCBzaGVsbCdzCi0jIGFyZ3VtZW50cy4gIE11c3QgdHJ5IC1MIGZpcnN0IGluIGNhc2UgY29uZmlndXJlIGlzIGFjdHVhbGx5IGEKLSMgc3ltbGluazsgc29tZSBzeXN0ZW1zIHBsYXkgd2VpcmQgZ2FtZXMgd2l0aCB0aGUgbW9kIHRpbWUgb2Ygc3ltbGlua3MKLSMgKGVnIEZyZWVCU0QgcmV0dXJucyB0aGUgbW9kIHRpbWUgb2YgdGhlIHN5bWxpbmsncyBjb250YWluaW5nCi0jIGRpcmVjdG9yeSkuCi1pZiAoCi0gICBzZXQgWCBgbHMgLUx0ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZSAyPiAvZGV2L251bGxgCi0gICBpZiB0ZXN0ICJbJF0qIiA9ICJYIjsgdGhlbgotICAgICAgIyAtTCBkaWRuJ3Qgd29yay4KLSAgICAgIHNldCBYIGBscyAtdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGVgCi0gICBmaQotICAgaWYgdGVzdCAiWyRdKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICJbJF0qIiAhPSAiWCBjb25mdGVzdGZpbGUgJHNyY2Rpci9jb25maWd1cmUiOyB0aGVuCi0KLSAgICAgICMgSWYgbmVpdGhlciBtYXRjaGVkLCB0aGVuIHdlIGhhdmUgYSBicm9rZW4gbHMuICBUaGlzIGNhbiBoYXBwZW4KLSAgICAgICMgaWYsIGZvciBpbnN0YW5jZSwgQ09ORklHX1NIRUxMIGlzIGJhc2ggYW5kIGl0IGluaGVyaXRzIGEKLSAgICAgICMgYnJva2VuIGxzIGFsaWFzIGZyb20gdGhlIGVudmlyb25tZW50LiAgVGhpcyBoYXMgYWN0dWFsbHkKLSAgICAgICMgaGFwcGVuZWQuICBTdWNoIGEgc3lzdGVtIGNvdWxkIG5vdCBiZSBjb25zaWRlcmVkICJzYW5lIi4KLSAgICAgIEFDX01TR19FUlJPUihbbHMgLXQgYXBwZWFycyB0byBmYWlsLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG5vdCBhIGJyb2tlbgotYWxpYXMgaW4geW91ciBlbnZpcm9ubWVudF0pCi0gICBmaQotCi0gICB0ZXN0ICJbJF0yIiA9IGNvbmZ0ZXN0ZmlsZQotICAgKQotdGhlbgotICAgIyBPay4KLSAgIDoKLWVsc2UKLSAgIEFDX01TR19FUlJPUihbbmV3bHkgY3JlYXRlZCBmaWxlIGlzIG9sZGVyIHRoYW4gZGlzdHJpYnV0ZWQgZmlsZXMhCi1DaGVjayB5b3VyIHN5c3RlbSBjbG9ja10pCi1maQotcm0gLWYgY29uZnRlc3QqCi1BQ19NU0dfUkVTVUxUKHllcyldKQotCi1kbmwgQU1fTUlTU0lOR19QUk9HKE5BTUUsIFBST0dSQU0sIERJUkVDVE9SWSkKLWRubCBUaGUgcHJvZ3JhbSBtdXN0IHByb3Blcmx5IGltcGxlbWVudCAtLXZlcnNpb24uCi1BQ19ERUZVTihBTV9NSVNTSU5HX1BST0csCi1bQUNfTVNHX0NIRUNLSU5HKGZvciB3b3JraW5nICQyKQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKCQyIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgJDE9JDIKLSAgIEFDX01TR19SRVNVTFQoZm91bmQpCi1lbHNlCi0gICAkMT0iJDMvbWlzc2luZyAkMiIKLSAgIEFDX01TR19SRVNVTFQobWlzc2luZykKLWZpCi1BQ19TVUJTVCgkMSldKQotCi0KLSMgc2VyaWFsIDM1IEFDX1BST0dfTElCVE9PTAotQUNfREVGVU4oQUNfUFJPR19MSUJUT09MLAotW0FDX1JFUVVJUkUoW0FDX0xJQlRPT0xfU0VUVVBdKWRubAotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLUFDX0NBQ0hFX1NBVkUKLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCBBQ19NU0dfRVJST1IoW2xpYnRvb2wgY29uZmlndXJlIGZhaWxlZF0pCi0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLUFDX0NBQ0hFX0xPQUQKLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLUFDX1NVQlNUKExJQlRPT0wpZG5sCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLV0pCi0KLUFDX0RFRlVOKEFDX0xJQlRPT0xfU0VUVVAsCi1bQUNfUFJFUkVRKDIuMTMpZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfU0hBUkVEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TVEFUSUNdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfQlVJTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19SQU5MSUJdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xEXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0xOX1NdKWRubAotZG5sCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICdbI11saW5lIF9fb2xpbmVfXyAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIEFDX0NBQ0hFX0NIRUNLKFt3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmXSwgbHRfY3ZfY2NfbmVlZHNfYmVsZiwKLSAgICBbQUNfVFJZX0xJTksoW10sW10sW2x0X2N2X2NjX25lZWRzX2JlbGY9eWVzXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj1ub10pXSkKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gIEFDX1NZU19MSUJUT09MX0NZR1dJTgotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi1BQ19BUkdfRU5BQkxFKGxpYnRvb2wtbG9jaywKLVsgIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZ10sCi1uZWVkX2xvY2tzPSRlbmFibGV2YWwsCi1uZWVkX2xvY2tzPXllcykKLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi1dKQotCi0jIEFDX0xJQlRPT0xfRExPUEVOIC0gY2hlY2sgZm9yIGRsb3BlbiBzdXBwb3J0Ci1BQ19ERUZVTihBQ19MSUJUT09MX0RMT1BFTiwgW2x0X2Rsb3Blbj15ZXNdKQotCi0jIEFDX0VOQUJMRV9TSEFSRUQgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXNoYXJlZCBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU0hBUkVEWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TSEFSRUQsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc2hhcmVkLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU0hBUkVEX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc2hhcmVkPUFDX0VOQUJMRV9TSEFSRURfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TSEFSRUQgLSBzZXQgdGhlIGRlZmF1bHQgc2hhcmVkIGZsYWcgdG8gLS1kaXNhYmxlLXNoYXJlZAotQUNfREVGVU4oQUNfRElTQUJMRV9TSEFSRUQsCi1bQUNfRU5BQkxFX1NIQVJFRChubyldKQotCi0jIEFDX0VOQUJMRV9TVEFUSUMgLSBpbXBsZW1lbnQgdGhlIC0tZW5hYmxlLXN0YXRpYyBmbGFnCi0jIFVzYWdlOiBBQ19FTkFCTEVfU1RBVElDWyhERUZBVUxUKV0KLSMgICBXaGVyZSBERUZBVUxUIGlzIGVpdGhlciBgeWVzJyBvciBgbm8nLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8KLSMgICBgeWVzJy4KLUFDX0RFRlVOKEFDX0VOQUJMRV9TVEFUSUMsCi1bZGVmaW5lKFtBQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLCBpZmVsc2UoJDEsIG5vLCBubywgeWVzKSlkbmwKLUFDX0FSR19FTkFCTEUoc3RhdGljLAotY2hhbmdlcXVvdGUoPDwsID4+KWRubAotPDwgIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfU1RBVElDX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfc3RhdGljPUFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRElTQUJMRV9TVEFUSUMgLSBzZXQgdGhlIGRlZmF1bHQgc3RhdGljIGZsYWcgdG8gLS1kaXNhYmxlLXN0YXRpYwotQUNfREVGVU4oQUNfRElTQUJMRV9TVEFUSUMsCi1bQUNfRU5BQkxFX1NUQVRJQyhubyldKQotCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtZmFzdC1pbnN0YWxsIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9GQVNUX0lOU1RBTExbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShmYXN0LWluc3RhbGwsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PT4+QUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwKLWNoYW5nZXF1b3RlKFssIF0pZG5sCi1bcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWNdLAotZW5hYmxlX2Zhc3RfaW5zdGFsbD1BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFQpZG5sCi1dKQotCi0jIEFDX0VOQUJMRV9GQVNUX0lOU1RBTEwgLSBzZXQgdGhlIGRlZmF1bHQgdG8gLS1kaXNhYmxlLWZhc3QtaW5zdGFsbAotQUNfREVGVU4oQUNfRElTQUJMRV9GQVNUX0lOU1RBTEwsCi1bQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTChubyldKQotCi0KLSMgQUNfUFJPR19MRCAtIGZpbmQgdGhlIHBhdGggdG8gdGhlIEdOVSBvciBub24tR05VIGxpbmtlcgotQUNfREVGVU4oQUNfUFJPR19MRCwKLVtBQ19BUkdfV0lUSChnbnUtbGQsCi1bICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dXSwKLXRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcywgd2l0aF9nbnVfbGQ9bm8pCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBsZCB1c2VkIGJ5IEdDQ10pCi0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi1jaGFuZ2VxdW90ZSgsKWRubAotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotY2hhbmdlcXVvdGUoWyxdKWRubAotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIEdOVSBsZF0pCi1lbHNlCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIG5vbi1HTlUgbGRdKQotZmkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX0xELAotW2lmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maV0pCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIEFDX01TR19SRVNVTFQoJExEKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLXRlc3QgLXogIiRMRCIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSF0pCi1BQ19TVUJTVChMRCkKLUFDX1BST0dfTERfR05VCi1dKQotCi1BQ19ERUZVTihBQ19QUk9HX0xEX0dOVSwKLVtBQ19DQUNIRV9DSEVDSyhbaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGRdLCBhY19jdl9wcm9nX2dudV9sZCwKLVsjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpXSkKLV0pCi0KLSMgQUNfUFJPR19OTSAtIGZpbmQgdGhlIHBhdGggdG8gYSBCU0QtY29tcGF0aWJsZSBuYW1lIGxpc3RlcgotQUNfREVGVU4oQUNfUFJPR19OTSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBCU0QtY29tcGF0aWJsZSBubV0pCi1BQ19DQUNIRV9WQUwoYWNfY3ZfcGF0aF9OTSwKLVtpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpXSkKLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLUFDX01TR19SRVNVTFQoWyROTV0pCi1BQ19TVUJTVChOTSkKLV0pCi0KLSMgQUNfU1lTX05NX1BBUlNFIC0gQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkCi0jIGJ5IEMgc3ltYm9sIG5hbWUgZnJvbSBubS4KLUFDX0RFRlVOKEFDX1NZU19OTV9QQVJTRSwKLVtBQ19SRVFVSVJFKFtBQ19DQU5PTklDQUxfSE9TVF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1BQ19NU0dfQ0hFQ0tJTkcoW2NvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dF0pCi1BQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSwKLVsjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLWNoYW5nZXF1b3RlKCwpZG5sCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotY2hhbmdlcXVvdGUoWyxdKWRubAotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLipbIAldXCgkYWNfc3ltY29kZVwpWyAJXVsgCV0qXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIEFDX1RSWV9FVkFMKGFjX2NvbXBpbGUpOyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWNoYW5nZXF1b3RlKCwpZG5sCi1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLWNoYW5nZXF1b3RlKFssXSlkbmwKLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIEFDX1RSWV9FVkFMKGFjX2xpbmspICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0JICAgIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiZBQ19GRF9DQwotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi1dKQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLUFDX01TR19SRVNVTFQoJGFjX3Jlc3VsdCkKLV0pCi0KLSMgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOIC0gZmluZCB0b29scyBuZWVkZWQgb24gY3lnd2luCi1BQ19ERUZVTihBQ19TWVNfTElCVE9PTF9DWUdXSU4sCi1bQUNfQ0hFQ0tfVE9PTChETExUT09MLCBkbGx0b29sLCBmYWxzZSkKLUFDX0NIRUNLX1RPT0woQVMsIGFzLCBmYWxzZSkKLV0pCi0KLSMgQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFIC0gZG9lcyB0aGUgY29tcGlsZXIgcHJlZml4IGdsb2JhbCBzeW1ib2xzCi0jICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggYW4gdW5kZXJzY29yZT8KLUFDX0RFRlVOKEFDX1NZU19TWU1CT0xfVU5ERVJTQ09SRSwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX05NXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1NZU19OTV9QQVJTRV0pZG5sCi1BQ19NU0dfQ0hFQ0tJTkcoW2ZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUsCi1bYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIEFDX1RSWV9FVkFMKE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mQUNfRkRfQ0MKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JkFDX0ZEX0NDCi0gIGNhdCBjb25mdGVzdC5jID4mQUNfRkRfQ0MKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi1dKQotQUNfTVNHX1JFU1VMVCgkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlKQotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotQUNfU1VCU1QoVVNFX1NZTUJPTF9VTkRFUlNDT1JFKWRubAotXSkKLQotIyBBQ19DSEVDS19MSUJNIC0gY2hlY2sgZm9yIG1hdGggbGlicmFyeQotQUNfREVGVU4oQUNfQ0hFQ0tfTElCTSwgWwotQUNfQ0hFQ0tfTElCKG13LCBfbXd2YWxpZGNoZWNrbCkKLUFDX0NIRUNLX0xJQihtLCBjb3MpCi1dKQotCi0jIEFDX0xJQkxURExfQ09OVkVOSUVOQ0VbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBhZGRzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLUFDX0RFRlVOKEFDX0xJQkxURExfQ09OVkVOSUVOQ0UsIFsKLSAgY2FzZSAiJGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlIiBpbgotICBubykgQUNfTVNHX0VSUk9SKFt0aGlzIHBhY2thZ2UgbmVlZHMgYSBjb252ZW5pZW5jZSBsaWJsdGRsXSkgOzsKLSAgIiIpIGVuYWJsZV9sdGRsX2NvbnZlbmllbmNlPXllcwotICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWNvbnZlbmllbmNlIiA7OwotICBlc2FjCi0gIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsYy5sYQotXSkKLQotIyBBQ19MSUJMVERMX0lOU1RBTExBQkxFWyhkaXIpXSAtIHNldHMgTElCTFRETCB0byB0aGUgbGluayBmbGFncyBmb3IKLSMgdGhlIGxpYmx0ZGwgaW5zdGFsbGFibGUgbGlicmFyeSwgYW5kIGFkZHMgLS1lbmFibGUtbHRkbC1pbnN0YWxsIHRvCi0jIHRoZSBjb25maWd1cmUgYXJndW1lbnRzLiAgTm90ZSB0aGF0IExJQkxUREwgaXMgbm90IEFDX1NVQlNUZWQsIG5vcgotIyBpcyBBQ19DT05GSUdfU1VCRElSUyBjYWxsZWQuICBJZiBESVIgaXMgbm90IHByb3ZpZGVkLCBpdCBpcyBhc3N1bWVkCi0jIHRvIGJlIGAke3RvcF9idWlsZGRpcn0vbGlibHRkbCcuICBNYWtlIHN1cmUgeW91IHN0YXJ0IERJUiB3aXRoCi0jICcke3RvcF9idWlsZGRpcn0vJyAobm90ZSB0aGUgc2luZ2xlIHF1b3RlcyEpIGlmIHlvdXIgcGFja2FnZSBpcyBub3QKLSMgZmxhdCwgYW5kLCBpZiB5b3UncmUgbm90IHVzaW5nIGF1dG9tYWtlLCBkZWZpbmUgdG9wX2J1aWxkZGlyIGFzCi0jIGFwcHJvcHJpYXRlIGluIHRoZSBNYWtlZmlsZXMuCi0jIEluIHRoZSBmdXR1cmUsIHRoaXMgbWFjcm8gbWF5IGhhdmUgdG8gYmUgY2FsbGVkIGFmdGVyIEFDX1BST0dfTElCVE9PTC4KLUFDX0RFRlVOKEFDX0xJQkxURExfSU5TVEFMTEFCTEUsIFsKLSAgQUNfQ0hFQ0tfTElCKGx0ZGwsIG1haW4sIExJQkxUREw9Ii1sbHRkbCIsIFsKLSAgICBjYXNlICIkZW5hYmxlX2x0ZGxfaW5zdGFsbCIgaW4KLSAgICBubykgQUNfTVNHX1dBUk4oW2xpYmx0ZGwgbm90IGluc3RhbGxlZCwgYnV0IGluc3RhbGxhdGlvbiBkaXNhYmxlZF0pIDs7Ci0gICAgIiIpIGVuYWJsZV9sdGRsX2luc3RhbGw9eWVzCi0gICAgICAgIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgLS1lbmFibGUtbHRkbC1pbnN0YWxsIiA7OwotICAgIGVzYWMKLSAgXSkKLSAgaWYgdGVzdCB4IiRlbmFibGVfbHRkbF9pbnN0YWxsIiAhPSB4Im5vIjsgdGhlbgotICAgIExJQkxUREw9aWZlbHNlKCQjLDEsJDEsWycke3RvcF9idWlsZGRpcn0vbGlibHRkbCddKS9saWJsdGRsLmxhCi0gIGZpCi1dKQotCi1kbmwgb2xkIG5hbWVzCi1BQ19ERUZVTihBTV9QUk9HX0xJQlRPT0wsIFtpbmRpcihbQUNfUFJPR19MSUJUT09MXSldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19FTkFCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0VOQUJMRV9TVEFUSUMsIFtpbmRpcihbQUNfRU5BQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NIQVJFRCwgW2luZGlyKFtBQ19ESVNBQkxFX1NIQVJFRF0sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9ESVNBQkxFX1NUQVRJQywgW2luZGlyKFtBQ19ESVNBQkxFX1NUQVRJQ10sICRAKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX0xELCBbaW5kaXIoW0FDX1BST0dfTERdKV0pZG5sCi1BQ19ERUZVTihBTV9QUk9HX05NLCBbaW5kaXIoW0FDX1BST0dfTk1dKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfTk1fUEFSU0UsIFtpbmRpcihbQUNfU1lTX05NX1BBUlNFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX1NZTUJPTF9VTkRFUlNDT1JFLCBbaW5kaXIoW0FDX1NZU19TWU1CT0xfVU5ERVJTQ09SRV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19MSUJUT09MX0NZR1dJTiwgW2luZGlyKFtBQ19TWVNfTElCVE9PTF9DWUdXSU5dKV0pZG5sCi0KLSMgTGlrZSBBQ19DT05GSUdfSEVBREVSLCBidXQgYXV0b21hdGljYWxseSBjcmVhdGUgc3RhbXAgZmlsZS4KLQotQUNfREVGVU4oQU1fQ09ORklHX0hFQURFUiwKLVtBQ19QUkVSRVEoWzIuMTJdKQotQUNfQ09ORklHX0hFQURFUihbJDFdKQotZG5sIFdoZW4gY29uZmlnLnN0YXR1cyBnZW5lcmF0ZXMgYSBoZWFkZXIsIHdlIG11c3QgdXBkYXRlIHRoZSBzdGFtcC1oIGZpbGUuCi1kbmwgVGhpcyBmaWxlIHJlc2lkZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBjb25maWcgaGVhZGVyCi1kbmwgdGhhdCBpcyBnZW5lcmF0ZWQuICBXZSBtdXN0IHN0cmlwIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgZmlyc3QgIjoiLAotZG5sIGFuZCBldmVyeXRoaW5nIHBhc3QgdGhlIGxhc3QgIi8iLgotQUNfT1VUUFVUX0NPTU1BTkRTKGNoYW5nZXF1b3RlKDw8LD4+KWRubAotaWZlbHNlKHBhdHN1YnN0KDw8JDE+PiwgPDxbXiBdPj4sIDw8Pj4pLCA8PD4+LAotPDx0ZXN0IC16ICI8PCQ+PkNPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHBhdHN1YnN0KDw8JDE+PiwgPDxeXChbXjpdKi9cKT8uKj4+LCA8PFwxPj4pc3RhbXAtaDw8Pj5kbmw+PiwKLTw8YW1faW5keD0xCi1mb3IgYW1fZmlsZSBpbiA8PCQxPj47IGRvCi0gIGNhc2UgIiA8PCQ+PkNPTkZJR19IRUFERVJTICIgaW4KLSAgKiIgPDwkPj5hbV9maWxlICIqPDwpPj4KLSAgICBlY2hvIHRpbWVzdGFtcCA+IGBlY2hvIDw8JD4+YW1fZmlsZSB8IHNlZCAtZSAncyU6LiolJScgLWUgJ3MlW14vXSokJSUnYHN0YW1wLWgkYW1faW5keAotICAgIDs7Ci0gIGVzYWMKLSAgYW1faW5keD1gZXhwciAiPDwkPj5hbV9pbmR4IiArIDFgCi1kb25lPDw+PmRubD4+KQotY2hhbmdlcXVvdGUoWyxdKSldKQotCi0KLWRubCBBTV9QUk9HX0xFWAotZG5sIExvb2sgZm9yIGZsZXgsIGxleCBvciBtaXNzaW5nLCB0aGVuIHJ1biBBQ19QUk9HX0xFWCBhbmQgQUNfREVDTF9ZWVRFWFQKLUFDX0RFRlVOKEFNX1BST0dfTEVYLAotW21pc3NpbmdfZGlyPWlmZWxzZShbJDFdLCxgY2QgJGFjX2F1eF9kaXIgJiYgcHdkYCwkMSkKLUFDX0NIRUNLX1BST0dTKExFWCwgZmxleCBsZXgsICIkbWlzc2luZ19kaXIvbWlzc2luZyBmbGV4IikKLUFDX1BST0dfTEVYCi1BQ19ERUNMX1lZVEVYVF0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvZ2FzL2FwcC5jIGIvZ2FzL2FwcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTFjMGYwLi4wMDAwMDAwCi0tLSBhL2dhcy9hcHAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTcgKzAsMCBAQAotLyogVGhpcyBpcyB0aGUgQXNzZW1ibGVyIFByZS1Qcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIE1vZGlmaWVkIGJ5IEFsbGVuIFdpcmZzLUJyb2NrLCBJbnN0YW50aWF0aW9ucyBJbmMgMi85MCAqLwotLyogQXBwLCB0aGUgYXNzZW1ibGVyIHByZS1wcm9jZXNzb3IuICBUaGlzIHByZS1wcm9jZXNzb3Igc3RyaXBzIG91dCBleGNlc3MKLSAgIHNwYWNlcywgdHVybnMgc2luZ2xlLXF1b3RlZCBjaGFyYWN0ZXJzIGludG8gYSBkZWNpbWFsIGNvbnN0YW50LCBhbmQgdHVybnMKLSAgICMgPG51bWJlcj4gPGZpbGVuYW1lPiA8Z2FyYmFnZT4gaW50byBhIC5saW5lIDxudW1iZXI+XG4uZmlsZSA8ZmlsZW5hbWU+Ci0gICBwYWlyLiAgVGhpcyBuZWVkcyBiZXR0ZXIgZXJyb3ItaGFuZGxpbmcuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgkJCS8qIEZvciBCQURfQ0FTRSgpIG9ubHkgKi8KLQotI2lmIChfX1NURENfXyAhPSAxKQotI2lmbmRlZiBjb25zdAotI2RlZmluZSBjb25zdCAgLyogZW1wdHkgKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIFdoZXRoZXIgd2UgYXJlIHNjcnViYmluZyBpbiBtNjhrIE1SSSBtb2RlLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbQotICAgZmxhZ19tNjhrX21yaSwgYmVjYXVzZSB0aGUgdHdvIGZsYWdzIHdpbGwgYmUgYWZmZWN0ZWQgYnkgdGhlIC5tcmkKLSAgIHBzZXVkby1vcCBhdCBkaWZmZXJlbnQgdGltZXMuICAqLwotc3RhdGljIGludCBzY3J1Yl9tNjhrX21yaTsKLQotLyogVGhlIHBzZXVkby1vcCB3aGljaCBzd2l0Y2hlcyBpbiBhbmQgb3V0IG9mIE1SSSBtb2RlLiAgU2VlIHRoZQotICAgY29tbWVudCBpbiBkb19zY3J1Yl9jaGFycy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBtcmlfcHNldWRvW10gPSAiLm1yaSAwIjsKLQotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotLyogVGhlIHBzZXVkby1vcCBmb3Igd2hpY2ggd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgYEAnIGNoYXJhY3RlcnMuIAotICAgU2VlIHRoZSBjb21tZW50IGluIGRvX3NjcnViX2NoYXJzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICAgc3ltdmVyX3BzZXVkb1tdID0gIi5zeW12ZXIiOwotc3RhdGljIGNvbnN0IGNoYXIgKiBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgbGV4WzI1Nl07Ci1zdGF0aWMgY29uc3QgY2hhciBzeW1ib2xfY2hhcnNbXSA9Ci0iJC5fQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiOwotCi0jZGVmaW5lIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UCQkxCi0jZGVmaW5lIExFWF9JU19XSElURVNQQUNFCQkyCi0jZGVmaW5lIExFWF9JU19MSU5FX1NFUEFSQVRPUgkJMwotI2RlZmluZSBMRVhfSVNfQ09NTUVOVF9TVEFSVAkJNAotI2RlZmluZSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUCTUKLSNkZWZpbmUJTEVYX0lTX1RXT0NIQVJfQ09NTUVOVF8xU1QJNgotI2RlZmluZQlMRVhfSVNfU1RSSU5HUVVPVEUJCTgKLSNkZWZpbmUJTEVYX0lTX0NPTE9OCQkJOQotI2RlZmluZQlMRVhfSVNfTkVXTElORQkJCTEwCi0jZGVmaW5lCUxFWF9JU19PTkVDSEFSX1FVT1RFCQkxMQotI2lmZGVmIFRDX1Y4NTAKLSNkZWZpbmUgTEVYX0lTX0RPVUJMRURBU0hfMVNUCQkxMgotI2VuZGlmCi0jaWZkZWYgVENfTTMyUgotI2RlZmluZSBMRVhfSVNfRE9VQkxFQkFSXzFTVAkJMTMKLSNlbmRpZgotI2RlZmluZSBJU19TWU1CT0xfQ09NUE9ORU5UKGMpCQkobGV4W2NdID09IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UKQotI2RlZmluZSBJU19XSElURVNQQUNFKGMpCQkobGV4W2NdID09IExFWF9JU19XSElURVNQQUNFKQotI2RlZmluZSBJU19MSU5FX1NFUEFSQVRPUihjKQkJKGxleFtjXSA9PSBMRVhfSVNfTElORV9TRVBBUkFUT1IpCi0jZGVmaW5lIElTX0NPTU1FTlQoYykJCQkobGV4W2NdID09IExFWF9JU19DT01NRU5UX1NUQVJUKQotI2RlZmluZSBJU19MSU5FX0NPTU1FTlQoYykJCShsZXhbY10gPT0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVCkKLSNkZWZpbmUJSVNfTkVXTElORShjKQkJCShsZXhbY10gPT0gTEVYX0lTX05FV0xJTkUpCi0KLXN0YXRpYyBpbnQgcHJvY2Vzc19lc2NhcGUgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEZJWE1FLXNvb246IFRoZSBlbnRpcmUgbGV4ZXIvcGFyc2VyIHRoaW5neSBzaG91bGQgYmUKLSAgIGJ1aWx0IHN0YXRpY2FsbHkgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGR5bmFtaWNhbGx5Ci0gICBlYWNoIGFuZCBldmVyeSB0aW1lIHRoZSBhc3NlbWJsZXIgaXMgcnVuLiAgeG94b3JpY2guICovCi0KLXZvaWQgCi1kb19zY3J1Yl9iZWdpbiAobTY4a19tcmkpCi0gICAgIGludCBtNjhrX21yaTsKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgaW50IGM7Ci0KLSAgc2NydWJfbTY4a19tcmkgPSBtNjhrX21yaTsKLQotICBsZXhbJyAnXSA9IExFWF9JU19XSElURVNQQUNFOwotICBsZXhbJ1x0J10gPSBMRVhfSVNfV0hJVEVTUEFDRTsKLSAgbGV4WydcciddID0gTEVYX0lTX1dISVRFU1BBQ0U7Ci0gIGxleFsnXG4nXSA9IExFWF9JU19ORVdMSU5FOwotICBsZXhbJzsnXSA9IExFWF9JU19MSU5FX1NFUEFSQVRPUjsKLSAgbGV4Wyc6J10gPSBMRVhfSVNfQ09MT047Ci0KLSAgaWYgKCEgbTY4a19tcmkpCi0gICAgewotICAgICAgbGV4WyciJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0KLSNpZm5kZWYgVENfSFBQQQotICAgICAgbGV4WydcJyddID0gTEVYX0lTX09ORUNIQVJfUVVPVEU7Ci0jZW5kaWYKLQotI2lmZGVmIFNJTkdMRV9RVU9URV9TVFJJTkdTCi0gICAgICBsZXhbJ1wnJ10gPSBMRVhfSVNfU1RSSU5HUVVPVEU7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogTm90ZTogaWYgYW55IG90aGVyIGNoYXJhY3RlciBjYW4gYmUgTEVYX0lTX1NUUklOR1FVT1RFLCB0aGUgbG9vcAotICAgICBpbiBzdGF0ZSA1IG9mIGRvX3NjcnViX2NoYXJzIG11c3QgYmUgY2hhbmdlZC4gICovCi0KLSAgLyogTm90ZSB0aGF0IHRoZXNlIG92ZXJyaWRlIHRoZSBwcmV2aW91cyBkZWZhdWx0cywgZS5nLiBpZiAnOycgaXMgYQotICAgICBjb21tZW50IGNoYXIsIHRoZW4gaXQgaXNuJ3QgYSBsaW5lIHNlcGFyYXRvci4gICovCi0gIGZvciAocCA9IHN5bWJvbF9jaGFyczsgKnA7ICsrcCkKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotICAgIH0JCQkJLyogZGVjbGFyZSBzeW1ib2wgY2hhcmFjdGVycyAqLwotCi0gIGZvciAoYyA9IDEyODsgYyA8IDI1NjsgKytjKQotICAgIGxleFtjXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotCi0jaWZkZWYgdGNfc3ltYm9sX2NoYXJzCi0gIC8qIFRoaXMgbWFjcm8gcGVybWl0cyB0aGUgcHJvY2Vzc29yIHRvIHNwZWNpZnkgYWxsIGNoYXJhY3RlcnMgd2hpY2gKLSAgICAgbWF5IGFwcGVhcnMgaW4gYW4gb3BlcmFuZC4gIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzY3J1YmJlciBmcm9tCi0gICAgIGRpc2NhcmRpbmcgbWVhbmluZ2Z1bCB3aGl0ZXNwYWNlIGluIGNlcnRhaW4gY2FzZXMuICBUaGUgaTM4NgotICAgICBiYWNrZW5kIHVzZXMgdGhpcyB0byBzdXBwb3J0IHByZWZpeGVzLCB3aGljaCBjYW4gY29uZnVzZSB0aGUKLSAgICAgc2NydWJiZXIgYXMgdG8gd2hldGhlciBpdCBpcyBwYXJzaW5nIG9wZXJhbmRzIG9yIG9wY29kZXMuICAqLwotICBmb3IgKHAgPSB0Y19zeW1ib2xfY2hhcnM7ICpwOyArK3ApCi0gICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVDsKLSNlbmRpZgotCi0gIC8qIFRoZSBtNjhrIGJhY2tlbmQgd2FudHMgdG8gYmUgYWJsZSB0byBjaGFuZ2UgY29tbWVudF9jaGFycy4gICovCi0jaWZuZGVmIHRjX2NvbW1lbnRfY2hhcnMKLSNkZWZpbmUgdGNfY29tbWVudF9jaGFycyBjb21tZW50X2NoYXJzCi0jZW5kaWYKLSAgZm9yIChwID0gdGNfY29tbWVudF9jaGFyczsgKnA7IHArKykKLSAgICB7Ci0gICAgICBsZXhbKHVuc2lnbmVkIGNoYXIpICpwXSA9IExFWF9JU19DT01NRU5UX1NUQVJUOwotICAgIH0JCQkJLyogZGVjbGFyZSBjb21tZW50IGNoYXJzICovCi0KLSAgZm9yIChwID0gbGluZV9jb21tZW50X2NoYXJzOyAqcDsgcCsrKQotICAgIHsKLSAgICAgIGxleFsodW5zaWduZWQgY2hhcikgKnBdID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICB9CQkJCS8qIGRlY2xhcmUgbGluZSBjb21tZW50IGNoYXJzICovCi0KLSAgZm9yIChwID0gbGluZV9zZXBhcmF0b3JfY2hhcnM7ICpwOyBwKyspCi0gICAgewotICAgICAgbGV4Wyh1bnNpZ25lZCBjaGFyKSAqcF0gPSBMRVhfSVNfTElORV9TRVBBUkFUT1I7Ci0gICAgfQkJCQkvKiBkZWNsYXJlIGxpbmUgc2VwYXJhdG9ycyAqLwotCi0gIC8qIE9ubHkgYWxsb3cgc2xhc2gtc3RhciBjb21tZW50cyBpZiBzbGFzaCBpcyBub3QgaW4gdXNlLgotICAgICBGSVhNRTogVGhpcyBpc24ndCByaWdodC4gIFdlIHNob3VsZCBhbHdheXMgcGVybWl0IHRoZW0uICAqLwotICBpZiAobGV4WycvJ10gPT0gMCkKLSAgICB7Ci0gICAgICBsZXhbJy8nXSA9IExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOwotICAgIH0KLQotICBpZiAobTY4a19tcmkpCi0gICAgewotICAgICAgbGV4WydcJyddID0gTEVYX0lTX1NUUklOR1FVT1RFOwotICAgICAgbGV4Wyc7J10gPSBMRVhfSVNfQ09NTUVOVF9TVEFSVDsKLSAgICAgIGxleFsnKiddID0gTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVDsKLSAgICAgIC8qIFRoZSBNUkkgZG9jdW1lbnRhdGlvbiBzYXlzICchJyBpcyBMRVhfSVNfQ09NTUVOVF9TVEFSVCwgYnV0Ci0gICAgICAgICB0aGVuIGl0IGNhbid0IGJlIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4gICovCi0gICAgICBsZXhbJyEnXSA9IExFWF9JU19MSU5FX0NPTU1FTlRfU1RBUlQ7Ci0gICAgfQotCi0jaWZkZWYgVENfVjg1MAotICBsZXhbJy0nXSA9IExFWF9JU19ET1VCTEVEQVNIXzFTVDsKLSNlbmRpZgotI2lmZGVmIFRDX00zMlIKLSAgbGV4Wyd8J10gPSBMRVhfSVNfRE9VQkxFQkFSXzFTVDsKLSNlbmRpZgotI2lmZGVmIFRDX0QzMFYKLSAgLyogbXVzdCBkbyB0aGlzIGlzIHdlIHdhbnQgVkxJVyBpbnN0cnVjdGlvbiB3aXRoICItPiIgb3IgIjwtIiAqLwotICBsZXhbJy0nXSA9IExFWF9JU19TWU1CT0xfQ09NUE9ORU5UOwotI2VuZGlmCi19CQkJCS8qIGRvX3NjcnViX2JlZ2luKCkgKi8KLQotLyogU2F2ZWQgc3RhdGUgb2YgdGhlIHNjcnViYmVyICovCi1zdGF0aWMgaW50IHN0YXRlOwotc3RhdGljIGludCBvbGRfc3RhdGU7Ci1zdGF0aWMgY2hhciAqb3V0X3N0cmluZzsKLXN0YXRpYyBjaGFyIG91dF9idWZbMjBdOwotc3RhdGljIGludCBhZGRfbmV3bGluZXM7Ci1zdGF0aWMgY2hhciAqc2F2ZWRfaW5wdXQ7Ci1zdGF0aWMgaW50IHNhdmVkX2lucHV0X2xlbjsKLXN0YXRpYyBjaGFyIGlucHV0X2J1ZmZlclszMiAqIDEwMjRdOwotc3RhdGljIGNvbnN0IGNoYXIgKm1yaV9zdGF0ZTsKLXN0YXRpYyBjaGFyIG1yaV9sYXN0X2NoOwotCi0vKiBEYXRhIHN0cnVjdHVyZSBmb3Igc2F2aW5nIHRoZSBzdGF0ZSBvZiBhcHAgYWNyb3NzICNpbmNsdWRlJ3MuICBOb3RlIHRoYXQKLSAgIGFwcCBpcyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgdG8gdGhlIHBhcnNpbmcgb2YgdGhlIC5pbmNsdWRlJ3MsIHNvIG91cgotICAgc3RhdGUgYXQgdGhlIHRpbWUgLmluY2x1ZGUgaXMgaW50ZXJwcmV0ZWQgaXMgY29tcGxldGVseSB1bnJlbGF0ZWQuCi0gICBUaGF0J3Mgd2h5IHdlIGhhdmUgdG8gc2F2ZSBpdCBhbGwuICAqLwotCi1zdHJ1Y3QgYXBwX3NhdmUKLSAgewotICAgIGludCAgICAgICAgICBzdGF0ZTsKLSAgICBpbnQgICAgICAgICAgb2xkX3N0YXRlOwotICAgIGNoYXIgKiAgICAgICBvdXRfc3RyaW5nOwotICAgIGNoYXIgICAgICAgICBvdXRfYnVmW3NpemVvZiAob3V0X2J1ZildOwotICAgIGludCAgICAgICAgICBhZGRfbmV3bGluZXM7Ci0gICAgY2hhciAqICAgICAgIHNhdmVkX2lucHV0OwotICAgIGludCAgICAgICAgICBzYXZlZF9pbnB1dF9sZW47Ci0gICAgaW50ICAgICAgICAgIHNjcnViX202OGtfbXJpOwotICAgIGNvbnN0IGNoYXIgKiBtcmlfc3RhdGU7Ci0gICAgY2hhciAgICAgICAgIG1yaV9sYXN0X2NoOwotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICAgIGNvbnN0IGNoYXIgKiBzeW12ZXJfc3RhdGU7Ci0jZW5kaWYKLSAgfTsKLQotY2hhciAqCi1hcHBfcHVzaCAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgYXBwX3NhdmUgKnNhdmVkOwotCi0gIHNhdmVkID0gKHN0cnVjdCBhcHBfc2F2ZSAqKSB4bWFsbG9jIChzaXplb2YgKCpzYXZlZCkpOwotICBzYXZlZC0+c3RhdGUgPSBzdGF0ZTsKLSAgc2F2ZWQtPm9sZF9zdGF0ZSA9IG9sZF9zdGF0ZTsKLSAgc2F2ZWQtPm91dF9zdHJpbmcgPSBvdXRfc3RyaW5nOwotICBtZW1jcHkgKHNhdmVkLT5vdXRfYnVmLCBvdXRfYnVmLCBzaXplb2YgKG91dF9idWYpKTsKLSAgc2F2ZWQtPmFkZF9uZXdsaW5lcyA9IGFkZF9uZXdsaW5lczsKLSAgaWYgKHNhdmVkX2lucHV0ID09IE5VTEwpCi0gICAgc2F2ZWQtPnNhdmVkX2lucHV0ID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNhdmVkLT5zYXZlZF9pbnB1dCA9IHhtYWxsb2MgKHNhdmVkX2lucHV0X2xlbik7Ci0gICAgICBtZW1jcHkgKHNhdmVkLT5zYXZlZF9pbnB1dCwgc2F2ZWRfaW5wdXQsIHNhdmVkX2lucHV0X2xlbik7Ci0gICAgICBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuID0gc2F2ZWRfaW5wdXRfbGVuOwotICAgIH0KLSAgc2F2ZWQtPnNjcnViX202OGtfbXJpID0gc2NydWJfbTY4a19tcmk7Ci0gIHNhdmVkLT5tcmlfc3RhdGUgPSBtcmlfc3RhdGU7Ci0gIHNhdmVkLT5tcmlfbGFzdF9jaCA9IG1yaV9sYXN0X2NoOwotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICBzYXZlZC0+c3ltdmVyX3N0YXRlID0gc3ltdmVyX3N0YXRlOwotI2VuZGlmCi0KLSAgLyogZG9fc2NydWJfYmVnaW4oKSBpcyBub3QgdXNlZnVsLCBqdXN0IHdhc3RlcyB0aW1lLiAqLwotCi0gIHN0YXRlID0gMDsKLSAgc2F2ZWRfaW5wdXQgPSBOVUxMOwotCi0gIHJldHVybiAoY2hhciAqKSBzYXZlZDsKLX0KLQotdm9pZCAKLWFwcF9wb3AgKGFyZykKLSAgICAgY2hhciAqYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3QgYXBwX3NhdmUgKnNhdmVkID0gKHN0cnVjdCBhcHBfc2F2ZSAqKSBhcmc7Ci0KLSAgLyogVGhlcmUgaXMgbm8gZG9fc2NydWJfZW5kICgpLiAqLwotICBzdGF0ZSA9IHNhdmVkLT5zdGF0ZTsKLSAgb2xkX3N0YXRlID0gc2F2ZWQtPm9sZF9zdGF0ZTsKLSAgb3V0X3N0cmluZyA9IHNhdmVkLT5vdXRfc3RyaW5nOwotICBtZW1jcHkgKG91dF9idWYsIHNhdmVkLT5vdXRfYnVmLCBzaXplb2YgKG91dF9idWYpKTsKLSAgYWRkX25ld2xpbmVzID0gc2F2ZWQtPmFkZF9uZXdsaW5lczsKLSAgaWYgKHNhdmVkLT5zYXZlZF9pbnB1dCA9PSBOVUxMKQotICAgIHNhdmVkX2lucHV0ID0gTlVMTDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoc2F2ZWQtPnNhdmVkX2lucHV0X2xlbiA8PSBzaXplb2YgaW5wdXRfYnVmZmVyKTsKLSAgICAgIG1lbWNweSAoaW5wdXRfYnVmZmVyLCBzYXZlZC0+c2F2ZWRfaW5wdXQsIHNhdmVkLT5zYXZlZF9pbnB1dF9sZW4pOwotICAgICAgc2F2ZWRfaW5wdXQgPSBpbnB1dF9idWZmZXI7Ci0gICAgICBzYXZlZF9pbnB1dF9sZW4gPSBzYXZlZC0+c2F2ZWRfaW5wdXRfbGVuOwotICAgICAgZnJlZSAoc2F2ZWQtPnNhdmVkX2lucHV0KTsKLSAgICB9Ci0gIHNjcnViX202OGtfbXJpID0gc2F2ZWQtPnNjcnViX202OGtfbXJpOwotICBtcmlfc3RhdGUgPSBzYXZlZC0+bXJpX3N0YXRlOwotICBtcmlfbGFzdF9jaCA9IHNhdmVkLT5tcmlfbGFzdF9jaDsKLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLSAgc3ltdmVyX3N0YXRlID0gc2F2ZWQtPnN5bXZlcl9zdGF0ZTsKLSNlbmRpZgotCi0gIGZyZWUgKGFyZyk7Ci19CQkJCS8qIGFwcF9wb3AoKSAqLwotCi0vKiBAQCBUaGlzIGFzc3VtZXMgdGhhdCBcbiAmYyBhcmUgdGhlIHNhbWUgb24gaG9zdCBhbmQgdGFyZ2V0LiAgVGhpcyBpcyBub3QKLSAgIG5lY2Vzc2FyaWx5IHRydWUuICAqLwotc3RhdGljIGludCAKLXByb2Nlc3NfZXNjYXBlIChjaCkKLSAgICAgaW50IGNoOwotewotICBzd2l0Y2ggKGNoKQotICAgIHsKLSAgICBjYXNlICdiJzoKLSAgICAgIHJldHVybiAnXGInOwotICAgIGNhc2UgJ2YnOgotICAgICAgcmV0dXJuICdcZic7Ci0gICAgY2FzZSAnbic6Ci0gICAgICByZXR1cm4gJ1xuJzsKLSAgICBjYXNlICdyJzoKLSAgICAgIHJldHVybiAnXHInOwotICAgIGNhc2UgJ3QnOgotICAgICAgcmV0dXJuICdcdCc7Ci0gICAgY2FzZSAnXCcnOgotICAgICAgcmV0dXJuICdcJyc7Ci0gICAgY2FzZSAnIic6Ci0gICAgICByZXR1cm4gJ1wiJzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGNoOwotICAgIH0KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gcHJvY2VzcyBpbnB1dCBjaGFyYWN0ZXJzLiAgVGhlIEdFVAotICAgcGFyYW1ldGVyIGlzIHVzZWQgdG8gcmV0cmlldmUgbW9yZSBpbnB1dCBjaGFyYWN0ZXJzLiAgR0VUIHNob3VsZAotICAgc2V0IGl0cyBwYXJhbWV0ZXIgdG8gcG9pbnQgdG8gYSBidWZmZXIsIGFuZCByZXR1cm4gdGhlIGxlbmd0aCBvZgotICAgdGhlIGJ1ZmZlcjsgaXQgc2hvdWxkIHJldHVybiAwIGF0IGVuZCBvZiBmaWxlLiAgVGhlIHNjcnViYmVkIG91dHB1dAotICAgY2hhcmFjdGVycyBhcmUgcHV0IGludG8gdGhlIGJ1ZmZlciBzdGFydGluZyBhdCBUT1NUQVJUOyB0aGUgVE9TVEFSVAotICAgYnVmZmVyIGlzIFRPTEVOIGJ5dGVzIGluIGxlbmd0aC4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIKLSAgIG9mIHNjcnViYmVkIGNoYXJhY3RlcnMgcHV0IGludG8gVE9TVEFSVC4gIFRoaXMgd2lsbCBiZSBUT0xFTiB1bmxlc3MKLSAgIGVuZCBvZiBmaWxlIHdhcyBzZWVuLiAgVGhpcyBmdW5jdGlvbiBpcyBhcnJhbmdlZCBhcyBhIHN0YXRlCi0gICBtYWNoaW5lLCBhbmQgc2F2ZXMgaXRzIHN0YXRlIHNvIHRoYXQgaXQgbWF5IHJldHVybiBhdCBhbnkgcG9pbnQuCi0gICBUaGlzIGlzIHRoZSB3YXkgdGhlIG9sZCBjb2RlIHVzZWQgdG8gd29yay4gICovCi0KLWludAotZG9fc2NydWJfY2hhcnMgKGdldCwgdG9zdGFydCwgdG9sZW4pCi0gICAgIGludCAoKmdldCkgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLSAgICAgY2hhciAqdG9zdGFydDsKLSAgICAgaW50IHRvbGVuOwotewotICBjaGFyICp0byA9IHRvc3RhcnQ7Ci0gIGNoYXIgKnRvZW5kID0gdG9zdGFydCArIHRvbGVuOwotICBjaGFyICpmcm9tOwotICBjaGFyICpmcm9tZW5kOwotICBpbnQgZnJvbWxlbjsKLSAgcmVnaXN0ZXIgaW50IGNoLCBjaDIgPSAwOwotCi0gIC8qU3RhdGUgMDogYmVnaW5uaW5nIG9mIG5vcm1hbCBsaW5lCi0JICAxOiBBZnRlciBmaXJzdCB3aGl0ZXNwYWNlIG9uIGxpbmUgKGZsdXNoIG1vcmUgd2hpdGUpCi0JICAyOiBBZnRlciBmaXJzdCBub24td2hpdGUgKG9wY29kZSkgb24gbGluZSAoa2VlcCAxd2hpdGUpCi0JICAzOiBhZnRlciBzZWNvbmQgd2hpdGUgb24gbGluZSAoaW50byBvcGVyYW5kcykgKGZsdXNoIHdoaXRlKQotCSAgNDogYWZ0ZXIgcHV0dGluZyBvdXQgYSAubGluZSwgcHV0IG91dCBkaWdpdHMKLQkgIDU6IHBhcnNpbmcgYSBzdHJpbmcsIHRoZW4gZ28gdG8gb2xkLXN0YXRlCi0JICA2OiBwdXR0aW5nIG91dCBcIGVzY2FwZSBpbiBhICJkIHN0cmluZy4KLQkgIDc6IEFmdGVyIHB1dHRpbmcgb3V0IGEgLmFwcGZpbGUsIHB1dCBvdXQgc3RyaW5nLgotCSAgODogQWZ0ZXIgcHV0dGluZyBvdXQgYSAuYXBwZmlsZSBzdHJpbmcsIGZsdXNoIHVudGlsIG5ld2xpbmUuCi0JICA5OiBBZnRlciBzZWVpbmcgc3ltYm9sIGNoYXIgaW4gc3RhdGUgMyAoa2VlcCAxd2hpdGUgYWZ0ZXIgc3ltY2hhcikKLQkgMTA6IEFmdGVyIHNlZWluZyB3aGl0ZXNwYWNlIGluIHN0YXRlIDkgKGtlZXAgd2hpdGUgYmVmb3JlIHN5bWNoYXIpCi0JIDExOiBBZnRlciBzZWVpbmcgYSBzeW1ib2wgY2hhcmFjdGVyIGluIHN0YXRlIDAgKGVnIGEgbGFiZWwgZGVmaW5pdGlvbikKLQkgLTE6IG91dHB1dCBzdHJpbmcgaW4gb3V0X3N0cmluZyBhbmQgZ28gdG8gdGhlIHN0YXRlIGluIG9sZF9zdGF0ZQotCSAtMjogZmx1c2ggdGV4dCB1bnRpbCBhICcqJyAnLycgaXMgc2VlbiwgdGhlbiBnbyB0byBzdGF0ZSBvbGRfc3RhdGUKLSNpZmRlZiBUQ19WODUwCi0gICAgICAgICAxMjogQWZ0ZXIgc2VlaW5nIGEgZGFzaCwgbG9va2luZyBmb3IgYSBzZWNvbmQgZGFzaCBhcyBhIHN0YXJ0IG9mIGNvbW1lbnQuCi0jZW5kaWYKLSNpZmRlZiBUQ19NMzJSCi0JIDEzOiBBZnRlciBzZWVpbmcgYSB2ZXJ0aWNhbCBiYXIsIGxvb2tpbmcgZm9yIGEgc2Vjb25kIHZlcnRpY2FsIGJhciBhcyBhIHBhcmFsbGVsIGV4cHJlc3Npb24gc2VwZXJhdG9yLgotI2VuZGlmCi0JICAqLwotCi0gIC8qIEkgYWRkZWQgc3RhdGVzIDkgYW5kIDEwIGJlY2F1c2UgdGhlIE1JUFMgRUNPRkYgYXNzZW1ibGVyIHVzZXMKLSAgICAgY29uc3RydWN0cyBsaWtlIGBgLmxvYyAxIDIwJycuICBUaGlzIHdhcyB0dXJuaW5nIGludG8gYGAubG9jCi0gICAgIDEyMCcnLiAgU3RhdGVzIDkgYW5kIDEwIGVuc3VyZSB0aGF0IGEgc3BhY2UgaXMgbmV2ZXIgZHJvcHBlZCBpbgotICAgICBiZXR3ZWVuIGNoYXJhY3RlcnMgd2hpY2ggY291bGQgYXBwZWFyIGluIGEgaWRlbnRpZmllci4gIElhbgotICAgICBUYXlsb3IsIGlhbkBjeWdudXMuY29tLgotCi0gICAgIEkgYWRkZWQgc3RhdGUgMTEgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiTGZvbyBhZGQgJXIyNSwlcjI2LCVyMjciIHdvcmtzCi0gICAgIGNvcnJlY3RseSBvbiB0aGUgUEEgKGFuZCBhbnkgb3RoZXIgdGFyZ2V0IHdoZXJlIGNvbG9ucyBhcmUgb3B0aW9uYWwpLgotICAgICBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1LgotCi0gICAgIEkgYWRkZWQgc3RhdGUgMTMgc28gdGhhdCBzb21ldGhpbmcgbGlrZSAiY21wIHIxLCByMiB8fCB0cmFwICMxIiBkb2VzIG5vdAotICAgICBnZXQgc3F1YXNoZWQgaW50byAiY21wIHIxLHIyfHx0cmFwIzEiLCB3aXRoIHRoZSBhbGwgaW1wb3J0YW50IHNwYWNlCi0gICAgIGJldHdlZW4gdGhlICd0cmFwJyBhbmQgdGhlICcjMScgYmVpbmcgZWxpbWluYXRlZC4gIG5pY2tjQGN5Z251cy5jb20gICovCi0KLSAgLyogVGhpcyBtYWNybyBnZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4gICovCi0KLSNkZWZpbmUgR0VUKCkJCQkJCQkJXAotICAoZnJvbSA8IGZyb21lbmQJCQkJCQlcCi0gICA/ICogKHVuc2lnbmVkIGNoYXIgKikgKGZyb20rKykJCQkJXAotICAgOiAoc2F2ZWRfaW5wdXQgPSBOVUxMLAkJCQkJXAotICAgICAgZnJvbWxlbiA9ICgqZ2V0KSAoaW5wdXRfYnVmZmVyLCBzaXplb2YgaW5wdXRfYnVmZmVyKSwJXAotICAgICAgZnJvbSA9IGlucHV0X2J1ZmZlciwJCQkJCVwKLSAgICAgIGZyb21lbmQgPSBmcm9tICsgZnJvbWxlbiwJCQkJCVwKLSAgICAgIChmcm9tbGVuID09IDAJCQkJCQlcCi0gICAgICAgPyBFT0YJCQkJCQkJXAotICAgICAgIDogKiAodW5zaWduZWQgY2hhciAqKSAoZnJvbSsrKSkpKQotCi0gIC8qIFRoaXMgbWFjcm8gcHVzaGVzIGEgY2hhcmFjdGVyIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbS4gICovCi0KLSNkZWZpbmUgVU5HRVQodWNoKSAoKi0tZnJvbSA9ICh1Y2gpKQotCi0gIC8qIFRoaXMgbWFjcm8gcHV0cyBhIGNoYXJhY3RlciBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLiAgSWYgdGhpcwotICAgICBjaGFyYWN0ZXIgZmlsbHMgdGhlIG91dHB1dCBidWZmZXIsIHRoaXMgbWFjcm8ganVtcHMgdG8gdGhlIGxhYmVsCi0gICAgIFRPRlVMTC4gIFdlIHVzZSB0aGlzIHJhdGhlciB1Z2x5IGFwcHJvYWNoIGJlY2F1c2Ugd2UgbmVlZCB0bwotICAgICBoYW5kbGUgdHdvIGRpZmZlcmVudCB0ZXJtaW5hdGlvbiBjb25kaXRpb25zOiBFT0Ygb24gdGhlIGlucHV0Ci0gICAgIHN0cmVhbSwgYW5kIGEgZnVsbCBvdXRwdXQgYnVmZmVyLiAgSXQgd291bGQgYmUgc2ltcGxlciBpZiB3ZQotICAgICBhbHdheXMgcmVhZCBpbiB0aGUgZW50aXJlIGlucHV0IHN0cmVhbSBiZWZvcmUgcHJvY2Vzc2luZyBpdCwgYnV0Ci0gICAgIEkgZG9uJ3Qgd2FudCB0byBtYWtlIHN1Y2ggYSBzaWduaWZpY2FudCBjaGFuZ2UgdG8gdGhlIGFzc2VtYmxlcidzCi0gICAgIG1lbW9yeSB1c2FnZS4gICovCi0KLSNkZWZpbmUgUFVUKHBjaCkJCQlcCi0gIGRvCQkJCQlcCi0gICAgewkJCQkJXAotICAgICAgKnRvKysgPSAocGNoKTsJCQlcCi0gICAgICBpZiAodG8gPj0gdG9lbmQpCQkJXAotICAgICAgICBnb3RvIHRvZnVsbDsJCQlcCi0gICAgfQkJCQkJXAotICB3aGlsZSAoMCkKLQotICBpZiAoc2F2ZWRfaW5wdXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmcm9tID0gc2F2ZWRfaW5wdXQ7Ci0gICAgICBmcm9tZW5kID0gZnJvbSArIHNhdmVkX2lucHV0X2xlbjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmcm9tbGVuID0gKCpnZXQpIChpbnB1dF9idWZmZXIsIHNpemVvZiBpbnB1dF9idWZmZXIpOwotICAgICAgaWYgKGZyb21sZW4gPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGZyb20gPSBpbnB1dF9idWZmZXI7Ci0gICAgICBmcm9tZW5kID0gZnJvbSArIGZyb21sZW47Ci0gICAgfQotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIC8qIFRoZSBjYXNlcyBpbiB0aGlzIHN3aXRjaCBlbmQgd2l0aCBjb250aW51ZSwgaW4gb3JkZXIgdG8KLSAgICAgICAgIGJyYW5jaCBiYWNrIHRvIHRoZSB0b3Agb2YgdGhpcyB3aGlsZSBsb29wIGFuZCBnZW5lcmF0ZSB0aGUKLSAgICAgICAgIG5leHQgb3V0cHV0IGNoYXJhY3RlciBpbiB0aGUgYXBwcm9wcmlhdGUgc3RhdGUuICAqLwotICAgICAgc3dpdGNoIChzdGF0ZSkKLQl7Ci0JY2FzZSAtMToKLQkgIGNoID0gKm91dF9zdHJpbmcrKzsKLQkgIGlmICgqb3V0X3N0cmluZyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgb2xkX3N0YXRlID0gMzsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgLTI6Ci0JICBmb3IgKDs7KQotCSAgICB7Ci0JICAgICAgZG8KLQkJewotCQkgIGNoID0gR0VUICgpOwotCi0JCSAgaWYgKGNoID09IEVPRikKLQkJICAgIHsKLQkJICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudCIpKTsKLQkJICAgICAgZ290byBmcm9tZW9mOwotCQkgICAgfQotCi0JCSAgaWYgKGNoID09ICdcbicpCi0JCSAgICBQVVQgKCdcbicpOwotCQl9Ci0JICAgICAgd2hpbGUgKGNoICE9ICcqJyk7Ci0KLQkgICAgICB3aGlsZSAoKGNoID0gR0VUICgpKSA9PSAnKicpCi0JCTsKLQotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50IikpOwotCQkgIGdvdG8gZnJvbWVvZjsKLQkJfQotCi0JICAgICAgaWYgKGNoID09ICcvJykKLQkJYnJlYWs7Ci0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICB9Ci0KLQkgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgVU5HRVQgKCcgJyk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgNDoKLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgZWxzZSBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykKLQkgICAgUFVUIChjaCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSkKLQkJY2ggPSBHRVQgKCk7Ci0JICAgICAgaWYgKGNoID09ICciJykKLQkJewotCQkgIFVOR0VUIChjaCk7Ci0JCSAgaWYgKHNjcnViX202OGtfbXJpKQotCQkgICAgb3V0X3N0cmluZyA9ICJcblx0YXBwZmlsZSAiOwotCQkgIGVsc2UKLQkJICAgIG91dF9zdHJpbmcgPSAiXG5cdC5hcHBmaWxlICI7Ci0JCSAgb2xkX3N0YXRlID0gNzsKLQkJICBzdGF0ZSA9IC0xOwotCQkgIFBVVCAoKm91dF9zdHJpbmcrKyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB3aGlsZSAoY2ggIT0gRU9GICYmIGNoICE9ICdcbicpCi0JCSAgICBjaCA9IEdFVCAoKTsKLQkJICBzdGF0ZSA9IDA7Ci0JCSAgUFVUIChjaCk7Ci0JCX0KLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlIDU6Ci0JICAvKiBXZSBhcmUgZ29pbmcgdG8gY29weSBldmVyeXRoaW5nIHVwIHRvIGEgcXVvdGUgY2hhcmFjdGVyLAotICAgICAgICAgICAgIHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYSBiYWNrc2xhc2guICBXZSB0cnkgdG8KLSAgICAgICAgICAgICBvcHRpbWl6ZSB0aGUgY29weWluZyBpbiB0aGUgc2ltcGxlIGNhc2Ugd2l0aG91dCB1c2luZyB0aGUKLSAgICAgICAgICAgICBHRVQgYW5kIFBVVCBtYWNyb3MuICAqLwotCSAgewotCSAgICBjaGFyICpzOwotCSAgICBpbnQgbGVuOwotCi0JICAgIGZvciAocyA9IGZyb207IHMgPCBmcm9tZW5kOyBzKyspCi0JICAgICAgewotCQljaCA9ICpzOwotCQkvKiBUaGlzIGNvbmRpdGlvbiBtdXN0IGJlIGNoYW5nZWQgaWYgdGhlIHR5cGUgb2YgYW55Ci0gICAgICAgICAgICAgICAgICAgb3RoZXIgY2hhcmFjdGVyIGNhbiBiZSBMRVhfSVNfU1RSSU5HUVVPVEUuICAqLwotCQlpZiAoY2ggPT0gJ1xcJwotCQkgICAgfHwgY2ggPT0gJyInCi0JCSAgICB8fCBjaCA9PSAnXCcnCi0JCSAgICB8fCBjaCA9PSAnXG4nKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgbGVuID0gcyAtIGZyb207Ci0JICAgIGlmIChsZW4gPiB0b2VuZCAtIHRvKQotCSAgICAgIGxlbiA9IHRvZW5kIC0gdG87Ci0JICAgIGlmIChsZW4gPiAwKQotCSAgICAgIHsKLQkJbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKLQkJdG8gKz0gbGVuOwotCQlmcm9tICs9IGxlbjsKLQkgICAgICB9Ci0JICB9Ci0KLQkgIGNoID0gR0VUICgpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIHN0cmluZzogaW5zZXJ0ZWQgJ1wiJyIpKTsKLQkgICAgICBzdGF0ZSA9IG9sZF9zdGF0ZTsKLQkgICAgICBVTkdFVCAoJ1xuJyk7Ci0JICAgICAgUFVUICgnIicpOwotCSAgICB9Ci0JICBlbHNlIGlmIChsZXhbY2hdID09IExFWF9JU19TVFJJTkdRVU9URSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gb2xkX3N0YXRlOwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0jaWZuZGVmIE5PX1NUUklOR19FU0NBUEVTCi0JICBlbHNlIGlmIChjaCA9PSAnXFwnKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSA2OwotCSAgICAgIFBVVCAoY2gpOwotCSAgICB9Ci0jZW5kaWYKLQkgIGVsc2UgaWYgKHNjcnViX202OGtfbXJpICYmIGNoID09ICdcbicpCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IHF1aWV0bHkgdGVybWluYXRlIHRoZSBzdHJpbmcuICBUaGlzIHBlcm1pdHMgbGluZXMgbGlrZQotCQkgICBibmUJbGFiZWwJbG9vcCBpZiB3ZSBoYXZlbid0IHJlYWNoIGVuZCB5ZXQKLQkJICovCi0JICAgICAgc3RhdGUgPSBvbGRfc3RhdGU7Ci0JICAgICAgVU5HRVQgKGNoKTsKLQkgICAgICBQVVQgKCdcJycpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0KLQljYXNlIDY6Ci0JICBzdGF0ZSA9IDU7Ci0JICBjaCA9IEdFVCAoKTsKLQkgIHN3aXRjaCAoY2gpCi0JICAgIHsKLQkgICAgICAvKiBIYW5kbGUgc3RyaW5ncyBicm9rZW4gYWNyb3NzIGxpbmVzLCBieSB0dXJuaW5nICdcbicgaW50bwotCQkgJ1xcJyBhbmQgJ24nLiAgKi8KLQkgICAgY2FzZSAnXG4nOgotCSAgICAgIFVOR0VUICgnbicpOwotCSAgICAgIGFkZF9uZXdsaW5lcysrOwotCSAgICAgIFBVVCAoJ1xcJyk7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnIic6Ci0JICAgIGNhc2UgJ1xcJzoKLQkgICAgY2FzZSAnYic6Ci0JICAgIGNhc2UgJ2YnOgotCSAgICBjYXNlICduJzoKLQkgICAgY2FzZSAncic6Ci0JICAgIGNhc2UgJ3QnOgotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAneCc6Ci0JICAgIGNhc2UgJ1gnOgotCSAgICBjYXNlICcwJzoKLQkgICAgY2FzZSAnMSc6Ci0JICAgIGNhc2UgJzInOgotCSAgICBjYXNlICczJzoKLQkgICAgY2FzZSAnNCc6Ci0JICAgIGNhc2UgJzUnOgotCSAgICBjYXNlICc2JzoKLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgYnJlYWs7Ci0jaWYgZGVmaW5lZChJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUykgfCBkZWZpbmVkKE9OTFlfU1RBTkRBUkRfRVNDQVBFUykKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc193YXJuIChfKCJVbmtub3duIGVzY2FwZSAnXFwlYycgaW4gc3RyaW5nOiBJZ25vcmVkIiksIGNoKTsKLQkgICAgICBicmVhazsKLSNlbHNlICAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBBY2NlcHQgXHggYXMgeCBmb3IgYW55IHggKi8KLQkgICAgICBicmVhazsKLSNlbmRpZiAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQotCSAgICBjYXNlIEVPRjoKLQkgICAgICBhc193YXJuIChfKCJFbmQgb2YgZmlsZSBpbiBzdHJpbmc6ICdcIicgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgUFVUICgnIicpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBQVVQgKGNoKTsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSA3OgotCSAgY2ggPSBHRVQgKCk7Ci0JICBzdGF0ZSA9IDU7Ci0JICBvbGRfc3RhdGUgPSA4OwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgZ290byBmcm9tZW9mOwotCSAgUFVUIChjaCk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgODoKLQkgIGRvCi0JICAgIGNoID0gR0VUICgpOwotCSAgd2hpbGUgKGNoICE9ICdcbicgJiYgY2ggIT0gRU9GKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoY2gpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBPSywgd2UgYXJlIHNvbWV3aGVyZSBpbiBzdGF0ZXMgMCB0aHJvdWdoIDQgb3IgOSB0aHJvdWdoIDExICovCi0KLSAgICAgIC8qIGZsdXNoY2hhcjogKi8KLSAgICAgIGNoID0gR0VUICgpOwotCi0gICAgcmVjeWNsZToKLQotI2lmIGRlZmluZWQgVENfQVJNICYmIGRlZmluZWQgT0JKX0VMRgotICAgICAgLyogV2UgbmVlZCB0byB3YXRjaCBvdXQgZm9yIC5zeW12ZXIgZGlyZWN0aXZlcy4gIFNlZSB0aGUgY29tbWVudCBsYXRlcgotCSBpbiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmIChzeW12ZXJfc3RhdGUgPT0gTlVMTCkKLQl7Ci0JICBpZiAoKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkgJiYgY2ggPT0gc3ltdmVyX3BzZXVkb1swXSkKLQkgICAgc3ltdmVyX3N0YXRlID0gc3ltdmVyX3BzZXVkbyArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGFkdmFuY2UgdG8gdGhlIG5leHQgc3RhdGUgaWYgd2UgZmluZCB0aGUgcmlnaHQKLQkgICAgIGNoYXJhY3Rlci4gICovCi0JICBpZiAoY2ggIT0gJ1wwJyAmJiAoKnN5bXZlcl9zdGF0ZSA9PSBjaCkpCi0JICAgICsrc3ltdmVyX3N0YXRlOwotCSAgZWxzZSBpZiAoKnN5bXZlcl9zdGF0ZSAhPSAnXDAnKQotCSAgICAvKiBXZSBkaWQgbm90IGdldCB0aGUgZXhwZWN0ZWQgY2hhcmFjdGVyLCBvciB3ZSBkaWRuJ3QKLQkgICAgICAgZ2V0IGEgdmFsaWQgdGVybWluYXRpbmcgY2hhcmFjdGVyIGFmdGVyIHNlZWluZyB0aGUKLQkgICAgICAgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuICAqLwotCSAgICBzeW12ZXJfc3RhdGUgPSBOVUxMOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgcmVhZCB0aGUgZW50aXJlIHBzZXVkby1vcC4gIElmIHRoaXMgaXMgdGhlIGVuZAotCQkgb2YgdGhlIGxpbmUsIGdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gICovCi0JICAgICAgaWYgKElTX05FV0xJTkUgKGNoKSkKLQkJc3ltdmVyX3N0YXRlID0gTlVMTDsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBUQ19BUk0gJiYgT0JKX0VMRiAqLwotCi0jaWZkZWYgVENfTTY4SwotICAgICAgLyogV2Ugd2FudCB0byBoYXZlIHBzZXVkby1vcHMgd2hpY2ggY29udHJvbCB3aGV0aGVyIHdlIGFyZSBpbgotICAgICAgICAgTVJJIG1vZGUgb3Igbm90LiAgVW5mb3J0dW5hdGVseSwgc2luY2UgbTY4ayBNUkkgbW9kZSBhZmZlY3RzCi0gICAgICAgICB0aGUgc2NydWJiZXIsIHRoYXQgbWVhbnMgdGhhdCB3ZSBuZWVkIGEgc3BlY2lhbCBwdXJwb3NlCi0gICAgICAgICByZWNvZ25pemVyIGhlcmUuICAqLwotICAgICAgaWYgKG1yaV9zdGF0ZSA9PSBOVUxMKQotCXsKLQkgIGlmICgoc3RhdGUgPT0gMCB8fCBzdGF0ZSA9PSAxKQotCSAgICAgICYmIGNoID09IG1yaV9wc2V1ZG9bMF0pCi0JICAgIG1yaV9zdGF0ZSA9IG1yaV9wc2V1ZG8gKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBhZHZhbmNlIHRvIHRoZSBuZXh0IHN0YXRlIGlmIHdlIGZpbmQgdGhlIHJpZ2h0Ci0JICAgICBjaGFyYWN0ZXIsIG9yIGlmIHdlIG5lZWQgYSBzcGFjZSBjaGFyYWN0ZXIgYW5kIHdlIGdldCBhbnkKLQkgICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVyLCBvciBpZiB3ZSBuZWVkIGEgJzAnIGFuZCB3ZSBnZXQgYQotCSAgICAgJzEnICh0aGlzIGlzIHNvIHRoYXQgd2Ugb25seSBuZWVkIG9uZSBzdGF0ZSB0byBoYW5kbGUKLQkgICAgIGBgLm1yaSAwJycgYW5kIGBgLm1yaSAxJycpLiAgKi8KLQkgIGlmIChjaCAhPSAnXDAnCi0JICAgICAgJiYgKCptcmlfc3RhdGUgPT0gY2gKLQkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnICcKLQkJICAgICAgJiYgbGV4W2NoXSA9PSBMRVhfSVNfV0hJVEVTUEFDRSkKLQkJICB8fCAoKm1yaV9zdGF0ZSA9PSAnMCcKLQkJICAgICAgJiYgY2ggPT0gJzEnKSkpCi0JICAgIHsKLQkgICAgICBtcmlfbGFzdF9jaCA9IGNoOwotCSAgICAgICsrbXJpX3N0YXRlOwotCSAgICB9Ci0JICBlbHNlIGlmICgqbXJpX3N0YXRlICE9ICdcMCcKLQkJICAgfHwgKGxleFtjaF0gIT0gTEVYX0lTX1dISVRFU1BBQ0UKLQkJICAgICAgICYmIGxleFtjaF0gIT0gTEVYX0lTX05FV0xJTkUpKQotCSAgICB7Ci0JICAgICAgLyogV2UgZGlkIG5vdCBnZXQgdGhlIGV4cGVjdGVkIGNoYXJhY3Rlciwgb3Igd2UgZGlkbid0Ci0JCSBnZXQgYSB2YWxpZCB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIgYWZ0ZXIgc2VlaW5nIHRoZQotCQkgZW50aXJlIHBzZXVkby1vcCwgc28gd2UgbXVzdCBnbyBiYWNrIHRvIHRoZQotCQkgYmVnaW5uaW5nLiAgKi8KLQkgICAgICBtcmlfc3RhdGUgPSBOVUxMOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSd2ZSByZWFkIHRoZSBlbnRpcmUgcHNldWRvLW9wLiAgbWlwc19sYXN0X2NoIGlzCi0gICAgICAgICAgICAgICAgIGVpdGhlciAnMCcgb3IgJzEnIGluZGljYXRpbmcgd2hldGhlciB0byBlbnRlciBvcgotICAgICAgICAgICAgICAgICBsZWF2ZSBNUkkgbW9kZS4gICovCi0JICAgICAgZG9fc2NydWJfYmVnaW4gKG1yaV9sYXN0X2NoID09ICcxJyk7Ci0JICAgICAgbXJpX3N0YXRlID0gTlVMTDsKLQotCSAgICAgIC8qIFdlIGNvbnRpbnVlIGhhbmRsaW5nIHRoZSBjaGFyYWN0ZXIgYXMgdXN1YWwuICBUaGUKLSAgICAgICAgICAgICAgICAgbWFpbiBnYXMgcmVhZGVyIG11c3QgYWxzbyBoYW5kbGUgdGhlIC5tcmkgcHNldWRvLW9wCi0gICAgICAgICAgICAgICAgIHRvIGNvbnRyb2wgZXhwcmVzc2lvbiBwYXJzaW5nIGFuZCB0aGUgbGlrZS4gICovCi0JICAgIH0KLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGNoID09IEVPRikKLQl7Ci0JICBpZiAoc3RhdGUgIT0gMCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIG5vdCBhdCBlbmQgb2YgYSBsaW5lOyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgICAgIHN0YXRlID0gMDsKLQkgICAgICBQVVQgKCdcbicpOwotCSAgICB9Ci0JICBnb3RvIGZyb21lb2Y7Ci0JfQotCi0gICAgICBzd2l0Y2ggKGxleFtjaF0pCi0JewotCWNhc2UgTEVYX0lTX1dISVRFU1BBQ0U6Ci0JICBkbwotCSAgICB7Ci0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgIH0KLQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgSVNfV0hJVEVTUEFDRSAoY2gpKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIGdvdG8gZnJvbWVvZjsKLQotCSAgaWYgKHN0YXRlID09IDApCi0JICAgIHsKLQkgICAgICAvKiBQcmVzZXJ2ZSBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBhdCB0aGUKLQkJIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotCSAgICAgIHN0YXRlID0gMTsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZiAoSVNfQ09NTUVOVCAoY2gpCi0JICAgICAgfHwgY2ggPT0gJy8nCi0JICAgICAgfHwgSVNfTElORV9TRVBBUkFUT1IgKGNoKSkKLQkgICAgewotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJewotCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCi0JCSAgVU5HRVQgKGNoKTsKLQkJICBQVVQgKCcgJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UncmUgaW4gc3RhdGUgMiBvciAxMSwgd2UndmUgc2VlbiBhIG5vbi13aGl0ZQotCSAgICAgY2hhcmFjdGVyIGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2UuICBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIKLQkgICAgIGlzICc6JywgdGhpcyBpcyB3aGl0ZXNwYWNlIGFmdGVyIGEgbGFiZWwgbmFtZSB3aGljaCB3ZQotCSAgICAgbm9ybWFsbHkgbXVzdCBpZ25vcmUuICBJbiBNUkkgbW9kZSwgdGhvdWdoLCBzcGFjZXMgYXJlCi0JICAgICBub3QgcGVybWl0dGVkIGJldHdlZW4gdGhlIGxhYmVsIGFuZCB0aGUgY29sb24uICAqLwotCSAgaWYgKChzdGF0ZSA9PSAyIHx8IHN0YXRlID09IDExKQotCSAgICAgICYmIGxleFtjaF0gPT0gTEVYX0lTX0NPTE9OCi0JICAgICAgJiYgISBzY3J1Yl9tNjhrX21yaSkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMTsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBzd2l0Y2ggKHN0YXRlKQotCSAgICB7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBzdGF0ZSsrOwotCSAgICAgIGdvdG8gcmVjeWNsZTsJLyogUHVudGVkIGxlYWRpbmcgc3AgKi8KLQkgICAgY2FzZSAxOgotCSAgICAgIC8qIFdlIGNhbiBhcnJpdmUgaGVyZSBpZiB3ZSBsZWF2ZSBhIGxlYWRpbmcgd2hpdGVzcGFjZQotCQkgY2hhcmFjdGVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLQkgICAgICBnb3RvIHJlY3ljbGU7Ci0JICAgIGNhc2UgMjoKLQkgICAgICBzdGF0ZSA9IDM7Ci0JICAgICAgaWYgKHRvICsgMSA8IHRvZW5kKQotCQl7Ci0JCSAgLyogT3B0aW1pemUgY29tbW9uIGNhc2UgYnkgc2tpcHBpbmcgVU5HRVQvR0VULiAgKi8KLQkJICBQVVQgKCcgJyk7CS8qIFNwIGFmdGVyIG9wY28gKi8KLQkJICBnb3RvIHJlY3ljbGU7Ci0JCX0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAzOgotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJewotCQkgIC8qIEluIE1SSSBtb2RlLCB3ZSBrZWVwIHRoZXNlIHNwYWNlcy4gICovCi0JCSAgVU5HRVQgKGNoKTsKLQkJICBQVVQgKCcgJyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBnb3RvIHJlY3ljbGU7CS8qIFNwIGluIG9wZXJhbmRzICovCi0JICAgIGNhc2UgOToKLQkgICAgY2FzZSAxMDoKLQkgICAgICBpZiAoc2NydWJfbTY4a19tcmkpCi0JCXsKLQkJICAvKiBJbiBNUkkgbW9kZSwgd2Uga2VlcCB0aGVzZSBzcGFjZXMuICAqLwotCQkgIHN0YXRlID0gMzsKLQkJICBVTkdFVCAoY2gpOwotCQkgIFBVVCAoJyAnKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIHN0YXRlID0gMTA7CS8qIFNwIGFmdGVyIHN5bWJvbCBjaGFyICovCi0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICBjYXNlIDExOgotCSAgICAgIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTEFCRUxTX1dJVEhPVVRfQ09MT05TCi0JCSAgfHwgMQotI2VuZGlmCi0JCSAgKQotCQlzdGF0ZSA9IDE7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogV2Uga25vdyB0aGF0IGNoIGlzIG5vdCAnOicsIHNpbmNlIHdlIHRlc3RlZCB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICBjYXNlIGFib3ZlLiAgVGhlcmVmb3JlIHRoaXMgaXMgbm90IGEgbGFiZWwsIHNvIGl0Ci0gICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBvcGNvZGUsIGFuZCB3ZSd2ZSBqdXN0IHNlZW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICB3aGl0ZXNwYWNlIGFmdGVyIGl0LiAgKi8KLQkJICBzdGF0ZSA9IDM7Ci0JCX0KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIFBVVCAoJyAnKTsJLyogU3AgYWZ0ZXIgbGFiZWwgZGVmaW5pdGlvbi4gICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgQkFEX0NBU0UgKHN0YXRlKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19UV09DSEFSX0NPTU1FTlRfMVNUOgotCSAgY2gyID0gR0VUICgpOwotCSAgaWYgKGNoMiA9PSAnKicpCi0JICAgIHsKLQkgICAgICBmb3IgKDs7KQotCQl7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgY2gyID0gR0VUICgpOwotCQkgICAgICBpZiAoY2gyICE9IEVPRiAmJiBJU19ORVdMSU5FIChjaDIpKQotCQkJYWRkX25ld2xpbmVzKys7Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKGNoMiAhPSBFT0YgJiYgY2gyICE9ICcqJyk7Ci0KLQkJICB3aGlsZSAoY2gyID09ICcqJykKLQkJICAgIGNoMiA9IEdFVCAoKTsKLQotCQkgIGlmIChjaDIgPT0gRU9GIHx8IGNoMiA9PSAnLycpCi0JCSAgICBicmVhazsKLQotCQkgIC8qIFRoaXMgVU5HRVQgd2lsbCBlbnN1cmUgdGhhdCB3ZSBjb3VudCBuZXdsaW5lcwotICAgICAgICAgICAgICAgICAgICAgY29ycmVjdGx5LiAgKi8KLQkJICBVTkdFVCAoY2gyKTsKLQkJfQotCi0JICAgICAgaWYgKGNoMiA9PSBFT0YpCi0JCWFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIG11bHRpbGluZSBjb21tZW50IikpOwotCi0JICAgICAgY2ggPSAnICc7Ci0JICAgICAgZ290byByZWN5Y2xlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoY2gyICE9IEVPRikKLQkJVU5HRVQgKGNoMik7Ci0JICAgICAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCi0JCXN0YXRlID0gMzsKLQkgICAgICBQVVQgKGNoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19TVFJJTkdRVU9URToKLQkgIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIC8qIFByZXNlcnZlIHRoZSB3aGl0ZXNwYWNlIGluIGZvbyAiYmFyIiAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQotCSAgICAgIC8qIFBVVCBkaWRuJ3QganVtcCBvdXQuICBXZSBjb3VsZCBqdXN0IGJyZWFrLCBidXQgd2UKLSAgICAgICAgICAgICAgICAga25vdyB3aGF0IHdpbGwgaGFwcGVuLCBzbyBvcHRpbWl6ZSBhIGJpdC4gICovCi0JICAgICAgY2ggPSBHRVQgKCk7Ci0JICAgICAgb2xkX3N0YXRlID0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RhdGUgPT0gOSkKLQkgICAgb2xkX3N0YXRlID0gMzsKLQkgIGVsc2UKLQkgICAgb2xkX3N0YXRlID0gc3RhdGU7Ci0JICBzdGF0ZSA9IDU7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIElFRUVfU1RZTEUKLQljYXNlIExFWF9JU19PTkVDSEFSX1FVT1RFOgotCSAgaWYgKHN0YXRlID09IDEwKQotCSAgICB7Ci0JICAgICAgLyogUHJlc2VydmUgdGhlIHdoaXRlc3BhY2UgaW4gZm9vICdiJyAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgc3RhdGUgPSAzOwotCSAgICAgIFBVVCAoJyAnKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgY2ggPSBHRVQgKCk7Ci0JICBpZiAoY2ggPT0gRU9GKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgYWZ0ZXIgYSBvbmUtY2hhcmFjdGVyIHF1b3RlOyBcXDAgaW5zZXJ0ZWQiKSk7Ci0JICAgICAgY2ggPSAwOwotCSAgICB9Ci0JICBpZiAoY2ggPT0gJ1xcJykKLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICAgIGlmIChjaCA9PSBFT0YpCi0JCXsKLQkJICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBlc2NhcGUgY2hhcmFjdGVyIikpOwotCQkgIGNoID0gJ1xcJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJY2ggPSBwcm9jZXNzX2VzY2FwZSAoY2gpOwotCSAgICB9Ci0JICBzcHJpbnRmIChvdXRfYnVmLCAiJWQiLCAoaW50KSAodW5zaWduZWQgY2hhcikgY2gpOwotCi0JICAvKiBOb25lIG9mIHRoZXNlICd4IGNvbnN0YW50cyBmb3IgdXMuICBXZSB3YW50ICd4Jy4gICovCi0JICBpZiAoKGNoID0gR0VUICgpKSAhPSAnXCcnKQotCSAgICB7Ci0jaWZkZWYgUkVRVUlSRV9DSEFSX0NMT1NFX1FVT1RFCi0JICAgICAgYXNfd2FybiAoXygiTWlzc2luZyBjbG9zZSBxdW90ZTogKGFzc3VtZWQpIikpOwotI2Vsc2UKLQkgICAgICBpZiAoY2ggIT0gRU9GKQotCQlVTkdFVCAoY2gpOwotI2VuZGlmCi0JICAgIH0KLQkgIGlmIChzdHJsZW4gKG91dF9idWYpID09IDEpCi0JICAgIHsKLQkgICAgICBQVVQgKG91dF9idWZbMF0pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoc3RhdGUgPT0gOSkKLQkgICAgb2xkX3N0YXRlID0gMzsKLQkgIGVsc2UKLQkgICAgb2xkX3N0YXRlID0gc3RhdGU7Ci0JICBzdGF0ZSA9IC0xOwotCSAgb3V0X3N0cmluZyA9IG91dF9idWY7Ci0JICBQVVQgKCpvdXRfc3RyaW5nKyspOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgTEVYX0lTX0NPTE9OOgotCSAgaWYgKHN0YXRlID09IDkgfHwgc3RhdGUgPT0gMTApCi0JICAgIHN0YXRlID0gMzsKLQkgIGVsc2UgaWYgKHN0YXRlICE9IDMpCi0JICAgIHN0YXRlID0gMTsKLQkgIFBVVCAoY2gpOwotCSAgYnJlYWs7Ci0KLQljYXNlIExFWF9JU19ORVdMSU5FOgotCSAgLyogUm9sbCBvdXQgYSBidW5jaCBvZiBuZXdsaW5lcyBmcm9tIGluc2lkZSBjb21tZW50cywgZXRjLiAgKi8KLQkgIGlmIChhZGRfbmV3bGluZXMpCi0JICAgIHsKLQkgICAgICAtLWFkZF9uZXdsaW5lczsKLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICB9Ci0JICAvKiBmYWxsIHRocnUgaW50by4uLiAqLwotCi0JY2FzZSBMRVhfSVNfTElORV9TRVBBUkFUT1I6Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKGNoKTsKLQkgIGJyZWFrOwotCi0jaWZkZWYgVENfVjg1MAotCWNhc2UgTEVYX0lTX0RPVUJMRURBU0hfMVNUOgotCSAgY2gyID0gR0VUKCk7Ci0JICBpZiAoY2gyICE9ICctJykKLQkgICAgewotCSAgICAgIFVOR0VUIChjaDIpOwotCSAgICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAgIH0KLQkgIC8qIHJlYWQgYW5kIHNraXAgdG8gZW5kIG9mIGxpbmUgKi8KLQkgIGRvCi0JICAgIHsKLQkgICAgICBjaCA9IEdFVCAoKTsKLQkgICAgfQotCSAgd2hpbGUgKGNoICE9IEVPRiAmJiBjaCAhPSAnXG4nKTsKLQkgIGlmIChjaCA9PSBFT0YpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIikpOwotCSAgICB9Ci0JICBzdGF0ZSA9IDA7Ci0JICBQVVQgKCdcbicpOwotCSAgYnJlYWs7Ci0jZW5kaWYJICAgIAotI2lmZGVmIFRDX00zMlIKLQljYXNlIExFWF9JU19ET1VCTEVCQVJfMVNUOgotCSAgY2gyID0gR0VUKCk7Ci0JICBpZiAoY2gyICE9ICd8JykKLQkgICAgewotCSAgICAgIFVOR0VUIChjaDIpOwotCSAgICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAgIH0KLQkgIC8qIFJlc2V0IGJhY2sgdG8gc3RhdGUgMSBhbmQgcHJldGVuZCB0aGF0IHdlIGFyZSBwYXJzaW5nIGEgbGluZSBmcm9tCi0JICAgICBqdXN0IGFmdGVyIHRoZSBmaXJzdCB3aGl0ZSBzcGFjZS4gICovCi0JICBzdGF0ZSA9IDE7Ci0JICBQVVQgKCd8Jyk7Ci0JICBQVVQgKCd8Jyk7Ci0JICBicmVhazsKLSNlbmRpZgkgICAgCi0JY2FzZSBMRVhfSVNfTElORV9DT01NRU5UX1NUQVJUOgotCSAgLyogRklYTUUtc29tZWRheTogVGhlIHR3byBjaGFyYWN0ZXIgY29tbWVudCBzdHVmZiB3YXMgYmFkbHkKLQkgICAgIHRob3VnaHQgb3V0LiAgT24gaTM4Niwgd2Ugd2FudCAnLycgYXMgbGluZSBjb21tZW50IHN0YXJ0Ci0JICAgICBBTkQgd2Ugd2FudCBDIHN0eWxlIGNvbW1lbnRzLiAgaGVuY2UgdGhpcyBoYWNrLiAgVGhlCi0JICAgICB3aG9sZSBsZXhpY2FsIHByb2Nlc3Mgc2hvdWxkIGJlIHJld29ya2VkLiAgeG94b3JpY2guICAqLwotCSAgaWYgKGNoID09ICcvJykKLQkgICAgewotCSAgICAgIGNoMiA9IEdFVCAoKTsKLQkgICAgICBpZiAoY2gyID09ICcqJykKLQkJewotCQkgIG9sZF9zdGF0ZSA9IDM7Ci0JCSAgc3RhdGUgPSAtMjsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFVOR0VUIChjaDIpOwotCQl9Ci0JICAgIH0gLyogYmFkIGhhY2sgKi8KLQotCSAgaWYgKHN0YXRlID09IDAgfHwgc3RhdGUgPT0gMSkJLyogT25seSBjb21tZW50IGF0IHN0YXJ0IG9mIGxpbmUuICAqLwotCSAgICB7Ci0JICAgICAgaW50IHN0YXJ0Y2g7Ci0KLQkgICAgICBzdGFydGNoID0gY2g7Ci0KLQkgICAgICBkbwotCQl7Ci0JCSAgY2ggPSBHRVQgKCk7Ci0JCX0KLQkgICAgICB3aGlsZSAoY2ggIT0gRU9GICYmIElTX1dISVRFU1BBQ0UgKGNoKSk7Ci0JICAgICAgaWYgKGNoID09IEVPRikKLQkJewotCQkgIGFzX3dhcm4gKF8oImVuZCBvZiBmaWxlIGluIGNvbW1lbnQ7IG5ld2xpbmUgaW5zZXJ0ZWQiKSk7Ci0JCSAgUFVUICgnXG4nKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JyB8fCBzdGF0ZSAhPSAwIHx8IHN0YXJ0Y2ggIT0gJyMnKQotCQl7Ci0JCSAgLyogTm90IGEgY3BwIGxpbmUuICAqLwotCQkgIHdoaWxlIChjaCAhPSBFT0YgJiYgIUlTX05FV0xJTkUgKGNoKSkKLQkJICAgIGNoID0gR0VUICgpOwotCQkgIGlmIChjaCA9PSBFT0YpCi0JCSAgICBhc193YXJuIChfKCJFT0YgaW4gQ29tbWVudDogTmV3bGluZSBpbnNlcnRlZCIpKTsKLQkJICBzdGF0ZSA9IDA7Ci0JCSAgUFVUICgnXG4nKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIC8qIExva3MgbGlrZSBgIyAxMjMgImZpbGVuYW1lIicgZnJvbSBjcHAuICAqLwotCSAgICAgIFVOR0VUIChjaCk7Ci0JICAgICAgb2xkX3N0YXRlID0gNDsKLQkgICAgICBzdGF0ZSA9IC0xOwotCSAgICAgIGlmIChzY3J1Yl9tNjhrX21yaSkKLQkJb3V0X3N0cmluZyA9ICJcdGFwcGxpbmUgIjsKLQkgICAgICBlbHNlCi0JCW91dF9zdHJpbmcgPSAiXHQuYXBwbGluZSAiOwotCSAgICAgIFBVVCAoKm91dF9zdHJpbmcrKyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotI2lmZGVmIFRDX0QxMFYKLQkgIC8qIEFsbCBpbnNucyBlbmQgaW4gYSBjaGFyIGZvciB3aGljaCBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCBpcyB0cnVlLgotCSAgICAgVHJhcCBpcyB0aGUgb25seSBzaG9ydCBpbnNuIHRoYXQgaGFzIGEgZmlyc3Qgb3BlcmFuZCB0aGF0IGlzCi0JICAgICBuZWl0aGVyIHJlZ2lzdGVyIG5vciBsYWJlbC4KLQkgICAgIFdlIG11c3QgcHJldmVudCBleGVmMGYgfHx0cmFwICMxIHRvIGRlZ2VuZXJhdGUgdG8gZXhlZjBmIHx8dHJhcCMxIC4KLQkgICAgIFdlIGNhbid0IG1ha2UgJyMnIExFWF9JU19TWU1CT0xfQ09NUE9ORU5UIGJlY2F1c2UgaXQgaXMgYWxyZWFkeQotCSAgICAgTEVYX0lTX0xJTkVfQ09NTUVOVF9TVEFSVC4gIEhvd2V2ZXIsIGl0IGlzIHRoZSBvbmx5IGNoYXJhY3RlciBpbgotCSAgICAgbGluZV9jb21tZW50X2NoYXJzIGZvciBkMTB2LCBoZW5jZSB3ZSBjYW4gcmVjb2duaXplIGl0IGFzIHN1Y2guICAqLwotCSAgLyogQW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggd291bGQgYmUgdG8gcmVzZXQgdGhlIHN0YXRlIHRvIDEgd2hlbgotCSAgICAgd2Ugc2VlICd8fCcsICc8Jy0gb3IgJy0+JywgYnV0IHRoYXQgc2VlbXMgdG8gYmUgb3ZlcmtpbGwuICAqLwotCSAgaWYgKHN0YXRlID09IDEwKSBQVVQgKCcgJyk7Ci0jZW5kaWYKLQkgIC8qIFdlIGhhdmUgYSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIHdoaWNoIGlzIG5vdCBhdCB0aGUKLQkgICAgIHN0YXJ0IG9mIGEgbGluZS4gIElmIHRoaXMgaXMgYWxzbyBhIG5vcm1hbCBjb21tZW50Ci0JICAgICBjaGFyYWN0ZXIsIGZhbGwgdGhyb3VnaC4gIE90aGVyd2lzZSB0cmVhdCBpdCBhcyBhIGRlZmF1bHQKLQkgICAgIGNoYXJhY3Rlci4gICovCi0JICBpZiAoc3RyY2hyICh0Y19jb21tZW50X2NoYXJzLCBjaCkgPT0gTlVMTAotCSAgICAgICYmICghIHNjcnViX202OGtfbXJpCi0JCSAgfHwgKGNoICE9ICchJyAmJiBjaCAhPSAnKicpKSkKLQkgICAgZ290byBkZV9mYXVsdDsKLQkgIGlmIChzY3J1Yl9tNjhrX21yaQotCSAgICAgICYmIChjaCA9PSAnIScgfHwgY2ggPT0gJyonIHx8IGNoID09ICcjJykKLQkgICAgICAmJiBzdGF0ZSAhPSAxCi0JICAgICAgJiYgc3RhdGUgIT0gMTApCi0JICAgIGdvdG8gZGVfZmF1bHQ7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWNhc2UgTEVYX0lTX0NPTU1FTlRfU1RBUlQ6Ci0jaWYgZGVmaW5lZCBUQ19BUk0gJiYgZGVmaW5lZCBPQkpfRUxGCi0JICAvKiBPbiB0aGUgQVJNLCBgQCcgaXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyLgotCSAgICAgVW5mb3J0dW5hdGVseSB0aGlzIGlzIGFsc28gYSBzcGVjaWFsIGNoYXJhY3RlciBpbiBFTEYgLnN5bXZlcgotCSAgICAgZGlyZWN0aXZlcyAoYW5kIC50eXBlLCB0aG91Z2ggd2UgZGVhbCB3aXRoIHRob3NlIGFub3RoZXIgd2F5KS4gIFNvCi0JICAgICB3ZSBjaGVjayBpZiB0aGlzIGxpbmUgaXMgc3VjaCBhIGRpcmVjdGl2ZSwgYW5kIHRyZWF0IHRoZSBjaGFyYWN0ZXIKLQkgICAgIGFzIGRlZmF1bHQgaWYgc28uICBUaGlzIGlzIGEgaGFjay4gICovCi0JICBpZiAoKHN5bXZlcl9zdGF0ZSAhPSBOVUxMKSAmJiAoKnN5bXZlcl9zdGF0ZSA9PSAwKSkKLQkgICAgZ290byBkZV9mYXVsdDsKLSNlbmRpZgotCSAgZG8KLQkgICAgewotCSAgICAgIGNoID0gR0VUICgpOwotCSAgICB9Ci0JICB3aGlsZSAoY2ggIT0gRU9GICYmICFJU19ORVdMSU5FIChjaCkpOwotCSAgaWYgKGNoID09IEVPRikKLQkgICAgYXNfd2FybiAoXygiZW5kIG9mIGZpbGUgaW4gY29tbWVudDsgbmV3bGluZSBpbnNlcnRlZCIpKTsKLQkgIHN0YXRlID0gMDsKLQkgIFBVVCAoJ1xuJyk7Ci0JICBicmVhazsKLQotCWNhc2UgTEVYX0lTX1NZTUJPTF9DT01QT05FTlQ6Ci0JICBpZiAoc3RhdGUgPT0gMTApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIGNoYXJhY3RlciBmb2xsb3dpbmcgYW5vdGhlciBzeW1ib2wKLQkJIGNoYXJhY3Rlciwgd2l0aCB3aGl0ZXNwYWNlIGluIGJldHdlZW4uICBXZSBza2lwcGVkCi0JCSB0aGUgd2hpdGVzcGFjZSBlYXJsaWVyLCBzbyBvdXRwdXQgaXQgbm93LiAgKi8KLQkgICAgICBVTkdFVCAoY2gpOwotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgICBQVVQgKCcgJyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKHN0YXRlID09IDMpCi0JICAgIHN0YXRlID0gOTsKLQotCSAgLyogVGhpcyBpcyBhIGNvbW1vbiBjYXNlLiAgUXVpY2tseSBjb3B5IENIIGFuZCBhbGwgdGhlCi0gICAgICAgICAgICAgZm9sbG93aW5nIHN5bWJvbCBjb21wb25lbnQgb3Igbm9ybWFsIGNoYXJhY3RlcnMuICAqLwotCSAgaWYgKHRvICsgMSA8IHRvZW5kCi0JICAgICAgJiYgbXJpX3N0YXRlID09IE5VTEwKLSNpZiBkZWZpbmVkIFRDX0FSTSAmJiBkZWZpbmVkIE9CSl9FTEYKLQkgICAgICAmJiBzeW12ZXJfc3RhdGUgPT0gTlVMTAotI2VuZGlmCi0JICAgICAgKQotCSAgICB7Ci0JICAgICAgY2hhciAqczsKLQkgICAgICBpbnQgbGVuOwotCi0JICAgICAgZm9yIChzID0gZnJvbTsgcyA8IGZyb21lbmQ7IHMrKykKLQkJewotCQkgIGludCB0eXBlOwotCi0JCSAgY2gyID0gKiAodW5zaWduZWQgY2hhciAqKSBzOwotCQkgIHR5cGUgPSBsZXhbY2gyXTsKLQkJICBpZiAodHlwZSAhPSAwCi0JCSAgICAgICYmIHR5cGUgIT0gTEVYX0lTX1NZTUJPTF9DT01QT05FTlQpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgIGlmIChzID4gZnJvbSkKLQkJewotCQkgIC8qIEhhbmRsZSB0aGUgbGFzdCBjaGFyYWN0ZXIgbm9ybWFsbHksIGZvcgotICAgICAgICAgICAgICAgICAgICAgc2ltcGxpY2l0eS4gICovCi0JCSAgLS1zOwotCQl9Ci0JICAgICAgbGVuID0gcyAtIGZyb207Ci0JICAgICAgaWYgKGxlbiA+ICh0b2VuZCAtIHRvKSAtIDEpCi0JCWxlbiA9ICh0b2VuZCAtIHRvKSAtIDE7Ci0JICAgICAgaWYgKGxlbiA+IDApCi0JCXsKLQkJICBQVVQgKGNoKTsKLQkJICBpZiAobGVuID4gOCkKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5ICh0bywgZnJvbSwgbGVuKTsKLQkJICAgICAgdG8gKz0gbGVuOwotCQkgICAgICBmcm9tICs9IGxlbjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIHN3aXRjaCAobGVuKQotCQkJewotCQkJY2FzZSA4OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDc6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgNjogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSA1OiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDQ6ICp0bysrID0gKmZyb20rKzsKLQkJCWNhc2UgMzogKnRvKysgPSAqZnJvbSsrOwotCQkJY2FzZSAyOiAqdG8rKyA9ICpmcm9tKys7Ci0JCQljYXNlIDE6ICp0bysrID0gKmZyb20rKzsKLQkJCX0KLQkJICAgIH0gCi0JCSAgY2ggPSBHRVQgKCk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWRlZmF1bHQ6Ci0JZGVfZmF1bHQ6Ci0JICAvKiBTb21lIHJlbGF0aXZlbHkgYG5vcm1hbCcgY2hhcmFjdGVyLiAgKi8KLQkgIGlmIChzdGF0ZSA9PSAwKQotCSAgICB7Ci0JICAgICAgc3RhdGUgPSAxMTsJLyogTm93IHNlZWluZyBsYWJlbCBkZWZpbml0aW9uICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDEpCi0JICAgIHsKLQkgICAgICBzdGF0ZSA9IDI7CS8qIERpdHRvICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0YXRlID09IDkpCi0JICAgIHsKLQkgICAgICBpZiAobGV4W2NoXSAhPSBMRVhfSVNfU1lNQk9MX0NPTVBPTkVOVCkKLQkJc3RhdGUgPSAzOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdGF0ZSA9PSAxMCkKLQkgICAgewotCSAgICAgIHN0YXRlID0gMzsKLQkgICAgfQotCSAgUFVUIChjaCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qTk9UUkVBQ0hFRCovCi0KLSBmcm9tZW9mOgotICAvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICAqLwotICByZXR1cm4gdG8gLSB0b3N0YXJ0OwotCi0gdG9mdWxsOgotICAvKiBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsLiAgU2F2ZSBhbnkgaW5wdXQgd2UgaGF2ZSBub3QgeWV0Ci0gICAgIHByb2Nlc3NlZC4gICovCi0gIGlmIChmcm9tZW5kID4gZnJvbSkKLSAgICB7Ci0gICAgICBzYXZlZF9pbnB1dCA9IGZyb207Ci0gICAgICBzYXZlZF9pbnB1dF9sZW4gPSBmcm9tZW5kIC0gZnJvbTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzYXZlZF9pbnB1dCA9IE5VTEw7Ci0KLSAgcmV0dXJuIHRvIC0gdG9zdGFydDsKLX0KLQotLyogZW5kIG9mIGFwcC5jICovCmRpZmYgLS1naXQgYS9nYXMvYXMuYyBiL2dhcy9hcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdhM2ZlLi4wMDAwMDAwCi0tLSBhL2dhcy9hcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxOSArMCwwIEBACi0vKiBhcy5jIC0gR0FTIG1haW4gcHJvZ3JhbS4KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoKLSAqIE1haW4gcHJvZ3JhbSBmb3IgQVM7IGEgMzItYml0IGFzc2VtYmxlciBvZiBHTlUuCi0gKiBVbmRlcnN0YW5kcyBjb21tYW5kIGFyZ3VtZW50cy4KLSAqIEhhcyBhIGZldyByb3V0aW5lcyB0aGF0IGRvbid0IGZpdCBpbiBvdGhlciBtb2R1bGVzIGJlY2F1c2UgdGhleQotICogYXJlIHNoYXJlZC4KLSAqCi0gKgotICoJCQlidWdzCi0gKgotICogOiBpbml0aWFsaXNlcnMKLSAqCVNpbmNlIG5vLW9uZSBlbHNlIHNheXMgdGhleSB3aWxsIHN1cHBvcnQgdGhlbSBpbiBmdXR1cmU6IEkKLSAqIGRvbid0IHN1cHBvcnQgdGhlbSBub3cuCi0gKgotICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jZGVmaW5lIENPTU1PTgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3V0cHV0LWZpbGUuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0KLSNpZmRlZiBIQVZFX0lUQkxfQ1BVCi0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLSNlbHNlCi0jZGVmaW5lIGl0YmxfcGFyc2UoaXRibF9maWxlKSAxCi0jZGVmaW5lIGl0YmxfaW5pdCgpCi0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU0JSSwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotZXh0ZXJuIFBUUiBzYnJrICgpOwotI2VuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgc2hvd191c2FnZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIHBhcnNlX2FyZ3MgUEFSQU1TICgoaW50ICosIGNoYXIgKioqKSk7Ci1zdGF0aWMgdm9pZCBkdW1wX3N0YXRpc3RpY3MgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzIFBBUkFNUyAoKGludCBhcmdjLCBjaGFyICoqYXJndikpOwotc3RhdGljIGludCBtYWNyb19leHByIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotCi1pbnQgbGlzdGluZzsJCQkvKiB0cnVlIGlmIGEgbGlzdGluZyBpcyB3YW50ZWQgKi8KLQotc3RhdGljIGNoYXIgKmxpc3RpbmdfZmlsZW5hbWUgPSBOVUxMOwkvKiBOYW1lIG9mIGxpc3RpbmcgZmlsZS4gICovCi0KLS8qIFR5cGUgb2YgZGVidWdnaW5nIHRvIGdlbmVyYXRlLiAgKi8KLQotZW51bSBkZWJ1Z19pbmZvX3R5cGUgZGVidWdfdHlwZSA9IERFQlVHX05PTkU7Ci0KLS8qIE1heGltdW0gbGV2ZWwgb2YgbWFjcm8gbmVzdGluZy4gICovCi0KLWludCBtYXhfbWFjcm9fbmVzdCA9IDEwMDsKLQotY2hhciAqbXluYW1lOwkJCS8qIGFyZ3ZbMF0gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zZWdUIHJlZ19zZWN0aW9uLCBleHByX3NlY3Rpb247Ci1zZWdUIHRleHRfc2VjdGlvbiwgZGF0YV9zZWN0aW9uLCBic3Nfc2VjdGlvbjsKLSNlbmRpZgotCi0vKiBUaGUgZGVmYXVsdCBvYnN0YWNrIGNodW5rIHNpemUuICBJZiB3ZSBzZXQgdGhpcyB0byB6ZXJvLCB0aGUKLSAgIG9ic3RhY2sgY29kZSB3aWxsIHVzZSB3aGF0ZXZlciB3aWxsIGZpdCBpbiBhIDQwOTYgYnl0ZSBibG9jay4gICovCi1pbnQgY2h1bmtzaXplID0gMDsKLQotLyogVG8gbW9uaXRvciBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmVjdGl2ZWx5LCBtYWtlIHRoaXMgbm9uLXplcm8uCi0gICBUaGVuIHRoZSBjaHVuayBzaXplcyBmb3IgZ2FzIGFuZCBiZmQgd2lsbCBiZSByZWR1Y2VkLiAgKi8KLWludCBkZWJ1Z19tZW1vcnkgPSAwOwotCi0vKiBXZSBidWlsZCBhIGxpc3Qgb2YgZGVmc3ltcyBhcyB3ZSByZWFkIHRoZSBvcHRpb25zLCBhbmQgdGhlbiBkZWZpbmUKLSAgIHRoZW0gYWZ0ZXIgd2UgaGF2ZSBpbml0aWFsaXplZCBldmVyeXRoaW5nLiAgKi8KLQotc3RydWN0IGRlZnN5bV9saXN0Ci17Ci0gIHN0cnVjdCBkZWZzeW1fbGlzdCAqbmV4dDsKLSAgY2hhciAqbmFtZTsKLSAgdmFsdWVUIHZhbHVlOwotfTsKLQotc3RhdGljIHN0cnVjdCBkZWZzeW1fbGlzdCAqZGVmc3ltczsKLQotLyogS2VlcCBhIHJlY29yZCBvZiB0aGUgaXRibCBmaWxlcyB3ZSByZWFkIGluLiAqLwotCi1zdHJ1Y3QgaXRibF9maWxlX2xpc3QKLXsKLSAgc3RydWN0IGl0YmxfZmlsZV9saXN0ICpuZXh0OwotICBjaGFyICpuYW1lOwotfTsKLQotc3RhdGljIHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqaXRibF9maWxlczsKLQwKLXZvaWQKLXByaW50X3ZlcnNpb25faWQgKCkKLXsKLSAgc3RhdGljIGludCBwcmludGVkOwotICBpZiAocHJpbnRlZCkKLSAgICByZXR1cm47Ci0gIHByaW50ZWQgPSAxOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmcHJpbnRmIChzdGRlcnIsIF8oIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIHVzaW5nIEJGRCB2ZXJzaW9uICVzIiksCi0JICAgVkVSU0lPTiwgVEFSR0VUX0FMSUFTLCBCRkRfVkVSU0lPTik7Ci0jZWxzZQotICBmcHJpbnRmIChzdGRlcnIsIF8oIkdOVSBhc3NlbWJsZXIgdmVyc2lvbiAlcyAoJXMpIiksIFZFUlNJT04sIFRBUkdFVF9BTElBUyk7Ci0jZW5kaWYKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlVzYWdlOiAlcyBbb3B0aW9uLi4uXSBbYXNtZmlsZS4uLl1cbiIpLCBteW5hbWUpOwotCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotT3B0aW9uczpcblwKLSAgLWFbc3ViLW9wdGlvbi4uLl0JdHVybiBvbiBsaXN0aW5nc1xuXAotICAgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG5cCi0gICAgYyAgIG9taXQgZmFsc2UgY29uZGl0aW9uYWxzXG5cCi0gICAgZCAgIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXNcblwKLSAgICBoICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuXAotICAgIGwgICBpbmNsdWRlIGFzc2VtYmx5XG5cCi0gICAgbSAgIGluY2x1ZGUgbWFjcm8gZXhwYW5zaW9uc1xuXAotICAgIG4gICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcblwKLSAgICBzICAgaW5jbHVkZSBzeW1ib2xzXG5cCi0gICAgTCAgIGluY2x1ZGUgbGluZSBkZWJ1ZyBzdGF0aXN0aWNzIChpZiBhcHBsaWNhYmxlKVxuXAotICAgID1maWxlIHNldCBsaXN0aW5nIGZpbGUgbmFtZSAobXVzdCBiZSBsYXN0IHN1Yi1vcHRpb24pXG4iKSk7Ci0gIAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLUQJCSAgICAgICAgICBwcm9kdWNlIGFzc2VtYmxlciBkZWJ1Z2dpbmcgbWVzc2FnZXNcblwKLSAgLS1kZWZzeW0gU1lNPVZBTCAgICAgICAgZGVmaW5lIHN5bWJvbCBTWU0gdG8gZ2l2ZW4gdmFsdWVcblwKLSAgLWYJCSAgICAgICAgICBza2lwIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQgcHJlcHJvY2Vzc2luZ1xuXAotICAtLWdzdGFicwkgICAgICAgICAgZ2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uXG5cCi0gIC0taGVscAkJICBzaG93IHRoaXMgbWVzc2FnZSBhbmQgZXhpdFxuXAotICAtSSBESVIJCSAgYWRkIERJUiB0byBzZWFyY2ggbGlzdCBmb3IgLmluY2x1ZGUgZGlyZWN0aXZlc1xuXAotICAtSgkJICAgICAgICAgIGRvbid0IHdhcm4gYWJvdXQgc2lnbmVkIG92ZXJmbG93XG5cCi0gIC1LCQkgICAgICAgICAgd2FybiB3aGVuIGRpZmZlcmVuY2VzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuXAotICAtTCwtLWtlZXAtbG9jYWxzICAgICAgICBrZWVwIGxvY2FsIHN5bWJvbHMgKGUuZy4gc3RhcnRpbmcgd2l0aCBgTCcpXG4iKSk7Ci0gIAotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLU0sLS1tcmkJICAgICAgICAgIGFzc2VtYmxlIGluIE1SSSBjb21wYXRpYmlsaXR5IG1vZGVcblwKLSAgLS1NRCBGSUxFCSAgICAgICAgICB3cml0ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIGluIEZJTEUgKGRlZmF1bHQgbm9uZSlcblwKLSAgLW5vY3BwCQkgIGlnbm9yZWRcblwKLSAgLW8gT0JKRklMRQkgICAgICAgICAgbmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IE9CSkZJTEUgKGRlZmF1bHQgYS5vdXQpXG5cCi0gIC1SCQkgICAgICAgICAgZm9sZCBkYXRhIHNlY3Rpb24gaW50byB0ZXh0IHNlY3Rpb25cblwKLSAgLS1zdGF0aXN0aWNzCSAgICAgICAgICBwcmludCB2YXJpb3VzIG1lYXN1cmVkIHN0YXRpc3RpY3MgZnJvbSBleGVjdXRpb25cblwKLSAgLS1zdHJpcC1sb2NhbC1hYnNvbHV0ZSAgc3RyaXAgbG9jYWwgYWJzb2x1dGUgc3ltYm9sc1xuXAotICAtLXRyYWRpdGlvbmFsLWZvcm1hdAkgIFVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyIHdoZW4gcG9zc2libGVcblwKLSAgLS12ZXJzaW9uCQkgIHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuXAotICAtVwkJCSAgc3VwcHJlc3Mgd2FybmluZ3NcblwKLSAgLS1pdGJsIElOU1RUQkwJICBleHRlbmQgaW5zdHJ1Y3Rpb24gc2V0IHRvIGluY2x1ZGUgaW5zdHJ1Y3Rpb25zXG5cCi0JCQkgIG1hdGNoaW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBkZWZpbmVkIGluIGZpbGUgSU5TVFRCTFxuXAotICAtdwkJCSAgaWdub3JlZFxuXAotICAtWAkJCSAgaWdub3JlZFxuXAotICAtWgkJCSAgZ2VuZXJhdGUgb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnNcbiIpKTsKLSAgCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtLWxpc3RpbmctbGhzLXdpZHRoCSAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mXG5cCi0JCQkgIHRoZSBsaXN0aW5nXG5cCi0gIC0tbGlzdGluZy1saHMtd2lkdGgyCSAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgY29udGludWF0aW9uIGxpbmVzXG5cCi0JCQkgIG9mIHRoZSBvdXRwdXQgZGF0YSBjb2x1bW47IGlnbm9yZWQgaWYgc21hbGxlciB0aGFuXG5cCi0JCQkgIHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgbGluZVxuXAotICAtLWxpc3RpbmctcmhzLXdpZHRoCSAgc2V0IHRoZSBtYXggd2lkdGggaW4gY2hhcmFjdGVycyBvZiB0aGUgbGluZXMgZnJvbVxuXAotCQkJICB0aGUgc291cmNlIGZpbGVcblwKLSAgLS1saXN0aW5nLWNvbnQtbGluZXMJICBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB1c2VkXG5cCi0JCQkgIGZvciB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mIHRoZSBsaXN0aW5nXG4iKSk7Ci0KLSAgbWRfc2hvd191c2FnZSAoc3RyZWFtKTsKLQotICBmcHJpbnRmIChzdHJlYW0sIF8oIlxuUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iKSk7Ci19Ci0KLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotI2RlZmluZSBFTVVMQVRJT05fRU5WSVJPTiAiQVNfRU1VTEFUSU9OIgotCi1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBtaXBzYmVsZiwgbWlwc2xlbGYsIG1pcHNlbGY7Ci1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBtaXBzYmVjb2ZmLCBtaXBzbGVjb2ZmLCBtaXBzZWNvZmY7Ci1leHRlcm4gc3RydWN0IGVtdWxhdGlvbiBpMzg2Y29mZiwgaTM4NmVsZjsKLQotc3RhdGljIHN0cnVjdCBlbXVsYXRpb24gKmNvbnN0IGVtdWxhdGlvbnNbXSA9IHsgRU1VTEFUSU9OUyB9Owotc3RhdGljIGNvbnN0IGludCBuX2VtdWxhdGlvbnMgPSBzaXplb2YgKGVtdWxhdGlvbnMpIC8gc2l6ZW9mIChlbXVsYXRpb25zWzBdKTsKLQotc3RhdGljIHZvaWQgc2VsZWN0X2VtdWxhdGlvbl9tb2RlIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi1zdGF0aWMgdm9pZAotc2VsZWN0X2VtdWxhdGlvbl9tb2RlIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBpOwotICBjaGFyICpwLCAqZW0gPSAwOwotCi0gIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCi0gICAgaWYgKCFzdHJuY21wICgiLS1lbSIsIGFyZ3ZbaV0sIDQpKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGkgPT0gYXJnYykKLSAgICBnb3RvIGRvX2RlZmF1bHQ7Ci0KLSAgcCA9IHN0cmNociAoYXJndltpXSwgJz0nKTsKLSAgaWYgKHApCi0gICAgcCsrOwotICBlbHNlCi0gICAgcCA9IGFyZ3ZbaSsxXTsKLQotICBpZiAoIXAgfHwgISpwKQotICAgIGFzX2ZhdGFsIChfKCJtaXNzaW5nIGVtdWxhdGlvbiBtb2RlIG5hbWUiKSk7Ci0gIGVtID0gcDsKLQotIGRvX2RlZmF1bHQ6Ci0gIGlmIChlbSA9PSAwKQotICAgIGVtID0gZ2V0ZW52IChFTVVMQVRJT05fRU5WSVJPTik7Ci0gIGlmIChlbSA9PSAwKQotICAgIGVtID0gREVGQVVMVF9FTVVMQVRJT047Ci0KLSAgaWYgKGVtKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2VtdWxhdGlvbnM7IGkrKykKLQlpZiAoIXN0cmNtcCAoZW11bGF0aW9uc1tpXS0+bmFtZSwgZW0pKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaSA9PSBuX2VtdWxhdGlvbnMpCi0JYXNfZmF0YWwgKF8oInVucmVjb2duaXplZCBlbXVsYXRpb24gbmFtZSBgJXMnIiksIGVtKTsKLSAgICAgIHRoaXNfZW11bGF0aW9uID0gZW11bGF0aW9uc1tpXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB0aGlzX2VtdWxhdGlvbiA9IGVtdWxhdGlvbnNbMF07Ci0KLSAgdGhpc19lbXVsYXRpb24tPmluaXQgKCk7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZGVmYXVsdF9lbXVsX2JmZF9uYW1lICgpCi17Ci0gIGFib3J0ICgpOwotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotY29tbW9uX2VtdWxfaW5pdCAoKQotewotICB0aGlzX2Zvcm1hdCA9IHRoaXNfZW11bGF0aW9uLT5mb3JtYXQ7Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUgPT0gMikKLSAgICB0aGlzX2VtdWxhdGlvbi0+bGVhZGluZ191bmRlcnNjb3JlID0gdGhpc19mb3JtYXQtPmRmbF9sZWFkaW5nX3VuZGVyc2NvcmU7Ci0KLSAgaWYgKHRoaXNfZW11bGF0aW9uLT5kZWZhdWx0X2VuZGlhbiAhPSAyKQotICAgIHRhcmdldF9iaWdfZW5kaWFuID0gdGhpc19lbXVsYXRpb24tPmRlZmF1bHRfZW5kaWFuOwotCi0gIGlmICh0aGlzX2VtdWxhdGlvbi0+ZmFrZV9sYWJlbF9uYW1lID09IDApCi0gICAgewotICAgICAgaWYgKHRoaXNfZW11bGF0aW9uLT5sZWFkaW5nX3VuZGVyc2NvcmUpCi0JdGhpc19lbXVsYXRpb24tPmZha2VfbGFiZWxfbmFtZSA9ICJMMFwwMDEiOwotICAgICAgZWxzZQotCS8qIFdoYXQgb3RoZXIgcGFyYW1ldGVycyBzaG91bGQgd2UgdGVzdD8gICovCi0JdGhpc19lbXVsYXRpb24tPmZha2VfbGFiZWxfbmFtZSA9ICIuTDBcMDAxIjsKLSAgICB9Ci19Ci0jZW5kaWYKLQotLyoKLSAqIFNpbmNlIGl0IGlzIGVhc3kgdG8gZG8gaGVyZSB3ZSBpbnRlcnByZXQgdGhlIHNwZWNpYWwgYXJnICItIgotICogdG8gbWVhbiAidXNlIHN0ZGluIiBhbmQgd2Ugc2V0IHRoYXQgYXJndltdIHBvaW50aW5nIHRvICIiLgotICogQWZ0ZXIgd2UgaGF2ZSBtdW5nZWQgYXJndltdLCB0aGUgb25seSB0aGluZ3MgbGVmdCBhcmUgc291cmNlIGZpbGUKLSAqIG5hbWUocykgYW5kICIiKHMpIGRlbm90aW5nIHN0ZGluLiBUaGVzZSBmaWxlIG5hbWVzIGFyZSB1c2VkCi0gKiAocGVyaGFwcyBtb3JlIHRoYW4gb25jZSkgbGF0ZXIuCi0gKgotICogY2hlY2sgZm9yIG5ldyBtYWNoaW5lLWRlcCBjbWRsaW5lIG9wdGlvbnMgaW4KLSAqIG1kX3BhcnNlX29wdGlvbiBkZWZpbml0aW9ucyBpbiBjb25maWcvdGMtKi5jCi0gKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX2FyZ3MgKHBhcmdjLCBwYXJndikKLSAgICAgaW50ICpwYXJnYzsKLSAgICAgY2hhciAqKipwYXJndjsKLXsKLSAgaW50IG9sZF9hcmdjLCBuZXdfYXJnYzsKLSAgY2hhciAqKm9sZF9hcmd2LCAqKm5ld19hcmd2OwotCi0gIC8qIFN0YXJ0aW5nIHRoZSBzaG9ydCBvcHRpb24gc3RyaW5nIHdpdGggJy0nIGlzIGZvciBwcm9ncmFtcyB0aGF0Ci0gICAgIGV4cGVjdCBvcHRpb25zIGFuZCBvdGhlciBBUkdWLWVsZW1lbnRzIGluIGFueSBvcmRlciBhbmQgdGhhdCBjYXJlIGFib3V0Ci0gICAgIHRoZSBvcmRlcmluZyBvZiB0aGUgdHdvLiAgV2UgZGVzY3JpYmUgZWFjaCBub24tb3B0aW9uIEFSR1YtZWxlbWVudAotICAgICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLiAgKi8KLQotICBjaGFyICpzaG9ydG9wdHM7Ci0gIGV4dGVybiBDT05TVCBjaGFyICptZF9zaG9ydG9wdHM7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIHN0ZF9zaG9ydG9wdHNbXSA9Ci0gICAgewotICAgICAgJy0nLCAnSicsCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAgIC8qIC1LIGlzIG5vdCBtZWFuaW5nZnVsIGlmIC53b3JkIGlzIG5vdCBiZWluZyBoYWNrZWQuICAqLwotICAgICAgJ0snLAotI2VuZGlmCi0gICAgICAnTCcsICdNJywgJ1InLCAnVycsICdaJywgJ2YnLCAnYScsICc6JywgJzonLCAnRCcsICdJJywgJzonLCAnbycsICc6JywKLSNpZm5kZWYgVk1TCi0gICAgICAvKiAtdiB0YWtlcyBhbiBhcmd1bWVudCBvbiBWTVMsIHNvIHdlIGRvbid0IG1ha2UgaXQgYSBnZW5lcmljCi0gICAgICAgICBvcHRpb24uICAqLwotICAgICAgJ3YnLAotI2VuZGlmCi0gICAgICAndycsICdYJywKLSAgICAgIC8qIE5ldyBvcHRpb24gZm9yIGV4dGVuZGluZyBpbnN0cnVjdGlvbiBzZXQgKHNlZSBhbHNvIC0taXRibCBiZWxvdykgKi8KLSAgICAgICd0JywgJzonLAotICAgICAgJ1wwJwotICAgIH07Ci0gIHN0cnVjdCBvcHRpb24gKmxvbmdvcHRzOwotICBleHRlcm4gc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdOwotICBleHRlcm4gc2l6ZV90IG1kX2xvbmdvcHRzX3NpemU7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIHN0ZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fSEVMUCAoT1BUSU9OX1NURF9CQVNFKQotICAgIHsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVMUH0sCi0gICAgeyJrZWVwLWxvY2FscyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTCd9LAotICAgIHsibXJpIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCi0jZGVmaW5lIE9QVElPTl9OT0NQUCAoT1BUSU9OX1NURF9CQVNFICsgMSkKLSAgICB7Im5vY3BwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT0NQUH0sCi0jZGVmaW5lIE9QVElPTl9TVEFUSVNUSUNTIChPUFRJT05fU1REX0JBU0UgKyAyKQotICAgIHsic3RhdGlzdGljcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBVElTVElDU30sCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OIChPUFRJT05fU1REX0JBU0UgKyAzKQotICAgIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVkVSU0lPTn0sCi0jZGVmaW5lIE9QVElPTl9EVU1QQ09ORklHIChPUFRJT05fU1REX0JBU0UgKyA0KQotICAgIHsiZHVtcC1jb25maWciLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RVTVBDT05GSUd9LAotI2RlZmluZSBPUFRJT05fVkVSQk9TRSAoT1BUSU9OX1NURF9CQVNFICsgNSkKLSAgICB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotI2RlZmluZSBPUFRJT05fRU1VTEFUSU9OIChPUFRJT05fU1REX0JBU0UgKyA2KQotICAgIHsiZW11bGF0aW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTVVMQVRJT059LAotI2RlZmluZSBPUFRJT05fREVGU1lNIChPUFRJT05fU1REX0JBU0UgKyA3KQotICAgIHsiZGVmc3ltIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERUZTWU19LAotI2RlZmluZSBPUFRJT05fSU5TVFRCTCAoT1BUSU9OX1NURF9CQVNFICsgOCkKLSAgICAvKiBOZXcgb3B0aW9uIGZvciBleHRlbmRpbmcgaW5zdHJ1Y3Rpb24gc2V0IChzZWUgYWxzbyAtdCBhYm92ZSkuCi0gICAgICAgVGhlICItdCBmaWxlIiBvciAiLS1pdGJsIGZpbGUiIG9wdGlvbiBleHRlbmRzIHRoZSBiYXNpYyBzZXQgb2YKLSAgICAgICB2YWxpZCBpbnN0cnVjdGlvbnMgYnkgcmVhZGluZyAiZmlsZSIsIGEgdGV4dCBmaWxlIGNvbnRhaW5pbmcgYQotICAgICAgIGxpc3Qgb2YgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIFRoZSBhZGRpdGlvbmFsIG9wY29kZXMgYW5kIHRoZWlyCi0gICAgICAgZm9ybWF0cyBhcmUgYWRkZWQgdG8gdGhlIGJ1aWx0LWluIHNldCBvZiBpbnN0cnVjdGlvbnMsIGFuZAotICAgICAgIG1uZW1vbmljcyBmb3IgbmV3IHJlZ2lzdGVycyBtYXkgYWxzbyBiZSBkZWZpbmVkLiAgKi8KLSAgICB7Iml0YmwiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lOU1RUQkx9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDkpCi0gICAgeyJsaXN0aW5nLWxocy13aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTElTVElOR19MSFNfV0lEVEh9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyIChPUFRJT05fU1REX0JBU0UgKyAxMCkKLSAgICB7Imxpc3RpbmctbGhzLXdpZHRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSVNUSU5HX0xIU19XSURUSDJ9LAotI2RlZmluZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEggKE9QVElPTl9TVERfQkFTRSArIDExKQotICAgIHsibGlzdGluZy1yaHMtd2lkdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfUkhTX1dJRFRIfSwKLSNkZWZpbmUgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUyAoT1BUSU9OX1NURF9CQVNFICsgMTIpCi0gICAgeyJsaXN0aW5nLWNvbnQtbGluZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FU30sCi0jZGVmaW5lIE9QVElPTl9ERVBGSUxFIChPUFRJT05fU1REX0JBU0UgKyAxMykKLSAgICB7Ik1EIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9ERVBGSUxFfSwKLSNkZWZpbmUgT1BUSU9OX0dTVEFCUyAoT1BUSU9OX1NURF9CQVNFICsgMTQpCi0gICAgeyJnc3RhYnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dTVEFCU30sCi0jZGVmaW5lIE9QVElPTl9TVFJJUF9MT0NBTF9BQlNPTFVURSAoT1BUSU9OX1NURF9CQVNFICsgMTUpCi0gICAgeyJzdHJpcC1sb2NhbC1hYnNvbHV0ZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RSSVBfTE9DQUxfQUJTT0xVVEV9LAotI2RlZmluZSBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUIChPUFRJT05fU1REX0JBU0UgKyAxNikKLSAgICB7InRyYWRpdGlvbmFsLWZvcm1hdCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUfSwKLSNkZWZpbmUgT1BUSU9OX0dEV0FSRjIgKE9QVElPTl9TVERfQkFTRSArIDE3KQotICAgIHsiZ2R3YXJmMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fR0RXQVJGMn0KLSAgfTsKLQotICAvKiBDb25zdHJ1Y3QgdGhlIG9wdGlvbiBsaXN0cyBmcm9tIHRoZSBzdGFuZGFyZCBsaXN0IGFuZCB0aGUKLSAgICAgdGFyZ2V0IGRlcGVuZGVudCBsaXN0LiAgKi8KLSAgc2hvcnRvcHRzID0gY29uY2F0IChzdGRfc2hvcnRvcHRzLCBtZF9zaG9ydG9wdHMsIChjaGFyICopIE5VTEwpOwotICBsb25nb3B0cyA9IChzdHJ1Y3Qgb3B0aW9uICopIHhtYWxsb2MgKHNpemVvZiAoc3RkX2xvbmdvcHRzKSArIG1kX2xvbmdvcHRzX3NpemUpOwotICBtZW1jcHkgKGxvbmdvcHRzLCBzdGRfbG9uZ29wdHMsIHNpemVvZiAoc3RkX2xvbmdvcHRzKSk7Ci0gIG1lbWNweSAoKGNoYXIgKikgbG9uZ29wdHMgKyBzaXplb2YgKHN0ZF9sb25nb3B0cyksCi0JICBtZF9sb25nb3B0cywgbWRfbG9uZ29wdHNfc2l6ZSk7Ci0KLSAgLyogTWFrZSBhIGxvY2FsIGNvcHkgb2YgdGhlIG9sZCBhcmd2LiAgKi8KLSAgb2xkX2FyZ2MgPSAqcGFyZ2M7Ci0gIG9sZF9hcmd2ID0gKnBhcmd2OwotCi0gIC8qIEluaXRpYWxpemUgYSBuZXcgYXJndiB0aGF0IGNvbnRhaW5zIG5vIG9wdGlvbnMuICAqLwotICBuZXdfYXJndiA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiAob2xkX2FyZ2MgKyAxKSk7Ci0gIG5ld19hcmd2WzBdID0gb2xkX2FyZ3ZbMF07Ci0gIG5ld19hcmdjID0gMTsKLSAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICAvKiBnZXRvcHRfbG9uZ19vbmx5IGlzIGxpa2UgZ2V0b3B0X2xvbmcsIGJ1dCAnLScgYXMgd2VsbCBhcyAnLS0nIGNhbgotCSBpbmRpY2F0ZSBhIGxvbmcgb3B0aW9uLiAgKi8KLSAgICAgIGludCBsb25naW5kOwotICAgICAgaW50IG9wdGMgPSBnZXRvcHRfbG9uZ19vbmx5IChvbGRfYXJnYywgb2xkX2FyZ3YsIHNob3J0b3B0cywgbG9uZ29wdHMsCi0JCQkJICAgJmxvbmdpbmQpOwotCi0gICAgICBpZiAob3B0YyA9PSAtMSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChvcHRjKQotCXsKLQlkZWZhdWx0OgotCSAgLyogbWRfcGFyc2Vfb3B0aW9uIHNob3VsZCByZXR1cm4gMSBpZiBpdCByZWNvZ25pemVzIG9wdGMsCi0JICAgICAwIGlmIG5vdC4gICovCi0JICBpZiAobWRfcGFyc2Vfb3B0aW9uIChvcHRjLCBvcHRhcmcpICE9IDApCi0JICAgIGJyZWFrOwotCSAgLyogYC12JyBpc24ndCBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhbCBzaG9ydF9vcHRzIGxpc3QsIHNvIGNoZWNrIGZvcgotCSAgICAgaXQgZXhwbGljaXR5IGhlcmUgYmVmb3JlIGRlY2lkaW5nIHdlJ3ZlIGdvdHRlbiBhIGJhZCBhcmd1bWVudC4gICovCi0JICBpZiAob3B0YyA9PSAndicpCi0JICAgIHsKLSNpZmRlZiBWTVMKLQkgICAgICAvKiBUZWxsaW5nIGdldG9wdCB0byB0cmVhdCAtdidzIHZhbHVlIGFzIG9wdGlvbmFsIGNhbiByZXN1bHQKLQkJIGluIGl0IHBpY2tpbmcgdXAgYSBmb2xsb3dpbmcgZmlsZW5hbWUgYXJndW1lbnQgaGVyZS4gIFRoZQotCQkgVk1TIGNvZGUgaW4gbWRfcGFyc2Vfb3B0aW9uIGNhbiByZXR1cm4gMCBpbiB0aGF0IGNhc2UsCi0JCSBidXQgaXQgaGFzIG5vIHdheSBvZiBwdXNoaW5nIHRoZSBmaWxlbmFtZSBhcmd1bWVudCBiYWNrLiAgKi8KLQkgICAgICBpZiAob3B0YXJnICYmICpvcHRhcmcpCi0JCW5ld19hcmd2W25ld19hcmdjKytdID0gb3B0YXJnLCAgbmV3X2FyZ3ZbbmV3X2FyZ2NdID0gTlVMTDsKLQkgICAgICBlbHNlCi0jZWxzZQotCSAgICAgIGNhc2UgJ3YnOgotI2VuZGlmCi0JICAgICAgY2FzZSBPUFRJT05fVkVSQk9TRToKLQkJcHJpbnRfdmVyc2lvbl9pZCAoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLypGQUxMVEhSVSovCi0KLQljYXNlICc/JzoKLQkgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0KLQljYXNlIDE6CQkJLyogRmlsZSBuYW1lLiAgKi8KLQkgIGlmICghc3RyY21wIChvcHRhcmcsICItIikpCi0JICAgIG9wdGFyZyA9ICIiOwotCSAgbmV3X2FyZ3ZbbmV3X2FyZ2MrK10gPSBvcHRhcmc7Ci0JICBuZXdfYXJndltuZXdfYXJnY10gPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9IRUxQOgotCSAgc2hvd191c2FnZSAoc3Rkb3V0KTsKLQkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0KLQljYXNlIE9QVElPTl9OT0NQUDoKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fU1RBVElTVElDUzoKLQkgIGZsYWdfcHJpbnRfc3RhdGlzdGljcyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1NUUklQX0xPQ0FMX0FCU09MVVRFOgotCSAgZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZSA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVDoKLQkgIGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBhc3NlbWJsZXIgJXNcbiIpLCBWRVJTSU9OKTsKLQkgIHByaW50ZiAoXygiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iKSk7Ci0JICBwcmludGYgKF8oIlwKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCB1bmRlciB0aGUgdGVybXMgb2ZcblwKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIpKTsKLQkgIHByaW50ZiAoXygiVGhpcyBhc3NlbWJsZXIgd2FzIGNvbmZpZ3VyZWQgZm9yIGEgdGFyZ2V0IG9mIGAlcycuXG4iKSwKLQkJICBUQVJHRVRfQUxJQVMpOwotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX0VNVUxBVElPTjoKLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotCSAgaWYgKHN0cmNtcCAob3B0YXJnLCB0aGlzX2VtdWxhdGlvbi0+bmFtZSkpCi0JICAgIGFzX2ZhdGFsIChfKCJtdWx0aXBsZSBlbXVsYXRpb24gbmFtZXMgc3BlY2lmaWVkIikpOwotI2Vsc2UKLQkgIGFzX2ZhdGFsIChfKCJlbXVsYXRpb25zIG5vdCBoYW5kbGVkIGluIHRoaXMgY29uZmlndXJhdGlvbiIpKTsKLSNlbmRpZgotCSAgYnJlYWs7Ci0KLQljYXNlIE9QVElPTl9EVU1QQ09ORklHOgotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJhbGlhcyA9ICVzXG4iKSwgVEFSR0VUX0FMSUFTKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiY2Fub25pY2FsID0gJXNcbiIpLCBUQVJHRVRfQ0FOT05JQ0FMKTsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiY3B1LXR5cGUgPSAlc1xuIiksIFRBUkdFVF9DUFUpOwotI2lmZGVmIFRBUkdFVF9PQkpfRk9STUFUCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oImZvcm1hdCA9ICVzXG4iKSwgVEFSR0VUX09CSl9GT1JNQVQpOwotI2VuZGlmCi0jaWZkZWYgVEFSR0VUX0ZPUk1BVAotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJiZmQtdGFyZ2V0ID0gJXNcbiIpLCBUQVJHRVRfRk9STUFUKTsKLSNlbmRpZgotCSAgZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQotCWNhc2UgT1BUSU9OX0RFRlNZTToKLQkgIHsKLQkgICAgY2hhciAqczsKLQkgICAgbG9uZyBpOwotCSAgICBzdHJ1Y3QgZGVmc3ltX2xpc3QgKm47Ci0KLQkgICAgZm9yIChzID0gb3B0YXJnOyAqcyAhPSAnXDAnICYmICpzICE9ICc9JzsgcysrKQotCSAgICAgIDsKLQkgICAgaWYgKCpzID09ICdcMCcpCi0JICAgICAgYXNfZmF0YWwgKF8oImJhZCBkZWZzeW07IGZvcm1hdCBpcyAtLWRlZnN5bSBuYW1lPXZhbHVlIikpOwotCSAgICAqcysrID0gJ1wwJzsKLQkgICAgaSA9IHN0cnRvbCAocywgKGNoYXIgKiopIE5VTEwsIDApOwotCSAgICBuID0gKHN0cnVjdCBkZWZzeW1fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gZGVmc3ltczsKLQkgICAgbi0+bmFtZSA9IG9wdGFyZzsKLQkgICAgbi0+dmFsdWUgPSBpOwotCSAgICBkZWZzeW1zID0gbjsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSU5TVFRCTDoKLQljYXNlICd0JzoKLQkgIHsKLQkgICAgLyogb3B0YXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGluc3RydWN0aW9uIAotCSAgICAgICBmb3JtYXRzLCBvcGNvZGVzLCByZWdpc3RlciBuYW1lcywgZXRjLiAqLwotCSAgICBzdHJ1Y3QgaXRibF9maWxlX2xpc3QgKm47Ci0KLQkgICAgaWYgKG9wdGFyZyA9PSBOVUxMKQotCSAgICAgIHsKLQkJYXNfd2FybiAoIF8oIk5vIGZpbGUgbmFtZSBmb2xsb3dpbmcgLXQgb3B0aW9uXG4iKSApOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIAotCSAgICBuID0gKHN0cnVjdCBpdGJsX2ZpbGVfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCSAgICBuLT5uZXh0ID0gaXRibF9maWxlczsKLQkgICAgbi0+bmFtZSA9IG9wdGFyZzsKLQkgICAgaXRibF9maWxlcyA9IG47Ci0KLQkgICAgLyogUGFyc2UgdGhlIGZpbGUgYW5kIGFkZCB0aGUgbmV3IGluc3RydWN0aW9ucyB0byBvdXIgaW50ZXJuYWwKLQkgICAgICAgdGFibGUuICBJZiBtdWx0aXBsZSBpbnN0cnVjdGlvbiB0YWJsZXMgYXJlIHNwZWNpZmllZCwgdGhlIAotCSAgICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgdGFibGUgZ2V0cyBhcHBlbmRlZCBvbnRvIHRoZSBleGlzdGluZyAKLQkgICAgICAgaW50ZXJuYWwgdGFibGUuICovCi0JICAgIGl0YmxfZmlsZXMtPm5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotCSAgICBpZiAoaXRibF9wYXJzZSAoaXRibF9maWxlcy0+bmFtZSkgIT0gMCkKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0ZGVyciwgXygiRmFpbGVkIHRvIHJlYWQgaW5zdHJ1Y3Rpb24gdGFibGUgJXNcbiIpLCAKLQkJCSBpdGJsX2ZpbGVzLT5uYW1lKTsKLQkJZXhpdCAoRVhJVF9TVUNDRVNTKTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0RFUEZJTEU6Ci0JICBzdGFydF9kZXBlbmRlbmNpZXMgKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0dTVEFCUzoKLQkgIGRlYnVnX3R5cGUgPSBERUJVR19TVEFCUzsKLQkgIGJyZWFrOwotIAotCWNhc2UgT1BUSU9OX0dEV0FSRjI6Ci0JICBkZWJ1Z190eXBlID0gREVCVUdfRFdBUkYyOwotCSAgYnJlYWs7Ci0KLQljYXNlICdKJzoKLQkgIGZsYWdfc2lnbmVkX292ZXJmbG93X29rID0gMTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLQljYXNlICdLJzoKLQkgIGZsYWdfd2Fybl9kaXNwbGFjZW1lbnQgPSAxOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQotCWNhc2UgJ0wnOgotCSAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgT1BUSU9OX0xJU1RJTkdfTEhTX1dJRFRIOgotCSAgbGlzdGluZ19saHNfd2lkdGggPSBhdG9pKG9wdGFyZyk7Ci0JICBpZiAobGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIDwgbGlzdGluZ19saHNfd2lkdGgpCi0JICAgIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IGxpc3RpbmdfbGhzX3dpZHRoOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19MSFNfV0lEVEgyOgotCSAgewotCSAgICBpbnQgdG1wID0gYXRvaShvcHRhcmcpOwotCSAgICBpZiAodG1wID4gbGlzdGluZ19saHNfd2lkdGgpCi0JICAgICAgbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kID0gdG1wOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTElTVElOR19SSFNfV0lEVEg6Ci0JICBsaXN0aW5nX3Joc193aWR0aCA9IGF0b2kob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0xJU1RJTkdfQ09OVF9MSU5FUzoKLQkgIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMgPSBhdG9pKG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCSAgZmxhZ19tcmkgPSAxOwotI2lmZGVmIFRDX002OEsKLQkgIGZsYWdfbTY4a19tcmkgPSAxOwotI2VuZGlmCi0JICBicmVhazsKLQotCWNhc2UgJ1InOgotCSAgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdXJzoKLQkgIGZsYWdfbm9fd2FybmluZ3MgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdaJzoKLQkgIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dCA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ2EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHdoaWxlICgqb3B0YXJnKQotCQl7Ci0JCSAgc3dpdGNoICgqb3B0YXJnKQotCQkgICAgewotCQkgICAgY2FzZSAnYyc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19OT0NPTkQ7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnZCc6Ci0JCSAgICAgIGxpc3RpbmcgfD0gTElTVElOR19OT0RFQlVHOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2gnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfSExMOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2wnOgotCQkgICAgICBsaXN0aW5nIHw9IExJU1RJTkdfTElTVElORzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdtJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX01BQ0VYUDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICduJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX05PRk9STTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdzJzoKLQkJICAgICAgbGlzdGluZyB8PSBMSVNUSU5HX1NZTUJPTFM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnPSc6Ci0JCSAgICAgIGxpc3RpbmdfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcgKyAxKTsKLQkJICAgICAgb3B0YXJnICs9IHN0cmxlbiAobGlzdGluZ19maWxlbmFtZSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYXNfZmF0YWwgKF8oImludmFsaWQgbGlzdGluZyBvcHRpb24gYCVjJyIpLCAqb3B0YXJnKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgb3B0YXJnKys7Ci0JCX0KLQkgICAgfQotCSAgaWYgKCFsaXN0aW5nKQotCSAgICBsaXN0aW5nID0gTElTVElOR19ERUZBVUxUOwotCSAgYnJlYWs7Ci0KLQljYXNlICdEJzoKLQkgIC8qIERFQlVHIGlzIGltcGxlbWVudGVkOiBpdCBkZWJ1Z3MgZGlmZmVyZW50ICovCi0JICAvKiB0aGluZ3MgZnJvbSBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLiAqLwotCSAgZmxhZ19kZWJ1ZyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ2YnOgotCSAgZmxhZ19ub19jb21tZW50cyA9IDE7Ci0JICBicmVhazsKLQotCWNhc2UgJ0knOgotCSAgewkJCS8qIEluY2x1ZGUgZmlsZSBkaXJlY3RvcnkgKi8KLQkgICAgY2hhciAqdGVtcCA9IHhzdHJkdXAgKG9wdGFyZyk7Ci0JICAgIGFkZF9pbmNsdWRlX2RpciAodGVtcCk7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JY2FzZSAnbyc6Ci0JICBvdXRfZmlsZV9uYW1lID0geHN0cmR1cCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAndyc6Ci0JICBicmVhazsKLQotCWNhc2UgJ1gnOgotCSAgLyogLVggbWVhbnMgdHJlYXQgd2FybmluZ3MgYXMgZXJyb3JzICovCi0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGZyZWUgKHNob3J0b3B0cyk7Ci0gIGZyZWUgKGxvbmdvcHRzKTsKLQotICAqcGFyZ2MgPSBuZXdfYXJnYzsKLSAgKnBhcmd2ID0gbmV3X2FyZ3Y7Ci19Ci0KLXN0YXRpYyBsb25nIHN0YXJ0X3RpbWU7Ci0KLWludCAKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IG1hY3JvX2FsdGVybmF0ZTsKLSAgaW50IG1hY3JvX3N0cmlwX2F0OwotICBpbnQga2VlcF9pdDsKLQotICBzdGFydF90aW1lID0gZ2V0X3J1bl90aW1lICgpOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgaWYgKGRlYnVnX21lbW9yeSkKLSAgICB7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgZXh0ZXJuIGxvbmcgX2JmZF9jaHVua3NpemU7Ci0gICAgICBfYmZkX2NodW5rc2l6ZSA9IDY0OwotI2VuZGlmCi0gICAgICBjaHVua3NpemUgPSA2NDsKLSAgICB9Ci0KLSNpZmRlZiBIT1NUX1NQRUNJQUxfSU5JVAotICBIT1NUX1NQRUNJQUxfSU5JVCAoYXJnYywgYXJndik7Ci0jZW5kaWYKLQotICBteW5hbWUgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKG15bmFtZSk7Ci0KLSAgU1RBUlRfUFJPR1JFU1MgKG15bmFtZSwgMCk7Ci0KLSNpZm5kZWYgT0JKX0RFRkFVTFRfT1VUUFVUX0ZJTEVfTkFNRQotI2RlZmluZSBPQkpfREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FICJhLm91dCIKLSNlbmRpZgotCi0gIG91dF9maWxlX25hbWUgPSBPQkpfREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FOwotCi0gIGhleF9pbml0ICgpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgYmZkX2luaXQgKCk7Ci0gIGJmZF9zZXRfZXJyb3JfcHJvZ3JhbV9uYW1lIChteW5hbWUpOwotI2VuZGlmCi0KLSNpZmRlZiBVU0VfRU1VTEFUSU9OUwotICBzZWxlY3RfZW11bGF0aW9uX21vZGUgKGFyZ2MsIGFyZ3YpOwotI2VuZGlmCi0KLSAgUFJPR1JFU1MgKDEpOwotICBzeW1ib2xfYmVnaW4gKCk7Ci0gIGZyYWdfaW5pdCAoKTsKLSAgc3Vic2Vnc19iZWdpbiAoKTsKLSAgcGFyc2VfYXJncyAoJmFyZ2MsICZhcmd2KTsgCi0gIHJlYWRfYmVnaW4gKCk7Ci0gIGlucHV0X3NjcnViX2JlZ2luICgpOwotICBleHByX2JlZ2luICgpOwotCi0gIGlmIChmbGFnX3ByaW50X3N0YXRpc3RpY3MpCi0gICAgeGF0ZXhpdCAoZHVtcF9zdGF0aXN0aWNzKTsKLQotICBtYWNyb19hbHRlcm5hdGUgPSAwOwotICBtYWNyb19zdHJpcF9hdCA9IDA7Ci0jaWZkZWYgVENfSTk2MAotICBtYWNyb19zdHJpcF9hdCA9IGZsYWdfbXJpOwotI2VuZGlmCi0jaWZkZWYgVENfQTI5SwotICAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBBTUQgMjlLIGZhbWlseSBtYWNybyBhc3NlbWJsZXIKLSAgICAgc3BlY2lmaWNhdGlvbi4gICovCi0gIG1hY3JvX2FsdGVybmF0ZSA9IDE7Ci0gIG1hY3JvX3N0cmlwX2F0ID0gMTsKLSNlbmRpZgotCi0gIG1hY3JvX2luaXQgKG1hY3JvX2FsdGVybmF0ZSwgZmxhZ19tcmksIG1hY3JvX3N0cmlwX2F0LCBtYWNyb19leHByKTsKLQotICBQUk9HUkVTUyAoMSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIG91dHB1dF9maWxlX2NyZWF0ZSAob3V0X2ZpbGVfbmFtZSk7Ci0gIGFzc2VydCAoc3Rkb3V0cHV0ICE9IDApOwotI2VuZGlmCi0KLSNpZmRlZiB0Y19pbml0X2FmdGVyX2FyZ3MKLSAgdGNfaW5pdF9hZnRlcl9hcmdzICgpOwotI2VuZGlmCi0KLSAgaXRibF9pbml0ICgpOwotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgZnVsbHkgaW5pdGlhbGl6ZWQsIGFuZCBoYXZlIGNyZWF0ZWQgdGhlIG91dHB1dAotICAgICBmaWxlLCBkZWZpbmUgYW55IHN5bWJvbHMgcmVxdWVzdGVkIGJ5IC0tZGVmc3ltIGNvbW1hbmQgbGluZQotICAgICBhcmd1bWVudHMuICAqLwotICB3aGlsZSAoZGVmc3ltcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIHN0cnVjdCBkZWZzeW1fbGlzdCAqbmV4dDsKLQotICAgICAgc3ltID0gc3ltYm9sX25ldyAoZGVmc3ltcy0+bmFtZSwgYWJzb2x1dGVfc2VjdGlvbiwgZGVmc3ltcy0+dmFsdWUsCi0JCQkmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltKTsKLSAgICAgIG5leHQgPSBkZWZzeW1zLT5uZXh0OwotICAgICAgZnJlZSAoZGVmc3ltcyk7Ci0gICAgICBkZWZzeW1zID0gbmV4dDsKLSAgICB9Ci0KLSAgUFJPR1JFU1MgKDEpOwotCi0gIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyAoYXJnYywgYXJndik7CS8qIEFzc2VtYmxlIGl0LiAqLwotCi0gIGNvbmRfZmluaXNoX2NoZWNrICgtMSk7Ci0KLSNpZmRlZiBtZF9lbmQKLSAgbWRfZW5kICgpOwotI2VuZGlmCi0KLSAgaWYgKHNlZW5fYXRfbGVhc3RfMV9maWxlICgpCi0gICAgICAmJiAoZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0IHx8IGhhZF9lcnJvcnMgKCkgPT0gMCkpCi0gICAga2VlcF9pdCA9IDE7Ci0gIGVsc2UKLSAgICBrZWVwX2l0ID0gMDsKLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICFkZWZpbmVkIChCRkQpCi0gIC8qIFRoaXMgdXNlZCB0byBiZSBkb25lIGF0IHRoZSBzdGFydCBvZiB3cml0ZV9vYmplY3RfZmlsZSBpbgotICAgICB3cml0ZS5jLCBidXQgdGhhdCBjYXVzZWQgcHJvYmxlbXMgd2hlbiBkb2luZyBsaXN0aW5ncyB3aGVuCi0gICAgIGtlZXBfaXQgd2FzIHplcm8uICBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIG1vdmVkIGFib3ZlIG1kX2VuZCwgYnV0Ci0gICAgIEkgZGlkbid0IHdhbnQgdG8gcmlzayB0aGUgY2hhbmdlLiAgKi8KLSAgc3Vic2Vnc19maW5pc2ggKCk7Ci0jZW5kaWYKLQotICBpZiAoa2VlcF9pdCkKLSAgICB3cml0ZV9vYmplY3RfZmlsZSAoKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGxpc3RpbmdfcHJpbnQgKGxpc3RpbmdfZmlsZW5hbWUpOwotI2VuZGlmCi0KLSNpZm5kZWYgT0JKX1ZNUyAvKiBkb2VzIGl0cyBvd24gZmlsZSBoYW5kbGluZyAqLwotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChrZWVwX2l0KQotI2VuZGlmCi0gICAgb3V0cHV0X2ZpbGVfY2xvc2UgKG91dF9maWxlX25hbWUpOwotI2VuZGlmCi0KLSAgaWYgKGhhZF9lcnJvcnMgKCkgPiAwICYmICEgZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0KQotICAgIGtlZXBfaXQgPSAwOwotCi0gIGlmICgha2VlcF9pdCkKLSAgICB1bmxpbmsgKG91dF9maWxlX25hbWUpOwotCi0gIGlucHV0X3NjcnViX2VuZCAoKTsKLQotICBFTkRfUFJPR1JFU1MgKG15bmFtZSk7Ci0KLSAgLyogVXNlIHhleGl0IGluc3RlYWQgb2YgcmV0dXJuLCBiZWNhdXNlIHVuZGVyIFZNUyBlbnZpcm9ubWVudHMgdGhleQotICAgICBtYXkgbm90IHBsYWNlIHRoZSBzYW1lIGludGVycHJldGF0aW9uIG9uIHRoZSB2YWx1ZSBnaXZlbi4gICovCi0gIGlmIChoYWRfZXJyb3JzICgpID4gMCkKLSAgICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLQotICAvKiBPbmx5IGdlbmVyYXRlIGRlcGVuZGVuY3kgZmlsZSBpZiBhc3NlbWJsZXIgd2FzIHN1Y2Nlc3NmdWwuICAqLwotICBwcmludF9kZXBlbmRlbmNpZXMgKCk7Ci0KLSAgeGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kdW1wX3N0YXRpc3RpY3MgKCkKLXsKLSNpZmRlZiBIQVZFX1NCUksKLSAgY2hhciAqbGltID0gKGNoYXIgKikgc2JyayAoMCk7Ci0jZW5kaWYKLSAgbG9uZyBydW5fdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHN0YXJ0X3RpbWU7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdG90YWwgdGltZSBpbiBhc3NlbWJseTogJWxkLiUwNmxkXG4iKSwKLQkgICBteW5hbWUsIHJ1bl90aW1lIC8gMTAwMDAwMCwgcnVuX3RpbWUgJSAxMDAwMDAwKTsKLSNpZmRlZiBIQVZFX1NCUksKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZGF0YSBzaXplICVsZFxuIiksCi0JICAgbXluYW1lLCAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7Ci0jZW5kaWYKLQotICBzdWJzZWdzX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHdyaXRlX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0gIHN5bWJvbF9wcmludF9zdGF0aXN0aWNzIChzdGRlcnIpOwotICByZWFkX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0KLSNpZmRlZiB0Y19wcmludF9zdGF0aXN0aWNzCi0gIHRjX3ByaW50X3N0YXRpc3RpY3MgKHN0ZGVycik7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfcHJpbnRfc3RhdGlzdGljcwotICBvYmpfcHJpbnRfc3RhdGlzdGljcyAoc3RkZXJyKTsKLSNlbmRpZgotfQotDAotCi0vKgkJCXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcygpCi0gKgotICogSGVyZSB0byBhdHRlbXB0IDEgcGFzcyBvdmVyIGVhY2ggaW5wdXQgZmlsZS4KLSAqIFdlIHNjYW4gYXJndlsqXSBsb29raW5nIGZvciBmaWxlbmFtZXMgb3IgZXhhY3RseSAiIiB3aGljaCBpcwotICogc2hvcnRoYW5kIGZvciBzdGRpbi4gQW55IGFyZ3YgdGhhdCBpcyBOVUxMIGlzIG5vdCBhIGZpbGUtbmFtZS4KLSAqIFdlIHNldCBuZWVkX3Bhc3NfMiBUUlVFIGlmLCBhZnRlciB0aGlzLCB3ZSBzdGlsbCBoYXZlIHVucmVzb2x2ZWQKLSAqIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtICh1bmtub3duIHZhbHVlKSstKHVua25vd24gdmFsdWUpLgotICoKLSAqIE5vdGUgdGhlIHVuKnggc2VtYW50aWNzOiB0aGVyZSBpcyBvbmx5IDEgbG9naWNhbCBpbnB1dCBmaWxlLCBidXQgaXQKLSAqIG1heSBiZSBhIGNhdGVuYXRpb24gb2YgbWFueSAncGh5c2ljYWwnIGlucHV0IGZpbGVzLgotICovCi1zdGF0aWMgdm9pZCAKLXBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcyAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgc2F3X2FfZmlsZSA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotI2VuZGlmCi0KLSAgbmVlZF9wYXNzXzIgPSAwOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgICAgc2VnbWVudF9pbmZvW2ldLmZpeF9yb290ID0gMDsKLSAgfQotICAvKiBDcmVhdGUgdGhlIHRocmVlIGZpeGVkIG9uZXMgKi8KLSAgewotICAgIHNlZ1Qgc2VnOwotCi0jaWZkZWYgVEVfQVBPTExPCi0gICAgc2VnID0gc3Vic2VnX25ldyAoIi53dGV4dCIsIDApOwotI2Vsc2UKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLnRleHQiLCAwKTsKLSNlbmRpZgotICAgIGFzc2VydCAoc2VnID09IFNFR19FMCk7Ci0gICAgc2VnID0gc3Vic2VnX25ldyAoIi5kYXRhIiwgMCk7Ci0gICAgYXNzZXJ0IChzZWcgPT0gU0VHX0UxKTsKLSAgICBzZWcgPSBzdWJzZWdfbmV3ICgiLmJzcyIsIDApOwotICAgIGFzc2VydCAoc2VnID09IFNFR19FMik7Ci0jaWZkZWYgVEVfQVBPTExPCi0gICAgY3JlYXRlX3RhcmdldF9zZWdtZW50cyAoKTsKLSNlbmRpZgotICB9Ci0KLSNlbHNlIC8qIG5vdCBNQU5ZX1NFR01FTlRTICovCi0gIHRleHRfZml4X3Jvb3QgPSBOVUxMOwotICBkYXRhX2ZpeF9yb290ID0gTlVMTDsKLSAgYnNzX2ZpeF9yb290ID0gTlVMTDsKLSNlbmRpZiAvKiBub3QgTUFOWV9TRUdNRU5UUyAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotICAvKiBDcmVhdGUgdGhlIHN0YW5kYXJkIHNlY3Rpb25zLCBhbmQgdGhvc2UgdGhlIGFzc2VtYmxlciB1c2VzCi0gICAgIGludGVybmFsbHkuICAqLwotICB0ZXh0X3NlY3Rpb24gPSBzdWJzZWdfbmV3IChURVhUX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKERBVEFfU0VDVElPTl9OQU1FLCAwKTsKLSAgYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3IChCU1NfU0VDVElPTl9OQU1FLCAwKTsKLSAgLyogQEAgRklYTUUgLS0gd2UncmUgc2V0dGluZyB0aGUgUkVMT0MgZmxhZyBzbyB0aGF0IHNlY3Rpb25zIGFyZSBhc3N1bWVkCi0gICAgIHRvIGhhdmUgcmVsb2NzLCBvdGhlcndpc2Ugd2UgZG9uJ3QgZmluZCBvdXQgaW4gdGltZS4gKi8KLSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19DT0RFIHwgU0VDX1JFQURPTkxZKSk7Ci0gIC8qIEBAIEZJWE1FIC0tIFNFQ19DT0RFIHNlZW1zIHRvIG1lYW4gY29kZSBvbmx5LCByYXRoZXIgdGhhbiBjb2RlIHBvc3NpYmx5LiovCi0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBkYXRhX3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQykpOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUgJiBTRUNfQUxMT0MpOwotICBzZWdfaW5mbyAoYnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotICBzdWJzZWdfbmV3IChCRkRfQUJTX1NFQ1RJT05fTkFNRSwgMCk7Ci0gIHN1YnNlZ19uZXcgKEJGRF9VTkRfU0VDVElPTl9OQU1FLCAwKTsKLSAgcmVnX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiKkdBUyBgcmVnJyBzZWN0aW9uKiIsIDApOwotICBleHByX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiKkdBUyBgZXhwcicgc2VjdGlvbioiLCAwKTsKLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOwotCi0gIC8qIFRoaXMgbWF5IGFkZCBzeW1ib2wgdGFibGUgZW50cmllcywgd2hpY2ggcmVxdWlyZXMgaGF2aW5nIGFuIG9wZW4gQkZELAotICAgICBhbmQgc2VjdGlvbnMgYWxyZWFkeSBjcmVhdGVkLCBpbiBCRkRfQVNTRU1CTEVSIG1vZGUuICAqLwotICBtZF9iZWdpbiAoKTsKLQotI2lmZGVmIG9ial9iZWdpbgotICBvYmpfYmVnaW4gKCk7Ci0jZW5kaWYKLQotICBhcmd2Kys7CQkJLyogc2tpcCBhcmd2WzBdICovCi0gIGFyZ2MtLTsJCQkvKiBza2lwIGFyZ3ZbMF0gKi8KLSAgd2hpbGUgKGFyZ2MtLSkKLSAgICB7Ci0gICAgICBpZiAoKmFyZ3YpCi0JewkJCS8qIElzIGl0IGEgZmlsZS1uYW1lIGFyZ3VtZW50PyAqLwotCSAgUFJPR1JFU1MgKDEpOwotCSAgc2F3X2FfZmlsZSsrOwotCSAgLyogYXJndi0+IiIgaWYgc3RkaW4gZGVzaXJlZCwgZWxzZS0+ZmlsZW5hbWUgKi8KLQkgIHJlYWRfYV9zb3VyY2VfZmlsZSAoKmFyZ3YpOwotCX0KLSAgICAgIGFyZ3YrKzsJCQkvKiBjb21wbGV0ZWQgdGhhdCBhcmd2ICovCi0gICAgfQotICBpZiAoIXNhd19hX2ZpbGUpCi0gICAgcmVhZF9hX3NvdXJjZV9maWxlICgiIik7Ci19CQkJCS8qIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzcygpICovCi0KLS8qIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgbWFjcm8gY29kZSBhbmQgZ2FzIGV4cHJlc3Npb24gaGFuZGxpbmcuICAqLwotCi1zdGF0aWMgaW50Ci1tYWNyb19leHByIChlbXNnLCBpZHgsIGluLCB2YWwpCi0gICAgIGNvbnN0IGNoYXIgKmVtc2c7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICp2YWw7Ci17Ci0gIGNoYXIgKmhvbGQ7Ci0gIGV4cHJlc3Npb25TIGV4OwotCi0gIHNiX3Rlcm1pbmF0ZSAoaW4pOwotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGluLT5wdHIgKyBpZHg7Ci0gIGV4cHJlc3Npb24gKCZleCk7Ci0gIGlkeCA9IGlucHV0X2xpbmVfcG9pbnRlciAtIGluLT5wdHI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLSAgICBhc19iYWQgKCIlcyIsIGVtc2cpOwotCi0gICp2YWwgPSAoaW50KSBleC5YX2FkZF9udW1iZXI7Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogZW5kIG9mIGFzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9hcy5oIGIvZ2FzL2FzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjkwMmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2FzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NDUgKzAsMCBAQAotLyogYXMuaCAtIGdsb2JhbCBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVMKLSNkZWZpbmUgR0FTIDEKLS8qCi0gKiBJIHRoaW5rIHRoaXMgc3R1ZmYgaXMgbGFyZ2VseSBvdXQgb2YgZGF0ZS4gIHhveG9yaWNoLgotICoKLSAqIENBUElUQUxJU0VEIG5hbWVzIGFyZSAjZGVmaW5lZC4KLSAqICJsb3dlcmNhc2VIIiBpcyAjZGVmaW5lZCBpZiAibG93ZXJjYXNlLmgiIGhhcyBiZWVuICNpbmNsdWRlLWQuCi0gKiAibG93ZXJjYXNlVCIgaXMgYSB0eXBlZGVmIG9mICJsb3dlcmNhc2UiIG9iamVjdHMuCi0gKiAibG93ZXJjYXNlUCIgaXMgdHlwZSAicG9pbnRlciB0byBvYmplY3Qgb2YgdHlwZSAnbG93ZXJjYXNlJyIuCi0gKiAibG93ZXJjYXNlUyIgaXMgdHlwZWRlZiBzdHJ1Y3QgLi4uIGxvd2VyY2FzZVMuCi0gKgotICogI2RlZmluZSBERUJVRyB0byBlbmFibGUgYWxsIHRoZSAia25vdyIgYXNzZXJ0aW9uIHRlc3RzLgotICogI2RlZmluZSBTVVNQRUNUIHdoZW4gZGVidWdnaW5nIGhhc2ggY29kZS4KLSAqICNkZWZpbmUgQ09NTU9OIGFzICJleHRlcm4iIGZvciBhbGwgbW9kdWxlcyBleGNlcHQgb25lLCB3aGVyZSB5b3UgI2RlZmluZQotICoJQ09NTU9OIGFzICIiLgotICogSWYgVEVTVCBpcyAjZGVmaW5lZCwgdGhlbiB3ZSBhcmUgdGVzdGluZyBhIG1vZHVsZTogI2RlZmluZSBDT01NT04gYXMgIiIuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0vKiBUaGlzIGlzIHRoZSBjb2RlIHJlY29tbWVuZGVkIGluIHRoZSBhdXRvY29uZiBkb2N1bWVudGF0aW9uLCBhbG1vc3QKLSAgIHZlcmJhdGltLiAgSWYgaXQgZG9lc24ndCB3b3JrIGZvciB5b3UsIGxldCBtZSBrbm93LCBhbmQgbm90aWZ5Ci0gICBkam1AZ251LmFpLm1pdC5lZHUgYXMgd2VsbC4gICovCi0vKiBBZGRlZCAjdW5kZWYgZm9yIERKIERlbG9yaWUuICBUaGUgcmlnaHQgZml4IGlzIHRvIGVuc3VyZSB0aGF0IGFzLmgKLSAgIGlzIGluY2x1ZGVkIGZpcnN0LCBiZWZvcmUgZXZlbiBhbnkgc3lzdGVtIGhlYWRlciBmaWxlcywgaW4gYWxsIGZpbGVzCi0gICB0aGF0IHVzZSBpdC4gIEtSIDE5OTQuMTEuMDMgKi8KLS8qIEFkZGVkIHZvaWQqIHZlcnNpb24gZm9yIFNUREMgY2FzZS4gIFRoaXMgaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoCi0gICB0aGUgZGVjbGFyYXRpb24gaW4gYmlzb24uc2ltcGxlLCB1c2VkIGZvciBtNjhrIG9wZXJhbmQgcGFyc2luZy4KLSAgIC0tS1IgMTk5NS4wOC4wOCAqLwotLyogRm9yY2Ugdm9pZCogZGVjbCBmb3IgaHB1eC4gIFRoaXMgaXMgd2hhdCBCaXNvbiB1c2VzLiAgLS1LUiAxOTk1LjA4LjE2ICovCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgaWZuZGVmIGFsbG9jYQotIyAgaWZkZWYgX19TVERDX18KLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICBlbHNlCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgICBpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfX2hwdXgpCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgICBlbHNlCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICAgZW5kaWYgLyogYWxsb2NhICovCi0jICBlbmRpZiAvKiBfQUlYICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0vKiBOb3csIHRlbmQgdG8gdGhlIHJlc3Qgb2YgdGhlIGNvbmZpZ3VyYXRpb24uICAqLwotCi0vKiBTeXN0ZW0gaW5jbHVkZSBmaWxlcyBmaXJzdC4uLiAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NZU19UWVBFU19ICi0vKiBmb3Igc2l6ZV90LCBwaWRfdCAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLS8qIFRoZSBmaXJzdCBnZXRvcHQgdmFsdWUgZm9yIG1hY2hpbmUtaW5kZXBlbmRlbnQgbG9uZyBvcHRpb25zLgotICAgMTUwIGlzbid0IHNwZWNpYWw7IGl0J3MganVzdCBhbiBhcmJpdHJhcnkgbm9uLUFTQ0lJIGNoYXIgdmFsdWUuICAqLwotI2RlZmluZSBPUFRJT05fU1REX0JBU0UgMTUwCi0vKiBUaGUgZmlyc3QgZ2V0b3B0IHZhbHVlIGZvciBtYWNoaW5lLWRlcGVuZGVudCBsb25nIG9wdGlvbnMuCi0gICAxNzAgZ2l2ZXMgdGhlIHN0YW5kYXJkIG9wdGlvbnMgcm9vbSB0byBncm93LiAgKi8KLSNkZWZpbmUgT1BUSU9OX01EX0JBU0UgMTcwCi0KLSNpZmRlZiBERUJVRwotI3VuZGVmIE5ERUJVRwotI2VuZGlmCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSB8fCBfX0dOVUNfTUlOT1JfXyA8PSA1Ci0jZGVmaW5lIF9fUFJFVFRZX0ZVTkNUSU9OX18gICgoY2hhciopMCkKLSNlbmRpZgotI2lmIDAKLQotLyogSGFuZGxlIGxvc3NhZ2Ugd2l0aCBhc3NlcnQuaC4gICovCi0jaWZuZGVmIEJST0tFTl9BU1NFUlQKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbHNlIC8qIEJST0tFTl9BU1NFUlQgKi8KLSNpZm5kZWYgTkRFQlVHCi0jZGVmaW5lIGFzc2VydChwKSAoKHApID8gMCA6IChhc19hc3NlcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXyksIDApKQotI2Vsc2UKLSNkZWZpbmUgYXNzZXJ0KHApICgocCksIDApCi0jZW5kaWYKLSNlbmRpZiAvKiBCUk9LRU5fQVNTRVJUICovCi0KLSNlbHNlCi0KLSNkZWZpbmUgYXNzZXJ0KFApICgoUCkgPyAwIDogKGFzX2Fzc2VydCAoX19GSUxFX18sIF9fTElORV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fKSwgMCkpCi0jdW5kZWYgYWJvcnQKLSNkZWZpbmUgYWJvcnQoKQkJYXNfYWJvcnQgKF9fRklMRV9fLCBfX0xJTkVfXywgX19QUkVUVFlfRlVOQ1RJT05fXykKLQotI2VuZGlmCi0KLQotLyogTm93IEdOVSBoZWFkZXIgZmlsZXMuLi4gKi8KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpbmNsdWRlIDxiZmQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpYmliZXJ0eS5oPgotCi0vKiBEZWZpbmUgdGhlIHN0YW5kYXJkIHByb2dyZXNzIG1hY3Jvcy4gICovCi0jaW5jbHVkZSA8cHJvZ3Jlc3MuaD4KLQotLyogVGhpcyBkb2Vzbid0IGdldCB0YWtlbiBjYXJlIG9mIGFueXdoZXJlLiAgKi8KLSNpZm5kZWYgX19NV0VSS1NfXyAgLyogTWV0cm93ZXJrcyBDIGNob2tlcyBvbiB0aGUgImRlZmluZWQgKGlubGluZSkiICovCi0jaWYgIWRlZmluZWQgKF9fR05VQ19fKSAmJiAhZGVmaW5lZCAoaW5saW5lKQotI2RlZmluZSBpbmxpbmUKLSNlbmRpZgotI2VuZGlmIC8qICFfX01XRVJLU19fICovCi0KLS8qIE90aGVyIHN0dWZmIGZyb20gY29uZmlnLmguICAqLwotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLWV4dGVybiBQVFIgbWFsbG9jICgpOwotZXh0ZXJuIFBUUiByZWFsbG9jICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi1leHRlcm4gdm9pZCBmcmVlICgpOwotI2VuZGlmCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotZXh0ZXJuIGludCBlcnJubzsKLSNlbmRpZgotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotZXh0ZXJuIGNoYXIgKiplbnZpcm9uOwotI2VuZGlmCi0KLS8qIFRoaXMgaXMgbmVlZGVkIGZvciBWTVMuICAqLwotI2lmICEgZGVmaW5lZCAoSEFWRV9VTkxJTkspICYmIGRlZmluZWQgKEhBVkVfUkVNT1ZFKQotI2RlZmluZSB1bmxpbmsgcmVtb3ZlCi0jZW5kaWYKLQotLyogSGFjayB0byBtYWtlICJnY2MgLVdhbGwiIG5vdCBjb21wbGFpbiBhYm91dCBvYnN0YWNrIG1hY3Jvcy4gICovCi0jaWYgIWRlZmluZWQgKG1lbWNweSkgJiYgIWRlZmluZWQgKGJjb3B5KQotI2RlZmluZSBiY29weShzcmMsZGVzdCxzaXplKQltZW1jcHkoZGVzdCxzcmMsc2l6ZSkKLSNlbmRpZgotCi0vKiBNYWtlIFNhYmVyIGhhcHBpZXIgb24gb2JzdGFjay5oLiAgKi8KLSNpZmRlZiBTQUJFUgotI3VuZGVmICBfX1BUUl9UT19JTlQKLSNkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoaW50KShQKSkKLSN1bmRlZiAgX19JTlRfVE9fUFRSCi0jZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKGNoYXIgKikoUCkpCi0jZW5kaWYKLQotI2lmbmRlZiBfX0xJTkVfXwotI2RlZmluZSBfX0xJTkVfXyAidW5rbm93biIKLSNlbmRpZiAvKiBfX0xJTkVfXyAqLwotCi0jaWZuZGVmIF9fRklMRV9fCi0jZGVmaW5lIF9fRklMRV9fICJ1bmtub3duIgotI2VuZGlmIC8qIF9fRklMRV9fICovCi0KLSNpZm5kZWYgRk9QRU5fV0IKLSNpZmRlZiBHTzMyCi0jaW5jbHVkZSAiZm9wZW4tYmluLmgiCi0jZWxzZQotI2luY2x1ZGUgImZvcGVuLXNhbWUuaCIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRVhJVF9TVUNDRVNTCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAwCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAxCi0jZW5kaWYKLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKLSNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIHhmcmVlCi0KLSNkZWZpbmUgeGZyZWUgZnJlZQotCi0jaW5jbHVkZSAiYXNpbnRsLmgiCi0KLSNkZWZpbmUgQkFEX0NBU0UodmFsKSBcCi17IFwKLSAgICAgIGFzX2ZhdGFsKF8oIkNhc2UgdmFsdWUgJWxkIHVuZXhwZWN0ZWQgYXQgbGluZSAlZCBvZiBmaWxlIFwiJXNcIlxuIiksIFwKLQkgICAgICAgKGxvbmcpIHZhbCwgX19MSU5FX18sIF9fRklMRV9fKTsgXAotCSAgIH0KLQwKLSNpbmNsdWRlICJmbG9udW0uaCIKLQotLyogVGhlc2UgYXJlIGFzc2VtYmxlci13aWRlIGNvbmNlcHRzICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gYmZkICpzdGRvdXRwdXQ7Ci10eXBlZGVmIGJmZF92bWEgYWRkcmVzc1Q7Ci10eXBlZGVmIGJmZF9zaWduZWRfdm1hIG9mZnNldFQ7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGFkZHJlc3NUOwotdHlwZWRlZiBsb25nIG9mZnNldFQ7Ci0jZW5kaWYKLQotLyogVHlwZSBvZiBzeW1ib2wgdmFsdWUsIGV0Yy4gIEZvciB1c2UgaW4gcHJvdG90eXBlcy4gICovCi10eXBlZGVmIGFkZHJlc3NUIHZhbHVlVDsKLQotI2lmbmRlZiBDT01NT04KLSNpZmRlZiBURVNUCi0jZGVmaW5lIENPTU1PTgkJCS8qIGRlY2xhcmUgb3VyIENPTU1PTnMgc3RvcmFnZSBoZXJlLiAqLwotI2Vsc2UKLSNkZWZpbmUgQ09NTU9OIGV4dGVybgkJLyogb3VyIGNvbW1vbnMgbGl2ZSBlbHN3aGVyZSAqLwotI2VuZGlmCi0jZW5kaWYKLS8qIENPTU1PTiBub3cgZGVmaW5lZCAqLwotCi0jaWZkZWYgREVCVUcKLSNpZm5kZWYga25vdwotI2RlZmluZSBrbm93KHApIGFzc2VydChwKQkvKiBWZXJpZnkgb3VyIGFzc3VtcHRpb25zISAqLwotI2VuZGlmIC8qIG5vdCB5ZXQgZGVmaW5lZCAqLwotI2Vsc2UKLSNkZWZpbmUga25vdyhwKQkJCS8qIGtub3coKSBjaGVja3MgYXJlIG5vLW9wLmVkICovCi0jZW5kaWYKLQwKLS8qIGlucHV0X3NjcnViLmMgKi8KLQotLyoKLSAqIFN1cHBsaWVzIHNhbml0aXNlZCBidWZmZXJzIHRvIHJlYWQuYy4KLSAqIEFsc28gdW5kZXJzdGFuZHMgcHJpbnRpbmcgbGluZS1udW1iZXIgcGFydCBvZiBlcnJvciBtZXNzYWdlcy4KLSAqLwotDAotCi0vKiBzdWJzZWdzLmMgICAgIFN1Yi1zZWdtZW50cy4gQWxzbywgc2VnbWVudCg9ZXhwcmVzc2lvbiB0eXBlKXMuKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0jaW5jbHVkZSAiYmZkLmgiCi0jZGVmaW5lIE5fU0VHTUVOVFMgNDAKLSNkZWZpbmUgU0VHX05PUk1BTCh4KSAoKHgpID49IFNFR19FMCAmJiAoeCkgPD0gU0VHX0UzOSkKLSNkZWZpbmUgU0VHX0xJU1QgU0VHX0UwLFNFR19FMSxTRUdfRTIsU0VHX0UzLFNFR19FNCxTRUdfRTUsU0VHX0U2LFNFR19FNyxTRUdfRTgsU0VHX0U5LFwKLQkJIFNFR19FMTAsU0VHX0UxMSxTRUdfRTEyLFNFR19FMTMsU0VHX0UxNCxTRUdfRTE1LFNFR19FMTYsU0VHX0UxNyxTRUdfRTE4LFNFR19FMTksXAotCQkgU0VHX0UyMCxTRUdfRTIxLFNFR19FMjIsU0VHX0UyMyxTRUdfRTI0LFNFR19FMjUsU0VHX0UyNixTRUdfRTI3LFNFR19FMjgsU0VHX0UyOSxcCi0JCSBTRUdfRTMwLFNFR19FMzEsU0VHX0UzMixTRUdfRTMzLFNFR19FMzQsU0VHX0UzNSxTRUdfRTM2LFNFR19FMzcsU0VHX0UzOCxTRUdfRTM5Ci0jZGVmaW5lIFNFR19URVhUIFNFR19FMAotI2RlZmluZSBTRUdfREFUQSBTRUdfRTEKLSNkZWZpbmUgU0VHX0JTUyBTRUdfRTIKLSNkZWZpbmUgU0VHX0xBU1QgU0VHX0UzOQotI2Vsc2UKLSNkZWZpbmUgTl9TRUdNRU5UUyAzCi0jZGVmaW5lIFNFR19OT1JNQUwoeCkgKCh4KSA9PSBTRUdfVEVYVCB8fCAoeCkgPT0gU0VHX0RBVEEgfHwgKHgpID09IFNFR19CU1MpCi0jZGVmaW5lIFNFR19MSVNUIFNFR19URVhULFNFR19EQVRBLFNFR19CU1MKLSNlbmRpZgotCi10eXBlZGVmIGVudW0gX3NlZ1QKLSAgewotICAgIFNFR19BQlNPTFVURSA9IDAsCi0gICAgU0VHX0xJU1QsCi0gICAgU0VHX1VOS05PV04sCi0gICAgU0VHX0dPT0YsCQkJLyogT25seSBoYXBwZW5zIGlmIEFTIGhhcyBhIGxvZ2ljIGVycm9yLiAqLwotICAgIC8qIEludmVudGVkIHNvIHdlIGRvbid0IGNyYXNoIHByaW50aW5nICovCi0gICAgLyogZXJyb3IgbWVzc2FnZSBpbnZvbHZpbmcgd2VpcmQgc2VnbWVudC4gKi8KLSAgICBTRUdfRVhQUiwJCQkvKiBJbnRlcm1lZGlhdGUgZXhwcmVzc2lvbiB2YWx1ZXMuICovCi0gICAgU0VHX0RFQlVHLAkJCS8qIERlYnVnIHNlZ21lbnQgKi8KLSAgICBTRUdfTlRWLAkJCS8qIFRyYW5zZmVydCB2ZWN0b3IgcHJlbG9hZCBzZWdtZW50ICovCi0gICAgU0VHX1BUViwJCQkvKiBUcmFuc2ZlcnQgdmVjdG9yIHBvc3Rsb2FkIHNlZ21lbnQgKi8KLSAgICBTRUdfUkVHSVNURVIJCS8qIE15dGhpY2FsOiBhIHJlZ2lzdGVyLXZhbHVlZCBleHByZXNzaW9uICovCi0gIH0gc2VnVDsKLQotI2RlZmluZSBTRUdfTUFYSU1VTV9PUkRJTkFMIChTRUdfUkVHSVNURVIpCi0jZWxzZQotdHlwZWRlZiBhc2VjdGlvbiAqc2VnVDsKLSNkZWZpbmUgU0VHX05PUk1BTChTRUcpCQkoKFNFRykgIT0gYWJzb2x1dGVfc2VjdGlvbglcCi0JCQkJICYmIChTRUcpICE9IHVuZGVmaW5lZF9zZWN0aW9uCVwKLQkJCQkgJiYgKFNFRykgIT0gcmVnX3NlY3Rpb24JXAotCQkJCSAmJiAoU0VHKSAhPSBleHByX3NlY3Rpb24pCi0jZW5kaWYKLXR5cGVkZWYgaW50IHN1YnNlZ1Q7Ci0KLS8qIFdoYXQgc3Vic2VnIHdlIGFyZSBhY2NyZXRpbmcgbm93PyAqLwotQ09NTU9OIHN1YnNlZ1Qgbm93X3N1YnNlZzsKLQotLyogU2VnbWVudCBvdXIgaW5zdHJ1Y3Rpb25zIGVtaXQgdG8uICovCi1DT01NT04gc2VnVCBub3dfc2VnOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBzZWdtZW50X25hbWUoU0VHKQliZmRfZ2V0X3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBTRUcpCi0jZWxzZQotZXh0ZXJuIGNoYXIgY29uc3QgKmNvbnN0IHNlZ19uYW1lW107Ci0jZGVmaW5lIHNlZ21lbnRfbmFtZShTRUcpCXNlZ19uYW1lWyhpbnQpIChTRUcpXQotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGludCBzZWN0aW9uX2FsaWdubWVudFtdOwotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gc2VnVCByZWdfc2VjdGlvbiwgZXhwcl9zZWN0aW9uOwotLyogU2hvdWxkbid0IHRoZXNlIGJlIGVsaW1pbmF0ZWQgc29tZWRheT8gICovCi1leHRlcm4gc2VnVCB0ZXh0X3NlY3Rpb24sIGRhdGFfc2VjdGlvbiwgYnNzX3NlY3Rpb247Ci0jZGVmaW5lIGFic29sdXRlX3NlY3Rpb24JYmZkX2Fic19zZWN0aW9uX3B0cgotI2RlZmluZSB1bmRlZmluZWRfc2VjdGlvbgliZmRfdW5kX3NlY3Rpb25fcHRyCi0jZWxzZQotI2RlZmluZSByZWdfc2VjdGlvbgkJU0VHX1JFR0lTVEVSCi0jZGVmaW5lIGV4cHJfc2VjdGlvbgkJU0VHX0VYUFIKLSNkZWZpbmUgdGV4dF9zZWN0aW9uCQlTRUdfVEVYVAotI2RlZmluZSBkYXRhX3NlY3Rpb24JCVNFR19EQVRBCi0jZGVmaW5lIGJzc19zZWN0aW9uCQlTRUdfQlNTCi0jZGVmaW5lIGFic29sdXRlX3NlY3Rpb24JU0VHX0FCU09MVVRFCi0jZGVmaW5lIHVuZGVmaW5lZF9zZWN0aW9uCVNFR19VTktOT1dOCi0jZW5kaWYKLQotLyogcmVsYXgoKSAqLwotCi1lbnVtIF9yZWxheF9zdGF0ZQotICB7Ci0gICAgLyogVmFyaWFibGUgY2hhcnMgdG8gYmUgcmVwZWF0ZWQgZnJfb2Zmc2V0IHRpbWVzLgotICAgICAgIEZyX3N5bWJvbCB1bnVzZWQuIFVzZWQgd2l0aCBmcl9vZmZzZXQgPT0gMCBmb3IgYQotICAgICAgIGNvbnN0YW50IGxlbmd0aCBmcmFnLiAqLwotICAgIHJzX2ZpbGwgPSAxLAotCi0gICAgLyogQWxpZ24uICBUaGUgZnJfb2Zmc2V0IGZpZWxkIGhvbGRzIHRoZSBwb3dlciBvZiAyIHRvIHdoaWNoIHRvCi0gICAgICAgYWxpZ24uICBUaGUgZnJfdmFyIGZpZWxkIGhvbGRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUKLSAgICAgICBmaWxsIHBhdHRlcm4uICBUaGUgZnJfc3VidHlwZSBmaWVsZCBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSAgICAgICBieXRlcyB0byBza2lwIHdoZW4gYWxpZ25pbmcsIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0gICAgcnNfYWxpZ24sCi0KLSAgICAvKiBBbGlnbiBjb2RlLiAgVGhlIGZyX29mZnNldCBmaWVsZCBob2xkcyB0aGUgcG93ZXIgb2YgMiB0byB3aGljaAotICAgICAgIHRvIGFsaWduLiAgVGhpcyB0eXBlIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IG1hY2hpbmUgc3BlY2lmaWMKLSAgICAgICBjb2RlLCB3aGljaCBpcyBub3JtYWxseSByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIGZpbGwKLSAgICAgICBwYXR0ZXJuLiAgVGhlIGZyX3N1YnR5cGUgZmllbGQgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gICAgICAgYnl0ZXMgdG8gc2tpcCB3aGVuIGFsaWduaW5nLCBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotICAgIHJzX2FsaWduX2NvZGUsCi0KLSAgICAvKiBPcmc6IEZyX29mZnNldCwgZnJfc3ltYm9sOiBhZGRyZXNzLiAxIHZhcmlhYmxlIGNoYXI6IGZpbGwKLSAgICAgICBjaGFyYWN0ZXIuICovCi0gICAgcnNfb3JnLAotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLSAgICAvKiBKRjogZ3VucG9pbnQgKi8KLSAgICByc19icm9rZW5fd29yZCwKLSNlbmRpZgotCi0gICAgLyogbWFjaGluZS1zcGVjaWZpYyByZWxheGFibGUgKG9yIHNpbWlsYXJseSBhbHRlcmFibGUpIGluc3RydWN0aW9uICovCi0gICAgcnNfbWFjaGluZV9kZXBlbmRlbnQsCi0KLSAgICAvKiAuc3BhY2UgZGlyZWN0aXZlIHdpdGggZXhwcmVzc2lvbiBvcGVyYW5kIHRoYXQgbmVlZHMgdG8gYmUgY29tcHV0ZWQKLSAgICAgICBsYXRlci4gIFNpbWlsYXIgdG8gcnNfb3JnLCBidXQgZGlmZmVyZW50LgotICAgICAgIGZyX3N5bWJvbDogb3BlcmFuZAotICAgICAgIDEgdmFyaWFibGUgY2hhcjogZmlsbCBjaGFyYWN0ZXIgICovCi0gICAgcnNfc3BhY2UsCi0KLSAgICAvKiBBIERXQVJGIGxlYjEyOCB2YWx1ZTsgb25seSBFTEYgdXNlcyB0aGlzLiAgVGhlIHN1YnR5cGUgaXMgMCBmb3IKLSAgICAgICB1bnNpZ25lZCwgMSBmb3Igc2lnbmVkLiAgKi8KLSAgICByc19sZWIxMjgsCi0KLSAgICAvKiBFeGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gd2hpY2ggd2UgbWF5IGJlIGFibGUgdG8gb3B0aW1pemUuICAqLwotICAgIHJzX2NmYQotICB9OwotCi10eXBlZGVmIGVudW0gX3JlbGF4X3N0YXRlIHJlbGF4X3N0YXRlVDsKLQotLyogVGhpcyB0eXBlIGlzIHVzZWQgaW4gcHJvdG90eXBlcywgc28gaXQgY2FuJ3QgYmUgYSB0eXBlIHRoYXQgd2lsbCBiZQotICAgd2lkZW5lZCBmb3IgYXJndW1lbnQgcGFzc2luZy4gICovCi10eXBlZGVmIHVuc2lnbmVkIGludCByZWxheF9zdWJzdGF0ZVQ7Ci0KLS8qIEVub3VnaCBiaXRzIGZvciBhZGRyZXNzLCBidXQgc3RpbGwgYW4gaW50ZWdlciB0eXBlLgotICAgQ291bGQgYmUgYSBwcm9ibGVtLCBjcm9zcy1hc3NlbWJsaW5nIGZvciA2NC1iaXQgbWFjaGluZXMuICAqLwotdHlwZWRlZiBhZGRyZXNzVCByZWxheF9hZGRyZXNzVDsKLQwKLS8qIG1haW4gcHJvZ3JhbSAiYXMuYyIgKGNvbW1hbmQgYXJndW1lbnRzIGV0YykgKi8KLQotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19ub19jb21tZW50czsgLyogLWYgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfZGVidWc7IC8qIC1EICovCi1DT01NT04gdW5zaWduZWQgY2hhciBmbGFnX3NpZ25lZF9vdmVyZmxvd19vazsgLyogLUogKi8KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ193YXJuX2Rpc3BsYWNlbWVudDsgLyogLUsgKi8KLSNlbmRpZgotCi0vKiBUcnVlIGlmIGxvY2FsIHN5bWJvbHMgc2hvdWxkIGJlIHJldGFpbmVkLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ19rZWVwX2xvY2FsczsgLyogLUwgKi8KLQotLyogVHJ1ZSBpZiB3ZSBhcmUgYXNzZW1ibGluZyBpbiBNUkkgbW9kZS4gICovCi1DT01NT04gaW50IGZsYWdfbXJpOwotCi0vKiBUcnVlIGlmIHdlIGFyZSBhc3NlbWJsaW5nIGluIG02OGsgTVJJIG1vZGUuICAqLwotQ09NTU9OIGludCBmbGFnX202OGtfbXJpOwotCi0vKiBTaG91bGQgdGhlIGRhdGEgc2VjdGlvbiBiZSBtYWRlIHJlYWQtb25seSBhbmQgYXBwZW5kZWQgdG8gdGhlIHRleHQKLSAgIHNlY3Rpb24/ICAqLwotQ09NTU9OIHVuc2lnbmVkIGNoYXIgZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQ7IC8qIC1SICovCi0KLS8qIFRydWUgaWYgd2FybmluZ3Mgc2hvdWxkIGJlIGluaGliaXRlZC4gICovCi1DT01NT04gaW50IGZsYWdfbm9fd2FybmluZ3M7IC8qIC1XICovCi0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGF0dGVtcHQgdG8gZ2VuZXJhdGUgb3V0cHV0IGV2ZW4gaWYgbm9uLWZhdGFsIGVycm9ycwotICAgYXJlIGRldGVjdGVkLiAgKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfYWx3YXlzX2dlbmVyYXRlX291dHB1dDsgLyogLVogKi8KLQotLyogVGhpcyBpcyB0cnVlIGlmIHRoZSBhc3NlbWJsZXIgc2hvdWxkIG91dHB1dCB0aW1lIGFuZCBzcGFjZSB1c2FnZS4gKi8KLUNPTU1PTiB1bnNpZ25lZCBjaGFyIGZsYWdfcHJpbnRfc3RhdGlzdGljczsKLQotLyogVHJ1ZSBpZiBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzIGFyZSB0byBiZSBzdHJpcHBlZC4gICovCi1DT01NT04gaW50IGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGU7Ci0KLS8qIFRydWUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIGEgdHJhZGl0aW9uYWwgZm9ybWF0IG9iamVjdCBmaWxlLiAgKi8KLUNPTU1PTiBpbnQgZmxhZ190cmFkaXRpb25hbF9mb3JtYXQ7Ci0KLS8qIG5hbWUgb2YgZW1pdHRlZCBvYmplY3QgZmlsZSAqLwotQ09NTU9OIGNoYXIgKm91dF9maWxlX25hbWU7Ci0KLS8qIG5hbWUgb2YgZmlsZSBkZWZpbmluZyBleHRlbnNpb25zIHRvIHRoZSBiYXNpYyBpbnN0cnVjdGlvbiBzZXQgKi8KLUNPTU1PTiBjaGFyICppbnN0dGJsX2ZpbGVfbmFtZTsKLQotLyogVFJVRSBpZiB3ZSBuZWVkIGEgc2Vjb25kIHBhc3MuICovCi1DT01NT04gaW50IG5lZWRfcGFzc18yOwotCi0vKiBUUlVFIGlmIHdlIHNob3VsZCBkbyBubyByZWxheGluZywgYW5kCi0gICBsZWF2ZSBsb3RzIG9mIHBhZGRpbmcuICAqLwotQ09NTU9OIGludCBsaW5rcmVsYXg7Ci0KLS8qIFRSVUUgaWYgd2Ugc2hvdWxkIHByb2R1Y2UgYSBsaXN0aW5nLiAgKi8KLWV4dGVybiBpbnQgbGlzdGluZzsKLQotLyogVHlwZSBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2Ugc2hvdWxkIGdlbmVyYXRlLiAgV2UgY3VycmVudGx5Ci0gICBzdXBwb3J0IHN0YWJzLCBFQ09GRiwgYW5kIERXQVJGMi4gICovCi0KLWVudW0gZGVidWdfaW5mb190eXBlCi0gIHsKLSAgICBERUJVR19VTlNQRUNJRklFRCwKLSAgICBERUJVR19OT05FLAotICAgIERFQlVHX1NUQUJTLAotICAgIERFQlVHX0VDT0ZGLAotICAgIERFQlVHX0RXQVJGLAotICAgIERFQlVHX0RXQVJGMgotICB9OwotCi1leHRlcm4gZW51bSBkZWJ1Z19pbmZvX3R5cGUgZGVidWdfdHlwZTsKLQwKLS8qIE1heGltdW0gbGV2ZWwgb2YgbWFjcm8gbmVzdGluZy4gICovCi1leHRlcm4gaW50IG1heF9tYWNyb19uZXN0OwotCi0vKiBPYnN0YWNrIGNodW5rIHNpemUuICBLZWVwIGxhcmdlIGZvciBlZmZpY2llbnQgc3BhY2UgdXNlLCBtYWtlIHNtYWxsIHRvCi0gICBpbmNyZWFzZSBtYWxsb2MgY2FsbHMgZm9yIG1vbml0b3JpbmcgbWVtb3J5IGFsbG9jYXRpb24uICAqLwotZXh0ZXJuIGludCBjaHVua3NpemU7Ci0KLXN0cnVjdCBfcHNldWRvX3R5cGUKLSAgewotICAgIC8qIGFzc2VtYmxlciBtbmVtb25pYywgbG93ZXIgY2FzZSwgbm8gJy4nICovCi0gICAgY29uc3QgY2hhciAqcG9jX25hbWU7Ci0gICAgLyogRG8gdGhlIHdvcmsgKi8KLSAgICB2b2lkICgqcG9jX2hhbmRsZXIpIFBBUkFNUyAoKGludCkpOwotICAgIC8qIFZhbHVlIHRvIHBhc3MgdG8gaGFuZGxlciAqLwotICAgIGludCBwb2NfdmFsOwotICB9OwotCi10eXBlZGVmIHN0cnVjdCBfcHNldWRvX3R5cGUgcHNldWRvX3R5cGVTOwotCi0vKiBQcmVmZXIgdmFyYXJncyBmb3Igbm9uLUFOU0kgY29tcGlsZXIsIHNpbmNlIHNvbWUgd2lsbCBiYXJmIGlmIHRoZQotICAgZWxsaXBzaXMgZGVmaW5pdGlvbiBpcyB1c2VkIHdpdGggYSBuby1hcmd1bWVudHMgZGVjbGFyYXRpb24uICAqLwotI2lmIGRlZmluZWQgKEhBVkVfVkFSQVJHU19IKSAmJiAhZGVmaW5lZCAoX19TVERDX18pCi0jdW5kZWYgSEFWRV9TVERBUkdfSAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChIQVZFX1NUREFSR19IKQotI2RlZmluZSBVU0VfU1REQVJHCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoVVNFX1NUREFSRykgJiYgZGVmaW5lZCAoSEFWRV9WQVJBUkdTX0gpCi0jZGVmaW5lIFVTRV9WQVJBUkdTCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9TVERBUkcKLSNpZiAoX19HTlVDX18gPj0gMikgJiYgIWRlZmluZWQoVk1TKQotLyogZm9yIHVzZSB3aXRoIC1XZm9ybWF0ICovCi0KLSNpZiBfX0dOVUNfTUlOT1JfXyA8IDYKLS8qIFN1cHBvcnQgZm9yIGRvdWJsZSB1bmRlcnNjb3JlcyBpbiBhdHRyaWJ1dGUgbmFtZXMgd2FzIGFkZGVkIGluIGdjYwotICAgMi42LCBzbyBhdm9pZCB0aGVtIGlmIHdlIGFyZSB1c2luZyBhbiBlYXJsaWVyIHZlcnNpb24uICAqLwotI2RlZmluZSBfX3ByaW50Zl9fIHByaW50ZgotI2RlZmluZSBfX2Zvcm1hdF9fIGZvcm1hdAotI2VuZGlmCi0KLSNkZWZpbmUgUFJJTlRGX0xJS0UoRkNOKSBcCi0gIHZvaWQgRkNOIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgXAotICAgIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCAxLCAyKSkpCi0jZGVmaW5lIFBSSU5URl9XSEVSRV9MSUtFKEZDTikgXAotICB2b2lkIEZDTiAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBcCi0gICAgX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X18gKF9fcHJpbnRmX18sIDMsIDQpKSkKLQotI2Vsc2UgLyogX19HTlVDX18gPCAyIHx8IGRlZmluZWQoVk1TKSAqLwotCi0jZGVmaW5lIFBSSU5URl9MSUtFKEZDTikJdm9pZCBGQ04gUEFSQU1TICgoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKQotI2RlZmluZSBQUklOVEZfV0hFUkVfTElLRShGQ04pCXZvaWQgRkNOIFBBUkFNUyAoKGNoYXIgKmZpbGUsIFwKLQkJCQkJCSAgdW5zaWduZWQgaW50IGxpbmUsIFwKLQkJCQkJICAJICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyA8IDIgfHwgZGVmaW5lZChWTVMpICovCi0KLSNlbHNlIC8qICEgVVNFX1NUREFSRyAqLwotCi0jZGVmaW5lIFBSSU5URl9MSUtFKEZDTikJdm9pZCBGQ04gKCkKLSNkZWZpbmUgUFJJTlRGX1dIRVJFX0xJS0UoRkNOKQl2b2lkIEZDTiAoKQotCi0jZW5kaWYgLyogISBVU0VfU1REQVJHICovCi0KLVBSSU5URl9MSUtFIChhc19iYWQpOwotUFJJTlRGX0xJS0UgKGFzX2ZhdGFsKTsKLVBSSU5URl9MSUtFIChhc190c2t0c2spOwotUFJJTlRGX0xJS0UgKGFzX3dhcm4pOwotUFJJTlRGX1dIRVJFX0xJS0UgKGFzX2JhZF93aGVyZSk7Ci1QUklOVEZfV0hFUkVfTElLRSAoYXNfd2Fybl93aGVyZSk7Ci0KLXZvaWQgYXNfYXNzZXJ0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICopKTsKLXZvaWQgYXNfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotCi12b2lkIGZwcmludF92YWx1ZSBQQVJBTVMgKChGSUxFICpmaWxlLCBhZGRyZXNzVCB2YWx1ZSkpOwotdm9pZCBzcHJpbnRfdmFsdWUgUEFSQU1TICgoY2hhciAqYnVmLCBhZGRyZXNzVCB2YWx1ZSkpOwotCi1pbnQgaGFkX2Vycm9ycyBQQVJBTVMgKCh2b2lkKSk7Ci1pbnQgaGFkX3dhcm5pbmdzIFBBUkFNUyAoKHZvaWQpKTsKLQotdm9pZCBwcmludF92ZXJzaW9uX2lkIFBBUkFNUyAoKHZvaWQpKTsKLWNoYXIgKmFwcF9wdXNoIFBBUkFNUyAoKHZvaWQpKTsKLWNoYXIgKmF0b2ZfaWVlZSBQQVJBTVMgKChjaGFyICpzdHIsIGludCB3aGF0X2tpbmQsIExJVFRMRU5VTV9UWVBFICogd29yZHMpKTsKLWNoYXIgKmlucHV0X3NjcnViX2luY2x1ZGVfZmlsZSBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSwgY2hhciAqcG9zaXRpb24pKTsKLWNoYXIgKmlucHV0X3NjcnViX25ld19maWxlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci1jaGFyICppbnB1dF9zY3J1Yl9uZXh0X2J1ZmZlciBQQVJBTVMgKChjaGFyICoqYnVmcCkpOwotaW50IGRvX3NjcnViX2NoYXJzIFBBUkFNUyAoKGludCAoKmdldCkgKGNoYXIgKiwgaW50KSwgY2hhciAqdG8sIGludCB0b2xlbikpOwotaW50IGdlbl90b193b3JkcyBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqIHdvcmRzLCBpbnQgcHJlY2lzaW9uLAotCQkJICBsb25nIGV4cG9uZW50X2JpdHMpKTsKLWludCBoYWRfZXJyIFBBUkFNUyAoKHZvaWQpKTsKLWludCBpZ25vcmVfaW5wdXQgUEFSQU1TICgodm9pZCkpOwotdm9pZCBjb25kX2ZpbmlzaF9jaGVjayBQQVJBTVMgKChpbnQpKTsKLXZvaWQgY29uZF9leGl0X21hY3JvIFBBUkFNUyAoKGludCkpOwotaW50IHNlZW5fYXRfbGVhc3RfMV9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgYXBwX3BvcCBQQVJBTVMgKChjaGFyICphcmcpKTsKLXZvaWQgYXNfaG93bXVjaCBQQVJBTVMgKChGSUxFICogc3RyZWFtKSk7Ci12b2lkIGFzX3BlcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICpncmlwZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLXZvaWQgYXNfd2hlcmUgUEFSQU1TICgoY2hhciAqKm5hbWVwLCB1bnNpZ25lZCBpbnQgKmxpbmVwKSk7Ci12b2lkIGJ1bXBfbGluZV9jb3VudGVycyBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGRvX3NjcnViX2JlZ2luIFBBUkFNUyAoKGludCkpOwotdm9pZCBpbnB1dF9zY3J1Yl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X3NjcnViX2Nsb3NlIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfc2NydWJfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLWludCBuZXdfbG9naWNhbF9saW5lIFBBUkFNUyAoKGNoYXIgKmZuYW1lLCBpbnQgbGluZV9udW1iZXIpKTsKLXZvaWQgc3Vic2Vnc19iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIHN1YnNlZ19jaGFuZ2UgUEFSQU1TICgoc2VnVCBzZWcsIGludCBzdWJzZWcpKTsKLXNlZ1Qgc3Vic2VnX25ldyBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBzdWJzZWdUIHN1YnNlZykpOwotc2VnVCBzdWJzZWdfZm9yY2VfbmV3IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIHN1YnNlZ1Qgc3Vic2VnKSk7Ci12b2lkIHN1YnNlZ19zZXQgUEFSQU1TICgoc2VnVCBzZWcsIHN1YnNlZ1Qgc3Vic2VnKSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc2VnVCBzdWJzZWdfZ2V0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0jZW5kaWYKLWludCBzdWJzZWdfdGV4dF9wIFBBUkFNUyAoKHNlZ1QpKTsKLQotdm9pZCBzdGFydF9kZXBlbmRlbmNpZXMgUEFSQU1TICgoY2hhciAqKSk7Ci12b2lkIHJlZ2lzdGVyX2RlcGVuZGVuY3kgUEFSQU1TICgoY2hhciAqKSk7Ci12b2lkIHByaW50X2RlcGVuZGVuY2llcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0cnVjdCBleHByZXNzaW9uUzsKLXN0cnVjdCBmaXg7Ci10eXBlZGVmIHN0cnVjdCBzeW1ib2wgc3ltYm9sUzsKLXN0cnVjdCByZWxheF90eXBlOwotdHlwZWRlZiBzdHJ1Y3QgZnJhZyBmcmFnUzsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIGxpdGVyYWwuYyAqLwotdmFsdWVUIGFkZF90b19saXRlcmFsX3Bvb2wgUEFSQU1TICgoc3ltYm9sUyAqLCB2YWx1ZVQsIHNlZ1QsIGludCkpOwotI2VuZGlmCi0KLWludCBjaGVja19laF9mcmFtZSBQQVJBTVMgKChzdHJ1Y3QgZXhwcmVzc2lvblMgKiwgdW5zaWduZWQgaW50ICopKTsKLWludCBlaF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBQQVJBTVMgKChmcmFnUyAqKSk7Ci1pbnQgZWhfZnJhbWVfcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqKSk7Ci12b2lkIGVoX2ZyYW1lX2NvbnZlcnRfZnJhZyBQQVJBTVMgKChmcmFnUyAqKSk7Ci0KLSNpbmNsdWRlICJleHByLmgiCQkvKiBCZWZvcmUgdGFyZy0qLmggKi8KLQotLyogdGhpcyBvbmUgc3RhcnRzIHRoZSBjaGFpbiBvZiB0YXJnZXQgZGVwZW5kYW50IGhlYWRlcnMgKi8KLSNpbmNsdWRlICJ0YXJnLWVudi5oIgotCi0jaW5jbHVkZSAid3JpdGUuaCIKLSNpbmNsdWRlICJmcmFncy5oIgotI2luY2x1ZGUgImhhc2guaCIKLSNpbmNsdWRlICJyZWFkLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotCi0jaW5jbHVkZSAidGMuaCIKLSNpbmNsdWRlICJvYmouaCIKLQotI2lmZGVmIFVTRV9FTVVMQVRJT05TCi0jaW5jbHVkZSAiZW11bC5oIgotI2VuZGlmCi0jaW5jbHVkZSAibGlzdGluZy5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19ET0xMQVIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAwCi0jZW5kaWYKLQotI2lmbmRlZiBMT0NBTF9MQUJFTFNfRkIKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDAKLSNlbmRpZgotCi0jaWZuZGVmIFRFWFRfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFRFWFRfU0VDVElPTl9OQU1FCSIudGV4dCIKLSNkZWZpbmUgREFUQV9TRUNUSU9OX05BTUUJIi5kYXRhIgotI2RlZmluZSBCU1NfU0VDVElPTl9OQU1FCSIuYnNzIgotI2VuZGlmCi0KLSNlbmRpZiAvKiBHQVMgKi8KLQotLyogZW5kIG9mIGFzLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9hc2ludGwuaCBiL2dhcy9hc2ludGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczM2M4NS4uMDAwMDAwMAotLS0gYS9nYXMvYXNpbnRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKiBhc2ludGwuaCAtIGdhcy1zcGVjaWZpYyBoZWFkZXIgZm9yIGdldHRleHQgY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZkZWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX05MUwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jIGRlZmluZSBfKFN0cmluZykgZ2V0dGV4dCAoU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvYXRvZi1nZW5lcmljLmMgYi9nYXMvYXRvZi1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjlmMjEuLjAwMDAwMDAKLS0tIGEvZ2FzL2F0b2YtZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qIGF0b2ZfZ2VuZXJpYy5jIC0gdHVybiBhIHN0cmluZyBvZiBkaWdpdHMgaW50byBhIEZsb251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFICgwKQotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSNkZWZpbmUgVFJVRSAgKDEpCi0jZW5kaWYKLQotI2lmZGVmIFRSQUNFCi1zdGF0aWMgdm9pZCBmbG9udW1fcHJpbnQgUEFSQU1TICgoY29uc3QgRkxPTlVNX1RZUEUgKikpOwotI2VuZGlmCi0KLSNkZWZpbmUgQVNTVU1FX0RFQ0lNQUxfTUFSS19JU19ET1QKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglHaXZlbiBhIHN0cmluZyBvZiBkZWNpbWFsIGRpZ2l0cyAsIHdpdGggb3B0aW9uYWwgZGVjaW1hbAkqCi0gKgltYXJrIGFuZCBvcHRpb25hbCBkZWNpbWFsIGV4cG9uZW50IChwbGFjZSB2YWx1ZSkgb2YgdGhlCQkqCi0gKglsb3dlc3Rfb3JkZXIgZGVjaW1hbCBkaWdpdDogcHJvZHVjZSBhIGZsb2F0aW5nIHBvaW50CQkqCi0gKgludW1iZXIuIFRoZSBudW1iZXIgaXMgJ2dlbmVyaWMnIGZsb2F0aW5nIHBvaW50OiBvdXIJCSoKLSAqCWNhbGxlciB3aWxsIGVuY29kZSBpdCBmb3IgYSBzcGVjaWZpYyBtYWNoaW5lIGFyY2hpdGVjdHVyZS4JKgotICoJCQkJCQkJCQkqCi0gKglBc3N1bXB0aW9ucwkJCQkJCQkqCi0gKgkJdXNlcyBiYXNlIChyYWRpeCkgMgkJCQkJKgotICoJCXRoaXMgbWFjaGluZSB1c2VzIDIncyBjb21wbGVtZW50IGJpbmFyeSBpbnRlZ2VycwkqCi0gKgkJdGFyZ2V0IGZsb251bXMgdXNlICIgICAgICAiICAgICAgICAgIiAgICAgICAiCQkqCi0gKgkJdGFyZ2V0IGZsb251bXMgZXhwb25lbnRzIGZpdCBpbiBhIGxvbmcJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0KLSAgU3ludGF4OgotCi0gIDxmbG9udW0+IDo6PSA8b3B0aW9uYWwtc2lnbj4gPGRlY2ltYWwtbnVtYmVyPiA8b3B0aW9uYWwtZXhwb25lbnQ+Ci0gIDxvcHRpb25hbC1zaWduPiA6Oj0gJysnIHwgJy0nIHwge2VtcHR5fQotICA8ZGVjaW1hbC1udW1iZXI+IDo6PSA8aW50ZWdlcj4KLSAgfCA8aW50ZWdlcj4gPHJhZGl4LWNoYXJhY3Rlcj4KLSAgfCA8aW50ZWdlcj4gPHJhZGl4LWNoYXJhY3Rlcj4gPGludGVnZXI+Ci0gIHwgPHJhZGl4LWNoYXJhY3Rlcj4gPGludGVnZXI+Ci0KLSAgPG9wdGlvbmFsLWV4cG9uZW50PiA6Oj0ge2VtcHR5fQotICB8IDxleHBvbmVudC1jaGFyYWN0ZXI+IDxvcHRpb25hbC1zaWduPiA8aW50ZWdlcj4KLQotICA8aW50ZWdlcj4gOjo9IDxkaWdpdD4gfCA8ZGlnaXQ+IDxpbnRlZ2VyPgotICA8ZGlnaXQ+IDo6PSAnMCcgfCAnMScgfCAnMicgfCAnMycgfCAnNCcgfCAnNScgfCAnNicgfCAnNycgfCAnOCcgfCAnOScKLSAgPGV4cG9uZW50LWNoYXJhY3Rlcj4gOjo9IHtvbmUgY2hhcmFjdGVyIGZyb20gInN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzIn0KLSAgPHJhZGl4LWNoYXJhY3Rlcj4gOjo9IHtvbmUgY2hhcmFjdGVyIGZyb20gInN0cmluZ19vZl9kZWNpbWFsX21hcmtzIn0KLQotICAqLwotCi1pbnQKLWF0b2ZfZ2VuZXJpYyAoYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciwKLQkgICAgICBzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrcywKLQkgICAgICBzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywKLQkgICAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKQotICAgICAvKiByZXR1cm4gcG9pbnRlciB0byBqdXN0IEFGVEVSIG51bWJlciB3ZSByZWFkLiAqLwotICAgICBjaGFyICoqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlcjsKLSAgICAgLyogQXQgbW9zdCBvbmUgcGVyIG51bWJlci4gKi8KLSAgICAgY29uc3QgY2hhciAqc3RyaW5nX29mX2RlY2ltYWxfbWFya3M7Ci0gICAgIGNvbnN0IGNoYXIgKnN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzOwotICAgICBGTE9OVU1fVFlQRSAqYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgbWVhbnMgT0suICovCi0gIGNoYXIgKmZpcnN0X2RpZ2l0OwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19iZWZvcmVfZGVjaW1hbDsKLSAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbDsKLSAgbG9uZyBkZWNpbWFsX2V4cG9uZW50OwotICB1bnNpZ25lZCBpbnQgbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGU7Ci0gIGNoYXIgZGlnaXRzX3NpZ25fY2hhcjsKLQotICAvKgotICAgKiBTY2FuIHRoZSBpbnB1dCBzdHJpbmcsIGFic3RyYWN0aW5nICgxKWRpZ2l0cyAoMilkZWNpbWFsIG1hcmsgKDMpIGV4cG9uZW50LgotICAgKiBJdCB3b3VsZCBiZSBzaW1wbGVyIHRvIG1vZGlmeSB0aGUgc3RyaW5nLCBidXQgd2UgZG9uJ3Q7IGp1c3QgdG8gYmUgbmljZQotICAgKiB0byBjYWxsZXIuCi0gICAqIFdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBkaWdpdHMgd2UgaGF2ZSwgc28gd2UgY2FuIGFsbG9jYXRlIHNwYWNlIGZvcgotICAgKiB0aGUgZGlnaXRzJyB2YWx1ZS4KLSAgICovCi0KLSAgY2hhciAqcDsKLSAgY2hhciBjOwotICBpbnQgc2Vlbl9zaWduaWZpY2FudF9kaWdpdDsKLQotI2lmZGVmIEFTU1VNRV9ERUNJTUFMX01BUktfSVNfRE9UCi0gIGFzc2VydCAoc3RyaW5nX29mX2RlY2ltYWxfbWFya3NbMF0gPT0gJy4nCi0JICAmJiBzdHJpbmdfb2ZfZGVjaW1hbF9tYXJrc1sxXSA9PSAwKTsKLSNkZWZpbmUgSVNfREVDSU1BTF9NQVJLKGMpCSgoYykgPT0gJy4nKQotI2Vsc2UKLSNkZWZpbmUgSVNfREVDSU1BTF9NQVJLKGMpCSgwICE9IHN0cmNociAoc3RyaW5nX29mX2RlY2ltYWxfbWFya3MsIChjKSkpCi0jZW5kaWYKLQotICBmaXJzdF9kaWdpdCA9ICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyOwotICBjID0gKmZpcnN0X2RpZ2l0OwotCi0gIGlmIChjID09ICctJyB8fCBjID09ICcrJykKLSAgICB7Ci0gICAgICBkaWdpdHNfc2lnbl9jaGFyID0gYzsKLSAgICAgIGZpcnN0X2RpZ2l0Kys7Ci0gICAgfQotICBlbHNlCi0gICAgZGlnaXRzX3NpZ25fY2hhciA9ICcrJzsKLQotICBzd2l0Y2ggKGZpcnN0X2RpZ2l0WzBdKQotICAgIHsKLSAgICBjYXNlICduJzoKLSAgICBjYXNlICdOJzoKLSAgICAgIGlmICghc3RybmNhc2VjbXAgKCJuYW4iLCBmaXJzdF9kaWdpdCwgMykpCi0JewotCSAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+c2lnbiA9IDA7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5leHBvbmVudCA9IDA7Ci0JICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sZWFkZXIgPQotCSAgICBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLT5sb3c7Ci0JICAqYWRkcmVzc19vZl9zdHJpbmdfcG9pbnRlciA9IGZpcnN0X2RpZ2l0ICsgMzsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnaSc6Ci0gICAgY2FzZSAnSSc6Ci0gICAgICBpZiAoIXN0cm5jYXNlY21wICgiaW5mIiwgZmlyc3RfZGlnaXQsIDMpKQotCXsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPQotCSAgICBkaWdpdHNfc2lnbl9jaGFyID09ICcrJyA/ICdQJyA6ICdOJzsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsKLQkgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxlYWRlciA9Ci0JICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKLQotCSAgZmlyc3RfZGlnaXQgKz0gMzsKLQkgIGlmICghc3RybmNhc2VjbXAgKCJpbml0eSIsIGZpcnN0X2RpZ2l0LCA1KSkKLQkgICAgZmlyc3RfZGlnaXQgKz0gNTsKLQotCSAgKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIgPSBmaXJzdF9kaWdpdDsKLQotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwgPSAwOwotICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwgPSAwOwotICBkZWNpbWFsX2V4cG9uZW50ID0gMDsKLSAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IDA7Ci0gIGZvciAocCA9IGZpcnN0X2RpZ2l0OwotICAgICAgICgoKGMgPSAqcCkgIT0gJ1wwJykKLQkmJiAoIWMgfHwgIUlTX0RFQ0lNQUxfTUFSSyAoYykpCi0JJiYgKCFjIHx8ICFzdHJjaHIgKHN0cmluZ19vZl9kZWNpbWFsX2V4cG9uZW50X21hcmtzLCBjKSkpOwotICAgICAgIHArKykKLSAgICB7Ci0gICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCXsKLQkgIGlmIChzZWVuX3NpZ25pZmljYW50X2RpZ2l0IHx8IGMgPiAnMCcpCi0JICAgIHsKLQkgICAgICArK251bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWw7Ci0JICAgICAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZpcnN0X2RpZ2l0Kys7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYnJlYWs7CQkvKiBwIC0+IGNoYXIgYWZ0ZXIgcHJlLWRlY2ltYWwgZGlnaXRzLiAqLwotCX0KLSAgICB9CQkJCS8qIEZvciBlYWNoIGRpZ2l0IGJlZm9yZSBkZWNpbWFsIG1hcmsuICovCi0KLSNpZm5kZWYgT0xEX0ZMT0FUX1JFQURTCi0gIC8qIElnbm9yZSB0cmFpbGluZyAwJ3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBUaGUgb3JpZ2luYWwgY29kZSBoZXJlCi0gICAqIChpZmRlZidkIG91dCkgZG9lcyBub3QgZG8gdGhpcywgYW5kIG51bWJlcnMgbGlrZQotICAgKgk0LjI5NDk2NzI5NjAwMDAwMDAwMDAwZSswOQkoMioqMzEpCi0gICAqIGNvbWUgb3V0IGluZXhhY3QgZm9yIHNvbWUgcmVhc29uIHJlbGF0ZWQgdG8gbGVuZ3RoIG9mIHRoZSBkaWdpdAotICAgKiBzdHJpbmcuCi0gICAqLwotICBpZiAoYyAmJiBJU19ERUNJTUFMX01BUksgKGMpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB6ZXJvcyA9IDA7CS8qIExlbmd0aCBvZiBjdXJyZW50IHN0cmluZyBvZiB6ZXJvcyAqLwotCi0gICAgICBmb3IgKHArKzsgKGMgPSAqcCkgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpOyBwKyspCi0JewotCSAgaWYgKGMgPT0gJzAnKQotCSAgICB7Ci0JICAgICAgemVyb3MrKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsICs9IDEgKyB6ZXJvczsKLQkgICAgICB6ZXJvcyA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2Vsc2UKLSAgaWYgKGMgJiYgSVNfREVDSU1BTF9NQVJLIChjKSkKLSAgICB7Ci0gICAgICBmb3IgKHArKzsKLQkgICAoKChjID0gKnApICE9ICdcMCcpCi0JICAgICYmICghYyB8fCAhc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywgYykpKTsKLQkgICBwKyspCi0JewotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbWF5IGJlIHJldHJhY3RlZCBiZWxvdy4gKi8KLQkgICAgICBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWwrKzsKLQotCSAgICAgIGlmICggLyogc2Vlbl9zaWduaWZpY2FudF9kaWdpdCB8fCAqLyBjID4gJzAnKQotCQl7Ci0JCSAgc2Vlbl9zaWduaWZpY2FudF9kaWdpdCA9IFRSVUU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCFzZWVuX3NpZ25pZmljYW50X2RpZ2l0KQotCQl7Ci0JCSAgbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQkJCS8qIEZvciBlYWNoIGRpZ2l0IGFmdGVyIGRlY2ltYWwgbWFyay4gKi8KLSAgICB9Ci0KLSAgd2hpbGUgKG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbAotCSAmJiBmaXJzdF9kaWdpdFtudW1iZXJfb2ZfZGlnaXRzX2JlZm9yZV9kZWNpbWFsCi0JCQkrIG51bWJlcl9vZl9kaWdpdHNfYWZ0ZXJfZGVjaW1hbF0gPT0gJzAnKQotICAgIC0tbnVtYmVyX29mX2RpZ2l0c19hZnRlcl9kZWNpbWFsOwotI2VuZGlmCi0KLSAgaWYgKGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKGMgPT0gJ18nKQotCWMgPSAqKytwOwotICAgIH0KLSAgaWYgKGMgJiYgc3RyY2hyIChzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywgYykpCi0gICAgewotICAgICAgY2hhciBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyOwotCi0gICAgICBjID0gKisrcDsKLSAgICAgIGlmIChmbGFnX202OGtfbXJpKQotCXsKLQkgIHdoaWxlIChjID09ICdfJykKLQkgICAgYyA9ICorK3A7Ci0JfQotICAgICAgaWYgKGMgJiYgc3RyY2hyICgiKy0iLCBjKSkKLQl7Ci0JICBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyID0gYzsKLQkgIGMgPSAqKytwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkaWdpdHNfZXhwb25lbnRfc2lnbl9jaGFyID0gJysnOwotCX0KLQotICAgICAgZm9yICg7IChjKTsgYyA9ICorK3ApCi0JewotCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBjKSkKLQkgICAgewotCSAgICAgIGRlY2ltYWxfZXhwb25lbnQgPSBkZWNpbWFsX2V4cG9uZW50ICogMTAgKyBjIC0gJzAnOwotCSAgICAgIC8qCi0JICAgICAgICogQlVHISBJZiB3ZSBvdmVyZmxvdyBoZXJlLCB3ZSBsb3NlIQotCSAgICAgICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGRpZ2l0c19leHBvbmVudF9zaWduX2NoYXIgPT0gJy0nKQotCXsKLQkgIGRlY2ltYWxfZXhwb25lbnQgPSAtZGVjaW1hbF9leHBvbmVudDsKLQl9Ci0gICAgfQotCi0gICphZGRyZXNzX29mX3N0cmluZ19wb2ludGVyID0gcDsKLQotCi0KLSAgbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGUgPQotICAgIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwgKyBudW1iZXJfb2ZfZGlnaXRzX2FmdGVyX2RlY2ltYWw7Ci0gIHJldHVybl92YWx1ZSA9IDA7Ci0gIGlmIChudW1iZXJfb2ZfZGlnaXRzX2F2YWlsYWJsZSA9PSAwKQotICAgIHsKLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmV4cG9uZW50ID0gMDsJLyogTm90IHN0cmljdGx5IG5lY2Vzc2FyeSAqLwotICAgICAgYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+bGVhZGVyCi0JPSAtMSArIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdzsKLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPSBkaWdpdHNfc2lnbl9jaGFyOwotICAgICAgLyogV2UgaGF2ZSBqdXN0IGNvbmNvY3RlZCAoKy8tKTAuMEUwICovCi0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgY291bnQ7CQkvKiBOdW1iZXIgb2YgdXNlZnVsIGRpZ2l0cyBsZWZ0IHRvIHNjYW4uICovCi0KLSAgICAgIExJVFRMRU5VTV9UWVBFICpkaWdpdHNfYmluYXJ5X2xvdzsKLSAgICAgIHVuc2lnbmVkIGludCBwcmVjaXNpb247Ci0gICAgICB1bnNpZ25lZCBpbnQgbWF4aW11bV91c2VmdWxfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlOwotICAgICAgdW5zaWduZWQgaW50IG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzOwotICAgICAgdW5zaWduZWQgaW50IHNpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXM7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnM7Ci0gICAgICBGTE9OVU1fVFlQRSBwb3dlcl9vZl8xMF9mbG9udW07Ci0gICAgICBGTE9OVU1fVFlQRSBkaWdpdHNfZmxvbnVtOwotCi0gICAgICBwcmVjaXNpb24gPSAoYWRkcmVzc19vZl9nZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci0+aGlnaAotCQkgICAtIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPmxvdwotCQkgICArIDEpOwkvKiBOdW1iZXIgb2YgZGVzdGluYXRpb24gbGl0dGxlbnVtcy4gKi8KLQotICAgICAgLyogSW5jbHVkZXMgZ3VhcmQgYml0cyAodHdvIGxpdHRsZW51bXMgd29ydGgpICovCi0jaWYgMCAvKiBUaGUgaW50ZWdlciB2ZXJzaW9uIGJlbG93IGlzIHZlcnkgY2xvc2UsIGFuZCBpdCBkb2Vzbid0Ci0JIHJlcXVpcmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCAod2hpY2ggaXMgY3VycmVudGx5IGJ1Z2d5IG9uCi0JIHRoZSBBbHBoYSkuICAqLwotICAgICAgbWF4aW11bV91c2VmdWxfZGlnaXRzID0gKCgoZG91YmxlKSAocHJlY2lzaW9uIC0gMikpCi0JCQkgICAgICAgKiAoKGRvdWJsZSkgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykpCi0JCQkgICAgICAgLyAoTE9HX1RPX0JBU0VfMl9PRl8xMCkpCi0JKyAyOwkJCS8qIDIgOjogZ3VhcmQgZGlnaXRzLiAqLwotI2Vsc2UKLSAgICAgIG1heGltdW1fdXNlZnVsX2RpZ2l0cyA9ICgoKHByZWNpc2lvbiAtIDIpKQotCQkJICAgICAgICogKCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKSkKLQkJCSAgICAgICAqIDEwMDAwMDAgLyAzMzIxOTI4KQotCSsgMjsJCQkvKiAyIDo6IGd1YXJkIGRpZ2l0cy4gKi8KLSNlbmRpZgotCi0gICAgICBpZiAobnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGUgPiBtYXhpbXVtX3VzZWZ1bF9kaWdpdHMpCi0JewotCSAgbnVtYmVyX29mX2RpZ2l0c190b191c2UgPSBtYXhpbXVtX3VzZWZ1bF9kaWdpdHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlID0gbnVtYmVyX29mX2RpZ2l0c19hdmFpbGFibGU7Ci0JfQotCi0gICAgICAvKiBDYXN0IHRoZXNlIHRvIFNJR05FRCBMT05HIGZpcnN0LCBvdGhlcndpc2UsIG9uIHN5c3RlbXMgd2l0aAotCSBMT05HIHdpZGVyIHRoYW4gSU5UIChzdWNoIGFzIEFscGhhIE9TRi8xKSwgdW5zaWduZWRuZXNzIG1heQotCSBjYXVzZSB1bmV4cGVjdGVkIHJlc3VsdHMuICAqLwotICAgICAgZGVjaW1hbF9leHBvbmVudCArPSAoKGxvbmcpIG51bWJlcl9vZl9kaWdpdHNfYmVmb3JlX2RlY2ltYWwKLQkJCSAgIC0gKGxvbmcpIG51bWJlcl9vZl9kaWdpdHNfdG9fdXNlKTsKLQotI2lmIDAKLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzCi0JPSAoKCgoZG91YmxlKSBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZSkgKiBMT0dfVE9fQkFTRV8yX09GXzEwKSArIDEpOwotI2Vsc2UKLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfYml0c19mb3JfZGlnaXRzCi0JPSAobnVtYmVyX29mX2RpZ2l0c190b191c2UgKiAzMzIxOTI4IC8gMTAwMDAwMCArIDEpOwotI2VuZGlmCi0KLSAgICAgIG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzCi0JPSAobW9yZV90aGFuX2Vub3VnaF9iaXRzX2Zvcl9kaWdpdHMKLQkgICAvIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkrIDI7Ci0KLSAgICAgIC8qIENvbXB1dGUgKGRpZ2l0cykgcGFydC4gSW4gIjEyLjM0RTU2IiB0aGlzIGlzIHRoZSAiMTIzNCIgcGFydC4KLQkgQXJpdGhtZXRpYyBpcyBleGFjdCBoZXJlLiBJZiBubyBkaWdpdHMgYXJlIHN1cHBsaWVkIHRoZW4gdGhpcwotCSBwYXJ0IGlzIGEgMCB2YWx1ZWQgYmluYXJ5IGludGVnZXIuICBBbGxvY2F0ZSByb29tIHRvIGJ1aWxkIHVwCi0JIHRoZSBiaW5hcnkgbnVtYmVyIGFzIGxpdHRsZW51bXMuICBXZSB3YW50IHRoaXMgbWVtb3J5IHRvCi0JIGRpc2FwcGVhciB3aGVuIHdlIGxlYXZlIHRoaXMgZnVuY3Rpb24uICBBc3N1bWUgbm8gYWxpZ25tZW50Ci0JIHByb2JsZW1zID0+IChyb29tIGZvciBuIG9iamVjdHMpID09IG4gKiAocm9vbSBmb3IgMQotCSBvYmplY3QpLiAgKi8KLQotICAgICAgc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcyA9IG1vcmVfdGhhbl9lbm91Z2hfbGl0dGxlbnVtc19mb3JfZGlnaXRzOwotICAgICAgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnMgPSBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zCi0JKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICAgICAgZGlnaXRzX2JpbmFyeV9sb3cgPSAoTElUVExFTlVNX1RZUEUgKikKLQlhbGxvY2EgKHNpemVfb2ZfZGlnaXRzX2luX2NoYXJzKTsKLQotICAgICAgbWVtc2V0ICgoY2hhciAqKSBkaWdpdHNfYmluYXJ5X2xvdywgJ1wwJywgc2l6ZV9vZl9kaWdpdHNfaW5fY2hhcnMpOwotCi0gICAgICAvKiBEaWdpdHNfYmluYXJ5X2xvd1tdIGlzIGFsbG9jYXRlZCBhbmQgemVyb2VkLiAqLwotCi0gICAgICAvKgotICAgICAgICogUGFyc2UgdGhlIGRlY2ltYWwgZGlnaXRzIGFzIGlmICogZGlnaXRzX2xvdyB3YXMgaW4gdGhlIHVuaXRzIHBvc2l0aW9uLgotICAgICAgICogRW1pdCBhIGJpbmFyeSBudW1iZXIgaW50byBkaWdpdHNfYmluYXJ5X2xvd1tdLgotICAgICAgICoKLSAgICAgICAqIFVzZSBhIGxhcmdlLXByZWNpc2lvbiB2ZXJzaW9uIG9mOgotICAgICAgICogKCgoMXN0LWRpZ2l0KSAqIDEwICsgMm5kLWRpZ2l0KSAqIDEwICsgM3JkLWRpZ2l0IC4uLikgKiAxMCArIGxhc3QtZGlnaXQKLSAgICAgICAqLwotCi0gICAgICBmb3IgKHAgPSBmaXJzdF9kaWdpdCwgY291bnQgPSBudW1iZXJfb2ZfZGlnaXRzX3RvX3VzZTsgY291bnQ7IHArKywgLS1jb3VudCkKLQl7Ci0JICBjID0gKnA7Ci0JICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBNdWx0aXBseSBieSAxMC4gQXNzdW1lIGNhbiBuZXZlciBvdmVyZmxvdy4KLQkgICAgICAgKiBBZGQgdGhpcyBkaWdpdCB0byBkaWdpdHNfYmluYXJ5X2xvd1tdLgotCSAgICAgICAqLwotCi0JICAgICAgbG9uZyBjYXJyeTsKLQkgICAgICBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtX3BvaW50ZXI7Ci0JICAgICAgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9saW1pdDsKLQotCSAgICAgIGxpdHRsZW51bV9saW1pdCA9IGRpZ2l0c19iaW5hcnlfbG93Ci0JCSsgbW9yZV90aGFuX2Vub3VnaF9saXR0bGVudW1zX2Zvcl9kaWdpdHMKLQkJLSAxOwotCi0JICAgICAgY2FycnkgPSBjIC0gJzAnOwkvKiBjaGFyIC0+IGJpbmFyeSAqLwotCi0JICAgICAgZm9yIChsaXR0bGVudW1fcG9pbnRlciA9IGRpZ2l0c19iaW5hcnlfbG93OwotCQkgICBsaXR0bGVudW1fcG9pbnRlciA8PSBsaXR0bGVudW1fbGltaXQ7Ci0JCSAgIGxpdHRsZW51bV9wb2ludGVyKyspCi0JCXsKLQkJICBsb25nIHdvcms7Ci0KLQkJICB3b3JrID0gY2FycnkgKyAxMCAqIChsb25nKSAoKmxpdHRsZW51bV9wb2ludGVyKTsKLQkJICAqbGl0dGxlbnVtX3BvaW50ZXIgPSB3b3JrICYgTElUVExFTlVNX01BU0s7Ci0JCSAgY2FycnkgPSB3b3JrID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJfQotCi0JICAgICAgaWYgKGNhcnJ5ICE9IDApCi0JCXsKLQkJICAvKgotCQkgICAqIFdlIGhhdmUgYSBHUk9TUyBpbnRlcm5hbCBlcnJvci4KLQkJICAgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCi0JCSAgICovCi0JCSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICsrY291bnQ7CQkvKiAnLicgZG9lc24ndCBhbHRlciBkaWdpdHMgdXNlZCBjb3VudC4gKi8KLQkgICAgfQotCX0KLQotCi0gICAgICAvKgotICAgICAgICogRGlnaXRzX2JpbmFyeV9sb3dbXSBwcm9wZXJseSBlbmNvZGVzIHRoZSB2YWx1ZSBvZiB0aGUgZGlnaXRzLgotICAgICAgICogRm9yZ2V0IGFib3V0IGFueSBoaWdoLW9yZGVyIGxpdHRsZW51bXMgdGhhdCBhcmUgMC4KLSAgICAgICAqLwotICAgICAgd2hpbGUgKGRpZ2l0c19iaW5hcnlfbG93W3NpemVfb2ZfZGlnaXRzX2luX2xpdHRsZW51bXMgLSAxXSA9PSAwCi0JICAgICAmJiBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zID49IDIpCi0Jc2l6ZV9vZl9kaWdpdHNfaW5fbGl0dGxlbnVtcy0tOwotCi0gICAgICBkaWdpdHNfZmxvbnVtLmxvdyA9IGRpZ2l0c19iaW5hcnlfbG93OwotICAgICAgZGlnaXRzX2Zsb251bS5oaWdoID0gZGlnaXRzX2JpbmFyeV9sb3cgKyBzaXplX29mX2RpZ2l0c19pbl9saXR0bGVudW1zIC0gMTsKLSAgICAgIGRpZ2l0c19mbG9udW0ubGVhZGVyID0gZGlnaXRzX2Zsb251bS5oaWdoOwotICAgICAgZGlnaXRzX2Zsb251bS5leHBvbmVudCA9IDA7Ci0gICAgICAvKgotICAgICAgICogVGhlIHZhbHVlIG9mIGRpZ2l0c19mbG9udW0gLiBzaWduIHNob3VsZCBub3QgYmUgaW1wb3J0YW50LgotICAgICAgICogV2UgaGF2ZSBhbHJlYWR5IGRlY2lkZWQgdGhlIG91dHB1dCdzIHNpZ24uCi0gICAgICAgKiBXZSB0cnVzdCB0aGF0IHRoZSBzaWduIHdvbid0IGluZmx1ZW5jZSB0aGUgb3RoZXIgcGFydHMgb2YgdGhlIG51bWJlciEKLSAgICAgICAqIFNvIHdlIGdpdmUgaXQgYSB2YWx1ZSBmb3IgdGhlc2UgcmVhc29uczoKLSAgICAgICAqICgxKSBjb3VydGVzeSB0byBodW1hbnMgcmVhZGluZy9kZWJ1Z2dpbmcKLSAgICAgICAqICAgICB0aGVzZSBudW1iZXJzIHNvIHRoZXkgZG9uJ3QgZ2V0IGV4Y2l0ZWQgYWJvdXQgc3RyYW5nZSB2YWx1ZXMKLSAgICAgICAqICgyKSBpbiBmdXR1cmUgdGhlcmUgbWF5IGJlIG1vcmUgbWVhbmluZyBhdHRhY2hlZCB0byBzaWduLAotICAgICAgICogICAgIGFuZCB3aGF0IHdhcwotICAgICAgICogICAgIGhhcm1sZXNzIG5vaXNlIG1heSBiZWNvbWUgZGlzcnVwdGl2ZSwgaWxsLWNvbmRpdGlvbmVkIChvciB3b3JzZSkKLSAgICAgICAqICAgICBpbnB1dC4KLSAgICAgICAqLwotICAgICAgZGlnaXRzX2Zsb251bS5zaWduID0gJysnOwotCi0gICAgICB7Ci0JLyoKLQkgKiBDb21wdXRlIHRoZSBtYW50c3NhICgmIGV4cG9uZW50KSBvZiB0aGUgcG93ZXIgb2YgMTAuCi0JICogSWYgc3VjZXNzZnVsLCB0aGVuIG11bHRpcGx5IHRoZSBwb3dlciBvZiAxMCBieSB0aGUgZGlnaXRzCi0JICogZ2l2aW5nIHJldHVybl9iaW5hcnlfbWFudGlzc2EgYW5kIHJldHVybl9iaW5hcnlfZXhwb25lbnQuCi0JICovCi0KLQlMSVRUTEVOVU1fVFlQRSAqcG93ZXJfYmluYXJ5X2xvdzsKLQlpbnQgZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZTsKLQkvKiBUaGlzIHJlZmVycyB0byB0aGUgIi01NiIgaW4gIjEyLjM0RS01NiIuICovCi0JLyogRkFMU0U6IGRlY2ltYWxfZXhwb25lbnQgaXMgcG9zaXRpdmUgKG9yIDApICovCi0JLyogVFJVRTogIGRlY2ltYWxfZXhwb25lbnQgaXMgbmVnYXRpdmUgKi8KLQlGTE9OVU1fVFlQRSB0ZW1wb3JhcnlfZmxvbnVtOwotCUxJVFRMRU5VTV9UWVBFICp0ZW1wb3JhcnlfYmluYXJ5X2xvdzsKLQl1bnNpZ25lZCBpbnQgc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zOwotCXVuc2lnbmVkIGludCBzaXplX29mX3Bvd2VyX2luX2NoYXJzOwotCi0Jc2l6ZV9vZl9wb3dlcl9pbl9saXR0bGVudW1zID0gcHJlY2lzaW9uOwotCS8qIFByZWNpc2lvbiBoYXMgYSBidWlsdC1pbiBmdWRnZSBmYWN0b3Igc28gd2UgZ2V0IGEgZmV3IGd1YXJkIGJpdHMuICovCi0KLQlkZWNpbWFsX2V4cG9uZW50X2lzX25lZ2F0aXZlID0gZGVjaW1hbF9leHBvbmVudCA8IDA7Ci0JaWYgKGRlY2ltYWxfZXhwb25lbnRfaXNfbmVnYXRpdmUpCi0JICB7Ci0JICAgIGRlY2ltYWxfZXhwb25lbnQgPSAtZGVjaW1hbF9leHBvbmVudDsKLQkgIH0KLQotCS8qIEZyb20gbm93IG9uOiB0aGUgZGVjaW1hbCBleHBvbmVudCBpcyA+IDAuIEl0cyBzaWduIGlzIHNlcGFyYXRlLiAqLwotCi0Jc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyA9IHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcwotCSAgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSArIDI7Ci0KLQlwb3dlcl9iaW5hcnlfbG93ID0gKExJVFRMRU5VTV9UWVBFICopIGFsbG9jYSAoc2l6ZV9vZl9wb3dlcl9pbl9jaGFycyk7Ci0JdGVtcG9yYXJ5X2JpbmFyeV9sb3cgPSAoTElUVExFTlVNX1RZUEUgKikgYWxsb2NhIChzaXplX29mX3Bvd2VyX2luX2NoYXJzKTsKLQltZW1zZXQgKChjaGFyICopIHBvd2VyX2JpbmFyeV9sb3csICdcMCcsIHNpemVfb2ZfcG93ZXJfaW5fY2hhcnMpOwotCSpwb3dlcl9iaW5hcnlfbG93ID0gMTsKLQlwb3dlcl9vZl8xMF9mbG9udW0uZXhwb25lbnQgPSAwOwotCXBvd2VyX29mXzEwX2Zsb251bS5sb3cgPSBwb3dlcl9iaW5hcnlfbG93OwotCXBvd2VyX29mXzEwX2Zsb251bS5sZWFkZXIgPSBwb3dlcl9iaW5hcnlfbG93OwotCXBvd2VyX29mXzEwX2Zsb251bS5oaWdoID0gcG93ZXJfYmluYXJ5X2xvdyArIHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcyAtIDE7Ci0JcG93ZXJfb2ZfMTBfZmxvbnVtLnNpZ24gPSAnKyc7Ci0JdGVtcG9yYXJ5X2Zsb251bS5sb3cgPSB0ZW1wb3JhcnlfYmluYXJ5X2xvdzsKLQl0ZW1wb3JhcnlfZmxvbnVtLmhpZ2ggPSB0ZW1wb3JhcnlfYmluYXJ5X2xvdyArIHNpemVfb2ZfcG93ZXJfaW5fbGl0dGxlbnVtcyAtIDE7Ci0JLyoKLQkgKiAocG93ZXIpID09IDEuCi0JICogU3BhY2UgZm9yIHRlbXBvcmFyeV9mbG9udW0gYWxsb2NhdGVkLgotCSAqLwotCi0JLyoKLQkgKiAuLi4KLQkgKgotCSAqIFdISUxFCW1vcmUgYml0cwotCSAqIERPCWZpbmQgbmV4dCBiaXQgKHdpdGggcGxhY2UgdmFsdWUpCi0JICoJbXVsdGlwbHkgaW50byBwb3dlciBtYW50aXNzYQotCSAqIE9ECi0JICovCi0JewotCSAgaW50IHBsYWNlX251bWJlcl9saW1pdDsKLQkgIC8qIEFueSAxMF4oMl5uKSB3aG9zZSAibiIgZXhjZWVkcyB0aGlzICovCi0JICAvKiB2YWx1ZSB3aWxsIGZhbGwgb2ZmIHRoZSBlbmQgb2YgKi8KLQkgIC8qIGZsb251bV9YWFhYX3Bvd2Vyc19vZl90ZW5bXS4gKi8KLQkgIGludCBwbGFjZV9udW1iZXI7Ci0JICBjb25zdCBGTE9OVU1fVFlQRSAqbXVsdGlwbGljYW5kOwkvKiAtPiAxMF4oMl5uKSAqLwotCi0JICBwbGFjZV9udW1iZXJfbGltaXQgPSB0YWJsZV9zaXplX29mX2Zsb251bV9wb3dlcnNfb2ZfdGVuOwotCi0JICBtdWx0aXBsaWNhbmQgPSAoZGVjaW1hbF9leHBvbmVudF9pc19uZWdhdGl2ZQotCQkJICA/IGZsb251bV9uZWdhdGl2ZV9wb3dlcnNfb2ZfdGVuCi0JCQkgIDogZmxvbnVtX3Bvc2l0aXZlX3Bvd2Vyc19vZl90ZW4pOwotCi0JICBmb3IgKHBsYWNlX251bWJlciA9IDE7LyogUGxhY2UgdmFsdWUgb2YgdGhpcyBiaXQgb2YgZXhwb25lbnQuICovCi0JICAgICAgIGRlY2ltYWxfZXhwb25lbnQ7LyogUXVpdCB3aGVuIG5vIG1vcmUgMSBiaXRzIGluIGV4cG9uZW50LiAqLwotCSAgICAgICBkZWNpbWFsX2V4cG9uZW50ID4+PSAxLCBwbGFjZV9udW1iZXIrKykKLQkgICAgewotCSAgICAgIGlmIChkZWNpbWFsX2V4cG9uZW50ICYgMSkKLQkJewotCQkgIGlmIChwbGFjZV9udW1iZXIgPiBwbGFjZV9udW1iZXJfbGltaXQpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSBkZWNpbWFsIGV4cG9uZW50IGhhcyBhIG1hZ25pdHVkZSBzbyBncmVhdAotCQkJIHRoYXQgb3VyIHRhYmxlcyBjYW4ndCBoZWxwIHVzIGZyYWdtZW50IGl0LgotCQkJIEFsdGhvdWdoIHRoaXMgcm91dGluZSBpcyBpbiBlcnJvciBiZWNhdXNlIGl0Ci0JCQkgY2FuJ3QgaW1hZ2luZSBhIG51bWJlciB0aGF0IGJpZywgc2lnbmFsIGFuCi0JCQkgZXJyb3IgYXMgaWYgaXQgaXMgdGhlIHVzZXIncyBmYXVsdCBmb3IKLQkJCSBwcmVzZW50aW5nIHN1Y2ggYSBiaWcgbnVtYmVyLiAgKi8KLQkJICAgICAgcmV0dXJuX3ZhbHVlID0gRVJST1JfRVhQT05FTlRfT1ZFUkZMT1c7Ci0JCSAgICAgIC8qIHF1aXQgb3V0IG9mIGxvb3AgZ3JhY2VmdWxseSAqLwotCQkgICAgICBkZWNpbWFsX2V4cG9uZW50ID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0jaWZkZWYgVFJBQ0UKLQkJICAgICAgcHJpbnRmICgiYmVmb3JlIG11bHRpcGx5LCBwbGFjZV9udW1iZXIgPSAlZC4sIHBvd2VyX29mXzEwX2Zsb251bTpcbiIsCi0JCQkgICAgICBwbGFjZV9udW1iZXIpOwotCi0JCSAgICAgIGZsb251bV9wcmludCAoJnBvd2VyX29mXzEwX2Zsb251bSk7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotI2lmZGVmIFRSQUNFCi0JCSAgICAgIHByaW50ZiAoIm11bHRpcGxpZXI6XG4iKTsKLQkJICAgICAgZmxvbnVtX3ByaW50IChtdWx0aXBsaWNhbmQgKyBwbGFjZV9udW1iZXIpOwotCQkgICAgICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0jZW5kaWYKLQkJICAgICAgZmxvbnVtX211bHRpcCAobXVsdGlwbGljYW5kICsgcGxhY2VfbnVtYmVyLAotCQkJCSAgICAgJnBvd2VyX29mXzEwX2Zsb251bSwgJnRlbXBvcmFyeV9mbG9udW0pOwotI2lmZGVmIFRSQUNFCi0JCSAgICAgIHByaW50ZiAoImFmdGVyIG11bHRpcGx5OlxuIik7Ci0JCSAgICAgIGZsb251bV9wcmludCAoJnRlbXBvcmFyeV9mbG9udW0pOwotCQkgICAgICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0jZW5kaWYKLQkJICAgICAgZmxvbnVtX2NvcHkgKCZ0ZW1wb3JhcnlfZmxvbnVtLCAmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLSNpZmRlZiBUUkFDRQotCQkgICAgICBwcmludGYgKCJhZnRlciBjb3B5OlxuIik7Ci0JCSAgICAgIGZsb251bV9wcmludCAoJnBvd2VyX29mXzEwX2Zsb251bSk7Ci0JCSAgICAgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCQkgICAgfSAvKiBJZiB0aGlzIGJpdCBvZiBkZWNpbWFsX2V4cG9uZW50IHdhcyBjb21wdXRhYmxlLiovCi0JCX0gLyogSWYgdGhpcyBiaXQgb2YgZGVjaW1hbF9leHBvbmVudCB3YXMgc2V0LiAqLwotCSAgICB9IC8qIEZvciBlYWNoIGJpdCBvZiBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgZXhwb25lbnQgKi8KLSNpZmRlZiBUUkFDRQotCSAgcHJpbnRmICgiYWZ0ZXIgY29tcHV0aW5nIHBvd2VyX29mXzEwX2Zsb251bTpcbiIpOwotCSAgZmxvbnVtX3ByaW50ICgmcG93ZXJfb2ZfMTBfZmxvbnVtKTsKLQkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLSNlbmRpZgotCX0KLQotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogcG93ZXJfb2ZfMTBfZmxvbnVtIGlzIHBvd2VyIG9mIHRlbiBpbiBiaW5hcnkgKG1hbnRpc3NhKSAsIChleHBvbmVudCkuCi0gICAgICAgKiBJdCBtYXkgYmUgdGhlIG51bWJlciAxLCBpbiB3aGljaCBjYXNlIHdlIGRvbid0IE5FRUQgdG8gbXVsdGlwbHkuCi0gICAgICAgKgotICAgICAgICogTXVsdGlwbHkgKGRlY2ltYWwgZGlnaXRzKSBieSBwb3dlcl9vZl8xMF9mbG9udW0uCi0gICAgICAgKi8KLQotICAgICAgZmxvbnVtX211bHRpcCAoJnBvd2VyX29mXzEwX2Zsb251bSwgJmRpZ2l0c19mbG9udW0sIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpOwotICAgICAgLyogQXNzZXJ0IHNpZ24gb2YgdGhlIG51bWJlciB3ZSBtYWRlIGlzICcrJy4gKi8KLSAgICAgIGFkZHJlc3Nfb2ZfZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXItPnNpZ24gPSBkaWdpdHNfc2lnbl9jaGFyOwotCi0gICAgfQotICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotfQotCi0jaWZkZWYgVFJBQ0UKLXN0YXRpYyB2b2lkCi1mbG9udW1fcHJpbnQgKGYpCi0gICAgIGNvbnN0IEZMT05VTV9UWVBFICpmOwotewotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIGNoYXIgbGl0dGxlbnVtX2Zvcm1hdFsxMF07Ci0gIHNwcmludGYgKGxpdHRsZW51bV9mb3JtYXQsICIgJSUwJWR4Iiwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiAyKTsKLSNkZWZpbmUgcHJpbnRfbGl0dGxlbnVtKExQKQkocHJpbnRmIChsaXR0bGVudW1fZm9ybWF0LCBMUCkpCi0gIHByaW50ZiAoImZsb251bSBAJXAgJWMgZSVsZCIsIGYsIGYtPnNpZ24sIGYtPmV4cG9uZW50KTsKLSAgaWYgKGYtPmxvdyA8IGYtPmhpZ2gpCi0gICAgZm9yIChscCA9IGYtPmhpZ2g7IGxwID49IGYtPmxvdzsgbHAtLSkKLSAgICAgIHByaW50X2xpdHRsZW51bSAoKmxwKTsKLSAgZWxzZQotICAgIGZvciAobHAgPSBmLT5sb3c7IGxwIDw9IGYtPmhpZ2g7IGxwKyspCi0gICAgICBwcmludF9saXR0bGVudW0gKCpscCk7Ci0gIHByaW50ZiAoIlxuIik7Ci0gIGZmbHVzaCAoc3Rkb3V0KTsKLX0KLSNlbmRpZgotCi0vKiBlbmQgb2YgYXRvZl9nZW5lcmljLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9iaWdudW0tY29weS5jIGIvZ2FzL2JpZ251bS1jb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZmZjYmYuLjAwMDAwMDAKLS0tIGEvZ2FzL2JpZ251bS1jb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKiBiaWdudW1fY29weS5jIC0gY29weSBhIGJpZ251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qCi0gKgkJCWJpZ251bV9jb3B5ICgpCi0gKgotICogQ29weSBhIGJpZ251bSBmcm9tIGluIHRvIG91dC4KLSAqIElmIHRoZSBvdXRwdXQgaXMgc2hvcnRlciB0aGFuIHRoZSBpbnB1dCwgY29weSBsb3dlci1vcmRlciBsaXR0bGVudW1zLgotICogUmV0dXJuIDAgb3IgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBsaXR0bGVudW1zIGRyb3BwZWQuCi0gKiBBc3N1bWVzIGxpdHRsZW51bSBhcnJheXMgYXJlIGRlbnNlbHkgcGFja2VkOiBubyB1bnVzZWQgY2hhcnMgYmV0d2VlbgotICogdGhlIGxpdHRsZW51bXMuIFVzZXMgbWVtY3B5KCkgdG8gbW92ZSBsaXR0bGVudW1zLCBhbmQgd2FudHMgdG8KLSAqIGtub3cgbGVuZ3RoIChpbiBjaGFycykgb2YgdGhlIGlucHV0IGJpZ251bS4KLSAqLwotCi0vKiB2b2lkICovCi1pbnQKLWJpZ251bV9jb3B5IChpbiwgaW5fbGVuZ3RoLCBvdXQsIG91dF9sZW5ndGgpCi0gICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICppbjsKLSAgICAgcmVnaXN0ZXIgaW50IGluX2xlbmd0aDsJLyogaW4gc2l6ZW9mKGxpdHRsZW51bSlzICovCi0gICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpvdXQ7Ci0gICAgIHJlZ2lzdGVyIGludCBvdXRfbGVuZ3RoOwkvKiBpbiBzaXplb2YobGl0dGxlbnVtKXMgKi8KLXsKLSAgaW50IHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZDsKLQotICBpZiAob3V0X2xlbmd0aCA8IGluX2xlbmd0aCkKLSAgICB7Ci0gICAgICBMSVRUTEVOVU1fVFlQRSAqcDsJLyogLT4gbW9zdCBzaWduaWZpY2FudCAobm9uLXplcm8pIGlucHV0Ci0JCQkJICAgICAgbGl0dGxlbnVtLiAqLwotCi0gICAgICBtZW1jcHkgKCh2b2lkICopIG91dCwgKHZvaWQgKikgaW4sCi0JICAgICAgKHVuc2lnbmVkIGludCkgb3V0X2xlbmd0aCA8PCBMSVRUTEVOVU1fU0hJRlQpOwotICAgICAgZm9yIChwID0gaW4gKyBpbl9sZW5ndGggLSAxOyBwID49IGluOyAtLXApCi0JewotCSAgaWYgKCpwKQotCSAgICBicmVhazsKLQl9Ci0gICAgICBzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPSBwIC0gaW4gLSBpbl9sZW5ndGggKyAxOwotCi0gICAgICBpZiAoc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkIDwgMCkKLQl7Ci0JICBzaWduaWZpY2FudF9saXR0bGVudW1zX2Ryb3BwZWQgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZW1jcHkgKChjaGFyICopIG91dCwgKGNoYXIgKikgaW4sCi0JICAgICAgKHVuc2lnbmVkIGludCkgaW5fbGVuZ3RoIDw8IExJVFRMRU5VTV9TSElGVCk7Ci0KLSAgICAgIGlmIChvdXRfbGVuZ3RoID4gaW5fbGVuZ3RoKQotCXsKLQkgIG1lbXNldCAoKGNoYXIgKikgKG91dCArIGluX2xlbmd0aCksCi0JCSAgJ1wwJywKLQkJICAodW5zaWduZWQgaW50KSAob3V0X2xlbmd0aCAtIGluX2xlbmd0aCkgPDwgTElUVExFTlVNX1NISUZUKTsKLQl9Ci0KLSAgICAgIHNpZ25pZmljYW50X2xpdHRsZW51bXNfZHJvcHBlZCA9IDA7Ci0gICAgfQotCi0gIHJldHVybiAoc2lnbmlmaWNhbnRfbGl0dGxlbnVtc19kcm9wcGVkKTsKLX0JCQkJLyogYmlnbnVtX2NvcHkoKSAqLwotCi0vKiBlbmQgb2YgYmlnbnVtLWNvcHkuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2JpZ251bS5oIGIvZ2FzL2JpZ251bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2IyZjE2Li4wMDAwMDAwCi0tLSBhL2dhcy9iaWdudW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIGJpZ251bS5oLWFyYml0cmFyeSBwcmVjaXNpb24gaW50ZWdlcnMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCUFyYml0cmFyeS1wcmVjaXNpb24gaW50ZWdlciBhcml0aG1ldGljLgkJCQkqCi0gKglGb3Igc3BlZWQsIHdlIHdvcmsgaW4gZ3JvdXBzIG9mIGJpdHMsIGV2ZW4gdGhvdWdoIHRoaXMJCSoKLSAqCWNvbXBsaWNhdGVzIGFsZ29yaXRobXMuCQkJCQkJKgotICoJRWFjaCBncm91cCBvZiBiaXRzIGlzIGNhbGxlZCBhICdsaXR0bGVudW0nLgkJCSoKLSAqCUEgYnVuY2ggb2YgbGl0dGxlbnVtcyByZXByZXNlbnRpbmcgYSAocG9zc2libHkgbGFyZ2UpCQkqCi0gKglpbnRlZ2VyIGlzIGNhbGxlZCBhICdiaWdudW0nLgkJCQkJKgotICoJQmlnbnVtcyBhcmUgPj0gMC4JCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUJTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCSgxNikKLSNkZWZpbmUJTElUVExFTlVNX1JBRElYCQkJKDEgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotI2RlZmluZQlMSVRUTEVOVU1fTUFTSwkJCSgweEZGRkYpCi0jZGVmaW5lIExJVFRMRU5VTV9TSElGVAkJCSgxKQotI2RlZmluZSBDSEFSU19QRVJfTElUVExFTlVNCQkoMSA8PCBMSVRUTEVOVU1fU0hJRlQpCi0jaWZuZGVmIEJJVFNfUEVSX0NIQVIKLSNkZWZpbmUgQklUU19QRVJfQ0hBUgkJCSg4KQotI2VuZGlmCi0KLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgTElUVExFTlVNX1RZUEU7Ci0KLS8qIEpGIHRydW5jYXRlZCB0aGlzIHRvIGdldCBhcm91bmQgYSBwcm9ibGVtIHdpdGggR0NDICovCi0jZGVmaW5lCUxPR19UT19CQVNFXzJfT0ZfMTAgKDMuMzIxOTI4MDk0ODg3MzYyMzQ3ODcwMzE5NDI5NDg5MzkwMTc1ODY1MSkKLS8qIFdBUk5JTkc6IEkgaGF2ZW4ndCBjaGVja2VkIHRoYXQgdGhlIHRyYWlsaW5nIGRpZ2l0cyBhcmUgY29ycmVjdCEgKi8KLQotLyogbGVuZ3RocyBhcmUgaW4gc2l6ZW9mKGxpdHRsZW51bSlzICovCi0KLWludCBiaWdudW1fY29weSBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqIGluLCBpbnQgaW5fbGVuZ3RoLAotCQkJIExJVFRMRU5VTV9UWVBFICogb3V0LCBpbnQgb3V0X2xlbmd0aCkpOwotCi0vKiBlbmQgb2YgYmlnbnVtLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9iaXRfZml4LmggYi9nYXMvYml0X2ZpeC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTcyOWE3Li4wMDAwMDAwCi0tLSBhL2dhcy9iaXRfZml4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKiB3cml0ZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgYml0X2ZpeCB3YXMgaW1wbGVtZW50ZWQgdG8gc3VwcG9ydCBtYWNoaW5lcyB0aGF0IG5lZWQgdmFyaWFibGVzCi0gICB0byBiZSBpbnNlcnRlZCBpbiBiaXRmaWVsZHMgb3RoZXIgdGhhbiAxLCAyIGFuZCA0IGJ5dGVzLgotICAgRnVydGhlcm1vcmUgaXQgZ2l2ZXMgdXMgYSBwb3NzaWJpbGxpdHkgdG8gbWFzayBpbiBiaXRzIGluIHRoZSBzeW1ib2wKLSAgIHdoZW4gaXQncyBmaXhlZCBpbiB0aGUgb2JqZWN0Y29kZSBhbmQgY2hlY2sgdGhlIHN5bWJvbHMgbGltaXRzLgotCi0gICBUaGUgb3ItbWFzayBpcyB1c2VkIHRvIHNldCB0aGUgaHVmZm1hbiBiaXRzIGluIGRpc3BsYWNlbWVudHMgZm9yIHRoZQotICAgbnMzMmsgcG9ydC4KLSAgIFRoZSBhY2JpLCBhZGRxaSwgbW92cWksIGNtcHFpIGluc3RydWN0aW9uIHJlcXVpcmVzIGFuIGFzc2VtYmxlciB0aGF0Ci0gICBjYW4gaGFuZGxlIGJpdGZpZWxkcy4gSWUgaGFuZGxlIGFuIGV4cHJlc3Npb24sIGV2YWx1YXRlIGl0IGFuZCBpbnNlcnQKLSAgIHRoZSByZXN1bHQgaW4gYW4gc29tZSBiaXRmaWVsZC4gKCBleDogNSBiaXRzIGluIGEgc2hvcnQgZmllbGQgb2YgYSBvcGNvZGUpCi0gICAqLwotCi0jaWZuZGVmIF9fYml0X2ZpeF9oX18KLSNkZWZpbmUgX19iaXRfZml4X2hfXwotCi1zdHJ1Y3QgYml0X2ZpeAotICB7Ci0gICAgaW50IGZ4X2JpdF9zaXplOwkJLyogTGVuZ3RoIG9mIGJpdGZpZWxkICovCi0gICAgaW50IGZ4X2JpdF9vZmZzZXQ7CQkvKiBCaXQgb2Zmc2V0IHRvIGJpdGZpZWxkICovCi0gICAgbG9uZyBmeF9iaXRfYmFzZTsJCS8qIFdoZXJlIGRvIHdlIGFwcGx5IHRoZSBiaXRmaXguCi0JCQkJICAgICAgSWYgdGhpcyBpcyB6ZXJvLCBkZWZhdWx0IGlzIGFzc3VtZWQuICovCi0gICAgbG9uZyBmeF9iaXRfYmFzZV9hZGo7CS8qIEFkanVzdG1lbnQgb2YgYmFzZSAqLwotICAgIGxvbmcgZnhfYml0X21heDsJCS8qIFNpZ25leHRlbmRlZCBtYXggZm9yIGJpdGZpZWxkICovCi0gICAgbG9uZyBmeF9iaXRfbWluOwkJLyogU2lnbmV4dGVuZGVkIG1pbiBmb3IgYml0ZmllbGQgKi8KLSAgICBsb25nIGZ4X2JpdF9hZGQ7CQkvKiBPciBtYXNrLCB1c2VkIGZvciBodWZmbWFuIHByZWZpeCAqLwotICB9OwotdHlwZWRlZiBzdHJ1Y3QgYml0X2ZpeCBiaXRfZml4UzsKLQotI2VuZGlmIC8qIF9fYml0X2ZpeF9oX18gKi8KLQotLyogZW5kIG9mIGJpdF9maXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NnZW4uYyBiL2dhcy9jZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWUxYjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKiBHQVMgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJjZ2VuLWRlc2MuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIE9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLCBtdXN0IGJlIHNldCBieSBtZF9iZWdpbi4gICovCi0KLUNHRU5fQ1BVX0RFU0MgZ2FzX2NnZW5fY3B1X2Rlc2M7Ci0KLS8qIENhbGxiYWNrIHRvIGluc2VydCBhIHJlZ2lzdGVyIGludG8gdGhlIHN5bWJvbCB0YWJsZS4KLSAgIEEgdGFyZ2V0IG1heSBjaG9vc2UgdG8gbGV0IEdBUyBwYXJzZSB0aGUgcmVnaXN0ZXJzLgotICAgPz8/IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXZvaWQKLWNnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAobmFtZSwgbnVtYmVyKQotICAgICBjaGFyICogbmFtZTsKLSAgICAgaW50IG51bWJlcjsKLXsKLSAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaGVyZSBpbnN0ZWFkIG9mIHN5bWJvbF9uZXcgc28gd2UgZG9uJ3QgdHJ5IHRvCi0gICAgIG91dHB1dCByZWdpc3RlcnMgaW50byB0aGUgb2JqZWN0IGZpbGUncyBzeW1ib2wgdGFibGUuICAqLwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChuYW1lLCByZWdfc2VjdGlvbiwKLQkJCQkgICAgICBudW1iZXIsICYgemVyb19hZGRyZXNzX2ZyYWcpKTsKLX0KLQotLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcwotICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCi0gICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuCi0KLSAgIFRoaXMgaXMgdXNlZCBieSBjcHUncyB3aXRoIHNpbXBsZSBvcGVyYW5kcy4gIEl0IGtlZXBzIGtub3dsZWRnZSBvZiB3aGF0Ci0gICBhbiBgZXhwcmVzc2lvblMnIGlzIGFuZCB3aGF0IGEgYGZpeHVwJyBpcyBvdXQgb2YgQ0dFTiB3aGljaCBmb3IgdGhlIHRpbWUKLSAgIGJlaW5nIGlzIHByZWZlcmFibGUuCi0KLSAgIE9QSU5ERVggaXMgdGhlIGluZGV4IGluIHRoZSBvcGVyYW5kIHRhYmxlLgotICAgT1BJTkZPIGlzIHNvbWV0aGluZyB0aGUgY2FsbGVyIGNob29zZXMgdG8gaGVscCBpbiByZWxvYyBkZXRlcm1pbmF0aW9uLiAgKi8KLQotc3RydWN0IGZpeHVwCi17Ci0gIGludCBvcGluZGV4OwotICBpbnQgb3BpbmZvOwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi1zdGF0aWMgc3RydWN0IGZpeHVwIGZpeHVwcyBbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci1zdGF0aWMgaW50IG51bV9maXh1cHM7Ci0KLS8qIFByZXBhcmUgdG8gcGFyc2UgYW4gaW5zdHJ1Y3Rpb24uCi0gICA/Pz8gTWF5IHdpc2ggdG8gbWFrZSB0aGlzIHN0YXRpYyBhbmQgZGVsZXRlIGNhbGxzIGluIG1kX2Fzc2VtYmxlLiAgKi8KLQotdm9pZAotZ2FzX2NnZW5faW5pdF9wYXJzZSAoKQotewotICBudW1fZml4dXBzID0gMDsKLX0KLQotLyogUXVldWUgYSBmaXh1cC4gICovCi0KLXN0YXRpYyB2b2lkCi1xdWV1ZV9maXh1cCAob3BpbmRleCwgb3BpbmZvLCBleHBQKQotICAgICBpbnQgICAgICAgICAgIG9waW5kZXg7Ci0gICAgIGV4cHJlc3Npb25TICogZXhwUDsKLXsKLSAgLyogV2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeHVwIGZvciB0aGlzIGV4cHJlc3Npb24uICAqLwotICBpZiAobnVtX2ZpeHVwcyA+PSBHQVNfQ0dFTl9NQVhfRklYVVBTKQotICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0gIGZpeHVwc1tudW1fZml4dXBzXS5leHAgICAgID0gKiBleHBQOwotICBmaXh1cHNbbnVtX2ZpeHVwc10ub3BpbmRleCA9IG9waW5kZXg7Ci0gIGZpeHVwc1tudW1fZml4dXBzXS5vcGluZm8gID0gb3BpbmZvOwotICArKyBudW1fZml4dXBzOwotfQotCi0vKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhbGxvdyBhIGJhY2t1cCBvZiB0aGUgZml4dXAgY2hhaW4gdG8gYmUgbWFkZSwKLSAgIGFuZCB0byBoYXZlIHRoaXMgYmFja3VwIGJlIHN3YXBwZWQgd2l0aCB0aGUgY3VycmVudCBjaGFpbi4gIFRoaXMgYWxsb3dzCi0gICBjZXJ0YWluIHBvcnRzLCBlZyB0aGUgbTMyciwgdG8gc3dhcCB0d28gaW5zdHJ1Y3Rpb25zIGFuZCBzd2FwIHRoZWlyIGZpeHVwcwotICAgYXQgdGhlIHNhbWUgdGltZS4gICovCi0vKiA/Pz8gSSB0aGluayB3aXRoIGNnZW5fYXNtX2ZpbmlzaF9pbnNuIChvciBzb21ldGhpbmcgZWxzZSkgdGhlcmUgaXMgbm8KLSAgIG1vcmUgbmVlZCBmb3IgdGhpcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgZml4dXAgc2F2ZWRfZml4dXBzIFtHQVNfQ0dFTl9NQVhfRklYVVBTXTsKLXN0YXRpYyBpbnQgc2F2ZWRfbnVtX2ZpeHVwczsKLQotdm9pZAotZ2FzX2NnZW5fc2F2ZV9maXh1cHMgKCkKLXsKLSAgc2F2ZWRfbnVtX2ZpeHVwcyA9IG51bV9maXh1cHM7Ci0gIAotICBtZW1jcHkgKHNhdmVkX2ZpeHVwcywgZml4dXBzLCBzaXplb2YgKGZpeHVwc1swXSkgKiBudW1fZml4dXBzKTsKLQotICBudW1fZml4dXBzID0gMDsKLX0KLQotdm9pZAotZ2FzX2NnZW5fcmVzdG9yZV9maXh1cHMgKCkKLXsKLSAgbnVtX2ZpeHVwcyA9IHNhdmVkX251bV9maXh1cHM7Ci0gIAotICBtZW1jcHkgKGZpeHVwcywgc2F2ZWRfZml4dXBzLCBzaXplb2YgKGZpeHVwc1swXSkgKiBudW1fZml4dXBzKTsKLQotICBzYXZlZF9udW1fZml4dXBzID0gMDsKLX0KLQotdm9pZAotZ2FzX2NnZW5fc3dhcF9maXh1cHMgKCkKLXsKLSAgaW50IHRtcDsKLSAgc3RydWN0IGZpeHVwIHRtcF9maXh1cDsKLQotICBpZiAobnVtX2ZpeHVwcyA9PSAwKQotICAgIHsKLSAgICAgIGdhc19jZ2VuX3Jlc3RvcmVfZml4dXBzICgpOwotICAgIH0KLSAgZWxzZSBpZiAoc2F2ZWRfbnVtX2ZpeHVwcyA9PSAwKQotICAgIHsKLSAgICAgIGdhc19jZ2VuX3NhdmVfZml4dXBzICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHRtcCA9IHNhdmVkX251bV9maXh1cHM7Ci0gICAgICBzYXZlZF9udW1fZml4dXBzID0gbnVtX2ZpeHVwczsKLSAgICAgIG51bV9maXh1cHMgPSB0bXA7Ci0gICAgICAKLSAgICAgIGZvciAodG1wID0gR0FTX0NHRU5fTUFYX0ZJWFVQUzsgdG1wLS07KQotCXsKLQkgIHRtcF9maXh1cCAgICAgICAgICA9IHNhdmVkX2ZpeHVwcyBbdG1wXTsKLQkgIHNhdmVkX2ZpeHVwcyBbdG1wXSA9IGZpeHVwcyBbdG1wXTsKLQkgIGZpeHVwcyBbdG1wXSAgICAgICA9IHRtcF9maXh1cDsKLQl9Ci0gICAgfQotfQotCi0vKiBEZWZhdWx0IHJvdXRpbmUgdG8gcmVjb3JkIGEgZml4dXAuCi0gICBUaGlzIGlzIGEgY292ZXIgZnVuY3Rpb24gdG8gZml4X25ldy4KLSAgIEl0IGV4aXN0cyBiZWNhdXNlIHdlIHJlY29yZCBJTlNOIHdpdGggdGhlIGZpeHVwLgotCi0gICBGUkFHIGFuZCBXSEVSRSBhcmUgdGhlaXIgcmVzcGVjdGl2ZSBhcmd1bWVudHMgdG8gZml4X25ld19leHAuCi0gICBMRU5HVEggaXMgaW4gYml0cy4KLSAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KLQotICAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGZvcgotICAgb3BlcmFuZHMgcmVzaWRpbmcgaW4gdGhlIGluc24sIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotICAgb3BlcmFuZCBpbmRleC4gIFRoaXMgbGV0cyB1cyBlYXNpbHkgaGFuZGxlIGZpeHVwcyBmb3IgYW55Ci0gICBvcGVyYW5kIHR5cGUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4gbWRfYXBwbHlfZml4LiAgKi8KLQotZml4UyAqCi1nYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWcsIHdoZXJlLCBpbnNuLCBsZW5ndGgsIG9wZXJhbmQsIG9waW5mbywgc3ltYm9sLCBvZmZzZXQpCi0gICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOwotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKLSAgICAgc3ltYm9sUyAqICAgICAgICAgICAgc3ltYm9sOwotICAgICBvZmZzZXRUICAgICAgICAgICAgICBvZmZzZXQ7Ci17Ci0gIGZpeFMgKiBmaXhQOwotCi0gIC8qIEl0IG1heSBzZWVtIHN0cmFuZ2UgdG8gdXNlIG9wZXJhbmQtPmF0dHJzIGFuZCBub3QgaW5zbi0+YXR0cnMgaGVyZSwKLSAgICAgYnV0IGl0IGlzIHRoZSBvcGVyYW5kIHRoYXQgaGFzIGEgcGMgcmVsYXRpdmUgcmVsb2NhdGlvbi4gICovCi0KLSAgZml4UCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBsZW5ndGggLyA4LCBzeW1ib2wsIG9mZnNldCwKLQkJICBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAob3BlcmFuZCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLAotCQkgIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpCi0JCSAgICAoKGludCkgQkZEX1JFTE9DX1VOVVNFRAotCQkgICAgICsgKGludCkgb3BlcmFuZC0+dHlwZSkpOwotICBmaXhQLT5meF9jZ2VuLmluc24gPSBpbnNuOwotICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IG9waW5mbzsKLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogRGVmYXVsdCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGdpdmVuIGFuIGV4cHJlc3Npb24uCi0gICBUaGlzIGlzIGEgY292ZXIgZnVuY3Rpb24gdG8gZml4X25ld19leHAuCi0gICBJdCBleGlzdHMgYmVjYXVzZSB3ZSByZWNvcmQgSU5TTiB3aXRoIHRoZSBmaXh1cC4KLQotICAgRlJBRyBhbmQgV0hFUkUgYXJlIHRoZWlyIHJlc3BlY3RpdmUgYXJndW1lbnRzIHRvIGZpeF9uZXdfZXhwLgotICAgTEVOR1RIIGlzIGluIGJpdHMuCi0gICBPUElORk8gaXMgc29tZXRoaW5nIHRoZSBjYWxsZXIgY2hvb3NlcyB0byBoZWxwIGluIHJlbG9jIGRldGVybWluYXRpb24uCi0KLSAgIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmb3IKLSAgIG9wZXJhbmRzIHJlc2lkaW5nIGluIHRoZSBpbnNuLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLSAgIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5IGhhbmRsZSBmaXh1cHMgZm9yIGFueQotICAgb3BlcmFuZCB0eXBlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluIG1kX2FwcGx5X2ZpeC4gICovCi0KLWZpeFMgKgotZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCAoZnJhZywgd2hlcmUsIGluc24sIGxlbmd0aCwgb3BlcmFuZCwgb3BpbmZvLCBleHApCi0gICAgIGZyYWdTICogICAgICAgICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIHdoZXJlOwotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBpbnQgICAgICAgICAgICAgICAgICBsZW5ndGg7Ci0gICAgIGNvbnN0IENHRU5fT1BFUkFORCAqIG9wZXJhbmQ7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIG9waW5mbzsKLSAgICAgZXhwcmVzc2lvblMgKiAgICAgICAgZXhwOwotewotICBmaXhTICogZml4UDsKLQotICAvKiBJdCBtYXkgc2VlbSBzdHJhbmdlIHRvIHVzZSBvcGVyYW5kLT5hdHRycyBhbmQgbm90IGluc24tPmF0dHJzIGhlcmUsCi0gICAgIGJ1dCBpdCBpcyB0aGUgb3BlcmFuZCB0aGF0IGhhcyBhIHBjIHJlbGF0aXZlIHJlbG9jYXRpb24uICAqLwotCi0gIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIGxlbmd0aCAvIDgsIGV4cCwKLQkJICAgICAgQ0dFTl9PUEVSQU5EX0FUVFJfVkFMVUUgKG9wZXJhbmQsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwKLQkJICAgICAgKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkKLQkJICAgICAgICAoKGludCkgQkZEX1JFTE9DX1VOVVNFRAotCQkJICsgKGludCkgb3BlcmFuZC0+dHlwZSkpOwotICBmaXhQLT5meF9jZ2VuLmluc24gPSBpbnNuOwotICBmaXhQLT5meF9jZ2VuLm9waW5mbyA9IG9waW5mbzsKLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogVXNlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBuZXh0IHR3byBwcm9jZWR1cmVzLiAgKi8KLXN0YXRpYyBqbXBfYnVmIGV4cHJfam1wX2J1ZjsKLQotLyogQ2FsbGJhY2sgZm9yIGNnZW4gaW50ZXJmYWNlLiAgUGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgKlNUUlAuCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBmb3Igc3VjY2VzcyAoaW4gd2hpY2ggY2FzZQotICAgKlNUUlAgaXMgYWR2YW5jZWQgcGFzdCB0aGUgcGFyc2VkIHRleHQpLgotICAgV0FOVCBpcyBhbiBpbmRpY2F0aW9uIG9mIHdoYXQgdGhlIGNhbGxlciBpcyBsb29raW5nIGZvci4KLSAgIElmIFdBTlQgPT0gQ0dFTl9BU01fUEFSU0VfSU5JVCB0aGUgY2FsbGVyIGlzIGJlZ2lubmluZyB0byB0cnkgdG8gbWF0Y2gKLSAgIGEgdGFibGUgZW50cnkgd2l0aCB0aGUgaW5zbiwgcmVzZXQgdGhlIHF1ZXVlZCBmaXh1cHMgY291bnRlci4KLSAgIEFuIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCBpcyBzdG9yZWQgaW4gUkVTVUxUUC4KLSAgIE9QSU5ERVggaXMgdGhlIG9wZXJhbmQncyB0YWJsZSBlbnRyeSBpbmRleC4KLSAgIE9QSU5GTyBpcyBzb21ldGhpbmcgdGhlIGNhbGxlciBjaG9vc2VzIHRvIGhlbHAgaW4gcmVsb2MgZGV0ZXJtaW5hdGlvbi4KLSAgIFRoZSByZXN1bHRpbmcgdmFsdWUgaXMgc3RvcmVkIGluIFZBTFVFUC4gICovCi0KLWNvbnN0IGNoYXIgKgotZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCAoY2QsIHdhbnQsIHN0clAsIG9waW5kZXgsIG9waW5mbywgcmVzdWx0UCwgdmFsdWVQKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlIHdhbnQ7Ci0gICAgIGNvbnN0IGNoYXIgKiogc3RyUDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGludCBvcGluZm87Ci0gICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqIHJlc3VsdFA7Ci0gICAgIGJmZF92bWEgKiB2YWx1ZVA7Ci17Ci0jaWZkZWYgX19TVERDX18KLSAgLyogVGhlc2UgYXJlIHZvbGF0aWxlIHRvIHN1cnZpdmUgdGhlIHNldGptcC4gICovCi0gIGNoYXIgKiB2b2xhdGlsZSBob2xkOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiB2b2xhdGlsZSByZXN1bHRQXzE7Ci0jZWxzZQotICBzdGF0aWMgY2hhciAqIGhvbGQ7Ci0gIHN0YXRpYyBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiByZXN1bHRQXzE7Ci0jZW5kaWYKLSAgY29uc3QgY2hhciAqIGVycm1zZyA9IE5VTEw7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBpZiAod2FudCA9PSBDR0VOX1BBUlNFX09QRVJBTkRfSU5JVCkKLSAgICB7Ci0gICAgICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJlc3VsdFBfMSA9IHJlc3VsdFA7Ci0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IChjaGFyICopICogc3RyUDsKLQotICAvKiBXZSByZWx5IG9uIG1kX29wZXJhbmQgdG8gbG9uZ2ptcCBiYWNrIHRvIHVzLgotICAgICBUaGlzIGlzIGRvbmUgdmlhIGdhc19jZ2VuX21kX29wZXJhbmQuICAqLwotICBpZiAoc2V0am1wIChleHByX2ptcF9idWYpICE9IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gKGNoYXIgKikgaG9sZDsKLSAgICAgICogcmVzdWx0UF8xID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUjsKLSAgICAgIHJldHVybiAiaWxsZWdhbCBvcGVyYW5kIjsKLSAgICB9Ci0KLSAgZXhwcmVzc2lvbiAoJiBleHApOwotCi0gICogc3RyUCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotICAvKiBGSVhNRTogTmVlZCB0byBjaGVjayBgd2FudCcuICAqLwotCi0gIHN3aXRjaCAoZXhwLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsIDoKLSAgICAgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotICAgICAgKiByZXN1bHRQID0gQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9FUlJPUjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19hYnNlbnQgOgotICAgICAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0gICAgICAqIHJlc3VsdFAgPSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2NvbnN0YW50IDoKLSAgICAgICogdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3JlZ2lzdGVyIDoKLSAgICAgICogdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUkVHSVNURVI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIHF1ZXVlX2ZpeHVwIChvcGluZGV4LCBvcGluZm8sICYgZXhwKTsKLSAgICAgICogdmFsdWVQID0gMDsKLSAgICAgICogcmVzdWx0UCA9IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUVVFVUVEOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBlcnJtc2c7Ci19Ci0KLS8qIG1kX29wZXJhbmQgaGFuZGxlciB0byBjYXRjaCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbnMgYW5kIGhhbHQgdGhlCi0gICBwYXJzaW5nIHByb2Nlc3Mgc28gdGhlIG5leHQgZW50cnkgY2FuIGJlIHRyaWVkLgotCi0gICA/Pz8gVGhpcyBjb3VsZCBiZSBkb25lIGRpZmZlcmVudGx5IGJ5IGFkZGluZyBjb2RlIHRvIGBleHByZXNzaW9uJy4gICovCi0KLXZvaWQKLWdhc19jZ2VuX21kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBsb25nam1wIChleHByX2ptcF9idWYsIDEpOwotfQotCi0vKiBGaW5pc2ggYXNzZW1ibGluZyBpbnN0cnVjdGlvbiBJTlNOLgotICAgQlVGIGNvbnRhaW5zIHdoYXQgd2UndmUgYnVpbHQgdXAgc28gZmFyLgotICAgTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0gICBSRUxBWF9QIGlzIG5vbi16ZXJvIGlmIHJlbGF4YWJsZSBpbnNucyBzaG91bGQgYmUgZW1pdHRlZCBhcyBzdWNoLgotICAgT3RoZXJ3aXNlIHRoZXkncmUgZW1pdHRlZCBpbiBub24tcmVsYXhhYmxlIGZvcm1zLgotICAgVGhlICJyZXN1bHQiIGlzIHN0b3JlZCBpbiBSRVNVTFQgaWYgbm9uLU5VTEwuICAqLwotCi12b2lkCi1nYXNfY2dlbl9maW5pc2hfaW5zbiAoaW5zbiwgYnVmLCBsZW5ndGgsIHJlbGF4X3AsIHJlc3VsdCkKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWY7Ci0gICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gICAgIGludCByZWxheF9wOwotICAgICBmaW5pc2hlZF9pbnNuUyAqIHJlc3VsdDsKLXsKLSAgaW50IGk7Ci0gIGludCByZWxheF9vcGVyYW5kOwotICBjaGFyICogZjsKLSAgdW5zaWduZWQgaW50IGJ5dGVfbGVuID0gbGVuZ3RoIC8gODsKLQotICAvKiA/Pz8gVGFyZ2V0IGZvbyBpc3N1ZXMgdmFyaW91cyB3YXJuaW5ncyBoZXJlLCBzbyBvbmUgbWlnaHQgd2FudCB0byBwcm92aWRlCi0gICAgIGEgaG9vayBoZXJlLiAgSG93ZXZlciwgb3VyIGNhbGxlciBpcyBkZWZpbmVkIGluIHRjLWZvby5jIHNvIHRoZXJlCi0gICAgIHNob3VsZG4ndCBiZSBhIG5lZWQgZm9yIGEgaG9vay4gICovCi0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgSXQgaXMgaW1wb3J0YW50IHRvIGZldGNoIGVub3VnaCBzcGFjZSBpbiBvbmUgY2FsbCB0byBgZnJhZ19tb3JlJy4KLSAgICAgV2UgdXNlIChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpIHRvIGNvbXB1dGUgd2hlcmUgd2UgYXJlIGFuZCB3ZQotICAgICBkb24ndCB3YW50IGZyYWdfbm93IHRvIGNoYW5nZSBiZXR3ZWVuIGNhbGxzLgotCi0gICAgIFJlbGF4YWJsZSBpbnN0cnVjdGlvbnM6IFdlIG5lZWQgdG8gZW5zdXJlIHdlIGFsbG9jYXRlIGVub3VnaAotICAgICBzcGFjZSBmb3IgdGhlIGxhcmdlc3QgaW5zbi4gICovCi0KLSAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpKQotICAgIGFib3J0ICgpOyAvKiBUaGVzZSBjdXJyZW50bHkgc2hvdWxkbid0IGdldCBoZXJlLiAgKi8KLQotICAvKiBJcyB0aGVyZSBhIHJlbGF4YWJsZSBpbnNuIHdpdGggdGhlIHJlbGF4YWJsZSBvcGVyYW5kIG5lZWRpbmcgYSBmaXh1cD8gICovCi0KLSAgcmVsYXhfb3BlcmFuZCA9IC0xOwotICBpZiAocmVsYXhfcCAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkpCi0gICAgewotICAgICAgLyogU2NhbiB0aGUgZml4dXBzIGZvciB0aGUgb3BlcmFuZCBhZmZlY3RlZCBieSByZWxheGluZwotCSAoaS5lLiB0aGUgYnJhbmNoIGFkZHJlc3MpLiAgKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9maXh1cHM7ICsrIGkpCi0JewotCSAgaWYgKENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGZpeHVwc1tpXS5vcGluZGV4KSwKLQkJCQkgICAgICAgQ0dFTl9PUEVSQU5EX1JFTEFYKSkKLQkgICAgewotCSAgICAgIHJlbGF4X29wZXJhbmQgPSBpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocmVsYXhfb3BlcmFuZCAhPSAtMSkKLSAgICB7Ci0gICAgICBpbnQgbWF4X2xlbjsKLSAgICAgIGZyYWdTICogb2xkX2ZyYWc7Ci0KLSNpZmRlZiBUQ19DR0VOX01BWF9SRUxBWAotICAgICAgbWF4X2xlbiA9IFRDX0NHRU5fTUFYX1JFTEFYIChpbnNuLCBieXRlX2xlbik7Ci0jZWxzZQotICAgICAgbWF4X2xlbiA9IENHRU5fTUFYX0lOU05fU0laRTsKLSNlbmRpZgotICAgICAgLyogRW5zdXJlIHZhcmlhYmxlIHBhcnQgYW5kIGZpeGVkIHBhcnQgYXJlIGluIHNhbWUgZnJhZ21lbnQuICAqLwotICAgICAgLyogRklYTUU6IEhhdmluZyB0byBkbyB0aGlzIHNlZW1zIGxpa2UgYSBoYWNrLiAgKi8KLSAgICAgIGZyYWdfZ3JvdyAobWF4X2xlbik7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgZml4ZWQgcGFydC4gICovCi0gICAgICBmID0gZnJhZ19tb3JlIChieXRlX2xlbik7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIHJlbGF4YWJsZSBmcmFnbWVudCBmb3IgdGhpcyBpbnN0cnVjdGlvbi4gICovCi0gICAgICBvbGRfZnJhZyA9IGZyYWdfbm93OwotCi0gICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCW1heF9sZW4gLSBieXRlX2xlbiAvKiBtYXggY2hhcnMgKi8sCi0JCTAgLyogdmFyaWFibGUgcGFydCBhbHJlYWR5IGFsbG9jYXRlZCAqLywKLQkJLyogRklYTUU6IFdoZW4gd2UgbWFjaGluZSBnZW5lcmF0ZSB0aGUgcmVsYXggdGFibGUsCi0JCSAgIG1hY2hpbmUgZ2VuZXJhdGUgYSBtYWNybyB0byBjb21wdXRlIHN1YnR5cGUuICAqLwotCQkxIC8qIHN1YnR5cGUgKi8sCi0JCWZpeHVwc1tyZWxheF9vcGVyYW5kXS5leHAuWF9hZGRfc3ltYm9sLAotCQlmaXh1cHNbcmVsYXhfb3BlcmFuZF0uZXhwLlhfYWRkX251bWJlciwKLQkJZik7Ci0KLSAgICAgIC8qIFJlY29yZCB0aGUgb3BlcmFuZCBudW1iZXIgd2l0aCB0aGUgZnJhZ21lbnQgc28gbWRfY29udmVydF9mcmFnCi0JIGNhbiB1c2UgZ2FzX2NnZW5fbWRfcmVjb3JkX2ZpeHVwIHRvIHJlY29yZCB0aGUgYXBwcm9wcmlhdGUgcmVsb2MuICAqLwotICAgICAgb2xkX2ZyYWctPmZyX2NnZW4uaW5zbiAgICA9IGluc247Ci0gICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5vcGluZGV4ID0gZml4dXBzW3JlbGF4X29wZXJhbmRdLm9waW5kZXg7Ci0gICAgICBvbGRfZnJhZy0+ZnJfY2dlbi5vcGluZm8gID0gZml4dXBzW3JlbGF4X29wZXJhbmRdLm9waW5mbzsKLSAgICAgIGlmIChyZXN1bHQpCi0JcmVzdWx0LT5mcmFnID0gb2xkX2ZyYWc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZiA9IGZyYWdfbW9yZSAoYnl0ZV9sZW4pOwotICAgICAgaWYgKHJlc3VsdCkKLQlyZXN1bHQtPmZyYWcgPSBmcmFnX25vdzsKLSAgICB9Ci0KLSAgLyogSWYgd2UncmUgcmVjb3JkaW5nIGluc25zIGFzIG51bWJlcnMgKHJhdGhlciB0aGFuIGEgc3RyaW5nIG9mIGJ5dGVzKSwKLSAgICAgdGFyZ2V0IGJ5dGUgb3JkZXIgaGFuZGxpbmcgaXMgZGVmZXJyZWQgdW50aWwgbm93LiAgKi8KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoZ2FzX2NnZW5fY3B1X2Rlc2MsIGYsIGxlbmd0aCwgKmJ1Zik7Ci0jZWxzZQotICBtZW1jcHkgKGYsIGJ1ZiwgYnl0ZV9sZW4pOwotI2VuZGlmCi0KLSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ZpeHVwczsgKytpKQotICAgIHsKLSAgICAgIGZpeFMgKmZpeFA7Ci0gICAgICBjb25zdCBDR0VOX09QRVJBTkQgKm9wZXJhbmQgPQotCWNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtIChnYXNfY2dlbl9jcHVfZGVzYywgZml4dXBzW2ldLm9waW5kZXgpOwotCi0gICAgICAvKiBEb24ndCBjcmVhdGUgZml4dXBzIGZvciB0aGVzZS4gIFRoYXQncyBkb25lIGR1cmluZyByZWxheGF0aW9uLgotCSBXZSBkb24ndCBuZWVkIHRvIHRlc3QgZm9yIENHRU5fSU5TTl9SRUxBWCBhcyB0aGV5IGNhbid0IGdldCBoZXJlCi0JIChzZWUgYWJvdmUpLiAgKi8KLSAgICAgIGlmIChyZWxheF9wCi0JICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkKLQkgICYmIENHRU5fT1BFUkFORF9BVFRSX1ZBTFVFIChvcGVyYW5kLCBDR0VOX09QRVJBTkRfUkVMQVgpKQotCWNvbnRpbnVlOwotCi0jaWZuZGVmIG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotI2RlZmluZSBtZF9jZ2VuX3JlY29yZF9maXh1cF9leHAgZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotI2VuZGlmCi0KLQlmaXhQID0gbWRfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCQkgaW5zbiwgbGVuZ3RoLCBvcGVyYW5kLAotCQkJCQkgZml4dXBzW2ldLm9waW5mbywKLQkJCQkJICYgZml4dXBzW2ldLmV4cCk7Ci0JaWYgKHJlc3VsdCkKLQkgIHJlc3VsdC0+Zml4dXBzW2ldID0gZml4UDsKLSAgICB9Ci0KLSAgaWYgKHJlc3VsdCkKLSAgICB7Ci0gICAgICByZXN1bHQtPm51bV9maXh1cHMgPSBudW1fZml4dXBzOwotICAgICAgcmVzdWx0LT5hZGRyID0gZjsKLSAgICB9Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBjb2RlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGFsbCB0aGUKLSAgIGZpeHVwcyB3ZSBnZW5lcmF0ZWQgYnkgdGhlIGNhbGwgdG8gZml4X25ld19leHAsIGFib3ZlLiAgSW4gdGhlIGNhbGwKLSAgIGFib3ZlIHdlIHVzZWQgYSByZWxvYyBjb2RlIHdoaWNoIHdhcyB0aGUgbGFyZ2VzdCBsZWdhbCByZWxvYyBjb2RlCi0gICBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgSGVyZSB3ZSB1bmRvIHRoYXQgdG8gcmVjb3ZlciB0aGUgb3BlcmFuZAotICAgaW5kZXguICBBdCB0aGlzIHBvaW50IGFsbCBzeW1ib2wgdmFsdWVzIHNob3VsZCBiZSBmdWxseSByZXNvbHZlZCwKLSAgIGFuZCB3ZSBhdHRlbXB0IHRvIGNvbXBsZXRlbHkgcmVzb2x2ZSB0aGUgcmVsb2MuICBJZiB3ZSBjYW4gbm90IGRvCi0gICB0aGF0LCB3ZSBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcmVsb2MgY29kZSBhbmQgcHV0IGl0IGJhY2sgaW4gdGhlIGZpeHVwLiAgKi8KLQotLyogRklYTUU6IFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBzb21lIG9mIHRoZSBmaXh1cHMgYW5kIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24KLSAgIGhhbmRsZXMgdGhlIHJlc3QuICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIChvciBzb21lIG90aGVyIGJmZCBmdW5jdGlvbikKLSAgIHNob3VsZCBoYW5kbGUgdGhlbSBhbGwuICAqLwotCi1pbnQKLWdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgKGZpeFAsIHZhbHVlUCwgc2VnKQotICAgICBmaXhTICogICBmaXhQOwotICAgICB2YWx1ZVQgKiB2YWx1ZVA7Ci0gICAgIHNlZ1QgICAgIHNlZzsKLXsKLSAgY2hhciAqIHdoZXJlID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICB2YWx1ZVQgdmFsdWU7Ci0gIC8qIGNhbm9uaWNhbCBuYW1lLCBzaW5jZSB1c2VkIGEgbG90ICovCi0gIENHRU5fQ1BVX0RFU0MgY2QgPSBnYXNfY2dlbl9jcHVfZGVzYzsKLSAgCi0gIC8qIEZJWE1FIEZJWE1FIEZJWE1FOiBUaGUgdmFsdWUgd2UgYXJlIHBhc3NlZCBpbiAqdmFsdWVwIGluY2x1ZGVzCi0gICAgIHRoZSBzeW1ib2wgdmFsdWVzLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEJGRF9BU1NFTUJMRVIsIGlmIHdlIGFyZQotICAgICBkb2luZyB0aGlzIHJlbG9jYXRpb24gdGhlIGNvZGUgaW4gd3JpdGUuYyBpcyBnb2luZyB0byBjYWxsCi0gICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24sIHdoaWNoIGlzIGFsc28gZ29pbmcgdG8gdXNlIHRoZSBzeW1ib2wKLSAgICAgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIHJlbG9jIGlzIGZ1bGx5IHJlc29sdmVkIHdlIHdhbnQgdG8KLSAgICAgdXNlICp2YWx1ZXAgc2luY2UgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiBpcyBub3QgYmVpbmcgdXNlZC4KLSAgICAgSG93ZXZlciwgaWYgdGhlIHJlbG9jIGlzIG5vdCBmdWxseSByZXNvbHZlZCB3ZSBkbyBub3Qgd2FudCB0byB1c2UKLSAgICAgKnZhbHVlcCwgYW5kIG11c3QgdXNlIGZ4X29mZnNldCBpbnN0ZWFkLiAgSG93ZXZlciwgaWYgdGhlIHJlbG9jCi0gICAgIGlzIFBDIHJlbGF0aXZlLCB3ZSBkbyB3YW50IHRvIHVzZSAqdmFsdWVwIHNpbmNlIGl0IGluY2x1ZGVzIHRoZQotICAgICByZXN1bHQgb2YgbWRfcGNyZWxfZnJvbS4gIFRoaXMgaXMgY29uZnVzaW5nLiAgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVQOwotICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVQOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4UC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLSAJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmICgoaW50KSBmaXhQLT5meF9yX3R5cGUgPj0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpbnQgb3BpbmRleCA9IChpbnQpIGZpeFAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBjb25zdCBDR0VOX09QRVJBTkQgKm9wZXJhbmQgPSBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoY2QsIG9waW5kZXgpOwotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7Ci0gICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzID0gYWxsb2NhIChDR0VOX0NQVV9TSVpFT0ZfRklFTERTIChjZCkpOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gZml4UC0+ZnhfY2dlbi5pbnNuOwotCi0gICAgICAvKiBJZiB0aGUgcmVsb2MgaGFzIGJlZW4gZnVsbHkgcmVzb2x2ZWQgZmluaXNoIHRoZSBvcGVyYW5kIGhlcmUuICAqLwotICAgICAgLyogRklYTUU6IFRoaXMgZHVwbGljYXRlcyB0aGUgY2FwYWJpbGl0aWVzIG9mIGNvZGUgaW4gQkZELiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lCi0JICAvKiBGSVhNRTogSWYgcGFydGlhbF9pbnBsYWNlIGlzbid0IHNldCBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHdvbid0Ci0JICAgICBmaW5pc2ggdGhlIGpvYi4gIFRlc3RpbmcgZm9yIHBjcmVsIGlzIGEgdGVtcG9yYXJ5IGhhY2suICAqLwotCSAgfHwgZml4UC0+ZnhfcGNyZWwpCi0JewotCSAgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFIChjZCkgKGZpZWxkcywgQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pKTsKLQkgIENHRU5fQ1BVX1NFVF9WTUFfT1BFUkFORCAoY2QpIChjZCwgb3BpbmRleCwgZmllbGRzLCAoYmZkX3ZtYSkgdmFsdWUpOwotCi0jaWYgQ0dFTl9JTlRfSU5TTl9QCi0JICB7Ci0JICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZSA9Ci0JICAgICAgY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIHdoZXJlLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbikpOwotCi0JICAgIC8qID8/PyAwIGlzIHBhc3NlZCBmb3IgYHBjJyAqLwotCSAgICBlcnJtc2cgPSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORCAoY2QpIChjZCwgb3BpbmRleCwgZmllbGRzLAotCQkJCQkJICAgJmluc25fdmFsdWUsIChiZmRfdm1hKSAwKTsKLQkgICAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIHdoZXJlLCBDR0VOX0lOU05fQklUU0laRSAoaW5zbiksCi0JCQkJIGluc25fdmFsdWUpOwotCSAgfQotI2Vsc2UKLQkgICAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JICAgIGVycm1zZyA9IENHRU5fQ1BVX0lOU0VSVF9PUEVSQU5EIChjZCkgKGNkLCBvcGluZGV4LCBmaWVsZHMsIHdoZXJlLAotCQkJCQkJICAgKGJmZF92bWEpIDApOwotI2VuZGlmCi0JICBpZiAoZXJybXNnKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsICIlcyIsIGVycm1zZyk7Ci0JfQotCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQlyZXR1cm4gMTsKLQotICAgICAgLyogVGhlIG9wZXJhbmQgaXNuJ3QgZnVsbHkgcmVzb2x2ZWQuICBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUKLQkgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24gYW5kIGxlYXZlIGl0IHRvCi0JIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IHdvcmsgd2hlbgotCSBwYXJ0aWFsX2lucGxhY2UgPT0gZmFsc2UuICAqLwotCi0gICAgICByZWxvY190eXBlID0gbWRfY2dlbl9sb29rdXBfcmVsb2MgKGluc24sIG9wZXJhbmQsIGZpeFApOwotICAgICAgaWYgKHJlbG9jX3R5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0JewotCSAgZml4UC0+Znhfcl90eXBlID0gcmVsb2NfdHlwZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+ZnhfZG9uZSkKLSAgICB7Ci0gICAgICAvKiBXZSdyZSBmaW5pc2hlZCB3aXRoIHRoaXMgZml4dXAuICBJbnN0YWxsIGl0IGJlY2F1c2UKLQkgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3b24ndCBiZSBjYWxsZWQgdG8gZG8gaXQuICAqLwotICAgICAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCB2YWx1ZSwgMSk7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIHZhbHVlLCAyKTsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzMyOgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgdmFsdWUsIDQpOwotCSAgYnJlYWs7Ci0JLyogRklYTUU6IGxhdGVyIGFkZCBzdXBwb3J0IGZvciA2NCBiaXRzLiAgKi8KLQlkZWZhdWx0OgotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGluc3RhbGwgZml4IGZvciByZWxvYyB0eXBlICVkIChgJXMnKSIpLAotCQkJZml4UC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4UC0+Znhfcl90eXBlKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsIGJlIGNhbGxlZCB0byBmaW5pc2ggdGhpbmdzIHVwLiAgKi8KLSAgICB9Ci0KLSAgLyogVHVjayBgdmFsdWUnIGF3YXkgZm9yIHVzZSBieSB0Y19nZW5fcmVsb2MuCi0gICAgIFNlZSB0aGUgY29tbWVudCBkZXNjcmliaW5nIGZ4X2FkZG51bWJlciBpbiB3cml0ZS5oLgotICAgICBUaGlzIGZpZWxkIGlzIG1pc25hbWVkIChvciBtaXN1c2VkIDotKS4gICovCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQgZm9ybWF0LgotCi0gICBGSVhNRTogVG8gd2hhdCBleHRlbnQgY2FuIHdlIGdldCBhbGwgcmVsZXZhbnQgdGFyZ2V0cyB0byB1c2UgdGhpcz8gICovCi0KLWFyZWxlbnQgKgotZ2FzX2NnZW5fdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIGZpeFMgKiAgICAgZml4UDsKLXsKLSAgYXJlbGVudCAqIHJlbG9jOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiksCi0JCSAgICBmaXhQLT5meF9yX3R5cGUsIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhQLT5meF9yX3R5cGUpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhc3NlcnQgKCFmaXhQLT5meF9wY3JlbCA9PSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpOwotCi0gIC8qIFVzZSBmeF9vZmZzZXQgZm9yIHRoZXNlIGNhc2VzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWQotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCkKLSAgICByZWxvYy0+YWRkZW5kICA9IGZpeFAtPmZ4X29mZnNldDsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJlbG9jLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICByZXR1cm4gcmVsb2M7Ci19CmRpZmYgLS1naXQgYS9nYXMvY2dlbi5oIGIvZ2FzL2NnZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjMTczMi4uMDAwMDAwMAotLS0gYS9nYXMvY2dlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyogR0FTIGNnZW4gc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVNfQ0dFTl9ICi0jZGVmaW5lIEdBU19DR0VOX0gKLQotLyogT3Bjb2RlIHRhYmxlIGhhbmRsZS4gICovCi1leHRlcm4gQ0dFTl9DUFVfREVTQyBnYXNfY2dlbl9jcHVfZGVzYzsKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZml4dXBzIGluIGFuIGluc24uCi0gICBJZiB5b3UgbmVlZCB0byBjaGFuZ2UgdGhpcywgYWxsb3cgdGFyZ2V0IHRvIG92ZXJyaWRlIGFuZCBkbyBzbyB0aGVyZS4gICovCi0jZGVmaW5lIEdBU19DR0VOX01BWF9GSVhVUFMgMwotCi0vKiBTdHJ1Y3QgZGVmaW5pbmcgcmVzdWx0IG9mIGdhc19jZ2VuX2ZpbmlzaF9pbnNuLiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogZnJhZyBjb250YWluaW5nIHRoZSBpbnNuICovCi0gIGZyYWdTICogZnJhZzsKLSAgLyogQWRkcmVzcyBvZiBpbnNuIGluIGZyYWcuICAqLwotICBjaGFyICogYWRkcjsKLSAgLyogTnVtYmVyIG9mIGZpeHVwcyB0aGlzIGluc24gaGFzLiAgKi8KLSAgaW50IG51bV9maXh1cHM7Ci0gIC8qIEFycmF5IG9mIGZpeHVwcy4gICovCi0gIGZpeFMgKiBmaXh1cHNbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci19IGZpbmlzaGVkX2luc25TOwotCi0vKiBDYWxsYmFjayBmb3Igb3BlcmFuZCBwYXJzaW5nLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgZm9yIHN1Y2Nlc3MuCi0gICBUaGUgcGFyc2VkIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgYmZkX3ZtYSAqLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICogZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlLAotCSAgICAgIGNvbnN0IGNoYXIgKiosIGludCwgaW50LCBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgKiwKLQkgICAgICBiZmRfdm1hICopKTsKLQotLyogQ2FsbCB0aGlzIGZyb20gbWRfYXNzZW1ibGUgdG8gaW5pdGlhbGl6ZSB0aGUgYXNzZW1ibGVyIGNhbGxiYWNrLiAgKi8KLWV4dGVybiB2b2lkIGdhc19jZ2VuX2luaXRfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9zYXZlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBnYXNfY2dlbl9yZXN0b3JlX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBnYXNfY2dlbl9zd2FwX2ZpeHVwcyBQQVJBTVMgKCh2b2lkKSk7Ci0gICAgIAotLyogQWRkIGEgcmVnaXN0ZXIgdG8gdGhlIGFzc2VtYmxlcidzIGhhc2ggdGFibGUuCi0gICBUaGlzIG1ha2VzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCi0gICA/Pz8gVGhpcyBpc24ndCBjdXJyZW50bHkgdXNlZCwgYnV0IGl0IGNvdWxkIGJlIGluIHRoZSBmdXR1cmUuICAqLwotZXh0ZXJuIHZvaWQgY2dlbl9hc21fcmVjb3JkX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLS8qIEFmdGVyIENHRU5fU1lNIChhc3NlbWJsZV9pbnNuKSBpcyBkb25lLCB0aGlzIGlzIGNhbGxlZCB0bwotICAgb3V0cHV0IHRoZSBpbnNuIGFuZCByZWNvcmQgYW55IGZpeHVwcy4gICovCi1leHRlcm4gdm9pZCBnYXNfY2dlbl9maW5pc2hfaW5zbiBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKiwKLQkJCQkJICBDR0VOX0lOU05fQllURVNfUFRSLCB1bnNpZ25lZCBpbnQsCi0JCQkJCSAgaW50LCBmaW5pc2hlZF9pbnNuUyAqKSk7Ci0KLS8qIFJlY29yZCBhIGZpeHVwLiAgKi8KLWV4dGVybiBmaXhTICogZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCSAgICAgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkgICAgIHN5bWJvbFMgKiwgb2Zmc2V0VCkpOwotZXh0ZXJuIGZpeFMgKiBnYXNfY2dlbl9yZWNvcmRfZml4dXBfZXhwIFBBUkFNUyAoKGZyYWdTICosIGludCwgY29uc3QgQ0dFTl9JTlNOICosCi0JCQkJCQkgaW50LCBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCQkJIGV4cHJlc3Npb25TICopKTsKLQotLyogbWRfYXBwbHlfZml4MyBoYW5kbGVyICovCi1leHRlcm4gaW50IGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgUEFSQU1TICgoZml4UyAqLCB2YWx1ZVQgKiwgc2VnVCkpOwotCi0vKiB0Y19nZW5fcmVsb2MgaGFuZGxlciAqLwotZXh0ZXJuIGFyZWxlbnQgKmdhc19jZ2VuX3RjX2dlbl9yZWxvYyBQQVJBTVMgKChhc2VjdGlvbiAqLCBmaXhTICopKTsKLQotLyogVGFyZ2V0IHN1cHBsaWVkIHJvdXRpbmUgdG8gbG9va3VwIGEgcmVsb2MuICAqLwotZXh0ZXJuIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotbWRfY2dlbl9sb29rdXBfcmVsb2MgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IENHRU5fT1BFUkFORCAqLAotCQkJICAgICAgZml4UyAqKSk7Ci0KLS8qIE9wdGlvbmFsIHRhcmdldCBzdXBwbGllZCByb3V0aW5lIHRvIHJlY29yZCBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgKi8KLWV4dGVybiBmaXhTICoKLW1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGNvbnN0IENHRU5fSU5TTiAqLCBpbnQsCi0JCQkJICBjb25zdCBDR0VOX09QRVJBTkQgKiwgaW50LAotCQkJCSAgZXhwcmVzc2lvblMgKikpOwotCi0jZW5kaWYgLyogR0FTX0NHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmQuYyBiL2dhcy9jb25kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNGZjNjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi0vKiBjb25kLmMgLSBjb25kaXRpb25hbCBhc3NlbWJseSBwc2V1ZG8tb3BzLCBhbmQgLmluY2x1ZGUKLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJtYWNyby5oIgotCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBUaGlzIGlzIGFsbG9jYXRlZCB0byBncm93IGFuZCBzaHJpbmsgYXMgLmlmZGVmLy5lbmRpZiBwYWlycyBhcmUgc2Nhbm5lZC4gKi8KLXN0cnVjdCBvYnN0YWNrIGNvbmRfb2JzdGFjazsKLQotc3RydWN0IGZpbGVfbGluZQotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLX07Ci0KLS8qIFdlIHB1c2ggb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMgZm9yIGVhY2ggLmlmLCBhbmQgcG9wIGl0IGF0IHRoZQotICAgLmVuZGlmLiAgKi8KLQotc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lCi17Ci0gIC8qIFRoZSBzb3VyY2UgZmlsZSAmIGxpbmUgbnVtYmVyIG9mIHRoZSAiaWYiLiAgKi8KLSAgc3RydWN0IGZpbGVfbGluZSBpZl9maWxlX2xpbmU7Ci0gIC8qIFRoZSBzb3VyY2UgZmlsZSAmIGxpbmUgb2YgdGhlICJlbHNlIi4gICovCi0gIHN0cnVjdCBmaWxlX2xpbmUgZWxzZV9maWxlX2xpbmU7Ci0gIC8qIFRoZSBwcmV2aW91cyBjb25kaXRpb25hbC4gICovCi0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqcHJldmlvdXNfY2ZyYW1lOwotICAvKiBIYXZlIHdlIHNlZW4gYW4gZWxzZSB5ZXQ/ICAqLwotICBpbnQgZWxzZV9zZWVuOwotICAvKiBXaGV0aGVyIHdlIGFyZSBjdXJyZW50bHkgaWdub3JpbmcgaW5wdXQuICAqLwotICBpbnQgaWdub3Jpbmc7Ci0gIC8qIFdoZXRoZXIgYSBjb25kaXRpb25hbCBhdCBhIGhpZ2hlciBsZXZlbCBpcyBpZ25vcmluZyBpbnB1dC4gICovCi0gIGludCBkZWFkX3RyZWU7Ci0gIC8qIE1hY3JvIG5lc3RpbmcgbGV2ZWwgYXQgd2hpY2ggdGhpcyBjb25kaXRpb25hbCB3YXMgY3JlYXRlZC4gICovCi0gIGludCBtYWNyb19uZXN0OwotfTsKLQotc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9jZnJhbWUgUEFSQU1TICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpjZnJhbWUpKTsKLXN0YXRpYyBjaGFyICpnZXRfbXJpX3N0cmluZyBQQVJBTVMgKChpbnQsIGludCAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKmN1cnJlbnRfY2ZyYW1lID0gTlVMTDsKLQotdm9pZCAKLXNfaWZkZWYgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsJCS8qIHBvaW50cyB0byBuYW1lIG9mIHN5bWJvbCAqLwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwkvKiBQb2ludHMgdG8gc3ltYm9sICovCi0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkJLyogTGVhZGluZyB3aGl0ZXNwYWNlIGlzIHBhcnQgb2Ygb3BlcmFuZC4gKi8KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoIWlzX25hbWVfYmVnaW5uZXIgKCpuYW1lKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgaWRlbnRpZmllciBmb3IgXCIuaWZkZWZcIiIpKTsKLSAgICAgIG9ic3RhY2tfMWdyb3cgKCZjb25kX29ic3RhY2ssIDApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICAgICAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICAgICAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhKChzeW1ib2xQICE9IDApIF4gYXJnKTsKLSAgICAgIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJCW9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwKLQkJCQkgICAgICBzaXplb2YgKGNmcmFtZSkpKTsKLQotICAgICAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0JICAmJiBjZnJhbWUuaWdub3JpbmcKLQkgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgICAgICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLQlsaXN0aW5nX2xpc3QgKDIpOwotCi0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0JCQkJLyogaWYgYSB2YWxpZCBpZGVudGlmeWVyIG5hbWUgKi8KLX0JCQkJLyogc19pZmRlZigpICovCi0KLXZvaWQgCi1zX2lmIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGV4cHJlc3Npb25TIG9wZXJhbmQ7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0gIGludCB0OwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBwYXJ0IG9mIG9wZXJhbmQuICovCi0KLSAgaWYgKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKQotICAgIHsKLSAgICAgIG9wZXJhbmQuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uICgmb3BlcmFuZCk7Ci0gICAgICBpZiAob3BlcmFuZC5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJub24tY29uc3RhbnQgZXhwcmVzc2lvbiBpbiBcIi5pZlwiIHN0YXRlbWVudCIpKTsKLSAgICB9Ci0KLSAgc3dpdGNoICgob3BlcmF0b3JUKSBhcmcpCi0gICAgewotICAgIGNhc2UgT19lcTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyID09IDA7IGJyZWFrOwotICAgIGNhc2UgT19uZTogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyICE9IDA7IGJyZWFrOwotICAgIGNhc2UgT19sdDogdCA9IG9wZXJhbmQuWF9hZGRfbnVtYmVyIDwgMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2xlOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPD0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2dlOiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPj0gMDsgYnJlYWs7Ci0gICAgY2FzZSBPX2d0OiB0ID0gb3BlcmFuZC5YX2FkZF9udW1iZXIgPiAwOyBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIHRoZSBhYm92ZSBlcnJvciBpcyBzaWduYWxlZCwgdGhpcyB3aWxsIGRpc3BhdGNoCi0gICAgIHVzaW5nIGFuIHVuZGVmaW5lZCByZXN1bHQuICBObyBiaWcgZGVhbC4gICovCi0gIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIHQ7Ci0gIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJICAgIG9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwgc2l6ZW9mIChjZnJhbWUpKSk7Ci0KLSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0gICAgICAmJiBjZnJhbWUuaWdub3JpbmcKLSAgICAgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotICAgIGxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfaWYoKSAqLwotCi0vKiBHZXQgYSBzdHJpbmcgZm9yIHRoZSBNUkkgSUZDIG9yIElGTkMgcHNldWRvLW9wcy4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdldF9tcmlfc3RyaW5nICh0ZXJtaW5hdG9yLCBsZW4pCi0gICAgIGludCB0ZXJtaW5hdG9yOwotICAgICBpbnQgKmxlbjsKLXsKLSAgY2hhciAqcmV0OwotICBjaGFyICpzOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgcyA9IHJldCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLSAgICB7Ci0gICAgICArK3M7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQl7Ci0JICAqcysrID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgaWYgKHNbLTFdID09ICdcJycpCi0JICAgIHsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnKQotCQlicmVhazsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCX0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSB0ZXJtaW5hdG9yCi0JICAgICAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAocyA+IHJldCAmJiAoc1stMV0gPT0gJyAnIHx8IHNbLTFdID09ICdcdCcpKQotCS0tczsKLSAgICB9Ci0KLSAgKmxlbiA9IHMgLSByZXQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBNUkkgSUZDIGFuZCBJRk5DIHBzZXVkby1vcHMuICAqLwotCi12b2lkCi1zX2lmYyAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLSAgY2hhciAqczEsICpzMjsKLSAgaW50IGxlbjEsIGxlbjI7Ci0gIGludCByZXM7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBzMSA9IGdldF9tcmlfc3RyaW5nICgnLCcsICZsZW4xKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgYXNfYmFkIChfKCJiYWQgZm9ybWF0IGZvciBpZmMgb3IgaWZuYyIpKTsKLSAgZWxzZQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHMyID0gZ2V0X21yaV9zdHJpbmcgKCc7JywgJmxlbjIpOwotCi0gIHJlcyA9IGxlbjEgPT0gbGVuMiAmJiBzdHJuY21wIChzMSwgczIsIGxlbjEpID09IDA7Ci0KLSAgaW5pdGlhbGl6ZV9jZnJhbWUgKCZjZnJhbWUpOwotICBjZnJhbWUuaWdub3JpbmcgPSBjZnJhbWUuZGVhZF90cmVlIHx8ICEgKHJlcyBeIGFyZyk7Ci0gIGN1cnJlbnRfY2ZyYW1lID0gKChzdHJ1Y3QgY29uZGl0aW9uYWxfZnJhbWUgKikKLQkJICAgIG9ic3RhY2tfY29weSAoJmNvbmRfb2JzdGFjaywgJmNmcmFtZSwgc2l6ZW9mIChjZnJhbWUpKSk7Ci0KLSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpCi0gICAgICAmJiBjZnJhbWUuaWdub3JpbmcKLSAgICAgICYmIChjZnJhbWUucHJldmlvdXNfY2ZyYW1lID09IE5VTEwKLQkgIHx8ICEgY2ZyYW1lLnByZXZpb3VzX2NmcmFtZS0+aWdub3JpbmcpKQotICAgIGxpc3RpbmdfbGlzdCAoMik7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQgCi1zX2VuZGlmIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqaG9sZDsKLQotICBpZiAoY3VycmVudF9jZnJhbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlwiLmVuZGlmXCIgd2l0aG91dCBcIi5pZlwiIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotCSAgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nCi0JICAmJiAoY3VycmVudF9jZnJhbWUtPnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICAgICAgfHwgISBjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lLT5pZ25vcmluZykpCi0JbGlzdGluZ19saXN0ICgxKTsKLQotICAgICAgaG9sZCA9IGN1cnJlbnRfY2ZyYW1lOwotICAgICAgY3VycmVudF9jZnJhbWUgPSBjdXJyZW50X2NmcmFtZS0+cHJldmlvdXNfY2ZyYW1lOwotICAgICAgb2JzdGFja19mcmVlICgmY29uZF9vYnN0YWNrLCBob2xkKTsKLSAgICB9CQkJCS8qIGlmIG9uZSBwb3AgdG9vIG1hbnkgKi8KLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2VuZGlmKCkgKi8KLQotdm9pZCAKLXNfZWxzZSAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBpZiAoY3VycmVudF9jZnJhbWUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5lbHNlIHdpdGhvdXQgbWF0Y2hpbmcgLmlmIC0gaWdub3JlZCIpKTsKLQotICAgIH0KLSAgZWxzZSBpZiAoY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImR1cGxpY2F0ZSBcImVsc2VcIiAtIGlnbm9yZWQiKSk7Ci0gICAgICBhc19iYWRfd2hlcmUgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBwcmV2aW91cyBcImVsc2VcIiIpKTsKLSAgICAgIGFzX2JhZF93aGVyZSAoY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5maWxlLAotCQkgICAgY3VycmVudF9jZnJhbWUtPmlmX2ZpbGVfbGluZS5saW5lLAotCQkgICAgXygiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJpZlwiIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX3doZXJlICgmY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmZpbGUsCi0JCSZjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUubGluZSk7Ci0KLSAgICAgIGlmICghY3VycmVudF9jZnJhbWUtPmRlYWRfdHJlZSkKLQl7Ci0JICBjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcgPSAhY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nOwotCSAgaWYgKExJU1RJTkdfU0tJUF9DT05EICgpKQotCSAgICB7Ci0JICAgICAgaWYgKCEgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nKQotCQlsaXN0aW5nX2xpc3QgKDEpOwotCSAgICAgIGVsc2UKLQkJbGlzdGluZ19saXN0ICgyKTsKLQkgICAgfQotCX0JCQkvKiBpZiBub3QgYSBkZWFkIHRyZWUgKi8KLQotICAgICAgY3VycmVudF9jZnJhbWUtPmVsc2Vfc2VlbiA9IDE7Ci0gICAgfQkJCQkvKiBpZiBlcnJvciBlbHNlIGRvIGl0ICovCi0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19lbHNlKCkgKi8KLQotdm9pZCAKLXNfaWZlcXMgKGFyZykKLSAgICAgaW50IGFyZzsKLXsKLSAgY2hhciAqczEsICpzMjsKLSAgaW50IGxlbjEsIGxlbjI7Ci0gIGludCByZXM7Ci0gIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSBjZnJhbWU7Ci0KLSAgczEgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbjEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLmlmZXFzIHN5bnRheCBlcnJvciIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHMyID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4yKTsKLQotICByZXMgPSBsZW4xID09IGxlbjIgJiYgc3RybmNtcCAoczEsIHMyLCBsZW4xKSA9PSAwOwotCi0gIGluaXRpYWxpemVfY2ZyYW1lICgmY2ZyYW1lKTsKLSAgY2ZyYW1lLmlnbm9yaW5nID0gY2ZyYW1lLmRlYWRfdHJlZSB8fCAhIChyZXMgXiBhcmcpOwotICBjdXJyZW50X2NmcmFtZSA9ICgoc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICopCi0JCSAgICBvYnN0YWNrX2NvcHkgKCZjb25kX29ic3RhY2ssICZjZnJhbWUsIHNpemVvZiAoY2ZyYW1lKSkpOwotCi0gIGlmIChMSVNUSU5HX1NLSVBfQ09ORCAoKQotICAgICAgJiYgY2ZyYW1lLmlnbm9yaW5nCi0gICAgICAmJiAoY2ZyYW1lLnByZXZpb3VzX2NmcmFtZSA9PSBOVUxMCi0JICB8fCAhIGNmcmFtZS5wcmV2aW91c19jZnJhbWUtPmlnbm9yaW5nKSkKLSAgICBsaXN0aW5nX2xpc3QgKDIpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfaWZlcXMoKSAqLwotCi1pbnQgCi1pZ25vcmVfaW5wdXQgKCkKLXsKLSAgY2hhciAqczsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTk9fUFNFVURPX0RPVAotICAgICAgfHwgMQotI2VuZGlmCi0gICAgICApCi0gICAgewotICAgICAgaWYgKHNbLTFdICE9ICcuJykKLQktLXM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHNbLTFdICE9ICcuJykKLQlyZXR1cm4gKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwpICYmIChjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpOwotICAgIH0KLQotICAvKiBXZSBjYW5ub3QgaWdub3JlIGNlcnRhaW4gcHNldWRvIG9wcy4gICovCi0gIGlmICgoKHNbMF0gPT0gJ2knCi0JfHwgc1swXSA9PSAnSScpCi0gICAgICAgJiYgKCFzdHJuY2FzZWNtcCAocywgImlmIiwgMikKLQkgICB8fCAhc3RybmNhc2VjbXAgKHMsICJpZmRlZiIsIDUpCi0JICAgfHwgIXN0cm5jYXNlY21wIChzLCAiaWZuZGVmIiwgNikpKQotICAgICAgfHwgKChzWzBdID09ICdlJwotCSAgIHx8IHNbMF0gPT0gJ0UnKQotCSAgJiYgKCFzdHJuY2FzZWNtcCAocywgImVsc2UiLCA0KQotCSAgICAgIHx8ICFzdHJuY2FzZWNtcCAocywgImVuZGlmIiwgNSkKLQkgICAgICB8fCAhc3RybmNhc2VjbXAgKHMsICJlbmRjIiwgNCkpKSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwpICYmIChjdXJyZW50X2NmcmFtZS0+aWdub3JpbmcpOwotfQkJCQkvKiBpZ25vcmVfaW5wdXQoKSAqLwotCi1zdGF0aWMgdm9pZCAKLWluaXRpYWxpemVfY2ZyYW1lIChjZnJhbWUpCi0gICAgIHN0cnVjdCBjb25kaXRpb25hbF9mcmFtZSAqY2ZyYW1lOwotewotICBtZW1zZXQgKGNmcmFtZSwgMCwgc2l6ZW9mICgqY2ZyYW1lKSk7Ci0gIGFzX3doZXJlICgmY2ZyYW1lLT5pZl9maWxlX2xpbmUuZmlsZSwKLQkgICAgJmNmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUpOwotICBjZnJhbWUtPnByZXZpb3VzX2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lOwotICBjZnJhbWUtPmRlYWRfdHJlZSA9IGN1cnJlbnRfY2ZyYW1lICE9IE5VTEwgJiYgY3VycmVudF9jZnJhbWUtPmlnbm9yaW5nOwotICBjZnJhbWUtPm1hY3JvX25lc3QgPSBtYWNyb19uZXN0OwotfQotCi0vKiBHaXZlIGFuIGVycm9yIGlmIGEgY29uZGl0aW9uYWwgaXMgdW50ZXJtaW5hdGVkIGluc2lkZSBhIG1hY3JvIG9yCi0gICB0aGUgYXNzZW1ibHkgYXMgYSB3aG9sZS4gIElmIE5FU1QgaXMgbm9uIG5lZ2F0aXZlLCB3ZSBhcmUgYmVpbmcKLSAgIGNhbGxlZCBiZWNhdXNlIG9mIHRoZSBlbmQgb2YgYSBtYWNybyBleHBhbnNpb24uICBJZiBORVNUIGlzCi0gICBuZWdhdGl2ZSwgd2UgYXJlIGJlaW5nIGNhbGxlZCBhdCB0aGUgb2YgdGhlIGlucHV0IGZpbGVzLiAgKi8KLQotdm9pZAotY29uZF9maW5pc2hfY2hlY2sgKG5lc3QpCi0gICAgIGludCBuZXN0OwotewotICBpZiAoY3VycmVudF9jZnJhbWUgIT0gTlVMTCAmJiBjdXJyZW50X2NmcmFtZS0+bWFjcm9fbmVzdCA+PSBuZXN0KQotICAgIHsKLSAgICAgIGlmIChuZXN0ID49IDApCi0JYXNfYmFkIChfKCJlbmQgb2YgbWFjcm8gaW5zaWRlIGNvbmRpdGlvbmFsIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiZW5kIG9mIGZpbGUgaW5zaWRlIGNvbmRpdGlvbmFsIikpOwotICAgICAgYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmZpbGUsCi0JCSAgICBjdXJyZW50X2NmcmFtZS0+aWZfZmlsZV9saW5lLmxpbmUsCi0JCSAgICBfKCJoZXJlIGlzIHRoZSBzdGFydCBvZiB0aGUgdW50ZXJtaW5hdGVkIGNvbmRpdGlvbmFsIikpOwotICAgICAgaWYgKGN1cnJlbnRfY2ZyYW1lLT5lbHNlX3NlZW4pCi0JYXNfYmFkX3doZXJlIChjdXJyZW50X2NmcmFtZS0+ZWxzZV9maWxlX2xpbmUuZmlsZSwKLQkJICAgICAgY3VycmVudF9jZnJhbWUtPmVsc2VfZmlsZV9saW5lLmxpbmUsCi0JCSAgICAgIF8oImhlcmUgaXMgdGhlIFwiZWxzZVwiIG9mIHRoZSB1bnRlcm1pbmF0ZWQgY29uZGl0aW9uYWwiKSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIGV4aXQgb3V0IG9mIGEgbWFjcm8uICBXZSBhc3N1bWUKLSAgIHRoYXQgYW55IGNvbmRpdGlvbmFscyB3aGljaCBiZWdhbiB3aXRoaW4gdGhlIG1hY3JvIGFyZSBjb3JyZWN0bHkKLSAgIG5lc3RlZCwgYW5kIGp1c3QgcG9wIHRoZW0gb2ZmIHRoZSBzdGFjay4gICovCi0KLXZvaWQKLWNvbmRfZXhpdF9tYWNybyAobmVzdCkKLSAgICAgaW50IG5lc3Q7Ci17Ci0gIHdoaWxlIChjdXJyZW50X2NmcmFtZSAhPSBOVUxMICYmIGN1cnJlbnRfY2ZyYW1lLT5tYWNyb19uZXN0ID49IG5lc3QpCi0gICAgewotICAgICAgc3RydWN0IGNvbmRpdGlvbmFsX2ZyYW1lICpob2xkOwotCi0gICAgICBob2xkID0gY3VycmVudF9jZnJhbWU7Ci0gICAgICBjdXJyZW50X2NmcmFtZSA9IGN1cnJlbnRfY2ZyYW1lLT5wcmV2aW91c19jZnJhbWU7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKCZjb25kX29ic3RhY2ssIGhvbGQpOwotICAgIH0KLX0KLQotLyogZW5kIG9mIGNvbmQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy1nYXMuY29tIGIvZ2FzL2NvbmZpZy1nYXMuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjUyNDhhLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWctZ2FzLmNvbQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0kIWNvbmZpZy1nYXMuY29tCi0kISBUaGlzIGZpbGUgc2V0cyB0aGluZ3MgdXAgdG8gYnVpbGQgZ2FzIG9uIGEgVk1TIHN5c3RlbSB0byBnZW5lcmF0ZSBvYmplY3QKLSQhIGZpbGVzIGZvciBhIFZNUyBzeXN0ZW0uICBXZSBkbyBub3QgdXNlIHRoZSBjb25maWd1cmUgc2NyaXB0LCBzaW5jZSB3ZQotJCEgZG8gbm90IGhhdmUgL2Jpbi9zaCB0byBleGVjdXRlIGl0LgotJCEKLSQhCi0kIGdhc19ob3N0PSJ2bXMiCi0kIGFyY2hfaW5keCA9IDEgKyAoKGYkZ2V0c3lpKCJDUFUiKS5nZS4xMjgpLmFuZC4xKQkhIHZheD09MSwgYWxwaGE9PTIKLSQgYXJjaCA9IGYkZWxlbWVudChhcmNoX2luZHgsInwiLCJ8VkFYfEFscGhhfCIpCi0kIGlmIGFyY2guZXFzLiJWQVgiCi0kIHRoZW4KLSQgIGNwdV90eXBlPSJ2YXgiCi0kICBvYmpfZm9ybWF0PSJ2bXMiCi0kICBhdG9mPSJ2YXgiCi0kIGVsc2UKLSQgIGNwdV90eXBlPSJhbHBoYSIKLSQgIG9ial9mb3JtYXQ9ImV2YXgiCi0kICBhdG9mPSJpZWVlIgotJCBlbmRpZgotJCBlbXVsYXRpb249ImdlbmVyaWMiCi0kIQotJAlERUxFVEUJPSAiZGVsZXRlL25vQ29uZmlybSIKLSQJRUNITwk9ICJ3cml0ZSBzeXMkb3V0cHV0IgotJCEKLSQhIFRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbgotJCBjYWxsIG1ha2UgInRhcmctY3B1LmgiICJbLmNvbmZpZ110Yy0nJ2NwdV90eXBlJy5oIgotJCBjYWxsIG1ha2UgInRhcmctZW52LmgiICJbLmNvbmZpZ110ZS0nJ2VtdWxhdGlvbicuaCIKLSQhCi0kISBDb2RlIHRvIGhhbmRsZSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LgotJCBjYWxsIG1ha2UgIm9iai1mb3JtYXQuaCIgIlsuY29uZmlnXW9iai0nJ29ial9mb3JtYXQnLmgiCi0kIQotJCEgKG5vdCBjdXJyZW50bHkgdXNlZCBmb3IgdmF4IG9yIGFscGhhKQotJCBjYWxsIG1ha2UgIml0YmwtY3B1LmgiICJbLmNvbmZpZ11pdGJsLScnY3B1X3R5cGUnLmgiCi0kIQotJCEKLSQhIENyZWF0ZSB0aGUgZmlsZSB2ZXJzaW9uLm9wdCwgd2hpY2ggaGVscHMgaWRlbnRpZnkgdGhlIGV4ZWN1dGFibGUuCi0kIQotJGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kc2VhcmNoIENPTkZJR1VSRS5JTiAiQU1fSU5JVF9BVVRPTUFLRSIvRXhhY3QvT3V0cHV0PWNvbmZpZy1nYXMtdG1wLnRtcAotJG9wZW4gaWZpbGUkIGNvbmZpZy1nYXMtdG1wLnRtcAotJHJlYWQgaWZpbGUkIGxpbmUKLSRjbG9zZSBpZmlsZSQKLSRERUxFVEUgY29uZmlnLWdhcy10bXAudG1wOyoKLSQhIERpc2NhcmQgIkFNX0lOSVRfQVVUT01BS0UoZ2FzLCAiIGFuZCAiKSIgcGFydHMuCi0kaWprPWYkbG9jYXRlKCIsIixsaW5lKSsyCi0kbGluZT1mJGV4dHJhY3QoaWprLGYkbGVuZ3RoKGxpbmUpLWlqayxsaW5lKQotJGlqaz1mJGxvY2F0ZSgiKSIsbGluZSkKLSRsaW5lPWYkZXh0cmFjdCgwLGlqayxsaW5lKQotJCEKLSQgaWYgZiRzZWFyY2goInZlcnNpb24ub3B0IikubmVzLiIiIHRoZW4gREVMRVRFIHZlcnNpb24ub3B0OyoKLSRjb3B5IF9OTDogdmVyc2lvbi5vcHQKLSRvcGVuL0FwcGVuZCBpZmlsZSQgdmVyc2lvbi5vcHQKLSR3cml0ZSBpZmlsZSQgImlkZW50aWZpY2F0aW9uPSIrIiIiIitsaW5lKyIiIiIKLSRjbG9zZSBpZmlsZSQKLSQhCi0kISBOb3cgd3JpdGUgY29uZmlnLmguCi0kIQotJCBpZiBmJHNlYXJjaCgiY29uZmlnLmgiKS5uZXMuIiIgdGhlbiBERUxFVEUgY29uZmlnLmg7KgotJGNvcHkgX05MOiBjb25maWcuaAotJG9wZW4vQXBwZW5kIGlmaWxlJCBjb25maWcuaAotJHdyaXRlIGlmaWxlJCAiLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgY29uZmlnLWdhcy5jb20uICovCi0kd3JpdGUgaWZpbGUkICIjaWZuZGVmIFZFUlNJT04iCi0kd3JpdGUgaWZpbGUkICIjZGVmaW5lIFZFUlNJT04gICAgICAiIiIsbGluZSwiIiIiCi0kd3JpdGUgaWZpbGUkICIjZW5kaWYiCi0kd3JpdGUgaWZpbGUkICIvKi0tKi8iCi0kaWYgYXJjaCAuZXFzLiAiVkFYIgotJHRoZW4KLSRhcHBlbmQgWy5jb25maWdddm1zLWNvbmYuaCBpZmlsZSQ6Ci0kZWxzZQotJCBhcHBlbmQgWy5jb25maWdddm1zLWEtY29uZi5oIGlmaWxlJDoKLSRlbmRpZgotJGNsb3NlIGlmaWxlJAotJEVDSE8gIkNyZWF0ZWQgY29uZmlnLmguIgotJCEKLSQhIENoZWNrIGZvciwgYW5kIHBvc3NpYmx5IG1ha2UsIGhlYWRlciBmaWxlIDx1bmlzdGQuaD4uCi0kIQotJCBpZiBmJHNlYXJjaCgidG1wLWNoay1oLioiKS5uZXMuIiIgdGhlbiAgREVMRVRFIHRtcC1jaGstaC4qOyoKLSQhY2FuJ3QgdXNlIHNpbXBsZSBgI2luY2x1ZGUgSERSJyB3aXRoIGBnY2MgL0RlZmluZT0iSERSPTxmb28uaD4iJwotJCFiZWNhdXNlIHRoZSAyLjYuWzAtM10gcHJlcHJvY2Vzc29yIGhhbmRsZXMgaXQgd3JvbmcgKFZNUy1zcGVjaWZpYyBnY2MgYnVnKQotJCBjcmVhdGUgdG1wLWNoay1oLmMKLWludCB0bXBfY2hrX2g7CS8qIGd1YXJhbnRlZSBub24tZW1wdHkgb3V0cHV0ICovCi0jaWZkZWYgSEFWRV9TVERJT19ICi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JWElPX0gKLSNpbmNsdWRlIDx1bml4aW8uaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JWExJQl9ICi0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2VuZGlmCi0kIG9uIHdhcm5pbmcgdGhlbiAgY29udGludWUKLSQgQ0hFQ0sgPSAiY2FsbCB0bXBfY2hrX2giCi0kIENIRUNLICJIQVZFX1NURElPX0giCi0kIGlmIC5ub3QuJHN0YXR1cwotJCB0aGVuCXR5cGUgc3lzJGlucHV0OgotCi0/IGNvdWxkIG5vdCBjb21waWxlIDxzdGRpby5oPi4KLQotICBJZiB5b3UncmUgY29tcGlsaW5nIHdpdGggREVDIEMgb3IgVkFYIEMsIGNyZWF0ZSBjb25maWcuc3RhdHVzIGFzIGFuCi0gIGVtcHR5IGZpbGUgYW5kIHN0YXJ0IGdudSBtYWtlIGFnYWluLgotCi0gIElmIHlvdSdyZSBjb21waWxpbmcgd2l0aCBHTlUgQywgdGhlcmUgaXMgc29tZSBzZXR1cCBwcm9ibGVtIGFuZAotICBnYXMgY29uZmlndXJhdGlvbiBjYW5ub3QgcHJvY2VlZC4KLQotJAlERUxFVEUgdG1wLWNoay1oLmM7KgotJAlleGl0ICV4MDAyQwotJCBlbmRpZgotJCEKLSQgQ0hFQ0sgIkhBVkVfVU5JU1REX0giCi0kIGlmIC5ub3QuJHN0YXR1cwotJCB0aGVuCi0kICBpZiBmJHRybmxubSgiSEZJTEUkIikubmVzLiIiIHRoZW4gIGNsb3NlL25vTG9nIGhmaWxlJAotJCAgQ0hFQ0sgIkhBVkVfVU5JWElPX0giCi0kICBnb3RfdW5peGlvID0gKCRzdGF0dXMgLmFuZC4gMSkKLSQgIENIRUNLICJIQVZFX1VOSVhMSUJfSCIKLSQgIGdvdF91bml4bGliID0gKCRzdGF0dXMgLmFuZC4gMSkKLSQgIGNyZWF0ZSBbXXVuaXN0ZC5oCSF3aXRoIHJ1ZGltZW50YXJ5IGNvbnRlbnRzCi0vKiA8dW5pc3RkLmg+IHN1YnN0aXR1dGUgZm9yIGJ1aWxkaW5nIGdhcyAqLwotI2lmbmRlZiBVTklTVERfSAotI2RlZmluZSBVTklTVERfSAotCi0kICBvcGVuL0FwcGVuZCBoZmlsZSQgW111bmlzdGQuaAotJCAgaWYgZ290X3VuaXhpbwotJCAgdGhlbiAgd3JpdGUgaGZpbGUkICIjaW5jbHVkZSA8dW5peGlvLmg+IgotJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGlvLmg+ICovCi1leHRlcm4gaW50IGNyZWF0KCksIG9wZW4oKSwgY2xvc2UoKSwgcmVhZCgpLCB3cml0ZSgpOwotZXh0ZXJuIGludCBhY2Nlc3MoKSwgZHVwKCksIGR1cDIoKSwgZnN0YXQoKSwgc3RhdCgpOwotZXh0ZXJuIGxvbmcgbHNlZWsoKTsKLSQgIGVuZGlmCi0kICB3cml0ZSBoZmlsZSQgIiIKLSQgIGlmIGdvdF91bml4bGliCi0kICB0aGVuICB3cml0ZSBoZmlsZSQgIiNpbmNsdWRlIDx1bml4bGliLmg+IgotJCAgZWxzZSAgYXBwZW5kIHN5cyRpbnB1dDogaGZpbGUkOgotLyogc29tZSBvZiB0aGUgcm91dGluZXMgbm9ybWFsbHkgcHJvdG90eXBlZCBpbiA8dW5peGxpYi5oPiAqLwotZXh0ZXJuIGNoYXIgKnNicmsoKSwgKmdldGN3ZCgpLCAqY3VzZXJpZCgpOwotZXh0ZXJuIGludCBicmsoKSwgY2hkaXIoKSwgY2htb2QoKSwgY2hvd24oKSwgbWtkaXIoKTsKLWV4dGVybiB1bnNpZ25lZCBnZXR1aWQoKSwgdW1hc2soKTsKLSQgIGVuZGlmCi0kICBhcHBlbmQgc3lzJGlucHV0OiBoZmlsZSQ6Ci0KLSNlbmRpZiAvKlVOSVNURF9IKi8KLSQgIGNsb3NlIGhmaWxlJAotJCAgRUNITyAiQ3JlYXRlZCAiIltddW5pc3RkLmgiIi4iCi0kIGVuZGlmICFnY2MgJyNpbmNsdWRlIDx1bmlzdGQuaD4nIGZhaWxlZAotJCBERUxFVEUgdG1wLWNoay1oLmM7KgotJAotJHRtcF9jaGtfaDogc3Vicm91dGluZQotJCAgc2V0IG5vT24KLSQgIGhuYW1lID0gZiRlZGl0KCI8IiArIChwMSAtICJIQVZFXyIgLSAiX0giKSArICIuaD4iLCJMT1dFUkNBU0UiKQotJCAgd3JpdGUgc3lzJG91dHB1dCAiQ2hlY2tpbmcgZm9yICcnaG5hbWUnLiIKLSQgIGlmIGYkc2VhcmNoKCJ0bXAtY2hrLWgub2JqIikubmVzLiIiIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKLSQgIGRlZmluZS9ub0xvZyBzeXMkZXJyb3IgX05MOgkhY2FuJ3QgdXNlIC9Vc2VyX01vZGUgaGVyZSBkdWUgdG8gZ2NjCi0kICBkZWZpbmUvbm9Mb2cgc3lzJG91dHB1dCBfTkw6CSEgZHJpdmVyJ3MgdXNlIG9mIG11bHRpcGxlIGltYWdlIGFjdGl2YXRpb24KLSQgIGdjYyAvSW5jbHVkZT0oW10sWy0uaW5jbHVkZV0pIC9EZWZpbmU9KCInJ3AxJyIpIHRtcC1jaGstaC5jCi0kIWNhbid0IGp1c3QgY2hlY2sgJHN0YXR1czsgZ2NjIDIuNi5bMC0zXSBwcmVwcm9jZXNzb3IgZG9lc24ndCBzZXQgaXQgY29ycmVjdGx5Ci0kICBvayA9ICgoJHN0YXR1cy5hbmQuMSkuYW5kLihmJHNlYXJjaCgidG1wLWNoay1oLm9iaiIpLm5lcy4iIikpIC5vci4gJXgxMDAwMDAwMAotJCAgZGVhc3NpZ24gc3lzJGVycm9yCSFyZXN0b3JlLCBtb3JlIG9yIGxlc3MKLSQgIGRlYXNzaWduIHN5cyRvdXRwdXQKLSQgIGlmIG9rIHRoZW4gIERFTEVURSB0bXAtY2hrLWgub2JqOyoKLSQgIGV4aXQgb2sKLSQgZW5kc3Vicm91dGluZSAhdG1wX2Noa19oCi0kCi0kIQotJCEgRG9uZQotJCEKLSQgaWYgZiRzZWFyY2goImNvbmZpZy5zdGF0dXMiKSAubmVzLiAiIiB0aGVuIERFTEVURSBjb25maWcuc3RhdHVzOyoKLSQgb3Blbi93cml0ZSBjZmlsZSBbXWNvbmZpZy5zdGF0dXMKLSQgd3JpdGUgY2ZpbGUgIkxpbmtzIGFyZSBub3cgc2V0IHVwIGZvciB1c2Ugd2l0aCBhICIrYXJjaCsiIHJ1bm5pbmcgVk1TLiIKLSQgY2xvc2UgY2ZpbGUKLSQgdHlwZSBbXWNvbmZpZy5zdGF0dXMKLSRleGl0Ci0kIQotJCEKLSRtYWtlOiBzdWJyb3V0aW5lCi0kICBpZiBmJHNlYXJjaChwMSkubmVzLiIiIHRoZW4gREVMRVRFICdwMSc7KgotJCAgY3JlYXRlICdwMScKLSQgIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kICBvcGVuL0FwcGVuZCBpZmlsZSQgJ3AxJwotJCAgd3JpdGUgaWZpbGUkICIjaW5jbHVkZSAiIicnZiRzdHJpbmcocDIgLSAiWy5jb25maWddIiknIiIiCi0kICBjbG9zZSBpZmlsZSQKLSQgIEVDSE8gIkNyZWF0ZWQgJydwMScgZm9yICcncDInLiIKLSRlbmRzdWJyb3V0aW5lICFtYWtlCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnLmluIGIvZ2FzL2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmMmFkYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SRU1PVkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzYnJrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGFyZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1RSSU5HU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx2YXJhcmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiBkZWZhdWx0aW5nIHRvIEVMRiBvbiBTQ08gNS4gKi8KLSN1bmRlZiBTQ09fRUxGCi0KLS8qIFVzZSBFTEYgc3RhYnMgZm9yIE1JUFMsIG5vdCBFQ09GRiBzdGFicyAqLwotI3VuZGVmIE1JUFNfU1RBQlNfRUxGCi0KLS8qIERlZmluZSBpZiBkZWZhdWx0IHRhcmdldCBpcyBQb3dlclBDIFNvbGFyaXMuICovCi0jdW5kZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotCi0vKiBEZWZpbmUgYXMgMSBpZiBiaWcgZW5kaWFuLiAqLwotI3VuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0KLS8qIERlZmF1bHQgYXJjaGl0ZWN0dXJlLiAqLwotI3VuZGVmIERFRkFVTFRfQVJDSAotCi0vKiBVc2luZyBjZ2VuIGNvZGU/ICovCi0jdW5kZWYgVVNJTkdfQ0dFTgotCi0vKiBVc2luZyBpMzg2IENPRkY/ICovCi0jdW5kZWYgSTM4NkNPRkYKLQotLyogVXNpbmcgbTY4ayBDT0ZGPyAqLwotI3VuZGVmIE02OEtDT0ZGCi0KLS8qIFVzaW5nIG04OGsgQ09GRj8gKi8KLSN1bmRlZiBNODhLQ09GRgotCi0vKiBhLm91dCBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9BT1VUCi0KLS8qIGIub3V0IHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0JPVVQKLQotLyogQ09GRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9DT0ZGCi0KLS8qIEVDT0ZGIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0VDT0ZGCi0KLS8qIEVMRiBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9FTEYKLQotLyogZ2VuZXJpYyBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9HRU5FUklDCi0KLS8qIEhQMzAwIHN1cHBvcnQ/ICovCi0jdW5kZWYgT0JKX01BWUJFX0hQMzAwCi0KLS8qIElFRUUgc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfSUVFRQotCi0vKiBTT00gc3VwcG9ydD8gKi8KLSN1bmRlZiBPQkpfTUFZQkVfU09NCi0KLS8qIFZNUyBzdXBwb3J0PyAqLwotI3VuZGVmIE9CSl9NQVlCRV9WTVMKLQotLyogVXNlIGVtdWxhdGlvbiBzdXBwb3J0PyAqLwotI3VuZGVmIFVTRV9FTVVMQVRJT05TCi0KLS8qIFN1cHBvcnRlZCBlbXVsYXRpb25zLiAqLwotI3VuZGVmIEVNVUxBVElPTlMKLQotLyogRGVmYXVsdCBlbXVsYXRpb24uICovCi0jdW5kZWYgREVGQVVMVF9FTVVMQVRJT04KLQotLyogb2xkIENPRkYgc3VwcG9ydD8gKi8KLSN1bmRlZiBNQU5ZX1NFR01FTlRTCi0KLS8qIFVzZSBCRkQgaW50ZXJmYWNlPyAqLwotI3VuZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogVGFyZ2V0IGFsaWFzLiAqLwotI3VuZGVmIFRBUkdFVF9BTElBUwotCi0vKiBDYW5vbmljYWwgdGFyZ2V0LiAqLwotI3VuZGVmIFRBUkdFVF9DQU5PTklDQUwKLQotLyogVGFyZ2V0IENQVS4gKi8KLSN1bmRlZiBUQVJHRVRfQ1BVCi0KLS8qIFRhcmdldCB2ZW5kb3IuICovCi0jdW5kZWYgVEFSR0VUX1ZFTkRPUgotCi0vKiBUYXJnZXQgT1MuICovCi0jdW5kZWYgVEFSR0VUX09TCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBDb21waWxpbmcgY3Jvc3MtYXNzZW1ibGVyPyAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogYXNzZXJ0IGJyb2tlbj8gKi8KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0KLS8qIERlZmluZSBpZiBzdHJzdHIgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIKLQotLyogRGVmaW5lIGlmIG1hbGxvYyBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX01BTExPQwotCi0vKiBEZWZpbmUgaWYgZnJlZSBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLQotLyogRGVmaW5lIGlmIHNicmsgaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi0KLS8qIERlZmluZSBpZiBlbnZpcm9uIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTgotCi0vKiBEZWZpbmUgaWYgZXJybm8gaXMgbm90IGRlY2xhcmVkIGluIHN5c3RlbSBoZWFkZXIgZmlsZXMuICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9FUlJOTwotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL2FvdXRfZ251LmggYi9nYXMvY29uZmlnL2FvdXRfZ251LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZGY5Y2IuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hb3V0X2dudS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBhb3V0X2dudS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX19BX09VVF9HTlVfSF9fCi0jZGVmaW5lIF9fQV9PVVRfR05VX0hfXwotCi0vKiBUaGVyZSBhcmUgdHdvIG1haW4gZmxhdm91cnMgb2YgYS5vdXQsIG9uZSB3aGljaCB1c2VzIHRoZSBzdGFuZGFyZAotICAgcmVsb2NhdGlvbnMsIGFuZCBvbmUgd2hpY2ggdXNlcyBleHRlbmRlZCByZWxvY2F0aW9ucy4KLQotICAgVG9kYXksIHRoZSBleHRlbmRlZCByZWxvYyB1c2VzIGFyZQotICAgVENfU1BBUkMsIFRDX0EyOUsKLQotICAgZWFjaCBtdXN0IGRlZmluZSB0aGUgZW51bSByZWxvY190eXBlCi0KLSovCi0KLSNkZWZpbmUgVVNFX0VYVEVOREVEX1JFTE9DIChkZWZpbmVkKFRDX1NQQVJDKSB8fCBkZWZpbmVkKFRDX0EyOUspKQotCi0jaWYgZGVmaW5lZChUQ19TUEFSQykgfHwgZGVmaW5lZChUQ19BMjlLKQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSRUxPQ184LCBSRUxPQ18xNiwgUkVMT0NfMzIsLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gICAgUkVMT0NfRElTUDgsIFJFTE9DX0RJU1AxNiwgUkVMT0NfRElTUDMyLAkvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gICAgUkVMT0NfV0RJU1AzMCwgUkVMT0NfV0RJU1AyMiwKLSAgICBSRUxPQ19ISTIyLCBSRUxPQ18yMiwKLSAgICBSRUxPQ18xMywgUkVMT0NfTE8xMCwKLSAgICBSRUxPQ19TRkFfQkFTRSwgUkVMT0NfU0ZBX09GRjEzLAotICAgIFJFTE9DX0JBU0UxMCwgUkVMT0NfQkFTRTEzLCBSRUxPQ19CQVNFMjIsCS8qIFAuSS5DLiAoYmFzZS1yZWxhdGl2ZSkgKi8KLSAgICBSRUxPQ19QQzEwLCBSRUxPQ19QQzIyLAkvKiBmb3Igc29tZSBzb3J0IG9mIHBjLXJlbCBQLkkuQy4gKD8pICovCi0gICAgUkVMT0NfSk1QX1RCTCwJCS8qIFAuSS5DLiBqdW1wIHRhYmxlICovCi0gICAgUkVMT0NfU0VHT0ZGMTYsCQkvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICAgIFJFTE9DX0dMT0JfREFULCBSRUxPQ19KTVBfU0xPVCwgUkVMT0NfUkVMQVRJVkUsCi0gICAgUkVMT0NfMTAsIFJFTE9DXzExLAotICAgIFJFTE9DX1dESVNQMl8xNCwKLSAgICBSRUxPQ19XRElTUDE5LAotICAgIFJFTE9DX0hISTIyLAotICAgIFJFTE9DX0hMTzEwLAotCi0gICAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgICBSRUxPQ19KVU1QVEFSRywgUkVMT0NfQ09OU1QsIFJFTE9DX0NPTlNUSCwKLQotICAgIFJFTE9DX1dESVNQMTQsIFJFTE9DX1dESVNQMjEsCi0KLSAgICBOT19SRUxPQwotICB9OwotCi0jZW5kaWYgLyogVENfU1BBUkMgb3IgVENfQTI5SyAqLwotCi0KLSNkZWZpbmUgX19HTlVfRVhFQ19NQUNST1NfXwotCi0jaWZuZGVmIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiBhIFVuaXggVjcsIEJlcmtlbGV5LCBTdW5PUywgVmF4IFVsdHJpeAotICAgInN0cnVjdCBleGVjIi4gIERvbid0IGFzc3VtZSB0aGF0IG9uIHRoaXMgbWFjaGluZSwgdGhlICJzdHJ1Y3QgZXhlYyIKLSAgIHdpbGwgbGF5IG91dCB0aGUgc2FtZSBzaXplcyBvciBhbGlnbm1lbnRzLiAgKi8KLQotc3RydWN0IGV4ZWNfYnl0ZXMKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgYV9pbmZvWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV90ZXh0WzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9kYXRhWzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV9ic3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX3N5bXNbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2VudHJ5WzRdOwotICAgIHVuc2lnbmVkIGNoYXIgYV90cnNpemVbNF07Ci0gICAgdW5zaWduZWQgY2hhciBhX2Ryc2l6ZVs0XTsKLSAgfTsKLQotLyogSG93IGJpZyB0aGUgInN0cnVjdCBleGVjIiBpcyBvbiBkaXNrICovCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoOCAqIDQpCi0KLS8qIFRoaXMgaXMgdGhlIGxheW91dCBpbiBtZW1vcnkgb2YgYSAic3RydWN0IGV4ZWMiIHdoaWxlIHdlIHByb2Nlc3MgaXQuICAqLwotCi1zdHJ1Y3QgZXhlYwotewotICB1bnNpZ25lZCBsb25nIGFfaW5mbzsJCS8qIFVzZSBtYWNyb3MgTl9NQUdJQywgZXRjIGZvciBhY2Nlc3MgKi8KLSAgdW5zaWduZWQgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZGF0YTsJCS8qIGxlbmd0aCBvZiBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9zeW1zOwkJLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBkYXRhIGluIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGFfZW50cnk7CQkvKiBzdGFydCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGFfdHJzaXplOwkJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgYV9kcnNpemU7CQkvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotfTsKLQotI2VuZGlmIC8qIF9fU1RSVUNUX0VYRUNfT1ZFUlJJREVfXyAqLwotCi0vKiB0aGVzZSBnbyBpbiB0aGUgTl9NQUNIVFlQRSBmaWVsZCAqLwotLyogVGhlc2Ugc3ltYm9scyBjb3VsZCBiZSBkZWZpbmVkIGJ5IGNvZGUgZnJvbSBTdW5zLi4ucHVudCAnZW0gKi8KLSN1bmRlZiBNX1VOS05PV04KLSN1bmRlZiBNXzY4MDEwCi0jdW5kZWYgTV82ODAyMAotI3VuZGVmIE1fU1BBUkMKLWVudW0gbWFjaGluZV90eXBlCi0gIHsKLSAgICBNX1VOS05PV04gPSAwLAotICAgIE1fNjgwMTAgPSAxLAotICAgIE1fNjgwMjAgPSAyLAotICAgIE1fU1BBUkMgPSAzLAotICAgIC8qIHNraXAgYSBidW5jaCBzbyB3ZSBkb24ndCBydW4gaW50byBhbnkgb2Ygc3VuJ3MgbnVtYmVycyAqLwotICAgIE1fMzg2ID0gMTAwLAotICAgIE1fMjlLID0gMTAxLAotICAgIE1fUlM2MDAwID0gMTAyLAkJLyogSUJNIFJTLzYwMDAgKi8KLSAgICAvKiBIUC9CU0QgZm9ybWF0cyAqLwotICAgIE1fSFAyMDAgPSAyMDAsCQkvKiBocDIwMCAoNjgwMTApIEJTRCBiaW5hcnkgKi8KLSAgICBNX0hQMzAwID0gMzAwLAkJLyogaHAzMDAgKDY4MDIwKzY4ODgxKSBCU0QgYmluYXJ5ICovCi0gICAgTV9IUFVYMjMgPSAweDAyMEMJCS8qIGhwMjAwLzMwMCBIUFVYIGJpbmFyeSAqLwotICB9OwotCi0jZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKS5hX2luZm8gJiAweGZmZmYpCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChlbnVtIG1hY2hpbmVfdHlwZSkoKChleGVjKS5hX2luZm8gPj4gMTYpICYgMHhmZikpCi0jZGVmaW5lIE5fRkxBR1MoZXhlYykgKCgoZXhlYykuYV9pbmZvID4+IDI0KSAmIDB4ZmYpCi0jZGVmaW5lIE5fU0VUX0lORk8oZXhlYywgbWFnaWMsIHR5cGUsIGZsYWdzKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSAoKG1hZ2ljKSAmIDB4ZmZmZikgXAotICAgICB8ICgoKGludCkodHlwZSkgJiAweGZmKSA8PCAxNikgXAotICAgICB8ICgoKGZsYWdzKSAmIDB4ZmYpIDw8IDI0KSkKLSNkZWZpbmUgTl9TRVRfTUFHSUMoZXhlYywgbWFnaWMpIFwKLSAgICAoKGV4ZWMpLmFfaW5mbyA9ICgoKGV4ZWMpLmFfaW5mbyAmIDB4ZmZmZjAwMDApIHwgKChtYWdpYykgJiAweGZmZmYpKSkKLQotI2RlZmluZSBOX1NFVF9NQUNIVFlQRShleGVjLCBtYWNodHlwZSkgXAotICAgICgoZXhlYykuYV9pbmZvID0gXAotICAgICAoKGV4ZWMpLmFfaW5mbyYweGZmMDBmZmZmKSB8ICgoKChpbnQpKG1hY2h0eXBlKSkmMHhmZikgPDwgMTYpKQotCi0jZGVmaW5lIE5fU0VUX0ZMQUdTKGV4ZWMsIGZsYWdzKSBcCi0gICAgKChleGVjKS5hX2luZm8gPSBcCi0gICAgICgoZXhlYykuYV9pbmZvJjB4MDBmZmZmZmYpIHwgKCgoZmxhZ3MpICYgMHhmZikgPDwgMjQpKQotCi0vKiBDb2RlIGluZGljYXRpbmcgb2JqZWN0IGZpbGUgb3IgaW1wdXJlIGV4ZWN1dGFibGUuICAqLwotI2lmbmRlZiBPTUFHSUMKLSNkZWZpbmUgT01BR0lDIDA0MDcKLSNlbmRpZgotLyogQ29kZSBpbmRpY2F0aW5nIHB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAwNDEwCi0vKiBDb2RlIGluZGljYXRpbmcgZGVtYW5kLXBhZ2VkIGV4ZWN1dGFibGUuICAqLwotI2RlZmluZSBaTUFHSUMgMDQxMwotCi0vKiBWaXJ0dWFsIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGZyb20gdGhlIGEub3V0IGZpbGUuICBGb3IgT01BR0lDLAotICAgKGFsbW9zdCBhbHdheXMgInVubGlua2VkIC5vJ3MiIHRoZXNlIGRheXMpLCBzaG91bGQgYmUgemVyby4KLSAgIEZvciBsaW5rZWQgZmlsZXMsIHNob3VsZCByZWZsZWN0IHJlYWxpdHkgaWYgd2Uga25vdyBpdC4gICovCi0KLSNpZm5kZWYgTl9UWFRBRERSCi0jZGVmaW5lIE5fVFhUQUREUih4KQkoTl9NQUdJQyh4KT09T01BR0lDPyAwIDogVEVYVF9TVEFSVF9BRERSKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9CQURNQUcKLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSAgICYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0JCQkgICAmJiBOX01BR0lDKHgpICE9IFpNQUdJQykKLSNlbmRpZgotCi0vKiBCeSBkZWZhdWx0LCBzZWdtZW50IHNpemUgaXMgY29uc3RhbnQuICBCdXQgb24gc29tZSBtYWNoaW5lcywgaXQgY2FuCi0gICBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBhLm91dCBoZWFkZXIgKGUuZy4gbWFjaGluZSB0eXBlKS4gICovCi0jaWZuZGVmCU5fU0VHU0laRQotI2RlZmluZQlOX1NFR1NJWkUoeCkJU0VHTUVOVF9TSVpFCi0jZW5kaWYKLQotLyogVGhpcyBjb21wbGV4aXR5IGlzIGZvciBlbmNhcHN1bGF0ZWQgQ09GRiBzdXBwb3J0ICovCi0jaWZuZGVmIF9OX0hEUk9GRgotI2RlZmluZSBfTl9IRFJPRkYoeCkJKE5fU0VHU0laRSh4KSAtIHNpemVvZiAoc3RydWN0IGV4ZWMpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9UWFRPRkYKLSNkZWZpbmUgTl9UWFRPRkYoeCkJKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8JXAotCQkJIF9OX0hEUk9GRigoeCkpICsgc2l6ZW9mIChzdHJ1Y3QgZXhlYykgOglcCi0JCQkgc2l6ZW9mIChzdHJ1Y3QgZXhlYykpCi0jZW5kaWYKLQotCi0jaWZuZGVmIE5fREFUT0ZGCi0jZGVmaW5lIE5fREFUT0ZGKHgpCSggTl9UWFRPRkYoeCkgKyAoeCkuYV90ZXh0ICkKLSNlbmRpZgotCi0jaWZuZGVmIE5fVFJFTE9GRgotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9EUkVMT0ZGCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NZTU9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZW5kaWYKLQotI2lmbmRlZiBOX1NUUk9GRgotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZW5kaWYKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jaWZuZGVmIE5fVFhUQUREUgotI2RlZmluZQlOX1RYVEFERFIoeCkJMAotI2VuZGlmCi0KLSNpZm5kZWYgTl9EQVRBRERSCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0KSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KSsoeCkuYV90ZXh0LTEpICYgfihOX1NFR1NJWkUoeCktMSkpKSkKLSNlbmRpZgotCi0vKiBBZGRyZXNzIG9mIGJzcyBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2RlZmluZSBOX0JTU0FERFIoeCkgKE5fREFUQUREUih4KSArICh4KS5hX2RhdGEpCi0MCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqbl9uYW1lOwotCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCWxvbmcgbl9zdHJ4OwotICAgICAgfQotICAgIG5fdW47Ci0gICAgdW5zaWduZWQgY2hhciBuX3R5cGU7Ci0gICAgY2hhciBuX290aGVyOwotICAgIHNob3J0IG5fZGVzYzsKLSAgICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci0gIH07Ci0KLSNkZWZpbmUgTl9VTkRGIDAKLSNkZWZpbmUgTl9BQlMgMgotI2RlZmluZSBOX1RFWFQgNAotI2RlZmluZSBOX0RBVEEgNgotI2RlZmluZSBOX0JTUyA4Ci0jZGVmaW5lCU5fQ09NTQkweDEyCQkvKiBjb21tb24gKHZpc2libGUgaW4gc2hhcmVkIGxpYiBjb21tb25zKSAqLwotI2RlZmluZSBOX0ZOIDB4MUYJCS8qIEZpbGUgbmFtZSBvZiBhIC5vIGZpbGUgKi8KLQotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgdXNlZnVsbHkgYmUgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgMQotI2RlZmluZSBOX1RZUEUgMDM2Ci0jZGVmaW5lIE5fU1RBQiAwMzQwCi0KLS8qIFRoZSBmb2xsb3dpbmcgdHlwZSBpbmRpY2F0ZXMgdGhlIGRlZmluaXRpb24gb2YgYSBzeW1ib2wgYXMgYmVpbmcKLSAgIGFuIGluZGlyZWN0IHJlZmVyZW5jZSB0byBhbm90aGVyIHN5bWJvbC4gIFRoZSBvdGhlciBzeW1ib2wKLSAgIGFwcGVhcnMgYXMgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSwgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgc3ltYm9sLgotCi0gICBJbmRpcmVjdGlvbiBpcyBhc3ltbWV0cmljYWwuICBUaGUgb3RoZXIgc3ltYm9sJ3MgdmFsdWUgd2lsbCBiZSB1c2VkCi0gICB0byBzYXRpc2Z5IHJlcXVlc3RzIGZvciB0aGUgaW5kaXJlY3Qgc3ltYm9sLCBidXQgbm90IHZpY2UgdmVyc2EuCi0gICBJZiB0aGUgb3RoZXIgc3ltYm9sIGRvZXMgbm90IGhhdmUgYSBkZWZpbml0aW9uLCBsaWJyYXJpZXMgd2lsbAotICAgYmUgc2VhcmNoZWQgdG8gZmluZCBhIGRlZmluaXRpb24uICAqLwotCi0jZGVmaW5lIE5fSU5EUiAweGEKLQotLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KLSAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgotICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAotICAgZWxlbWVudCdzIHZhbHVlIGlzIHN0b3JlZCBpbnRvIG9uZSB3b3JkIG9mIHRoZSBzcGFjZS4KLSAgIFRoZSBmaXJzdCB3b3JkIG9mIHRoZSBzcGFjZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXQgKG51bWJlciBvZiBlbGVtZW50cykuCi0KLSAgIFRoZSBhZGRyZXNzIG9mIHRoZSBzZXQgaXMgbWFkZSBpbnRvIGFuIE5fU0VUViBzeW1ib2wKLSAgIHdob3NlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIHNldC4KLSAgIFRoaXMgc3ltYm9sIGFjdHMgbGlrZSBhIE5fREFUQSBnbG9iYWwgc3ltYm9sCi0gICBpbiB0aGF0IGl0IGNhbiBzYXRpc2Z5IHVuZGVmaW5lZCBleHRlcm5hbCByZWZlcmVuY2VzLiAgKi8KLQotLyogVGhlc2UgYXBwZWFyIGFzIGlucHV0IHRvIExELCBpbiBhIC5vIGZpbGUuICAqLwotI2RlZmluZQlOX1NFVEEJMHgxNAkJLyogQWJzb2x1dGUgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUVAkweDE2CQkvKiBUZXh0IHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEQJMHgxOAkJLyogRGF0YSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRCCTB4MUEJCS8qIEJzcyBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLQotLyogVGhpcyBpcyBvdXRwdXQgZnJvbSBMRC4gICovCi0jZGVmaW5lIE5fU0VUVgkweDFDCQkvKiBQb2ludGVyIHRvIHNldCB2ZWN0b3IgaW4gZGF0YSBhcmVhLiAgKi8KLQotLyogV2FybmluZyBzeW1ib2wuIFRoZSB0ZXh0IGdpdmVzIGEgd2FybmluZyBtZXNzYWdlLCB0aGUgbmV4dCBzeW1ib2wKLSAgIGluIHRoZSB0YWJsZSB3aWxsIGJlIHVuZGVmaW5lZC4gV2hlbiB0aGUgc3ltYm9sIGlzIHJlZmVyZW5jZWQsIHRoZQotICAgbWVzc2FnZSBpcyBwcmludGVkLiAgKi8KLQotI2RlZmluZQlOX1dBUk5JTkcgMHgxZQotCi0vKiBXZWFrIHN5bWJvbHMuICBUaGVzZSBhcmUgYSBHTlUgZXh0ZW5zaW9uIHRvIHRoZSBhLm91dCBmb3JtYXQuICBUaGUKLSAgIHNlbWFudGljcyBhcmUgdGhvc2Ugb2YgRUxGIHdlYWsgc3ltYm9scy4gIFdlYWsgc3ltYm9scyBhcmUgYWx3YXlzCi0gICBleHRlcm5hbGx5IHZpc2libGUuICBUaGUgTl9XRUFLPyB2YWx1ZXMgYXJlIHNxdWVlemVkIGludG8gdGhlCi0gICBhdmFpbGFibGUgc2xvdHMuICBUaGUgdmFsdWUgb2YgYSBOX1dFQUtVIHN5bWJvbCBpcyAwLiAgVGhlIHZhbHVlcwotICAgb2YgdGhlIG90aGVyIHR5cGVzIGFyZSB0aGUgZGVmaW5pdGlvbnMuICAqLwotI2RlZmluZSBOX1dFQUtVCTB4MGQJCS8qIFdlYWsgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0EgMHgwZQkJLyogV2VhayBhYnNvbHV0ZSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtUIDB4MGYJCS8qIFdlYWsgdGV4dCBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtEIDB4MTAJCS8qIFdlYWsgZGF0YSBzeW1ib2wuICAqLwotI2RlZmluZSBOX1dFQUtCIDB4MTEJCS8qIFdlYWsgYnNzIHN5bWJvbC4gICovCi0MCi0vKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBzaW5nbGUgcmVsb2NhdGlvbiB0byBiZSBwZXJmb3JtZWQuCi0gICBUaGUgdGV4dC1yZWxvY2F0aW9uIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgYSB2ZWN0b3Igb2YgdGhlc2Ugc3RydWN0dXJlcywKLSAgIGFsbCBvZiB3aGljaCBhcHBseSB0byB0aGUgdGV4dCBzZWN0aW9uLgotICAgTGlrZXdpc2UsIHRoZSBkYXRhLXJlbG9jYXRpb24gc2VjdGlvbiBhcHBsaWVzIHRvIHRoZSBkYXRhIHNlY3Rpb24uICAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGVudW0gYW5kIHN0cnVjdCB3ZXJlIGJvcnJvd2VkIGZyb20gU3VuT1MncwotICAgL3Vzci9pbmNsdWRlL3N1bjQvYS5vdXQuaCAgYW5kIGV4dGVuZGVkIHRvIGhhbmRsZQotICAgb3RoZXIgbWFjaGluZXMuICBJdCBpcyBjdXJyZW50bHkgdXNlZCBvbiBTUEFSQyBhbmQgQU1EIDI5MDAwLgotCi0gICByZWxvY19leHRfYnl0ZXMgaXMgaG93IGl0IGxvb2tzIG9uIGRpc2suICByZWxvY19pbmZvX2V4dGVuZGVkIGlzCi0gICBob3cgd2UgbWlnaHQgcHJvY2VzcyBpdCBvbiBhIG5hdGl2ZSBob3N0LiAgKi8KLSNpZiBVU0VfRVhURU5ERURfUkVMT0MKLQotc3RydWN0IHJlbG9jX2V4dF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzNdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzFdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9hZGRlbmRbNF07Ci0gIH07Ci0KLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCTB4ODAKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfRVhURVJOX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9CSUcJCTB4MUYKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcJMAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRQkweEY4Ci0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfU0hfTElUVExFCTMKLQotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkxMgkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgcmVsb2NfaW5mb19leHRlbmRlZAotewotICB1bnNpZ25lZCBsb25nIHJfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IHJfaW5kZXg6MjQ7Ci0jIGRlZmluZQlyX3N5bWJvbG51bSAgcl9pbmRleAotICB1bnNpZ25lZCByX2V4dGVybjoxOwotICB1bnNpZ25lZDoyOwotICAvKiAgUlMvNjAwMCBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IGVudW0gYml0ZmllbGQKLQkgICAgZW51bSByZWxvY190eXBlIHJfdHlwZTo1OyAqLwotICBlbnVtIHJlbG9jX3R5cGUgcl90eXBlOwotICBsb25nIGludCByX2FkZGVuZDsKLX07Ci0KLSNlbHNlCi0KLS8qIFRoZSBzdGFuZGFyZCwgb2xkLWZhc2hpb25lZCwgQmVya2VsZXkgY29tcGF0aWJsZSByZWxvY2F0aW9uIHN0cnVjdCAqLwotCi0KLQotI2lmZGVmIFRDX0k4NjAKLS8qIE5PVEU6IHRocmVlIGJpdHMgbWF4LCBzZWUgc3RydWN0IHJlbG9jX2luZm9faTg2MC5yX3R5cGUgKi8KLWVudW0gaTg2MF9yZWxvY190eXBlCi0gIHsKLSAgICBOT19SRUxPQyA9IDAsIEJSQUREUiwgTE9XMCwgTE9XMSwgTE9XMiwgTE9XMywgTE9XNCwgU1BMSVQwLCBTUExJVDEsIFNQTElUMiwgUkVMT0NfMzIsCi0gIH07Ci0KLXR5cGVkZWYgZW51bSBpODYwX3JlbG9jX3R5cGUgcmVsb2NfdHlwZTsKLQotLyogTk9URTogdHdvIGJpdHMgbWF4LCBzZWUgcmVsb2NfaW5mb19pODYwLnJfdHlwZSAqLwotZW51bSBoaWdobG93X3R5cGUKLSAgewotICAgIE5PX1NQRUMgPSAwLCBQQUlSLCBISUdILCBISUdIQURKLAotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbmZvX2k4NjAKLXsKLSAgdW5zaWduZWQgbG9uZyByX2FkZHJlc3M7Ci0gIC8qCi0JICogVXNpbmcgYml0IGZpZWxkcyBoZXJlIGlzIGEgYmFkIGlkZWEgYmVjYXVzZSB0aGUgb3JkZXIgaXMgbm90IHBvcnRhYmxlLiA6LSgKLQkgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICB1bnNpZ25lZCBpbnQgcl9wY3JlbDoxOwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogY29tYmluaW5nIHRoZSB0d28gZmllbGQgc2ltcGxpZmllcyB0aGUgYXJndW1lbnQgcGFzc2luZyBpbiAibmV3X2ZpeCgpIiAqLwotICAvKiBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBleGlzdGluZyBTcGFyYyAjaWZkZWYncyAqLwotICAvKiByX3R5cGU6ICBoaWdobG93X3R5cGUgLSBiaXRzIDUsNDsgcmVsb2NfdHlwZSAtIGJpdHMgMy0wICovCi0gIHVuc2lnbmVkIGludCByX3R5cGU6NjsKLSAgbG9uZyByX2FkZGVuZDsKLX07Ci0KLSNlbmRpZiAvKiBUQ19JODYwICovCi0KLQotc3RydWN0IHJlbG9jX3N0ZF9ieXRlcwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Ci0gICAgdW5zaWduZWQgY2hhciByX2luZGV4WzNdOwotICAgIHVuc2lnbmVkIGNoYXIgcl9iaXRzWzFdOwotICB9OwotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0JJRwkweDgwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1BDUkVMX0xJVFRMRQkweDAxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkweDYwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9CSUcJNQkvKiBUbyBzaGlmdCB0byB1bml0cyBwbGFjZSAqLwotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfTElUVExFCTB4MDYKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0xJVFRMRQkxCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfRVhURVJOX0JJRwkweDEwCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfQklHCTB4MDgKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkweDA0Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0xJVFRMRQkweDA0Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfQklHCTB4MDIKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCTB4MDIKLQotI2RlZmluZQlSRUxPQ19TVERfU0laRQk4CS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLSNlbmRpZiAvKiBVU0VfRVhURU5ERURfUkVMT0MgKi8KLQotI2lmbmRlZiBDVVNUT01fUkVMT0NfRk9STUFUCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi17Ci0gIC8qIEFkZHJlc3MgKHdpdGhpbiBzZWdtZW50KSB0byBiZSByZWxvY2F0ZWQuICAqLwotICBpbnQgcl9hZGRyZXNzOwotICAvKiBUaGUgbWVhbmluZyBvZiByX3N5bWJvbG51bSBkZXBlbmRzIG9uIHJfZXh0ZXJuLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICAvKiBOb256ZXJvIG1lYW5zIHZhbHVlIGlzIGEgcGMtcmVsYXRpdmUgb2Zmc2V0Ci0JICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCi0JICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotCSAgIFRodXMsIGEgdmFsdWUgb2YgMiBpbmRpY2F0ZXMgMTw8MiBieXRlcy4gICovCi0gIHVuc2lnbmVkIGludCByX2xlbmd0aDoyOwotICAvKiAxID0+IHJlbG9jYXRlIHdpdGggdmFsdWUgb2Ygc3ltYm9sLgotCSAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCi0JICAgaW4gZmlsZSdzIHRoZSBzeW1ib2wgdGFibGUuCi0JICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLQkgICByX3N5bWJvbG51bSBpcyBOX1RFWFQsIE5fREFUQSwgTl9CU1Mgb3IgTl9BQlMKLQkgICAodGhlIE5fRVhUIGJpdCBtYXkgYmUgc2V0IGFsc28sIGJ1dCBzaWduaWZpZXMgbm90aGluZykuICAqLwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogVGhlIG5leHQgdGhyZWUgYml0cyBhcmUgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBzZWVtIHRvCi0JICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSNpZmRlZiBUQ19OUzMySwotICB1bnNpZ25lZCBpbnQgcl9ic3I6MTsKLSAgdW5zaWduZWQgaW50IHJfZGlzcDoyOwotI2Vsc2UKLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0jZW5kaWYgLyogVENfTlMzMksgKi8KLSAgLyogdW51c2VkICovCi0gIHVuc2lnbmVkIGludCByX3BhZDoxOwkJLyogUGFkZGluZyAtLSBzZXQgdG8gemVybyAqLwotfTsKLQotI2VuZGlmIC8qIENVU1RPTV9SRUxPQ19GT1JNQVQgKi8KLQotI2VuZGlmIC8qIF9fQV9PVVRfR05VX0hfXyAqLwotCi0vKiBlbmQgb2YgYW91dF9nbnUuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYyBiL2dhcy9jb25maWcvYXRvZi1pZWVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZjBmZmIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9hdG9mLWllZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDcxNSArMCwwIEBACi0vKiBhdG9mX2llZWUuYyAtIHR1cm4gYSBGbG9udW0gaW50byBhbiBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qIEZsb251bXMgcmV0dXJuZWQgaGVyZS4gICovCi1leHRlcm4gRkxPTlVNX1RZUEUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXI7Ci0KLXN0YXRpYyBpbnQgbmV4dF9iaXRzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgdW5nZXRfYml0cyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgUEFSQU1TICgoTElUVExFTlVNX1RZUEUgKikpOwotCi1leHRlcm4gY29uc3QgY2hhciBFWFBfQ0hBUlNbXTsKLS8qIFByZWNpc2lvbiBpbiBMaXR0bGVOdW1zLiAqLwotLyogRG9uJ3QgY291bnQgdGhlIGdhcCBpbiB0aGUgbTY4ayBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LiAgKi8KLSNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoNSkKLSNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCi0jZGVmaW5lIERfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBYX1BSRUNJU0lPTiAoNSkKLSNkZWZpbmUgUF9QUkVDSVNJT04gKDUpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYXNrW10gPQotewotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDAxLAotICAweDAwMDAwMDAzLAotICAweDAwMDAwMDA3LAotICAweDAwMDAwMDBmLAotICAweDAwMDAwMDFmLAotICAweDAwMDAwMDNmLAotICAweDAwMDAwMDdmLAotICAweDAwMDAwMGZmLAotICAweDAwMDAwMWZmLAotICAweDAwMDAwM2ZmLAotICAweDAwMDAwN2ZmLAotICAweDAwMDAwZmZmLAotICAweDAwMDAxZmZmLAotICAweDAwMDAzZmZmLAotICAweDAwMDA3ZmZmLAotICAweDAwMDBmZmZmLAotICAweDAwMDFmZmZmLAotICAweDAwMDNmZmZmLAotICAweDAwMDdmZmZmLAotICAweDAwMGZmZmZmLAotICAweDAwMWZmZmZmLAotICAweDAwM2ZmZmZmLAotICAweDAwN2ZmZmZmLAotICAweDAwZmZmZmZmLAotICAweDAxZmZmZmZmLAotICAweDAzZmZmZmZmLAotICAweDA3ZmZmZmZmLAotICAweDBmZmZmZmZmLAotICAweDFmZmZmZmZmLAotICAweDNmZmZmZmZmLAotICAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmLAotfTsKLQwKLQotc3RhdGljIGludCBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtOwotc3RhdGljIGludCBsaXR0bGVudW1zX2xlZnQ7Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotCi1zdGF0aWMgaW50Ci1uZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQotICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Ci17Ci0gIGludCByZXR1cm5fdmFsdWU7Ci0KLSAgaWYgKCFsaXR0bGVudW1zX2xlZnQpCi0gICAgcmV0dXJuICgwKTsKLSAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci0gICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOwotCi0gICAgICBpZiAoLS1saXR0bGVudW1zX2xlZnQpCi0JewotCSAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOwotCSAgLS1saXR0bGVudW1fcG9pbnRlcjsKLQkgIHJldHVybl92YWx1ZSB8PSAoKmxpdHRsZW51bV9wb2ludGVyID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pICYgbWFza1tudW1iZXJfb2ZfYml0c107Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmICgqbGl0dGxlbnVtX3BvaW50ZXIgPj4gYml0c19sZWZ0X2luX2xpdHRsZW51bSk7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLS8qIE51bSBoYWQgYmV0dGVyIGJlIGxlc3MgdGhhbiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgKi8KLXN0YXRpYyB2b2lkCi11bmdldF9iaXRzIChudW0pCi0gICAgIGludCBudW07Ci17Ci0gIGlmICghbGl0dGxlbnVtc19sZWZ0KQotICAgIHsKLSAgICAgICsrbGl0dGxlbnVtX3BvaW50ZXI7Ci0gICAgICArK2xpdHRsZW51bXNfbGVmdDsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBudW07Ci0gICAgfQotICBlbHNlIGlmIChiaXRzX2xlZnRfaW5fbGl0dGxlbnVtICsgbnVtID4gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBudW0gLSAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gYml0c19sZWZ0X2luX2xpdHRsZW51bSk7Ci0gICAgICArK2xpdHRsZW51bV9wb2ludGVyOwotICAgICAgKytsaXR0bGVudW1zX2xlZnQ7Ci0gICAgfQotICBlbHNlCi0gICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSArPSBudW07Ci19Ci0KLXN0YXRpYyB2b2lkCi1tYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3JkcykKLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwotewotICBhc19iYWQgKF8oImNhbm5vdCBjcmVhdGUgZmxvYXRpbmctcG9pbnQgbnVtYmVyIikpOwotICB3b3Jkc1swXSA9IChMSVRUTEVOVU1fVFlQRSkgKCh1bnNpZ25lZCkgLTEpID4+IDE7IC8qIFplcm8gdGhlIGxlZnRtb3N0IGJpdCAqLwotICB3b3Jkc1sxXSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci0gIHdvcmRzWzJdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLSAgd29yZHNbM10gPSAoTElUVExFTlVNX1RZUEUpIC0xOwotICB3b3Jkc1s0XSA9IChMSVRUTEVOVU1fVFlQRSkgLTE7Ci0gIHdvcmRzWzVdID0gKExJVFRMRU5VTV9UWVBFKSAtMTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKglXYXJuaW5nOiB0aGlzIHJldHVybnMgMTYtYml0IExJVFRMRU5VTXMuIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIJKgotICoJdG8gZmlndXJlIG91dCBhbnkgYWxpZ25tZW50IHByb2JsZW1zIGFuZCB0byBjb25zcGlyZSBmb3IgdGhlCSoKLSAqCWJ5dGVzL3dvcmQgdG8gYmUgZW1pdHRlZCBpbiB0aGUgcmlnaHQgb3JkZXIuIEJpZ2VuZGlhbnMgYmV3YXJlIQkqCi0gKgkJCQkJCQkJCSoKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIE5vdGUgdGhhdCBhdG9mLWllZWUgYWx3YXlzIGhhcyBYIGFuZCBQIHByZWNpc2lvbnMgZW5hYmxlZC4gIGl0IGlzIHVwCi0gICB0byBtZF9hdG9mIHRvIGZpbHRlciB0aGVtIG91dCBpZiB0aGUgdGFyZ2V0IG1hY2hpbmUgZG9lcyBub3Qgc3VwcG9ydAotICAgdGhlbS4gICovCi0KLS8qIFJldHVybnMgcG9pbnRlciBwYXN0IHRleHQgY29uc3VtZWQuICovCi1jaGFyICoKLWF0b2ZfaWVlZSAoc3RyLCB3aGF0X2tpbmQsIHdvcmRzKQotICAgICBjaGFyICpzdHI7CQkJLyogVGV4dCB0byBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KLSAgICAgY2hhciB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gIFRoZSAxc3QgTUFYX1BSRUNJU0lPTiBhcmUKLSAgICAgemVyb2VkLCB0aGUgbGFzdCBjb250YWluIGZsb251bSBiaXRzLiAqLwotICBzdGF0aWMgTElUVExFTlVNX1RZUEUgYml0c1tNQVhfUFJFQ0lTSU9OICsgTUFYX1BSRUNJU0lPTiArIEdVQVJEXTsKLSAgY2hhciAqcmV0dXJuX3ZhbHVlOwotICAvKiBOdW1iZXIgb2YgMTYtYml0IHdvcmRzIGluIHRoZSBmb3JtYXQuICovCi0gIGludCBwcmVjaXNpb247Ci0gIGxvbmcgZXhwb25lbnRfYml0czsKLSAgRkxPTlVNX1RZUEUgc2F2ZV9nZW5fZmxvbnVtOwotCi0gIC8qIFdlIGhhdmUgdG8gc2F2ZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgYmVjYXVzZSBpdAotICAgICBjb250YWlucyBzdG9yYWdlIGFsbG9jYXRpb24gYWJvdXQgdGhlIGFycmF5IG9mIExJVFRMRU5VTXMgd2hlcmUKLSAgICAgdGhlIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZC4gIFdlIHdpbGwgYWxsb2NhdGUgb3VyIG93biBhcnJheSBvZgotICAgICBsaXR0bGVudW1zIGJlbG93LCBidXQgaGF2ZSB0byByZXN0b3JlIHRoZSBnbG9iYWwgb25lIG9uIGV4aXQuICAqLwotICBzYXZlX2dlbl9mbG9udW0gPSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcjsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyA9IGJpdHMgKyBNQVhfUFJFQ0lTSU9OOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5oaWdoID0gTlVMTDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyID0gTlVMTDsKLSAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuZXhwb25lbnQgPSAwOwotICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID0gJ1wwJzsKLQotICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgbmVjZXNzYXJ5OiB0aGUgaGlnaGVzdCBmbG9udW0gbWF5Ci0gICAgIGhhdmUgMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0KLSAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gIHN3aXRjaCAod2hhdF9raW5kKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWNpc2lvbiA9IEZfUFJFQ0lTSU9OOwotICAgICAgZXhwb25lbnRfYml0cyA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlY2lzaW9uID0gRF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ2UnOgotICAgIGNhc2UgJ0UnOgotICAgICAgcHJlY2lzaW9uID0gWF9QUkVDSVNJT047Ci0gICAgICBleHBvbmVudF9iaXRzID0gMTU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotCi0gICAgICBwcmVjaXNpb24gPSBQX1BSRUNJU0lPTjsKLSAgICAgIGV4cG9uZW50X2JpdHMgPSAtMTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICAgIHJldHVybiAoTlVMTCk7Ci0gICAgfQotCi0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmhpZ2gKLSAgICA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsIEVYUF9DSEFSUywKLQkJICAgICZnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlcikpCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgICAgcmV0dXJuIChOVUxMKTsKLSAgICB9Ci0gIGdlbl90b193b3JkcyAod29yZHMsIHByZWNpc2lvbiwgZXhwb25lbnRfYml0cyk7Ci0KLSAgLyogUmVzdG9yZSB0aGUgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIncyBzdG9yYWdlIGFsbG9jIChhbmQKLSAgICAgZXZlcnl0aGluZyBlbHNlKS4gICovCi0gIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gc2F2ZV9nZW5fZmxvbnVtOwotCi0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19Ci0KLS8qIFR1cm4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgaW50byBhIHJlYWwgZmxvYXQvZG91YmxlL2V4dGVuZGVkLiAgKi8KLWludAotZ2VuX3RvX3dvcmRzICh3b3JkcywgcHJlY2lzaW9uLCBleHBvbmVudF9iaXRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci0gICAgIGludCBwcmVjaXNpb247Ci0gICAgIGxvbmcgZXhwb25lbnRfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZSA9IDA7Ci0KLSAgbG9uZyBleHBvbmVudF8xOwotICBsb25nIGV4cG9uZW50XzI7Ci0gIGxvbmcgZXhwb25lbnRfMzsKLSAgbG9uZyBleHBvbmVudF80OwotICBpbnQgZXhwb25lbnRfc2tpcHBhZ2U7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmQxOwotICBMSVRUTEVOVU1fVFlQRSAqbHA7Ci0gIExJVFRMRU5VTV9UWVBFICp3b3Jkc19lbmQ7Ci0KLSAgd29yZHNfZW5kID0gd29yZHMgKyBwcmVjaXNpb247Ci0jaWZkZWYgVENfTTY4SwotICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OKQotICAgIC8qIE9uIHRoZSBtNjhrIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0IGhhcyBhIGdhcCBvZiAxNiBiaXRzCi0gICAgICAgYmV0d2VlbiB0aGUgZXhwb25lbnQgYW5kIHRoZSBtYW50aXNzYS4gICovCi0gICAgd29yZHNfZW5kKys7Ci0jZW5kaWYKLQotICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93ID4gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyKQotICAgIHsKLSAgICAgIC8qIDAuMGUwIHNlZW4uICovCi0gICAgICBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0Jd29yZHNbMF0gPSAweDAwMDA7Ci0gICAgICBlbHNlCi0Jd29yZHNbMF0gPSAweDgwMDA7Ci0gICAgICBtZW1zZXQgKCZ3b3Jkc1sxXSwgJ1wwJywKLQkgICAgICAod29yZHNfZW5kIC0gd29yZHMgLSAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0KLSAgLyogTmFOOiAgRG8gdGhlIHJpZ2h0IHRoaW5nICovCi0gIGlmIChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09IDApCi0gICAgewotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHhmZmZmOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzNdID0gMHhmZmZmOwotCSAgd29yZHNbNF0gPSAweGZmZmY7Ci0JICB3b3Jkc1s1XSA9IDB4ZmZmZjsKLSNlbHNlIC8qICEgVENfTTY4SyAqLwotI2lmZGVmIFRDX0kzODYKLQkgIHdvcmRzWzBdID0gMHhmZmZmOwotCSAgd29yZHNbMV0gPSAweGMwMDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX0kzODYgKi8KLQkgIGFib3J0ICgpOwotI2VuZGlmIC8qICEgVENfSTM4NiAqLwotI2VuZGlmIC8qICEgVENfTTY4SyAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2ZmZjsKLQkgIHdvcmRzWzFdID0gMHhmZmZmOwotCSAgd29yZHNbMl0gPSAweGZmZmY7Ci0JICB3b3Jkc1szXSA9IDB4ZmZmZjsKLQl9Ci0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZSBpZiAoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnUCcpCi0gICAgewotICAgICAgLyogK0lORjogIERvIHRoZSByaWdodCB0aGluZyAqLwotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4N2Y4MDsKLQkgIHdvcmRzWzFdID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0JewotI2lmZGVmIFRDX002OEsKLQkgIHdvcmRzWzBdID0gMHg3ZmZmOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotCSAgd29yZHNbNV0gPSAwOwotI2Vsc2UgLyogISBUQ19NNjhLICovCi0jaWZkZWYgVENfSTM4NgotCSAgd29yZHNbMF0gPSAweDdmZmY7Ci0JICB3b3Jkc1sxXSA9IDB4ODAwMDsKLQkgIHdvcmRzWzJdID0gMDsKLQkgIHdvcmRzWzNdID0gMDsKLQkgIHdvcmRzWzRdID0gMDsKLSNlbHNlIC8qICEgVENfSTM4NiAqLwotCSAgYWJvcnQgKCk7Ci0jZW5kaWYgLyogISBUQ19JMzg2ICovCi0jZW5kaWYgLyogISBUQ19NNjhLICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmRzWzBdID0gMHg3ZmYwOwotCSAgd29yZHNbMV0gPSAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCX0KLSAgICAgIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLnNpZ24gPT0gJ04nKQotICAgIHsKLSAgICAgIC8qIE5lZ2F0aXZlIElORiAqLwotICAgICAgaWYgKHByZWNpc2lvbiA9PSBGX1BSRUNJU0lPTikKLQl7Ci0JICB3b3Jkc1swXSA9IDB4ZmY4MDsKLQkgIHdvcmRzWzFdID0gMHgwOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQl7Ci0jaWZkZWYgVENfTTY4SwotCSAgd29yZHNbMF0gPSAweGZmZmY7Ci0JICB3b3Jkc1sxXSA9IDA7Ci0JICB3b3Jkc1syXSA9IDA7Ci0JICB3b3Jkc1szXSA9IDA7Ci0JICB3b3Jkc1s0XSA9IDA7Ci0JICB3b3Jkc1s1XSA9IDA7Ci0jZWxzZSAvKiAhIFRDX002OEsgKi8KLSNpZmRlZiBUQ19JMzg2Ci0JICB3b3Jkc1swXSA9IDB4ZmZmZjsKLQkgIHdvcmRzWzFdID0gMHg4MDAwOwotCSAgd29yZHNbMl0gPSAwOwotCSAgd29yZHNbM10gPSAwOwotCSAgd29yZHNbNF0gPSAwOwotI2Vsc2UgLyogISBUQ19JMzg2ICovCi0JICBhYm9ydCAoKTsKLSNlbmRpZiAvKiAhIFRDX0kzODYgKi8KLSNlbmRpZiAvKiAhIFRDX002OEsgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yZHNbMF0gPSAweGZmZjA7Ci0JICB3b3Jkc1sxXSA9IDB4MDsKLQkgIHdvcmRzWzJdID0gMHgwOwotCSAgd29yZHNbM10gPSAweDA7Ci0JfQotICAgICAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotICAgIH0KLSAgLyoKLSAgICogVGhlIGZsb2F0aW5nIHBvaW50IGZvcm1hdHMgd2Ugc3VwcG9ydCBoYXZlOgotICAgKiBCaXQgMTUgaXMgc2lnbiBiaXQuCi0gICAqIEJpdHMgMTQ6biBhcmUgZXhjZXNzLXdoYXRldmVyIGV4cG9uZW50LgotICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0gICAqIEJpdHMgMTU6MCBvZiB0aGUgbmV4dCB3b3JkKHMpIGFyZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdHMuCi0gICAqCi0gICAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotICAgKiBtYW50aXNzYS4KLSAgICovCi0gIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0gIGxpdHRsZW51bV9wb2ludGVyID0gZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyOwotICBsaXR0bGVudW1zX2xlZnQgPSAoMQotCQkgICAgICsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCi0JCSAgICAgLSBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sb3cpOwotICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0gIGZvciAoZXhwb25lbnRfc2tpcHBhZ2UgPSAwOyAhbmV4dF9iaXRzICgxKTsgKytleHBvbmVudF9za2lwcGFnZSk7OwotICBleHBvbmVudF8xID0gKGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmV4cG9uZW50Ci0JCSsgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubGVhZGVyCi0JCSsgMQotCQktIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyLmxvdyk7Ci0gIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbgotICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5sZWFkZXIuICovCi0gIGV4cG9uZW50XzIgPSBleHBvbmVudF8xICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotICAvKiBSYWRpeCAyLiAqLwotICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotICAvKiBGb3JnZXQgbGVhZGluZyB6ZXJvcywgZm9yZ2V0IDFzdCBiaXQuICovCi0gIGV4cG9uZW50XzQgPSBleHBvbmVudF8zICsgKCgxIDw8IChleHBvbmVudF9iaXRzIC0gMSkpIC0gMik7Ci0gIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotICBscCA9IHdvcmRzOwotCi0gIC8qIFdvcmQgMS4gU2lnbiwgZXhwb25lbnQgYW5kIHBlcmhhcHMgaGlnaCBiaXRzLiAqLwotICB3b3JkMSA9ICgoZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIuc2lnbiA9PSAnKycpCi0JICAgPyAwCi0JICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKLQotICAvKiBBc3N1bWUgMidzIGNvbXBsZW1lbnQgaW50ZWdlcnMuICovCi0gIGlmIChleHBvbmVudF80IDw9IDApCi0gICAgewotICAgICAgaW50IHByZWNfYml0czsKLSAgICAgIGludCBudW1fYml0czsKLQotICAgICAgdW5nZXRfYml0cyAoMSk7Ci0gICAgICBudW1fYml0cyA9IC1leHBvbmVudF80OwotICAgICAgcHJlY19iaXRzID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTICogcHJlY2lzaW9uIC0gKGV4cG9uZW50X2JpdHMgKyAxICsgbnVtX2JpdHMpOwotI2lmZGVmIFRDX0kzODYKLSAgICAgIGlmIChwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04gJiYgZXhwb25lbnRfYml0cyA9PSAxNSkKLQl7Ci0JICAvKiBPbiB0aGUgaTM4NiBhIGRlbm9ybWFsaXplZCBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQgaXMKLQkgICAgIHNoaWZ0ZWQgZG93biBieSBvbmUsIGVmZmVjdGl2ZWx5IGRlY3JlYXNpbmcgdGhlIGV4cG9uZW50Ci0JICAgICBiaWFzIGJ5IG9uZS4gICovCi0JICBwcmVjX2JpdHMgLT0gMTsKLQkgIG51bV9iaXRzICs9IDE7Ci0JfQotI2VuZGlmCi0KLSAgICAgIGlmIChudW1fYml0cyA+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSBleHBvbmVudF9iaXRzKQotCXsKLQkgIC8qIEJpZ2dlciB0aGFuIG9uZSBsaXR0bGVudW0gKi8KLQkgIG51bV9iaXRzIC09IChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIGV4cG9uZW50X2JpdHM7Ci0JICAqbHArKyA9IHdvcmQxOwotCSAgaWYgKG51bV9iaXRzICsgZXhwb25lbnRfYml0cyArIDEgPiBwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgIHsKLQkgICAgICAvKiBFeHBvbmVudCBvdmVyZmxvdyAqLwotCSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLQkgICAgICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci0JICAgIH0KLSNpZmRlZiBUQ19NNjhLCi0JICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JICAgICpscCsrID0gMDsKLSNlbmRpZgotCSAgd2hpbGUgKG51bV9iaXRzID49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgewotCSAgICAgIG51bV9iaXRzIC09IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgICAqbHArKyA9IDA7Ci0JICAgIH0KLQkgIGlmIChudW1fYml0cykKLQkgICAgKmxwKysgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIChudW1fYml0cykpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JICAgIHsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotI2lmZGVmIFRDX002OEsKLQkgICAgICAqbHArKyA9IDA7Ci0jZW5kaWYKLQkgICAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtX2JpdHMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB3b3JkMSB8PSBuZXh0X2JpdHMgKChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMgLSAxKSAtIChleHBvbmVudF9iaXRzICsgbnVtX2JpdHMpKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKGxwIDwgd29yZHNfZW5kKQotCSpscCsrID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCi0gICAgICAvKiBSb3VuZCB0aGUgbWFudGlzc2EgdXAsIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIG51bWJlciAqLwotICAgICAgaWYgKG5leHRfYml0cyAoMSkpCi0JewotCSAgLS1scDsKLQkgIGlmIChwcmVjX2JpdHMgPj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICB7Ci0JICAgICAgaW50IG4gPSAwOwotCSAgICAgIGludCB0bXBfYml0czsKLQotCSAgICAgIG4gPSAwOwotCSAgICAgIHRtcF9iaXRzID0gcHJlY19iaXRzOwotCSAgICAgIHdoaWxlICh0bXBfYml0cyA+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkJewotCQkgIGlmIChscFtuXSAhPSAoTElUVExFTlVNX1RZUEUpIC0gMSkKLQkJICAgIGJyZWFrOwotCQkgIC0tbjsKLQkJICB0bXBfYml0cyAtPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JCX0KLQkgICAgICBpZiAodG1wX2JpdHMgPiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJICB8fCAobHBbbl0gJiBtYXNrW3RtcF9iaXRzXSkgIT0gbWFza1t0bXBfYml0c10KLQkJICB8fCAocHJlY19iaXRzICE9IChwcmVjaXNpb24gKiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMKLQkJCQkgICAgLSBleHBvbmVudF9iaXRzIC0gMSkKLSNpZmRlZiBUQ19JMzg2Ci0JCSAgICAgIC8qIEFuIGV4dGVuZGVkIHByZWNpc2lvbiBmbG9hdCB3aXRoIG9ubHkgdGhlIGludGVnZXIKLQkJCSBiaXQgc2V0IHdvdWxkIGJlIGludmFsaWQuICBUaGF0IG11c3QgYmUgY29udmVydGVkCi0JCQkgdG8gdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KLQkJICAgICAgJiYgIShwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04KLQkJCSAgICYmIHByZWNfYml0cyA9PSAocHJlY2lzaW9uICogTElUVExFTlVNX05VTUJFUl9PRl9CSVRTCi0JCQkJCSAgICAtIGV4cG9uZW50X2JpdHMgLSAyKSkKLSNlbmRpZgotCQkgICAgICApKQotCQl7Ci0JCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotCQkgIGZvciAoY2FycnkgPSAxOyBjYXJyeSAmJiAobHAgPj0gd29yZHMpOyBscC0tKQotCQkgICAgewotCQkgICAgICBjYXJyeSA9ICpscCArIGNhcnJ5OwotCQkgICAgICAqbHAgPSBjYXJyeTsKLQkJICAgICAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFRoaXMgaXMgYW4gb3ZlcmZsb3cgb2YgdGhlIGRlbm9ybWFsIG51bWJlcnMuICBXZQotICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBmb3JnZXQgd2hhdCB3ZSBoYXZlIHByb2R1Y2VkLCBhbmQgaW5zdGVhZAotICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgdGhlIHNtYWxsZXN0IG5vcm1hbGl6ZWQgbnVtYmVyLiAgKi8KLQkJICBscCA9IHdvcmRzOwotCQkgIHdvcmQxID0gKChnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5zaWduID09ICcrJykKLQkJCSAgID8gMAotCQkJICAgOiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKTsKLQkJICB3b3JkMSB8PSAoMQotCQkJICAgIDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKLQkJCQktIGV4cG9uZW50X2JpdHMpKTsKLQkJICAqbHArKyA9IHdvcmQxOwotI2lmZGVmIFRDX0kzODYKLQkJICAvKiBTZXQgdGhlIGludGVnZXIgYml0IGluIHRoZSBleHRlbmRlZCBwcmVjaXNpb24gZm9ybWF0LgotCQkgICAgIFRoaXMgY2Fubm90IGhhcHBlbiBvbiB0aGUgbTY4ayB3aGVyZSB0aGUgbWFudGlzc2EKLQkJICAgICBqdXN0IG92ZXJmbG93cyBpbnRvIHRoZSBpbnRlZ2VyIGJpdCBhYm92ZS4gICovCi0JCSAgaWYgKHByZWNpc2lvbiA9PSBYX1BSRUNJU0lPTikKLQkJICAgICpscCsrID0gMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSk7Ci0jZW5kaWYKLQkJICB3aGlsZSAobHAgPCB3b3Jkc19lbmQpCi0JCSAgICAqbHArKyA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICAqbHAgKz0gMTsKLQl9Ci0KLSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0gICAgfQotICBlbHNlIGlmICgodW5zaWduZWQgbG9uZykgZXhwb25lbnRfNCA+PSBtYXNrW2V4cG9uZW50X2JpdHNdKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBFeHBvbmVudCBvdmVyZmxvdy4gTG9zZSBpbW1lZGlhdGVseS4KLSAgICAgICAqLwotCi0gICAgICAvKgotICAgICAgICogV2UgbGVhdmUgcmV0dXJuX3ZhbHVlIGFsb25lOiBhZG1pdCB3ZSByZWFkIHRoZQotICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0gICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotICAgICAgICovCi0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdvcmQxIHw9IChleHBvbmVudF80IDw8ICgoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkgLSBleHBvbmVudF9iaXRzKSkKLQl8IG5leHRfYml0cyAoKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpIC0gZXhwb25lbnRfYml0cyk7Ci0gICAgfQotCi0gICpscCsrID0gd29yZDE7Ci0KLSAgLyogWF9QUkVDSVNJT04gaXMgc3BlY2lhbDogb24gdGhlIDY4aywgaXQgaGFzIDE2IGJpdHMgb2YgemVybyBpbiB0aGUKLSAgICAgbWlkZGxlLiAgRWl0aGVyIHdheSwgaXQgaXMgdGhlbiBmb2xsb3dlZCBieSBhIDEgYml0LiAqLwotICBpZiAoZXhwb25lbnRfYml0cyA9PSAxNSAmJiBwcmVjaXNpb24gPT0gWF9QUkVDSVNJT04pCi0gICAgewotI2lmZGVmIFRDX002OEsKLSAgICAgICpscCsrID0gMDsKLSNlbmRpZgotICAgICAgKmxwKysgPSAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkKLQkgICAgICAgfCBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIDEpKTsKLSAgICB9Ci0KLSAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0gIHdoaWxlIChscCA8IHdvcmRzX2VuZCkKLSAgICAqbHArKyA9IG5leHRfYml0cyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKTsKLQotICBpZiAobmV4dF9iaXRzICgxKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotICAgICAgLyoKLSAgICAgICAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLSAgICAgICAqIFRoZSBjdW5uaW5nIGRlc2lnbiBvZiB0aGVzZSBoaWRkZW4tMSBmbG9hdHMgcGVybWl0cwotICAgICAgICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0gICAgICAgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotICAgICAgICogaGlnaGVzdC1vcmRlciBiaXQgb2YgdGhlIGxvd2VzdC1vcmRlciB3b3JkIGZsaXBzLgotICAgICAgICogSXMgdGhhdCBjbGVhcj8KLSAgICAgICAqLwotCi0gICAgICAvKiAjaWYgKHNpemVvZihjYXJyeSkpIDwgKChzaXplb2YoYml0c1swXSkgKiBCSVRTX1BFUl9DSEFSKSArIDIpCi0JIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JIFdlIG5lZWQgdGhhdCBleHRyYSBiaXQgdG8gaG9sZCBhIGNhcnJ5IGR1cmluZyBhIExJVFRMRU5VTSBjYXJyeQotCSBwcm9wYWdhdGlvbi4gQW5vdGhlciBleHRyYSBiaXQgKGtlcHQgMCkgd2lsbCBhc3N1cmUgdXMgdGhhdCB3ZQotCSBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JIHBlcm1pdHMgdXMgdG8gcHJvcGFnYXRlIHRoZSBjYXJyeSB3aXRob3V0IGFueSBtYXNraW5nIG9mIGJpdHMuCi0JICNlbmRpZiAqLwotICAgICAgZm9yIChjYXJyeSA9IDEsIGxwLS07IGNhcnJ5ICYmIChscCA+PSB3b3Jkcyk7IGxwLS0pCi0JewotCSAgY2FycnkgPSAqbHAgKyBjYXJyeTsKLQkgICpscCA9IGNhcnJ5OwotCSAgY2FycnkgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQl9Ci0gICAgICBpZiAocHJlY2lzaW9uID09IFhfUFJFQ0lTSU9OICYmIGV4cG9uZW50X2JpdHMgPT0gMTUpCi0JewotCSAgLyogRXh0ZW5kZWQgcHJlY2lzaW9uIG51bWJlcnMgaGF2ZSBhbiBleHBsaWNpdCBpbnRlZ2VyIGJpdAotCSAgICAgdGhhdCB3ZSBtYXkgaGF2ZSB0byByZXN0b3JlLiAgKi8KLQkgIGlmIChscCA9PSB3b3JkcykKLQkgICAgewotI2lmZGVmIFRDX002OEsKLQkgICAgICAvKiBPbiB0aGUgbTY4ayB0aGVyZSBpcyBhIGdhcCBvZiAxNiBiaXRzLiAgV2UgbXVzdAotCQkgZXhwbGljaXRseSBwcm9wYWdhdGUgdGhlIGNhcnJ5IGludG8gdGhlIGV4cG9uZW50LiAqLwotCSAgICAgIHdvcmRzWzBdICs9IHdvcmRzWzFdOwotCSAgICAgIHdvcmRzWzFdID0gMDsKLQkgICAgICBscCsrOwotI2VuZGlmCi0JICAgICAgLyogUHV0IGJhY2sgdGhlIGludGVnZXIgYml0LiAgKi8gCi0JICAgICAgbHBbMV0gfD0gMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSk7Ci0JICAgIH0KLSAJfQotICAgICAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCXsKLQkgIC8qIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkgICAqIG51bWJlciwgYnV0IHJldHVybiBhIGZsb2F0aW5nIGV4Y2VwdGlvbgotCSAgICogYmVjYXVzZSB3ZSBjYW4ndCBlbmNvZGUgdGhlIG51bWJlci4KLQkgICAqLwotCSAgKndvcmRzICY9IH4oMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpOwotCSAgLyogbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOyAqLwotCSAgLyogcmV0dXJuIHJldHVybl92YWx1ZTsgKi8KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19Ci0KLSNpZiAwIC8qIHVudXNlZCAqLwotLyogVGhpcyByb3V0aW5lIGlzIGEgcmVhbCBrbHVkZ2UuICBTb21lb25lIHJlYWxseSBzaG91bGQgZG8gaXQgYmV0dGVyLAotICAgYnV0IEknbSB0b28gbGF6eSwgYW5kIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIHN0dWZmIGFsbCB0b28gd2VsbAotICAgYW55d2F5LiAoSkYpICAqLwotc3RhdGljIHZvaWQKLWludF90b19nZW4gKHgpCi0gICAgIGxvbmcgeDsKLXsKLSAgY2hhciBidWZbMjBdOwotICBjaGFyICpidWZwOwotCi0gIHNwcmludGYgKGJ1ZiwgIiVsZCIsIHgpOwotICBidWZwID0gJmJ1ZlswXTsKLSAgaWYgKGF0b2ZfZ2VuZXJpYyAoJmJ1ZnAsICIuIiwgRVhQX0NIQVJTLCAmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpKQotICAgIGFzX2JhZCAoXygiRXJyb3IgY29udmVydGluZyBudW1iZXIgdG8gZmxvYXRpbmcgcG9pbnQgKEV4cG9uZW50IG92ZXJmbG93PykiKSk7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIFRFU1QKLWNoYXIgKgotcHJpbnRfZ2VuIChnZW4pCi0gICAgIEZMT05VTV9UWVBFICpnZW47Ci17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGFyclsxMF07Ci0gIGRvdWJsZSBkdjsKLSAgZmxvYXQgZnY7Ci0gIHN0YXRpYyBjaGFyIHNidWZbNDBdOwotCi0gIGlmIChnZW4pCi0gICAgewotICAgICAgZiA9IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotICAgICAgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIgPSAqZ2VuOwotICAgIH0KLSAgZ2VuX3RvX3dvcmRzICgmYXJyWzBdLCA0LCAxMSk7Ci0gIG1lbWNweSAoJmR2LCAmYXJyWzBdLCBzaXplb2YgKGRvdWJsZSkpOwotICBzcHJpbnRmIChzYnVmLCAiJXggJXggJXggJXggJS4xNEcgICAiLCBhcnJbMF0sIGFyclsxXSwgYXJyWzJdLCBhcnJbM10sIGR2KTsKLSAgZ2VuX3RvX3dvcmRzICgmYXJyWzBdLCAyLCA4KTsKLSAgbWVtY3B5ICgmZnYsICZhcnJbMF0sIHNpemVvZiAoZmxvYXQpKTsKLSAgc3ByaW50ZiAoc2J1ZiArIHN0cmxlbiAoc2J1ZiksICIleCAleCAlLjEyZ1xuIiwgYXJyWzBdLCBhcnJbMV0sIGZ2KTsKLQotICBpZiAoZ2VuKQotICAgIHsKLSAgICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0gZjsKLSAgICB9Ci0KLSAgcmV0dXJuIChzYnVmKTsKLX0KLQotI2VuZGlmCi0KLS8qIGVuZCBvZiBhdG9mLWllZWUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLXRhaG9lLmMgYi9nYXMvY29uZmlnL2F0b2YtdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYwNDg1Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2F0b2YtdGFob2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0KLS8qIGF0b2ZfdGFob2UuYyAtIHR1cm4gYSBzdHJpbmcgaW50byBhIFRhaG9lIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgKi8KLQotLyogVGhpcyBpcyByZWFsbHkgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgYXRvZl92YXguYy4gSSBnbG9tbWVkIGl0IHdob2xlc2FsZQotICAgYW5kIHRoZW4gc2hhdmVkIGl0IGRvd24uIEkgZG9uJ3QgZXZlbiBrbm93IGhvdyBpdCB3b3Jrcy4gKERvbid0IHlvdSBmaW5kCi0gICBteSBob25lc3R5IHJlZnJlc2hpbmc/ICBib3dlbkBjcy5CdWZmYWxvLkVEVSAoRGV2b24gRSBCb3dlbikKLQotICAgSSBkb24ndCBhbGxvdyB1cHBlcmNhc2UgbGV0dGVycyBpbiB0aGUgcHJlY2lzaW9uIGRlc2NycGl0b3JzLiBJZSAnZicgYW5kCi0gICAnZCcgYXJlIGFsbG93ZWQgYnV0ICdGJyBhbmQgJ0QnIGFyZW4ndCAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotLyogUHJlY2lzaW9uIGluIExpdHRsZU51bXMuICovCi0jZGVmaW5lIE1BWF9QUkVDSVNJT04gKDQpCi0jZGVmaW5lIERfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBGX1BSRUNJU0lPTiAoMikKLQotLyogUHJlY2lzaW9uIGluIGNoYXJzLiAqLwotI2RlZmluZSBEX1BSRUNJU0lPTl9DSEFSUyAoOCkKLSNkZWZpbmUgRl9QUkVDSVNJT05fQ0hBUlMgKDQpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1zdGF0aWMgY29uc3QgbG9uZyBpbnQgbWFza1tdID0KLXsKLSAgMHgwMDAwMDAwMCwKLSAgMHgwMDAwMDAwMSwKLSAgMHgwMDAwMDAwMywKLSAgMHgwMDAwMDAwNywKLSAgMHgwMDAwMDAwZiwKLSAgMHgwMDAwMDAxZiwKLSAgMHgwMDAwMDAzZiwKLSAgMHgwMDAwMDA3ZiwKLSAgMHgwMDAwMDBmZiwKLSAgMHgwMDAwMDFmZiwKLSAgMHgwMDAwMDNmZiwKLSAgMHgwMDAwMDdmZiwKLSAgMHgwMDAwMGZmZiwKLSAgMHgwMDAwMWZmZiwKLSAgMHgwMDAwM2ZmZiwKLSAgMHgwMDAwN2ZmZiwKLSAgMHgwMDAwZmZmZiwKLSAgMHgwMDAxZmZmZiwKLSAgMHgwMDAzZmZmZiwKLSAgMHgwMDA3ZmZmZiwKLSAgMHgwMDBmZmZmZiwKLSAgMHgwMDFmZmZmZiwKLSAgMHgwMDNmZmZmZiwKLSAgMHgwMDdmZmZmZiwKLSAgMHgwMGZmZmZmZiwKLSAgMHgwMWZmZmZmZiwKLSAgMHgwM2ZmZmZmZiwKLSAgMHgwN2ZmZmZmZiwKLSAgMHgwZmZmZmZmZiwKLSAgMHgxZmZmZmZmZiwKLSAgMHgzZmZmZmZmZiwKLSAgMHg3ZmZmZmZmZiwKLSAgMHhmZmZmZmZmZgotfTsKLQwKLQotLyogU2hhcmVkIGJldHdlZW4gZmxvbnVtX2dlbjJ0YWhvZSBhbmQgbmV4dF9iaXRzICovCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOwotCi0jaWYgX19TVERDX18gPT0gMQotCi1pbnQgZmxvbnVtX2dlbjJ0YWhvZSAoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwgTElUVExFTlVNX1RZUEUgKiB3b3Jkcyk7Ci0KLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotCi1pbnQgZmxvbnVtX2dlbjJ0YWhvZSAoKTsKLQotI2VuZGlmIC8qIG5vdCBfX1NURENfXyAqLwotCi0KLXN0YXRpYyBpbnQKLW5leHRfYml0cyAobnVtYmVyX29mX2JpdHMpCi0gICAgIGludCBudW1iZXJfb2ZfYml0czsKLXsKLSAgaW50IHJldHVybl92YWx1ZTsKLQotICBpZiAobGl0dGxlbnVtX3BvaW50ZXIgPCBsaXR0bGVudW1fZW5kKQotICAgIHJldHVybiAwOwotICBpZiAobnVtYmVyX29mX2JpdHMgPj0gYml0c19sZWZ0X2luX2xpdHRsZW51bSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW2JpdHNfbGVmdF9pbl9saXR0bGVudW1dICYgKmxpdHRsZW51bV9wb2ludGVyOwotICAgICAgbnVtYmVyX29mX2JpdHMgLT0gYml0c19sZWZ0X2luX2xpdHRsZW51bTsKLSAgICAgIHJldHVybl92YWx1ZSA8PD0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICBsaXR0bGVudW1fcG9pbnRlci0tOwotICAgICAgaWYgKGxpdHRsZW51bV9wb2ludGVyID49IGxpdHRsZW51bV9lbmQpCi0JcmV0dXJuX3ZhbHVlIHw9ICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiAoYml0c19sZWZ0X2luX2xpdHRsZW51bSkpICYKLQkgIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmCi0JKCgqbGl0dGxlbnVtX3BvaW50ZXIpID4+IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pOwotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpCi0gICAgIExJVFRMRU5VTV9UWVBFICp3b3JkczsKLXsKLSAgKndvcmRzID0gMHg4MDAwOwkJLyogRmxvYXRpbmcgUmVzZXJ2ZWQgT3BlcmFuZCBDb2RlICovCi19Ci0MCi1zdGF0aWMgaW50CQkJLyogMCBtZWFucyBsZXR0ZXIgaXMgT0suICovCi13aGF0X2tpbmRfb2ZfZmxvYXQgKGxldHRlciwgcHJlY2lzaW9uUCwgZXhwb25lbnRfYml0c1ApCi0gICAgIGNoYXIgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KLSAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCi0gICAgIGxvbmcgaW50ICpleHBvbmVudF9iaXRzUDsJLyogTnVtYmVyIG9mIGV4cG9uZW50IGJpdHMuICovCi17Ci0gIGludCByZXR2YWw7CQkJLyogMDogT0suICovCi0KLSAgcmV0dmFsID0gMDsKLSAgc3dpdGNoIChsZXR0ZXIpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgKnByZWNpc2lvblAgPSBGX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgKnByZWNpc2lvblAgPSBEX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR2YWwgPSA2OTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChyZXR2YWwpOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotKgkJCQkJCQkJCSoKLSoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgotKgl3aGF0IHRoZSBWQVggdGhpbmtzIGluLiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZpZ3VyZQkqCi0qCW91dCBhbnkgYWxpZ25tZW50IHByb2JsZW1zIGFuZCB0byBjb25zcGlyZSBmb3IgdGhlIGJ5dGVzL3dvcmQJKgotKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCi0qCQkJCQkJCQkJKgotXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotYXRvZl90YWhvZSAoc3RyLCB3aGF0X2tpbmQsIHdvcmRzKQotICAgICBjaGFyICpzdHI7CQkJLyogVGV4dCB0byBjb252ZXJ0IHRvIGJpbmFyeS4gKi8KLSAgICAgY2hhciB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KLSAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCi0gIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgbG9uZyBpbnQgZXhwb25lbnRfYml0czsKLQotICByZXR1cm5fdmFsdWUgPSBzdHI7Ci0gIGYubG93ID0gYml0cyArIE1BWF9QUkVDSVNJT047Ci0gIGYuaGlnaCA9IE5VTEw7Ci0gIGYubGVhZGVyID0gTlVMTDsKLSAgZi5leHBvbmVudCA9IE5VTEw7Ci0gIGYuc2lnbiA9ICdcMCc7Ci0KLSAgaWYgKHdoYXRfa2luZF9vZl9mbG9hdCAod2hhdF9raW5kLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cykpCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogV2UgbG9zdC4gKi8KLSAgICAgIG1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKTsKLSAgICB9Ci0gIGlmIChyZXR1cm5fdmFsdWUpCi0gICAgewotICAgICAgbWVtc2V0IChiaXRzLCAnXDAnLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSAqIE1BWF9QUkVDSVNJT04pOwotCi0gICAgICAvKiBVc2UgbW9yZSBMaXR0bGVOdW1zIHRoYW4gc2VlbXMgKi8KLSAgICAgIC8qIG5lY2Vzc2FyeTogdGhlIGhpZ2hlc3QgZmxvbnVtIG1heSBoYXZlICovCi0gICAgICAvKiAxNSBsZWFkaW5nIDAgYml0cywgc28gY291bGQgYmUgdXNlbGVzcy4gKi8KLSAgICAgIGYuaGlnaCA9IGYubG93ICsgcHJlY2lzaW9uIC0gMSArIEdVQVJEOwotCi0gICAgICBpZiAoYXRvZl9nZW5lcmljICgmcmV0dXJuX3ZhbHVlLCAiLiIsICJlRSIsICZmKSkKLQl7Ci0JICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiB3ZSBsb3N0ICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmbG9udW1fZ2VuMnRhaG9lICh3aGF0X2tpbmQsICZmLCB3b3JkcykpCi0JICAgIHsKLQkgICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIChyZXR1cm5fdmFsdWUpOwotfQotDAotLyoKLSAqIEluOiBhIGZsb251bSwgYSBUYWhvZSBmbG9hdGluZyBwb2ludCBmb3JtYXQuCi0gKiBPdXQ6IGEgVGFob2UgZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCi0gKi8KLQotaW50CQkJCS8qIDA6IE9LLiAqLwotZmxvbnVtX2dlbjJ0YWhvZSAoZm9ybWF0X2xldHRlciwgZiwgd29yZHMpCi0gICAgIGNoYXIgZm9ybWF0X2xldHRlcjsJLyogT25lIG9mICdkJyAnZicuICovCi0gICAgIEZMT05VTV9UWVBFICpmOwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCi17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBpbnQgZXhwb25lbnRfYml0czsKLSAgaW50IHJldHVybl92YWx1ZTsJCS8qIDAgPT0gT0suICovCi0KLSAgcmV0dXJuX3ZhbHVlID0gd2hhdF9raW5kX29mX2Zsb2F0IChmb3JtYXRfbGV0dGVyLCAmcHJlY2lzaW9uLCAmZXhwb25lbnRfYml0cyk7Ci0gIGlmIChyZXR1cm5fdmFsdWUgIT0gMCkKLSAgICB7Ci0gICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGYtPmxvdyA+IGYtPmxlYWRlcikKLQl7Ci0JICAvKiAwLjBlMCBzZWVuLiAqLwotCSAgbWVtc2V0ICh3b3JkcywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBwcmVjaXNpb24pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIGludCBleHBvbmVudF8xOwotCSAgbG9uZyBpbnQgZXhwb25lbnRfMjsKLQkgIGxvbmcgaW50IGV4cG9uZW50XzM7Ci0JICBsb25nIGludCBleHBvbmVudF80OwotCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotCSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0KLQkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLwotCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQotCSAgICB7Ci0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBBbGwgdGFob2UgZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyBoYXZlOgotCSAgICogQml0IDE1IGlzIHNpZ24gYml0LgotCSAgICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0JICAgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0JICAgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotCSAgICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCi0JICAgKgotCSAgICogU28gd2UgbmVlZDogbnVtYmVyIG9mIGJpdHMgb2YgZXhwb25lbnQsIG51bWJlciBvZiBiaXRzIG9mCi0JICAgKiBtYW50aXNzYS4KLQkgICAqLwotCi0JICBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtID0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCSAgbGl0dGxlbnVtX3BvaW50ZXIgPSBmLT5sZWFkZXI7Ci0JICBsaXR0bGVudW1fZW5kID0gZi0+bG93OwotCSAgLyogU2VlayAoYW5kIGZvcmdldCkgMXN0IHNpZ25pZmljYW50IGJpdCAqLwotCSAgZm9yIChleHBvbmVudF9za2lwcGFnZSA9IDA7Ci0JICAgICAgICFuZXh0X2JpdHMgKDEpOwotCSAgICAgICBleHBvbmVudF9za2lwcGFnZSsrKQotCSAgICB7Ci0JICAgIH0KLQkgIGV4cG9uZW50XzEgPSBmLT5leHBvbmVudCArIGYtPmxlYWRlciArIDEgLSBmLT5sb3c7Ci0JICAvKiBSYWRpeCBMSVRUTEVOVU1fUkFESVgsIHBvaW50IGp1c3QgaGlnaGVyIHRoYW4gZiAtPiBsZWFkZXIuICovCi0JICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIC8qIFJhZGl4IDIuICovCi0JICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKLQkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0JICAgICAgICovCi0KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0KLQkgICAgICAvKgotCSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkgICAgICAgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkgICAgICAgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCSAgICAgICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBscCA9IHdvcmRzOwotCi0JICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0JICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotCSAgICAgIHdvcmQxID0gKChleHBvbmVudF80ICYgbWFza1tleHBvbmVudF9iaXRzXSkgPDwgKDE1IC0gZXhwb25lbnRfYml0cykpCi0JCXwgKChmLT5zaWduID09ICcrJykgPyAwIDogMHg4MDAwKQotCQl8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKTsKLQkgICAgICAqbHArKyA9IHdvcmQxOwotCi0JICAgICAgLyogVGhlIHJlc3Qgb2YgdGhlIHdvcmRzIGFyZSBqdXN0IG1hbnRpc3NhIGJpdHMuICovCi0JICAgICAgZm9yICg7IGxwIDwgd29yZHMgKyBwcmVjaXNpb247IGxwKyspCi0JCXsKLQkJICAqbHAgPSBuZXh0X2JpdHMgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0JCX0KLQotCSAgICAgIGlmIChuZXh0X2JpdHMgKDEpKQotCQl7Ci0JCSAgLyoKLQkJICAgKiBTaW5jZSB0aGUgTkVYVCBiaXQgaXMgYSAxLCByb3VuZCBVUCB0aGUgbWFudGlzc2EuCi0JCSAgICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0JCSAgICogdXMgdG8gbGV0IHRoZSBtYW50aXNzYSBvdmVyZmxvdyBpbnRvIHRoZSBleHBvbmVudCwgYW5kCi0JCSAgICogaXQgJ2RvZXMgdGhlIHJpZ2h0IHRoaW5nJy4gSG93ZXZlciwgd2UgbG9zZSBpZiB0aGUKLQkJICAgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0JCSAgICogSXMgdGhhdCBjbGVhcj8KLQkJICAgKi8KLQotCQkgIHVuc2lnbmVkIGxvbmcgaW50IGNhcnJ5OwotCi0JCSAgLyoKLQkJICAgICNpZiAoc2l6ZW9mKGNhcnJ5KSkgPCAoKHNpemVvZihiaXRzWzBdKSAqIEJJVFNfUEVSX0NIQVIpICsgMikKLQkJICAgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JCSAgICBXZSBuZWVkIHRoYXQgZXh0cmEgYml0IHRvIGhvbGQgYSBjYXJyeSBkdXJpbmcgYSBMSVRUTEVOVU0gY2FycnkKLQkJICAgIHByb3BhZ2F0aW9uLiBBbm90aGVyIGV4dHJhIGJpdCAoa2VwdCAwKSB3aWxsIGFzc3VyZSB1cyB0aGF0IHdlCi0JCSAgICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JCSAgICBwZXJtaXRzIHVzIHRvIHByb3BhZ2F0ZSB0aGUgY2Fycnkgd2l0aG91dCBhbnkgbWFza2luZyBvZiBiaXRzLgotCQkgICAgI2VuZGlmCi0JCSAgICAqLwotCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOwotCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKLQkJICAgICAgIGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCi0JCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCQkgICAgewotCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJICAgICAgICogbnVtYmVyLCBidXQgcmV0dXJuIGEgZmxvYXRpbmcgZXhjZXB0aW9uCi0JCSAgICAgICAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCSAgICAgICAqLwotCQkgICAgfQotCQl9CQkvKiBpZiAod2UgbmVlZGVkIHRvIHJvdW5kIHVwKSAqLwotCSAgICB9CQkJLyogaWYgKGV4cG9uZW50IG92ZXJmbG93KSAqLwotCX0JCQkvKiBpZiAoMC4wZTApICovCi0gICAgfQkJCQkvKiBpZiAoZmxvYXRfdHlwZSB3YXMgT0spICovCi0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQwKLS8qCi0gKgkJbWRfYXRvZigpCi0gKgotICogSW46CWlucHV0X2xpbmVfcG9pbnRlciAtPiB0aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50Ci0gKgkJbnVtYmVyLgotICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQotICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlciAtPiBvZiBuZXh0IGNoYXIgYWZ0ZXIgZmxvYXRpbmcgbnVtYmVyLgotICoJRXJyb3IgbWVzc2FnZSwgb3IgMC4KLSAqCUZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKglOdW1iZXIgb2YgY2hhcnMgd2UgdXNlZCBmb3IgdGhlIGxpdGVyYWwuCi0gKi8KLQotY2hhciAqCi1tZF9hdG9mICh3aGF0X3N0YXRlbWVudF90eXBlLCBsaXRlcmFsUCwgc2l6ZVApCi0gICAgIGNoYXIgd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgY2hhciAqbGl0ZXJhbFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9QUkVDSVNJT05dOwotICByZWdpc3RlciBjaGFyIGtpbmRfb2ZfZmxvYXQ7Ci0gIHJlZ2lzdGVyIGludCBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fcG9pbnRlcjsKLQotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KLSAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfTsKLQotICBpZiAoa2luZF9vZl9mbG9hdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGltaXQ7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGF0b2ZfdGFob2UgKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCQkgICAgICAga2luZF9vZl9mbG9hdCwKLQkJCQkgICAgICAgd29yZHMpOwotICAgICAgLyoKLSAgICAgICAqIFRoZSBhdG9mX3RhaG9lKCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgotICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KLSAgICAgICAqIGEgZGlmZmVyZW50LWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKLSAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCi0gICAgICAgKi8KLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IChraW5kX29mX2Zsb2F0ID09ICdmJyA/IEZfUFJFQ0lTSU9OX0NIQVJTIDoKLQkJCSAoa2luZF9vZl9mbG9hdCA9PSAnZCcgPyBEX1BSRUNJU0lPTl9DSEFSUyA6IDApKTsKLSAgICAgIGtub3cgKG51bWJlcl9vZl9jaGFycyA8PSBNQVhfUFJFQ0lTSU9OICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGltaXQgPSB3b3JkcyArIChudW1iZXJfb2ZfY2hhcnMgLyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBmb3IgKGxpdHRsZW51bV9wb2ludGVyID0gd29yZHM7Ci0JICAgbGl0dGxlbnVtX3BvaW50ZXIgPCBsaW1pdDsKLQkgICBsaXR0bGVudW1fcG9pbnRlcisrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1fcG9pbnRlciwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdGVyYWxQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnVtYmVyX29mX2NoYXJzID0gMDsKLSAgICB9OwotCi0gICpzaXplUCA9IG51bWJlcl9vZl9jaGFyczsKLSAgcmV0dXJuIGtpbmRfb2ZfZmxvYXQgPyAwIDogXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci19Ci0KLS8qIGF0b2ZfdGFob2UuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9hdG9mLXZheC5jIGIvZ2FzL2NvbmZpZy9hdG9mLXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWI5MGE4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvYXRvZi12YXguYworKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vKiBhdG9mX3ZheC5jIC0gdHVybiBhIEZsb251bSBpbnRvIGEgVkFYIGZsb2F0aW5nIHBvaW50IG51bWJlcgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyLCA5MywgOTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi1zdGF0aWMgaW50IGF0b2ZfdmF4X3NpemVvZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgbmV4dF9iaXRzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciBQQVJBTVMgKChMSVRUTEVOVU1fVFlQRSAqKSk7Ci1zdGF0aWMgaW50IHdoYXRfa2luZF9vZl9mbG9hdCBQQVJBTVMgKChpbnQsIGludCAqLCBsb25nICopKTsKLXN0YXRpYyBjaGFyICphdG9mX3ZheCBQQVJBTVMgKChjaGFyICosIGludCwgTElUVExFTlVNX1RZUEUgKikpOwotCi0vKiBQcmVjaXNpb24gaW4gTGl0dGxlTnVtcy4gKi8KLSNkZWZpbmUgTUFYX1BSRUNJU0lPTiAoOCkKLSNkZWZpbmUgSF9QUkVDSVNJT04gKDgpCi0jZGVmaW5lIEdfUFJFQ0lTSU9OICg0KQotI2RlZmluZSBEX1BSRUNJU0lPTiAoNCkKLSNkZWZpbmUgRl9QUkVDSVNJT04gKDIpCi0KLS8qIExlbmd0aCBpbiBMaXR0bGVOdW1zIG9mIGd1YXJkIGJpdHMuICovCi0jZGVmaW5lIEdVQVJEICgyKQotCi1pbnQgZmxvbnVtX2dlbjJ2YXggUEFSQU1TICgoaW50IGZvcm1hdF9sZXR0ZXIsIEZMT05VTV9UWVBFICogZiwKLQkJCSAgICBMSVRUTEVOVU1fVFlQRSAqIHdvcmRzKSk7Ci0KLS8qIE51bWJlciBvZiBjaGFycyBpbiBmbG9udW0gdHlwZSAnbGV0dGVyJy4gKi8KLXN0YXRpYyBpbnQKLWF0b2ZfdmF4X3NpemVvZiAobGV0dGVyKQotICAgICBpbnQgbGV0dGVyOwotewotICBpbnQgcmV0dXJuX3ZhbHVlOwotCi0gIC8qCi0gICAqIFBlcm1pdHRpbmcgdXBwZXJjYXNlIGxldHRlcnMgaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4KLSAgICogUGxlYXNlIHVzZSBvbmx5IGxvd2VyLWNhc2VkIGxldHRlcnMgaW4gY2FzZSB0aGUgdXBwZXItY2FzZWQKLSAgICogb25lcyBiZWNvbWUgdW5zdXBwb3J0ZWQhCi0gICAqLwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICByZXR1cm5fdmFsdWUgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdnJzoKLSAgICBjYXNlICdHJzoKLSAgICAgIHJldHVybl92YWx1ZSA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgIGNhc2UgJ0gnOgotICAgICAgcmV0dXJuX3ZhbHVlID0gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm5fdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGF0b2ZfdmF4X3NpemVvZiAqLwotCi1zdGF0aWMgY29uc3QgbG9uZyBtYXNrW10gPQotewotICAweDAwMDAwMDAwLAotICAweDAwMDAwMDAxLAotICAweDAwMDAwMDAzLAotICAweDAwMDAwMDA3LAotICAweDAwMDAwMDBmLAotICAweDAwMDAwMDFmLAotICAweDAwMDAwMDNmLAotICAweDAwMDAwMDdmLAotICAweDAwMDAwMGZmLAotICAweDAwMDAwMWZmLAotICAweDAwMDAwM2ZmLAotICAweDAwMDAwN2ZmLAotICAweDAwMDAwZmZmLAotICAweDAwMDAxZmZmLAotICAweDAwMDAzZmZmLAotICAweDAwMDA3ZmZmLAotICAweDAwMDBmZmZmLAotICAweDAwMDFmZmZmLAotICAweDAwMDNmZmZmLAotICAweDAwMDdmZmZmLAotICAweDAwMGZmZmZmLAotICAweDAwMWZmZmZmLAotICAweDAwM2ZmZmZmLAotICAweDAwN2ZmZmZmLAotICAweDAwZmZmZmZmLAotICAweDAxZmZmZmZmLAotICAweDAzZmZmZmZmLAotICAweDA3ZmZmZmZmLAotICAweDBmZmZmZmZmLAotICAweDFmZmZmZmZmLAotICAweDNmZmZmZmZmLAotICAweDdmZmZmZmZmLAotICAweGZmZmZmZmZmCi19OwotDAotCi0vKiBTaGFyZWQgYmV0d2VlbiBmbG9udW1fZ2VuMnZheCBhbmQgbmV4dF9iaXRzICovCi1zdGF0aWMgaW50IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci1zdGF0aWMgTElUVExFTlVNX1RZUEUgKmxpdHRsZW51bV9wb2ludGVyOwotc3RhdGljIExJVFRMRU5VTV9UWVBFICpsaXR0bGVudW1fZW5kOwotCi1zdGF0aWMgaW50Ci1uZXh0X2JpdHMgKG51bWJlcl9vZl9iaXRzKQotICAgICBpbnQgbnVtYmVyX29mX2JpdHM7Ci17Ci0gIGludCByZXR1cm5fdmFsdWU7Ci0KLSAgaWYgKGxpdHRsZW51bV9wb2ludGVyIDwgbGl0dGxlbnVtX2VuZCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKG51bWJlcl9vZl9iaXRzID49IGJpdHNfbGVmdF9pbl9saXR0bGVudW0pCi0gICAgewotICAgICAgcmV0dXJuX3ZhbHVlID0gbWFza1tiaXRzX2xlZnRfaW5fbGl0dGxlbnVtXSAmICpsaXR0bGVudW1fcG9pbnRlcjsKLSAgICAgIG51bWJlcl9vZl9iaXRzIC09IGJpdHNfbGVmdF9pbl9saXR0bGVudW07Ci0gICAgICByZXR1cm5fdmFsdWUgPDw9IG51bWJlcl9vZl9iaXRzOwotICAgICAgYml0c19sZWZ0X2luX2xpdHRsZW51bSA9IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyAtIG51bWJlcl9vZl9iaXRzOwotICAgICAgbGl0dGxlbnVtX3BvaW50ZXItLTsKLSAgICAgIGlmIChsaXR0bGVudW1fcG9pbnRlciA+PSBsaXR0bGVudW1fZW5kKQotCXJldHVybl92YWx1ZSB8PSAoKCpsaXR0bGVudW1fcG9pbnRlcikgPj4gKGJpdHNfbGVmdF9pbl9saXR0bGVudW0pKSAmIG1hc2tbbnVtYmVyX29mX2JpdHNdOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gLT0gbnVtYmVyX29mX2JpdHM7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBtYXNrW251bWJlcl9vZl9iaXRzXSAmICgoKmxpdHRsZW51bV9wb2ludGVyKSA+PiBiaXRzX2xlZnRfaW5fbGl0dGxlbnVtKTsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQKLW1ha2VfaW52YWxpZF9mbG9hdGluZ19wb2ludF9udW1iZXIgKHdvcmRzKQotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7Ci17Ci0gICp3b3JkcyA9IDB4ODAwMDsJCS8qIEZsb2F0aW5nIFJlc2VydmVkIE9wZXJhbmQgQ29kZSAqLwotfQotDAotc3RhdGljIGludAkJCS8qIDAgbWVhbnMgbGV0dGVyIGlzIE9LLiAqLwotd2hhdF9raW5kX29mX2Zsb2F0IChsZXR0ZXIsIHByZWNpc2lvblAsIGV4cG9uZW50X2JpdHNQKQotICAgICBpbnQgbGV0dGVyOwkJLyogSW46IGxvd2VyY2FzZSBwbGVhc2UuIFdoYXQga2luZCBvZiBmbG9hdD8gKi8KLSAgICAgaW50ICpwcmVjaXNpb25QOwkJLyogTnVtYmVyIG9mIDE2LWJpdCB3b3JkcyBpbiB0aGUgZmxvYXQuICovCi0gICAgIGxvbmcgKmV4cG9uZW50X2JpdHNQOwkvKiBOdW1iZXIgb2YgZXhwb25lbnQgYml0cy4gKi8KLXsKLSAgaW50IHJldHZhbDsJCQkvKiAwOiBPSy4gKi8KLQotICByZXR2YWwgPSAwOwotICBzd2l0Y2ggKGxldHRlcikKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEZfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IERfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICAqcHJlY2lzaW9uUCA9IEdfUFJFQ0lTSU9OOwotICAgICAgKmV4cG9uZW50X2JpdHNQID0gMTE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgotICAgICAgKnByZWNpc2lvblAgPSBIX1BSRUNJU0lPTjsKLSAgICAgICpleHBvbmVudF9iaXRzUCA9IDE1OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dmFsID0gNjk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQwKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLSAqCQkJCQkJCQkJKgotICoJV2FybmluZzogdGhpcyByZXR1cm5zIDE2LWJpdCBMSVRUTEVOVU1zLCBiZWNhdXNlIHRoYXQgaXMJKgotICoJd2hhdCB0aGUgVkFYIHRoaW5rcyBpbi4gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmaWd1cmUJKgotICoJb3V0IGFueSBhbGlnbm1lbnQgcHJvYmxlbXMgYW5kIHRvIGNvbnNwaXJlIGZvciB0aGUgYnl0ZXMvd29yZAkqCi0gKgl0byBiZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlci4gQmlnZW5kaWFucyBiZXdhcmUhCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBjaGFyICoJCQkJLyogUmV0dXJuIHBvaW50ZXIgcGFzdCB0ZXh0IGNvbnN1bWVkLiAqLwotYXRvZl92YXggKHN0ciwgd2hhdF9raW5kLCB3b3JkcykKLSAgICAgY2hhciAqc3RyOwkJCS8qIFRleHQgdG8gY29udmVydCB0byBiaW5hcnkuICovCi0gICAgIGludCB3aGF0X2tpbmQ7CQkvKiAnZCcsICdmJywgJ2cnLCAnaCcgKi8KLSAgICAgTElUVExFTlVNX1RZUEUgKndvcmRzOwkvKiBCdWlsZCB0aGUgYmluYXJ5IGhlcmUuICovCi17Ci0gIEZMT05VTV9UWVBFIGY7Ci0gIExJVFRMRU5VTV9UWVBFIGJpdHNbTUFYX1BSRUNJU0lPTiArIE1BWF9QUkVDSVNJT04gKyBHVUFSRF07Ci0gIC8qIEV4dHJhIGJpdHMgZm9yIHplcm9lZCBsb3ctb3JkZXIgYml0cy4gKi8KLSAgLyogVGhlIDFzdCBNQVhfUFJFQ0lTSU9OIGFyZSB6ZXJvZWQsICovCi0gIC8qIHRoZSBsYXN0IGNvbnRhaW4gZmxvbnVtIGJpdHMuICovCi0gIGNoYXIgKnJldHVybl92YWx1ZTsKLSAgaW50IHByZWNpc2lvbjsJCS8qIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gdGhlIGZvcm1hdC4gKi8KLSAgbG9uZyBleHBvbmVudF9iaXRzOwotCi0gIHJldHVybl92YWx1ZSA9IHN0cjsKLSAgZi5sb3cgPSBiaXRzICsgTUFYX1BSRUNJU0lPTjsKLSAgZi5oaWdoID0gTlVMTDsKLSAgZi5sZWFkZXIgPSBOVUxMOwotICBmLmV4cG9uZW50ID0gMDsKLSAgZi5zaWduID0gJ1wwJzsKLQotICBpZiAod2hhdF9raW5kX29mX2Zsb2F0ICh3aGF0X2tpbmQsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKSkKLSAgICB7Ci0gICAgICByZXR1cm5fdmFsdWUgPSBOVUxMOwkvKiBXZSBsb3N0LiAqLwotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLQotICBpZiAocmV0dXJuX3ZhbHVlKQotICAgIHsKLSAgICAgIG1lbXNldCAoYml0cywgJ1wwJywgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkgKiBNQVhfUFJFQ0lTSU9OKTsKLQotICAgICAgLyogVXNlIG1vcmUgTGl0dGxlTnVtcyB0aGFuIHNlZW1zICovCi0gICAgICAvKiBuZWNlc3Nhcnk6IHRoZSBoaWdoZXN0IGZsb251bSBtYXkgaGF2ZSAqLwotICAgICAgLyogMTUgbGVhZGluZyAwIGJpdHMsIHNvIGNvdWxkIGJlIHVzZWxlc3MuICovCi0gICAgICBmLmhpZ2ggPSBmLmxvdyArIHByZWNpc2lvbiAtIDEgKyBHVUFSRDsKLQotICAgICAgaWYgKGF0b2ZfZ2VuZXJpYyAoJnJldHVybl92YWx1ZSwgIi4iLCAiZUUiLCAmZikpCi0JewotCSAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgcmV0dXJuX3ZhbHVlID0gTlVMTDsJLyogd2UgbG9zdCAqLwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZmxvbnVtX2dlbjJ2YXggKHdoYXRfa2luZCwgJmYsIHdvcmRzKSkKLQkgICAgewotCSAgICAgIHJldHVybl92YWx1ZSA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGF0b2ZfdmF4KCkgKi8KLQwKLS8qCi0gKiBJbjogYSBmbG9udW0sIGEgdmF4IGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KLSAqIE91dDogYSB2YXggZmxvYXRpbmctcG9pbnQgYml0IHBhdHRlcm4uCi0gKi8KLQotaW50CQkJCS8qIDA6IE9LLiAqLwotZmxvbnVtX2dlbjJ2YXggKGZvcm1hdF9sZXR0ZXIsIGYsIHdvcmRzKQotICAgICBjaGFyIGZvcm1hdF9sZXR0ZXI7CS8qIE9uZSBvZiAnZCcgJ2YnICdnJyAnaCcuICovCi0gICAgIEZMT05VTV9UWVBFICpmOwotICAgICBMSVRUTEVOVU1fVFlQRSAqd29yZHM7CS8qIERlbGl2ZXIgYW5zd2VyIGhlcmUuICovCi17Ci0gIExJVFRMRU5VTV9UWVBFICpscDsKLSAgaW50IHByZWNpc2lvbjsKLSAgbG9uZyBleHBvbmVudF9iaXRzOwotICBpbnQgcmV0dXJuX3ZhbHVlOwkJLyogMCA9PSBPSy4gKi8KLQotICByZXR1cm5fdmFsdWUgPSB3aGF0X2tpbmRfb2ZfZmxvYXQgKGZvcm1hdF9sZXR0ZXIsICZwcmVjaXNpb24sICZleHBvbmVudF9iaXRzKTsKLQotICBpZiAocmV0dXJuX3ZhbHVlICE9IDApCi0gICAgewotICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmLT5sb3cgPiBmLT5sZWFkZXIpCi0JewotCSAgLyogMC4wZTAgc2Vlbi4gKi8KLQkgIG1lbXNldCAod29yZHMsICdcMCcsIHNpemVvZiAoTElUVExFTlVNX1RZUEUpICogcHJlY2lzaW9uKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBleHBvbmVudF8xOwotCSAgbG9uZyBleHBvbmVudF8yOwotCSAgbG9uZyBleHBvbmVudF8zOwotCSAgbG9uZyBleHBvbmVudF80OwotCSAgaW50IGV4cG9uZW50X3NraXBwYWdlOwotCSAgTElUVExFTlVNX1RZUEUgd29yZDE7Ci0KLQkgIC8qIEpGOiBEZWFsIHdpdGggbmV3IE5hbiwgK0luZiBhbmQgLUluZiBjb2RlcyAqLwotCSAgaWYgKGYtPnNpZ24gIT0gJy0nICYmIGYtPnNpZ24gIT0gJysnKQotCSAgICB7Ci0JICAgICAgbWFrZV9pbnZhbGlkX2Zsb2F0aW5nX3BvaW50X251bWJlciAod29yZHMpOwotCSAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7Ci0JICAgIH0KLQkgIC8qCi0JCQkgKiBBbGwgdmF4ZW4gZmxvYXRpbmdfcG9pbnQgZm9ybWF0cyAoc28gZmFyKSBoYXZlOgotCQkJICogQml0IDE1IGlzIHNpZ24gYml0LgotCQkJICogQml0cyAxNDpuIGFyZSBleGNlc3Mtd2hhdGV2ZXIgZXhwb25lbnQuCi0JCQkgKiBCaXRzIG4tMTowIChpZiBhbnkpIGFyZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgZnJhY3Rpb24uCi0JCQkgKiBCaXRzIDE1OjAgb2YgdGhlIG5leHQgd29yZCBhcmUgdGhlIG5leHQgbW9zdCBzaWduaWZpY2FudCBiaXRzLgotCQkJICogQW5kIHNvIG9uIGZvciBlYWNoIG90aGVyIHdvcmQuCi0JCQkgKgotCQkJICogQWxsIHRoaXMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGEgS0YxMT8/IChXaGljaCBpcyBzdGlsbCBmYXN0ZXIKLQkJCSAqIHRoYW4gbG90cyBvZiB2YXhlbiBJIGNhbiB0aGluayBvZiwgYnV0IGl0IGFsc28gaGFzIGhpZ2hlcgotCQkJICogbWFpbnRlbmFuY2UgY29zdHMgLi4uIHNpZ2gpLgotCQkJICoKLQkJCSAqIFNvIHdlIG5lZWQ6IG51bWJlciBvZiBiaXRzIG9mIGV4cG9uZW50LCBudW1iZXIgb2YgYml0cyBvZgotCQkJICogbWFudGlzc2EuCi0JCQkgKi8KLQotI2lmZGVmIE5FVkVSCQkJLyoqKioqKiogVGhpcyB6ZXJvaW5nIHNlZW1zIHJlZHVuZGFudCAtIERlYW4gM21heTg2ICoqKioqKioqKiovCi0JICAvKgotCQkJICogTm8gbWF0dGVyIGhvdyBmZXcgYml0cyB3ZSBnb3QgYmFjayBmcm9tIHRoZSBhdG9mKCkKLQkJCSAqIHJvdXRpbmUsIGFkZCBlbm91Z2ggemVybyBsaXR0bGVudW1zIHNvIHRoZSByZXN0IG9mIHRoZQotCQkJICogY29kZSB3b24ndCBydW4gb3V0IG9mICJzaWduaWZpY2FudCIgYml0cyBpbiB0aGUgbWFudGlzc2EuCi0JCQkgKi8KLQkgIHsKLQkgICAgTElUVExFTlVNX1RZUEUgKmx0cDsKLQkgICAgZm9yIChsdHAgPSBmLT5sZWFkZXIgKyAxOwotCQkgbHRwIDw9IGYtPmxvdyArIHByZWNpc2lvbjsKLQkJIGx0cCsrKQotCSAgICAgIHsKLQkJKmx0cCA9IDA7Ci0JICAgICAgfQotCSAgfQotI2VuZGlmCi0KLQkgIGJpdHNfbGVmdF9pbl9saXR0bGVudW0gPSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICBsaXR0bGVudW1fcG9pbnRlciA9IGYtPmxlYWRlcjsKLQkgIGxpdHRsZW51bV9lbmQgPSBmLT5sb3c7Ci0JICAvKiBTZWVrIChhbmQgZm9yZ2V0KSAxc3Qgc2lnbmlmaWNhbnQgYml0ICovCi0JICBmb3IgKGV4cG9uZW50X3NraXBwYWdlID0gMDsKLQkgICAgICAgIW5leHRfYml0cyAoMSk7Ci0JICAgICAgIGV4cG9uZW50X3NraXBwYWdlKyspOzsKLQotCSAgZXhwb25lbnRfMSA9IGYtPmV4cG9uZW50ICsgZi0+bGVhZGVyICsgMSAtIGYtPmxvdzsKLQkgIC8qIFJhZGl4IExJVFRMRU5VTV9SQURJWCwgcG9pbnQganVzdCBoaWdoZXIgdGhhbiBmLT5sZWFkZXIuICovCi0JICBleHBvbmVudF8yID0gZXhwb25lbnRfMSAqIExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgIC8qIFJhZGl4IDIuICovCi0JICBleHBvbmVudF8zID0gZXhwb25lbnRfMiAtIGV4cG9uZW50X3NraXBwYWdlOwotCSAgLyogRm9yZ2V0IGxlYWRpbmcgemVyb3MsIGZvcmdldCAxc3QgYml0LiAqLwotCSAgZXhwb25lbnRfNCA9IGV4cG9uZW50XzMgKyAoMSA8PCAoZXhwb25lbnRfYml0cyAtIDEpKTsKLQkgIC8qIE9mZnNldCBleHBvbmVudC4gKi8KLQotCSAgaWYgKGV4cG9uZW50XzQgJiB+bWFza1tleHBvbmVudF9iaXRzXSkKLQkgICAgewotCSAgICAgIC8qCi0JCQkJICogRXhwb25lbnQgb3ZlcmZsb3cuIExvc2UgaW1tZWRpYXRlbHkuCi0JCQkJICovCi0KLQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0KLQkgICAgICAvKgotCQkJCSAqIFdlIGxlYXZlIHJldHVybl92YWx1ZSBhbG9uZTogYWRtaXQgd2UgcmVhZCB0aGUKLQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJCQkgKiBiZWNhdXNlIHdlIGNhbid0IGVuY29kZSB0aGUgbnVtYmVyLgotCQkJCSAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBscCA9IHdvcmRzOwotCi0JICAgICAgLyogV29yZCAxLiBTaWduLCBleHBvbmVudCBhbmQgcGVyaGFwcyBoaWdoIGJpdHMuICovCi0JICAgICAgLyogQXNzdW1lIDIncyBjb21wbGVtZW50IGludGVnZXJzLiAqLwotCSAgICAgIHdvcmQxID0gKCgoZXhwb25lbnRfNCAmIG1hc2tbZXhwb25lbnRfYml0c10pIDw8ICgxNSAtIGV4cG9uZW50X2JpdHMpKQotCQkgICAgICAgfCAoKGYtPnNpZ24gPT0gJysnKSA/IDAgOiAweDgwMDApCi0JCSAgICAgICB8IG5leHRfYml0cyAoMTUgLSBleHBvbmVudF9iaXRzKSk7Ci0JICAgICAgKmxwKysgPSB3b3JkMTsKLQotCSAgICAgIC8qIFRoZSByZXN0IG9mIHRoZSB3b3JkcyBhcmUganVzdCBtYW50aXNzYSBiaXRzLiAqLwotCSAgICAgIGZvciAoOyBscCA8IHdvcmRzICsgcHJlY2lzaW9uOyBscCsrKQotCQl7Ci0JCSAgKmxwID0gbmV4dF9iaXRzIChMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpOwotCQl9Ci0KLQkgICAgICBpZiAobmV4dF9iaXRzICgxKSkKLQkJewotCQkgIC8qCi0JCQkJCSAqIFNpbmNlIHRoZSBORVhUIGJpdCBpcyBhIDEsIHJvdW5kIFVQIHRoZSBtYW50aXNzYS4KLQkJCQkJICogVGhlIGN1bm5pbmcgZGVzaWduIG9mIHRoZXNlIGhpZGRlbi0xIGZsb2F0cyBwZXJtaXRzCi0JCQkJCSAqIHVzIHRvIGxldCB0aGUgbWFudGlzc2Egb3ZlcmZsb3cgaW50byB0aGUgZXhwb25lbnQsIGFuZAotCQkJCQkgKiBpdCAnZG9lcyB0aGUgcmlnaHQgdGhpbmcnLiBIb3dldmVyLCB3ZSBsb3NlIGlmIHRoZQotCQkJCQkgKiBoaWdoZXN0LW9yZGVyIGJpdCBvZiB0aGUgbG93ZXN0LW9yZGVyIHdvcmQgZmxpcHMuCi0JCQkJCSAqIElzIHRoYXQgY2xlYXI/Ci0JCQkJCSAqLwotCi0JCSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLQotCQkgIC8qCi0JCQkJCSAgI2lmIChzaXplb2YoY2FycnkpKSA8ICgoc2l6ZW9mKGJpdHNbMF0pICogQklUU19QRVJfQ0hBUikgKyAyKQotCQkJCQkgIFBsZWFzZSBhbGxvdyBhdCBsZWFzdCAxIG1vcmUgYml0IGluIGNhcnJ5IHRoYW4gaXMgaW4gYSBMSVRUTEVOVU0uCi0JCQkJCSAgV2UgbmVlZCB0aGF0IGV4dHJhIGJpdCB0byBob2xkIGEgY2FycnkgZHVyaW5nIGEgTElUVExFTlVNIGNhcnJ5Ci0JCQkJCSAgcHJvcGFnYXRpb24uIEFub3RoZXIgZXh0cmEgYml0IChrZXB0IDApIHdpbGwgYXNzdXJlIHVzIHRoYXQgd2UKLQkJCQkJICBkb24ndCBnZXQgYSBzdGlja3kgc2lnbiBiaXQgYWZ0ZXIgc2hpZnRpbmcgcmlnaHQsIGFuZCB0aGF0Ci0JCQkJCSAgcGVybWl0cyB1cyB0byBwcm9wYWdhdGUgdGhlIGNhcnJ5IHdpdGhvdXQgYW55IG1hc2tpbmcgb2YgYml0cy4KLQkJCQkJICAjZW5kaWYKLQkJCQkJICAqLwotCQkgIGZvciAoY2FycnkgPSAxLCBscC0tOwotCQkgICAgICAgY2FycnkgJiYgKGxwID49IHdvcmRzKTsKLQkJICAgICAgIGxwLS0pCi0JCSAgICB7Ci0JCSAgICAgIGNhcnJ5ID0gKmxwICsgY2Fycnk7Ci0JCSAgICAgICpscCA9IGNhcnJ5OwotCQkgICAgICBjYXJyeSA+Pj0gTElUVExFTlVNX05VTUJFUl9PRl9CSVRTOwotCQkgICAgfQotCi0JCSAgaWYgKCh3b3JkMSBeICp3b3JkcykgJiAoMSA8PCAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTIC0gMSkpKQotCQkgICAgewotCQkgICAgICBtYWtlX2ludmFsaWRfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICh3b3Jkcyk7Ci0JCSAgICAgIC8qCi0JCQkJCQkgKiBXZSBsZWF2ZSByZXR1cm5fdmFsdWUgYWxvbmU6IGFkbWl0IHdlIHJlYWQgdGhlCi0JCQkJCQkgKiBudW1iZXIsIGJ1dCByZXR1cm4gYSBmbG9hdGluZyBleGNlcHRpb24KLQkJCQkJCSAqIGJlY2F1c2Ugd2UgY2FuJ3QgZW5jb2RlIHRoZSBudW1iZXIuCi0JCQkJCQkgKi8KLQkJICAgIH0KLQkJfQkJLyogaWYgKHdlIG5lZWRlZCB0byByb3VuZCB1cCkgKi8KLQkgICAgfQkJCS8qIGlmIChleHBvbmVudCBvdmVyZmxvdykgKi8KLQl9CQkJLyogaWYgKDAuMGUwKSAqLwotICAgIH0JCQkJLyogaWYgKGZsb2F0X3R5cGUgd2FzIE9LKSAqLwotICByZXR1cm4gKHJldHVybl92YWx1ZSk7Ci19CQkJCS8qIGZsb251bV9nZW4ydmF4KCkgKi8KLQotCi0vKiBKRiB0aGlzIHVzZWQgdG8gYmUgaW4gdmF4LmMgYnV0IHRoaXMgbG9va3MgbGlrZSBhIGJldHRlciBwbGFjZSBmb3IgaXQgKi8KLQotLyoKLSAqCQltZF9hdG9mKCkKLSAqCi0gKiBJbjoJaW5wdXRfbGluZV9wb2ludGVyLT50aGUgMXN0IGNoYXJhY3RlciBvZiBhIGZsb2F0aW5nLXBvaW50Ci0gKgkJbnVtYmVyLgotICoJMSBsZXR0ZXIgZGVub3RpbmcgdGhlIHR5cGUgb2Ygc3RhdGVtZW50IHRoYXQgd2FudHMgYQotICoJCWJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmV0dXJuZWQuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIGJ1aWxkIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwuCi0gKgkJQXNzdW1lZCB0byBiZSAnYmlnIGVub3VnaCcuCi0gKglBZGRyZXNzIG9mIHdoZXJlIHRvIHJldHVybiBzaXplIG9mIGxpdGVyYWwgKGluIGNoYXJzKS4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+b2YgbmV4dCBjaGFyIGFmdGVyIGZsb2F0aW5nIG51bWJlci4KLSAqCUVycm9yIG1lc3NhZ2UsIG9yIDAuCi0gKglGbG9hdGluZyBwb2ludCBsaXRlcmFsLgotICoJTnVtYmVyIG9mIGNoYXJzIHdlIHVzZWQgZm9yIHRoZSBsaXRlcmFsLgotICovCi0KLSNkZWZpbmUgTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAoOCkJLyogRm9yIC5oZmxvYXRzLiAqLwotCi1jaGFyICoKLW1kX2F0b2YgKHdoYXRfc3RhdGVtZW50X3R5cGUsIGxpdGVyYWxQLCBzaXplUCkKLSAgICAgaW50IHdoYXRfc3RhdGVtZW50X3R5cGU7Ci0gICAgIGNoYXIgKmxpdGVyYWxQOwotICAgICBpbnQgKnNpemVQOwotewotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhJTVVNX05VTUJFUl9PRl9MSVRUTEVOVU1TXTsKLSAgcmVnaXN0ZXIgY2hhciBraW5kX29mX2Zsb2F0OwotICByZWdpc3RlciBpbnQgbnVtYmVyX29mX2NoYXJzOwotICByZWdpc3RlciBMSVRUTEVOVU1fVFlQRSAqbGl0dGxlbnVtUDsKLQotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ0YnOgkJCS8qIC5mbG9hdCAqLwotICAgIGNhc2UgJ2YnOgkJCS8qIC5mZmxvYXQgKi8KLSAgICAgIGtpbmRfb2ZfZmxvYXQgPSAnZic7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgkJCS8qIC5kb3VibGUgKi8KLSAgICBjYXNlICdkJzoJCQkvKiAuZGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2QnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdnJzoJCQkvKiAuZ2Zsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2cnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoJCQkvKiAuaGZsb2F0ICovCi0gICAgICBraW5kX29mX2Zsb2F0ID0gJ2gnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAga2luZF9vZl9mbG9hdCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9OwotCi0gIGlmIChraW5kX29mX2Zsb2F0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIExJVFRMRU5VTV9UWVBFICpsaW1pdDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYXRvZl92YXggKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCQkgICAgIGtpbmRfb2ZfZmxvYXQsCi0JCQkJICAgICB3b3Jkcyk7Ci0gICAgICAvKgotICAgICAgICogVGhlIGF0b2ZfdmF4KCkgYnVpbGRzIHVwIDE2LWJpdCBudW1iZXJzLgotICAgICAgICogU2luY2UgdGhlIGFzc2VtYmxlciBtYXkgbm90IGJlIHJ1bm5pbmcgb24KLSAgICAgICAqIGEgbGl0dGxlLWVuZGlhbiBtYWNoaW5lLCBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQKLSAgICAgICAqIGNvbnZlcnRpbmcgd29yZHMgdG8gY2hhcnMuCi0gICAgICAgKi8KLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IGF0b2ZfdmF4X3NpemVvZiAoa2luZF9vZl9mbG9hdCk7Ci0gICAgICBrbm93IChudW1iZXJfb2ZfY2hhcnMgPD0gTUFYSU1VTV9OVU1CRVJfT0ZfTElUVExFTlVNUyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpbWl0ID0gd29yZHMgKyAobnVtYmVyX29mX2NoYXJzIC8gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgZm9yIChsaXR0bGVudW1QID0gd29yZHM7IGxpdHRsZW51bVAgPCBsaW1pdDsgbGl0dGxlbnVtUCsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0ZXJhbFAsICpsaXR0bGVudW1QLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRlcmFsUCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG51bWJlcl9vZl9jaGFycyA9IDA7Ci0gICAgfTsKLQotICAqc2l6ZVAgPSBudW1iZXJfb2ZfY2hhcnM7Ci0gIHJldHVybiBraW5kX29mX2Zsb2F0ID8gMCA6IF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotfQotCi0vKiBlbmQgb2YgYXRvZi12YXguYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLWkzODZjb2ZmLmMgYi9nYXMvY29uZmlnL2UtaTM4NmNvZmYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZlZDcyOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL2UtaTM4NmNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaTM4NmNvZmZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJaTM4NmNvZmZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmNvZmZfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkiaTM4NmNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgaTM4NmNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAwCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMgYi9nYXMvY29uZmlnL2UtaTM4NmVsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTY3MDFlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1pMzg2ZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWkzODZlbGZfYmZkX25hbWUgKCkKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiBOVUxMOwotfQotCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJaTM4NmVsZl9iZmRfbmFtZQotI2RlZmluZSBlbXVsX2Zvcm1hdAkmZWxmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJImkzODZlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgaTM4NmVsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9lLW1pcHNlY29mZi5jIGIvZ2FzL2NvbmZpZy9lLW1pcHNlY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJmNzFiLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1taXBzZWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImVtdWwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKm1pcHNlY29mZl9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW1pcHNlY29mZl9iZmRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgZW11bF9iZmRfbmFtZQltaXBzZWNvZmZfYmZkX25hbWUKLSNkZWZpbmUgZW11bF9mb3JtYXQJJmVjb2ZmX2Zvcm1hdF9vcHMKLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNiZWNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2JlY29mZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDEKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgIGVtdWxfbmFtZQotI3VuZGVmICBlbXVsX3N0cnVjdF9uYW1lCi0jdW5kZWYgIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNsZWNvZmYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2xlY29mZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgZW11bF9uYW1lCi0jdW5kZWYgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNlY29mZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzZWNvZmYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAyCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvZS1taXBzZWxmLmMgYi9nYXMvY29uZmlnL2UtbWlwc2VsZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWE3MmY1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvZS1taXBzZWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJlbXVsLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICptaXBzZWxmX2JmZF9uYW1lIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbWlwc2VsZl9iZmRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNkZWZpbmUgZW11bF9iZmRfbmFtZQltaXBzZWxmX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfZm9ybWF0CSZlbGZfZm9ybWF0X29wcwotCi0jZGVmaW5lIGVtdWxfbmFtZQkibWlwc2JlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2JlbGYKLSNkZWZpbmUgZW11bF9kZWZhdWx0X2VuZGlhbiAxCi0jaW5jbHVkZSAiZW11bC10YXJnZXQuaCIKLQotI3VuZGVmICBlbXVsX25hbWUKLSN1bmRlZiAgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmICBlbXVsX2RlZmF1bHRfZW5kaWFuCi0KLSNkZWZpbmUgZW11bF9uYW1lCSJtaXBzbGVsZiIKLSNkZWZpbmUgZW11bF9zdHJ1Y3RfbmFtZSBtaXBzbGVsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDAKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgotCi0jdW5kZWYgZW11bF9uYW1lCi0jdW5kZWYgZW11bF9zdHJ1Y3RfbmFtZQotI3VuZGVmIGVtdWxfZGVmYXVsdF9lbmRpYW4KLQotI2RlZmluZSBlbXVsX25hbWUJIm1pcHNlbGYiCi0jZGVmaW5lIGVtdWxfc3RydWN0X25hbWUgbWlwc2VsZgotI2RlZmluZSBlbXVsX2RlZmF1bHRfZW5kaWFuIDIKLSNpbmNsdWRlICJlbXVsLXRhcmdldC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9nbzMyLmNmZyBiL2dhcy9jb25maWcvZ28zMi5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTkzOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9nbzMyLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qIGNvbmZpZy5oIGZvciBnbzMyICovDQotDQotI2RlZmluZSBJMzg2Q09GRiAxDQotDQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8NCi0jdW5kZWYgQ19BTExPQ0ENCi0NCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuDQotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8NCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQNCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8NCi0jdW5kZWYgSEFWRV9BTExPQ0FfSA0KLQ0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovDQotI3VuZGVmIGlubGluZQ0KLQ0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQ0KLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQ0KLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4NCi0JU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3Nlcw0KLQlTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMNCi0JU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24NCi0gKi8NCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9ODQotDQotLyogU2hvdWxkIGdhcyB1c2UgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlcz8gICovDQotI3VuZGVmIEJGRF9BU1NFTUJMRVINCi0NCi0vKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgY3Jvc3MtYXNzZW1ibGluZywgc29tZSBvcGVyYXRpb25zIGNhbiBiZSBvcHRpbWl6ZWQsDQotICAgc2luY2UgYnl0ZSBvcmRlcnMgYW5kIHZhbHVlIHNpemVzIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLw0KLSN1bmRlZiBDUk9TU19DT01QSUxFDQotDQotLyogU29tZSBnYXMgY29kZSB3YW50cyB0byBrbm93IHRoZXNlIHBhcmFtZXRlcnMuICAqLw0KLSNkZWZpbmUgVEFSR0VUX0FMSUFTCQkiaTM4NiINCi0jZGVmaW5lIFRBUkdFVF9DUFUJCSJpMzg2Ig0KLSNkZWZpbmUgVEFSR0VUX0NBTk9OSUNBTAkiaTM4Ni1pMzg2Ig0KLSNkZWZpbmUgVEFSR0VUX09TCQkiZGpncHAiDQotI2RlZmluZSBUQVJHRVRfVkVORE9SCQkiZGpncHAiDQotDQotLyogU29tZSBvcGVyYXRpbmcgc3lzdGVtcywgZm9yIGV4YW1wbGUgRE9TLCByZXF1aXJlIHRoZSB1c2Ugb2YgIndiIiBtb2RlIHdoZW4NCi0gICBvcGVuaW5nIGEgYmluYXJ5IGZpbGUgZm9yIHdyaXRpbmcuICBJZiBvbmx5ICJ3IiBpcyB1c2VkLCB0aGUgZmlsZSB3aWxsIG5vdA0KLSAgIGJlIGNvcnJlY3QuICBIb3dldmVyLCBzb21lIG90aGVyIHN5c3RlbXMgcmVqZWN0IHN1Y2ggYSBtb2RlLiAgVGhpcyBpbmRpY2F0ZXMNCi0gICB3aGljaCAuLi9pbmNsdWRlL2ZvcGVuLSouaCBoZWFkZXIgZmlsZSB3ZSB3YW50IHRvIGluY2x1ZGUsIHNvIHRoYXQgd2UgY2FuDQotICAgZ2V0IG1hY3JvcyB0aGF0J2xsIGRvIHRoZSByaWdodCB0aGluZyBmb3IgdGhpcyBzeXN0ZW0uICAqLw0KLSNkZWZpbmUgV0FOVF9GT1BFTl9CSU4gMQ0KLQ0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIG1hbGxvYyBhbmQgcmVhbGxvYy4gICovDQotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DDQotDQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgZnJlZS4gICovDQotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQ0KLQ0KLS8qIFNvbWV0aW1lcyBlcnJuby5oIGRvZXNuJ3QgZGVjbGFyZSBlcnJubyBpdHNlbGYuICAqLw0KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PDQotDQotI2RlZmluZSBNQU5ZX1NFR01FTlRTIDENCi0NCi0vKiBOZWVkZWQgb25seSBmb3Igc3BhcmMgY29uZmlndXJhdGlvbiAqLw0KLSN1bmRlZiBzcGFyY3Y5DQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByZW1vdmUgZnVuY3Rpb24uICAqLw0KLSNkZWZpbmUgSEFWRV9SRU1PVkUgMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8NCi0jZGVmaW5lIEhBVkVfVU5MSU5LIDENCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovDQotI2RlZmluZSBIQVZFX0VSUk5PX0ggMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovDQotI2RlZmluZSBIQVZFX01FTU9SWV9IIDENCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSNkZWZpbmUgSEFWRV9TVERBUkdfSCAxDQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovDQotI2RlZmluZSBIQVZFX1NUUklOR19IIDENCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gNCi0NCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxDQotDQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8NCi0jZGVmaW5lIEhBVkVfVU5JU1REX0ggMQ0KLQ0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLw0KLSN1bmRlZiBIQVZFX1ZBUkFSR1NfSA0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvaXRibC1taXBzLmggYi9nYXMvY29uZmlnL2l0YmwtbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ4MmJkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvaXRibC1taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0KLS8qIGl0YmwtbWlwcy5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIERlZmluZXMgZm9yIE1pcHMgaXRibCBjb3Agc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLQotLyogVmFsdWVzIGZvciBwcm9jZXNzb3JzIHdpbGwgYmUgZnJvbSAwIHRvIE5VTUJFUl9PRl9QUk9DRVNTT1JTLTEgKi8KLSNkZWZpbmUgTlVNQkVSX09GX1BST0NFU1NPUlMgNAotI2RlZmluZSBNQVhfQklUUE9TIDMxCi0KLS8qIE1pcHMgc3BlY2lmaWNzICovCi0jZGVmaW5lIE1JUFNfT1BDT0RFX0NPUDAgKDB4MjEpCS8qIENPUHorQ08sIGJpdHMgMzEtMjU6IDAxMDB6ejEgKi8KLSNkZWZpbmUgTUlQU19FTkNPREVfQ09QX05VTSh6KSAoKE1JUFNfT1BDT0RFX0NPUDB8ejw8MSk8PDI1KQotI2RlZmluZSBNSVBTX0lTX0NPUF9JTlNOKGluc24pICgoTUlQU19PUENPREVfQ09QMCYoaW5zbj4+MjUpKSBcCi0JPT0gTUlQU19PUENPREVfQ09QMCkKLSNkZWZpbmUgTUlQU19ERUNPREVfQ09QX05VTShpbnNuKSAoKH5NSVBTX09QQ09ERV9DT1AwJihpbnNuPj4yNSkpPj4xKQotI2RlZmluZSBNSVBTX0RFQ09ERV9DT1BfQ09GVU4oaW5zbikgKCh+TUlQU19FTkNPREVfQ09QX05VTSgzKSkmKGluc24pKQotCi0vKiBkZWZpbml0aW9ucyByZXF1aXJlZCBieSBnZW5lcmljIGNvZGUgKi8KLSNkZWZpbmUgSVRCTF9JU19JTlNOKGluc24pIE1JUFNfSVNfQ09QX0lOU04oaW5zbikKLSNkZWZpbmUgSVRCTF9ERUNPREVfUE5VTShpbnNuKSBNSVBTX0RFQ09ERV9DT1BfTlVNKGluc24pCi0jZGVmaW5lIElUQkxfRU5DT0RFX1BOVU0ocG51bSkgTUlQU19FTkNPREVfQ09QX05VTShwbnVtKQotCi0jZGVmaW5lIElUQkxfT1BDT0RFX1NUUlVDVCBtaXBzX29wY29kZQotI2RlZmluZSBJVEJMX09QQ09ERVMgbWlwc19vcGNvZGVzCi0jZGVmaW5lIElUQkxfTlVNX09QQ09ERVMgTlVNT1BDT0RFUwotI2RlZmluZSBJVEJMX05VTV9NQUNST1MgTV9OVU1fTUFDUk9TCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL202OGstcGFyc2UuaCBiL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI1ZjYwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvbTY4ay1wYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qIG02OGstcGFyc2UuaCAtLSBoZWFkZXIgZmlsZSBmb3IgbTY4ayBhc3NlbWJsZXIKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTTY4S19QQVJTRV9ICi0jZGVmaW5lIE02OEtfUEFSU0VfSAotCi0vKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhpbmdzIHdoaWNoIGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUKLSAgIG9wZXJhbmQgcGFyc2VyIGluIG02OGsueSBhbmQgdGhlIG02OGsgYXNzZW1ibGVyIHByb3BlciBpbgotICAgdGMtbTY4ay5jLiAgKi8KLQotLyogVGhlIHZhcmlvdXMgbTY4ayByZWdpc3RlcnMuICAqLwotCi0vKiBEQVRBIGFuZCBBRERSIGhhdmUgdG8gYmUgY29udGlndW91cywgc28gdGhhdCByZWctREFUQSBnaXZlcwotICAgMC03PT1kYXRhIHJlZywgOC0xNT09YWRkciByZWcgZm9yIG9wZXJhbmRzIHRoYXQgdGFrZSBib3RoIHR5cGVzLgotCi0gICBXZSBkb24ndCB1c2UgZm9ybXMgbGlrZSAiQUREUjAgPSBBRERSIiBoZXJlIGJlY2F1c2UgdGhpcyBmaWxlIGlzCi0gICBsaWtlbHkgdG8gYmUgdXNlZCBvbiBhbiBBcG9sbG8sIGFuZCB0aGUgYnJva2VuIEFwb2xsbyBjb21waWxlcgotICAgZ2l2ZXMgYW4gYHVuZGVmaW5lZCB2YXJpYWJsZScgZXJyb3IgaWYgd2UgZG8gdGhhdCwgYWNjb3JkaW5nIHRvCi0gICB0cm95QGNibWUudW5zdy5lZHUuYXUuICAqLwotCi0jZGVmaW5lIERBVEEgREFUQTAKLSNkZWZpbmUgQUREUiBBRERSMAotI2RlZmluZSBTUCBBRERSNwotI2RlZmluZSBCQUQgQkFEMAotI2RlZmluZSBCQUMgQkFDMAotCi1lbnVtIG02OGtfcmVnaXN0ZXIKLXsKLSAgREFUQTAgPSAxLAkJCS8qICAgMS0gOCA9PSBkYXRhIHJlZ2lzdGVycyAwLTcgKi8KLSAgREFUQTEsCi0gIERBVEEyLAotICBEQVRBMywKLSAgREFUQTQsCi0gIERBVEE1LAotICBEQVRBNiwKLSAgREFUQTcsCi0KLSAgQUREUjAsCi0gIEFERFIxLAotICBBRERSMiwKLSAgQUREUjMsCi0gIEFERFI0LAotICBBRERSNSwKLSAgQUREUjYsCi0gIEFERFI3LAotCi0gIEZQMCwJCQkJLyogRWlnaHQgRlAgcmVnaXN0ZXJzICovCi0gIEZQMSwKLSAgRlAyLAotICBGUDMsCi0gIEZQNCwKLSAgRlA1LAotICBGUDYsCi0gIEZQNywKLQotICBDT1AwLAkJCQkvKiBDby1wcm9jZXNzb3IgIzAtIzcgKi8KLSAgQ09QMSwKLSAgQ09QMiwKLSAgQ09QMywKLSAgQ09QNCwKLSAgQ09QNSwKLSAgQ09QNiwKLSAgQ09QNywKLQotICBQQywJCQkJLyogUHJvZ3JhbSBjb3VudGVyICovCi0gIFpQQywJCQkJLyogSGFjayBmb3IgUHJvZ3JhbSBzcGFjZSwgYnV0IDAgYWRkcmVzc2luZyAqLwotICBTUiwJCQkJLyogU3RhdHVzIFJlZyAqLwotICBDQ1IsCQkJCS8qIENvbmRpdGlvbiBjb2RlIFJlZyAqLwotICBBQ0MsCQkJCS8qIEFjY3VtdWxhdG9yIFJlZyAqLwotICBNQUNTUiwJCQkvKiBNQUMgU3RhdHVzIFJlZyAqLwotICBNQVNLLAkJCQkvKiBNb2R1bHVzIFJlZyAqLwotCi0gIC8qIFRoZXNlIGhhdmUgdG8gYmUgZ3JvdXBlZCB0b2dldGhlciBmb3IgdGhlIG1vdmVjIGluc3RydWN0aW9uIHRvIHdvcmsuICovCi0gIFVTUCwJCQkJLyogIFVzZXIgU3RhY2sgUG9pbnRlciAqLwotICBJU1AsCQkJCS8qICBJbnRlcnJ1cHQgc3RhY2sgcG9pbnRlciAqLwotICBTRkMsCi0gIERGQywKLSAgQ0FDUiwKLSAgVkJSLAotICBDQUFSLAotICBNU1AsCi0gIElUVDAsCi0gIElUVDEsCi0gIERUVDAsCi0gIERUVDEsCi0gIE1NVVNSLAotICBUQywKLSAgU1JQLAotICBVUlAsCi0gIEJVU0NSLAkJCS8qIDY4MDYwIGFkZGVkIHRoZXNlICovCi0gIFBDUiwKLSAgUk9NQkFSLAkJCS8qIG1jZjUyMDAgYWRkZWQgdGhlc2UgKi8KLSAgUkFNQkFSMCwKLSAgUkFNQkFSMSwKLSAgTUJBUiwKLSNkZWZpbmUgbGFzdF9tb3ZlY19yZWcgTUJBUgotICAvKiBlbmQgb2YgbW92ZWMgb3JkZXJpbmcgY29uc3RyYWludHMgKi8KLQotICBGUEksCi0gIEZQUywKLSAgRlBDLAotCi0gIERSUCwJCQkJLyogNjg4NTEgb3IgNjgwMzAgTU1VIHJlZ3MgKi8KLSAgQ1JQLAotICBDQUwsCi0gIFZBTCwKLSAgU0NDLAotICBBQywKLSAgQkFEMCwKLSAgQkFEMSwKLSAgQkFEMiwKLSAgQkFEMywKLSAgQkFENCwKLSAgQkFENSwKLSAgQkFENiwKLSAgQkFENywKLSAgQkFDMCwKLSAgQkFDMSwKLSAgQkFDMiwKLSAgQkFDMywKLSAgQkFDNCwKLSAgQkFDNSwKLSAgQkFDNiwKLSAgQkFDNywKLSAgUFNSLAkJCQkvKiBha2EgTU1VU1Igb24gNjgwMzAgKGJ1dCBub3QgTU1VU1Igb24gNjgwNDApCi0JCQkJICAgYW5kIEFDVVNSIG9uIDY4ZWMwMzAgKi8KLSAgUENTUiwKLQotICBJQywJCQkJLyogaW5zdHJ1Y3Rpb24gY2FjaGUgdG9rZW4gKi8KLSAgREMsCQkJCS8qIGRhdGEgY2FjaGUgdG9rZW4gKi8KLSAgTkMsCQkJCS8qIG5vIGNhY2hlIHRva2VuICovCi0gIEJDLAkJCQkvKiBib3RoIGNhY2hlcyB0b2tlbiAqLwotCi0gIFRUMCwJCQkJLyogNjgwMzAgYWNjZXNzIGNvbnRyb2wgdW5pdCByZWdzICovCi0gIFRUMSwKLQotICBaREFUQTAsCQkJLyogc3VwcHJlc3NlZCBkYXRhIHJlZ2lzdGVycy4gICovCi0gIFpEQVRBMSwKLSAgWkRBVEEyLAotICBaREFUQTMsCi0gIFpEQVRBNCwKLSAgWkRBVEE1LAotICBaREFUQTYsCi0gIFpEQVRBNywKLQotICBaQUREUjAsCQkJLyogc3VwcHJlc3NlZCBhZGRyZXNzIHJlZ2lzdGVycy4gICovCi0gIFpBRERSMSwKLSAgWkFERFIyLAotICBaQUREUjMsCi0gIFpBRERSNCwKLSAgWkFERFI1LAotICBaQUREUjYsCi0gIFpBRERSNywKLQotICAvKiBVcHBlciBhbmQgbG93ZXIgaGFsZiBvZiBkYXRhIGFuZCBhZGRyZXNzIHJlZ2lzdGVycy4gIE9yZGVyICptdXN0KgotICAgICBiZSBEQVRBeEwsIEFERFJ4TCwgREFUQXhVLCBBRERSeFUuICovCi0gIERBVEEwTCwJCQkvKiBsb3dlciBoYWxmIG9mIGRhdGEgcmVnaXN0ZXJzICovCi0gIERBVEExTCwKLSAgREFUQTJMLAotICBEQVRBM0wsCi0gIERBVEE0TCwKLSAgREFUQTVMLAotICBEQVRBNkwsCi0gIERBVEE3TCwKLQotICBBRERSMEwsCQkJLyogbG93ZXIgaGFsZiBvZiBhZGRyZXNzIHJlZ2lzdGVycyAqLwotICBBRERSMUwsCi0gIEFERFIyTCwKLSAgQUREUjNMLAotICBBRERSNEwsCi0gIEFERFI1TCwKLSAgQUREUjZMLAotICBBRERSN0wsCi0KLSAgREFUQTBVLAkJCS8qIHVwcGVyIGhhbGYgb2YgZGF0YSByZWdpc3RlcnMgKi8KLSAgREFUQTFVLAotICBEQVRBMlUsCi0gIERBVEEzVSwKLSAgREFUQTRVLAotICBEQVRBNVUsCi0gIERBVEE2VSwKLSAgREFUQTdVLAotCi0gIEFERFIwVSwJCQkvKiB1cHBlciBoYWxmIG9mIGFkZHJlc3MgcmVnaXN0ZXJzICovCi0gIEFERFIxVSwKLSAgQUREUjJVLAotICBBRERSM1UsCi0gIEFERFI0VSwKLSAgQUREUjVVLAotICBBRERSNlUsCi0gIEFERFI3VSwKLX07Ci0KLS8qIFNpemUgaW5mb3JtYXRpb24uICAqLwotCi1lbnVtIG02OGtfc2l6ZQotewotICAvKiBVbnNwZWNpZmllZC4gICovCi0gIFNJWkVfVU5TUEVDLAotCi0gIC8qIEJ5dGUuICAqLwotICBTSVpFX0JZVEUsCi0KLSAgLyogV29yZCAoMiBieXRlcykuICAqLwotICBTSVpFX1dPUkQsCi0KLSAgLyogTG9uZ3dvcmQgKDQgYnl0ZXMpLiAgKi8KLSAgU0laRV9MT05HCi19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbmRleCByZWdpc3Rlci4gICovCi0KLXN0cnVjdCBtNjhrX2luZGV4cmVnCi17Ci0gIC8qIFRoZSBpbmRleCByZWdpc3RlciBpdHNlbGYuICAqLwotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotCi0gIC8qIFRoZSBzaXplIHRvIHVzZS4gICovCi0gIGVudW0gbTY4a19zaXplIHNpemU7Ci0KLSAgLyogVGhlIHZhbHVlIHRvIHNjYWxlIGJ5LiAgKi8KLSAgaW50IHNjYWxlOwotfTsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFRoZSB0eXBlIG9mIGEgUElDIGV4cHJlc3Npb24uICAqLwotCi1lbnVtIHBpY19yZWxvY2F0aW9uCi17Ci0gIHBpY19ub25lLAkJCS8qIG5vdCBwaWMgKi8KLSAgcGljX3BsdF9wY3JlbCwJCS8qIEBQTFRQQyAqLwotICBwaWNfZ290X3BjcmVsLAkJLyogQEdPVFBDICovCi0gIHBpY19wbHRfb2ZmLAkJCS8qIEBQTFQgKi8KLSAgcGljX2dvdF9vZmYJCQkvKiBAR09UICovCi19OwotI2VuZGlmCi0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IGFuIGV4cHJlc3Npb24uICAqLwotCi1zdHJ1Y3QgbTY4a19leHAKLXsKLSAgLyogVGhlIHNpemUgdG8gdXNlLiAgKi8KLSAgZW51bSBtNjhrX3NpemUgc2l6ZTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogVGhlIHR5cGUgb2YgcGljIHJlbG9jYXRpb24gaWYgYW55LiAgKi8KLSAgZW51bSBwaWNfcmVsb2NhdGlvbiBwaWNfcmVsb2M7Ci0jZW5kaWYKLQotICAvKiBUaGUgZXhwcmVzc2lvbiBpdHNlbGYuICAqLwotICBleHByZXNzaW9uUyBleHA7Ci19OwotCi0vKiBUaGUgb3BlcmFuZCBtb2Rlcy4gICovCi0KLWVudW0gbTY4a19vcGVyYW5kX3R5cGUKLXsKLSAgSU1NRUQgPSAxLAotICBBQlNMLAotICBEUkVHLAotICBBUkVHLAotICBGUFJFRywKLSAgQ09OVFJPTCwKLSAgQUlORFIsCi0gIEFJTkMsCi0gIEFERUMsCi0gIERJU1AsCi0gIEJBU0UsCi0gIFBPU1QsCi0gIFBSRSwKLSAgUkVHTFNUCi19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIHBhcnNlZCBvcGVyYW5kLiAgKi8KLQotc3RydWN0IG02OGtfb3AKLXsKLSAgLyogVGhlIHR5cGUgb2Ygb3BlcmFuZC4gICovCi0gIGVudW0gbTY4a19vcGVyYW5kX3R5cGUgbW9kZTsKLQotICAvKiBUaGUgbWFpbiByZWdpc3Rlci4gICovCi0gIGVudW0gbTY4a19yZWdpc3RlciByZWc7Ci0KLSAgLyogVGhlIHJlZ2lzdGVyIG1hc2sgZm9yIG1vZGUgUkVHTFNULiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEFuIGVycm9yIG1lc3NhZ2UuICAqLwotICBjb25zdCBjaGFyICplcnJvcjsKLQotICAvKiBUaGUgaW5kZXggcmVnaXN0ZXIuICAqLwotICBzdHJ1Y3QgbTY4a19pbmRleHJlZyBpbmRleDsKLQotICAvKiBUaGUgZGlzcGxhY2VtZW50LiAgKi8KLSAgc3RydWN0IG02OGtfZXhwIGRpc3A7Ci0KLSAgLyogVGhlIG91dGVyIGRpc3BsYWNlbWVudC4gICovCi0gIHN0cnVjdCBtNjhrX2V4cCBvZGlzcDsKLX07Ci0KLSNlbmRpZiAvKiAhIGRlZmluZWQgKE02OEtfUEFSU0VfSCkgKi8KLQotLyogVGhlIHBhcnNpbmcgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gaW50IG02OGtfaXBfb3AgUEFSQU1TICgoY2hhciAqLCBzdHJ1Y3QgbTY4a19vcCAqKSk7Ci0KLS8qIFdoZXRoZXIgcmVnaXN0ZXIgcHJlZml4ZXMgYXJlIG9wdGlvbmFsLiAgKi8KLWV4dGVybiBpbnQgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9tNjhrLXBhcnNlLnkgYi9nYXMvY29uZmlnL202OGstcGFyc2UueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNGU0Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL202OGstcGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjEgKzAsMCBAQAotLyogbTY4ay55IC0tIGJpc29uIGdyYW1tYXIgZm9yIG02OGsgb3BlcmFuZCBwYXJzaW5nCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiBhbmQgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGEgYmlzb24gZ3JhbW1hciB0byBwYXJzZSBtNjhrIG9wZXJhbmRzLiAgVGhlIG02OGsKLSAgIGhhcyBhIGNvbXBsaWNhdGVkIG9wZXJhbmQgc3ludGF4LCBhbmQgZ2FzIHN1cHBvcnRzIHR3byBtYWluCi0gICB2YXJpYXRpb25zIG9mIGl0LiAgVXNpbmcgYSBncmFtbWFyIGlzIHByb2JhYmx5IG92ZXJraWxsLCBidXQgYXQKLSAgIGxlYXN0IGl0IG1ha2VzIGNsZWFyIGV4YWN0bHkgd2hhdCB3ZSBkbyBzdXBwb3J0LiAgKi8KLQotJXsKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAidGMtbTY4ay5oIgotI2luY2x1ZGUgIm02OGstcGFyc2UuaCIKLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsCi0gICBldGMpLCBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcyBJZiBvdGhlciBwYXJzZXIKLSAgIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQKLSAgIGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlCi0gICBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCi0KLSNkZWZpbmUJeXltYXhkZXB0aCBtNjhrX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJbTY4a19wYXJzZQotI2RlZmluZQl5eWxleAltNjhrX2xleAotI2RlZmluZQl5eWVycm9yCW02OGtfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCW02OGtfbHZhbAotI2RlZmluZQl5eWNoYXIJbTY4a19jaGFyCi0jZGVmaW5lCXl5ZGVidWcJbTY4a19kZWJ1ZwotI2RlZmluZQl5eXBhY3QJbTY4a19wYWN0CQotI2RlZmluZQl5eXIxCW02OGtfcjEJCQkKLSNkZWZpbmUJeXlyMgltNjhrX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCW02OGtfZGVmCQkKLSNkZWZpbmUJeXljaGsJbTY4a19jaGsJCQotI2RlZmluZQl5eXBnbwltNjhrX3BnbwkJCi0jZGVmaW5lCXl5YWN0CW02OGtfYWN0CQkKLSNkZWZpbmUJeXlleGNhCW02OGtfZXhjYQotI2RlZmluZSB5eWVycmZsYWcgbTY4a19lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJbTY4a19uZXJycwotI2RlZmluZQl5eXBzCW02OGtfcHMKLSNkZWZpbmUJeXlwdgltNjhrX3B2Ci0jZGVmaW5lCXl5cwltNjhrX3MKLSNkZWZpbmUJeXlfeXlzCW02OGtfeXlzCi0jZGVmaW5lCXl5c3RhdGUJbTY4a19zdGF0ZQotI2RlZmluZQl5eXRtcAltNjhrX3RtcAotI2RlZmluZQl5eXYJbTY4a192Ci0jZGVmaW5lCXl5X3l5dgltNjhrX3l5dgotI2RlZmluZQl5eXZhbAltNjhrX3ZhbAotI2RlZmluZQl5eWxsb2MJbTY4a19sbG9jCi0jZGVmaW5lIHl5cmVkcwltNjhrX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwltNjhrX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5bGhzCW02OGtfeXlsaHMKLSNkZWZpbmUgeXlsZW4JbTY4a195eWxlbgotI2RlZmluZSB5eWRlZnJlZCBtNjhrX3l5ZGVmcmVkCi0jZGVmaW5lIHl5ZGdvdG8JbTY4a195eWRnb3RvCi0jZGVmaW5lIHl5c2luZGV4IG02OGtfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggbTY4a195eXJpbmRleAotI2RlZmluZSB5eWdpbmRleCBtNjhrX3l5Z2luZGV4Ci0jZGVmaW5lIHl5dGFibGUJIG02OGtfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBtNjhrX3l5Y2hlY2sKLQotI2lmbmRlZiBZWURFQlVHCi0jZGVmaW5lIFlZREVCVUcgMQotI2VuZGlmCi0KLS8qIEludGVybmFsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4a19yZWdfcGFyc2UgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCB5eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgcGFyc2VyIHNldHMgZmllbGRzIHBvaW50ZWQgdG8gYnkgdGhpcyBnbG9iYWwgdmFyaWFibGUuICAqLwotc3RhdGljIHN0cnVjdCBtNjhrX29wICpvcDsKLQotJX0KLQotJXVuaW9uCi17Ci0gIHN0cnVjdCBtNjhrX2luZGV4cmVnIGluZGV4cmVnOwotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotICBzdHJ1Y3QgbTY4a19leHAgZXhwOwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0gIGludCBvbmVyZWc7Ci19Ci0KLSV0b2tlbiA8cmVnPiBEUiBBUiBGUFIgRlBDUiBMUEMgWkFSIFpEUiBMWlBDIENSRUcKLSV0b2tlbiA8aW5kZXhyZWc+IElOREVYUkVHCi0ldG9rZW4gPGV4cD4gRVhQUgotCi0ldHlwZSA8aW5kZXhyZWc+IHppcmVnIHpkaXJlZwotJXR5cGUgPHJlZz4gemFkciB6ZHIgYXBjIHphcGMgenBjIG9wdHphcGMgb3B0Y3phcGMKLSV0eXBlIDxleHA+IG9wdGNleHByIG9wdGV4cHJjCi0ldHlwZSA8bWFzaz4gcmVnbGlzdCBpcmVnbGlzdCByZWdsaXN0cGFpcgotJXR5cGUgPG9uZXJlZz4gcmVnbGlzdHJlZwotCi0lJQotCi0vKiBBbiBvcGVyYW5kLiAgKi8KLQotb3BlcmFuZDoKLQkgIGdlbmVyaWNfb3BlcmFuZAotCXwgbW90b3JvbGFfb3BlcmFuZAotCXwgbWl0X29wZXJhbmQKLQk7Ci0KLS8qIEEgZ2VuZXJpYyBvcGVyYW5kLiAgKi8KLQotZ2VuZXJpY19vcGVyYW5kOgotCSAgRFIKLQkJewotCQkgIG9wLT5tb2RlID0gRFJFRzsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IEFSCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFSRUc7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBGUFIKLQkJewotCQkgIG9wLT5tb2RlID0gRlBSRUc7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBGUENSCi0JCXsKLQkJICBvcC0+bW9kZSA9IENPTlRST0w7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBDUkVHCi0JCXsKLQkJICBvcC0+bW9kZSA9IENPTlRST0w7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBFWFBSCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFCU0w7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJfQotCXwgJyMnIEVYUFIKLQkJewotCQkgIG9wLT5tb2RlID0gSU1NRUQ7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJfQotCXwgJyYnIEVYUFIKLQkJewotCQkgIG9wLT5tb2RlID0gSU1NRUQ7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJfQotCXwgcmVnbGlzdAotCQl7Ci0JCSAgb3AtPm1vZGUgPSBSRUdMU1Q7Ci0JCSAgb3AtPm1hc2sgPSAkMTsKLQkJfQotCTsKLQotLyogQW4gb3BlcmFuZCBpbiBNb3Rvcm9sYSBzeW50YXguICBUaGlzIGluY2x1ZGVzIE1SSSBzeW50YXggYXMgd2VsbCwKLSAgIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIGRpZmZlcmVudCBpbiB0aGF0IGl0IHBlcm1pdHMgY29tbXV0YXRpdml0eQotICAgb2YgaW5kZXggYW5kIGJhc2UgcmVnaXN0ZXJzLCBhbmQgcGVybWl0cyBhbiBvZmZzZXQgZXhwcmVzc2lvbiB0bwotICAgYXBwZWFyIGluc2lkZSBvciBvdXRzaWRlIG9mIHRoZSBwYXJlbnRoZXNlcy4gICovCi0KLW1vdG9yb2xhX29wZXJhbmQ6Ci0JICAnKCcgQVIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFJTkRSOwotCQkgIG9wLT5yZWcgPSAkMjsKLQkJfQotCXwgJygnIEFSICcpJyAnKycKLQkJewotCQkgIG9wLT5tb2RlID0gQUlOQzsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCX0KLQl8ICctJyAnKCcgQVIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEFERUM7Ci0JCSAgb3AtPnJlZyA9ICQzOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemFwYyAnKScKLQkJewotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQkgIGlmICgoJDQgPj0gWkFERFIwICYmICQ0IDw9IFpBRERSNykKLQkJICAgICAgfHwgJDQgPT0gWlBDKQotCQkgICAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIGVsc2UKLQkJICAgIG9wLT5tb2RlID0gRElTUDsKLQkJfQotCXwgJygnIHphcGMgJywnIEVYUFIgJyknCi0JCXsKLQkJICBvcC0+cmVnID0gJDI7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBpZiAoKCQyID49IFpBRERSMCAmJiAkMiA8PSBaQUREUjcpCi0JCSAgICAgIHx8ICQyID09IFpQQykKLQkJICAgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBlbHNlCi0JCSAgICBvcC0+bW9kZSA9IERJU1A7Ci0JCX0KLQl8IEVYUFIgJygnIHphcGMgJyknCi0JCXsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBpZiAoKCQzID49IFpBRERSMCAmJiAkMyA8PSBaQUREUjcpCi0JCSAgICAgIHx8ICQzID09IFpQQykKLQkJICAgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBlbHNlCi0JCSAgICBvcC0+bW9kZSA9IERJU1A7Ci0JCX0KLQl8ICcoJyBMUEMgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IERJU1A7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQl9Ci0JfCAnKCcgWkFSICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMjsKLQkJfQotCXwgJygnIExaUEMgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemFwYyAnLCcgemlyZWcgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5kaXNwID0gJDI7Ci0JCSAgb3AtPmluZGV4ID0gJDY7Ci0JCX0KLQl8ICcoJyBFWFBSICcsJyB6YXBjICcsJyB6cGMgJyknCi0JCXsKLQkJICBpZiAoJDQgPT0gUEMgfHwgJDQgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDY7Ci0JCSAgb3AtPmRpc3AgPSAkMjsKLQkJICBvcC0+aW5kZXgucmVnID0gJDQ7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQl9Ci0JfCAnKCcgRVhQUiAnLCcgemRpcmVnIG9wdGN6YXBjICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+ZGlzcCA9ICQyOwotCQkgIG9wLT5pbmRleCA9ICQ0OwotCQl9Ci0JfCAnKCcgemRpcmVnICcsJyBFWFBSICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5kaXNwID0gJDQ7Ci0JCSAgb3AtPmluZGV4ID0gJDI7Ci0JCX0KLQl8IEVYUFIgJygnIHphcGMgJywnIHppcmVnICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+ZGlzcCA9ICQxOwotCQkgIG9wLT5pbmRleCA9ICQ1OwotCQl9Ci0JfCAnKCcgemFwYyAnLCcgemlyZWcgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQyOwotCQkgIG9wLT5pbmRleCA9ICQ0OwotCQl9Ci0JfCBFWFBSICcoJyB6YXBjICcsJyB6cGMgJyknCi0JCXsKLQkJICBpZiAoJDMgPT0gUEMgfHwgJDMgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDU7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBvcC0+aW5kZXgucmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQl9Ci0JfCAnKCcgemFwYyAnLCcgenBjICcpJwotCQl7Ci0JCSAgaWYgKCQyID09IFBDIHx8ICQyID09IFpQQykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IEJBU0U7Ci0JCSAgb3AtPnJlZyA9ICQ0OwotCQkgIG9wLT5pbmRleC5yZWcgPSAkMjsKLQkJICBvcC0+aW5kZXguc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQkgIG9wLT5pbmRleC5zY2FsZSA9IDE7Ci0JCX0KLQl8IEVYUFIgJygnIHpkaXJlZyBvcHRjemFwYyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDQ7Ci0JCSAgb3AtPmRpc3AgPSAkMTsKLQkJICBvcC0+aW5kZXggPSAkMzsKLQkJfQotCXwgJygnIHpkaXJlZyBvcHRjemFwYyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gQkFTRTsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4ID0gJDI7Ci0JCX0KLQl8ICcoJyAnWycgRVhQUiBvcHRjemFwYyAnXScgJywnIHppcmVnIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5pbmRleCA9ICQ3OwotCQkgIG9wLT5vZGlzcCA9ICQ4OwotCQl9Ci0JfCAnKCcgJ1snIEVYUFIgb3B0Y3phcGMgJ10nIG9wdGNleHByICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBQT1NUOwotCQkgIG9wLT5yZWcgPSAkNDsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5vZGlzcCA9ICQ2OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJ10nICcsJyB6aXJlZyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4ID0gJDY7Ci0JCSAgb3AtPm9kaXNwID0gJDc7Ci0JCX0KLQl8ICcoJyAnWycgemFwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBPU1Q7Ci0JCSAgb3AtPnJlZyA9ICQzOwotCQkgIG9wLT5vZGlzcCA9ICQ1OwotCQl9Ci0JfCAnKCcgJ1snIEVYUFIgJywnIHphcGMgJywnIHppcmVnICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+ZGlzcCA9ICQzOwotCQkgIG9wLT5pbmRleCA9ICQ3OwotCQkgIG9wLT5vZGlzcCA9ICQ5OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJywnIHppcmVnICddJyBvcHRjZXhwciAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkMzsKLQkJICBvcC0+aW5kZXggPSAkNTsKLQkJICBvcC0+b2Rpc3AgPSAkNzsKLQkJfQotCXwgJygnICdbJyBFWFBSICcsJyB6YXBjICcsJyB6cGMgJ10nIG9wdGNleHByICcpJwotCQl7Ci0JCSAgaWYgKCQ1ID09IFBDIHx8ICQ1ID09IFpQQykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDc7Ci0JCSAgb3AtPmRpc3AgPSAkMzsKLQkJICBvcC0+aW5kZXgucmVnID0gJDU7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQkgIG9wLT5vZGlzcCA9ICQ5OwotCQl9Ci0JfCAnKCcgJ1snIHphcGMgJywnIHpwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBpZiAoJDMgPT0gUEMgfHwgJDMgPT0gWlBDKQotCQkgICAgeXllcnJvciAoXygic3ludGF4IGVycm9yIikpOwotCQkgIG9wLT5tb2RlID0gUFJFOwotCQkgIG9wLT5yZWcgPSAkNTsKLQkJICBvcC0+aW5kZXgucmVnID0gJDM7Ci0JCSAgb3AtPmluZGV4LnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICBvcC0+aW5kZXguc2NhbGUgPSAxOwotCQkgIG9wLT5vZGlzcCA9ICQ3OwotCQl9Ci0JfCAnKCcgJ1snIG9wdGV4cHJjIHpkaXJlZyBvcHRjemFwYyAnXScgb3B0Y2V4cHIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDU7Ci0JCSAgb3AtPmRpc3AgPSAkMzsKLQkJICBvcC0+aW5kZXggPSAkNDsKLQkJICBvcC0+b2Rpc3AgPSAkNzsKLQkJfQotCTsKLQotLyogQW4gb3BlcmFuZCBpbiBNSVQgc3ludGF4LiAgKi8KLQotbWl0X29wZXJhbmQ6Ci0JICBvcHR6YXBjICdAJwotCQl7Ci0JCSAgLyogV2UgdXNlIG9wdHphcGMgdG8gYXZvaWQgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3QuICAqLwotCQkgIGlmICgkMSA8IEFERFIwIHx8ICQxID4gQUREUjcpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBBSU5EUjsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCX0KLQl8IG9wdHphcGMgJ0AnICcrJwotCQl7Ci0JCSAgLyogV2UgdXNlIG9wdHphcGMgdG8gYXZvaWQgYSBzaGlmdC9yZWR1Y2UgY29uZmxpY3QuICAqLwotCQkgIGlmICgkMSA8IEFERFIwIHx8ICQxID4gQUREUjcpCi0JCSAgICB5eWVycm9yIChfKCJzeW50YXggZXJyb3IiKSk7Ci0JCSAgb3AtPm1vZGUgPSBBSU5DOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJfQotCXwgb3B0emFwYyAnQCcgJy0nCi0JCXsKLQkJICAvKiBXZSB1c2Ugb3B0emFwYyB0byBhdm9pZCBhIHNoaWZ0L3JlZHVjZSBjb25mbGljdC4gICovCi0JCSAgaWYgKCQxIDwgQUREUjAgfHwgJDEgPiBBRERSNykKLQkJICAgIHl5ZXJyb3IgKF8oInN5bnRheCBlcnJvciIpKTsKLQkJICBvcC0+bW9kZSA9IEFERUM7Ci0JCSAgb3AtPnJlZyA9ICQxOwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgRVhQUiAnKScKLQkJewotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIGlmICgoJDEgPj0gWkFERFIwICYmICQxIDw9IFpBRERSNykKLQkJICAgICAgfHwgJDEgPT0gWlBDKQotCQkgICAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIGVsc2UKLQkJICAgIG9wLT5tb2RlID0gRElTUDsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIG9wdGV4cHJjIHppcmVnICcpJwotCQl7Ci0JCSAgb3AtPm1vZGUgPSBCQVNFOwotCQkgIG9wLT5yZWcgPSAkMTsKLQkJICBvcC0+ZGlzcCA9ICQ0OwotCQkgIG9wLT5pbmRleCA9ICQ1OwotCQl9Ci0JfCBvcHR6YXBjICdAJyAnKCcgRVhQUiAnKScgJ0AnICcoJyBvcHRleHByYyB6aXJlZyAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+aW5kZXggPSAkOTsKLQkJICBvcC0+b2Rpc3AgPSAkODsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIEVYUFIgJyknICdAJyAnKCcgRVhQUiAnKScKLQkJewotCQkgIG9wLT5tb2RlID0gUE9TVDsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+b2Rpc3AgPSAkODsKLQkJfQotCXwgb3B0emFwYyAnQCcgJygnIG9wdGV4cHJjIHppcmVnICcpJyAnQCcgJygnIEVYUFIgJyknCi0JCXsKLQkJICBvcC0+bW9kZSA9IFBSRTsKLQkJICBvcC0+cmVnID0gJDE7Ci0JCSAgb3AtPmRpc3AgPSAkNDsKLQkJICBvcC0+aW5kZXggPSAkNTsKLQkJICBvcC0+b2Rpc3AgPSAkOTsKLQkJfQotCTsKLQotLyogQW4gaW5kZXggcmVnaXN0ZXIsIHBvc3NpYmx5IHN1cHByZXNzZWQsIHdoaWNoIG5lZWQgbm90IGhhdmUgYSBzaXplCi0gICBvciBzY2FsZS4gICovCi0KLXppcmVnOgotCSAgSU5ERVhSRUcKLQl8IHphZHIKLQkJewotCQkgICQkLnJlZyA9ICQxOwotCQkgICQkLnNpemUgPSBTSVpFX1VOU1BFQzsKLQkJICAkJC5zY2FsZSA9IDE7Ci0JCX0KLQk7Ci0KLS8qIEEgcmVnaXN0ZXIgd2hpY2ggbWF5IGJlIGFuIGluZGV4IHJlZ2lzdGVyLCBidXQgd2hpY2ggbWF5IG5vdCBiZSBhbgotICAgYWRkcmVzcyByZWdpc3Rlci4gIFRoaXMgbm9udGVybWluYWwgaXMgdXNlZCB0byBhdm9pZCBhbWJpZ3VpdHkgd2hlbgotICAgdHJ5aW5nIHRvIHBhcnNlIHNvbWV0aGluZyBsaWtlICgwLGQ1LGE2KSBhcyBjb21wYXJlZCB0byAoMCxhNixkNSkuICAqLwotCi16ZGlyZWc6Ci0JICBJTkRFWFJFRwotCXwgemRyCi0JCXsKLQkJICAkJC5yZWcgPSAkMTsKLQkJICAkJC5zaXplID0gU0laRV9VTlNQRUM7Ci0JCSAgJCQuc2NhbGUgPSAxOwotCQl9Ci0JOwotCi0vKiBBbiBhZGRyZXNzIG9yIGRhdGEgcmVnaXN0ZXIsIG9yIGEgc3VwcHJlc3NlZCBhZGRyZXNzIG9yIGRhdGEKLSAgIHJlZ2lzdGVyLiAgKi8KLQotemFkcjoKLQkgIHpkcgotCXwgQVIKLQl8IFpBUgotCTsKLQotLyogQSBkYXRhIHJlZ2lzdGVyIHdoaWNoIG1heSBiZSBzdXBwcmVzc2VkLiAgKi8KLQotemRyOgotCSAgRFIKLQl8IFpEUgotCTsKLQotLyogRWl0aGVyIGFuIGFkZHJlc3MgcmVnaXN0ZXIgb3IgdGhlIFBDLiAgKi8KLQotYXBjOgotCSAgQVIKLQl8IExQQwotCTsKLQotLyogRWl0aGVyIGFuIGFkZHJlc3MgcmVnaXN0ZXIsIG9yIHRoZSBQQywgb3IgYSBzdXBwcmVzc2VkIGFkZHJlc3MKLSAgIHJlZ2lzdGVyLCBvciBhIHN1cHByZXNzZWQgUEMuICAqLwotCi16YXBjOgotCSAgYXBjCi0JfCBMWlBDCi0JfCBaQVIKLQk7Ci0KLS8qIEFuIG9wdGlvbmFsIHphcGMuICAqLwotCi1vcHR6YXBjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gWkFERFIwOwotCQl9Ci0JfCB6YXBjCi0JOwotCi0vKiBUaGUgUEMsIG9wdGlvbmFsbHkgc3VwcHJlc3NlZC4gICovCi0KLXpwYzoKLQkgIExQQwotCXwgTFpQQwotCTsKLQotLyogJywnIHphcGMgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGN6YXBjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gWkFERFIwOwotCQl9Ci0JfCAnLCcgemFwYwotCQl7Ci0JCSAgJCQgPSAkMjsKLQkJfQotCTsKLQotLyogJywnIEVYUFIgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGNleHByOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0JCSAgJCQuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQl9Ci0JfCAnLCcgRVhQUgotCQl7Ci0JCSAgJCQgPSAkMjsKLQkJfQotCTsKLQotLyogRVhQUiAnLCcgd2hlbiBpdCBtYXkgYmUgb21pdHRlZC4gICovCi0KLW9wdGV4cHJjOgotCSAgLyogZW1wdHkgKi8KLQkJewotCQkgICQkLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0JCSAgJCQuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCQl9Ci0JfCBFWFBSICcsJwotCQl7Ci0JCSAgJCQgPSAkMTsKLQkJfQotCTsKLQotLyogQSByZWdpc3RlciBsaXN0IGZvciB0aGUgbW92ZW0gaW5zdHJ1Y3Rpb24uICAqLwotCi1yZWdsaXN0OgotCSAgcmVnbGlzdHBhaXIKLQl8IHJlZ2xpc3RwYWlyICcvJyBpcmVnbGlzdAotCQl7Ci0JCSAgJCQgPSAkMSB8ICQzOwotCQl9Ci0JfCByZWdsaXN0cmVnICcvJyBpcmVnbGlzdAotCQl7Ci0JCSAgJCQgPSAoMSA8PCAkMSkgfCAkMzsKLQkJfQotCTsKLQotLyogV2UgdXNlIGlyZWdsaXN0IHdoZW4gd2Uga25vdyB3ZSBhcmUgbG9va2luZyBhdCBhIHJlZ2xpc3QsIGFuZCB3ZQotICAgY2FuIHNhZmVseSByZWR1Y2UgYSBzaW1wbGUgcmVnaXN0ZXIgdG8gcmVnbGlzdHJlZy4gIElmIHdlIHBlcm1pdHRlZAotICAgcmVnbGlzdCB0byByZWR1Y2UgdG8gcmVnbGlzdHJlZywgaXQgd291bGQgYmUgYW1iaWd1b3VzIHdoZXRoZXIgYQotICAgcGxhaW4gcmVnaXN0ZXIgd2VyZSBhIERSRUcvQVJFRy9GUFJFRyBvciBhIFJFR0xTVC4gICovCi0KLWlyZWdsaXN0OgotCSAgcmVnbGlzdHJlZwotCQl7Ci0JCSAgJCQgPSAxIDw8ICQxOwotCQl9Ci0JfCByZWdsaXN0cGFpcgotCXwgcmVnbGlzdHBhaXIgJy8nIGlyZWdsaXN0Ci0JCXsKLQkJICAkJCA9ICQxIHwgJDM7Ci0JCX0KLQl8IHJlZ2xpc3RyZWcgJy8nIGlyZWdsaXN0Ci0JCXsKLQkJICAkJCA9ICgxIDw8ICQxKSB8ICQzOwotCQl9Ci0JOwotCi1yZWdsaXN0cGFpcjoKLQkgIHJlZ2xpc3RyZWcgJy0nIHJlZ2xpc3RyZWcKLQkJewotCQkgIGlmICgkMSA8PSAkMykKLQkJICAgICQkID0gKDEgPDwgKCQzICsgMSkpIC0gMSAtICgoMSA8PCAkMSkgLSAxKTsKLQkJICBlbHNlCi0JCSAgICAkJCA9ICgxIDw8ICgkMSArIDEpKSAtIDEgLSAoKDEgPDwgJDMpIC0gMSk7Ci0JCX0KLQk7Ci0KLXJlZ2xpc3RyZWc6Ci0JICBEUgotCQl7Ci0JCSAgJCQgPSAkMSAtIERBVEEwOwotCQl9Ci0JfCBBUgotCQl7Ci0JCSAgJCQgPSAkMSAtIEFERFIwICsgODsKLQkJfQotCXwgRlBSCi0JCXsKLQkJICAkJCA9ICQxIC0gRlAwICsgMTY7Ci0JCX0KLQl8IEZQQ1IKLQkJewotCQkgIGlmICgkMSA9PSBGUEkpCi0JCSAgICAkJCA9IDI0OwotCQkgIGVsc2UgaWYgKCQxID09IEZQUykKLQkJICAgICQkID0gMjU7Ci0JCSAgZWxzZQotCQkgICAgJCQgPSAyNjsKLQkJfQotCTsKLQotJSUKLQotLyogVGhlIHN0cmluZyB0byBwYXJzZSBpcyBzdG9yZWQgaGVyZSwgYW5kIG1vZGlmaWVkIGJ5IHl5bGV4LiAgKi8KLQotc3RhdGljIGNoYXIgKnN0cjsKLQotLyogVGhlIG9yaWdpbmFsIHN0cmluZyBwb2ludGVyLiAgKi8KLQotc3RhdGljIGNoYXIgKnN0cm9yaWc7Ci0KLS8qIElmICpDQ1AgY291bGQgYmUgYSByZWdpc3RlciwgcmV0dXJuIHRoZSByZWdpc3RlciBudW1iZXIgYW5kIGFkdmFuY2UKLSAgICpDQ1AuICBPdGhlcndpc2UgZG9uJ3QgY2hhbmdlICpDQ1AsIGFuZCByZXR1cm4gMC4gICovCi0KLXN0YXRpYyBlbnVtIG02OGtfcmVnaXN0ZXIKLW02OGtfcmVnX3BhcnNlIChjY3ApCi0gICAgIHJlZ2lzdGVyIGNoYXIgKipjY3A7Ci17Ci0gIGNoYXIgKnN0YXJ0ID0gKmNjcDsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzeW1ib2xTICpzeW1ib2xwOwotCi0gIGlmIChmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCi0gICAgewotICAgICAgaWYgKCpzdGFydCA9PSBSRUdJU1RFUl9QUkVGSVgpCi0Jc3RhcnQrKzsKLSAgICAgIHAgPSBzdGFydDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKnN0YXJ0ICE9IFJFR0lTVEVSX1BSRUZJWCkKLQlyZXR1cm4gMDsKLSAgICAgIHAgPSBzdGFydCArIDE7Ci0gICAgfQotCi0gIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKCpwKSkKLSAgICByZXR1cm4gMDsKLQotICBwKys7Ci0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCpwKSAmJiAqcCAhPSAnLicgJiYgKnAgIT0gJzonICYmICpwICE9ICcqJykKLSAgICBwKys7Ci0KLSAgYyA9ICpwOwotICAqcCA9IDA7Ci0gIHN5bWJvbHAgPSBzeW1ib2xfZmluZCAoc3RhcnQpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHN5bWJvbHAgIT0gTlVMTCAmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xwKSA9PSByZWdfc2VjdGlvbikKLSAgICB7Ci0gICAgICAqY2NwID0gcDsKLSAgICAgIHJldHVybiBTX0dFVF9WQUxVRSAoc3ltYm9scCk7Ci0gICAgfQotCi0gIC8qIEluIE1SSSBtb2RlLCBzb21ldGhpbmcgbGlrZSBmb28uYmFyIGNhbiBiZSBlcXVhdGVkIHRvIGEgcmVnaXN0ZXIKLSAgICAgbmFtZS4gICovCi0gIHdoaWxlIChmbGFnX21yaSAmJiBjID09ICcuJykKLSAgICB7Ci0gICAgICArK3A7Ci0gICAgICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqcCkgJiYgKnAgIT0gJy4nICYmICpwICE9ICc6JyAmJiAqcCAhPSAnKicpCi0JcCsrOwotICAgICAgYyA9ICpwOwotICAgICAgKnAgPSAnXDAnOwotICAgICAgc3ltYm9scCA9IHN5bWJvbF9maW5kIChzdGFydCk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoc3ltYm9scCAhPSBOVUxMICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbHApID09IHJlZ19zZWN0aW9uKQotCXsKLQkgICpjY3AgPSBwOwotCSAgcmV0dXJuIFNfR0VUX1ZBTFVFIChzeW1ib2xwKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgbGV4ZXIuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBlbnVtIG02OGtfcmVnaXN0ZXIgcmVnOwotICBjaGFyICpzOwotICBpbnQgcGFyZW5zOwotICBpbnQgYyA9IDA7Ci0gIGludCB0YWlsID0gMDsKLSAgY2hhciAqaG9sZDsKLQotICBpZiAoKnN0ciA9PSAnICcpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgPT0gJ1wwJykKLSAgICByZXR1cm4gMDsKLQotICAvKiBWYXJpb3VzIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUganVzdCByZXR1cm5lZCBkaXJlY3RseS4gICovCi0gIHN3aXRjaCAoKnN0cikKLSAgICB7Ci0gICAgY2FzZSAnQCc6Ci0gICAgICAvKiBJbiBNUkkgbW9kZSwgdGhpcyBjYW4gYmUgdGhlIHN0YXJ0IG9mIGFuIG9jdGFsIG51bWJlci4gICovCi0gICAgICBpZiAoZmxhZ19tcmkpCi0JewotCSAgaWYgKGlzZGlnaXQgKHN0clsxXSkKLQkgICAgICB8fCAoKHN0clsxXSA9PSAnKycgfHwgc3RyWzFdID09ICctJykKLQkJICAmJiBpc2RpZ2l0IChzdHJbMl0pKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICcmJzoKLSAgICBjYXNlICcsJzoKLSAgICBjYXNlICcpJzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICAgIHJldHVybiAqc3RyKys7Ci0gICAgY2FzZSAnKyc6Ci0gICAgICAvKiBJdCBzbyBoYXBwZW5zIHRoYXQgYSAnKycgY2FuIG9ubHkgYXBwZWFyIGF0IHRoZSBlbmQgb2YgYW4KLSAgICAgICAgIG9wZXJhbmQuICBJZiBpdCBhcHBlYXJzIGFueXdoZXJlIGVsc2UsIGl0IG11c3QgYmUgYSB1bmFyeQotICAgICAgICAgcGx1cyBvbiBhbiBleHByZXNzaW9uLiAgKi8KLSAgICAgIGlmIChzdHJbMV0gPT0gJ1wwJykKLQlyZXR1cm4gKnN0cisrOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnLSc6Ci0gICAgICAvKiBBICctJyBjYW4gb25seSBhcHBlYXIgaW4gLShhciksIHJuLXJuLCBvciBhckAtLiAgSWYgaXQKLSAgICAgICAgIGFwcGVhcnMgYW55d2hlcmUgZWxzZSwgaXQgbXVzdCBiZSBhIHVuYXJ5IG1pbnVzIG9uIGFuCi0gICAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICAgIGlmIChzdHJbMV0gPT0gJ1wwJykKLQlyZXR1cm4gKnN0cisrOwotICAgICAgcyA9IHN0ciArIDE7Ci0gICAgICBpZiAoKnMgPT0gJygnKQotCSsrczsKLSAgICAgIGlmIChtNjhrX3JlZ19wYXJzZSAoJnMpICE9IDApCi0JcmV0dXJuICpzdHIrKzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJygnOgotICAgICAgLyogQSAnKCcgY2FuIG9ubHkgYXBwZWFyIGluIGAocmVnKScsIGAoZXhwciwuLi4nLCBgKFsnLCBgQCgnLCBvcgotICAgICAgICAgYCkoJy4gIElmIGl0IGFwcGVhcnMgYW55d2hlcmUgZWxzZSwgaXQgbXVzdCBiZSBzdGFydGluZyBhbgotICAgICAgICAgZXhwcmVzc2lvbi4gICovCi0gICAgICBpZiAoc3RyWzFdID09ICdbJwotCSAgfHwgKHN0ciA+IHN0cm9yaWcKLQkgICAgICAmJiAoc3RyWy0xXSA9PSAnQCcKLQkJICB8fCBzdHJbLTFdID09ICcpJykpKQotCXJldHVybiAqc3RyKys7Ci0gICAgICBzID0gc3RyICsgMTsKLSAgICAgIGlmIChtNjhrX3JlZ19wYXJzZSAoJnMpICE9IDApCi0JcmV0dXJuICpzdHIrKzsKLSAgICAgIC8qIENoZWNrIGZvciB0aGUgY2FzZSBvZiAnKGV4cHIsLi4uJyBieSBzY2FubmluZyBhaGVhZC4gIElmIHdlCi0gICAgICAgICBmaW5kIGEgY29tbWEgb3V0c2lkZSBvZiBiYWxhbmNlZCBwYXJlbnRoZXNlcywgd2UgcmV0dXJuICcoJy4KLSAgICAgICAgIElmIHdlIGZpbmQgYW4gdW5iYWxhbmNlZCByaWdodCBwYXJlbnRoZXNpcywgdGhlbiBwcmVzdW1hYmx5Ci0gICAgICAgICB0aGUgJygnIHJlYWxseSBzdGFydHMgYW4gZXhwcmVzc2lvbi4gICovCi0gICAgICBwYXJlbnMgPSAwOwotICAgICAgZm9yIChzID0gc3RyICsgMTsgKnMgIT0gJ1wwJzsgcysrKQotCXsKLQkgIGlmICgqcyA9PSAnKCcpCi0JICAgICsrcGFyZW5zOwotCSAgZWxzZSBpZiAoKnMgPT0gJyknKQotCSAgICB7Ci0JICAgICAgaWYgKHBhcmVucyA9PSAwKQotCQlicmVhazsKLQkgICAgICAtLXBhcmVuczsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnMgPT0gJywnICYmIHBhcmVucyA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogQSBjb21tYSBjYW4gbm90IG5vcm1hbGx5IGFwcGVhciBpbiBhbiBleHByZXNzaW9uLCBzbwotCQkgdGhpcyBpcyBhIGNhc2Ugb2YgJyhleHByLC4uLicuICAqLwotCSAgICAgIHJldHVybiAqc3RyKys7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBpdCdzIGEgcmVnaXN0ZXIuICAqLwotCi0gIHJlZyA9IG02OGtfcmVnX3BhcnNlICgmc3RyKTsKLSAgaWYgKHJlZyAhPSAwKQotICAgIHsKLSAgICAgIGludCByZXQ7Ci0KLSAgICAgIHl5bHZhbC5yZWcgPSByZWc7Ci0KLSAgICAgIGlmIChyZWcgPj0gREFUQTAgJiYgcmVnIDw9IERBVEE3KQotCXJldCA9IERSOwotICAgICAgZWxzZSBpZiAocmVnID49IEFERFIwICYmIHJlZyA8PSBBRERSNykKLQlyZXQgPSBBUjsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSBGUDAgJiYgcmVnIDw9IEZQNykKLQlyZXR1cm4gRlBSOwotICAgICAgZWxzZSBpZiAocmVnID09IEZQSQotCSAgICAgICB8fCByZWcgPT0gRlBTCi0JICAgICAgIHx8IHJlZyA9PSBGUEMpCi0JcmV0dXJuIEZQQ1I7Ci0gICAgICBlbHNlIGlmIChyZWcgPT0gUEMpCi0JcmV0dXJuIExQQzsKLSAgICAgIGVsc2UgaWYgKHJlZyA+PSBaREFUQTAgJiYgcmVnIDw9IFpEQVRBNykKLQlyZXQgPSBaRFI7Ci0gICAgICBlbHNlIGlmIChyZWcgPj0gWkFERFIwICYmIHJlZyA8PSBaQUREUjcpCi0JcmV0ID0gWkFSOwotICAgICAgZWxzZSBpZiAocmVnID09IFpQQykKLQlyZXR1cm4gTFpQQzsKLSAgICAgIGVsc2UKLQlyZXR1cm4gQ1JFRzsKLQotICAgICAgLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmUgYSBkYXRhIG9yIGFkZHJlc3MgcmVnaXN0ZXIuICBXZQotCSBtdXN0IGNoZWNrIGZvciBhIHNpemUgb3Igc2NhbGU7IGlmIHdlIGZpbmQgb25lLCB3ZSBtdXN0Ci0JIHJldHVybiBJTkRFWFJFRy4gICovCi0KLSAgICAgIHMgPSBzdHI7Ci0KLSAgICAgIGlmICgqcyAhPSAnLicgJiYgKnMgIT0gJzonICYmICpzICE9ICcqJykKLQlyZXR1cm4gcmV0OwotCi0gICAgICB5eWx2YWwuaW5kZXhyZWcucmVnID0gcmVnOwotCi0gICAgICBpZiAoKnMgIT0gJy4nICYmICpzICE9ICc6JykKLQl5eWx2YWwuaW5kZXhyZWcuc2l6ZSA9IFNJWkVfVU5TUEVDOwotICAgICAgZWxzZQotCXsKLQkgICsrczsKLQkgIHN3aXRjaCAoKnMpCi0JICAgIHsKLQkgICAgY2FzZSAndyc6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIHl5bHZhbC5pbmRleHJlZy5zaXplID0gU0laRV9XT1JEOwotCSAgICAgICsrczsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnbCc6Ci0JICAgIGNhc2UgJ0wnOgotCSAgICAgIHl5bHZhbC5pbmRleHJlZy5zaXplID0gU0laRV9MT05HOwotCSAgICAgICsrczsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICB5eWVycm9yIChfKCJpbGxlZ2FsIHNpemUgc3BlY2lmaWNhdGlvbiIpKTsKLQkgICAgICB5eWx2YWwuaW5kZXhyZWcuc2l6ZSA9IFNJWkVfVU5TUEVDOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICB5eWx2YWwuaW5kZXhyZWcuc2NhbGUgPSAxOwotCi0gICAgICBpZiAoKnMgPT0gJyonIHx8ICpzID09ICc6JykKLQl7Ci0JICBleHByZXNzaW9uUyBzY2FsZTsKLQotCSAgKytzOwotCi0JICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQkgIGV4cHJlc3Npb24gKCZzY2FsZSk7Ci0JICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgaWYgKHNjYWxlLlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgeXllcnJvciAoXygic2NhbGUgc3BlY2lmaWNhdGlvbiBtdXN0IHJlc29sdmUgdG8gYSBudW1iZXIiKSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKHNjYWxlLlhfYWRkX251bWJlcikKLQkJewotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJY2FzZSA0OgotCQljYXNlIDg6Ci0JCSAgeXlsdmFsLmluZGV4cmVnLnNjYWxlID0gc2NhbGUuWF9hZGRfbnVtYmVyOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIHl5ZXJyb3IgKF8oImludmFsaWQgc2NhbGUgdmFsdWUiKSk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgc3RyID0gczsKLQotICAgICAgcmV0dXJuIElOREVYUkVHOwotICAgIH0KLQotICAvKiBJdCBtdXN0IGJlIGFuIGV4cHJlc3Npb24uICBCZWZvcmUgd2UgY2FsbCBleHByZXNzaW9uLCB3ZSBuZWVkIHRvCi0gICAgIGxvb2sgYWhlYWQgdG8gc2VlIGlmIHRoZXJlIGlzIGEgc2l6ZSBzcGVjaWZpY2F0aW9uLiAgV2UgbXVzdCBkbwotICAgICB0aGF0IGZpcnN0LCBiZWNhdXNlIG90aGVyd2lzZSBmb28ubCB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlIHN5bWJvbAotICAgICBmb28ubCwgcmF0aGVyIHRoYW4gYXMgdGhlIHN5bWJvbCBmb28gd2l0aCBhIGxvbmcgc2l6ZQotICAgICBzcGVjaWZpY2F0aW9uLiAgVGhlIGdyYW1tYXIgcmVxdWlyZXMgdGhhdCBhbGwgZXhwcmVzc2lvbnMgZW5kIGF0Ci0gICAgIHRoZSBlbmQgb2YgdGhlIG9wZXJhbmQsIG9yIHdpdGggJywnLCAnKCcsICddJywgJyknLiAgKi8KLQotICBwYXJlbnMgPSAwOwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCc7IHMrKykKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJygnKQotCXsKLQkgIGlmIChwYXJlbnMgPT0gMAotCSAgICAgICYmIHMgPiBzdHIKLQkgICAgICAmJiAoc1stMV0gPT0gJyknIHx8IGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzWy0xXSkpKQotCSAgICBicmVhazsKLQkgICsrcGFyZW5zOwotCX0KLSAgICAgIGVsc2UgaWYgKCpzID09ICcpJykKLQl7Ci0JICBpZiAocGFyZW5zID09IDApCi0JICAgIGJyZWFrOwotCSAgLS1wYXJlbnM7Ci0JfQotICAgICAgZWxzZSBpZiAocGFyZW5zID09IDAKLQkgICAgICAgJiYgKCpzID09ICcsJyB8fCAqcyA9PSAnXScpKQotCWJyZWFrOwotICAgIH0KLQotICB5eWx2YWwuZXhwLnNpemUgPSBTSVpFX1VOU1BFQzsKLSAgaWYgKHMgPD0gc3RyICsgMgotICAgICAgfHwgKHNbLTJdICE9ICcuJyAmJiBzWy0yXSAhPSAnOicpKQotICAgIHRhaWwgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzWy0xXSkKLQl7Ci0JY2FzZSAncyc6Ci0JY2FzZSAnUyc6Ci0JY2FzZSAnYic6Ci0JY2FzZSAnQic6Ci0JICB5eWx2YWwuZXhwLnNpemUgPSBTSVpFX0JZVEU7Ci0JICBicmVhazsKLQljYXNlICd3JzoKLQljYXNlICdXJzoKLQkgIHl5bHZhbC5leHAuc2l6ZSA9IFNJWkVfV09SRDsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCWNhc2UgJ0wnOgotCSAgeXlsdmFsLmV4cC5zaXplID0gU0laRV9MT05HOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICh5eWx2YWwuZXhwLnNpemUgIT0gU0laRV9VTlNQRUMpCi0JdGFpbCA9IDI7Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VMRgotICB7Ci0gICAgLyogTG9vayBmb3IgQFBMVFBDLCBldGMuICAqLwotICAgIGNoYXIgKmNwOwotCi0gICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfbm9uZTsKLSAgICBjcCA9IHMgLSB0YWlsOwotICAgIGlmIChjcCAtIDYgPiBzdHIgJiYgY3BbLTZdID09ICdAJykKLSAgICAgIHsKLQlpZiAoc3RybmNtcCAoY3AgLSA2LCAiQFBMVFBDIiwgNikgPT0gMCkKLQkgIHsKLQkgICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfcGx0X3BjcmVsOwotCSAgICB0YWlsICs9IDY7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgLSA2LCAiQEdPVFBDIiwgNikgPT0gMCkKLQkgIHsKLQkgICAgeXlsdmFsLmV4cC5waWNfcmVsb2MgPSBwaWNfZ290X3BjcmVsOwotCSAgICB0YWlsICs9IDY7Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoY3AgLSA0ID4gc3RyICYmIGNwWy00XSA9PSAnQCcpCi0gICAgICB7Ci0JaWYgKHN0cm5jbXAgKGNwIC0gNCwgIkBQTFQiLCA0KSA9PSAwKQotCSAgewotCSAgICB5eWx2YWwuZXhwLnBpY19yZWxvYyA9IHBpY19wbHRfb2ZmOwotCSAgICB0YWlsICs9IDQ7Ci0JICB9Ci0JZWxzZSBpZiAoc3RybmNtcCAoY3AgLSA0LCAiQEdPVCIsIDQpID09IDApCi0JICB7Ci0JICAgIHl5bHZhbC5leHAucGljX3JlbG9jID0gcGljX2dvdF9vZmY7Ci0JICAgIHRhaWwgKz0gNDsKLQkgIH0KLSAgICAgIH0KLSAgfQotI2VuZGlmCi0KLSAgaWYgKHRhaWwgIT0gMCkKLSAgICB7Ci0gICAgICBjID0gc1stdGFpbF07Ci0gICAgICBzWy10YWlsXSA9IDA7Ci0gICAgfQotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgZXhwcmVzc2lvbiAoJnl5bHZhbC5leHAuZXhwKTsKLSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0gIGlmICh0YWlsICE9IDApCi0gICAgewotICAgICAgc1stdGFpbF0gPSBjOwotICAgICAgc3RyID0gczsKLSAgICB9Ci0KLSAgcmV0dXJuIEVYUFI7Ci19Ci0KLS8qIFBhcnNlIGFuIG02OGsgb3BlcmFuZC4gIFRoaXMgaXMgdGhlIG9ubHkgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkCi0gICBmcm9tIG91dHNpZGUgdGhpcyBmaWxlLiAgKi8KLQotaW50Ci1tNjhrX2lwX29wIChzLCBvcGFyZykKLSAgICAgY2hhciAqczsKLSAgICAgc3RydWN0IG02OGtfb3AgKm9wYXJnOwotewotICBtZW1zZXQgKG9wYXJnLCAwLCBzaXplb2YgKm9wYXJnKTsKLSAgb3BhcmctPmVycm9yID0gTlVMTDsKLSAgb3BhcmctPmluZGV4LnJlZyA9IFpEQVRBMDsKLSAgb3BhcmctPmluZGV4LnNjYWxlID0gMTsKLSAgb3BhcmctPmRpc3AuZXhwLlhfb3AgPSBPX2Fic2VudDsKLSAgb3BhcmctPm9kaXNwLmV4cC5YX29wID0gT19hYnNlbnQ7Ci0KLSAgc3RyID0gc3Ryb3JpZyA9IHM7Ci0gIG9wID0gb3Bhcmc7Ci0KLSAgcmV0dXJuIHl5cGFyc2UgKCk7Ci19Ci0KLS8qIFRoZSBlcnJvciBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXl5ZXJyb3IgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIG9wLT5lcnJvciA9IHM7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL204OGstb3Bjb2RlLmggYi9nYXMvY29uZmlnL204OGstb3Bjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NDY0YmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9tODhrLW9wY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qIG04OGstb3Bjb2RlLmggLS0gSW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAotICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5Ci0gICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTAsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKgotICBDaGFyYWN0ZXIgY29kZXMgZm9yIG9wX3NwZWMgZmllbGQgYmVsb3cuCi0gIFJlc2VydmVkIGZvciBzZWxmLW1hdGNoaW5nOiBbIF0gLAotCi0gIGQgPSBHUkYgRGVzdGluYXRpb24gcmVnaXN0ZXIgKDIxOjUpCi0gIHggPSBYUkYgcmVnaXN0ZXIgcHJlZml4LiAgTWFrZXMgbmV4dCBkLCAxLCBvciAyLCBtYXRjaCBhbiBleHRlbmRlZCByZWdpc3Rlci4KLSAgMSA9IFNvdXJjZSByZWdpc3RlciAxICgxNjo1KQotICAyID0gU291cmNlIHJlZ2lzdGVyIDIgKDA6NSkKLSAgMyA9IEJvdGggc291cmNlIHJlZ2lzdGVycyAoc2FtZSB2YWx1ZSkgKDA6NSBhbmQgMTY6NSkKLSAgSSA9IElNTTE2ICgwOjE2KQotICBiID0gYml0IGZpZWxkIHNwZWMuICgwOjEwKQotICBwID0gMTYgYml0IHBjIGRpc3BsLiAoMDoxNikKLSAgUCA9IDI2IGJpdCBwYyBkaXNwbC4gKDA6MjYpCi0gIEIgPSBiYjAvYmIxIGNvbmRpdGlvbiAoMjE6NSkKLSAgTSA9IGJjbmQgY29uZGl0aW9uICgyMTo1KQotICBmID0gZmNyICg1OjYpCi0gIGMgPSBjciAoNTo2KQotICBWID0gVkVDOSAoMDo5KQotICBvID0gTzYgZmllbGQgb2YgInByb3QiIGluc24gKDEwOjcpCi0gID8gPSBHaXZlIHdhcm5pbmcgZm9yIHRoaXMgaW5zbi9vcGVyYW5kIGNvbWJpbmF0aW9uCi0gKi8KLQotLyogaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KLQotc3RydWN0IG04OGtfb3Bjb2RlCi17Ci0gIHVuc2lnbmVkIGludCBvcGNvZGU7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKm9wX3NwZWM7Ci19OwotCi0vKiBhbmQgaW50cm9kdWNpbmcuLi4gdGhlIE1vdG9yb2xhIDg4MTAwIGFuZCA4ODExMCBpbnN0cnVjdGlvbiBzZXRzLi4uICovCi0KLS8qIEJ5IGRlZmF1bHQsIGluY2x1ZGUgdGhlIDg4MTEwIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIE1DODgxMTAKLQotI2lmIGRlZmluZWQgKE1DODgxMTApCi0jZGVmaW5lIF9NQzg4MTAwKE9QQ09ERSxNTkVNLE9QX1NQRUMpCi0jZGVmaW5lIF9NQzg4MTEwKE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLSNlbHNlCi0jZGVmaW5lIF9NQzg4MTAwKE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLSNkZWZpbmUgX01DODgxMTAoT1BDT0RFLE1ORU0sT1BfU1BFQykKLSNlbmRpZgotCi0jZGVmaW5lIF9NQzg4eHh4KE9QQ09ERSxNTkVNLE9QX1NQRUMpIHtPUENPREUsTU5FTSxPUF9TUEVDfSwKLQotLyogRXF1YWwgbW5lbW9uaWNzIG11c3QgYmUgYWRqYWNlbnQuCi0gICBNb3JlIHNwZWNpZmljIG9wZXJhbmQgc3BlY2lmaWNhdGlvbiBtdXN0IGdvIGJlZm9yZSBtb3JlIGdlbmVyYWwuCi0gICBGb3IgZXhhbXBsZSwgImQsMSwyIiBtdXN0IGdvIGJlZm9yZSAiZCwxLEkiIGFzIGEgcmVnaXN0ZXIgZm9yIHMyCi0gICB3b3VsZCBvdGhlcndpc2UgYmUgY29uc2lkZXJlZCBhIHZhcmlhYmxlIG5hbWUuICAqLwotCi1zdGF0aWMgc3RydWN0IG04OGtfb3Bjb2RlIG04OGtfb3Bjb2Rlc1tdID0KLXsKLSAgLyoJICAgT3Bjb2RlCU1uZW1vbmljCU9wc3BlYyAqLwotCi0gIF9NQzg4eHh4ICgweGY0MDA3MDAwLCAiYWRkIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDcwMDAwMDAwLCAiYWRkIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA3MjAwLCAiYWRkLmNpIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDczMDAsICJhZGQuY2lvIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDcxMDAsICJhZGQuY28iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImFkZHUiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NjAwMDAwMDAsICJhZGR1IiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MjAwLCAiYWRkdS5jaSIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MzAwLCAiYWRkdS5jaW8iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNjEwMCwgImFkZHUuY28iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNDAwMCwgImFuZCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg0MDAwMDAwMCwgImFuZCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNDQwMCwgImFuZC5jIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4NDQwMDAwMDAsICJhbmQudSIsCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGQwMDAwMDAwLCAiYmIwIiwJCSJCLDEscCIpCi0gIF9NQzg4eHh4ICgweGQ0MDAwMDAwLCAiYmIwLm4iLAkiQiwxLHAiKQotICBfTUM4OHh4eCAoMHhkODAwMDAwMCwgImJiMSIsCQkiQiwxLHAiKQotICBfTUM4OHh4eCAoMHhkYzAwMDAwMCwgImJiMS5uIiwJIkIsMSxwIikKLSAgX01DODh4eHggKDB4ZTgwMDAwMDAsICJiY25kIiwJCSJNLDEscCIpCi0gIF9NQzg4eHh4ICgweGVjMDAwMDAwLCAiYmNuZC5uIiwJIk0sMSxwIikKLSAgX01DODh4eHggKDB4YzAwMDAwMDAsICJiciIsCQkiUCIpCi0gIF9NQzg4eHh4ICgweGM0MDAwMDAwLCAiYnIubiIsCQkiUCIpCi0gIF9NQzg4eHh4ICgweGM4MDAwMDAwLCAiYnNyIiwJCSJQIikKLSAgX01DODh4eHggKDB4Y2MwMDAwMDAsICJic3IubiIsCSJQIikKLSAgX01DODh4eHggKDB4ZjQwMDgwMDAsICJjbHIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMDgwMDAsICJjbHIiLAkJImQsMSxiIikKLSAgX01DODh4eHggKDB4ZjQwMDdjMDAsICJjbXAiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4N2MwMDAwMDAsICJjbXAiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc4MDAsICJkaXYiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NzgwMDAwMDAsICJkaXYiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc4MDAsICJkaXZzIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDc4MDAwMDAwLCAiZGl2cyIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmNDAwNjkwMCwgImRpdnUuZCIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2ODAwLCAiZGl2dSIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2ODAwMDAwMCwgImRpdnUiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDkwMDAsICJleHQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjAwMDkwMDAsICJleHQiLAkJImQsMSxiIikKLSAgX01DODh4eHggKDB4ZjQwMDk4MDAsICJleHR1IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDA5ODAwLCAiZXh0dSIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHg4NDAwMjgwMCwgImZhZGQuc3NzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGE4MDAsICJmYWRkLnNzcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyODgwLCAiZmFkZC5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTgyMCwgImZhZGQuc3NkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGE4NDAsICJmYWRkLnNzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyYTAwLCAiZmFkZC5zZHMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTg4MCwgImZhZGQuc2RzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDJhODAsICJmYWRkLnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhOGEwLCAiZmFkZC5zZGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYThjMCwgImZhZGQuc2R4IiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGE5MDAsICJmYWRkLnN4cyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhOTIwLCAiZmFkZC5zeGQiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYTk0MCwgImZhZGQuc3h4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDI4MjAsICJmYWRkLmRzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYTAwLCAiZmFkZC5kc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMjhhMCwgImZhZGQuZHNkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhMjAsICJmYWRkLmRzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYTQwLCAiZmFkZC5kc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMmEyMCwgImZhZGQuZGRzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhODAsICJmYWRkLmRkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyYWEwLCAiZmFkZC5kZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWFhMCwgImZhZGQuZGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFhYzAsICJmYWRkLmRkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYjAwLCAiZmFkZC5keHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWIyMCwgImZhZGQuZHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFiNDAsICJmYWRkLmR4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYzAwLCAiZmFkZC54c3MiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWMyMCwgImZhZGQueHNkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFjNDAsICJmYWRkLnhzeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhYzgwLCAiZmFkZC54ZHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWNhMCwgImZhZGQueGRkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFjYzAsICJmYWRkLnhkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBhZDAwLCAiZmFkZC54eHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYWQyMCwgImZhZGQueHhkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGFkNDAsICJmYWRkLnh4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzYTgwLCAiZmNtcC5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmE4MCwgImZjbXAuc2RkIiwJImQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwM2EwMCwgImZjbXAuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGJhMDAsICJmY21wLnNkcyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGJiMDAsICJmY21wLnNkeCIsCSJkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDM4ODAsICJmY21wLnNzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiODgwLCAiZmNtcC5zc2QiLAkiZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzODAwLCAiZmNtcC5zc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjgwMCwgImZjbXAuc3NzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjkwMCwgImZjbXAuc3N4IiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmM4MCwgImZjbXAuc3hkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmMwMCwgImZjbXAuc3hzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmQwMCwgImZjbXAuc3h4IiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwM2FhMCwgImZjbXB1LnNkZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYWEwLCAiZmNtcHUuc2RkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwM2EyMCwgImZjbXB1LnNkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiYTIwLCAiZmNtcHUuc2RzIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmIyMCwgImZjbXB1LnNkeCIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDM4YTAsICJmY21wdS5zc2QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjhhMCwgImZjbXB1LnNzZCIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDM4MjAsICJmY21wdS5zc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjgyMCwgImZjbXB1LnNzcyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI5MjAsICJmY21wdS5zc3giLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiY2EwLCAiZmNtcHUuc3hkIiwJImQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYmMyMCwgImZjbXB1LnN4cyIsCSJkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGJkMjAsICJmY21wdS5zeHgiLAkiZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDAwODgwLCAiZmN2dC5kcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODg4MCwgImZjdnQuZHMiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODhjMCwgImZjdnQuZHgiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwMDgyMCwgImZjdnQuc2QiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMDg4MjAsICJmY3Z0LnNkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg4NDAsICJmY3Z0LnN4IiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg5MjAsICJmY3Z0LnhkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg5MDAsICJmY3Z0LnhzIiwJInhkLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcwMDAsICJmZGl2LnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMDAwLCAiZmRpdi5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzA4MCwgImZkaXYuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwMjAsICJmZGl2LnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMDQwLCAiZmRpdi5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzIwMCwgImZkaXYuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwODAsICJmZGl2LnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MjgwLCAiZmRpdi5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjBhMCwgImZkaXYuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYwYzAsICJmZGl2LnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMTAwLCAiZmRpdi5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjEyMCwgImZkaXYuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYxNDAsICJmZGl2LnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA3MDIwLCAiZmRpdi5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjIwMCwgImZkaXYuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcwYTAsICJmZGl2LmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMjIwLCAiZmRpdi5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjI0MCwgImZkaXYuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDcyMjAsICJmZGl2LmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMjgwLCAiZmRpdi5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwNzJhMCwgImZkaXYuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGYyYTAsICJmZGl2LmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMmMwLCAiZmRpdi5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjMwMCwgImZkaXYuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGYzMjAsICJmZGl2LmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmMzQwLCAiZmRpdi5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjQwMCwgImZkaXYueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY0MjAsICJmZGl2LnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNDQwLCAiZmRpdi54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjQ4MCwgImZkaXYueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY0YTAsICJmZGl2LnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNGMwLCAiZmRpdi54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjUwMCwgImZkaXYueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY1MjAsICJmZGl2Lnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmNTQwLCAiZmRpdi54eHgiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHhmNDAwZWMwMCwgImZmMCIsCQkiZCwyIikKLSAgX01DODh4eHggKDB4ZjQwMGU4MDAsICJmZjEiLAkJImQsMiIpCi0gIF9NQzg4eHh4ICgweDgwMDA0ODAwLCAiZmxkY3IiLAkiZCxmIikKLSAgX01DODh4eHggKDB4ODQwMDIwMjAsICJmbHQuZHMiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMDIyMjAsICJmbHQuZHMiLAkieGQsMiIpCi0gIF9NQzg4eHh4ICgweDg0MDAyMDAwLCAiZmx0LnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDAyMjAwLCAiZmx0LnNzIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwMjI0MCwgImZsdC54cyIsCSJ4ZCwyIikKLSAgX01DODh4eHggKDB4ODQwMDAwMDAsICJmbXVsLnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MDAwLCAiZm11bC5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDA4MCwgImZtdWwuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwMjAsICJmbXVsLnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MDQwLCAiZm11bC5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDIwMCwgImZtdWwuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwODAsICJmbXVsLnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMjgwLCAiZm11bC5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODBhMCwgImZtdWwuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgwYzAsICJmbXVsLnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MTAwLCAiZm11bC5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODEyMCwgImZtdWwuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgxNDAsICJmbXVsLnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAwMDIwLCAiZm11bC5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwODIwMCwgImZtdWwuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDAwYTAsICJmbXVsLmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MjIwLCAiZm11bC5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODI0MCwgImZtdWwuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDAyMjAsICJmbXVsLmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MjgwLCAiZm11bC5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMDJhMCwgImZtdWwuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMDgyYTAsICJmbXVsLmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MmMwLCAiZm11bC5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODMwMCwgImZtdWwuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDgzMjAsICJmbXVsLmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4MzQwLCAiZm11bC5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODQwMCwgImZtdWwueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg0MjAsICJmbXVsLnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NDQwLCAiZm11bC54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODQ4MCwgImZtdWwueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg0YTAsICJmbXVsLnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NGMwLCAiZm11bC54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwODUwMCwgImZtdWwueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDg1MjAsICJmbXVsLnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDA4NTQwLCAiZm11bC54eHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNzhhMCwgImZzcXJ0LmRkIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmOGEwLCAiZnNxcnQuZGQiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNzg4MCwgImZzcXJ0LmRzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBmODgwLCAiZnNxcnQuZHMiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjhjMCwgImZzcXJ0LmR4IiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDc4MjAsICJmc3FydC5zZCIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjgyMCwgImZzcXJ0LnNkIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMDc4MDAsICJmc3FydC5zcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjgwMCwgImZzcXJ0LnNzIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY4NDAsICJmc3FydC5zeCIsCSJ4ZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBmOTIwLCAiZnNxcnQueGQiLAkieGQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwZjkwMCwgImZzcXJ0LnhzIiwJInhkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGY5NDAsICJmc3FydC54eCIsCSJ4ZCx4MiIpCi0gIF9NQzg4eHh4ICgweDgwMDA4ODAwLCAiZnN0Y3IiLAkiMyxmIikKLSAgX01DODh4eHggKDB4ODQwMDMwMDAsICJmc3ViLnNzcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMDAwLCAiZnN1Yi5zc3MiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzA4MCwgImZzdWIuc3NkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwMjAsICJmc3ViLnNzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMDQwLCAiZnN1Yi5zc3giLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzIwMCwgImZzdWIuc2RzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwODAsICJmc3ViLnNkcyIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMjgwLCAiZnN1Yi5zZGQiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjBhMCwgImZzdWIuc2RkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIwYzAsICJmc3ViLnNkeCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMTAwLCAiZnN1Yi5zeHMiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjEyMCwgImZzdWIuc3hkIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIxNDAsICJmc3ViLnN4eCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDAzMDIwLCAiZnN1Yi5kc3MiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjIwMCwgImZzdWIuZHNzIiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDMwYTAsICJmc3ViLmRzZCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMjIwLCAiZnN1Yi5kc2QiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjI0MCwgImZzdWIuZHN4IiwJInhkLHgxLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDMyMjAsICJmc3ViLmRkcyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMjgwLCAiZnN1Yi5kZHMiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4NDAwMzJhMCwgImZzdWIuZGRkIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODQwMGIyYTAsICJmc3ViLmRkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMmMwLCAiZnN1Yi5kZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjMwMCwgImZzdWIuZHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGIzMjAsICJmc3ViLmR4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiMzQwLCAiZnN1Yi5keHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjQwMCwgImZzdWIueHNzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI0MjAsICJmc3ViLnhzZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNDQwLCAiZnN1Yi54c3giLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjQ4MCwgImZzdWIueGRzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI0YTAsICJmc3ViLnhkZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNGMwLCAiZnN1Yi54ZHgiLAkieGQseDEseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYjUwMCwgImZzdWIueHhzIiwJInhkLHgxLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGI1MjAsICJmc3ViLnh4ZCIsCSJ4ZCx4MSx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBiNTQwLCAiZnN1Yi54eHgiLAkieGQseDEseDIiKQotICBfTUM4OHh4eCAoMHg4MDAwYzgwMCwgImZ4Y3IiLAkJImQsMyxmIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDEsICJpbGxvcDEiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDIsICJpbGxvcDIiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMGZjMDMsICJpbGxvcDMiLAkiIikKLSAgX01DODh4eHggKDB4ODQwMDQ4ODAsICJpbnQuc2QiLAkiZCwyIikKLSAgX01DODgxMTAgKDB4ODQwMGM4ODAsICJpbnQuc2QiLAkiZCx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA0ODAwLCAiaW50LnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBjODAwLCAiaW50LnNzIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzkwMCwgImludC5zeCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ZjQwMGMwMDAsICJqbXAiLAkJIjIiKQotICBfTUM4OHh4eCAoMHhmNDAwYzQwMCwgImptcC5uIiwJIjIiKQotICBfTUM4OHh4eCAoMHhmNDAwYzgwMCwgImpzciIsCQkiMiIpCi0gIF9NQzg4eHh4ICgweGY0MDBjYzAwLCAianNyLm4iLAkiMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxNDAwLCAibGQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDE2MDAsICJsZCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4MTQwMDAwMDAsICJsZCIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmMDAwMTYwMCwgImxkIiwJCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDE0MDAsICJsZCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MDQwMDAwMDAsICJsZCIsCQkieGQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDFlMDAsICJsZC5iIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMWMwMCwgImxkLmIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MWMwMDAwMDAsICJsZC5iIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxZDAwLCAibGQuYi51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMWYwMCwgImxkLmIudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwZTAwLCAibGQuYnUiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDBjMDAsICJsZC5idSIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDBjMDAwMDAwLCAibGQuYnUiLAkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMGQwMCwgImxkLmJ1LnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAwZjAwLCAibGQuYnUudXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxMjAwLCAibGQuZCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDEwMDAsICJsZC5kIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDEwMDAwMDAwLCAibGQuZCIsCQkiZCwxLEkiKQotICBfTUM4ODExMCAoMHhmMDAwMTIwMCwgImxkLmQiLAkJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTAwMCwgImxkLmQiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDAwMDAwMDAwLCAibGQuZCIsCQkieGQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDExMDAsICJsZC5kLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxMzAwLCAibGQuZC51c3IiLAkiZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDExMDAsICJsZC5kLnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMTMwMCwgImxkLmQudXNyIiwJInhkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMWEwMCwgImxkLmgiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAxODAwLCAibGQuaCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHgxODAwMDAwMCwgImxkLmgiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDE5MDAsICJsZC5oLnVzciIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDAxYjAwLCAibGQuaC51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDBhMDAsICJsZC5odSIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDgwMCwgImxkLmh1IiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4MDgwMDAwMDAsICJsZC5odSIsCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwOTAwLCAibGQuaHUudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDBiMDAsICJsZC5odS51c3IiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDE1MDAsICJsZC51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMTcwMCwgImxkLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMTUwMCwgImxkLnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMTcwMCwgImxkLnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDFhMDAsICJsZC54IiwJCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDE4MDAsICJsZC54IiwJCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHgzYzAwMDAwMCwgImxkLngiLAkJInhkLDEsSSIpCi0gIF9NQzg4MTEwICgweGYwMDAxOTAwLCAibGQueC51c3IiLAkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjAwMDFiMDAsICJsZC54LnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDM2MDAsICJsZGEiLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2MDAwLCAibGRhIiwJCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYSIsCQkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuYiIsCSI/ZCwxWzJdIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuYiIsCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYS5iIiwJIj9kLDEsSSIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweGY0MDAzMjAwLCAibGRhLmQiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDYwMDAsICJsZGEuZCIsCSI/ZCwxLDIiKQkvKiBPdXRwdXQgYWRkdSAqLwotICBfTUM4OHh4eCAoMHg2MDAwMDAwMCwgImxkYS5kIiwJIj9kLDEsSSIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4MTEwICgweGY0MDAzZTAwLCAibGRhLngiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDNhMDAsICJsZGEuaCIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwNjAwMCwgImxkYS5oIiwJIj9kLDEsMiIpCS8qIE91dHB1dCBhZGR1ICovCi0gIF9NQzg4eHh4ICgweDYwMDAwMDAwLCAibGRhLmgiLAkiP2QsMSxJIikJLyogT3V0cHV0IGFkZHUgKi8KLSAgX01DODh4eHggKDB4ODAwMDQwMDAsICJsZGNyIiwJCSJkLGMiKQotICBfTUM4OHh4eCAoMHhmNDAwYTAwMCwgIm1hayIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmMDAwYTAwMCwgIm1hayIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHg0ODAwMDAwMCwgIm1hc2siLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4NGMwMDAwMDAsICJtYXNrLnUiLAkiZCwxLEkiKQotICBfTUM4ODExMCAoMHg4NDAwYzAwMCwgIm1vdi5zIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNDIwMCwgIm1vdi5zIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzA4MCwgIm1vdi5kIiwJImQseDIiKQotICBfTUM4ODExMCAoMHg4NDAwNDI4MCwgIm1vdi5kIiwJInhkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwYzMwMCwgIm1vdiIsCQkieGQseDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNmMwMCwgIm11bCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2YzAwMDAwMCwgIm11bCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwNmUwMCwgIm11bHMiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NmMwMDAwMDAsICJtdWxzIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA2YzAwLCAibXVsdSIsCQkiZCwxLDIiKQkvKiBzeW5vbnltIGZvciBtdWwgKi8KLSAgX01DODh4eHggKDB4NmMwMDAwMDAsICJtdWx1IiwJCSJkLDEsSSIpCS8qIHN5bm9ueW0gZm9yIG11bCAqLwotICBfTUM4ODExMCAoMHhmNDAwNmQwMCwgIm11bHUuZCIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDg0MDA1MDgwLCAibmludC5zZCIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZDA4MCwgIm5pbnQuc2QiLAkiZCx4MiIpCi0gIF9NQzg4eHh4ICgweDg0MDA1MDAwLCAibmludC5zcyIsCSJkLDIiKQotICBfTUM4ODExMCAoMHg4NDAwZDAwMCwgIm5pbnQuc3MiLAkiZCx4MiIpCi0gIF9NQzg4MTEwICgweDg0MDBkMTAwLCAibmludC5zeCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ZjQwMDU4MDAsICJvciIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1ODAwMDAwMCwgIm9yIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1YzAwLCAib3IuYyIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1YzAwMDAwMCwgIm9yLnUiLAkJImQsMSxJIikKLSAgX01DODgxMTAgKDB4ODgwMDIwMjAsICJwYWRkLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjA0MCwgInBhZGQuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMDYwLCAicGFkZCIsCQkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjBhMCwgInBhZGRzLnUuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMGMwLCAicGFkZHMudS5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIwZTAsICJwYWRkcy51IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxMjAsICJwYWRkcy51cy5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxNDAsICJwYWRkcy51cy5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxNjAsICJwYWRkcy51cyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAyMWEwLCAicGFkZHMucy5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDIxYzAsICJwYWRkcy5zLmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMjFlMCwgInBhZGRzLnMiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzg2MCwgInBjbXAiLAkJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDAwMDAsICJwbXVsIiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2NDIwLCAicHBhY2suMzIuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MjQwLCAicHBhY2suMTYuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2NDQwLCAicHBhY2suMzIuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MTYwLCAicHBhY2suOCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2MjYwLCAicHBhY2suMTYiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwNjQ2MCwgInBwYWNrLjMyIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDc4MDAsICJwcm90IiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA3MDAwLCAicHJvdCIsCQkiZCwxLG8iKQotICBfTUM4ODExMCAoMHg4ODAwMzAyMCwgInBzdWIuYiIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMDQwLCAicHN1Yi5oIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMwNjAsICJwc3ViIiwJCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMGEwLCAicHN1YnMudS5iIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMwYzAsICJwc3Vicy51LmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzBlMCwgInBzdWJzLnUiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzEyMCwgInBzdWJzLnVzLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzE0MCwgInBzdWJzLnVzLmgiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzE2MCwgInBzdWJzLnVzIiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ODgwMDMxYTAsICJwc3Vicy5zLmIiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHg4ODAwMzFjMCwgInBzdWJzLnMuaCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDAzMWUwLCAicHN1YnMucyIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweDg4MDA2ODAwLCAicHVucGsubiIsCSJkLDEiKQotICBfTUM4ODExMCAoMHg4ODAwNjgyMCwgInB1bnBrLmIiLAkiZCwxIikKLSAgX01DODgxMTAgKDB4ODgwMDY4NDAsICJwdW5way5oIiwJImQsMSIpCi0gIF9NQzg4eHh4ICgweGY0MDBhODAwLCAicm90IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDBhODAwLCAicm90IiwJCSJkLDEsYiIpCi0gIF9NQzg4eHh4ICgweGY0MDBmYzAwLCAicnRlIiwJCSIiKQotICBfTUM4OHh4eCAoMHhmNDAwODgwMCwgInNldCIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmMDAwODgwMCwgInNldCIsCQkiZCwxLGIiKQotICBfTUM4OHh4eCAoMHhmNDAwMjYwMCwgInN0IiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjQwMCwgInN0IiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDI0MDAwMDAwLCAic3QiLAkJImQsMSxJIikKLSAgX01DODgxMTAgKDB4ZjAwMDI2MDAsICJzdCIsCQkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyNDAwLCAic3QiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDM0MDAwMDAwLCAic3QiLAkJInhkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyZTAwLCAic3QuYiIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDJjMDAsICJzdC5iIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDJjMDAwMDAwLCAic3QuYiIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMmQwMCwgInN0LmIudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDJmMDAsICJzdC5iLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMmQ4MCwgInN0LmIudXNyLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDJmODAsICJzdC5iLnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMmM4MCwgInN0LmIud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMmU4MCwgInN0LmIud3QiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDIyMDAsICJzdC5kIiwJCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMjAwMCwgInN0LmQiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4MjAwMDAwMDAsICJzdC5kIiwJCSJkLDEsSSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMjAwLCAic3QuZCIsCQkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMDAwLCAic3QuZCIsCQkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4MzAwMDAwMDAsICJzdC5kIiwJCSJ4ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMjEwMCwgInN0LmQudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDIzMDAsICJzdC5kLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjEwMCwgInN0LmQudXNyIiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyMzAwLCAic3QuZC51c3IiLAkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGY0MDAyMTgwLCAic3QuZC51c3Iud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMjM4MCwgInN0LmQudXNyLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMTgwLCAic3QuZC51c3Iud3QiLAkieGQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjAwMDIzODAsICJzdC5kLnVzci53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDIwODAsICJzdC5kLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDIyODAsICJzdC5kLnd0IiwJImQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyMDgwLCAic3QuZC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjI4MCwgInN0LmQud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAyYTAwLCAic3QuaCIsCQkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDI4MDAsICJzdC5oIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDI4MDAwMDAwLCAic3QuaCIsCQkiZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMjkwMCwgInN0LmgudXNyIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDJiMDAsICJzdC5oLnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjk4MCwgInN0LmgudXNyLnd0IiwJImQsMSwyIikKLSAgX01DODgxMTAgKDB4ZjQwMDJiODAsICJzdC5oLnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmNDAwMjg4MCwgInN0Lmgud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMmE4MCwgInN0Lmgud3QiLAkiZCwxWzJdIikKLSAgX01DODh4eHggKDB4ZjQwMDI1MDAsICJzdC51c3IiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwMjcwMCwgInN0LnVzciIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjUwMCwgInN0LnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjcwMCwgInN0LnVzciIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDI1ODAsICJzdC51c3Iud3QiLAkiZCwxLDIiKQotICBfTUM4ODExMCAoMHhmNDAwMjc4MCwgInN0LnVzci53dCIsCSJkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjU4MCwgInN0LnVzci53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjc4MCwgInN0LnVzci53dCIsCSJ4ZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjQwMDI0ODAsICJzdC53dCIsCSJkLDEsMiIpCi0gIF9NQzg4MTEwICgweGY0MDAyNjgwLCAic3Qud3QiLAkiZCwxWzJdIikKLSAgX01DODgxMTAgKDB4ZjAwMDI0ODAsICJzdC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMjY4MCwgInN0Lnd0IiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMmEwMCwgInN0LngiLAkJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjgwMCwgInN0LngiLAkJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweDM4MDAwMDAwLCAic3QueCIsCQkieGQsMSxJIikKLSAgX01DODgxMTAgKDB4ZjAwMDI5MDAsICJzdC54LnVzciIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMmIwMCwgInN0LngudXNyIiwJInhkLDFbMl0iKQotICBfTUM4ODExMCAoMHhmMDAwMjk4MCwgInN0LngudXNyLnd0IiwJInhkLDEsMiIpCi0gIF9NQzg4MTEwICgweGYwMDAyYjgwLCAic3QueC51c3Iud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4MTEwICgweGYwMDAyODgwLCAic3QueC53dCIsCSJ4ZCwxLDIiKQotICBfTUM4ODExMCAoMHhmMDAwMmE4MCwgInN0Lngud3QiLAkieGQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweDgwMDA4MDAwLCAic3RjciIsCQkiMyxjIikKLSAgX01DODh4eHggKDB4ZjQwMDc0MDAsICJzdWIiLAkJImQsMSwyIikKLSAgX01DODh4eHggKDB4NzQwMDAwMDAsICJzdWIiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDc2MDAsICJzdWIuY2kiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNzcwMCwgInN1Yi5jaW8iLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHhmNDAwNzUwMCwgInN1Yi5jbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2NDAwLCAic3VidSIsCQkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg2NDAwMDAwMCwgInN1YnUiLAkJImQsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDY2MDAsICJzdWJ1LmNpIiwJImQsMSwyIikKLSAgX01DODh4eHggKDB4ZjQwMDY3MDAsICJzdWJ1LmNpbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGY0MDA2NTAwLCAic3VidS5jbyIsCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweGYwMDBkMDAwLCAidGIwIiwJCSJCLDEsViIpCi0gIF9NQzg4eHh4ICgweGYwMDBkODAwLCAidGIxIiwJCSJCLDEsViIpCi0gIF9NQzg4eHh4ICgweGY0MDBmODAwLCAidGJuZCIsCQkiMSwyIikKLSAgX01DODh4eHggKDB4ZjgwMDAwMDAsICJ0Ym5kIiwJCSIxLEkiKQotICBfTUM4OHh4eCAoMHhmMDAwZTgwMCwgInRjbmQiLAkJIk0sMSxWIikKLSAgX01DODh4eHggKDB4ODQwMDU4ODAsICJ0cm5jLnNkIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBkODgwLCAidHJuYy5zZCIsCSJkLHgyIikKLSAgX01DODh4eHggKDB4ODQwMDU4MDAsICJ0cm5jLnNzIiwJImQsMiIpCi0gIF9NQzg4MTEwICgweDg0MDBkODAwLCAidHJuYy5zcyIsCSJkLHgyIikKLSAgX01DODgxMTAgKDB4ODQwMGQ5MDAsICJ0cm5jLnN4IiwJImQseDIiKQotICBfTUM4OHh4eCAoMHg4MDAwYzAwMCwgInhjciIsCQkiZCwzLGMiKQotICBfTUM4OHh4eCAoMHhmNDAwMDYwMCwgInhtZW0iLAkJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNDAwLCAieG1lbSIsCQkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwNDAwMDAwMCwgInhtZW0iLAkJIj9kLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwMjAwLCAieG1lbS5idSIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDAwMCwgInhtZW0uYnUiLAkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwMDAwMDAwMCwgInhtZW0uYnUiLAkiP2QsMSxJIikKLSAgX01DODh4eHggKDB4ZjQwMDAzMDAsICJ4bWVtLmJ1LnVzciIsCSJkLDFbMl0iKQotICBfTUM4OHh4eCAoMHhmNDAwMDEwMCwgInhtZW0uYnUudXNyIiwJImQsMSwyIikKLSAgX01DODgxMDAgKDB4MDAwMDAxMDAsICJ4bWVtLmJ1LnVzciIsCSI/ZCwxLEkiKQotICBfTUM4OHh4eCAoMHhmNDAwMDcwMCwgInhtZW0udXNyIiwJImQsMVsyXSIpCi0gIF9NQzg4eHh4ICgweGY0MDAwNTAwLCAieG1lbS51c3IiLAkiZCwxLDIiKQotICBfTUM4ODEwMCAoMHgwNDAwMDEwMCwgInhtZW0udXNyIiwJIj9kLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1MDAwLCAieG9yIiwJCSJkLDEsMiIpCi0gIF9NQzg4eHh4ICgweDUwMDAwMDAwLCAieG9yIiwJCSJkLDEsSSIpCi0gIF9NQzg4eHh4ICgweGY0MDA1NDAwLCAieG9yLmMiLAkiZCwxLDIiKQotICBfTUM4OHh4eCAoMHg1NDAwMDAwMCwgInhvci51IiwJImQsMSxJIikKLSAgX01DODh4eHggKDB4MDAwMDAwMDAsICIiLAkJMCkKLX07Ci0KLSNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBtODhrX29wY29kZXMpLyhzaXplb2YgbTg4a19vcGNvZGVzWzBdKSkKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWFvdXQuYyBiL2dhcy9jb25maWcvb2JqLWFvdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZjRkOC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1hb3V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyogYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi1vciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci1XSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSN1bmRlZiBOT19SRUxPQwotI2luY2x1ZGUgImFvdXQvYW91dDY0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogaW46IHNlZ1QgICBvdXQ6IE5fVFlQRSBiaXRzICovCi1jb25zdCBzaG9ydCBzZWdfTl9UWVBFW10gPQotewotICBOX0FCUywKLSAgTl9URVhULAotICBOX0RBVEEsCi0gIE5fQlNTLAotICBOX1VOREYsCQkJLyogdW5rbm93biAqLwotICBOX1VOREYsCQkJLyogZXJyb3IgKi8KLSAgTl9VTkRGLAkJCS8qIGV4cHJlc3Npb24gKi8KLSAgTl9VTkRGLAkJCS8qIGRlYnVnICovCi0gIE5fVU5ERiwJCQkvKiBudHYgKi8KLSAgTl9VTkRGLAkJCS8qIHB0diAqLwotICBOX1JFR0lTVEVSLAkJCS8qIHJlZ2lzdGVyICovCi19OwotCi1jb25zdCBzZWdUIE5fVFlQRV9zZWdbTl9UWVBFICsgMl0gPQotewkJCQkvKiBOX1RZUEUgPT0gMHgxRSA9IDMyLTIgKi8KLSAgU0VHX1VOS05PV04sCQkJLyogTl9VTkRGID09IDAgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19BQlNPTFVURSwJCQkvKiBOX0FCUyA9PSAyICovCi0gIFNFR19HT09GLAotICBTRUdfVEVYVCwJCQkvKiBOX1RFWFQgPT0gNCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0RBVEEsCQkJLyogTl9EQVRBID09IDYgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19CU1MsCQkJLyogTl9CU1MgPT0gOCAqLwotICBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfUkVHSVNURVIsCQkJLyogZHVtbXkgTl9SRUdJU1RFUiBmb3IgcmVncyA9IDMwICovCi0gIFNFR19HT09GLAotfTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBvYmpfYW91dF9saW5lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2FvdXRfd2VhayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9hb3V0X3R5cGUgUEFSQU1TICgoaW50KSk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7ImxpbmUiLCBvYmpfYW91dF9saW5lLCAwfSwJLyogc291cmNlIGNvZGUgbGluZSBudW1iZXIgKi8KLSAgeyJsbiIsIG9ial9hb3V0X2xpbmUsIDB9LAkvKiBjb2ZmIGxpbmUgbnVtYmVyIHRoYXQgd2UgdXNlIGFueXdheSAqLwotCi0gIHsid2VhayIsIG9ial9hb3V0X3dlYWssIDB9LAkvKiBtYXJrIHN5bWJvbCBhcyB3ZWFrLiAgKi8KLQotICB7InR5cGUiLCBvYmpfYW91dF90eXBlLCAwfSwKLQotICAvKiBjb2ZmIGRlYnVnIHBzZXVkb3MgKGlnbm9yZWQpICovCi0gIHsiZGVmIiwgc19pZ25vcmUsIDB9LAotICB7ImRpbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmRlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJpZGVudCIsIHNfaWdub3JlLCAwfSwKLSAgeyJsaW5lIiwgc19pZ25vcmUsIDB9LAotICB7ImxuIiwgc19pZ25vcmUsIDB9LAotICB7InNjbCIsIHNfaWdub3JlLCAwfSwKLSAgeyJzaXplIiwgc19pZ25vcmUsIDB9LAotICB7InRhZyIsIHNfaWdub3JlLCAwfSwKLSAgeyJ2YWwiLCBzX2lnbm9yZSwgMH0sCi0gIHsidmVyc2lvbiIsIHNfaWdub3JlLCAwfSwKLQotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAkvKiBGb3Igc3VuMzg2aSBjYyAoPykgKi8KLQotICAvKiBvdGhlciBzdHVmZiAqLwotICB7IkFCT1JUIiwgc19hYm9ydCwgMH0sCi0KLSAge05VTEx9CQkJLyogZW5kIHNlbnRpbmVsICovCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotb2JqX2FvdXRfZnJvYl9zeW1ib2wgKHN5bSwgcHVudCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBpbnQgKnB1bnQ7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBhc2VjdGlvbiAqc2VjOwotICBpbnQgZGVzYywgdHlwZSwgb3RoZXI7Ci0KLSAgZmxhZ3MgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3M7Ci0gIGRlc2MgPSBTX0dFVF9ERVNDIChzeW0pOwotICB0eXBlID0gU19HRVRfVFlQRSAoc3ltKTsKLSAgb3RoZXIgPSBTX0dFVF9PVEhFUiAoc3ltKTsKLSAgc2VjID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotICAvKiBPbmx5IGZyb2Igc2ltcGxlIHN5bWJvbHMgdGhpcyB3YXkgcmlnaHQgbm93LiAgKi8KLSAgaWYgKCEgKHR5cGUgJiB+IChOX1RZUEUgfCBOX0VYVCkpKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09IChOX1VOREYgfCBOX0VYVCkKLQkgICYmIHNlYyA9PSAmYmZkX2Fic19zZWN0aW9uKQotCXsKLQkgIHNlYyA9IGJmZF91bmRfc2VjdGlvbl9wdHI7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW0sIHNlYyk7Ci0JfQotCi0gICAgICBpZiAoKHR5cGUgJiBOX1RZUEUpICE9IE5fSU5EUgotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQQotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUVAotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VURAotCSAgJiYgKHR5cGUgJiBOX1RZUEUpICE9IE5fU0VUQgotCSAgJiYgdHlwZSAhPSBOX1dBUk5JTkcKLQkgICYmIChzZWMgPT0gJmJmZF9hYnNfc2VjdGlvbgotCSAgICAgIHx8IHNlYyA9PSAmYmZkX3VuZF9zZWN0aW9uKSkKLQlyZXR1cm47Ci0gICAgICBpZiAoZmxhZ3MgJiBCU0ZfRVhQT1JUKQotCXR5cGUgfD0gTl9FWFQ7Ci0KLSAgICAgIHN3aXRjaCAodHlwZSAmIE5fVFlQRSkKLQl7Ci0JY2FzZSBOX1NFVEE6Ci0JY2FzZSBOX1NFVFQ6Ci0JY2FzZSBOX1NFVEQ6Ci0JY2FzZSBOX1NFVEI6Ci0JICAvKiBTZXQgdGhlIGRlYnVnZ2luZyBmbGFnIGZvciBjb25zdHJ1Y3RvciBzeW1ib2xzIHNvIHRoYXQKLQkgICAgIEJGRCBsZWF2ZXMgdGhlbSBhbG9uZS4gICovCi0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLQotCSAgLyogWW91IGNhbid0IHB1dCBhIGNvbW1vbiBzeW1ib2wgaW4gYSBzZXQuICBUaGUgd2F5IGEgc2V0Ci0JICAgICBlbGVtZW50IHdvcmtzIGlzIHRoYXQgdGhlIHN5bWJvbCBoYXMgYSBkZWZpbml0aW9uIGFuZCBhCi0JICAgICBuYW1lLCBhbmQgdGhlIGxpbmtlciBhZGRzIHRoZSBkZWZpbml0aW9uIHRvIHRoZSBzZXQgb2YKLQkgICAgIHRoYXQgbmFtZS4gIFRoYXQgZG9lcyBub3Qgd29yayBmb3IgYSBjb21tb24gc3ltYm9sLAotCSAgICAgYmVjYXVzZSB0aGUgbGlua2VyIGNhbid0IHRlbGwgd2hpY2ggY29tbW9uIHN5bWJvbCB0aGUKLQkgICAgIHVzZXIgbWVhbnMuICBGSVhNRTogVXNpbmcgYXNfYmFkIGhlcmUgbWF5IGJlCi0JICAgICBpbmFwcHJvcHJpYXRlLCBzaW5jZSB0aGUgdXNlciBtYXkgd2FudCB0byBmb3JjZSBhCi0JICAgICBwYXJ0aWN1bGFyIHR5cGUgd2l0aG91dCByZWdhcmQgdG8gdGhlIHNlbWFudGljcyBvZiBzZXRzOwotCSAgICAgb24gdGhlIG90aGVyIGhhbmQsIHdlIGNlcnRhaW5seSBkb24ndCB3YW50IGFueWJvZHkgdG8gYmUKLQkgICAgIG1pc2xlYWQgaW50byB0aGlua2luZyB0aGF0IHRoZWlyIGNvZGUgd2lsbCB3b3JrLiAgKi8KLQkgIGlmIChTX0lTX0NPTU1PTiAoc3ltKSkKLQkgICAgYXNfYmFkIChfKCJBdHRlbXB0IHRvIHB1dCBhIGNvbW1vbiBzeW1ib2wgaW50byBzZXQgJXMiKSwKLQkJICAgIFNfR0VUX05BTUUgKHN5bSkpOwotCSAgLyogU2ltaWxhcmx5LCB5b3UgY2FuJ3QgcHV0IGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gYSBzZXQuICAqLwotCSAgZWxzZSBpZiAoISBTX0lTX0RFRklORUQgKHN5bSkpCi0JICAgIGFzX2JhZCAoXygiQXR0ZW1wdCB0byBwdXQgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbnRvIHNldCAlcyIpLAotCQkgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0KLQkgIGJyZWFrOwotCWNhc2UgTl9JTkRSOgotCSAgLyogUHV0IGluZGlyZWN0IHN5bWJvbHMgaW4gdGhlIGluZGlyZWN0IHNlY3Rpb24uICAqLwotCSAgU19TRVRfU0VHTUVOVCAoc3ltLCBiZmRfaW5kX3NlY3Rpb25fcHRyKTsKLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfSU5ESVJFQ1Q7Ci0JICBpZiAodHlwZSAmIE5fRVhUKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9FWFBPUlQ7Ci0JICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzICY9fiBCU0ZfTE9DQUw7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgTl9XQVJOSU5HOgotCSAgLyogTWFyayB3YXJuaW5nIHN5bWJvbHMuICAqLwotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9XQVJOSU5HOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICAgIH0KLQotICBTX1NFVF9UWVBFIChzeW0sIHR5cGUpOwotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoU19JU19XRUFLIChzeW0pKQotICAgIHsKLSAgICAgIGlmIChTX0lTX0NPTU1PTiAoc3ltKSkKLQlhc19iYWQgKF8oIlN5bWJvbCBgJXMnIGNhbiBub3QgYmUgYm90aCB3ZWFrIGFuZCBjb21tb24iKSwKLQkJU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgfQotfQotCi12b2lkCi1vYmpfYW91dF9mcm9iX2ZpbGUgKCkKLXsKLSAgLyogUmVsb2NhdGlvbiBwcm9jZXNzaW5nIG1heSByZXF1aXJlIGtub3dpbmcgdGhlIFZNQXMgb2YgdGhlIHNlY3Rpb25zLgotICAgICBTaW5jZSB3cml0aW5nIHRvIGEgc2VjdGlvbiB3aWxsIGNhdXNlIHRoZSBCRkQgYmFjayBlbmQgdG8gY29tcHV0ZSB0aGUKLSAgICAgVk1BcywgZmFrZSBpdCBvdXQgaGVyZS4uLi4gICovCi0gIGJmZF9ieXRlIGIgPSAwOwotICBib29sZWFuIHggPSB0cnVlOwotICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24pICE9IDApCi0gICAgewotICAgICAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCB0ZXh0X3NlY3Rpb24sICZiLCAoZmlsZV9wdHIpIDAsCi0JCQkJICAgIChiZmRfc2l6ZV90eXBlKSAxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uKSAhPSAwKQotICAgIHsKLSAgICAgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgZGF0YV9zZWN0aW9uLCAmYiwgKGZpbGVfcHRyKSAwLAotCQkJCSAgICAoYmZkX3NpemVfdHlwZSkgMSk7Ci0gICAgfQotICBhc3NlcnQgKHggPT0gdHJ1ZSk7Ci19Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBSZWxvY2F0aW9uLiAqLwotCi0vKgotICoJCWVtaXRfcmVsb2NhdGlvbnMoKQotICoKLSAqIENyYXdsIGFsb25nIGEgZml4UyBjaGFpbi4gRW1pdCB0aGUgc2VnbWVudCdzIHJlbG9jYXRpb25zLgotICovCi12b2lkCi1vYmpfZW1pdF9yZWxvY2F0aW9ucyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7CQkvKiBGaXh1cCBjaGFpbiBmb3IgdGhpcyBzZWdtZW50LiAqLwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIGlmIChmaXhQLT5meF9kb25lID09IDApCi0gICAgICB7Ci0Jc3ltYm9sUyAqc3ltOwotCi0Jc3ltID0gZml4UC0+ZnhfYWRkc3k7Ci0Jd2hpbGUgKHN5bS0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCSAgc3ltID0gc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JZml4UC0+ZnhfYWRkc3kgPSBzeW07Ci0KLQlpZiAoISBzeW0tPnN5X3Jlc29sdmVkICYmICEgU19JU19ERUZJTkVEIChzeW0pKQotCSAgewotCSAgICBjaGFyICpmaWxlOwotCSAgICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCSAgICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKHN5bSwgJmZpbGUsICZsaW5lKSkKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oInVucmVzb2x2ZWQgcmVsb2NhdGlvbiIpKTsKLQkgICAgZWxzZQotCSAgICAgIGFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiKSwKLQkJICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0JICB9Ci0KLQl0Y19hb3V0X2ZpeF90b19jaGFycyAoKndoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSk7Ci0JKndoZXJlICs9IG1kX3JlbG9jX3NpemU7Ci0gICAgICB9Ci19Ci0KLSNpZm5kZWYgb2JqX2hlYWRlcl9hcHBlbmQKLS8qIEFvdXQgZmlsZSBnZW5lcmF0aW9uICYgdXRpbGl0aWVzICovCi12b2lkCi1vYmpfaGVhZGVyX2FwcGVuZCAod2hlcmUsIGhlYWRlcnMpCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHRjX2hlYWRlcnNfaG9vayAoaGVhZGVycyk7Ci0KLSNpZmRlZiBDUk9TU19DT01QSUxFCi0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9pbmZvLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2luZm8pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfaW5mbyk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV90ZXh0LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3RleHQpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9kYXRhLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2RhdGEpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9ic3MsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Jzcyk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9zeW1zLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3N5bXMpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcyk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9lbnRyeSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSk7Ci0KLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmaGVhZGVycy0+aGVhZGVyLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlcikpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotfQotI2VuZGlmIC8qICEgZGVmaW5lZCAob2JqX2hlYWRlcl9hcHBlbmQpICovCi0KLXZvaWQKLW9ial9zeW1ib2xfdG9fY2hhcnMgKHdoZXJlLCBzeW1ib2xQKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihTX0dFVF9PRkZTRVQgKHN5bWJvbFApKSwgU19HRVRfT0ZGU0VUIChzeW1ib2xQKSwgc2l6ZW9mIChTX0dFVF9PRkZTRVQgKHN5bWJvbFApKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihTX0dFVF9ERVNDIChzeW1ib2xQKSksIFNfR0VUX0RFU0MgKHN5bWJvbFApLCBzaXplb2YgKFNfR0VUX0RFU0MgKHN5bWJvbFApKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoKGNoYXIgKikgJihzeW1ib2xQLT5zeV9zeW1ib2wubl92YWx1ZSksIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZW9mIChzeW1ib2xQLT5zeV9zeW1ib2wubl92YWx1ZSkpOwotCi0gIGFwcGVuZCAod2hlcmUsIChjaGFyICopICZzeW1ib2xQLT5zeV9zeW1ib2wsIHNpemVvZiAob2JqX3N5bWJvbF90eXBlKSk7Ci19Ci0KLXZvaWQKLW9ial9lbWl0X3N5bWJvbHMgKHdoZXJlLCBzeW1ib2xfcm9vdFApCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qIEVtaXQgYWxsIHN5bWJvbHMgbGVmdCBpbiB0aGUgc3ltYm9sIGNoYWluLiAgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qIFVzZWQgdG8gc2F2ZSB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lLiBJdCBpcyB1c2VkIHRvIHBvaW50Ci0JIHRvIHRoZSBzdHJpbmcgaW4gbWVtb3J5IGJ1dCBtdXN0IGJlIGEgZmlsZSBvZmZzZXQuICovCi0gICAgICByZWdpc3RlciBjaGFyICp0ZW1wOwotCi0gICAgICB0ZW1wID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9PRkZTRVQgKHN5bWJvbFAsIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0KTsKLQotICAgICAgLyogQW55IHN5bWJvbCBzdGlsbCB1bmRlZmluZWQgYW5kIGlzIG5vdCBhIGRiZyBzeW1ib2wgaXMgbWFkZSBOX0VYVC4gKi8KLSAgICAgIGlmICghU19JU19ERUJVRyAoc3ltYm9sUCkgJiYgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCi0gICAgICAvKiBBZGp1c3QgdGhlIHR5cGUgb2YgYSB3ZWFrIHN5bWJvbC4gICovCi0gICAgICBpZiAoU19HRVRfV0VBSyAoc3ltYm9sUCkpCi0JewotCSAgc3dpdGNoIChTX0dFVF9UWVBFIChzeW1ib2xQKSkKLQkgICAgewotCSAgICBjYXNlIE5fVU5ERjogU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLVSk7IGJyZWFrOwotCSAgICBjYXNlIE5fQUJTOgkgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLQSk7IGJyZWFrOwotCSAgICBjYXNlIE5fVEVYVDogU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLVCk7IGJyZWFrOwotCSAgICBjYXNlIE5fREFUQTogU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLRCk7IGJyZWFrOwotCSAgICBjYXNlIE5fQlNTOiAgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9XRUFLQik7IGJyZWFrOwotCSAgICBkZWZhdWx0OiBhc19iYWQgKF8oIiVzOiBiYWQgdHlwZSBmb3Igd2VhayBzeW1ib2wiKSwgdGVtcCk7IGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBvYmpfc3ltYm9sX3RvX2NoYXJzICh3aGVyZSwgc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9OQU1FIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotc3RhdGljIHZvaWQKLW9ial9hb3V0X2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogQXNzdW1lIGRlbGltaXRlciBpcyBwYXJ0IG9mIGV4cHJlc3Npb24uCi0gICAgIEJTRDQuMiBhcyBmYWlscyB3aXRoIGRlbGlnaHRmdWwgYnVnLCBzbyB3ZQotICAgICBhcmUgbm90IGJlaW5nIGluY29tcGF0aWJsZSBoZXJlLiAqLwotICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCAoaW50KSAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogb2JqX2FvdXRfbGluZSgpICovCi0KLS8qIEhhbmRsZSAud2Vhay4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9hb3V0X3dlYWsgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSAudHlwZS4gIE9uIHtOZXQsT3Blbn1CU0QsIHRoaXMgaXMgdXNlZCB0byBzZXQgdGhlIG5fb3RoZXIgZmllbGQsCi0gICB3aGljaCBpcyB0aGVuIGFwcGFyZW50bHkgdXNlZCB3aGVuIGRvaW5nIGR5bmFtaWMgbGlua2luZy4gIE9sZGVyCi0gICB2ZXJzaW9ucyBvZ2FzIGlnbm9yZWQgdGhlIC50eXBlIHBzZXVkby1vcCwgc28gd2UgYWxzbyBpZ25vcmUgaXQgaWYKLSAgIHdlIGNhbid0IHBhcnNlIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9hb3V0X3R5cGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGlmIChzeW0gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcpCi0JICAgIHsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAib2JqZWN0IiwgNikgPT0gMCkKLQkJU19TRVRfT1RIRVIgKHN5bSwgMSk7Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZnVuY3Rpb24iLCA4KSA9PSAwKQotCQlTX1NFVF9PVEhFUiAoc3ltLCAyKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSWdub3JlIGV2ZXJ5dGhpbmcgZWxzZSBvbiB0aGUgbGluZS4gICovCi0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotb2JqX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN5bWJvbFMgKipzeW1ib2xQUDsKLSAgaW50IHN5bWJvbF9udW1iZXIgPSAwOwotCi0gIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycyk7Ci0KLSAgc3ltYm9sUFAgPSAmc3ltYm9sX3Jvb3RQOwkvKi0+bGFzdCBzeW1ib2wgY2hhaW4gbGluay4gKi8KLSAgd2hpbGUgKChzeW1ib2xQID0gKnN5bWJvbFBQKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xQLT5zeV9tcmlfY29tbW9uKQotCXsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSkKLQkgICAgYXNfYmFkIChfKCIlczogZ2xvYmFsIHN5bWJvbHMgbm90IHN1cHBvcnRlZCBpbiBjb21tb24gc2VjdGlvbnMiKSwKLQkJICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ICYmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkpCi0JewotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX1RFWFQpOwotCX0JCQkvKiBpZiBwdXNpbmcgZGF0YSBpbnRvIHRleHQgKi8KLQotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgc3ltYm9scy4gICovCi0gICAgICBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpKQotCXsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogT0ssIGhlcmUgaXMgaG93IHdlIGRlY2lkZSB3aGljaCBzeW1ib2xzIGdvIG91dCBpbnRvIHRoZSBicmF2ZQotCSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQotCSAqIHN5bWJvbHMgd2l0aCBubyBuYW1lIChzdGFiZCdzPykKLQkgKiBzeW1ib2xzIHdpdGggZGVidWcgaW5mbyBpbiB0aGVpciBOX1RZUEUKLQotCSBTeW1ib2xzIHRoYXQgZG9uJ3QgYXJlOgotCSAqIHN5bWJvbHMgdGhhdCBhcmUgcmVnaXN0ZXJzCi0JICogc3ltYm9scyB3aXRoIFwxIGFzIHRoZWlyIDNyZCBjaGFyYWN0ZXIgKG51bWVyaWMgbGFiZWxzKQotCSAqICJsb2NhbCBsYWJlbHMiIGFzIGRlZmluZWQgYnkgU19MT0NBTF9OQU1FKG5hbWUpIGlmIHRoZSAtTAotCSBzd2l0Y2ggd2FzIHBhc3NlZCB0byBnYXMuCi0KLQkgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCSBzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gKi8KLQotCi0gICAgICBpZiAoIVNfSVNfUkVHSVNURVIgKHN5bWJvbFApCi0JICAmJiAoIVNfR0VUX05BTUUgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19ERUJVRyAoc3ltYm9sUCkKLQkgICAgICB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKQotCSAgICAgIHx8IFNfSVNfRVhURVJOQUwgKHN5bWJvbFApCi0JICAgICAgfHwgKFNfR0VUX05BTUUgKHN5bWJvbFApWzBdICE9ICdcMDAxJwotCQkgICYmIChmbGFnX2tlZXBfbG9jYWxzIHx8ICFTX0xPQ0FMX05BTUUgKHN5bWJvbFApKSkpKQotCXsKLQkgIHN5bWJvbFAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXIrKzsKLQotCSAgLyogVGhlICsgMSBhZnRlciBzdHJsZW4gYWNjb3VudCBmb3IgdGhlIFwwIGF0IHRoZQotCQkJICAgZW5kIG9mIGVhY2ggc3RyaW5nICovCi0JICBpZiAoIVNfSVNfU1RBQkQgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgLyogT3JkaW5hcnkgY2FzZS4gKi8KLQkgICAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IHN0cmluZ19ieXRlX2NvdW50OwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMTsKLQkgICAgfQotCSAgZWxzZQkJCS8qIC5TdGFiZCBjYXNlLiAqLwotCSAgICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7Ci0JICBzeW1ib2xQUCA9ICZzeW1ib2xQLT5zeV9uZXh0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIC8qIFRoaXMgd2FybmluZyBzaG91bGQgbmV2ZXIgZ2V0IHRyaWdnZXJlZCBhbnkgbW9yZS4KLQkgICAgICAgV2VsbCwgbWF5YmUgaWYgeW91J3JlIGRvaW5nIHR3aXN0ZWQgdGhpbmdzIHdpdGgKLQkgICAgICAgcmVnaXN0ZXIgbmFtZXMuLi4gICovCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkLiIpLCBkZWNvZGVfbG9jYWxfbGFiZWxfbmFtZSAoU19HRVRfTkFNRSAoc3ltYm9sUCkpKTsKLQkgICAgfQkJCS8qIG9vcHMuICovCi0KLQkgIC8qIFVuaG9vayBpdCBmcm9tIHRoZSBjaGFpbiAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGhlYWRlcnMsIHN5bWJvbF9udW1iZXIpOwotfQotCi0vKgotICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KLSAqLwotCi12b2lkCi1vYmpfZW1pdF9zdHJpbmdzICh3aGVyZSkKLSAgICAgY2hhciAqKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIHN0cmluZ19ieXRlX2NvdW50LCBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN0cmluZ19ieXRlX2NvdW50LCAodW5zaWduZWQgbG9uZykgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX05BTUUgKHN5bWJvbFApKQotCWFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkodW5zaWduZWQgbG9uZykgKHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMSkpOwotICAgIH0JCQkJLyogd2FsayBzeW1ib2wgY2hhaW4gKi8KLX0KLQotI2lmbmRlZiBBT1VUX1ZFUlNJT04KLSNkZWZpbmUgQU9VVF9WRVJTSU9OIDAKLSNlbmRpZgotCi12b2lkCi1vYmpfcHJlX3dyaXRlX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBIX1NFVF9EWU5BTUlDIChoZWFkZXJzLCAwKTsKLSAgSF9TRVRfVkVSU0lPTiAoaGVhZGVycywgQU9VVF9WRVJTSU9OKTsKLSAgSF9TRVRfTUFDSFRZUEUgKGhlYWRlcnMsIEFPVVRfTUFDSFRZUEUpOwotICB0Y19hb3V0X3ByZV93cml0ZV9ob29rIChoZWFkZXJzKTsKLX0KLQotdm9pZAotREVGVU5fVk9JRCAoc19zZWN0KQotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGNoYXIgKnNlY3Rpb25fbmFtZV9lbmQ7Ci0gIGNoYXIgYzsKLQotICB1bnNpZ25lZCBpbnQgbGVuOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBjaGFyICpzYXZlOwotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzZWN0aW9uX25hbWVfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGxlbiA9IHNlY3Rpb25fbmFtZV9lbmQgLSBzZWN0aW9uX25hbWU7Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGMgPT0gJywnKQotICAgIHsKLSAgICAgIGV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBleHAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICAgICAgZXhwID0gMDsKLSAgICB9Ci0gIGlmIChleHAgPj0gMTAwMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInN1YnNlZ21lbnQgaW5kZXggdG9vIGhpZ2giKSk7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0IChTRUdfVEVYVCwgKHN1YnNlZ1QpIGV4cCk7Ci0gICAgfQotCi0gIGlmIChzdHJjbXAgKHNlY3Rpb25fbmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0Jc3Vic2VnX3NldCAoU0VHX1RFWFQsIChzdWJzZWdUKSBleHAgKyAxMDAwKTsKLSAgICAgIGVsc2UKLQlzdWJzZWdfc2V0IChTRUdfREFUQSwgKHN1YnNlZ1QpIGV4cCk7Ci0gICAgfQotCi0gICpzZWN0aW9uX25hbWVfZW5kID0gYzsKLX0KLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBlbmQgb2Ygb2JqLWFvdXQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYW91dC5oIGIvZ2FzL2NvbmZpZy9vYmotYW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2YzM2ZkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWFvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKiBvYmotYW91dC5oLCBhLm91dCBvYmplY3QgZmlsZSBmb3JtYXQgZm9yIGdhcywgdGhlIGFzc2VtYmxlci4KLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKiBUYWcgdG8gdmFsaWRhdGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgT0JKX0FPVVQgMQotCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotI2luY2x1ZGUgImJmZC9saWJhb3V0LmgiCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2FvdXRfZmxhdm91cgotCi0jZWxzZSAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBWTVMKLSNpbmNsdWRlICJhb3V0X2dudS5oIgkJLyogTmVlZGVkIHRvIGRlZmluZSBzdHJ1Y3Qgbmxpc3QuIFNpZ2guICovCi0jZWxzZQotI2luY2x1ZGUgImFfb3V0LmgiCi0jZW5kaWYKLQotI2lmbmRlZiBBT1VUX01BQ0hUWVBFCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMAotI2VuZGlmIC8qIEFPVVRfTUFDSFRZUEUgKi8KLQotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsKLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotI2lmbmRlZiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShPTUFHSUMpCi0jZW5kaWYgLyogREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICovCi0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogU1lNQk9MIFRBQkxFICovCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgZGF0YSB0eXBlICovCi0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsJLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPm90aGVyID0gKFYpKQotI2RlZmluZSBTX1NFVF9UWVBFKFMsVCkgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPnR5cGUgPSAoVCkpCi0jZGVmaW5lIFNfU0VUX0RFU0MoUyxEKQlcCi0gIChhb3V0X3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+ZGVzYyA9IChEKSkKLSNkZWZpbmUgU19HRVRfT1RIRVIoUykgXAotICAoYW91dF9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPm90aGVyKQotI2RlZmluZSBTX0dFVF9UWVBFKFMpIFwKLSAgKGFvdXRfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT50eXBlKQotI2RlZmluZSBTX0dFVF9ERVNDKFMpIFwKLSAgKGFvdXRfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5kZXNjKQotCi1hc2VjdGlvbiAqdGV4dF9zZWN0aW9uLCAqZGF0YV9zZWN0aW9uLCAqYnNzX3NlY3Rpb247Ci0KLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUFVOVCkJb2JqX2FvdXRfZnJvYl9zeW1ib2wgKFMsICZQVU5UKQotI2RlZmluZSBvYmpfZnJvYl9maWxlKCkJCW9ial9hb3V0X2Zyb2JfZmlsZSAoKQotZXh0ZXJuIHZvaWQgb2JqX2FvdXRfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQgKikpOwotZXh0ZXJuIHZvaWQgb2JqX2FvdXRfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MoU0VDKQkoMSkKLQotI2Vsc2UKLQotLyogV2UgdXNlIHRoZSBzeV9vYmogZmllbGQgdG8gcmVjb3JkIHdoZXRoZXIgYSBzeW1ib2wgaXMgd2Vhay4gICovCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIGNoYXIKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKLQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgaXMgaW4gTl97VEVYVCxEQVRBLEJTUyxBQlN9IG9yIE5fRVhUICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKSBcCi0gIChTX0dFVF9UWVBFIChzKSAhPSBOX1VOREYgfHwgU19HRVRfREVTQyAocykgIT0gMCkKLQotI2RlZmluZSBTX0lTX0NPTU1PTihzKSBcCi0gIChTX0dFVF9UWVBFIChzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0KLSNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCi0KLS8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLwotI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpIAkJCQkJXAotICAoKFNfR0VUX05BTUUgKHMpIAkJCQkJXAotICAgICYmICFTX0lTX0RFQlVHIChzKSAJCQkJCVwKLSAgICAmJiAoc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMCQlcCi0gICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTAlcCi0gICAgICAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkJXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUJCQlcCi0gICAgICAgJiYgISBTX0lTX0VYVEVSTkFMKHMpCQkJCVwKLSAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChzKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCi0jZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IChjaGFyICopMCkKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fbmFtZSkKLS8qIFRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19HRVRfT0ZGU0VUKHMpCQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cngpCi0vKiBUaGUgdHlwZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX1RZUEUocykJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX1RZUEUpCi0vKiBUaGUgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgc2VnbWVudCAqLwotI2RlZmluZSBTX0dFVF9TRUdNRU5UKHMpCShOX1RZUEVfc2VnW1NfR0VUX1RZUEUocyldKQotLyogVGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9PVEhFUihzKQkJKChzKS0+c3lfc3ltYm9sLm5fb3RoZXIpCi0vKiBUaGUgbl9kZXNjIGV4cHJlc3Npb24gdmFsdWUgKi8KLSNkZWZpbmUgU19HRVRfREVTQyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fZGVzYykKLS8qIFdoZXRoZXIgdGhlIHN5bWJvbCBpcyB3ZWFrLiAgKi8KLSNkZWZpbmUgU19HRVRfV0VBSyhzKQkJKChzKS0+c3lfb2JqKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lID0gKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cnggPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSBmaWVsZCAqLwotI2RlZmluZSBTX1NFVF9UWVBFKHMsdCkJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodCkpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBNYXJrIHRoZSBzeW1ib2wgYXMgd2Vhay4gIFRoaXMgY2F1c2VzIG5fdHlwZSB0byBiZSBhZGp1c3RlZCB3aGVuCi0gICB0aGUgc3ltYm9sIGlzIHdyaXR0ZW4gb3V0LiAgKi8KLSNkZWZpbmUgU19TRVRfV0VBSyhzKQkJKChzKS0+c3lfb2JqID0gMSkKLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0jZGVmaW5lIEhfR0VUX0ZJTEVfU0laRShoKQkoSF9HRVRfSEVBREVSX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX1RFWFRfU0laRShoKSBcCi0JCQkJICsgSF9HRVRfREFUQV9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSBcCi0JCQkJICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkgXAotCQkJCSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpIFwKLQkJCQkgKyBIX0dFVF9TVFJJTkdfU0laRShoKSkKLQotI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKEVYRUNfQllURVNfU0laRSkKLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCi0jZGVmaW5lIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX3Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfZHJzaXplKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoKGgpLT5oZWFkZXIuYV9zeW1zKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKQkJKChoKS0+aGVhZGVyLmFfZW50cnkpCi0jZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLSNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkJCSgwKQotCi0jZGVmaW5lIEhfR0VUX0RZTkFNSUMoaCkJCSgoaCktPmhlYWRlci5hX2luZm8gPj4gMzEpCi0jZGVmaW5lIEhfR0VUX1ZFUlNJT04oaCkJCSgoKGgpLT5oZWFkZXIuYV9pbmZvID4+IDI0KSAmIDB4N2YpCi0jZGVmaW5lIEhfR0VUX01BQ0hUWVBFKGgpCQkoKChoKS0+aGVhZGVyLmFfaW5mbyA+PiAxNikgJiAweGZmKQotI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkJCSgoaCktPmhlYWRlci5hX2luZm8gJiAweGZmZmYpCi0KLSNkZWZpbmUgSF9TRVRfRFlOQU1JQyhoLHYpCQkoKGgpLT5oZWFkZXIuYV9pbmZvID0gKCgodikgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUdJQ19OVU1CRVIoaCkpKSkKLQotI2RlZmluZSBIX1NFVF9WRVJTSU9OKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoKHYpIDw8IDI0KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BQ0hUWVBFKGgpIDw8IDE2KSBcCi0JCQkJCQkJICAgICAgIHwgKEhfR0VUX01BR0lDX05VTUJFUihoKSkpKQotCi0jZGVmaW5lIEhfU0VUX01BQ0hUWVBFKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8ICgodikgPDwgMTYpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfTUFHSUNfTlVNQkVSKGgpKSkpCi0KLSNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikJCSgoaCktPmhlYWRlci5hX2luZm8gPSAoKEhfR0VUX0RZTkFNSUMoaCkgPDwgMzEpIFwKLQkJCQkJCQkgICAgICAgfCAoSF9HRVRfVkVSU0lPTihoKSA8PCAyNCkgXAotCQkJCQkJCSAgICAgICB8IChIX0dFVF9NQUNIVFlQRShoKSA8PCAxNikgXAotCQkJCQkJCSAgICAgICB8ICgodikpKSkKLQotI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfdGV4dCA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX1RFWFQsICh2KSkpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV9kYXRhID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfREFUQSwgKHYpKSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gbWRfc2VjdGlvbl9hbGlnbihTRUdfQlNTLCAodikpKQotCi0jZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkJKEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKChoKSwodCkpLFwKLQkJCQkJIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKChoKSwoZCkpKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfdHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogMTIpCi0KLSNkZWZpbmUgSF9TRVRfRU5UUllfUE9JTlQoaCx2KQkJKChoKS0+aGVhZGVyLmFfZW50cnkgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NUUklOR19TSVpFKGgsdikJCSgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCi0gICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgfQotCi1vYmplY3RfaGVhZGVyczsKLQotLyogbGluZSBudW1iZXJpbmcgc3R1ZmYuICovCi0jZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLCBiLCBjKQl7O30KLQotc3RydWN0IGZpeDsKLXZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsIHN0cnVjdCBmaXggKmZpeFAsIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzcykpOwotCi0jZW5kaWYKLQotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpCXs7fQotCi0jZGVmaW5lIEVNSVRfU0VDVElPTl9TWU1CT0xTCQkwCi0KLSNkZWZpbmUgQU9VVF9TVEFCUwotCi0vKiBlbmQgb2Ygb2JqLWFvdXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotYm91dC5jIGIvZ2FzL2NvbmZpZy9vYmotYm91dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc5NzE4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWJvdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKiBiLm91dCBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NgotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLSAgIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotY29uc3Qgc2hvcnQJCQkvKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KLSAgc2VnX05fVFlQRVtdID0KLXsKLSAgTl9BQlMsCi0gIE5fVEVYVCwKLSAgTl9EQVRBLAotICBOX0JTUywKLSAgTl9VTkRGLAkJCS8qIHVua25vd24gKi8KLSAgTl9VTkRGLAkJCS8qIGVycm9yICovCi0gIE5fVU5ERiwJCQkvKiBleHByZXNzaW9uICovCi0gIE5fVU5ERiwJCQkvKiBkZWJ1ZyAqLwotICBOX1VOREYsCQkJLyogbnR2ICovCi0gIE5fVU5ERiwJCQkvKiBwdHYgKi8KLSAgTl9SRUdJU1RFUiwJCQkvKiByZWdpc3RlciAqLwotfTsKLQotY29uc3Qgc2VnVCBOX1RZUEVfc2VnW05fVFlQRSArIDJdID0KLXsJCQkJLyogTl9UWVBFID09IDB4MUUgPSAzMi0yICovCi0gIFNFR19VTktOT1dOLAkJCS8qIE5fVU5ERiA9PSAwICovCi0gIFNFR19HT09GLAotICBTRUdfQUJTT0xVVEUsCQkJLyogTl9BQlMgPT0gMiAqLwotICBTRUdfR09PRiwKLSAgU0VHX1RFWFQsCQkJLyogTl9URVhUID09IDQgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19EQVRBLAkJCS8qIE5fREFUQSA9PSA2ICovCi0gIFNFR19HT09GLAotICBTRUdfQlNTLAkJCS8qIE5fQlNTID09IDggKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX1JFR0lTVEVSLAkJCS8qIGR1bW15IE5fUkVHSVNURVIgZm9yIHJlZ3MgPSAzMCAqLwotICBTRUdfR09PRiwKLX07Ci0KLXN0YXRpYyB2b2lkIG9ial9ib3V0X2xpbmUgUEFSQU1TICgoaW50KSk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7ImxpbmUiLCBvYmpfYm91dF9saW5lLCAwfSwJLyogc291cmNlIGNvZGUgbGluZSBudW1iZXIgKi8KLQotLyogY29mZiBkZWJ1Z2dpbmcgZGlyZWN0aXZlcy4gIEN1cnJlbnRseSBpZ25vcmVkIHNpbGVudGx5ICovCi0gIHsiZGVmIiwgc19pZ25vcmUsIDB9LAotICB7ImRpbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmRlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJsbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJzY2wiLCBzX2lnbm9yZSwgMH0sCi0gIHsic2l6ZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ0YWciLCBzX2lnbm9yZSwgMH0sCi0gIHsidHlwZSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ2YWwiLCBzX2lnbm9yZSwgMH0sCi0KLS8qIG90aGVyIHN0dWZmIHdlIGRvbid0IGhhbmRsZSAqLwotICB7IkFCT1JUIiwgc19pZ25vcmUsIDB9LAotICB7ImlkZW50Iiwgc19pZ25vcmUsIDB9LAotCi0gIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLwotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi0vKiBSZWxvY2F0aW9uLiAqLwotCi0vKgotICoJCWVtaXRfcmVsb2NhdGlvbnMoKQotICoKLSAqIENyYXdsIGFsb25nIGEgZml4UyBjaGFpbi4gRW1pdCB0aGUgc2VnbWVudCdzIHJlbG9jYXRpb25zLgotICovCi12b2lkCi1vYmpfZW1pdF9yZWxvY2F0aW9ucyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7CQkvKiBGaXh1cCBjaGFpbiBmb3IgdGhpcyBzZWdtZW50LiAqLwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgZm9yICg7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9kb25lID09IDAKLQkgIHx8IGZpeFAtPmZ4X3JfdHlwZSAhPSBOT19SRUxPQykKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIHN5bSA9IGZpeFAtPmZ4X2FkZHN5OwotCSAgd2hpbGUgKHN5bS0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCQkgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQkgICAgc3ltID0gc3ltLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JICBmaXhQLT5meF9hZGRzeSA9IHN5bTsKLQotCSAgdGNfYm91dF9maXhfdG9fY2hhcnMgKCp3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpOwotCSAgKndoZXJlICs9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0JfQkJCS8qIGlmIHRoZXJlJ3MgYSBzeW1ib2wgKi8KLSAgICB9CQkJCS8qIGZvciBlYWNoIGZpeHVwICovCi0KLX0JCQkJLyogZW1pdF9yZWxvY2F0aW9ucygpICovCi0KLS8qIEFvdXQgZmlsZSBnZW5lcmF0aW9uICYgdXRpbGl0aWVzICovCi0KLS8qIENvbnZlcnQgYSBsdmFsdWUgdG8gbWFjaGluZSBkZXBlbmRlbnQgZGF0YSAqLwotdm9pZAotb2JqX2hlYWRlcl9hcHBlbmQgKHdoZXJlLCBoZWFkZXJzKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICAvKiBBbHdheXMgbGVhdmUgaW4gaG9zdCBieXRlIG9yZGVyICovCi0KLSAgaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbU0VHX1RFWFRdOwotCi0gIGlmIChoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24gPCAyKQotICAgIHsKLSAgICAgIGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiA9IDI7Ci0gICAgfQkJCQkvKiBmb3JjZSB0byBhdCBsZWFzdCAyICovCi0KLSAgaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduID0gc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0RBVEFdOwotICBoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFtTRUdfQlNTXTsKLQotICBoZWFkZXJzLT5oZWFkZXIuYV90bG9hZCA9IDA7Ci0gIGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkID0gbWRfc2VjdGlvbl9hbGlnbiAoU0VHX0RBVEEsIEhfR0VUX1RFWFRfU0laRSAoaGVhZGVycykpOwotCi0gIGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSA9IGxpbmtyZWxheDsKLQotI2lmZGVmIENST1NTX0NPTVBJTEUKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX21hZ2ljKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RleHQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGV4dCkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90ZXh0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhdGEsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGF0YSkpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYXRhKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Jzcywgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9ic3MpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYnNzKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3N5bXMsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfc3ltcykpOwotICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9zeW1zKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5LCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2VudHJ5KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90cnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Ryc2l6ZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kcnNpemUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZHJzaXplKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX3Rsb2FkKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkKSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKGhlYWRlcnMtPmhlYWRlci5hX2Rsb2FkKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3RhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV90YWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfdGFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2RhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9kYWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfZGFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX2JhbGlnbiwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9iYWxpZ24pKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfYmFsaWduKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIGhlYWRlcnMtPmhlYWRlci5hX3JlbGF4YWJsZSwgc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuYV9yZWxheGFibGUpKTsKLSAgKndoZXJlICs9IHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLmFfcmVsYXhhYmxlKTsKLSNlbHNlIC8qICEgQ1JPU1NfQ09NUElMRSAqLwotICBhcHBlbmQgKHdoZXJlLCAoY2hhciAqKSAmaGVhZGVycy0+aGVhZGVyLCBzaXplb2YgKGhlYWRlcnMtPmhlYWRlcikpOwotI2VuZGlmIC8qICEgQ1JPU1NfQ09NUElMRSAqLwotfQkJCQkvKiBhX2hlYWRlcl9hcHBlbmQoKSAqLwotCi12b2lkCi1vYmpfc3ltYm9sX3RvX2NoYXJzICh3aGVyZSwgc3ltYm9sUCkKLSAgICAgY2hhciAqKndoZXJlOwotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICYoU19HRVRfT0ZGU0VUIChzeW1ib2xQKSksIFNfR0VUX09GRlNFVCAoc3ltYm9sUCksIHNpemVvZiAoU19HRVRfT0ZGU0VUIChzeW1ib2xQKSkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICYoU19HRVRfREVTQyAoc3ltYm9sUCkpLCBTX0dFVF9ERVNDIChzeW1ib2xQKSwgc2l6ZW9mIChTX0dFVF9ERVNDIChzeW1ib2xQKSkpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopICZzeW1ib2xQLT5zeV9zeW1ib2wubl92YWx1ZSwgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplb2YgKHN5bWJvbFAtPnN5X3N5bWJvbC5uX3ZhbHVlKSk7Ci0KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN5bWJvbFAtPnN5X3N5bWJvbCwgc2l6ZW9mIChvYmpfc3ltYm9sX3R5cGUpKTsKLX0JCQkJLyogb2JqX3N5bWJvbF90b19jaGFycygpICovCi0KLXZvaWQKLW9ial9lbWl0X3N5bWJvbHMgKHdoZXJlLCBzeW1ib2xfcm9vdFApCi0gICAgIGNoYXIgKip3aGVyZTsKLSAgICAgc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qCi0JICogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uCi0JICovCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBVc2VkIHRvIHNhdmUgdGhlIG9mZnNldCBvZiB0aGUgbmFtZS4gSXQgaXMgdXNlZCB0byBwb2ludAotCQkgICB0byB0aGUgc3RyaW5nIGluIG1lbW9yeSBidXQgbXVzdCBiZSBhIGZpbGUgb2Zmc2V0LiAqLwotICAgICAgY2hhciAqdGVtcDsKLQotICAgICAgdGVtcCA9IFNfR0VUX05BTUUgKHN5bWJvbFApOwotICAgICAgU19TRVRfT0ZGU0VUIChzeW1ib2xQLCBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCk7Ci0KLSAgICAgIC8qIEFueSBzeW1ib2wgc3RpbGwgdW5kZWZpbmVkIGFuZCBpcyBub3QgYSBkYmcgc3ltYm9sIGlzIG1hZGUgTl9FWFQuICovCi0gICAgICBpZiAoIVNfSVNfREVCVUcgKHN5bWJvbFApICYmICFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCVNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQotICAgICAgb2JqX3N5bWJvbF90b19jaGFycyAod2hlcmUsIHN5bWJvbFApOwotICAgICAgU19TRVRfTkFNRSAoc3ltYm9sUCwgdGVtcCk7Ci0gICAgfQotfQkJCQkvKiBlbWl0X3N5bWJvbHMoKSAqLwotCi12b2lkCi1vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX0RFU0MgKHN5bWJvbFAsIDApOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2JvdXRfbGluZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBBc3N1bWUgZGVsaW1pdGVyIGlzIHBhcnQgb2YgZXhwcmVzc2lvbi4gKi8KLSAgLyogQlNENC4yIGFzIGZhaWxzIHdpdGggZGVsaWdodGZ1bCBidWcsIHNvIHdlICovCi0gIC8qIGFyZSBub3QgYmVpbmcgaW5jb21wYXRpYmxlIGhlcmUuICovCi0gIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIChpbnQpIChnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBvYmpfYm91dF9saW5lKCkgKi8KLQotdm9pZAotb2JqX3JlYWRfYmVnaW5faG9vayAoKQotewotfQotCi12b2lkCi1vYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqKnN5bWJvbFBQOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgdGNfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKTsKLQotICBzeW1ib2xQUCA9ICZzeW1ib2xfcm9vdFA7CS8qLT5sYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLwotICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ICYmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfREFUQSkpCi0JewotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgU0VHX1RFWFQpOwotCX0JCQkvKiBpZiBwdXNpbmcgZGF0YSBpbnRvIHRleHQgKi8KLQotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgICAvKiBTa2lwIHN5bWJvbHMgd2hpY2ggd2VyZSBlcXVhdGVkIHRvIHVuZGVmaW5lZCBvciBjb21tb24KLQkgc3ltYm9scy4gICovCi0gICAgICBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sUCkpKQotCXsKLQkgICpzeW1ib2xQUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogT0ssIGhlcmUgaXMgaG93IHdlIGRlY2lkZSB3aGljaCBzeW1ib2xzIGdvIG91dCBpbnRvIHRoZQotCSBicmF2ZSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQkJCi0JICogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQotCSAqIHN5bWJvbHMgd2l0aCBkZWJ1ZyBpbmZvIGluIHRoZWlyIE5fVFlQRQotCQkKLQkgU3ltYm9scyB0aGF0IGRvbid0IGFyZToKLQkgKiBzeW1ib2xzIHRoYXQgYXJlIHJlZ2lzdGVycwotCSAqIHN5bWJvbHMgd2l0aCBcMSBhcyB0aGVpciAzcmQgY2hhcmFjdGVyIChudW1lcmljIGxhYmVscykKLQkgKiAibG9jYWwgbGFiZWxzIiBhcyBkZWZpbmVkIGJ5IFNfTE9DQUxfTkFNRShuYW1lKQotCSBpZiB0aGUgLUwgc3dpdGNoIHdhcyBwYXNzZWQgdG8gZ2FzLgotCQkKLQkgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCSBzeW1ib2wgd2FzIG1hcmtlZCBleHRlcm5hbC4gKi8KLQotCi0gICAgICBpZiAoMQotCSAgJiYgIVNfSVNfUkVHSVNURVIgKHN5bWJvbFApCi0JICAmJiAoIVNfR0VUX05BTUUgKHN5bWJvbFApCi0JICAgICAgfHwgU19JU19ERUJVRyAoc3ltYm9sUCkKLSNpZmRlZiBUQ19JOTYwCi0gICAgICAvKiBGSVhNRS1TT09OIHRoaXMgaWZkZWYgc2VlbXMgaGlnaGx5IGR1YmlvdXMgdG8gbWUuICB4b3hvcmljaC4gKi8KLQkgICAgICB8fCAhU19JU19ERUZJTkVEIChzeW1ib2xQKQotCSAgICAgIHx8IFNfSVNfRVhURVJOQUwgKHN5bWJvbFApCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCSAgICAgIHx8IChTX0dFVF9OQU1FIChzeW1ib2xQKVswXSAhPSAnXDAwMScgJiYgKGZsYWdfa2VlcF9sb2NhbHMgfHwgIVNfTE9DQUxfTkFNRSAoc3ltYm9sUCkpKSkpCi0JewotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcisrOwotCi0JICAvKiBUaGUgKyAxIGFmdGVyIHN0cmxlbiBhY2NvdW50IGZvciB0aGUgXDAgYXQgdGhlCi0JCQkgICBlbmQgb2YgZWFjaCBzdHJpbmcgKi8KLQkgIGlmICghU19JU19TVEFCRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICAvKiBPcmRpbmFyeSBjYXNlLiAqLwotCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gc3RyaW5nX2J5dGVfY291bnQ7Ci0JICAgICAgc3RyaW5nX2J5dGVfY291bnQgKz0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgICB9Ci0JICBlbHNlCQkJLyogLlN0YWJkIGNhc2UuICovCi0JICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkgIHN5bWJvbFBQID0gJihzeW1ib2xfbmV4dCAoc3ltYm9sUCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkxvY2FsIHN5bWJvbCAlcyBuZXZlciBkZWZpbmVkIiksIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgICAgfQkJCS8qIG9vcHMuICovCi0KLQkgIC8qIFVuaG9vayBpdCBmcm9tIHRoZSBjaGFpbiAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGhlYWRlcnMsIHN5bWJvbF9udW1iZXIpOwotfQotCi0vKgotICogRmluZCBzdHJpbmdzIGJ5IGNyYXdsaW5nIGFsb25nIHN5bWJvbCB0YWJsZSBjaGFpbi4KLSAqLwotCi12b2lkCi1vYmpfZW1pdF9zdHJpbmdzICh3aGVyZSkKLSAgICAgY2hhciAqKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0jaWZkZWYgQ1JPU1NfQ09NUElMRQotICAvKiBHb3R0YSBkbyBtZF8gYnl0ZS1vcmRlcmluZyBzdHVmZiBmb3Igc3RyaW5nX2J5dGVfY291bnQgZmlyc3QgLSBLV0sgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgqd2hlcmUsIHN0cmluZ19ieXRlX2NvdW50LCBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KSk7Ci0gICp3aGVyZSArPSBzaXplb2YgKHN0cmluZ19ieXRlX2NvdW50KTsKLSNlbHNlIC8qIENST1NTX0NPTVBJTEUgKi8KLSAgYXBwZW5kICh3aGVyZSwgKGNoYXIgKikgJnN0cmluZ19ieXRlX2NvdW50LCAodW5zaWduZWQgbG9uZykgc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpOwotI2VuZGlmIC8qIENST1NTX0NPTVBJTEUgKi8KLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX05BTUUgKHN5bWJvbFApKQotCWFwcGVuZCAod2hlcmUsIFNfR0VUX05BTUUgKHN5bWJvbFApLCAodW5zaWduZWQgbG9uZykgKHN0cmxlbiAoU19HRVRfTkFNRSAoc3ltYm9sUCkpICsgMSkpOwotICAgIH0JCQkJLyogd2FsayBzeW1ib2wgY2hhaW4gKi8KLX0KLQotLyogZW5kIG9mIG9iai1ib3V0LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWJvdXQuaCBiL2dhcy9jb25maWcvb2JqLWJvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1MzlhMC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ib3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyogYi5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTYKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBDYW1icmlkZ2UsIE1BCi0gICAwMjEzOSwgVVNBLiAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAnYS5vdXQuaCcuICBJdCBpcyB0byBiZSB1c2VkIGluIGFsbCBHTlUKLSAqIHRvb2xzIG1vZGlmaWVkIHRvIHN1cHBvcnQgdGhlIGk4MDk2MCBiLm91dCBmb3JtYXQgKG9yIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbgotICogb2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgc3VjaCB0b29scykuCi0gKgotICogQWxsIGk4MDk2MCBkZXZlbG9wbWVudCBpcyBkb25lIGluIGEgQ1JPU1MtREVWRUxPUE1FTlQgZW52aXJvbm1lbnQuICBJLmUuLAotICogb2JqZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIG9uLCBhbmQgZXhlY3V0ZWQgdW5kZXIgdGhlIGRpcmVjdGlvbiBvZiBhIHN5bWJvbGljCi0gKiBkZWJ1Z2dlciBydW5uaW5nIG9uLCBhIGhvc3Qgc3lzdGVtLiAgV2UgZG8gbm90IHdhbnQgdG8gYmUgc3ViamVjdCB0byB0aGUKLSAqIHZhZ2FyaWVzIG9mIHdoaWNoIGhvc3QgaXQgaXMgb3Igd2hldGhlciBpdCBzdXBwb3J0cyBDT0ZGIG9yIGEub3V0IGZvcm1hdCwgb3IKLSAqIGFueXRoaW5nIGVsc2UuICBXZSBETyB3YW50IHRvOgotICoKLSAqCW8gYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIGZvcm1hdCBvYmplY3QgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgaG9zdC4KLSAqCi0gKglvIGhhdmUgYW4gJ2Eub3V0JyBoZWFkZXIgdGhhdCB3ZSBjYW4gbW9kaWZ5IGZvciBvdXIgb3duIHB1cnBvc2VzCi0gKgkgICh0aGUgODA5NjAgaXMgdHlwaWNhbGx5IGFuIGVtYmVkZGVkIHByb2Nlc3NvciBhbmQgbWF5IHJlcXVpcmUKLSAqCSAgZW5oYW5jZWQgbGlua2VyIHN1cHBvcnQgdGhhdCB0aGUgbm9ybWFsIGEub3V0LmggaGVhZGVyIGNhbid0Ci0gKgkgIGFjY29tbW9kYXRlKS4KLSAqCi0gKiBBcyBmb3IgYnl0ZS1vcmRlcmluZywgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKLSAqCi0gKglvIFRleHQgYW5kIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgaXMgYWx3YXlzCi0gKgkgIGluIGk4MDk2MCAobGl0dGxlLWVuZGlhbikgb3JkZXIuCi0gKgotICoJbyBBbGwgb3RoZXIgbnVtYmVycyAoaW4gdGhlIGhlYWRlciwgc3ltYm9scywgcmVsb2NhdGlvbiBkaXJlY3RpdmVzKQotICoJICBhcmUgaW4gaG9zdCBieXRlLW9yZGVyOiAgb2JqZWN0IGZpbGVzIENBTk5PVCBiZSBsaWZ0ZWQgZnJvbSBhCi0gKgkgIGxpdHRsZS1lbmQgaG9zdCBhbmQgdXNlZCBvbiBhIGJpZy1lbmRpYW4gKG9yIHZpY2UgdmVyc2EpIHdpdGhvdXQKLSAqCSAgbW9kaWZpY2F0aW9uLgotICogPT0+IFRISVMgSVMgTk8gTE9OR0VSIFRSVUUgVVNJTkcgQkZELiAgV0UgQ0FOIEdFTkVSQVRFIEFOWSBCWVRFIE9SREVSCi0gKiAgICAgRk9SIFRIRSBIRUFERVIsIEFORCBSRUFEIEFOWSBCWVRFIE9SREVSLiAgUFJFRkVSRU5DRSBXT1VMRCBCRSBUTwotICogICAgIFVTRSBMSVRUTEUtRU5ESUFOIEJZVEUgT1JERVIgVEhST1VHSE9VVCwgUkVHQVJETEVTUyBPRiBIT1NULiAgPD09Ci0gKgotICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgotICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQotICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKLSAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCi0gKi8KLQotCi0jZGVmaW5lIE9CSl9CT1VUIDEKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jZGVmaW5lIE9CSl9ERUZBVUxUX09VVFBVVF9GSUxFX05BTUUJImIub3V0IgotCi1leHRlcm4gY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdOwotZXh0ZXJuIGNvbnN0IHNlZ1QgTl9UWVBFX3NlZ1tdOwotCi0jZGVmaW5lIEJNQUdJQwkwNDE1Ci0vKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KLSAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KLSAqLwotI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KLSNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCi0jZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KLQotI2lmbmRlZiBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUKLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFCShCTUFHSUMpCi0jZW5kaWYgLyogREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICovCi0KLS8qIEZJTEUgSEVBREVSCi0gKglBbGwgJ2xlbmd0aHMnIGFyZSBnaXZlbiBhcyBhIG51bWJlciBvZiBieXRlcy4KLSAqCUFsbCAnYWxpZ25tZW50cycgYXJlIGZvciByZWxpbmthYmxlIGZpbGVzIG9ubHk7ICBhbiBhbGlnbm1lbnQgb2YKLSAqCQknbicgaW5kaWNhdGVzIHRoZSBjb3JyZXNwb25kaW5nIHNlZ21lbnQgbXVzdCBiZWdpbiBhdCBhbgotICoJCWFkZHJlc3MgdGhhdCBpcyBhIG11bHRpcGxlIG9mICgyKipuKS4KLSAqLwotc3RydWN0IGV4ZWMKLSAgewotICAgIC8qIFN0YW5kYXJkIHN0dWZmICovCi0gICAgdW5zaWduZWQgbG9uZyBhX21hZ2ljOwkvKiBJZGVudGlmaWVzIHRoaXMgYXMgYSBiLm91dCBmaWxlCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CS8qIExlbmd0aCBvZiB0ZXh0CQkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZGF0YTsJLyogTGVuZ3RoIG9mIGRhdGEJCQkqLwotICAgIHVuc2lnbmVkIGxvbmcgYV9ic3M7CS8qIExlbmd0aCBvZiBydW50aW1lIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhICovCi0gICAgdW5zaWduZWQgbG9uZyBhX3N5bXM7CS8qIExlbmd0aCBvZiBzeW1ib2wgdGFibGUJCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX2VudHJ5OwkvKiBSdW50aW1lIHN0YXJ0IGFkZHJlc3MJCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogTGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gICAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogTGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvCSovCi0KLSAgICAvKiBBZGRlZCBmb3IgaTk2MCAqLwotICAgIHVuc2lnbmVkIGxvbmcgYV90bG9hZDsJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcwkJKi8KLSAgICB1bnNpZ25lZCBsb25nIGFfZGxvYWQ7CS8qIERhdGEgcnVudGltZSBsb2FkIGFkZHJlc3MJCSovCi0gICAgdW5zaWduZWQgY2hhciBhX3RhbGlnbjsJLyogQWxpZ25tZW50IG9mIHRleHQgc2VnbWVudAkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfZGFsaWduOwkvKiBBbGlnbm1lbnQgb2YgZGF0YSBzZWdtZW50CQkqLwotICAgIHVuc2lnbmVkIGNoYXIgYV9iYWxpZ247CS8qIEFsaWdubWVudCBvZiBic3Mgc2VnbWVudAkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIGFfcmVsYXhhYmxlOwkvKiBDb250YWlucyBlbm91Z2ggaW5mbyB0byByZWxheCAgICAgKi8KLSAgfTsKLQotI2RlZmluZSBOX0JBRE1BRyh4KQkoKCh4KS5hX21hZ2ljKSE9Qk1BR0lDKQotI2RlZmluZSBOX1RYVE9GRih4KQkoIHNpemVvZihzdHJ1Y3QgZXhlYykgKQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQotLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQotICovCi1zdHJ1Y3Qgbmxpc3QKLSAgewotICAgIHVuaW9uCi0gICAgICB7Ci0JY2hhciAqbl9uYW1lOwotCXN0cnVjdCBubGlzdCAqbl9uZXh0OwotCWxvbmcgbl9zdHJ4OwkJLyogSW5kZXggaW50byBzdHJpbmcgdGFibGUJKi8KLSAgICAgIH0KLSAgICBuX3VuOwotICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLSAgICBjaGFyIG5fb3RoZXI7CQkvKiBVc2VkIGluIGk4MDk2MCBzdXBwb3J0IC0tIHNlZSBiZWxvdwkqLwotICAgIHNob3J0IG5fZGVzYzsKLSAgICB1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsKLQotLyogTGVnYWwgdmFsdWVzIG9mIG5fdHlwZQotICovCi0jZGVmaW5lIE5fVU5ERgkwCQkvKiBVbmRlZmluZWQgc3ltYm9sCSovCi0jZGVmaW5lIE5fQUJTCTIJCS8qIEFic29sdXRlIHN5bWJvbAkqLwotI2RlZmluZSBOX1RFWFQJNAkJLyogVGV4dCBzeW1ib2wJCSovCi0jZGVmaW5lIE5fREFUQQk2CQkvKiBEYXRhIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9CU1MJOAkJLyogQlNTIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9GTgkzMQkJLyogRmlsZW5hbWUgc3ltYm9sCSovCi0KLSNkZWZpbmUgTl9FWFQJMQkJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLwotI2RlZmluZSBOX1RZUEUJMDM2CQkvKiBNYXNrIGZvciBhbGwgdGhlIHR5cGUgYml0cwkJCSovCi0jZGVmaW5lIE5fU1RBQgkwMzQwCQkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotI2lmbmRlZiBDVVNUT01fUkVMT0NfRk9STUFUCi1zdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvCi0gIHsKLSAgICBpbnQgcl9hZGRyZXNzOwkJLyogRmlsZSBhZGRyZXNzIG9mIGl0ZW0gdG8gYmUgcmVsb2NhdGVkCSovCi0gICAgdW5zaWduZWQKLSAgICAgIHJfaW5kZXg6MjQsCQkvKiBJbmRleCBvZiBzeW1ib2wgb24gd2hpY2ggcmVsb2NhdGlvbiBpcyBiYXNlZCovCi0gICAgICByX3BjcmVsOjEsCQkvKiAxID0+IHJlbG9jYXRlIFBDLXJlbGF0aXZlOyBlbHNlIGFic29sdXRlCi0JCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0Ci0JCSAqCWFkZHJlc3MsIGFic29sdXRlIGltcGxpZXMgMzItYml0LgotCQkgKi8KLSAgICAgIHJfbGVuZ3RoOjIsCQkvKiBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVsb2NhdGU6Ci0JCSAqCTAgPT4gMSBieXRlCi0JCSAqCTEgPT4gMiBieXRlcwotCQkgKgkyID0+IDQgYnl0ZXMgLS0gb25seSB2YWx1ZSB1c2VkIGZvciBpOTYwCi0JCSAqLwotICAgICAgcl9leHRlcm46MSwgcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9kaXNwOjEsCQkJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9jYWxsajoxLAkJLyogMSBpZiByZWxvY2F0aW9uIHRhcmdldCBpcyBhbiBpOTYwICdjYWxsaicgKi8KLSAgICAgIG51dGhpbjoxOwkJCS8qIFVudXNlZAkJCQkqLwotICB9OwotCi0jZW5kaWYgLyogQ1VTVE9NX1JFTE9DX0ZPUk1BVCAqLwotCi0vKgotICogIE1hY3JvcyB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKiAgVGhpcyBzeW50YXhpYyBpbmRpcmVjdGlvbiBhbGxvd3MgaW5kZXBlbmRlbmNlIHJlZ2FyZGluZyBhLm91dCBvciBjb2ZmLgotICogIFRoZSBhcmd1bWVudCAocykgb2YgYWxsIHRoZXNlIG1hY3JvcyBpcyBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgdGFibGUgZW50cnkuCi0gKi8KLQotLyogUHJlZGljYXRlcyAqLwotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGlzIGV4dGVybmFsICovCi0jZGVmaW5lIFNfSVNfRVhURVJOQUwocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotCi0vKiBUcnVlIGlmIHN5bWJvbCBoYXMgYmVlbiBkZWZpbmVkLCBpZSBpcyBpbiBOX3tURVhULERBVEEsQlNTLEFCU30gb3IgTl9FWFQgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoKFNfR0VUX1RZUEUocykgIT0gTl9VTkRGKSB8fCAoU19HRVRfREVTQyhzKSAhPSAwKSkKLQotI2RlZmluZSBTX0lTX0NPTU1PTihzKSBcCi0gIChTX0dFVF9UWVBFIChzKSA9PSBOX1VOREYgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0KLSNkZWZpbmUgU19JU19SRUdJU1RFUihzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlID09IE5fUkVHSVNURVIpCi0KLS8qIFRydWUgaWYgYSBkZWJ1ZyBzcGVjaWFsIHN5bWJvbCBlbnRyeSAqLwotI2RlZmluZSBTX0lTX0RFQlVHKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9TVEFCKQotLyogVHJ1ZSBpZiBhIHN5bWJvbCBpcyBsb2NhbCBzeW1ib2wgbmFtZSAqLwotI2RlZmluZSBTX0lTX0xPQ0FMKHMpIAkJCQkJXAotICAoKFNfR0VUX05BTUUgKHMpIAkJCQkJXAotICAgICYmICFTX0lTX0RFQlVHIChzKSAJCQkJCVwKLSAgICAmJiAoc3RyY2hyIChTX0dFVF9OQU1FIChzKSwgJ1wwMDEnKSAhPSBOVUxMCQlcCi0gICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAyJykgIT0gTlVMTAlcCi0gICAgICAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkJXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUJCQlcCi0gICAgICAgJiYgIVNfSVNfRVhURVJOQUwocykJCQkJXAotICAgICAgICYmIFNfR0VUX1NFR01FTlQocykgPT0gYWJzb2x1dGVfc2VjdGlvbikpCi0vKiBUcnVlIGlmIGEgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgZmlsZSAqLwotI2RlZmluZSBTX0lTX0VYVEVSTihzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fRVhUKQotLyogVHJ1ZSBpZiB0aGUgc3ltYm9sIGhhcyBiZWVuIGdlbmVyYXRlZCBiZWNhdXNlIG9mIGEgLnN0YWJkIGRpcmVjdGl2ZSAqLwotI2RlZmluZSBTX0lTX1NUQUJEKHMpCQkoU19HRVRfTkFNRShzKSA9PSBOVUxMKQotCi0vKiBBY2Nlc3NvcnMgKi8KLS8qIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lKQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykJCSgocyktPnN5X3N5bWJvbC5uX3VuLm5fc3RyeCkKLS8qIFRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fVFlQRSkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKE5fVFlQRV9zZWdbU19HRVRfVFlQRShzKV0pCi0vKiBUaGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX09USEVSKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlcikKLS8qIFRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9ERVNDKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdW4ubl9uYW1lID0gKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgaW4gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wubl91bi5uX3N0cnggPSAodikpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9UWVBFKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgPSAodikpCi0KLS8qIEZpbGUgaGVhZGVyIG1hY3JvIGFuZCB0eXBlIGRlZmluaXRpb24gKi8KLQotI2RlZmluZSBIX0dFVF9GSUxFX1NJWkUoaCkJKHNpemVvZihzdHJ1Y3QgZXhlYykgKyBcCi0JCQkJIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKLQkJCQkgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkgKyBcCi0JCQkJIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgpICsgXAotCQkJCSBIX0dFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoKSArIFwKLQkJCQkgKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLQotI2RlZmluZSBIX0dFVF9IRUFERVJfU0laRShoKQkJKHNpemVvZihzdHJ1Y3QgZXhlYykpCi0jZGVmaW5lIEhfR0VUX1RFWFRfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfdGV4dCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9kYXRhKQotI2RlZmluZSBIX0dFVF9CU1NfU0laRShoKQkJKChoKS0+aGVhZGVyLmFfYnNzKQotI2RlZmluZSBIX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRShoKQkoKGgpLT5oZWFkZXIuYV90cnNpemUpCi0jZGVmaW5lIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKGgpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSkKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCkJKChoKS0+aGVhZGVyLmFfc3ltcykKLSNkZWZpbmUgSF9HRVRfTUFHSUNfTlVNQkVSKGgpCQkoKGgpLT5oZWFkZXIuYV9pbmZvKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKQkJKChoKS0+aGVhZGVyLmFfZW50cnkpCi0jZGVmaW5lIEhfR0VUX1NUUklOR19TSVpFKGgpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSkKLSNkZWZpbmUgSF9HRVRfTElORU5PX1NJWkUoaCkJCSgwKQotCi0jaWZkZWYgRVhFQ19NQUNISU5FX1RZUEUKLSNkZWZpbmUgSF9HRVRfTUFDSElORV9UWVBFKGgpCQkoKGgpLT5oZWFkZXIuYV9tYWNodHlwZSkKLSNlbmRpZiAvKiBFWEVDX01BQ0hJTkVfVFlQRSAqLwotI2lmZGVmIEVYRUNfVkVSU0lPTgotI2RlZmluZSBIX0dFVF9WRVJTSU9OKGgpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uKQotI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLwotCi0jZGVmaW5lIEhfU0VUX1RFWFRfU0laRShoLHYpCQkoKGgpLT5oZWFkZXIuYV90ZXh0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfZGF0YSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfYnNzID0gKHYpKQotCi0jZGVmaW5lIEhfU0VUX1JFTE9DQVRJT05fU0laRShoLHQsZCkJKEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKChoKSwodCkpLFwKLQkJCQkJIEhfU0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFKChoKSwoZCkpKQotCi0jZGVmaW5lIEhfU0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFKGgsdikJKChoKS0+aGVhZGVyLmFfdHJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1JFTE9DQVRJT05fU0laRShoLHYpCSgoaCktPmhlYWRlci5hX2Ryc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogXAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBubGlzdCkpCi0KLSNkZWZpbmUgSF9TRVRfTUFHSUNfTlVNQkVSKGgsdikJCSgoaCktPmhlYWRlci5hX21hZ2ljID0gKHYpKQotCi0jZGVmaW5lIEhfU0VUX0VOVFJZX1BPSU5UKGgsdikJCSgoaCktPmhlYWRlci5hX2VudHJ5ID0gKHYpKQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKLSNpZmRlZiBFWEVDX01BQ0hJTkVfVFlQRQotI2RlZmluZSBIX1NFVF9NQUNISU5FX1RZUEUoaCx2KQkJKChoKS0+aGVhZGVyLmFfbWFjaHR5cGUgPSAodikpCi0jZW5kaWYgLyogRVhFQ19NQUNISU5FX1RZUEUgKi8KLSNpZmRlZiBFWEVDX1ZFUlNJT04KLSNkZWZpbmUgSF9TRVRfVkVSU0lPTihoLHYpCQkoKGgpLT5oZWFkZXIuYV92ZXJzaW9uID0gKHYpKQotI2VuZGlmIC8qIEVYRUNfVkVSU0lPTiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IGV4ZWMgaGVhZGVyOwkJLyogYS5vdXQgaGVhZGVyICovCi0gICAgbG9uZyBzdHJpbmdfdGFibGVfc2l6ZTsJLyogbmFtZXMgKyAnXDAnICsgc2l6ZW9mKGludCkgKi8KLSAgfQotCi1vYmplY3RfaGVhZGVyczsKLQotLyogdW51c2VkIGhvb2tzLiAqLwotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9Ci0jZGVmaW5lIG9ial9wcmVfd3JpdGVfaG9vayhhKQkJezt9Ci0KLSNpZiBfX1NURENfXwotc3RydWN0IGZpeDsKLSNlbmRpZgotZXh0ZXJuIHZvaWQgdGNfYW91dF9maXhfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqd2hlcmUsCi0JCQkJCSAgc3RydWN0IGZpeCAqZml4UCwKLQkJCQkJICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3MpKTsKLWV4dGVybiB2b2lkIHRjX2JvdXRfZml4X3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKndoZXJlLAotCQkJCQkgIHN0cnVjdCBmaXggKmZpeFAsCi0JCQkJCSAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzKSk7Ci0KLSNkZWZpbmUgQU9VVF9TVEFCUwotCi0vKiBlbmQgb2Ygb2JqLWJvdXQuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5jIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODFkMjNkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWNvZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ODggKzAsMCBAQAotLyogY29mZiBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBPQkpfSEVBREVSICJvYmotY29mZi5oIgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0vKiBJIHRoaW5rIHRoaXMgaXMgcHJvYmFibHkgYWx3YXlzIGNvcnJlY3QuICAqLwotI2lmbmRlZiBLRUVQX1JFTE9DX0lORk8KLSNkZWZpbmUgS0VFUF9SRUxPQ19JTkZPCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgb2JqX2NvZmZfYnNzIFBBUkFNUyAoKGludCkpOwotY29uc3QgY2hhciAqc19nZXRfbmFtZSBQQVJBTVMgKChzeW1ib2xTICogcykpOwotc3RhdGljIHN5bWJvbFMgKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3M7Ci0KLQwKLS8qIHN0YWNrIHN0dWZmICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBjaHVua19zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgZWxlbWVudF9zaXplOwotICAgIHVuc2lnbmVkIGxvbmcgc2l6ZTsKLSAgICBjaGFyICpkYXRhOwotICAgIHVuc2lnbmVkIGxvbmcgcG9pbnRlcjsKLSAgfQotc3RhY2s7Ci0KLXN0YXRpYyBzdGFjayAqCi1zdGFja19pbml0IChjaHVua19zaXplLCBlbGVtZW50X3NpemUpCi0gICAgIHVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZTsKLSAgICAgdW5zaWduZWQgbG9uZyBlbGVtZW50X3NpemU7Ci17Ci0gIHN0YWNrICpzdDsKLQotICBzdCA9IChzdGFjayAqKSBtYWxsb2MgKHNpemVvZiAoc3RhY2spKTsKLSAgaWYgKCFzdCkKLSAgICByZXR1cm4gMDsKLSAgc3QtPmRhdGEgPSBtYWxsb2MgKGNodW5rX3NpemUpOwotICBpZiAoIXN0LT5kYXRhKQotICAgIHsKLSAgICAgIGZyZWUgKHN0KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgc3QtPnBvaW50ZXIgPSAwOwotICBzdC0+c2l6ZSA9IGNodW5rX3NpemU7Ci0gIHN0LT5jaHVua19zaXplID0gY2h1bmtfc2l6ZTsKLSAgc3QtPmVsZW1lbnRfc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIHN0OwotfQotCi0jaWYgMAotLyogTm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLXN0YXRpYyB2b2lkCi1zdGFja19kZWxldGUgKHN0KQotICAgICBzdGFjayAqc3Q7Ci17Ci0gIGZyZWUgKHN0LT5kYXRhKTsKLSAgZnJlZSAoc3QpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjaGFyICoKLXN0YWNrX3B1c2ggKHN0LCBlbGVtZW50KQotICAgICBzdGFjayAqc3Q7Ci0gICAgIGNoYXIgKmVsZW1lbnQ7Ci17Ci0gIGlmIChzdC0+cG9pbnRlciArIHN0LT5lbGVtZW50X3NpemUgPj0gc3QtPnNpemUpCi0gICAgewotICAgICAgc3QtPnNpemUgKz0gc3QtPmNodW5rX3NpemU7Ci0gICAgICBpZiAoKHN0LT5kYXRhID0geHJlYWxsb2MgKHN0LT5kYXRhLCBzdC0+c2l6ZSkpID09IChjaGFyICopIDApCi0JcmV0dXJuIChjaGFyICopIDA7Ci0gICAgfQotICBtZW1jcHkgKHN0LT5kYXRhICsgc3QtPnBvaW50ZXIsIGVsZW1lbnQsIHN0LT5lbGVtZW50X3NpemUpOwotICBzdC0+cG9pbnRlciArPSBzdC0+ZWxlbWVudF9zaXplOwotICByZXR1cm4gc3QtPmRhdGEgKyBzdC0+cG9pbnRlcjsKLX0KLQotc3RhdGljIGNoYXIgKgotc3RhY2tfcG9wIChzdCkKLSAgICAgc3RhY2sgKnN0OwotewotICBpZiAoc3QtPnBvaW50ZXIgPCBzdC0+ZWxlbWVudF9zaXplKQotICAgIHsKLSAgICAgIHN0LT5wb2ludGVyID0gMDsKLSAgICAgIHJldHVybiAoY2hhciAqKSAwOwotICAgIH0KLSAgc3QtPnBvaW50ZXIgLT0gc3QtPmVsZW1lbnRfc2l6ZTsKLSAgcmV0dXJuIHN0LT5kYXRhICsgc3QtPnBvaW50ZXI7Ci19Ci0MCi0vKgotICogTWFpbnRhaW4gYSBsaXN0IG9mIHRoZSB0YWduYW1lcyBvZiB0aGUgc3RydWN0cmVzLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWdfaGFzaDsKLQotc3RhdGljIHZvaWQKLXRhZ19pbml0ICgpCi17Ci0gIHRhZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi10YWdfaW5zZXJ0IChuYW1lLCBzeW1ib2xQKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBjb25zdCBjaGFyICplcnJvcl9zdHJpbmc7Ci0KLSAgaWYgKChlcnJvcl9zdHJpbmcgPSBoYXNoX2phbSAodGFnX2hhc2gsIG5hbWUsIChjaGFyICopIHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cnVjdHVyZSB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCW5hbWUsIGVycm9yX3N0cmluZyk7Ci0gICAgfQotfQotCi1zdGF0aWMgc3ltYm9sUyAqCi10YWdfZmluZCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIGlmICgqbmFtZSA9PSAnXycpCi0gICAgbmFtZSsrOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLSAgcmV0dXJuIChzeW1ib2xTICopIGhhc2hfZmluZCAodGFnX2hhc2gsIG5hbWUpOwotfQotCi1zdGF0aWMgc3ltYm9sUyAqCi10YWdfZmluZF9vcl9tYWtlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGlmICgoc3ltYm9sUCA9IHRhZ19maW5kIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkgICAgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICAgICAgdGFnX2luc2VydCAoU19HRVRfTkFNRSAoc3ltYm9sUCksIHN5bWJvbFApOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotI2VuZGlmCi0gICAgfQkJCQkvKiBub3QgZm91bmQgKi8KLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQotLyogV2UgYWNjZXB0IHRoZSAuYnNzIGRpcmVjdGl2ZSB0byBzZXQgdGhlIHNlY3Rpb24gZm9yIGJhY2t3YXJkCi0gICBjb21wYXRpYmlsaXR5IHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBnYXMuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfYnNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0gICAgc3Vic2VnX25ldyAoIi5ic3MiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIGVsc2UKLSAgICBzX2xjb21tICgwKTsKLX0KLQotLyogSGFuZGxlIC53ZWFrLiAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAKLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1MRVIKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19OVF9XRUFLKTsKLSNlbHNlCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1dFQUtFWFQpOwotI2VuZGlmCi0KLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotc3RhdGljIHZvaWQgU0FfU0VUX1NZTV9UQUdORFggUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLQotI2RlZmluZSBHRVRfRklMRU5BTUVfU1RSSU5HKFgpIFwKLSgoY2hhciopKCYoKFgpLT5zeV9zeW1ib2wub3N0X2F1eGVudC0+eF9maWxlLnhfbi54X29mZnNldCkpWzFdKQotCi0vKiBAQCBJY2suICAqLwotc3RhdGljIHNlZ1QKLWZldGNoX2NvZmZfZGVidWdfc2VjdGlvbiAoKQotewotICBzdGF0aWMgc2VnVCBkZWJ1Z19zZWN0aW9uOwotICBpZiAoIWRlYnVnX3NlY3Rpb24pCi0gICAgewotICAgICAgQ09OU1QgYXN5bWJvbCAqczsKLSAgICAgIHMgPSBiZmRfbWFrZV9kZWJ1Z19zeW1ib2wgKHN0ZG91dHB1dCwgKGNoYXIgKikgMCwgMCk7Ci0gICAgICBhc3NlcnQgKHMgIT0gMCk7Ci0gICAgICBkZWJ1Z19zZWN0aW9uID0gcy0+c2VjdGlvbjsKLSAgICB9Ci0gIHJldHVybiBkZWJ1Z19zZWN0aW9uOwotfQotCi12b2lkCi1TQV9TRVRfU1lNX0VORE5EWCAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgc3ltYm9sUyAqdmFsOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICplbnRyeSwgKnA7Ci0KLSAgZW50cnkgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbMV07Ci0gIHAgPSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAodmFsKSktPm5hdGl2ZTsKLSAgZW50cnktPnUuYXV4ZW50Lnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4LnAgPSBwOwotICBlbnRyeS0+Zml4X2VuZCA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1TQV9TRVRfU1lNX1RBR05EWCAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgc3ltYm9sUyAqdmFsOwotewotICBjb21iaW5lZF9lbnRyeV90eXBlICplbnRyeSwgKnA7Ci0KLSAgZW50cnkgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbMV07Ci0gIHAgPSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAodmFsKSktPm5hdGl2ZTsKLSAgZW50cnktPnUuYXV4ZW50Lnhfc3ltLnhfdGFnbmR4LnAgPSBwOwotICBlbnRyeS0+Zml4X3RhZyA9IDE7Ci19Ci0KLXN0YXRpYyBpbnQKLVNfR0VUX0RBVEFfVFlQRSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl90eXBlOwotfQotCi1pbnQKLVNfU0VUX0RBVEFfVFlQRSAoc3ltLCB2YWwpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50IHZhbDsKLXsKLSAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmUtPnUuc3ltZW50Lm5fdHlwZSA9IHZhbDsKLSAgcmV0dXJuIHZhbDsKLX0KLQotaW50Ci1TX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgcmV0dXJuIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pKS0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzczsKLX0KLQotaW50Ci1TX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIHZhbCkKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBpbnQgdmFsOwotewotICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPSB2YWw7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIE1lcmdlIGEgZGVidWcgc3ltYm9sIGNvbnRhaW5pbmcgZGVidWcgaW5mb3JtYXRpb24gaW50byBhIG5vcm1hbCBzeW1ib2wuICovCi0KLXZvaWQKLWNfc3ltYm9sX21lcmdlIChkZWJ1Zywgbm9ybWFsKQotICAgICBzeW1ib2xTICpkZWJ1ZzsKLSAgICAgc3ltYm9sUyAqbm9ybWFsOwotewotICBTX1NFVF9EQVRBX1RZUEUgKG5vcm1hbCwgU19HRVRfREFUQV9UWVBFIChkZWJ1ZykpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChub3JtYWwsIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlYnVnKSk7Ci0KLSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSA+IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCkpCi0gICAgewotICAgICAgLyogdGFrZSB0aGUgbW9zdCB3ZSBoYXZlICovCi0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwsIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKGRlYnVnKSk7Ci0gICAgfQotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiAwKQotICAgIHsKLSAgICAgIC8qIE1vdmUgYWxsIHRoZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uICAqLwotICAgICAgbWVtY3B5IChTWU1fQVVYSU5GTyAobm9ybWFsKSwgU1lNX0FVWElORk8gKGRlYnVnKSwKLQkgICAgICAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpCi0JICAgICAgICogc2l6ZW9mICgqU1lNX0FVWElORk8gKGRlYnVnKSkpKTsKLSAgICB9Ci0KLSAgLyogTW92ZSB0aGUgZGVidWcgZmxhZ3MuICovCi0gIFNGX1NFVF9ERUJVR19GSUVMRCAobm9ybWFsLCBTRl9HRVRfREVCVUdfRklFTEQgKGRlYnVnKSk7Ci19Ci0KLXZvaWQKLWNfZG90X2ZpbGVfc3ltYm9sIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKGZpbGVuYW1lLCBiZmRfYWJzX3NlY3Rpb25fcHRyLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfRklMRSk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgPSBCU0ZfREVCVUdHSU5HOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlsaXN0aW5nX3NvdXJjZV9maWxlIChmaWxlbmFtZSk7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wgaXMgZmlyc3Qgb24gdGhlIHN5bWJvbCBjaGFpbiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQICE9IHN5bWJvbFApCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW1ib2xQLCBzeW1ib2xfcm9vdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0JCQkJLyogaWYgbm90IGZpcnN0IG9uIHRoZSBsaXN0ICovCi19Ci0KLS8qIExpbmUgbnVtYmVyIGhhbmRsaW5nICovCi0KLXN0cnVjdCBsaW5lX25vIHsKLSAgc3RydWN0IGxpbmVfbm8gKm5leHQ7Ci0gIGZyYWdTICpmcmFnOwotICBhbGVudCBsOwotfTsKLQotaW50IGNvZmZfbGluZV9iYXNlOwotCi0vKiBTeW1ib2wgb2YgbGFzdCBmdW5jdGlvbiwgd2hpY2ggd2Ugc2hvdWxkIGhhbmcgbGluZSNzIG9mZiBvZi4gICovCi1zdGF0aWMgc3ltYm9sUyAqbGluZV9mc3ltOwotCi0jZGVmaW5lIGluX2Z1bmN0aW9uKCkJCShsaW5lX2ZzeW0gIT0gMCkKLSNkZWZpbmUgY2xlYXJfZnVuY3Rpb24oKQkobGluZV9mc3ltID0gMCkKLSNkZWZpbmUgc2V0X2Z1bmN0aW9uKEYpCQkobGluZV9mc3ltID0gKEYpLCBjb2ZmX2FkZF9saW5lc3ltIChGKSkKLQotDAotdm9pZAotY29mZl9vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBsb25nICAgc3ogPSAoT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgKyAxKSAqIHNpemVvZiAoY29tYmluZWRfZW50cnlfdHlwZSk7Ci0gIGNoYXIgKiBzICA9IChjaGFyICopIHhtYWxsb2MgKHN6KTsKLSAgCi0gIG1lbXNldCAocywgMCwgc3opOwotICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCkpLT5uYXRpdmUgPSAoY29tYmluZWRfZW50cnlfdHlwZSAqKSBzOwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoc3ltYm9sUCwgVF9OVUxMKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgMCk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDApOwotCi0gIGlmIChTX0lTX1NUUklORyAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX1NUUklORyAoc3ltYm9sUCk7Ci0gIAotICBpZiAoU19JU19MT0NBTCAoc3ltYm9sUCkpCi0gICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLX0KLQotDAotLyoKLSAqIEhhbmRsZSAubG4gZGlyZWN0aXZlcy4KLSAqLwotCi1zdGF0aWMgc3ltYm9sUyAqY3VycmVudF9saW5lbm9fc3ltOwotc3RhdGljIHN0cnVjdCBsaW5lX25vICpsaW5lX25vczsKLS8qIEBAIEJsaW5kbHkgYXNzdW1lIGFsbCAubG4gZGlyZWN0aXZlcyB3aWxsIGJlIGluIHRoZSAudGV4dCBzZWN0aW9uLi4uICAqLwotaW50IGNvZmZfbl9saW5lX25vczsKLQotc3RhdGljIHZvaWQKLWFkZF9saW5lbm8gKGZyYWcsIG9mZnNldCwgbnVtKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IG51bTsKLXsKLSAgc3RydWN0IGxpbmVfbm8gKm5ld19saW5lID0KLSAgICAoc3RydWN0IGxpbmVfbm8gKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbGluZV9ubykpOwotICBpZiAoIWN1cnJlbnRfbGluZW5vX3N5bSkKLSAgICB7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIG5ld19saW5lLT5uZXh0ID0gbGluZV9ub3M7Ci0gIG5ld19saW5lLT5mcmFnID0gZnJhZzsKLSAgbmV3X2xpbmUtPmwubGluZV9udW1iZXIgPSBudW07Ci0gIG5ld19saW5lLT5sLnUub2Zmc2V0ID0gb2Zmc2V0OwotICBsaW5lX25vcyA9IG5ld19saW5lOwotICBjb2ZmX25fbGluZV9ub3MrKzsKLX0KLQotdm9pZAotY29mZl9hZGRfbGluZXN5bSAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChsaW5lX25vcykKLSAgICB7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoY3VycmVudF9saW5lbm9fc3ltKSktPmxpbmVubyA9Ci0JKGFsZW50ICopIGxpbmVfbm9zOwotICAgICAgY29mZl9uX2xpbmVfbm9zKys7Ci0gICAgICBsaW5lX25vcyA9IDA7Ci0gICAgfQotICBjdXJyZW50X2xpbmVub19zeW0gPSBzeW07Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9sbiAoYXBwbGluZSkKLSAgICAgaW50IGFwcGxpbmU7Ci17Ci0gIGludCBsOwotCi0gIGlmICghIGFwcGxpbmUgJiYgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5sbiBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKCFhcHBsaW5lKQotICAgIHsKLSAgICAgIGFkZF9saW5lbm8gKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIGwpOwotICAgIH0KLQotICBpZiAoYXBwbGluZSkKLSAgICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCBsIC0gMSk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICB7Ci0gICAgZXh0ZXJuIGludCBsaXN0aW5nOwotCi0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JaWYgKCEgYXBwbGluZSkKLQkgIGwgKz0gY29mZl9saW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKGwpOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICoJCQlkZWYoKQotICoKLSAqIEhhbmRsZSAuZGVmIGRpcmVjdGl2ZXMuCi0gKgotICogT25lIG1pZ2h0IGFzayA6IHdoeSBjYW4ndCB3ZSBzeW1ib2xfbmV3IGlmIHRoZSBzeW1ib2wgZG9lcyBub3QKLSAqIGFscmVhZHkgZXhpc3QgYW5kIGZpbGwgaXQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4gIEJlY2F1c2Ugb2YKLSAqIHRoZSBDX0VGQ04gc3BlY2lhbCBzeW1ib2wuIEl0IHdvdWxkIGNsb2JiZXIgdGhlIHZhbHVlIG9mIHRoZQotICogZnVuY3Rpb24gc3ltYm9sIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIG5vdGljZSB0aGF0IGl0IGlzCi0gKiBhIENfRUZDTi4gQW5kIGEgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG1vcmUgY2xlYXIgdGhpcwotICogd2F5LiAoYXQgbGVhc3QgSSB0aGluayBpdCBpcyA6LSkuCi0gKgotICovCi0KLSNkZWZpbmUgU0tJUF9TRU1JX0NPTE9OKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnOycpCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRVMoKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgXAotCQkJCSAgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcdCcpIFwKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RlZiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIGNoYXIgbmFtZV9lbmQ7CQkvKiBDaGFyIGFmdGVyIHRoZSBlbmQgb2YgbmFtZSAqLwotICBjaGFyICpzeW1ib2xfbmFtZTsJCS8qIE5hbWUgb2YgdGhlIGRlYnVnIHN5bWJvbCAqLwotICBjaGFyICpzeW1ib2xfbmFtZV9jb3B5OwkvKiBUZW1wb3JhcnkgY29weSBvZiB0aGUgbmFtZSAqLwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfbGVuZ3RoOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTS0lQX1dISVRFU1BBQ0VTICgpOwotCi0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgaWYgKHN5bWJvbF9uYW1lWzBdID09ICdfJyAmJiBzeW1ib2xfbmFtZVsxXSAhPSAwKQotICAgIHN5bWJvbF9uYW1lKys7Ci0jZW5kaWYgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotCi0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbF9uYW1lX2xlbmd0aCA9IHN0cmxlbiAoc3ltYm9sX25hbWUpOwotICBzeW1ib2xfbmFtZV9jb3B5ID0geG1hbGxvYyAoc3ltYm9sX25hbWVfbGVuZ3RoICsgMSk7Ci0gIHN0cmNweSAoc3ltYm9sX25hbWVfY29weSwgc3ltYm9sX25hbWUpOwotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZV9jb3B5ID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZV9jb3B5KTsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemUgdGhlIG5ldyBzeW1ib2wgKi8KLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IHN5bWJvbF9tYWtlIChzeW1ib2xfbmFtZV9jb3B5KTsKLSAgc3ltYm9sX3NldF9mcmFnIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMCk7Ci0KLSAgaWYgKFNfSVNfU1RSSU5HIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICBTRl9TRVRfU1RSSU5HIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdW5zaWduZWQgaW50IGRpbV9pbmRleDsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2VuZGVmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgLyogRElNIEJVRyBGSVggc2FjQGN5Z251cy5jb20gKi8KLSAgZGltX2luZGV4ID0gMDsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBudW1iZXIgYWNjb3JkaW5nIHRvIHN0b3JhZ2UgY2xhc3MuICovCi0gIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIFNGX1NFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRklMRToKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZmV0Y2hfY29mZl9kZWJ1Z19zZWN0aW9uICgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VGQ046Ci0gICAgICBTRl9TRVRfTE9DQUwgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBEbyBub3QgZW1pdCB0aGlzIHN5bWJvbC4gKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0JMT0NLOgotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBXaWxsIG5lZWQgcHJvY2Vzc2luZyBiZWZvcmUgd3JpdGluZyAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRkNOOgotICAgICAgewotCUNPTlNUIGNoYXIgKm5hbWU7Ci0JU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGV4dF9zZWN0aW9uKTsKLQotCW5hbWUgPSBTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQlpZiAobmFtZVsxXSA9PSAnYicgJiYgbmFtZVsyXSA9PSAnZicpCi0JICB7Ci0JICAgIGlmICghIGluX2Z1bmN0aW9uICgpKQotCSAgICAgIGFzX3dhcm4gKF8oImAlcycgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uIiksIG5hbWUpOwotLyoJICAgIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMTIzNDUpOyovCi0JICAgIC8qIFdpbGwgbmVlZCByZWxvY2F0aW5nICovCi0JICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQkgICAgY2xlYXJfZnVuY3Rpb24gKCk7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIENfQVVUT0FSRwotICAgIGNhc2UgQ19BVVRPQVJHOgotI2VuZGlmIC8qIENfQVVUT0FSRyAqLwotICAgIGNhc2UgQ19BVVRPOgotICAgIGNhc2UgQ19SRUc6Ci0gICAgY2FzZSBDX0FSRzoKLSAgICBjYXNlIENfUkVHUEFSTToKLSAgICBjYXNlIENfRklFTEQ6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ19NT1M6Ci0gICAgY2FzZSBDX01PRToKLSAgICBjYXNlIENfTU9VOgotICAgIGNhc2UgQ19FT1M6Ci0gICAgICBTX1NFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VYVDoKLSAgICBjYXNlIENfV0VBS0VYVDoKLSNpZmRlZiBURV9QRQotICAgIGNhc2UgQ19OVF9XRUFLOgotI2VuZGlmCi0gICAgY2FzZSBDX1NUQVQ6Ci0gICAgY2FzZSBDX0xBQkVMOgotICAgICAgLyogVmFsaWQgYnV0IHNldCBzb21ld2hlcmUgZWxzZSAoc19jb21tLCBzX2xjb21tLCBjb2xvbikgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICBjYXNlIENfVVNUQVRJQzoKLSAgICBjYXNlIENfRVhUREVGOgotICAgIGNhc2UgQ19VTEFCRUw6Ci0gICAgICBhc193YXJuIChfKCJ1bmV4cGVjdGVkIHN0b3JhZ2UgY2xhc3MgJWQiKSwKLQkgICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICAgICAgYnJlYWs7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gc3RvcmFnZSBjbGFzcyAqLwotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYnVpbHQgYSBkZWJ1ZyBzeW1ib2wsIHRyeSB0byBmaW5kIGlmIHdlIHNob3VsZAotICAgICBtZXJnZSB3aXRoIGFuIGV4aXN0aW5nIHN5bWJvbCBvciBub3QuICBJZiBhIHN5bWJvbCBpcyBDX0VGQ04gb3IKLSAgICAgU0VHX0FCU09MVVRFIG9yIHVudGFnZ2VkIFNFR19ERUJVRyBpdCBuZXZlciBtZXJnZXMuICovCi0KLSAgLyogVHdvIGNhc2VzIGZvciBmdW5jdGlvbnMuICBFaXRoZXIgZGVidWcgZm9sbG93ZWQgYnkgZGVmaW5pdGlvbiBvcgotICAgICBkZWZpbml0aW9uIGZvbGxvd2VkIGJ5IGRlYnVnLiAgRm9yIGRlZmluaXRpb24gZmlyc3QsIHdlIHdpbGwKLSAgICAgbWVyZ2UgdGhlIGRlYnVnIHN5bWJvbCBpbnRvIHRoZSBkZWZpbml0aW9uLiAgRm9yIGRlYnVnIGZpcnN0LCB0aGUKLSAgICAgbGluZW5vIGVudHJ5IE1VU1QgcG9pbnQgdG8gdGhlIGRlZmluaXRpb24gZnVuY3Rpb24gb3IgZWxzZSBpdAotICAgICB3aWxsIHBvaW50IG9mZiBpbnRvIHNwYWNlIHdoZW4gb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpIG1lcmdlcwotICAgICB0aGUgZGVidWcgc3ltYm9sIGludG8gdGhlIHJlYWwgc3ltYm9sLiAgVGhlcmVmb3IsIGxldCdzIHByZXN1bWUKLSAgICAgdGhlIGRlYnVnIHN5bWJvbCBpcyBhIHJlYWwgZnVuY3Rpb24gcmVmZXJlbmNlLiAqLwotCi0gIC8qIEZJWE1FLVNPT04gSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBkZWZpbml0aW9uIGxhYmVsL3N5bWJvbCBpcwotICAgICBuZXZlciBzZWVuLCB0aGlzIHdpbGwgcHJvYmFibHkgbGVhdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCBhdCBsaW5rCi0gICAgIHRpbWUuICovCi0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfRUZDTgotICAgICAgfHwgKCFzdHJjbXAgKGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCSBTX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSksCi0JCSAgICIqREVCVUcqIikKLQkgICYmICFTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IGFic29sdXRlX3NlY3Rpb24KLSAgICAgIHx8IChzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIERPX05PVF9TVFJJUCkpID09IE5VTEwpCi0gICAgewotICAgICAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gc3ltYm9sX2xhc3RQKQotCXN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwKLQkJICAgICAgICZzeW1ib2xfbGFzdFApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCBtZXJnZSB0aGUgbmV3bHkgY3JlYXRlZCBzeW1ib2wKLQkgaW50byB0aGUgb2xkIG9uZS4gIFRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIGxpbmtlciBjYW4KLQkgaGFuZGxlIGR1cGxpY2F0ZSBzeW1ib2xzIGNvcnJlY3RseS4gQnV0IEkgZ3Vlc3MgdGhhdCBpdCBzYXZlCi0JIGEgKmxvdCogb2Ygc3BhY2UgaWYgdGhlIGFzc2VtYmx5IGZpbGUgZGVmaW5lcyBhIGxvdCBvZgotCSBzeW1ib2xzLiBbbG9pY10gKi8KLQotICAgICAgLyogVGhlIGRlYnVnIGVudHJ5IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSBpcyBtZXJnZWQgaW50byB0aGUKLQkgcHJldmlvdXMgZGVmaW5pdGlvbi4gKi8KLQotICAgICAgY19zeW1ib2xfbWVyZ2UgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbFApOwotICAgICAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0KLSAgICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBzeW1ib2xQOwotCi0gICAgICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCSAgfHwgU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykKLQkgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfU1RBVCkKLQl7Ci0JICAvKiBGb3IgZnVuY3Rpb25zLCBhbmQgdGFncywgYW5kIHN0YXRpYyBzeW1ib2xzLCB0aGUgc3ltYm9sCi0JICAgICAqbXVzdCogYmUgd2hlcmUgdGhlIGRlYnVnIHN5bWJvbCBhcHBlYXJzLiAgTW92ZSB0aGUKLQkgICAgIGV4aXN0aW5nIHN5bWJvbCB0byB0aGUgY3VycmVudCBwbGFjZS4gKi8KLQkgIC8qIElmIGl0IGFscmVhZHkgaXMgYXQgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGxpc3QsIGRvIG5vdGhpbmcgKi8KLQkgIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IHN5bWJvbF9sYXN0UCkKLQkgICAgewotCSAgICAgIHN5bWJvbF9yZW1vdmUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCSAgICAgIHN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpvbGR0YWc7Ci0KLSAgICAgIG9sZHRhZyA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLAotCQkJCSBET19OT1RfU1RSSVApOwotICAgICAgaWYgKG9sZHRhZyA9PSBOVUxMIHx8ICEgU0ZfR0VUX1RBRyAob2xkdGFnKSkKLQl0YWdfaW5zZXJ0IChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJICAgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgIH0KLQotICBpZiAoU0ZfR0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkKLSAgICB7Ci0gICAgICBrbm93IChzaXplb2YgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpIDw9IHNpemVvZiAobG9uZykpOwotICAgICAgc2V0X2Z1bmN0aW9uIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotICAgICAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGF0IGlzLCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhlCi0JICAgICBmdW5jdGlvbi4uLiAqLwotCSAgc3ltYm9sX3RhYmxlX2luc2VydCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JfSAvKiBkZWZpbml0aW9uIGZvbGxvd3MgZGVidWcgKi8KLSAgICB9IC8qIENyZWF0ZSB0aGUgbGluZSBudW1iZXIgZW50cnkgcG9pbnRpbmcgdG8gdGhlIGZ1bmN0aW9uIGJlaW5nIGRlZmluZWQgKi8KLQotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzID0gTlVMTDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RpbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgZGltX2luZGV4OwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0KLSAgZm9yIChkaW1faW5kZXggPSAwOyBkaW1faW5kZXggPCBESU1OVU07IGRpbV9pbmRleCsrKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRVMgKCk7Ci0gICAgICBTQV9TRVRfU1lNX0RJTUVOIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBkaW1faW5kZXgsCi0JCQlnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnLCc6Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFzX3dhcm4gKF8oImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIikpOwotCSAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLQljYXNlICdcbic6Ci0JY2FzZSAnOyc6Ci0JICBkaW1faW5kZXggPSBESU1OVU07Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCB0aGlzX2Jhc2U7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBQcm9iYWJseSBzdGFicy1zdHlsZSBsaW5lPyAgKi8KLSAgICAgIG9ial9jb2ZmX2xuICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdGhpc19iYXNlID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICghc3RyY21wICgiLmJmIiwgU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpKQotICAgIGNvZmZfbGluZV9iYXNlID0gdGhpc19iYXNlOwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX0xOTk8gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGNvZmZfbGluZV9iYXNlKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKHN0cmNtcCAoIi5iZiIsIFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKSA9PSAwKQotICAgIHsKLSAgICAgIGV4dGVybiBpbnQgbGlzdGluZzsKLQotICAgICAgaWYgKGxpc3RpbmcpCi0JbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgY29mZl9saW5lX2Jhc2UpOwotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX1NJWkUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnN5bWJvbF9uYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLQotICAvKiBBc3N1bWUgdGhhdCB0aGUgc3ltYm9sIHJlZmVycmVkIHRvIGJ5IC50YWcgaXMgYWx3YXlzIGRlZmluZWQuCi0gICAgIFRoaXMgd2FzIGEgYmFkIGFzc3VtcHRpb24uICBJJ3ZlIGFkZGVkIGZpbmRfb3JfbWFrZS4geG94b3JpY2guICovCi0gIFNBX1NFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLAotCQkgICAgIHRhZ19maW5kX29yX21ha2UgKHN5bWJvbF9uYW1lKSk7Ci0gIGlmIChTQV9HRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gMEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygidGFnIG5vdCBmb3VuZCBmb3IgLnRhZyAlcyIpLCBzeW1ib2xfbmFtZSk7Ci0gICAgfQkJCQkvKiBub3QgZGVmaW5lZCAqLwotCi0gIFNGX1NFVF9UQUdHRUQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3R5cGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9EQVRBX1RZUEUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBpZiAoSVNGQ04gKFNfR0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpICYmCi0gICAgICBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSAhPSBDX1RQREVGKQotICAgIHsKLSAgICAgIFNGX1NFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICAgfQkJCQkvKiBpcyBhIGZ1bmN0aW9uICovCi0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgY2hhciBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHN5bWJvbF9uYW1lID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZSk7Ci0jZW5kaWYKLSAgICAgIGlmICghc3RyY21wIChzeW1ib2xfbmFtZSwgIi4iKSkKLQl7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGZyYWdfbm93KTsKLQkgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgLyogSWYgdGhlIC52YWwgaXMgIT0gZnJvbSB0aGUgLmRlZiAoZS5nLiBzdGF0aWNzKSAqLwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksIHN5bWJvbF9uYW1lKSkKLQl7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIGV4cC5YX29wID0gT19zeW1ib2w7Ci0JICBleHAuWF9hZGRfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpOwotCSAgZXhwLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotCSAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAmZXhwKTsKLQotCSAgLyogSWYgdGhlIHNlZ21lbnQgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIGZvcndhcmQgcmVmZXJlbmNlIGlzCi0JICAgICByZXNvbHZlZCwgdGhlbiBjb3B5IHRoZSBzZWdtZW50IGlkIGZyb20gdGhlIGZvcndhcmQKLQkgICAgIHN5bWJvbC4gICovCi0JICBTRl9TRVRfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCX0KLSAgICAgIC8qIE90aGVyd2lzZSwgaXQgaXMgdGhlIG5hbWUgb2YgYSBub24gZGVidWcgc3ltYm9sIGFuZCBpdHMgdmFsdWUgd2lsbCBiZSBjYWxjdWxhdGVkIGxhdGVyLiAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gICAgfQkJCQkvKiBpZiBzeW1ib2wgYmFzZWQgKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1jb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSAgLyogVGhlc2UgaGFkIGJldHRlciBiZSB0aGUgc2FtZS4gIFVzdWFsbHkgMTggYnl0ZXMuICovCi0jaWZuZGVmIEJGRF9IRUFERVJTCi0gIGtub3cgKHNpemVvZiAoU1lNRU5UKSA9PSBzaXplb2YgKEFVWEVOVCkpOwotICBrbm93IChTWU1FU1ogPT0gQVVYRVNaKTsKLSNlbmRpZgotICB0YWdfaW5pdCAoKTsKLX0KLQotCi1zeW1ib2xTICpjb2ZmX2xhc3RfZnVuY3Rpb247Ci1zdGF0aWMgc3ltYm9sUyAqY29mZl9sYXN0X2JmOwotCi12b2lkCi1jb2ZmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgKnB1bnQ7Ci17Ci0gIHN0YXRpYyBzeW1ib2xTICpsYXN0X3RhZ1A7Ci0gIHN0YXRpYyBzdGFjayAqYmxvY2tfc3RhY2s7Ci0gIHN0YXRpYyBzeW1ib2xTICpzZXRfZW5kOwotICBzeW1ib2xTICpuZXh0X3NldF9lbmQgPSBOVUxMOwotCi0gIGlmIChzeW1wID09ICZhYnNfc3ltYm9sKQotICAgIHsKLSAgICAgICpwdW50ID0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cnJlbnRfbGluZW5vX3N5bSkKLSAgICBjb2ZmX2FkZF9saW5lc3ltICgoc3ltYm9sUyAqKSAwKTsKLQotICBpZiAoIWJsb2NrX3N0YWNrKQotICAgIGJsb2NrX3N0YWNrID0gc3RhY2tfaW5pdCAoNTEyLCBzaXplb2YgKHN5bWJvbFMqKSk7Ci0KLSAgaWYgKFNfSVNfV0VBSyAoc3ltcCkpCi0gICAgewotI2lmZGVmIFRFX1BFCi0gICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX05UX1dFQUspOwotI2Vsc2UKLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfV0VBS0VYVCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQgKHN5bXApCi0gICAgICAmJiAhU19JU19XRUFLIChzeW1wKQotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgIT0gQ19TVEFUKQotICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXAsIENfRVhUKTsKLQotICBpZiAoIVNGX0dFVF9ERUJVRyAoc3ltcCkpCi0gICAgewotICAgICAgc3ltYm9sUyAqcmVhbDsKLSAgICAgIGlmICghU0ZfR0VUX0xPQ0FMIChzeW1wKQotCSAgJiYgIVNGX0dFVF9TVEFUSUNTIChzeW1wKQotCSAgJiYgKHJlYWwgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChzeW1wKSwgRE9fTk9UX1NUUklQKSkKLQkgICYmIHJlYWwgIT0gc3ltcCkKLQl7Ci0JICBjX3N5bWJvbF9tZXJnZSAoc3ltcCwgcmVhbCk7Ci0JICAqcHVudCA9IDE7Ci0JfQotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKHN5bXApICYmICFTRl9HRVRfTE9DQUwgKHN5bXApKQotCXsKLQkgIGFzc2VydCAoU19HRVRfVkFMVUUgKHN5bXApID09IDApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bXApOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltcCkgPT0gdGV4dF9zZWN0aW9uCi0JICAgICAgJiYgc3ltcCAhPSBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+c3ltKQotCSAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0xBQkVMKTsKLQkgIGVsc2UKLQkgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCwgQ19TVEFUKTsKLQl9Ci0gICAgICBpZiAoU0ZfR0VUX1BST0NFU1MgKHN5bXApKQotCXsKLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0JMT0NLKQotCSAgICB7Ci0JICAgICAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHN5bXApLCAiLmJiIikpCi0JCXN0YWNrX3B1c2ggKGJsb2NrX3N0YWNrLCAoY2hhciAqKSAmc3ltcCk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltYm9sUyAqYmVnaW47Ci0JCSAgYmVnaW4gPSAqKHN5bWJvbFMgKiopIHN0YWNrX3BvcCAoYmxvY2tfc3RhY2spOwotCQkgIGlmIChiZWdpbiA9PSAwKQotCQkgICAgYXNfd2FybiAoXygibWlzbWF0Y2hlZCAuZWIiKSk7Ci0JCSAgZWxzZQotCQkgICAgbmV4dF9zZXRfZW5kID0gYmVnaW47Ci0JCX0KLQkgICAgfQotCSAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwICYmIFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCi0JICAgIHsKLQkgICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmF1eHA7Ci0JICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gc3ltcDsKLQkgICAgICBpZiAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltcCkgPCAxKQotCQlTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1wLCAxKTsKLQkgICAgICBhdXhwID0KLQkJJmNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPm5hdGl2ZVsxXS51LmF1eGVudDsKLQkgICAgICBtZW1zZXQgKGF1eHAtPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW4sIDAsCi0JCSAgICAgIHNpemVvZiAoYXV4cC0+eF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbikpOwotCSAgICB9Ci0JICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltcCkgPT0gQ19FRkNOKQotCSAgICB7Ci0JICAgICAgaWYgKGNvZmZfbGFzdF9mdW5jdGlvbiA9PSAwKQotCQlhc19mYXRhbCAoXygiQ19FRkNOIHN5bWJvbCBvdXQgb2Ygc2NvcGUiKSk7Ci0JICAgICAgU0FfU0VUX1NZTV9GU0laRSAoY29mZl9sYXN0X2Z1bmN0aW9uLAotCQkJCShsb25nKSAoU19HRVRfVkFMVUUgKHN5bXApCi0JCQkJCS0gU19HRVRfVkFMVUUgKGNvZmZfbGFzdF9mdW5jdGlvbikpKTsKLQkgICAgICBuZXh0X3NldF9lbmQgPSBjb2ZmX2xhc3RfZnVuY3Rpb247Ci0JICAgICAgY29mZl9sYXN0X2Z1bmN0aW9uID0gMDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKLQlTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1wLCBDX0VYVCk7Ci0gICAgICBlbHNlIGlmIChTRl9HRVRfTE9DQUwgKHN5bXApKQotCSpwdW50ID0gMTsKLQotICAgICAgaWYgKFNGX0dFVF9GVU5DVElPTiAoc3ltcCkpCi0Jc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLSAgICAgIC8qIG1vcmUgLi4uICovCi0gICAgfQotCi0gIGlmIChTRl9HRVRfVEFHIChzeW1wKSkKLSAgICBsYXN0X3RhZ1AgPSBzeW1wOwotICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1wKSA9PSBDX0VPUykKLSAgICBuZXh0X3NldF9lbmQgPSBsYXN0X3RhZ1A7Ci0KLSNpZmRlZiBPQkpfWENPRkYKLSAgLyogVGhpcyBpcyBwcmV0dHkgaG9ycmlibGUsIGJ1dCB3ZSBoYXZlIHRvIHNldCAqcHVudCBjb3JyZWN0bHkgaW4KLSAgICAgb3JkZXIgdG8gY2FsbCBTQV9TRVRfU1lNX0VORE5EWCBjb3JyZWN0bHkuICAqLwotICBpZiAoISBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzeW1wKQotICAgICAgJiYgKChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwCi0JICB8fCAoISBTX0lTX0VYVEVSTkFMIChzeW1wKQotCSAgICAgICYmICEgc3ltYm9sX2dldF90YyAoc3ltcCktPm91dHB1dAotCSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApICE9IENfRklMRSkpKQotICAgICpwdW50ID0gMTsKLSNlbmRpZgotCi0gIGlmIChzZXRfZW5kICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICEgKnB1bnQKLSAgICAgICYmICgoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyAmIEJTRl9OT1RfQVRfRU5EKSAhPSAwCi0JICB8fCAoU19JU19ERUZJTkVEIChzeW1wKQotCSAgICAgICYmICEgU19JU19DT01NT04gKHN5bXApCi0JICAgICAgJiYgKCEgU19JU19FWFRFUk5BTCAoc3ltcCkgfHwgU0ZfR0VUX0ZVTkNUSU9OIChzeW1wKSkpKSkKLSAgICB7Ci0gICAgICBTQV9TRVRfU1lNX0VORE5EWCAoc2V0X2VuZCwgc3ltcCk7Ci0gICAgICBzZXRfZW5kID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG5leHRfc2V0X2VuZCAhPSBOVUxMCi0gICAgICAmJiAhICpwdW50KQotICAgIHNldF9lbmQgPSBuZXh0X3NldF9lbmQ7Ci0KLSAgaWYgKCEgKnB1bnQKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bXApID09IENfRkNOCi0gICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKHN5bXApLCAiLmJmIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoY29mZl9sYXN0X2JmICE9IE5VTEwpCi0JU0FfU0VUX1NZTV9FTkRORFggKGNvZmZfbGFzdF9iZiwgc3ltcCk7Ci0gICAgICBjb2ZmX2xhc3RfYmYgPSBzeW1wOwotICAgIH0KLQotICBpZiAoY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApKS0+bGluZW5vKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgc3RydWN0IGxpbmVfbm8gKmxwdHI7Ci0gICAgICBhbGVudCAqbDsKLQotICAgICAgbHB0ciA9IChzdHJ1Y3QgbGluZV9ubyAqKSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCkpLT5saW5lbm87Ci0gICAgICBmb3IgKGkgPSAwOyBscHRyOyBscHRyID0gbHB0ci0+bmV4dCkKLQlpKys7Ci0gICAgICBscHRyID0gKHN0cnVjdCBsaW5lX25vICopIGNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKSktPmxpbmVubzsKLQotICAgICAgLyogV2UgbmVlZCBpIGVudHJpZXMgZm9yIGxpbmUgbnVtYmVycywgcGx1cyAxIGZvciB0aGUgZmlyc3QKLQkgZW50cnkgd2hpY2ggQkZEIHdpbGwgb3ZlcnJpZGUsIHBsdXMgMSBmb3IgdGhlIGxhc3QgemVybwotCSBlbnRyeSAoYSBtYXJrZXIgZm9yIEJGRCkuICAqLwotICAgICAgbCA9IChhbGVudCAqKSB4bWFsbG9jICgoaSArIDIpICogc2l6ZW9mIChhbGVudCkpOwotICAgICAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApKS0+bGluZW5vID0gbDsKLSAgICAgIGxbaSArIDFdLmxpbmVfbnVtYmVyID0gMDsKLSAgICAgIGxbaSArIDFdLnUuc3ltID0gTlVMTDsKLSAgICAgIGZvciAoOyBpID4gMDsgaS0tKQotCXsKLQkgIGlmIChscHRyLT5mcmFnKQotCSAgICBscHRyLT5sLnUub2Zmc2V0ICs9IGxwdHItPmZyYWctPmZyX2FkZHJlc3M7Ci0JICBsW2ldID0gbHB0ci0+bDsKLQkgIGxwdHIgPSBscHRyLT5uZXh0OwotCX0KLSAgICB9Ci19Ci0KLXZvaWQKLWNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcyAoYWJmZCwgc2VjLCB4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4OwotewotICBzeW1ib2xTICpzZWNzeW07Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGludCBubG5ubywgbnJlbG9jcyA9IDA7Ci0KLSAgLyogUlMvNjAwMCBnYXMgY3JlYXRlcyBhIC5kZWJ1ZyBzZWN0aW9uIG1hbnVhbGx5IGluIHBwY19mcm9iX2ZpbGUgaW4KLSAgICAgdGMtcHBjLmMuICBEbyBub3QgZ2V0IGNvbmZ1c2VkIGJ5IGl0LiAgKi8KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCFzdHJjbXAgKHNlYy0+bmFtZSwgIi50ZXh0IikpCi0gICAgbmxubm8gPSBjb2ZmX25fbGluZV9ub3M7Ci0gIGVsc2UKLSAgICBubG5ubyA9IDA7Ci0gIHsKLSAgICAvKiBAQCBIb3BlIHRoYXQgbm9uZSBvZiB0aGUgZml4dXBzIGV4cGFuZCB0byBtb3JlIHRoYW4gb25lIHJlbG9jCi0gICAgICAgZW50cnkuLi4gICovCi0gICAgZml4UyAqZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OwotICAgIHdoaWxlIChmaXhwKQotICAgICAgewotCWlmICghIGZpeHAtPmZ4X2RvbmUpCi0JICBucmVsb2NzKys7Ci0JZml4cCA9IGZpeHAtPmZ4X25leHQ7Ci0gICAgICB9Ci0gIH0KLSAgaWYgKGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSA9PSAwCi0gICAgICAmJiBucmVsb2NzID09IDAKLSAgICAgICYmIG5sbm5vID09IDAKLSAgICAgICYmIHNlYyAhPSB0ZXh0X3NlY3Rpb24KLSAgICAgICYmIHNlYyAhPSBkYXRhX3NlY3Rpb24KLSAgICAgICYmIHNlYyAhPSBic3Nfc2VjdGlvbikKLSAgICByZXR1cm47Ci0gIHNlY3N5bSA9IHNlY3Rpb25fc3ltYm9sIChzZWMpOwotICBTQV9TRVRfU0NOX05SRUxPQyAoc2Vjc3ltLCBucmVsb2NzKTsKLSAgU0FfU0VUX1NDTl9OTElOTk8gKHNlY3N5bSwgbmxubm8pOwotfQotCi12b2lkCi1jb2ZmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCkKLXsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGNvZmZfYWRqdXN0X3NlY3Rpb25fc3ltcywgKGNoYXIqKSAwKTsKLX0KLQotLyoKLSAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgotICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQotICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcwotICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbwotICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKLSAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAotICoJCQkJCQkgJ3InIGZvciByZWFkLW9ubHkgZGF0YQotICogQnV0IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLCB0cmVhdCBpdCBhcyBhCi0gKiBzdWJzZWdtZW50IG51bWJlci4KLSAqLwotCi12b2lkCi1vYmpfY29mZl9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFN0cmlwIG91dCB0aGUgc2VjdGlvbiBuYW1lICovCi0gIGNoYXIgKnNlY3Rpb25fbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBmbGFnd29yZCBmbGFnczsKLSAgYXNlY3Rpb24gKnNlYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgY2hhciB0eXBlOwotCi0gICAgICBzX21yaV9zZWN0ICgmdHlwZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBleHAgPSAwOwotICBmbGFncyA9IFNFQ19OT19GTEFHUzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCWNhc2UgJ2InOiBmbGFncyB8PSBTRUNfQUxMT0M7IGZsYWdzICY9fiBTRUNfTE9BRDsgYnJlYWs7Ci0JCWNhc2UgJ24nOiBmbGFncyAmPX4gU0VDX0xPQUQ7IGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAndyc6IGZsYWdzIHw9IFNFQ19EQVRBOyBmbGFncyAmPX4gU0VDX1JFQURPTkxZOyBicmVhazsKLQkJY2FzZSAneCc6IGZsYWdzIHw9IFNFQ19DT0RFOyBicmVhazsKLQkJY2FzZSAncic6IGZsYWdzIHw9IFNFQ19SRUFET05MWTsgYnJlYWs7Ci0KLQkJY2FzZSAnaSc6IC8qIFNUWVBfSU5GTyAqLwotCQljYXNlICdsJzogLyogU1RZUF9MSUIgKi8KLQkJY2FzZSAnbyc6IC8qIFNUWVBfT1ZFUiAqLwotCQkgIGFzX3dhcm4gKF8oInVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAgICppbnB1dF9saW5lX3BvaW50ZXIpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYXNfd2FybihfKCJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAgKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgfQotCi0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIChzdWJzZWdUKSBleHApOwotCi0gIGlmIChmbGFncyAhPSBTRUNfTk9fRkxBR1MpCi0gICAgewotICAgICAgZmxhZ3dvcmQgb2xkZmxhZ3M7Ci0KLSAgICAgIG9sZGZsYWdzID0gYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYyk7Ci0gICAgICBvbGRmbGFncyAmPSBTRUNfTElOS19PTkNFIHwgU0VDX0xJTktfRFVQTElDQVRFUzsKLSAgICAgIGZsYWdzIHw9IG9sZGZsYWdzOwotCi0gICAgICBpZiAoISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncykpCi0JYXNfd2FybiAoXygiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIlc1wiOiAlcyIpLAotCQkgYmZkX3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBzZWMpLAotCQkgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1jb2ZmX2FkanVzdF9zeW10YWIgKCkKLXsKLSAgaWYgKHN5bWJvbF9yb290UCA9PSBOVUxMCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xfcm9vdFApICE9IENfRklMRSkKLSAgICBjX2RvdF9maWxlX3N5bWJvbCAoImZha2UiKTsKLX0KLQotdm9pZAotY29mZl9mcm9iX3NlY3Rpb24gKHNlYykKLSAgICAgc2VnVCBzZWM7Ci17Ci0gIHNlZ1Qgc3Ryc2VjOwotICBjaGFyICpwOwotICBmcmFnUyAqZnJhZ3A7Ci0gIGJmZF92bWEgc2l6ZSwgbl9lbnRyaWVzLCBtYXNrOwotCi0gIC8qIFRoZSBDT0ZGIGJhY2sgZW5kIGluIEJGRCByZXF1aXJlcyB0aGF0IGFsbCBzZWN0aW9uIHNpemVzIGJlCi0gICAgIHJvdW5kZWQgdXAgdG8gbXVsdGlwbGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNlY3Rpb24gYWxpZ25tZW50cy4KLSAgICAgU2VlbXMga2luZGEgc2lsbHkgdG8gbWUsIGJ1dCB0aGF0J3MgdGhlIHdheSBpdCBpcy4gICovCi0gIHNpemUgPSBiZmRfZ2V0X3NlY3Rpb25fc2l6ZV9iZWZvcmVfcmVsb2MgKHNlYyk7Ci0gIG1hc2sgPSAoKGJmZF92bWEpIDEgPDwgKGJmZF92bWEpIHNlYy0+YWxpZ25tZW50X3Bvd2VyKSAtIDE7Ci0gIGlmIChzaXplICYgbWFzaykKLSAgICB7Ci0gICAgICBzaXplID0gKHNpemUgKyBtYXNrKSAmIH5tYXNrOwotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjLCBzaXplKTsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIHNlY3Rpb24gc2l6ZSBpcyBub24temVybywgdGhlIHNlY3Rpb24gc3ltYm9sIG5lZWRzIGFuIGF1eAotICAgICBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQsIGluZGljYXRpbmcgdGhlIHNpemUuICBXZSBkb24ndCBrbm93Ci0gICAgIGFsbCB0aGUgdmFsdWVzIHlldDsgY29mZl9mcm9iX3N5bWJvbCB3aWxsIGZpbGwgdGhlbSBpbiBsYXRlci4gICovCi0gIGlmIChzaXplICE9IDAKLSAgICAgIHx8IHNlYyA9PSB0ZXh0X3NlY3Rpb24KLSAgICAgIHx8IHNlYyA9PSBkYXRhX3NlY3Rpb24KLSAgICAgIHx8IHNlYyA9PSBic3Nfc2VjdGlvbikKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzZWNzeW0gPSBzZWN0aW9uX3N5bWJvbCAoc2VjKTsKLQotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc2Vjc3ltLCBDX1NUQVQpOwotICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc2Vjc3ltLCAxKTsKLSAgICAgIFNGX1NFVF9TVEFUSUNTIChzZWNzeW0pOwotICAgICAgU0FfU0VUX1NDTl9TQ05MRU4gKHNlY3N5bSwgc2l6ZSk7Ci0gICAgfQotCi0gIC8qIEBAIHRoZXNlIHNob3VsZCBiZSBpbiBhICJzdGFicy5oIiBmaWxlLCBvciBtYXliZSBhcy5oICovCi0jaWZuZGVmIFNUQUJfU0VDVElPTl9OQU1FCi0jZGVmaW5lIFNUQUJfU0VDVElPTl9OQU1FICIuc3RhYiIKLSNlbmRpZgotI2lmbmRlZiBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FICIuc3RhYnN0ciIKLSNlbmRpZgotICBpZiAoc3RyY21wIChTVEFCX1NUUklOR19TRUNUSU9OX05BTUUsIHNlYy0+bmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnNlYyA9IHNlYzsKLSAgc2VjID0gc3Vic2VnX2dldCAoU1RBQl9TRUNUSU9OX05BTUUsIDApOwotICAvKiBzaXplIGlzIGFscmVhZHkgcm91bmRlZCB1cCwgc2luY2Ugb3RoZXIgc2VjdGlvbiB3aWxsIGJlIGxpc3RlZCBmaXJzdCAqLwotICBzaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChzdHJzZWMpOwotCi0gIG5fZW50cmllcyA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAoc2VjKSAvIDEyIC0gMTsKLQotICAvKiBGaW5kIGZpcnN0IG5vbi1lbXB0eSBmcmFnLiAgSXQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaC4gICovCi0gIGZyYWdwID0gc2VnX2luZm8gKHNlYyktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHdoaWxlIChmcmFncCAmJiBmcmFncC0+ZnJfZml4ID09IDApCi0gICAgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dDsKLSAgYXNzZXJ0IChmcmFncCAhPSAwICYmIGZyYWdwLT5mcl9maXggPj0gMTIpOwotCi0gIC8qIFN0b3JlIHRoZSB2YWx1ZXMuICAqLwotICBwID0gZnJhZ3AtPmZyX2xpdGVyYWw7Ci0gIGJmZF9oX3B1dF8xNiAoc3Rkb3V0cHV0LCBuX2VudHJpZXMsIChiZmRfYnl0ZSAqKSBwICsgNik7Ci0gIGJmZF9oX3B1dF8zMiAoc3Rkb3V0cHV0LCBzaXplLCAoYmZkX2J5dGUgKikgcCArIDgpOwotfQotCi12b2lkCi1vYmpfY29mZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3RhYnN0cl9uYW1lOwotICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotCi0gIC8qIE1ha2Ugc3BhY2UgZm9yIHRoaXMgZmlyc3Qgc3ltYm9sLiAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIC8qIFplcm8gaXQgb3V0LiAqLwotICBtZW1zZXQgKHAsIDAsIDEyKTsKLSAgYXNfd2hlcmUgKCZmaWxlLCAodW5zaWduZWQgaW50ICopIE5VTEwpOwotICBzdGFic3RyX25hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoc2VnLT5uYW1lKSArIDQpOwotICBzdHJjcHkgKHN0YWJzdHJfbmFtZSwgc2VnLT5uYW1lKTsKLSAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKLSAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKLSAga25vdyAoc3Ryb2ZmID09IDEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Ci19Ci0KLSNpZmRlZiBERUJVRwotLyogZm9yIGRlYnVnZ2luZyAqLwotY29uc3QgY2hhciAqCi1zX2dldF9uYW1lIChzKQotICAgICBzeW1ib2xTICpzOwotewotICByZXR1cm4gKChzID09IE5VTEwpID8gIihOVUxMKSIgOiBTX0dFVF9OQU1FIChzKSk7Ci19Ci0KLXZvaWQKLXN5bWJvbF9kdW1wICgpCi17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIHByaW50ZihfKCIweCVseDogXCIlc1wiIHR5cGUgPSAlbGQsIGNsYXNzID0gJWQsIHNlZ21lbnQgPSAlZFxuIiksCi0JICAgICAodW5zaWduZWQgbG9uZykgc3ltYm9sUCwKLQkgICAgIFNfR0VUX05BTUUoc3ltYm9sUCksCi0JICAgICAobG9uZykgU19HRVRfREFUQV9UWVBFKHN5bWJvbFApLAotCSAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQKSwKLQkgICAgIChpbnQpIFNfR0VUX1NFR01FTlQoc3ltYm9sUCkpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIERFQlVHICovCi0KLSNlbHNlIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLSNpbmNsdWRlICJmcmFncy5oIgotLyogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBpbmNsdWRlIGludGVybmFsIGJmZCB0aGluZ3MuICovCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSAibGliYmZkLmgiCi0jaW5jbHVkZSAibGliY29mZi5oIgotCi0jaWZkZWYgVEVfUEUKLSNpbmNsdWRlICJjb2ZmL3BlLmgiCi0jZW5kaWYKLQotLyogVGhlIE5PUF9PUENPREUgaXMgZm9yIHRoZSBhbGlnbm1lbnQgZmlsbCB2YWx1ZS4gIEZpbGwgd2l0aCBub3Agc28KLSAgIHRoYXQgd2UgY2FuIHN0aWNrIHNlY3Rpb25zIHRvZ2V0aGVyIHdpdGhvdXQgY2F1c2luZyB0cm91YmxlLiAgKi8KLSNpZm5kZWYgTk9QX09QQ09ERQotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDAKLSNlbmRpZgotCi0vKiBUaGUgemVyb2VzIGlmIHN5bWJvbCBuYW1lIGlzIGxvbmdlciB0aGFuIDggY2hhcnMgKi8KLSNkZWZpbmUgU19TRVRfWkVST0VTKHMsdikJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl96ZXJvZXMgPSAodikpCi0KLSNkZWZpbmUgTUlOKGEsYikgKChhKSA8IChiKT8gKGEpIDogKGIpKQotLyogVGhpcyB2ZWN0b3IgaXMgdXNlZCB0byB0dXJuIGFuIGludGVybmFsIHNlZ21lbnQgaW50byBhIHNlY3Rpb24gIwotICAgc3VpdGFibGUgZm9yIGluc2VydGlvbiBpbnRvIGEgY29mZiBzeW1ib2wgdGFibGUKLSAqLwotCi1jb25zdCBzaG9ydCBzZWdfTl9UWVBFW10gPQotewkJCQkvKiBpbjogc2VnVCAgIG91dDogTl9UWVBFIGJpdHMgKi8KLSAgQ19BQlNfU0VDVElPTiwKLSAgMSwgICAgMiwgIDMsICAgNCwgICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsCi0gIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLAotICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwKLSAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsCi0gIENfVU5ERUZfU0VDVElPTiwJCS8qIFNFR19VTktOT1dOICovCi0gIENfVU5ERUZfU0VDVElPTiwJCS8qIFNFR19HT09GICovCi0gIENfVU5ERUZfU0VDVElPTiwJCS8qIFNFR19FWFBSICovCi0gIENfREVCVUdfU0VDVElPTiwJCS8qIFNFR19ERUJVRyAqLwotICBDX05UVl9TRUNUSU9OLAkJLyogU0VHX05UViAqLwotICBDX1BUVl9TRUNUSU9OLAkJLyogU0VHX1BUViAqLwotICBDX1JFR0lTVEVSX1NFQ1RJT04sCQkvKiBTRUdfUkVHSVNURVIgKi8KLX07Ci0KLWludCBmdW5jdGlvbl9saW5lb2ZmID0gLTE7CS8qIE9mZnNldCBpbiBsaW5lI3Mgd2hlcmUgdGhlIGxhc3QgZnVuY3Rpb24KLQkJCQkgICBzdGFydGVkICh0aGUgb2RkIGVudHJ5IGZvciBsaW5lICMwKSAqLwotCi0vKiBzdHJ1Y3R1cmUgdXNlZCB0byBrZWVwIHRoZSBmaWxlbmFtZXMgd2hpY2gKLSAgIGFyZSB0b28gbG9uZyBhcm91bmQgc28gdGhhdCB3ZSBjYW4gc3RpY2sgdGhlbQotICAgaW50byB0aGUgc3RyaW5nIHRhYmxlICovCi1zdHJ1Y3QgZmlsZW5hbWVfbGlzdCAKLXsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpuZXh0OwotfTsKLQotc3RhdGljIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmaWxlbmFtZV9saXN0X2hlYWQ7Ci1zdGF0aWMgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3RfdGFpbDsKLQotc3RhdGljIHN5bWJvbFMgKmxhc3RfbGluZV9zeW1ib2w7Ci0KLS8qIEFkZCA0IHRvIHRoZSByZWFsIHZhbHVlIHRvIGdldCB0aGUgaW5kZXggYW5kIGNvbXBlbnNhdGUgdGhlCi0gICBuZWdhdGl2ZXMuIFRoaXMgdmVjdG9yIGlzIHVzZWQgYnkgU19HRVRfU0VHTUVOVCB0byB0dXJuIGEgY29mZgotICAgc2VjdGlvbiBudW1iZXIgaW50byBhIHNlZ21lbnQgbnVtYmVyCi0qLwotc3RhdGljIHN5bWJvbFMgKnByZXZpb3VzX2ZpbGVfc3ltYm9sOwotdm9pZCBjX3N5bWJvbF9tZXJnZSAoKTsKLXN0YXRpYyBpbnQgbGluZV9iYXNlOwotCi1zeW1ib2xTICpjX3NlY3Rpb25fc3ltYm9sICgpOwotYmZkICphYmZkOwotCi1zdGF0aWMgdm9pZCBmaXh1cF9zZWdtZW50IFBBUkFNUyAoKHNlZ21lbnRfaW5mb190eXBlICpzZWdQLAotCQkJCSAgIHNlZ1QgdGhpc19zZWdtZW50X3R5cGUpKTsKLQotCi1zdGF0aWMgdm9pZCBmaXh1cF9tZGVwcyBQQVJBTVMgKChmcmFnUyAqLAotCQkJCSBvYmplY3RfaGVhZGVycyAqLAotCQkJCSBzZWdUKSk7Ci0KLQotc3RhdGljIHZvaWQgZmlsbF9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqIGFiZmQsCi0JCQkJICBvYmplY3RfaGVhZGVycyAqLAotCQkJCSAgdW5zaWduZWQgbG9uZyAqKSk7Ci0KLQotc3RhdGljIGludCBjX2xpbmVfbmV3IFBBUkFNUyAoKHN5bWJvbFMgKiBzeW1ib2wsIGxvbmcgcGFkZHIsCi0JCQkgICAgICAgaW50IGxpbmVfbnVtYmVyLAotCQkJICAgICAgIGZyYWdTICogZnJhZykpOwotCi0KLXN0YXRpYyB2b2lkIHdfc3ltYm9scyBQQVJBTVMgKChiZmQgKiBhYmZkLCBjaGFyICp3aGVyZSwKLQkJCSAgICAgICBzeW1ib2xTICogc3ltYm9sX3Jvb3RQKSk7Ci0KLXN0YXRpYyB2b2lkIGFkanVzdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoYmZkICphYmZkLCBzZWdUIHNlZykpOwotCi1zdGF0aWMgdm9pZCBvYmpfY29mZl9sY29tbSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9jb2ZmX3RleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfY29mZl9kYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2NvZmZfaWRlbnQgUEFSQU1TICgoaW50KSk7Ci12b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFNlY3Rpb24gc3R1ZmYKLQotICAgV2UgYWxsb3cgbW9yZSB0aGFuIGp1c3QgdGhlIHN0YW5kYXJkIDMgc2VjdGlvbnMsIGluZmFjdCwgd2UgYWxsb3cKLSAgIDQwIHNlY3Rpb25zLCAodGhvdWdoIHRoZSB1c3VhbCB0aHJlZSBoYXZlIHRvIGJlIHRoZXJlKS4KLQotICAgVGhpcyBzdHJ1Y3R1cmUgcGVyZm9ybXMgdGhlIG1hcHBpbmdzIGZvciB1czoKLSovCi0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgc2VnVCBzZWdfdDsKLSAgaW50IGk7Ci19IHNlZ19pbmZvX3R5cGU7Ci0KLXN0YXRpYyBjb25zdCBzZWdfaW5mb190eXBlIHNlZ19pbmZvX29mZl9ieV80W10gPQotewotIHtTRUdfUFRWLCAgfSwKLSB7U0VHX05UViwgIH0sCi0ge1NFR19ERUJVRywgfSwKLSB7U0VHX0FCU09MVVRFLCAgfSwKLSB7U0VHX1VOS05PV04sCSB9LAotIHtTRUdfRTB9LCB7U0VHX0UxfSwge1NFR19FMn0sIHtTRUdfRTN9LCB7U0VHX0U0fSwKLSB7U0VHX0U1fSwge1NFR19FNn0sIHtTRUdfRTd9LCB7U0VHX0U4fSwge1NFR19FOX0sCi0ge1NFR19FMTB9LHtTRUdfRTExfSx7U0VHX0UxMn0se1NFR19FMTN9LHtTRUdfRTE0fSwKLSB7U0VHX0UxNX0se1NFR19FMTZ9LHtTRUdfRTE3fSx7U0VHX0UxOH0se1NFR19FMTl9LAotIHtTRUdfRTIwfSx7U0VHX0UyMX0se1NFR19FMjJ9LHtTRUdfRTIzfSx7U0VHX0UyNH0sCi0ge1NFR19FMjV9LHtTRUdfRTI2fSx7U0VHX0UyN30se1NFR19FMjh9LHtTRUdfRTI5fSwKLSB7U0VHX0UzMH0se1NFR19FMzF9LHtTRUdfRTMyfSx7U0VHX0UzM30se1NFR19FMzR9LAotIHtTRUdfRTM1fSx7U0VHX0UzNn0se1NFR19FMzd9LHtTRUdfRTM4fSx7U0VHX0UzOX0sCi0geyhzZWdUKTQwfSwKLSB7KHNlZ1QpNDF9LAotIHsoc2VnVCk0Mn0sCi0geyhzZWdUKTQzfSwKLSB7KHNlZ1QpNDR9LAotIHsoc2VnVCk0NX0sCi0geyhzZWdUKTB9LAotIHsoc2VnVCkwfSwKLSB7KHNlZ1QpMH0sCi0ge1NFR19SRUdJU1RFUn0KLX07Ci0KLQotCi0jZGVmaW5lIFNFR19JTkZPX0ZST01fU0VDVElPTl9OVU1CRVIoeCkgKHNlZ19pbmZvX29mZl9ieV80Wyh4KSs0XSkKLQotc3RhdGljIHJlbGF4X2FkZHJlc3NUCi1yZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQotICAgICByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwotICAgICBsb25nIGFsaWdubWVudDsKLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19Ci0KLQotc2VnVAotc19nZXRfc2VnbWVudCAoeCkKLSAgICAgc3ltYm9sUyAqIHg7Ci17Ci0gIHJldHVybiBTRUdfSU5GT19GUk9NX1NFQ1RJT05fTlVNQkVSICh4LT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0pLnNlZ190OwotfQotCi0vKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZyYWcgY2hhaW4gYW5kIGZpbGwgaW4gdGhlIHNlY3Rpb24gaGVhZGVyCi0gICB0byBjb250YWluIGFsbCBvZiBpdCwgYWxzbyBmaWxsIGluIHRoZSBhZGRyIG9mIHRoZSBzZWN0aW9ucyAqLwotc3RhdGljIHVuc2lnbmVkIGludAotc2l6ZV9zZWN0aW9uIChhYmZkLCBpZHgpCi0gICAgIGJmZCAqIGFiZmQ7Ci0gICAgIHVuc2lnbmVkIGludCBpZHg7Ci17Ci0KLSAgdW5zaWduZWQgaW50IHNpemUgPSAwOwotICBmcmFnUyAqZnJhZyA9IHNlZ21lbnRfaW5mb1tpZHhdLmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHdoaWxlIChmcmFnKQotICAgIHsKLSAgICAgIHNpemUgPSBmcmFnLT5mcl9hZGRyZXNzOwotICAgICAgaWYgKGZyYWctPmZyX2FkZHJlc3MgIT0gc2l6ZSkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIk91dCBvZiBzdGVwXG4iKSk7Ci0JICBzaXplID0gZnJhZy0+ZnJfYWRkcmVzczsKLQl9Ci0KLSAgICAgIHN3aXRjaCAoZnJhZy0+ZnJfdHlwZSkKLQl7Ci0jaWZkZWYgVENfQ09GRl9TSVpFTUFDSERFUAotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBzaXplICs9IFRDX0NPRkZfU0laRU1BQ0hERVAgKGZyYWcpOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQljYXNlIHJzX3NwYWNlOgotCSAgYXNzZXJ0IChmcmFnLT5mcl9zeW1ib2wgPT0gMCk7Ci0JY2FzZSByc19maWxsOgotCWNhc2UgcnNfb3JnOgotCSAgc2l6ZSArPSBmcmFnLT5mcl9maXg7Ci0JICBzaXplICs9IGZyYWctPmZyX29mZnNldCAqIGZyYWctPmZyX3ZhcjsKLQkgIGJyZWFrOwotCWNhc2UgcnNfYWxpZ246Ci0JY2FzZSByc19hbGlnbl9jb2RlOgotCSAgewotCSAgICBhZGRyZXNzVCBvZmY7Ci0KLQkgICAgc2l6ZSArPSBmcmFnLT5mcl9maXg7Ci0JICAgIG9mZiA9IHJlbGF4X2FsaWduIChzaXplLCBmcmFnLT5mcl9vZmZzZXQpOwotCSAgICBpZiAoZnJhZy0+ZnJfc3VidHlwZSAhPSAwICYmIG9mZiA+IGZyYWctPmZyX3N1YnR5cGUpCi0JICAgICAgb2ZmID0gMDsKLQkgICAgc2l6ZSArPSBvZmY7Ci0JICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKGZyYWctPmZyX3R5cGUpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0gICAgfQotICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19zaXplID0gc2l6ZTsKLSAgcmV0dXJuIHNpemU7Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KQotICAgICB1bnNpZ25lZCBpbnQgaWR4OwotewotICB1bnNpZ25lZCBpbnQgbnJlbG9jczsKLSAgZml4UyAqZml4dXBfcHRyOwotCi0gIC8qIENvdW50IHRoZSByZWxvY2F0aW9ucyAqLwotICBmaXh1cF9wdHIgPSBzZWdtZW50X2luZm9baWR4XS5maXhfcm9vdDsKLSAgbnJlbG9jcyA9IDA7Ci0gIHdoaWxlIChmaXh1cF9wdHIgIT0gKGZpeFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZml4dXBfcHRyLT5meF9kb25lID09IDAgJiYgVENfQ09VTlRfUkVMT0MgKGZpeHVwX3B0cikpCi0JewotI2lmZGVmIFRDX0EyOUsKLQkgIGlmIChmaXh1cF9wdHItPmZ4X3JfdHlwZSA9PSBSRUxPQ19DT05TVEgpCi0JICAgIG5yZWxvY3MgKz0gMjsKLQkgIGVsc2UKLQkgICAgbnJlbG9jcysrOwotI2Vsc2UKLQkgIG5yZWxvY3MrKzsKLSNlbmRpZgotCX0KLQotICAgICAgZml4dXBfcHRyID0gZml4dXBfcHRyLT5meF9uZXh0OwotICAgIH0KLSAgcmV0dXJuIG5yZWxvY3M7Ci19Ci0KLSNpZmRlZiBURV9BVVgKLQotc3RhdGljIGludCBjb21wYXJlX2V4dGVybmFsX3JlbG9jcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotCi0vKiBBVVgncyBsZCBleHBlY3RzIHJlbG9jYXRpb25zIHRvIGJlIHNvcnRlZCAqLwotc3RhdGljIGludAotY29tcGFyZV9leHRlcm5hbF9yZWxvY3MgKHgsIHkpCi0gICAgIGNvbnN0IFBUUiB4OwotICAgICBjb25zdCBQVFIgeTsKLXsKLSAgc3RydWN0IGV4dGVybmFsX3JlbG9jICphID0gKHN0cnVjdCBleHRlcm5hbF9yZWxvYyAqKSB4OwotICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmIgPSAoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIHk7Ci0gIGJmZF92bWEgYWFkciA9IGJmZF9nZXRiMzIgKGEtPnJfdmFkZHIpOwotICBiZmRfdm1hIGJhZHIgPSBiZmRfZ2V0YjMyIChiLT5yX3ZhZGRyKTsKLSAgcmV0dXJuIChhYWRyIDwgYmFkciA/IC0xIDogYmFkciA8IGFhZHIgPyAxIDogMCk7Ci19Ci0KLSNlbmRpZgotCi0vKiBvdXRwdXQgYWxsIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uICovCi12b2lkCi1kb19yZWxvY3NfZm9yIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotICAgICB1bnNpZ25lZCBsb25nICpmaWxlX2N1cnNvcjsKLXsKLSAgdW5zaWduZWQgaW50IG5yZWxvY3M7Ci0gIHVuc2lnbmVkIGludCBpZHg7Ci0gIHVuc2lnbmVkIGxvbmcgcmVsb2Nfc3RhcnQgPSAqZmlsZV9jdXJzb3I7Ci0KLSAgZm9yIChpZHggPSBTRUdfRTA7IGlkeCA8IFNFR19MQVNUOyBpZHgrKykKLSAgICB7Ci0gICAgICBpZiAoc2VnbWVudF9pbmZvW2lkeF0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dF9wdHI7Ci0JICBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgKmV4dGVybmFsX3JlbG9jX3ZlYzsKLQkgIHVuc2lnbmVkIGludCBleHRlcm5hbF9yZWxvY19zaXplOwotCSAgdW5zaWduZWQgaW50IGJhc2UgPSBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19wYWRkcjsKLQkgIGZpeFMgKmZpeF9wdHIgPSBzZWdtZW50X2luZm9baWR4XS5maXhfcm9vdDsKLQkgIG5yZWxvY3MgPSBjb3VudF9lbnRyaWVzX2luX2NoYWluIChpZHgpOwotCi0JICBpZiAobnJlbG9jcykKLQkgICAgLyogQnlwYXNzIHRoaXMgc3R1ZmYgaWYgbm8gcmVsb2NzLiAgVGhpcyBhbHNvIGluY2lkZW50YWxseQotCSAgICAgICBhdm9pZHMgYSBTQ08gYnVnLCB3aGVyZSBmcmVlKG1hbGxvYygwKSkgdGVuZHMgdG8gY3Jhc2guICAqLwotCSAgICB7Ci0JICAgICAgZXh0ZXJuYWxfcmVsb2Nfc2l6ZSA9IG5yZWxvY3MgKiBSRUxTWjsKLQkgICAgICBleHRlcm5hbF9yZWxvY192ZWMgPQotCQkoc3RydWN0IGV4dGVybmFsX3JlbG9jICopIG1hbGxvYyAoZXh0ZXJuYWxfcmVsb2Nfc2l6ZSk7Ci0KLQkgICAgICBleHRfcHRyID0gZXh0ZXJuYWxfcmVsb2NfdmVjOwotCi0JICAgICAgLyogRmlsbCBpbiB0aGUgaW50ZXJuYWwgY29mZiBzdHlsZSByZWxvYyBzdHJ1Y3QgZnJvbSB0aGUKLQkJIGludGVybmFsIGZpeCBsaXN0LiAgKi8KLQkgICAgICB3aGlsZSAoZml4X3B0cikKLQkJewotCQkgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyBpbnRyOwotCi0JCSAgLyogT25seSBvdXRwdXQgc29tZSBvZiB0aGUgcmVsb2NhdGlvbnMgKi8KLQkJICBpZiAoZml4X3B0ci0+ZnhfZG9uZSA9PSAwICYmIFRDX0NPVU5UX1JFTE9DIChmaXhfcHRyKSkKLQkJICAgIHsKLSNpZmRlZiBUQ19SRUxPQ19NQU5HTEUKLQkJICAgICAgVENfUkVMT0NfTUFOR0xFICgmc2VnbWVudF9pbmZvW2lkeF0sIGZpeF9wdHIsICZpbnRyLAotCQkJCSAgICAgICBiYXNlKTsKLQotI2Vsc2UKLQkJICAgICAgc3ltYm9sUyAqZG90OwotCQkgICAgICBzeW1ib2xTICpzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLQkJICAgICAgaW50ci5yX3R5cGUgPSBUQ19DT0ZGX0ZJWDJSVFlQRSAoZml4X3B0cik7Ci0JCSAgICAgIGludHIucl92YWRkciA9Ci0JCQliYXNlICsgZml4X3B0ci0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeF9wdHItPmZ4X3doZXJlOwotCi0jaWZkZWYgVENfS0VFUF9GWF9PRkZTRVQKLQkJICAgICAgaW50ci5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLSNlbHNlCi0JCSAgICAgIGludHIucl9vZmZzZXQgPSAwOwotI2VuZGlmCi0KLQkJICAgICAgd2hpbGUgKHN5bWJvbF9wdHItPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkJCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xfcHRyKQotCQkJCSB8fCBTX0lTX0NPTU1PTiAoc3ltYm9sX3B0cikpKQotCQkJewotCQkJICBzeW1ib2xTICpuOwotCi0JCQkgIC8qIFdlIG11c3QgYXZvaWQgbG9vcGluZywgYXMgdGhhdCBjYW4gb2NjdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGJhZGx5IHdyaXR0ZW4gcHJvZ3JhbS4gICovCi0JCQkgIG4gPSBzeW1ib2xfcHRyLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JCQkgIGlmIChuID09IHN5bWJvbF9wdHIpCi0JCQkgICAgYnJlYWs7Ci0JCQkgIHN5bWJvbF9wdHIgPSBuOwotCQkJfQotCi0JCSAgICAgIC8qIFR1cm4gdGhlIHNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpbnRvIGFuIG9mZnNldC4gICovCi0JCSAgICAgIGlmIChzeW1ib2xfcHRyKQotCQkJewotCQkJICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sX3B0ciwgMSk7Ci0JCQkgIGlmICghIHN5bWJvbF9wdHItPnN5X3Jlc29sdmVkKQotCQkJICAgIHsKLQkJCSAgICAgIGNoYXIgKmZpbGU7Ci0JCQkgICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLQotCQkJICAgICAgaWYgKGV4cHJfc3ltYm9sX3doZXJlIChzeW1ib2xfcHRyLCAmZmlsZSwgJmxpbmUpKQotCQkJCWFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJCQkJICAgICAgXygidW5yZXNvbHZlZCByZWxvY2F0aW9uIikpOwotCQkJICAgICAgZWxzZQotCQkJCWFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb246IHN5bWJvbCBgJXMnIG5vdCBpbiBzeW1ib2wgdGFibGUiKSwKLQkJCQkJU19HRVRfTkFNRSAoc3ltYm9sX3B0cikpOwotCQkJICAgIH0KLQkJCSAgZG90ID0gc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpXS5kb3Q7Ci0JCQkgIGlmIChkb3QpCi0JCQkgICAgewotCQkJICAgICAgaW50ci5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGludHIucl9zeW1uZHggPSBzeW1ib2xfcHRyLT5zeV9udW1iZXI7Ci0JCQkgICAgfQotCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaW50ci5yX3N5bW5keCA9IC0xOwotCQkJfQotI2VuZGlmCi0KLQkJICAgICAgKHZvaWQpIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmaW50ciwgZXh0X3B0cik7Ci0JCSAgICAgIGV4dF9wdHIrKzsKLQotI2lmIGRlZmluZWQoVENfQTI5SykKLQotCQkgICAgICAvKiBUaGUgMjlrIGhhcyBhIHNwZWNpYWwga2x1ZGdlIGZvciB0aGUgaGlnaCAxNiBiaXQKLQkJCSByZWxvYy4gIFR3byByZWxvY2F0aW9ucyBhcmUgZW1pdGVkLCBSX0lISUhBTEYsCi0JCQkgYW5kIFJfSUhDT05TVC4gVGhlIHNlY29uZCBvbmUgZG9lc24ndCBjb250YWluIGEKLQkJCSBzeW1ib2wsIGJ1dCB1c2VzIHRoZSB2YWx1ZSBmb3Igb2Zmc2V0LiAgKi8KLQotCQkgICAgICBpZiAoaW50ci5yX3R5cGUgPT0gUl9JSElIQUxGKQotCQkJewotCQkJICAvKiBub3cgZW1pdCB0aGUgc2Vjb25kIGJpdCAqLwotCQkJICBpbnRyLnJfdHlwZSA9IFJfSUhDT05TVDsKLQkJCSAgaW50ci5yX3N5bW5keCA9IGZpeF9wdHItPmZ4X2FkZG51bWJlcjsKLQkJCSAgKHZvaWQpIGJmZF9jb2ZmX3N3YXBfcmVsb2Nfb3V0IChhYmZkLCAmaW50ciwgZXh0X3B0cik7Ci0JCQkgIGV4dF9wdHIrKzsKLQkJCX0KLSNlbmRpZgotCQkgICAgfQotCi0JCSAgZml4X3B0ciA9IGZpeF9wdHItPmZ4X25leHQ7Ci0JCX0KLQotI2lmZGVmIFRFX0FVWAotCSAgICAgIC8qIFNvcnQgdGhlIHJlbG9jIHRhYmxlICovCi0JICAgICAgcXNvcnQgKChQVFIpIGV4dGVybmFsX3JlbG9jX3ZlYywgbnJlbG9jcywKLQkJICAgICBzaXplb2YgKHN0cnVjdCBleHRlcm5hbF9yZWxvYyksIGNvbXBhcmVfZXh0ZXJuYWxfcmVsb2NzKTsKLSNlbmRpZgotCi0JICAgICAgLyogV3JpdGUgb3V0IHRoZSByZWxvYyB0YWJsZSAqLwotCSAgICAgIGJmZF93cml0ZSAoKFBUUikgZXh0ZXJuYWxfcmVsb2NfdmVjLCAxLCBleHRlcm5hbF9yZWxvY19zaXplLAotCQkJIGFiZmQpOwotCSAgICAgIGZyZWUgKGV4dGVybmFsX3JlbG9jX3ZlYyk7Ci0KLQkgICAgICAvKiBGaWxsIGluIHNlY3Rpb24gaGVhZGVyIGluZm8uICAqLwotCSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnNjbmhkci5zX3JlbHB0ciA9ICpmaWxlX2N1cnNvcjsKLQkgICAgICAqZmlsZV9jdXJzb3IgKz0gZXh0ZXJuYWxfcmVsb2Nfc2l6ZTsKLQkgICAgICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19ucmVsb2MgPSBucmVsb2NzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBObyByZWxvY3MgKi8KLQkgICAgICBzZWdtZW50X2luZm9baWR4XS5zY25oZHIuc19yZWxwdHIgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgLyogU2V0IHJlbG9jYXRpb25fc2l6ZSBmaWVsZCBpbiBmaWxlIGhlYWRlcnMgKi8KLSAgSF9TRVRfUkVMT0NBVElPTl9TSVpFIChoLCAqZmlsZV9jdXJzb3IgLSByZWxvY19zdGFydCwgMCk7Ci19Ci0KLQotLyogcnVuIHRocm91Z2ggYSBmcmFnIGNoYWluIGFuZCB3cml0ZSBvdXQgdGhlIGRhdGEgdG8gZ28gd2l0aCBpdCwgZmlsbAotICAgaW4gdGhlIHNjbmhkcnMgd2l0aCB0aGUgaW5mbyBvbiB0aGUgZmlsZSBwb3N0aW9ucwotKi8KLXN0YXRpYyB2b2lkCi1maWxsX3NlY3Rpb24gKGFiZmQsIGgsIGZpbGVfY3Vyc29yKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqaDsKLSAgICAgdW5zaWduZWQgbG9uZyAqZmlsZV9jdXJzb3I7Ci17Ci0KLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGludCBwYWRkciA9IDA7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKLSAgICAgIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKnMgPSAmKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIpOwotCi0gICAgICBQUk9HUkVTUyAoMSk7Ci0KLSAgICAgIGlmIChzLT5zX25hbWVbMF0pCi0JewotCSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgIGNoYXIgKmJ1ZmZlcjsKLQotCSAgaWYgKHMtPnNfc2l6ZSA9PSAwKQotCSAgICBzLT5zX3NjbnB0ciA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBidWZmZXIgPSB4bWFsbG9jIChzLT5zX3NpemUpOwotCSAgICAgIHMtPnNfc2NucHRyID0gKmZpbGVfY3Vyc29yOwotCSAgICB9Ci0JICBrbm93IChzLT5zX3BhZGRyID09IHBhZGRyKTsKLQotCSAgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLnRleHQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmRhdGEiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfREFUQTsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmJzcyIpID09IDApCi0JICAgIHsKLQkgICAgICBzLT5zX3NjbnB0ciA9IDA7Ci0JICAgICAgcy0+c19mbGFncyB8PSBTVFlQX0JTUzsKLQotCSAgICAgIC8qIEBAIFNob3VsZCBtYWtlIHRoZSBpMzg2IGFuZCBhMjlrIGNvZmYgdGFyZ2V0cyBkZWZpbmUKLQkJIENPRkZfTk9MT0FEX1BST0JMRU0sIGFuZCBoYXZlIG9ubHkgb25lIHRlc3QgaGVyZS4gICovCi0jaWZuZGVmIFRDX0kzODYKLSNpZm5kZWYgVENfQTI5SwotI2lmbmRlZiBDT0ZGX05PTE9BRF9QUk9CTEVNCi0JICAgICAgLyogQXBwYXJlbnRseSB0aGUgU1ZSMyBsaW5rZXIgKGFuZCBleGVjIHN5c2NhbGwpIGFuZCBVREkKLQkJIG1vbmRmZSBwcm9ncmVtIGFyZSBjb25mdXNlZCBieSBub2xvYWQgc2VjdGlvbnMuICAqLwotCSAgICAgIHMtPnNfZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7Ci0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmxpdCIpID09IDApCi0JICAgIHMtPnNfZmxhZ3MgPSBTVFlQX0xJVCB8IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmluaXQiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAocy0+c19uYW1lLCAiLmZpbmkiKSA9PSAwKQotCSAgICBzLT5zX2ZsYWdzIHw9IFNUWVBfVEVYVDsKLQkgIGVsc2UgaWYgKHN0cm5jbXAgKHMtPnNfbmFtZSwgIi5jb21tZW50IiwgOCkgPT0gMCkKLQkgICAgcy0+c19mbGFncyB8PSBTVFlQX0lORk87Ci0KLQkgIHdoaWxlIChmcmFnKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGZpbGxfc2l6ZTsKLQkgICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JCXsKLQkJY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkJICBpZiAoZnJhZy0+ZnJfZml4KQotCQkgICAgewotCQkgICAgICBtZW1jcHkgKGJ1ZmZlciArIGZyYWctPmZyX2FkZHJlc3MsCi0JCQkgICAgICBmcmFnLT5mcl9saXRlcmFsLAotCQkJICAgICAgKHVuc2lnbmVkIGludCkgZnJhZy0+ZnJfZml4KTsKLQkJICAgICAgb2Zmc2V0ICs9IGZyYWctPmZyX2ZpeDsKLQkJICAgIH0KLQotCQkgIGJyZWFrOwotCQljYXNlIHJzX3NwYWNlOgotCQkgIGFzc2VydCAoZnJhZy0+ZnJfc3ltYm9sID09IDApOwotCQljYXNlIHJzX2ZpbGw6Ci0JCWNhc2UgcnNfYWxpZ246Ci0JCWNhc2UgcnNfYWxpZ25fY29kZToKLQkJY2FzZSByc19vcmc6Ci0JCSAgaWYgKGZyYWctPmZyX2ZpeCkKLQkJICAgIHsKLQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzLAotCQkJICAgICAgZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICh1bnNpZ25lZCBpbnQpIGZyYWctPmZyX2ZpeCk7Ci0JCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7Ci0JCSAgICB9Ci0KLQkJICBmaWxsX3NpemUgPSBmcmFnLT5mcl92YXI7Ci0JCSAgaWYgKGZpbGxfc2l6ZSAmJiBmcmFnLT5mcl9vZmZzZXQgPiAwKQotCQkgICAgewotCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0JCSAgICAgIHVuc2lnbmVkIGludCBvZmYgPSBmcmFnLT5mcl9maXg7Ci0JCSAgICAgIGZvciAoY291bnQgPSBmcmFnLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCQkJewotCQkJICBpZiAoZmlsbF9zaXplICsgZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiA8PSBzLT5zX3NpemUpCi0JCQkgICAgewotCQkJICAgICAgbWVtY3B5IChidWZmZXIgKyBmcmFnLT5mcl9hZGRyZXNzICsgb2ZmLAotCQkJCSAgICAgIGZyYWctPmZyX2xpdGVyYWwgKyBmcmFnLT5mcl9maXgsCi0JCQkJICAgICAgZmlsbF9zaXplKTsKLQkJCSAgICAgIG9mZiArPSBmaWxsX3NpemU7Ci0JCQkgICAgICBvZmZzZXQgKz0gZmlsbF9zaXplOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSByc19icm9rZW5fd29yZDoKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhYm9ydCAoKTsKLQkJfQotCSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotCSAgICB9Ci0KLQkgIGlmIChzLT5zX3NpemUgIT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzLT5zX3NjbnB0ciAhPSAwKQotCQl7Ci0JCSAgYmZkX3dyaXRlIChidWZmZXIsIHMtPnNfc2l6ZSwgMSwgYWJmZCk7Ci0JCSAgKmZpbGVfY3Vyc29yICs9IHMtPnNfc2l6ZTsKLQkJfQotCSAgICAgIGZyZWUgKGJ1ZmZlcik7Ci0JICAgIH0KLQkgIHBhZGRyICs9IHMtPnNfc2l6ZTsKLQl9Ci0gICAgfQotfQotCi0vKiBDb2ZmIGZpbGUgZ2VuZXJhdGlvbiAmIHV0aWxpdGllcyAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9oZWFkZXJfYXBwZW5kIChhYmZkLCBoKQotICAgICBiZmQgKiBhYmZkOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotICBjaGFyIGJ1ZmZlclsxMDAwXTsKLSAgY2hhciBidWZmZXJvWzEwMDBdOwotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIHVuc2lnbmVkIGxvbmcgc3RyaW5nX3NpemUgPSA0OwotI2VuZGlmCi0KLSAgYmZkX3NlZWsgKGFiZmQsIDAsIDApOwotCi0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0gIEhfU0VUX01BR0lDX05VTUJFUiAoaCwgQ09GRl9NQUdJQyk7Ci0gIEhfU0VUX1ZFUlNJT05fU1RBTVAgKGgsIDApOwotICBIX1NFVF9FTlRSWV9QT0lOVCAoaCwgMCk7Ci0gIEhfU0VUX1RFWFRfU1RBUlQgKGgsIHNlZ21lbnRfaW5mb1tTRUdfRTBdLmZyY2hhaW5QLT5mcmNoX3Jvb3QtPmZyX2FkZHJlc3MpOwotICBIX1NFVF9EQVRBX1NUQVJUIChoLCBzZWdtZW50X2luZm9bU0VHX0UxXS5mcmNoYWluUC0+ZnJjaF9yb290LT5mcl9hZGRyZXNzKTsKLSAgSF9TRVRfU0laRU9GX09QVElPTkFMX0hFQURFUiAoaCwgYmZkX2NvZmZfc3dhcF9hb3V0aGRyX291dChhYmZkLCAmaC0+YW91dGhkciwKLQkJCQkJCQkgICAgIGJ1ZmZlcm8pKTsKLSNlbHNlIC8qIGRlZmluZWQgKE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSKSAqLwotICBIX1NFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSIChoLCAwKTsKLSNlbmRpZiAvKiBkZWZpbmVkIChPQkpfQ09GRl9PTUlUX09QVElPTkFMX0hFQURFUikgKi8KLQotICBpID0gYmZkX2NvZmZfc3dhcF9maWxlaGRyX291dCAoYWJmZCwgJmgtPmZpbGVoZHIsIGJ1ZmZlcik7Ci0KLSAgYmZkX3dyaXRlIChidWZmZXIsIGksIDEsIGFiZmQpOwotICBiZmRfd3JpdGUgKGJ1ZmZlcm8sIEhfR0VUX1NJWkVPRl9PUFRJT05BTF9IRUFERVIgKGgpLCAxLCBhYmZkKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotI2lmZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0JICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZQotICAgICAgICAgICAgIG11c3QgY29vcmRpbmF0ZSB3aXRoIHRoYXQgaW4gd3JpdGVfb2JqZWN0X2ZpbGUgYW5kCi0gICAgICAgICAgICAgd19zdHJpbmdzLiAgKi8KLQkgIGlmIChzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA+IFNDTk5NTEVOKQotCSAgICB7Ci0JICAgICAgbWVtc2V0IChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZSwgMCwgU0NOTk1MRU4pOwotCSAgICAgIHNwcmludGYgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCAiLyVsdSIsIHN0cmluZ19zaXplKTsKLQkgICAgICBzdHJpbmdfc2l6ZSArPSBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSArIDE7Ci0JICAgIH0KLSNlbmRpZgotCi0JICBzaXplID0gYmZkX2NvZmZfc3dhcF9zY25oZHJfb3V0IChhYmZkLAotCQkJCQkgICAmKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIpLAotCQkJCQkgICBidWZmZXIpOwotCSAgaWYgKHNpemUgPT0gMCkKLQkgICAgYXNfYmFkIChfKCJiZmRfY29mZl9zd2FwX3Njbmhkcl9vdXQgZmFpbGVkIikpOwotCSAgYmZkX3dyaXRlIChidWZmZXIsIHNpemUsIDEsIGFiZmQpOwotCX0KLSAgICB9Ci19Ci0KLQotY2hhciAqCi1zeW1ib2xfdG9fY2hhcnMgKGFiZmQsIHdoZXJlLCBzeW1ib2xQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3ltYm9sUyAqIHN5bWJvbFA7Ci17Ci0gIHVuc2lnbmVkIGludCBudW1hdXggPSBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4OwotICB1bnNpZ25lZCBpbnQgaTsKLSAgdmFsdWVUIHZhbDsKLQotICAvKiBUdXJuIGFueSBzeW1ib2xzIHdpdGggcmVnaXN0ZXIgYXR0cmlidXRlcyBpbnRvIGFicyBzeW1ib2xzICovCi0gIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSByZWdfc2VjdGlvbikKLSAgICB7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICB9Ci0gIC8qIEF0IHRoZSBzYW1lIHRpbWUsIHJlbG9jYXRlIGFsbCBzeW1ib2xzIHRvIHRoZWlyIG91dHB1dCB2YWx1ZSAqLwotCi0jaWZuZGVmIFRFX1BFCi0gIHZhbCA9IChzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sUCldLnNjbmhkci5zX3BhZGRyCi0JICsgU19HRVRfVkFMVUUgKHN5bWJvbFApKTsKLSNlbHNlCi0gIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWwpOwotCi0gIHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl92YWx1ZSA9IHZhbDsKLQotICB3aGVyZSArPSBiZmRfY29mZl9zd2FwX3N5bV9vdXQgKGFiZmQsICZzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5LAotCQkJCSAgd2hlcmUpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1hdXg7IGkrKykKLSAgICB7Ci0gICAgICB3aGVyZSArPSBiZmRfY29mZl9zd2FwX2F1eF9vdXQgKGFiZmQsCi0JCQkJICAgICAgJnN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfYXV4ZW50W2ldLAotCQkJCSAgICAgIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCksCi0JCQkJICAgICAgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCksCi0JCQkJICAgICAgaSwgbnVtYXV4LCB3aGVyZSk7Ci0gICAgfQotICByZXR1cm4gd2hlcmU7Ci0KLX0KLQotdm9pZAotY29mZl9vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBjaGFyIHVuZGVyc2NvcmUgPSAwOwkJLyogU3ltYm9sIGhhcyBsZWFkaW5nIF8gKi8KLQotICAvKiBFZmZlY3RpdmUgc3ltYm9sICovCi0gIC8qIFN0b3JlIHRoZSBwb2ludGVyIGluIHRoZSBvZmZzZXQuICovCi0gIFNfU0VUX1pFUk9FUyAoc3ltYm9sUCwgMEwpOwotICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFRfTlVMTCk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIDApOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAwKTsKLSAgLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLwotICBzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2ZsYWdzID0gMDsKLSAgLyogQXV4aWxpYXJ5IGVudHJpZXMgKi8KLSAgbWVtc2V0ICgoY2hhciAqKSAmc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0sIDAsIEFVWEVTWik7Ci0KLSAgaWYgKFNfSVNfU1RSSU5HIChzeW1ib2xQKSkKLSAgICBTRl9TRVRfU1RSSU5HIChzeW1ib2xQKTsKLSAgaWYgKCF1bmRlcnNjb3JlICYmIFNfSVNfTE9DQUwgKHN5bWJvbFApKQotICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci19Ci0KLS8qCi0gKiBIYW5kbGUgLmxuIGRpcmVjdGl2ZXMuCi0gKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xuIChhcHBsaW5lKQotICAgICBpbnQgYXBwbGluZTsKLXsKLSAgaW50IGw7Ci0KLSAgaWYgKCEgYXBwbGluZSAmJiBkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxuIHBzZXVkby1vcCBpbnNpZGUgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIHdyb25nIGNvbnRleHQgKi8KLQotICBsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGNfbGluZV9uZXcgKDAsIGZyYWdfbm93X2ZpeCAoKSwgbCwgZnJhZ19ub3cpOwotCi0gIGlmIChhcHBsaW5lKQotICAgIG5ld19sb2dpY2FsX2xpbmUgKChjaGFyICopIE5VTEwsIGwgLSAxKTsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0KLSAgICBpZiAobGlzdGluZykKLSAgICAgIHsKLQlpZiAoISBhcHBsaW5lKQotCSAgbCArPSBsaW5lX2Jhc2UgLSAxOwotCWxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGwpOwotICAgICAgfQotCi0gIH0KLSNlbmRpZgotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKgotICoJCQlkZWYoKQotICoKLSAqIEhhbmRsZSAuZGVmIGRpcmVjdGl2ZXMuCi0gKgotICogT25lIG1pZ2h0IGFzayA6IHdoeSBjYW4ndCB3ZSBzeW1ib2xfbmV3IGlmIHRoZSBzeW1ib2wgZG9lcyBub3QKLSAqIGFscmVhZHkgZXhpc3QgYW5kIGZpbGwgaXQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4gIEJlY2F1c2Ugb2YKLSAqIHRoZSBDX0VGQ04gc3BlY2lhbCBzeW1ib2wuIEl0IHdvdWxkIGNsb2JiZXIgdGhlIHZhbHVlIG9mIHRoZQotICogZnVuY3Rpb24gc3ltYm9sIGJlZm9yZSB3ZSBoYXZlIGEgY2hhbmNlIHRvIG5vdGljZSB0aGF0IGl0IGlzCi0gKiBhIENfRUZDTi4gQW5kIGEgc2Vjb25kIHJlYXNvbiBpcyB0aGF0IHRoZSBjb2RlIGlzIG1vcmUgY2xlYXIgdGhpcwotICogd2F5LiAoYXQgbGVhc3QgSSB0aGluayBpdCBpcyA6LSkuCi0gKgotICovCi0KLSNkZWZpbmUgU0tJUF9TRU1JX0NPTE9OKCkJd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnOycpCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRVMoKQl3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgXAotCQkJCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1x0JykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2RlZiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIGNoYXIgbmFtZV9lbmQ7CQkvKiBDaGFyIGFmdGVyIHRoZSBlbmQgb2YgbmFtZSAqLwotICBjaGFyICpzeW1ib2xfbmFtZTsJCS8qIE5hbWUgb2YgdGhlIGRlYnVnIHN5bWJvbCAqLwotICBjaGFyICpzeW1ib2xfbmFtZV9jb3B5OwkvKiBUZW1wb3JhcnkgY29weSBvZiB0aGUgbmFtZSAqLwotICB1bnNpZ25lZCBpbnQgc3ltYm9sX25hbWVfbGVuZ3RoOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmRlZiBwc2V1ZG8tb3AgdXNlZCBpbnNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTS0lQX1dISVRFU1BBQ0VTICgpOwotCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSAoc3ltYm9sUyAqKSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoKmRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKTsKLSAgbWVtc2V0IChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwLCBzaXplb2YgKCpkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSk7Ci0KLSAgc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbF9uYW1lX2xlbmd0aCA9IHN0cmxlbiAoc3ltYm9sX25hbWUpOwotICBzeW1ib2xfbmFtZV9jb3B5ID0geG1hbGxvYyAoc3ltYm9sX25hbWVfbGVuZ3RoICsgMSk7Ci0gIHN0cmNweSAoc3ltYm9sX25hbWVfY29weSwgc3ltYm9sX25hbWUpOwotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZV9jb3B5ID0gdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzeW1ib2xfbmFtZV9jb3B5KTsKLSNlbmRpZgotCi0gIC8qIEluaXRpYWxpemUgdGhlIG5ldyBzeW1ib2wgKi8KLSNpZmRlZiBTVFJJUF9VTkRFUlNDT1JFCi0gIFNfU0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICgqc3ltYm9sX25hbWVfY29weSA9PSAnXycKLQkJCQkgICAgICAgPyBzeW1ib2xfbmFtZV9jb3B5ICsgMQotCQkJCSAgICAgICA6IHN5bWJvbF9uYW1lX2NvcHkpKTsKLSNlbHNlIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLSAgU19TRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX25hbWVfY29weSk7Ci0jZW5kaWYgLyogU1RSSVBfVU5ERVJTQ09SRSAqLwotICAvKiBmcmVlKHN5bWJvbF9uYW1lX2NvcHkpOyAqLwotICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9uYW1lX29mZnNldCA9ICh1bnNpZ25lZCBsb25nKSB+MDsKLSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfbnVtYmVyID0gfjA7Ci0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X2ZyYWcgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gIFNfU0VUX1ZBTFVFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAwKTsKLQotICBpZiAoU19JU19TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgIFNGX1NFVF9TVFJJTkcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi11bnNpZ25lZCBpbnQgZGltX2luZGV4OwotCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9lbmRlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW1ib2xQID0gMDsKLSAgLyogRElNIEJVRyBGSVggc2FjQGN5Z251cy5jb20gKi8KLSAgZGltX2luZGV4ID0gMDsKLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjogaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBudW1iZXIgYWNjb3JkaW5nIHRvIHN0b3JhZ2UgY2xhc3MuICovCi0gIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgIGNhc2UgQ19TVFJUQUc6Ci0gICAgY2FzZSBDX0VOVEFHOgotICAgIGNhc2UgQ19VTlRBRzoKLSAgICAgIFNGX1NFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRklMRToKLSAgICBjYXNlIENfVFBERUY6Ci0gICAgICBTRl9TRVRfREVCVUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgU0VHX0RFQlVHKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDX0VGQ046Ci0gICAgICBTRl9TRVRfTE9DQUwgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBEbyBub3QgZW1pdCB0aGlzIHN5bWJvbC4gKi8KLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBDX0JMT0NLOgotICAgICAgU0ZfU0VUX1BST0NFU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwkvKiBXaWxsIG5lZWQgcHJvY2Vzc2luZyBiZWZvcmUgd3JpdGluZyAqLwotICAgICAgLyogaW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIENfRkNOOgotICAgICAgU19TRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgU0VHX0UwKTsKLQotICAgICAgaWYgKHN0cmNtcCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksICIuYmYiKSA9PSAwKQotCXsJCQkvKiAuYmYgKi8KLQkgIGlmIChmdW5jdGlvbl9saW5lb2ZmIDwgMCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiYC5iZicgc3ltYm9sIHdpdGhvdXQgcHJlY2VkaW5nIGZ1bmN0aW9uXG4iKSk7Ci0JICAgIH0JCQkvKiBtaXNzaW5nIGZ1bmN0aW9uIHN5bWJvbCAqLwotCSAgU0FfR0VUX1NZTV9MTk5PUFRSIChsYXN0X2xpbmVfc3ltYm9sKSA9IGZ1bmN0aW9uX2xpbmVvZmY7Ci0KLQkgIFNGX1NFVF9QUk9DRVNTIChsYXN0X2xpbmVfc3ltYm9sKTsKLQkgIFNGX1NFVF9BREpfTE5OT1BUUiAobGFzdF9saW5lX3N5bWJvbCk7Ci0JICBTRl9TRVRfUFJPQ0VTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JICBmdW5jdGlvbl9saW5lb2ZmID0gLTE7Ci0JfQotICAgICAgLyogVmFsdWUgaXMgYWx3YXlzIHNldCB0byAuICovCi0gICAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBTX1NFVF9WQUxVRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgQ19BVVRPQVJHCi0gICAgY2FzZSBDX0FVVE9BUkc6Ci0jZW5kaWYgLyogQ19BVVRPQVJHICovCi0gICAgY2FzZSBDX0FVVE86Ci0gICAgY2FzZSBDX1JFRzoKLSAgICBjYXNlIENfTU9TOgotICAgIGNhc2UgQ19NT0U6Ci0gICAgY2FzZSBDX01PVToKLSAgICBjYXNlIENfQVJHOgotICAgIGNhc2UgQ19SRUdQQVJNOgotICAgIGNhc2UgQ19GSUVMRDoKLSAgICBjYXNlIENfRU9TOgotICAgICAgU0ZfU0VUX0RFQlVHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfRVhUOgotICAgIGNhc2UgQ19XRUFLRVhUOgotI2lmZGVmIFRFX1BFCi0gICAgY2FzZSBDX05UX1dFQUs6Ci0jZW5kaWYKLSAgICBjYXNlIENfU1RBVDoKLSAgICBjYXNlIENfTEFCRUw6Ci0gICAgICAvKiBWYWxpZCBidXQgc2V0IHNvbWV3aGVyZSBlbHNlIChzX2NvbW0sIHNfbGNvbW0sIGNvbG9uKSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENfVVNUQVRJQzoKLSAgICBjYXNlIENfRVhUREVGOgotICAgIGNhc2UgQ19VTEFCRUw6Ci0gICAgICBhc193YXJuIChfKCJ1bmV4cGVjdGVkIHN0b3JhZ2UgY2xhc3MgJWQiKSwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpOwotICAgICAgYnJlYWs7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gc3RvcmFnZSBjbGFzcyAqLwotCi0gIC8qIE5vdyB0aGF0IHdlIGhhdmUgYnVpbHQgYSBkZWJ1ZyBzeW1ib2wsIHRyeSB0byBmaW5kIGlmIHdlIHNob3VsZAotICAgICBtZXJnZSB3aXRoIGFuIGV4aXN0aW5nIHN5bWJvbCBvciBub3QuICBJZiBhIHN5bWJvbCBpcyBDX0VGQ04gb3IKLSAgICAgYWJzb2x1dGVfc2VjdGlvbiBvciB1bnRhZ2dlZCBTRUdfREVCVUcgaXQgbmV2ZXIgbWVyZ2VzLiAgV2UgYWxzbwotICAgICBkb24ndCBtZXJnZSBsYWJlbHMsIHdoaWNoIGFyZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UsIG5vcgotICAgICBzeW1ib2xzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuIGRlZmluZWQgc2luY2UgdGhleSBhcmUgdHlwaWNhbGx5Ci0gICAgIHVuaXF1ZSwgbm9yIGRvIHdlIG1lcmdlIHRhZ3Mgd2l0aCBub24tdGFncy4gICovCi0KLSAgLyogVHdvIGNhc2VzIGZvciBmdW5jdGlvbnMuICBFaXRoZXIgZGVidWcgZm9sbG93ZWQgYnkgZGVmaW5pdGlvbiBvcgotICAgICBkZWZpbml0aW9uIGZvbGxvd2VkIGJ5IGRlYnVnLiAgRm9yIGRlZmluaXRpb24gZmlyc3QsIHdlIHdpbGwKLSAgICAgbWVyZ2UgdGhlIGRlYnVnIHN5bWJvbCBpbnRvIHRoZSBkZWZpbml0aW9uLiAgRm9yIGRlYnVnIGZpcnN0LCB0aGUKLSAgICAgbGluZW5vIGVudHJ5IE1VU1QgcG9pbnQgdG8gdGhlIGRlZmluaXRpb24gZnVuY3Rpb24gb3IgZWxzZSBpdAotICAgICB3aWxsIHBvaW50IG9mZiBpbnRvIHNwYWNlIHdoZW4gY3Jhd2xfc3ltYm9scygpIG1lcmdlcyB0aGUgZGVidWcKLSAgICAgc3ltYm9sIGludG8gdGhlIHJlYWwgc3ltYm9sLiAgVGhlcmVmb3IsIGxldCdzIHByZXN1bWUgdGhlIGRlYnVnCi0gICAgIHN5bWJvbCBpcyBhIHJlYWwgZnVuY3Rpb24gcmVmZXJlbmNlLiAqLwotCi0gIC8qIEZJWE1FLVNPT04gSWYgZm9yIHNvbWUgcmVhc29uIHRoZSBkZWZpbml0aW9uIGxhYmVsL3N5bWJvbCBpcwotICAgICBuZXZlciBzZWVuLCB0aGlzIHdpbGwgcHJvYmFibHkgbGVhdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCBhdCBsaW5rCi0gICAgIHRpbWUuICovCi0KLSAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IENfRUZDTgotICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19MQUJFTAotICAgICAgfHwgKFNfR0VUX1NFR01FTlQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpID09IFNFR19ERUJVRwotCSAgJiYgIVNGX0dFVF9UQUcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpKQotICAgICAgfHwgU19HRVRfU0VHTUVOVCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgfHwgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfdmFsdWUuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCAoc3ltYm9sUCA9IHN5bWJvbF9maW5kX2Jhc2UgKFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpLCBET19OT1RfU1RSSVApKSA9PSBOVUxMCi0gICAgICB8fCAoU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgIT0gU0ZfR0VUX1RBRyAoc3ltYm9sUCkpKQotICAgIHsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIHN5bWJvbF9sYXN0UCwgJnN5bWJvbF9yb290UCwKLQkJICAgICAmc3ltYm9sX2xhc3RQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCBhbHJlYWR5IGV4aXN0cywgbWVyZ2UgdGhlIG5ld2x5IGNyZWF0ZWQgc3ltYm9sCi0JIGludG8gdGhlIG9sZCBvbmUuICBUaGlzIGlzIG5vdCBtYW5kYXRvcnkuIFRoZSBsaW5rZXIgY2FuCi0JIGhhbmRsZSBkdXBsaWNhdGUgc3ltYm9scyBjb3JyZWN0bHkuIEJ1dCBJIGd1ZXNzIHRoYXQgaXQgc2F2ZQotCSBhICpsb3QqIG9mIHNwYWNlIGlmIHRoZSBhc3NlbWJseSBmaWxlIGRlZmluZXMgYSBsb3Qgb2YKLQkgc3ltYm9scy4gW2xvaWNdICovCi0KLSAgICAgIC8qIFRoZSBkZWJ1ZyBlbnRyeSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgaXMgbWVyZ2VkIGludG8gdGhlCi0JIHByZXZpb3VzIGRlZmluaXRpb24uICAqLwotCi0gICAgICBjX3N5bWJvbF9tZXJnZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sUCk7Ci0gICAgICAvKiBGSVhNRS1TT09OIFNob3VsZCAqZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyBiZSBmcmVlJ2Q/IHhveG9yaWNoLiAqLwotICAgICAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9IHN5bWJvbFA7Ci0KLSAgICAgIGlmIChTRl9HRVRfRlVOQ1RJT04gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpCi0JICB8fCBTRl9HRVRfVEFHIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKQotCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykgPT0gQ19TVEFUKQotCXsKLQkgIC8qIEZvciBmdW5jdGlvbnMsIGFuZCB0YWdzLCBhbmQgc3RhdGljIHN5bWJvbHMsIHRoZSBzeW1ib2wKLQkgICAgICptdXN0KiBiZSB3aGVyZSB0aGUgZGVidWcgc3ltYm9sIGFwcGVhcnMuICBNb3ZlIHRoZQotCSAgICAgZXhpc3Rpbmcgc3ltYm9sIHRvIHRoZSBjdXJyZW50IHBsYWNlLiAqLwotCSAgLyogSWYgaXQgYWxyZWFkeSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBzeW1ib2wgbGlzdCwgZG8gbm90aGluZyAqLwotCSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgIT0gc3ltYm9sX2xhc3RQKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgJnN5bWJvbF9yb290UCwKLQkJCSAgICAgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgc3ltYm9sX2FwcGVuZCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgc3ltYm9sX2xhc3RQLAotCQkJICAgICAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgfQkJCS8qIGlmIG5vdCBhbHJlYWR5IGluIHBsYWNlICovCi0JfQkJCS8qIGlmIGZ1bmN0aW9uICovCi0gICAgfQkJCQkvKiBub3JtYWwgb3IgbWVyZ2FibGUgKi8KLQotICBpZiAoU0ZfR0VUX1RBRyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgICAgc3ltYm9sUyAqb2xkdGFnOwotCi0gICAgICBvbGR0YWcgPSBzeW1ib2xfZmluZF9iYXNlIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwKLQkJCQkgRE9fTk9UX1NUUklQKTsKLSAgICAgIGlmIChvbGR0YWcgPT0gTlVMTCB8fCAhIFNGX0dFVF9UQUcgKG9sZHRhZykpCi0JdGFnX2luc2VydCAoU19HRVRfTkFNRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyksCi0JCSAgICBkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICB9Ci0KLSAgaWYgKFNGX0dFVF9GVU5DVElPTiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcykpCi0gICAgewotICAgICAga25vdyAoc2l6ZW9mIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA8PSBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGZ1bmN0aW9uX2xpbmVvZmYKLQk9IGNfbGluZV9uZXcgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDAsIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgICAgIFNGX1NFVF9QUk9DRVNTIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotICAgICAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGF0IGlzLCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhlCi0JICAgICBmdW5jdGlvbi4uLiAqLwotCSAgc3ltYm9sX3RhYmxlX2luc2VydCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0JfQkJCS8qIGRlZmluaXRpb24gZm9sbG93cyBkZWJ1ZyAqLwotICAgIH0JCQkJLyogQ3JlYXRlIHRoZSBsaW5lIG51bWJlciBlbnRyeSBwb2ludGluZyB0byB0aGUgZnVuY3Rpb24gYmVpbmcgZGVmaW5lZCAqLwotCi0gIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPSBOVUxMOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfZGltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBkaW1faW5kZXg7Ci0KLSAgaWYgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZGltIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY6IGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzLCAxKTsKLQotICBmb3IgKGRpbV9pbmRleCA9IDA7IGRpbV9pbmRleCA8IERJTU5VTTsgZGltX2luZGV4KyspCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFUyAoKTsKLSAgICAgIFNBX1NFVF9TWU1fRElNRU4gKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGRpbV9pbmRleCwKLQkJCWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICcsJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfd2FybiAoXygiYmFkbHkgZm9ybWVkIC5kaW0gZGlyZWN0aXZlIGlnbm9yZWQiKSk7Ci0JICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCWNhc2UgJ1xuJzoKLQljYXNlICc7JzoKLQkgIGRpbV9pbmRleCA9IERJTU5VTTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IHRoaXNfYmFzZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG9ial9jb2ZmX2xuICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IFNfR0VUX05BTUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpOwotICB0aGlzX2Jhc2UgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAvKiBPbmx5IC5iZiBzeW1ib2xzIGluZGljYXRlIHRoZSB1c2Ugb2YgYSBuZXcgYmFzZSBsaW5lIG51bWJlcjsgdGhlCi0gICAgIGxpbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggLmVmLCAuYmIsIC5lYiBhcmUgcmVsYXRpdmUgdG8gdGhlCi0gICAgIHN0YXJ0IG9mIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uLiAgKi8KLSAgaWYgKCFzdHJjbXAgKCIuYmYiLCBuYW1lKSkKLSAgICB7Ci0jaWYgMCAvKiBYWFggQ2FuIHdlIGV2ZXIgaGF2ZSBsaW5lIG51bWJlcnMgZ29pbmcgYmFja3dhcmRzPyAgKi8KLSAgICAgIGlmICh0aGlzX2Jhc2UgPiBsaW5lX2Jhc2UpCi0jZW5kaWYKLQl7Ci0JICBsaW5lX2Jhc2UgPSB0aGlzX2Jhc2U7Ci0JfQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIHsKLQlleHRlcm4gaW50IGxpc3Rpbmc7Ci0JaWYgKGxpc3RpbmcpCi0JICB7Ci0JICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGxpbmVfYmFzZSk7Ci0JICB9Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgdGhpc19iYXNlKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIDEpOwotICBTQV9TRVRfU1lNX1NJWkUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3NjbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBpZiBub3QgaW5zaWRlIC5kZWYvLmVuZGVmICovCi0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdGFnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKnN5bWJvbF9uYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgMSk7Ci0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotI2lmZGVmIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZQotICBzeW1ib2xfbmFtZSA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAoc3ltYm9sX25hbWUpOwotI2VuZGlmCi0KLSAgLyogQXNzdW1lIHRoYXQgdGhlIHN5bWJvbCByZWZlcnJlZCB0byBieSAudGFnIGlzIGFsd2F5cyBkZWZpbmVkLgotICAgICBUaGlzIHdhcyBhIGJhZCBhc3N1bXB0aW9uLiAgSSd2ZSBhZGRlZCBmaW5kX29yX21ha2UuIHhveG9yaWNoLiAqLwotICBTQV9TRVRfU1lNX1RBR05EWCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywKLQkJICAgICAobG9uZykgdGFnX2ZpbmRfb3JfbWFrZSAoc3ltYm9sX25hbWUpKTsKLSAgaWYgKFNBX0dFVF9TWU1fVEFHTkRYIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSA9PSAwTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJ0YWcgbm90IGZvdW5kIGZvciAudGFnICVzIiksIHN5bWJvbF9uYW1lKTsKLSAgICB9CQkJCS8qIG5vdCBkZWZpbmVkICovCi0KLSAgU0ZfU0VUX1RBR0dFRCAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWYgaWdub3JlZC4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogaWYgbm90IGluc2lkZSAuZGVmLy5lbmRlZiAqLwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoZGVmX3N5bWJvbF9pbl9wcm9ncmVzcywgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIGlmIChJU0ZDTiAoU19HRVRfREFUQV9UWVBFIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSkgJiYKLSAgICAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MpICE9IENfVFBERUYpCi0gICAgewotICAgICAgU0ZfU0VUX0ZVTkNUSU9OIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLSAgICB9CQkJCS8qIGlzIGEgZnVuY3Rpb24gKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfdmFsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzID09IE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnZhbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmIGlnbm9yZWQuIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIG5vdCBpbnNpZGUgLmRlZi8uZW5kZWYgKi8KLQotICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgY2hhciAqc3ltYm9sX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjaGFyIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgc3ltYm9sX25hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKHN5bWJvbF9uYW1lKTsKLSNlbmRpZgotCi0gICAgICBpZiAoIXN0cmNtcCAoc3ltYm9sX25hbWUsICIuIikpCi0JewotCSAgZGVmX3N5bWJvbF9pbl9wcm9ncmVzcy0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAvKiBJZiB0aGUgLnZhbCBpcyAhPSBmcm9tIHRoZSAuZGVmIChlLmcuIHN0YXRpY3MpICovCi0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKSwgc3ltYm9sX25hbWUpKQotCXsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3AgPSBPX3N5bWJvbDsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbCA9Ci0JICAgIHN5bWJvbF9maW5kX29yX21ha2UgKHN5bWJvbF9uYW1lKTsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IDA7Ci0KLQkgIC8qIElmIHRoZSBzZWdtZW50IGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBmb3J3YXJkIHJlZmVyZW5jZSBpcwotCSAgICAgcmVzb2x2ZWQsIHRoZW4gY29weSB0aGUgc2VnbWVudCBpZCBmcm9tIHRoZSBmb3J3YXJkCi0JICAgICBzeW1ib2wuICAqLwotCSAgU0ZfU0VUX0dFVF9TRUdNRU5UIChkZWZfc3ltYm9sX2luX3Byb2dyZXNzKTsKLQotCSAgLyogRklYTUU6IGdjYyBjYW4gZ2VuZXJhdGUgYWRkcmVzcyBleHByZXNzaW9ucwotCSAgICAgaGVyZSBpbiB1bnVzdWFsIGNhc2VzIChzZWFyY2ggZm9yICJvYnNjdXJlIgotCSAgICAgaW4gc2Rib3V0LmMpLiAgV2UganVzdCBpZ25vcmUgdGhlIG9mZnNldAotCSAgICAgaGVyZSwgdGh1cyBnZW5lcmF0aW5nIGluY29ycmVjdCBkZWJ1Z2dpbmcKLQkgICAgIGluZm9ybWF0aW9uLiAgV2UgaWdub3JlIHRoZSByZXN0IG9mIHRoZQotCSAgICAgbGluZSBqdXN0IGJlbG93LiAgKi8KLQl9Ci0gICAgICAvKiBPdGhlcndpc2UsIGl0IGlzIHRoZSBuYW1lIG9mIGEgbm9uIGRlYnVnIHN5bWJvbCBhbmQKLQkgaXRzIHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBsYXRlci4gKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAgICAgLyogRklYTUU6IHRoaXMgaXMgdG8gYXZvaWQgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUKLQkgRklYTUUgY2FzZSBtZW50aW9uZWQganVzdCBhYm92ZS4gICovCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKGRlZl9zeW1ib2xfaW5fcHJvZ3Jlc3MsCi0JCSAgICh2YWx1ZVQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgICB9CQkJCS8qIGlmIHN5bWJvbCBiYXNlZCAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNpZmRlZiBURV9QRQotCi0vKiBIYW5kbGUgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3AuICBUaGlzIGlzIHBhcnNlZCBieSBzX2xpbmtvbmNlIGluCi0gICByZWFkLmMsIHdoaWNoIHRoZW4gY2FsbHMgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgc3BlY2lmaWMgcm91dGluZS4gICovCi0KLXZvaWQKLW9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UgKHR5cGUpCi0gICAgIGVudW0gbGlua29uY2VfdHlwZSB0eXBlOwotewotICBzZWdfaW5mbyAobm93X3NlZyktPnNjbmhkci5zX2ZsYWdzIHw9IElNQUdFX1NDTl9MTktfQ09NREFUOwotCi0gIC8qIFdlIHN0b3JlIHRoZSB0eXBlIGluIHRoZSBzZWdfaW5mbyBzdHJ1Y3R1cmUsIGFuZCB1c2UgaXQgdG8gc2V0IHVwCi0gICAgIHRoZSBhdXhpbGlhcnkgZW50cnkgZm9yIHRoZSBzZWN0aW9uIHN5bWJvbCBpbiBjX3NlY3Rpb25fc3ltYm9sLiAgKi8KLSAgc2VnX2luZm8gKG5vd19zZWcpLT5saW5rb25jZSA9IHR5cGU7Ci19Ci0KLSNlbmRpZiAvKiBURV9QRSAqLwotCi12b2lkCi1jb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sgKCkKLXsKLSAgLyogVGhlc2UgaGFkIGJldHRlciBiZSB0aGUgc2FtZS4gIFVzdWFsbHkgMTggYnl0ZXMuICovCi0jaWZuZGVmIEJGRF9IRUFERVJTCi0gIGtub3cgKHNpemVvZiAoU1lNRU5UKSA9PSBzaXplb2YgKEFVWEVOVCkpOwotICBrbm93IChTWU1FU1ogPT0gQVVYRVNaKTsKLSNlbmRpZgotICB0YWdfaW5pdCAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBydW5zIHRocm91Z2ggdGhlIHN5bWJvbCB0YWJsZSBhbmQgcHV0cyBhbGwgdGhlCi0gICBleHRlcm5hbHMgb250byBhbm90aGVyIGNoYWluICovCi0KLS8qIFRoZSBjaGFpbiBvZiBnbG9iYWxzLiAgKi8KLXN5bWJvbFMgKnN5bWJvbF9nbG9iYWxQOwotc3ltYm9sUyAqc3ltYm9sX2dsb2JhbF9sYXN0UDsKLQotLyogVGhlIGNoYWluIG9mIGV4dGVybmFscyAqLwotc3ltYm9sUyAqc3ltYm9sX2V4dGVyblA7Ci1zeW1ib2xTICpzeW1ib2xfZXh0ZXJuX2xhc3RQOwotCi1zdGFjayAqYmxvY2tfc3RhY2s7Ci1zeW1ib2xTICpsYXN0X2Z1bmN0aW9uUDsKLXN0YXRpYyBzeW1ib2xTICpsYXN0X2JmUDsKLXN5bWJvbFMgKmxhc3RfdGFnUDsKLQotc3RhdGljIHVuc2lnbmVkIGludAoteWFua19zeW1ib2xzICgpCi17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLSAgdW5zaWduZWQgaW50IGxhc3RfZmlsZV9zeW1ubyA9IDA7Ci0KLSAgc3RydWN0IGZpbGVuYW1lX2xpc3QgKmZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3RfaGVhZDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICAgc3ltYm9sUDsKLSAgICAgICBzeW1ib2xQID0gc3ltYm9sUCA/IHN5bWJvbF9uZXh0IChzeW1ib2xQKSA6IHN5bWJvbF9yb290UCkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sUC0+c3lfbXJpX2NvbW1vbikKLQl7Ci0JICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FWFQKLSNpZmRlZiBURV9QRQotCSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JICAgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19XRUFLRVhUKQotCSAgICBhc19iYWQgKF8oIiVzOiBnbG9iYWwgc3ltYm9scyBub3Qgc3VwcG9ydGVkIGluIGNvbW1vbiBzZWN0aW9ucyIpLAotCQkgICAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICghU0ZfR0VUX0RFQlVHIChzeW1ib2xQKSkKLQl7Ci0JICAvKiBEZWJ1ZyBzeW1ib2xzIGRvIG5vdCBuZWVkIGFsbCB0aGlzIHJ1YmJpc2ggKi8KLQkgIHN5bWJvbFMgKnJlYWxfc3ltYm9sUDsKLQotCSAgLyogTCogYW5kIENfRUZDTiBzeW1ib2xzIG5ldmVyIG1lcmdlLiAqLwotCSAgaWYgKCFTRl9HRVRfTE9DQUwgKHN5bWJvbFApCi0JICAgICAgJiYgIVNGX0dFVF9TVEFUSUNTIChzeW1ib2xQKQotCSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApICE9IENfTEFCRUwKLQkgICAgICAmJiBzeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiAocmVhbF9zeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAoU19HRVRfTkFNRSAoc3ltYm9sUCksIERPX05PVF9TVFJJUCkpCi0JICAgICAgJiYgcmVhbF9zeW1ib2xQICE9IHN5bWJvbFApCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRS1TT09OOiB3aGVyZSBkbyBkdXBzIGNvbWUgZnJvbT8KLQkJIE1heWJlIHRhZyByZWZlcmVuY2VzIGJlZm9yZSBkZWZpbml0aW9ucz8geG94b3JpY2guICovCi0JICAgICAgLyogTW92ZSB0aGUgZGVidWcgZGF0YSBmcm9tIHRoZSBkZWJ1ZyBzeW1ib2wgdG8gdGhlCi0JCSByZWFsIHN5bWJvbC4gRG8gTk9UIGRvIHRoZSBvcG9zaXRlIChpLmUuIG1vdmUgZnJvbQotCQkgcmVhbCBzeW1ib2wgdG8gZGVidWcgc3ltYm9sIGFuZCByZW1vdmUgcmVhbCBzeW1ib2wgZnJvbSB0aGUKLQkJIGxpc3QuKSBCZWNhdXNlIHNvbWUgcG9pbnRlcnMgcmVmZXIgdG8gdGhlIHJlYWwgc3ltYm9sCi0JCSB3aGVyZWFzIG5vIHBvaW50ZXJzIHJlZmVyIHRvIHRoZSBkZWJ1ZyBzeW1ib2wuICovCi0JICAgICAgY19zeW1ib2xfbWVyZ2UgKHN5bWJvbFAsIHJlYWxfc3ltYm9sUCk7Ci0JICAgICAgLyogUmVwbGFjZSB0aGUgY3VycmVudCBzeW1ib2wgYnkgdGhlIHJlYWwgb25lICovCi0JICAgICAgLyogVGhlIHN5bWJvbHMgd2lsbCBuZXZlciBiZSB0aGUgbGFzdCBvciB0aGUgZmlyc3QKLQkJIGJlY2F1c2UgOiAxc3Qgc3ltYm9sIGlzIC5maWxlIGFuZCAzIGxhc3Qgc3ltYm9scyBhcmUKLQkJIC50ZXh0LCAuZGF0YSwgLmJzcyAqLwotCSAgICAgIHN5bWJvbF9yZW1vdmUgKHJlYWxfc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgc3ltYm9sX2luc2VydCAocmVhbF9zeW1ib2xQLCBzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICBzeW1ib2xQID0gcmVhbF9zeW1ib2xQOwotCSAgICB9CQkJLyogaWYgbm90IGxvY2FsIGJ1dCBkdXAnZCAqLwotCi0JICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQgJiYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19FMSkpCi0JICAgIHsKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfRTApOwotCSAgICB9CQkJLyogcHVzaCBkYXRhIGludG8gdGV4dCAqLwotCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sUCwgMSk7Ci0KLQkgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX05VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgJiYgIVNGX0dFVF9MT0NBTCAoc3ltYm9sUCkpCi0JCXsKLQkJICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfRTApCi0JCXsKLQkJICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX0xBQkVMKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBNYWlubHkgdG8gc3BlZWQgdXAgaWYgbm90IC1nICovCi0JICBpZiAoU0ZfR0VUX1BST0NFU1MgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgLyogSGFuZGxlIHRoZSBuZXN0ZWQgYmxvY2tzIGF1eGlsaWFyeSBpbmZvLiAqLwotCSAgICAgIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0JMT0NLKQotCQl7Ci0JCSAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHN5bWJvbFApLCAiLmJiIikpCi0JCSAgICBzdGFja19wdXNoIChibG9ja19zdGFjaywgKGNoYXIgKikgJnN5bWJvbFApOwotCQkgIGVsc2UKLQkJICAgIHsJCS8qIC5lYiAqLwotCQkgICAgICByZWdpc3RlciBzeW1ib2xTICpiZWdpbl9zeW1ib2xQOwotCQkgICAgICBiZWdpbl9zeW1ib2xQID0gKihzeW1ib2xTICoqKSBzdGFja19wb3AgKGJsb2NrX3N0YWNrKTsKLQkJICAgICAgaWYgKGJlZ2luX3N5bWJvbFAgPT0gKHN5bWJvbFMgKikgMCkKLQkJCWFzX3dhcm4gKF8oIm1pc21hdGNoZWQgLmViIikpOwotCQkgICAgICBlbHNlCi0JCQlTQV9TRVRfU1lNX0VORE5EWCAoYmVnaW5fc3ltYm9sUCwgc3ltYm9sX251bWJlciArIDIpOwotCQkgICAgfQotCQl9Ci0JICAgICAgLyogSWYgd2UgYXJlIGFibGUgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgYSBmdW5jdGlvbiwgYW5kIHdlCi0JICAgICAgIGFyZSBvdXQgb2YgYSBmdW5jdGlvbiAobGFzdF9mdW5jdGlvblAgPT0gMCkgdGhlbiwgdGhlCi0JICAgICAgIGZ1bmN0aW9uIHN5bWJvbCB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBhdXhpbGlhcnkKLQkgICAgICAgZW50cnkuICovCi0JICAgICAgaWYgKGxhc3RfZnVuY3Rpb25QID09IChzeW1ib2xTICopIDAgJiYKLQkJICBTRl9HRVRfRlVOQ1RJT04gKHN5bWJvbFApKQotCQl7Ci0JCSAgbGFzdF9mdW5jdGlvblAgPSBzeW1ib2xQOwotCi0JCSAgaWYgKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApIDwgMSkKLQkJICAgIHsKLQkJICAgICAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltYm9sUCwgMSk7Ci0JCSAgICB9CQkvKiBtYWtlIGl0IGF0IGxlYXN0IDEgKi8KLQotCQkgIC8qIENsb2JiZXIgcG9zc2libGUgc3RhbGUgLmRpbSBpbmZvcm1hdGlvbi4gKi8KLSNpZiAwCi0JCSAgLyogSWZmZWQgb3V0IGJ5IHN0ZXZlIC0gdGhpcyBmcmllcyB0aGUgbG5ub3B0ciBpbmZvIHRvbyAqLwotCQkgIGJ6ZXJvIChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXS54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuLAotCQkJIHNpemVvZiAoc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0ueF9zeW0ueF9mY25hcnkueF9hcnkueF9kaW1lbikpOwotI2VuZGlmCi0JCX0KLQkgICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GQ04pCi0JCXsKLQkJICBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChzeW1ib2xQKSwgIi5iZiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChsYXN0X2JmUCAhPSBOVUxMKQotCQkJU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfYmZQLCBzeW1ib2xfbnVtYmVyKTsKLQkJICAgICAgbGFzdF9iZlAgPSBzeW1ib2xQOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FRkNOKQotCQl7Ci0JCSAgLyogSSBkb24ndCBldmVuIGtub3cgaWYgdGhpcyBpcyBuZWVkZWQgZm9yIHNkYi4gQnV0Ci0JCSAgICAgdGhlIHN0YW5kYXJkIGFzc2VtYmxlciBnZW5lcmF0ZXMgaXQsIHNvLi4uICAqLwotCQkgIGlmIChsYXN0X2Z1bmN0aW9uUCA9PSAoc3ltYm9sUyAqKSAwKQotCQkgICAgYXNfZmF0YWwgKF8oIkNfRUZDTiBzeW1ib2wgb3V0IG9mIHNjb3BlIikpOwotCQkgIFNBX1NFVF9TWU1fRlNJWkUgKGxhc3RfZnVuY3Rpb25QLAotCQkJCSAgICAobG9uZykgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAtCi0JCQkJCSAgICBTX0dFVF9WQUxVRSAobGFzdF9mdW5jdGlvblApKSk7Ci0JCSAgU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfZnVuY3Rpb25QLCBzeW1ib2xfbnVtYmVyKTsKLQkJIGxhc3RfZnVuY3Rpb25QID0gKHN5bWJvbFMgKikgMDsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoU0ZfR0VUX1RBRyAoc3ltYm9sUCkpCi0JewotCSAgLyogRmlyc3QgZGVzY3JpcHRvciBvZiBhIHN0cnVjdHVyZSBtdXN0IHBvaW50IHRvCi0JICAgICAgIHRoZSBmaXJzdCBzbG90IGFmdGVyIHRoZSBzdHJ1Y3R1cmUgZGVzY3JpcHRpb24uICovCi0JICBsYXN0X3RhZ1AgPSBzeW1ib2xQOwotCi0JfQotICAgICAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19FT1MpCi0JewotCSAgLyogKzIgdGFrZSBpbiBhY2NvdW50IHRoZSBjdXJyZW50IHN5bWJvbCAqLwotCSAgU0FfU0VUX1NZTV9FTkRORFggKGxhc3RfdGFnUCwgc3ltYm9sX251bWJlciArIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRklMRSkKLQl7Ci0JICAvKiBJZiB0aGUgZmlsZW5hbWUgd2FzIHRvbyBsb25nIHRvIGZpdCBpbiB0aGUKLQkgICAgIGF1eGVudCwgcHV0IGl0IGluIHRoZSBzdHJpbmcgdGFibGUgKi8KLQkgIGlmIChTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyAoc3ltYm9sUCkgPT0gMAotCSAgICAgICYmIFNBX0dFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCkgIT0gMCkKLQkgICAgewotCSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCwgc3RyaW5nX2J5dGVfY291bnQpOwotCSAgICAgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoZmlsZW5hbWVfbGlzdF9zY2FuLT5maWxlbmFtZSkgKyAxOwotCSAgICAgIGZpbGVuYW1lX2xpc3Rfc2NhbiA9IGZpbGVuYW1lX2xpc3Rfc2Nhbi0+bmV4dDsKLQkgICAgfQotCSAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCBsYXN0X2ZpbGVfc3ltbm8pOwotCSAgICAgIGxhc3RfZmlsZV9zeW1ubyA9IHN5bWJvbF9udW1iZXI7Ci0JICAgIH0JCQkvKiBubyBvbmUgcG9pbnRzIGF0IHRoZSBmaXJzdCAuZmlsZSBzeW1ib2wgKi8KLQl9CQkJLyogaWYgZGVidWcgb3IgdGFnIG9yIGVvcyBvciBmaWxlICovCi0KLSNpZmRlZiB0Y19mcm9iX2NvZmZfc3ltYm9sCi0gICAgICB0Y19mcm9iX2NvZmZfc3ltYm9sIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gICAgICAvKiBXZSBtdXN0IHB1dCB0aGUgZXh0ZXJuYWwgc3ltYm9scyBhcGFydC4gVGhlIGxvYWRlcgotCSBkb2VzIG5vdCBib21iIGlmIHdlIGRvIG5vdC4gQnV0IHRoZSByZWZlcmVuY2VzIGluCi0JIHRoZSBlbmRuZHggZmllbGQgZm9yIGEgLmJiIHN5bWJvbCBhcmUgbm90IGNvcnJlY3RlZAotCSBpZiBhbiBleHRlcm5hbCBzeW1ib2wgaXMgcmVtb3ZlZCBiZXR3ZWVuIC5iYiBhbmQgLmJlLgotCSBJLmUgaW4gdGhlIGZvbGxvd2luZyBjYXNlIDoKLQkgWzIwXSAuYmIgZW5kbmR4ID0gMjIKLQkgWzIxXSBmb28gZXh0ZXJuYWwKLQkgWzIyXSAuYmUKLQkgbGQgd2lsbCBtb3ZlIHRoZSBzeW1ib2wgMjEgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBidXQKLQkgZW5kbmR4IHdpbGwgc3RpbGwgYmUgMjIgaW5zdGVhZCBvZiAyMS4gKi8KLQotCi0gICAgICBpZiAoU0ZfR0VUX0xPQ0FMIChzeW1ib2xQKSkKLQl7Ci0JICAvKiByZW1vdmUgQ19FRkNOIGFuZCBMT0NBTCAoTC4uLikgc3ltYm9scyAqLwotCSAgLyogbmV4dCBwb2ludGVyIHJlbWFpbnMgdmFsaWQgKi8KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0JfQotICAgICAgZWxzZSBpZiAoc3ltYm9sUC0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkpCi0JewotCSAgLyogU2tpcCBzeW1ib2xzIHdoaWNoIHdlcmUgZXF1YXRlZCB0byB1bmRlZmluZWQgb3IgY29tbW9uCi0JICAgICBzeW1ib2xzLiAgKi8KLQkgIHN5bWJvbF9yZW1vdmUgKHN5bWJvbFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCX0KLSAgICAgIGVsc2UgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApCi0JICAgICAgICYmICFTX0lTX0RFQlVHIChzeW1ib2xQKQotCSAgICAgICAmJiAhU0ZfR0VUX1NUQVRJQ1MgKHN5bWJvbFApCi0JICAgICAgICYmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfV0VBS0VYVCkpCi0JewotCSAgLyogaWYgZXh0ZXJuYWwsIFJlbW92ZSBmcm9tIHRoZSBsaXN0ICovCi0JICBzeW1ib2xTICpob2xkID0gc3ltYm9sX3ByZXZpb3VzIChzeW1ib2xQKTsKLQotCSAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyAoc3ltYm9sUCk7Ci0JICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfZXh0ZXJuX2xhc3RQLCAmc3ltYm9sX2V4dGVyblAsICZzeW1ib2xfZXh0ZXJuX2xhc3RQKTsKLQkgIHN5bWJvbFAgPSBob2xkOwotCX0KLSAgICAgIGVsc2UgaWYgKCEgU19JU19ERUJVRyAoc3ltYm9sUCkKLQkgICAgICAgJiYgISBTRl9HRVRfU1RBVElDUyAoc3ltYm9sUCkKLQkgICAgICAgJiYgISBTRl9HRVRfRlVOQ1RJT04gKHN5bWJvbFApCi0JICAgICAgICYmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQKSA9PSBDX0VYVAotI2lmZGVmIFRFX1BFCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSwotI2VuZGlmCi0JCSAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfTlRfV0VBSykpCi0JewotCSAgc3ltYm9sUyAqaG9sZCA9IHN5bWJvbF9wcmV2aW91cyAoc3ltYm9sUCk7Ci0KLQkgIC8qIFRoZSBPJ1JlaWxseSBDT0ZGIGJvb2sgc2F5cyB0aGF0IGRlZmluZWQgZ2xvYmFsIHN5bWJvbHMKLSAgICAgICAgICAgICBjb21lIGF0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSwganVzdCBiZWZvcmUKLSAgICAgICAgICAgICB1bmRlZmluZWQgZ2xvYmFsIHN5bWJvbHMuICAqLwotCi0JICBzeW1ib2xfcmVtb3ZlIChzeW1ib2xQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKTsKLQkgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbFAsIHN5bWJvbF9nbG9iYWxfbGFzdFAsICZzeW1ib2xfZ2xvYmFsUCwKLQkJCSAmc3ltYm9sX2dsb2JhbF9sYXN0UCk7Ci0JICBzeW1ib2xQID0gaG9sZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNGX0dFVF9TVFJJTkcgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgc3ltYm9sUC0+c3lfbmFtZV9vZmZzZXQgPSBzdHJpbmdfYnl0ZV9jb3VudDsKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBzdHJsZW4gKFNfR0VUX05BTUUgKHN5bWJvbFApKSArIDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkgICAgfQkJCS8qIGZpeCAibG9uZyIgbmFtZXMgKi8KLQotCSAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLQkgIHN5bWJvbF9udW1iZXIgKz0gMSArIFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFApOwotCX0JCQkvKiBpZiBsb2NhbCBzeW1ib2wgKi8KLSAgICB9CQkJCS8qIHRyYXZlcnNlIHRoZSBzeW1ib2wgbGlzdCAqLwotICByZXR1cm4gc3ltYm9sX251bWJlcjsKLQotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWdsdWVfc3ltYm9scyAoaGVhZCwgdGFpbCkKLSAgICAgc3ltYm9sUyAqKmhlYWQ7Ci0gICAgIHN5bWJvbFMgKip0YWlsOwotewotICB1bnNpZ25lZCBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgd2hpbGUgKCpoZWFkICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUyAqdG1wID0gKmhlYWQ7Ci0KLSAgICAgIC8qIGFwcGVuZCAqLwotICAgICAgc3ltYm9sX3JlbW92ZSAodG1wLCBoZWFkLCB0YWlsKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHRtcCwgc3ltYm9sX2xhc3RQLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQotICAgICAgLyogYW5kIHByb2Nlc3MgKi8KLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HICh0bXApKQotCXsKLQkgIHRtcC0+c3lfbmFtZV9vZmZzZXQgPSBzdHJpbmdfYnl0ZV9jb3VudDsKLQkgIHN0cmluZ19ieXRlX2NvdW50ICs9IHN0cmxlbiAoU19HRVRfTkFNRSAodG1wKSkgKyAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0bXAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQl9CQkJLyogZml4ICJsb25nIiBuYW1lcyAqLwotCi0gICAgICB0bXAtPnN5X251bWJlciA9IHN5bWJvbF9udW1iZXI7Ci0gICAgICBzeW1ib2xfbnVtYmVyICs9IDEgKyBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZICh0bXApOwotICAgIH0JCQkJLyogYXBwZW5kIHRoZSBlbnRpcmUgZXh0ZXJuIGNoYWluICovCi0KLSAgcmV0dXJuIHN5bWJvbF9udW1iZXI7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXRpZV90YWdzICgpCi17Ci0gIHVuc2lnbmVkIGludCBzeW1ib2xfbnVtYmVyID0gMDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfbnVtYmVyID0gc3ltYm9sX251bWJlcjsKLQotICAgICAgaWYgKFNGX0dFVF9UQUdHRUQgKHN5bWJvbFApKQotCXsKLQkgIFNBX1NFVF9TWU1fVEFHTkRYCi0JICAgIChzeW1ib2xQLAotCSAgICAgKChzeW1ib2xTICopIFNBX0dFVF9TWU1fVEFHTkRYIChzeW1ib2xQKSktPnN5X251bWJlcik7Ci0JfQotCi0gICAgICBzeW1ib2xfbnVtYmVyICs9IDEgKyBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHN5bWJvbF9udW1iZXI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jcmF3bF9zeW1ib2xzIChoLCBhYmZkKQotICAgICBvYmplY3RfaGVhZGVycyAqaDsKLSAgICAgYmZkICogYWJmZDsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgc3RhY2sgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBtYXRjaGluZyAuYmIgLmJlICovCi0KLSAgYmxvY2tfc3RhY2sgPSBzdGFja19pbml0ICg1MTIsIHNpemVvZiAoc3ltYm9sUyAqKSk7Ci0KLSAgLyogVGhlIHN5bWJvbCBsaXN0IHNob3VsZCBiZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHNlcXVlbmNlCi0gICAqIG9yZGVyIDoKLSAgICogLiAuZmlsZSBzeW1ib2wKLSAgICogLiBkZWJ1ZyBlbnRyaWVzIGZvciBmdW5jdGlvbnMKLSAgICogLiBmYWtlIHN5bWJvbHMgZm9yIHRoZSBzZWN0aW9ucywgaW5jbHVkaW5nIC50ZXh0IC5kYXRhIGFuZCAuYnNzCi0gICAqIC4gZGVmaW5lZCBzeW1ib2xzCi0gICAqIC4gdW5kZWZpbmVkIHN5bWJvbHMKLSAgICogQnV0IHRoaXMgaXMgbm90IG1hbmRhdG9yeS4gVGhlIG9ubHkgaW1wb3J0YW50IHBvaW50IGlzIHRvIHB1dCB0aGUKLSAgICogdW5kZWZpbmVkIHN5bWJvbHMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KLSAgICovCi0KLSAgLyogSXMgdGhlcmUgYSAuZmlsZSBzeW1ib2wgPyBJZiBub3QgaW5zZXJ0IG9uZSBhdCB0aGUgYmVnaW5uaW5nLiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQID09IE5VTEwKLSAgICAgIHx8IFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbF9yb290UCkgIT0gQ19GSUxFKQotICAgIHsKLSAgICAgIGNfZG90X2ZpbGVfc3ltYm9sICgiZmFrZSIpOwotICAgIH0KLQotICAvKgotICAgKiBCdWlsZCB1cCBzdGF0aWMgc3ltYm9scyBmb3IgdGhlIHNlY3Rpb25zLCB0aGV5IGFyZSBmaWxsZWQgaW4gbGF0ZXIKLSAgICovCi0KLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5kb3QgPSBjX3NlY3Rpb25fc3ltYm9sIChzZWdtZW50X2luZm9baV0ubmFtZSwKLQkJCQkJICAgICAgaSAtIFNFR19FMCArIDEpOwotCi0gIC8qIFRha2UgYWxsIHRoZSBleHRlcm5hbHMgb3V0IGFuZCBwdXQgdGhlbSBpbnRvIGFub3RoZXIgY2hhaW4gKi8KLSAgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUgKGgsIHlhbmtfc3ltYm9scyAoKSk7Ci0gIC8qIFRha2UgdGhlIGV4dGVybmFscyBhbmQgZ2x1ZSB0aGVtIG9udG8gdGhlIGVuZC4qLwotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwKLQkJCSAgIChIX0dFVF9TWU1CT0xfQ09VTlQgKGgpCi0JCQkgICAgKyBnbHVlX3N5bWJvbHMgKCZzeW1ib2xfZ2xvYmFsUCwKLQkJCQkJICAgICZzeW1ib2xfZ2xvYmFsX2xhc3RQKQotCQkJICAgICsgZ2x1ZV9zeW1ib2xzICgmc3ltYm9sX2V4dGVyblAsCi0JCQkJCSAgICAmc3ltYm9sX2V4dGVybl9sYXN0UCkpKTsKLQotICBIX1NFVF9TWU1CT0xfVEFCTEVfU0laRSAoaCwgdGllX3RhZ3MgKCkpOwotICBrbm93IChzeW1ib2xfZ2xvYmFsUCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2dsb2JhbF9sYXN0UCA9PSBOVUxMKTsKLSAga25vdyAoc3ltYm9sX2V4dGVyblAgPT0gTlVMTCk7Ci0gIGtub3cgKHN5bWJvbF9leHRlcm5fbGFzdFAgPT0gTlVMTCk7Ci19Ci0KLS8qCi0gKiBGaW5kIHN0cmluZ3MgYnkgY3Jhd2xpbmcgYWxvbmcgc3ltYm9sIHRhYmxlIGNoYWluLgotICovCi0KLXZvaWQKLXdfc3RyaW5ncyAod2hlcmUpCi0gICAgIGNoYXIgKndoZXJlOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotICBzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9oZWFkOwotCi0gIC8qIEdvdHRhIGRvIG1kXyBieXRlLW9yZGVyaW5nIHN0dWZmIGZvciBzdHJpbmdfYnl0ZV9jb3VudCBmaXJzdCAtIEtXSyAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCAodmFsdWVUKSBzdHJpbmdfYnl0ZV9jb3VudCwgNCk7Ci0gIHdoZXJlICs9IDQ7Ci0KLSNpZmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICAvKiBTdXBwb3J0IGxvbmcgc2VjdGlvbiBuYW1lcyBhcyBmb3VuZCBpbiBQRS4gIFRoaXMgY29kZSBtdXN0Ci0gICAgIGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIGNvZmZfaGVhZGVyX2FwcGVuZCBhbmQgd3JpdGVfb2JqZWN0X2ZpbGUuICAqLwotICB7Ci0gICAgdW5zaWduZWQgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfTEFTVDsgaSsrKQotICAgICAgewotCWlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXQotCSAgICAmJiBzdHJsZW4gKHNlZ21lbnRfaW5mb1tpXS5uYW1lKSA+IFNDTk5NTEVOKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCSAgICBzaXplID0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSkgKyAxOwotCSAgICBtZW1jcHkgKHdoZXJlLCBzZWdtZW50X2luZm9baV0ubmFtZSwgc2l6ZSk7Ci0JICAgIHdoZXJlICs9IHNpemU7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZiAvKiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUyAqLwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLSAgICAgICBzeW1ib2xQOwotICAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgICAgIGlmIChTRl9HRVRfU1RSSU5HIChzeW1ib2xQKSkKLQl7Ci0JICBzaXplID0gc3RybGVuIChTX0dFVF9OQU1FIChzeW1ib2xQKSkgKyAxOwotCSAgbWVtY3B5ICh3aGVyZSwgU19HRVRfTkFNRSAoc3ltYm9sUCksIHNpemUpOwotCSAgd2hlcmUgKz0gc2l6ZTsKLQl9Ci0gICAgICBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCkgPT0gQ19GSUxFCi0JICAmJiBTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyAoc3ltYm9sUCkgPT0gMAotCSAgJiYgU0FfR0VUX0ZJTEVfRk5BTUVfT0ZGU0VUIChzeW1ib2xQKSAhPSAwKQotCXsKLQkgIHNpemUgPSBzdHJsZW4gKGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUpICsgMTsKLQkgIG1lbWNweSAod2hlcmUsIGZpbGVuYW1lX2xpc3Rfc2Nhbi0+ZmlsZW5hbWUsIHNpemUpOwotCSAgZmlsZW5hbWVfbGlzdF9zY2FuID0gZmlsZW5hbWVfbGlzdF9zY2FuIC0+bmV4dDsKLQkgIHdoZXJlICs9IHNpemU7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2xpbmVub3NfZm9yIChhYmZkLCBoLCBmaWxlX2N1cnNvcikKLSAgICAgYmZkICogYWJmZDsKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoOwotICAgICB1bnNpZ25lZCBsb25nICpmaWxlX2N1cnNvcjsKLXsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgbG9uZyBzdGFydCA9ICpmaWxlX2N1cnNvcjsKLQotICBmb3IgKGlkeCA9IFNFR19FMDsgaWR4IDwgU0VHX0xBU1Q7IGlkeCsrKQotICAgIHsKLSAgICAgIHNlZ21lbnRfaW5mb190eXBlICpzID0gc2VnbWVudF9pbmZvICsgaWR4OwotCi0KLSAgICAgIGlmIChzLT5zY25oZHIuc19ubG5ubyAhPSAwKQotCXsKLQkgIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZV9wdHI7Ci0KLQkgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmJ1ZmZlciA9Ci0JICAoc3RydWN0IGV4dGVybmFsX2xpbmVubyAqKSB4bWFsbG9jIChzLT5zY25oZHIuc19ubG5ubyAqIExJTkVTWik7Ci0KLQkgIHN0cnVjdCBleHRlcm5hbF9saW5lbm8gKmRzdCA9IGJ1ZmZlcjsKLQotCSAgLyogUnVuIHRocm91Z2ggdGhlIHRhYmxlIHdlJ3ZlIGJ1aWx0IGFuZCB0dXJuIGl0IGludG8gaXRzIGV4dGVybmFsCi0JIGZvcm0sIHRha2UgdGhpcyBjaGFuY2UgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgKi8KLQotCSAgZm9yIChsaW5lX3B0ciA9IHMtPmxpbmVub19saXN0X2hlYWQ7Ci0JICAgICAgIGxpbmVfcHRyICE9IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTDsKLQkgICAgICAgbGluZV9wdHIgPSBsaW5lX3B0ci0+bmV4dCkKLQkgICAgewotCi0JICAgICAgaWYgKGxpbmVfcHRyLT5saW5lLmxfbG5ubyA9PSAwKQotCQl7Ci0JCSAgLyogVHVybiBhIHBvaW50ZXIgdG8gYSBzeW1ib2wgaW50byB0aGUgc3ltYm9scycgaW5kZXggKi8KLQkJICBsaW5lX3B0ci0+bGluZS5sX2FkZHIubF9zeW1uZHggPQotCQkgICAgKChzeW1ib2xTICopIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3N5bW5keCktPnN5X251bWJlcjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGxpbmVfcHRyLT5saW5lLmxfYWRkci5sX3BhZGRyICs9ICgoc3RydWN0IGZyYWcgKikgKGxpbmVfcHRyLT5mcmFnKSktPmZyX2FkZHJlc3M7Ci0JCX0KLQotCi0JICAgICAgKHZvaWQpIGJmZF9jb2ZmX3N3YXBfbGluZW5vX291dCAoYWJmZCwgJihsaW5lX3B0ci0+bGluZSksIGRzdCk7Ci0JICAgICAgZHN0Kys7Ci0KLQkgICAgfQotCi0JICBzLT5zY25oZHIuc19sbm5vcHRyID0gKmZpbGVfY3Vyc29yOwotCi0JICBiZmRfd3JpdGUgKGJ1ZmZlciwgMSwgcy0+c2NuaGRyLnNfbmxubm8gKiBMSU5FU1osIGFiZmQpOwotCSAgZnJlZSAoYnVmZmVyKTsKLQotCSAgKmZpbGVfY3Vyc29yICs9IHMtPnNjbmhkci5zX25sbm5vICogTElORVNaOwotCX0KLSAgICB9Ci0gIEhfU0VUX0xJTkVOT19TSVpFIChoLCAqZmlsZV9jdXJzb3IgLSBzdGFydCk7Ci19Ci0KLQotLyogTm93IHdlIHJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIGZyYWcgY2hhaW5zIGluIGEgc2VnbWVudCBhbmQKLSAgIG1ha2UgYWxsIHRoZSBzdWJzZWdtZW50IGZyYWdzIGFwcGVhciBhdCB0aGUgZW5kIG9mIHRoZQotICAgbGlzdCwgYXMgaWYgdGhlIHNlZyAwIHdhcyBleHRyYSBsb25nICovCi0KLXN0YXRpYyB2b2lkCi1yZW1vdmVfc3Vic2VncyAoKQotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGZyY2hhaW5TICpoZWFkID0gc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QOwotICAgICAgZnJhZ1MgZHVtbXk7Ci0gICAgICBmcmFnUyAqcHJldl9mcmFnID0gJmR1bW15OwotCi0gICAgICB3aGlsZSAoaGVhZCAmJiBoZWFkLT5mcmNoX3NlZyA9PSBpKQotCXsKLQkgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IGhlYWQtPmZyY2hfcm9vdDsKLQkgIHByZXZfZnJhZyA9IGhlYWQtPmZyY2hfbGFzdDsKLQkgIGhlYWQgPSBoZWFkLT5mcmNoX25leHQ7Ci0JfQotICAgICAgcHJldl9mcmFnLT5mcl9uZXh0ID0gMDsKLSAgICB9Ci19Ci0KLXVuc2lnbmVkIGxvbmcgbWFjaGluZTsKLWludCBjb2ZmX2ZsYWdzOwotZXh0ZXJuIHZvaWQKLXdyaXRlX29iamVjdF9maWxlICgpCi17Ci0gIGludCBpOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaGFpbl9wdHI7Ci0KLSAgb2JqZWN0X2hlYWRlcnMgaGVhZGVyczsKLSAgdW5zaWduZWQgbG9uZyBmaWxlX2N1cnNvcjsKLSAgYmZkICphYmZkOwotICB1bnNpZ25lZCBpbnQgYWRkcjsKLSAgYWJmZCA9IGJmZF9vcGVudyAob3V0X2ZpbGVfbmFtZSwgVEFSR0VUX0ZPUk1BVCk7Ci0KLQotICBpZiAoYWJmZCA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBCRkRfQVJDSCwgbWFjaGluZSk7Ci0KLSAgc3RyaW5nX2J5dGVfY291bnQgPSA0OwotCi0gIGZvciAoZnJjaGFpbl9wdHIgPSBmcmNoYWluX3Jvb3Q7Ci0gICAgICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7Ci0gICAgICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ViLXNlZ21lbnRzIGFuZCBhbGlnbiB0aGVtIHVwLiAgQWxzbwotCSBjbG9zZSBhbnkgb3BlbiBmcmFncy4gIFdlIHRhY2sgYSAuZmlsbCBvbnRvIHRoZSBlbmQgb2YgdGhlCi0JIGZyYWcgY2hhaW4gc28gdGhhdCBhbnkgLmFsaWduJ3Mgc2l6ZSBjYW4gYmUgd29ya2VkIGJ5IGxvb2tpbmcKLQkgYXQgdGhlIG5leHQgZnJhZy4gICovCi0KLSAgICAgIHN1YnNlZ19zZXQgKGZyY2hhaW5fcHRyLT5mcmNoX3NlZywgZnJjaGFpbl9wdHItPmZyY2hfc3Vic2VnKTsKLQotI2lmbmRlZiBTVUJfU0VHTUVOVF9BTElHTgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDEKLSNlbmRpZgotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgICBtZF9kb19hbGlnbiAoU1VCX1NFR01FTlRfQUxJR04gKG5vd19zZWcpLCAoY2hhciAqKSBOVUxMLCAwLCAwLAotCQkgICBhbGlnbm1lbnRfZG9uZSk7Ci0jZW5kaWYKLSAgICAgIGZyYWdfYWxpZ24gKFNVQl9TRUdNRU5UX0FMSUdOIChub3dfc2VnKSwKLQkJICBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSA/IE5PUF9PUENPREUgOiAwLAotCQkgIDApOwotI2lmZGVmIG1kX2RvX2FsaWduCi0gICAgYWxpZ25tZW50X2RvbmU6Ci0jZW5kaWYKLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19ub3ctPmZyX2ZpeCA9IDA7Ci0gICAgICBrbm93IChmcmFnX25vdy0+ZnJfbmV4dCA9PSBOVUxMKTsKLSAgICB9Ci0KLQotICByZW1vdmVfc3Vic2VncyAoKTsKLQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgcmVsYXhfc2VnbWVudCAoc2VnbWVudF9pbmZvW2ldLmZyY2hhaW5QLT5mcmNoX3Jvb3QsIGkpOwotICAgIH0KLQotICBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzLCAwKTsKLQotICAvKiBGaW5kIG91dCBob3cgYmlnIHRoZSBzZWN0aW9ucyBhcmUsIGFuZCBzZXQgdGhlIGFkZHJlc3Nlcy4gICovCi0gIGFkZHIgPSAwOwotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGxvbmcgc2l6ZTsKLQotICAgICAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX3BhZGRyID0gYWRkcjsKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc192YWRkciA9IGFkZHI7Ci0KLSAgICAgIGlmIChzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfbmFtZVswXSkKLQl7Ci0JICBIX1NFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzLAotCQkJCSAgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMgKCZoZWFkZXJzKSArIDEpOwotCi0jaWZkZWYgQ09GRl9MT05HX1NFQ1RJT05fTkFNRVMKLQkgIC8qIFN1cHBvcnQgbG9uZyBzZWN0aW9uIG5hbWVzIGFzIGZvdW5kIGluIFBFLiAgVGhpcyBjb2RlCi0JICAgICBtdXN0IGNvb3JkaW5hdGUgd2l0aCB0aGF0IGluIGNvZmZfaGVhZGVyX2FwcGVuZCBhbmQKLQkgICAgIHdfc3RyaW5ncy4gICovCi0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBsZW47Ci0KLQkgICAgbGVuID0gc3RybGVuIChzZWdtZW50X2luZm9baV0ubmFtZSk7Ci0JICAgIGlmIChsZW4gPiBTQ05OTUxFTikKLQkgICAgICBzdHJpbmdfYnl0ZV9jb3VudCArPSBsZW4gKyAxOwotCSAgfQotI2VuZGlmIC8qIENPRkZfTE9OR19TRUNUSU9OX05BTUVTICovCi0JfQotCi0gICAgICBzaXplID0gc2l6ZV9zZWN0aW9uIChhYmZkLCAodW5zaWduZWQgaW50KSBpKTsKLSAgICAgIGFkZHIgKz0gc2l6ZTsKLQotICAgICAgLyogSSB0aGluayB0aGUgc2VjdGlvbiBhbGlnbm1lbnQgaXMgb25seSB1c2VkIG9uIHRoZSBpOTYwOyB0aGUKLQkgaTk2MCBuZWVkcyBpdCwgYW5kIGl0IHNob3VsZCBkbyBubyBoYXJtIG9uIG90aGVyIHRhcmdldHMuICAqLwotI2lmZGVmIEFMSUdOTUVOVF9JTl9TX0ZMQUdTCi0gICAgICBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfZmxhZ3MgfD0gKHNlY3Rpb25fYWxpZ25tZW50W2ldICYgMHhGKSA8PCA4OwotI2Vsc2UKLSAgICAgIHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19hbGlnbiA9IDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbaV07Ci0jZW5kaWYKLQotICAgICAgaWYgKGkgPT0gU0VHX0UwKQotCUhfU0VUX1RFWFRfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgICAgZWxzZSBpZiAoaSA9PSBTRUdfRTEpCi0JSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgc2l6ZSk7Ci0gICAgICBlbHNlIGlmIChpID09IFNFR19FMikKLQlIX1NFVF9CU1NfU0laRSAoJmhlYWRlcnMsIHNpemUpOwotICAgIH0KLQotICAvKiBUdXJuIHRoZSBnYXMgbmF0aXZlIHN5bWJvbCB0YWJsZSBzaGFwZSBpbnRvIGEgY29mZiBzeW1ib2wgdGFibGUgKi8KLSAgY3Jhd2xfc3ltYm9scyAoJmhlYWRlcnMsIGFiZmQpOwotCi0gIGlmIChzdHJpbmdfYnl0ZV9jb3VudCA9PSA0KQotICAgIHN0cmluZ19ieXRlX2NvdW50ID0gMDsKLQotICBIX1NFVF9TVFJJTkdfU0laRSAoJmhlYWRlcnMsIHN0cmluZ19ieXRlX2NvdW50KTsKLQotI2lmZGVmIHRjX2Zyb2JfZmlsZQotICB0Y19mcm9iX2ZpbGUgKCk7Ci0jZW5kaWYKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIGZpeHVwX21kZXBzIChzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdCwgJmhlYWRlcnMsIGkpOwotICAgICAgZml4dXBfc2VnbWVudCAoJnNlZ21lbnRfaW5mb1tpXSwgaSk7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yICIuc3RhYiIgc2VnbWVudHMgYW5kIGZpbGwgaW4gdGhlaXIgaW5pdGlhbCBzeW1ib2xzCi0gICAgIGNvcnJlY3RseS4gKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBuYW1lID0gc2VnbWVudF9pbmZvW2ldLm5hbWU7Ci0KLSAgICAgIGlmIChuYW1lICE9IE5VTEwKLQkgICYmIHN0cm5jbXAgKCIuc3RhYiIsIG5hbWUsIDUpID09IDAKLQkgICYmIHN0cm5jbXAgKCIuc3RhYnN0ciIsIG5hbWUsIDgpICE9IDApCi0JYWRqdXN0X3N0YWJfc2VjdGlvbiAoYWJmZCwgaSk7Ci0gICAgfQotCi0gIGZpbGVfY3Vyc29yID0gSF9HRVRfVEVYVF9GSUxFX09GRlNFVCAoJmhlYWRlcnMpOwotCi0gIGJmZF9zZWVrIChhYmZkLCAoZmlsZV9wdHIpIGZpbGVfY3Vyc29yLCAwKTsKLQotICAvKiBQbGFudCB0aGUgZGF0YSAqLwotCi0gIGZpbGxfc2VjdGlvbiAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgZG9fcmVsb2NzX2ZvciAoYWJmZCwgJmhlYWRlcnMsICZmaWxlX2N1cnNvcik7Ci0KLSAgZG9fbGluZW5vc19mb3IgKGFiZmQsICZoZWFkZXJzLCAmZmlsZV9jdXJzb3IpOwotCi0gIEhfU0VUX0ZJTEVfTUFHSUNfTlVNQkVSICgmaGVhZGVycywgQ09GRl9NQUdJQyk7Ci0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfVElNRVNUQU1QCi0gIEhfU0VUX1RJTUVfU1RBTVAgKCZoZWFkZXJzLCAobG9uZyl0aW1lKCh0aW1lX3QgKikwKSk7Ci0jZWxzZQotICBIX1NFVF9USU1FX1NUQU1QICgmaGVhZGVycywgMCk7Ci0jZW5kaWYKLSNpZmRlZiBUQ19DT0ZGX1NFVF9NQUNISU5FCi0gIFRDX0NPRkZfU0VUX01BQ0hJTkUgKCZoZWFkZXJzKTsKLSNlbmRpZgotCi0jaWZuZGVmIENPRkZfRkxBR1MKLSNkZWZpbmUgQ09GRl9GTEFHUyAwCi0jZW5kaWYKLQotI2lmZGVmIEtFRVBfUkVMT0NfSU5GTwotICBIX1NFVF9GTEFHUyAoJmhlYWRlcnMsICgoSF9HRVRfTElORU5PX1NJWkUoJmhlYWRlcnMpID8gMCA6IEZfTE5OTykgfAotCQkJICBDT0ZGX0ZMQUdTIHwgY29mZl9mbGFncykpOwotI2Vsc2UKLSAgSF9TRVRfRkxBR1MgKCZoZWFkZXJzLCAoKEhfR0VUX0xJTkVOT19TSVpFKCZoZWFkZXJzKSAgICAgPyAwIDogRl9MTk5PKSAgIHwKLQkJCSAgKEhfR0VUX1JFTE9DQVRJT05fU0laRSgmaGVhZGVycykgPyAwIDogRl9SRUxGTEcpIHwKLQkJCSAgQ09GRl9GTEFHUyB8IGNvZmZfZmxhZ3MpKTsKLSNlbmRpZgotCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgc3ltdGFibGVfc2l6ZSA9IEhfR0VUX1NZTUJPTF9UQUJMRV9TSVpFICgmaGVhZGVycyk7Ci0gICAgY2hhciAqYnVmZmVyMSA9IHhtYWxsb2MgKHN5bXRhYmxlX3NpemUgKyBzdHJpbmdfYnl0ZV9jb3VudCArIDEpOwotCi0gICAgSF9TRVRfU1lNQk9MX1RBQkxFX1BPSU5URVIgKCZoZWFkZXJzLCBiZmRfdGVsbCAoYWJmZCkpOwotICAgIHdfc3ltYm9scyAoYWJmZCwgYnVmZmVyMSwgc3ltYm9sX3Jvb3RQKTsKLSAgICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPiAwKQotICAgICAgd19zdHJpbmdzIChidWZmZXIxICsgc3ltdGFibGVfc2l6ZSk7Ci0gICAgYmZkX3dyaXRlIChidWZmZXIxLCAxLCBzeW10YWJsZV9zaXplICsgc3RyaW5nX2J5dGVfY291bnQsIGFiZmQpOwotICAgIGZyZWUgKGJ1ZmZlcjEpOwotICB9Ci0KLSAgY29mZl9oZWFkZXJfYXBwZW5kIChhYmZkLCAmaGVhZGVycyk7Ci0jaWYgMAotICAvKiBSZWNlbnQgY2hhbmdlcyB0byB3cml0ZSBuZWVkIHRoaXMsIGJ1dCB3aGVyZSBpdCBzaG91bGQKLSAgICAgZ28gaXMgdXAgdG8gS2VuLi4gKi8KLSAgaWYgKGJmZF9jbG9zZV9hbGxfZG9uZSAoYWJmZCkgPT0gZmFsc2UpCi0gICAgYXNfZmF0YWwgKF8oIkNhbid0IGNsb3NlICVzOiAlcyIpLCBvdXRfZmlsZV9uYW1lLAotCSAgICAgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSNlbHNlCi0gIHsKLSAgICBleHRlcm4gYmZkICpzdGRvdXRwdXQ7Ci0gICAgc3Rkb3V0cHV0ID0gYWJmZDsKLSAgfQotI2VuZGlmCi0KLX0KLQotLyogQWRkIGEgbmV3IHNlZ21lbnQuICBUaGlzIGlzIGNhbGxlZCBmcm9tIHN1YnNlZ19uZXcgdmlhIHRoZQotICAgb2JqX25ld19zZWdtZW50IG1hY3JvLiAgKi8KLQotc2VnVAotb2JqX2NvZmZfYWRkX3NlZ21lbnQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0jaWZuZGVmIENPRkZfTE9OR19TRUNUSU9OX05BTUVTCi0gIGNoYXIgYnVmW1NDTk5NTEVOICsgMV07Ci0KLSAgc3RybmNweSAoYnVmLCBuYW1lLCBTQ05OTUxFTik7Ci0gIGJ1ZltTQ05OTUxFTl0gPSAnXDAnOwotICBuYW1lID0gYnVmOwotI2VuZGlmCi0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1QgJiYgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWVbMF07IGkrKykKLSAgICBpZiAoc3RyY21wIChuYW1lLCBzZWdtZW50X2luZm9baV0ubmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiAoc2VnVCkgaTsKLQotICBpZiAoaSA9PSBTRUdfTEFTVCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlRvbyBtYW55IG5ldyBzZWN0aW9uczsgY2FuJ3QgYWRkIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgIHJldHVybiBub3dfc2VnOwotICAgIH0KLQotICAvKiBBZGQgYSBuZXcgc2VjdGlvbi4gICovCi0gIHN0cm5jcHkgKHNlZ21lbnRfaW5mb1tpXS5zY25oZHIuc19uYW1lLCBuYW1lLAotCSAgIHNpemVvZiAoc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25hbWUpKTsKLSAgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX2ZsYWdzID0gU1RZUF9SRUc7Ci0gIHNlZ21lbnRfaW5mb1tpXS5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgcmV0dXJuIChzZWdUKSBpOwotfQotCi0vKgotICogaW1wbGVtZW50IHRoZSAuc2VjdGlvbiBwc2V1ZG8gb3A6Ci0gKgkuc2VjdGlvbiBuYW1lIHssICJmbGFncyJ9Ci0gKiAgICAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgICAgICAgICAgfCAgICAgICAgICstLS0gb3B0aW9uYWwgZmxhZ3M6ICdiJyBmb3IgYnNzCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2knIGZvciBpbmZvCi0gKiAgICAgICAgICAgICAgICArLS0gc2VjdGlvbiBuYW1lICAgICAgICAgICAgICAgJ2wnIGZvciBsaWIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbicgZm9yIG5vbG9hZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvJyBmb3Igb3ZlcgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JyBmb3IgZGF0YQotICoJCQkJCQkgJ2QnIChhcHBhcmVudGx5IG04OGsgZm9yIGRhdGEpCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gnIGZvciB0ZXh0Ci0gKgkJCQkJCSAncicgZm9yIHJlYWQtb25seSBkYXRhCi0gKiBCdXQgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBhIHF1b3RlZCBzdHJpbmcsIHRyZWF0IGl0IGFzIGEKLSAqIHN1YnNlZ21lbnQgbnVtYmVyLgotICovCi0KLXZvaWQKLW9ial9jb2ZmX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogU3RyaXAgb3V0IHRoZSBzZWN0aW9uIG5hbWUgKi8KLSAgY2hhciAqc2VjdGlvbl9uYW1lLCAqbmFtZTsKLSAgY2hhciBjOwotICB1bnNpZ25lZCBpbnQgZXhwOwotICBsb25nIGZsYWdzOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICBjaGFyIHR5cGU7Ci0KLSAgICAgIHNfbXJpX3NlY3QgKCZ0eXBlKTsKLSAgICAgIGZsYWdzID0gMDsKLSAgICAgIGlmICh0eXBlID09ICdDJykKLQlmbGFncyA9IFNUWVBfVEVYVDsKLSAgICAgIGVsc2UgaWYgKHR5cGUgPT0gJ0QnKQotCWZsYWdzID0gU1RZUF9EQVRBOwotICAgICAgc2VnbWVudF9pbmZvW25vd19zZWddLnNjbmhkci5zX2ZsYWdzIHw9IGZsYWdzOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlY3Rpb25fbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIG5hbWUgPSB4bWFsbG9jIChpbnB1dF9saW5lX3BvaW50ZXIgLSBzZWN0aW9uX25hbWUgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBzZWN0aW9uX25hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGV4cCA9IDA7Ci0gIGZsYWdzID0gMDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCWV4cCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInCi0JCSAmJiAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQkJewotCQljYXNlICdiJzogZmxhZ3MgfD0gU1RZUF9CU1M7ICAgIGJyZWFrOwotCQljYXNlICdpJzogZmxhZ3MgfD0gU1RZUF9JTkZPOyAgIGJyZWFrOwotCQljYXNlICdsJzogZmxhZ3MgfD0gU1RZUF9MSUI7ICAgIGJyZWFrOwotCQljYXNlICduJzogZmxhZ3MgfD0gU1RZUF9OT0xPQUQ7IGJyZWFrOwotCQljYXNlICdvJzogZmxhZ3MgfD0gU1RZUF9PVkVSOyAgIGJyZWFrOwotCQljYXNlICdkJzoKLQkJY2FzZSAndyc6IGZsYWdzIHw9IFNUWVBfREFUQTsgICBicmVhazsKLQkJY2FzZSAneCc6IGZsYWdzIHw9IFNUWVBfVEVYVDsgICBicmVhazsKLQkJY2FzZSAncic6IGZsYWdzIHw9IFNUWVBfTElUOwlicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc193YXJuKF8oInVua25vd24gc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIpLAotCQkJICAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgc3Vic2VnX25ldyAobmFtZSwgKHN1YnNlZ1QpIGV4cCk7Ci0KLSAgc2VnbWVudF9pbmZvW25vd19zZWddLnNjbmhkci5zX2ZsYWdzIHw9IGZsYWdzOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX3RleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3Vic2VnX25ldyAoIi50ZXh0IiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1vYmpfY29mZl9kYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICBzdWJzZWdfbmV3ICgiLnRleHQiLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSArIDEwMDApOwotICBlbHNlCi0gICAgc3Vic2VnX25ldyAoIi5kYXRhIiwgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotfQotCi1zdGF0aWMgdm9pZAotb2JqX2NvZmZfaWRlbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7CQkvKiBzYXZlIGN1cnJlbnQgc2VnCSovCi0gIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBzdWJzZWdfbmV3ICgiLmNvbW1lbnQiLCAwKTsJCS8qIC5jb21tZW50IHNlZwkJKi8KLSAgc3RyaW5nZXIgKDEpOwkJCQkvKiByZWFkIHN0cmluZwkJKi8KLSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsJLyogcmVzdG9yZSBjdXJyZW50IHNlZwkqLwotfQotCi12b2lkCi1jX3N5bWJvbF9tZXJnZSAoZGVidWcsIG5vcm1hbCkKLSAgICAgc3ltYm9sUyAqZGVidWc7Ci0gICAgIHN5bWJvbFMgKm5vcm1hbDsKLXsKLSAgU19TRVRfREFUQV9UWVBFIChub3JtYWwsIFNfR0VUX0RBVEFfVFlQRSAoZGVidWcpKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAobm9ybWFsLCBTX0dFVF9TVE9SQUdFX0NMQVNTIChkZWJ1ZykpOwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChub3JtYWwpKQotICAgIHsKLSAgICAgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKG5vcm1hbCwgU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpKTsKLSAgICB9CQkJCS8qIHRha2UgdGhlIG1vc3Qgd2UgaGF2ZSAqLwotCi0gIGlmIChTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChkZWJ1ZykgPiAwKQotICAgIHsKLSAgICAgIG1lbWNweSAoKGNoYXIgKikgJm5vcm1hbC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMF0sCi0JICAgICAgKGNoYXIgKikgJmRlYnVnLT5zeV9zeW1ib2wub3N0X2F1eGVudFswXSwKLQkgICAgICAodW5zaWduZWQgaW50KSAoU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoZGVidWcpICogQVVYRVNaKSk7Ci0gICAgfQkJCQkvKiBNb3ZlIGFsbCB0aGUgYXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCi0KLSAgLyogTW92ZSB0aGUgZGVidWcgZmxhZ3MuICovCi0gIFNGX1NFVF9ERUJVR19GSUVMRCAobm9ybWFsLCBTRl9HRVRfREVCVUdfRklFTEQgKGRlYnVnKSk7Ci19CQkJCS8qIGNfc3ltYm9sX21lcmdlKCkgKi8KLQotc3RhdGljIGludAotY19saW5lX25ldyAoc3ltYm9sLCBwYWRkciwgbGluZV9udW1iZXIsIGZyYWcpCi0gICAgIHN5bWJvbFMgKiBzeW1ib2w7Ci0gICAgIGxvbmcgcGFkZHI7Ci0gICAgIGludCBsaW5lX251bWJlcjsKLSAgICAgZnJhZ1MgKiBmcmFnOwotewotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKm5ld19saW5lID0KLSAgKHN0cnVjdCBsaW5lbm9fbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBsaW5lbm9fbGlzdCkpOwotCi0gIHNlZ21lbnRfaW5mb190eXBlICpzID0gc2VnbWVudF9pbmZvICsgbm93X3NlZzsKLSAgbmV3X2xpbmUtPmxpbmUubF9sbm5vID0gbGluZV9udW1iZXI7Ci0KLSAgaWYgKGxpbmVfbnVtYmVyID09IDApCi0gICAgewotICAgICAgbGFzdF9saW5lX3N5bWJvbCA9IHN5bWJvbDsKLSAgICAgIG5ld19saW5lLT5saW5lLmxfYWRkci5sX3N5bW5keCA9IChsb25nKSBzeW1ib2w7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmV3X2xpbmUtPmxpbmUubF9hZGRyLmxfcGFkZHIgPSBwYWRkcjsKLSAgICB9Ci0KLSAgbmV3X2xpbmUtPmZyYWcgPSAoY2hhciAqKSBmcmFnOwotICBuZXdfbGluZS0+bmV4dCA9IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTDsKLQotCi0gIGlmIChzLT5saW5lbm9fbGlzdF9oZWFkID09IChzdHJ1Y3QgbGluZW5vX2xpc3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzLT5saW5lbm9fbGlzdF9oZWFkID0gbmV3X2xpbmU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcy0+bGluZW5vX2xpc3RfdGFpbC0+bmV4dCA9IG5ld19saW5lOwotICAgIH0KLSAgcy0+bGluZW5vX2xpc3RfdGFpbCA9IG5ld19saW5lOwotICByZXR1cm4gTElORVNaICogcy0+c2NuaGRyLnNfbmxubm8rKzsKLX0KLQotdm9pZAotY19kb3RfZmlsZV9zeW1ib2wgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX25ldyAoIi5maWxlIiwKLQkJCVNFR19ERUJVRywKLQkJCTAsCi0JCQkmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfRklMRSk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDEpOwotCi0gIGlmIChzdHJsZW4gKGZpbGVuYW1lKSA+IEZJTE5NTEVOKQotICAgIHsKLSAgICAgIC8qIEZpbGVuYW1lIGlzIHRvbyBsb25nIHRvIGZpdCBpbnRvIGFuIGF1eGVudCwKLQkgd2Ugc3RpY2sgaXQgaW50byB0aGUgc3RyaW5nIHRhYmxlIGluc3RlYWQuICBXZSBrZWVwCi0JIGEgbGlua2VkIGxpc3Qgb2YgdGhlIGZpbGVuYW1lcyB3ZSBmaW5kIHNvIHdlIGNhbiBlbWl0Ci0JIHRoZW0gbGF0ZXIuKi8KLSAgICAgIHN0cnVjdCBmaWxlbmFtZV9saXN0ICpmID0gKChzdHJ1Y3QgZmlsZW5hbWVfbGlzdCAqKQotCQkJCSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbmFtZV9saXN0KSkpOwotCi0gICAgICBmLT5maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgICAgZi0+bmV4dCA9IDA7Ci0KLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX1pFUk9TIChzeW1ib2xQLCAwKTsKLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FX09GRlNFVCAoc3ltYm9sUCwgMSk7Ci0KLSAgICAgIGlmIChmaWxlbmFtZV9saXN0X3RhaWwpIAotCWZpbGVuYW1lX2xpc3RfdGFpbC0+bmV4dCA9IGY7Ci0gICAgICBlbHNlCi0JZmlsZW5hbWVfbGlzdF9oZWFkID0gZjsKLSAgICAgIGZpbGVuYW1lX2xpc3RfdGFpbCA9IGY7ICAgICAgCi0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIFNBX1NFVF9GSUxFX0ZOQU1FIChzeW1ib2xQLCBmaWxlbmFtZSk7Ci0gICAgfQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIHsKLSAgICBleHRlcm4gaW50IGxpc3Rpbmc7Ci0gICAgaWYgKGxpc3RpbmcpCi0gICAgICB7Ci0JbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZW5hbWUpOwotICAgICAgfQotCi0gIH0KLQotI2VuZGlmCi0gIFNGX1NFVF9ERUJVRyAoc3ltYm9sUCk7Ci0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBwcmV2aW91c19maWxlX3N5bWJvbCk7Ci0KLSAgcHJldmlvdXNfZmlsZV9zeW1ib2wgPSBzeW1ib2xQOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzeW1ib2wgaXMgZmlyc3Qgb24gdGhlIHN5bWJvbCBjaGFpbiAqLwotICBpZiAoc3ltYm9sX3Jvb3RQICE9IHN5bWJvbFApCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfaW5zZXJ0IChzeW1ib2xQLCBzeW1ib2xfcm9vdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgIH0KLX0JCQkJLyogY19kb3RfZmlsZV9zeW1ib2woKSAqLwotCi0vKgotICogQnVpbGQgYSAnc2VjdGlvbiBzdGF0aWMnIHN5bWJvbC4KLSAqLwotCi1zeW1ib2xTICoKLWNfc2VjdGlvbl9zeW1ib2wgKG5hbWUsIGlkeCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgaW50IGlkeDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgRE9fTk9UX1NUUklQKTsKLSAgaWYgKHN5bWJvbFAgPT0gTlVMTCkKLSAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgaWR4LCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICBlbHNlCi0gICAgewotICAgICAgLyogTW1tbS4gIEkganVzdCBsb3ZlIHZpb2xhdGluZyBpbnRlcmZhY2VzLiAgTWFrZXMgbWUgZmVlbC4uLmRpcnR5LiAgKi8KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGlkeCk7Ci0gICAgICBzeW1ib2xQLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgIH0KLQotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW1ib2xQLCBDX1NUQVQpOwotICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAxKTsKLQotICBTRl9TRVRfU1RBVElDUyAoc3ltYm9sUCk7Ci0KLSNpZmRlZiBURV9ERUxUQQotICAvKiBtYW5mcmVkQHMtZGlyZWt0bmV0LmRlOiBzZWN0aW9uIHN5bWJvbHMgKm11c3QqIGhhdmUgdGhlIExPQ0FMIGJpdCBjbGVhcmVkLAotICAgICB3aGljaCBpcyBzZXQgYnkgdGhlIG5ldyBkZWZpbml0aW9uIG9mIExPQ0FMX0xBQkVMIGluIHRjLW02OGsuaC4gICovCi0gIFNGX0NMRUFSX0xPQ0FMIChzeW1ib2xQKTsKLSNlbmRpZgotI2lmZGVmIFRFX1BFCi0gIC8qIElmIHRoZSAubGlua29uY2UgcHNldWRvLW9wIHdhcyB1c2VkIGZvciB0aGlzIHNlY3Rpb24sIHdlIG11c3QKLSAgICAgc3RvcmUgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBhdXhpbGlhcnkgZW50cnkgZm9yIHRoZSBzZWN0aW9uCi0gICAgIHN5bWJvbC4gICovCi0gIGlmIChzZWdtZW50X2luZm9baWR4XS5saW5rb25jZSAhPSBMSU5LT05DRV9VTlNFVCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLQotICAgICAgc3dpdGNoIChzZWdtZW50X2luZm9baWR4XS5saW5rb25jZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCWNhc2UgTElOS09OQ0VfRElTQ0FSRDoKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0FOWTsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfT05FX09OTFk6Ci0JICB0eXBlID0gSU1BR0VfQ09NREFUX1NFTEVDVF9OT0RVUExJQ0FURVM7Ci0JICBicmVhazsKLQljYXNlIExJTktPTkNFX1NBTUVfU0laRToKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRTsKLQkgIGJyZWFrOwotCWNhc2UgTElOS09OQ0VfU0FNRV9DT05URU5UUzoKLQkgIHR5cGUgPSBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENIOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBTWU1fQVVYRU5UIChzeW1ib2xQKS0+eF9zY24ueF9jb21kYXQgPSB0eXBlOwotICAgIH0KLSNlbmRpZiAvKiBURV9QRSAqLwotCi0gIHJldHVybiBzeW1ib2xQOwotfQkJCQkvKiBjX3NlY3Rpb25fc3ltYm9sKCkgKi8KLQotc3RhdGljIHZvaWQKLXdfc3ltYm9scyAoYWJmZCwgd2hlcmUsIHN5bWJvbF9yb290UCkKLSAgICAgYmZkICogYWJmZDsKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIHN5bWJvbFMgKiBzeW1ib2xfcm9vdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIC8qIEZpcnN0IGZpbGwgaW4gdGhvc2UgdmFsdWVzIHdlIGhhdmUgb25seSBqdXN0IHdvcmtlZCBvdXQgKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX0xBU1Q7IGkrKykKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc2VnbWVudF9pbmZvW2ldLmRvdDsKLSAgICAgIGlmIChzeW1ib2xQKQotCXsKLQkgIFNBX1NFVF9TQ05fU0NOTEVOIChzeW1ib2xQLCBzZWdtZW50X2luZm9baV0uc2NuaGRyLnNfc2l6ZSk7Ci0JICBTQV9TRVRfU0NOX05SRUxPQyAoc3ltYm9sUCwgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25yZWxvYyk7Ci0JICBTQV9TRVRfU0NOX05MSU5OTyAoc3ltYm9sUCwgc2VnbWVudF9pbmZvW2ldLnNjbmhkci5zX25sbm5vKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAgICogRW1pdCBhbGwgc3ltYm9scyBsZWZ0IGluIHRoZSBzeW1ib2wgY2hhaW4uCi0gICAgICovCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiBVc2VkIHRvIHNhdmUgdGhlIG9mZnNldCBvZiB0aGUgbmFtZS4gSXQgaXMgdXNlZCB0byBwb2ludAotCSAgICAgICB0byB0aGUgc3RyaW5nIGluIG1lbW9yeSBidXQgbXVzdCBiZSBhIGZpbGUgb2Zmc2V0LiAqLwotICAgICAgcmVnaXN0ZXIgY2hhciAqdGVtcDsKLQotICAgICAgLyogV2UgY2FuJ3QgZml4IHRoZSBsbm5vcHRyIGZpZWxkIGluIHlhbmtfc3ltYm9scyB3aXRoIHRoZSBvdGhlcgotICAgICAgICAgYWRqdXN0bWVudHMsIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IHVudGlsIHdlIGtub3cgd2hlcmUgdGhleQotICAgICAgICAgZ28gaW4gdGhlIGZpbGUuICAqLwotICAgICAgaWYgKFNGX0dFVF9BREpfTE5OT1BUUiAoc3ltYm9sUCkpCi0JewotCSAgU0FfR0VUX1NZTV9MTk5PUFRSIChzeW1ib2xQKSArPQotCSAgICBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoc3ltYm9sUCldLnNjbmhkci5zX2xubm9wdHI7Ci0JfQotCi0gICAgICB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHN5bWJvbFApOwotCi0gICAgICB0ZW1wID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gICAgICBpZiAoU0ZfR0VUX1NUUklORyAoc3ltYm9sUCkpCi0JewotCSAgU19TRVRfT0ZGU0VUIChzeW1ib2xQLCBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCk7Ci0JICBTX1NFVF9aRVJPRVMgKHN5bWJvbFAsIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1zZXQgKHN5bWJvbFAtPnN5X3N5bWJvbC5vc3RfZW50cnkubl9uYW1lLCAwLCBTWU1OTUxFTik7Ci0JICBzdHJuY3B5IChzeW1ib2xQLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbmFtZSwgdGVtcCwgU1lNTk1MRU4pOwotCX0KLSAgICAgIHdoZXJlID0gc3ltYm9sX3RvX2NoYXJzIChhYmZkLCB3aGVyZSwgc3ltYm9sUCk7Ci0gICAgICBTX1NFVF9OQU1FIChzeW1ib2xQLCB0ZW1wKTsKLSAgICB9Ci0KLX0JCQkJLyogd19zeW1ib2xzKCkgKi8KLQotc3RhdGljIHZvaWQKLW9ial9jb2ZmX2xjb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfbGNvbW0oMCk7Ci0gIHJldHVybjsKLSNpZiAwCi0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgaW50IHRlbXA7Ci0gIGNoYXIgKnA7Ci0KLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk1pc3Npbmcgc2l6ZSBleHByZXNzaW9uIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygibGNvbW0gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0KLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UobmFtZSk7Ci0KLSAgaWYgKFNfR0VUX1NFR01FTlQoc3ltYm9sUCkgPT0gU0VHX1VOS05PV04gJiYKLSAgICAgIFNfR0VUX1ZBTFVFKHN5bWJvbFApID09IDApCi0gICAgewotICAgICAgaWYgKCEgbmVlZF9wYXNzXzIpCi0JewotCSAgY2hhciAqcDsKLQkgIHNlZ1QgY3VycmVudF9zZWcgPSBub3dfc2VnOyAJLyogc2F2ZSBjdXJyZW50IHNlZyAgICAgKi8KLQkgIHN1YnNlZ1QgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0JICBzdWJzZWdfc2V0IChTRUdfRTIsIDEpOwotCSAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotCSAgcCA9IGZyYWdfdmFyKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAotCQkgICAgICAgKG9mZnNldFQpIHRlbXAsIChjaGFyICopIDApOwotCSAgKnAgPSAwOwotCSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsgLyogcmVzdG9yZSBjdXJyZW50IHNlZyAqLwotCSAgU19TRVRfU0VHTUVOVChzeW1ib2xQLCBTRUdfRTIpOwotCSAgU19TRVRfU1RPUkFHRV9DTEFTUyhzeW1ib2xQLCBDX1NUQVQpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQoXygiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZCIpLCBuYW1lKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lKCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLWZpeHVwX21kZXBzIChmcmFncywgaCwgdGhpc19zZWdtZW50KQotICAgICBmcmFnUyAqIGZyYWdzOwotICAgICBvYmplY3RfaGVhZGVycyAqIGg7Ci0gICAgIHNlZ1QgdGhpc19zZWdtZW50OwotewotICBzdWJzZWdfY2hhbmdlICh0aGlzX3NlZ21lbnQsIDApOwotICB3aGlsZSAoZnJhZ3MpCi0gICAgewotICAgICAgc3dpdGNoIChmcmFncy0+ZnJfdHlwZSkKLQl7Ci0JY2FzZSByc19hbGlnbjoKLQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JY2FzZSByc19vcmc6Ci0jaWZkZWYgSEFORExFX0FMSUdOCi0JICBIQU5ETEVfQUxJR04gKGZyYWdzKTsKLSNlbmRpZgotCSAgZnJhZ3MtPmZyX3R5cGUgPSByc19maWxsOwotCSAgZnJhZ3MtPmZyX29mZnNldCA9Ci0JICAgICgoZnJhZ3MtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFncy0+ZnJfYWRkcmVzcyAtIGZyYWdzLT5mcl9maXgpCi0JICAgICAvIGZyYWdzLT5mcl92YXIpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgIG1kX2NvbnZlcnRfZnJhZyAoaCwgdGhpc19zZWdtZW50LCBmcmFncyk7Ci0JICBmcmFnX3dhbmUgKGZyYWdzKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICA7Ci0JfQotICAgICAgZnJhZ3MgPSBmcmFncy0+ZnJfbmV4dDsKLSAgICB9Ci19Ci0KLSNpZiAxCi0KLSNpZm5kZWYgVENfRk9SQ0VfUkVMT0NBVElPTgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgMAotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1maXh1cF9zZWdtZW50IChzZWdQLCB0aGlzX3NlZ21lbnRfdHlwZSkKLSAgICAgc2VnbWVudF9pbmZvX3R5cGUgKiBzZWdQOwotICAgICBzZWdUIHRoaXNfc2VnbWVudF90eXBlOwotewotICByZWdpc3RlciBmaXhTICogZml4UDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqYWRkX3N5bWJvbFA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN1Yl9zeW1ib2xQOwotICBsb25nIGFkZF9udW1iZXI7Ci0gIHJlZ2lzdGVyIGludCBzaXplOwotICByZWdpc3RlciBjaGFyICpwbGFjZTsKLSAgcmVnaXN0ZXIgbG9uZyB3aGVyZTsKLSAgcmVnaXN0ZXIgY2hhciBwY3JlbDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBzZWdUIGFkZF9zeW1ib2xfc2VnbWVudCA9IGFic29sdXRlX3NlY3Rpb247Ci0KLSAgZm9yIChmaXhQID0gc2VnUC0+Zml4X3Jvb3Q7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIGZyYWdQID0gZml4UC0+ZnhfZnJhZzsKLSAgICAgIGtub3cgKGZyYWdQKTsKLSAgICAgIHdoZXJlID0gZml4UC0+Znhfd2hlcmU7Ci0gICAgICBwbGFjZSA9IGZyYWdQLT5mcl9saXRlcmFsICsgd2hlcmU7Ci0gICAgICBzaXplID0gZml4UC0+Znhfc2l6ZTsKLSAgICAgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3k7Ci0gICAgICBzdWJfc3ltYm9sUCA9IGZpeFAtPmZ4X3N1YnN5OwotICAgICAgYWRkX251bWJlciA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgIHBjcmVsID0gZml4UC0+ZnhfcGNyZWw7Ci0KLSAgICAgIC8qIFdlIHdhbnQgZnVuY3Rpb24tcmVsYXRpdmUgc3RhYnMgdG8gd29yayBvbiBzeXN0ZW1zIHdoaWNoCi0JIG1heSB1c2UgYSByZWxheGluZyBsaW5rZXI7IHRodXMgd2UgbXVzdCBoYW5kbGUgdGhlIHN5bTEtc3ltMgotCSBmaXh1cHMgZnVuY3Rpb24tcmVsYXRpdmUgc3RhYnMgZ2VuZXJhdGVzLgotCi0JIE9mIGNvdXJzZSwgaWYgeW91IGFjdHVhbGx5IGVuYWJsZSByZWxheGluZyBpbiB0aGUgbGlua2VyLCB0aGUKLQkgbGluZSBhbmQgYmxvY2sgc2NvcGluZyBpbmZvcm1hdGlvbiBpcyBnb2luZyB0byBiZSBpbmNvcnJlY3QKLQkgaW4gc29tZSBjYXNlcy4gIFRoZSBvbmx5IHdheSB0byByZWFsbHkgZml4IHRoaXMgaXMgdG8gc3VwcG9ydAotCSBhIHJlbG9jIGludm9sdmluZyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scy4gICovCi0gICAgICBpZiAobGlua3JlbGF4Ci0JICAmJiAoIXN1Yl9zeW1ib2xQIHx8IHBjcmVsKSkKLQljb250aW51ZTsKLQotI2lmZGVmIFRDX0k5NjAKLSAgICAgIGlmIChmaXhQLT5meF90Y2JpdCAmJiBTRl9HRVRfQ0FMTE5BTUUgKGFkZF9zeW1ib2xQKSkKLQl7Ci0JICAvKiBSZWxvY2F0aW9uIHNob3VsZCBiZSBkb25lIHZpYSB0aGUgYXNzb2NpYXRlZCAnYmFsJyBlbnRyeQotCSAgICAgcG9pbnQgc3ltYm9sLiAqLwotCi0JICBpZiAoIVNGX0dFVF9CQUxOQU1FICh0Y19nZXRfYmFsX29mX2NhbGwgKGFkZF9zeW1ib2xQKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiTm8gJ2JhbCcgZW50cnkgcG9pbnQgZm9yIGxlYWZwcm9jICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoYWRkX3N5bWJvbFApKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUCA9IHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApOwotCX0KLSNlbmRpZgotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIHN5bWJvbHMgaGF2ZSBiZWVuIHJlc29sdmVkOyB0aGlzIG1heSBub3QgaGF2ZQotICAgICAgICAgaGFwcGVuZWQgaWYgdGhlc2UgYXJlIGV4cHJlc3Npb24gc3ltYm9scy4gICovCi0gICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCAmJiAhIGFkZF9zeW1ib2xQLT5zeV9yZXNvbHZlZCkKLQlyZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbFAsIDEpOwotCi0gICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB0aGlzIGZpeHVwIGlzIGFnYWluc3QgYSBzeW1ib2wgd2hpY2ggaGFzIGJlZW4gZXF1YXRlZAotCSAgICAgdG8gYW5vdGhlciBzeW1ib2wsIGNvbnZlcnQgaXQgdG8gdGhlIG90aGVyIHN5bWJvbC4gICovCi0JICBpZiAoYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAmJiAoISBTX0lTX0RFRklORUQgKGFkZF9zeW1ib2xQKQotCQkgIHx8IFNfSVNfQ09NTU9OIChhZGRfc3ltYm9sUCkpKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sCi0JCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChhZGRfc3ltYm9sUCkKLQkJCSB8fCBTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKSkKLQkJewotCQkgIHN5bWJvbFMgKm47Ci0KLQkJICAvKiBXZSBtdXN0IGF2b2lkIGxvb3BpbmcsIGFzIHRoYXQgY2FuIG9jY3VyIHdpdGggYQotCQkgICAgIGJhZGx5IHdyaXR0ZW4gcHJvZ3JhbS4gICovCi0JCSAgbiA9IGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2w7Ci0JCSAgaWYgKG4gPT0gYWRkX3N5bWJvbFApCi0JCSAgICBicmVhazsKLQkJICBhZGRfbnVtYmVyICs9IGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0JCSAgYWRkX3N5bWJvbFAgPSBuOwotCQl9Ci0JICAgICAgZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUDsKLQkgICAgICBmaXhQLT5meF9vZmZzZXQgPSBhZGRfbnVtYmVyOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoc3ViX3N5bWJvbFAgIT0gTlVMTCAmJiAhIHN1Yl9zeW1ib2xQLT5zeV9yZXNvbHZlZCkKLQlyZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ViX3N5bWJvbFAsIDEpOwotCi0gICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTAotCSAgJiYgYWRkX3N5bWJvbFAtPnN5X21yaV9jb21tb24pCi0JewotCSAga25vdyAoYWRkX3N5bWJvbFAtPnN5X3ZhbHVlLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCSAgZml4UC0+Znhfb2Zmc2V0ID0gYWRkX251bWJlcjsKLQkgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kgPSBhZGRfc3ltYm9sUC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sOwotCX0KLQotICAgICAgaWYgKGFkZF9zeW1ib2xQKQotCXsKLQkgIGFkZF9zeW1ib2xfc2VnbWVudCA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2xQKTsKLQl9CQkJLyogaWYgdGhlcmUgaXMgYW4gYWRkZW5kICovCi0KLSAgICAgIGlmIChzdWJfc3ltYm9sUCkKLQl7Ci0JICBpZiAoYWRkX3N5bWJvbFAgPT0gTlVMTCB8fCBhZGRfc3ltYm9sX3NlZ21lbnQgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGlmIChhZGRfc3ltYm9sUCAhPSBOVUxMKQotCQl7Ci0JCSAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCQkgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCX0KLQotCSAgICAgIC8qIEl0J3MganVzdCAtc3ltLiAgKi8KLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pCi0JCXsKLQkJICBhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSAwOwotCQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0jaWZuZGVmIFRDX002OEsKLQkJICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkJXygiTmVnYXRpdmUgb2Ygbm9uLWFic29sdXRlIHN5bWJvbCAlcyIpLAotCQkJCVNfR0VUX05BTUUgKHN1Yl9zeW1ib2xQKSk7Ci0jZW5kaWYKLQkJICBhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0JCX0JCS8qIG5vdCBhYnNvbHV0ZSAqLwotCi0JICAgICAgLyogaWYgc3ViX3N5bWJvbCBpcyBpbiB0aGUgc2FtZSBzZWdtZW50IHRoYXQgYWRkX3N5bWJvbAotCQkgYW5kIGFkZF9zeW1ib2wgaXMgZWl0aGVyIGluIERBVEEsIFRFWFQsIEJTUyBvciBBQlNPTFVURSAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWRkX3N5bWJvbF9zZWdtZW50Ci0JCSAgICYmIFNFR19OT1JNQUwgKGFkZF9zeW1ib2xfc2VnbWVudCkpCi0JICAgIHsKLQkgICAgICAvKiBEaWZmZXJlbmNlIG9mIDIgc3ltYm9scyBmcm9tIHNhbWUgc2VnbWVudC4gIENhbid0Ci0JCSBtYWtlIGRpZmZlcmVuY2Ugb2YgMiB1bmRlZmluZWRzOiAndmFsdWUnIG1lYW5zCi0JCSBzb21ldGhpbmcgZGlmZmVyZW50IGZvciBOX1VOREYuICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIE1ha2VzIG5vIHNlbnNlIHRvIHVzZSB0aGUgZGlmZmVyZW5jZSBvZiAyIGFyYml0cmFyeSBzeW1ib2xzCi0JICAgICAgICAgYXMgdGhlIHRhcmdldCBvZiBhIGNhbGwgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChmaXhQLT5meF90Y2JpdCkKLQkJewotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIDIgc3ltYm9scyIpKTsKLQkJfQotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCkgLQotCQlTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCSAgICAgIGFkZF9zeW1ib2xQID0gTlVMTDsKLQotCSAgICAgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCXsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOwotCQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotI2lmZGVmIFRDX002OEsgLyogaXMgdGhpcyByaWdodD8gKi8KLQkJICBwY3JlbCA9IDA7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAwOwotI2VuZGlmCi0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW50IHNlZ21lbnRzIGluIHN1YnRyYWN0aW9uLiAqLwotCSAgICAgIGtub3cgKCEoU19JU19FWFRFUk5BTCAoc3ViX3N5bWJvbFApICYmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpKTsKLQotCSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKQotCQl7Ci0JCSAgYWRkX251bWJlciAtPSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCQl9Ci0jaWZkZWYgRElGRl9FWFBSX09LCi0JICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IHRoaXNfc2VnbWVudF90eXBlCi0jaWYgMCAvKiBPa2F5IGZvciA2OGssIGF0IGxlYXN0Li4uICovCi0JCSAgICAgICAmJiAhcGNyZWwKLSNlbmRpZgotCQkgICAgICAgKQotCQl7Ci0JCSAgLyogTWFrZSBpdCBwYy1yZWxhdGl2ZS4gICovCi0JCSAgYWRkX251bWJlciArPSAobWRfcGNyZWxfZnJvbSAoZml4UCkKLQkJCQkgLSBTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApKTsKLQkJICBwY3JlbCA9IDE7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAxOwotCQkgIHN1Yl9zeW1ib2xQID0gMDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCX0KLSNlbmRpZgotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJDYW4ndCBlbWl0IHJlbG9jIHstICVzLXNlZyBzeW1ib2wgXCIlc1wifSBAIGZpbGUgYWRkcmVzcyAlbGQuIiksCi0JCQkJc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkpLAotCQkJCVNfR0VUX05BTUUgKHN1Yl9zeW1ib2xQKSwKLQkJCQkobG9uZykgKGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmUpKTsKLQkJfQkJLyogaWYgYWJzb2x1dGUgKi8KLQkgICAgfQotCX0JCQkvKiBpZiBzdWJfc3ltYm9sUCAqLwotCi0gICAgICBpZiAoYWRkX3N5bWJvbFApCi0JewotCSAgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSB0aGlzX3NlZ21lbnRfdHlwZSAmJiBwY3JlbCkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogVGhpcyBmaXh1cCB3YXMgbWFkZSB3aGVuIHRoZSBzeW1ib2wncyBzZWdtZW50IHdhcwotCSAgICAgICAqIFNFR19VTktOT1dOLCBidXQgaXQgaXMgbm93IGluIHRoZSBsb2NhbCBzZWdtZW50LgotCSAgICAgICAqIFNvIHdlIGtub3cgaG93IHRvIGRvIHRoZSBhZGRyZXNzIHdpdGhvdXQgcmVsb2NhdGlvbi4KLQkgICAgICAgKi8KLSNpZmRlZiBUQ19JOTYwCi0JICAgICAgLyogcmVsb2NfY2FsbGooKSBtYXkgcmVwbGFjZSBhICdjYWxsJyB3aXRoIGEgJ2NhbGxzJyBvciBhICdiYWwnLAotCSAgICAgICAqIGluIHdoaWNoIGNhc2VzIGl0IG1vZGlmaWVzICpmaXhQIGFzIGFwcHJvcHJpYXRlLiAgSW4gdGhlIGNhc2UKLQkgICAgICAgKiBvZiBhICdjYWxscycsIG5vIGZ1cnRoZXIgd29yayBpcyByZXF1aXJlZCwgYW5kICpmaXhQIGhhcyBiZWVuCi0JICAgICAgICogc2V0IHVwIHRvIG1ha2UgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgYmVsb3cgYSBuby1vcC4KLQkgICAgICAgKi8KLQkgICAgICByZWxvY19jYWxsaiAoZml4UCk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCi0JICAgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotCSAgICAgIGFkZF9udW1iZXIgLT0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0KLQkgICAgICAvKiBXZSB1c2VkIHRvIGRvCi0JCSAgIGFkZF9udW1iZXIgLT0gc2VnUC0+c2NuaGRyLnNfdmFkZHI7Ci0JCSBpZiBkZWZpbmVkIChUQ19JMzg2KSB8fCBkZWZpbmVkIChURV9MWU5YKS4gIEkgbm93Ci0JCSB0aGluayB0aGF0IHdhcyBhbiBlcnJvciBwcm9wYWdhdGVkIGZyb20gdGhlIGNhc2Ugd2hlbgotCQkgd2UgYXJlIGdvaW5nIHRvIGVtaXQgdGhlIHJlbG9jYXRpb24uICBJZiB3ZSBhcmUgbm90Ci0JCSBnb2luZyB0byBlbWl0IHRoZSByZWxvY2F0aW9uLCB0aGVuIHdlIGp1c3Qgd2FudCB0bwotCQkgc2V0IGFkZF9udW1iZXIgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3ltYm9scy4KLQkJIFRoaXMgaXMgYSBjYXNlIHRoYXQgd291bGQgb25seSBhcmlzZSB3aGVuIHRoZXJlIGlzIGEKLQkJIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSBmcm9tIGEgc2VjdGlvbiBvdGhlciB0aGFuIC50ZXh0Ci0JCSB0byBhIHN5bWJvbCBkZWZpbmVkIGluIHRoZSBzYW1lIHNlY3Rpb24sIGFuZCB0aGUKLQkJIHJlZmVyZW5jZSBpcyBub3QgcmVsYXhlZC4gIFNpbmNlIGp1bXAgaW5zdHJ1Y3Rpb25zIG9uCi0JCSB0aGUgaTM4NiBhcmUgcmVsYXhlZCwgdGhpcyBjb3VsZCBvbmx5IGFyaXNlIHdpdGggYQotCQkgY2FsbCBpbnN0cnVjdGlvbi4gICovCi0KLQkgICAgICBwY3JlbCA9IDA7CS8qIExpZS4gRG9uJ3Qgd2FudCBmdXJ0aGVyIHBjcmVsIHByb2Nlc3NpbmcuICovCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJewotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9kb25lID0gMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKGFkZF9zeW1ib2xfc2VnbWVudCkKLQkJewotCQljYXNlIGFic29sdXRlX3NlY3Rpb246Ci0jaWZkZWYgVENfSTk2MAotCQkgIHJlbG9jX2NhbGxqIChmaXhQKTsJLyogU2VlIGNvbW1lbnQgYWJvdXQgcmVsb2NfY2FsbGooKSBhYm92ZSovCi0jZW5kaWYgLyogVENfSTk2MCAqLwotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkJICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0KLQkJICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeFApKQotCQkgICAgewotCQkgICAgICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCi0KLSNpZiBkZWZpbmVkKFRDX0EyOUspIHx8IChkZWZpbmVkKFRFX1BFKSAmJiBkZWZpbmVkKFRDX0kzODYpKSB8fCBkZWZpbmVkKFRDX004OEspCi0JCSAgLyogVGhpcyByZWFsbHkgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdGhlIGxpbmtlciwgYnV0Ci0JCSAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3JiaWRzLiAgKi8KLQkJICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCk7Ci0jZWxzZQotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKSArCi0JCSAgICBzZWdtZW50X2luZm9bU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApXS5zY25oZHIuc19wYWRkcjsKLSNlbmRpZgotCQkgIGJyZWFrOwotCi0JCWNhc2UgU0VHX1VOS05PV046Ci0jaWZkZWYgVENfSTk2MAotCQkgIGlmICgoaW50KSBmaXhQLT5meF9iaXRfZml4UCA9PSAxMykKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIENPQlIgaW5zdHJ1Y3Rpb24uICBUaGV5IGhhdmUgb25seSBhCi0JCSAgICAgICAqIDEzLWJpdCBkaXNwbGFjZW1lbnQgYW5kIGFyZSBvbmx5IHRvIGJlIHVzZWQKLQkJICAgICAgICogZm9yIGxvY2FsIGJyYW5jaGVzOiBmbGFnIGFzIGVycm9yLCBkb24ndCBnZW5lcmF0ZQotCQkgICAgICAgKiByZWxvY2F0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCSAgICBfKCJjYW4ndCB1c2UgQ09CUiBmb3JtYXQgd2l0aCBleHRlcm5hbCBsYWJlbCIpKTsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQkgICAgICBmaXhQLT5meF9kb25lID0gMTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9CQkvKiBDT0JSICovCi0jZW5kaWYgLyogVENfSTk2MCAqLwotI2lmICgoZGVmaW5lZCAoVENfSTM4NikgfHwgZGVmaW5lZCAoVEVfTFlOWCkgfHwgZGVmaW5lZCAoVEVfQVVYKSkgJiYgIWRlZmluZWQoVEVfUEUpKSB8fCBkZWZpbmVkIChDT0ZGX0NPTU1PTl9BRERFTkQpCi0JCSAgLyogMzg2IENPRkYgdXNlcyBhIHBlY3VsaWFyIGZvcm1hdCBpbiB3aGljaCB0aGUKLQkJICAgICB2YWx1ZSBvZiBhIGNvbW1vbiBzeW1ib2wgaXMgc3RvcmVkIGluIHRoZSAudGV4dAotCQkgICAgIHNlZ21lbnQgKEkndmUgY2hlY2tlZCB0aGlzIG9uIFNWUjMuMiBhbmQgU0NPCi0JCSAgICAgMy4yLjIpIElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gICovCi0JCSAgLyogVGhpcyBpcyBhbHNvIHRydWUgZm9yIDY4ayBDT0ZGIG9uIHN5c3YgbWFjaGluZXMKLQkJICAgICAoQ2hlY2tlZCBvbiBNb3Rvcm9sYSBzeXN2NjggUjNWNiBhbmQgUjNWNy4xLCBhbmQgYWxzbyBvbgotCQkgICAgIFVOSVggU3lzdGVtIFYvTTY4MDAwLCBSZWxlYXNlIDEuMCBmcm9tIEFUVC9CZWxsIExhYnMpCi0JCSAgICAgUGhpbGlwcGUgRGUgTXV5dGVyIDxwaGRtQGluZm8udWNsLmFjLmJlPi4gKi8KLQkJICBpZiAoU19JU19DT01NT04gKGFkZF9zeW1ib2xQKSkKLQkJICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLSNlbmRpZgotCQkgIGJyZWFrOwotCi0KLQkJfQkJLyogc3dpdGNoIG9uIHN5bWJvbCBzZWcgKi8KLQkgICAgfQkJCS8qIGlmIG5vdCBpbiBsb2NhbCBzZWcgKi8KLQl9CQkJLyogaWYgdGhlcmUgd2FzIGEgKyBzeW1ib2wgKi8KLQotICAgICAgaWYgKHBjcmVsKQotCXsKLSNpZiAhZGVmaW5lZChUQ19NODhLKSAmJiAhKGRlZmluZWQoVEVfUEUpICYmIGRlZmluZWQoVENfSTM4NikpICYmICFkZWZpbmVkKFRDX0EyOUspCi0JICAvKiBUaGlzIGFkanVzdG1lbnQgaXMgbm90IGNvcnJlY3Qgb24gdGhlIG04OGssIGZvciB3aGljaCB0aGUKLQkgICAgIGxpbmtlciBkb2VzIGFsbCB0aGUgY29tcHV0YXRpb24uICAqLwotCSAgYWRkX251bWJlciAtPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLSNlbmRpZgotCSAgaWYgKGFkZF9zeW1ib2xQID09IDApCi0JICAgIHsKLQkgICAgICBmaXhQLT5meF9hZGRzeSA9ICZhYnNfc3ltYm9sOwotCSAgICB9CQkJLyogaWYgdGhlcmUncyBhbiBhZGRfc3ltYm9sICovCi0jaWYgZGVmaW5lZCAoVENfSTM4NikgfHwgZGVmaW5lZCAoVEVfTFlOWCkgfHwgZGVmaW5lZCAoVENfSTk2MCkgfHwgZGVmaW5lZCAoVENfTTY4SykKLQkgIC8qIE9uIHRoZSAzODYgd2UgbXVzdCBhZGp1c3QgYnkgdGhlIHNlZ21lbnQgdmFkZHIgYXMgd2VsbC4KLQkgICAgIElhbiBUYXlsb3IuCi0KLQkgICAgIEkgY2hhbmdlZCB0aGUgaTk2MCB0byB3b3JrIHRoaXMgd2F5IGFzIHdlbGwuICBUaGlzIGlzCi0JICAgICBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgR05VIGxpbmtlciBiZWhhdmlvdXIuICBJIGRvCi0JICAgICBub3Qga25vdyB3aGF0IG90aGVyIGk5NjAgQ09GRiBhc3NlbWJsZXJzIGRvLiAgVGhpcyBpcyBub3QKLQkgICAgIGEgY29tbW9uIGNhc2U6IG5vcm1hbGx5LCBvbmx5IGFzc2VtYmxlciBjb2RlIHdpbGwgY29udGFpbgotCSAgICAgYSBQQyByZWxhdGl2ZSByZWxvYywgYW5kIG9ubHkgYnJhbmNoZXMgd2hpY2ggZG8gbm90Ci0JICAgICBvcmlnaW5hdGUgaW4gdGhlIC50ZXh0IHNlY3Rpb24gd2lsbCBoYXZlIGEgbm9uLXplcm8KLQkgICAgIGFkZHJlc3MuCi0KLQkgICAgIEkgY2hhbmdlZCB0aGUgbTY4ayB0byB3b3JrIHRoaXMgd2F5IGFzIHdlbGwuICBUaGlzIHdpbGwKLQkgICAgIGJyZWFrIGV4aXN0aW5nIFBDIHJlbGF0aXZlIHJlbG9jcyBmcm9tIHNlY3Rpb25zIHdoaWNoIGRvCi0JICAgICBub3Qgc3RhcnQgYXQgYWRkcmVzcyAwLCBidXQgaXQgd2lsbCBtYWtlIGxkIC1yIHdvcmsuCi0JICAgICBJYW4gVGF5bG9yLCA0IE9jdCA5Ni4gICovCi0KLQkgIGFkZF9udW1iZXIgLT0gc2VnUC0+c2NuaGRyLnNfdmFkZHI7Ci0jZW5kaWYKLQl9CQkJLyogaWYgcGNyZWwgKi8KLQotI2lmZGVmIE1EX0FQUExZX0ZJWDMKLSAgICAgIG1kX2FwcGx5X2ZpeDMgKGZpeFAsICh2YWx1ZVQgKikgJmFkZF9udW1iZXIsIHRoaXNfc2VnbWVudF90eXBlKTsKLSNlbHNlCi0gICAgICBtZF9hcHBseV9maXggKGZpeFAsIGFkZF9udW1iZXIpOwotI2VuZGlmCi0KLSAgICAgIGlmICghZml4UC0+ZnhfYml0X2ZpeFAgJiYgISBmaXhQLT5meF9ub19vdmVyZmxvdykKLQl7Ci0jaWZuZGVmIFRDX004OEsKLQkgIC8qIFRoZSBtODhrIHVzZXMgdGhlIG9mZnNldCBmaWVsZCBvZiB0aGUgcmVsb2MgdG8gZ2V0IGFyb3VuZAotCSAgICAgdGhpcyBwcm9ibGVtLiAgKi8KLQkgIGlmICgoc2l6ZSA9PSAxCi0JICAgICAgICYmICgoYWRkX251bWJlciAmIH4weEZGKQotCQkgICB8fCAoZml4UC0+Znhfc2lnbmVkICYmIChhZGRfbnVtYmVyICYgMHg4MCkpKQotCSAgICAgICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRikgIT0gKC0xICYgfjB4RkYpCi0JCSAgIHx8IChhZGRfbnVtYmVyICYgMHg4MCkgPT0gMCkpCi0JICAgICAgfHwgKHNpemUgPT0gMgotCQkgICYmICgoYWRkX251bWJlciAmIH4weEZGRkYpCi0JCSAgICAgIHx8IChmaXhQLT5meF9zaWduZWQgJiYgKGFkZF9udW1iZXIgJiAweDgwMDApKSkKLQkJICAmJiAoKGFkZF9udW1iZXIgJiB+MHhGRkZGKSAhPSAoLTEgJiB+MHhGRkZGKQotCQkgICAgICB8fCAoYWRkX251bWJlciAmIDB4ODAwMCkgPT0gMCkpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICAgIF8oIlZhbHVlIG9mICVsZCB0b28gbGFyZ2UgZm9yIGZpZWxkIG9mICVkIGJ5dGVzIGF0IDB4JWx4IiksCi0JCQkgICAgKGxvbmcpIGFkZF9udW1iZXIsIHNpemUsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7Ci0JICAgIH0KLSNlbmRpZgotI2lmZGVmIFdBUk5fU0lHTkVEX09WRVJGTE9XX1dPUkQKLQkgIC8qIFdhcm4gaWYgYSAud29yZCB2YWx1ZSBpcyB0b28gbGFyZ2Ugd2hlbiB0cmVhdGVkIGFzIGEKLQkgICAgIHNpZ25lZCBudW1iZXIuICBXZSBhbHJlYWR5IGtub3cgaXQgaXMgbm90IHRvbyBuZWdhdGl2ZS4KLQkgICAgIFRoaXMgaXMgdG8gY2F0Y2ggb3Zlci1sYXJnZSBzd2l0Y2hlcyBnZW5lcmF0ZWQgYnkgZ2NjIG9uCi0JICAgICB0aGUgNjhrLiAgKi8KLQkgIGlmICghZmxhZ19zaWduZWRfb3ZlcmZsb3dfb2sKLQkgICAgICAmJiBzaXplID09IDIKLQkgICAgICAmJiBhZGRfbnVtYmVyID4gMHg3ZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIlNpZ25lZCAud29yZCBvdmVyZmxvdzsgc3dpdGNoIG1heSBiZSB0b28gbGFyZ2U7ICVsZCBhdCAweCVseCIpLAotCQkJICAobG9uZykgYWRkX251bWJlciwKLQkJCSAgKHVuc2lnbmVkIGxvbmcpIChmcmFnUC0+ZnJfYWRkcmVzcyArIHdoZXJlKSk7Ci0jZW5kaWYKLQl9CQkJLyogbm90IGEgYml0IGZpeCAqLwotICAgIH0JCQkJLyogRm9yIGVhY2ggZml4UyBpbiB0aGlzIHNlZ21lbnQuICovCi19CQkJCS8qIGZpeHVwX3NlZ21lbnQoKSAqLwotCi0jZW5kaWYKLQotLyogVGhlIGZpcnN0IGVudHJ5IGluIGEgLnN0YWIgc2VjdGlvbiBpcyBzcGVjaWFsLiAgKi8KLQotdm9pZAotb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnN0YWJzdHJfbmFtZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBNYWtlIHNwYWNlIGZvciB0aGlzIGZpcnN0IHN5bWJvbC4gKi8KLSAgcCA9IGZyYWdfbW9yZSAoMTIpOwotICAvKiBaZXJvIGl0IG91dC4gKi8KLSAgbWVtc2V0IChwLCAwLCAxMik7Ci0gIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKLSAgc3RhYnN0cl9uYW1lID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKHNlZ21lbnRfaW5mb1tzZWddLm5hbWUpICsgNCk7Ci0gIHN0cmNweSAoc3RhYnN0cl9uYW1lLCBzZWdtZW50X2luZm9bc2VnXS5uYW1lKTsKLSAgc3RyY2F0IChzdGFic3RyX25hbWUsICJzdHIiKTsKLSAgc3Ryb2ZmID0gZ2V0X3N0YWJfc3RyaW5nX29mZnNldCAoZmlsZSwgc3RhYnN0cl9uYW1lKTsKLSAga25vdyAoc3Ryb2ZmID09IDEpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHN0cm9mZiwgNCk7Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYiBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zdGFiX3NlY3Rpb24oYWJmZCwgc2VnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VnOwotewotICBzZWdUIHN0YWJzdHJzZWcgPSBTRUdfVU5LTk9XTjsKLSAgY29uc3QgY2hhciAqc2VjbmFtZSwgKm5hbWUyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpwID0gTlVMTDsKLSAgaW50IGksIHN0cnN6ID0gMCwgbnN5bXM7Ci0gIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW3NlZ10uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQotICAvKiBMb29rIGZvciB0aGUgYXNzb2NpYXRlZCBzdHJpbmcgdGFibGUgc2VjdGlvbi4gKi8KLQotICBzZWNuYW1lID0gc2VnbWVudF9pbmZvW3NlZ10ubmFtZTsKLSAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWNuYW1lKSArIDQpOwotICBzdHJjcHkgKG5hbWUsIHNlY25hbWUpOwotICBzdHJjYXQgKG5hbWUsICJzdHIiKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIHsKLSAgICAgIG5hbWUyID0gc2VnbWVudF9pbmZvW2ldLm5hbWU7Ci0gICAgICBpZiAobmFtZTIgIT0gTlVMTCAmJiBzdHJuY21wKG5hbWUyLCBuYW1lLCA4KSA9PSAwKQotCXsKLQkgIHN0YWJzdHJzZWcgPSBpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBJZiB3ZSBmb3VuZCB0aGUgc2VjdGlvbiwgZ2V0IGl0cyBzaXplLiAqLwotICBpZiAoc3RhYnN0cnNlZyAhPSBTRUdfVU5LTk9XTikKLSAgICBzdHJzeiA9IHNpemVfc2VjdGlvbiAoYWJmZCwgc3RhYnN0cnNlZyk7Ci0KLSAgbnN5bXMgPSBzaXplX3NlY3Rpb24gKGFiZmQsIHNlZykgLyAxMiAtIDE7Ci0KLSAgLyogTG9vayBmb3IgdGhlIGZpcnN0IGZyYWcgb2Ygc3VmZmljaWVudCBzaXplIGZvciB0aGUgaW5pdGlhbCBzdGFiCi0gICAgIHN5bWJvbCwgYW5kIGNvbGxlY3QgYSBwb2ludGVyIHRvIGl0LiAqLwotICB3aGlsZSAoZnJhZyAmJiBmcmFnLT5mcl9maXggPCAxMikKLSAgICBmcmFnID0gZnJhZy0+ZnJfbmV4dDsKLSAgYXNzZXJ0IChmcmFnICE9IDApOwotICBwID0gZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgYXNzZXJ0IChwICE9IDApOwotCi0gIC8qIFdyaXRlIGluIHRoZSBudW1iZXIgb2Ygc3RhYiBzeW1ib2xzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCi0gICAgIHRhYmxlLiAqLwotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBuc3ltcywgKGJmZF9ieXRlICopIHAgKyA2KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3Ryc3osIChiZmRfYnl0ZSAqKSBwICsgOCk7Ci19Ci0KLSNlbmRpZiAvKiBub3QgQkZEX0FTU0VNQkxFUiAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkZWYiLCBvYmpfY29mZl9kZWYsIDB9LAotICB7ImRpbSIsIG9ial9jb2ZmX2RpbSwgMH0sCi0gIHsiZW5kZWYiLCBvYmpfY29mZl9lbmRlZiwgMH0sCi0gIHsibGluZSIsIG9ial9jb2ZmX2xpbmUsIDB9LAotICB7ImxuIiwgb2JqX2NvZmZfbG4sIDB9LAotICB7ImFwcGxpbmUiLCBvYmpfY29mZl9sbiwgMX0sCi0gIHsic2NsIiwgb2JqX2NvZmZfc2NsLCAwfSwKLSAgeyJzaXplIiwgb2JqX2NvZmZfc2l6ZSwgMH0sCi0gIHsidGFnIiwgb2JqX2NvZmZfdGFnLCAwfSwKLSAgeyJ0eXBlIiwgb2JqX2NvZmZfdHlwZSwgMH0sCi0gIHsidmFsIiwgb2JqX2NvZmZfdmFsLCAwfSwKLSAgeyJzZWN0aW9uIiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICAvKiBGSVhNRTogV2UgaWdub3JlIHRoZSBNUkkgc2hvcnQgYXR0cmlidXRlLiAgKi8KLSAgeyJzZWN0aW9uLnMiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0LnMiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgLyogV2UgYWNjZXB0IHRoZSAuYnNzIGRpcmVjdGl2ZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoCi0gICAgIGVhcmxpZXIgdmVyc2lvbnMgb2YgZ2FzLiAgKi8KLSAgeyJic3MiLCBvYmpfY29mZl9ic3MsIDB9LAotICB7IndlYWsiLCBvYmpfY29mZl93ZWFrLCAwfSwKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICB7InVzZSIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InRleHQiLCBvYmpfY29mZl90ZXh0LCAwfSwKLSAgeyJkYXRhIiwgb2JqX2NvZmZfZGF0YSwgMH0sCi0gIHsibGNvbW0iLCBvYmpfY29mZl9sY29tbSwgMH0sCi0gIHsiaWRlbnQiLCBvYmpfY29mZl9pZGVudCwgMH0sCi0jZWxzZQotICB7Im9wdGltIiwgc19pZ25vcmUsIDB9LAkvKiBGb3Igc3VuMzg2aSBjYyAoPykgKi8KLSAgeyJpZGVudCIsIHNfaWdub3JlLCAwfSwJLyogd2UgZG9uJ3QgeWV0IGhhbmRsZSB0aGlzLiAqLwotI2VuZGlmCi0gIHsidmVyc2lvbiIsIHNfaWdub3JlLCAwfSwKLSAgeyJBQk9SVCIsIHNfYWJvcnQsIDB9LAotI2lmZGVmIFRDX004OEsKLSAgLyogVGhlIG04OGsgdXNlcyBzZGVmIGluc3RlYWQgb2YgZGVmLiAgKi8KLSAgeyJzZGVmIiwgb2JqX2NvZmZfZGVmLCAwfSwKLSNlbmRpZgotICB7TlVMTH0JCQkvKiBlbmQgc2VudGluZWwgKi8KLX07CQkJCS8qIG9ial9wc2V1ZG9fdGFibGUgKi8KLQwKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIFN1cHBvcnQgZm9yIGEgQ09GRiBlbXVsYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotY29mZl9wb3BfaW5zZXJ0ICgpCi17Ci0gIHBvcF9pbnNlcnQgKG9ial9wc2V1ZG9fdGFibGUpOwotfQotCi1zdGF0aWMgaW50Ci1jb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotbm9fZnVuYyAoKQotewotICBhYm9ydCAoKTsKLX0KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgY29mZl9mb3JtYXRfb3BzID0KLXsKLSAgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIsCi0gIDAsCi0gIDEsCi0gIGNvZmZfZnJvYl9zeW1ib2wsCi0gIG5vX2Z1bmMsCi0gIGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcywKLSAgMCwgMCwKLSAgMCwgMCwKLSAgMCwKLSNpZiAwCi0gIG9ial9nZW5lcmF0ZV9hc21fbGluZW5vLAotI2Vsc2UKLSAgbm9fZnVuYywKLSNlbmRpZgotI2lmIDAKLSAgb2JqX3N0YWIsCi0jZWxzZQotICBub19mdW5jLAotI2VuZGlmCi0gIGNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGNvZmZfcG9wX2luc2VydCwKLSNpZiAwCi0gIG9ial9zZXRfZXh0LAotI2Vsc2UKLSAgbm9fZnVuYywKLSNlbmRpZgotICBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2ssCi0gIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vaywKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotY29mZi5oIGIvZ2FzL2NvbmZpZy9vYmotY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODc5OWEzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWNvZmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDg0NCArMCwwIEBACi0vKiBjb2ZmIG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgT0JKX0ZPUk1BVF9ICi0jZGVmaW5lIE9CSl9GT1JNQVRfSAotCi0jZGVmaW5lIE9CSl9DT0ZGIDEKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotI2RlZmluZSBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0jZGVmaW5lIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZGVmaW5lIEJGRF9IRUFERVJTCi0jZGVmaW5lIEJGRAotCi0jZW5kaWYKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotLyogVGhpcyBpbnRlcm5hbF9saW5lbm8gY3JhcCBpcyB0byBzdG9wIG5hbWVzcGFjZSBwb2xsdXRpb24gZnJvbSB0aGUKLSAgIGJmZCBpbnRlcm5hbCBjb2ZmIGhlYWRlcmZpbGUuICovCi0jZGVmaW5lIGludGVybmFsX2xpbmVubyBiZmRfaW50ZXJuYWxfbGluZW5vCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI3VuZGVmIGludGVybmFsX2xpbmVubwotCi0vKiBDUFUtc3BlY2lmaWMgc2V0dXA6ICAqLwotCi0jaWZkZWYgVENfQVJNCi0jaW5jbHVkZSAiY29mZi9hcm0uaCIKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWFybSIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19QUEMKLSNpZmRlZiBURV9QRQotI2luY2x1ZGUgImNvZmYvcG93ZXJwYy5oIgotI2Vsc2UKLSNpbmNsdWRlICJjb2ZmL3JzNjAwMC5oIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFRDX1NQQVJDCi0jaW5jbHVkZSAiY29mZi9zcGFyYy5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19JMzg2Ci0jaW5jbHVkZSAiY29mZi9pMzg2LmgiCi0KLSNpZmRlZiBURV9QRQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJwZS1pMzg2IgotI2VuZGlmCi0KLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWkzODYiCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVENfTTY4SwotI2luY2x1ZGUgImNvZmYvbTY4ay5oIgotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTY4ayIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBUQ19BMjlLCi0jaW5jbHVkZSAiY29mZi9hMjlrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtYTI5ay1iaWciCi0jZW5kaWYKLQotI2lmZGVmIFRDX0k5NjAKLSNpbmNsdWRlICJjb2ZmL2k5NjAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1JbnRlbC1saXR0bGUiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1o4SwotI2luY2x1ZGUgImNvZmYvejhrLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtejhrIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19IODMwMAotI2luY2x1ZGUgImNvZmYvaDgzMDAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi1oODMwMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfSDg1MDAKLSNpbmNsdWRlICJjb2ZmL2g4NTAwLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtaDg1MDAiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1NICi0jaW5jbHVkZSAiY29mZi9zaC5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkJCQlcCi0gIChzaGwJCQkJCQkJXAotICAgPyAoc2hfc21hbGwgPyAiY29mZi1zaGwtc21hbGwiIDogImNvZmYtc2hsIikJCVwKLSAgIDogKHNoX3NtYWxsID8gImNvZmYtc2gtc21hbGwiIDogImNvZmYtc2giKSkKLSNlbmRpZgotCi0jaWZkZWYgVENfTTg4SwotI2luY2x1ZGUgImNvZmYvbTg4ay5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLW04OGtiY3MiCi0jZW5kaWYKLQotI2lmZGVmIFRDX1c2NQotI2luY2x1ZGUgImNvZmYvdzY1LmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtdzY1IgotI2VuZGlmCi0KLSNpZmRlZiBUQ19USUMzMAotI2luY2x1ZGUgImNvZmYvdGljMzAuaCIKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiY29mZi10aWMzMCIKLSNlbmRpZgotCi0jaWZkZWYgVENfVElDODAKLSNpbmNsdWRlICJjb2ZmL3RpYzgwLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtdGljODAiCi0jZGVmaW5lIEFMSUdOTUVOVF9JTl9TX0ZMQUdTIDEKLSNlbmRpZgotCi0jaWZkZWYgVENfTUNPUkUKLSNpbmNsdWRlICJjb2ZmL21jb3JlLmgiCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAicGUtbWNvcmUiCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBUYXJnZXRzIG1heSBhbHNvIHNldCB0aGlzLiAgQWxzbywgaWYgQkZEX0FTU0VNQkxFUiBpcyBkZWZpbmVkLCB0aGlzCi0gICB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuIGRlZmluZWQuICAqLwotI3VuZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAxCi0KLSNpZm5kZWYgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMKLSNkZWZpbmUgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgMQotI2VuZGlmIC8qIE9CSl9DT0ZGX01BWF9BVVhFTlRSSUVTICovCi0KLWV4dGVybiB2b2lkIGNvZmZfb2JqX3N5bWJvbF9uZXdfaG9vayBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayBjb2ZmX29ial9zeW1ib2xfbmV3X2hvb2sKLQotZXh0ZXJuIHZvaWQgY29mZl9vYmpfcmVhZF9iZWdpbl9ob29rIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgb2JqX3JlYWRfYmVnaW5faG9vayBjb2ZmX29ial9yZWFkX2JlZ2luX2hvb2sKLQotLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICAgVGhpcyBmaWxlIHJlYWxseSBjb250YWlucyB0d28gaW1wbGVtZW50YXRpb25zIG9mIHRoZSBDT0ZGIGJhY2sgZW5kLgotICAgVGhleSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWVyZ2VkLCBidXQgdGhpcyBpcyBvbmx5IGEKLSAgIHByZWxpbWluYXJ5LCBtZWNoYW5pY2FsIG1lcmdpbmcuICBNYW55IGRlZmluaXRpb25zIHRoYXQgYXJlCi0gICBpZGVudGljYWwgYmV0d2VlbiB0aGUgdHdvIGFyZSBzdGlsbCBmb3VuZCBpbiBib3RoIHZlcnNpb25zLgotCi0gICBUaGUgZmlyc3QgdmVyc2lvbiwgd2l0aCBCRkRfQVNTRU1CTEVSIGRlZmluZWQsIHVzZXMgaGlnaC1sZXZlbCBCRkQKLSAgIGludGVyZmFjZXMgYW5kIGRhdGEgc3RydWN0dXJlcy4gIFRoZSBzZWNvbmQgdmVyc2lvbiwgd2l0aAotICAgQkZEX0FTU0VNQkxFUiBub3QgZGVmaW5lZCwgYWxzbyB1c2VzIEJGRCwgYnV0IG1vc3RseSBmb3Igc3dhcHBpbmcKLSAgIGRhdGEgc3RydWN0dXJlcyBhbmQgZm9yIGRvaW5nIHRoZSBhY3R1YWwgSS9PLiAgVGhlIGxhdHRlciBkZWZpbmVzCi0gICB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbHMgQkZEIGFuZCBCRkRfSEVBREVSUy4gIFRyeSBub3QgdG8gbGV0IHRoaXMKLSAgIGNvbmZ1c2UgeW91LgotCi0gICBUaGVzZSB0d28gYXJlIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1lcmdlZCwgYW5kIGV2ZW50dWFsbHkgdGhlCi0gICBCRkRfQVNTRU1CTEVSIHZlcnNpb24gc2hvdWxkIHRha2Ugb3ZlciBjb21wbGV0ZWx5LiAgUmVsZWFzZSB0aW1pbmcKLSAgIGlzc3VlcyBhbmQgbmFtZXNwYWNlIHByb2JsZW1zIGNvbnZpbmNlZCBtZSB0byBtZXJnZSB0aGUgdHdvCi0gICB0b2dldGhlciBpbiB0aGlzIGZhc2hpb24sIGEgbGl0dGxlIHNvb25lciB0aGFuIEkgd291bGQgaGF2ZSBsaWtlZC4KLSAgIFRoZSByZWFsIG1lcmdlIHNob3VsZCBiZSBtdWNoIGJldHRlciBkb25lIGJ5IHRoZSB0aW1lIHRoZSBuZXh0Ci0gICByZWxlYXNlIGNvbWVzIG91dC4KLQotICAgRm9yIG5vdywgdGhlIHN0cnVjdHVyZSBvZiB0aGlzIGZpbGUgaXM6Ci0JPGNvbW1vbj4KLQkjaWZkZWYgQkZEX0FTU0VNQkxFUgotCTxvbmUgdmVyc2lvbj4KLQkjZWxzZQotCTxvdGhlciB2ZXJzaW9uPgotCSNlbmRpZgotCTxjb21tb24+Ci0gICBVbmZvcnR1bmF0ZWx5LCB0aGUgY29tbW9uIHBvcnRpb25zIGFyZSB2ZXJ5IHNtYWxsIGF0IHRoZSBtb21lbnQsCi0gICBhbmQgbWFueSBkZWNsYXJhdGlvbnMgb3IgZGVmaW5pdGlvbnMgYXJlIGR1cGxpY2F0ZWQuICBUaGUgc3RydWN0dXJlCi0gICBvZiBvYmotY29mZi5jIGlzIHNpbWlsYXIuCi0KLSAgIFNlZSBkb2MvaW50ZXJuYWxzLnRleGkgZm9yIGEgYnJpZWYgZGlzY3Vzc2lvbiBvZiB0aGUgaGlzdG9yeSwgaWYKLSAgIHlvdSBjYXJlLgotCi0gICBLZW4gUmFlYnVybiwgNSBNYXkgMTk5NAotCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0jaW5jbHVkZSAiYmZkL2xpYmNvZmYuaCIKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfY29mZl9mbGF2b3VyCi0KLS8qIFNZTUJPTCBUQUJMRSAqLwotCi0vKiBBbHRlciB0aGUgZmllbGQgbmFtZXMsIGZvciBub3csIHVudGlsIHdlJ3ZlIGZpeGVkIHVwIHRoZSBvdGhlcgotICAgcmVmZXJlbmNlcyB0byB1c2UgdGhlIG5ldyBuYW1lLiAgKi8KLSNpZmRlZiBUQ19JOTYwCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUJc3ltYm9sUyAqCi0jZGVmaW5lIHN5X3RjCQkJYmFsCi0jZW5kaWYKLQotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRQl1bnNpZ25lZCBsb25nCi0jZGVmaW5lIHN5X29iagkJCXN5X2ZsYWdzCi0KLSNkZWZpbmUgU1lNX0FVWEVOVChTKSBcCi0gICgmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+bmF0aXZlWzFdLnUuYXV4ZW50KQotI2RlZmluZSBTWU1fQVVYSU5GTyhTKSBcCi0gICgmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+bmF0aXZlWzFdKQotCi0jZGVmaW5lIERPX05PVF9TVFJJUAkwCi0KLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFRoZSBudW1iZXIgb2YgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSNkZWZpbmUgU19HRVRfTlVNQkVSX0FVWElMSUFSWShzKSBcCi0gIChjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAocykpLT5uYXRpdmUtPnUuc3ltZW50Lm5fbnVtYXV4KQotLyogVGhlIG51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyAqLwotI2RlZmluZSBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZKHMsdikJKFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHMpID0gKHYpKQotCi0vKiBUcnVlIGlmIGEgc3ltYm9sIG5hbWUgaXMgaW4gdGhlIHN0cmluZyB0YWJsZSwgaS5lLiBpdHMgbGVuZ3RoIGlzID4gOC4gKi8KLSNkZWZpbmUgU19JU19TVFJJTkcocykJCShzdHJsZW4oU19HRVRfTkFNRShzKSkgPiA4ID8gMSA6IDApCi0KLWV4dGVybiBpbnQgU19TRVRfREFUQV9UWVBFIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci1leHRlcm4gaW50IFNfU0VUX1NUT1JBR0VfQ0xBU1MgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLWV4dGVybiBpbnQgU19HRVRfU1RPUkFHRV9DTEFTUyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNBX1NFVF9TWU1fRU5ETkRYIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci0KLS8qIEF1eGlsaWFyeSBlbnRyeSBtYWNyb3MuIFNBXyBzdGFuZHMgZm9yIHN5bWJvbCBhdXhpbGlhcnkgKi8KLS8qIE9taXQgdGhlIHR2IHJlbGF0ZWQgZmllbGRzICovCi0vKiBBY2Nlc3NvcnMgKi8KLQotI2RlZmluZSBTQV9HRVRfU1lNX1RBR05EWChzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfdGFnbmR4LmwpCi0jZGVmaW5lIFNBX0dFVF9TWU1fTE5OTyhzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vKQotI2RlZmluZSBTQV9HRVRfU1lNX1NJWkUocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZSkKLSNkZWZpbmUgU0FfR0VUX1NZTV9GU0laRShzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2ZzaXplKQotI2RlZmluZSBTQV9HRVRfU1lNX0xOTk9QVFIocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHIpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRU5ETkRYKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZGVmaW5lIFNBX0dFVF9TWU1fRElNRU4ocyxpKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bKGkpXSkKLSNkZWZpbmUgU0FfR0VUX0ZJTEVfRk5BTUUocykJKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9mbmFtZSkKLSNkZWZpbmUgU0FfR0VUX1NDTl9TQ05MRU4ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgU0FfR0VUX1NDTl9OUkVMT0MocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgU0FfR0VUX1NDTl9OTElOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25saW5ubykKLQotI2RlZmluZSBTQV9TRVRfU1lNX0xOTk8ocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9sbm5vPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9TSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6Lnhfc2l6ZT0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fRlNJWkUocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2ZzaXplPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PUFRSKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2xubm9wdHI9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0RJTUVOKHMsaSx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bKGkpXT0odikpCi0jZGVmaW5lIFNBX1NFVF9GSUxFX0ZOQU1FKHMsdikJc3RybmNweShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUsKHYpLEZJTE5NTEVOKQotI2RlZmluZSBTQV9TRVRfU0NOX1NDTkxFTihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW49KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05SRUxPQyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2M9KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05MSU5OTyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm89KHYpKQotCi0vKgotICogSW50ZXJuYWwgdXNlIG9ubHkgZGVmaW5pdGlvbnMuIFNGXyBzdGFuZHMgZm9yIHN5bWJvbCBmbGFncy4KLSAqCi0gKiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIHRvIHN5X3N5bWJvbC5vc3RfZmxhZ3MgZmllbGQgb2YgYSBzeW1ib2xTLgotICoKLSAqIFlvdSdsbCBicmVhayBpOTYwIGlmIHlvdSBzaGlmdCB0aGUgU1lTUFJPQyBiaXRzIGFueXdoZXJlIGVsc2UuICBmb3IKLSAqIG1vcmUgb24gdGhlIGJhbG5hbWUvY2FsbG5hbWUgaGFjaywgc2VlIHRjLWk5NjAuaC4gIGIub3V0IGlzIGRvbmUKLSAqIGRpZmZlcmVudGx5LgotICovCi0KLSNkZWZpbmUgU0ZfSTk2MF9NQVNLCSgweDAwMDAwMWZmKQkvKiBCaXRzIDAtOCBhcmUgdXNlZCBieSB0aGUgaTk2MCBwb3J0LiAqLwotI2RlZmluZSBTRl9TWVNQUk9DCSgweDAwMDAwMDNmKQkvKiBiaXRzIDAtNSBhcmUgdXNlZCB0byBzdG9yZSB0aGUgc3lzcHJvYyBudW1iZXIgKi8KLSNkZWZpbmUgU0ZfSVNfU1lTUFJPQwkoMHgwMDAwMDA0MCkJLyogYml0IDYgbWFya3Mgc3ltYm9scyB0aGF0IGFyZSBzeXNwcm9jcyAqLwotI2RlZmluZSBTRl9CQUxOQU1FCSgweDAwMDAwMDgwKQkvKiBiaXQgNyBtYXJrcyBCQUxOQU1FIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfQ0FMTE5BTUUJKDB4MDAwMDAxMDApCS8qIGJpdCA4IG1hcmtzIENBTExOQU1FIHN5bWJvbHMgKi8KLQotI2RlZmluZSBTRl9OT1JNQUxfTUFTSwkoMHgwMDAwZmZmZikJLyogYml0cyAxMi0xNSBhcmUgZ2VuZXJhbCBwdXJwb3NlLiAqLwotCi0jZGVmaW5lIFNGX1NUQVRJQ1MJKDB4MDAwMDEwMDApCS8qIE1hcmsgdGhlIC50ZXh0ICYgYWxsIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfREVGSU5FRAkoMHgwMDAwMjAwMCkJLyogU3ltYm9sIGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNGX1NUUklORwkoMHgwMDAwNDAwMCkJLyogU3ltYm9sIG5hbWUgbGVuZ3RoID4gOCAqLwotI2RlZmluZSBTRl9MT0NBTAkoMHgwMDAwODAwMCkJLyogU3ltYm9sIG11c3Qgbm90IGJlIGVtaXR0ZWQgKi8KLQotI2RlZmluZSBTRl9ERUJVR19NQVNLCSgweGZmZmYwMDAwKQkvKiBiaXRzIDE2LTMxIGFyZSBkZWJ1ZyBpbmZvICovCi0KLSNkZWZpbmUgU0ZfRlVOQ1RJT04JKDB4MDAwMTAwMDApCS8qIFRoZSBzeW1ib2wgaXMgYSBmdW5jdGlvbiAqLwotI2RlZmluZSBTRl9QUk9DRVNTCSgweDAwMDIwMDAwKQkvKiBQcm9jZXNzIHN5bWJvbCBiZWZvcmUgd3JpdGUgKi8KLSNkZWZpbmUgU0ZfVEFHR0VECSgweDAwMDQwMDAwKQkvKiBJcyBhc3NvY2lhdGVkIHdpdGggYSB0YWcgKi8KLSNkZWZpbmUgU0ZfVEFHCQkoMHgwMDA4MDAwMCkJLyogSXMgYSB0YWcgKi8KLSNkZWZpbmUgU0ZfREVCVUcJKDB4MDAxMDAwMDApCS8qIElzIGluIGRlYnVnIG9yIGFicyBzZWN0aW9uICovCi0jZGVmaW5lIFNGX0dFVF9TRUdNRU5UCSgweDAwMjAwMDAwKQkvKiBHZXQgdGhlIHNlY3Rpb24gb2YgdGhlIGZvcndhcmQgc3ltYm9sLiAqLwotLyogQWxsIG90aGVyIGJpdHMgYXJlIHVudXNlZC4gKi8KLQotLyogQWNjZXNzb3JzICovCi0jZGVmaW5lIFNGX0dFVChzKQkJKCpzeW1ib2xfZ2V0X29iaiAocykpCi0jZGVmaW5lIFNGX0dFVF9ERUJVRyhzKQkJKHN5bWJvbF9nZXRfYmZkc3ltIChzKS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotI2RlZmluZSBTRl9TRVRfREVCVUcocykJCShzeW1ib2xfZ2V0X2JmZHN5bSAocyktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkcpCi0jZGVmaW5lIFNGX0dFVF9OT1JNQUxfRklFTEQocykJKFNGX0dFVCAocykgJiBTRl9OT1JNQUxfTUFTSykKLSNkZWZpbmUgU0ZfR0VUX0RFQlVHX0ZJRUxEKHMpCShTRl9HRVQgKHMpICYgU0ZfREVCVUdfTUFTSykKLSNkZWZpbmUgU0ZfR0VUX0ZJTEUocykJCShTRl9HRVQgKHMpICYgU0ZfRklMRSkKLSNkZWZpbmUgU0ZfR0VUX1NUQVRJQ1MocykJKFNGX0dFVCAocykgJiBTRl9TVEFUSUNTKQotI2RlZmluZSBTRl9HRVRfREVGSU5FRChzKQkoU0ZfR0VUIChzKSAmIFNGX0RFRklORUQpCi0jZGVmaW5lIFNGX0dFVF9TVFJJTkcocykJKFNGX0dFVCAocykgJiBTRl9TVFJJTkcpCi0jZGVmaW5lIFNGX0dFVF9MT0NBTChzKQkJKFNGX0dFVCAocykgJiBTRl9MT0NBTCkKLSNkZWZpbmUgU0ZfR0VUX0ZVTkNUSU9OKHMpICAgICAgKFNGX0dFVCAocykgJiBTRl9GVU5DVElPTikKLSNkZWZpbmUgU0ZfR0VUX1BST0NFU1MocykJKFNGX0dFVCAocykgJiBTRl9QUk9DRVNTKQotI2RlZmluZSBTRl9HRVRfVEFHR0VEKHMpCShTRl9HRVQgKHMpICYgU0ZfVEFHR0VEKQotI2RlZmluZSBTRl9HRVRfVEFHKHMpCQkoU0ZfR0VUIChzKSAmIFNGX1RBRykKLSNkZWZpbmUgU0ZfR0VUX0dFVF9TRUdNRU5UKHMpCShTRl9HRVQgKHMpICYgU0ZfR0VUX1NFR01FTlQpCi0jZGVmaW5lIFNGX0dFVF9JOTYwKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0k5NjBfTUFTSykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9CQUxOQU1FKHMpCShTRl9HRVQgKHMpICYgU0ZfQkFMTkFNRSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX0dFVF9DQUxMTkFNRShzKQkoU0ZfR0VUIChzKSAmIFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgJiBTRl9JU19TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX1NZU1BST0MocykJKFNGX0dFVCAocykgJiBTRl9TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLQotLyogTW9kaWZpZXJzICovCi0jZGVmaW5lIFNGX1NFVChzLHYpCQkoU0ZfR0VUIChzKSA9ICh2KSkKLSNkZWZpbmUgU0ZfU0VUX05PUk1BTF9GSUVMRChzLHYpKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX05PUk1BTF9NQVNLKSkKLSNkZWZpbmUgU0ZfU0VUX0RFQlVHX0ZJRUxEKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0RFQlVHX01BU0spKQotI2RlZmluZSBTRl9TRVRfRklMRShzKQkJKFNGX0dFVCAocykgfD0gU0ZfRklMRSkKLSNkZWZpbmUgU0ZfU0VUX1NUQVRJQ1MocykJKFNGX0dFVCAocykgfD0gU0ZfU1RBVElDUykKLSNkZWZpbmUgU0ZfU0VUX0RFRklORUQocykJKFNGX0dFVCAocykgfD0gU0ZfREVGSU5FRCkKLSNkZWZpbmUgU0ZfU0VUX1NUUklORyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9TVFJJTkcpCi0jZGVmaW5lIFNGX1NFVF9MT0NBTChzKQkJKFNGX0dFVCAocykgfD0gU0ZfTE9DQUwpCi0jZGVmaW5lIFNGX0NMRUFSX0xPQ0FMKHMpCShTRl9HRVQgKHMpICY9IH5TRl9MT0NBTCkKLSNkZWZpbmUgU0ZfU0VUX0ZVTkNUSU9OKHMpICAgICAgKFNGX0dFVCAocykgfD0gU0ZfRlVOQ1RJT04pCi0jZGVmaW5lIFNGX1NFVF9QUk9DRVNTKHMpCShTRl9HRVQgKHMpIHw9IFNGX1BST0NFU1MpCi0jZGVmaW5lIFNGX1NFVF9UQUdHRUQocykJKFNGX0dFVCAocykgfD0gU0ZfVEFHR0VEKQotI2RlZmluZSBTRl9TRVRfVEFHKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9UQUcpCi0jZGVmaW5lIFNGX1NFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSB8PSBTRl9HRVRfU0VHTUVOVCkKLSNkZWZpbmUgU0ZfU0VUX0k5NjAocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfSTk2MF9NQVNLKSkJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9CQUxOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0JBTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfQ0FMTE5BTUUocykJKFNGX0dFVCAocykgfD0gU0ZfQ0FMTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfSVNfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9JU19TWVNQUk9DKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX1NZU1BST0Mocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfU1lTUFJPQykpCS8qIHVzZWQgYnkgaTk2MCAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLSAgTGluZSBudW1iZXIgaGFuZGxpbmcgLS0tLS0tLSAqLwotZXh0ZXJuIGludCB0ZXh0X2xpbmVub19udW1iZXI7Ci1leHRlcm4gaW50IGNvZmZfbGluZV9iYXNlOwotZXh0ZXJuIGludCBjb2ZmX25fbGluZV9ub3M7Ci0KLSNkZWZpbmUgb2JqX2VtaXRfbGluZW5vKFdIRVJFLExJTkUsRklMRV9TVEFSVCkJYWJvcnQgKCkKLWV4dGVybiB2b2lkIGNvZmZfYWRkX2xpbmVzeW0gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLQotdm9pZCBjX2RvdF9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICpmaWxlbmFtZSkpOwotI2RlZmluZSBvYmpfYXBwX2ZpbGUgY19kb3RfZmlsZV9zeW1ib2wKLQotZXh0ZXJuIHZvaWQgY29mZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci1leHRlcm4gdm9pZCBjb2ZmX2FkanVzdF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgY29mZl9mcm9iX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotZXh0ZXJuIHZvaWQgY29mZl9hZGp1c3Rfc2VjdGlvbl9zeW1zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLWV4dGVybiB2b2lkIGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChTLFApIAljb2ZmX2Zyb2Jfc3ltYm9sKFMsJlApCi0jaWZuZGVmIG9ial9hZGp1c3Rfc3ltdGFiCi0jZGVmaW5lIG9ial9hZGp1c3Rfc3ltdGFiKCkJY29mZl9hZGp1c3Rfc3ltdGFiKCkKLSNlbmRpZgotI2RlZmluZSBvYmpfZnJvYl9zZWN0aW9uKFMpCWNvZmZfZnJvYl9zZWN0aW9uIChTKQotI2RlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcygpIGNvZmZfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAoKQotCi1leHRlcm4gc3ltYm9sUyAqY29mZl9sYXN0X2Z1bmN0aW9uOwotCi0vKiBGb3J3YXJkIHRoZSBzZWdtZW50IG9mIGEgZm9yd2FyZGVkIHN5bWJvbCwgaGFuZGxlIGFzc2lnbm1lbnRzIHRoYXQKLSAgIGp1c3QgY29weSBzeW1ib2wgdmFsdWVzLCBldGMuICAqLwotI2lmbmRlZiBURV9JMzg2QUlYCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTKGRlc3Qsc3JjKSBcCi0gIChTRl9HRVRfR0VUX1NFR01FTlQgKGRlc3QpIFwKLSAgID8gKFNfU0VUX1NFR01FTlQgKGRlc3QsIFNfR0VUX1NFR01FTlQgKHNyYykpLCAwKSBcCi0gICA6IDApCi0jZWxzZQotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkZXN0LHNyYykgXAotICAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSAmJiBTX0dFVF9TRUdNRU5UIChkZXN0KSA9PSBTRUdfVU5LTk9XTiBcCi0gICA/IChTX1NFVF9TRUdNRU5UIChkZXN0LCBTX0dFVF9TRUdNRU5UIChzcmMpKSwgMCkgXAotICAgOiAwKQotI2VuZGlmCi0KLS8qIHNhbml0eSBjaGVjayAqLwotCi0jaWZkZWYgVENfSTk2MAotI2lmbmRlZiBDX0xFQUZTVEFUCi1oZXkgISBXaGVyZSBpcyB0aGUgQ19MRUFGU1RBVCBkZWZpbml0aW9uID8gaTk2MCAtIGNvZmYgc3VwcG9ydCBpcyBkZXBlbmRpbmcgb24gaXQuCi0jZW5kaWYgLyogbm8gQ19MRUFGU1RBVCAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotI2Vsc2UgLyogbm90IEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIFRDX0EyOUsKLS8qIEFsbG93IHRyYW5zbGF0ZSBmcm9tIGFvdXQgcmVsb2NzIHRvIGNvZmYgcmVsb2NzICovCi0jZGVmaW5lIE5PX1JFTE9DIDIwCi0jZGVmaW5lIFJFTE9DXzMyIDEKLSNkZWZpbmUgUkVMT0NfOCAyCi0jZGVmaW5lIFJFTE9DX0NPTlNUIDMKLSNkZWZpbmUgUkVMT0NfQ09OU1RIIDQKLSNkZWZpbmUgUkVMT0NfSlVNUFRBUkcgNQotI2RlZmluZSBSRUxPQ19CQVNFMjIgNgotI2RlZmluZSBSRUxPQ19ISTIyIDcKLSNkZWZpbmUgUkVMT0NfTE8xMCA4Ci0jZGVmaW5lIFJFTE9DX0JBU0UxMyA5Ci0jZGVmaW5lIFJFTE9DX1dESVNQMjIgMTAKLSNkZWZpbmUgUkVMT0NfV0RJU1AzMCAxMQotI2VuZGlmCi0KLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotLyogTWFnaWMgbnVtYmVyIG9mIHBhZ2VkIGV4ZWN1dGFibGUuICovCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRQkweDgzMDAKLQotCi0vKiBTWU1CT0wgVEFCTEUgKi8KLQotLyogU3ltYm9sIHRhYmxlIGVudHJ5IGRhdGEgdHlwZSAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBCYXNpYyBzeW1ib2wgKi8KLSAgc3RydWN0IGludGVybmFsX3N5bWVudCBvc3RfZW50cnk7Ci0gIC8qIEF1eGlsaWFyeSBlbnRyeS4gKi8KLSAgdW5pb24gaW50ZXJuYWxfYXV4ZW50IG9zdF9hdXhlbnRbT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVNdOwotICAvKiBvYmpfY29mZiBpbnRlcm5hbCB1c2Ugb25seSBmbGFncyAqLwotICB1bnNpZ25lZCBpbnQgb3N0X2ZsYWdzOwotfSBvYmpfc3ltYm9sX3R5cGU7Ci0KLSNpZm5kZWYgRE9fTk9UX1NUUklQCi0jZGVmaW5lIERPX05PVF9TVFJJUAkwCi0jZW5kaWYKLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0vKiBQb3NzaWJsZSBhbmQgdXNlZnVsbCBzZWN0aW9uIG51bWJlciBpbiBzeW1ib2wgdGFibGUKLSAqIFRoZSB2YWx1ZXMgb2YgVEVYVCwgREFUQSBhbmQgQlNTIG1heSBub3QgYmUgcG9ydGFibGUuCi0gKi8KLQotI2RlZmluZSBDX0FCU19TRUNUSU9OCQlOX0FCUwotI2RlZmluZSBDX1VOREVGX1NFQ1RJT04JCU5fVU5ERUYKLSNkZWZpbmUgQ19ERUJVR19TRUNUSU9OCQlOX0RFQlVHCi0jZGVmaW5lIENfTlRWX1NFQ1RJT04JCU5fVFYKLSNkZWZpbmUgQ19QVFZfU0VDVElPTgkJUF9UVgotI2RlZmluZSBDX1JFR0lTVEVSX1NFQ1RJT04JNTAKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFByZWRpY2F0ZXMgKi8KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpICAgICAgICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19VTkRFRl9TRUNUSU9OKQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgOgotICAgc2VjdGlvbiA+IDAgKERBVEEsIFRFWFQgb3IgQlNTKQotICAgc2VjdGlvbiA9PSAwIGFuZCB2YWx1ZSA+IDAgKGV4dGVybmFsIGJzcyBzeW1ib2wpICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKSBcCi0gICgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA+IENfVU5ERUZfU0VDVElPTiBcCi0gICB8fCAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19VTkRFRl9TRUNUSU9OIFwKLSAgICAgICAmJiBTX0dFVF9WQUxVRSAocykgPiAwKSBcCi0gICB8fCAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19BQlNfU0VDVElPTikpCi0vKiBUcnVlIGlmIGEgZGVidWcgc3BlY2lhbCBzeW1ib2wgZW50cnkgKi8KLSNkZWZpbmUgU19JU19ERUJVRyhzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbnVtID09IENfREVCVUdfU0VDVElPTikKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbG9jYWwgc3ltYm9sIG5hbWUgKi8KLS8qIEEgc3ltYm9sIG5hbWUgd2hvc2UgbmFtZSBpbmNsdWRlcyBeQSBpcyBhIGdhcyBpbnRlcm5hbCBwc2V1ZG8gc3ltYm9sICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykgXAotICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gQ19SRUdJU1RFUl9TRUNUSU9OIFwKLSAgIHx8IChTX0xPQ0FMX05BTUUocykgJiYgISBmbGFnX2tlZXBfbG9jYWxzICYmICEgU19JU19ERUJVRyAocykpIFwKLSAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAocyksICdcMDAxJykgIT0gTlVMTCBcCi0gICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKHMpLCAnXDAwMicpICE9IE5VTEwgXAotICAgfHwgKGZsYWdfc3RyaXBfbG9jYWxfYWJzb2x1dGUgXAotICAgICAgICYmICFTX0lTX0VYVEVSTkFMKHMpIFwKLSAgICAgICAmJiAocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSBDX0FCU19TRUNUSU9OKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NudW0gPT0gMCBcCi0JCQkJICYmIFNfR0VUX1ZBTFVFIChzKSA9PSAwKQotLyoKLSAqIFRydWUgaWYgYSBzeW1ib2wgY2FuIGJlIG11bHRpcGx5IGRlZmluZWQgKGJzcyBzeW1ib2xzIGhhdmUgdGhpcyBkZWYKLSAqIHRob3VnaCBpdCBpcyBiYWQgcHJhY3RpY2UpCi0gKi8KLSNkZWZpbmUgU19JU19DT01NT04ocykJCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9PSAwIFwKLQkJCQkgJiYgU19HRVRfVkFMVUUgKHMpICE9IDApCi0vKiBUcnVlIGlmIGEgc3ltYm9sIG5hbWUgaXMgaW4gdGhlIHN0cmluZyB0YWJsZSwgaS5lLiBpdHMgbGVuZ3RoIGlzID4gOC4gKi8KLSNkZWZpbmUgU19JU19TVFJJTkcocykJCShzdHJsZW4oU19HRVRfTkFNRShzKSkgPiA4ID8gMSA6IDApCi0KLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgZGVmaW5lZCBhcyB3ZWFrLiAgKi8KLSNpZmRlZiBURV9QRQotI2RlZmluZSBTX0lTX1dFQUsocykgXAotICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzID09IENfTlRfV0VBSyBcCi0gICB8fCAocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPT0gQ19XRUFLRVhUKQotI2Vsc2UKLSNkZWZpbmUgU19JU19XRUFLKHMpIFwKLSAgKChzKS0+c3lfc3ltYm9sLm9zdF9lbnRyeS5uX3NjbGFzcyA9PSBDX1dFQUtFWFQpCi0jZW5kaWYKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgoY2hhciopKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0KQotLyogVGhlIHBvaW50ZXIgdG8gdGhlIHN0cmluZyB0YWJsZSAqLwotI2RlZmluZSBTX0dFVF9PRkZTRVQocykgICAgICAgICAoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0KQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19HRVRfU0VHTUVOVChzKSAgIHNfZ2V0X3NlZ21lbnQocykKLS8qIFRoZSBkYXRhIHR5cGUgKi8KLSNkZWZpbmUgU19HRVRfREFUQV9UWVBFKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl90eXBlKQotLyogVGhlIHN0b3JhZ2UgY2xhc3MgKi8KLSNkZWZpbmUgU19HRVRfU1RPUkFHRV9DTEFTUyhzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fc2NsYXNzKQotLyogVGhlIG51bWJlciBvZiBhdXhpbGlhcnkgZW50cmllcyAqLwotI2RlZmluZSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZKHMpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9udW1hdXgpCi0KLS8qIE1vZGlmaWVycyAqLwotLyogU2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19TRVRfTkFNRShzLHYpCQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0ID0gKHVuc2lnbmVkIGxvbmcpKHYpKQotLyogU2V0IHRoZSBvZmZzZXQgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX1NFVF9PRkZTRVQocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fb2Zmc2V0ID0gKHYpKQotLyogVGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY251bSA9IFNFR01FTlRfVE9fU1lNQk9MX1RZUEUodikpCi0vKiBUaGUgZGF0YSB0eXBlICovCi0jZGVmaW5lIFNfU0VUX0RBVEFfVFlQRShzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl90eXBlID0gKHYpKQotLyogVGhlIHN0b3JhZ2UgY2xhc3MgKi8KLSNkZWZpbmUgU19TRVRfU1RPUkFHRV9DTEFTUyhzLHYpCSgocyktPnN5X3N5bWJvbC5vc3RfZW50cnkubl9zY2xhc3MgPSAodikpCi0vKiBUaGUgbnVtYmVyIG9mIGF1eGlsaWFyeSBlbnRyaWVzICovCi0jZGVmaW5lIFNfU0VUX05VTUJFUl9BVVhJTElBUlkocyx2KQkoKHMpLT5zeV9zeW1ib2wub3N0X2VudHJ5Lm5fbnVtYXV4ID0gKHYpKQotCi0vKiBBZGRpdGlvbmFsIG1vZGlmaWVycyAqLwotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAoZG9lcyBub3QgbWVhbiB1bmRlZmluZWQpICovCi0jZGVmaW5lIFNfU0VUX0VYVEVSTkFMKHMpICAgICAgIHsgU19TRVRfU1RPUkFHRV9DTEFTUyhzLCBDX0VYVCkgOyBTRl9DTEVBUl9MT0NBTChzKTsgfQotCi0vKiBBdXhpbGlhcnkgZW50cnkgbWFjcm9zLiBTQV8gc3RhbmRzIGZvciBzeW1ib2wgYXV4aWxpYXJ5ICovCi0vKiBPbWl0IHRoZSB0diByZWxhdGVkIGZpZWxkcyAqLwotLyogQWNjZXNzb3JzICovCi0jZGVmaW5lIFNZTV9BVVhFTlQoUykJKCYoUyktPnN5X3N5bWJvbC5vc3RfYXV4ZW50WzBdKQotCi0jZGVmaW5lIFNBX0dFVF9TWU1fVEFHTkRYKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF90YWduZHgubCkKLSNkZWZpbmUgU0FfR0VUX1NZTV9MTk5PKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFNBX0dFVF9TWU1fU0laRShzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBTQV9HRVRfU1lNX0ZTSVpFKHMpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfZnNpemUpCi0jZGVmaW5lIFNBX0dFVF9TWU1fTE5OT1BUUihzKQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgU0FfR0VUX1NZTV9FTkRORFgocykJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2Zjbi54X2VuZG5keC5sKQotI2RlZmluZSBTQV9HRVRfU1lNX0RJTUVOKHMsaSkJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X2ZjbmFyeS54X2FyeS54X2RpbWVuWyhpKV0pCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FKHMpCShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUpCi0jZGVmaW5lIFNBX0dFVF9GSUxFX0ZOQU1FX09GRlNFVChzKSAgKFNZTV9BVVhFTlQgKHMpLT54X2ZpbGUueF9uLnhfb2Zmc2V0KQotI2RlZmluZSBTQV9HRVRfRklMRV9GTkFNRV9aRVJPUyhzKSAgIChTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfbi54X3plcm9lcykKLSNkZWZpbmUgU0FfR0VUX1NDTl9TQ05MRU4ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgU0FfR0VUX1NDTl9OUkVMT0MocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgU0FfR0VUX1NDTl9OTElOTk8ocykJKFNZTV9BVVhFTlQgKHMpLT54X3Njbi54X25saW5ubykKLQotLyogTW9kaWZpZXJzICovCi0jZGVmaW5lIFNBX1NFVF9TWU1fVEFHTkRYKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X3RhZ25keC5sPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9MTk5PKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubz0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fU0laRShzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemU9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0ZTSVpFKHMsdikJKFNZTV9BVVhFTlQgKHMpLT54X3N5bS54X21pc2MueF9mc2l6ZT0odikpCi0jZGVmaW5lIFNBX1NFVF9TWU1fTE5OT1BUUihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyPSh2KSkKLSNkZWZpbmUgU0FfU0VUX1NZTV9FTkRORFgocyx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfZW5kbmR4Lmw9KHYpKQotI2RlZmluZSBTQV9TRVRfU1lNX0RJTUVOKHMsaSx2KQkoU1lNX0FVWEVOVCAocyktPnhfc3ltLnhfZmNuYXJ5LnhfYXJ5LnhfZGltZW5bKGkpXT0odikpCi0jZGVmaW5lIFNBX1NFVF9GSUxFX0ZOQU1FKHMsdikJc3RybmNweShTWU1fQVVYRU5UIChzKS0+eF9maWxlLnhfZm5hbWUsKHYpLEZJTE5NTEVOKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRV9PRkZTRVQocyx2KSAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF9vZmZzZXQ9KHYpKQotI2RlZmluZSBTQV9TRVRfRklMRV9GTkFNRV9aRVJPUyhzLHYpICAoU1lNX0FVWEVOVCAocyktPnhfZmlsZS54X24ueF96ZXJvZXM9KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX1NDTkxFTihzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9zY25sZW49KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05SRUxPQyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ucmVsb2M9KHYpKQotI2RlZmluZSBTQV9TRVRfU0NOX05MSU5OTyhzLHYpCShTWU1fQVVYRU5UIChzKS0+eF9zY24ueF9ubGlubm89KHYpKQotCi0vKgotICogSW50ZXJuYWwgdXNlIG9ubHkgZGVmaW5pdGlvbnMuIFNGXyBzdGFuZHMgZm9yIHN5bWJvbCBmbGFncy4KLSAqCi0gKiBUaGVzZSB2YWx1ZXMgY2FuIGJlIGFzc2lnbmVkIHRvIHN5X3N5bWJvbC5vc3RfZmxhZ3MgZmllbGQgb2YgYSBzeW1ib2xTLgotICoKLSAqIFlvdSdsbCBicmVhayBpOTYwIGlmIHlvdSBzaGlmdCB0aGUgU1lTUFJPQyBiaXRzIGFueXdoZXJlIGVsc2UuICBmb3IKLSAqIG1vcmUgb24gdGhlIGJhbG5hbWUvY2FsbG5hbWUgaGFjaywgc2VlIHRjLWk5NjAuaC4gIGIub3V0IGlzIGRvbmUKLSAqIGRpZmZlcmVudGx5LgotICovCi0KLSNkZWZpbmUgU0ZfSTk2MF9NQVNLCSgweDAwMDAwMWZmKQkvKiBCaXRzIDAtOCBhcmUgdXNlZCBieSB0aGUgaTk2MCBwb3J0LiAqLwotI2RlZmluZSBTRl9TWVNQUk9DCSgweDAwMDAwMDNmKQkvKiBiaXRzIDAtNSBhcmUgdXNlZCB0byBzdG9yZSB0aGUgc3lzcHJvYyBudW1iZXIgKi8KLSNkZWZpbmUgU0ZfSVNfU1lTUFJPQwkoMHgwMDAwMDA0MCkJLyogYml0IDYgbWFya3Mgc3ltYm9scyB0aGF0IGFyZSBzeXNwcm9jcyAqLwotI2RlZmluZSBTRl9CQUxOQU1FCSgweDAwMDAwMDgwKQkvKiBiaXQgNyBtYXJrcyBCQUxOQU1FIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfQ0FMTE5BTUUJKDB4MDAwMDAxMDApCS8qIGJpdCA4IG1hcmtzIENBTExOQU1FIHN5bWJvbHMgKi8KLQotI2RlZmluZSBTRl9OT1JNQUxfTUFTSwkoMHgwMDAwZmZmZikJLyogYml0cyAxMi0xNSBhcmUgZ2VuZXJhbCBwdXJwb3NlLiAqLwotCi0jZGVmaW5lIFNGX1NUQVRJQ1MJKDB4MDAwMDEwMDApCS8qIE1hcmsgdGhlIC50ZXh0ICYgYWxsIHN5bWJvbHMgKi8KLSNkZWZpbmUgU0ZfREVGSU5FRAkoMHgwMDAwMjAwMCkJLyogU3ltYm9sIGlzIGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNGX1NUUklORwkoMHgwMDAwNDAwMCkJLyogU3ltYm9sIG5hbWUgbGVuZ3RoID4gOCAqLwotI2RlZmluZSBTRl9MT0NBTAkoMHgwMDAwODAwMCkJLyogU3ltYm9sIG11c3Qgbm90IGJlIGVtaXR0ZWQgKi8KLQotI2RlZmluZSBTRl9ERUJVR19NQVNLCSgweGZmZmYwMDAwKQkvKiBiaXRzIDE2LTMxIGFyZSBkZWJ1ZyBpbmZvICovCi0KLSNkZWZpbmUgU0ZfRlVOQ1RJT04JKDB4MDAwMTAwMDApCS8qIFRoZSBzeW1ib2wgaXMgYSBmdW5jdGlvbiAqLwotI2RlZmluZSBTRl9QUk9DRVNTCSgweDAwMDIwMDAwKQkvKiBQcm9jZXNzIHN5bWJvbCBiZWZvcmUgd3JpdGUgKi8KLSNkZWZpbmUgU0ZfVEFHR0VECSgweDAwMDQwMDAwKQkvKiBJcyBhc3NvY2lhdGVkIHdpdGggYSB0YWcgKi8KLSNkZWZpbmUgU0ZfVEFHCQkoMHgwMDA4MDAwMCkJLyogSXMgYSB0YWcgKi8KLSNkZWZpbmUgU0ZfREVCVUcJKDB4MDAxMDAwMDApCS8qIElzIGluIGRlYnVnIG9yIGFicyBzZWN0aW9uICovCi0jZGVmaW5lIFNGX0dFVF9TRUdNRU5UCSgweDAwMjAwMDAwKQkvKiBHZXQgdGhlIHNlY3Rpb24gb2YgdGhlIGZvcndhcmQgc3ltYm9sLiAqLwotI2RlZmluZSBTRl9BREpfTE5OT1BUUgkoMHgwMDQwMDAwMCkJLyogSGFzIGEgbG5ub3B0ciAqLwotLyogQWxsIG90aGVyIGJpdHMgYXJlIHVudXNlZC4gKi8KLQotLyogQWNjZXNzb3JzICovCi0jZGVmaW5lIFNGX0dFVChzKQkJKChzKS0+c3lfc3ltYm9sLm9zdF9mbGFncykKLSNkZWZpbmUgU0ZfR0VUX05PUk1BTF9GSUVMRChzKQkoU0ZfR0VUIChzKSAmIFNGX05PUk1BTF9NQVNLKQotI2RlZmluZSBTRl9HRVRfREVCVUdfRklFTEQocykJKFNGX0dFVCAocykgJiBTRl9ERUJVR19NQVNLKQotI2RlZmluZSBTRl9HRVRfRklMRShzKQkJKFNGX0dFVCAocykgJiBTRl9GSUxFKQotI2RlZmluZSBTRl9HRVRfU1RBVElDUyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NUQVRJQ1MpCi0jZGVmaW5lIFNGX0dFVF9ERUZJTkVEKHMpCShTRl9HRVQgKHMpICYgU0ZfREVGSU5FRCkKLSNkZWZpbmUgU0ZfR0VUX1NUUklORyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NUUklORykKLSNkZWZpbmUgU0ZfR0VUX0xPQ0FMKHMpCQkoU0ZfR0VUIChzKSAmIFNGX0xPQ0FMKQotI2RlZmluZSBTRl9HRVRfRlVOQ1RJT04ocykgICAgICAoU0ZfR0VUIChzKSAmIFNGX0ZVTkNUSU9OKQotI2RlZmluZSBTRl9HRVRfUFJPQ0VTUyhzKQkoU0ZfR0VUIChzKSAmIFNGX1BST0NFU1MpCi0jZGVmaW5lIFNGX0dFVF9ERUJVRyhzKQkJKFNGX0dFVCAocykgJiBTRl9ERUJVRykKLSNkZWZpbmUgU0ZfR0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSAmIFNGX1RBR0dFRCkKLSNkZWZpbmUgU0ZfR0VUX1RBRyhzKQkJKFNGX0dFVCAocykgJiBTRl9UQUcpCi0jZGVmaW5lIFNGX0dFVF9HRVRfU0VHTUVOVChzKQkoU0ZfR0VUIChzKSAmIFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9HRVRfQURKX0xOTk9QVFIocykJKFNGX0dFVCAocykgJiBTRl9BREpfTE5OT1BUUikKLSNkZWZpbmUgU0ZfR0VUX0k5NjAocykJCShTRl9HRVQgKHMpICYgU0ZfSTk2MF9NQVNLKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0JBTE5BTUUocykJKFNGX0dFVCAocykgJiBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfR0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpICYgU0ZfQ0FMTE5BTUUpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfSVNfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSAmIFNGX0lTX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9HRVRfU1lTUFJPQyhzKQkoU0ZfR0VUIChzKSAmIFNGX1NZU1BST0MpCS8qIHVzZWQgYnkgaTk2MCAqLwotCi0vKiBNb2RpZmllcnMgKi8KLSNkZWZpbmUgU0ZfU0VUKHMsdikJCShTRl9HRVQgKHMpID0gKHYpKQotI2RlZmluZSBTRl9TRVRfTk9STUFMX0ZJRUxEKHMsdikoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfTk9STUFMX01BU0spKQotI2RlZmluZSBTRl9TRVRfREVCVUdfRklFTEQocyx2KQkoU0ZfR0VUIChzKSB8PSAoKHYpICYgU0ZfREVCVUdfTUFTSykpCi0jZGVmaW5lIFNGX1NFVF9GSUxFKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9GSUxFKQotI2RlZmluZSBTRl9TRVRfU1RBVElDUyhzKQkoU0ZfR0VUIChzKSB8PSBTRl9TVEFUSUNTKQotI2RlZmluZSBTRl9TRVRfREVGSU5FRChzKQkoU0ZfR0VUIChzKSB8PSBTRl9ERUZJTkVEKQotI2RlZmluZSBTRl9TRVRfU1RSSU5HKHMpCShTRl9HRVQgKHMpIHw9IFNGX1NUUklORykKLSNkZWZpbmUgU0ZfU0VUX0xPQ0FMKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9MT0NBTCkKLSNkZWZpbmUgU0ZfQ0xFQVJfTE9DQUwocykJKFNGX0dFVCAocykgJj0gflNGX0xPQ0FMKQotI2RlZmluZSBTRl9TRVRfRlVOQ1RJT04ocykgICAgICAoU0ZfR0VUIChzKSB8PSBTRl9GVU5DVElPTikKLSNkZWZpbmUgU0ZfU0VUX1BST0NFU1MocykJKFNGX0dFVCAocykgfD0gU0ZfUFJPQ0VTUykKLSNkZWZpbmUgU0ZfU0VUX0RFQlVHKHMpCQkoU0ZfR0VUIChzKSB8PSBTRl9ERUJVRykKLSNkZWZpbmUgU0ZfU0VUX1RBR0dFRChzKQkoU0ZfR0VUIChzKSB8PSBTRl9UQUdHRUQpCi0jZGVmaW5lIFNGX1NFVF9UQUcocykJCShTRl9HRVQgKHMpIHw9IFNGX1RBRykKLSNkZWZpbmUgU0ZfU0VUX0dFVF9TRUdNRU5UKHMpCShTRl9HRVQgKHMpIHw9IFNGX0dFVF9TRUdNRU5UKQotI2RlZmluZSBTRl9TRVRfQURKX0xOTk9QVFIocykJKFNGX0dFVCAocykgfD0gU0ZfQURKX0xOTk9QVFIpCi0jZGVmaW5lIFNGX1NFVF9JOTYwKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX0k5NjBfTUFTSykpCS8qIHVzZWQgYnkgaTk2MCAqLwotI2RlZmluZSBTRl9TRVRfQkFMTkFNRShzKQkoU0ZfR0VUIChzKSB8PSBTRl9CQUxOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0NBTExOQU1FKHMpCShTRl9HRVQgKHMpIHw9IFNGX0NBTExOQU1FKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLSNkZWZpbmUgU0ZfU0VUX0lTX1NZU1BST0MocykJKFNGX0dFVCAocykgfD0gU0ZfSVNfU1lTUFJPQykJLyogdXNlZCBieSBpOTYwICovCi0jZGVmaW5lIFNGX1NFVF9TWVNQUk9DKHMsdikJKFNGX0dFVCAocykgfD0gKCh2KSAmIFNGX1NZU1BST0MpKQkvKiB1c2VkIGJ5IGk5NjAgKi8KLQotLyogRmlsZSBoZWFkZXIgbWFjcm8gYW5kIHR5cGUgZGVmaW5pdGlvbiAqLwotCi0vKgotICogRmlsZSBwb3NpdGlvbiBjYWxjdWxhdG9ycy4gQmV3YXJlIHRvIHVzZSB0aGVtIHdoZW4gYWxsIHRoZQotICogYXBwcm9wcmlhdGUgZmllbGRzIGFyZSBzZXQgaW4gdGhlIGhlYWRlci4KLSAqLwotCi0jaWZkZWYgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLSNkZWZpbmUgT0JKX0NPRkZfQU9VVEhEUlNaICgwKQotI2Vsc2UKLSNkZWZpbmUgT0JKX0NPRkZfQU9VVEhEUlNaIChBT1VUSERSU1opCi0jZW5kaWYgLyogT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIgKi8KLQotI2RlZmluZSBIX0dFVF9GSUxFX1NJWkUoaCkgXAotICAgIChsb25nKShGSUxIU1ogKyBPQkpfQ09GRl9BT1VUSERSU1ogKyBcCi0JICAgSF9HRVRfTlVNQkVSX09GX1NFQ1RJT05TKGgpICogU0NOSFNaICsgXAotCSAgIEhfR0VUX1RFWFRfU0laRShoKSArIEhfR0VUX0RBVEFfU0laRShoKSArIFwKLQkgICBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkgKyBIX0dFVF9MSU5FTk9fU0laRShoKSArIFwKLQkgICBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKSArIFwKLQkgICAoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9URVhUX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWikKLSNkZWZpbmUgSF9HRVRfREFUQV9GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpKQotI2RlZmluZSBIX0dFVF9CU1NfRklMRV9PRkZTRVQoaCkgMAotI2RlZmluZSBIX0dFVF9SRUxPQ0FUSU9OX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkpCi0jZGVmaW5lIEhfR0VUX0xJTkVOT19GSUxFX09GRlNFVChoKSBcCi0gICAgKGxvbmcpKEZJTEhTWiArIE9CSl9DT0ZGX0FPVVRIRFJTWiArIFwKLQkgICBIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1ogKyBcCi0JICAgSF9HRVRfVEVYVF9TSVpFKGgpICsgSF9HRVRfREFUQV9TSVpFKGgpICsgXAotCSAgIEhfR0VUX1JFTE9DQVRJT05fU0laRShoKSkKLSNkZWZpbmUgSF9HRVRfU1lNQk9MX1RBQkxFX0ZJTEVfT0ZGU0VUKGgpIFwKLSAgICAobG9uZykoRklMSFNaICsgT0JKX0NPRkZfQU9VVEhEUlNaICsgXAotCSAgIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKSAqIFNDTkhTWiArIFwKLQkgICBIX0dFVF9URVhUX1NJWkUoaCkgKyBIX0dFVF9EQVRBX1NJWkUoaCkgKyBcCi0JICAgSF9HRVRfUkVMT0NBVElPTl9TSVpFKGgpICsgSF9HRVRfTElORU5PX1NJWkUoaCkpCi0KLS8qIEFjY2Vzc29ycyAqLwotLyogYW91dGhkciAqLwotI2RlZmluZSBIX0dFVF9NQUdJQ19OVU1CRVIoaCkgICAgICAgICAgICgoaCktPmFvdXRoZHIubWFnaWMpCi0jZGVmaW5lIEhfR0VUX1ZFUlNJT05fU1RBTVAoaCkJCSgoaCktPmFvdXRoZHIudnN0YW1wKQotI2RlZmluZSBIX0dFVF9URVhUX1NJWkUoaCkgICAgICAgICAgICAgICgoaCktPmFvdXRoZHIudHNpemUpCi0jZGVmaW5lIEhfR0VUX0RBVEFfU0laRShoKSAgICAgICAgICAgICAgKChoKS0+YW91dGhkci5kc2l6ZSkKLSNkZWZpbmUgSF9HRVRfQlNTX1NJWkUoaCkgICAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmJzaXplKQotI2RlZmluZSBIX0dFVF9FTlRSWV9QT0lOVChoKSAgICAgICAgICAgICgoaCktPmFvdXRoZHIuZW50cnkpCi0jZGVmaW5lIEhfR0VUX1RFWFRfU1RBUlQoaCkJCSgoaCktPmFvdXRoZHIudGV4dF9zdGFydCkKLSNkZWZpbmUgSF9HRVRfREFUQV9TVEFSVChoKQkJKChoKS0+YW91dGhkci5kYXRhX3N0YXJ0KQotLyogZmlsZWhkciAqLwotI2RlZmluZSBIX0dFVF9GSUxFX01BR0lDX05VTUJFUihoKQkoKGgpLT5maWxlaGRyLmZfbWFnaWMpCi0jZGVmaW5lIEhfR0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoKQkoKGgpLT5maWxlaGRyLmZfbnNjbnMpCi0jZGVmaW5lIEhfR0VUX1RJTUVfU1RBTVAoaCkJCSgoaCktPmZpbGVoZHIuZl90aW1kYXQpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9UQUJMRV9QT0lOVEVSKGgpCSgoaCktPmZpbGVoZHIuZl9zeW1wdHIpCi0jZGVmaW5lIEhfR0VUX1NZTUJPTF9DT1VOVChoKQkJKChoKS0+ZmlsZWhkci5mX25zeW1zKQotI2RlZmluZSBIX0dFVF9TWU1CT0xfVEFCTEVfU0laRShoKQkoSF9HRVRfU1lNQk9MX0NPVU5UKGgpICogU1lNRVNaKQotI2RlZmluZSBIX0dFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSKGgpCSgoaCktPmZpbGVoZHIuZl9vcHRoZHIpCi0jZGVmaW5lIEhfR0VUX0ZMQUdTKGgpCQkJKChoKS0+ZmlsZWhkci5mX2ZsYWdzKQotLyogRXh0cmEgZmllbGRzIHRvIGFjaGlldmUgYnNkIGEub3V0IGNvbXBhdGliaWxpdHkgYW5kIGZvciBjb252ZW5pZW5jZSAqLwotI2RlZmluZSBIX0dFVF9SRUxPQ0FUSU9OX1NJWkUoaCkgICAJKChoKS0+cmVsb2NhdGlvbl9zaXplKQotI2RlZmluZSBIX0dFVF9TVFJJTkdfU0laRShoKSAgICAgICAgICAgICgoaCktPnN0cmluZ190YWJsZV9zaXplKQotI2RlZmluZSBIX0dFVF9MSU5FTk9fU0laRShoKSAgICAgICAgICAgICgoaCktPmxpbmVub19zaXplKQotCi0jaWZuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZGVmaW5lIEhfR0VUX0hFQURFUl9TSVpFKGgpCQkoc2l6ZW9mKEZJTEhEUikgXAotCQkJCQkgKyBzaXplb2YoQU9VVEhEUilcCi0JCQkJCSArIChIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1opKQotI2Vsc2UgLyogT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIgKi8KLSNkZWZpbmUgSF9HRVRfSEVBREVSX1NJWkUoaCkJCShzaXplb2YoRklMSERSKSBcCi0JCQkJCSArIChIX0dFVF9OVU1CRVJfT0ZfU0VDVElPTlMoaCkgKiBTQ05IU1opKQotI2VuZGlmIC8qIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSICovCi0KLSNkZWZpbmUgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUoaCkJKHRleHRfc2VjdGlvbl9oZWFkZXIuc19ucmVsb2MgKiBSRUxTWikKLSNkZWZpbmUgSF9HRVRfREFUQV9SRUxPQ0FUSU9OX1NJWkUoaCkJKGRhdGFfc2VjdGlvbl9oZWFkZXIuc19ucmVsb2MgKiBSRUxTWikKLQotLyogTW9kaWZpZXJzICovCi0vKiBhb3V0aGRyICovCi0jZGVmaW5lIEhfU0VUX01BR0lDX05VTUJFUihoLHYpICAgICAgICAgKChoKS0+YW91dGhkci5tYWdpYyA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfVkVSU0lPTl9TVEFNUChoLHYpCSgoaCktPmFvdXRoZHIudnN0YW1wID0gKHYpKQotI2RlZmluZSBIX1NFVF9URVhUX1NJWkUoaCx2KSAgICAgICAgICAgICgoaCktPmFvdXRoZHIudHNpemUgPSAodikpCi0jZGVmaW5lIEhfU0VUX0RBVEFfU0laRShoLHYpICAgICAgICAgICAgKChoKS0+YW91dGhkci5kc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfQlNTX1NJWkUoaCx2KSAgICAgICAgICAgICAoKGgpLT5hb3V0aGRyLmJzaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9FTlRSWV9QT0lOVChoLHYpICAgICAgICAgICgoaCktPmFvdXRoZHIuZW50cnkgPSAodikpCi0jZGVmaW5lIEhfU0VUX1RFWFRfU1RBUlQoaCx2KQkJKChoKS0+YW91dGhkci50ZXh0X3N0YXJ0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NUQVJUKGgsdikJCSgoaCktPmFvdXRoZHIuZGF0YV9zdGFydCA9ICh2KSkKLS8qIGZpbGVoZHIgKi8KLSNkZWZpbmUgSF9TRVRfRklMRV9NQUdJQ19OVU1CRVIoaCx2KQkoKGgpLT5maWxlaGRyLmZfbWFnaWMgPSAodikpCi0jZGVmaW5lIEhfU0VUX05VTUJFUl9PRl9TRUNUSU9OUyhoLHYpCSgoaCktPmZpbGVoZHIuZl9uc2NucyA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfVElNRV9TVEFNUChoLHYpCQkoKGgpLT5maWxlaGRyLmZfdGltZGF0ID0gKHYpKQotI2RlZmluZSBIX1NFVF9TWU1CT0xfVEFCTEVfUE9JTlRFUihoLHYpCSgoaCktPmZpbGVoZHIuZl9zeW1wdHIgPSAodikpCi0jZGVmaW5lIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFKGgsdikgICAgKChoKS0+ZmlsZWhkci5mX25zeW1zID0gKHYpKQotI2RlZmluZSBIX1NFVF9TSVpFT0ZfT1BUSU9OQUxfSEVBREVSKGgsdikgKChoKS0+ZmlsZWhkci5mX29wdGhkciA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfRkxBR1MoaCx2KQkJKChoKS0+ZmlsZWhkci5mX2ZsYWdzID0gKHYpKQotLyogRXh0cmEgZmllbGRzIHRvIGFjaGlldmUgYnNkIGEub3V0IGNvbXBhdGliaWxpdHkgYW5kIGZvciBjb252aW5pZW5jZSAqLwotI2RlZmluZSBIX1NFVF9SRUxPQ0FUSU9OX1NJWkUoaCx0LGQpIAkoKGgpLT5yZWxvY2F0aW9uX3NpemUgPSAodCkrKGQpKQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpICAgICAgICAgICgoaCktPnN0cmluZ190YWJsZV9zaXplID0gKHYpKQotI2RlZmluZSBIX1NFVF9MSU5FTk9fU0laRShoLHYpICAgICAgICAgICgoaCktPmxpbmVub19zaXplID0gKHYpKQotCi0vKiBTZWdtZW50IGZsaXBwaW5nICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyIGFvdXRoZHI7CS8qIGEub3V0IGhlYWRlciAqLwotICBzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkciBmaWxlaGRyOwkvKiBGaWxlIGhlYWRlciwgbm90IG1hY2hpbmUgZGVwLiAqLwotICBsb25nIHN0cmluZ190YWJsZV9zaXplOwkvKiBuYW1lcyArICdcMCcgKyBzaXplb2YoaW50KSAqLwotICBsb25nIHJlbG9jYXRpb25fc2l6ZTsJLyogQ3VtdWxhdGVkIHNpemUgb2YgcmVsb2NhdGlvbgotCQkJICAgaW5mb3JtYXRpb24gZm9yIGFsbCBzZWN0aW9ucyBpbgotCQkJICAgYnl0ZXMuICovCi0gIGxvbmcgbGluZW5vX3NpemU7CQkvKiBTaXplIG9mIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbgotCQkJCSAgIHRhYmxlIGluIGJ5dGVzICovCi19IG9iamVjdF9oZWFkZXJzOwotCi0KLQotc3RydWN0IGxpbmVub19saXN0Ci17Ci0gIHN0cnVjdCBiZmRfaW50ZXJuYWxfbGluZW5vIGxpbmU7Ci0gIGNoYXIgKmZyYWc7CQkJLyogRnJhZyB0byB3aGljaCB0aGUgbGluZSBudW1iZXIgaXMgcmVsYXRlZCAqLwotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKm5leHQ7CS8qIEZvcndhcmQgY2hhaW4gcG9pbnRlciAqLwotfTsKLQotCi0KLQotI2RlZmluZSBvYmpfc2VnbWVudF9uYW1lKGkpIChzZWdtZW50X2luZm9bKGludCkgKGkpXS5zY25oZHIuc19uYW1lKQotCi0jZGVmaW5lIG9ial9hZGRfc2VnbWVudChzKSBvYmpfY29mZl9hZGRfc2VnbWVudCAocykKLQotZXh0ZXJuIHNlZ1Qgb2JqX2NvZmZfYWRkX3NlZ21lbnQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9jb2ZmX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLWV4dGVybiB2b2lkIGNfZG90X2ZpbGVfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci0jZGVmaW5lIG9ial9hcHBfZmlsZSBjX2RvdF9maWxlX3N5bWJvbAotZXh0ZXJuIHZvaWQgb2JqX2V4dHJhX3N0dWZmIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotCi1leHRlcm4gc2VnVCBzX2dldF9zZWdtZW50IFBBUkFNUyAoKHN5bWJvbFMgKnB0cikpOwotCi1leHRlcm4gdm9pZCBjX3NlY3Rpb25faGVhZGVyIFBBUkFNUyAoKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgKiBoZWFkZXIsCi0JCQkJICAgICAgY2hhciAqbmFtZSwKLQkJCQkgICAgICBsb25nIGNvcmVfYWRkcmVzcywKLQkJCQkgICAgICBsb25nIHNpemUsCi0JCQkJICAgICAgbG9uZyBkYXRhX3B0ciwKLQkJCQkgICAgICBsb25nIHJlbG9jX3B0ciwKLQkJCQkgICAgICBsb25nIGxpbmVub19wdHIsCi0JCQkJICAgICAgbG9uZyByZWxvY19udW1iZXIsCi0JCQkJICAgICAgbG9uZyBsaW5lbm9fbnVtYmVyLAotCQkJCSAgICAgIGxvbmcgYWxpZ25tZW50KSk7Ci0KLSNpZm5kZWYgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rCi12b2lkIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNlbmRpZgotCi0vKiBzYW5pdHkgY2hlY2sgKi8KLQotI2lmZGVmIFRDX0k5NjAKLSNpZm5kZWYgQ19MRUFGU1RBVAotaGV5ICEgV2hlcmUgaXMgdGhlIENfTEVBRlNUQVQgZGVmaW5pdGlvbiA/IGk5NjAgLSBjb2ZmIHN1cHBvcnQgaXMgZGVwZW5kaW5nIG9uIGl0LgotI2VuZGlmIC8qIG5vIENfTEVBRlNUQVQgKi8KLSNlbmRpZiAvKiBUQ19JOTYwICovCi1leHRlcm4gc3RydWN0IGludGVybmFsX3NjbmhkciBkYXRhX3NlY3Rpb25faGVhZGVyOwotZXh0ZXJuIHN0cnVjdCBpbnRlcm5hbF9zY25oZHIgdGV4dF9zZWN0aW9uX2hlYWRlcjsKLQotLyogRm9yd2FyZCB0aGUgc2VnbWVudCBvZiBhIGZvcndhcmRlZCBzeW1ib2wuICAqLwotI2RlZmluZSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyhkZXN0LHNyYykgXAotICAoU0ZfR0VUX0dFVF9TRUdNRU5UIChkZXN0KSBcCi0gICA/IChTX1NFVF9TRUdNRU5UIChkZXN0LCBTX0dFVF9TRUdNRU5UIChzcmMpKSwgMCkgXAotICAgOiAwKQotCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgb2JqX2hhbmRsZV9saW5rX29uY2UodCkgb2JqX2NvZmZfcGVfaGFuZGxlX2xpbmtfb25jZSAodCkKLWV4dGVybiB2b2lkIG9ial9jb2ZmX3BlX2hhbmRsZV9saW5rX29uY2UgKCk7Ci0jZW5kaWYKLQotI2VuZGlmIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi0KLS8qIEluIENPRkYsIGlmIGEgc3ltYm9sIGlzIGRlZmluZWQgdXNpbmcgLmRlZi8udmFsIFNZTS8uZW5kZWYsIGl0J3MgT0sKLSAgIHRvIHJlZGVmaW5lIHRoZSBzeW1ib2wgbGF0ZXIgb24uICBUaGlzIGNhbiBoYXBwZW4gaWYgQyBzeW1ib2xzIHVzZQotICAgYSBwcmVmaXgsIGFuZCBhIHN5bWJvbCBpcyBkZWZpbmVkIGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgcHJlZml4LAotICAgYXMgaW4gc3RhcnQvX3N0YXJ0L19fc3RhcnQgaW4gZ2NjL2xpYmdjYzEtdGVzdC5jLiAgKi8KLSNkZWZpbmUgUkVTT0xWRV9TWU1CT0xfUkVERUZJTklUSU9OKHN5bSkJCVwKLShTRl9HRVRfR0VUX1NFR01FTlQgKHN5bSkJCQkJXAotID8gKHN5bS0+c3lfZnJhZyA9IGZyYWdfbm93LAkJCQlcCi0gICAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKSwJCQlcCi0gICAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKSwJCQlcCi0gICAgMCkJCQkJCQkJXAotIDogMCkKLQotLyogU3RhYnMgaW4gYSBjb2ZmIGZpbGUgZ28gaW50byB0aGVpciBvd24gc2VjdGlvbi4gICovCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgMQotCi0vKiBXZSBuZWVkIDEyIGJ5dGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiB0byBob2xkIHNvbWUgaW5pdGlhbAotICAgaW5mb3JtYXRpb24uICAqLwotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfaW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9jb2ZmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpCi0KLSNlbmRpZiAvKiBPQkpfRk9STUFUX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMgYi9nYXMvY29uZmlnL29iai1lY29mZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDg5MjQzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTAgKzAsMCBAQAotLyogRUNPRkYgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSB3YXMgcHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1lY29mZi5oIgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImJmZC9saWJjb2ZmLmgiCi0jaW5jbHVkZSAiYmZkL2xpYmVjb2ZmLmgiCi0KLS8qIEFsbW9zdCBhbGwgb2YgdGhlIEVDT0ZGIHN1cHBvcnQgaXMgYWN0dWFsbHkgaW4gZWNvZmYuYyBpbiB0aGUgbWFpbgotICAgZ2FzIGRpcmVjdG9yeS4gIFRoaXMgZmlsZSBtb3N0bHkganVzdCBhcnJhbmdlcyB0byBjYWxsIHRoYXQgb25lIGF0Ci0gICB0aGUgcmlnaHQgdGltZXMuICAqLwotCi1zdGF0aWMgaW50IGVjb2ZmX3NlY19zeW1fb2tfZm9yX3JlbG9jIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIG9ial9lY29mZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci1zdGF0aWMgdm9pZCBlY29mZl9wb3BfaW5zZXJ0IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogVGhlc2UgYXJlIHRoZSBwc2V1ZG8tb3BzIHdlIHN1cHBvcnQgaW4gdGhpcyBmaWxlLiAgT25seSB0aG9zZQotICAgcmVsYXRpbmcgdG8gZGVidWdnaW5nIGluZm9ybWF0aW9uIGFyZSBzdXBwb3J0ZWQgaGVyZS4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vawotICAgc2hvdWxkIGJlIGRlZmluZWQgaGVyZSwgYnV0IGFyZSBjdXJyZW50bHkgdW5zdXBwb3J0ZWQ6IC5hZW50LAotICAgLmJnbmIsIC5lbmRiLCAudmVyc3RhbXAsIC52cmVnLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rIGFyZQotICAgTUlQUyBDUFUgc3BlY2lmaWMsIGFuZCBzaG91bGQgYmUgZGVmaW5lZCBieSB0Yy1taXBzLmM6IC5hbGlhcywKLSAgIC5leHRlcm4sIC5nYWxpdmUsIC5namFsZGVmLCAuZ2pybGl2ZSwgLmxpdmVyZWcsIC5ub2FsaWFzLCAub3B0aW9uLAotICAgLnJkYXRhLCAuc2RhdGEsIC5zZXQuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCi0gICBub3QgTUlQUyBDUFUgc3BlY2lmaWMsIGJ1dCBhcmUgYWxzbyBub3QgRUNPRkYgc3BlY2lmaWMuICBJIGhhdmUKLSAgIG9ubHkgbGlzdGVkIHRoZSBvbmVzIHdoaWNoIGFyZSBub3QgYWxyZWFkeSBpbiByZWFkLmMuICBJdCdzIG5vdAotICAgY29tcGxldGVseSBjbGVhciB3aGVyZSB0aGVzZSBzaG91bGQgYmUgZGVmaW5lZCwgYnV0IHRjLW1pcHMuYyBpcwotICAgcHJvYmFibHkgdGhlIG1vc3QgcmVhc29uYWJsZSBwbGFjZTogLmFzY2lpeiwgLmFzbTAsIC5lbmRyLCAuZXJyLAotICAgLmhhbGYsIC5sYWIsIC5yZXBlYXQsIC5zdHJ1Y3QsIC53ZWFrZXh0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIC8qIENPRkYgc3R5bGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAubG4gaXMgbm90IHVzZWQ7IC5sb2MgaXMgdXNlZAotICAgICBpbnN0ZWFkLiAgKi8KLSAgeyAiZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2RlZiwJMCB9LAotICB7ICJkaW0iLAllY29mZl9kaXJlY3RpdmVfZGltLAkwIH0sCi0gIHsgImVuZGVmIiwJZWNvZmZfZGlyZWN0aXZlX2VuZGVmLAkwIH0sCi0gIHsgImZpbGUiLAllY29mZl9kaXJlY3RpdmVfZmlsZSwJMCB9LAotICB7ICJzY2wiLAllY29mZl9kaXJlY3RpdmVfc2NsLAkwIH0sCi0gIHsgInNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAotICB7ICJlc2l6ZSIsCWVjb2ZmX2RpcmVjdGl2ZV9zaXplLAkwIH0sCi0gIHsgInRhZyIsCWVjb2ZmX2RpcmVjdGl2ZV90YWcsCTAgfSwKLSAgeyAidHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCi0gIHsgImV0eXBlIiwJZWNvZmZfZGlyZWN0aXZlX3R5cGUsCTAgfSwKLSAgeyAidmFsIiwJZWNvZmZfZGlyZWN0aXZlX3ZhbCwJMCB9LAotCi0gIC8qIEVDT0ZGIHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gIHsgImJlZ2luIiwJZWNvZmZfZGlyZWN0aXZlX2JlZ2luLAkwIH0sCi0gIHsgImJlbmQiLAllY29mZl9kaXJlY3RpdmVfYmVuZCwJMCB9LAotICB7ICJlbmQiLAllY29mZl9kaXJlY3RpdmVfZW5kLAkwIH0sCi0gIHsgImVudCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbnQsCTAgfSwKLSAgeyAiZm1hc2siLAllY29mZl9kaXJlY3RpdmVfZm1hc2ssCTAgfSwKLSAgeyAiZnJhbWUiLAllY29mZl9kaXJlY3RpdmVfZnJhbWUsCTAgfSwKLSAgeyAibG9jIiwJZWNvZmZfZGlyZWN0aXZlX2xvYywJMCB9LAotICB7ICJtYXNrIiwJZWNvZmZfZGlyZWN0aXZlX21hc2ssCTAgfSwKLQotICAvKiBPdGhlciBFQ09GRiBkaXJlY3RpdmVzLiAgKi8KLSAgeyAiZXh0ZXJuIiwJZWNvZmZfZGlyZWN0aXZlX2V4dGVybiwJMCB9LAotCi0jaWZuZGVmIFRDX01JUFMKLSAgLyogRm9yIFRDX01JUFMsIHRjLW1pcHMuYyBhZGRzIHRoaXMuICovCi0gIHsgIndlYWtleHQiLAllY29mZl9kaXJlY3RpdmVfd2Vha2V4dCwgMCB9LAotI2VuZGlmCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgb24gSXJpeC4gIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZW0uICAqLwotICB7ICJiZ25iIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImVuZGIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidmVyc3RhbXAiLAlzX2lnbm9yZSwJCTAgfSwKLQotICAvKiBTZW50aW5lbC4gICovCi0gIHsgTlVMTCB9Ci19OwotCi0vKiBTd2FwIG91dCB0aGUgc3ltYm9scyBhbmQgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBCRkQuICAqLwotCi12b2lkCi1lY29mZl9mcm9iX2ZpbGUgKCkKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoc3Rkb3V0cHV0KS0+ZGVidWdfc3dhcDsKLSAgYmZkX3ZtYSBhZGRyOwotICBhc2VjdGlvbiAqc2VjOwotICBIRFJSICpoZHI7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqc2V0OwotCi0gIC8qIFNldCB0aGUgc2VjdGlvbiBWTUEgdmFsdWVzLiAgV2UgZm9yY2UgdGhlIC5zZGF0YSBhbmQgLnNic3MKLSAgICAgc2VjdGlvbnMgdG8gdGhlIGVuZCB0byBlbnN1cmUgdGhhdCB0aGVpciBWTUEgYWRkcmVzc2VzIGFyZSBjbG9zZQotICAgICB0b2dldGhlciBzbyB0aGF0IHRoZSBHUCByZWdpc3RlciBjYW4gYWRkcmVzcyBib3RoIG9mIHRoZW0uICBXZQotICAgICBwdXQgdGhlIC5ic3Mgc2VjdGlvbiBhZnRlciB0aGUgLnNic3Mgc2VjdGlvbi4KLQotICAgICBBbHNvLCBmb3IgdGhlIEFscGhhLCB3ZSBtdXN0IHNvcnQgdGhlIHNlY3Rpb25zLCB0byBtYWtlIHN1cmUgdGhleQotICAgICBhcHBlYXIgaW4gdGhlIG91dHB1dCBmaWxlIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgKEFjdHVhbGx5LCBtYXliZQotICAgICB0aGlzIGlzIGEgam9iIGZvciBCRkQuICBCdXQgdGhlIFZNQXMgY29tcHV0ZWQgd291bGQgYmUgb3V0IG9mCi0gICAgIHdoYWNrIGlmIHdlIGNvbXB1dGVkIHRoZW0gZ2l2ZW4gb3VyIGluaXRpYWwsIHJhbmRvbSBvcmRlcmluZy4KLSAgICAgSXQncyBwb3NzaWJsZSB0aGF0IHRoYXQgd291bGRuJ3QgYnJlYWsgdGhpbmdzOyBJIGNvdWxkIGRvIHNvbWUKLSAgICAgZXhwZXJpbWVudGluZyBzb21ldGltZSBhbmQgZmluZCBvdXQuCi0KLSAgICAgVGhpcyBvdXRwdXQgb3JkZXJpbmcgb2Ygc2VjdGlvbnMgaXMgbWFnaWMsIG9uIHRoZSBBbHBoYSwgYXQKLSAgICAgbGVhc3QuICBUaGUgLmxpdGEgc2VjdGlvbiBtdXN0IGNvbWUgYmVmb3JlIC5saXQ4IGFuZCAubGl0NCwKLSAgICAgb3RoZXJ3aXNlIHRoZSBPU0YvMSBsaW5rZXIgbWF5IHNpbGVudGx5IHRyYXNoIHRoZSAubGl0ezQsOH0KLSAgICAgc2VjdGlvbiBjb250ZW50cy4gIEFsc28sIC50ZXh0IG11c3QgcHJlY2VlZCAucmRhdGEuICBUaGVzZSBkaWZmZXIKLSAgICAgZnJvbSB0aGUgb3JkZXIgZGVzY3JpYmVkIGluIHNvbWUgcGFydHMgb2YgdGhlIERFQyBPU0YvMSBBc3NlbWJseQotICAgICBMYW5ndWFnZSBQcm9ncmFtbWVyJ3MgR3VpZGUsIGJ1dCB0aGF0IG9yZGVyIGRvZXNuJ3Qgc2VlbSB0byB3b3JrCi0gICAgIHdpdGggdGhlaXIgbGlua2VyLgotCi0gICAgIEkgZG9uJ3Qga25vdyBpZiBzZWN0aW9uIG9yZGVyaW5nIG9uIHRoZSBNSVBTIGlzIGltcG9ydGFudC4gICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG5hbWVzW10gPSB7Ci0gICAgLyogdGV4dCBzZWdtZW50ICovCi0gICAgIi50ZXh0IiwgIi5yZGF0YSIsICIuaW5pdCIsICIuZmluaSIsCi0gICAgLyogZGF0YSBzZWdtZW50ICovCi0gICAgIi5kYXRhIiwgIi5saXRhIiwgIi5saXQ4IiwgIi5saXQ0IiwgIi5zZGF0YSIsICIuZ290IiwKLSAgICAvKiBic3Mgc2VnbWVudCAqLwotICAgICIuc2JzcyIsICIuYnNzIiwKLSAgfTsKLSNkZWZpbmUgbl9uYW1lcyAoc2l6ZW9mIChuYW1lcykgLyBzaXplb2YgKG5hbWVzWzBdKSkKLQotICBhZGRyID0gMDsKLSAgewotICAgIC8qIFNlY3Rpb25zIHRoYXQgbWF0Y2ggbmFtZXMsIG9yZGVyIHRvIGJlIHN0cmFpZ2h0ZW5lZCBvdXQgbGF0ZXIuICAqLwotICAgIGFzZWN0aW9uICpzZWNzW25fbmFtZXNdOwotICAgIC8qIExpbmtlZCBsaXN0IG9mIHNlY3Rpb25zIHdpdGggbm9uLW1hdGNoaW5nIG5hbWVzLiAgUmFuZG9tIG9yZGVyaW5nLiAgKi8KLSAgICBhc2VjdGlvbiAqb3RoZXJfc2VjdGlvbnMgPSAwOwotICAgIC8qIFBvaW50ZXIgdG8gbmV4dCBzZWN0aW9uLCBzaW5jZSB3ZSdyZSBkZXN0cm95aW5nIHRoZSBvcmlnaW5hbAotICAgICAgIG9yZGVyaW5nLiAgKi8KLSAgICBhc2VjdGlvbiAqbmV4dDsKLQotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLSAgICAgIHNlY3NbaV0gPSAwOwotICAgIGZvciAoc2VjID0gc3Rkb3V0cHV0LT5zZWN0aW9uczsgc2VjICE9IChhc2VjdGlvbiAqKSBOVUxMOyBzZWMgPSBuZXh0KQotICAgICAgewotCW5leHQgPSBzZWMtPm5leHQ7Ci0JZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLQkgIGlmICghc3RyY21wIChzZWMtPm5hbWUsIG5hbWVzW2ldKSkKLQkgICAgewotCSAgICAgIHNlY3NbaV0gPSBzZWM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAoaSA9PSBuX25hbWVzKQotCSAgewotCSAgICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlYywgYWRkcik7Ci0JICAgIGFkZHIgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBzZWMpOwotCSAgICBzZWMtPm5leHQgPSBvdGhlcl9zZWN0aW9uczsKLQkgICAgb3RoZXJfc2VjdGlvbnMgPSBzZWM7Ci0JICB9Ci0gICAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG5fbmFtZXM7IGkrKykKLSAgICAgIGlmIChzZWNzW2ldKQotCXsKLQkgIHNlYyA9IHNlY3NbaV07Ci0JICBiZmRfc2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsIHNlYywgYWRkcik7Ci0JICBhZGRyICs9IGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgc2VjKTsKLQl9Ci0gICAgZm9yIChpID0gbl9uYW1lcyAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgaWYgKHNlY3NbaV0pCi0JewotCSAgc2VjID0gc2Vjc1tpXTsKLQkgIHNlYy0+bmV4dCA9IG90aGVyX3NlY3Rpb25zOwotCSAgb3RoZXJfc2VjdGlvbnMgPSBzZWM7Ci0JfQotICAgIHN0ZG91dHB1dC0+c2VjdGlvbnMgPSBvdGhlcl9zZWN0aW9uczsKLSAgfQotCi0gIC8qIEJ1aWxkIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICBhc3NlcnQgKGVjb2ZmX2RhdGEgKHN0ZG91dHB1dCkgIT0gMCk7Ci0gIGhkciA9ICZlY29mZl9kYXRhIChzdGRvdXRwdXQpLT5kZWJ1Z19pbmZvLnN5bWJvbGljX2hlYWRlcjsKLSAgZWNvZmZfYnVpbGRfZGVidWcgKGhkciwgJmJ1ZiwgZGVidWdfc3dhcCk7Ci0KLSAgLyogRmluaXNoIHVwIHRoZSBlY29mZl90ZGF0YSBzdHJ1Y3R1cmUuICAqLwotICBzZXQgPSBidWY7Ci0jZGVmaW5lIFNFVChwdHIsIGNvdW50LCB0eXBlLCBzaXplKSBcCi0gIGlmIChoZHItPmNvdW50ID09IDApIFwKLSAgICBlY29mZl9kYXRhIChzdGRvdXRwdXQpLT5kZWJ1Z19pbmZvLnB0ciA9ICh0eXBlKSBOVUxMOyBcCi0gIGVsc2UgXAotICAgIHsgXAotICAgICAgZWNvZmZfZGF0YSAoc3Rkb3V0cHV0KS0+ZGVidWdfaW5mby5wdHIgPSAodHlwZSkgc2V0OyBcCi0gICAgICBzZXQgKz0gaGRyLT5jb3VudCAqIHNpemU7IFwKLSAgICB9Ci0KLSAgU0VUIChsaW5lLCBjYkxpbmUsIHVuc2lnbmVkIGNoYXIgKiwgc2l6ZW9mICh1bnNpZ25lZCBjaGFyKSk7Ci0gIFNFVCAoZXh0ZXJuYWxfZG5yLCBpZG5NYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZG5yX3NpemUpOwotICBTRVQgKGV4dGVybmFsX3BkciwgaXBkTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX3Bkcl9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9zeW0sIGlzeW1NYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfc3ltX3NpemUpOwotICBTRVQgKGV4dGVybmFsX29wdCwgaW9wdE1heCwgUFRSLCBkZWJ1Z19zd2FwLT5leHRlcm5hbF9vcHRfc2l6ZSk7Ci0gIFNFVCAoZXh0ZXJuYWxfYXV4LCBpYXV4TWF4LCB1bmlvbiBhdXhfZXh0ICosIHNpemVvZiAodW5pb24gYXV4X2V4dCkpOwotICBTRVQgKHNzLCBpc3NNYXgsIGNoYXIgKiwgc2l6ZW9mIChjaGFyKSk7Ci0gIFNFVCAoc3NleHQsIGlzc0V4dE1heCwgY2hhciAqLCBzaXplb2YgKGNoYXIpKTsKLSAgU0VUIChleHRlcm5hbF9yZmQsIGNyZmQsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfcmZkX3NpemUpOwotICBTRVQgKGV4dGVybmFsX2ZkciwgaWZkTWF4LCBQVFIsIGRlYnVnX3N3YXAtPmV4dGVybmFsX2Zkcl9zaXplKTsKLSAgU0VUIChleHRlcm5hbF9leHQsIGlleHRNYXgsIFBUUiwgZGVidWdfc3dhcC0+ZXh0ZXJuYWxfZXh0X3NpemUpOwotCi0jdW5kZWYgU0VUCi0KLSAgLyogRmlsbCBpbiB0aGUgcmVnaXN0ZXIgbWFza3MuICAqLwotICB7Ci0gICAgdW5zaWduZWQgbG9uZyBncHJtYXNrID0gMDsKLSAgICB1bnNpZ25lZCBsb25nIGZwcm1hc2sgPSAwOwotICAgIHVuc2lnbmVkIGxvbmcgKmNwcm1hc2sgPSBOVUxMOwotCi0jaWZkZWYgVENfTUlQUwotICAgIC8qIEZpbGwgaW4gdGhlIE1JUFMgcmVnaXN0ZXIgbWFza3MuICBJdCdzIHByb2JhYmx5IG5vdCB3b3J0aAotICAgICAgIHNldHRpbmcgdXAgYSBnZW5lcmljIGludGVyZmFjZSBmb3IgdGhpcy4gICovCi0gICAgZ3BybWFzayA9IG1pcHNfZ3BybWFzazsKLSAgICBjcHJtYXNrID0gbWlwc19jcHJtYXNrOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19BTFBIQQotICAgIGFscGhhX2Zyb2JfZWNvZmZfZGF0YSAoKTsKLQotICAgIGlmICghIGJmZF9lY29mZl9zZXRfZ3BfdmFsdWUgKHN0ZG91dHB1dCwgYWxwaGFfZ3BfdmFsdWUpKQotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IHNldCBHUCB2YWx1ZSIpKTsKLQotICAgIGdwcm1hc2sgPSBhbHBoYV9ncHJtYXNrOwotICAgIGZwcm1hc2sgPSBhbHBoYV9mcHJtYXNrOwotI2VuZGlmCi0KLSAgICBpZiAoISBiZmRfZWNvZmZfc2V0X3JlZ21hc2tzIChzdGRvdXRwdXQsIGdwcm1hc2ssIGZwcm1hc2ssIGNwcm1hc2spKQotICAgICAgYXNfZmF0YWwgKF8oIkNhbid0IHNldCByZWdpc3RlciBtYXNrcyIpKTsKLSAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgRUNPRkYgY29kZSB0byBzZXQgdGhlIGV4dGVybmFsIGluZm9ybWF0aW9uCi0gICBmb3IgYSBzeW1ib2wuICBXZSBqdXN0IHBhc3MgaXQgb24gdG8gQkZELCB3aGljaCBleHBlY3RzIHRoZSBzd2FwcGVkCi0gICBpbmZvcm1hdGlvbiB0byBiZSBzdG9yZWQgaW4gdGhlIG5hdGl2ZSBmaWVsZCBvZiB0aGUgc3ltYm9sLiAgKi8KLQotdm9pZAotb2JqX2Vjb2ZmX3NldF9leHQgKHN5bSwgZXh0KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIEVYVFIgKmV4dDsKLXsKLSAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKiBjb25zdCBkZWJ1Z19zd2FwCi0gICAgPSAmZWNvZmZfYmFja2VuZCAoc3Rkb3V0cHV0KS0+ZGVidWdfc3dhcDsKLSAgZWNvZmZfc3ltYm9sX3R5cGUgKmVzeW07Ci0KLSAga25vdyAoYmZkX2FzeW1ib2xfZmxhdm91ciAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpCi0JPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyKTsKLSAgZXN5bSA9IGVjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSk7Ci0gIGVzeW0tPmxvY2FsID0gZmFsc2U7Ci0gIGVzeW0tPm5hdGl2ZSA9IHhtYWxsb2MgKGRlYnVnX3N3YXAtPmV4dGVybmFsX2V4dF9zaXplKTsKLSAgKCpkZWJ1Z19zd2FwLT5zd2FwX2V4dF9vdXQpIChzdGRvdXRwdXQsIGV4dCwgZXN5bS0+bmF0aXZlKTsKLX0KLQotc3RhdGljIGludAotZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYykKLSAgICAgYXNlY3Rpb24gKnNlYzsKLXsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWNvZmZfZnJvYl9zeW1ib2wgKHN5bSwgcHVudHApCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgaW50ICpwdW50cDsKLXsKLSAgZWNvZmZfZnJvYl9zeW1ib2wgKHN5bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lY29mZl9wb3BfaW5zZXJ0ICgpCi17Ci0gIHBvcF9pbnNlcnQgKG9ial9wc2V1ZG9fdGFibGUpOwotfQotCi1jb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlY29mZl9mb3JtYXRfb3BzID0KLXsKLSAgYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyLAotICAwLAotICAxLAotICBvYmpfZWNvZmZfZnJvYl9zeW1ib2wsCi0gIGVjb2ZmX2Zyb2JfZmlsZSwKLSAgMCwKLSAgMCwgMCwKLSAgMCwgMCwKLSAgMCwKLSAgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubywKLSAgZWNvZmZfc3RhYiwKLSAgZWNvZmZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGVjb2ZmX3BvcF9pbnNlcnQsCi0gIGVjb2ZmX3NldF9leHQsCi0gIGVjb2ZmX3JlYWRfYmVnaW5faG9vaywKLSAgZWNvZmZfc3ltYm9sX25ld19ob29rLAotfTsKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmggYi9nYXMvY29uZmlnL29iai1lY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmNhMjU0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWVjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKiBFQ09GRiBvYmplY3QgZmlsZSBmb3JtYXQgaGVhZGVyIGZpbGUuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIE9CSl9FQ09GRiAxCi0KLS8qIFVzZSB0aGUgZ2VuZXJpYyBFQ09GRiBkZWJ1Z2dpbmcgY29kZS4gICovCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAxCi0KLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpbmNsdWRlICJlY29mZi5oIgotCi0vKiBGb3IgZWFjaCBnYXMgc3ltYm9sIHdlIGtlZXAgdHJhY2sgb2Ygd2hpY2ggZmlsZSBpdCBjYW1lIGZyb20sIG9mCi0gICB3aGV0aGVyIHdlIGhhdmUgZ2VuZXJhdGVkIGFuIEVDT0ZGIHN5bWJvbCBmb3IgaXQsIGFuZCB3aGV0aGVyIHRoZQotICAgc3ltYm9scyBpcyB1bmRlZmluZWQgKHRoaXMgbGFzdCBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggYSAuZXh0ZXJuCi0gICBzeW1ib2xzIGZyb20gYSAuY29tbSBzeW1ib2wpLiAgKi8KLQotc3RydWN0IGVjb2ZmX3N5X29iagotewotICBzdHJ1Y3QgZWZkciAqZWNvZmZfZmlsZTsKLSAgc3RydWN0IGxvY2Fsc3ltICplY29mZl9zeW1ib2w7Ci0gIHZhbHVlVCBlY29mZl9leHRlcm5fc2l6ZTsKLX07Ci0KLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgc3RydWN0IGVjb2ZmX3N5X29iagotCi0vKiBNb2RpZnkgdGhlIEVDT0ZGIHN5bWJvbC4gICovCi0jZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzeW1wLCBwdW50KSBlY29mZl9mcm9iX3N5bWJvbCAoc3ltcCkKLQotLyogVGhpcyBpcyB1c2VkIHRvIHdyaXRlIHRoZSBzeW1ib2xpYyBkYXRhIGluIHRoZSBmb3JtYXQgdGhhdCBCRkQKLSAgIGV4cGVjdHMgaXQuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZSgpIGVjb2ZmX2Zyb2JfZmlsZSAoKQotCi0vKiBXZSB1c2UgdGhlIEVDT0ZGIGZ1bmN0aW9ucyBhcyBvdXIgaG9va3MuICAqLwotI2RlZmluZSBvYmpfcmVhZF9iZWdpbl9ob29rIGVjb2ZmX3JlYWRfYmVnaW5faG9vawotI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rIGVjb2ZmX3N5bWJvbF9uZXdfaG9vawotCi0vKiBSZWNvcmQgZmlsZSBzd2l0Y2hlcyBpbiB0aGUgRUNPRkYgc3ltYm9sIHRhYmxlLiAgKi8KLSNkZWZpbmUgb2JqX2FwcF9maWxlKG5hbWUpIGVjb2ZmX25ld19maWxlIChuYW1lKQotCi0vKiBBdCB0aGUgbW9tZW50IHdlIGRvbid0IHdhbnQgdG8gZG8gYW55IHN0YWJzIHByb2Nlc3NpbmcgaW4gcmVhZC5jLiAgKi8KLSNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQihzZWcsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpIFwKLSAgZWNvZmZfc3RhYiAoKHNlZyksICh3aGF0KSwgKHN0cmluZyksICh0eXBlKSwgKG90aGVyKSwgKGRlc2MpKQotCi0jZGVmaW5lIEVNSVRfU0VDVElPTl9TWU1CT0xTCQkwCi0jZGVmaW5lIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYyhTRUMpCTEKLQotI2RlZmluZSBvYmpfZWNvZmZfc2V0X2V4dCBlY29mZl9zZXRfZXh0Ci1leHRlcm4gdm9pZCBvYmpfZWNvZmZfc2V0X2V4dCBQQVJBTVMgKChzeW1ib2xTICosIEVYVFIgKikpOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWxmLmMgYi9nYXMvY29uZmlnL29iai1lbGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViODE2OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lbGYuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NDYgKzAsMCBAQAotLyogRUxGIG9iamVjdCBmaWxlIGZvcm1hdAotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5My05OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIE9CSl9IRUFERVIgIm9iai1lbGYuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLSNpZm5kZWYgRUNPRkZfREVCVUdHSU5HCi0jZGVmaW5lIEVDT0ZGX0RFQlVHR0lORyAwCi0jZWxzZQotI2RlZmluZSBORUVEX0VDT0ZGX0RFQlVHCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSNpbmNsdWRlICJlY29mZi5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19BTFBIQQotI2luY2x1ZGUgImVsZi9hbHBoYS5oIgotI2VuZGlmCi0KLSNpZmRlZiBUQ19NSVBTCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNlbmRpZgotCi0jaWZkZWYgVENfUFBDCi0jaW5jbHVkZSAiZWxmL3BwYy5oIgotI2VuZGlmCi0KLXN0YXRpYyBiZmRfdm1hIGVsZl9zX2dldF9zaXplIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgZWxmX3Nfc2V0X3NpemUgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYmZkX3ZtYSBlbGZfc19nZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc19zZXRfYWxpZ24gUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgdm9pZCBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotc3RhdGljIGludCBlbGZfc2VjX3N5bV9va19mb3JfcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgYWRqdXN0X3N0YWJfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotc3RhdGljIGJvb2xlYW4gZWxmX2dldF9leHRyIFBBUkFNUyAoKGFzeW1ib2wgKiwgRVhUUiAqKSk7Ci1zdGF0aWMgdm9pZCBlbGZfc2V0X2luZGV4IFBBUkFNUyAoKGFzeW1ib2wgKiwgYmZkX3NpemVfdHlwZSkpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIG9ial9lbGZfbGluZSBQQVJBTVMgKChpbnQpKTsKLXZvaWQgb2JqX2VsZl92ZXJzaW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9zaXplIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl90eXBlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgb2JqX2VsZl9pZGVudCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfd2VhayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfbG9jYWwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3N5bXZlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfdnRhYmxlX2luaGVyaXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBvYmpfZWxmX3Z0YWJsZV9lbnRyeSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfc3Vic2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG9ial9lbGZfcG9wc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBlbGZfcHNldWRvX3RhYmxlW10gPQotewotICB7ImNvbW0iLCBvYmpfZWxmX2NvbW1vbiwgMH0sCi0gIHsiY29tbW9uIiwgb2JqX2VsZl9jb21tb24sIDF9LAotICB7ImlkZW50Iiwgb2JqX2VsZl9pZGVudCwgMH0sCi0gIHsibG9jYWwiLCBvYmpfZWxmX2xvY2FsLCAwfSwKLSAgeyJwcmV2aW91cyIsIG9ial9lbGZfcHJldmlvdXMsIDB9LAotICB7InNlY3Rpb24iLCBvYmpfZWxmX3NlY3Rpb24sIDB9LAotICB7InNlY3Rpb24ucyIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdCIsIG9ial9lbGZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdC5zIiwgb2JqX2VsZl9zZWN0aW9uLCAwfSwKLSAgeyJwdXNoc2VjdGlvbiIsIG9ial9lbGZfc2VjdGlvbiwgMX0sCi0gIHsicG9wc2VjdGlvbiIsIG9ial9lbGZfcG9wc2VjdGlvbiwgMH0sCi0gIHsic2l6ZSIsIG9ial9lbGZfc2l6ZSwgMH0sCi0gIHsidHlwZSIsIG9ial9lbGZfdHlwZSwgMH0sCi0gIHsidmVyc2lvbiIsIG9ial9lbGZfdmVyc2lvbiwgMH0sCi0gIHsid2VhayIsIG9ial9lbGZfd2VhaywgMH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgZm9yIHN0YWJzLWluLWVsZiBjb25maWd1cmF0aW9ucy4gICovCi0gIHsibGluZSIsIG9ial9lbGZfbGluZSwgMH0sCi0KLSAgLyogVGhpcyBpcyBhIEdOVSBleHRlbnNpb24gdG8gaGFuZGxlIHN5bWJvbCB2ZXJzaW9ucy4gICovCi0gIHsic3ltdmVyIiwgb2JqX2VsZl9zeW12ZXIsIDB9LAotCi0gIC8qIEEgR05VIGV4dGVuc2lvbiB0byBjaGFuZ2Ugc3Vic2VjdGlvbiBvbmx5LiAgKi8KLSAgeyJzdWJzZWN0aW9uIiwgb2JqX2VsZl9zdWJzZWN0aW9uLCAwfSwKLQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gYWlkIGluIGdhcmJhZ2UgY29sbGVjdGluZyBDKysgdnRhYmxlcy4gICovCi0gIHsidnRhYmxlX2luaGVyaXQiLCBvYmpfZWxmX3Z0YWJsZV9pbmhlcml0LCAwfSwKLSAgeyJ2dGFibGVfZW50cnkiLCBvYmpfZWxmX3Z0YWJsZV9lbnRyeSwgMH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgZm9yIGR3YXJmLiAqLwotICB7IjJieXRlIiwgY29ucywgMn0sCi0gIHsiNGJ5dGUiLCBjb25zLCA0fSwKLSAgeyI4Ynl0ZSIsIGNvbnMsIDh9LAotCi0gIC8qIFdlIG5lZWQgdG8gdHJhcCB0aGUgc2VjdGlvbiBjaGFuZ2luZyBjYWxscyB0byBoYW5kbGUgLnByZXZpb3VzLiAgKi8KLSAgeyJkYXRhIiwgb2JqX2VsZl9kYXRhLCAwfSwKLSAgeyJ0ZXh0Iiwgb2JqX2VsZl90ZXh0LCAwfSwKLQotICAvKiBFbmQgc2VudGluZWwuICAqLwotICB7TlVMTH0sCi19OwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIGVjb2ZmX2RlYnVnX3BzZXVkb190YWJsZVtdID0KLXsKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIC8qIENPRkYgc3R5bGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBFQ09GRi4gLmxuIGlzIG5vdCB1c2VkOyAubG9jCi0gICAgIGlzIHVzZWQgaW5zdGVhZC4gICovCi0gIHsgImRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9kZWYsCTAgfSwKLSAgeyAiZGltIiwJZWNvZmZfZGlyZWN0aXZlX2RpbSwJMCB9LAotICB7ICJlbmRlZiIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwJMCB9LAotICB7ICJmaWxlIiwJZWNvZmZfZGlyZWN0aXZlX2ZpbGUsCTAgfSwKLSAgeyAic2NsIiwJZWNvZmZfZGlyZWN0aXZlX3NjbCwJMCB9LAotICB7ICJ0YWciLAllY29mZl9kaXJlY3RpdmVfdGFnLAkwIH0sCi0gIHsgInZhbCIsCWVjb2ZmX2RpcmVjdGl2ZV92YWwsCTAgfSwKLQotICAvKiBDT0ZGIGRlYnVnZ2luZyByZXF1aXJlcyBwc2V1ZG8tb3BzIC5zaXplIGFuZCAudHlwZSwgYnV0IEVMRgotICAgICBhbHJlYWR5IGhhcyBtZWFuaW5ncyBmb3IgdGhvc2UuICBXZSB1c2UgLmVzaXplIGFuZCAuZXR5cGUKLSAgICAgaW5zdGVhZC4gIFRoZXNlIGFyZSBvbmx5IGdlbmVyYXRlZCBieSBnY2MgYW55aG93LiAgKi8KLSAgeyAiZXNpemUiLAllY29mZl9kaXJlY3RpdmVfc2l6ZSwJMCB9LAotICB7ICJldHlwZSIsCWVjb2ZmX2RpcmVjdGl2ZV90eXBlLAkwIH0sCi0KLSAgLyogRUNPRkYgc3BlY2lmaWMgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgeyAiYmVnaW4iLAllY29mZl9kaXJlY3RpdmVfYmVnaW4sCTAgfSwKLSAgeyAiYmVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9iZW5kLAkwIH0sCi0gIHsgImVuZCIsCWVjb2ZmX2RpcmVjdGl2ZV9lbmQsCTAgfSwKLSAgeyAiZW50IiwJZWNvZmZfZGlyZWN0aXZlX2VudCwJMCB9LAotICB7ICJmbWFzayIsCWVjb2ZmX2RpcmVjdGl2ZV9mbWFzaywJMCB9LAotICB7ICJmcmFtZSIsCWVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSwJMCB9LAotICB7ICJsb2MiLAllY29mZl9kaXJlY3RpdmVfbG9jLAkwIH0sCi0gIHsgIm1hc2siLAllY29mZl9kaXJlY3RpdmVfbWFzaywJMCB9LAotCi0gIC8qIE90aGVyIEVDT0ZGIGRpcmVjdGl2ZXMuICAqLwotICB7ICJleHRlcm4iLAllY29mZl9kaXJlY3RpdmVfZXh0ZXJuLAkwIH0sCi0KLSAgLyogVGhlc2UgYXJlIHVzZWQgb24gSXJpeC4gIEkgZG9uJ3Qga25vdyBob3cgdG8gaW1wbGVtZW50IHRoZW0uICAqLwotICB7ICJhbGlhcyIsCXNfaWdub3JlLAkJMCB9LAotICB7ICJiZ25iIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgImVuZGIiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAibGFiIiwJc19pZ25vcmUsCQkwIH0sCi0gIHsgIm5vYWxpYXMiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidmVyc3RhbXAiLAlzX2lnbm9yZSwJCTAgfSwKLSAgeyAidnJlZyIsCXNfaWdub3JlLAkJMCB9LAotI2VuZGlmCi0KLSAge05VTEx9CQkJLyogZW5kIHNlbnRpbmVsICovCi19OwotCi0jdW5kZWYgTk9fUkVMT0MKLSNpbmNsdWRlICJhb3V0L2FvdXQ2NC5oIgotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzLiAgKi8KLQotdm9pZAotZWxmX2JlZ2luICgpCi17Ci0gIC8qIEFkZCBzeW1ib2xzIGZvciB0aGUga25vd24gc2VjdGlvbnMgdG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LAotCQkJCQkJCQlURVhUX1NFQ1RJT05fTkFNRSkpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsCi0JCQkJCQkJCURBVEFfU0VDVElPTl9OQU1FKSkpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzZWN0aW9uX3N5bWJvbCAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwKLQkJCQkJCQkJQlNTX1NFQ1RJT05fTkFNRSkpKTsKLX0KLQotdm9pZAotZWxmX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAoZWxmX3BzZXVkb190YWJsZSk7Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgcG9wX2luc2VydCAoZWNvZmZfZGVidWdfcHNldWRvX3RhYmxlKTsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZl9zX2dldF9zaXplIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgcmV0dXJuIFNfR0VUX1NJWkUgKHN5bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfc19zZXRfc2l6ZSAoc3ltLCBzeikKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBiZmRfdm1hIHN6OwotewotICBTX1NFVF9TSVpFIChzeW0sIHN6KTsKLX0KLQotc3RhdGljIGJmZF92bWEKLWVsZl9zX2dldF9hbGlnbiAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHJldHVybiBTX0dFVF9BTElHTiAoc3ltKTsKLX0KLQotc3RhdGljIHZvaWQKLWVsZl9zX3NldF9hbGlnbiAoc3ltLCBhbGlnbikKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBiZmRfdm1hIGFsaWduOwotewotICBTX1NFVF9BTElHTiAoc3ltLCBhbGlnbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcyAoZGVzdCwgc3JjKQotICAgICBzeW1ib2xTICpkZXN0LCAqc3JjOwotewotICBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUyAoZGVzdCwgc3JjKTsKLX0KLQotc3RhdGljIGludAotZWxmX3NlY19zeW1fb2tfZm9yX3JlbG9jIChzZWMpCi0gICAgIGFzZWN0aW9uICpzZWM7Ci17Ci0gIHJldHVybiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYyk7Ci19Ci0KLXZvaWQKLWVsZl9maWxlX3N5bWJvbCAocykKLSAgICAgY2hhciAqczsKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIHN5bSA9IHN5bWJvbF9uZXcgKHMsIGFic29sdXRlX3NlY3Rpb24sICh2YWx1ZVQpIDAsIChzdHJ1Y3QgZnJhZyAqKSAwKTsKLSAgc3ltYm9sX3NldF9mcmFnIChzeW0sICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfRklMRTsKLQotICBpZiAoc3ltYm9sX3Jvb3RQICE9IHN5bSkKLSAgICB7Ci0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2luc2VydCAoc3ltLCBzeW1ib2xfcm9vdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotI2lmZGVmIERFQlVHCi0gICAgICB2ZXJpZnlfc3ltYm9sX2NoYWluIChzeW1ib2xfcm9vdFAsIHN5bWJvbF9sYXN0UCk7Ci0jZW5kaWYKLSAgICB9Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGVjb2ZmX25ld19maWxlIChzKTsKLSNlbmRpZgotfQotCi12b2lkCi1vYmpfZWxmX2NvbW1vbiAoaXNfY29tbW9uKQotICAgICBpbnQgaXNfY29tbW9uOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBzaXplOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgaGF2ZV9hbGlnbjsKLQotICBpZiAoZmxhZ19tcmkgJiYgaXNfY29tbW9uKQotICAgIHsKLSAgICAgIHNfbXJpX2NvbW1vbiAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICBrbm93IChzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBoYXZlX2FsaWduID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGhhdmVfYWxpZ24gPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICBpZiAoISBoYXZlX2FsaWduIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotICAgIHsKLSAgICAgIGlmICghIGhhdmVfYWxpZ24pCi0JdGVtcCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKHRlbXAgPCAwKQotCSAgICB7Ci0JICAgICAgdGVtcCA9IDA7Ci0JICAgICAgYXNfd2FybiAoXygiQ29tbW9uIGFsaWdubWVudCBuZWdhdGl2ZTsgMCBhc3N1bWVkIikpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwpCi0JewotCSAgc2VnVCBvbGRfc2VjOwotCSAgaW50IG9sZF9zdWJzZWM7Ci0JICBjaGFyICpwZnJhZzsKLQkgIGludCBhbGlnbjsKLQotCS8qIGFsbG9jYXRlX2JzczogKi8KLQkgIG9sZF9zZWMgPSBub3dfc2VnOwotCSAgb2xkX3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0JICBpZiAodGVtcCkKLQkgICAgewotCSAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLwotCSAgICAgIGZvciAoYWxpZ24gPSAwOyAodGVtcCAmIDEpID09IDA7IHRlbXAgPj49IDEsICsrYWxpZ24pOwotCSAgICAgIGlmICh0ZW1wICE9IDEpCi0JCXsKLQkJICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFsaWduID0gMDsKLQkgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkgICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKSAwKTsKLQkgICpwZnJhZyA9IDA7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLQkgIFNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQlhbGxvY2F0ZV9jb21tb246Ci0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfY29tX3NlY3Rpb25fcHRyKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQotCXsKLQkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCSAgICA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfbG9jYWwgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwgPSAxOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgc3ltYm9sX2dldF9vYmogKHN5bWJvbFApLT5sb2NhbCA9IDE7Ci0gICAgICBpZiAoYyA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCSAgICBjID0gJ1xuJzsKLQl9Ci0gICAgfQotICB3aGlsZSAoYyA9PSAnLCcpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgc2VnVCBwcmV2aW91c19zZWN0aW9uOwotc3RhdGljIGludCBwcmV2aW91c19zdWJzZWN0aW9uOwotCi1zdHJ1Y3Qgc2VjdGlvbl9zdGFjawotewotICBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqbmV4dDsKLSAgc2VnVCBzZWcsIHByZXZfc2VnOwotICBpbnQgc3Vic2VnLCBwcmV2X3N1YnNlZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9zdGFjayAqc2VjdGlvbl9zdGFjazsKLQotCi0vKiBIYW5kbGUgdGhlIC5zZWN0aW9uIHBzZXVkby1vcC4gIFRoaXMgY29kZSBzdXBwb3J0cyB0d28gZGlmZmVyZW50Ci0gICBzeW50YXhlcy4KLQotICAgVGhlIGZpcnN0IGlzIGZvdW5kIG9uIFNvbGFyaXMsIGFuZCBsb29rcyBsaWtlCi0gICAgICAgLnNlY3Rpb24gIi5zZWMxIiwjYWxsb2MsI2V4ZWNpbnN0ciwjd3JpdGUKLSAgIEhlcmUgdGhlIG5hbWVzIGFmdGVyICcjJyBhcmUgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZQotICAgc2VjdGlvbi4gIEknbSBub3Qgc3VyZSBob3cgaXQgZGV0ZXJtaW5lcyB0aGUgU0hUXyogdHlwZSAoQkZECi0gICBkb2Vzbid0IHJlYWxseSBnaXZlIHVzIGNvbnRyb2wgb3ZlciB0aGUgdHlwZSwgYW55aG93KS4KLQotICAgVGhlIHNlY29uZCBmb3JtYXQgaXMgZm91bmQgb24gVW5peFdhcmUsIGFuZCBwcm9iYWJseSBtb3N0IFNWUjQKLSAgIG1hY2hpbmVzLCBhbmQgbG9va3MgbGlrZQotICAgICAgIC5zZWN0aW9uIC5zZWMxLCJhIixAcHJvZ2JpdHMKLSAgIFRoZSBxdW90ZWQgc3RyaW5nIG1heSBjb250YWluIGFueSBjb21iaW5hdGlvbiBvZiBhLCB3LCB4LCBhbmQKLSAgIHJlcHJlc2VudHMgdGhlIFNIRl8qIGZsYWdzIHRvIHR1cm4gb24gZm9yIHRoZSBzZWN0aW9uLiAgVGhlIHN0cmluZwotICAgYmVnaW5uaW5nIHdpdGggJ0AnIGNhbiBiZSBwcm9nYml0cyBvciBub2JpdHMuICBUaGVyZSBzaG91bGQgYmUKLSAgIG90aGVyIHBvc3NpYmlsaXRpZXMsIGJ1dCBJIGRvbid0IGtub3cgd2hhdCB0aGV5IGFyZS4gIEluIGFueSBjYXNlLAotICAgQkZEIGRvZXNuJ3QgcmVhbGx5IGxldCB1cyBzZXQgdGhlIHNlY3Rpb24gdHlwZS4gICovCi0KLS8qIENlcnRhaW4gbmFtZWQgc2VjdGlvbnMgaGF2ZSBwYXJ0aWN1bGFyIGRlZmluZWQgdHlwZXMsIGxpc3RlZCBvbiBwLgotICAgNC0xOSBvZiB0aGUgQUJJLiAgKi8KLXN0cnVjdCBzcGVjaWFsX3NlY3Rpb24KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHR5cGU7Ci0gIGludCBhdHRyaWJ1dGVzOwotfTsKLQotc3RhdGljIHN0cnVjdCBzcGVjaWFsX3NlY3Rpb24gY29uc3Qgc3BlY2lhbF9zZWN0aW9uc1tdID0KLXsKLSAgeyAiLmJzcyIsCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmNvbW1lbnQiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmRhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURQkJfSwKLSAgeyAiLmRhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUJCX0sCi0gIHsgIi5kZWJ1ZyIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuZmluaSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIuaW5pdCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotICB7ICIubGluZSIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIubm90ZSIsCVNIVF9OT1RFLAkwCQkJCX0sCi0gIHsgIi5yb2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5yb2RhdGExIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MJCQl9LAotICB7ICIudGV4dCIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX0VYRUNJTlNUUgl9LAotCi0jaWZkZWYgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSAgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMKLSNlbmRpZgotCi0jaWYgMAotICAvKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gbmFtZXMgYXJlIHNwZWNpYWwsIGJ1dCB0aGV5IGNhbiBub3QKLSAgICAgcmVhc29uYWJseSBhcHBlYXIgaW4gYXNzZW1ibGVyIGNvZGUuICBTb21lIG9mIHRoZSBhdHRyaWJ1dGVzIGFyZQotICAgICBwcm9jZXNzb3IgZGVwZW5kZW50LiAgKi8KLSAgeyAiLmR5bmFtaWMiLAlTSFRfRFlOQU1JQywJU0hGX0FMTE9DIC8qICsgU0hGX1dSSVRFICovIAl9LAotICB7ICIuZHluc3RyIiwJU0hUX1NUUlRBQiwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmR5bnN5bSIsCVNIVF9EWU5TWU0sCVNIRl9BTExPQwkJCX0sCi0gIHsgIi5nb3QiLAlTSFRfUFJPR0JJVFMsCTAJCQkJfSwKLSAgeyAiLmhhc2giLAlTSFRfSEFTSCwJU0hGX0FMTE9DCQkJfSwKLSAgeyAiLmludGVycCIsCVNIVF9QUk9HQklUUywJLyogU0hGX0FMTE9DICovCQkJfSwKLSAgeyAiLnBsdCIsCVNIVF9QUk9HQklUUywJMAkJCQl9LAotICB7ICIuc2hzdHJ0YWIiLFNIVF9TVFJUQUIsCTAJCQkJfSwKLSAgeyAiLnN0cnRhYiIsCVNIVF9TVFJUQUIsCS8qIFNIRl9BTExPQyAqLwkJCX0sCi0gIHsgIi5zeW10YWIiLAlTSFRfU1lNVEFCLAkvKiBTSEZfQUxMT0MgKi8JCQl9LAotI2VuZGlmCi0KLSAgeyBOVUxMLAkwLAkJMAkJCQl9Ci19OwotCi12b2lkCi1vYmpfZWxmX2NoYW5nZV9zZWN0aW9uIChuYW1lLCB0eXBlLCBhdHRyLCBwdXNoKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgdHlwZSwgYXR0ciwgcHVzaDsKLXsKLSAgaW50IG5ld19zZWM7Ci0gIHNlZ1Qgc2VjOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICAvKiBTd2l0Y2ggdG8gdGhlIHNlY3Rpb24sIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChwdXNoKQotICAgIHsKLSAgICAgIHN0cnVjdCBzZWN0aW9uX3N0YWNrICplbHQ7Ci0gICAgICBlbHQgPSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZWN0aW9uX3N0YWNrKSk7Ci0gICAgICBlbHQtPm5leHQgPSBzZWN0aW9uX3N0YWNrOwotICAgICAgZWx0LT5zZWcgPSBub3dfc2VnOwotICAgICAgZWx0LT5wcmV2X3NlZyA9IHByZXZpb3VzX3NlY3Rpb247Ci0gICAgICBlbHQtPnN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBlbHQtPnByZXZfc3Vic2VnID0gcHJldmlvdXNfc3Vic2VjdGlvbjsKLSAgICAgIHNlY3Rpb25fc3RhY2sgPSBlbHQ7Ci0gICAgfQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgbmV3X3NlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsIG5hbWUpID09IE5VTEw7Ci0gIHNlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotCi0gIGlmIChuZXdfc2VjKQotICAgIHsKLSAgICAgIGZsYWd3b3JkIGZsYWdzOwotICAgICAgc3ltYm9sUyAqc2Vjc3ltOwotICAgICAgaW50IGk7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgc3BlY2lhbCBzZWN0aW9ucy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotICAgICAgICBpZiAoc3RyY21wIChuYW1lLCBzcGVjaWFsX3NlY3Rpb25zW2ldLm5hbWUpID09IDApCi0gICAgICAgICAgewotCSAgICBpZiAodHlwZSA9PSBTSFRfTlVMTCkKLQkgICAgICB0eXBlID0gc3BlY2lhbF9zZWN0aW9uc1tpXS50eXBlOwotCSAgICBlbHNlIGlmICh0eXBlICE9IHNwZWNpYWxfc2VjdGlvbnNbaV0udHlwZSkKLQkgICAgICBhc193YXJuIChfKCJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIHR5cGUgZm9yICVzIiksIG5hbWUpOwotCi0JICAgIGlmICgoYXR0ciAmfiBzcGVjaWFsX3NlY3Rpb25zW2ldLmF0dHJpYnV0ZXMpICE9IDApCi0JICAgICAgewotCSAgICAgICAgLyogQXMgYSBHTlUgZXh0ZW5zaW9uLCB3ZSBwZXJtaXQgYSAubm90ZSBzZWN0aW9uIHRvIGJlCi0JCSAgIGFsbG9jYXRhYmxlLiAgSWYgdGhlIGxpbmtlciBzZWVzIGFuIGFsbG9jYXRlYWJsZSAubm90ZQotCQkgICBzZWN0aW9uLCBpdCB3aWxsIGNyZWF0ZSBhIFBUX05PVEUgc2VnbWVudCBpbiB0aGUgb3V0cHV0Ci0JCSAgIGZpbGUuICAqLwotCQlpZiAoc3RyY21wIChuYW1lLCAiLm5vdGUiKSAhPSAwCi0JCSAgICB8fCBhdHRyICE9IFNIRl9BTExPQykKLQkJICBhc193YXJuIChfKCJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIGF0dHJpYnV0ZXMgZm9yICVzIiksCi0JCQkgICBuYW1lKTsKLQkgICAgICB9Ci0JICAgIGF0dHIgfD0gc3BlY2lhbF9zZWN0aW9uc1tpXS5hdHRyaWJ1dGVzOwotCSAgICBicmVhazsKLQkgIH0KLQotICAgICAgLyogQ29udmVydCBFTEYgdHlwZSBhbmQgZmxhZ3MgdG8gQkZEIGZsYWdzLiAgKi8KLSAgICAgIGZsYWdzID0gKFNFQ19SRUxPQwotCSAgICAgICB8ICgoYXR0ciAmIFNIRl9XUklURSkgPyAwIDogU0VDX1JFQURPTkxZKQotCSAgICAgICB8ICgoYXR0ciAmIFNIRl9BTExPQykgPyBTRUNfQUxMT0MgOiAwKQotCSAgICAgICB8ICgoKGF0dHIgJiBTSEZfQUxMT0MpICYmIHR5cGUgIT0gU0hUX05PQklUUykgPyBTRUNfTE9BRCA6IDApCi0JICAgICAgIHwgKChhdHRyICYgU0hGX0VYRUNJTlNUUikgPyBTRUNfQ09ERSA6IDApKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9mbGFncwotICAgICAgZmxhZ3MgPSBtZF9lbGZfc2VjdGlvbl9mbGFncyAoZmxhZ3MsIGF0dHIsIHR5cGUpOwotI2VuZGlmCi0KLSAgICAgIC8qIFByZXZlbnQgU0VDX0hBU19DT05URU5UUyBmcm9tIGJlaW5nIGluYWR2ZXJ0ZW50bHkgc2V0LiAgKi8KLSAgICAgIGlmICh0eXBlID09IFNIVF9OT0JJVFMpCi0gICAgICAgIHNlZ19pbmZvIChzZWMpLT5ic3MgPSAxOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0KLSAgICAgIC8qIEFkZCBhIHN5bWJvbCBmb3IgdGhpcyBzZWN0aW9uIHRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgc2Vjc3ltID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotICAgICAgaWYgKHNlY3N5bSAhPSBOVUxMKQotCXN5bWJvbF9zZXRfYmZkc3ltIChzZWNzeW0sIHNlYy0+c3ltYm9sKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc2VjdGlvbl9zeW1ib2wgKHNlYykpOwotICAgIH0KLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gICAgICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1pbnQKLW9ial9lbGZfcGFyc2Vfc2VjdGlvbl9sZXR0ZXJzIChzdHIsIGxlbikKLSAgICAgY2hhciAqc3RyOwotICAgICBzaXplX3QgbGVuOwotewotICBpbnQgYXR0ciA9IDA7Ci0KLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc3dpdGNoICgqc3RyKQotCXsKLQljYXNlICdhJzoKLQkgIGF0dHIgfD0gU0hGX0FMTE9DOwotCSAgYnJlYWs7Ci0JY2FzZSAndyc6Ci0JICBhdHRyIHw9IFNIRl9XUklURTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgYXR0ciB8PSBTSEZfRVhFQ0lOU1RSOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHsKLQkgICAgY2hhciAqYmFkX21zZyA9IF8oIlVucmVjb2duaXplZCAuc2VjdGlvbiBhdHRyaWJ1dGU6IHdhbnQgYSx3LHgiKTsKLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIKLQkgICAgaW50IG1kX2F0dHIgPSBtZF9lbGZfc2VjdGlvbl9sZXR0ZXIgKCpzdHIsICZiYWRfbXNnKTsKLQkgICAgaWYgKG1kX2F0dHIgPj0gMCkKLQkgICAgICBhdHRyIHw9IG1kX2F0dHI7Ci0JICAgIGVsc2UKLSNlbmRpZgotCSAgICAgIHsKLQkJYXNfd2FybiAoYmFkX21zZyk7Ci0JCWF0dHIgPSAtMTsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBzdHIrKywgbGVuLS07Ci0gICAgfQotCi0gIHJldHVybiBhdHRyOwotfQotCi1pbnQKLW9ial9lbGZfc2VjdGlvbl93b3JkIChzdHIsIGxlbikKLSAgICAgY2hhciAqc3RyOwotICAgICBzaXplX3QgbGVuOwotewotICBpZiAobGVuID09IDUgJiYgc3RybmNtcCAoc3RyLCAid3JpdGUiLCA1KSA9PSAwKQotICAgIHJldHVybiBTSEZfV1JJVEU7Ci0gIGlmIChsZW4gPT0gNSAmJiBzdHJuY21wIChzdHIsICJhbGxvYyIsIDUpID09IDApCi0gICAgcmV0dXJuIFNIRl9BTExPQzsKLSAgaWYgKGxlbiA9PSA5ICYmIHN0cm5jbXAgKHN0ciwgImV4ZWNpbnN0ciIsIDkpID09IDApCi0gICAgcmV0dXJuIFNIRl9FWEVDSU5TVFI7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl93b3JkCi0gIHsKLSAgICBpbnQgbWRfYXR0ciA9IG1kX2VsZl9zZWN0aW9uX3dvcmQgKHN0ciwgbGVuKTsKLSAgICBpZiAobWRfYXR0ciA+PSAwKQotICAgICAgcmV0dXJuIG1kX2F0dHI7Ci0gIH0KLSNlbmRpZgotCi0gIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBzZWN0aW9uIGF0dHJpYnV0ZSIpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotb2JqX2VsZl9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIGlmIChsZW4gPT0gOCAmJiBzdHJuY21wIChzdHIsICJwcm9nYml0cyIsIDgpID09IDApCi0gICAgcmV0dXJuIFNIVF9QUk9HQklUUzsKLSAgaWYgKGxlbiA9PSA2ICYmIHN0cm5jbXAgKHN0ciwgIm5vYml0cyIsIDYpID09IDApCi0gICAgcmV0dXJuIFNIVF9OT0JJVFM7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl90eXBlCi0gIHsKLSAgICBpbnQgbWRfdHlwZSA9IG1kX2VsZl9zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKTsKLSAgICBpZiAobWRfdHlwZSA+PSAwKQotICAgICAgcmV0dXJuIG1kX3R5cGU7Ci0gIH0KLSNlbmRpZgotCi0gIGFzX3dhcm4gKF8oIlVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiKSk7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1vYmpfZWxmX3NlY3Rpb24gKHB1c2gpCi0gICAgIGludCBwdXNoOwotewotICBjaGFyICpuYW1lLCAqYmVnLCAqZW5kOwotICBpbnQgdHlwZSwgYXR0ciwgZHVtbXk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgbXJpX3R5cGU7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gICAgICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgICAgIHByZXZpb3VzX3N1YnNlY3Rpb24gPSBub3dfc3Vic2VnOwotCi0gICAgICBzX21yaV9zZWN0ICgmbXJpX3R5cGUpOwotCi0jaWZkZWYgbWRfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLSAgICAgIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogR2V0IG5hbWUgb2Ygc2VjdGlvbi4gICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotICAgIHsKLSAgICAgIG5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmR1bW15KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JewotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKDAgPT0gc3RyY2hyICgiXG5cdCw7ICIsICplbmQpKQotCWVuZCsrOwotICAgICAgaWYgKGVuZCA9PSBpbnB1dF9saW5lX3BvaW50ZXIpCi0JewotCSAgYXNfd2FybiAoXygiTWlzc2luZyBzZWN0aW9uIG5hbWUiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAKLSAgICAgIG5hbWUgPSB4bWFsbG9jIChlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxKTsKLSAgICAgIG1lbWNweSAobmFtZSwgaW5wdXRfbGluZV9wb2ludGVyLCBlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgbmFtZVtlbmQgLSBpbnB1dF9saW5lX3BvaW50ZXJdID0gJ1wwJzsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGVuZDsKLSAgICB9Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICB0eXBlID0gU0hUX05VTEw7Ci0gIGF0dHIgPSAwOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICAvKiBTa2lwIHRoZSBjb21tYS4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyInKQotCXsKLQkgIGJlZyA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmZHVtbXkpOwotCSAgaWYgKGJlZyA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGF0dHIgfD0gb2JqX2VsZl9wYXJzZV9zZWN0aW9uX2xldHRlcnMgKGJlZywgc3RybGVuIChiZWcpKTsKLQotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgY2hhciBjOwotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoYyA9PSAnIicpCi0JCXsKLQkJICBiZWcgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmR1bW15KTsKLQkJICBpZiAoYmVnID09IE5VTEwpCi0JCSAgICB7Ci0JCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICB0eXBlID0gb2JqX2VsZl9zZWN0aW9uX3R5cGUgKGJlZywgc3RybGVuIChiZWcpKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGMgPT0gJ0AnIHx8IGMgPT0gJyUnKQotCQl7Ci0JCSAgYmVnID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIHR5cGUgPSBvYmpfZWxmX3NlY3Rpb25fdHlwZSAoYmVnLCBpbnB1dF9saW5lX3BvaW50ZXIgLSBiZWcpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZG8KLQkgICAgewotCSAgICAgIGNoYXIgYzsKLQotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIycpCi0JCXsKLQkJICBhc193YXJuIChfKCJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlIC0gY2hhcmFjdGVyIGZvbGxvd2luZyBuYW1lIGlzIG5vdCAnIyciKSk7Ci0JCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBiZWcgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLQkgICAgICBhdHRyIHw9IG9ial9lbGZfc2VjdGlvbl93b3JkIChiZWcsIGlucHV0X2xpbmVfcG9pbnRlciAtIGJlZyk7Ci0KLQkgICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICAgIH0KLQkgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQkgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBvYmpfZWxmX2NoYW5nZV9zZWN0aW9uIChuYW1lLCB0eXBlLCBhdHRyLCBwdXNoKTsKLX0KLQotLyogQ2hhbmdlIHRvIHRoZSAuZGF0YSBzZWN0aW9uLiAgKi8KLQotdm9pZAotb2JqX2VsZl9kYXRhIChpKQotICAgICBpbnQgaTsKLXsKLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc19kYXRhIChpKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLS8qIENoYW5nZSB0byB0aGUgLnRleHQgc2VjdGlvbi4gICovCi0KLXZvaWQKLW9ial9lbGZfdGV4dCAoaSkKLSAgICAgaW50IGk7Ci17Ci0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0gIHNfdGV4dCAoaSk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9zdWJzZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChub3dfc2VnLCAoc3Vic2VnVCkgdGVtcCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNpZmRlZiBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vawotICBtZF9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKTsKLSNlbmRpZgotfQotCi0vKiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgcHJvY2Vzc29yIGJhY2tlbmRzIGlmIHRoZXkgY2hhbmdlCi0gICBzZWN0aW9ucy4gICovCi0KLXZvaWQKLW9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayAoKQotewotICBwcmV2aW91c19zZWN0aW9uID0gbm93X3NlZzsKLSAgcHJldmlvdXNfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci19Ci0KLXZvaWQKLW9ial9lbGZfcHJldmlvdXMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc2VnVCBuZXdfc2VjdGlvbjsKLSAgaW50IG5ld19zdWJzZWN0aW9uOwotCi0gIGlmIChwcmV2aW91c19zZWN0aW9uID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIucHJldmlvdXMgd2l0aG91dCBjb3JyZXNwb25kaW5nIC5zZWN0aW9uOyBpZ25vcmVkIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgbmV3X3NlY3Rpb24gPSBwcmV2aW91c19zZWN0aW9uOwotICBuZXdfc3Vic2VjdGlvbiA9IHByZXZpb3VzX3N1YnNlY3Rpb247Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSBub3dfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gbm93X3N1YnNlZzsKLSAgc3Vic2VnX3NldCAobmV3X3NlY3Rpb24sIG5ld19zdWJzZWN0aW9uKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3BvcHNlY3Rpb24gKHh4eCkKLSAgICAgaW50IHh4eDsKLXsKLSAgc3RydWN0IHNlY3Rpb25fc3RhY2sgKnRvcCA9IHNlY3Rpb25fc3RhY2s7Ci0KLSAgaWYgKHRvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLnBvcHNlY3Rpb24gd2l0aG91dCBjb3JyZXNwb25kaW5nIC5wdXNoc2VjdGlvbjsgaWdub3JlZCIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIHNlY3Rpb25fc3RhY2sgPSB0b3AtPm5leHQ7Ci0gIHByZXZpb3VzX3NlY3Rpb24gPSB0b3AtPnByZXZfc2VnOwotICBwcmV2aW91c19zdWJzZWN0aW9uID0gdG9wLT5wcmV2X3N1YnNlZzsKLSAgc3Vic2VnX3NldCAodG9wLT5zZWcsIHRvcC0+c3Vic2VnKTsKLSAgZnJlZSAodG9wKTsKLQotI2lmZGVmIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0gIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2xpbmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogQXNzdW1lIGRlbGltaXRlciBpcyBwYXJ0IG9mIGV4cHJlc3Npb24uICBCU0Q0LjIgYXMgZmFpbHMgd2l0aAotICAgICBkZWxpZ2h0ZnVsIGJ1Zywgc28gd2UgYXJlIG5vdCBiZWluZyBpbmNvbXBhdGlibGUgaGVyZS4gKi8KLSAgbmV3X2xvZ2ljYWxfbGluZSAoKGNoYXIgKikgTlVMTCwgKGludCkgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnN5bXZlciBwc2V1ZG8tb3AsIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lmeSBhCi0gICBzeW1ib2wgdmVyc2lvbi4gIFRoZSBzeW50YXggaXMgYGAuc3ltdmVyIE5BTUUsU1lNVkVSTkFNRScnLgotICAgU1lNVkVSTkFNRSBtYXkgY29udGFpbiBFTEZfVkVSX0NIUiAoJ0AnKSBjaGFyYWN0ZXJzLiAgVGhpcwotICAgcHNldWRvLW9wIGNhdXNlcyB0aGUgYXNzZW1ibGVyIHRvIGVtaXQgYSBzeW1ib2wgbmFtZWQgU1lNVkVSTkFNRQotICAgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgc3ltYm9sIE5BTUUuICAqLwotCi1zdGF0aWMgdm9pZAotb2JqX2VsZl9zeW12ZXIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltKS0+dmVyc2lvbmVkX25hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm11bHRpcGxlIC5zeW12ZXIgZGlyZWN0aXZlcyBmb3Igc3ltYm9sIGAlcyciKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBpbiAuc3ltdmVyIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChjICE9IEVMRl9WRVJfQ0hSKQotCWJyZWFrOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gYzsKLSAgICB9Ci0KLSAgc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKHN0cmNociAoc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lLCBFTEZfVkVSX0NIUikgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmVyc2lvbiBuYW1lIGluIGAlcycgZm9yIHN5bWJvbCBgJXMnIiksCi0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnZlcnNpb25lZF9uYW1lLCBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgaGFuZGxlcyB0aGUgLnZ0YWJsZV9pbmhlcml0IHBzZXVkby1vcCwgd2hpY2ggaXMgdXNlZCB0byBpbmRpY2F0ZQotICAgdG8gdGhlIGxpbmtlciB0aGUgaGllcmFyY2h5IGluIHdoaWNoIGEgcGFydGljdWxhciB0YWJsZSByZXNpZGVzLiAgVGhlCi0gICBzeW50YXggaXMgIi52dGFibGVfaW5oZXJpdCBDSElMRE5BTUUsIFBBUkVOVE5BTUUiLiAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdnRhYmxlX2luaGVyaXQgKGlnbm9yZSkKLXsKLSAgY2hhciAqY25hbWUsICpwbmFtZTsKLSAgc3ltYm9sUyAqY3N5bSwgKnBzeW07Ci0gIGNoYXIgYywgYmFkID0gMDsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgY25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgY3N5bSA9IHN5bWJvbF9maW5kIChjbmFtZSk7Ci0KLSAgLyogR0NGSVhNRTogc2hvdWxkIGNoZWNrIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0d28gLnZ0YWJsZV9pbmhlcml0cyBmb3IKLSAgICAgdGhlIHNhbWUgY2hpbGQgc3ltYm9sLiAgQWxzbywgd2UgY2FuIGN1cnJlbnRseSBvbmx5IGRvIHRoaXMgaWYgdGhlCi0gICAgIGNoaWxkIHN5bWJvbCBpcyBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgcGxhY2VkIGluIGEgZnJhZ21lbnQuICAqLwotCi0gIGlmIChjc3ltID09IE5VTEwgfHwgc3ltYm9sX2dldF9mcmFnIChjc3ltKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGAlcycgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciAudnRhYmxlX2luaGVyaXQiLAotCSAgICAgIGNuYW1lKTsKLSAgICAgIGJhZCA9IDE7Ci0gICAgfQotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnZ0YWJsZV9pbmhlcml0Iik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICcwJwotICAgICAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnCi0JICB8fCBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkpCi0gICAgewotICAgICAgcHN5bSA9IHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgcHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKHBuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChiYWQpCi0gICAgcmV0dXJuOwotCi0gIGFzc2VydCAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChjc3ltKS0+WF9vcCA9PSBPX2NvbnN0YW50KTsKLSAgZml4X25ldyAoc3ltYm9sX2dldF9mcmFnIChjc3ltKSwKLQkgICBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGNzeW0pLT5YX2FkZF9udW1iZXIsIDAsIHBzeW0sIDAsIDAsCi0JICAgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUKTsKLX0KLSAgCi0vKiBUaGlzIGhhbmRsZXMgdGhlIC52dGFibGVfZW50cnkgcHNldWRvLW9wLCB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlCi0gICB0byB0aGUgbGlua2VyIHRoYXQgYSB2dGFibGUgc2xvdCB3YXMgdXNlZC4gIFRoZSBzeW50YXggaXMKLSAgICIudnRhYmxlX2VudHJ5IHRhYmxlbmFtZSwgb2Zmc2V0Ii4gICovCi0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX3Z0YWJsZV9lbnRyeSAoaWdub3JlKQotewotICBjaGFyICpuYW1lOwotICBzeW1ib2xTICpzeW07Ci0gIG9mZnNldFQgb2Zmc2V0OwotICBjaGFyIGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgaW4gLnZ0YWJsZV9lbnRyeSIpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBvZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBmaXhfbmV3IChmcmFnX25vdywgZnJhZ19ub3dfZml4ICgpLCAwLCBzeW0sIG9mZnNldCwgMCwKLQkgICBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX3JlYWRfYmVnaW5faG9vayAoKTsKLSNlbmRpZgotfQotCi12b2lkCi1vYmpfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBzdHJ1Y3QgZWxmX29ial9zeSAqc3lfb2JqOwotCi0gIHN5X29iaiA9IHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKTsKLSAgc3lfb2JqLT5zaXplID0gTlVMTDsKLSAgc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSA9IE5VTEw7Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLSNlbmRpZgotfQotCi12b2lkCi1vYmpfZWxmX3ZlcnNpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGM7Ci0gIGNoYXIgY2g7Ci0gIGNoYXIgKnA7Ci0gIGFzZWN0aW9uICpzZWcgPSBub3dfc2VnOwotICBzdWJzZWdUIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIEVsZl9JbnRlcm5hbF9Ob3RlIGlfbm90ZTsKLSAgRWxmX0V4dGVybmFsX05vdGUgZV9ub3RlOwotICBhc2VjdGlvbiAqbm90ZV9zZWNwID0gKGFzZWN0aW9uICopIE5VTEw7Ci0gIGludCBpLCBsZW47Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCInKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwkvKiAtPiAxc3QgY2hhciBvZiBzdHJpbmcuICovCi0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLSAgICAgICooaW5wdXRfbGluZV9wb2ludGVyIC0gMSkgPSAnXDAnOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgICAgIC8qIGNyZWF0ZSB0aGUgLm5vdGUgc2VjdGlvbiAqLwotCi0gICAgICBub3RlX3NlY3AgPSBzdWJzZWdfbmV3ICgiLm5vdGUiLCAwKTsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LAotCQkJICAgICBub3RlX3NlY3AsCi0JCQkgICAgIFNFQ19IQVNfQ09OVEVOVFMgfCBTRUNfUkVBRE9OTFkpOwotCi0gICAgICAvKiBwcm9jZXNzIHRoZSB2ZXJzaW9uIHN0cmluZyAqLwotCi0gICAgICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotCi0gICAgICBpX25vdGUubmFtZXN6ID0gKChsZW4gKyAxKSArIDMpICYgfjM7IC8qIHJvdW5kIHRoaXMgdG8gd29yZCBib3VuZGFyeSAqLwotICAgICAgaV9ub3RlLmRlc2NzeiA9IDA7CS8qIG5vIGRlc2NyaXB0aW9uICovCi0gICAgICBpX25vdGUudHlwZSA9IE5UX1ZFUlNJT047Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS5uYW1lc3opKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLm5hbWVzeiwgNCk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS5kZXNjc3opKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaV9ub3RlLmRlc2NzeiwgNCk7Ci0gICAgICBwID0gZnJhZ19tb3JlIChzaXplb2YgKGVfbm90ZS50eXBlKSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS50eXBlLCA0KTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCXsKLQkgIGNoID0gKihuYW1lICsgaSk7Ci0JICB7Ci0JICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoY2gpOwotCSAgfQotCX0KLSAgICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gICAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfc2l6ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgY2hhciAqcDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBzeW1ib2xTICpzeW07Ci0KLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqcCA9IDA7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgYCVzJyBpbiAuc2l6ZSBkaXJlY3RpdmUiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGV4cHJlc3Npb24gaW4gLnNpemUgZGlyZWN0aXZlIikpOwotICAgICAgZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChleHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIFNfU0VUX1NJWkUgKHN5bSwgZXhwLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9Ci0JKGV4cHJlc3Npb25TICopIHhtYWxsb2MgKHNpemVvZiAoZXhwcmVzc2lvblMpKTsKLSAgICAgICpzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9IGV4cDsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgRUxGIC50eXBlIHBzZXVkby1vcC4gIFRoaXMgc2V0cyB0aGUgdHlwZSBvZiBhIHN5bWJvbC4KLSAgIFRoZXJlIGFyZSBmb3VyIHN5bnRheGVzOgotICAgCi0gICBUaGUgZmlyc3QgKHVzZWQgb24gU29sYXJpcykgaXMKLSAgICAgICAudHlwZSBTWU0sI2Z1bmN0aW9uCi0gICBUaGUgc2Vjb25kICh1c2VkIG9uIFVuaXhXYXJlKSBpcwotICAgICAgIC50eXBlIFNZTSxAZnVuY3Rpb24KLSAgIFRoZSB0aGlyZCAocmVwb3J0ZWRseSB0byBiZSB1c2VkIG9uIElyaXggNi4wKSBpcwotICAgICAgIC50eXBlIFNZTSBTVFRfRlVOQwotICAgVGhlIGZvdXJ0aCAodXNlZCBvbiBOZXRCU0QvQXJtIGFuZCBMaW51eC9BUk0pIGlzCi0gICAgICAgLnR5cGUgU1lNLCVmdW5jdGlvbgotICAgKi8KLQotc3RhdGljIHZvaWQKLW9ial9lbGZfdHlwZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGludCB0eXBlOwotICBjb25zdCBjaGFyICp0eXBlbmFtZTsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCAgICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnCi0gICAgICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICdAJwotICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJScpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgdHlwZW5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICB0eXBlID0gMDsKLSAgaWYgKHN0cmNtcCAodHlwZW5hbWUsICJmdW5jdGlvbiIpID09IDAKLSAgICAgIHx8IHN0cmNtcCAodHlwZW5hbWUsICJTVFRfRlVOQyIpID09IDApCi0gICAgdHlwZSA9IEJTRl9GVU5DVElPTjsKLSAgZWxzZSBpZiAoc3RyY21wICh0eXBlbmFtZSwgIm9iamVjdCIpID09IDAKLQkgICB8fCBzdHJjbXAgKHR5cGVuYW1lLCAiU1RUX09CSkVDVCIpID09IDApCi0gICAgdHlwZSA9IEJTRl9PQkpFQ1Q7Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oImlnbm9yaW5nIHVucmVjb2duaXplZCBzeW1ib2wgdHlwZSBcIiVzXCIiKSwgdHlwZW5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSB0eXBlOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfZWxmX2lkZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN0YXRpYyBzZWdUIGNvbW1lbnRfc2VjdGlvbjsKLSAgc2VnVCBvbGRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBvbGRfc3Vic2VjdGlvbiA9IG5vd19zdWJzZWc7Ci0KLSAgaWYgKCFjb21tZW50X3NlY3Rpb24pCi0gICAgewotICAgICAgY2hhciAqcDsKLSAgICAgIGNvbW1lbnRfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuY29tbWVudCIsIDApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGNvbW1lbnRfc2VjdGlvbiwKLQkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX0hBU19DT05URU5UUyk7Ci0gICAgICBwID0gZnJhZ19tb3JlICgxKTsKLSAgICAgICpwID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzdWJzZWdfc2V0IChjb21tZW50X3NlY3Rpb24sIDApOwotICBzdHJpbmdlciAoMSk7Ci0gIHN1YnNlZ19zZXQgKG9sZF9zZWN0aW9uLCBvbGRfc3Vic2VjdGlvbik7Ci19Ci0KLSNpZmRlZiBJTklUX1NUQUJfU0VDVElPTgotCi0vKiBUaGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbiBpcyBzcGVjaWFsLiAgKi8KLQotdm9pZAotb2JqX2VsZl9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqZmlsZTsKLSAgY2hhciAqcDsKLSAgY2hhciAqc3RhYnN0cl9uYW1lOwotICB1bnNpZ25lZCBpbnQgc3Ryb2ZmOwotCi0gIC8qIEZvcmNlIHRoZSBzZWN0aW9uIHRvIGFsaWduIHRvIGEgbG9uZ3dvcmQgYm91bmRhcnkuICBXaXRob3V0IHRoaXMsCi0gICAgIFVuaXhXYXJlIGFyIGNyYXNoZXMuICAqLwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgMik7Ci0KLSAgLyogTWFrZSBzcGFjZSBmb3IgdGhpcyBmaXJzdCBzeW1ib2wuICovCi0gIHAgPSBmcmFnX21vcmUgKDEyKTsKLSAgLyogWmVybyBpdCBvdXQuICovCi0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0YWJzdHJfbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWdtZW50X25hbWUgKHNlZykpICsgNCk7Ci0gIHN0cmNweSAoc3RhYnN0cl9uYW1lLCBzZWdtZW50X25hbWUgKHNlZykpOwotICBzdHJjYXQgKHN0YWJzdHJfbmFtZSwgInN0ciIpOwotICBzdHJvZmYgPSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChmaWxlLCBzdGFic3RyX25hbWUpOwotICBrbm93IChzdHJvZmYgPT0gMSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgc3Ryb2ZmLCA0KTsKLSAgc2VnX2luZm8gKHNlZyktPnN0YWJ1LnAgPSBwOwotfQotCi0jZW5kaWYKLQotLyogRmlsbCBpbiB0aGUgY291bnRzIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBhIC5zdGFicyBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkanVzdF9zdGFiX3NlY3Rpb25zIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBjaGFyICpuYW1lOwotICBhc2VjdGlvbiAqc3Ryc2VjOwotICBjaGFyICpwOwotICBpbnQgc3Ryc3osIG5zeW1zOwotCi0gIGlmIChzdHJuY21wICgiLnN0YWIiLCBzZWMtPm5hbWUsIDUpKQotICAgIHJldHVybjsKLSAgaWYgKCFzdHJjbXAgKCJzdHIiLCBzZWMtPm5hbWUgKyBzdHJsZW4gKHNlYy0+bmFtZSkgLSAzKSkKLSAgICByZXR1cm47Ci0KLSAgbmFtZSA9IChjaGFyICopIGFsbG9jYSAoc3RybGVuIChzZWMtPm5hbWUpICsgNCk7Ci0gIHN0cmNweSAobmFtZSwgc2VjLT5uYW1lKTsKLSAgc3RyY2F0IChuYW1lLCAic3RyIik7Ci0gIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCBuYW1lKTsKLSAgaWYgKHN0cnNlYykKLSAgICBzdHJzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGFiZmQsIHN0cnNlYyk7Ci0gIGVsc2UKLSAgICBzdHJzeiA9IDA7Ci0gIG5zeW1zID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKSAvIDEyIC0gMTsKLQotICBwID0gc2VnX2luZm8gKHNlYyktPnN0YWJ1LnA7Ci0gIGFzc2VydCAocCAhPSAwKTsKLQotICBiZmRfaF9wdXRfMTYgKGFiZmQsIChiZmRfdm1hKSBuc3ltcywgKGJmZF9ieXRlICopIHAgKyA2KTsKLSAgYmZkX2hfcHV0XzMyIChhYmZkLCAoYmZkX3ZtYSkgc3Ryc3osIChiZmRfYnl0ZSAqKSBwICsgOCk7Ci19Ci0KLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBFQ09GRiBjb2RlLiAgSXQgaXMgc3VwcG9zZWQgdG8KLSAgIHJlY29yZCB0aGUgZXh0ZXJuYWwgc3ltYm9sIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGJhY2tlbmQgY2FuCi0gICB3cml0ZSBpdCBvdXQgY29ycmVjdGx5LiAgVGhlIEVMRiBiYWNrZW5kIGRvZXNuJ3QgYWN0dWFsbHkgaGFuZGxlCi0gICB0aGlzIGF0IHRoZSBtb21lbnQsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4gIFdlIHNhdmUgdGhlIGluZm9ybWF0aW9uCi0gICBpbiB0aGUgc3ltYm9sLiAgKi8KLQotdm9pZAotZWxmX2Vjb2ZmX3NldF9leHQgKHN5bSwgZXh0KQotICAgICBzeW1ib2xTICpzeW07Ci0gICAgIHN0cnVjdCBlY29mZl9leHRyICpleHQ7Ci17Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT51ZGF0YS5wID0gKFBUUikgZXh0OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaXMKLSAgIHN1cHBvc2VkIHRvICpFWFQgdG8gdGhlIGV4dGVybmFsIHN5bWJvbCBpbmZvcm1hdGlvbiwgYW5kIHJldHVybgotICAgd2hldGhlciB0aGUgc3ltYm9sIHNob3VsZCBiZSB1c2VkIGF0IGFsbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1lbGZfZ2V0X2V4dHIgKHN5bSwgZXh0KQotICAgICBhc3ltYm9sICpzeW07Ci0gICAgIEVYVFIgKmV4dDsKLXsKLSAgaWYgKHN5bS0+dWRhdGEucCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgKmV4dCA9ICooRVhUUiAqKSBzeW0tPnVkYXRhLnA7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBiZmRfZWNvZmZfZGVidWdfZXh0ZXJuYWxzLiAgSXQgaGFzCi0gICBub3RoaW5nIHRvIGRvIGZvciBFTEYuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1lbGZfc2V0X2luZGV4IChzeW0sIGluZHgpCi0gICAgIGFzeW1ib2wgKnN5bTsKLSAgICAgYmZkX3NpemVfdHlwZSBpbmR4OwotewotfQotCi0jZW5kaWYgLyogTkVFRF9FQ09GRl9ERUJVRyAqLwotCi12b2lkCi1lbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKQotICAgICBzeW1ib2xTICpzeW1wOwotICAgICBpbnQgKnB1bnRwOwotewotICBzdHJ1Y3QgZWxmX29ial9zeSAqc3lfb2JqOwotCi0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2Zyb2Jfc3ltYm9sIChzeW1wKTsKLSNlbmRpZgotCi0gIHN5X29iaiA9IHN5bWJvbF9nZXRfb2JqIChzeW1wKTsKLQotICBpZiAoc3lfb2JqLT5zaXplICE9IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChzeV9vYmotPnNpemUtPlhfb3ApCi0JewotCWNhc2UgT19zdWJ0cmFjdDoKLQkgIFNfU0VUX1NJWkUgKHN5bXAsCi0JCSAgICAgIChTX0dFVF9WQUxVRSAoc3lfb2JqLT5zaXplLT5YX2FkZF9zeW1ib2wpCi0JCSAgICAgICArIHN5X29iai0+c2l6ZS0+WF9hZGRfbnVtYmVyCi0JCSAgICAgICAtIFNfR0VUX1ZBTFVFIChzeV9vYmotPnNpemUtPlhfb3Bfc3ltYm9sKSkpOwotCSAgYnJlYWs7Ci0JY2FzZSBPX2NvbnN0YW50OgotCSAgU19TRVRfU0laRSAoc3ltcCwKLQkJICAgICAgKFNfR0VUX1ZBTFVFIChzeV9vYmotPnNpemUtPlhfYWRkX3N5bWJvbCkKLQkJICAgICAgICsgc3lfb2JqLT5zaXplLT5YX2FkZF9udW1iZXIpKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19iYWQgKF8oIi5zaXplIGV4cHJlc3Npb24gdG9vIGNvbXBsaWNhdGVkIHRvIGZpeCB1cCIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZyZWUgKHN5X29iai0+c2l6ZSk7Ci0gICAgICBzeV9vYmotPnNpemUgPSBOVUxMOwotICAgIH0KLQotICBpZiAoc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3ltYm9sIHdhcyBnaXZlbiBhIG5ldyBuYW1lIHdpdGggdGhlIC5zeW12ZXIgZGlyZWN0aXZlLgotCi0gICAgICAgICBJZiB0aGlzIGlzIGFuIGV4dGVybmFsIHJlZmVyZW5jZSwganVzdCByZW5hbWUgdGhlIHN5bWJvbCB0bwotICAgICAgICAgaW5jbHVkZSB0aGUgdmVyc2lvbiBzdHJpbmcuICBUaGlzIHdpbGwgbWFrZSB0aGUgcmVsb2NzIGJlCi0gICAgICAgICBhZ2FpbnN0IHRoZSBjb3JyZWN0IHZlcnNpb25lZCBzeW1ib2wuCi0KLQkgSWYgdGhpcyBpcyBhIGRlZmluaXRpb24sIGFkZCBhbiBhbGlhcy4gIEZJWE1FOiBVc2luZyBhbiBhbGlhcwotCSB3aWxsIHBlcm1pdCB0aGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIHJlZmVyIHRvIHRoZSByaWdodAotCSBzeW1ib2wuICBIb3dldmVyLCBpdCdzIG5vdCBjbGVhciB3aGV0aGVyIGl0IGlzIHRoZSBiZXN0Ci0JIGFwcHJvYWNoLiAgKi8KLQotICAgICAgaWYgKCEgU19JU19ERUZJTkVEIChzeW1wKSkKLQl7Ci0JICBjaGFyICpwOwotCi0JICAvKiBWZXJpZnkgdGhhdCB0aGUgbmFtZSBpc24ndCB1c2luZyB0aGUgQEAgc3ludGF4LS10aGlzIGlzCi0gICAgICAgICAgICAgcmVzZXJ2ZWQgZm9yIGRlZmluaXRpb25zIG9mIHRoZSBkZWZhdWx0IHZlcnNpb24gdG8gbGluawotICAgICAgICAgICAgIGFnYWluc3QuICAqLwotCSAgcCA9IHN0cmNociAoc3lfb2JqLT52ZXJzaW9uZWRfbmFtZSwgRUxGX1ZFUl9DSFIpOwotCSAga25vdyAocCAhPSBOVUxMKTsKLQkgIGlmIChwWzFdID09IEVMRl9WRVJfQ0hSKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGF0dGVtcHQgdG8gZGVjbGFyZSBleHRlcm5hbCB2ZXJzaW9uIG5hbWUgYXMgZGVmYXVsdCBpbiBzeW1ib2wgYCVzJyIpLAotCQkgICAgICBzeV9vYmotPnZlcnNpb25lZF9uYW1lKTsKLQkgICAgICAqcHVudHAgPSB0cnVlOwotCSAgICB9Ci0JICBTX1NFVF9OQU1FIChzeW1wLCBzeV9vYmotPnZlcnNpb25lZF9uYW1lKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltYm9sUyAqc3ltcDI7Ci0KLQkgIC8qIEZJWE1FOiBDcmVhdGluZyBhIG5ldyBzeW1ib2wgaGVyZSBpcyByaXNreS4gIFdlJ3JlIGluIHRoZQotICAgICAgICAgICAgIGZpbmFsIGxvb3Agb3ZlciB0aGUgc3ltYm9sIHRhYmxlLiAgV2UgY2FuIGdldCBhd2F5IHdpdGgKLSAgICAgICAgICAgICBpdCBvbmx5IGJlY2F1c2UgdGhlIHN5bWJvbCBnb2VzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsCi0gICAgICAgICAgICAgd2hlcmUgdGhlIGxvb3Agd2lsbCBzdGlsbCBzZWUgaXQuICBJdCB3b3VsZCBwcm9iYWJseSBiZQotICAgICAgICAgICAgIGJldHRlciB0byBkbyB0aGlzIGluIG9ial9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdC4gKi8KLQotCSAgc3ltcDIgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChzeV9vYmotPnZlcnNpb25lZF9uYW1lKTsKLQotCSAgLyogTm93IHdlIGFjdCBhcyB0aG91Z2ggd2Ugc2F3IHN5bXAyID0gc3ltLiAgKi8KLQotCSAgU19TRVRfU0VHTUVOVCAoc3ltcDIsIFNfR0VUX1NFR01FTlQgKHN5bXApKTsKLQotCSAgLyogU3VidHJhY3Rpbmcgb3V0IHRoZSBmcmFnIGFkZHJlc3MgaGVyZSBpcyBhIGhhY2sgYmVjYXVzZQotICAgICAgICAgICAgIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBmaW5hbCBsb29wLiAgKi8KLQkgIFNfU0VUX1ZBTFVFIChzeW1wMiwKLQkJICAgICAgIChTX0dFVF9WQUxVRSAoc3ltcCkKLQkJCS0gc3ltYm9sX2dldF9mcmFnIChzeW1wKS0+ZnJfYWRkcmVzcykpOwotCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bXAyLCBzeW1ib2xfZ2V0X2ZyYWcgKHN5bXApKTsKLQotCSAgLyogVGhpcyB3aWxsIGNvcHkgb3ZlciB0aGUgc2l6ZSBpbmZvcm1hdGlvbi4gICovCi0JICBjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChzeW1wMiwgc3ltcCk7Ci0KLQkgIGlmIChTX0lTX1dFQUsgKHN5bXApKQotCSAgICBTX1NFVF9XRUFLIChzeW1wMik7Ci0KLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1wKSkKLQkgICAgU19TRVRfRVhURVJOQUwgKHN5bXAyKTsKLQl9Ci0gICAgfQotCi0gIC8qIERvdWJsZSBjaGVjayB3ZWFrIHN5bWJvbHMuICAqLwotICBpZiAoU19JU19XRUFLIChzeW1wKSkKLSAgICB7Ci0gICAgICBpZiAoU19JU19DT01NT04gKHN5bXApKQotCWFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAotCQlTX0dFVF9OQU1FIChzeW1wKSk7Ci0gICAgfQotCi0jaWZkZWYgVENfTUlQUwotICAvKiBUaGUgSXJpeCA1IGFuZCA2IGFzc2VtYmxlcnMgc2V0IHRoZSB0eXBlIG9mIGFueSBjb21tb24gc3ltYm9sIGFuZAotICAgICBhbnkgdW5kZWZpbmVkIG5vbi1mdW5jdGlvbiBzeW1ib2wgdG8gU1RUX09CSkVDVC4gIFdlIHRyeSB0byBiZQotICAgICBjb21wYXRpYmxlLCBzaW5jZSBuZXdlciBJcml4IDUgYW5kIDYgbGlua2VycyBjYXJlLiAgSG93ZXZlciwgd2UKLSAgICAgb25seSBzZXQgdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgU1RUX09CSkVDVCBpZiB3ZSBhcmUgb24gSXJpeCwKLSAgICAgYmVjYXVzZSB0aGF0IGlzIHRoZSBvbmx5IHRpbWUgZ2NjIHdpbGwgZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeQotICAgICAuZ2xvYmFsIGRpcmVjdGl2ZXMgdG8gbWFyayBmdW5jdGlvbnMuICAqLwotCi0gIGlmIChTX0lTX0NPTU1PTiAoc3ltcCkpCi0gICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotCi0gIGlmIChzdHJzdHIgKFRBUkdFVF9PUywgImlyaXgiKSAhPSBOVUxMCi0gICAgICAmJiAhIFNfSVNfREVGSU5FRCAoc3ltcCkKLSAgICAgICYmIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzICYgQlNGX0ZVTkNUSU9OKSA9PSAwKQotICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLSNlbmRpZgotCi0jaWZkZWYgVENfUFBDCi0gIC8qIEZyb2IgdGhlIFBvd2VyUEMsIHNvIHRoYXQgdGhlIHN5bWJvbCBhbHdheXMgaGFzIG9iamVjdCB0eXBlCi0gICAgIGlmIGl0IGlzIG5vdCBzb21lIG90aGVyIHR5cGUuICBWeFdvcmtzIG5lZWRzIHRoaXMuICAqLwotICBpZiAoKHN5bWJvbF9nZXRfYmZkc3ltIChzeW1wKS0+ZmxhZ3MKLSAgICAgICAmIChCU0ZfRlVOQ1RJT04gfCBCU0ZfRklMRSB8IEJTRl9TRUNUSU9OX1NZTSkpID09IDAKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoc3ltcCkpCi0gICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT5mbGFncyB8PSBCU0ZfT0JKRUNUOwotI2VuZGlmCi19Ci0KLXZvaWQKLWVsZl9mcm9iX2ZpbGUgKCkKLXsKLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGFkanVzdF9zdGFiX3NlY3Rpb25zLCAoUFRSKSAwKTsKLQotI2lmZGVmIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nCi0gIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nICgpOwotI2VuZGlmCi19Ci0KLS8qIEl0IGlzIHJlcXVpcmVkIHRoYXQgd2UgbGV0IHdyaXRlX3JlbG9jcyBoYXZlIHRoZSBvcHBvcnR1bml0eSB0bwotICAgb3B0aW1pemUgYXdheSBmaXh1cHMgYmVmb3JlIG91dHB1dCBoYXMgYmVndW4sIHNpbmNlIGl0IGlzIHBvc3NpYmxlCi0gICB0byBlbGltaW5hdGUgYWxsIGZpeHVwcyBmb3IgYSBzZWN0aW9uIGFuZCB0aHVzIHdlIG5ldmVyIHNob3VsZAotICAgaGF2ZSBnZW5lcmF0ZWQgdGhlIHJlbG9jYXRpb24gc2VjdGlvbi4gICovCi0KLXZvaWQKLWVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpCi17Ci0jaWZkZWYgTkVFRF9FQ09GRl9ERUJVRwotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIC8qIEdlbmVyYXRlIHRoZSBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpkZWJ1Z19zd2FwOwotICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gZGVidWc7Ci0gICAgICBjaGFyICpidWY7Ci0gICAgICBhc2VjdGlvbiAqc2VjOwotCi0gICAgICBkZWJ1Z19zd2FwCi0JPSBnZXRfZWxmX2JhY2tlbmRfZGF0YSAoc3Rkb3V0cHV0KS0+ZWxmX2JhY2tlbmRfZWNvZmZfZGVidWdfc3dhcDsKLSAgICAgIGtub3cgKGRlYnVnX3N3YXAgIT0gKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICopIE5VTEwpOwotICAgICAgZWNvZmZfYnVpbGRfZGVidWcgKCZkZWJ1Zy5zeW1ib2xpY19oZWFkZXIsICZidWYsIGRlYnVnX3N3YXApOwotCi0gICAgICAvKiBTZXQgdXAgdGhlIHBvaW50ZXJzIGluIGRlYnVnLiAgKi8KLSNkZWZpbmUgU0VUKHB0ciwgb2Zmc2V0LCB0eXBlKSBcCi0gICAgZGVidWcucHRyID0gKHR5cGUpIChidWYgKyBkZWJ1Zy5zeW1ib2xpY19oZWFkZXIub2Zmc2V0KQotCi0gICAgICBTRVQgKGxpbmUsIGNiTGluZU9mZnNldCwgdW5zaWduZWQgY2hhciAqKTsKLSAgICAgIFNFVCAoZXh0ZXJuYWxfZG5yLCBjYkRuT2Zmc2V0LCBQVFIpOwotICAgICAgU0VUIChleHRlcm5hbF9wZHIsIGNiUGRPZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX3N5bSwgY2JTeW1PZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX29wdCwgY2JPcHRPZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX2F1eCwgY2JBdXhPZmZzZXQsIHVuaW9uIGF1eF9leHQgKik7Ci0gICAgICBTRVQgKHNzLCBjYlNzT2Zmc2V0LCBjaGFyICopOwotICAgICAgU0VUIChleHRlcm5hbF9mZHIsIGNiRmRPZmZzZXQsIFBUUik7Ci0gICAgICBTRVQgKGV4dGVybmFsX3JmZCwgY2JSZmRPZmZzZXQsIFBUUik7Ci0gICAgICAvKiBzc2V4dCBhbmQgZXh0ZXJuYWxfZXh0IGFyZSBzZXQgdXAganVzdCBiZWxvdy4gICovCi0KLSN1bmRlZiBTRVQKLQotICAgICAgLyogU2V0IHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgKi8KLSAgICAgIGRlYnVnLnNzZXh0ID0gZGVidWcuc3NleHRfZW5kID0gTlVMTDsKLSAgICAgIGRlYnVnLmV4dGVybmFsX2V4dCA9IGRlYnVnLmV4dGVybmFsX2V4dF9lbmQgPSBOVUxMOwotICAgICAgaWYgKCEgYmZkX2Vjb2ZmX2RlYnVnX2V4dGVybmFscyAoc3Rkb3V0cHV0LCAmZGVidWcsIGRlYnVnX3N3YXAsIHRydWUsCi0JCQkJICAgICAgIGVsZl9nZXRfZXh0ciwgZWxmX3NldF9pbmRleCkpCi0JYXNfZmF0YWwgKF8oIkZhaWxlZCB0byBzZXQgdXAgZGVidWdnaW5nIGluZm9ybWF0aW9uOiAlcyIpLAotCQkgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKHN0ZG91dHB1dCwgIi5tZGVidWciKTsKLSAgICAgIGFzc2VydCAoc2VjICE9IE5VTEwpOwotCi0gICAgICBrbm93IChzdGRvdXRwdXQtPm91dHB1dF9oYXNfYmVndW4gPT0gZmFsc2UpOwotCi0gICAgICAvKiBXZSBzZXQgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24sIGNhbGwgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzCi0JIHRvIGZvcmNlIHRoZSBFTEYgYmFja2VuZCB0byBhbGxvY2F0ZSBhIGZpbGUgcG9zaXRpb24sIGFuZCB0aGVuCi0JIHdyaXRlIG91dCB0aGUgZGF0YS4gIEZJWE1FOiBJcyB0aGlzIHJlYWxseSB0aGUgYmVzdCB3YXkgdG8gZG8KLQkgdGhpcz8gICovCi0gICAgICBzZWMtPl9yYXdfc2l6ZSA9IGJmZF9lY29mZl9kZWJ1Z19zaXplIChzdGRvdXRwdXQsICZkZWJ1ZywgZGVidWdfc3dhcCk7Ci0KLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsIChQVFIpIE5VTEwsCi0JCQkJICAgICAgKGZpbGVfcHRyKSAwLCAoYmZkX3NpemVfdHlwZSkgMCkpCi0JYXNfZmF0YWwgKF8oIkNhbid0IHN0YXJ0IHdyaXRpbmcgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIpLAotCQkgIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLQotICAgICAga25vdyAoc3Rkb3V0cHV0LT5vdXRwdXRfaGFzX2JlZ3VuID09IHRydWUpOwotICAgICAga25vdyAoc2VjLT5maWxlcG9zICE9IDApOwotCi0gICAgICBpZiAoISBiZmRfZWNvZmZfd3JpdGVfZGVidWcgKHN0ZG91dHB1dCwgJmRlYnVnLCBkZWJ1Z19zd2FwLAotCQkJCSAgIHNlYy0+ZmlsZXBvcykpCi0JYXNfZmF0YWwgKF8oIkNvdWxkIG5vdCB3cml0ZSAubWRlYnVnIHNlY3Rpb246ICVzIiksCi0JCSAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgIH0KLSNlbmRpZiAvKiBORUVEX0VDT0ZGX0RFQlVHICovCi19Ci0KLSNpZmRlZiBTQ09fRUxGCi0KLS8qIEhlYXZpbHkgcGxhZ2FyaXplZCBmcm9tIG9ial9lbGZfdmVyc2lvbi4gIFRoZSBpZGVhIGlzIHRvIGVtaXQgdGhlCi0gICBTQ08gc3BlY2lmaWMgaWRlbnRpZmllciBpbiB0aGUgLm5vdGVzIHNlY3Rpb24gdG8gc2F0aXNmeSB0aGUgU0NPCi0gICBsaW5rZXIuCi0KLSAgIFRoaXMgbG9va3MgbW9yZSBjb21wbGljYXRlZCB0aGFuIGl0IHJlYWxseSBpcy4gIEFzIG9wcG9zZWQgdG8gdGhlCi0gICAib2J2aW91cyIgc29sdXRpb24sIHRoaXMgc2hvdWxkIGhhbmRsZSB0aGUgY3Jvc3MgZGV2IGNhc2VzCi0gICBjb3JyZWN0bHkuICAoaS5lLCBob3N0aW5nIG9uIGEgNjQgYml0IGJpZyBlbmRpYW4gcHJvY2Vzc29yLCBidXQKLSAgIGdlbmVyYXRpbmcgU0NPIEVsZiBjb2RlKSBFZmZpY2llbmN5IGlzbid0IGEgY29uY2VybiwgYXMgdGhlcmUKLSAgIHNob3VsZCBiZSBleGFjdGx5IG9uZSBvZiB0aGVzZSBzZWN0aW9ucyBwZXIgb2JqZWN0IG1vZHVsZS4KLQotICAgU0NPIE9wZW5TZXJ2ZXIgNSBpZGVudGlmaWVzIGl0J3MgRUxGIG1vZHVsZXMgd2l0aCBhIHN0YW5kYXJkIEVMRgotICAgLm5vdGUgc2VjdGlvbi4KLQotICAgaW50XzMyIG5hbWVzeiAgPSA0IDsgIE5hbWUgc2l6ZSAKLSAgIGludF8zMiBkZXNjc3ogID0gMTIgOyBEZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiAKLSAgIGludF8zMiB0eXBlICAgID0gMSA7ICAKLSAgIGNoYXIgICBuYW1lWzRdID0gIlNDTyIgOyBPcmlnaW5hdG9yIG5hbWUgQUxXQVlTIFNDTyArIE5VTEwgCi0gICBpbnRfMzIgdmVyc2lvbiA9IChtYWpvciB2ZXIgIyA8PCAxNikgIHwgdmVyc2lvbiBvZiB0b29scyA7Ci0gICBpbnRfMzIgc291cmNlICA9ICh0b29sX2lkIDw8IDE2ICkgfCAxIDsKLSAgIGludF8zMiBpbmZvICAgID0gMCA7ICAgIFRoZXNlIGFyZSBzZXQgYnkgdGhlIFNDTyB0b29scywgYnV0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBrbm93IGVub3VnaCBhYm91dCB0aGUgc291cmNlIAotCQkJICAgZW52aXJvbm1lbnQgdG8gc2V0IHRoZW0uICBTQ08gbGQgY3VycmVudGx5Ci0JCQkgICBpZ25vcmVzIHRoZW0sIGFuZCByZWNvbW1lbmRzIHdlIHNldCB0aGVtCi0JCQkgICB0byB6ZXJvLiAgKi8KLQotI2RlZmluZSBTQ09fTUFKT1JfVkVSU0lPTiAweDEKLSNkZWZpbmUgU0NPX01JTk9SX1ZFUlNJT04gMHgxCi0KLXZvaWQKLXNjb19pZCAoKQotewotCi0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBjOwotICBjaGFyIGNoOwotICBjaGFyICpwOwotICBhc2VjdGlvbiAqc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBzdWJzZWcgPSBub3dfc3Vic2VnOwotICBFbGZfSW50ZXJuYWxfTm90ZSBpX25vdGU7Ci0gIEVsZl9FeHRlcm5hbF9Ob3RlIGVfbm90ZTsKLSAgYXNlY3Rpb24gKm5vdGVfc2VjcCA9IChhc2VjdGlvbiAqKSBOVUxMOwotICBpbnQgaSwgbGVuOwotCi0gIC8qIGNyZWF0ZSB0aGUgLm5vdGUgc2VjdGlvbiAqLwotCi0gIG5vdGVfc2VjcCA9IHN1YnNlZ19uZXcgKCIubm90ZSIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwKLQkJCSBub3RlX3NlY3AsCi0JCQkgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSk7Ci0KLSAgLyogcHJvY2VzcyB0aGUgdmVyc2lvbiBzdHJpbmcgKi8KLQotICBpX25vdGUubmFtZXN6ID0gNDsgCi0gIGlfbm90ZS5kZXNjc3ogPSAxMjsJCS8qIDEyIGRlc2NyaXB0aXZlIGJ5dGVzICovCi0gIGlfbm90ZS50eXBlID0gTlRfVkVSU0lPTjsJLyogQ29udGFpbnMgYSB2ZXJzaW9uIHN0cmluZyAqLwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLm5hbWVzeikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS5uYW1lc3osIDQpOwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLmRlc2NzeikpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGlfbm90ZS5kZXNjc3osIDQpOwotCi0gIHAgPSBmcmFnX21vcmUgKHNpemVvZiAoaV9ub3RlLnR5cGUpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpX25vdGUudHlwZSwgNCk7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIHN0cmNweSAocCwgIlNDTyIpOyAKLQotICAvKiBOb3RlOiB0aGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgRUxGIHdlJ3JlIHJlcHJlc2VudGluZyAqLwotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAoU0NPX01BSk9SX1ZFUlNJT04gPDwgMTYpIHwgKFNDT19NSU5PUl9WRVJTSU9OKSwgNCk7Ci0KLSAgLyogSGVyZSwgd2UgcGljayBhIG1hZ2ljIG51bWJlciBmb3Igb3Vyc2VsdmVzICh5ZXMsIEkgInJlZ2lzdGVyZWQiCi0gICAgIGl0IHdpdGggU0NPLiAgVGhlIGJvdHRvbSBiaXQgc2hvd3MgdGhhdCB3ZSBhcmUgY29tcGF0IHdpdGggdGhlCi0gICAgIFNDTyBBQkkuICAqLwotICBwID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAweDRjNTIwMDAwIHwgMHgwMDAxLCA0KTsKLQotICAvKiBJZiB3ZSBrbmV3IChvciBjYXJlZCkgd2hhdCB0aGUgc291cmNlIGxhbmd1YWdlIG9wdGlvbnMgd2VyZSwgd2UnZAotICAgICBmaWxsIHRoZW0gaW4gaGVyZS4gIFNDTyBoYXMgZ2l2ZW4gdXMgcGVybWlzc2lvbiB0byBpZ25vcmUgdGhlc2UKLSAgICAgYW5kIGp1c3Qgc2V0IHRoZW0gdG8gemVyby4gICovCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDB4MDAwMCwgNCk7Ci0gCi0gIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCi0gIC8qIFdlIHByb2JhYmx5IGNhbid0IHJlc3RvcmUgdGhlIGN1cnJlbnQgc2VnbWVudCwgZm9yIHRoZXJlIGxpa2VseQotICAgICBpc24ndCBvbmUgeWV0Li4uICAqLwotICBpZiAoc2VnICYmIHN1YnNlZykKLSAgICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0KLX0KLQotI2VuZGlmIC8qIFNDT19FTEYgKi8KLQotY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgZWxmX2Zvcm1hdF9vcHMgPQotewotICBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyLAotICAwLAotICAxLAotICBlbGZfZnJvYl9zeW1ib2wsCi0gIGVsZl9mcm9iX2ZpbGUsCi0gIGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzLAotICBlbGZfc19nZXRfc2l6ZSwgZWxmX3Nfc2V0X3NpemUsCi0gIGVsZl9zX2dldF9hbGlnbiwgZWxmX3Nfc2V0X2FsaWduLAotICBlbGZfY29weV9zeW1ib2xfYXR0cmlidXRlcywKLSNpZmRlZiBORUVEX0VDT0ZGX0RFQlVHCi0gIGVjb2ZmX2dlbmVyYXRlX2FzbV9saW5lbm8sCi0gIGVjb2ZmX3N0YWIsCi0jZWxzZQotICAwLAotICAwLAkJCQkvKiBwcm9jZXNzX3N0YWIgKi8KLSNlbmRpZgotICBlbGZfc2VjX3N5bV9va19mb3JfcmVsb2MsCi0gIGVsZl9wb3BfaW5zZXJ0LAotI2lmZGVmIE5FRURfRUNPRkZfREVCVUcKLSAgZWxmX2Vjb2ZmX3NldF9leHQsCi0jZWxzZQotICAwLAotI2VuZGlmCi0gIG9ial9yZWFkX2JlZ2luX2hvb2ssCi0gIG9ial9zeW1ib2xfbmV3X2hvb2ssCi19OwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZWxmLmggYi9nYXMvY29uZmlnL29iai1lbGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM5OTk4ZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1lbGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0jaWZuZGVmIF9PQkpfRUxGX0gKLSNkZWZpbmUgX09CSl9FTEZfSAotCi0jZGVmaW5lIE9CSl9FTEYgMQotCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgYmZkX3RhcmdldF9lbGZfZmxhdm91cgotCi0jaW5jbHVkZSA8YmZkLmg+Ci0KLSNkZWZpbmUgQllURVNfSU5fV09SRCA0CQkvKiBmb3Igbm93ICovCi0jaW5jbHVkZSAiYmZkL2VsZi1iZmQuaCIKLQotI2luY2x1ZGUgInRhcmctY3B1LmgiCi0KLSNpZmRlZiBUQ19BTFBIQQotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgYWxwaGFfZmxhZ19tZGVidWcKLWV4dGVybiBpbnQgYWxwaGFfZmxhZ19tZGVidWc7Ci0jZW5kaWYKLQotLyogRm9yIG5vdywgYWx3YXlzIHNldCBFQ09GRl9ERUJVR0dJTkcgZm9yIGEgTUlQUyB0YXJnZXQuICAqLwotI2lmZGVmIFRDX01JUFMKLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMAotI2Vsc2UKLSNkZWZpbmUgRUNPRkZfREVCVUdHSU5HIDEKLSNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLwotI2VuZGlmIC8qIFRDX01JUFMgKi8KLQotLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHN5bWJvbC4gICovCi0KLS8qIEZJWE1FOiBGb3Igc29tZSByZWFzb24sIHRoaXMgc3RydWN0dXJlIGlzIG5lZWRlZCBib3RoIGhlcmUgYW5kIGluCi0gICBvYmotbXVsdGkuaC4gICovCi0jaWZuZGVmIE9CSl9TWU1GSUVMRF9UWVBFCi1zdHJ1Y3QgZWxmX29ial9zeQotewotICAvKiBXaGV0aGVyIHRoZSBzeW1ib2wgaGFzIGJlZW4gbWFya2VkIGFzIGxvY2FsLiAgKi8KLSAgaW50IGxvY2FsOwotCi0gIC8qIFVzZSB0aGlzIHRvIGtlZXAgdHJhY2sgb2YgLnNpemUgZXhwcmVzc2lvbnMgdGhhdCBpbnZvbHZlCi0gICAgIGRpZmZlcmVuY2VzIHRoYXQgd2UgY2FuJ3QgY29tcHV0ZSB5ZXQuICAqLwotICBleHByZXNzaW9uUyAqc2l6ZTsKLQotICAvKiBUaGUgbmFtZSBzcGVjaWZpZWQgYnkgdGhlIC5zeW12ZXIgZGlyZWN0aXZlLiAgKi8KLSAgY2hhciAqdmVyc2lvbmVkX25hbWU7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVR0dJTkcKLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLCB3ZSBuZWVkIHNvbWUKLSAgICAgYWRkaXRpb25hbCBmaWVsZHMgZm9yIGVhY2ggc3ltYm9sLiAgKi8KLSAgc3RydWN0IGVmZHIgKmVjb2ZmX2ZpbGU7Ci0gIHN0cnVjdCBsb2NhbHN5bSAqZWNvZmZfc3ltYm9sOwotICB2YWx1ZVQgZWNvZmZfZXh0ZXJuX3NpemU7Ci0jZW5kaWYKLX07Ci0jZW5kaWYKLQotI2RlZmluZSBPQkpfU1lNRklFTERfVFlQRSBzdHJ1Y3QgZWxmX29ial9zeQotCi0jaWZuZGVmIEZBTFNFCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgVFJVRSAgIUZBTFNFCi0jZW5kaWYKLQotI2RlZmluZSBvYmpfYmVnaW4oKSBlbGZfYmVnaW4gKCkKLWV4dGVybiB2b2lkIGVsZl9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIHNob3VsZCBiZSBjb25kaXRpb25hbCBvbiBhZGRyZXNzIHNpemUhICovCi0jZGVmaW5lIGVsZl9zeW1ib2woYXN5bWJvbCkgKChlbGZfc3ltYm9sX3R5cGUgKikoJihhc3ltYm9sKS0+dGhlX2JmZCkpCi0KLSNkZWZpbmUgU19HRVRfU0laRShTKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUpCi0jZGVmaW5lIFNfU0VUX1NJWkUoUyxWKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgPSAoVikpCi0KLSNkZWZpbmUgU19HRVRfQUxJR04oUykgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF92YWx1ZSkKLSNkZWZpbmUgU19TRVRfQUxJR04oUyxWKSBcCi0gIChlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoUykpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3ZhbHVlID0gKFYpKQotCi0jZGVmaW5lIFNfR0VUX09USEVSKFMpIFwKLSAgKGVsZl9zeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChTKSktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIpCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikgXAotICAoZWxmX3N5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKFMpKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9vdGhlciA9IChWKSkKLQotZXh0ZXJuIGFzZWN0aW9uICpnZGJfc2VjdGlvbjsKLQotI2RlZmluZSBvYmpfZnJvYl9maWxlICBlbGZfZnJvYl9maWxlCi1leHRlcm4gdm9pZCBlbGZfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcyAgZWxmX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLWV4dGVybiB2b2lkIGVsZl9mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBvYmpfYXBwX2ZpbGUgZWxmX2ZpbGVfc3ltYm9sCi1leHRlcm4gdm9pZCBlbGZfZmlsZV9zeW1ib2wgUEFSQU1TICgoY2hhciAqKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIG9ial9lbGZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfcHJldmlvdXMgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfZWxmX2NvbW1vbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfZGF0YSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9lbGZfdGV4dCBQQVJBTVMgKChpbnQpKTsKLQotLyogQkZEIHdhbnRzIHRvIHdyaXRlIHRoZSB1ZGF0YSBmaWVsZCwgd2hpY2ggaXMgYSBuby1ubyBmb3IgdGhlCi0gICBnbG9iYWxseSBkZWZpbmVkIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJKChTRUMpLT5vd25lciAhPSAwKQotCi0vKiBXaGVuIHNldHRpbmcgb25lIHN5bWJvbCBlcXVhbCB0byBhbm90aGVyLCBieSBkZWZhdWx0IHdlIHByb2JhYmx5Ci0gICB3YW50IHRoZW0gdG8gaGF2ZSB0aGUgc2FtZSAic2l6ZSIsIHdoYXRldmVyIGl0IG1lYW5zIGluIHRoZSBjdXJyZW50Ci0gICBjb250ZXh0LiAgKi8KLSNkZWZpbmUgT0JKX0NPUFlfU1lNQk9MX0FUVFJJQlVURVMoREVTVCxTUkMpCQkJXAotZG8JCQkJCQkJCVwKLSAgewkJCQkJCQkJXAotICAgIHN0cnVjdCBlbGZfb2JqX3N5ICpzcmNlbGYgPSBzeW1ib2xfZ2V0X29iaiAoU1JDKTsJCVwKLSAgICBzdHJ1Y3QgZWxmX29ial9zeSAqZGVzdGVsZiA9IHN5bWJvbF9nZXRfb2JqIChERVNUKTsJCVwKLSAgICBpZiAoc3JjZWxmLT5zaXplKQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCVwKLQlpZiAoZGVzdGVsZi0+c2l6ZSA9PSBOVUxMKQkJCQlcCi0JICBkZXN0ZWxmLT5zaXplID0JCQkJCVwKLQkgICAgKGV4cHJlc3Npb25TICopIHhtYWxsb2MgKHNpemVvZiAoZXhwcmVzc2lvblMpKTsJXAotCSpkZXN0ZWxmLT5zaXplID0gKnNyY2VsZi0+c2l6ZTsJCQkJXAotICAgICAgfQkJCQkJCQkJXAotICAgIGVsc2UJCQkJCQkJXAotICAgICAgewkJCQkJCQkJXAotCWlmIChkZXN0ZWxmLT5zaXplICE9IE5VTEwpCQkJCVwKLQkgIGZyZWUgKGRlc3RlbGYtPnNpemUpOwkJCQkJXAotCWRlc3RlbGYtPnNpemUgPSBOVUxMOwkJCQkJXAotICAgICAgfQkJCQkJCQkJXAotICAgIFNfU0VUX1NJWkUgKChERVNUKSwgU19HRVRfU0laRSAoU1JDKSk7CQkJXAotICAgIFNfU0VUX09USEVSICgoREVTVCksIFNfR0VUX09USEVSIChTUkMpKTsJCQlcCi0gIH0JCQkJCQkJCVwKLXdoaWxlICgwKQotCi0vKiBTdGFicyBnbyBpbiBhIHNlcGFyYXRlIHNlY3Rpb24uICAqLwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDEKLQotLyogV2UgbmVlZCAxMiBieXRlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24gdG8gaG9sZCBzb21lIGluaXRpYWwKLSAgIGluZm9ybWF0aW9uLiAgKi8KLWV4dGVybiB2b2lkIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotI2RlZmluZSBJTklUX1NUQUJfU0VDVElPTihzZWcpIG9ial9lbGZfaW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLQotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotLyogV2Ugc211Z2dsZSBzdGFicyBpbiBFQ09GRiByYXRoZXIgdGhhbiB1c2luZyBhIHNlcGFyYXRlIHNlY3Rpb24uCi0gICBUaGUgSXJpeCBsaW5rZXIgY2FuIG5vdCBoYW5kbGUgYSBzZXBhcmF0ZSBzdGFicyBzZWN0aW9uLiAgKi8KLQotI3VuZGVmICBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi0jZGVmaW5lIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMgKCFFQ09GRl9ERUJVR0dJTkcpCi0KLSN1bmRlZiAgSU5JVF9TVEFCX1NFQ1RJT04KLSNkZWZpbmUgSU5JVF9TVEFCX1NFQ1RJT04oc2VnKSBcCi0gICgodm9pZCkoRUNPRkZfREVCVUdHSU5HID8gMCA6IChvYmpfZWxmX2luaXRfc3RhYl9zZWN0aW9uIChzZWcpLCAwKSkpCi0KLSNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQihzZWcsIHdoYXQsIHN0cmluZywgdHlwZSwgb3RoZXIsIGRlc2MpCQlcCi0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCQkJCQkJCVwKLSAgICBlY29mZl9zdGFiICgoc2VnKSwgKHdoYXQpLCAoc3RyaW5nKSwgKHR5cGUpLCAob3RoZXIpLCAoZGVzYykpCi0jZW5kaWYgLyogRUNPRkZfREVCVUdHSU5HICovCi0KLWV4dGVybiB2b2lkIGVsZl9mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci0jaWZuZGVmIG9ial9mcm9iX3N5bWJvbAotI2RlZmluZSBvYmpfZnJvYl9zeW1ib2woc3ltcCwgcHVudCkgZWxmX2Zyb2Jfc3ltYm9sIChzeW1wLCAmcHVudCkKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBlbGZfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG9ial9wb3BfaW5zZXJ0KCkJZWxmX3BvcF9pbnNlcnQoKQotCi0jaWZuZGVmIE9CSl9NQVlCRV9FTEYKLSNkZWZpbmUgb2JqX2Vjb2ZmX3NldF9leHQgZWxmX2Vjb2ZmX3NldF9leHQKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBlY29mZl9leHRyOwotI2VuZGlmCi1leHRlcm4gdm9pZCBlbGZfZWNvZmZfc2V0X2V4dCBQQVJBTVMgKChzeW1ib2xTICosIHN0cnVjdCBlY29mZl9leHRyICopKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogX09CSl9FTEZfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZXZheC5jIGIvZ2FzL2NvbmZpZy9vYmotZXZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE4YzgzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWV2YXguYworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qIG9iai1ldmF4LmMgLSBFVkFYIChvcGVuVk1TL0FscGhhKSBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBLbGF1cyBL5G1wZiAoa2thZW1wZkBwcm9naXMuZGUpIG9mCi0gICAgIHByb0dJUyBTb2Z0d2FyZSwgQWFjaGVuLCBHZXJtYW55LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgT0JKX0hFQURFUiAib2JqLWV2YXguaCIKLQotI2luY2x1ZGUgImFzLmgiCi0KLXN0YXRpYyB2b2lkIHNfZXZheF93ZWFrIFBBUkFNUyAoKGludCkpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid2VhayIsIHNfZXZheF93ZWFrLCAwfSwKLSAgezAsIDAsIDB9LAotfTsJCQkJLyogb2JqX3BzZXVkb190YWJsZSAqLwotCi12b2lkIG9ial9yZWFkX2JlZ2luX2hvb2sgKCkge30KLQotLyogSGFuZGxlIHRoZSB3ZWFrIHNwZWNpZmljIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2V2YXhfd2VhayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBkbwotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIFNfU0VUX1dFQUsgKHN5bWJvbFApOwotICAgICAgaWYgKGMgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgICAgYyA9ICdcbic7Ci0JfQotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIG9iai1ldmF4LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWV2YXguaCBiL2dhcy9jb25maWcvb2JqLWV2YXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ5ZGIxOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ldmF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWV2YXguaAotICAgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgS2xhdXMgS+RtcGYgKGtrYWVtcGZAcHJvZ2lzLmRlKSBvZgotICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLAotICAgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogb2JqZWN0IGZvcm1hdCBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuCi0gKi8KLQotLyogZGVmaW5lIGFuIG9iaiBzcGVjaWZpYyBtYWNybyBvZmYgd2hpY2ggdGFyZ2V0IGNwdSBiYWNrIGVuZHMgbWF5IGtleS4gKi8KLSNkZWZpbmUgT0JKX0VWQVggMQotCi0vKiBpbmNsdWRlIHdoYXRldmVyIHRhcmdldCBjcHUgaXMgYXBwcm9wcmlhdGUuICovCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgT1VUUFVUX0ZMQVZPUiBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cgotI2VuZGlmCi0KLS8qCi0gKiBTWU1CT0xTCi0gKi8KLQotLyoKLSAqIElmIHlvdXIgb2JqZWN0IGZvcm1hdCBuZWVkcyB0byByZW9yZGVyIHN5bWJvbHMsIGRlZmluZSB0aGlzLiAgV2hlbgotICogZGVmaW5lZCwgc3ltYm9scyBhcmUga2VwdCBvbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBhbmQgZnVuY3Rpb25zIGFyZQotICogbWFkZSBhdmFpbGFibGUgZm9yIHB1c2gsIGluc2VydCwgYXBwZW5kLCBhbmQgZGVsZXRlLiAgSWYgbm90IGRlZmluZWQsCi0gKiBzeW1ib2xzIGFyZSBrZXB0IG9uIGEgc2luZ2x5IGxpbmtlZCBsaXN0LCBvbmx5IHRoZSBhcHBlbmQgYW5kIGNsZWFyCi0gKiBmYWNpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGFuZCB0aGV5IGFyZSBtYWNyb3MuCi0gKi8KLQotLyogI2RlZmluZSBTWU1CT0xTX05FRURfUEFDS1BPSU5URVJTICovCi0KLS8qICAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHZvaWQgKm5vdGhpbmc7Ci0gIH0KLW9ial9zeW1ib2xfdHlwZTsJCS8qIHNob3VsZCBiZSB0aGUgZm9ybWF0J3Mgc3ltYm9sIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAoMCkJLyogeW91ciBtYWdpYyBudW1iZXIgKi8KLQotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSxiLGMpCS8qIG11c3QgYmUgKnNvbWV0aGluZyouICBUaGlzIG5vLW9wJ3MgaXQgb3V0LiAqLwotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykgICAgICAgIHs7fQotCi0jZGVmaW5lIFNfU0VUX09USEVSKFMsVikKLSNkZWZpbmUgU19TRVRfVFlQRShTLFQpCi0jZGVmaW5lIFNfU0VUX0RFU0MoUyxEKQotI2RlZmluZSBTX0dFVF9PVEhFUihTKQkwCi0jZGVmaW5lIFNfR0VUX1RZUEUoUykJMAotI2RlZmluZSBTX0dFVF9ERVNDKFMpCTAKLQotI2RlZmluZSBQRFNDX1NfS19LSU5EX0ZQX1NUQUNLIDkKLSNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUiAxMAotI2RlZmluZSBQRFNDX1NfS19LSU5EX05VTEwgOAotCi0jZGVmaW5lIFBEU0NfU19LX01JTl9TVEFDS19TSVpFIDMyCi0jZGVmaW5lIFBEU0NfU19LX01JTl9SRUdJU1RFUl9TSVpFIDI0Ci0jZGVmaW5lIFBEU0NfU19LX05VTExfU0laRSAxNgotCi0jZGVmaW5lIFBEU0NfU19NX0JBU0VfUkVHX0lTX0ZQIDB4ODAJLyogbG93IGJ5dGUgKi8KLSNkZWZpbmUgUERTQ19TX01fTkFUSVZFIDB4MTAJCS8qIGhpZ2ggYnl0ZSAqLwotI2RlZmluZSBQRFNDX1NfTV9OT19KQUNLRVQgMHgyMAkJLyogaGlnaCBieXRlICovCi0KLSNkZWZpbmUgTEtQX1NfS19TSVpFIDE2Ci0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiBvYmotZXZheC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1nZW5lcmljLmMgYi9nYXMvY29uZmlnL29iai1nZW5lcmljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmMzZDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmMgYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gICBvYmplY3QgZm9ybWF0IHNwZWNpZmljIHNvdXJjZSBmaWxlcy4KLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygb2JqLWdlbmVyaWMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oIGIvZ2FzL2NvbmZpZy9vYmotZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzE4ZTQzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWdlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotZ2VuZXJpYy5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIG9iai1nZW5lcmljLmggYW5kIGlzIGludGVuZGVkIHRvIGJlIGEgdGVtcGxhdGUgZm9yCi0gKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqLwotCi0vKiBkZWZpbmUgYW4gb2JqIHNwZWNpZmljIG1hY3JvIG9mZiB3aGljaCB0YXJnZXQgY3B1IGJhY2sgZW5kcyBtYXkga2V5LiAqLwotI2RlZmluZSBPQkpfR0VORVJJQyAxCi0KLS8qIGluY2x1ZGUgd2hhdGV2ZXIgdGFyZ2V0IGNwdSBpcyBhcHByb3ByaWF0ZS4gKi8KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0vKgotICogU1lNQk9MUwotICovCi0KLS8qCi0gKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KLSAqIGRlZmluZWQsIHN5bWJvbHMgYXJlIGtlcHQgb24gYSBkb3VibHkgbGlua2VkIGxpc3QgYW5kIGZ1bmN0aW9ucyBhcmUKLSAqIG1hZGUgYXZhaWxhYmxlIGZvciBwdXNoLCBpbnNlcnQsIGFwcGVuZCwgYW5kIGRlbGV0ZS4gIElmIG5vdCBkZWZpbmVkLAotICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgotICogZmFjaWxpdGllcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhleSBhcmUgbWFjcm9zLgotICovCi0KLS8qICNkZWZpbmUgU1lNQk9MU19ORUVEX1BBQ0tQT0lOVEVSUyAqLwotCi0vKiAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB2b2lkICpub3RoaW5nOwotICB9Ci0KLW9ial9zeW1ib2xfdHlwZTsJCS8qIHNob3VsZCBiZSB0aGUgZm9ybWF0J3Mgc3ltYm9sIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOwotCi0vKiBzeW1ib2xzIGhhdmUgbmFtZXMgKi8KLSNkZWZpbmUgU19HRVRfTkFNRShzKQkJKCJmb28iKQkvKiBnZXQgdGhlIG5hbWUgb2YgYSBzeW1ib2xQICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJOwotLyogc3ltYm9scyBoYXZlIHNlZ21lbnRzICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKFNFR19VTktOT1dOKQotI2RlZmluZSBTX1NFVF9TRUdNRU5UKHMsdikJOwotLyogc3ltYm9scyBtYXkgYmUgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19JU19FWFRFUk5BTChzKQkoMCkKLSNkZWZpbmUgU19TRVRfRVhURVJOQUwocykJOwotCi0vKiBzeW1ib2xzIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQgKi8KLSNkZWZpbmUgU19JU19ERUZJTkVEKHMpCQkoMCkKLQotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAoMCkJLyogeW91ciBtYWdpYyBudW1iZXIgKi8KLQotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSxiLGMpCS8qIG11c3QgYmUgKnNvbWV0aGluZyouICBUaGlzIG5vLW9wJ3MgaXQgb3V0LiAqLwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2Ygb2JqLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYyBiL2dhcy9jb25maWcvb2JqLWhwMzAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOWNjNTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotaHAzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBvYmotaHAzMDAuaAotICAgQ29weXJpZ2h0IChDKSAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJjb25maWcvb2JqLWFvdXQuYyIKLQotLyogQW91dCBmaWxlIGdlbmVyYXRpb24gJiB1dGlsaXRpZXMgKi8KLXZvaWQKLWhwMzAwX2hlYWRlcl9hcHBlbmQgKHdoZXJlLCBoZWFkZXJzKQotICAgICBjaGFyICoqd2hlcmU7Ci0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICB0Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpOwotCi0jZGVmaW5lIERPKEZJRUxEKQlcCi0gIHsgXAotICAgIG1kX251bWJlcl90b19jaGFycyAoKndoZXJlLCBoZWFkZXJzLT5oZWFkZXIuRklFTEQsIHNpemVvZiAoaGVhZGVycy0+aGVhZGVyLkZJRUxEKSk7IFwKLSAgICAqd2hlcmUgKz0gc2l6ZW9mIChoZWFkZXJzLT5oZWFkZXIuRklFTEQpOyBcCi0gIH0KLQotICBETyAoYV9pbmZvKTsKLSAgRE8gKGFfc3BhcmUxKTsKLSAgRE8gKGFfc3BhcmUyKTsKLSAgRE8gKGFfdGV4dCk7ICAgICAgCi0gIERPIChhX2RhdGEpOyAgICAgCi0gIERPIChhX2Jzcyk7ICAgICAKLSAgRE8gKGFfdHJzaXplKTsgCi0gIERPIChhX2Ryc2l6ZSk7Ci0gIERPIChhX3NwYXJlMyk7Ci0gIERPIChhX3NwYXJlNCk7Ci0gIERPIChhX3NwYXJlNSk7Ci0gIERPIChhX2VudHJ5KTsgCi0gIERPIChhX3NwYXJlNik7Ci0gIERPIChhX3NwYXJlNyk7Ci0gIERPIChhX3N5bXMpOyAgCi0gIERPIChhX3NwYXJlOCk7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai1ocDMwMC5oIGIvZ2FzL2NvbmZpZy9vYmotaHAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0MDA2Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1ocDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIG9iai1ocDMwMC5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KLQotc3RydWN0IGV4ZWNfYnl0ZXMKLXsKLSAgdW5zaWduZWQgY2hhciBhX2luZm9bNF07ICAgLyogYV9tYWNodHlwZS9hX21hZ2ljICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTFbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTJbNF07Ci0gIHVuc2lnbmVkIGNoYXIgYV90ZXh0WzRdOyAgIC8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfZGF0YVs0XTsgICAvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX2Jzc1s0XTsgICAgLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhIGZvciBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfdHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfZHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmUzWzRdOyAvKiBIUCA9IHBhc2NhbCBpbnRlcmZhY2Ugc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3BhcmU0WzRdOyAvKiBIUCA9IHN5bWJvbCB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTVbNF07IC8qIEhQID0gZGVidWcgbmFtZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9lbnRyeVs0XTsgIC8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlNls0XTsgLyogSFAgPSBzb3VyY2UgbGluZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgYV9zcGFyZTdbNF07IC8qIEhQID0gdmFsdWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyIGFfc3ltc1s0XTsgICAvKiBsZW5ndGggb2Ygc3ltYm9sIHRhYmxlIGRhdGEgaW4gZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBhX3NwYXJlOFs0XTsKLX07Ci0KLS8qIEhvdyBiaWcgdGhlICJzdHJ1Y3QgZXhlYyIgaXMgb24gZGlzayAqLwotI2RlZmluZSBFWEVDX0JZVEVTX1NJWkUgKDE2ICogNCkKLQotc3RydWN0IGV4ZWMKLXsKLSAgdW5zaWduZWQgbG9uZyBhX2luZm87Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTE7Ci0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTI7Ci0gIHVuc2lnbmVkIGxvbmcgYV90ZXh0OyAgICAgIAotICB1bnNpZ25lZCBsb25nIGFfZGF0YTsgICAgIAotICB1bnNpZ25lZCBsb25nIGFfYnNzOyAgICAgCi0gIHVuc2lnbmVkIGxvbmcgYV90cnNpemU7IAotICB1bnNpZ25lZCBsb25nIGFfZHJzaXplOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmUzOwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU0OwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU1OwotICB1bnNpZ25lZCBsb25nIGFfZW50cnk7IAotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU2OwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU3OwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsgIAotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU4OwotfTsKLQotI2RlZmluZSBERUZBVUxUX01BR0lDX05VTUJFUl9GT1JfT0JKRUNUX0ZJTEUJKE9NQUdJQykKLSNkZWZpbmUgQU9VVF9WRVJTSU9OCTB4MDIKLSNkZWZpbmUgQU9VVF9NQUNIVFlQRQkweDBjCi0jZGVmaW5lIE9NQUdJQwkJMHgxMDYKLSAgICAKLSNkZWZpbmUgb2JqX2hlYWRlcl9hcHBlbmQJaHAzMDBfaGVhZGVyX2FwcGVuZAotI2luY2x1ZGUgImNvbmZpZy9vYmotYW91dC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotaWVlZS5jIGIvZ2FzL2NvbmZpZy9vYmotaWVlZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGEwNzk4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLWllZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0vKiBvYmotZm9ybWF0IGZvciBpZWVlLTY5NSByZWNvcmRzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0KLS8qCi0gIGNyZWF0ZWQgYnkKLQotICBzdGV2ZSBjaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0gICovCi0KLS8qCi0gIHRoaXMgd2lsbCBob3BlZnVsbHkgYmVjb21lIHRoZSBwb3J0IHRocm91Z2ggd2hpY2ggYmZkIGFuZCBnYXMgdGFsaywKLSAgZm9yIHRoZSBtb21lbnQsIG9ubHkgaWVlZSBpcyBrbm93biB0byB3b3JrIHdlbGwuCi0gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgotI2luY2x1ZGUgImZyYWdzLmgiCi0KLWJmZCAqYWJmZDsKLQotLyogSG93IG1hbnkgYWRkcmVzc2VzIGRvZXMgdGhlIC5hbGlnbiB0YWtlPyAqLwotc3RhdGljIHJlbGF4X2FkZHJlc3NUCi1yZWxheF9hbGlnbiAoYWRkcmVzcywgYWxpZ25tZW50KQotICAgICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwkvKiBBZGRyZXNzIG5vdy4gKi8KLSAgICAgcmVnaXN0ZXIgbG9uZyBhbGlnbm1lbnQ7CS8qIEFsaWdubWVudCAoYmluYXJ5KS4gKi8KLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19CQkJCS8qIHJlbGF4X2FsaWduKCkgKi8KLQotLyogY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNoYWluIGFuZCBjcmVhdGUgYSBiZmQgc2VjdGlvbgotICAgdG8gY29udGFpbiBhbGwgb2YgaXQgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoc2l6ZV9zZWN0aW9uLCAoYWJmZCwgaWR4KSwKLSAgICAgICBiZmQgKiBhYmZkIEFORAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIHVuc2lnbmVkIGludCBzaXplID0gMDsKLSAgZnJhZ1MgKmZyYWcgPSBzZWdtZW50X2luZm9baWR4XS5mcmFnX3Jvb3Q7Ci0gIHdoaWxlIChmcmFnKQotICAgIHsKLSAgICAgIGlmIChmcmFnLT5mcl9hZGRyZXNzICE9IHNpemUpCi0JewotCSAgcHJpbnRmIChfKCJPdXQgb2Ygc3RlcFxuIikpOwotCSAgc2l6ZSA9IGZyYWctPmZyX2FkZHJlc3M7Ci0JfQotICAgICAgc2l6ZSArPSBmcmFnLT5mcl9maXg7Ci0gICAgICBzd2l0Y2ggKGZyYWctPmZyX3R5cGUpCi0JewotCWNhc2UgcnNfZmlsbDoKLQljYXNlIHJzX29yZzoKLQkgIHNpemUgKz0gZnJhZy0+ZnJfb2Zmc2V0ICogZnJhZy0+ZnJfdmFyOwotCSAgYnJlYWs7Ci0JY2FzZSByc19hbGlnbjoKLQljYXNlIHJzX2FsaWduX2NvZGU6Ci0JICB7Ci0JICAgIGFkZHJlc3NUIG9mZjsKLQotCSAgICBvZmYgPSByZWxheF9hbGlnbiAoc2l6ZSwgZnJhZy0+ZnJfb2Zmc2V0KTsKLQkgICAgaWYgKGZyYWctPmZyX3N1YnR5cGUgIT0gMCAmJiBvZmYgPiBmcmFnLT5mcl9zdWJ0eXBlKQotCSAgICAgIG9mZiA9IDA7Ci0JICAgIHNpemUgKz0gb2ZmOwotCSAgfQotCX0KLSAgICAgIGZyYWcgPSBmcmFnLT5mcl9uZXh0OwotICAgIH0KLSAgaWYgKHNpemUpCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IHNlZ21lbnRfaW5mb1tpZHhdLm5hbWU7Ci0gICAgICBpZiAobmFtZSA9PSAoY2hhciAqKSBOVUxMKQotCXsKLQkgIG5hbWUgPSAiLmRhdGEiOwotCX0KLSAgICAgIHNlZ21lbnRfaW5mb1tpZHhdLnVzZXJfc3R1ZmYgPSAoY2hhciAqKSAoc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgbmFtZSkpOwotICAgICAgLyogTWFrZSBpdCBvdXRwdXQgdGhyb3VnaCBpdHNlbGYgKi8KLSAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24gPSBzZWM7Ci0gICAgICBzZWMtPmZsYWdzIHw9IFNFQ19IQVNfQ09OVEVOVFM7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjLCBzaXplKTsKLSAgICB9Ci19Ci0KLS8qIHJ1biB0aHJvdWdoIGEgZnJhZyBjaGFpbiBhbmQgd3JpdGUgb3V0IHRoZSBkYXRhIHRvIGdvIHdpdGggaXQgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZmlsbF9zZWN0aW9uLCAoYWJmZCwgaWR4KSwKLSAgICAgICBiZmQgKiBhYmZkIEFORAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIGFzZWN0aW9uICpzZWMgPSBzZWdtZW50X2luZm9baWR4XS51c2VyX3N0dWZmOwotICBpZiAoc2VjKQotICAgIHsKLSAgICAgIGZyYWdTICpmcmFnID0gc2VnbWVudF9pbmZvW2lkeF0uZnJhZ19yb290OwotICAgICAgdW5zaWduZWQgaW50IG9mZnNldCA9IDA7Ci0gICAgICB3aGlsZSAoZnJhZykKLQl7Ci0JICB1bnNpZ25lZCBpbnQgZmlsbF9zaXplOwotCSAgdW5zaWduZWQgaW50IGNvdW50OwotCSAgc3dpdGNoIChmcmFnLT5mcl90eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgcnNfZmlsbDoKLQkgICAgY2FzZSByc19hbGlnbjoKLQkgICAgY2FzZSByc19vcmc6Ci0JICAgICAgaWYgKGZyYWctPmZyX2ZpeCkKLQkJewotCQkgIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwKLQkJCQkJICAgIHNlYywKLQkJCQkJICAgIGZyYWctPmZyX2xpdGVyYWwsCi0JCQkJCSAgICBmcmFnLT5mcl9hZGRyZXNzLAotCQkJCQkgICAgZnJhZy0+ZnJfZml4KTsKLQkJfQotCSAgICAgIG9mZnNldCArPSBmcmFnLT5mcl9maXg7Ci0JICAgICAgZmlsbF9zaXplID0gZnJhZy0+ZnJfdmFyOwotCSAgICAgIGlmIChmaWxsX3NpemUpCi0JCXsKLQkJICB1bnNpZ25lZCBpbnQgb2ZmID0gZnJhZy0+ZnJfZml4OwotCQkgIGZvciAoY291bnQgPSBmcmFnLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCQkgICAgewotCQkgICAgICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHNlYywKLQkJCQkJCWZyYWctPmZyX2xpdGVyYWwgKwotCQkJCQkJZnJhZy0+ZnJfZml4LAotCQkJCQkJZnJhZy0+ZnJfYWRkcmVzcyArIG9mZiwKLQkJCQkJCWZpbGxfc2l6ZSk7Ci0JCSAgICAgIG9mZiArPSBmaWxsX3NpemU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0JfQotICAgIH0KLX0KLQotLyogQ291bnQgdGhlIHJlbG9jYXRpb25zIGluIGEgY2hhaW4gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotREVGVU4gKGNvdW50X2VudHJpZXNfaW5fY2hhaW4sIChpZHgpLAotICAgICAgIHVuc2lnbmVkIGludCBpZHgpCi17Ci0gIHVuc2lnbmVkIGludCBucmVsb2NzOwotICBmaXhTICpmaXh1cF9wdHI7Ci0KLSAgLyogQ291bnQgdGhlIHJlbG9jYXRpb25zICovCi0gIGZpeHVwX3B0ciA9IHNlZ21lbnRfaW5mb1tpZHhdLmZpeF9yb290OwotICBucmVsb2NzID0gMDsKLSAgd2hpbGUgKGZpeHVwX3B0ciAhPSAoZml4UyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGZpeHVwX3B0ciA9IGZpeHVwX3B0ci0+ZnhfbmV4dDsKLSAgICAgIG5yZWxvY3MrKzsKLSAgICB9Ci0gIHJldHVybiBucmVsb2NzOwotfQotCi0vKiBvdXRwdXQgYWxsIHRoZSByZWxvY2F0aW9ucyBmb3IgYSBzZWN0aW9uICovCi12b2lkCi1ERUZVTiAoZG9fcmVsb2NzX2ZvciwgKGlkeCksCi0gICAgICAgdW5zaWduZWQgaW50IGlkeCkKLXsKLSAgdW5zaWduZWQgaW50IG5yZWxvY3M7Ci0gIGFyZWxlbnQgKipyZWxvY19wdHJfdmVjdG9yOwotICBhcmVsZW50ICpyZWxvY192ZWN0b3I7Ci0gIGFzeW1ib2wgKipwdHJzOwotICBhc2VjdGlvbiAqc2VjdGlvbiA9IChhc2VjdGlvbiAqKSAoc2VnbWVudF9pbmZvW2lkeF0udXNlcl9zdHVmZik7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmaXhTICpmcm9tOwotICBpZiAoc2VjdGlvbikKLSAgICB7Ci0gICAgICBucmVsb2NzID0gY291bnRfZW50cmllc19pbl9jaGFpbiAoaWR4KTsKLQotICAgICAgcmVsb2NfcHRyX3ZlY3RvciA9IChhcmVsZW50ICoqKSBtYWxsb2MgKChucmVsb2NzICsgMSkgKiBzaXplb2YgKGFyZWxlbnQgKikpOwotICAgICAgcmVsb2NfdmVjdG9yID0gKGFyZWxlbnQgKikgbWFsbG9jIChucmVsb2NzICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICBwdHJzID0gKGFzeW1ib2wgKiopIG1hbGxvYyAobnJlbG9jcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBmcm9tID0gc2VnbWVudF9pbmZvW2lkeF0uZml4X3Jvb3Q7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbnJlbG9jczsgaSsrKQotCXsKLQkgIGFyZWxlbnQgKnRvID0gcmVsb2NfdmVjdG9yICsgaTsKLQkgIGFzeW1ib2wgKnM7Ci0JICByZWxvY19wdHJfdmVjdG9yW2ldID0gdG87Ci0JICB0by0+aG93dG8gPSAocmVsb2NfaG93dG9fdHlwZSAqKSAoZnJvbS0+Znhfcl90eXBlKTsKLQotI2lmIDAJICAvKiBXZSBjYW4ndCByZXByZXNlbnQgY29tcGxpY2F0ZWQgdGhpbmdzIGluIGEgcmVsb2MgeWV0ICovCi0JICBpZiAoZnJvbS0+ZnhfYWRkc3kgPT0gMCB8fCBmcm9tLT5meF9zdWJzeSAhPSAwKSBhYm9ydCgpOwotI2VuZGlmCi0KLQkgIHMgPSAmKGZyb20tPmZ4X2FkZHN5LT5zeV9zeW1ib2wuc3kpOwotCSAgdG8tPmFkZHJlc3MgPSAoKGNoYXIgKikgKGZyb20tPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKwotCQkJCSAgIGZyb20tPmZ4X3doZXJlKSkKLQkgICAgLSAoKGNoYXIgKikgKCYoZnJvbS0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCkpKTsKLQkgIHRvLT5hZGRlbmQgPSBmcm9tLT5meF9vZmZzZXQ7Ci0JICAvKiBJZiB3ZSBrbm93IHRoZSBzeW1ib2wgd2hpY2ggd2Ugd2FudCB0byByZWxvY2F0ZSB0bywgdHVybgotCSAgICAgdGhpcyByZWxvYWN0aW9uIGludG8gYSBzZWN0aW9uIHJlbGF0aXZlLgotCi0JICAgICBJZiB0aGlzIHJlbG9jYXRpb24gaXMgcGNyZWxhdGl2ZSwgYW5kIHdlIGtub3cgdGhlCi0JICAgICBkZXN0aW5hdGlvbiwgd2Ugc3RpbGwgd2FudCB0byBrZWVwIHRoZSByZWxvY2F0aW9uIC0gc2luY2UKLQkgICAgIHRoZSBsaW5rZXIgbWlnaHQgcmVsYXggc29tZSBvZiB0aGUgYnl0ZXMsIGJ1dCBpdCBzdG9wcwotCSAgICAgYmVpbmcgcGMgcmVsYXRpdmUgYW5kIHR1cm5zIGludG8gYW4gYWJzb2x1dGUgcmVsb2NhdGlvbi4gKi8KLQkgIGlmIChzKQotCSAgICB7Ci0JICAgICAgaWYgKChzLT5mbGFncyAmIEJTRl9VTkRFRklORUQpID09IDApCi0JCXsKLQkJICB0by0+c2VjdGlvbiA9IHMtPnNlY3Rpb247Ci0KLQkJICAvKiBXZSBjYW4gcmVmZXIgZGlyZWN0bHkgdG8gdGhlIHZhbHVlIGZpZWxkIGhlcmUsCi0JCSAgICAgcmF0aGVyIHRoYW4gdXNpbmcgU19HRVRfVkFMVUUsIGJlY2F1c2UgdGhpcyBpcwotCQkgICAgIG9ubHkgY2FsbGVkIGFmdGVyIGRvX3N5bWJvbHMsIHdoaWNoIHNldHMgdXAgdGhlCi0JCSAgICAgdmFsdWUgZmllbGQuICAqLwotCQkgIHRvLT5hZGRlbmQgKz0gcy0+dmFsdWU7Ci0KLQkJICB0by0+c3ltX3B0cl9wdHIgPSAwOwotCQkgIGlmICh0by0+aG93dG8tPnBjcmVsX29mZnNldCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhpcyBpcyBhIHBjcmVsIHJlbG9jYXRpb24sIHRoZSBhZGRlbmQgc2hvdWxkIGJlIGFkanVzdGVkICovCi0JCSAgICAgIHRvLT5hZGRlbmQgLT0gdG8tPmFkZHJlc3MgKyAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdG8tPnNlY3Rpb24gPSAwOwotCQkgICpwdHJzID0gJihmcm9tLT5meF9hZGRzeS0+c3lfc3ltYm9sLnN5KTsKLQkJICB0by0+c3ltX3B0cl9wdHIgPSBwdHJzOwotCi0JCSAgaWYgKHRvLT5ob3d0by0+cGNyZWxfb2Zmc2V0KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIGEgcGNyZWwgcmVsb2NhdGlvbiwgdGhlIGFkZGVuZCBzaG91bGQgYmUgYWRqdXN0ZWQgKi8KLQkJICAgICAgdG8tPmFkZGVuZCAtPSB0by0+YWRkcmVzcyAtIDE7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB0by0+c2VjdGlvbiA9IDA7Ci0JICAgIH0KLQotCSAgcHRycysrOwotCSAgZnJvbSA9IGZyb20tPmZ4X25leHQ7Ci0JfQotCi0gICAgICAvKiBhdHRhdGNoIHRvIHRoZSBzZWN0aW9uICovCi0gICAgICBzZWN0aW9uLT5vcmVsb2NhdGlvbiA9IHJlbG9jX3B0cl92ZWN0b3I7Ci0gICAgICBzZWN0aW9uLT5yZWxvY19jb3VudCA9IG5yZWxvY3M7Ci0gICAgICBzZWN0aW9uLT5mbGFncyB8PSBTRUNfTE9BRDsKLSAgICB9Ci19Ci0KLS8qIGRvIHRoZSBzeW1ib2xzLi4gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoZG9fc3ltYm9scywgKGFiZmQpLAotICAgICAgIGJmZCAqIGFiZmQpCi17Ci0gIGV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci0gIHN5bWJvbFMgKnB0cjsKLSAgYXN5bWJvbCAqKnN5bWJvbF9wdHJfdmVjOwotICBhc3ltYm9sICpzeW1ib2xfdmVjOwotICB1bnNpZ25lZCBpbnQgY291bnQgPSAwOwotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLQotICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsKLSAgICAgICBwdHIgIT0gKHN5bWJvbFMgKikgTlVMTDsKLSAgICAgICBwdHIgPSBwdHItPnN5X25leHQpCi0gICAgewotICAgICAgaWYgKFNFR19OT1JNQUwgKHB0ci0+c3lfc3ltYm9sLnNlZykpCi0JewotCSAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9Ci0JICAgIChhc2VjdGlvbiAqKSAoc2VnbWVudF9pbmZvW3B0ci0+c3lfc3ltYm9sLnNlZ10udXNlcl9zdHVmZik7Ci0JICBTX1NFVF9WQUxVRSAocHRyLCBTX0dFVF9WQUxVRSAocHRyKSArIHB0ci0+c3lfZnJhZy0+ZnJfYWRkcmVzcyk7Ci0JICBpZiAocHRyLT5zeV9zeW1ib2wuc3kuZmxhZ3MgPT0gMCkKLQkgICAgewotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzID0gQlNGX0xPQ0FMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAocHRyLT5zeV9zeW1ib2wuc2VnKQotCSAgICB7Ci0JICAgIGNhc2UgU0VHX0FCU09MVVRFOgotCSAgICAgIHB0ci0+c3lfc3ltYm9sLnN5LmZsYWdzIHw9IEJTRl9BQlNPTFVURTsKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5zZWN0aW9uID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTRUdfVU5LTk9XTjoKLQkgICAgICBwdHItPnN5X3N5bWJvbC5zeS5mbGFncyA9IEJTRl9VTkRFRklORUQ7Ci0JICAgICAgcHRyLT5zeV9zeW1ib2wuc3kuc2VjdGlvbiA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBwdHItPnN5X3N5bWJvbC5zeS52YWx1ZSA9IFNfR0VUX1ZBTFVFIChwdHIpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gIHN5bWJvbF9wdHJfdmVjID0gKGFzeW1ib2wgKiopIG1hbGxvYyAoKGNvdW50ICsgMSkgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotCi0gIGluZGV4ID0gMDsKLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7Ci0gICAgICAgcHRyICE9IChzeW1ib2xTICopIE5VTEw7Ci0gICAgICAgcHRyID0gcHRyLT5zeV9uZXh0KQotICAgIHsKLSAgICAgIHN5bWJvbF9wdHJfdmVjW2luZGV4XSA9ICYocHRyLT5zeV9zeW1ib2wuc3kpOwotICAgICAgaW5kZXgrKzsKLSAgICB9Ci0gIHN5bWJvbF9wdHJfdmVjW2luZGV4XSA9IDA7Ci0gIGFiZmQtPm91dHN5bWJvbHMgPSBzeW1ib2xfcHRyX3ZlYzsKLSAgYWJmZC0+c3ltY291bnQgPSBjb3VudDsKLX0KLQotLyogVGhlIGdlbmVyaWMgYXMtPmJmZCBjb252ZXJ0ZXIuIE90aGVyIGJhY2tlbmRzIG1heSBoYXZlIHNwZWNpYWwgY2FzZQotICAgY29kZSAqLwotCi12b2lkCi1ERUZVTl9WT0lEIChiZmRfYXNfd3JpdGVfaG9vaykKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0gICAgICBzaXplX3NlY3Rpb24gKGFiZmQsIGkpOwotICAgIH0KLQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgZmlsbF9zZWN0aW9uIChhYmZkLCBpKTsKLQotICBkb19zeW1ib2xzIChhYmZkKTsKLQotICBmb3IgKGkgPSBTRUdfRTA7IGkgPCBTRUdfVU5LTk9XTjsgaSsrKQotICAgIGRvX3JlbG9jc19mb3IgKGkpOwotCi19Ci0KLVNfU0VUX1NFR01FTlQgKHgsIHkpCi0gICAgIHN5bWJvbFMgKng7Ci0gICAgIGludCB5OwotewotICB4LT5zeV9zeW1ib2wuc2VnID0geTsKLX0KLQotU19JU19ERUZJTkVEICh4KQotICAgICBzeW1ib2xTICp4OwotewotICBpZiAoU0VHX05PUk1BTCAoeC0+c3lfc3ltYm9sLnNlZykpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBzd2l0Y2ggKHgtPnN5X3N5bWJvbC5zZWcpCi0gICAgewotICAgIGNhc2UgU0VHX1VOS05PV046Ci0gICAgICByZXR1cm4gMDsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi1TX0lTX0VYVEVSTkFMICh4KQotewotICBhYm9ydCAoKTsKLX0KLQotU19HRVRfREVTQyAoeCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLVNfR0VUX1NFR01FTlQgKHgpCi0gICAgIHN5bWJvbFMgKng7Ci17Ci0gIHJldHVybiB4LT5zeV9zeW1ib2wuc2VnOwotfQotCi1TX1NFVF9FWFRFUk5BTCAoeCkKLSAgICAgc3ltYm9sUyAqeDsKLXsKLSAgeC0+c3lfc3ltYm9sLnN5LmZsYWdzIHw9IEJTRl9HTE9CQUwgfCBCU0ZfRVhQT1JUOwotfQotCi1TX1NFVF9OQU1FICh4LCB5KQotICAgICBzeW1ib2xTICp4OwotICAgICBjaGFyICp5OwotewotICB4LT5zeV9zeW1ib2wuc3kubmFtZSA9IHk7Ci19Ci0KLVNfR0VUX09USEVSICh4KQotewotICBhYm9ydCAoKTsKLX0KLQotU19JU19ERUJVRyAoeCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLSNpZm5kZWYgc2VnbWVudF9uYW1lCi1jaGFyICoKLXNlZ21lbnRfbmFtZSAoKQotewotICBhYm9ydCAoKTsKLX0KLSNlbmRpZgotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1vYmpfaWVlZV9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4dGVybiBjaGFyICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGV4dGVybiBjaGFyIGlzX2VuZF9vZl9saW5lW107Ci0gIGNoYXIgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKnMgPSBwOwotICBpbnQgaTsKLSAgLyogTG9vayB1cCB0aGUgbmFtZSwgaWYgaXQgZG9lc24ndCBleGlzdCwgbWFrZSBpdCAqLwotICB3aGlsZSAoKnAgJiYgKnAgIT0gJyAnICYmICpwICE9ICcsJyAmJiAhaXNfZW5kX29mX2xpbmVbKnBdKQotICAgIHsKLSAgICAgIHArKzsKLSAgICB9Ci0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgaWYgKHNlZ21lbnRfaW5mb1tpXS5oYWRvbmUpCi0JewotCSAgaWYgKHN0cm5jbXAgKHNlZ21lbnRfaW5mb1tpXS5uYW1lLCBzLCBwIC0gcykgPT0gMCkKLQkgICAgewotCSAgICAgIGdvdG8gb2s7Ci0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlicmVhazsKLSAgICB9Ci0gIGlmIChpID09IFNFR19VTktOT1dOKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidG9vIG1hbnkgc2VjdGlvbnMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNlZ21lbnRfaW5mb1tpXS5oYWRvbmUgPSAxOwotICBzZWdtZW50X2luZm9baV0ubmFtZSA9IG1hbGxvYyAocCAtIHMgKyAxKTsKLSAgbWVtY3B5IChzZWdtZW50X2luZm9baV0ubmFtZSwgcywgcCAtIHMpOwotICBzZWdtZW50X2luZm9baV0ubmFtZVtwIC0gc10gPSAwOwotb2s6Ci0gIHN1YnNlZ19zZXQgKGksIDApOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWypwXSkKLSAgICBwKys7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0KLX0KLQotCi12b2lkIGNvbnMgKCk7Ci12b2lkIHNfaWdub3JlICgpOwotCi0KLXZvaWQgc19nbG9ibCAoKTsKLWNvbnN0IHBzZXVkb190eXBlUyBvYmpfcHNldWRvX3RhYmxlW10gPQotewotICB7InNlY3Rpb24iLCBvYmpfaWVlZV9zZWN0aW9uLCAwfSwKLSAgeyJkYXRhLmIiLCBjb25zLCAxfSwKLSAgeyJkYXRhLnciLCBjb25zLCAyfSwKLSAgeyJkYXRhLmwiLCBjb25zLCA0fSwKLSAgeyJleHBvcnQiLCBzX2dsb2JsLCAwfSwKLSAgeyJvcHRpb24iLCBzX2lnbm9yZSwgMH0sCi0gIHsiZW5kIiwgc19pZ25vcmUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJzZGF0YSIsIHN0cmluZ2VyLCAwfSwKLSAgMCwKLQotfTsKLQotCi0KLXZvaWQKLW9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIHN5bWJvbFAtPnN5X3N5bWJvbC5zeS50aGVfYmZkID0gYWJmZDsKLX0KLQotCi0KLQotCi0jaWYgMQotZXh0ZXJuIHZvaWQKLURFRlVOX1ZPSUQgKHdyaXRlX29iamVjdF9maWxlKQotewotICBpbnQgaTsKLSAgc3RydWN0IGZyY2hhaW4gKmZyY2hhaW5fcHRyOwotICBzdHJ1Y3QgZnJhZyAqZnJhZ19wdHI7Ci0KLSAgYWJmZCA9IGJmZF9vcGVudyAob3V0X2ZpbGVfbmFtZSwgImllZWUiKTsKLQotICBpZiAoYWJmZCA9PSAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBvdXRfZmlsZV9uYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICBiZmRfc2V0X2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCk7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChhYmZkLCBiZmRfYXJjaF9oODMwMCwgMCk7Ci0gIHN1YnNlZ19zZXQgKDEsIDApOwotICBzdWJzZWdfc2V0ICgyLCAwKTsKLSAgc3Vic2VnX3NldCAoMywgMCk7Ci0gIGZvciAoZnJjaGFpbl9wdHIgPSBmcmNoYWluX3Jvb3Q7Ci0gICAgICAgZnJjaGFpbl9wdHIgIT0gKHN0cnVjdCBmcmNoYWluICopIE5VTEw7Ci0gICAgICAgZnJjaGFpbl9wdHIgPSBmcmNoYWluX3B0ci0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgc3ViLXNlZ21lbnRzIGFuZCBhbGlnbiB0aGVtIHVwLiBBbHNvIGNsb3NlIGFueQotCSBvcGVuIGZyYWdzLiBXZSB0YWNrIGEgLmZpbGwgb250byB0aGUgZW5kIG9mIHRoZSBmcmFnIGNoYWluIHNvCi0JIHRoYXQgYW55IC5hbGlnbidzIHNpemUgY2FuIGJlIHdvcmtlZCBieSBsb29raW5nIGF0IHRoZSBuZXh0Ci0JIGZyYWcuICAqLwotCi0gICAgICBzdWJzZWdfc2V0IChmcmNoYWluX3B0ci0+ZnJjaF9zZWcsIGZyY2hhaW5fcHRyLT5mcmNoX3N1YnNlZyk7Ci0jaWZuZGVmIFNVQl9TRUdNRU5UX0FMSUdOCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotI2VuZGlmCi0gICAgICBmcmFnX2FsaWduIChTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksIDAsIDApOwotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25vdy0+ZnJfZml4ID0gMDsKLSAgICAgIGtub3cgKGZyYWdfbm93LT5mcl9uZXh0ID09IE5VTEwpOwotICAgIH0KLQotICAvKiBOb3cgYnVpbGQgb25lIGJpZyBmcmFnIGNoYWluIGZvciBlYWNoIHNlZ21lbnQsIGxpbmtlZCB0aHJvdWdoCi0JICAgZnJfbmV4dC4gKi8KLSAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICB7Ci0KLSAgICAgIGZyYWdTICoqcHJldl9mcmFnX3B0cl9wdHI7Ci0gICAgICBzdHJ1Y3QgZnJjaGFpbiAqbmV4dF9mcmNoYWluX3B0cjsKLQotICAgICAgLyoJc3RydWN0IGZyYWcgKipoZWFkX3B0ciA9IHNlZ21lbnRfaW5mb1tpXS5mcmFnX3Jvb3Q7Ki8KLQotICAgICAgc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdCA9IHNlZ21lbnRfaW5mb1tpXS5mcmNoYWluUC0+ZnJjaF9yb290OwotI2lmIDAKLSAgICAgIC8qIEltIG5vdCBzdXJlIHdoYXQgdGhpcyBpcyBmb3IgKi8KLSAgICAgIGZvciAoZnJjaGFpbl9wdHIgPSBzZWdtZW50X2luZm9baV0uZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgICBmcmNoYWluX3B0ciAhPSAoc3RydWN0IGZyY2hhaW4gKikgTlVMTDsKLQkgICBmcmNoYWluX3B0ciA9IGZyY2hhaW5fcHRyLT5mcmNoX25leHQpCi0JewotCSAgKmhlYWRfcHRyID0gZnJjaGFpbl9wdHI7Ci0JICBoZWFkX3B0ciA9ICZmcmNoYWluX3B0ci0+bmV4dDsKLQl9Ci0KLQotI2VuZGlmCi0gICAgfQotCi0gIGZvciAoaSA9IFNFR19FMDsgaSA8IFNFR19VTktOT1dOOyBpKyspCi0gICAgewotICAgICAgcmVsYXhfc2VnbWVudCAoc2VnbWVudF9pbmZvW2ldLmZyYWdfcm9vdCwgaSk7Ci0gICAgfQotCi0gIC8qIE5vdyB0aGUgYWRkcmVzc2VzIG9mIHRoZSBmcmFncyBhcmUgY29ycmVjdCB3aXRoaW4gdGhlIHNlZ21lbnQgKi8KLQotICBiZmRfYXNfd3JpdGVfaG9vayAoKTsKLSAgYmZkX2Nsb3NlIChhYmZkKTsKLX0KLQotI2VuZGlmCi0KLUhfU0VUX1RFWFRfU0laRSAoYSwgYikKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfR0VUX1RFWFRfU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9TRVRfQlNTX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfU0VUX1NUUklOR19TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX1NFVF9SRUxPQ0FUSU9OX1NJWkUgKCkKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLUhfU0VUX01BR0lDX05VTUJFUiAoKQotewotICBhYm9ydCAoKTsKLX0KLQotSF9HRVRfRklMRV9TSVpFICgpCi17Ci0gIGFib3J0ICgpOwotfQotCi1IX0dFVF9URVhUX1JFTE9DQVRJT05fU0laRSAoKQotewotICBhYm9ydCAoKTsKLX0KLQotLyogZW5kIG9mIG9iai1pZWVlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLWllZWUuaCBiL2dhcy9jb25maWcvb2JqLWllZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwZjEyNi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1pZWVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb2JqLWllZWUuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIEJGRCAxCi0KLSNpbmNsdWRlIDxiZmQuaD4KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgYXN5bWJvbCBzeTsKLSAgaW50IHNlZzsKLX0KLQotb2JqX3N5bWJvbF90eXBlOwotCi0jZGVmaW5lIFNfR0VUX05BTUUocykgKCgocyktPnN5X3N5bWJvbC5zeS5uYW1lKSkKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGludCB4OwotICB9Ci0KLW9iamVjdF9oZWFkZXJzOwotCi0jZGVmaW5lIERFRkFVTFRfTUFHSUNfTlVNQkVSX0ZPUl9PQkpFQ1RfRklMRSAxCi0KLQotaW50IGxpbmVub19yb290UDsKLQotCi0jZGVmaW5lIElFRUVfU1RZTEUKLQotLyogZW5kIG9mIG9iai1pZWVlLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLW11bHRpLmMgYi9nYXMvY29uZmlnL29iai1tdWx0aS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTE1MDkzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLW11bHRpLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLS8qIGZvbyAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuaCBiL2dhcy9jb25maWcvb2JqLW11bHRpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NGM2MWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotbXVsdGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIGhpICovCi0KLSNpbmNsdWRlICJlbXVsLmgiCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2RlZmluZSBPVVRQVVRfRkxBVk9SCQkodGhpc19mb3JtYXQtPmZsYXZvcikKLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKFMsUCkJKHRoaXNfZm9ybWF0LT5mcm9iX3N5bWJvbCkoUywmKFApKQotI2RlZmluZSBvYmpfZnJvYl9maWxlCQkodGhpc19mb3JtYXQtPmZyb2JfZmlsZSkKLSNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKHRoaXNfZm9ybWF0LT5mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzKQotI2RlZmluZSBvYmpfZWNvZmZfc2V0X2V4dAkodGhpc19mb3JtYXQtPmVjb2ZmX3NldF9leHQpCi0jZGVmaW5lIG9ial9wb3BfaW5zZXJ0CQkodGhpc19mb3JtYXQtPnBvcF9pbnNlcnQpCi0jZGVmaW5lIG9ial9yZWFkX2JlZ2luX2hvb2soKQkodGhpc19mb3JtYXQtPnJlYWRfYmVnaW5faG9vaz90aGlzX2Zvcm1hdC0+cmVhZF9iZWdpbl9ob29rKCk6KHZvaWQpMCkKLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vawkodGhpc19mb3JtYXQtPnN5bWJvbF9uZXdfaG9vaykKLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jICh0aGlzX2Zvcm1hdC0+c2VjX3N5bV9va19mb3JfcmVsb2MpCi0jZGVmaW5lIFNfR0VUX1NJWkUJCSh0aGlzX2Zvcm1hdC0+c19nZXRfc2l6ZSkKLSNkZWZpbmUgU19TRVRfU0laRQkJKHRoaXNfZm9ybWF0LT5zX3NldF9zaXplKQotI2RlZmluZSBTX0dFVF9BTElHTgkJKHRoaXNfZm9ybWF0LT5zX2dldF9hbGlnbikKLSNkZWZpbmUgU19TRVRfQUxJR04JCSh0aGlzX2Zvcm1hdC0+c19zZXRfYWxpZ24pCi0jZGVmaW5lIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTICh0aGlzX2Zvcm1hdC0+Y29weV9zeW1ib2xfYXR0cmlidXRlcykKLSNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQgkodGhpc19mb3JtYXQtPnByb2Nlc3Nfc3RhYikKLQotI2lmIGRlZmluZWQgKE9CSl9NQVlCRV9FQ09GRikgfHwgKGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpICYmIGRlZmluZWQgKFRDX01JUFMpKQotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMQotI2VuZGlmCi0KLS8qIEZJWE1FOiBXaGF0J3MgdGhlIHN0b3J5IGhlcmU/ICBXaHkgZG8gd2UgaGF2ZSB0byBkZWZpbmUKLSAgIE9CSl9TWU1GSUVMRF9UWVBFIGJvdGggaGVyZSBhbmQgaW4gb2JqLWVsZi5oPyAgKi8KLQotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLXN0cnVjdCBlbGZfb2JqX3N5Ci17Ci0gIGludCBsb2NhbDsKLSAgZXhwcmVzc2lvblMgKnNpemU7Ci0gIGNoYXIgKnZlcnNpb25lZF9uYW1lOwotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotICAvKiBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBFQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHdlIG5lZWQgc29tZQotICAgICBhZGRpdGlvbmFsIGZpZWxkcyBmb3IgZWFjaCBzeW1ib2wuICAqLwotICBzdHJ1Y3QgZWZkciAqZWNvZmZfZmlsZTsKLSAgc3RydWN0IGxvY2Fsc3ltICplY29mZl9zeW1ib2w7Ci0gIHZhbHVlVCBlY29mZl9leHRlcm5fc2l6ZTsKLSNlbmRpZgotfTsKLSNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgc3RydWN0IGVsZl9vYmpfc3kKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotc29tLmMgYi9nYXMvY29uZmlnL29iai1zb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhZjE4Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1zb20uYworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKiBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuCi0KLSAgIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0gICBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogU09NIGRvZXMgbm90IG5lZWQgYW55IHBzZXVkby1vcHMuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAge05VTEx9Ci19OwotCi1zdGF0aWMgaW50IHZlcnNpb25fc2VlbiA9IDA7Ci1zdGF0aWMgaW50IGNvcHlyaWdodF9zZWVuID0gMDsKLXN0YXRpYyBpbnQgY29tcGlsZXJfc2VlbiA9IDA7Ci0KLS8qIFVudXNlZCBieSBTT00uICAqLwotdm9pZCBvYmpfcmVhZF9iZWdpbl9ob29rICgpIHt9Ci0KLS8qIEhhbmRsZSBhIC5jb21waWxlciBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byBjcmVhdGUgdGhlCi0gICBjb21waWxhdGlvbiB1bml0IGF1eGlsaWFyeSBoZWFkZXIgZm9yIE1QRSBzdWNoIHRoYXQgdGhlIGxpbmtlZGl0b3IKLSAgIGNhbiBoYW5kbGUgU09NIGV4dHJhY3Rpb24gZnJvbSBhcmNoaXZlcy4gVGhlIGZvcm1hdCBvZiB0aGUgcXVvdGVkCi0gICBzdHJpbmcgaXMgInNvdXJjZWZpbGUgbGFuZ3VhZ2UgdmVyc2lvbiIgYW5kIGlzIGRlbGltaXRlZCBieSBibGFua3MuKi8KLQotdm9pZAotb2JqX3NvbV9jb21waWxlciAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpidWY7Ci0gIGNoYXIgYzsKLSAgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKmxhbmd1YWdlX25hbWU7Ci0gIGNoYXIgKnA7Ci0gIGNoYXIgKnZlcnNpb25faWQ7Ci0KLSAgaWYgKGNvbXBpbGVyX3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkICgiT25seSBvbmUgLmNvbXBpbGVyIHBzZXVkby1vcCBwZXIgZmlsZSEiKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKLSAgICB7Ci0gICAgICBidWYgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHdoaWxlIChpc19hX2NoYXIgKG5leHRfY2hhcl9vZl9zdHJpbmcgKCkpKQotCTsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMDAwJzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIik7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBQYXJzZSB0aGUgcXVvdGVkIHN0cmluZyBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuICBTa2lwIHRoZQotICAgICBxdW90ZS4gICovCi0gIGZpbGVuYW1lID0gYnVmICsgMTsKLSAgcCA9IGZpbGVuYW1lOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykKLSAgICBwKys7Ci0gIGlmICgqcCA9PSAnXDAwMCcpCi0gICAgewotICAgICAgYXNfYmFkICgiLmNvbXBpbGVyIGRpcmVjdGl2ZSBtaXNzaW5nIGxhbmd1YWdlIGFuZCB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICBsYW5ndWFnZV9uYW1lCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcMDAwJykgcCsrOwotICBpZiAoKnAgPT0gJ1wwMDAnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIi5jb21waWxlciBkaXJlY3RpdmUgbWlzc2luZyB2ZXJzaW9uIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9ICdcMDAwJzsKLQotICB2ZXJzaW9uX2lkCT0gKytwOwotICB3aGlsZSAoKnAgIT0gJ1wwMDAnKSBwKys7Ci0gIC8qIFJlbW92ZSB0aGUgdHJhaWxpbmcgcXVvdGUuICAqLwotICAqKC0tcCkgPSAnXDAwMCc7Ci0KLSAgY29tcGlsZXJfc2VlbiA9IDE7Ci0gIGlmICghIGJmZF9zb21fYXR0YWNoX2NvbXBpbGF0aW9uX3VuaXQgKHN0ZG91dHB1dCwgZmlsZW5hbWUsIGxhbmd1YWdlX25hbWUsCi0JCQkJCSAiR05VIFRvb2xzIiwgdmVyc2lvbl9pZCkpCi0gICAgewotICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBhc19mYXRhbCAoIkZBVEFMOiBBdHRhY2hpbmcgY29tcGlsZXIgaGVhZGVyICVzIiwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnZlcnNpb24gZGlyZWN0aXZlLiAgKi8KLQotdm9pZAotb2JqX3NvbV92ZXJzaW9uICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKnZlcnNpb24sIGM7Ci0KLSAgaWYgKHZlcnNpb25fc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk9ubHkgb25lIC52ZXJzaW9uIHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgdmVyc2lvbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKGlzX2FfY2hhciAobmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwMDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHZlcnNpb25fc2VlbiA9IDE7Ci0gIGlmIChiZmRfc29tX2F0dGFjaF9hdXhfaGRyIChzdGRvdXRwdXQsIFZFUlNJT05fQVVYX0lELCB2ZXJzaW9uKSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBiZmRfcGVycm9yIChzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IEF0dGFjaGluZyB2ZXJzaW9uIGhlYWRlciAlcyIpLCBzdGRvdXRwdXQtPmZpbGVuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmNvcHlyaWdodCBkaXJlY3RpdmUuICAgVGhpcyBwcm9iYWJseSBpc24ndCBjb21wbGV0ZSwgYnV0Ci0gICBpdCdzIG9mIGR1YmlvdXMgdmFsdWUgYW55d2F5IGFuZCAoSU1ITykgbm90IHdvcnRoIHRoZSB0aW1lIHRvIGZpbmlzaC4KLSAgIElmIHlvdSBjYXJlIGFib3V0IGNvcHlyaWdodCBzdHJpbmdzIHRoYXQgbXVjaCwgeW91IGZpeCBpdC4gICovCi0KLXZvaWQKLW9ial9zb21fY29weXJpZ2h0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKmNvcHlyaWdodCwgYzsKLQotICBpZiAoY29weXJpZ2h0X3NlZW4pCi0gICAgewotICAgICAgYXNfYmFkIChfKCJPbmx5IG9uZSAuY29weXJpZ2h0IHBzZXVkby1vcCBwZXIgZmlsZSEiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcIicpCi0gICAgewotICAgICAgY29weXJpZ2h0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAwMCc7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29weXJpZ2h0X3NlZW4gPSAxOwotICBpZiAoYmZkX3NvbV9hdHRhY2hfYXV4X2hkciAoc3Rkb3V0cHV0LCBDT1BZUklHSFRfQVVYX0lELCBjb3B5cmlnaHQpID09IGZhbHNlKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQXR0YWNoaW5nIGNvcHlyaWdodCBoZWFkZXIgJXMiKSwgc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFBlcmZvcm0gYW55IGluaXRpYWxpemF0aW9uIG5lY2Vzc2FyeSBmb3Igc3RhYnMgc3VwcG9ydC4KLQotICAgRm9yIFNPTSB3ZSBuZWVkIHRvIGNyZWF0ZSB0aGUgc3BhY2Ugd2hpY2ggd2lsbCBjb250YWluIHRoZQotICAgdHdvIHN0YWJzIHN1YnNwYWNlcy4gIEFkZGl0aW9uYWxseSB3ZSBuZWVkIHRvIHNldCB1cCB0aGUKLSAgIHNwYWNlL3N1YnNwYWNlIHJlbGF0aW9uc2hpcHMgYW5kIHNldCBzcGFjZS9zdWJzcGFjZSBhdHRyaWJ1dGVzCi0gICB3aGljaCBCRkQgZG9lcyBub3QgdW5kZXJzdGFuZC4gICovCi0KLXZvaWQKLW9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gKHNlZykKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIHNlZ1Qgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgc2VnVCBzcGFjZTsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBjaGFyICpwLCAqZmlsZTsKLSAgdW5zaWduZWQgaW50IHN0cm9mZjsKLQotICAvKiBNYWtlIHRoZSBzcGFjZSB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIGRlYnVnIHN1YnNwYWNlcy4gICovCi0gIHNwYWNlID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsICIkR0RCX0RFQlVHJCIpOwotCi0gIC8qIFNldCBTT00gc3BlY2lmaWMgYXR0cmlidXRlcyBmb3IgdGhlIHNwYWNlLiAgSW4gcGFydGljdWxhciB3ZSBzZXQKLSAgICAgdGhlIHNwYWNlICJkZWZpbmVkIiwgInByaXZhdGUiLCAic29ydF9rZXkiLCBhbmQgInNwbnVtIiB2YWx1ZXMuIAotCi0gICAgIER1ZSB0byBhIGJ1ZyBpbiBweGRiIChjYWxsZWQgYnkgaHB1eCBsaW5rZXIpLCB0aGUgc29ydCBrZXlzCi0gICAgIG9mIHRoZSB2YXJpb3VzIHN0YWJzIHNwYWNlcy9zdWJzcGFjZXMgbmVlZCB0byBiZSAic21hbGwiLiAgV2UKLSAgICAgcmVzZXJ2ZSByYW5nZSA3Mi83MyB3aGljaCBhcHBlYXIgdG8gd29yayB3ZWxsLiAgKi8KLSAgb2JqX3NldF9zZWN0aW9uX2F0dHJpYnV0ZXMgKHNwYWNlLCAxLCAxLCA3MiwgMik7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc3BhY2UsIDIpOwotCi0gIC8qIFNldCB0aGUgY29udGFpbmluZyBzcGFjZSBmb3IgYm90aCBzdGFiIHNlY3Rpb25zIHRvIGJlICRHREJfREVCVUckCi0gICAgIChqdXN0IGNyZWF0ZWQgYWJvdmUpLiAgQWxzbyBzZXQgc29tZSBhdHRyaWJ1dGVzIHdoaWNoIEJGRCBkb2VzCi0gICAgIG5vdCB1bmRlcnN0YW5kLiAgSW4gcGFydGljdWxhciwgYWNjZXNzIGJpdHMsIHNvcnQga2V5cywgYW5kIGxvYWQKLSAgICAgcXVhZHJhbnQuICAqLwotICBvYmpfc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBzcGFjZSwgMHgxZiwgNzMsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgMik7Ci0KLSAgLyogTWFrZSBzb21lIHNwYWNlIGZvciB0aGUgZmlyc3Qgc3BlY2lhbCBzdGFiIGVudHJ5IGFuZCB6ZXJvIHRoZSBtZW1vcnkuCi0gICAgIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsZW5ndGggb2YgdGhpcyBmaWxlJ3MKLSAgICAgc3RhYiBzdHJpbmcgYW5kIHRoZSBsaWtlLiAgVXNpbmcgaXQgYXZvaWRzIHRoZSBuZWVkIHRvIAotICAgICByZWxvY2F0ZSB0aGUgc3RhYiBzdHJpbmdzLgotCi0gICAgIFRoZSAkR0RCX1NUUklOR1MkIHNwYWNlIHdpbGwgYmUgY3JlYXRlZCBhcyBhIHNpZGUgZWZmZWN0IG9mCi0gICAgIHRoZSBjYWxsIHRvIGdldF9zdGFiX3N0cmluZ19vZmZzZXQuICAqLwotICBwID0gZnJhZ19tb3JlICgxMik7Ci0gIG1lbXNldCAocCwgMCwgMTIpOwotICBhc193aGVyZSAoJmZpbGUsICh1bnNpZ25lZCBpbnQgKikgTlVMTCk7Ci0gIHN0cm9mZiA9IGdldF9zdGFiX3N0cmluZ19vZmZzZXQgKGZpbGUsICIkR0RCX1NUUklOR1MkIik7Ci0gIGtub3cgKHN0cm9mZiA9PSAxKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBzdHJvZmYsIDQpOwotICBzZWdfaW5mbyAoc2VnKS0+c3RhYnUucCA9IHA7Ci0KLSAgLyogU2V0IHRoZSBjb250YWluaW5nIHNwYWNlIGZvciBib3RoIHN0YWIgc2VjdGlvbnMgdG8gYmUgJEdEQl9ERUJVRyQKLSAgICAgKGp1c3QgY3JlYXRlZCBhYm92ZSkuICBBbHNvIHNldCBzb21lIGF0dHJpYnV0ZXMgd2hpY2ggQkZEIGRvZXMKLSAgICAgbm90IHVuZGVyc3RhbmQuICBJbiBwYXJ0aWN1bGFyLCBhY2Nlc3MgYml0cywgc29ydCBrZXlzLCBhbmQgbG9hZAotICAgICBxdWFkcmFudC4gICovCi0gIHNlZyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsICIkR0RCX1NUUklOR1MkIik7Ci0gIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIHNwYWNlLCAweDFmLCA3MiwgMCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnLCAyKTsKLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvdW50cyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gYSAuc3RhYnMgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3RhYl9zZWN0aW9ucyAoYWJmZCwgc2VjLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHh4eDsKLXsKLSAgYXNlY3Rpb24gKnN0cnNlYzsKLSAgY2hhciAqcDsKLSAgaW50IHN0cnN6LCBuc3ltczsKLQotICBpZiAoc3RyY21wICgiJEdEQl9TWU1CT0xTJCIsIHNlYy0+bmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIHN0cnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiJEdEQl9TVFJJTkdTJCIpOwotICBpZiAoc3Ryc2VjKQotICAgIHN0cnN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc3Ryc2VjKTsKLSAgZWxzZQotICAgIHN0cnN6ID0gMDsKLSAgbnN5bXMgPSBiZmRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMpIC8gMTIgLSAxOwotCi0gIHAgPSBzZWdfaW5mbyAoc2VjKS0+c3RhYnUucDsKLSAgYXNzZXJ0IChwICE9IDApOwotCi0gIGJmZF9oX3B1dF8xNiAoYWJmZCwgKGJmZF92bWEpIG5zeW1zLCAoYmZkX2J5dGUgKikgcCArIDYpOwotICBiZmRfaF9wdXRfMzIgKGFiZmQsIChiZmRfdm1hKSBzdHJzeiwgKGJmZF9ieXRlICopIHAgKyA4KTsKLX0KLQotLyogQ2FsbGVkIGxhdGUgaW4gdGhlIGFzc3NlbWJseSBwaGFzZSB0byBhZGp1c3QgdGhlIHNwZWNpYWwKLSAgIHN0YWIgZW50cnkgYW5kIHRvIHNldCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3IgZWFjaCBjb2RlIHN1YnNwYWNlLiAgKi8KLQotdm9pZAotc29tX2Zyb2JfZmlsZSAoKQotewotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgYWRqdXN0X3N0YWJfc2VjdGlvbnMsIChQVFIpIDApOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy9vYmotc29tLmggYi9nYXMvY29uZmlnL29iai1zb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwODdiMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL29iai1zb20uaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIFNPTSBvYmplY3QgZmlsZSBmb3JtYXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4KLQotICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4gICovCi0KLSNpZm5kZWYgX09CSl9TT01fSAotI2RlZmluZSBfT0JKX1NPTV9ICi0KLSNkZWZpbmUgT0JKX1NPTSAxCi0KLSNpbmNsdWRlIDxiZmQuaD4KLSNpbmNsdWRlICJiZmQvc29tLmgiCi0jaW5jbHVkZSAidGFyZy1jcHUuaCIKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgIUZBTFNFCi0jZW5kaWYKLQotLyogc2hvdWxkIGJlIGNvbmRpdGlvbmFsIG9uIGFkZHJlc3Mgc2l6ZSEgICovCi0jZGVmaW5lIHNvbV9zeW1ib2woYXN5bWJvbCkgKChzb21fc3ltYm9sX3R5cGUgKikoJihhc3ltYm9sKS0+dGhlX2JmZCkpCi0KLWV4dGVybiB2b2lkIHNvbV9maWxlX3N5bWJvbCBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIG9ial9zb21fdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIG9ial9zb21faW5pdF9zdGFiX3NlY3Rpb24gUEFSQU1TICgoc2VnVCkpOwotZXh0ZXJuIHZvaWQgb2JqX3NvbV9jb3B5cmlnaHQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBvYmpfc29tX2NvbXBpbGVyIFBBUkFNUyAoKGludCkpOwotCi0jZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykgezt9Ci0KLS8qIFNPTSBoYXMgc2V2ZXJhbCBhdHRyaWJ1dGVzIGZvciBzcGFjZXMvc3Vic3BhY2VzIHdoaWNoIGNhbiBub3QKLSAgIGJlIGVhc2lseSBleHByZXNzZWQgaW4gQkZELiAgV2UgdXNlIHRoZXNlIG1hY3JvcyB0byB0cmlnZ2VyIGNhbGxzCi0gICBpbnRvIHRoZSBTT00gQkZEIGJhY2tlbmQgdG8gc2V0IHRoZXNlIGF0dHJpYnV0ZXMuICAqLwotI2RlZmluZSBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAgYmZkX3NvbV9zZXRfc2VjdGlvbl9hdHRyaWJ1dGVzCi0jZGVmaW5lIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIGJmZF9zb21fc2V0X3N1YnNlY3Rpb25fYXR0cmlidXRlcwotCi0vKiBMaWtld2lzZSBmb3Igc3ltYm9sIHR5cGVzLiAgKi8KLSNkZWZpbmUgb2JqX3NldF9zeW1ib2xfdHlwZSBiZmRfc29tX3NldF9zeW1ib2xfdHlwZQotCi0vKiBTdGFicyBnbyBpbiBhIHNlcGFyYXRlIHNlY3Rpb25zLiAgR0RCIGV4cGVjdHMgdG8gZmluZCB0aGVtIGluIHNlY3Rpb25zCi0gICB3aXRoIHRoZSBuYW1lcyAkR0RCX1NZTUJPTFMkIGFuZCAkR0RCX1NUUklOR1MkIHJhdGhlciB0aGFuIC5zdGFiIGFuZAotICAgLnN0YWJzdHIuICAqLwotI2RlZmluZSBTRVBBUkFURV9TVEFCX1NFQ1RJT05TIDEKLSNkZWZpbmUgU1RBQl9TRUNUSU9OX05BTUUgIiRHREJfU1lNQk9MUyQiCi0jZGVmaW5lIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSAiJEdEQl9TVFJJTkdTJCIKLQotLyogV2UgdXNlIElOSVRfU1RBQl9TRUNUSU9OIHRvIHJlY29yZCB0aGUgc3BhY2Uvc3Vic3BhY2UgcmVsYXRpb25zaGlwcwotICAgZm9yIHRoZSB2YXJpb3VzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0jZGVmaW5lIElOSVRfU1RBQl9TRUNUSU9OKHNlZykgb2JqX3NvbV9pbml0X3N0YWJfc2VjdGlvbiAoc2VnKQotCi0vKiBXZSdsbCBiZSB1cGRhdGluZyB0aGUgbWFnaWMgMXN0IHN0YWIgZW50cnkgb25jZSB0aGUgZW50aXJlIGFzc2VtYmx5Ci0gICBmYWlsIGhhcyBiZWVuIHByb2Nlc3NlZC4gICovCi0jZGVmaW5lIG9ial9mcm9iX2ZpbGUoKSBzb21fZnJvYl9maWxlKCkKLQotI2VuZGlmIC8qIF9PQkpfU09NX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvb2JqLXZtcy5jIGIvZ2FzL2NvbmZpZy9vYmotdm1zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDhmOGUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy9vYmotdm1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQ5ICswLDAgQEAKLS8qIHZtcy5jIC0tIFdyaXRlIG91dCBhIFZBWC9WTVMgb2JqZWN0IGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDkyLCA5NCwgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBXcml0dGVuIGJ5IERhdmlkIEwuIEthc2h0YW4gKi8KLS8qIE1vZGlmaWVkIGJ5IEVyaWMgWW91bmdkYWxlIHRvIHdyaXRlIFZNUyBkZWJ1ZyByZWNvcmRzIGZvciBwcm9ncmFtCi0gICB2YXJpYWJsZXMgKi8KLQotLyogV2FudCBhbGwgb2Ygb2JqLXZtcy5oIChhcyBvYmotZm9ybWF0LmgsIHZpYSB0YXJnLWVudi5oLCB2aWEgYXMuaCkuICAqLwotI2RlZmluZSBXQU5UX1ZNU19PQkpfREVGUwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi0vKiBXaGF0IHdlIGRvIGlmIHRoZXJlIGlzIGEgZ29vZi4gKi8KLSNkZWZpbmUgZXJyb3IgYXNfZmF0YWwKLQotI2lmZGVmIFZNUwkJCS8qIFRoZXNlIGFyZSBvZiBubyB1c2UgaWYgd2UgYXJlIGNyb3NzIGFzc2VtYmxpbmcuICovCi0jaW5jbHVkZSA8ZmFiLmg+CQkvKiBEZWZpbmUgRmlsZSBBY2Nlc3MgQmxvY2sJICAqLwotI2luY2x1ZGUgPG5hbS5oPgkJLyogRGVmaW5lIE5BTSBCbG9jawkJICAqLwotI2luY2x1ZGUgPHhhYi5oPgkJLyogRGVmaW5lIFhBQiAtIGFsbCBkaWZmZXJlbnQgdHlwZXMqLwotZXh0ZXJuIGludCBzeXMkb3BlbigpLCBzeXMkY2xvc2UoKSwgc3lzJGFzY3RpbSgpOwotI2VuZGlmCi0KLS8qCi0gKglWZXJzaW9uIHN0cmluZyBvZiB0aGUgY29tcGlsZXIgdGhhdCBwcm9kdWNlZCB0aGUgY29kZSB3ZSBhcmUKLSAqCWFzc2VtYmxpbmcuICAoQW5kIHRoaXMgYXNzZW1ibGVyLCBpZiB3ZSBkbyBub3QgaGF2ZSBjb21waWxlciBpbmZvLikKLSAqLwotY2hhciAqY29tcGlsZXJfdmVyc2lvbl9zdHJpbmc7Ci0KLWV4dGVybiBpbnQgZmxhZ19oYXNoX2xvbmdfbmFtZXM7CS8qIC0rICovCi1leHRlcm4gaW50IGZsYWdfb25lOwkJCS8qIC0xOyBjb21wYXRpYmlsaXR5IHdpdGggZ2NjIDEueCAqLwotZXh0ZXJuIGludCBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmM7CS8qIC1IICovCi1leHRlcm4gaW50IGZsYWdfbm9faGFzaF9taXhlZF9jYXNlOwkvKiAtaCBOVU0gKi8KLQotLyogRmxhZyB0aGF0IGRldGVybWluZXMgaG93IHdlIG1hcCBuYW1lcy4gIFRoaXMgdGFrZXMgc2V2ZXJhbCB2YWx1ZXMsIGFuZAotICogaXMgc2V0IHdpdGggdGhlIC1oIHN3aXRjaC4gIEEgdmFsdWUgb2YgemVybyBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotICogdXBwZXIgY2FzZSwgYW5kIHRoZSBwcmVzZW5jZSBvZiB0aGUgLWggc3dpdGNoIGluaGliaXRzIHRoZSBjYXNlIGhhY2suCi0gKiBObyAtaCBzd2l0Y2ggYXQgYWxsIHNldHMgdm1zX25hbWVfbWFwcGluZyB0byAwLCBhbmQgYWxsb3dzIGNhc2UgaGFja2luZy4KLSAqIEEgdmFsdWUgb2YgMiAoc2V0IHdpdGggLWgyKSBpbXBsaWVzIG5hbWVzIHNob3VsZCBiZQotICogYWxsIGxvd2VyIGNhc2UsIHdpdGggbm8gY2FzZSBoYWNrLiAgQSB2YWx1ZSBvZiAzIChzZXQgd2l0aCAtaDMpIGltcGxpZXMKLSAqIHRoYXQgY2FzZSBzaG91bGQgYmUgcHJlc2VydmVkLiAgKi8KLQotLyogSWYgdGhlIC0rIHN3aXRjaCBpcyBnaXZlbiwgdGhlbiB0aGUgaGFzaCBpcyBhcHBlbmRlZCB0byBhbnkgbmFtZSB0aGF0IGlzCi0gKiBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzLCByZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoZSAtaCBzd2l0Y2guCi0gKi8KLQotY2hhciB2bXNfbmFtZV9tYXBwaW5nID0gMDsKLQotc3RhdGljIHN5bWJvbFMgKkVudHJ5X1BvaW50X1N5bWJvbCA9IDA7CS8qIFBvaW50ZXIgdG8gIl9tYWluIiAqLwotCi0vKgotICoJV2UgYXVnbWVudCB0aGUgImdhcyIgc3ltYm9sIHN0cnVjdHVyZSB3aXRoIHRoaXMKLSAqLwotc3RydWN0IFZNU19TeW1ib2wKLXsKLSAgc3RydWN0IFZNU19TeW1ib2wgKk5leHQ7Ci0gIHN5bWJvbFMgKlN5bWJvbDsKLSAgaW50IFNpemU7Ci0gIGludCBQc2VjdF9JbmRleDsKLSAgaW50IFBzZWN0X09mZnNldDsKLX07Ci0KLXN0cnVjdCBWTVNfU3ltYm9sICpWTVNfU3ltYm9scyA9IDA7Ci1zdHJ1Y3QgVk1TX1N5bWJvbCAqQ3RvcnNfU3ltYm9scyA9IDA7Ci1zdHJ1Y3QgVk1TX1N5bWJvbCAqRHRvcnNfU3ltYm9scyA9IDA7Ci0KLS8qIFdlIG5lZWQgdGhpcyB0byBrZWVwIHRyYWNrIG9mIHRoZSB2YXJpb3VzIGlucHV0IGZpbGVzLCBzbyB0aGF0IHdlIGNhbgotICogZ2l2ZSB0aGUgZGVidWdnZXIgdGhlIGNvcnJlY3Qgc291cmNlIGxpbmUuCi0gKi8KLQotc3RydWN0IGlucHV0X2ZpbGUKLXsKLSAgc3RydWN0IGlucHV0X2ZpbGUgKm5leHQ7Ci0gIHN0cnVjdCBpbnB1dF9maWxlICpzYW1lX2ZpbGVfZnBudDsKLSAgaW50IGZpbGVfbnVtYmVyOwotICBpbnQgbWF4X2xpbmU7Ci0gIGludCBtaW5fbGluZTsKLSAgaW50IG9mZnNldDsKLSAgY2hhciBmbGFnOwotICBjaGFyICpuYW1lOwotICBzeW1ib2xTICpzcG50OwotfTsKLQotc3RhdGljIHN0cnVjdCBpbnB1dF9maWxlICpmaWxlX3Jvb3QgPSAoc3RydWN0IGlucHV0X2ZpbGUgKikgTlVMTDsKLQotCi0vKgotICogU3R5bGVzIG9mIFBTRUNUUyAocHJvZ3JhbSBzZWN0aW9ucykgdGhhdCB3ZSBnZW5lcmF0ZTsganVzdCBzaG9ydGhhbmQKLSAqIHRvIGF2b2lkIGxpc3RzIG9mIHNlY3Rpb24gYXR0cmlidXRlcy4gIFVzZWQgYnkgVk1TX1BzZWN0X1NwZWMoKS4KLSAqLwotZW51bSBwc190eXBlCi17Ci0gIHBzX1RFWFQsIHBzX0RBVEEsIHBzX0NPTU1PTiwgcHNfQ09OU1QsIHBzX0NUT1JTLCBwc19EVE9SUwotfTsKLQotLyoKLSAqIFRoaXMgZW51bSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHZhcmlvdXMgdHlwZXMgb2YgdmFyaWFibGVzIHRoYXQKLSAqIG1heSBiZSBwcmVzZW50LgotICovCi0KLWVudW0gYWR2YW5jZWRfdHlwZQotewotICBCQVNJQywgUE9JTlRFUiwgQVJSQVksIEVOVU0sIFNUUlVDVCwgVU5JT04sIEZVTkNUSU9OLCBWT0lELCBBTElBUywgVU5LTk9XTgotfTsKLQotLyoKLSAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdGFicyBkaXJlY3RpdmVzLCBhbmQgdGhlCi0gKiBpbmZvcm1hdGlvbiBpcyBmaWxsZWQgaW4gYnkgVk1TX3R5cGVkZWZfcGFyc2UuICBFdmVyeXRoaW5nIHRoYXQgaXMgbmVlZGVkCi0gKiB0byBnZW5lcmF0ZSB0aGUgZGVidWdnaW5nIHJlY29yZCBmb3IgYSBnaXZlbiBzeW1ib2wgaXMgcHJlc2VudCBoZXJlLgotICogVGhpcyBjb3VsZCBiZSBkb25lIG1vcmUgZWZmaWNpZW50bHksIHVzaW5nIG5lc3RlZCBzdHJ1Y3QvdW5pb25zLCBidXQgZm9yIG5vdwotICogSSBhbSBoYXBweSB0aGF0IGl0IHdvcmtzLgotICovCi1zdHJ1Y3QgVk1TX0RCR19TeW1ib2wKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpuZXh0OwotICAvKiBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoaXMgaXMgKi8KLSAgZW51bSBhZHZhbmNlZF90eXBlIGFkdmFuY2VkOwotICAvKiB0aGlzIHJlY29yZCBpcyBmb3IgdGhpcyB0eXBlICovCi0gIGludCBkYnhfdHlwZTsKLSAgLyogRm9yIGFkdmFuY2VkIHR5cGVzIHRoaXMgaXMgdGhlIHR5cGUgcmVmZXJyZWQgdG8uICBJLmUuLCB0aGUgdHlwZQotICAgICBhIHBvaW50ZXIgcG9pbnRzIHRvLCBvciB0aGUgdHlwZSBvZiBvYmplY3QgdGhhdCBtYWtlcyB1cCBhbgotICAgICBhcnJheS4gICovCi0gIGludCB0eXBlMjsKLSAgLyogVXNlIHRoaXMgdHlwZSB3aGVuIGdlbmVyYXRpbmcgYSB2YXJpYWJsZSBkZWYgKi8KLSAgaW50IFZNU190eXBlOwotICAvKiB1c2VkIGZvciBhcnJheXMgLSB0aGlzIHdpbGwgYmUgcHJlc2VudCBmb3IgYWxsICovCi0gIGludCBpbmRleF9taW47Ci0gIC8qIGVudHJpZXMsIGJ1dCB3aWxsIGJlIG1lYW5pbmdsZXNzIGZvciBub24tYXJyYXlzICovCi0gIGludCBpbmRleF9tYXg7Ci0gIC8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGRhdGEgdHlwZS4gIEZvciBhbiBhcnJheSwgdGhpcyBpcyB0aGUgc2l6ZQotICAgICBvZiBvbmUgZWxlbWVudCBpbiB0aGUgYXJyYXkgKi8KLSAgaW50IGRhdGFfc2l6ZTsKLSAgLyogTnVtYmVyIG9mIHRoZSBzdHJ1Y3R1cmUvdW5pb24vZW51bSAtIHVzZWQgZm9yIHJlZiAqLwotICBpbnQgc3RydWNfbnVtYjsKLX07Ci0KLSNkZWZpbmUgU1lNVFlQTFNUX1NJWkUgKDE8PDQpCS8qIDE2OyBtdXN0IGJlIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBTWU1UWVBfSEFTSCh4KSAoKHVuc2lnbmVkKSh4KSAmIChTWU1UWVBMU1RfU0laRS0xKSkKLXN0cnVjdCBWTVNfREJHX1N5bWJvbCAqVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQTFNUX1NJWkVdOwotCi0vKgotICogV2UgbmVlZCB0aGlzIHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIGZvcndhcmQgcmVmZXJlbmNlcyB0bwotICogc3RydWN0L3VuaW9uL2VudW0gdGhhdCBoYXZlIG5vdCBiZWVuIGRlZmluZWQgeWV0LiAgV2hlbiB0aGV5IGFyZSB1bHRpbWF0ZWx5Ci0gKiBkZWZpbmVkLCB0aGVuIHdlIGNhbiBnbyBiYWNrIGFuZCBnZW5lcmF0ZSB0aGUgVElSIGNvbW1hbmRzIHRvIG1ha2UgYSBiYWNrCi0gKiByZWZlcmVuY2UuCi0gKi8KLQotc3RydWN0IGZvcndhcmRfcmVmCi17Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqbmV4dDsKLSAgaW50IGRieF90eXBlOwotICBpbnQgc3RydWNfbnVtYjsKLSAgY2hhciByZXNvbHZlZDsKLX07Ci0KLXN0cnVjdCBmb3J3YXJkX3JlZiAqZl9yZWZfcm9vdCA9IChzdHJ1Y3QgZm9yd2FyZF9yZWYgKikgTlVMTDsKLQotLyoKLSAqIFRoaXMgcm91dGluZSBpcyB1c2VkIHRvIGNvbXBhcmUgdGhlIG5hbWVzIG9mIGNlcnRhaW4gdHlwZXMgdG8gdmFyaW91cwotICogZml4ZWQgdHlwZXMgdGhhdCBhcmUga25vd24gYnkgdGhlIGRlYnVnZ2VyLgotICovCi0jZGVmaW5lIHR5cGVfY2hlY2soWCkgICFzdHJjbXAgKHN5bWJvbF9uYW1lLCBYKQotCi0vKgotICogVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB3ZSBhcmUKLSAqIHdvcmtpbmcgb24gd2hpbGUgd2UgYXJlIHBhcnNpbmcgdGhlIHN0YWJzIGRpcmVjdGl2ZXMuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpzeW1ib2xfbmFtZTsKLQotLyogV2UgdXNlIHRoaXMgY291bnRlciB0byBhc3NpZ24gbnVtYmVycyB0byBhbGwgb2YgdGhlIHN0cnVjdHVyZXMsIHVuaW9ucwotICogYW5kIGVudW1zIHRoYXQgd2UgZGVmaW5lLiAgV2hlbiB3ZSBhY3R1YWxseSBkZWNsYXJlIGEgdmFyaWFibGUgdG8gdGhlCi0gKiBkZWJ1Z2dlciwgd2UgY2FuIHNpbXBseSBkbyBpdCBieSBudW1iZXIsIHJhdGhlciB0aGFuIGRlc2NyaWJpbmcgdGhlCi0gKiB3aG9sZSB0aGluZyBlYWNoIHRpbWUuCi0gKi8KLQotc3RhdGljIHN0cnVjdHVyZV9jb3VudCA9IDA7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBtYWtpbmcgdGhlIGxhc3QgYXR0ZW1wdCB0bwotICAgcGFyc2UgdGhlIHN0YWJzLCBhbmQgdGhhdCB3ZSBzaG91bGQgZGVmaW5lIGFzIG11Y2ggYXMgd2UgY2FuLCBhbmQgaWdub3JlCi0gICB0aGUgcmVzdCAqLwotCi1zdGF0aWMgaW50IGZpbmFsX3Bhc3M7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHN0cnVjdHVyZSBudW1iZXIKLSAqIGZvciBhIGdpdmVuIHZhcmlhYmxlLiAgSWYgdGhpcyBpcyA8IDAsIHRoYXQgbWVhbnMgdGhhdCB0aGUgc3RydWN0dXJlCi0gKiBoYXMgbm90IHlldCBiZWVuIGRlZmluZWQgdG8gdGhlIGRlYnVnZ2VyLiAgVGhpcyBpcyBzdGlsbCBjb29sLCBzaW5jZQotICogdGhlIFZNUyBvYmplY3QgbGFuZ3VhZ2UgaGFzIHdheXMgb2YgZml4aW5nIHRoaW5ncyB1cCBhZnRlciB0aGUgZmFjdCwKLSAqIHNvIHdlIGp1c3QgbWFrZSBhIG5vdGUgb2YgdGhpcywgYW5kIGdlbmVyYXRlIGZpeHVwcyBhdCB0aGUgZW5kLgotICovCi1zdGF0aWMgaW50IHN0cnVjdF9udW1iZXI7Ci0KLS8qIFRoaXMgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIERfZmxvYXQgYW5kIEdfZmxvYXQgZm9yIHRlbGxpbmcKLSAgIHRoZSBkZWJ1Z2dlciBhYm91dCBkb3VibGVzLiAgZ2NjIG91dHB1dHMgdGhlIHNhbWUgLnN0YWJzIHJlZ2FyZGxlc3MKLSAgIG9mIHdoZXRoZXIgLW1nIGlzIHVzZWQgdG8gc2VsZWN0IGFsdGVybmF0ZSBkb3VibGVzLiAgKi8KLQotc3RhdGljIGludCB2YXhfZ19kb3VibGVzID0gMDsKLQotLyogTG9jYWwgc3ltYm9sIHJlZmVyZW5jZXMgKHVzZWQgdG8gaGFuZGxlIE5fQUJTIHN5bWJvbHM7IGdjYyBkb2VzIG5vdAotICAgZ2VuZXJhdGUgdGhvc2UsIGJ1dCB0aGV5J3JlIHBvc3NpYmxlIHdpdGggaGFuZC1jb2RlZCBhc3NlbWJsZXIgaW5wdXQpCi0gICBhcmUgYWx3YXlzIG1hZGUgcmVsYXRpdmUgdG8gc29tZSBwYXJ0aWN1bGFyIGVudmlyb25tZW50LiAgSWYgdGhlIGN1cnJlbnQKLSAgIGlucHV0IGhhcyBhbnkgc3VjaCBzeW1ib2xzLCB0aGVuIHdlIGV4cGVjdCB0aGlzIHRvIGdldCBpbmNyZW1lbnRlZAotICAgZXhhY3RseSBvbmNlIGFuZCBlbmQgdXAgaGF2aW5nIGFsbCBvZiB0aGVtIGJlIGluIGVudmlyb25tZW50ICMwLiAgKi8KLQotc3RhdGljIGludCBDdXJyZW50X0Vudmlyb25tZW50ID0gLTE7Ci0KLS8qIEV2ZXJ5IG9iamVjdCBmaWxlIG11c3Qgc3BlY2lmeSBhbiBtb2R1bGUgbmFtZSwgd2hpY2ggaXMgYWxzbyB1c2VkIGJ5Ci0gICB0cmFjZWJhY2sgcmVjb3Jkcy4gIFNldCBpbiBXcml0ZV9WTVNfTUhEX1JlY29yZHMoKS4gICovCi0KLXN0YXRpYyBjaGFyIE1vZHVsZV9OYW1lWzI1NSsxXTsKLQotLyoKLSAqIFZhcmlhYmxlIGRlc2NyaXB0b3JzIGFyZSB1c2VkIHRlbGwgdGhlIGRlYnVnZ2VyIHRoZSBkYXRhIHR5cGVzIG9mIGNlcnRhaW4KLSAqIG1vcmUgY29tcGxpY2F0ZWQgdmFyaWFibGVzIChiYXNpY2FsbHkgYW55dGhpbmcgaW52b2x2aW5nIGEgc3RydWN0dXJlLAotICogdW5pb24sIGVudW0sIGFycmF5IG9yIHBvaW50ZXIpLiAgU29tZSBub24tcG9pbnRlciB2YXJpYWJsZXMgb2YgdGhlCi0gKiBiYXNpYyB0eXBlcyB0aGF0IHRoZSBkZWJ1Z2dlciBrbm93cyBhYm91dCBkbyBub3QgcmVxdWlyZSBhIHZhcmlhYmxlCi0gKiBkZXNjcmlwdG9yLgotICoKLSAqIFNpbmNlIGl0IGlzIGltcG9zc2libGUgdG8gaGF2ZSBhIHZhcmlhYmxlIGRlc2NyaXB0b3IgbG9uZ2VyIHRoYW4gMTI4Ci0gKiBieXRlcyBieSB2aXJ0dWUgb2YgdGhlIHdheSB0aGF0IHRoZSBWTVMgb2JqZWN0IGxhbmd1YWdlIGlzIHNldCB1cCwKLSAqIGl0IG1ha2VzIG5vdCBzZW5zZSB0byBtYWtlIHRoZSBhcnJheXMgYW55IGxvbmdlciB0aGFuIHRoaXMsIG9yIHdvcnJ5aW5nCi0gKiBhYm91dCBkeW5hbWljIHNpemluZyBvZiB0aGUgYXJyYXkuCi0gKgotICogVGhlc2UgYXJlIHRoZSBhcnJheXMgYW5kIGNvdW50ZXJzIHRoYXQgd2UgdXNlIHRvIGJ1aWxkIGEgdmFyaWFibGUKLSAqIGRlc2NyaXB0b3IuCi0gKi8KLQotI2RlZmluZSBNQVhfREVCVUdfUkVDT1JEIDEyOAotc3RhdGljIGNoYXIgTG9jYWxbTUFYX0RFQlVHX1JFQ09SRF07CS8qIGJ1ZmZlciBmb3IgdmFyaWFibGUgZGVzY3JpcHRvciAqLwotc3RhdGljIGNoYXIgQXN1ZmZpeFtNQVhfREVCVUdfUkVDT1JEXTsJLyogYnVmZmVyIGZvciBhcnJheSBkZXNjcmlwdG9yICovCi1zdGF0aWMgaW50IExwbnQ7CQkvKiBpbmRleCBpbnRvIExvY2FsICovCi1zdGF0aWMgaW50IEFwb2ludDsJCS8qIGluZGV4IGludG8gQXN1ZmZpeCAqLwotc3RhdGljIGNoYXIgb3ZlcmZsb3c7CQkvKiBmbGFnIHRvIGluZGljYXRlIHdlIGhhdmUgd3JpdHRlbiB0b28gbXVjaCovCi1zdGF0aWMgaW50IHRvdGFsX2xlbjsJCS8qIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdmFyaWFibGUKLQkJCQlkZXNjcmlwdG9yIHBsdXMgYXJyYXkgZGVzY3JpcHRvciAtIHVzZWQgZm9yIGxlbiBieXRlKi8KLQotLyogRmxhZyBpZiB3ZSBoYXZlIHRvbGQgdXNlciBhYm91dCBmaW5kaW5nIGdsb2JhbCBjb25zdGFudHMgaW4gdGhlIHRleHQKLSAgIHNlY3Rpb24uICovCi1zdGF0aWMgaW50IGdhdmVfY29tcGlsZXJfbWVzc2FnZSA9IDA7Ci0KLQotLyoKLSAqCUdsb2JhbCBkYXRhIChPYmplY3QgcmVjb3JkcyBsaW1pdGVkIHRvIDUxMiBieXRlcyBieSBWQVgtMTEgIkMiIHJ1bnRpbWUpCi0gKi8KLXN0YXRpYyBpbnQgVk1TX09iamVjdF9GaWxlX0ZEOwkvKiBGaWxlIERlc2NyaXB0b3IgZm9yIG9iamVjdCBmaWxlICovCi1zdGF0aWMgY2hhciBPYmplY3RfUmVjb3JkX0J1ZmZlcls1MTJdOwkvKiBCdWZmZXIgZm9yIG9iamVjdCBmaWxlIHJlY29yZHMgICovCi1zdGF0aWMgaW50IE9iamVjdF9SZWNvcmRfT2Zmc2V0Oy8qIE9mZnNldCB0byBlbmQgb2YgZGF0YQkgICAqLwotc3RhdGljIGludCBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZTsJLyogVHlwZSBvZiByZWNvcmQgaW4gYWJvdmUJICAgKi8KLQotLyoKLSAqCU1hY3JvcyBmb3IgbW92aW5nIGRhdGEgYXJvdW5kLiAgTXVzdCB3b3JrIG9uIGJpZy1lbmRpYW4gc3lzdGVtcy4KLSAqLwotI2lmZGVmIFZNUyAgLyogVGhlc2UgYXJlIG1vcmUgZWZmaWNpZW50IGZvciBWTVMtPlZNUyBzeXN0ZW1zICovCi0jZGVmaW5lIENPUFlfTE9ORyhkZXN0LHZhbCkJKCAqKGxvbmcgKikoZGVzdCkgPSAodmFsKSApCi0jZGVmaW5lIENPUFlfU0hPUlQoZGVzdCx2YWwpCSggKihzaG9ydCAqKShkZXN0KSA9ICh2YWwpICkKLSNlbHNlCi0jZGVmaW5lIENPUFlfTE9ORyhkZXN0LHZhbCkJbWRfbnVtYmVyX3RvX2NoYXJzICgoZGVzdCksICh2YWwpLCA0KQotI2RlZmluZSBDT1BZX1NIT1JUKGRlc3QsdmFsKQltZF9udW1iZXJfdG9fY2hhcnMgKChkZXN0KSwgKHZhbCksIDIpCi0jZW5kaWYKLS8qCi0gKglNYWNyb3MgZm9yIHBsYWNpbmcgZGF0YSBpbnRvIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlci4KLSAqLwotI2RlZmluZSBQVVRfTE9ORyh2YWwpIFwKLQkoIENPUFlfTE9ORyAoJk9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0XSwgKHZhbCkpLCBcCi0JICBPYmplY3RfUmVjb3JkX09mZnNldCArPSA0ICkKLQotI2RlZmluZSBQVVRfU0hPUlQodmFsKSBcCi0JKCBDT1BZX1NIT1JUICgmT2JqZWN0X1JlY29yZF9CdWZmZXJbT2JqZWN0X1JlY29yZF9PZmZzZXRdLCAodmFsKSksIFwKLQkgIE9iamVjdF9SZWNvcmRfT2Zmc2V0ICs9IDIgKQotCi0jZGVmaW5lIFBVVF9DSEFSKHZhbCkgKCBPYmplY3RfUmVjb3JkX0J1ZmZlcltPYmplY3RfUmVjb3JkX09mZnNldCsrXSA9ICh2YWwpICkKLQotI2RlZmluZSBQVVRfQ09VTlRFRF9TVFJJTkcoY3ApIGRvIHsgXAotCQkJcmVnaXN0ZXIgY29uc3QgY2hhciAqcCA9IChjcCk7IFwKLQkJCVBVVF9DSEFSICgoY2hhcikgc3RybGVuIChwKSk7IFwKLQkJCXdoaWxlICgqcCkgUFVUX0NIQVIgKCpwKyspOyB9IHdoaWxlICgwKQotCi0vKgotICoJTWFjcm8gZm9yIGRldGVybWluaW5nIGlmIGEgTmFtZSBoYXMgcHNlY3QgYXR0cmlidXRlcyBhdHRhY2hlZAotICoJdG8gaXQuCi0gKi8KLSNkZWZpbmUgUFNFQ1RfQVRUUklCVVRFU19TVFJJTkcJCSIkJFBzZWN0QXR0cmlidXRlc18iCi0jZGVmaW5lIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSAkxOAotCi0jZGVmaW5lIEhBU19QU0VDVF9BVFRSSUJVVEVTKE5hbWUpIFwKLQkJKHN0cm5jbXAgKCgqTmFtZSA9PSAnXycgPyBOYW1lICsgMSA6IE5hbWUpLCBcCi0JCQkgIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HLCBcCi0JCQkgIFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSCkgPT0gMCkKLQwKLQotIC8qIGluOiBzZWdUICAgb3V0OiBOX1RZUEUgYml0cyAqLwotY29uc3Qgc2hvcnQgc2VnX05fVFlQRVtdID0KLXsKLSAgTl9BQlMsCi0gIE5fVEVYVCwKLSAgTl9EQVRBLAotICBOX0JTUywKLSAgTl9VTkRGLAkJCS8qIHVua25vd24gKi8KLSAgTl9VTkRGLAkJCS8qIGVycm9yICovCi0gIE5fVU5ERiwJCQkvKiBleHByZXNzaW9uICovCi0gIE5fVU5ERiwJCQkvKiBkZWJ1ZyAqLwotICBOX1VOREYsCQkJLyogbnR2ICovCi0gIE5fVU5ERiwJCQkvKiBwdHYgKi8KLSAgTl9SRUdJU1RFUiwJCQkvKiByZWdpc3RlciAqLwotfTsKLQotY29uc3Qgc2VnVCBOX1RZUEVfc2VnW05fVFlQRSArIDJdID0KLXsJCQkJLyogTl9UWVBFID09IDB4MUUgPSAzMi0yICovCi0gIFNFR19VTktOT1dOLAkJCS8qIE5fVU5ERiA9PSAwICovCi0gIFNFR19HT09GLAotICBTRUdfQUJTT0xVVEUsCQkJLyogTl9BQlMgPT0gMiAqLwotICBTRUdfR09PRiwKLSAgU0VHX1RFWFQsCQkJLyogTl9URVhUID09IDQgKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19EQVRBLAkJCS8qIE5fREFUQSA9PSA2ICovCi0gIFNFR19HT09GLAotICBTRUdfQlNTLAkJCS8qIE5fQlNTID09IDggKi8KLSAgU0VHX0dPT0YsCi0gIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLAotICBTRUdfR09PRiwgU0VHX0dPT0YsIFNFR19HT09GLCBTRUdfR09PRiwKLSAgU0VHX1JFR0lTVEVSLAkJCS8qIGR1bW15IE5fUkVHSVNURVIgZm9yIHJlZ3MgPSAzMCAqLwotICBTRUdfR09PRiwKLX07Ci0MCi0KLS8qIExvY2FsIHN1cHBvcnQgcm91dGluZXMgd2hpY2ggcmV0dXJuIGEgdmFsdWUuICAqLwotCi1zdGF0aWMgc3RydWN0IGlucHV0X2ZpbGUgKmZpbmRfZmlsZSBQQVJBTVMgKChzeW1ib2xTICopKTsKLXN0YXRpYyBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKmZpbmRfc3ltYm9sIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHN5bWJvbFMgKkRlZmluZV9Sb3V0aW5lIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQsc3ltYm9sUyAqLGludCkpOwotCi1zdGF0aWMgY2hhciAqY3Z0X2ludGVnZXIgUEFSQU1TICgoY2hhciAqLGludCAqKSk7Ci1zdGF0aWMgY2hhciAqZml4X25hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X3N0cnVjdF9uYW1lIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgb2Zmc2V0VCBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIFBBUkFNUyAoKHN5bWJvbFMgKix1bnNpZ25lZCkpOwotCi1zdGF0aWMgaW50IFZNU19UQlRfU291cmNlX0ZpbGUgUEFSQU1TICgoY2hhciAqLGludCkpOwotc3RhdGljIGludCBnZW4xIFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIGludCBmb3J3YXJkX3JlZmVyZW5jZSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyBpbnQgZmluYWxfZm9yd2FyZF9yZWZlcmVuY2UgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICopKTsKLXN0YXRpYyBpbnQgVk1TX3R5cGVkZWZfcGFyc2UgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IGhhc2hfc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGludCBWTVNfUHNlY3RfU3BlYyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50LGVudW0gcHNfdHlwZSwKLQkJCQkgICBzdHJ1Y3QgVk1TX1N5bWJvbCAqKSk7Ci0KLS8qIExvY2FsIHN1cHBvcnQgcm91dGluZXMgd2hpY2ggZG9uJ3QgZGlyZWN0bHkgcmV0dXJuIGFueSB2YWx1ZS4gICovCi0KLXN0YXRpYyB2b2lkIHNfY29uc3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBDcmVhdGVfVk1TX09iamVjdF9GaWxlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIENsb3NlX1ZNU19PYmplY3RfRmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCB2bXNfdGlyX3N0YWNrX3BzZWN0IFBBUkFNUyAoKGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgUEFSQU1TICgoY29uc3QgY2hhciAqLGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TZXRfRGF0YSBQQVJBTVMgKChpbnQsaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TdG9yZV9TdHJ1Y3QgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfRGVmX1N0cnVjdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TZXRfU3RydWN0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Nb2R1bGVfQmVnaW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Nb2R1bGVfRW5kIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfUm91dGluZV9CZWdpbiBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfVEJUX1JvdXRpbmVfRW5kIFBBUkFNUyAoKGludCxzeW1ib2xTICopKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfQmxvY2tfQmVnaW4gUEFSQU1TICgoc3ltYm9sUyAqLGludCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19UQlRfQmxvY2tfRW5kIFBBUkFNUyAoKHZhbHVlVCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIFBBUkFNUyAoKGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX1RCVF9Tb3VyY2VfTGluZXMgUEFSQU1TICgoaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIGZwdXNoIFBBUkFNUyAoKGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIHJwdXNoIFBBUkFNUyAoKGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIGFycmF5X3N1ZmZpeCBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikpOwotc3RhdGljIHZvaWQgbmV3X2ZvcndhcmRfcmVmIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfc3VmZml4IFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIHZvaWQgYml0ZmllbGRfc3VmZml4IFBBUkFNUyAoKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqLGludCkpOwotc3RhdGljIHZvaWQgc2V0dXBfYmFzaWNfdHlwZSBQQVJBTVMgKChzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKikpOwotc3RhdGljIHZvaWQgVk1TX0RCR19yZWNvcmQgUEFSQU1TICgoc3RydWN0IFZNU19EQkdfU3ltYm9sICosaW50LGludCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19sb2NhbF9zdGFiX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotc3RhdGljIHZvaWQgVk1TX3N0YWJfcGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX0dTWU1fUGFyc2UgUEFSQU1TICgoc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX0xDU1lNX1BhcnNlIFBBUkFNUyAoKHN5bWJvbFMgKixpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TVFNZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfUlNZTV9QYXJzZSBQQVJBTVMgKChzeW1ib2xTICosc3ltYm9sUyAqLGludCkpOwotc3RhdGljIHZvaWQgVk1TX0xTWU1fUGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgRGVmaW5lX0xvY2FsX1N5bWJvbHMgUEFSQU1TICgoc3ltYm9sUyAqLHN5bWJvbFMgKixzeW1ib2xTICosaW50KSk7Ci1zdGF0aWMgdm9pZCBXcml0ZV9WTVNfTUhEX1JlY29yZHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgV3JpdGVfVk1TX0VPTV9SZWNvcmQgUEFSQU1TICgoaW50LHZhbHVlVCkpOwotc3RhdGljIHZvaWQgVk1TX0Nhc2VfSGFja19TeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLGNoYXIgKikpOwotc3RhdGljIHZvaWQgVk1TX01vZGlmeV9Qc2VjdF9BdHRyaWJ1dGVzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKixpbnQgKikpOwotc3RhdGljIHZvaWQgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyBQQVJBTVMgKChjb25zdCBjaGFyICosaW50LGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19FbWl0X0dsb2JhbHZhbHVlcyBQQVJBTVMgKCh1bnNpZ25lZCx1bnNpZ25lZCxjaGFyICopKTsKLXN0YXRpYyB2b2lkIFZNU19Qcm9jZWR1cmVfRW50cnlfUHQgUEFSQU1TICgoY2hhciAqLGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU2V0X1BzZWN0IFBBUkFNUyAoKGludCxpbnQsaW50KSk7Ci1zdGF0aWMgdm9pZCBWTVNfU3RvcmVfUmVwZWF0ZWRfRGF0YSBQQVJBTVMgKChpbnQsY2hhciAqLGludCxpbnQpKTsKLXN0YXRpYyB2b2lkIFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSBQQVJBTVMgKChzeW1ib2xTICosaW50LAotCQkJCQkJICAgIGludCxpbnQsaW50LGludCkpOwotc3RhdGljIHZvaWQgVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgUEFSQU1TICgoaW50LGludCxmcmFnUyAqLGZyYWdTICopKTsKLQotLyogU3VwcG9ydCBjb2RlIHdoaWNoIHVzZWQgdG8gYmUgaW5saW5lIHdpdGhpbiB2bXNfd3JpdGVfb2JqZWN0X2ZpbGUuICAqLwotc3RhdGljIHZvaWQgdm1zX2ZpeHVwX3RleHRfc2VjdGlvbiBQQVJBTVMgKCh1bnNpZ25lZCxzdHJ1Y3QgZnJhZyAqLHN0cnVjdCBmcmFnICopKTsKLXN0YXRpYyB2b2lkIHN5bnRoZXNpemVfZGF0YV9zZWdtZW50IFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkLHN0cnVjdCBmcmFnICopKTsKLXN0YXRpYyB2b2lkIHZtc19maXh1cF9kYXRhX3NlY3Rpb24gUEFSQU1TICgodW5zaWduZWQsdW5zaWduZWQpKTsKLXN0YXRpYyB2b2lkIGdsb2JhbF9zeW1ib2xfZGlyZWN0b3J5IFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCBsb2NhbF9zeW1ib2xzX0RTVCBQQVJBTVMgKChzeW1ib2xTICosc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCB2bXNfYnVpbGRfRFNUIFBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgdm9pZCB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgVk1TX1N5bWJvbCAqLCBpbnQpKTsKLQwKLQotLyogVGhlIGZvbGxvd2luZyBjb2RlIGRlZmluZXMgdGhlIHNwZWNpYWwgdHlwZXMgb2YgcHNldWRvLW9wcyB0aGF0IHdlCi0gICB1c2Ugd2l0aCBWTVMuICAqLwotCi11bnNpZ25lZCBjaGFyIGNvbnN0X2ZsYWcgPSBJTl9ERUZBVUxUX1NFQ1RJT047Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbnN0IChhcmcpCi0gICAgIGludCBhcmc7CS8qIDNyZCBmaWVsZCBmcm9tIG9ial9wc2V1ZG9fdGFibGVbXTsgbm90IG5lZWRlZCBoZXJlICovCi17Ci0gIC8qIFNpbmNlIHdlIGRvbid0IG5lZWQgYGFyZycsIHVzZSBpdCBhcyBvdXIgc2NyYXRjaCB2YXJpYWJsZSBzbyB0aGF0Ci0gICAgIHdlIHdvbid0IGdldCBhbnkgIm5vdCB1c2VkIiB3YXJuaW5ncyBhYm91dCBpdC4gICovCi0gIGFyZyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChTRUdfREFUQSwgKHN1YnNlZ1QpIGFyZyk7Ci0gIGNvbnN0X2ZsYWcgPSAxOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgb2JqX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJjb25zdCIsIHNfY29uc3QsIDB9LAotICB7MCwgMCwgMH0sCi19OwkJCQkvKiBvYmpfcHNldWRvX3RhYmxlICovCi0KLQotLyogUm91dGluZSB0byBwZXJmb3JtIFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTigpLiAgKi8KLQotaW50Ci12bXNfcmVzb2x2ZV9zeW1ib2xfcmVkZWYgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICAvKgotICAgKglJZiB0aGUgbmV3IHN5bWJvbCBpcyAuY29tbSBBTkQgaXQgaGFzIGEgc2l6ZSBvZiB6ZXJvLAotICAgKgl3ZSBpZ25vcmUgaXQgKGkuZS4gdGhlIG9sZCBzeW1ib2wgb3ZlcnJpZGVzIGl0KQotICAgKi8KLSAgaWYgKFNFR01FTlRfVE9fU1lNQk9MX1RZUEUgKChpbnQpIG5vd19zZWcpID09IChOX1VOREYgfCBOX0VYVCkKLSAgICAgICYmIGZyYWdfbm93X2ZpeCAoKSA9PSAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oImNvbXBpbGVyIGVtaXR0ZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwKLQkgICAgICAgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIC8qCi0gICAqCUlmIHRoZSBvbGQgc3ltYm9sIGlzIC5jb21tIGFuZCBpdCBoYXMgYSBzaXplIG9mIHplcm8sCi0gICAqCXdlIG92ZXJyaWRlIGl0IHdpdGggdGhlIG5ldyBzeW1ib2wgdmFsdWUuCi0gICAqLwotICBpZiAoU19JU19FWFRFUk5BTCAoc3ltKSAmJiBTX0lTX0RFRklORUQgKHN5bSkgJiYgU19HRVRfVkFMVUUgKHN5bSkgPT0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJjb21waWxlciByZWRlZmluZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyIpLAotCSAgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLSAgICAgIHN5bS0+c3lfZnJhZyAgPSBmcmFnX25vdzsKLSAgICAgIFNfU0VUX09USEVSIChzeW0sIGNvbnN0X2ZsYWcpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIC8qIEtlZXAgTl9FWFQgYml0LiAgKi8KLSAgICAgIHN5bS0+c3lfc3ltYm9sLm5fdHlwZSB8PSBTRUdNRU5UX1RPX1NZTUJPTF9UWVBFICgoaW50KSBub3dfc2VnKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBgdGNfZnJvYl9sYWJlbCcgaGFuZGxlciBmb3IgY29sb24oc3ltYm9scy5jKSwgdXNlZCB0byBleGFtaW5lIHRoZQotICAgZHVtbXkgbGFiZWwocykgZ2NjIGluc2VydHMgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGZpbGUgaXQgZ2VuZXJhdGVzLgotICAgZ2NjIDEueCBwdXQgImdjY19jb21waWxlZC4iOyBnY2MgMi54IChhcyBvZiAyLjcpIHB1dHMgImdjYzJfY29tcGlsZWQuIgotICAgYW5kICJfX2dudV9sYW5ndWFnZV88bmFtZT4iIGFuZCBwb3NzaWJseSAiX192YXhfPHR5cGU+X2RvdWJsZXMiLiAgKi8KLQotdm9pZAotdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsIChzeW1ib2xQKQotc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgLyogU3BlY2lhbCBsYWJlbHMgb25seSBvY2N1ciBwcmlvciB0byBleHBsaWNpdCBzZWN0aW9uIGRpcmVjdGl2ZXMuICAqLwotICBpZiAoKGNvbnN0X2ZsYWcgJiBJTl9ERUZBVUxUX1NFQ1RJT04pICE9IDApCi0gICAgewotICAgICAgY2hhciAqc3ltX25hbWUgPSBTX0dFVF9OQU1FIChzeW1ib2xQKTsKLQotICAgICAgaWYgKCpzeW1fbmFtZSA9PSAnXycpCi0JKytzeW1fbmFtZTsKLQotICAgICAgaWYgKCFzdHJjbXAgKHN5bV9uYW1lLCAiX192YXhfZ19kb3VibGVzIikpCi0JdmF4X2dfZG91YmxlcyA9IDE7Ci0jaWYgMAkvKiBub3QgbmVjZXNzYXJ5ICovCi0gICAgICBlbHNlIGlmICghc3RyY21wIChzeW1fbmFtZSwgIl9fdmF4X2RfZG91YmxlcyIpKQotCXZheF9nX2RvdWJsZXMgPSAwOwotI2VuZGlmCi0jaWYgMAkvKiB0aGVzZSBhcmUgcG90ZW50aWFsIGFsdGVybmF0aXZlcyB0byB0Yy12YXguYydzIG1kX3BhcnNlX29wdGlvbnMoKSAqLwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJnY2NfY29tcGlsZWQuIikpCi0JZmxhZ19vbmUgPSAxOwotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAoc3ltX25hbWUsICJfX2dudV9sYW5ndWFnZV9jcGx1c3BsdXMiKSkKLQlmbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi12b2lkCi1vYmpfcmVhZF9iZWdpbl9ob29rICgpCi17Ci0gIHJldHVybjsKLX0KLQotCi12b2lkCi1vYmpfY3Jhd2xfc3ltYm9sX2NoYWluIChoZWFkZXJzKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgc3ltYm9sUyAqKnN5bWJvbFBQOwotICBpbnQgc3ltYm9sX251bWJlciA9IDA7Ci0KLSAgc3ltYm9sUFAgPSAmc3ltYm9sX3Jvb3RQOwkvKiAtPiBsYXN0IHN5bWJvbCBjaGFpbiBsaW5rLiAqLwotICB3aGlsZSAoKHN5bWJvbFAgPSAqc3ltYm9sUFApICE9IE5VTEwpCi0gICAgewotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbFAsIDEpOwotCi0gICAgIC8qIE9LLCBoZXJlIGlzIGhvdyB3ZSBkZWNpZGUgd2hpY2ggc3ltYm9scyBnbyBvdXQgaW50byB0aGUKLQlicmF2ZSBuZXcgc3ltdGFiLiAgU3ltYm9scyB0aGF0IGRvIGFyZToKLQotCSogc3ltYm9scyB3aXRoIG5vIG5hbWUgKHN0YWJkJ3M/KQotCSogc3ltYm9scyB3aXRoIGRlYnVnIGluZm8gaW4gdGhlaXIgTl9UWVBFCi0JKiBzeW1ib2xzIHdpdGggXDEgYXMgdGhlaXIgM3JkIGNoYXJhY3RlciAobnVtZXJpYyBsYWJlbHMpCi0JKiAibG9jYWwgbGFiZWxzIiBuZWVkZWQgZm9yIFBJQyBmaXh1cHMKLQotCVN5bWJvbHMgdGhhdCBkb24ndCBhcmU6Ci0JKiBzeW1ib2xzIHRoYXQgYXJlIHJlZ2lzdGVycwotCi0JQWxsIG90aGVyIHN5bWJvbHMgYXJlIG91dHB1dC4gIFdlIGNvbXBsYWluIGlmIGEgZGVsZXRlZAotCXN5bWJvbCB3YXMgbWFya2VkIGV4dGVybmFsLiAgKi8KLQotICAgICAgaWYgKCFTX0lTX1JFR0lTVEVSIChzeW1ib2xQKSkKLQl7Ci0JICBzeW1ib2xQLT5zeV9udW1iZXIgPSBzeW1ib2xfbnVtYmVyKys7Ci0JICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9IDA7Ci0JICBzeW1ib2xQUCA9ICYoc3ltYm9sX25leHQgKHN5bWJvbFApKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bWJvbFApIHx8ICFTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJMb2NhbCBzeW1ib2wgJXMgbmV2ZXIgZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JICAgIH0JCQkvKiBvb3BzLiAqLwotCi0JICAvKiBVbmhvb2sgaXQgZnJvbSB0aGUgY2hhaW4uICAqLwotCSAgKnN5bWJvbFBQID0gc3ltYm9sX25leHQgKHN5bWJvbFApOwotCX0JCQkvKiBpZiB0aGlzIHN5bWJvbCBzaG91bGQgYmUgaW4gdGhlIG91dHB1dCAqLwotCi0gICAgfQkJCS8qIGZvciBlYWNoIHN5bWJvbCAqLwotCi0gIEhfU0VUX1NUUklOR19TSVpFIChoZWFkZXJzLCBzdHJpbmdfYnl0ZV9jb3VudCk7Ci0gIEhfU0VUX1NZTUJPTF9UQUJMRV9TSVpFIChoZWFkZXJzLCBzeW1ib2xfbnVtYmVyKTsKLX0JCQkJLyogb2JqX2NyYXdsX3N5bWJvbF9jaGFpbigpICovCi0MCi0KLSAvKioqKioqIFZNUyBPQkpFQ1QgRklMRSBIQUNLSU5HIFJPVVRJTkVTICoqKioqKiovCi0KLQotLyogQ3JlYXRlIHRoZSBWTVMgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotQ3JlYXRlX1ZNU19PYmplY3RfRmlsZSAoKQotewotI2lmCWRlZmluZWQoZXVuaWNlKSB8fCAhZGVmaW5lZChWTVMpCi0gIFZNU19PYmplY3RfRmlsZV9GRCA9IGNyZWF0IChvdXRfZmlsZV9uYW1lLCAwNzc3LCAidmFyIik7Ci0jZWxzZQkvKiBldW5pY2UgKi8KLSAgVk1TX09iamVjdF9GaWxlX0ZEID0gY3JlYXQgKG91dF9maWxlX25hbWUsIDAsICJyZm09dmFyIiwKLQkJCSAgICAgICJjdHg9YmluIiwgIm1iYz0xNiIsICJkZXE9NjQiLCAiZm9wPXRlZiIsCi0JCQkgICAgICAic2hyPW5pbCIpOwotI2VuZGlmCS8qIGV1bmljZSAqLwotICAvKiBEZWFsIHdpdGggZXJyb3JzLiAgKi8KLSAgaWYgKFZNU19PYmplY3RfRmlsZV9GRCA8IDApCi0gICAgYXNfZmF0YWwgKF8oIkNvdWxkbid0IGNyZWF0ZSBWTVMgb2JqZWN0IGZpbGUgXCIlc1wiIiksIG91dF9maWxlX25hbWUpOwotICAvKiBJbml0aWFsaXplIG9iamVjdCBmaWxlIGhhY2tpbmcgdmFyaWFibGVzLiAgKi8KLSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgPSAwOwotICBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZSA9IC0xOwotfQotCi0KLS8qIEZsdXNoIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlciB0byB0aGUgb2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpCi17Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIHJldHVybjsKLQotI2lmbmRlZiBWTVMJCQkvKiBGb3IgY3Jvc3MtYXNzZW1ibHkgcHVycG9zZXMuICovCi0gIHsKLSAgICBjaGFyIFJlY0xlblsyXTsKLQotICAgIC8qICJWYXJpYWJsZS1sZW5ndGggcmVjb3JkIiBmaWxlcyBoYXZlIGEgdHdvIGJ5dGUgbGVuZ3RoIGZpZWxkCi0gICAgICAgcHJlcGVuZGVkIHRvIGVhY2ggcmVjb3JkLiAgSXQncyBub3JtYWxseSBvdXQtb2YtYmFuZCwgYW5kIG5hdGl2ZQotICAgICAgIFZNUyBvdXRwdXQgd2lsbCBpbnNlcnQgaXQgYXV0b21hdGljYWxseSBmb3IgdGhpcyB0eXBlIG9mIGZpbGUuCi0gICAgICAgV2hlbiBjcm9zcy1hc3NlbWJsaW5nLCB3ZSBtdXN0IHdyaXRlIGl0IGV4cGxpY2l0bHkuICAqLwotICAgIG1kX251bWJlcl90b19jaGFycyAoUmVjTGVuLCBPYmplY3RfUmVjb3JkX09mZnNldCwgMik7Ci0gICAgaWYgKHdyaXRlIChWTVNfT2JqZWN0X0ZpbGVfRkQsIFJlY0xlbiwgMikgIT0gMikKLSAgICAgIGVycm9yIChfKCJJL08gZXJyb3Igd3JpdGluZyBWTVMgb2JqZWN0IGZpbGUgKGxlbmd0aCBwcmVmaXgpIikpOwotICAgIC8qIFdlIGFsc28gbmVlZCB0byBmb3JjZSB0aGUgYWN0dWFsIHJlY29yZCB0byBiZSBhbiBldmVuIG51bWJlciBvZgotICAgICAgIGJ5dGVzLiAgRm9yIG5hdGl2ZSBvdXRwdXQsIHRoYXQncyBhdXRvbWF0aWM7IHdoZW4gY3Jvc3MtYXNzZW1ibGluZywKLSAgICAgICBwYWQgd2l0aCBhIE5VTCBieXRlIGlmIGxlbmd0aCBpcyBvZGQuICBEbyBzbyBfYWZ0ZXJfIHdyaXRpbmcgdGhlCi0gICAgICAgcHJlLXBhZGRlZCBsZW5ndGguICBTaW5jZSBvdXIgYnVmZmVyIGlzIGRlZmluZWQgd2l0aCBldmVuIHNpemUsCi0gICAgICAgYW4gb2RkIG9mZnNldCBpbXBsaWVzIHRoYXQgaXQgaGFzIHNvbWUgcm9vbSBsZWZ0LiAgKi8KLSAgICBpZiAoKE9iamVjdF9SZWNvcmRfT2Zmc2V0ICYgMSkgIT0gMCkKLSAgICAgIE9iamVjdF9SZWNvcmRfQnVmZmVyW09iamVjdF9SZWNvcmRfT2Zmc2V0KytdID0gJ1wwJzsKLSAgfQotI2VuZGlmIC8qIG5vdCBWTVMgKi8KLQotICAvKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgZmlsZS4gICovCi0gIGlmICh3cml0ZSAoVk1TX09iamVjdF9GaWxlX0ZELCBPYmplY3RfUmVjb3JkX0J1ZmZlciwgT2JqZWN0X1JlY29yZF9PZmZzZXQpCi0gICAgICAhPSBPYmplY3RfUmVjb3JkX09mZnNldCkKLSAgICBlcnJvciAoXygiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIikpOwotCi0gIC8qIFRoZSBidWZmZXIgaXMgbm93IGVtcHR5LiAgKi8KLSAgT2JqZWN0X1JlY29yZF9PZmZzZXQgPSAwOwotfQotCi0KLS8qIERlY2xhcmUgYSBwYXJ0aWN1bGFyIHR5cGUgb2Ygb2JqZWN0IGZpbGUgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChUeXBlKQotICAgICBpbnQgVHlwZTsKLXsKLSAgLyogSWYgdGhlIHR5cGUgbWF0Y2hlcywgd2UgYXJlIGRvbmUuICAqLwotICBpZiAoVHlwZSA9PSBDdXJyZW50X09iamVjdF9SZWNvcmRfVHlwZSkKLSAgICByZXR1cm47Ci0gIC8qIE90aGVyd2lzZTogZmx1c2ggdGhlIGJ1ZmZlci4gICovCi0gIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLSAgLyogUmVtZW1iZXIgdGhlIG5ldyB0eXBlLiAgKi8KLSAgQ3VycmVudF9PYmplY3RfUmVjb3JkX1R5cGUgPSBUeXBlOwotfQotCi0KLS8qIENsb3NlIHRoZSBWTVMgT2JqZWN0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotQ2xvc2VfVk1TX09iamVjdF9GaWxlICgpCi17Ci0gIC8qIEZsdXNoIChzaG91bGQgbmV2ZXIgYmUgbmVjZXNzYXJ5KSBhbmQgcmVzZXQgc2F2ZWQgcmVjb3JkLXR5cGUgY29udGV4dC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkICgtMSk7Ci0KLSNpZm5kZWYgVk1TCQkJLyogRm9yIGNyb3NzLWFzc2VtYmx5IHB1cnBvc2VzLiAqLwotICB7Ci0gICAgY2hhciBSZWNMZW5bMl07Ci0gICAgaW50IG1pbnVzX29uZSA9IC0xOwotCi0gICAgLyogV3JpdGUgYSAyIGJ5dGUgcmVjb3JkLWxlbmd0aCBmaWVsZCBvZiAtMSBpbnRvIHRoZSBmaWxlLCB3aGljaAotICAgICAgIG1lYW5zIGVuZC1vZi1ibG9jayB3aGVuIHJlYWQsIGhlbmNlIGVuZC1vZi1maWxlIHdoZW4gb2NjdXJyaW5nCi0gICAgICAgaW4gdGhlIGZpbGUncyBsYXN0IGJsb2NrLiAgSXQgaXMgb25seSBuZWVkZWQgZm9yIHZhcmlhYmxlLWxlbmd0aAotICAgICAgIHJlY29yZCBmaWxlcyB0cmFuc2ZlcnJlZCB0byBWTVMgYXMgZml4ZWQtbGVuZ3RoIHJlY29yZCBmaWxlcwotICAgICAgICh0eXBpY2FsIGZvciBiaW5hcnkgRlRQOyBORlMgc2hvdWxkbid0IG5lZWQgaXQsIGJ1dCBpdCB3b24ndCBodXJ0KS4gICovCi0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChSZWNMZW4sIG1pbnVzX29uZSwgMik7Ci0gICAgd3JpdGUgKFZNU19PYmplY3RfRmlsZV9GRCwgUmVjTGVuLCAyKTsKLSAgfQotI2Vsc2UKLSAgICAvKiBXaGVuIHdyaXR0ZW4gb24gYSBWTVMgc3lzdGVtLCB0aGUgZmlsZSBoZWFkZXIgKGNmIGlub2RlKSB3aWxsIHJlY29yZAotICAgICAgIHRoZSBhY3R1YWwgZW5kLW9mLWZpbGUgcG9zaXRpb24gYW5kIG5vIGlubGluZSBtYXJrZXIgaXMgbmVlZGVkLiAgKi8KLSNlbmRpZgotCi0gIGNsb3NlIChWTVNfT2JqZWN0X0ZpbGVfRkQpOwotfQotDAotCi0gLyoqKioqKiBUZXh0IEluZm9ybWF0aW9uIGFuZCBSZWxvY2F0aW9uIHJvdXRpbmVzICoqKioqKi8KLQotCi0vKiBTdGFjayBQc2VjdCBiYXNlIGZvbGxvd2VkIGJ5IHNpZ25lZCwgdmFyeWluZy1zaXplZCBvZmZzZXQuCi0gICBDb21tb24gdG8gc2V2ZXJhbCBvYmplY3QgcmVjb3Jkcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdF9JbmRleCwgT2Zmc2V0LCBGb3JjZSkKLSAgICAgaW50IFBzZWN0X0luZGV4OwotICAgICBpbnQgT2Zmc2V0OwotICAgICBpbnQgRm9yY2U7Ci17Ci0gIGludCBwc2VjdF93aWR0aCwgb2Zmc2V0X3dpZHRoOwotCi0gIHBzZWN0X3dpZHRoID0gKCh1bnNpZ25lZCkgUHNlY3RfSW5kZXggPiAyNTUpID8gMiA6IDE7Ci0gIG9mZnNldF93aWR0aCA9IChGb3JjZSB8fCBPZmZzZXQgPiAzMjc2NyB8fCBPZmZzZXQgPCAtMzI3NjgpID8gNAotCQkgOiAoT2Zmc2V0ID4gMTI3IHx8IE9mZnNldCA8IC0xMjgpID8gMiA6IDE7Ci0jZGVmaW5lIFN0YV9QKHAsbykgKCgobyk8PDEpIHwgKChwKS0xKSkKLSAgLyogYnl0ZSBvciB3b3JkIHBzZWN0OyBieXRlLCB3b3JkLCBvciBsb25nd29yZCBvZmZzZXQgKi8KLSAgc3dpdGNoIChTdGFfUChwc2VjdF93aWR0aCxvZmZzZXRfd2lkdGgpKQotICAgIHsKLSAgICAgIGNhc2UgU3RhX1AoMSwxKToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1BCKTsKLQkJCVBVVF9DSEFSICgoY2hhcikodW5zaWduZWQgY2hhcikgUHNlY3RfSW5kZXgpOwotCQkJUFVUX0NIQVIgKChjaGFyKSBPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIFN0YV9QKDEsMik6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9QVyk7Ci0JCQlQVVRfQ0hBUiAoKGNoYXIpKHVuc2lnbmVkIGNoYXIpIFBzZWN0X0luZGV4KTsKLQkJCVBVVF9TSE9SVCAoT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgxLDQpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfUEwpOwotCQkJUFVUX0NIQVIgKChjaGFyKSh1bnNpZ25lZCBjaGFyKSBQc2VjdF9JbmRleCk7Ci0JCQlQVVRfTE9ORyAoT2Zmc2V0KTsKLQkJCWJyZWFrOwotICAgICAgY2FzZSBTdGFfUCgyLDEpOglQVVRfQ0hBUiAoVElSX1NfQ19TVEFfV1BCKTsKLQkJCVBVVF9TSE9SVCAoUHNlY3RfSW5kZXgpOwotCQkJUFVUX0NIQVIgKChjaGFyKSBPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgICBjYXNlIFN0YV9QKDIsMik6CVBVVF9DSEFSIChUSVJfU19DX1NUQV9XUFcpOwotCQkJUFVUX1NIT1JUIChQc2VjdF9JbmRleCk7Ci0JCQlQVVRfU0hPUlQgKE9mZnNldCk7Ci0JCQlicmVhazsKLSAgICAgIGNhc2UgU3RhX1AoMiw0KToJUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1dQTCk7Ci0JCQlQVVRfU0hPUlQgKFBzZWN0X0luZGV4KTsKLQkJCVBVVF9MT05HIChPZmZzZXQpOwotCQkJYnJlYWs7Ci0gICAgfQotI3VuZGVmIFN0YV9QCi19Ci0KLQotLyogU3RvcmUgaW1tZWRpYXRlIGRhdGEgaW4gY3VycmVudCBQc2VjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKQotICAgICBjb25zdCBjaGFyICpQb2ludGVyOwotICAgICBpbnQgU2l6ZTsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotewotICByZWdpc3RlciBpbnQgaTsKLQotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoUmVjb3JkX1R5cGUpOwotICAvKiBXZSBjYW4gb25seSBzdG9yZSBhcyBtb3N0IDEyOCBieXRlcyBhdCBhIHRpbWUgZHVlIHRvIHRoZSB3YXkgdGhhdAotICAgICBUSVIgY29tbWFuZHMgYXJlIGVuY29kZWQuICAqLwotICB3aGlsZSAoU2l6ZSA+IDApCi0gICAgewotICAgICAgaSA9IChTaXplID4gMTI4KSA/IDEyOCA6IFNpemU7Ci0gICAgICBTaXplIC09IGk7Ci0gICAgICAvKiBJZiB3ZSBjYW5ub3QgYWNjb21tb2RhdGUgdGhpcyByZWNvcmQsIGZsdXNoIHRoZSBidWZmZXIuICAqLwotICAgICAgaWYgKChPYmplY3RfUmVjb3JkX09mZnNldCArIGkgKyAxKSA+PSBzaXplb2YgT2JqZWN0X1JlY29yZF9CdWZmZXIpCi0JRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotICAgICAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCByZWNvcmQgdHlwZS4gICovCi0gICAgICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLQlQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAgICAgLyogU3RvcmUgdGhlIGNvdW50LiAgVGhlIFN0b3JlIEltbWVkaWF0ZSBUSVIgY29tbWFuZCBpcyBpbXBsaWVkIGJ5Ci0gICAgICAgICBhIG5lZ2F0aXZlIGNvbW1hbmQgYnl0ZSwgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGltbWVkaWF0ZSBkYXRhCi0gICAgICAgICBpcyBhYnMoY29tbWFuZF9ieXRlKS4gIFNvLCB3ZSB3cml0ZSB0aGUgbmVnYXRlZCBsZW5ndGggdmFsdWUuICAqLwotICAgICAgUFVUX0NIQVIgKChjaGFyKSAoLWkgJiAweGZmKSk7Ci0gICAgICAvKiBOb3cgc3RvcmUgdGhlIGRhdGEuICAqLwotICAgICAgd2hpbGUgKC0taSA+PSAwKQotCVBVVF9DSEFSICgqUG9pbnRlcisrKTsKLSAgICB9Ci0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQotCi0vKiBNYWtlIGEgZGF0YSByZWZlcmVuY2UuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1NldF9EYXRhIChQc2VjdF9JbmRleCwgT2Zmc2V0LCBSZWNvcmRfVHlwZSwgRm9yY2UpCi0gICAgIGludCBQc2VjdF9JbmRleDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IFJlY29yZF9UeXBlOwotICAgICBpbnQgRm9yY2U7Ci17Ci0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKFJlY29yZF9UeXBlKTsKLSAgLyogU3RhY2sgdGhlIFBzZWN0IGJhc2Ugd2l0aCBpdHMgb2Zmc2V0LiAgKi8KLSAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgRm9yY2UpOwotICAvKiBTZXQgcmVsb2NhdGlvbiBiYXNlLiAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1BJRFIpOwotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLQotLyogTWFrZSBhIGRlYnVnZ2VyIHJlZmVyZW5jZSB0byBhIHN0cnVjdCwgdW5pb24gb3IgZW51bS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfU3RvcmVfU3RydWN0IChTdHJ1Y3RfSW5kZXgpCi0gICAgIGludCBTdHJ1Y3RfSW5kZXg7Ci17Ci0gIC8qIFdlIGFyZSB3cml0aW5nIGEgZGVidWcgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfREJHKTsKLSAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgcmVjb3JkIHR5cGUuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfVVcpOwotICBQVVRfU0hPUlQgKFN0cnVjdF9JbmRleCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TVEtETCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19MKTsKLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotCi0KLS8qIE1ha2UgYSBkZWJ1Z2dlciByZWZlcmVuY2UgdG8gcGFydGlhbGx5IGRlZmluZSBhIHN0cnVjdCwgdW5pb24gb3IgZW51bS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfRGVmX1N0cnVjdCAoU3RydWN0X0luZGV4KQotICAgICBpbnQgU3RydWN0X0luZGV4OwotewotICAvKiBXZSBhcmUgd3JpdGluZyBhIGRlYnVnIHJlY29yZC4gICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChPQkpfU19DX0RCRyk7Ci0gIC8qIElmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfREJHKTsKLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX1VXKTsKLSAgUFVUX1NIT1JUIChTdHJ1Y3RfSW5kZXgpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19DVExfREZMT0MpOwotICAvKiBGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbC4gICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1WTVNfU2V0X1N0cnVjdCAoU3RydWN0X0luZGV4KQotICAgICBpbnQgU3RydWN0X0luZGV4OwotewkJCQkvKiBzZWUgcHJldmlvdXMgZnVuY3Rpb25zIGZvciBjb21tZW50cyAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19EQkcpOwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfVVcpOwotICBQVVRfU0hPUlQgKFN0cnVjdF9JbmRleCk7Ci0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TVExPQyk7Ci0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLSAvKioqKioqIFRyYWNlYmFjayBJbmZvcm1hdGlvbiByb3V0aW5lcyAqKioqKiovCi0KLQotLyogV3JpdGUgdGhlIFRyYWNlYmFjayBNb2R1bGUgQmVnaW4gcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfTW9kdWxlX0JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwLCAqY3AxOwotICBpbnQgU2l6ZTsKLSAgY2hhciBMb2NhbFsyNTZdOwotCi0gIC8qIEFycmFuZ2UgdG8gc3RvcmUgdGhlIGRhdGEgbG9jYWxseSAobGVhdmUgcm9vbSBmb3Igc2l6ZSBieXRlKS4gICovCi0gIGNwID0gJkxvY2FsWzFdOwotICAvKiBCZWdpbiBtb2R1bGUuICAqLwotICAqY3ArKyA9IERTVF9TX0NfTU9EQkVHOwotICAqY3ArKyA9IDA7CQkvKiBmbGFnczsgbm90IHVzZWQgKi8KLSAgLyoKLSAgICoJTGFuZ3VhZ2UgdHlwZSA9PSAiQyIKLSAgICoKLSAgICogKEZJWE1FOiAgdGhpcyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGlucHV0Li4uKQotICAgKi8KLSAgQ09QWV9MT05HIChjcCwgRFNUX1NfQ19DKTsKLSAgY3AgKz0gNDsKLSAgLyogU3RvcmUgdGhlIG1vZHVsZSBuYW1lLiAgKi8KLSAgKmNwKysgPSAoY2hhcikgc3RybGVuIChNb2R1bGVfTmFtZSk7Ci0gIGNwMSA9IE1vZHVsZV9OYW1lOwotICB3aGlsZSAoKmNwMSkKLSAgICAqY3ArKyA9ICpjcDErKzsKLSAgLyogTm93IHdlIGNhbiBzdG9yZSB0aGUgcmVjb3JkIHNpemUuICAqLwotICBTaXplID0gKGNwIC0gTG9jYWwpOwotICBMb2NhbFswXSA9IFNpemUgLSAxOwotICAvKiBQdXQgaXQgaW50byB0aGUgb2JqZWN0IHJlY29yZC4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfVEJUKTsKLX0KLQotCi0vKiBXcml0ZSB0aGUgVHJhY2ViYWNrIE1vZHVsZSBFbmQgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfTW9kdWxlX0VuZCAoKQotewotICBjaGFyIExvY2FsWzJdOwotCi0gIC8qIEVuZCBtb2R1bGUuICAqLwotICBMb2NhbFswXSA9IDE7Ci0gIExvY2FsWzFdID0gRFNUX1NfQ19NT0RFTkQ7Ci0gIC8qIFB1dCBpdCBpbnRvIHRoZSBvYmplY3QgcmVjb3JkLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgMiwgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIFJvdXRpbmUgQmVnaW4gcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfUm91dGluZV9CZWdpbiAoc3ltYm9sUCwgUHNlY3QpCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIGludCBQc2VjdDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqY3AsICpjcDE7Ci0gIGNoYXIgKk5hbWU7Ci0gIGludCBPZmZzZXQ7Ci0gIGludCBTaXplOwotICBjaGFyIExvY2FsWzUxMl07Ci0KLSAgLyogU3RyaXAgdGhlIGxlYWRpbmcgIl8iIGZyb20gdGhlIG5hbWUuICAqLwotICBOYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gIGlmICgqTmFtZSA9PSAnXycpCi0gICAgTmFtZSsrOwotICAvKiBHZXQgdGhlIHRleHQgcHNlY3Qgb2Zmc2V0LiAgKi8KLSAgT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotICAvKiBTZXQgdGhlIHJlY29yZCBzaXplLiAgKi8KLSAgU2l6ZSA9IDEgKyAxICsgNCArIDEgKyBzdHJsZW4gKE5hbWUpOwotICBMb2NhbFswXSA9IFNpemU7Ci0gIC8qIERTVCB0eXBlICJyb3V0aW5lIGJlZ2luIi4gICovCi0gIExvY2FsWzFdID0gRFNUX1NfQ19SVE5CRUc7Ci0gIC8qIFVzZXMgQ2FsbFMvQ2FsbEcuICAqLwotICBMb2NhbFsyXSA9IDA7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHNvIGZhci4gICovCi0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfVEJUKTsKLSAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgT0JKX1NfQ19UQlQgcmVjb3JkLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfVEJUKTsKLSAgLyogU3RhY2sgdGhlIGFkZHJlc3MuICAqLwotICB2bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdCwgT2Zmc2V0LCAwKTsKLSAgLyogU3RvcmUgdGhlIGRhdGEgcmVmZXJlbmNlLiAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1BJRFIpOwotICAvKiBTdG9yZSB0aGUgY291bnRlZCBzdHJpbmcgYXMgZGF0YS4gICovCi0gIGNwID0gTG9jYWw7Ci0gIGNwMSA9IE5hbWU7Ci0gIFNpemUgPSBzdHJsZW4gKGNwMSkgKyAxOwotICAqY3ArKyA9IFNpemUgLSAxOwotICB3aGlsZSAoKmNwMSkKLSAgICAqY3ArKyA9ICpjcDErKzsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgU2l6ZSwgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIFJvdXRpbmUgRW5kIHJlY29yZC4KLQotICAgV2UgKm11c3QqIHNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIG5leHQgcm91dGluZSwgc2luY2UgdGhlCi0gICBhc3NlbWJlciBoYXMgYSB3YXkgb2YgcmVhc3NlbWJsaW5nIHRoZSBzeW1ib2wgdGFibGUgT1VUIE9GIE9SREVSIFRodXMKLSAgIHRoZSBuZXh0IHJvdXRpbmUgaW4gdGhlIHN5bWJvbCBsaXN0IGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgbmV4dCBvbmUgaW4KLSAgIG1lbW9yeS4gIEZvciBkZWJ1Z2dpbmcgdG8gd29yayBjb3JyZWN0bHkgd2UgbXVzdCBrbm93IHRoZSBzaXplIG9mIHRoZQotICAgcm91dGluZS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX1JvdXRpbmVfRW5kIChNYXhfU2l6ZSwgc3ApCi0gICAgIGludCBNYXhfU2l6ZTsKLSAgICAgc3ltYm9sUyAqc3A7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBTaXplID0gMHg3ZmZmZmZmZjsKLSAgY2hhciBMb2NhbFsxNl07Ci0gIHZhbHVlVCBzeW1fdmFsdWUsIHNwX3ZhbHVlID0gU19HRVRfVkFMVUUgKHNwKTsKLQotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJiBTX0dFVF9UWVBFIChzeW1ib2xQKSA9PSBOX1RFWFQpCi0JewotCSAgaWYgKCpTX0dFVF9OQU1FIChzeW1ib2xQKSA9PSAnTCcpCi0JICAgIGNvbnRpbnVlOwotCSAgc3ltX3ZhbHVlID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgaWYgKHN5bV92YWx1ZSA+IHNwX3ZhbHVlICYmIHN5bV92YWx1ZSA8IFNpemUpCi0JICAgIFNpemUgPSBzeW1fdmFsdWU7Ci0KLQkgIC8qCi0JICAgKiBEdW1teSBsYWJlbHMgbGlrZSAiZ2NjX2NvbXBpbGVkLiIgc2hvdWxkIG5vIGxvbmdlciByZWFjaCBoZXJlLgotCSAgICovCi0jaWYgMAotCSAgZWxzZQotCSAgLyogY2hlY2sgaWYgZ2NjX2NvbXBpbGVkLiBoYXMgc2l6ZSBvZiB6ZXJvICovCi0JICBpZiAoc3ltX3ZhbHVlID09IHNwX3ZhbHVlICYmCi0JICAgICAgc3AgIT0gc3ltYm9sUCAmJgotCSAgICAgICghc3RyY21wIChTX0dFVF9OQU1FIChzcCksICJnY2NfY29tcGlsZWQuIikgfHwKLQkgICAgICAgIXN0cmNtcCAoU19HRVRfTkFNRSAoc3ApLCAiZ2NjMl9jb21waWxlZC4iKSkpCi0JICAgIFNpemUgPSBzeW1fdmFsdWU7Ci0jZW5kaWYKLQl9Ci0gICAgfQotICBpZiAoU2l6ZSA9PSAweDdmZmZmZmZmKQotICAgIFNpemUgPSBNYXhfU2l6ZTsKLSAgU2l6ZSAtPSBzcF92YWx1ZTsJCS8qIGFuZCBnZXQgdGhlIHNpemUgb2YgdGhlIHJvdXRpbmUgKi8KLSAgLyogUmVjb3JkIFNpemUuICAqLwotICBMb2NhbFswXSA9IDY7Ci0gIC8qIERTVCB0eXBlIGlzICJyb3V0aW5lIGVuZCIuICAqLwotICBMb2NhbFsxXSA9IERTVF9TX0NfUlRORU5EOwotICBMb2NhbFsyXSA9IDA7CQkvKiB1bnVzZWQgKi8KLSAgLyogU2l6ZSBvZiByb3V0aW5lLiAgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbM10sIFNpemUpOwotICAvKiBTdG9yZSB0aGUgcmVjb3JkLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19UQlQpOwotfQotCi0KLS8qIFdyaXRlIGEgVHJhY2ViYWNrIEJsb2NrIEJlZ2luIHJlY29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfVEJUX0Jsb2NrX0JlZ2luIChzeW1ib2xQLCBQc2VjdCwgTmFtZSkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgICAgaW50IFBzZWN0OwotICAgICBjaGFyICpOYW1lOwotewotICByZWdpc3RlciBjaGFyICpjcCwgKmNwMTsKLSAgaW50IE9mZnNldDsKLSAgaW50IFNpemU7Ci0gIGNoYXIgTG9jYWxbNTEyXTsKLQotICAvKiBTZXQgdGhlIHJlY29yZCBzaXplLiAgKi8KLSAgU2l6ZSA9IDEgKyAxICsgNCArIDEgKyBzdHJsZW4gKE5hbWUpOwotICBMb2NhbFswXSA9IFNpemU7Ci0gIC8qIERTVCB0eXBlIGlzICJiZWdpbiBibG9jayI7IHdlIHNpbXVsYXRlIHdpdGggYSBwaG9ueSByb3V0aW5lLiAgKi8KLSAgTG9jYWxbMV0gPSBEU1RfU19DX0JMS0JFRzsKLSAgLyogVXNlcyBDYWxsUy9DYWxsRy4gICovCi0gIExvY2FsWzJdID0gMDsKLSAgLyogU3RvcmUgdGhlIGRhdGEgc28gZmFyLiAgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgMywgT0JKX1NfQ19EQkcpOwotICAvKiBNYWtlIHN1cmUgd2UgYXJlIHN0aWxsIGdlbmVyYXRpbmcgYSBkZWJ1ZyByZWNvcmQuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19EQkcpOwotICAvKiBOb3cgZ2V0IHRoZSBzeW1ib2wgYWRkcmVzcy4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUQV9XUEwpOwotICBQVVRfU0hPUlQgKFBzZWN0KTsKLSAgLyogR2V0IHRoZSB0ZXh0IHBzZWN0IG9mZnNldC4gICovCi0gIE9mZnNldCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLSAgUFVUX0xPTkcgKE9mZnNldCk7Ci0gIC8qIFN0b3JlIHRoZSBkYXRhIHJlZmVyZW5jZS4gICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgLyogU3RvcmUgdGhlIGNvdW50ZWQgc3RyaW5nIGFzIGRhdGEuICAqLwotICBjcCA9IExvY2FsOwotICBjcDEgPSBOYW1lOwotICBTaXplID0gc3RybGVuIChjcDEpICsgMTsKLSAgKmNwKysgPSBTaXplIC0gMTsKLSAgd2hpbGUgKCpjcDEpCi0gICAgKmNwKysgPSAqY3AxKys7Ci0gIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIFNpemUsIE9CSl9TX0NfREJHKTsKLX0KLQotCi0vKiBXcml0ZSBhIFRyYWNlYmFjayBCbG9jayBFbmQgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19UQlRfQmxvY2tfRW5kIChTaXplKQotICAgICB2YWx1ZVQgU2l6ZTsKLXsKLSAgY2hhciBMb2NhbFsxNl07Ci0KLSAgTG9jYWxbMF0gPSA2OwkJLyogcmVjb3JkIGxlbmd0aCAqLwotICAvKiBEU1QgdHlwZSBpcyAiYmxvY2sgZW5kIjsgc2ltdWxhdGUgd2l0aCBhIHBob255IGVuZCByb3V0aW5lLiAgKi8KLSAgTG9jYWxbMV0gPSBEU1RfU19DX0JMS0VORDsKLSAgTG9jYWxbMl0gPSAwOwkJLyogdW51c2VkLCBtdXN0IGJlIHplcm8gKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbM10sIFNpemUpOwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCA3LCBPQkpfU19DX0RCRyk7Ci19Ci0MCi0KLS8qIFdyaXRlIGEgTGluZSBudW1iZXIgPC0+IFByb2dyYW0gQ291bnRlciBjb3JyZWxhdGlvbiByZWNvcmQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChMaW5lX051bWJlciwgT2Zmc2V0LCBQc2VjdCwgRG9fRGVsdGEpCi0gICAgIGludCBMaW5lX051bWJlcjsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgaW50IFBzZWN0OwotICAgICBpbnQgRG9fRGVsdGE7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwOwotICBjaGFyIExvY2FsWzY0XTsKLQotICBpZiAoRG9fRGVsdGEgPT0gMCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogIElmIG5vdCBkZWx0YSwgc2V0IG91ciBQQy9MaW5lIG51bWJlciBjb3JyZWxhdGlvbi4KLSAgICAgICAqLwotICAgICAgY3AgPSAmTG9jYWxbMV07CS8qIFB1dCBzaXplIGluIExvY2FsWzBdIGxhdGVyLiAgKi8KLSAgICAgIC8qIERTVCB0eXBlIGlzICJMaW5lIE51bWJlci9QQyBjb3JyZWxhdGlvbiIuICAqLwotICAgICAgKmNwKysgPSBEU1RfU19DX0xJTkVfTlVNOwotICAgICAgLyogU2V0IExpbmUgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChMaW5lX051bWJlciAtIDEgPD0gMjU1KQotCXsKLQkgICpjcCsrID0gRFNUX1NfQ19TRVRfTElOVU1fQjsKLQkgICpjcCsrID0gKGNoYXIpIChMaW5lX051bWJlciAtIDEpOwotCX0KLSAgICAgIGVsc2UgaWYgKExpbmVfTnVtYmVyIC0gMSA8PSA2NTUzNSkKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTkVfTlVNOwotCSAgQ09QWV9TSE9SVCAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfU0VUX0xJTlVNX0w7Ci0JICBDT1BZX0xPTkcgKGNwLCBMaW5lX051bWJlciAtIDEpLCAgY3AgKz0gNDsKLQl9Ci0gICAgICAvKiBTZXQgUEMuICAqLwotICAgICAgKmNwKysgPSBEU1RfU19DX1NFVF9BQlNfUEM7Ci0gICAgICAvKiBTdG9yZSBzaXplIG5vdyB0aGF0IHdlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgICAgIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07Ci0JLyogQWNjb3VudCBmb3IgdGhlIHNwYWNlIHRoYXQgVElSX1NfQ19TVE9fUElEUiB3aWxsIHVzZSBmb3IgdGhlIFBDLiAgKi8KLQlMb2NhbFswXSArPSA0OwkJLyogc2l6ZSBpbmNsdWRlcyBsZW5ndGggb2YgYW5vdGhlciBsb25nd29yZCAqLwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotICAgICAgLyogTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgT0JKX1NfQ19UQlQgcmVjb3JkLiAgKi8KLSAgICAgIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotCVBVVF9DSEFSIChPQkpfU19DX1RCVCk7Ci0gICAgICB2bXNfdGlyX3N0YWNrX3BzZWN0IChQc2VjdCwgT2Zmc2V0LCAwKTsKLSAgICAgIFBVVF9DSEFSIChUSVJfU19DX1NUT19QSURSKTsKLSAgICAgIC8qIERvIGEgUEMgb2Zmc2V0IG9mIDAgdG8gcmVnaXN0ZXIgdGhlIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIExvY2FsWzBdID0gMjsKLSAgICAgIExvY2FsWzFdID0gRFNUX1NfQ19MSU5FX05VTTsKLSAgICAgIExvY2FsWzJdID0gMDsJCS8qIEluY3JlbWVudCBQQyBieSAwIGFuZCByZWdpc3RlciBsaW5lICMgKi8KLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIDMsIE9CSl9TX0NfVEJUKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoRG9fRGVsdGEgPCAwKQotCXsKLQkgIC8qCi0JICAgKiAgV2hlbiBkZWx0YSBpcyBuZWdhdGl2ZSwgdGVybWluYXRlIHRoZSBsaW5lIG51bWJlcnMuCi0JICAgKi8KLQkgIExvY2FsWzBdID0gMSArIDEgKyA0OwotCSAgTG9jYWxbMV0gPSBEU1RfU19DX0xJTkVfTlVNOwotCSAgTG9jYWxbMl0gPSBEU1RfU19DX1RFUk1fTDsKLQkgIENPUFlfTE9ORyAoJkxvY2FsWzNdLCBPZmZzZXQpOwotCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgNywgT0JKX1NfQ19UQlQpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIC8qCi0gICAgICAgKiAgRG8gYSBQQy9MaW5lIGRlbHRhLgotICAgICAgICovCi0gICAgICBjcCA9ICZMb2NhbFsxXTsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19MSU5FX05VTTsKLSAgICAgIGlmIChMaW5lX051bWJlciA+IDEpCi0JewotCSAgLyogV2UgbmVlZCB0byBpbmNyZW1lbnQgdGhlIGxpbmUgbnVtYmVyLiAgKi8KLQkgIGlmIChMaW5lX051bWJlciAtIDEgPD0gMjU1KQotCSAgICB7Ci0JICAgICAgKmNwKysgPSBEU1RfU19DX0lOQ1JfTElOVU07Ci0JICAgICAgKmNwKysgPSBMaW5lX051bWJlciAtIDE7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKExpbmVfTnVtYmVyIC0gMSA8PSA2NTUzNSkKLQkgICAgewotCSAgICAgICpjcCsrID0gRFNUX1NfQ19JTkNSX0xJTlVNX1c7Ci0JICAgICAgQ09QWV9TSE9SVCAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqY3ArKyA9IERTVF9TX0NfSU5DUl9MSU5VTV9MOwotCSAgICAgIENPUFlfTE9ORyAoY3AsIExpbmVfTnVtYmVyIC0gMSksICBjcCArPSA0OwotCSAgICB9Ci0JfQotICAgICAgLyoKLSAgICAgICAqCUluY3JlbWVudCB0aGUgUEMKLSAgICAgICAqLwotICAgICAgaWYgKE9mZnNldCA8PSAxMjgpCi0JewotCSAgLyogU21hbGwgb2Zmc2V0cyBhcmUgZW5jb2RlZCBhcyBuZWdhdGl2ZSBudW1iZXJzLCByYXRoZXIgdGhhbiB0aGUKLQkgICAgIHVzdWFsIG5vbi1uZWdhdGl2ZSB0eXBlIGNvZGUgZm9sbG93ZWQgYnkgYW5vdGhlciBkYXRhIGZpZWxkLiAgKi8KLQkgICpjcCsrID0gKGNoYXIpIC1PZmZzZXQ7Ci0JfQotICAgICAgZWxzZSBpZiAoT2Zmc2V0IDw9IDY1NTM1KQotCXsKLQkgICpjcCsrID0gRFNUX1NfQ19ERUxUQV9QQ19XOwotCSAgQ09QWV9TSE9SVCAoY3AsIE9mZnNldCksICBjcCArPSAyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqY3ArKyA9IERTVF9TX0NfREVMVEFfUENfTDsKLQkgIENPUFlfTE9ORyAoY3AsIE9mZnNldCksICBjcCArPSA0OwotCX0KLSAgICAgIC8qIFNldCBzaXplIG5vdyB0aGF0IGJlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgICAgIExvY2FsWzBdID0gY3AgLSAmTG9jYWxbMV07Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBjcCAtIExvY2FsLCBPQkpfU19DX1RCVCk7Ci0gICAgfQotfQotDAotCi0vKiBEZXNjcmliZSBhIHNvdXJjZSBmaWxlIHRvIHRoZSBkZWJ1Z2dlci4gICovCi0KLXN0YXRpYyBpbnQKLVZNU19UQlRfU291cmNlX0ZpbGUgKEZpbGVuYW1lLCBJRF9OdW1iZXIpCi0gICAgIGNoYXIgKkZpbGVuYW1lOwotICAgICBpbnQgSURfTnVtYmVyOwotewotICByZWdpc3RlciBjaGFyICpjcDsKLSAgaW50IGxlbiwgcmZvLCBmZmIsIGViazsKLSAgY2hhciBjZHRbOF07Ci0gIGNoYXIgTG9jYWxbNTEyXTsKLSNpZmRlZiBWTVMJCQkvKiBVc2VkIGZvciBuYXRpdmUgYXNzZW1ibHkgKi8KLSAgdW5zaWduZWQgU3RhdHVzOwotICBzdHJ1Y3QgRkFCIGZhYjsJCQkvKiBSTVMgZmlsZSBhY2Nlc3MgYmxvY2sgKi8KLSAgc3RydWN0IE5BTSBuYW07CQkJLyogZmlsZSBuYW1lIGluZm9ybWF0aW9uICovCi0gIHN0cnVjdCBYQUJEQVQgeGFiZGF0OwkJCS8qIGRhdGUrdGltZSBmaWVsZHMgKi8KLSAgc3RydWN0IFhBQkZIQyB4YWJmaGM7CQkJLyogZmlsZSBoZWFkZXIgY2hhcmFjdGVyaXN0aWNzICovCi0gIGNoYXIgcmVzdWx0YW50X3N0cmluZ19idWZmZXJbMjU1ICsgMV07Ci0KLSAgLyoKLSAgICoJU2V0IHVwIFJNUyBzdHJ1Y3R1cmVzOgotICAgKi8KLSAgLyogRkFCIC0tIGZpbGUgYWNjZXNzIGJsb2NrICovCi0gIG1lbXNldCAoKGNoYXIgKikgJmZhYiwgMCwgc2l6ZW9mIGZhYik7Ci0gIGZhYi5mYWIkYl9iaWQgPSBGQUIkQ19CSUQ7Ci0gIGZhYi5mYWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIGZhYjsKLSAgZmFiLmZhYiRsX2ZuYSA9IEZpbGVuYW1lOwotICBmYWIuZmFiJGJfZm5zID0gKHVuc2lnbmVkIGNoYXIpIHN0cmxlbiAoRmlsZW5hbWUpOwotICBmYWIuZmFiJGxfbmFtID0gKGNoYXIgKikgJm5hbTsKLSAgZmFiLmZhYiRsX3hhYiA9IChjaGFyICopICZ4YWJkYXQ7Ci0gIC8qIE5BTSAtLSBmaWxlIG5hbWUgYmxvY2sgKi8KLSAgbWVtc2V0ICgoY2hhciAqKSAmbmFtLCAwLCBzaXplb2YgbmFtKTsKLSAgbmFtLm5hbSRiX2JpZCA9IE5BTSRDX0JJRDsKLSAgbmFtLm5hbSRiX2JsbiA9ICh1bnNpZ25lZCBjaGFyKSBzaXplb2YgbmFtOwotICBuYW0ubmFtJGxfcnNhID0gcmVzdWx0YW50X3N0cmluZ19idWZmZXI7Ci0gIG5hbS5uYW0kYl9yc3MgPSAodW5zaWduZWQgY2hhcikgKHNpemVvZiByZXN1bHRhbnRfc3RyaW5nX2J1ZmZlciAtIDEpOwotICAvKiBYQUJzIC0tIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYmxvY2tzICovCi0gIG1lbXNldCAoKGNoYXIgKikgJnhhYmRhdCwgMCwgc2l6ZW9mIHhhYmRhdCk7Ci0gIHhhYmRhdC54YWIkYl9jb2QgPSBYQUIkQ19EQVQ7Ci0gIHhhYmRhdC54YWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIHhhYmRhdDsKLSAgeGFiZGF0LnhhYiRsX254dCA9IChjaGFyICopICZ4YWJmaGM7Ci0gIG1lbXNldCAoKGNoYXIgKikgJnhhYmZoYywgMCwgc2l6ZW9mIHhhYmZoYyk7Ci0gIHhhYmZoYy54YWIkYl9jb2QgPSBYQUIkQ19GSEM7Ci0gIHhhYmZoYy54YWIkYl9ibG4gPSAodW5zaWduZWQgY2hhcikgc2l6ZW9mIHhhYmZoYzsKLSAgeGFiZmhjLnhhYiRsX254dCA9IDA7Ci0gIC8qCi0gICAqCUdldCB0aGUgZmlsZSBpbmZvcm1hdGlvbgotICAgKi8KLSAgU3RhdHVzID0gc3lzJG9wZW4gKCZmYWIpOwotICBpZiAoIShTdGF0dXMgJiAxKSkKLSAgICB7Ci0gICAgICBhc190c2t0c2sgKF8oIkNvdWxkbid0IGZpbmQgc291cmNlIGZpbGUgXCIlc1wiLCBzdGF0dXM9JSVYJXgiKSwKLQkJIEZpbGVuYW1lLCBTdGF0dXMpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBzeXMkY2xvc2UgKCZmYWIpOwotICAvKiBOb3cgZXh0cmFjdCBmaWVsZHMgb2YgaW50ZXJlc3QuICAqLwotICBtZW1jcHkgKGNkdCwgKGNoYXIgKikgJnhhYmRhdC54YWIkcV9jZHQsIDgpOwkvKiBjcmVhdGlvbiBkYXRlICovCi0gIGViayA9IHhhYmZoYy54YWIkbF9lYms7CQkvKiBlbmQtb2YtZmlsZSBibG9jayAqLwotICBmZmIgPSB4YWJmaGMueGFiJHdfZmZiOwkJLyogZmlyc3QgZnJlZSBieXRlIG9mIGxhc3QgYmxvY2sgKi8KLSAgcmZvID0geGFiZmhjLnhhYiRiX3JmbzsJCS8qIHJlY29yZCBmb3JtYXQgKi8KLSAgbGVuID0gbmFtLm5hbSRiX3JzbDsJCQkvKiBsZW5ndGggb2YgRmlsZW5hbWUgKi8KLSAgcmVzdWx0YW50X3N0cmluZ19idWZmZXJbbGVuXSA9ICdcMCc7Ci0gIEZpbGVuYW1lID0gcmVzdWx0YW50X3N0cmluZ19idWZmZXI7CS8qIGZ1bGwgZmlsZW5hbWUgKi8KLSNlbHNlCQkJCS8qIENyb3NzLWFzc2VtYmx5ICovCi0gIC8qIFtQZXJoYXBzIHdlIG91Z2h0IHRvIHVzZSBhY3R1YWwgdmFsdWVzIGRlcml2ZWQgZnJvbSBzdGF0KCkgaGVyZT9dICAqLwotICBtZW1zZXQgKGNkdCwgMCwgOCk7CQkJLyogbnVsbCBWTVMgcXVhZHdvcmQgYmluYXJ5IHRpbWUgKi8KLSAgZWJrID0gZmZiID0gcmZvID0gMDsKLSAgbGVuID0gc3RybGVuIChGaWxlbmFtZSk7Ci0gIGlmIChsZW4gPiAyNTUpCS8qIGEgc2luZ2xlIGJ5dGUgaXMgdXNlZCBhcyBjb3VudCBwcmVmaXggKi8KLSAgICB7Ci0gICAgICBGaWxlbmFtZSArPSAobGVuIC0gMjU1KTsJCS8qIHRhaWwgZW5kIGlzIG1vcmUgc2lnbmlmaWNhbnQgKi8KLSAgICAgIGxlbiA9IDI1NTsKLSAgICB9Ci0jZW5kaWYgLyogVk1TICovCi0KLSAgY3AgPSAmTG9jYWxbMV07CQkJLyogZmlsbCBpbiByZWNvcmQgbGVuZ3RoIGxhdGVyICovCi0gICpjcCsrID0gRFNUX1NfQ19TT1VSQ0U7CQkvKiBEU1QgdHlwZSBpcyAic291cmNlIGZpbGUiICovCi0gICpjcCsrID0gRFNUX1NfQ19TUkNfRk9STUZFRUQ7CQkvKiBmb3JtZmVlZHMgY291bnQgYXMgc291cmNlIHJlY29yZHMgKi8KLSAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUNMRklMRTsJCS8qIGRlY2xhcmUgc291cmNlIGZpbGUgKi8KLSAga25vdyAoY3AgPT0gJkxvY2FsWzRdKTsKLSAgKmNwKysgPSAwOwkJCQkvKiBmaWxsIGluIHRoaXMgbGVuZ3RoIGJlbG93ICovCi0gICpjcCsrID0gMDsJCQkJLyogZmxhZ3M7IG11c3QgYmUgemVybyAqLwotICBDT1BZX1NIT1JUIChjcCwgSURfTnVtYmVyKSwgIGNwICs9IDI7CS8qIGZpbGUgSUQgbnVtYmVyICovCi0gIG1lbWNweSAoY3AsIGNkdCwgOCksICBjcCArPSA4OwkvKiBjcmVhdGlvbiBkYXRlK3RpbWUgKi8KLSAgQ09QWV9MT05HIChjcCwgZWJrKSwgIGNwICs9IDQ7CS8qIGVuZC1vZi1maWxlIGJsb2NrICovCi0gIENPUFlfU0hPUlQgKGNwLCBmZmIpLCAgY3AgKz0gMjsJLyogZmlyc3QgZnJlZSBieXRlIG9mIGxhc3QgYmxvY2sgKi8KLSAgKmNwKysgPSAoY2hhcikgcmZvOwkJCS8qIFJNUyByZWNvcmQgZm9ybWF0ICovCi0gIC8qIEZpbGVuYW1lLiAgKi8KLSAgKmNwKysgPSAoY2hhcikgbGVuOwotICB3aGlsZSAoLS1sZW4gPj0gMCkKLSAgICAqY3ArKyA9ICpGaWxlbmFtZSsrOwotICAvKiBMaWJyYXJ5IG1vZHVsZSBuYW1lIChub25lKS4gICovCi0gICpjcCsrID0gMDsKLSAgLyogTm93IHRoYXQgc2l6ZSBpcyBrbm93biwgZmlsbCBpdCBpbiBhbmQgd3JpdGUgb3V0IHRoZSByZWNvcmQuICAqLwotICBMb2NhbFs0XSA9IGNwIC0gJkxvY2FsWzVdOwkJLyogc291cmNlIGZpbGUgZGVjbGFyYXRpb24gc2l6ZSAqLyAKLSAgTG9jYWxbMF0gPSBjcCAtICZMb2NhbFsxXTsJCS8qIFRCVCByZWNvcmQgc2l6ZSAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBjcCAtIExvY2FsLCBPQkpfU19DX1RCVCk7Ci0gIHJldHVybiAxOwotfQotCi0KLS8qIFRyYWNlYmFjayBpbmZvcm1hdGlvbiBpcyBkZXNjcmliZWQgaW4gdGVybXMgb2YgbGluZXMgZnJvbSBjb21waWxlcgotICAgbGlzdGluZyBmaWxlcywgbm90IGxpbmVzIGZyb20gc291cmNlIGZpbGVzLiAgV2UgbmVlZCB0byBzZXQgdXAgdGhlCi0gICBjb3JyZWxhdGlvbiBiZXR3ZWVuIGxpc3RpbmcgbGluZSBudW1iZXJzIGFuZCBzb3VyY2UgbGluZSBudW1iZXJzLgotICAgU2luY2UgZ2NjJ3MgLnN0YWJuIGRpcmVjdGl2ZXMgcmVmZXIgdG8gdGhlIHNvdXJjZSBsaW5lcywgd2UganVzdAotICAgbmVlZCB0byBkZXNjcmliZSBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX1RCVF9Tb3VyY2VfTGluZXMgKElEX051bWJlciwgU3RhcnRpbmdfTGluZV9OdW1iZXIsIE51bWJlcl9PZl9MaW5lcykKLSAgICAgaW50IElEX051bWJlcjsKLSAgICAgaW50IFN0YXJ0aW5nX0xpbmVfTnVtYmVyOwotICAgICBpbnQgTnVtYmVyX09mX0xpbmVzOwotewotICBjaGFyICpjcDsKLSAgaW50IGNodW5rX2xpbWl0OwotICBjaGFyIExvY2FsWzEyOF07CS8qIHJvb20gZW5vdWdoIHRvIGRlc2NyaWJlIDEzMTA3MDAgbGluZXMuLi4gKi8KLQotICBjcCA9ICZMb2NhbFsxXTsJLyogUHV0IHNpemUgaW4gTG9jYWxbMF0gbGF0ZXIuICAqLwotICAqY3ArKyA9IERTVF9TX0NfU09VUkNFOwkJLyogRFNUIHR5cGUgaXMgInNvdXJjZSBmaWxlIi4gICovCi0gICpjcCsrID0gRFNUX1NfQ19TUkNfU0VURklMRTsJCS8qIFNldCBTb3VyY2UgRmlsZS4gICovCi0gIENPUFlfU0hPUlQgKGNwLCBJRF9OdW1iZXIpLCAgY3AgKz0gMjsJLyogRmlsZSBJRCBOdW1iZXIuICAqLwotICAvKiBTZXQgcmVjb3JkIG51bWJlciBhbmQgZGVmaW5lIGxpbmVzLiAgU2luY2Ugbm8gbG9uZ3dvcmQgZm9ybSBvZgotICAgICBTUkNfREVGTElORVMgaXMgYXZhaWxhYmxlLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY29wZSB3aXRoIGFueSBodWdlCi0gICAgIGZpbGVzIGEgY2h1bmsgYXQgYSB0aW1lLiAgSXQgZG9lc24ndCBtYXR0ZXIgZm9yIHRyYWNlYmFja3MsIHNpbmNlCi0gICAgIHVuc3BlY2lmaWVkIGxpbmVzIGFyZSBtYXBwZWQgb25lLXRvLW9uZSBhbmQgd29yayBvdXQgcmlnaHQsIGJ1dCBpdAotICAgICBkb2VzIG1hdHRlciB3aXRoaW4gdGhlIGRlYnVnZ2VyLiAgV2l0aG91dCB0aGlzIGV4cGxpY2l0IG1hcHBpbmcsCi0gICAgIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgbGluZXMgbm90IGV4aXN0aW5nIGluIHRoZSBtb2R1bGUuICAqLwotICBjaHVua19saW1pdCA9IChzaXplb2YgTG9jYWwgLSA1KSAvIDY7Ci0gIGlmIChOdW1iZXJfT2ZfTGluZXMgPiA2NTUzNSAqIGNodW5rX2xpbWl0KQkvKiBhdm9pZCBidWZmZXIgb3ZlcmZsb3cgKi8KLSAgICBOdW1iZXJfT2ZfTGluZXMgPSA2NTUzNSAqIGNodW5rX2xpbWl0OwotICB3aGlsZSAoTnVtYmVyX09mX0xpbmVzID4gNjU1MzUpCi0gICAgewotICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19TRVRSRUNfTDsKLSAgICAgIENPUFlfTE9ORyAoY3AsIFN0YXJ0aW5nX0xpbmVfTnVtYmVyKSwgIGNwICs9IDQ7Ci0gICAgICAqY3ArKyA9IERTVF9TX0NfU1JDX0RFRkxJTkVTX1c7Ci0gICAgICBDT1BZX1NIT1JUIChjcCwgNjU1MzUpLCAgY3AgKz0gMjsKLSAgICAgIFN0YXJ0aW5nX0xpbmVfTnVtYmVyICs9IDY1NTM1OwotICAgICAgTnVtYmVyX09mX0xpbmVzIC09IDY1NTM1OwotICAgIH0KLSAgLyogU2V0IHJlY29yZCBudW1iZXIgYW5kIGRlZmluZSBsaW5lcywgbm9ybWFsIGNhc2UuICAqLwotICBpZiAoU3RhcnRpbmdfTGluZV9OdW1iZXIgPD0gNjU1MzUpCi0gICAgewotICAgICAgKmNwKysgPSBEU1RfU19DX1NSQ19TRVRSRUNfVzsKLSAgICAgIENPUFlfU0hPUlQgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpjcCsrID0gRFNUX1NfQ19TUkNfU0VUUkVDX0w7Ci0gICAgICBDT1BZX0xPTkcgKGNwLCBTdGFydGluZ19MaW5lX051bWJlciksICBjcCArPSA0OwotICAgIH0KLSAgKmNwKysgPSBEU1RfU19DX1NSQ19ERUZMSU5FU19XOwotICBDT1BZX1NIT1JUIChjcCwgTnVtYmVyX09mX0xpbmVzKSwgIGNwICs9IDI7Ci0gIC8qIFNldCBzaXplIG5vdyB0aGF0IGJlIGtub3cgaXQsIHRoZW4gb3V0cHV0IHRoZSBkYXRhLiAgKi8KLSAgTG9jYWxbMF0gPSBjcCAtICZMb2NhbFsxXTsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgY3AgLSBMb2NhbCwgT0JKX1NfQ19UQlQpOwotfQotDAotCi0gLyoqKioqKiBEZWJ1Z2dlciBJbmZvcm1hdGlvbiBzdXBwb3J0IHJvdXRpbmVzICoqKioqKi8KLQotCi0vKiBUaGlzIHJvdXRpbmUgbG9jYXRlcyBhIGZpbGUgaW4gdGhlIGxpc3Qgb2YgZmlsZXMuICBJZiBhbiBlbnRyeSBkb2VzCi0gICBub3QgZXhpc3QsIG9uZSBpcyBjcmVhdGVkLiAgRm9yIGluY2x1ZGUgZmlsZXMsIGEgbmV3IGVudHJ5IGlzIGFsd2F5cwotICAgY3JlYXRlZCBzdWNoIHRoYXQgaW5saW5lIGZ1bmN0aW9ucyBjYW4gYmUgcHJvcGVybHkgZGVidWdnZWQuICAqLwotCi1zdGF0aWMgc3RydWN0IGlucHV0X2ZpbGUgKgotZmluZF9maWxlIChzcCkKLSAgICAgc3ltYm9sUyAqc3A7Ci17Ci0gIHN0cnVjdCBpbnB1dF9maWxlICpzYW1lX2ZpbGUgPSAwOwotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqZnBudCwgKmxhc3QgPSAwOwotICBjaGFyICpzcF9uYW1lOwotCi0gIGZvciAoZnBudCA9IGZpbGVfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKGZwbnQtPnNwbnQgPT0gc3ApCi0JcmV0dXJuIGZwbnQ7Ci0gICAgICBsYXN0ID0gZnBudDsKLSAgICB9Ci0gIHNwX25hbWUgPSBTX0dFVF9OQU1FIChzcCk7Ci0gIGZvciAoZnBudCA9IGZpbGVfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoc3BfbmFtZSwgZnBudC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBpZiAoZnBudC0+ZmxhZyA9PSAxKQotCSAgICByZXR1cm4gZnBudDsKLQkgIHNhbWVfZmlsZSA9IGZwbnQ7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBmcG50ID0gKHN0cnVjdCBpbnB1dF9maWxlICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGlucHV0X2ZpbGUpKTsKLSAgaWYgKCFmaWxlX3Jvb3QpCi0gICAgZmlsZV9yb290ID0gZnBudDsKLSAgZWxzZQotICAgIGxhc3QtPm5leHQgPSBmcG50OwotICBmcG50LT5uZXh0ID0gMDsKLSAgZnBudC0+bmFtZSA9IHNwX25hbWU7Ci0gIGZwbnQtPm1pbl9saW5lID0gMHg3ZmZmZmZmZjsKLSAgZnBudC0+bWF4X2xpbmUgPSAwOwotICBmcG50LT5vZmZzZXQgPSAwOwotICBmcG50LT5mbGFnID0gMDsKLSAgZnBudC0+ZmlsZV9udW1iZXIgPSAwOwotICBmcG50LT5zcG50ID0gc3A7Ci0gIGZwbnQtPnNhbWVfZmlsZV9mcG50ID0gc2FtZV9maWxlOwotICByZXR1cm4gZnBudDsKLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgY29udmVydHMgYSBudW1iZXIgc3RyaW5nIGludG8gYW4gaW50ZWdlciwgYW5kIHN0b3BzIHdoZW4KLSAgIGl0IHNlZXMgYW4gaW52YWxpZCBjaGFyYWN0ZXIuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZQotICAgY2hhcmFjdGVyIGp1c3QgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgcmVhZC4gIE5vIGVycm9yIGlzIGdlbmVyYXRlZC4gICovCi0KLXN0YXRpYyBjaGFyICoKLWN2dF9pbnRlZ2VyIChzdHIsIHJ0bikKLSAgICAgY2hhciAqc3RyOwotICAgICBpbnQgKnJ0bjsKLXsKLSAgaW50IGl2YWwgPSAwLCBzZ24gPSAxOwotCi0gIGlmICgqc3RyID09ICctJykKLSAgICBzZ24gPSAtMSwgICsrc3RyOwotICB3aGlsZSAoKnN0ciA+PSAnMCcgJiYgKnN0ciA8PSAnOScpCi0gICAgaXZhbCA9IDEwICogaXZhbCArICpzdHIrKyAtICcwJzsKLSAgKnJ0biA9IHNnbiAqIGl2YWw7Ci0gIHJldHVybiBzdHI7Ci19Ci0MCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhbmQgZGVmaW5pdGlvbnMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgb2JqZWN0Ci0gKiByZWNvcmRzIHRoYXQgd2lsbCBkZXNjcmliZSBwcm9ncmFtIHZhcmlhYmxlcyB0byB0aGUgVk1TIGRlYnVnZ2VyLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBtYW55IG9mIHRoZSByb3V0aW5lcyBuZWVkZWQgdG8gb3V0cHV0IGRlYnVnZ2luZyBpbmZvCi0gKiBpbnRvIHRoZSBvYmplY3QgZmlsZSB0aGF0IHRoZSBWTVMgZGVidWdnZXIgbmVlZHMgdG8gdW5kZXJzdGFuZCBzeW1ib2xzLgotICogVGhlc2Ugcm91dGluZXMgYXJlIGNhbGxlZCB2ZXJ5IGxhdGUgaW4gdGhlIGFzc2VtYmx5IHByb2Nlc3MsIGFuZCB0aHVzCi0gKiB3ZSBjYW4gYmUgZmFpcmx5IGxheCBhYm91dCBjaGFuZ2luZyB0aGluZ3MsIHNpbmNlIHRoZSBHU0QgYW5kIHRoZSBUSVIKLSAqIHNlY3Rpb25zIGhhdmUgYWxyZWFkeSBiZWVuIG91dHB1dC4KLSAqLwotCi0KLS8qIFRoaXMgcm91dGluZSBmaXhlcyB0aGUgbmFtZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIGJ5IEMrKywgIi50aGlzIiBpcyBhIGdvb2QKLSAgIGV4YW1wbGUuICBUaGUgcGVyaW9kIGRvZXMgbm90IHdvcmsgZm9yIHRoZSBkZWJ1Z2dlciwgc2luY2UgaXQgbG9va3MgbGlrZQotICAgdGhlIHN5bnRheCBmb3IgYSBzdHJ1Y3R1cmUgZWxlbWVudCwgYW5kIHRodXMgaXQgZ2V0cyBtaWdodGlseSBjb25mdXNlZC4KLQotICAgV2UgYWxzbyB1c2UgdGhpcyB0byBzdHJpcCB0aGUgUHNlY3RBdHRyaWJ1dGUgaGFjayBmcm9tIHRoZSBuYW1lIGJlZm9yZSB3ZQotICAgd3JpdGUgYSBkZWJ1Z2dlciByZWNvcmQuICAqLwotCi1zdGF0aWMgY2hhciAqCi1maXhfbmFtZSAocG50KQotICAgICBjaGFyICpwbnQ7Ci17Ci0gIGNoYXIgKnBudDE7Ci0KLSAgLyogS2lsbCBhbnkgbGVhZGluZyAiXyIuICAqLwotICBpZiAoKnBudCA9PSAnXycpCi0gICAgcG50Kys7Ci0KLSAgLyogSXMgdGhlcmUgYSBQc2VjdCBBdHRyaWJ1dGUgdG8gc2tpcD8/ICAqLwotICBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKHBudCkpCi0gICAgewotICAgICAgLyogWWVzOiBTa2lwIGl0LiAgKi8KLSAgICAgIHBudCArPSBQU0VDVF9BVFRSSUJVVEVTX1NUUklOR19MRU5HVEg7Ci0gICAgICB3aGlsZSAoKnBudCkKLQl7Ci0JICBpZiAoKHBudFswXSA9PSAnJCcpICYmIChwbnRbMV0gPT0gJyQnKSkKLQkgICAgewotCSAgICAgIHBudCArPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBwbnQrKzsKLQl9Ci0gICAgfQotCi0gIC8qIEhlcmUgd2UgZml4IHRoZSAudGhpcyAtPiAkdGhpcyBjb252ZXJzaW9uLiAgKi8KLSAgZm9yIChwbnQxID0gcG50OyAqcG50MSAhPSAwOyBwbnQxKyspCi0gICAgaWYgKCpwbnQxID09ICcuJykKLSAgICAgICpwbnQxID0gJyQnOwotCi0gIHJldHVybiBwbnQ7Ci19Ci0KLQotLyogV2hlbiBkZWZpbmluZyBhIHN0cnVjdHVyZSwgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBmaW5kIHRoZSBuYW1lIG9mCi0gICB0aGUgYWN0dWFsIHN0cnVjdHVyZS4gIEl0IGlzIGFzc3VtZWQgdGhhdCBzdHIgcG9pbnRzIHRvIHRoZSBlcXVhbCBzaWduCi0gICBpbiB0aGUgZGVmaW5pdGlvbiwgYW5kIGl0IG1vdmVzIGJhY2t3YXJkIHVudGlsIGl0IGZpbmRzIHRoZSBzdGFydCBvZiB0aGUKLSAgIG5hbWUuICBJZiBpdCBmaW5kcyBhIDAsIHRoZW4gaXQga25vd3MgdGhhdCB0aGlzIHN0cnVjdHVyZSBkZWYgaXMgaW4gdGhlCi0gICBvdXRlcm1vc3QgbGV2ZWwsIGFuZCB0aHVzIHN5bWJvbF9uYW1lIHBvaW50cyB0byB0aGUgc3ltYm9sIG5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1nZXRfc3RydWN0X25hbWUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpwbnQ7Ci0gIHBudCA9IHN0cjsKLSAgd2hpbGUgKCgqcG50ICE9ICc6JykgJiYgKCpwbnQgIT0gJ1wwJykpCi0gICAgcG50LS07Ci0gIGlmICgqcG50ID09ICdcMCcpCi0gICAgcmV0dXJuIChjaGFyICopIHN5bWJvbF9uYW1lOwotICAqcG50LS0gPSAnXDAnOwotICB3aGlsZSAoKCpwbnQgIT0gJzsnKSAmJiAoKnBudCAhPSAnPScpKQotICAgIHBudC0tOwotICBpZiAoKnBudCA9PSAnOycpCi0gICAgcmV0dXJuIHBudCArIDE7Ci0gIHdoaWxlICgoKnBudCA8ICcwJykgfHwgKCpwbnQgPiAnOScpKQotICAgIHBudCsrOwotICB3aGlsZSAoKCpwbnQgPj0gJzAnKSAmJiAoKnBudCA8PSAnOScpKQotICAgIHBudCsrOwotICByZXR1cm4gcG50OwotfQotCi0KLS8qIFNlYXJjaCBzeW1ib2wgbGlzdCBmb3IgdHlwZSBudW1iZXIgZGJ4X3R5cGUuCi0gICBSZXR1cm4gYSBwb2ludGVyIHRvIHN0cnVjdC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKgotZmluZF9zeW1ib2wgKGRieF90eXBlKQotICAgICBpbnQgZGJ4X3R5cGU7Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLQotICBzcG50ID0gVk1TX1N5bWJvbF90eXBlX2xpc3RbU1lNVFlQX0hBU0ggKGRieF90eXBlKV07Ci0gIHdoaWxlIChzcG50KQotICAgIHsKLSAgICAgIGlmIChzcG50LT5kYnhfdHlwZSA9PSBkYnhfdHlwZSkKLQlicmVhazsKLSAgICAgIHNwbnQgPSBzcG50LT5uZXh0OwotICAgIH0KLSAgaWYgKCFzcG50IHx8IHNwbnQtPmFkdmFuY2VkICE9IEFMSUFTKQotICAgIHJldHVybiBzcG50OwotICByZXR1cm4gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLX0KLQotCi0jaWYgMAkJLyogb2Jzb2xldGUgKi8KLS8qIHRoaXMgcm91dGluZSBwdXRzIGluZm8gaW50byBlaXRoZXIgTG9jYWwgb3IgQXN1ZmZpeCwgZGVwZW5kaW5nIG9uIHRoZSBzaWduCi0gKiBvZiBzaXplLiAgVGhlIHJlYXNvbiBpcyB0aGF0IGl0IGlzIGVhc2llciB0byBidWlsZCB0aGUgdmFyaWFibGUgZGVzY3JpcHRvcgotICogYmFja3dhcmRzLCB3aGlsZSB0aGUgYXJyYXkgZGVzY3JpcHRvciBpcyBiZXN0IGJ1aWx0IGZvcndhcmRzLiAgSW4gdGhlIGVuZAotICogdGhleSBnZXQgcHV0IHRvZ2V0aGVyLCBpZiB0aGVyZSBpcyBub3QgYSBzdHJ1Y3QvdW5pb24vZW51bSBhbG9uZyB0aGUgd2F5Ci0gKi8KLXN0YXRpYyB2b2lkCi1wdXNoICh2YWx1ZSwgc2l6ZTEpCi0gICAgIGludCB2YWx1ZSwgc2l6ZTE7Ci17Ci0gIGlmIChzaXplMSA8IDApCi0gICAgewotICAgICAgc2l6ZTEgPSAtc2l6ZTE7Ci0gICAgICBpZiAoTHBudCA8IHNpemUxKQotCXsKLQkgIG92ZXJmbG93ID0gMTsKLQkgIExwbnQgPSAxOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIExwbnQgLT0gc2l6ZTE7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZMb2NhbFtMcG50ICsgMV0sIHZhbHVlLCBzaXplMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKEFwb2ludCArIHNpemUxID49IE1BWF9ERUJVR19SRUNPUkQpCi0JewotCSAgb3ZlcmZsb3cgPSAxOwotCSAgQXBvaW50ID0gTUFYX0RFQlVHX1JFQ09SRCAtIDE7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgmQXN1ZmZpeFtBcG9pbnRdLCB2YWx1ZSwgc2l6ZTEpOwotICAgICAgQXBvaW50ICs9IHNpemUxOwotICAgIH0KLX0KLSNlbmRpZgotCi0KLXN0YXRpYyB2b2lkCi1mcHVzaCAodmFsdWUsIHNpemUpCi0gICAgIGludCB2YWx1ZSwgc2l6ZTsKLXsKLSAgaWYgKEFwb2ludCArIHNpemUgPj0gTUFYX0RFQlVHX1JFQ09SRCkKLSAgICB7Ci0gICAgICBvdmVyZmxvdyA9IDE7Ci0gICAgICBBcG9pbnQgPSBNQVhfREVCVUdfUkVDT1JEIC0gMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChzaXplID09IDEpCi0gICAgQXN1ZmZpeFtBcG9pbnQrK10gPSAoY2hhcikgdmFsdWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKCZBc3VmZml4W0Fwb2ludF0sIHZhbHVlLCBzaXplKTsKLSAgICAgIEFwb2ludCArPSBzaXplOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXJwdXNoICh2YWx1ZSwgc2l6ZSkKLSAgICAgaW50IHZhbHVlLCBzaXplOwotewotICBpZiAoTHBudCA8IHNpemUpCi0gICAgewotICAgICAgb3ZlcmZsb3cgPSAxOwotICAgICAgTHBudCA9IDE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc2l6ZSA9PSAxKQotICAgICAgTG9jYWxbTHBudC0tXSA9IChjaGFyKSB2YWx1ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIExwbnQgLT0gc2l6ZTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoJkxvY2FsW0xwbnQgKyAxXSwgdmFsdWUsIHNpemUpOwotICAgIH0KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIHRoZSBhcnJheSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIGFycmF5LiAgKi8KLQotc3RhdGljIHZvaWQKLWFycmF5X3N1ZmZpeCAoc3BudDIpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDI7Ci17Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKLSAgaW50IHJhbms7Ci0gIGludCB0b3RhbF9zaXplOwotCi0gIHJhbmsgPSAwOwotICBzcG50ID0gc3BudDI7Ci0gIHdoaWxlIChzcG50LT5hZHZhbmNlZCAhPSBBUlJBWSkKLSAgICB7Ci0gICAgICBzcG50ID0gZmluZF9zeW1ib2wgKHNwbnQtPnR5cGUyKTsKLSAgICAgIGlmICghc3BudCkKLQlyZXR1cm47Ci0gICAgfQotICBzcG50MSA9IHNwbnQ7Ci0gIHRvdGFsX3NpemUgPSAxOwotICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQotICAgIHsKLSAgICAgIHJhbmsrKzsKLSAgICAgIHRvdGFsX3NpemUgKj0gKHNwbnQxLT5pbmRleF9tYXggLSBzcG50MS0+aW5kZXhfbWluICsgMSk7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotICAgIH0KLSAgdG90YWxfc2l6ZSA9IHRvdGFsX3NpemUgKiBzcG50MS0+ZGF0YV9zaXplOwotICBmcHVzaCAoc3BudDEtPmRhdGFfc2l6ZSwgMik7CS8qIGVsZW1lbnQgc2l6ZSAqLwotICBpZiAoc3BudDEtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKLSAgICBmcHVzaCAoMCwgMSk7Ci0gIGVsc2UKLSAgICBmcHVzaCAoc3BudDEtPlZNU190eXBlLCAxKTsJLyogZWxlbWVudCB0eXBlICovCi0gIGZwdXNoIChEU0NfS19DTEFTU19BLCAxKTsJLyogZGVzY3JpcHRvciBjbGFzcyAqLwotICBmcHVzaCAoMCwgNCk7CQkJLyogYmFzZSBhZGRyZXNzICovCi0gIGZwdXNoICgwLCAxKTsJCQkvKiBzY2FsZSBmYWN0b3IgLS0gbm90IGFwcGxpY2FibGUgKi8KLSAgZnB1c2ggKDAsIDEpOwkJCS8qIGRpZ2l0IGNvdW50IC0tIG5vdCBhcHBsaWNhYmxlICovCi0gIGZwdXNoICgweGMwLCAxKTsJCS8qIGZsYWdzOiBtdWx0aXBsaWVyIGJsb2NrICYgYm91bmRzIHByZXNlbnQgKi8KLSAgZnB1c2ggKHJhbmssIDEpOwkJLyogbnVtYmVyIG9mIGRpbWVuc2lvbnMgKi8KLSAgZnB1c2ggKHRvdGFsX3NpemUsIDQpOwotICBmcHVzaCAoMCwgNCk7CQkJLyogcG9pbnRlciB0byBlbGVtZW50IFswXVswXS4uLlswXSAqLwotICBzcG50MSA9IHNwbnQ7Ci0gIHdoaWxlIChzcG50MS0+YWR2YW5jZWQgPT0gQVJSQVkpCi0gICAgewotICAgICAgZnB1c2ggKHNwbnQxLT5pbmRleF9tYXggLSBzcG50MS0+aW5kZXhfbWluICsgMSwgNCk7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotICAgIH0KLSAgc3BudDEgPSBzcG50OwotICB3aGlsZSAoc3BudDEtPmFkdmFuY2VkID09IEFSUkFZKQotICAgIHsKLSAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWluLCA0KTsKLSAgICAgIGZwdXNoIChzcG50MS0+aW5kZXhfbWF4LCA0KTsKLSAgICAgIHNwbnQxID0gZmluZF9zeW1ib2wgKHNwbnQxLT50eXBlMik7Ci0gICAgfQotfQotCi0KLS8qIFRoaXMgcm91dGluZSBnZW5lcmF0ZXMgdGhlIHN0YXJ0IG9mIGEgdmFyaWFibGUgZGVzY3JpcHRvciBiYXNlZCB1cG9uCi0gICBhIHN0cnVjdC91bmlvbi9lbnVtIHRoYXQgaGFzIHlldCB0byBiZSBkZWZpbmVkLiAgV2UgZGVmaW5lIHRoaXMgc3BvdCBhcwotICAgYSBuZXcgbG9jYXRpb24sIGFuZCBzYXZlIGZvdXIgYnl0ZXMgZm9yIHRoZSBhZGRyZXNzLiAgV2hlbiB0aGUgc3RydWN0IGlzCi0gICBmaW5hbGx5IGRlZmluZWQsIHRoZW4gd2UgY2FuIGdvIGJhY2sgYW5kIHBsdWcgaW4gdGhlIGNvcnJlY3QgYWRkcmVzcy4gICovCi0KLXN0YXRpYyB2b2lkCi1uZXdfZm9yd2FyZF9yZWYgKGRieF90eXBlKQotICAgICBpbnQgZGJ4X3R5cGU7Ci17Ci0gIHN0cnVjdCBmb3J3YXJkX3JlZiAqZnBudDsKLSAgZnBudCA9IChzdHJ1Y3QgZm9yd2FyZF9yZWYgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZm9yd2FyZF9yZWYpKTsKLSAgZnBudC0+bmV4dCA9IGZfcmVmX3Jvb3Q7Ci0gIGZfcmVmX3Jvb3QgPSBmcG50OwotICBmcG50LT5kYnhfdHlwZSA9IGRieF90eXBlOwotICBmcG50LT5zdHJ1Y19udW1iID0gKytzdHJ1Y3R1cmVfY291bnQ7Ci0gIGZwbnQtPnJlc29sdmVkID0gJ04nOwotICBycHVzaCAoRFNUX0tfVFNfSU5ELCAxKTsJLyogaW5kaXJlY3QgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0gIHRvdGFsX2xlbiA9IDU7Ci0gIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICBzdHJ1Y3RfbnVtYmVyID0gLWZwbnQtPnN0cnVjX251bWI7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIGdlbmVyYXRlcyB0aGUgdmFyaWFibGUgZGVzY3JpcHRvciB1c2VkIHRvIGRlc2NyaWJlIG5vbi1iYXNpYwotICAgdmFyaWFibGVzLiAgSXQgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IHVudGlsIGl0IGdldHMgdG8gdGhlIGJvdHRvbSBvZiBpdAotICAgYWxsLCBhbmQgdGhlbiBidWlsZHMgdGhlIGRlc2NyaXB0b3IgYmFja3dhcmRzLiAgSXQgaXMgZWFzaWVzdCB0byBkbyBpdAotICAgdGhpcyB3YXkgc2luY2Ugd2UgbXVzdCBwZXJpb2RpY2FsbHkgd3JpdGUgbGVuZ3RoIGJ5dGVzLCBhbmQgaXQgaXMgZWFzaWVzdAotICAgaWYgd2Uga25vdyB0aGUgdmFsdWUgd2hlbiBpdCBpcyB0aW1lIHRvIHdyaXRlIGl0LiAgKi8KLQotc3RhdGljIGludAotZ2VuMSAoc3BudCwgYXJyYXlfc3VmZml4X2xlbikKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICAgICBpbnQgYXJyYXlfc3VmZml4X2xlbjsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MTsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoIChzcG50LT5hZHZhbmNlZCkKLSAgICB7Ci0gICAgY2FzZSBWT0lEOgotICAgICAgcnB1c2ggKERCR19TX0NfVk9JRCwgMSk7Ci0gICAgICB0b3RhbF9sZW4gKz0gMTsKLSAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBCQVNJQzoKLSAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgaWYgKGFycmF5X3N1ZmZpeF9sZW4gPT0gMCkKLQl7Ci0JICBycHVzaCAoc3BudC0+Vk1TX3R5cGUsIDEpOwotCSAgcnB1c2ggKERCR19TX0NfQkFTSUMsIDEpOwotCSAgdG90YWxfbGVuID0gMjsKLQkgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgcnB1c2ggKDAsIDQpOwotICAgICAgcnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwotICAgICAgcnB1c2ggKERTVF9LX1RTX0RTQywgMSk7CS8qIGRlc2NyaXB0b3IgdHlwZSBzcGVjaWZpY2F0aW9uICovCi0gICAgICB0b3RhbF9sZW4gPSAtMjsKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgU1RSVUNUOgotICAgIGNhc2UgVU5JT046Ci0gICAgY2FzZSBFTlVNOgotICAgICAgc3RydWN0X251bWJlciA9IHNwbnQtPnN0cnVjX251bWI7Ci0gICAgICBpZiAoc3RydWN0X251bWJlciA8IDApCi0JewotCSAgbmV3X2ZvcndhcmRfcmVmIChzcG50LT5kYnhfdHlwZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBycHVzaCAoREJHX1NfQ19TVFJVQ1QsIDEpOwotICAgICAgdG90YWxfbGVuID0gNTsKLSAgICAgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBQT0lOVEVSOgotICAgICAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOwotICAgICAgaSA9IDE7Ci0gICAgICBpZiAoIXNwbnQxKQotCW5ld19mb3J3YXJkX3JlZiAoc3BudC0+dHlwZTIpOwotICAgICAgZWxzZQotCWkgPSBnZW4xIChzcG50MSwgMCk7Ci0gICAgICBpZiAoaSkKLQl7CS8qICgqdm9pZCkgaXMgYSBzcGVjaWFsIGNhc2UsIGRvIG5vdCBwdXQgcG9pbnRlciBzdWZmaXggKi8KLQkgIHJwdXNoIChEQkdfU19DX1BPSU5URVIsIDEpOwotCSAgdG90YWxfbGVuICs9IDM7Ci0JICBycHVzaCAodG90YWxfbGVuLCAyKTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIEFSUkFZOgotICAgICAgc3BudDEgPSBzcG50OwotICAgICAgd2hpbGUgKHNwbnQxLT5hZHZhbmNlZCA9PSBBUlJBWSkKLQl7Ci0JICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50MS0+dHlwZTIpOwotCSAgaWYgKCFzcG50MSkKLQkgICAgewotCSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgZm9yd2FyZCByZWZlcmVuY2UgZXJyb3IsIGRieCB0eXBlICVkIiksCi0JCQkgc3BudC0+dHlwZTIpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotLyogSXQgaXMgdG9vIGxhdGUgdG8gZ2VuZXJhdGUgZm9yd2FyZCByZWZlcmVuY2VzLCBzbyB0aGUgdXNlciBnZXRzIGEgbWVzc2FnZS4KLSAqIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uIGEgY29tcGlsZXIgZXJyb3IgKi8KLSAgICAgICh2b2lkKSBnZW4xIChzcG50MSwgMSk7Ci0gICAgICBpID0gQXBvaW50OwotICAgICAgYXJyYXlfc3VmZml4IChzcG50KTsKLSAgICAgIGFycmF5X3N1ZmZpeF9sZW4gPSBBcG9pbnQgLSBpOwotICAgICAgc3dpdGNoIChzcG50MS0+YWR2YW5jZWQpCi0JewotCWNhc2UgQkFTSUM6Ci0JY2FzZSBGVU5DVElPTjoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBycHVzaCAoMCwgMik7Ci0JICB0b3RhbF9sZW4gKz0gMjsKLQkgIHJwdXNoICh0b3RhbF9sZW4sIDIpOwotCSAgcnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwotCSAgcnB1c2ggKDEsIDEpOwkJLyogZmxhZ3M6IGVsZW1lbnQgdmFsdWUgc3BlYyBpbmNsdWRlZCAqLwotCSAgcnB1c2ggKDEsIDEpOwkJLyogb25lIGRpbWVuc2lvbiAqLwotCSAgcnB1c2ggKERCR19TX0NfQ09NUExFWF9BUlJBWSwgMSk7Ci0JfQotICAgICAgdG90YWxfbGVuICs9IGFycmF5X3N1ZmZpeF9sZW4gKyA4OwotICAgICAgcnB1c2ggKHRvdGFsX2xlbiwgMik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgkvKiBsaW50IHN1cHByZXNzaW9uICovCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoaXMgZ2VuZXJhdGVzIGEgc3VmZml4IGZvciBhIHZhcmlhYmxlLiAgSWYgaXQgaXMgbm90IGEgZGVmaW5lZCB0eXBlIHlldCwKLSAgIHRoZW4gZGJ4X3R5cGUgY29udGFpbnMgdGhlIHR5cGUgd2UgYXJlIGV4cGVjdGluZyBzbyB3ZSBjYW4gZ2VuZXJhdGUgYQotICAgZm9yd2FyZCByZWZlcmVuY2UuICBUaGlzIGNhbGxzIGdlbjEgdG8gYnVpbGQgbW9zdCBvZiB0aGUgZGVzY3JpcHRvciwgYW5kCi0gICB0aGVuIGl0IHB1dHMgdGhlIGljaW5nIG9uIGF0IHRoZSBlbmQuICBJdCB0aGVuIGR1bXBzIHdoYXRldmVyIGlzIG5lZWRlZAotICAgdG8gZ2V0IGEgY29tcGxldGUgZGVzY3JpcHRvciAoaS5lLiBzdHJ1Y3QgcmVmZXJlbmNlLCBhcnJheSBzdWZmaXgpLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX3N1ZmZpeCAoc3BudCwgZGJ4X3R5cGUpCi0gICAgIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgICAgaW50IGRieF90eXBlOwotewotICBzdGF0aWMgY29uc3QgY2hhciBwdm9pZFs2XSA9IHsKLQkJNSwJCS8qIHJlY29yZC5sZW5ndGggPT0gNSAqLwotCQlEU1RfS19UWVBTUEVDLAkvKiByZWNvcmQudHlwZSA9PSAxICh0eXBlIHNwZWNpZmljYXRpb24pICovCi0JCTAsCQkvKiBuYW1lLmxlbmd0aCA9PSAwLCBubyBuYW1lIGZvbGxvd3MgKi8KLQkJMSwgMCwJCS8qIHR5cGUubGVuZ3RoID09IDEgezIgYnl0ZXMsIGxpdHRsZSBlbmRpYW59ICovCi0JCURCR19TX0NfVk9JRAkvKiB0eXBlLnR5cGUgPT0gNSAocG9pbnRlciB0byB1bnNwZWNpZmllZCkgKi8KLSAgfTsKLSAgaW50IGk7Ci0KLSAgQXBvaW50ID0gMDsKLSAgTHBudCA9IE1BWF9ERUJVR19SRUNPUkQgLSAxOwotICB0b3RhbF9sZW4gPSAwOwotICBzdHJ1Y3RfbnVtYmVyID0gMDsKLSAgb3ZlcmZsb3cgPSAwOwotICBpZiAoIXNwbnQpCi0gICAgbmV3X2ZvcndhcmRfcmVmIChkYnhfdHlwZSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoc3BudC0+Vk1TX3R5cGUgIT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQotCXJldHVybjsJCS8qIG5vIHN1ZmZpeCBuZWVkZWQgKi8KLSAgICAgIGdlbjEgKHNwbnQsIDApOwotICAgIH0KLSAgcnB1c2ggKDAsIDEpOwkJLyogbm8gbmFtZSAobGVuPT0wKSAqLwotICBycHVzaCAoRFNUX0tfVFlQU1BFQywgMSk7Ci0gIHRvdGFsX2xlbiArPSA0OwotICBycHVzaCAodG90YWxfbGVuLCAxKTsKLSAgLyogSWYgdGhlIHZhcmlhYmxlIGRlc2NyaXB0b3Igb3ZlcmZsb3dzIHRoZSByZWNvcmQsIG91dHB1dCBhIGRlc2NyaXB0b3IKLSAgICAgZm9yIGEgcG9pbnRlciB0byB2b2lkLiAgKi8KLSAgaWYgKCh0b3RhbF9sZW4gPj0gTUFYX0RFQlVHX1JFQ09SRCkgfHwgb3ZlcmZsb3cpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiVmFyaWFibGUgZGVzY3JpcHRvciAlZCB0b28gY29tcGxpY2F0ZWQuICBEZWZpbmVkIGFzIGB2b2lkIConLiIpLAotCQlzcG50LT5kYnhfdHlwZSk7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKHB2b2lkLCA2LCBPQkpfU19DX0RCRyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpID0gMDsKLSAgd2hpbGUgKExwbnQgPCBNQVhfREVCVUdfUkVDT1JEIC0gMSkKLSAgICBMb2NhbFtpKytdID0gTG9jYWxbKytMcG50XTsKLSAgTHBudCA9IGk7Ci0gIC8qIHdlIHVzZSB0aGlzIGZvciByZWZlcmVuY2UgdG8gc3RydWN0dXJlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkICovCi0gIGlmIChzdHJ1Y3RfbnVtYmVyID4gMCkKLSAgICB7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICAgIFZNU19TdG9yZV9TdHJ1Y3QgKHN0cnVjdF9udW1iZXIpOwotICAgIH0KLSAgLyogV2UgdXNlIHRoaXMgZm9yIGEgZm9yd2FyZCByZWZlcmVuY2UgdG8gYSBzdHJ1Y3R1cmUgdGhhdCBoYXMgeWV0IHRvCi0gICAgIGJlIGRlZmluZWQuICBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIHplcm8gdG8gbWFrZSByb29tIGZvciB0aGUgYWN0dWFsCi0gICAgIGFkZHJlc3Mgb25jZSBpdCBpcyBrbm93bi4gICovCi0gIGlmIChzdHJ1Y3RfbnVtYmVyIDwgMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3RfbnVtYmVyID0gLXN0cnVjdF9udW1iZXI7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICAgIFZNU19EZWZfU3RydWN0IChzdHJ1Y3RfbnVtYmVyKTsKLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW0xwbnRdLCAwTCk7Ci0gICAgICBMcG50ICs9IDQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gICAgICBMcG50ID0gMDsKLSAgICB9Ci0gIGkgPSAwOwotICB3aGlsZSAoaSA8IEFwb2ludCkKLSAgICBMb2NhbFtMcG50KytdID0gQXN1ZmZpeFtpKytdOwotICBpZiAoTHBudCAhPSAwKQotICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsIExwbnQsIE9CSl9TX0NfREJHKTsKLSAgTHBudCA9IDA7Ci19Ci0KLQotCS8qICJub3ZlbCBsZW5ndGgiIHR5cGUgZG9lc24ndCB3b3JrIGZvciBzaW1wbGUgYXRvbWljIHR5cGVzICovCi0jZGVmaW5lIFVTRV9CSVRTVFJJTkdfREVTQ1JJUFRPUih0KSAoKHQpLT5hZHZhbmNlZCA9PSBCQVNJQykKLSN1bmRlZiBTRVRVUF9CQVNJQ19UWVBFUwotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIGEgdHlwZSBkZXNjcmlwdGlvbiBmb3IgYSBiaXRmaWVsZC4gICovCi0KLXN0YXRpYyB2b2lkCi1iaXRmaWVsZF9zdWZmaXggKHNwbnQsIHdpZHRoKQotICAgICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gICAgIGludCB3aWR0aDsKLXsKLSAgTG9jYWxbTHBudCsrXSA9IDEzOwkJCS8qIHJlYy5sZW49PTEzICovCi0gIExvY2FsW0xwbnQrK10gPSBEU1RfS19UWVBTUEVDOwkvKiBhIHR5cGUgc3BlY2lmaWNhdGlvbiByZWNvcmQgKi8KLSAgTG9jYWxbTHBudCsrXSA9IDA7CQkJLyogbm90IG5hbWVkICovCi0gIENPUFlfU0hPUlQgKCZMb2NhbFtMcG50XSwgOSk7CQkvKiB0eXAubGVuPT05ICovCi0gIExwbnQgKz0gMjsKLSAgTG9jYWxbTHBudCsrXSA9IERTVF9LX1RTX05PVl9MRU5HOwkvKiBUaGlzIHR5cGUgaXMgYSAibm92ZWwgbGVuZ3RoIgotCQkJCQkgICBpbmNhcm5hdGlvbiBvZiBzb21lIG90aGVyIHR5cGUuICAqLwotICBDT1BZX0xPTkcgKCZMb2NhbFtMcG50XSwgd2lkdGgpOwkvKiBzaXplIGluIGJpdHMgPT0gbm92ZWwgbGVuZ3RoICovCi0gIExwbnQgKz0gNDsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgTHBudCwgT0JKX1NfQ19EQkcpOwotICBMcG50ID0gMDsKLSAgLyogYXNzZXJ0KCBzcG50LT5zdHJ1Y19udW1iID4gMCApOyAqLwotICBWTVNfU3RvcmVfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsJLyogb3V0cHV0IDQgbW9yZSBieXRlcyAqLwotfQotCi0KLS8qIEZvcm1hbGx5IGRlZmluZSBhIGJ1aWx0aW4gdHlwZSwgc28gdGhhdCBpdCBjYW4gc2VydmUgYXMgdGhlIHRhcmdldCBvZgotICAgYW4gaW5kaXJlY3QgcmVmZXJlbmNlLiAgSXQgbWFrZXMgYml0ZmllbGRfc3VmZml4KCkgZWFzaWVyIGJ5IGF2b2lkaW5nCi0gICB0aGUgbmVlZCB0byB1c2UgYSBmb3J3YXJkIHJlZmVyZW5jZSBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgZWFjaAotICAgdHlwZSB1c2VkIGluIGEgYml0ZmllbGQuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0dXBfYmFzaWNfdHlwZSAoc3BudCkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotewotI2lmZGVmIFNFVFVQX0JBU0lDX1RZUEVTCi0gIC8qIFRoaXMgd291bGQgYmUgdmVyeSB1c2VmdWwgaWYgIm5vdmVsIGxlbmd0aCIgZmllbGRzIGFjdHVhbGx5IHdvcmtlZAotICAgICB3aXRoIGJhc2ljIHR5cGVzIGxpa2UgdGhleSBkbyB3aXRoIGVudW1lcmF0ZWQgdHlwZXMuICBIb3dldmVyLAotICAgICB0aGV5IGRvIG5vdCwgc28gdGhpcyBpc24ndCB3b3J0aCBkb2luZyBqdXN0IHNvIHRoYXQgeW91IGNhbiB1c2UKLSAgICAgRVhBTUlORS9UWVBFPShfX2xvbmdfbG9uZ19pbnQpIGluc3RlYWQgb2YgRVhBTUlORS9RVUFELiAgKi8KLSAgY2hhciAqcDsKLSNpZm5kZWYgU0VUVVBfU1lOT05ZTV9UWVBFUwotICAvKiBUaGlzIGRldGVybWluZXMgd2hldGhlciBjb21wYXRpYmxlIHRoaW5ncyBsaWtlIGBpbnQnIGFuZCBgbG9uZyBpbnQnCi0gICAgIG91Z2h0IHRvIGhhdmUgZGlzdGluY3QgdHlwZSByZWNvcmRzIHJhdGhlciB0aGFuIHNoYXJpbmcgb25lLiAgKi8KLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50MjsKLQotICAvKiBmaXJzdCBjaGVjayB3aGV0aGVyIHRoaXMgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHNlZW4gYnkgYW5vdGhlciBuYW1lICovCi0gIGZvciAoc3BudDIgPSBWTVNfU3ltYm9sX3R5cGVfbGlzdFtTWU1UWVBfSEFTSCAoc3BudC0+Vk1TX3R5cGUpXTsKLSAgICAgICBzcG50MjsKLSAgICAgICBzcG50MiA9IHNwbnQyLT5uZXh0KQotICAgIGlmIChzcG50MiAhPSBzcG50ICYmIHNwbnQyLT5WTVNfdHlwZSA9PSBzcG50LT5WTVNfdHlwZSkKLSAgICAgIHsKLQlzcG50LT5zdHJ1Y19udW1iID0gc3BudDItPnN0cnVjX251bWI7Ci0JcmV0dXJuOwotICAgICAgfQotI2VuZGlmCi0KLSAgLyogYHN0cnVjdHVyZSBudW1iZXInIGRvZXNuJ3QgcmVhbGx5IG1lYW4gYHN0cnVjdHVyZSc7IGl0IG1lYW5zIGFuIGluZGV4Ci0gICAgIGludG8gYSBsaW5rZXIgbWFpbnRhaW5lZCBzZXQgb2Ygc2F2ZWQgbG9jYXRpb25zIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkCi0gICAgIGFnYWluIGxhdGVyLiAgKi8KLSAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7CS8qIHJlbWVtYmVyIHdoZXJlIHRoaXMgdHlwZSBsaXZlcyAqLwotICAvKiBkZWZpbmUgdGhlIHNpbXBsZSBzY2FsYXIgdHlwZSAqLwotICBMb2NhbFtMcG50KytdID0gNiArIHN0cmxlbiAoc3ltYm9sX25hbWUpICsgMjsJLyogcmVjLmxlbiAqLwotICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFlQU1BFQzsJLyogcmVjLnR5cD09dHlwZSBzcGVjaWZpY2F0aW9uICovCi0gIExvY2FsW0xwbnQrK10gPSBzdHJsZW4gKHN5bWJvbF9uYW1lKSArIDI7Ci0gIExvY2FsW0xwbnQrK10gPSAnXyc7CQkJLyogcHJlZml4IG5hbWUgd2l0aCAiX18iICovCi0gIExvY2FsW0xwbnQrK10gPSAnXyc7Ci0gIGZvciAocCA9IHN5bWJvbF9uYW1lOyAqcDsgcCsrKQotICAgIExvY2FsW0xwbnQrK10gPSAqcCA9PSAnICcgPyAnXycgOiAqcDsKLSAgQ09QWV9TSE9SVCAoJkxvY2FsW0xwbnRdLCAyKTsJCS8qIHR5cC5sZW49PTIgKi8KLSAgTHBudCArPSAyOwotICBMb2NhbFtMcG50KytdID0gRFNUX0tfVFNfQVRPTTsJLyogdHlwLmtpbmQgaXMgc2ltcGxlIHR5cGUgKi8KLSAgTG9jYWxbTHBudCsrXSA9IHNwbnQtPlZNU190eXBlOwkvKiB0eXAudHlwZSAqLwotICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBMcG50LCBPQkpfU19DX0RCRyk7Ci0gIExwbnQgPSAwOwotI2VuZGlmCS8qIFNFVFVQX0JBU0lDX1RZUEVTICovCi0gIHJldHVybjsKLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIGEgc3ltYm9sIGRlZmluaXRpb24gZm9yIGEgQyBzeW1ib2wgZm9yIHRoZSBkZWJ1Z2dlci4KLSAgIEl0IHRha2VzIGEgcHNlY3QgYW5kIG9mZnNldCBmb3IgZ2xvYmFsIHN5bWJvbHM7IGlmIHBzZWN0IDwgMCwgdGhlbiB0aGlzIGlzCi0gICBhIGxvY2FsIHZhcmlhYmxlIGFuZCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIEZQLiAgSW4gdGhpcyBjYXNlIGl0IGNhbgotICAgYmUgZWl0aGVyIGEgdmFyaWFibGUgKE9mZnNldCA8IDApIG9yIGEgcGFyYW1ldGVyIChPZmZzZXQgPiAwKS4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfREJHX3JlY29yZCAoc3BudCwgUHNlY3QsIE9mZnNldCwgTmFtZSkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICAgICBpbnQgUHNlY3Q7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGNoYXIgKk5hbWU7Ci17Ci0gIGNoYXIgKk5hbWVfcG50OwotICBpbnQgbGVuOwotICBpbnQgaSA9IDA7Ci0KLSAgLyogaWYgdGhlcmUgYXJlIGJhZCBjaGFyYWN0ZXJzIGluIG5hbWUsIGNvbnZlcnQgdGhlbSAqLwotICBOYW1lX3BudCA9IGZpeF9uYW1lIChOYW1lKTsKLQotICBsZW4gPSBzdHJsZW4gKE5hbWVfcG50KTsKLSAgaWYgKFBzZWN0IDwgMCkKLSAgICB7CQkJCS8qIHRoaXMgaXMgYSBsb2NhbCB2YXJpYWJsZSwgcmVmZXJlbmNlZCB0byBTUCAqLwotICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0gICAgICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7Ci0gICAgICBMb2NhbFtpKytdID0gKE9mZnNldCA+IDApID8gREJHX0NfRlVOQ1RJT05fUEFSQU0gOiBEQkdfQ19MT0NBTF9TWU07Ci0gICAgICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgT2Zmc2V0KTsKLSAgICAgIGkgKz0gNDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBMb2NhbFtpKytdID0gNyArIGxlbjsKLSAgICAgIExvY2FsW2krK10gPSBzcG50LT5WTVNfdHlwZTsKLSAgICAgIExvY2FsW2krK10gPSBEU1RfS19WQUxLSU5EX0FERFI7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIFZNU19TZXRfRGF0YSAoUHNlY3QsIE9mZnNldCwgT0JKX1NfQ19EQkcsIDApOwotICAgIH0KLSAgTG9jYWxbaSsrXSA9IGxlbjsKLSAgd2hpbGUgKCpOYW1lX3BudCAhPSAnXDAnKQotICAgIExvY2FsW2krK10gPSAqTmFtZV9wbnQrKzsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICBpZiAoc3BudC0+Vk1TX3R5cGUgPT0gREJHX1NfQ19BRFZBTkNFRF9UWVBFKQotICAgIGdlbmVyYXRlX3N1ZmZpeCAoc3BudCwgMCk7Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIHBhcnNlcyB0aGUgc3RhYnMgZW50cmllcyBpbiBvcmRlciB0byBtYWtlIHRoZSBkZWZpbml0aW9uCi0gICBmb3IgdGhlIGRlYnVnZ2VyIG9mIGxvY2FsIHN5bWJvbHMgYW5kIGZ1bmN0aW9uIHBhcmFtZXRlcnMuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX2xvY2FsX3N0YWJfUGFyc2UgKHNwKQotICAgICBzeW1ib2xTICpzcDsKLXsKLSAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNoYXIgKnN0cjsKLSAgaW50IGRieF90eXBlOwotCi0gIGRieF90eXBlID0gMDsKLSAgc3RyID0gU19HRVRfTkFNRSAoc3ApOwotICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHN0ciwgJzonKTsKLSAgaWYgKCFwbnQpCi0gICAgcmV0dXJuOwkJCS8qIG5vIGNvbG9uIHByZXNlbnQgKi8KLSAgcG50MSA9IHBudCsrOwkJCS8qIHNhdmUgdGhpcyBmb3IgbGF0ZXIsIGFuZCBza2lwIGNvbG9uICovCi0gIGlmICgqcG50ID09ICdjJykKLSAgICByZXR1cm47CQkJLyogaWdub3JlIHN0YXRpYyBjb25zdGFudHMgKi8KLQotLyogdGhlcmUgaXMgb25lIGxpdHRsZSBjYXRjaCB0aGF0IHdlIG11c3QgYmUgYXdhcmUgb2YuICBTb21ldGltZXMgZnVuY3Rpb24KLSAqIHBhcmFtZXRlcnMgYXJlIG9wdGltaXplZCBpbnRvIHJlZ2lzdGVycywgYW5kIHRoZSBjb21waWxlciwgaW4gaXRzIGluZmlpdGUKLSAqIHdpc2RvbSBvdXRwdXRzIHN0YWJzIHJlY29yZHMgZm9yICpib3RoKi4gIEluIGdlbmVyYWwgd2Ugd2FudCB0byB1c2UgdGhlCi0gKiByZWdpc3RlciBpZiBpdCBpcyBwcmVzZW50LCBzbyB3ZSBtdXN0IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgc3ltYm9scyBmb3IKLSAqIHRoaXMgZnVuY3Rpb24gdG8gc2VlIGlmIHRoaXMgcGFyYW1ldGVyIGlzIGFzc2lnbmVkIHRvIGEgcmVnaXN0ZXIuCi0gKi8KLSAgewotICAgIHN5bWJvbFMgKnNwMTsKLSAgICBjaGFyICpzdHIxOwotICAgIGNoYXIgKnBudDI7Ci0KLSAgICBpZiAoKnBudCA9PSAncCcpCi0gICAgICB7Ci0JZm9yIChzcDEgPSBzeW1ib2xfbmV4dCAoc3ApOyBzcDE7IHNwMSA9IHN5bWJvbF9uZXh0IChzcDEpKQotCSAgewotCSAgICBpZiAoIVNfSVNfREVCVUcgKHNwMSkpCi0JICAgICAgY29udGludWU7Ci0JICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3AxKSA9PSBOX0ZVTikKLQkgICAgICB7Ci0JCXBudDIgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHNwMSksICc6JykgKyAxOwotCQlpZiAoKnBudDIgPT0gJ0YnIHx8ICpwbnQyID09ICdmJykKLQkJICBicmVhazsKLQkgICAgICB9Ci0JICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3AxKSAhPSBOX1JTWU0pCi0JICAgICAgY29udGludWU7Ci0JICAgIHN0cjEgPSBTX0dFVF9OQU1FIChzcDEpOwkvKiBhbmQgZ2V0IHRoZSBuYW1lICovCi0JICAgIHBudDIgPSBzdHI7Ci0JICAgIHdoaWxlICgqcG50MiAhPSAnOicpCi0JICAgICAgewotCQlpZiAoKnBudDIgIT0gKnN0cjEpCi0JCSAgYnJlYWs7Ci0JCXBudDIrKzsKLQkJc3RyMSsrOwotCSAgICAgIH0KLQkgICAgaWYgKCpzdHIxID09ICc6JyAmJiAqcG50MiA9PSAnOicpCi0JICAgICAgcmV0dXJuOwkvKiB0aGV5IGFyZSB0aGUgc2FtZSEgIGxldHMgc2tpcCB0aGlzIG9uZSAqLwotCSAgfQkJCS8qIGZvciAqLwotCXBudCsrOwkJCS8qIHNraXAgcCBpbiBjYXNlIG5vIHJlZ2lzdGVyICovCi0gICAgICB9CQkJLyogaWYgKi8KLSAgfQkJCQkvKiBwIGJsb2NrICovCi0KLSAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCwgJmRieF90eXBlKTsKLSAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7Ci0gIGlmICghc3BudCkKLSAgICByZXR1cm47CQkJLypEdW5ubyB3aGF0IHRoaXMgaXMqLwotICAqcG50MSA9ICdcMCc7Ci0gIFZNU19EQkdfcmVjb3JkIChzcG50LCAtMSwgU19HRVRfVkFMVUUgKHNwKSwgc3RyKTsKLSAgKnBudDEgPSAnOic7CQkJLyogYW5kIHJlc3RvcmUgdGhlIHN0cmluZyAqLwotICByZXR1cm47Ci19Ci0KLQotLyogVGhpcyByb3V0aW5lIHBhcnNlcyBhIHN0YWJzIGVudHJ5IHRvIGZpbmQgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkCi0gICB0byBkZWZpbmUgYSB2YXJpYWJsZS4gIEl0IGlzIHVzZWQgZm9yIGdsb2JhbCBhbmQgc3RhdGljIHZhcmlhYmxlcy4KLSAgIEJhc2ljYWxseSB3ZSBuZWVkIHRvIGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIHN5bWJvbC4gIFdpdGggb2xkZXIKLSAgIHZlcnNpb25zIG9mIHRoZSBjb21waWxlciwgY29uc3Qgc3ltYm9scyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSwgaW4KLSAgIHRoYXQgaWYgdGhleSBhcmUgZ2xvYmFsIHRoZXkgYXJlIHdyaXR0ZW4gaW50byB0aGUgdGV4dCBwc2VjdC4gIFRoZQotICAgZ2xvYmFsIHN5bWJvbCBlbnRyeSBmb3Igc3VjaCBhIGNvbnN0IGlzIGFjdHVhbGx5IHdyaXR0ZW4gYXMgYSBwcm9ncmFtCi0gICBlbnRyeSBwb2ludCAoWXVrISEpLCBzbyBpZiB3ZSBjYW5ub3QgZmluZCBhIHN5bWJvbCBpbiB0aGUgbGlzdCBvZgotICAgcHNlY3RzLCB3ZSBtdXN0IHNlYXJjaCB0aGUgZW50cnkgcG9pbnRzIGFzIHdlbGwuICBzdGF0aWMgY29uc3RzIGFyZQotICAgZXZlbiBoYXJkZXIsIHNpbmNlIHRoZXkgYXJlIG5ldmVyIGFzc2lnbmVkIGEgbWVtb3J5IGFkZHJlc3MuICBUaGUKLSAgIGNvbXBpbGVyIHBhc3NlcyBhIHN0YWIgdG8gdGVsbCB1cyB0aGUgdmFsdWUsIGJ1dCBJIGFtIG5vdCBzdXJlIHdoYXQKLSAgIHRvIGRvIHdpdGggaXQuICAqLwotCi1zdGF0aWMgdm9pZAotVk1TX3N0YWJfcGFyc2UgKHNwLCBleHBlY3RlZF90eXBlLCB0eXBlMSwgdHlwZTIsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgZXhwZWN0ZWRfdHlwZTsJLyogY2hhciAqLwotICAgICBpbnQgdHlwZTEsIHR5cGUyLCBUZXh0X1BzZWN0OwotewotICBjaGFyICpwbnQ7Ci0gIGNoYXIgKnBudDE7Ci0gIGNoYXIgKnN0cjsKLSAgc3ltYm9sUyAqc3AxOwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIHN0cnVjdCBWTVNfU3ltYm9sICp2c3A7Ci0gIGludCBkYnhfdHlwZTsKLQotICBkYnhfdHlwZSA9IDA7Ci0gIHN0ciA9IFNfR0VUX05BTUUgKHNwKTsKLSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6Jyk7Ci0gIGlmICghcG50KQotICAgIHJldHVybjsJCQkvKiBubyBjb2xvbiBwcmVzZW50ICovCi0gIHBudDEgPSBwbnQ7CQkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCi0gIHBudCsrOwotICBpZiAoKnBudCA9PSBleHBlY3RlZF90eXBlKQotICAgIHsKLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmZGJ4X3R5cGUpOwotICAgICAgc3BudCA9IGZpbmRfc3ltYm9sIChkYnhfdHlwZSk7Ci0gICAgICBpZiAoIXNwbnQpCi0JcmV0dXJuOwkJLypEdW5ubyB3aGF0IHRoaXMgaXMqLwotICAgICAgLyoKLSAgICAgICAqIE5vdyB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgc3ltYm9sIHRhYmxlIHRvIGZpbmQgdGhlIHBzZWN0IGFuZAotICAgICAgICogb2Zmc2V0IGZvciB0aGlzIHZhcmlhYmxlLgotICAgICAgICovCi0gICAgICAqcG50MSA9ICdcMCc7Ci0gICAgICB2c3AgPSBWTVNfU3ltYm9sczsKLSAgICAgIHdoaWxlICh2c3ApCi0JewotCSAgcG50ID0gU19HRVRfTkFNRSAodnNwLT5TeW1ib2wpOwotCSAgaWYgKHBudCAmJiAqcG50KysgPT0gJ18nCi0JICAgICAgLyogbWFrZSBzdXJlIG5hbWUgaXMgdGhlIHNhbWUgYW5kIHN5bWJvbCB0eXBlIG1hdGNoZXMgKi8KLQkgICAgICAmJiBzdHJjbXAgKHBudCwgc3RyKSA9PSAwCi0JICAgICAgJiYgKFNfR0VUX1JBV19UWVBFICh2c3AtPlN5bWJvbCkgPT0gdHlwZTEKLQkJICB8fCBTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IHR5cGUyKSkKLQkgICAgYnJlYWs7Ci0JICB2c3AgPSB2c3AtPk5leHQ7Ci0JfQotICAgICAgaWYgKHZzcCkKLQl7Ci0JICBWTVNfREJHX3JlY29yZCAoc3BudCwgdnNwLT5Qc2VjdF9JbmRleCwgdnNwLT5Qc2VjdF9PZmZzZXQsIHN0cik7Ci0JICAqcG50MSA9ICc6JzsJCS8qIGFuZCByZXN0b3JlIHRoZSBzdHJpbmcgKi8KLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKiBUaGUgc3ltYm9sIHdhcyBub3QgaW4gdGhlIHN5bWJvbCBsaXN0LCBidXQgaXQgbWF5IGJlIGFuCi0gICAgICAgICAiZW50cnkgcG9pbnQiIGlmIGl0IHdhcyBhIGNvbnN0YW50LiAgKi8KLSAgICAgIGZvciAoc3AxID0gc3ltYm9sX3Jvb3RQOyBzcDE7IHNwMSA9IHN5bWJvbF9uZXh0IChzcDEpKQotCXsKLQkgIC8qCi0JICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKLQkgICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwMSkgfHwgKFNfR0VUX1RZUEUgKHNwMSkgIT0gTl9URVhUKSkKLQkgICAgY29udGludWU7Ci0JICBwbnQgPSBTX0dFVF9OQU1FIChzcDEpOwotCSAgaWYgKCpwbnQgPT0gJ18nKQotCSAgICBwbnQrKzsKLQkgIGlmIChzdHJjbXAgKHBudCwgc3RyKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCFnYXZlX2NvbXBpbGVyX21lc3NhZ2UgJiYgZXhwZWN0ZWRfdHlwZSA9PSAnRycpCi0JCXsKLQkJICBjaGFyICpsb25nX2NvbnN0X21zZyA9IF8oIlwKLSoqKldhcm5pbmcgLSB0aGUgYXNzZW1ibHkgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGhhcyBwbGFjZWQgXG5cCi0gZ2xvYmFsIGNvbnN0YW50KHMpIGluIHRoZSB0ZXh0IHBzZWN0LiAgVGhlc2Ugd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIFxuXAotIG90aGVyIG1vZHVsZXMsIHNpbmNlIHRoaXMgaXMgbm90IHRoZSBjb3JyZWN0IHdheSB0byBoYW5kbGUgdGhpcy4gWW91IFxuXAotIGhhdmUgdHdvIG9wdGlvbnM6IDEpIGdldCBhIHBhdGNoZWQgY29tcGlsZXIgdGhhdCBkb2VzIG5vdCBwdXQgZ2xvYmFsIFxuXAotIGNvbnN0YW50cyBpbiB0aGUgdGV4dCBwc2VjdCwgb3IgMikgcmVtb3ZlIHRoZSAnY29uc3QnIGtleXdvcmQgZnJvbSBcblwKLSBkZWZpbml0aW9ucyBvZiBnbG9iYWwgdmFyaWFibGVzIGluIHlvdXIgc291cmNlIG1vZHVsZShzKS4gIERvbid0IHNheSBcblwKLSBJIGRpZG4ndCB3YXJuIHlvdSEgXG4iKTsKLQotCQkgIGFzX3Rza3RzayAobG9uZ19jb25zdF9tc2cpOwotCQkgIGdhdmVfY29tcGlsZXJfbWVzc2FnZSA9IDE7Ci0JCX0KLQkgICAgICBWTVNfREJHX3JlY29yZCAoc3BudCwKLQkJCSAgICAgIFRleHRfUHNlY3QsCi0JCQkgICAgICBTX0dFVF9WQUxVRSAoc3AxKSwKLQkJCSAgICAgIHN0cik7Ci0JICAgICAgKnBudDEgPSAnOic7Ci0JICAgICAgLyogZm9vbCBhc3NlbWJsZXIgdG8gbm90IG91dHB1dCB0aGlzIGFzIGEgcm91dGluZSBpbiB0aGUgVEJUICovCi0JICAgICAgcG50MSA9IFNfR0VUX05BTUUgKHNwMSk7Ci0JICAgICAgKnBudDEgPSAnTCc7Ci0JICAgICAgU19TRVRfTkFNRSAoc3AxLCBwbnQxKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotICAqcG50MSA9ICc6JzsJCQkvKiBhbmQgcmVzdG9yZSB0aGUgc3RyaW5nICovCi0gIHJldHVybjsKLX0KLQotCi0vKiBTaW1wbGVyIGludGVyZmFjZXMgaW50byBWTVNfc3RhYl9wYXJzZSgpLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19HU1lNX1BhcnNlIChzcCwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqc3A7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewkJCQkvKiBHbG9iYWwgdmFyaWFibGVzICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ0cnLCAoTl9VTkRGIHwgTl9FWFQpLCAoTl9EQVRBIHwgTl9FWFQpLCBUZXh0X1BzZWN0KTsKLX0KLQotc3RhdGljIHZvaWQKLVZNU19MQ1NZTV9QYXJzZSAoc3AsIFRleHRfUHNlY3QpCi0gICAgIHN5bWJvbFMgKnNwOwotICAgICBpbnQgVGV4dF9Qc2VjdDsKLXsJCQkJLyogU3RhdGljIHN5bWJvbHMgLSB1bmluaXRpYWxpemVkICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ1MnLCBOX0JTUywgLTEsIFRleHRfUHNlY3QpOwotfQotCi1zdGF0aWMgdm9pZAotVk1TX1NUU1lNX1BhcnNlIChzcCwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqc3A7Ci0gICAgIGludCBUZXh0X1BzZWN0OwotewkJCQkvKiBTdGF0aWMgc3ltYm9scyAtIGluaXRpYWxpemVkICovCi0gIFZNU19zdGFiX3BhcnNlIChzcCwgJ1MnLCBOX0RBVEEsIC0xLCBUZXh0X1BzZWN0KTsKLX0KLQotCi0vKiBGb3IgcmVnaXN0ZXIgc3ltYm9scywgd2UgbXVzdCBmaWd1cmUgb3V0IHdoYXQgcmFuZ2Ugb2YgYWRkcmVzc2VzCi0gICB3aXRoaW4gdGhlIHBzZWN0IGFyZSB2YWxpZC4gIFdlIHdpbGwgdXNlIHRoZSBicmFja2V0cyBpbiB0aGUgc3RhYgotICAgZGlyZWN0aXZlcyB0byBnaXZlIHVzIGd1aWRhbmNlIGFzIHRvIHRoZSBQQyByYW5nZSB0aGF0IHRoaXMgdmFyaWFibGUKLSAgIGlzIGluIHNjb3BlLiAgSSBhbSBzdGlsbCBub3QgY29tcGxldGVseSBjb21mb3J0YWJsZSB3aXRoIHRoaXMgYnV0Ci0gICBhcyBJIGxlYXJuIG1vcmUsIEkgc2VlbSB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHdoYXQgaXMgZ29pbmcgb24uCi0gICBDYXZlYXQgRW1wdG9yLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19SU1lNX1BhcnNlIChzcCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzcCwgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDsKLSAgY2hhciAqcG50OwotICBjaGFyICpwbnQxOwotICBjaGFyICpzdHI7Ci0gIGludCBkYnhfdHlwZTsKLSAgaW50IGxlbjsKLSAgaW50IGkgPSAwOwotICBpbnQgYmNudCA9IDA7Ci0gIGludCBNaW5fT2Zmc2V0ID0gLTE7CQkvKiBtaW4gUEMgb2YgdmFsaWRpdHkgKi8KLSAgaW50IE1heF9PZmZzZXQgPSAwOwkJLyogbWF4IFBDIG9mIHZhbGlkaXR5ICovCi0KLSAgZm9yIChzeW1ib2xQID0gc3A7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCURpc3BhdGNoIG9uIFNUQUIgdHlwZQotICAgICAgICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzeW1ib2xQKSkKLQl7Ci0JY2FzZSBOX0xCUkFDOgotCSAgaWYgKGJjbnQrKyA9PSAwKQotCSAgICBNaW5fT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgYnJlYWs7Ci0JY2FzZSBOX1JCUkFDOgotCSAgaWYgKC0tYmNudCA9PSAwKQotCSAgICBNYXhfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApIC0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlmICgoTWluX09mZnNldCAhPSAtMSkgJiYgKGJjbnQgPT0gMCkpCi0JYnJlYWs7Ci0gICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApID09IE5fRlVOKQotCXsKLQkgIHBudCA9IChjaGFyICopIHN0cmNociAoU19HRVRfTkFNRSAoc3ltYm9sUCksICc6JykgKyAxOwotCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBhZGRyZXNzZXMgd2VyZSBkZWZpbmVkLiAgSWYgbm90LCB0aGVuIHRoZXJlCi0gICAgIHdlcmUgbm8gYnJhY2tldHMgaW4gdGhlIGZ1bmN0aW9uLCBhbmQgd2UgbXVzdCB0cnkgdG8gc2VhcmNoIGZvcgotICAgICB0aGUgbmV4dCBmdW5jdGlvbi4gIFNpbmNlIGZ1bmN0aW9ucyBjYW4gYmUgaW4gYW55IG9yZGVyLCB3ZSBzaG91bGQKLSAgICAgc2VhcmNoIGFsbCBvZiB0aGUgc3ltYm9sIGxpc3QgdG8gZmluZCB0aGUgY29ycmVjdCBlbmRpbmcgYWRkcmVzcy4gICovCi0gIGlmIChNaW5fT2Zmc2V0ID09IC0xKQotICAgIHsKLSAgICAgIGludCBNYXhfU291cmNlX09mZnNldDsKLSAgICAgIGludCBUaGlzX09mZnNldDsKLQotICAgICAgTWluX09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0gICAgICBNYXhfU291cmNlX09mZnNldCA9IE1pbl9PZmZzZXQ7CS8qIGp1c3QgaW4gY2FzZSBubyBOX1NMSU5FcyBmb3VuZCAqLwotICAgICAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotCXN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQotCSAgewotCSAgY2FzZSBOX1RFWFQgfCBOX0VYVDoKLQkgICAgVGhpc19PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAgIGlmIChUaGlzX09mZnNldCA+IE1pbl9PZmZzZXQgJiYgVGhpc19PZmZzZXQgPCBNYXhfT2Zmc2V0KQotCSAgICAgIE1heF9PZmZzZXQgPSBUaGlzX09mZnNldDsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIE5fU0xJTkU6Ci0JICAgIFRoaXNfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgICBpZiAoVGhpc19PZmZzZXQgPiBNYXhfU291cmNlX09mZnNldCkKLQkgICAgICBNYXhfU291cmNlX09mZnNldCA9IFRoaXNfT2Zmc2V0OwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3Qgcm91dGluZSwgdGhlbiB3ZSB1c2UgdGhlIFBDIG9mIHRoZSBsYXN0IHNvdXJjZQotICAgICAgICAgbGluZSBhcyBhIG1hcmtlciBvZiB0aGUgbWF4IFBDIGZvciB3aGljaCB0aGlzIHJlZyBpcyB2YWxpZC4gICovCi0gICAgICBpZiAoTWF4X09mZnNldCA9PSAweDdmZmZmZmZmKQotCU1heF9PZmZzZXQgPSBNYXhfU291cmNlX09mZnNldDsKLSAgICB9Ci0KLSAgZGJ4X3R5cGUgPSAwOwotICBzdHIgPSBTX0dFVF9OQU1FIChzcCk7Ci0gIGlmICgocG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc6JykpID09IDApCi0gICAgcmV0dXJuOwkJCS8qIG5vIGNvbG9uIHByZXNlbnQgKi8KLSAgcG50MSA9IHBudDsJCQkvKiBzYXZlIHRoaXMgZm9yIGxhdGVyKi8KLSAgcG50Kys7Ci0gIGlmICgqcG50ICE9ICdyJykKLSAgICByZXR1cm47Ci0gIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmZGJ4X3R5cGUpOwotICBzcG50ID0gZmluZF9zeW1ib2wgKGRieF90eXBlKTsKLSAgaWYgKCFzcG50KQotICAgIHJldHVybjsJCQkvKkR1bm5vIHdoYXQgdGhpcyBpcyB5ZXQqLwotICAqcG50MSA9ICdcMCc7Ci0gIHBudCA9IGZpeF9uYW1lIChTX0dFVF9OQU1FIChzcCkpOwkvKiBpZiB0aGVyZSBhcmUgYmFkIGNoYXJhY3RlcnMgaW4gbmFtZSwgY29udmVydCB0aGVtICovCi0gIGxlbiA9IHN0cmxlbiAocG50KTsKLSAgTG9jYWxbaSsrXSA9IDI1ICsgbGVuOwotICBMb2NhbFtpKytdID0gc3BudC0+Vk1TX3R5cGU7Ci0gIExvY2FsW2krK10gPSBEU1RfS19WRkxBR1NfVFZTOwkvKiB0cmFpbGluZyB2YWx1ZSBzcGVjaWZpZWQgKi8KLSAgQ09QWV9MT05HICgmTG9jYWxbaV0sIDEgKyBsZW4pOwkvKiByZWxhdGl2ZSBvZmZzZXQsIGJleW9uZCBuYW1lICovCi0gIGkgKz0gNDsKLSAgTG9jYWxbaSsrXSA9IGxlbjsJCQkvKiBuYW1lIGxlbmd0aCAoYXNjaWMgcHJlZml4KSAqLwotICB3aGlsZSAoKnBudCAhPSAnXDAnKQotICAgIExvY2FsW2krK10gPSAqcG50Kys7Ci0gIExvY2FsW2krK10gPSBEU1RfS19WU19GT0xMT1dTOwkvKiB2YWx1ZSBzcGVjaWZpY2F0aW9uIGZvbGxvd3MgKi8KLSAgQ09QWV9TSE9SVCAoJkxvY2FsW2ldLCAxNSk7CQkvKiBsZW5ndGggb2YgcmVzdCBvZiByZWNvcmQgKi8KLSAgaSArPSAyOwotICBMb2NhbFtpKytdID0gRFNUX0tfVlNfQUxMT0NfU1BMSVQ7CS8qIHNwbGl0IGxpZmV0aW1lICovCi0gIExvY2FsW2krK10gPSAxOwkJCS8qIG9uZSBiaW5kaW5nIGZvbGxvd3MgKi8KLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICBpID0gMDsKLSAgVk1TX1NldF9EYXRhIChUZXh0X1BzZWN0LCBNaW5fT2Zmc2V0LCBPQkpfU19DX0RCRywgMSk7Ci0gIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgTWF4X09mZnNldCwgT0JKX1NfQ19EQkcsIDEpOwotICBMb2NhbFtpKytdID0gRFNUX0tfVkFMS0lORF9SRUc7CQkvKiBuZXN0ZWQgdmFsdWUgc3BlYyAqLwotICBDT1BZX0xPTkcgKCZMb2NhbFtpXSwgU19HRVRfVkFMVUUgKHNwKSk7Ci0gIGkgKz0gNDsKLSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAqcG50MSA9ICc6JzsKLSAgaWYgKHNwbnQtPlZNU190eXBlID09IERCR19TX0NfQURWQU5DRURfVFlQRSkKLSAgICBnZW5lcmF0ZV9zdWZmaXggKHNwbnQsIDApOwotfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gZXhhbWluZXMgYSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiwgY2hlY2tpbmcgYWxsIG9mIHRoZSBlbGVtZW50cwotICAgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIG9mIHRoZW0gYXJlIGZ1bGx5IGRlZmluZWQuICBUaGUgb25seSB0aGluZyB0aGF0IHdlCi0gICBraWNrIG91dCBhcmUgYXJyYXlzIG9mIHVuZGVmaW5lZCBzdHJ1Y3RzLCBzaW5jZSB3ZSBkbyBub3Qga25vdyBob3cgYmlnCi0gICB0aGV5IGFyZS4gIEFsbCBvdGhlcnMgd2UgY2FuIGhhbmRsZSB3aXRoIGEgbm9ybWFsIGZvcndhcmQgcmVmZXJlbmNlLiAgKi8KLQotc3RhdGljIGludAotZm9yd2FyZF9yZWZlcmVuY2UgKHBudCkKLSAgICAgY2hhciAqcG50OwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQsICpzcG50MTsKLSAgaW50IGk7Ci0KLSAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgaWYgKCpwbnQgPT0gJzsnKQotICAgIHJldHVybiAwOwkJCS8qIG5vIGZvcndhcmQgcmVmZXJlbmNlcyAqLwotICBkbwotICAgIHsKLSAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAocG50LCAnOicpOwotICAgICAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgICAgIHNwbnQgPSBmaW5kX3N5bWJvbCAoaSk7Ci0gICAgICB3aGlsZSAoc3BudCAmJiAoc3BudC0+YWR2YW5jZWQgPT0gUE9JTlRFUiB8fCBzcG50LT5hZHZhbmNlZCA9PSBBUlJBWSkpCi0JewotCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoc3BudC0+dHlwZTIpOwotCSAgaWYgKHNwbnQtPmFkdmFuY2VkID09IEFSUkFZICYmICFzcG50MSkKLQkgICAgcmV0dXJuIDE7Ci0JICBzcG50ID0gc3BudDE7Ci0JfQotICAgICAgcG50ID0gY3Z0X2ludGVnZXIgKHBudCArIDEsICZpKTsKLSAgICAgIHBudCA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmaSk7Ci0gICAgfSB3aGlsZSAoKisrcG50ICE9ICc7Jyk7Ci0gIHJldHVybiAwOwkJCS8qIG5vIGZvcndhcmQgcmVmZW5jZXMgZm91bmQgKi8KLX0KLQotCi0vKiBVc2VkIHRvIGNoZWNrIGEgc2luZ2xlIGVsZW1lbnQgb2YgYSBzdHJ1Y3R1cmUgb24gdGhlIGZpbmFsIHBhc3MuICAqLwotCi1zdGF0aWMgaW50Ci1maW5hbF9mb3J3YXJkX3JlZmVyZW5jZSAoc3BudCkKLSAgICAgc3RydWN0IFZNU19EQkdfU3ltYm9sICpzcG50OwotewotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQxOwotCi0gIHdoaWxlIChzcG50ICYmIChzcG50LT5hZHZhbmNlZCA9PSBQT0lOVEVSIHx8IHNwbnQtPmFkdmFuY2VkID09IEFSUkFZKSkKLSAgICB7Ci0gICAgICBzcG50MSA9IGZpbmRfc3ltYm9sIChzcG50LT50eXBlMik7Ci0gICAgICBpZiAoc3BudC0+YWR2YW5jZWQgPT0gQVJSQVkgJiYgIXNwbnQxKQotCXJldHVybiAxOwotICAgICAgc3BudCA9IHNwbnQxOwotICAgIH0KLSAgcmV0dXJuIDA7CS8qIG5vIGZvcndhcmQgcmVmZW5jZXMgZm91bmQgKi8KLX0KLQotCi0vKiBUaGlzIHJvdXRpbmUgcGFyc2VzIHRoZSBzdGFicyBkaXJlY3RpdmVzIHRvIGZpbmQgYW55IGRlZmluaXRpb25zIG9mIGRieAotICAgdHlwZSBudW1iZXJzLiAgSXQgbWFrZXMgYSBub3RlIG9mIGFsbCBvZiB0aGVtLCBjcmVhdGluZyBhIHN0cnVjdHVyZQotICAgZWxlbWVudCBvZiBWTVNfREJHX1N5bWJvbCB0aGF0IGRlc2NyaWJlcyBpdC4gIFRoaXMgYWxzbyBnZW5lcmF0ZXMgdGhlCi0gICBpbmZvIGZvciB0aGUgZGVidWdnZXIgdGhhdCBkZXNjcmliZXMgdGhlIHN0cnVjdC91bmlvbi9lbnVtLCBzbyB0aGF0Ci0gICBmdXJ0aGVyIHJlZmVyZW5jZXMgdG8gdGhlc2UgZGF0YSB0eXBlcyB3aWxsIGJlIGJ5IG51bWJlcgotCi0gICBXZSBoYXZlIHRvIHByb2Nlc3MgcG9pbnRlcnMgcmlnaHQgYXdheSwgc2luY2UgdGhlcmUgY2FuIGJlIHJlZmVyZW5jZXMKLSAgIHRvIHRoZW0gbGF0ZXIgaW4gdGhlIHNhbWUgc3RhYnMgZGlyZWN0aXZlLiAgV2UgY2Fubm90IGhhdmUgZm9yd2FyZAotICAgcmVmZXJlbmNlcyB0byBwb2ludGVycywgKGJ1dCB3ZSBjYW4gaGF2ZSBhIGZvcndhcmQgcmVmZXJlbmNlIHRvIGEKLSAgIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUvZW51bS91bmlvbikgYW5kIHRoaXMgaXMgd2h5IHdlIHByb2Nlc3MgdGhlbQotICAgaW1tZWRpYXRlbHkuICBBZnRlciB3ZSBwcm9jZXNzIHRoZSBwb2ludGVyLCB0aGVuIHdlIHNlYXJjaCBmb3IgZGVmcwotICAgdGhhdCBhcmUgbmVzdGVkIGV2ZW4gZGVlcGVyLgotCi0gICA4LzE1LzkyOiBXZSBoYXZlIHRvIHByb2Nlc3MgYXJyYXlzIHJpZ2h0IGF3YXkgdG9vLCBiZWNhdXNlIHRoZXJlIGNhbgotICAgYmUgbXVsdGlwbGUgcmVmZXJlbmNlcyB0byBpZGVudGljYWwgYXJyYXkgdHlwZXMgaW4gb25lIHN0cnVjdHVyZQotICAgZGVmaW5pdGlvbiwgYW5kIG9ubHkgdGhlIGZpcnN0IG9uZSBoYXMgdGhlIGRlZmluaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1WTVNfdHlwZWRlZl9wYXJzZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnBudDsKLSAgY2hhciAqcG50MTsKLSAgY29uc3QgY2hhciAqcG50MjsKLSAgaW50IGk7Ci0gIGludCBkdHlwZTsKLSAgc3RydWN0IGZvcndhcmRfcmVmICpmcG50OwotICBpbnQgaTEsIGkyLCBpMywgbGVuOwotICBzdHJ1Y3QgVk1TX0RCR19TeW1ib2wgKnNwbnQ7Ci0gIHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqc3BudDE7Ci0KLSAgLyogY2hlY2sgZm9yIGFueSBuZXN0ZWQgZGVmJ3MgKi8KLSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIgKyAxLCAnPScpOwotICBpZiAocG50ICYmIHN0clsxXSAhPSAnKicgJiYgKHN0clsxXSAhPSAnYScgfHwgc3RyWzJdICE9ICdyJykKLSAgICAgICYmIFZNU190eXBlZGVmX3BhcnNlIChwbnQpID09IDEpCi0gICAgcmV0dXJuIDE7Ci0gIC8qIG5vdyBmaW5kIGRieF90eXBlIG9mIGVudHJ5ICovCi0gIHBudCA9IHN0ciAtIDE7Ci0gIGlmICgqcG50ID09ICdjJykKLSAgICB7CQkJCS8qIGNoZWNrIGZvciBzdGF0aWMgY29uc3RhbnRzICovCi0gICAgICAqc3RyID0gJ1wwJzsJCS8qIGZvciBub3cgd2UgaWdub3JlIHRoZW0gKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgd2hpbGUgKCgqcG50IDw9ICc5JykgJiYgKCpwbnQgPj0gJzAnKSkKLSAgICBwbnQtLTsKLSAgcG50Kys7CQkJLyogYW5kIGdldCBiYWNrIHRvIHRoZSBudW1iZXIgKi8KLSAgY3Z0X2ludGVnZXIgKHBudCwgJmkxKTsKLSAgc3BudCA9IGZpbmRfc3ltYm9sIChpMSk7Ci0gIC8qIGZpcnN0IHNlZSBpZiB0aGlzIGhhcyBiZWVuIGRlZmluZWQgYWxyZWFkeSwgZHVlIHRvIGZvcndhcmQgcmVmZXJlbmNlICovCi0gIGlmICghc3BudCkKLSAgICB7Ci0gICAgICBpMiA9IFNZTVRZUF9IQVNIIChpMSk7Ci0gICAgICBzcG50ID0gKHN0cnVjdCBWTVNfREJHX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBWTVNfREJHX1N5bWJvbCkpOwotICAgICAgc3BudC0+bmV4dCA9IFZNU19TeW1ib2xfdHlwZV9saXN0W2kyXTsKLSAgICAgIFZNU19TeW1ib2xfdHlwZV9saXN0W2kyXSA9IHNwbnQ7Ci0gICAgICBzcG50LT5kYnhfdHlwZSA9IGkxOwkvKiBhbmQgc2F2ZSB0aGUgdHlwZSAqLwotICAgICAgc3BudC0+dHlwZTIgPSBzcG50LT5WTVNfdHlwZSA9IHNwbnQtPmRhdGFfc2l6ZSA9IDA7Ci0gICAgICBzcG50LT5pbmRleF9taW4gPSBzcG50LT5pbmRleF9tYXggPSBzcG50LT5zdHJ1Y19udW1iID0gMDsKLSAgICB9Ci0gIC8qCi0gICAqIEZvciBzdHJ1Y3RzIGFuZCB1bmlvbnMsIGRvIGEgcGFydGlhbCBwYXJzZSwgb3RoZXJ3aXNlIHdlIHNvbWV0aW1lcyBnZXQKLSAgICogY2lyY3VsYXIgZGVmaW5pdGlvbnMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZXNvbHZlLiAgV2UgcmVhZCBlbm91Z2gKLSAgICogaW5mbyBzbyB0aGF0IGFueSByZWZlcmVuY2UgdG8gdGhpcyB0eXBlIGhhcyBlbm91Z2ggaW5mbyB0byBiZSByZXNvbHZlZC4KLSAgICovCi0gIHBudCA9IHN0ciArIDE7CQkvKiBwb2ludCB0byBjaGFyYWN0ZXIgcGFzdCBlcXVhbCBzaWduICovCi0gIGlmICgqcG50ID49ICcwJyAmJiAqcG50IDw9ICc5JykKLSAgICB7Ci0gICAgICBpZiAodHlwZV9jaGVjayAoInZvaWQiKSkKLQl7CQkJLyogdGhpcyBpcyB0aGUgdm9pZCBzeW1ib2wgKi8KLQkgICpzdHIgPSAnXDAnOwotCSAgc3BudC0+YWR2YW5jZWQgPSBWT0lEOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKHR5cGVfY2hlY2sgKCJ1bmtub3duIHR5cGUiKSkKLQl7Ci0JICAqc3RyID0gJ1wwJzsKLQkgIHNwbnQtPmFkdmFuY2VkID0gVU5LTk9XTjsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50LCAmaTEpOwotICAgICAgaWYgKGkxICE9IHNwbnQtPmRieF90eXBlKQotCXsKLQkgIHNwbnQtPmFkdmFuY2VkID0gQUxJQVM7Ci0JICBzcG50LT50eXBlMiA9IGkxOwotCSAgc3RyY3B5IChzdHIsIHBudDEpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dpbmVyIG91dHB1dDogJWQgaXMgYW4gdW5rbm93biB1bnR5cGVkIHZhcmlhYmxlLiIpLAotCQkgc3BudC0+ZGJ4X3R5cGUpOwotICAgICAgcmV0dXJuIDE7CQkJLyogZG8gbm90IGtub3cgd2hhdCB0aGlzIGlzICovCi0gICAgfQotCi0gIHBudCA9IHN0ciArIDE7CQkvKiBwb2ludCB0byBjaGFyYWN0ZXIgcGFzdCBlcXVhbCBzaWduICovCi0gIHN3aXRjaCAoKnBudCkKLSAgICB7Ci0gICAgY2FzZSAncic6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IEJBU0lDOwotICAgICAgaWYgKHR5cGVfY2hlY2sgKCJpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfU0xJTlQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TTElOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInVuc2lnbmVkIGludCIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VTElOVDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgdW5zaWduZWQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VMSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgic2hvcnQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NTSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgic2hvcnQgdW5zaWduZWQgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1VTSU5UOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY2hhciIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19TQ0hBUjsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoInNpZ25lZCBjaGFyIikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NDSEFSOwotCSAgc3BudC0+ZGF0YV9zaXplID0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgidW5zaWduZWQgY2hhciIpKQotCXsKLQkgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19VQ0hBUjsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImZsb2F0IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1JFQUw0OwotCSAgc3BudC0+ZGF0YV9zaXplID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiZG91YmxlIikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19SRUFMOF9HIDogREJHX1NfQ19SRUFMODsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgZG91YmxlIikpCi0JewotCSAgLyogc2FtZSBhcyBkb3VibGUsIGF0IGxlYXN0IGZvciBub3cgKi8KLQkgIHNwbnQtPlZNU190eXBlID0gdmF4X2dfZG91YmxlcyA/IERCR19TX0NfUkVBTDhfRyA6IERCR19TX0NfUkVBTDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJsb25nIGxvbmcgaW50IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX1NRVUFEOwkvKiBzaWduZWQgcXVhZHdvcmQgKi8KLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDg7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZV9jaGVjayAoImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IERCR19TX0NfVVFVQUQ7CS8qIHVuc2lnbmVkIHF1YWR3b3JkICovCi0JICBzcG50LT5kYXRhX3NpemUgPSA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJjb21wbGV4IGZsb2F0IikpCi0JewotCSAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0NPTVBMWDQ7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAyICogNDsKLQl9Ci0gICAgICBlbHNlIGlmICh0eXBlX2NoZWNrICgiY29tcGxleCBkb3VibGUiKSkKLQl7Ci0JICBzcG50LT5WTVNfdHlwZSA9IHZheF9nX2RvdWJsZXMgPyBEQkdfU19DX0NPTVBMWDhfRyA6IERCR19TX0NfQ09NUExYODsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDIgKiA4OwotCX0KLSAgICAgIGVsc2UgaWYgKHR5cGVfY2hlY2sgKCJjb21wbGV4IGxvbmcgZG91YmxlIikpCi0JewotCSAgLyogc2FtZSBhcyBjb21wbGV4IGRvdWJsZSwgYXQgbGVhc3QgZm9yIG5vdyAqLwotCSAgc3BudC0+Vk1TX3R5cGUgPSB2YXhfZ19kb3VibGVzID8gREJHX1NfQ19DT01QTFg4X0cgOiBEQkdfU19DX0NPTVBMWDg7Ci0JICBzcG50LT5kYXRhX3NpemUgPSAyICogODsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoJW3ByXQotCSAgICogU2hvdWxkbid0IGdldCBoZXJlLCBidXQgaWYgd2UgZG8sIHNvbWV0aGluZwotCSAgICogbW9yZSBzdWJzdGFudGlhbCBvdWdodCB0byBiZSBkb25lLi4uCi0JICAgKi8KLQkgIHNwbnQtPlZNU190eXBlID0gMDsKLQkgIHNwbnQtPmRhdGFfc2l6ZSA9IDA7Ci0JfQotICAgICAgaWYgKHNwbnQtPlZNU190eXBlICE9IDApCi0Jc2V0dXBfYmFzaWNfdHlwZSAoc3BudCk7Ci0gICAgICBwbnQxID0gKGNoYXIgKikgc3RyY2hyIChzdHIsICc7JykgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAndSc6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9ICgqcG50ID09ICdzJykgPyBTVFJVQ1QgOiBVTklPTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+ZGF0YV9zaXplKTsKLSAgICAgIGlmICghZmluYWxfcGFzcyAmJiBmb3J3YXJkX3JlZmVyZW5jZSAocG50KSkKLQl7Ci0JICBzcG50LT5zdHJ1Y19udW1iID0gLTE7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBzcG50LT5zdHJ1Y19udW1iID0gKytzdHJ1Y3R1cmVfY291bnQ7Ci0gICAgICBwbnQxLS07Ci0gICAgICBwbnQgPSBnZXRfc3RydWN0X25hbWUgKHN0cik7Ci0gICAgICBWTVNfRGVmX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIGZvciAoZnBudCA9IGZfcmVmX3Jvb3Q7IGZwbnQ7IGZwbnQgPSBmcG50LT5uZXh0KQotCWlmIChmcG50LT5kYnhfdHlwZSA9PSBzcG50LT5kYnhfdHlwZSkKLQkgIHsKLQkgICAgZnBudC0+cmVzb2x2ZWQgPSAnWSc7Ci0JICAgIFZNU19TZXRfU3RydWN0IChmcG50LT5zdHJ1Y19udW1iKTsKLQkgICAgVk1TX1N0b3JlX1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0JICAgIGkrKzsKLQkgIH0KLSAgICAgIGlmIChpID4gMCkKLQlWTVNfU2V0X1N0cnVjdCAoc3BudC0+c3RydWNfbnVtYik7Ci0gICAgICBpID0gMDsKLSAgICAgIExvY2FsW2krK10gPSAxMSArIHN0cmxlbiAocG50KTsKLSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX1NUUlVDVF9TVEFSVDsKLSAgICAgIExvY2FsW2krK10gPSBEU1RfS19WRkxBR1NfTk9WQUw7CS8qIHN0cnVjdHVyZSBkZWZpbml0aW9uIG9ubHkgKi8KLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCAwTCk7CS8qIGhlbmNlIHZhbHVlIGlzIHVudXNlZCAqLwotICAgICAgaSArPSA0OwotICAgICAgTG9jYWxbaSsrXSA9IHN0cmxlbiAocG50KTsKLSAgICAgIHBudDIgPSBwbnQ7Ci0gICAgICB3aGlsZSAoKnBudDIgIT0gJ1wwJykKLQlMb2NhbFtpKytdID0gKnBudDIrKzsKLSAgICAgIGkyID0gc3BudC0+ZGF0YV9zaXplICogODsJLyogbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7Ci0gICAgICBpICs9IDQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIGlmIChwbnQgIT0gc3ltYm9sX25hbWUpCi0JewotCSAgcG50ICs9IHN0cmxlbiAocG50KTsKLQkgICpwbnQgPSAnOic7Ci0JfQkJCS8qIHJlcGxhY2UgY29sb24gZm9yIGxhdGVyICovCi0gICAgICB3aGlsZSAoKisrcG50MSAhPSAnOycpCi0JewotCSAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChwbnQxLCAnOicpOwotCSAgKnBudCA9ICdcMCc7Ci0JICBwbnQyID0gcG50MTsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJmR0eXBlKTsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZpMik7Ci0JICBwbnQxID0gY3Z0X2ludGVnZXIgKHBudDEgKyAxLCAmaTMpOwotCSAgc3BudDEgPSBmaW5kX3N5bWJvbCAoZHR5cGUpOwotCSAgbGVuID0gc3RybGVuIChwbnQyKTsKLQkgIGlmIChzcG50MSAmJiAoc3BudDEtPmFkdmFuY2VkID09IEJBU0lDIHx8IHNwbnQxLT5hZHZhbmNlZCA9PSBFTlVNKQotCSAgICAgICYmICgoaTMgIT0gc3BudDEtPmRhdGFfc2l6ZSAqIDgpIHx8IChpMiAlIDggIT0gMCkpKQotCSAgICB7CQkJLyogYml0ZmllbGQgKi8KLQkgICAgICBpZiAoVVNFX0JJVFNUUklOR19ERVNDUklQVE9SIChzcG50MSkpCi0JCXsKLQkJICAvKiBUaGlzIHVzZXMgYSB0eXBlIGRlc2NyaXB0b3IsIHdoaWNoIGRvZXNuJ3Qgd29yayBpZgotCQkgICAgIHRoZSBlbmNsb3Npbmcgc3RydWN0dXJlIGhhcyBiZWVuIHBsYWNlZCBpbiBhIHJlZ2lzdGVyLgotCQkgICAgIEFsc28sIGVudW0gYml0ZmllbGRzIGRlZ2VuZXJhdGUgdG8gc2ltcGxlIGludGVnZXJzLiAgKi8KLQkJICBpbnQgdW5zaWduZWRfdHlwZSA9IChzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VTElOVAotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VU0lOVAotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VQ0hBUgotCQkJCSAgICB8fCBzcG50MS0+Vk1TX3R5cGUgPT0gREJHX1NfQ19VUVVBRAotCQkJCSAgICB8fCBzcG50MS0+YWR2YW5jZWQgPT0gRU5VTSk7IC8qIChhcHByb3hpbWF0ZSkgKi8KLQkJICBBcG9pbnQgPSAwOwotCQkgIGZwdXNoICgxOSArIGxlbiwgMSk7Ci0JCSAgZnB1c2ggKHVuc2lnbmVkX3R5cGUgPyBEQkdfU19DX1VCSVRVIDogREJHX1NfQ19TQklUVSwgMSk7Ci0JCSAgZnB1c2ggKERTVF9LX1ZGTEFHU19EU0MsIDEpOwkvKiBzcGVjaWZpZWQgYnkgZGVzY3JpcHRvciAqLwotCQkgIGZwdXNoICgxICsgbGVuLCA0KTsJLyogcmVsYXRpdmUgb2Zmc2V0IHRvIGRlc2NyaXB0b3IgKi8KLQkJICBmcHVzaCAobGVuLCAxKTsJCS8qIGxlbmd0aCBieXRlIChhc2NpYyBwcmVmaXgpICovCi0JCSAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCS8qIG5hbWUgYnl0ZXMgKi8KLQkJICAgIGZwdXNoICgqcG50MisrLCAxKTsKLQkJICBmcHVzaCAoaTMsIDIpOwkvKiBkc2MgbGVuZ3RoID09IHNpemUgb2YgYml0ZmllbGQgKi8KLQkJCQkJLyogZHNjIHR5cGUgPT0gdW4/c2lnbmVkIGJpdGZpZWxkICovCi0JCSAgZnB1c2ggKHVuc2lnbmVkX3R5cGUgPyBEQkdfU19DX1VCSVRVIDogREJHX1NfQ19TQklUVSwgMSk7Ci0JCSAgZnB1c2ggKERTQ19LX0NMQVNTX1VCUywgMSk7CS8qIGRzYyBjbGFzcyA9PSB1bmFsaWduZWQgYml0c3RyaW5nICovCi0JCSAgZnB1c2ggKDB4MDAsIDQpOwkJLyogZHNjIHBvaW50ZXIgPT0gemVyb2VzICovCi0JCSAgZnB1c2ggKGkyLCA0KTsJLyogc3RhcnQgcG9zaXRpb24gKi8KLQkJICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKEFzdWZmaXgsIEFwb2ludCwgT0JKX1NfQ19EQkcpOwotCQkgIEFwb2ludCA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBVc2UgYSAibm92ZWwgbGVuZ3RoIiB0eXBlIHNwZWNpZmljYXRpb24sIHdoaWNoIHdvcmtzCi0JCSAgICAgcmlnaHQgZm9yIHJlZ2lzdGVyIHN0cnVjdHVyZXMgYW5kIGZvciBlbnVtIGJpdGZpZWxkcwotCQkgICAgIGJ1dCByZXN1bHRzIGluIGxhcmdlciBvYmplY3QgbW9kdWxlcy4gICovCi0JCSAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0JCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfQURWQU5DRURfVFlQRTsJLyogdHlwZSBzcGVjIGZvbGxvd3MgKi8KLQkJICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfSVRFTTsJLyogdmFsdWUgaXMgYSBiaXQgb2Zmc2V0ICovCi0JCSAgQ09QWV9MT05HICgmTG9jYWxbaV0sIGkyKTsJCS8qIGJpdCBvZmZzZXQgKi8KLQkJICBpICs9IDQ7Ci0JCSAgTG9jYWxbaSsrXSA9IHN0cmxlbiAocG50Mik7Ci0JCSAgd2hpbGUgKCpwbnQyICE9ICdcMCcpCi0JCSAgICBMb2NhbFtpKytdID0gKnBudDIrKzsKLQkJICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JCSAgaSA9IDA7Ci0JCSAgYml0ZmllbGRfc3VmZml4IChzcG50MSwgaTMpOwotCSAgICAgfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsJCQkvKiBub3QgYSBiaXRmaWVsZCAqLwotCSAgICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgYSBmb3J3YXJkIHJlZmVyZW5jZSAqLwotCSAgICAgIGlmIChmaW5hbF9wYXNzICYmIGZpbmFsX2ZvcndhcmRfcmVmZXJlbmNlIChzcG50MSkpCi0JCXsKLQkJICBhc190c2t0c2sgKF8oImRlYnVnZ2VyIG91dHB1dDogc3RydWN0dXJlIGVsZW1lbnQgYCVzJyBoYXMgdW5kZWZpbmVkIHR5cGUiKSwKLQkJCSAgIHBudDIpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgTG9jYWxbaSsrXSA9IDcgKyBsZW47Ci0JICAgICAgTG9jYWxbaSsrXSA9IHNwbnQxID8gc3BudDEtPlZNU190eXBlIDogREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotCSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX1NUUlVDVF9JVEVNOwotCSAgICAgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMik7CQkvKiBiaXQgb2Zmc2V0ICovCi0JICAgICAgaSArPSA0OwotCSAgICAgIExvY2FsW2krK10gPSBzdHJsZW4gKHBudDIpOwotCSAgICAgIHdoaWxlICgqcG50MiAhPSAnXDAnKQotCQlMb2NhbFtpKytdID0gKnBudDIrKzsKLQkgICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JICAgICAgaSA9IDA7Ci0JICAgICAgaWYgKCFzcG50MSkKLQkJZ2VuZXJhdGVfc3VmZml4IChzcG50MSwgZHR5cGUpOwotCSAgICAgIGVsc2UgaWYgKHNwbnQxLT5WTVNfdHlwZSA9PSBEQkdfU19DX0FEVkFOQ0VEX1RZUEUpCi0JCWdlbmVyYXRlX3N1ZmZpeCAoc3BudDEsIDApOwotCSAgICB9Ci0JfQotICAgICAgcG50MSsrOwotICAgICAgTG9jYWxbaSsrXSA9IDB4MDE7CS8qIGxlbmd0aCBieXRlICovCi0gICAgICBMb2NhbFtpKytdID0gREJHX1NfQ19TVFJVQ1RfRU5EOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdlJzoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gRU5VTTsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19BRFZBTkNFRF9UWVBFOwotICAgICAgc3BudC0+c3RydWNfbnVtYiA9ICsrc3RydWN0dXJlX2NvdW50OwotICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKLSAgICAgIFZNU19EZWZfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLSAgICAgIGkgPSAwOwotICAgICAgZm9yIChmcG50ID0gZl9yZWZfcm9vdDsgZnBudDsgZnBudCA9IGZwbnQtPm5leHQpCi0JaWYgKGZwbnQtPmRieF90eXBlID09IHNwbnQtPmRieF90eXBlKQotCSAgewotCSAgICBmcG50LT5yZXNvbHZlZCA9ICdZJzsKLQkgICAgVk1TX1NldF9TdHJ1Y3QgKGZwbnQtPnN0cnVjX251bWIpOwotCSAgICBWTVNfU3RvcmVfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLQkgICAgaSsrOwotCSAgfQotICAgICAgaWYgKGkgPiAwKQotCVZNU19TZXRfU3RydWN0IChzcG50LT5zdHJ1Y19udW1iKTsKLSAgICAgIGkgPSAwOwotICAgICAgbGVuID0gc3RybGVuIChzeW1ib2xfbmFtZSk7Ci0gICAgICBMb2NhbFtpKytdID0gMyArIGxlbjsKLSAgICAgIExvY2FsW2krK10gPSBEQkdfU19DX0VOVU1fU1RBUlQ7Ci0gICAgICBMb2NhbFtpKytdID0gNCAqIDg7CQkvKiBlbnVtIHZhbHVlcyBhcmUgMzIgYml0cyAqLwotICAgICAgTG9jYWxbaSsrXSA9IGxlbjsKLSAgICAgIHBudDIgPSBzeW1ib2xfbmFtZTsKLSAgICAgIHdoaWxlICgqcG50MiAhPSAnXDAnKQotCUxvY2FsW2krK10gPSAqcG50MisrOwotICAgICAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwgaSwgT0JKX1NfQ19EQkcpOwotICAgICAgaSA9IDA7Ci0gICAgICB3aGlsZSAoKisrcG50ICE9ICc7JykKLQl7Ci0JICBwbnQxID0gKGNoYXIgKikgc3RyY2hyIChwbnQsICc6Jyk7Ci0JICAqcG50MSsrID0gJ1wwJzsKLQkgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSwgJmkxKTsKLQkgIGxlbiA9IHN0cmxlbiAocG50KTsKLQkgIExvY2FsW2krK10gPSA3ICsgbGVuOwotCSAgTG9jYWxbaSsrXSA9IERCR19TX0NfRU5VTV9JVEVNOwotCSAgTG9jYWxbaSsrXSA9IERTVF9LX1ZBTEtJTkRfTElURVJBTDsKLQkgIENPUFlfTE9ORyAoJkxvY2FsW2ldLCBpMSk7Ci0JICBpICs9IDQ7Ci0JICBMb2NhbFtpKytdID0gbGVuOwotCSAgcG50MiA9IHBudDsKLQkgIHdoaWxlICgqcG50ICE9ICdcMCcpCi0JICAgIExvY2FsW2krK10gPSAqcG50Kys7Ci0JICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0JICBpID0gMDsKLQkgIHBudCA9IHBudDE7CQkvKiBTa2lwIGZpbmFsIHNlbWljb2xvbiAqLwotCX0KLSAgICAgIExvY2FsW2krK10gPSAweDAxOwkvKiBsZW4gYnl0ZSAqLwotICAgICAgTG9jYWxbaSsrXSA9IERCR19TX0NfRU5VTV9FTkQ7Ci0gICAgICBWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKExvY2FsLCBpLCBPQkpfU19DX0RCRyk7Ci0gICAgICBpID0gMDsKLSAgICAgIHBudDEgPSBwbnQgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYSc6Ci0gICAgICBzcG50LT5hZHZhbmNlZCA9IEFSUkFZOwotICAgICAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7Ci0gICAgICBwbnQgPSAoY2hhciAqKSBzdHJjaHIgKHBudCwgJzsnKTsKLSAgICAgIGlmICghcG50KQotCXJldHVybiAxOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+aW5kZXhfbWluKTsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50MSArIDEsICZzcG50LT5pbmRleF9tYXgpOwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQxICsgMSwgJnNwbnQtPnR5cGUyKTsKLSAgICAgIHBudCA9IChjaGFyICopIHN0cmNociAoc3RyICsgMSwgJz0nKTsKLSAgICAgIGlmIChwbnQgJiYgVk1TX3R5cGVkZWZfcGFyc2UgKHBudCkgPT0gMSkKLQlyZXR1cm4gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2YnOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBGVU5DVElPTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gREJHX1NfQ19GVU5DVElPTl9BRERSOwotICAgICAgLyogdGhpcyBtYXNxdWVyYWRlcyBhcyBhIGJhc2ljIHR5cGUqLwotICAgICAgc3BudC0+ZGF0YV9zaXplID0gNDsKLSAgICAgIHBudDEgPSBjdnRfaW50ZWdlciAocG50ICsgMSwgJnNwbnQtPnR5cGUyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJyonOgotICAgICAgc3BudC0+YWR2YW5jZWQgPSBQT0lOVEVSOwotICAgICAgc3BudC0+Vk1TX3R5cGUgPSBEQkdfU19DX0FEVkFOQ0VEX1RZUEU7Ci0gICAgICBzcG50LT5kYXRhX3NpemUgPSA0OwotICAgICAgcG50MSA9IGN2dF9pbnRlZ2VyIChwbnQgKyAxLCAmc3BudC0+dHlwZTIpOwotICAgICAgcG50ID0gKGNoYXIgKikgc3RyY2hyIChzdHIgKyAxLCAnPScpOwotICAgICAgaWYgKHBudCAmJiBWTVNfdHlwZWRlZl9wYXJzZSAocG50KSA9PSAxKQotCXJldHVybiAxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHNwbnQtPmFkdmFuY2VkID0gVU5LTk9XTjsKLSAgICAgIHNwbnQtPlZNU190eXBlID0gMDsKLSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgb3V0cHV0OiAlZCBpcyBhbiB1bmtub3duIHR5cGUgb2YgdmFyaWFibGUuIiksCi0JCSBzcG50LT5kYnhfdHlwZSk7Ci0gICAgICByZXR1cm4gMTsJCQkvKiB1bmFibGUgdG8gZGVjaXBoZXIgKi8KLSAgICB9Ci0gIC8qIFRoaXMgcmVtb3ZlcyB0aGUgZXZpZGVuY2Ugb2YgdGhlIGRlZmluaXRpb24gc28gdGhhdCB0aGUgb3V0ZXIgbGV2ZWxzCi0gICAgIG9mIHBhcnNpbmcgZG8gbm90IGhhdmUgdG8gd29ycnkgYWJvdXQgaXQuICAqLwotICBwbnQgPSBzdHI7Ci0gIHdoaWxlICgqcG50MSAhPSAnXDAnKQotICAgICpwbnQrKyA9ICpwbnQxKys7Ci0gICpwbnQgPSAnXDAnOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBUaGlzIGlzIHRoZSByb290IHJvdXRpbmUgdGhhdCBwYXJzZXMgdGhlIHN0YWJzIGVudHJpZXMgZm9yIGRlZmluaXRpb25zLgotICAgaXQgY2FsbHMgVk1TX3R5cGVkZWZfcGFyc2UsIHdoaWNoIGNhbiBpbiB0dXJuIGNhbGwgaXRzZWxmLiAgV2UgbmVlZCB0bwotICAgYmUgY2FyZWZ1bCwgc2luY2Ugc29tZXRpbWVzIHRoZXJlIGFyZSBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gb3RoZXIgc3ltYm9sCi0gICB0eXBlcywgYW5kIHRoZXNlIGNhbm5vdCBiZSByZXNvbHZlZCB1bnRpbCB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgcGFyc2UuCi0KLSAgIEFsc28gY2hlY2sgYW5kIHNlZSBpZiB3ZSBhcmUgdXNpbmcgY29udGludWF0aW9uIHN0YWJzLCBpZiB3ZSBhcmUsIHRoZW4KLSAgIHBhc3RlIHRvZ2V0aGVyIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIHN0YWIgYmVmb3JlIHdlIHBhc3MgaXQgdG8KLSAgIFZNU190eXBlZGVmX3BhcnNlLiAgKi8KLQotc3RhdGljIHZvaWQKLVZNU19MU1lNX1BhcnNlICgpCi17Ci0gIGNoYXIgKnBudDsKLSAgY2hhciAqcG50MTsKLSAgY2hhciAqcG50MjsKLSAgY2hhciAqc3RyOwotICBjaGFyICpwYXJzZV9idWZmZXIgPSAwOwotICBjaGFyIGZpeGl0WzEwXTsKLSAgaW50IGluY29tcGxldGUsIHBhc3MsIGluY29tMTsKLSAgc3RydWN0IGZvcndhcmRfcmVmICpmcG50OwotICBzeW1ib2xTICpzcDsKLQotICBwYXNzID0gMDsKLSAgZmluYWxfcGFzcyA9IDA7Ci0gIGluY29tcGxldGUgPSAwOwotICBkbwotICAgIHsKLSAgICAgIGluY29tMSA9IGluY29tcGxldGU7Ci0gICAgICBpbmNvbXBsZXRlID0gMDsKLSAgICAgIGZvciAoc3AgPSBzeW1ib2xfcm9vdFA7IHNwOyBzcCA9IHN5bWJvbF9uZXh0IChzcCkpCi0JewotCSAgLyoKLQkgICAqCURlYWwgd2l0aCBTVEFCIHN5bWJvbHMKLQkgICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwKSkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0JICAgICAgICovCi0JICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ApKQotCQl7Ci0JCWNhc2UgTl9HU1lNOgotCQljYXNlIE5fTENTWU06Ci0JCWNhc2UgTl9TVFNZTToKLQkJY2FzZSBOX1BTWU06Ci0JCWNhc2UgTl9SU1lNOgotCQljYXNlIE5fTFNZTToKLQkJY2FzZSBOX0ZVTjoJLypzb21ldGltZXMgdGhlc2UgY29udGFpbiB0eXBlZGVmcyovCi0JCSAgc3RyID0gU19HRVRfTkFNRSAoc3ApOwotCQkgIHN5bWJvbF9uYW1lID0gc3RyOwotCQkgIHBudCA9IHN0ciArIHN0cmxlbiAoc3RyKSAtIDE7Ci0JCSAgaWYgKCpwbnQgPT0gJz8nKSAgLyogQ29udGludWF0aW9uIHN0YWIuICAqLwotCQkgICAgewotCQkgICAgICBzeW1ib2xTICpzcG5leHQ7Ci0JCSAgICAgIGludCB0bGVuID0gMDsKLQotCQkgICAgICBzcG5leHQgPSBzcDsKLQkJICAgICAgZG8gewotCQkJdGxlbiArPSBzdHJsZW4gKHN0cikgLSAxOwotCQkJc3BuZXh0ID0gc3ltYm9sX25leHQgKHNwbmV4dCk7Ci0JCQlzdHIgPSBTX0dFVF9OQU1FIChzcG5leHQpOwotCQkJcG50ID0gc3RyICsgc3RybGVuIChzdHIpIC0gMTsKLQkJICAgICAgfSB3aGlsZSAoKnBudCA9PSAnPycpOwotCQkgICAgICB0bGVuICs9IHN0cmxlbiAoc3RyKTsKLQkJICAgICAgcGFyc2VfYnVmZmVyID0gKGNoYXIgKikgeG1hbGxvYyAodGxlbiArIDEpOwotCQkgICAgICBzdHJjcHkgKHBhcnNlX2J1ZmZlciwgU19HRVRfTkFNRSAoc3ApKTsKLQkJICAgICAgcG50MiA9IHBhcnNlX2J1ZmZlciArIHN0cmxlbiAocGFyc2VfYnVmZmVyKSAtIDE7Ci0JCSAgICAgICpwbnQyID0gJ1wwJzsKLQkJICAgICAgc3BuZXh0ID0gc3A7Ci0JCSAgICAgIGRvIHsKLQkJCXNwbmV4dCA9IHN5bWJvbF9uZXh0IChzcG5leHQpOwotCQkJc3RyID0gU19HRVRfTkFNRSAoc3BuZXh0KTsKLQkJCXN0cmNhdCAocG50Miwgc3RyKTsKLQkJCXBudDIgKz0gIHN0cmxlbiAoc3RyKSAtIDE7Ci0JCQkqc3RyID0gJ1wwJzsgIC8qIEVyYXNlIHRoaXMgc3RyaW5nICAqLwotCQkgICAgIC8qIFNfU0VUX05BTUUgKHNwbmV4dCwgc3RyKTsgKi8KLQkJCWlmICgqcG50MiAhPSAnPycpIGJyZWFrOwotCQkJKnBudDIgPSAnXDAnOwotCQkgICAgICB9IHdoaWxlICgxKTsKLQkJICAgICAgc3RyID0gcGFyc2VfYnVmZmVyOwotCQkgICAgICBzeW1ib2xfbmFtZSA9IHN0cjsKLQkJICAgIH0KLQkJICBpZiAoKHBudCA9IChjaGFyICopIHN0cmNociAoc3RyLCAnOicpKSAhPSAwKQotCQkgICAgewotCQkgICAgICAqcG50ID0gJ1wwJzsKLQkJICAgICAgcG50MSA9IHBudCArIDE7Ci0JCSAgICAgIGlmICgocG50MiA9IChjaGFyICopIHN0cmNociAocG50MSwgJz0nKSkgIT0gMCkKLQkJCWluY29tcGxldGUgKz0gVk1TX3R5cGVkZWZfcGFyc2UgKHBudDIpOwotCQkgICAgICBpZiAocGFyc2VfYnVmZmVyKQotCQkJewotCQkJICAvKiAgQXQgdGhpcyBwb2ludCB0aGUgcGFyc2UgYnVmZmVyIHNob3VsZCBqdXN0Ci0JCQkgICAgICBjb250YWluIG5hbWU6bm4uICBJZiBpdCBkb2VzIG5vdCwgdGhlbiB3ZQotCQkJICAgICAgYXJlIGluIHJlYWwgdHJvdWJsZS4gIEFueXdheSwgdGhpcyBpcyBhbHdheXMKLQkJCSAgICAgIHNob3J0ZXIgdGhhbiB0aGUgb3JpZ2luYWwgbGluZS4gICovCi0JCQkgIHBudDIgPSBTX0dFVF9OQU1FIChzcCk7Ci0JCQkgIHN0cmNweSAocG50MiwgcGFyc2VfYnVmZmVyKTsKLQkJICAgICAgIC8qIFNfU0VUX05BTUUgKHNwLCBwbnQyKTsgKi8KLQkJCSAgZnJlZSAocGFyc2VfYnVmZmVyKSwgIHBhcnNlX2J1ZmZlciA9IDA7Ci0JCQl9Ci0JCSAgICAgICpwbnQgPSAnOic7CS8qIHB1dCBiYWNrIGNvbG9uIHRvIHJlc3RvcmUgZGJ4X3R5cGUgKi8KLQkJICAgIH0KLQkJICBicmVhazsKLQkJfQkJLypzd2l0Y2gqLwotCSAgICB9CQkJLyogaWYgKi8KLQl9CQkJLypmb3IqLwotICAgICAgcGFzcysrOwotICAgICAgLyoKLSAgICAgICAqIE1ha2Ugb25lIGxhc3QgcGFzcywgaWYgbmVlZGVkLCBhbmQgZGVmaW5lIHdoYXRldmVyIHdlIGNhbgotICAgICAgICogdGhhdCBpcyBsZWZ0LgotICAgICAgICovCi0gICAgICBpZiAoZmluYWxfcGFzcyA9PSAwICYmIGluY29tcGxldGUgPT0gaW5jb20xKQotCXsKLQkgIGZpbmFsX3Bhc3MgPSAxOwotCSAgaW5jb20xKys7CS8qIEZvcmNlIG9uZSBsYXN0IHBhc3MgdGhyb3VnaCAqLwotCX0KLSAgfSB3aGlsZSAoaW5jb21wbGV0ZSAhPSAwICYmIGluY29tcGxldGUgIT0gaW5jb20xKTsKLSAgLyogcmVwZWF0IHVudGlsIGFsbCByZWZzIHJlc29sdmVkIGlmIHBvc3NpYmxlICovCi0vKglpZiAocGFzcyA+IDEpIHByaW50ZiAoIiBSZXF1aXJlZCAlZCBwYXNzZXNcbiIsIHBhc3MpOyAqLwotICBpZiAoaW5jb21wbGV0ZSAhPSAwKQotICAgIHsKLSAgICAgIGFzX3Rza3RzayAoXygiZGVidWdnZXIgb3V0cHV0OiBVbmFibGUgdG8gcmVzb2x2ZSAlZCBjaXJjdWxhciByZWZlcmVuY2VzLiIpLAotCQkgaW5jb21wbGV0ZSk7Ci0gICAgfQotICBmcG50ID0gZl9yZWZfcm9vdDsKLSAgc3ltYm9sX25hbWUgPSAiXDAiOwotICB3aGlsZSAoZnBudCkKLSAgICB7Ci0gICAgICBpZiAoZnBudC0+cmVzb2x2ZWQgIT0gJ1knKQotCXsKLQkgIGlmIChmaW5kX3N5bWJvbCAoZnBudC0+ZGJ4X3R5cGUpKQotCSAgICB7Ci0JICAgICAgYXNfdHNrdHNrIChfKCJkZWJ1Z2dlciBmb3J3YXJkIHJlZmVyZW5jZSBlcnJvciwgZGJ4IHR5cGUgJWQiKSwKLQkJCSBmcG50LT5kYnhfdHlwZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGZpeGl0WzBdID0gMDsKLQkgIHNwcmludGYgKCZmaXhpdFsxXSwgIiVkPXM0OyIsIGZwbnQtPmRieF90eXBlKTsKLQkgIHBudDIgPSAoY2hhciAqKSBzdHJjaHIgKCZmaXhpdFsxXSwgJz0nKTsKLQkgIFZNU190eXBlZGVmX3BhcnNlIChwbnQyKTsKLQl9Ci0gICAgICBmcG50ID0gZnBudC0+bmV4dDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURlZmluZV9Mb2NhbF9TeW1ib2xzIChzMFAsIHMyUCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KQotICAgICBzeW1ib2xTICpzMFAsICpzMlA7Ci0gICAgIHN5bWJvbFMgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnMxUDsJCS8qIGVhY2ggc3ltYm9sIGZyb20gczBQIC4uIHMyUCAoZXhjbHVzaXZlKSAqLwotCi0gIGZvciAoczFQID0gc3ltYm9sX25leHQgKHMwUCk7IHMxUCAhPSBzMlA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIGlmICghczFQKQotCWJyZWFrOwkJLyogYW5kIHJldHVybiAqLwotICAgICAgaWYgKFNfR0VUX1JBV19UWVBFIChzMVApID09IE5fRlVOKQotCXsKLQkgIGNoYXIgKnBudCA9IChjaGFyICopIHN0cmNociAoU19HRVRfTkFNRSAoczFQKSwgJzonKSArIDE7Ci0JICBpZiAoKnBudCA9PSAnRicgfHwgKnBudCA9PSAnZicpIGJyZWFrOwotCX0KLSAgICAgIGlmICghU19JU19ERUJVRyAoczFQKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUKLSAgICAgICAqLwotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoczFQKSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGNvbnRpbnVlOwkJLyogbm90IGxlZnQgb3IgcmlnaHQgYnJhY2UgKi8KLQotCWNhc2UgTl9MU1lNOgotCWNhc2UgTl9QU1lNOgotCSAgVk1TX2xvY2FsX3N0YWJfUGFyc2UgKHMxUCk7Ci0JICBicmVhazsKLQotCWNhc2UgTl9SU1lNOgotCSAgVk1TX1JTWU1fUGFyc2UgKHMxUCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLQkgIGJyZWFrOwotCX0JCQkvKnN3aXRjaCovCi0gICAgfQkJCQkvKiBmb3IgKi8KLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNyYXdscyB0aGUgc3ltYm9sIGNoYWluIHNlYXJjaGluZyBmb3IgbG9jYWwgc3ltYm9scyB0aGF0Ci0gICBuZWVkIHRvIGJlIGRlc2NyaWJlZCB0byB0aGUgZGVidWdnZXIuICBXaGVuIHdlIGVudGVyIGEgbmV3IHNjb3BlIHdpdGgKLSAgIGEgInsiLCBpdCBjcmVhdGVzIGEgbmV3ICJibG9jayIsIHdoaWNoIGhlbHBzIHRoZSBkZWJ1Z2dlciBrZWVwIHRyYWNrCi0gICBvZiB3aGljaCBzY29wZSB3ZSBhcmUgY3VycmVudGx5IGluLiAgKi8KLQotc3RhdGljIHN5bWJvbFMgKgotRGVmaW5lX1JvdXRpbmUgKHMwUCwgTGV2ZWwsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCkKLSAgICAgc3ltYm9sUyAqczBQOwotICAgICBpbnQgTGV2ZWw7Ci0gICAgIHN5bWJvbFMgKkN1cnJlbnRfUm91dGluZTsKLSAgICAgaW50IFRleHRfUHNlY3Q7Ci17Ci0gIHN5bWJvbFMgKnMxUDsKLSAgdmFsdWVUIE9mZnNldDsKLSAgaW50IHJjb3VudCA9IDA7Ci0KLSAgZm9yIChzMVAgPSBzeW1ib2xfbmV4dCAoczBQKTsgczFQICE9IDA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoczFQKSA9PSBOX0ZVTikKLQl7Ci0JICBjaGFyICpwbnQgPSAoY2hhciAqKSBzdHJjaHIgKFNfR0VUX05BTUUgKHMxUCksICc6JykgKyAxOwotCSAgaWYgKCpwbnQgPT0gJ0YnIHx8ICpwbnQgPT0gJ2YnKSBicmVhazsKLQl9Ci0gICAgICBpZiAoIVNfSVNfREVCVUcgKHMxUCkpCi0JY29udGludWU7Ci0gICAgICAvKgotICAgICAgICoJRGlzcGF0Y2ggb24gU1RBQiB0eXBlCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHMxUCkpCi0JewotCWRlZmF1bHQ6Ci0JICBjb250aW51ZTsJCS8qIG5vdCBsZWZ0IG9yIHJpZ2h0IGJyYWNlICovCi0KLQljYXNlIE5fTEJSQUM6Ci0JICBpZiAoTGV2ZWwgIT0gMCkKLQkgICAgewotCSAgICAgIGNoYXIgc3RyWzEwXTsKLQkgICAgICBzcHJpbnRmIChzdHIsICIkJWQiLCByY291bnQrKyk7Ci0JICAgICAgVk1TX1RCVF9CbG9ja19CZWdpbiAoczFQLCBUZXh0X1BzZWN0LCBzdHIpOwotCSAgICB9Ci0JICBPZmZzZXQgPSBTX0dFVF9WQUxVRSAoczFQKTsJLyogc2lkZS1lZmZlY3Q6IGZ1bGx5IHJlc29sdmUgc3ltYm9sICovCi0JICBEZWZpbmVfTG9jYWxfU3ltYm9scyAoczBQLCBzMVAsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICBzMVAgPSBEZWZpbmVfUm91dGluZSAoczFQLCBMZXZlbCArIDEsIEN1cnJlbnRfUm91dGluZSwgVGV4dF9Qc2VjdCk7Ci0JICBpZiAoTGV2ZWwgIT0gMCkKLQkgICAgVk1TX1RCVF9CbG9ja19FbmQgKFNfR0VUX1ZBTFVFIChzMVApIC0gT2Zmc2V0KTsKLQkgIHMwUCA9IHMxUDsKLQkgIGJyZWFrOwotCi0JY2FzZSBOX1JCUkFDOgotCSAgcmV0dXJuIHMxUDsKLQl9CQkJLypzd2l0Y2gqLwotICAgIH0JCQkJLyogZm9yICovCi0KLSAgLyogV2UgZW5kIHVwIGhlcmUgaWYgdGhlcmUgd2VyZSBubyBicmFja2V0cyBpbiB0aGlzIGZ1bmN0aW9uLgotICAgICBEZWZpbmUgZXZlcnl0aGluZy4gICovCi0gIERlZmluZV9Mb2NhbF9TeW1ib2xzIChzMFAsIChzeW1ib2xTICopMCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLSAgcmV0dXJuIHMxUDsKLX0KLQwKLQotI2lmbmRlZiBWTVMKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci1zdGF0aWMgdm9pZCBnZXRfVk1TX3RpbWVfb25fdW5peCBQQVJBTVMgKChjaGFyICopKTsKLQotLyogTWFudWZhY3R1cmUgYSBWTVMtbGlrZSB0aW1lIHN0cmluZyBvbiBhIFVuaXggYmFzZWQgc3lzdGVtLiAgKi8KLXN0YXRpYyB2b2lkCi1nZXRfVk1TX3RpbWVfb25fdW5peCAoTm93KQotICAgICBjaGFyICpOb3c7Ci17Ci0gIGNoYXIgKnBudDsKLSAgdGltZV90IHRpbWViOwotCi0gIHRpbWUgKCZ0aW1lYik7Ci0gIHBudCA9IGN0aW1lICgmdGltZWIpOwotICBwbnRbM10gPSAwOwotICBwbnRbN10gPSAwOwotICBwbnRbMTBdID0gMDsKLSAgcG50WzE2XSA9IDA7Ci0gIHBudFsyNF0gPSAwOwotICBzcHJpbnRmIChOb3csICIlMnMtJTNzLSVzICVzIiwgcG50ICsgOCwgcG50ICsgNCwgcG50ICsgMjAsIHBudCArIDExKTsKLX0KLSNlbmRpZiAvKiBub3QgVk1TICovCi0KLQotLyogV3JpdGUgdGhlIE1IRCAoTW9kdWxlIEhlYWRlcikgcmVjb3Jkcy4gICovCi0KLXN0YXRpYyB2b2lkCi1Xcml0ZV9WTVNfTUhEX1JlY29yZHMgKCkKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7Ci0gIHJlZ2lzdGVyIGNoYXIgKmNwMTsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0jaWZkZWYgVk1TCi0gIHN0cnVjdCB7IHVuc2lnbmVkIHNob3J0IGxlbiwgbWJ6OyBjaGFyICpwdHI7IH0gRGVzY3JpcHRvcjsKLSNlbmRpZgotICBjaGFyIE5vd1sxNysxXTsKLQotICAvKiBXZSBhcmUgd3JpdGluZyBhIG1vZHVsZSBoZWFkZXIgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfSERSKTsKLSAgLyoKLSAgICoJKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCSpNQUlOIE1PRFVMRSBIRUFERVIgUkVDT1JEKgotICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICovCi0gIC8qIFN0b3JlIHJlY29yZCB0eXBlIGFuZCBoZWFkZXIgdHlwZS4gICovCi0gIFBVVF9DSEFSIChPQkpfU19DX0hEUik7Ci0gIFBVVF9DSEFSIChNSERfU19DX01IRCk7Ci0gIC8qIFN0cnVjdHVyZSBsZXZlbCBpcyAwLiAgKi8KLSAgUFVUX0NIQVIgKE9CSl9TX0NfU1RSTFZMKTsKLSAgLyogTWF4aW11bSByZWNvcmQgc2l6ZSBpcyBzaXplIG9mIHRoZSBvYmplY3QgcmVjb3JkIGJ1ZmZlci4gICovCi0gIFBVVF9TSE9SVCAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikpOwotCi0JLyoKLQkgKglGSVhNRTogIG1vZHVsZSBuYW1lIGFuZCB2ZXJzaW9uIHNob3VsZCBiZSB1c2VyCi0JICoJCXNwZWNpZmlhYmxlIHZpYSBgLmlkZW50JyBhbmQvb3IgYCNwcmFnbWEgaWRlbnQnLgotCSAqLwotCi0gIC8qIEdldCBtb2R1bGUgbmFtZSAodGhlIEZJTEVOQU1FIHBhcnQgb2YgdGhlIG9iamVjdCBmaWxlKS4gICovCi0gIGNwID0gb3V0X2ZpbGVfbmFtZTsKLSAgY3AxID0gTW9kdWxlX05hbWU7Ci0gIHdoaWxlICgqY3ApCi0gICAgewotICAgICAgaWYgKCpjcCA9PSAnXScgfHwgKmNwID09ICc+JyB8fCAqY3AgPT0gJzonIHx8ICpjcCA9PSAnLycpCi0JewotCSAgY3AxID0gTW9kdWxlX05hbWU7Ci0JICBjcCsrOwotCSAgY29udGludWU7Ci0JfQotICAgICAgKmNwMSsrID0gaXNsb3dlciAoKmNwKSA/IHRvdXBwZXIgKCpjcCsrKSA6ICpjcCsrOwotICAgIH0KLSAgKmNwMSA9ICdcMCc7Ci0KLSAgLyogTGltaXQgaXQgdG8gMzEgY2hhcmFjdGVycyBhbmQgc3RvcmUgaW4gdGhlIG9iamVjdCByZWNvcmQuICAqLwotICB3aGlsZSAoLS1jcDEgPj0gTW9kdWxlX05hbWUpCi0gICAgaWYgKCpjcDEgPT0gJy4nKQotICAgICAgKmNwMSA9ICdcMCc7Ci0gIGlmIChzdHJsZW4gKE1vZHVsZV9OYW1lKSA+IDMxKQotICAgIHsKLSAgICAgIGlmIChmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQlhc190c2t0c2sgKF8oIk1vZHVsZSBuYW1lIHRydW5jYXRlZDogJXNcbiIpLCBNb2R1bGVfTmFtZSk7Ci0gICAgICBNb2R1bGVfTmFtZVszMV0gPSAnXDAnOwotICAgIH0KLSAgUFVUX0NPVU5URURfU1RSSU5HIChNb2R1bGVfTmFtZSk7Ci0gIC8qIE1vZHVsZSBWZXJzaW9uIGlzICJWMS4wIi4gICovCi0gIFBVVF9DT1VOVEVEX1NUUklORyAoIlYxLjAiKTsKLSAgLyogQ3JlYXRpb24gdGltZSBpcyAibm93IiAoMTcgY2hhcnMgb2YgdGltZSBzdHJpbmcpOiAiZGQtTU1NLXl5eXkgaGg6bW0iLiAgKi8KLSNpZm5kZWYgVk1TCi0gIGdldF9WTVNfdGltZV9vbl91bml4IChOb3cpOwotI2Vsc2UgLyogVk1TICovCi0gIERlc2NyaXB0b3IubGVuID0gc2l6ZW9mIE5vdyAtIDE7Ci0gIERlc2NyaXB0b3IubWJ6ID0gMDsJCS8qIHR5cGUgJiBjbGFzcyB1bnNwZWNpZmllZCAqLwotICBEZXNjcmlwdG9yLnB0ciA9IE5vdzsKLSAgKHZvaWQpIHN5cyRhc2N0aW0gKCh1bnNpZ25lZCBzaG9ydCAqKTAsICZEZXNjcmlwdG9yLCAobG9uZyAqKTAsIDApOwotI2VuZGlmIC8qIFZNUyAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKLSAgICBQVVRfQ0hBUiAoTm93W2ldKTsKLSAgLyogUGF0Y2ggdGltZSBpcyAibmV2ZXIiICgxNyB6ZXJvcykuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKLSAgICBQVVRfQ0hBUiAoMCk7Ci0gIC8qIEZvcmNlIHRoaXMgdG8gYmUgYSBzZXBhcmF0ZSBvdXRwdXQgcmVjb3JkLiAgKi8KLSAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotCi0gIC8qCi0gICAqCSoqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoJKkxBTkdVQUdFIFBST0NFU1NPUiBOQU1FKgotICAgKgkqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqLwotICAvKiBTdG9yZSByZWNvcmQgdHlwZSBhbmQgaGVhZGVyIHR5cGUuICAqLwotICBQVVRfQ0hBUiAoT0JKX1NfQ19IRFIpOwotICBQVVRfQ0hBUiAoTUhEX1NfQ19MTk0pOwotICAvKgotICAgKiBTdG9yZSBsYW5ndWFnZSBwcm9jZXNzb3IgbmFtZSBhbmQgdmVyc2lvbiAobm90IGEgY291bnRlZCBzdHJpbmchKS4KLSAgICoKLSAgICogVGhpcyBpcyBub3JtYWxseSBzdXBwbGllZCBieSB0aGUgZ2NjIGRyaXZlciBmb3IgdGhlIGNvbW1hbmQgbGluZQotICAgKiB3aGljaCBpbnZva2VzIGdhcy4gIElmIGFic2VudCwgd2UgZmFsbCBiYWNrIHRvIGdhcydzIHZlcnNpb24uCi0gICAqLwotICBjcCA9IGNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nOwotICBpZiAoY3AgPT0gMCkKLSAgICB7Ci0gICAgICBjcCA9ICJHTlUgQVMgIFYiOwotICAgICAgd2hpbGUgKCpjcCkKLQlQVVRfQ0hBUiAoKmNwKyspOwotICAgICAgY3AgPSBWRVJTSU9OOwotICAgIH0KLSAgd2hpbGUgKCpjcCA+PSAnICcpCi0gICAgUFVUX0NIQVIgKCpjcCsrKTsKLSAgLyogRm9yY2UgdGhpcyB0byBiZSBhIHNlcGFyYXRlIG91dHB1dCByZWNvcmQuICAqLwotICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0KLQotLyogV3JpdGUgdGhlIEVPTSAoRW5kIE9mIE1vZHVsZSkgcmVjb3JkLiAgKi8KLQotc3RhdGljIHZvaWQKLVdyaXRlX1ZNU19FT01fUmVjb3JkIChQc2VjdCwgT2Zmc2V0KQotICAgICBpbnQgUHNlY3Q7Ci0gICAgIHZhbHVlVCBPZmZzZXQ7Ci17Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGFuIGVuZC1vZi1tb2R1bGUgcmVjb3JkCi0gICAqCSh0aGlzIGFzc3VtZXMgdGhhdCB0aGUgZW50cnkgcG9pbnQgd2lsbCBhbHdheXMgYmUgaW4gYSBwc2VjdAotICAgKgkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgYnl0ZSwgd2hpY2ggaXMgdGhlIGNhc2UgZm9yIGNvZGUgaW4KLSAgICoJIFRleHRfUHNlY3Q9PTApCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19FT00pOwotICBQVVRfQ0hBUiAoT0JKX1NfQ19FT00pOwkvKiBSZWNvcmQgdHlwZS4gICovCi0gIFBVVF9DSEFSICgwKTsJCQkvKiBFcnJvciBzZXZlcml0eSBsZXZlbCAod2UgaWdub3JlIGl0KS4gKi8KLSAgLyoKLSAgICoJU3RvcmUgdGhlIGVudHJ5IHBvaW50LCBpZiBpdCBleGlzdHMKLSAgICovCi0gIGlmIChQc2VjdCA+PSAwKQotICAgIHsKLSAgICAgIFBVVF9DSEFSIChQc2VjdCk7Ci0gICAgICBQVVRfTE9ORyAoT2Zmc2V0KTsKLSAgICB9Ci0gIC8qIEZsdXNoIHRoZSByZWNvcmQ7IHRoaXMgd2lsbCBiZSBvdXIgZmluYWwgb3V0cHV0LiAgKi8KLSAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKiB0aGlzIGhhc2ggcm91dGluZSBib3Jyb3dlZCBmcm9tIEdOVS1FTUFDUywgYW5kIHN0cmVuZ3RoZW5lZCBzbGlnaHRseSAgRVJZKi8KLQotc3RhdGljIGludAotaGFzaF9zdHJpbmcgKHB0cikKLSAgICAgY29uc3QgY2hhciAqcHRyOwotewotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOwotICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBwICsgc3RybGVuIChwdHIpOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGludCBoYXNoID0gMDsKLQotICB3aGlsZSAocCAhPSBlbmQpCi0gICAgewotICAgICAgYyA9ICpwKys7Ci0gICAgICBoYXNoID0gKChoYXNoIDw8IDMpICsgKGhhc2ggPDwgMTUpICsgKGhhc2ggPj4gMjgpICsgYyk7Ci0gICAgfQotICByZXR1cm4gaGFzaDsKLX0KLQotLyoKLSAqCUdlbmVyYXRlIGEgQ2FzZS1IYWNrZWQgVk1TIHN5bWJvbCBuYW1lIChsaW1pdGVkIHRvIDMxIGNoYXJzKQotICovCi1zdGF0aWMgdm9pZAotVk1TX0Nhc2VfSGFja19TeW1ib2wgKEluLCBPdXQpCi0gICAgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKkluOwotICAgICByZWdpc3RlciBjaGFyICpPdXQ7Ci17Ci0gIGxvbmcgaW50IGluaXQ7Ci0gIGxvbmcgaW50IHJlc3VsdDsKLSAgY2hhciAqcG50ID0gMDsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIGNvbnN0IGNoYXIgKm9sZF9uYW1lOwotICByZWdpc3RlciBpbnQgaTsKLSAgaW50IGRlc3RydWN0b3IgPSAwOwkJLypoYWNrIHRvIGFsbG93IGZvciBjYXNlIHNlbnMgaW4gYSBkZXN0cnVjdG9yKi8KLSAgaW50IHRydW5jYXRlID0gMDsKLSAgaW50IENhc2VfSGFja19CaXRzID0gMDsKLSAgaW50IFNhd19Eb2xsYXIgPSAwOwotICBzdGF0aWMgY2hhciBIZXhfVGFibGVbMTZdID0KLSAgeycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJ307Ci0KLSAgLyoKLSAgICoJS2lsbCBhbnkgbGVhZGluZyAiXyIKLSAgICovCi0gIGlmICgoSW5bMF0gPT0gJ18nKSAmJiAoKEluWzFdID4gJzknKSB8fCAoSW5bMV0gPCAnMCcpKSkKLSAgICBJbisrOwotCi0gIG5ld19uYW1lID0gT3V0OwkJLyogc2F2ZSB0aGlzIGZvciBsYXRlciovCi0KLSNpZiBiYXJmb28JCQkvKiBEZWFkIGNvZGUgKi8KLSAgaWYgKChJblswXSA9PSAnXycpICYmIChJblsxXSA9PSAnJCcpICYmIChJblsyXSA9PSAnXycpKQotICAgIGRlc3RydWN0b3IgPSAxOwotI2VuZGlmCi0KLSAgLyogV2UgbWF5IG5lZWQgdG8gdHJ1bmNhdGUgdGhlIHN5bWJvbCwgc2F2ZSB0aGUgaGFzaCBmb3IgbGF0ZXIqLwotICByZXN1bHQgPSAoc3RybGVuIChJbikgPiAyMykgPyBoYXNoX3N0cmluZyAoSW4pIDogMDsKLSAgLyoKLSAgICoJSXMgdGhlcmUgYSBQc2VjdCBBdHRyaWJ1dGUgdG8gc2tpcD8/Ci0gICAqLwotICBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKEluKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJWWVzOiBTa2lwIGl0Ci0gICAgICAgKi8KLSAgICAgIEluICs9IFBTRUNUX0FUVFJJQlVURVNfU1RSSU5HX0xFTkdUSDsKLSAgICAgIHdoaWxlICgqSW4pCi0JewotCSAgaWYgKChJblswXSA9PSAnJCcpICYmIChJblsxXSA9PSAnJCcpKQotCSAgICB7Ci0JICAgICAgSW4gKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgSW4rKzsKLQl9Ci0gICAgfQotCi0gIG9sZF9uYW1lID0gSW47Ci0vKglpZiAoc3RybGVuIChJbikgPiAzMSAmJiBmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQkgIGFzX3Rza3RzayAoIlN5bWJvbCBuYW1lIHRydW5jYXRlZDogJXNcbiIsIEluKTsgKi8KLSAgLyoKLSAgICoJRG8gdGhlIGNhc2UgY29udmVyc2lvbgotICAgKi8KLSAgaSA9IDIzOwkJCS8qIE1heGltdW0gb2YgMjMgY2hhcnMgKi8KLSAgd2hpbGUgKCpJbiAmJiAoLS1pID49IDApKQotICAgIHsKLSAgICAgIENhc2VfSGFja19CaXRzIDw8PSAxOwotICAgICAgaWYgKCpJbiA9PSAnJCcpCi0JU2F3X0RvbGxhciA9IDE7Ci0gICAgICBpZiAoKGRlc3RydWN0b3IgPT0gMSkgJiYgKGkgPT0gMjEpKQotCVNhd19Eb2xsYXIgPSAwOwotICAgICAgc3dpdGNoICh2bXNfbmFtZV9tYXBwaW5nKQotCXsKLQljYXNlIDA6Ci0JICBpZiAoaXN1cHBlciAoKkluKSkgewotCSAgICAqT3V0KysgPSAqSW4rKzsKLQkgICAgQ2FzZV9IYWNrX0JpdHMgfD0gMTsKLQkgIH0gZWxzZSB7Ci0JICAgICpPdXQrKyA9IGlzbG93ZXIgKCpJbikgPyB0b3VwcGVyICgqSW4rKykgOiAqSW4rKzsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgMzogKk91dCsrID0gKkluKys7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBpZiAoaXNsb3dlciAoKkluKSkgewotCSAgICAqT3V0KysgPSAqSW4rKzsKLQkgIH0gZWxzZSB7Ci0JICAgICpPdXQrKyA9IGlzdXBwZXIgKCpJbikgPyB0b2xvd2VyICgqSW4rKykgOiAqSW4rKzsKLQkgIH0KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqCUlmIHdlIHNhdyBhIGRvbGxhciBzaWduLCB3ZSBkb24ndCBkbyBjYXNlIGhhY2tpbmcKLSAgICovCi0gIGlmIChmbGFnX25vX2hhc2hfbWl4ZWRfY2FzZSB8fCBTYXdfRG9sbGFyKQotICAgIENhc2VfSGFja19CaXRzID0gMDsKLQotICAvKgotICAgKglJZiB3ZSBoYXZlIG1vcmUgdGhhbiAyMyBjaGFyYWN0ZXJzIGFuZCBldmVyeXRoaW5nIGlzIGxvd2VyY2FzZQotICAgKgl3ZSBjYW4gaW5zZXJ0IHRoZSBmdWxsIDMxIGNoYXJhY3RlcnMKLSAgICovCi0gIGlmICgqSW4pCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVdlICBoYXZlIG1vcmUgdGhhbiAyMyBjaGFyYWN0ZXJzCi0gICAgICAgKiBJZiB3ZSBtdXN0IGFkZCB0aGUgY2FzZSBoYWNrLCB0aGVuIHdlIGhhdmUgdHJ1bmNhdGVkIHRoZSBzdHIKLSAgICAgICAqLwotICAgICAgcG50ID0gT3V0OwotICAgICAgdHJ1bmNhdGUgPSAxOwotICAgICAgaWYgKENhc2VfSGFja19CaXRzID09IDApCi0JewotCSAgLyoKLQkgICAqCUFuZCBzbyBmYXIgdGhleSBhcmUgYWxsIGxvd2VyIGNhc2U6Ci0JICAgKgkJQ2hlY2sgdXAgdG8gOCBtb3JlIGNoYXJhY3RlcnMKLQkgICAqCQlhbmQgZW5zdXJlIHRoYXQgdGhleSBhcmUgbG93ZXJjYXNlCi0JICAgKi8KLQkgIGZvciAoaSA9IDA7IChJbltpXSAhPSAwKSAmJiAoaSA8IDgpOyBpKyspCi0JICAgIGlmIChpc3VwcGVyIChJbltpXSkgJiYgIVNhd19Eb2xsYXIgJiYgIWZsYWdfbm9faGFzaF9taXhlZF9jYXNlKQotCSAgICAgIGJyZWFrOwotCi0JICBpZiAoSW5baV0gPT0gMCkKLQkgICAgdHJ1bmNhdGUgPSAwOwotCi0JICBpZiAoKGkgPT0gOCkgfHwgKEluW2ldID09IDApKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKglUaGV5IGFyZTogIENvcHkgdXAgdG8gMzEgY2hhcmFjdGVycwotCSAgICAgICAqCQkJdG8gdGhlIG91dHB1dCBzdHJpbmcKLQkgICAgICAgKi8KLQkgICAgICBpID0gODsKLQkgICAgICB3aGlsZSAoKC0taSA+PSAwKSAmJiAoKkluKSkKLQkJc3dpdGNoICh2bXNfbmFtZV9tYXBwaW5nKXsKLQkJY2FzZSAwOiAqT3V0KysgPSBpc2xvd2VyICgqSW4pID8gdG91cHBlciAoKkluKyspIDogKkluKys7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMzogKk91dCsrID0gKkluKys7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjogKk91dCsrID0gaXN1cHBlciAoKkluKSA/IHRvbG93ZXIgKCpJbisrKSA6ICpJbisrOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKgotICAgKglJZiB0aGVyZSB3ZXJlIGFueSB1cHBlcmNhc2UgY2hhcmFjdGVycyBpbiB0aGUgbmFtZSB3ZQotICAgKgl0YWtlIG9uIHRoZSBjYXNlIGhhY2tpbmcgc3RyaW5nCi0gICAqLwotCi0gIC8qIE9sZCBiZWhhdmlvciBmb3IgcmVndWxhciBHTlUtQyBjb21waWxlciAqLwotICBpZiAoIWZsYWdfaGFzaF9sb25nX25hbWVzKQotICAgIHRydW5jYXRlID0gMDsKLSAgaWYgKChDYXNlX0hhY2tfQml0cyAhPSAwKSB8fCAodHJ1bmNhdGUgPT0gMSkpCi0gICAgewotICAgICAgaWYgKHRydW5jYXRlID09IDApCi0JewotCSAgKk91dCsrID0gJ18nOwotCSAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkgICAgewotCSAgICAgICpPdXQrKyA9IEhleF9UYWJsZVtDYXNlX0hhY2tfQml0cyAmIDB4Zl07Ci0JICAgICAgQ2FzZV9IYWNrX0JpdHMgPj49IDQ7Ci0JICAgIH0KLQkgICpPdXQrKyA9ICdYJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgT3V0ID0gcG50OwkJLypDdXQgYmFjayB0byAyMyBjaGFyYWN0ZXJzIG1heGltdW0gKi8KLQkgICpPdXQrKyA9ICdfJzsKLQkgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0JICAgIHsKLQkgICAgICBpbml0ID0gcmVzdWx0ICYgMHgwMWY7Ci0JICAgICAgKk91dCsrID0gKGluaXQgPCAxMCkgPyAoJzAnICsgaW5pdCkgOiAoJ0EnICsgaW5pdCAtIDEwKTsKLQkgICAgICByZXN1bHQgPSByZXN1bHQgPj4gNTsKLQkgICAgfQotCX0KLSAgICB9CQkJCS8qQ2FzZSBIYWNrICovCi0gIC8qCi0gICAqCURvbmUKLSAgICovCi0gICpPdXQgPSAwOwotICBpZiAodHJ1bmNhdGUgPT0gMSAmJiBmbGFnX2hhc2hfbG9uZ19uYW1lcyAmJiBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpCi0gICAgYXNfdHNrdHNrIChfKCJTeW1ib2wgJXMgcmVwbGFjZWQgYnkgJXNcbiIpLCBvbGRfbmFtZSwgbmV3X25hbWUpOwotfQotDAotCi0vKgotICoJU2NhbiBhIHN5bWJvbCBuYW1lIGZvciBhIHBzZWN0IGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9uCi0gKi8KLSNkZWZpbmUgR0xPQkFMU1lNQk9MX0JJVAkweDEwMDAwCi0jZGVmaW5lIEdMT0JBTFZBTFVFX0JJVAkJMHgyMDAwMAotCi0KLXN0YXRpYyB2b2lkCi1WTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKE5hbWUsIEF0dHJpYnV0ZV9Qb2ludGVyKQotICAgICBjb25zdCBjaGFyICpOYW1lOwotICAgICBpbnQgKkF0dHJpYnV0ZV9Qb2ludGVyOwotewotICByZWdpc3RlciBpbnQgaTsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqY3A7Ci0gIGludCBOZWdhdGU7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QKLSAgewotICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgaW50IFZhbHVlOwotICB9IEF0dHJpYnV0ZXNbXSA9Ci0gIHsKLSAgICB7IlBJQyIsIEdQU19TX01fUElDfSwKLSAgICB7IkxJQiIsIEdQU19TX01fTElCfSwKLSAgICB7Ik9WUiIsIEdQU19TX01fT1ZSfSwKLSAgICB7IlJFTCIsIEdQU19TX01fUkVMfSwKLSAgICB7IkdCTCIsIEdQU19TX01fR0JMfSwKLSAgICB7IlNIUiIsIEdQU19TX01fU0hSfSwKLSAgICB7IkVYRSIsIEdQU19TX01fRVhFfSwKLSAgICB7IlJEIiwgR1BTX1NfTV9SRH0sCi0gICAgeyJXUlQiLCBHUFNfU19NX1dSVH0sCi0gICAgeyJWRUMiLCBHUFNfU19NX1ZFQ30sCi0gICAgeyJHTE9CQUxTWU1CT0wiLCBHTE9CQUxTWU1CT0xfQklUfSwKLSAgICB7IkdMT0JBTFZBTFVFIiwgR0xPQkFMVkFMVUVfQklUfSwKLSAgICB7MCwgMH0KLSAgfTsKLQotICAvKgotICAgKglLaWxsIGxlYWRpbmcgIl8iCi0gICAqLwotICBpZiAoKk5hbWUgPT0gJ18nKQotICAgIE5hbWUrKzsKLSAgLyoKLSAgICoJQ2hlY2sgZm9yIGEgUFNFQ1QgYXR0cmlidXRlIGxpc3QKLSAgICovCi0gIGlmICghSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotICAgIHJldHVybjsJCQkvKiBJZiBub3QsIHJldHVybiAqLwotICAvKgotICAgKglTa2lwIHRoZSBhdHRyaWJ1dGUgbGlzdCBpbmRpY2F0b3IKLSAgICovCi0gIE5hbWUgKz0gUFNFQ1RfQVRUUklCVVRFU19TVFJJTkdfTEVOR1RIOwotICAvKgotICAgKglQcm9jZXNzIHRoZSBhdHRyaWJ1dGVzICgiXyIgc2VwYXJhdGVkLCAiJCIgdGVybWluYXRlZCkKLSAgICovCi0gIHdoaWxlICgqTmFtZSAhPSAnJCcpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCUFzc3VtZSBub3QgbmVnYXRpbmcKLSAgICAgICAqLwotICAgICAgTmVnYXRlID0gMDsKLSAgICAgIC8qCi0gICAgICAgKglDaGVjayBmb3IgIk5PIgotICAgICAgICovCi0gICAgICBpZiAoKE5hbWVbMF0gPT0gJ04nKSAmJiAoTmFtZVsxXSA9PSAnTycpKQotCXsKLQkgIC8qCi0JICAgKglXZSBhcmUgbmVnYXRpbmcgKGFuZCBza2lwIHRoZSBOTykKLQkgICAqLwotCSAgTmVnYXRlID0gMTsKLQkgIE5hbWUgKz0gMjsKLQl9Ci0gICAgICAvKgotICAgICAgICoJRmluZCB0aGUgdG9rZW4gZGVsaW1pdGVyCi0gICAgICAgKi8KLSAgICAgIGNwID0gTmFtZTsKLSAgICAgIHdoaWxlICgqY3AgJiYgKCpjcCAhPSAnXycpICYmICgqY3AgIT0gJyQnKSkKLQljcCsrOwotICAgICAgLyoKLSAgICAgICAqCUxvb2sgZm9yIHRoZSB0b2tlbiBpbiB0aGUgYXR0cmlidXRlIGxpc3QKLSAgICAgICAqLwotICAgICAgZm9yIChpID0gMDsgQXR0cmlidXRlc1tpXS5OYW1lOyBpKyspCi0JewotCSAgLyoKLQkgICAqCUlmIHRoZSBzdHJpbmdzIG1hdGNoLCBzZXQvY2xlYXIgdGhlIGF0dHIuCi0JICAgKi8KLQkgIGlmIChzdHJuY21wIChOYW1lLCBBdHRyaWJ1dGVzW2ldLk5hbWUsIGNwIC0gTmFtZSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICoJU2V0IG9yIGNsZWFyCi0JICAgICAgICovCi0JICAgICAgaWYgKE5lZ2F0ZSkKLQkJKkF0dHJpYnV0ZV9Qb2ludGVyICY9Ci0JCSAgfkF0dHJpYnV0ZXNbaV0uVmFsdWU7Ci0JICAgICAgZWxzZQotCQkqQXR0cmlidXRlX1BvaW50ZXIgfD0KLQkJICBBdHRyaWJ1dGVzW2ldLlZhbHVlOwotCSAgICAgIC8qCi0JICAgICAgICoJRG9uZQotCSAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgLyoKLSAgICAgICAqCU5vdyBza2lwIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAqLwotICAgICAgTmFtZSA9IGNwOwotICAgICAgaWYgKCpOYW1lID09ICdfJykKLQlOYW1lKys7Ci0gICAgfQotfQotDAotCi0jZGVmaW5lIEdCTFNZTV9SRUYgMAotI2RlZmluZSBHQkxTWU1fREVGIDEKLSNkZWZpbmUgR0JMU1lNX1ZBTCAyCi0jZGVmaW5lIEdCTFNZTV9MQ0wgNAkvKiBub3QgR0JMIGFmdGVyIGFsbC4uLiAqLwotI2RlZmluZSBHQkxTWU1fV0VBSyA4Ci0KLS8qCi0gKglEZWZpbmUgYSBnbG9iYWwgc3ltYm9sIChvciBwb3NzaWJseSBhIGxvY2FsIG9uZSkuCi0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCBQc2VjdF9OdW1iZXIsIFBzZWN0X09mZnNldCwgRmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgIGludCBQc2VjdF9OdW1iZXI7Ci0gICAgIGludCBQc2VjdF9PZmZzZXQ7Ci0gICAgIGludCBGbGFnczsKLXsKLSAgY2hhciBMb2NhbFszMl07Ci0KLSAgLyoKLSAgICoJV2UgYXJlIHdyaXRpbmcgYSBHU0QgcmVjb3JkCi0gICAqLwotICBTZXRfVk1TX09iamVjdF9GaWxlX1JlY29yZCAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglJZiB0aGUgYnVmZmVyIGlzIGVtcHR5IHdlIG11c3QgaW5zZXJ0IHRoZSBHU0QgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChPQkpfU19DX0dTRCk7Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR2xvYmFsIChvciBsb2NhbCkgc3ltYm9sIGRlZmluaXRpb24gc3VicmVjb3JkLgotICAgKi8KLSAgUFVUX0NIQVIgKChGbGFncyAmIEdCTFNZTV9MQ0wpICE9IDAgPyBHU0RfU19DX0xTWSA6Ci0JICAgICgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpID8gR1NEX1NfQ19TWU0gOiBHU0RfU19DX1NZTVcpOwotICAvKgotICAgKglEYXRhIHR5cGUgaXMgdW5kZWZpbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMCk7Ci0gIC8qCi0gICAqCVN3aXRjaCBvbiBEZWZpbml0aW9uL1JlZmVyZW5jZQotICAgKi8KLSAgaWYgKChGbGFncyAmIEdCTFNZTV9ERUYpID09IDApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqCVJlZmVyZW5jZQotICAgICAgICovCi0gICAgICBQVVRfU0hPUlQgKCgoRmxhZ3MgJiBHQkxTWU1fVkFMKSA9PSAwKSA/IEdTWV9TX01fUkVMIDogMCk7Ci0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgIT0gMCkJLyogbG9jYWwgc3ltYm9scyBoYXZlIGV4dHJhIGZpZWxkICovCi0JUFVUX1NIT1JUIChDdXJyZW50X0Vudmlyb25tZW50KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc3ltX2ZsYWdzOwotCi0gICAgICAvKgotICAgICAgICoJRGVmaW5pdGlvbgotICAgICAgICpbIGFzc2VydCAoTFNZX1NfTV9ERUYgPT0gR1NZX1NfTV9ERUYgJiYgTFNZX1NfTV9SRUwgPT0gR1NZX1NfTV9SRUwpOyBdCi0gICAgICAgKi8KLSAgICAgIHN5bV9mbGFncyA9IEdTWV9TX01fREVGOwotICAgICAgaWYgKEZsYWdzICYgR0JMU1lNX1dFQUspCi0Jc3ltX2ZsYWdzIHw9IEdTWV9TX01fV0VBSzsKLSAgICAgIGlmICgoRmxhZ3MgJiBHQkxTWU1fVkFMKSA9PSAwKQotCXN5bV9mbGFncyB8PSBHU1lfU19NX1JFTDsKLSAgICAgIFBVVF9TSE9SVCAoc3ltX2ZsYWdzKTsKLSAgICAgIGlmICgoRmxhZ3MgJiBHQkxTWU1fTENMKSAhPSAwKQkvKiBsb2NhbCBzeW1ib2xzIGhhdmUgZXh0cmEgZmllbGQgKi8KLQlQVVRfU0hPUlQgKEN1cnJlbnRfRW52aXJvbm1lbnQpOwotICAgICAgLyoKLSAgICAgICAqCVBzZWN0IE51bWJlcgotICAgICAgICovCi0gICAgICBpZiAoKEZsYWdzICYgR0JMU1lNX0xDTCkgPT0gMCAmJiAodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpCi0JUFVUX0NIQVIgKFBzZWN0X051bWJlcik7Ci0gICAgICBlbHNlCi0JUFVUX1NIT1JUIChQc2VjdF9OdW1iZXIpOwotICAgICAgLyoKLSAgICAgICAqCU9mZnNldAotICAgICAgICovCi0gICAgICBQVVRfTE9ORyAoUHNlY3RfT2Zmc2V0KTsKLSAgICB9Ci0gIC8qCi0gICAqCUZpbmFsbHksIHRoZSBnbG9iYWwgc3ltYm9sIG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQotLyoKLSAqCURlZmluZSBhbiBlbnZpcm9ubWVudCB0byBzdXBwb3J0IGxvY2FsIHN5bWJvbCByZWZlcmVuY2VzLgotICoJVGhpcyBpcyBqdXN0IHRvIG1vbGxpZnkgdGhlIGxpbmtlcjsgd2UgZG9uJ3QgYWN0dWFsbHkgZG8KLSAqCWFueXRoaW5nIHVzZWZ1bCB3aXRoIGl0LgotICovCi1zdGF0aWMgdm9pZAotVk1TX0xvY2FsX0Vudmlyb25tZW50X1NldHVwIChFbnZfTmFtZSkKLSAgICBjb25zdCBjaGFyICpFbnZfTmFtZTsKLXsKLSAgLyogV2UgYXJlIHdyaXRpbmcgYSBHU0QgcmVjb3JkLiAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyogSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID09IDApCi0gICAgUFVUX0NIQVIgKE9CSl9TX0NfR1NEKTsKLSAgLyogV2UgYXJlIHdyaXRpbmcgYW4gRU5WIHN1YnJlY29yZC4gICovCi0gIFBVVF9DSEFSIChHU0RfU19DX0VOVik7Ci0KLSAgKytDdXJyZW50X0Vudmlyb25tZW50OwkvKiBpbmRleCBvZiBlbnZpcm9ubWVudCBiZWluZyBkZWZpbmVkICovCi0KLSAgLyogRU5WJFdfRkxBR1M6ICB3ZSBhcmUgZGVmaW5pbmcgdGhlIG5leHQgZW52aXJvbm1lbnQuICBJdCdzIG5vdCBuZXN0ZWQuICAqLwotICBQVVRfU0hPUlQgKEVOVl9TX01fREVGKTsKLSAgLyogRU5WJFdfRU5WSU5EWDogIGluZGV4IGlzIGFsd2F5cyAwIGZvciBub24tbmVzdGVkIGRlZmluaXRpb25zLiAgKi8KLSAgUFVUX1NIT1JUICgwKTsKLQotICAvKiBFTlYkQl9OQU1MTkcgKyBFTlYkVF9OQU1FOiAgZW52aXJvbm1lbnQgbmFtZSBpbiBBU0NJQyBmb3JtYXQuICAqLwotICBpZiAoIUVudl9OYW1lKSBFbnZfTmFtZSA9ICIiOwotICBQVVRfQ09VTlRFRF9TVFJJTkcgKChjaGFyICopRW52X05hbWUpOwotCi0gIC8qIEZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsLiAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCURlZmluZSBhIHBzZWN0Ci0gKi8KLXN0YXRpYyBpbnQKLVZNU19Qc2VjdF9TcGVjIChOYW1lLCBTaXplLCBUeXBlLCB2c3ApCi0gICAgIGNvbnN0IGNoYXIgKk5hbWU7Ci0gICAgIGludCBTaXplOwotICAgICBlbnVtIHBzX3R5cGUgVHlwZTsKLSAgICAgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLXsKLSAgY2hhciBMb2NhbFszMl07Ci0gIGludCBQc2VjdF9BdHRyaWJ1dGVzOwotCi0gIC8qCi0gICAqCUdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBQU0VDVCBmbGFncyBnaXZlbiB0aGUgUFNFQ1QgdHlwZQotICAgKi8KLSAgc3dpdGNoIChUeXBlKQotICAgIHsKLSAgICBjYXNlIHBzX1RFWFQ6Ci0gICAgICAvKiBUZXh0IHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxub0dCTCxTSFIsRVhFLFJELG5vV1JULiAqLwotICAgICAgUHNlY3RfQXR0cmlidXRlcyA9IChHUFNfU19NX1BJQ3xHUFNfU19NX1JFTHxHUFNfU19NX1NIUnxHUFNfU19NX0VYRQotCQkJICB8R1BTX1NfTV9SRCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHBzX0RBVEE6Ci0gICAgICAvKiBEYXRhIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxub0dCTCxub1NIUixub0VYRSxSRCxXUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fUkR8R1BTX1NfTV9XUlQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwc19DT01NT046Ci0gICAgICAvKiBDb21tb24gYmxvY2sgcHNlY3RzIGFyZTogIFBJQyxPVlIsUkVMLEdCTCxub1NIUixub0VYRSxSRCxXUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMCi0JCQkgIHxHUFNfU19NX1JEfEdQU19TX01fV1JUKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfQ09OU1Q6Ci0gICAgICAvKiBDb25zdCBkYXRhIHBzZWN0cyBhcmU6ICBQSUMsT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fT1ZSfEdQU19TX01fUkVMfEdQU19TX01fR0JMCi0JCQkgIHxHUFNfU19NX1JEKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgcHNfQ1RPUlM6Ci0gICAgICAvKiBDdG9yIHBzZWN0cyBhcmUgUElDLG5vT1ZSLFJFTCxHQkwsbm9TSFIsbm9FWEUsUkQsbm9XUlQuICovCi0gICAgICBQc2VjdF9BdHRyaWJ1dGVzID0gKEdQU19TX01fUElDfEdQU19TX01fUkVMfEdQU19TX01fR0JMfEdQU19TX01fUkQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBwc19EVE9SUzoKLSAgICAgIC8qIER0b3IgcHNlY3RzIGFyZSBQSUMsbm9PVlIsUkVMLEdCTCxub1NIUixub0VYRSxSRCxub1dSVC4gKi8KLSAgICAgIFBzZWN0X0F0dHJpYnV0ZXMgPSAoR1BTX1NfTV9QSUN8R1BTX1NfTV9SRUx8R1BTX1NfTV9HQkx8R1BTX1NfTV9SRCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgLyogaW1wb3NzaWJsZSAqLwotICAgICAgZXJyb3IgKF8oIlVua25vd24gVk1TIHBzZWN0IHR5cGUgKCVsZCkiKSwgKGxvbmcpIFR5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKgotICAgKglNb2RpZnkgdGhlIHBzZWN0IGF0dHJpYnV0ZXMgYWNjb3JkaW5nIHRvIGFueSBhdHRyaWJ1dGUgc3RyaW5nCi0gICAqLwotICBpZiAodnNwICYmIFNfR0VUX1RZUEUgKHZzcC0+U3ltYm9sKSA9PSBOX0FCUykKLSAgICBQc2VjdF9BdHRyaWJ1dGVzIHw9IEdMT0JBTFZBTFVFX0JJVDsKLSAgZWxzZSBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotICAgIFZNU19Nb2RpZnlfUHNlY3RfQXR0cmlidXRlcyAoTmFtZSwgJlBzZWN0X0F0dHJpYnV0ZXMpOwotICAvKgotICAgKglDaGVjayBmb3IgZ2xvYmFscmVmL2RlZi92YWwuCi0gICAqLwotICBpZiAoKFBzZWN0X0F0dHJpYnV0ZXMgJiBHTE9CQUxWQUxVRV9CSVQpICE9IDApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIGdsb2JhbHZhbHVlIHN5bWJvbHMgd2VyZSBnZW5lcmF0ZWQgYmVmb3JlLiBUaGlzIGNvZGUKLSAgICAgICAqIHByZXZlbnRzIHVuc2lnaHRseSBwc2VjdCBidWlsZHVwLCBhbmQgbWFrZXMgc3VyZSB0aGF0Ci0gICAgICAgKiBmaXh1cCByZWZlcmVuY2VzIGFyZSBlbWl0dGVkIGNvcnJlY3RseS4KLSAgICAgICAqLwotICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IC0xOwkvKiB0byBjYXRjaCBlcnJvcnMgKi8KLSAgICAgIFNfU0VUX1RZUEUgKHZzcC0+U3ltYm9sLCBOX1VOREYpOwkJLyogbWFrZSByZWZzIHdvcmsgKi8KLSAgICAgIHJldHVybiAxOwkJCS8qIGRlY3JlbWVudCBwc2VjdCBjb3VudGVyICovCi0gICAgfQotCi0gIGlmICgoUHNlY3RfQXR0cmlidXRlcyAmIEdMT0JBTFNZTUJPTF9CSVQpICE9IDApCi0gICAgewotICAgICAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpKQotCXsKLQljYXNlIE5fVU5ERiB8IE5fRVhUOgotCSAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoTmFtZSwgdnNwLT5Qc2VjdF9JbmRleCwKLQkJCQkgIHZzcC0+UHNlY3RfT2Zmc2V0LCBHQkxTWU1fUkVGKTsKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSAtMTsKLQkgIFNfU0VUX1RZUEUgKHZzcC0+U3ltYm9sLCBOX1VOREYpOwotCSAgcmV0dXJuIDE7CQkvKiByZXR1cm4gYW5kIGluZGljYXRlIG5vIHBzZWN0ICovCi0JY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkJICB2c3AtPlBzZWN0X09mZnNldCwgR0JMU1lNX0RFRik7Ci0JICAvKiBJbiB0aGlzIGNhc2Ugd2Ugc3RpbGwgZ2VuZXJhdGUgdGhlIHBzZWN0ICovCi0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfZmF0YWwgKF8oIkdsb2JhbHN5bWJvbCBhdHRyaWJ1dGUgZm9yIHN5bWJvbCAlcyB3YXMgdW5leHBlY3RlZC4iKSwKLQkJICAgIE5hbWUpOwotCSAgYnJlYWs7Ci0JfQkJCS8qIHN3aXRjaCAqLwotICAgIH0KLQotICBQc2VjdF9BdHRyaWJ1dGVzICY9IDB4ZmZmZjsJLyogY2xlYXIgb3V0IHRoZSBnbG9iYWxyZWYvZGVmIHN0dWZmICovCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIFBTRUNUIGRlZmluaXRpb24gc3VicmVjb3JkCi0gICAqLwotICBQVVRfQ0hBUiAoR1NEX1NfQ19QU0MpOwotICAvKgotICAgKglQc2VjdHMgYXJlIGFsd2F5cyBMT05HV09SRCBhbGlnbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMik7Ci0gIC8qCi0gICAqCVNwZWNpZnkgdGhlIHBzZWN0IGF0dHJpYnV0ZXMKLSAgICovCi0gIFBVVF9TSE9SVCAoUHNlY3RfQXR0cmlidXRlcyk7Ci0gIC8qCi0gICAqCVNwZWNpZnkgdGhlIGFsbG9jYXRpb24KLSAgICovCi0gIFBVVF9MT05HIChTaXplKTsKLSAgLyoKLSAgICoJRmluYWxseSwgdGhlIHBzZWN0IG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0KLS8qIEdpdmVuIHRoZSBwb2ludGVyIHRvIGEgc3ltYm9sIHdlIGNhbGN1bGF0ZSBob3cgYmlnIHRoZSBkYXRhIGF0IHRoZQotICAgc3ltYm9sIGlzLiAgV2UgZG8gdGhpcyBieSBsb29raW5nIGZvciB0aGUgbmV4dCBzeW1ib2wgKGxvY2FsIG9yIGdsb2JhbCkKLSAgIHdoaWNoIHdpbGwgaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGFub3RoZXIgZGF0dW0uICAqLwotCi1zdGF0aWMgb2Zmc2V0VAotVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoczBQLCBFbmRfT2ZfRGF0YSkKLSAgICAgcmVnaXN0ZXIgc3ltYm9sUyAqczBQOwotICAgICB1bnNpZ25lZCBFbmRfT2ZfRGF0YTsKLXsKLSAgc3ltYm9sUyAqczFQOwotICB2YWx1ZVQgczBQX3ZhbCA9IFNfR0VUX1ZBTFVFIChzMFApLCBzMVBfdmFsLAotCSBuZWFyZXN0X3ZhbCA9ICh2YWx1ZVQpIEVuZF9PZl9EYXRhOwotCi0gIC8qIEZpbmQgdGhlIG5lYXJlc3Qgc3ltYm9sIHdoYXQgZm9sbG93cyB0aGlzIG9uZS4gICovCi0gIGZvciAoczFQID0gc3ltYm9sX3Jvb3RQOyBzMVA7IHMxUCA9IHN5bWJvbF9uZXh0IChzMVApKQotICAgIHsKLSAgICAgIC8qIFRoZSBkYXRhIHR5cGUgbXVzdCBtYXRjaC4gICovCi0gICAgICBpZiAoU19HRVRfVFlQRSAoczFQKSAhPSBOX0RBVEEpCi0JY29udGludWU7Ci0gICAgICBzMVBfdmFsID0gU19HRVRfVkFMVUUgKHMxUCk7Ci0gICAgICBpZiAoczFQX3ZhbCA+IHMwUF92YWwgJiYgczFQX3ZhbCA8IG5lYXJlc3RfdmFsKQotCW5lYXJlc3RfdmFsID0gczFQX3ZhbDsKLSAgICB9Ci0gIC8qIENhbGN1bGF0ZSBpdHMgc2l6ZS4gICovCi0gIHJldHVybiAob2Zmc2V0VCkgKG5lYXJlc3RfdmFsIC0gczBQX3ZhbCk7Ci19Ci0KLQotLyogQ2hlY2sgc3ltYm9sIG5hbWVzIGZvciB0aGUgUHNlY3QgaGFjayB3aXRoIGEgZ2xvYmFsdmFsdWUsIGFuZCB0aGVuCi0gICBnZW5lcmF0ZSBnbG9iYWx2YWx1ZXMgZm9yIHRob3NlIHRoYXQgaGF2ZSBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1WTVNfRW1pdF9HbG9iYWx2YWx1ZXMgKHRleHRfc2l6LCBkYXRhX3NpeiwgRGF0YV9TZWdtZW50KQotICAgICB1bnNpZ25lZCB0ZXh0X3NpejsKLSAgICAgdW5zaWduZWQgZGF0YV9zaXo7Ci0gICAgIGNoYXIgKkRhdGFfU2VnbWVudDsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7Ci0gIGNoYXIgKnN0cmlwcGVkX25hbWUsICpOYW1lOwotICBpbnQgU2l6ZTsKLSAgaW50IFBzZWN0X0F0dHJpYnV0ZXM7Ci0gIGludCBnbG9iYWx2YWx1ZTsKLSAgaW50IHR5cCwgYWJzdHlwOwotCi0gIC8qCi0gICAqIFNjYW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgZ2xvYmFsdmFsdWVzLCBhbmQgZW1pdCBkZWYvcmVmIHdoZW4KLSAgICogcmVxdWlyZWQuICBUaGVzZSB3aWxsIGJlIGNhdWdodCBhZ2FpbiBsYXRlciBhbmQgY29udmVydGVkIHRvCi0gICAqIE5fVU5ERgotICAgKi8KLSAgZm9yIChzcCA9IHN5bWJvbF9yb290UDsgc3A7IHNwID0gc3AtPnN5X25leHQpCi0gICAgewotICAgICAgdHlwID0gU19HRVRfUkFXX1RZUEUgKHNwKTsKLSAgICAgIGFic3R5cCA9ICgodHlwICYgfk5fRVhUKSA9PSBOX0FCUyk7Ci0gICAgICAvKgotICAgICAgICoJU2VlIGlmIHRoaXMgaXMgc29tZXRoaW5nIHdlIHdhbnQgdG8gbG9vayBhdC4KLSAgICAgICAqLwotICAgICAgaWYgKCFhYnN0eXAgJiYKLQkgIHR5cCAhPSAoTl9EQVRBIHwgTl9FWFQpICYmCi0JICB0eXAgIT0gKE5fVU5ERiB8IE5fRVhUKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglTZWUgaWYgdGhpcyBoYXMgZ2xvYmFsdmFsdWUgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAqLwotICAgICAgTmFtZSA9IFNfR0VUX05BTUUgKHNwKTsKLQotICAgICAgaWYgKGFic3R5cCkKLQl7Ci0JICBzdHJpcHBlZF9uYW1lID0gMDsKLQkgIFBzZWN0X0F0dHJpYnV0ZXMgPSBHTE9CQUxWQUxVRV9CSVQ7Ci0JfQotICAgICAgZWxzZSBpZiAoSEFTX1BTRUNUX0FUVFJJQlVURVMgKE5hbWUpKQotCXsKLQkgIHN0cmlwcGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKE5hbWUpICsgMSk7Ci0JICBzdHJjcHkgKHN0cmlwcGVkX25hbWUsIE5hbWUpOwotCSAgUHNlY3RfQXR0cmlidXRlcyA9IDA7Ci0JICBWTVNfTW9kaWZ5X1BzZWN0X0F0dHJpYnV0ZXMgKHN0cmlwcGVkX25hbWUsICZQc2VjdF9BdHRyaWJ1dGVzKTsKLQl9Ci0gICAgICBlbHNlCi0JY29udGludWU7Ci0KLSAgICAgIGlmICgoUHNlY3RfQXR0cmlidXRlcyAmIEdMT0JBTFZBTFVFX0JJVCkgIT0gMCkKLQl7Ci0JICBzd2l0Y2ggKHR5cCkKLQkgICAgewotCSAgICBjYXNlIE5fQUJTOgotCSAgICAgIC8qIExvY2FsIHN5bWJvbCByZWZlcmVuY2VzIHdpbGwgd2FudAotCQkgdG8gaGF2ZSBhbiBlbnZpcm9ubWVudCBkZWZpbmVkLiAgKi8KLQkgICAgICBpZiAoQ3VycmVudF9FbnZpcm9ubWVudCA8IDApCi0JCVZNU19Mb2NhbF9FbnZpcm9ubWVudF9TZXR1cCAoIi5OX0FCUyIpOwotCSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKE5hbWUsIDAsCi0JCQkJICAgICAgU19HRVRfVkFMVUUgKHNwKSwKLQkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUx8R0JMU1lNX0xDTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChOYW1lLCAwLAotCQkJCSAgICAgIFNfR0VUX1ZBTFVFIChzcCksCi0JCQkJICAgICAgR0JMU1lNX0RFRnxHQkxTWU1fVkFMKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCAwLCBHQkxTWU1fVkFMKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLQkgICAgICBTaXplID0gVk1TX0luaXRpYWxpemVkX0RhdGFfU2l6ZSAoc3AsIHRleHRfc2l6ICsgZGF0YV9zaXopOwotCSAgICAgIGlmIChTaXplID4gNCkKLQkJZXJyb3IgKF8oIkludmFsaWQgZGF0YSB0eXBlIGZvciBnbG9iYWx2YWx1ZSIpKTsKLQkgICAgICBnbG9iYWx2YWx1ZSA9IG1kX2NoYXJzX3RvX251bWJlciAoRGF0YV9TZWdtZW50ICsgCi0JCSAgICAgU19HRVRfVkFMVUUgKHNwKSAtIHRleHRfc2l6ICwgU2l6ZSk7Ci0JICAgICAgLyogVGhyZWUgdGltZXMgZm9yIGdvb2QgbHVjay4gIFRoZSBsaW5rZXIgc2VlbXMgdG8gZ2V0IGNvbmZ1c2VkCi0JICAgICAgICAgaWYgdGhlcmUgYXJlIGZld2VyIHRoYW4gdGhyZWUgKi8KLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCAwLCBHQkxTWU1fVkFMKTsKLQkgICAgICBWTVNfR2xvYmFsX1N5bWJvbF9TcGVjIChzdHJpcHBlZF9uYW1lLCAwLCBnbG9iYWx2YWx1ZSwKLQkJCQkgICAgICBHQkxTWU1fREVGfEdCTFNZTV9WQUwpOwotCSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHN0cmlwcGVkX25hbWUsIDAsIGdsb2JhbHZhbHVlLAotCQkJCSAgICAgIEdCTFNZTV9ERUZ8R0JMU1lNX1ZBTCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfd2FybiAoXygiSW52YWxpZCBnbG9iYWx2YWx1ZSBvZiAlcyIpLCBzdHJpcHBlZF9uYW1lKTsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIHN3aXRjaCAqLwotCX0JCQkvKiBpZiAqLwotICAgICAgaWYgKHN0cmlwcGVkX25hbWUpIGZyZWUgKHN0cmlwcGVkX25hbWUpOwkvKiBjbGVhbiB1cCAqLwotICAgIH0JCQkJLyogZm9yICovCi0KLX0KLQwKLQotLyoKLSAqCURlZmluZSBhIHByb2NlZHVyZSBlbnRyeSBwdC9tYXNrCi0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfUHJvY2VkdXJlX0VudHJ5X1B0IChOYW1lLCBQc2VjdF9OdW1iZXIsIFBzZWN0X09mZnNldCwgRW50cnlfTWFzaykKLSAgICAgY2hhciAqTmFtZTsKLSAgICAgaW50IFBzZWN0X051bWJlcjsKLSAgICAgaW50IFBzZWN0X09mZnNldDsKLSAgICAgaW50IEVudHJ5X01hc2s7Ci17Ci0gIGNoYXIgTG9jYWxbMzJdOwotCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgR1NEIHJlY29yZAotICAgKi8KLSAgU2V0X1ZNU19PYmplY3RfRmlsZV9SZWNvcmQgKE9CSl9TX0NfR1NEKTsKLSAgLyoKLSAgICoJSWYgdGhlIGJ1ZmZlciBpcyBlbXB0eSB3ZSBtdXN0IGluc2VydCB0aGUgR1NEIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoT0JKX1NfQ19HU0QpOwotICAvKgotICAgKglXZSBhcmUgd3JpdGluZyBhIFByb2NlZHVyZSBFbnRyeSBQdC9NYXNrIHN1YnJlY29yZAotICAgKi8KLSAgUFVUX0NIQVIgKCgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpID8gR1NEX1NfQ19FUE0gOiBHU0RfU19DX0VQTVcpOwotICAvKgotICAgKglEYXRhIHR5cGUgaXMgdW5kZWZpbmVkCi0gICAqLwotICBQVVRfQ0hBUiAoMCk7Ci0gIC8qCi0gICAqCUZsYWdzID0gIlJFTE9DQVRBQkxFIiBhbmQgIkRFRklORUQiCi0gICAqLwotICBQVVRfU0hPUlQgKEdTWV9TX01fREVGIHwgR1NZX1NfTV9SRUwpOwotICAvKgotICAgKglQc2VjdCBOdW1iZXIKLSAgICovCi0gIGlmICgodW5zaWduZWQpIFBzZWN0X051bWJlciA8PSAyNTUpCi0gICAgUFVUX0NIQVIgKFBzZWN0X051bWJlcik7Ci0gIGVsc2UKLSAgICBQVVRfU0hPUlQgKFBzZWN0X051bWJlcik7Ci0gIC8qCi0gICAqCU9mZnNldAotICAgKi8KLSAgUFVUX0xPTkcgKFBzZWN0X09mZnNldCk7Ci0gIC8qCi0gICAqCUVudHJ5IG1hc2sKLSAgICovCi0gIFBVVF9TSE9SVCAoRW50cnlfTWFzayk7Ci0gIC8qCi0gICAqCUZpbmFsbHksIHRoZSBnbG9iYWwgc3ltYm9sIG5hbWUKLSAgICovCi0gIFZNU19DYXNlX0hhY2tfU3ltYm9sIChOYW1lLCBMb2NhbCk7Ci0gIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAvKgotICAgKglGbHVzaCB0aGUgYnVmZmVyIGlmIGl0IGlzIG1vcmUgdGhhbiA3NSUgZnVsbAotICAgKi8KLSAgaWYgKE9iamVjdF9SZWNvcmRfT2Zmc2V0ID4gKHNpemVvZiAoT2JqZWN0X1JlY29yZF9CdWZmZXIpICogMyAvIDQpKQotICAgIEZsdXNoX1ZNU19PYmplY3RfUmVjb3JkX0J1ZmZlciAoKTsKLX0KLQwKLQotLyoKLSAqCVNldCB0aGUgY3VycmVudCBsb2NhdGlvbiBjb3VudGVyIHRvIGEgcGFydGljdWxhciBQc2VjdCBhbmQgT2Zmc2V0Ci0gKi8KLXN0YXRpYyB2b2lkCi1WTVNfU2V0X1BzZWN0IChQc2VjdF9JbmRleCwgT2Zmc2V0LCBSZWNvcmRfVHlwZSkKLSAgICAgaW50IFBzZWN0X0luZGV4OwotICAgICBpbnQgT2Zmc2V0OwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgdGhlIHJlY29yZCB0eXBlCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPT0gMCkKLSAgICBQVVRfQ0hBUiAoUmVjb3JkX1R5cGUpOwotICAvKgotICAgKglTdGFjayB0aGUgUHNlY3QgYmFzZSArIE9mZnNldAotICAgKi8KLSAgdm1zX3Rpcl9zdGFja19wc2VjdCAoUHNlY3RfSW5kZXgsIE9mZnNldCwgMCk7Ci0gIC8qCi0gICAqCVNldCByZWxvY2F0aW9uIGJhc2UKLSAgICovCi0gIFBVVF9DSEFSIChUSVJfU19DX0NUTF9TRVRSQik7Ci0gIC8qCi0gICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKgotICoJU3RvcmUgcmVwZWF0ZWQgaW1tZWRpYXRlIGRhdGEgaW4gY3VycmVudCBQc2VjdAotICovCi1zdGF0aWMgdm9pZAotVk1TX1N0b3JlX1JlcGVhdGVkX0RhdGEgKFJlcGVhdF9Db3VudCwgUG9pbnRlciwgU2l6ZSwgUmVjb3JkX1R5cGUpCi0gICAgIGludCBSZXBlYXRfQ291bnQ7Ci0gICAgIHJlZ2lzdGVyIGNoYXIgKlBvaW50ZXI7Ci0gICAgIGludCBTaXplOwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0KLSAgLyoKLSAgICoJSWdub3JlIHplcm8gYnl0ZXMvd29yZHMvbG9uZ3dvcmRzCi0gICAqLwotICBzd2l0Y2ggKFNpemUpCi0gICAgewotICAgIGNhc2UgNDoKLSAgICAgIGlmIChQb2ludGVyWzNdICE9IDAgfHwgUG9pbnRlclsyXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIGVsc2UgRkFMTFRIUlUgKi8KLSAgICBjYXNlIDI6Ci0gICAgICBpZiAoUG9pbnRlclsxXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIGVsc2UgRkFMTFRIUlUgKi8KLSAgICBjYXNlIDE6Ci0gICAgICBpZiAoUG9pbnRlclswXSAhPSAwKSBicmVhazsKLSAgICAgIC8qIHplcm8gdmFsdWUgKi8KLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICAvKgotICAgKglJZiB0aGUgZGF0YSBpcyB0b28gYmlnIGZvciBhIFRJUl9TX0NfU1RPX1JJVkIgc3ViLXJlY29yZAotICAgKgl0aGVuIHdlIGRvIGl0IG1hbnVhbGx5Ci0gICAqLwotICBpZiAoU2l6ZSA+IDI1NSkKLSAgICB7Ci0gICAgICB3aGlsZSAoLS1SZXBlYXRfQ291bnQgPj0gMCkKLQlWTVNfU3RvcmVfSW1tZWRpYXRlX0RhdGEgKFBvaW50ZXIsIFNpemUsIFJlY29yZF9UeXBlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCVN0YWNrIHRoZSByZXBlYXQgY291bnQKLSAgICovCi0gIFBVVF9DSEFSIChUSVJfU19DX1NUQV9MVyk7Ci0gIFBVVF9MT05HIChSZXBlYXRfQ291bnQpOwotICAvKgotICAgKglBbmQgbm93IHRoZSBjb21tYW5kIGFuZCBpdHMgZGF0YQotICAgKi8KLSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RPX1JJVkIpOwotICBQVVRfQ0hBUiAoU2l6ZSk7Ci0gIHdoaWxlICgtLVNpemUgPj0gMCkKLSAgICBQVVRfQ0hBUiAoKlBvaW50ZXIrKyk7Ci0gIC8qCi0gICAqCUZsdXNoIHRoZSBidWZmZXIgaWYgaXQgaXMgbW9yZSB0aGFuIDc1JSBmdWxsCi0gICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotfQotDAotCi0vKgotICoJU3RvcmUgYSBQb3NpdGlvbiBJbmRlcGVuZGVudCBSZWZlcmVuY2UKLSAqLwotc3RhdGljIHZvaWQKLVZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSAoU3ltYm9sLCBPZmZzZXQsIFBDX1JlbGF0aXZlLAotCQkJCVBzZWN0LCBQc2VjdF9PZmZzZXQsIFJlY29yZF9UeXBlKQotICAgICBzeW1ib2xTICpTeW1ib2w7Ci0gICAgIGludCBPZmZzZXQ7Ci0gICAgIGludCBQQ19SZWxhdGl2ZTsKLSAgICAgaW50IFBzZWN0OwotICAgICBpbnQgUHNlY3RfT2Zmc2V0OwotICAgICBpbnQgUmVjb3JkX1R5cGU7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBWTVNfU3ltYm9sICp2c3AgPSBTeW1ib2wtPnN5X29iajsKLSAgY2hhciBMb2NhbFszMl07Ci0gIGludCBsb2NhbF9zeW0gPSAwOwotCi0gIC8qCi0gICAqCVdlIGFyZSB3cml0aW5nIGEgIlJlY29yZF9UeXBlIiByZWNvcmQKLSAgICovCi0gIFNldF9WTVNfT2JqZWN0X0ZpbGVfUmVjb3JkIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCUlmIHRoZSBidWZmZXIgaXMgZW1wdHkgd2UgbXVzdCBpbnNlcnQgcmVjb3JkIHR5cGUKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCVNldCB0byB0aGUgYXBwcm9wcmlhdGUgb2Zmc2V0IGluIHRoZSBQc2VjdC4KLSAgICoJRm9yIGEgQ29kZSByZWZlcmVuY2Ugd2UgbmVlZCB0byBmaXggdGhlIG9wZXJhbmQKLSAgICoJc3BlY2lmaWVyIGFzIHdlbGwsIHNvIGJhY2sgdXAgMSBieXRlOwotICAgKglmb3IgYSBEYXRhIHJlZmVyZW5jZSB3ZSBqdXN0IHN0b3JlIEhFUkUuCi0gICAqLwotICBWTVNfU2V0X1BzZWN0IChQc2VjdCwKLQkJIFBDX1JlbGF0aXZlID8gUHNlY3RfT2Zmc2V0IC0gMSA6IFBzZWN0X09mZnNldCwKLQkJIFJlY29yZF9UeXBlKTsKLSAgLyoKLSAgICoJTWFrZSBzdXJlIHdlIGFyZSBzdGlsbCBnZW5lcmF0aW5nIGEgIlJlY29yZCBUeXBlIiByZWNvcmQKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA9PSAwKQotICAgIFBVVF9DSEFSIChSZWNvcmRfVHlwZSk7Ci0gIC8qCi0gICAqCURpc3BhdGNoIG9uIHN5bWJvbCB0eXBlIChzbyB3ZSBjYW4gc3RhY2sgaXRzIHZhbHVlKQotICAgKi8KLSAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoU3ltYm9sKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJR2xvYmFsIHN5bWJvbAotICAgICAgICovCi0gICAgY2FzZSBOX0FCUzoKLSAgICAgIGxvY2FsX3N5bSA9IDE7Ci0gICAgICAvKkZBTExUSFJVKi8KLSAgICBjYXNlIE5fQUJTIHwgTl9FWFQ6Ci0jaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLSAgICBjYXNlIE5fVU5ERiB8IE5fRVhUOgotICAgIGNhc2UgTl9EQVRBIHwgTl9FWFQ6Ci0jZW5kaWYJLyogTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUgKi8KLSAgICBjYXNlIE5fVU5ERjoKLSAgICBjYXNlIE5fVEVYVCB8IE5fRVhUOgotICAgICAgLyoKLSAgICAgICAqCUdldCB0aGUgc3ltYm9sIG5hbWUgKGNhc2UgaGFja2VkKQotICAgICAgICovCi0gICAgICBWTVNfQ2FzZV9IYWNrX1N5bWJvbCAoU19HRVRfTkFNRSAoU3ltYm9sKSwgTG9jYWwpOwotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBnbG9iYWwgc3ltYm9sIHZhbHVlCi0gICAgICAgKi8KLSAgICAgIGlmICghbG9jYWxfc3ltKQotCXsKLQkgIFBVVF9DSEFSIChUSVJfU19DX1NUQV9HQkwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBMb2NhbCBzeW1ib2xzIGhhdmUgYW4gZXh0cmEgZmllbGQuICAqLwotCSAgUFVUX0NIQVIgKFRJUl9TX0NfU1RBX0xTWSk7Ci0JICBQVVRfU0hPUlQgKEN1cnJlbnRfRW52aXJvbm1lbnQpOwotCX0KLSAgICAgIFBVVF9DT1VOVEVEX1NUUklORyAoTG9jYWwpOwotICAgICAgaWYgKE9mZnNldCkKLQl7Ci0JICAvKgotCSAgICoJU3RhY2sgdGhlIGxvbmd3b3JkIG9mZnNldAotCSAgICovCi0JICBQVVRfQ0hBUiAoVElSX1NfQ19TVEFfTFcpOwotCSAgUFVUX0xPTkcgKE9mZnNldCk7Ci0JICAvKgotCSAgICoJQWRkIHRoZSB0d28sIGxlYXZpbmcgdGhlIHJlc3VsdCBvbiB0aGUgc3RhY2sKLQkgICAqLwotCSAgUFVUX0NIQVIgKFRJUl9TX0NfT1BSX0FERCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAvKgotICAgICAgICoJVW5pbml0aWFsaXplZCBsb2NhbCBkYXRhCi0gICAgICAgKi8KLSAgICBjYXNlIE5fQlNTOgotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBQc2VjdCAoK29mZnNldCkKLSAgICAgICAqLwotICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJCSAgIHZzcC0+UHNlY3RfT2Zmc2V0ICsgT2Zmc2V0LAotCQkJICAgMCk7Ci0gICAgICBicmVhazsKLSAgICAgIC8qCi0gICAgICAgKglMb2NhbCB0ZXh0Ci0gICAgICAgKi8KLSAgICBjYXNlIE5fVEVYVDoKLSAgICAgIC8qCi0gICAgICAgKglTdGFjayB0aGUgUHNlY3QgKCtvZmZzZXQpCi0gICAgICAgKi8KLSAgICAgIHZtc190aXJfc3RhY2tfcHNlY3QgKHZzcC0+UHNlY3RfSW5kZXgsCi0JCQkgICBTX0dFVF9WQUxVRSAoU3ltYm9sKSArIE9mZnNldCwKLQkJCSAgIDApOwotICAgICAgYnJlYWs7Ci0gICAgICAvKgotICAgICAgICoJSW5pdGlhbGl6ZWQgbG9jYWwgb3IgZ2xvYmFsIGRhdGEKLSAgICAgICAqLwotICAgIGNhc2UgTl9EQVRBOgotI2lmbmRlZglOT1RfVkFYXzExX0NfQ09NUEFUSUJMRQotICAgIGNhc2UgTl9VTkRGIHwgTl9FWFQ6Ci0gICAgY2FzZSBOX0RBVEEgfCBOX0VYVDoKLSNlbmRpZgkvKiBOT1RfVkFYXzExX0NfQ09NUEFUSUJMRSAqLwotICAgICAgLyoKLSAgICAgICAqCVN0YWNrIHRoZSBQc2VjdCAoK29mZnNldCkKLSAgICAgICAqLwotICAgICAgdm1zX3Rpcl9zdGFja19wc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJCSAgIHZzcC0+UHNlY3RfT2Zmc2V0ICsgT2Zmc2V0LAotCQkJICAgMCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIC8qCi0gICAqCVN0b3JlIGVpdGhlciBhIGNvZGUgb3IgZGF0YSByZWZlcmVuY2UKLSAgICovCi0gIFBVVF9DSEFSIChQQ19SZWxhdGl2ZSA/IFRJUl9TX0NfU1RPX1BJQ1IgOiBUSVJfU19DX1NUT19QSURSKTsKLSAgLyoKLSAgICoJRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwKLSAgICovCi0gIGlmIChPYmplY3RfUmVjb3JkX09mZnNldCA+IChzaXplb2YgKE9iamVjdF9SZWNvcmRfQnVmZmVyKSAqIDMgLyA0KSkKLSAgICBGbHVzaF9WTVNfT2JqZWN0X1JlY29yZF9CdWZmZXIgKCk7Ci19Ci0MCi0KLS8qCi0gKglDaGVjayBpbiB0aGUgdGV4dCBhcmVhIGZvciBhbiBpbmRpcmVjdCBwYy1yZWxhdGl2ZSByZWZlcmVuY2UKLSAqCWFuZCBmaXggaXQgdXAgd2l0aCBhZGRyZXNzaW5nIG1vZGUgMHhmZiBbUEMgaW5kaXJlY3RdCi0gKgotICoJVEhJUyBTSE9VTEQgQkUgUkVQTEFDRUQgQlkgVEhFIFVTRSBPRiBUSVJfU19DX1NUT19QSVJSIElOIFRIRQotICoJUElDIENPREUgR0VORVJBVElORyBGSVhVUCBST1VUSU5FLgotICovCi1zdGF0aWMgdm9pZAotVk1TX0ZpeF9JbmRpcmVjdF9SZWZlcmVuY2UgKFRleHRfUHNlY3QsIE9mZnNldCwgZnJhZ1AsIHRleHRfZnJhZ19yb290KQotICAgICBpbnQgVGV4dF9Qc2VjdDsKLSAgICAgaW50IE9mZnNldDsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBmcmFnUyAqdGV4dF9mcmFnX3Jvb3Q7Ci17Ci0gIC8qCi0gICAqCVRoZSBhZGRyZXNzaW5nIG1vZGUgYnl0ZSBpcyAxIGJ5dGUgYmVmb3JlIHRoZSBhZGRyZXNzCi0gICAqLwotICBPZmZzZXQtLTsKLSAgLyoKLSAgICoJSXMgaXQgaW4gVEhJUyBmcmFnPz8KLSAgICovCi0gIGlmICgoT2Zmc2V0IDwgZnJhZ1AtPmZyX2FkZHJlc3MpIHx8Ci0gICAgICAoT2Zmc2V0ID49IChmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXgpKSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICoJV2UgbmVlZCB0byBzZWFyY2ggZm9yIHRoZSBmcmFnbWVudCBjb250YWluaW5nIHRoaXMKLSAgICAgICAqCU9mZnNldAotICAgICAgICovCi0gICAgICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCXsKLQkgIGlmICgoT2Zmc2V0ID49IGZyYWdQLT5mcl9hZGRyZXNzKSAmJgotCSAgICAgIChPZmZzZXQgPCAoZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4KSkpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIC8qCi0gICAgICAgKglJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBmcmFnLCB0aGluZ3MgYXJlIEJBRCEhCi0gICAgICAgKi8KLSAgICAgIGlmIChmcmFnUCA9PSAwKQotCWVycm9yIChfKCJDb3VsZG4ndCBmaW5kIGZpeHVwIGZyYWdtZW50IHdoZW4gY2hlY2tpbmcgZm9yIGluZGlyZWN0IHJlZmVyZW5jZSIpKTsKLSAgICB9Ci0gIC8qCi0gICAqCUNoZWNrIGZvciBpbmRpcmVjdCBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUKLSAgICovCi0gIGlmIChmcmFnUC0+ZnJfbGl0ZXJhbFtPZmZzZXQgLSBmcmFnUC0+ZnJfYWRkcmVzc10gPT0gKGNoYXIpIDB4ZmYpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgQWRkcmVzc19Nb2RlID0gKGNoYXIpIDB4ZmY7Ci0KLSAgICAgIC8qCi0gICAgICAgKglZZXM6IFN0b3JlIHRoZSBpbmRpcmVjdCBtb2RlIGJhY2sgaW50byB0aGUgaW1hZ2UKLSAgICAgICAqCSAgICAgdG8gZml4IHVwIHRoZSBkYW1hZ2UgZG9uZSBieSBTVE9fUElDUgotICAgICAgICovCi0gICAgICBWTVNfU2V0X1BzZWN0IChUZXh0X1BzZWN0LCBPZmZzZXQsIE9CSl9TX0NfVElSKTsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoJkFkZHJlc3NfTW9kZSwgMSwgT0JKX1NfQ19USVIpOwotICAgIH0KLX0KLQwKLQotLyoKLSAqCUlmIHRoZSBwcm9jZWR1cmUgIm1haW4oKSIgZXhpc3RzIHdlIGhhdmUgdG8gYWRkIHRoZSBpbnN0cnVjdGlvbgotICoJImpzYiBjJG1haW5fYXJncyIgYXQgdGhlIGJlZ2lubmluZyB0byBiZSBjb21wYXRpYmxlIHdpdGggVkFYLTExICJDIi4KLSAqCi0gKglGSVhNRTogIHRoZSBtYWNybyBuYW1lIGBIQUNLX0RFQ19DX1NUQVJUVVAnIHNob3VsZCBiZSByZW5hbWVkCi0gKgkJdG8gYEhBQ0tfVkFYQ1JUTF9TVEFSVFVQJyBiZWNhdXNlIERpZ2l0YWwncyBjb21waWxlcgotICoJCW5hbWVkICJERUMgQyIgdXNlcyBydW4tdGltZSBsaWJyYXJ5ICJERUNDJFNIUiIsIGJ1dCB0aGlzCi0gKgkJc3RhcnR1cCBjb2RlIGlzIGZvciAiVkFYQ1JUTCIsIHRoZSBsaWJyYXJ5IGZvciBEaWdpdGFsJ3MKLSAqCQlvbGRlciAiVkFYIEMiLiAgQWxzbywgdGhpcyBleHRyYSBjb2RlIGlzbid0IG5lZWRlZCBmb3IKLSAqCQlzdXBwb3J0aW5nIGdjYyBiZWNhdXNlIGl0IGFscmVhZHkgZ2VuZXJhdGVzIHRoZSBWQVhDUlRMCi0gKgkJc3RhcnR1cCBjYWxsIHdoZW4gY29tcGlsaW5nIG1haW4oKS4gIFRoZSByZWZlcmVuY2UgdG8KLSAqCQlgZmxhZ19oYXNoX2xvbmdfbmFtZXMnIGxvb2tzIHZlcnkgc3VzcGljaW91cyB0b287Ci0gKgkJcHJvYmFibHkgYW4gb2xkLXN0eWxlIGNvbW1hbmQgbGluZSBvcHRpb24gd2FzIGluYWR2ZXJ0ZW50bHkKLSAqCQlvdmVybG9hZGVkIGhlcmUsIHRoZW4gYmxpbmRseSBjb252ZXJ0ZWQgaW50byB0aGUgbmV3IG9uZS4KLSAqLwotdm9pZAotdm1zX2NoZWNrX2Zvcl9tYWluICgpCi17Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0jaWZkZWYJSEFDS19ERUNfQ19TVEFSVFVQCS8qIEpGICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBmcmNoYWluICpmcmNoYWluUDsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBmcmFnUyAqKnByZXZfZnJhZ1BQOwotICByZWdpc3RlciBzdHJ1Y3QgZml4ICpmaXhQOwotICByZWdpc3RlciBmcmFnUyAqTmV3X0ZyYWc7Ci0gIGludCBpOwotI2VuZGlmCS8qIEhBQ0tfREVDX0NfU1RBUlRVUCAqLwotCi0gIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBzeW1ib2xfZmluZCAoIl9tYWluIik7Ci0gIGlmIChzeW1ib2xQICYmICFTX0lTX0RFQlVHIChzeW1ib2xQKSAmJgotICAgICAgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkgJiYgKFNfR0VUX1RZUEUgKHN5bWJvbFApID09IE5fVEVYVCkpCi0gICAgewotI2lmZGVmCUhBQ0tfREVDX0NfU1RBUlRVUAotICAgICAgaWYgKCFmbGFnX2hhc2hfbG9uZ19uYW1lcykKLQl7Ci0jZW5kaWYKLQkgIC8qCi0JICAgKglSZW1lbWJlciB0aGUgZW50cnkgcG9pbnQgc3ltYm9sCi0JICAgKi8KLQkgIEVudHJ5X1BvaW50X1N5bWJvbCA9IHN5bWJvbFA7Ci0jaWZkZWYgSEFDS19ERUNfQ19TVEFSVFVQCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0JICAgKglTY2FuIGFsbCB0aGUgZnJhZ21lbnQgY2hhaW5zIGZvciB0aGUgb25lIHdpdGggIl9tYWluIgotCSAgICoJKEFjdHVhbGx5IHdlIGtub3cgdGhlIGZyYWdtZW50IGZyb20gdGhlIHN5bWJvbCwgYnV0IHdlIG5lZWQKLQkgICAqCSB0aGUgcHJldmlvdXMgZnJhZ21lbnQgc28gd2UgY2FuIGNoYW5nZSBpdHMgcG9pbnRlcikKLQkgICAqLwotCSAgZnJjaGFpblAgPSBmcmNoYWluX3Jvb3Q7Ci0JICB3aGlsZSAoZnJjaGFpblApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCVNjYW4gYWxsIHRoZSBmcmFnbWVudHMgaW4gdGhpcyBjaGFpbiwgcmVtZW1iZXJpbmcKLQkgICAgICAgKgl0aGUgInByZXZpb3VzIGZyYWdtZW50IgotCSAgICAgICAqLwotCSAgICAgIHByZXZfZnJhZ1BQID0gJmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0JICAgICAgZnJhZ1AgPSBmcmNoYWluUC0+ZnJjaF9yb290OwotCSAgICAgIHdoaWxlIChmcmFnUCAmJiAoZnJhZ1AgIT0gZnJjaGFpblAtPmZyY2hfbGFzdCkpCi0JCXsKLQkJICAvKgotCQkgICAqCUlzIHRoaXMgdGhlIGZyYWdtZW50PwotCQkgICAqLwotCQkgIGlmIChmcmFnUCA9PSBzeW1ib2xQLT5zeV9mcmFnKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKglZZXM6IE1vZGlmeSB0aGUgZnJhZ21lbnQgYnkgcmVwbGFjaW5nCi0JCSAgICAgICAqCSAgICAgaXQgd2l0aCBhIG5ldyBmcmFnbWVudC4KLQkJICAgICAgICovCi0JCSAgICAgIE5ld19GcmFnID0gKGZyYWdTICopCi0JCQl4bWFsbG9jIChzaXplb2YgKCpOZXdfRnJhZykgKwotCQkJCSBmcmFnUC0+ZnJfZml4ICsKLQkJCQkgZnJhZ1AtPmZyX3ZhciArCi0JCQkJIDUpOwotCQkgICAgICAvKgotCQkgICAgICAgKglUaGUgZnJhZ21lbnRzIGFyZSB0aGUgc2FtZSBleGNlcHQKLQkJICAgICAgICoJdGhhdCB0aGUgImZpeGVkIiBhcmVhIGlzIGxhcmdlcgotCQkgICAgICAgKi8KLQkJICAgICAgKk5ld19GcmFnID0gKmZyYWdQOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfZml4ICs9IDY7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCUNvcHkgdGhlIGxpdGVyYWwgZGF0YSBvcGVuaW5nIGEgaG9sZQotCQkgICAgICAgKgkyIGJ5dGVzIGFmdGVyICJfbWFpbiIgKGkuZS4ganVzdCBhZnRlcgotCQkgICAgICAgKgl0aGUgZW50cnkgbWFzaykuICBJbnRvIHdoaWNoIHdlIHBsYWNlCi0JCSAgICAgICAqCXRoZSBKU0IgaW5zdHJ1Y3Rpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFswXSA9IGZyYWdQLT5mcl9saXRlcmFsWzBdOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFsxXSA9IGZyYWdQLT5mcl9saXRlcmFsWzFdOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFsyXSA9IDB4MTY7CS8qIEpzYiAqLwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFszXSA9IDB4ZWY7Ci0JCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzRdID0gMDsKLQkJICAgICAgTmV3X0ZyYWctPmZyX2xpdGVyYWxbNV0gPSAwOwotCQkgICAgICBOZXdfRnJhZy0+ZnJfbGl0ZXJhbFs2XSA9IDA7Ci0JCSAgICAgIE5ld19GcmFnLT5mcl9saXRlcmFsWzddID0gMDsKLQkJICAgICAgZm9yIChpID0gMjsgaSA8IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfdmFyOyBpKyspCi0JCQlOZXdfRnJhZy0+ZnJfbGl0ZXJhbFtpICsgNl0gPQotCQkJICBmcmFnUC0+ZnJfbGl0ZXJhbFtpXTsKLQkJICAgICAgLyoKLQkJICAgICAgICoJTm93IHJlcGxhY2UgdGhlIG9sZCBmcmFnbWVudCB3aXRoIHRoZQotCQkgICAgICAgKgluZXdseSBnZW5lcmF0ZWQgb25lLgotCQkgICAgICAgKi8KLQkJICAgICAgKnByZXZfZnJhZ1BQID0gTmV3X0ZyYWc7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCVJlbWVtYmVyIHRoZSBlbnRyeSBwb2ludCBzeW1ib2wKLQkJICAgICAgICovCi0JCSAgICAgIEVudHJ5X1BvaW50X1N5bWJvbCA9IHN5bWJvbFA7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCVNjYW4gdGhlIHRleHQgYXJlYSBmaXh1cCBzdHJ1Y3R1cmVzCi0JCSAgICAgICAqCWFzIG9mZnNldHMgaW4gdGhlIGZyYWdtZW50IG1heSBoYXZlCi0JCSAgICAgICAqCWNoYW5nZWQKLQkJICAgICAgICovCi0JCSAgICAgIGZvciAoZml4UCA9IHRleHRfZml4X3Jvb3Q7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotCQkJewotCQkJICAvKgotCQkJICAgKglMb29rIGZvciByZWZlcmVuY2VzIHRvIHRoaXMKLQkJCSAgICoJZnJhZ21lbnQuCi0JCQkgICAqLwotCQkJICBpZiAoZml4UC0+ZnhfZnJhZyA9PSBmcmFnUCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJQ2hhbmdlIHRoZSBmcmFnbWVudAotCQkJICAgICAgICoJcG9pbnRlcgotCQkJICAgICAgICovCi0JCQkgICAgICBmaXhQLT5meF9mcmFnID0gTmV3X0ZyYWc7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJSWYgdGhlIG9mZnNldCBpcyBhZnRlcgotCQkJICAgICAgICoJdGhlIGVudHJ5IG1hc2sgd2UgbmVlZAotCQkJICAgICAgICoJdG8gYWNjb3VudCBmb3IgdGhlIEpTQgotCQkJICAgICAgICoJaW5zdHJ1Y3Rpb24gd2UganVzdAotCQkJICAgICAgICoJaW5zZXJ0ZWQuCi0JCQkgICAgICAgKi8KLQkJCSAgICAgIGlmIChmaXhQLT5meF93aGVyZSA+PSAyKQotCQkJCWZpeFAtPmZ4X3doZXJlICs9IDY7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICAvKgotCQkgICAgICAgKglTY2FuIHRoZSBzeW1ib2xzIGFzIG9mZnNldHMgaW4gdGhlCi0JCSAgICAgICAqCWZyYWdtZW50IG1heSBoYXZlIGNoYW5nZWQKLQkJICAgICAgICovCi0JCSAgICAgIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsKLQkJCSAgIHN5bWJvbFA7Ci0JCQkgICBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotCQkJewotCQkJICAvKgotCQkJICAgKglMb29rIGZvciByZWZlcmVuY2VzIHRvIHRoaXMKLQkJCSAgICoJZnJhZ21lbnQuCi0JCQkgICAqLwotCQkJICBpZiAoc3ltYm9sUC0+c3lfZnJhZyA9PSBmcmFnUCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJQ2hhbmdlIHRoZSBmcmFnbWVudAotCQkJICAgICAgICoJcG9pbnRlcgotCQkJICAgICAgICovCi0JCQkgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gTmV3X0ZyYWc7Ci0JCQkgICAgICAvKgotCQkJICAgICAgICoJSWYgdGhlIG9mZnNldCBpcyBhZnRlcgotCQkJICAgICAgICoJdGhlIGVudHJ5IG1hc2sgd2UgbmVlZAotCQkJICAgICAgICoJdG8gYWNjb3VudCBmb3IgdGhlIEpTQgotCQkJICAgICAgICoJaW5zdHJ1Y3Rpb24gd2UganVzdAotCQkJICAgICAgICoJaW5zZXJ0ZWQuCi0JCQkgICAgICAgKi8KLQkJCSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPj0gMikKLQkJCQlTX1NFVF9WQUxVRSAoc3ltYm9sUCwKLQkJCQkJICAgICBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyA2KTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCU1ha2UgYSBzeW1ib2wgcmVmZXJlbmNlIHRvCi0JCSAgICAgICAqCSJfYyRtYWluX2FyZ3MiIHNvIHdlIGNhbiBnZXQKLQkJICAgICAgICoJaXRzIGFkZHJlc3MgaW5zZXJ0ZWQgaW50byB0aGUKLQkJICAgICAgICoJSlNCIGluc3RydWN0aW9uLgotCQkgICAgICAgKi8KLQkJICAgICAgc3ltYm9sUCA9IChzeW1ib2xTICopIHhtYWxsb2MgKHNpemVvZiAoKnN5bWJvbFApKTsKLQkJICAgICAgU19TRVRfTkFNRSAoc3ltYm9sUCwgIl9DJE1BSU5fQVJHUyIpOwotCQkgICAgICBTX1NFVF9UWVBFIChzeW1ib2xQLCBOX1VOREYpOwotCQkgICAgICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgMCk7Ci0JCSAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIDApOwotCQkgICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgMCk7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X25hbWVfb2Zmc2V0ID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfbnVtYmVyID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfb2JqID0gMDsKLQkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IE5ld19GcmFnOwotCQkgICAgICBzeW1ib2xQLT5zeV9yZXNvbHZlZCA9IDA7Ci0JCSAgICAgIHN5bWJvbFAtPnN5X3Jlc29sdmluZyA9IDA7Ci0JCSAgICAgIC8qIHRoaXMgYWN0dWFsbHkgaW5zZXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0ICovCi0JCSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bWJvbF9yb290UCwgc3ltYm9sUCwKLQkJCQkgICAgICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0JCSAgICAgIHN5bWJvbF9yb290UCA9IHN5bWJvbFA7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqCUdlbmVyYXRlIGEgdGV4dCBmaXh1cCBzdHJ1Y3R1cmUKLQkJICAgICAgICoJdG8gZ2V0ICJfYyRtYWluX2FyZ3MiIHN0b3JlZCBpbnRvIHRoZQotCQkgICAgICAgKglKU0IgaW5zdHJ1Y3Rpb24uCi0JCSAgICAgICAqLwotCQkgICAgICBmaXhQID0gKHN0cnVjdCBmaXggKikgeG1hbGxvYyAoc2l6ZW9mICgqZml4UCkpOwotCQkgICAgICBmaXhQLT5meF9mcmFnID0gTmV3X0ZyYWc7Ci0JCSAgICAgIGZpeFAtPmZ4X3doZXJlID0gNDsKLQkJICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzeW1ib2xQOwotCQkgICAgICBmaXhQLT5meF9zdWJzeSA9IDA7Ci0JCSAgICAgIGZpeFAtPmZ4X29mZnNldCA9IDA7Ci0JCSAgICAgIGZpeFAtPmZ4X3NpemUgPSA0OwotCQkgICAgICBmaXhQLT5meF9wY3JlbCA9IDE7Ci0JCSAgICAgIGZpeFAtPmZ4X25leHQgPSB0ZXh0X2ZpeF9yb290OwotCQkgICAgICB0ZXh0X2ZpeF9yb290ID0gZml4UDsKLQkJICAgICAgLyoKLQkJICAgICAgICoJTm93IG1ha2Ugc3VyZSB3ZSBleGl0IGZyb20gdGhlIGxvb3AKLQkJICAgICAgICovCi0JCSAgICAgIGZyY2hhaW5QID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgLyoKLQkJICAgKglUcnkgdGhlIG5leHQgZnJhZ21lbnQKLQkJICAgKi8KLQkJICBwcmV2X2ZyYWdQUCA9ICZmcmFnUC0+ZnJfbmV4dDsKLQkJICBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0OwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKglUcnkgdGhlIG5leHQgZnJhZ21lbnQgY2hhaW4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoZnJjaGFpblApCi0JCWZyY2hhaW5QID0gZnJjaGFpblAtPmZyY2hfbmV4dDsKLQkgICAgfQotCX0KLSNlbmRpZiAvKiBIQUNLX0RFQ19DX1NUQVJUVVAgKi8KLSAgICB9Ci19Ci0MCi0KLS8qCi0gKglCZWdpbm5pbmcgb2Ygdm1zX3dyaXRlX29iamVjdF9maWxlKCkuCi0gKi8KLQotc3RhdGljCi1zdHJ1Y3Qgdm1zX29ial9zdGF0ZSB7Ci0KLSAgLyogTmV4dCBwcm9ncmFtIHNlY3Rpb24gaW5kZXggdG8gdXNlLiAgKi8KLSAgaW50CXBzZWN0X251bWJlcjsKLQotICAvKiBQc2VjdCBpbmRleCBmb3IgY29kZS4gIEFsd2F5cyBlbmRzIHVwICMwLiAgKi8KLSAgaW50CXRleHRfcHNlY3Q7Ci0KLSAgLyogUHNlY3QgaW5kZXggZm9yIGluaXRpYWxpemVkIHN0YXRpYyB2YXJpYWJsZXMuICAqLwotICBpbnQJZGF0YV9wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3IgdW5pbml0aWFsaXplZCBzdGF0aWMgdmFyaWFibGVzLiAgKi8KLSAgaW50CWJzc19wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3Igc3RhdGljIGNvbnN0cnVjdG9ycy4gICovCi0gIGludAljdG9yc19wc2VjdDsKLQotICAvKiBQc2VjdCBpbmRleCBmb3Igc3RhdGljIGRlc3RydWN0b3JzLiAgKi8KLSAgaW50CWR0b3JzX3BzZWN0OwotCi0gIC8qIE51bWJlciBvZiBieXRlcyB1c2VkIGZvciBsb2NhbCBzeW1ib2wgZGF0YS4gICovCi0gIGludAlsb2NhbF9pbml0ZF9kYXRhX3NpemU7Ci0KLSAgLyogRHluYW1pYyBidWZmZXIgZm9yIGluaXRpYWxpemVkIGRhdGEuICAqLwotICBjaGFyICpkYXRhX3NlZ21lbnQ7Ci0KLX0gdm1zX29ial9zdGF0ZTsKLQotI2RlZmluZSBQc2VjdF9OdW1iZXIJCXZtc19vYmpfc3RhdGUucHNlY3RfbnVtYmVyCi0jZGVmaW5lIFRleHRfUHNlY3QJCXZtc19vYmpfc3RhdGUudGV4dF9wc2VjdAotI2RlZmluZSBEYXRhX1BzZWN0CQl2bXNfb2JqX3N0YXRlLmRhdGFfcHNlY3QKLSNkZWZpbmUgQnNzX1BzZWN0CQl2bXNfb2JqX3N0YXRlLmJzc19wc2VjdAotI2RlZmluZSBDdG9yc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5jdG9yc19wc2VjdAotI2RlZmluZSBEdG9yc19Qc2VjdAkJdm1zX29ial9zdGF0ZS5kdG9yc19wc2VjdAotI2RlZmluZSBMb2NhbF9Jbml0ZF9EYXRhX1NpemUJdm1zX29ial9zdGF0ZS5sb2NhbF9pbml0ZF9kYXRhX3NpemUKLSNkZWZpbmUgRGF0YV9TZWdtZW50CQl2bXNfb2JqX3N0YXRlLmRhdGFfc2VnbWVudAotCi0KLSNkZWZpbmUgSVNfR1hYX1ZUQUJMRShzeW1QKSAoc3RybmNtcCAoU19HRVRfTkFNRSAoc3ltUCksICJfX3Z0LiIsIDUpID09IDApCi0jZGVmaW5lIElTX0dYWF9YVE9SKHN5bVApIChzdHJuY21wIChTX0dFVF9OQU1FIChzeW1QKSwgIl9fR0xPQkFMXy4iLCAxMCkgPT0gMCkKLSNkZWZpbmUgWFRPUl9TSVpFIDQKLQwKLQotLyogUGVyZm9ybSB0ZXh0IHNlZ21lbnQgZml4dXBzLiAgKi8KLQotc3RhdGljIHZvaWQKLXZtc19maXh1cF90ZXh0X3NlY3Rpb24gKHRleHRfc2l6LCB0ZXh0X2ZyYWdfcm9vdCwgZGF0YV9mcmFnX3Jvb3QpCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6OwotICAgICBzdHJ1Y3QgZnJhZyAqdGV4dF9mcmFnX3Jvb3Q7Ci0gICAgIHN0cnVjdCBmcmFnICpkYXRhX2ZyYWdfcm9vdDsKLXsKLSAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICByZWdpc3RlciBzdHJ1Y3QgZml4ICpmaXhQOwotICBvZmZzZXRUIGRpZjsKLQotICAvKiBTY2FuIHRoZSB0ZXh0IGZyYWdtZW50cy4gICovCi0gIGZvciAoZnJhZ1AgPSB0ZXh0X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgewotICAgICAgLyogU3RvcCBpZiB3ZSBnZXQgdG8gdGhlIGRhdGEgZnJhZ21lbnRzLiAgKi8KLSAgICAgIGlmIChmcmFnUCA9PSBkYXRhX2ZyYWdfcm9vdCkKLQlicmVhazsKLSAgICAgIC8qIElnbm9yZSBmcmFnbWVudHMgd2l0aCBubyBkYXRhLiAgKi8KLSAgICAgIGlmICgoZnJhZ1AtPmZyX2ZpeCA9PSAwKSAmJiAoZnJhZ1AtPmZyX3ZhciA9PSAwKSkKLQljb250aW51ZTsKLSAgICAgIC8qIEdvIHRoZSB0aGUgYXBwcm9wcmlhdGUgb2Zmc2V0IGluIHRoZSBUZXh0IFBzZWN0LiAgKi8KLSAgICAgIFZNU19TZXRfUHNlY3QgKFRleHRfUHNlY3QsIGZyYWdQLT5mcl9hZGRyZXNzLCBPQkpfU19DX1RJUik7Ci0gICAgICAvKiBTdG9yZSB0aGUgImZpeGVkIiBwYXJ0LiAgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfZml4KQotCVZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoZnJhZ1AtPmZyX2xpdGVyYWwsCi0JCQkJICBmcmFnUC0+ZnJfZml4LAotCQkJCSAgT0JKX1NfQ19USVIpOwotICAgICAgLyogU3RvcmUgdGhlICJ2YXJpYWJsZSIgcGFydC4gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3ZhciAmJiBmcmFnUC0+ZnJfb2Zmc2V0KQotCVZNU19TdG9yZV9SZXBlYXRlZF9EYXRhIChmcmFnUC0+ZnJfb2Zmc2V0LAotCQkJCSBmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsCi0JCQkJIGZyYWdQLT5mcl92YXIsCi0JCQkJIE9CSl9TX0NfVElSKTsKLSAgICB9CQkJLyogdGV4dCBmcmFnIGxvb3AgKi8KLQotICAvKgotICAgKglOb3cgd2UgZ28gdGhyb3VnaCB0aGUgdGV4dCBzZWdtZW50IGZpeHVwcyBhbmQgZ2VuZXJhdGUKLSAgICoJVElSIHJlY29yZHMgdG8gZml4IHVwIGFkZHJlc3NlcyB3aXRoaW4gdGhlIFRleHQgUHNlY3QuCi0gICAqLwotICBmb3IgKGZpeFAgPSB0ZXh0X2ZpeF9yb290OyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBXZSBETyBoYW5kbGUgdGhlIGNhc2Ugb2YgIlN5bWJvbCAtIFN5bWJvbCIgYXMKLQkgbG9uZyBhcyBpdCBpcyBpbiB0aGUgc2FtZSBzZWdtZW50LiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9zdWJzeSAmJiBmaXhQLT5meF9hZGRzeSkKLQl7Ci0JICAvKiBUaGV5IG5lZWQgdG8gYmUgaW4gdGhlIHNhbWUgc2VnbWVudC4gICovCi0JICBpZiAoU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X3N1YnN5KSAhPQotCSAgICAgIFNfR0VUX1JBV19UWVBFIChmaXhQLT5meF9hZGRzeSkpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIHRoZSBzYW1lIHR5cGUiKSk7Ci0JICAvKiBBbmQgdGhleSBuZWVkIHRvIGJlIGluIG9uZSB0aGF0IHdlIGNhbiBjaGVjayB0aGUgcHNlY3Qgb24uICAqLwotCSAgaWYgKChTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkgIT0gTl9EQVRBKSAmJgotCQkgICAgKFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSAhPSBOX1RFWFQpKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0YSBhZGRzeSBhbmQgc3Vic3kgZG9uJ3QgaGF2ZSBhbiBhcHByb3ByaWF0ZSB0eXBlIikpOwotCSAgLyogVGhpcyBoYWQgYmV0dGVyIG5vdCBiZSBQQyByZWxhdGl2ZSEgICovCi0JICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXRhIGlzIGVycm9uZW91c2x5IFwicGNyZWxcIiIpKTsKLQkgIC8qIFN1YnRyYWN0IHRoZWlyIHZhbHVlcyB0byBnZXQgdGhlIGRpZmZlcmVuY2UuICAqLwotCSAgZGlmID0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KSAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKExvY2FsLCAodmFsdWVUKWRpZiwgZml4UC0+Znhfc2l6ZSk7Ci0JICAvKiBOb3cgZ2VuZXJhdGUgdGhlIGZpeHVwIG9iamVjdCByZWNvcmRzOwotCSAgICAgc2V0IHRoZSBwc2VjdCBhbmQgc3RvcmUgdGhlIGRhdGEuICAqLwotCSAgVk1TX1NldF9Qc2VjdCAoVGV4dF9Qc2VjdCwKLQkJCSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MsCi0JCQkgT0JKX1NfQ19USVIpOwotCSAgVk1TX1N0b3JlX0ltbWVkaWF0ZV9EYXRhIChMb2NhbCwKLQkJCQkgICAgZml4UC0+Znhfc2l6ZSwKLQkJCQkgICAgT0JKX1NfQ19USVIpOwotCSAgY29udGludWU7CS8qIGRvbmUgd2l0aCB0aGlzIGZpeHVwICovCi0JICAgIH0JCS8qIGlmIGZ4X3N1YnN5ICYmIGZ4X2FkZHN5ICovCi0gICAgICAvKiBTaXplIHdpbGwgSEFWRSB0byBiZSAibG9uZyIuICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X3NpemUgIT0gNCkKLQllcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IGEgbG9uZ3dvcmQiKSk7Ci0gICAgICAvKiBTeW1ib2wgbXVzdCBiZSAiYWRkZWQiIChpZiBpdCBpcyBldmVyCi0JIHN1YnRyYWN0ZWQgd2UgY2FuIGZpeCB0aGlzIGFzc3VtcHRpb24pLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwKQotCWVycm9yIChfKCJGaXh1cCBkYXR1bSBpcyBub3QgXCJmaXhQLT5meF9hZGRzeVwiIikpOwotICAgICAgLyogU3RvcmUgdGhlIHN5bWJvbCB2YWx1ZSBpbiBhIFBJQyBmYXNoaW9uLiAgKi8KLSAgICAgIFZNU19TdG9yZV9QSUNfU3ltYm9sX1JlZmVyZW5jZSAoZml4UC0+ZnhfYWRkc3ksCi0JCQkJICAgICAgZml4UC0+Znhfb2Zmc2V0LAotCQkJCSAgICAgIGZpeFAtPmZ4X3BjcmVsLAotCQkJCSAgICAgIFRleHRfUHNlY3QsCi0JCQkJICAgIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgICAgICBPQkpfU19DX1RJUik7Ci0JICAvKgotCSAgICogIENoZWNrIGZvciBpbmRpcmVjdCBhZGRyZXNzIHJlZmVyZW5jZSwgd2hpY2ggaGFzIHRvIGJlIGZpeGVkIHVwCi0JICAgKiAgKGFzIHRoZSBsaW5rZXIgd2lsbCBzY3JldyBpdCB1cCB3aXRoIFRJUl9TX0NfU1RPX1BJQ1IpLi4uCi0JICAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlWTVNfRml4X0luZGlyZWN0X1JlZmVyZW5jZSAoVGV4dF9Qc2VjdCwKLQkJCQkgICAgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJCSAgICBmaXhQLT5meF9mcmFnLAotCQkJCSAgICB0ZXh0X2ZyYWdfcm9vdCk7Ci0gICAgfQkJCS8qIHRleHQgZml4IGxvb3AgKi8KLX0KLQwKLQotLyogQ3JlYXRlIGEgYnVmZmVyIGhvbGRpbmcgdGhlIGRhdGEgc2VnbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zeW50aGVzaXplX2RhdGFfc2VnbWVudCAoZGF0YV9zaXosIHRleHRfc2l6LCBkYXRhX2ZyYWdfcm9vdCkKLSAgICAgdW5zaWduZWQgZGF0YV9zaXosIHRleHRfc2l6OwotICAgICBzdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7Ci17Ci0gIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgY2hhciAqZmlsbF9saXRlcmFsOwotICBsb25nIGZpbGxfc2l6ZSwgY291bnQsIGk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIGRhdGEgc2VnbWVudC4gICovCi0gIERhdGFfU2VnbWVudCA9IChjaGFyICopIHhtYWxsb2MgKGRhdGFfc2l6KTsKLSAgLyogUnVuIHRocm91Z2ggdGhlIGRhdGEgZnJhZ21lbnRzLCBmaWxsaW5nIGluIHRoZSBzZWdtZW50LiAgKi8KLSAgZm9yIChmcmFnUCA9IGRhdGFfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBpID0gZnJhZ1AtPmZyX2FkZHJlc3MgLSB0ZXh0X3NpejsKLSAgICAgIGlmIChmcmFnUC0+ZnJfZml4KQotCW1lbWNweSAoRGF0YV9TZWdtZW50ICsgaSwgZnJhZ1AtPmZyX2xpdGVyYWwsIGZyYWdQLT5mcl9maXgpOwotICAgICAgaSArPSBmcmFnUC0+ZnJfZml4OwotCi0gICAgICBpZiAoKGZpbGxfc2l6ZSA9IGZyYWdQLT5mcl92YXIpICE9IDApCi0JewotCSAgZmlsbF9saXRlcmFsID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4OwotCSAgZm9yIChjb3VudCA9IGZyYWdQLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCSAgICB7Ci0JICAgICAgbWVtY3B5IChEYXRhX1NlZ21lbnQgKyBpLCBmaWxsX2xpdGVyYWwsIGZpbGxfc2l6ZSk7Ci0JICAgICAgaSArPSBmaWxsX3NpemU7Ci0JICAgIH0KLQl9Ci0gICAgfQkJCS8qIGRhdGEgZnJhZyBsb29wICovCi0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFBlcmZvcm0gZGF0YSBzZWdtZW50IGZpeHVwcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZml4dXBfZGF0YV9zZWN0aW9uIChkYXRhX3NpeiwgdGV4dF9zaXopCi0gICAgIHVuc2lnbmVkIGRhdGFfc2l6LCB0ZXh0X3NpejsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLSAgcmVnaXN0ZXIgc3RydWN0IGZpeCAqZml4UDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3A7Ci0gIGFkZHJlc3NUIGZyX2FkZHJlc3M7Ci0gIG9mZnNldFQgZGlmOwotICB2YWx1ZVQgdmFsOwotCi0gIC8qIFJ1biB0aHJvdWdoIGFsbCB0aGUgZGF0YSBzeW1ib2xzIGFuZCBzdG9yZSB0aGUgZGF0YS4gICovCi0gIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotICAgIHsKLSAgICAgIC8qIElnbm9yZSBhbnl0aGluZyBvdGhlciB0aGFuIGRhdGEgc3ltYm9scy4gICovCi0gICAgICBpZiAoU19HRVRfVFlQRSAodnNwLT5TeW1ib2wpICE9IE5fREFUQSkKLQljb250aW51ZTsKLSAgICAgIC8qIFNldCB0aGUgUHNlY3QgKyBPZmZzZXQuICAqLwotICAgICAgVk1TX1NldF9Qc2VjdCAodnNwLT5Qc2VjdF9JbmRleCwKLQkJICAgICAgIHZzcC0+UHNlY3RfT2Zmc2V0LAotCQkgICAgICAgT0JKX1NfQ19USVIpOwotICAgICAgLyogU3RvcmUgdGhlIGRhdGEuICAqLwotICAgICAgdmFsID0gU19HRVRfVkFMVUUgKHZzcC0+U3ltYm9sKTsKLSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoRGF0YV9TZWdtZW50ICsgdmFsIC0gdGV4dF9zaXosCi0JCQkJdnNwLT5TaXplLAotCQkJCU9CSl9TX0NfVElSKTsKLSAgICB9CQkJLyogTl9EQVRBIHN5bWJvbCBsb29wICovCi0KLSAgLyoKLSAgICoJTm93IHdlIGdvIHRocm91Z2ggdGhlIGRhdGEgc2VnbWVudCBmaXh1cHMgYW5kIGdlbmVyYXRlCi0gICAqCVRJUiByZWNvcmRzIHRvIGZpeCB1cCBhZGRyZXNzZXMgd2l0aGluIHRoZSBEYXRhIFBzZWN0cy4KLSAgICovCi0gIGZvciAoZml4UCA9IGRhdGFfZml4X3Jvb3Q7IGZpeFA7IGZpeFAgPSBmaXhQLT5meF9uZXh0KQotICAgIHsKLSAgICAgIC8qIEZpbmQgdGhlIHN5bWJvbCBmb3IgdGhlIGNvbnRhaW5pbmcgZGF0dW0uICAqLwotICAgICAgZm9yICh2c3AgPSBWTVNfU3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0JewotCSAgLyogT25seSBib3RoZXIgd2l0aCBEYXRhIHN5bWJvbHMuICAqLwotCSAgc3AgPSB2c3AtPlN5bWJvbDsKLQkgIGlmIChTX0dFVF9UWVBFIChzcCkgIT0gTl9EQVRBKQotCSAgICBjb250aW51ZTsKLQkgIC8qIElnbm9yZSBzeW1ib2wgaWYgQWZ0ZXIgZml4dXAuICAqLwotCSAgdmFsID0gU19HRVRfVkFMVUUgKHNwKTsKLQkgIGZyX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotCSAgaWYgKHZhbCA+IGZpeFAtPmZ4X3doZXJlICsgZnJfYWRkcmVzcykKLQkgICAgY29udGludWU7Ci0JICAvKiBTZWUgaWYgdGhlIGRhdHVtIGlzIGhlcmUuICAqLwotCSAgaWYgKHZhbCArIHZzcC0+U2l6ZSA8PSBmaXhQLT5meF93aGVyZSArIGZyX2FkZHJlc3MpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogV2UgRE8gaGFuZGxlIHRoZSBjYXNlIG9mICJTeW1ib2wgLSBTeW1ib2wiIGFzCi0JICAgICBsb25nIGFzIGl0IGlzIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgaWYgKGZpeFAtPmZ4X3N1YnN5ICYmIGZpeFAtPmZ4X2FkZHN5KQotCSAgICB7Ci0JICAgICAgLyogVGhleSBuZWVkIHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQuICAqLwotCSAgICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoZml4UC0+Znhfc3Vic3kpICE9Ci0JCSAgU19HRVRfUkFXX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KSkKLQkJZXJyb3IgKF8oIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgdGhlIHNhbWUgdHlwZSIpKTsKLQkgICAgICAvKiBBbmQgdGhleSBuZWVkIHRvIGJlIGluIG9uZSB0aGF0IHdlIGNhbiBjaGVjayB0aGUgcHNlY3Qgb24uICAqLwotCSAgICAgIGlmICgoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fREFUQSkgJiYKLQkJICAoU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpICE9IE5fVEVYVCkpCi0JCWVycm9yIChfKCJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIGFuIGFwcHJvcHJpYXRlIHR5cGUiKSk7Ci0JICAgICAgLyogVGhpcyBoYWQgYmV0dGVyIG5vdCBiZSBQQyByZWxhdGl2ZSEgICovCi0JICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCQllcnJvciAoXygiRml4dXAgZGF0YSBpcyBlcnJvbmVvdXNseSBcInBjcmVsXCIiKSk7Ci0JICAgICAgLyogU3VidHJhY3QgdGhlaXIgdmFsdWVzIHRvIGdldCB0aGUgZGlmZmVyZW5jZS4gICovCi0JICAgICAgZGlmID0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KSAtIFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChMb2NhbCwgKHZhbHVlVClkaWYsIGZpeFAtPmZ4X3NpemUpOwotCSAgICAgIC8qCi0JICAgICAgICogTm93IGdlbmVyYXRlIHRoZSBmaXh1cCBvYmplY3QgcmVjb3JkczsKLQkgICAgICAgKiBzZXQgdGhlIHBzZWN0IGFuZCBzdG9yZSB0aGUgZGF0YS4KLQkgICAgICAgKi8KLQkgICAgICBWTVNfU2V0X1BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LAotCQkJICAgICBmcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUKLQkJCQkgLSB2YWwgKyB2c3AtPlBzZWN0X09mZnNldCwKLQkJCSAgICAgT0JKX1NfQ19USVIpOwotCSAgICAgIFZNU19TdG9yZV9JbW1lZGlhdGVfRGF0YSAoTG9jYWwsCi0JCQkJCWZpeFAtPmZ4X3NpemUsCi0JCQkJCU9CSl9TX0NfVElSKTsKLQkJICBicmVhazsJLyogZG9uZSB3aXRoIHRoaXMgZml4dXAgKi8KLQkJfQotCSAgLyogU2l6ZSB3aWxsIEhBVkUgdG8gYmUgImxvbmciLiAgKi8KLQkgIGlmIChmaXhQLT5meF9zaXplICE9IDQpCi0JICAgIGVycm9yIChfKCJGaXh1cCBkYXR1bSBpcyBub3QgYSBsb25nd29yZCIpKTsKLQkgIC8qIFN5bWJvbCBtdXN0IGJlICJhZGRlZCIgKGlmIGl0IGlzIGV2ZXIKLQkgICAgIHN1YnRyYWN0ZWQgd2UgY2FuIGZpeCB0aGlzIGFzc3VtcHRpb24pLiAgKi8KLQkgIGlmIChmaXhQLT5meF9hZGRzeSA9PSAwKQotCSAgICBlcnJvciAoXygiRml4dXAgZGF0dW0gaXMgbm90IFwiZml4UC0+ZnhfYWRkc3lcIiIpKTsKLQkgIC8qIFN0b3JlIHRoZSBzeW1ib2wgdmFsdWUgaW4gYSBQSUMgZmFzaGlvbi4gICovCi0JICBWTVNfU3RvcmVfUElDX1N5bWJvbF9SZWZlcmVuY2UgKGZpeFAtPmZ4X2FkZHN5LAotCQkJCQkgIGZpeFAtPmZ4X29mZnNldCwKLQkJCQkJICBmaXhQLT5meF9wY3JlbCwKLQkJCQkJICB2c3AtPlBzZWN0X0luZGV4LAotCQkJCQkgIGZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZQotCQkJCQkgICAgICAtIHZhbCArIHZzcC0+UHNlY3RfT2Zmc2V0LAotCQkJCQkgIE9CSl9TX0NfVElSKTsKLQkgIC8qIERvbmUgd2l0aCB0aGlzIGZpeHVwLiAgKi8KLQkgIGJyZWFrOwotCX0JCS8qIHZtc19zeW1ib2wgbG9vcCAqLwotCi0gICAgfQkJCS8qIGRhdGEgZml4IGxvb3AgKi8KLX0KLQotLyogUGVyZm9ybSBjdG9ycy9kdG9ycyBzZWdtZW50IGZpeHVwcy4gICovCi0KLXN0YXRpYyB2b2lkCi12bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoc3ltYm9scywgc2VjdF9ubykKLQlzdHJ1Y3QgVk1TX1N5bWJvbCAqc3ltYm9sczsKLQlpbnQgc2VjdF9ubzsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLQotICAvKiBSdW4gdGhyb3VnaCBhbGwgdGhlIHN5bWJvbHMgYW5kIHN0b3JlIHRoZSBkYXRhLiAgKi8KLSAgZm9yICh2c3AgPSBzeW1ib2xzOyB2c3A7IHZzcCA9IHZzcC0+TmV4dCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBzeW1ib2xTICpzcDsKLQotICAgICAgLyogU2V0IHJlbG9jYXRpb24gYmFzZS4gICovCi0gICAgICBWTVNfU2V0X1BzZWN0ICh2c3AtPlBzZWN0X0luZGV4LCB2c3AtPlBzZWN0X09mZnNldCwgT0JKX1NfQ19USVIpOwotCi0gICAgICBzcCA9IHZzcC0+U3ltYm9sOwotICAgICAgLyogU3RhY2sgdGhlIFBzZWN0IGJhc2Ugd2l0aCBpdHMgb2Zmc2V0LiAgKi8KLSAgICAgIFZNU19TZXRfRGF0YSAoVGV4dF9Qc2VjdCwgU19HRVRfVkFMVUUgKHNwKSwgT0JKX1NfQ19USVIsIDApOwotICAgIH0KLSAgLyogRmx1c2ggdGhlIGJ1ZmZlciBpZiBpdCBpcyBtb3JlIHRoYW4gNzUlIGZ1bGwuICAqLwotICBpZiAoT2JqZWN0X1JlY29yZF9PZmZzZXQgPiAoc2l6ZW9mIChPYmplY3RfUmVjb3JkX0J1ZmZlcikgKiAzIC8gNCkpCi0gICAgRmx1c2hfVk1TX09iamVjdF9SZWNvcmRfQnVmZmVyICgpOwotCi0gIHJldHVybjsKLX0KLQwKLQotLyogRGVmaW5lIHN5bWJvbHMgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkgKHRleHRfc2l6LCBkYXRhX3NpeikKLSAgICAgdW5zaWduZWQgdGV4dF9zaXosIGRhdGFfc2l6OwotewotICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnNwOwotICByZWdpc3RlciBzdHJ1Y3QgVk1TX1N5bWJvbCAqdnNwOwotICBpbnQgR2xvYmFscmVmLCBkZWZpbmVfYXNfZ2xvYmFsX3N5bWJvbDsKLQotI2lmIDAKLSAgLyogVGhlIGcrKyBjb21waWxlciBkb2VzIG5vdCB3cml0ZSBvdXQgZXh0ZXJuYWwgcmVmZXJlbmNlcyB0bwotICAgICB2dGFibGVzIGNvcnJlY3RseS4gIENoZWNrIGZvciB0aGlzIGFuZCBob2xsZXIgaWYgd2Ugc2VlIGl0Ci0gICAgIGhhcHBlbmluZy4gIElmIHRoYXQgY29tcGlsZXIgYnVnIGlzIGV2ZXIgZml4ZWQgd2UgY2FuIHJlbW92ZQotICAgICB0aGlzLgotCi0gICAgIChKdW4nOTU6IGdjYyAyLjcuMCdzIGNjMXBsdXMgc3RpbGwgZXhoaWJpdHMgdGhpcyBiZWhhdmlvci4pCi0KLSAgICAgVGhpcyB3YXMgcmVwb3J0ZWRseSBmaXhlZCBhcyBvZiBKdW5lIDIsIDE5OTguICAgKi8KLQotICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQotICAgIGlmIChTX0dFVF9SQVdfVFlQRSAoc3ApID09IE5fVU5ERiAmJiBJU19HWFhfVlRBQkxFIChzcCkpCi0gICAgICB7Ci0JU19TRVRfVFlQRSAoc3AsIE5fVU5ERiB8IE5fRVhUKTsKLQlTX1NFVF9PVEhFUiAoc3AsIDEpOwotCWFzX3dhcm4gKF8oImcrKyB3cm90ZSBhbiBleHRlcm4gcmVmZXJlbmNlIHRvIGAlcycgYXMgYSByb3V0aW5lLlxuSSB3aWxsIGZpeCBpdCwgYnV0IEkgaG9wZSB0aGF0IGl0IHdhcyBub3RlIHJlYWxseSBhIHJvdXRpbmUuIiksCi0JCSBTX0dFVF9OQU1FIChzcCkpOwotICAgICAgfQotI2VuZGlmCi0KLSAgLyoKLSAgICogTm93IHNjYW4gdGhlIHN5bWJvbHMgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIEdTRCByZWNvcmRzCi0gICAqLwotICBmb3IgKHNwID0gc3ltYm9sX3Jvb3RQOyBzcDsgc3AgPSBzeW1ib2xfbmV4dCAoc3ApKQotICAgIHsKLSAgICAgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMDsKLSAgICAgIHZzcCA9IDA7Ci0gICAgICAvKiBEaXNwYXRjaCBvbiBzeW1ib2wgdHlwZS4gICovCi0gICAgICBzd2l0Y2ggKFNfR0VUX1JBV19UWVBFIChzcCkpCi0JewotCi0JLyogR2xvYmFsIHVuaW5pdGlhbGl6ZWQgZGF0YS4gICovCi0JY2FzZSBOX1VOREYgfCBOX0VYVDoKLQkgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkgIHZzcC0+U3ltYm9sID0gc3A7Ci0JICB2c3AtPlNpemUgPSBTX0dFVF9WQUxVRSAoc3ApOwotCSAgdnNwLT5Qc2VjdF9JbmRleCA9IFBzZWN0X051bWJlcisrOwotCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSAwOwotCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgIHNwLT5zeV9vYmogPSB2c3A7Ci0JICAvKiBNYWtlIHRoZSBwc2VjdCBmb3IgdGhpcyBkYXRhLiAgKi8KLQkgIEdsb2JhbHJlZiA9IFZNU19Qc2VjdF9TcGVjIChTX0dFVF9OQU1FIChzcCksCi0JCQkJICAgICAgdnNwLT5TaXplLAotCQkJCSAgICAgIFNfR0VUX09USEVSIChzcCkgPyBwc19DT05TVCA6IHBzX0NPTU1PTiwKLQkJCQkgICAgICB2c3ApOwotCSAgaWYgKEdsb2JhbHJlZikKLQkgICAgUHNlY3RfTnVtYmVyLS07Ci0jaWZkZWYJTk9UX1ZBWF8xMV9DX0NPTVBBVElCTEUKLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gMTsKLSNlbHNlCi0JICAvKiBTZWUgaWYgdGhpcyBpcyBhbiBleHRlcm5hbCB2dGFibGUuICBXZSB3YW50IHRvIGhlbHAgdGhlCi0JICAgICBsaW5rZXIgZmluZCB0aGVzZSB0aGluZ3MgaW4gbGlicmFyaWVzLCBzbyB3ZSBtYWtlIGEgc3ltYm9sCi0JICAgICByZWZlcmVuY2UuICBUaGlzIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggVkFYLUMgdXNhZ2UgZm9yCi0JICAgICB2YXJpYWJsZXMsIGJ1dCBzaW5jZSB2dGFibGVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieQotCSAgICAgZysrLCB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCB0aGlzIGhhY2suICAqLwotCSAgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wgPSBJU19HWFhfVlRBQkxFIChzcCk7Ci0jZW5kaWYKLQkgIGJyZWFrOwotCi0JLyogTG9jYWwgdW5pbml0aWFsaXplZCBkYXRhLiAgKi8KLQljYXNlIE5fQlNTOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgIHZzcC0+U2l6ZSA9IDA7Ci0JICB2c3AtPlBzZWN0X0luZGV4ID0gQnNzX1BzZWN0OwotCSAgdnNwLT5Qc2VjdF9PZmZzZXQgPSBTX0dFVF9WQUxVRSAoc3ApIC0gYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzOwotCSAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgIHNwLT5zeV9vYmogPSB2c3A7Ci0JICBicmVhazsKLQotCS8qIEdsb2JhbCBpbml0aWFsaXplZCBkYXRhLiAgKi8KLQljYXNlIE5fREFUQSB8IE5fRVhUOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgIHZzcC0+U2l6ZSA9IFZNU19Jbml0aWFsaXplZF9EYXRhX1NpemUgKHNwLCB0ZXh0X3NpeiArIGRhdGFfc2l6KTsKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSBQc2VjdF9OdW1iZXIrKzsKLQkgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gMDsKLQkgIHZzcC0+TmV4dCA9IFZNU19TeW1ib2xzOwotCSAgVk1TX1N5bWJvbHMgPSB2c3A7Ci0JICBzcC0+c3lfb2JqID0gdnNwOwotCSAgLyogTWFrZSBpdHMgcHNlY3QuICAqLwotCSAgR2xvYmFscmVmID0gVk1TX1BzZWN0X1NwZWMgKFNfR0VUX05BTUUgKHNwKSwKLQkJCQkgICAgICB2c3AtPlNpemUsCi0JCQkJICAgICAgU19HRVRfT1RIRVIgKHNwKSA/IHBzX0NPTlNUIDogcHNfQ09NTU9OLAotCQkJCSAgICAgIHZzcCk7Ci0JICBpZiAoR2xvYmFscmVmKQotCSAgICBQc2VjdF9OdW1iZXItLTsKLSNpZmRlZglOT1RfVkFYXzExX0NfQ09NUEFUSUJMRQotCSAgZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wgPSAxOwotI2Vsc2UKLQkgIC8qIFNlZSBOX1VOREZ8Tl9FWFQgYWJvdmUgZm9yIGV4cGxhbmF0aW9uLiAgKi8KLQkgIGRlZmluZV9hc19nbG9iYWxfc3ltYm9sID0gSVNfR1hYX1ZUQUJMRSAoc3ApOwotI2VuZGlmCi0JICBicmVhazsKLQotCS8qIExvY2FsIGluaXRpYWxpemVkIGRhdGEuICAqLwotCWNhc2UgTl9EQVRBOgotCSAgewotCSAgICBjaGFyICpzeW1fbmFtZSA9IFNfR0VUX05BTUUgKHNwKTsKLQotCSAgICAvKiBBbHdheXMgc3VwcHJlc3MgbG9jYWwgbnVtZXJpYyBsYWJlbHMuICAqLwotCSAgICBpZiAoc3ltX25hbWUgJiYgc3RyY21wIChzeW1fbmFtZSwgRkFLRV9MQUJFTF9OQU1FKSA9PSAwKQotCSAgICAgIGJyZWFrOwotCi0JICAgIC8qIE1ha2UgYSBWTVMgZGF0YSBzeW1ib2wgZW50cnkuICAqLwotCSAgICB2c3AgPSAoc3RydWN0IFZNU19TeW1ib2wgKikgeG1hbGxvYyAoc2l6ZW9mICp2c3ApOwotCSAgICB2c3AtPlN5bWJvbCA9IHNwOwotCSAgICB2c3AtPlNpemUgPSBWTVNfSW5pdGlhbGl6ZWRfRGF0YV9TaXplIChzcCwgdGV4dF9zaXogKyBkYXRhX3Npeik7Ci0JICAgIHZzcC0+UHNlY3RfSW5kZXggPSBEYXRhX1BzZWN0OwotCSAgICB2c3AtPlBzZWN0X09mZnNldCA9IExvY2FsX0luaXRkX0RhdGFfU2l6ZTsKLQkgICAgTG9jYWxfSW5pdGRfRGF0YV9TaXplICs9IHZzcC0+U2l6ZTsKLQkgICAgdnNwLT5OZXh0ID0gVk1TX1N5bWJvbHM7Ci0JICAgIFZNU19TeW1ib2xzID0gdnNwOwotCSAgICBzcC0+c3lfb2JqID0gdnNwOwotCSAgfQotCSAgYnJlYWs7Ci0KLQkvKiBHbG9iYWwgVGV4dCBkZWZpbml0aW9uLiAgKi8KLQljYXNlIE5fVEVYVCB8IE5fRVhUOgotCSAgewotCi0JICAgIGlmIChJU19HWFhfWFRPUiAoc3ApKQotCSAgICAgIHsKLQkJdnNwID0gKHN0cnVjdCBWTVNfU3ltYm9sICopIHhtYWxsb2MgKHNpemVvZiAqdnNwKTsKLQkJdnNwLT5TeW1ib2wgPSBzcDsKLQkJdnNwLT5TaXplID0gWFRPUl9TSVpFOwotCQlzcC0+c3lfb2JqID0gdnNwOwotCQlzd2l0Y2ggKChTX0dFVF9OQU1FIChzcCkpWzEwXSkKLQkJICB7Ci0JCSAgICBjYXNlICdJJzoKLQkJICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IEN0b3JzX1BzZWN0OwotCQkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IChDdG9yc19TeW1ib2xzPT0wKT8wOihDdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQrWFRPUl9TSVpFKTsKLQkJICAgICAgdnNwLT5OZXh0ID0gQ3RvcnNfU3ltYm9sczsKLQkJICAgICAgQ3RvcnNfU3ltYm9scyA9IHZzcDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgdnNwLT5Qc2VjdF9JbmRleCA9IER0b3JzX1BzZWN0OwotCQkgICAgICB2c3AtPlBzZWN0X09mZnNldCA9IChEdG9yc19TeW1ib2xzPT0wKT8wOihEdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQrWFRPUl9TSVpFKTsKLQkJICAgICAgdnNwLT5OZXh0ID0gRHRvcnNfU3ltYm9sczsKLQkJICAgICAgRHRvcnNfU3ltYm9scyA9IHZzcDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdHJzoKLQkJICAgICAgYXNfd2FybiAoXygiQ2FuJ3QgaGFuZGxlIGdsb2JhbCB4dG9ycyBzeW1ib2xzIHlldC4iKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYXNfd2FybiAoXygiVW5rbm93biAlcyIpLCBTX0dFVF9OQU1FIChzcCkpOwotCQkgICAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl1bnNpZ25lZCBzaG9ydCBFbnRyeV9NYXNrOwotCi0JCS8qIEdldCB0aGUgZW50cnkgbWFzay4gICovCi0JCWZyYWdQID0gc3AtPnN5X2ZyYWc7Ci0JCS8qIEZpcnN0IGZyYWcgbWlnaHQgYmUgZW1wdHkgaWYgd2UncmUgZ2VuZXJhdGluZyBsaXN0aW5ncy4KLQkJICAgU28gc2tpcCBlbXB0eSByc19maWxsIGZyYWdzLiAgKi8KLQkJd2hpbGUgKGZyYWdQICYmIGZyYWdQLT5mcl90eXBlID09IHJzX2ZpbGwgJiYgZnJhZ1AtPmZyX2ZpeCA9PSAwKQotCQkgIGZyYWdQID0gZnJhZ1AtPmZyX25leHQ7Ci0KLQkJLyogSWYgZmlyc3QgZnJhZyBkb2Vzbid0IGNvbnRhaW4gdGhlIGRhdGEsIHdoYXQgZG8gd2UgZG8/Ci0JCSAgIElmIGl0J3MgcG9zc2libHkgc21hbGxlciB0aGFuIHR3byBieXRlcywgdGhhdCB3b3VsZAotCQkgICBpbXBseSB0aGF0IHRoZSBlbnRyeSBtYXNrIGlzIG5vdCBzdG9yZWQgd2hlcmUgd2UncmUKLQkJICAgZXhwZWN0aW5nIGl0LgotCi0JCSAgIElmIHlvdSBjYW4gZmluZCBhIHRlc3QgY2FzZSB0aGF0IHRyaWdnZXJzIHRoaXMsIHJlcG9ydAotCQkgICBpdCAoYW5kIHRlbGwgbWUgd2hhdCB0aGUgZW50cnkgbWFzayBmaWVsZCBvdWdodCB0byBiZSksCi0JCSAgIGFuZCBJJ2xsIHRyeSB0byBmaXggaXQuICBLUiAqLwotCQlpZiAoZnJhZ1AtPmZyX2ZpeCA8IDIpCi0JCSAgYWJvcnQgKCk7Ci0KLQkJRW50cnlfTWFzayA9IChmcmFnUC0+ZnJfbGl0ZXJhbFswXSAmIDB4MDBmZikgfAotCQkJICAgICAoKGZyYWdQLT5mcl9saXRlcmFsWzFdICYgMHgwMGZmKSA8PCA4KTsKLQkJLyogRGVmaW5lIHRoZSBwcm9jZWR1cmUgZW50cnkgcG9pbnQuICAqLwotCQlWTVNfUHJvY2VkdXJlX0VudHJ5X1B0IChTX0dFVF9OQU1FIChzcCksCi0JCQkJICAgIFRleHRfUHNlY3QsCi0JCQkJICAgIFNfR0VUX1ZBTFVFIChzcCksCi0JCQkJICAgIEVudHJ5X01hc2spOwotCSAgICAgIH0KLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQkvKiBMb2NhbCBUZXh0IGRlZmluaXRpb24uICAqLwotCWNhc2UgTl9URVhUOgotCSAgLyogTWFrZSBhIFZNUyBkYXRhIHN5bWJvbCBlbnRyeS4gICovCi0JICBpZiAoVGV4dF9Qc2VjdCAhPSAtMSkKLQkgICAgewotCSAgICAgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JICAgICAgdnNwLT5TeW1ib2wgPSBzcDsKLQkgICAgICB2c3AtPlNpemUgPSAwOwotCSAgICAgIHZzcC0+UHNlY3RfSW5kZXggPSBUZXh0X1BzZWN0OwotCSAgICAgIHZzcC0+UHNlY3RfT2Zmc2V0ID0gU19HRVRfVkFMVUUgKHNwKTsKLQkgICAgICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKLQkgICAgICBWTVNfU3ltYm9scyA9IHZzcDsKLQkgICAgICBzcC0+c3lfb2JqID0gdnNwOwotCSAgICB9Ci0JICBicmVhazsKLQotCS8qIEdsb2JhbCBSZWZlcmVuY2UuICAqLwotCWNhc2UgTl9VTkRGOgotCSAgLyogTWFrZSBhIEdTRCBnbG9iYWwgc3ltYm9sIHJlZmVyZW5jZSByZWNvcmQuICAqLwotCSAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAotCQkJCSAgMCwKLQkJCQkgIDAsCi0JCQkJICBHQkxTWU1fUkVGKTsKLQkgIGJyZWFrOwotCi0JLyogQWJzb2x1dGUgc3ltYm9sLiAgKi8KLQljYXNlIE5fQUJTOgotCWNhc2UgTl9BQlMgfCBOX0VYVDoKLQkgIC8qIGdjYyBkb2Vzbid0IGdlbmVyYXRlIHRoZXNlOwotCSAgICAgVk1TX0VtaXRfR2xvYmFsdmFsdWUgaGFuZGxlcyB0aGVtIHRob3VnaC4JKi8KLQkgIHZzcCA9IChzdHJ1Y3QgVk1TX1N5bWJvbCAqKSB4bWFsbG9jIChzaXplb2YgKnZzcCk7Ci0JICB2c3AtPlN5bWJvbCA9IHNwOwotCSAgdnNwLT5TaXplID0gNDsJCS8qIGFsd2F5cyBhc3N1bWUgMzIgYml0cyAqLwotCSAgdnNwLT5Qc2VjdF9JbmRleCA9IDA7Ci0JICB2c3AtPlBzZWN0X09mZnNldCA9IFNfR0VUX1ZBTFVFIChzcCk7Ci0JICB2c3AtPk5leHQgPSBWTVNfU3ltYm9sczsKLQkgIFZNU19TeW1ib2xzID0gdnNwOwotCSAgc3AtPnN5X29iaiA9IHZzcDsKLQkgIGJyZWFrOwotCi0JLyogQW55dGhpbmcgZWxzZS4gICovCi0JZGVmYXVsdDoKLQkgIC8qIElnbm9yZSBTVEFCIHN5bWJvbHMsIGluY2x1ZGluZyAuc3RhYnMgZW1pdHRlZCBieSBnKysuICAqLwotCSAgaWYgKFNfSVNfREVCVUcgKHNwKSB8fCAoU19HRVRfVFlQRSAoc3ApID09IDIyKSkKLQkgICAgYnJlYWs7Ci0JICAvKgotCSAgICoJRXJyb3Igb3RoZXJ3aXNlLgotCSAgICovCi0JICBhc190c2t0c2sgKF8oInVuaGFuZGxlZCBzdGFiIHR5cGUgJWQiKSwgU19HRVRfVFlQRSAoc3ApKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgLyogR2xvYmFsIHN5bWJvbHMgaGF2ZSBkaWZmZXJlbnQgbGlua2FnZSB0aGFuIGV4dGVybmFsIHZhcmlhYmxlcy4gICovCi0gICAgICBpZiAoZGVmaW5lX2FzX2dsb2JhbF9zeW1ib2wpCi0JVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAoU19HRVRfTkFNRSAoc3ApLAotCQkJCXZzcC0+UHNlY3RfSW5kZXgsCi0JCQkJMCwKLQkJCQlHQkxTWU1fREVGKTsKLSAgICB9Ci0KLSAgcmV0dXJuOwotfQotDAotCi0vKiBPdXRwdXQgZGVidWdnZXIgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uIGZvciBzeW1ib2xzIHdoaWNoCi0gICBhcmUgbG9jYWwgdG8gYSBzcGVjaWZpYyByb3V0aW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWxvY2FsX3N5bWJvbHNfRFNUIChzMFAsIEN1cnJlbnRfUm91dGluZSkKLSAgICAgc3ltYm9sUyAqczBQLCAqQ3VycmVudF9Sb3V0aW5lOwotewotICBzeW1ib2xTICpzMVA7Ci0gIGNoYXIgKnMwUF9uYW1lLCAqcG50MCwgKnBudDE7Ci0KLSAgczBQX25hbWUgPSBTX0dFVF9OQU1FIChzMFApOwotICBpZiAoKnMwUF9uYW1lKysgIT0gJ18nKQotICAgIHJldHVybjsKLQotICBmb3IgKHMxUCA9IEN1cnJlbnRfUm91dGluZTsgczFQOyBzMVAgPSBzeW1ib2xfbmV4dCAoczFQKSkKLSAgICB7Ci0jaWYgMAkJLyogcmVkdW5kYW50OyBSQVdfVFlQRSAhPSBOX0ZVTiBzdWZmaWNlcyAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzMVApKQotCWNvbnRpbnVlOwotI2VuZGlmCi0gICAgICBpZiAoU19HRVRfUkFXX1RZUEUgKHMxUCkgIT0gTl9GVU4pCi0JY29udGludWU7Ci0gICAgICBwbnQwID0gczBQX25hbWU7Ci0gICAgICBwbnQxID0gU19HRVRfTkFNRSAoczFQKTsKLSAgICAgIC8qIFdlIGFzc3VtZSB0aGUgdHdvIHN0cmluZ3MgYXJlIG5ldmVyIGV4YWN0bHkgZXF1YWwuLi4gICovCi0gICAgICB3aGlsZSAoKnBudDArKyA9PSAqcG50MSsrKQotCXsKLQl9Ci0gICAgICAvKiBGb3VuZCBpdCBpZiBzMFAgbmFtZSBpcyBleGhhdXN0ZWQgYW5kIHMxUCBuYW1lIGhhcyAiOkYiIG9yICI6ZiIgbmV4dC4KLQkgTm90ZTogIGJvdGggcG9pbnRlcnMgaGF2ZSBhZHZhbmNlZCBvbmUgcGFzdCB0aGUgbm9uLW1hdGNoaW5nIGNoYXIuICAqLwotICAgICAgaWYgKCgqcG50MSA9PSAnRicgfHwgKnBudDEgPT0gJ2YnKSAmJiAqLS1wbnQxID09ICc6JyAmJiAqLS1wbnQwID09ICdcMCcpCi0JewotCSAgRGVmaW5lX1JvdXRpbmUgKHMxUCwgMCwgQ3VycmVudF9Sb3V0aW5lLCBUZXh0X1BzZWN0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0KLS8qIENvbnN0cnVjdCBhbmQgb3V0cHV0IHRoZSBkZWJ1ZyBzeW1ib2wgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotdm1zX2J1aWxkX0RTVCAodGV4dF9zaXopCi0gICAgIHVuc2lnbmVkIHRleHRfc2l6OwotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBzeW1ib2xTICpDdXJyZW50X1JvdXRpbmUgPSAwOwotICBzdHJ1Y3QgaW5wdXRfZmlsZSAqQ3VyX0ZpbGUgPSAwOwotICBvZmZzZXRUIEN1cl9PZmZzZXQgPSAtMTsKLSAgaW50IEN1cl9MaW5lX051bWJlciA9IDA7Ci0gIGludCBGaWxlX051bWJlciA9IDA7Ci0gIGludCBEZWJ1Z2dlcl9PZmZzZXQgPSAwOwotICBpbnQgZmlsZV9hdmFpbGFibGU7Ci0gIGludCBkc2M7Ci0gIG9mZnNldFQgdmFsOwotCi0gIC8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgQmVnaW4gTW9kdWxlIHJlY29yZC4gICovCi0gIFZNU19UQlRfTW9kdWxlX0JlZ2luICgpOwotCi0gIC8qCi0gICAqCU91dHB1dCBkZWJ1Z2dpbmcgaW5mbyBmb3IgZ2xvYmFsIHZhcmlhYmxlcyBhbmQgc3RhdGljIHZhcmlhYmxlcwotICAgKgl0aGF0IGFyZSBub3Qgc3BlY2lmaWMgdG8gb25lIHJvdXRpbmUuICBXZSBhbHNvIG5lZWQgdG8gZXhhbWluZQotICAgKglhbGwgc3RhYnMgZGlyZWN0aXZlcywgdG8gZmluZCB0aGUgZGVmaW5pdGlvbnMgdG8gYWxsIG9mIHRoZQotICAgKglhZHZhbmNlZCBkYXRhIHR5cGVzLCBhbmQgdGhpcyBpcyBkb25lIGJ5IFZNU19MU1lNX1BhcnNlLiAgVGhpcwotICAgKgluZWVkcyB0byBiZSBkb25lIGJlZm9yZSBhbnkgZGVmaW5pdGlvbnMgYXJlIG91dHB1dCB0byB0aGUgb2JqZWN0Ci0gICAqCWZpbGUsIHNpbmNlIHRoZXJlIGNhbiBiZSBmb3J3YXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN0YWJzCi0gICAqCWRpcmVjdGl2ZXMuICBXaGVuIHRocm91Z2ggd2l0aCBwYXJzaW5nLCB0aGUgdGV4dCBvZiB0aGUgc3RhYnMKLSAgICoJZGlyZWN0aXZlIGlzIGFsdGVyZWQsIHdpdGggdGhlIGRlZmluaXRpb25zIHJlbW92ZWQsIHNvIHRoYXQgbGF0ZXIKLSAgICoJcGFzc2VzIHdpbGwgc2VlIGRpcmVjdGl2ZXMgYXMgdGhleSB3b3VsZCBiZSB3cml0dGVuIGlmIHRoZSB0eXBlCi0gICAqCXdlcmUgYWxyZWFkeSBkZWZpbmVkLgotICAgKgotICAgKglXZSBhbHNvIGxvb2sgZm9yIGZpbGVzIGFuZCBpbmNsdWRlIGZpbGVzLCBhbmQgbWFrZSBhIGxpc3Qgb2YKLSAgICoJdGhlbS4gIFdlIGV4YW1pbmUgdGhlIHNvdXJjZSBmaWxlIG51bWJlcnMgdG8gZXN0YWJsaXNoIHRoZSBhY3R1YWwKLSAgICoJbGluZXMgdGhhdCBjb2RlIHdhcyBnZW5lcmF0ZWQgZnJvbSwgYW5kIHRoZW4gZ2VuZXJhdGUgb2Zmc2V0cy4KLSAgICovCi0gIFZNU19MU1lNX1BhcnNlICgpOwotICBmb3IgKHN5bWJvbFAgPSBzeW1ib2xfcm9vdFA7IHN5bWJvbFA7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogT25seSBkZWFsIHdpdGggU1RBQiBzeW1ib2xzIGhlcmUuICAqLwotICAgICAgaWYgKCFTX0lTX0RFQlVHIChzeW1ib2xQKSkKLQljb250aW51ZTsKLSAgICAgIC8qCi0gICAgICAgKglEaXNwYXRjaCBvbiBTVEFCIHR5cGUuCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoU19HRVRfUkFXX1RZUEUgKHN5bWJvbFApKQotCXsKLQljYXNlIE5fU0xJTkU6Ci0JICBkc2MgPSBTX0dFVF9ERVNDIChzeW1ib2xQKTsKLQkgIGlmIChkc2MgPiBDdXJfRmlsZS0+bWF4X2xpbmUpCi0JICAgIEN1cl9GaWxlLT5tYXhfbGluZSA9IGRzYzsKLQkgIGlmIChkc2MgPCBDdXJfRmlsZS0+bWluX2xpbmUpCi0JICAgIEN1cl9GaWxlLT5taW5fbGluZSA9IGRzYzsKLQkgIGJyZWFrOwotCWNhc2UgTl9TTzoKLQkgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgIEN1cl9GaWxlLT5mbGFnID0gMTsKLQkgIEN1cl9GaWxlLT5taW5fbGluZSA9IDE7Ci0JICBicmVhazsKLQljYXNlIE5fU09MOgotCSAgQ3VyX0ZpbGUgPSBmaW5kX2ZpbGUgKHN5bWJvbFApOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0dTWU06Ci0JICBWTVNfR1NZTV9QYXJzZSAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBicmVhazsKLQljYXNlIE5fTENTWU06Ci0JICBWTVNfTENTWU1fUGFyc2UgKHN5bWJvbFAsIFRleHRfUHNlY3QpOwotCSAgYnJlYWs7Ci0JY2FzZSBOX0ZVTjoJCS8qIEZvciBzdGF0aWMgY29uc3RhbnQgc3ltYm9scyAqLwotCWNhc2UgTl9TVFNZTToKLQkgIFZNU19TVFNZTV9QYXJzZSAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQkJLyogc3dpdGNoICovCi0gICAgfQkJCS8qIGZvciAqLwotCi0gIC8qCi0gICAqCU5vdyB3ZSB0YWtlIGEgcXVpY2sgc3dlZXAgdGhyb3VnaCB0aGUgZmlsZXMgYW5kIGFzc2lnbiBvZmZzZXRzCi0gICAqCXRvIGVhY2ggb25lLiAgVGhpcyB3aWxsIGVzc2VudGlhbGx5IGJlIHRoZSBzdGFydGluZyBsaW5lIG51bWJlciB0bwotICAgKgl0aGUgZGVidWdnZXIgZm9yIGVhY2ggZmlsZS4gIE91dHB1dCB0aGUgaW5mbyBmb3IgdGhlIGRlYnVnZ2VyIHRvCi0gICAqCXNwZWNpZnkgdGhlIGZpbGVzLCBhbmQgdGhlbiB0ZWxsIGl0IGhvdyBtYW55IGxpbmVzIHRvIHVzZS4KLSAgICovCi0gIGZvciAoQ3VyX0ZpbGUgPSBmaWxlX3Jvb3Q7IEN1cl9GaWxlOyBDdXJfRmlsZSA9IEN1cl9GaWxlLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChDdXJfRmlsZS0+bWF4X2xpbmUgPT0gMCkKLQljb250aW51ZTsKLSAgICAgIGlmICgoc3RybmNtcCAoQ3VyX0ZpbGUtPm5hbWUsICJHTlVfR1hYX0lOQ0xVREU6IiwgMTYpID09IDApICYmCi0JICAhZmxhZ19kZWJ1ZykKLQljb250aW51ZTsKLSAgICAgIGlmICgoc3RybmNtcCAoQ3VyX0ZpbGUtPm5hbWUsICJHTlVfQ0NfSU5DTFVERToiLCAxNSkgPT0gMCkgJiYKLQkgICFmbGFnX2RlYnVnKQotCWNvbnRpbnVlOwotICAgICAgLyogc2hvdyBhIGZldyBleHRyYSBsaW5lcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiBzZWxlY3RlZCAqLwotICAgICAgaWYgKEN1cl9GaWxlLT5taW5fbGluZSA+IDIpCi0JQ3VyX0ZpbGUtPm1pbl9saW5lIC09IDI7Ci0gICAgICBDdXJfRmlsZS0+b2Zmc2V0ID0gRGVidWdnZXJfT2Zmc2V0IC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMTsKLSAgICAgIERlYnVnZ2VyX09mZnNldCArPSBDdXJfRmlsZS0+bWF4X2xpbmUgLSBDdXJfRmlsZS0+bWluX2xpbmUgKyAxOwotICAgICAgaWYgKEN1cl9GaWxlLT5zYW1lX2ZpbGVfZnBudCkKLQl7Ci0JICBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgPSBDdXJfRmlsZS0+c2FtZV9maWxlX2ZwbnQtPmZpbGVfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgPSArK0ZpbGVfTnVtYmVyOwotCSAgZmlsZV9hdmFpbGFibGUgPSBWTVNfVEJUX1NvdXJjZV9GaWxlIChDdXJfRmlsZS0+bmFtZSwKLQkJCQkJCUN1cl9GaWxlLT5maWxlX251bWJlcik7Ci0JICBpZiAoIWZpbGVfYXZhaWxhYmxlKQotCSAgICB7Ci0JICAgICAgQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID0gMDsKLQkgICAgICBGaWxlX051bWJlci0tOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgICAgVk1TX1RCVF9Tb3VyY2VfTGluZXMgKEN1cl9GaWxlLT5maWxlX251bWJlciwKLQkJCSAgICBDdXJfRmlsZS0+bWluX2xpbmUsCi0JCQkgICAgQ3VyX0ZpbGUtPm1heF9saW5lIC0gQ3VyX0ZpbGUtPm1pbl9saW5lICsgMSk7Ci0gIH0JCQkvKiBmb3IgKi8KLSAgQ3VyX0ZpbGUgPSAoc3RydWN0IGlucHV0X2ZpbGUgKikgTlVMTDsKLQotICAvKgotICAgKglTY2FuIHRoZSBzeW1ib2xzIGFuZCB3cml0ZSBvdXQgdGhlIHJvdXRpbmVzCi0gICAqCSh0aGlzIG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgc3ltYm9scyBhcmUgaW4KLSAgICoJIG9yZGVyIG9mIGFzY2VuZGluZyB0ZXh0IHNlZ21lbnQgb2Zmc2V0KQotICAgKi8KLSAgZm9yIChzeW1ib2xQID0gc3ltYm9sX3Jvb3RQOyBzeW1ib2xQOyBzeW1ib2xQID0gc3ltYm9sX25leHQgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKglEZWFsIHdpdGggdGV4dCBzeW1ib2xzLgotICAgICAgICovCi0gICAgICBpZiAoIVNfSVNfREVCVUcgKHN5bWJvbFApICYmIFNfR0VUX1RZUEUgKHN5bWJvbFApID09IE5fVEVYVCkKLQl7Ci0JICAvKgotCSAgICogSWdub3JlIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCAiTCIsIGFzIHRoZXkgYXJlIGxvY2FsIHN5bWJvbHMuCi0JICAgKi8KLQkgIGlmICgqU19HRVRfTkFNRSAoc3ltYm9sUCkgPT0gJ0wnKQotCSAgICBjb250aW51ZTsKLQkgIC8qCi0JICAgKiBJZiB0aGVyZSBpcyBhIHJvdXRpbmUgc3RhcnQgZGVmaW5lZCwgdGVybWluYXRlIGl0LgotCSAgICovCi0JICBpZiAoQ3VycmVudF9Sb3V0aW5lKQotCSAgICBWTVNfVEJUX1JvdXRpbmVfRW5kICh0ZXh0X3NpeiwgQ3VycmVudF9Sb3V0aW5lKTsKLQotCSAgLyoKLQkgICAqIENoZWNrIGZvciAmIHNraXAgZHVtbXkgbGFiZWxzIGxpa2UgImdjY19jb21waWxlZC4iLgotCSAgICogVGhleSdyZSBpZGVudGlmaWVkIGJ5IHRoZSBJTl9ERUZBVUxUX1NFQ1RJT04gZmxhZy4KLQkgICAqLwotCSAgaWYgKChTX0dFVF9PVEhFUiAoc3ltYm9sUCkgJiBJTl9ERUZBVUxUX1NFQ1RJT04pICE9IDAgJiYKLQkgICAgICBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgPT0gMCkKLQkgICAgY29udGludWU7Ci0JICAvKgotCSAgICogU3RvcmUgdGhlIHJvdXRpbmUgYmVnaW4gdHJhY2ViYWNrIGluZm8uCi0JICAgKi8KLQkgIFZNU19UQlRfUm91dGluZV9CZWdpbiAoc3ltYm9sUCwgVGV4dF9Qc2VjdCk7Ci0JICBDdXJyZW50X1JvdXRpbmUgPSBzeW1ib2xQOwotCSAgLyoKLQkgICAqIERlZmluZSBzeW1ib2xzIGxvY2FsIHRvIHRoaXMgcm91dGluZS4KLQkgICAqLwotCSAgbG9jYWxfc3ltYm9sc19EU1QgKHN5bWJvbFAsIEN1cnJlbnRfUm91dGluZSk7Ci0JICAvKgotCSAgICoJRG9uZQotCSAgICovCi0JICBjb250aW51ZTsKLQotCX0KLSAgICAgIC8qCi0gICAgICAgKglEZWFsIHdpdGggU1RBQiBzeW1ib2xzLgotICAgICAgICovCi0gICAgICBlbHNlIGlmIChTX0lTX0RFQlVHIChzeW1ib2xQKSkKLQl7Ci0JICAvKgotCSAgICogIERpc3BhdGNoIG9uIFNUQUIgdHlwZS4KLQkgICAqLwotCSAgc3dpdGNoIChTX0dFVF9SQVdfVFlQRSAoc3ltYm9sUCkpCi0JICAgIHsKLQkJLyoKLQkJICoJTGluZSBudW1iZXIKLQkJICovCi0JICAgIGNhc2UgTl9TTElORToKLQkgICAgICAvKiBPZmZzZXQgdGhlIGxpbmUgaW50byB0aGUgY29ycmVjdCBwb3J0aW9uIG9mIHRoZSBmaWxlLiAgKi8KLQkgICAgICBpZiAoQ3VyX0ZpbGUtPmZpbGVfbnVtYmVyID09IDApCi0JCWJyZWFrOwotCSAgICAgIHZhbCA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgICAvKiBTb21ldGltZXMgdGhlIHNhbWUgb2Zmc2V0IGdldHMgc2V2ZXJhbCBzb3VyY2UgbGluZXMKLQkJIGFzc2lnbmVkIHRvIGl0LiAgV2Ugc2hvdWxkIGJlIHNlbGVjdGl2ZSBhYm91dCB3aGljaAotCQkgbGluZXMgd2UgYWxsb3csIHdlIHNob3VsZCBwcmVmZXIgbGluZXMgdGhhdCBhcmUgaW4KLQkJIHRoZSBtYWluIHNvdXJjZSBmaWxlIHdoZW4gZGVidWdnaW5nIGlubGluZSBmdW5jdGlvbnMuICAqLwotCSAgICAgIGlmICh2YWwgPT0gQ3VyX09mZnNldCAmJiBDdXJfRmlsZS0+ZmlsZV9udW1iZXIgIT0gMSkKLQkJYnJlYWs7Ci0KLQkgICAgICAvKiBjYWxjdWxhdGUgYWN0dWFsIGRlYnVnZ2VyIHNvdXJjZSBsaW5lICovCi0JICAgICAgZHNjID0gU19HRVRfREVTQyAoc3ltYm9sUCkgKyBDdXJfRmlsZS0+b2Zmc2V0OwotCSAgICAgIFNfU0VUX0RFU0MgKHN5bWJvbFAsIGRzYyk7Ci0JICAgICAgLyoKLQkgICAgICAgKiBEZWZpbmUgUEMvTGluZSBjb3JyZWxhdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBpZiAoQ3VyX09mZnNldCA9PSAtMSkKLQkJewotCQkgIC8qCi0JCSAgICogRmlyc3QgTl9TTElORTsgc2V0IHVwIGluaXRpYWwgY29ycmVsYXRpb24uCi0JCSAgICovCi0JCSAgVk1TX1RCVF9MaW5lX1BDX0NvcnJlbGF0aW9uIChkc2MsCi0JCQkJCSAgICAgICB2YWwsCi0JCQkJCSAgICAgICBUZXh0X1BzZWN0LAotCQkJCQkgICAgICAgMCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoZHNjIC0gQ3VyX0xpbmVfTnVtYmVyKSA8PSAwKQotCQl7Ci0JCSAgLyoKLQkJICAgKiBMaW5lIGRlbHRhIGlzIG5vdCArdmUsIHdlIG5lZWQgdG8gY2xvc2UgdGhlIGxpbmUgYW5kCi0JCSAgICogc3RhcnQgYSBuZXcgUEMvTGluZSBjb3JyZWxhdGlvbi4KLQkJICAgKi8KLQkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKDAsCi0JCQkJCSAgICAgICB2YWwgLSBDdXJfT2Zmc2V0LAotCQkJCQkgICAgICAgMCwKLQkJCQkJICAgICAgIC0xKTsKLQkJICBWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKGRzYywKLQkJCQkJICAgICAgIHZhbCwKLQkJCQkJICAgICAgIFRleHRfUHNlY3QsCi0JCQkJCSAgICAgICAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qCi0JCSAgICogTGluZSBkZWx0YSBpcyArdmUsIGFsbCBpcyB3ZWxsLgotCQkgICAqLwotCQkgIFZNU19UQlRfTGluZV9QQ19Db3JyZWxhdGlvbiAoZHNjIC0gQ3VyX0xpbmVfTnVtYmVyLAotCQkJCQkgICAgICAgdmFsIC0gQ3VyX09mZnNldCwKLQkJCQkJICAgICAgIDAsCi0JCQkJCSAgICAgICAxKTsKLQkJfQotCSAgICAgIC8qIFVwZGF0ZSB0aGUgY3VycmVudCBsaW5lL1BDIGluZm8uICAqLwotCSAgICAgIEN1cl9MaW5lX051bWJlciA9IGRzYzsKLQkgICAgICBDdXJfT2Zmc2V0ID0gdmFsOwotCSAgICAgIGJyZWFrOwotCi0JCS8qCi0JCSAqCVNvdXJjZSBmaWxlCi0JCSAqLwotCSAgICBjYXNlIE5fU086Ci0JICAgICAgLyogUmVtZW1iZXIgdGhhdCB3ZSBoYWQgYSBzb3VyY2UgZmlsZSBhbmQgZW1pdAotCQkgdGhlIHNvdXJjZSBmaWxlIGRlYnVnZ2VyIHJlY29yZC4gICovCi0JICAgICAgQ3VyX0ZpbGUgPSBmaW5kX2ZpbGUgKHN5bWJvbFApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTl9TT0w6Ci0JICAgICAgLyogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgcmVhbGx5IGluIHRoZSBhY3R1YWwKLQkJIHNvdXJjZSBmaWxlIHdoZW4gd2UgY29tcHV0ZSB0aGUgbWF4aW11bSBsaW5lIG51bWJlci4KLQkJIE90aGVyd2lzZSB0aGUgZGVidWdnZXIgZ2V0cyByZWFsbHkgY29uZnVzZWQuICAqLwotCSAgICAgIEN1cl9GaWxlID0gZmluZF9maWxlIChzeW1ib2xQKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGJyZWFrOwotCSAgICB9CQkvKiBzd2l0Y2ggKi8KLQl9CQkvKiBpZiAoSVNfREVCVUcpICovCi0gICAgfQkJCS8qIGZvciAqLwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGVyZSBpcyBhIHJvdXRpbmUgc3RhcnQgZGVmaW5lZCwgdGVybWluYXRlIGl0Ci0gICAgICogKGFuZCB0aGUgbGluZSBudW1iZXJzKS4KLSAgICAgKi8KLSAgICBpZiAoQ3VycmVudF9Sb3V0aW5lKQotICAgICAgewotCS8qIFRlcm1pbmF0ZSB0aGUgbGluZSBudW1iZXJzLiAgKi8KLQlWTVNfVEJUX0xpbmVfUENfQ29ycmVsYXRpb24gKDAsCi0JCQkJICAgICB0ZXh0X3NpeiAtIFNfR0VUX1ZBTFVFIChDdXJyZW50X1JvdXRpbmUpLAotCQkJCSAgICAgMCwKLQkJCQkgICAgIC0xKTsKLQkvKiBUZXJtaW5hdGUgdGhlIHJvdXRpbmUuICAqLwotCVZNU19UQlRfUm91dGluZV9FbmQgKHRleHRfc2l6LCBDdXJyZW50X1JvdXRpbmUpOwotICAgICAgfQotCi0gIC8qIFdyaXRlIHRoZSBUcmFjZWJhY2sgRW5kIE1vZHVsZSBUQlQgcmVjb3JkLiAgKi8KLSAgVk1TX1RCVF9Nb2R1bGVfRW5kICgpOwotfQotDAotCi0vKiBXcml0ZSBhIFZBWC9WTVMgb2JqZWN0IGZpbGUgKGV2ZXJ5dGhpbmcgZWxzZSBoYXMgYmVlbiBkb25lISkuICAqLwotCi12b2lkCi12bXNfd3JpdGVfb2JqZWN0X2ZpbGUgKHRleHRfc2l6LCBkYXRhX3NpeiwgYnNzX3NpeiwgdGV4dF9mcmFnX3Jvb3QsCi0JCSAgICAgICBkYXRhX2ZyYWdfcm9vdCkKLSAgICAgdW5zaWduZWQgdGV4dF9zaXo7Ci0gICAgIHVuc2lnbmVkIGRhdGFfc2l6OwotICAgICB1bnNpZ25lZCBic3Nfc2l6OwotICAgICBmcmFnUyAqdGV4dF9mcmFnX3Jvb3Q7Ci0gICAgIGZyYWdTICpkYXRhX2ZyYWdfcm9vdDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IFZNU19TeW1ib2wgKnZzcDsKLQotICAvKgotICAgKiBJbml0aWFsaXplIHByb2dyYW0gc2VjdGlvbiBpbmRpY2VzOyB2YWx1ZXMgZ2V0IHVwZGF0ZWQgbGF0ZXIuCi0gICAqLwotICBQc2VjdF9OdW1iZXIgPSAwOwkJLyogbmV4dCBQc2VjdCBJbmRleCB0byB1c2UgKi8KLSAgVGV4dF9Qc2VjdCA9IC0xOwkJLyogVGV4dCBQc2VjdCBJbmRleCAgICovCi0gIERhdGFfUHNlY3QgPSAtMjsJCS8qIERhdGEgUHNlY3QgSW5kZXggICBKRjogV2FzIC0xICovCi0gIEJzc19Qc2VjdCA9IC0zOwkJLyogQnNzIFBzZWN0IEluZGV4ICAgIEpGOiBXYXMgLTEgKi8KLSAgQ3RvcnNfUHNlY3QgPSAtNDsJCS8qIEN0b3JzIFBzZWN0IEluZGV4ICAqLwotICBEdG9yc19Qc2VjdCA9IC01OwkJLyogRHRvcnMgUHNlY3QgSW5kZXggICovCi0gIC8qIEluaXRpYWxpemUgb3RoZXIgc3RhdGUgdmFyaWFibGVzLiAgKi8KLSAgRGF0YV9TZWdtZW50ID0gMDsKLSAgTG9jYWxfSW5pdGRfRGF0YV9TaXplID0gMDsKLQotICAvKgotICAgKglDcmVhdGUgdGhlIGFjdHVhbCBvdXRwdXQgZmlsZSBhbmQgcG9wdWxhdGUgaXQgd2l0aCByZXF1aXJlZAotICAgKgkibW9kdWxlIGhlYWRlciIgaW5mb3JtYXRpb24uCi0gICAqLwotICBDcmVhdGVfVk1TX09iamVjdF9GaWxlICgpOwotICBXcml0ZV9WTVNfTUhEX1JlY29yZHMgKCk7Ci0KLSAgLyoKLSAgICoJQ3JlYXRlIHRoZSBEYXRhIHNlZ21lbnQ6Ci0gICAqCi0gICAqCVNpbmNlIHRoaXMgaXMgUkVBTExZIGhhcmQgdG8gZG8gYW55IG90aGVyIHdheSwKLSAgICoJd2UgYWN0dWFsbHkgbWFudWZhY3R1cmUgdGhlIGRhdGEgc2VnbWVudCBhbmQKLSAgICoJdGhlbiBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIG91dCBvZiBpdC4KLSAgICoJV2UgbmVlZCB0byBnZW5lcmF0ZSB0aGlzIGVhcmx5LCBzbyB0aGF0IGdsb2JhbHZhbHVlcwotICAgKgljYW4gYmUgcHJvcGVybHkgZW1pdHRlZC4KLSAgICovCi0gIGlmIChkYXRhX3NpeiA+IDApCi0gICAgc3ludGhlc2l6ZV9kYXRhX3NlZ21lbnQgKGRhdGFfc2l6LCB0ZXh0X3NpeiwgZGF0YV9mcmFnX3Jvb3QpOwotCi0KLSAgLyoqKioqKiogIEdsb2JhbCBTeW1ib2wgRGlyZWN0b3J5ICAqKioqKioqLwotCi0gIC8qCi0gICAqCUVtaXQgZ2xvYmFsdmFsdWVzIG5vdy4gIFdlIG11c3QgZG8gdGhpcyBiZWZvcmUgdGhlIHRleHQgcHNlY3QgaXMKLSAgICoJZGVmaW5lZCwgb3Igd2Ugd2lsbCBnZXQgbGlua2VyIHdhcm5pbmdzIGFib3V0IG11bHRpcGx5IGRlZmluZWQKLSAgICoJc3ltYm9scy4gIEFsbCBvZiB0aGUgZ2xvYmFsdmFsdWVzICJyZWZlcmVuY2UiIHBzZWN0IDAsIGFsdGhvdWdoCi0gICAqCWl0IHJlYWxseSBkb2VzIG5vdCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggaXQuCi0gICAqLwotICBWTVNfRW1pdF9HbG9iYWx2YWx1ZXMgKHRleHRfc2l6LCBkYXRhX3NpeiwgRGF0YV9TZWdtZW50KTsKLSAgLyoKLSAgICoJRGVmaW5lIHRoZSBUZXh0IFBzZWN0Ci0gICAqLwotICBUZXh0X1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7Ci0gIFZNU19Qc2VjdF9TcGVjICgiJGNvZGUiLCB0ZXh0X3NpeiwgcHNfVEVYVCwgMCk7Ci0gIC8qCi0gICAqCURlZmluZSB0aGUgQlNTIFBzZWN0Ci0gICAqLwotICBpZiAoYnNzX3NpeiA+IDApCi0gICAgewotICAgICAgQnNzX1BzZWN0ID0gUHNlY3RfTnVtYmVyKys7Ci0gICAgICBWTVNfUHNlY3RfU3BlYyAoIiR1bmluaXRpYWxpemVkX2RhdGEiLCBic3Nfc2l6LCBwc19EQVRBLCAwKTsKLSAgICB9Ci0gIC8qCi0gICAqIERlZmluZSBzeW1ib2xzIHRvIHRoZSBsaW5rZXIuCi0gICAqLwotICBnbG9iYWxfc3ltYm9sX2RpcmVjdG9yeSAodGV4dF9zaXosIGRhdGFfc2l6KTsKLSAgLyoKLSAgICoJRGVmaW5lIHRoZSBEYXRhIFBzZWN0Ci0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwICYmIExvY2FsX0luaXRkX0RhdGFfU2l6ZSA+IDApCi0gICAgewotICAgICAgRGF0YV9Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKCIkZGF0YSIsIExvY2FsX0luaXRkX0RhdGFfU2l6ZSwgcHNfREFUQSwgMCk7Ci0gICAgICAvKgotICAgICAgICogTG9jYWwgaW5pdGlhbGl6ZWQgZGF0YSAoTl9EQVRBKSBzeW1ib2xzIG5lZWQgdG8gYmUgdXBkYXRlZCB0byB0aGUKLSAgICAgICAqIHByb3BlciB2YWx1ZSBvZiBEYXRhX1BzZWN0IG5vdyB0aGF0IGl0J3MgYWN0dWFsbHkgYmVlbiBkZWZpbmVkLgotICAgICAgICogKEEgZHVtbXkgdmFsdWUgd2FzIHVzZWQgaW4gZ2xvYmFsX3N5bWJvbF9kaXJlY3RvcnkoKSBhYm92ZS4pCi0gICAgICAgKi8KLSAgICAgIGZvciAodnNwID0gVk1TX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCWlmICh2c3AtPlBzZWN0X0luZGV4IDwgMCAmJiBTX0dFVF9SQVdfVFlQRSAodnNwLT5TeW1ib2wpID09IE5fREFUQSkKLQkgIHZzcC0+UHNlY3RfSW5kZXggPSBEYXRhX1BzZWN0OwotICAgIH0KLQotCi0gIGlmIChDdG9yc19TeW1ib2xzICE9IDApCi0gICAgewotICAgICAgY2hhciAqcHNfbmFtZSA9ICIkY3RvcnMiOwotICAgICAgQ3RvcnNfUHNlY3QgPSBQc2VjdF9OdW1iZXIrKzsKLSAgICAgIFZNU19Qc2VjdF9TcGVjIChwc19uYW1lLCBDdG9yc19TeW1ib2xzLT5Qc2VjdF9PZmZzZXQgKyBYVE9SX1NJWkUsCi0JCSAgICAgIHBzX0NUT1JTLCAwKTsKLSAgICAgIFZNU19HbG9iYWxfU3ltYm9sX1NwZWMgKHBzX25hbWUsIEN0b3JzX1BzZWN0LAotCQkJCSAgMCwgR0JMU1lNX0RFRnxHQkxTWU1fV0VBSyk7Ci0gICAgICBmb3IgKHZzcCA9IEN0b3JzX1N5bWJvbHM7IHZzcDsgdnNwID0gdnNwLT5OZXh0KQotCXZzcC0+UHNlY3RfSW5kZXggPSBDdG9yc19Qc2VjdDsKLSAgICB9Ci0KLSAgaWYgKER0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpwc19uYW1lID0gIiRkdG9ycyI7Ci0gICAgICBEdG9yc19Qc2VjdCA9IFBzZWN0X051bWJlcisrOwotICAgICAgVk1TX1BzZWN0X1NwZWMgKHBzX25hbWUsIER0b3JzX1N5bWJvbHMtPlBzZWN0X09mZnNldCArIFhUT1JfU0laRSwKLQkJICAgICAgcHNfRFRPUlMsIDApOwotICAgICAgVk1TX0dsb2JhbF9TeW1ib2xfU3BlYyAocHNfbmFtZSwgRHRvcnNfUHNlY3QsCi0JCQkJICAwLCBHQkxTWU1fREVGfEdCTFNZTV9XRUFLKTsKLSAgICAgIGZvciAodnNwID0gRHRvcnNfU3ltYm9sczsgdnNwOyB2c3AgPSB2c3AtPk5leHQpCi0JdnNwLT5Qc2VjdF9JbmRleCA9IER0b3JzX1BzZWN0OwotICAgIH0KLQotICAvKioqKioqKiAgVGV4dCBJbmZvcm1hdGlvbiBhbmQgUmVsb2NhdGlvbiBSZWNvcmRzICAqKioqKioqLwotCi0gIC8qCi0gICAqCVdyaXRlIHRoZSB0ZXh0IHNlZ21lbnQgZGF0YQotICAgKi8KLSAgaWYgKHRleHRfc2l6ID4gMCkKLSAgICB2bXNfZml4dXBfdGV4dF9zZWN0aW9uICh0ZXh0X3NpeiwgdGV4dF9mcmFnX3Jvb3QsIGRhdGFfZnJhZ19yb290KTsKLSAgLyoKLSAgICoJV3JpdGUgdGhlIGRhdGEgc2VnbWVudCBkYXRhLCB0aGVuIGRpc2NhcmQgaXQuCi0gICAqLwotICBpZiAoZGF0YV9zaXogPiAwKQotICAgIHsKLSAgICAgIHZtc19maXh1cF9kYXRhX3NlY3Rpb24gKGRhdGFfc2l6LCB0ZXh0X3Npeik7Ci0gICAgICBmcmVlIChEYXRhX1NlZ21lbnQpLCAgRGF0YV9TZWdtZW50ID0gMDsKLSAgICB9Ci0KLSAgaWYgKEN0b3JzX1N5bWJvbHMgIT0gMCkKLSAgICB7Ci0gICAgICB2bXNfZml4dXBfeHRvcnNfc2VjdGlvbiAoQ3RvcnNfU3ltYm9scywgQ3RvcnNfUHNlY3QpOwotICAgIH0KLQotICBpZiAoRHRvcnNfU3ltYm9scyAhPSAwKQotICAgIHsKLSAgICAgIHZtc19maXh1cF94dG9yc19zZWN0aW9uIChEdG9yc19TeW1ib2xzLCBEdG9yc19Qc2VjdCk7Ci0gICAgfQotCi0KLSAgLyoqKioqKiogIERlYnVnZ2VyIFN5bWJvbCBUYWJsZSBSZWNvcmRzICAqKioqKioqLwotCi0gIHZtc19idWlsZF9EU1QgKHRleHRfc2l6KTsKLQotCi0gIC8qKioqKioqICBXcmFwIHRoaW5ncyB1cCAgKioqKioqKi8KLQotICAvKgotICAgKglXcml0ZSB0aGUgRW5kIE9mIE1vZHVsZSByZWNvcmQKLSAgICovCi0gIGlmIChFbnRyeV9Qb2ludF9TeW1ib2wpCi0gICAgV3JpdGVfVk1TX0VPTV9SZWNvcmQgKFRleHRfUHNlY3QsIFNfR0VUX1ZBTFVFIChFbnRyeV9Qb2ludF9TeW1ib2wpKTsKLSAgZWxzZQotICAgIFdyaXRlX1ZNU19FT01fUmVjb3JkICgtMSwgKHZhbHVlVCkgMCk7Ci0KLSAgLyoKLSAgICoJQWxsIGRvbmUsIGNsb3NlIHRoZSBvYmplY3QgZmlsZQotICAgKi8KLSAgQ2xvc2VfVk1TX09iamVjdF9GaWxlICgpOwotfQotCi0vKiBlbmQgb2Ygb2JqLXZtcy5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL29iai12bXMuaCBiL2dhcy9jb25maWcvb2JqLXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDhmZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvb2JqLXZtcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUxICswLDAgQEAKLS8qIFZNUyBvYmplY3QgZmlsZSBmb3JtYXQKLSAgIENvcHlyaWdodCAoQykgMTk4OSwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAqLwotCi0vKiBUYWcgdG8gdmFsaWRhdGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgT0JKX1ZNUyAxCi0KLSNpbmNsdWRlICJ0YXJnLWNwdS5oIgotCi0jZGVmaW5lIExPTkdXT1JEX0FMSUdOTUVOVAkyCi0KLS8qIFRoaXMgbWFjcm8gY29udHJvbHMgc3Vic2VjdGlvbiBhbGlnbm1lbnQgd2l0aGluIGEgc2VjdGlvbi4KLSAqCi0gKiBVbmRlciBWQVgvVk1TLCB0aGUgbGlua2VyIChhbmQgUFNFQ1Qgc3BlY2lmaWNhdGlvbnMpCi0gKiB0YWtlIGNhcmUgb2YgY29ycmVjdGx5IGFsaWduaW5nIHRoZSBzZWdtZW50cy4KLSAqIERvaW5nIHRoZSBhbGlnbm1lbnQgaGVyZSAob24gaW5pdGlhbGl6ZWQgZGF0YSkgY2FuCi0gKiBtZXNzIHVwIHRoZSBjYWxjdWxhdGlvbiBvZiBnbG9iYWwgZGF0YSBQU0VDVCBzaXplcy4KLSAqLwotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpCVwKLQkJKCgoU0VHKSA9PSBkYXRhX3NlY3Rpb24pID8gMCA6IExPTkdXT1JEX0FMSUdOTUVOVCkKLQotLyogVGhpcyBmbGFnIGlzIHVzZWQgdG8gcmVtZW1iZXIgd2hldGhlciB3ZSBhcmUgaW4gdGhlIGNvbnN0IG9yIHRoZQotICAgZGF0YSBzZWN0aW9uLiAgQnkgYW5kIGxhcmdlIHRoZXkgYXJlIGlkZW50aWNhbCwgYnV0IHdlIHNldCBhIG5vLXdyaXRlCi0gICBiaXQgZm9yIHBzZWN0cyBpbiB0aGUgY29uc3Qgc2VjdGlvbi4gICovCi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGNvbnN0X2ZsYWc7Ci0KLS8qIFRoaXMgaXMgb3ZlcmxvYWRlZCBvbnRvIGNvbnN0X2ZsYWcsIGZvciBjb252ZW5pZW5jZS4gIEl0J3MgdXNlZCB0byBmbGFnCi0gICBkdW1teSBsYWJlbHMgbGlrZSAiZ2NjMl9jb21waWxlZC4iICB3aGljaCBvY2N1ciBiZWZvcmUgdGhlIGZpcnN0IC50ZXh0Ci0gICBvciAuZGF0YSBzZWN0aW9uIGRpcmVjdGl2ZS4gICovCi0KLSNkZWZpbmUgSU5fREVGQVVMVF9TRUNUSU9OIDB4ODAKLQotLyogVGhlc2UgYXJlIGRlZmluZWQgaW4gb2JqLXZtcy5jLiAqLwotZXh0ZXJuIGNvbnN0IHNob3J0IHNlZ19OX1RZUEVbXTsKLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsKLQotI3VuZGVmIE5PX1JFTE9DCi1lbnVtIHJlbG9jX3R5cGUKLSAgewotICAgIE5PX1JFTE9DLCBSRUxPQ18zMgotICB9OwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSgwKQotI2RlZmluZSBOX1RYVE9GRih4KQkoIHNpemVvZihzdHJ1Y3QgZXhlYykgKQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgKHgpLmFfdGV4dCApCi0jZGVmaW5lIE5fVFJPRkYoeCkJKCBOX0RBVE9GRih4KSArICh4KS5hX2RhdGEgKQotI2RlZmluZSBOX0RST0ZGKHgpCSggTl9UUk9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZGVmaW5lIE5fU1lNT0ZGKHgpCSggTl9EUk9GRih4KSArICh4KS5hX2Ryc2l6ZSApCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLQotLyogV2UgdXNlIHRoaXMgY29weSBvZiB0aGUgZXhlYyBoZWFkZXIgZm9yIFZNUy4gIFdlIGRvIG5vdCBhY3R1YWxseSB1c2UgaXQsIGJ1dAotICAgd2hhdCB3ZSBhY3R1YWxseSBkbyBpcyBsZXQgZ2FzIGZpbGwgaW4gdGhlIHJlbGV2YW50IHNsb3RzLCBhbmQgd2hlbiB3ZSBnZXQKLSAgIGFyb3VuZCB0byB3cml0aW5nIGFuIG9iaiBmaWxlLCB3ZSBqdXN0IHBpY2sgb3V0IHdoYXQgd2UgbmVlZC4gICovCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIGxvbmcgYV90ZXh0OwkJLyogbGVuZ3RoIG9mIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9kYXRhOwkJLyogbGVuZ3RoIG9mIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9ic3M7CQkvKiBsZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgZm9yIGZpbGUsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV90cnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIHRleHQsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9kcnNpemU7CS8qIGxlbmd0aCBvZiByZWxvY2F0aW9uIGluZm8gZm9yIGRhdGEsIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGxvbmcgYV9lbnRyeTsJLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBleGVjIGhlYWRlcjsJCS8qIGEub3V0IGhlYWRlciAqLwotICAgIGxvbmcgc3RyaW5nX3RhYmxlX3NpemU7CS8qIG5hbWVzICsgJ1wwJyArIHNpemVvZihpbnQpICovCi0gIH0KLW9iamVjdF9oZWFkZXJzOwotCi0vKiBBIHNpbmdsZSBlbnRyeSBpbiB0aGUgc3ltYm9sIHRhYmxlCi0gKiAodGhpcyBzdGFydGVkIGFzIGEgY2xvbmUgb2YgYm91dC5oJ3Mgbmxpc3QsIGJ1dCBtdWNoIHdhcyB1bm5lZWRlZCkuCi0gKi8KLXN0cnVjdCBubGlzdAotICB7Ci0gICAgY2hhciAqbl9uYW1lOwotICAgIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkvKiBTZWUgYmVsb3cJCQkJKi8KLSAgICB1bnNpZ25lZCBjaGFyIG5fb3RoZXI7CS8qIHVzZWQgZm9yIGNvbnN0X2ZsYWcgYW5kICJkZWZhdWx0IHNlY3Rpb24iICovCi0gICAgdW5zaWduZWQJOiAxNjsJCS8qIHBhZGRpbmcgZm9yIGFsaWdubWVudCAqLwotICAgIGludCBuX2Rlc2M7CQkJLyogc291cmNlIGxpbmUgbnVtYmVyIGZvciBOX1NMSU5FIHN0YWJzICovCi0gIH07Ci0KLS8qIExlZ2FsIHZhbHVlcyBvZiBuX3R5cGUgKHNlZSBhb3V0L3N0YWIuZGVmIGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIGNvZGVzKS4KLSAqLwotI2RlZmluZSBOX1VOREYJMAkJLyogVW5kZWZpbmVkIHN5bWJvbAkqLwotI2RlZmluZSBOX0FCUwkyCQkvKiBBYnNvbHV0ZSBzeW1ib2wJKi8KLSNkZWZpbmUgTl9URVhUCTQJCS8qIFRleHQgc3ltYm9sCQkqLwotI2RlZmluZSBOX0RBVEEJNgkJLyogRGF0YSBzeW1ib2wJCSovCi0jZGVmaW5lIE5fQlNTCTgJCS8qIEJTUyBzeW1ib2wJCSovCi0jZGVmaW5lIE5fRk4JMzEJCS8qIEZpbGVuYW1lIHN5bWJvbAkqLwotCi0jZGVmaW5lIE5fRVhUCTEJCS8qIEV4dGVybmFsIHN5bWJvbCAoT1InZCBpbiB3aXRoIG9uZSBvZiBhYm92ZSkJKi8KLSNkZWZpbmUgTl9UWVBFCTAzNgkJLyogTWFzayBmb3IgYWxsIHRoZSB0eXBlIGJpdHMJCQkqLwotCi0jZGVmaW5lIE5fU1RBQgkwMzQwCQkvKiBNYXNrIGZvciBhbGwgYml0cyB1c2VkIGZvciBTREIgZW50cmllcyAJKi8KLQotI2luY2x1ZGUgImFvdXQvc3RhYl9nbnUuaCIKLQotLyogU1lNQk9MIFRBQkxFICovCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgZGF0YSB0eXBlICovCi0KLXR5cGVkZWYgc3RydWN0IG5saXN0IG9ial9zeW1ib2xfdHlwZTsJLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLS8qIFN5bWJvbCB0YWJsZSBtYWNyb3MgYW5kIGNvbnN0YW50cyAqLwotCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHN0cnVjdCBWTVNfU3ltYm9sICoKLQotLyoKLSAqICBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICogIFRoaXMgc3ludGF4aWMgaW5kaXJlY3Rpb24gYWxsb3dzIGluZGVwZW5kZW5jZSByZWdhcmRpbmcgYS5vdXQgb3IgY29mZi4KLSAqICBUaGUgYXJndW1lbnQgKHMpIG9mIGFsbCB0aGVzZSBtYWNyb3MgaXMgYSBwb2ludGVyIHRvIGEgc3ltYm9sIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX0lTX0VYVEVSTkFMKHMpCSgocyktPnN5X3N5bWJvbC5uX3R5cGUgJiBOX0VYVCkKLQotLyogVHJ1ZSBpZiBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCwgaWUgaXMgaW4gTl97VEVYVCxEQVRBLEJTUyxBQlN9IG9yIE5fRVhUICovCi0jZGVmaW5lIFNfSVNfREVGSU5FRChzKQkJKFNfR0VUX1RZUEUocykgIT0gTl9VTkRGKQotCi0jZGVmaW5lIFNfSVNfQ09NTU9OKHMpCShTX0dFVF9UWVBFKHMpID09IE5fVU5ERiAmJiBTX0dFVF9WQUxVRShzKSAhPSAwKQotCi0jZGVmaW5lIFNfSVNfUkVHSVNURVIocykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9PSBOX1JFR0lTVEVSKQotCi0vKiBUcnVlIGlmIGEgZGVidWcgc3BlY2lhbCBzeW1ib2wgZW50cnkgKi8KLSNkZWZpbmUgU19JU19ERUJVRyhzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fU1RBQikKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbG9jYWwgc3ltYm9sIG5hbWUgKi8KLS8qIEEgc3ltYm9sIG5hbWUgd2hvc2UgbmFtZSBiZWdpbiB3aXRoIF5BIGlzIGEgZ2FzIGludGVybmFsIHBzZXVkbyBzeW1ib2wKLSAgIG5hbWVsZXNzIHN5bWJvbHMgY29tZSBmcm9tIC5zdGFiIGRpcmVjdGl2ZXMuICovCi0jZGVmaW5lIFNfSVNfTE9DQUwocykJCShTX0dFVF9OQU1FKHMpICYmIFwKLQkJCQkgIVNfSVNfREVCVUcocykgJiYgXAotCQkJCSAoc3RyY2hyKFNfR0VUX05BTUUocyksICdcMDAxJykgIT0gMCB8fCBcCi0JCQkJICBzdHJjaHIoU19HRVRfTkFNRShzKSwgJ1wwMDInKSAhPSAwIHx8IFwKLQkJCQkgIChTX0xPQ0FMX05BTUUocykgJiYgIWZsYWdfa2VlcF9sb2NhbHMpKSkKLS8qIFRydWUgaWYgYSBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBmaWxlICovCi0jZGVmaW5lIFNfSVNfRVhURVJOKHMpCQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICYgTl9FWFQpCi0vKiBUcnVlIGlmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZ2VuZXJhdGVkIGJlY2F1c2Ugb2YgYSAuc3RhYmQgZGlyZWN0aXZlICovCi0jZGVmaW5lIFNfSVNfU1RBQkQocykJCShTX0dFVF9OQU1FKHMpID09IChjaGFyICopMCkKLQotLyogQWNjZXNzb3JzICovCi0vKiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfR0VUX05BTUUocykJCSgocyktPnN5X3N5bWJvbC5uX25hbWUpCi0vKiBUaGUgcG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlICovCi0jZGVmaW5lIFNfR0VUX09GRlNFVChzKQkJKChzKS0+c3lfbmFtZV9vZmZzZXQpCi0vKiBUaGUgcmF3IHR5cGUgb2YgdGhlIHN5bWJvbCAqLwotI2RlZmluZSBTX0dFVF9SQVdfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSkKLS8qIFRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgKi8KLSNkZWZpbmUgU19HRVRfVFlQRShzKQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmIE5fVFlQRSkKLS8qIFRoZSBudW1lcmljIHZhbHVlIG9mIHRoZSBzZWdtZW50ICovCi0jZGVmaW5lIFNfR0VUX1NFR01FTlQocykJKE5fVFlQRV9zZWdbU19HRVRfVFlQRShzKV0pCi0vKiBUaGUgbl9vdGhlciBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfR0VUX09USEVSKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9vdGhlcikKLS8qIFRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX0dFVF9ERVNDKHMpCQkoKHMpLT5zeV9zeW1ib2wubl9kZXNjKQotCi0vKiBNb2RpZmllcnMgKi8KLS8qIEFzc3VtZSB0aGF0IGEgc3ltYm9sIGNhbm5vdCBiZSBzaW11bHRhbmVvdXNseSBpbiBtb3JlIHRoYW4gb24gc2VnbWVudCAqLwotLyogc2V0IHNlZ21lbnQgKi8KLSNkZWZpbmUgU19TRVRfU0VHTUVOVChzLHNlZykJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSAmPSB+Tl9UWVBFLChzKS0+c3lfc3ltYm9sLm5fdHlwZXw9U0VHTUVOVF9UT19TWU1CT0xfVFlQRShzZWcpKQotLyogVGhlIHN5bWJvbCBpcyBleHRlcm5hbCAqLwotI2RlZmluZSBTX1NFVF9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlIHw9IE5fRVhUKQotLyogVGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwgKi8KLSNkZWZpbmUgU19DTEVBUl9FWFRFUk5BTChzKQkoKHMpLT5zeV9zeW1ib2wubl90eXBlICY9IH5OX0VYVCkKLS8qIFNldCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sICovCi0jZGVmaW5lIFNfU0VUX05BTUUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fbmFtZSA9ICh2KSkKLS8qIFNldCB0aGUgb2Zmc2V0IGluIHRoZSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU19TRVRfT0ZGU0VUKHMsdikJKChzKS0+c3lfbmFtZV9vZmZzZXQgPSAodikpCi0vKiBTZXQgdGhlIG5fb3RoZXIgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9PVEhFUihzLHYpCSgocyktPnN5X3N5bWJvbC5uX290aGVyID0gKHYpKQotLyogU2V0IHRoZSBuX2Rlc2MgZXhwcmVzc2lvbiB2YWx1ZSAqLwotI2RlZmluZSBTX1NFVF9ERVNDKHMsdikJCSgocyktPnN5X3N5bWJvbC5uX2Rlc2MgPSAodikpCi0vKiBTZXQgdGhlIG5fdHlwZSBleHByZXNzaW9uIHZhbHVlICovCi0jZGVmaW5lIFNfU0VUX1RZUEUocyx2KQkJKChzKS0+c3lfc3ltYm9sLm5fdHlwZSA9ICh2KSkKLQotCi0vKiBGaWxlIGhlYWRlciBtYWNybyBhbmQgdHlwZSBkZWZpbml0aW9uICovCi0KLSNkZWZpbmUgSF9HRVRfVEVYVF9TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV90ZXh0KQotI2RlZmluZSBIX0dFVF9EQVRBX1NJWkUoaCkJCSgoaCktPmhlYWRlci5hX2RhdGEpCi0jZGVmaW5lIEhfR0VUX0JTU19TSVpFKGgpCQkoKGgpLT5oZWFkZXIuYV9ic3MpCi0KLSNkZWZpbmUgSF9TRVRfVEVYVF9TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX3RleHQgPSBtZF9zZWN0aW9uX2FsaWduKFNFR19URVhULCAodikpKQotI2RlZmluZSBIX1NFVF9EQVRBX1NJWkUoaCx2KQkJKChoKS0+aGVhZGVyLmFfZGF0YSA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX0RBVEEsICh2KSkpCi0jZGVmaW5lIEhfU0VUX0JTU19TSVpFKGgsdikJCSgoaCktPmhlYWRlci5hX2JzcyA9IG1kX3NlY3Rpb25fYWxpZ24oU0VHX0JTUywgKHYpKSkKLQotI2RlZmluZSBIX1NFVF9TVFJJTkdfU0laRShoLHYpCQkoKGgpLT5zdHJpbmdfdGFibGVfc2l6ZSA9ICh2KSkKLSNkZWZpbmUgSF9TRVRfU1lNQk9MX1RBQkxFX1NJWkUoaCx2KQkoKGgpLT5oZWFkZXIuYV9zeW1zID0gKHYpICogXAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBubGlzdCkpCi0KLS8qIGxpbmUgbnVtYmVyaW5nIHN0dWZmLiAqLwotI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSwgYiwgYykJezt9Ci0KLSNkZWZpbmUgb2JqX3N5bWJvbF9uZXdfaG9vayhzKQl7O30KLQotLyogRm9yY2Ugc3RydWN0dXJlIHRhZ3MgaW50byBzY29wZSBzbyB0aGF0IHRoZWlyIHVzZSBpbiBwcm90b3R5cGVzCi0gICB3aWxsIG5ldmVyIGJlIHRoZWlyIGZpcnN0IG9jY3VyYW5jZS4gICovCi1zdHJ1Y3QgZml4Owotc3RydWN0IGZyYWc7Ci0KLS8qIG9iai12bXMgcm91dGluZXMgdmlzaWJsZSB0byB0aGUgcmVzdCBvZiBnYXMuICAqLwotCi1leHRlcm4gdm9pZCB0Y19hb3V0X2ZpeF90b19jaGFycyBQQVJBTVMgKChjaGFyICosc3RydWN0IGZpeCAqLHJlbGF4X2FkZHJlc3NUKSk7Ci0KLWV4dGVybiBpbnQgdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSBSRVNPTFZFX1NZTUJPTF9SRURFRklOSVRJT04oWCkJdm1zX3Jlc29sdmVfc3ltYm9sX3JlZGVmKFgpCi0KLS8qIENvbXBpbGVyLWdlbmVyYXRlZCBsYWJlbCAiX192YXhfZ19kb3VibGVzIiBpcyB1c2VkIHRvIGF1Z21lbnQgLnN0YWJzLiAqLwotZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9zcGVjaWFsX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotI2RlZmluZSBvYmpfZnJvYl9sYWJlbChYKSB2bXNfY2hlY2tfZm9yX3NwZWNpYWxfbGFiZWwoWCkKLQotZXh0ZXJuIHZvaWQgdm1zX2NoZWNrX2Zvcl9tYWluIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgdm1zX3dyaXRlX29iamVjdF9maWxlIFBBUkFNUyAoKHVuc2lnbmVkLHVuc2lnbmVkLHVuc2lnbmVkLAotCQkJCQkgICBzdHJ1Y3QgZnJhZyAqLHN0cnVjdCBmcmFnICopKTsKLQotLyogVk1TIGV4ZWN1dGFibGVzIGFyZSBub3RoaW5nIGxpa2UgYS5vdXQsIGJ1dCB0aGUgVk1TIHBvcnQgb2YgZ2NjIHVzZXMKLSAgIGEub3V0IGZvcm1hdCBzdGFicyB3aGljaCBvYmotdm1zLmMgdGhlbiB0cmFuc2xhdGVzLiAgKi8KLQotI2RlZmluZSBBT1VUX1NUQUJTCi0KLQwKLSNpZmRlZiBXQU5UX1ZNU19PQkpfREVGUwotCi0vKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIGNvbnN0YW50cyB1c2VkIHdpdGhpbgotICAgdGhlIGFjdHVhbCBWTVMgb2JqZWN0IGZpbGUuICBXZSBkbyBub3QgdXNlIGEgJCBpbiB0aGUgc3ltYm9scyAoYXMgcGVyCi0gICB1c3VhbCBWTVMgY29udmVudGlvbikgc2luY2UgU3lzdGVtIFYgZ2FncyBvbiBpdC4gICovCi0KLSNkZWZpbmUJT0JKX1NfQ19IRFIJMAotI2RlZmluZQlPQkpfU19DX0hEUl9NSEQJMAotI2RlZmluZQlPQkpfU19DX0hEUl9MTk0JMQotI2RlZmluZQlPQkpfU19DX0hEUl9TUkMJMgotI2RlZmluZQlPQkpfU19DX0hEUl9UVEwJMwotI2RlZmluZQlPQkpfU19DX0hEUl9DUFIJNAotI2RlZmluZQlPQkpfU19DX0hEUl9NVEMJNQotI2RlZmluZQlPQkpfU19DX0hEUl9HVFgJNgotI2RlZmluZQlPQkpfU19DX0dTRAkxCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1BTQwkwCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1NZTQkxCi0jZGVmaW5lCU9CSl9TX0NfR1NEX0VQTQkyCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1BSTwkzCi0jZGVmaW5lCU9CSl9TX0NfR1NEX1NZTVcJNAotI2RlZmluZQlPQkpfU19DX0dTRF9FUE1XCTUKLSNkZWZpbmUJT0JKX1NfQ19HU0RfUFJPVwk2Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0lEQwk3Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0VOVgk4Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0xTWQk5Ci0jZGVmaW5lCU9CSl9TX0NfR1NEX0xFUE0JMTAKLSNkZWZpbmUJT0JKX1NfQ19HU0RfTFBSTwkxMQotI2RlZmluZQlPQkpfU19DX0dTRF9TUFNDCTEyCi0jZGVmaW5lCU9CSl9TX0NfVElSCTIKLSNkZWZpbmUJT0JKX1NfQ19FT00JMwotI2RlZmluZQlPQkpfU19DX0RCRwk0Ci0jZGVmaW5lCU9CSl9TX0NfVEJUCTUKLSNkZWZpbmUJT0JKX1NfQ19MTksJNgotI2RlZmluZQlPQkpfU19DX0VPTVcJNwotI2RlZmluZQlPQkpfU19DX01BWFJFQ1RZUAk3Ci0jZGVmaW5lCU9CSl9TX0tfU1VCVFlQCTEKLSNkZWZpbmUJT0JKX1NfQ19TVUJUWVAJMQotI2RlZmluZQlPQkpfU19DX01BWFJFQ1NJWgkyMDQ4Ci0jZGVmaW5lCU9CSl9TX0NfU1RSTFZMCTAKLSNkZWZpbmUJT0JKX1NfQ19TWU1TSVoJMzEKLSNkZWZpbmUJT0JKX1NfQ19TVE9SRVBMSU0JLTEKLSNkZWZpbmUJT0JKX1NfQ19QU0NBTElMSU0JOQotDAotI2RlZmluZQlNSERfU19DX01IRAkwCi0jZGVmaW5lCU1IRF9TX0NfTE5NCTEKLSNkZWZpbmUJTUhEX1NfQ19TUkMJMgotI2RlZmluZQlNSERfU19DX1RUTAkzCi0jZGVmaW5lCU1IRF9TX0NfQ1BSCTQKLSNkZWZpbmUJTUhEX1NfQ19NVEMJNQotI2RlZmluZQlNSERfU19DX0dUWAk2Ci0jZGVmaW5lCU1IRF9TX0NfTUFYSERSVFlQCTYKLQwKLSNkZWZpbmUJR1NEX1NfS19FTlRSSUVTCTEKLSNkZWZpbmUJR1NEX1NfQ19FTlRSSUVTCTEKLSNkZWZpbmUJR1NEX1NfQ19QU0MJMAotI2RlZmluZQlHU0RfU19DX1NZTQkxCi0jZGVmaW5lCUdTRF9TX0NfRVBNCTIKLSNkZWZpbmUJR1NEX1NfQ19QUk8JMwotI2RlZmluZQlHU0RfU19DX1NZTVcJNAotI2RlZmluZQlHU0RfU19DX0VQTVcJNQotI2RlZmluZQlHU0RfU19DX1BST1cJNgotI2RlZmluZQlHU0RfU19DX0lEQwk3Ci0jZGVmaW5lCUdTRF9TX0NfRU5WCTgKLSNkZWZpbmUJR1NEX1NfQ19MU1kJOQotI2RlZmluZQlHU0RfU19DX0xFUE0JMTAKLSNkZWZpbmUJR1NEX1NfQ19MUFJPCTExCi0jZGVmaW5lCUdTRF9TX0NfU1BTQwkxMgotI2RlZmluZQlHU0RfU19DX1NZTVYJMTMKLSNkZWZpbmUJR1NEX1NfQ19FUE1WCTE0Ci0jZGVmaW5lCUdTRF9TX0NfUFJPVgkxNQotI2RlZmluZQlHU0RfU19DX01BWFJFQ1RZUAkxNQotDAotI2RlZmluZQlHU1lfU19NX1dFQUsJMQotI2RlZmluZQlHU1lfU19NX0RFRgkyCi0jZGVmaW5lCUdTWV9TX01fVU5JCTQKLSNkZWZpbmUJR1NZX1NfTV9SRUwJOAotCi0jZGVmaW5lCUxTWV9TX01fREVGCTIKLSNkZWZpbmUJTFNZX1NfTV9SRUwJOAotCi0jZGVmaW5lCUVOVl9TX01fREVGCTEKLSNkZWZpbmUJRU5WX1NfTV9ORVNURUQJMgotDAotI2RlZmluZQlHUFNfU19NX1BJQwkxCi0jZGVmaW5lCUdQU19TX01fTElCCTIKLSNkZWZpbmUJR1BTX1NfTV9PVlIJNAotI2RlZmluZQlHUFNfU19NX1JFTAk4Ci0jZGVmaW5lCUdQU19TX01fR0JMCTE2Ci0jZGVmaW5lCUdQU19TX01fU0hSCTMyCi0jZGVmaW5lCUdQU19TX01fRVhFCTY0Ci0jZGVmaW5lCUdQU19TX01fUkQJMTI4Ci0jZGVmaW5lCUdQU19TX01fV1JUCTI1NgotI2RlZmluZQlHUFNfU19NX1ZFQwk1MTIKLSNkZWZpbmUJR1BTX1NfS19OQU1FCTkKLSNkZWZpbmUJR1BTX1NfQ19OQU1FCTkKLQwKLSNkZWZpbmUJVElSX1NfQ19TVEFfR0JMCTAKLSNkZWZpbmUJVElSX1NfQ19TVEFfU0IJMQotI2RlZmluZQlUSVJfU19DX1NUQV9TVwkyCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0xXCTMKLSNkZWZpbmUJVElSX1NfQ19TVEFfUEIJNAotI2RlZmluZQlUSVJfU19DX1NUQV9QVwk1Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1BMCTYKLSNkZWZpbmUJVElSX1NfQ19TVEFfVUIJNwotI2RlZmluZQlUSVJfU19DX1NUQV9VVwk4Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0JGSQk5Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX1dGSQkxMAotI2RlZmluZQlUSVJfU19DX1NUQV9MRkkJMTEKLSNkZWZpbmUJVElSX1NfQ19TVEFfRVBNCTEyCi0jZGVmaW5lCVRJUl9TX0NfU1RBX0NLQVJHCTEzCi0jZGVmaW5lCVRJUl9TX0NfU1RBX1dQQgkxNAotI2RlZmluZQlUSVJfU19DX1NUQV9XUFcJMTUKLSNkZWZpbmUJVElSX1NfQ19TVEFfV1BMCTE2Ci0jZGVmaW5lCVRJUl9TX0NfU1RBX0xTWQkxNwotI2RlZmluZQlUSVJfU19DX1NUQV9MSVQJMTgKLSNkZWZpbmUJVElSX1NfQ19TVEFfTEVQTQkxOQotI2RlZmluZQlUSVJfU19DX01BWFNUQUNPRAkxOQotI2RlZmluZQlUSVJfU19DX01JTlNUT0NPRAkyMAotI2RlZmluZQlUSVJfU19DX1NUT19TQgkyMAotI2RlZmluZQlUSVJfU19DX1NUT19TVwkyMQotI2RlZmluZQlUSVJfU19DX1NUT19MCTIyCi0jZGVmaW5lCVRJUl9TX0NfU1RPX0JECTIzCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1dECTI0Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0xECTI1Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX0xJCTI2Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1BJRFIJMjcKLSNkZWZpbmUJVElSX1NfQ19TVE9fUElDUgkyOAotI2RlZmluZQlUSVJfU19DX1NUT19SU0IJMjkKLSNkZWZpbmUJVElSX1NfQ19TVE9fUlNXCTMwCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1JMCTMxCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1ZQUwkzMgotI2RlZmluZQlUSVJfU19DX1NUT19VU0IJMzMKLSNkZWZpbmUJVElSX1NfQ19TVE9fVVNXCTM0Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JVQgkzNQotI2RlZmluZQlUSVJfU19DX1NUT19SVVcJMzYKLSNkZWZpbmUJVElSX1NfQ19TVE9fQgkzNwotI2RlZmluZQlUSVJfU19DX1NUT19XCTM4Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JCCTM5Ci0jZGVmaW5lCVRJUl9TX0NfU1RPX1JXCTQwCi0jZGVmaW5lCVRJUl9TX0NfU1RPX1JJVkIJNDEKLSNkZWZpbmUJVElSX1NfQ19TVE9fUElSUgk0MgotI2RlZmluZQlUSVJfU19DX01BWFNUT0NPRAk0MgotI2RlZmluZQlUSVJfU19DX01JTk9QUkNPRAk1MAotI2RlZmluZQlUSVJfU19DX09QUl9OT1AJNTAKLSNkZWZpbmUJVElSX1NfQ19PUFJfQURECTUxCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1NVQgk1MgotI2RlZmluZQlUSVJfU19DX09QUl9NVUwJNTMKLSNkZWZpbmUJVElSX1NfQ19PUFJfRElWCTU0Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX0FORAk1NQotI2RlZmluZQlUSVJfU19DX09QUl9JT1IJNTYKLSNkZWZpbmUJVElSX1NfQ19PUFJfRU9SCTU3Ci0jZGVmaW5lCVRJUl9TX0NfT1BSX05FRwk1OAotI2RlZmluZQlUSVJfU19DX09QUl9DT00JNTkKLSNkZWZpbmUJVElSX1NfQ19PUFJfSU5TVgk2MAotI2RlZmluZQlUSVJfU19DX09QUl9BU0gJNjEKLSNkZWZpbmUJVElSX1NfQ19PUFJfVVNICTYyCi0jZGVmaW5lCVRJUl9TX0NfT1BSX1JPVAk2MwotI2RlZmluZQlUSVJfU19DX09QUl9TRUwJNjQKLSNkZWZpbmUJVElSX1NfQ19PUFJfUkVERUYJNjUKLSNkZWZpbmUJVElSX1NfQ19PUFJfREZMSVQJNjYKLSNkZWZpbmUJVElSX1NfQ19NQVhPUFJDT0QJNjYKLSNkZWZpbmUJVElSX1NfQ19NSU5DVExDT0QJODAKLSNkZWZpbmUJVElSX1NfQ19DVExfU0VUUkIJODAKLSNkZWZpbmUJVElSX1NfQ19DVExfQVVHUkIJODEKLSNkZWZpbmUJVElSX1NfQ19DVExfREZMT0MJODIKLSNkZWZpbmUJVElSX1NfQ19DVExfU1RMT0MJODMKLSNkZWZpbmUJVElSX1NfQ19DVExfU1RLREwJODQKLSNkZWZpbmUJVElSX1NfQ19NQVhDVExDT0QJODQKLQwKLS8qCi0gKglEZWJ1Z2dlciBzeW1ib2wgZGVmaW5pdGlvbnM6ICBUaGVzZSBhcmUgZG9uZSBieSBoYW5kLCBhcyBubwotICoJCQkJCW1hY2hpbmUtcmVhZGFibGUgdmVyc2lvbiBzZWVtcwotICoJCQkJCXRvIGJlIGF2YWlsYWJsZS4KLSAqLwotI2RlZmluZSBEU1RfU19DX0MJICA3CS8qIExhbmd1YWdlID09ICJDIgkqLwotI2RlZmluZSBEU1RfU19DX0NYWAkgMTUJLyogTGFuZ3VhZ2UgPT0gIkMrKyIJKi8KLSNkZWZpbmUgRFNUX1NfQ19WRVJTSU9OCTE1MwotI2RlZmluZQlEU1RfU19DX1NPVVJDRQkxNTUJLyogU291cmNlIGZpbGUJCSovCi0jZGVmaW5lIERTVF9TX0NfUFJPTE9HCTE2MgotI2RlZmluZQlEU1RfU19DX0JMS0JFRwkxNzYJLyogQmVnaW5uaW5nIG9mIGJsb2NrCSovCi0jZGVmaW5lCURTVF9TX0NfQkxLRU5ECTE3NwkvKiBFbmQgb2YgYmxvY2sJKi8KLSNkZWZpbmUgRFNUX1NfQ19FTlRSWQkxODEKLSNkZWZpbmUgRFNUX1NfQ19QU0VDVAkxODQKLSNkZWZpbmUJRFNUX1NfQ19MSU5FX05VTQkxODUJLyogTGluZSBOdW1iZXIJCSovCi0jZGVmaW5lIERTVF9TX0NfTEJMT1JMSVQJMTg2Ci0jZGVmaW5lIERTVF9TX0NfTEFCRUwJMTg3Ci0jZGVmaW5lCURTVF9TX0NfTU9EQkVHCTE4OAkvKiBCZWdpbm5pbmcgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfTU9ERU5ECTE4OQkvKiBFbmQgb2YgbW9kdWxlCSovCi0jZGVmaW5lCURTVF9TX0NfUlROQkVHCTE5MAkvKiBCZWdpbm5pbmcgb2Ygcm91dGluZQkqLwotI2RlZmluZQlEU1RfU19DX1JUTkVORAkxOTEJLyogRW5kIG9mIHJvdXRpbmUJKi8KLSNkZWZpbmUJRFNUX1NfQ19ERUxUQV9QQ19XCTEJLyogSW5jciBQQwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU0JMgkvKiBJbmNyIExpbmUgIwkqLwotI2RlZmluZQlEU1RfU19DX0lOQ1JfTElOVU1fVwkzCS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0lOQ1IJNAotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9JTkNSX1cJNQotI2RlZmluZSBEU1RfU19DX1JFU0VUX0xJTlVNX0lOQ1IJNgotI2RlZmluZSBEU1RfU19DX0JFR19TVE1UX01PREUJNwotI2RlZmluZSBEU1RfU19DX0VORF9TVE1UX01PREUJOAotI2RlZmluZQlEU1RfU19DX1NFVF9MSU5FX05VTQk5CS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUgRFNUX1NfQ19TRVRfUEMJCTEwCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX1cJCTExCi0jZGVmaW5lIERTVF9TX0NfU0VUX1BDX0wJCTEyCi0jZGVmaW5lIERTVF9TX0NfU0VUX1NUTVROVU0JMTMKLSNkZWZpbmUgRFNUX1NfQ19URVJNCQkxNAkvKiBFbmQgb2YgbGluZXMJKi8KLSNkZWZpbmUgRFNUX1NfQ19URVJNX1cJCTE1CS8qIEVuZCBvZiBsaW5lcwkqLwotI2RlZmluZQlEU1RfU19DX1NFVF9BQlNfUEMJMTYJLyogU2V0IFBDCSovCi0jZGVmaW5lCURTVF9TX0NfREVMVEFfUENfTAkxNwkvKiBJbmNyIFBDCSovCi0jZGVmaW5lIERTVF9TX0NfSU5DUl9MSU5VTV9MCTE4CS8qIEluY3IgTGluZSAjCSovCi0jZGVmaW5lIERTVF9TX0NfU0VUX0xJTlVNX0IJMTkJLyogU2V0IExpbmUgIwkqLwotI2RlZmluZSBEU1RfU19DX1NFVF9MSU5VTV9MCTIwCS8qIFNldCBMaW5lICMJKi8KLSNkZWZpbmUJRFNUX1NfQ19URVJNX0wJCTIxCS8qIEVuZCBvZiBsaW5lcwkqLwotLyogdGhlc2UgYXJlIHVzZWQgd2l0aCBEU1RfU19DX1NPVVJDRSAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUNMRklMRQkgMQkvKiBEZWNsYXJlIHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVEZJTEUJIDIJLyogU2V0IHNvdXJjZSBmaWxlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19MCSAzCS8qIFNldCByZWNvcmQsIGxvbmd3b3JkIHZhbHVlICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX1NFVFJFQ19XCSA0CS8qIFNldCByZWNvcmQsIHdvcmQgdmFsdWUgKi8KLSNkZWZpbmUgRFNUX1NfQ19TUkNfREVGTElORVNfVwkxMAkvKiAjIG9mIGxpbmUsIHdvcmQgY291bnRlciAqLwotI2RlZmluZSBEU1RfU19DX1NSQ19ERUZMSU5FU19CCTExCS8qICMgb2YgbGluZSwgYnl0ZSBjb3VudGVyICovCi0jZGVmaW5lIERTVF9TX0NfU1JDX0ZPUk1GRUVECTE2CS8qIF5MIGNvdW50cyBhcyBhIHJlY29yZCAqLwotLyogdGhlIGZvbGxvd2luZyBhcmUgdGhlIGNvZGVzIGZvciB0aGUgdmFyaW91cyBkYXRhIHR5cGVzLiAgQW55dGhpbmcgbm90IG9uCi0gKiB0aGUgbGlzdCBpcyBpbmNsdWRlZCB1bmRlciAnYWR2YW5jZWRfdHlwZScKLSAqLwotI2RlZmluZSBEQkdfU19DX1VDSEFSCQkweDAyCi0jZGVmaW5lIERCR19TX0NfVVNJTlQJCTB4MDMKLSNkZWZpbmUgREJHX1NfQ19VTElOVAkJMHgwNAotI2RlZmluZSBEQkdfU19DX1VRVUFECQkweDA1Ci0jZGVmaW5lIERCR19TX0NfU0NIQVIJCTB4MDYKLSNkZWZpbmUgREJHX1NfQ19TU0lOVAkJMHgwNwotI2RlZmluZSBEQkdfU19DX1NMSU5UCQkweDA4Ci0jZGVmaW5lIERCR19TX0NfU1FVQUQJCTB4MDkKLSNkZWZpbmUgREJHX1NfQ19SRUFMNAkJMHgwYQotI2RlZmluZSBEQkdfU19DX1JFQUw4CQkweDBiCQkvKiBEX2Zsb2F0IGRvdWJsZSAqLwotI2RlZmluZSBEQkdfU19DX0NPTVBMWDQJCTB4MGMJCS8qIDJ4Rl9mbG9hdCBjb21wbGV4IGZsb2F0ICovCi0jZGVmaW5lIERCR19TX0NfQ09NUExYOAkJMHgwZAkJLyogMnhEX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfUkVBTDhfRwkJMHgxYgkJLyogR19mbG9hdCBkb3VibGUgKi8KLSNkZWZpbmUgREJHX1NfQ19DT01QTFg4X0cJMHgxZAkJLyogMnhHX2Zsb2F0IGNvbXBsZXggZG91YmxlICovCi0jZGVmaW5lIERCR19TX0NfRlVOQ1RJT05fQUREUgkweDE3Ci0jZGVmaW5lIERCR19TX0NfQURWQU5DRURfVFlQRQkweGEzCi0vKiAgU29tZSBvZiB0aGVzZSBhcmUganVzdCBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gIFtwcl0KLSAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRBCQkweDAxCS8qIHVuc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1VCSVRVCQkweDIyCS8qIHVuc2lnbmVkLCB1bmFsaWduZWQgYml0IGZpZWxkICovCi0jZGVmaW5lIERCR19TX0NfU0JJVEEJCTB4MjkJLyogc2lnbmVkLCBhbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX1NCSVRVCQkweDJhCS8qIHNpZ25lZCwgdW5hbGlnbmVkIGJpdCBmaWVsZCAqLwotI2RlZmluZSBEQkdfU19DX0NTVFJJTkcJCTB4MmUJLyogYXNjaXogKCdcMCcgdGVybWluYXRlZCkgc3RyaW5nICovCi0jZGVmaW5lIERCR19TX0NfV0NIQVIJCTB4MzgJLyogd2NoYXJfdCAqLwotLyogIFRoZXNlIGFyZSBkZXNjcmlwdG9yIGNsYXNzIGNvZGVzLgotICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX1MJCTB4MDEJLyogc3RhdGljIChmaXhlZCBsZW5ndGgpICovCi0jZGVmaW5lIERTQ19LX0NMQVNTX0QJCTB4MDIJLyogZHluYW1pYyBzdHJpbmcgKG5vdCB2aWEgbWFsbG9jISkgKi8KLSNkZWZpbmUgRFNDX0tfQ0xBU1NfQQkJMHgwNAkvKiBhcnJheSAqLwotI2RlZmluZSBEU0NfS19DTEFTU19VQlMJCTB4MGQJLyogdW5hbGlnbmVkIGJpdCBzdHJpbmcgKi8KLS8qICBUaGVzZSBhcmUgdGhlIGNvZGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRlZmluaXRpb25zIG9mIHN0cnVjdAotICogIHVuaW9uIGFuZCBlbnVtIHJlY29yZHMKLSAqLwotI2RlZmluZSBEQkdfU19DX0VOVU1fSVRFTQkJMHhhNAotI2RlZmluZSBEQkdfU19DX0VOVU1fU1RBUlQJCTB4YTUKLSNkZWZpbmUgREJHX1NfQ19FTlVNX0VORAkJMHhhNgotI2RlZmluZSBEQkdfU19DX1NUUlVDVF9JVEVNCQlEU1RfS19WRkxBR1NfQklUT0ZGUwkvKiAweGZmICovCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX1NUQVJUCQkweGFiCi0jZGVmaW5lIERCR19TX0NfU1RSVUNUX0VORAkJMHhhYwotI2RlZmluZSBEU1RfS19UWVBTUEVDCQkJMHhhZgkJLyogdHlwZSBzcGVjaWZpY2F0aW9uICovCi0vKiBUaGVzZSBjb2RlcyBhcmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gcmVjb3JkcwotICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19OT1ZBTAkJMHg4MAkvKiBzdHJ1Y3QgZGVmaW5pdGlvbiBvbmx5ICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19EU0MJCTB4ZmEJLyogZGVzY3JpcHRvciB1c2VkICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19UVlMJCTB4ZmIJLyogdHJhaWxpbmcgdmFsdWUgc3BlY2lmaWVkICovCi0jZGVmaW5lIERTVF9LX1ZTX0ZPTExPV1MJCTB4ZmQJLyogdmFsdWUgc3BlYyBmb2xsb3dzICovCi0jZGVmaW5lIERTVF9LX1ZGTEFHU19CSVRPRkZTCQkweGZmCS8qIHZhbHVlIGNvbnRhaW5zIGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9MSVRFUkFMCTAKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9BRERSCTEKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9ERVNDCTIKLSNkZWZpbmUgRFNUX0tfVkFMS0lORF9SRUcJMwotI2RlZmluZSBEU1RfS19SRUdfVkFYX0FQCTB4MGMJLyogUjEyICovCi0jZGVmaW5lIERTVF9LX1JFR19WQVhfRlAJMHgwZAkvKiBSMTMgKi8KLSNkZWZpbmUgRFNUX0tfUkVHX1ZBWF9TUAkweDBlCS8qIFIxNCAqLwotI2RlZmluZSBEU1RfVl9WQUxLSU5ECQkwCS8qIG9mZnNldCBvZiB2YWxraW5kIGZpZWxkICovCi0jZGVmaW5lIERTVF9WX0lORElSRUNUCQkyCS8qIG9mZnNldCB0byBpbmRpcmVjdCBiaXQgKi8KLSNkZWZpbmUgRFNUX1ZfRElTUAkJMwkvKiBvZmZzZXQgdG8gZGlzcGxhY2VtZW50IGJpdCAqLwotI2RlZmluZSBEU1RfVl9SRUdOVU0JCTQJLyogb2Zmc2V0IHRvIHJlZ2lzdGVyIG51bWJlciAqLwotI2RlZmluZSBEU1RfTV9JTkRJUkVDVAkJKDE8PERTVF9WX0lORElSRUNUKQotI2RlZmluZSBEU1RfTV9ESVNQCQkoMTw8RFNUX1ZfRElTUCkKLSNkZWZpbmUgREJHX0NfRlVOQ1RJT05fUEFSQU0JLyogMHhjOSAqLwlcCi0JKERTVF9LX1ZBTEtJTkRfQUREUnxEU1RfTV9ESVNQfChEU1RfS19SRUdfVkFYX0FQPDxEU1RfVl9SRUdOVU0pKQotI2RlZmluZSBEQkdfQ19MT0NBTF9TWU0JCS8qIDB4ZDkgKi8JXAotCShEU1RfS19WQUxLSU5EX0FERFJ8RFNUX01fRElTUHwoRFNUX0tfUkVHX1ZBWF9GUDw8RFNUX1ZfUkVHTlVNKSkKLS8qIEtpbmRzIG9mIHZhbHVlIHNwZWNpZmljYXRpb25zCi0gKi8KLSNkZWZpbmUgRFNUX0tfVlNfQUxMT0NfU1BMSVQJMwkvKiBzcGxpdCBsaWZldGltZSAqLwotLyogS2luZHMgb2YgdHlwZSBzcGVjaWZpY2F0aW9ucwotICovCi0jZGVmaW5lIERTVF9LX1RTX0FUT00JCTB4MDEJLyogYXRvbWljIHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19EU0MJCTB4MDIJLyogZGVzY3JpcHRvciB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfSU5ECQkweDAzCS8qIGluZGlyZWN0IHR5cGUgc3BlY2lmaWNhdGlvbiAqLwotI2RlZmluZSBEU1RfS19UU19UUFRSCQkweDA0CS8qIHR5cGVkIHBvaW50ZXIgdHlwZSBzcGVjICovCi0jZGVmaW5lIERTVF9LX1RTX1BUUgkJMHgwNQkvKiBwb2ludGVyIHR5cGUgc3BlYyAqLwotI2RlZmluZSBEU1RfS19UU19BUlJBWQkJMHgwNwkvKiBhcnJheSB0eXBlIHNwZWMgKi8KLSNkZWZpbmUgRFNUX0tfVFNfTk9WX0xFTkcJMHgwZQkvKiBub3ZlbCBsZW5ndGggdHlwZSBzcGVjICovCi0vKiAgVGhlc2UgYXJlIHRoZSBjb2RlcyB0aGF0IGFyZSB1c2VkIGluIHRoZSBzdWZmaXggcmVjb3JkcyB0byBkZXRlcm1pbmUgdGhlCi0gKiAgYWN0dWFsIGRhdGEgdHlwZQotICovCi0jZGVmaW5lIERCR19TX0NfQkFTSUMJCQlEU1RfS19UU19BVE9NCi0jZGVmaW5lIERCR19TX0NfQkFTSUNfQVJSQVkJCURTVF9LX1RTX0RTQwotI2RlZmluZSBEQkdfU19DX1NUUlVDVAkJCURTVF9LX1RTX0lORAotI2RlZmluZSBEQkdfU19DX1BPSU5URVIJCQlEU1RfS19UU19UUFRSCi0jZGVmaW5lIERCR19TX0NfVk9JRAkJCURTVF9LX1RTX1BUUgotI2RlZmluZSBEQkdfU19DX0NPTVBMRVhfQVJSQVkJCURTVF9LX1RTX0FSUkFZCi0KLSNlbmRpZgkvKiBXQU5UX1ZNU19PQkpfREVGUyAqLwotCi0vKiBlbmQgb2Ygb2JqLXZtcy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWEyOWsuYyBiL2dhcy9jb25maWcvdGMtYTI5ay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDBmZWM1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYTI5ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5NiArMCwwIEBACi0vKiB0Yy1hMjlrLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBBTUQgMjkwMDAuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBKb2huIEdpbG1vcmUgaGFzIHJlb3JnYW5pemVkIHRoaXMgbW9kdWxlIHNvbWV3aGF0LCB0byBtYWtlIGl0IGVhc2llcgotICAgdG8gY29udmVydCBpdCB0byBuZXcgbWFjaGluZXMnIGFzc2VtYmxlcnMgYXMgZGVzaXJlZC4gIFRoZXJlIHdhcyB0b28KLSAgIG11Y2ggYmxvb2R5IHJld3JpdGluZyByZXF1aXJlZCBiZWZvcmUuICBUaGVyZSBzdGlsbCBwcm9iYWJseSBpcy4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvYTI5ay5oIgotCi0vKiBNYWtlIGl0IGVhc2llciB0byBjbG9uZSB0aGlzIG1hY2hpbmUgZGVzYyBpbnRvIGFub3RoZXIgb25lLiAgKi8KLSNkZWZpbmUJbWFjaGluZV9vcGNvZGUJYTI5a19vcGNvZGUKLSNkZWZpbmUJbWFjaGluZV9vcGNvZGVzCWEyOWtfb3Bjb2RlcwotI2RlZmluZQltYWNoaW5lX2lwCWEyOWtfaXAKLSNkZWZpbmUJbWFjaGluZV9pdAlhMjlrX2l0Ci0KLSNkZWZpbmUJSU1NRURJQVRFX0JJVAkweDAxMDAwMDAwCS8qIFR1cm5zIFJCIGludG8gSW1tZWRpYXRlICovCi0jZGVmaW5lCUFCU09MVVRFX0JJVAkweDAxMDAwMDAwCS8qIFR1cm5zIFBDLXJlbGF0aXZlIHRvIEFic29sdXRlICovCi0jZGVmaW5lCUNFX0JJVAkJMHgwMDgwMDAwMAkvKiBDb3Byb2Nlc3NvciBlbmFibGUgaW4gTE9BRCAqLwotI2RlZmluZQlVSV9CSVQJCTB4MDAwMDAwODAJLyogVW5zaWduZWQgaW50ZWdlciBpbiBDT05WRVJUICovCi0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotc3RydWN0IG1hY2hpbmVfaXQKLSAgewotICAgIGNoYXIgKmVycm9yOwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBpbnQgcGNyZWw7Ci0gICAgaW50IHJlbG9jX29mZnNldDsJCS8qIE9mZnNldCBvZiByZWxvYyB3aXRoaW4gaW5zbiAqLwotCi0gICAgaW50IHJlbG9jOwotICB9Ci10aGVfaW5zbjsKLQotc3RhdGljIHZvaWQgbWFjaGluZV9pcCBQQVJBTVMgKChjaGFyICpzdHIpKTsKLS8qIHN0YXRpYyB2b2lkIHByaW50X2luc24gUEFSQU1TICgoc3RydWN0IG1hY2hpbmVfaXQgKmluc24pKTsgKi8KLSNpZm5kZWYgT0JKX0NPRkYKLXN0YXRpYyB2b2lkIHNfZGF0YTEgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc191c2UgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotY29uc3QgcHNldWRvX3R5cGVTCi1tZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCA0fSwKLSAgeyJibG9jayIsIHNfc3BhY2UsIDB9LAotICB7ImNwdXR5cGUiLCBzX2lnbm9yZSwgMH0sCS8qIENQVSBhcyAyOTAwMCBvciAyOTA1MCAqLwotICB7InJlZyIsIHNfbHN5bSwgMH0sCQkvKiBSZWdpc3RlciBlcXVhdGUsIHNhbWUgYXMgZXF1ICovCi0gIHsic3BhY2UiLCBzX2lnbm9yZSwgMH0sCS8qIExpc3RpbmcgY29udHJvbCAqLwotICB7InNlY3QiLCBzX2lnbm9yZSwgMH0sCS8qIENyZWF0aW9uIG9mIGNvZmYgc2VjdGlvbnMgKi8KLSNpZm5kZWYgT0JKX0NPRkYKLSAgLyogV2UgY2FuIGRvIHRoaXMgcmlnaHQgd2l0aCBjb2ZmLiAgKi8KLSAgeyJ1c2UiLCBzX3VzZSwgMH0sCi0jZW5kaWYKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLSNpZiBkZWZpbmVkKEJGRF9IRUFERVJTKQotI2lmZGVmIFJFTFNaCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IFJFTFNaOwkvKiBDb2ZmIGhlYWRlcnMgKi8KLSNlbHNlCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDEyOwkJLyogc29tZXRoaW5nIGVsc2UgaGVhZGVycyAqLwotI2VuZGlmCi0jZWxzZQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSAxMjsJCS8qIE5vdCBiZmRpemVkKi8KLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFdlIG5lZWRlZCBhbiB1bnVzZWQgY2hhciBmb3IgbGluZSBzZXBhcmF0aW9uIHRvIHdvcmsgYXJvdW5kIHRoZQotICAgbGFjayBvZiBtYWNyb3MsIHVzaW5nIHNlZCBhbmQgc3VjaC4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiQCI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdAotICAgYWxsLCBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4gICovCi0KLS8qCi0gKiAgYW51bGwgYml0IC0gY2F1c2VzIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgdG8gbm90IGJlIGV4ZWN1dGVkCi0gKi8KLSNkZWZpbmUgQU5OVUwgICAgICAgKDEgPDwgMjkpCi0KLSNpZm5kZWYgT0JKX0NPRkYKLQotc3RhdGljIHZvaWQKLXNfdXNlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIudGV4dCIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICBzX3RleHQgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5kYXRhIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmRhdGExIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfZGF0YTEgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBMaXRlcmFscyBjYW4ndCBnbyBpbiB0aGUgdGV4dCBzZWdtZW50IGJlY2F1c2UgeW91IGNhbid0IHJlYWQgZnJvbQotICAgICBpbnN0cnVjdGlvbiBtZW1vcnkgb24gc29tZSAyOWsncy4gIFNvLCBpbnRvIGluaXRpYWxpemVkIGRhdGEuICovCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIubGl0IiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIHN1YnNlZ19zZXQgKFNFR19EQVRBLCAyMDApOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXNfYmFkIChfKCJVbmtub3duIHNlZ21lbnQgdHlwZSIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKCkKLXsKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIDEpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogSW5zdGFsbCBzeW1ib2wgZGVmaW5pdGlvbiB0aGF0IG1hcHMgUkVHTkFNRSB0byBSRUdOTy4KLSAgIEZJWE1FLVNPT046ICBUaGVzZSBhcmUgbm90IHJlY29nbml6ZWQgaW4gbWl4ZWQgY2FzZS4gICovCi0KLXN0YXRpYyB2b2lkCi1pbnNlcnRfc3JlZyAocmVnbmFtZSwgcmVnbnVtKQotICAgICBjaGFyICpyZWduYW1lOwotICAgICBpbnQgcmVnbnVtOwotewotICAvKiBGSVhNRS1TT09OLCBwdXQgc29tZXRoaW5nIGluIHRoZXNlIHN5bXMgc28gdGhleSB3b24ndCBiZSBvdXRwdXQKLSAgICAgdG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgcmVzdWx0aW5nIG9iamVjdCBmaWxlLiAgKi8KLQotICAvKiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBuYW1lcyBvZiB0aGUgc3BlY2lhbCByZWdpc3RlcnMuICAqLwotICBjaGFyIGJ1Zls4MF07Ci0gIGludCBpOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKHJlZ25hbWUsIFNFR19SRUdJU1RFUiwgKHZhbHVlVCkgcmVnbnVtLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBmb3IgKGkgPSAwOyByZWduYW1lW2ldOyBpKyspCi0gICAgYnVmW2ldID0gaXNsb3dlciAocmVnbmFtZVtpXSkgPyB0b3VwcGVyIChyZWduYW1lW2ldKSA6IHJlZ25hbWVbaV07Ci0gIGJ1ZltpXSA9ICdcMCc7Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLX0KLQotLyogSW5zdGFsbCBzeW1ib2wgZGVmaW5pdGlvbnMgZm9yIGFzc29ydGVkIHNwZWNpYWwgcmVnaXN0ZXJzLgotICAgU2VlIEFTTTI5SyBSZWYgcGFnZSAyLTkuICAqLwotCi12b2lkCi1kZWZpbmVfc29tZV9yZWdzICgpCi17Ci0jZGVmaW5lIFNSRUcJMjU2Ci0KLSAgLyogUHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyAqLwotICBpbnNlcnRfc3JlZyAoInZhYiIsIFNSRUcgKyAwKTsKLSAgaW5zZXJ0X3NyZWcgKCJvcHMiLCBTUkVHICsgMSk7Ci0gIGluc2VydF9zcmVnICgiY3BzIiwgU1JFRyArIDIpOwotICBpbnNlcnRfc3JlZyAoImNmZyIsIFNSRUcgKyAzKTsKLSAgaW5zZXJ0X3NyZWcgKCJjaGEiLCBTUkVHICsgNCk7Ci0gIGluc2VydF9zcmVnICgiY2hkIiwgU1JFRyArIDUpOwotICBpbnNlcnRfc3JlZyAoImNoYyIsIFNSRUcgKyA2KTsKLSAgaW5zZXJ0X3NyZWcgKCJyYnAiLCBTUkVHICsgNyk7Ci0gIGluc2VydF9zcmVnICgidG1jIiwgU1JFRyArIDgpOwotICBpbnNlcnRfc3JlZyAoInRtciIsIFNSRUcgKyA5KTsKLSAgaW5zZXJ0X3NyZWcgKCJwYzAiLCBTUkVHICsgMTApOwotICBpbnNlcnRfc3JlZyAoInBjMSIsIFNSRUcgKyAxMSk7Ci0gIGluc2VydF9zcmVnICgicGMyIiwgU1JFRyArIDEyKTsKLSAgaW5zZXJ0X3NyZWcgKCJtbXUiLCBTUkVHICsgMTMpOwotICBpbnNlcnRfc3JlZyAoImxydSIsIFNSRUcgKyAxNCk7Ci0KLSAgLyogQWRkaXRpb25hbCBwcm90ZWN0ZWQgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVycyBmb3IgdGhlIDI5MDUwICovCi0gIGluc2VydF9zcmVnICgicnNuIiwgIFNSRUcgKyAxNSk7Ci0gIGluc2VydF9zcmVnICgicm1hMCIsIFNSRUcgKyAxNik7Ci0gIGluc2VydF9zcmVnICgicm1jMCIsIFNSRUcgKyAxNyk7Ci0gIGluc2VydF9zcmVnICgicm1hMSIsIFNSRUcgKyAxOCk7Ci0gIGluc2VydF9zcmVnICgicm1jMSIsIFNSRUcgKyAxOSk7Ci0gIGluc2VydF9zcmVnICgic3BjMCIsIFNSRUcgKyAyMCk7Ci0gIGluc2VydF9zcmVnICgic3BjMSIsIFNSRUcgKyAyMSk7Ci0gIGluc2VydF9zcmVnICgic3BjMiIsIFNSRUcgKyAyMik7Ci0gIGluc2VydF9zcmVnICgiaWJhMCIsIFNSRUcgKyAyMyk7Ci0gIGluc2VydF9zcmVnICgiaWJjMCIsIFNSRUcgKyAyNCk7Ci0gIGluc2VydF9zcmVnICgiaWJhMSIsIFNSRUcgKyAyNSk7Ci0gIGluc2VydF9zcmVnICgiaWJjMSIsIFNSRUcgKyAyNik7Ci0KLSAgLyogQWRkaXRpb25hbCByZWdpc3RlcnMgZm9yIHRoZSAyOTA0MC4gICovCi0gIGluc2VydF9zcmVnICgiZGJhIiwgU1JFRyArIDI3KTsKLSAgaW5zZXJ0X3NyZWcgKCJkYmMiLCBTUkVHICsgMjgpOwotICBpbnNlcnRfc3JlZyAoImNpciIsIFNSRUcgKyAyOSk7Ci0gIGluc2VydF9zcmVnICgiY2RyIiwgU1JFRyArIDMwKTsKLQotICAvKiBVbnByb3RlY3RlZCBzcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbmFtZXMgKi8KLSAgaW5zZXJ0X3NyZWcgKCJpcGMiLCBTUkVHICsgMTI4KTsKLSAgaW5zZXJ0X3NyZWcgKCJpcGEiLCBTUkVHICsgMTI5KTsKLSAgaW5zZXJ0X3NyZWcgKCJpcGIiLCBTUkVHICsgMTMwKTsKLSAgaW5zZXJ0X3NyZWcgKCJxIiwgU1JFRyArIDEzMSk7Ci0gIGluc2VydF9zcmVnICgiYWx1IiwgU1JFRyArIDEzMik7Ci0gIGluc2VydF9zcmVnICgiYnAiLCBTUkVHICsgMTMzKTsKLSAgaW5zZXJ0X3NyZWcgKCJmYyIsIFNSRUcgKyAxMzQpOwotICBpbnNlcnRfc3JlZyAoImNyIiwgU1JFRyArIDEzNSk7Ci0gIGluc2VydF9zcmVnICgiZnBlIiwgU1JFRyArIDE2MCk7Ci0gIGluc2VydF9zcmVnICgiaW50ZSIsIFNSRUcgKyAxNjEpOwotICBpbnNlcnRfc3JlZyAoImZwcyIsIFNSRUcgKyAxNjIpOwotICAvKiAgIiIsICAgIFNSRUcrMTYzKTsJICBSZXNlcnZlZCAqLwotICBpbnNlcnRfc3JlZyAoImV4b3AiLCBTUkVHICsgMTY0KTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuLCB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgd2lsbAotICAgbmVlZC4gICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICBpbnQgbG9zZSA9IDA7Ci0gIHJlZ2lzdGVyIGludCBza2lwbmV4dCA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICByZWdpc3RlciBjaGFyICpzdHJlbmQsICpzdHJlbmQyOwotCi0gIC8qIEhhc2ggdXAgYWxsIHRoZSBvcGNvZGVzIGZvciBmYXN0IHVzZSBsYXRlci4gICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1fb3Bjb2RlczsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtYWNoaW5lX29wY29kZXNbaV0ubmFtZTsKLQotICAgICAgaWYgKHNraXBuZXh0KQotCXsKLQkgIHNraXBuZXh0ID0gMDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSGFjayB0byBhdm9pZCBtdWx0aXBsZSBvcGNvZGUgZW50cmllcy4gIFdlIHByZS1sb2NhdGUgYWxsIHRoZQotCSB2YXJpYXRpb25zIChiL2kgZmllbGQgYW5kIFAvQSBmaWVsZCkgYW5kIGhhbmRsZSB0aGVtLiAqLwotCi0gICAgICBpZiAoIXN0cmNtcCAobmFtZSwgbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5uYW1lKSkKLQl7Ci0JICBpZiAoKG1hY2hpbmVfb3Bjb2Rlc1tpXS5vcGNvZGUgJiAweDAxMDAwMDAwKSAhPSAwCi0JICAgICAgfHwgKG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0ub3Bjb2RlICYgMHgwMTAwMDAwMCkgPT0gMAotCSAgICAgIHx8ICgobWFjaGluZV9vcGNvZGVzW2ldLm9wY29kZSB8IDB4MDEwMDAwMDApCi0JCSAgIT0gbWFjaGluZV9vcGNvZGVzW2kgKyAxXS5vcGNvZGUpKQotCSAgICBnb3RvIGJhZF90YWJsZTsKLQkgIHN0cmVuZCA9IG1hY2hpbmVfb3Bjb2Rlc1tpXS5hcmdzICsgc3RybGVuIChtYWNoaW5lX29wY29kZXNbaV0uYXJncykgLSAxOwotCSAgc3RyZW5kMiA9IG1hY2hpbmVfb3Bjb2Rlc1tpICsgMV0uYXJncyArIHN0cmxlbiAobWFjaGluZV9vcGNvZGVzW2kgKyAxXS5hcmdzKSAtIDE7Ci0JICBzd2l0Y2ggKCpzdHJlbmQpCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgaWYgKCpzdHJlbmQyICE9ICdpJykKLQkJZ290byBiYWRfdGFibGU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1AnOgotCSAgICAgIGlmICgqc3RyZW5kMiAhPSAnQScpCi0JCWdvdG8gYmFkX3RhYmxlOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICBiYWRfdGFibGU6Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhbmRsZSBvcGNvZGUgJXNcbiIsCi0JCSAgICAgICBuYW1lKTsKLQkgICAgICBsb3NlID0gMTsKLQkgICAgfQotCi0JICAvKiBPSywgdGhpcyBpcyBhbiBpL2Igb3IgQS9QIHBhaXIuICBXZSBza2lwIHRoZQotCSAgICAgaGlnaGVyLXZhbHVlZCBvbmUsIGFuZCBsZXQgdGhlIGNvZGUgZm9yIG9wZXJhbmQgY2hlY2tpbmcKLQkgICAgIGhhbmRsZSBPUi1pbmcgaW4gdGhlIGJpdC4gICovCi0JICBza2lwbmV4dCA9IDE7Ci0JfQotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgKFBUUikgJm1hY2hpbmVfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggYCVzJzogJXNcbiIsCi0JCSAgIG1hY2hpbmVfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgZGVmaW5lX3NvbWVfcmVncyAoKTsKLX0KLQotLyogQXNzZW1ibGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uICBJdHMgbGFiZWwgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkCi0gICBieSB0aGUgZ2VuZXJpYyBmcm9udCBlbmQuICBXZSBqdXN0IHBhcnNlIG9wY29kZSBhbmQgb3BlcmFuZHMsIGFuZAotICAgcHJvZHVjZSB0aGUgYnl0ZXMgb2YgZGF0YSBhbmQgcmVsb2NhdGlvbi4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqdG9QOwotCi0gIGtub3cgKHN0cik7Ci0gIG1hY2hpbmVfaXAgKHN0cik7Ci0gIHRvUCA9IGZyYWdfbW9yZSAoNCk7Ci0gIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgdGhlX2luc24ub3Bjb2RlLCA0KTsKLQotICAvKiBwdXQgb3V0IHRoZSBzeW1ib2wtZGVwZW5kZW50IHN0dWZmICovCi0gIGlmICh0aGVfaW5zbi5yZWxvYyAhPSBOT19SRUxPQykKLSAgICB7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIHRoZV9pbnNuLnJlbG9jX29mZnNldCksCi0JCSAgIDQsCQkvKiBzaXplICovCi0JCSAgICZ0aGVfaW5zbi5leHAsCi0JCSAgIHRoZV9pbnNuLnBjcmVsLAotCQkgICB0aGVfaW5zbi5yZWxvYyk7Ci0gICAgfQotfQotCi1jaGFyICoKLXBhcnNlX29wZXJhbmQgKHMsIG9wZXJhbmRwLCBvcHQpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyYW5kcDsKLSAgICAgaW50IG9wdDsKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqbmV3OwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKG9wZXJhbmRwKTsKLSAgaWYgKG9wZXJhbmRwLT5YX29wID09IE9fYWJzZW50ICYmICEgb3B0KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIEluc3RydWN0aW9uIHBhcnNpbmcuICBUYWtlcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBvcGNvZGUuCi0gICBPcGVyYW5kcyBhcmUgYXQgaW5wdXRfbGluZV9wb2ludGVyLiAgT3V0cHV0IGlzIGluIHRoZV9pbnNuLgotICAgV2FybmluZ3Mgb3IgZXJyb3JzIGFyZSBnZW5lcmF0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbWFjaGluZV9pcCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIHN0cnVjdCBtYWNoaW5lX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgZXhwcmVzc2lvblMgdGhlX29wZXJhbmQ7Ci0gIGV4cHJlc3Npb25TICpvcGVyYW5kID0gJnRoZV9vcGVyYW5kOwotICB1bnNpZ25lZCBpbnQgcmVnOwotCi0gIC8qIE11c3QgaGFuZGxlIGBkaXYwJyBvcGNvZGUuICAqLwotICBzID0gc3RyOwotICBpZiAoaXNhbHBoYSAoKnMpKQotICAgIGZvciAoOyBpc2FsbnVtICgqcyk7ICsrcykKLSAgICAgIGlmIChpc3VwcGVyICgqcykpCi0JKnMgPSB0b2xvd2VyICgqcyk7Ci0KLSAgc3dpdGNoICgqcykKLSAgICB7Ci0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcgJzoJCQkvKiBGSVhNRS1TT01FREFZIG1vcmUgd2hpdGVzcGFjZSAqLwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoKGluc24gPSAoc3RydWN0IG1hY2hpbmVfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlIGAlcycuIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBhcmdzU3RhcnQgPSBzOwotICBvcGNvZGUgPSBpbnNuLT5vcGNvZGU7Ci0gIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0gIHRoZV9pbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0KLSAgLyogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZSBzdXJlIHRoYXQgdGhlCi0gICAgIG9wZXJhbmRzIG1hdGNoLgotICAgCi0gICAgIElmIGFuIG9wZXJhbmQgbWF0Y2hlcywgd2UgbW9kaWZ5IHRoZV9pbnNuIG9yIG9wY29kZSBhcHByb3ByaWF0ZWx5LAotICAgICBhbmQgZG8gYSAiY29udGludWUiLiAgSWYgYW4gb3BlcmFuZCBmYWlscyB0byBtYXRjaCwgd2UgImJyZWFrIi4gICovCi0KLSAgaWYgKGluc24tPmFyZ3NbMF0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBQcmltZSB0aGUgcHVtcC4gICovCi0gICAgICBzID0gcGFyc2Vfb3BlcmFuZCAocywgb3BlcmFuZCwgaW5zbi0+YXJnc1swXSA9PSAnSScpOwotICAgIH0KLQotICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmFyZ3MpCi0JewotCi0JY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgIGlmICgqcyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgLyogV2UgYXJlIHRydWx5IGRvbmUuICovCi0JICAgICAgdGhlX2luc24ub3Bjb2RlID0gb3Bjb2RlOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgYXNfYmFkIChfKCJUb28gbWFueSBvcGVyYW5kczogJXMiKSwgcyk7Ci0JICBicmVhazsKLQotCWNhc2UgJywnOgkJLyogTXVzdCBtYXRjaCBhIGNvbW1hICovCi0JICBpZiAoKnMrKyA9PSAnLCcpCi0JICAgIHsKLQkgICAgICAvKiBQYXJzZSBuZXh0IG9wZXJhbmQuICAqLwotCSAgICAgIHMgPSBwYXJzZV9vcGVyYW5kIChzLCBvcGVyYW5kLCBhcmdzWzFdID09ICdJJyk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAndic6CQkvKiBUcmFwIG51bWJlcnMgKGltbWVkaWF0ZSBmaWVsZCkgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgMjU2KQotCQl7Ci0JCSAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTYpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIpLAotCQkJICAobG9uZykgb3BlcmFuZC0+WF9hZGRfbnVtYmVyKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DXzg7Ci0JICB0aGVfaW5zbi5yZWxvY19vZmZzZXQgPSAxOwkvKiBCSUctRU5ESUFOIEJ5dGUgMSBvZiBpbnNuICovCi0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYic6CQkvKiBBIGdlbmVyYWwgcmVnaXN0ZXIgb3IgOC1iaXQgaW1tZWRpYXRlICovCi0JY2FzZSAnaSc6Ci0JICAvKiBXZSB0cmVhdCB0aGUgdHdvIGNhc2VzIGlkZW50aWNhbGx5IHNpbmNlIHdlIG1hc2hlZAotCSAgICAgdGhlbSB0b2dldGhlciBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgIGdvdG8gZ2VuZXJhbF9yZWc7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGUgJ2knIGNhc2UgcmVhbGx5IGV4aXN0cy4gICovCi0JICBpZiAoKGluc24tPm9wY29kZSB8IElNTUVESUFURV9CSVQpICE9IChpbnNuICsgMSktPm9wY29kZSkKLQkgICAgYnJlYWs7Ci0KLQkgIG9wY29kZSB8PSBJTU1FRElBVEVfQklUOwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAyNTYpCi0JCXsKLQkJICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIpLAotCQkJICAobG9uZykgb3BlcmFuZC0+WF9hZGRfbnVtYmVyKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DXzg7Ci0JICB0aGVfaW5zbi5yZWxvY19vZmZzZXQgPSAzOwkvKiBCSUctRU5ESUFOIEJ5dGUgMyBvZiBpbnNuICovCi0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnYSc6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZ2lzdGVyICovCi0JY2FzZSAnYyc6Ci0JZ2VuZXJhbF9yZWc6Ci0JICAvKiBsck5OTiBvciBnck5OTiBvciAlJWV4cHIgb3IgYSB1c2VyLWRlZiByZWdpc3RlciBuYW1lICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX3JlZ2lzdGVyKQotCSAgICBicmVhazsJCS8qIE9ubHkgcmVnaXN0ZXJzICovCi0JICBrbm93IChvcGVyYW5kLT5YX2FkZF9zeW1ib2wgPT0gMCk7Ci0JICBrbm93IChvcGVyYW5kLT5YX29wX3N5bWJvbCA9PSAwKTsKLQkgIHJlZyA9IG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLQkgIGlmIChyZWcgPj0gU1JFRykKLQkgICAgYnJlYWs7CQkvKiBObyBzcGVjaWFsIHJlZ2lzdGVycyAqLwotCi0JICAvKiBHb3QgdGhlIHJlZ2lzdGVyLCBub3cgZmlndXJlIG91dCB3aGVyZSBpdCBnb2VzIGluIHRoZQotCSAgICAgb3Bjb2RlLiAgKi8KLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgb3Bjb2RlIHw9IHJlZyA8PCA4OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2InOgotCSAgICBjYXNlICdpJzoKLQkgICAgICBvcGNvZGUgfD0gcmVnOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2MnOgotCSAgICAgIG9wY29kZSB8PSByZWcgPDwgMTY7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6CQkvKiAxNiBiaXQgY29uc3RhbnQsIHplcm8tZXh0ZW5kZWQgKi8KLQljYXNlICdYJzoJCS8qIDE2IGJpdCBjb25zdGFudCwgb25lLWV4dGVuZGVkICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGKSA8PCAwIHwKLQkJKChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGMDApIDw8IDgpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DX0NPTlNUOwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2gnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSAob3BlcmFuZC0+WF9hZGRfbnVtYmVyICYgMHgwMEZGMDAwMCkgPj4gMTYgfAotCQkoKCh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5YX2FkZF9udW1iZXIKLQkJICAvKiBhdm9pZCBzaWduIGV4dCAqLyAgJiAweEZGMDAwMDAwKSA+PiA4KTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgdGhlX2luc24ucmVsb2MgPSBSRUxPQ19DT05TVEg7Ci0JICB0aGVfaW5zbi5leHAgPSAqb3BlcmFuZDsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnUCc6CQkvKiBQQy1yZWxhdGl2ZSBqdW1wIGFkZHJlc3MgKi8KLQljYXNlICdBJzoJCS8qIEFic29sdXRlIGp1bXAgYWRkcmVzcyAqLwotCSAgLyogVGhlc2UgdHdvIGFyZSB0cmVhdGVkIHRvZ2V0aGVyIHNpbmNlIHdlIGZvbGRlZCB0aGUKLQkgICAgIG9wY29kZSB0YWJsZSBlbnRyaWVzIHRvZ2V0aGVyLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICAvKiBNYWtlIHN1cmUgdGhlICdBJyBjYXNlIHJlYWxseSBleGlzdHMuICAqLwotCSAgICAgIGlmICgoaW5zbi0+b3Bjb2RlIHwgQUJTT0xVVEVfQklUKSAhPSAoaW5zbiArIDEpLT5vcGNvZGUpCi0JCWJyZWFrOwotCSAgICAgIHsKLQkJYmZkX3ZtYSB2LCBtYXNrOwotCQltYXNrID0gMHgxZmZmZjsKLQkJdiA9IG9wZXJhbmQtPlhfYWRkX251bWJlciAmIH4gbWFzazsKLQkJaWYgKHYpCi0JCSAgYXNfYmFkICgiY2FsbC9qbXAgdGFyZ2V0IG91dCBvZiByYW5nZSIpOwotCSAgICAgIH0KLQkgICAgICBvcGNvZGUgfD0gQUJTT0xVVEVfQklUIHwKLQkJKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4MDAwM0ZDMDApIDw8IDYgfAotCQkoKG9wZXJhbmQtPlhfYWRkX251bWJlciAmIDB4MDAwMDAzRkMpID4+IDIpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICB0aGVfaW5zbi5yZWxvYyA9IFJFTE9DX0pVTVBUQVJHOwotCSAgdGhlX2luc24uZXhwID0gKm9wZXJhbmQ7Ci0JICB0aGVfaW5zbi5wY3JlbCA9IDE7CS8qIEFzc3VtZSBQQy1yZWxhdGl2ZSBqdW1wICovCi0JICAvKiBGSVhNRS1TT09OLCBEbyB3ZSBmaWd1cmUgb3V0IHdoZXRoZXIgYWJzIGxhdGVyLCBhZnRlcgotICAgICAgICAgICAgIGtub3cgc3ltIHZhbD8gKi8KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnZSc6CQkvKiBDb3Byb2Nlc3NvciBlbmFibGUgYml0IGZvciBMT0FEL1NUT1JFIGluc24gKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDApCi0JCWNvbnRpbnVlOwotCSAgICAgIGlmIChvcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMSkKLQkJewotCQkgIG9wY29kZSB8PSBDRV9CSVQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICduJzoJCS8qIENvbnRyb2wgYml0cyBmb3IgTE9BRC9TVE9SRSBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCAxMjgpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gKG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxNik7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAncyc6CQkvKiBTcGVjaWFsIHJlZ2lzdGVyIG51bWJlciAqLwotCSAgaWYgKG9wZXJhbmQtPlhfb3AgIT0gT19yZWdpc3RlcikKLQkgICAgYnJlYWs7CQkvKiBPbmx5IHJlZ2lzdGVycyAqLwotCSAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA8IFNSRUcpCi0JICAgIGJyZWFrOwkJLyogTm90IGEgc3BlY2lhbCByZWdpc3RlciAqLwotCSAgb3Bjb2RlIHw9IChvcGVyYW5kLT5YX2FkZF9udW1iZXIgJiAweEZGKSA8PCA4OwotCSAgY29udGludWU7Ci0KLQljYXNlICd1JzoJCS8qIFVJIGJpdCBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPlhfYWRkX251bWJlciA9PSAwKQotCQljb250aW51ZTsKLQkgICAgICBpZiAob3BlcmFuZC0+WF9hZGRfbnVtYmVyID09IDEpCi0JCXsKLQkJICBvcGNvZGUgfD0gVUlfQklUOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAncic6CQkvKiBSTkQgYml0cyBvZiBDT05WRVJUICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmCi0JICAgICAgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgOCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgNDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoJCS8qIElEIGJpdHMgb2YgSU5WIGFuZCBJUkVUSU5WLiAgKi8KLQkgIC8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbC4gICovCi0JICBpZiAob3BlcmFuZC0+WF9vcCA9PSBPX2Fic2VudCkKLQkgICAgY29udGludWU7Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQKLQkJICAgJiYgb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgewotCSAgICAgIG9wY29kZSB8PSBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPDwgMTY7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6CQkvKiBGRCBiaXRzIG9mIENPTlZFUlQgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAyOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCi0JY2FzZSAnZic6CQkvKiBGUyBiaXRzIG9mIENPTlZFUlQgKi8KLQkgIGlmIChvcGVyYW5kLT5YX29wID09IE9fY29uc3RhbnQgJiYKLQkgICAgICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCA0KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAwOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgotCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDQpCi0JICAgIHsKLQkgICAgICBvcGNvZGUgfD0gb3BlcmFuZC0+WF9hZGRfbnVtYmVyIDw8IDE2OwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ0YnOgotCSAgaWYgKG9wZXJhbmQtPlhfb3AgPT0gT19jb25zdGFudCAmJgotCSAgICAgIG9wZXJhbmQtPlhfYWRkX251bWJlciA8IDE2KQotCSAgICB7Ci0JICAgICAgb3Bjb2RlIHw9IG9wZXJhbmQtPlhfYWRkX251bWJlciA8PCAxODsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKCphcmdzKTsKLQl9Ci0gICAgICAvKiBUeXBlcyBvciB2YWx1ZXMgb2YgYXJncyBkb24ndCBtYXRjaC4gICovCi0gICAgICBhc19iYWQgKCJJbnZhbGlkIG9wZXJhbmRzIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUgbWRfYXRvZiBpbiBtNjhrLmMuICBJIHRoaW5rIHRoaXMgaXMgcmlnaHQsCi0gICBidXQgSSdtIG5vdCBzdXJlLgotCi0gICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiAiQmFkIGNhbGwgdG8gTURfQVRPRigpIjsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyoKLSAqIFdyaXRlIG91dCBiaWctZW5kaWFuLgotICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KLQotCi0gIGtub3cgKGZpeFAtPmZ4X3NpemUgPT0gNCk7Ci0gIGtub3cgKGZpeFAtPmZ4X3JfdHlwZSA8IE5PX1JFTE9DKTsKLQotICAvKiBUaGlzIGlzIGEgaGFjay4gIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuICAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IFJFTE9DX1dESVNQMzAgJiYgZml4UC0+ZnhfYWRkc3kpCi0gICAgewotICAgICAgdmFsICs9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSAgICB9Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotCi0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DXzg6Ci0gICAgICBidWZbMF0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfV0RJU1AzMDoKLSAgICAgIHZhbCA9ICh2YWwgPj49IDIpICsgMTsKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDI0KSAmIDB4M2Y7Ci0gICAgICBidWZbMV0gPSAodmFsID4+IDE2KTsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0hJMjI6Ci0gICAgICBidWZbMV0gfD0gKHZhbCA+PiAyNikgJiAweDNmOwotICAgICAgYnVmWzJdID0gdmFsID4+IDE4OwotICAgICAgYnVmWzNdID0gdmFsID4+IDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0xPMTA6Ci0gICAgICBidWZbMl0gfD0gKHZhbCA+PiA4KSAmIDB4MDM7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfQkFTRTEzOgotICAgICAgYnVmWzJdIHw9ICh2YWwgPj4gOCkgJiAweDFmOwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1dESVNQMjI6Ci0gICAgICB2YWwgPSAodmFsID4+PSAyKSArIDE7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgUkVMT0NfQkFTRTIyOgotICAgICAgYnVmWzFdIHw9ICh2YWwgPj4gMTYpICYgMHgzZjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0pVTVBUQVJHOgkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgaWYgKCFmaXhQLT5meF9kb25lKQotCXsKLQkgIC8qIFRoZSBsaW5rZXIgdHJpZXMgdG8gc3VwcG9ydCBib3RoIEFNRCBhbmQgb2xkIEdOVSBzdHlsZQotICAgICAgICAgICAgIFJfSVJFTCByZWxvY3MuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIGFkZGVuZCBpcyBleGFjdGx5Ci0gICAgICAgICAgICAgdGhlIG5lZ2F0aXZlIG9mIHRoZSBhZGRyZXNzIHdpdGhpbiB0aGUgc2VjdGlvbiwgdGhlCi0gICAgICAgICAgICAgbGlua2VyIHdpbGwgbm90IGhhbmRsZSBpdCBjb3JyZWN0bHkuICAqLwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsCi0JICAgICAgJiYgdmFsICE9IDAKLQkgICAgICAmJiB2YWwgPT0gLSAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlKSkKLQkgICAgYXNfYmFkX3doZXJlCi0JICAgICAgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JICAgICAgICJ0aGUgbGlua2VyIHdpbGwgbm90IGhhbmRsZSB0aGlzIHJlbG9jYXRpb24gY29ycmVjdGx5Iik7Ci0JfQotICAgICAgZWxzZSBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JewotCSAgbG9uZyB2ID0gdmFsID4+IDE3OwotCSAgaWYgKHYgIT0gMCAmJiB2ICE9IC0xKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICJjYWxsL2ptcCB0YXJnZXQgb3V0IG9mIHJhbmdlIik7Ci0JfQotICAgICAgZWxzZQotCS8qIHRoaXMgY2FzZSB3YXMgc3VwcG9zZWQgdG8gYmUgaGFuZGxlZCBpbiBtYWNoaW5lX2lwICovCi0JYWJvcnQgKCk7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTA7CS8qIEhvbGRzIGJpdHMgMDAwM0ZGRkMgb2YgYWRkcmVzcyAqLwotICAgICAgYnVmWzNdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfQ09OU1Q6CQkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgYnVmWzFdID0gdmFsID4+IDg7CS8qIEhvbGRzIGJpdHMgMDAwMFhYWFggKi8KLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19DT05TVEg6CQkvKiAwMFhYMDBYWCBwYXR0ZXJuIGluIGEgd29yZCAqLwotICAgICAgYnVmWzFdID0gdmFsID4+IDI0OwkvKiBIb2xkcyBiaXRzIFhYWFgwMDAwICovCi0gICAgICBidWZbM10gPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTk9fUkVMT0M6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IiksIGZpeFAtPmZ4X3JfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNpZmRlZiBPQkpfQ09GRgotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgcmV0dXJuIChSX1dPUkQpOwotICAgIGNhc2UgUkVMT0NfODoKLSAgICAgIHJldHVybiAoUl9CWVRFKTsKLSAgICBjYXNlIFJFTE9DX0NPTlNUOgotICAgICAgcmV0dXJuIChSX0lMT0hBTEYpOwotICAgIGNhc2UgUkVMT0NfQ09OU1RIOgotICAgICAgcmV0dXJuIChSX0lISUhBTEYpOwotICAgIGNhc2UgUkVMT0NfSlVNUFRBUkc6Ci0gICAgICByZXR1cm4gKFJfSVJFTCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHByaW50ZiAoXygibmVlZCAlbzNcbiIpLCBmaXhQLT5meF9yX3R5cGUpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gdHlwZSAqLwotCi0gIHJldHVybiAoMCk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciAyOWsgKi8KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGFzX2ZhdGFsIChfKCJhMjlrX2NvbnZlcnRfZnJhZ1xuIikpOwotfQotCi0vKiBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZvciBhMjlrICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VndHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ3R5cGU7Ci17Ci0gIGFzX2ZhdGFsIChfKCJhMjlrX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iKSk7Ci0gIHJldHVybiAwOwotfQotCi0jaWYgMAotLyogZm9yIGRlYnVnZ2luZyBvbmx5ICovCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbiAoaW5zbikKLSAgICAgc3RydWN0IG1hY2hpbmVfaXQgKmluc247Ci17Ci0gIGNoYXIgKlJlbG9jW10gPQotICB7Ci0gICAgIlJFTE9DXzgiLAotICAgICJSRUxPQ18xNiIsCi0gICAgIlJFTE9DXzMyIiwKLSAgICAiUkVMT0NfRElTUDgiLAotICAgICJSRUxPQ19ESVNQMTYiLAotICAgICJSRUxPQ19ESVNQMzIiLAotICAgICJSRUxPQ19XRElTUDMwIiwKLSAgICAiUkVMT0NfV0RJU1AyMiIsCi0gICAgIlJFTE9DX0hJMjIiLAotICAgICJSRUxPQ18yMiIsCi0gICAgIlJFTE9DXzEzIiwKLSAgICAiUkVMT0NfTE8xMCIsCi0gICAgIlJFTE9DX1NGQV9CQVNFIiwKLSAgICAiUkVMT0NfU0ZBX09GRjEzIiwKLSAgICAiUkVMT0NfQkFTRTEwIiwKLSAgICAiUkVMT0NfQkFTRTEzIiwKLSAgICAiUkVMT0NfQkFTRTIyIiwKLSAgICAiUkVMT0NfUEMxMCIsCi0gICAgIlJFTE9DX1BDMjIiLAotICAgICJSRUxPQ19KTVBfVEJMIiwKLSAgICAiUkVMT0NfU0VHT0ZGMTYiLAotICAgICJSRUxPQ19HTE9CX0RBVCIsCi0gICAgIlJFTE9DX0pNUF9TTE9UIiwKLSAgICAiUkVMT0NfUkVMQVRJVkUiLAotICAgICJOT19SRUxPQyIKLSAgfTsKLQotICBpZiAoaW5zbi0+ZXJyb3IpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRVJST1I6ICVzXG4iKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIm9wY29kZT0weCUwOHhcbiIsIGluc24tPm9wY29kZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgInJlbG9jID0gJXNcbiIsIFJlbG9jW2luc24tPnJlbG9jXSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4cCA9ICB7XG4iKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfYWRkX3N5bWJvbCA9ICVzXG4iLAotCSAgIGluc24tPmV4cC5YX2FkZF9zeW1ib2wgPwotCSAgIChTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9hZGRfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX2FkZF9zeW1ib2wpIDogIj8/PyIpIDogIjAiKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXHRcdFhfb3Bfc3ltYm9sID0gJXNcbiIsCi0JICAgaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sID8KLQkgICAoU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sKSA/Ci0JICAgIFNfR0VUX05BTUUgKGluc24tPmV4cC5YX29wX3N5bWJvbCkgOiAiPz8/IikgOiAiMCIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9hZGRfbnVtYmVyID0gJWRcbiIsCi0JICAgaW5zbi0+ZXhwLlhfYWRkX251bWJlcik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIn1cbiIpOwotfQotCi0jZW5kaWYKLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byB0YXJnZXQgZm9ybWF0LgotCi0gICBPbiBzcGFyYy8yOWs6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIG5leHQgdGhyZWUKLSAgIGJ5dGVzIGFyZSBpbmRleCwgbW9zdCBzaWcuIGJ5dGUgZmlyc3QuICBCeXRlIDcgaXMgYnJva2VuIHVwIHdpdGgKLSAgIGJpdCA3IGFzIGV4dGVybmFsLCBiaXRzIDYgJiA1IHVudXNlZCwgYW5kIHRoZSBsb3dlcgotICAgZml2ZSBiaXRzIGFzIHJlbG9jYXRpb24gdHlwZS4gIE5leHQgNCBieXRlcyBhcmUgbG9uZyBhZGRlbmQuICovCi0vKiBUaGFueCBhbmQgYSB0aXAgb2YgdGhlIGhhdCB0byBNaWNoYWVsIEJsb29tLCBtYkB0dGlkY2EudHRpLmNvbSAqLwotCi0jaWZkZWYgT0JKX0FPVVQKLQotdm9pZAotdGNfYW91dF9maXhfdG9fY2hhcnMgKHdoZXJlLCBmaXhQLCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X3JfdHlwZSA8IE5PX1JFTE9DKTsKLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCA3KSAmIDB4ODApIHwgKDAgJiAweDYwKSB8IChmaXhQLT5meF9yX3R5cGUgJiAweDFGKTsKLSAgLyogQWxzbyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAoJndoZXJlWzhdLCBmaXhQLT5meF9hZGRudW1iZXIsIDQpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgbGluZSBpcyB1bnJlY29nbml6ZWQuICBUaGlzIGlzIHVzZWQgdG8gaGFuZGxlCi0gICBkZWZpbml0aW9ucyBvZiBhMjlrIHN0eWxlIGxvY2FsIGxhYmVscy4gICovCi0KLWludAotYTI5a191bnJlY29nbml6ZWRfbGluZSAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGludCBsYWI7Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKGMgIT0gJyQnCi0gICAgICB8fCAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMF0pKQotICAgIHJldHVybiAwOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgbGFiID0gMDsKLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0gICAgewotICAgICAgbGFiID0gbGFiICogMTAgKyAqcyAtICcwJzsKLSAgICAgICsrczsKLSAgICB9Ci0KLSAgaWYgKCpzICE9ICc6JykKLSAgICB7Ci0gICAgICAvKiBOb3QgYSBsYWJlbCBkZWZpbml0aW9uLiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKGxhYikpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJsYWJlbCBcIiQlZFwiIHJlZGVmaW5lZCIpLCBsYWIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGRlZmluZV9kb2xsYXJfbGFiZWwgKGxhYik7Ci0gIGNvbG9uIChkb2xsYXJfbGFiZWxfbmFtZSAobGFiLCAwKSk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAxOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IHRoZSB2YWx1ZXMgb2Ygc3ltYm9scyBrbm93biB0aGF0IHNob3VsZCBiZSAicHJlZGVmaW5lZCIuICBXZQotICAgZG9uJ3QgYm90aGVyIHRvIHByZWRlZmluZSB0aGVtIHVubGVzcyB5b3UgYWN0dWFsbHkgdXNlIG9uZSwgc2luY2UgdGhlcmUKLSAgIGFyZSBhIGxvdCBvZiB0aGVtLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBsb25nIHJlZ251bTsKLSAgY2hhciB0ZXN0YnVmWzUgKyAvKlNMT1AqLyA1XTsKLQotICBpZiAobmFtZVswXSA9PSAnZycgfHwgbmFtZVswXSA9PSAnRycKLSAgICAgIHx8IG5hbWVbMF0gPT0gJ2wnIHx8IG5hbWVbMF0gPT0gJ0wnCi0gICAgICB8fCBuYW1lWzBdID09ICdzJyB8fCBuYW1lWzBdID09ICdTJykKLSAgICB7Ci0gICAgICAvKiBQZXJoYXBzIGEgZ2xvYmFsIG9yIGxvY2FsIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgIGlmIChuYW1lWzFdID09ICdyJyB8fCBuYW1lWzFdID09ICdSJykKLQl7Ci0JICBsb25nIG1heHJlZzsKLQotCSAgLyogUGFyc2UgdGhlIG51bWJlciwgbWFrZSBzdXJlIGl0IGhhcyBubyBleHRyYSB6ZXJvZXMgb3IKLQkgICAgIHRyYWlsaW5nIGNoYXJzLiAqLwotCSAgcmVnbnVtID0gYXRvbCAoJm5hbWVbMl0pOwotCi0JICBpZiAobmFtZVswXSA9PSAncycgfHwgbmFtZVswXSA9PSAnUycpCi0JICAgIG1heHJlZyA9IDI1NTsKLQkgIGVsc2UKLQkgICAgbWF4cmVnID0gMTI3OwotCSAgaWYgKHJlZ251bSA+IG1heHJlZykKLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIHNwcmludGYgKHRlc3RidWYsICIlbGQiLCByZWdudW0pOwotCSAgaWYgKHN0cmNtcCAodGVzdGJ1ZiwgJm5hbWVbMl0pICE9IDApCi0JICAgIHJldHVybiBOVUxMOwkvKiBncjAwNyBvciBscjdmb28gb3Igd2hhdGV2ZXIgKi8KLQotCSAgLyogV2UgaGF2ZSBhIHdpZW5lciEgIERlZmluZSBhbmQgcmV0dXJuIGEgbmV3IHN5bWJvbCBmb3IgaXQuICAqLwotCSAgaWYgKG5hbWVbMF0gPT0gJ2wnIHx8IG5hbWVbMF0gPT0gJ0wnKQotCSAgICByZWdudW0gKz0gMTI4OwotCSAgZWxzZSBpZiAobmFtZVswXSA9PSAncycgfHwgbmFtZVswXSA9PSAnUycpCi0JICAgIHJlZ251bSArPSBTUkVHOwotCSAgcmV0dXJuIChzeW1ib2xfbmV3IChuYW1lLCBTRUdfUkVHSVNURVIsICh2YWx1ZVQpIHJlZ251bSwKLQkJCSAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFBhcnNlIGFuIG9wZXJhbmQgdGhhdCBpcyBtYWNoaW5lLXNwZWNpZmljLiAgKi8KLQotdm9pZAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICclJyAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJyUnKQotICAgIHsKLSAgICAgIC8qIFdlIGhhdmUgYSBudW1lcmljIHJlZ2lzdGVyIGV4cHJlc3Npb24uICBObyBiaWdneS4gICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsJLyogU2tpcCAlJSAqLwotICAgICAgKHZvaWQpIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIGlmIChleHByZXNzaW9uUC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0JICB8fCBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID4gMjU1KQotCWFzX2JhZCAoXygiSW52YWxpZCBleHByZXNzaW9uIGFmdGVyICUlJSVcbiIpKTsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJicpCi0gICAgewotICAgICAgLyogV2UgYXJlIHRha2luZyB0aGUgJ2FkZHJlc3MnIG9mIGEgcmVnaXN0ZXIuLi50aGlzIG9uZSBpcyBub3QKLQkgaW4gdGhlIG1hbnVhbCwgYnV0IGl0ICppcyogaW4gdHJhcHMvZnBzeW1ib2wuaCEgIFdoYXQgdGhleQotCSBzZWVtIHRvIHdhbnQgaXMgdGhlIHJlZ2lzdGVyIG51bWJlciwgYXMgYW4gYWJzb2x1dGUgbnVtYmVyLiAgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwkvKiBTa2lwICYgKi8KLSAgICAgICh2b2lkKSBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgIT0gT19yZWdpc3RlcikKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgaW4gJiBleHByZXNzaW9uIikpOwotICAgICAgZWxzZQotCWV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJCcKLQkgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKLSAgICB7Ci0gICAgICBsb25nIGxhYjsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSBsb2NhbCBsYWJlbC4gICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGxhYiA9IChsb25nKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChkb2xsYXJfbGFiZWxfZGVmaW5lZCAobGFiKSkKLQl7Ci0JICBuYW1lID0gZG9sbGFyX2xhYmVsX25hbWUgKGxhYiwgMCk7Ci0JICBzeW0gPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG5hbWUgPSBkb2xsYXJfbGFiZWxfbmFtZSAobGFiLCAxKTsKLQkgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCX0KLQotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW07Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnJCcpCi0gICAgewotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgdHlwZTsKLSAgICAgIGludCBmaWVsZG51bSwgZmllbGRsaW1pdDsKLSAgICAgIExJVFRMRU5VTV9UWVBFIGZsb2F0YnVmWzhdOwotCi0gICAgICAvKiAkZmxvYXQoKSwgJGRvdWJsZU4oKSwgb3IgJGV4dGVuZE4oKSBjb252ZXJ0IGZsb2F0aW5nIHZhbHVlcwotCSB0byBpbnRlZ2Vycy4gICovCi0KLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgICsrczsKLQotICAgICAgZmllbGRudW0gPSAwOwotICAgICAgaWYgKHN0cm5jbXAgKHMsICJkb3VibGUiLCBzaXplb2YgImRvdWJsZSIgLSAxKSA9PSAwKQotCXsKLQkgIHMgKz0gc2l6ZW9mICJkb3VibGUiIC0gMTsKLQkgIHR5cGUgPSAnZCc7Ci0JICBmaWVsZGxpbWl0ID0gMjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChzLCAiZmxvYXQiLCBzaXplb2YgImZsb2F0IiAtIDEpID09IDApCi0JewotCSAgcyArPSBzaXplb2YgImZsb2F0IiAtIDE7Ci0JICB0eXBlID0gJ2YnOwotCSAgZmllbGRsaW1pdCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImV4dGVuZCIsIHNpemVvZiAiZXh0ZW5kIiAtIDEpID09IDApCi0JewotCSAgcyArPSBzaXplb2YgImV4dGVuZCIgLSAxOwotCSAgdHlwZSA9ICd4JzsKLQkgIGZpZWxkbGltaXQgPSA0OwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGlzZGlnaXQgKCpzKSkKLQl7Ci0JICBmaWVsZG51bSA9ICpzIC0gJzAnOwotCSAgKytzOwotCX0KLSAgICAgIGlmIChmaWVsZG51bSA+PSBmaWVsZGxpbWl0KQotCXJldHVybjsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCpzICE9ICcoJykKLQlyZXR1cm47Ci0gICAgICArK3M7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgICAgIHMgPSBhdG9mX2llZWUgKHMsIHR5cGUsIGZsb2F0YnVmKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcmV0dXJuOwotICAgICAgcyA9IHM7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqcyAhPSAnKScpCi0JcmV0dXJuOwotICAgICAgKytzOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OyAKLSAgICAgIGV4cHJlc3Npb25QLT5YX3Vuc2lnbmVkID0gMTsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAoKGZsb2F0YnVmW2ZpZWxkbnVtICogMl0KLQkJCQkgICAgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCQkJCSAgICsgZmxvYXRidWZbZmllbGRudW0gKiAyICsgMV0pOwotICAgIH0KLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgMjkwMDAsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uLAotICAgd2hpY2ggd2UgaGF2ZSBzZXQgdXAgYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpeHVwIHRvby4gICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBlbmQgb2YgdGMtYTI5ay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWEyOWsuaCBiL2dhcy9jb25maWcvdGMtYTI5ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjBmNjA1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogdGMtYTI5ay5oIC0tIEFzc2VtYmxlIGZvciB0aGUgQU1EIDI5MDAwLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfQTI5SwotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgTEVYX0RPTExBUiAxCi0KLSNkZWZpbmUgdGNfdW5yZWNvZ25pemVkX2xpbmUoYykgYTI5a191bnJlY29nbml6ZWRfbGluZSAoYykKLWV4dGVybiBpbnQgYTI5a191bnJlY29nbml6ZWRfbGluZSBQQVJBTVMgKChpbnQpKTsKLQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCTsJLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQk7CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQk7CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayhhKQk7CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgQU9VVF9NQUNIVFlQRSAxMDEKLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4X3B0cikgdGNfY29mZl9maXgycnR5cGUoZml4X3B0cikKLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfYTI5awotI2RlZmluZSBDT0ZGX01BR0lDIFNJUEZCT01BR0lDCi0vKiBTaG91bGQgdGhlIHJlbG9jIGJlIG91dHB1dCA/Ci0Jb24gdGhlIDI5aywgdGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhlcmUgaXMgYSBzeW1ib2wgYXR0YXRjaGVkLgotCW9uIHRoZSBoOCwgdGhpcyBpcyBhbGx3YXlzIHRydWUsIHNpbmNlIG5vIGZpeHVwIGlzIGRvbmUKLSovCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICh4LT5meF9hZGRzeSkKLSNkZWZpbmUgVENfQ09OU19SRUxPQyBSRUxPQ18zMgotCi0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyVwotI2RlZmluZSByZWxvY190eXBlIGludAotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotCi0jZGVmaW5lIFpFUk9fQkFTRURfU0VHTUVOVFMKLQotLyogZW5kIG9mIHRjLWEyOWsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jIGIvZ2FzL2NvbmZpZy90Yy1hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTQzMmRjLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NzUgKzAsMCBAQAotLyogdGMtYWxwaGEuYyAtIFByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlIGZvciB0aGUgREVDIEFscGhhIEFYUCBDUFUuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkzLTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHksIDE5OTMuCi0gICBXcml0dGVuIGJ5IEFsZXNzYW5kcm8gRm9yaW4sIGJhc2VkIG9uIGVhcmxpZXIgZ2FzLTEuMzggdGFyZ2V0IENQVSBmaWxlcy4KLSAgIE1vZGlmaWVkIGJ5IEtlbiBSYWVidXJuIGZvciBnYXMtMi54IGFuZCBFQ09GRiBzdXBwb3J0LgotICAgTW9kaWZpZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gZm9yIEVMRiBzdXBwb3J0LgotICAgTW9kaWZpZWQgYnkgS2xhdXMgSyJhbXBmIGZvciBFVkFYIChPcGVuVk1TL0FscGhhKSBzdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogTWFjaCBPcGVyYXRpbmcgU3lzdGVtCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTMgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKLSAqIGRvY3VtZW50YXRpb24gaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgYm90aCB0aGUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlCi0gKiBzb2Z0d2FyZSwgZGVyaXZhdGl2ZSB3b3JrcyBvciBtb2RpZmllZCB2ZXJzaW9ucywgYW5kIGFueSBwb3J0aW9ucwotICogdGhlcmVvZiwgYW5kIHRoYXQgYm90aCBub3RpY2VzIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uCi0gKgotICogQ0FSTkVHSUUgTUVMTE9OIEFMTE9XUyBGUkVFIFVTRSBPRiBUSElTIFNPRlRXQVJFIElOIElUUwotICogQ09ORElUSU9OLiAgQ0FSTkVHSUUgTUVMTE9OIERJU0NMQUlNUyBBTlkgTElBQklMSVRZIE9GIEFOWSBLSU5EIEZPUgotICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUuCi0gKgotICogQ2FybmVnaWUgTWVsbG9uIHJlcXVlc3RzIHVzZXJzIG9mIHRoaXMgc29mdHdhcmUgdG8gcmV0dXJuIHRvCi0gKgotICogIFNvZnR3YXJlIERpc3RyaWJ1dGlvbiBDb29yZGluYXRvciAgb3IgIFNvZnR3YXJlLkRpc3RyaWJ1dGlvbkBDUy5DTVUuRURVCi0gKiAgU2Nob29sIG9mIENvbXB1dGVyIFNjaWVuY2UKLSAqICBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQotICogIFBpdHRzYnVyZ2ggUEEgMTUyMTMtMzg5MAotICoKLSAqIGFueSBpbXByb3ZlbWVudHMgb3IgZXh0ZW5zaW9ucyB0aGF0IHRoZXkgbWFrZSBhbmQgZ3JhbnQgQ2FybmVnaWUgdGhlCi0gKiByaWdodHMgdG8gcmVkaXN0cmlidXRlIHRoZXNlIGNoYW5nZXMuCi0gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgImVjb2ZmLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvYWxwaGEuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotDAotLyogTG9jYWwgdHlwZXMgKi8KLQotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgMgotI2RlZmluZSBNQVhfSU5TTl9BUkdTIDUKLQotc3RydWN0IGFscGhhX2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotc3RydWN0IGFscGhhX2luc24KLXsKLSAgdW5zaWduZWQgaW5zbjsKLSAgaW50IG5maXh1cHM7Ci0gIHN0cnVjdCBhbHBoYV9maXh1cCBmaXh1cHNbTUFYX0lOU05fRklYVVBTXTsKLX07Ci0KLWVudW0gYWxwaGFfbWFjcm9fYXJnCi17Ci0gIE1BQ1JPX0VPQSA9IDEsIE1BQ1JPX0lSLCBNQUNST19QSVIsIE1BQ1JPX0NQSVIsIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQCi19OwotCi1zdHJ1Y3QgYWxwaGFfbWFjcm8KLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgdm9pZCAoKmVtaXQpIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci0gIGNvbnN0IFBUUiBhcmc7Ci0gIGVudW0gYWxwaGFfbWFjcm9fYXJnIGFyZ3NldHNbMTZdOwotfTsKLQotLyogVHdvIGV4dHJhIHN5bWJvbHMgd2Ugd2FudCB0byBzZWUgaW4gb3VyIGlucHV0LiAgVGhpcyBpcyBhIGJsYXRlbnQKLSAgIG1pc3VzZSBvZiB0aGUgZXhwcmVzc2lvblMuWF9vcCBmaWVsZC4gICovCi0KLSNkZWZpbmUgT19wcmVnaXN0ZXIgICgob3BlcmF0b3JUKSAoT19tYXgrMSkpIC8qIE9fcmVnaXN0ZXIsIGluIHBhcmVudGhlc2VzICovCi0jZGVmaW5lIE9fY3ByZWdpc3RlciAoKG9wZXJhdG9yVCkgKE9fcHJlZ2lzdGVyKzEpKSAvKiArIGEgbGVhZGluZyBjb21tYSAqLwotI2RlZmluZSBPX2FscGhhX21heCAgKChvcGVyYXRvclQpIChPX2NwcmVnaXN0ZXIrMSkpCi0KLS8qIE1hY3JvcyBmb3IgZXh0cmFjdGluZyB0aGUgdHlwZSBhbmQgbnVtYmVyIG9mIGVuY29kZWQgcmVnaXN0ZXIgdG9rZW5zICovCi0KLSNkZWZpbmUgaXNfaXJfbnVtKHgpCQkoKCh4KSAmIDMyKSA9PSAwKQotI2RlZmluZSBpc19mcHJfbnVtKHgpCQkoKCh4KSAmIDMyKSAhPSAwKQotI2RlZmluZSByZWdubyh4KQkJKCh4KSAmIDMxKQotCi0vKiBTb21ldGhpbmcgb2RkIGluaGVyaXRlZCBmcm9tIHRoZSBvbGQgYXNzZW1ibGVyICovCi0KLSNkZWZpbmUgbm90ZV9ncHJlZyhSKQkJKGFscGhhX2dwcm1hc2sgfD0gKDEgPDwgKFIpKSkKLSNkZWZpbmUgbm90ZV9mcHJlZyhSKQkJKGFscGhhX2Zwcm1hc2sgfD0gKDEgPDwgKFIpKSkKLQotLyogUHJlZGljYXRlcyBmb3IgMTYtIGFuZCAzMi1iaXQgcmFuZ2VzICovCi0vKiBYWFg6IFRoZSBub24tc2hpZnQgdmVyc2lvbiBhcHBlYXJzIHRvIHRyaWdnZXIgYSBjb21waWxlciBidWcgd2hlbgotICAgY3Jvc3MtYXNzZW1ibGluZyBmcm9tIHg4NiB3LyBnY2MgMi43LjIuICAqLwotCi0jaWYgMQotI2RlZmluZSByYW5nZV9zaWduZWRfMTYoeCkgXAotCSgoKG9mZnNldFQpKHgpID4+IDE1KSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMTUpID09IC0xKQotI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkgXAotCSgoKG9mZnNldFQpKHgpID4+IDMxKSA9PSAwIHx8ICgob2Zmc2V0VCkoeCkgPj4gMzEpID09IC0xKQotI2Vsc2UKLSNkZWZpbmUgcmFuZ2Vfc2lnbmVkXzE2KHgpCSgob2Zmc2V0VCkoeCkgPj0gLShvZmZzZXRUKTB4ODAwMCAmJglcCi0JCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGKQotI2RlZmluZSByYW5nZV9zaWduZWRfMzIoeCkJKChvZmZzZXRUKSh4KSA+PSAtKG9mZnNldFQpMHg4MDAwMDAwMCAmJiBcCi0JCQkJIChvZmZzZXRUKSh4KSA8PSAgKG9mZnNldFQpMHg3RkZGRkZGRikKLSNlbmRpZgotCi0vKiBNYWNyb3MgZm9yIHNpZ24gZXh0ZW5kaW5nIGZyb20gMTYtIGFuZCAzMi1iaXRzLiAgKi8KLS8qIFhYWDogVGhlIGNhc3QgbWFjcm9zIHdpbGwgd29yayBvbiBhbGwgdGhlIHN5c3RlbXMgdGhhdCBJIGNhcmUgYWJvdXQsCi0gICBidXQgcmVhbGx5IGEgcHJlZGljYXRlIHNob3VsZCBiZSBmb3VuZCB0byB1c2UgdGhlIG5vbi1jYXN0IGZvcm1zLiAgKi8KLQotI2lmIDEKLSNkZWZpbmUgc2lnbl9leHRlbmRfMTYoeCkJKChzaG9ydCkoeCkpCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzMyKHgpCSgoaW50KSh4KSkKLSNlbHNlCi0jZGVmaW5lIHNpZ25fZXh0ZW5kXzE2KHgpCSgob2Zmc2V0VCkoKCh4KSAmIDB4RkZGRikgXiAweDgwMDApIC0gMHg4MDAwKQotI2RlZmluZSBzaWduX2V4dGVuZF8zMih4KQkoKG9mZnNldFQpKCgoeCkgJiAweEZGRkZGRkZGKSBcCi0JCQkJCSAgIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotI2VuZGlmCi0KLS8qIE1hY3JvcyB0byBidWlsZCB0b2tlbnMgKi8KLQotI2RlZmluZSBzZXRfdG9rX3JlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19yZWdpc3RlciwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfcHJlZyh0LCByKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19wcmVnaXN0ZXIsCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAocikpCi0jZGVmaW5lIHNldF90b2tfY3ByZWcodCwgcikJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fY3ByZWdpc3RlciwJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSkKLSNkZWZpbmUgc2V0X3Rva19mcmVnKHQsIHIpCShtZW1zZXQoJih0KSwgMCwgc2l6ZW9mKHQpKSwJCVwKLQkJCQkgKHQpLlhfb3AgPSBPX3JlZ2lzdGVyLAkJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChyKSszMikKLSNkZWZpbmUgc2V0X3Rva19zeW0odCwgcywgYSkJKG1lbXNldCgmKHQpLCAwLCBzaXplb2YodCkpLAkJXAotCQkJCSAodCkuWF9vcCA9IE9fc3ltYm9sLAkJCVwKLQkJCQkgKHQpLlhfYWRkX3N5bWJvbCA9IChzKSwJCVwKLQkJCQkgKHQpLlhfYWRkX251bWJlciA9IChhKSkKLSNkZWZpbmUgc2V0X3Rva19jb25zdCh0LCBuKQkobWVtc2V0KCYodCksIDAsIHNpemVvZih0KSksCQlcCi0JCQkJICh0KS5YX29wID0gT19jb25zdGFudCwJCQlcCi0JCQkJICh0KS5YX2FkZF9udW1iZXIgPSAobikpCi0KLQwKLS8qIFByb3RvdHlwZXMgZm9yIGFsbCBsb2NhbCBmdW5jdGlvbnMgKi8KLQotc3RhdGljIGludCB0b2tlbml6ZV9hcmd1bWVudHMgUEFSQU1TICgoY2hhciAqLCBleHByZXNzaW9uUyAqLCBpbnQpKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpmaW5kX29wY29kZV9tYXRjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCAqLCBpbnQgKikpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqZmluZF9tYWNyb19tYXRjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKiwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfb3BlcmFuZAotICBQQVJBTVMgKCh1bnNpZ25lZCwgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKiwgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgYXNzZW1ibGVfaW5zbgotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwKLQkgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2luc24gUEFSQU1TICgoc3RydWN0IGFscGhhX2luc24gKikpOwotc3RhdGljIHZvaWQgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24KLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIHN0cnVjdCBhbHBoYV9pbnNuICopKTsKLXN0YXRpYyB2b2lkIGFzc2VtYmxlX3Rva2VucwotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQgbG9hZF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGludCwgY29uc3QgZXhwcmVzc2lvblMgKiwgaW50ICosIGV4cHJlc3Npb25TICopKTsKLQotc3RhdGljIHZvaWQgZW1pdF9sZGdwIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2RpdmlzaW9uIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkYSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZGFoIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2lyX2xvYWQgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbG9hZHN0b3JlIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2pzcmptcCBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF9sZFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfbGRYdSBQQVJBTVMgKChjb25zdCBleHByZXNzaW9uUyAqLCBpbnQsIGNvbnN0IFBUUikpOwotc3RhdGljIHZvaWQgZW1pdF91bGRYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VsZFh1IFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X2xkaWwgUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc3RYIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBlbWl0X3VzdFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfc2V4dFggUEFSQU1TICgoY29uc3QgZXhwcmVzc2lvblMgKiwgaW50LCBjb25zdCBQVFIpKTsKLXN0YXRpYyB2b2lkIGVtaXRfcmV0amNyIFBBUkFNUyAoKGNvbnN0IGV4cHJlc3Npb25TICosIGludCwgY29uc3QgUFRSKSk7Ci0KLXN0YXRpYyB2b2lkIHNfYWxwaGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc19hbHBoYV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9yZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHZvaWQgc19hbHBoYV9zZGF0YSBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfZW50IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9lbmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX21hc2sgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2ZyYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9sb2d1ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfY29mZl93cmFwcGVyIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgc19hbHBoYV9ncHJlbDMyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9wcm9jIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2Jhc2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FscGhhX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hbHBoYV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYWxwaGFfc3BhY2UgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyB2b2lkIGNyZWF0ZV9saXRlcmFsX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWdUICosIHN5bWJvbFMgKiopKTsKLSNpZm5kZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgc2VsZWN0X2dwX3ZhbHVlIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotc3RhdGljIHZvaWQgYWxwaGFfYWxpZ24gUEFSQU1TICgoaW50LCBjaGFyICosIHN5bWJvbFMgKiwgaW50KSk7Ci0KLQwKLS8qIEdlbmVyaWMgYXNzZW1ibGVyIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIGJ5IGFsbAotICAgdGFyZ2V0cy4gICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZwotICAgcG9pbnQgbnVtYmVyLiAgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1lYW4gdGhhdCBhIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LAotICAgYXMgaW4gMGQxLjAuICAqLwotI2lmIDAKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotI2Vsc2UKLS8qIFhYWDogRG8gYWxsIG9mIHRoZXNlIHJlYWxseSBnZXQgdXNlZCBvbiB0aGUgYWxwaGE/PyAgKi8KLWNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VWQVgKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJGbTpnKzFoOkhHOiI7Ci0jZWxzZQotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkZtOmdHOiI7Ci0jZW5kaWYKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fMzJBRERSIChPUFRJT05fTURfQkFTRSkKLSAgeyAiMzJhZGRyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl8zMkFERFIgfSwKLSNkZWZpbmUgT1BUSU9OX1JFTEFYIChPUFRJT05fMzJBRERSKzEpCi0gIHsgInJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWCB9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OX01ERUJVRyAoT1BUSU9OX1JFTEFYKzEpCi0jZGVmaW5lIE9QVElPTl9OT19NREVCVUcgKE9QVElPTl9NREVCVUcrMSkKLSAgeyAibWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NREVCVUcgfSwKLSAgeyAibm8tbWRlYnVnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NREVCVUcgfSwKLSNlbmRpZgotICB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwIH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotDAotI2lmZGVmIE9CSl9FVkFYCi0jZGVmaW5lIEFYUF9SRUdfUjAgICAgIDAKLSNkZWZpbmUgQVhQX1JFR19SMTYgICAgMTYKLSNkZWZpbmUgQVhQX1JFR19SMTcgICAgMTcKLSN1bmRlZiBBWFBfUkVHX1Q5Ci0jZGVmaW5lIEFYUF9SRUdfVDkgICAgIDIyCi0jdW5kZWYgQVhQX1JFR19UMTAKLSNkZWZpbmUgQVhQX1JFR19UMTAgICAgMjMKLSN1bmRlZiBBWFBfUkVHX1QxMQotI2RlZmluZSBBWFBfUkVHX1QxMSAgICAyNAotI3VuZGVmIEFYUF9SRUdfVDEyCi0jZGVmaW5lIEFYUF9SRUdfVDEyICAgIDI1Ci0jZGVmaW5lIEFYUF9SRUdfQUkgICAgIDI1Ci0jdW5kZWYgQVhQX1JFR19GUAotI2RlZmluZSBBWFBfUkVHX0ZQICAgICAyOQotCi0jdW5kZWYgQVhQX1JFR19HUAotI2RlZmluZSBBWFBfUkVHX0dQIEFYUF9SRUdfUFYKLSNlbmRpZiAvKiBPQkpfRVZBWCAgKi8KLQotLyogVGhlIGNwdSBmb3Igd2hpY2ggd2UgYXJlIGdlbmVyYXRpbmcgY29kZSAqLwotc3RhdGljIHVuc2lnbmVkIGFscGhhX3RhcmdldCA9IEFYUF9PUENPREVfQkFTRTsKLXN0YXRpYyBjb25zdCBjaGFyICphbHBoYV90YXJnZXRfbmFtZSA9ICI8YWxsPiI7Ci0KLS8qIFRoZSBoYXNoIHRhYmxlIG9mIGluc3RydWN0aW9uIG9wY29kZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICphbHBoYV9vcGNvZGVfaGFzaDsKLQotLyogVGhlIGhhc2ggdGFibGUgb2YgbWFjcm8gb3Bjb2RlcyAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFscGhhX21hY3JvX2hhc2g7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLS8qIFRoZSAkZ3AgcmVsb2NhdGlvbiBzeW1ib2wgKi8KLXN0YXRpYyBzeW1ib2xTICphbHBoYV9ncF9zeW1ib2w7Ci0KLS8qIFhYWDogd2hhdCBpcyB0aGlzLCBhbmQgd2h5IGlzIGl0IGV4cG9ydGVkPyAqLwotdmFsdWVUIGFscGhhX2dwX3ZhbHVlOwotI2VuZGlmCi0KLS8qIFRoZSBjdXJyZW50ICRncCByZWdpc3RlciAqLwotc3RhdGljIGludCBhbHBoYV9ncF9yZWdpc3RlciA9IEFYUF9SRUdfR1A7Ci0KLS8qIEEgdGFibGUgb2YgdGhlIHJlZ2lzdGVyIHN5bWJvbHMgKi8KLXN0YXRpYyBzeW1ib2xTICphbHBoYV9yZWdpc3Rlcl90YWJsZVs2NF07Ci0KLS8qIENvbnN0YW50IHNlY3Rpb25zLCBvciBzZWN0aW9ucyBvZiBjb25zdGFudHMgKi8KLSNpZmRlZiBPQkpfRUNPRkYKLXN0YXRpYyBzZWdUIGFscGhhX2xpdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIGFscGhhX2xpdDRfc2VjdGlvbjsKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi1zdGF0aWMgc2VnVCBhbHBoYV9saW5rX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBhbHBoYV9jdG9yc19zZWN0aW9uOwotc3RhdGljIHNlZ1QgYWxwaGFfZHRvcnNfc2VjdGlvbjsKLSNlbmRpZgotc3RhdGljIHNlZ1QgYWxwaGFfbGl0OF9zZWN0aW9uOwotCi0vKiBTeW1ib2xzIHJlZmVycmluZyB0byBzYWlkIHNlY3Rpb25zLiAqLwotI2lmZGVmIE9CSl9FQ09GRgotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdGFfc3ltYm9sOwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2xpdDRfc3ltYm9sOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9saW5rX3N5bWJvbDsKLXN0YXRpYyBzeW1ib2xTICphbHBoYV9jdG9yc19zeW1ib2w7Ci1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfZHRvcnNfc3ltYm9sOwotI2VuZGlmCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfbGl0OF9zeW1ib2w7Ci0KLS8qIExpdGVyYWwgZm9yIC5saXRYKzB4ODAwMCB3aXRoaW4gLmxpdGEgKi8KLSNpZmRlZiBPQkpfRUNPRkYKLXN0YXRpYyBvZmZzZXRUIGFscGhhX2xpdDRfbGl0ZXJhbDsKLXN0YXRpYyBvZmZzZXRUIGFscGhhX2xpdDhfbGl0ZXJhbDsKLSNlbmRpZgotCi0vKiBUaGUgYWN0aXZlIC5lbnQgc3ltYm9sLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgc3ltYm9sUyAqYWxwaGFfY3VyX2VudF9zeW07Ci0jZW5kaWYKLQotLyogSXMgdGhlIGFzc2VtYmxlciBub3QgYWxsb3dlZCB0byB1c2UgJGF0PyAqLwotc3RhdGljIGludCBhbHBoYV9ub2F0X29uID0gMDsKLQotLyogQXJlIG1hY3JvcyBlbmFibGVkPyAqLwotc3RhdGljIGludCBhbHBoYV9tYWNyb3Nfb24gPSAxOwotCi0vKiBBcmUgZmxvYXRzIGRpc2FibGVkPyAqLwotc3RhdGljIGludCBhbHBoYV9ub2Zsb2F0c19vbiA9IDA7Ci0KLS8qIEFyZSBhZGRyZXNzZXMgMzIgYml0PyAqLwotc3RhdGljIGludCBhbHBoYV9hZGRyMzJfb24gPSAwOwotCi0vKiBTeW1ib2wgbGFiZWxsaW5nIHRoZSBjdXJyZW50IGluc24uICBXaGVuIHRoZSBBbHBoYSBnYXMgc2VlcwotICAgICBmb286Ci0gICAgICAgLnF1YWQgMAotICAgYW5kIHRoZSBzZWN0aW9uIGhhcHBlbnMgdG8gbm90IGJlIG9uIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnksIGl0Ci0gICB3aWxsIGFsaWduIGJvdGggdGhlIHN5bWJvbCBhbmQgdGhlIC5xdWFkIHRvIGFuIGVpZ2h0IGJ5dGUgYm91bmRhcnkuICAqLwotc3RhdGljIHN5bWJvbFMgKmFscGhhX2luc25fbGFiZWw7Ci0KLS8qIFdoZXRoZXIgd2Ugc2hvdWxkIGF1dG9tYXRpY2FsbHkgYWxpZ24gZGF0YSBnZW5lcmF0aW9uIHBzZXVkby1vcHMuCi0gICAuYWxpZ24gMCB3aWxsIHR1cm4gdGhpcyBvZmYuICAqLwotc3RhdGljIGludCBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLQotLyogVGhlIGtub3duIGN1cnJlbnQgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50IHNlY3Rpb24uICAqLwotc3RhdGljIGludCBhbHBoYV9jdXJyZW50X2FsaWduOwotCi0vKiBUaGVzZSBhcmUgZXhwb3J0ZWQgdG8gRUNPRkYgY29kZS4gICovCi11bnNpZ25lZCBsb25nIGFscGhhX2dwcm1hc2ssIGFscGhhX2Zwcm1hc2s7Ci0KLS8qIFdoZXRoZXIgdGhlIGRlYnVnZ2luZyBvcHRpb24gd2FzIHNlZW4uICAqLwotc3RhdGljIGludCBhbHBoYV9kZWJ1ZzsKLQotI2lmZGVmIE9CSl9FTEYKLS8qIFdoZXRoZXIgd2UgYXJlIGVtaXR0aW5nIGFuIG1kZWJ1ZyBzZWN0aW9uLiAgKi8KLWludCBhbHBoYV9mbGFnX21kZWJ1ZyA9IDE7Ci0jZW5kaWYKLQotLyogRG9uJ3QgZnVsbHkgcmVzb2x2ZSByZWxvY2F0aW9ucywgYWxsb3dpbmcgY29kZSBtb3ZlbWVudCBpbiB0aGUgbGlua2VyLiAgKi8KLXN0YXRpYyBpbnQgYWxwaGFfZmxhZ19yZWxheDsKLQotLyogV2hhdCB2YWx1ZSB0byBnaXZlIHRvIGJmZF9zZXRfZ3Bfc2l6ZS4gICovCi1zdGF0aWMgaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKLQotI2lmZGVmIE9CSl9FVkFYCi0vKiBDb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGN1cnJlbnQgcHJvY2VkdXJlIGhlcmUuICAqLwotc3RhdGljIHN0cnVjdCB7Ci0gIHN5bWJvbFMgKnN5bWJvbDsJLyogcHJvYyBwZGVzYyBzeW1ib2wgKi8KLSAgaW50IHBkc2NraW5kOwotICBpbnQgZnJhbWVyZWc7CQkvKiByZWdpc3RlciBmb3IgZnJhbWUgcG9pbnRlciAqLwotICBpbnQgZnJhbWVzaXplOwkvKiBzaXplIG9mIGZyYW1lICovCi0gIGludCByc2Ffb2Zmc2V0OwotICBpbnQgcmFfc2F2ZTsKLSAgaW50IGZwX3NhdmU7Ci0gIGxvbmcgaW1hc2s7Ci0gIGxvbmcgZm1hc2s7Ci0gIGludCB0eXBlOwotICBpbnQgcHJvbG9ndWU7Ci19IGFscGhhX2V2YXhfcHJvYzsKLQotc3RhdGljIGludCBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDA7CQkvKiAtKyAqLwotc3RhdGljIGludCBhbHBoYV9mbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMgPSAwOwkJLyogLUggKi8KLQotLyogSWYgdGhlIC0rIHN3aXRjaCBpcyBnaXZlbiwgdGhlbiBhIGhhc2ggaXMgYXBwZW5kZWQgdG8gYW55IG5hbWUgdGhhdCBpcwotICogbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVycywgZWxzZSBsb25nZXIgc3ltYm9sIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCi0gKi8KLQotI2VuZGlmCi0MCi0vKiBBIHRhYmxlIG9mIENQVSBuYW1lcyBhbmQgb3Bjb2RlIHNldHMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNwdV90eXBlCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGZsYWdzOwotfSBjcHVfdHlwZXNbXSA9Ci17Ci0gIC8qIEFkIGhvYyBjb252ZW50aW9uOiBjcHUgbnVtYmVyIGdldHMgcGFsY29kZSwgcHJvY2VzcyBjb2RlIGRvZXNuJ3QuCi0gICAgIFRoaXMgc3VwcG9ydHMgdXNhZ2UgdW5kZXIgRFUgNC4wYiB0aGF0IGRvZXMgIi5hcmNoIGV2NCIsIGFuZCAKLSAgICAgdXNhZ2UgaW4gTUlMTyB0aGF0IGRvZXMgLW0yMTA2NC4gIFByb2JhYmx5IHNvbWV0aGluZyBtb3JlCi0gICAgIHNwZWNpZmljIGxpa2UgLW0yMTA2NC1wYWwgc2hvdWxkIGJlIHVzZWQsIGJ1dCBvaCB3ZWxsLiAgKi8KLQotICB7ICIyMTA2NCIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0VWNCB9LAotICB7ICIyMTA2NGEiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjYiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjEwNjgiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjQgfSwKLSAgeyAiMjExNjQiLCBBWFBfT1BDT0RFX0JBU0V8QVhQX09QQ09ERV9FVjUgfSwKLSAgeyAiMjExNjRhIiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYIH0sCi0gIHsgIjIxMTY0cGMiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfQldYCi0JCXxBWFBfT1BDT0RFX01BWCkgfSwKLSAgeyAiMjEyNjQiLCAoQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfRVY2fEFYUF9PUENPREVfQldYCi0JICAgICAgfEFYUF9PUENPREVfTUFYfEFYUF9PUENPREVfQ0lYKSB9LAotCi0gIHsgImV2NCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImxjYTQ1IiwgQVhQX09QQ09ERV9CQVNFIH0sCi0gIHsgImV2NSIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7ICJldjU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYIH0sCi0gIHsgInBjYTU2IiwgQVhQX09QQ09ERV9CQVNFfEFYUF9PUENPREVfQldYfEFYUF9PUENPREVfTUFYIH0sCi0gIHsgImV2NiIsIEFYUF9PUENPREVfQkFTRXxBWFBfT1BDT0RFX0JXWHxBWFBfT1BDT0RFX01BWHxBWFBfT1BDT0RFX0NJWCB9LAotCi0gIHsgImFsbCIsIEFYUF9PUENPREVfQkFTRSB9LAotICB7IDAgfQotfTsKLQotLyogVGhlIG1hY3JvIHRhYmxlICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gYWxwaGFfbWFjcm9zW10gPSB7Ci0vKiBMb2FkL1N0b3JlIG1hY3JvcyAqLwotICB7ICJsZGEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRhaCIsCWVtaXRfbGRhaCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRsIiwJZW1pdF9pcl9sb2FkLCAibGRsIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRsX2wiLAllbWl0X2lyX2xvYWQsICJsZGxfbCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcSIsCWVtaXRfaXJfbG9hZCwgImxkcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkcV9sIiwJZW1pdF9pcl9sb2FkLCAibGRxX2wiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHFfdSIsCWVtaXRfaXJfbG9hZCwgImxkcV91IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRmIiwJZW1pdF9sb2Fkc3RvcmUsICJsZGYiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkZyIsCWVtaXRfbG9hZHN0b3JlLCAibGRnIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHMiLAllbWl0X2xvYWRzdG9yZSwgImxkcyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGR0IiwJZW1pdF9sb2Fkc3RvcmUsICJsZHQiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAibGRiIiwJZW1pdF9sZFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRidSIsCWVtaXRfbGRYdSwgKFBUUikwLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHciLAllbWl0X2xkWCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZHd1IiwJZW1pdF9sZFh1LCAoUFRSKTEsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAidWxkdyIsCWVtaXRfdWxkWCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGR3dSIsCWVtaXRfdWxkWHUsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkbCIsCWVtaXRfdWxkWCwgKFBUUikyLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1bGRsdSIsCWVtaXRfdWxkWHUsIChQVFIpMiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidWxkcSIsCWVtaXRfdWxkWHUsIChQVFIpMywKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLQotICB7ICJsZGdwIiwJZW1pdF9sZGdwLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EgfSB9LAotCi0gIHsgImxkaSIsCWVtaXRfbGRhLCBOVUxMLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpbCIsCWVtaXRfbGRpbCwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaXEiLAllbWl0X2xkYSwgTlVMTCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jaWYgMAotICB7ICJsZGlmIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpZCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImxkaWciCWVtaXRfbGRpcSwgTlVMTCwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJsZGlzIgllbWl0X2xkaXEsIE5VTEwsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAibGRpdCIJZW1pdF9sZGlxLCBOVUxMLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0jZW5kaWYKLQotICB7ICJzdGwiLAllbWl0X2xvYWRzdG9yZSwgInN0bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0bF9jIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGxfYyIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0cSIsCWVtaXRfbG9hZHN0b3JlLCAic3RxIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX2MiLAllbWl0X2xvYWRzdG9yZSwgInN0cV9jIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RxX3UiLAllbWl0X2xvYWRzdG9yZSwgInN0cV91IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3RmIiwJZW1pdF9sb2Fkc3RvcmUsICJzdGYiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInN0ZyIsCWVtaXRfbG9hZHN0b3JlLCAic3RnIiwKLSAgICB7IE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0ZQUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJzdHMiLAllbWl0X2xvYWRzdG9yZSwgInN0cyIsCi0gICAgeyBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19GUFIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3R0IiwJZW1pdF9sb2Fkc3RvcmUsICJzdHQiLAotICAgIHsgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRlBSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0KLSAgeyAic3RiIiwJZW1pdF9zdFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAic3R3IiwJZW1pdF9zdFgsIChQVFIpMSwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLSAgeyAidXN0dyIsCWVtaXRfdXN0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJ1c3RsIiwJZW1pdF91c3RYLCAoUFRSKTIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19QSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInVzdHEiLAllbWl0X3VzdFgsIChQVFIpMywKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BIH0gfSwKLQotLyogQXJpdGhtZXRpYyBtYWNyb3MgKi8KLSNpZiAwCi0gIHsgImFic2wiCWVtaXRfYWJzbCwgMSwgeyBJUiB9IH0sCi0gIHsgImFic2wiCWVtaXRfYWJzbCwgMiwgeyBJUiwgSVIgfSB9LAotICB7ICJhYnNsIgllbWl0X2Fic2wsIDIsIHsgRVhQLCBJUiB9IH0sCi0gIHsgImFic3EiCWVtaXRfYWJzcSwgMSwgeyBJUiB9IH0sCi0gIHsgImFic3EiCWVtaXRfYWJzcSwgMiwgeyBJUiwgSVIgfSB9LAotICB7ICJhYnNxIgllbWl0X2Fic3EsIDIsIHsgRVhQLCBJUiB9IH0sCi0jZW5kaWYKLQotICB7ICJzZXh0YiIsCWVtaXRfc2V4dFgsIChQVFIpMCwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgInNleHR3IiwJZW1pdF9zZXh0WCwgKFBUUikxLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BICovIH0gfSwKLQotICB7ICJkaXZsIiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2bCIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJkaXZsdSIsCWVtaXRfZGl2aXNpb24sICJfX2Rpdmx1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgImRpdnEiLAllbWl0X2RpdmlzaW9uLCAiX19kaXZxIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0gIHsgImRpdnF1IiwJZW1pdF9kaXZpc2lvbiwgIl9fZGl2cXUiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtbCIsCWVtaXRfZGl2aXNpb24sICJfX3JlbWwiLAotICAgIHsgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICAvKiBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BICovIH0gfSwKLSAgeyAicmVtbHUiLAllbWl0X2RpdmlzaW9uLCAiX19yZW1sdSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJyZW1xIiwJZW1pdF9kaXZpc2lvbiwgIl9fcmVtcSIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIC8qIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EgKi8gfSB9LAotICB7ICJyZW1xdSIsCWVtaXRfZGl2aXNpb24sICJfX3JlbXF1IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgLyogTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fSVIsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSAqLyB9IH0sCi0KLSAgeyAianNyIiwJZW1pdF9qc3JqbXAsICJqc3IiLAotICAgIHsgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EgfSB9LAotICB7ICJqbXAiLAllbWl0X2pzcmptcCwgImptcCIsCi0gICAgeyBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSB9IH0sCi0gIHsgInJldCIsCWVtaXRfcmV0amNyLCAicmV0IiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImpjciIsCWVtaXRfcmV0amNyLCAiamNyIiwKLSAgICB7IE1BQ1JPX0lSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0lSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19QSVIsIE1BQ1JPX0VYUCwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX0VPQSB9IH0sCi0gIHsgImpzcl9jb3JvdXRpbmUiLAllbWl0X3JldGpjciwgImpjciIsCi0gICAgeyBNQUNST19JUiwgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19JUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fUElSLCBNQUNST19FWFAsIE1BQ1JPX0VPQSwKLSAgICAgIE1BQ1JPX1BJUiwgTUFDUk9fRU9BLAotICAgICAgTUFDUk9fRVhQLCBNQUNST19FT0EsCi0gICAgICBNQUNST19FT0EgfSB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludCBhbHBoYV9udW1fbWFjcm9zCi0gID0gc2l6ZW9mKGFscGhhX21hY3JvcykgLyBzaXplb2YoKmFscGhhX21hY3Jvcyk7Ci0MCi0vKiBQdWJsaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2V0cwotICAgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwKLSAgIG5lZWQsIHRoYXQgY2FuIGJlIGRldGVybWluZWQgYmVmb3JlIGFyZ3VtZW50cyBhcmUgcGFyc2VkLiAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogVmVyaWZ5IHRoYXQgWF9vcCBmaWVsZCBpcyB3aWRlIGVub3VnaC4gICovCi0gIHsKLSAgICBleHByZXNzaW9uUyBlOwotICAgIGUuWF9vcCA9IE9fYWxwaGFfbWF4OwotICAgIGFzc2VydCAoZS5YX29wID09IE9fYWxwaGFfbWF4KTsKLSAgfQotCi0gIC8qIENyZWF0ZSB0aGUgb3Bjb2RlIGhhc2ggdGFibGUgKi8KLQotICBhbHBoYV9vcGNvZGVfaGFzaCA9IGhhc2hfbmV3ICgpOwotICBmb3IgKGkgPSAwOyBpIDwgYWxwaGFfbnVtX29wY29kZXM7ICkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lLCAqcmV0dmFsLCAqc2xhc2g7Ci0KLSAgICAgIG5hbWUgPSBhbHBoYV9vcGNvZGVzW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG5hbWUsIChQVFIpJmFscGhhX29wY29kZXNbaV0pOwotICAgICAgaWYgKHJldHZhbCkKLQlhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggb3Bjb2RlIGAlcyc6ICVzIiksIG5hbWUsIHJldHZhbCk7Ci0KLSAgICAgIC8qIFNvbWUgb3Bjb2RlcyBpbmNsdWRlIG1vZGlmaWVycyBvZiB2YXJpb3VzIHNvcnRzIHdpdGggYSAiL21vZCIKLQkgc3ludGF4LCBsaWtlIHRoZSBhcmNoaXRlY3R1cmUgbWFudWFsIHN1Z2dlc3RzLiAgSG93ZXZlciwgZm9yCi0JIHVzZSB3aXRoIGdjYyBhdCBsZWFzdCwgd2UgYWxzbyBuZWVkIGFjY2VzcyB0byB0aG9zZSBzYW1lIG9wY29kZXMKLQkgd2l0aG91dCB0aGUgIi8iLiAgKi8KLQotICAgICAgaWYgKChzbGFzaCA9IHN0cmNociAobmFtZSwgJy8nKSkgIT0gTlVMTCkKLQl7Ci0JICBjaGFyICpwID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSk7Ci0JICBtZW1jcHkgKHAsIG5hbWUsIHNsYXNoIC0gbmFtZSk7Ci0JICBzdHJjcHkgKHAgKyAoc2xhc2ggLSBuYW1lKSwgc2xhc2ggKyAxKTsKLQotCSAgKHZvaWQpaGFzaF9pbnNlcnQoYWxwaGFfb3Bjb2RlX2hhc2gsIHAsIChQVFIpJmFscGhhX29wY29kZXNbaV0pOwotCSAgLyogSWdub3JlIGZhaWx1cmVzIC0tIHRoZSBvcGNvZGUgdGFibGUgZG9lcyBkdXBsaWNhdGUgc29tZQotCSAgICAgdmFyaWFudHMgaW4gZGlmZmVyZW50IGZvcm1zLCBsaWtlICJod19zdHEiIGFuZCAiaHdfc3QvcSIuICAqLwotCX0KLQotICAgICAgd2hpbGUgKCsraSA8IGFscGhhX251bV9vcGNvZGVzCi0JICAgICAmJiAoYWxwaGFfb3Bjb2Rlc1tpXS5uYW1lID09IG5hbWUKLQkJIHx8ICFzdHJjbXAgKGFscGhhX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpKQotCWNvbnRpbnVlOwotICAgIH0KLQotICAvKiBDcmVhdGUgdGhlIG1hY3JvIGhhc2ggdGFibGUgKi8KLQotICBhbHBoYV9tYWNyb19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBhbHBoYV9udW1fbWFjcm9zOyApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSwgKnJldHZhbDsKLQotICAgICAgbmFtZSA9IGFscGhhX21hY3Jvc1tpXS5uYW1lOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKGFscGhhX21hY3JvX2hhc2gsIG5hbWUsIChQVFIpJmFscGhhX21hY3Jvc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsKQotCWFzX2ZhdGFsIChfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBtYWNybyBgJXMnOiAlcyIpLCBuYW1lLCByZXR2YWwpOwotCi0gICAgICB3aGlsZSAoKytpIDwgYWxwaGFfbnVtX21hY3JvcwotCSAgICAgJiYgKGFscGhhX21hY3Jvc1tpXS5uYW1lID09IG5hbWUKLQkJIHx8ICFzdHJjbXAgKGFscGhhX21hY3Jvc1tpXS5uYW1lLCBuYW1lKSkpCi0JY29udGludWU7Ci0gICAgfQotCi0gIC8qIENvbnN0cnVjdCBzeW1ib2xzIGZvciBlYWNoIG9mIHRoZSByZWdpc3RlcnMgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICBjaGFyIG5hbWVbNF07Ci0gICAgICBzcHJpbnRmKG5hbWUsICIkJWQiLCBpKTsKLSAgICAgIGFscGhhX3JlZ2lzdGVyX3RhYmxlW2ldID0gc3ltYm9sX2NyZWF0ZShuYW1lLCByZWdfc2VjdGlvbiwgaSwKLQkJCQkJICAgICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0gIGZvciAoOyBpIDwgNjQ7ICsraSkKLSAgICB7Ci0gICAgICBjaGFyIG5hbWVbNV07Ci0gICAgICBzcHJpbnRmKG5hbWUsICIkZiVkIiwgaS0zMik7Ci0gICAgICBhbHBoYV9yZWdpc3Rlcl90YWJsZVtpXSA9IHN5bWJvbF9jcmVhdGUobmFtZSwgcmVnX3NlY3Rpb24sIGksCi0JCQkJCSAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgc3BlY2lhbCBzeW1ib2xzIGFuZCBzZWN0aW9ucyB3ZSdsbCBiZSB1c2luZyAqLwotCi0gIC8qIFNvIC5zYnNzIHdpbGwgZ2V0IHVzZWQgZm9yIHRpbnkgb2JqZWN0cy4gICovCi0gIGJmZF9zZXRfZ3Bfc2l6ZSAoc3Rkb3V0cHV0LCBnX3N3aXRjaF92YWx1ZSk7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXRhIiwgJmFscGhhX2xpdGFfc2VjdGlvbiwgJmFscGhhX2xpdGFfc3ltYm9sKTsKLQotICAvKiBGb3IgaGFuZGxpbmcgdGhlIEdQLCBjcmVhdGUgYSBzeW1ib2wgdGhhdCB3b24ndCBiZSBvdXRwdXQgaW4gdGhlCi0gICAgIHN5bWJvbCB0YWJsZS4gIFdlJ2xsIGVkaXQgaXQgb3V0IG9mIHJlbG9jcyBsYXRlci4gICovCi0gIGFscGhhX2dwX3N5bWJvbCA9IHN5bWJvbF9jcmVhdGUgKCI8R1AgdmFsdWU+IiwgYWxwaGFfbGl0YV9zZWN0aW9uLCAweDgwMDAsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VWQVgKLSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saW5rIiwgJmFscGhhX2xpbmtfc2VjdGlvbiwgJmFscGhhX2xpbmtfc3ltYm9sKTsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIHsKLSAgICAgIHNlZ1Qgc2VjID0gc3Vic2VnX25ldygiLm1kZWJ1ZyIsIChzdWJzZWdUKTApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzKHN0ZG91dHB1dCwgc2VjLCBTRUNfSEFTX0NPTlRFTlRTfFNFQ19SRUFET05MWSk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50KHN0ZG91dHB1dCwgc2VjLCAzKTsKLSAgICB9Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0gIHN1YnNlZ19zZXQodGV4dF9zZWN0aW9uLCAwKTsKLX0KLQotLyogVGhlIHB1YmxpYyBpbnRlcmZhY2UgdG8gdGhlIGluc3RydWN0aW9uIGFzc2VtYmxlci4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciBvcG5hbWVbMzJdOwkJCS8qIGN1cnJlbnQgbWF4aW11bSBpcyAxMyAqLwotICBleHByZXNzaW9uUyB0b2tbTUFYX0lOU05fQVJHU107Ci0gIGludCBudG9rLCBvcG5hbWVsZW4sIHRydW5jbGVuOwotCi0gIC8qIHNwbGl0IG9mZiB0aGUgb3Bjb2RlICovCi0gIG9wbmFtZWxlbiA9IHN0cnNwbiAoc3RyLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpfLzQ2OCIpOwotICB0cnVuY2xlbiA9IChvcG5hbWVsZW4gPCBzaXplb2YgKG9wbmFtZSkgLSAxCi0JICAgICAgPyBvcG5hbWVsZW4KLQkgICAgICA6IHNpemVvZiAob3BuYW1lKSAtIDEpOwotICBtZW1jcHkgKG9wbmFtZSwgc3RyLCB0cnVuY2xlbik7Ci0gIG9wbmFtZVt0cnVuY2xlbl0gPSAnXDAnOwotCi0gIC8qIHRva2VuaXplIHRoZSByZXN0IG9mIHRoZSBsaW5lICovCi0gIGlmICgobnRvayA9IHRva2VuaXplX2FyZ3VtZW50cyAoc3RyICsgb3BuYW1lbGVuLCB0b2ssIE1BWF9JTlNOX0FSR1MpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIGZpbmlzaCBpdCBvZmYgKi8KLSAgYXNzZW1ibGVfdG9rZW5zIChvcG5hbWUsIHRvaywgbnRvaywgYWxwaGFfbWFjcm9zX29uKTsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uJ3Mgc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICAqLwotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgc2l6ZSkKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50KHN0ZG91dHB1dCwgc2VnKTsKLSAgdmFsdWVUIG1hc2sgPSAoKHZhbHVlVCkxIDw8IGFsaWduKSAtIDE7Ci0KLSAgcmV0dXJuIChzaXplICsgbWFzaykgJiB+bWFzazsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWV4dGVybiBjaGFyICp2YXhfbWRfYXRvZiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgaW50ICopKTsKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICAgIC8qIFZBWCBmbG9hdHMgKi8KLSAgICBjYXNlICdHJzoKLSAgICAgIC8qIFZBWCBtZF9hdG9mIGRvZXNuJ3QgbGlrZSAiRyIgZm9yIHNvbWUgcmVhc29uLiAgKi8KLSAgICAgIHR5cGUgPSAnZyc7Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAnRCc6Ci0gICAgICByZXR1cm4gdmF4X21kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKTsKLQotICAgICAgLyogSUVFRSBmbG9hdHMgKi8KLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0KLSAgZm9yICh3b3JkUCA9IHdvcmRzICsgcHJlYyAtIDE7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUC0tKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRha2UgY2FyZSBvZiB0aGUgdGFyZ2V0LXNwZWNpZmljIGNvbW1hbmQtbGluZSBvcHRpb25zLiAgKi8KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdGJzoKLSAgICAgIGFscGhhX25vZmxvYXRzX29uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fMzJBRERSOgotICAgICAgYWxwaGFfYWRkcjMyX29uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICBhbHBoYV9kZWJ1ZyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgZ19zd2l0Y2hfdmFsdWUgPSBhdG9pKGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ20nOgotICAgICAgewotCWNvbnN0IHN0cnVjdCBjcHVfdHlwZSAqcDsKLQlmb3IgKHAgPSBjcHVfdHlwZXM7IHAtPm5hbWU7ICsrcCkKLQkgIGlmIChzdHJjbXAoYXJnLCBwLT5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgYWxwaGFfdGFyZ2V0X25hbWUgPSBwLT5uYW1lLCBhbHBoYV90YXJnZXQgPSBwLT5mbGFnczsKLQkgICAgICBnb3RvIGZvdW5kOwotCSAgICB9Ci0JYXNfd2FybihfKCJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciKSwgYXJnKTsKLSAgICAgIGZvdW5kOjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlICcrJzoJCQkvKiBGb3IgZysrLiAgSGFzaCBhbnkgbmFtZSA+IDYzIGNoYXJzIGxvbmcuICovCi0gICAgICBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgkJCS8qIFNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb24gKi8KLSAgICAgIGFscGhhX2ZsYWdfc2hvd19hZnRlcl90cnVuYyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2gnOgkJCS8qIGZvciBnbnUtYy92YXggY29tcGF0aWJpbGl0eS4gICovCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBPUFRJT05fUkVMQVg6Ci0gICAgICBhbHBoYV9mbGFnX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgT1BUSU9OX01ERUJVRzoKLSAgICAgIGFscGhhX2ZsYWdfbWRlYnVnID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX05PX01ERUJVRzoKLSAgICAgIGFscGhhX2ZsYWdfbWRlYnVnID0gMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0aGF0IHdlIGFjY2VwdC4gICovCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHV0cyhfKCJcCi1BbHBoYSBvcHRpb25zOlxuXAotLTMyYWRkcgkJCXRyZWF0IGFkZHJlc3NlcyBhcyAzMi1iaXQgdmFsdWVzXG5cCi0tRgkJCWxhY2sgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRcblwKLS1tZXY0IHwgLW1ldjQ1IHwgLW1ldjUgfCAtbWV2NTYgfCAtbXBjYTU2IHwgLW1ldjYgfCAtbWFsbFxuXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIEFscGhhIGFyY2hpdGVjdHVyZVxuXAotLW0yMTA2NCB8IC1tMjEwNjYgfCAtbTIxMTY0IHwgLW0yMTE2NGEgfCAtbTIxMTY0cGMgfCAtbTIxMjY0XG5cCi0JCQl0aGVzZSB2YXJpYW50cyBpbmNsdWRlIFBBTGNvZGUgb3Bjb2Rlc1xuIiksCi0Jc3RyZWFtKTsKLSNpZmRlZiBPQkpfRVZBWAotICBmcHV0cyAoXygiXAotVk1TIG9wdGlvbnM6XG5cCi0tKwkJCWhhc2ggZW5jb2RlIChkb24ndCB0cnVuY2F0ZSkgbmFtZXMgbG9uZ2VyIHRoYW4gNjQgY2hhcmFjdGVyc1xuXAotLUgJCQlzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG4iKSwKLQlzdHJlYW0pOwotI2VuZGlmCi19Ci0KLS8qIERlY2lkZSBmcm9tIHdoYXQgcG9pbnQgYSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvLAotICAgcmVsYXRpdmUgdG8gdGhlIHBjLXJlbGF0aXZlIGZpeHVwLiAgRXIsIHJlbGF0aXZlbHkgc3BlYWtpbmcuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICB2YWx1ZVQgYWRkciA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICAgIHJldHVybiBhZGRyOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGFkZHI7Ci0gICAgfQotfQotCi0vKiBBdHRlbXB0IHRvIHNpbXBsaWZ5IG9yIGV2ZW4gZWxpbWluYXRlIGEgZml4dXAuICBUaGUgcmV0dXJuIHZhbHVlIGlzCi0gICBpZ25vcmVkOyBwZXJoYXBzIGl0IHdhcyBvbmNlIG1lYW5pbmdmdWwsIGJ1dCBub3cgaXQgaXMgaGlzdG9yaWNhbC4KLSAgIFRvIGluZGljYXRlIHRoYXQgYSBmaXh1cCBoYXMgYmVlbiBlbGltaW5hdGVkLCBzZXQgZml4UC0+ZnhfZG9uZS4KLQotICAgRm9yIEVMRiwgaGVyZSBpdCBpcyB0aGF0IHdlIHRyYW5zZm9ybSB0aGUgR1BESVNQX0hJMTYgcmVsb2Mgd2UgdXNlZAotICAgaW50ZXJuYWxseSBpbnRvIHRoZSBHUERJU1AgcmVsb2MgdXNlZCBleHRlcm5hbGx5LiAgV2UgaGFkIHRvIGRvCi0gICB0aGlzIHNvIHRoYXQgd2UnZCBoYXZlIHRoZSBHUERJU1BfTE8xNiByZWxvYyBhcyBhIHRhZyB0byBjb21wdXRlCi0gICB0aGUgZGlzdGFuY2UgdG8gdGhlICJsZGEiIGluc3RydWN0aW9uIGZvciBzZXR0aW5nIHRoZSBhZGRlbmQgdG8KLSAgIEdQRElTUC4gICovCi0KLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWx1ZVApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWVQOwotewotICBjaGFyICogY29uc3QgZml4cG9zID0gZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICB2YWx1ZVQgdmFsdWUgPSAqdmFsdWVQOwotICB1bnNpZ25lZCBpbWFnZSwgc2l6ZTsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgICAvKiBUaGUgR1BESVNQIHJlbG9jYXRpb25zIGFyZSBwcm9jZXNzZWQgaW50ZXJuYWxseSB3aXRoIGEgc3ltYm9sCi0JIHJlZmVycmluZyB0byB0aGUgY3VycmVudCBmdW5jdGlvbjsgd2UgbmVlZCB0byBkcm9wIGluIGEgdmFsdWUKLQkgd2hpY2gsIHdoZW4gYWRkZWQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwKLQkgZ2l2ZXMgdGhlIGRlc2lyZWQgR1AuICAqLwotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OgotICAgICAgewotCWZpeFMgKm5leHQgPSBmaXhQLT5meF9uZXh0OwotCWFzc2VydCAobmV4dC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNik7Ci0KLQlmaXhQLT5meF9vZmZzZXQgPSAobmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIG5leHQtPmZ4X3doZXJlCi0JCQkgICAtIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSBmaXhQLT5meF93aGVyZSk7Ci0KLQl2YWx1ZSA9ICh2YWx1ZSAtIHNpZ25fZXh0ZW5kXzE2ICh2YWx1ZSkpID4+IDE2OwotICAgICAgfQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BTFBIQV9HUERJU1A7Ci0jZW5kaWYKLSAgICAgIGdvdG8gZG9fcmVsb2NfZ3A7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9HUERJU1BfTE8xNjoKLSAgICAgIHZhbHVlID0gc2lnbl9leHRlbmRfMTYgKHZhbHVlKTsKLSAgICAgIGZpeFAtPmZ4X29mZnNldCA9IDA7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0jZW5kaWYKLQotICAgIGRvX3JlbG9jX2dwOgotICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmIChmaXhQLT5meF9wY3JlbCkKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0gICAgICBzaXplID0gMjsKLSAgICAgIGdvdG8gZG9fcmVsb2NfeHg7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotICAgICAgc2l6ZSA9IDQ7Ci0gICAgICBnb3RvIGRvX3JlbG9jX3h4OwotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ182NF9QQ1JFTDsKLSAgICAgIHNpemUgPSA4OwotICAgIGRvX3JlbG9jX3h4OgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIHNpemUpOwotCSAgZ290byBkb25lOwotCX0KLSAgICAgIHJldHVybiAxOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICAgIGFzc2VydCAoZml4UC0+Znhfc3Vic3kgPT0gYWxwaGFfZ3Bfc3ltYm9sKTsKLSAgICAgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLSAgICAgIC8qIEZJWE1FOiBpbmhlcml0ZWQgdGhpcyBvYmxpdmlvdXNuZXNzIG9mIGB2YWx1ZScgLS0gd2h5PyAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhwb3MsIC1hbHBoYV9ncF92YWx1ZSwgNCk7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19HUFJFTDMyOgotICAgICAgcmV0dXJuIDE7Ci0jZW5kaWYKLQotICAgIGNhc2UgQkZEX1JFTE9DXzIzX1BDUkVMX1MyOgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQkgIGltYWdlID0gKGltYWdlICYgfjB4MUZGRkZGKSB8ICgodmFsdWUgPj4gMikgJiAweDFGRkZGRik7Ci0JICBnb3RvIHdyaXRlX2RvbmU7Ci0JfQotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+ZnhfYWRkc3kgPT0gMCkKLQl7Ci0JICBpbWFnZSA9IGJmZF9nZXRsMzIoZml4cG9zKTsKLQkgIGltYWdlID0gKGltYWdlICYgfjB4M0ZGRikgfCAoKHZhbHVlID4+IDIpICYgMHgzRkZGKTsKLQkgIGdvdG8gd3JpdGVfZG9uZTsKLQl9Ci0gICAgICByZXR1cm4gMTsKLQotI2lmZGVmIE9CSl9FQ09GRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw6Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHBvcywgdmFsdWUsIDIpOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgICByZXR1cm4gMTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FVkFYCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElOS0FHRToKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9DT0RFQUREUjoKLSAgICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgewotCWNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kOwotCi0JaWYgKChpbnQpZml4UC0+Znhfcl90eXBlID49IDApCi0JICBhc19mYXRhbCAoXygidW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeFAtPmZ4X3JfdHlwZSkpOwotCi0JYXNzZXJ0ICgtKGludClmaXhQLT5meF9yX3R5cGUgPCBhbHBoYV9udW1fb3BlcmFuZHMpOwotCW9wZXJhbmQgPSAmYWxwaGFfb3BlcmFuZHNbLShpbnQpZml4UC0+Znhfcl90eXBlXTsKLQotCS8qIFRoZSByZXN0IG9mIHRoZXNlIGZpeHVwcyBvbmx5IGV4aXN0IGludGVybmFsbHkgZHVyaW5nIHN5bWJvbAotCSAgIHJlc29sdXRpb24gYW5kIGhhdmUgbm8gcmVwcmVzZW50YXRpb24gaW4gdGhlIG9iamVjdCBmaWxlLgotCSAgIFRoZXJlZm9yZSB0aGV5IG11c3QgYmUgY29tcGxldGVseSByZXNvbHZlZCBhcyBjb25zdGFudHMuICAqLwotCi0JaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IDAKLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IGFic29sdXRlX3NlY3Rpb24pCi0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJub24tYWJzb2x1dGUgZXhwcmVzc2lvbiBpbiBjb25zdGFudCBmaWVsZCIpKTsKLQotCWltYWdlID0gYmZkX2dldGwzMihmaXhwb3MpOwotCWltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIChvZmZzZXRUKXZhbHVlLAotCQkJICAgICAgIGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUpOwotICAgICAgfQotICAgICAgZ290byB3cml0ZV9kb25lOwotICAgIH0KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gMCB8fCBmaXhQLT5meF9wY3JlbCAhPSAwKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgewotICAgICAgYXNfd2Fybl93aGVyZShmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgXygidHlwZSAlZCByZWxvYyBkb25lP1xuIiksIChpbnQpZml4UC0+Znhfcl90eXBlKTsKLSAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0KLXdyaXRlX2RvbmU6Ci0gIG1kX251bWJlcl90b19jaGFycyhmaXhwb3MsIGltYWdlLCA0KTsKLQotZG9uZToKLSAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKgotICogTG9vayBmb3IgYSByZWdpc3RlciBuYW1lIGluIHRoZSBnaXZlbiBzeW1ib2wuCi0gKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGlmICgqbmFtZSA9PSAnJCcpCi0gICAgewotICAgICAgaW50IGlzX2Zsb2F0ID0gMCwgbnVtOwotCi0gICAgICBzd2l0Y2ggKCorK25hbWUpCi0JewotCWNhc2UgJ2YnOgotCSAgaWYgKG5hbWVbMV0gPT0gJ3AnICYmIG5hbWVbMl0gPT0gJ1wwJykKLQkgICAgcmV0dXJuIGFscGhhX3JlZ2lzdGVyX3RhYmxlW0FYUF9SRUdfRlBdOwotCSAgaXNfZmxvYXQgPSAzMjsKLQkgIC8qIEZBTExUSFJVICovCi0KLQljYXNlICdyJzoKLQkgIGlmICghaXNkaWdpdCgqKytuYW1lKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBGQUxMVEhSVSAqLwotCi0JY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOgotCWNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkgIGlmIChuYW1lWzFdID09ICdcMCcpCi0JICAgIG51bSA9IG5hbWVbMF0gLSAnMCc7Ci0JICBlbHNlIGlmIChuYW1lWzBdICE9ICcwJyAmJiBpc2RpZ2l0KG5hbWVbMV0pICYmIG5hbWVbMl0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIG51bSA9IChuYW1lWzBdIC0gJzAnKSAqIDEwICsgbmFtZVsxXSAtICcwJzsKLQkgICAgICBpZiAobnVtID49IDMyKQotCQlicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICBicmVhazsKLQotCSAgaWYgKCFhbHBoYV9ub2F0X29uICYmIG51bSA9PSBBWFBfUkVHX0FUKQotCSAgICBhc193YXJuKF8oIlVzZWQgJGF0IHdpdGhvdXQgXCIuc2V0IG5vYXRcIiIpKTsKLQkgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtudW0gKyBpc19mbG9hdF07Ci0KLQljYXNlICdhJzoKLQkgIGlmIChuYW1lWzFdID09ICd0JyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoIWFscGhhX25vYXRfb24pCi0JCWFzX3dhcm4oXygiVXNlZCAkYXQgd2l0aG91dCBcIi5zZXQgbm9hdFwiIikpOwotCSAgICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVtBWFBfUkVHX0FUXTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdnJzoKLQkgIGlmIChuYW1lWzFdID09ICdwJyAmJiBuYW1lWzJdID09ICdcMCcpCi0JICAgIHJldHVybiBhbHBoYV9yZWdpc3Rlcl90YWJsZVthbHBoYV9ncF9yZWdpc3Rlcl07Ci0JICBicmVhazsKLQotCWNhc2UgJ3MnOgotCSAgaWYgKG5hbWVbMV0gPT0gJ3AnICYmIG5hbWVbMl0gPT0gJ1wwJykKLQkgICAgcmV0dXJuIGFscGhhX3JlZ2lzdGVyX3RhYmxlW0FYUF9SRUdfU1BdOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLS8qIEBAQCBNYWdpYyBFQ09GRiBiaXRzLiAgKi8KLQotdm9pZAotYWxwaGFfZnJvYl9lY29mZl9kYXRhICgpCi17Ci0gIHNlbGVjdF9ncF92YWx1ZSAoKTsKLSAgLyogJHplcm8gYW5kICRmMzEgYXJlIHJlYWQtb25seSAqLwotICBhbHBoYV9ncHJtYXNrICY9IH4xOwotICBhbHBoYV9mcHJtYXNrICY9IH4xOwotfQotI2VuZGlmCi0KLS8qIEhvb2sgdG8gcmVtZW1iZXIgYSByZWNlbnRseSBkZWZpbmVkIGxhYmVsIHNvIHRoYXQgdGhlIGF1dG8tYWxpZ24KLSAgIGNvZGUgY2FuIGFkanVzdCB0aGUgc3ltYm9sIGFmdGVyIHdlIGtub3cgd2hhdCBhbGlnbm1lbnQgd2lsbCBiZQotICAgcmVxdWlyZWQuICAqLwotCi12b2lkCi1hbHBoYV9kZWZpbmVfbGFiZWwgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBhbHBoYV9pbnNuX2xhYmVsID0gc3ltOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBtdXN0IGFsd2F5cyBlbWl0IGEgcmVsb2MgZm9yIGEgdHlwZSBhbmQgZmFsc2UgaWYKLSAgIHRoZXJlIGlzIHNvbWUgaG9wZSBvZiByZXNvbHZpbmcgaXQgYSBhc3NlbWJseSB0aW1lLiAgKi8KLQotaW50Ci1hbHBoYV9mb3JjZV9yZWxvY2F0aW9uIChmKQotICAgICBmaXhTICpmOwotewotICBpZiAoYWxwaGFfZmxhZ19yZWxheCkKLSAgICByZXR1cm4gMTsKLQotICBzd2l0Y2ggKGYtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQOgotI2lmZGVmIE9CSl9FQ09GRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUw6Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw6Ci0jZW5kaWYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U6Ci0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSNpZmRlZiBPQkpfRVZBWAotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJTktBR0U6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfQ09ERUFERFI6Ci0jZW5kaWYKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMjNfUENSRUxfUzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfSElOVDoKLSAgICAgIHJldHVybiAwOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydCgoaW50KWYtPmZ4X3JfdHlwZSA8IDAgJiYgLShpbnQpZi0+Znhfcl90eXBlIDwgYWxwaGFfbnVtX29wZXJhbmRzKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotLyogUmV0dXJuIHRydWUgaWYgd2UgY2FuIHBhcnRpYWxseSByZXNvbHZlIGEgcmVsb2NhdGlvbiBub3cuICAqLwotCi1pbnQKLWFscGhhX2ZpeF9hZGp1c3RhYmxlIChmKQotICAgICBmaXhTICpmOwotewotI2lmZGVmIE9CSl9FTEYKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMgKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmLT5meF9hZGRzeSkgfHwgU19JU19XRUFLIChmLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0jZW5kaWYKLQotICAvKiBBcmUgdGhlcmUgYW55IHJlbG9jYXRpb24gdHlwZXMgZm9yIHdoaWNoIHdlIG11c3QgZ2VuZXJhdGUgYSByZWxvYwotICAgICBidXQgd2UgY2FuIGFkanVzdCB0aGUgdmFsdWVzIGNvbnRhaW5lZCB3aXRoaW4gaXQ/ICAqLwotICBzd2l0Y2ggKGYtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQOgotICAgICAgcmV0dXJuIDA7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOgotI2VuZGlmCi0jaWZkZWYgT0JKX0VWQVgKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFOgotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSOgotI2VuZGlmCi0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FMUEhBX0xJVFVTRToKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfR1BSRUwzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18yM19QQ1JFTF9TMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ182NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BTFBIQV9ISU5UOgotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0ICgoaW50KWYtPmZ4X3JfdHlwZSA8IDAKLQkgICAgICAmJiAtIChpbnQpZi0+Znhfcl90eXBlIDwgYWxwaGFfbnVtX29wZXJhbmRzKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogR2VuZXJhdGUgdGhlIEJGRCByZWxvYyB0byBiZSBzdHVjayBpbiB0aGUgb2JqZWN0IGZpbGUgZnJvbSB0aGUKLSAgIGZpeHVwIHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgYXNzZW1ibGVyLiAgKi8KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlYywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAvKiBNYWtlIHN1cmUgbm9uZSBvZiBvdXIgaW50ZXJuYWwgcmVsb2NhdGlvbnMgbWFrZSBpdCB0aGlzIGZhci4KLSAgICAgVGhleSdkIGJldHRlciBoYXZlIGJlZW4gZnVsbHkgcmVzb2x2ZWQgYnkgdGhpcyBwb2ludC4gICovCi0gIGFzc2VydCAoKGludClmaXhwLT5meF9yX3R5cGUgPiAwKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oImNhbm5vdCByZXByZXNlbnQgYCVzJyByZWxvY2F0aW9uIGluIG9iamVjdCBmaWxlIiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4cC0+Znhfcl90eXBlKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKCFmaXhwLT5meF9wY3JlbCAhPSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgZXJyb3I/IGNhbm5vdCBnZW5lcmF0ZSBgJXMnIHJlbG9jYXRpb24iKSwKLQkJYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotICAgIH0KLSAgYXNzZXJ0ICghZml4cC0+ZnhfcGNyZWwgPT0gIXJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FMUEhBX0xJVEVSQUwpCi0gICAgewotICAgICAgLyogZmFrZSBvdXQgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbi4gc2lnaCAqLwotICAgICAgcmVsb2MtPmFkZGVuZCA9IC1hbHBoYV9ncF92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyoKLSAgICAgICAqIE9oaGgsIHRoaXMgaXMgdWdseS4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgaWYgdGhpcyBpcyBhIGxvY2FsIGdsb2JhbAotICAgICAgICogc3ltYm9sLCB0aGUgcmVsb2NhdGlvbiB3aWxsIGVudGlyZWx5IGJlIHBlcmZvcm1lZCBhdCBsaW5rIHRpbWUsIG5vdAotICAgICAgICogYXQgYXNzZW1ibHkgdGltZS4gIGJmZF9wZXJmb3JtX3JlbG9jIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIHNvcnQKLSAgICAgICAqIG9mIHRoaW5nLCBhbmQgYXMgYSByZXN1bHQgd2UgbmVlZCB0byBmYWtlIGl0IG91dCBoZXJlLgotICAgICAgICovCi0gICAgICBpZiAoKFNfSVNfRVhURVJOIChmaXhwLT5meF9hZGRzeSkgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCi0JICAmJiAhU19JU19DT01NT04oZml4cC0+ZnhfYWRkc3kpKQotCXJlbG9jLT5hZGRlbmQgLT0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KS0+dmFsdWU7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi0vKiBQYXJzZSBhIHJlZ2lzdGVyIG5hbWUgb2ZmIG9mIHRoZSBpbnB1dF9saW5lIGFuZCByZXR1cm4gYSByZWdpc3RlcgotICAgbnVtYmVyLiAgR2V0cyBtZF91bmRlZmluZWRfc3ltYm9sIGFib3ZlIHRvIGRvIHRoZSByZWdpc3RlciBuYW1lCi0gICBtYXRjaGluZyBmb3IgdXMuCi0KLSAgIE9ubHkgY2FsbGVkIGFzIGEgcGFydCBvZiBwcm9jZXNzaW5nIHRoZSBFQ09GRiAuZnJhbWUgZGlyZWN0aXZlLiAgKi8KLQotaW50Ci10Y19nZXRfcmVnaXN0ZXIgKGZyYW1lKQotICAgICBpbnQgZnJhbWU7Ci17Ci0gIGludCBmcmFtZXJlZyA9IEFYUF9SRUdfU1A7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCi0gICAgewotICAgICAgY2hhciAqcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgc3ltYm9sUyAqc3ltID0gbWRfdW5kZWZpbmVkX3N5bWJvbCAocyk7Ci0KLSAgICAgICpzdHJjaHIocywgJ1wwJykgPSBjOwotICAgICAgaWYgKHN5bSAmJiAoZnJhbWVyZWcgPSBTX0dFVF9WQUxVRSAoc3ltKSkgPD0gMzEpCi0JZ290byBmb3VuZDsKLSAgICB9Ci0gIGFzX3dhcm4gKF8oImZyYW1lIHJlZyBleHBlY3RlZCwgdXNpbmcgJCVkLiIpLCBmcmFtZXJlZyk7Ci0KLWZvdW5kOgotICBub3RlX2dwcmVnIChmcmFtZXJlZyk7Ci0gIHJldHVybiBmcmFtZXJlZzsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUgaXMgcHJvY2Vzc2VkLiAgSW4gb3JkZXIgdG8KLSAgIHdvcmsgd2l0aCBnY2Mgd2hlbiB1c2luZyBtaXBzLXRmaWxlLCB3ZSBtdXN0IGtlZXAgYWxsIGxvY2FsIGxhYmVscy4KLSAgIEhvd2V2ZXIsIGluIG90aGVyIGNhc2VzLCB3ZSB3YW50IHRvIGRpc2NhcmQgdGhlbS4gIElmIHdlIHdlcmUKLSAgIGNhbGxlZCB3aXRoIC1nLCBidXQgd2UgZGlkbid0IHNlZSBhbnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBpdCBtYXkKLSAgIG1lYW4gdGhhdCBnY2MgaXMgc211Z2dsaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0aHJvdWdoIHRvCi0gICBtaXBzLXRmaWxlLCBpbiB3aGljaCBjYXNlIHdlIG11c3QgZ2VuZXJhdGUgYWxsIGxvY2FsIGxhYmVscy4gICovCi0KLSNpZmRlZiBPQkpfRUNPRkYKLQotdm9pZAotYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCkKLXsKLSAgaWYgKGFscGhhX2RlYnVnICE9IDAKLSAgICAgICYmICEgZWNvZmZfZGVidWdnaW5nX3NlZW4pCi0gICAgZmxhZ19rZWVwX2xvY2FscyA9IDE7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRUNPRkYgKi8KLQwKLS8qIFBhcnNlIHRoZSBhcmd1bWVudHMgdG8gYW4gb3Bjb2RlLiAgKi8KLQotc3RhdGljIGludAotdG9rZW5pemVfYXJndW1lbnRzIChzdHIsIHRvaywgbnRvaykKLSAgICAgY2hhciAqc3RyOwotICAgICBleHByZXNzaW9uUyB0b2tbXTsKLSAgICAgaW50IG50b2s7Ci17Ci0gIGV4cHJlc3Npb25TICplbmRfdG9rID0gdG9rICsgbnRvazsKLSAgY2hhciAqb2xkX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IHNhd19jb21tYSA9IDAsIHNhd19hcmcgPSAwOwotCi0gIG1lbXNldCAodG9rLCAwLCBzaXplb2YgKCp0b2spICogbnRvayk7Ci0KLSAgLyogU2F2ZSBhbmQgcmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgYXJvdW5kIHRoaXMgZnVuY3Rpb24gKi8KLSAgb2xkX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIHdoaWxlICh0b2sgPCBlbmRfdG9rICYmICppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCXsKLQljYXNlICdcMCc6Ci0JICBnb3RvIGZpbmk7Ci0KLQljYXNlICcsJzoKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgaWYgKHNhd19jb21tYSB8fCAhc2F3X2FyZykKLQkgICAgZ290byBlcnI7Ci0JICBzYXdfY29tbWEgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICcoJzoKLQkgIHsKLQkgICAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0JICAgIC8qIEZpcnN0IHRyeSBmb3IgcGFyZW50aGVzaXplZCByZWdpc3RlciAuLi4gKi8KLQkgICAgZXhwcmVzc2lvbiAodG9rKTsKLQkgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyknICYmIHRvay0+WF9vcCA9PSBPX3JlZ2lzdGVyKQotCSAgICAgIHsKLQkJdG9rLT5YX29wID0gKHNhd19jb21tYSA/IE9fY3ByZWdpc3RlciA6IE9fcHJlZ2lzdGVyKTsKLQkJc2F3X2NvbW1hID0gMDsKLQkJc2F3X2FyZyA9IDE7Ci0JCSsraW5wdXRfbGluZV9wb2ludGVyOwotCQkrK3RvazsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIC8qIC4uLiB0aGVuIGZhbGwgdGhyb3VnaCB0byBwbGFpbiBleHByZXNzaW9uICovCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICB9Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHNhd19hcmcgJiYgIXNhd19jb21tYSkKLQkgICAgZ290byBlcnI7Ci0JICBleHByZXNzaW9uICh0b2spOwotCSAgaWYgKHRvay0+WF9vcCA9PSBPX2lsbGVnYWwgfHwgdG9rLT5YX29wID09IE9fYWJzZW50KQotCSAgICBnb3RvIGVycjsKLQotCSAgc2F3X2NvbW1hID0gMDsKLQkgIHNhd19hcmcgPSAxOwotCSAgKyt0b2s7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi1maW5pOgotICBpZiAoc2F3X2NvbW1hKQotICAgIGdvdG8gZXJyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGRfaW5wdXRfbGluZV9wb2ludGVyOwotICByZXR1cm4gbnRvayAtIChlbmRfdG9rIC0gdG9rKTsKLQotZXJyOgotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGRfaW5wdXRfbGluZV9wb2ludGVyOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIFNlYXJjaCBmb3J3YXJkIHRocm91Z2ggYWxsIHZhcmlhbnRzIG9mIGFuIG9wY29kZSBsb29raW5nIGZvciBhCi0gICBzeW50YXggbWF0Y2guICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqCi1maW5kX29wY29kZV9tYXRjaChmaXJzdF9vcGNvZGUsIHRvaywgcG50b2ssIHBjcHVtYXRjaCkKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqZmlyc3Rfb3Bjb2RlOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgKnBudG9rOwotICAgICBpbnQgKnBjcHVtYXRjaDsKLXsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlID0gZmlyc3Rfb3Bjb2RlOwotICBpbnQgbnRvayA9ICpwbnRvazsKLSAgaW50IGdvdF9jcHVfbWF0Y2ggPSAwOwotCi0gIGRvCi0gICAgewotICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpZHg7Ci0gICAgICBpbnQgdG9raWR4ID0gMDsKLQotICAgICAgLyogRG9uJ3QgbWF0Y2ggb3Bjb2RlcyB0aGF0IGRvbid0IGV4aXN0IG9uIHRoaXMgYXJjaGl0ZWN0dXJlICovCi0gICAgICBpZiAoIShvcGNvZGUtPmZsYWdzICYgYWxwaGFfdGFyZ2V0KSkKLQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQotICAgICAgZ290X2NwdV9tYXRjaCA9IDE7Ci0KLSAgICAgIGZvciAob3BpZHggPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpZHg7ICsrb3BpZHgpCi0JewotCSAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSAmYWxwaGFfb3BlcmFuZHNbKm9waWR4XTsKLQotCSAgLyogb25seSB0YWtlIGlucHV0IGZyb20gcmVhbCBvcGVyYW5kcyAqLwotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfRkFLRSkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIHdoZW4gd2UgZXhwZWN0IGlucHV0LCBtYWtlIHN1cmUgd2UgaGF2ZSBpdCAqLwotCSAgaWYgKHRva2lkeCA+PSBudG9rKQotCSAgICB7Ci0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX09QVElPTkFMX01BU0spID09IDApCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIG1hdGNoIG9wZXJhbmQgdHlwZSB3aXRoIGV4cHJlc3Npb24gdHlwZSAqLwotCSAgc3dpdGNoIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1RZUEVDSEVDS19NQVNLKQotCSAgICB7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfSVI6Ci0JICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgotCQkgIHx8ICFpc19pcl9udW0odG9rW3Rva2lkeF0uWF9hZGRfbnVtYmVyKSkKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfRlBSOgotCSAgICAgIGlmICh0b2tbdG9raWR4XS5YX29wICE9IE9fcmVnaXN0ZXIKLQkJICB8fCAhaXNfZnByX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9JUnxBWFBfT1BFUkFORF9QQVJFTlM6Ci0JICAgICAgaWYgKHRva1t0b2tpZHhdLlhfb3AgIT0gT19wcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOU3xBWFBfT1BFUkFORF9DT01NQToKLQkgICAgICBpZiAodG9rW3Rva2lkeF0uWF9vcCAhPSBPX2NwcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQVhQX09QRVJBTkRfUkVMQVRJVkU6Ci0JICAgIGNhc2UgQVhQX09QRVJBTkRfU0lHTkVEOgotCSAgICBjYXNlIEFYUF9PUEVSQU5EX1VOU0lHTkVEOgotCSAgICAgIHN3aXRjaCAodG9rW3Rva2lkeF0uWF9vcCkKLQkJewotCQljYXNlIE9faWxsZWdhbDoKLQkJY2FzZSBPX2Fic2VudDoKLQkJY2FzZSBPX3JlZ2lzdGVyOgotCQljYXNlIE9fcHJlZ2lzdGVyOgotCQljYXNlIE9fY3ByZWdpc3RlcjoKLQkJICBnb3RvIG1hdGNoX2ZhaWxlZDsKLQotCQlkZWZhdWx0OgotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIGhhdmUgYmVlbiBmYWtlICovCi0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCSAgKyt0b2tpZHg7Ci0JfQotCi0gICAgICAvKiBwb3NzaWJsZSBtYXRjaCAtLSBkaWQgd2UgdXNlIGFsbCBvZiBvdXIgaW5wdXQ/ICovCi0gICAgICBpZiAodG9raWR4ID09IG50b2spCi0JewotCSAgKnBudG9rID0gbnRvazsKLQkgIHJldHVybiBvcGNvZGU7Ci0JfQotCi0gICAgbWF0Y2hfZmFpbGVkOjsKLSAgICB9Ci0gIHdoaWxlICgrK29wY29kZS1hbHBoYV9vcGNvZGVzIDwgYWxwaGFfbnVtX29wY29kZXMKLQkgJiYgIXN0cmNtcChvcGNvZGUtPm5hbWUsIGZpcnN0X29wY29kZS0+bmFtZSkpOwotCi0gIGlmICgqcGNwdW1hdGNoKQotICAgICAgKnBjcHVtYXRjaCA9IGdvdF9jcHVfbWF0Y2g7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNlYXJjaCBmb3J3YXJkIHRocm91Z2ggYWxsIHZhcmlhbnRzIG9mIGEgbWFjcm8gbG9va2luZyBmb3IgYSBzeW50YXgKLSAgIG1hdGNoLiAgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqCi1maW5kX21hY3JvX21hdGNoKGZpcnN0X21hY3JvLCB0b2ssIHBudG9rKQotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKmZpcnN0X21hY3JvOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgKnBudG9rOwotewotICBjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKm1hY3JvID0gZmlyc3RfbWFjcm87Ci0gIGludCBudG9rID0gKnBudG9rOwotCi0gIGRvCi0gICAgewotICAgICAgY29uc3QgZW51bSBhbHBoYV9tYWNyb19hcmcgKmFyZyA9IG1hY3JvLT5hcmdzZXRzOwotICAgICAgaW50IHRva2lkeCA9IDA7Ci0KLSAgICAgIHdoaWxlICgqYXJnKQotCXsKLQkgIHN3aXRjaCAoKmFyZykKLQkgICAgewotCSAgICBjYXNlIE1BQ1JPX0VPQToKLQkgICAgICBpZiAodG9raWR4ID09IG50b2spCi0JCXJldHVybiBtYWNybzsKLQkgICAgICBlbHNlCi0JCXRva2lkeCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBNQUNST19JUjoKLQkgICAgICBpZiAodG9raWR4ID49IG50b2sgfHwgdG9rW3Rva2lkeF0uWF9vcCAhPSBPX3JlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNQUNST19QSVI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19wcmVnaXN0ZXIKLQkJICB8fCAhaXNfaXJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1BQ1JPX0NQSVI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19jcHJlZ2lzdGVyCi0JCSAgfHwgIWlzX2lyX251bSh0b2tbdG9raWR4XS5YX2FkZF9udW1iZXIpKQotCQlnb3RvIG1hdGNoX2ZhaWxlZDsKLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNQUNST19GUFI6Ci0JICAgICAgaWYgKHRva2lkeCA+PSBudG9rIHx8IHRva1t0b2tpZHhdLlhfb3AgIT0gT19yZWdpc3RlcgotCQkgIHx8ICFpc19mcHJfbnVtKHRva1t0b2tpZHhdLlhfYWRkX251bWJlcikpCi0JCWdvdG8gbWF0Y2hfZmFpbGVkOwotCSAgICAgICsrdG9raWR4OwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgTUFDUk9fRVhQOgotCSAgICAgIGlmICh0b2tpZHggPj0gbnRvaykKLQkJZ290byBtYXRjaF9mYWlsZWQ7Ci0JICAgICAgc3dpdGNoICh0b2tbdG9raWR4XS5YX29wKQotCQl7Ci0JCWNhc2UgT19pbGxlZ2FsOgotCQljYXNlIE9fYWJzZW50OgotCQljYXNlIE9fcmVnaXN0ZXI6Ci0JCWNhc2UgT19wcmVnaXN0ZXI6Ci0JCWNhc2UgT19jcHJlZ2lzdGVyOgotCQkgIGdvdG8gbWF0Y2hfZmFpbGVkOwotCi0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICArK3Rva2lkeDsKLQkgICAgICBicmVhazsKLQotCSAgICBtYXRjaF9mYWlsZWQ6Ci0JICAgICAgd2hpbGUgKCphcmcgIT0gTUFDUk9fRU9BKQotCQkrK2FyZzsKLQkgICAgICB0b2tpZHggPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICArK2FyZzsKLQl9Ci0gICAgfQotICB3aGlsZSAoKyttYWNyby1hbHBoYV9tYWNyb3MgPCBhbHBoYV9udW1fbWFjcm9zCi0JICYmICFzdHJjbXAobWFjcm8tPm5hbWUsIGZpcnN0X21hY3JvLT5uYW1lKSk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9vcGVyYW5kKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMiAmJiAhKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfTk9PVkVSRkxPVykpCi0gICAgewotICAgICAgb2Zmc2V0VCBtaW4sIG1heDsKLQotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKQotCXsKLQkgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0oMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgbWluID0gMDsKLQl9Ci0KLSAgICAgIGlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQotCXsKLQkgIGNvbnN0IGNoYXIgKmVyciA9Ci0JICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlZCBhbmQgJWQpIik7Ci0JICBjaGFyIGJ1ZltzaXplb2YgKHZhbCkgKiAzICsgMl07Ci0KLQkgIHNwcmludF92YWx1ZShidWYsIHZhbCk7Ci0JICBpZiAoZmlsZSkKLQkgICAgYXNfd2Fybl93aGVyZShmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgZWxzZQotCSAgICBhc193YXJuKGVyciwgYnVmLCBtaW4sIG1heCk7Ci0JfQotICAgIH0KLQotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIGluc24gPSAoKm9wZXJhbmQtPmluc2VydCkgKGluc24sIHZhbCwgJmVycm1zZyk7Ci0gICAgICBpZiAoZXJybXNnKQotCWFzX3dhcm4gKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qCi0gKiBUdXJuIGFuIG9wY29kZSBkZXNjcmlwdGlvbiBhbmQgYSBzZXQgb2YgYXJndW1lbnRzIGludG8KLSAqIGFuIGluc3RydWN0aW9uIGFuZCBhIGZpeHVwLgotICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV9pbnNuKG9wY29kZSwgdG9rLCBudG9rLCBpbnNuKQotICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqYXJnaWR4OwotICB1bnNpZ25lZCBpbWFnZTsKLSAgaW50IHRva2lkeCA9IDA7Ci0KLSAgbWVtc2V0IChpbnNuLCAwLCBzaXplb2YgKCppbnNuKSk7Ci0gIGltYWdlID0gb3Bjb2RlLT5vcGNvZGU7Ci0KLSAgZm9yIChhcmdpZHggPSBvcGNvZGUtPm9wZXJhbmRzOyAqYXJnaWR4OyArK2FyZ2lkeCkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCAqb3BlcmFuZCA9ICZhbHBoYV9vcGVyYW5kc1sqYXJnaWR4XTsKLSAgICAgIGNvbnN0IGV4cHJlc3Npb25TICp0OwotCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GQUtFKQotCXsKLQkgIC8qIGZha2Ugb3BlcmFuZHMgdGFrZSBubyB2YWx1ZSBhbmQgZ2VuZXJhdGUgbm8gZml4dXAgKi8KLQkgIGltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIDAsIE5VTEwsIDApOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAodG9raWR4ID49IG50b2spCi0JewotCSAgc3dpdGNoIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX09QVElPTkFMX01BU0spCi0JICAgIHsKLQkgICAgY2FzZSBBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNUOgotCSAgICAgIHQgPSAmdG9rWzBdOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0RFRkFVTFRfU0VDT05EOgotCSAgICAgIHQgPSAmdG9rWzFdOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVSTzoKLQkgICAgICB7Ci0JCXN0YXRpYyBjb25zdCBleHByZXNzaW9uUyB6ZXJvX2V4cCA9IHsgMCwgMCwgMCwgT19jb25zdGFudCwgMSB9OwotCQl0ID0gJnplcm9fZXhwOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCgpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXQgPSAmdG9rW3Rva2lkeCsrXTsKLQotICAgICAgc3dpdGNoICh0LT5YX29wKQotCXsKLQljYXNlIE9fcmVnaXN0ZXI6Ci0JY2FzZSBPX3ByZWdpc3RlcjoKLQljYXNlIE9fY3ByZWdpc3RlcjoKLQkgIGltYWdlID0gaW5zZXJ0X29wZXJhbmQoaW1hZ2UsIG9wZXJhbmQsIHJlZ25vKHQtPlhfYWRkX251bWJlciksCi0JCQkJIE5VTEwsIDApOwotCSAgYnJlYWs7Ci0KLQljYXNlIE9fY29uc3RhbnQ6Ci0JICBpbWFnZSA9IGluc2VydF9vcGVyYW5kKGltYWdlLCBvcGVyYW5kLCB0LT5YX2FkZF9udW1iZXIsIE5VTEwsIDApOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgewotCSAgICBzdHJ1Y3QgYWxwaGFfZml4dXAgKmZpeHVwOwotCi0JICAgIGlmIChpbnNuLT5uZml4dXBzID49IE1BWF9JTlNOX0ZJWFVQUykKLQkgICAgICBhc19mYXRhbChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkgICAgZml4dXAgPSAmaW5zbi0+Zml4dXBzW2luc24tPm5maXh1cHMrK107Ci0KLQkgICAgZml4dXAtPmV4cCA9ICp0OwotCSAgICBmaXh1cC0+cmVsb2MgPSBvcGVyYW5kLT5kZWZhdWx0X3JlbG9jOwotCSAgfQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpbnNuLT5pbnNuID0gaW1hZ2U7Ci19Ci0KLS8qCi0gKiBBY3R1YWxseSBvdXRwdXQgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBpdHMgZml4dXAuCi0gKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfaW5zbiAoaW5zbikKLSAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY2hhciAqZjsKLSAgaW50IGk7Ci0KLSAgLyogVGFrZSBjYXJlIG9mIGFsaWdubWVudCBkdXRpZXMgKi8KLSAgaWYgKGFscGhhX2F1dG9fYWxpZ25fb24gJiYgYWxwaGFfY3VycmVudF9hbGlnbiA8IDIpCi0gICAgYWxwaGFfYWxpZ24gKDIsIChjaGFyICopIE5VTEwsIGFscGhhX2luc25fbGFiZWwsIDApOwotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+IDIpCi0gICAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDI7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBmID0gZnJhZ19tb3JlICg0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmLCBpbnNuLT5pbnNuLCA0KTsKLQotICAvKiBBcHBseSB0aGUgZml4dXBzIGluIG9yZGVyICovCi0gIGZvciAoaSA9IDA7IGkgPCBpbnNuLT5uZml4dXBzOyArK2kpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBzdHJ1Y3QgYWxwaGFfZml4dXAgKmZpeHVwID0gJmluc24tPmZpeHVwc1tpXTsKLSAgICAgIGludCBzaXplLCBwY3JlbDsKLSAgICAgIGZpeFMgKmZpeFA7Ci0KLSAgICAgIC8qIFNvbWUgZml4dXBzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBhbmQgc28gaGF2ZSBubyBob3d0byAqLwotICAgICAgaWYgKChpbnQpZml4dXAtPnJlbG9jIDwgMCkKLQl7Ci0JICBvcGVyYW5kID0gJmFscGhhX29wZXJhbmRzWy0oaW50KWZpeHVwLT5yZWxvY107Ci0JICBzaXplID0gNDsKLQkgIHBjcmVsID0gKChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1JFTEFUSVZFKSAhPSAwKTsKLQl9Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBhcmUgb25seSB1c2VkIGludGVybmFsbHkuICovCi0gICAgICBlbHNlIGlmIChmaXh1cC0+cmVsb2MgPT0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2Ci0JICAgICAgIHx8IGZpeHVwLT5yZWxvYyA9PSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTYpCi0JewotCSAgc2l6ZSA9IDIsIHBjcmVsID0gMDsKLQl9Ci0jZW5kaWYKLSAgICAgIGVsc2UKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0bwotCSAgICA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cC0+cmVsb2MpOwotCSAgYXNzZXJ0IChyZWxvY19ob3d0byk7Ci0KLQkgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQkgIHBjcmVsID0gcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlOwotCX0KLSAgICAgIGFzc2VydCAoc2l6ZSA+PSAxICYmIHNpemUgPD0gNCk7Ci0KLSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJCSAgJmZpeHVwLT5leHAsIHBjcmVsLCBmaXh1cC0+cmVsb2MpOwotCi0gICAgICAvKiBUdXJuIG9mZiBjb21wbGFpbnRzIHRoYXQgdGhlIGFkZGVuZCBpcyB0b28gbGFyZ2UgZm9yIHNvbWUgZml4dXBzICovCi0gICAgICBzd2l0Y2ggKGZpeHVwLT5yZWxvYykKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY6Ci0jaWZkZWYgT0JKX0VDT0ZGCi0JY2FzZSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDoKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLQljYXNlIEJGRF9SRUxPQ19BTFBIQV9FTEZfTElURVJBTDoKLSNlbmRpZgotCWNhc2UgQkZEX1JFTE9DX0dQUkVMMzI6Ci0JICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBpZiAoKGludClmaXh1cC0+cmVsb2MgPCAwKQotCSAgICB7Ci0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfTk9PVkVSRkxPVykKLQkJZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhbiBvcGNvZGUgbmFtZSBhbmQgYSBwcmUtdG9rZW5pemVkIHNldCBvZiBhcmd1bWVudHMsIGFzc2VtYmxlCi0gICB0aGUgaW5zbiwgYnV0IGRvIG5vdCBlbWl0IGl0LgotCi0gICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIG5vIG1hY3JvcyBhbGxvd2VkLCBzaW5jZSB3ZSBjYW4ndCBzdG9yZSBtb3JlCi0gICB0aGFuIG9uZSBpbnNuIGluIGFuIGluc24gc3RydWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzc2VtYmxlX3Rva2Vuc190b19pbnNuKG9wbmFtZSwgdG9rLCBudG9rLCBpbnNuKQotICAgICBjb25zdCBjaGFyICpvcG5hbWU7Ci0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBzdHJ1Y3QgYWxwaGFfaW5zbiAqaW5zbjsKLXsKLSAgY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSAqb3Bjb2RlOwotCi0gIC8qIHNlYXJjaCBvcGNvZGVzICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICopIGhhc2hfZmluZCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG9wbmFtZSk7Ci0gIGlmIChvcGNvZGUpCi0gICAgewotICAgICAgaW50IGNwdW1hdGNoOwotICAgICAgb3Bjb2RlID0gZmluZF9vcGNvZGVfbWF0Y2ggKG9wY29kZSwgdG9rLCAmbnRvaywgJmNwdW1hdGNoKTsKLSAgICAgIGlmIChvcGNvZGUpCi0JewotCSAgYXNzZW1ibGVfaW5zbiAob3Bjb2RlLCB0b2ssIG50b2ssIGluc24pOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKGNwdW1hdGNoKQotCWFzX2JhZCAoXygiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiKSwgb3BuYW1lLAotCSAgICAgICAgYWxwaGFfdGFyZ2V0X25hbWUpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotfQotCi0vKiBHaXZlbiBhbiBvcGNvZGUgbmFtZSBhbmQgYSBwcmUtdG9rZW5pemVkIHNldCBvZiBhcmd1bWVudHMsIHRha2UgdGhlCi0gICBvcGNvZGUgYWxsIHRoZSB3YXkgdGhyb3VnaCBlbWlzc2lvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1hc3NlbWJsZV90b2tlbnMgKG9wbmFtZSwgdG9rLCBudG9rLCBsb2NhbF9tYWNyb3Nfb24pCi0gICAgIGNvbnN0IGNoYXIgKm9wbmFtZTsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGludCBsb2NhbF9tYWNyb3Nfb247Ci17Ci0gIGludCBmb3VuZF9zb21ldGhpbmcgPSAwOwotICBjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9tYWNybyAqbWFjcm87Ci0gIGludCBjcHVtYXRjaCA9IDE7Ci0KLSAgLyogc2VhcmNoIG1hY3JvcyAqLwotICBpZiAobG9jYWxfbWFjcm9zX29uKQotICAgIHsKLSAgICAgIG1hY3JvID0gKChjb25zdCBzdHJ1Y3QgYWxwaGFfbWFjcm8gKikKLQkgICAgICAgaGFzaF9maW5kIChhbHBoYV9tYWNyb19oYXNoLCBvcG5hbWUpKTsKLSAgICAgIGlmIChtYWNybykKLQl7Ci0JICBmb3VuZF9zb21ldGhpbmcgPSAxOwotCSAgbWFjcm8gPSBmaW5kX21hY3JvX21hdGNoIChtYWNybywgdG9rLCAmbnRvayk7Ci0JICBpZiAobWFjcm8pCi0JICAgIHsKLQkgICAgICAoKm1hY3JvLT5lbWl0KSAodG9rLCBudG9rLCBtYWNyby0+YXJnKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIHNlYXJjaCBvcGNvZGVzICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgYWxwaGFfb3Bjb2RlICopIGhhc2hfZmluZCAoYWxwaGFfb3Bjb2RlX2hhc2gsIG9wbmFtZSk7Ci0gIGlmIChvcGNvZGUpCi0gICAgewotICAgICAgZm91bmRfc29tZXRoaW5nID0gMTsKLSAgICAgIG9wY29kZSA9IGZpbmRfb3Bjb2RlX21hdGNoIChvcGNvZGUsIHRvaywgJm50b2ssICZjcHVtYXRjaCk7Ci0gICAgICBpZiAob3Bjb2RlKQotCXsKLQkgIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0JICBhc3NlbWJsZV9pbnNuIChvcGNvZGUsIHRvaywgbnRvaywgJmluc24pOwotCSAgZW1pdF9pbnNuICgmaW5zbik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZm91bmRfc29tZXRoaW5nKQotICAgIGlmIChjcHVtYXRjaCkKLSAgICAgIGFzX2JhZCAoXygiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIiksIG9wbmFtZSk7Ci0gICAgZWxzZQotICAgICAgYXNfYmFkIChfKCJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiKSwgb3BuYW1lLAotCSAgICAgIGFscGhhX3RhcmdldF9uYW1lKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgYCVzJyIpLCBvcG5hbWUpOwotfQotCi0MCi0vKiBTb21lIGluc3RydWN0aW9uIHNldHMgaW5kZXhlZCBieSBsZyhzaXplKSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZXh0WF9vcFtdID0geyAic2V4dGIiLCAic2V4dHciLCAic2V4dGwiLCBOVUxMIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluc1hsX29wW10gPSB7ICJpbnNibCIsICJpbnN3bCIsICJpbnNsbCIsICJpbnNxbCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW5zWGhfb3BbXSA9IHsgTlVMTCwgICAgImluc3doIiwgImluc2xoIiwgImluc3FoIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBleHRYbF9vcFtdID0geyAiZXh0YmwiLCAiZXh0d2wiLCAiZXh0bGwiLCAiZXh0cWwiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV4dFhoX29wW10gPSB7IE5VTEwsICAgICJleHR3aCIsICJleHRsaCIsICJleHRxaCIgfTsKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXNrWGxfb3BbXSA9IHsgIm1za2JsIiwgIm1za3dsIiwgIm1za2xsIiwgIm1za3FsIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtc2tYaF9vcFtdID0geyBOVUxMLCAgICAibXNrd2giLCAibXNrbGgiLCAibXNrcWgiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0WF9vcFtdID0geyAic3RiIiwgInN0dyIsICJzdGwiLCAic3RxIiB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBsZFhfb3BbXSA9IHsgImxkYiIsICJsZHciLCAibGRsbCIsICJsZHEiIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxkWHVfb3BbXSA9IHsgImxkYnUiLCAibGR3dSIsIE5VTEwsIE5VTEwgfTsKLQotLyogSW1wbGVtZW50IHRoZSBsZGdwIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRncCAodG9rLCBudG9rLCB1bnVzZWQpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdW51c2VkOwotewotI2lmZGVmIE9CSl9BT1VUCi1GSVhNRQotI2VuZGlmCi0jaWYgZGVmaW5lZChPQkpfRUNPRkYpIHx8IGRlZmluZWQoT0JKX0VMRikKLSAgLyogZnJvbSAibGRncCByMSxuKHIyKSIsIGdlbmVyYXRlICJsZGFoIHIxLFgoUjIpOyBsZGEgcjEsWShyMSkiCi0gICAgIHdpdGggYXBwcm9wcmlhdGUgY29uc3RhbnRzIGFuZCByZWxvY2F0aW9ucy4gICovCi0gIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0gIGV4cHJlc3Npb25TIG5ld3Rva1szXTsKLSAgZXhwcmVzc2lvblMgYWRkZW5kOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGlmIChyZWdubyAodG9rWzJdLlhfYWRkX251bWJlcikgPT0gQVhQX1JFR19QVikKLSAgICBlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUgKDApOwotI2VuZGlmCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBuZXd0b2tbMl0gPSB0b2tbMl07Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGFoIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgYWRkZW5kID0gdG9rWzFdOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGlmIChhZGRlbmQuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIGFzX2JhZCAoXygiY2FuIG5vdCByZXNvbHZlIGV4cHJlc3Npb24iKSk7Ci0gIGFkZGVuZC5YX29wID0gT19zeW1ib2w7Ci0gIGFkZGVuZC5YX2FkZF9zeW1ib2wgPSBhbHBoYV9ncF9zeW1ib2w7Ci0jZW5kaWYKLQotICBpbnNuLm5maXh1cHMgPSAxOwotICBpbnNuLmZpeHVwc1swXS5leHAgPSBhZGRlbmQ7Ci0gIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0dQRElTUF9ISTE2OwotCi0gIGVtaXRfaW5zbiAoJmluc24pOwotCi0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCB0b2tbMF0uWF9hZGRfbnVtYmVyKTsKLQotICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYSIsIG5ld3RvaywgMywgJmluc24pOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIGFkZGVuZC5YX2FkZF9udW1iZXIgKz0gNDsKLSNlbmRpZgotCi0gIGluc24ubmZpeHVwcyA9IDE7Ci0gIGluc24uZml4dXBzWzBdLmV4cCA9IGFkZGVuZDsKLSAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfR1BESVNQX0xPMTY7Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci0jZW5kaWYgLyogT0JKX0VDT0ZGIHx8IE9CSl9FTEYgKi8KLX0KLQotI2lmZGVmIE9CSl9FVkFYCi0KLS8qIEFkZCBzeW1ib2wrYWRkZW5kIHRvIGxpbmsgcG9vbC4KLSAgIFJldHVybiBvZmZzZXQgZnJvbSBiYXNlc3ltIHRvIGVudHJ5IGluIGxpbmsgcG9vbC4KLQotICAgQWRkIG5ldyBmaXh1cCBvbmx5IGlmIG9mZnNldCBpc24ndCAxNmJpdC4gICovCi0KLXZhbHVlVAotYWRkX3RvX2xpbmtfcG9vbCAoYmFzZXN5bSwgc3ltLCBhZGRlbmQpCi0gICAgIHN5bWJvbFMgKmJhc2VzeW07Ci0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgb2Zmc2V0VCBhZGRlbmQ7Ci17Ci0gIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgdmFsdWVUIG9mZnNldDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7Ci0gIGNoYXIgKnA7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKGFscGhhX2xpbmtfc2VjdGlvbik7Ci0gIGZpeFMgKmZpeHA7Ci0KLSAgb2Zmc2V0ID0gLSAqc3ltYm9sX2dldF9vYmogKGJhc2VzeW0pOwotCi0gIC8qIEBAIFRoaXMgYXNzdW1lcyBhbGwgZW50cmllcyBpbiBhIGdpdmVuIHNlY3Rpb24gd2lsbCBiZSBvZiB0aGUgc2FtZQotICAgICBzaXplLi4uICBQcm9iYWJseSBjb3JyZWN0LCBidXQgdW53aXNlIHRvIHJlbHkgb24uICAqLwotICAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHN1YnNlZ21lbnQuICAqLwotCi0gIGlmIChzZWdpbmZvLT5mcmNoYWluUCkKLSAgICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5mcmNoYWluUC0+Zml4X3Jvb3Q7Ci0JIGZpeHAgIT0gKGZpeFMgKikgTlVMTDsKLQkgZml4cCA9IGZpeHAtPmZ4X25leHQsIG9mZnNldCArPSA4KQotICAgICAgewotCWlmIChmaXhwLT5meF9hZGRzeSA9PSBzeW0gJiYgZml4cC0+Znhfb2Zmc2V0ID09IGFkZGVuZCkKLQkgIHsKLQkgICAgaWYgKHJhbmdlX3NpZ25lZF8xNiAob2Zmc2V0KSkKLQkgICAgICB7Ci0JICAgICAgICByZXR1cm4gb2Zmc2V0OwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAvKiBOb3QgZm91bmQgaW4gMTZiaXQgc2lnbmVkIHJhbmdlLiAgKi8KLQotICBzdWJzZWdfc2V0IChhbHBoYV9saW5rX3NlY3Rpb24sIDApOwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgbWVtc2V0IChwLCAwLCA4KTsKLQotICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCBzeW0sIGFkZGVuZCwgMCwKLQkgICBCRkRfUkVMT0NfNjQpOwotCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VjdGlvbiwgY3VycmVudF9zdWJzZWMpOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotICByZXR1cm4gb2Zmc2V0OwotfQotCi0jZW5kaWYgLyogT0JKX0VWQVggKi8KLQotLyogTG9hZCBhIChwYXJ0aWFsKSBleHByZXNzaW9uIGludG8gYSB0YXJnZXQgcmVnaXN0ZXIuCi0KLSAgIElmIHBvZmZzZXQgaXMgbm90IG51bGwsIGFmdGVyIHRoZSBjYWxsIGl0IHdpbGwgZWl0aGVyIGNvbnRhaW4KLSAgIE9fY29uc3RhbnQgMCwgb3IgYSAxNi1iaXQgb2Zmc2V0IGFwcHJvcHJpYXRlIGZvciBhbnkgTUVNIGZvcm1hdAotICAgaW5zdHJ1Y3Rpb24uICBJbiBhZGRpdGlvbiwgcGJhc2VyZWcgd2lsbCBiZSBtb2RpZmllZCB0byBwb2ludCB0bwotICAgdGhlIGJhc2UgcmVnaXN0ZXIgdG8gdXNlIGluIHRoYXQgTUVNIGZvcm1hdCBpbnN0cnVjdGlvbi4KLQotICAgSW4gYW55IGNhc2UsICpwYmFzZXJlZyBzaG91bGQgY29udGFpbiBhIGJhc2UgcmVnaXN0ZXIgdG8gYWRkIHRvIHRoZQotICAgZXhwcmVzc2lvbi4gIFRoaXMgd2lsbCBub3JtYWxseSBiZSBlaXRoZXIgQVhQX1JFR19aRVJPIG9yCi0gICBhbHBoYV9ncF9yZWdpc3Rlci4gIFN5bWJvbCBhZGRyZXNzZXMgd2lsbCBhbHdheXMgYmUgbG9hZGVkIHZpYSAkZ3AsCi0gICBzbyAiZm9vKCQwKSIgaXMgaW50ZXJwcmV0ZWQgYXMgYWRkaW5nIHRoZSBhZGRyZXNzIG9mIGZvbyB0byAkMDsKLSAgIGkuZS4gImxkcSAkdGFyZywgTElUKCRncCk7IGFkZHEgJHRhcmcsICQwLCAkdGFyZyIuICBPZGQsIHBlcmhhcHMsCi0gICBidXQgdGhpcyBpcyB3aGF0IE9TRi8xIGRvZXMuCi0KLSAgIEZpbmFsbHksIHRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSBpZiB0aGUgY2FsbGluZyBtYWNybyBtYXkgZW1pdCBhCi0gICBMSVRVU0UgcmVsb2MgaWYgb3RoZXJ3aXNlIGFwcHJvcHJpYXRlLiAgKi8KLQotc3RhdGljIGludAotbG9hZF9leHByZXNzaW9uICh0YXJncmVnLCBleHAsIHBiYXNlcmVnLCBwb2Zmc2V0KQotICAgICBpbnQgdGFyZ3JlZzsKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgaW50ICpwYmFzZXJlZzsKLSAgICAgZXhwcmVzc2lvblMgKnBvZmZzZXQ7Ci17Ci0gIGludCBlbWl0X2xpdHVzZSA9IDA7Ci0gIG9mZnNldFQgYWRkZW5kID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gIGludCBiYXNlcmVnID0gKnBiYXNlcmVnOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgc3dpdGNoIChleHAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICB7Ci0jaWZkZWYgT0JKX0VDT0ZGCi0Jb2Zmc2V0VCBsaXQ7Ci0KLQkvKiBhdHRlbXB0IHRvIHJlZHVjZSAubGl0IGxvYWQgYnkgc3BsaXR0aW5nIHRoZSBvZmZzZXQgZnJvbQotCSAgIGl0cyBzeW1ib2wgd2hlbiBwb3NzaWJsZSwgYnV0IGRvbid0IGNyZWF0ZSBhIHNpdHVhdGlvbiBpbgotCSAgIHdoaWNoIHdlJ2QgZmFpbC4gICovCi0JaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkgJiYKLQkgICAgKGFscGhhX25vYXRfb24gfHwgdGFyZ3JlZyA9PSBBWFBfUkVHX0FUKSkKLQkgIHsKLQkgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCwKLQkJCQkgICAgICAgYWxwaGFfbGl0YV9zZWN0aW9uLCA4KTsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGxpdCA9IGFkZF90b19saXRlcmFsX3Bvb2wgKGV4cC0+WF9hZGRfc3ltYm9sLCAwLAotCQkJCSAgICAgICBhbHBoYV9saXRhX3NlY3Rpb24sIDgpOwotCSAgfQotCi0JaWYgKGxpdCA+PSAweDgwMDApCi0JICBhc19mYXRhbCAoXygib3ZlcmZsb3cgaW4gbGl0ZXJhbCAoLmxpdGEpIHRhYmxlIikpOwotCi0JLyogZW1pdCAibGRxIHIsIGxpdChncCkiICovCi0KLQlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiB0YXJncmVnID09IGJhc2VyZWcpCi0JICB7Ci0JICAgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCSAgICBpZiAodGFyZ3JlZyA9PSBBWFBfUkVHX0FUKQotCSAgICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0JICB9Ci0JZWxzZQotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0Jc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0YV9zeW1ib2wsIGxpdCk7Ci0Jc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLQotCWFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLQlhc3NlcnQgKGluc24ubmZpeHVwcyA9PSAxKTsKLQlpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRFUkFMOwotI2VuZGlmIC8qIE9CSl9FQ09GRiAqLwotI2lmZGVmIE9CSl9FTEYKLQkvKiBlbWl0ICJsZHEgciwgZ290b2ZmKGdwKSIgKi8KLQotCWlmIChiYXNlcmVnICE9IGFscGhhX2dwX3JlZ2lzdGVyICYmIHRhcmdyZWcgPT0gYmFzZXJlZykKLQkgIHsKLQkgICAgaWYgKGFscGhhX25vYXRfb24pCi0JICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0JICAgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgICAgYXNfYmFkIChfKCJtYWNybyByZXF1aXJlcyAkYXQgd2hpbGUgJGF0IGluIHVzZSIpKTsKLQotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLQkgIH0KLQllbHNlCi0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLQotCS8qIFhYWDogRGlzYWJsZSB0aGlzIC5nb3QgbWluaW1pemluZyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBjYW4gZ2V0Ci0JICAgYmV0dGVyIGluc3RydWN0aW9uIG9mZnNldCBrbm93bGVkZ2UgaW4gdGhlIGNvbXBpbGVyLiAgVGhpcyBoYXBwZW5zCi0JICAgdmVyeSBpbmZyZXF1ZW50bHkgYW55d2F5LiAgKi8KLQlpZiAoMSB8fCAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKQotCSAgICAmJiAoYWxwaGFfbm9hdF9vbiB8fCB0YXJncmVnID09IEFYUF9SRUdfQVQpKSkKLQkgIHsKLQkgICAgbmV3dG9rWzFdID0gKmV4cDsKLQkgICAgYWRkZW5kID0gMDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKLQkgIH0KLQotCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0JYXNzZXJ0IChpbnNuLm5maXh1cHMgPT0gMSk7Ci0JaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfRUxGX0xJVEVSQUw7Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotI2lmZGVmIE9CSl9FVkFYCi0Jb2Zmc2V0VCBsaW5rOwotCi0JLyogRmluZCBzeW1ib2wgb3Igc3ltYm9sIHBvaW50ZXIgaW4gbGluayBzZWN0aW9uLiAgKi8KLQotCWlmIChleHAtPlhfYWRkX3N5bWJvbCA9PSBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKQotCSAgewotCSAgICBpZiAocmFuZ2Vfc2lnbmVkXzE2IChhZGRlbmQpKQotCSAgICAgIHsKLQkJc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0JCXNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgYWRkZW5kKTsKLQkJc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCQlhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkYSIsIG5ld3RvaywgMywgJmluc24pOwotCQlhZGRlbmQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0JCXNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0JCXNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBiYXNlcmVnKTsKLQkJYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKCJsZGEiLCBuZXd0b2ssIDMsICZpbnNuKTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAoIXJhbmdlX3NpZ25lZF8zMiAoYWRkZW5kKSkKLQkgICAgICB7Ci0JCWxpbmsgPSBhZGRfdG9fbGlua19wb29sIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sLAotCQkJCQkgZXhwLT5YX2FkZF9zeW1ib2wsIGFkZGVuZCk7Ci0JCWFkZGVuZCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlsaW5rID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCQkJIGV4cC0+WF9hZGRfc3ltYm9sLCAwKTsKLQkgICAgICB9Ci0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotCSAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGxpbmspOwotCSAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0JICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0JICB9Ci0jZW5kaWYgLyogT0JKX0VWQVggKi8KLQotCWVtaXRfaW5zbigmaW5zbik7Ci0KLSNpZm5kZWYgT0JKX0VWQVgKLQllbWl0X2xpdHVzZSA9IDE7Ci0KLQlpZiAoYmFzZXJlZyAhPSBhbHBoYV9ncF9yZWdpc3RlciAmJiBiYXNlcmVnICE9IEFYUF9SRUdfWkVSTykKLQkgIHsKLQkgICAgLyogZW1pdCAiYWRkcSByLCBiYXNlLCByIiAqLwotCi0JICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIGJhc2VyZWcpOwotCSAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzJdLCB0YXJncmVnKTsKLQkgICAgYXNzZW1ibGVfdG9rZW5zICgiYWRkcSIsIG5ld3RvaywgMywgMCk7Ci0JICB9Ci0jZW5kaWYKLQotCWJhc2VyZWcgPSB0YXJncmVnOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zdWJ0cmFjdDoKLSAgICAgIC8qIEFzc3VtZSB0aGF0IHRoaXMgZGlmZmVyZW5jZSBleHByZXNzaW9uIHdpbGwgYmUgcmVzb2x2ZWQgdG8gYW4KLQkgYWJzb2x1dGUgdmFsdWUgYW5kIHRoYXQgdGhhdCB2YWx1ZSB3aWxsIGZpdCBpbiAxNiBiaXRzLiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSAgICAgIG5ld3Rva1sxXSA9ICpleHA7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJsZGEiLCBuZXd0b2ssIDMsIDApOwotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgMCk7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT19iaWc6Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPiAwKQotCWFzX2JhZCAoXygiYmlnbnVtIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBhZGRlbmQgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkIChfKCJjYW4ndCBoYW5kbGUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGFkZGVuZCA9IDA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKCFyYW5nZV9zaWduZWRfMzIgKGFkZGVuZCkpCi0gICAgewotICAgICAgb2Zmc2V0VCBsaXQ7Ci0KLSAgICAgIC8qIGZvciA2NC1iaXQgYWRkZW5kcywganVzdCBwdXQgaXQgaW4gdGhlIGxpdGVyYWwgcG9vbCAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICAgIC8qIGVtaXQgImxkcSB0YXJncmVnLCBsaXQoYmFzZXJlZykiICAqLwotICAgICAgbGl0ID0gYWRkX3RvX2xpbmtfcG9vbCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCwKLQkJCSAgICAgIHNlY3Rpb25fc3ltYm9sIChhYnNvbHV0ZV9zZWN0aW9uKSwgYWRkZW5kKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHRhcmdyZWcpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGFscGhhX2dwX3JlZ2lzdGVyKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcSIsIG5ld3RvaywgMywgMCk7Ci0jZWxzZQotCi0gICAgICBpZiAoYWxwaGFfbGl0OF9zZWN0aW9uID09IE5VTEwpCi0JewotCSAgY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAoIi5saXQ4IiwKLQkJCQkgICZhbHBoYV9saXQ4X3NlY3Rpb24sCi0JCQkJICAmYWxwaGFfbGl0OF9zeW1ib2wpOwotCi0jaWZkZWYgT0JKX0VDT0ZGCi0JICBhbHBoYV9saXQ4X2xpdGVyYWwgPSBhZGRfdG9fbGl0ZXJhbF9wb29sIChhbHBoYV9saXQ4X3N5bWJvbCwgMHg4MDAwLAotCQkJCQkJICAgIGFscGhhX2xpdGFfc2VjdGlvbiwgOCk7Ci0JICBpZiAoYWxwaGFfbGl0OF9saXRlcmFsID49IDB4ODAwMCkKLQkgICAgYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIpKTsKLSNlbmRpZgotCX0KLQotICAgICAgbGl0ID0gYWRkX3RvX2xpdGVyYWxfcG9vbCAoTlVMTCwgYWRkZW5kLCBhbHBoYV9saXQ4X3NlY3Rpb24sIDgpIC0gMHg4MDAwOwotICAgICAgaWYgKGxpdCA+PSAweDgwMDApCi0JYXNfZmF0YWwgKF8oIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIpKTsKLQotICAgICAgLyogZW1pdCAibGRhIGxpdHJlZywgLmxpdDgrMHg4MDAwIiAqLwotCi0gICAgICBpZiAodGFyZ3JlZyA9PSBiYXNlcmVnKQotCXsKLQkgIGlmIChhbHBoYV9ub2F0X29uKQotCSAgICBhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQkgIGlmICh0YXJncmVnID09IEFYUF9SRUdfQVQpCi0JICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiKSk7Ci0KLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotCX0KLSAgICAgIGVsc2UKLQlzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB0YXJncmVnKTsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgICAgIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIGFscGhhX2xpdGFfc3ltYm9sLCBhbHBoYV9saXQ4X2xpdGVyYWwpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICAgICAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgYWxwaGFfbGl0OF9zeW1ib2wsIDB4ODAwMCk7Ci0jZW5kaWYKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0KLSAgICAgIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgibGRxIiwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzID09IDEpOwotI2lmZGVmIE9CSl9FQ09GRgotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElURVJBTDsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGluc24uZml4dXBzWzBdLnJlbG9jID0gQkZEX1JFTE9DX0FMUEhBX0VMRl9MSVRFUkFMOwotI2VuZGlmCi0KLSAgICAgIGVtaXRfaW5zbiAoJmluc24pOwotCi0gICAgICAvKiBlbWl0ICJsZHEgbGl0cmVnLCBsaXQobGl0cmVnKSIgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBsaXQpOwotICAgICAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIG5ld3Rva1swXS5YX2FkZF9udW1iZXIpOwotCi0gICAgICBhc3NlbWJsZV90b2tlbnNfdG9faW5zbiAoImxkcSIsIG5ld3RvaywgMywgJmluc24pOwotCi0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gMTsKLSAgICAgIGVtaXRfbGl0dXNlID0gMDsKLQotICAgICAgZW1pdF9pbnNuICgmaW5zbik7Ci0KLSAgICAgIC8qIGVtaXQgImFkZHEgbGl0cmVnLCBiYXNlLCB0YXJnZXQiICovCi0KLSAgICAgIGlmIChiYXNlcmVnICE9IEFYUF9SRUdfWkVSTykKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBiYXNlcmVnKTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIHRhcmdyZWcpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgiYWRkcSIsIG5ld3RvaywgMywgMCk7Ci0JfQotI2VuZGlmIC8qICFPQkpfRVZBWCAqLwotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgMCk7Ci0gICAgICAqcGJhc2VyZWcgPSB0YXJncmVnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9mZnNldFQgbG93LCBoaWdoLCBleHRyYSwgdG1wOwotCi0gICAgICAvKiBmb3IgMzItYml0IG9wZXJhbmRzLCBicmVhayB1cCB0aGUgYWRkZW5kICovCi0KLSAgICAgIGxvdyA9IHNpZ25fZXh0ZW5kXzE2IChhZGRlbmQpOwotICAgICAgdG1wID0gYWRkZW5kIC0gbG93OwotICAgICAgaGlnaCA9IHNpZ25fZXh0ZW5kXzE2ICh0bXAgPj4gMTYpOwotCi0gICAgICBpZiAodG1wIC0gKGhpZ2ggPDwgMTYpKQotCXsKLQkgIGV4dHJhID0gMHg0MDAwOwotCSAgdG1wIC09IDB4NDAwMDAwMDA7Ci0JICBoaWdoID0gc2lnbl9leHRlbmRfMTYgKHRtcCA+PiAxNik7Ci0JfQotICAgICAgZWxzZQotCWV4dHJhID0gMDsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgdGFyZ3JlZyk7Ci0gICAgICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0KLSAgICAgIGlmIChleHRyYSkKLQl7Ci0JICAvKiBlbWl0ICJsZGFoIHIsIGV4dHJhKHIpICovCi0JICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGV4dHJhKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImxkYWgiLCBuZXd0b2ssIDMsIDApOwotCSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcgPSB0YXJncmVnKTsKLQl9Ci0KLSAgICAgIGlmIChoaWdoKQotCXsKLQkgIC8qIGVtaXQgImxkYWggciwgaGlnaChyKSAqLwotCSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCBoaWdoKTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImxkYWgiLCBuZXd0b2ssIDMsIDApOwotCSAgYmFzZXJlZyA9IHRhcmdyZWc7Ci0JICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0JfQotCi0gICAgICBpZiAoKGxvdyAmJiAhcG9mZnNldCkgfHwgKCFwb2Zmc2V0ICYmIGJhc2VyZWcgIT0gdGFyZ3JlZykpCi0JewotCSAgLyogZW1pdCAibGRhIHIsIGxvdyhiYXNlKSIgKi8KLQkgIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgbG93KTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgMywgMCk7Ci0JICBiYXNlcmVnID0gdGFyZ3JlZzsKLQkgIGxvdyA9IDA7Ci0JfQotCi0gICAgICBpZiAocG9mZnNldCkKLQlzZXRfdG9rX2NvbnN0ICgqcG9mZnNldCwgbG93KTsKLSAgICAgICpwYmFzZXJlZyA9IGJhc2VyZWc7Ci0gICAgfQotCi0gIHJldHVybiBlbWl0X2xpdHVzZTsKLX0KLQotLyogVGhlIGxkYSBtYWNybyBkaWZmZXJzIGZyb20gdGhlIGxkYSBpbnN0cnVjdGlvbiBpbiB0aGF0IGl0IGhhbmRsZXMKLSAgIG1vc3Qgc2ltcGxlIGV4cHJlc3Npb25zLCBwYXJ0aWN1YWxybHkgc3ltYm9sIGFkZHJlc3MgbG9hZHMgYW5kCi0gICBsYXJnZSBjb25zdGFudHMuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZGEgKHRvaywgbnRvaywgdW51c2VkKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHVudXNlZDsKLXsKLSAgaW50IGJhc2VyZWc7Ci0KLSAgaWYgKG50b2sgPT0gMikKLSAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIGVsc2UKLSAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKLQotICAodm9pZCkgbG9hZF9leHByZXNzaW9uICh0b2tbMF0uWF9hZGRfbnVtYmVyLCAmdG9rWzFdLCAmYmFzZXJlZywgTlVMTCk7Ci19Ci0KLS8qIFRoZSBsZGFoIG1hY3JvIGRpZmZlcnMgZnJvbSB0aGUgbGRhaCBpbnN0cnVjdGlvbiBpbiB0aGF0IGl0IGhhcyAkMzEKLSAgIGFzIGFuIGltcGxpZWQgYmFzZSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X2xkYWggKHRvaywgbnRvaywgdW51c2VkKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHVudXNlZDsKLXsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgbmV3dG9rWzFdID0gdG9rWzFdOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19aRVJPKTsKLQotICBhc3NlbWJsZV90b2tlbnMgKCJsZGFoIiwgbmV3dG9rLCAzLCAwKTsKLX0KLQotLyogSGFuZGxlIGFsbCAic2ltcGxlIiBpbnRlZ2VyIHJlZ2lzdGVyIGxvYWRzIC0tIGxkcSwgbGRxX2wsIGxkcV91LAotICAgZXRjLiAgVGhleSBkaWZmZXIgZnJvbSB0aGUgcmVhbCBpbnN0cnVjdGlvbnMgaW4gdGhhdCB0aGV5IGRvIHNpbXBsZQotICAgZXhwcmVzc2lvbnMgbGlrZSB0aGUgbGRhIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfaXJfbG9hZCAodG9rLCBudG9rLCBvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgb3BuYW1lOwotewotICBpbnQgYmFzZXJlZywgbGl0dXNlOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0gIHN0cnVjdCBhbHBoYV9pbnNuIGluc247Ci0KLSAgaWYgKG50b2sgPT0gMikKLSAgICBiYXNlcmVnID0gKHRva1sxXS5YX29wID09IE9fY29uc3RhbnQgPyBBWFBfUkVHX1pFUk8gOiBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIGVsc2UKLSAgICBiYXNlcmVnID0gdG9rWzJdLlhfYWRkX251bWJlcjsKLQotICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKHRva1swXS5YX2FkZF9udW1iZXIsICZ0b2tbMV0sICZiYXNlcmVnLAotCQkJICAgICZuZXd0b2tbMV0pOwotCi0gIG5ld3Rva1swXSA9IHRva1swXTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIGJhc2VyZWcpOwotCi0gIGFzc2VtYmxlX3Rva2Vuc190b19pbnNuICgoY29uc3QgY2hhciAqKW9wbmFtZSwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgaWYgKGxpdHVzZSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gMTsKLSAgICB9Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci19Ci0KLS8qIEhhbmRsZSBmcCByZWdpc3RlciBsb2FkcywgYW5kIGJvdGggaW50ZWdlciBhbmQgZnAgcmVnaXN0ZXIgc3RvcmVzLgotICAgQWdhaW4sIHdlIGhhbmRsZSBzaW1wbGUgZXhwcmVzc2lvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sb2Fkc3RvcmUgKHRvaywgbnRvaywgb3BuYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIG9wbmFtZTsKLXsKLSAgaW50IGJhc2VyZWcsIGxpdHVzZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBzdHJ1Y3QgYWxwaGFfaW5zbiBpbnNuOwotCi0gIGlmIChudG9rID09IDIpCi0gICAgYmFzZXJlZyA9ICh0b2tbMV0uWF9vcCA9PSBPX2NvbnN0YW50ID8gQVhQX1JFR19aRVJPIDogYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICBlbHNlCi0gICAgYmFzZXJlZyA9IHRva1syXS5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKHRva1sxXS5YX29wICE9IE9fY29uc3RhbnQgfHwgIXJhbmdlX3NpZ25lZF8xNih0b2tbMV0uWF9hZGRfbnVtYmVyKSkKLSAgICB7Ci0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgbGl0dXNlID0gbG9hZF9leHByZXNzaW9uIChBWFBfUkVHX0FULCAmdG9rWzFdLCAmYmFzZXJlZywgJm5ld3Rva1sxXSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbmV3dG9rWzFdID0gdG9rWzFdOwotICAgICAgbGl0dXNlID0gMDsKLSAgICB9Ci0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgYmFzZXJlZyk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKChjb25zdCBjaGFyICopb3BuYW1lLCBuZXd0b2ssIDMsICZpbnNuKTsKLQotICBpZiAobGl0dXNlKQotICAgIHsKLSAgICAgIGFzc2VydCAoaW5zbi5uZml4dXBzIDwgTUFYX0lOU05fRklYVVBTKTsKLSAgICAgIGlmIChpbnNuLm5maXh1cHMgPiAwKQotCXsKLQkgIG1lbW1vdmUgKCZpbnNuLmZpeHVwc1sxXSwgJmluc24uZml4dXBzWzBdLAotCQkgICBzaXplb2Yoc3RydWN0IGFscGhhX2ZpeHVwKSAqIGluc24ubmZpeHVwcyk7Ci0JfQotICAgICAgaW5zbi5uZml4dXBzKys7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5yZWxvYyA9IEJGRF9SRUxPQ19BTFBIQV9MSVRVU0U7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9vcCA9IE9fc3ltYm9sOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sIChub3dfc2VnKTsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIgPSAxOwotICAgIH0KLQotICBlbWl0X2luc24gKCZpbnNuKTsKLX0KLQotLyogTG9hZCBhIGhhbGYtd29yZCBvciBieXRlIGFzIGFuIHVuc2lnbmVkIHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2lyX2xvYWQgKHRvaywgbnRvaywgbGRYdV9vcFsobG9uZyl2bGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICAvKiBlbWl0ICJsZGEgJGF0LCBleHAiICovCi0KLSAgICAgIG1lbWNweSAobmV3dG9rLCB0b2ssIHNpemVvZiAoZXhwcmVzc2lvblMpICogbnRvayk7Ci0gICAgICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkcV91IHRhcmcsIDAoJGF0KSIgKi8KLQotICAgICAgbmV3dG9rWzBdID0gdG9rWzBdOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAiZXh0WGwgdGFyZywgJGF0LCB0YXJnIiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoZXh0WGxfb3BbKGxvbmcpdmxnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0gICAgfQotfQotCi0vKiBMb2FkIGEgaGFsZi13b3JkIG9yIGJ5dGUgYXMgYSBzaWduZWQgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9sZFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBlbWl0X2xkWHUgKHRvaywgbnRvaywgdmxnc2l6ZSk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoc2V4dFhfb3BbKGxvbmcpdmxnc2l6ZV0sIHRvaywgMSwgMSk7Ci19Ci0KLS8qIExvYWQgYW4gaW50ZWdyYWwgdmFsdWUgZnJvbSBhbiB1bmFsaWduZWQgYWRkcmVzcyBhcyBhbiB1bnNpZ25lZAotICAgdmFsdWUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91bGRYdSAodG9rLCBudG9rLCB2bGdzaXplKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZsZ3NpemU7Ci17Ci0gIGxvbmcgbGdzaXplID0gKGxvbmcpdmxnc2l6ZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIGlmIChhbHBoYV9ub2F0X29uKQotICAgIGFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkdDksIDAoJGF0KSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgc2V0X3Rva19wcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfQVQpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibGRxX3UgJHQxMCwgc2l6ZS0xKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sICgxPDxsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiZXh0WGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMl0sIEFYUF9SRUdfVDkpOwotICBhc3NlbWJsZV90b2tlbnMgKGV4dFhsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiZXh0WGggJHQxMCwgJGF0LCAkdDEwIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOwotICBhc3NlbWJsZV90b2tlbnMgKGV4dFhoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCB0YXJnIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7Ci0gIG5ld3Rva1syXSA9IHRva1swXTsKLSAgYXNzZW1ibGVfdG9rZW5zICgib3IiLCBuZXd0b2ssIDMsIDEpOwotfQotCi0vKiBMb2FkIGFuIGludGVncmFsIHZhbHVlIGZyb20gYW4gdW5hbGlnbmVkIGFkZHJlc3MgYXMgYSBzaWduZWQgdmFsdWUuCi0gICBOb3RlIHRoYXQgcXVhZHMgc2hvdWxkIGdldCBmdW5uZWxlZCB0byB0aGUgdW5zaWduZWQgbG9hZCBzaW5jZSB3ZQotICAgZG9uJ3QgaGF2ZSB0byBkbyB0aGUgc2lnbiBleHRlbnNpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91bGRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgZW1pdF91bGRYdSAodG9rLCBudG9rLCB2bGdzaXplKTsKLSAgYXNzZW1ibGVfdG9rZW5zIChzZXh0WF9vcFsobG9uZyl2bGdzaXplXSwgdG9rLCAxLCAxKTsKLX0KLQotLyogSW1wbGVtZW50IHRoZSBsZGlsIG1hY3JvLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfbGRpbCAodG9rLCBudG9rLCB1bnVzZWQpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdW51c2VkOwotewotICBleHByZXNzaW9uUyBuZXd0b2tbMl07Ci0KLSAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mKG5ld3RvaykpOwotICBuZXd0b2tbMV0uWF9hZGRfbnVtYmVyID0gc2lnbl9leHRlbmRfMzIgKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgbnRvaywgMSk7Ci19Ci0KLS8qIFN0b3JlIGEgaGFsZi13b3JkIG9yIGJ5dGUuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9zdFggKHRvaywgbnRvaywgdmxnc2l6ZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiB2bGdzaXplOwotewotICBpbnQgbGdzaXplID0gKGludCkobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBlbWl0X2xvYWRzdG9yZSAodG9rLCBudG9rLCBzdFhfb3BbbGdzaXplXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZChfKCJtYWNybyByZXF1aXJlcyAkYXQgcmVnaXN0ZXIgd2hpbGUgbm9hdCBpbiBlZmZlY3QiKSk7Ci0KLSAgICAgIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICAgICAgbWVtY3B5IChuZXd0b2ssIHRvaywgc2l6ZW9mIChleHByZXNzaW9uUykgKiBudG9rKTsKLSAgICAgIG5ld3Rva1swXS5YX2FkZF9udW1iZXIgPSBBWFBfUkVHX0FUOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAgICAgLyogZW1pdCAibGRxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTAiICovCi0KLSAgICAgIG5ld3Rva1swXSA9IHRva1swXTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTApOwotICAgICAgYXNzZW1ibGVfdG9rZW5zIChpbnNYbF9vcFtsZ3NpemVdLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJtc2tYbCAkdDksICRhdCwgJHQ5IiAqLwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgICAgIG5ld3Rva1syXSA9IG5ld3Rva1swXTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAobXNrWGxfb3BbbGdzaXplXSwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAib3IgJHQ5LCAkdDEwLCAkdDkiICovCi0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm9yIiwgbmV3dG9rLCAzLCAxKTsKLQotICAgICAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkgKi8KLQotICAgICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAwKTsKLSAgICAgIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoInN0cV91IiwgbmV3dG9rLCAzLCAxKTsKLSAgICB9Ci19Ci0KLS8qIFN0b3JlIGFuIGludGVnZXIgdG8gYW4gdW5hbGlnbmVkIGFkZHJlc3MuICAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF91c3RYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgaW50IGxnc2l6ZSA9IChpbnQpKGxvbmcpdmxnc2l6ZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gIC8qIGVtaXQgImxkYSAkYXQsIGV4cCIgKi8KLQotICBtZW1jcHkgKG5ld3RvaywgdG9rLCBzaXplb2YgKGV4cHJlc3Npb25TKSAqIG50b2spOwotICBuZXd0b2tbMF0uWF9hZGRfbnVtYmVyID0gQVhQX1JFR19BVDsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRhIiwgbmV3dG9rLCBudG9rLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkOSwgMCgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDkpOwotICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIDApOwotICBzZXRfdG9rX3ByZWcgKG5ld3Rva1syXSwgQVhQX1JFR19BVCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkcV91IiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBlbWl0ICJsZHFfdSAkMTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJsZHFfdSIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGwgc3JjLCAkYXQsICR0MTEiICovCi0KLSAgbmV3dG9rWzBdID0gdG9rWzBdOwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTEpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAiaW5zWGggc3JjLCAkYXQsICR0MTIiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1syXSwgQVhQX1JFR19UMTIpOwotICBhc3NlbWJsZV90b2tlbnMgKGluc1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGwgJHQ5LCAkYXQsICR0OSIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hsX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAibXNrWGggJHQxMCwgJGF0LCAkdDEwIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKG1za1hoX29wW2xnc2l6ZV0sIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQ5LCAkdDExLCAkdDkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDExKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAib3IgJHQxMCwgJHQxMiwgJHQxMCIgKi8KLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEyKTsKLSAgbmV3dG9rWzJdID0gbmV3dG9rWzBdOwotICBhc3NlbWJsZV90b2tlbnMgKCJvciIsIG5ld3RvaywgMywgMSk7Ci0KLSAgLyogZW1pdCAic3RxX3UgJHQ5LCAwKCRhdCkiICovCi0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UOSk7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX0FUKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgic3RxX3UiLCBuZXd0b2ssIDMsIDEpOwotCi0gIC8qIGVtaXQgInN0cV91ICR0MTAsIHNpemUtMSgkYXQpIiAqLwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDEwKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzFdLCAoMSA8PCBsZ3NpemUpLTEpOwotICBhc3NlbWJsZV90b2tlbnMgKCJzdHFfdSIsIG5ld3RvaywgMywgMSk7Ci19Ci0KLS8qIFNpZ24gZXh0ZW5kIGEgaGFsZi13b3JkIG9yIGJ5dGUuICBUaGUgMzItYml0IHNpZ24gZXh0ZW5kIGlzCi0gICBpbXBsZW1lbnRlZCBhcyAiYWRkbCAkMzEsICRyLCAkdCIgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3NleHRYICh0b2ssIG50b2ssIHZsZ3NpemUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdmxnc2l6ZTsKLXsKLSAgbG9uZyBsZ3NpemUgPSAobG9uZyl2bGdzaXplOwotCi0gIGlmIChhbHBoYV90YXJnZXQgJiBBWFBfT1BDT0RFX0JXWCkKLSAgICBhc3NlbWJsZV90b2tlbnMgKHNleHRYX29wW2xnc2l6ZV0sIHRvaywgbnRvaywgMCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgYml0c2hpZnQgPSA2NCAtIDggKiAoMSA8PCBsZ3NpemUpOwotICAgICAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotCi0gICAgICAvKiBlbWl0ICJzbGwgc3JjLGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSB0b2tbMF07Ci0gICAgICBzZXRfdG9rX2NvbnN0IChuZXd0b2tbMV0sIGJpdHNoaWZ0KTsKLSAgICAgIG5ld3Rva1syXSA9IHRva1tudG9rIC0gMV07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzbGwiLCBuZXd0b2ssIDMsIDEpOwotCi0gICAgICAvKiBlbWl0ICJzcmEgZHN0LGJpdHMsZHN0IiAqLwotCi0gICAgICBuZXd0b2tbMF0gPSBuZXd0b2tbMl07Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJzcmEiLCBuZXd0b2ssIDMsIDEpOwotICAgIH0KLX0KLQotLyogSW1wbGVtZW50IHRoZSBkaXZpc2lvbiBhbmQgbW9kdWx1cyBtYWNyb3MuICAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLQotLyogTWFrZSByZWdpc3RlciB1c2FnZSBsaWtlIGluIG5vcm1hbCBwcm9jZWR1cmUgY2FsbC4KLSAgIERvbid0IGNsb2JiZXIgUFYgYW5kIFJBLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfZGl2aXNpb24gKHRvaywgbnRvaywgc3ltbmFtZSkKLSAgICAgY29uc3QgZXhwcmVzc2lvblMgKnRvazsKLSAgICAgaW50IG50b2s7Ci0gICAgIGNvbnN0IFBUUiBzeW1uYW1lOwotewotICAvKiBESVZJU0lPTiBhbmQgTU9EVUxVUy4gWWVjaC4KLSAgICoKLSAgICogQ29udmVydAotICAgKiAgICBPUCB4LHkscmVzdWx0Ci0gICAqIHRvCi0gICAqICAgIG1vdiB4LFIxNgkjIGlmIHggIT0gUjE2Ci0gICAqICAgIG1vdiB5LFIxNwkjIGlmIHkgIT0gUjE3Ci0gICAqICAgIGxkYSBBVCxfX09QCi0gICAqICAgIGpzciBBVCwoQVQpLDAKLSAgICogICAgbW92IFIwLHJlc3VsdAotICAgKgotICAgKiB3aXRoIGFwcHJvcHJpYXRlIG9wdGltaXphdGlvbnMgaWYgUjAsUjE2LFIxNyBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7Ci0gIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGlmIChudG9rIDwgMykKLSAgICByciA9IHhyOwotICBlbHNlCi0gICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7Ci0KLSAgLyogTW92ZSB0aGUgb3BlcmFuZHMgaW50byB0aGUgcmlnaHQgcGxhY2UgKi8KLSAgaWYgKHlyID09IEFYUF9SRUdfUjE2ICYmIHhyID09IEFYUF9SRUdfUjE3KQotICAgIHsKLSAgICAgIC8qIFRoZXkgYXJlIGluIGV4YWN0bHkgdGhlIHdyb25nIG9yZGVyIC0tIHN3YXAgdGhyb3VnaCBBVCAqLwotCi0gICAgICBpZiAoYWxwaGFfbm9hdF9vbikKLQlhc19iYWQgKF8oIm1hY3JvIHJlcXVpcmVzICRhdCByZWdpc3RlciB3aGlsZSBub2F0IGluIGVmZmVjdCIpKTsKLQotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19SMTYpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19BVCk7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1IxNyk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1IxNik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHlyID09IEFYUF9SRUdfUjE2KQotCXsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjE2KTsKLQkgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfUjE3KTsKLQkgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotCi0gICAgICBpZiAoeHIgIT0gQVhQX1JFR19SMTYpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeHIpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTYpOwotICAgICAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0JfQotCi0gICAgICBpZiAoeXIgIT0gQVhQX1JFR19SMTYgJiYgeXIgIT0gQVhQX1JFR19SMTcpCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgeXIpOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19SMTcpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0gICAgfQotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjb25zdCBjaGFyICopc3ltbmFtZSk7Ci0KLSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19BVCk7Ci0gIHNldF90b2tfc3ltIChuZXd0b2tbMV0sIHN5bSwgMCk7Ci0gIGFzc2VtYmxlX3Rva2VucyAoImxkYSIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19jcHJlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgc2V0X3Rva19jb25zdCAobmV3dG9rWzJdLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAzLCAxKTsKLQotICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChyciAhPSBBWFBfUkVHX1IwKQotICAgIHsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfUjApOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgcnIpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci19Ci0KLSNlbHNlIC8qICFPQkpfRVZBWCAqLwotCi1zdGF0aWMgdm9pZAotZW1pdF9kaXZpc2lvbiAodG9rLCBudG9rLCBzeW1uYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHN5bW5hbWU7Ci17Ci0gIC8qIERJVklTSU9OIGFuZCBNT0RVTFVTLiBZZWNoLgotICAgKiBDb252ZXJ0Ci0gICAqICAgIE9QIHgseSxyZXN1bHQKLSAgICogdG8KLSAgICogICAgbGRhIHB2LF9fT1AKLSAgICogICAgbW92IHgsdDEwCi0gICAqICAgIG1vdiB5LHQxMQotICAgKiAgICBqc3IgdDksKHB2KSxfX09QCi0gICAqICAgIG1vdiB0MTIscmVzdWx0Ci0gICAqCi0gICAqIHdpdGggYXBwcm9wcmlhdGUgb3B0aW1pemF0aW9ucyBpZiB0MTAsdDExLHQxMiBhcmUgdGhlIHJlZ2lzdGVycwotICAgKiBzcGVjaWZpZWQgYnkgdGhlIGNvbXBpbGVyLgotICAgKi8KLQotICBpbnQgeHIsIHlyLCBycjsKLSAgc3ltYm9sUyAqc3ltOwotICBleHByZXNzaW9uUyBuZXd0b2tbM107Ci0KLSAgeHIgPSByZWdubyAodG9rWzBdLlhfYWRkX251bWJlcik7Ci0gIHlyID0gcmVnbm8gKHRva1sxXS5YX2FkZF9udW1iZXIpOwotCi0gIGlmIChudG9rIDwgMykKLSAgICByciA9IHhyOwotICBlbHNlCi0gICAgcnIgPSByZWdubyAodG9rWzJdLlhfYWRkX251bWJlcik7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoKGNvbnN0IGNoYXIgKilzeW1uYW1lKTsKLQotICAvKiBNb3ZlIHRoZSBvcGVyYW5kcyBpbnRvIHRoZSByaWdodCBwbGFjZSAqLwotICBpZiAoeXIgPT0gQVhQX1JFR19UMTAgJiYgeHIgPT0gQVhQX1JFR19UMTEpCi0gICAgewotICAgICAgLyogVGhleSBhcmUgaW4gZXhhY3RseSB0aGUgd3Jvbmcgb3JkZXIgLS0gc3dhcCB0aHJvdWdoIEFUICovCi0KLSAgICAgIGlmIChhbHBoYV9ub2F0X29uKQotCWFzX2JhZCAoXygibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IikpOwotCi0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX0FUKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfVDExKTsKLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMV0sIEFYUF9SRUdfVDEwKTsKLSAgICAgIGFzc2VtYmxlX3Rva2VucyAoIm1vdiIsIG5ld3RvaywgMiwgMSk7Ci0KLSAgICAgIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIEFYUF9SRUdfQVQpOwotICAgICAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOwotICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoeXIgPT0gQVhQX1JFR19UMTApCi0JewotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1swXSwgQVhQX1JFR19UMTApOwotCSAgc2V0X3Rva19yZWcgKG5ld3Rva1sxXSwgQVhQX1JFR19UMTEpOwotCSAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh4ciAhPSBBWFBfUkVHX1QxMCkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB4cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMCk7Ci0gICAgICAgICAgYXNzZW1ibGVfdG9rZW5zICgibW92IiwgbmV3dG9rLCAyLCAxKTsKLQl9Ci0KLSAgICAgIGlmICh5ciAhPSBBWFBfUkVHX1QxMCAmJiB5ciAhPSBBWFBfUkVHX1QxMSkKLQl7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCB5cik7Ci0JICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBBWFBfUkVHX1QxMSk7Ci0JICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotCX0KLSAgICB9Ci0KLSAgLyogQ2FsbCB0aGUgZGl2aXNpb24gcm91dGluZSAqLwotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1Q5KTsKLSAgc2V0X3Rva19zeW0gKG5ld3Rva1sxXSwgc3ltLCAwKTsKLSAgYXNzZW1ibGVfdG9rZW5zICgianNyIiwgbmV3dG9rLCAyLCAxKTsKLQotICAvKiBSZWxvYWQgdGhlIEdQIHJlZ2lzdGVyICovCi0jaWZkZWYgT0JKX0FPVVQKLUZJWE1FCi0jZW5kaWYKLSNpZiBkZWZpbmVkKE9CSl9FQ09GRikgfHwgZGVmaW5lZChPQkpfRUxGKQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBhbHBoYV9ncF9yZWdpc3Rlcik7Ci0gIHNldF90b2tfY29uc3QgKG5ld3Rva1sxXSwgMCk7Ci0gIHNldF90b2tfcHJlZyAobmV3dG9rWzJdLCBBWFBfUkVHX1Q5KTsKLSAgYXNzZW1ibGVfdG9rZW5zICgibGRncCIsIG5ld3RvaywgMywgMSk7Ci0jZW5kaWYKLQotICAvKiBNb3ZlIHRoZSByZXN1bHQgdG8gdGhlIHJpZ2h0IHBsYWNlICovCi0gIGlmIChyciAhPSBBWFBfUkVHX1QxMikKLSAgICB7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCBBWFBfUkVHX1QxMik7Ci0gICAgICBzZXRfdG9rX3JlZyAobmV3dG9rWzFdLCBycik7Ci0gICAgICBhc3NlbWJsZV90b2tlbnMgKCJtb3YiLCBuZXd0b2ssIDIsIDEpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICFPQkpfRVZBWCAqLwotCi0vKiBUaGUganNyIGFuZCBqbXAgbWFjcm9zIGRpZmZlciBmcm9tIHRoZWlyIGluc3RydWN0aW9uIGNvdW50ZXJwYXJ0cwotICAgaW4gdGhhdCB0aGV5IGNhbiBsb2FkIHRoZSB0YXJnZXQgYWRkcmVzcyBhbmQgZGVmYXVsdCBtb3N0Ci0gICBldmVyeXRoaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWVtaXRfanNyam1wICh0b2ssIG50b2ssIHZvcG5hbWUpCi0gICAgIGNvbnN0IGV4cHJlc3Npb25TICp0b2s7Ci0gICAgIGludCBudG9rOwotICAgICBjb25zdCBQVFIgdm9wbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqb3BuYW1lID0gKGNvbnN0IGNoYXIgKikgdm9wbmFtZTsKLSAgc3RydWN0IGFscGhhX2luc24gaW5zbjsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBpbnQgciwgdG9raWR4ID0gMCwgbGl0dXNlID0gMDsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fcmVnaXN0ZXIpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICByID0gc3RyY21wIChvcG5hbWUsICJqbXAiKSA9PSAwID8gQVhQX1JFR19aRVJPIDogQVhQX1JFR19SQTsKLQotICBzZXRfdG9rX3JlZyAobmV3dG9rWzBdLCByKTsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJgotICAgICAgKHRva1t0b2tpZHhdLlhfb3AgPT0gT19wcmVnaXN0ZXIgfHwgdG9rW3Rva2lkeF0uWF9vcCA9PSBPX2NwcmVnaXN0ZXIpKQotICAgIHIgPSByZWdubyAodG9rW3Rva2lkeCsrXS5YX2FkZF9udW1iZXIpOwotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIGtlZXAgcmVnaXN0ZXIgaWYganNyICRuLjxzeW0+ICAqLwotI2Vsc2UKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBiYXNlcmVnID0gYWxwaGFfZ3BfcmVnaXN0ZXI7Ci0gICAgICBsaXR1c2UgPSBsb2FkX2V4cHJlc3Npb24gKHIgPSBBWFBfUkVHX1BWLCAmdG9rW3Rva2lkeF0sICZiYXNlcmVnLCBOVUxMKTsKLSAgICB9Ci0jZW5kaWYKLQotICBzZXRfdG9rX2NwcmVnIChuZXd0b2tbMV0sIHIpOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgLyogRklYTUU6IEFkZCBoaW50IHJlbG9jcyB0byBCRkQgZm9yIGV2YXguICAqLwotI2Vsc2UKLSAgaWYgKHRva2lkeCA8IG50b2spCi0gICAgbmV3dG9rWzJdID0gdG9rW3Rva2lkeF07Ci0gIGVsc2UKLSNlbmRpZgotICAgIHNldF90b2tfY29uc3QgKG5ld3Rva1syXSwgMCk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zX3RvX2luc24gKG9wbmFtZSwgbmV3dG9rLCAzLCAmaW5zbik7Ci0KLSAgLyogYWRkIHRoZSBMSVRVU0UgZml4dXAgKi8KLSAgaWYgKGxpdHVzZSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc24ubmZpeHVwcyA8IE1BWF9JTlNOX0ZJWFVQUyk7Ci0gICAgICBpZiAoaW5zbi5uZml4dXBzID4gMCkKLQl7Ci0JICBtZW1tb3ZlICgmaW5zbi5maXh1cHNbMV0sICZpbnNuLmZpeHVwc1swXSwKLQkJICAgc2l6ZW9mKHN0cnVjdCBhbHBoYV9maXh1cCkgKiBpbnNuLm5maXh1cHMpOwotCX0KLSAgICAgIGluc24ubmZpeHVwcysrOwotICAgICAgaW5zbi5maXh1cHNbMF0ucmVsb2MgPSBCRkRfUkVMT0NfQUxQSEFfTElUVVNFOwotICAgICAgaW5zbi5maXh1cHNbMF0uZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGluc24uZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAobm93X3NlZyk7Ci0gICAgICBpbnNuLmZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyID0gMzsKLSAgICB9Ci0KLSAgZW1pdF9pbnNuICgmaW5zbik7Ci19Ci0KLS8qIFRoZSByZXQgYW5kIGpjciBpbnN0cnVjdGlvbnMgZGlmZmVyIGZyb20gdGhlaXIgaW5zdHJ1Y3Rpb24KLSAgIGNvdW50ZXJwYXJ0cyBpbiB0aGF0IGV2ZXJ5dGhpbmcgY2FuIGJlIGRlZmF1bHRlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1lbWl0X3JldGpjciAodG9rLCBudG9rLCB2b3BuYW1lKQotICAgICBjb25zdCBleHByZXNzaW9uUyAqdG9rOwotICAgICBpbnQgbnRvazsKLSAgICAgY29uc3QgUFRSIHZvcG5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKm9wbmFtZSA9IChjb25zdCBjaGFyICopdm9wbmFtZTsKLSAgZXhwcmVzc2lvblMgbmV3dG9rWzNdOwotICBpbnQgciwgdG9raWR4ID0gMDsKLQotICBpZiAodG9raWR4IDwgbnRvayAmJiB0b2tbdG9raWR4XS5YX29wID09IE9fcmVnaXN0ZXIpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICByID0gQVhQX1JFR19aRVJPOwotCi0gIHNldF90b2tfcmVnIChuZXd0b2tbMF0sIHIpOwotCi0gIGlmICh0b2tpZHggPCBudG9rICYmCi0gICAgICAodG9rW3Rva2lkeF0uWF9vcCA9PSBPX3ByZWdpc3RlciB8fCB0b2tbdG9raWR4XS5YX29wID09IE9fY3ByZWdpc3RlcikpCi0gICAgciA9IHJlZ25vICh0b2tbdG9raWR4KytdLlhfYWRkX251bWJlcik7Ci0gIGVsc2UKLSAgICByID0gQVhQX1JFR19SQTsKLQotICBzZXRfdG9rX2NwcmVnIChuZXd0b2tbMV0sIHIpOwotCi0gIGlmICh0b2tpZHggPCBudG9rKQotICAgIG5ld3Rva1syXSA9IHRva1t0b2tpZHhdOwotICBlbHNlCi0gICAgc2V0X3Rva19jb25zdCAobmV3dG9rWzJdLCBzdHJjbXAob3BuYW1lLCAicmV0IikgPT0gMCk7Ci0KLSAgYXNzZW1ibGVfdG9rZW5zIChvcG5hbWUsIG5ld3RvaywgMywgMCk7Ci19Ci0MCi0vKiBBc3NlbWJsZXIgZGlyZWN0aXZlcyAqLwotCi0vKiBIYW5kbGUgdGhlIC50ZXh0IHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3RleHQgKGkpCi0gICAgIGludCBpOwotCi17Ci0gIHNfdGV4dCAoaSk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmRhdGEgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIGFscGhhX2luc25fbGFiZWwgYW5kIHJlc3RvcmVzIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZGF0YSAoaSkKLSAgICAgaW50IGk7Ci17Ci0gIHNfZGF0YSAoaSk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUNPRkYpIHx8IGRlZmluZWQgKE9CSl9FVkFYKQotCi0vKiBIYW5kbGUgdGhlIE9TRi8xIGFuZCBvcGVuVk1TIC5jb21tIHBzZXVkbyBxdWlya3MuCi0gICBvcGVuVk1TIGNvbnN0cnVjdHMgYSBzZWN0aW9uIGZvciBldmVyeSBjb21tb24gc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfY29tbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgdGVtcDsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgc2VnVCBuZXdfc2VnOwotI2VuZGlmCi0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIC8qIEFscGhhIE9TRi8xIGNvbXBpbGVyIGRvZXNuJ3QgcHJvdmlkZSB0aGUgY29tbWEsIGdjYyBkb2VzLiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgLyogTWFrZSBhIHNlY3Rpb24gZm9yIHRoZSBjb21tb24gc3ltYm9sLiAgKi8KLSAgbmV3X3NlZyA9IHN1YnNlZ19uZXcgKHhzdHJkdXAgKG5hbWUpLCAwKTsKLSNlbmRpZgotCi0gICpwID0gYzsKLQotI2lmZGVmIE9CSl9FVkFYCi0gIC8qIGFsaWdubWVudCBtaWdodCBmb2xsb3cgICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBvZmZzZXRUIGFsaWduOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsgICAgICAKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIG5ld19zZWcsIGFsaWduKTsKLSAgICB9Ci0jZW5kaWYKLQotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VWQVgKLSAgaWYgKGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgbmV3X3NlZykgPiAwKQotICAgIHsgCi0gICAgICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBuZXdfc2VnKSAhPSB0ZW1wKQotCWFzX2JhZCAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkJKGxvbmcpIGJmZF9zZWN0aW9uX3NpemUgKHN0ZG91dHB1dCwgbmV3X3NlZyksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0jZWxzZQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0jZW5kaWYKLSAgZWxzZQotICAgIHsKLSNpZmRlZiBPQkpfRVZBWCAKLSAgICAgIHN1YnNlZ19zZXQgKG5ld19zZWcsIDApOwotICAgICAgcCA9IGZyYWdfbW9yZSAodGVtcCk7Ci0gICAgICBuZXdfc2VnLT5mbGFncyB8PSBTRUNfSVNfQ09NTU9OOwotICAgICAgaWYgKCEgU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQlTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBuZXdfc2VnKTsKLSNlbHNlCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgdGVtcCk7Ci0jZW5kaWYKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfRVZBWAotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSNlbmRpZgotCi0gIGtub3cgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYgLyogISBPQkpfRUxGICovCi0KLSNpZmRlZiBPQkpfRUNPRkYKLQotLyogSGFuZGxlIHRoZSAucmRhdGEgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIGFscGhhX2luc25fbGFiZWwgYW5kIHJlc3RvcmVzIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfcmRhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfbmV3ICgiLnJkYXRhIiwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VDT0ZGCi0KLS8qIEhhbmRsZSB0aGUgLnNkYXRhIHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyBhbHBoYV9pbnNuX2xhYmVsIGFuZCByZXN0b3JlcyBhdXRvIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NkYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCB0ZW1wOwotCi0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX25ldyAoIi5zZGF0YSIsIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9pbnNuX2xhYmVsID0gTlVMTDsKLSAgYWxwaGFfYXV0b19hbGlnbl9vbiA9IDE7Ci0gIGFscGhhX2N1cnJlbnRfYWxpZ24gPSAwOwotfQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIEhhbmRsZSB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIGFscGhhX2luc25fbGFiZWwgYW5kIHJlc3RvcmVzIGF1dG8gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvYmpfZWxmX3NlY3Rpb24gKGlnbm9yZSk7Ci0KLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIGFscGhhX2F1dG9fYWxpZ25fb24gPSAxOwotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW50IChkdW1teSkKLSAgICAgaW50IGR1bW15OwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbnQgKDApOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbmFtZSwgbmFtZV9lbmQ7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIGlmIChhbHBoYV9jdXJfZW50X3N5bSkKLQkgICAgYXNfd2FybiAoXygibmVzdGVkIC5lbnQgZGlyZWN0aXZlcyIpKTsKLQotCSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgYWxwaGFfY3VyX2VudF9zeW0gPSBzeW07Ci0KLQkgIC8qIFRoZSAuZW50IGRpcmVjdGl2ZSBpcyBzb21ldGltZXMgZm9sbG93ZWQgYnkgYSBudW1iZXIuICBOb3Qgc3VyZQotCSAgICAgd2hhdCBpdCByZWFsbHkgbWVhbnMsIGJ1dCBpZ25vcmUgaXQuICAqLwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCSAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICB9Ci0JICBpZiAoaXNkaWdpdCAoKmlucHV0X2xpbmVfcG9pbnRlcikgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0JICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW5kIChkdW1teSkKLSAgICAgaW50IGR1bW15OwotewotICBpZiAoRUNPRkZfREVCVUdHSU5HKQotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmQgKDApOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbmFtZSwgbmFtZV9lbmQ7Ci0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgICAgaWYgKCEgaXNfbmFtZV9iZWdpbm5lciAoKm5hbWUpKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIikpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzeW07Ci0KLQkgIHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKTsKLQkgIGlmIChzeW0gIT0gYWxwaGFfY3VyX2VudF9zeW0pCi0JICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIG5hbWVzIGRpZmZlcmVudCBzeW1ib2wgdGhhbiAuZW50IikpOwotCi0JICAvKiBDcmVhdGUgYW4gZXhwcmVzc2lvbiB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLQkgIGlmIChzeW0pCi0JICAgIHsKLQkgICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZSA9Ci0JCShleHByZXNzaW9uUyAqKSB4bWFsbG9jIChzaXplb2YgKGV4cHJlc3Npb25TKSk7Ci0JICAgICAgc3ltYm9sX2dldF9vYmogKHN5bSktPnNpemUtPlhfb3AgPSBPX3N1YnRyYWN0OwotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplLT5YX2FkZF9zeW1ib2wKLQkgICAgICAgID0gc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsIGZyYWdfbm93X2ZpeCAoKSwgZnJhZ19ub3cpOwotCSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5zaXplLT5YX29wX3N5bWJvbCA9IHN5bTsKLQkgICAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+c2l6ZS0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgfQotCi0JICBhbHBoYV9jdXJfZW50X3N5bSA9IE5VTEw7Ci0KLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQl9Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbWFzayAoZnApCi0gICAgIGludCBmcDsKLXsKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICB7Ci0gICAgICBpZiAoZnApCi0gICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9mbWFzayAoMCk7Ci0gICAgICBlbHNlCi0gICAgICAgIGVjb2ZmX2RpcmVjdGl2ZV9tYXNrICgwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBkaXNjYXJkX3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZnJhbWUgKGR1bW15KQotICAgICBpbnQgZHVtbXk7Ci17Ci0gIGlmIChFQ09GRl9ERUJVR0dJTkcpCi0gICAgZWNvZmZfZGlyZWN0aXZlX2ZyYW1lICgwKTsKLSAgZWxzZQotICAgIGRpc2NhcmRfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9wcm9sb2d1ZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0gIGludCBhcmc7Ci0KLSAgYXJnID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICBzeW0gPSBlY29mZl9nZXRfY3VyX3Byb2Nfc3ltICgpOwotICBlbHNlCi0gICAgc3ltID0gYWxwaGFfY3VyX2VudF9zeW07Ci0gIGtub3cgKHN5bSAhPSBOVUxMKTsKLQotICBzd2l0Y2ggKGFyZykKLSAgICB7Ci0gICAgICBjYXNlIDA6IC8qIE5vIFBWIHJlcXVpcmVkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfTk9QVik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDE6IC8qIFN0ZCBHUCBsb2FkLiAgKi8KLQlTX1NFVF9PVEhFUiAoc3ltLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDI6IC8qIE5vbi1zdGQgdXNlIG9mIFBWLiAgKi8KLQlicmVhazsKLQotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oIkludmFsaWQgYXJndW1lbnQgJWQgdG8gLnByb2xvZ3VlLiIpLCBhcmcpOwotCWJyZWFrOwotICAgIH0gIAotfQotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9jb2ZmX3dyYXBwZXIgKHdoaWNoKQotICAgICBpbnQgd2hpY2g7Ci17Ci0gIHN0YXRpYyB2b2lkICgqIGNvbnN0IGZuc1tdKSBQQVJBTVMgKChpbnQpKSA9IHsKLSAgICBlY29mZl9kaXJlY3RpdmVfYmVnaW4sCi0gICAgZWNvZmZfZGlyZWN0aXZlX2JlbmQsCi0gICAgZWNvZmZfZGlyZWN0aXZlX2RlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZGltLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV9lbmRlZiwKLSAgICBlY29mZl9kaXJlY3RpdmVfZmlsZSwKLSAgICBlY29mZl9kaXJlY3RpdmVfc2NsLAotICAgIGVjb2ZmX2RpcmVjdGl2ZV90YWcsCi0gICAgZWNvZmZfZGlyZWN0aXZlX3ZhbCwKLSAgICBlY29mZl9kaXJlY3RpdmVfbG9jLAotICB9OwotCi0gIGFzc2VydCAod2hpY2ggPj0gMCAmJiB3aGljaCA8IHNpemVvZihmbnMpL3NpemVvZigqZm5zKSk7Ci0KLSAgaWYgKEVDT0ZGX0RFQlVHR0lORykKLSAgICAoKmZuc1t3aGljaF0pKDApOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFQ09GRiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci19Ci0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgCi0vKiBIYW5kbGUgdGhlIHNlY3Rpb24gc3BlY2lmaWMgcHNldWRvLW9wLiAgKi8KLSAgCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zZWN0aW9uIChzZWNpZCkKLSAgICAgaW50IHNlY2lkOwotewotICBpbnQgdGVtcDsKLSNkZWZpbmUgRVZBWF9TRUNUSU9OX0NPVU5UIDUKLSAgc3RhdGljIGNoYXIgKnNlY3Rpb25fbmFtZVtFVkFYX1NFQ1RJT05fQ09VTlQrMV0gPQotICAgIHsgIk5VTEwiLCAiLnJkYXRhIiwgIi5jb21tIiwgIi5saW5rIiwgIi5jdG9ycyIsICIuZHRvcnMiIH07Ci0KLSAgaWYgKChzZWNpZCA8PSAwKSB8fCAoc2VjaWQgPiBFVkFYX1NFQ1RJT05fQ09VTlQpKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIHNlY3Rpb24gZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgc3Vic2VnX25ldyAoc2VjdGlvbl9uYW1lW3NlY2lkXSwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgYWxwaGFfY3VycmVudF9hbGlnbiA9IDA7Ci19Ci0KLQotLyogUGFyc2UgLmVudCBkaXJlY3RpdmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW50IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLSAgZXhwcmVzc2lvblMgc3ltZXhwcjsKLQotICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVyZWcgPSAtMTsKLSAgYWxwaGFfZXZheF9wcm9jLmZyYW1lc2l6ZSA9IDA7Ci0gIGFscGhhX2V2YXhfcHJvYy5yc2Ffb2Zmc2V0ID0gMDsKLSAgYWxwaGFfZXZheF9wcm9jLnJhX3NhdmUgPSBBWFBfUkVHX1JBOwotICBhbHBoYV9ldmF4X3Byb2MuZnBfc2F2ZSA9IC0xOwotICBhbHBoYV9ldmF4X3Byb2MuaW1hc2sgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MuZm1hc2sgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MucHJvbG9ndWUgPSAwOwotICBhbHBoYV9ldmF4X3Byb2MudHlwZSA9IDA7Ci0KLSAgZXhwcmVzc2lvbiAoJnN5bWV4cHIpOwotCi0gIGlmIChzeW1leHByLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBzeW1ib2wiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmc3ltZXhwcik7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2wpLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gIGFscGhhX2V2YXhfcHJvYy5zeW1ib2wgPSBzeW1ib2w7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotfQotCi0KLS8qIFBhcnNlIC5mcmFtZSA8ZnJhbXJlZz4sPGZyYW1lc2l6ZT4sUkEsPHJzYV9vZmZzZXQ+IGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9mcmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBhbHBoYV9ldmF4X3Byb2MuZnJhbWVyZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDEpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcKLSAgICAgIHx8IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMS4vMi4gcGFyYW0iKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGFscGhhX2V2YXhfcHJvYy5mcmFtZXNpemUgPSB2YWw7Ci0KLSAgKHZvaWQpIHRjX2dldF9yZWdpc3RlciAoMSk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMy4vNC4gcGFyYW0iKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBhbHBoYV9ldmF4X3Byb2MucnNhX29mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfcGRlc2MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLSAgbG9uZyB2YWw7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgc3ltYm9sUyAqZW50cnlfc3ltOwotICBmaXhTICpmaXhwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChhbHBoYV9saW5rX3NlY3Rpb24pOwotCi0gIGlmIChub3dfc2VnICE9IGFscGhhX2xpbmtfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5wZGVzYyBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sID09IDApCi0gICAgICB8fCAoIVNfSVNfREVGSU5FRCAoYWxwaGFfZXZheF9wcm9jLnN5bWJvbCkpKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCIucGRlc2MgaGFzIG5vIG1hdGNoaW5nIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqc3ltYm9sX2dldF9vYmogKGFscGhhX2V2YXhfcHJvYy5zeW1ib2wpID0KLSAgICAodmFsdWVUKSBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZTsKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5wZGVzYyBkaXJlY3RpdmUgaGFzIG5vIGVudHJ5IHN5bWJvbCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVudHJ5X3N5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZleHApOwotICAvKiBTYXZlIGJmZCBzeW1ib2wgb2YgcHJvYyBkZXNjIGluIGZ1bmN0aW9uIHN5bWJvbC4gICovCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChhbHBoYV9ldmF4X3Byb2Muc3ltYm9sKS0+dWRhdGEucAotICAgID0gc3ltYm9sX2dldF9iZmRzeW0gKGVudHJ5X3N5bSk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJObyBjb21tYSBhZnRlciAucGRlc2MgPGVudHJ5bmFtZT4iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG5hbWVfZW5kID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKHN0cm5jbXAobmFtZSwgInN0YWNrIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSBQRFNDX1NfS19LSU5EX0ZQX1NUQUNLOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcChuYW1lLCAicmVnIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQgPSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcChuYW1lLCAibnVsbCIsIDQpID09IDApCi0gICAgewotICAgICAgYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID0gUERTQ19TX0tfS0lORF9OVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIHByb2NlZHVyZSBraW5kIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBmcmFnX2FsaWduICgzLCAwLCAwKTsKLSAgcCA9IGZyYWdfbW9yZSAoMTYpOwotICBmaXhwID0gZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgMCwgMCwgMCwgMCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSAxNjsKLQotICAqcCA9IGFscGhhX2V2YXhfcHJvYy5wZHNja2luZAotICAgICAgIHwgKChhbHBoYV9ldmF4X3Byb2MuZnJhbWVyZWcgPT0gMjkpID8gUERTQ19TX01fQkFTRV9SRUdfSVNfRlAgOiAwKTsKLSAgKihwKzEpID0gUERTQ19TX01fTkFUSVZFCi0JICAgfCBQRFNDX1NfTV9OT19KQUNLRVQ7Ci0KLSAgc3dpdGNoIChhbHBoYV9ldmF4X3Byb2MucGRzY2tpbmQpCi0gICAgewotICAgICAgY2FzZSBQRFNDX1NfS19LSU5EX05VTEw6Ci0JKihwKzIpID0gMDsKLQkqKHArMykgPSAwOwotCWJyZWFrOwotICAgICAgY2FzZSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSOgotCSoocCsyKSA9IGFscGhhX2V2YXhfcHJvYy5mcF9zYXZlOwotCSoocCszKSA9IGFscGhhX2V2YXhfcHJvYy5yYV9zYXZlOwotCWJyZWFrOwotICAgICAgY2FzZSBQRFNDX1NfS19LSU5EX0ZQX1NUQUNLOgotCW1kX251bWJlcl90b19jaGFycyAocCsyLCAodmFsdWVUKWFscGhhX2V2YXhfcHJvYy5yc2Ffb2Zmc2V0LCAyKTsKLQlicmVhazsKLSAgICAgIGRlZmF1bHQ6CQkvKiBpbXBvc3NpYmxlICovCi0JYnJlYWs7Ci0gICAgfQotCi0gICoocCs0KSA9IDA7Ci0gICoocCs1KSA9IGFscGhhX2V2YXhfcHJvYy50eXBlICYgMHgwZjsKLQotICAvKiBTaWduYXR1cmUgb2Zmc2V0LiAgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwKzYsICh2YWx1ZVQpMCwgMik7Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwLWZyYWdfbm93LT5mcl9saXRlcmFsKzgsIDgsICZleHAsIDAsIEJGRF9SRUxPQ182NCk7Ci0KLSAgaWYgKGFscGhhX2V2YXhfcHJvYy5wZHNja2luZCA9PSBQRFNDX1NfS19LSU5EX05VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIEFkZCBkdW1teSBmaXggdG8gbWFrZSBhZGRfdG9fbGlua19wb29sIHdvcmsuICAqLwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgZml4cCA9IGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsIDAsIDAsIDAsIDApOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gODsKLQotICAvKiBwZGVzYysxNjogU2l6ZS4gICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVClhbHBoYV9ldmF4X3Byb2MuZnJhbWVzaXplLCA0KTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNCwgKHZhbHVlVCkwLCAyKTsKLQotICAvKiBFbnRyeSBsZW5ndGguICAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHArNiwgYWxwaGFfZXZheF9wcm9jLnByb2xvZ3VlLCAyKTsKLQotICBpZiAoYWxwaGFfZXZheF9wcm9jLnBkc2NraW5kID09IFBEU0NfU19LX0tJTkRfRlBfUkVHSVNURVIpCi0gICAgcmV0dXJuOwotCi0gIC8qIEFkZCBkdW1teSBmaXggdG8gbWFrZSBhZGRfdG9fbGlua19wb29sIHdvcmsuICAqLwotICBwID0gZnJhZ19tb3JlICg4KTsKLSAgZml4cCA9IGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDgsIDAsIDAsIDAsIDApOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemUgKz0gODsKLQotICAvKiBwZGVzYysyNDogcmVnaXN0ZXIgbWFza3MuICAqLwotCi0gIG1kX251bWJlcl90b19jaGFycyAocCwgYWxwaGFfZXZheF9wcm9jLmltYXNrLCA0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwKzQsIGFscGhhX2V2YXhfcHJvYy5mbWFzaywgNCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLS8qIFN1cHBvcnQgZm9yIGNyYXNoIGRlYnVnIG9uIHZtcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX25hbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChhbHBoYV9saW5rX3NlY3Rpb24pOwotCi0gIGlmIChub3dfc2VnICE9IGFscGhhX2xpbmtfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5uYW1lIGRpcmVjdGl2ZSBub3QgaW4gbGluayAoLmxpbmspIHNlY3Rpb24iKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5uYW1lIGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgZnJhZ19hbGlnbiAoMywgMCwgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKDgpOwotICBzZWdpbmZvLT5saXRlcmFsX3Bvb2xfc2l6ZSArPSA4OwotCi0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgOCwgJmV4cCwgMCwgQkZEX1JFTE9DXzY0KTsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfbGlua2FnZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKnA7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIk5vIHN5bWJvbCBhZnRlciAubGlua2FnZSIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwID0gZnJhZ19tb3JlIChMS1BfU19LX1NJWkUpOwotICAgICAgbWVtc2V0IChwLCAwLCBMS1BfU19LX1NJWkUpOwotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIExLUF9TX0tfU0laRSwgJmV4cCwgMCxcCi0JCSAgIEJGRF9SRUxPQ19BTFBIQV9MSU5LQUdFKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2NvZGVfYWRkcmVzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKnA7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIk5vIHN5bWJvbCBhZnRlciAuY29kZV9hZGRyZXNzIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHAgPSBmcmFnX21vcmUgKDgpOwotICAgICAgbWVtc2V0IChwLCAwLCA4KTsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA4LCAmZXhwLCAwLFwKLQkJICAgQkZEX1JFTE9DX0FMUEhBX0NPREVBRERSKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2ZwX3NhdmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLQotICBhbHBoYV9ldmF4X3Byb2MuZnBfc2F2ZSA9IHRjX2dldF9yZWdpc3RlciAoMSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX21hc2sgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFscGhhX2V2YXhfcHJvYy5pbWFzayA9IHZhbDsKLSAgICAgICh2b2lkKWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZm1hc2sgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICgmdmFsKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5mbWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhbHBoYV9ldmF4X3Byb2MuZm1hc2sgPSB2YWw7Ci0gICAgICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgYzsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBhbHBoYV9ldmF4X3Byb2Muc3ltYm9sID0gMDsKLQotICByZXR1cm47Ci19Ci0KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZmlsZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzOwotICBpbnQgbGVuZ3RoOwotICBzdGF0aWMgY2hhciBjYXNlX2hhY2tbMzJdOwotCi0gIGV4dGVybiBjaGFyICpkZW1hbmRfY29weV9zdHJpbmcgUEFSQU1TICgoaW50ICpsZW5QKSk7Ci0KLSAgc3ByaW50ZiAoY2FzZV9oYWNrLCAiPENBU0U6JTAxZCUwMWQ+IiwKLQkgICBhbHBoYV9mbGFnX2hhc2hfbG9uZ19uYW1lcywgYWxwaGFfZmxhZ19zaG93X2FmdGVyX3RydW5jKTsKLQotICBzID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoY2FzZV9oYWNrKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHMpLT5mbGFncyB8PSBCU0ZfRklMRTsKLQotICBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgcyA9IHN5bWJvbF9maW5kX29yX21ha2UgKGRlbWFuZF9jb3B5X3N0cmluZyAoJmxlbmd0aCkpOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAocyktPmZsYWdzIHw9IEJTRl9GSUxFOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJldHVybjsKLX0KLSNlbmRpZiAvKiBPQkpfRVZBWCAgKi8KLQotLyogSGFuZGxlIHRoZSAuZ3ByZWwzMiBwc2V1ZG8gb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9ncHJlbDMyIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIGNoYXIgKnA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBleHByZXNzaW9uICgmZSk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIHN3aXRjaCAoZS5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBlLlhfYWRkX3N5bWJvbCA9IHNlY3Rpb25fc3ltYm9sKGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgZS5YX29wID0gT19zeW1ib2w7Ci0gICAgICAvKiBGQUxMVEhSVSAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQoKTsKLSAgICB9Ci0jZWxzZQotI2lmZGVmIE9CSl9FQ09GRgotICBzd2l0Y2ggKGUuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgZS5YX2FkZF9zeW1ib2wgPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgZS5YX29wID0gT19zdWJ0cmFjdDsKLSAgICAgIGUuWF9vcF9zeW1ib2wgPSBhbHBoYV9ncF9zeW1ib2w7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotI2VuZGlmCi0jZW5kaWYKLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLSAgICBhbHBoYV9hbGlnbiAoMiwgKGNoYXIgKikgTlVMTCwgYWxwaGFfaW5zbl9sYWJlbCwgMCk7Ci0gIGlmIChhbHBoYV9jdXJyZW50X2FsaWduID4gMikKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gMjsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1lbXNldCAocCwgMCwgNCk7Ci0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkgICAgICAgJmUsIDAsIEJGRF9SRUxPQ19HUFJFTDMyKTsKLX0KLQotLyogSGFuZGxlIGZsb2F0aW5nIHBvaW50IGFsbG9jYXRpb24gcHNldWRvLW9wcy4gIFRoaXMgaXMgbGlrZSB0aGUKLSAgIGdlbmVyaWMgdnJlc2lvbiwgYnV0IGl0IG1ha2VzIHN1cmUgdGhlIGN1cnJlbnQgbGFiZWwsIGlmIGFueSwgaXMKLSAgIGNvcnJlY3RseSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfZmxvYXRfY29ucyAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGludCBsb2dfc2l6ZTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgICBsb2dfc2l6ZSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ0cnOgotICAgICAgbG9nX3NpemUgPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIGxvZ19zaXplID0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotCi0gIGZsb2F0X2NvbnMgKHR5cGUpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5wcm9jIHBzZXVkbyBvcC4gIFdlIGRvbid0IHJlYWxseSBkbyBtdWNoIHdpdGggaXQgZXhjZXB0Ci0gICBwYXJzZSBpdC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3Byb2MgKGlzX3N0YXRpYykKLSAgICAgaW50IGlzX3N0YXRpYzsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBpbnQgdGVtcDsKLQotICAvKiBUYWtlcyAiLnByb2MgbmFtZSxuYXJncyIgICovCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgKnAgPSAwOwotICAgICAgYXNfd2FybiAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICB0ZW1wID0gMDsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgfQotICAvKiAgKnN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKSA9IChzaWduZWQgY2hhcikgdGVtcDsgKi8KLSAgYXNfd2FybiAoXygidW5oYW5kbGVkOiAucHJvYyAlcywlZCIpLCBuYW1lLCB0ZW1wKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuc2V0IHBzZXVkbyBvcC4gIFRoaXMgaXMgdXNlZCB0byB0dXJuIG9uIGFuZCBvZmYgbW9zdCBvZgotICAgdGhlIGFzc2VtYmxlciBmZWF0dXJlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX3NldCAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIGNoYXIgKm5hbWUsIGNoLCAqczsKLSAgaW50IHllc25vID0gMTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgcyA9IG5hbWU7Ci0gIGlmIChzWzBdID09ICduJyAmJiBzWzFdID09ICdvJykKLSAgICB7Ci0gICAgICB5ZXNubyA9IDA7Ci0gICAgICBzICs9IDI7Ci0gICAgfQotICBpZiAoIXN0cmNtcCAoInJlb3JkZXIiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlIGlmICghc3RyY21wICgiYXQiLCBzKSkKLSAgICBhbHBoYV9ub2F0X29uID0gIXllc25vOwotICBlbHNlIGlmICghc3RyY21wICgibWFjcm8iLCBzKSkKLSAgICBhbHBoYV9tYWNyb3Nfb24gPSB5ZXNubzsKLSAgZWxzZSBpZiAoIXN0cmNtcCAoIm1vdmUiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlIGlmICghc3RyY21wICgidm9sYXRpbGUiLCBzKSkKLSAgICAvKiBpZ25vcmUgKi8gOwotICBlbHNlCi0gICAgYXNfd2FybiAoXygiVHJpZWQgdG8gLnNldCB1bnJlY29nbml6ZWQgbW9kZSBgJXMnIiksIG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYmFzZSBwc2V1ZG8gb3AuICBUaGlzIGNoYW5nZXMgdGhlIGFzc2VtYmxlcidzIG5vdGlvbiBvZgotICAgdGhlICRncCByZWdpc3Rlci4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2FscGhhX2Jhc2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSNpZiAwCi0gIGlmIChmaXJzdF8zMmJpdF9xdWFkcmFudCkKLSAgICB7Ci0gICAgICAvKiBub3QgZmF0YWwsIGJ1dCBpdCBtaWdodCBub3Qgd29yayBpbiB0aGUgZW5kICovCi0gICAgICBhc193YXJuIChfKCJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iKSk7Ci0gICAgICBmaXJzdF8zMmJpdF9xdWFkcmFudCA9IDA7Ci0gICAgfQotI2VuZGlmCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJCcpCi0gICAgewkJCQkvKiAkck5OIGZvcm0gKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3InKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBhbHBoYV9ncF9yZWdpc3RlciA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxwaGFfZ3BfcmVnaXN0ZXIgPCAwIHx8IGFscGhhX2dwX3JlZ2lzdGVyID4gMzEpCi0gICAgewotICAgICAgYWxwaGFfZ3BfcmVnaXN0ZXIgPSBBWFBfUkVHX0dQOwotICAgICAgYXNfd2FybiAoXygiQmFkIGJhc2UgcmVnaXN0ZXIsIHVzaW5nICQlZC4iKSwgYWxwaGFfZ3BfcmVnaXN0ZXIpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3AuICBUaGlzIGFsaWducyB0byBhIHBvd2VyIG9mIHR3by4gIEl0Ci0gICBhbHNvIGFkanVzdHMgYW55IGN1cnJlbnQgaW5zdHJ1Y3Rpb24gbGFiZWwuICBXZSB0cmVhdCB0aGlzIHRoZSBzYW1lCi0gICB3YXkgdGhlIE1JUFMgcG9ydCBkb2VzOiAuYWxpZ24gMCB0dXJucyBvZmYgYXV0byBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9hbGlnbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgYWxpZ247Ci0gIGNoYXIgZmlsbCwgKnBmaWxsOwotICBsb25nIG1heF9hbGlnbm1lbnQgPSAxNTsKLQotICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotICAgIHsKLSAgICAgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQiKSwgYWxpZ24pOwotICAgIH0KLSAgZWxzZSBpZiAoYWxpZ24gPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkIikpOwotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBwZmlsbCA9ICZmaWxsOwotICAgIH0KLSAgZWxzZQotICAgIHBmaWxsID0gTlVMTDsKLQotICBpZiAoYWxpZ24gIT0gMCkKLSAgICB7Ci0gICAgICBhbHBoYV9hdXRvX2FsaWduX29uID0gMTsKLSAgICAgIGFscGhhX2FsaWduIChhbGlnbiwgcGZpbGwsIGFscGhhX2luc25fbGFiZWwsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFscGhhX2F1dG9fYWxpZ25fb24gPSAwOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIb29rIHRoZSBub3JtYWwgc3RyaW5nIHByb2Nlc3NvciB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zdHJpbmdlciAodGVybWluYXRlKQotICAgICBpbnQgdGVybWluYXRlOwotewotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIHN0cmluZ2VyICh0ZXJtaW5hdGUpOwotfQotCi0vKiBIb29rIHRoZSBub3JtYWwgc3BhY2UgcHJvY2Vzc2luZyB0byByZXNldCBrbm93biBhbGlnbm1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV9zcGFjZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBhbHBoYV9jdXJyZW50X2FsaWduID0gMDsKLSAgYWxwaGFfaW5zbl9sYWJlbCA9IE5VTEw7Ci0gIHNfc3BhY2UgKGlnbm9yZSk7Ci19Ci0KLS8qIEhvb2sgaW50byBjb25zIGZvciBhdXRvLWFsaWdubWVudC4gICovCi0KLXZvaWQKLWFscGhhX2NvbnNfYWxpZ24gKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBpbnQgbG9nX3NpemU7Ci0KLSAgbG9nX3NpemUgPSAwOwotICB3aGlsZSAoKHNpemUgPj49IDEpICE9IDApCi0gICAgKytsb2dfc2l6ZTsKLQotICBpZiAoYWxwaGFfYXV0b19hbGlnbl9vbiAmJiBhbHBoYV9jdXJyZW50X2FsaWduIDwgbG9nX3NpemUpCi0gICAgYWxwaGFfYWxpZ24gKGxvZ19zaXplLCAoY2hhciAqKSBOVUxMLCBhbHBoYV9pbnNuX2xhYmVsLCAwKTsKLSAgaWYgKGFscGhhX2N1cnJlbnRfYWxpZ24gPiBsb2dfc2l6ZSkKLSAgICBhbHBoYV9jdXJyZW50X2FsaWduID0gbG9nX3NpemU7Ci0gIGFscGhhX2luc25fbGFiZWwgPSBOVUxMOwotfQotCi0vKiBIZXJlIGNvbWUgdGhlIC51d29yZCwgLnVsb25nLCBhbmQgLnVxdWFkIGV4cGxpY2l0bHkgdW5hbGlnbmVkCi0gICBwc2V1ZG9zLiAgV2UganVzdCB0dXJuIG9mZiBhdXRvLWFsaWdubWVudCBhbmQgY2FsbCBkb3duIHRvIGNvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hbHBoYV91Y29ucyAoYnl0ZXMpCi0gICAgIGludCBieXRlczsKLXsKLSAgaW50IGhvbGQgPSBhbHBoYV9hdXRvX2FsaWduX29uOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gMDsKLSAgY29ucyAoYnl0ZXMpOwotICBhbHBoYV9hdXRvX2FsaWduX29uID0gaG9sZDsKLX0KLQotLyogU3dpdGNoIHRoZSB3b3JraW5nIGNwdSB0eXBlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxwaGFfYXJjaCAoaWdub3JlZCkKLSAgICAgaW50IGlnbm9yZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGNoOwotICBjb25zdCBzdHJ1Y3QgY3B1X3R5cGUgKnA7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGZvciAocCA9IGNwdV90eXBlczsgcC0+bmFtZTsgKytwKQotICAgIGlmIChzdHJjbXAobmFtZSwgcC0+bmFtZSkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgYWxwaGFfdGFyZ2V0X25hbWUgPSBwLT5uYW1lLCBhbHBoYV90YXJnZXQgPSBwLT5mbGFnczsKLQlnb3RvIGZvdW5kOwotICAgICAgfQotICBhc193YXJuKCJVbmtub3duIENQVSBpZGVudGlmaWVyIGAlcyciLCBuYW1lKTsKLQotZm91bmQ6Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotDAotCi0jaWZkZWYgREVCVUcxCi0vKiBwcmludCB0b2tlbiBleHByZXNzaW9uIHdpdGggYWxwaGEgc3BlY2lmaWMgZXh0ZW5zaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWFscGhhX3ByaW50X3Rva2VuKGYsIGV4cCkKLSAgICBGSUxFICpmOwotICAgIGNvbnN0IGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICAgIGNhc2UgT19jcHJlZ2lzdGVyOgotCXB1dGMgKCcsJywgZik7Ci0JLyogRkFMTFRIUlUgKi8KLSAgICAgIGNhc2UgT19wcmVnaXN0ZXI6Ci0JcHV0YyAoJygnLCBmKTsKLQl7Ci0JICBleHByZXNzaW9uUyBuZXhwID0gKmV4cDsKLQkgIG5leHAuWF9vcCA9IE9fcmVnaXN0ZXI7Ci0JICBwcmludF9leHByIChmLCAmbmV4cCk7Ci0JfQotCXB1dGMgKCcpJywgZik7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXByaW50X2V4cHIgKGYsIGV4cCk7Ci0JYnJlYWs7Ci0gICAgfQotICByZXR1cm47Ci19Ci0jZW5kaWYKLQwKLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSNpZmRlZiBPQkpfRUNPRkYKLSAgeyJjb21tIiwgc19hbHBoYV9jb21tLCAwfSwJLyogb3NmMSBjb21waWxlciBkb2VzIHRoaXMgKi8KLSAgeyJyZGF0YSIsIHNfYWxwaGFfcmRhdGEsIDB9LAotI2VuZGlmCi0gIHsidGV4dCIsIHNfYWxwaGFfdGV4dCwgMH0sCi0gIHsiZGF0YSIsIHNfYWxwaGFfZGF0YSwgMH0sCi0jaWZkZWYgT0JKX0VDT0ZGCi0gIHsic2RhdGEiLCBzX2FscGhhX3NkYXRhLCAwfSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgeyJzZWN0aW9uIiwgc19hbHBoYV9zZWN0aW9uLCAwfSwKLSAgeyJzZWN0aW9uLnMiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBzX2FscGhhX3NlY3Rpb24sIDB9LAotICB7InNlY3QucyIsIHNfYWxwaGFfc2VjdGlvbiwgMH0sCi0jZW5kaWYKLSNpZmRlZiBPQkpfRVZBWAotICB7ICJwZGVzYyIsIHNfYWxwaGFfcGRlc2MsIDB9LAotICB7ICJuYW1lIiwgc19hbHBoYV9uYW1lLCAwfSwKLSAgeyAibGlua2FnZSIsIHNfYWxwaGFfbGlua2FnZSwgMH0sCi0gIHsgImNvZGVfYWRkcmVzcyIsIHNfYWxwaGFfY29kZV9hZGRyZXNzLCAwfSwKLSAgeyAiZW50Iiwgc19hbHBoYV9lbnQsIDB9LAotICB7ICJmcmFtZSIsIHNfYWxwaGFfZnJhbWUsIDB9LAotICB7ICJmcF9zYXZlIiwgc19hbHBoYV9mcF9zYXZlLCAwfSwKLSAgeyAibWFzayIsIHNfYWxwaGFfbWFzaywgMH0sCi0gIHsgImZtYXNrIiwgc19hbHBoYV9mbWFzaywgMH0sCi0gIHsgImVuZCIsIHNfYWxwaGFfZW5kLCAwfSwKLSAgeyAiZmlsZSIsIHNfYWxwaGFfZmlsZSwgMH0sCi0gIHsgInJkYXRhIiwgc19hbHBoYV9zZWN0aW9uLCAxfSwKLSAgeyAiY29tbSIsIHNfYWxwaGFfY29tbSwgMH0sCi0gIHsgImxpbmsiLCBzX2FscGhhX3NlY3Rpb24sIDN9LAotICB7ICJjdG9ycyIsIHNfYWxwaGFfc2VjdGlvbiwgNH0sCi0gIHsgImR0b3JzIiwgc19hbHBoYV9zZWN0aW9uLCA1fSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgLyogRnJhbWUgcmVsYXRlZCBwc2V1ZG9zLiAgKi8KLSAgeyJlbnQiLCBzX2FscGhhX2VudCwgMH0sCi0gIHsiZW5kIiwgc19hbHBoYV9lbmQsIDB9LAotICB7Im1hc2siLCBzX2FscGhhX21hc2ssIDB9LAotICB7ImZtYXNrIiwgc19hbHBoYV9tYXNrLCAxfSwKLSAgeyJmcmFtZSIsIHNfYWxwaGFfZnJhbWUsIDB9LAotICB7InByb2xvZ3VlIiwgc19hbHBoYV9wcm9sb2d1ZSwgMH0sCi0gIC8qIENPRkYgZGVidWdnaW5nIHJlbGF0ZWQgcHNldWRvcy4gICovCi0gIHsiYmVnaW4iLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMH0sCi0gIHsiYmVuZCIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCAxfSwKLSAgeyJkZWYiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgMn0sCi0gIHsiZGltIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDN9LAotICB7ImVuZGVmIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDR9LAotICB7ImZpbGUiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgNX0sCi0gIHsic2NsIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDZ9LAotICB7InRhZyIsIHNfYWxwaGFfY29mZl93cmFwcGVyLCA3fSwKLSAgeyJ2YWwiLCBzX2FscGhhX2NvZmZfd3JhcHBlciwgOH0sCi0gIHsibG9jIiwgc19hbHBoYV9jb2ZmX3dyYXBwZXIsIDl9LAotI2Vsc2UKLSAgeyJwcm9sb2d1ZSIsIHNfaWdub3JlLCAwfSwKLSNlbmRpZgotICB7ImdwcmVsMzIiLCBzX2FscGhhX2dwcmVsMzIsIDB9LAotICB7InRfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsic19mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJmX2Zsb2F0aW5nIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnRid9LAotICB7ImdfZmxvYXRpbmciLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdHJ30sCi0gIHsiZF9mbG9hdGluZyIsIHNfYWxwaGFfZmxvYXRfY29ucywgJ0QnfSwKLQotICB7InByb2MiLCBzX2FscGhhX3Byb2MsIDB9LAotICB7ImFwcm9jIiwgc19hbHBoYV9wcm9jLCAxfSwKLSAgeyJzZXQiLCBzX2FscGhhX3NldCwgMH0sCi0gIHsicmVndXNlIiwgc19pZ25vcmUsIDB9LAotICB7ImxpdmVyZWciLCBzX2lnbm9yZSwgMH0sCi0gIHsiYmFzZSIsIHNfYWxwaGFfYmFzZSwgMH0sCQkvKj8/Ki8KLSAgeyJvcHRpb24iLCBzX2lnbm9yZSwgMH0sCi0gIHsiYWVudCIsIHNfaWdub3JlLCAwfSwKLSAgeyJ1Z2VuIiwgc19pZ25vcmUsIDB9LAotICB7ImVmbGFnIiwgc19pZ25vcmUsIDB9LAotCi0gIHsiYWxpZ24iLCBzX2FscGhhX2FsaWduLCAwfSwKLSAgeyJkb3VibGUiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmxvYXQiLCBzX2FscGhhX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsic2luZ2xlIiwgc19hbHBoYV9mbG9hdF9jb25zLCAnZid9LAotICB7ImFzY2lpIiwgc19hbHBoYV9zdHJpbmdlciwgMH0sCi0gIHsiYXNjaXoiLCBzX2FscGhhX3N0cmluZ2VyLCAxfSwKLSAgeyJzdHJpbmciLCBzX2FscGhhX3N0cmluZ2VyLCAxfSwKLSAgeyJzcGFjZSIsIHNfYWxwaGFfc3BhY2UsIDB9LAotICB7InNraXAiLCBzX2FscGhhX3NwYWNlLCAwfSwKLSAgeyJ6ZXJvIiwgc19hbHBoYV9zcGFjZSwgMH0sCi0KLS8qIFVuYWxpZ25lZCBkYXRhIHBzZXVkb3MuICAqLwotICB7InV3b3JkIiwgc19hbHBoYV91Y29ucywgMn0sCi0gIHsidWxvbmciLCBzX2FscGhhX3Vjb25zLCA0fSwKLSAgeyJ1cXVhZCIsIHNfYWxwaGFfdWNvbnMsIDh9LAotCi0jaWZkZWYgT0JKX0VMRgotLyogRHdhcmYgd2FudHMgdGhlc2UgdmVyc2lvbnMgb2YgdW5hbGlnbmVkLiAgKi8KLSAgeyIyYnl0ZSIsIHNfYWxwaGFfdWNvbnMsIDJ9LAotICB7IjRieXRlIiwgc19hbHBoYV91Y29ucywgNH0sCi0gIHsiOGJ5dGUiLCBzX2FscGhhX3Vjb25zLCA4fSwKLSNlbmRpZgotCi0vKiBXZSBkb24ndCBkbyBhbnkgb3B0aW1pemluZywgc28gd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlc2UuICAqLwotICB7Im5vYWxpYXMiLCBzX2lnbm9yZSwgMH0sCi0gIHsiYWxpYXMiLCBzX2lnbm9yZSwgMH0sCi0KLSAgeyJhcmNoIiwgc19hbHBoYV9hcmNoLCAwfSwKLQotICB7TlVMTCwgMCwgMH0sCi19OwotCi0MCi0vKiBCdWlsZCBhIEJGRCBzZWN0aW9uIHdpdGggaXRzIGZsYWdzIHNldCBhcHByb3ByaWF0ZWx5IGZvciB0aGUgLmxpdGEsCi0gICAubGl0OCwgb3IgLmxpdDQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY3JlYXRlX2xpdGVyYWxfc2VjdGlvbiAobmFtZSwgc2VjcCwgc3ltcCkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc2VnVCAqc2VjcDsKLSAgICAgc3ltYm9sUyAqKnN5bXA7Ci17Ci0gIHNlZ1QgY3VycmVudF9zZWN0aW9uID0gbm93X3NlZzsKLSAgaW50IGN1cnJlbnRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgc2VnVCBuZXdfc2VjOwotCi0gICpzZWNwID0gbmV3X3NlYyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBuZXdfc2VjLCA0KTsKLSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIG5ld19zZWMsCi0JCQkgU0VDX1JFTE9DIHwgU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVBRE9OTFkKLQkJCSB8IFNFQ19EQVRBKTsKLQotICBTX0NMRUFSX0VYVEVSTkFMICgqc3ltcCA9IHNlY3Rpb25fc3ltYm9sIChuZXdfc2VjKSk7Ci19Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLQotLyogQEBAIEdQIHNlbGVjdGlvbiB2b29kb28uICBBbGwgb2YgdGhpcyBzZWVtcyBvdmVybHkgY29tcGxpY2F0ZWQgYW5kCi0gICB1bm5lY2Vzc2FyeTsgd2hpY2ggaXMgdGhlIHByaW1hcnkgcmVhc29uIGl0J3MgZm9yIEVDT0ZGIG9ubHkuICAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLW1heWJlX3NldF9ncCAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBiZmRfdm1hIHZtYTsKLSAgaWYgKCFzZWMpCi0gICAgcmV0dXJuOwotICB2bWEgPSBiZmRfZ2V0X3NlY3Rpb25fdm1hIChmb28sIHNlYyk7Ci0gIGlmICh2bWEgJiYgdm1hIDwgYWxwaGFfZ3BfdmFsdWUpCi0gICAgYWxwaGFfZ3BfdmFsdWUgPSB2bWE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZWxlY3RfZ3BfdmFsdWUgKCkKLXsKLSAgYXNzZXJ0IChhbHBoYV9ncF92YWx1ZSA9PSAwKTsKLQotICAvKiBHZXQgbWludXMtb25lIGluIHdoYXRldmVyIHdpZHRoLi4uICAqLwotICBhbHBoYV9ncF92YWx1ZSA9IDA7IGFscGhhX2dwX3ZhbHVlLS07Ci0KLSAgLyogU2VsZWN0IHRoZSBzbWFsbGVzdCBWTUEgb2YgdGhlc2UgZXhpc3Rpbmcgc2VjdGlvbnMuICAqLwotICBtYXliZV9zZXRfZ3AgKGFscGhhX2xpdGFfc2VjdGlvbik7Ci0jaWYgMAotICAvKiBUaGVzZSB3ZXJlIGRpc2FibGVkIGJlZm9yZSAtLSBzaG91bGQgd2UgdXNlIHRoZW0/ICAqLwotICBtYXliZV9zZXRfZ3AgKHNkYXRhKTsKLSAgbWF5YmVfc2V0X2dwIChsaXQ4X3NlYyk7Ci0gIG1heWJlX3NldF9ncCAobGl0NF9zZWMpOwotI2VuZGlmCi0KLS8qIEBAIFdpbGwgYSBzaW1wbGUgMHg4MDAwIHdvcmsgaGVyZT8gIElmIG5vdCwgd2h5IG5vdD8gICovCi0jZGVmaW5lIEdQX0FESlVTVE1FTlQJKDB4ODAwMCAtIDB4MTApCi0KLSAgYWxwaGFfZ3BfdmFsdWUgKz0gR1BfQURKVVNUTUVOVDsKLQotICBTX1NFVF9WQUxVRSAoYWxwaGFfZ3Bfc3ltYm9sLCBhbHBoYV9ncF92YWx1ZSk7Ci0KLSNpZmRlZiBERUJVRzEKLSAgcHJpbnRmIChfKCJDaG9zZSBHUCB2YWx1ZSBvZiAlbHhcbiIpLCBhbHBoYV9ncF92YWx1ZSk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBPQkpfRUNPRkYgKi8KLQotLyogQ2FsbGVkIGludGVybmFsbHkgdG8gaGFuZGxlIGFsbCBhbGlnbm1lbnQgbmVlZHMuICBUaGlzIHRha2VzIGNhcmUKLSAgIG9mIGVsaWRpbmcgY2FsbHMgdG8gZnJhZ19hbGlnbiBpZiduIHRoZSBjYWNoZWQgY3VycmVudCBhbGlnbm1lbnQKLSAgIHNheXMgd2UndmUgYWxyZWFkeSBnb3QgaXQsIGFzIHdlbGwgYXMgdGFraW5nIGNhcmUgb2YgdGhlIGF1dG8tYWxpZ24KLSAgIGZlYXR1cmUgd3J0IGxhYmVscy4gICovCi0KLXN0YXRpYyB2b2lkCi1hbHBoYV9hbGlnbiAobiwgcGZpbGwsIGxhYmVsLCBmb3JjZSkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKnBmaWxsOwotICAgICBzeW1ib2xTICpsYWJlbDsKLSAgICAgaW50IGZvcmNlOwotewotICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA+PSBuKQotICAgIHJldHVybjsKLQotICBpZiAocGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA+IDIKLQkgICYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLQl7Ci0JICBzdGF0aWMgY2hhciBjb25zdCB1bm9wWzRdID0geyAweDAwLCAweDAwLCAweGUwLCAweDJmIH07Ci0JICBzdGF0aWMgY2hhciBjb25zdCBub3B1bm9wWzhdID0gewotCQkweDFmLCAweDA0LCAweGZmLCAweDQ3LAotCQkweDAwLCAweDAwLCAweGUwLCAweDJmCi0JICB9OwotCi0JICAvKiBGaXJzdCwgbWFrZSBzdXJlIHdlJ3JlIG9uIGEgZm91ci1ieXRlIGJvdW5kYXJ5LCBpbiBjYXNlCi0JICAgICBzb21lb25lIGhhcyBiZWVuIHB1dHRpbmcgLmJ5dGUgdmFsdWVzIGludG8gdGhlIHRleHQKLQkgICAgIHNlY3Rpb24uICBUaGUgREVDIGFzc2VtYmxlciBzaWxlbnRseSBmaWxscyB3aXRoIHVuYWxpZ25lZAotCSAgICAgbm8tb3AgaW5zdHJ1Y3Rpb25zLiAgVGhpcyB3aWxsIHplcm8tZmlsbCwgdGhlbiBub3AtZmlsbAotCSAgICAgd2l0aCBwcm9wZXIgYWxpZ25tZW50LiAgKi8KLQkgIGlmIChhbHBoYV9jdXJyZW50X2FsaWduIDwgMikKLQkgICAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0JICBpZiAoYWxwaGFfY3VycmVudF9hbGlnbiA8IDMpCi0JICAgIGZyYWdfYWxpZ25fcGF0dGVybiAoMywgdW5vcCwgc2l6ZW9mIHVub3AsIDApOwotCSAgaWYgKG4gPiAzKQotCSAgICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG5vcHVub3AsIHNpemVvZiBub3B1bm9wLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbiAobiwgMCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgZnJhZ19hbGlnbiAobiwgKnBmaWxsLCAwKTsKLQotICBhbHBoYV9jdXJyZW50X2FsaWduID0gbjsKLQotICBpZiAobGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGxhYmVsKSA9PSBub3dfc2VnKTsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGFiZWwsIGZyYWdfbm93KTsKLSAgICAgIFNfU0VUX1ZBTFVFIChsYWJlbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICB9Ci0KLSAgcmVjb3JkX2FsaWdubWVudChub3dfc2VnLCBuKTsKLQotICAvKiA/Pz8gaWYgYWxwaGFfZmxhZ19yZWxheCAmJiBmb3JjZSAmJiBlbGYsIHJlY29yZCB0aGUgcmVxdWVzdGVkIGFsaWdubWVudAotICAgICBpbiBhIHJlbG9jIGZvciB0aGUgbGlua2VyIHRvIHNlZS4gICovCi19Ci0KLS8qIFRoZSBBbHBoYSBoYXMgc3VwcG9ydCBmb3Igc29tZSBWQVggZmxvYXRpbmcgcG9pbnQgdHlwZXMsIGFzIHdlbGwgYXMgZm9yCi0gICBJRUVFIGZsb2F0aW5nIHBvaW50LiAgV2UgY29uc2lkZXIgSUVFRSB0byBiZSB0aGUgcHJpbWFyeSBmbG9hdGluZyBwb2ludAotICAgZm9ybWF0LCBhbmQgc25lYWsgaW4gdGhlIFZBWCBmbG9hdGluZyBwb2ludCBzdXBwb3J0IGhlcmUuICAqLwotI2RlZmluZSBtZF9hdG9mIHZheF9tZF9hdG9mCi0jaW5jbHVkZSAiY29uZmlnL2F0b2YtdmF4LmMiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFscGhhLmggYi9nYXMvY29uZmlnL3RjLWFscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTA1MTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1hbHBoYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1hbHBoYS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiA8cmFlYnVybkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19BTFBIQQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCQliZmRfYXJjaF9hbHBoYQotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lY29mZl9mbGF2b3VyCVwKLQkJICAgICAgID8gImVjb2ZmLWxpdHRsZWFscGhhIgkJCQlcCi0JCSAgICAgICA6IE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cglcCi0JCSAgICAgICA/ICJlbGY2NC1hbHBoYSIJCQkJCVwKLQkJICAgICAgIDogT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2V2YXhfZmxhdm91cglcCi0JCSAgICAgICA/ICJ2bXMtYWxwaGEiCQkJCQlcCi0JCSAgICAgICA6ICJ1bmtub3duLWZvcm1hdCIpCi0KLSNkZWZpbmUgTkVFRF9MSVRFUkFMX1BPT0wKLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0jZGVmaW5lIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0KLWV4dGVybiBpbnQgYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLWV4dGVybiBpbnQgYWxwaGFfZml4X2FkanVzdGFibGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGFscGhhX2dwcm1hc2ssIGFscGhhX2Zwcm1hc2s7Ci1leHRlcm4gdmFsdWVUIGFscGhhX2dwX3ZhbHVlOwotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkJYWxwaGFfZm9yY2VfcmVsb2NhdGlvbiAoRklYUCkKLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYUCkJCWFscGhhX2ZpeF9hZGp1c3RhYmxlIChGSVhQKQotI2RlZmluZSBSRUxPQ19SRVFVSVJFU19TWU1CT0wKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbAotICAgb2JqZWN0IGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuCi0gICBUcnVlIGlmIHdlIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nCi0gICB0aGUgLm8gZmlsZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucy4gICovCi0KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkJCQkJXAotICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQlcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCQkJXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLSAgICAgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYixzLGYpCQlhc19mYXRhbCAoImFscGhhIGNvbnZlcnRfZnJhZ1xuIikKLSNkZWZpbmUgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoZixzKSBcCi0JCQkoYXNfZmF0YWwoImVzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGNhbGxlZCIpLDEpCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2lmZGVmIE9CSl9FVkFYCi0KLS8qIFRoaXMgZmllbGQga2VlcHMgdGhlIHN5bWJvbHMgcG9zaXRpb24gaW4gdGhlIGxpbmsgc2VjdGlvbi4gICovCi0jZGVmaW5lIE9CSl9TWU1GSUVMRF9UWVBFIHZhbHVlVAotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyhGUkFHLE9GRixMRU4sRVhQKSBcCi0gICAgICBmaXhfbmV3X2V4cCAoRlJBRywgT0ZGLCAoaW50KUxFTiwgRVhQLCAwLCBcCi0JTEVOID09IDIgPyBCRkRfUkVMT0NfMTYgXAotCTogTEVOID09IDQgPyBCRkRfUkVMT0NfMzIgXAotCTogTEVOID09IDggPyBCRkRfUkVMT0NfNjQgXAotCTogQkZEX1JFTE9DX0FMUEhBX0xJTktBR0UpOwotI2VuZGlmCi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzCQludW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuCi0KLWV4dGVybiBpbnQgdGNfZ2V0X3JlZ2lzdGVyIFBBUkFNUyAoKGludCBmcmFtZSkpOwotZXh0ZXJuIHZvaWQgYWxwaGFfZnJvYl9lY29mZl9kYXRhIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgYWxwaGFfZGVmaW5lX2xhYmVsIChzeW0pCi1leHRlcm4gdm9pZCBhbHBoYV9kZWZpbmVfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpIGFscGhhX2NvbnNfYWxpZ24gKG5ieXRlcykKLWV4dGVybiB2b2lkIGFscGhhX2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci0KLSNpZmRlZiBPQkpfRUNPRkYKLSNkZWZpbmUgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QoKSBhbHBoYV9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotZXh0ZXJuIHZvaWQgYWxwaGFfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LICAgLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLCAgIFNIVF9QUk9HQklUUywgICBTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfQUxQSEFfR1BSRUwgIH0sIFwKLSAgeyAiLnNic3MiLCAgICBTSFRfTk9CSVRTLCAgICAgU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX0FMUEhBX0dQUkVMICB9LAotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFyYy5jIGIvZ2FzL2NvbmZpZy90Yy1hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhZmVhMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NCArMCwwIEBACi0vKiB0Yy1hcmMuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBBUkMKLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJlbGYvYXJjLmgiCi0KLWV4dGVybiBpbnQgYXJjX2dldF9tYWNoIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgYXJjX2luc24gYXJjX2luc2VydF9vcGVyYW5kIFBBUkFNUyAoKGFyY19pbnNuLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICosIGludCwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqLAotCQkJCQkgICAgb2Zmc2V0VCwgY2hhciAqLCB1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIGFyY19jb21tb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBhcmNfY3B1IFBBUkFNUyAoKGludCkpOwotLypzdGF0aWMgdm9pZCBhcmNfcmVuYW1lIFBBUkFNUyAoKGludCkpOyovCi1zdGF0aWMgaW50IGdldF9hcmNfZXhwX3JlbG9jX3R5cGUgUEFSQU1TICgoaW50LCBpbnQsIGV4cHJlc3Npb25TICosCi0JCQkJCSAgIGV4cHJlc3Npb25TICopKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwIH0sCS8qIERlZmF1bHRpbmcgaXMgaW52YWxpZCAoMCkgKi8KLSAgeyAiY29tbW9uIiwgYXJjX2NvbW1vbiwgMCB9LAotLyp7ICJod29yZCIsIGNvbnMsIDIgfSwgLSBhbHJlYWR5IGV4aXN0cyAqLwotICB7ICJ3b3JkIiwgY29ucywgNCB9LAotLyp7ICJ4d29yZCIsIGNvbnMsIDggfSwqLwotICB7ICJjcHUiLCBhcmNfY3B1LCAwIH0sCi0vKnsgInJlbmFtZSIsIGFyY19yZW5hbWUsIDAgfSwqLwotICB7IE5VTEwsIDAsIDAgfSwKLX07Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjOyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBzdGFydGVkIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMKLSAgIHdvcmsgaWYgJy8nIGlzbid0IG90aGVyd2lzZSBkZWZpbmVkLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRCI7Ci0KLS8qIEJ5dGUgb3JkZXIuICAqLwotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLWNvbnN0IGNoYXIgKmFyY190YXJnZXRfZm9ybWF0ID0gREVGQVVMVF9UQVJHRVRfRk9STUFUOwotc3RhdGljIGludCBieXRlX29yZGVyID0gREVGQVVMVF9CWVRFX09SREVSOwotCi0vKiBPbmUgb2YgYmZkX21hY2hfYXJjX3h4eC4gICovCi1zdGF0aWMgaW50IGFyY19tYWNoX3R5cGUgPSBiZmRfbWFjaF9hcmNfYmFzZTsKLQotLyogTm9uLXplcm8gaWYgdGhlIGNwdSB0eXBlIGhhcyBiZWVuIGV4cGxpY2l0bHkgc3BlY2lmaWVkLiAgKi8KLXN0YXRpYyBpbnQgbWFjaF90eXBlX3NwZWNpZmllZF9wID0gMDsKLQotLyogTm9uLXplcm8gaWYgb3Bjb2RlIHRhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICBBIC5jcHUgY29tbWFuZCBtdXN0IGFwcGVhciBiZWZvcmUgYW55IGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgaW50IGNwdV90YWJsZXNfaW5pdF9wID0gMDsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFyY19zdWZmaXhfaGFzaCA9IE5VTEw7Ci0MCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0jZGVmaW5lIE9QVElPTl9FQiAoT1BUSU9OX01EX0JBU0UgKyAwKQotICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FQn0sCi0jZGVmaW5lIE9QVElPTl9FTCAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7IkVMIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FTH0sCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDAgfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqCi0gKiBJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICogU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLgotICovCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fRUI6Ci0gICAgICBieXRlX29yZGVyID0gQklHX0VORElBTjsKLSAgICAgIGFyY190YXJnZXRfZm9ybWF0ID0gImVsZjMyLWJpZ2FyYyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9FTDoKLSAgICAgIGJ5dGVfb3JkZXIgPSBMSVRUTEVfRU5ESUFOOwotICAgICAgYXJjX3RhcmdldF9mb3JtYXQgPSAiZWxmMzItbGl0dGxlYXJjIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi1BUkMgb3B0aW9uczpcblwKLS1FQgkJCWdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG5cCi0tRUwJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIG91dHB1dFxuIikpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4KLSAgIE9wY29kZSBzZWxlY3Rpb24gaXMgZGVmZXJlZCB1bnRpbCBsYXRlciBiZWNhdXNlIHdlIG1pZ2h0IHNlZSBhIC5jcHUKLSAgIGNvbW1hbmQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICAvKiBUaGUgZW5kaWFubmVzcyBjYW4gYmUgY2hvc2VuICJhdCB0aGUgZmFjdG9yeSIuICAqLwotICB0YXJnZXRfYmlnX2VuZGlhbiA9IGJ5dGVfb3JkZXIgPT0gQklHX0VORElBTjsKLQotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgYXJjX21hY2hfdHlwZSkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogQXNzdW1lIHRoZSBiYXNlIGNwdS4gIFRoaXMgY2FsbCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBuZWVkIHRvCi0gICAgIGluaXRpYWxpemUgYGFyY19vcGVyYW5kX21hcCcgd2hpY2ggbWF5IGJlIG5lZWRlZCBiZWZvcmUgd2Ugc2VlIHRoZQotICAgICBmaXJzdCBpbnNuLiAgKi8KLSAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoYXJjX2dldF9vcGNvZGVfbWFjaCAoYmZkX21hY2hfYXJjX2Jhc2UsCi0JCQkJCSAgICAgICB0YXJnZXRfYmlnX2VuZGlhbikpOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzIG9wY29kZSBhbmQgb3BlcmFuZCB0YWJsZXMuCi0gICBNQUNIIGlzIG9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LiAgKi8KLQotc3RhdGljIHZvaWQKLWluaXRfb3Bjb2RlX3RhYmxlcyAobWFjaCkKLSAgICAgaW50IG1hY2g7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICBjaGFyICpsYXN0OwotCi0gIGlmICgoYXJjX3N1ZmZpeF9oYXNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpKTsKLQotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2FyYywgbWFjaCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgLyogVGhpcyBpbml0aWFsaXplcyBhIGZldyB0aGluZ3MgaW4gYXJjLW9wYy5jIHRoYXQgd2UgbmVlZC4KLSAgICAgVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHZhcmlvdXMgYXJjX3h4eF9zdXBwb3J0ZWQgZm5zLiAgKi8KLSAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoYXJjX2dldF9vcGNvZGVfbWFjaCAobWFjaCwgdGFyZ2V0X2JpZ19lbmRpYW4pKTsKLQotICAvKiBPbmx5IHB1dCB0aGUgZmlyc3QgZW50cnkgb2YgZWFjaCBlcXVpdmFsZW50bHkgbmFtZWQgc3VmZml4IGluIHRoZQotICAgICB0YWJsZS4gICovCi0gIGxhc3QgPSAiIjsKLSAgZm9yIChpID0gMDsgaSA8IGFyY19zdWZmaXhlc19jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIGlmICghIGFyY19vcHZhbF9zdXBwb3J0ZWQgKCZhcmNfc3VmZml4ZXNbaV0pKQotCWNvbnRpbnVlOwotICAgICAgaWYgKHN0cmNtcCAoYXJjX3N1ZmZpeGVzW2ldLm5hbWUsIGxhc3QpICE9IDApCi0JaGFzaF9pbnNlcnQgKGFyY19zdWZmaXhfaGFzaCwgYXJjX3N1ZmZpeGVzW2ldLm5hbWUsIChQVFIpIChhcmNfc3VmZml4ZXMgKyBpKSk7Ci0gICAgICBsYXN0ID0gYXJjX3N1ZmZpeGVzW2ldLm5hbWU7Ci0gICAgfQotCi0gIC8qIFNpbmNlIHJlZ2lzdGVycyBkb24ndCBoYXZlIGEgcHJlZml4LCB3ZSBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCi0gICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcwotICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAgVGhlIHJlY29yZGVkIHJlZ2lzdGVyIG51bWJlciBpcwotICAgICB0aGUgaW5kZXggaW4gYGFyY19yZWdfbmFtZXMnLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGFyY19yZWdfbmFtZXNfY291bnQ7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoISBhcmNfb3B2YWxfc3VwcG9ydGVkICgmYXJjX3JlZ19uYW1lc1tpXSkpCi0JY29udGludWU7Ci0gICAgICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBoZXJlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLQkgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfY3JlYXRlIChhcmNfcmVnX25hbWVzW2ldLm5hbWUsIHJlZ19zZWN0aW9uLAotCQkJCQkgIGksICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICAgIH0KLQotICAvKiBUZWxsIGBzX2NwdScgaXQncyB0b28gbGF0ZS4gICovCi0gIGNwdV90YWJsZXNfaW5pdF9wID0gMTsKLX0KLQwKLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uCi0gICBJZiBSRUcgaXMgbm9uLU5VTEwsIGl0IGlzIGEgcmVnaXN0ZXIgbnVtYmVyIGFuZCBpZ25vcmUgVkFMLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1hcmNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsLCBmaWxlLCBsaW5lKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgb2Zmc2V0VCB2YWw7Ci0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotewotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMikKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TSUdOT1BUKSAhPSAwKQotCSAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0JICBlbHNlCi0JICAgIG1heCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIG1pbiA9IDA7Ci0JfQotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfTkVHQVRJVkUpICE9IDApCi0JdGVzdCA9IC0gdmFsOwotICAgICAgZWxzZQotCXRlc3QgPSB2YWw7Ci0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQl7Ci0JICBjb25zdCBjaGFyICplcnIgPQotCSAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0JICBjaGFyIGJ1ZlsxMDBdOwotCi0JICBzcHJpbnRfdmFsdWUgKGJ1ZiwgdGVzdCk7Ci0JICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCSAgICBhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgZWxzZQotCSAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0gICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIChsb25nKSB2YWwsICZlcnJtc2cpOwotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCWFzX3dhcm4gKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkgICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotLyogV2UgbmVlZCB0byBrZWVwIGEgbGlzdCBvZiBmaXh1cHMuICBXZSBjYW4ndCBzaW1wbHkgZ2VuZXJhdGUgdGhlbSBhcwotICAgd2UgZ28sIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIHVzIHRvIGZpcnN0IGNyZWF0ZSB0aGUgZnJhZywgYW5kCi0gICB0aGF0IHdvdWxkIHNjcmV3IHVwIHJlZmVyZW5jZXMgdG8gYGAuJycuICAqLwotCi1zdHJ1Y3QgYXJjX2ZpeHVwCi17Ci0gIC8qIGluZGV4IGludG8gYGFyY19vcGVyYW5kcycgKi8KLSAgaW50IG9waW5kZXg7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLX07Ci0KLSNkZWZpbmUgTUFYX0ZJWFVQUyA1Ci0KLSNkZWZpbmUgTUFYX1NVRkZJWEVTIDUKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmb3IgZWFjaCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBhcmNfb3Bjb2RlICpvcGNvZGU7Ci0gIGNoYXIgKnN0YXJ0OwotICBhcmNfaW5zbiBpbnNuOwotICBzdGF0aWMgaW50IGluaXRfdGFibGVzX3AgPSAwOwotCi0gIC8qIE9wY29kZSB0YWJsZSBpbml0aWFsaXphdGlvbiBpcyBkZWZlcnJlZCB1bnRpbCBoZXJlIGJlY2F1c2Ugd2UgaGF2ZSB0bwotICAgICB3YWl0IGZvciBhIHBvc3NpYmxlIC5jcHUgY29tbWFuZC4gICovCi0gIGlmICghaW5pdF90YWJsZXNfcCkKLSAgICB7Ci0gICAgICBpbml0X29wY29kZV90YWJsZXMgKGFyY19tYWNoX3R5cGUpOwotICAgICAgaW5pdF90YWJsZXNfcCA9IDE7Ci0gICAgfQotCi0gIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICBzdHIrKzsKLQotICAvKiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdG9yZWQgaW4gbGlzdHMgaGFzaGVkIGJ5IHRoZSBmaXJzdCBsZXR0ZXIgKHRob3VnaAotICAgICB3ZSBuZWVkbid0IGNhcmUgaG93IHRoZXkncmUgaGFzaGVkKS4gIEdldCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuICAqLwotCi0gIG9wY29kZSA9IGFyY19vcGNvZGVfbG9va3VwX2FzbSAoc3RyKTsKLQotICAvKiBLZWVwIGxvb2tpbmcgdW50aWwgd2UgZmluZCBhIG1hdGNoLiAgKi8KLQotICBzdGFydCA9IHN0cjsKLSAgZm9yICggOyBvcGNvZGUgIT0gTlVMTDsgb3Bjb2RlID0gQVJDX09QQ09ERV9ORVhUX0FTTSAob3Bjb2RlKSkKLSAgICB7Ci0gICAgICBpbnQgcGFzdF9vcGNvZGVfcCwgZmMsIG51bV9zdWZmaXhlczsKLSAgICAgIGNoYXIgKnN5bjsKLSAgICAgIHN0cnVjdCBhcmNfZml4dXAgZml4dXBzW01BWF9GSVhVUFNdOwotICAgICAgLyogVXNlZCBhcyBhIHNhbml0eSBjaGVjay4gIElmIHdlIG5lZWQgYSBsaW1tIHJlbG9jLCBtYWtlIHN1cmUgd2UgYXNrCi0JIGZvciBhbiBleHRyYSA0IGJ5dGVzIGZyb20gZnJhZ19tb3JlLiAgKi8KLSAgICAgIGludCBsaW1tX3JlbG9jX3A7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmluc25fc3VmZml4ZXNbTUFYX1NVRkZJWEVTXTsKLQotICAgICAgLyogSXMgdGhpcyBvcGNvZGUgc3VwcG9ydGVkIGJ5IHRoZSBzZWxlY3RlZCBjcHU/ICAqLwotICAgICAgaWYgKCEgYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNjYW4gdGhlIHN5bnRheCBzdHJpbmcuICBJZiBpdCBkb2Vzbid0IG1hdGNoLCB0cnkgdGhlIG5leHQgb25lLiAgKi8KLQotICAgICAgYXJjX29wY29kZV9pbml0X2luc2VydCAoKTsKLSAgICAgIGluc24gPSBvcGNvZGUtPnZhbHVlOwotICAgICAgZmMgPSAwOwotICAgICAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0gICAgICBudW1fc3VmZml4ZXMgPSAwOwotICAgICAgbGltbV9yZWxvY19wID0gMDsKLQotICAgICAgLyogV2UgZG9uJ3QgY2hlY2sgZm9yICgqc3RyICE9ICdcMCcpIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIHBhcnNlCi0JIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0gICAgICBmb3IgKHN0ciA9IHN0YXJ0LCBzeW4gPSBvcGNvZGUtPnN5bnRheDsgKnN5biAhPSAnXDAnOyApCi0JewotCSAgaW50IG1vZHM7Ci0JICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgIC8qIE5vbiBvcGVyYW5kIGNoYXJzIG11c3QgbWF0Y2ggZXhhY3RseS4gICovCi0JICBpZiAoKnN5biAhPSAnJScgfHwgKisrc3luID09ICclJykKLQkgICAgewotCSAgICAgIC8qIEhhbmRsZSAnKycgc3BlY2lhbGx5IGFzIHdlIHdhbnQgdG8gYWxsb3cgImxkIHIwLFtzcC00XSIuICAqLwotCSAgICAgIC8qID8/PyBUaGUgc3ludGF4IGhhcyBjaGFuZ2VkIHRvIFtzcCwtNF0uICAqLwotCSAgICAgIGlmICgwICYmICpzeW4gPT0gJysnICYmICpzdHIgPT0gJy0nKQotCQl7Ci0JCSAgLyogU2tpcCBvdmVyIHN5bidzICssIGJ1dCBsZWF2ZSBzdHIncyAtIGFsb25lLgotCQkgICAgIFRoYXQgbWFrZXMgdGhlIGNhc2UgaWRlbnRpY2FsIHRvICJsZCByMCxbc3ArLTRdIi4gICovCi0JCSAgKytzeW47Ci0JCX0KLQkgICAgICBlbHNlIGlmICgqc3RyID09ICpzeW4pCi0JCXsKLQkJICBpZiAoKnN5biA9PSAnICcpCi0JCSAgICBwYXN0X29wY29kZV9wID0gMTsKLQkJICArK3N5bjsKLQkJICArK3N0cjsKLQkJfQotCSAgICAgIGVsc2UKLQkJYnJlYWs7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogV2UgaGF2ZSBhbiBvcGVyYW5kLiAgUGljayBvdXQgYW55IG1vZGlmaWVycy4gICovCi0JICBtb2RzID0gMDsKLQkgIHdoaWxlIChBUkNfTU9EX1AgKGFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbKnN5bl1dLmZsYWdzKSkKLQkgICAgewotCSAgICAgIG1vZHMgfD0gYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFsqc3luXV0uZmxhZ3MgJiBBUkNfTU9EX0JJVFM7Ci0JICAgICAgKytzeW47Ci0JICAgIH0KLQkgIG9wZXJhbmQgPSBhcmNfb3BlcmFuZHMgKyBhcmNfb3BlcmFuZF9tYXBbKnN5bl07Ci0JICBpZiAob3BlcmFuZC0+Zm10ID09IDApCi0JICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIHN5bnRheCBmb3JtYXQgY2hhcmFjdGVyIGAlYyciKSwgKnN5bik7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0ZBS0UpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICplcnJtc2cgPSBOVUxMOwotCSAgICAgIGlmIChvcGVyYW5kLT5pbnNlcnQpCi0JCXsKLQkJICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBOVUxMLCAwLCAmZXJybXNnKTsKLQkJICAvKiBJZiB3ZSBnZXQgYW4gZXJyb3IsIGdvIG9uIHRvIHRyeSB0aGUgbmV4dCBpbnNuLiAgKi8KLQkJICBpZiAoZXJybXNnKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgICArK3N5bjsKLQkgICAgfQotCSAgLyogQXJlIHdlIGZpbmlzaGVkIHdpdGggc3VmZml4ZXM/ICAqLwotCSAgZWxzZSBpZiAoIXBhc3Rfb3Bjb2RlX3ApCi0JICAgIHsKLQkgICAgICBpbnQgZm91bmQ7Ci0JICAgICAgY2hhciBjOwotCSAgICAgIGNoYXIgKnMsKnQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpzdWYsKnN1ZmZpeCwqc3VmZml4X2VuZDsKLQotCSAgICAgIGlmICghKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKSkKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICAvKiBJZiB3ZSdyZSBhdCBhIHNwYWNlIGluIHRoZSBpbnB1dCBzdHJpbmcsIHdlIHdhbnQgdG8gc2tpcCB0aGUKLQkJIHJlbWFpbmluZyBzdWZmaXhlcy4gIFRoZXJlIG1heSBiZSBzb21lIGZha2Ugb25lcyB0aG91Z2gsIHNvCi0JCSBqdXN0IGdvIG9uIHRvIHRyeSB0aGUgbmV4dCBvbmUuICAqLwotCSAgICAgIGlmICgqc3RyID09ICcgJykKLQkJewotCQkgICsrc3luOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgICBzID0gc3RyOwotCSAgICAgIGlmIChtb2RzICYgQVJDX01PRF9ET1QpCi0JCXsKLQkJICBpZiAoKnMgIT0gJy4nKQotCQkgICAgYnJlYWs7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogVGhpcyBjYW4gaGFwcGVuIGluICJiLm5kIGZvbyIgYW5kIHdlJ3JlIGN1cnJlbnRseSBsb29raW5nCi0JCSAgICAgZm9yICIlcSIgKGllOiBhIGNvbmRpdGlvbiBjb2RlIHN1ZmZpeCkuICAqLwotCQkgIGlmICgqcyA9PSAnLicpCi0JCSAgICB7Ci0JCSAgICAgICsrc3luOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogUGljayB0aGUgc3VmZml4IG91dCBhbmQgbG9vayBpdCB1cCB2aWEgdGhlIGhhc2ggdGFibGUuICAqLwotCSAgICAgIGZvciAodCA9IHM7ICp0ICYmIGlzYWxwaGEgKCp0KTsgKyt0KQotCQljb250aW51ZTsKLQkgICAgICBjID0gKnQ7Ci0JICAgICAgKnQgPSAnXDAnOwotCSAgICAgIHN1ZiA9IGhhc2hfZmluZCAoYXJjX3N1ZmZpeF9oYXNoLCBzKTsKLQkgICAgICAqdCA9IGM7Ci0JICAgICAgaWYgKCFzdWYpCi0JCXsKLQkJICAvKiBUaGlzIGNhbiBoYXBwZW4gaW4gImJsbGUgZm9vIiBhbmQgd2UncmUgY3VycmVudGx5IHVzaW5nCi0JCSAgICAgdGhlIHRlbXBsYXRlICJiJXElLm4gJWoiLiAgVGhlICJibCIgaW5zbiBvY2N1cnMgbGF0ZXIgaW4KLQkJICAgICB0aGUgdGFibGUgc28gImxsZSIgaXNuJ3QgYW4gaWxsZWdhbCBzdWZmaXguICAqLwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBJcyBpdCB0aGUgcmlnaHQgdHlwZT8gIE5vdGUgdGhhdCB0aGUgc2FtZSBjaGFyYWN0ZXIgaXMgdXNlZAotCSAgICAgICAgIHNldmVyYWwgdGltZXMsIHNvIHdlIGhhdmUgdG8gZXhhbWluZSBhbGwgb2YgdGhlbS4gIFRoaXMgaXMKLQkJIHJlbGF0aXZlbHkgZWZmaWNpZW50IGFzIGVxdWl2YWxlbnQgZW50cmllcyBhcmUga2VwdAotCQkgdG9nZXRoZXIuICBJZiBpdCdzIG5vdCB0aGUgcmlnaHQgdHlwZSwgZG9uJ3QgaW5jcmVtZW50IGBzdHInCi0JCSBzbyB3ZSB0cnkgdGhlIG5leHQgb25lIGluIHRoZSBzZXJpZXMuICAqLwotCSAgICAgIGZvdW5kID0gMDsKLQkgICAgICBzdWZmaXhfZW5kID0gYXJjX3N1ZmZpeGVzICsgYXJjX3N1ZmZpeGVzX2NvdW50OwotCSAgICAgIGZvciAoc3VmZml4ID0gc3VmOwotCQkgICBzdWZmaXggPCBzdWZmaXhfZW5kICYmIHN0cmNtcCAoc3VmZml4LT5uYW1lLCBzdWYtPm5hbWUpID09IDA7Ci0JCSAgICsrc3VmZml4KQotCQl7Ci0JCSAgaWYgKGFyY19vcGVyYW5kc1tzdWZmaXgtPnR5cGVdLmZtdCA9PSAqc3luKQotCQkgICAgewotCQkgICAgICAvKiBJbnNlcnQgdGhlIHN1ZmZpeCdzIHZhbHVlIGludG8gdGhlIGluc24uICAqLwotCQkgICAgICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotCQkJaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgb3BlcmFuZCwKLQkJCQkJCSAgIG1vZHMsIE5VTEwsIHN1ZmZpeC0+dmFsdWUsCi0JCQkJCQkgICBOVUxMKTsKLQkJICAgICAgZWxzZQotCQkJaW5zbiB8PSBzdWZmaXgtPnZhbHVlIDw8IG9wZXJhbmQtPnNoaWZ0OwotCi0JCSAgICAgIHN0ciA9IHQ7Ci0JCSAgICAgIGZvdW5kID0gMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICArK3N5bjsKLQkgICAgICBpZiAoIWZvdW5kKQotCQk7IC8qIFdyb25nIHR5cGUuICBKdXN0IGdvIG9uIHRvIHRyeSBuZXh0IGluc24gZW50cnkuICAqLwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChudW1fc3VmZml4ZXMgPT0gTUFYX1NVRkZJWEVTKQotCQkgICAgYXNfYmFkIChfKCJ0b28gbWFueSBzdWZmaXhlcyIpKTsKLQkJICBlbHNlCi0JCSAgICBpbnNuX3N1ZmZpeGVzW251bV9zdWZmaXhlcysrXSA9IHN1ZmZpeDsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIFRoaXMgaXMgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gZXhwcmVzc2lvbiBvZiBzb21lIGtpbmQuICAqLwotCSAgICB7Ci0JICAgICAgY2hhciBjOwotCSAgICAgIGNoYXIgKmhvbGQ7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcgPSBOVUxMOwotCSAgICAgIGxvbmcgdmFsdWUgPSAwOwotCSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NVRkZJWCkKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICAvKiBJcyB0aGVyZSBhbnl0aGluZyBsZWZ0IHRvIHBhcnNlPwotCQkgV2UgZG9uJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIHRvcCBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLQkJIGFueSB0cmFpbGluZyBmYWtlIGFyZ3VtZW50cyBpbiB0aGUgc3ludGF4IHN0cmluZy4gICovCi0JICAgICAgaWYgKCpzdHIgPT0gJ1wwJykKLQkJYnJlYWs7Ci0jaWYgMAotCSAgICAgIC8qIElzIHRoaXMgYSBzeW50YXggY2hhcmFjdGVyPyAgRWc6IGlzIHRoZXJlIGEgJ1snIHByZXNlbnQgd2hlbgotCQkgdGhlcmUgc2hvdWxkbid0IGJlPyAgKi8KLQkgICAgICBpZiAoIWlzYWxudW0gKCpzdHIpCi0JCSAgLyogJy4nIGFzIGluICIuTExDMCIgKi8KLQkJICAmJiAqc3RyICE9ICcuJwotCQkgIC8qICdfJyBhcyBpbiAiX3ByaW50IiAqLwotCQkgICYmICpzdHIgIT0gJ18nCi0JCSAgLyogJy0nIGFzIGluICJbZnAsLTRdIiAqLwotCQkgICYmICpzdHIgIT0gJy0nCi0JCSAgLyogJyUnIGFzIGluICIlaWEoX2Z1bmMpIiAqLwotCQkgICYmICpzdHIgIT0gJyUnKQotCQlicmVhazsKLSNlbmRpZgotCi0JICAgICAgLyogUGFyc2UgdGhlIG9wZXJhbmQuICAqLwotCSAgICAgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotCSAgICAgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0JICAgICAgaWYgKGV4cC5YX29wID09IE9faWxsZWdhbCkKLQkJYXNfYmFkIChfKCJpbGxlZ2FsIG9wZXJhbmQiKSk7Ci0JICAgICAgZWxzZSBpZiAoZXhwLlhfb3AgPT0gT19hYnNlbnQpCi0JCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCSAgICAgIGVsc2UgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICB2YWx1ZSA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX3JlZ2lzdGVyKQotCQl7Ci0JCSAgcmVnID0gYXJjX3JlZ19uYW1lcyArIGV4cC5YX2FkZF9udW1iZXI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JCSAgaWYgKGZjID49IE1BWF9GSVhVUFMpCi0JCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCQkgIGZpeHVwc1tmY10uZXhwID0gZXhwOwotCi0JCSAgLyogSWYgdGhpcyBpcyBhIHJlZ2lzdGVyIGNvbnN0YW50IChJRTogb25lIHdob3NlCi0JCSAgICAgcmVnaXN0ZXIgdmFsdWUgZ2V0cyBzdG9yZWQgYXMgNjEtNjMpIHRoZW4gdGhpcwotCQkgICAgIG11c3QgYmUgYSBsaW1tLiAgV2UgZG9uJ3Qgc3VwcG9ydCBzaGltbSByZWxvY3MuICAqLwotCQkgIC8qID8/PyBUaGlzIGJpdCBjb3VsZCB1c2Ugc29tZSBjbGVhbmluZyB1cC4KLQkJICAgICBSZWZlcmVuY2luZyB0aGUgZm9ybWF0IGNoYXJzIGxpa2UgdGhpcyBnb2VzCi0JCSAgICAgYWdhaW5zdCBzdHlsZS4gICovCi0jZGVmaW5lIElTX1JFR19PUEVSQU5EKG8pICgobykgPT0gJ2EnIHx8IChvKSA9PSAnYicgfHwgKG8pID09ICdjJykKLQkJICBpZiAoSVNfUkVHX09QRVJBTkQgKCpzeW4pKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpqdW5rOwotCi0JCSAgICAgIGZpeHVwc1tmY10ub3BpbmRleCA9IGFyY19vcGVyYW5kX21hcFsnTCddOwotCQkgICAgICBsaW1tX3JlbG9jX3AgPSAxOwotCQkgICAgICAvKiBUZWxsIGluc2VydF9yZWcgd2UgbmVlZCBhIGxpbW0uICBUaGlzIGlzCi0JCQkgbmVlZGVkIGJlY2F1c2UgdGhlIHZhbHVlIGF0IHRoaXMgcG9pbnQgaXMKLQkJCSB6ZXJvLCBhIHNoaW1tLiAgKi8KLQkJICAgICAgLyogPz8/IFdlIG5lZWQgYSBjbGVhbmVyIGludGVyZmFjZSB0aGFuIHRoaXMuICAqLwotCQkgICAgICAoKmFyY19vcGVyYW5kc1thcmNfb3BlcmFuZF9tYXBbJ1EnXV0uaW5zZXJ0KQotCQkJKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgMEwsICZqdW5rKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBmaXh1cHNbZmNdLm9waW5kZXggPSBhcmNfb3BlcmFuZF9tYXBbKnN5bl07Ci0JCSAgKytmYzsKLQkJICB2YWx1ZSA9IDA7Ci0JCX0KLQotCSAgICAgIC8qIEluc2VydCB0aGUgcmVnaXN0ZXIgb3IgZXhwcmVzc2lvbiBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmluc2VydCkKLQkJewotCQkgIGNvbnN0IGNoYXIgKmVycm1zZyA9IE5VTEw7Ci0JCSAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgb3BlcmFuZCwgbW9kcywKLQkJCQkJICAgICByZWcsIChsb25nKSB2YWx1ZSwgJmVycm1zZyk7Ci0jaWYgMAotCQkgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJICAgIGFzX3dhcm4gKGVycm1zZyk7Ci0jZW5kaWYKLQkJICAvKiBGSVhNRTogV2Ugd2FudCB0byB0cnkgc2hpbW0gaW5zbnMgZm9yIGxpbW0gb25lcy4gIEJ1dCBpZgotCQkgICAgIHRoZSBjb25zdGFudCB3b24ndCBmaXQsIHdlIG11c3QgZ28gb24gdG8gdHJ5IHRoZSBuZXh0Ci0JCSAgICAgcG9zc2liaWxpdHkuICBXaGVyZSBkbyB3ZSBpc3N1ZSB3YXJuaW5ncyBmb3IgY29uc3RhbnRzCi0JCSAgICAgdGhhdCBhcmUgdG9vIGJpZyB0aGVuPyAgQXQgcHJlc2VudCwgd2UnbGwgZmxhZyB0aGUgaW5zbgotCQkgICAgIGFzIHVucmVjb2duaXphYmxlISAgTWF5YmUgaGF2ZSB0aGUgImJhZCBpbnN0cnVjdGlvbiIKLQkJICAgICBlcnJvciBtZXNzYWdlIGluY2x1ZGUgb3VyIGBlcnJtc2cnPyAgKi8KLQkJICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgIGVsc2UKLQkJaW5zbiB8PSAodmFsdWUgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0KLQkgICAgICArK3N5bjsKLQkgICAgfQotCX0KLQotICAgICAgLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3ludGF4IHN0cmluZywgd2UncmUgZG9uZS4gICovCi0gICAgICAvKiBGSVhNRTogdHJ5IHRvIG1vdmUgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uLiAgKi8KLSAgICAgIGlmICgqc3luID09ICdcMCcpCi0JewotCSAgaW50IGk7Ci0JICBjaGFyICpmOwotCSAgbG9uZyBsaW1tLCBsaW1tX3A7Ci0KLQkgIC8qIEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4gYmxhbmtzCi0JICAgICBub3cuICBJRTogV2UgbmVlZG4ndCB0cnkgYWdhaW4gd2l0aCBhIGxvbmdlciB2ZXJzaW9uIG9mIHRoZQotCSAgICAgaW5zbiBhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IGxvbmdlciB2ZXJzaW9ucyBvZiBpbnNucyBhcHBlYXIKLQkgICAgIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KLQotCSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotCSAgICArK3N0cjsKLQotCSAgaWYgKCpzdHIgIT0gJ1wwJykKLQkgICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLQkgIC8qIElzIHRoZXJlIGEgbGltbSB2YWx1ZT8gICovCi0JICBsaW1tX3AgPSBhcmNfb3Bjb2RlX2xpbW1fcCAoJmxpbW0pOwotCi0JICAvKiBQZXJmb3JtIHZhcmlvdXMgZXJyb3IgYW5kIHdhcm5pbmcgdGVzdHMuICAqLwotCi0JICB7Ci0JICAgIHN0YXRpYyBpbnQgaW5fZGVsYXlfc2xvdF9wID0gMDsKLQkgICAgc3RhdGljIGludCBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3AgPSAwOwotCSAgICAvKiBkZWxheSBzbG90IHR5cGUgc2VlbiAqLwotCSAgICBpbnQgZGVsYXlfc2xvdF90eXBlID0gQVJDX0RFTEFZX05PTkU7Ci0JICAgIC8qIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBmbGFnIHNlZW4gKi8KLQkgICAgaW50IGNvbmRpdGlvbmFsID0gMDsKLQkgICAgLyogMSBpZiBjb25kaXRpb24gY29kZXMgYXJlIGJlaW5nIHNldCAqLwotCSAgICBpbnQgY2Nfc2V0X3AgPSAwOwotCSAgICAvKiAxIGlmIGNvbmRpdGlvbmFsIGJyYW5jaCwgaW5jbHVkaW5nIGBiJyAiYnJhbmNoIGFsd2F5cyIgKi8KLQkgICAgaW50IGNvbmRfYnJhbmNoX3AgPSBvcGNvZGUtPmZsYWdzICYgQVJDX09QQ09ERV9DT05EX0JSQU5DSDsKLQkgICAgaW50IG5lZWRfY2Nfbm9wX3AgPSAwOwotCi0JICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3VmZml4ZXM7ICsraSkKLQkgICAgICB7Ci0JCXN3aXRjaCAoYXJjX29wZXJhbmRzW2luc25fc3VmZml4ZXNbaV0tPnR5cGVdLmZtdCkKLQkJICB7Ci0JCSAgY2FzZSAnbicgOgotCQkgICAgZGVsYXlfc2xvdF90eXBlID0gaW5zbl9zdWZmaXhlc1tpXS0+dmFsdWU7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICdxJyA6Ci0JCSAgICBjb25kaXRpb25hbCA9IGluc25fc3VmZml4ZXNbaV0tPnZhbHVlOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnZicgOgotCQkgICAgY2Nfc2V0X3AgPSAxOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICAvKiBQdXR0aW5nIGFuIGluc24gd2l0aCBhIGxpbW0gdmFsdWUgaW4gYSBkZWxheSBzbG90IGlzIHN1cHBvc2VkIHRvCi0JICAgICAgIGJlIGxlZ2FsLCBidXQgbGV0J3Mgd2FybiB0aGUgdXNlciBhbnl3YXkuICBEaXR0byBmb3IgOCBieXRlCi0JICAgICAgIGp1bXBzIHdpdGggZGVsYXkgc2xvdHMuICAqLwotCSAgICBpZiAoaW5fZGVsYXlfc2xvdF9wICYmIGxpbW1fcCkKLQkgICAgICBhc193YXJuIChfKCI4IGJ5dGUgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIpKTsKLQkgICAgaWYgKGRlbGF5X3Nsb3RfdHlwZSAhPSBBUkNfREVMQVlfTk9ORSAmJiBsaW1tX3ApCi0JICAgICAgYXNfd2FybiAoXygiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IikpOwotCSAgICBpbl9kZWxheV9zbG90X3AgPSAoZGVsYXlfc2xvdF90eXBlICE9IEFSQ19ERUxBWV9OT05FKSAmJiAhbGltbV9wOwotCi0JICAgIC8qIFdhcm4gd2hlbiBhIGNvbmRpdGlvbmFsIGJyYW5jaCBpbW1lZGlhdGVseSBmb2xsb3dzIGEgc2V0IG9mCi0JICAgICAgIHRoZSBjb25kaXRpb24gY29kZXMuICBOb3RlIHRoYXQgdGhpcyBuZWVkbid0IGJlIGRvbmUgaWYgdGhlCi0JICAgICAgIGluc24gdGhhdCBzZXRzIHRoZSBjb25kaXRpb24gY29kZXMgdXNlcyBhIGxpbW0uICAqLwotCSAgICBpZiAoY29uZF9icmFuY2hfcCAmJiBjb25kaXRpb25hbCAhPSAwIC8qIDAgPSAiYWx3YXlzIiAqLwotCQkmJiBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3ApCi0JICAgICAgYXNfd2FybiAoXygiY29uZGl0aW9uYWwgYnJhbmNoIGZvbGxvd3Mgc2V0IG9mIGZsYWdzIikpOwotCSAgICBwcmV2X2luc25fbmVlZHNfY2Nfbm9wX3AgPSBjY19zZXRfcCAmJiAhbGltbV9wOwotCSAgfQotCi0JICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLgotCSAgICAgSXQgaXMgaW1wb3J0YW50IHRvIGZldGNoIGVub3VnaCBzcGFjZSBpbiBvbmUgY2FsbCB0byBgZnJhZ19tb3JlJy4KLQkgICAgIFdlIHVzZSAoZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSB0byBjb21wdXRlIHdoZXJlIHdlIGFyZSBhbmQgd2UKLQkgICAgIGRvbid0IHdhbnQgZnJhZ19ub3cgdG8gY2hhbmdlIGJldHdlZW4gY2FsbHMuICAqLwotCSAgaWYgKGxpbW1fcCkKLQkgICAgewotCSAgICAgIGYgPSBmcmFnX21vcmUgKDgpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmICsgNCwgbGltbSwgNCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGxpbW1fcmVsb2NfcCkKLQkgICAgewotCSAgICAgIC8qIFdlIG5lZWQgYSBsaW1tIHJlbG9jLCBidXQgdGhlIHRhYmxlcyB0aGluayB3ZSBkb24ndC4gICovCi0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGYgPSBmcmFnX21vcmUgKDQpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0JICAgIH0KLQotCSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IGZjOyArK2kpCi0JICAgIHsKLQkgICAgICBpbnQgb3BfdHlwZSwgcmVsb2NfdHlwZTsKLQkgICAgICBleHByZXNzaW9uUyBleHB0bXA7Ci0JICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotCi0JICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoaXMgb3BlcmFuZC4KLQkJIEF0IHRoaXMgcG9pbnQgd2UgZG8gbm90IHVzZSBhIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmb3IKLQkJIG9wZXJhbmRzIHJlc2lkaW5nIGluIHRoZSBpbnNuLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLQkJIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5IGhhbmRsZSBmaXh1cHMgZm9yIGFueQotCQkgb3BlcmFuZCB0eXBlLCBhbHRob3VnaCB0aGF0IGlzIGFkbWl0dGVkbHkgbm90IGEgdmVyeSBleGNpdGluZwotCQkgZmVhdHVyZS4gIFdlIHBpY2sgYSBCRkQgcmVsb2MgdHlwZSBpbiBtZF9hcHBseV9maXguCi0KLQkJIExpbW0gdmFsdWVzICg0IGJ5dGUgaW1tZWRpYXRlICJjb25zdGFudHMiKSBtdXN0IGJlIHRyZWF0ZWQKLQkJIG5vcm1hbGx5IGJlY2F1c2UgdGhleSdyZSBub3QgcGFydCBvZiB0aGUgYWN0dWFsIGluc24gd29yZAotCQkgYW5kIHRodXMgdGhlIGluc2VydGlvbiByb3V0aW5lcyBkb24ndCBoYW5kbGUgdGhlbS4gICovCi0KLQkgICAgICBpZiAoYXJjX29wZXJhbmRzW2ZpeHVwc1tpXS5vcGluZGV4XS5mbGFncyAmIEFSQ19PUEVSQU5EX0xJTU0pCi0JCXsKLQkJICBvcF90eXBlID0gZml4dXBzW2ldLm9waW5kZXg7Ci0JCSAgLyogRklYTUU6IGNhbiB3ZSBhZGQgdGhpcyBkYXRhIHRvIHRoZSBvcGVyYW5kIHRhYmxlPyAgKi8KLQkJICBpZiAob3BfdHlwZSA9PSBhcmNfb3BlcmFuZF9tYXBbJ0wnXSkKLQkJICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfMzI7Ci0JCSAgZWxzZSBpZiAob3BfdHlwZSA9PSBhcmNfb3BlcmFuZF9tYXBbJ0onXSkKLQkJICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfQVJDX0IyNjsKLQkJICBlbHNlCi0JCSAgICBhYm9ydCAoKTsKLQkJICByZWxvY190eXBlID0gZ2V0X2FyY19leHBfcmVsb2NfdHlwZSAoMSwgcmVsb2NfdHlwZSwKLQkJCQkJCSAgICAgICAmZml4dXBzW2ldLmV4cCwKLQkJCQkJCSAgICAgICAmZXhwdG1wKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG9wX3R5cGUgPSBnZXRfYXJjX2V4cF9yZWxvY190eXBlICgwLCBmaXh1cHNbaV0ub3BpbmRleCwKLQkJCQkJCSAgICAmZml4dXBzW2ldLmV4cCwgJmV4cHRtcCk7Ci0JCSAgcmVsb2NfdHlwZSA9IG9wX3R5cGUgKyAoaW50KSBCRkRfUkVMT0NfVU5VU0VEOwotCQl9Ci0JICAgICAgb3BlcmFuZCA9ICZhcmNfb3BlcmFuZHNbb3BfdHlwZV07Ci0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgKChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpCi0JCQkgICAgKyAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9MSU1NID8gNCA6IDApKSwgNCwKLQkJCSAgICZleHB0bXAsCi0JCQkgICAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0gpICE9IDAsCi0JCQkgICAoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSByZWxvY190eXBlKTsKLQkgICAgfQotCi0JICAvKiBBbGwgZG9uZS4gICovCi0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBUcnkgdGhlIG5leHQgZW50cnkuICAqLwotICAgIH0KLQotICBhc19iYWQgKF8oImJhZCBpbnN0cnVjdGlvbiBgJXMnIiksIHN0YXJ0KTsKLX0KLQwKLS8qID8/PyBUaGlzIHdhcyBjb3BpZWQgZnJvbSB0Yy1zcGFyYy5jLCBJIHRoaW5rLiAgSXMgaXQgbmVjZXNzYXJ5PyAgKi8KLQotc3RhdGljIHZvaWQKLWFyY19jb21tb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBpbnQgdGVtcCwgc2l6ZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBza2lwICcsJyAqLwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLkNPTU1vbiBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHNpemUgPSB0ZW1wOwotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImlnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSBzaXplKQotCXsKLQkgIGFzX3dhcm4gKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIpLAotCQkgICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwgc2l6ZSk7Ci0JfQotICAgIH0KLSAgYXNzZXJ0IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApID09ICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGVkIGNvbW1hIGFmdGVyIGNvbW1vbiBsZW5ndGgiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotICAgIHsKLSAgICAgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmICh0ZW1wIDwgMCkKLQl7Ci0JICB0ZW1wID0gMDsKLQkgIGFzX3dhcm4gKF8oIkNvbW1vbiBhbGlnbm1lbnQgbmVnYXRpdmU7IDAgYXNzdW1lZCIpKTsKLQl9Ci0gICAgICBpZiAoc3ltYm9sUC0+bG9jYWwpCi0JewotCSAgc2VnVCBvbGRfc2VjOwotCSAgaW50IG9sZF9zdWJzZWM7Ci0JICBjaGFyICpwOwotCSAgaW50IGFsaWduOwotCi0JYWxsb2NhdGVfYnNzOgotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQkgIGFsaWduID0gdGVtcDsKLQkgIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VjdGlvbikKLQkgICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotCSAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsCi0JCQkob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7Ci0JICAqcCA9IDA7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBic3Nfc2VjdGlvbik7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JYWxsb2NhdGVfY29tbW9uOgotCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIHNpemUpOwotCSAgU19TRVRfQUxJR04gKHN5bWJvbFAsIHRlbXApOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogPz8/IFNvbWUgc2F5IGRhdGEsIHNvbWUgc2F5IGJzcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLmJzc1wiIiwgNSkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIi5kYXRhXCIiLCA2KSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotLyogU2VsZWN0IHRoZSBjcHUgd2UncmUgYXNzZW1ibGluZyBmb3IuICAqLwotCi1zdGF0aWMgdm9pZAotYXJjX2NwdSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgbWFjaDsKLSAgY2hhciBjOwotICBjaGFyICpjcHU7Ci0KLSAgLyogSWYgYW4gaW5zdHJ1Y3Rpb24gaGFzIGFscmVhZHkgYmVlbiBzZWVuLCBpdCdzIHRvbyBsYXRlLiAgKi8KLSAgaWYgKGNwdV90YWJsZXNfaW5pdF9wKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiLmNwdSBjb21tYW5kIG11c3QgYXBwZWFyIGJlZm9yZSBhbnkgaW5zdHJ1Y3Rpb25zIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3B1ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIG1hY2ggPSBhcmNfZ2V0X21hY2ggKGNwdSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBpZiAobWFjaCA9PSAtMSkKLSAgICBnb3RvIGJhZF9jcHU7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICAvKiBUaGUgY3B1IG1heSBoYXZlIGJlZW4gc2VsZWN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgVGhlIGNob2ljZXMgbXVzdCBtYXRjaC4gICovCi0gIC8qID8/PyBUaGlzIHdhcyBhIGNvbW1hbmQgbGluZSBvcHRpb24gZWFybHkgb24uICBJdCdzIGdvbmUgbm93LCBidXQKLSAgICAgbGVhdmUgdGhpcyBpbi4gICovCi0gIGlmIChtYWNoX3R5cGVfc3BlY2lmaWVkX3AgJiYgbWFjaCAhPSBhcmNfbWFjaF90eXBlKQotICAgIGFzX2JhZCAoXygiLmNwdSBjb25mbGljdHMgd2l0aCBwcmV2aW91cyB2YWx1ZSIpKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFyY19tYWNoX3R5cGUgPSBtYWNoOwotICAgICAgbWFjaF90eXBlX3NwZWNpZmllZF9wID0gMTsKLSAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfYXJjLCBtYWNoKSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIHJldHVybjsKLQotIGJhZF9jcHU6Ci0gIGFzX2JhZCAoXygiYmFkIC5jcHUgb3AiKSk7Ci0gIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLSNpZiAwCi0vKiBUaGUgLnJlbmFtZSBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgYnkgZ2NjIHRvIGltcGxlbWVudAotICAgLW1tYW5nbGUtY3B1LWxpYmdjYy4gICovCi0KLXN0YXRpYyB2b2lkCi1hcmNfcmVuYW1lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWUsKm5ldzsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0gIGludCBsZW47Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyByZW5hbWUgc3RyaW5nIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBpZiAoKm5hbWUgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCBzeW1ib2wgdG8gcmVuYW1lIHRvIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIG5ldyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgc3RyY3B5IChuZXcsIG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lID0gbmV3OwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0jZW5kaWYKLQwKLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAuCi0gICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotCi0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0vKiBXZSBkb24ndCBoYXZlIGFueSBmb3JtIG9mIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLX0KLQotLyogQ29udmVydCBhIG1hY2hpbmUgZGVwZW5kZW50IGZyYWcuICBXZSBuZXZlciBnZW5lcmF0ZSB0aGVzZS4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFncCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQYXJzZSBhbiBvcGVyYW5kIHRoYXQgaXMgbWFjaGluZS1zcGVjaWZpYy4KLQotICAgVGhlIEFSQyBoYXMgYSBzcGVjaWFsICUtb3AgdG8gYWRqdXN0IGFkZHJlc3NlcyBzbyB0aGV5J3JlIHVzYWJsZSBpbgotICAgYnJhbmNoZXMuICBUaGUgInN0IiBpcyBzaG9ydCBmb3IgdGhlIFNUYXR1cyByZWdpc3Rlci4KLSAgID8/PyBMYXRlciBleHBhbmQgdGhpcyB0byB0YWtlIGEgZmxhZ3MgdmFsdWUgdG9vLgotCi0gICA/Pz8gV2UgY2FuJ3QgY3JlYXRlIG5ldyBleHByZXNzaW9uIHR5cGVzIHNvIHdlIG1hcCB0aGUgJS1vcCdzIG9udG8gdGhlCi0gICBleGlzdGluZyBzeW50YXguICBUaGlzIG1lYW5zIHRoYXQgdGhlIHVzZXIgY291bGQgdXNlIHRoZSBjaG9zZW4gc3ludGF4Ci0gICB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdC4gIFBlcmhhcHMgcHV0IGEgc3BlY2lhbCBjb29raWUgaW4gWF9hZGRfbnVtYmVyCi0gICB0byBtYXJrIHRoZSBleHByZXNzaW9uIGFzIHNwZWNpYWwuICAqLwotCi12b2lkIAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoKnAgPT0gJyUnICYmIHN0cm5jbXAgKHAsICIlc3QoIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgJyknIGluICUtb3AiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19zeW1ib2wKLQkgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPT0gMAotCSAgLyogSSB0aGluayB0aGlzIHRlc3QgaXMgdW5uZWNlc3NhcnkgYnV0IGp1c3QgYXMgYSBzYW5pdHkgY2hlY2suLi4gKi8KLQkgICYmIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9PSBOVUxMKQotCXsKLQkgIGV4cHJlc3Npb25TIHR3bzsKLQotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgdHdvLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgdHdvLlhfYWRkX3N5bWJvbCA9IHR3by5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICB0d28uWF9hZGRfbnVtYmVyID0gMjsKLQkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZ0d28pOwotCX0KLSAgICAgIC8qIGFsbG93ICVzdChzeW0xLXN5bTIpICovCi0gICAgICBlbHNlIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX3N1YnRyYWN0Ci0JICAgICAgICYmIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgIT0gTlVMTAotCSAgICAgICAmJiBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgZXhwcmVzc2lvblMgdHdvOwotCi0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoZXhwcmVzc2lvblApOwotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JpZ2h0X3NoaWZ0OwotCSAgdHdvLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgdHdvLlhfYWRkX3N5bWJvbCA9IHR3by5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICB0d28uWF9hZGRfbnVtYmVyID0gMjsKLQkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZ0d28pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXggZm9yICUlc3QiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuCi0gICBXZSBjb3VsZCBjYXRjaCByZWdpc3RlciBuYW1lcyBoZXJlLCBidXQgdGhhdCBpcyBoYW5kbGVkIGJ5IGluc2VydGluZwotICAgdGhlbSBhbGwgaW4gdGhlIHN5bWJvbCB0YWJsZSB0byBiZWdpbiB3aXRoLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIGV4cHJlc3Npb25zLiAgKi8KLQotLyogUGFyc2UgYSAuYnl0ZSwgLndvcmQsIGV0Yy4gZXhwcmVzc2lvbi4KLQotICAgVmFsdWVzIGZvciB0aGUgc3RhdHVzIHJlZ2lzdGVyIGFyZSBzcGVjaWZpZWQgd2l0aCAlc3QobGFiZWwpLgotICAgYGxhYmVsJyB3aWxsIGJlIHJpZ2h0IHNoaWZ0ZWQgYnkgMi4gICovCi0KLXZvaWQKLWFyY19wYXJzZV9jb25zX2V4cHJlc3Npb24gKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgbmJ5dGVzOwotewotICBleHByICgwLCBleHApOwotfQotCi0vKiBSZWNvcmQgYSBmaXh1cCBmb3IgYSBjb25zIGV4cHJlc3Npb24uICAqLwotCi12b2lkCi1hcmNfY29uc19maXhfbmV3IChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBuYnl0ZXM7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGlmIChuYnl0ZXMgPT0gNCkKLSAgICB7Ci0gICAgICBpbnQgcmVsb2NfdHlwZTsKLSAgICAgIGV4cHJlc3Npb25TIGV4cHRtcDsKLQotICAgICAgLyogVGhpcyBtYXkgYmUgYSBzcGVjaWFsIEFSQyByZWxvYyAoZWc6ICVzdCgpKS4gICovCi0gICAgICByZWxvY190eXBlID0gZ2V0X2FyY19leHBfcmVsb2NfdHlwZSAoMSwgQkZEX1JFTE9DXzMyLCBleHAsICZleHB0bXApOwotICAgICAgZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsICZleHB0bXAsIDAsIHJlbG9jX3R5cGUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgbmJ5dGVzLCBleHAsIDAsCi0JCSAgIG5ieXRlcyA9PSAyID8gQkZEX1JFTE9DXzE2Ci0JCSAgIDogbmJ5dGVzID09IDggPyBCRkRfUkVMT0NfNjQKLQkJICAgOiBCRkRfUkVMT0NfMzIpOwotICAgIH0KLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlbGF5IHNsb3QuICAqLwotICByZXR1cm4gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+Znhfc2l6ZTsKLX0KLQotLyogQ29tcHV0ZSB0aGUgcmVsb2MgdHlwZSBvZiBhbiBleHByZXNzaW9uLgotICAgVGhlIHBvc3NpYmx5IG1vZGlmaWVkIGV4cHJlc3Npb24gaXMgc3RvcmVkIGluIEVYUE5FVy4KLQotICAgVGhpcyBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIGV4cHJlc3Npb25zIGdlbmVyYXRlZCBieSB0aGUgJS1vcCdzIGludG8KLSAgIHRoZSBhcHByb3ByaWF0ZSBvcGVyYW5kIHR5cGUuICBJdCBpcyBjYWxsZWQgZm9yIGJvdGggZGF0YSBpbiBpbnN0cnVjdGlvbnMKLSAgIChvcGVyYW5kcykgYW5kIGRhdGEgb3V0c2lkZSBpbnN0cnVjdGlvbnMgKHZhcmlhYmxlcywgZGVidWdnaW5nIGluZm8sIGV0Yy4pLgotCi0gICBDdXJyZW50bHkgc3VwcG9ydGVkICUtb3BzOgotCi0gICAlc3Qoc3ltYm9sKTogcmVwcmVzZW50ZWQgYXMgInN5bWJvbCA+PiAyIgotICAgICAgICAgICAgICAgICJzdCIgaXMgc2hvcnQgZm9yIFNUYXR1cyBhcyBpbiB0aGUgc3RhdHVzIHJlZ2lzdGVyIChwYykKLQotICAgREVGQVVMVF9UWVBFIGlzIHRoZSB0eXBlIHRvIHVzZSBpZiBubyBzcGVjaWFsIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuCi0KLSAgIERBVEFfUCBpcyBub24temVybyBmb3IgZGF0YSBvciBsaW1tIHZhbHVlcywgemVybyBmb3IgaW5zbiBvcGVyYW5kcy4KLSAgIFJlbWVtYmVyIHRoYXQgdGhlIG9wY29kZSAiaW5zZXJ0aW9uIGZucyIgY2Fubm90IGJlIHVzZWQgb24gZGF0YSwgdGhleSdyZQotICAgb25seSBmb3IgaW5zZXJ0aW5nIG9wZXJhbmRzIGludG8gaW5zbnMuICBUaGV5IGFsc28gY2FuJ3QgYmUgdXNlZCBmb3IgbGltbQotICAgdmFsdWVzIGFzIHRoZSBpbnNlcnRpb24gcm91dGluZXMgZG9uJ3QgaGFuZGxlIGxpbW0gdmFsdWVzLiAgV2hlbiBjYWxsZWQgZm9yCi0gICBpbnNucyB3ZSByZXR1cm4gZnVkZ2VkIHJlbG9jIHR5cGVzIChyZWFsX3ZhbHVlIC0gQkZEX1JFTE9DX1VOVVNFRCkuICBXaGVuCi0gICBjYWxsZWQgZm9yIGRhdGEgb3IgbGltbSB2YWx1ZXMgd2UgdXNlIHJlYWwgcmVsb2MgdHlwZXMuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfYXJjX2V4cF9yZWxvY190eXBlIChkYXRhX3AsIGRlZmF1bHRfdHlwZSwgZXhwLCBleHBuZXcpCi0gICAgIGludCBkYXRhX3A7Ci0gICAgIGludCBkZWZhdWx0X3R5cGU7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGV4cHJlc3Npb25TICpleHBuZXc7Ci17Ci0gIC8qIElmIHRoZSBleHByZXNzaW9uIGlzICJzeW1ib2wgPj4gMiIgd2UgbXVzdCBjaGFuZ2UgaXQgdG8ganVzdCAic3ltYm9sIiwKLSAgICAgYXMgZml4X25ld19leHAgY2FuJ3QgaGFuZGxlIGl0LiAgU2ltaWxhcmlseSBmb3IgKHN5bWJvbCAtIHN5bWJvbCkgPj4gMi4KLSAgICAgVGhhdCdzIG9rIHRob3VnaC4gIFdoYXQncyByZWFsbHkgZ29pbmcgb24gaGVyZSBpcyB0aGF0IHdlJ3JlIHVzaW5nCi0gICAgICI+PiAyIiBhcyBhIHNwZWNpYWwgc3ludGF4IGZvciBzcGVjaWZ5aW5nIEJGRF9SRUxPQ19BUkNfQjI2LiAgKi8KLQotICBpZiAoZXhwLT5YX29wID09IE9fcmlnaHRfc2hpZnQKLSAgICAgICYmIGV4cC0+WF9vcF9zeW1ib2wgIT0gTlVMTAotICAgICAgJiYgc3ltYm9sX2NvbnN0YW50X3AgKGV4cC0+WF9vcF9zeW1ib2wpCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoZXhwLT5YX29wX3N5bWJvbCkgPT0gMgotICAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAoZXhwLT5YX2FkZF9zeW1ib2wgIT0gTlVMTAotCSAgJiYgKHN5bWJvbF9jb25zdGFudF9wIChleHAtPlhfYWRkX3N5bWJvbCkKLQkgICAgICB8fCBzeW1ib2xfZXF1YXRlZF9wIChleHAtPlhfYWRkX3N5bWJvbCkpKQotCXsKLQkgICpleHBuZXcgPSAqZXhwOwotCSAgZXhwbmV3LT5YX29wID0gT19zeW1ib2w7Ci0JICBleHBuZXctPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIHJldHVybiBkYXRhX3AgPyBCRkRfUkVMT0NfQVJDX0IyNiA6IGFyY19vcGVyYW5kX21hcFsnSiddOwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfc3ltYm9sICE9IE5VTEwKLQkgICAgICAgJiYgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoZXhwLT5YX2FkZF9zeW1ib2wpLT5YX29wCi0JCSAgID09IE9fc3VidHJhY3QpKQotCXsKLQkgICpleHBuZXcgPSAqc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCk7Ci0JICByZXR1cm4gZGF0YV9wID8gQkZEX1JFTE9DX0FSQ19CMjYgOiBhcmNfb3BlcmFuZF9tYXBbJ0onXTsKLQl9Ci0gICAgfQotCi0gICpleHBuZXcgPSAqZXhwOwotICByZXR1cm4gZGVmYXVsdF90eXBlOwotfQotCi0vKiBBcHBseSBhIGZpeHVwIHRvIHRoZSBvYmplY3QgY29kZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBhbGwgdGhlCi0gICBmaXh1cHMgd2UgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsIHRvIGZpeF9uZXdfZXhwLCBhYm92ZS4gIEluIHRoZSBjYWxsCi0gICBhYm92ZSB3ZSB1c2VkIGEgcmVsb2MgY29kZSB3aGljaCB3YXMgdGhlIGxhcmdlc3QgbGVnYWwgcmVsb2MgY29kZQotICAgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIEhlcmUgd2UgdW5kbyB0aGF0IHRvIHJlY292ZXIgdGhlIG9wZXJhbmQKLSAgIGluZGV4LiAgQXQgdGhpcyBwb2ludCBhbGwgc3ltYm9sIHZhbHVlcyBzaG91bGQgYmUgZnVsbHkgcmVzb2x2ZWQsCi0gICBhbmQgd2UgYXR0ZW1wdCB0byBjb21wbGV0ZWx5IHJlc29sdmUgdGhlIHJlbG9jLiAgSWYgd2UgY2FuIG5vdCBkbwotICAgdGhhdCwgd2UgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHJlbG9jIGNvZGUgYW5kIHB1dCBpdCBiYWNrIGluIHRoZSBmaXh1cC4gICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsdWVQLCBzZWcpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWVQOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLypjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ki8KLSAgdmFsdWVUIHZhbHVlOwotCi0gIC8qIEZJWE1FIEZJWE1FIEZJWE1FOiBUaGUgdmFsdWUgd2UgYXJlIHBhc3NlZCBpbiAqdmFsdWVQIGluY2x1ZGVzCi0gICAgIHRoZSBzeW1ib2wgdmFsdWVzLiAgU2luY2Ugd2UgYXJlIHVzaW5nIEJGRF9BU1NFTUJMRVIsIGlmIHdlIGFyZQotICAgICBkb2luZyB0aGlzIHJlbG9jYXRpb24gdGhlIGNvZGUgaW4gd3JpdGUuYyBpcyBnb2luZyB0byBjYWxsCi0gICAgIGJmZF9wZXJmb3JtX3JlbG9jYXRpb24sIHdoaWNoIGlzIGFsc28gZ29pbmcgdG8gdXNlIHRoZSBzeW1ib2wKLSAgICAgdmFsdWUuICBUaGF0IG1lYW5zIHRoYXQgaWYgdGhlIHJlbG9jIGlzIGZ1bGx5IHJlc29sdmVkIHdlIHdhbnQgdG8KLSAgICAgdXNlICp2YWx1ZVAgc2luY2UgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBpcyBub3QgYmVpbmcgdXNlZC4KLSAgICAgSG93ZXZlciwgaWYgdGhlIHJlbG9jIGlzIG5vdCBmdWxseSByZXNvbHZlZCB3ZSBkbyBub3Qgd2FudCB0byB1c2UKLSAgICAgKnZhbHVlUCwgYW5kIG11c3QgdXNlIGZ4X29mZnNldCBpbnN0ZWFkLiAgSG93ZXZlciwgaWYgdGhlIHJlbG9jCi0gICAgIGlzIFBDIHJlbGF0aXZlLCB3ZSBkbyB3YW50IHRvIHVzZSAqdmFsdWVQIHNpbmNlIGl0IGluY2x1ZGVzIHRoZQotICAgICByZXN1bHQgb2YgbWRfcGNyZWxfZnJvbS4gIFRoaXMgaXMgY29uZnVzaW5nLiAgKi8KLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICp2YWx1ZVA7Ci0gICAgICBmaXhQLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeFAtPmZ4X3BjcmVsKQotICAgIHsKLSAgICAgIHZhbHVlID0gKnZhbHVlUDsKLSAgICAgIC8qIEVMRiByZWxvY2F0aW9ucyBhcmUgYWdhaW5zdCBzeW1ib2xzLgotCSBJZiB0aGlzIHN5bWJvbCBpcyBpbiBhIGRpZmZlcmVudCBzZWN0aW9uIHRoZW4gd2UgbmVlZCB0byBsZWF2ZSBpdCBmb3IKLQkgdGhlIGxpbmtlciB0byBkZWFsIHdpdGguICBVbmZvcnR1bmF0ZWx5LCBtZF9wY3JlbF9mcm9tIGNhbid0IHRlbGwsCi0JIHNvIHdlIGhhdmUgdG8gdW5kbyBpdCdzIGVmZmVjdHMgaGVyZS4gICovCi0gICAgICBpZiAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBzZWcpCi0JdmFsdWUgKz0gbWRfcGNyZWxfZnJvbSAoZml4UCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4UC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKChpbnQpIGZpeFAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgY2hhciAqd2hlcmU7Ci0gICAgICBhcmNfaW5zbiBpbnNuOwotCi0gICAgICBvcGluZGV4ID0gKGludCkgZml4UC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLQotICAgICAgb3BlcmFuZCA9ICZhcmNfb3BlcmFuZHNbb3BpbmRleF07Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0JIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotICAgICAgd2hlcmUgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgaW5zbiA9IGFyY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgLTEsIE5VTEwsIChvZmZzZXRUKSB2YWx1ZSwKLQkJCQkgZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQl7Ci0JICAvKiBOb3RoaW5nIGVsc2UgdG8gZG8gaGVyZS4gICovCi0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIERldGVybWluZSBhIEJGRCByZWxvYyB2YWx1ZSBiYXNlZCBvbiB0aGUgb3BlcmFuZCBpbmZvcm1hdGlvbi4KLQkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50byByZWxvY3MuCi0JICEhISBOb3RlIHRoYXQgd2UgY2FuJ3QgaGFuZGxlIGxpbW0gdmFsdWVzIGhlcmUuICBTaW5jZSB3ZSdyZSB1c2luZwotCSBpbXBsaWNpdCBhZGRlbmRzIHRoZSBhZGRlbmQgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiwKLQkgaG93ZXZlciwgdGhlIG9wY29kZSBpbnNlcnRpb24gcm91dGluZXMgY3VycmVudGx5IGRvIG5vdGhpbmcgd2l0aAotCSBsaW1tIHZhbHVlcy4gICovCi0gICAgICBpZiAob3BlcmFuZC0+Zm10ID09ICdCJykKLQl7Ci0JICBhc3NlcnQgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1JFTEFUSVZFX0JSQU5DSCkgIT0gMAotCQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjAKLQkJICAmJiBvcGVyYW5kLT5zaGlmdCA9PSA3KTsKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19BUkNfQjIyX1BDUkVMOwotCX0KLSAgICAgIGVsc2UgaWYgKDAgJiYgb3BlcmFuZC0+Zm10ID09ICdKJykKLQl7Ci0JICBhc3NlcnQgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCkgIT0gMAotCQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMjQKLQkJICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAzMik7Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfQVJDX0IyNjsKLQl9Ci0gICAgICBlbHNlIGlmICgwICYmIG9wZXJhbmQtPmZtdCA9PSAnTCcpCi0JewotCSAgYXNzZXJ0ICgob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9MSU1NKSAhPSAwCi0JCSAgJiYgb3BlcmFuZC0+Yml0cyA9PSAzMgotCQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDMyKTsKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ184OgotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkgICAgICB2YWx1ZSwgMSk7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotI2lmIDAKLQljYXNlIEJGRF9SRUxPQ182NDoKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDgpOwotCSAgYnJlYWs7Ci0jZW5kaWYKLQljYXNlIEJGRF9SRUxPQ19BUkNfQjI2OgotCSAgLyogSWYgIWZpeFAtPmZ4X2RvbmUgdGhlbiBgdmFsdWUnIGlzIGFuIGltcGxpY2l0IGFkZGVuZC4KLQkgICAgIFdlIG11c3Qgc2hpZnQgaXQgcmlnaHQgYnkgMiBpbiB0aGlzIGNhc2UgYXMgd2VsbCBiZWNhdXNlIHRoZQotCSAgICAgbGlua2VyIHBlcmZvcm1zIHRoZSByZWxvY2F0aW9uIGFuZCB0aGVuIGFkZHMgdGhpcyBpbiAoYXMgb3Bwb3NlZAotCSAgICAgdG8gYWRkaW5nIHRoaXMgaW4gYW5kIHRoZW4gc2hpZnRpbmcgcmlnaHQgYnkgMikuICAqLwotCSAgdmFsdWUgPj49IDI7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4gICovCi0KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhQKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4UC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBleHBvcnQgcmVsb2MgdHlwZSAlZCAoYCVzJykiKSwKLQkJICAgIGZpeFAtPmZ4X3JfdHlwZSwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeFAtPmZ4X3JfdHlwZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIGFzc2VydCAoIWZpeFAtPmZ4X3BjcmVsID09ICFyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlKTsKLQotICByZWxvYy0+YWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCi0gIHJldHVybiByZWxvYzsKLX0KLQwKLS8qIEZyb2JiZXJzLiAgKi8KLQotI2lmIDAKLS8qIFNldCB0aGUgcmVhbCBuYW1lIGlmIHRoZSAucmVuYW1lIHBzZXVkby1vcCB3YXMgdXNlZC4KLSAgIFJldHVybiAxIGlmIHRoZSBzeW1ib2wgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLQotaW50Ci1hcmNfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgU19TRVRfTkFNRSAoc3ltLCBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUpOwotCi0gIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWFyYy5oIGIvZ2FzL2NvbmZpZy90Yy1hcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NjIwMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWFyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyogdGMtYXJjLmggLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5lcyBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLAotICAgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX0FSQyAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfYXJjCi0KLSNkZWZpbmUgTElUVExFX0VORElBTiAgIDEyMzQKLSNkZWZpbmUgQklHX0VORElBTiAgICAgIDQzMjEKLQotLyogVGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldCBmb3JtYXQgbWF5IGNoYW5nZSBiYXNlZCBvbiBjb21tYW5kCi0gICBsaW5lIGFyZ3VtZW50cy4gICovCi1leHRlcm4gY29uc3QgY2hhciAqYXJjX3RhcmdldF9mb3JtYXQ7Ci0jZGVmaW5lIERFRkFVTFRfVEFSR0VUX0ZPUk1BVCAiZWxmMzItbGl0dGxlYXJjIgotI2RlZmluZSBUQVJHRVRfRk9STUFUIGFyY190YXJnZXRfZm9ybWF0Ci0jZGVmaW5lIERFRkFVTFRfQllURV9PUkRFUiBMSVRUTEVfRU5ESUFOCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJBUkMgR0FTICIKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIFRoZSBBUkMgbmVlZHMgdG8gcGFyc2UgcmVsb2Mgc3BlY2lmaWVycyBpbiAud29yZC4gICovCi0KLWV4dGVybiB2b2lkIGFyY19wYXJzZV9jb25zX2V4cHJlc3Npb24gKCk7Ci0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgXAotYXJjX3BhcnNlX2NvbnNfZXhwcmVzc2lvbiAoRVhQLCBOQllURVMpCi0KLWV4dGVybiB2b2lkIGFyY19jb25zX2ZpeF9uZXcgKCk7Ci0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyhGUkFHLCBXSEVSRSwgTkJZVEVTLCBFWFApIFwKLWFyY19jb25zX2ZpeF9uZXcgKEZSQUcsIFdIRVJFLCBOQllURVMsIEVYUCkKLQotI2lmIDAKLS8qIEV4dHJhIHN0dWZmIHRoYXQgd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGZvciBlYWNoIHN5bWJvbC4gICovCi1zdHJ1Y3QgYXJjX3RjX3N5Ci17Ci0gIC8qIFRoZSByZWFsIG5hbWUsIGlmIHRoZSBzeW1ib2wgd2FzIHJlbmFtZWQuICAqLwotICBjaGFyICpyZWFsX25hbWU7Ci19OwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IGFyY190Y19zeQotCi0vKiBGaW5pc2ggdXAgdGhlIHN5bWJvbC4gICovCi1leHRlcm4gaW50IGFyY19mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLCBwdW50KSBwdW50ID0gYXJjX2Zyb2Jfc3ltYm9sIChzeW0pCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJtLmMgYi9nYXMvY29uZmlnL3RjLWFybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTAwYjMxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTg1ICswLDAgQEAKLS8qIHRjLWFybS5jIC0tIEFzc2VtYmxlIGZvciB0aGUgQVJNCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQlNb2RpZmllZCBieSBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNkZWZpbmUgIE5PX1JFTE9DIDAKLSNpbmNsdWRlICJhcy5oIgotCi0vKiBuZWVkIFRBUkdFVF9DUFUgKi8KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgInN5bWJvbHMuaCIKLSNpbmNsdWRlICJsaXN0aW5nLmgiCi0KLSNpZmRlZiBPQkpfRUxGCi0jaW5jbHVkZSAiZWxmL2FybS5oIgotI2VuZGlmCi0KLS8qIFR5cGVzIG9mIHByb2Nlc3NvciB0byBhc3NlbWJsZSBmb3IuICAqLwotI2RlZmluZSBBUk1fMQkJMHgwMDAwMDAwMQotI2RlZmluZSBBUk1fMgkJMHgwMDAwMDAwMgotI2RlZmluZSBBUk1fMwkJMHgwMDAwMDAwNAotI2RlZmluZSBBUk1fMjUwCQlBUk1fMwotI2RlZmluZSBBUk1fNgkJMHgwMDAwMDAwOAotI2RlZmluZSBBUk1fNwkJQVJNXzYgICAgICAgICAgIC8qIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQgKi8KLSNkZWZpbmUgQVJNXzgJCUFSTV82ICAgICAgICAgICAvKiBzYW1lIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0ICovCi0jZGVmaW5lIEFSTV85CQlBUk1fNiAgICAgICAgICAgLyogc2FtZSBjb3JlIGluc3RydWN0aW9uIHNldCAqLwotI2RlZmluZSBBUk1fQ1BVX01BU0sJMHgwMDAwMDAwZgotCi0vKiBUaGUgZm9sbG93aW5nIGJpdG1hc2tzIGNvbnRyb2wgQ1BVIGV4dGVuc2lvbnMgKEFSTTcgb253YXJkcyk6ICovCi0jZGVmaW5lIEFSTV9MT05HTVVMCTB4MDAwMDAwMTAJLyogYWxsb3cgbG9uZyBtdWx0aXBsaWVzICovCi0jZGVmaW5lIEFSTV9IQUxGV09SRCAgICAweDAwMDAwMDIwCS8qIGFsbG93IGhhbGYgd29yZCBsb2FkcyAqLwotI2RlZmluZSBBUk1fVEhVTUIgICAgICAgMHgwMDAwMDA0MAkvKiBhbGxvdyBCWCBpbnN0cnVjdGlvbiAgKi8KLQotI2RlZmluZSBBUk1fQVJDSHY0CShBUk1fNyB8IEFSTV9MT05HTVVMIHwgQVJNX0hBTEZXT1JEKQotCi0vKiBTb21lIHVzZWZ1bCBjb21iaW5hdGlvbnM6ICAqLwotI2RlZmluZSBBUk1fQU5ZCQkweDAwZmZmZmZmCi0jZGVmaW5lIEFSTV8yVVAJCTB4MDBmZmZmZmUKLSNkZWZpbmUgQVJNX0FMTAkJQVJNXzJVUAkJLyogTm90IGFybTEgb25seSAqLwotI2RlZmluZSBBUk1fM1VQCQkweDAwZmZmZmZjCi0jZGVmaW5lIEFSTV82VVAJCTB4MDBmZmZmZjggICAgICAvKiBJbmNsdWRlcyBBUk03ICovCi0KLSNkZWZpbmUgRlBVX0NPUkUJMHg4MDAwMDAwMAotI2RlZmluZSBGUFVfRlBBMTAJMHg0MDAwMDAwMAotI2RlZmluZSBGUFVfRlBBMTEJMHg0MDAwMDAwMAotI2RlZmluZSBGUFVfTk9ORQkwCi0KLS8qIFNvbWUgdXNlZnVsIGNvbWJpbmF0aW9ucyAgKi8KLSNkZWZpbmUgRlBVX0FMTAkJMHhmZjAwMDAwMAkvKiBOb3RlIHRoaXMgaXMgfkFSTV9BTlkgKi8KLSNkZWZpbmUgRlBVX01FTU1VTFRJCTB4N2YwMDAwMDAJLyogTm90IGZwdV9jb3JlICovCi0KLSAgICAgCi0jaWZuZGVmIENQVV9ERUZBVUxUCi0jaWYgZGVmaW5lZCBfX3RodW1iX18KLSNkZWZpbmUgQ1BVX0RFRkFVTFQgKEFSTV9BUkNIdjQgfCBBUk1fVEhVTUIpCi0jZWxzZQotI2RlZmluZSBDUFVfREVGQVVMVCBBUk1fQUxMCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEZQVV9ERUZBVUxUCi0jZGVmaW5lIEZQVV9ERUZBVUxUIEZQVV9BTEwKLSNlbmRpZgotCi0jZGVmaW5lIHN0cmVxKGEsYikgIChzdHJjbXAgKGEsIGIpID09IDApCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCWNwdV92YXJpYW50ID0gQ1BVX0RFRkFVTFQgfCBGUFVfREVGQVVMVDsKLXN0YXRpYyBpbnQgdGFyZ2V0X29hYmkgPSAwOwotCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLS8qIEZsYWdzIHN0b3JlZCBpbiBwcml2YXRlIGFyZWEgb2YgQkZEIHN0cnVjdHVyZSAqLwotc3RhdGljIGJvb2xlYW4JCXVzZXNfYXBjc18yNiA9IGZhbHNlOwotc3RhdGljIGJvb2xlYW4JCXN1cHBvcnRfaW50ZXJ3b3JrID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbgkJdXNlc19hcGNzX2Zsb2F0ID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbgkJcGljX2NvZGUgPSBmYWxzZTsKLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotQ09OU1QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiQCI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCi1DT05TVCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0jaWZkZWYgVEVfTElOVVgKLUNPTlNUIGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLSNlbHNlCi1DT05TVCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLSNlbmRpZgotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotQ09OU1QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLQotQ09OU1QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYZUVwUCI7Ci0KLS8qIFByZWZpeCBjaGFyYWN0ZXJzIHRoYXQgaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGFuIGltbWVkaWF0ZQotICAgdmFsdWUuICAqLwotI2RlZmluZSBpc19pbW1lZGlhdGVfcHJlZml4KEMpICgoQykgPT0gJyMnIHx8IChDKSA9PSAnJCcpCi0KLSNpZmRlZiBPQkpfRUxGCi1zeW1ib2xTICogR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iICovCi0jZW5kaWYKLQotQ09OU1QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi1zdGF0aWMgaW50IHRodW1iX21vZGUgPSAwOyAgICAgIC8qIG5vbi16ZXJvIGlmIGFzc2VtYmxpbmcgdGh1bWIgaW5zdHJ1Y3Rpb25zICovCi0KLXR5cGVkZWYgc3RydWN0IGFybV9maXgKLXsKLSAgaW50IHRodW1iX21vZGU7Ci19IGFybV9maXhfZGF0YTsKLQotc3RydWN0IGFybV9pdAotewotICBDT05TVCBjaGFyICogIGVycm9yOwotICB1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uOwotICBpbnQgICAgICAgICAgIHN1ZmZpeDsKLSAgaW50ICAgICAgICAgICBzaXplOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgdHlwZTsKLSAgICAgIGV4cHJlc3Npb25TICAgICAgICAgICAgICBleHA7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgcGNfcmVsOwotICAgIH0gcmVsb2M7Ci19OwotCi1zdHJ1Y3QgYXJtX2l0IGluc3Q7Ci0KLXN0cnVjdCBhc21fc2hpZnQKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX3NoaWZ0IHNoaWZ0W10gPQotewotICB7ImFzbCIsIDB9LAotICB7ImxzbCIsIDB9LAotICB7ImxzciIsIDB4MDAwMDAwMjB9LAotICB7ImFzciIsIDB4MDAwMDAwNDB9LAotICB7InJvciIsIDB4MDAwMDAwNjB9LAotICB7InJyeCIsIDB4MDAwMDAwNjB9LAotICB7IkFTTCIsIDB9LAotICB7IkxTTCIsIDB9LAotICB7IkxTUiIsIDB4MDAwMDAwMjB9LAotICB7IkFTUiIsIDB4MDAwMDAwNDB9LAotICB7IlJPUiIsIDB4MDAwMDAwNjB9LAotICB7IlJSWCIsIDB4MDAwMDAwNjB9Ci19OwotCi0jZGVmaW5lIE5PX1NISUZUX1JFU1RSSUNUIDEKLSNkZWZpbmUgU0hJRlRfUkVTVFJJQ1QJICAwCi0KLSNkZWZpbmUgTlVNX0ZMT0FUX1ZBTFMgOAotCi1DT05TVCBjaGFyICogZnBfY29uc3RbXSA9IAotewotICAiMC4wIiwgIjEuMCIsICIyLjAiLCAiMy4wIiwgIjQuMCIsICI1LjAiLCAiMC41IiwgIjEwLjAiLCAwCi19OwotCi0vKiBOdW1iZXIgb2YgbGl0dGxlbnVtcyByZXF1aXJlZCB0byBob2xkIGFuIGV4dGVuZGVkIHByZWNpc2lvbiBudW1iZXIgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1MSVRUTEVOVU1fVFlQRSBmcF92YWx1ZXNbTlVNX0ZMT0FUX1ZBTFNdW01BWF9MSVRUTEVOVU1TXTsKLQotI2RlZmluZSBGQUlMCSgtMSkKLSNkZWZpbmUgU1VDQ0VTUyAoMCkKLQotI2RlZmluZSBTVUZGX1MgMQotI2RlZmluZSBTVUZGX0QgMgotI2RlZmluZSBTVUZGX0UgMwotI2RlZmluZSBTVUZGX1AgNAotCi0jZGVmaW5lIENQX1RfWCAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgQ1BfVF9ZICAgMHgwMDQwMDAwMAotI2RlZmluZSBDUF9UX1ByZSAweDAxMDAwMDAwCi0jZGVmaW5lIENQX1RfVUQgIDB4MDA4MDAwMDAKLSNkZWZpbmUgQ1BfVF9XQiAgMHgwMDIwMDAwMAotCi0jZGVmaW5lIENPTkRTX0JJVCAgICAgICAoMHgwMDEwMDAwMCkKLSNkZWZpbmUgTE9BRF9CSVQgICAgICAgICgweDAwMTAwMDAwKQotI2RlZmluZSBUUkFOU19CSVQJKDB4MDAyMDAwMDApCi0KLXN0cnVjdCBhc21fY29uZAotewotICBDT05TVCBjaGFyICogIHRlbXBsYXRlOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotfTsKLQotLyogVGhpcyBpcyB0byBzYXZlIGEgaGFzaCBsb29rLXVwIGluIHRoZSBjb21tb24gY2FzZSAqLwotI2RlZmluZSBDT05EX0FMV0FZUyAweGUwMDAwMDAwCi0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2NvbmQgY29uZHNbXSA9IAotewotICB7ImVxIiwgMHgwMDAwMDAwMH0sCi0gIHsibmUiLCAweDEwMDAwMDAwfSwKLSAgeyJjcyIsIDB4MjAwMDAwMDB9LCB7ImhzIiwgMHgyMDAwMDAwMH0sCi0gIHsiY2MiLCAweDMwMDAwMDAwfSwgeyJ1bCIsIDB4MzAwMDAwMDB9LCB7ImxvIiwgMHgzMDAwMDAwMH0sCi0gIHsibWkiLCAweDQwMDAwMDAwfSwKLSAgeyJwbCIsIDB4NTAwMDAwMDB9LAotICB7InZzIiwgMHg2MDAwMDAwMH0sCi0gIHsidmMiLCAweDcwMDAwMDAwfSwKLSAgeyJoaSIsIDB4ODAwMDAwMDB9LAotICB7ImxzIiwgMHg5MDAwMDAwMH0sCi0gIHsiZ2UiLCAweGEwMDAwMDAwfSwKLSAgeyJsdCIsIDB4YjAwMDAwMDB9LAotICB7Imd0IiwgMHhjMDAwMDAwMH0sCi0gIHsibGUiLCAweGQwMDAwMDAwfSwKLSAgeyJhbCIsIDB4ZTAwMDAwMDB9LAotICB7Im52IiwgMHhmMDAwMDAwMH0KLX07Ci0KLS8qIFdhcm5pbmc6IElmIHRoZSB0b3AgYml0IG9mIHRoZSBzZXRfYml0cyBpcyBzZXQsIHRoZW4gdGhlIHN0YW5kYXJkCi0gICBpbnN0cnVjdGlvbiBiaXRtYXNrIGlzIGlnbm9yZWQsIGFuZCB0aGUgbmV3IGJpdG1hc2sgaXMgdGFrZW4gZnJvbQotICAgdGhlIHNldF9iaXRzOiAqLwotc3RydWN0IGFzbV9mbGcKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsJLyogQmFzaWMgZmxhZyBzdHJpbmcgKi8KLSAgdW5zaWduZWQgbG9uZyBzZXRfYml0czsJLyogQml0cyB0byBzZXQgKi8KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzX2ZsYWdbXSA9Ci17Ci0gIHsicyIsIENPTkRTX0JJVH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGxkcl9mbGFnc1tdID0KLXsKLSAgeyJiIiwgIDB4MDA0MDAwMDB9LAotICB7InQiLCAgVFJBTlNfQklUfSwKLSAgeyJidCIsIDB4MDA0MDAwMDAgfCBUUkFOU19CSVR9LAotICB7ImgiLCAgMHg4MDEwMDBiMH0sCi0gIHsic2giLCAweDgwMTAwMGYwfSwKLSAgeyJzYiIsIDB4ODAxMDAwZDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzdHJfZmxhZ3NbXSA9Ci17Ci0gIHsiYiIsICAweDAwNDAwMDAwfSwKLSAgeyJ0IiwgIFRSQU5TX0JJVH0sCi0gIHsiYnQiLCAweDAwNDAwMDAwIHwgVFJBTlNfQklUfSwKLSAgeyJoIiwgIDB4ODAwMDAwYjB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBieXRlX2ZsYWdbXSA9Ci17Ci0gIHsiYiIsIDB4MDA0MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBjbXBfZmxhZ3NbXSA9Ci17Ci0gIHsicyIsIENPTkRTX0JJVH0sCi0gIHsicCIsIDB4MDAxMGYwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZG1fZmxhZ3NbXSA9Ci17Ci0gIHsiZWQiLCAweDAxODAwMDAwfSwKLSAgeyJmZCIsIDB4MDA4MDAwMDB9LAotICB7ImVhIiwgMHgwMTAwMDAwMH0sCi0gIHsiZmEiLCAweDA4MDAwMDAwfSwKLSAgeyJpYiIsIDB4MDE4MDAwMDB9LAotICB7ImlhIiwgMHgwMDgwMDAwMH0sCi0gIHsiZGIiLCAweDAxMDAwMDAwfSwKLSAgeyJkYSIsIDB4MDgwMDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzdG1fZmxhZ3NbXSA9Ci17Ci0gIHsiZWQiLCAweDA4MDAwMDAwfSwKLSAgeyJmZCIsIDB4MDEwMDAwMDB9LAotICB7ImVhIiwgMHgwMDgwMDAwMH0sCi0gIHsiZmEiLCAweDAxODAwMDAwfSwKLSAgeyJpYiIsIDB4MDE4MDAwMDB9LAotICB7ImlhIiwgMHgwMDgwMDAwMH0sCi0gIHsiZGIiLCAweDAxMDAwMDAwfSwKLSAgeyJkYSIsIDB4MDgwMDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBsZm1fZmxhZ3NbXSA9Ci17Ci0gIHsiZmQiLCAweDAwODAwMDAwfSwKLSAgeyJlYSIsIDB4MDEwMDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBzZm1fZmxhZ3NbXSA9Ci17Ci0gIHsiZmQiLCAweDAxMDAwMDAwfSwKLSAgeyJlYSIsIDB4MDA4MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyByb3VuZF9mbGFnc1tdID0KLXsKLSAgeyJwIiwgMHgwMDAwMDAyMH0sCi0gIHsibSIsIDB4MDAwMDAwNDB9LAotICB7InoiLCAweDAwMDAwMDYwfSwKLSAge05VTEwsIDB9Ci19OwotCi0vKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEZJWCBpbnN0cnVjdGlvbiBpcyBicm9rZW4gb24gc29tZSBhc3NlbWJsZXJzLAotICAgaW4gdGhhdCBpdCBhY2NlcHRzIGEgcHJlY2lzaW9uIHNwZWNpZmllciBhcyB3ZWxsIGFzIGEgcm91bmRpbmcgc3BlY2lmaWVyLAotICAgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoaXMgaXMgbWVhbmluZ2xlc3MuICBUbyBiZSBtb3JlIGNvbXBhdGlibGUsIHdlCi0gICBhY2NlcHQgaXQgYXMgd2VsbCwgdGhvdWdoIG9mIGNvdXJzZSBpdCBkb2VzIG5vdCBzZXQgYW55IGJpdHMuICAqLwotc3RhdGljIENPTlNUIHN0cnVjdCBhc21fZmxnIGZpeF9mbGFnc1tdID0KLXsKLSAgeyJwIiwgMHgwMDAwMDAyMH0sCi0gIHsibSIsIDB4MDAwMDAwNDB9LAotICB7InoiLCAweDAwMDAwMDYwfSwKLSAgeyJzcCIsIDB4MDAwMDAwMjB9LAotICB7InNtIiwgMHgwMDAwMDA0MH0sCi0gIHsic3oiLCAweDAwMDAwMDYwfSwKLSAgeyJkcCIsIDB4MDAwMDAwMjB9LAotICB7ImRtIiwgMHgwMDAwMDA0MH0sCi0gIHsiZHoiLCAweDAwMDAwMDYwfSwKLSAgeyJlcCIsIDB4MDAwMDAwMjB9LAotICB7ImVtIiwgMHgwMDAwMDA0MH0sCi0gIHsiZXoiLCAweDAwMDAwMDYwfSwKLSAge05VTEwsIDB9Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9mbGcgZXhjZXB0X2ZsYWdbXSA9Ci17Ci0gIHsiZSIsIDB4MDA0MDAwMDB9LAotICB7TlVMTCwgMH0KLX07Ci0KLXN0YXRpYyBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyBjcGxvbmdfZmxhZ1tdID0KLXsKLSAgeyJsIiwgMHgwMDQwMDAwMH0sCi0gIHtOVUxMLCAwfQotfTsKLQotc3RydWN0IGFzbV9wc3IKLXsKLSAgQ09OU1QgY2hhciAqICB0ZW1wbGF0ZTsKLSAgdW5zaWduZWQgbG9uZyBudW1iZXI7Ci19OwotCi0jZGVmaW5lIFBTUl9GSUVMRF9NQVNLICAweDAwMGYwMDAwCi0KLSNkZWZpbmUgUFNSX0ZMQUdTCTB4MDAwODAwMDAKLSNkZWZpbmUgUFNSX0NPTlRST0wJMHgwMDAxMDAwMCAvKiBVbmRvY3VtZW50ZWQgaW5zdHJ1Y3Rpb24sIGl0cyB1c2UgaXMgZGlzY291cmFnZWQgYnkgQVJNICovCi0jZGVmaW5lIFBTUl9BTEwJCTB4MDAwOTAwMDAKLQotI2RlZmluZSBDUFNSX0FMTAkwCi0jZGVmaW5lIFNQU1JfQUxMCTEKLSNkZWZpbmUgQ1BTUl9GTEcJMgotI2RlZmluZSBTUFNSX0ZMRwkzCi0jZGVmaW5lIENQU1JfQ1RMCTQKLSNkZWZpbmUgU1BTUl9DVEwJNQotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9wc3IgcHNyc1tdID0KLXsKLSAgLyogVmFsaWQgPHBzcj4ncyAqLwotICB7ImNwc3IiLAlDUFNSX0FMTH0sCi0gIHsiY3Bzcl9hbGwiLAlDUFNSX0FMTH0sCi0gIHsic3BzciIsCVNQU1JfQUxMfSwKLSAgeyJzcHNyX2FsbCIsCVNQU1JfQUxMfSwKLQotICAvKiBWYWxpZCA8cHNyZj4ncyAqLwotICB7ImNwc3JfZmxnIiwJQ1BTUl9GTEd9LAotICB7InNwc3JfZmxnIiwJU1BTUl9GTEd9LAotICAKLSAgLyogVmFsaWQgPHBzcmM+J3MgKi8KLSAgeyJjcHNyX2MiLAlDUFNSX0NUTH0sCi0gIHsiY3Bzcl9jdGwiLAlDUFNSX0NUTH0sCi0gIHsic3Bzcl9jIiwJU1BTUl9DVEx9LAotICB7InNwc3JfY3RsIiwJU1BTUl9DVEx9Ci19OwotCi0vKiBGdW5jdGlvbnMgY2FsbGVkIGJ5IHBhcnNlciAqLwotLyogQVJNIGluc3RydWN0aW9ucyAqLwotc3RhdGljIHZvaWQgZG9fYXJpdAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2NtcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX21vdgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2xkc3QJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19sZG1zdG0JCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19icmFuY2gJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19zd2kJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBQc2V1ZG8gT3AgY29kZXMgKi8KLXN0YXRpYyB2b2lkIGRvX2FkcgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX25vcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLS8qIEFSTSAyICovCi1zdGF0aWMgdm9pZCBkb19tdWwJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19tbGEJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBBUk0gMyAqLwotc3RhdGljIHZvaWQgZG9fc3dhcAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLS8qIEFSTSA2ICovCi1zdGF0aWMgdm9pZCBkb19tc3IJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19tcnMJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBBUk0gN00gKi8KLXN0YXRpYyB2b2lkIGRvX211bGwJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci0vKiBBUk0gVEhVTUIgKi8KLXN0YXRpYyB2b2lkIGRvX2J4ICAgICAgICAgICAgICAgUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLQotLyogQ29wcm9jZXNzb3IgSW5zdHJ1Y3Rpb25zICovCi1zdGF0aWMgdm9pZCBkb19jZHAJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19sc3RjCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fY29fcmVnCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfY3RybAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2xkc3QJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzLCB1bnNpZ25lZCBsb25nIGZsYWdzKSk7Ci1zdGF0aWMgdm9pZCBkb19mcF9sZG1zdG0JUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX2R5YWRpYwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfbW9uYWRpYwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfY21wCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotc3RhdGljIHZvaWQgZG9fZnBfZnJvbV9yZWcJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0YXRpYyB2b2lkIGRvX2ZwX3RvX3JlZwlQQVJBTVMgKChjaGFyICpvcGVyYW5kcywgdW5zaWduZWQgbG9uZyBmbGFncykpOwotCi1zdGF0aWMgdm9pZCBmaXhfbmV3X2FybQkJUEFSQU1TICgoZnJhZ1MgKmZyYWcsIGludCB3aGVyZSwgCi0JCQkJCSBzaG9ydCBpbnQgc2l6ZSwgZXhwcmVzc2lvblMgKmV4cCwKLQkJCQkJIGludCBwY19yZWwsIGludCByZWxvYykpOwotc3RhdGljIGludCBhcm1fcmVnX3BhcnNlCVBBUkFNUyAoKGNoYXIgKipjY3ApKTsKLXN0YXRpYyBpbnQgYXJtX3Bzcl9wYXJzZQlQQVJBTVMgKChjaGFyICoqY2NwKSk7Ci1zdGF0aWMgdm9pZCBzeW1ib2xfbG9jYXRlCVBBUkFNUyAoKHN5bWJvbFMgKiwgQ09OU1QgY2hhciAqLCBzZWdULAotCQkJCQkgdmFsdWVULCBmcmFnUyAqKSk7Ci1zdGF0aWMgaW50IGFkZF90b19saXRfcG9vbAlQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdW5zaWduZWQgdmFsaWRhdGVfaW1tZWRpYXRlCVBBUkFNUyAoKHVuc2lnbmVkKSk7Ci1zdGF0aWMgaW50IHZhbGlkYXRlX29mZnNldF9pbW0JUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9wY29kZV9zZWxlY3QJUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBlbmRfb2ZfbGluZQkJUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IHJlZ19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwc3JfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBjb19wcm9jX251bWJlcglQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGNwX29wY19leHByCQlQQVJBTVMgKChjaGFyICoqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBjcF9yZWdfcmVxdWlyZWRfaGVyZQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZnBfcmVnX3JlcXVpcmVkX2hlcmUJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGNwX2FkZHJlc3Nfb2Zmc2V0CVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgbXlfZ2V0X2Zsb2F0X2V4cHJlc3Npb24JUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBza2lwX3Bhc3RfY29tbWEJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCB3YWxrX25vX2JpZ251bXMJUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgaW50IG5lZ2F0ZV9kYXRhX29wCVBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgKiwKLQkJCQkJIHVuc2lnbmVkIGxvbmcpKTsKLXN0YXRpYyBpbnQgZGF0YV9vcDIJCVBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgZnBfb3AyCQlQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyByZWdfbGlzdAkJUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIHZvaWQgdGh1bWJfbG9hZF9zdG9yZQlQQVJBTVMgKChjaGFyICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGRlY29kZV9zaGlmdAkJUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IGxkc3RfZXh0ZW5kCQlQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHRodW1iX2FkZF9zdWIJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGluc2VydF9yZWcJCVBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgdGh1bWJfc2hpZnQJCVBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCB0aHVtYl9tb3ZfY29tcGFyZQlQQVJBTVMgKChjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgc2V0X2NvbnN0YW50X2Zsb251bXMJUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZhbHVlVCBtZF9jaGFyc190b19udW1iZXIJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGluc2VydF9yZWdfYWxpYXMJUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIG91dHB1dF9pbnN0CQlQQVJBTVMgKChjaGFyICopKTsKLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCWFybV9wYXJzZV9yZWxvYyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotLyogQVJNIGluc3RydWN0aW9ucyB0YWtlIDRieXRlcyBpbiB0aGUgb2JqZWN0IGZpbGUsIFRodW1iIGluc3RydWN0aW9ucwotICAgdGFrZSAyOiAqLwotI2RlZmluZSBJTlNOX1NJWkUgICAgICAgNAotCi0vKiBMT05HRVNUX0lOU1QgaXMgdGhlIGxvbmdlc3QgYmFzaWMgaW5zdHJ1Y3Rpb24gbmFtZSB3aXRob3V0IGNvbmRpdGlvbnMgb3IgCi0gKiBmbGFncy4KLSAqIEFSTTdNIGhhcyA0IG9mIGxlbmd0aCA1Ci0gKi8KLQotI2RlZmluZSBMT05HRVNUX0lOU1QgNQotCi1zdHJ1Y3QgYXNtX29wY29kZSAKLXsKLSAgQ09OU1QgY2hhciAqICAgICAgICAgICB0ZW1wbGF0ZTsJLyogQmFzaWMgc3RyaW5nIHRvIG1hdGNoICovCi0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmFsdWU7CQkvKiBCYXNpYyBpbnN0cnVjdGlvbiBjb2RlICovCi0gIENPTlNUIGNoYXIgKiAgICAgICAgICAgY29tcF9zdWZmaXg7CS8qIENvbXB1bHNvcnkgc3VmZml4IHRoYXQgbXVzdCBmb2xsb3cgY29uZHMgKi8KLSAgQ09OU1Qgc3RydWN0IGFzbV9mbGcgKiBmbGFnczsJICAgICAgICAvKiBCaXRzIHRvIHRvZ2dsZSBpZiBmbGFnICduJyBzZXQgKi8KLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2YXJpYW50czsJLyogV2hpY2ggQ1BVIHZhcmlhbnRzIHRoaXMgZXhpc3RzIGZvciAqLwotICAvKiBGdW5jdGlvbiB0byBjYWxsIHRvIHBhcnNlIGFyZ3MgKi8KLSAgdm9pZCAoKiAgICAgICAgICAgICAgICBwYXJtcykgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBsb25nKSk7Ci19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGFzbV9vcGNvZGUgaW5zbnNbXSA9IAotewotLyogQVJNIEluc3RydWN0aW9ucyAqLwotICB7ImFuZCIsICAgMHgwMDAwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJlb3IiLCAgIDB4MDAyMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsic3ViIiwgICAweDAwNDAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InJzYiIsICAgMHgwMDYwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJhZGQiLCAgIDB4MDA4MDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsiYWRjIiwgICAweDAwYTAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7InNiYyIsICAgMHgwMGMwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJyc2MiLCAgIDB4MDBlMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fYXJpdH0sCi0gIHsib3JyIiwgICAweDAxODAwMDAwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fQU5ZLCAgICAgIGRvX2FyaXR9LAotICB7ImJpYyIsICAgMHgwMWMwMDAwMCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0FOWSwgICAgICBkb19hcml0fSwKLSAgeyJ0c3QiLCAgIDB4MDEwMDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJ0ZXEiLCAgIDB4MDEyMDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJjbXAiLCAgIDB4MDE0MDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJjbW4iLCAgIDB4MDE2MDAwMDAsIE5VTEwsICAgY21wX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fY21wfSwKLSAgeyJtb3YiLCAgIDB4MDFhMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fbW92fSwKLSAgeyJtdm4iLCAgIDB4MDFlMDAwMDAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9BTlksICAgICAgZG9fbW92fSwKLSAgeyJzdHIiLCAgIDB4MDQwMDAwMDAsIE5VTEwsICAgc3RyX2ZsYWdzLCAgIEFSTV9BTlksICAgICAgZG9fbGRzdH0sCi0gIHsibGRyIiwgICAweDA0MTAwMDAwLCBOVUxMLCAgIGxkcl9mbGFncywgICBBUk1fQU5ZLCAgICAgIGRvX2xkc3R9LAotICB7InN0bSIsICAgMHgwODAwMDAwMCwgTlVMTCwgICBzdG1fZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZG1zdG19LAotICB7ImxkbSIsICAgMHgwODEwMDAwMCwgTlVMTCwgICBsZG1fZmxhZ3MsICAgQVJNX0FOWSwgICAgICBkb19sZG1zdG19LAotICB7InN3aSIsICAgMHgwZjAwMDAwMCwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19zd2l9LAotICB7ImJsIiwgICAgMHgwYmZmZmZmZSwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19icmFuY2h9LAotICB7ImIiLCAgICAgMHgwYWZmZmZmZSwgTlVMTCwgICBOVUxMLCAgICAgICAgQVJNX0FOWSwgICAgICBkb19icmFuY2h9LAotCi0vKiBQc2V1ZG8gb3BzICovCi0gIHsiYWRyIiwgICAweDAyOGYwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX2Fkcn0sCi0gIHsibm9wIiwgICAweDAxYTAwMDAwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fQU5ZLCAgICAgIGRvX25vcH0sCi0KLS8qIEFSTSAyIG11bHRpcGxpZXMgKi8KLSAgeyJtdWwiLCAgIDB4MDAwMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV8yVVAsICAgICAgZG9fbXVsfSwKLSAgeyJtbGEiLCAgIDB4MDAyMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV8yVVAsICAgICAgZG9fbWxhfSwKLQotLyogQVJNIDMgLSBzd3AgaW5zdHJ1Y3Rpb25zICovCi0gIHsic3dwIiwgICAweDAxMDAwMDkwLCBOVUxMLCAgIGJ5dGVfZmxhZywgICBBUk1fM1VQLCAgICAgIGRvX3N3YXB9LAotCi0vKiBBUk0gNiBDb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgeyJtcnMiLCAgIDB4MDEwZjAwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV82VVAsICAgICAgZG9fbXJzfSwKLSAgeyJtc3IiLCAgIDB4MDEyMGYwMDAsIE5VTEwsICAgTlVMTCwgICAgICAgIEFSTV82VVAsICAgICAgZG9fbXNyfSwKLS8qIFNjb3R0Qjogb3VyIGNvZGUgdXNlcyAweDAxMjhmMDAwIGZvciBtc3IuCi0gICBOaWNrQzogIGJ1dCB0aGlzIGlzIHdyb25nIGJlY2F1c2UgdGhlIGJpdHMgMTYgYW5kIDE5IGFyZSBoYW5kbGVkCi0gICAgICAgICAgIGJ5IHRoZSBQU1JfeHh4IGRlZmluZXMgYWJvdmUuICAqLwotCi0vKiBBUk0gN00gbG9uZyBtdWx0aXBsaWVzIC0gbmVlZCBzaWduZWQvdW5zaWduZWQgZmxhZ3MhICovCi0gIHsic211bGwiLCAweDAwYzAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotICB7InVtdWxsIiwgMHgwMDgwMDA5MCwgTlVMTCwgICBzX2ZsYWcsICAgICAgQVJNX0xPTkdNVUwsICBkb19tdWxsfSwKLSAgeyJzbWxhbCIsIDB4MDBlMDAwOTAsIE5VTEwsICAgc19mbGFnLCAgICAgIEFSTV9MT05HTVVMLCAgZG9fbXVsbH0sCi0gIHsidW1sYWwiLCAweDAwYTAwMDkwLCBOVUxMLCAgIHNfZmxhZywgICAgICBBUk1fTE9OR01VTCwgIGRvX211bGx9LAotCi0vKiBBUk0gVEhVTUIgaW50ZXJ3b3JraW5nICovCi0gIHsiYngiLCAgICAweDAxMmZmZjEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBBUk1fVEhVTUIsICAgIGRvX2J4fSwKLQotLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0gIHsid2ZzIiwgICAweDBlMjAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7InJmcyIsICAgMHgwZTMwMDExMCwgTlVMTCwgICBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9jdHJsfSwKLSAgeyJ3ZmMiLCAgIDB4MGU0MDAxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY3RybH0sCi0gIHsicmZjIiwgICAweDBlNTAwMTEwLCBOVUxMLCAgIE5VTEwsICAgICAgICBGUFVfQUxMLCAgICAgIGRvX2ZwX2N0cmx9LAotICB7ImxkZiIsICAgMHgwYzEwMDEwMCwgInNkZXAiLCBOVUxMLCAgICAgICAgRlBVX0FMTCwgICAgICBkb19mcF9sZHN0fSwKLSAgeyJzdGYiLCAgIDB4MGMwMDAxMDAsICJzZGVwIiwgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfbGRzdH0sCi0gIHsibGZtIiwgICAweDBjMTAwMjAwLCBOVUxMLCAgIGxmbV9mbGFncywgICBGUFVfTUVNTVVMVEksIGRvX2ZwX2xkbXN0bX0sCi0gIHsic2ZtIiwgICAweDBjMDAwMjAwLCBOVUxMLCAgIHNmbV9mbGFncywgICBGUFVfTUVNTVVMVEksIGRvX2ZwX2xkbXN0bX0sCi0gIHsibXZmIiwgICAweDBlMDA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7Im1uZiIsICAgMHgwZTEwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhYnMiLCAgIDB4MGUyMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsicm5kIiwgICAweDBlMzA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InNxdCIsICAgMHgwZTQwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJsb2ciLCAgIDB4MGU1MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibGduIiwgICAweDBlNjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImV4cCIsICAgMHgwZTcwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJzaW4iLCAgIDB4MGU4MDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiY29zIiwgICAweDBlOTA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7InRhbiIsICAgMHgwZWEwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJhc24iLCAgIDB4MGViMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsiYWNzIiwgICAweDBlYzA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImF0biIsICAgMHgwZWQwODEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9tb25hZGljfSwKLSAgeyJ1cmQiLCAgIDB4MGVlMDgxMDAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfbW9uYWRpY30sCi0gIHsibnJtIiwgICAweDBlZjA4MTAwLCAic2RlIiwgIHJvdW5kX2ZsYWdzLCBGUFVfQUxMLCAgICAgIGRvX2ZwX21vbmFkaWN9LAotICB7ImFkZiIsICAgMHgwZTAwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InN1ZiIsICAgMHgwZTIwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJzZiIsICAgMHgwZTMwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7Im11ZiIsICAgMHgwZTEwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImR2ZiIsICAgMHgwZTQwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJkZiIsICAgMHgwZTUwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InBvdyIsICAgMHgwZTYwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJwdyIsICAgMHgwZTcwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InJtZiIsICAgMHgwZTgwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZtbCIsICAgMHgwZTkwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZkdiIsICAgMHgwZWEwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImZyZCIsICAgMHgwZWIwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7InBvbCIsICAgMHgwZWMwMDEwMCwgInNkZSIsICByb3VuZF9mbGFncywgRlBVX0FMTCwgICAgICBkb19mcF9keWFkaWN9LAotICB7ImNtZiIsICAgMHgwZTkwZjExMCwgTlVMTCwgICBleGNlcHRfZmxhZywgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAotICB7ImNuZiIsICAgMHgwZWIwZjExMCwgTlVMTCwgICBleGNlcHRfZmxhZywgRlBVX0FMTCwgICAgICBkb19mcF9jbXB9LAotLyogVGhlIEZQQTEwIGRhdGEgc2hlZXQgc3VnZ2VzdHMgdGhhdCB0aGUgJ0UnIG9mIGNtZmUvY25mZSBzaG91bGQgbm90Ci0gICBiZSBhbiBvcHRpb25hbCBzdWZmaXgsIGJ1dCBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbi4gIFRvIGJlIGNvbXBhdGlibGUsCi0gICB3ZSBhY2NlcHQgZWl0aGVyLiAgKi8KLSAgeyJjbWZlIiwgIDB4MGVkMGYxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLSAgeyJjbmZlIiwgIDB4MGVmMGYxMTAsIE5VTEwsICAgTlVMTCwgICAgICAgIEZQVV9BTEwsICAgICAgZG9fZnBfY21wfSwKLSAgeyJmbHQiLCAgIDB4MGUwMDAxMTAsICJzZGUiLCAgcm91bmRfZmxhZ3MsIEZQVV9BTEwsICAgICAgZG9fZnBfZnJvbV9yZWd9LAotICB7ImZpeCIsICAgMHgwZTEwMDExMCwgTlVMTCwgICBmaXhfZmxhZ3MsICAgRlBVX0FMTCwgICAgICBkb19mcF90b19yZWd9LAotCi0vKiBHZW5lcmljIGNvcHJlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgeyJjZHAiLCAgIDB4MGUwMDAwMDAsIE5VTEwsICBOVUxMLCAgICAgICAgIEFSTV8yVVAsICAgICAgZG9fY2RwfSwKLSAgeyJsZGMiLCAgIDB4MGMxMDAwMDAsIE5VTEwsICBjcGxvbmdfZmxhZywgIEFSTV8yVVAsICAgICAgZG9fbHN0Y30sCi0gIHsic3RjIiwgICAweDBjMDAwMDAwLCBOVUxMLCAgY3Bsb25nX2ZsYWcsICBBUk1fMlVQLCAgICAgIGRvX2xzdGN9LAotICB7Im1jciIsICAgMHgwZTAwMDAxMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jb19yZWd9LAotICB7Im1yYyIsICAgMHgwZTEwMDAxMCwgTlVMTCwgIE5VTEwsICAgICAgICAgQVJNXzJVUCwgICAgICBkb19jb19yZWd9LAotfTsKLQotLyogZGVmaW5lcyBmb3IgdmFyaW91cyBiaXRzIHRoYXQgd2Ugd2lsbCB3YW50IHRvIHRvZ2dsZSAqLwotCi0jZGVmaW5lIElOU1RfSU1NRURJQVRFCTB4MDIwMDAwMDAKLSNkZWZpbmUgT0ZGU0VUX1JFRwkweDAyMDAwMDAwCi0jZGVmaW5lIEhXT0ZGU0VUX0lNTSAgICAweDAwNDAwMDAwCi0jZGVmaW5lIFNISUZUX0JZX1JFRwkweDAwMDAwMDEwCi0jZGVmaW5lIFBSRV9JTkRFWAkweDAxMDAwMDAwCi0jZGVmaW5lIElOREVYX1VQCTB4MDA4MDAwMDAKLSNkZWZpbmUgV1JJVEVfQkFDSwkweDAwMjAwMDAwCi0jZGVmaW5lIE1VTFRJX1NFVF9QU1IJMHgwMDQwMDAwMAotCi0jZGVmaW5lIExJVEVSQUxfTUFTSwkweGYwMDBmMDAwCi0jZGVmaW5lIENPTkRfTUFTSwkweGYwMDAwMDAwCi0jZGVmaW5lIE9QQ09ERV9NQVNLCTB4ZmUxZmZmZmYKLSNkZWZpbmUgREFUQV9PUF9TSElGVAkyMQotCi0vKiBDb2RlcyB0byBkaXN0aW5ndWlzaCB0aGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgKi8KLQotI2RlZmluZSBPUENPREVfQU5ECTAKLSNkZWZpbmUgT1BDT0RFX0VPUgkxCi0jZGVmaW5lIE9QQ09ERV9TVUIJMgotI2RlZmluZSBPUENPREVfUlNCCTMKLSNkZWZpbmUgT1BDT0RFX0FERAk0Ci0jZGVmaW5lIE9QQ09ERV9BREMJNQotI2RlZmluZSBPUENPREVfU0JDCTYKLSNkZWZpbmUgT1BDT0RFX1JTQwk3Ci0jZGVmaW5lIE9QQ09ERV9UU1QJOAotI2RlZmluZSBPUENPREVfVEVRCTkKLSNkZWZpbmUgT1BDT0RFX0NNUAkxMAotI2RlZmluZSBPUENPREVfQ01OCTExCi0jZGVmaW5lIE9QQ09ERV9PUlIJMTIKLSNkZWZpbmUgT1BDT0RFX01PVgkxMwotI2RlZmluZSBPUENPREVfQklDCTE0Ci0jZGVmaW5lIE9QQ09ERV9NVk4JMTUKLQotc3RhdGljIHZvaWQgZG9fdF9ub3AJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FyaXQJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FkZAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfYXNyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9icmFuY2g5CVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDEyCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2JyYW5jaDIzCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2J4CQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9jb21wYXJlCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xkbXN0bQkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfbGRyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHJiCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHJoCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9sZHMJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2xzbAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3RfbHNyCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9tb3YJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X3B1c2hfcG9wCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X3N0cgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyYgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3RyaAkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLXN0YXRpYyB2b2lkIGRvX3Rfc3ViCQlQQVJBTVMgKChjaGFyICpvcGVyYW5kcykpOwotc3RhdGljIHZvaWQgZG9fdF9zd2kJCVBBUkFNUyAoKGNoYXIgKm9wZXJhbmRzKSk7Ci1zdGF0aWMgdm9pZCBkb190X2FkcgkJUEFSQU1TICgoY2hhciAqb3BlcmFuZHMpKTsKLQotI2RlZmluZSBUX09QQ09ERV9NVUwgMHg0MzQwCi0jZGVmaW5lIFRfT1BDT0RFX1RTVCAweDQyMDAKLSNkZWZpbmUgVF9PUENPREVfQ01OIDB4NDJjMAotI2RlZmluZSBUX09QQ09ERV9ORUcgMHg0MjQwCi0jZGVmaW5lIFRfT1BDT0RFX01WTiAweDQzYzAKLQotI2RlZmluZSBUX09QQ09ERV9BRERfUjMJMHgxODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9SMyAweDFhMDAKLSNkZWZpbmUgVF9PUENPREVfQUREX0hJIDB4NDQwMAotI2RlZmluZSBUX09QQ09ERV9BRERfU1QgMHhiMDAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9TVCAweGIwODAKLSNkZWZpbmUgVF9PUENPREVfQUREX1NQIDB4YTgwMAotI2RlZmluZSBUX09QQ09ERV9BRERfUEMgMHhhMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0FERF9JOCAweDMwMDAKLSNkZWZpbmUgVF9PUENPREVfU1VCX0k4IDB4MzgwMAotI2RlZmluZSBUX09QQ09ERV9BRERfSTMgMHgxYzAwCi0jZGVmaW5lIFRfT1BDT0RFX1NVQl9JMyAweDFlMDAKLQotI2RlZmluZSBUX09QQ09ERV9BU1JfUgkweDQxMDAKLSNkZWZpbmUgVF9PUENPREVfTFNMX1IJMHg0MDgwCi0jZGVmaW5lIFRfT1BDT0RFX0xTUl9SICAweDQwYzAKLSNkZWZpbmUgVF9PUENPREVfQVNSX0kJMHgxMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xTTF9JCTB4MDAwMAotI2RlZmluZSBUX09QQ09ERV9MU1JfSQkweDA4MDAKLQotI2RlZmluZSBUX09QQ09ERV9NT1ZfSTgJMHgyMDAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9JOCAweDI4MDAKLSNkZWZpbmUgVF9PUENPREVfQ01QX0xSIDB4NDI4MAotI2RlZmluZSBUX09QQ09ERV9NT1ZfSFIgMHg0NjAwCi0jZGVmaW5lIFRfT1BDT0RFX0NNUF9IUiAweDQ1MDAKLQotI2RlZmluZSBUX09QQ09ERV9MRFJfUEMgMHg0ODAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9TUCAweDk4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1NQIDB4OTAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfSVcgMHg2ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9JVyAweDYwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX0lIIDB4ODgwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfSUggMHg4MDAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9JQiAweDc4MDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX0lCIDB4NzAwMAotI2RlZmluZSBUX09QQ09ERV9MRFJfUlcgMHg1ODAwCi0jZGVmaW5lIFRfT1BDT0RFX1NUUl9SVyAweDUwMDAKLSNkZWZpbmUgVF9PUENPREVfTERSX1JIIDB4NWEwMAotI2RlZmluZSBUX09QQ09ERV9TVFJfUkggMHg1MjAwCi0jZGVmaW5lIFRfT1BDT0RFX0xEUl9SQiAweDVjMDAKLSNkZWZpbmUgVF9PUENPREVfU1RSX1JCIDB4NTQwMAotCi0jZGVmaW5lIFRfT1BDT0RFX1BVU0gJMHhiNDAwCi0jZGVmaW5lIFRfT1BDT0RFX1BPUAkweGJjMDAKLQotI2RlZmluZSBUX09QQ09ERV9CUkFOQ0ggMHhlN2ZlCi0KLXN0YXRpYyBpbnQgdGh1bWJfcmVnCQlQQVJBTVMgKChjaGFyICoqIHN0ciwgaW50IGhpX2xvKSk7Ci0KLSNkZWZpbmUgVEhVTUJfU0laRQkyCS8qIFNpemUgb2YgdGh1bWIgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVEhVTUJfUkVHX0xPCTB4MQotI2RlZmluZSBUSFVNQl9SRUdfSEkJMHgyCi0jZGVmaW5lIFRIVU1CX1JFR19BTlkJMHgzCi0KLSNkZWZpbmUgVEhVTUJfSDEJMHgwMDgwCi0jZGVmaW5lIFRIVU1CX0gyCTB4MDA0MAotCi0jZGVmaW5lIFRIVU1CX0FTUiAwCi0jZGVmaW5lIFRIVU1CX0xTTCAxCi0jZGVmaW5lIFRIVU1CX0xTUiAyCi0KLSNkZWZpbmUgVEhVTUJfTU9WRSAwCi0jZGVmaW5lIFRIVU1CX0NPTVBBUkUgMQotCi0jZGVmaW5lIFRIVU1CX0xPQUQgMAotI2RlZmluZSBUSFVNQl9TVE9SRSAxCi0KLSNkZWZpbmUgVEhVTUJfUFBfUENfTFIgMHgwMTAwCi0KLS8qIFRoZXNlIHRocmVlIGFyZSB1c2VkIGZvciBpbW1lZGlhdGUgc2hpZnRzLCBkbyBub3QgYWx0ZXIgKi8KLSNkZWZpbmUgVEhVTUJfV09SRCAyCi0jZGVmaW5lIFRIVU1CX0hBTEZXT1JEIDEKLSNkZWZpbmUgVEhVTUJfQllURSAwCi0KLXN0cnVjdCB0aHVtYl9vcGNvZGUgCi17Ci0gIENPTlNUIGNoYXIgKiAgdGVtcGxhdGU7CS8qIEJhc2ljIHN0cmluZyB0byBtYXRjaCAqLwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwkJLyogQmFzaWMgaW5zdHJ1Y3Rpb24gY29kZSAqLwotICBpbnQgICAgICAgICAgIHNpemU7Ci0gIHZvaWQgKCogICAgICAgcGFybXMpIFBBUkFNUyAoKGNoYXIgKikpOyAgLyogRnVuY3Rpb24gdG8gY2FsbCB0byBwYXJzZSBhcmdzICovCi19OwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSB0aW5zbnNbXSA9Ci17Ci0gIHsiYWRjIiwJMHg0MTQwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJhZGQiLAkweDAwMDAsCQkyLAlkb190X2FkZH0sCi0gIHsiYW5kIiwJMHg0MDAwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJhc3IiLAkweDAwMDAsCQkyLAlkb190X2Fzcn0sCi0gIHsiYiIsCQlUX09QQ09ERV9CUkFOQ0gsIDIsCWRvX3RfYnJhbmNoMTJ9LAotICB7ImJlcSIsCTB4ZDBmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYm5lIiwJMHhkMWZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiY3MiLAkweGQyZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJocyIsCTB4ZDJmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmNjIiwJMHhkM2ZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJidWwiLAkweGQzZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJsbyIsCTB4ZDNmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYm1pIiwJMHhkNGZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJicGwiLAkweGQ1ZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJ2cyIsCTB4ZDZmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYnZjIiwJMHhkN2ZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiaGkiLAkweGQ4ZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJscyIsCTB4ZDlmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmdlIiwJMHhkYWZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJibHQiLAkweGRiZmUsCQkyLAlkb190X2JyYW5jaDl9LAotICB7ImJndCIsCTB4ZGNmZSwJCTIsCWRvX3RfYnJhbmNoOX0sCi0gIHsiYmxlIiwJMHhkZGZlLAkJMiwJZG9fdF9icmFuY2g5fSwKLSAgeyJiaWMiLAkweDQzODAsCQkyLAlkb190X2FyaXR9LAotICB7ImJsIiwJMHhmN2ZmZmZmZSwJNCwJZG9fdF9icmFuY2gyM30sCi0gIHsiYngiLAkweDQ3MDAsCQkyLAlkb190X2J4fSwKLSAgeyJjbW4iLAlUX09QQ09ERV9DTU4sCTIsCWRvX3RfYXJpdH0sCi0gIHsiY21wIiwJMHgwMDAwLAkJMiwJZG9fdF9jb21wYXJlfSwKLSAgeyJlb3IiLAkweDQwNDAsCQkyLAlkb190X2FyaXR9LAotICB7ImxkbWlhIiwJMHhjODAwLAkJMiwJZG9fdF9sZG1zdG19LAotICB7ImxkciIsCTB4MDAwMCwJCTIsCWRvX3RfbGRyfSwKLSAgeyJsZHJiIiwJMHgwMDAwLAkJMiwJZG9fdF9sZHJifSwKLSAgeyJsZHJoIiwJMHgwMDAwLAkJMiwJZG9fdF9sZHJofSwKLSAgeyJsZHJzYiIsCTB4NTYwMCwJCTIsCWRvX3RfbGRzfSwKLSAgeyJsZHJzaCIsCTB4NWUwMCwJCTIsCWRvX3RfbGRzfSwKLSAgeyJsZHNiIiwJMHg1NjAwLAkJMiwJZG9fdF9sZHN9LAotICB7Imxkc2giLAkweDVlMDAsCQkyLAlkb190X2xkc30sCi0gIHsibHNsIiwJMHgwMDAwLAkJMiwJZG9fdF9sc2x9LAotICB7ImxzciIsCTB4MDAwMCwJCTIsCWRvX3RfbHNyfSwKLSAgeyJtb3YiLAkweDAwMDAsCQkyLAlkb190X21vdn0sCi0gIHsibXVsIiwJVF9PUENPREVfTVVMLAkyLAlkb190X2FyaXR9LAotICB7Im12biIsCVRfT1BDT0RFX01WTiwJMiwJZG9fdF9hcml0fSwKLSAgeyJuZWciLAlUX09QQ09ERV9ORUcsCTIsCWRvX3RfYXJpdH0sCi0gIHsib3JyIiwJMHg0MzAwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJwb3AiLAkweGJjMDAsCQkyLAlkb190X3B1c2hfcG9wfSwKLSAgeyJwdXNoIiwJMHhiNDAwLAkJMiwJZG9fdF9wdXNoX3BvcH0sCi0gIHsicm9yIiwJMHg0MWMwLAkJMiwJZG9fdF9hcml0fSwKLSAgeyJzYmMiLAkweDQxODAsCQkyLAlkb190X2FyaXR9LAotICB7InN0bWlhIiwJMHhjMDAwLAkJMiwJZG9fdF9sZG1zdG19LAotICB7InN0ciIsCTB4MDAwMCwJCTIsCWRvX3Rfc3RyfSwKLSAgeyJzdHJiIiwJMHgwMDAwLAkJMiwJZG9fdF9zdHJifSwKLSAgeyJzdHJoIiwJMHgwMDAwLAkJMiwJZG9fdF9zdHJofSwKLSAgeyJzd2kiLAkweGRmMDAsCQkyLAlkb190X3N3aX0sCi0gIHsic3ViIiwJMHgwMDAwLAkJMiwJZG9fdF9zdWJ9LAotICB7InRzdCIsCVRfT1BDT0RFX1RTVCwJMiwJZG9fdF9hcml0fSwKLSAgLyogUHNldWRvIG9wczogKi8KLSAgeyJhZHIiLCAgICAgICAweDAwMDAsICAgICAgICAgMiwgICAgICBkb190X2Fkcn0sCi0gIHsibm9wIiwgICAgICAgMHg0NkMwLCAgICAgICAgIDIsICAgICAgZG9fdF9ub3B9LCAgICAgIC8qIG1vdiByOCxyOCAqLwotfTsKLQotc3RydWN0IHJlZ19lbnRyeQotewotICBDT05TVCBjaGFyICogbmFtZTsKLSAgaW50ICAgICAgICAgIG51bWJlcjsKLX07Ci0KLSNkZWZpbmUgaW50X3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDAgJiYgKHJlZykgPD0gMTUpCi0jZGVmaW5lIGNwX3JlZ2lzdGVyKHJlZykgKChyZWcpID49IDMyICYmIChyZWcpIDw9IDQ3KQotI2RlZmluZSBmcF9yZWdpc3RlcihyZWcpICgocmVnKSA+PSAxNiAmJiAocmVnKSA8PSAyMykKLQotI2RlZmluZSBSRUdfUEMJMTUKLSNkZWZpbmUgUkVHX0xSICAxNAotI2RlZmluZSBSRUdfU1AgIDEzCi0KLS8qIFRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgbmFtZXM7ICBVc2VycyBjYW4gYWRkIGFsaWFzZXMgd2l0aCAucmVxICovCi1zdGF0aWMgQ09OU1Qgc3RydWN0IHJlZ19lbnRyeSByZWdfdGFibGVbXSA9Ci17Ci0gIC8qIFByb2Nlc3NvciBSZWdpc3RlciBOdW1iZXJzICovCi0gIHsicjAiLCAwfSwgICAgeyJyMSIsIDF9LCAgICAgIHsicjIiLCAyfSwgICAgICB7InIzIiwgM30sCi0gIHsicjQiLCA0fSwgICAgeyJyNSIsIDV9LCAgICAgIHsicjYiLCA2fSwgICAgICB7InI3IiwgN30sCi0gIHsicjgiLCA4fSwgICAgeyJyOSIsIDl9LCAgICAgIHsicjEwIiwgMTB9LCAgICB7InIxMSIsIDExfSwKLSAgeyJyMTIiLCAxMn0sICB7InIxMyIsIFJFR19TUH0seyJyMTQiLCBSRUdfTFJ9LHsicjE1IiwgUkVHX1BDfSwKLSAgLyogQVBDUyBjb252ZW50aW9ucyAqLwotICB7ImExIiwgMH0sCXsiYTIiLCAxfSwgICAgeyJhMyIsIDJ9LCAgICAgeyJhNCIsIDN9LAotICB7InYxIiwgNH0sCXsidjIiLCA1fSwgICAgeyJ2MyIsIDZ9LCAgICAgeyJ2NCIsIDd9LCAgICAgeyJ2NSIsIDh9LAotICB7InY2IiwgOX0sCXsic2IiLCA5fSwgICAgeyJ2NyIsIDEwfSwgICAgeyJzbCIsIDEwfSwKLSAgeyJmcCIsIDExfSwJeyJpcCIsIDEyfSwgICB7InNwIiwgUkVHX1NQfSx7ImxyIiwgUkVHX0xSfSx7InBjIiwgUkVHX1BDfSwKLSAgLyogRlAgUmVnaXN0ZXJzICovCi0gIHsiZjAiLCAxNn0sICAgeyJmMSIsIDE3fSwgICB7ImYyIiwgMTh9LCAgIHsiZjMiLCAxOX0sCi0gIHsiZjQiLCAyMH0sICAgeyJmNSIsIDIxfSwgICB7ImY2IiwgMjJ9LCAgIHsiZjciLCAyM30sCi0gIHsiYzAiLCAzMn0sICAgeyJjMSIsIDMzfSwgICB7ImMyIiwgMzR9LCAgIHsiYzMiLCAzNX0sCi0gIHsiYzQiLCAzNn0sICAgeyJjNSIsIDM3fSwgICB7ImM2IiwgMzh9LCAgIHsiYzciLCAzOX0sCi0gIHsiYzgiLCA0MH0sICAgeyJjOSIsIDQxfSwgICB7ImMxMCIsIDQyfSwgIHsiYzExIiwgNDN9LAotICB7ImMxMiIsIDQ0fSwgIHsiYzEzIiwgNDV9LCAgeyJjMTQiLCA0Nn0sICB7ImMxNSIsIDQ3fSwKLSAgeyJjcjAiLCAzMn0sICB7ImNyMSIsIDMzfSwgIHsiY3IyIiwgMzR9LCAgeyJjcjMiLCAzNX0sCi0gIHsiY3I0IiwgMzZ9LCAgeyJjcjUiLCAzN30sICB7ImNyNiIsIDM4fSwgIHsiY3I3IiwgMzl9LAotICB7ImNyOCIsIDQwfSwgIHsiY3I5IiwgNDF9LCAgeyJjcjEwIiwgNDJ9LCB7ImNyMTEiLCA0M30sCi0gIHsiY3IxMiIsIDQ0fSwgeyJjcjEzIiwgNDV9LCB7ImNyMTQiLCA0Nn0sIHsiY3IxNSIsIDQ3fSwKLSAge05VTEwsIDB9Ci19OwotCi0jZGVmaW5lIGJhZF9hcmdzIF8oIkJhZCBhcmd1bWVudHMgdG8gaW5zdHJ1Y3Rpb24iKTsKLSNkZWZpbmUgYmFkX3BjIF8oInIxNSBub3QgYWxsb3dlZCBoZXJlIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX29wc19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fdG9wc19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fY29uZF9oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fc2hpZnRfaHNoID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICogYXJtX3JlZ19oc2ggPSBOVUxMOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBhcm1fcHNyX2hzaCA9IE5VTEw7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLQotc3RhdGljIHZvaWQgc19yZXEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2V2ZW4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2x0b3JnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19hcm0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3RodW1iIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb2RlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19mb3JjZV90aHVtYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfdGh1bWJfZnVuYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfdGh1bWJfc2V0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgYXJtX3NfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGFybV9zX2RhdGEgUEFSQU1TICgoaW50KSk7Ci0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgYXJtX3Nfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfYXJtX2VsZl9jb25zIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgbXlfZ2V0X2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgY2hhciAqKikpOwotCi1DT05TVCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJyZXEiLCAgICAgICAgIHNfcmVxLCAgICAgICAgIDAgfSwJLyogTmV2ZXIgY2FsbGVkIGJlY2FzdWUgJy5yZXEnIGRvZXMgbm90IHN0YXJ0IGxpbmUgKi8KLSAgeyAiYnNzIiwgICAgICAgICBzX2JzcywgICAgICAgICAwIH0sCi0gIHsgImFsaWduIiwgICAgICAgc19hbGlnbiwgICAgICAgMCB9LAotICB7ICJhcm0iLCAgICAgICAgIHNfYXJtLCAgICAgICAgIDAgfSwKLSAgeyAidGh1bWIiLCAgICAgICBzX3RodW1iLCAgICAgICAwIH0sCi0gIHsgImNvZGUiLCAgICAgICAgc19jb2RlLCAgICAgICAgMCB9LAotICB7ICJmb3JjZV90aHVtYiIsIHNfZm9yY2VfdGh1bWIsIDAgfSwKLSAgeyAidGh1bWJfZnVuYyIsICBzX3RodW1iX2Z1bmMsICAwIH0sCi0gIHsgInRodW1iX3NldCIsICAgc190aHVtYl9zZXQsICAgMCB9LAotICB7ICJldmVuIiwgICAgICAgIHNfZXZlbiwgICAgICAgIDAgfSwKLSAgeyAibHRvcmciLCAgICAgICBzX2x0b3JnLCAgICAgICAwIH0sCi0gIHsgInBvb2wiLCAgICAgICAgc19sdG9yZywgICAgICAgMCB9LAotICAvKiBBbGxvdyBmb3IgdGhlIGVmZmVjdCBvZiBzZWN0aW9uIGNoYW5nZXMuICAqLwotICB7ICJ0ZXh0IiwgICAgICAgIGFybV9zX3RleHQsICAgIDAgfSwKLSAgeyAiZGF0YSIsICAgICAgICBhcm1fc19kYXRhLCAgICAwIH0sCi0jaWZkZWYgT0JKX0VMRiAgCi0gIHsgInNlY3Rpb24iLCAgICAgYXJtX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0aW9uLnMiLCAgIGFybV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdCIsICAgICAgICBhcm1fc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QucyIsICAgICAgYXJtX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJ3b3JkIiwgICAgICAgIHNfYXJtX2VsZl9jb25zLCA0IH0sCi0gIHsgImxvbmciLCAgICAgICAgc19hcm1fZWxmX2NvbnMsIDQgfSwKLSNlbHNlCi0gIHsgIndvcmQiLCAgICAgICAgY29ucywgNH0sCi0jZW5kaWYKLSAgeyAiZXh0ZW5kIiwgICAgICBmbG9hdF9jb25zLCAneCcgfSwKLSAgeyAibGRvdWJsZSIsICAgICBmbG9hdF9jb25zLCAneCcgfSwKLSAgeyAicGFja2VkIiwgICAgICBmbG9hdF9jb25zLCAncCcgfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLS8qIFN0dWZmIG5lZWRlZCB0byByZXNvbHZlIHRoZSBsYWJlbCBhbWJpZ3VpdHkKLSAgIEFzOgotICAgICAuLi4KLSAgICAgbGFiZWw6ICAgPGluc24+Ci0gICBtYXkgZGlmZmVyIGZyb206Ci0gICAgIC4uLgotICAgICBsYWJlbDoKLSAgICAgICAgICAgICAgPGluc24+Ci0qLwotCi1zeW1ib2xTICogIGxhc3RfbGFiZWxfc2VlbjsKLXN0YXRpYyBpbnQgbGFiZWxfaXNfdGh1bWJfZnVuY3Rpb25fbmFtZSA9IGZhbHNlOwotCi0vKiBMaXRlcmFsIHN0dWZmICovCi0KLSNkZWZpbmUgTUFYX0xJVEVSQUxfUE9PTF9TSVpFIDEwMjQKLQotdHlwZWRlZiBzdHJ1Y3QgbGl0ZXJhbFMKLXsKLSAgc3RydWN0IGV4cHJlc3Npb25TICBleHA7Ci0gIHN0cnVjdCBhcm1faXQgKiAgICAgaW5zdDsKLX0gbGl0ZXJhbFQ7Ci0KLWxpdGVyYWxUICBsaXRlcmFsc1tNQVhfTElURVJBTF9QT09MX1NJWkVdOwotaW50ICAgICAgIG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlID0gMDsgLyogTmV4dCBmcmVlIGVudHJ5IGluIHRoZSBwb29sICovCi1pbnQgICAgICAgbGl0X3Bvb2xfbnVtID0gMTsgLyogTmV4dCBsaXRlcmFsIHBvb2wgbnVtYmVyICovCi1zeW1ib2xTICogY3VycmVudF9wb29sUCA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQKLWFkZF90b19saXRfcG9vbCAoKQotewotICBpbnQgbGl0X2NvdW50ID0gMDsKLQotICBpZiAoY3VycmVudF9wb29sUCA9PSBOVUxMKQotICAgIGN1cnJlbnRfcG9vbFAgPSBzeW1ib2xfY3JlYXRlIChGQUtFX0xBQkVMX05BTUUsIHVuZGVmaW5lZF9zZWN0aW9uLAotCQkJCSAgICh2YWx1ZVQpIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0KLSAgLyogQ2hlY2sgaWYgdGhpcyBsaXRlcmFsIHZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIHBvb2w6ICovCi0gIHdoaWxlIChsaXRfY291bnQgPCBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkKLSAgICB7Ci0gICAgICBpZiAobGl0ZXJhbHNbbGl0X2NvdW50XS5leHAuWF9vcCA9PSBpbnN0LnJlbG9jLmV4cC5YX29wCi0gICAgICAgICAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50Ci0gICAgICAgICAgJiYgbGl0ZXJhbHNbbGl0X2NvdW50XS5leHAuWF9hZGRfbnVtYmVyID09IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcgotICAgICAgICAgICYmIGxpdGVyYWxzW2xpdF9jb3VudF0uZXhwLlhfdW5zaWduZWQgPT0gaW5zdC5yZWxvYy5leHAuWF91bnNpZ25lZCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBsaXRfY291bnQrKzsKLSAgICB9Ci0KLSAgaWYgKGxpdF9jb3VudCA9PSBuZXh0X2xpdGVyYWxfcG9vbF9wbGFjZSkgLyogbmV3IGVudHJ5ICovCi0gICAgewotICAgICAgaWYgKG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlID4gTUFYX0xJVEVSQUxfUE9PTF9TSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5lcnJvciA9IF8oIkxpdGVyYWwgUG9vbCBPdmVyZmxvdyIpOwotICAgICAgICAgIHJldHVybiBGQUlMOwotICAgICAgICB9Ci0KLSAgICAgIGxpdGVyYWxzW25leHRfbGl0ZXJhbF9wb29sX3BsYWNlXS5leHAgPSBpbnN0LnJlbG9jLmV4cDsKLSAgICAgIGxpdF9jb3VudCA9IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKys7Ci0gICAgfQotCi0gIGluc3QucmVsb2MuZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyID0gKGxpdF9jb3VudCkgKiA0IC0gODsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sID0gY3VycmVudF9wb29sUDsKLQotICByZXR1cm4gU1VDQ0VTUzsKLX0KLSAKLS8qIENhbid0IHVzZSBzeW1ib2xfbmV3IGhlcmUsIHNvIGhhdmUgdG8gY3JlYXRlIGEgc3ltYm9sIGFuZCB0aGVuIGF0Ci0gICBhIGxhdGVyIGRhdGUgYXNzaWduIGl0IGEgdmFsdWUuIFRoYXRzIHdoYXQgdGhlc2UgZnVuY3Rpb25zIGRvLiAgKi8KLXN0YXRpYyB2b2lkCi1zeW1ib2xfbG9jYXRlIChzeW1ib2xQLCBuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKQotICAgICBzeW1ib2xTICogICAgc3ltYm9sUDsgCi0gICAgIENPTlNUIGNoYXIgKiBuYW1lOwkJLyogSXQgaXMgY29waWVkLCB0aGUgY2FsbGVyIGNhbiBtb2RpZnkgKi8KLSAgICAgc2VnVCAgICAgICAgIHNlZ21lbnQ7CS8qIFNlZ21lbnQgaWRlbnRpZmllciAoU0VHXzxzb21ldGhpbmc+KSAqLwotICAgICB2YWx1ZVQgICAgICAgdmFsdTsJCS8qIFN5bWJvbCB2YWx1ZSAqLwotICAgICBmcmFnUyAqICAgICAgZnJhZzsJCS8qIEFzc29jaWF0ZWQgZnJhZ21lbnQgKi8KLXsKLSAgdW5zaWduZWQgaW50IG5hbWVfbGVuZ3RoOwotICBjaGFyICogcHJlc2VydmVkX2NvcHlfb2ZfbmFtZTsKLQotICBuYW1lX2xlbmd0aCA9IHN0cmxlbiAobmFtZSkgKyAxOyAgICAgIC8qICsxIGZvciBcMCAqLwotICBvYnN0YWNrX2dyb3cgKCZub3RlcywgbmFtZSwgbmFtZV9sZW5ndGgpOwotICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lID0gb2JzdGFja19maW5pc2ggKCZub3Rlcyk7Ci0jaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQotICBpZiAocHJlc2VydmVkX2NvcHlfb2ZfbmFtZVswXSA9PSAnXycpCi0gICAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSsrOwotI2VuZGlmCi0KLSNpZmRlZiB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUKLSAgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSA9Ci0gICAgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChwcmVzZXJ2ZWRfY29weV9vZl9uYW1lKTsKLSNlbmRpZgotCi0gIFNfU0VUX05BTUUgKHN5bWJvbFAsIHByZXNlcnZlZF9jb3B5X29mX25hbWUpOwotCi0gIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNlZ21lbnQpOwotICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgdmFsdSk7Ci0gIHN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzKHN5bWJvbFApOwotCi0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZyk7Ci0KLSAgLyogTGluayB0byBlbmQgb2Ygc3ltYm9sIGNoYWluLiAgKi8KLSAgewotICAgIGV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLSAgICBpZiAoc3ltYm9sX3RhYmxlX2Zyb3plbikKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sUCwgc3ltYm9sX2xhc3RQLCAmIHN5bWJvbF9yb290UCwgJiBzeW1ib2xfbGFzdFApOwotCi0gIG9ial9zeW1ib2xfbmV3X2hvb2sgKHN5bWJvbFApOwotCi0jaWZkZWYgdGNfc3ltYm9sX25ld19ob29rCi0gIHRjX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0jZW5kaWYKLSAKLSNpZmRlZiBERUJVR19TWU1TCi0gIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHN5bWJvbF9yb290UCwgc3ltYm9sX2xhc3RQKTsKLSNlbmRpZiAvKiBERUJVR19TWU1TICovCi19Ci0KLS8qIENoZWNrIHRoYXQgYW4gaW1tZWRpYXRlIGlzIHZhbGlkLCBhbmQgaWYgc28sIGNvbnZlcnQgaXQgdG8gdGhlIHJpZ2h0IGZvcm1hdC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXZhbGlkYXRlX2ltbWVkaWF0ZSAodmFsKQotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotewotICB1bnNpZ25lZCBpbnQgYTsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIAotI2RlZmluZSByb3RhdGVfbGVmdCh2LCBuKSAodiA8PCBuIHwgdiA+PiAoMzIgLSBuKSkKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSAyKQotICAgIGlmICgoYSA9IHJvdGF0ZV9sZWZ0ICh2YWwsIGkpKSA8PSAweGZmKQotICAgICAgcmV0dXJuIGEgfCAoaSA8PCA3KTsgLyogMTItYml0IHBhY2s6IFtzaGlmdC1jbnQsY29uc3RdICovCi0gIAotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfb2Zmc2V0X2ltbSAodmFsLCBod3NlKQotICAgICBpbnQgdmFsOwotICAgICBpbnQgaHdzZTsKLXsKLSAgaWYgKChod3NlICYmICh2YWwgPCAtMjU1IHx8IHZhbCA+IDI1NSkpCi0gICAgICB8fCAodmFsIDwgLTQwOTUgfHwgdmFsID4gNDA5NSkpCi0gICAgIHJldHVybiBGQUlMOwotICByZXR1cm4gdmFsOwotfQotCi0gICAgCi1zdGF0aWMgdm9pZAotc19yZXEgKGEpCi0gICAgIGludCBhOwotewotICBhc19iYWQgKF8oIkludmFsaWQgc3ludGF4IGZvciAucmVxIGRpcmVjdGl2ZS4iKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2JzcyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBXZSBkb24ndCBzdXBwb3J0IHB1dHRpbmcgZnJhZ3MgaW4gdGhlIEJTUyBzZWdtZW50LCB3ZSBmYWtlIGl0IGJ5Ci0gICAgIG1hcmtpbmcgaW5fYnNzLCB0aGVuIGxvb2tpbmcgYXQgc19za2lwIGZvciBjbHVlcz8uLiAqLwotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2V2ZW4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKCFuZWVkX3Bhc3NfMikJCS8qIE5ldmVyIG1ha2UgZnJhZyBpZiBleHBlY3QgZXh0cmEgcGFzcy4gKi8KLSAgICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSAgCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDEpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfbHRvcmcgKGlnbm9yZWQpCi0gICAgIGludCBpZ25vcmVkOwotewotICBpbnQgbGl0X2NvdW50ID0gMDsKLSAgY2hhciBzeW1fbmFtZVsyMF07Ci0KLSAgaWYgKGN1cnJlbnRfcG9vbFAgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogQWxpZ24gcG9vbCBhcyB5b3UgaGF2ZSB3b3JkIGFjY2Vzc2VzICovCi0gIC8qIE9ubHkgbWFrZSBhIGZyYWcgaWYgd2UgaGF2ZSB0byAuLi4gKi8KLSAgaWYgKCFuZWVkX3Bhc3NfMikKLSAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAyKTsKLQotICBzcHJpbnRmIChzeW1fbmFtZSwgIiQkbGl0X1wwMDIleCIsIGxpdF9wb29sX251bSsrKTsKLQotICBzeW1ib2xfbG9jYXRlIChjdXJyZW50X3Bvb2xQLCBzeW1fbmFtZSwgbm93X3NlZywKLQkJICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwgZnJhZ19ub3cpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChjdXJyZW50X3Bvb2xQKTsKLQotICBBUk1fU0VUX1RIVU1CIChjdXJyZW50X3Bvb2xQLCB0aHVtYl9tb2RlKTsKLSAgCi0jaWYgZGVmaW5lZCBPQkpfQ09GRiB8fCBkZWZpbmVkIE9CSl9FTEYKLSAgQVJNX1NFVF9JTlRFUldPUksgKGN1cnJlbnRfcG9vbFAsIHN1cHBvcnRfaW50ZXJ3b3JrKTsKLSNlbmRpZgotICAKLSAgd2hpbGUgKGxpdF9jb3VudCA8IG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlKQotICAgIC8qIEZpcnN0IG91dHB1dCB0aGUgZXhwcmVzc2lvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHBvb2wgKi8KLSAgICBlbWl0X2V4cHIgKCYobGl0ZXJhbHNbbGl0X2NvdW50KytdLmV4cCksIDQpOyAvKiAud29yZCAqLwotCi0gIG5leHRfbGl0ZXJhbF9wb29sX3BsYWNlID0gMDsKLSAgY3VycmVudF9wb29sUCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FsaWduICh1bnVzZWQpCS8qIFNhbWUgYXMgc19hbGlnbl9wdHdvIGJ1dCBhbGlnbiAwID0+IGFsaWduIDIgKi8KLSAgICAgaW50IHVudXNlZDsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIGxvbmcgdGVtcF9maWxsOwotICBsb25nIG1heF9hbGlnbm1lbnQgPSAxNTsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKLSAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkLiIpLCB0ZW1wID0gbWF4X2FsaWdubWVudCk7Ci0gIGVsc2UgaWYgKHRlbXAgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IG5lZ2F0aXZlLiAwIGFzc3VtZWQuIikpOwotICAgICAgdGVtcCA9IDA7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHRlbXBfZmlsbCA9IDA7Ci0KLSAgaWYgKCF0ZW1wKQotICAgIHRlbXAgPSAyOwotCi0gIC8qIE9ubHkgbWFrZSBhIGZyYWcgaWYgd2UgSEFWRSB0by4gLiAuICovCi0gIGlmICh0ZW1wICYmICFuZWVkX3Bhc3NfMikKLSAgICBmcmFnX2FsaWduICh0ZW1wLCAoaW50KSB0ZW1wX2ZpbGwsIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIHRlbXApOwotfQotCi1zdGF0aWMgdm9pZAotc19mb3JjZV90aHVtYiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBJZiB3ZSBhcmUgbm90IGFscmVhZHkgaW4gdGh1bWIgbW9kZSBnbyBpbnRvIGl0LCBFVkVOIGlmCi0gICAgIHRoZSB0YXJnZXQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGh1bWIgaW5zdHJ1Y3Rpb25zLgotICAgICBUaGlzIGlzIHVzZWQgYnkgZ2NjL2NvbmZpZy9hcm0vbGliMWZ1bmNzLmFzbSBmb3IgZXhhbXBsZQotICAgICB0byBjb21waWxlIGludGVyd29ya2luZyBzdXBwb3J0IGZ1bmN0aW9ucyBldmVuIGlmIHRoZQotICAgICB0YXJnZXQgcHJvY2Vzc29yIHNob3VsZCBub3Qgc3VwcG9ydCBpbnRlcndvcmtpbmcuICAqLwotICAgICAKLSAgaWYgKCEgdGh1bWJfbW9kZSkKLSAgICB7Ci0gICAgICB0aHVtYl9tb2RlID0gMTsKLSAgICAgIAotICAgICAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci0gICAgfQotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfdGh1bWJfZnVuYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBUaGUgZm9sbG93aW5nIGxhYmVsIGlzIHRoZSBuYW1lL2FkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIGEgVGh1bWIgZnVuY3Rpb24uCi0gICAgIFdlIG5lZWQgdG8ga25vdyB0aGlzIGZvciB0aGUgaW50ZXJ3b3JraW5nIHN1cHBvcnQuICAqLwotCi0gIGxhYmVsX2lzX3RodW1iX2Z1bmN0aW9uX25hbWUgPSB0cnVlOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUGVyZm9ybSBhIC5zZXQgZGlyZWN0aXZlLCBidXQgYWxzbyBtYXJrIHRoZSBhbGlhcyBhcwotICAgYmVpbmcgYSB0aHVtYiBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3RodW1iX3NldCAoZXF1aXYpCi0gICAgIGludCBlcXVpdjsKLXsKLSAgLyogWFhYIHRoZSBmb2xsb3dpbmcgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGNvZGUgZm9yIHNfc2V0KCkgaW4gcmVhZC5jCi0gICAgIFdlIGNhbm5vdCBqdXN0IGNhbGwgdGhhdCBjb2RlIGFzIHdlIG5lZWQgdG8gZ2V0IGF0IHRoZSBzeW1ib2wgdGhhdAotICAgICBpcyBjcmVhdGVkLiAgKi8KLSAgcmVnaXN0ZXIgY2hhciAqICAgIG5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgICAgICBkZWxpbTsKLSAgcmVnaXN0ZXIgY2hhciAqICAgIGVuZF9uYW1lOwotICByZWdpc3RlciBzeW1ib2xTICogc3ltYm9sUDsKLQotICAvKgotICAgKiBFc3BlY2lhbCBhcG9sb2dpZXMgZm9yIHRoZSByYW5kb20gbG9naWM6Ci0gICAqIHRoaXMganVzdCBncmV3LCBhbmQgY291bGQgYmUgcGFyc2VkIG11Y2ggbW9yZSBzaW1wbHkhCi0gICAqIERlYW4gaW4gaGFzdGUuCi0gICAqLwotICBuYW1lICAgICAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbGltICAgICA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbmRfbmFtZSAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICplbmRfbmFtZSA9IGRlbGltOwotICAKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqZW5kX25hbWUgPSAwOwotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICplbmRfbmFtZSA9IGRlbGltOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICplbmRfbmFtZSA9IDA7Ci0KLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBYWFggLSB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHRvIC50aHVtYl9zZXQgICovCi0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSA9PSBOVUxMCi0gICAgICAmJiAoc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSNpZm5kZWYgTk9fTElTVElORwotICAgICAgLyogV2hlbiBkb2luZyBzeW1ib2wgbGlzdGluZ3MsIHBsYXkgZ2FtZXMgd2l0aCBkdW1teSBmcmFnbWVudHMgbGl2aW5nCi0JIG91dHNpZGUgdGhlIG5vcm1hbCBmcmFnbWVudCBjaGFpbiB0byByZWNvcmQgdGhlIGZpbGUgYW5kIGxpbmUgaW5mbwotICAgICAgICAgZm9yIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIGlmIChsaXN0aW5nICYgTElTVElOR19TWU1CT0xTKQotCXsKLQkgIGV4dGVybiBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqIGxpc3RpbmdfdGFpbDsKLQkgIGZyYWdTICogZHVtbXlfZnJhZyA9IChmcmFnUyAqKSB4bWFsbG9jIChzaXplb2YoZnJhZ1MpKTsKLQkgIG1lbXNldCAoZHVtbXlfZnJhZywgMCwgc2l6ZW9mKGZyYWdTKSk7Ci0JICBkdW1teV9mcmFnLT5mcl90eXBlID0gcnNfZmlsbDsKLQkgIGR1bW15X2ZyYWctPmxpbmUgPSBsaXN0aW5nX3RhaWw7Ci0JICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sIDAsIGR1bW15X2ZyYWcpOwotCSAgZHVtbXlfZnJhZy0+ZnJfc3ltYm9sID0gc3ltYm9sUDsKLQl9Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCQkJICAgIAotI2lmZGVmIE9CSl9DT0ZGCi0gICAgICAvKiAic2V0IiBzeW1ib2xzIGFyZSBsb2NhbCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gKi8KLSAgICAgIFNGX1NFVF9MT0NBTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLSAgICB9CQkJCS8qIG1ha2UgYSBuZXcgc3ltYm9sICovCi0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0KLSAgKiBlbmRfbmFtZSA9IGRlbGltOwotCi0gIGlmIChlcXVpdgotICAgICAgJiYgU19JU19ERUZJTkVEIChzeW1ib2xQKQotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgIT0gcmVnX3NlY3Rpb24pCi0gICAgYXNfYmFkIChfKCJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIHBzZXVkb19zZXQgKHN5bWJvbFApOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICAvKiBYWFggbm93IHdlIGNvbWUgdG8gdGhlIFRodW1iIHNwZWNpZmljIGJpdCBvZiBjb2RlLiAgKi8KLSAgCi0gIFRIVU1CX1NFVF9GVU5DIChzeW1ib2xQLCAxKTsKLSAgQVJNX1NFVF9USFVNQiAoc3ltYm9sUCwgMSk7Ci0gIEFSTV9TRVRfSU5URVJXT1JLIChzeW1ib2xQLCBzdXBwb3J0X2ludGVyd29yayk7Ci19Ci0KLS8qIElmIHdlIGNoYW5nZSBzZWN0aW9uIHdlIG11c3QgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGZpcnN0LiAgKi8KLXN0YXRpYyB2b2lkCi1hcm1fc190ZXh0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLSAgICBzX2x0b3JnICgwKTsKLSAgCi0gIHNfdGV4dCAoaWdub3JlKTsKLX0KLQotc3RhdGljIHZvaWQKLWFybV9zX2RhdGEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGlmIChub3dfc2VnICE9IHRleHRfc2VjdGlvbikKLQlzX2x0b3JnICgwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uKQotICAgIHNfbHRvcmcgKDApOwotICAKLSAgc19kYXRhIChpZ25vcmUpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQKLWFybV9zX3NlY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19sdG9yZyAoMCk7Ci0KLSAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1vcGNvZGVfc2VsZWN0ICh3aWR0aCkKLSAgICAgaW50IHdpZHRoOwotewotICBzd2l0Y2ggKHdpZHRoKQotICAgIHsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKCEgdGh1bWJfbW9kZSkKLQl7Ci0JICBpZiAoISAoY3B1X3ZhcmlhbnQgJiBBUk1fVEhVTUIpKQotCSAgICBhc19iYWQgKF8oInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IFRIVU1CIG9wY29kZXMiKSk7Ci0JICB0aHVtYl9tb2RlID0gMTsKLSAgICAgICAgICAvKiBObyBuZWVkIHRvIGZvcmNlIHRoZSBhbGlnbm1lbnQsIHNpbmNlIHdlIHdpbGwgaGF2ZSBiZWVuCi0gICAgICAgICAgICAgY29taW5nIGZyb20gQVJNIG1vZGUsIHdoaWNoIGlzIHdvcmQtYWxpZ25lZC4gKi8KLSAgICAgICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAodGh1bWJfbW9kZSkKLQl7Ci0gICAgICAgICAgaWYgKChjcHVfdmFyaWFudCAmIEFSTV9BTlkpID09IEFSTV9USFVNQikKLQkgICAgYXNfYmFkIChfKCJzZWxlY3RlZCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCBBUk0gb3Bjb2RlcyIpKTsKLQkgIHRodW1iX21vZGUgPSAwOwotICAgICAgICAgIGlmICghbmVlZF9wYXNzXzIpCi0gICAgICAgICAgICBmcmFnX2FsaWduICgyLCAwLCAwKTsKLSAgICAgICAgICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCAxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgaW5zdHJ1Y3Rpb24gc2l6ZSBzZWxlY3RlZCAoJWQpIiksIHdpZHRoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2FybSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBvcGNvZGVfc2VsZWN0ICgzMik7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3RodW1iIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG9wY29kZV9zZWxlY3QgKDE2KTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfY29kZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN3aXRjaCAodGVtcCkKLSAgICB7Ci0gICAgY2FzZSAxNjoKLSAgICBjYXNlIDMyOgotICAgICAgb3Bjb2RlX3NlbGVjdCAodGVtcCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZCB0byAuY29kZSBkaXJlY3RpdmUgKCVkKSAoZXhwZWN0aW5nIDE2IG9yIDMyKSIpLCB0ZW1wKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1lbmRfb2ZfbGluZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICBpbnN0LmVycm9yID0gXygiR2FyYmFnZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24iKTsKLX0KLQotc3RhdGljIGludAotc2tpcF9wYXN0X2NvbW1hIChzdHIpCi0gICAgIGNoYXIgKiogc3RyOwotewotICBjaGFyICpwID0gKnN0ciwgYzsKLSAgaW50IGNvbW1hID0gMDsKLSAgICAKLSAgd2hpbGUgKChjID0gKnApID09ICcgJyB8fCBjID09ICcsJykKLSAgICB7Ci0gICAgICBwKys7Ci0gICAgICBpZiAoYyA9PSAnLCcgJiYgY29tbWErKykKLQlyZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ1wwJykKLSAgICByZXR1cm4gRkFJTDsKLQotICAqc3RyID0gcDsKLSAgcmV0dXJuIGNvbW1hID8gU1VDQ0VTUyA6IEZBSUw7Ci19Ci0KLS8qIEEgc3RhbmRhcmQgcmVnaXN0ZXIgbXVzdCBiZSBnaXZlbiBhdCB0aGlzIHBvaW50LiAgU2hpZnQgaXMgdGhlIHBsYWNlIHRvCi0gICBwdXQgaXQgaW4gdGhlIGluc3RydWN0aW9uLiAqLwotCi1zdGF0aWMgaW50Ci1yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCBzaGlmdCkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgc2hpZnQ7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZmYgWzEyOF07IC8qIFhYWCAqLwotICBpbnQgICAgcmVnOwotICBjaGFyICogc3RhcnQgPSAqc3RyOwotCi0gIGlmICgocmVnID0gYXJtX3JlZ19wYXJzZSAoc3RyKSkgIT0gRkFJTCAmJiBpbnRfcmVnaXN0ZXIgKHJlZykpCi0gICAgewotICAgICAgaWYgKHNoaWZ0ID49IDApCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgc2hpZnQ7Ci0gICAgICByZXR1cm4gcmVnOwotICAgIH0KLQotICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludCwgd2UgbWF5IGhhdmUgZ290IGEgcmVnIG9mIHRoZSB3cm9uZyBjbGFzcy4gICovCi0gICpzdHIgPSBzdGFydDsKLSAgCi0gIC8qIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSAgICAgdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbiAqLwotICBzcHJpbnRmIChidWZmLCBfKCJSZWdpc3RlciBleHBlY3RlZCwgbm90ICclLjEwMHMnIiksIHN0YXJ0KTsKLSAgaW5zdC5lcnJvciA9IGJ1ZmY7Ci0KLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLXBzcl9yZXF1aXJlZF9oZXJlIChzdHIsIGNwc3IsIHNwc3IpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIGNwc3I7Ci0gICAgIGludCAgICAgc3BzcjsKLXsKLSAgaW50ICAgIHBzcjsKLSAgY2hhciAqIHN0YXJ0ID0gKnN0cjsKLSAgcHNyID0gYXJtX3Bzcl9wYXJzZSAoc3RyKTsKLSAgCi0gIGlmICAocHNyID09IGNwc3IgfHwgcHNyID09IHNwc3IpCi0gICAgewotICAgICAgaWYgKHBzciA9PSBzcHNyKQotCWluc3QuaW5zdHJ1Y3Rpb24gfD0gMSA8PCAyMjsKLSAgICAgIAotICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgfQotCi0gIC8qIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSAgICAgdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbiAqLwotICBpbnN0LmVycm9yID0gXygiPHBzcihmKT4gZXhwZWN0ZWQiKTsKLQotICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludC4gICovCi0gICpzdHIgPSBzdGFydDsKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWNvX3Byb2NfbnVtYmVyIChzdHIpCi0gICAgIGNoYXIgKipzdHI7Ci17Ci0gIGludCBwcm9jZXNzb3IsIHBjaGFyOwotCi0gIHdoaWxlICgqKnN0ciA9PSAnICcpCi0gICAgKCpzdHIpKys7Ci0KLSAgLyogVGhlIGRhdGEgc2hlZXQgc2VlbXMgdG8gaW1wbHkgdGhhdCBqdXN0IGEgbnVtYmVyIG9uIGl0cyBvd24gaXMgdmFsaWQKLSAgICAgaGVyZSwgYnV0IHRoZSBSSVNDIGlYIGFzc2VtYmxlciBzZWVtcyB0byBhY2NlcHQgYSBwcmVmaXggJ3AnLiAgV2Ugd2lsbAotICAgICBhY2NlcHQgZWl0aGVyLiAgKi8KLSAgaWYgKCoqc3RyID09ICdwJyB8fCAqKnN0ciA9PSAnUCcpCi0gICAgKCpzdHIpKys7Ci0KLSAgcGNoYXIgPSAqKCpzdHIpKys7Ci0gIGlmIChwY2hhciA+PSAnMCcgJiYgcGNoYXIgPD0gJzknKQotICAgIHsKLSAgICAgIHByb2Nlc3NvciA9IHBjaGFyIC0gJzAnOwotICAgICAgaWYgKCoqc3RyID49ICcwJyAmJiAqKnN0ciA8PSAnOScpCi0JewotCSAgcHJvY2Vzc29yID0gcHJvY2Vzc29yICogMTAgKyAqKCpzdHIpKysgLSAnMCc7Ci0JICBpZiAocHJvY2Vzc29yID4gMTUpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiSWxsZWdhbCBjby1wcm9jZXNzb3IgbnVtYmVyIik7Ci0JICAgICAgcmV0dXJuIEZBSUw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIkJhZCBvciBtaXNzaW5nIGNvLXByb2Nlc3NvciBudW1iZXIiKTsKLSAgICAgIHJldHVybiBGQUlMOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IHByb2Nlc3NvciA8PCA4OwotICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotY3Bfb3BjX2V4cHIgKHN0ciwgd2hlcmUsIGxlbmd0aCkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZXhwcmVzc2lvblMgZXhwcjsKLQotICB3aGlsZSAoKipzdHIgPT0gJyAnKQotICAgICgqc3RyKSsrOwotCi0gIG1lbXNldCAoJmV4cHIsICdcMCcsIHNpemVvZiAoZXhwcikpOwotCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsIHN0cikpCi0gICAgcmV0dXJuIEZBSUw7Ci0gIGlmIChleHByLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiYmFkIG9yIG1pc3NpbmcgZXhwcmVzc2lvbiIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGlmICgoZXhwci5YX2FkZF9udW1iZXIgJiAoKDEgPDwgbGVuZ3RoKSAtIDEpKSAhPSBleHByLlhfYWRkX251bWJlcikKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiaW1tZWRpYXRlIGNvLXByb2Nlc3NvciBleHByZXNzaW9uIHRvbyBsYXJnZSIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZXhwci5YX2FkZF9udW1iZXIgPDwgd2hlcmU7Ci0gIHJldHVybiBTVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1jcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCB3aGVyZSkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgd2hlcmU7Ci17Ci0gIGludCAgICByZWc7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0KLSAgaWYgKChyZWcgPSBhcm1fcmVnX3BhcnNlIChzdHIpKSAhPSBGQUlMICYmIGNwX3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIHJlZyAmPSAxNTsKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gcmVnIDw8IHdoZXJlOwotICAgICAgcmV0dXJuIHJlZzsKLSAgICB9Ci0KLSAgLyogSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotICAgICB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuICovCi0gIGluc3QuZXJyb3IgPSBfKCJDby1wcm9jZXNzb3IgcmVnaXN0ZXIgZXhwZWN0ZWQiKTsKLQotICAvKiBSZXN0b3JlIHRoZSBzdGFydCBwb2ludCAqLwotICAqc3RyID0gc3RhcnQ7Ci0gIHJldHVybiBGQUlMOwotfQotCi1zdGF0aWMgaW50Ci1mcF9yZWdfcmVxdWlyZWRfaGVyZSAoc3RyLCB3aGVyZSkKLSAgICAgY2hhciAqKiBzdHI7Ci0gICAgIGludCAgICAgd2hlcmU7Ci17Ci0gIGludCByZWc7Ci0gIGNoYXIgKiBzdGFydCA9ICpzdHI7Ci0KLSAgaWYgKChyZWcgPSBhcm1fcmVnX3BhcnNlIChzdHIpKSAhPSBGQUlMICYmIGZwX3JlZ2lzdGVyIChyZWcpKQotICAgIHsKLSAgICAgIHJlZyAmPSA3OwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSByZWcgPDwgd2hlcmU7Ci0gICAgICByZXR1cm4gcmVnOwotICAgIH0KLQotICAvKiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0gICAgIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4gKi8KLSAgaW5zdC5lcnJvciA9IF8oIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGV4cGVjdGVkIik7Ci0KLSAgLyogUmVzdG9yZSB0aGUgc3RhcnQgcG9pbnQgKi8KLSAgKnN0ciA9IHN0YXJ0OwotICByZXR1cm4gRkFJTDsKLX0KLQotc3RhdGljIGludAotY3BfYWRkcmVzc19vZmZzZXQgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGludCBvZmZzZXQ7Ci0KLSAgd2hpbGUgKCoqc3RyID09ICcgJykKLSAgICAoKnN0cikrKzsKLQotICBpZiAoISBpc19pbW1lZGlhdGVfcHJlZml4ICgqKnN0cikpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgKCpzdHIpKys7Ci0gIAotICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsIHN0cikpCi0gICAgcmV0dXJuIEZBSUw7Ci0gIAotICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLSAgICAgIAotICAgICAgaWYgKG9mZnNldCAmIDMpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImNvLXByb2Nlc3NvciBhZGRyZXNzIG11c3QgYmUgd29yZCBhbGlnbmVkIik7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0KLSAgICAgIGlmIChvZmZzZXQgPiAxMDIzIHx8IG9mZnNldCA8IC0xMDIzKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJvZmZzZXQgdG9vIGxhcmdlIik7Ci0JICByZXR1cm4gRkFJTDsKLQl9Ci0KLSAgICAgIGlmIChvZmZzZXQgPj0gMCkKLQlpbnN0Lmluc3RydWN0aW9uIHw9IElOREVYX1VQOwotICAgICAgZWxzZQotCW9mZnNldCA9IC1vZmZzZXQ7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gb2Zmc2V0ID4+IDI7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOwotCi0gIHJldHVybiBTVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1jcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGNoYXIgKiBwID0gKiBzdHI7Ci0gIGludCAgICBwcmVfaW5jID0gMDsKLSAgaW50ICAgIHdyaXRlX2JhY2sgPSAwOwotCi0gIGlmICgqcCA9PSAnWycpCi0gICAgewotICAgICAgaW50IHJlZzsKLQotICAgICAgcCsrOwotICAgICAgd2hpbGUgKCpwID09ICcgJykKLQlwKys7Ci0KLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgcCwgMTYpKSA9PSBGQUlMKQotCXJldHVybiBGQUlMOwotCi0gICAgICB3aGlsZSAoKnAgPT0gJyAnKQotCXArKzsKLQotICAgICAgaWYgKCpwID09ICddJykKLQl7Ci0JICBwKys7Ci0JICAKLQkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCYgcCkgPT0gU1VDQ0VTUykKLQkgICAgewotCSAgICAgIC8qIFtSbl0sICNleHByICovCi0JICAgICAgd3JpdGVfYmFjayA9IFdSSVRFX0JBQ0s7Ci0JICAgICAgCi0JICAgICAgaWYgKHJlZyA9PSBSRUdfUEMpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygicGMgbWF5IG5vdCBiZSB1c2VkIGluIHBvc3QtaW5jcmVtZW50Iik7Ci0JCSAgcmV0dXJuIEZBSUw7Ci0JCX0KLQotCSAgICAgIGlmIChjcF9hZGRyZXNzX29mZnNldCAoJiBwKSA9PSBGQUlMKQotCQlyZXR1cm4gRkFJTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBwcmVfaW5jID0gUFJFX0lOREVYIHwgSU5ERVhfVVA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qICdbJ1JuLCAjZXhwciddJ1shXSAqLwotCi0JICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmIHApID09IEZBSUwpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygicHJlLWluZGV4ZWQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0KLQkgIHByZV9pbmMgPSBQUkVfSU5ERVg7Ci0JICAKLQkgIGlmIChjcF9hZGRyZXNzX29mZnNldCAoJiBwKSA9PSBGQUlMKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgd2hpbGUgKCpwID09ICcgJykKLQkgICAgcCsrOwotCi0JICBpZiAoKnArKyAhPSAnXScpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygibWlzc2luZyBdIik7Ci0JICAgICAgcmV0dXJuIEZBSUw7Ci0JICAgIH0KLQotCSAgd2hpbGUgKCpwID09ICcgJykKLQkgICAgcCsrOwotCi0JICBpZiAoKnAgPT0gJyEnKQotCSAgICB7Ci0JICAgICAgaWYgKHJlZyA9PSBSRUdfUEMpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygicGMgbWF5IG5vdCBiZSB1c2VkIHdpdGggd3JpdGUtYmFjayIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBwKys7Ci0JICAgICAgd3JpdGVfYmFjayA9IFdSSVRFX0JBQ0s7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZwKSkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9DUF9PRkZfSU1NOwotICAgICAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDg7ICAvKiBQQyByZWwgYWRqdXN0ICovCi0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOwotICAgICAgcHJlX2luYyA9IFBSRV9JTkRFWDsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSB3cml0ZV9iYWNrIHwgcHJlX2luYzsKLSAgKnN0ciA9IHA7Ci0gIHJldHVybiBTVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbm9wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBEbyBub3RoaW5nIHJlYWxseSAqLwotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOyAvKiBUaGlzIGlzIHBvaW50bGVzcyAqLwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbXJzIChzdHIsIGZsYWdzKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIC8qIE9ubHkgb25lIHN5bnRheCAqLwotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IHBzcl9yZXF1aXJlZF9oZXJlICgmIHN0ciwgQ1BTUl9BTEwsIFNQU1JfQUxMKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCI8cHNyPiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBUaHJlZSBwb3NzaWJsZSBmb3JtczogIjxwc3I+LCBSbSIsICI8cHNyZj4sIFJtIiwgIjxwc3JmPiwgI2V4cHJlc3Npb24iICovCi1zdGF0aWMgdm9pZAotZG9fbXNyIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmVnOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIgKys7Ci0KLSAgaWYgKHBzcl9yZXF1aXJlZF9oZXJlICgmc3RyLCBDUFNSX0FMTCwgU1BTUl9BTEwpID09IFNVQ0NFU1MpCi0gICAgewotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfQUxMOwotCi0gICAgICAvKiBTeXRheCBzaG91bGQgYmUgIjxwc3I+LCBSbSIgKi8KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLQkgIHx8IChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocHNyX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCBDUFNSX0ZMRywgU1BTUl9GTEcpID09IFNVQ0NFU1MpCi0JaW5zdC5pbnN0cnVjdGlvbiB8PSBQU1JfRkxBR1M7Ci0gICAgICBlbHNlIGlmIChwc3JfcmVxdWlyZWRfaGVyZSAoJiBzdHIsIENQU1JfQ1RMLCBTUFNSX0NUTCkgPT0gU1VDQ0VTUykKLQlpbnN0Lmluc3RydWN0aW9uIHw9IFBTUl9DT05UUk9MOwotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIAotICAgICAgLyogU3ludGF4IGNvdWxkIGJlICI8cHNyZj4sIHJtIiwgIjxwc3JmPiwgI2V4cHJlc3Npb24iICovCi0gICAgICAKLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAwKSkgIT0gRkFJTCkKLQk7Ci0gICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbiAqLwotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKiBzdHIpKQotCXsKLQkgIHN0ciArKzsKLQkgIGluc3QuZXJyb3IgPSBOVUxMOwotCSAgCi0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCYgaW5zdC5yZWxvYy5leHAsICYgc3RyKSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGlmIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wpCi0JICAgIHsKLQkgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0lNTUVESUFURTsKLQkgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpOwotCSAgICAgIGlmICh2YWx1ZSA9PSBGQUlMKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLQkJICByZXR1cm47Ci0JCX0KLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gdmFsdWU7Ci0JICAgIH0KLQotCSAgZmxhZ3MgfD0gSU5TVF9JTU1FRElBVEU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJFcnJvcjogdW5yZWNvZ25pc2VkIHN5bnRheCBmb3Igc2Vjb25kIGFyZ3VtZW50IHRvIG1zciBpbnN0cnVjdGlvbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaW5zdC5lcnJvciA9IE5VTEw7IAotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBMb25nIE11bHRpcGx5IFBhcnNlcgotICAgVU1VTEwgUmRMbywgUmRIaSwgUm0sIFJzCi0gICBTTVVMTCBSZExvLCBSZEhpLCBSbSwgUnMKLSAgIFVNTEFMIFJkTG8sIFJkSGksIFJtLCBScwotICAgU01MQUwgUmRMbywgUmRIaSwgUm0sIFJzCi0qLyAgIAotc3RhdGljIHZvaWQKLWRvX211bGwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIGludCByZGxvLCByZGhpLCBybSwgcnM7Ci0KLSAgLyogb25seSBvbmUgZm9ybWF0ICJyZGxvLCByZGhpLCBybSwgcnMiICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKHJkbG8gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJkaGkgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogcmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50ICovCi0gIGlmIChyZGxvID09IHJkaGkgfHwgcmRsbyA9PSBybSB8fCByZGhpID09IHJtKQotICAgIGFzX3Rza3RzayAoXygicmRoaSwgcmRsbyBhbmQgcm0gbXVzdCBhbGwgYmUgZGlmZmVyZW50IikpOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChycyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCA4KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQyB8fCByZGhpID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgIAotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fbXVsIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaW50IHJkLCBybTsKLSAgCi0gIC8qIG9ubHkgb25lIGZvcm1hdCAicmQsIHJtLCBycyIgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgocmQgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJkID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfcGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChybSA9PSByZCkKLSAgICBhc190c2t0c2sgKF8oInJkIGFuZCBybSBzaG91bGQgYmUgZGlmZmVyZW50IGluIG11bCIpKTsKLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCAocm0gPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgOCkpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfcGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tbGEgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmQsIHJtOwotCi0gIC8qIG9ubHkgb25lIGZvcm1hdCAicmQsIHJtLCBycywgcm4iICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyZCA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9wYzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJtID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDApKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocm0gPT0gcmQpCi0gICAgYXNfdHNrdHNrIChfKCJyZCBhbmQgcm0gc2hvdWxkIGJlIGRpZmZlcmVudCBpbiBtbGEiKSk7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJkID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDgpKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChybSA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAocmQgPT0gUkVHX1BDIHx8IHJtID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBSZXR1cm5zIHRoZSBpbmRleCBpbnRvIGZwX3ZhbHVlcyBvZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgb3IgLTEgaWYKLSAgIG5vdCBpbiB0aGUgdGFibGUuICAqLwotc3RhdGljIGludAotbXlfZ2V0X2Zsb2F0X2V4cHJlc3Npb24gKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgY2hhciAqICAgICAgICAgc2F2ZV9pbjsKLSAgZXhwcmVzc2lvblMgICAgZXhwOwotICBpbnQgICAgICAgICAgICBpOwotICBpbnQgICAgICAgICAgICBqOwotCi0gIG1lbXNldCAod29yZHMsIDAsIE1BWF9MSVRUTEVOVU1TICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAvKiBMb29rIGZvciBhIHJhdyBmbG9hdGluZyBwb2ludCBudW1iZXIgKi8KLSAgaWYgKChzYXZlX2luID0gYXRvZl9pZWVlICgqc3RyLCAneCcsIHdvcmRzKSkgIT0gTlVMTAotICAgICAgJiYgKGlzX2VuZF9vZl9saW5lIFsoaW50KSgqc2F2ZV9pbildIHx8ICpzYXZlX2luID09ICdcMCcpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRkxPQVRfVkFMUzsgaSsrKQotCXsKLQkgIGZvciAoaiA9IDA7IGogPCBNQVhfTElUVExFTlVNUzsgaisrKQotCSAgICB7Ci0JICAgICAgaWYgKHdvcmRzW2pdICE9IGZwX3ZhbHVlc1tpXVtqXSkKLQkJYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGogPT0gTUFYX0xJVFRMRU5VTVMpCi0JICAgIHsKLQkgICAgICAqc3RyID0gc2F2ZV9pbjsKLQkgICAgICByZXR1cm4gaTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogVHJ5IGFuZCBwYXJzZSBhIG1vcmUgY29tcGxleCBleHByZXNzaW9uLCB0aGlzIHdpbGwgcHJvYmFibHkgZmFpbAotICAgICB1bmxlc3MgdGhlIGNvZGUgdXNlcyBhIGZsb2F0aW5nIHBvaW50IHByZWZpeCAoZWcgIjBmIikgKi8KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gKnN0cjsKLSAgaWYgKGV4cHJlc3Npb24gKCZleHApID09IGFic29sdXRlX3NlY3Rpb24KLSAgICAgICYmIGV4cC5YX29wID09IE9fYmlnCi0gICAgICAmJiBleHAuWF9hZGRfbnVtYmVyIDwgMCkKLSAgICB7Ci0gICAgICAvKiBGSVhNRTogNSA9IFhfUFJFQ0lTSU9OLCBzaG91bGQgYmUgI2RlZmluZSdkIHdoZXJlIHdlIGNhbiB1c2UgaXQuCi0JIERpdHRvIGZvciAxNS4gICovCi0gICAgICBpZiAoZ2VuX3RvX3dvcmRzICh3b3JkcywgNSwgKGxvbmcpMTUpID09IDApCi0JewotCSAgZm9yIChpID0gMDsgaSA8IE5VTV9GTE9BVF9WQUxTOyBpKyspCi0JICAgIHsKLQkgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX0xJVFRMRU5VTVM7IGorKykKLQkJewotCQkgIGlmICh3b3Jkc1tqXSAhPSBmcF92YWx1ZXNbaV1bal0pCi0JCSAgICBicmVhazsKLQkJfQotCi0JICAgICAgaWYgKGogPT0gTUFYX0xJVFRMRU5VTVMpCi0JCXsKLQkJICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0JCSAgcmV0dXJuIGk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgKnN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgcmV0dXJuIC0xOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiBhbnl0aGluZyBpbiB0aGUgZXhwcmVzc2lvbiBpcyBhIGJpZ251bSAqLwotc3RhdGljIGludAotd2Fsa19ub19iaWdudW1zIChzcCkKLSAgICAgc3ltYm9sUyAqIHNwOwotewotICBpZiAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzcCktPlhfb3AgPT0gT19iaWcpCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX2FkZF9zeW1ib2wpCi0gICAgewotICAgICAgcmV0dXJuICh3YWxrX25vX2JpZ251bXMgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX2FkZF9zeW1ib2wpCi0JICAgICAgfHwgKHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ApLT5YX29wX3N5bWJvbAotCQkgICYmIHdhbGtfbm9fYmlnbnVtcyAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzcCktPlhfb3Bfc3ltYm9sKSkpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotbXlfZ2V0X2V4cHJlc3Npb24gKGVwLCBzdHIpCi0gICAgIGV4cHJlc3Npb25TICogZXA7Ci0gICAgIGNoYXIgKiogc3RyOwotewotICBjaGFyICogc2F2ZV9pbjsKLSAgc2VnVCAgIHNlZzsKLSAgCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9ICpzdHI7Ci0gIHNlZyA9IGV4cHJlc3Npb24gKGVwKTsKLQotI2lmZGVmIE9CSl9BT1VUCi0gIGlmIChzZWcgIT0gYWJzb2x1dGVfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IHRleHRfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IGRhdGFfc2VjdGlvbgotICAgICAgJiYgc2VnICE9IGJzc19zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oImJhZF9zZWdtZW50Iik7Ci0gICAgICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIEdldCByaWQgb2YgYW55IGJpZ251bXMgbm93LCBzbyB0aGF0IHdlIGRvbid0IGdlbmVyYXRlIGFuIGVycm9yIGZvciB3aGljaAotICAgICB3ZSBjYW4ndCBlc3RhYmxpc2ggYSBsaW5lIG51bWJlciBsYXRlciBvbi4gIEJpZyBudW1iZXJzIGFyZSBuZXZlciB2YWxpZAotICAgICBpbiBpbnN0cnVjdGlvbnMsIHdoaWNoIGlzIHdoZXJlIHRoaXMgcm91dGluZSBpcyBhbHdheXMgY2FsbGVkLiAgKi8KLSAgaWYgKGVwLT5YX29wID09IE9fYmlnCi0gICAgICB8fCAoZXAtPlhfYWRkX3N5bWJvbAotCSAgJiYgKHdhbGtfbm9fYmlnbnVtcyAoZXAtPlhfYWRkX3N5bWJvbCkKLQkgICAgICB8fCAoZXAtPlhfb3Bfc3ltYm9sCi0JCSAgJiYgd2Fsa19ub19iaWdudW1zIChlcC0+WF9vcF9zeW1ib2wpKSkpKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJJbnZhbGlkIGNvbnN0YW50Iik7Ci0gICAgICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAqc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotLyogdW5yZXN0cmljdCBzaG91bGQgYmUgb25lIGlmIDxzaGlmdD4gPHJlZ2lzdGVyPiBpcyBwZXJtaXR0ZWQgZm9yIHRoaXMKLSAgIGluc3RydWN0aW9uICovCi0KLXN0YXRpYyBpbnQKLWRlY29kZV9zaGlmdCAoc3RyLCB1bnJlc3RyaWN0KQotICAgICBjaGFyICoqIHN0cjsKLSAgICAgaW50ICAgICB1bnJlc3RyaWN0OwotewotICBzdHJ1Y3QgYXNtX3NoaWZ0ICogc2hmdDsKLSAgY2hhciAqIHA7Ci0gIGNoYXIgICBjOwotICAgIAotICB3aGlsZSAoKipzdHIgPT0gJyAnKQotICAgICgqc3RyKSsrOwotICAgIAotICBmb3IgKHAgPSAqc3RyOyBpc2FscGhhICgqcCk7IHArKykKLSAgICA7Ci0KLSAgaWYgKHAgPT0gKnN0cikKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiU2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotICAgICAgcmV0dXJuIEZBSUw7Ci0gICAgfQotCi0gIGMgPSAqcDsKLSAgKnAgPSAnXDAnOwotICBzaGZ0ID0gKHN0cnVjdCBhc21fc2hpZnQgKikgaGFzaF9maW5kIChhcm1fc2hpZnRfaHNoLCAqc3RyKTsKLSAgKnAgPSBjOwotICBpZiAoc2hmdCkKLSAgICB7Ci0gICAgICBpZiAoIXN0cm5jbXAgKCpzdHIsICJycngiLCAzKQotICAgICAgICAgIHx8ICFzdHJuY21wICgqc3RyLCAiUlJYIiwgMykpCi0JewotCSAgKnN0ciA9IHA7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHNoZnQtPnZhbHVlOwotCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JfQotCi0gICAgICB3aGlsZSAoKnAgPT0gJyAnKQotCXArKzsKLQotICAgICAgaWYgKHVucmVzdHJpY3QgJiYgcmVnX3JlcXVpcmVkX2hlcmUgKCZwLCA4KSAhPSBGQUlMKQotCXsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hmdC0+dmFsdWUgfCBTSElGVF9CWV9SRUc7Ci0JICAqc3RyID0gcDsKLQkgIHJldHVybiBTVUNDRVNTOwotCX0KLSAgICAgIGVsc2UgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCogcCkpCi0JewotCSAgaW5zdC5lcnJvciA9IE5VTEw7Ci0JICBwKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnApKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgLyogVmFsaWRhdGUgc29tZSBzaW1wbGUgI2V4cHJlc3Npb25zICovCi0JICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbnVtID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICAgICAgLyogUmVqZWN0IG9wZXJhdGlvbnMgZ3JlYXRlciB0aGFuIDMyLCBvciBsc2wgIzMyICovCi0JICAgICAgaWYgKG51bSA+IDMyIHx8IChudW0gPT0gMzIgJiYgc2hmdC0+dmFsdWUgPT0gMCkpCi0JCXsKLQkJICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBpbW1lZGlhdGUgc2hpZnQiKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgLyogU2hpZnRzIG9mIHplcm8gc2hvdWxkIGJlIGNvbnZlcnRlZCB0byBsc2wgKHdoaWNoIGlzIHplcm8pKi8KLQkgICAgICBpZiAobnVtID09IDApCi0JCXsKLQkJICAqc3RyID0gcDsKLQkJICByZXR1cm4gU1VDQ0VTUzsKLQkJfQotCi0JICAgICAgLyogU2hpZnRzIG9mIDMyIGFyZSBlbmNvZGVkIGFzIDAsIGZvciB0aG9zZSBzaGlmdHMgdGhhdAotCQkgc3VwcG9ydCBpdC4gICovCi0JICAgICAgaWYgKG51bSA9PSAzMikKLQkJbnVtID0gMDsKLQotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKG51bSA8PCA3KSB8IHNoZnQtPnZhbHVlOwotCSAgICAgICpzdHIgPSBwOwotCSAgICAgIHJldHVybiBTVUNDRVNTOwotCSAgICB9Ci0KLQkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NOwotCSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBzaGZ0LT52YWx1ZTsKLQkgICpzdHIgPSBwOwotCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuZXJyb3IgPSB1bnJlc3RyaWN0ID8gXygic2hpZnQgcmVxdWlyZXMgcmVnaXN0ZXIgb3IgI2V4cHJlc3Npb24iKQotCSAgICA6IF8oInNoaWZ0IHJlcXVpcmVzICNleHByZXNzaW9uIik7Ci0JICAqc3RyID0gcDsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICB9Ci0KLSAgaW5zdC5lcnJvciA9IF8oIlNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLS8qIERvIHRob3NlIGRhdGFfb3BzIHdoaWNoIGNhbiB0YWtlIGEgbmVnYXRpdmUgaW1tZWRpYXRlIGNvbnN0YW50ICovCi0vKiBieSBhbHRlcmluZyB0aGUgaW5zdHVjdGlvbi4gQSBiaXQgb2YgYSBoYWNrIHJlYWxseSAqLwotLyogICAgICBNT1YgPC0+IE1WTgotICAgICAgICBBTkQgPC0+IEJJQwotICAgICAgICBBREMgPC0+IFNCQwotICAgICAgICBieSBpbnZlcnRpbmcgdGhlIHNlY29uZCBvcGVyYW5kLCBhbmQKLSAgICAgICAgQUREIDwtPiBTVUIKLSAgICAgICAgQ01QIDwtPiBDTU4KLSAgICAgICAgYnkgbmVnYXRpbmcgdGhlIHNlY29uZCBvcGVyYW5kLgotKi8KLXN0YXRpYyBpbnQKLW5lZ2F0ZV9kYXRhX29wIChpbnN0cnVjdGlvbiwgdmFsdWUpCi0gICAgIHVuc2lnbmVkIGxvbmcgKiBpbnN0cnVjdGlvbjsKLSAgICAgdW5zaWduZWQgbG9uZyAgIHZhbHVlOwotewotICBpbnQgb3AsIG5ld19pbnN0OwotICB1bnNpZ25lZCBsb25nIG5lZ2F0ZWQsIGludmVydGVkOwotCi0gIG5lZ2F0ZWQgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKC12YWx1ZSk7Ci0gIGludmVydGVkID0gdmFsaWRhdGVfaW1tZWRpYXRlICh+dmFsdWUpOwotCi0gIG9wID0gKCppbnN0cnVjdGlvbiA+PiBEQVRBX09QX1NISUZUKSAmIDB4ZjsKLSAgc3dpdGNoIChvcCkKLSAgICB7Ci0gICAgICAvKiBGaXJzdCBuZWdhdGVzICovCi0gICAgY2FzZSBPUENPREVfU1VCOiAgICAgICAgICAgICAvKiBBREQgPC0+IFNVQiAqLwotICAgICAgbmV3X2luc3QgPSBPUENPREVfQUREOwotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9BREQ6IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfU1VCOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBuZWdhdGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9DTVA6ICAgICAgICAgICAgIC8qIENNUCA8LT4gQ01OICovCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9DTU47Ci0gICAgICB2YWx1ZSA9IG5lZ2F0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0NNTjogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9DTVA7ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IG5lZ2F0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTm93IEludmVydGVkIG9wcyAqLwotICAgIGNhc2UgT1BDT0RFX01PVjogICAgICAgICAgICAgLyogTU9WIDwtPiBNVk4gKi8KLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX01WTjsgICAgICAgICAgICAgICAKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX01WTjogCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9NT1Y7Ci0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9BTkQ6ICAgICAgICAgICAgIC8qIEFORCA8LT4gQklDICovIAotICAgICAgbmV3X2luc3QgPSBPUENPREVfQklDOyAgICAgICAgICAgICAgIAotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUENPREVfQklDOiAKLSAgICAgIG5ld19pbnN0ID0gT1BDT0RFX0FORDsKLSAgICAgIHZhbHVlID0gaW52ZXJ0ZWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BDT0RFX0FEQzogICAgICAgICAgICAgIC8qIEFEQyA8LT4gU0JDICovCi0gICAgICBuZXdfaW5zdCA9IE9QQ09ERV9TQkM7ICAgICAgICAgICAgICAgCi0gICAgICB2YWx1ZSA9IGludmVydGVkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QQ09ERV9TQkM6IAotICAgICAgbmV3X2luc3QgPSBPUENPREVfQURDOwotICAgICAgdmFsdWUgPSBpbnZlcnRlZDsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBXZSBjYW5ub3QgZG8gYW55dGhpbmcgKi8KLSAgICBkZWZhdWx0OiAgCi0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci0KLSAgaWYgKHZhbHVlID09IEZBSUwpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgKmluc3RydWN0aW9uICY9IE9QQ09ERV9NQVNLOwotICAqaW5zdHJ1Y3Rpb24gfD0gbmV3X2luc3QgPDwgREFUQV9PUF9TSElGVDsKLSAgcmV0dXJuIHZhbHVlOyAKLX0KLQotc3RhdGljIGludAotZGF0YV9vcDIgKHN0cikKLSAgICAgY2hhciAqKiBzdHI7Ci17Ci0gIGludCB2YWx1ZTsKLSAgZXhwcmVzc2lvblMgZXhwcjsKLQotICB3aGlsZSAoKipzdHIgPT0gJyAnKQotICAgICgqc3RyKSsrOwotICAgIAotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgIT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hIChzdHIpID09IFNVQ0NFU1MpCi0JewotCSAgLyogU2hpZnQgb3BlcmF0aW9uIG9uIHJlZ2lzdGVyICovCi0JICByZXR1cm4gZGVjb2RlX3NoaWZ0IChzdHIsIE5PX1NISUZUX1JFU1RSSUNUKTsKLQl9Ci0gICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbW1lZGlhdGUgZXhwcmVzc2lvbiAqLwotICAgICAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCoqc3RyKSkKLQl7Ci0JICAoKnN0cikrKzsKLQkgIGluc3QuZXJyb3IgPSBOVUxMOwotCSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsIHN0cikpCi0JICAgIHJldHVybiBGQUlMOwotCi0JICBpZiAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQotCSAgICB7Ci0JICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU7Ci0JICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hIChzdHIpID09IFNVQ0NFU1MpCi0JCXsKLQkJICAvKiAjeCwgeSAtLSBpZSBleHBsaWNpdCByb3RhdGlvbiBieSBZICAqLwotCQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsIHN0cikpCi0JCSAgICByZXR1cm4gRkFJTDsKLQotCQkgIGlmIChleHByLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0gCi0JCSAgLyogUm90YXRlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyICovCi0JCSAgaWYgKCgodW5zaWduZWQpIGV4cHIuWF9hZGRfbnVtYmVyKSA+IDMwCi0JCSAgICAgIHx8IChleHByLlhfYWRkX251bWJlciAmIDEpICE9IDAKLQkJICAgICAgfHwgKCh1bnNpZ25lZCkgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyKSA+IDI1NSkKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgY29uc3RhbnQiKTsKLQkJICAgICAgcmV0dXJuIEZBSUw7Ci0JCSAgICB9Ci0JCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBJTlNUX0lNTUVESUFURTsKLQkJICBpbnN0Lmluc3RydWN0aW9uIHw9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQkJICBpbnN0Lmluc3RydWN0aW9uIHw9IGV4cHIuWF9hZGRfbnVtYmVyIDw8IDc7Ci0JCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JCX0KLQotCSAgICAgIC8qIEltcGxpY2l0IHJvdGF0aW9uLCBzZWxlY3QgYSBzdWl0YWJsZSBvbmUgICovCi0JICAgICAgdmFsdWUgPSB2YWxpZGF0ZV9pbW1lZGlhdGUgKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcik7Ci0KLQkgICAgICBpZiAodmFsdWUgPT0gRkFJTCkKLQkJewotCQkgIC8qIENhbid0IGJlIGRvbmUsIHBlcmhhcHMgdGhlIGNvZGUgcmVhZHMgc29tZXRoaW5nIGxpa2UKLQkJICAgICAiYWRkIFJkLCBSbiwgIy1uIiwgd2hlcmUgInN1YiBSZCwgUm4sICNuIiB3b3VsZCBiZSBvayAqLwotCQkgIGlmICgodmFsdWUgPSBuZWdhdGVfZGF0YV9vcCAoJmluc3QuaW5zdHJ1Y3Rpb24sCi0JCQkJCSAgICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIpKQotCQkgICAgICA9PSBGQUlMKQotCQkgICAgewotCQkgICAgICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBjb25zdGFudCIpOwotCQkgICAgICByZXR1cm4gRkFJTDsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSB2YWx1ZTsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IElOU1RfSU1NRURJQVRFOwotCSAgcmV0dXJuIFNVQ0NFU1M7Ci0JfQotCi0gICAgICAoKnN0cikrKzsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJSZWdpc3RlciBvciBzaGlmdCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLWZwX29wMiAoc3RyKQotICAgICBjaGFyICoqIHN0cjsKLXsKLSAgd2hpbGUgKCoqc3RyID09ICcgJykKLSAgICAoKnN0cikrKzsKLQotICBpZiAoZnBfcmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgIT0gRkFJTCkKLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uICovCi0gICAgICBpZiAoKigoKnN0cikrKykgPT0gJyMnKQotCXsKLQkgIGludCBpOwotCi0JICBpbnN0LmVycm9yID0gTlVMTDsKLQkgIHdoaWxlICgqKnN0ciA9PSAnICcpCi0JICAgICgqc3RyKSsrOwotCi0JICAvKiBGaXJzdCB0cnkgYW5kIG1hdGNoIGV4YWN0IHN0cmluZ3MsIHRoaXMgaXMgdG8gZ3VhcmFudGVlIHRoYXQKLQkgICAgIHNvbWUgZm9ybWF0cyB3aWxsIHdvcmsgZXZlbiBmb3IgY3Jvc3MgYXNzZW1ibHkgKi8KLQotCSAgZm9yIChpID0gMDsgZnBfY29uc3RbaV07IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJuY21wICgqc3RyLCBmcF9jb25zdFtpXSwgc3RybGVuIChmcF9jb25zdFtpXSkpID09IDApCi0JCXsKLQkJICBjaGFyICpzdGFydCA9ICpzdHI7Ci0KLQkJICAqc3RyICs9IHN0cmxlbiAoZnBfY29uc3RbaV0pOwotCQkgIGlmIChpc19lbmRfb2ZfbGluZVsoaW50KSoqc3RyXSB8fCAqKnN0ciA9PSAnXDAnKQotCQkgICAgewotCQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGkgKyA4OwotCQkgICAgICByZXR1cm4gU1VDQ0VTUzsKLQkJICAgIH0KLQkJICAqc3RyID0gc3RhcnQ7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBKdXN0IGJlY2F1c2Ugd2UgZGlkbid0IGdldCBhIG1hdGNoIGRvZXNuJ3QgbWVhbiB0aGF0IHRoZQotCSAgICAgY29uc3RhbnQgaXNuJ3QgdmFsaWQsIGp1c3QgdGhhdCBpdCBpcyBpbiBhIGZvcm1hdCB0aGF0IHdlCi0JICAgICBkb24ndCBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZS4gIFRyeSBwYXJzaW5nIGl0IHdpdGgKLQkgICAgIHRoZSBzdGFuZGFyZCBleHByZXNzaW9uIHJvdXRpbmVzLiAgKi8KLQkgIGlmICgoaSA9IG15X2dldF9mbG9hdF9leHByZXNzaW9uIChzdHIpKSA+PSAwKQotCSAgICB7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBpICsgODsKLQkgICAgICByZXR1cm4gU1VDQ0VTUzsKLQkgICAgfQotCi0JICBpbnN0LmVycm9yID0gXygiSW52YWxpZCBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgZXhwcmVzc2lvbiIpOwotCSAgcmV0dXJuIEZBSUw7Ci0JfQotICAgICAgaW5zdC5lcnJvciA9IF8oIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9yIGltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0gICAgICByZXR1cm4gRkFJTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19hcml0IChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19hZHIgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHIgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKLSAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm0gImFkZCByZCwgcGMsICNsYWJlbC0uLTgiICovCi0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgbXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qIEZyYWcgaGFja2luZyB3aWxsIHR1cm4gdGhpcyBpbnRvIGEgc3ViIGluc3RydWN0aW9uIGlmIHRoZSBvZmZzZXQgdHVybnMKLSAgICAgb3V0IHRvIGJlIG5lZ2F0aXZlLiAgKi8KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9JTU1FRElBVEU7Ci0gIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAvKiBQQyByZWxhdGl2ZSBhZGp1c3QgKi8KLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY21wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZGF0YV9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgaWYgKChmbGFncyAmIDB4MDAwMGYwMDApID09IDApCi0gICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDT05EU19CSVQ7Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX21vdiAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGRhdGFfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLWxkc3RfZXh0ZW5kIChzdHIsIGh3c2UpCi0gICAgIGNoYXIgKiogc3RyOwotICAgICBpbnQgICAgIGh3c2U7Ci17Ci0gIGludCBhZGQgPSBJTkRFWF9VUDsKLQotICBzd2l0Y2ggKCoqc3RyKQotICAgIHsKLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICckJzoKLSAgICAgICgqc3RyKSsrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCBzdHIpKQotCXJldHVybiBGQUlMOwotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIGludCB2YWx1ZSA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotICAgICAgICAgIGlmICgoaHdzZSAmJiAodmFsdWUgPCAtMjU1IHx8IHZhbHVlID4gMjU1KSkKLSAgICAgICAgICAgICAgIHx8ICh2YWx1ZSA8IC00MDk1IHx8IHZhbHVlID4gNDA5NSkpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygiYWRkcmVzcyBvZmZzZXQgdG9vIGxhcmdlIik7Ci0JICAgICAgcmV0dXJuIEZBSUw7Ci0JICAgIH0KLQotCSAgaWYgKHZhbHVlIDwgMCkKLQkgICAgewotCSAgICAgIHZhbHVlID0gLXZhbHVlOwotCSAgICAgIGFkZCA9IDA7Ci0JICAgIH0KLQotICAgICAgICAgIC8qIEhhbGZ3b3JkIGFuZCBzaWduZXh0ZW5zaW9uIGluc3RydWN0aW9ucyBoYXZlIHRoZQotICAgICAgICAgICAgIGltbWVkaWF0ZSB2YWx1ZSBzcGxpdCBhY3Jvc3MgYml0cyAxMS4uOCBhbmQgYml0cyAzLi4wICovCi0gICAgICAgICAgaWYgKGh3c2UpCi0gICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGFkZCB8IEhXT0ZGU0VUX0lNTSB8ICgodmFsdWUgPj4gNCkgPDwgOCkgfCAodmFsdWUgJiAweEYpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkIHwgdmFsdWU7Ci0JfQotICAgICAgZWxzZQotCXsKLSAgICAgICAgICBpZiAoaHdzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBIV09GRlNFVF9JTU07Ci0gICAgICAgICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NOwotCSAgaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCX0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgICBhZGQgPSAwOwkvKiBhbmQgZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSAnKyc6Ci0gICAgICAoKnN0cikrKzsJLyogYW5kIGZhbGwgdGhyb3VnaCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKHN0ciwgMCkgPT0gRkFJTCkKLQlyZXR1cm4gRkFJTDsKLQotICAgICAgaWYgKGh3c2UpCi0gICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gYWRkOwotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBhZGQgfCBPRkZTRVRfUkVHOwotICAgICAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKHN0cikgPT0gU1VDQ0VTUykKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfc2hpZnQgKHN0ciwgU0hJRlRfUkVTVFJJQ1QpOwotICAgICAgICB9Ci0KLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRvX2xkc3QgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgaGFsZndvcmQgPSAwOwotICBpbnQgcHJlX2luYyA9IDA7Ci0gIGludCBjb25mbGljdF9yZWc7Ci0gIGludCB2YWx1ZTsKLQotICAvKiBUaGlzIGlzIG5vdCBpZGVhbCwgYnV0IGl0IGlzIHRoZSBzaW1wbGVzdCB3YXkgb2YgZGVhbGluZyB3aXRoIHRoZQotICAgICBBUk03VCBoYWxmd29yZCBpbnN0cnVjdGlvbnMgKHNpbmNlIHRoZXkgdXNlIGEgZGlmZmVyZW50Ci0gICAgIGVuY29kaW5nLCBidXQgdGhlIHNhbWUgbW5lbW9uaWMpOiAqLwotICBoYWxmd29yZCA9IChmbGFncyAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIGlmIChoYWxmd29yZCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFjdHVhbGx5IGEgbG9hZC9zdG9yZSBvZiBhIGhhbGZ3b3JkLCBvciBhCi0gICAgICAgICBzaWduZWQtZXh0ZW5zaW9uIGxvYWQgKi8KLSAgICAgIGlmICgoY3B1X3ZhcmlhbnQgJiBBUk1fSEFMRldPUkQpID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0LmVycm9yCi0JICAgID0gXygiUHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgaGFsZndvcmRzIG9yIHNpZ25lZCBieXRlcyIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uID0gKGluc3QuaW5zdHJ1Y3Rpb24gJiBDT05EX01BU0spCi0gICAgICAgICAgICAgICAgICAgICAgICAgfCAoZmxhZ3MgJiB+Q09ORF9NQVNLKTsKLQotICAgICAgZmxhZ3MgPSAwOwotICAgIH0KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0gICAgCi0gIGlmICgoY29uZmxpY3RfcmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAxMikpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJiBzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIkFkZHJlc3MgZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzdHIgPT0gJ1snKQotICAgIHsKLSAgICAgIGludCByZWc7Ci0KLSAgICAgIHN0cisrOwotICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCXN0cisrOwotCi0gICAgICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICBjb25mbGljdF9yZWcgPSAoKChjb25mbGljdF9yZWcgPT0gcmVnKQotCQkgICAgICAgJiYgKGluc3QuaW5zdHJ1Y3Rpb24gJiBMT0FEX0JJVCkpCi0JCSAgICAgID8gMSA6IDApOwotCi0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmICgqc3RyID09ICddJykKLQl7Ci0JICBzdHIrKzsKLQkgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IFNVQ0NFU1MpCi0JICAgIHsKLQkgICAgICAvKiBbUm5dLC4uLiAocG9zdCBpbmMpICovCi0JICAgICAgaWYgKGxkc3RfZXh0ZW5kICgmc3RyLCBoYWxmd29yZCkgPT0gRkFJTCkKLQkJcmV0dXJuOwotCSAgICAgIGlmIChjb25mbGljdF9yZWcpCi0JCWFzX3dhcm4gKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFtSbl0gKi8KLSAgICAgICAgICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICAgICAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSFdPRkZTRVRfSU1NOwotCi0gICAgICAgICAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLSAgICAgICAgICAgICAgIHN0cisrOwotCi0gICAgICAgICAgICAgIGlmICgqc3RyID09ICchJykKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgaWYgKGNvbmZsaWN0X3JlZykKLSAgICAgICAgICAgICAgICAgIGFzX3dhcm4gKF8oImRlc3RpbmF0aW9uIHJlZ2lzdGVyIHNhbWUgYXMgd3JpdGUtYmFjayBiYXNlXG4iKSk7Ci0gICAgICAgICAgICAgICAgIHN0cisrOwotICAgICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFdSSVRFX0JBQ0s7Ci0gICAgICAgICAgICAgICB9Ci0KLQkgICAgICBmbGFncyB8PSBJTkRFWF9VUDsKLQkgICAgICBpZiAoISAoZmxhZ3MgJiBUUkFOU19CSVQpKQotCQlwcmVfaW5jID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBbUm4sLi4uXSAqLwotCSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJwcmUtaW5kZXhlZCBleHByZXNzaW9uIGV4cGVjdGVkIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIHByZV9pbmMgPSAxOwotCSAgaWYgKGxkc3RfZXh0ZW5kICgmc3RyLCBoYWxmd29yZCkgPT0gRkFJTCkKLQkgICAgcmV0dXJuOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcpCi0JICAgIHN0cisrOwotCi0JICBpZiAoKnN0cisrICE9ICddJykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJtaXNzaW5nIF0iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCSAgICBzdHIrKzsKLQotCSAgaWYgKCpzdHIgPT0gJyEnKQotCSAgICB7Ci0JICAgICAgaWYgKGNvbmZsaWN0X3JlZykKLQkJYXNfdHNrdHNrIChfKCJkZXN0aW5hdGlvbiByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZVxuIikpOwotCSAgICAgIHN0cisrOwotCSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gV1JJVEVfQkFDSzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCpzdHIgPT0gJz0nKQotICAgIHsKLSAgICAgIC8qIFBhcnNlIGFuICJsZHIgUmQsID1leHByIiBpbnN0cnVjdGlvbjsgdGhpcyBpcyBhbm90aGVyIHBzZXVkbyBvcCAqLwotICAgICAgc3RyKys7Ci0KLSAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLQlzdHIrKzsKLQotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCSAgJiYgaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX3N5bWJvbCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgKHZhbHVlID0gdmFsaWRhdGVfaW1tZWRpYXRlKGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcikpICE9IEZBSUwpCi0JewotCSAgLyogVGhpcyBjYW4gYmUgZG9uZSB3aXRoIGEgbW92IGluc3RydWN0aW9uICovCi0JICBpbnN0Lmluc3RydWN0aW9uICY9IExJVEVSQUxfTUFTSzsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gSU5TVF9JTU1FRElBVEUgfCAoT1BDT0RFX01PViA8PCBEQVRBX09QX1NISUZUKTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKGZsYWdzICYgQ09ORF9NQVNLKSB8ICh2YWx1ZSAmIDB4ZmZmKTsKLQkgIGVuZF9vZl9saW5lKHN0cik7Ci0JICByZXR1cm47IAotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJbnNlcnQgaW50byBsaXRlcmFsIHBvb2wgKi8gICAgIAotCSAgaWYgKGFkZF90b19saXRfcG9vbCAoKSA9PSBGQUlMKQotCSAgICB7Ci0JICAgICAgaWYgKCFpbnN0LmVycm9yKQotCQlpbnN0LmVycm9yID0gXygibGl0ZXJhbCBwb29sIGluc2VydGlvbiBmYWlsZWQiKTsgCi0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIC8qIENoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24gZXhwIHRvIHBvaW50IHRvIHRoZSBwb29sICovCi0gICAgICAgICAgaWYgKGhhbGZ3b3JkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLSAgICAgICAgICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotCSAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw7Ci0JICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChSRUdfUEMgPDwgMTYpOwotCSAgcHJlX2luYyA9IDE7IAotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoaGFsZndvcmQpCi0gICAgICAgIHsKLSAgICAgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IEhXT0ZGU0VUX0lNTTsKLSAgICAgICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU04OwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTTsKLSAgICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlciAtPSA4OyAgLyogUEMgcmVsIGFkanVzdCAqLwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUkVHX1BDIDw8IDE2KTsKLSAgICAgIHByZV9pbmMgPSAxOwotICAgIH0KLSAgICAKLSAgaWYgKHByZV9pbmMgJiYgKGZsYWdzICYgVFJBTlNfQklUKSkKLSAgICBpbnN0LmVycm9yID0gXygiUHJlLWluY3JlbWVudCBpbnN0cnVjdGlvbiB3aXRoIHRyYW5zbGF0ZSIpOwotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCAocHJlX2luYyA/IFBSRV9JTkRFWCA6IDApOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgbG9uZwotcmVnX2xpc3QgKHN0cnApCi0gICAgIGNoYXIgKiogc3RycDsKLXsKLSAgY2hhciAqIHN0ciA9ICpzdHJwOwotICBsb25nICAgcmFuZ2UgPSAwOwotICBpbnQgICAgYW5vdGhlcl9yYW5nZTsKLQotICAvKiBXZSBjb21lIGJhY2sgaGVyZSBpZiB3ZSBnZXQgcmFuZ2VzIGNvbmNhdGVuYXRlZCBieSAnKycgb3IgJ3wnICovCi0gIGRvCi0gICAgewotICAgICAgYW5vdGhlcl9yYW5nZSA9IDA7Ci0KLSAgICAgIGlmICgqc3RyID09ICd7JykKLQl7Ci0JICBpbnQgaW5fcmFuZ2UgPSAwOwotCSAgaW50IGN1cl9yZWcgPSAtMTsKLSAgICAgIAotCSAgc3RyKys7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgaW50IHJlZzsKLQkgICAgCi0JICAgICAgd2hpbGUgKCpzdHIgPT0gJyAnKQotCQlzdHIrKzsKLQotCSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCYgc3RyLCAtMSkpID09IEZBSUwpCi0JCXJldHVybiBGQUlMOwotCSAgICAgIAotCSAgICAgIGlmIChpbl9yYW5nZSkKLQkJewotCQkgIGludCBpOwotCSAgICAgIAotCQkgIGlmIChyZWcgPD0gY3VyX3JlZykKLQkJICAgIHsKLQkJICAgICAgaW5zdC5lcnJvciA9IF8oIkJhZCByYW5nZSBpbiByZWdpc3RlciBsaXN0Iik7Ci0JCSAgICAgIHJldHVybiBGQUlMOwotCQkgICAgfQotCi0JCSAgZm9yIChpID0gY3VyX3JlZyArIDE7IGkgPCByZWc7IGkrKykKLQkJICAgIHsKLQkJICAgICAgaWYgKHJhbmdlICYgKDEgPDwgaSkpCi0JCQlhc190c2t0c2sgCi0JCQkgIChfKCJXYXJuaW5nOiBEdXBsaWNhdGVkIHJlZ2lzdGVyIChyJWQpIGluIHJlZ2lzdGVyIGxpc3QiKSwKLQkJCSAgIGkpOwotCQkgICAgICBlbHNlCi0JCQlyYW5nZSB8PSAxIDw8IGk7Ci0JCSAgICB9Ci0JCSAgaW5fcmFuZ2UgPSAwOwotCQl9Ci0KLQkgICAgICBpZiAocmFuZ2UgJiAoMSA8PCByZWcpKQotCQlhc190c2t0c2sgKF8oIldhcm5pbmc6IER1cGxpY2F0ZWQgcmVnaXN0ZXIgKHIlZCkgaW4gcmVnaXN0ZXIgbGlzdCIpLAotCQkJICAgcmVnKTsKLQkgICAgICBlbHNlIGlmIChyZWcgPD0gY3VyX3JlZykKLQkJYXNfdHNrdHNrIChfKCJXYXJuaW5nOiBSZWdpc3RlciByYW5nZSBub3QgaW4gYXNjZW5kaW5nIG9yZGVyIikpOwotCi0JICAgICAgcmFuZ2UgfD0gMSA8PCByZWc7Ci0JICAgICAgY3VyX3JlZyA9IHJlZzsKLQkgICAgfSB3aGlsZSAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMCi0JCSAgICAgfHwgKGluX3JhbmdlID0gMSwgKnN0cisrID09ICctJykpOwotCSAgc3RyLS07Ci0JICB3aGlsZSAoKnN0ciA9PSAnICcpCi0JICAgIHN0cisrOwotCi0JICBpZiAoKnN0cisrICE9ICd9JykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJNaXNzaW5nIGB9JyIpOwotCSAgICAgIHJldHVybiBGQUlMOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cHJlc3Npb25TIGV4cHI7Ci0KLQkgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmV4cHIsICZzdHIpKQotCSAgICByZXR1cm4gRkFJTDsKLQotCSAgaWYgKGV4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaWYgKGV4cHIuWF9hZGRfbnVtYmVyIAotCQkgICE9IChleHByLlhfYWRkX251bWJlciAmIDB4MDAwMGZmZmYpKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbWFzayIpOwotCQkgIHJldHVybiBGQUlMOwotCQl9Ci0KLQkgICAgICBpZiAoKHJhbmdlICYgZXhwci5YX2FkZF9udW1iZXIpICE9IDApCi0JCXsKLQkJICBpbnQgcmVnbm8gPSByYW5nZSAmIGV4cHIuWF9hZGRfbnVtYmVyOwotCi0JCSAgcmVnbm8gJj0gLXJlZ25vOwotCQkgIHJlZ25vID0gKDEgPDwgcmVnbm8pIC0gMTsKLQkJICBhc190c2t0c2sgCi0JCSAgICAoXygiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IiksCi0JCSAgICAgcmVnbm8pOwotCQl9Ci0KLQkgICAgICByYW5nZSB8PSBleHByLlhfYWRkX251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGluc3QucmVsb2MudHlwZSAhPSAwKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKLQkJICByZXR1cm4gRkFJTDsKLQkJfQotCi0JICAgICAgbWVtY3B5ICgmaW5zdC5yZWxvYy5leHAsICZleHByLCBzaXplb2YgKGV4cHJlc3Npb25TKSk7Ci0JICAgICAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9NVUxUSTsKLQkgICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLQlzdHIrKzsKLQotICAgICAgaWYgKCpzdHIgPT0gJ3wnIHx8ICpzdHIgPT0gJysnKQotCXsKLQkgIHN0cisrOwotCSAgYW5vdGhlcl9yYW5nZSA9IDE7Ci0JfQotICAgIH0gd2hpbGUgKGFub3RoZXJfcmFuZ2UpOwotCi0gICpzdHJwID0gc3RyOwotICByZXR1cm4gcmFuZ2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19sZG1zdG0gKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgYmFzZV9yZWc7Ci0gIGxvbmcgcmFuZ2U7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgoYmFzZV9yZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAoYmFzZV9yZWcgPT0gUkVHX1BDKQotICAgIHsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJyMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0gIGlmICgqc3RyID09ICchJykKLSAgICB7Ci0gICAgICBmbGFncyB8PSBXUklURV9CQUNLOwotICAgICAgc3RyKys7Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzdHIgPT0gJ14nKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgICAgZmxhZ3MgfD0gTVVMVElfU0VUX1BTUjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFncyB8IHJhbmdlOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fc3dpIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotICAKLSAgLyogQWxsb3cgb3B0aW9uYWwgbGVhZGluZyAnIycuICAqLwotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgc3RyKys7Ci0KLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmIGluc3QucmVsb2MuZXhwLCAmIHN0cikpCi0gICAgcmV0dXJuOwotCi0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fU1dJOwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDA7Ci0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIAotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgCi0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3N3YXAgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmVnOwotICAKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oInIxNSBub3QgYWxsb3dlZCBpbiBzd2FwIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8ICpzdHIrKyAhPSAnWycpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZWcgPSByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICBpZiAocmVnID09IFJFR19QQykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gYmFkX3BjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKCpzdHIrKyAhPSAnXScpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm1pc3NpbmcgXSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYnJhbmNoIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgCi0jaWZkZWYgT0JKX0VMRgotICB7Ci0gICAgY2hhciAqIHNhdmVfaW47Ci0gIAotICAgIC8qIFNjb3R0QjogRmVicnVhcnkgNSwgMTk5OCAqLwotICAgIC8qIENoZWNrIHRvIHNlZSBvZiBQTFQzMiByZWxvYyByZXF1aXJlZCBmb3IgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgICAKLSAgICAvKiBhcm1fcGFyc2VfcmVsb2MoKSB3b3JrcyBvbiBpbnB1dF9saW5lX3BvaW50ZXIuCi0gICAgICAgV2UgYWN0dWFsbHkgd2FudCB0byBwYXJzZSB0aGUgb3BlcmFuZHMgdG8gdGhlIGJyYW5jaCBpbnN0cnVjdGlvbgotICAgICAgIHBhc3NlZCBpbiAnc3RyJy4gIFNhdmUgdGhlIGlucHV0IHBvaW50ZXIgYW5kIHJlc3RvcmUgaXQgbGF0ZXIuICAqLwotICAgIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fc3ltYm9sCi0JJiYgKnN0ciA9PSAnKCcKLQkmJiBhcm1fcGFyc2VfcmVsb2MgKCkgPT0gQkZEX1JFTE9DX0FSTV9QTFQzMikKLSAgICAgIHsKLQlpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fUExUMzI7Ci0JaW5zdC5yZWxvYy5wY19yZWwgPSAwOwotCS8qIE1vZGlmeSBzdHIgdG8gcG9pbnQgdG8gYWZ0ZXIgcGFyc2VkIG9wZXJhbmRzLCBvdGhlcndpc2UKLQkgICBlbmRfb2ZfbGluZSgpIHdpbGwgY29tcGxhaW4gYWJvdXQgdGhlIChQTFQpIGxlZnQgaW4gc3RyLiAgKi8KLQlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g7Ci0JaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgfQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIH0KLSNlbHNlCi0gIGluc3QucmVsb2MudHlwZSAgID0gQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSNlbmRpZiAvKiBPQkpfRUxGICovCi0gIAotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fYnggKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgcmVnOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHJlZyA9PSBSRUdfUEMpCi0gICAgYXNfdHNrdHNrIChfKCJVc2Ugb2YgcjE1IGluIGJ4IGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyIikpOwotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19jZHAgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBDby1wcm9jZXNzb3IgZGF0YSBvcGVyYXRpb24uCi0gICAgIEZvcm1hdDogQ0RQe2NvbmR9IENQIyw8ZXhwcj4sQ1JkLENSbixDUm17LDxleHByPn0gICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoY29fcHJvY19udW1iZXIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3Bfb3BjX2V4cHIgKCZzdHIsIDIwLDQpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMCkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBTVUNDRVNTKQotICAgIHsKLSAgICAgIGlmIChjcF9vcGNfZXhwciAoJnN0ciwgNSwgMykgPT0gRkFJTCkKLQl7Ci0JICBpZiAoIWluc3QuZXJyb3IpCi0JICAgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19sc3RjIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIGxvYWQvc3RvcmUuCi0gICAgIEZvcm1hdDogPExEQ3xTVEN7Y29uZH1bTF0gQ1AjLENSZCw8YWRkcmVzcz4gICovCi0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChjb19wcm9jX251bWJlciAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfYWRkcmVzc19yZXF1aXJlZF9oZXJlICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY29fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgLyogQ28tcHJvY2Vzc29yIHJlZ2lzdGVyIHRyYW5zZmVyLgotICAgICBGb3JtYXQ6IDxNQ1J8TVJDPntjb25kfSBDUCMsPGV4cHIxPixSZCxDUm4sQ1Jteyw8ZXhwcjI+fSAgKi8KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKGNvX3Byb2NfbnVtYmVyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX29wY19leHByICgmc3RyLCAyMSwgMykgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCByZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgY3BfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGNwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IFNVQ0NFU1MpCi0gICAgewotICAgICAgaWYgKGNwX29wY19leHByICgmc3RyLCA1LCAzKSA9PSBGQUlMKQotCXsKLQkgIGlmICghaW5zdC5lcnJvcikKLQkgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2N0cmwgKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICAvKiBGUCBjb250cm9sIHJlZ2lzdGVycy4KLSAgICAgRm9ybWF0OiA8V0ZTfFJGU3xXRkN8UkZDPntjb25kfSBSbiAgKi8KLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKHJlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfbGRzdCAoc3RyLCBmbGFncykKLSAgICAgY2hhciAqICAgICAgICBzdHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBzd2l0Y2ggKGluc3Quc3VmZml4KQotICAgIHsKLSAgICBjYXNlIFNVRkZfUzoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1VGRl9EOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX1A6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWCB8IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCFpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9sZG1zdG0gKHN0ciwgZmxhZ3MpCi0gICAgIGNoYXIgKiAgICAgICAgc3RyOwotICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotewotICBpbnQgbnVtX3JlZ3M7Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEdldCBOdW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHRyYW5zZmVyICovCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiQ29uc3RhbnQgdmFsdWUgcmVxdWlyZWQgZm9yIG51bWJlciBvZiByZWdpc3RlcnMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbnVtX3JlZ3MgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLSAgaWYgKG51bV9yZWdzIDwgMSB8fCBudW1fcmVncyA+IDQpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm51bWJlciBvZiByZWdpc3RlcnMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzE6NF0iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3dpdGNoIChudW1fcmVncykKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDUF9UX1g7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IENQX1RfWTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gQ1BfVF9ZIHwgQ1BfVF9YOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoZmxhZ3MpCi0gICAgewotICAgICAgaW50IHJlZzsKLSAgICAgIGludCB3cml0ZV9iYWNrOwotICAgICAgaW50IG9mZnNldDsKLQotICAgICAgLyogVGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCAiZWEiIG9yICJmZCIsIHNvIHdlIGNhbiBvbmx5IGFjY2VwdAotCSBbUm5deyF9LiAgVGhlIGluc3RydWN0aW9uIGRvZXMgbm90IHJlYWxseSBzdXBwb3J0IHN0YWNraW5nIG9yCi0JIHVuc3RhY2tpbmcsIHNvIHdlIGhhdmUgdG8gZW11bGF0ZSB0aGVzZSBieSBzZXR0aW5nIGFwcHJvcHJpYXRlCi0JIGJpdHMgYW5kIG9mZnNldHMuICAqLwotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotCSAgfHwgKnN0ciAhPSAnWycpCi0JewotCSAgaWYgKCEgaW5zdC5lcnJvcikKLQkgICAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgc3RyKys7Ci0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmICgocmVnID0gcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIHdoaWxlICgqc3RyID09ICcgJykKLQlzdHIrKzsKLQotICAgICAgaWYgKCpzdHIgIT0gJ10nKQotCXsKLQkgIGluc3QuZXJyb3IgPSBiYWRfYXJnczsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIHN0cisrOwotICAgICAgaWYgKCpzdHIgPT0gJyEnKQotCXsKLQkgIHdyaXRlX2JhY2sgPSAxOwotCSAgc3RyKys7Ci0JICBpZiAocmVnID09IFJFR19QQykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJSMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciB3aXRoIHdyaXRlLWJhY2siKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0Jd3JpdGVfYmFjayA9IDA7Ci0KLSAgICAgIGlmIChmbGFncyAmIENQX1RfUHJlKQotCXsKLQkgIC8qIFByZS1kZWNyZW1lbnQgKi8KLQkgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKLQkgIGlmICh3cml0ZV9iYWNrKQotCSAgICBmbGFncyB8PSBDUF9UX1dCOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBQb3N0LWluY3JlbWVudCAqLwotCSAgaWYgKHdyaXRlX2JhY2spCi0JICAgIHsKLQkgICAgICBmbGFncyB8PSBDUF9UX1dCOwotCSAgICAgIG9mZnNldCA9IDMgKiBudW1fcmVnczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm8gd3JpdGUtYmFjaywgc28gY29udmVydCB0aGlzIGludG8gYSBzdGFuZGFyZCBwcmUtaW5jcmVtZW50Ci0JCSBpbnN0cnVjdGlvbiAtLSBhZXN0aGV0aWNhbGx5IG1vcmUgcGxlYXNpbmcuICAqLwotCSAgICAgIGZsYWdzID0gQ1BfVF9QcmUgfCBDUF9UX1VEOwotCSAgICAgIG9mZnNldCA9IDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3MgfCBvZmZzZXQ7Ci0gICAgfQotICBlbHNlIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLQkgICB8fCBjcF9hZGRyZXNzX3JlcXVpcmVkX2hlcmUgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfZHlhZGljIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDE2KSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBmcF9vcDIgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gZmxhZ3M7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19mcF9tb25hZGljIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxMikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgZnBfb3AyICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfY21wIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChmcF9yZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTYpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX29wMiAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBmbGFnczsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0gIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2ZwX2Zyb21fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIHN3aXRjaCAoaW5zdC5zdWZmaXgpCi0gICAgewotICAgIGNhc2UgU1VGRl9TOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVUZGX0Q6Ci0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IDB4MDAwMDAwODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNVRkZfRToKLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gMHgwMDA4MDAwMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAxNikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgcmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDEyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotZG9fZnBfdG9fcmVnIChzdHIsIGZsYWdzKQotICAgICBjaGFyICogICAgICAgIHN0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChyZWdfcmVxdWlyZWRfaGVyZSAoJnN0ciwgMTIpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IGZwX3JlZ19yZXF1aXJlZF9oZXJlICgmc3RyLCAwKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0Lmluc3RydWN0aW9uIHw9IGZsYWdzOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLSAgcmV0dXJuOwotfQotCi0vKiBUaHVtYiBzcGVjaWZpYyByb3V0aW5lcyAqLwotCi0vKiBQYXJzZSBhbmQgdmFsaWRhdGUgdGhhdCBhIHJlZ2lzdGVyIGlzIG9mIHRoZSByaWdodCBmb3JtLCB0aGlzIHNhdmVzCi0gICByZXBlYXRlZCBjaGVja2luZyBvZiB0aGlzIGluZm9ybWF0aW9uIGluIG1hbnkgc2ltaWxhciBjYXNlcy4gCi0gICBVbmxpa2UgdGhlIDMyLWJpdCBjYXNlIHdlIGRvIG5vdCBpbnNlcnQgdGhlIHJlZ2lzdGVyIGludG8gdGhlIG9wY29kZSAKLSAgIGhlcmUsIHNpbmNlIHRoZSBwb3NpdGlvbiBpcyBvZnRlbiB1bmtub3duIHVudGlsIHRoZSBmdWxsIGluc3RydWN0aW9uIAotICAgaGFzIGJlZW4gcGFyc2VkLiAgKi8KLXN0YXRpYyBpbnQKLXRodW1iX3JlZyAoc3RycCwgaGlfbG8pCi0gICAgIGNoYXIgKiogc3RycDsKLSAgICAgaW50ICAgICBoaV9sbzsKLXsKLSAgaW50IHJlZzsKLQotICBpZiAoKHJlZyA9IHJlZ19yZXF1aXJlZF9oZXJlIChzdHJwLCAtMSkpID09IEZBSUwpCi0gICAgcmV0dXJuIEZBSUw7Ci0KLSAgc3dpdGNoIChoaV9sbykKLSAgICB7Ci0gICAgY2FzZSBUSFVNQl9SRUdfTE86Ci0gICAgICBpZiAocmVnID4gNykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygibG8gcmVnaXN0ZXIgcmVxdWlyZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUSFVNQl9SRUdfSEk6Ci0gICAgICBpZiAocmVnIDwgOCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiaGkgcmVnaXN0ZXIgcmVxdWlyZWQiKTsKLQkgIHJldHVybiBGQUlMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVnOwotfQotCi0vKiBQYXJzZSBhbiBhZGQgb3Igc3VidHJhY3QgaW5zdHJ1Y3Rpb24sIFNVQlRSQUNUIGlzIG5vbi16ZXJvIGlmIHRoZSBvcGNvZGUKLSAgIHdhcyBTVUIuICAqLwotc3RhdGljIHZvaWQKLXRodW1iX2FkZF9zdWIgKHN0ciwgc3VidHJhY3QpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBzdWJ0cmFjdDsKLXsKLSAgaW50IFJkLCBScywgUm4gPSBGQUlMOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgewotICAgICAgUnMgPSBSZDsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfQU5ZKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0JewotCSAgLyogVHdvIG9wZXJhbmQgZm9ybWF0LCBzaHVmZmxlIHRoZSByZWdpc3RlcnMgYW5kIHByZXRlbmQgdGhlcmUgCi0JICAgICBhcmUgMyAqLwotCSAgUm4gPSBSczsKLQkgIFJzID0gUmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JewotCSAgc3RyKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLSAgICB9Ci0KLSAgLyogV2Ugbm93IGhhdmUgUmQgYW5kIFJzIHNldCB0byByZWdpc3RlcnMsIGFuZCBSbiBzZXQgdG8gYSByZWdpc3RlciBvciBGQUlMOwotICAgICBmb3IgdGhlIGxhdHRlciBjYXNlLCBFWFBSIGNvbnRhaW5zIHRoZSBpbW1lZGlhdGUgdGhhdCB3YXMgZm91bmQuICovCi0gIGlmIChSbiAhPSBGQUlMKQotICAgIHsKLSAgICAgIC8qIEFsbCByZWdpc3RlciBmb3JtYXQuICAqLwotICAgICAgaWYgKFJkID4gNyB8fCBScyA+IDcgfHwgUm4gPiA3KQotCXsKLQkgIGlmIChScyAhPSBSZCkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJkZXN0IGFuZCBzb3VyY2UxIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgLyogQ2FuJ3QgZG8gdGhpcyBmb3IgU1VCICovCi0JICBpZiAoc3VidHJhY3QpCi0JICAgIHsKLQkgICAgICBpbnN0LmVycm9yID0gXygic3VidHJhY3QgdmFsaWQgb25seSBvbiBsbyByZWdzIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSAoVF9PUENPREVfQUREX0hJCi0JCQkgICAgICB8IChSZCA+IDcgPyBUSFVNQl9IMSA6IDApCi0JCQkgICAgICB8IChSbiA+IDcgPyBUSFVNQl9IMiA6IDApKTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJkICYgNykgfCAoKFJuICYgNykgPDwgMyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9SMyA6IFRfT1BDT0RFX0FERF9SMzsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMykgfCAoUm4gPDwgNik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEltbWVkaWF0ZSBleHByZXNzaW9uLCBub3cgdGhpbmdzIHN0YXJ0IHRvIGdldCBuYXN0eS4gICovCi0KLSAgICAgIC8qIEZpcnN0IGRlYWwgd2l0aCBISSByZWdzLCBvbmx5IHZlcnkgcmVzdHJpY3RlZCBjYXNlcyBhbGxvd2VkOgotCSBBZGp1c3RpbmcgU1AsIGFuZCB1c2luZyBQQyBvciBTUCB0byBnZXQgYW4gYWRkcmVzcy4gICovCi0gICAgICBpZiAoKFJkID4gNyAmJiAoUmQgIT0gUkVHX1NQIHx8IFJzICE9IFJFR19TUCkpCi0JICB8fCAoUnMgPiA3ICYmIFJzICE9IFJFR19TUCAmJiBScyAhPSBSRUdfUEMpKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIEhpIHJlZ2lzdGVyIHdpdGggaW1tZWRpYXRlIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgYWxsIHdlIGNhbiBkbyBpcyBzdG9yZSBhbGwgdGhlIGZyYWdtZW50cwotCSAgICAgd2Uga25vdyBhYm91dCBpbiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGxldCB0aGUgcmVsb2MgaGFja2luZyAKLQkgICAgIHdvcmsgaXQgYWxsIG91dC4gICovCi0JICBpbnN0Lmluc3RydWN0aW9uID0gKHN1YnRyYWN0ID8gMHg4MDAwIDogMCkgfCAoUmQgPDwgNCkgfCBSczsKLQkgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCi0JICBpZiAoc3VidHJhY3QpCi0JICAgIG9mZnNldCA9IC1vZmZzZXQ7Ci0KLQkgIGlmIChvZmZzZXQgPCAwKQotCSAgICB7Ci0JICAgICAgb2Zmc2V0ID0gLW9mZnNldDsKLQkgICAgICBzdWJ0cmFjdCA9IDE7Ci0KLQkgICAgICAvKiBRdWljayBjaGVjaywgaW4gY2FzZSBvZmZzZXQgaXMgTUlOX0lOVCAqLwotCSAgICAgIGlmIChvZmZzZXQgPCAwKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICBzdWJ0cmFjdCA9IDA7Ci0KLQkgIGlmIChSZCA9PSBSRUdfU1ApCi0JICAgIHsKLQkgICAgICBpZiAob2Zmc2V0ICYgfjB4MWZjKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIHZhbHVlIGZvciBzdGFjayBhZGp1c3QiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfU1QgOiBUX09QQ09ERV9BRERfU1Q7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBvZmZzZXQgPj4gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAoUnMgPT0gUkVHX1BDIHx8IFJzID09IFJFR19TUCkKLQkgICAgewotCSAgICAgIGlmIChzdWJ0cmFjdAotCQkgIHx8IChvZmZzZXQgJiB+MHgzZmMpKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgaW1tZWRpYXRlIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiA9IChScyA9PSBSRUdfUEMgPyBUX09QQ09ERV9BRERfUEMKLQkJCQkgIDogVF9PUENPREVfQUREX1NQKTsKLQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IChSZCA8PCA4KSB8IChvZmZzZXQgPj4gMik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKFJzID09IFJkKQotCSAgICB7Ci0JICAgICAgaWYgKG9mZnNldCAmIH4weGZmKQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTggOiBUX09QQ09ERV9BRERfSTg7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgPDwgOCkgfCBvZmZzZXQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChvZmZzZXQgJiB+MHg3KQotCQl7Ci0JCSAgaW5zdC5lcnJvciA9IF8oImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTMgOiBUX09QQ09ERV9BRERfSTM7Ci0JICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKSB8IChvZmZzZXQgPDwgNik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXRodW1iX3NoaWZ0IChzdHIsIHNoaWZ0KQotICAgICBjaGFyICogc3RyOwotICAgICBpbnQgICAgc2hpZnQ7Ci17Ci0gIGludCBSZCwgUnMsIFJuID0gRkFJTDsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0gICAgewotICAgICAgLyogVHdvIG9wZXJhbmQgaW1tZWRpYXRlIGZvcm1hdCwgc2V0IFJzIHRvIFJkLiAgKi8KLSAgICAgIFJzID0gUmQ7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKChScyA9ICB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMKQotCXsKLQkgIC8qIFR3byBvcGVyYW5kIGZvcm1hdCwgc2h1ZmZsZSB0aGUgcmVnaXN0ZXJzIGFuZCBwcmV0ZW5kIHRoZXJlCi0JICAgICBhcmUgMyAqLwotCSAgUm4gPSBSczsKLQkgIFJzID0gUmQ7Ci0JfQotICAgICAgZWxzZSBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JewotCSAgc3RyKys7Ci0JICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JICAgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgoUm4gPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwpCi0JcmV0dXJuOwotICAgIH0KLQotICAvKiBXZSBub3cgaGF2ZSBSZCBhbmQgUnMgc2V0IHRvIHJlZ2lzdGVycywgYW5kIFJuIHNldCB0byBhIHJlZ2lzdGVyIG9yIEZBSUw7Ci0gICAgIGZvciB0aGUgbGF0dGVyIGNhc2UsIEVYUFIgY29udGFpbnMgdGhlIGltbWVkaWF0ZSB0aGF0IHdhcyBmb3VuZC4gKi8KLQotICBpZiAoUm4gIT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoUnMgIT0gUmQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oInNvdXJjZTEgYW5kIGRlc3QgbXVzdCBiZSBzYW1lIHJlZ2lzdGVyIik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBzd2l0Y2ggKHNoaWZ0KQotCXsKLQljYXNlIFRIVU1CX0FTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0FTUl9SOyBicmVhazsKLQljYXNlIFRIVU1CX0xTTDogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTTF9SOyBicmVhazsKLQljYXNlIFRIVU1CX0xTUjogaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xTUl9SOyBicmVhazsKLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUm4gPDwgMyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChzaGlmdCkKLQl7Ci0JY2FzZSBUSFVNQl9BU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9BU1JfSTsgYnJlYWs7Ci0JY2FzZSBUSFVNQl9MU0w6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfSTsgYnJlYWs7Ci0JY2FzZSBUSFVNQl9MU1I6IGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU1JfSTsgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFZhbHVlIGlzbid0IGtub3duIHlldCwgY3JlYXRlIGEgZHVtbXkgcmVsb2MgYW5kIGxldCByZWxvYwotCSAgICAgaGFja2luZyBmaXggaXQgdXAgKi8KLQotCSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgc2hpZnRfdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChzaGlmdF92YWx1ZSA+IDMyIHx8IChzaGlmdF92YWx1ZSA9PSAzMiAmJiBzaGlmdCA9PSBUSFVNQl9MU0wpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgaW1tZWRpYXRlIGZvciBzaGlmdCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICAvKiBTaGlmdHMgb2YgemVybyBhcmUgaGFuZGxlZCBieSBjb252ZXJ0aW5nIHRvIExTTCAqLwotCSAgaWYgKHNoaWZ0X3ZhbHVlID09IDApCi0JICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MU0xfSTsKLQotCSAgLyogU2hpZnRzIG9mIDMyIGFyZSBlbmNvZGVkIGFzIGEgc2hpZnQgb2YgemVybyAqLwotCSAgaWYgKHNoaWZ0X3ZhbHVlID09IDMyKQotCSAgICBzaGlmdF92YWx1ZSA9IDA7Ci0KLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gc2hpZnRfdmFsdWUgPDwgNjsKLQl9Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7Ci0gICAgfQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLXRodW1iX21vdl9jb21wYXJlIChzdHIsIG1vdmUpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBtb3ZlOwotewotICBpbnQgUmQsIFJzID0gRkFJTDsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGlzX2ltbWVkaWF0ZV9wcmVmaXggKCpzdHIpKQotICAgIHsKLSAgICAgIHN0cisrOwotICAgICAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotCXJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKChScyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0FOWSkpID09IEZBSUwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChScyAhPSBGQUlMKQotICAgIHsKLSAgICAgIGlmIChScyA8IDggJiYgUmQgPCA4KQotCXsKLQkgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JICAgIC8qIEEgbW92ZSBvZiB0d28gbG93cmVncyBpcyBlbmNvZGVkIGFzIEFERCBSZCwgUnMsICMwCi0JICAgICAgIHNpbmNlIGEgTU9WIGluc3RydWN0aW9uIHByb2R1Y2VzIHVucHJlZGljdGFibGUgcmVzdWx0cyAqLwotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQUREX0kzOwotCSAgZWxzZQotCSAgICBpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0xSOwotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChScyA8PCAzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG1vdmUgPT0gVEhVTUJfTU9WRSkKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9IUjsKLQkgIGVsc2UKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0NNUF9IUjsKLQotCSAgaWYgKFJkID4gNykKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMTsKLQotCSAgaWYgKFJzID4gNykKLQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBUSFVNQl9IMjsKLQotCSAgaW5zdC5pbnN0cnVjdGlvbiB8PSAoUmQgJiA3KSB8ICgoUnMgJiA3KSA8PCAzKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKFJkID4gNykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygib25seSBsbyByZWdzIGFsbG93ZWQgd2l0aCBpbW1lZGlhdGUiKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChtb3ZlID09IFRIVU1CX01PVkUpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX01PVl9JODsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfQ01QX0k4OwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9JTU07Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgdmFsdWUgPSBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmICh2YWx1ZSA+IDI1NSkKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIGltbWVkaWF0ZSIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IHZhbHVlOwotCX0KLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi10aHVtYl9sb2FkX3N0b3JlIChzdHIsIGxvYWRfc3RvcmUsIHNpemUpCi0gICAgIGNoYXIgKiBzdHI7Ci0gICAgIGludCAgICBsb2FkX3N0b3JlOwotICAgICBpbnQgICAgc2l6ZTsKLXsKLSAgaW50IFJkLCBSYiwgUm8gPSBGQUlMOwotCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAoKFJkID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwpCi0gICAgewotICAgICAgaWYgKCEgaW5zdC5lcnJvcikKLQlpbnN0LmVycm9yID0gYmFkX2FyZ3M7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgqc3RyID09ICdbJykKLSAgICB7Ci0gICAgICBzdHIrKzsKLSAgICAgIGlmICgoUmIgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotCXJldHVybjsKLQotICAgICAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgIT0gRkFJTCkKLQl7Ci0JICBpZiAoaXNfaW1tZWRpYXRlX3ByZWZpeCAoKnN0cikpCi0JICAgIHsKLQkgICAgICBzdHIrKzsKLQkgICAgICBpZiAobXlfZ2V0X2V4cHJlc3Npb24gKCZpbnN0LnJlbG9jLmV4cCwgJnN0cikpCi0JCXJldHVybjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKFJvID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotCSAgICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGluc3QucmVsb2MuZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyID0gMDsKLQl9Ci0KLSAgICAgIGlmICgqc3RyICE9ICddJykKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiZXhwZWN0ZWQgJ10nIik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc3RyKys7Ci0gICAgfQotICBlbHNlIGlmICgqc3RyID09ICc9JykKLSAgICB7Ci0gICAgICAvKiBQYXJzZSBhbiAibGRyIFJkLCA9ZXhwciIgaW5zdHJ1Y3Rpb247IHRoaXMgaXMgYW5vdGhlciBwc2V1ZG8gb3AgKi8KLSAgICAgIHN0cisrOwotCi0gICAgICB3aGlsZSAoKnN0ciA9PSAnICcpCi0Jc3RyKys7Ci0KLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJiBpbnN0LnJlbG9jLmV4cCwgJiBzdHIpKQotCXJldHVybjsKLQotICAgICAgZW5kX29mX2xpbmUgKHN0cik7Ci0gICAgICAKLSAgICAgIGlmICggICBpbnN0LnJlbG9jLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkgICYmIGluc3QucmVsb2MuZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgaW5zdC5lcnJvciA9ICJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIjsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkgICYmICgoaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyICYgfjB4RkYpID09IDApKQotCXsKLQkgIC8qIFRoaXMgY2FuIGJlIGRvbmUgd2l0aCBhIG1vdiBpbnN0cnVjdGlvbiAqLwotCi0JICBpbnN0Lmluc3RydWN0aW9uICA9IFRfT1BDT0RFX01PVl9JOCB8IChSZCA8PCA4KTsKLQkgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCSAgcmV0dXJuOyAKLQl9Ci0KLSAgICAgIC8qIEluc2VydCBpbnRvIGxpdGVyYWwgcG9vbCAqLyAgICAgCi0gICAgICBpZiAoYWRkX3RvX2xpdF9wb29sICgpID09IEZBSUwpCi0JewotCSAgaWYgKCFpbnN0LmVycm9yKQotCSAgICBpbnN0LmVycm9yID0gImxpdGVyYWwgcG9vbCBpbnNlcnRpb24gZmFpbGVkIjsgCi0JICByZXR1cm47Ci0JfQotCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgICA9IEJGRF9SRUxPQ19BUk1fVEhVTUJfT0ZGU0VUOwotICAgICAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICAgICAgaW5zdC5pbnN0cnVjdGlvbiAgPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgKz0gNDsgLyogQWRqdXN0IEFSTSBwaXBlbGluZSBvZmZzZXQgdG8gVGh1bWIgKi8KLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLQlyZXR1cm47Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEMgfCAoUmQgPDwgOCk7Ci0gICAgICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gICAgICBpbnN0LnJlbG9jLmV4cC5YX2FkZF9udW1iZXIgLT0gNDsgLyogUGlwZWxpbmUgb2Zmc2V0ICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICAgIGVuZF9vZl9saW5lIChzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoUmIgPT0gUkVHX1BDIHx8IFJiID09IFJFR19TUCkKLSAgICB7Ci0gICAgICBpZiAoc2l6ZSAhPSBUSFVNQl9XT1JEKQotCXsKLQkgIGluc3QuZXJyb3IgPSBfKCJieXRlIG9yIGhhbGZ3b3JkIG5vdCB2YWxpZCBmb3IgYmFzZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKFJiID09IFJFR19QQyAmJiBsb2FkX3N0b3JlICE9IFRIVU1CX0xPQUQpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIlIxNSBiYXNlZCBzdG9yZSBub3QgYWxsb3dlZCIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKFJvICE9IEZBSUwpCi0JewotCSAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgYmFzZSByZWdpc3RlciBmb3IgcmVnaXN0ZXIgb2Zmc2V0Iik7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoUmIgPT0gUkVHX1BDKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSBUX09QQ09ERV9MRFJfUEM7Ci0gICAgICBlbHNlIGlmIChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IFRfT1BDT0RFX0xEUl9TUDsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gVF9PUENPREVfU1RSX1NQOwotCi0gICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IFJkIDw8IDg7Ci0gICAgICBpZiAoaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIHVuc2lnbmVkIG9mZnNldCA9IGluc3QucmVsb2MuZXhwLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKG9mZnNldCAmIH4weDNmYykKLQkgICAgewotCSAgICAgIGluc3QuZXJyb3IgPSBfKCJpbnZhbGlkIG9mZnNldCIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBpbnN0Lmluc3RydWN0aW9uIHw9IG9mZnNldCA+PiAyOwotCX0KLSAgICAgIGVsc2UKLQlpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDsKLSAgICB9Ci0gIGVsc2UgaWYgKFJiID4gNykKLSAgICB7Ci0gICAgICBpbnN0LmVycm9yID0gXygiaW52YWxpZCBiYXNlIHJlZ2lzdGVyIGluIGxvYWQvc3RvcmUiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKFJvID09IEZBSUwpCi0gICAgewotICAgICAgLyogSW1tZWRpYXRlIG9mZnNldCAqLwotICAgICAgaWYgKHNpemUgPT0gVEhVTUJfV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX0lXIDogVF9PUENPREVfU1RSX0lXKTsKLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gVEhVTUJfSEFMRldPUkQpCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JSCA6IFRfT1BDT0RFX1NUUl9JSCk7Ci0gICAgICBlbHNlCi0JaW5zdC5pbnN0cnVjdGlvbiA9IChsb2FkX3N0b3JlID09IFRIVU1CX0xPQUQKLQkJCSAgICA/IFRfT1BDT0RFX0xEUl9JQiA6IFRfT1BDT0RFX1NUUl9JQik7Ci0KLSAgICAgIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMyk7Ci0KLSAgICAgIGlmIChpbnN0LnJlbG9jLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgdW5zaWduZWQgb2Zmc2V0ID0gaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyOwotCSAgCi0JICBpZiAob2Zmc2V0ICYgfigweDFmIDw8IHNpemUpKQotCSAgICB7Ci0JICAgICAgaW5zdC5lcnJvciA9IF8oIkludmFsaWQgb2Zmc2V0Iik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IChvZmZzZXQgPj4gc2l6ZSkgPDwgNjsKLQl9Ci0gICAgICBlbHNlCi0JaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9USFVNQl9PRkZTRVQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogUmVnaXN0ZXIgb2Zmc2V0ICovCi0gICAgICBpZiAoc2l6ZSA9PSBUSFVNQl9XT1JEKQotCWluc3QuaW5zdHJ1Y3Rpb24gPSAobG9hZF9zdG9yZSA9PSBUSFVNQl9MT0FECi0JCQkgICAgPyBUX09QQ09ERV9MRFJfUlcgOiBUX09QQ09ERV9TVFJfUlcpOwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSBUSFVNQl9IQUxGV09SRCkKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JIIDogVF9PUENPREVfU1RSX1JIKTsKLSAgICAgIGVsc2UKLQlpbnN0Lmluc3RydWN0aW9uID0gKGxvYWRfc3RvcmUgPT0gVEhVTUJfTE9BRAotCQkJICAgID8gVF9PUENPREVfTERSX1JCIDogVF9PUENPREVfU1RSX1JCKTsKLQotICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBSZCB8IChSYiA8PCAzKSB8IChSbyA8PCA2KTsKLSAgICB9Ci0KLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X25vcCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICAvKiBEbyBub3RoaW5nICovCi0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLS8qIEhhbmRsZSB0aGUgRm9ybWF0IDQgaW5zdHJ1Y3Rpb25zIHRoYXQgZG8gbm90IGhhdmUgZXF1aXZhbGVudHMgaW4gb3RoZXIgCi0gICBmb3JtYXRzLiAgVGhhdCBpcywgQURDLCBBTkQsIEVPUiwgU0JDLCBST1IsIFRTVCwgTkVHLCBDTU4sIE9SUiwgTVVMLAotICAgQklDIGFuZCBNVk4uICAqLwotc3RhdGljIHZvaWQKLWRvX3RfYXJpdCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICBpbnQgUmQsIFJzLCBSbjsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSZCA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKFJzID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2tpcF9wYXN0X2NvbW1hICgmc3RyKSAhPSBGQUlMKQotICAgIHsKLSAgICAgIC8qIFRocmVlIG9wZXJhbmQgZm9ybWF0IG5vdCBhbGxvd2VkIGZvciBUU1QsIENNTiwgTkVHIGFuZCBNVk4uCi0JIChJdCBpc24ndCBhbGxvd2VkIGZvciBDTVAgZWl0aGVyLCBidXQgdGhhdCBpc24ndCBoYW5kbGVkIGJ5IHRoaXMKLQkgZnVuY3Rpb24uKSAgKi8KLSAgICAgIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX1RTVAotCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9DTU4KLQkgIHx8IGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfTkVHCi0gCSAgfHwgaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9NVk4pCi0JewotCSAgaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgaWYgKChSbiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLQlyZXR1cm47Ci0KLSAgICAgIGlmIChScyAhPSBSZCkKLQl7Ci0JICBpbnN0LmVycm9yID0gXygiZGVzdCBhbmQgc291cmNlMSBvbmUgbXVzdCBiZSB0aGUgc2FtZSByZWdpc3RlciIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIFJzID0gUm47Ci0gICAgfQotCi0gIGlmIChpbnN0Lmluc3RydWN0aW9uID09IFRfT1BDT0RFX01VTAotICAgICAgJiYgUnMgPT0gUmQpCi0gICAgYXNfdHNrdHNrIChfKCJScyBhbmQgUmQgbXVzdCBiZSBkaWZmZXJlbnQgaW4gTVVMIikpOwotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUnMgPDwgMyk7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9hZGQgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfYWRkX3N1YiAoc3RyLCAwKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYXNyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0FTUik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDkgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX1RIVU1CX1BDUkVMX0JSQU5DSDk7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2JyYW5jaDEyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjsKLSAgaW5zdC5yZWxvYy5wY19yZWwgPSAxOwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotLyogRmluZCB0aGUgcmVhbCwgVGh1bWIgZW5jb2RlZCBzdGFydCBvZiBhIFRodW1iIGZ1bmN0aW9uLiAgKi8KLQotc3RhdGljIHN5bWJvbFMgKgotZmluZF9yZWFsX3N0YXJ0IChzeW1ib2xQKQotICAgICBzeW1ib2xTICogc3ltYm9sUDsKLXsKLSAgY2hhciAqICAgICAgIHJlYWxfc3RhcnQ7Ci0gIGNvbnN0IGNoYXIgKiBuYW1lID0gU19HRVRfTkFNRSAoc3ltYm9sUCk7Ci0gIHN5bWJvbFMgKiAgICBuZXdfdGFyZ2V0OwotCi0gIC8qIFRoaXMgZGVmaW5pdG9ubXVzdCBhZ3JlZSB3aXRoIHRoZSBvbmUgaW4gZ2NjL2NvbmZpZy9hcm0vdGh1bWIuYyAqLwotI2RlZmluZSBTVFVCX05BTUUgIi5yZWFsX3N0YXJ0X29mIgotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgYWJvcnQoKTsKLQotICAvKiBOYW1lcyB0aGF0IHN0YXJ0IHdpdGggJy4nIGFyZSBsb2NhbCBsYWJlbHMsIG5vdCBmdW5jdGlvbiBlbnRyeSBwb2ludHMuCi0gICAgIFRoZSBjb21waWxlciBtYXkgZ2VuZXJhdGUgQkwgaW5zdHJ1Y3Rpb25zIHRvIHRoZXNlIGxhYmVscyBiZWNhdXNlIGl0Ci0gICAgIG5lZWRzIHRvIHBlcmZvcm0gYSBicmFuY2ggdG8gYSBmYXIgYXdheSBsb2NhdGlvbi4gICovCi0gIGlmIChuYW1lWzBdID09ICcuJykKLSAgICByZXR1cm4gc3ltYm9sUDsKLSAgCi0gIHJlYWxfc3RhcnQgPSBtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyBzdHJsZW4gKFNUVUJfTkFNRSkgKyAxKTsKLSAgc3ByaW50ZiAocmVhbF9zdGFydCwgIiVzJXMiLCBTVFVCX05BTUUsIG5hbWUpOwotCi0gIG5ld190YXJnZXQgPSBzeW1ib2xfZmluZCAocmVhbF9zdGFydCk7Ci0gIAotICBpZiAobmV3X3RhcmdldCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKCJGYWlsZWQgdG8gZmluZCByZWFsIHN0YXJ0IG9mIGZ1bmN0aW9uOiAlc1xuIiwgbmFtZSk7Ci0gICAgICBuZXdfdGFyZ2V0ID0gc3ltYm9sUDsKLSAgICB9Ci0KLSAgZnJlZSAocmVhbF9zdGFydCk7Ci0KLSAgcmV0dXJuIG5ld190YXJnZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRvX3RfYnJhbmNoMjMgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaWYgKG15X2dldF9leHByZXNzaW9uICgmaW5zdC5yZWxvYy5leHAsICZzdHIpKQotICAgIHJldHVybjsKLSAgaW5zdC5yZWxvYy50eXBlICAgPSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM7Ci0gIGluc3QucmVsb2MucGNfcmVsID0gMTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci0KLSAgLyogSWYgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBicmFuY2ggaXMgYSBkZWZpbmVkIHN5bWJvbCB3aGljaCBkb2VzIG5vdCBoYXZlCi0gICAgIHRoZSBUSFVNQl9GVU5DIGF0dHJpYnV0ZSwgdGhlbiB3ZSBtdXN0IGJlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aGljaCBoYXMKLSAgICAgdGhlIChpbnRlcmZhY2Vhcm0pIGF0dHJpYnV0ZS4gIFdlIGxvb2sgZm9yIHRoZSBUaHVtYiBlbnRyeSBwb2ludCB0byB0aGF0Ci0gICAgIGZ1bmN0aW9uIGFuZCBjaGFuZ2UgdGhlIGJyYW5jaCB0byByZWZlciB0byB0aGF0IGZ1bmN0aW9uIGluc3RlYWQuICAqLwotICBpZiAoICAgaW5zdC5yZWxvYy5leHAuWF9vcCA9PSBPX3N5bWJvbAotICAgICAgJiYgaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sICE9IE5VTEwKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKQotICAgICAgJiYgISBUSFVNQl9JU19GVU5DIChpbnN0LnJlbG9jLmV4cC5YX2FkZF9zeW1ib2wpKQotICAgIGluc3QucmVsb2MuZXhwLlhfYWRkX3N5bWJvbCA9IGZpbmRfcmVhbF9zdGFydCAoaW5zdC5yZWxvYy5leHAuWF9hZGRfc3ltYm9sKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfYnggKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaW50IHJlZzsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyZWcgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19BTlkpKSA9PSBGQUlMKQotICAgIHJldHVybjsKLQotICAvKiBUaGlzIHNldHMgVEhVTUJfSDIgZnJvbSB0aGUgdG9wIGJpdCBvZiByZWcuICAqLwotICBpbnN0Lmluc3RydWN0aW9uIHw9IHJlZyA8PCAzOwotCi0gIC8qID8/PyBGSVhNRTogU2hvdWxkIGFkZCBhIGhhY2t5IHJlbG9jIGhlcmUgaWYgcmVnIGlzIFJFR19QQy4gIFRoZSByZWxvYwotICAgICBzaG91bGQgY2F1c2UgdGhlIGFsaWdubWVudCB0byBiZSBjaGVja2VkIG9uY2UgaXQgaXMga25vd24uICBUaGlzIGlzCi0gICAgIGJlY2F1c2UgQlggUEMgb25seSB3b3JrcyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgd29yZCBhbGlnbmVkLiAgKi8KLQotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfY29tcGFyZSAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBUSFVNQl9DT01QQVJFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRtc3RtIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGludCBSYjsKLSAgbG9uZyByYW5nZTsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChSYiA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCpzdHIgIT0gJyEnKQotICAgIGFzX3dhcm4gKF8oIkluc2VydGVkIG1pc3NpbmcgJyEnOiBsb2FkL3N0b3JlIG11bHRpcGxlIGFsd2F5cyB3cml0ZXMgYmFjayBiYXNlIHJlZ2lzdGVyIikpOwotICBlbHNlCi0gICAgc3RyKys7Ci0KLSAgaWYgKHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKHJhbmdlID0gcmVnX2xpc3QgKCZzdHIpKSA9PSBGQUlMKQotICAgIHsKLSAgICAgIGlmICghIGluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5zdC5yZWxvYy50eXBlICE9IEJGRF9SRUxPQ19OT05FKQotICAgIHsKLSAgICAgIC8qIFRoaXMgcmVhbGx5IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdC4gKi8KLSAgICAgIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgaW5zdC5lcnJvciA9IF8oIkV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHJhbmdlICYgfjB4ZmYpCi0gICAgewotICAgICAgaW5zdC5lcnJvciA9IF8oIm9ubHkgbG8tcmVncyB2YWxpZCBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gKFJiIDw8IDgpIHwgcmFuZ2U7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHIgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfbG9hZF9zdG9yZSAoc3RyLCBUSFVNQl9MT0FELCBUSFVNQl9XT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbGRyYiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX0xPQUQsIFRIVU1CX0JZVEUpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHJoIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX2xvYWRfc3RvcmUgKHN0ciwgVEhVTUJfTE9BRCwgVEhVTUJfSEFMRldPUkQpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sZHMgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgaW50IFJkLCBSYiwgUm87Ci0KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmICgoUmQgPSB0aHVtYl9yZWcgKCZzdHIsIFRIVU1CX1JFR19MTykpID09IEZBSUwKLSAgICAgIHx8IHNraXBfcGFzdF9jb21tYSAoJnN0cikgPT0gRkFJTAotICAgICAgfHwgKnN0cisrICE9ICdbJwotICAgICAgfHwgKFJiID0gdGh1bWJfcmVnICgmc3RyLCBUSFVNQl9SRUdfTE8pKSA9PSBGQUlMCi0gICAgICB8fCBza2lwX3Bhc3RfY29tbWEgKCZzdHIpID09IEZBSUwKLSAgICAgIHx8IChSbyA9IHRodW1iX3JlZyAoJnN0ciwgVEhVTUJfUkVHX0xPKSkgPT0gRkFJTAotICAgICAgfHwgKnN0cisrICE9ICddJykKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBfKCJTeW50YXg6IGxkcnNbYl0gUmQsIFtSYiwgUm9dIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUmQgfCAoUmIgPDwgMykgfCAoUm8gPDwgNik7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9sc2wgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgdGh1bWJfc2hpZnQgKHN0ciwgVEhVTUJfTFNMKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfbHNyIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHRodW1iX3NoaWZ0IChzdHIsIFRIVU1CX0xTUik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X21vdiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9tb3ZfY29tcGFyZSAoc3RyLCBUSFVNQl9NT1ZFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3RfcHVzaF9wb3AgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgbG9uZyByYW5nZTsKLQotICB3aGlsZSAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0KLSAgaWYgKChyYW5nZSA9IHJlZ19saXN0ICgmc3RyKSkgPT0gRkFJTCkKLSAgICB7Ci0gICAgICBpZiAoISBpbnN0LmVycm9yKQotCWluc3QuZXJyb3IgPSBiYWRfYXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHJlYWxseSBkb2Vzbid0IHNlZW0gd29ydGggaXQuICovCi0gICAgICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIGluc3QuZXJyb3IgPSBfKCJFeHByZXNzaW9uIHRvbyBjb21wbGV4Iik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChyYW5nZSAmIH4weGZmKQotICAgIHsKLSAgICAgIGlmICgoaW5zdC5pbnN0cnVjdGlvbiA9PSBUX09QQ09ERV9QVVNICi0JICAgJiYgKHJhbmdlICYgfjB4ZmYpID09IDEgPDwgUkVHX0xSKQotCSAgfHwgKGluc3QuaW5zdHJ1Y3Rpb24gPT0gVF9PUENPREVfUE9QCi0JICAgICAgJiYgKHJhbmdlICYgfjB4ZmYpID09IDEgPDwgUkVHX1BDKSkKLQl7Ci0JICBpbnN0Lmluc3RydWN0aW9uIHw9IFRIVU1CX1BQX1BDX0xSOwotCSAgcmFuZ2UgJj0gMHhmZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW5zdC5lcnJvciA9IF8oImludmFsaWQgcmVnaXN0ZXIgbGlzdCB0byBwdXNoL3BvcCBpbnN0cnVjdGlvbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaW5zdC5pbnN0cnVjdGlvbiB8PSByYW5nZTsKLSAgZW5kX29mX2xpbmUgKHN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N0ciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9XT1JEKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3RyYiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9CWVRFKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX3Rfc3RyaCAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9sb2FkX3N0b3JlIChzdHIsIFRIVU1CX1NUT1JFLCBUSFVNQl9IQUxGV09SRCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X3N1YiAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICB0aHVtYl9hZGRfc3ViIChzdHIsIDEpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fdF9zd2kgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIGlmIChteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICByZXR1cm47Ci0KLSAgaW5zdC5yZWxvYy50eXBlID0gQkZEX1JFTE9DX0FSTV9TV0k7Ci0gIGVuZF9vZl9saW5lIChzdHIpOwotICByZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb190X2FkciAoc3RyKQotICAgICBjaGFyICogc3RyOwotewotICAvKiBUaGlzIGlzIGEgcHNldWRvLW9wIG9mIHRoZSBmb3JtICJhZHIgcmQsIGxhYmVsIiB0byBiZSBjb252ZXJ0ZWQKLSAgICAgaW50byBhIHJlbGF0aXZlIGFkZHJlc3Mgb2YgdGhlIGZvcm0gImFkZCByZCwgcGMsICNsYWJlbC0uLTQiICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICBpZiAocmVnX3JlcXVpcmVkX2hlcmUgKCZzdHIsIDQpID09IEZBSUwgIC8qIFN0b3JlIFJkIGluIHRlbXBvcmFyeSBsb2NhdGlvbiBpbnNpZGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgfHwgc2tpcF9wYXN0X2NvbW1hICgmc3RyKSA9PSBGQUlMCi0gICAgICB8fCBteV9nZXRfZXhwcmVzc2lvbiAoJmluc3QucmVsb2MuZXhwLCAmc3RyKSkKLSAgICB7Ci0gICAgICBpZiAoIWluc3QuZXJyb3IpCi0JaW5zdC5lcnJvciA9IGJhZF9hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpbnN0LnJlbG9jLnR5cGUgPSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDsKLSAgaW5zdC5yZWxvYy5leHAuWF9hZGRfbnVtYmVyIC09IDQ7IC8qIFBDIHJlbGF0aXZlIGFkanVzdCAqLwotICBpbnN0LnJlbG9jLnBjX3JlbCA9IDE7Ci0gIGluc3QuaW5zdHJ1Y3Rpb24gfD0gUkVHX1BDOyAvKiBSZCBpcyBhbHJlYWR5IHBsYWNlZCBpbnRvIHRoZSBpbnN0cnVjdGlvbiAqLwotICBlbmRfb2ZfbGluZSAoc3RyKTsKLX0KLQotc3RhdGljIHZvaWQKLWluc2VydF9yZWcgKGVudHJ5KQotICAgICBpbnQgZW50cnk7Ci17Ci0gIGludCAgICBsZW4gPSBzdHJsZW4gKHJlZ190YWJsZVtlbnRyeV0ubmFtZSkgKyAyOwotICBjaGFyICogYnVmID0gKGNoYXIgKikgeG1hbGxvYyAobGVuKTsKLSAgY2hhciAqIGJ1ZjIgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4pOwotICBpbnQgICAgaSA9IDA7Ci0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgYnVmW2krK10gPSBSRUdJU1RFUl9QUkVGSVg7Ci0jZW5kaWYKLQotICBzdHJjcHkgKGJ1ZiArIGksIHJlZ190YWJsZVtlbnRyeV0ubmFtZSk7Ci0KLSAgZm9yIChpID0gMDsgYnVmW2ldOyBpKyspCi0gICAgYnVmMltpXSA9IGlzbG93ZXIgKGJ1ZltpXSkgPyB0b3VwcGVyIChidWZbaV0pIDogYnVmW2ldOwotCi0gIGJ1ZjJbaV0gPSAnXDAnOwotCi0gIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmLCAoUFRSKSAmcmVnX3RhYmxlW2VudHJ5XSk7Ci0gIGhhc2hfaW5zZXJ0IChhcm1fcmVnX2hzaCwgYnVmMiwgKFBUUikgJnJlZ190YWJsZVtlbnRyeV0pOwotfQotCi1zdGF0aWMgdm9pZAotaW5zZXJ0X3JlZ19hbGlhcyAoc3RyLCByZWdudW0pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgc3RydWN0IHJlZ19lbnRyeSAqbmV3ID0KLSAgICAoc3RydWN0IHJlZ19lbnRyeSAqKXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHJlZ19lbnRyeSkpOwotICBjaGFyICpuYW1lID0geG1hbGxvYyAoc3RybGVuIChzdHIpICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc3RyKTsKLQotICBuZXctPm5hbWUgPSBuYW1lOwotICBuZXctPm51bWJlciA9IHJlZ251bTsKLQotICBoYXNoX2luc2VydCAoYXJtX3JlZ19oc2gsIG5hbWUsIChQVFIpIG5ldyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfY29uc3RhbnRfZmxvbnVtcyAoKQotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT0FUX1ZBTFM7IGkrKykKLSAgICBpZiAoYXRvZl9pZWVlICgoY2hhciAqKWZwX2NvbnN0W2ldLCAneCcsIGZwX3ZhbHVlc1tpXSkgPT0gTlVMTCkKLSAgICAgIGFib3J0ICgpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBpbnQgaTsKLSAgCi0gIGlmICggICAoYXJtX29wc19oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTAotICAgICAgfHwgKGFybV90b3BzX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX2NvbmRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fc2hpZnRfaHNoID0gaGFzaF9uZXcgKCkpID09IE5VTEwKLSAgICAgIHx8IChhcm1fcmVnX2hzaCA9IGhhc2hfbmV3ICgpKSA9PSBOVUxMCi0gICAgICB8fCAoYXJtX3Bzcl9oc2ggPSBoYXNoX25ldyAoKSkgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiVmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIikpOwotICAgIAotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChpbnNucykgLyBzaXplb2YgKHN0cnVjdCBhc21fb3Bjb2RlKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fb3BzX2hzaCwgaW5zbnNbaV0udGVtcGxhdGUsIChQVFIpIChpbnNucyArIGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGluc25zKSAvIHNpemVvZiAoc3RydWN0IHRodW1iX29wY29kZSk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3RvcHNfaHNoLCB0aW5zbnNbaV0udGVtcGxhdGUsIChQVFIpICh0aW5zbnMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvbmRzKSAvIHNpemVvZiAoc3RydWN0IGFzbV9jb25kKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fY29uZF9oc2gsIGNvbmRzW2ldLnRlbXBsYXRlLCAoUFRSKSAoY29uZHMgKyBpKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHNoaWZ0KSAvIHNpemVvZiAoc3RydWN0IGFzbV9zaGlmdCk7IGkrKykKLSAgICBoYXNoX2luc2VydCAoYXJtX3NoaWZ0X2hzaCwgc2hpZnRbaV0udGVtcGxhdGUsIChQVFIpIChzaGlmdCArIGkpKTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAocHNycykgLyBzaXplb2YgKHN0cnVjdCBhc21fcHNyKTsgaSsrKQotICAgIGhhc2hfaW5zZXJ0IChhcm1fcHNyX2hzaCwgcHNyc1tpXS50ZW1wbGF0ZSwgKFBUUikgKHBzcnMgKyBpKSk7Ci0KLSAgZm9yIChpID0gMDsgcmVnX3RhYmxlW2ldLm5hbWU7IGkrKykKLSAgICBpbnNlcnRfcmVnIChpKTsKLQotICBzZXRfY29uc3RhbnRfZmxvbnVtcyAoKTsKLQotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotICAgIAotICAgIC8qIFNldCB0aGUgZmxhZ3MgaW4gdGhlIHByaXZhdGUgc3RydWN0dXJlICovCi0gICAgaWYgKHVzZXNfYXBjc18yNikgICAgICBmbGFncyB8PSBGX0FQQ1MyNjsKLSAgICBpZiAoc3VwcG9ydF9pbnRlcndvcmspIGZsYWdzIHw9IEZfSU5URVJXT1JLOwotICAgIGlmICh1c2VzX2FwY3NfZmxvYXQpICAgZmxhZ3MgfD0gRl9BUENTX0ZMT0FUOwotICAgIGlmIChwaWNfY29kZSkgICAgICAgICAgZmxhZ3MgfD0gRl9QSUM7Ci0KLSAgICBiZmRfc2V0X3ByaXZhdGVfZmxhZ3MgKHN0ZG91dHB1dCwgZmxhZ3MpOwotICB9Ci0jZW5kaWYKLSAgCi0gIHsKLSAgICB1bnNpZ25lZCBtYWNoOwotICAgIAotICAgIC8qIFJlY29yZCB0aGUgQ1BVIHR5cGUgYXMgd2VsbCAqLwotICAgIHN3aXRjaCAoY3B1X3ZhcmlhbnQgJiBBUk1fQ1BVX01BU0spCi0gICAgICB7Ci0gICAgICBjYXNlIEFSTV8yOgotCW1hY2ggPSBiZmRfbWFjaF9hcm1fMjsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgQVJNXzM6IC8qIGFsc28gQVJNXzI1MCAqLwotCW1hY2ggPSBiZmRfbWFjaF9hcm1fMmE7Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICBjYXNlIEFSTV82IHwgQVJNXzMgfCBBUk1fMjoJLyogQWN0dWFsbHkgbm8gQ1BVIHR5cGUgZGVmaW5lZCAqLwotCW1hY2ggPSBiZmRfbWFjaF9hcm1fNDsKLQlicmVhazsKLQkKLSAgICAgIGNhc2UgQVJNXzc6IAkJCS8qIGFsc28gQVJNXzYgKi8KLQltYWNoID0gYmZkX21hY2hfYXJtXzM7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAvKiBDYXRjaCBzcGVjaWFsIGNhc2VzICovCi0gICAgaWYgKGNwdV92YXJpYW50ICE9IChGUFVfREVGQVVMVCB8IENQVV9ERUZBVUxUKSkKLSAgICAgIHsKLQlpZiAoY3B1X3ZhcmlhbnQgJiBBUk1fVEhVTUIpCi0JICBtYWNoID0gYmZkX21hY2hfYXJtXzRUOwotCWVsc2UgaWYgKChjcHVfdmFyaWFudCAmIEFSTV9BUkNIdjQpID09IEFSTV9BUkNIdjQpCi0JICBtYWNoID0gYmZkX21hY2hfYXJtXzQ7Ci0JZWxzZSBpZiAoY3B1X3ZhcmlhbnQgJiBBUk1fTE9OR01VTCkKLQkgIG1hY2ggPSBiZmRfbWFjaF9hcm1fM007Ci0gICAgICB9Ci0JCi0gICAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIG1hY2gpOwotICB9Ci19Ci0KLS8qIFR1cm4gYW4gaW50ZWdlciBvZiBuIGJ5dGVzIChpbiB2YWwpIGludG8gYSBzdHJlYW0gb2YgYnl0ZXMgYXBwcm9wcmlhdGUKLSAgIGZvciB1c2UgaW4gdGhlIGEub3V0IGZpbGUsIGFuZCBzdG9yZXMgdGhlbSBpbiB0aGUgYXJyYXkgcG9pbnRlZCB0byBieSBidWYuCi0gICBUaGlzIGtub3dzIGFib3V0IHRoZSBlbmRpYW4tbmVzcyBvZiB0aGUgdGFyZ2V0IG1hY2hpbmUgYW5kIGRvZXMKLSAgIFRIRSBSSUdIVCBUSElORywgd2hhdGV2ZXIgaXQgaXMuICBQb3NzaWJsZSB2YWx1ZXMgZm9yIG4gYXJlIDEgKGJ5dGUpCi0gICAyIChzaG9ydCkgYW5kIDQgKGxvbmcpICBGbG9hdGluZyBudW1iZXJzIGFyZSBwdXQgb3V0IGFzIGEgc2VyaWVzIG9mCi0gICBMSVRUTEVOVU1TIChzaG9ydHMsIGhlcmUgYXQgbGVhc3QpCi0gICAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50ICAgIG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLXN0YXRpYyB2YWx1ZVQgCi1tZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgbikKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgaW50IG47Ci17Ci0gIHZhbHVlVCByZXN1bHQgPSAwOwotICB1bnNpZ25lZCBjaGFyICogd2hlcmUgPSAodW5zaWduZWQgY2hhciAqKSBidWY7Ci0KLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIHdoaWxlIChuLS0pCi0JewotCSAgcmVzdWx0IDw8PSA4OwotCSAgcmVzdWx0IHw9ICgqd2hlcmUrKyAmIDI1NSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHdoaWxlIChuLS0pCi0JewotCSAgcmVzdWx0IDw8PSA4OwotCSAgcmVzdWx0IHw9ICh3aGVyZVtuXSAmIDI1NSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgVFlQRSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotCi0gICBOb3RlIHRoYXQgZnAgY29uc3RhbnRzIGFyZW4ndCByZXByZXNlbnQgaW4gdGhlIG5vcm1hbCB3YXkgb24gdGhlIEFSTS4KLSAgIEluIGJpZyBlbmRpYW4gbW9kZSwgdGhpbmdzIGFyZSBhcyBleHBlY3RlZC4gIEhvd2V2ZXIsIGluIGxpdHRsZSBlbmRpYW4KLSAgIG1vZGUgZnAgY29uc3RhbnRzIGFyZSBiaWctZW5kaWFuIHdvcmQtd2lzZSwgYW5kIGxpdHRsZS1lbmRpYW4gYnl0ZS13aXNlCi0gICB3aXRoaW4gdGhlIHdvcmRzLiAgRm9yIGV4YW1wbGUsIChkb3VibGUpIDEuMSBpbiBiaWcgZW5kaWFuIG1vZGUgaXMKLSAgIHRoZSBieXRlIHNlcXVlbmNlIDNmIGYxIDk5IDk5IDk5IDk5IDk5IDlhLCBhbmQgaW4gbGl0dGxlIGVuZGlhbiBtb2RlIGlzCi0gICB0aGUgYnl0ZSBzZXF1ZW5jZSA5OSA5OSBmMSAzZiA5YSA5OSA5OSA5OS4KLQotICAgPz8/IFRoZSBmb3JtYXQgb2YgMTIgYnl0ZSBmbG9hdHMgaXMgdW5jZXJ0YWluIGFjY29yZGluZyB0byBnY2MncyBhcm0uaC4gICovCi0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgICB0eXBlOwotICAgICBjaGFyICogbGl0UDsKLSAgICAgaW50ICogIHNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKnNpemVQID0gcHJlYyAqIDI7Ci0KLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEZvciBhIDQgYnl0ZSBmbG9hdCB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaW4gYHdvcmRzJyBpcyAxIDAuICBGb3IgYW4KLQkgOCBieXRlIGZsb2F0IHRoZSBvcmRlciBpcyAxIDAgMyAyLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpICs9IDIpCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpICsgMV0sIDIpOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQICsgMiwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSA0OwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBrbm93bGVkZ2Ugb2YgdGhlIFBDJ3MgcGlwZWxpbmUgb2Zmc2V0IGlzIGJ1aWx0IGludG8gdGhlIGluc25zIHRoZW1zZWx2ZXMuICAqLyAKLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKiBmaXhQOwotewotICBpZiAoICAgZml4UC0+ZnhfYWRkc3kKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSA9PSB1bmRlZmluZWRfc2VjdGlvbgotICAgICAgJiYgZml4UC0+Znhfc3Vic3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChmaXhQLT5meF9wY3JlbCAmJiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fVEhVTUJfQUREKSkKLSAgICB7Ci0gICAgICAvKiBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nIG9uIHRoZSBUaHVtYiBpcyBzbGlnaHRseSBvZGQKLQkgYXMgdGhlIGJvdHRvbSB0d28gYml0cyBvZiB0aGUgUEMgYXJlIGZvcmNlZCB0byB6ZXJvCi0JIGZvciB0aGUgY2FsY3VsYXRpb24gKi8KLSAgICAgIHJldHVybiAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzKSAmIH4zOwotICAgIH0KLQotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1QgICBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIERvbid0IGFsaWduIHRoZSBkd2FyZjIgZGVidWcgc2VjdGlvbnMgKi8KLSAgaWYgKCFzdHJuY21wIChzZWdtZW50LT5uYW1lLCAiLmRlYnVnIiwgNSkpCi0gICAgcmV0dXJuIHNpemU7Ci0jZW5kaWYKLSAgLyogUm91bmQgYWxsIHNlY3RzIHRvIG11bHRpcGxlIG9mIDQgKi8KLSAgcmV0dXJuIChzaXplICsgMykgJiB+MzsKLX0KLQotLyogVW5kZXIgRUxGIHdlIG5lZWQgdG8gZGVmYXVsdCBfR0xPQkFMX09GRlNFVF9UQUJMRS4gIE90aGVyd2lzZSAKLSAgIHdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqIG5hbWU7Ci17Ci0jaWZkZWYgT0JKX0VMRgotICBpZiAobmFtZVswXSA9PSAnXycgJiYgbmFtZVsxXSA9PSAnRycKLSAgICAgICYmIHN0cmVxIChuYW1lLCBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUpKQotICAgIHsKLSAgICAgIGlmICghR09UX3N5bWJvbCkKLQl7Ci0JICBpZiAoc3ltYm9sX2ZpbmQgKG5hbWUpKQotCSAgICBhc19iYWQgKCJHT1QgYWxyZWFkeSBpbiB0aGUgc3ltYm9sIHRhYmxlIik7Ci0JICAKLQkgIEdPVF9zeW1ib2wgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwKLQkJCQkgICAodmFsdWVUKTAsICYgemVyb19hZGRyZXNzX2ZyYWcpOwotCX0KLSAgICAgIAotICAgICAgcmV0dXJuIEdPVF9zeW1ib2w7Ci0gICAgfQotI2VuZGlmCi0gIAotICByZXR1cm4gMDsKLX0KLQotLyogYXJtX3JlZ19wYXJzZSAoKSA6PSBpZiBpdCBsb29rcyBsaWtlIGEgcmVnaXN0ZXIsIHJldHVybiBpdHMgdG9rZW4gYW5kIAotICAgYWR2YW5jZSB0aGUgcG9pbnRlci4gKi8KLQotc3RhdGljIGludAotYXJtX3JlZ19wYXJzZSAoY2NwKQotICAgICByZWdpc3RlciBjaGFyICoqIGNjcDsKLXsKLSAgY2hhciAqIHN0YXJ0ID0gKiBjY3A7Ci0gIGNoYXIgICBjOwotICBjaGFyICogcDsKLSAgc3RydWN0IHJlZ19lbnRyeSAqIHJlZzsKLQotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotICBpZiAoKnN0YXJ0ICE9IFJFR0lTVEVSX1BSRUZJWCkKLSAgICByZXR1cm4gRkFJTDsKLSAgcCA9IHN0YXJ0ICsgMTsKLSNlbHNlCi0gIHAgPSBzdGFydDsKLSNpZmRlZiBPUFRJT05BTF9SRUdJU1RFUl9QUkVGSVgKLSAgaWYgKCpwID09IE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCkKLSAgICBwKyssIHN0YXJ0Kys7Ci0jZW5kaWYKLSNlbmRpZgotICBpZiAoIWlzYWxwaGEgKCpwKSB8fCAhaXNfbmFtZV9iZWdpbm5lciAoKnApKQotICAgIHJldHVybiBGQUlMOwotCi0gIGMgPSAqcCsrOwotICB3aGlsZSAoaXNhbHBoYSAoYykgfHwgaXNkaWdpdCAoYykgfHwgYyA9PSAnXycpCi0gICAgYyA9ICpwKys7Ci0KLSAgKi0tcCA9IDA7Ci0gIHJlZyA9IChzdHJ1Y3QgcmVnX2VudHJ5ICopIGhhc2hfZmluZCAoYXJtX3JlZ19oc2gsIHN0YXJ0KTsKLSAgKnAgPSBjOwotICAKLSAgaWYgKHJlZykKLSAgICB7Ci0gICAgICAqY2NwID0gcDsKLSAgICAgIHJldHVybiByZWctPm51bWJlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLXN0YXRpYyBpbnQKLWFybV9wc3JfcGFyc2UgKGNjcCkKLSAgICAgcmVnaXN0ZXIgY2hhciAqKiBjY3A7Ci17Ci0gIGNoYXIgKiBzdGFydCA9ICogY2NwOwotICBjaGFyICAgYzsKLSAgY2hhciAqIHA7Ci0gIENPTlNUIHN0cnVjdCBhc21fcHNyICogcHNyOwotCi0gIHAgPSBzdGFydDsKLSAgYyA9ICpwKys7Ci0gIHdoaWxlIChpc2FscGhhIChjKSB8fCBjID09ICdfJykKLSAgICBjID0gKnArKzsKLQotICAqLS1wID0gMDsgIAotICBwc3IgPSAoQ09OU1Qgc3RydWN0IGFzbV9wc3IgKikgaGFzaF9maW5kIChhcm1fcHNyX2hzaCwgc3RhcnQpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHBzcikKLSAgICB7Ci0gICAgICAqY2NwID0gcDsKLSAgICAgIHJldHVybiBwc3ItPm51bWJlcjsKLSAgICB9Ci0KLSAgcmV0dXJuIEZBSUw7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsLCBzZWcpCi0gICAgIGZpeFMgKiAgICAgIGZpeFA7Ci0gICAgIHZhbHVlVCAqICAgIHZhbDsKLSAgICAgc2VnVCAgICAgICAgc2VnOwotewotICBvZmZzZXRUICAgICAgICB2YWx1ZSA9ICogdmFsOwotICBvZmZzZXRUICAgICAgICBuZXd2YWw7Ci0gIHVuc2lnbmVkIGludCAgIG5ld2ltbTsKLSAgdW5zaWduZWQgbG9uZyAgdGVtcDsKLSAgaW50ICAgICAgICAgICAgc2lnbjsKLSAgY2hhciAqICAgICAgICAgYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBhcm1fZml4X2RhdGEgKiBhcm1fZGF0YSA9IChhcm1fZml4X2RhdGEgKikgZml4UC0+dGNfZml4X2RhdGE7Ci0KLSAgYXNzZXJ0IChmaXhQLT5meF9yX3R5cGUgPCBCRkRfUkVMT0NfVU5VU0VEKTsKLQotICAvKiBOb3RlIHdoZXRoZXIgdGhpcyB3aWxsIGRlbGV0ZSB0aGUgcmVsb2NhdGlvbi4gICovCi0jaWYgMCAvKiBwYXRjaCBmcm9tIFJFYXJuc2hhdyB0byBKRGF2aXMgKGRpc2FibGVkIGZvciB0aGUgbW9tZW50LCBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgZnVsbHkpICovCi0gIGlmICgoZml4UC0+ZnhfYWRkc3kgPT0gMCB8fCBzeW1ib2xfY29uc3RhbnRfcCAoZml4UC0+ZnhfYWRkc3kpKQotICAgICAgJiYgIWZpeFAtPmZ4X3BjcmVsKQotI2Vsc2UKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgIWZpeFAtPmZ4X3BjcmVsKQotI2VuZGlmCi0gICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0KLSAgLyogSWYgdGhpcyBzeW1ib2wgaXMgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbiB0aGVuIHdlIG5lZWQgdG8gbGVhdmUgaXQgZm9yCi0gICAgIHRoZSBsaW5rZXIgdG8gZGVhbCB3aXRoLiAgVW5mb3J0dW5hdGVseSwgbWRfcGNyZWxfZnJvbSBjYW4ndCB0ZWxsLAotICAgICBzbyB3ZSBoYXZlIHRvIHVuZG8gaXQncyBlZmZlY3RzIGhlcmUuICAqLwotICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnKQotCXsKLQkgIGlmICh0YXJnZXRfb2FiaQotCSAgICAgICYmIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCkKLQkgICAgdmFsdWUgPSAwOwotCSAgZWxzZQotCSAgICB2YWx1ZSArPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLQl9Ci0gICAgfQotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbHVlOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgZW1pdF9yZWxvYyAqLwotCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOgotICAgICAgbmV3aW1tID0gdmFsaWRhdGVfaW1tZWRpYXRlICh2YWx1ZSk7Ci0gICAgICB0ZW1wID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGZhaWwsIHNlZSBpZiB3ZSBjYW4gZml4IHRoaW5ncyB1cCBieQotCSBjaGFuZ2luZyB0aGUgb3Bjb2RlLiAgKi8KLSAgICAgIGlmIChuZXdpbW0gPT0gKHVuc2lnbmVkIGludCkgRkFJTAotCSAgJiYgKG5ld2ltbSA9IG5lZ2F0ZV9kYXRhX29wICgmdGVtcCwgdmFsdWUpKSA9PSAodW5zaWduZWQgaW50KSBGQUlMKQotCXsKLQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCV8oImludmFsaWQgY29uc3RhbnQgKCVseCkgYWZ0ZXIgZml4dXBcbiIpLAotCQkJKHVuc2lnbmVkIGxvbmcpIHZhbHVlKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbmV3aW1tIHw9ICh0ZW1wICYgMHhmZmZmZjAwMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgKHZhbHVlVCkgbmV3aW1tLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU06Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICgodmFsdWUgPSB2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMCkpID09IEZBSUwpCi0gICAgICAgIHsKLSAgICAgICAgICBhc19iYWQgKF8oImJhZCBpbW1lZGlhdGUgdmFsdWUgZm9yIG9mZnNldCAoJWxkKSIpLCAobG9uZykgdmFsdWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLXZhbHVlOwotCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG5ld3ZhbCAmPSAweGZmN2ZmMDAwOwotICAgICAgbmV3dmFsIHw9IHZhbHVlIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NODoKLSAgICAgY2FzZSBCRkRfUkVMT0NfQVJNX0hXTElURVJBTDoKLSAgICAgIHNpZ24gPSB2YWx1ZSA+PSAwOwotICAgICAgaWYgKCh2YWx1ZSA9IHZhbGlkYXRlX29mZnNldF9pbW0gKHZhbHVlLCAxKSkgPT0gRkFJTCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9IV0xJVEVSQUwpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQlfKCJpbnZhbGlkIGxpdGVyYWwgY29uc3RhbnQ6IHBvb2wgbmVlZHMgdG8gYmUgY2xvc2VyXG4iKSk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgYXNfYmFkIChfKCJiYWQgaW1tZWRpYXRlIHZhbHVlIGZvciBvZmZzZXQgKCVsZCkiKSwgKGxvbmcpIHZhbHVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLXZhbHVlOwotCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG5ld3ZhbCAmPSAweGZmN2ZmMGYwOwotICAgICAgbmV3dmFsIHw9ICgodmFsdWUgPj4gNCkgPDwgOCkgfCAodmFsdWUgJiAweGYpIHwgKHNpZ24gPyBJTkRFWF9VUCA6IDApOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0xJVEVSQUw6Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICh2YWx1ZSA8IDApCi0JdmFsdWUgPSAtdmFsdWU7Ci0KLSAgICAgIGlmICgodmFsdWUgPSB2YWxpZGF0ZV9vZmZzZXRfaW1tICh2YWx1ZSwgMCkpID09IEZBSUwpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCAKLQkJCV8oImludmFsaWQgbGl0ZXJhbCBjb25zdGFudDogcG9vbCBuZWVkcyB0byBiZSBjbG9zZXJcbiIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSk7Ci0gICAgICBuZXd2YWwgJj0gMHhmZjdmZjAwMDsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSB8IChzaWduID8gSU5ERVhfVVAgOiAwKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TSElGVF9JTU06Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDMyCi0JICB8fCAodmFsdWUgPT0gMzIgCi0JICAgICAgJiYgKCgobmV3dmFsICYgMHg2MCkgPT0gMCkgfHwgKG5ld3ZhbCAmIDB4NjApID09IDB4NjApKSkKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJzaGlmdCBleHByZXNzaW9uIGlzIHRvbyBsYXJnZSIpKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHZhbHVlID09IDApCi0JbmV3dmFsICY9IH4weDYwOwkvKiBTaGlmdHMgb2YgemVybyBtdXN0IGJlIGRvbmUgYXMgbHNsICovCi0gICAgICBlbHNlIGlmICh2YWx1ZSA9PSAzMikKLQl2YWx1ZSA9IDA7Ci0gICAgICBuZXd2YWwgJj0gMHhmZmZmZjA3ZjsKLSAgICAgIG5ld3ZhbCB8PSAodmFsdWUgJiAweDFmKSA8PCA3OwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9TV0k6Ci0gICAgICBpZiAoYXJtX2RhdGEtPnRodW1iX21vZGUpCi0JewotCSAgaWYgKCgodW5zaWduZWQgbG9uZykgdmFsdWUpID4gMHhmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIHN3aSBleHByZXNzaW9uIikpOwotCSAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIFRIVU1CX1NJWkUpICYgMHhmZjAwOwotCSAgbmV3dmFsIHw9IHZhbHVlOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCwgVEhVTUJfU0laRSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4MDBmZmZmZmYpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgCi0JCQkgIF8oIkludmFsaWQgc3dpIGV4cHJlc3Npb24iKSk7Ci0JICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKSAmIDB4ZmYwMDAwMDA7Ci0JICBuZXd2YWwgfD0gdmFsdWU7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9NVUxUSToKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIHZhbHVlKSA+IDB4ZmZmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkludmFsaWQgZXhwcmVzc2lvbiBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIikpOwotICAgICAgbmV3dmFsID0gdmFsdWUgfCBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwsIElOU05fU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QQ1JFTF9CUkFOQ0g6Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgSU5TTl9TSVpFKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGlmICghIHRhcmdldF9vYWJpKQotICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSNlbmRpZgotICAgICAgdmFsdWUgID0gKHZhbHVlID4+IDIpICYgMHgwMGZmZmZmZjsKLSAgICAgIHZhbHVlICA9ICh2YWx1ZSArIChuZXd2YWwgJiAweDAwZmZmZmZmKSkgJiAweDAwZmZmZmZmOwotICAgICAgbmV3dmFsID0gdmFsdWUgfCAobmV3dmFsICYgMHhmZjAwMDAwMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBJTlNOX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0g5OiAvKiBjb25kaXRpb25hbCBicmFuY2ggKi8KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIHsKLSAgICAgICAgYWRkcmVzc1QgZGlmZiA9IChuZXd2YWwgJiAweGZmKSA8PCAxOwotICAgICAgICBpZiAoZGlmZiAmIDB4MTAwKQotICAgICAgICAgZGlmZiB8PSB+MHhmZjsKLQotICAgICAgICB2YWx1ZSArPSBkaWZmOwotICAgICAgICBpZiAoKHZhbHVlICYgfjB4ZmYpICYmICgodmFsdWUgJiB+MHhmZikgIT0gfjB4ZmYpKQotICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotICAgICAgICBuZXd2YWwgPSAobmV3dmFsICYgMHhmZjAwKSB8ICgodmFsdWUgJiAweDFmZikgPj4gMSk7Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMTI6IC8qIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICB7Ci0gICAgICAgIGFkZHJlc3NUIGRpZmYgPSAobmV3dmFsICYgMHg3ZmYpIDw8IDE7Ci0gICAgICAgIGlmIChkaWZmICYgMHg4MDApCi0gICAgICAgICBkaWZmIHw9IH4weDdmZjsKLQotICAgICAgICB2YWx1ZSArPSBkaWZmOwotICAgICAgICBpZiAoKHZhbHVlICYgfjB4N2ZmKSAmJiAoKHZhbHVlICYgfjB4N2ZmKSAhPSB+MHg3ZmYpKQotICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICBfKCJCcmFuY2ggb3V0IG9mIHJhbmdlIikpOwotICAgICAgICBuZXd2YWwgPSAobmV3dmFsICYgMHhmODAwKSB8ICgodmFsdWUgJiAweGZmZikgPj4gMSk7Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjM6Ci0gICAgICB7Ci0gICAgICAgIG9mZnNldFQgbmV3dmFsMjsKLSAgICAgICAgYWRkcmVzc1QgZGlmZjsKLQotCW5ld3ZhbCAgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICAgIG5ld3ZhbDIgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiArIFRIVU1CX1NJWkUsIFRIVU1CX1NJWkUpOwotICAgICAgICBkaWZmID0gKChuZXd2YWwgJiAweDdmZikgPDwgMTIpIHwgKChuZXd2YWwyICYgMHg3ZmYpIDw8IDEpOwotICAgICAgICBpZiAoZGlmZiAmIDB4NDAwMDAwKQotCSAgZGlmZiB8PSB+MHgzZmZmZmY7Ci0gICAgICAgIHZhbHVlICs9IGRpZmY7Ci0gICAgICAgIGlmICgodmFsdWUgJiB+MHgzZmZmZmYpICYmICgodmFsdWUgJiB+MHgzZmZmZmYpICE9IH4weDNmZmZmZikpCi0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQlfKCJCcmFuY2ggd2l0aCBsaW5rIG91dCBvZiByYW5nZSIpKTsKLQotICAgICAgICBuZXd2YWwgID0gKG5ld3ZhbCAgJiAweGY4MDApIHwgKCh2YWx1ZSAmIDB4N2ZmZmZmKSA+PiAxMik7Ci0gICAgICAgIG5ld3ZhbDIgPSAobmV3dmFsMiAmIDB4ZjgwMCkgfCAoKHZhbHVlICYgMHhmZmYpID4+IDEpOwotICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYgKyBUSFVNQl9TSVpFLCBuZXd2YWwyLCBUSFVNQl9TSVpFKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICAgIGlmIChmaXhQLT5meF9kb25lIHx8IGZpeFAtPmZ4X3BjcmVsKQotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgMSk7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZWxzZSBpZiAoIXRhcmdldF9vYWJpKQotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAxKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDIpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1QzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UT0ZGOgotCW1kX251bWJlcl90b19jaGFycyAoYnVmLCAwLCA0KTsKLQlicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgaWYgKGZpeFAtPmZ4X2RvbmUgfHwgZml4UC0+ZnhfcGNyZWwpCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBlbHNlIGlmICghdGFyZ2V0X29hYmkpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWx1ZSA9IGZpeFAtPmZ4X29mZnNldDsKLSAgICAgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIDQpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QTFQzMjoKLSAgICAgIC8qIEl0IGFwcGVhcnMgdGhlIGluc3RydWN0aW9uIGlzIGZ1bGx5IHByZXBhcmVkIGF0IHRoaXMgcG9pbnQuICovCi0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0dPVFBDOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX0NQX09GRl9JTU06Ci0gICAgICBzaWduID0gdmFsdWUgPj0gMDsKLSAgICAgIGlmICh2YWx1ZSA8IC0xMDIzIHx8IHZhbHVlID4gMTAyMyB8fCAodmFsdWUgJiAzKSkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIklsbGVnYWwgdmFsdWUgZm9yIGNvLXByb2Nlc3NvciBvZmZzZXQiKSk7Ci0gICAgICBpZiAodmFsdWUgPCAwKQotCXZhbHVlID0gLXZhbHVlOwotICAgICAgbmV3dmFsID0gbWRfY2hhcnNfdG9fbnVtYmVyIChidWYsIElOU05fU0laRSkgJiAweGZmN2ZmZjAwOwotICAgICAgbmV3dmFsIHw9ICh2YWx1ZSA+PiAyKSB8IChzaWduID8gIElOREVYX1VQIDogMCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgSU5TTl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDoKLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIC8qIEV4YWN0bHkgd2hhdCByYW5nZXMsIGFuZCB3aGVyZSB0aGUgb2Zmc2V0IGlzIGluc2VydGVkIGRlcGVuZHMgb24KLQkgdGhlIHR5cGUgb2YgaW5zdHJ1Y3Rpb24sIHdlIGNhbiBlc3RhYmxpc2ggdGhpcyBmcm9tIHRoZSB0b3AgNCBiaXRzICovCi0gICAgICBzd2l0Y2ggKG5ld3ZhbCA+PiAxMikKLQl7Ci0JY2FzZSA0OiAvKiBQQyBsb2FkICovCi0JICAvKiBUaHVtYiBQQyBsb2FkcyBhcmUgc29tZXdoYXQgb2RkLCBiaXQgMSBvZiB0aGUgUEMgaXMKLQkgICAgIGZvcmNlZCB0byB6ZXJvIGZvciB0aGVzZSBsb2Fkcywgc28gd2Ugd2lsbCBuZWVkIHRvIHJvdW5kCi0JICAgICB1cCB0aGUgb2Zmc2V0IGlmIHRoZSBpbnN0cnVjdGlvbiBhZGRyZXNzIGlzIG5vdCB3b3JkCi0JICAgICBhbGlnbmVkIChzaW5jZSB0aGUgZmluYWwgYWRkcmVzcyBwcm9kdWNlZCBtdXN0IGJlLCBhbmQKLQkgICAgIHdlIGNhbiBvbmx5IGRlc2NyaWJlIHdvcmQtYWxpZ25lZCBpbW1lZGlhdGUgb2Zmc2V0cykuICAqLwotCi0JICBpZiAoKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIHZhbHVlKSAmIDMpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQsIHRhcmdldCBub3Qgd29yZCBhbGlnbmVkICgweCUwOFgpIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSArIHZhbHVlKSk7Ci0KLQkgIGlmICgodmFsdWUgKyAyKSAmIH4weDNmZSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCIpKTsKLQotICAgICAgICAgIC8qIFJvdW5kIHVwLCBzaW5jZSBwYyB3aWxsIGJlIHJvdW5kZWQgZG93bi4gICovCi0JICBuZXd2YWwgfD0gKHZhbHVlICsgMikgPj4gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA5OiAvKiBTUCBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgzZmMpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygiSW52YWxpZCBvZmZzZXQiKSk7Ci0JICBuZXd2YWwgfD0gdmFsdWUgPj4gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSA2OiAvKiBXb3JkIGxvYWQvc3RvcmUgKi8KLQkgIGlmICh2YWx1ZSAmIH4weDdjKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0IikpOwotCSAgbmV3dmFsIHw9IHZhbHVlIDw8IDQ7IC8qIDYgLSAyICovCi0JICBicmVhazsKLQotCWNhc2UgNzogLyogQnl0ZSBsb2FkL3N0b3JlICovCi0JICBpZiAodmFsdWUgJiB+MHgxZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJJbnZhbGlkIG9mZnNldCIpKTsKLQkgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA2OwotCSAgYnJlYWs7Ci0KLQljYXNlIDg6IC8qIEhhbGZ3b3JkIGxvYWQvc3RvcmUgKi8KLQkgIGlmICh2YWx1ZSAmIH4weDNlKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oIkludmFsaWQgb2Zmc2V0IikpOwotCSAgbmV3dmFsIHw9IHZhbHVlIDw8IDU7IC8qIDYgLSAxICovCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkiVW5hYmxlIHRvIHByb2Nlc3MgcmVsb2NhdGlvbiBmb3IgdGh1bWIgb3Bjb2RlOiAlbHgiLAotCQkJKHVuc2lnbmVkIGxvbmcpIG5ld3ZhbCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDoKLSAgICAgIC8qIFRoaXMgaXMgYSBjb21wbGljYXRlZCByZWxvY2F0aW9uLCBzaW5jZSB3ZSB1c2UgaXQgZm9yIGFsbCBvZgotICAgICAgICAgdGhlIGZvbGxvd2luZyBpbW1lZGlhdGUgcmVsb2NhdGlvbnM6Ci0gICAgICAgICAgICAzYml0IEFERC9TVUIKLSAgICAgICAgICAgIDhiaXQgQUREL1NVQgotICAgICAgICAgICAgOWJpdCBBREQvU1VCIFNQIHdvcmQtYWxpZ25lZAotICAgICAgICAgICAxMGJpdCBBREQgUEMvU1Agd29yZC1hbGlnbmVkCi0KLSAgICAgICAgIFRoZSB0eXBlIG9mIGluc3RydWN0aW9uIGJlaW5nIHByb2Nlc3NlZCBpcyBlbmNvZGVkIGluIHRoZQotICAgICAgICAgaW5zdHJ1Y3Rpb24gZmllbGQ6Ci0gICAgICAgICAgIDB4ODAwMCAgU1VCCi0gICAgICAgICAgIDB4MDBGMCAgUmQKLSAgICAgICAgICAgMHgwMDBGICBScwotICAgICAgKi8KLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKTsKLSAgICAgIHsKLSAgICAgICAgaW50IHJkID0gKG5ld3ZhbCA+PiA0KSAmIDB4ZjsKLSAgICAgICAgaW50IHJzID0gbmV3dmFsICYgMHhmOwotICAgICAgICBpbnQgc3VidHJhY3QgPSBuZXd2YWwgJiAweDgwMDA7Ci0KLSAgICAgICAgaWYgKHJkID09IFJFR19TUCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgJiB+MHgxZmMpCi0gICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIGltbWVkaWF0ZSBmb3Igc3RhY2sgYWRkcmVzcyBjYWxjdWxhdGlvbiIpKTsKLSAgICAgICAgICAgIG5ld3ZhbCA9IHN1YnRyYWN0ID8gVF9PUENPREVfU1VCX1NUIDogVF9PUENPREVfQUREX1NUOwotICAgICAgICAgICAgbmV3dmFsIHw9IHZhbHVlID4+IDI7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChycyA9PSBSRUdfUEMgfHwgcnMgPT0gUkVHX1NQKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdWJ0cmFjdCB8fAotICAgICAgICAgICAgICAgIHZhbHVlICYgfjB4M2ZjKQotICAgICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gKHZhbHVlID0gMHglMDhsWCkiKSwKLQkJCSAgICAodW5zaWduZWQgbG9uZykgdmFsdWUpOwotICAgICAgICAgICAgbmV3dmFsID0gKHJzID09IFJFR19QQyA/IFRfT1BDT0RFX0FERF9QQyA6IFRfT1BDT0RFX0FERF9TUCk7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gcmQgPDwgODsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSB2YWx1ZSA+PiAyOwotICAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocnMgPT0gcmQpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4ZmYpCi0gICAgICAgICAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfKCJJbnZhbGlkIDhiaXQgaW1tZWRpYXRlIikpOwotICAgICAgICAgICAgbmV3dmFsID0gc3VidHJhY3QgPyBUX09QQ09ERV9TVUJfSTggOiBUX09QQ09ERV9BRERfSTg7Ci0gICAgICAgICAgICBuZXd2YWwgfD0gKHJkIDw8IDgpIHwgdmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlICYgfjB4NykKLSAgICAgICAgICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgM2JpdCBpbW1lZGlhdGUiKSk7Ci0gICAgICAgICAgICBuZXd2YWwgPSBzdWJ0cmFjdCA/IFRfT1BDT0RFX1NVQl9JMyA6IFRfT1BDT0RFX0FERF9JMzsKLSAgICAgICAgICAgIG5ld3ZhbCB8PSByZCB8IChycyA8PCAzKSB8ICh2YWx1ZSA8PCA2KTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgbmV3dmFsICwgVEhVTUJfU0laRSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9JTU06Ci0gICAgICBuZXd2YWwgPSBtZF9jaGFyc190b19udW1iZXIgKGJ1ZiwgVEhVTUJfU0laRSk7Ci0gICAgICBzd2l0Y2ggKG5ld3ZhbCA+PiAxMSkKLSAgICAgICAgewotICAgICAgICBjYXNlIDB4MDQ6IC8qIDhiaXQgaW1tZWRpYXRlIE1PViAqLwotICAgICAgICBjYXNlIDB4MDU6IC8qIDhiaXQgaW1tZWRpYXRlIENNUCAqLwotICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAyNTUpCi0gICAgICAgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF8oIkludmFsaWQgaW1tZWRpYXRlOiAlbGQgaXMgdG9vIGxhcmdlIiksCi0JCQkgIChsb25nKSB2YWx1ZSk7Ci0gICAgICAgICAgbmV3dmFsIHw9IHZhbHVlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgIH0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCBuZXd2YWwgLCBUSFVNQl9TSVpFKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX1NISUZUOgotICAgICAgLyogNWJpdCBzaGlmdCB2YWx1ZSAoMC4uMzEpICovCi0gICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMzEpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJJbGxlZ2FsIFRodW1iIHNoaWZ0IHZhbHVlOiAlbGQiKSwgKGxvbmcpIHZhbHVlKTsKLSAgICAgIG5ld3ZhbCA9IG1kX2NoYXJzX3RvX251bWJlciAoYnVmLCBUSFVNQl9TSVpFKSAmIDB4ZjAzZjsKLSAgICAgIG5ld3ZhbCB8PSB2YWx1ZSA8PCA2OwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIG5ld3ZhbCAsIFRIVU1CX1NJWkUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTk9ORToKLSAgICBkZWZhdWx0OgotICAgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgXygiQmFkIHJlbG9jYXRpb24gZml4dXAgdHlwZSAoJWQpXG4iKSwgZml4UC0+Znhfcl90eXBlKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqIHNlY3Rpb247Ci0gICAgIGZpeFMgKiBmaXhwOwotewotICBhcmVsZW50ICogcmVsb2M7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlOwotCi0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAvKiBAQCBXaHkgZnhfYWRkbnVtYmVyIHNvbWV0aW1lcyBhbmQgZnhfb2Zmc2V0IG90aGVyIHRpbWVzPyAgKi8KLSNpZm5kZWYgT0JKX0VMRgotICBpZiAoZml4cC0+ZnhfcGNyZWwgPT0gMCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldCA9IHJlbG9jLT5hZGRyZXNzOwotI2Vsc2UgIC8qIE9CSl9FTEYgKi8KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSNlbmRpZgotCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICBicmVhazsKLQl9Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl7Ci0JICBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgY2FzZSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSDoKLSAgICBjYXNlIEJGRF9SRUxPQ19SVkE6ICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIOToKLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gxMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19USFVNQl9QQ1JFTF9CUkFOQ0gyMzoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fTElURVJBTDoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fSFdMSVRFUkFMOgotICAgICAgLyogSWYgdGhpcyBpcyBjYWxsZWQgdGhlbiB0aGUgYSBsaXRlcmFsIGhhcyBiZWVuIHJlZmVyZW5jZWQgYWNyb3NzCi0JIGEgc2VjdGlvbiBib3VuZHJ5IC0gcG9zc2libHkgZHVlIHRvIGFuIGltcGxpY2l0IGR1bXAgKi8KLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkxpdGVyYWwgcmVmZXJlbmNlZCBhY3Jvc3Mgc2VjdGlvbiBib3VuZHJ5IChJbXBsaWNpdCBkdW1wPykiKSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1RQQzoKLSAgICAgIGFzc2VydCAoZml4cC0+ZnhfcGNyZWwgIT0gMCk7Ci0gICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9HT1QzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DX0FSTV9QTFQzMjoKLSAgICAgICBjb2RlID0gZml4cC0+Znhfcl90eXBlOwotICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOgotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiSW50ZXJuYWxfcmVsb2NhdGlvbiAodHlwZSAlZCkgbm90IGZpeGVkIHVwIChJTU1FRElBVEUpIiksCi0JCSAgICBmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19BUk1fT0ZGU0VUX0lNTToKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oIkludGVybmFsX3JlbG9jYXRpb24gKHR5cGUgJWQpIG5vdCBmaXhlZCB1cCAoT0ZGU0VUX0lNTSkiKSwKLQkJICAgIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0JY2hhciAqIHR5cGU7Ci0Jc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JICB7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fSU1NRURJQVRFOiAgICB0eXBlID0gIklNTUVESUFURSI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX09GRlNFVF9JTU06ICAgdHlwZSA9ICJPRkZTRVRfSU1NIjsgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9PRkZTRVRfSU1NODogIHR5cGUgPSAiT0ZGU0VUX0lNTTgiOyAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fU0hJRlRfSU1NOiAgICB0eXBlID0gIlNISUZUX0lNTSI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1NXSTogICAgICAgICAgdHlwZSA9ICJTV0kiOyAgICAgICAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9NVUxUSTogICAgICAgIHR5cGUgPSAiTVVMVEkiOyAgICAgICAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fQ1BfT0ZGX0lNTTogICB0eXBlID0gIkNQX09GRl9JTU0iOyAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX0FERDogICAgdHlwZSA9ICJUSFVNQl9BREQiOyAgICBicmVhazsKLQkgIGNhc2UgQkZEX1JFTE9DX0FSTV9USFVNQl9TSElGVDogIHR5cGUgPSAiVEhVTUJfU0hJRlQiOyAgYnJlYWs7Ci0JICBjYXNlIEJGRF9SRUxPQ19BUk1fVEhVTUJfSU1NOiAgICB0eXBlID0gIlRIVU1CX0lNTSI7ICAgIGJyZWFrOwotCSAgY2FzZSBCRkRfUkVMT0NfQVJNX1RIVU1CX09GRlNFVDogdHlwZSA9ICJUSFVNQl9PRkZTRVQiOyBicmVhazsKLQkgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiPHVua25vd24+IjsgICAgYnJlYWs7Ci0JICB9Ci0JYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0ICglZCkiKSwKLQkJICAgICAgdHlwZSwgZml4cC0+ZnhfcGNyZWwpOwotCXJldHVybiBOVUxMOwotICAgICAgfQotICAgIH0KLQotI2lmZGVmIE9CSl9FTEYKLSBpZiAoY29kZSA9PSBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICAgJiYgR09UX3N5bWJvbAotICAgICAmJiBmaXhwLT5meF9hZGRzeSA9PSBHT1Rfc3ltYm9sKQotICAgewotICAgICBjb2RlID0gQkZEX1JFTE9DX0FSTV9HT1RQQzsKLSAgICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldCA9IHJlbG9jLT5hZGRyZXNzOwotICAgfQotI2VuZGlmCi0gICAKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotCi0gIGlmIChyZWxvYy0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJDYW4gbm90IHJlcHJlc2VudCAlcyByZWxvY2F0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiByZWxvYzsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ3R5cGUpCi0gICAgIGZyYWdTICogZnJhZ1A7Ci0gICAgIHNlZ1QgICAgc2VndHlwZTsKLXsKLSAgYXNfZmF0YWwgKF8oIm1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iKSk7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotb3V0cHV0X2luc3QgKHN0cikKLSAgICAgY2hhciAqIHN0cjsKLXsKLSAgY2hhciAqIHRvID0gTlVMTDsKLSAgICAKLSAgaWYgKGluc3QuZXJyb3IpCi0gICAgewotICAgICAgYXNfYmFkIChpbnN0LmVycm9yKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdG8gPSBmcmFnX21vcmUgKGluc3Quc2l6ZSk7Ci0gIGlmICh0aHVtYl9tb2RlICYmIChpbnN0LnNpemUgPiBUSFVNQl9TSVpFKSkKLSAgICB7Ci0gICAgICBhc3NlcnQgKGluc3Quc2l6ZSA9PSAoMiAqIFRIVU1CX1NJWkUpKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAodG8sIGluc3QuaW5zdHJ1Y3Rpb24gPj4gMTYsIFRIVU1CX1NJWkUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0byArIDIsIGluc3QuaW5zdHJ1Y3Rpb24sIFRIVU1CX1NJWkUpOwotICAgIH0KLSAgZWxzZQotICAgIG1kX251bWJlcl90b19jaGFycyAodG8sIGluc3QuaW5zdHJ1Y3Rpb24sIGluc3Quc2l6ZSk7Ci0KLSAgaWYgKGluc3QucmVsb2MudHlwZSAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICBmaXhfbmV3X2FybSAoZnJhZ19ub3csIHRvIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSBpbnN0LnNpemUsICYgaW5zdC5yZWxvYy5leHAsIGluc3QucmVsb2MucGNfcmVsLAotCQkgaW5zdC5yZWxvYy50eXBlKTsKLQotICByZXR1cm47Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGNoYXIgICBjOwotICBjaGFyICogcDsKLSAgY2hhciAqIHE7Ci0gIGNoYXIgKiBzdGFydDsKLQotICAvKiBBbGlnbiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIFRoaXMgbWF5IG5vdCBiZSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gYnV0IC4uLiAqLwotICAvKiBhcm1fYWxpZ24gKDIsIDApOyAqLwotICBsaXN0aW5nX3ByZXZfbGluZSAoKTsgLyogRGVmaW5lZCBpbiBsaXN0aW5nLmggKi8KLQotICAvKiBBbGlnbiB0aGUgcHJldmlvdXMgbGFiZWwgaWYgbmVlZGVkLiAgKi8KLSAgaWYgKGxhc3RfbGFiZWxfc2VlbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobGFzdF9sYWJlbF9zZWVuLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9WQUxVRSAobGFzdF9sYWJlbF9zZWVuLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotICAgICAgU19TRVRfU0VHTUVOVCAobGFzdF9sYWJlbF9zZWVuLCBub3dfc2VnKTsKLSAgICB9Ci0KLSAgbWVtc2V0ICgmaW5zdCwgJ1wwJywgc2l6ZW9mIChpbnN0KSk7Ci0gIGluc3QucmVsb2MudHlwZSA9IEJGRF9SRUxPQ19OT05FOwotCi0gIGlmICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsJCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGUgc3BhY2UgKi8KLSAgICAKLSAgLyogU2NhbiB1cCB0byB0aGUgZW5kIG9mIHRoZSBvcC1jb2RlLCB3aGljaCBtdXN0IGVuZCBpbiB3aGl0ZSBzcGFjZSBvcgotICAgICBlbmQgb2Ygc3RyaW5nLiAgKi8KLSAgZm9yIChzdGFydCA9IHAgPSBzdHI7ICpwICE9ICdcMCc7IHArKykKLSAgICBpZiAoKnAgPT0gJyAnKQotICAgICAgYnJlYWs7Ci0gICAgCi0gIGlmIChwID09IHN0cikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIk5vIG9wZXJhdG9yIC0tIHN0YXRlbWVudCBgJXMnXG4iKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHRodW1iX21vZGUpCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSAqb3Bjb2RlOwotCi0gICAgICBjID0gKnA7Ci0gICAgICAqcCA9ICdcMCc7Ci0gICAgICBvcGNvZGUgPSAoQ09OU1Qgc3RydWN0IHRodW1iX29wY29kZSAqKSBoYXNoX2ZpbmQgKGFybV90b3BzX2hzaCwgc3RyKTsKLSAgICAgICpwID0gYzsKLSAgICAgIGlmIChvcGNvZGUpCi0JewotCSAgaW5zdC5pbnN0cnVjdGlvbiA9IG9wY29kZS0+dmFsdWU7Ci0JICBpbnN0LnNpemUgPSBvcGNvZGUtPnNpemU7Ci0JICAoKm9wY29kZS0+cGFybXMpKHApOwotCSAgb3V0cHV0X2luc3QgKHN0YXJ0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IGFzbV9vcGNvZGUgKm9wY29kZTsKLQotICAgICAgaW5zdC5zaXplID0gSU5TTl9TSVpFOwotICAgICAgLyogcCBub3cgcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIG9wY29kZSwgcHJvYmFibHkgd2hpdGUgc3BhY2UsIGJ1dCB3ZQotCSBoYXZlIHRvIGJyZWFrIHRoZSBvcGNvZGUgdXAgaW4gY2FzZSBpdCBjb250YWlucyBjb25kaW9uYWxzIGFuZCBmbGFnczsKLQkga2VlcCB0cnlpbmcgd2l0aCBwcm9ncmVzc2l2ZWx5IHNtYWxsZXIgYmFzaWMgaW5zdHJ1Y3Rpb25zIHVudGlsIG9uZQotCSBtYXRjaGVzLCBvciB3ZSBydW4gb3V0IG9mIG9wY29kZS4gKi8KLSAgICAgIHEgPSAocCAtIHN0ciA+IExPTkdFU1RfSU5TVCkgPyBzdHIgKyBMT05HRVNUX0lOU1QgOiBwOwotICAgICAgZm9yICg7IHEgIT0gc3RyOyBxLS0pCi0JewotCSAgYyA9ICpxOwotCSAgKnEgPSAnXDAnOwotCSAgb3Bjb2RlID0gKENPTlNUIHN0cnVjdCBhc21fb3Bjb2RlICopIGhhc2hfZmluZCAoYXJtX29wc19oc2gsIHN0cik7Ci0JICAqcSA9IGM7Ci0JICBpZiAob3Bjb2RlICYmIG9wY29kZS0+dGVtcGxhdGUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdfYml0cyA9IDA7Ci0JICAgICAgY2hhciAqcjsKLQotCSAgICAgIC8qIENoZWNrIHRoYXQgdGhpcyBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgQ1BVICovCi0JICAgICAgaWYgKChvcGNvZGUtPnZhcmlhbnRzICYgY3B1X3ZhcmlhbnQpID09IDApCi0JCWdvdG8gdHJ5X3Nob3J0ZXI7Ci0KLQkgICAgICBpbnN0Lmluc3RydWN0aW9uID0gb3Bjb2RlLT52YWx1ZTsKLQkgICAgICBpZiAocSA9PSBwKQkJLyogSnVzdCBhIHNpbXBsZSBvcGNvZGUgKi8KLQkJewotCQkgIGlmIChvcGNvZGUtPmNvbXBfc3VmZml4ICE9IDApCi0JCSAgICBhc19iYWQgKF8oIk9wY29kZSBgJXMnIG11c3QgaGF2ZSBzdWZmaXggZnJvbSA8JXM+XG4iKSwgc3RyLAotCQkJICAgIG9wY29kZS0+Y29tcF9zdWZmaXgpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDT05EX0FMV0FZUzsKLQkJICAgICAgKCpvcGNvZGUtPnBhcm1zKShxLCAwKTsKLQkJICAgIH0KLQkJICBvdXRwdXRfaW5zdCAoc3RhcnQpOwotCQkgIHJldHVybjsKLQkJfQotCi0JICAgICAgLyogTm93IGNoZWNrIGZvciBhIGNvbmRpdGlvbmFsICovCi0JICAgICAgciA9IHE7Ci0JICAgICAgaWYgKHAgLSByID49IDIpCi0JCXsKLQkJICBDT05TVCBzdHJ1Y3QgYXNtX2NvbmQgKmNvbmQ7Ci0JCSAgY2hhciBkID0gKihyICsgMik7Ci0KLQkJICAqKHIgKyAyKSA9ICdcMCc7Ci0JCSAgY29uZCA9IChDT05TVCBzdHJ1Y3QgYXNtX2NvbmQgKikgaGFzaF9maW5kIChhcm1fY29uZF9oc2gsIHIpOwotCQkgICoociArIDIpID0gZDsKLQkJICBpZiAoY29uZCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNvbmQtPnZhbHVlID09IDB4ZjAwMDAwMDApCi0JCQlhc190c2t0c2sgKAotXygiV2FybmluZzogVXNlIG9mIHRoZSAnbnYnIGNvbmRpdGlvbmFsIGlzIGRlcHJlY2F0ZWRcbiIpKTsKLQotCQkgICAgICBpbnN0Lmluc3RydWN0aW9uIHw9IGNvbmQtPnZhbHVlOwotCQkgICAgICByICs9IDI7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgaW5zdC5pbnN0cnVjdGlvbiB8PSBDT05EX0FMV0FZUzsKLQkJfQotCSAgICAgIGVsc2UKLQkJaW5zdC5pbnN0cnVjdGlvbiB8PSBDT05EX0FMV0FZUzsKLQotCSAgICAgIC8qIGlmIHRoZXJlIGlzIGEgY29tcHVsc29yeSBzdWZmaXgsIGl0IHNob3VsZCBjb21lIGhlcmUsIGJlZm9yZQotCQkgYW55IG9wdGlvbmFsIGZsYWdzLiAqLwotCSAgICAgIGlmIChvcGNvZGUtPmNvbXBfc3VmZml4KQotCQl7Ci0JCSAgQ09OU1QgY2hhciAqcyA9IG9wY29kZS0+Y29tcF9zdWZmaXg7Ci0KLQkJICB3aGlsZSAoKnMpCi0JCSAgICB7Ci0JCSAgICAgIGluc3Quc3VmZml4Kys7Ci0JCSAgICAgIGlmICgqciA9PSAqcykKLQkJCWJyZWFrOwotCQkgICAgICBzKys7Ci0JCSAgICB9Ci0KLQkJICBpZiAoKnMgPT0gJ1wwJykKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIiksIHN0ciwKLQkJCSAgICAgIG9wY29kZS0+Y29tcF9zdWZmaXgpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0KLQkJICByKys7Ci0JCX0KLQotCSAgICAgIC8qIFRoZSByZW1haW5kZXIsIGlmIGFueSBzaG91bGQgbm93IGJlIGZsYWdzIGZvciB0aGUgaW5zdHJ1Y3Rpb247Ci0JCSBTY2FuIHRoZXNlIGNoZWNraW5nIGVhY2ggb25lIGZvdW5kIHdpdGggdGhlIG9wY29kZS4gICovCi0JICAgICAgaWYgKHIgIT0gcCkKLQkJewotCQkgIGNoYXIgZDsKLQkJICBDT05TVCBzdHJ1Y3QgYXNtX2ZsZyAqZmxhZyA9IG9wY29kZS0+ZmxhZ3M7Ci0KLQkJICBpZiAoZmxhZykKLQkJICAgIHsKLQkJICAgICAgaW50IGZsYWdubzsKLQotCQkgICAgICBkID0gKnA7Ci0JCSAgICAgICpwID0gJ1wwJzsKLQotCQkgICAgICBmb3IgKGZsYWdubyA9IDA7IGZsYWdbZmxhZ25vXS50ZW1wbGF0ZTsgZmxhZ25vKyspCi0JCQl7Ci0JCQkgIGlmIChzdHJlcSAociwgZmxhZ1tmbGFnbm9dLnRlbXBsYXRlKSkKLQkJCSAgICB7Ci0JCQkgICAgICBmbGFnX2JpdHMgfD0gZmxhZ1tmbGFnbm9dLnNldF9iaXRzOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgICpwID0gZDsKLQkJICAgICAgaWYgKCEgZmxhZ1tmbGFnbm9dLnRlbXBsYXRlKQotCQkJZ290byB0cnlfc2hvcnRlcjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBnb3RvIHRyeV9zaG9ydGVyOwotCQl9Ci0KLQkgICAgICAoKm9wY29kZS0+cGFybXMpIChwLCBmbGFnX2JpdHMpOwotCSAgICAgIG91dHB1dF9pbnN0IChzdGFydCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQl0cnlfc2hvcnRlcjoKLQkgIDsKLQl9Ci0gICAgfQotCi0gIC8qIEl0IHdhc24ndCBhbiBpbnN0cnVjdGlvbiwgYnV0IGl0IG1pZ2h0IGJlIGEgcmVnaXN0ZXIgYWxpYXMgb2YgdGhlIGZvcm0KLSAgICAgYWxpYXMgLnJlcSByZWcKLSAgICAgKi8KLSAgcSA9IHA7Ci0gIHdoaWxlICgqcSA9PSAnICcpCi0gICAgcSsrOwotCi0gIGMgPSAqcDsKLSAgKnAgPSAnXDAnOwotICAgIAotICBpZiAoKnEgJiYgIXN0cm5jbXAgKHEsICIucmVxICIsIDQpKQotICAgIHsKLSAgICAgIGludCAgICByZWc7Ci0gICAgICBjaGFyICogY29weV9vZl9zdHIgPSBzdHI7Ci0gICAgICBjaGFyICogcjsKLSAgICAgIAotICAgICAgcSArPSA0OwotICAgICAgd2hpbGUgKCpxID09ICcgJykKLQlxKys7Ci0KLSAgICAgIGZvciAociA9IHE7ICpyICE9ICdcMCc7IHIrKykKLQlpZiAoKnIgPT0gJyAnKQotCSAgYnJlYWs7Ci0gICAgICAKLSAgICAgIGlmIChyICE9IHEpCi0JewotCSAgaW50IHJlZ251bTsKLQkgIGNoYXIgZCA9ICpyOwotCi0JICAqciA9ICdcMCc7Ci0JICByZWdudW0gPSBhcm1fcmVnX3BhcnNlICgmIHEpOwotCSAgKnIgPSBkOwotCi0JICByZWcgPSBhcm1fcmVnX3BhcnNlICgmIHN0cik7Ci0JICAKLQkgIGlmIChyZWcgPT0gRkFJTCkKLQkgICAgewotCSAgICAgIGlmIChyZWdudW0gIT0gRkFJTCkKLQkJewotCQkgIGluc2VydF9yZWdfYWxpYXMgKHN0ciwgcmVnbnVtKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX3dhcm4gKF8oInJlZ2lzdGVyICclcycgZG9lcyBub3QgZXhpc3RcbiIpLCBxKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChyZWdudW0gIT0gRkFJTCkKLQkgICAgewotCSAgICAgIGlmIChyZWcgIT0gcmVnbnVtKQotCQlhc193YXJuIChfKCJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyIpLCBjb3B5X29mX3N0ciApOwotCSAgICAgIAotCSAgICAgIC8qIERvIG5vdCB3YXJuIGFicG91dCByZWRlZmluaXRpb25zIHRvIHRoZSBzYW1lIGFsaWFzLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICBhc193YXJuIChfKCJpZ25vcmluZyByZWRlZmluaXRpb24gb2YgcmVnaXN0ZXIgYWxpYXMgJyVzJyB0byBub24tZXhpc3RhbnQgcmVnaXN0ZXIgJyVzJyIpLAotCQkgICAgIGNvcHlfb2Zfc3RyLCBxKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfd2FybiAoXygiaWdub3JpbmcgaW5jb21wbGV0ZSAucmVxIHBzZXVzbyBvcCIpKTsKLSAgICAgIAotICAgICAgKnAgPSBjOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqcCA9IGM7Ci0gIGFzX2JhZCAoXygiYmFkIGluc3RydWN0aW9uIGAlcyciKSwgc3RhcnQpOwotfQotCi0vKgotICogbWRfcGFyc2Vfb3B0aW9uCi0gKiAgICBJbnZvY2F0aW9uIGxpbmUgaW5jbHVkZXMgYSBzd2l0Y2ggbm90IHJlY29nbml6ZWQgYnkgdGhlIGJhc2UgYXNzZW1ibGVyLgotICogICAgU2VlIGlmIGl0J3MgYSBwcm9jZXNzb3Itc3BlY2lmaWMgb3B0aW9uLiAgVGhlc2UgYXJlOgotICogICAgQ3B1IHZhcmlhbnRzLCB0aGUgYXJtIHBhcnQgaXMgb3B0aW9uYWw6Ci0gKiAgICAgICAgICAgIC1tW2FybV0xICAgICAgICAgICAgICAgIEN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgotICogICAgICAgICAgICAtbVthcm1dMiwgLW1bYXJtXTI1MCAgICBBcm0gMiBhbmQgQXJtIDI1MCBwcm9jZXNzb3IKLSAqICAgICAgICAgICAgLW1bYXJtXTMgICAgICAgICAgICAgICAgQXJtIDMgcHJvY2Vzc29yCi0gKiAgICAgICAgICAgIC1tW2FybV02W3h4XSwgICAgICAgICAgIEFybSA2IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1bYXJtXTdbeHhdW3RdW1tkXW1dICAgQXJtIDcgcHJvY2Vzc29ycwotICogICAgICAgICAgICAtbThbMTBdICAgICAgICAgICAgICAgICBBcm0gOCBwcm9jZXNzb3JzCi0gKiAgICAgICAgICAgIC1tOVsyMF1bdGRtaV0gICAgICAgICAgIEFybSA5IHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1zdHJvbmdhcm1bMTEwWzBdXSAgICAgU3Ryb25nQVJNIHByb2Nlc3NvcnMKLSAqICAgICAgICAgICAgLW1hbGwgICAgICAgICAgICAgICAgICAgQWxsIChleGNlcHQgdGhlIEFSTTEpCi0gKiAgICBGUCB2YXJpYW50czoKLSAqICAgICAgICAgICAgLW1mcGExMCwgLW1mcGExMSAgICAgICAgRlBBMTAgYW5kIDExIGNvLXByb2Nlc3NvciBpbnN0cnVjdGlvbnMKLSAqICAgICAgICAgICAgLW1mcGUtb2xkICAgICAgICAgICAgICAgKE5vIGZsb2F0IGxvYWQvc3RvcmUgbXVsdGlwbGVzKQotICogICAgICAgICAgICAtbW5vLWZwdSAgICAgICAgICAgICAgICBEaXNhYmxlIGFsbCBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKLSAqICAgIFJ1bi10aW1lIGVuZGlhbiBzZWxlY3Rpb246Ci0gKiAgICAgICAgICAgIC1FQiAgICAgICAgICAgICAgICAgICAgIGJpZyBlbmRpYW4gY3B1Ci0gKiAgICAgICAgICAgIC1FTCAgICAgICAgICAgICAgICAgICAgIGxpdHRsZSBlbmRpYW4gY3B1Ci0gKiAgICBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQ6Ci0gKgkgICAgICAtbWFwY3MtMzIJCSAgICAgIDMyIGJpdCBBUENTCi0gKgkgICAgICAtbWFwY3MtMjYJCSAgICAgIDI2IGJpdCBBUENTCi0gKgkgICAgICAtbWFwY3MtZmxvYXQJICAgICAgUGFzcyBmbG9hdHMgaW4gZmxvYXQgcmVncwotICoJICAgICAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgUG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZQotICogICAgICAgICAgICAtbXRodW1iLWludGVyd29yayAgICAgICBDb2RlIHN1cHBvcnRzIEFybS9UaHVtYiBpbnRlcndvcmtpbmcKLSAqICAgICAgICAgICAgLW1vYWJpICAgICAgICAgICAgICAgICAgT2xkIEVMRiBBQkkKLSAqLwotCi1DT05TVCBjaGFyICogbWRfc2hvcnRvcHRzID0gIm06ayI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotI2lmZGVmIEFSTV9CSV9FTkRJQU4KLSNkZWZpbmUgT1BUSU9OX0VCIChPUFRJT05fTURfQkFTRSArIDApCi0gIHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSNkZWZpbmUgT1BUSU9OX0VMIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIE9QVElPTl9PQUJJIChPUFRJT05fTURfQkFTRSArMikKLSAgeyJvYWJpIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9PQUJJfSwKLSNlbmRpZgotI2VuZGlmCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgICAgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgY2hhciAqIHN0ciA9IGFyZzsKLQotICBzd2l0Y2ggKGMpCi0gICAgewotI2lmZGVmIEFSTV9CSV9FTkRJQU4KLSAgICBjYXNlIE9QVElPTl9FQjoKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VMOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGNhc2UgJ20nOgotICAgICAgc3dpdGNoICgqc3RyKQotCXsKLQljYXNlICdmJzoKLQkgIGlmIChzdHJlcSAoc3RyLCAiZnBhMTAiKSkKLQkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfRlBBMTA7Ci0JICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZnBhMTEiKSkKLQkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+RlBVX0FMTCkgfCBGUFVfRlBBMTE7Ci0JICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZnBlLW9sZCIpKQotCSAgICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5GUFVfQUxMKSB8IEZQVV9DT1JFOwotCSAgZWxzZQotCSAgICBnb3RvIGJhZDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbic6Ci0JICBpZiAoc3RyZXEgKHN0ciwgIm5vLWZwdSIpKQotCSAgICBjcHVfdmFyaWFudCAmPSB+RlBVX0FMTDsKLQkgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgICBjYXNlICdvJzoKLSAgICAgICAgICBpZiAoc3RyZXEgKHN0ciwgIm9hYmkiKSkKLSAgICAgICAgICAgIHRhcmdldF9vYWJpID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSNlbmRpZgotCSAgCi0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgIC8qIExpbWl0IGFzc2VtYmxlciB0byBnZW5lcmF0aW5nIG9ubHkgVGh1bWIgaW5zdHJ1Y3Rpb25zOiAqLwotICAgICAgICAgIGlmIChzdHJlcSAoc3RyLCAidGh1bWIiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fVEhVTUI7Ci0gICAgICAgICAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkZQVV9BTEwpIHwgRlBVX05PTkU7Ci0gICAgICAgICAgICAgIHRodW1iX21vZGUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICJ0aHVtYi1pbnRlcndvcmsiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fVEhVTUIgfCBBUk1fQVJDSHY0OwotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gICAgICAgICAgICAgIHN1cHBvcnRfaW50ZXJ3b3JrID0gdHJ1ZTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLQkgICAgZ290byBiYWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKHN0cmVxIChzdHIsICJhbGwiKSkKLQkgICAgewotCSAgICAgIGNwdV92YXJpYW50ID0gQVJNX0FMTCB8IEZQVV9BTEw7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIH0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotCSAgaWYgKCEgc3RybmNtcCAoc3RyLCAiYXBjcy0iLCA1KSkKLQkgICAgewotCSAgICAgIC8qIEdDQyBwYXNzZXMgb24gYWxsIGNvbW1hbmQgbGluZSBvcHRpb25zIHN0YXJ0aW5nICItbWFwY3MtLi4uIgotCQkgdG8gdXMsIHNvIHdlIG11c3QgcGFyc2UgdGhlbSBoZXJlLiAgKi8KLQotCSAgICAgIHN0ciArPSA1OwotCSAgICAgIAotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMzIiKSkKLQkJewotCQkgIHVzZXNfYXBjc18yNiA9IGZhbHNlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgIjI2IikpCi0JCXsKLQkJICB1c2VzX2FwY3NfMjYgPSB0cnVlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RyZXEgKHN0ciwgImZyYW1lIikpCi0JCXsKLQkJICAvKiBTdGFjayBmcmFtZXMgYXJlIGJlaW5nIGdlbmVyYXRlZCAtIGRvZXMgbm90IGFmZmVjdAotCQkgICAgIGxpbmthZ2Ugb2YgY29kZS4gICovCi0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAic3RhY2stY2hlY2siKSkKLQkJewotCQkgIC8qIFN0YWNrIGNoZWNraW5nIGlzIGJlaW5nIHBlcmZvcm1lZCAtIGRvZXMgbm90IGFmZmVjdAotCQkgICAgIGxpbmthZ2UsIGJ1dCBkb2VzIHJlcXVpcmUgdGhhdCB0aGUgZnVuY3Rpb25zCi0JCSAgICAgX19ydF9zdGtvdmZfc3BsaXRfc21hbGwgYW5kIF9fcnRfc3Rrb3ZmX3NwbGl0X2JpZyBiZQotCQkgICAgIHByZXNlbnQgaW4gdGhlIGZpbmFsIGxpbmsuICAqLwotCi0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiZmxvYXQiKSkKLQkJewotCQkgIC8qIEZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBhcmUgYmVpbmcgcGFzc2VkIGluIHRoZSBmbG9hdGluZwotCQkgICAgIHBvaW50IHJlZ2lzdGVycy4gIFRoaXMgZG9lcyBhZmZlY3QgbGlua2luZywgc2luY2UgdGhpcwotCQkgICAgIHZlcnNpb24gb2YgdGhlIEFQQ1MgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHZlcnNpb24gdGhhdAotCQkgICAgIHBhc3NlcyBmbG9hdGluZyBwb2ludHMgaW4gdGhlIGludGVnZXIgcmVnaXN0ZXJzLiAgKi8KLQotCQkgIHVzZXNfYXBjc19mbG9hdCA9IHRydWU7Ci0JCSAgcmV0dXJuIDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAicmVlbnRyYW50IikpCi0JCXsKLQkJICAvKiBSZWVudHJhbnQgY29kZSBoYXMgYmVlbiBnZW5lcmF0ZWQuICBUaGlzIGRvZXMgYWZmZWN0Ci0JCSAgICAgbGlua2luZywgc2luY2UgdGhlcmUgaXMgbm8gcG9pbnQgaW4gbGlua2luZyByZWVudHJhbnQvCi0JCSAgICAgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSB3aXRoIGFic29sdXRlIHBvc2l0aW9uIGNvZGUuICovCi0JCSAgcGljX2NvZGUgPSB0cnVlOwotCQkgIHJldHVybiAxOwotCQl9Ci0JICAgICAgCi0JICAgICAgYXNfYmFkIChfKCJVbnJlY29nbmlzZWQgQVBDUyBzd2l0Y2ggLW0lcyIpLCBhcmcpOwotCSAgICAgIHJldHVybiAwOwotICAJICAgIH0KLSNlbmRpZgotCSAgLyogU3RyaXAgb2ZmIG9wdGlvbmFsICJhcm0iICovCi0JICBpZiAoISBzdHJuY21wIChzdHIsICJhcm0iLCAzKSkKLQkgICAgc3RyICs9IDM7Ci0KLQkgIHN3aXRjaCAoKnN0cikKLQkgICAgewotCSAgICBjYXNlICcxJzoKLQkgICAgICBpZiAoc3RyZXEgKHN0ciwgIjEiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMTsKLQkgICAgICBlbHNlCi0JCWdvdG8gYmFkOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJzInOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiMiIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV8yOwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICIyNTAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMjUwOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMyc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICIzIikpCi0JCWNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzM7Ci0JICAgICAgZWxzZQotCQlnb3RvIGJhZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc2JzoKLQkgICAgICBzd2l0Y2ggKHN0cnRvbCAoc3RyLCBOVUxMLCAxMCkpCi0JCXsKLQkJY2FzZSA2OgotCQljYXNlIDYwOgotCQljYXNlIDYwMDoKLQkJY2FzZSA2MTA6Ci0JCWNhc2UgNjIwOgotCQkgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzY7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgZ290byBiYWQ7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICc3JzoKLQkgICAgICBzd2l0Y2ggKHN0cnRvbCAoc3RyLCAmIHN0ciwgMTApKQkvKiBFYXQgdGhlIHByb2Nlc3NvciBuYW1lICovCi0JCXsKLQkJY2FzZSA3OgotCQljYXNlIDcwOgotCQljYXNlIDcwMDoKLQkJY2FzZSA3MTA6Ci0JCWNhc2UgNzEwMDoKLQkJY2FzZSA3NTAwOgotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGdvdG8gYmFkOwotCQl9Ci0gICAgICAgICAgICAgIGNwdV92YXJpYW50ID0gKGNwdV92YXJpYW50ICYgfkFSTV9BTlkpIHwgQVJNXzc7Ci0gICAgICAgICAgICAgIGZvciAoOyAqc3RyOyBzdHIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICgqIHN0cikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICBjcHVfdmFyaWFudCB8PSAoQVJNX1RIVU1CIHwgQVJNX0FSQ0h2NCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgICAgICAgY3B1X3ZhcmlhbnQgfD0gQVJNX0xPTkdNVUw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZic6IC8qIGZlID0+IGZwIGVuYWJsZWQgY3B1LiAgKi8KLQkJICAgIGlmIChzdHJbMV0gPT0gJ2UnKQotCQkgICAgICArKyBzdHI7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGdvdG8gYmFkOwotCQkgICAgCi0JCSAgY2FzZSAnYyc6IC8qIExlZnQgb3ZlciBmcm9tIDcxMGMgcHJvY2Vzc29yIG5hbWUuICAqLwotICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6IC8qIERlYnVnICovCi0gICAgICAgICAgICAgICAgICBjYXNlICdpJzogLyogRW1iZWRkZWQgSUNFICovCi0gICAgICAgICAgICAgICAgICAgIC8qIEluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MgaW4gQVJNIHByb2Nlc3NvciBuYW1pbmcuICovCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBnb3RvIGJhZDsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnOCc6Ci0JICAgICAgaWYgKHN0cmVxIChzdHIsICI4IikgfHwgc3RyZXEgKHN0ciwgIjgxMCIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV84IHwgQVJNX0FSQ0h2NCB8IEFSTV9MT05HTVVMOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgJzknOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAiOSIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV85IHwgQVJNX0FSQ0h2NCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICI5MjAiKSkKLQkJY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fOSB8IEFSTV9BUkNIdjQgfCBBUk1fTE9OR01VTDsKLQkgICAgICBlbHNlIGlmIChzdHJlcSAoc3RyLCAiOTIwdCIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV85IHwgQVJNX0FSQ0h2NCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UgaWYgKHN0cmVxIChzdHIsICI5dGRtaSIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV85IHwgQVJNX0FSQ0h2NCB8IEFSTV9MT05HTVVMIHwgQVJNX1RIVU1COwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgJ3MnOgotCSAgICAgIGlmIChzdHJlcSAoc3RyLCAic3Ryb25nYXJtIikKLQkJICB8fCBzdHJlcSAoc3RyLCAic3Ryb25nYXJtMTEwIikKLQkJICB8fCBzdHJlcSAoc3RyLCAic3Ryb25nYXJtMTEwMCIpKQotCQljcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV84IHwgQVJNX0FSQ0h2NCB8IEFSTV9MT05HTVVMOwotCSAgICAgIGVsc2UKLQkJZ290byBiYWQ7Ci0JICAgICAgYnJlYWs7Ci0JCQotCSAgICBjYXNlICd2JzoKLQkgICAgICAvKiBTZWxlY3QgdmFyaWFudCBiYXNlZCBvbiBhcmNoaXRlY3R1cmUgcmF0aGVyIHRoYW4gcHJvY2Vzc29yICovCi0JICAgICAgc3dpdGNoICgqKytzdHIpCi0JCXsKLQkJY2FzZSAnMic6Ci0JCSAgc3dpdGNoICgqKytzdHIpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdhJzogY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMzsgYnJlYWs7Ci0JCSAgICBjYXNlIDA6ICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fMjsgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OiAgYXNfYmFkIChfKCJJbnZhbGlkIGFyY2hpdGVjdHVyZSB2YXJpYW50IC1tJXMiKSwgYXJnKTsgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCSAgCi0JCWNhc2UgJzMnOgotCQkgICAgY3B1X3ZhcmlhbnQgPSAoY3B1X3ZhcmlhbnQgJiB+QVJNX0FOWSkgfCBBUk1fNzsKLSAgICAgICAgICAgICAgICAgICAgCi0JCSAgc3dpdGNoICgqKytzdHIpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdtJzogY3B1X3ZhcmlhbnQgfD0gQVJNX0xPTkdNVUw7IGJyZWFrOwotCQkgICAgY2FzZSAwOiAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDogIGFzX2JhZCAoXygiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIiksIGFyZyk7IGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQkgIAotCQljYXNlICc0JzoKLQkJICBjcHVfdmFyaWFudCA9IChjcHVfdmFyaWFudCAmIH5BUk1fQU5ZKSB8IEFSTV9BUkNIdjQ7Ci0JCSAgCi0JCSAgc3dpdGNoICgqKytzdHIpCi0JCSAgICB7Ci0JCSAgICBjYXNlICd0JzogY3B1X3ZhcmlhbnQgfD0gQVJNX1RIVU1COyBicmVhazsKLQkJICAgIGNhc2UgMDogICBicmVhazsKLQkJICAgIGRlZmF1bHQ6ICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOyBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJICAKLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIkludmFsaWQgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgLW0lcyIpLCBhcmcpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGRlZmF1bHQ6Ci0JICAgIGJhZDoKLQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgcHJvY2Vzc29yIHZhcmlhbnQgLW0lcyIpLCBhcmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgIHBpY19jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKGZwKQotICAgICBGSUxFICogZnA7Ci17Ci0gIGZwcmludGYgKGZwLAotXygiXAotIEFSTSBTcGVjaWZpYyBBc3NlbWJsZXIgT3B0aW9uczpcblwKLSAgLW1bYXJtXVs8cHJvY2Vzc29yIG5hbWU+XSBzZWxlY3QgcHJvY2Vzc29yIHZhcmlhbnRcblwKLSAgLW1bYXJtXXZbMnwyYXwzfDNtfDR8NHRdICBzZWxlY3QgYXJjaGl0ZWN0dXJlIHZhcmlhbnRcblwKLSAgLW10aHVtYiAgICAgICAgICAgICAgICAgICBvbmx5IGFsbG93IFRodW1iIGluc3RydWN0aW9uc1xuXAotICAtbXRodW1iLWludGVyd29yayAgICAgICAgIG1hcmsgdGhlIGFzc2VtYmxlZCBjb2RlIGFzIHN1cHBvcnRpbmcgaW50ZXJ3b3JraW5nXG5cCi0gIC1tYWxsICAgICAgICAgICAgICAgICAgICAgYWxsb3cgYW55IGluc3RydWN0aW9uXG5cCi0gIC1tZnBhMTAsIC1tZnBhMTEgICAgICAgICAgc2VsZWN0IGZsb2F0aW5nIHBvaW50IGFyY2hpdGVjdHVyZVxuXAotICAtbWZwZS1vbGQgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGZsb2F0aW5nLXBvaW50IG11bHRpcGxlIGluc3RydWN0aW9uc1xuXAotICAtbW5vLWZwdSAgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGFueSBmbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMuXG4iKSk7Ci0gIGZwcmludGYgKGZwLAotXygiXAotICAtayAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIFBJQyBjb2RlLlxuIikpOwotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIGZwcmludGYgKGZwLAotXygiXAotICAtbWFwY3MtMzIsIC1tYXBjcy0yNiAgICAgIHNwZWNpZnkgd2hpY2ggQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIHRvIHVzZVxuIikpOwotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLW1hcGNzLWZsb2F0ICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCBhcmdzIGFyZSBwYXNzZWQgaW4gRlAgcmVnc1xuIikpOwotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgICB0aGUgY29kZSBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudC9yZWVudHJhbnRcbiIpKTsKLSAgI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLW1vYWJpICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvbGQgRUxGIEFCSVxuIikpOwotI2VuZGlmCi0jaWZkZWYgQVJNX0JJX0VORElBTgotICBmcHJpbnRmIChmcCwKLV8oIlwKLSAgLUVCICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gY3B1XG5cCi0gIC1FTCAgICAgICAgICAgICAgICAgICAgICAgYXNzZW1ibGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIGNwdVxuIikpOwotI2VuZGlmCi19Ci0KLS8qIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBmaXggdXAgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGluIHNvbWUgc3RhdGVtZW50cy4KLSAgIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHN5bWJvbHMgdGhhdCBhcmUgYW4gYXJiaXRyYXJ5IGRpc3RhbmNlIGZyb20KLSAgIHRoZSBwYy4gIFRoZSBtb3N0IGNvbW1vbiBjYXNlcyBhcmUgb2YgdGhlIGZvcm0gKCgrLy1zeW0gLS8rIC4gLSA4KSAmIG1hc2spLAotICAgd2hpY2ggcmV0dXJucyBwYXJ0IG9mIGFuIGFkZHJlc3MgaW4gYSBmb3JtIHdoaWNoIHdpbGwgYmUgdmFsaWQgZm9yCi0gICBhIGRhdGEgaW5zdHJ1Y3Rpb24uICBXZSBkbyB0aGlzIGJ5IHB1c2hpbmcgdGhlIGV4cHJlc3Npb24gaW50byBhIHN5bWJvbAotICAgaW4gdGhlIGV4cHJfc2VjdGlvbiwgYW5kIGNyZWF0aW5nIGEgZml4IGZvciB0aGF0LiAgKi8KLQotc3RhdGljIHZvaWQKLWZpeF9uZXdfYXJtIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY19yZWwsIHJlbG9jKQotICAgICBmcmFnUyAqICAgICAgIGZyYWc7Ci0gICAgIGludCAgICAgICAgICAgd2hlcmU7Ci0gICAgIHNob3J0IGludCAgICAgc2l6ZTsKLSAgICAgZXhwcmVzc2lvblMgKiBleHA7Ci0gICAgIGludCAgICAgICAgICAgcGNfcmVsOwotICAgICBpbnQgICAgICAgICAgIHJlbG9jOwotewotICBmaXhTICogICAgICAgICBuZXdfZml4OwotICBhcm1fZml4X2RhdGEgKiBhcm1fZGF0YTsKLQotICBzd2l0Y2ggKGV4cC0+WF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgY2FzZSBPX2FkZDoKLSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0gICAgICBuZXdfZml4ID0gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjX3JlbCwgcmVsb2MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgbmV3X2ZpeCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBtYWtlX2V4cHJfc3ltYm9sIChleHApLCAwLAotCQkJIHBjX3JlbCwgcmVsb2MpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIE1hcmsgd2hldGhlciB0aGUgZml4IGlzIHRvIGEgVEhVTUIgaW5zdHJ1Y3Rpb24sIG9yIGFuIEFSTSBpbnN0cnVjdGlvbiAqLwotICBhcm1fZGF0YSA9IChhcm1fZml4X2RhdGEgKikgb2JzdGFja19hbGxvYyAoJiBub3Rlcywgc2l6ZW9mIChhcm1fZml4X2RhdGEpKTsKLSAgbmV3X2ZpeC0+dGNfZml4X2RhdGEgPSAoUFRSKSBhcm1fZGF0YTsKLSAgYXJtX2RhdGEtPnRodW1iX21vZGUgPSB0aHVtYl9tb2RlOwotCi0gIHJldHVybjsKLX0KLQotCi0vKgotICogVGhpcyBmaXhfbmV3IGlzIGNhbGxlZCBieSBjb25zIHZpYSBUQ19DT05TX0ZJWF9ORVcKLSAqCi0gKiBXZSBjaGVjayB0aGUgZXhwcmVzc2lvbiB0byBzZWUgaWYgaXQgaXMgb2YgdGhlIGZvcm0KLSAqICBfX0dMT0JBTF9PRkZTRVRfVEFCTEUgKyA/Pz8KLSAqIElmIGl0IGlzIHRoZW4gdGhpcyBpcyBhIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSB0byB0aGUgR09ULgotICogaS5lLgotICogCWxkcglzbCwgTDEKLSAqIAlhZGQJc2wsIHBjLCBzbAotICogTDI6Ci0gKiAJLi4uCi0gKiBMMToKLSAqCS53b3JkCV9fR0xPQkFMX09GRlNFVF9UQUJMRSArICguIC0gKEwyICsgNCkpCi0gKgotICogSW4gdGhpcyBjYXNlIHVzZSBhIHJlbG9jIHR5cGUgQkZEX1JFTE9DX0FSTV9HT1RQQyBpbnN0ZWFkIG9mIHRoZQotICogbm9ybWFsIEJGRF9SRUxPQ197MTYsMzIsNjR9Ci0gKi8KLQotdm9pZAotY29uc19maXhfbmV3X2FybSAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCkKLSAgICAgZnJhZ1MgKiAgICAgICBmcmFnOwotICAgICBpbnQgICAgICAgICAgIHdoZXJlOwotICAgICBpbnQgICAgICAgICAgIHNpemU7Ci0gICAgIGV4cHJlc3Npb25TICogZXhwOwotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgdHlwZTsKLSAgaW50IHBjcmVsID0gMDsKLSAgCi0gIC8qIFBpY2sgYSByZWxvYyAuLi4KLSAgICoKLSAgICogQEAgU2hvdWxkIGxvb2sgYXQgQ1BVIHdvcmQgc2l6ZS4KLSAgICovCi0gIHN3aXRjaCAoc2l6ZSkgCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIHR5cGUgPSBCRkRfUkVMT0NfMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHR5cGUgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICB0eXBlID0gQkZEX1JFTE9DXzY0OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgLyogTG9vayBmb3IgcG9zc2libGUgR09UUEMgcmVsb2MgKi8KLSAgCi0gIC8qCi0gICAqIExvb2sgZm9yIHBpYyBhc3NlbWJsZXIgYW5kICd1bmRlZiBzeW1ib2wgKyBleHByIHN5bWJvbCcgZXhwcmVzc2lvbgotICAgKiBhbmQgYSAzMiBiaXQgc2l6ZS4KLSAgICovCi0gIAotICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIChpbnQpIHNpemUsIGV4cCwgcGNyZWwsIHR5cGUpOwotfQotCi0vKiBBIGdvb2QgcGxhY2UgdG8gZG8gdGhpcywgYWx0aG91Z2ggdGhpcyB3YXMgcHJvYmFibHkgbm90IGludGVuZGVkCi0gKiBmb3IgdGhpcyBraW5kIG9mIHVzZS4gIFdlIG5lZWQgdG8gZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGJlZm9yZQotICogcmVmZXJlbmNlcyBhcmUgbWFkZSB0byBhIG51bGwgc3ltYm9sIHBvaW50ZXIuICAqLwotdm9pZAotYXJtX2NsZWFudXAgKCkKLXsKLSAgaWYgKGN1cnJlbnRfcG9vbFAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdWJzZWdfc2V0ICh0ZXh0X3NlY3Rpb24sIDApOyAvKiBQdXQgaXQgYXQgdGhlIGVuZCBvZiB0ZXh0IHNlY3Rpb24gKi8KLSAgICAgIHNfbHRvcmcgKDApOwotICAgICAgbGlzdGluZ19wcmV2X2xpbmUgKCk7Ci0gICAgfQotfQotCi12b2lkCi1hcm1fc3RhcnRfbGluZV9ob29rICgpCi17Ci0gIGxhc3RfbGFiZWxfc2VlbiA9IE5VTEw7Ci19Ci0KLXZvaWQKLWFybV9mcm9iX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKiBzeW07Ci17Ci0gIGxhc3RfbGFiZWxfc2VlbiA9IHN5bTsKLSAgCi0gIEFSTV9TRVRfVEhVTUIgKHN5bSwgdGh1bWJfbW9kZSk7Ci0gIAotI2lmIGRlZmluZWQgT0JKX0NPRkYgfHwgZGVmaW5lZCBPQkpfRUxGCi0gIEFSTV9TRVRfSU5URVJXT1JLIChzeW0sIHN1cHBvcnRfaW50ZXJ3b3JrKTsKLSNlbmRpZgotICAKLSAgaWYgKGxhYmVsX2lzX3RodW1iX2Z1bmN0aW9uX25hbWUpCi0gICAgewotICAgICAgLyogV2hlbiB0aGUgYWRkcmVzcyBvZiBhIFRodW1iIGZ1bmN0aW9uIGlzIHRha2VuIHRoZSBib3R0b20KLQkgYml0IG9mIHRoYXQgYWRkcmVzcyBzaG91bGQgYmUgc2V0LiAgVGhpcyB3aWxsIGFsbG93Ci0JIGludGVyd29ya2luZyBiZXR3ZWVuIEFybSBhbmQgVGh1bWIgZnVuY3Rpb25zIHRvIHdvcmsKLQkgY29ycmVjdGx5LiAgKi8KLQotICAgICAgVEhVTUJfU0VUX0ZVTkMgKHN5bSwgMSk7Ci0gICAgICAKLSAgICAgIGxhYmVsX2lzX3RodW1iX2Z1bmN0aW9uX25hbWUgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9sIHRhYmxlLiAgVGhpcyBtYXJrcyBUaHVtYiBzeW1ib2xzIGFzIGRpc3RpbmN0IGZyb20KLSAgIEFSTSBvbmVzLiAgKi8KLQotdm9pZAotYXJtX2FkanVzdF9zeW10YWIgKCkKLXsKLSNpZmRlZiBPQkpfQ09GRgotICBzeW1ib2xTICogc3ltOwotCi0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKEFSTV9JU19USFVNQiAoc3ltKSkKLSAgICAgICAgewotCSAgaWYgKFRIVU1CX0lTX0ZVTkMgKHN5bSkpCi0JICAgIHsKLQkgICAgICAvKiBNYXJrIHRoZSBzeW1ib2wgYXMgYSBUaHVtYiBmdW5jdGlvbi4gICovCi0JICAgICAgaWYgKCAgIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19TVEFUCi0JCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0xBQkVMKSAvKiBUaGlzIGNhbiBoYXBwZW4hICovCi0JCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQlNUQVRGVU5DKTsKLQotCSAgICAgIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19FWFQpCi0JCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQkVYVEZVTkMpOwotCSAgICAgIGVsc2UKLQkJYXNfYmFkIChfKCIlczogdW5leHBlY3RlZCBmdW5jdGlvbiB0eXBlOiAlZCIpLAotCQkJU19HRVRfTkFNRSAoc3ltKSwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSk7Ci0JICAgIH0KLSAgICAgICAgICBlbHNlIHN3aXRjaCAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSBDX0VYVDoKLSAgICAgICAgICAgICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJFWFQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIENfU1RBVDoKLSAgICAgICAgICAgICAgICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfVEhVTUJTVEFUKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBDX0xBQkVMOgotICAgICAgICAgICAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19USFVNQkxBQkVMKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDogLyogZG8gbm90aGluZyAqLyAKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICBpZiAoQVJNX0lTX0lOVEVSV09SSyAoc3ltKSkKLQljb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+dS5zeW1lbnQubl9mbGFncyA9IDB4RkY7Ci0gICAgfQotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICBzeW1ib2xTICogICAgICAgICBzeW07Ci0gIGVsZl9zeW1ib2xfdHlwZSAqIGVsZl9zeW07Ci0gIGNoYXIgICAgICAgICAgICAgIGJpbmQ7Ci0KLSAgZm9yIChzeW0gPSBzeW1ib2xfcm9vdFA7IHN5bSAhPSBOVUxMOyBzeW0gPSBzeW1ib2xfbmV4dCAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAoQVJNX0lTX1RIVU1CIChzeW0pKQotICAgICAgICB7Ci0JICBpZiAoVEhVTUJfSVNfRlVOQyAoc3ltKSkKLQkgICAgewotCSAgICAgIGVsZl9zeW0gPSBlbGZfc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSk7Ci0JICAgICAgYmluZCA9IEVMRl9TVF9CSU5EIChlbGZfc3ltKTsKLQkgICAgICBlbGZfc3ltLT5pbnRlcm5hbF9lbGZfc3ltLnN0X2luZm8gPSBFTEZfU1RfSU5GTyAoYmluZCwgU1RUX0FSTV9URlVOQyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgIH0KLSNlbmRpZgotfQotCi1pbnQKLWFybV9kYXRhX2luX2NvZGUgKCkKLXsKLSAgaWYgKHRodW1iX21vZGUgJiYgISBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIgKyAxLCAiZGF0YToiLCA1KSkKLSAgICB7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJy8nOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLWFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCi0gICAgIGNoYXIgKiBuYW1lOwotewotICBpbnQgbGVuOwotCi0gIGlmICh0aHVtYl9tb2RlICYmIChsZW4gPSBzdHJsZW4gKG5hbWUpKSA+IDUKLSAgICAgICYmIHN0cmVxIChuYW1lICsgbGVuIC0gNSwgIi9kYXRhIikpCi0gICAgewotICAgICAgKihuYW1lICsgbGVuIC0gNSkgPSAwOwotICAgIH0KLQotICByZXR1cm4gbmFtZTsKLX0KLQotYm9vbGVhbgotYXJtX3ZhbGlkYXRlX2ZpeCAoZml4UCkKLSAgICAgZml4UyAqIGZpeFA7Ci17Ci0gIC8qIElmIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgYnJhbmNoIGlzIGEgZGVmaW5lZCBzeW1ib2wgd2hpY2ggZG9lcyBub3QgaGF2ZQotICAgICB0aGUgVEhVTUJfRlVOQyBhdHRyaWJ1dGUsIHRoZW4gd2UgbXVzdCBiZSBjYWxsaW5nIGEgZnVuY3Rpb24gd2hpY2ggaGFzCi0gICAgIHRoZSAoaW50ZXJmYWNlYXJtKSBhdHRyaWJ1dGUuICBXZSBsb29rIGZvciB0aGUgVGh1bWIgZW50cnkgcG9pbnQgdG8gdGhhdAotICAgICBmdW5jdGlvbiBhbmQgY2hhbmdlIHRoZSBicmFuY2ggdG8gcmVmZXIgdG8gdGhhdCBmdW5jdGlvbiBpbnN0ZWFkLiAgKi8KLSAgaWYgKCAgIGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVEhVTUJfUENSRUxfQlJBTkNIMjMKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiAhIFRIVU1CX0lTX0ZVTkMgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IGZpbmRfcmVhbF9zdGFydCAoZml4UC0+ZnhfYWRkc3kpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLS8qIFJlbG9jYXRpb25zIGFnYWluc3QgVGh1bWIgZnVuY3Rpb24gbmFtZXMgbXVzdCBiZSBsZWZ0IHVuYWRqdXN0ZWQsCi0gICBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGNvcnJlY3RseSBzZXQgdGhlCi0gICBib3R0b20gYml0IG9mIHRoZWlyIGFkZHJlc3Nlcy4gIFRoZSBNSVBTIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbgotICAgYWxzbyBwcmV2ZW50cyByZWxvY2F0aW9ucyB0aGF0IGFyZSBtaXBzLTE2IHNwZWNpZmljLCBidXQgSSBkbyBub3QKLSAgIGtub3cgd2h5IGl0IGRvZXMgdGhpcy4KLQotICAgRklYTUU6Ci0gICBUaGVyZSBpcyBvbmUgb3RoZXIgcHJvYmxlbSB0aGF0IG91Z2h0IHRvIGJlIGFkZHJlc3NlZCBoZXJlLCBidXQKLSAgIHdoaWNoIGN1cnJlbnRseSBpcyBub3Q6ICBUYWtpbmcgdGhlIGFkZHJlc3Mgb2YgYSBsYWJlbCAocmF0aGVyCi0gICB0aGFuIGEgZnVuY3Rpb24pIGFuZCB0aGVuIGxhdGVyIGp1bXBpbmcgdG8gdGhhdCBhZGRyZXNzLiAgU3VjaAotICAgYWRkcmVzc2VzIGFsc28gb3VnaHQgdG8gaGF2ZSB0aGVpciBib3R0b20gYml0IHNldCAoYXNzdW1pbmcgdGhhdAotICAgdGhleSByZXNpZGUgaW4gVGh1bWIgY29kZSksIGJ1dCBhdCB0aGUgbW9tZW50IHRoZXkgd2lsbCBub3QuICAqLwotICAgCi1ib29sZWFuCi1hcm1fZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICogZml4UDsKLXsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoVEhVTUJfSVNfRlVOQyAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiBmaXhQLT5meF9zdWJzeSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoICAgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWNvbnN0IGNoYXIgKgotZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIGlmICh0YXJnZXRfb2FiaSkKLSAgICAgIHJldHVybiAiZWxmMzItYmlnYXJtLW9hYmkiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAiZWxmMzItYmlnYXJtIjsKLSAgZWxzZQotICAgIGlmICh0YXJnZXRfb2FiaSkKLSAgICAgIHJldHVybiAiZWxmMzItbGl0dGxlYXJtLW9hYmkiOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAiZWxmMzItbGl0dGxlYXJtIjsKLX0KLQotdm9pZAotYXJtZWxmX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50cCkKLSAgICAgc3ltYm9sUyAqIHN5bXA7Ci0gICAgIGludCAqIHB1bnRwOwotewotICBlbGZfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnRwKTsKLX0gCi0KLWludAotYXJtX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIHN0cnVjdCBmaXggKiBmaXhwOwotewotICBpZiAoICAgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX1BDUkVMX0JSQU5DSCkgICAgCi0gICAgcmV0dXJuIDE7Ci0gIAotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotYXJtX3BhcnNlX3JlbG9jICgpCi17Ci0gIGNoYXIgICBpZFsxNl07Ci0gIGNoYXIgKiBpcDsKLSAgaW50ICAgIGk7Ci0gIHN0YXRpYyBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKiBzdHI7Ci0gICAgaW50ICAgIGxlbjsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIH0KLSAgcmVsb2NfbWFwW10gPQotICB7Ci0jZGVmaW5lIE1BUChzdHIscmVsb2MpIHsgc3RyLCBzaXplb2YgKHN0ciktMSwgcmVsb2MgfQotICAgIE1BUCAoIihnb3QpIiwgICAgQkZEX1JFTE9DX0FSTV9HT1QzMiksCi0gICAgTUFQICgiKGdvdG9mZikiLCBCRkRfUkVMT0NfQVJNX0dPVE9GRiksCi0gICAgLyogU2NvdHRCOiBKYW4gMzAsIDE5OTggKi8KLSAgICAvKiBBZGRlZCBzdXBwb3J0IGZvciBwYXJzaW5nICJ2YXIoUExUKSIgYnJhbmNoIGluc3RydWN0aW9ucyAqLwotICAgIC8qIGdlbmVyYXRlZCBieSBHQ0MgZm9yIFBMVCByZWxvY3MgKi8KLSAgICBNQVAgKCIocGx0KSIsICAgIEJGRF9SRUxPQ19BUk1fUExUMzIpLAotICAgIE5VTEwsIDAsICAgICAgICAgQkZEX1JFTE9DX1VOVVNFRAotI3VuZGVmIE1BUCAgICAKLSAgfTsKLQotICBmb3IgKGkgPSAwLCBpcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICBpIDwgc2l6ZW9mIChpZCkgJiYgKGlzYWxudW0gKCppcCkgfHwgaXNwdW5jdCAoKmlwKSk7Ci0gICAgICAgaSsrLCBpcCsrKQotICAgIGlkW2ldID0gdG9sb3dlciAoKmlwKTsKLSAgCi0gIGZvciAoaSA9IDA7IHJlbG9jX21hcFtpXS5zdHI7IGkrKykKLSAgICBpZiAoc3RybmNtcCAoaWQsIHJlbG9jX21hcFtpXS5zdHIsIHJlbG9jX21hcFtpXS5sZW4pID09IDApCi0gICAgICBicmVhazsKLSAgCi0gIGlucHV0X2xpbmVfcG9pbnRlciArPSByZWxvY19tYXBbaV0ubGVuOwotICAKLSAgcmV0dXJuIHJlbG9jX21hcFtpXS5yZWxvYzsKLX0KLQotc3RhdGljIHZvaWQKLXNfYXJtX2VsZl9jb25zIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNpZmRlZiBtZF9jb25zX2FsaWduCi0gIG1kX2NvbnNfYWxpZ24gKG5ieXRlcyk7Ci0jZW5kaWYKLQotICBkbwotICAgIHsKLSAgICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgICAgIAotICAgICAgZXhwcmVzc2lvbiAoJiBleHApOwotCi0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19zeW1ib2wKLSAgICAgICAgICAmJiAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnKCcKLSAgICAgICAgICAmJiAocmVsb2MgPSBhcm1fcGFyc2VfcmVsb2MoKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLSAgICAgICAgewotICAgICAgICAgIHJlbG9jX2hvd3RvX3R5cGUgKiBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByZWxvYyk7Ci0gICAgICAgICAgaW50IHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKGhvd3RvKTsKLQotICAgICAgICAgIGlmIChzaXplID4gbmJ5dGVzKQotICAgICAgICAgICAgYXNfYmFkICgiJXMgcmVsb2NhdGlvbnMgZG8gbm90IGZpdCBpbiAlZCBieXRlcyIsIGhvd3RvLT5uYW1lLCBuYnl0ZXMpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVnaXN0ZXIgY2hhciAqIHAgPSBmcmFnX21vcmUgKChpbnQpIG5ieXRlcyk7Ci0gICAgICAgICAgICAgIGludCBvZmZzZXQgPSBuYnl0ZXMgLSBzaXplOwotCi0gICAgICAgICAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LCBzaXplLAotCQkJICAgJiBleHAsIDAsIHJlbG9jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlbWl0X2V4cHIgKCYgZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtYXJtLmggYi9nYXMvY29uZmlnL3RjLWFybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmE1NzEzLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLWFybS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQlNb2RpZmllZCBieSBEYXZpZCBUYXlsb3IgKGR0YXlsb3JAYXJtbHRkLmNvLnVrKQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX0FSTSAxCi0KLSNpZm5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIENPRkZfTUFHSUMgCUFSTU1BR0lDCi0jZGVmaW5lIFRBUkdFVF9BUkNIIAliZmRfYXJjaF9hcm0KLQotI2RlZmluZSBBT1VUX01BQ0hUWVBFIAkwCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCi0KLSNpZmRlZiAgTElUVExFX0VORElBTgotI3VuZGVmICBMSVRUTEVfRU5ESUFOCi0jZW5kaWYKLQotI2lmZGVmICBCSUdfRU5ESUFOCi0jdW5kZWYgIEJJR19FTkRJQU4KLSNlbmRpZgotCi0jZGVmaW5lIExJVFRMRV9FTkRJQU4gCTEyMzQKLSNkZWZpbmUgQklHX0VORElBTiAJNDMyMQotCi0jaWYgZGVmaW5lZCBPQkpfQU9VVAotI2lmIGRlZmluZWQgVEVfUklTQ0lYCi0jIGRlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1yaXNjaXgiCi0jZWxpZiBkZWZpbmVkIFRFX0xJTlVYCi0jIGRlZmluZSBBUk1fQklfRU5ESUFOCi0jIGRlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1hcm0tbGludXgiCi0jZWxpZiBkZWZpbmVkIFRFX05ldEJTRAotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtYXJtLW5ldGJzZCIKLSNlbHNlCi0jIGRlZmluZSBBUk1fQklfRU5ESUFOCi0jIGRlZmluZSBUQVJHRVRfRk9STUFUIFwKLSAgKHRhcmdldF9iaWdfZW5kaWFuID8gImEub3V0LWFybS1iaWciIDogImEub3V0LWFybS1saXR0bGUiKQotI2VuZGlmCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLQotI2lmZGVmIE9CSl9BSUYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYWlmIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIE9CSl9DT0ZGIHx8IGRlZmluZWQgT0JKX0VMRgotIyBkZWZpbmUgQVJNX0JJX0VORElBTgotICAgICAKLSMgZGVmaW5lIFRDX1ZBTElEQVRFX0ZJWChmaXhQLCBzZWdUeXBlLCBMYWJlbCkgXAotICAgICBpZiAoYXJtX3ZhbGlkYXRlX2ZpeCAoZml4UCkpIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kKLSAgZXh0ZXJuIGJvb2xlYW4gYXJtX3ZhbGlkYXRlX2ZpeCBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNlbmRpZgotICAgICAKLSNpZmRlZiBPQkpfQ09GRgotIyBpZiBkZWZpbmVkIFRFX1BFCi0jICBkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTih4KSAoKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1JWQSkKLSMgICBpZmRlZiBURV9FUE9DCi0jICAgIGRlZmluZSBUQVJHRVRfRk9STUFUICh0YXJnZXRfYmlnX2VuZGlhbiA/ICJlcG9jLXBlLWFybS1iaWciIDogImVwb2MtcGUtYXJtLWxpdHRsZSIpCi0jICAgZWxzZQotIyAgICBkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAicGUtYXJtLWJpZyIgOiAicGUtYXJtLWxpdHRsZSIpCi0jICAgZW5kaWYKLSMgZWxzZQotIyAgZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImNvZmYtYXJtLWJpZyIgOiAiY29mZi1hcm0tbGl0dGxlIikKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotIyBkZWZpbmUgVEFSR0VUX0ZPUk1BVCBlbGYzMl9hcm1fdGFyZ2V0X2Zvcm1hdCgpCi0gIGV4dGVybiBjb25zdCBjaGFyICogZWxmMzJfYXJtX3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotICAKLSMgZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgYXJtX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gIGV4dGVybiBpbnQgYXJtX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBtZF9jb252ZXJ0X2ZyYWcoYiwgcywgZikge2FzX2ZhdGFsIChfKCJhcm0gY29udmVydF9mcmFnXG4iKSk7fQotCi0jZGVmaW5lIG1kX2NsZWFudXAoKSBhcm1fY2xlYW51cCAoKQotIGV4dGVybiB2b2lkIGFybV9jbGVhbnVwIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBtZF9zdGFydF9saW5lX2hvb2soKSBhcm1fc3RhcnRfbGluZV9ob29rICgpCi0gZXh0ZXJuIHZvaWQgYXJtX3N0YXJ0X2xpbmVfaG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChTKSBhcm1fZnJvYl9sYWJlbCAoUykKLSBleHRlcm4gdm9pZCBhcm1fZnJvYl9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogV2UgYWxzbyBuZWVkIHRvIG1hcmsgYXNzZW1ibGVyIGNyZWF0ZWQgc3ltYm9sczogICovCi0jZGVmaW5lIHRjX2Zyb2JfZmFrZV9sYWJlbChTKSBhcm1fZnJvYl9sYWJlbCAoUykKLQotLyogTk9URTogVGhlIGZha2UgbGFiZWwgY3JlYXRpb24gaW4gc3RhYnMuYzpzX3N0YWJfZ2VuZXJpYygpIGhhcwotICAgZGVsaWJlcmF0ZWx5IG5vdCBiZWVuIHVwZGF0ZWQgdG8gbWFyayBhc3NlbWJsZXIgY3JlYXRlZCBzdGFicwotICAgc3ltYm9scyBhcyBUaHVtYi4gICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBhcm1fZml4X2FkanVzdGFibGUgKGZpeFApCi0jZWxzZQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgMAotI2VuZGlmCi0KLS8qIFdlIG5lZWQgdG8ga2VlcCBzb21lIGxvY2FsIGluZm9ybWF0aW9uIG9uIHN5bWJvbHMuICAqLwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgdW5zaWduZWQgaW50Ci0jZGVmaW5lIEFSTV9HRVRfRkxBRyhzKSAgIAkoKnN5bWJvbF9nZXRfdGMgKHMpKQotI2RlZmluZSBBUk1fU0VUX0ZMQUcocyx2KSAJKCpzeW1ib2xfZ2V0X3RjIChzKSB8PSAodikpCi0jZGVmaW5lIEFSTV9SRVNFVF9GTEFHKHMsdikgCSgqc3ltYm9sX2dldF90YyAocykgJj0gfih2KSkKLQotI2RlZmluZSBBUk1fRkxBR19USFVNQiAJCSgxIDw8IDApCS8qIFRoZSBzeW1ib2wgaXMgYSBUaHVtYiBzeW1ib2wgcmF0aGVyIHRoYW4gYW4gQXJtIHN5bWJvbC4gICovCi0jZGVmaW5lIEFSTV9GTEFHX0lOVEVSV09SSyAJKDEgPDwgMSkJLyogVGhlIHN5bWJvbCBpcyBhdHRhY2hlZCB0byBjb2RlIHRoYXQgc3VwcHBvcnRzIGludGVyd29ya2luZy4gICovCi0jZGVmaW5lIFRIVU1CX0ZMQUdfRlVOQwkJKDEgPDwgMikJLyogVGhlIHN5bWJvbCBpcyBhdHRhY2hlZCB0byB0aGUgc3RhcnQgb2YgYSBUaHVtYiBmdW5jdGlvbi4gICovCi0KLSNkZWZpbmUgQVJNX0lTX1RIVU1CKHMpCQkoQVJNX0dFVF9GTEFHIChzKSAmIEFSTV9GTEFHX1RIVU1CKQotI2RlZmluZSBBUk1fSVNfSU5URVJXT1JLKHMpCShBUk1fR0VUX0ZMQUcgKHMpICYgQVJNX0ZMQUdfSU5URVJXT1JLKQotI2RlZmluZSBUSFVNQl9JU19GVU5DKHMpCShBUk1fR0VUX0ZMQUcgKHMpICYgVEhVTUJfRkxBR19GVU5DKQotCi0jZGVmaW5lIEFSTV9TRVRfVEhVTUIocyx0KSAgICAgICgodCkgPyBBUk1fU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX1RIVU1CKSAgICAgOiBBUk1fUkVTRVRfRkxBRyAocywgQVJNX0ZMQUdfVEhVTUIpKQotI2RlZmluZSBBUk1fU0VUX0lOVEVSV09SSyhzLHQpICAoKHQpID8gQVJNX1NFVF9GTEFHIChzLCBBUk1fRkxBR19JTlRFUldPUkspIDogQVJNX1JFU0VUX0ZMQUcgKHMsIEFSTV9GTEFHX0lOVEVSV09SSykpCi0jZGVmaW5lIFRIVU1CX1NFVF9GVU5DKHMsdCkgICAgICgodCkgPyBBUk1fU0VUX0ZMQUcgKHMsIFRIVU1CX0ZMQUdfRlVOQykgICAgOiBBUk1fUkVTRVRfRkxBRyAocywgVEhVTUJfRkxBR19GVU5DKSkKLQotCi0jZGVmaW5lIFRDX0ZJWF9UWVBFIFBUUgotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKEZJWFApICgoRklYUCktPnRjX2ZpeF9kYXRhID0gTlVMTCkKLQotI2RlZmluZSBUQ19TVEFSVF9MQUJFTChDLFNUUikgXAotICAoYyA9PSAnOicgfHwgKGMgPT0gJy8nICYmIGFybV9kYXRhX2luX2NvZGUgKCkpKQotaW50IGFybV9kYXRhX2luX2NvZGUgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShzdHIpIFwKLSBhcm1fY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChzdHIpOwotY2hhciAqIGFybV9jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLSNkZWZpbmUgb2JqX2FkanVzdF9zeW10YWIoKSBhcm1fYWRqdXN0X3N5bXRhYiAoKQotIGV4dGVybiB2b2lkIGFybV9hZGp1c3Rfc3ltdGFiIFBBUkFNUyAoKHZvaWQpKTsKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKHN5bSwgcHVudCkgIGFybWVsZl9mcm9iX3N5bWJvbCAoc3ltLCBwdW50KQotI2VuZGlmCi0KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiQVJNIEdBUyAiCi0KLSNkZWZpbmUgT1BUSU9OQUxfUkVHSVNURVJfUFJFRklYICclJwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBUQ19IQU5ETEVTX0ZYX0RPTkUKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgKG5hbWVbMF0gPT0gJy4nICYmIChuYW1lWzFdID09ICdMJykpCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAgIDEKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbCBvYmplY3QKLSAgIGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuICBUcnVlIGlmIHdlCi0gICBhcmUgd2lsbGluZyB0byBwZXJmb3JtIHRoaXMgcmVsb2NhdGlvbiB3aGlsZSBidWlsZGluZyB0aGUgLm8gZmlsZS4KLSAgIFRoaXMgaXMgb25seSB1c2VkIGZvciBwY3JlbCByZWxvY2F0aW9ucywgc28gR09UT0ZGIGRvZXMgbm90IG5lZWQgdG8gYmUKLSAgIGNoZWNrZWQgaGVyZS4gIEkgYW0gbm90IHN1cmUgaWYgc29tZSBvZiB0aGUgb3RoZXJzIGFyZSBldmVyIHVzZWQgd2l0aAotICAgcGNyZWwsIGJ1dCBpdCBpcyBlYXNpZXIgdG8gYmUgc2FmZSB0aGFuIHNvcnJ5LiAgKi8KLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAotICAgKCAgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfQVJNX0dPVDEyIFwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0FSTV9HT1QzMiBcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMikKLQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X2FybQotIGV4dGVybiB2b2lkIGNvbnNfZml4X25ld19hcm0gUEFSQU1TICgoZnJhZ1MgKiwgaW50LCBpbnQsIGV4cHJlc3Npb25TICopKTsKLQotLyogRG9uJ3QgYWxsb3cgc3ltYm9scyB0byBiZSBkaXNjYXJkZWQgb24gR09UIHJlbGF0ZWQgcmVsb2NzLAotICAgbm9yIG9uIGdsb2JhbHMuICAqLyAKLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoeCkgKFwKLSAgICAgKCh4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19BUk1fUExUMzIgXAotICAgfHwgKHgpLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0FSTV9HT1QzMiBcCi0gICB8fCAoeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfQVJNX0dPVE9GRiBcCi0gICB8fCBTX0lTX0VYVEVSTiAoKHgpLT5meF9hZGRzeSkgXAotICAgfHwgU19JU19XRUFLICgoeCktPmZ4X2FkZHN5KSkgPyAwIDogMSkKLSAgICAgCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUgIl9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbHNlCi0jZGVmaW5lIEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbmRpZgotICAgICAKLS8qIGVuZCBvZiB0Yy1hcm0uaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmMgYi9nYXMvY29uZmlnL3RjLWQxMHYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM5MjZmYi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQxMHYuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NTQgKzAsMCBAQAotLyogdGMtZDEwdi5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWl0c3ViaXNoaSBEMTBWCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL2QxMHYuaCIKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk8iOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQotaW50IE9wdGltaXppbmcgPSAwOwotCi0jZGVmaW5lIEFUX1dPUkRfUChYKSAoKFgpLT5YX29wID09IE9fcmlnaHRfc2hpZnQgXAotCQkgICAgICAmJiAoWCktPlhfb3Bfc3ltYm9sICE9IE5VTEwgXAotCQkgICAgICAmJiBzeW1ib2xfY29uc3RhbnRfcCAoKFgpLT5YX29wX3N5bWJvbCkgXAotCQkgICAgICAmJiBTX0dFVF9WQUxVRSAoKFgpLT5YX29wX3N5bWJvbCkgPT0gQVRfV09SRF9SSUdIVF9TSElGVCkKLSNkZWZpbmUgQVRfV09SRF9SSUdIVF9TSElGVCAyCi0KLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBkMTB2X2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9wZXJhbmQ7Ci0gIGludCBwY3JlbDsKLSAgaW50IHNpemU7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9maXh1cHMKLXsKLSAgaW50IGZjOwotICBzdHJ1Y3QgZDEwdl9maXh1cCBmaXhbTUFYX0lOU05fRklYVVBTXTsKLSAgc3RydWN0IF9maXh1cHMgKm5leHQ7Ci19IEZpeHVwczsKLQotc3RhdGljIEZpeHVwcyBGaXhVcHNbMl07Ci1zdGF0aWMgRml4dXBzICpmaXh1cHM7Ci0KLXN0YXRpYyBpbnQgZG9fbm90X2lnbm9yZV9oYXNoID0gMDsKLQotLyogVHJ1ZSBpZiBpbnN0cnVjdGlvbiBzd2FwcGluZyB3YXJuaW5ncyBzaG91bGQgYmUgaW5oaWJpdGVkLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXA7IC8qIC0tbm93YXJuc3dhcCAqLwotCi0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBpbnQgcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBpbnQgY2hlY2tfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyBudW0sIGludCBiaXRzLCBpbnQgZmxhZ3MpKTsKLXN0YXRpYyBpbnQgcG9zdGZpeCBQQVJBTVMgKChjaGFyICpwKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGdldF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcCkpOwotc3RhdGljIGludCBnZXRfb3BlcmFuZHMgUEFSQU1TICgoZXhwcmVzc2lvblMgZXhwW10pKTsKLXN0YXRpYyBzdHJ1Y3QgZDEwdl9vcGNvZGUgKmZpbmRfb3Bjb2RlIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlLCBleHByZXNzaW9uUyBvcHNbXSkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVpbGRfaW5zbiBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgZXhwcmVzc2lvblMgKm9wZXJzLCB1bnNpZ25lZCBsb25nIGluc24pKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2xvbmcgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUsIHVuc2lnbmVkIGxvbmcgaW5zbiwgRml4dXBzICpmeCkpOwotc3RhdGljIHZvaWQgd3JpdGVfMV9zaG9ydCBQQVJBTVMgKChzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZSwgdW5zaWduZWQgbG9uZyBpbnNuLCBGaXh1cHMgKmZ4KSk7Ci1zdGF0aWMgaW50IHdyaXRlXzJfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUxLCB1bnNpZ25lZCBsb25nIGluc24xLCAKLQkJCQkgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwgaW50IGV4ZWNfdHlwZSwgRml4dXBzICpmeCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9fYXNzZW1ibGUgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgZDEwdl9vcGNvZGUgKipvcGNvZGUpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGQxMHZfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgoIHVuc2lnbmVkIGxvbmcgaW5zbiwgaW50IG9wX3R5cGUsCi0JCQkJCQkgICBvZmZzZXRUIHZhbHVlLCBpbnQgbGVmdCwgZml4UyAqZml4KSk7Ci1zdGF0aWMgaW50IHBhcmFsbGVsX29rIFBBUkFNUyAoKHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCi0JCQkJc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGUyLCB1bnNpZ25lZCBsb25nIGluc24yLAotCQkJCWludCBleGVjX3R5cGUpKTsKLXN0YXRpYyBzeW1ib2xTICogZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIgUEFSQU1TICgoZXhwcmVzc2lvblMgKikpOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotI2RlZmluZSBPUFRJT05fTk9XQVJOU1dBUCAoT1BUSU9OX01EX0JBU0UpCi0gIHsibm93YXJuc3dhcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9XQVJOU1dBUH0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7ICAgICAgIAotCi1zdGF0aWMgdm9pZCBkMTB2X2RvdF93b3JkIFBBUkFNUyAoKGludCkpOwotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJ3b3JkIiwJZDEwdl9kb3Rfd29yZCwJMiB9LAotICB7IE5VTEwsICAgICAgIE5VTEwsICAgICAgICAgICAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpkMTB2X2hhc2g7Ci0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVycwotICAgYXJyYXkgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IGQxMHZfcmVnX25hbWVfY250KCkgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZSAKLQkgIHJldHVybiBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICByZXR1cm4gLTE7Ci19Ci0KLS8qIHJlZ2lzdGVyX25hbWUoKSBjaGVja3MgdGhlIHN0cmluZyBhdCBpbnB1dF9saW5lX3BvaW50ZXIKLSAgIHRvIHNlZSBpZiBpdCBpcyBhIHZhbGlkIHJlZ2lzdGVyIG5hbWUgKi8KLQotc3RhdGljIGludAotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgYywgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICB3aGlsZSAoKnAgJiYgKnAhPSdcbicgJiYgKnAhPSdccicgJiYgKnAgIT0nLCcgJiYgKnAhPScgJyAmJiAqcCE9JyknKQotICAgIHArKzsKLQotICBjID0gKnA7Ci0gIGlmIChjKQotICAgICpwKysgPSAwOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIC8qIHRlbXBvcmFyaWx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGhlcmUgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoYykKLSAgICAqKHAtMSkgPSBjOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1jaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykKLSAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0gICAgIGludCBiaXRzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGxvbmcgbWluLCBtYXgsIGJpdDE7Ci0gIGludCByZXR2YWw9MDsKLQotICAvKiBkb24ndCBib3RoZXIgY2hlY2tpbmcgMTYtYml0IHZhbHVlcyAqLwotICBpZiAoYml0cyA9PSAxNikKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHsKLSAgICAgIC8qIGFsbCBzcGVjaWFsIHNoaWZ0IG9wZXJhbmRzIGFyZSB1bnNpZ25lZCAqLwotICAgICAgLyogYW5kIDw9IDE2LiAgV2UgYWxsb3cgMCBmb3Igbm93LiAqLwotICAgICAgaWYgKG51bT4xNikKLQlyZXR1cm4gMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0gICAgewotICAgICAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSktMTsgCi0gICAgICBtaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOyAgCi0gICAgICBpZiAoKChsb25nKW51bSA+IG1heCkgfHwgKChsb25nKW51bSA8IG1pbikpCi0JcmV0dmFsID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0gICAgICBtaW4gPSAwOwotICAgICAgaWYgKChudW0gPiBtYXgpIHx8IChudW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiRDEwViBvcHRpb25zOlxuXAotLU8gICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUuICBXaWxsIGRvIHNvbWUgb3BlcmF0aW9ucyBpbiBwYXJhbGxlbC5cbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnTyc6Ci0gICAgICAvKiBPcHRpbWl6ZS4gV2lsbCBhdHRlbXB0IHRvIHBhcmFsbGVsaXplIG9wZXJhdGlvbnMgKi8KLSAgICAgIE9wdGltaXppbmcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTk9XQVJOU1dBUDoKLSAgICAgIGZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXAgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0gIAotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiYmFkIGNhbGwgdG8gbWRfYXRvZiIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgCi0gICpzaXplUCA9IHByZWMgKiAyOwotICAKLSAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLSAgICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqYWJmZDsKLSAgYXNlY3Rpb24gKnNlYzsKLSAgZnJhZ1MgKmZyYWdQOwotewotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgZDEwdl9oYXNoID0gaGFzaF9uZXcoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBEMTB2IGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICBmb3IgKG9wY29kZSA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKilkMTB2X29wY29kZXM7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcGNvZGUtPm5hbWUpKQotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopb3Bjb2RlLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKGQxMHZfaGFzaCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICB9Ci0KLSAgZml4dXBzID0gJkZpeFVwc1swXTsKLSAgRml4VXBzWzBdLm5leHQgPSAmRml4VXBzWzFdOwotICBGaXhVcHNbMV0ubmV4dCA9ICZGaXhVcHNbMF07Ci19Ci0KLQotLyogdGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSBwb3N0aW5jcmVtZW50IG9yIHBvc3RkZWNyZW1lbnQKLSAgIG9wZXJhdG9yICggJysnIG9yICctJyApIGZyb20gYW4gZXhwcmVzc2lvbiAqLwotCi1zdGF0aWMgaW50IHBvc3RmaXggKHApIAotICAgICBjaGFyICpwOwotewotICB3aGlsZSAoKnAgIT0gJy0nICYmICpwICE9ICcrJykgCi0gICAgewotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIHArKzsKLSAgICB9Ci0KLSAgaWYgKCpwID09ICctJykgCi0gICAgewotICAgICAgKnAgPSAnICc7Ci0gICAgICByZXR1cm4gKC0xKTsKLSAgICB9Ci0gIGlmICgqcCA9PSAnKycpIAotICAgIHsKLSAgICAgICpwID0gJyAnOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0KLSAgcmV0dXJuICgwKTsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIAotZ2V0X3JlbG9jIChvcCkgCi0gICAgIHN0cnVjdCBkMTB2X29wZXJhbmQgKm9wOwotewotICBpbnQgYml0cyA9IG9wLT5iaXRzOwotCi0gIGlmIChiaXRzIDw9IDQpIAotICAgIHJldHVybiAoMCk7Ci0gICAgICAKLSAgaWYgKG9wLT5mbGFncyAmIE9QRVJBTkRfQUREUikgCi0gICAgewotICAgICAgaWYgKGJpdHMgPT0gOCkKLQlyZXR1cm4gKEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpOwotICAgICAgZWxzZQotCXJldHVybiAoQkZEX1JFTE9DX0QxMFZfMThfUENSRUwpOwotICAgIH0KLQotICByZXR1cm4gKEJGRF9SRUxPQ18xNik7Ci19Ci0KLQotLyogZ2V0X29wZXJhbmRzIHBhcnNlcyBhIHN0cmluZyBvZiBvcGVyYW5kcyBhbmQgcmV0dXJucwotICAgYW4gYXJyYXkgb2YgZXhwcmVzc2lvbnMgKi8KLQotc3RhdGljIGludAotZ2V0X29wZXJhbmRzIChleHApIAotICAgICBleHByZXNzaW9uUyBleHBbXTsKLXsKLSAgY2hhciAqcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IG51bW9wcyA9IDA7Ci0gIGludCBwb3N0ID0gMDsKLSAgaW50IHVzZXNfYXQgPSAwOwotICAKLSAgd2hpbGUgKCpwKSAgCi0gICAgewotICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCi0JcCsrOwotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIAotICAgICAgaWYgKCpwID09ICdAJykgCi0JewotCSAgdXNlc19hdCA9IDE7Ci0JICAKLQkgIHArKzsKLQkgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGlmICgqcCA9PSAnKCcpIAotCSAgICB7Ci0JICAgICAgcCsrOwotCSAgICAgIGV4cFtudW1vcHNdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfQVRQQVI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICctJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVE1JTlVTOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUU0lHTjsKLQkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7Ci0JICAgIH0KLQkgIG51bW9wcysrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnAgPT0gJyknKSAKLQl7Ci0JICAvKiBqdXN0IHNraXAgdGhlIHRyYWlsaW5nIHBhcmVuICovCi0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0KLSAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBpdCBtaWdodCBiZSBhIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgIGlmICghcmVnaXN0ZXJfbmFtZSAoJmV4cFtudW1vcHNdKSkKLQl7Ci0JICAvKiBwYXJzZSBhcyBhbiBleHByZXNzaW9uICovCi0JICBpZiAodXNlc19hdCkKLQkgICAgewotCSAgICAgIC8qIEFueSBleHByZXNzaW9uIHRoYXQgaW52b2x2ZXMgdGhlIGluZGlyZWN0IGFkZHJlc3NpbmcKLQkJIGNhbm5vdCBhbHNvIGludm9sdmUgaW1tZWRpYXRlIGFkZHJlc3NpbmcuICBUaGVyZWZvcmUKLQkJIHRoZSB1c2Ugb2YgdGhlIGhhc2ggY2hhcmFjdGVyIGlzIGlsbGVnYWwuICAqLwotCSAgICAgIGludCBzYXZlID0gZG9fbm90X2lnbm9yZV9oYXNoOwotCSAgICAgIGRvX25vdF9pZ25vcmVfaGFzaCA9IDE7Ci0JICAgICAgCi0JICAgICAgZXhwcmVzc2lvbiAoJmV4cFtudW1vcHNdKTsKLQkgICAgICAKLQkgICAgICBkb19ub3RfaWdub3JlX2hhc2ggPSBzYXZlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGV4cHJlc3Npb24gKCZleHBbbnVtb3BzXSk7Ci0JfQotCi0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkB3b3JkIiwgNSkgPT0gMCkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLQkgIGlmIChleHBbbnVtb3BzXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JICAgIHsKLQkgICAgICAvKiBpZiBpdCBsb29rZWQgbGlrZSBhIHJlZ2lzdGVyIG5hbWUgYnV0IHdhcyBmb2xsb3dlZCBieQotICAgICAgICAgICAgICAgICAiQHdvcmQiIHRoZW4gaXQgd2FzIHJlYWxseSBhIHN5bWJvbCwgc28gY2hhbmdlIGl0IHRvCi0gICAgICAgICAgICAgICAgIG9uZSAqLwotCSAgICAgIGV4cFtudW1vcHNdLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKWV4cFtudW1vcHNdLlhfb3Bfc3ltYm9sKTsKLQkgICAgfQotCi0JICAvKiBjaGVjayBmb3IgaWRlbnRpZmllckB3b3JkK2NvbnN0YW50ICovCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKycpCi0JICB7Ci0JICAgIGNoYXIgKm9yaWdfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgZXhwcmVzc2lvblMgbmV3X2V4cDsKLQkgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOwotCSAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBuZXdfZXhwLlhfYWRkX251bWJlcjsKLQkgIH0KLQotCSAgLyogY29udmVydCBleHByIGludG8gYSByaWdodCBzaGlmdCBieSBBVF9XT1JEX1JJR0hUX1NISUZUICovCi0JICB7Ci0JICAgIGV4cHJlc3Npb25TIG5ld19leHA7Ci0JICAgIG1lbXNldCAoJm5ld19leHAsIDAsIHNpemVvZiBuZXdfZXhwKTsKLQkgICAgbmV3X2V4cC5YX2FkZF9udW1iZXIgPSBBVF9XT1JEX1JJR0hUX1NISUZUOwotCSAgICBuZXdfZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICBuZXdfZXhwLlhfdW5zaWduZWQgPSAxOwotCSAgICBleHBbbnVtb3BzXS5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZuZXdfZXhwKTsKLQkgICAgZXhwW251bW9wc10uWF9vcCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICB9Ci0KLQkgIGtub3cgKEFUX1dPUkRfUCAoJmV4cFtudW1vcHNdKSk7Ci0JfQotICAgICAgCi0gICAgICBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2lsbGVnYWwpIAotCWFzX2JhZCAoXygiaWxsZWdhbCBvcGVyYW5kIikpOwotICAgICAgZWxzZSBpZiAoZXhwW251bW9wc10uWF9vcCA9PSBPX2Fic2VudCkgCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0KLSAgICAgIG51bW9wcysrOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgc3dpdGNoIChwb3N0KSAKLSAgICB7Ci0gICAgY2FzZSAtMToJLyogcG9zdGRlY3JlbWVudCBtb2RlICovCi0gICAgICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IE9QRVJBTkRfTUlOVVM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6CS8qIHBvc3RpbmNyZW1lbnQgbW9kZSAqLwotICAgICAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotICAgICAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX1BMVVM7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgZXhwW251bW9wc10uWF9vcCA9IDA7Ci0gIHJldHVybiAobnVtb3BzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWQxMHZfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wX3R5cGUsIHZhbHVlLCBsZWZ0LCBmaXgpIAotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCBvcF90eXBlOwotICAgICBvZmZzZXRUIHZhbHVlOwotICAgICBpbnQgbGVmdDsKLSAgICAgZml4UyAqZml4OwotewotICBpbnQgc2hpZnQsIGJpdHM7Ci0KLSAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wX3R5cGVdLnNoaWZ0OwotICBpZiAobGVmdCkKLSAgICBzaGlmdCArPSAxNTsKLQotICBiaXRzID0gZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5iaXRzOwotCi0gIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KLSAgaWYgKGNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZDEwdl9vcGVyYW5kc1tvcF90eXBlXS5mbGFncykpCi0gICAgYXNfYmFkX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksIHZhbHVlKTsKLQotICB2YWx1ZSAmPSAweDdGRkZGRkZGID4+ICgzMSAtIGJpdHMpOwotICBpbnNuIHw9ICh2YWx1ZSA8PCBzaGlmdCk7Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQotLyogYnVpbGRfaW5zbiB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIG9wY29kZSBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlCi0gICBhbmQgdGhlIGFycmF5IG9mIG9wZXJhbmQgZXhwcmVzc2lvbnMgYW5kIHJldHVybnMgdGhlIGluc3RydWN0aW9uICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1idWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzLCBpbnNuKSAKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyczsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotewotICBpbnQgaSwgYml0cywgc2hpZnQsIGZsYWdzLCBmb3JtYXQ7Ci0gIHVuc2lnbmVkIGxvbmcgbnVtYmVyOwotICAKLSAgLyogdGhlIGluc24gYXJndW1lbnQgaXMgb25seSB1c2VkIGZvciB0aGUgRElWUyBrbHVkZ2UgKi8KLSAgaWYgKGluc24pCi0gICAgZm9ybWF0ID0gTE9OR19SOwotICBlbHNlCi0gICAgewotICAgICAgaW5zbiA9IG9wY29kZS0+b3Bjb2RlOwotICAgICAgZm9ybWF0ID0gb3Bjb2RlLT5mb3JtYXQ7Ci0gICAgfQotICAKLSAgZm9yIChpPTA7b3Bjb2RlLT5vcGVyYW5kc1tpXTtpKyspIAotICAgIHsKLSAgICAgIGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLSAgICAgIGJpdHMgPSBkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmJpdHM7Ci0gICAgICBzaGlmdCA9IGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uc2hpZnQ7Ci0gICAgICBudW1iZXIgPSBvcGVyc1tpXS5YX2FkZF9udW1iZXI7Ci0KLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKSAKLQl7Ci0JICBudW1iZXIgJj0gUkVHSVNURVJfTUFTSzsKLQkgIGlmIChmb3JtYXQgPT0gTE9OR19MKQotCSAgICBzaGlmdCArPSAxNTsKLQl9Ci0KLSAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fcmVnaXN0ZXIgJiYgb3BlcnNbaV0uWF9vcCAhPSBPX2NvbnN0YW50KSAKLQl7Ci0JICAvKiBub3cgY3JlYXRlIGEgZml4dXAgKi8KLQotCSAgaWYgKGZpeHVwcy0+ZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICBpZiAoQVRfV09SRF9QICgmb3BlcnNbaV0pKQotCSAgICB7Ci0JICAgICAgLyogUmVjb25pemUgWFhYPj4xK04gYWthIFhYWEB3b3JkK04gYXMgc3BlY2lhbCAoQVRfV09SRCkgKi8KLQkgICAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9IEJGRF9SRUxPQ19EMTBWXzE4OwotCSAgICAgIG9wZXJzW2ldLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBvcGVyc1tpXS5YX29wX3N5bWJvbCA9IE5VTEw7IC8qIFNob3VsZCBmcmVlIGl0ICovCi0JICAgICAgLyogbnVtYmVyIGlzIGxlZnQgc2hpZnRlZCBieSBBVF9XT1JEX1JJR0hUX1NISUZUIHNvCi0gICAgICAgICAgICAgICAgIHRoYXQsIGl0IGlzIGFsaWduZWQgd2l0aCB0aGUgc3ltYm9sJ3MgdmFsdWUuICBMYXRlciwKLSAgICAgICAgICAgICAgICAgQkZEX1JFTE9DX0QxMFZfMTggd2lsbCByaWdodCBzaGlmdCAoc3ltYm9sX3ZhbHVlICsKLSAgICAgICAgICAgICAgICAgWF9hZGRfbnVtYmVyKS4gKi8KLQkgICAgICBudW1iZXIgPDw9IEFUX1dPUkRfUklHSFRfU0hJRlQ7Ci0JICAgICAgb3BlcnNbaV0uWF9hZGRfbnVtYmVyID0gbnVtYmVyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID0gCi0JICAgICAgZ2V0X3JlbG9jKChzdHJ1Y3QgZDEwdl9vcGVyYW5kICopJmQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0pOwotCi0JICBpZiAoZml4dXBzLT5maXhbZml4dXBzLT5mY10ucmVsb2MgPT0gQkZEX1JFTE9DXzE2IHx8IAotCSAgICAgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5zaXplID0gMjsgCSAgICAKLQkgIGVsc2UKLQkgICAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDQ7Ci0gCSAgICAKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLmV4cCA9IG9wZXJzW2ldOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10ub3BlcmFuZCA9IG9wY29kZS0+b3BlcmFuZHNbaV07Ci0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IChmbGFncyAmIE9QRVJBTkRfQUREUikgPyB0cnVlIDogZmFsc2U7Ci0JICAoZml4dXBzLT5mYykrKzsKLQl9Ci0KLSAgICAgIC8qIHRydW5jYXRlIHRvIHRoZSBwcm9wZXIgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICAgIGlmICgob3BlcnNbaV0uWF9vcCA9PSBPX2NvbnN0YW50KSAmJiBjaGVja19yYW5nZSAobnVtYmVyLCBiaXRzLCBmbGFncykpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiKSxudW1iZXIpOwotICAgICAgbnVtYmVyICY9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7Ci0gICAgICBpbnNuID0gaW5zbiB8IChudW1iZXIgPDwgc2hpZnQpOwotICAgIH0KLQotICAvKiBrbHVkZ2U6IGZvciBESVZTLCB3ZSBuZWVkIHRvIHB1dCB0aGUgb3BlcmFuZHMgaW4gdHdpY2UgKi8KLSAgLyogb24gdGhlIHNlY29uZCBwYXNzLCBmb3JtYXQgaXMgY2hhbmdlZCB0byBMT05HX1IgdG8gZm9yY2UgKi8KLSAgLyogdGhlIHNlY29uZCBzZXQgb2Ygb3BlcmFuZHMgdG8gbm90IGJlIHNoaWZ0ZWQgb3ZlciAxNSAqLwotICBpZiAoKG9wY29kZS0+b3Bjb2RlID09IE9QQ09ERV9ESVZTKSAmJiAoZm9ybWF0PT1MT05HX0wpKQotICAgIGluc24gPSBidWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzLCBpbnNuKTsKLSAgICAgIAotICByZXR1cm4gaW5zbjsKLX0KLQotLyogd3JpdGUgb3V0IGEgbG9uZyBmb3JtIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZAotd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmeCkgCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIEZpeHVwcyAqZng7Ci17Ci0gIGludCBpLCB3aGVyZTsKLSAgY2hhciAqZiA9IGZyYWdfbW9yZSg0KTsKLQotICBpbnNuIHw9IEZNMTE7Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIDQpOwotCi0gIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotICAgIHsKLSAgICAgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCXsgCi0JICB3aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsgCi0JICBpZiAoZngtPmZpeFtpXS5zaXplID09IDIpCi0JICAgIHdoZXJlICs9IDI7Ci0KLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzE4KQotCSAgICBmeC0+Zml4W2ldLm9wZXJhbmQgfD0gNDA5NjsJICAKLQotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgd2hlcmUsCi0JCSAgICAgICBmeC0+Zml4W2ldLnNpemUsCi0JCSAgICAgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJICAgICAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCSAgICAgICBmeC0+Zml4W2ldLm9wZXJhbmR8MjA0OCk7Ci0JfQotICAgIH0KLSAgZngtPmZjID0gMDsKLX0KLQotCi0vKiB3cml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGJ5IGl0c2VsZiAqLwotc3RhdGljIHZvaWQKLXdyaXRlXzFfc2hvcnQgKG9wY29kZSwgaW5zbiwgZngpIAotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wY29kZTsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotewotICBjaGFyICpmID0gZnJhZ19tb3JlKDQpOwotICBpbnQgaSwgd2hlcmU7Ci0KLSAgaWYgKG9wY29kZS0+ZXhlY190eXBlICYgUEFST05MWSkKLSAgICBhc19mYXRhbCAoXygiSW5zdHJ1Y3Rpb24gbXVzdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCB3aXRoIGFub3RoZXIgaW5zdHJ1Y3Rpb24uIikpOwotCi0gIC8qIHRoZSBvdGhlciBjb250YWluZXIgbmVlZHMgdG8gYmUgTk9QICovCi0gIC8qIGFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAwLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZCBvbmx5Ci0gICAgIGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLwotICBpZiAob3Bjb2RlLT51bml0ID09IElVKQotICAgIGluc24gfD0gRk0wMCB8IChOT1AgPDwgMTUpOwkJLyogcmlnaHQgY29udGFpbmVyICovCi0gIGVsc2UKLSAgICBpbnNuID0gRk0wMCB8IChpbnNuIDw8IDE1KSB8IE5PUDsJLyogbGVmdCBjb250YWluZXIgKi8KLQotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLSAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0gICAgewotICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JeyAKLQkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgIGlmIChmeC0+Zml4W2ldLnNpemUgPT0gMikKLQkgICAgd2hlcmUgKz0gMjsKLQotCSAgaWYgKGZ4LT5maXhbaV0ucmVsb2MgPT0gQkZEX1JFTE9DX0QxMFZfMTgpCi0JICAgIGZ4LT5maXhbaV0ub3BlcmFuZCB8PSA0MDk2OwkgIAotCi0JICAvKiBpZiBpdCdzIGFuIFIgcmVsb2MsIHdlIG1heSBoYXZlIHRvIHN3aXRjaCBpdCB0byBMICovCi0JICBpZiAoIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpICYmIChvcGNvZGUtPnVuaXQgIT0gSVUpICkKLQkgICAgZngtPmZpeFtpXS5vcGVyYW5kIHw9IDEwMjQ7Ci0KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLCAKLQkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAotCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJICAgICAgIGZ4LT5maXhbaV0ub3BlcmFuZHwyMDQ4KTsKLQl9Ci0gICAgfQotICBmeC0+ZmMgPSAwOwotfQotCi0vKiB3cml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGlmIHBvc3NpYmxlICovCi0vKiByZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBub3Qgd3JpdHRlbiBvdXQgKi8KLXN0YXRpYyBpbnQKLXdyaXRlXzJfc2hvcnQgKG9wY29kZTEsIGluc24xLCBvcGNvZGUyLCBpbnNuMiwgZXhlY190eXBlLCBmeCkgCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlMSwgKm9wY29kZTI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBpbnQgZXhlY190eXBlOwotICAgICBGaXh1cHMgKmZ4OwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGNoYXIgKmY7Ci0gIGludCBpLGosIHdoZXJlOwotCi0gIGlmICggKGV4ZWNfdHlwZSAhPSAxKSAmJiAoKG9wY29kZTEtPmV4ZWNfdHlwZSAmIFBBUk9OTFkpCi0JICAgICAgICAgICAgICAgIHx8IChvcGNvZGUyLT5leGVjX3R5cGUgJiBQQVJPTkxZKSkpCi0gICAgYXNfZmF0YWwgKF8oIkluc3RydWN0aW9uIG11c3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gIAotICBpZiAoIChvcGNvZGUxLT5mb3JtYXQgJiBMT05HX09QQ09ERSkgfHwgKG9wY29kZTItPmZvcm1hdCAmIExPTkdfT1BDT0RFKSkKLSAgICBhc19mYXRhbCAoXygiTG9uZyBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBjb21iaW5lZC4iKSk7Ci0KLSAgaWYob3Bjb2RlMS0+ZXhlY190eXBlICYgQlJBTkNIX0xJTksgJiYgZXhlY190eXBlID09IDApCi0gICAgewotICAgICAgLyogSW5zdHJ1Y3Rpb25zIHBhaXJlZCB3aXRoIGEgc3Vicm91dGluZSBjYWxsIGFyZSBleGVjdXRlZCBiZWZvcmUgdGhlCi0JIHN1YnJvdXRpbmUsIHNvIGRvbid0IGRvIHRoZXNlIHBhaXJpbmdzIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gICovCi0gICAgICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQpOwotICAgICAgcmV0dXJuICgxKTsKLSAgICB9Ci0KLSAgc3dpdGNoIChleGVjX3R5cGUpIAotICAgIHsKLSAgICBjYXNlIDA6CS8qIG9yZGVyIG5vdCBzcGVjaWZpZWQgKi8KLSAgICAgIGlmICggT3B0aW1pemluZyAmJiBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpKQotCXsKLQkgIC8qIHBhcmFsbGVsICovCi0JICBpZiAob3Bjb2RlMS0+dW5pdCA9PSBJVSkKLQkgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7Ci0JICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VKQotCSAgICBpbnNuID0gRk0wMCB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDE1KSB8IGluc24yOyAgCi0JICAgICAgZnggPSBmeC0+bmV4dDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUpIAotCXsKLQkgIC8qIHJldmVyc2Ugc2VxdWVudGlhbCAqLwotCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHNlcXVlbnRpYWwgKi8KLQkgIGluc24gPSBGTTAxIHwgKGluc24xIDw8IDE1KSB8IGluc24yOwotCSAgZnggPSBmeC0+bmV4dDsgIAotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMToJLyogcGFyYWxsZWwgKi8KLSAgICAgIGlmIChvcGNvZGUxLT5leGVjX3R5cGUgJiBTRVEgfHwgb3Bjb2RlMi0+ZXhlY190eXBlICYgU0VRKQotCWFzX2ZhdGFsIChfKCJPbmUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIikpOwotCi0gICAgICBpZiAob3Bjb2RlMS0+dW5pdCA9PSBJVSkKLQl7Ci0JICBpZiAob3Bjb2RlMi0+dW5pdCA9PSBJVSkKLQkgICAgYXNfZmF0YWwgKF8oIlR3byBJVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLSAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCi0JICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotIAkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZTItPnVuaXQgPT0gTVUpCi0JewotCSAgaWYgKG9wY29kZTEtPnVuaXQgPT0gTVUpCi0JICAgIGFzX2ZhdGFsIChfKCJUd28gTVUgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gICAgICAgICAgaWYgKCFmbGFnX3dhcm5fc3VwcHJlc3NfaW5zdHJ1Y3Rpb25zd2FwKQotCSAgICBhc193YXJuIChfKCJTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlciIpKTsKLQkgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDE1KSB8IGluc24xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnNuID0gRk0wMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsgIAotCSAgZnggPSBmeC0+bmV4dDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6CS8qIHNlcXVlbnRpYWwgKi8KLSAgICAgIGlmIChvcGNvZGUxLT51bml0ICE9IElVKQotCWluc24gPSBGTTAxIHwgKGluc24xIDw8IDE1KSB8IGluc24yOyAgCi0gICAgICBlbHNlIGlmIChvcGNvZGUyLT51bml0ID09IE1VIHx8IG9wY29kZTItPnVuaXQgPT0gRUlUSEVSKQotCXsKLSAgICAgICAgICBpZiAoIWZsYWdfd2Fybl9zdXBwcmVzc19pbnN0cnVjdGlvbnN3YXApCi0JICAgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotCSAgaW5zbiA9IEZNMTAgfCAoaW5zbjIgPDwgMTUpIHwgaW5zbjE7ICAKLQl9Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIikpOwotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoJLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMi0+dW5pdCAhPSBNVSkKLQlpbnNuID0gRk0xMCB8IChpbnNuMSA8PCAxNSkgfCBpbnNuMjsKLSAgICAgIGVsc2UgaWYgKG9wY29kZTEtPnVuaXQgPT0gSVUgfHwgb3Bjb2RlMS0+dW5pdCA9PSBFSVRIRVIpCi0JewotICAgICAgICAgIGlmICghZmxhZ193YXJuX3N1cHByZXNzX2luc3RydWN0aW9uc3dhcCkKLQkgICAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0JICBpbnNuID0gRk0wMSB8IChpbnNuMiA8PCAxNSkgfCBpbnNuMTsgIAotCX0KLSAgICAgIGVsc2UKLQlhc19mYXRhbCAoXygiTVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgcmlnaHQgY29udGFpbmVyIikpOwotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygidW5rbm93biBleGVjdXRpb24gdHlwZSBwYXNzZWQgdG8gd3JpdGVfMl9zaG9ydCgpIikpOwotICAgIH0KLQotICBmID0gZnJhZ19tb3JlKDQpOwotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLQotICBmb3IgKGo9MDsgajwyOyBqKyspIAotICAgIHsKLSAgICAgIGZvciAoaT0wOyBpIDwgZngtPmZjOyBpKyspIAotCXsKLQkgIGlmIChmeC0+Zml4W2ldLnJlbG9jKQotCSAgICB7Ci0JICAgICAgd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7IAotCSAgICAgIGlmIChmeC0+Zml4W2ldLnNpemUgPT0gMikKLQkJd2hlcmUgKz0gMjsKLQkgICAgICAKLQkgICAgICBpZiAoIChmeC0+Zml4W2ldLnJlbG9jID09IEJGRF9SRUxPQ19EMTBWXzEwX1BDUkVMX1IpICYmIChqID09IDApICkKLQkJZngtPmZpeFtpXS5vcGVyYW5kIHw9IDEwMjQ7Ci0JICAgICAgCi0JICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MgPT0gQkZEX1JFTE9DX0QxMFZfMTgpCi0JCWZ4LT5maXhbaV0ub3BlcmFuZCB8PSA0MDk2OwkgIAotCi0JICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgd2hlcmUsIAotCQkJICAgZngtPmZpeFtpXS5zaXplLAotCQkJICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCQkgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkJICAgZngtPmZpeFtpXS5vcGVyYW5kfDIwNDgpOwotCSAgICB9Ci0JfQotICAgICAgZngtPmZjID0gMDsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0KLS8qIENoZWNrIDIgaW5zdHJ1Y3Rpb25zIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBjYW4gYmUgc2FmZWx5ICovCi0vKiBleGVjdXRlZCBpbiBwYXJhbGxlbC4gIFJldHVybnMgMSBpZiB0aGV5IGNhbiBiZS4gICAgICAgICAqLwotc3RhdGljIGludAotcGFyYWxsZWxfb2sgKG9wMSwgaW5zbjEsIG9wMiwgaW5zbjIsIGV4ZWNfdHlwZSkKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDEsICpvcDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBpbnQgZXhlY190eXBlOwotewotICBpbnQgaSwgaiwgZmxhZ3MsIG1hc2ssIHNoaWZ0LCByZWdubzsKLSAgdW5zaWduZWQgbG9uZyBpbnMsIG1vZFsyXSwgdXNlZFsyXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKLQotICBpZiAoKG9wMS0+ZXhlY190eXBlICYgU0VRKSAhPSAwIHx8IChvcDItPmV4ZWNfdHlwZSAmIFNFUSkgIT0gMAotICAgICAgfHwgKG9wMS0+ZXhlY190eXBlICYgUEFSKSA9PSAwIHx8IChvcDItPmV4ZWNfdHlwZSAmIFBBUikgPT0gMAotICAgICAgfHwgKG9wMS0+dW5pdCA9PSBCT1RIKSB8fCAob3AyLT51bml0ID09IEJPVEgpCi0gICAgICB8fCAob3AxLT51bml0ID09IElVICYmIG9wMi0+dW5pdCA9PSBJVSkKLSAgICAgIHx8IChvcDEtPnVuaXQgPT0gTVUgJiYgb3AyLT51bml0ID09IE1VKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaXMgYSBicmFuY2ggYW5kIHRoaXMgaXMgYXV0byBwYXJhbGxhemF0aW9uLAotICAgICBkb24ndCBjb21iaW5lIHdpdGggYW55IHNlY29uZCBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChleGVjX3R5cGUgPT0gMCAmJiAob3AxLT5leGVjX3R5cGUgJiBCUkFOQ0gpICE9IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogVGhlIGlkZWEgaGVyZSBpcyB0byBjcmVhdGUgdHdvIHNldHMgb2YgYml0bWFza3MgKG1vZCBhbmQgdXNlZCkKLSAgICAgd2hpY2ggaW5kaWNhdGUgd2hpY2ggcmVnaXN0ZXJzIGFyZSBtb2RpZmllZCBvciB1c2VkIGJ5IGVhY2gKLSAgICAgaW5zdHJ1Y3Rpb24uICBUaGUgb3BlcmF0aW9uIGNhbiBvbmx5IGJlIGRvbmUgaW4gcGFyYWxsZWwgaWYKLSAgICAgaW5zdHJ1Y3Rpb24gMSBhbmQgaW5zdHJ1Y3Rpb24gMiBtb2RpZnkgZGlmZmVyZW50IHJlZ2lzdGVycywgYW5kCi0gICAgIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtb2RpZnkgcmVnaXN0ZXJzIHRoYXQgdGhlIHNlY29uZAotICAgICBpcyB1c2luZyAoVGhlIHNlY29uZCBpbnN0cnVjdGlvbiBjYW4gbW9kaWZ5IHJlZ2lzdGVycyB0aGF0IHRoZQotICAgICBmaXJzdCBpcyB1c2luZyBhcyB0aGV5IGFyZSBvbmx5IHdyaXR0ZW4gYmFjayBhZnRlciB0aGUgZmlyc3QKLSAgICAgaW5zdHJ1Y3Rpb24gaGFzIGNvbXBsZXRlZCkuICBBY2Nlc3NlcyB0byBjb250cm9sIHJlZ2lzdGVycywgUFNXLAotICAgICBhbmQgbWVtb3J5IGFyZSB0cmVhdGVkIGFzIGFjY2Vzc2VzIHRvIGEgc2luZ2xlIHJlZ2lzdGVyLiAgU28gaWYKLSAgICAgYm90aCBpbnN0cnVjdGlvbnMgd3JpdGUgbWVtb3J5IG9yIGlmIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3cml0ZXMKLSAgICAgbWVtb3J5IGFuZCB0aGUgc2Vjb25kIHJlYWRzLCB0aGVuIHRoZXkgY2Fubm90IGJlIGRvbmUgaW4KLSAgICAgcGFyYWxsZWwuICBMaWtld2lzZSwgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIG11Y2tzIHdpdGggdGhlIHBzdwotICAgICBhbmQgdGhlIHNlY29uZCByZWFkcyB0aGUgUFNXICh3aGljaCBpbmNsdWRlcyBDLCBGMCwgYW5kIEYxKSwgdGhlbgotICAgICB0aGV5IGNhbm5vdCBvcGVyYXRlIHNhZmVseSBpbiBwYXJhbGxlbC4gKi8KLQotICAvKiB0aGUgYml0bWFza3MgKG1vZCBhbmQgdXNlZCkgbG9vayBsaWtlIHRoaXMgKGJpdCAzMSA9IE1TQikgKi8KLSAgLyogcjAtcjE1CSAgMC0xNSAgKi8KLSAgLyogYTAtYTEJICAxNi0xNyAqLwotICAvKiBjciAobm90IHBzdykgMTggICAgKi8KLSAgLyogcHN3CSAgMTkgICAgKi8KLSAgLyogbWVtCSAgMjAgICAgKi8KLQotICBmb3IgKGo9MDtqPDI7aisrKQotICAgIHsKLSAgICAgIGlmIChqID09IDApCi0JewotCSAgb3AgPSBvcDE7Ci0JICBpbnMgPSBpbnNuMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3AgPSBvcDI7Ci0JICBpbnMgPSBpbnNuMjsKLQl9Ci0gICAgICBtb2Rbal0gPSB1c2VkW2pdID0gMDsKLSAgICAgIGlmIChvcC0+ZXhlY190eXBlICYgQlJBTkNIX0xJTkspCi0JbW9kW2pdIHw9IDEgPDwgMTM7Ci0KLSAgICAgIGZvciAoaSA9IDA7IG9wLT5vcGVyYW5kc1tpXTsgaSsrKQotCXsKLQkgIGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgc2hpZnQgPSBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV0uc2hpZnQ7Ci0JICBtYXNrID0gMHg3RkZGRkZGRiA+PiAoMzEgLSBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV0uYml0cyk7Ci0JICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkgICAgewotCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiBtYXNrOwotCSAgICAgIGlmIChmbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQkJcmVnbm8gKz0gMTY7Ci0JICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpCS8qIG12dGMgb3IgbXZmYyAqLwotCQl7IAotCQkgIGlmIChyZWdubyA9PSAwKQotCQkgICAgcmVnbm8gPSAxOTsKLQkJICBlbHNlCi0JCSAgICByZWdubyA9IDE4OyAKLQkJfQotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgKE9QRVJBTkRfRkZMQUd8T1BFUkFORF9DRkxBRykpCi0JCXJlZ25vID0gMTk7Ci0JICAgICAgCi0JICAgICAgaWYgKCBmbGFncyAmIE9QRVJBTkRfREVTVCApCi0JCXsKLQkJICBtb2Rbal0gfD0gMSA8PCByZWdubzsKLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0VWRU4pCi0JCSAgICBtb2Rbal0gfD0gMSA8PCAocmVnbm8gKyAxKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHVzZWRbal0gfD0gMSA8PCByZWdubyA7Ci0JCSAgaWYgKGZsYWdzICYgT1BFUkFORF9FVkVOKQotCQkgICAgdXNlZFtqXSB8PSAxIDw8IChyZWdubyArIDEpOwotCi0JCSAgLyogQXV0byBpbmMvZGVjIGFsc28gbW9kaWZpZXMgdGhlIHJlZ2lzdGVyLiAgKi8KLQkJICBpZiAob3AtPm9wZXJhbmRzW2krMV0gIT0gMAotCQkgICAgICAmJiAoZDEwdl9vcGVyYW5kc1tvcC0+b3BlcmFuZHNbaSsxXV0uZmxhZ3MKLQkJCSAgJiAoT1BFUkFORF9QTFVTIHwgT1BFUkFORF9NSU5VUykpICE9IDApCi0JCSAgICBtb2Rbal0gfD0gMSA8PCByZWdubzsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfQVRNSU5VUykKLQkgICAgewotCSAgICAgIC8qIFNQIGltcGxpY2l0bHkgdXNlZC9tb2RpZmllZCAqLwotCSAgICAgIG1vZFtqXSB8PSAxIDw8IDE1OwotCSAgICAgIHVzZWRbal0gfD0gMSA8PCAxNTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChvcC0+ZXhlY190eXBlICYgUk1FTSkKLQl1c2VkW2pdIHw9IDEgPDwgMjA7Ci0gICAgICBlbHNlIGlmIChvcC0+ZXhlY190eXBlICYgV01FTSkKLQltb2Rbal0gfD0gMSA8PCAyMDsKLSAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBSRjApCi0JdXNlZFtqXSB8PSAxIDw8IDE5OwotICAgICAgZWxzZSBpZiAob3AtPmV4ZWNfdHlwZSAmIFdGMCkKLQltb2Rbal0gfD0gMSA8PCAxOTsKLSAgICAgIGVsc2UgaWYgKG9wLT5leGVjX3R5cGUgJiBXQ0FSKQotCW1vZFtqXSB8PSAxIDw8IDE5OwotICAgIH0KLSAgaWYgKChtb2RbMF0gJiBtb2RbMV0pID09IDAgJiYgKG1vZFswXSAmIHVzZWRbMV0pID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBzdHIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUtZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0IHRoZSBmcmFncy9ieXRlcyAKLSAgIGl0IGFzc2VtYmxlcyB0by4gIEZvciB0aGUgRDEwViwgaXQgbW9zdGx5IGhhbmRsZXMgdGhlIHNwZWNpYWwgVkxJVyBwYXJzaW5nIGFuZCBwYWNraW5nCi0gICBhbmQgbGVhdmVzIHRoZSBkaWZmaWN1bHQgc3R1ZmYgdG8gZG9fYXNzZW1ibGUoKS4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2luc247Ci1zdGF0aWMgc3RydWN0IGQxMHZfb3Bjb2RlICpwcmV2X29wY29kZSA9IDA7Ci1zdGF0aWMgc3Vic2VnVCBwcmV2X3N1YnNlZzsKLXN0YXRpYyBzZWdUIHByZXZfc2VnID0gMDs7Ci1zdGF0aWMgaW50IGV0eXBlID0gMDsJCS8qIHNhdmVkIGV4dHlwZS4gIHVzZWQgZm9yIG11bHRpbGluZSBpbnN0cnVjdGlvbnMgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKiBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgaW50IGV4dHlwZSA9IDA7CQkvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwsIGV0YyAqLwotICBjaGFyICogc3RyMjsKLQotICBpZiAoZXR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBsb29rIGZvciB0aGUgc3BlY2lhbCBtdWx0aXBsZSBpbnN0cnVjdGlvbiBzZXBhcmF0b3JzICovCi0gICAgICBzdHIyID0gc3Ryc3RyIChzdHIsICJ8fCIpOwotICAgICAgaWYgKHN0cjIpIAotCWV4dHlwZSA9IDE7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyMiA9IHN0cnN0ciAoc3RyLCAiLT4iKTsKLQkgIGlmIChzdHIyKSAKLQkgICAgZXh0eXBlID0gMjsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIjwtIik7Ci0JICAgICAgaWYgKHN0cjIpIAotCQlleHR5cGUgPSAzOwotCSAgICB9Ci0JfQotICAgICAgLyogc3RyMiBwb2ludHMgdG8gdGhlIHNlcGFyYXRvciwgaWYgb25lICovCi0gICAgICBpZiAoc3RyMikgCi0JewotCSAgKnN0cjIgPSAwOwotCSAgCi0JICAvKiBpZiB0d28gaW5zdHJ1Y3Rpb25zIGFyZSBwcmVzZW50IGFuZCB3ZSBhbHJlYWR5IGhhdmUgb25lIHNhdmVkCi0JICAgICB0aGVuIGZpcnN0IHdyaXRlIGl0IG91dCAqLwotCSAgZDEwdl9jbGVhbnVwICgpOwotCSAgCi0JICAvKiBhc3NlbWJsZSBmaXJzdCBpbnN0cnVjdGlvbiBhbmQgc2F2ZSBpdCAqLwotCSAgcHJldl9pbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJnByZXZfb3Bjb2RlKTsKLQkgIGlmIChwcmV2X2luc24gPT0gLTEpCi0JICAgIGFzX2ZhdGFsIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0JICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7Ci0JICBzdHIgPSBzdHIyICsgMjsKLQl9Ci0gICAgfQotCi0gIGluc24gPSBkb19hc3NlbWJsZSAoc3RyLCAmb3Bjb2RlKTsKLSAgaWYgKGluc24gPT0gLTEpCi0gICAgewotICAgICAgaWYgKGV4dHlwZSkKLQl7Ci0JICBldHlwZSA9IGV4dHlwZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhc19mYXRhbCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLQotICBpZiAoZXR5cGUpCi0gICAgewotICAgICAgZXh0eXBlID0gZXR5cGU7Ci0gICAgICBldHlwZSA9IDA7Ci0gICAgfQotCi0gIC8qIGlmIHRoaXMgaXMgYSBsb25nIGluc3RydWN0aW9uLCB3cml0ZSBpdCBhbmQgYW55IHByZXZpb3VzIHNob3J0IGluc3RydWN0aW9uICovCi0gIGlmIChvcGNvZGUtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSAKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlKSAKLQlhc19mYXRhbCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgZDEwdl9jbGVhbnVwICgpOwotICAgICAgd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmaXh1cHMpOwotICAgICAgcHJldl9vcGNvZGUgPSBOVUxMOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGlmIChwcmV2X29wY29kZSAmJiBwcmV2X3NlZyAmJiAoKHByZXZfc2VnICE9IG5vd19zZWcpIHx8IChwcmV2X3N1YnNlZyAhPSBub3dfc3Vic2VnKSkpCi0gICAgZDEwdl9jbGVhbnVwKCk7Ci0gIAotICBpZiAocHJldl9vcGNvZGUgJiYgKHdyaXRlXzJfc2hvcnQgKHByZXZfb3Bjb2RlLCBwcmV2X2luc24sIG9wY29kZSwgaW5zbiwgZXh0eXBlLCBmaXh1cHMpID09IDApKSAKLSAgICB7Ci0gICAgICAvKiBubyBpbnN0cnVjdGlvbnMgc2F2ZWQgKi8KLSAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlKSAKLQlhc19mYXRhbCAoXygiVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkIikpOwotICAgICAgLyogc2F2ZSBvZmYgbGFzdCBpbnN0cnVjdGlvbiBzbyBpdCBtYXkgYmUgcGFja2VkIG9uIG5leHQgcGFzcyAqLwotICAgICAgcHJldl9vcGNvZGUgPSBvcGNvZGU7Ci0gICAgICBwcmV2X2luc24gPSBpbnNuOwotICAgICAgcHJldl9zZWcgPSBub3dfc2VnOwotICAgICAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotICAgIH0KLX0KLQotCi0vKiBkb19hc3NlbWJsZSBhc3NlbWJsZXMgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gYW5kIHJldHVybnMgYW4gb3Bjb2RlICovCi0vKiBpdCByZXR1cm5zIC0xIChhbiBpbnZhbGlkIG9wY29kZSkgb24gZXJyb3IgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWRvX2Fzc2VtYmxlIChzdHIsIG9wY29kZSkgCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc3RydWN0IGQxMHZfb3Bjb2RlICoqb3Bjb2RlOwotewotICB1bnNpZ25lZCBjaGFyICpvcF9zdGFydCwgKnNhdmU7Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKLSAgY2hhciBuYW1lWzIwXTsKLSAgaW50IG5sZW4gPSAwOwotICBleHByZXNzaW9uUyBteW9wc1s2XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZSBlbmQuICAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gKHVuc2lnbmVkIGNoYXIgKikgKHN0cik7Ci0gICAgICAgKm9wX2VuZAotICAgICAgICYmIG5sZW4gPCAyMAotICAgICAgICYmICFpc19lbmRfb2ZfbGluZVsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBuYW1lW25sZW5dID0gdG9sb3dlciAob3Bfc3RhcnRbbmxlbl0pOwotICAgICAgbmxlbisrOwotICAgIH0KLSAgbmFtZVtubGVuXSA9IDA7Ci0KLSAgaWYgKG5sZW4gPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0gIAotICAvKiBGaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUuICAqLwotICAqb3Bjb2RlID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWhhc2hfZmluZCAoZDEwdl9oYXNoLCBuYW1lKTsKLSAgaWYgKCpvcGNvZGUgPT0gTlVMTCkKLSAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIG9wY29kZTogJXMiKSxuYW1lKTsKLQotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcF9lbmQ7Ci0gICpvcGNvZGUgPSBmaW5kX29wY29kZSAoKm9wY29kZSwgbXlvcHMpOwotICBpZiAoKm9wY29kZSA9PSAwKQotICAgIHJldHVybiAtMTsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLQotICBpbnNuID0gYnVpbGRfaW5zbiAoKCpvcGNvZGUpLCBteW9wcywgMCk7IAotICByZXR1cm4gKGluc24pOwotfQotCi0vKiBGaW5kIHRoZSBzeW1ib2wgd2hpY2ggaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHJlZ2lzdGVyIGluIHRoZSBnaXZlbiBleHByZXNzaW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICoKLWZpbmRfc3ltYm9sX21hdGNoaW5nX3JlZ2lzdGVyIChleHApCi0gICAgIGV4cHJlc3Npb25TICogZXhwOwotewotICBpbnQgaTsKLSAgCi0gIGlmIChleHAtPlhfb3AgIT0gT19yZWdpc3RlcikKLSAgICByZXR1cm4gTlVMTDsKLSAgCi0gIC8qIEZpbmQgdGhlIG5hbWUgb2YgdGhlIHJlZ2lzdGVyLiAgKi8KLSAgZm9yIChpID0gZDEwdl9yZWdfbmFtZV9jbnQgKCk7IGktLTspCi0gICAgaWYgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgW2ldLnZhbHVlID09IGV4cC0+WF9hZGRfbnVtYmVyKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGkgPCAwKQotICAgIGFib3J0ICgpOwotCi0gIC8qIE5vdyBzZWUgaWYgYSBzeW1ib2wgaGFzIGJlZW4gZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUuICAqLwotICByZXR1cm4gc3ltYm9sX2ZpbmQgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgW2ldLm5hbWUpOwotfQotCi0KLS8qIGZpbmRfb3Bjb2RlKCkgZ2V0cyBhIHBvaW50ZXIgdG8gYW4gZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZS4gICAgICAgKi8KLS8qIEl0IG11c3QgbG9vayBhdCBhbGwgb3Bjb2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHVzZSB0aGUgb3BlcmFuZHMgKi8KLS8qIHRvIGNob29zZSB0aGUgY29ycmVjdCBvcGNvZGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZDEwdl9vcGNvZGUgKgotZmluZF9vcGNvZGUgKG9wY29kZSwgbXlvcHMpCi0gICAgIHN0cnVjdCBkMTB2X29wY29kZSAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyBteW9wc1tdOwotewotICBpbnQgaSwgbWF0Y2gsIGRvbmU7Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqbmV4dF9vcGNvZGU7Ci0KLSAgLyogZ2V0IGFsbCB0aGUgb3BlcmFuZHMgYW5kIHNhdmUgdGhlbSBhcyBleHByZXNzaW9ucyAqLwotICBnZXRfb3BlcmFuZHMgKG15b3BzKTsKLQotICAvKiBub3cgc2VlIGlmIHRoZSBvcGVyYW5kIGlzIGEgZmFrZS4gIElmIHNvLCBmaW5kIHRoZSBjb3JyZWN0IHNpemUgKi8KLSAgLyogaW5zdHJ1Y3Rpb24sIGlmIHBvc3NpYmxlICovCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBPUENPREVfRkFLRSkKLSAgICB7Ci0gICAgICBpbnQgb3BudW0gPSBvcGNvZGUtPm9wZXJhbmRzWzBdOwotICAgICAgaW50IGZsYWdzOwotCQkJIAotICAgICAgaWYgKG15b3BzW29wbnVtXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgbXlvcHNbb3BudW1dLlhfb3AgPSBPX3N5bWJvbDsKLQkgIG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW29wbnVtXS5YX29wX3N5bWJvbCk7Ci0JICBteW9wc1tvcG51bV0uWF9hZGRfbnVtYmVyID0gMDsKLQkgIG15b3BzW29wbnVtXS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBuZXh0X29wY29kZT1vcGNvZGUrMTsKLQotICAgICAgLyogSWYgdGhlIGZpcnN0IG9wZXJhbmQgaXMgc3VwcG9zZWQgdG8gYmUgYSByZWdpc3RlciwgbWFrZSBzdXJlCi0JIHdlIGdvdCBhIHZhbGlkIG9uZS4gICovCi0gICAgICBmbGFncyA9IGQxMHZfb3BlcmFuZHNbbmV4dF9vcGNvZGUtPm9wZXJhbmRzWzBdXS5mbGFnczsKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCXsKLQkgIGludCBYX29wID0gbXlvcHNbMF0uWF9vcDsKLQkgIGludCBudW0gPSBteW9wc1swXS5YX2FkZF9udW1iZXI7Ci0KLQkgIGlmIChYX29wICE9IE9fcmVnaXN0ZXIKLQkgICAgICB8fCAobnVtICYgfmZsYWdzCi0JCSAgJiAoT1BFUkFORF9HUFIgfCBPUEVSQU5EX0FDQzAgfCBPUEVSQU5EX0FDQzEKLQkJICAgICB8IE9QRVJBTkRfRkZMQUcgfCBPUEVSQU5EX0NGTEFHIHwgT1BFUkFORF9DT05UUk9MKSkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiKSk7Ci0JICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmIChteW9wc1tvcG51bV0uWF9vcCA9PSBPX2NvbnN0YW50IHx8IChteW9wc1tvcG51bV0uWF9vcCA9PSBPX3N5bWJvbCAmJgotCSAgU19JU19ERUZJTkVEKG15b3BzW29wbnVtXS5YX2FkZF9zeW1ib2wpICYmCi0JICAoU19HRVRfU0VHTUVOVChteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnKSkpCi0JewotCSAgZm9yIChpPTA7IG9wY29kZS0+b3BlcmFuZHNbaSsxXTsgaSsrKQotCSAgICB7Ci0JICAgICAgaW50IGJpdHMgPSBkMTB2X29wZXJhbmRzW25leHRfb3Bjb2RlLT5vcGVyYW5kc1tvcG51bV1dLmJpdHM7Ci0JICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tuZXh0X29wY29kZS0+b3BlcmFuZHNbb3BudW1dXS5mbGFnczsKLQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JCWJpdHMgKz0gMjsKLQkgICAgICBpZiAobXlvcHNbb3BudW1dLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIGlmICghY2hlY2tfcmFuZ2UgKG15b3BzW29wbnVtXS5YX2FkZF9udW1iZXIsIGJpdHMsIGZsYWdzKSkKLQkJICAgIHJldHVybiBuZXh0X29wY29kZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdTICpmOwotCQkgIGxvbmcgdmFsdWU7Ci0JCSAgLyogY2FsY3VsYXRlIHRoZSBjdXJyZW50IGFkZHJlc3MgYnkgcnVubmluZyB0aHJvdWdoIHRoZSBwcmV2aW91cyBmcmFncyAqLwotCQkgIC8qIGFuZCBhZGRpbmcgb3VyIGN1cnJlbnQgb2Zmc2V0ICovCi0JCSAgZm9yICh2YWx1ZSA9IDAsIGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmOyBmID0gZi0+ZnJfbmV4dCkKLQkJICAgIHZhbHVlICs9IGYtPmZyX2ZpeCArIGYtPmZyX29mZnNldDsKLQotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUREUikKLQkJICAgIHZhbHVlID0gU19HRVRfVkFMVUUobXlvcHNbb3BudW1dLlhfYWRkX3N5bWJvbCkgLSB2YWx1ZSAtCi0JCSAgICAgIChvYnN0YWNrX25leHRfZnJlZSgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7Ci0JCSAgZWxzZQotCQkgICAgdmFsdWUgPSBTX0dFVF9WQUxVRShteW9wc1tvcG51bV0uWF9hZGRfc3ltYm9sKTsKLQotCQkgIGlmIChBVF9XT1JEX1AgKCZteW9wc1tvcG51bV0pKQotCQkgICAgewotCQkgICAgICBpZiAoYml0cyA+IDQpCi0JCQl7Ci0JCQkgIGJpdHMgKz0gMjsKLQkJCSAgaWYgKCFjaGVja19yYW5nZSAodmFsdWUsIGJpdHMsIGZsYWdzKSkKLQkJCSAgICByZXR1cm4gbmV4dF9vcGNvZGU7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoIWNoZWNrX3JhbmdlICh2YWx1ZSwgYml0cywgZmxhZ3MpKQotCQkgICAgcmV0dXJuIG5leHRfb3Bjb2RlOwotCQl9Ci0JICAgICAgbmV4dF9vcGNvZGUrKzsKLQkgICAgfQotCSAgYXNfZmF0YWwgKF8oInZhbHVlIG91dCBvZiByYW5nZSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogbm90IGEgY29uc3RhbnQsIHNvIHVzZSBhIGxvbmcgaW5zdHJ1Y3Rpb24gKi8gICAgCi0JICByZXR1cm4gb3Bjb2RlKzI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIC8qIG5vdyBzZWFyY2ggdGhlIG9wY29kZSB0YWJsZSB0YWJsZSBmb3Igb25lIHdpdGggb3BlcmFuZHMgKi8KLSAgICAgIC8qIHRoYXQgbWF0Y2hlcyB3aGF0IHdlJ3ZlIGdvdCAqLwotICAgICAgd2hpbGUgKCFtYXRjaCkKLQl7Ci0JICBtYXRjaCA9IDE7Ci0JICBmb3IgKGkgPSAwOyBvcGNvZGUtPm9wZXJhbmRzW2ldOyBpKyspIAotCSAgICB7Ci0JICAgICAgaW50IGZsYWdzID0gZDEwdl9vcGVyYW5kc1tvcGNvZGUtPm9wZXJhbmRzW2ldXS5mbGFnczsKLQkgICAgICBpbnQgWF9vcCA9IG15b3BzW2ldLlhfb3A7Ci0JICAgICAgaW50IG51bSA9IG15b3BzW2ldLlhfYWRkX251bWJlcjsKLQotCSAgICAgIGlmIChYX29wID09IDApCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAKLQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkJewotCQkgIGlmICgoWF9vcCAhPSBPX3JlZ2lzdGVyKQotCQkgICAgICB8fCAobnVtICYgfmZsYWdzCi0JCQkgICYgKE9QRVJBTkRfR1BSIHwgT1BFUkFORF9BQ0MwIHwgT1BFUkFORF9BQ0MxCi0JCQkgICAgIHwgT1BFUkFORF9GRkxBRyB8IE9QRVJBTkRfQ0ZMQUcKLQkJCSAgICAgfCBPUEVSQU5EX0NPTlRST0wpKSkKLQkJICAgIHsKLQkJICAgICAgbWF0Y2ggPSAwOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIAotCSAgICAgIGlmICgoKGZsYWdzICYgT1BFUkFORF9NSU5VUykgICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9NSU5VUykpKSB8fAotCQkgICgoZmxhZ3MgJiBPUEVSQU5EX1BMVVMpICAgICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBPUEVSQU5EX1BMVVMpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9BVE1JTlVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9BVE1JTlVTKSkpIHx8Ci0JCSAgKChmbGFncyAmIE9QRVJBTkRfQVRQQVIpICAgJiYgKChYX29wICE9IE9fYWJzZW50KSB8fCAobnVtICE9IE9QRVJBTkRfQVRQQVIpKSkgfHwKLQkJICAoKGZsYWdzICYgT1BFUkFORF9BVFNJR04pICAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gT1BFUkFORF9BVFNJR04pKSkpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAKLQkgICAgICAvKiBVbmZvcnR1bmF0bHksIGZvciB0aGUgaW5kaXJlY3Qgb3BlcmFuZCBpbiBpbnN0cnVjdGlvbnMgc3VjaCBhcwotCQkgYGBsZGIgcjEsIEAoYyxyMTQpJycgdGhpcyBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIFhfb3AgPT0gT19yZWdpc3RlcgotCQkgKGJlY2F1c2UgJ2MnIGlzIGEgdmFsaWQgcmVnaXN0ZXIgbmFtZSkuICBIb3dldmVyIHdlIGNhbm5vdCBqdXN0Ci0JCSBpZ25vcmUgdGhlIGNhc2Ugd2hlbiBYX29wID09IE9fcmVnaXN0ZXIgYnV0IGZsYWdzICYgT1BFUkFORF9SRUcgaXMKLQkJIG51bGwsIHNvIHdlIGNoZWNrIHRvIHNlZSBpZiBhIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lIGFzIHRoZSByZWdpc3RlcgotCQkgZXhpc3RzLiAgSWYgdGhlIHN5bWJvbCBkb2VzIGV4aXN0LCB0aGVuIHRoZSBwYXJzZXIgd2FzIHVuYWJsZSB0bwotCQkgZGlzdGluZ3Vpc2ggdGhlIHR3byBjYXNlcyBhbmQgd2UgZml4IHRoaW5ncyBoZXJlLiAgKFJlZjogUFIxNDgyNikgKi8KLQkgICAgICAKLQkgICAgICBpZiAoIShmbGFncyAmIE9QRVJBTkRfUkVHKSAmJiAoWF9vcCA9PSBPX3JlZ2lzdGVyKSkKLQkJewotCQkgIHN5bWJvbFMgKiBzeW07Ci0JCSAgCi0JCSAgc3ltID0gZmluZF9zeW1ib2xfbWF0Y2hpbmdfcmVnaXN0ZXIgKCYgbXlvcHNbaV0pOwotCQkgIAotCQkgIGlmIChzeW0gIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgbXlvcHMgW2ldLlhfb3AgPT0gWF9vcCA9PSBPX3N5bWJvbDsKLQkJICAgICAgbXlvcHMgW2ldLlhfYWRkX3N5bWJvbCA9IHN5bTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhc19iYWQKLQkJICAgICAgKF8oImlsbGVnYWwgb3BlcmFuZCAtIHJlZ2lzdGVyIG5hbWUgZm91bmQgd2hlcmUgbm9uZSBleHBlY3RlZCIpKTsKLQkJfQotCSAgICB9Ci0JICAKLQkgIC8qIFdlJ3JlIG9ubHkgZG9uZSBpZiB0aGUgb3BlcmFuZHMgbWF0Y2hlZCBzbyBmYXIgQU5EIHRoZXJlCi0JICAgICBhcmUgbm8gbW9yZSB0byBjaGVjay4gICovCi0JICBpZiAobWF0Y2ggJiYgbXlvcHNbaV0uWF9vcCA9PSAwKSAKLQkgICAgYnJlYWs7Ci0JICBlbHNlCi0JICAgIG1hdGNoID0gMDsKLQotCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOwotCSAgCi0JICBpZiAobmV4dF9vcGNvZGUtPm9wY29kZSA9PSAwKSAKLQkgICAgYnJlYWs7Ci0JICAKLQkgIGlmIChzdHJjbXAgKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQotCSAgICBicmVhazsKLQkgIAotCSAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0JfQotICAgIH0KLQotICBpZiAoIW1hdGNoKSAgCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCBhbGwgcmVnaXN0ZXJzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIGV2ZW4gYXJlLiAqLwotICAvKiBBbHNvLCBpZiBhbnkgb3BlcmFuZHMgd2VyZSBtYXJrZWQgYXMgcmVnaXN0ZXJzLCBidXQgd2VyZSByZWFsbHkgc3ltYm9scyAqLwotICAvKiBmaXggdGhhdCBoZXJlLiAqLwotICBmb3IgKGk9MDsgb3Bjb2RlLT5vcGVyYW5kc1tpXTsgaSsrKSAKLSAgICB7Ci0gICAgICBpZiAoKGQxMHZfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBPUEVSQU5EX0VWRU4pICYmCi0JICAobXlvcHNbaV0uWF9hZGRfbnVtYmVyICYgMSkpIAotCWFzX2ZhdGFsIChfKCJSZWdpc3RlciBudW1iZXIgbXVzdCBiZSBFVkVOIikpOwotICAgICAgaWYgKG15b3BzW2ldLlhfb3AgPT0gT19yZWdpc3RlcikKLQl7Ci0JICBpZiAoIShkMTB2X29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgT1BFUkFORF9SRUcpKSAKLQkgICAgewotCSAgICAgIG15b3BzW2ldLlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9zeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlICgoY2hhciAqKW15b3BzW2ldLlhfb3Bfc3ltYm9sKTsKLQkgICAgICBteW9wc1tpXS5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIG15b3BzW2ldLlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiBvcGNvZGU7Ci19Ci0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9vZmZzZXQ7Ci0KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHNlZ1Qgc2VjOwotewotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKilOVUxMICYmICghU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkgfHwKLSAgICAgIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjKSkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgY2hhciAqd2hlcmU7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgbG9uZyB2YWx1ZTsKLSAgaW50IG9wX3R5cGU7Ci0gIGludCBsZWZ0PTA7Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgdmFsdWUgPSAqdmFsdWVwOwotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKLSAgICAgIGlmIChmaXhwLT5meF9zdWJzeSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCXsKLQkgIGlmIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLwotIAkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgb3BfdHlwZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgaWYgKG9wX3R5cGUgJiAyMDQ4KQotICAgIHsKLSAgICAgIG9wX3R5cGUgLT0gMjA0ODsKLSAgICAgIGlmIChvcF90eXBlICYgMTAyNCkKLQl7Ci0JICBvcF90eXBlIC09IDEwMjQ7Ci0JICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MOwotCSAgbGVmdCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAob3BfdHlwZSAmIDQwOTYpCi0JewotCSAgb3BfdHlwZSAtPSA0MDk2OwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0QxMFZfMTg7Ci0JfQotICAgICAgZWxzZQotCWZpeHAtPmZ4X3JfdHlwZSA9IGdldF9yZWxvYygoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wX3R5cGVdKTsgCi0gICAgfQotCi0gIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0gICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfRDEwVl8xMF9QQ1JFTF9MOgotICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMTBfUENSRUxfUjoKLSAgICBjYXNlIEJGRF9SRUxPQ19EMTBWXzE4X1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DX0QxMFZfMTg6Ci0gICAgICAvKiBpbnN0cnVjdGlvbiBhZGRyZXNzZXMgYXJlIGFsd2F5cyByaWdodC1zaGlmdGVkIGJ5IDIgKi8KLSAgICAgIHZhbHVlID4+PSBBVF9XT1JEX1JJR0hUX1NISUZUOwotICAgICAgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMikKLQliZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKnJlcCwgKnJlcGk7Ci0KLQkgIHJlcCA9IChzdHJ1Y3QgZDEwdl9vcGNvZGUgKikgaGFzaF9maW5kIChkMTB2X2hhc2gsICJyZXAiKTsKLQkgIHJlcGkgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopIGhhc2hfZmluZCAoZDEwdl9oYXNoLCAicmVwaSIpOwotCSAgaWYgKChpbnNuICYgRk0xMSkgPT0gRk0xMQotCSAgICAgICYmIChyZXBpICE9IE5VTEwgJiYgKGluc24gJiByZXBpLT5tYXNrKSA9PSByZXBpLT5vcGNvZGUKLQkJICB8fCByZXAgIT0gTlVMTCAmJiAoaW5zbiAmIHJlcC0+bWFzaykgPT0gcmVwLT5vcGNvZGUpCi0JICAgICAgJiYgdmFsdWUgPCA0KQotCSAgICBhc19mYXRhbAotCSAgICAgIChfKCJsaW5lICVkOiByZXAgb3IgcmVwaSBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgNCBpbnN0cnVjdGlvbnMiKSwKLQkgICAgICAgZml4cC0+ZnhfbGluZSk7Ci0JICBpbnNuID0gZDEwdl9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BfdHlwZSwgKG9mZnNldFQpdmFsdWUsIGxlZnQsIGZpeHApOwotCSAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsgIAotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGJmZF9wdXRiMTYgKChiZmRfdm1hKSB2YWx1ZSwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhwLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJsaW5lICVkOiB1bmtub3duIHJlbG9jYXRpb24gdHlwZTogMHgleCIpLGZpeHAtPmZ4X2xpbmUsZml4cC0+Znhfcl90eXBlKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBkMTB2X2NsZWFudXAoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGFzc2VtYmxlciBoYXMgZmluaXNoZWQgcGFyc2luZyB0aGUgaW5wdXQgCi0gICBmaWxlIG9yIGFmdGVyIGEgbGFiZWwgaXMgZGVmaW5lZC4gIEJlY2F1c2UgdGhlIEQxMFYgYXNzZW1ibGVyIHNvbWV0aW1lcyBzYXZlcyBzaG9ydCAKLSAgIGluc3RydWN0aW9ucyB0byBzZWUgaWYgaXQgY2FuIHBhY2thZ2UgdGhlbSB3aXRoIHRoZSBuZXh0IGluc3RydWN0aW9uLCB0aGVyZSBtYXkKLSAgIGJlIGEgc2hvcnQgaW5zdHJ1Y3Rpb24gdGhhdCBzdGlsbCBuZWVkcyB3cml0dGVuLiAgKi8KLWludAotZDEwdl9jbGVhbnVwICgpCi17Ci0gIHNlZ1Qgc2VnOwotICBzdWJzZWdUIHN1YnNlZzsKLQotICBpZiAocHJldl9vcGNvZGUgJiYgZXR5cGUgPT0gMCkKLSAgICB7Ci0gICAgICBzZWcgPSBub3dfc2VnOwotICAgICAgc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIGlmIChwcmV2X3NlZykKLQlzdWJzZWdfc2V0IChwcmV2X3NlZywgcHJldl9zdWJzZWcpOwotICAgICAgd3JpdGVfMV9zaG9ydCAocHJldl9vcGNvZGUsIHByZXZfaW5zbiwgZml4dXBzLT5uZXh0KTsKLSAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLSAgICAgIHByZXZfb3Bjb2RlID0gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBMaWtlIG5vcm1hbCAud29yZCwgZXhjZXB0IHN1cHBvcnQgQHdvcmQgKi8KLS8qIGNsb2JiZXJzIGlucHV0X2xpbmVfcG9pbnRlciwgY2hlY2tzIGVuZC1vZi1saW5lLiAqLwotc3RhdGljIHZvaWQKLWQxMHZfZG90X3dvcmQgKG5ieXRlcykKLSAgICAgcmVnaXN0ZXIgaW50IG5ieXRlczsJLyogMT0uYnl0ZSwgMj0ud29yZCwgND0ubG9uZyAqLwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLSAgY2hhciAqcDsKLSAgaW50IG9mZnNldDsKLQotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGV4cHJlc3Npb24gKCZleHApOwotICAgICAgaWYgKCFzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQHdvcmQiLCA1KSkKLQl7Ci0JICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSA1OwotCQotCSAgcCA9IGZyYWdfbW9yZSAoMik7Ci0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwgCi0JCSAgICAgICAmZXhwLCAwLCBCRkRfUkVMT0NfRDEwVl8xOCk7Ci0JfQotICAgICAgZWxzZQotCWVtaXRfZXhwciAoJmV4cCwgMik7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyLS07CQkvKiBQdXQgdGVybWluYXRvciBiYWNrIGludG8gc3RyZWFtLiAqLwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0KLS8qIE1pdHN1YmlzaGkgYXNrZWQgdGhhdCB3ZSBzdXBwb3J0IHNvbWUgb2xkIHN5bnRheCB0aGF0IGFwcGFyZW50bHkgKi8KLS8qIGhhZCBpbW1lZGlhdGUgb3BlcmFuZHMgc3RhcnRpbmcgd2l0aCAnIycuICBUaGlzIGlzIGluIHNvbWUgb2YgdGhlaXIgKi8KLS8qIHNhbXBsZSBjb2RlIGJ1dCBpcyBub3QgZG9jdW1lbnRlZCAoYWx0aG91Z2ggaXQgYXBwZWFycyBpbiBzb21lICAqLwotLyogZXhhbXBsZXMgaW4gdGhlaXIgYXNzZW1ibGVyIG1hbnVhbCkuIEZvciBub3csIHdlJ2xsIHNvbHZlIHRoaXMgKi8KLS8qIGNvbXBhdGliaWxpdHkgcHJvYmxlbSBieSBzaW1wbHkgaWdub3JpbmcgYW55ICcjJyBhdCB0aGUgYmVnaW5uaW5nICovCi0vKiBvZiBhbiBvcGVyYW5kLiAqLwotCi0vKiBvcGVyYW5kcyB0aGF0IGJlZ2luIHdpdGggJyMnIHNob3VsZCBmYWxsIHRocm91Z2ggdG8gaGVyZSAqLwotLyogZnJvbSBleHByLmMgKi8KLQotdm9pZCAKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcjJyAmJiAhIGRvX25vdF9pZ25vcmVfaGFzaCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICB9Ci19Ci0KLWJvb2xlYW4KLWQxMHZfZml4X2FkanVzdGFibGUgKGZpeFApCi0gICBmaXhTICpmaXhQOwotewotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcyAqLwotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotZDEwdl9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICAgc3RydWN0IGZpeCAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1kMTB2LmggYi9nYXMvY29uZmlnL3RjLWQxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZmZmQ1Yy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWQxMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIHRjLWQxMHYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtZDEwdi5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19EMTBWCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgRDEwViBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9kMTB2Ci0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItZDEwdiIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oRklYUCwgU0VDKSBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oRklYUCwgU0VDKSAgIAotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4KLQotaW50IGQxMHZfY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2FmdGVyX3Bhc3NfaG9vaygpCSAgICAgZDEwdl9jbGVhbnVwKCkKLSNkZWZpbmUgbWRfY2xlYW51cCgpCQkgICAgIGQxMHZfY2xlYW51cCgpCi0jZGVmaW5lIG1kX2RvX2FsaWduKGEsYixjLGQsZSkJICAgICBkMTB2X2NsZWFudXAoKQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgZG8ge1wKLSAgZDEwdl9jbGVhbnVwKCk7IFwKLSAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgZDEwdl9maXhfYWRqdXN0YWJsZShmaXhQKQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIGQxMHZfZm9yY2VfcmVsb2NhdGlvbihmaXhwKQotZXh0ZXJuIGludCBkMTB2X2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZDMwdi5jIGIvZ2FzL2NvbmZpZy90Yy1kMzB2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODJhNTcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1kMzB2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjE5ICswLDAgQEAKLS8qIHRjLWQzMHYuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE1pdHN1YmlzaGkgRDMwVgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS9kMzB2LmgiCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIk9uTmNDIjsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0KLSNkZWZpbmUgTk9QX01VTFRJUExZIDEKLSNkZWZpbmUgTk9QX0FMTCAyCi1zdGF0aWMgaW50IHdhcm5fbm9wcyA9IDA7Ci1zdGF0aWMgaW50IE9wdGltaXppbmcgPSAwOwotc3RhdGljIGludCB3YXJuX3JlZ2lzdGVyX25hbWVfY29uZmxpY3RzID0gMTsKLQotI2RlZmluZSBGT1JDRV9TSE9SVAkxCi0jZGVmaW5lIEZPUkNFX0xPTkcJMgotCi0vKiBFWEVDIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBfZXhlY190eXBlCi17Ci0gIEVYRUNfVU5LTk9XTiwJCQkvKiBubyBvcmRlciBzcGVjaWZpZWQgKi8KLSAgRVhFQ19QQVJBTExFTCwJCS8qIGRvbmUgaW4gcGFyYWxsZWwgKEZNPTAwKSAqLwotICBFWEVDX1NFUSwJCQkvKiBzZXF1ZW50aWFsIChGTT0wMSkgKi8KLSAgRVhFQ19SRVZTRVEJCQkvKiByZXZlcnNlIHNlcXVlbnRpYWwgKEZNPTEwKSAqLwotfSBleGVjX3R5cGVfZW51bTsKLQotLyogZml4dXBzICovCi0jZGVmaW5lIE1BWF9JTlNOX0ZJWFVQUyAoNSkKLXN0cnVjdCBkMzB2X2ZpeHVwCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IG9wZXJhbmQ7Ci0gIGludCBwY3JlbDsKLSAgaW50IHNpemU7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IF9maXh1cHMKLXsKLSAgaW50IGZjOwotICBzdHJ1Y3QgZDMwdl9maXh1cCBmaXhbTUFYX0lOU05fRklYVVBTXTsKLSAgc3RydWN0IF9maXh1cHMgKm5leHQ7Ci19IEZpeHVwczsKLQotc3RhdGljIEZpeHVwcyBGaXhVcHNbMl07Ci1zdGF0aWMgRml4dXBzICpmaXh1cHM7Ci0KLS8qIFdoZXRoZXIgY3VycmVudCBhbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gYXJlIHdvcmQgbXVsdGlwbHkgaW5zbnMuICAqLwotc3RhdGljIGludCBjdXJfbXVsMzJfcCA9IDA7Ci1zdGF0aWMgaW50IHByZXZfbXVsMzJfcCA9IDA7Ci0KLS8qICBUaGUgZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsIGlzIHRydWUgaWZmIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBhc3NlbWJsZWQKLSAgICBoYXMgYmVlbiBleHBsaWNpdGx5IHdyaXR0ZW4gYXMgYSBwYXJhbGxlbCBzaG9ydC1pbnN0cnVjdGlvbiBwYWlyIGJ5IHRoZQotICAgIGh1bWFuIHByb2dyYW1tZXIuICBJdCBpcyB1c2VkIGluIHBhcmFsbGVsX29rKCkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgotICAgIHRob3NlIGRhbmdlcm91cyBwYXJhbGxlbGl6YXRpb25zIGF0dGVtcHRlZCBieSB0aGUgaHVtYW4sIHdoaWNoIGFyZSB0byBiZQotICAgIGFsbG93ZWQsIGFuZCB0aG9zZSBhdHRlbXB0ZWQgYnkgdGhlIGFzc2VtYmxlciwgd2hpY2ggYXJlIG5vdC4gIEl0IGlzIHNldAotICAgIGZyb20gbWRfYXNzZW1ibGUoKS4gICovCi1zdGF0aWMgaW50IGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IDA7IAotc3RhdGljIGludCBmbGFnX3hwX3N0YXRlID0gMDsKLQotLyogV2hldGhlciBjdXJyZW50IGFuZCBwcmV2aW91cyBsZWZ0IHN1Yi1pbnN0cnVjdGlvbiBkaXNhYmxlcwotICAgZXhlY3V0aW9uIG9mIHJpZ2h0IHN1Yi1pbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgaW50IGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAwOwotc3RhdGljIGludCBwcmV2X2xlZnRfa2lsbHNfcmlnaHRfcCA9IDA7Ci0KLS8qIFRoZSBrbm93biBjdXJyZW50IGFsaWdubWVudCBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgZDMwdl9jdXJyZW50X2FsaWduOwotc3RhdGljIHNlZ1QgZDMwdl9jdXJyZW50X2FsaWduX3NlZzsKLQotLyogVGhlIGxhc3Qgc2VlbiBsYWJlbCBpbiB0aGUgY3VycmVudCBzZWN0aW9uLiAgVGhpcyBpcyB1c2VkIHRvIGF1dG8tYWxpZ24KLSAgIGxhYmVscyBwcmVjZWVkaW5nIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMgc3ltYm9sUyAqZDMwdl9sYXN0X2xhYmVsOwotCi0vKiBUd28gbm9wcyAqLwotI2RlZmluZSBOT1BfTEVGVCAgICgobG9uZyBsb25nKSBOT1AgPDwgMzIpCi0jZGVmaW5lIE5PUF9SSUdIVCAgKChsb25nIGxvbmcpIE5PUCkKLSNkZWZpbmUgTk9QMiAoRk0wMCB8IE5PUF9MRUZUIHwgTk9QX1JJR0hUKQotCi0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBpbnQgcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyBpbnQgY2hlY2tfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyBudW0sIGludCBiaXRzLCBpbnQgZmxhZ3MpKTsKLXN0YXRpYyBpbnQgcG9zdGZpeCBQQVJBTVMgKChjaGFyICpwKSk7Ci1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGdldF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcCwgaW50IHJlbF9mbGFnKSk7Ci1zdGF0aWMgaW50IGdldF9vcGVyYW5kcyBQQVJBTVMgKChleHByZXNzaW9uUyBleHBbXSwgaW50IGNtcF9oYWNrKSk7Ci1zdGF0aWMgc3RydWN0IGQzMHZfZm9ybWF0ICpmaW5kX2Zvcm1hdCBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9vcGNvZGUgKm9wY29kZSwgCi0JCQlleHByZXNzaW9uUyBvcHNbXSxpbnQgZnNpemUsIGludCBjbXBfaGFjaykpOwotc3RhdGljIGxvbmcgbG9uZyBidWlsZF9pbnNuIFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwgZXhwcmVzc2lvblMgKm9wZXJzKSk7Ci1zdGF0aWMgdm9pZCB3cml0ZV9sb25nIFBBUkFNUyAoKHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwgbG9uZyBsb25nIGluc24sIEZpeHVwcyAqZngpKTsKLXN0YXRpYyB2b2lkIHdyaXRlXzFfc2hvcnQgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlLCBsb25nIGxvbmcgaW5zbiwKLQkJCQkgICBGaXh1cHMgKmZ4LCBpbnQgdXNlX3NlcXVlbnRpYWwpKTsKLXN0YXRpYyBpbnQgd3JpdGVfMl9zaG9ydCBQQVJBTVMgKChzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUxLCBsb25nIGxvbmcgaW5zbjEsIAotCQkgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGUyLCBsb25nIGxvbmcgaW5zbjIsIGV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZSwgRml4dXBzICpmeCkpOwotc3RhdGljIGxvbmcgbG9uZyBkb19hc3NlbWJsZSBQQVJBTVMgKChjaGFyICpzdHIsIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZSwKLQkJCQkgICAgICBpbnQgc2hvcnRwLCBpbnQgaXNfcGFyYWxsZWwpKTsKLXN0YXRpYyBpbnQgcGFyYWxsZWxfb2sgUEFSQU1TICgoc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMSwgdW5zaWduZWQgbG9uZyBpbnNuMSwgCi0JCQkJc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMiwgdW5zaWduZWQgbG9uZyBpbnNuMiwKLQkJCQlleGVjX3R5cGVfZW51bSBleGVjX3R5cGUpKTsKLXN0YXRpYyB2b2lkIGQzMHZfbnVtYmVyX3RvX2NoYXJzIFBBUkFNUyAoKGNoYXIgKmJ1ZiwgbG9uZyBsb25nIHZhbHVlLCBpbnQgbmJ5dGVzKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19zaXplIFBBUkFNUyAoKGxvbmcgdmFsdWUsIGludCBiaXRzLCBjaGFyICpmaWxlLCBpbnQgbGluZSkpOwotc3RhdGljIHZvaWQgZDMwdl9hbGlnbiBQQVJBTVMgKChpbnQsIGNoYXIgKiwgc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBzX2QzMHZfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2QzMHZfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZDMwdl9kYXRhIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kMzB2X3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsgICAgICAgCi0KLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAid29yZCIsIGNvbnMsIDQgfSwKLSAgeyAiaHdvcmQiLCBjb25zLCAyIH0sCi0gIHsgImFsaWduIiwgc19kMzB2X2FsaWduLCAwIH0sCi0gIHsgInRleHQiLCBzX2QzMHZfdGV4dCwgMCB9LAotICB7ICJkYXRhIiwgc19kMzB2X2RhdGEsIDAgfSwKLSAgeyAic2VjdGlvbiIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3Rpb24ucyIsIHNfZDMwdl9zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QiLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0LnMiLCBzX2QzMHZfc2VjdGlvbiwgMCB9LAotICB7IE5VTEwsIE5VTEwsIDAgfQotfTsKLQotLyogT3Bjb2RlIGhhc2ggdGFibGUuICAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmQzMHZfaGFzaDsKLQotLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMKLSAgIGFycmF5IHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdfbmFtZV9jbnQgKCkgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN5bWJvbF9maW5kIChuYW1lKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHdhcm5fcmVnaXN0ZXJfbmFtZV9jb25mbGljdHMpCi0JCWFzX3dhcm4gKF8oIlJlZ2lzdGVyIG5hbWUgJXMgY29uZmxpY3RzIHdpdGggc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUiKSwKLQkJCSBuYW1lKTsKLQkgICAgfQotICAKLQkgIHJldHVybiBwcmVfZGVmaW5lZF9yZWdpc3RlcnNbbWlkZGxlXS52YWx1ZTsKLQl9Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICAKLSAgcmV0dXJuIC0xOwotfQotCi0vKiByZWdpc3Rlcl9uYW1lKCkgY2hlY2tzIHRoZSBzdHJpbmcgYXQgaW5wdXRfbGluZV9wb2ludGVyCi0gICB0byBzZWUgaWYgaXQgaXMgYSB2YWxpZCByZWdpc3RlciBuYW1lLiAgKi8KLQotc3RhdGljIGludAotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgYywgKnAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIAotICB3aGlsZSAoKnAgJiYgKnAhPSdcbicgJiYgKnAhPSdccicgJiYgKnAgIT0nLCcgJiYgKnAhPScgJyAmJiAqcCE9JyknKQotICAgIHArKzsKLQotICBjID0gKnA7Ci0gIGlmIChjKQotICAgICpwKysgPSAwOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIC8qIHRlbXBvcmFyaWx5IHN0b3JlIGEgcG9pbnRlciB0byB0aGUgc3RyaW5nIGhlcmUgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAoYykKLSAgICAqKHAtMSkgPSBjOwotICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50Ci1jaGVja19yYW5nZSAobnVtLCBiaXRzLCBmbGFncykKLSAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0gICAgIGludCBiaXRzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGxvbmcgbWluLCBtYXg7Ci0gIGludCByZXR2YWw9MDsKLQotICAvKiBkb24ndCBib3RoZXIgY2hlY2tpbmcgMzItYml0IHZhbHVlcyAqLwotICBpZiAoYml0cyA9PSAzMikKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotICAgIHsKLSAgICAgIC8qIFdlIGtub3cgdGhhdCBhbGwgc2hpZnRzIGFyZSByaWdodCBieSB0aHJlZSBiaXRzLi4uLiAqLwotICAgICAgCi0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLQludW0gPSAodW5zaWduZWQgbG9uZykgKCgoLypzaWduZWQqLyBsb25nKSBudW0pID4+IDMpOwotICAgICAgZWxzZQotCW51bSA+Pj0gMzsKLSAgICB9Ci0KLSAgaWYgKGZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0gICAgewotICAgICAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSktMTsgCi0gICAgICBtaW4gPSAtICgxIDw8IChiaXRzIC0gMSkpOwotICAgICAgaWYgKCgobG9uZyludW0gPiBtYXgpIHx8ICgobG9uZyludW0gPCBtaW4pKQotCXJldHZhbCA9IDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgbWluID0gMDsKLSAgICAgIGlmICgobnVtID4gbWF4KSB8fCAobnVtIDwgbWluKSkKLQlyZXR2YWwgPSAxOwotICAgIH0KLSAgCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXG5EMzBWIG9wdGlvbnM6XG5cCi0tTyAgICAgICAgICAgICAgICAgICAgICBNYWtlIGFkamFjZW50IHNob3J0IGluc3RydWN0aW9ucyBwYXJhbGxlbCBpZiBwb3NzaWJsZS5cblwKLS1uICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgYWxsIE5PUHMgaW5zZXJ0ZWQgYnkgdGhlIGFzc2VtYmxlci5cblwKLS1OCQkJV2FybiBhYm91dCBOT1BzIGluc2VydGVkIGFmdGVyIHdvcmQgbXVsdGlwbGllcy5cblwKLS1jICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgc3ltYm9scyB3aG9lcyBuYW1lcyBtYXRjaCByZWdpc3RlciBuYW1lcy5cblwKLS1DICAgICAgICAgICAgICAgICAgICAgIE9wcG9zaXRlIG9mIC1DLiAgLWMgaXMgdGhlIGRlZmF1bHQuXG4iKSk7Ci19Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgICAvKiBPcHRpbWl6ZS4gV2lsbCBhdHRlbXB0IHRvIHBhcmFsbGVsaXplIG9wZXJhdGlvbnMgKi8KLSAgICBjYXNlICdPJzoKLSAgICAgIE9wdGltaXppbmcgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFdhcm4gYWJvdXQgYWxsIE5PUFMgdGhhdCB0aGUgYXNzZW1ibGVyIGluc2VydHMuICAqLwotICAgIGNhc2UgJ24nOgotICAgICAgd2Fybl9ub3BzID0gTk9QX0FMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBXYXJuIGFib3V0IHRoZSBOT1BTIHRoYXQgdGhlIGFzc2VtYmxlciBpbnNlcnRzIGJlY2F1c2Ugb2YgdGhlCi0JIG11bHRpcGx5IGhhemFyZC4gICovCi0gICAgY2FzZSAnTic6Ci0gICAgICB3YXJuX25vcHMgPSBOT1BfTVVMVElQTFk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2MnOgotICAgICAgd2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0MnOgotICAgICAgd2Fybl9yZWdpc3Rlcl9uYW1lX2NvbmZsaWN0cyA9IDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGludCB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0gIGNoYXIgKnQ7Ci0gIGludCBpOwotICAKLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gIAotICAqc2l6ZVAgPSBwcmVjICogMjsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRQICs9IDI7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKmFiZmQ7Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGZyYWdTICpmcmFnUDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBzdHJ1Y3QgZDMwdl9vcGNvZGUgKiBvcGNvZGU7Ci0gIGQzMHZfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIEluc2VydCBvcGNvZGUgbmFtZXMgaW50byBhIGhhc2ggdGFibGUuICovCi0gIGZvciAob3Bjb2RlID0gKHN0cnVjdCBkMzB2X29wY29kZSAqKWQzMHZfb3Bjb2RlX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgICAgaGFzaF9pbnNlcnQgKGQzMHZfaGFzaCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCi0gIGZpeHVwcyA9ICZGaXhVcHNbMF07Ci0gIEZpeFVwc1swXS5uZXh0ID0gJkZpeFVwc1sxXTsKLSAgRml4VXBzWzFdLm5leHQgPSAmRml4VXBzWzBdOwotCi0gIGQzMHZfY3VycmVudF9hbGlnbl9zZWcgPSBub3dfc2VnOwotfQotCi0KLS8qIHRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgcG9zdGluY3JlbWVudCBvciBwb3N0ZGVjcmVtZW50Ci0gICBvcGVyYXRvciAoICcrJyBvciAnLScgKSBmcm9tIGFuIGV4cHJlc3Npb24gKi8KLQotc3RhdGljIGludCBwb3N0Zml4IChwKSAKLSAgICAgY2hhciAqcDsKLXsKLSAgd2hpbGUgKCpwICE9ICctJyAmJiAqcCAhPSAnKycpIAotICAgIHsKLSAgICAgIGlmICgqcD09MCB8fCAqcD09J1xuJyB8fCAqcD09J1xyJyB8fCAqcD09JyAnIHx8ICpwPT0nLCcpIAotCWJyZWFrOwotICAgICAgcCsrOwotICAgIH0KLQotICBpZiAoKnAgPT0gJy0nKSAKLSAgICB7Ci0gICAgICAqcCA9ICcgJzsKLSAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLSAgaWYgKCpwID09ICcrJykgCi0gICAgewotICAgICAgKnAgPSAnICc7Ci0gICAgICByZXR1cm4gKDEpOwotICAgIH0KLQotICByZXR1cm4gKDApOwotfQotCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgCi1nZXRfcmVsb2MgKG9wLCByZWxfZmxhZykgCi0gICAgIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wOwotICAgICBpbnQgcmVsX2ZsYWc7Ci17Ci0gIHN3aXRjaCAob3AtPmJpdHMpCi0gICAgewotICAgIGNhc2UgNjoKLSAgICAgIGlmIChvcC0+ZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl85X1BDUkVMOwotICAgICAgZWxzZQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl82OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjoKLSAgICAgIGlmICghKG9wLT5mbGFncyAmIE9QRVJBTkRfU0hJRlQpKQotCWFzX3dhcm4gKF8oInVuZXhwZWN0ZWQgMTItYml0IHJlbG9jIHR5cGUiKSk7Ci0gICAgICBpZiAocmVsX2ZsYWcgPT0gUkVMT0NfUENSRUwpCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMOwotICAgICAgZWxzZQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8xNTsKLSAgICBjYXNlIDE4OgotICAgICAgaWYgKCEob3AtPmZsYWdzICYgT1BFUkFORF9TSElGVCkpCi0JYXNfd2FybiAoXygidW5leHBlY3RlZCAxOC1iaXQgcmVsb2MgdHlwZSIpKTsKLSAgICAgIGlmIChyZWxfZmxhZyA9PSBSRUxPQ19QQ1JFTCkKLQlyZXR1cm4gQkZEX1JFTE9DX0QzMFZfMjFfUENSRUw7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzIxOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAocmVsX2ZsYWcgPT0gUkVMT0NfUENSRUwpCi0JcmV0dXJuIEJGRF9SRUxPQ19EMzBWXzMyX1BDUkVMOwotICAgICAgZWxzZQotCXJldHVybiBCRkRfUkVMT0NfRDMwVl8zMjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBnZXRfb3BlcmFuZHMgcGFyc2VzIGEgc3RyaW5nIG9mIG9wZXJhbmRzIGFuZCByZXR1cm5zCi0gICBhbiBhcnJheSBvZiBleHByZXNzaW9ucyAqLwotCi1zdGF0aWMgaW50Ci1nZXRfb3BlcmFuZHMgKGV4cCwgY21wX2hhY2spIAotICAgICBleHByZXNzaW9uUyBleHBbXTsKLSAgICAgaW50IGNtcF9oYWNrOwotewotICBjaGFyICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnQgbnVtb3BzID0gMDsKLSAgaW50IHBvc3QgPSAwOwotCi0gIGlmIChjbXBfaGFjaykKLSAgICB7Ci0gICAgICBleHBbbnVtb3BzXS5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBleHBbbnVtb3BzKytdLlhfYWRkX251bWJlciA9IGNtcF9oYWNrIC0gMTsKLSAgICB9Ci0KLSAgd2hpbGUgKCpwKSAgCi0gICAgewotICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICcsJykgCi0JcCsrOwotICAgICAgaWYgKCpwPT0wIHx8ICpwPT0nXG4nIHx8ICpwPT0nXHInKSAKLQlicmVhazsKLSAgICAgIAotICAgICAgaWYgKCpwID09ICdAJykgCi0JewotCSAgcCsrOwotCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotCSAgaWYgKCpwID09ICcoJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVFBBUjsKLQkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICctJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgZXhwW251bW9wc10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9BVE1JTlVTOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHBbbnVtb3BzXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX0FUU0lHTjsKLQkgICAgICBwb3N0ID0gcG9zdGZpeCAocCk7Ci0JICAgIH0KLQkgIG51bW9wcysrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAoKnAgPT0gJyknKSAKLQl7Ci0JICAvKiBqdXN0IHNraXAgdGhlIHRyYWlsaW5nIHBhcmVuICovCi0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0KLSAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiBpdCBtaWdodCBiZSBhIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgIGlmICghcmVnaXN0ZXJfbmFtZSAoJmV4cFtudW1vcHNdKSkKLQl7Ci0JICAvKiBwYXJzZSBhcyBhbiBleHByZXNzaW9uICovCi0JICBleHByZXNzaW9uICgmZXhwW251bW9wc10pOwotCX0KLQotICAgICAgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19pbGxlZ2FsKSAKLQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4cFtudW1vcHNdLlhfb3AgPT0gT19hYnNlbnQpIAotCWFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCi0gICAgICBudW1vcHMrKzsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIHN3aXRjaCAocG9zdCkgCi0JewotCWNhc2UgLTE6CS8qIHBvc3RkZWNyZW1lbnQgbW9kZSAqLwotCSAgZXhwW251bW9wc10uWF9vcCA9IE9fYWJzZW50OwotCSAgZXhwW251bW9wcysrXS5YX2FkZF9udW1iZXIgPSBPUEVSQU5EX01JTlVTOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgkvKiBwb3N0aW5jcmVtZW50IG1vZGUgKi8KLQkgIGV4cFtudW1vcHNdLlhfb3AgPSBPX2Fic2VudDsKLQkgIGV4cFtudW1vcHMrK10uWF9hZGRfbnVtYmVyID0gT1BFUkFORF9QTFVTOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcG9zdCA9IDA7Ci0gICAgfQotCi0gIGV4cFtudW1vcHNdLlhfb3AgPSAwOwotICByZXR1cm4gKG51bW9wcyk7Ci19Ci0KLS8qIGJ1aWxkX2luc24gZ2VuZXJhdGVzIHRoZSBpbnN0cnVjdGlvbi4gIEl0IGRvZXMgZXZlcnl0aGluZyAqLwotLyogYnV0IHdyaXRlIHRoZSBGTSBiaXRzLiAqLwotCi1zdGF0aWMgbG9uZyBsb25nCi1idWlsZF9pbnNuIChvcGNvZGUsIG9wZXJzKSAKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlOwotICAgICBleHByZXNzaW9uUyAqb3BlcnM7Ci17Ci0gIGludCBpLCBsZW5ndGgsIGJpdHMsIHNoaWZ0LCBmbGFnczsKLSAgdW5zaWduZWQgaW50IG51bWJlciwgaWQ9MDsKLSAgbG9uZyBsb25nIGluc247Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqb3AgPSBvcGNvZGUtPm9wOwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmZvcm0gPSBvcGNvZGUtPmZvcm07Ci0KLSAgaW5zbiA9IG9wY29kZS0+ZWNjIDw8IDI4IHwgb3AtPm9wMSA8PCAyNSB8IG9wLT5vcDIgPDwgMjAgfCBmb3JtLT5tb2RpZmllciA8PCAxODsKLQotICBmb3IgKGk9MDsgZm9ybS0+b3BlcmFuZHNbaV07IGkrKykgCi0gICAgeyAKLSAgICAgIGZsYWdzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5mbGFnczsKLQotICAgICAgLyogbXVzdCBiZSBhIHJlZ2lzdGVyIG9yIG51bWJlciAqLwotICAgICAgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX1JFRykgJiYgIShmbGFncyAmIE9QRVJBTkRfTlVNKSAmJiAKLQkgICEoZmxhZ3MgJiBPUEVSQU5EX05BTUUpICYmICEoZmxhZ3MgJiBPUEVSQU5EX1NQRUNJQUwpKQotCWNvbnRpbnVlOwotCi0gICAgICBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXS5iaXRzOwotICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF9TSElGVCkKLQliaXRzICs9IDM7Ci0KLSAgICAgIGxlbmd0aCA9IGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0ubGVuZ3RoOwotICAgICAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmb3JtLT5vcGVyYW5kc1tpXV0ucG9zaXRpb247Ci0gICAgICBpZiAob3BlcnNbaV0uWF9vcCAhPSBPX3N5bWJvbCkKLQludW1iZXIgPSBvcGVyc1tpXS5YX2FkZF9udW1iZXI7Ci0gICAgICBlbHNlCi0JbnVtYmVyID0gMDsKLSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCXsKLQkgIC8qIGNoZWNrIGZvciBtdmZzeXMgb3IgbXZ0c3lzIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0JICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wgJiYgKG51bWJlciAmIDB4N2YpID4gTUFYX0NPTlRST0xfUkVHKQotCSAgICB7Ci0JICAgICAgLyogUFNXTCBvciBQU1dIICovCi0JICAgICAgaWQgPSAobnVtYmVyICYgMHg3ZikgLSBNQVhfQ09OVFJPTF9SRUc7Ci0JICAgICAgbnVtYmVyID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAobnVtYmVyICYgT1BFUkFORF9GTEFHKQotCSAgICB7Ci0JICAgICAgaWQgPSAzOyAgLyogbnVtYmVyIGlzIGEgZmxhZyByZWdpc3RlciAqLwotCSAgICB9Ci0JICBudW1iZXIgJj0gMHg3RjsKLQl9Ci0gICAgICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfU1BFQ0lBTCkKLQl7Ci0JICBudW1iZXIgPSBpZDsKLQl9Ci0KLSAgICAgIGlmIChvcGVyc1tpXS5YX29wICE9IE9fcmVnaXN0ZXIgJiYgb3BlcnNbaV0uWF9vcCAhPSBPX2NvbnN0YW50ICYmICEoZmxhZ3MgJiBPUEVSQU5EX05BTUUpKQotCXsKLQkgIC8qIG5vdyBjcmVhdGUgYSBmaXh1cCAqLwotCi0JICBpZiAoZml4dXBzLT5mYyA+PSBNQVhfSU5TTl9GSVhVUFMpCi0JICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0KLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLnJlbG9jID0gCi0JICAgIGdldF9yZWxvYyAoKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2Zvcm0tPm9wZXJhbmRzW2ldXSwgb3AtPnJlbG9jX2ZsYWcpOwotCSAgZml4dXBzLT5maXhbZml4dXBzLT5mY10uc2l6ZSA9IDQ7Ci0JICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5leHAgPSBvcGVyc1tpXTsKLQkgIGZpeHVwcy0+Zml4W2ZpeHVwcy0+ZmNdLm9wZXJhbmQgPSBmb3JtLT5vcGVyYW5kc1tpXTsKLQkgIGlmIChmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5yZWxvYyA9PSBCRkRfUkVMT0NfRDMwVl85X1BDUkVMKQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IFJFTE9DX1BDUkVMOwotCSAgZWxzZQotCSAgICBmaXh1cHMtPmZpeFtmaXh1cHMtPmZjXS5wY3JlbCA9IG9wLT5yZWxvY19mbGFnOwotCSAgKGZpeHVwcy0+ZmMpKys7Ci0JfQotCi0gICAgICAvKiB0cnVuY2F0ZSB0byB0aGUgcHJvcGVyIG51bWJlciBvZiBiaXRzICovCi0gICAgICBpZiAoKG9wZXJzW2ldLlhfb3AgPT0gT19jb25zdGFudCkgJiYgY2hlY2tfcmFuZ2UgKG51bWJlciwgYml0cywgZmxhZ3MpKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdXQgb2YgcmFuZ2U6ICVkIiksbnVtYmVyKTsKLSAgICAgIGlmIChiaXRzIDwgMzEpCi0JbnVtYmVyICY9IDB4N0ZGRkZGRkYgPj4gKDMxIC0gYml0cyk7Ci0gICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NISUZUKQotCW51bWJlciA+Pj0gMzsKLSAgICAgIGlmIChiaXRzID09IDMyKQotCXsKLQkgIC8qIGl0J3MgYSBMT05HIGluc3RydWN0aW9uICovCi0JICBpbnNuIHw9IChudW1iZXIgPj4gMjYpOwkvKiB0b3AgNiBiaXRzICovCi0JICBpbnNuIDw8PSAzMjsJCQkvKiBzaGlmdCB0aGUgZmlyc3Qgd29yZCBvdmVyICovCi0JICBpbnNuIHw9ICgobnVtYmVyICYgMHgwM0ZDMDAwMCkgPDwgMik7ICAvKiBuZXh0IDggYml0cyAqLyAKLQkgIGluc24gfD0gbnVtYmVyICYgMHgwMDAzRkZGRjsJCS8qIGJvdHRvbSAxOCBiaXRzICovCi0JfQotICAgICAgZWxzZQotCWluc24gfD0gbnVtYmVyIDw8IHNoaWZ0OwotICAgIH0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQotLyogd3JpdGUgb3V0IGEgbG9uZyBmb3JtIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZAotd3JpdGVfbG9uZyAob3Bjb2RlLCBpbnNuLCBmeCkgCi0gICAgIHN0cnVjdCBkMzB2X2luc24gKm9wY29kZTsKLSAgICAgbG9uZyBsb25nIGluc247Ci0gICAgIEZpeHVwcyAqZng7Ci17Ci0gIGludCBpLCB3aGVyZTsKLSAgY2hhciAqZiA9IGZyYWdfbW9yZSAoOCk7Ci0KLSAgaW5zbiB8PSBGTTExOwotICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgOCk7Ci0KLSAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0gICAgewotICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JeyAKLQkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLAotCQkgICAgICAgZngtPmZpeFtpXS5zaXplLAotCQkgICAgICAgJihmeC0+Zml4W2ldLmV4cCksCi0JCSAgICAgICBmeC0+Zml4W2ldLnBjcmVsLAotCQkgICAgICAgZngtPmZpeFtpXS5yZWxvYyk7Ci0JfQotICAgIH0KLSAgZngtPmZjID0gMDsKLX0KLQotCi0vKiBXcml0ZSBvdXQgYSBzaG9ydCBmb3JtIGluc3RydWN0aW9uIGJ5IGl0c2VsZi4gICovCi1zdGF0aWMgdm9pZAotd3JpdGVfMV9zaG9ydCAob3Bjb2RlLCBpbnNuLCBmeCwgdXNlX3NlcXVlbnRpYWwpIAotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcGNvZGU7Ci0gICAgIGxvbmcgbG9uZyBpbnNuOwotICAgICBGaXh1cHMgKmZ4OwotICAgICBpbnQgdXNlX3NlcXVlbnRpYWw7Ci17Ci0gIGNoYXIgKmYgPSBmcmFnX21vcmUgKDgpOwotICBpbnQgaSwgd2hlcmU7Ci0KLSAgaWYgKHdhcm5fbm9wcyA9PSBOT1BfQUxMKQotICAgIGFzX3dhcm4gKF8oIiVzIE5PUCBpbnNlcnRlZCIpLCB1c2Vfc2VxdWVudGlhbCA/Ci0JICAgICBfKCJzZXF1ZW50aWFsIikgOiBfKCJwYXJhbGxlbCIpKTsKLQotICAvKiBUaGUgb3RoZXIgY29udGFpbmVyIG5lZWRzIHRvIGJlIE5PUC4gKi8KLSAgaWYgKHVzZV9zZXF1ZW50aWFsKQotICAgIHsKLSAgICAgIC8qIFVzZSBhIHNlcXVlbnRpYWwgTk9QIHJhdGhlciB0aGFuIGEgcGFyYWxsZWwgb25lLAotCSBhcyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyBhIEZMQUdfTVVMMzIgdHlwZSBvbmUKLQkgYW5kIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgbG9hZC4gICovCi0gICAgICAKLSAgICAgIC8qIEFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAxLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZAotCSBvbmx5IGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLwotICAgICAgCi0gICAgICBpZiAob3Bjb2RlLT5vcC0+dW5pdCA9PSBJVSkKLQlpbnNuIHw9IEZNMTAgfCBOT1BfTEVGVDsJLyogcmlnaHQgdGhlbiBsZWZ0ICovCi0gICAgICBlbHNlCi0JaW5zbiA9IEZNMDEgfCAoaW5zbiA8PCAzMikgfCBOT1BfUklHSFQ7CS8qIGxlZnQgdGhlbiByaWdodCAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFjY29yZGluZyB0byA0LjMuMTogZm9yIEZNPTAwLCBzdWItaW5zdHJ1Y3Rpb25zIHBlcmZvcm1lZAotCSBvbmx5IGJ5IElVIGNhbm5vdCBiZSBlbmNvZGVkIGluIEwtY29udGFpbmVyLiAqLwotICAgICAgCi0gICAgICBpZiAob3Bjb2RlLT5vcC0+dW5pdCA9PSBJVSkKLQlpbnNuIHw9IEZNMDAgfCBOT1BfTEVGVDsJCS8qIHJpZ2h0IGNvbnRhaW5lciAqLwotICAgICAgZWxzZQotCWluc24gPSBGTTAwIHwgKGluc24gPDwgMzIpIHwgTk9QX1JJR0hUOwkvKiBsZWZ0IGNvbnRhaW5lciAqLwotICAgIH0KLQotICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgOCk7Ci0KLSAgZm9yIChpPTA7IGkgPCBmeC0+ZmM7IGkrKykgCi0gICAgewotICAgICAgaWYgKGZ4LT5maXhbaV0ucmVsb2MpCi0JeyAKLQkgIHdoZXJlID0gZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsOyAKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIHdoZXJlLCAKLQkJICAgICAgIGZ4LT5maXhbaV0uc2l6ZSwKLQkJICAgICAgICYoZngtPmZpeFtpXS5leHApLAotCQkgICAgICAgZngtPmZpeFtpXS5wY3JlbCwKLQkJICAgICAgIGZ4LT5maXhbaV0ucmVsb2MpOwotCX0KLSAgICB9Ci0gIGZ4LT5mYyA9IDA7Ci19Ci0KLS8qIFdyaXRlIG91dCBhIHNob3J0IGZvcm0gaW5zdHJ1Y3Rpb24gaWYgcG9zc2libGUuCi0gICBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucyBub3Qgd3JpdHRlbiBvdXQuICAqLwotc3RhdGljIGludAotd3JpdGVfMl9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUsIGZ4KSAKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlMSwgKm9wY29kZTI7Ci0gICAgIGxvbmcgbG9uZyBpbnNuMSwgaW5zbjI7Ci0gICAgIGV4ZWNfdHlwZV9lbnVtIGV4ZWNfdHlwZTsKLSAgICAgRml4dXBzICpmeDsKLXsKLSAgbG9uZyBsb25nIGluc24gPSBOT1AyOwotICBjaGFyICpmOwotICBpbnQgaSxqLCB3aGVyZTsKLQotICBpZiAoZXhlY190eXBlID09IEVYRUNfU0VRCi0gICAgICAmJiAob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiAoRkxBR19KTVAgfCBGTEFHX0pTUikpCi0gICAgICAmJiAoKG9wY29kZTEtPm9wLT5mbGFnc191c2VkICYgRkxBR19ERUxBWSkgPT0gMCkKLSAgICAgICYmICgob3Bjb2RlMS0+ZWNjID09IEVDQ19BTCkgfHwgISBPcHRpbWl6aW5nKSkKLSAgICB7Ci0gICAgICAvKiBVbmNvbmRpdGlvbmFsLCBub24tZGVsYXllZCBicmFuY2hlcyBraWxsIGluc3RydWN0aW9ucyBpbgotCSB0aGUgcmlnaHQgYmluLiAgQ29uZGl0aW9uYWwgYnJhbmNoZXMgZG9uJ3QgYWx3YXlzIGJ1dCBpZgotCSB3ZSBhcmUgbm90IG9wdGltaXppbmcsIHRoZW4gd2UgaGF2ZSBiZWVuIGFza2VkIHRvIHByb2R1Y2UKLQkgYW4gZXJyb3IgYWJvdXQgc3VjaCBjb25zdHJ1Y3RzLiAgRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzCi0JIHRlc3QsIHN1YnJvdXRpbmUgY2FsbHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgYnJhbmNoZXMuICAqLwotICAgICAgd3JpdGVfMV9zaG9ydCAob3Bjb2RlMSwgaW5zbjEsIGZ4LT5uZXh0LCBmYWxzZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIAotICAvKiBOb3RlOiB3ZSBkbyBub3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzdWJyb3V0aW5lIGNhbGxzIG9jY3VyaW5nCi0gICAgIGluIHRoZSByaWdodCBoYW5kIGNvbnRhaW5lci4gIFRoZSByZXR1cm4gYWRkcmVzcyBpcyBhbHdheXMKLSAgICAgYWxpZ25lZCB0byB0aGUgbmV4dCA2NCBiaXQgYm91bmRhcnksIGJlIHRoYXQgNjQgb3IgMzIgYml0IGF3YXkuICAqLwotICAKLSAgc3dpdGNoIChleGVjX3R5cGUpIAotICAgIHsKLSAgICBjYXNlIEVYRUNfVU5LTk9XTjoJLyogT3JkZXIgbm90IHNwZWNpZmllZC4gKi8KLSAgICAgIGlmIChPcHRpbWl6aW5nCi0JICAmJiBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpCi0JICAmJiAhICggICAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUKLQkJIHx8IG9wY29kZTEtPm9wLT51bml0ID09IE1VKQotCQkmJgotCQkoICAgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUKLQkJIHx8IG9wY29kZTItPm9wLT51bml0ID09IE1VKSkpCi0JewotCSAgLyogcGFyYWxsZWwgKi8KLQkgIGV4ZWNfdHlwZSA9IEVYRUNfUEFSQUxMRUw7Ci0JICAKLQkgIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVQotCSAgICAgIHx8IG9wY29kZTItPm9wLT51bml0ID09IE1VCi0JICAgICAgfHwgb3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JICAgIGluc24gPSBGTTAwIHwgKGluc24yIDw8IDMyKSB8IGluc24xOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW5zbiA9IEZNMDAgfCAoaW5zbjEgPDwgMzIpIHwgaW5zbjI7ICAKLQkgICAgICBmeCA9IGZ4LT5uZXh0OwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPmZsYWdzX3VzZWQgJiAoRkxBR19KTVAgfCBGTEFHX0pTUikKLQkgICAgICAgJiYgKChvcGNvZGUxLT5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfREVMQVkpID09IDApCi0JICAgICAgICYmICgob3Bjb2RlMS0+ZWNjID09IEVDQ19BTCkgfHwgISBPcHRpbWl6aW5nKSkKLQl7Ci0JICAvKiBXZSBtdXN0IGVtaXQgKG5vbi1kZWxheWVkKSBicmFuY2ggdHlwZSBpbnN0cnVjdGlvbnMKLQkgICAgIG9uIHRoZWlyIG93biB3aXRoIG5vdGhpbmcgaW4gdGhlIHJpZ2h0IGNvbnRhaW5lci4gICovCi0JICB3cml0ZV8xX3Nob3J0IChvcGNvZGUxLCBpbnNuMSwgZngtPm5leHQsIGZhbHNlKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZXZfbGVmdF9raWxsc19yaWdodF9wKQotCXsKLQkgIC8qIFRoZSBsZWZ0IGluc3RydWN0aW9uIGtpbHMgdGhlIHJpZ2h0IHNsb3QsIHNvIHdlCi0JICAgICBtdXN0IGxlYXZlIGl0IGVtcHR5LiAgKi8KLQkgIHdyaXRlXzFfc2hvcnQgKG9wY29kZTEsIGluc24xLCBmeC0+bmV4dCwgZmFsc2UpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlMS0+b3AtPnVuaXQgPT0gSVUKLQkgICAgICAgfHwgKG9wY29kZTEtPm9wLT51bml0ID09IEVJVEhFUgotCQkgICAmJiBvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkpCi0JewotCSAgLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCi0JICBpbnNuID0gRk0xMCB8IChpbnNuMiA8PCAzMikgfCBpbnNuMTsKLQkgIGV4ZWNfdHlwZSA9IEVYRUNfUkVWU0VROwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzZXF1ZW50aWFsICovCi0JICBpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsKLQkgIGZ4ID0gZngtPm5leHQ7Ci0JICBleGVjX3R5cGUgPSBFWEVDX1NFUTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVhFQ19QQVJBTExFTDoJLyogcGFyYWxsZWwgKi8KLSAgICAgIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IGZsYWdfeHBfc3RhdGU7Ci0gICAgICBpZiAoISBwYXJhbGxlbF9vayAob3Bjb2RlMSwgaW5zbjEsIG9wY29kZTIsIGluc24yLCBleGVjX3R5cGUpKQotCWFzX2JhZCAoXygiSW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwiKSk7Ci0gICAgICBlbHNlIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVSkKLQl7Ci0JICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gSVUpCi0JICAgIGFzX2JhZCAoXygiVHdvIElVIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIikpOwotCSAgYXNfd2FybiAoXygiU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIiKSk7Ci0gCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gTVUpCi0JewotCSAgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IE1VKQotCSAgICBhc19iYWQgKF8oIlR3byBNVSBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCIpKTsKLQkgIGVsc2UgaWYgKG9wY29kZTEtPm9wLT51bml0ID09IEVJVEhFUl9CVVRfUFJFRkVSX01VKQotCSAgICBhc193YXJuIChfKCJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIiksIG9wY29kZTEtPm9wLT5uYW1lKTsKLQkgIGFzX3dhcm4gKF8oIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIikpOwotCSAgaW5zbiA9IEZNMDAgfCAoaW5zbjIgPDwgMzIpIHwgaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChvcGNvZGUyLT5vcC0+dW5pdCA9PSBFSVRIRVJfQlVUX1BSRUZFUl9NVSkKLQkgICAgYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7Ci0JICAKLQkgIGluc24gPSBGTTAwIHwgKGluc24xIDw8IDMyKSB8IGluc24yOyAgCi0JICBmeCA9IGZ4LT5uZXh0OwotCX0KLSAgICAgIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRVhFQ19TRVE6CS8qIHNlcXVlbnRpYWwgKi8KLSAgICAgIGlmIChvcGNvZGUxLT5vcC0+dW5pdCA9PSBJVSkKLQlhc19iYWQgKF8oIklVIGluc3RydWN0aW9uIG1heSBub3QgYmUgaW4gdGhlIGxlZnQgY29udGFpbmVyIikpOwotICAgICAgaWYgKHByZXZfbGVmdF9raWxsc19yaWdodF9wKQotCWFzX2JhZCAoXygic3BlY2lhbCBsZWZ0IGluc3RydWN0aW9uIGAlcycga2lsbHMgaW5zdHJ1Y3Rpb24gIgotCQkgICAiYCVzJyBpbiByaWdodCBjb250YWluZXIiKSwKLQkJIG9wY29kZTEtPm9wLT5uYW1lLCBvcGNvZGUyLT5vcC0+bmFtZSk7Ci0gICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7Ci0gICAgICBpbnNuID0gRk0wMSB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFWEVDX1JFVlNFUToJLyogcmV2ZXJzZSBzZXF1ZW50aWFsICovCi0gICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gTVUpCi0JYXNfYmFkIChfKCJNVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSByaWdodCBjb250YWluZXIiKSk7Ci0gICAgICBpZiAob3Bjb2RlMi0+b3AtPnVuaXQgPT0gRUlUSEVSX0JVVF9QUkVGRVJfTVUpCi0JYXNfd2FybiAoXygiRXhlY3V0aW5nICVzIGluIElVIG1heSBub3Qgd29yayIpLCBvcGNvZGUyLT5vcC0+bmFtZSk7Ci0gICAgICBpbnNuID0gRk0xMCB8IChpbnNuMSA8PCAzMikgfCBpbnNuMjsgIAotICAgICAgZnggPSBmeC0+bmV4dDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJ1bmtub3duIGV4ZWN1dGlvbiB0eXBlIHBhc3NlZCB0byB3cml0ZV8yX3Nob3J0KCkiKSk7Ci0gICAgfQotCi0gIC8qICBwcmludGYgKCJ3cml0aW5nIG91dCAlbGx4XG4iLGluc24pOyAqLwotICBmID0gZnJhZ19tb3JlICg4KTsKLSAgZDMwdl9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIDgpOwotCi0gIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYSAzMi1iaXQgbXVsdGlwbHkgYnV0IGl0IGlzIHB1dCBpbnRvIGEKLSAgICAgcGFyYWxsZWwgY29udGFpbmVyLCBtYXJrIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGFzIGJlaW5nIGEgMzItYml0Ci0gICAgIG11bHRpcGx5LiAgKi8KLSAgaWYgKHByZXZfbXVsMzJfcCAmJiBleGVjX3R5cGUgPT0gRVhFQ19QQVJBTExFTCkKLSAgICBjdXJfbXVsMzJfcCA9IDE7Ci0KLSAgZm9yIChqPTA7IGo8MjsgaisrKSAKLSAgICB7Ci0gICAgICBmb3IgKGk9MDsgaSA8IGZ4LT5mYzsgaSsrKSAKLQl7Ci0JICBpZiAoZngtPmZpeFtpXS5yZWxvYykKLQkgICAgewotCSAgICAgIHdoZXJlID0gKGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkgKyA0Kmo7Ci0KLQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICB3aGVyZSwgCi0JCQkgICBmeC0+Zml4W2ldLnNpemUsCi0JCQkgICAmKGZ4LT5maXhbaV0uZXhwKSwKLQkJCSAgIGZ4LT5maXhbaV0ucGNyZWwsCi0JCQkgICBmeC0+Zml4W2ldLnJlbG9jKTsKLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgZngtPmZjID0gMDsKLSAgICAgIGZ4ID0gZngtPm5leHQ7Ci0gICAgfQotICAKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogQ2hlY2sgMiBpbnN0cnVjdGlvbnMgYW5kIGRldGVybWluZSBpZiB0aGV5IGNhbiBiZSBzYWZlbHkgKi8KLS8qIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgUmV0dXJucyAxIGlmIHRoZXkgY2FuIGJlLiAgICAgICAgICovCi1zdGF0aWMgaW50Ci1wYXJhbGxlbF9vayAob3AxLCBpbnNuMSwgb3AyLCBpbnNuMiwgZXhlY190eXBlKQotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICpvcDEsICpvcDI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjEsIGluc24yOwotICAgICBleGVjX3R5cGVfZW51bSBleGVjX3R5cGU7Ci17Ci0gIGludCBpLCBqLCBzaGlmdCwgcmVnbm8sIGJpdHMsIGVjYzsKLSAgdW5zaWduZWQgbG9uZyBmbGFncywgbWFzaywgZmxhZ3Nfc2V0MSwgZmxhZ3Nfc2V0MiwgZmxhZ3NfdXNlZDEsIGZsYWdzX3VzZWQyOwotICB1bnNpZ25lZCBsb25nIGlucywgbW9kX3JlZ1syXVszXSwgdXNlZF9yZWdbMl1bM10sIGZsYWdfcmVnWzJdOwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmY7Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqb3A7Ci0KLSAgLyogc2VjdGlvbiA0LjM6IGJvdGggaW5zdHJ1Y3Rpb25zIG11c3Qgbm90IGJlIElVIG9yIE1VIG9ubHkgKi8KLSAgaWYgKChvcDEtPm9wLT51bml0ID09IElVICYmIG9wMi0+b3AtPnVuaXQgPT0gSVUpCi0gICAgICB8fCAob3AxLT5vcC0+dW5pdCA9PSBNVSAmJiBvcDItPm9wLT51bml0ID09IE1VKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBmaXJzdCBpbnN0cnVjdGlvbiBtdXN0IG5vdCBiZSBhIGp1bXAgdG8gc2FmZWx5IG9wdGltaXplLCB1bmxlc3MgdGhpcwotICAgICBpcyBhbiBleHBsaWNpdCBwYXJhbGxlbCBvcGVyYXRpb24uICAqLwotICBpZiAoZXhlY190eXBlICE9IEVYRUNfUEFSQUxMRUwKLSAgICAgICYmIChvcDEtPm9wLT5mbGFnc191c2VkICYgKEZMQUdfSk1QIHwgRkxBR19KU1IpKSkKLSAgICByZXR1cm4gMDsKLQotICAvKiBJZiBvbmUgaW5zdHJ1Y3Rpb24gaXMgL1RYIG9yIC9YVCBhbmQgdGhlIG90aGVyIGlzIC9GWCBvciAvWEYgcmVzcGVjdGl2ZWx5LAotICAgICB0aGVuIGl0IGlzIHNhZmUgdG8gYWxsb3cgdGhlIHR3byB0byBiZSBkb25lIGFzIHBhcmFsbGVsIG9wcywgc2luY2Ugb25seQotICAgICBvbmUgd2lsbCBldmVyIGJlIGV4ZWN1dGVkIGF0IGEgdGltZS4gICovCi0gIGlmICgob3AxLT5lY2MgPT0gRUNDX1RYICYmIG9wMi0+ZWNjID09IEVDQ19GWCkKLSAgICAgIHx8IChvcDEtPmVjYyA9PSBFQ0NfRlggJiYgb3AyLT5lY2MgPT0gRUNDX1RYKQotICAgICAgfHwgKG9wMS0+ZWNjID09IEVDQ19YVCAmJiBvcDItPmVjYyA9PSBFQ0NfWEYpCi0gICAgICB8fCAob3AxLT5lY2MgPT0gRUNDX1hGICYmIG9wMi0+ZWNjID09IEVDQ19YVCkpCi0gICAgIHJldHVybiAxOwotCi0gIC8qIFswXSByMC1yMzEKLSAgICAgWzFdIHIzMi1yNjMKLSAgICAgWzJdIGEwLCBhMSwgZmxhZyByZWdpc3RlcnMgKi8KLQotICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQotICAgIHsKLSAgICAgIGlmIChqID09IDApCi0JewotCSAgZiA9IG9wMS0+Zm9ybTsKLQkgIG9wID0gb3AxLT5vcDsKLQkgIGVjYyA9IG9wMS0+ZWNjOwotCSAgaW5zID0gaW5zbjE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGYgPSBvcDItPmZvcm07Ci0JICBvcCA9IG9wMi0+b3A7Ci0JICBlY2MgPSBvcDItPmVjYzsKLQkgIGlucyA9IGluc24yOwotCX0KLSAgICAgIGZsYWdfcmVnW2pdID0gMDsKLSAgICAgIG1vZF9yZWdbal1bMF0gPSBtb2RfcmVnW2pdWzFdID0gMDsKLSAgICAgIHVzZWRfcmVnW2pdWzBdID0gdXNlZF9yZWdbal1bMV0gPSAwOwotCi0gICAgICBpZiAoZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsKQotCXsKLQkgIC8qIEZvciBodW1hbiBzcGVjaWZpZWQgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIHdlIGhhdmUgYmVlbiBhc2tlZAotCSAgICAgdG8gaWdub3JlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGJvdGggaW5zdHJ1Y3Rpb25zIGNvdWxkIG1vZGlmeQotCSAgICAgYml0cyBpbiB0aGUgUFNXLCBzbyB3ZSBpbml0aWFsaXNlIHRoZSBtb2QgJiB1c2VkIGFycmF5cyB0byAwLgotCSAgICAgV2UgaGF2ZSBiZWVuIGFza2VkLCBob3dldmVyLCB0byByZWZ1c2UgdG8gYWxsb3cgcGFyYWxsZWwKLQkgICAgIGluc3RydWN0aW9ucyB3aGljaCBleHBsaWNpdGx5IHNldCB0aGUgc2FtZSBmbGFnIHJlZ2lzdGVyLAotCSAgICAgZWcgImNtcG5lIGYwLHIxLDB4MTAgfHwgY21wZXEgZjAsIHI1LCAweDIiLCBzbyBmdXJ0aGVyIG9uIHdlIHRlc3QKLQkgICAgIGZvciB0aGUgdXNlIG9mIGEgZmxhZyByZWdpc3RlciBhbmQgc2V0IGEgYml0IGluIHRoZSBtb2Qgb3IgdXNlZAotCSAgICAgYXJyYXkgYXBwcm9wcmlhdGVseS4gICovCi0JICAgICAKLQkgIG1vZF9yZWdbal1bMl0gID0gMDsKLQkgIHVzZWRfcmVnW2pdWzJdID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbW9kX3JlZ1tqXVsyXSA9IChvcC0+ZmxhZ3Nfc2V0ICYgRkxBR19BTEwpOwotCSAgdXNlZF9yZWdbal1bMl0gPSAob3AtPmZsYWdzX3VzZWQgJiBGTEFHX0FMTCk7Ci0JfQotICAgICAgCi0gICAgICAvKiBCU1IvSlNSIGFsd2F5cyBzZXRzIFI2MiAqLwotICAgICAgaWYgKG9wLT5mbGFnc191c2VkICYgRkxBR19KU1IpCi0JbW9kX3JlZ1tqXVsxXSA9ICgxTCA8PCAoNjItMzIpKTsKLQotICAgICAgLyogY29uZGl0aW9uYWwgZXhlY3V0aW9uIGFmZmVjdHMgdGhlIGZsYWdzX3VzZWQgKi8KLSAgICAgIHN3aXRjaCAoZWNjKQotCXsKLQljYXNlIEVDQ19UWDoKLQljYXNlIEVDQ19GWDoKLQkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gRkxBR18wOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVDQ19YVDoKLQljYXNlIEVDQ19YRjoKLQkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gRkxBR18xOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVDQ19UVDoKLQljYXNlIEVDQ19URjoKLQkgIHVzZWRfcmVnW2pdWzJdIHw9IGZsYWdfcmVnW2pdID0gKEZMQUdfMCB8IEZMQUdfMSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGZvciAoaSA9IDA7IGYtPm9wZXJhbmRzW2ldOyBpKyspCi0JewotCSAgZmxhZ3MgPSBkMzB2X29wZXJhbmRfdGFibGVbZi0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgc2hpZnQgPSAxMiAtIGQzMHZfb3BlcmFuZF90YWJsZVtmLT5vcGVyYW5kc1tpXV0ucG9zaXRpb247Ci0JICBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ldXS5iaXRzOwotCSAgaWYgKGJpdHMgPT0gMzIpCi0JICAgIG1hc2sgPSAweGZmZmZmZmZmOwotCSAgZWxzZQotCSAgICBtYXNrID0gMHg3RkZGRkZGRiA+PiAoMzEgLSBiaXRzKTsKLQotCSAgaWYgKChmbGFncyAmIE9QRVJBTkRfUExVUykgfHwgKGZsYWdzICYgT1BFUkFORF9NSU5VUykpCi0JICAgIHsKLQkgICAgICAvKiB0aGlzIGlzIGEgcG9zdC1pbmNyZW1lbnQgb3IgcG9zdC1kZWNyZW1lbnQgKi8KLQkgICAgICAvKiB0aGUgcHJldmlvdXMgcmVnaXN0ZXIgbmVlZHMgdG8gYmUgbWFya2VkIGFzIG1vZGlmaWVkICovCi0KLQkgICAgICBzaGlmdCA9IDEyIC0gZDMwdl9vcGVyYW5kX3RhYmxlW2YtPm9wZXJhbmRzW2ktMV1dLnBvc2l0aW9uOwotCSAgICAgIHJlZ25vID0gKGlucyA+PiBzaGlmdCkgJiAweDNmOwotCSAgICAgIGlmIChyZWdubyA+PSAzMikKLQkJbW9kX3JlZ1tqXVsxXSB8PSAxTCA8PCAocmVnbm8gLSAzMik7Ci0JICAgICAgZWxzZQotCQltb2RfcmVnW2pdWzBdIHw9IDFMIDw8IHJlZ25vOwotCSAgICB9Ci0JICBlbHNlIGlmIChmbGFncyAmIE9QRVJBTkRfUkVHKQotCSAgICB7Ci0JICAgICAgcmVnbm8gPSAoaW5zID4+IHNoaWZ0KSAmIG1hc2s7Ci0JICAgICAgLyogdGhlIG1lbW9yeSB3cml0ZSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0JICAgICAgaWYgKChmbGFncyAmIE9QRVJBTkRfREVTVCkgJiYgIShvcC0+ZmxhZ3Nfc2V0ICYgRkxBR19NRU0pKQotCQl7Ci0JCSAgLyogTU9ESUZJRUQgcmVnaXN0ZXJzIGFuZCBmbGFncyAqLwotCQkgIGlmIChmbGFncyAmIE9QRVJBTkRfQUNDKQotCQkgICAgewotCQkgICAgICBpZiAocmVnbm8gPT0gMCkKLQkJCW1vZF9yZWdbal1bMl0gfD0gRkxBR19BMDsKLQkJICAgICAgZWxzZSBpZiAocmVnbm8gPT0gMSkKLQkJCW1vZF9yZWdbal1bMl0gfD0gRkxBR19BMTsKLQkJICAgICAgZWxzZQotCQkJYWJvcnQgKCk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCi0JCSAgICBtb2RfcmVnW2pdWzJdIHw9IDFMIDw8IHJlZ25vOwotCQkgIGVsc2UgaWYgKCEoZmxhZ3MgJiBPUEVSQU5EX0NPTlRST0wpKQotCQkgICAgewotCQkgICAgICBpbnQgciwgejsKLQotCQkgICAgICAvKiBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSB0d28gZGVzdGluYXRpb24gKi8KLQkJICAgICAgLyogcmVnaXN0ZXJzLCBmb3IgZXhhbXBsZSBsZDJ3ICovCi0JCSAgICAgIGlmIChmbGFncyAmIE9QRVJBTkRfMlJFRykKLQkJCXogPSAxOwotCQkgICAgICBlbHNlCi0JCQl6ID0gMDsKLQotCQkgICAgICBmb3IgKHIgPSByZWdubzsgciA8PSByZWdubyArIHo7IHIrKykKLQkJCXsgCi0JCQkgIGlmIChyID49IDMyKQotCQkJICAgIG1vZF9yZWdbal1bMV0gfD0gMUwgPDwgKHIgLSAzMik7Ci0JCQkgIGVsc2UKLQkJCSAgICBtb2RfcmVnW2pdWzBdIHw9IDFMIDw8IHI7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBVU0VELCBidXQgbm90IG1vZGlmaWVkIHJlZ2lzdGVycyBhbmQgZmxhZ3MgKi8KLQkJICBpZiAoZmxhZ3MgJiBPUEVSQU5EX0FDQykKLQkJICAgIHsKLQkJICAgICAgaWYgKHJlZ25vID09IDApCi0JCQl1c2VkX3JlZ1tqXVsyXSB8PSBGTEFHX0EwOwotCQkgICAgICBlbHNlIGlmIChyZWdubyA9PSAxKQotCQkJdXNlZF9yZWdbal1bMl0gfD0gRkxBR19BMTsKLQkJICAgICAgZWxzZQotCQkJYWJvcnQgKCk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX0ZMQUcpCi0JCSAgICB1c2VkX3JlZ1tqXVsyXSB8PSAxTCA8PCByZWdubzsKLQkJICBlbHNlIGlmICghKGZsYWdzICYgT1BFUkFORF9DT05UUk9MKSkKLQkJICAgIHsKLQkJICAgICAgaW50IHIsIHo7Ci0KLQkJICAgICAgLyogbmVlZCB0byBjaGVjayBpZiB0aGVyZSBhcmUgdHdvIHNvdXJjZSAqLwotCQkgICAgICAvKiByZWdpc3RlcnMsIGZvciBleGFtcGxlIHN0MncgKi8KLQkJICAgICAgaWYgKGZsYWdzICYgT1BFUkFORF8yUkVHKQotCQkJeiA9IDE7Ci0JCSAgICAgIGVsc2UKLQkJCXogPSAwOwotCi0JCSAgICAgIGZvciAociA9IHJlZ25vOyByIDw9IHJlZ25vICsgejsgcisrKQotCQkJeyAKLQkJCSAgaWYgKHIgPj0gMzIpCi0JCQkgICAgdXNlZF9yZWdbal1bMV0gfD0gMUwgPDwgKHIgLSAzMik7Ci0JCQkgIGVsc2UKLQkJCSAgICB1c2VkX3JlZ1tqXVswXSB8PSAxTCA8PCByOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgZmxhZ3Nfc2V0MSA9IG9wMS0+b3AtPmZsYWdzX3NldDsKLSAgZmxhZ3Nfc2V0MiA9IG9wMi0+b3AtPmZsYWdzX3NldDsKLSAgZmxhZ3NfdXNlZDEgPSBvcDEtPm9wLT5mbGFnc191c2VkOwotICBmbGFnc191c2VkMiA9IG9wMi0+b3AtPmZsYWdzX3VzZWQ7Ci0KLSAgLyogU1QyVy9TVDRIQiBjb21iaW5lZCB3aXRoIEFERHBwcC9TVUJwcHAgaXMgaWxsZWdhbC4gICovCi0gIGlmICgoKGZsYWdzX3NldDEgJiAoRkxBR19NRU0gfCBGTEFHXzJXT1JEKSkgPT0gKEZMQUdfTUVNIHwgRkxBR18yV09SRCkKLSAgICAgICAmJiAoZmxhZ3NfdXNlZDIgJiBGTEFHX0FERFNVQnBwcCkgIT0gMCkKLSAgICAgIHx8ICgoZmxhZ3Nfc2V0MiAmIChGTEFHX01FTSB8IEZMQUdfMldPUkQpKSA9PSAoRkxBR19NRU0gfCBGTEFHXzJXT1JEKQotCSAgJiYgKGZsYWdzX3VzZWQxICYgRkxBR19BRERTVUJwcHApICE9IDApKQotICAgIHJldHVybiAwOwotCi0gIC8qIExvYWQgaW5zdHJ1Y3Rpb24gY29tYmluZWQgd2l0aCBoYWxmLXdvcmQgbXVsdGlwbHkgaXMgaWxsZWdhbC4gICovCi0gIGlmICgoKGZsYWdzX3VzZWQxICYgRkxBR19NRU0pICE9IDAgJiYgKGZsYWdzX3VzZWQyICYgRkxBR19NVUwxNikpCi0gICAgICB8fCAoKGZsYWdzX3VzZWQyICYgRkxBR19NRU0pICE9IDAgJiYgKGZsYWdzX3VzZWQxICYgRkxBR19NVUwxNikpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFNwZWNpZmljYWxseSBhbGxvdyBhZGQgfHwgYWRkIGJ5IHJlbW92aW5nIGNhcnJ5LCBvdmVyZmxvdyBiaXRzIGRlcGVuZGVuY3kuCi0gICAgIFRoaXMgaXMgc2FmZSwgZXZlbiBpZiBhbiBhZGRjIGZvbGxvd3Mgc2luY2UgdGhlIElVIHRha2VzIHRoZSBhcmd1bWVudCBpbgotICAgICB0aGUgcmlnaHQgY29udGFpbmVyLCBhbmQgaXQgd3JpdGVzIGl0cyByZXN1bHRzIGxhc3QuCi0gICAgIEhvd2V2ZXIsIGRvbid0IHBhcmFsZWxsaXplIGFkZCBmb2xsb3dlZCBieSBhZGRjIG9yIHN1YiBmb2xsb3dlZCBieQotICAgICBzdWJiLiAgKi8KLQotICBpZiAobW9kX3JlZ1swXVsyXSA9PSBGTEFHX0NWVkEgJiYgbW9kX3JlZ1sxXVsyXSA9PSBGTEFHX0NWVkEKLSAgICAgICYmICh1c2VkX3JlZ1swXVsyXSAmIH5mbGFnX3JlZ1swXSkgPT0gMAotICAgICAgJiYgKHVzZWRfcmVnWzFdWzJdICYgfmZsYWdfcmVnWzFdKSA9PSAwCi0gICAgICAmJiBvcDEtPm9wLT51bml0ID09IEVJVEhFUiAmJiBvcDItPm9wLT51bml0ID09IEVJVEhFUikKLSAgICB7Ci0gICAgICBtb2RfcmVnWzBdWzJdID0gbW9kX3JlZ1sxXVsyXSA9IDA7Ci0gICAgfQotCi0gIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCi0gICAgewotICAgICAgLyogSWYgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBkZXBlbmRzIG9uIHRoZSBmaXJzdCwgd2Ugb2J2aW91c2x5Ci0JIGNhbm5vdCBwYXJhbGxlbGl6ZS4gIE5vdGUsIHRoZSBtb2QgZmxhZyBpbXBsaWVzIHVzZSwgc28KLQkgY2hlY2sgdGhhdCBhcyB3ZWxsLiAgKi8KLSAgICAgIC8qIElmIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCBpcyBzZXQsIHRoZW4gdGhlIGNhc2Ugb2YgdGhlIAotCSBzZWNvbmQgaW5zdHJ1Y3Rpb24gdXNpbmcgYSByZWdpc3RlciB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24KLQkgbW9kaWZpZXMgaXMgYXNzdW1lZCB0byBiZSBva2F5OyB3ZSB0cnVzdCB0aGUgaHVtYW4uICBXZQotCSBkb24ndCB0cnVzdCB0aGUgaHVtYW4gaWYgYm90aCBpbnN0cnVjdGlvbnMgbW9kaWZ5IHRoZSBzYW1lCi0JIHJlZ2lzdGVyIGJ1dCB3ZSBkbyB0cnVzdCB0aGUgaHVtYW4gaWYgdGhleSBtb2RpZnkgdGhlIHNhbWUKLQkgZmxhZ3MuICovCi0gICAgICAvKiBXZSBoYXZlIG5vdyBiZWVuIHJlcXVlc3RlZCBub3QgdG8gdHJ1c3QgdGhlIGh1bWFuIGlmIHRoZQotCSBpbnN0cnVjdGlvbnMgbW9kaWZ5IHRoZSBzYW1lIGZsYWcgcmVnaXN0ZXJzIGVpdGhlci4gICovCi0gICAgICBpZiAoZmxhZ19leHBsaWNpdGx5X3BhcmFsbGVsKQotCXsKLQkgIGlmICgobW9kX3JlZ1swXVtqXSAmIG1vZF9yZWdbMV1bal0pICE9IDApCi0JICAgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgaWYgKChtb2RfcmVnWzBdW2pdICYgKG1vZF9yZWdbMV1bal0gfCB1c2VkX3JlZ1sxXVtqXSkpICE9IDApCi0JICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLQotLyogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIHN0ciBwb2ludHMgdG8gYQotICAgbWFjaGluZS1kZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQgdGhlIGZyYWdzL2J5dGVzIAotICAgaXQgYXNzZW1ibGVzIHRvLiAgRm9yIHRoZSBEMzBWLCBpdCBtb3N0bHkgaGFuZGxlcyB0aGUgc3BlY2lhbCBWTElXIHBhcnNpbmcgYW5kIHBhY2tpbmcKLSAgIGFuZCBsZWF2ZXMgdGhlIGRpZmZpY3VsdCBzdHVmZiB0byBkb19hc3NlbWJsZSgpLiAgKi8KLQotc3RhdGljIGxvbmcgbG9uZyBwcmV2X2luc24gPSAtMTsKLXN0YXRpYyBzdHJ1Y3QgZDMwdl9pbnNuIHByZXZfb3Bjb2RlOwotc3RhdGljIHN1YnNlZ1QgcHJldl9zdWJzZWc7Ci1zdGF0aWMgc2VnVCBwcmV2X3NlZyA9IDA7Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgc3RydWN0IGQzMHZfaW5zbiBvcGNvZGU7Ci0gIGxvbmcgbG9uZyBpbnNuOwotICBleGVjX3R5cGVfZW51bSBleHR5cGUgPSBFWEVDX1VOS05PV047CQkvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwsIGV0YyAqLwotICBzdGF0aWMgZXhlY190eXBlX2VudW0gZXR5cGUgPSBFWEVDX1VOS05PV047CS8qIHNhdmVkIGV4dHlwZS4gIHVzZWQgZm9yIG11bHRpbGluZSBpbnN0cnVjdGlvbnMgKi8KLSAgY2hhciAqc3RyMjsKLQotICBpZiAoKHByZXZfaW5zbiAhPSAtMSkgJiYgcHJldl9zZWcKLSAgICAgICAmJiAoKHByZXZfc2VnICE9IG5vd19zZWcpIHx8IChwcmV2X3N1YnNlZyAhPSBub3dfc3Vic2VnKSkpCi0gICAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci0KLSAgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA8IDMpCi0gICAgZDMwdl9hbGlnbiAoMywgTlVMTCwgZDMwdl9sYXN0X2xhYmVsKTsKLSAgZWxzZSBpZiAoZDMwdl9jdXJyZW50X2FsaWduID4gMykKLSAgICBkMzB2X2N1cnJlbnRfYWxpZ24gPSAzOwotICBkMzB2X2xhc3RfbGFiZWwgPSBOVUxMOwotCi0gIGZsYWdfZXhwbGljaXRseV9wYXJhbGxlbCA9IDA7Ci0gIGZsYWdfeHBfc3RhdGUgPSAwOwotICBpZiAoZXR5cGUgPT0gRVhFQ19VTktOT1dOKQotICAgIHsKLSAgICAgIC8qIGxvb2sgZm9yIHRoZSBzcGVjaWFsIG11bHRpcGxlIGluc3RydWN0aW9uIHNlcGFyYXRvcnMgKi8KLSAgICAgIHN0cjIgPSBzdHJzdHIgKHN0ciwgInx8Iik7Ci0gICAgICBpZiAoc3RyMikgCi0JewotCSAgZXh0eXBlID0gRVhFQ19QQVJBTExFTDsKLQkgIGZsYWdfeHBfc3RhdGUgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHIyID0gc3Ryc3RyIChzdHIsICItPiIpOwotCSAgaWYgKHN0cjIpIAotCSAgICBleHR5cGUgPSBFWEVDX1NFUTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN0cjIgPSBzdHJzdHIgKHN0ciwgIjwtIik7Ci0JICAgICAgaWYgKHN0cjIpIAotCQlleHR5cGUgPSBFWEVDX1JFVlNFUTsKLQkgICAgfQotCX0KLSAgICAgIC8qIHN0cjIgcG9pbnRzIHRvIHRoZSBzZXBhcmF0b3IsIGlmIG9uZSAqLwotICAgICAgaWYgKHN0cjIpIAotCXsKLQkgICpzdHIyID0gMDsKLQkgIAotCSAgLyogaWYgdHdvIGluc3RydWN0aW9ucyBhcmUgcHJlc2VudCBhbmQgd2UgYWxyZWFkeSBoYXZlIG9uZSBzYXZlZAotCSAgICAgdGhlbiBmaXJzdCB3cml0ZSBpdCBvdXQgKi8KLQkgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCSAgCi0JICAvKiBBc3NlbWJsZSBmaXJzdCBpbnN0cnVjdGlvbiBhbmQgc2F2ZSBpdC4gICovCi0JICBwcmV2X2luc24gPSBkb19hc3NlbWJsZSAoc3RyLCAmcHJldl9vcGNvZGUsIDEsIDApOwotCSAgaWYgKHByZXZfaW5zbiA9PSAtMSkKLQkgICAgYXNfYmFkIChfKCJDYW5ub3QgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24iKSk7Ci0JICBpZiAocHJldl9vcGNvZGUuZm9ybSAhPSBOVUxMICYmIHByZXZfb3Bjb2RlLmZvcm0tPmZvcm0gPj0gTE9ORykKLQkgICAgYXNfYmFkIChfKCJGaXJzdCBvcGNvZGUgaXMgbG9uZy4gIFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZC4iKSk7IAotCSAgZml4dXBzID0gZml4dXBzLT5uZXh0OwotCSAgc3RyID0gc3RyMiArIDI7Ci0JICBwcmV2X3NlZyA9IG5vd19zZWc7Ci0JICBwcmV2X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0JfQotICAgIH0KLQotICBpbnNuID0gZG9fYXNzZW1ibGUgKHN0ciwgJm9wY29kZSwKLQkJICAgICAgKGV4dHlwZSAhPSBFWEVDX1VOS05PV04gfHwgZXR5cGUgIT0gRVhFQ19VTktOT1dOKSwKLQkJICAgICAgZXh0eXBlID09IEVYRUNfUEFSQUxMRUwpOwotICBpZiAoaW5zbiA9PSAtMSkKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTikKLQlldHlwZSA9IGV4dHlwZTsKLSAgICAgIGFzX2JhZCAoXygiQ2Fubm90IGFzc2VtYmxlIGluc3RydWN0aW9uIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXR5cGUgIT0gRVhFQ19VTktOT1dOKQotICAgIHsKLSAgICAgIGV4dHlwZSA9IGV0eXBlOwotICAgICAgZXR5cGUgPSBFWEVDX1VOS05PV047Ci0gICAgfQotCi0gIC8qIFdvcmQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zIG11c3Qgbm90IGJlIGZvbGxvd2VkIGJ5IGVpdGhlciBhIGxvYWQgb3IgYQotICAgICAxNi1iaXQgbXVsdGlwbHkgaW5zdHJ1Y3Rpb24gaW4gdGhlIG5leHQgY3ljbGUuICAqLwotICBpZiAoICAgKGV4dHlwZSAhPSBFWEVDX1JFVlNFUSkKLSAgICAgICYmIHByZXZfbXVsMzJfcAotICAgICAgJiYgKG9wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIChGTEFHX01FTSB8IEZMQUdfTVVMMTYpKSkKLSAgICB7Ci0gICAgICAvKiBIb3dldmVyLCBsb2FkIGFuZCBtdWx0aXBseSBzaG91bGQgYWJsZSB0byBiZSBjb21iaW5lZCBpbiBhIHBhcmFsbGVsCi0JIG9wZXJhdGlvbiwgc28gY2hlY2sgZm9yIHRoYXQgZmlyc3QuICAqLwotICAgICAgaWYgKHByZXZfaW5zbiAhPSAtMQotCSAgJiYgKG9wY29kZS5vcC0+ZmxhZ3NfdXNlZCAmIEZMQUdfTUVNKQotCSAgJiYgb3Bjb2RlLmZvcm0tPmZvcm0gPCBMT05HCi0JICAmJiAoZXh0eXBlID09IEVYRUNfUEFSQUxMRUwgfHwgKE9wdGltaXppbmcgJiYgZXh0eXBlID09IEVYRUNfVU5LTk9XTikpCi0JICAmJiBwYXJhbGxlbF9vayAoJnByZXZfb3Bjb2RlLCAobG9uZylwcmV2X2luc24sCi0JCQkgICZvcGNvZGUsIChsb25nKWluc24sIGV4dHlwZSkKLQkgICYmIHdyaXRlXzJfc2hvcnQgKCZwcmV2X29wY29kZSwgKGxvbmcpcHJldl9pbnNuLAotCQkJICAgICZvcGNvZGUsIChsb25nKWluc24sIGV4dHlwZSwgZml4dXBzKSA9PSAwKQotCXsKLQkgIC8qIG5vIGluc3RydWN0aW9ucyBzYXZlZCAqLwotCSAgcHJldl9pbnNuID0gLTE7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIENhbid0IHBhcmFsbGVsaXplLCBmbHVzaCBwcmV2aW91cyBpbnN0cnVjdGlvbiBhbmQgZW1pdCBhIHdvcmQgb2YgTk9QUywKLQkgICAgIHVubGVzcyB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gaXMgYSBOT1AsIGluIHdoaWNoIGNhc2UganVzdCBmbHVzaCBpdCwKLQkgICAgIGFzIHRoaXMgd2lsbCBnZW5lcmF0ZSBhIHdvcmQgb2YgTk9QcyBmb3IgdXMuICAqLwotCi0JICBpZiAocHJldl9pbnNuICE9IC0xICYmIChzdHJjbXAgKHByZXZfb3Bjb2RlLm9wLT5uYW1lLCAibm9wIikgPT0gMCkpCi0JICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqIGY7Ci0JICAgICAgCi0JICAgICAgaWYgKHByZXZfaW5zbiAhPSAtMSkKLQkJZDMwdl9jbGVhbnVwICh0cnVlKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBmID0gZnJhZ19tb3JlICg4KTsKLQkJICBkMzB2X251bWJlcl90b19jaGFycyAoZiwgTk9QMiwgOCk7Ci0JCSAgCi0JCSAgaWYgKHdhcm5fbm9wcyA9PSBOT1BfQUxMIHx8IHdhcm5fbm9wcyA9PSBOT1BfTVVMVElQTFkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcGNvZGUub3AtPmZsYWdzX3VzZWQgJiBGTEFHX01FTSkKLQkJCWFzX3dhcm4gKF8oIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIGxvYWQiKSk7Ci0JCSAgICAgIGVsc2UKLQkJCWFzX3dhcm4gKF8oIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIDE2LWJpdCBtdWx0aXBseSIpKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICAKLQkgIGV4dHlwZSA9IEVYRUNfVU5LTk9XTjsKLQl9Ci0gICAgfQotICBlbHNlIGlmICggICAoZXh0eXBlID09IEVYRUNfUkVWU0VRKQotCSAgICYmIGN1cl9tdWwzMl9wCi0JICAgJiYgKHByZXZfb3Bjb2RlLm9wLT5mbGFnc191c2VkICYgKEZMQUdfTUVNIHwgRkxBR19NVUwxNikpKQotICAgIHsKLSAgICAgIC8qIENhbid0IHBhcmFsbGVsaXplLCBmbHVzaCBjdXJyZW50IGluc3RydWN0aW9uIGFuZCBhZGQgYSBzZXF1ZW50aWFsIE5PUC4gKi8KLSAgICAgIHdyaXRlXzFfc2hvcnQgKCYgb3Bjb2RlLCAobG9uZykgaW5zbiwgZml4dXBzLT5uZXh0LT5uZXh0LCB0cnVlKTsKLSAgICAgIAotICAgICAgLyogTWFrZSB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gdGhlIGN1cnJlbnQgb25lLiAgKi8KLSAgICAgIGV4dHlwZSA9IEVYRUNfVU5LTk9XTjsKLSAgICAgIGluc24gPSBwcmV2X2luc247Ci0gICAgICBub3dfc2VnID0gcHJldl9zZWc7Ci0gICAgICBub3dfc3Vic2VnID0gcHJldl9zdWJzZWc7Ci0gICAgICBwcmV2X2luc24gPSAtMTsKLSAgICAgIGN1cl9tdWwzMl9wID0gcHJldl9tdWwzMl9wOwotICAgICAgcHJldl9tdWwzMl9wID0gMDsKLSAgICAgIG1lbWNweSAoJm9wY29kZSwgJnByZXZfb3Bjb2RlLCBzaXplb2YgKHByZXZfb3Bjb2RlKSk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBsb25nIGluc3RydWN0aW9uLCB3cml0ZSBpdCBhbmQgYW55IHByZXZpb3VzIHNob3J0IGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG9wY29kZS5mb3JtLT5mb3JtID49IExPTkcpIAotICAgIHsKLSAgICAgIGlmIChleHR5cGUgIT0gRVhFQ19VTktOT1dOKSAKLQlhc19iYWQgKF8oIkluc3RydWN0aW9uIHVzZXMgbG9uZyB2ZXJzaW9uLCBzbyBpdCBjYW5ub3QgYmUgbWl4ZWQgYXMgc3BlY2lmaWVkIikpOwotICAgICAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci0gICAgICB3cml0ZV9sb25nICgmIG9wY29kZSwgaW5zbiwgZml4dXBzKTsKLSAgICAgIHByZXZfaW5zbiA9IC0xOwotICAgIH0KLSAgZWxzZSBpZiAoKHByZXZfaW5zbiAhPSAtMSkKLQkgICAmJiAod3JpdGVfMl9zaG9ydAotCSAgICAgICAoJiBwcmV2X29wY29kZSwgKGxvbmcpIHByZXZfaW5zbiwgJiBvcGNvZGUsCi0JCShsb25nKSBpbnNuLCBleHR5cGUsIGZpeHVwcykgPT0gMCkpIAotICAgIHsKLSAgICAgIC8qIE5vIGluc3RydWN0aW9ucyBzYXZlZC4gICovCi0gICAgICBwcmV2X2luc24gPSAtMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXh0eXBlICE9IEVYRUNfVU5LTk9XTikgCi0JYXNfYmFkIChfKCJVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQiKSk7Ci0gICAgICAKLSAgICAgIC8qIFNhdmUgb2ZmIGxhc3QgaW5zdHJ1Y3Rpb24gc28gaXQgbWF5IGJlIHBhY2tlZCBvbiBuZXh0IHBhc3MuICAqLwotICAgICAgbWVtY3B5ICgmcHJldl9vcGNvZGUsICZvcGNvZGUsIHNpemVvZiAocHJldl9vcGNvZGUpKTsKLSAgICAgIHByZXZfaW5zbiA9IGluc247Ci0gICAgICBwcmV2X3NlZyA9IG5vd19zZWc7Ci0gICAgICBwcmV2X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBmaXh1cHMgPSBmaXh1cHMtPm5leHQ7Ci0gICAgICBwcmV2X211bDMyX3AgPSBjdXJfbXVsMzJfcDsKLSAgICB9Ci19Ci0KLQotLyogZG9fYXNzZW1ibGUgYXNzZW1ibGVzIGEgc2luZ2xlIGluc3RydWN0aW9uIGFuZCByZXR1cm5zIGFuIG9wY29kZSAqLwotLyogaXQgcmV0dXJucyAtMSAoYW4gaW52YWxpZCBvcGNvZGUpIG9uIGVycm9yICovCi0KLSNkZWZpbmUgTkFNRV9CVUZfTEVOCTIwCi0KLXN0YXRpYyBsb25nIGxvbmcKLWRvX2Fzc2VtYmxlIChzdHIsIG9wY29kZSwgc2hvcnRwLCBpc19wYXJhbGxlbCkgCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgc3RydWN0IGQzMHZfaW5zbiAqb3Bjb2RlOwotICAgICBpbnQgc2hvcnRwOwotICAgICBpbnQgaXNfcGFyYWxsZWw7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKiBvcF9zdGFydDsKLSAgdW5zaWduZWQgY2hhciAqIHNhdmU7Ci0gIHVuc2lnbmVkIGNoYXIgKiBvcF9lbmQ7Ci0gIGNoYXIgICAgICAgICAgICBuYW1lIFtOQU1FX0JVRl9MRU5dOwotICBpbnQgICAgICAgICAgICAgY21wX2hhY2s7Ci0gIGludCAgICAgICAgICAgICBubGVuID0gMDsKLSAgaW50ICAgICAgICAgICAgIGZzaXplID0gKHNob3J0cCA/IEZPUkNFX1NIT1JUIDogMCk7Ci0gIGV4cHJlc3Npb25TICAgICBteW9wcyBbNl07Ci0gIGxvbmcgbG9uZyAgICAgICBpbnNuOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqIHN0ciA9PSAnICcpCi0gICAgc3RyICsrOwotCi0gIC8qIGZpbmQgdGhlIG9wY29kZSBlbmQgKi8KLSAgZm9yIChvcF9zdGFydCA9IG9wX2VuZCA9ICh1bnNpZ25lZCBjaGFyICopIChzdHIpOwotICAgICAgICogb3BfZW5kCi0gICAgICAgJiYgbmxlbiA8IChOQU1FX0JVRl9MRU4gLSAxKQotICAgICAgICYmICogb3BfZW5kICE9ICcvJwotICAgICAgICYmICFpc19lbmRfb2ZfbGluZVsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBuYW1lW25sZW5dID0gdG9sb3dlciAob3Bfc3RhcnRbbmxlbl0pOwotICAgICAgbmxlbisrOwotICAgIH0KLQotICBpZiAobmxlbiA9PSAwKQotICAgIHJldHVybiAtMTsKLQotICBuYW1lW25sZW5dID0gMDsKLQotICAvKiBpZiB0aGVyZSBpcyBhbiBleGVjdXRpb24gY29uZGl0aW9uIGNvZGUsIGhhbmRsZSBpdCAqLwotICBpZiAoKm9wX2VuZCA9PSAnLycpCi0gICAgewotICAgICAgaW50IGkgPSAwOwotICAgICAgd2hpbGUgKCAoaSA8IEVDQ19NQVgpICYmIHN0cm5jYXNlY21wIChkMzB2X2VjY19uYW1lc1tpXSwgb3BfZW5kICsgMSwgMikpCi0JaSsrOwotICAgICAgCi0gICAgICBpZiAoaSA9PSBFQ0NfTUFYKQotCXsKLQkgIGNoYXIgdG1wWzRdOwotCSAgc3RybmNweSAodG1wLCBvcF9lbmQgKyAxLCAyKTsKLQkgIHRtcFsyXSA9IDA7Ci0JICBhc19iYWQgKF8oInVua25vd24gY29uZGl0aW9uIGNvZGU6ICVzIiksdG1wKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICAvKiAgICAgIHByaW50ZiAoImNvbmRpdGlvbiBjb2RlPSVkXG4iLGkpOyAqLwotICAgICAgb3Bjb2RlLT5lY2MgPSBpOwotICAgICAgb3BfZW5kICs9IDM7Ci0gICAgfQotICBlbHNlCi0gICAgb3Bjb2RlLT5lY2MgPSBFQ0NfQUw7Ci0gIAotCi0gIC8qIENNUCBhbmQgQ01QVSBjaGFuZ2UgdGhlaXIgbmFtZSBiYXNlZCBvbiBjb25kaXRpb24gY29kZXMgKi8KLSAgaWYgKCFzdHJuY21wIChuYW1lLCAiY21wIiwgMykpCi0gICAgewotICAgICAgaW50IHAsaTsKLSAgICAgIGNoYXIgKipzdHIgPSAoY2hhciAqKilkMzB2X2NjX25hbWVzOwotICAgICAgaWYgKG5hbWVbM10gPT0gJ3UnKQotCXAgPSA0OwotICAgICAgZWxzZQotCXAgPSAzOwotCi0gICAgICBmb3IgKGk9MTsgKnN0ciAmJiBzdHJuY21wICgqc3RyLCAmIG5hbWVbcF0sIDIpOyBpKyssIHN0cisrKQotCTsKLQotICAgICAgLyogY21wdSBvbmx5IHN1cHBvcnRzIHNvbWUgY29uZGl0aW9uIGNvZGVzICovCi0gICAgICBpZiAocCA9PSA0KQotCXsKLQkgIGlmIChpIDwgMyB8fCBpID4gNikKLQkgICAgewotCSAgICAgIG5hbWVbcCsyXT0wOwotCSAgICAgIGFzX2JhZCAoXygiY21wdSBkb2Vzbid0IHN1cHBvcnQgY29uZGl0aW9uIGNvZGUgJXMiKSwmbmFtZVtwXSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghKnN0cikKLQl7Ci0JICBuYW1lW3ArMl09MDsKLQkgIGFzX2JhZCAoXygidW5rbm93biBjb25kaXRpb24gY29kZTogJXMiKSwmbmFtZVtwXSk7ICAgICAgCi0JfQotICAgICAgCi0gICAgICBjbXBfaGFjayA9IGk7Ci0gICAgICBuYW1lW3BdID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICBjbXBfaGFjayA9IDA7Ci0gIAotICAvKiAgcHJpbnRmKCJjbXBfaGFjaz0lZFxuIixjbXBfaGFjayk7ICovCi0KLSAgLyogbmVlZCB0byBsb29rIGZvciAucyBvciAubCAqLwotICBpZiAobmFtZVtubGVuLTJdID09ICcuJykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG5hbWVbbmxlbi0xXSkKLQl7Ci0JY2FzZSAncyc6Ci0JICBmc2l6ZSA9IEZPUkNFX1NIT1JUOwotCSAgYnJlYWs7Ci0JY2FzZSAnbCc6Ci0JICBmc2l6ZSA9IEZPUkNFX0xPTkc7Ci0JICBicmVhazsKLQl9Ci0gICAgICBuYW1lW25sZW4tMl0gPSAwOwotICAgIH0KLQotICAvKiBmaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUgKi8gIAotICBvcGNvZGUtPm9wID0gKHN0cnVjdCBkMzB2X29wY29kZSAqKWhhc2hfZmluZCAoZDMwdl9oYXNoLCBuYW1lKTsKLSAgaWYgKG9wY29kZS0+b3AgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlOiAlcyIpLG5hbWUpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvcF9lbmQ7Ci0gIHdoaWxlICghKG9wY29kZS0+Zm9ybSA9IGZpbmRfZm9ybWF0IChvcGNvZGUtPm9wLCBteW9wcywgZnNpemUsIGNtcF9oYWNrKSkpCi0gICAgewotICAgICAgb3Bjb2RlLT5vcCsrOwotICAgICAgaWYgKG9wY29kZS0+b3AtPm5hbWUgPT0gTlVMTCB8fCBzdHJjbXAgKG9wY29kZS0+b3AtPm5hbWUsIG5hbWUpKQotCXsKLQkgIGFzX2JhZCAoXygib3BlcmFuZHMgZm9yIG9wY29kZSBgJXMnIGRvIG5vdCBtYXRjaCBhbnkgdmFsaWQgZm9ybWF0IiksIG5hbWUpOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0KLSAgaW5zbiA9IGJ1aWxkX2luc24gKG9wY29kZSwgbXlvcHMpOyAKLQotICAvKiBQcm9waWdhdGUgbXVsdGlwbHkgc3RhdHVzICovCi0gIGlmIChpbnNuICE9IC0xKQotICAgIHsKLSAgICAgIGlmIChpc19wYXJhbGxlbCAmJiBwcmV2X211bDMyX3ApCi0JY3VyX211bDMyX3AgPSAxOwotICAgICAgZWxzZQotCXsKLQkgIHByZXZfbXVsMzJfcCA9IGN1cl9tdWwzMl9wOwotCSAgY3VyX211bDMyX3AgID0gKG9wY29kZS0+b3AtPmZsYWdzX3VzZWQgJiBGTEFHX01VTDMyKSAhPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogUHJvcGFnYXRlIGxlZnRfa2lsbHNfcmlnaHQgc3RhdHVzICovCi0gIGlmIChpbnNuICE9IC0xKQotICAgIHsKLSAgICAgIHByZXZfbGVmdF9raWxsc19yaWdodF9wID0gY3VyX2xlZnRfa2lsbHNfcmlnaHRfcDsKLQotICAgICAgaWYgKG9wY29kZS0+b3AtPmZsYWdzX3NldCAmIEZMQUdfTEtSKQotCXsKLQkgIGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAxOwotCSAgCi0JICBpZiAoc3RyY21wIChvcGNvZGUtPm9wLT5uYW1lLCAibXZ0c3lzIikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIExlZnQga2lsbHMgcmlnaHQgZm9yIG9ubHkgbXZ0c3lzIG9ubHkgZm9yIFBTVy9QU1dIL1BTV0wvZmxhZ3MgdGFyZ2V0LiAqLwotCSAgICAgIGlmICgobXlvcHNbMF0uWF9vcCA9PSBPX3JlZ2lzdGVyKSAmJgotCQkgICgobXlvcHNbMF0uWF9hZGRfbnVtYmVyID09IE9QRVJBTkRfQ09OVFJPTCkgfHwgLyogcHN3ICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysyKSB8fCAvKiBwc3doICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysxKSB8fCAvKiBwc3dsICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzApIHx8IC8qIGYwICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzEpIHx8IC8qIGYxICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzIpIHx8IC8qIGYyICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzMpIHx8IC8qIGYzICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzQpIHx8IC8qIGY0ICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzUpIHx8IC8qIGY1ICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzYpIHx8IC8qIGY2ICovCi0JCSAgIChteW9wc1swXS5YX2FkZF9udW1iZXIgPT0gT1BFUkFORF9GTEFHKzcpKSkgLyogZjcgKi8KLQkJewotCQkgIGN1cl9sZWZ0X2tpbGxzX3JpZ2h0X3AgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogT3RoZXIgbXZ0c3lzIHRhcmdldCByZWdpc3RlcnMgZG9uJ3Qga2lsbCByaWdodCBpbnN0cnVjdGlvbi4gKi8KLQkJICBjdXJfbGVmdF9raWxsc19yaWdodF9wID0gMDsKLQkJfQotCSAgICB9IC8qIG12dHN5cyAqLwotCX0KLSAgICAgIGVsc2UKLQljdXJfbGVmdF9raWxsc19yaWdodF9wID0gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIGluc247Ci19Ci0KLQotLyogZmluZF9mb3JtYXQoKSBnZXRzIGEgcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZm9ybWF0IHRhYmxlLgotICAgSXQgbXVzdCBsb29rIGF0IGFsbCBmb3JtYXRzIGZvciBhbiBvcGNvZGUgYW5kIHVzZSB0aGUgb3BlcmFuZHMKLSAgIHRvIGNob29zZSB0aGUgY29ycmVjdCBvbmUuICBSZXR1cm5zIE5VTEwgb24gZXJyb3IuICovCi0KLXN0YXRpYyBzdHJ1Y3QgZDMwdl9mb3JtYXQgKgotZmluZF9mb3JtYXQgKG9wY29kZSwgbXlvcHMsIGZzaXplLCBjbXBfaGFjaykKLSAgICAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TIG15b3BzW107Ci0gICAgIGludCBmc2l6ZTsKLSAgICAgaW50IGNtcF9oYWNrOwotewotICBpbnQgbnVtb3BzLCBtYXRjaCwgaW5kZXgsIGk9MCwgaiwgazsKLSAgc3RydWN0IGQzMHZfZm9ybWF0ICpmbTsKLQotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAvKiBHZXQgYWxsIHRoZSBvcGVyYW5kcyBhbmQgc2F2ZSB0aGVtIGFzIGV4cHJlc3Npb25zLiAgKi8KLSAgbnVtb3BzID0gZ2V0X29wZXJhbmRzIChteW9wcywgY21wX2hhY2spOwotCi0gIHdoaWxlICgoaW5kZXggPSBvcGNvZGUtPmZvcm1hdFtpKytdKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChmc2l6ZSA9PSBGT1JDRV9TSE9SVCAmJiBpbmRleCA+PSBMT05HKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoZnNpemUgPT0gRk9SQ0VfTE9ORyAmJiBpbmRleCA8IExPTkcpCi0JY29udGludWU7Ci0KLSAgICAgIGZtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKSZkMzB2X2Zvcm1hdF90YWJsZVtpbmRleF07Ci0gICAgICBrID0gaW5kZXg7Ci0gICAgICB3aGlsZSAoZm0tPmZvcm0gPT0gaW5kZXgpCi0JewotCSAgbWF0Y2ggPSAxOwotCSAgLyogTm93IGNoZWNrIHRoZSBvcGVyYW5kcyBmb3IgY29tcGF0aWJpbGl0eS4gICovCi0JICBmb3IgKGogPSAwOyBtYXRjaCAmJiBmbS0+b3BlcmFuZHNbal07IGorKykKLQkgICAgewotCSAgICAgIGludCBmbGFncyA9IGQzMHZfb3BlcmFuZF90YWJsZVtmbS0+b3BlcmFuZHNbal1dLmZsYWdzOwotCSAgICAgIGludCBiaXRzID0gZDMwdl9vcGVyYW5kX3RhYmxlW2ZtLT5vcGVyYW5kc1tqXV0uYml0czsKLQkgICAgICBpbnQgWF9vcCA9IG15b3BzW2pdLlhfb3A7Ci0JICAgICAgaW50IG51bSA9IG15b3BzW2pdLlhfYWRkX251bWJlcjsKLQkgICAgICAKLQkgICAgICBpZiAoZmxhZ3MgJiBPUEVSQU5EX1NQRUNJQUwpCi0JCWJyZWFrOwotCSAgICAgIGVsc2UgaWYgKFhfb3AgPT0gT19pbGxlZ2FsKQotCQltYXRjaCA9IDA7Ci0JICAgICAgZWxzZSBpZiAoZmxhZ3MgJiBPUEVSQU5EX1JFRykKLQkJewotCQkgIGlmIChYX29wICE9IE9fcmVnaXN0ZXIKLQkJICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQUNDKSAmJiAhKG51bSAmIE9QRVJBTkRfQUNDKSkKLQkJICAgICAgfHwgKCEoZmxhZ3MgJiBPUEVSQU5EX0FDQykgJiYgKG51bSAmIE9QRVJBTkRfQUNDKSkKLQkJICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfRkxBRykgJiYgIShudW0gJiBPUEVSQU5EX0ZMQUcpKQotCQkgICAgICB8fCAoIShmbGFncyAmIChPUEVSQU5EX0ZMQUcgfCBPUEVSQU5EX0NPTlRST0wpKSAmJiAobnVtICYgT1BFUkFORF9GTEFHKSkKLQkJICAgICAgfHwgKChmbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkKLQkJCSAgJiYgIShudW0gJiAoT1BFUkFORF9DT05UUk9MIHwgT1BFUkFORF9GTEFHKSkpKQotCQkgICAgewotCQkgICAgICBtYXRjaCA9IDA7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoKGZsYWdzICYgT1BFUkFORF9NSU5VUykKLQkJICAgICAgICAmJiAoWF9vcCAhPSBPX2Fic2VudCB8fCBudW0gIT0gT1BFUkFORF9NSU5VUykpCi0JCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9QTFVTKQotCQkJICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfUExVUykpCi0JCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BVE1JTlVTKQotCQkJICAgJiYgKFhfb3AgIT0gT19hYnNlbnQgfHwgbnVtICE9IE9QRVJBTkRfQVRNSU5VUykpCi0JCSAgICAgICB8fCAoKGZsYWdzICYgT1BFUkFORF9BVFBBUikKLQkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX0FUUEFSKSkKLQkJICAgICAgIHx8ICgoZmxhZ3MgJiBPUEVSQU5EX0FUU0lHTikKLQkJCSAgICYmIChYX29wICE9IE9fYWJzZW50IHx8IG51bSAhPSBPUEVSQU5EX0FUU0lHTikpKQotCQl7Ci0JCSAgbWF0Y2g9MDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGZsYWdzICYgT1BFUkFORF9OVU0pCi0JCXsKLQkJICAvKiBBIG51bWJlciBjYW4gYmUgYSBjb25zdGFudCBvciBzeW1ib2wgZXhwcmVzc2lvbi4gICovCi0KLQkJICAvKiBJZiB3ZSBoYXZlIGZvdW5kIGEgcmVnaXN0ZXIgbmFtZSwgYnV0IHRoYXQgbmFtZSBhbHNvCi0JCSAgICAgbWF0Y2hlcyBhIHN5bWJvbCwgdGhlbiByZS1wYXJzZSB0aGUgbmFtZSBhcyBhbiBleHByZXNzaW9uLiAgKi8KLQkJICBpZiAoWF9vcCA9PSBPX3JlZ2lzdGVyCi0JCSAgICAgICYmIHN5bWJvbF9maW5kICgoY2hhciAqKSBteW9wc1tqXS5YX29wX3N5bWJvbCkpCi0JCSAgICB7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IChjaGFyICopIG15b3BzW2pdLlhfb3Bfc3ltYm9sOwotCQkgICAgICBleHByZXNzaW9uICgmIG15b3BzW2pdKTsKLQkJICAgIH0KLQkJICAgICAgCi0JCSAgLyogVHVybiBhbiBleHByZXNzaW9uIGludG8gYSBzeW1ib2wgZm9yIGxhdGVyIHJlc29sdXRpb24uICAqLwotCQkgIGlmIChYX29wICE9IE9fYWJzZW50ICYmIFhfb3AgIT0gT19jb25zdGFudAotCQkgICAgICAmJiBYX29wICE9IE9fc3ltYm9sICYmIFhfb3AgIT0gT19yZWdpc3RlcgotCQkgICAgICAmJiBYX29wICE9IE9fYmlnKQotCQkgICAgewotCQkgICAgICBzeW1ib2xTICpzeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmbXlvcHNbal0pOwotCQkgICAgICBteW9wc1tqXS5YX29wID0gWF9vcCA9IE9fc3ltYm9sOwotCQkgICAgICBteW9wc1tqXS5YX2FkZF9zeW1ib2wgPSBzeW07Ci0JCSAgICAgIG15b3BzW2pdLlhfYWRkX251bWJlciA9IG51bSA9IDA7Ci0JCSAgICB9Ci0KLQkJICBpZiAoZm0tPmZvcm0gPj0gTE9ORykKLQkJICAgIHsKLQkJICAgICAgLyogSWYgd2UncmUgdGVzdGluZyBmb3IgYSBMT05HIGZvcm1hdCwgZWl0aGVyIGZpdHMuICovCi0JCSAgICAgIGlmIChYX29wICE9IE9fY29uc3RhbnQgJiYgWF9vcCAhPSBPX3N5bWJvbCkKLQkJCW1hdGNoID0gMDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChmbS0+Zm9ybSA8IExPTkcKLQkJCSAgICYmICgoZnNpemUgPT0gRk9SQ0VfU0hPUlQgJiYgWF9vcCA9PSBPX3N5bWJvbCkKLQkJCSAgICAgICB8fCAoZm0tPmZvcm0gPT0gU0hPUlRfRDIgJiYgaiA9PSAwKSkpCi0JCSAgICBtYXRjaCA9IDE7Ci0JCSAgLyogVGhpcyBpcyB0aGUgdHJpY2t5IHBhcnQuICBXaWxsIHRoZSBjb25zdGFudCBvciBzeW1ib2wKLQkJICAgICBmaXQgaW50byB0aGUgc3BhY2UgaW4gdGhlIGN1cnJlbnQgZm9ybWF0PyAqLwotCQkgIGVsc2UgaWYgKFhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgIHsKLQkJICAgICAgaWYgKGNoZWNrX3JhbmdlIChudW0sIGJpdHMsIGZsYWdzKSkKLQkJCW1hdGNoID0gMDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChYX29wID09IE9fc3ltYm9sCi0JCQkgICAmJiBTX0lTX0RFRklORUQgKG15b3BzW2pdLlhfYWRkX3N5bWJvbCkKLQkJCSAgICYmIFNfR0VUX1NFR01FTlQgKG15b3BzW2pdLlhfYWRkX3N5bWJvbCkgPT0gbm93X3NlZwotCQkJICAgJiYgb3Bjb2RlLT5yZWxvY19mbGFnID09IFJFTE9DX1BDUkVMKQotCQkgICAgewotCQkgICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHNlZSBpZiB0aGUgdmFsdWUgd2lsbCBmaXQKLQkJCSBpbnRvIHRoZSBmb3JtIHdlJ3JlIGNvbnNpZGVyaW5nLiAqLwotCQkgICAgICBmcmFnUyAqZjsKLQkJICAgICAgbG9uZyB2YWx1ZTsKLQotCQkgICAgICAvKiBDYWxjdWxhdGUgdGhlIGN1cnJlbnQgYWRkcmVzcyBieSBydW5uaW5nIHRocm91Z2ggdGhlCi0JCQkgcHJldmlvdXMgZnJhZ3MgYW5kIGFkZGluZyBvdXIgY3VycmVudCBvZmZzZXQuICAqLwotCQkgICAgICB2YWx1ZSA9IDA7Ci0JCSAgICAgIGZvciAoZiA9IGZyY2hhaW5fbm93LT5mcmNoX3Jvb3Q7IGY7IGYgPSBmLT5mcl9uZXh0KQotCQkJdmFsdWUgKz0gZi0+ZnJfZml4ICsgZi0+ZnJfb2Zmc2V0OwotCQkgICAgICB2YWx1ZSA9IChTX0dFVF9WQUxVRSAobXlvcHNbal0uWF9hZGRfc3ltYm9sKSAtIHZhbHVlCi0JCQkgICAgICAgLSAob2JzdGFja19uZXh0X2ZyZWUgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKQotCQkJCSAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkpOwotCQkgICAgICBpZiAoY2hlY2tfcmFuZ2UgKHZhbHVlLCBiaXRzLCBmbGFncykpIAotCQkJbWF0Y2ggPSAwOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIG1hdGNoID0gMDsKLQkJfQotCSAgICB9Ci0JICAvKiBwcmludGYoInRocm91Z2ggdGhlIGxvb3A6IG1hdGNoPSVkXG4iLG1hdGNoKTsgICovCi0JICAvKiBXZSdyZSBvbmx5IGRvbmUgaWYgdGhlIG9wZXJhbmRzIG1hdGNoZWQgc28gZmFyIEFORCB0aGVyZQotCSAgICAgYXJlIG5vIG1vcmUgdG8gY2hlY2suICAqLwotCSAgaWYgKG1hdGNoICYmIG15b3BzW2pdLlhfb3AgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEZpbmFsIGNoZWNrIC0gaXNzdWUgYSB3YXJuaW5nIGlmIGFuIG9kZCBudW1iZXJlZCByZWdpc3RlcgotCQkgaXMgdXNlZCBhcyB0aGUgZmlyc3QgcmVnaXN0ZXIgaW4gYW4gaW5zdHJ1Y3Rpb24gdGhhdCByZWFkcwotCQkgb3Igd3JpdGVzIDIgcmVnaXN0ZXJzLiAgKi8KLQotCSAgICAgIGZvciAoaiA9IDA7IGZtLT5vcGVyYW5kc1tqXTsgaisrKQotCQlpZiAobXlvcHNbal0uWF9vcCA9PSBPX3JlZ2lzdGVyCi0JCSAgICAmJiAobXlvcHNbal0uWF9hZGRfbnVtYmVyICYgMSkKLQkJICAgICYmIChkMzB2X29wZXJhbmRfdGFibGVbZm0tPm9wZXJhbmRzW2pdXS5mbGFncyAmIE9QRVJBTkRfMlJFRykpCi0JCSAgYXNfd2FybiAoXAotXygiT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uIikpOwotCSAgICAgIAotCSAgICAgIHJldHVybiBmbTsKLQkgICAgfQotCSAgZm0gPSAoc3RydWN0IGQzMHZfZm9ybWF0ICopJmQzMHZfZm9ybWF0X3RhYmxlWysra107Ci0JfQotICAgICAgLyogcHJpbnRmKCJ0cnlpbmcgYW5vdGhlciBmb3JtYXQ6IGk9JWRcbiIsaSk7ICovCi0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogaWYgd2hpbGUgcHJvY2Vzc2luZyBhIGZpeHVwLCBhIHJlbG9jIHJlYWxseSBuZWVkcyB0byBiZSBjcmVhdGVkICovCi0vKiB0aGVuIGl0IGlzIGRvbmUgaGVyZSAqLwotICAgICAgICAgICAgICAgICAKLWFyZWxlbnQgKgotdGNfZ2VuX3JlbG9jIChzZWcsIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwgKGludClmaXhwLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICByZXR1cm4gcmVsb2M7Ci19Ci0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLXsKLSAgYWJvcnQgKCk7Ci0gIHJldHVybiAwOwotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHNlZ1Qgc2VjOwotewotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKilOVUxMICYmICghU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkgfHwKLSAgICAgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBzZWMpKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqIGZpeHA7Ci0gICAgIHZhbHVlVCAqIHZhbHVlcDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIGNoYXIgKiB3aGVyZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuLCBpbnNuMjsKLSAgbG9uZyB2YWx1ZTsKLSAgCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHZhbHVlID0gKiB2YWx1ZXA7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKiB2YWx1ZXA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGZpeHAtPmZ4X29mZnNldDsKLSAgICAgIAotICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKSAKLQkgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdlIGRvbid0IGFjdHVhbGx5IHN1cHBvcnQgc3VidHJhY3RpbmcgYSBzeW1ib2wuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICBfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0gICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgaW5zbiA9IGJmZF9nZXRiMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgCi0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184OiAgLyogQ2hlY2sgZm9yIGEgYmFkIC5ieXRlIGRpcmVjdGl2ZS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQlhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBieXRlIiksCi0JCWZpeHAtPmZ4X2xpbmUsIFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSk7Ci0gICAgICBlbHNlIGlmICgoKHVuc2lnbmVkKXZhbHVlKSA+IDB4ZmYpCi0JICBhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgYnl0ZSIpLAotCQkgICAgZml4cC0+ZnhfbGluZSwgdmFsdWUpOwotICAgICAgZWxzZQotCSogKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6ICAvKiBDaGVjayBmb3IgYSBiYWQgLnNob3J0IGRpcmVjdGl2ZS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLQlhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBzaG9ydCIpLAotCQlmaXhwLT5meF9saW5lLCBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotICAgICAgZWxzZSBpZiAoKCh1bnNpZ25lZCl2YWx1ZSkgPiAweGZmZmYpCi0JICBhc19iYWQgKF8oImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgc2hvcnQiKSwKLQkJICAgIGZpeHAtPmZ4X2xpbmUsIHZhbHVlKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6ICAvKiBDaGVjayBmb3IgYSBiYWQgLnF1YWQgZGlyZWN0aXZlLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMKQotCWFzX2JhZCAoXygibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIGFkZHJlc3Mgb2Ygc3ltYm9sICclcycgaW50byBhIHF1YWQiKSwKLQkJZml4cC0+ZnhfbGluZSwgU19HRVRfTkFNRSAoZml4cC0+ZnhfYWRkc3kpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgdmFsdWUsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQkgIGJmZF9wdXRiMzIgKDAsICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSkgKyA0KTsKLQl9Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgQkZEX1JFTE9DX0QzMFZfNjoKLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCA2LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gdmFsdWUgJiAweDNGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl85X1BDUkVMOgotICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICYgMHg3KQotCXsKLQkgIGlmIChmaXhwLT5meF9kb25lKQotCSAgICB2YWx1ZSArPSA0OwotCSAgZWxzZQotCSAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDMwVl85X1BDUkVMX1I7Ci0JfQotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDksIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaW5zbiB8PSAoKHZhbHVlID4+IDMpICYgMHgzRikgPDwgMTI7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzE1OgotICAgICAgY2hlY2tfc2l6ZSAodmFsdWUsIDE1LCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDMpICYgMHhGRkY7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzE1X1BDUkVMOgotICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICYgMHg3KQotCXsKLQkgIGlmIChmaXhwLT5meF9kb25lKQotCSAgICB2YWx1ZSArPSA0OwotCSAgZWxzZQotCSAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDMwVl8xNV9QQ1JFTF9SOwotCX0KLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAxNSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4RkZGOwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8yMToKLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAyMSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4M0ZGRkY7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzIxX1BDUkVMOgotICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICYgMHg3KQotCXsKLQkgIGlmIChmaXhwLT5meF9kb25lKQotCSAgICB2YWx1ZSArPSA0OwotCSAgZWxzZQotCSAgICBmaXhwLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfRDMwVl8yMV9QQ1JFTF9SOwotCX0KLSAgICAgIGNoZWNrX3NpemUgKHZhbHVlLCAyMSwgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSk7Ci0gICAgICBpbnNuIHw9ICh2YWx1ZSA+PiAzKSAmIDB4M0ZGRkY7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19EMzBWXzMyOgotICAgICAgaW5zbjIgPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSArIDQpOwotICAgICAgaW5zbiB8PSAodmFsdWUgPj4gMjYpICYgMHgzRjsJCS8qIHRvcCA2IGJpdHMgKi8KLSAgICAgIGluc24yIHw9ICgodmFsdWUgJiAweDAzRkMwMDAwKSA8PCAyKTsJLyogbmV4dCA4IGJpdHMgKi8gCi0gICAgICBpbnNuMiB8PSB2YWx1ZSAmIDB4MDAwM0ZGRkY7CQkvKiBib3R0b20gMTggYml0cyAqLwotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuMiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfRDMwVl8zMl9QQ1JFTDoKLSAgICAgIGluc24yID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUgKyA0KTsKLSAgICAgIGluc24gfD0gKHZhbHVlID4+IDI2KSAmIDB4M0Y7CQkvKiB0b3AgNiBiaXRzICovCi0gICAgICBpbnNuMiB8PSAoKHZhbHVlICYgMHgwM0ZDMDAwMCkgPDwgMik7CS8qIG5leHQgOCBiaXRzICovIAotICAgICAgaW5zbjIgfD0gdmFsdWUgJiAweDAwMDNGRkZGOwkJLyogYm90dG9tIDE4IGJpdHMgKi8KLSAgICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBiZmRfcHV0YjMyICgoYmZkX3ZtYSkgaW5zbjIsICh1bnNpZ25lZCBjaGFyICopIHdoZXJlICsgNCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImxpbmUgJWQ6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlOiAweCV4IiksCi0JICAgICAgZml4cC0+ZnhfbGluZSxmaXhwLT5meF9yX3R5cGUpOwotICAgIH0KLSAgCi0gIHJldHVybiAwOwotfQotCi0KLS8qIGQzMHZfY2xlYW51cCgpIGlzIGNhbGxlZCBhZnRlciB0aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZCBwYXJzaW5nIHRoZSBpbnB1dCAKLSAgIGZpbGUgb3IgYWZ0ZXIgYSBsYWJlbCBpcyBkZWZpbmVkLiAgQmVjYXVzZSB0aGUgRDMwViBhc3NlbWJsZXIgc29tZXRpbWVzIHNhdmVzIHNob3J0IAotICAgaW5zdHJ1Y3Rpb25zIHRvIHNlZSBpZiBpdCBjYW4gcGFja2FnZSB0aGVtIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIHRoZXJlIG1heQotICAgYmUgYSBzaG9ydCBpbnN0cnVjdGlvbiB0aGF0IHN0aWxsIG5lZWRzIHdyaXR0ZW4uICAqLwotaW50Ci1kMzB2X2NsZWFudXAgKHVzZV9zZXF1ZW50aWFsKQotICAgICBpbnQgdXNlX3NlcXVlbnRpYWw7Ci17Ci0gIHNlZ1Qgc2VnOwotICBzdWJzZWdUIHN1YnNlZzsKLQotICBpZiAocHJldl9pbnNuICE9IC0xKQotICAgIHsKLSAgICAgIHNlZyA9IG5vd19zZWc7Ci0gICAgICBzdWJzZWcgPSBub3dfc3Vic2VnOwotICAgICAgc3Vic2VnX3NldCAocHJldl9zZWcsIHByZXZfc3Vic2VnKTsKLSAgICAgIHdyaXRlXzFfc2hvcnQgKCZwcmV2X29wY29kZSwgKGxvbmcpcHJldl9pbnNuLCBmaXh1cHMtPm5leHQsIHVzZV9zZXF1ZW50aWFsKTsKLSAgICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLSAgICAgIHByZXZfaW5zbiA9IC0xOwotICAgICAgaWYgKHVzZV9zZXF1ZW50aWFsKQotCXByZXZfbXVsMzJfcCA9IGZhbHNlOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgIAotZDMwdl9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIG4pCi0gICAgIGNoYXIgKmJ1ZjsJCQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgbG9uZyBsb25nIHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbjsJCQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgd2hpbGUgKG4tLSkKLSAgICB7Ci0gICAgICBidWZbbl0gPSB2YWx1ZSAmIDB4ZmY7Ci0gICAgICB2YWx1ZSA+Pj0gODsKLSAgICB9Ci19Ci0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGxpbmUuICovCi0vKiBpdCBjaGVja3MgdG8gc2VlIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaXMgYSAnLicgKi8KLS8qIHdoaWNoIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYSBwc2V1ZG8tb3AuICBJZiBpdCBpcywgKi8KLS8qIHRoZW4gd3JpdGUgb3V0IGFueSB1bndyaXR0ZW4gaW5zdHJ1Y3Rpb25zICovCi0KLXZvaWQgCi1kMzB2X3N0YXJ0X2xpbmUgKCkKLXsKLSAgY2hhciAqYyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICB3aGlsZSAoaXNzcGFjZSAoKmMpKQotICAgIGMrKzsKLQotICBpZiAoKmMgPT0gJy4nKQotICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCAKLWNoZWNrX3NpemUgKHZhbHVlLCBiaXRzLCBmaWxlLCBsaW5lKQotICAgICBsb25nIHZhbHVlOwotICAgICBpbnQgYml0czsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgaW50IGxpbmU7Ci17Ci0gIGludCB0bXAsIG1heDsKLQotICBpZiAodmFsdWUgPCAwKQotICAgIHRtcCA9IH52YWx1ZTsKLSAgZWxzZQotICAgIHRtcCA9IHZhbHVlOwotICAgIAotICBtYXggPSAoMSA8PCAoYml0cyAtIDEpKSAtIDE7Ci0KLSAgaWYgKHRtcCA+IG1heCkKLSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oInZhbHVlIHRvbyBsYXJnZSB0byBmaXQgaW4gJWQgYml0cyIpLCBiaXRzKTsKLQotICByZXR1cm47Ci19Ci0KLS8qIGQzMHZfZnJvYl9sYWJlbCgpIGlzIGNhbGxlZCB3aGVuIGFmdGVyIGEgbGFiZWwgaXMgcmVjb2duaXplZC4gICovCi0KLXZvaWQKLWQzMHZfZnJvYl9sYWJlbCAobGFiKQotICAgICBzeW1ib2xTICpsYWI7Ci17Ci0gIC8qIEVtaXQgYW55IHBlbmRpbmcgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgZDMwdl9jbGVhbnVwIChmYWxzZSk7Ci0KLSAgLyogVXBkYXRlIHRoZSBsYWJlbCdzIGFkZHJlc3Mgd2l0aCB0aGUgY3VycmVudCBvdXRwdXQgcG9pbnRlci4gICovCi0gIHN5bWJvbF9zZXRfZnJhZyAobGFiLCBmcmFnX25vdyk7Ci0gIFNfU0VUX1ZBTFVFIChsYWIsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0KLSAgLyogUmVjb3JkIHRoaXMgbGFiZWwgZm9yIGZ1dHVyZSBhZGp1c3RtZW50IGFmdGVyIHdlIGZpbmQgb3V0IHdoYXQKLSAgICAga2luZCBvZiBkYXRhIGl0IHJlZmVyZW5jZXMsIGFuZCB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IHRoZXJld2l0aC4gICovCi0gIGQzMHZfbGFzdF9sYWJlbCA9IGxhYjsKLX0KLQotLyogSG9vayBpbnRvIGNvbnMgZm9yIGNhcHR1cmluZyBhbGlnbm1lbnQgY2hhbmdlcy4gICovCi0KLXZvaWQKLWQzMHZfY29uc19hbGlnbiAoc2l6ZSkKLSAgICAgaW50IHNpemU7Ci17Ci0gIGludCBsb2dfc2l6ZTsKLQotICBsb2dfc2l6ZSA9IDA7Ci0gIHdoaWxlICgoc2l6ZSA+Pj0gMSkgIT0gMCkKLSAgICArK2xvZ19zaXplOwotCi0gIGlmIChkMzB2X2N1cnJlbnRfYWxpZ24gPCBsb2dfc2l6ZSkKLSAgICBkMzB2X2FsaWduIChsb2dfc2l6ZSwgKGNoYXIgKikgTlVMTCwgTlVMTCk7Ci0gIGVsc2UgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA+IGxvZ19zaXplKQotICAgIGQzMHZfY3VycmVudF9hbGlnbiA9IGxvZ19zaXplOwotICBkMzB2X2xhc3RfbGFiZWwgPSBOVUxMOwotfQotCi0vKiBDYWxsZWQgaW50ZXJuYWxseSB0byBoYW5kbGUgYWxsIGFsaWdubWVudCBuZWVkcy4gIFRoaXMgdGFrZXMgY2FyZQotICAgb2YgZWxpZGluZyBjYWxscyB0byBmcmFnX2FsaWduIGlmJ24gdGhlIGNhY2hlZCBjdXJyZW50IGFsaWdubWVudAotICAgc2F5cyB3ZSd2ZSBhbHJlYWR5IGdvdCBpdCwgYXMgd2VsbCBhcyB0YWtpbmcgY2FyZSBvZiB0aGUgYXV0by1hbGlnbmluZwotICAgbGFiZWxzIHdydCBjb2RlLiAgKi8KLQotc3RhdGljIHZvaWQKLWQzMHZfYWxpZ24gKG4sIHBmaWxsLCBsYWJlbCkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKnBmaWxsOwotICAgICBzeW1ib2xTICpsYWJlbDsKLXsKLSAgLyogVGhlIGZyb250IGVuZCBpcyBwcm9uZSB0byBjaGFuZ2luZyBzZWdtZW50cyBvdXQgZnJvbSB1bmRlciB1cwotICAgICB0ZW1wb3JhcmlseSB3aGVuIC1nIGlzIGluIGVmZmVjdC4gICovCi0gIGludCBzd2l0Y2hlZF9zZWdfcCA9IChkMzB2X2N1cnJlbnRfYWxpZ25fc2VnICE9IG5vd19zZWcpOwotCi0gIC8qIERvIG5vdCBhc3N1bWUgdGhhdCBpZiAnZDMwdl9jdXJyZW50X2FsaWduID49IG4nIGFuZAotICAgICAnISBzd2l0Y2hlZF9zZWdfcCcgdGhhdCBpdCBpcyBzYWZlIHRvIGF2b2lkIHBlcmZvcm1pbmcKLSAgICAgdGhpcyBhbGlnbmVtZW50IHJlcXVlc3QuICBUaGUgYWxpZ25tZW50IG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgICAgY2FuIGJlIGNoYW5nZWQgdW5kZXIgb3VyIGZlZXQsIGZvciBleGFtcGxlIGJ5IGEgLmFzY2lpCi0gICAgIGRpcmVjdGl2ZSBpbiB0aGUgc291cmNlIGNvZGUuICBjZiB0ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucyAgKi8KLSAgCi0gIGQzMHZfY2xlYW51cCAoZmFsc2UpOwotCi0gIGlmIChwZmlsbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChuID4gMgotCSAgJiYgKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKSAmIFNFQ19DT0RFKSAhPSAwKQotCXsKLQkgIHN0YXRpYyBjaGFyIGNvbnN0IG5vcFs0XSA9IHsgMHgwMCwgMHhmMCwgMHgwMCwgMHgwMCB9OwotCi0JICAvKiBGaXJzdCwgbWFrZSBzdXJlIHdlJ3JlIG9uIGEgZm91ci1ieXRlIGJvdW5kYXJ5LCBpbiBjYXNlCi0JICAgICBzb21lb25lIGhhcyBiZWVuIHB1dHRpbmcgLmJ5dGUgdmFsdWVzIHRoZSB0ZXh0IHNlY3Rpb24uICAqLwotCSAgaWYgKGQzMHZfY3VycmVudF9hbGlnbiA8IDIgfHwgc3dpdGNoZWRfc2VnX3ApCi0JICAgIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotCSAgZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBub3AsIHNpemVvZiBub3AsIDApOwotCX0KLSAgICAgIGVsc2UKLQlmcmFnX2FsaWduIChuLCAwLCAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcmFnX2FsaWduIChuLCAqcGZpbGwsIDApOwotCi0gIGlmICghc3dpdGNoZWRfc2VnX3ApCi0gICAgZDMwdl9jdXJyZW50X2FsaWduID0gbjsKLQotICBpZiAobGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICogICAgIHN5bTsKLSAgICAgIGludCAgICAgICAgICAgbGFiZWxfc2VlbiA9IGZhbHNlOwotICAgICAgc3RydWN0IGZyYWcgKiBvbGRfZnJhZzsKLSAgICAgIHZhbHVlVCAgICAgICAgb2xkX3ZhbHVlOwotICAgICAgdmFsdWVUICAgICAgICBuZXdfdmFsdWU7Ci0gICAgICAKLSAgICAgIGFzc2VydCAoU19HRVRfU0VHTUVOVCAobGFiZWwpID09IG5vd19zZWcpOwotCi0gICAgICBvbGRfZnJhZyAgPSBzeW1ib2xfZ2V0X2ZyYWcgKGxhYmVsKTsKLSAgICAgIG9sZF92YWx1ZSA9IFNfR0VUX1ZBTFVFIChsYWJlbCk7Ci0gICAgICBuZXdfdmFsdWUgPSAodmFsdWVUKSBmcmFnX25vd19maXggKCk7Ci0gICAgICAKLSAgICAgIC8qIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBsYWJlbCBhdCBhIHBhcnRpY3VsYXIKLQkgYWRkcmVzcywgZXNwZWNpYWxseSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZCwgc28gd2UgbXVzdAotCSB0YWtlIGNhcmUgdG8gYWRqdXN0IGFsbCB0aGUgbGFiZWxzIGF0IHRoaXMgYWRkcmVzcyBpbiB0aGlzCi0JIGZyYWdtZW50LiAgVG8gc2F2ZSB0aW1lIHdlIHNlYXJjaCBmcm9tIHRoZSBlbmQgb2YgdGhlIHN5bWJvbAotCSBsaXN0LCBiYWNrd2FyZHMsIHNpbmNlIHRoZSBzeW1ib2xzIHdlIGFyZSBpbnRlcmVzdGVkIGluIGFyZQotCSBhbG1vc3QgY2VydGFpbmx5IHRoZSBvbmVzIHRoYXQgd2VyZSBtb3N0IHJlY2VudGx5IGFkZGVkLgotCSBBbHNvIHRvIHNhdmUgdGltZSB3ZSBzdG9wIHNlYXJjaGluZyBvbmNlIHdlIGhhdmUgc2VlbiBhdCBsZWFzdAotCSBvbmUgbWF0Y2hpbmcgbGFiZWwsIGFuZCB3ZSBlbmNvdW50ZXIgYSBsYWJlbCB0aGF0IGlzIG5vIGxvbmdlcgotCSBpbiB0aGUgdGFyZ2V0IGZyYWdtZW50LiAgTm90ZSwgdGhpcyBzZWFyY2ggaXMgZ3VhcmFudGVlZCB0bwotCSBmaW5kIGF0IGxlYXN0IG9uZSBtYXRjaCB3aGVuIHN5bSA9PSBsYWJlbCwgc28gbm8gc3BlY2lhbCBjYXNlCi0JIGNvZGUgaXMgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGZvciAoc3ltID0gc3ltYm9sX2xhc3RQOyBzeW0gIT0gTlVMTDsgc3ltID0gc3ltYm9sX3ByZXZpb3VzIChzeW0pKQotCXsKLQkgIGlmIChzeW1ib2xfZ2V0X2ZyYWcgKHN5bSkgPT0gb2xkX2ZyYWcKLQkgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA9PSBvbGRfdmFsdWUpCi0JICAgIHsKLQkgICAgICBsYWJlbF9zZWVuID0gdHJ1ZTsKLQkgICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotCSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIG5ld192YWx1ZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGxhYmVsX3NlZW4gJiYgc3ltYm9sX2dldF9mcmFnIChzeW0pICE9IG9sZF9mcmFnKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIG4pOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3AuICBUaGlzIGFsaWducyB0byBhIHBvd2VyIG9mIHR3by4gIFdlCi0gICBob29rIGhlcmUgdG8gbGF0Y2ggdGhlIGN1cnJlbnQgYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZDMwdl9hbGlnbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgYWxpZ247Ci0gIGNoYXIgZmlsbCwgKnBmaWxsID0gTlVMTDsKLSAgbG9uZyBtYXhfYWxpZ25tZW50ID0gMTU7Ci0KLSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKGFsaWduID4gbWF4X2FsaWdubWVudCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IG1heF9hbGlnbm1lbnQ7Ci0gICAgICBhc193YXJuIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZCBhc3N1bWVkIiksIGFsaWduKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGFsaWduIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJBbGlnbm1lbnQgbmVnYXRpdmU6IDAgYXNzdW1lZCIpKTsKLSAgICAgIGFsaWduID0gMDsKLSAgICB9Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcGZpbGwgPSAmZmlsbDsKLSAgICB9Ci0KLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLSAgZDMwdl9hbGlnbiAoYWxpZ24sIHBmaWxsLCBOVUxMKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC50ZXh0IHBzZXVkby1vcC4gIFRoaXMgaXMgbGlrZSB0aGUgdXN1YWwgb25lLCBidXQgaXQKLSAgIGNsZWFycyB0aGUgc2F2ZWQgbGFzdCBsYWJlbCBhbmQgcmVzZXRzIGtub3duIGFsaWdubWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2QzMHZfdGV4dCAoaSkKLSAgICAgaW50IGk7Ci0KLXsKLSAgc190ZXh0IChpKTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLSAgZDMwdl9jdXJyZW50X2FsaWduID0gMDsKLSAgZDMwdl9jdXJyZW50X2FsaWduX3NlZyA9IG5vd19zZWc7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmRhdGEgcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIHRoZSBzYXZlZCBsYXN0IGxhYmVsIGFuZCByZXNldHMga25vd24gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZDMwdl9kYXRhIChpKQotICAgICBpbnQgaTsKLXsKLSAgc19kYXRhIChpKTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLSAgZDMwdl9jdXJyZW50X2FsaWduID0gMDsKLSAgZDMwdl9jdXJyZW50X2FsaWduX3NlZyA9IG5vd19zZWc7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBpcyBsaWtlIHRoZSB1c3VhbCBvbmUsIGJ1dCBpdAotICAgY2xlYXJzIHRoZSBzYXZlZCBsYXN0IGxhYmVsIGFuZCByZXNldHMga25vd24gYWxpZ25tZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZDMwdl9zZWN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG9ial9lbGZfc2VjdGlvbiAoaWdub3JlKTsKLSAgZDMwdl9sYXN0X2xhYmVsID0gTlVMTDsKLSAgZDMwdl9jdXJyZW50X2FsaWduID0gMDsKLSAgZDMwdl9jdXJyZW50X2FsaWduX3NlZyA9IG5vd19zZWc7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWQzMHYuaCBiL2dhcy9jb25maWcvdGMtZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmViYmI5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZDMwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogdGMtMzEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1kMzB2LmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50LCBDeWdudXMgU3VwcG9ydC4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX0QzMFYKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIEQzMFYgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfZDMwdgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1kMzB2IgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpICAgCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIG1kX251bWJlcl90b19jaGFycyAgICAgICAgICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbgotCi1pbnQgZDMwdl9jbGVhbnVwIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBtZF9hZnRlcl9wYXNzX2hvb2soKQkgICAgIGQzMHZfY2xlYW51cCAoZmFsc2UpCi0jZGVmaW5lIG1kX2NsZWFudXAoKQkJICAgICBkMzB2X2NsZWFudXAgKGZhbHNlKQotI2RlZmluZSBUQ19TVEFSVF9MQUJFTChjaCwgcHRyKSAgICAgIChjaCA9PSAnOicgJiYgZDMwdl9jbGVhbnVwIChmYWxzZSkpCi0jZGVmaW5lIG1kX3N0YXJ0X2xpbmVfaG9vaygpCSAgICAgZDMwdl9zdGFydF9saW5lIChmYWxzZSkKLQotdm9pZCBkMzB2X2Zyb2JfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKQkgICAgIGQzMHZfZnJvYl9sYWJlbChzeW0pCi0KLXZvaWQgZDMwdl9jb25zX2FsaWduIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBtZF9jb25zX2FsaWduKG5ieXRlcykJICAgICBkMzB2X2NvbnNfYWxpZ24obmJ5dGVzKQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1mcjMwLmMgYi9nYXMvY29uZmlnL3RjLWZyMzAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhNTg4MC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWZyMzAuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKiB0Yy1mcjMwLmMgLS0gQXNzZW1ibGVyIGZvciB0aGUgRnVqaXRzdSBGUjMwLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZXMvZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAib3Bjb2Rlcy9mcjMwLW9wYy5oIgotI2luY2x1ZGUgImNnZW4uaCIKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBkZXNjcmliaW5nCi0gICBhbiBpbmRpdmlkdWFsIGluc3RydWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IENHRU5fSU5TTiAqCWluc247Ci0gIGNvbnN0IENHRU5fSU5TTiAqCW9yaWdfaW5zbjsKLSAgQ0dFTl9GSUVMRFMJCWZpZWxkczsKLSNpZiBDR0VOX0lOVF9JTlNOX1AKLSAgQ0dFTl9JTlNOX0lOVCAgICAgICAgIGJ1ZmZlciBbMV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoKihidWYpKQotI2Vsc2UKLSAgdW5zaWduZWQgY2hhciAgICAgICAgIGJ1ZmZlciBbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSNkZWZpbmUgSU5TTl9WQUxVRShidWYpIChidWYpCi0jZW5kaWYKLSAgY2hhciAqCQlhZGRyOwotICBmcmFnUyAqCQlmcmFnOwotICBpbnQgICAgICAgICAgICAgICAgICAgbnVtX2ZpeHVwczsKLSAgZml4UyAqICAgICAgICAgICAgICAgIGZpeHVwcyBbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci0gIGludCAgICAgICAgICAgICAgICAgICBpbmRpY2VzIFtNQVhfT1BFUkFORF9JTlNUQU5DRVNdOwotfQotZnIzMF9pbnNuOwotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSAgICAgICAgPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdICAgPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAifCI7Ci1jb25zdCBjaGFyIEVYUF9DSEFSU1tdICAgICAgICAgICAgPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSAgICAgICAgICAgID0gImREIjsKLQwKLSNkZWZpbmUgRlIzMF9TSE9SVE9QVFMgIiIKLWNvbnN0IGNoYXIgKiBtZF9zaG9ydG9wdHMgPSBGUjMwX1NIT1JUT1BUUzsKLQotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCAgICBjOwotICAgICBjaGFyICogYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gIEZJTEUgKiBzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiIEZSMzAgc3BlY2lmaWMgY29tbWFuZCBsaW5lIG9wdGlvbnM6XG4iKSk7Ci19IAotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJ3b3JkIiwJY29ucywJCTQgfSwKLSAgeyBOVUxMLCAJTlVMTCwgCQkwIH0KLX07Ci0KLQwKLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGZsYWd3b3JkIGFwcGxpY2FibGU7Ci0gIHNlZ1QgICAgIHNlZzsKLSAgc3Vic2VnVCAgc3Vic2VnOwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGBjZ2VuJyBpbnRlcmZhY2UuICAqLwotICAKLSAgLyogU2V0IHRoZSBtYWNoaW5lIG51bWJlciBhbmQgZW5kaWFuLiAgKi8KLSAgZ2FzX2NnZW5fY3B1X2Rlc2MgPSBmcjMwX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fTUFDSFMsIDAsCi0JCQkJCSAgQ0dFTl9DUFVfT1BFTl9FTkRJQU4sCi0JCQkJCSAgQ0dFTl9FTkRJQU5fQklHLAotCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgZnIzMF9jZ2VuX2luaXRfYXNtIChnYXNfY2dlbl9jcHVfZGVzYyk7Ci0KLSAgLyogVGhpcyBpcyBhIGNhbGxiYWNrIGZyb20gY2dlbiB0byBnYXMgdG8gcGFyc2Ugb3BlcmFuZHMuICAqLwotICBjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuIChnYXNfY2dlbl9jcHVfZGVzYywgZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCk7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIHN0YXRpYyBpbnQgbGFzdF9pbnNuX2hhZF9kZWxheV9zbG90ID0gMDsKLSAgZnIzMF9pbnNuIGluc247Ci0gIGNoYXIgKiAgICBlcnJtc2c7Ci0gIGNoYXIgKiAgICBzdHIyID0gTlVMTDsKLQotICAvKiBJbml0aWFsaXplIEdBUydzIGNnZW4gaW50ZXJmYWNlIGZvciBhIG5ldyBpbnN0cnVjdGlvbi4gICovCi0gIGdhc19jZ2VuX2luaXRfcGFyc2UgKCk7Ci0KLSAgaW5zbi5pbnNuID0gZnIzMF9jZ2VuX2Fzc2VtYmxlX2luc24KLSAgICAoZ2FzX2NnZW5fY3B1X2Rlc2MsIHN0ciwgJiBpbnNuLmZpZWxkcywgaW5zbi5idWZmZXIsICYgZXJybXNnKTsKLSAgCi0gIGlmICghaW5zbi5pbnNuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoZXJybXNnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRG9lc24ndCByZWFsbHkgbWF0dGVyIHdoYXQgd2UgcGFzcyBmb3IgUkVMQVhfUCBoZXJlLiAgKi8KLSAgZ2FzX2NnZW5fZmluaXNoX2luc24gKGluc24uaW5zbiwgaW5zbi5idWZmZXIsCi0JCQlDR0VOX0ZJRUxEU19CSVRTSVpFICgmIGluc24uZmllbGRzKSwgMSwgTlVMTCk7Ci0KLSAgLyogV2FybiBhYm91dCBpbnZhbGlkIGluc25zIGluIGRlbGF5IHNsb3RzLiAgKi8KLSAgaWYgKGxhc3RfaW5zbl9oYWRfZGVsYXlfc2xvdAotICAgICAgJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24uaW5zbiwgQ0dFTl9JTlNOX05PVF9JTl9ERUxBWV9TTE9UKSkKLSAgICBhc193YXJuIChfKCJJbnN0cnVjdGlvbiAlcyBub3QgYWxsb3dlZCBpbiBhIGRlbGF5IHNsb3QuIiksCi0JICAgICBDR0VOX0lOU05fTkFNRSAoaW5zbi5pbnNuKSk7Ci0KLSAgbGFzdF9pbnNuX2hhZF9kZWxheV9zbG90Ci0gICAgPSBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5pbnNuLCBDR0VOX0lOU05fREVMQVlfU0xPVCk7Ci19Ci0KLS8qIFRoZSBzeW50YXggaW4gdGhlIG1hbnVhbCBzYXlzIGNvbnN0YW50cyBiZWdpbiB3aXRoICcjJy4KLSAgIFdlIGp1c3QgaWdub3JlIGl0LiAgKi8KLQotdm9pZCAKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QOwotewotICBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJyMnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLSAgICAgIGV4cHJlc3Npb24gKGV4cHJlc3Npb25QKTsKLSAgICB9Ci19Ci0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCAgIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICByZXR1cm4gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICogbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBJbnRlcmZhY2UgdG8gcmVsYXhfc2VnbWVudC4gICovCi0KLS8qIEZJWE1FOiBCdWlsZCB0YWJsZSBieSBoYW5kLCBnZXQgaXQgd29ya2luZywgdGhlbiBtYWNoaW5lIGdlbmVyYXRlLiAgKi8KLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0vKiBUaGUgZmllbGRzIGFyZToKLSAgIDEpIG1vc3QgcG9zaXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgIDIpIG1vc3QgbmVnYXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgIDMpIGhvdyBtYW55IGJ5dGVzIHRoaXMgbW9kZSB3aWxsIGFkZCB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBmcmFnCi0gICA0KSB3aGljaCBpbmRleCBpbnRvIHRoZSB0YWJsZSB0byB0cnkgaWYgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBvbmUuICAqLwotCi0gIC8qIFRoZSBmaXJzdCBlbnRyeSBtdXN0IGJlIHVudXNlZCBiZWNhdXNlIGFuIGBybHhfbW9yZScgdmFsdWUgb2YgemVybyBlbmRzCi0gICAgIGVhY2ggbGlzdC4gICovCi0gIHsxLCAxLCAwLCAwfSwKLQotICAvKiBUaGUgZGlzcGxhY2VtZW50IHVzZWQgYnkgR0FTIGlzIGZyb20gdGhlIGVuZCBvZiB0aGUgMiBieXRlIGluc24sCi0gICAgIHNvIHdlIHN1YnRyYWN0IDIgZnJvbSB0aGUgZm9sbG93aW5nLiAgKi8KLSAgLyogMTYgYml0IGluc24sIDggYml0IGRpc3AgLT4gMTAgYml0IHJhbmdlLgotICAgICBUaGlzIGRvZXNuJ3QgaGFuZGxlIGEgYnJhbmNoIGluIHRoZSByaWdodCBzbG90IGF0IHRoZSBib3JkZXI6Ci0gICAgIHRoZSAiJiAtNCIgaXNuJ3QgdGFrZW4gaW50byBhY2NvdW50LiAgSXQncyBub3QgaW1wb3J0YW50IGVub3VnaCB0bwotICAgICBjb21wbGljYXRlIHRoaW5ncyBvdmVyIGl0LCBzbyB3ZSBzdWJ0cmFjdCBhbiBleHRyYSAyIChvciArIDIgaW4gLXZlCi0gICAgIGNhc2UpLiAgKi8KLSAgezUxMSAtIDIgLSAyLCAtNTEyIC0gMiArIDIsIDAsIDIgfSwKLSAgLyogMzIgYml0IGluc24sIDI0IGJpdCBkaXNwIC0+IDI2IGJpdCByYW5nZS4gICovCi0gIHsweDIwMDAwMDAgLSAxIC0gMiwgLTB4MjAwMDAwMCAtIDIsIDIsIDAgfSwKLSAgLyogU2FtZSB0aGluZywgYnV0IHdpdGggbGVhZGluZyBub3AgZm9yIGFsaWdubWVudC4gICovCi0gIHsweDIwMDAwMDAgLSAxIC0gMiwgLTB4MjAwMDAwMCAtIDIsIDQsIDAgfQotfTsKLQotbG9uZwotZnIzMF9yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCkKLSAgICAgZnJhZ1MgKiBmcmFnUDsKLSAgICAgbG9uZyAgICBzdHJldGNoOwotewotICAvKiBBZGRyZXNzIG9mIGJyYW5jaCBpbnNuLiAgKi8KLSAgbG9uZyBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4IC0gMjsKLSAgbG9uZyBncm93dGggPSAwOwotCi0gIC8qIEtlZXAgMzIgYml0IGluc25zIGFsaWduZWQgb24gMzIgYml0IGJvdW5kYXJpZXMuICAqLwotICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMikKLSAgICB7Ci0gICAgICBpZiAoKGFkZHJlc3MgJiAzKSAhPSAwKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMzsKLQkgIGdyb3d0aCA9IDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBpZiAoKGFkZHJlc3MgJiAzKSA9PSAwKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMjsKLQkgIGdyb3d0aCA9IC0yOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBncm93dGggPSByZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCk7Ci0KLSAgICAgIC8qIExvbmcganVtcCBvbiBvZGQgaGFsZndvcmQgYm91bmRhcnk/ICAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIgJiYgKGFkZHJlc3MgJiAzKSAhPSAwKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMzsKLQkgIGdyb3d0aCArPSAyOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGdyb3d0aDsKLX0KLQotLyogUmV0dXJuIGFuIGluaXRpYWwgZ3Vlc3Mgb2YgdGhlIGxlbmd0aCBieSB3aGljaCBhIGZyYWdtZW50IG11c3QgZ3JvdyB0bwotICAgaG9sZCBhIGJyYW5jaCB0byByZWFjaCBpdHMgZGVzdGluYXRpb24uCi0gICBBbHNvIHVwZGF0ZXMgZnJfdHlwZS9mcl9zdWJ0eXBlIGFzIG5lY2Vzc2FyeS4KLQotICAgQ2FsbGVkIGp1c3QgYmVmb3JlIGRvaW5nIHJlbGF4YXRpb24uCi0gICBBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZC4KLSAgIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KLSAgIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCi0gICBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCi0gICAwIHZhbHVlLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIGZyYWdTICogZnJhZ1A7Ci0gICAgIHNlZ1QgICAgc2VnbWVudDsKLXsKLSAgaW50ICAgIG9sZF9mcl9maXggPSBmcmFnUC0+ZnJfZml4OwotCi0gIC8qIFRoZSBvbmx5IHRoaW5nIHdlIGhhdmUgdG8gaGFuZGxlIGhlcmUgYXJlIHN5bWJvbHMgb3V0c2lkZSBvZiB0aGUKLSAgICAgY3VycmVudCBzZWdtZW50LiAgVGhleSBtYXkgYmUgdW5kZWZpbmVkIG9yIGluIGEgZGlmZmVyZW50IHNlZ21lbnQgaW4KLSAgICAgd2hpY2ggY2FzZSBsaW5rZXIgc2NyaXB0cyBtYXkgcGxhY2UgdGhlbSBhbnl3aGVyZS4KLSAgICAgSG93ZXZlciwgd2UgY2FuJ3QgZmluaXNoIHRoZSBmcmFnbWVudCBoZXJlIGFuZCBlbWl0IHRoZSByZWxvYyBhcyBpbnNuCi0gICAgIGFsaWdubWVudCByZXF1aXJlbWVudHMgbWF5IG1vdmUgdGhlIGluc24gYWJvdXQuICAqLwotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWdtZW50KQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgc2VnbWVudC4KLQkgQ2hhbmdlIHRoZSByZWxheGF0aW9uIHN1YnR5cGUgdG8gdGhlIG1heCBhbGxvd2FibGUgYW5kIGxlYXZlCi0JIGFsbCBmdXJ0aGVyIGhhbmRsaW5nIHRvIG1kX2NvbnZlcnRfZnJhZy4gICovCi0gICAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IDI7Ci0KLSNpZiAwIC8qIENhbid0IHVzZSB0aGlzLCBidXQgbGVhdmUgaW4gZm9yIGlsbHVzdHJhdGlvbi4gICovICAgICAKLSAgICAgIC8qIENoYW5nZSAxNiBiaXQgaW5zbiB0byAzMiBiaXQgaW5zbi4gICovCi0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzBdIHw9IDB4ODA7Ci0KLSAgICAgIC8qIEluY3JlYXNlIGtub3duIChmaXhlZCkgc2l6ZSBvZiBmcmFnbWVudC4gICovCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIGl0LiAgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4LCA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxIC8qIHBjcmVsICovLAotCSAgICAgICAvKiBGSVhNRTogQ2FuJ3QgdXNlIGEgcmVhbCBCRkQgcmVsb2MgaGVyZS4KLQkJICBnYXNfY2dlbl9tZF9hcHBseV9maXgzIGNhbid0IGhhbmRsZSBpdC4gICovCi0JICAgICAgIEJGRF9SRUxPQ19GUjMwXzI2X1BDUkVMKTsKLQotICAgICAgLyogTWFyayB0aGlzIGZyYWdtZW50IGFzIGZpbmlzaGVkLiAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotI2Vsc2UKLSAgICAgIHsKLQljb25zdCBDR0VOX0lOU04gKiBpbnNuOwotCWludCAgICAgICAgICAgICAgIGk7Ci0KLQkvKiBVcGRhdGUgdGhlIHJlY29yZGVkIGluc24uCi0JICAgRm9ydHVuYXRlbHkgd2UgZG9uJ3QgaGF2ZSB0byBsb29rIHZlcnkgZmFyLgotCSAgIEZJWE1FOiBDaGFuZ2UgdGhpcyB0byByZWNvcmQgaW4gdGhlIGluc3RydWN0aW9uIHRoZSBuZXh0IGhpZ2hlcgotCSAgIHJlbGF4YWJsZSBpbnNuIHRvIHVzZS4gICovCi0JZm9yIChpID0gMCwgaW5zbiA9IGZyYWdQLT5mcl9jZ2VuLmluc247IGkgPCA0OyBpKyssIGluc24rKykKLQkgIHsKLQkgICAgaWYgKChzdHJjbXAgKENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbiksCi0JCQkgQ0dFTl9JTlNOX01ORU1PTklDIChmcmFnUC0+ZnJfY2dlbi5pbnNuKSkKLQkJID09IDApCi0JCSYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fUkVMQVgpKQotCSAgICAgIGJyZWFrOwotCSAgfQotCWlmIChpID09IDQpCi0JICBhYm9ydCAoKTsKLQotCWZyYWdQLT5mcl9jZ2VuLmluc24gPSBpbnNuOwotCXJldHVybiAyOwotICAgICAgfQotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiAoZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZnJfZml4KTsKLX0gCi0KLS8qICpmcmFnUCBoYXMgYmVlbiByZWxheGVkIHRvIGl0cyBmaW5hbCBzaXplLCBhbmQgbm93IG5lZWRzIHRvIGhhdmUKLSAgIHRoZSBieXRlcyBpbnNpZGUgaXQgbW9kaWZpZWQgdG8gY29uZm9ybSB0byB0aGUgbmV3IHNpemUuCi0KLSAgIENhbGxlZCBhZnRlciByZWxheGF0aW9uIGlzIGZpbmlzaGVkLgotICAgZnJhZ1AtPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0gICBmcmFnUC0+ZnJfc3VidHlwZSBpcyB0aGUgc3VidHlwZSBvZiB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uICAqLwotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gIGJmZCAqICAgYWJmZDsKLSAgc2VnVCAgICBzZWM7Ci0gIGZyYWdTICogZnJhZ1A7Ci17Ci0jaWYgMAotICBjaGFyICogb3Bjb2RlOwotICBjaGFyICogZGlzcGxhY2VtZW50OwotICBpbnQgICAgdGFyZ2V0X2FkZHJlc3M7Ci0gIGludCAgICBvcGNvZGVfYWRkcmVzczsKLSAgaW50ICAgIGV4dGVuc2lvbjsKLSAgaW50ICAgIGFkZGVuZDsKLQotICBvcGNvZGUgPSBmcmFnUC0+ZnJfb3Bjb2RlOwotCi0gIC8qIEFkZHJlc3Mgb3Bjb2RlIHJlc2lkZXMgYXQgaW4gZmlsZSBzcGFjZS4gICovCi0gIG9wY29kZV9hZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4IC0gMjsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIDEgOgotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyIDoKLSAgICAgIG9wY29kZVswXSB8PSAweDgwOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzFdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzIDoKLSAgICAgIG9wY29kZVsyXSA9IG9wY29kZVswXSB8IDB4ODA7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKG9wY29kZSwgUEFSX05PUF9JTlNOLCAyKTsKLSAgICAgIG9wY29kZV9hZGRyZXNzICs9IDI7Ci0gICAgICBleHRlbnNpb24gPSA0OwotICAgICAgZGlzcGxhY2VtZW50ID0gJiBvcGNvZGVbM107Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQotICAgIHsKLSAgICAgIC8qIHN5bWJvbCBtdXN0IGJlIHJlc29sdmVkIGJ5IGxpbmtlciAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9vZmZzZXQgJiAzKQotCWFzX3dhcm4gKF8oIkFkZGVuZCB0byB1bnJlc29sdmVkIHN5bWJvbCBub3Qgb24gd29yZCBib3VuZGFyeS4iKSk7Ci0gICAgICBhZGRlbmQgPSBmcmFnUC0+ZnJfb2Zmc2V0ID4+IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQWRkcmVzcyB3ZSB3YW50IHRvIHJlYWNoIGluIGZpbGUgc3BhY2UuICAqLwotICAgICAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICAgICAgdGFyZ2V0X2FkZHJlc3MgKz0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzczsKLSAgICAgIGFkZGVuZCA9ICh0YXJnZXRfYWRkcmVzcyAtIChvcGNvZGVfYWRkcmVzcyAmIC00KSkgPj4gMjsKLSAgICB9Ci0KLSAgLyogQ3JlYXRlIGEgcmVsb2NhdGlvbiBmb3Igc3ltYm9scyB0aGF0IG11c3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGxpbmtlci4KLSAgICAgT3RoZXJ3aXNlIG91dHB1dCB0aGUgY29tcGxldGVkIGluc24uICAqLwotCi0gIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSAhPSBzZWMpCi0gICAgewotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfc3VidHlwZSAhPSAxKTsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2NnZW4uaW5zbiAhPSAwKTsKLSAgICAgIGdhc19jZ2VuX3JlY29yZF9maXh1cCAoZnJhZ1AsCi0JCQkgICAgIC8qIE9mZnNldCBvZiBicmFuY2ggaW5zbiBpbiBmcmFnLiAgKi8KLQkJCSAgICAgZnJhZ1AtPmZyX2ZpeCArIGV4dGVuc2lvbiAtIDQsCi0JCQkgICAgIGZyYWdQLT5mcl9jZ2VuLmluc24sCi0JCQkgICAgIDQgLypsZW5ndGgqLywKLQkJCSAgICAgLyogRklYTUU6IHF1aWNrIGhhY2sgKi8KLSNpZiAwCi0JCQkgICAgIENHRU5fT1BFUkFORF9FTlRSWSAoZnJhZ1AtPmZyX2NnZW4ub3BpbmRleCksCi0jZWxzZQotCQkJICAgICBDR0VOX09QRVJBTkRfRU5UUlkgKEZSMzBfT1BFUkFORF9ESVNQMjQpLAotI2VuZGlmCi0JCQkgICAgIGZyYWdQLT5mcl9jZ2VuLm9waW5mbywKLQkJCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCk7Ci0gICAgfQotCi0jZGVmaW5lIFNJWkVfRlJPTV9SRUxBWF9TVEFURShuKSAoKG4pID09IDEgPyAxIDogMykKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKGRpc3BsYWNlbWVudCwgKHZhbHVlVCkgYWRkZW5kLAotCQkgICAgICBTSVpFX0ZST01fUkVMQVhfU1RBVEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSk7Ci0KLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci0jZW5kaWYKLX0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tX3NlY3Rpb24gKGZpeFAsIHNlYykKLSAgICAgZml4UyAqIGZpeFA7Ci0gICAgIHNlZ1QgICBzZWM7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiAoISBTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCSAgfHwgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlYykpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgKG9yIGlzIGRlZmluZWQgYnV0IG5vdCBpbiB0aGlzIHNlY3Rpb24pLgotCSBMZXQgdGhlIGxpbmtlciBmaWd1cmUgaXQgb3V0LiAgKi8KLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gKGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSkgJiB+MTsKLX0KLQotLyogUmV0dXJuIHRoZSBiZmQgcmVsb2MgdHlwZSBmb3IgT1BFUkFORCBvZiBJTlNOIGF0IGZpeHVwIEZJWFAuCi0gICBSZXR1cm5zIEJGRF9SRUxPQ19OT05FIGlmIG5vIHJlbG9jIHR5cGUgY2FuIGJlIGZvdW5kLgotICAgKkZJWFAgbWF5IGJlIG1vZGlmaWVkIGlmIGRlc2lyZWQuICAqLwotCi1iZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLW1kX2NnZW5fbG9va3VwX3JlbG9jIChpbnNuLCBvcGVyYW5kLCBmaXhQKQotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBjb25zdCBDR0VOX09QRVJBTkQgKiBvcGVyYW5kOwotICAgICBmaXhTICogICAgICAgICAgICAgICBmaXhQOwotewotICBzd2l0Y2ggKG9wZXJhbmQtPnR5cGUpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOTogIGZpeFAtPmZ4X3BjcmVsID0gMTsgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzlfUENSRUw7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMjogZml4UC0+ZnhfcGNyZWwgPSAxOyByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfMTJfUENSRUw7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwOiAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzEwX0lOXzg7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDk6ICAgcmV0dXJuIEJGRF9SRUxPQ19GUjMwXzlfSU5fODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQODogICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfOF9JTl84OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNjogIHJldHVybiBCRkRfUkVMT0NfRlIzMF82X0lOXzQ7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTg6ICAgICAgcmV0dXJuIEJGRF9SRUxPQ184OwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMjogICAgIHJldHVybiBCRkRfUkVMT0NfRlIzMF80ODsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjA6ICAgICByZXR1cm4gQkZEX1JFTE9DX0ZSMzBfMjA7Ci0gICAgZGVmYXVsdCA6IC8qIGF2b2lkIC1XYWxsIHdhcm5pbmcgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Ci19Ci0KLS8qIFNlZSB3aGV0aGVyIHdlIG5lZWQgdG8gZm9yY2UgYSByZWxvY2F0aW9uIGludG8gdGhlIG91dHB1dCBmaWxlLgotICAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIG91dCBzd2l0Y2ggYW5kIFBDIHJlbGF0aXZlIHJlbG9jYXRpb25zIHdoZW4KLSAgIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1mcjMwX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLSAgICAgZml4UyAqIGZpeDsKLXsKLSAgaWYgKCAgIGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQwKLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGVuZGlhbm5lc3MuICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICogYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgICAgbjsKLXsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0qLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciAgIHR5cGU7Ci0gICAgIGNoYXIgKiBsaXRQOwotICAgICBpbnQgKiAgc2l6ZVA7Ci17Ci0gIGludCAgICAgICAgICAgICAgaTsKLSAgaW50ICAgICAgICAgICAgICBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSAgIHdvcmRzIFtNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKiAgICAgICAgICAgdDsKLSAgY2hhciAqICAgICAgICAgICBhdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgIC8qIEZJWE1FOiBTb21lIHRhcmdldHMgYWxsb3cgb3RoZXIgZm9ybWF0IGNoYXJzIGZvciBiaWdnZXIgc2l6ZXMgaGVyZS4gICovCi0KLSAgICBkZWZhdWx0OgotICAgICAgKiBzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqIHNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBwcmVjOyBpKyspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKLQkJCSAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gICAgIAotICByZXR1cm4gMDsKLX0KLQotLyogV29ya2VyIGZ1bmN0aW9uIGZvciBmcjMwX2lzX2NvbG9uX2luc24oKS4gICovCi1zdGF0aWMgY2hhcgotcmVzdG9yZV9jb2xvbiAoYWR2YW5jZV9pX2xfcF9ieSkKLSAgICAgaW50IGFkdmFuY2VfaV9sX3BfYnk7Ci17Ci0gIGNoYXIgYzsKLSAgCi0gIC8qIFJlc3RvcmUgdGhlIGNvbG9uLCBhbmQgYWR2YW5jZSBpbnB1dF9saW5lX3BvaW50ZXIgdG8KLSAgICAgdGhlIGVuZCBvZiB0aGUgbmV3IHN5bWJvbC4gICovCi0gICogaW5wdXRfbGluZV9wb2ludGVyID0gJzonOwotICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gYWR2YW5jZV9pX2xfcF9ieTsKLSAgYyA9ICogaW5wdXRfbGluZV9wb2ludGVyOwotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIAotICByZXR1cm4gYzsKLX0KLQotLyogRGV0ZXJtaW5lcyBpZiB0aGUgc3ltYm9sIHN0YXJ0aW5nIGF0IFNUQVJUIGFuZCBlbmRpbmcgaW4KLSAgIGEgY29sb24gdGhhdCB3YXMgYXQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgSU5QVVRfTElORV9QT0lOVEVSCi0gICAoYnV0IHdoaWNoIGhhcyBub3cgYmVlbiByZXBsYWNlZCBidSBhIE5VTCkgaXMgaW4gZmFjdCBhbgotICAgTERJOjgsIExESToyMCwgTERJOjMyLCBDQUxMOkQuIEpNUDpELCBSRVQ6RCBvciBCY2M6RCBpbnN0cnVjdGlvbi4KLSAgIElmIGl0IGlzLCB0aGVuIGl0IHJlc3RvcmVzIHRoZSBjb2xvbiwgYWR2YW5jZXMgSU5QVVRfTElORV9QT0lOVEVSCi0gICB0byB0aGUgcmVhbCBlbmQgb2YgdGhlIGluc3RydWN0aW9uL3N5bWJvbCwgYW5kIHJldHVybnMgdGhlIGNoYXJhY3RlcgotICAgdGhhdCByZWFsbHkgdGVybWluYXRlZCB0aGUgc3ltYm9sLiAgT3RoZXJ3aXNlIGl0IHJldHVybnMgMC4gICovCi1jaGFyCi1mcjMwX2lzX2NvbG9uX2luc24gKHN0YXJ0KQotICAgICBjaGFyICogIHN0YXJ0OwotewotICBjaGFyICogaV9sX3AgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzeW1ib2wgcGFyc2VkIHNvIGZhciBpcyAnbGRpJyAgKi8KLSAgaWYgKCAgIChzdGFydFswXSAhPSAnbCcgJiYgc3RhcnRbMF0gIT0gJ0wnKQotICAgICAgfHwgKHN0YXJ0WzFdICE9ICdkJyAmJiBzdGFydFsxXSAhPSAnRCcpCi0gICAgICB8fCAoc3RhcnRbMl0gIT0gJ2knICYmIHN0YXJ0WzJdICE9ICdJJykKLSAgICAgIHx8IHN0YXJ0WzNdICE9IDApCi0gICAgewotICAgICAgLyogTm9wZSAtIGNoZWNrIHRvIHNlZSBhICdkJyBmb2xsb3dzIHRoZSBjb2xvbi4gICovCi0gICAgICBpZiAoICAgKGlfbF9wWzFdID09ICdkJyB8fCBpX2xfcFsxXSA9PSAnRCcpCi0JICAmJiAoaV9sX3BbMl0gPT0gJyAnIHx8IGlfbF9wWzJdID09ICdcdCcgfHwgaV9sX3BbMl0gPT0gJ1xuJykpCi0JewotCSAgLyogWXVwIC0gaXQgbWlnaHQgYmUgZGVsYXkgc2xvdCBpbnN0cnVjdGlvbi4gICovCi0JICBpbnQgICAgICAgICAgIGk7Ci0JICBzdGF0aWMgY2hhciAqIGRlbGF5X2luc25zIFtdID0KLQkgIHsKLQkgICAgImNhbGwiLCAiam1wIiwgInJldCIsICJicmEiLCAiYm5vIiwKLQkgICAgImJlcSIsICAiYm5lIiwgImJjIiwgICJibmMiLCAiYm4iLAotCSAgICAiYnAiLCAgICJidiIsICAiYm52IiwgImJsdCIsICJiZ2UiLAotCSAgICAiYmxlIiwgICJiZ3QiLCAiYmxzIiwgImJoaSIKLQkgIH07Ci0KLQkgIGZvciAoaSA9IHNpemVvZiAoZGVsYXlfaW5zbnMpIC8gc2l6ZW9mIChkZWxheV9pbnNuc1swXSk7IGktLTspCi0JICAgIHsKLQkgICAgICBjaGFyICogaW5zbiA9IGRlbGF5X2luc25zW2ldOwotCSAgICAgIGludCAgICBsZW4gID0gc3RybGVuIChpbnNuKTsKLQotCSAgICAgIGlmIChzdGFydCBbbGVuXSAhPSAwKQotCQljb250aW51ZTsKLQkgICAgICAKLQkgICAgICB3aGlsZSAobGVuIC0tKQotCQlpZiAodG9sb3dlciAoc3RhcnQgW2xlbl0pICE9IGluc24gW2xlbl0pCi0JCSAgYnJlYWs7Ci0JICAgICAgCi0JICAgICAgaWYgKGxlbiA9PSAtMSkKLQkJcmV0dXJuIHJlc3RvcmVfY29sb24gKDEpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBOb3BlIC0gaXQgaXMgYSBub3JtYWwgbGFiZWwuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIGNvbG9uIGlzICc4JyAqLwotICBpZiAoaV9sX3BbMV0gPT0gJzgnICYmIChpX2xfcFsyXSA9PSAnICcgfHwgaV9sX3BbMl0gPT0gJ1x0JykpCi0gICAgcmV0dXJuIHJlc3RvcmVfY29sb24gKDIpOwotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIGNvbG9uIGlzICcyMCcgKi8KLSAgZWxzZSBpZiAoaV9sX3BbMV0gPT0gJzInICYmIGlfbF9wWzJdID09JzAnICYmIChpX2xfcFszXSA9PSAnICcgfHwgaV9sX3BbM10gPT0gJ1x0JykpCi0gICAgcmV0dXJuIHJlc3RvcmVfY29sb24gKDMpOwotCi0gIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIGNvbG9uIGlzICczMicgKi8KLSAgZWxzZSBpZiAoaV9sX3BbMV0gPT0gJzMnICYmIGlfbF9wWzJdID09JzInICYmIChpX2xfcFszXSA9PSAnICcgfHwgaV9sX3BbM10gPT0gJ1x0JykpCi0gICAgcmV0dXJuIHJlc3RvcmVfY29sb24gKDMpOwotCi0gIHJldHVybiAwOwotfQotCi1ib29sZWFuCi1mcjMwX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSNpZiAwICAKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICAKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0gIAotICAvKiBXZSBuZWVkIHRoZSBzeW1ib2wgbmFtZSBmb3IgdGhlIFZUQUJMRSBlbnRyaWVzICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZnIzMC5oIGIvZ2FzL2NvbmZpZy90Yy1mcjMwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NzJkOGIuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1mcjMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiB0Yy1mcjMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLWZyMzAuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX0ZSMzAKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBsZWFkaW5nIHNwYWNlIHNvIHdpbGwgY29tcGlsZSB3aXRoIGNjICovCi0gI2Vycm9yIEZSMzAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiRlIzMCBHQVMgIgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9mcjMwCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItZnIzMCIKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoRklYUCwgU0VDKQotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIC4tZm9vIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX2FwcGx5X2ZpeDMgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MwotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBmcjMwX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotZXh0ZXJuIGJvb2xlYW4gZnIzMF9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBlbWl0IHZhcmlvdXMgcmVsb2NzIHdlIG90aGVyd2lzZSB3b3VsZG4ndC4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4KSBmcjMwX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLWV4dGVybiBpbnQgZnIzMF9mb3JjZV9yZWxvY2F0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jZGVmaW5lIHRjX2dlbl9yZWxvYyBnYXNfY2dlbl90Y19nZW5fcmVsb2MKLQotLyogQ2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24oKSwgbm90IG1kX3BjcmVsX2Zyb20oKS4gICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoRklYUCwgU0VDKQotZXh0ZXJuIGxvbmcgbWRfcGNyZWxfZnJvbV9zZWN0aW9uIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc2VnVCkpOwotCi0vKiBGb3IgOCB2cyAxNiB2cyAzMiBiaXQgYnJhbmNoIHNlbGVjdGlvbi4gICovCi0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotCi0vKiBXZSBuZWVkIGEgc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBUQ19TVEFSVF9MQUJFTCBtYWNybyBzbyB0aGF0IHdlCi0gICBhbGxvdyB0aGUgTERJOjgsIExESToyMCwgTERJOjMyIGFuZCBkZWxheSBzbG90IGluc3RydWN0aW9ucyB0byBiZQotICAgcGFyc2VkIGFzIHN1Y2guICBOb3RlIC0gaW4gYSBIT1JSSUJMRSBIQUNLLCB3ZSBtYWtlIHVzZSBvZiB0aGUKLSAgIGtub3dsZWRnZSB0aGF0IHRoaXMgbWFyY28gaXMgb25seSBldmVyIGV2YWx1YXRlZCBpbiBvbmUgcGxhY2UKLSAgIChyZWFkX2Ffc291cmNlX2ZpbGUgaW4gcmVhZC5jKSB3aGVyZSB3ZSBjYW4gYWNjZXNzIHRoZSBsb2NhbAotICAgdmFyaWFibGUgJ3MnIC0gdGhlIHN0YXJ0IG9mIHRoZSBzeW1ib2wgdGhhdCB3YXMgdGVybWluYXRlZCBieQotICAgJ2NoYXJhY3RlcicuICBBbHNvIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIGNvbnRlbnRzIG9mCi0gICB0aGUgbG9jYWwgdmFyaWFibGUgJ2MnIHdoaWNoIGlzIHBhc3NlZCB0byB0aGlzIG1hY3JvIGFzICdjaGFyYWN0ZXInLiAgKi8KLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2hhcmFjdGVyLCBpX2xfcCkJCQlcCi0gICgoY2hhcmFjdGVyKSAhPSAnOicgPyAwIDogKGNoYXJhY3RlciA9IGZyMzBfaXNfY29sb25faW5zbiAocykpID8gMCA6ICgoY2hhcmFjdGVyID0gJzonKSwgMSkpCi1leHRlcm4gY2hhciBmcjMwX2lzX2NvbG9uX2luc24gUEFSQU1TICgoY2hhciAqKSk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWdlbmVyaWMuYyBiL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5jCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtZ2VuZXJpYy5oIGIvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZGYwMjAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1nZW5lcmljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtZ2VuZXJpYy5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICogVGhpcyBmaWxlIGlzIHRjLWdlbmVyaWMuaCBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgYSB0ZW1wbGF0ZSBmb3IgdGFyZ2V0IGNwdQotICogc3BlY2lmaWMgaGVhZGVyIGZpbGVzLiAgSXQgaXMgbXkgaW50ZW50IHRoYXQgdGhpcyBmaWxlIGNvbXBpbGUuICBJdCBpcyBhbHNvCi0gKiBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgZ3JvdyBpbnRvIHNvbWV0aGluZyB0aGF0IGNhbiBiZSB1c2VkIGFzIGJvdGggYQotICogdGVtcGxhdGUgZm9yIHBvcnRpbmcsIGFuZCBhIHN0dWIgZm9yIHRlc3RpbmcuICB4b3hvcmljaC4KLSAqLwotCi0jZGVmaW5lIFRDX0dFTkVSSUMgMQotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLWdlbmVyaWMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1oODMwMC5jIGIvZ2FzL2NvbmZpZy90Yy1oODMwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVhZGExLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaDgzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OTUgKzAsMCBAQAotLyogdGMtaDgzMDAuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgSGl0YWNoaSBIOC8zMDAKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyoKLSAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICBzYWNAY3lnbnVzLmNvbQotICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jZGVmaW5lIGg4X29wY29kZXMgb3BzCi0jaW5jbHVkZSAib3Bjb2RlL2g4MzAwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPQoteyc7JywgMH07Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPQotezB9OwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gICAqLwotCi12b2lkIGNvbnMgKCk7Ci0KLWludCBIbW9kZTsKLWludCBTbW9kZTsKLSNkZWZpbmUgUFNJWkUgKEhtb2RlID8gTF8zMiA6IExfMTYpCi0jZGVmaW5lIERNT0RFIChMXzE2KQotI2RlZmluZSBEU1lNTU9ERSAoSG1vZGUgPyBMXzI0IDogTF8xNikKLWludCBic2l6ZSA9IExfODsJCS8qIGRlZmF1bHQgYnJhbmNoIGRpc3BsYWNlbWVudCAqLwotCi0KLXZvaWQKLWg4MzAwaG1vZGUgKCkKLXsKLSAgSG1vZGUgPSAxOwotICBTbW9kZSA9IDA7Ci19Ci0KLXZvaWQKLWg4MzAwc21vZGUgKCkKLXsKLSAgU21vZGUgPSAxOwotICBIbW9kZSA9IDE7Ci19Ci12b2lkCi1zYnJhbmNoIChzaXplKQotICAgICBpbnQgc2l6ZTsKLXsKLSAgYnNpemUgPSBzaXplOwotfQotCi1zdGF0aWMgdm9pZCBwaW50ICgpCi17Ci0gIGNvbnMgKEhtb2RlID8gNCA6IDIpOwotfQotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotCi0gIHsiaDgzMDBoIiwgaDgzMDBobW9kZSwgMH0sCi0gIHsiaDgzMDBzIiwgaDgzMDBzbW9kZSwgMH0sCi0gIHsic2JyYW5jaCIsIHNicmFuY2gsIExfOH0sCi0gIHsibGJyYW5jaCIsIHNicmFuY2gsIExfMTZ9LAotCi0gIHsiaW50IiwgcGludCwgMH0sCi0gIHsiZGF0YS5iIiwgY29ucywgMX0sCi0gIHsiZGF0YS53IiwgY29ucywgMn0sCi0gIHsiZGF0YS5sIiwgY29ucywgNH0sCi0gIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7ImhlYWRpbmciLCBsaXN0aW5nX3RpdGxlLCAwfSwKLSAgeyJpbXBvcnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsicGFnZSIsIGxpc3RpbmdfZWplY3QsIDB9LAotICB7InByb2dyYW0iLCBzX2lnbm9yZSwgMH0sCi0gIHswLCAwLCAwfQotfTsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemU7Ci0KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi0KLS8qCi0gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAotICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKLSAgKi8KLQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBzdHJ1Y3QgaDhfb3Bjb2RlICpvcGNvZGU7Ci0gIGNoYXIgcHJldl9idWZmZXJbMTAwXTsKLSAgaW50IGlkeCA9IDA7Ci0KLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotICBwcmV2X2J1ZmZlclswXSA9IDA7Ci0KLSAgZm9yIChvcGNvZGUgPSBoOF9vcGNvZGVzOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIC8qIFN0cmlwIG9mZiBhbnkgLiBwYXJ0IHdoZW4gaW5zZXJ0aW5nIHRoZSBvcGNvZGUgYW5kIG9ubHkgZW50ZXIKLSAgICAgICAgIHVuaXF1ZSBjb2RlcyBpbnRvIHRoZSBoYXNoIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgY2hhciAqc3JjID0gb3Bjb2RlLT5uYW1lOwotICAgICAgdW5zaWduZWQgaW50IGxlbiA9IHN0cmxlbiAoc3JjKTsKLSAgICAgIGNoYXIgKmRzdCA9IG1hbGxvYyAobGVuICsgMSk7Ci0gICAgICBjaGFyICpidWZmZXIgPSBkc3Q7Ci0KLSAgICAgIG9wY29kZS0+c2l6ZSA9IDA7Ci0gICAgICB3aGlsZSAoKnNyYykKLQl7Ci0JICBpZiAoKnNyYyA9PSAnLicpCi0JICAgIHsKLQkgICAgICBzcmMrKzsKLQkgICAgICBvcGNvZGUtPnNpemUgPSAqc3JjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAqZHN0KysgPSAqc3JjKys7Ci0JfQotICAgICAgKmRzdCsrID0gMDsKLSAgICAgIGlmIChzdHJjbXAgKGJ1ZmZlciwgcHJldl9idWZmZXIpKQotCXsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBidWZmZXIsIChjaGFyICopIG9wY29kZSk7Ci0JICBzdHJjcHkgKHByZXZfYnVmZmVyLCBidWZmZXIpOwotCSAgaWR4Kys7Ci0JfQotICAgICAgb3Bjb2RlLT5pZHggPSBpZHg7Ci0KLQotICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzICovCi0gICAgICBvcGNvZGUtPm5vcGVyYW5kcyA9IDA7Ci0gICAgICB3aGlsZSAob3Bjb2RlLT5hcmdzLm5pYltvcGNvZGUtPm5vcGVyYW5kc10gIT0gRSkKLQlvcGNvZGUtPm5vcGVyYW5kcysrOwotICAgICAgLyogRmluZCB0aGUgbGVuZ3RoIG9mIHRoZSBvcGNvZGUgaW4gYnl0ZXMgKi8KLSAgICAgIG9wY29kZS0+bGVuZ3RoID0gMDsKLSAgICAgIHdoaWxlIChvcGNvZGUtPmRhdGEubmliW29wY29kZS0+bGVuZ3RoICogMl0gIT0gRSkKLQlvcGNvZGUtPmxlbmd0aCsrOwotICAgIH0KLQotICBsaW5rcmVsYXggPSAxOwotfQotCi0KLXN0cnVjdCBoOF9leHAKLXsKLSAgY2hhciAqZV9iZWc7Ci0gIGNoYXIgKmVfZW5kOwotICBleHByZXNzaW9uUyBlX2V4cDsKLX07Ci1pbnQgZGlzcHJlZzsKLWludCBvcHNpemU7CQkJLyogU2V0IHdoZW4gYSByZWdpc3RlciBzaXplIGlzIHNlZW4gKi8KLQotCi1zdHJ1Y3QgaDhfb3AKLXsKLSAgb3BfdHlwZSBtb2RlOwotICB1bnNpZ25lZCByZWc7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLX07Ci0KLS8qCi0gIHBhcnNlIG9wZXJhbmRzCi0gIFdSRUcgcjAscjEscjIscjMscjQscjUscjYscjcsZnAsc3AKLSAgcjBsLHIwaCwuLnI3bCxyN2gKLSAgQFdSRUcKLSAgQFdSRUcrCi0gIEAtV1JFRwotICAjY29uc3QKLSAgY2NyCi0qLwotCi0vKiB0cnkgYW5kIHBhcnNlIGEgcmVnIG5hbWUsIHJldHVybnMgbnVtYmVyIG9mIGNoYXJzIGNvbnN1bWVkICovCi1pbnQKLXBhcnNlX3JlZyAoc3JjLCBtb2RlLCByZWcsIGRpcmVjdGlvbikKLSAgICAgY2hhciAqc3JjOwotICAgICBvcF90eXBlICptb2RlOwotICAgICB1bnNpZ25lZCBpbnQgKnJlZzsKLSAgICAgaW50IGRpcmVjdGlvbjsKLQotewotICBjaGFyICplbmQ7Ci0gIGludCBsZW47Ci0KLSAgLyogQ3JpYmJlZCBmcm9tIGdldF9zeW1ib2xfZW5kKCkuICAqLwotICBpZiAoIWlzX25hbWVfYmVnaW5uZXIgKCpzcmMpIHx8ICpzcmMgPT0gJ1wwMDEnKQotICAgIHJldHVybiAwOwotICBlbmQgPSBzcmMrMTsKLSAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoKmVuZCkgfHwgKmVuZCA9PSAnXDAwMScpCi0gICAgZW5kKys7Ci0gIGxlbiA9IGVuZCAtIHNyYzsKLQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gUFNJWkUgfCBSRUcgfCBkaXJlY3Rpb247Ci0gICAgICAqcmVnID0gNzsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDMgJiYgc3JjWzBdID09ICdjJyAmJiBzcmNbMV0gPT0gJ2MnICYmIHNyY1syXSA9PSAncicpCi0gICAgewotICAgICAgKm1vZGUgPSBDQ1I7Ci0gICAgICAqcmVnID0gMDsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDMgJiYgc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPT0gJ3gnICYmIHNyY1syXSA9PSAncicpCi0gICAgewotICAgICAgKm1vZGUgPSBFWFI7Ci0gICAgICAqcmVnID0gMDsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gUFNJWkUgfCBSRUcgfCBkaXJlY3Rpb247Ci0gICAgICAqcmVnID0gNjsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDMgJiYgc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPT0gJ3InCi0gICAgICAmJiBzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnNycpCi0gICAgewotICAgICAgKm1vZGUgPSBMXzMyIHwgUkVHIHwgZGlyZWN0aW9uOwotICAgICAgKnJlZyA9IHNyY1syXSAtICcwJzsKLSAgICAgIGlmICghSG1vZGUpCi0JYXNfd2FybiAoXygiUmVnIG5vdCB2YWxpZCBmb3IgSDgvMzAwIikpOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2UnICYmIHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JykKLSAgICB7Ci0gICAgICAqbW9kZSA9IExfMTYgfCBSRUcgfCBkaXJlY3Rpb247Ci0gICAgICAqcmVnID0gc3JjWzFdIC0gJzAnICsgODsKLSAgICAgIGlmICghSG1vZGUpCi0JYXNfd2FybiAoXygiUmVnIG5vdCB2YWxpZCBmb3IgSDgvMzAwIikpOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JykKLQl7Ci0JICBpZiAobGVuID09IDMgJiYgc3JjWzJdID09ICdsJykKLQkgICAgewotCSAgICAgICptb2RlID0gTF84IHwgUkVHIHwgZGlyZWN0aW9uOwotCSAgICAgICpyZWcgPSAoc3JjWzFdIC0gJzAnKSArIDg7Ci0JICAgICAgcmV0dXJuIGxlbjsKLQkgICAgfQotCSAgaWYgKGxlbiA9PSAzICYmIHNyY1syXSA9PSAnaCcpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IExfOCB8IFJFRyB8IGRpcmVjdGlvbjsKLQkgICAgICAqcmVnID0gKHNyY1sxXSAtICcwJyk7Ci0JICAgICAgcmV0dXJuIGxlbjsKLQkgICAgfQotCSAgaWYgKGxlbiA9PSAyKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBMXzE2IHwgUkVHIHwgZGlyZWN0aW9uOwotCSAgICAgICpyZWcgPSAoc3JjWzFdIC0gJzAnKTsKLQkgICAgICByZXR1cm4gbGVuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1wYXJzZV9leHAgKHMsIG9wKQotICAgICBjaGFyICpzOwotICAgICBleHByZXNzaW9uUyAqIG9wOwotewotICBjaGFyICpzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjaGFyICpuZXc7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLSAgZXhwcmVzc2lvbiAob3ApOwotICBpZiAob3AtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGNoYXIgKgotc2tpcF9jb2xvbnRoaW5nIChwdHIsIGV4cCwgbW9kZSkKLSAgICAgY2hhciAqcHRyOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgKm1vZGU7Ci17Ci0gIGlmICgqcHRyID09ICc6JykKLSAgICB7Ci0gICAgICBwdHIrKzsKLSAgICAgICptb2RlICY9IH5TSVpFOwotICAgICAgaWYgKCpwdHIgPT0gJzgnKQotCXsKLQkgIHB0cisrOwotCSAgLyogZmYgZmlsbCBhbnkgOCBiaXQgcXVhbnRpdHkgKi8KLQkgLyogZXhwLT5YX2FkZF9udW1iZXIgLT0gMHgxMDA7Ki8KLQkgICptb2RlIHw9IExfODsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCpwdHIgPT0gJzInKQotCSAgICB7Ci0JICAgICAgKm1vZGUgfD0gTF8yNDsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnB0ciA9PSAnMycpCi0JICAgIHsKLQkgICAgICAqbW9kZSB8PSBMXzMyOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcHRyID09ICcxJykKLQkgICAgewotCSAgICAgICptb2RlIHw9IExfMTY7Ci0JICAgIH0KLQkgIHdoaWxlIChpc2RpZ2l0ICgqcHRyKSkKLQkgICAgcHRyKys7Ci0JfQotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogVGhlIG1hbnkgZm9ybXMgb2Ygb3BlcmFuZDoKLQotICAgUm4JCQlSZWdpc3RlciBkaXJlY3QKLSAgIEBSbgkJCVJlZ2lzdGVyIGluZGlyZWN0Ci0gICBAKGV4cFs6MTZdLCBSbikJUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLSAgIEBSbisKLSAgIEAtUm4KLSAgIEBhYTo4CQkJYWJzb2x1dGUgOCBiaXQKLSAgIEBhYToxNgkJCWFic29sdXRlIDE2IGJpdAotICAgQGFhCQkJYWJzb2x1dGUgMTYgYml0Ci0KLSAgICN4eFs6c2l6ZV0JCWltbWVkaWF0ZSBkYXRhCi0gICBAKGV4cDpbOF0sIHBjKQkJcGMgcmVsCi0gICBAQGFhWzo4XQkJbWVtb3J5IGluZGlyZWN0Ci0KLSAgICovCi0KLWNoYXIgKgotY29sb25tb2QyNCAob3AsIHNyYykKLSAgICAgc3RydWN0IGg4X29wICpvcDsKLSAgICAgY2hhciAqc3JjOwotCi17Ci0gIGludCBtb2RlID0gMDsKLSAgc3JjID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmbW9kZSk7Ci0KLSAgaWYgKCFtb2RlKQotICAgIHsKLSAgICAgIC8qIENob29zZSBhIGRlZmF1bHQgbW9kZSAqLwotICAgICAgaWYgKG9wLT5leHAuWF9hZGRfbnVtYmVyIDwgLTMyNzY4Ci0JICB8fCBvcC0+ZXhwLlhfYWRkX251bWJlciA+IDMyNzY3KQotCXsKLQkgIGlmIChIbW9kZSkKLQkgICAgbW9kZSA9IExfMjQ7Ci0JICBlbHNlCi0JICAgIG1vZGUgPSBMXzE2OwotCX0KLSAgICAgIGVsc2UgaWYgKG9wLT5leHAuWF9hZGRfc3ltYm9sCi0JICAgICAgIHx8IG9wLT5leHAuWF9vcF9zeW1ib2wpCi0JbW9kZSA9IERTWU1NT0RFOwotICAgICAgZWxzZQotCW1vZGUgPSBETU9ERTsKLSAgICB9Ci0gIG9wLT5tb2RlIHw9IG1vZGU7Ci0gIHJldHVybiBzcmM7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZAotZ2V0X29wZXJhbmQgKHB0ciwgb3AsIGRzdCwgZGlyZWN0aW9uKQotICAgICBjaGFyICoqcHRyOwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wOwotICAgICB1bnNpZ25lZCBpbnQgZHN0OwotICAgICBpbnQgZGlyZWN0aW9uOwotewotICBjaGFyICpzcmMgPSAqcHRyOwotICBvcF90eXBlIG1vZGU7Ci0gIHVuc2lnbmVkIGludCBudW07Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgb3AtPm1vZGUgPSBFOwotCi0gIC8qIEdyb3NzLiAgR3Jvc3MuICBsZG0gYW5kIHN0bSBoYXZlIGEgZm9ybWF0IG5vdCBlYXNpbHkgaGFuZGxlZAotICAgICBieSBnZXRfb3BlcmFuZC4gIFdlIGRlYWwgd2l0aCBpdCBleHBsaWNpdGx5IGhlcmUuICAqLwotICBpZiAoc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPT0gJ3InICYmIGlzZGlnaXQoc3JjWzJdKQotICAgICAgJiYgc3JjWzNdID09ICctJyAmJiBzcmNbNF0gPT0gJ2UnICYmIHNyY1s1XSA9PSAncicgJiYgaXNkaWdpdChzcmNbNl0pKQotICAgIHsKLSAgICAgIGludCBsb3csIGhpZ2g7Ci0KLSAgICAgIGxvdyA9IHNyY1syXSAtICcwJzsKLSAgICAgIGhpZ2ggPSBzcmNbNl0gLSAnMCc7Ci0KLSAgICAgIGlmIChoaWdoIDwgbG93KQotCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iKSk7Ci0KLSAgICAgIGlmIChsb3cgJSAyKQotCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iKSk7Ci0KLSAgICAgIGlmIChoaWdoIC0gbG93ID4gMykKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXIgbGlzdCBmb3IgbGRtL3N0bVxuIikpOwotCi0gICAgICBpZiAoaGlnaCAtIGxvdyAhPSAxCi0JICAmJiBsb3cgJSA0KQotCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iKSk7Ci0KLSAgICAgIC8qIEV2ZW4gc2lja2VyLiAgV2UgZW5jb2RlIHR3byByZWdpc3RlcnMgaW50byBvcC0+cmVnLiAgT25lCi0JIGZvciB0aGUgbG93IHJlZ2lzdGVyIHRvIHNhdmUsIHRoZSBvdGhlciBmb3IgdGhlIGhpZ2gKLQkgcmVnaXN0ZXIgdG8gc2F2ZTsgIHdlIGFsc28gc2V0IHRoZSBoaWdoIGJpdCBpbiBvcC0+cmVnCi0JIHNvIHdlIGtub3cgdGhpcyBpcyAidmVyeSBzcGVjaWFsIi4gICovCi0gICAgICBvcC0+cmVnID0gMHg4MDAwMDAwMCB8IChoaWdoIDw8IDgpIHwgbG93OwotICAgICAgb3AtPm1vZGUgPSBSRUc7Ci0gICAgICAqcHRyID0gc3JjICsgNzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZvcC0+bW9kZSwgJm9wLT5yZWcsIGRpcmVjdGlvbik7Ci0gIGlmIChsZW4pCi0gICAgewotICAgICAgKnB0ciA9IHNyYyArIGxlbjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzcmMgPT0gJ0AnKQotICAgIHsKLSAgICAgIHNyYysrOwotICAgICAgaWYgKCpzcmMgPT0gJ0AnKQotCXsKLQkgIHNyYysrOwotCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKLQotCSAgc3JjID0gc2tpcF9jb2xvbnRoaW5nIChzcmMsICZvcC0+ZXhwLCAmb3AtPm1vZGUpOwotCi0JICAqcHRyID0gc3JjOwotCi0JICBvcC0+bW9kZSA9IE1FTUlORDsKLQkgIHJldHVybjsKLQotCX0KLQotCi0gICAgICBpZiAoKnNyYyA9PSAnLScpCi0JewotCSAgc3JjKys7Ci0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZudW0sIGRpcmVjdGlvbik7Ci0JICBpZiAobGVuID09IDApCi0JICAgIHsKLQkgICAgICAvKiBPb3BzLCBub3QgYSByZWcgYWZ0ZXIgYWxsLCBtdXN0IGJlIG9yZGluYXJ5IGV4cCAqLwotCSAgICAgIHNyYy0tOwotCSAgICAgIC8qIG11c3QgYmUgYSBzeW1ib2wgKi8KLQkgICAgICBvcC0+bW9kZSA9IEFCUyB8IFBTSVpFIHwgZGlyZWN0aW9uOwotCSAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCksCi0JCQkJICAgICAgJm9wLT5leHAsICZvcC0+bW9kZSk7Ci0KLQkgICAgICByZXR1cm47Ci0KLQotCSAgICB9Ci0KLQotCSAgaWYgKChtb2RlICYgU0laRSkgIT0gUFNJWkUpCi0JICAgIGFzX2JhZCAoXygiV3Jvbmcgc2l6ZSBwb2ludGVyIHJlZ2lzdGVyIGZvciBhcmNoaXRlY3R1cmUuIikpOwotCSAgb3AtPm1vZGUgPSBSRERFQzsKLQkgIG9wLT5yZWcgPSBudW07Ci0JICAqcHRyID0gc3JjICsgbGVuOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmICgqc3JjID09ICcoJykKLQl7Ci0JICAvKiBEaXNwICovCi0JICBzcmMrKzsKLQotCSAgLyogU3RhcnQgb2ZmIGFzc3VtaW5nIGEgMTYgYml0IG9mZnNldCAqLwotCi0KLQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7Ci0KLQkgIHNyYyA9IGNvbG9ubW9kMjQgKG9wLCBzcmMpOwotCi0JICBpZiAoKnNyYyA9PSAnKScpCi0JICAgIHsKLQkgICAgICBzcmMrKzsKLQkgICAgICBvcC0+bW9kZSB8PSBBQlMgfCBkaXJlY3Rpb247Ci0JICAgICAgKnB0ciA9IHNyYzsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgaWYgKCpzcmMgIT0gJywnKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIikpOwotCSAgICAgIHJldHVybjsKLQotCSAgICB9Ci0JICBzcmMrKzsKLQotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmb3AtPnJlZywgZGlyZWN0aW9uKTsKLQkgIGlmIChsZW4gPT0gMCB8fCAhKG1vZGUgJiBSRUcpKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgb3AtPm1vZGUgfD0gRElTUCB8IGRpcmVjdGlvbjsKLQkgIGRpc3ByZWcgPSBvcC0+cmVnOwotCSAgc3JjICs9IGxlbjsKLQkgIHNyYyA9IHNraXBfY29sb250aGluZyAoc3JjLCAmb3AtPmV4cCwgJm9wLT5tb2RlKTsKLQotCSAgaWYgKCpzcmMgIT0gJyknICYmICcoJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIHJlZzE2KSIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgICpwdHIgPSBzcmMgKyAxOwotCi0JICByZXR1cm47Ci0JfQotICAgICAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmbnVtLCBkaXJlY3Rpb24pOwotCi0gICAgICBpZiAobGVuKQotCXsKLQkgIHNyYyArPSBsZW47Ci0JICBpZiAoKnNyYyA9PSAnKycpCi0JICAgIHsKLQkgICAgICBzcmMrKzsKLQkgICAgICBpZiAoKG1vZGUgJiBTSVpFKSAhPSBQU0laRSkKLQkJYXNfYmFkIChfKCJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iKSk7Ci0JICAgICAgb3AtPm1vZGUgPSBSU0lOQzsKLQkgICAgICBvcC0+cmVnID0gbnVtOwotCSAgICAgICpwdHIgPSBzcmM7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBpZiAoKG1vZGUgJiBTSVpFKSAhPSBQU0laRSkKLQkgICAgYXNfYmFkIChfKCJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iKSk7Ci0KLQkgIG9wLT5tb2RlID0gZGlyZWN0aW9uIHwgSU5EIHwgUFNJWkU7Ci0JICBvcC0+cmVnID0gbnVtOwotCSAgKnB0ciA9IHNyYzsKLQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBtdXN0IGJlIGEgc3ltYm9sICovCi0KLQkgIG9wLT5tb2RlID0gQUJTIHwgZGlyZWN0aW9uOwotCSAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKLQotCSAgKnB0ciA9IGNvbG9ubW9kMjQgKG9wLCBzcmMpOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLQotCi0gIGlmICgqc3JjID09ICcjJykKLSAgICB7Ci0gICAgICBzcmMrKzsKLSAgICAgIG9wLT5tb2RlID0gSU1NOwotICAgICAgc3JjID0gcGFyc2VfZXhwIChzcmMsICZvcC0+ZXhwKTsKLSAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKHNyYywgJm9wLT5leHAsICZvcC0+bW9kZSk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKHNyYywgIm1hY2giLCA0KSA9PSAwCi0JICAgfHwgc3RybmNtcCAoc3JjLCAibWFjbCIsIDQpID09IDApCi0gICAgewotICAgICAgb3AtPnJlZyA9IHNyY1szXSA9PSAnbCc7Ci0gICAgICBvcC0+bW9kZSA9IE1BQ1JFRzsKLSAgICAgICpwdHIgPSBzcmMgKyA0OwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmb3AtPmV4cCk7Ci0gICAgICAvKiBUcmFpbGluZyAnOicgc2l6ZSA/ICovCi0gICAgICBpZiAoKnNyYyA9PSAnOicpCi0JewotCSAgaWYgKHNyY1sxXSA9PSAnMScgJiYgc3JjWzJdID09ICc2JykKLQkgICAgewotCSAgICAgIG9wLT5tb2RlID0gUENSRUwgfCBMXzE2OwotCSAgICAgIHNyYyArPSAzOwotCSAgICB9Ci0JICBlbHNlIGlmIChzcmNbMV0gPT0gJzgnKQotCSAgICB7Ci0JICAgICAgb3AtPm1vZGUgPSBQQ1JFTCB8IExfODsKLQkgICAgICBzcmMgKz0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3QgOjggb3IgOjE2IGhlcmUiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3AtPm1vZGUgPSBQQ1JFTCB8IGJzaXplOwotCX0KLSAgICAgICpwdHIgPSBzcmM7Ci0gICAgfQotfQotCi0KLXN0YXRpYwotY2hhciAqCi1nZXRfb3BlcmFuZHMgKG5vcGVyYW5kcywgb3BfZW5kLCBvcGVyYW5kKQotICAgICB1bnNpZ25lZCBpbnQgbm9wZXJhbmRzOwotICAgICBjaGFyICpvcF9lbmQ7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKLXsKLSAgY2hhciAqcHRyID0gb3BfZW5kOwotCi0gIHN3aXRjaCAobm9wZXJhbmRzKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBvcGVyYW5kWzBdLm1vZGUgPSAwOwotICAgICAgb3BlcmFuZFsxXS5tb2RlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDAsIFNSQyk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JewotCSAgcHRyKys7Ci0JICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDEsIDEsIERTVCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wZXJhbmRbMV0ubW9kZSA9IDA7Ci0JfQotCi0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCwgU1JDKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSwgRFNUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotCi0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAotICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcwotICAgcHJvdmlkZWQKLSAgICovCi1zdGF0aWMKLXN0cnVjdCBoOF9vcGNvZGUgKgotZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmRzLCBzaXplKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZHM7Ci0gICAgIGludCBzaXplOwotewotICBzdHJ1Y3QgaDhfb3Bjb2RlICp0aGlzX3RyeSA9IG9wY29kZTsKLSAgaW50IGZvdW5kID0gMDsKLQotICB1bnNpZ25lZCBpbnQgdGhpc19pbmRleCA9IG9wY29kZS0+aWR4OwotCi0gIC8qIFRoZXJlJ3Mgb25seSBvbmUgbGRtL3N0bSBhbmQgaXQncyBlYXNpZXIgdG8ganVzdAotICAgICBnZXQgb3V0IHF1aWNrIGZvciB0aGVtLiAgKi8KLSAgaWYgKHN0cmNtcCAob3Bjb2RlLT5uYW1lLCAic3RtLmwiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKG9wY29kZS0+bmFtZSwgImxkbS5sIikgPT0gMCkKLSAgICByZXR1cm4gdGhpc190cnk7Ci0KLSAgd2hpbGUgKHRoaXNfaW5kZXggPT0gb3Bjb2RlLT5pZHggJiYgIWZvdW5kKQotICAgIHsKLSAgICAgIGZvdW5kID0gMTsKLQotICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKLSAgICAgIGlmICh0aGlzX3RyeS0+bm9wZXJhbmRzID09IDApCi0JewotCSAgaW50IHRoaXNfc2l6ZTsKLQotCSAgdGhpc19zaXplID0gdGhpc190cnktPmhvdyAmIFNOOwotCSAgaWYgKHRoaXNfc2l6ZSAhPSBzaXplICYmICh0aGlzX3NpemUgIT0gU0IgfHwgc2l6ZSAhPSBTTikpCi0JICAgIGZvdW5kID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgaW50IGk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCB0aGlzX3RyeS0+bm9wZXJhbmRzICYmIGZvdW5kOyBpKyspCi0JICAgIHsKLQkgICAgICBvcF90eXBlIG9wID0gdGhpc190cnktPmFyZ3MubmliW2ldOwotCSAgICAgIGludCB4ID0gb3BlcmFuZHNbaV0ubW9kZTsKLQotCSAgICAgIGlmICgob3AgJiAoRElTUCB8IFJFRykpID09IChESVNQIHwgUkVHKQotCQkgICYmICgoeCAmIChESVNQIHwgUkVHKSkgPT0gKERJU1AgfCBSRUcpKSkKLQkJewotCQkgIGRpc3ByZWcgPSBvcGVyYW5kc1tpXS5yZWc7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvcCAmIFJFRykKLQkJewotCQkgIGlmICghKHggJiBSRUcpKQotCQkgICAgZm91bmQgPSAwOwotCi0JCSAgaWYgKHggJiBMX1ApCi0JCSAgICB4ID0gKHggJiB+TF9QKSB8IChIbW9kZSA/IExfMzIgOiBMXzE2KTsKLQkJICBpZiAob3AgJiBMX1ApCi0JCSAgICBvcCA9IChvcCAmIH5MX1ApIHwgKEhtb2RlID8gTF8zMiA6IExfMTYpOwotCi0JCSAgb3BzaXplID0gb3AgJiBTSVpFOwotCi0JCSAgLyogVGhlIHNpemUgb2YgdGhlIHJlZyBpcyB2IGltcG9ydGFudCAqLwotCQkgIGlmICgob3AgJiBTSVpFKSAhPSAoeCAmIFNJWkUpKQotCQkgICAgZm91bmQgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wICYgQUJTSk1QKSAmJiAoeCAmIEFCUykpCi0JCXsKLQkJICBvcGVyYW5kc1tpXS5tb2RlICY9IH5BQlM7Ci0JCSAgb3BlcmFuZHNbaV0ubW9kZSB8PSBBQlNKTVA7Ci0JCSAgLyogQnV0IGl0IG1heSBub3QgYmUgMjQgYml0cyBsb25nICovCi0JCSAgaWYgKCFIbW9kZSkKLQkJICAgIHsKLQkJICAgICAgb3BlcmFuZHNbaV0ubW9kZSAmPSB+U0laRTsKLQkJICAgICAgb3BlcmFuZHNbaV0ubW9kZSB8PSBMXzE2OwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wICYgKEtCSVQgfCBEQklUKSkgJiYgKHggJiBJTU0pKQotCQl7Ci0JCSAgLyogVGhpcyBpcyBvayBpZiB0aGUgaW1tZWRpYXRlIHZhbHVlIGlzIHNlbnNpYmxlICovCi0JCX0KLQkgICAgICBlbHNlIGlmIChvcCAmIFBDUkVMKQotCQl7Ci0JCSAgLyogVGhlIHNpemUgb2YgdGhlIGRpc3BsYWNlbWVudCBpcyBpbXBvcnRhbnQgKi8KLQkJICBpZiAoKG9wICYgU0laRSkgIT0gKHggJiBTSVpFKSkKLQkJICAgIGZvdW5kID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcCAmIChESVNQIHwgSU1NIHwgQUJTKSkKLQkJICAgICAgICYmIChvcCAmIChESVNQIHwgSU1NIHwgQUJTKSkgPT0gKHggJiAoRElTUCB8IElNTSB8IEFCUykpKQotCQl7Ci0JCSAgLyogUHJvbW90ZSBhIExfMjQgdG8gTF8zMiBpZiBpdCBtYWtlcyB1cyBtYXRjaC4gICovCi0JCSAgaWYgKCh4ICYgTF8yNCkgJiYgKG9wICYgTF8zMikpCi0JCSAgICB7Ci0JCSAgICAgIHggJj0gfkxfMjQ7Ci0JCSAgICAgIHggfD0gTF8zMjsKLQkJICAgIH0KLQkJICAvKiBQcm9tb3RlIGFuIEw4IHRvIExfMTYgaWYgaXQgbWFrZXMgdXMgbWF0Y2guICAqLwotCQkgIGlmIChvcCAmIEFCUyAmJiBvcCAmIExfOCAmJiBvcCAmIERJU1ApIAotCQkgICAgewotCQkgICAgICBpZiAoeCAmIExfMTYpCi0JCQlmb3VuZD0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmICgoeCAmIFNJWkUpICE9IDAKLQkJCSAgICYmICgob3AgJiBTSVpFKSAhPSAoeCAmIFNJWkUpKSkKLQkJICAgIGZvdW5kID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcCAmIE1BQ1JFRykgIT0gKHggJiBNQUNSRUcpKQotCQl7Ci0JCSAgZm91bmQgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wICYgTU9ERSkgIT0gKHggJiBNT0RFKSkKLQkJewotCQkgIGZvdW5kID0gMDsKLQkJfQkKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdGhpc190cnk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIHdpZHRoLCBzdHJpbmcpCi0gICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKLSAgICAgdW5zaWduZWQgaW50IHdpZHRoOwotICAgICBjaGFyICpzdHJpbmc7Ci17Ci0gIGlmIChvcGVyYW5kLT5leHAuWF9hZGRfc3ltYm9sID09IDAKLSAgICAgICYmIG9wZXJhbmQtPmV4cC5YX29wX3N5bWJvbCA9PSAwKQotICAgIHsKLQotICAgICAgLyogTm8gc3ltYm9sIGludm9sdmVkLCBsZXQncyBsb29rIGF0IG9mZnNldCwgaXQncyBkYW5nZXJvdXMgaWYgYW55IG9mCi0JIHRoZSBoaWdoIGJpdHMgYXJlIG5vdCAwIG9yIGZmJ3MsIGZpbmQgb3V0IGJ5IG9yaW5nIG9yIGFuZGluZyB3aXRoCi0JIHRoZSB3aWR0aCBhbmQgc2VlaW5nIGlmIHRoZSBhbnN3ZXIgaXMgMCBvciBhbGwgZnMqLwotICAgICAgCi0gICAgICBpZiAoKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJiB+d2lkdGgpICE9IDAgJiYKLQkgIChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyIHwgd2lkdGgpICE9ICh+MCkpCi0JewotCSAgaWYgKHdpZHRoID09IDI1NSAKLQkgICAgICAmJiAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciAmIDB4ZmYwMCkgPT0gMHhmZjAwKQotCSAgICB7Ci0JICAgICAgLyogSnVzdCBpZ25vcmUgdGhpcyBvbmUgLSB3aGljaCBoYXBwZW5zIHdoZW4gdHJ5aW5nIHRvCi0JCSBmaXQgYSAxNiBiaXQgYWRkcmVzcyB0cnVuY2F0ZWQgaW50byBhbiA4IGJpdCBhZGRyZXNzCi0JCSBvZiBzb21ldGhpbmcgbGlrZSBic2V0LiAgKi8KLQkgICAgfQotCSAgZWxzZSAKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIm9wZXJhbmQgJXMweCVseCBvdXQgb2YgcmFuZ2UuIiksIHN0cmluZywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLX0KLQotLyogUkVMQVhNT0RFIGhhcyBvbmUgb2YgMyB2YWx1ZXM6Ci0KLSAgIDAgT3V0cHV0IGEgIm5vcm1hbCIgcmVsb2MsIG5vIHJlbGF4aW5nIHBvc3NpYmxlIGZvciB0aGlzIGluc24vcmVsb2MKLQotICAgMSBPdXRwdXQgYSByZWxheGFibGUgMjRiaXQgYWJzb2x1dGUgbW92LncgYWRkcmVzcyByZWxvY2F0aW9uCi0gICAgIChtYXkgcmVsYXggaW50byBhIDE2Yml0IGFic29sdXRlIGFkZHJlc3MpLgotCi0gICAyIE91dHB1dCBhIHJlbGF4YWJsZSAxNi8yNCBhYnNvbHV0ZSBtb3YuYiBhZGRyZXNzIHJlbG9jYXRpb24KLSAgICAgKG1heSByZWxheCBpbnRvIGFuIDhiaXQgYWJzb2x1dGUgYWRkcmVzcykuICAqLwotCi1zdGF0aWMgdm9pZAotZG9fYV9maXhfaW1tIChvZmZzZXQsIG9wZXJhbmQsIHJlbGF4bW9kZSkKLSAgICAgaW50IG9mZnNldDsKLSAgICAgc3RydWN0IGg4X29wICpvcGVyYW5kOwotICAgICBpbnQgcmVsYXhtb2RlOwotewotICBpbnQgaWR4OwotICBpbnQgc2l6ZTsKLSAgaW50IHdoZXJlOwotCi0KLSAgY2hhciAqdCA9IG9wZXJhbmQtPm1vZGUgJiBJTU0gPyAiIyIgOiAiQCI7Ci0KLSAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9zeW1ib2wgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpieXRlcyA9IGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0OwotICAgICAgc3dpdGNoIChvcGVyYW5kLT5tb2RlICYgU0laRSkKLQl7Ci0JY2FzZSBMXzI6Ci0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweDMsIHQpOwotCSAgYnl0ZXNbMF0gfD0gKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpIDw8IDQ7Ci0JICBicmVhazsKLQljYXNlIExfMzoKLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4NywgdCk7Ci0JICBieXRlc1swXSB8PSAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlcikgPDwgNDsKLQkgIGJyZWFrOwotCWNhc2UgTF84OgotCSAgY2hlY2tfb3BlcmFuZCAob3BlcmFuZCwgMHhmZiwgdCk7Ci0JICBieXRlc1swXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXI7Ci0JICBicmVhazsKLQljYXNlIExfMTY6Ci0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kLCAweGZmZmYsIHQpOwotCSAgYnl0ZXNbMF0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDg7Ci0JICBieXRlc1sxXSA9IG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgPj4gMDsKLQkgIGJyZWFrOwotCWNhc2UgTF8yNDoKLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQsIDB4ZmZmZmZmLCB0KTsKLQkgIGJ5dGVzWzBdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAxNjsKLQkgIGJ5dGVzWzFdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiA4OwotCSAgYnl0ZXNbMl0gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDA7Ci0JICBicmVhazsKLQotCWNhc2UgTF8zMjoKLQkgIC8qIFRoaXMgc2hvdWxkIGJlIGRvbmUgd2l0aCBiZmQgKi8KLQkgIGJ5dGVzWzBdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAyNDsKLQkgIGJ5dGVzWzFdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiAxNjsKLQkgIGJ5dGVzWzJdID0gb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA+PiA4OwotCSAgYnl0ZXNbM10gPSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyID4+IDA7Ci0JICBicmVhazsKLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wZXJhbmQtPm1vZGUgJiBTSVpFKQotCXsKLQotCWNhc2UgTF8yNDoKLQljYXNlIExfMzI6Ci0JICBzaXplID0gNDsKLQkgIHdoZXJlID0gKG9wZXJhbmQtPm1vZGUgJiBTSVpFKSA9PSBMXzI0ID8gLTEgOiAwOwotCSAgaWYgKHJlbGF4bW9kZSA9PSAyKQotCSAgICBpZHggPSBSX01PVjI0QjE7Ci0JICBlbHNlIGlmIChyZWxheG1vZGUgPT0gMSkKLQkgICAgaWR4ID0gUl9NT1ZMMTsKLQkgIGVsc2UKLQkgICAgaWR4ID0gUl9SRUxMT05HOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZChfKCJDYW4ndCB3b3JrIG91dCBzaXplIG9mIG9wZXJhbmQuXG4iKSk7Ci0JY2FzZSBMXzE2OgotCSAgc2l6ZSA9IDI7Ci0JICB3aGVyZSA9IDA7Ci0JICBpZiAocmVsYXhtb2RlID09IDIpCi0JICAgIGlkeCA9IFJfTU9WMTZCMTsKLQkgIGVsc2UKLQkgICAgaWR4ID0gUl9SRUxXT1JEOwotCSAgb3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciA9IChzaG9ydClvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyOwotCSAgYnJlYWs7Ci0JY2FzZSBMXzg6Ci0JICBzaXplID0gMTsKLQkgIHdoZXJlID0gMDsKLQkgIGlkeCA9IFJfUkVMQllURTsKLQkgIC8qIFRoaXMgdXNlZCB0byB1c2UgYSBjYXN0IHRvIGNoYXIsIGJ1dCB0aGF0IGZhaWxzIGlmIGNoYXIgaXMgYW4KLQkgICAgIHVuc2lnbmVkIHR5cGUuICBXZSBjYW4ndCB1c2UgYHNpZ25lZCBjaGFyJywgYXMgdGhhdCBpc24ndCB2YWxpZAotCSAgICAgSyZSIEMuICAqLwotCSAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJiAweDgwKQotCSAgICBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyIHw9ICgob2Zmc2V0VCkgLTEgPDwgOCk7Ci0JICBlbHNlCi0JICAgIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIgJj0gMHhmZjsKLQl9Ci0KLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgb2Zmc2V0ICsgd2hlcmUsCi0JCSAgIHNpemUsCi0JCSAgICZvcGVyYW5kLT5leHAsCi0JCSAgIDAsCi0JCSAgIGlkeCk7Ci0gICAgfQotCi19Ci0KLS8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCi0gKi8KLXN0YXRpYyB2b2lkCi1idWlsZF9ieXRlcyAodGhpc190cnksIG9wZXJhbmQpCi0gICAgIHN0cnVjdCBoOF9vcGNvZGUgKnRoaXNfdHJ5OwotICAgICBzdHJ1Y3QgaDhfb3AgKm9wZXJhbmQ7Ci17Ci0gIHVuc2lnbmVkIGludCBpOwotCi0gIGNoYXIgKm91dHB1dCA9IGZyYWdfbW9yZSAodGhpc190cnktPmxlbmd0aCk7Ci0gIG9wX3R5cGUgKm5pYmJsZV9wdHIgPSB0aGlzX3RyeS0+ZGF0YS5uaWI7Ci0gIG9wX3R5cGUgYzsKLSAgdW5zaWduZWQgaW50IG5pYmJsZV9jb3VudCA9IDA7Ci0gIGludCBhYnNhdDsKLSAgaW50IGltbWF0OwotICBpbnQgbmliOwotICBpbnQgbW92YiA9IDA7Ci0gIGNoYXIgYXNuaWJibGVzWzMwXTsKLSAgY2hhciAqcCA9IGFzbmliYmxlczsKLQotICBpZiAoISh0aGlzX3RyeS0+aW5iYXNlIHx8IEhtb2RlKSkKLSAgICBhc193YXJuIChfKCJPcGNvZGUgYCVzJyB3aXRoIHRoZXNlIG9wZXJhbmQgdHlwZXMgbm90IGF2YWlsYWJsZSBpbiBIOC8zMDAgbW9kZSIpLAotCSAgICAgdGhpc190cnktPm5hbWUpOwotCi0gIHdoaWxlICgqbmliYmxlX3B0ciAhPSBFKQotICAgIHsKLSAgICAgIGludCBkOwotICAgICAgYyA9ICpuaWJibGVfcHRyKys7Ci0KLSAgICAgIGQgPSAoYyAmIChEU1QgfCBTUkNfSU5fRFNUKSkgIT0gMDsKLQotICAgICAgaWYgKGMgPCAxNikKLQl7Ci0JICBuaWIgPSBjOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0KLQkgIGlmIChjICYgKFJFRyB8IElORCB8IElOQyB8IERFQykpCi0JICAgIHsKLQkgICAgICBuaWIgPSBvcGVyYW5kW2RdLnJlZzsKLQkgICAgfQotCSAgZWxzZSBpZiAoKGMgJiBESVNQUkVHKSA9PSAoRElTUFJFRykpCi0JICAgIHsKLQkgICAgICBuaWIgPSBkaXNwcmVnOwotCSAgICB9Ci0JICBlbHNlIGlmIChjICYgIEFCUyApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kW2RdLm1vZGUgPSBjOwotCSAgICAgIGFic2F0ID0gbmliYmxlX2NvdW50IC8gMjsKLQkgICAgICBuaWIgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChjICYgKElNTSB8IFBDUkVMIHwgQUJTIHwgQUJTSk1QIHwgRElTUCkpCi0JICAgIHsKLQkgICAgICBvcGVyYW5kW2RdLm1vZGUgPSBjOwotCSAgICAgIGltbWF0ID0gbmliYmxlX2NvdW50IC8gMjsKLQkgICAgICBuaWIgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChjICYgSUdOT1JFKQotCSAgICB7Ci0JICAgICAgbmliID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyAmIERCSVQpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKG9wZXJhbmRbMF0uZXhwLlhfYWRkX251bWJlcikKLQkJewotCQljYXNlIDE6Ci0JCSAgbmliID0gYzsKLQkJICBicmVhazsKLQkJY2FzZSAyOgotCQkgIG5pYiA9IDB4OCB8IGM7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYXNfYmFkIChfKCJOZWVkICMxIG9yICMyIGhlcmUiKSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAoYyAmIEtCSVQpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKG9wZXJhbmRbMF0uZXhwLlhfYWRkX251bWJlcikKLQkJewotCQljYXNlIDE6Ci0JCSAgbmliID0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAyOgotCQkgIG5pYiA9IDg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgNDoKLQkJICBpZiAoIUhtb2RlKQotCQkgICAgYXNfd2FybiAoXygiIzQgbm90IHZhbGlkIG9uIEg4LzMwMC4iKSk7Ci0JCSAgbmliID0gOTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGFzX2JhZCAoXygiTmVlZCAjMSBvciAjMiBoZXJlIikpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogc3RvcCBpdCBtYWtpbmcgYSBmaXggKi8KLQkgICAgICBvcGVyYW5kWzBdLm1vZGUgPSAwOwotCSAgICB9Ci0KLQkgIGlmIChjICYgTUVNUkVMQVgpCi0JICAgIHsKLQkgICAgICBvcGVyYW5kW2RdLm1vZGUgfD0gTUVNUkVMQVg7Ci0JICAgIH0KLQotCSAgaWYgKGMgJiBCMzEpCi0JICAgIHsKLQkgICAgICBuaWIgfD0gMHg4OwotCSAgICB9Ci0KLQkgIGlmIChjICYgTUFDUkVHKQotCSAgICB7Ci0JICAgICAgbmliID0gMiArIG9wZXJhbmRbZF0ucmVnOwotCSAgICB9Ci0JfQotICAgICAgbmliYmxlX2NvdW50Kys7Ci0KLSAgICAgICpwKysgPSBuaWI7Ci0gICAgfQotCi0gIC8qIERpc2d1c3RpbmcuICBXaHksIG9oIHdoeSBkaWRuJ3Qgc29tZW9uZSBhc2sgdXMgZm9yIGFkdmljZQotICAgICBvbiB0aGUgYXNzZW1ibGVyIGZvcm1hdC4gICovCi0gIGlmIChzdHJjbXAgKHRoaXNfdHJ5LT5uYW1lLCAic3RtLmwiKSA9PSAwCi0gICAgICB8fCBzdHJjbXAgKHRoaXNfdHJ5LT5uYW1lLCAibGRtLmwiKSA9PSAwKQotICAgIHsKLSAgICAgIGludCBoaWdoLCBsb3c7Ci0gICAgICBoaWdoID0gKG9wZXJhbmRbdGhpc190cnktPm5hbWVbMF0gPT0gJ2wnID8gMSA6IDBdLnJlZyA+PiA4KSAmIDB4ZjsKLSAgICAgIGxvdyA9IG9wZXJhbmRbdGhpc190cnktPm5hbWVbMF0gPT0gJ2wnID8gMSA6IDBdLnJlZyAmIDB4ZjsKLQotICAgICAgYXNuaWJibGVzWzJdID0gaGlnaCAtIGxvdzsKLSAgICAgIGFzbmliYmxlc1s3XSA9ICh0aGlzX3RyeS0+bmFtZVswXSA9PSAnbCcpID8gaGlnaCA6IGxvdzsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHRoaXNfdHJ5LT5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBvdXRwdXRbaV0gPSAoYXNuaWJibGVzW2kgKiAyXSA8PCA0KSB8IGFzbmliYmxlc1tpICogMiArIDFdOwotICAgIH0KLQotICAvKiBOb3RlIGlmIHRoaXMgaXMgYSBtb3ZiIGluc3RydWN0aW9uIC0tIHRoZXJlJ3MgYSBzcGVjaWFsIHJlbGF4YXRpb24KLSAgICAgd2hpY2ggb25seSBhcHBsaWVzIHRvIHRoZW0uICAqLwotICBpZiAoc3RyY21wICh0aGlzX3RyeS0+bmFtZSwgIm1vdi5iIikgPT0gMCkKLSAgICBtb3ZiID0gMTsKLQotICAvKiBvdXRwdXQgYW55IGZpeGVzICovCi0gIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgewotICAgICAgaW50IHggPSBvcGVyYW5kW2ldLm1vZGU7Ci0KLSAgICAgIGlmICh4ICYgKElNTSB8IERJU1ApKQotCXsKLQkgIGRvX2FfZml4X2ltbSAob3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBpbW1hdCwKLQkJCW9wZXJhbmQgKyBpLCB4ICYgTUVNUkVMQVggIT0gMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoeCAmIEFCUykKLQl7Ci0JICBkb19hX2ZpeF9pbW0gKG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgYWJzYXQsCi0JCQlvcGVyYW5kICsgaSwgeCAmIE1FTVJFTEFYID8gbW92YiArIDEgOiAwKTsKLQl9Ci0gICAgICBlbHNlIGlmICh4ICYgUENSRUwpCi0JewotCSAgaW50IHNpemUxNiA9IHggJiBMXzE2OwotCSAgaW50IHdoZXJlID0gc2l6ZTE2ID8gMiA6IDE7Ci0JICBpbnQgc2l6ZSA9IHNpemUxNiA/IDIgOiAxOwotCSAgaW50IHR5cGUgPSBzaXplMTYgPyBSX1BDUldPUkQgOiBSX1BDUkJZVEU7Ci0KLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQgKyBpLCBzaXplMTYgPyAweDdmZmYgOiAweDdmLCAiQCIpOwotCi0JICBpZiAob3BlcmFuZFtpXS5leHAuWF9hZGRfbnVtYmVyICYgMSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImJyYW5jaCBvcGVyYW5kIGhhcyBvZGQgb2Zmc2V0ICglbHgpXG4iKSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKLQkgICAgfQotCi0JICBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgLT0gMTsKLQkgIC8qIFRoaXMgdXNlZCB0byB1c2UgYSBjYXN0IHRvIGNoYXIsIGJ1dCB0aGF0IGZhaWxzIGlmIGNoYXIgaXMgYW4KLQkgICAgIHVuc2lnbmVkIHR5cGUuICBXZSBjYW4ndCB1c2UgYHNpZ25lZCBjaGFyJywgYXMgdGhhdCBpc24ndCB2YWxpZAotCSAgICAgSyZSIEMuICAqLwotCSAgaWYgKG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciAmIDB4ODApCi0JICAgIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlciB8PSAoKG9mZnNldFQpIC0xIDw8IDgpOwotCSAgZWxzZQotCSAgICBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgJj0gMHhmZjsKLQotCSAgZml4X25ld19leHAgKGZyYWdfbm93LAotCQkgICAgICAgb3V0cHV0IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyB3aGVyZSwKLQkJICAgICAgIHNpemUsCi0JCSAgICAgICAmb3BlcmFuZFtpXS5leHAsCi0JCSAgICAgICAxLAotCQkgICAgICAgdHlwZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoeCAmIE1FTUlORCkKLQl7Ci0KLQkgIGNoZWNrX29wZXJhbmQgKG9wZXJhbmQgKyBpLCAweGZmLCAiQEAiKTsKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgMSwKLQkJICAgICAgIDEsCi0JCSAgICAgICAmb3BlcmFuZFtpXS5leHAsCi0JCSAgICAgICAwLAotCQkgICAgICAgUl9NRU1fSU5ESVJFQ1QpOwotCX0KLSAgICAgIGVsc2UgaWYgKHggJiBBQlNKTVApCi0JewotCSAgLyogVGhpcyBqbXAgbWF5IGJlIGEganVtcCBvciBhIGJyYW5jaCAqLwotCi0JICBjaGVja19vcGVyYW5kIChvcGVyYW5kICsgaSwgSG1vZGUgPyAweGZmZmZmZiA6IDB4ZmZmZiwgIkAiKTsKLQkgIGlmIChvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgJiAxKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiYnJhbmNoIG9wZXJhbmQgaGFzIG9kZCBvZmZzZXQgKCVseClcbiIpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG9wZXJhbmQtPmV4cC5YX2FkZF9udW1iZXIpOwotCSAgICB9Ci0JICBpZiAoIUhtb2RlKQotCSAgICBvcGVyYW5kW2ldLmV4cC5YX2FkZF9udW1iZXIgPSAoc2hvcnQpIG9wZXJhbmRbaV0uZXhwLlhfYWRkX251bWJlcjsKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICAgICAgNCwKLQkJICAgICAgICZvcGVyYW5kW2ldLmV4cCwKLQkJICAgICAgIDAsCi0JCSAgICAgICBSX0pNUEwxKTsKLQl9Ci0gICAgfQotCi19Ci0KLS8qCi0gIHRyeSBhbmQgZ2l2ZSBhbiBpbnRlbGxpZ2VudCBlcnJvciBtZXNzYWdlIGZvciBjb21tb24gYW5kIHNpbXBsZSB0bwotICBkZXRlY3QgZXJyb3JzCi0gICovCi0KLXN0YXRpYyB2b2lkCi1jbGV2ZXJfbWVzc2FnZSAob3Bjb2RlLCBvcGVyYW5kKQotICAgICBzdHJ1Y3QgaDhfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIHN0cnVjdCBoOF9vcCAqb3BlcmFuZDsKLXsKLSAgLyogRmluZCBvdXQgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgb3BjY29kZSAqLwotCi0gIGlmICgob3Bjb2RlICsgMSktPmlkeCAhPSBvcGNvZGUtPmlkeCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgYXJnbjsKLQotICAgICAgLyogT25seSBvbmUgb3Bjb2RlIG9mIHRoaXMgZmxhdm91ciwgdHJ5IGFuZCBndWVzcyB3aGljaCBvcGVyYW5kCi0gICAgICAgICBkaWRuJ3QgbWF0Y2ggKi8KLSAgICAgIGZvciAoYXJnbiA9IDA7IGFyZ24gPCBvcGNvZGUtPm5vcGVyYW5kczsgYXJnbisrKQotCXsKLQkgIHN3aXRjaCAob3Bjb2RlLT5hcmdzLm5pYlthcmduXSkKLQkgICAgewotCSAgICBjYXNlIFJEMTY6Ci0JICAgICAgaWYgKG9wZXJhbmRbYXJnbl0ubW9kZSAhPSBSRDE2KQotCQl7Ci0JCSAgYXNfYmFkIChfKCJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTYgYml0IHJlZ2lzdGVyIikpOwotCQkgIHJldHVybjsKLQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBSUzg6Ci0KLQkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IFJTOCkKLQkJewotCQkgIGFzX2JhZCAoXygic291cmNlIG9wZXJhbmQgbXVzdCBiZSA4IGJpdCByZWdpc3RlciIpKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFCUzE2RFNUOgotCSAgICAgIGlmIChvcGVyYW5kW2FyZ25dLm1vZGUgIT0gQUJTMTZEU1QpCi0JCXsKLQkJICBhc19iYWQgKF8oImRlc3RpbmF0aW9uIG9wZXJhbmQgbXVzdCBiZSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJEODoKLQkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IFJEOCkKLQkJewotCQkgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIikpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0KLQkgICAgY2FzZSBBQlMxNlNSQzoKLQkgICAgICBpZiAob3BlcmFuZFthcmduXS5tb2RlICE9IEFCUzE2U1JDKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyIpKTsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY2l0b24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAgICovCi0KLQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKm9wX3N0YXJ0OwotICBjaGFyICpvcF9lbmQ7Ci0gIHN0cnVjdCBoOF9vcCBvcGVyYW5kWzJdOwotICBzdHJ1Y3QgaDhfb3Bjb2RlICpvcGNvZGU7Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKnByZXZfb3Bjb2RlOwotCi0gIGNoYXIgKmRvdCA9IDA7Ci0gIGNoYXIgYzsKLSAgaW50IHNpemU7Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSBzdHI7Ci0gICAgICAgKm9wX2VuZCAhPSAwICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIGlmICgqb3BfZW5kID09ICcuJykKLQl7Ci0JICBkb3QgPSBvcF9lbmQgKyAxOwotCSAgKm9wX2VuZCA9IDA7Ci0JICBvcF9lbmQgKz0gMjsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgOwotCi0gIGlmIChvcF9lbmQgPT0gb3Bfc3RhcnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0gICAgfQotICBjID0gKm9wX2VuZDsKLQotICAqb3BfZW5kID0gMDsKLQotICBvcGNvZGUgPSAoc3RydWN0IGg4X29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsCi0JCQkJCSAgIG9wX3N0YXJ0KTsKLQotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bmtub3duIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogV2UgdXNlIHRvIHNldCBpbnB1dF9saW5lX3BvaW50ZXIgdG8gdGhlIHJlc3VsdCBvZiBnZXRfb3BlcmFuZHMsCi0gICAgIGJ1dCB0aGF0IGlzIHdyb25nLiAgT3VyIGNhbGxlciBhc3N1bWVzIHdlIGRvbid0IGNoYW5nZSBpdC4gICovCi0KLSAgKHZvaWQpIGdldF9vcGVyYW5kcyAob3Bjb2RlLT5ub3BlcmFuZHMsIG9wX2VuZCwgb3BlcmFuZCk7Ci0gICpvcF9lbmQgPSBjOwotICBwcmV2X29wY29kZSA9IG9wY29kZTsKLQotICBzaXplID0gU047Ci0gIGlmIChkb3QpCi0gICAgewotICAgICAgc3dpdGNoICgqZG90KQotCXsKLQljYXNlICdiJzoKLQkgIHNpemUgPSBTQjsKLQkgIGJyZWFrOwotCi0JY2FzZSAndyc6Ci0JICBzaXplID0gU1c7Ci0JICBicmVhazsKLQotCWNhc2UgJ2wnOgotCSAgc2l6ZSA9IFNMOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQsIHNpemUpOwotCi0gIGlmIChvcGNvZGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLwotICAgICAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDIpOwotCi0gICAgICB3aGVyZVswXSA9IDB4MDsKLSAgICAgIHdoZXJlWzFdID0gMHgwOwotICAgICAgY2xldmVyX21lc3NhZ2UgKHByZXZfb3Bjb2RlLCBvcGVyYW5kKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wY29kZS0+c2l6ZSAmJiBkb3QpCi0gICAgewotICAgICAgaWYgKG9wY29kZS0+c2l6ZSAhPSAqZG90KQotCXsKLQkgIGFzX3dhcm4gKF8oIm1pc21hdGNoIGJldHdlZW4gb3Bjb2RlIHNpemUgYW5kIG9wZXJhbmQgc2l6ZSIpKTsKLQl9Ci0gICAgfQotCi0gIGJ1aWxkX2J5dGVzIChvcGNvZGUsIG9wZXJhbmQpOwotCi19Ci0KLXZvaWQKLXRjX2NyYXdsX3N5bWJvbF9jaGFpbiAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzOwotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIikpOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi10Y19oZWFkZXJzX2hvb2sgKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVyczsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKLX0KLQotLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkgKi8KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gICAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLX0KLQwKLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19hb3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VnLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VnOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHByaW50ZiAoXygiY2FsbCB0byBtZF9jb252ZXJ0X2ZyYWcgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi12YWx1ZVQgCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIHNpemUpCi0gICAgIHNlZ1Qgc2VnOwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pIC0gMSkgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOwotCi19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotCi0gIHN3aXRjaCAoZml4UC0+Znhfc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLQotdm9pZAotdGNfcmVsb2NfbWFuZ2xlIChmaXhfcHRyLCBpbnRyLCBiYXNlKQotICAgICBmaXhTICpmaXhfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludHI7Ci0gICAgIGJmZF92bWEgYmFzZTsKLQotewotICBzeW1ib2xTICpzeW1ib2xfcHRyOwotCi0gIHN5bWJvbF9wdHIgPSBmaXhfcHRyLT5meF9hZGRzeTsKLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgYXR0YWNoZWQgdG8gYSBzeW1ib2wgdGhlbiBpdCdzIG9rCi0gICAgIHRvIG91dHB1dCBpdCAqLwotICBpZiAoZml4X3B0ci0+Znhfcl90eXBlID09IFRDX0NPTlNfUkVMT0MpCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKLQl7Ci0JY2FzZSA0OgotCSAgaW50ci0+cl90eXBlID0gUl9SRUxMT05HOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgaW50ci0+cl90eXBlID0gUl9SRUxXT1JEOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaW50ci0+cl90eXBlID0gUl9SRUxCWVRFOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCi0JfQotCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ci0+cl90eXBlID0gZml4X3B0ci0+Znhfcl90eXBlOwotICAgIH0KLQotICBpbnRyLT5yX3ZhZGRyID0gZml4X3B0ci0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeF9wdHItPmZ4X3doZXJlICsgYmFzZTsKLSAgaW50ci0+cl9vZmZzZXQgPSBmaXhfcHRyLT5meF9vZmZzZXQ7Ci0KLSAgaWYgKHN5bWJvbF9wdHIpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF9wdHItPnN5X251bWJlciAhPSAtMSkKLQlpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpzZWdzeW07Ci0KLQkgIC8qIFRoaXMgY2FzZSBhcmlzZXMgd2hlbiBhIHJlZmVyZW5jZSBpcyBtYWRlIHRvIGAuJy4gICovCi0JICBzZWdzeW0gPSBzZWdfaW5mbyAoU19HRVRfU0VHTUVOVCAoc3ltYm9sX3B0cikpLT5kb3Q7Ci0JICBpZiAoc2Vnc3ltID09IE5VTEwpCi0JICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnRyLT5yX3N5bW5keCA9IHNlZ3N5bS0+c3lfbnVtYmVyOwotCSAgICAgIGludHItPnJfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW1ib2xfcHRyKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotCi0KLX0KLQotLyogZW5kIG9mIHRjLWg4MzAwLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDgzMDAuaCBiL2dhcy9jb25maWcvdGMtaDgzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyYTcwNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWg4MzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtaDgzMDAuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBUQ19IODMwMAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSBhYm9ydCgpOwotCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2g4MzAwCi0jZGVmaW5lIENPRkZfTUFHSUMgKCBTbW9kZSA/IDB4ODMwMiA6IEhtb2RlID8gMHg4MzAxIDogMHg4MzAwKQotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoMSkKLSNkZWZpbmUgSUdOT1JFX05PTlNUQU5EQVJEX0VTQ0FQRVMKLQotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkgOyAvKiBub3QgdXNlZCAqLwotI2RlZmluZSBUQ19SRUxPQ19NQU5HTEUocyxhLGIsYykgdGNfcmVsb2NfbWFuZ2xlKGEsYixjKQotZXh0ZXJuIHZvaWQgdGNfcmVsb2NfbWFuZ2xlCi0gIFBBUkFNUyAoKHN0cnVjdCBmaXggKiwgc3RydWN0IGludGVybmFsX3JlbG9jICosIGJmZF92bWEpKTsKLQotI2RlZmluZSBUQ19DT05TX1JFTE9DICAgICAgICAgIChIbW9kZSA/IFJfUkVMTE9ORzogUl9SRUxXT1JEKQotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJIaXRhY2hpIEg4LzMwMCBHQVMgIgotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0jZGVmaW5lIFJFTE9DXzMyIDEyMzQKLQotZXh0ZXJuIGludCBIbW9kZTsKLWV4dGVybiBpbnQgU21vZGU7Ci0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0vKiBlbmQgb2YgdGMtaDgzMDAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1oODUwMC5jIGIvZ2FzL2NvbmZpZy90Yy1oODUwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGVjM2UyLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaDg1MDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2MzMgKzAsMCBAQAotLyogdGMtaDg1MDAuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgSGl0YWNoaSBIOC81MDAKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICBzYWNAY3lnbnVzLmNvbQotICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jZGVmaW5lIEFTU0VNQkxFUl9UQUJMRQotI2luY2x1ZGUgIm9wY29kZXMvaDg1MDAtb3BjLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiEjIjsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gICAqLwotCi12b2lkIGNvbnMgKCk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiaW50IiwgY29ucywgMn0sCi0gIHsiZGF0YS5iIiwgY29ucywgMX0sCi0gIHsiZGF0YS53IiwgY29ucywgMn0sCi0gIHsiZGF0YS5sIiwgY29ucywgNH0sCi0gIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7ImhlYWRpbmciLCBsaXN0aW5nX3RpdGxlLCAwfSwKLSAgeyJpbXBvcnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsicGFnZSIsIGxpc3RpbmdfZWplY3QsIDB9LAotICB7InByb2dyYW0iLCBzX2lnbm9yZSwgMH0sCi0gIHswLCAwLCAwfQotfTsKLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemU7Ci0KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLSNkZWZpbmUgQyhhLGIpIEVOQ09ERV9SRUxBWChhLGIpCi0jZGVmaW5lIEVOQ09ERV9SRUxBWCh3aGF0LGxlbmd0aCkgKCgod2hhdCkgPDwgMikgKyAobGVuZ3RoKSkKLQotI2RlZmluZSBHRVRfV0hBVCh4KSAoKHg+PjIpKQotCi0jZGVmaW5lIEJZVEVfRElTUCAxCi0jZGVmaW5lIFdPUkRfRElTUCAyCi0jZGVmaW5lIFVOREVGX0JZVEVfRElTUCAwCi0jZGVmaW5lIFVOREVGX1dPUkRfRElTUCAzCi0KLSNkZWZpbmUgQlJBTkNIICAxCi0jZGVmaW5lIFNDQl9GICAgMgotI2RlZmluZSBTQ0JfVFNUIDMKLSNkZWZpbmUgRU5EIDQKLQotI2RlZmluZSBCWVRFX0YgMTI3Ci0jZGVmaW5lIEJZVEVfQiAtMTI2Ci0jZGVmaW5lIFdPUkRfRiAzMjc2NwotI2RlZmluZSBXT1JEX0IgMzI3NjgKLQotcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbQyAoRU5ELCAwKV07Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi0KLS8qCi0gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAotICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMKLSAgKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgY2hhciBwcmV2X2J1ZmZlclsxMDBdOwotICBpbnQgaWR4ID0gMDsKLSAgcmVnaXN0ZXIgcmVsYXhfdHlwZVMgKnRhYmxlOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLSAgcHJldl9idWZmZXJbMF0gPSAwOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlICovCi0gIGZvciAob3Bjb2RlID0gaDg1MDBfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKGlkeCAhPSBvcGNvZGUtPmlkeCkKLQl7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCSAgaWR4Kys7Ci0JfQotICAgIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSByZWxheCB0YWJsZS4gIFdlIHVzZSBhIGxvY2FsIHZhcmlhYmxlIHRvIGF2b2lkCi0gICAgIHdhcm5pbmdzIGFib3V0IG1vZGlmeWluZyBhIHN1cHBvc2VkbHkgY29uc3QgZGF0YSBzdHJ1Y3R1cmUuICAqLwotICB0YWJsZSA9IChyZWxheF90eXBlUyAqKSBtZF9yZWxheF90YWJsZTsKLSAgdGFibGVbQyAoQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfZm9yd2FyZCA9IEJZVEVfRjsKLSAgdGFibGVbQyAoQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDI7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgQllURV9ESVNQKV0ucmx4X21vcmUgPSBDIChCUkFOQ0gsIFdPUkRfRElTUCk7Ci0KLSAgdGFibGVbQyAoQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKLSAgdGFibGVbQyAoQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBXT1JEX0I7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDM7Ci0gIHRhYmxlW0MgKEJSQU5DSCwgV09SRF9ESVNQKV0ucmx4X21vcmUgPSAwOwotCi0gIHRhYmxlW0MgKFNDQl9GLCBCWVRFX0RJU1ApXS5ybHhfZm9yd2FyZCA9IEJZVEVfRjsKLSAgdGFibGVbQyAoU0NCX0YsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoU0NCX0YsIEJZVEVfRElTUCldLnJseF9sZW5ndGggPSAzOwotICB0YWJsZVtDIChTQ0JfRiwgQllURV9ESVNQKV0ucmx4X21vcmUgPSBDIChTQ0JfRiwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChTQ0JfRiwgV09SRF9ESVNQKV0ucmx4X2ZvcndhcmQgPSBXT1JEX0Y7Ci0gIHRhYmxlW0MgKFNDQl9GLCBXT1JEX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBXT1JEX0I7Ci0gIHRhYmxlW0MgKFNDQl9GLCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gODsKLSAgdGFibGVbQyAoU0NCX0YsIFdPUkRfRElTUCldLnJseF9tb3JlID0gMDsKLQotICB0YWJsZVtDIChTQ0JfVFNULCBCWVRFX0RJU1ApXS5ybHhfZm9yd2FyZCA9IEJZVEVfRjsKLSAgdGFibGVbQyAoU0NCX1RTVCwgQllURV9ESVNQKV0ucmx4X2JhY2t3YXJkID0gQllURV9COwotICB0YWJsZVtDIChTQ0JfVFNULCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKLSAgdGFibGVbQyAoU0NCX1RTVCwgQllURV9ESVNQKV0ucmx4X21vcmUgPSBDIChTQ0JfVFNULCBXT1JEX0RJU1ApOwotCi0gIHRhYmxlW0MgKFNDQl9UU1QsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChTQ0JfVFNULCBXT1JEX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBXT1JEX0I7Ci0gIHRhYmxlW0MgKFNDQl9UU1QsIFdPUkRfRElTUCldLnJseF9sZW5ndGggPSAxMDsKLSAgdGFibGVbQyAoU0NCX1RTVCwgV09SRF9ESVNQKV0ucmx4X21vcmUgPSAwOwotCi19Ci0KLXN0YXRpYyBpbnQgcm47CQkJLyogcmVnaXN0ZXIgbnVtYmVyIHVzZWQgYnkgUk4gKi8KLXN0YXRpYyBpbnQgcnM7CQkJLyogcmVnaXN0ZXIgbnVtYmVyIHVzZWQgYnkgUlMgKi8KLXN0YXRpYyBpbnQgcmQ7CQkJLyogcmVnaXN0ZXIgbnVtYmVyIHVzZWQgYnkgUkQgKi8KLXN0YXRpYyBpbnQgY3JiOwkJCS8qIGJ5dGUgc2l6ZSBjciAqLwotc3RhdGljIGludCBjcnc7CQkJLyogd29yZCBzaXplZCBjciAqLwotc3RhdGljIGludCBjcjsJCQkvKiB1bmtub3duIHNpemUgY3IgKi8KLQotc3RhdGljIGV4cHJlc3Npb25TIGRpc3BsYWNlbWVudDsvKiBkaXNwbGFjZW1lbnQgZXhwcmVzc2lvbiAqLwotc3RhdGljIGludCBkaXNwbGFjZW1lbnRfc2l6ZTsJLyogYW5kIHNpemUgaWYgZ2l2ZW4gKi8KLQotc3RhdGljIGludCBpbW1lZGlhdGVfaW5wYWdlOwotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogaW1tZWRpYXRlIGV4cHJlc3Npb24gKi8KLXN0YXRpYyBpbnQgaW1tZWRpYXRlX3NpemU7CS8qIGFuZCBzaXplIGlmIGdpdmVuICovCi0KLXN0YXRpYyBleHByZXNzaW9uUyBhYnNvbHV0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotc3RhdGljIGludCBhYnNvbHV0ZV9zaXplOwkvKiBhbmQgc2l6ZSBpZiBnaXZlbiAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBpbnQgdHlwZTsKLSAgaW50IHJlZzsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgcGFnZTsKLX0KLQotaDg1MDBfb3BlcmFuZF9pbmZvOwotCi0vKiB0cnkgYW5kIHBhcnNlIGEgcmVnIG5hbWUsIHJldHVybnMgbnVtYmVyIG9mIGNoYXJzIGNvbnN1bWVkICovCi1zdGF0aWMgaW50Ci1wYXJzZV9yZWcgKHNyYywgbW9kZSwgcmVnKQotICAgICBjaGFyICpzcmM7Ci0gICAgIGludCAqbW9kZTsKLSAgICAgaW50ICpyZWc7Ci17Ci0gIGNoYXIgKmVuZDsKLSAgaW50IGxlbjsKLQotICAvKiBDcmliYmVkIGZyb20gZ2V0X3N5bWJvbF9lbmQoKS4gICovCi0gIGlmICghaXNfbmFtZV9iZWdpbm5lciAoKnNyYykgfHwgKnNyYyA9PSAnXDAwMScpCi0gICAgcmV0dXJuIDA7Ci0gIGVuZCA9IHNyYysxOwotICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lICgqZW5kKSB8fCAqZW5kID09ICdcMDAxJykKLSAgICBlbmQrKzsKLSAgbGVuID0gZW5kIC0gc3JjOwotCi0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMV0gPj0gJzAnICYmIHNyY1sxXSA8PSAnNycpCi0JewotCSAgKm1vZGUgPSBSTjsKLQkgICpyZWcgPSAoc3JjWzFdIC0gJzAnKTsKLQkgIHJldHVybiBsZW47Ci0JfQotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAncycgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IFJOOwotICAgICAgKnJlZyA9IDc7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAzICYmIHNyY1swXSA9PSAnYycgJiYgc3JjWzFdID09ICdjJyAmJiBzcmNbMl0gPT0gJ3InKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JCOwotICAgICAgKnJlZyA9IDE7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAncycgJiYgc3JjWzFdID09ICdyJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSVzsKLSAgICAgICpyZWcgPSAwOwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ2InICYmIHNyY1sxXSA9PSAncicpCi0gICAgewotICAgICAgKm1vZGUgPSBDUkI7Ci0gICAgICAqcmVnID0gMzsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdlJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gQ1JCOwotICAgICAgKnJlZyA9IDQ7Ci0gICAgICByZXR1cm4gbGVuOwotICAgIH0KLSAgaWYgKGxlbiA9PSAyICYmIHNyY1swXSA9PSAnZCcgJiYgc3JjWzFdID09ICdwJykKLSAgICB7Ci0gICAgICAqbW9kZSA9IENSQjsKLSAgICAgICpyZWcgPSA1OwotICAgICAgcmV0dXJuIGxlbjsKLSAgICB9Ci0gIGlmIChsZW4gPT0gMiAmJiBzcmNbMF0gPT0gJ3QnICYmIHNyY1sxXSA9PSAncCcpCi0gICAgewotICAgICAgKm1vZGUgPSBDUkI7Ci0gICAgICAqcmVnID0gNzsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICBpZiAobGVuID09IDIgJiYgc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgICptb2RlID0gUk47Ci0gICAgICAqcmVnID0gNjsKLSAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljCi1jaGFyICoKLXBhcnNlX2V4cCAocywgb3AsIHBhZ2UpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGV4cHJlc3Npb25TICpvcDsKLSAgICAgaW50ICpwYWdlOwotewotICBjaGFyICpzYXZlOwotICBjaGFyICpuZXc7Ci0KLSAgc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICAqcGFnZSA9IDA7Ci0gIGlmIChzWzBdID09ICclJykKLSAgICB7Ci0gICAgICBpZiAoc1sxXSA9PSAncCcgJiYgc1syXSA9PSAnYScgJiYgc1szXSA9PSAnZycgJiYgc1s0XSA9PSAnZScpCi0JewotCSAgcyArPSA1OwotCSAgKnBhZ2UgPSAncCc7Ci0JfQotICAgICAgaWYgKHNbMV0gPT0gJ2gnICYmIHNbMl0gPT0gJ2knICYmIHNbM10gPT0gJzEnICYmIHNbNF0gPT0gJzYnKQotCXsKLQkgIHMgKz0gNTsKLQkgICpwYWdlID0gJ2gnOwotCX0KLSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ28nICYmIHNbMl0gPT0gJ2YnICYmIHNbM10gPT0gJ2YnKQotCXsKLQkgIHMgKz0gNDsKLQkgICpwYWdlID0gJ28nOwotCX0KLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICBleHByZXNzaW9uIChvcCk7Ci0gIGlmIChvcC0+WF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi10eXBlZGVmIGVudW0KLSAgewotICAgIGV4cF9zaWduZWQsIGV4cF91bnNpZ25lZCwgZXhwX3NhbmR1Ci0gIH0gc2lnbl90eXBlOwotCi0KLXN0YXRpYyBjaGFyICoKLXNraXBfY29sb250aGluZyAoc2lnbiwgcHRyLCBleHAsIGRlZiwgc2l6ZTgsIHNpemUxNiwgc2l6ZTI0KQotICAgICBzaWduX3R5cGUgc2lnbjsKLSAgICAgY2hhciAqcHRyOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKmV4cDsKLSAgICAgaW50IGRlZjsKLSAgICAgaW50IHNpemU4OwotICAgICBpbnQgc2l6ZTE2OwotICAgICBpbnQgc2l6ZTI0OwotewotICBwdHIgPSBwYXJzZV9leHAgKHB0ciwgJmV4cC0+ZXhwLCAmZXhwLT5wYWdlKTsKLSAgaWYgKCpwdHIgPT0gJzonKQotICAgIHsKLSAgICAgIHB0cisrOwotICAgICAgaWYgKCpwdHIgPT0gJzgnKQotCXsKLQkgIHB0cisrOwotCSAgZXhwLT50eXBlID0gc2l6ZTg7Ci0JfQotICAgICAgZWxzZSBpZiAocHRyWzBdID09ICcxJyAmIHB0clsxXSA9PSAnNicpCi0JewotCSAgcHRyICs9IDI7Ci0JICBleHAtPnR5cGUgPSBzaXplMTY7Ci0JfQotICAgICAgZWxzZSBpZiAocHRyWzBdID09ICcyJyAmIHB0clsxXSA9PSAnNCcpCi0JewotCSAgaWYgKCFzaXplMjQpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIjoyNCBub3QgdmFsaWQgZm9yIHRoaXMgb3Bjb2RlIikpOwotCSAgICB9Ci0JICBwdHIgKz0gMjsKLQkgIGV4cC0+dHlwZSA9IHNpemUyNDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJleHBlY3QgOjgsOjE2IG9yIDoyNCIpKTsKLQkgIGV4cC0+dHlwZSA9IHNpemUxNjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGV4cC0+cGFnZSA9PSAncCcpCi0JewotCSAgZXhwLT50eXBlID0gSU1NODsKLQl9Ci0gICAgICBlbHNlIGlmIChleHAtPnBhZ2UgPT0gJ2gnKQotCXsKLQkgIGV4cC0+dHlwZSA9IElNTTE2OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBMZXQncyB3b3JrIG91dCB0aGUgc2l6ZSBmcm9tIHRoZSBjb250ZXh0ICovCi0JICBpbnQgbiA9IGV4cC0+ZXhwLlhfYWRkX251bWJlcjsKLQkgIGlmIChzaXplOAotCSAgICAgICYmIGV4cC0+ZXhwLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICYmICgoc2lnbiA9PSBleHBfc2lnbmVkICYmIChuID49IC0xMjggJiYgbiA8PSAxMjcpKQotCQkgIHx8IChzaWduID09IGV4cF91bnNpZ25lZCAmJiAobiA+PSAwICYmIChuIDw9IDI1NSkpKQotCQkgIHx8IChzaWduID09IGV4cF9zYW5kdSAmJiAobiA+PSAtMTI4ICYmIChuIDw9IDI1NSkpKSkpCi0JICAgIHsKLQkgICAgICBleHAtPnR5cGUgPSBzaXplODsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwLT50eXBlID0gZGVmOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHB0cjsKLX0KLQotc3RhdGljIGludAotcGFyc2VfcmVnbGlzdCAoc3JjLCBvcCkKLSAgICAgY2hhciAqc3JjOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKm9wOwotewotICBpbnQgbW9kZTsKLSAgaW50IHJuOwotICBpbnQgbWFzayA9IDA7Ci0gIGludCBybTsKLSAgaW50IGlkeCA9IDE7CQkJLyogc2tpcCAoICovCi0KLSAgd2hpbGUgKHNyY1tpZHhdICYmIHNyY1tpZHhdICE9ICcpJykKLSAgICB7Ci0gICAgICBpbnQgZG9uZSA9IHBhcnNlX3JlZyAoc3JjICsgaWR4LCAmbW9kZSwgJnJuKTsKLQotICAgICAgaWYgKGRvbmUpCi0JewotCSAgaWR4ICs9IGRvbmU7Ci0JICBtYXNrIHw9IDEgPDwgcm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIHJlZyBsaXN0IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKHNyY1tpZHhdID09ICctJykKLQl7Ci0JICBpZHgrKzsKLQkgIGRvbmUgPSBwYXJzZV9yZWcgKHNyYyArIGlkeCwgJm1vZGUsICZybSk7Ci0JICBpZiAoZG9uZSkKLQkgICAgewotCSAgICAgIGlkeCArPSBkb25lOwotCSAgICAgIHdoaWxlIChybiA8PSBybSkKLQkJewotCQkgIG1hc2sgfD0gMSA8PCBybjsKLQkJICBybisrOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBmaW5hbCByZWdpc3RlciBpbiByYW5nZSIpKTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzcmNbaWR4XSA9PSAnLCcpCi0JaWR4Kys7Ci0gICAgfQotICBpZHgrKzsKLSAgb3AtPmV4cC5YX2FkZF9zeW1ib2wgPSAwOwotICBvcC0+ZXhwLlhfb3Bfc3ltYm9sID0gMDsKLSAgb3AtPmV4cC5YX2FkZF9udW1iZXIgPSBtYXNrOwotICBvcC0+ZXhwLlhfb3AgPSBPX2NvbnN0YW50OwotICBvcC0+ZXhwLlhfdW5zaWduZWQgPSAxOwotICBvcC0+dHlwZSA9IElNTTg7Ci0gIHJldHVybiBpZHg7Ci0KLX0KLQotLyogVGhlIG1hbnkgZm9ybXMgb2Ygb3BlcmFuZDoKLQotICAgUm4JCQlSZWdpc3RlciBkaXJlY3QKLSAgIEBSbgkJCVJlZ2lzdGVyIGluZGlyZWN0Ci0gICBAKGRpc3BbOnNpemVdLCBSbikJUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLSAgIEBSbisKLSAgIEAtUm4KLSAgIEBhYVs6c2l6ZV0JCWFic29sdXRlCi0gICAjeHhbOnNpemVdCQlpbW1lZGlhdGUgZGF0YQotCi0gICAqLwotCi1zdGF0aWMgdm9pZAotZ2V0X29wZXJhbmQgKHB0ciwgb3AsIGlzcGFnZSkKLSAgICAgY2hhciAqKnB0cjsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcDsKLSAgICAgY2hhciBpc3BhZ2U7Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCBtb2RlOwotICB1bnNpZ25lZCBpbnQgbnVtOwotICB1bnNpZ25lZCBpbnQgbGVuOwotICBvcC0+cGFnZSA9IDA7Ci0gIGlmIChzcmNbMF0gPT0gJygnICYmIHNyY1sxXSA9PSAncicpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIHJlZ2lzdGVyIGxpc3QgKi8KLSAgICAgICpwdHIgPSBzcmMgKyBwYXJzZV9yZWdsaXN0IChzcmMsIG9wKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZvcC0+dHlwZSwgJm9wLT5yZWcpOwotCi0gIGlmIChsZW4pCi0gICAgewotICAgICAgKnB0ciA9IHNyYyArIGxlbjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCpzcmMgPT0gJ0AnKQotICAgIHsKLSAgICAgIHNyYysrOwotICAgICAgaWYgKCpzcmMgPT0gJy0nKQotCXsKLQkgIHNyYysrOwotCSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmbnVtKTsKLQkgIGlmIChsZW4gPT0gMCkKLQkgICAgewotCSAgICAgIC8qIE9vcHMsIG5vdCBhIHJlZyBhZnRlciBhbGwsIG11c3QgYmUgb3JkaW5hcnkgZXhwICovCi0JICAgICAgc3JjLS07Ci0JICAgICAgLyogbXVzdCBiZSBhIHN5bWJvbCAqLwotCSAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKGV4cF91bnNpZ25lZCwgc3JjLAotCQkJCSAgICAgIG9wLCBBQlMxNiwgQUJTOCwgQUJTMTYsIEFCUzI0KTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgb3AtPnR5cGUgPSBSTkRFQzsKLQkgIG9wLT5yZWcgPSBudW07Ci0JICAqcHRyID0gc3JjICsgbGVuOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmICgqc3JjID09ICcoJykKLQl7Ci0JICAvKiBEaXNwICovCi0JICBzcmMrKzsKLQotCSAgc3JjID0gc2tpcF9jb2xvbnRoaW5nIChleHBfc2lnbmVkLCBzcmMsIAotCQkJCSBvcCwgUk5JTkRfRDE2LCBSTklORF9EOCwgUk5JTkRfRDE2LCAwKTsKLQotCSAgaWYgKCpzcmMgIT0gJywnKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgUm4pIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgc3JjKys7Ci0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICZvcC0+cmVnKTsKLQkgIGlmIChsZW4gPT0gMCB8fCBtb2RlICE9IFJOKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCBAKGV4cCwgUm4pIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgc3JjICs9IGxlbjsKLQkgIGlmICgqc3JjICE9ICcpJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgQChleHAsIFJuKSIpKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgICpwdHIgPSBzcmMgKyAxOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm51bSk7Ci0KLSAgICAgIGlmIChsZW4pCi0JewotCSAgc3JjICs9IGxlbjsKLQkgIGlmICgqc3JjID09ICcrJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIGlmIChtb2RlICE9IFJOKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJAUm4rIG5lZWRzIHdvcmQgcmVnaXN0ZXIiKSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgb3AtPnR5cGUgPSBSTklOQzsKLQkgICAgICBvcC0+cmVnID0gbnVtOwotCSAgICAgICpwdHIgPSBzcmM7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBpZiAobW9kZSAhPSBSTikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiQFJuIG5lZWRzIHdvcmQgcmVnaXN0ZXIiKSk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBvcC0+dHlwZSA9IFJOSU5EOwotCSAgb3AtPnJlZyA9IG51bTsKLQkgICpwdHIgPSBzcmM7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIG11c3QgYmUgYSBzeW1ib2wgKi8KLQkgICpwdHIgPQotCSAgICBza2lwX2NvbG9udGhpbmcgKGV4cF91bnNpZ25lZCwgc3JjLCBvcCwKLQkJCSAgICAgaXNwYWdlID8gQUJTMjQgOiBBQlMxNiwgQUJTOCwgQUJTMTYsIEFCUzI0KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmICgqc3JjID09ICcjJykKLSAgICB7Ci0gICAgICBzcmMrKzsKLSAgICAgICpwdHIgPSBza2lwX2NvbG9udGhpbmcgKGV4cF9zYW5kdSwgc3JjLCBvcCwgSU1NMTYsIElNTTgsIElNTTE2LCBBQlMyNCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKnB0ciA9IHNraXBfY29sb250aGluZyAoZXhwX3NpZ25lZCwgc3JjLCBvcCwKLQkJCSAgICAgIGlzcGFnZSA/IEFCUzI0IDogUENSRUw4LCBQQ1JFTDgsIFBDUkVMMTYsIEFCUzI0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYwotY2hhciAqCi1nZXRfb3BlcmFuZHMgKGluZm8sIGFyZ3MsIG9wZXJhbmQpCi0gICAgIGg4NTAwX29wY29kZV9pbmZvICppbmZvOwotICAgICBjaGFyICphcmdzOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKm9wZXJhbmQ7Ci0KLXsKLSAgY2hhciAqcHRyID0gYXJnczsKLQotICBzd2l0Y2ggKGluZm8tPm5hcmdzKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBvcGVyYW5kWzBdLnR5cGUgPSAwOwotICAgICAgb3BlcmFuZFsxXS50eXBlID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIGluZm8tPm5hbWVbMF0gPT0gJ3AnKTsKLSAgICAgIG9wZXJhbmRbMV0udHlwZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMjoKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogUGFzc2VkIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygb3Bjb2RlcyB3aGljaCB1c2UgZGlmZmVyZW50Ci0gICBhZGRyZXNzaW5nIG1vZGVzLCByZXR1cm4gdGhlIG9wY29kZSB3aGljaCBtYXRjaGVzIHRoZSBvcGNvZGVzCi0gICBwcm92aWRlZAotICAgKi8KLQotaW50IHBjcmVsODsJCQkvKiBTZXQgd2hlbiB3ZSd2ZSBzZWVuIGEgcGNyZWwgb3BlcmFuZCAqLwotCi1zdGF0aWMKLWg4NTAwX29wY29kZV9pbmZvICoKLWdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kcykKLSAgICAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgICAgaDg1MDBfb3BlcmFuZF9pbmZvICpvcGVyYW5kczsKLXsKLSAgaDg1MDBfb3Bjb2RlX2luZm8gKnRoaXNfdHJ5ID0gb3Bjb2RlOwotICBpbnQgZm91bmQgPSAwOwotICB1bnNpZ25lZCBpbnQgbm9wZXJhbmRzID0gb3Bjb2RlLT5uYXJnczsKLQotICB1bnNpZ25lZCBpbnQgdGhpc19pbmRleCA9IG9wY29kZS0+aWR4OwotCi0gIHdoaWxlICh0aGlzX2luZGV4ID09IG9wY29kZS0+aWR4ICYmICFmb3VuZCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKLQotICAgICAgLyogbG9vayBhdCBib3RoIG9wZXJhbmRzIG5lZWRlZCBieSB0aGUgb3Bjb2RlcyBhbmQgcHJvdmlkZWQgYnkKLSAgICAgICB0aGUgdXNlciovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgbm9wZXJhbmRzOyBpKyspCi0JewotCSAgaDg1MDBfb3BlcmFuZF9pbmZvICp1c2VyID0gb3BlcmFuZHMgKyBpOwotCi0JICBzd2l0Y2ggKHRoaXNfdHJ5LT5hcmdfdHlwZVtpXSkKLQkgICAgewotCSAgICBjYXNlIEZQSU5EX0Q4OgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyAoZGlzcDo4LGZwKSAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOSU5EX0Q4ICYmIHVzZXItPnJlZyA9PSA2KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkRfRDE2OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOSU5EX0QxNikKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICByZCA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EX0Q4OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOSU5EX0Q4KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIHJkID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkRfRDE2OgotCSAgICBjYXNlIFJOSU5EX0Q4OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IHRoaXNfdHJ5LT5hcmdfdHlwZVtpXSkKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBybiA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgU1BERUM6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk5ERUMgJiYgdXNlci0+cmVnID09IDcpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNQSU5DOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOSU5DICYmIHVzZXItPnJlZyA9PSA3KQotCQl7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMxNjoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBBQlMxNikKLQkJewotCQkgIGFic29sdXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBBQlM4KQotCQl7Ci0JCSAgYWJzb2x1dGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlMyNDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBBQlMyNCkKLQkJewotCQkgIGFic29sdXRlID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDUkI6Ci0JICAgICAgaWYgKCh1c2VyLT50eXBlID09IENSQiB8fCB1c2VyLT50eXBlID09IENSKSAmJiB1c2VyLT5yZWcgIT0gMCkKLQkJewotCQkgIGNyYiA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSVzoKLQkgICAgICBpZiAoKHVzZXItPnR5cGUgPT0gQ1JXIHx8IHVzZXItPnR5cGUgPT0gQ1IpICYmIHVzZXItPnJlZyA9PSAwKQotCQl7Ci0JCSAgY3J3ID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRElTUDE2OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IERJU1AxNikKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1A4OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IERJU1A4KQotCQl7Ci0JCSAgZGlzcGxhY2VtZW50ID0gdXNlci0+ZXhwOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRlA6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk4gJiYgdXNlci0+cmVnID09IDYpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMMTY6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUENSRUwxNikKLQkJewotCQkgIGRpc3BsYWNlbWVudCA9IHVzZXItPmV4cDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMODoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBQQ1JFTDgpCi0JCXsKLQkJICBkaXNwbGFjZW1lbnQgPSB1c2VyLT5leHA7Ci0JCSAgcGNyZWw4ID0gMTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgSU1NMTY6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gSU1NMTYKLQkJICB8fCB1c2VyLT50eXBlID09IElNTTgpCi0JCXsKLQkJICBpbW1lZGlhdGVfaW5wYWdlID0gdXNlci0+cGFnZTsKLQkJICBpbW1lZGlhdGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTElTVDoKLQkgICAgY2FzZSBJTU04OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IElNTTgpCi0JCXsKLQkJICBpbW1lZGlhdGVfaW5wYWdlID0gdXNlci0+cGFnZTsKLQkJICBpbW1lZGlhdGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU00OgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IElNTTgpCi0JCXsKLQkJICBpbW1lZGlhdGVfaW5wYWdlID0gdXNlci0+cGFnZTsKLQkJICBpbW1lZGlhdGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBRSU06Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gSU1NOAotCQkgICYmIHVzZXItPmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkJICAmJgotCQkgICh1c2VyLT5leHAuWF9hZGRfbnVtYmVyID09IC0yCi0JCSAgIHx8IHVzZXItPmV4cC5YX2FkZF9udW1iZXIgPT0gLTEKLQkJICAgfHwgdXNlci0+ZXhwLlhfYWRkX251bWJlciA9PSAxCi0JCSAgIHx8IHVzZXItPmV4cC5YX2FkZF9udW1iZXIgPT0gMikpCi0JCXsKLQkJICBpbW1lZGlhdGVfaW5wYWdlID0gdXNlci0+cGFnZTsKLQkJICBpbW1lZGlhdGUgPSB1c2VyLT5leHA7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTikKLQkJewotCQkgIHJkID0gdXNlci0+cmVnOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUlM6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gUk4pCi0JCXsKLQkJICBycyA9IHVzZXItPnJlZzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EOgotCSAgICAgIGlmICh1c2VyLT50eXBlID09IFJOSU5EKQotCQl7Ci0JCSAgcmQgPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0KLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5DOgotCSAgICBjYXNlIFJOSU5EOgotCSAgICBjYXNlIFJOREVDOgotCSAgICBjYXNlIFJOOgotCi0JICAgICAgaWYgKHVzZXItPnR5cGUgPT0gdGhpc190cnktPmFyZ190eXBlW2ldKQotCQl7Ci0JCSAgcm4gPSB1c2VyLT5yZWc7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUDoKLQkgICAgICBpZiAodXNlci0+dHlwZSA9PSBSTiAmJiB1c2VyLT5yZWcgPT0gNykKLQkJewotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmIChfKCJ1bmhhbmRsZWQgJWRcbiIpLCB0aGlzX3RyeS0+YXJnX3R5cGVbaV0pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGdldCBoZXJlIHRoaXMgZGlkbid0IHdvcmsgb3V0ICovCi0JICBnb3RvIGZhaWw7Ci0JfQotICAgICAgZm91bmQgPSAxOwotICAgIGZhaWw6OwotCi0gICAgfQotCi0gIGlmIChmb3VuZCkKLSAgICByZXR1cm4gdGhpc190cnk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotaW50Ci1jaGVjayAob3BlcmFuZCwgbG93LCBoaWdoKQotICAgICBleHByZXNzaW9uUyAqb3BlcmFuZDsKLSAgICAgaW50IGxvdzsKLSAgICAgaW50IGhpZ2g7Ci17Ci0gIGlmIChvcGVyYW5kLT5YX29wICE9IE9fY29uc3RhbnQKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA8IGxvdwotICAgICAgfHwgb3BlcmFuZC0+WF9hZGRfbnVtYmVyID4gaGlnaCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQiKSwgbG93LCBoaWdoKTsKLSAgICB9Ci0gIHJldHVybiBvcGVyYW5kLT5YX2FkZF9udW1iZXI7Ci19Ci0KLXN0YXRpYwotdm9pZAotaW5zZXJ0IChvdXRwdXQsIGluZGV4LCBleHAsIHJlbG9jLCBwY3JlbCkKLSAgICAgY2hhciAqb3V0cHV0OwotICAgICBpbnQgaW5kZXg7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCByZWxvYzsKLSAgICAgaW50IHBjcmVsOwotewotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JICAgICAgIG91dHB1dCAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgaW5kZXgsCi0JICAgICAgIDQsCSAgICAgICAJLyogYWx3YXlzIHNheSBzaXplIGlzIDQsIGJ1dCB3ZSBrbm93IGJldHRlciAqLwotCSAgICAgICBleHAsCi0JICAgICAgIHBjcmVsLAotCSAgICAgICByZWxvYyk7Ci19Ci0KLXZvaWQKLWJ1aWxkX3JlbGF4YWJsZV9pbnN0cnVjdGlvbiAob3Bjb2RlLCBvcGVyYW5kKQotICAgICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKm9wZXJhbmQ7Ci17Ci0gIC8qIEFsbCByZWxheGFibGUgaW5zdHJ1Y3Rpb25zIHN0YXJ0IGxpZmUgYXMgdHdvIGJ5dGVzIGJ1dCBjYW4gYmVjb21lCi0gICAgIHRocmVlIGJ5dGVzIGxvbmcgaWYgYSBsb25lbHkgYnJhbmNoIGFuZCB1cCB0byA5IGJ5dGVzIGlmIGxvbmcgc2NiCi0gICAgICovCi0gIGNoYXIgKnA7Ci0gIGludCBsZW47Ci0gIGludCB0eXBlOwotCi0gIGlmIChvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzID09IDB4MDEpCi0gICAgewotICAgICAgdHlwZSA9IFNDQl9GOwotICAgIH0KLSAgZWxzZSBpZiAob3Bjb2RlLT5ieXRlc1swXS5jb250ZW50cyA9PSAweDA2Ci0JICAgfHwgb3Bjb2RlLT5ieXRlc1swXS5jb250ZW50cyA9PSAweDA3KQotICAgIHsKLSAgICAgIHR5cGUgPSBTQ0JfVFNUOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHR5cGUgPSBCUkFOQ0g7Ci0gICAgfQotCi0gIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCW1kX3JlbGF4X3RhYmxlW0MgKHR5cGUsIFdPUkRfRElTUCldLnJseF9sZW5ndGgsCi0JCWxlbiA9IG1kX3JlbGF4X3RhYmxlW0MgKHR5cGUsIEJZVEVfRElTUCldLnJseF9sZW5ndGgsCi0JCUMgKHR5cGUsIFVOREVGX0JZVEVfRElTUCksCi0JCWRpc3BsYWNlbWVudC5YX2FkZF9zeW1ib2wsCi0JCWRpc3BsYWNlbWVudC5YX2FkZF9udW1iZXIsCi0JCTApOwotCi0gIHBbMF0gPSBvcGNvZGUtPmJ5dGVzWzBdLmNvbnRlbnRzOwotICBpZiAodHlwZSAhPSBCUkFOQ0gpCi0gICAgewotICAgICAgcFsxXSA9IG9wY29kZS0+Ynl0ZXNbMV0uY29udGVudHMgfCByczsKLSAgICB9Ci19Ci0KLS8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCi0gKi8KLXN0YXRpYyB2b2lkCi1idWlsZF9ieXRlcyAob3Bjb2RlLCBvcGVyYW5kKQotICAgICBoODUwMF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBoODUwMF9vcGVyYW5kX2luZm8gKm9wZXJhbmQ7Ci0KLXsKLSAgaW50IGluZGV4OwotCi0gIGlmIChwY3JlbDgpCi0gICAgewotICAgICAgcGNyZWw4ID0gMDsKLSAgICAgIGJ1aWxkX3JlbGF4YWJsZV9pbnN0cnVjdGlvbiAob3Bjb2RlLCBvcGVyYW5kKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyICpvdXRwdXQgPSBmcmFnX21vcmUgKG9wY29kZS0+bGVuZ3RoKTsKLQotICAgICAgbWVtc2V0IChvdXRwdXQsIDAsIG9wY29kZS0+bGVuZ3RoKTsKLSAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG9wY29kZS0+bGVuZ3RoOyBpbmRleCsrKQotCXsKLQkgIG91dHB1dFtpbmRleF0gPSBvcGNvZGUtPmJ5dGVzW2luZGV4XS5jb250ZW50czsKLQotCSAgc3dpdGNoIChvcGNvZGUtPmJ5dGVzW2luZGV4XS5pbnNlcnQpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBwcmludGYgKF8oImZhaWxlZCBmb3IgJWRcbiIpLCBvcGNvZGUtPmJ5dGVzW2luZGV4XS5pbnNlcnQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDA6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk46Ci0JICAgICAgb3V0cHV0W2luZGV4XSB8PSBybjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRDoKLQkgICAgY2FzZSBSRElORDoKLQkgICAgICAKLQkgICAgICBvdXRwdXRbaW5kZXhdIHw9IHJkOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJTOgotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gcnM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRElTUDE2OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmRpc3BsYWNlbWVudCwgUl9IODUwMF9JTU0xNiwgMCk7Ci0JICAgICAgaW5kZXgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQODoKLQkgICAgY2FzZSBGUElORF9EODoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZkaXNwbGFjZW1lbnQsIFJfSDg1MDBfSU1NOCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBJTU0xNjoKLQkgICAgICB7Ci0JCWludCBwOwotCQlzd2l0Y2ggKGltbWVkaWF0ZV9pbnBhZ2UpIHsKLQkJY2FzZSAncCc6Ci0JCSAgcCA9IFJfSDg1MDBfSElHSDE2OwotCQkgIGJyZWFrOwotCQljYXNlICdoJzoJCQotCQkgIHAgPSBSX0g4NTAwX0hJR0gxNjsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBwID0gUl9IODUwMF9JTU0xNjsKLQkJICBicmVhazsKLQkJfQotCQkKLQkJaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmaW1tZWRpYXRlLHAsIDApOwotCSAgICAgIH0KLQkJCi0JICAgICAgaW5kZXgrKzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTElTVDoKLQkgICAgY2FzZSBJTU04OgotCSAgICAgIGlmIChpbW1lZGlhdGVfaW5wYWdlKQotCQl7Ci0JCSAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmaW1tZWRpYXRlLCBSX0g4NTAwX0hJR0g4LCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmltbWVkaWF0ZSwgUl9IODUwMF9JTU04LCAwKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMMTY6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmZGlzcGxhY2VtZW50LCBSX0g4NTAwX1BDUkVMMTYsIDEpOwotCSAgICAgIGluZGV4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUw4OgotCSAgICAgIGluc2VydCAob3V0cHV0LCBpbmRleCwgJmRpc3BsYWNlbWVudCwgUl9IODUwMF9QQ1JFTDgsIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTTQ6Ci0JICAgICAgb3V0cHV0W2luZGV4XSB8PSBjaGVjayAoJmltbWVkaWF0ZSwgMCwgMTUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENSOgotCi0JICAgICAgb3V0cHV0W2luZGV4XSB8PSBjcjsKLQkgICAgICBpZiAoY3IgPT0gMCkKLQkJewotCQkgIG91dHB1dFswXSB8PSAweDg7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBvdXRwdXRbMF0gJj0gfjB4ODsKLQkJfQotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBDUkI6Ci0JICAgICAgb3V0cHV0W2luZGV4XSB8PSBjcmI7Ci0JICAgICAgb3V0cHV0WzBdICY9IH4weDg7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ1JXOgotCSAgICAgIG91dHB1dFtpbmRleF0gfD0gY3J3OwotCSAgICAgIG91dHB1dFswXSB8PSAweDg7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMjQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmYWJzb2x1dGUsIFJfSDg1MDBfSU1NMjQsIDApOwotCSAgICAgIGluZGV4ICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMTY6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIGluZGV4LCAmYWJzb2x1dGUsIFJfSDg1MDBfSU1NMTYsIDApOwotCSAgICAgIGluZGV4Kys7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTODoKLQkgICAgICBpbnNlcnQgKG91dHB1dCwgaW5kZXgsICZhYnNvbHV0ZSwgUl9IODUwMF9JTU04LCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBRSU06Ci0JICAgICAgc3dpdGNoIChpbW1lZGlhdGUuWF9hZGRfbnVtYmVyKQotCQl7Ci0JCWNhc2UgLTI6Ci0JCSAgb3V0cHV0W2luZGV4XSB8PSAweDU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgLTE6Ci0JCSAgb3V0cHV0W2luZGV4XSB8PSAweDQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMToKLQkJICBvdXRwdXRbaW5kZXhdIHw9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICBvdXRwdXRbaW5kZXhdIHw9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIFNUUiBwb2ludHMgdG8gYQotICAgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzIGZ1bmNpdG9uIGlzIHN1cHBvc2VkIHRvIGVtaXQKLSAgIHRoZSBmcmFncy9ieXRlcyBpdCBhc3NlbWJsZXMgdG8uCi0gICAqLwotCi12b2lkCi1ERUZVTiAobWRfYXNzZW1ibGUsIChzdHIpLAotICAgICAgIGNoYXIgKnN0cikKLXsKLSAgY2hhciAqb3Bfc3RhcnQ7Ci0gIGNoYXIgKm9wX2VuZDsKLSAgaDg1MDBfb3BlcmFuZF9pbmZvIG9wZXJhbmRbMl07Ci0gIGg4NTAwX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gIGg4NTAwX29wY29kZV9pbmZvICpwcmV2X29wY29kZTsKLSAgY2hhciBuYW1lWzExXTsKLQotICBpbnQgbmxlbiA9IDA7Ci0KLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSBzdHI7Ci0gICAgICAgKm9wX2VuZCAmJgotICAgICAgICFpc19lbmRfb2ZfbGluZVsqb3BfZW5kXSAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgICBpZiAoCQkJLyoqb3BfZW5kICE9ICcuJwotCSAgJiYgKm9wX2VuZCAhPSAnOicKLQkgICAJICAgCSAgIAkgICYmICovIG5sZW4gPCAxMCkKLQl7Ci0JICBuYW1lW25sZW4rK10gPSAqb3BfZW5kOwotCX0KLSAgICB9Ci0gIG5hbWVbbmxlbl0gPSAwOwotCi0gIGlmIChvcF9lbmQgPT0gb3Bfc3RhcnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0gICAgfQotCi0gIG9wY29kZSA9IChoODUwMF9vcGNvZGVfaW5mbyAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG5hbWUpOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBnZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLCBvcGVyYW5kKTsKLSAgcHJldl9vcGNvZGUgPSBvcGNvZGU7Ci0KLSAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOwotCi0gIGlmIChvcGNvZGUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBDb3VsZG4ndCBmaW5kIGFuIG9wY29kZSB3aGljaCBtYXRjaGVkIHRoZSBvcGVyYW5kcyAqLwotICAgICAgY2hhciAqd2hlcmUgPSBmcmFnX21vcmUgKDIpOwotCi0gICAgICB3aGVyZVswXSA9IDB4MDsKLSAgICAgIHdoZXJlWzFdID0gMHgwOwotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIG9wZXJhbmRzIGZvciBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJ1aWxkX2J5dGVzIChvcGNvZGUsIG9wZXJhbmQpOwotCi19Ci0KLXZvaWQKLURFRlVOICh0Y19jcmF3bF9zeW1ib2xfY2hhaW4sIChoZWFkZXJzKSwKLSAgICAgICBvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gXG4iKSk7Ci19Ci0KLXN5bWJvbFMgKgotREVGVU4gKG1kX3VuZGVmaW5lZF9zeW1ib2wsIChuYW1lKSwKLSAgICAgICBjaGFyICpuYW1lKQotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotREVGVU4gKHRjX2hlYWRlcnNfaG9vaywgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKLX0KLQotLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkgKi8KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gICAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLX0KLQwKLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19hb3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYwotdm9pZAotd29yZGlmeV9zY2IgKGJ1ZmZlciwgZGlzcF9zaXplLCBpbnN0X3NpemUpCi0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50ICpkaXNwX3NpemU7Ci0gICAgIGludCAqaW5zdF9zaXplOwotewotICBpbnQgcm4gPSBidWZmZXJbMV0gJiAweDc7Ci0KLSAgc3dpdGNoIChidWZmZXJbMF0pCi0gICAgewotICAgIGNhc2UgMHgwZToJCQkvKiBCU1IgKi8KLSAgICBjYXNlIDB4MjA6Ci0gICAgY2FzZSAweDIxOgotICAgIGNhc2UgMHgyMjoKLSAgICBjYXNlIDB4MjM6Ci0gICAgY2FzZSAweDI0OgotICAgIGNhc2UgMHgyNToKLSAgICBjYXNlIDB4MjY6Ci0gICAgY2FzZSAweDI3OgotICAgIGNhc2UgMHgyODoKLSAgICBjYXNlIDB4Mjk6Ci0gICAgY2FzZSAweDJhOgotICAgIGNhc2UgMHgyYjoKLSAgICBjYXNlIDB4MmM6Ci0gICAgY2FzZSAweDJkOgotICAgIGNhc2UgMHgyZToKLSAgICBjYXNlIDB4MmY6Ci0gICAgICBidWZmZXJbMF0gfD0gMHgxMDsKLSAgICAgIGJ1ZmZlclsxXSA9IDA7Ci0gICAgICBidWZmZXJbMl0gPSAwOwotICAgICAgKmRpc3Bfc2l6ZSA9IDI7Ci0gICAgICAqaW5zdF9zaXplID0gMTsKLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICBjYXNlIDB4MDE6Ci0gICAgICAqaW5zdF9zaXplID0gNjsKLSAgICAgICpkaXNwX3NpemUgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDA2OgotICAgICAgKmluc3Rfc2l6ZSA9IDg7Ci0gICAgICAqZGlzcF9zaXplID0gMjsKLQotICAgICAgKmJ1ZmZlcisrID0gMHgyNjsJCS8qIGJuZSArIDggKi8KLSAgICAgICpidWZmZXIrKyA9IDB4MDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4MDc6Ci0gICAgICAqaW5zdF9zaXplID0gODsKLSAgICAgICpkaXNwX3NpemUgPSAyOwotICAgICAgKmJ1ZmZlcisrID0gMHgyNzsJCS8qIGJuZSArIDggKi8KLSAgICAgICpidWZmZXIrKyA9IDB4MDg7Ci0gICAgICBicmVhazsKLQotICAgIH0KLSAgKmJ1ZmZlcisrID0gMHhhOCB8IHJuOwkvKiBhZGRxIC0xLHJuICovCi0gICpidWZmZXIrKyA9IDB4MGM7Ci0gICpidWZmZXIrKyA9IDB4MDQ7CQkvKiBjbXAgIzB4ZmY6OCwgcm4gKi8KLSAgKmJ1ZmZlcisrID0gMHhmZjsKLSAgKmJ1ZmZlcisrID0gMHg3MCB8IHJuOwotICAqYnVmZmVyKysgPSAweDM2OwkJLyogYm5lIC4uLiAqLwotICAqYnVmZmVyKysgPSAwOwotICAqYnVmZmVyKysgPSAwOwotfQotCi0vKgotY2FsbGVkIGFmdGVyIHJlbGF4aW5nLCBjaGFuZ2UgdGhlIGZyYWdzIHNvIHRoZXkga25vdyBob3cgYmlnIHRoZXkgYXJlCi0qLwotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgaW50IGRpc3Bfc2l6ZSA9IDA7Ci0gIGludCBpbnN0X3NpemUgPSAwOwotICBjaGFyICpidWZmZXIgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWw7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDIChCUkFOQ0gsIEJZVEVfRElTUCk6Ci0gICAgICBkaXNwX3NpemUgPSAxOwotICAgICAgaW5zdF9zaXplID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChTQ0JfRiwgQllURV9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9UU1QsIEJZVEVfRElTUCk6Ci0gICAgICBkaXNwX3NpemUgPSAxOwotICAgICAgaW5zdF9zaXplID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBCcmFuY2hlcyB0byBhIGtub3duIDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KLQotICAgICAgLyogVHVybiBvbiB0aGUgMTZiaXQgYml0ICovCi0gICAgY2FzZSBDIChCUkFOQ0gsIFdPUkRfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfRiwgV09SRF9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9UU1QsIFdPUkRfRElTUCk6Ci0gICAgICB3b3JkaWZ5X3NjYiAoYnVmZmVyLCAmZGlzcF9zaXplLCAmaW5zdF9zaXplKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChCUkFOQ0gsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfRiwgVU5ERUZfV09SRF9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9UU1QsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICAvKiBUaGlzIHRyaWVkIHRvIGJlIHJlbGF4ZWQsIGJ1dCBkaWRuJ3QgbWFuYWdlIGl0LCBpdCBub3cgbmVlZHMgYQotCSBmaXggKi8KLSAgICAgIHdvcmRpZnlfc2NiIChidWZmZXIsICZkaXNwX3NpemUsICZpbnN0X3NpemUpOwotCi0gICAgICAvKiBNYWtlIGEgcmVsb2MgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgaW5zdF9zaXplLAotCSAgICAgICA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLAotCSAgICAgICBSX0g4NTAwX1BDUkVMMTYpOwotCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgcmV0dXJuOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgaWYgKGluc3Rfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGludCBuZXh0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3MgKyBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBpbnQgdGFyZ19hZGRyID0gKFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArCi0JCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0KTsKLSAgICAgIGludCBkaXNwID0gdGFyZ19hZGRyIC0gbmV4dF9pbnN0OwotCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciArIGluc3Rfc2l6ZSwgZGlzcCwgZGlzcF9zaXplKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgfQotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgc2l6ZSkKLSAgICAgc2VnVCBzZWcgOwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pIC0gMSkgCi0JICAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0KLX0KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X3JfdHlwZSA9IGZpeFAtPmZ4X3NpemUgPT0gNCA/IFJfSDg1MDBfSU1NMzIgOiBSX0g4NTAwX0lNTTE2OwotICAgIH0KLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIFJfSDg1MDBfSU1NODoKLSAgICBjYXNlIFJfSDg1MDBfUENSRUw4OgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTE2OgotICAgIGNhc2UgUl9IODUwMF9MT1cxNjoKLSAgICBjYXNlIFJfSDg1MDBfUENSRUwxNjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSElHSDg6Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSDg1MDBfSElHSDE2OgotICAgICAgKmJ1ZisrID0gdmFsID4+IDI0OwotICAgICAgKmJ1ZisrID0gdmFsID4+IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTI0OgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX0g4NTAwX0lNTTMyOgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0KLSAgICB9Ci19Ci0KLS8qCi1jYWxsZWQganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLCByZXR1cm4gdGhlIGxlbmd0aAotYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbgotKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIGludCB3aGF0ID0gR0VUX1dIQVQgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBDIChCUkFOQ0gsIFVOREVGX0JZVEVfRElTUCk6Ci0gICAgY2FzZSBDIChTQ0JfRiwgVU5ERUZfQllURV9ESVNQKToKLSAgICBjYXNlIEMgKFNDQl9UU1QsIFVOREVGX0JZVEVfRElTUCk6Ci0gICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLwotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JIHNpemVkIC0gbWF5YmUgaXQgd2lsbCBmaXggdXAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgQllURV9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZyAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIFdPUkRfRElTUCldLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgfQotICByZXR1cm4gZnJhZ1AtPmZyX3ZhcjsKLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKLSAgICAgY2hhciAqcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLS8qQVJHU1VTRUQqLwotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChpZ25vcmUpCi0gICAgIHN5bWJvbFMgKmlnbm9yZTsKLXsKLX0KLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhfcHRyKQotICAgICBmaXhTICpmaXhfcHRyOwotewotICBpZiAoZml4X3B0ci0+Znhfcl90eXBlID09IFJFTE9DXzMyKQotICAgIHsKLSAgICAgIC8qIGNvbnMgbGlrZXMgdG8gY3JlYXRlIHJlbG9jMzIncyB3aGF0ZXZlciB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MuLgotICAgICAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDI6Ci0JICByZXR1cm4gUl9IODUwMF9JTU0xNjsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIHJldHVybiBSX0g4NTAwX0lNTTg7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGZpeF9wdHItPmZ4X3JfdHlwZTsKLX0KLQotdm9pZAotdGNfcmVsb2NfbWFuZ2xlIChmaXhfcHRyLCBpbnRyLCBiYXNlKQotICAgICBmaXhTICpmaXhfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludHI7Ci0gICAgIGJmZF92bWEgYmFzZTsKLQotewotICBzeW1ib2xTICpzeW1ib2xfcHRyOwotCi0gIHN5bWJvbF9wdHIgPSBmaXhfcHRyLT5meF9hZGRzeTsKLQotICAvKiBJZiB0aGlzIHJlbG9jYXRpb24gaXMgYXR0YWNoZWQgdG8gYSBzeW1ib2wgdGhlbiBpdCdzIG9rCi0gICAgIHRvIG91dHB1dCBpdCAqLwotICBpZiAoZml4X3B0ci0+Znhfcl90eXBlID09IFJFTE9DXzMyKQotICAgIHsKLSAgICAgIC8qIGNvbnMgbGlrZXMgdG8gY3JlYXRlIHJlbG9jMzIncyB3aGF0ZXZlciB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MuLgotICAgICAgICovCi0gICAgICBzd2l0Y2ggKGZpeF9wdHItPmZ4X3NpemUpCi0JewotCWNhc2UgMjoKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NMTY7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTg7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludHItPnJfdHlwZSA9IGZpeF9wdHItPmZ4X3JfdHlwZTsKLSAgICB9Ci0KLSAgaW50ci0+cl92YWRkciA9IGZpeF9wdHItPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhfcHRyLT5meF93aGVyZSArIGJhc2U7Ci0gIGludHItPnJfb2Zmc2V0ID0gZml4X3B0ci0+Znhfb2Zmc2V0OwotCi0gIC8qIFR1cm4gdGhlIHNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpbnRvIGFuIG9mZnNldC4gICovCi0gIGlmIChzeW1ib2xfcHRyKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmRvdDsKLQotICAgICAgZG90ID0gc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpXS5kb3Q7Ci0gICAgICBpZiAoZG90KQotCXsKLQkgIC8qCSAgaW50ci0+cl9vZmZzZXQgLT0KLQkgICAgc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQoc3ltYm9sX3B0cildLnNjbmhkci5zX3BhZGRyOyovCi0JICBpbnRyLT5yX29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltYm9sX3B0cik7Ci0JICBpbnRyLT5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotICAgIH0KLQotfQotCi0KLQotaW50Ci1zdGFydF9sYWJlbCAocHRyKQotICAgICBjaGFyICpwdHI7Ci17Ci0gIC8qIENoZWNrIGZvciA6cy53ICovCi0gIGlmIChpc2FscGhhIChwdHJbMV0pICYmIHB0clsyXSA9PSAnLicpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIENoZWNrIGZvciA6cyAqLwotICBpZiAoaXNhbHBoYSAocHRyWzFdKSAmJiAhaXNhbHBoYSAocHRyWzJdKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLQotaW50Ci10Y19jb2ZmX3NpemVtYWNoZGVwIChmcmFnKQotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgcmV0dXJuIG1kX3JlbGF4X3RhYmxlW2ZyYWctPmZyX3N1YnR5cGVdLnJseF9sZW5ndGg7Ci19Ci0KLS8qIGVuZCBvZiB0Yy1oODUwMC5jICovCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtaDg1MDAuaCBiL2dhcy9jb25maWcvdGMtaDg1MDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1M2VjMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWg4NTAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtaDg1MDAuaAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBUQ19IODUwMAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXhQKSB0Y19jb2ZmX2ZpeDJydHlwZShmaXhQKQotCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX2g4NTAwCi0jZGVmaW5lIENPRkZfTUFHSUMgMHg4NTAwCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgoeCktPmZ4X2FkZHN5fHwoeCktPmZ4X3N1YnN5KQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCi1leHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOwotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJIaXRhY2hpIEg4LzUwMCBHQVMgIgotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0jZGVmaW5lIFJFTE9DXzMyIDEyMzQKLQotI2RlZmluZSBUQ19TVEFSVF9MQUJFTChjaCwgcHRyKSAgKGNoID09ICc6JyAmJiBzdGFydF9sYWJlbChwdHIpKQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKGZyYWcpIHRjX2NvZmZfc2l6ZW1hY2hkZXAoZnJhZykKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLS8qIGVuZCBvZiB0Yy1oODUwMC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWhwcGEuYyBiL2dhcy9jb25maWcvdGMtaHBwYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzA3ZTIwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaHBwYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjc5MSArMCwwIEBACi0vKiB0Yy1ocHBhLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBQQQotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJiZmQvbGliaHBwYS5oIgotI2luY2x1ZGUgImJmZC9saWJiZmQuaCIKLQotLyogQmUgY2FyZWZ1bCwgdGhpcyBmaWxlIGluY2x1ZGVzIGRhdGEgKmRlY2xhcmF0aW9ucyouICAqLwotI2luY2x1ZGUgIm9wY29kZS9ocHBhLmgiCi0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSAmJiBkZWZpbmVkIChPQkpfU09NKQotZXJyb3Igb25seSBvbmUgb2YgT0JKX0VMRiBhbmQgT0JKX1NPTSBjYW4gYmUgZGVmaW5lZAotI2VuZGlmCi0KLS8qIEEgImNvbnZpZW50IiBwbGFjZSB0byBwdXQgb2JqZWN0IGZpbGUgZGVwZW5kZW5jaWVzIHdoaWNoIGRvCi0gICBub3QgbmVlZCB0byBiZSBzZWVuIG91dHNpZGUgb2YgdGMtaHBwYS5jLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0vKiBPYmplY3QgZmlsZSBmb3JtYXRzIHNwZWNpZnkgcmVsb2NhdGlvbiB0eXBlcy4gICovCi10eXBlZGVmIGVsZl9ocHBhX3JlbG9jX3R5cGUgcmVsb2NfdHlwZTsKLQotLyogT2JqZWN0IGZpbGUgZm9ybWF0cyBzcGVjaWZ5IEJGRCBzeW1ib2wgdHlwZXMuICAqLwotdHlwZWRlZiBlbGZfc3ltYm9sX3R5cGUgb2JqX3N5bWJvbF90eXBlOwotCi0jaWZkZWYgQkZENjQKLS8qIEhvdyB0byBnZW5lcmF0ZSBhIHJlbG9jYXRpb24uICAqLwotI2RlZmluZSBocHBhX2dlbl9yZWxvY190eXBlIF9iZmRfZWxmNjRfaHBwYV9nZW5fcmVsb2NfdHlwZQotI2Vsc2UKLSNkZWZpbmUgaHBwYV9nZW5fcmVsb2NfdHlwZSBfYmZkX2VsZjMyX2hwcGFfZ2VuX3JlbG9jX3R5cGUKLSNlbmRpZgotCi0vKiBFTEYgb2JqZWN0cyBjYW4gaGF2ZSB2ZXJzaW9ucywgYnV0IGFwcGFyZW50bHkgZG8gbm90IGhhdmUgYW55d2hlcmUKLSAgIHRvIHN0b3JlIGEgY29weXJpZ2h0IHN0cmluZy4gICovCi0jZGVmaW5lIG9ial92ZXJzaW9uIG9ial9lbGZfdmVyc2lvbgotI2RlZmluZSBvYmpfY29weXJpZ2h0IG9ial9lbGZfdmVyc2lvbgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfU09NCi0vKiBOYW1lcyBvZiB2YXJpb3VzIGRlYnVnZ2luZyBzcGFjZXMvc3Vic3BhY2VzLiAgKi8KLSNkZWZpbmUgR0RCX0RFQlVHX1NQQUNFX05BTUUgIiRHREJfREVCVUckIgotI2RlZmluZSBHREJfU1RSSU5HU19TVUJTUEFDRV9OQU1FICIkR0RCX1NUUklOR1MkIgotI2RlZmluZSBHREJfU1lNQk9MU19TVUJTUEFDRV9OQU1FICIkR0RCX1NZTUJPTFMkIgotI2RlZmluZSBVTldJTkRfU0VDVElPTl9OQU1FICIkVU5XSU5EJCIKLQotLyogT2JqZWN0IGZpbGUgZm9ybWF0cyBzcGVjaWZ5IHJlbG9jYXRpb24gdHlwZXMuICAqLwotdHlwZWRlZiBpbnQgcmVsb2NfdHlwZTsKLQotLyogU09NIG9iamVjdHMgY2FuIGhhdmUgYm90aCBhIHZlcnNpb24gc3RyaW5nIGFuZCBhIGNvcHlyaWdodCBzdHJpbmcuICAqLwotI2RlZmluZSBvYmpfdmVyc2lvbiBvYmpfc29tX3ZlcnNpb24KLSNkZWZpbmUgb2JqX2NvcHlyaWdodCBvYmpfc29tX2NvcHlyaWdodAotCi0vKiBIb3cgdG8gZ2VuZXJhdGUgYSByZWxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgaHBwYV9nZW5fcmVsb2NfdHlwZSBocHBhX3NvbV9nZW5fcmVsb2NfdHlwZQotCi0vKiBPYmplY3QgZmlsZSBmb3JtYXRzIHNwZWNpZnkgQkZEIHN5bWJvbCB0eXBlcy4gICovCi10eXBlZGVmIHNvbV9zeW1ib2xfdHlwZSBvYmpfc3ltYm9sX3R5cGU7Ci0KLS8qIFRoaXMgYXBwYXJlbnRseSBpc24ndCBpbiBvbGRlciB2ZXJzaW9ucyBvZiBocHV4IHJlbG9jLmguICAqLwotI2lmbmRlZiBSX0RMVF9SRUwKLSNkZWZpbmUgUl9ETFRfUkVMIDB4NzgKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgUl9OMFNFTAotI2RlZmluZSBSX04wU0VMIDB4ZDgKLSNlbmRpZgotCi0jaWZuZGVmIFJfTjFTRUwKLSNkZWZpbmUgUl9OMVNFTCAweGQ5Ci0jZW5kaWYKLQotLyogVmFyaW91cyBzdHJ1Y3R1cmVzIGFuZCB0eXBlcyB1c2VkIGludGVybmFsbHkgaW4gdGMtaHBwYS5jLiAgKi8KLQotLyogVW53aW5kIHRhYmxlIGFuZCBkZXNjcmlwdG9yLiAgRklYTUU6IFN5bmMgdGhpcyB3aXRoIEdEQiB2ZXJzaW9uLiAgKi8KLQotc3RydWN0IHVud2luZF9kZXNjCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgY2Fubm90X3Vud2luZDoxOwotICAgIHVuc2lnbmVkIGludCBtaWxsaWNvZGU6MTsKLSAgICB1bnNpZ25lZCBpbnQgbWlsbGljb2RlX3NhdmVfcmVzdDoxOwotICAgIHVuc2lnbmVkIGludCByZWdpb25fZGVzYzoyOwotICAgIHVuc2lnbmVkIGludCBzYXZlX3NyOjI7Ci0gICAgdW5zaWduZWQgaW50IGVudHJ5X2ZyOjQ7Ci0gICAgdW5zaWduZWQgaW50IGVudHJ5X2dyOjU7Ci0gICAgdW5zaWduZWQgaW50IGFyZ3Nfc3RvcmVkOjE7Ci0gICAgdW5zaWduZWQgaW50IGNhbGxfZnI6NTsKLSAgICB1bnNpZ25lZCBpbnQgY2FsbF9ncjo1OwotICAgIHVuc2lnbmVkIGludCBzYXZlX3NwOjE7Ci0gICAgdW5zaWduZWQgaW50IHNhdmVfcnA6MTsKLSAgICB1bnNpZ25lZCBpbnQgc2F2ZV9ycF9pbl9mcmFtZToxOwotICAgIHVuc2lnbmVkIGludCBleHRuX3B0cl9kZWZpbmVkOjE7Ci0gICAgdW5zaWduZWQgaW50IGNsZWFudXBfZGVmaW5lZDoxOwotCi0gICAgdW5zaWduZWQgaW50IGhwZV9pbnRlcnJ1cHRfbWFya2VyOjE7Ci0gICAgdW5zaWduZWQgaW50IGhwdXhfaW50ZXJydXB0X21hcmtlcjoxOwotICAgIHVuc2lnbmVkIGludCByZXNlcnZlZDozOwotICAgIHVuc2lnbmVkIGludCBmcmFtZV9zaXplOjI3OwotICB9OwotCi1zdHJ1Y3QgdW53aW5kX3RhYmxlCi0gIHsKLSAgICAvKiBTdGFydGluZyBhbmQgZW5kaW5nIG9mZnNldHMgb2YgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkKLSAgICAgICBkZXNjcmlwdG9yLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgc3RhcnRfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGludCBlbmRfb2Zmc2V0OwotICAgIHN0cnVjdCB1bndpbmRfZGVzYyBkZXNjcmlwdG9yOwotICB9OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSAuY2FsbGluZm8sIC5lbnRlciwgLmxlYXZlIHBzZXVkby1vcHMgdG8KLSAgIGNvbnRyb2wgdGhlIGVudHJ5IGFuZCBleGl0IGNvZGUgdGhleSBnZW5lcmF0ZS4gSXQgaXMgYWxzbyB1c2VkIGluCi0gICBjcmVhdGlvbiBvZiB0aGUgY29ycmVjdCBzdGFjayB1bndpbmQgZGVzY3JpcHRvcnMuCi0KLSAgIE5PVEU6ICBHQVMgZG9lcyBub3Qgc3VwcG9ydCAuZW50ZXIgYW5kIC5sZWF2ZSBmb3IgdGhlIGdlbmVyYXRpb24gb2YKLSAgIHByb2xvZ3VlcyBhbmQgZXBpbG9ndWVzLiAgRklYTUUuCi0KLSAgIFRoZSBmaWVsZHMgaW4gc3RydWN0dXJlIHJvdWdobHkgY29ycmVzcG9uZCB0byB0aGUgYXJndW1lbnRzIGF2YWlsYWJsZSBvbiB0aGUKLSAgIC5jYWxsaW5mbyBwc2V1ZG8tb3AuICAqLwotCi1zdHJ1Y3QgY2FsbF9pbmZvCi0gIHsKLSAgICAvKiBUaGUgdW53aW5kIGRlc2NyaXB0b3IgYmVpbmcgYnVpbHQuICAqLwotICAgIHN0cnVjdCB1bndpbmRfdGFibGUgY2lfdW53aW5kOwotCi0gICAgLyogTmFtZSBvZiB0aGlzIGZ1bmN0aW9uLiAgKi8KLSAgICBzeW1ib2xTICpzdGFydF9zeW1ib2w7Ci0KLSAgICAvKiAodGVtcG9yYXJ5KSBzeW1ib2wgdXNlZCB0byBtYXJrIHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvbi4gICovCi0gICAgc3ltYm9sUyAqZW5kX3N5bWJvbDsKLQotICAgIC8qIE5leHQgZW50cnkgaW4gdGhlIGNoYWluLiAgKi8KLSAgICBzdHJ1Y3QgY2FsbF9pbmZvICpjaV9uZXh0OwotICB9OwotCi0vKiBPcGVyYW5kIGZvcm1hdHMgZm9yIEZQIGluc3RydWN0aW9ucy4gICBOb3RlIG5vdCBhbGwgRlAgaW5zdHJ1Y3Rpb25zCi0gICBhbGxvdyBhbGwgZm91ciBmb3JtYXRzIHRvIGJlIHVzZWQgKGZvciBleGFtcGxlIGZtcHlzdWIgb25seSBhbGxvd3MKLSAgIFNHTCBhbmQgREJMKS4gICovCi10eXBlZGVmIGVudW0KLSAgewotICAgIFNHTCwgREJMLCBJTExFR0FMX0ZNVCwgUVVBRCwgVywgVVcsIERXLCBVRFcsIFFXLCBVUVcKLSAgfQotZnBfb3BlcmFuZF9mb3JtYXQ7Ci0KLS8qIFRoaXMgZnVsbHkgZGVzY3JpYmVzIHRoZSBzeW1ib2wgdHlwZXMgd2hpY2ggbWF5IGJlIGF0dGFjaGVkIHRvCi0gICBhbiBFWFBPUlQgb3IgSU1QT1JUIGRpcmVjdGl2ZS4gIE9ubHkgU09NIHVzZXMgdGhpcyBmb3JtYXRpb24KLSAgIChFTEYgaGFzIG5vIG5lZWQgZm9yIGl0KS4gICovCi10eXBlZGVmIGVudW0KLSAgewotICAgIFNZTUJPTF9UWVBFX1VOS05PV04sCi0gICAgU1lNQk9MX1RZUEVfQUJTT0xVVEUsCi0gICAgU1lNQk9MX1RZUEVfQ09ERSwKLSAgICBTWU1CT0xfVFlQRV9EQVRBLAotICAgIFNZTUJPTF9UWVBFX0VOVFJZLAotICAgIFNZTUJPTF9UWVBFX01JTExJQ09ERSwKLSAgICBTWU1CT0xfVFlQRV9QTEFCRUwsCi0gICAgU1lNQk9MX1RZUEVfUFJJX1BST0csCi0gICAgU1lNQk9MX1RZUEVfU0VDX1BST0csCi0gIH0KLXBhX3N5bWJvbF90eXBlOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYXNzZW1ibGUKLSAgIGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0cnVjdCBwYV9pdAotICB7Ci0gICAgLyogSG9sZHMgdGhlIG9wY29kZSBhZnRlciBwYXJzaW5nIGJ5IHBhX2lwLiAgKi8KLSAgICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAgIC8qIEhvbGRzIGFuIGV4cHJlc3Npb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KLSAgICBleHByZXNzaW9uUyBleHA7Ci0KLSAgICAvKiBEb2VzIHRoaXMgaW5zdHJ1Y3Rpb24gdXNlIFBDLXJlbGF0aXZlIGFkZHJlc3NpbmcuICAqLwotICAgIGludCBwY3JlbDsKLQotICAgIC8qIEZsb2F0aW5nIHBvaW50IGZvcm1hdHMgZm9yIG9wZXJhbmQxIGFuZCBvcGVyYW5kMi4gICovCi0gICAgZnBfb3BlcmFuZF9mb3JtYXQgZnBvZjE7Ci0gICAgZnBfb3BlcmFuZF9mb3JtYXQgZnBvZjI7Ci0KLQotICAgIC8qIEhvbGRzIHRoZSBmaWVsZCBzZWxlY3RvciBmb3IgdGhpcyBpbnN0cnVjdGlvbgotICAgICAgIChmb3IgZXhhbXBsZSBMJSwgTFIlLCBldGMpLiAgKi8KLSAgICBsb25nIGZpZWxkX3NlbGVjdG9yOwotCi0gICAgLyogSG9sZHMgYW55IGFyZ3VtZW50IHJlbG9jYXRpb24gYml0cyBhc3NvY2lhdGVkIHdpdGggdGhpcwotICAgICAgIGluc3RydWN0aW9uLiAgKGluc3RydWN0aW9uIHNob3VsZCBiZSBzb21lIHNvcnQgb2YgY2FsbCkuICAqLwotICAgIGxvbmcgYXJnX3JlbG9jOwotCi0gICAgLyogVGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICBpbnQgZm9ybWF0OwotCi0gICAgLyogVGhlIHJlbG9jYXRpb24gKGlmIGFueSkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgIHJlbG9jX3R5cGUgcmVsb2M7Ci0gIH07Ci0KLS8qIFBBLTg5IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBhcmUgYXJyYW5nZWQgbGlrZSB0aGlzOgotCi0KLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAwIG9yIDE2TCAgIHwgIDE2IG9yIDE2UiAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAxIG9yIDE3TCAgIHwgIDE3IG9yIDE3UiAgIHwKLSAgICstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSsKLSAgIHwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKLQotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotICAgLiAgICAgICAgICAgICAgLiAgICAgICAgICAgICAgLgotCi0gICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAxNCBvciAzMEwgICB8ICAzMCBvciAzMFIgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0gICB8ICAxNSBvciAzMUwgICB8ICAzMSBvciAzMVIgICB8Ci0gICArLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCi0KLQotICAgVGhlIGZvbGxvd2luZyBpcyBhIHZlcnNpb24gb2YgcGFfcGFyc2VfbnVtYmVyIHRoYXQKLSAgIGhhbmRsZXMgdGhlIEwvUiBub3RhdGlvbiBhbmQgcmV0dXJucyB0aGUgY29ycmVjdAotICAgdmFsdWUgdG8gcHV0IGludG8gdGhlIGluc3RydWN0aW9uIHJlZ2lzdGVyIGZpZWxkLgotICAgVGhlIGNvcnJlY3QgdmFsdWUgdG8gcHV0IGludG8gdGhlIGluc3RydWN0aW9uIGlzCi0gICBlbmNvZGVkIGluIHRoZSBzdHJ1Y3R1cmUgJ3BhXzExX2ZwX3JlZ19zdHJ1Y3QnLiAgKi8KLQotc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QKLSAgewotICAgIC8qIFRoZSByZWdpc3RlciBudW1iZXIuICAqLwotICAgIGNoYXIgbnVtYmVyX3BhcnQ7Ci0KLSAgICAvKiBML1Igc2VsZWN0b3IuICAqLwotICAgIGNoYXIgbF9yX3NlbGVjdDsKLSAgfTsKLQotLyogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYnVpbGQgYXJndW1lbnQgcmVsb2NhdGlvbiBzdHVicy4gICovCi1zdHJ1Y3QgY2FsbF9kZXNjCi0gIHsKLSAgICAvKiBUaGUgYXJndW1lbnQgcmVsb2NhdGlvbiBzcGVjaWZpY2F0aW9uLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgYXJnX3JlbG9jOwotCi0gICAgLyogTnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0gICAgdW5zaWduZWQgaW50IGFyZ19jb3VudDsKLSAgfTsKLQotI2lmZGVmIE9CSl9TT00KLS8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYW4gZW50cnkgaW4gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkKLSAgIGNoYWluLiAgKi8KLQotc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4KLSAgewotICAgIC8qIE5vbnplcm8gaWYgdGhpcyBzcGFjZSBoYXMgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyIGNvZGUuICAqLwotICAgIHVuc2lnbmVkIGludCBzc2RfZGVmaW5lZDsKLQotICAgIC8qIE5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqc3NkX25hbWU7Ci0KLSAgICAvKiBHQVMgc2VnbWVudCBhbmQgc3Vic2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWJzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKnNzZF9zZWc7Ci0gICAgaW50IHNzZF9zdWJzZWc7Ci0KLSAgICAvKiBOZXh0IHNwYWNlIGluIHRoZSBzdWJzcGFjZSBkaWN0aW9uYXJ5IGNoYWluLiAgKi8KLSAgICBzdHJ1Y3Qgc3Vic3BhY2VfZGljdGlvbmFyeV9jaGFpbiAqc3NkX25leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHN1YnNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc3NkX2NoYWluX3N0cnVjdDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhbiBlbnRyeSBpbiB0aGUgc3Vic3BhY2UgZGljdGlvbmFyeQotICAgY2hhaW4uICAqLwotCi1zdHJ1Y3Qgc3BhY2VfZGljdGlvbmFyeV9jaGFpbgotICB7Ci0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZSBvcgotICAgICAgIGFzIGEgZGVmYXVsdCBzcGFjZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX2RlZmluZWQ7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2VzIGhhcyBiZWVuIGRlZmluZWQgYnkgdGhlIHVzZXIgY29kZS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX3VzZXJfZGVmaW5lZDsKLQotICAgIC8qIFRoZSBzcGFjZSBudW1iZXIgKG9yIGluZGV4KS4gICovCi0gICAgdW5zaWduZWQgaW50IHNkX3NwbnVtOwotCi0gICAgLyogVGhlIG5hbWUgb2YgdGhpcyBzdWJzcGFjZS4gICovCi0gICAgY2hhciAqc2RfbmFtZTsKLQotICAgIC8qIEdBUyBzZWdtZW50IHRvIHdoaWNoIHRoaXMgc3Vic3BhY2UgY29ycmVzcG9uZHMuICAqLwotICAgIGFzZWN0aW9uICpzZF9zZWc7Ci0KLSAgICAvKiBDdXJyZW50IHN1YnNlZ21lbnQgbnVtYmVyIGJlaW5nIHVzZWQuICAqLwotICAgIGludCBzZF9sYXN0X3N1YnNlZzsKLQotICAgIC8qIFRoZSBjaGFpbiBvZiBzdWJzcGFjZXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwYWNlLiAgKi8KLSAgICBzc2RfY2hhaW5fc3RydWN0ICpzZF9zdWJzcGFjZXM7Ci0KLSAgICAvKiBUaGUgbmV4dCBlbnRyeSBpbiB0aGUgc3BhY2UgZGljdGlvbmFyeSBjaGFpbi4gICovCi0gICAgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gKnNkX25leHQ7Ci0gIH07Ci0KLXR5cGVkZWYgc3RydWN0IHNwYWNlX2RpY3Rpb25hcnlfY2hhaW4gc2RfY2hhaW5fc3RydWN0OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIGF0dHJpYnV0ZXMgb2YgdGhlIGRlZmF1bHQgc3Vic3BhY2UKLSAgIGRpY3Rpb25hcnkgZW50cmllcy4gICovCi0KLXN0cnVjdCBkZWZhdWx0X3N1YnNwYWNlX2RpY3QKLSAgewotICAgIC8qIE5hbWUgb2YgdGhlIHN1YnNwYWNlLiAgKi8KLSAgICBjaGFyICpuYW1lOwotCi0gICAgLyogRklYTUUuICBJcyB0aGlzIHN0aWxsIG5lZWRlZD8gICovCi0gICAgY2hhciBkZWZpbmVkOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGlzIGxvYWRhYmxlLiAgKi8KLSAgICBjaGFyIGxvYWRhYmxlOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIGNvbnRhaW5zIG9ubHkgY29kZS4gICovCi0gICAgY2hhciBjb2RlX29ubHk7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3Vic3BhY2UuICAqLwotICAgIGNoYXIgY29tbW9uOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIGlzIGEgY29tbW9uIHN1YnNwYWNlIHdoaWNoIGFsbG93cyBzeW1ib2xzCi0gICAgICAgdG8gYmUgbXVsdGlwbHkgZGVmaW5lZC4gICovCi0gICAgY2hhciBkdXBfY29tbW9uOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHN1YnNwYWNlIHNob3VsZCBiZSB6ZXJvIGZpbGxlZC4gICovCi0gICAgY2hhciB6ZXJvOwotCi0gICAgLyogU29ydCBrZXkgZm9yIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIHVuc2lnbmVkIGNoYXIgc29ydDsKLQotICAgIC8qIEFjY2VzcyBjb250cm9sIGJpdHMgZm9yIHRoaXMgc3Vic3BhY2UuICBDYW4gcmVwcmVzZW50IFJXWCBhY2Nlc3MKLSAgICAgICBhcyB3ZWxsIGFzIHByaXZpbGVnZSBsZXZlbCBjaGFuZ2VzIGZvciBnYXRld2F5cy4gICovCi0gICAgaW50IGFjY2VzczsKLQotICAgIC8qIEluZGV4IG9mIGNvbnRhaW5pbmcgc3BhY2UuICAqLwotICAgIGludCBzcGFjZV9pbmRleDsKLQotICAgIC8qIEFsaWdubWVudCAoaW4gYnl0ZXMpIG9mIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIGludCBhbGlnbm1lbnQ7Ci0KLSAgICAvKiBRdWFkcmFudCB3aXRoaW4gc3BhY2Ugd2hlcmUgdGhpcyBzdWJzcGFjZSBzaG91bGQgYmUgbG9hZGVkLiAgKi8KLSAgICBpbnQgcXVhZHJhbnQ7Ci0KLSAgICAvKiBBbiBpbmRleCBpbnRvIHRoZSBkZWZhdWx0IHNwYWNlcyBhcnJheS4gICovCi0gICAgaW50IGRlZl9zcGFjZV9pbmRleDsKLQotICAgIC8qIFN1YnNlZ21lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic3BhY2UuICAqLwotICAgIHN1YnNlZ1Qgc3Vic2VnbWVudDsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhdHRyaWJ1dGVzIG9mIHRoZSBkZWZhdWx0IHNwYWNlCi0gICBkaWN0aW9uYXJ5IGVudHJpZXMuICAqLwotCi1zdHJ1Y3QgZGVmYXVsdF9zcGFjZV9kaWN0Ci0gIHsKLSAgICAvKiBOYW1lIG9mIHRoZSBzcGFjZS4gICovCi0gICAgY2hhciAqbmFtZTsKLQotICAgIC8qIFNwYWNlIG51bWJlci4gIEl0IGlzIHBvc3NpYmxlIHRvIGlkZW50aWZ5IHNwYWNlcyB3aXRoaW4KLSAgICAgICBhc3NlbWJseSBjb2RlIG51bWVyaWNhbGx5ISAgKi8KLSAgICBpbnQgc3BudW07Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgaXMgbG9hZGFibGUuICAqLwotICAgIGNoYXIgbG9hZGFibGU7Ci0KLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgc3BhY2UgaXMgImRlZmluZWQiLiAgRklYTUUgaXMgc3RpbGwgbmVlZGVkICovCi0gICAgY2hhciBkZWZpbmVkOwotCi0gICAgLyogTm9uemVybyBpZiB0aGlzIHNwYWNlIGNhbiBub3QgYmUgc2hhcmVkLiAgKi8KLSAgICBjaGFyIHByaXZhdGU7Ci0KLSAgICAvKiBTb3J0IGtleSBmb3IgdGhpcyBzcGFjZS4gICovCi0gICAgdW5zaWduZWQgY2hhciBzb3J0OwotCi0gICAgLyogU2VnbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzcGFjZS4gICovCi0gICAgYXNlY3Rpb24gKnNlZ21lbnQ7Ci0gIH07Ci0jZW5kaWYKLQotLyogU3RydWN0dXJlIGZvciBwcmV2aW91cyBsYWJlbCB0cmFja2luZy4gIE5lZWRlZCBzbyB0aGF0IGFsaWdubWVudHMsCi0gICBjYWxsaW5mbyBkZWNsYXJhdGlvbnMsIGV0YyBjYW4gYmUgZWFzaWx5IGF0dGFjaGVkIHRvIGEgcGFydGljdWxhcgotICAgbGFiZWwuICAqLwotdHlwZWRlZiBzdHJ1Y3QgbGFiZWxfc3ltYm9sX3N0cnVjdAotICB7Ci0gICAgc3RydWN0IHN5bWJvbCAqbHNzX2xhYmVsOwotI2lmZGVmIE9CSl9TT00KLSAgICBzZF9jaGFpbl9zdHJ1Y3QgKmxzc19zcGFjZTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICBzZWdUIGxzc19zZWdtZW50OwotI2VuZGlmCi0gICAgc3RydWN0IGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxzc19uZXh0OwotICB9Ci1sYWJlbF9zeW1ib2xfc3RydWN0OwotCi0vKiBFeHRyYSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcGVyZm9ybSBmaXh1cHMgKHJlbG9jYXRpb25zKSBvbiB0aGUgUEEuICAqLwotc3RydWN0IGhwcGFfZml4X3N0cnVjdAotICB7Ci0gICAgLyogVGhlIGZpZWxkIHNlbGVjdG9yLiAgKi8KLSAgICBlbnVtIGhwcGFfcmVsb2NfZmllbGRfc2VsZWN0b3JfdHlwZV9hbHQgZnhfcl9maWVsZDsKLQotICAgIC8qIFR5cGUgb2YgZml4dXAuICAqLwotICAgIGludCBmeF9yX3R5cGU7Ci0KLSAgICAvKiBGb3JtYXQgb2YgZml4dXAuICAqLwotICAgIGludCBmeF9yX2Zvcm1hdDsKLQotICAgIC8qIEFyZ3VtZW50IHJlbG9jYXRpb24gYml0cy4gICovCi0gICAgbG9uZyBmeF9hcmdfcmVsb2M7Ci0KLSAgICAvKiBUaGUgc2VnbWVudCB0aGlzIGZpeHVwIGFwcGVhcnMgaW4uICAqLwotICAgIHNlZ1Qgc2VnbWVudDsKLSAgfTsKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotCi1zdHJ1Y3QgcGRfcmVnCi0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGludCB2YWx1ZTsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgbWFwcGluZyBmcm9tIGEgRlAgY29uZGl0aW9uIHN0cmluZwotICAgdG8gYSBjb25kaXRpb24gbnVtYmVyIHdoaWNoIGNhbiBiZSByZWNvcmRlZCBpbiBhbiBpbnN0cnVjdGlvbi4gICovCi1zdHJ1Y3QgZnBfY29uZF9tYXAKLSAgewotICAgIGNoYXIgKnN0cmluZzsKLSAgICBpbnQgY29uZDsKLSAgfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhIGZpZWxkIHNlbGVjdG9yCi0gICBzdHJpbmcgdG8gYSBmaWVsZCBzZWxlY3RvciB0eXBlLiAgKi8KLXN0cnVjdCBzZWxlY3Rvcl9lbnRyeQotICB7Ci0gICAgY2hhciAqcHJlZml4OwotICAgIGludCBmaWVsZF9zZWxlY3RvcjsKLSAgfTsKLQotLyogUHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIGxvY2FsIHRvIHRjLWhwcGEuYy4gICovCi0KLSNpZmRlZiBPQkpfU09NCi1zdGF0aWMgdm9pZCBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotc3RhdGljIGZwX29wZXJhbmRfZm9ybWF0IHBhX3BhcnNlX2ZwX2Zvcm1hdCBQQVJBTVMgKChjaGFyICoqcykpOwotc3RhdGljIHZvaWQgcGFfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2RhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZmlsbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xjb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbHN5bSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3N0cmluZ2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfdGV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3ZlcnNpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX2ZwX2NtcF9jb25kIFBBUkFNUyAoKGNoYXIgKiopKTsKLXN0YXRpYyBpbnQgZ2V0X2V4cHJlc3Npb24gUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqLCBjaGFyICoqKSk7Ci1zdGF0aWMgaW50IGV2YWx1YXRlX2Fic29sdXRlIFBBUkFNUyAoKHN0cnVjdCBwYV9pdCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBhX2J1aWxkX2FyZ19yZWxvYyBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfYWxpZ25fYXJnX3JlbG9jIFBBUkFNUyAoKHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX251bGxpZiBQQVJBTVMgKChjaGFyICoqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25vbm5lZ19jbXBzdWJfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIGludCBwYV9wYXJzZV9uZWdfY21wc3ViX2NtcGx0ciBQQVJBTVMgKChjaGFyICoqLCBpbnQpKTsKLXN0YXRpYyBpbnQgcGFfcGFyc2VfbmVnX2FkZF9jbXBsdHIgUEFSQU1TICgoY2hhciAqKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX25vbm5lZ19hZGRfY21wbHRyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotc3RhdGljIHZvaWQgcGFfYmxvY2sgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9icnRhYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3RyeSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2NhbGwgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jYWxsX2FyZ3MgUEFSQU1TICgoc3RydWN0IGNhbGxfZGVzYyAqKSk7Ci1zdGF0aWMgdm9pZCBwYV9jYWxsaW5mbyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2NvZGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfY29weXJpZ2h0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW5kIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfZW50ZXIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9lbnRyeSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2VxdSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2V4aXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9leHBvcnQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV90eXBlX2FyZ3MgUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2ltcG9ydCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2xhYmVsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfbGVhdmUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9sZXZlbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX29yaWdpbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3Byb2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9wcm9jZW5kIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfcGFyYW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV91bmRlZmluZV9sYWJlbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IG5lZWRfcGExMV9vcGNvZGUgUEFSQU1TICgoc3RydWN0IHBhX2l0ICosCi0JCQkJICAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqKSk7Ci1zdGF0aWMgaW50IHBhX3BhcnNlX251bWJlciBQQVJBTVMgKChjaGFyICoqLCBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqKSk7Ci1zdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqcGFfZ2V0X2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKLSNpZmRlZiBPQkpfU09NCi1zdGF0aWMgdm9pZCBwYV9jb21waWxlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcGFfc3BhY2UgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwYV9zcG51bSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBhX3N1YnNwYWNlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqY3JlYXRlX25ld19zcGFjZSBQQVJBTVMgKChjaGFyICosIGludCwgaW50LAotCQkJCQkJICBpbnQsIGludCwgaW50LAotCQkJCQkJICBhc2VjdGlvbiAqLCBpbnQpKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICpjcmVhdGVfbmV3X3N1YnNwYWNlIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqLAotCQkJCQkJICAgICAgY2hhciAqLCBpbnQsIGludCwKLQkJCQkJCSAgICAgIGludCwgaW50LCBpbnQsCi0JCQkJCQkgICAgICBpbnQsIGludCwgaW50LCBpbnQsCi0JCQkJCQkgICAgICBpbnQsIGFzZWN0aW9uICopKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICp1cGRhdGVfc3Vic3BhY2UgUEFSQU1TICgoc2RfY2hhaW5fc3RydWN0ICosCi0JCQkJCQkgIGNoYXIgKiwgaW50LCBpbnQsIGludCwKLQkJCQkJCSAgaW50LCBpbnQsIGludCwgaW50LAotCQkJCQkJICBpbnQsIGludCwgaW50LAotCQkJCQkJICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICppc19kZWZpbmVkX3NwYWNlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKmlzX2RlZmluZWRfc3Vic3BhY2UgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9zZWdtZW50X3RvX3NwYWNlIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICpwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIFBBUkFNUyAoKGFzZWN0aW9uICosCi0JCQkJCQkJICAgIHN1YnNlZ1QpKTsKLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKnBhX2ZpbmRfc3BhY2VfYnlfbnVtYmVyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHVuc2lnbmVkIGludCBwYV9zdWJzcGFjZV9zdGFydCBQQVJBTVMgKChzZF9jaGFpbl9zdHJ1Y3QgKiwgaW50KSk7Ci1zdGF0aWMgc2RfY2hhaW5fc3RydWN0ICpwYV9wYXJzZV9zcGFjZV9zdG10IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IHBhX25leHRfc3Vic2VnIFBBUkFNUyAoKHNkX2NoYWluX3N0cnVjdCAqKSk7Ci1zdGF0aWMgdm9pZCBwYV9zcGFjZXNfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBwYV9pcCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGZpeF9uZXdfaHBwYSBQQVJBTVMgKChmcmFnUyAqLCBpbnQsIGludCwgc3ltYm9sUyAqLAotCQkJCSAgbG9uZywgZXhwcmVzc2lvblMgKiwgaW50LAotCQkJCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLAotCQkJCSAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0LAotCQkJCSAgaW50LCBsb25nLCBpbnQgKikpOwotc3RhdGljIGludCBpc19lbmRfb2Zfc3RhdGVtZW50IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGludCBwYV9jaGtfZmllbGRfc2VsZWN0b3IgUEFSQU1TICgoY2hhciAqKikpOwotc3RhdGljIGludCBpc19zYW1lX2ZyYWcgUEFSQU1TICgoZnJhZ1MgKiwgZnJhZ1MgKikpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19leGl0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgbG9nMiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFfc3RyaW5nZXJfYXV4IFBBUkFNUyAoKGNoYXIgKikpOwotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlIFBBUkFNUyAoKHN0cnVjdCBjYWxsX2luZm8gKikpOwotI2VuZGlmCi0KLS8qIEZpbGUgYW5kIGdsb2FsbHkgc2NvcGVkIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gICovCi0KLSNpZmRlZiBPQkpfU09NCi0vKiBSb290IGFuZCBmaW5hbCBlbnRyeSBpbiB0aGUgc3BhY2UgY2hhaW4uICAqLwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfZGljdF9yb290Owotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfZGljdF9sYXN0OwotCi0vKiBUaGUgY3VycmVudCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqY3VycmVudF9zcGFjZTsKLXN0YXRpYyBzc2RfY2hhaW5fc3RydWN0ICpjdXJyZW50X3N1YnNwYWNlOwotI2VuZGlmCi0KLS8qIFJvb3Qgb2YgdGhlIGNhbGxfaW5mbyBjaGFpbi4gICovCi1zdGF0aWMgc3RydWN0IGNhbGxfaW5mbyAqY2FsbF9pbmZvX3Jvb3Q7Ci0KLS8qIFRoZSBsYXN0IGNhbGxfaW5mbyAoZm9yIGZ1bmN0aW9ucykgc3RydWN0dXJlCi0gICBzZWVuIHNvIGl0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggZml4dXBzIGFuZAotICAgZnVuY3Rpb24gbGFiZWxzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgY2FsbF9pbmZvICpsYXN0X2NhbGxfaW5mbzsKLQotLyogVGhlIGxhc3QgY2FsbCBkZXNjcmlwdGlvbiAoZm9yIGFjdHVhbCBjYWxscykuICAqLwotc3RhdGljIHN0cnVjdCBjYWxsX2Rlc2MgbGFzdF9jYWxsX2Rlc2M7Ci0KLS8qIGhhbmRsZSBvZiB0aGUgT1BDT0RFIGhhc2ggdGFibGUgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoID0gTlVMTDsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwuICAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIFRhYmxlIG9mIHBzZXVkbyBvcHMgZm9yIHRoZSBQQS4gIEZJWE1FIC0tIGhvdyBtYW55IG9mIHRoZXNlCi0gICBhcmUgbm93IHJlZHVuZGFudCB3aXRoIHRoZSBvdmVyYWxsIEdBUyBhbmQgdGhlIG9iamVjdCBmaWxlCi0gICBkZXBlbmRlbnQgdGFibGVzPyAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIC8qIGFsaWduIHBzZXVkby1vcHMgb24gdGhlIFBBIHNwZWNpZnkgdGhlIGFjdHVhbCBhbGlnbm1lbnQgcmVxdWVzdGVkLAotICAgICBub3QgdGhlIGxvZzIgb2YgdGhlIHJlcXVlc3RlZCBhbGlnbm1lbnQuICAqLwotI2lmZGVmIE9CSl9TT00KLSAgeyJhbGlnbiIsIHBhX2FsaWduLCA4fSwKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDh9LAotI2VuZGlmCi0gIHsiYmVnaW5fYnJ0YWIiLCBwYV9icnRhYiwgMX0sCi0gIHsiYmVnaW5fdHJ5IiwgcGFfdHJ5LCAxfSwKLSAgeyJibG9jayIsIHBhX2Jsb2NrLCAxfSwKLSAgeyJibG9ja3oiLCBwYV9ibG9jaywgMH0sCi0gIHsiYnl0ZSIsIHBhX2NvbnMsIDF9LAotICB7ImNhbGwiLCBwYV9jYWxsLCAwfSwKLSAgeyJjYWxsaW5mbyIsIHBhX2NhbGxpbmZvLCAwfSwKLSAgeyJjb2RlIiwgcGFfY29kZSwgMH0sCi0gIHsiY29tbSIsIHBhX2NvbW0sIDB9LAotI2lmZGVmIE9CSl9TT00KLSAgeyJjb21waWxlciIsIHBhX2NvbXBpbGVyLCAwfSwKLSNlbmRpZgotICB7ImNvcHlyaWdodCIsIHBhX2NvcHlyaWdodCwgMH0sCi0gIHsiZGF0YSIsIHBhX2RhdGEsIDB9LAotICB7ImRvdWJsZSIsIHBhX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZW5kIiwgcGFfZW5kLCAwfSwKLSAgeyJlbmRfYnJ0YWIiLCBwYV9icnRhYiwgMH0sCi0gIHsiZW5kX3RyeSIsIHBhX3RyeSwgMH0sCi0gIHsiZW50ZXIiLCBwYV9lbnRlciwgMH0sCi0gIHsiZW50cnkiLCBwYV9lbnRyeSwgMH0sCi0gIHsiZXF1IiwgcGFfZXF1LCAwfSwKLSAgeyJleGl0IiwgcGFfZXhpdCwgMH0sCi0gIHsiZXhwb3J0IiwgcGFfZXhwb3J0LCAwfSwKLSAgeyJmaWxsIiwgcGFfZmlsbCwgMH0sCi0gIHsiZmxvYXQiLCBwYV9mbG9hdF9jb25zLCAnZid9LAotICB7ImhhbGYiLCBwYV9jb25zLCAyfSwKLSAgeyJpbXBvcnQiLCBwYV9pbXBvcnQsIDB9LAotICB7ImludCIsIHBhX2NvbnMsIDR9LAotICB7ImxhYmVsIiwgcGFfbGFiZWwsIDB9LAotICB7Imxjb21tIiwgcGFfbGNvbW0sIDB9LAotICB7ImxlYXZlIiwgcGFfbGVhdmUsIDB9LAotICB7ImxldmVsIiwgcGFfbGV2ZWwsIDB9LAotICB7ImxvbmciLCBwYV9jb25zLCA0fSwKLSAgeyJsc3ltIiwgcGFfbHN5bSwgMH0sCi0jaWZkZWYgT0JKX1NPTQotICB7Im5zdWJzcGEiLCBwYV9zdWJzcGFjZSwgMX0sCi0jZW5kaWYKLSAgeyJvY3RhIiwgcGFfY29ucywgMTZ9LAotICB7Im9yZyIsIHBhX29yaWdpbiwgMH0sCi0gIHsib3JpZ2luIiwgcGFfb3JpZ2luLCAwfSwKLSAgeyJwYXJhbSIsIHBhX3BhcmFtLCAwfSwKLSAgeyJwcm9jIiwgcGFfcHJvYywgMH0sCi0gIHsicHJvY2VuZCIsIHBhX3Byb2NlbmQsIDB9LAotICB7InF1YWQiLCBwYV9jb25zLCA4fSwKLSAgeyJyZWciLCBwYV9lcXUsIDF9LAotICB7InNob3J0IiwgcGFfY29ucywgMn0sCi0gIHsic2luZ2xlIiwgcGFfZmxvYXRfY29ucywgJ2YnfSwKLSNpZmRlZiBPQkpfU09NCi0gIHsic3BhY2UiLCBwYV9zcGFjZSwgMH0sCi0gIHsic3BudW0iLCBwYV9zcG51bSwgMH0sCi0jZW5kaWYKLSAgeyJzdHJpbmciLCBwYV9zdHJpbmdlciwgMH0sCi0gIHsic3RyaW5neiIsIHBhX3N0cmluZ2VyLCAxfSwKLSNpZmRlZiBPQkpfU09NCi0gIHsic3Vic3BhIiwgcGFfc3Vic3BhY2UsIDB9LAotI2VuZGlmCi0gIHsidGV4dCIsIHBhX3RleHQsIDB9LAotICB7InZlcnNpb24iLCBwYV92ZXJzaW9uLCAwfSwKLSAgeyJ3b3JkIiwgcGFfY29ucywgNH0sCi0gIHtOVUxMLCAwLCAwfQotfTsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dC4KLQotICAgTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4KLQotICAgQWxzbyBub3RlIHRoYXQgQyBzdHlsZSBjb21tZW50cyB3aWxsIGFsd2F5cyB3b3JrLiAqLwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcmFjdGVycyB3aGljaCBhY3QgYXMgbGluZSBzZXBhcmF0b3JzLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIhIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LgotICAgQXMgaW4gMGYxMi40NTYgb3IgMGQxLjIzNDVlMTIuCi0KLSAgIEJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYy4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhZSB0byBrbm93IGFib3UgaXQgYXQKLSAgIGFsbCwgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi1zdGF0aWMgc3RydWN0IHBhX2l0IHRoZV9pbnNuOwotCi0vKiBQb2ludHMgdG8gdGhlIGVuZCBvZiBhbiBleHByZXNzaW9uIGp1c3QgcGFyc2VkIGJ5IGdldF9leHByZXNzb2luCi0gICBhbmQgZnJpZW5kcy4gIEZJWE1FLiAgVGhpcyBzaG91bGRuJ3QgYmUgaGFuZGxlZCB3aXRoIGEgZmlsZS1nbG9iYWwKLSAgIHZhcmlhYmxlLiAgKi8KLXN0YXRpYyBjaGFyICpleHByX2VuZDsKLQotLyogTm9uemVybyBpZiBhIC5jYWxsaW5mbyBhcHBlYXJlZCB3aXRoaW4gdGhlIGN1cnJlbnQgcHJvY2VkdXJlLiAgKi8KLXN0YXRpYyBpbnQgY2FsbGluZm9fZm91bmQ7Ci0KLS8qIE5vbnplcm8gaWYgdGhlIGFzc2VtYmxlciBpcyBjdXJyZW50bHkgd2l0aGluIGEgLmVudHJ5Ly5leGl0IHBhaXIuICAqLwotc3RhdGljIGludCB3aXRoaW5fZW50cnlfZXhpdDsKLQotLyogTm9uemVybyBpZiB0aGUgYXNzZW1ibGVyIGlzIGN1cnJlbnRseSB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gICovCi1zdGF0aWMgaW50IHdpdGhpbl9wcm9jZWR1cmU7Ci0KLS8qIEhhbmRsZSBvbiBzdHJ1Y3V0cmUgd2hpY2gga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBzeW1ib2wKLSAgIHNlZW4gaW4gZWFjaCBzdWJzcGFjZS4gICovCi1zdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sc19yb290cCA9IE5VTEw7Ci0KLS8qIEhvbGRzIHRoZSBsYXN0IGZpZWxkIHNlbGVjdG9yLiAgKi8KLXN0YXRpYyBpbnQgaHBwYV9maWVsZF9zZWxlY3RvcjsKLQotI2lmZGVmIE9CSl9TT00KLS8qIEEgZHVtbXkgYmZkIHN5bWJvbCBzbyB0aGF0IGFsbCByZWxvY2F0aW9ucyBoYXZlIHN5bWJvbHMgb2Ygc29tZSBraW5kLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpkdW1teV9zeW1ib2w7Ci0jZW5kaWYKLQotLyogTm9uemVybyBpZiBlcnJvcnMgYXJlIHRvIGJlIHByaW50ZWQuICAqLwotc3RhdGljIGludCBwcmludF9lcnJvcnMgPSAxOwotCi0vKiBMaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBwcmUtZGVmaW5lZDoKLQotICAgRWFjaCBnZW5lcmFsIHJlZ2lzdGVyIGhhcyBvbmUgcHJlZGVmaW5lZCBuYW1lIG9mIHRoZSBmb3JtCi0gICAlcjxSRUdOVU0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPFJFR05VTT4uCi0KLSAgIFNwYWNlIGFuZCBjb250cm9sIHJlZ2lzdGVycyBhcmUgaGFuZGxlZCBpbiBhIHNpbWlsYXIgbWFubmVyLAotICAgYnV0IHVzZSAlc3I8UkVHTlVNPiBhbmQgJWNyPFJFR05VTT4gYXMgdGhlaXIgcHJlZGVmaW5lZCBuYW1lcy4KLQotICAgTGlrZXdpc2UgZm9yIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMsIGJ1dCBvZiB0aGUgZm9ybQotICAgJWZyPFJFR05VTT4uICBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgaGF2ZSBhZGRpdGlvbmFsIHByZWRlZmluZWQKLSAgIG5hbWVzIHdpdGggJ0wnIGFuZCAnUicgc3VmZml4ZXMgKGUuZy4gJWZyMTlMLCAlZnIxOVIpIHdoaWNoCi0gICBhZ2FpbiBoYXZlIHRoZSB2YWx1ZSA8UkVHTlVNPi4KLQotICAgTWFueSByZWdpc3RlcnMgYWxzbyBoYXZlIHN5bm9ueW1zOgotCi0gICAlcjI2IC0gJXIyMyBoYXZlICVhcmcwIC0gJWFyZzMgYXMgc3lub255bXMKLSAgICVyMjggLSAlcjI5IGhhdmUgJXJldDAgLSAlcmV0MSBhcyBzeW5vbnltcwotICAgJXIzMCBoYXMgJXNwIGFzIGEgc3lub255bQotICAgJXIyNyBoYXMgJWRwIGFzIGEgc3lub255bQotICAgJXIyICBoYXMgJXJwIGFzIGEgc3lub255bQotCi0gICBBbG1vc3QgZXZlcnkgY29udHJvbCByZWdpc3RlciBoYXMgYSBzeW5vbnltOyB0aGV5IGFyZSBub3QgbGlzdGVkCi0gICBoZXJlIGZvciBicmV2aXR5LgotCi0gICBUaGUgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwZF9yZWcgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW10gPQotewotICB7IiVhcmcwIiwgMjZ9LAotICB7IiVhcmcxIiwgMjV9LAotICB7IiVhcmcyIiwgMjR9LAotICB7IiVhcmczIiwgMjN9LAotICB7IiVjcjAiLCAwfSwKLSAgeyIlY3IxMCIsIDEwfSwKLSAgeyIlY3IxMSIsIDExfSwKLSAgeyIlY3IxMiIsIDEyfSwKLSAgeyIlY3IxMyIsIDEzfSwKLSAgeyIlY3IxNCIsIDE0fSwKLSAgeyIlY3IxNSIsIDE1fSwKLSAgeyIlY3IxNiIsIDE2fSwKLSAgeyIlY3IxNyIsIDE3fSwKLSAgeyIlY3IxOCIsIDE4fSwKLSAgeyIlY3IxOSIsIDE5fSwKLSAgeyIlY3IyMCIsIDIwfSwKLSAgeyIlY3IyMSIsIDIxfSwKLSAgeyIlY3IyMiIsIDIyfSwKLSAgeyIlY3IyMyIsIDIzfSwKLSAgeyIlY3IyNCIsIDI0fSwKLSAgeyIlY3IyNSIsIDI1fSwKLSAgeyIlY3IyNiIsIDI2fSwKLSAgeyIlY3IyNyIsIDI3fSwKLSAgeyIlY3IyOCIsIDI4fSwKLSAgeyIlY3IyOSIsIDI5fSwKLSAgeyIlY3IzMCIsIDMwfSwKLSAgeyIlY3IzMSIsIDMxfSwKLSAgeyIlY3I4IiwgOH0sCi0gIHsiJWNyOSIsIDl9LAotICB7IiVkcCIsIDI3fSwKLSAgeyIlZWllbSIsIDE1fSwKLSAgeyIlZWlyciIsIDIzfSwKLSAgeyIlZnIwIiwgMH0sCi0gIHsiJWZyMGwiLCAwfSwKLSAgeyIlZnIwciIsIDB9LAotICB7IiVmcjEiLCAxfSwKLSAgeyIlZnIxMCIsIDEwfSwKLSAgeyIlZnIxMGwiLCAxMH0sCi0gIHsiJWZyMTByIiwgMTB9LAotICB7IiVmcjExIiwgMTF9LAotICB7IiVmcjExbCIsIDExfSwKLSAgeyIlZnIxMXIiLCAxMX0sCi0gIHsiJWZyMTIiLCAxMn0sCi0gIHsiJWZyMTJsIiwgMTJ9LAotICB7IiVmcjEyciIsIDEyfSwKLSAgeyIlZnIxMyIsIDEzfSwKLSAgeyIlZnIxM2wiLCAxM30sCi0gIHsiJWZyMTNyIiwgMTN9LAotICB7IiVmcjE0IiwgMTR9LAotICB7IiVmcjE0bCIsIDE0fSwKLSAgeyIlZnIxNHIiLCAxNH0sCi0gIHsiJWZyMTUiLCAxNX0sCi0gIHsiJWZyMTVsIiwgMTV9LAotICB7IiVmcjE1ciIsIDE1fSwKLSAgeyIlZnIxNiIsIDE2fSwKLSAgeyIlZnIxNmwiLCAxNn0sCi0gIHsiJWZyMTZyIiwgMTZ9LAotICB7IiVmcjE3IiwgMTd9LAotICB7IiVmcjE3bCIsIDE3fSwKLSAgeyIlZnIxN3IiLCAxN30sCi0gIHsiJWZyMTgiLCAxOH0sCi0gIHsiJWZyMThsIiwgMTh9LAotICB7IiVmcjE4ciIsIDE4fSwKLSAgeyIlZnIxOSIsIDE5fSwKLSAgeyIlZnIxOWwiLCAxOX0sCi0gIHsiJWZyMTlyIiwgMTl9LAotICB7IiVmcjFsIiwgMX0sCi0gIHsiJWZyMXIiLCAxfSwKLSAgeyIlZnIyIiwgMn0sCi0gIHsiJWZyMjAiLCAyMH0sCi0gIHsiJWZyMjBsIiwgMjB9LAotICB7IiVmcjIwciIsIDIwfSwKLSAgeyIlZnIyMSIsIDIxfSwKLSAgeyIlZnIyMWwiLCAyMX0sCi0gIHsiJWZyMjFyIiwgMjF9LAotICB7IiVmcjIyIiwgMjJ9LAotICB7IiVmcjIybCIsIDIyfSwKLSAgeyIlZnIyMnIiLCAyMn0sCi0gIHsiJWZyMjMiLCAyM30sCi0gIHsiJWZyMjNsIiwgMjN9LAotICB7IiVmcjIzciIsIDIzfSwKLSAgeyIlZnIyNCIsIDI0fSwKLSAgeyIlZnIyNGwiLCAyNH0sCi0gIHsiJWZyMjRyIiwgMjR9LAotICB7IiVmcjI1IiwgMjV9LAotICB7IiVmcjI1bCIsIDI1fSwKLSAgeyIlZnIyNXIiLCAyNX0sCi0gIHsiJWZyMjYiLCAyNn0sCi0gIHsiJWZyMjZsIiwgMjZ9LAotICB7IiVmcjI2ciIsIDI2fSwKLSAgeyIlZnIyNyIsIDI3fSwKLSAgeyIlZnIyN2wiLCAyN30sCi0gIHsiJWZyMjdyIiwgMjd9LAotICB7IiVmcjI4IiwgMjh9LAotICB7IiVmcjI4bCIsIDI4fSwKLSAgeyIlZnIyOHIiLCAyOH0sCi0gIHsiJWZyMjkiLCAyOX0sCi0gIHsiJWZyMjlsIiwgMjl9LAotICB7IiVmcjI5ciIsIDI5fSwKLSAgeyIlZnIybCIsIDJ9LAotICB7IiVmcjJyIiwgMn0sCi0gIHsiJWZyMyIsIDN9LAotICB7IiVmcjMwIiwgMzB9LAotICB7IiVmcjMwbCIsIDMwfSwKLSAgeyIlZnIzMHIiLCAzMH0sCi0gIHsiJWZyMzEiLCAzMX0sCi0gIHsiJWZyMzFsIiwgMzF9LAotICB7IiVmcjMxciIsIDMxfSwKLSAgeyIlZnIzbCIsIDN9LAotICB7IiVmcjNyIiwgM30sCi0gIHsiJWZyNCIsIDR9LAotICB7IiVmcjRsIiwgNH0sCi0gIHsiJWZyNHIiLCA0fSwKLSAgeyIlZnI1IiwgNX0sCi0gIHsiJWZyNWwiLCA1fSwKLSAgeyIlZnI1ciIsIDV9LAotICB7IiVmcjYiLCA2fSwKLSAgeyIlZnI2bCIsIDZ9LAotICB7IiVmcjZyIiwgNn0sCi0gIHsiJWZyNyIsIDd9LAotICB7IiVmcjdsIiwgN30sCi0gIHsiJWZyN3IiLCA3fSwKLSAgeyIlZnI4IiwgOH0sCi0gIHsiJWZyOGwiLCA4fSwKLSAgeyIlZnI4ciIsIDh9LAotICB7IiVmcjkiLCA5fSwKLSAgeyIlZnI5bCIsIDl9LAotICB7IiVmcjlyIiwgOX0sCi0gIHsiJWh0YSIsIDI1fSwKLSAgeyIlaWlyIiwgMTl9LAotICB7IiVpb3IiLCAyMX0sCi0gIHsiJWlwc3ciLCAyMn0sCi0gIHsiJWlzciIsIDIwfSwKLSAgeyIlaXRtciIsIDE2fSwKLSAgeyIlaXZhIiwgMTR9LAotICB7IiVwY29xIiwgMTh9LAotICB7IiVwY3NxIiwgMTd9LAotICB7IiVwaWRyMSIsIDh9LAotICB7IiVwaWRyMiIsIDl9LAotICB7IiVwaWRyMyIsIDEyfSwKLSAgeyIlcGlkcjQiLCAxM30sCi0gIHsiJXBwZGEiLCAyNH0sCi0gIHsiJXIwIiwgMH0sCi0gIHsiJXIxIiwgMX0sCi0gIHsiJXIxMCIsIDEwfSwKLSAgeyIlcjExIiwgMTF9LAotICB7IiVyMTIiLCAxMn0sCi0gIHsiJXIxMyIsIDEzfSwKLSAgeyIlcjE0IiwgMTR9LAotICB7IiVyMTUiLCAxNX0sCi0gIHsiJXIxNiIsIDE2fSwKLSAgeyIlcjE3IiwgMTd9LAotICB7IiVyMTgiLCAxOH0sCi0gIHsiJXIxOSIsIDE5fSwKLSAgeyIlcjIiLCAyfSwKLSAgeyIlcjIwIiwgMjB9LAotICB7IiVyMjEiLCAyMX0sCi0gIHsiJXIyMiIsIDIyfSwKLSAgeyIlcjIzIiwgMjN9LAotICB7IiVyMjQiLCAyNH0sCi0gIHsiJXIyNSIsIDI1fSwKLSAgeyIlcjI2IiwgMjZ9LAotICB7IiVyMjciLCAyN30sCi0gIHsiJXIyOCIsIDI4fSwKLSAgeyIlcjI5IiwgMjl9LAotICB7IiVyMyIsIDN9LAotICB7IiVyMzAiLCAzMH0sCi0gIHsiJXIzMSIsIDMxfSwKLSAgeyIlcjQiLCA0fSwKLSAgeyIlcjUiLCA1fSwKLSAgeyIlcjYiLCA2fSwKLSAgeyIlcjciLCA3fSwKLSAgeyIlcjgiLCA4fSwKLSAgeyIlcjkiLCA5fSwKLSAgeyIlcmN0ciIsIDB9LAotICB7IiVyZXQwIiwgMjh9LAotICB7IiVyZXQxIiwgMjl9LAotICB7IiVycCIsIDJ9LAotICB7IiVzYXIiLCAxMX0sCi0gIHsiJXNwIiwgMzB9LAotICB7IiVzcjAiLCAwfSwKLSAgeyIlc3IxIiwgMX0sCi0gIHsiJXNyMiIsIDJ9LAotICB7IiVzcjMiLCAzfSwKLSAgeyIlc3I0IiwgNH0sCi0gIHsiJXNyNSIsIDV9LAotICB7IiVzcjYiLCA2fSwKLSAgeyIlc3I3IiwgN30sCi0gIHsiJXRyMCIsIDI0fSwKLSAgeyIldHIxIiwgMjV9LAotICB7IiV0cjIiLCAyNn0sCi0gIHsiJXRyMyIsIDI3fSwKLSAgeyIldHI0IiwgMjh9LAotICB7IiV0cjUiLCAyOX0sCi0gIHsiJXRyNiIsIDMwfSwKLSAgeyIldHI3IiwgMzF9Ci19OwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZCBieSBvcmRlciBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuIFRoaXMgaXMKLSAgIHNvIHdlIGNoZWNrIGZvciA8PiBiZWZvcmUgd2UgY2hlY2sgZm9yIDwuIElmIHdlIGhhZCBhIDw+IGFuZCBjaGVja2VkCi0gICBmb3IgPCBmaXJzdCwgd2Ugd291bGQgZ2V0IGEgZmFsc2UgbWF0Y2guICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmcF9jb25kX21hcCBmcF9jb25kX21hcFtdID0KLXsKLSAgeyJmYWxzZT8iLCAwfSwKLSAgeyJmYWxzZSIsIDF9LAotICB7InRydWU/IiwgMzB9LAotICB7InRydWUiLCAzMX0sCi0gIHsiITw9PiIsIDN9LAotICB7IiE/Pj0iLCA4fSwKLSAgeyIhPzw9IiwgMTZ9LAotICB7IiE8PiIsIDd9LAotICB7IiE+PSIsIDExfSwKLSAgeyIhPz4iLCAxMn0sCi0gIHsiPzw9IiwgMTR9LAotICB7IiE8PSIsIDE5fSwKLSAgeyIhPzwiLCAyMH0sCi0gIHsiPz49IiwgMjJ9LAotICB7IiE/PSIsIDI0fSwKLSAgeyIhPXQiLCAyN30sCi0gIHsiPD0+IiwgMjl9LAotICB7Ij10IiwgNX0sCi0gIHsiPz0iLCA2fSwKLSAgeyI/PCIsIDEwfSwKLSAgeyI8PSIsIDEzfSwKLSAgeyIhPiIsIDE1fSwKLSAgeyI/PiIsIDE4fSwKLSAgeyI+PSIsIDIxfSwKLSAgeyIhPCIsIDIzfSwKLSAgeyI8PiIsIDI1fSwKLSAgeyIhPSIsIDI2fSwKLSAgeyIhPyIsIDI4fSwKLSAgeyI/IiwgMn0sCi0gIHsiPSIsIDR9LAotICB7IjwiLCA5fSwKLSAgeyI+IiwgMTd9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlbGVjdG9yX2VudHJ5IHNlbGVjdG9yX3RhYmxlW10gPQotewotICB7ImYiLCBlX2ZzZWx9LAotICB7ImwiLCBlX2xzZWx9LAotICB7ImxkIiwgZV9sZHNlbH0sCi0gIHsibHAiLCBlX2xwc2VsfSwKLSAgeyJsciIsIGVfbHJzZWx9LAotICB7ImxzIiwgZV9sc3NlbH0sCi0gIHsibHQiLCBlX2x0c2VsfSwKLSAgeyJuIiwgZV9uc2VsfSwKLSAgeyJubCIsIGVfbmxzZWx9LAotICB7Im5sciIsIGVfbmxyc2VsfSwKLSAgeyJwIiwgZV9wc2VsfSwKLSAgeyJyIiwgZV9yc2VsfSwKLSAgeyJyZCIsIGVfcmRzZWx9LAotICB7InJwIiwgZV9ycHNlbH0sCi0gIHsicnIiLCBlX3Jyc2VsfSwKLSAgeyJycyIsIGVfcnNzZWx9LAotICB7InJ0IiwgZV9ydHNlbH0sCi0gIHsidCIsIGVfdHNlbH0sCi19OwotCi0jaWZkZWYgT0JKX1NPTQotLyogZGVmYXVsdCBzcGFjZSBhbmQgc3Vic3BhY2UgZGljdGlvbmFyaWVzICovCi0KLSNkZWZpbmUgR0RCX1NZTUJPTFMgICAgICAgICAgR0RCX1NZTUJPTFNfU1VCU1BBQ0VfTkFNRQotI2RlZmluZSBHREJfU1RSSU5HUyAgICAgICAgICBHREJfU1RSSU5HU19TVUJTUEFDRV9OQU1FCi0KLS8qIHByZS1kZWZpbmVkIHN1YnNlZ21lbnRzIChzdWJzcGFjZXMpIGZvciB0aGUgSFBQQS4gICovCi0jZGVmaW5lIFNVQlNFR19DT0RFICAgMAotI2RlZmluZSBTVUJTRUdfTElUICAgIDEKLSNkZWZpbmUgU1VCU0VHX01JTExJICAyCi0jZGVmaW5lIFNVQlNFR19EQVRBICAgMAotI2RlZmluZSBTVUJTRUdfQlNTICAgIDIKLSNkZWZpbmUgU1VCU0VHX1VOV0lORCAzCi0jZGVmaW5lIFNVQlNFR19HREJfU1RSSU5HUyAwCi0jZGVmaW5lIFNVQlNFR19HREJfU1lNQk9MUyAxCi0KLXN0YXRpYyBzdHJ1Y3QgZGVmYXVsdF9zdWJzcGFjZV9kaWN0IHBhX2RlZl9zdWJzcGFjZXNbXSA9Ci17Ci0gIHsiJENPREUkIiwgMSwgMSwgMSwgMCwgMCwgMCwgMjQsIDB4MmMsIDAsIDgsIDAsIDAsIFNVQlNFR19DT0RFfSwKLSAgeyIkREFUQSQiLCAxLCAxLCAwLCAwLCAwLCAwLCAyNCwgMHgxZiwgMSwgOCwgMSwgMSwgU1VCU0VHX0RBVEF9LAotICB7IiRMSVQkIiwgMSwgMSwgMCwgMCwgMCwgMCwgMTYsIDB4MmMsIDAsIDgsIDAsIDAsIFNVQlNFR19MSVR9LAotICB7IiRNSUxMSUNPREUkIiwgMSwgMSwgMCwgMCwgMCwgMCwgOCwgMHgyYywgMCwgOCwgMCwgMCwgU1VCU0VHX01JTExJfSwKLSAgeyIkQlNTJCIsIDEsIDEsIDAsIDAsIDAsIDEsIDgwLCAweDFmLCAxLCA4LCAxLCAxLCBTVUJTRUdfQlNTfSwKLSAge05VTEwsIDAsIDEsIDAsIDAsIDAsIDAsIDI1NSwgMHgxZiwgMCwgNCwgMCwgMCwgMH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGVmYXVsdF9zcGFjZV9kaWN0IHBhX2RlZl9zcGFjZXNbXSA9Ci17Ci0gIHsiJFRFWFQkIiwgMCwgMSwgMSwgMCwgOCwgQVNFQ19OVUxMfSwKLSAgeyIkUFJJVkFURSQiLCAxLCAxLCAxLCAxLCAxNiwgQVNFQ19OVUxMfSwKLSAge05VTEwsIDAsIDAsIDAsIDAsIDAsIEFTRUNfTlVMTH0KLX07Ci0KLS8qIE1pc2MgbG9jYWwgZGVmaW5pdGlvbnMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotLyogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIHRvIG1haW50YWluIHNwYWNlcy9zdWJzcGFjZXMuICAqLwotI2RlZmluZSBTUEFDRV9ERUZJTkVEKHNwYWNlX2NoYWluKQkoc3BhY2VfY2hhaW4pLT5zZF9kZWZpbmVkCi0jZGVmaW5lIFNQQUNFX1VTRVJfREVGSU5FRChzcGFjZV9jaGFpbikgKHNwYWNlX2NoYWluKS0+c2RfdXNlcl9kZWZpbmVkCi0jZGVmaW5lIFNQQUNFX1NQTlVNKHNwYWNlX2NoYWluKQkoc3BhY2VfY2hhaW4pLT5zZF9zcG51bQotI2RlZmluZSBTUEFDRV9OQU1FKHNwYWNlX2NoYWluKQkJKHNwYWNlX2NoYWluKS0+c2RfbmFtZQotCi0jZGVmaW5lIFNVQlNQQUNFX0RFRklORUQoc3NfY2hhaW4pCShzc19jaGFpbiktPnNzZF9kZWZpbmVkCi0jZGVmaW5lIFNVQlNQQUNFX05BTUUoc3NfY2hhaW4pCQkoc3NfY2hhaW4pLT5zc2RfbmFtZQotI2VuZGlmCi0KLS8qIFJldHVybiBub256ZXJvIGlmIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBTIHBvdGVudGlhbGx5IHJlcHJlc2VudHMKLSAgIGEgcmlnaHQgb3IgbGVmdCBoYWxmIG9mIGEgRlAgcmVnaXN0ZXIgICovCi0jZGVmaW5lIElTX1JfU0VMRUNUKFMpICAgKCooUykgPT0gJ1InIHx8ICooUykgPT0gJ3InKQotI2RlZmluZSBJU19MX1NFTEVDVChTKSAgICgqKFMpID09ICdMJyB8fCAqKFMpID09ICdsJykKLQotLyogSW5zZXJ0IEZJRUxEIGludG8gT1BDT0RFIHN0YXJ0aW5nIGF0IGJpdCBTVEFSVC4gIENvbnRpbnVlIHBhX2lwCi0gICBtYWluIGxvb3AgYWZ0ZXIgaW5zZXJ0aW9uLiAgKi8KLQotI2RlZmluZSBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFKE9QQ09ERSwgRklFTEQsIFNUQVJUKSBcCi0gIHsgXAotICAgICgoT1BDT0RFKSB8PSAoRklFTEQpIDw8IChTVEFSVCkpOyBcCi0gICAgY29udGludWU7IFwKLSAgfQotCi0vKiBTaW1wbGUgcmFuZ2UgY2hlY2tpbmcgZm9yIEZJRUxEIGFnYWludCBISUdIIGFuZCBMT1cgYm91bmRzLgotICAgSUdOT1JFIGlzIHVzZWQgdG8gc3VwcHJlc3MgdGhlIGVycm9yIG1lc3NhZ2UuICAqLwotCi0jZGVmaW5lIENIRUNLX0ZJRUxEKEZJRUxELCBISUdILCBMT1csIElHTk9SRSkgXAotICB7IFwKLSAgICBpZiAoKEZJRUxEKSA+IChISUdIKSB8fCAoRklFTEQpIDwgKExPVykpIFwKLSAgICAgIHsgXAotCWlmICghIElHTk9SRSkgXAotICAgICAgICAgIGFzX2JhZCAoXygiRmllbGQgb3V0IG9mIHJhbmdlIFslZC4uJWRdICglZCkuIiksIChMT1cpLCAoSElHSCksIFwKLQkJICAoaW50KSAoRklFTEQpKTtcCi0gICAgICAgIGJyZWFrOyBcCi0gICAgICB9IFwKLSAgfQotCi0jZGVmaW5lIGlzX0RQX3JlbGF0aXZlKGV4cCkJCQlcCi0gICgoZXhwKS5YX29wID09IE9fc3VidHJhY3QJCQlcCi0gICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKChleHApLlhfb3Bfc3ltYm9sKSwgIiRnbG9iYWwkIikgPT0gMCkKLQotI2RlZmluZSBpc19QQ19yZWxhdGl2ZShleHApCQkJXAotICAoKGV4cCkuWF9vcCA9PSBPX3N1YnRyYWN0CQkJXAotICAgJiYgc3RyY21wIChTX0dFVF9OQU1FICgoZXhwKS5YX29wX3N5bWJvbCksICIkUElDX3BjcmVsJDAiKSA9PSAwKQotCi0vKiBXZSBuZWVkIHNvbWUgY29tcGxleCBoYW5kbGluZyBmb3Igc3RhYnMgKHN5bTEgLSBzeW0yKS4gIEx1Y2tpbHksIHdlJ2xsCi0gICBhbHdheXMgYmUgYWJsZSB0byByZWR1Y2UgdGhlIGV4cHJlc3Npb24gdG8gYSBjb25zdGFudCwgc28gd2UgZG9uJ3QKLSAgIG5lZWQgcmVhbCBjb21wbGV4IGhhbmRsaW5nIHlldC4gICovCi0jZGVmaW5lIGlzX2NvbXBsZXgoZXhwKQkJCQlcCi0gICgoZXhwKS5YX29wICE9IE9fY29uc3RhbnQgJiYgKGV4cCkuWF9vcCAhPSBPX3N5bWJvbCkKLQotLyogQWN0dWFsIGZ1bmN0aW9ucyB0byBpbXBsZW1lbnQgdGhlIFBBIHNwZWNpZmljIGNvZGUgZm9yIHRoZSBhc3NlbWJsZXIuICAqLwotCi0vKiBDYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLiAgTWFrZSBzdXJlIGVudHJ5L2V4aXQgYW5kCi0gICBwcm9jL3Byb2NlbmQgcGFpcnMgbWF0Y2guICAqLwotCi12b2lkCi1wYV9jaGVja19lb2YgKCkKLXsKLSAgaWYgKHdpdGhpbl9lbnRyeV9leGl0KQotICAgIGFzX2ZhdGFsIChfKCJNaXNzaW5nIC5leGl0XG4iKSk7Ci0KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUpCi0gICAgYXNfZmF0YWwgKF8oIk1pc3NpbmcgLnByb2NlbmRcbiIpKTsKLX0KLQotLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgZm9yIHRoZSBjdXJyZW50IHNwYWNlLgotICAgb3IgTlVMTCBpZiBubyBsYWJlbF9zeW1ib2xfc3RydWN0IGV4aXN0cyBmb3IgdGhlIGN1cnJlbnQgc3BhY2UuICAqLwotCi1zdGF0aWMgbGFiZWxfc3ltYm9sX3N0cnVjdCAqCi1wYV9nZXRfbGFiZWwgKCkKLXsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfY2hhaW47Ci0KLSAgZm9yIChsYWJlbF9jaGFpbiA9IGxhYmVsX3N5bWJvbHNfcm9vdHA7Ci0gICAgICAgbGFiZWxfY2hhaW47Ci0gICAgICAgbGFiZWxfY2hhaW4gPSBsYWJlbF9jaGFpbi0+bHNzX25leHQpCi0gICAgewotI2lmZGVmIE9CSl9TT00KLSAgICBpZiAoY3VycmVudF9zcGFjZSA9PSBsYWJlbF9jaGFpbi0+bHNzX3NwYWNlICYmIGxhYmVsX2NoYWluLT5sc3NfbGFiZWwpCi0gICAgICByZXR1cm4gbGFiZWxfY2hhaW47Ci0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi0gICAgaWYgKG5vd19zZWcgPT0gbGFiZWxfY2hhaW4tPmxzc19zZWdtZW50ICYmIGxhYmVsX2NoYWluLT5sc3NfbGFiZWwpCi0gICAgICByZXR1cm4gbGFiZWxfY2hhaW47Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIERlZmluZXMgYSBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgc3BhY2UuICBJZiBvbmUgaXMgYWxyZWFkeSBkZWZpbmVkLAotICAgdGhpcyBmdW5jdGlvbiB3aWxsIHJlcGxhY2UgaXQgd2l0aCB0aGUgbmV3IGxhYmVsLiAgKi8KLQotdm9pZAotcGFfZGVmaW5lX2xhYmVsIChzeW1ib2wpCi0gICAgIHN5bWJvbFMgKnN5bWJvbDsKLXsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfY2hhaW4gPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgaWYgKGxhYmVsX2NoYWluKQotICAgIGxhYmVsX2NoYWluLT5sc3NfbGFiZWwgPSBzeW1ib2w7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgYSBuZXcgbGFiZWwgZW50cnkgYW5kIGFkZCBpdCB0byB0aGUgaGVhZCBvZiB0aGUgY2hhaW4uICAqLwotICAgICAgbGFiZWxfY2hhaW4KLQk9IChsYWJlbF9zeW1ib2xfc3RydWN0ICopIHhtYWxsb2MgKHNpemVvZiAobGFiZWxfc3ltYm9sX3N0cnVjdCkpOwotICAgICAgbGFiZWxfY2hhaW4tPmxzc19sYWJlbCA9IHN5bWJvbDsKLSNpZmRlZiBPQkpfU09NCi0gICAgICBsYWJlbF9jaGFpbi0+bHNzX3NwYWNlID0gY3VycmVudF9zcGFjZTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGxhYmVsX2NoYWluLT5sc3Nfc2VnbWVudCA9IG5vd19zZWc7Ci0jZW5kaWYKLSAgICAgIGxhYmVsX2NoYWluLT5sc3NfbmV4dCA9IE5VTEw7Ci0KLSAgICAgIGlmIChsYWJlbF9zeW1ib2xzX3Jvb3RwKQotCWxhYmVsX2NoYWluLT5sc3NfbmV4dCA9IGxhYmVsX3N5bWJvbHNfcm9vdHA7Ci0KLSAgICAgIGxhYmVsX3N5bWJvbHNfcm9vdHAgPSBsYWJlbF9jaGFpbjsKLSAgICB9Ci19Ci0KLS8qIFJlbW92ZXMgYSBsYWJlbCBkZWZpbml0aW9uIGZvciB0aGUgY3VycmVudCBzcGFjZS4KLSAgIElmIHRoZXJlIGlzIG5vIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgZW50cnksIHRoZW4gbm8gYWN0aW9uIGlzIHRha2VuLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3VuZGVmaW5lX2xhYmVsICgpCi17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX2NoYWluOwotICBsYWJlbF9zeW1ib2xfc3RydWN0ICpwcmV2X2xhYmVsX2NoYWluID0gTlVMTDsKLQotICBmb3IgKGxhYmVsX2NoYWluID0gbGFiZWxfc3ltYm9sc19yb290cDsKLSAgICAgICBsYWJlbF9jaGFpbjsKLSAgICAgICBsYWJlbF9jaGFpbiA9IGxhYmVsX2NoYWluLT5sc3NfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoMQotI2lmZGVmIE9CSl9TT00KLSAJICAmJiBjdXJyZW50X3NwYWNlID09IGxhYmVsX2NoYWluLT5sc3Nfc3BhY2UgJiYgbGFiZWxfY2hhaW4tPmxzc19sYWJlbAotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotIAkgICYmIG5vd19zZWcgPT0gbGFiZWxfY2hhaW4tPmxzc19zZWdtZW50ICYmIGxhYmVsX2NoYWluLT5sc3NfbGFiZWwKLSNlbmRpZgotCSAgKQotCXsKLQkgIC8qIFJlbW92ZSB0aGUgbGFiZWwgZnJvbSB0aGUgY2hhaW4gYW5kIGZyZWUgaXRzIG1lbW9yeS4gICovCi0JICBpZiAocHJldl9sYWJlbF9jaGFpbikKLQkgICAgcHJldl9sYWJlbF9jaGFpbi0+bHNzX25leHQgPSBsYWJlbF9jaGFpbi0+bHNzX25leHQ7Ci0JICBlbHNlCi0JICAgIGxhYmVsX3N5bWJvbHNfcm9vdHAgPSBsYWJlbF9jaGFpbi0+bHNzX25leHQ7Ci0KLQkgIGZyZWUgKGxhYmVsX2NoYWluKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByZXZfbGFiZWxfY2hhaW4gPSBsYWJlbF9jaGFpbjsKLSAgICB9Ci19Ci0KLQotLyogQW4gSFBQQS1zcGVjaWZpYyB2ZXJzaW9uIG9mIGZpeF9uZXcuICBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIEhQUEEKLSAgIGNvZGUgbmVlZHMgdG8ga2VlcCB0cmFjayBvZiBzb21lIGV4dHJhIHN0dWZmLiAgRWFjaCBjYWxsIHRvIGZpeF9uZXdfaHBwYQotICAgcmVzdWx0cyBpbiB0aGUgY3JlYXRpb24gb2YgYW4gaW5zdGFuY2Ugb2YgYW4gaHBwYV9maXhfc3RydWN0LiAgQW4KLSAgIGhwcGFfZml4X3N0cnVjdCBzdG9yZXMgdGhlIGV4dHJhIGluZm9ybWF0aW9uIGFsb25nIHdpdGggYSBwb2ludGVyIHRvIHRoZQotICAgb3JpZ2luYWwgZml4Uy4gIFRoaXMgaXMgYXR0YWNoZWQgdG8gdGhlIG9yaWdpbmFsIGZpeHVwIHZpYSB0aGUKLSAgIHRjX2ZpeF9kYXRhIGZpZWxkLiAgKi8KLQotc3RhdGljIHZvaWQKLWZpeF9uZXdfaHBwYSAoZnJhZywgd2hlcmUsIHNpemUsIGFkZF9zeW1ib2wsIG9mZnNldCwgZXhwLCBwY3JlbCwKLQkgICAgICByX3R5cGUsIHJfZmllbGQsIHJfZm9ybWF0LCBhcmdfcmVsb2MsIHVud2luZF9iaXRzKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgc2l6ZTsKLSAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsKLSAgICAgbG9uZyBvZmZzZXQ7Ci0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCBwY3JlbDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsKLSAgICAgZW51bSBocHBhX3JlbG9jX2ZpZWxkX3NlbGVjdG9yX3R5cGVfYWx0IHJfZmllbGQ7Ci0gICAgIGludCByX2Zvcm1hdDsKLSAgICAgbG9uZyBhcmdfcmVsb2M7Ci0gICAgIGludCogdW53aW5kX2JpdHM7Ci17Ci0gIGZpeFMgKm5ld19maXg7Ci0KLSAgc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqaHBwYV9maXggPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKQotICBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHNpemVvZiAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCkpOwotCi0gIGlmIChleHAgIT0gTlVMTCkKLSAgICBuZXdfZml4ID0gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLCByX3R5cGUpOwotICBlbHNlCi0gICAgbmV3X2ZpeCA9IGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBhZGRfc3ltYm9sLCBvZmZzZXQsIHBjcmVsLCByX3R5cGUpOwotICBuZXdfZml4LT50Y19maXhfZGF0YSA9ICh2b2lkICopIGhwcGFfZml4OwotICBocHBhX2ZpeC0+Znhfcl90eXBlID0gcl90eXBlOwotICBocHBhX2ZpeC0+Znhfcl9maWVsZCA9IHJfZmllbGQ7Ci0gIGhwcGFfZml4LT5meF9yX2Zvcm1hdCA9IHJfZm9ybWF0OwotICBocHBhX2ZpeC0+ZnhfYXJnX3JlbG9jID0gYXJnX3JlbG9jOwotICBocHBhX2ZpeC0+c2VnbWVudCA9IG5vd19zZWc7Ci0jaWZkZWYgT0JKX1NPTQotICBpZiAocl90eXBlID09IFJfRU5UUlkgfHwgcl90eXBlID09IFJfRVhJVCkKLSAgICBuZXdfZml4LT5meF9vZmZzZXQgPSAqdW53aW5kX2JpdHM7Ci0jZW5kaWYKLQotICAvKiBmb28tJGdsb2JhbCQgaXMgdXNlZCB0byBhY2Nlc3Mgbm9uLWF1dG9tYXRpYyBzdG9yYWdlLiAgJGdsb2JhbCQKLSAgICAgaXMgcmVhbGx5IGp1c3QgYSBtYXJrZXIgYW5kIGhhcyBzZXJ2ZWQgaXRzIHB1cnBvc2UsIHNvIGVsaW1pbmF0ZQotICAgICBpdCBub3cgc28gYXMgbm90IHRvIGNvbmZ1c2Ugd3JpdGUuYy4gICovCi0gIGlmIChuZXdfZml4LT5meF9zdWJzeQotICAgICAgJiYgIXN0cmNtcCAoU19HRVRfTkFNRSAobmV3X2ZpeC0+Znhfc3Vic3kpLCAiJGdsb2JhbCQiKSkKLSAgICBuZXdfZml4LT5meF9zdWJzeSA9IE5VTEw7Ci19Ci0KLS8qIFBhcnNlIGEgLmJ5dGUsIC53b3JkLCAubG9uZyBleHByZXNzaW9uIGZvciB0aGUgSFBQQS4gIENhbGxlZCBieQotICAgY29ucyB2aWEgdGhlIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTiBtYWNyby4gICovCi0KLXZvaWQKLXBhcnNlX2NvbnNfZXhwcmVzc2lvbl9ocHBhIChleHApCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci17Ci0gIGhwcGFfZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotICBleHByZXNzaW9uIChleHApOwotfQotCi0vKiBUaGlzIGZpeF9uZXcgaXMgY2FsbGVkIGJ5IGNvbnMgdmlhIFRDX0NPTlNfRklYX05FVy4KLSAgIGhwcGFfZmllbGRfc2VsZWN0b3IgaXMgc2V0IGJ5IHRoZSBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYS4gICovCi0KLXZvaWQKLWNvbnNfZml4X25ld19ocHBhIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICBpbnQgc2l6ZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgdW5zaWduZWQgaW50IHJlbF90eXBlOwotCi0gIC8qIEdldCBhIGJhc2UgcmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgaWYgKGlzX0RQX3JlbGF0aXZlICgqZXhwKSkKLSAgICByZWxfdHlwZSA9IFJfSFBQQV9HT1RPRkY7Ci0gIGVsc2UgaWYgKGlzX2NvbXBsZXggKCpleHApKQotICAgIHJlbF90eXBlID0gUl9IUFBBX0NPTVBMRVg7Ci0gIGVsc2UKLSAgICByZWxfdHlwZSA9IFJfSFBQQTsKLQotICBpZiAoaHBwYV9maWVsZF9zZWxlY3RvciAhPSBlX3BzZWwgJiYgaHBwYV9maWVsZF9zZWxlY3RvciAhPSBlX2ZzZWwpCi0gICAgYXNfd2FybiAoXygiSW52YWxpZCBmaWVsZCBzZWxlY3Rvci4gIEFzc3VtaW5nIEYlJS4iKSk7Ci0KLSAgZml4X25ld19ocHBhIChmcmFnLCB3aGVyZSwgc2l6ZSwKLQkJKHN5bWJvbFMgKikgTlVMTCwgKG9mZnNldFQpIDAsIGV4cCwgMCwgcmVsX3R5cGUsCi0JCWhwcGFfZmllbGRfc2VsZWN0b3IsIDMyLCAwLCBOVUxMKTsKLQotICAvKiBSZXNldCBmaWVsZCBzZWxlY3RvciB0byBpdHMgZGVmYXVsdCBzdGF0ZS4gICovCi0gIGhwcGFfZmllbGRfc2VsZWN0b3IgPSAwOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIGludCBsb3NlID0gMDsKLSAgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIGxhc3RfY2FsbF9pbmZvID0gTlVMTDsKLSAgY2FsbF9pbmZvX3Jvb3QgPSBOVUxMOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCBtYWNoaW5lIHR5cGUuICAqLwotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDEwKSkKLSAgICBhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQotICAvKiBGb2xkaW5nIG9mIHRleHQgYW5kIGRhdGEgc2VnbWVudHMgZmFpbHMgbWlzZXJhYmx5IG9uIHRoZSBQQS4KLSAgICAgV2FybiB1c2VyIGFuZCBkaXNhYmxlICItUiIgb3B0aW9uLiAgKi8KLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi1SIG9wdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgdGFyZ2V0LiIpKTsKLSAgICAgIGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0ID0gMDsKLSAgICB9Ci0KLSNpZmRlZiBPQkpfU09NCi0gIHBhX3NwYWNlc19iZWdpbiAoKTsKLSNlbmRpZgotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICB3aGlsZSAoaSA8IE5VTU9QQ09ERVMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHBhX29wY29kZXNbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAoc3RydWN0IHBhX29wY29kZSAqKSAmcGFfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwgJiYgKnJldHZhbCAhPSAnXDAnKQotCXsKLQkgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksIG5hbWUsIHJldHZhbCk7Ci0JICBsb3NlID0gMTsKLQl9Ci0gICAgICBkbwotCXsKLQkgIGlmICgocGFfb3Bjb2Rlc1tpXS5tYXRjaCAmIHBhX29wY29kZXNbaV0ubWFzaykKLQkgICAgICAhPSBwYV9vcGNvZGVzW2ldLm1hdGNoKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogbG9zaW5nIG9wY29kZTogYCVzJyBcIiVzXCJcbiIpLAotCQkgICAgICAgcGFfb3Bjb2Rlc1tpXS5uYW1lLCBwYV9vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCBOVU1PUENPREVTICYmICFzdHJjbXAgKHBhX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpOwotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFNPTSB3aWxsIGNoYW5nZSB0ZXh0X3NlY3Rpb24uICBUbyBtYWtlIHN1cmUgd2UgbmV2ZXIgcHV0Ci0gICAgIGFueXRoaW5nIGludG8gdGhlIG9sZCBvbmUgc3dpdGNoIHRvIHRoZSBuZXcgb25lIG5vdy4gICovCi0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLSAgZHVtbXlfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoIkwkZHVtbXkiKTsKLSAgU19TRVRfU0VHTUVOVCAoZHVtbXlfc3ltYm9sLCB0ZXh0X3NlY3Rpb24pOwotICAvKiBGb3JjZSB0aGUgc3ltYm9sIHRvIGJlIGNvbnZlcnRlZCB0byBhIHJlYWwgc3ltYm9sLiAqLwotICAodm9pZCkgc3ltYm9sX2dldF9iZmRzeW0gKGR1bW15X3N5bWJvbCk7IAotI2VuZGlmCi19Ci0KLS8qIEFzc2VtYmxlIGEgc2luZ2xlIGluc3RydWN0aW9uIHN0b3JpbmcgaXQgaW50byBhIGZyYWcuICAqLwotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICp0bzsKLQotICAvKiBUaGUgaGFkIGJldHRlciBiZSBzb21ldGhpbmcgdG8gYXNzZW1ibGUuICAqLwotICBhc3NlcnQgKHN0cik7Ci0KLSAgLyogSWYgd2UgYXJlIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLCBtYWtlIHN1cmUgd2UndmUKLSAgICAgZGVmaW5lZCBhIGxhYmVsIGZvciB0aGUgcHJvY2VkdXJlOyBoYW5kbGUgY2FzZSB3aGVyZSB0aGUKLSAgICAgbGFiZWwgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlIC5QUk9DIGRpcmVjdGl2ZS4KLQotICAgICBOb3RlIHRoZXJlJ3Mgbm90IG5lZWQgdG8gZGlkZGxlIHdpdGggdGhlIHNlZ21lbnQgb3IgZnJhZ21lbnQKLSAgICAgZm9yIHRoZSBsYWJlbCBzeW1ib2wgaW4gdGhpcyBjYXNlLiAgV2UgaGF2ZSBhbHJlYWR5IHN3aXRjaGVkCi0gICAgIGludG8gdGhlIG5ldyAkQ09ERSQgc3Vic3BhY2UgYXQgdGhpcyBwb2ludC4gICovCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlICYmIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICAgIGlmIChsYWJlbF9zeW1ib2wpCi0JewotCSAgaWYgKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKQotCSAgICB7Ci0JICAgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCktPmZsYWdzCi0JCXw9IEJTRl9GVU5DVElPTjsKLSNpZmRlZiBPQkpfU09NCi0JICAgICAgLyogQWxzbyBoYW5kbGUgYWxsb2NhdGlvbiBvZiBhIGZpeHVwIHRvIGhvbGQgdGhlIHVud2luZAotCQkgaW5mb3JtYXRpb24gd2hlbiB0aGUgbGFiZWwgYXBwZWFycyBhZnRlciB0aGUgcHJvYy9wcm9jZW5kLiAgKi8KLQkgICAgICBpZiAod2l0aGluX2VudHJ5X2V4aXQpCi0JCXsKLQkJICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLQkJICBmaXhfbmV3X2hwcGEgKGZyYWdfbm93LCB3aGVyZSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCAwLAotCQkJCU5VTEwsIChvZmZzZXRUKSAwLCBOVUxMLAotCQkJCTAsIFJfSFBQQV9FTlRSWSwgZV9mc2VsLCAwLCAwLAotCQkJCShpbnQgKikmbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yKTsKLQkJfQotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MiKSk7Ci0gICAgfQotCi0gIC8qIEFzc2VtYmxlIHRoZSBpbnN0cnVjdGlvbi4gIFJlc3VsdHMgYXJlIHNhdmVkIGludG8gInRoZV9pbnNuIi4gICovCi0gIHBhX2lwIChzdHIpOwotCi0gIC8qIEdldCBzb21ld2hlcmUgdG8gcHV0IHRoZSBhc3NlbWJsZWQgaW5zdHJ1dGlvbi4gICovCi0gIHRvID0gZnJhZ19tb3JlICg0KTsKLQotICAvKiBPdXRwdXQgdGhlIG9wY29kZS4gKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0bywgdGhlX2luc24ub3Bjb2RlLCA0KTsKLQotICAvKiBJZiBuZWNlc3Nhcnkgb3V0cHV0IG1vcmUgc3R1ZmYuICAqLwotICBpZiAodGhlX2luc24ucmVsb2MgIT0gUl9IUFBBX05PTkUpCi0gICAgZml4X25ld19ocHBhIChmcmFnX25vdywgKHRvIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCA0LCBOVUxMLAotCQkgIChvZmZzZXRUKSAwLCAmdGhlX2luc24uZXhwLCB0aGVfaW5zbi5wY3JlbCwKLQkJICB0aGVfaW5zbi5yZWxvYywgdGhlX2luc24uZmllbGRfc2VsZWN0b3IsCi0JCSAgdGhlX2luc24uZm9ybWF0LCB0aGVfaW5zbi5hcmdfcmVsb2MsIE5VTEwpOwotfQotCi0vKiBEbyB0aGUgcmVhbCB3b3JrIGZvciBhc3NlbWJsaW5nIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgU3RvcmUgcmVzdWx0cwotICAgaW50byB0aGUgZ2xvYmFsICJ0aGVfaW5zbiIgdmFyaWFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfaXAgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICplcnJvcl9tZXNzYWdlID0gIiI7Ci0gIGNoYXIgKnMsIGMsICphcmdzdGFydCwgKm5hbWUsICpzYXZlX3M7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGludCBtYXRjaCA9IEZBTFNFOwotICBpbnQgY29tbWEgPSAwOwotICBpbnQgY21wbHRyLCBudWxsaWYsIGZsYWcsIGNvbmQsIG51bTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHN0cnVjdCBwYV9vcGNvZGUgKmluc247Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgLyogU2tpcCB0byBzb21ldGhpbmcgaW50ZXJlc3RpbmcuICAqLwotICBmb3IgKHMgPSBzdHI7IGlzdXBwZXIgKCpzKSB8fCBpc2xvd2VyICgqcykgfHwgKCpzID49ICcwJyAmJiAqcyA8PSAnMycpOyArK3MpCi0gICAgOwotCi0gIHN3aXRjaCAoKnMpCi0gICAgewotCi0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGNvbW1hID0gMTsKLQotICAgICAgLypGQUxMVEhST1VHSCAqLwotCi0gICAgY2FzZSAnICc6Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgIH0KLQotICBzYXZlX3MgPSBzdHI7Ci0KLSAgLyogQ29udmVydCBldmVyeXRoaW5nIGludG8gbG93ZXIgY2FzZS4gICovCi0gIHdoaWxlICgqc2F2ZV9zKQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyICgqc2F2ZV9zKSkKLQkqc2F2ZV9zID0gdG9sb3dlciAoKnNhdmVfcyk7Ci0gICAgICBzYXZlX3MrKzsKLSAgICB9Ci0KLSAgLyogTG9vayB1cCB0aGUgb3Bjb2RlIGluIHRoZSBoYXMgdGFibGUuICAqLwotICBpZiAoKGluc24gPSAoc3RydWN0IHBhX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkICgiVW5rbm93biBvcGNvZGU6IGAlcyciLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY29tbWEpCi0gICAgewotICAgICAgKi0tcyA9ICcsJzsKLSAgICB9Ci0KLSAgLyogTWFyayB0aGUgbG9jYXRpb24gd2hlcmUgYXJndW1lbnRzIGZvciB0aGUgaW5zdHJ1Y3Rpb24gc3RhcnQsIHRoZW4KLSAgICAgc3RhcnQgcHJvY2Vzc2luZyB0aGVtLiAgKi8KLSAgYXJnc3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8qIERvIHNvbWUgaW5pdGlhbGl6YXRpb24uICAqLwotICAgICAgb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBtZW1zZXQgKCZ0aGVfaW5zbiwgMCwgc2l6ZW9mICh0aGVfaW5zbikpOwotCi0gICAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9OT05FOwotCi0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBhcmNoaXRlY3R1cmUsCi0JIHRoZW4gc2V0IGEgbmV3IGFyY2hpdGVjdHVyZS4gICovCi0gICAgICAvKiBCdXQgZG8gbm90IGF1dG9tYXRpY2FsbHkgcHJvbW90ZSB0byBwYTIuMC4gIFRoZSBhdXRvbWF0aWMgcHJvbW90aW9uCi0JIGNydWQgaXMgZm9yIGNvbXBhdGFiaWxpdHkgd2l0aCBIUCdzIG9sZCBhc3NlbWJsZXJzIG9ubHkuICAqLwotICAgICAgaWYgKGluc24tPmFyY2ggPCAyMAotCSAgJiYgYmZkX2dldF9tYWNoIChzdGRvdXRwdXQpIDwgaW5zbi0+YXJjaCkKLQl7Ci0JICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIGluc24tPmFyY2gpKQotCSAgICBhc193YXJuIChfKCJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChiZmRfZ2V0X21hY2ggKHN0ZG91dHB1dCkgPCBpbnNuLT5hcmNoKQotCXsKLQkgIG1hdGNoID0gRkFMU0U7Ci0JICBnb3RvIGZhaWxlZDsKLQl9Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBvcGNvZGUsIGNoZWNraW5nIGFzIHdlIGdvIHRvIG1ha2UKLSAgICAgICAgIHN1cmUgdGhhdCB0aGUgb3BlcmFuZHMgbWF0Y2guICAqLwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLQl7Ci0JICBzd2l0Y2ggKCphcmdzKQotCSAgICB7Ci0KLQkgICAgLyogRW5kIG9mIGFyZ3VtZW50cy4gICovCi0JICAgIGNhc2UgJ1wwJzoKLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJbWF0Y2ggPSBUUlVFOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJysnOgotCSAgICAgIGlmICgqcyA9PSAnKycpCi0JCXsKLQkJICArK3M7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoKnMgPT0gJy0nKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkuICAqLwotCSAgICBjYXNlICcoJzoKLQkgICAgY2FzZSAnKSc6Ci0JICAgIGNhc2UgJywnOgotCSAgICBjYXNlICcgJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgb3IgY29udHJvbCByZWdpc3RlciBmaWVsZCBhdCAxMC4gICovCi0JICAgIGNhc2UgJ2InOgotCSAgICBjYXNlICdeJzoKLQkgICAgICBudW0gPSBwYV9wYXJzZV9udW1iZXIgKCZzLCAwKTsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAxNS4gICovCi0JICAgIGNhc2UgJ3gnOgotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAneSc6Ci0JICAgIGNhc2UgJ3QnOgotCSAgICAgIG51bSA9IHBhX3BhcnNlX251bWJlciAoJnMsIDApOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgZmllbGQgbGVuZ3RoIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnVCc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMiwgMSwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCAzMiAtIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnNSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAxNSwgLTE2LCAwKTsKLQkgICAgICBsb3dfc2lnbl91bmV4dCAobnVtLCA1LCAmbnVtKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ1YnOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMTUsIC0xNiwgMCkKLQkgICAgICBsb3dfc2lnbl91bmV4dCAobnVtLCA1LCAmbnVtKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGFuIHVuc2lnbmVkIDUgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ3InOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMzEsIDAsIDApOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQotCSAgICAvKiBIYW5kbGUgYW4gdW5zaWduZWQgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnUic6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE2KTsKLQotCSAgICAvKiBIYW5kbGUgYSAyIGJpdCBzcGFjZSBpZGVudGlmaWVyIGF0IDE3LiAgKi8KLQkgICAgY2FzZSAncyc6Ci0JICAgICAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgMywgMCwgMSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDE0KTsKLQotCSAgICAvKiBIYW5kbGUgYSAzIGJpdCBzcGFjZSBpZGVudGlmaWVyIGF0IDE4LiAgKi8KLQkgICAgY2FzZSAnUyc6Ci0JICAgICAgbnVtID0gcGFfcGFyc2VfbnVtYmVyICgmcywgMCk7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgMSk7Ci0JICAgICAgZGlzX2Fzc2VtYmxlXzMgKG51bSwgJm51bSk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDEzKTsKLQotCSAgICAvKiBIYW5kbGUgYSBjb21wbGV0ZXIgZm9yIGFuIGluZGV4aW5nIGxvYWQgb3Igc3RvcmUuICAqLwotCSAgICBjYXNlICdjJzoKLQkgICAgICB7Ci0JCWludCB1dSA9IDA7Ci0JCWludCBtID0gMDsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoKnMgPT0gJywnICYmIGkgPCAyKQotCQkgIHsKLQkJICAgIHMrKzsKLQkJICAgIGlmIChzdHJuY2FzZWNtcCAocywgInNtIiwgMikgPT0gMCkKLQkJICAgICAgewotCQkJdXUgPSAxOwotCQkJbSA9IDE7Ci0JCQlzKys7Ci0JCQlpKys7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibSIsIDEpID09IDApCi0JCSAgICAgIG0gPSAxOwotCQkgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJzIiwgMSkgPT0gMCkKLQkJICAgICAgdXUgPSAxOwotCQkgICAgZWxzZQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlci4iKSk7Ci0JCSAgICBzKys7Ci0JCSAgICBpKys7Ci0JCSAgfQotCQlpZiAoaSA+IDIpCi0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIgU3ludGF4LiIpKTsKLQkJb3Bjb2RlIHw9IG0gPDwgNTsKLQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCB1dSwgMTMpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSBzaG9ydCBsb2FkL3N0b3JlIGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ0MnOgotCSAgICAgIHsKLQkJaW50IGEgPSAwOwotCQlpbnQgbSA9IDA7Ci0JCWlmICgqcyA9PSAnLCcpCi0JCSAgewotCQkgICAgcysrOwotCQkgICAgaWYgKHN0cm5jYXNlY21wIChzLCAibWEiLCAyKSA9PSAwKQotCQkgICAgICB7Ci0JCQlhID0gMDsKLQkJCW0gPSAxOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm1iIiwgMikgPT0gMCkKLQkJICAgICAgewotCQkJYSA9IDE7Ci0JCQltID0gMTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgU2hvcnQgTG9hZC9TdG9yZSBDb21wbGV0ZXIuIikpOwotCQkgICAgcyArPSAyOwotCQkgIH0KLQotCQlpZiAoKmFyZ3MgPT0gJ0MnKQotCQkgIHsKLQkJICAgIG9wY29kZSB8PSBtIDw8IDU7Ci0JCSAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGEsIDEzKTsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIHN0YnlzIGNvbXBsZXRlci4gICovCi0JICAgIGNhc2UgJ1knOgotCSAgICAgIHsKLQkJaW50IGEgPSAwOwotCQlpbnQgbSA9IDA7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKCpzID09ICcsJyAmJiBpIDwgMikKLQkJICB7Ci0JCSAgICBzKys7Ci0JCSAgICBpZiAoc3RybmNhc2VjbXAgKHMsICJtIiwgMSkgPT0gMCkKLQkJICAgICAgbSA9IDE7Ci0JCSAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgImIiLCAxKSA9PSAwKQotCQkgICAgICBhID0gMDsKLQkJICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAiZSIsIDEpID09IDApCi0JCSAgICAgIGEgPSAxOwotCQkgICAgZWxzZQotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgU3RvcmUgQnl0ZXMgU2hvcnQgQ29tcGxldGVyIikpOwotCQkgICAgcysrOwotCQkgICAgaSsrOwotCQkgIH0KLQkJaWYgKGkgPiAyKQotCQkgIGFzX2JhZCAoXygiSW52YWxpZCBTdG9yZSBCeXRlcyBTaG9ydCBDb21wbGV0ZXIiKSk7Ci0JCW9wY29kZSB8PSBtIDw8IDU7Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgYSwgMTMpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSBub24tbmVnYXRlZCBjb21wYXJlL3N0dWJ0cmFjdCBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICc8JzoKLQkgICAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfY21wc3ViX2NtcGx0ciAoJnMsIDEpOwotCSAgICAgIGlmIChjbXBsdHIgPCAwKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uOiAlYyIpLCAqcyk7Ci0JCSAgY21wbHRyID0gMDsKLQkJfQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgbmVnYXRlZCBvciBub24tbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbi4gICovCi0JICAgIGNhc2UgJz8nOgotCSAgICAgIHNhdmVfcyA9IHM7Ci0JICAgICAgY21wbHRyID0gcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgKCZzLCAxKTsKLQkgICAgICBpZiAoY21wbHRyIDwgMCkKLQkJewotCQkgIHMgPSBzYXZlX3M7Ci0JCSAgY21wbHRyID0gcGFfcGFyc2VfbmVnX2NtcHN1Yl9jbXBsdHIgKCZzLCAxKTsKLQkJICBpZiAoY21wbHRyIDwgMCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uLiIpKTsKLQkJICAgICAgY21wbHRyID0gMDsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIE5lZ2F0ZWQgY29uZGl0aW9uIHJlcXVpcmVzIGFuIG9wY29kZSBjaGFuZ2UuICAqLwotCQkgICAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQkJICAgIH0KLQkJfQotCQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIG5vbi1uZWdhdGVkIGFkZCBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICchJzoKLQkgICAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0ciAoJnMsIDEpOwotCSAgICAgIGlmIChjbXBsdHIgPCAwKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIENvbXBhcmUvU3VidHJhY3QgQ29uZGl0aW9uOiAlYyIpLCAqcyk7Ci0JCSAgY21wbHRyID0gMDsKLQkJfQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGEgbmVnYXRlZCBvciBub24tbmVnYXRlZCBhZGQgY29uZGl0aW9uLiAgKi8KLQkgICAgY2FzZSAnQCc6Ci0JICAgICAgc2F2ZV9zID0gczsKLQkgICAgICBjbXBsdHIgPSBwYV9wYXJzZV9ub25uZWdfYWRkX2NtcGx0ciAoJnMsIDEpOwotCSAgICAgIGlmIChjbXBsdHIgPCAwKQotCQl7Ci0JCSAgcyA9IHNhdmVfczsKLQkJICBjbXBsdHIgPSBwYV9wYXJzZV9uZWdfYWRkX2NtcGx0ciAoJnMsIDEpOwotCQkgIGlmIChjbXBsdHIgPCAwKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkludmFsaWQgQ29tcGFyZS9TdWJ0cmFjdCBDb25kaXRpb24iKSk7Ci0JCSAgICAgIGNtcGx0ciA9IDA7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBOZWdhdGVkIGNvbmRpdGlvbiByZXF1aXJlcyBhbiBvcGNvZGUgY2hhbmdlLiAgKi8KLQkJICAgICAgb3Bjb2RlIHw9IDEgPDwgMjc7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNtcGx0ciwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBhIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9uLiAgKi8KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgY21wbHRyID0gMDsKLQkgICAgICBmbGFnID0gMDsKLQkgICAgICBpZiAoKnMgPT0gJywnKQotCQl7Ci0JCSAgcysrOwotCQkgIG5hbWUgPSBzOwotCQkgIHdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0JCSAgICBzICs9IDE7Ci0JCSAgYyA9ICpzOwotCQkgICpzID0gMHgwMDsKLQkJICBpZiAoc3RyY21wIChuYW1lLCAiPSIpID09IDApCi0JCSAgICBjbXBsdHIgPSAxOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCQkgICAgY21wbHRyID0gMjsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PSIpID09IDApCi0JCSAgICBjbXBsdHIgPSAzOwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI8PCIpID09IDApCi0JCSAgICBjbXBsdHIgPSA0OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI8PD0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gNTsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAic3YiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNjsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCQkgICAgY21wbHRyID0gNzsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAidHIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAwOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8PiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDE7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMjsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDM7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICI+Pj0iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA0OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiPj4iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA1OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnN2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNjsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIEFkZCBDb25kaXRpb246ICVzIiksIG5hbWUpOwotCQkgICpzID0gYzsKLQkJfQotCSAgICAgIG9wY29kZSB8PSBjbXBsdHIgPDwgMTM7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkgICAgLyogSGFuZGxlIGEgbm9uLW5lZ2F0ZWQgYWRkIGNvbmRpdGlvbi4gICovCi0JICAgIGNhc2UgJ2QnOgotCSAgICAgIGNtcGx0ciA9IDA7Ci0JICAgICAgZmxhZyA9IDA7Ci0JICAgICAgaWYgKCpzID09ICcsJykKLQkJewotCQkgIHMrKzsKLQkJICBuYW1lID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkgICAgcyArPSAxOwotCQkgIGMgPSAqczsKLQkJICAqcyA9IDB4MDA7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gMTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDI7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gMzsKLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibnV2IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDQ7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInpudiIpID09IDApCi0JCSAgICBjbXBsdHIgPSA1OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JCSAgICBjbXBsdHIgPSA2OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJvZCIpID09IDApCi0JCSAgICBjbXBsdHIgPSA3OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ0ciIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDA7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMTsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj0iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAyOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMzsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInV2IikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInZueiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDU7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuc3YiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA2OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA3OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oIkludmFsaWQgQWRkIENvbmRpdGlvbjogJXMiKSwgbmFtZSk7Ci0JCSAgKnMgPSBjOwotCQl9Ci0JICAgICAgb3Bjb2RlIHw9IGNtcGx0ciA8PCAxMzsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDEyKTsKLQotCSAgICAvKiBIQU5ETEUgYSBsb2dpY2FsIGluc3RydWN0aW9uIGNvbmRpdGlvbi4gICovCi0JICAgIGNhc2UgJyYnOgotCSAgICAgIGNtcGx0ciA9IDA7Ci0JICAgICAgZmxhZyA9IDA7Ci0JICAgICAgaWYgKCpzID09ICcsJykKLQkJewotCQkgIHMrKzsKLQkJICBuYW1lID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkgICAgcyArPSAxOwotCQkgIGMgPSAqczsKLQkJICAqcyA9IDB4MDA7Ci0KLQotCQkgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDE7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPCIpID09IDApCi0JCSAgICBjbXBsdHIgPSAyOwotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw9IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDM7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDc7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAxOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAzOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA3OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhc19iYWQgKF8oIkludmFsaWQgTG9naWNhbCBJbnN0cnVjdGlvbiBDb25kaXRpb24uIikpOwotCQkgICpzID0gYzsKLQkJfQotCSAgICAgIG9wY29kZSB8PSBjbXBsdHIgPDwgMTM7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBmbGFnLCAxMik7Ci0KLQkgICAgLyogSGFuZGxlIGEgdW5pdCBpbnN0cnVjdGlvbiBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICdVJzoKLQkgICAgICBjbXBsdHIgPSAwOwotCSAgICAgIGZsYWcgPSAwOwotCSAgICAgIGlmICgqcyA9PSAnLCcpCi0JCXsKLQkJICBzKys7Ci0KLQotCQkgIGlmIChzdHJuY2FzZWNtcCAocywgInNieiIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNoeiIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDM7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNkYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDQ7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNiYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDY7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInNoYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDc7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgInRyIiwgMikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gMjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5ieiIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDI7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuaHoiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAzOwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAzOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChzLCAibmRjIiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gNDsKLQkJICAgICAgZmxhZyA9IDE7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJuY2FzZWNtcCAocywgIm5iYyIsIDMpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGNtcGx0ciA9IDY7Ci0JCSAgICAgIGZsYWcgPSAxOwotCQkgICAgICBzICs9IDM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKHMsICJuaGMiLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSA3OwotCQkgICAgICBmbGFnID0gMTsKLQkJICAgICAgcyArPSAzOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBMb2dpY2FsIEluc3RydWN0aW9uIENvbmRpdGlvbi4iKSk7Ci0JCX0KLQkgICAgICBvcGNvZGUgfD0gY21wbHRyIDw8IDEzOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTIpOwotCi0JICAgIC8qIEhhbmRsZSBhIHNoaWZ0L2V4dHJhY3QvZGVwb3NpdCBjb25kaXRpb24uICAqLwotCSAgICBjYXNlICd8JzoKLQkgICAgY2FzZSAnPic6Ci0JICAgICAgY21wbHRyID0gMDsKLQkgICAgICBpZiAoKnMgPT0gJywnKQotCQl7Ci0JCSAgc2F2ZV9zID0gcysrOwotCi0KLQkJICBuYW1lID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJywnICYmICpzICE9ICcgJyAmJiAqcyAhPSAnXHQnKQotCQkgICAgcyArPSAxOwotCQkgIGMgPSAqczsKLQkJICAqcyA9IDB4MDA7Ci0JCSAgaWYgKHN0cmNtcCAobmFtZSwgIj0iKSA9PSAwKQotCQkgICAgY21wbHRyID0gMTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI8IikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDI7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm9kIikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDM7Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQkJICAgIGNtcGx0ciA9IDQ7Ci0JCSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD4iKSA9PSAwKQotCQkgICAgY21wbHRyID0gNTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICI+PSIpID09IDApCi0JCSAgICBjbXBsdHIgPSA2OwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJldiIpID09IDApCi0JCSAgICBjbXBsdHIgPSA3OwotCQkgIC8qIEhhbmRsZSBtb3ZiLG4uICBQdXQgdGhpbmdzIGJhY2sgdGhlIHdheSB0aGV5IHdlcmUuCi0JCSAgICAgVGhpcyBpbmNsdWRlcyBtb3ZpbmcgcyBiYWNrIHRvIHdoZXJlIGl0IHN0YXJ0ZWQuICAqLwotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuIikgPT0gMCAmJiAqYXJncyA9PSAnfCcpCi0JCSAgICB7Ci0JCSAgICAgICpzID0gYzsKLQkJICAgICAgcyA9IHNhdmVfczsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfKCJJbnZhbGlkIFNoaWZ0L0V4dHJhY3QvRGVwb3NpdCBDb25kaXRpb24uIikpOwotCQkgICpzID0gYzsKLQkJfQotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgY21wbHRyLCAxMyk7Ci0KLQkgICAgLyogSGFuZGxlIGJ2YiBhbmQgYmIgY29uZGl0aW9ucy4gICovCi0JICAgIGNhc2UgJ34nOgotCSAgICAgIGNtcGx0ciA9IDA7Ci0JICAgICAgaWYgKCpzID09ICcsJykKLQkJewotCQkgIHMrKzsKLQkJICBpZiAoc3RybmNtcCAocywgIjwiLCAxKSA9PSAwKQotCQkgICAgewotCQkgICAgICBjbXBsdHIgPSAwOwotCQkgICAgICBzKys7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RybmNtcCAocywgIj49IiwgMikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgY21wbHRyID0gMTsKLQkJICAgICAgcyArPSAyOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBCaXQgQnJhbmNoIENvbmRpdGlvbjogJWMiKSwgKnMpOwotCQl9Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBjbXBsdHIsIDE1KTsKLQotCSAgICAvKiBIYW5kbGUgYSBzeXN0ZW0gY29udHJvbCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdaJzoKLQkgICAgICBpZiAoKnMgPT0gJywnICYmICgqKHMgKyAxKSA9PSAnbScgfHwgKihzICsgMSkgPT0gJ00nKSkKLQkJewotCQkgIGZsYWcgPSAxOwotCQkgIHMgKz0gMjsKLQkJfQotCSAgICAgIGVsc2UKLQkJZmxhZyA9IDA7Ci0KLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDUpOwotCi0JICAgIC8qIEhhbmRsZSBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgICAgY2FzZSAnbic6Ci0JICAgICAgbnVsbGlmID0gcGFfcGFyc2VfbnVsbGlmICgmcyk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudWxsaWYsIDEpOwotCi0JICAgIC8qIEhhbmRsZSBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBjb3ByIGFuZCBzcG9wIGluc25zLiAgKi8KLQkgICAgY2FzZSAnTic6Ci0JICAgICAgbnVsbGlmID0gcGFfcGFyc2VfbnVsbGlmICgmcyk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudWxsaWYsIDUpOwotCi0KLQkgICAgLyogSGFuZGxlIGEgMTEgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ2knOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDEwMjMsIC0xMDI0LCAwKTsKLQkJICBsb3dfc2lnbl91bmV4dCAobnVtLCAxMSwgJm51bSk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxMTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0KLQkgICAgLyogSGFuZGxlIGEgMTQgYml0IGltbWVkaWF0ZSBhdCAzMS4gICovCi0JICAgIGNhc2UgJ2onOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTEsIC04MTkyLCAwKTsKLQkJICBsb3dfc2lnbl91bmV4dCAobnVtLCAxNCwgJm51bSk7Ci0JCSAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGlzX0RQX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfR09UT0ZGOwotCQkgIGVsc2UgaWYgKGlzX1BDX3JlbGF0aXZlICh0aGVfaW5zbi5leHApKQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEFfUENSRUxfQ0FMTDsKLQkJICBlbHNlCi0JCSAgICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQTsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNDsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgIC8qIEhhbmRsZSBhIDIxIGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdrJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JCXsKLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBDSEVDS19GSUVMRCAobnVtID4+IDExLCAxMDQ4NTc1LCAtMTA0ODU3NiwgMCk7Ci0JCSAgZGlzX2Fzc2VtYmxlXzIxIChudW0sICZudW0pOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgbnVtLCAwKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpc19EUF9yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX0dPVE9GRjsKLQkJICBlbHNlIGlmIChpc19QQ19yZWxhdGl2ZSAodGhlX2luc24uZXhwKSkKLQkJICAgIHRoZV9pbnNuLnJlbG9jID0gUl9IUFBBX1BDUkVMX0NBTEw7Ci0JCSAgZWxzZQotCQkgICAgdGhlX2luc24ucmVsb2MgPSBSX0hQUEE7Ci0JCSAgdGhlX2luc24uZm9ybWF0ID0gMjE7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYSAxMiBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudC4gICovCi0JICAgIGNhc2UgJ3cnOgotCSAgICAgIHRoZV9pbnNuLmZpZWxkX3NlbGVjdG9yID0gcGFfY2hrX2ZpZWxkX3NlbGVjdG9yICgmcyk7Ci0JICAgICAgZ2V0X2V4cHJlc3Npb24gKHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgaWYgKCFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLCAiTCQwXDAwMSIpKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IHcxLCB3LCByZXN1bHQ7Ci0KLQkJICBudW0gPSBldmFsdWF0ZV9hYnNvbHV0ZSAoJnRoZV9pbnNuKTsKLQkJICBpZiAobnVtICUgNCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJCcmFuY2ggdG8gdW5hbGlnbmVkIGFkZHJlc3MiKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIENIRUNLX0ZJRUxEIChudW0sIDgxOTksIC04MTg0LCAwKTsKLQkJICBzaWduX3VuZXh0ICgobnVtIC0gOCkgPj4gMiwgMTIsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xMiAocmVzdWx0LCAmdzEsICZ3KTsKLQkJICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsICgodzEgPDwgMikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDEyOwotCQkgIHRoZV9pbnNuLmFyZ19yZWxvYyA9IGxhc3RfY2FsbF9kZXNjLmFyZ19yZWxvYzsKLQkJICBtZW1zZXQgKCZsYXN0X2NhbGxfZGVzYywgMCwgc2l6ZW9mIChzdHJ1Y3QgY2FsbF9kZXNjKSk7Ci0JCSAgcyA9IGV4cHJfZW5kOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQuICAqLwotCSAgICBjYXNlICdXJzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGlmICghdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbAotCQkgIHx8ICFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLAotCQkJICAgICAgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MiwgdzEsIHcsIHJlc3VsdDsKLQotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJSA0KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkJyYW5jaCB0byB1bmFsaWduZWQgYWRkcmVzcyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgMjYyMTQzLCAtMjYyMTQ0LCAwKTsKLQotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKQotCQkgICAgbnVtIC09IDg7Ci0KLQkJICBzaWduX3VuZXh0IChudW0gPj4gMiwgMTcsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xNyAocmVzdWx0LCAmdzEsICZ3MiwgJncpOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwKLQkJCQkJICAgKCh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9QQ1JFTF9DQUxMOwotCQkgIHRoZV9pbnNuLmZvcm1hdCA9IDE3OwotCQkgIHRoZV9pbnNuLmFyZ19yZWxvYyA9IGxhc3RfY2FsbF9kZXNjLmFyZ19yZWxvYzsKLQkJICBtZW1zZXQgKCZsYXN0X2NhbGxfZGVzYywgMCwgc2l6ZW9mIChzdHJ1Y3QgY2FsbF9kZXNjKSk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAvKiBIYW5kbGUgYW4gYWJzb2x1dGUgMTcgYml0IGJyYW5jaCB0YXJnZXQuICAqLwotCSAgICBjYXNlICd6JzoKLQkgICAgICB0aGVfaW5zbi5maWVsZF9zZWxlY3RvciA9IHBhX2Noa19maWVsZF9zZWxlY3RvciAoJnMpOwotCSAgICAgIGdldF9leHByZXNzaW9uIChzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAwOwotCSAgICAgIGlmICghdGhlX2luc24uZXhwLlhfYWRkX3N5bWJvbAotCQkgIHx8ICFzdHJjbXAgKFNfR0VUX05BTUUgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wpLAotCQkJICAgICAgIkwkMFwwMDEiKSkKLQkJewotCQkgIHVuc2lnbmVkIGludCB3MiwgdzEsIHcsIHJlc3VsdDsKLQotCQkgIG51bSA9IGV2YWx1YXRlX2Fic29sdXRlICgmdGhlX2luc24pOwotCQkgIGlmIChudW0gJSA0KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIkJyYW5jaCB0byB1bmFsaWduZWQgYWRkcmVzcyIpKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgQ0hFQ0tfRklFTEQgKG51bSwgMjYyMTQzLCAtMjYyMTQ0LCAwKTsKLQotCQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sKQotCQkgICAgbnVtIC09IDg7Ci0KLQkJICBzaWduX3VuZXh0IChudW0gPj4gMiwgMTcsICZyZXN1bHQpOwotCQkgIGRpc19hc3NlbWJsZV8xNyAocmVzdWx0LCAmdzEsICZ3MiwgJncpOwotCQkgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwKLQkJCQkJICAgKCh3MiA8PCAyKSB8ICh3MSA8PCAxNikgfCB3KSwgMCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFJfSFBQQV9BQlNfQ0FMTDsKLQkJICB0aGVfaW5zbi5mb3JtYXQgPSAxNzsKLQkJICB0aGVfaW5zbi5hcmdfcmVsb2MgPSBsYXN0X2NhbGxfZGVzYy5hcmdfcmVsb2M7Ci0JCSAgbWVtc2V0ICgmbGFzdF9jYWxsX2Rlc2MsIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfZGVzYykpOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgc2hpZnQgY291bnQgYXQgMjYuICAqLwotCSAgICBjYXNlICdwJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIDMxIC0gbnVtLCA1KTsKLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCBiaXQgcG9zaXRpb24gYXQgMjYuICAqLwotCSAgICBjYXNlICdQJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNSk7Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgaW1tZWRpYXRlIGF0IDEwLiAgKi8KLQkgICAgY2FzZSAnUSc6Ci0KLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JCWJyZWFrOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMSwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDIxKTsKLQotCSAgICAvKiBIYW5kbGUgYSAxMyBiaXQgaW1tZWRpYXRlIGF0IDE4LiAgKi8KLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA4MTkxLCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBhIDI2IGJpdCBpbW1lZGlhdGUgYXQgMzEuICAqLwotCSAgICBjYXNlICdEJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDY3MTEwODg2NCwgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDMgYml0IFNGVSBpZGVudGlmaWVyIGF0IDI1LiAgKi8KLQkgICAgY2FzZSAnZic6Ci0JICAgICAgaWYgKCpzKysgIT0gJywnKQotCQlhc19iYWQgKF8oIkludmFsaWQgU0ZVIGlkZW50aWZpZXIiKSk7Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCA3LCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgNik7Ci0KLQkgICAgLyogSGFuZGxlIGEgMjAgYml0IFNPUCBmaWVsZCBmb3Igc3BvcDAuICAqLwotCSAgICBjYXNlICdPJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDEwNDg1NzUsIDAsIDApOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDBmZmZlMCkgPDwgNik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDE1Yml0IFNPUCBmaWVsZCBmb3Igc3BvcDEuICAqLwotCSAgICBjYXNlICdvJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDMyNzY3LCAwLCAwKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMTEpOwotCi0JICAgIC8qIEhhbmRsZSBhIDEwYml0IFNPUCBmaWVsZCBmb3Igc3BvcDMuICAqLwotCSAgICBjYXNlICcwJzoKLQkgICAgICBudW0gPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoJnRoZV9pbnNuLCAmcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIENIRUNLX0ZJRUxEIChudW0sIDEwMjMsIDAsIDApOwotCSAgICAgIG51bSA9IChudW0gJiAweDFmKSB8ICgobnVtICYgMHgwMDAwMDNlMCkgPDwgNik7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDApOwotCi0JICAgIC8qIEhhbmRsZSBhIDE1IGJpdCBTT1AgZmllbGQgZm9yIHNwb3AyLiAgKi8KLQkgICAgY2FzZSAnMSc6Ci0JICAgICAgbnVtID0gcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCZ0aGVfaW5zbiwgJnMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBDSEVDS19GSUVMRCAobnVtLCAzMjc2NywgMCwgMCk7Ci0JICAgICAgbnVtID0gKG51bSAmIDB4MWYpIHwgKChudW0gJiAweDAwMDA3ZmUwKSA8PCA2KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQkgICAgLyogSGFuZGxlIGEgMy1iaXQgY28tcHJvY2Vzc29yIElEIGZpZWxkLiAgKi8KLQkgICAgY2FzZSAndSc6Ci0JICAgICAgaWYgKCpzKysgIT0gJywnKQotCQlhc19iYWQgKF8oIkludmFsaWQgQ09QUiBpZGVudGlmaWVyIikpOwotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNywgMCwgMCk7Ci0JICAgICAgSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCBudW0sIDYpOwotCi0JICAgIC8qIEhhbmRsZSBhIDIyYml0IFNPUCBmaWVsZCBmb3IgY29wci4gICovCi0JICAgIGNhc2UgJzInOgotCSAgICAgIG51bSA9IHBhX2dldF9hYnNvbHV0ZV9leHByZXNzaW9uICgmdGhlX2luc24sICZzKTsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgQ0hFQ0tfRklFTEQgKG51bSwgNDE5NDMwMywgMCwgMCk7Ci0JICAgICAgbnVtID0gKG51bSAmIDB4MWYpIHwgKChudW0gJiAweDAwM2ZmZmUwKSA8PCA0KTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIG51bSwgMCk7Ci0KLQotCSAgICAvKiBIYW5kbGUgYSBzb3VyY2UgRlAgb3BlcmFuZCBmb3JtYXQgY29tcGxldGVyLiAgKi8KLQkgICAgY2FzZSAnRic6Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOwotCSAgICAgIHRoZV9pbnNuLmZwb2YxID0gZmxhZzsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGZsYWcsIDExKTsKLQotCSAgICAvKiBIYW5kbGUgYSBkZXN0aW5hdGlvbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIuICAqLwotCSAgICBjYXNlICdHJzoKLQkgICAgICAvKiBwYV9wYXJzZV9mb3JtYXQgbmVlZHMgdGhlICcsJyBwcmVmaXguICAqLwotCSAgICAgIHMtLTsKLQkgICAgICBmbGFnID0gcGFfcGFyc2VfZnBfZm9ybWF0ICgmcyk7Ci0JICAgICAgdGhlX2luc24uZnBvZjIgPSBmbGFnOwotCSAgICAgIElOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgZmxhZywgMTMpOwotCi0JICAgIC8qIEhhbmRsZSBGUCBjb21wYXJlIGNvbmRpdGlvbnMuICAqLwotCSAgICBjYXNlICdNJzoKLQkgICAgICBjb25kID0gcGFfcGFyc2VfZnBfY21wX2NvbmQgKCZzKTsKLQkgICAgICBJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIGNvbmQsIDApOwotCi0JICAgIC8qIEhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzIGxpa2UgJ3QnLiAgKi8KLQkgICAgY2FzZSAndic6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJb3Bjb2RlIHw9IHJlc3VsdC5udW1iZXJfcGFydDsKLQotCQkvKiAweDMwIG9wY29kZXMgYXJlIEZQIGFyaXRobWV0aWMgb3BlcmF0aW9uIG9wY29kZXMKLQkJICAgYW5kIG5lZWQgdG8gYmUgdHVybmVkIGludG8gMHgzOCBvcGNvZGVzLiAgVGhpcwotCQkgICBpcyBub3QgbmVjZXNzYXJ5IGZvciBsb2Fkcy9zdG9yZXMuICAqLwotCQlpZiAobmVlZF9wYTExX29wY29kZSAoJnRoZV9pbnNuLCAmcmVzdWx0KQotCQkgICAgJiYgKChvcGNvZGUgJiAweGZjMDAwMDAwKSA9PSAweDMwMDAwMDAwKSkKLQkJICBvcGNvZGUgfD0gMSA8PCAyNzsKLQotCQlJTlNFUlRfRklFTERfQU5EX0NPTlRJTlVFIChvcGNvZGUsIHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSwgNik7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzIGxpa2UgJ2InLiAgKi8KLQkgICAgY2FzZSAnRSc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJb3Bjb2RlIHw9IHJlc3VsdC5udW1iZXJfcGFydCA8PCAyMTsKLQkJaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgewotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDc7Ci0JCSAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQkJICB9Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcyBsaWtlICdiJy4gICovCi0JICAgIGNhc2UgJzMnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCQlpbnQgcmVnbnVtOwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCW9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgxYykgPDwgMTE7Ci0JCW9wY29kZSB8PSAocmVzdWx0Lm51bWJlcl9wYXJ0ICYgMHgzKSA8PCA5OwotCQlvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgODsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBML1IgcmVnaXN0ZXIgaGFsdmVzIGxpa2UgJ3gnLiAgKi8KLQkgICAgY2FzZSAnZSc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJb3Bjb2RlIHw9IChyZXN1bHQubnVtYmVyX3BhcnQgJiAweDFmKSA8PCAxNjsKLQkJaWYgKG5lZWRfcGExMV9vcGNvZGUgKCZ0aGVfaW5zbiwgJnJlc3VsdCkpCi0JCSAgewotCQkgICAgb3Bjb2RlIHw9IChyZXN1bHQubF9yX3NlbGVjdCAmIDEpIDw8IDE7Ci0JCSAgfQotCQljb250aW51ZTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMgbGlrZSAneCcuICAqLwotCSAgICBjYXNlICdYJzoKLQkgICAgICB7Ci0JCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQlvcGNvZGUgfD0gKHJlc3VsdC5udW1iZXJfcGFydCAmIDB4MWYpIDw8IDE2OwotCQlpZiAobmVlZF9wYTExX29wY29kZSAoJnRoZV9pbnNuLCAmcmVzdWx0KSkKLQkJICB7Ci0JCSAgICBvcGNvZGUgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgMTI7Ci0JCSAgICBvcGNvZGUgfD0gMSA8PCAyNzsKLQkJICB9Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSA1IGJpdCByZWdpc3RlciBmaWVsZCBhdCAxMC4gICovCi0JICAgIGNhc2UgJzQnOgotCSAgICAgIHsKLQkJc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgcmVzdWx0OwotCi0JCXBhX3BhcnNlX251bWJlciAoJnMsICZyZXN1bHQpOwotCQlDSEVDS19GSUVMRCAocmVzdWx0Lm51bWJlcl9wYXJ0LCAzMSwgMCwgMCk7Ci0JCWlmICh0aGVfaW5zbi5mcG9mMSA9PSBTR0wpCi0JCSAgewotCQkgICAgaWYgKHJlc3VsdC5udW1iZXJfcGFydCA8IDE2KQotCQkgICAgICB7Ci0JCQlhc19iYWQgIChfKCJJbnZhbGlkIHJlZ2lzdGVyIGZvciBzaW5nbGUgcHJlY2lzaW9uIGZtcHlhZGQgb3IgZm1weXN1YiIpKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICB9Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAyMSk7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDE1LiAgKi8KLQkgICAgY2FzZSAnNic6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICB7Ci0JCSAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICB9Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAxNik7Ci0JICAgICAgfQotCi0JICAgIC8qIEhhbmRsZSBhIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDMxLiAgKi8KLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgewotCQlzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCByZXN1bHQ7Ci0KLQkJcGFfcGFyc2VfbnVtYmVyICgmcywgJnJlc3VsdCk7Ci0JCUNIRUNLX0ZJRUxEIChyZXN1bHQubnVtYmVyX3BhcnQsIDMxLCAwLCAwKTsKLQkJaWYgKHRoZV9pbnNuLmZwb2YxID09IFNHTCkKLQkJICB7Ci0JCSAgICBpZiAocmVzdWx0Lm51bWJlcl9wYXJ0IDwgMTYpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAgKF8oIkludmFsaWQgcmVnaXN0ZXIgZm9yIHNpbmdsZSBwcmVjaXNpb24gZm1weWFkZCBvciBmbXB5c3ViIikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCAmPSAweEY7Ci0JCSAgICByZXN1bHQubnVtYmVyX3BhcnQgfD0gKHJlc3VsdC5sX3Jfc2VsZWN0ICYgMSkgPDwgNDsKLQkJICB9Ci0JCUlOU0VSVF9GSUVMRF9BTkRfQ09OVElOVUUgKG9wY29kZSwgcmVzdWx0Lm51bWJlcl9wYXJ0LCAwKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMjAuICAqLwotCSAgICBjYXNlICc4JzoKLQkgICAgICB7Ci0JCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQlpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQotCQkgIHsKLQkJICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKLQkJICAgICAgewotCQkJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgIH0KLQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDExKTsKLQkgICAgICB9Ci0KLQkgICAgLyogSGFuZGxlIGEgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMjUuICAqLwotCSAgICBjYXNlICc5JzoKLQkgICAgICB7Ci0JCXN0cnVjdCBwYV8xMV9mcF9yZWdfc3RydWN0IHJlc3VsdDsKLQotCQlwYV9wYXJzZV9udW1iZXIgKCZzLCAmcmVzdWx0KTsKLQkJQ0hFQ0tfRklFTEQgKHJlc3VsdC5udW1iZXJfcGFydCwgMzEsIDAsIDApOwotCQlpZiAodGhlX2luc24uZnBvZjEgPT0gU0dMKQotCQkgIHsKLQkJICAgIGlmIChyZXN1bHQubnVtYmVyX3BhcnQgPCAxNikKLQkJICAgICAgewotCQkJYXNfYmFkICAoXygiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiKSk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgcmVzdWx0Lm51bWJlcl9wYXJ0ICY9IDB4RjsKLQkJICAgIHJlc3VsdC5udW1iZXJfcGFydCB8PSAocmVzdWx0Lmxfcl9zZWxlY3QgJiAxKSA8PCA0OwotCQkgIH0KLQkJSU5TRVJUX0ZJRUxEX0FORF9DT05USU5VRSAob3Bjb2RlLCByZXN1bHQubnVtYmVyX3BhcnQsIDYpOwotCSAgICAgIH0KLQotCSAgICAvKiBIYW5kbGUgYSBmbG9hdGluZyBwb2ludCBvcGVyYW5kIGZvcm1hdCBhdCAyNi4KLQkgICAgICAgT25seSBhbGxvd3Mgc2luZ2xlIGFuZCBkb3VibGUgcHJlY2lzaW9uLiAgKi8KLQkgICAgY2FzZSAnSCc6Ci0JICAgICAgZmxhZyA9IHBhX3BhcnNlX2ZwX2Zvcm1hdCAoJnMpOwotCSAgICAgIHN3aXRjaCAoZmxhZykKLQkJewotCQljYXNlIFNHTDoKLQkJICBvcGNvZGUgfD0gMHgyMDsKLQkJY2FzZSBEQkw6Ci0JCSAgdGhlX2luc24uZnBvZjEgPSBmbGFnOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgUVVBRDoKLQkJY2FzZSBJTExFR0FMX0ZNVDoKLQkJZGVmYXVsdDoKLQkJICBhc19iYWQgKF8oIkludmFsaWQgRmxvYXRpbmcgUG9pbnQgT3BlcmFuZCBGb3JtYXQuIikpOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gZmFpbGVkOgotICAgICAgLyogQ2hlY2sgaWYgdGhlIGFyZ3MgbWF0Y2hlZC4gICovCi0gICAgICBpZiAobWF0Y2ggPT0gRkFMU0UpCi0JewotCSAgaWYgKCZpbnNuWzFdIC0gcGFfb3Bjb2RlcyA8IChpbnQpIE5VTU9QQ09ERVMKLQkgICAgICAmJiAhc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIHMgPSBhcmdzdGFydDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG9wZXJhbmRzICVzIiksIGVycm9yX21lc3NhZ2UpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlzIHJldHVybmVkLiAgKi8KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFArKyksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogV3JpdGUgb3V0IGJpZy1lbmRpYW4uICAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiByZWxvY2F0aW9uIGluZm8gdG8gQkZEIHRhcmdldAotICAgZm9ybWF0LiAgKi8KLQotYXJlbGVudCAqKgotdGNfZ2VuX3JlbG9jIChzZWN0aW9uLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4cDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0gIHN0YXRpYyBhcmVsZW50ICpub19yZWxvY3MgPSBOVUxMOwotICBhcmVsZW50ICoqcmVsb2NzOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgKipjb2RlczsKLSAgaW50IG5fcmVsb2NzOwotICBpbnQgaTsKLQotICBocHBhX2ZpeHAgPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKSBmaXhwLT50Y19maXhfZGF0YTsKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ID09IDApCi0gICAgcmV0dXJuICZub19yZWxvY3M7Ci0gIGFzc2VydCAoaHBwYV9maXhwICE9IDApOwotICBhc3NlcnQgKHNlY3Rpb24gIT0gMCk7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIGNvZGVzID0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSAqKikgaHBwYV9nZW5fcmVsb2NfdHlwZSAoc3Rkb3V0cHV0LAotCQkJICAgICAgIGZpeHAtPmZ4X3JfdHlwZSwKLQkJCSAgICAgICBocHBhX2ZpeHAtPmZ4X3JfZm9ybWF0LAotCQkJICAgICAgIGhwcGFfZml4cC0+Znhfcl9maWVsZCwKLQkJCSAgICAgICBmaXhwLT5meF9zdWJzeSAhPSBOVUxMLAotCQkJICAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSkpOwotCi0gIGlmIChjb2RlcyA9PSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIGZvciAobl9yZWxvY3MgPSAwOyBjb2Rlc1tuX3JlbG9jc107IG5fcmVsb2NzKyspCi0gICAgOwotCi0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQgKikgKiBuX3JlbG9jcyArIDEpOwotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkgKiBuX3JlbG9jcyk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuX3JlbG9jczsgaSsrKQotICAgIHJlbG9jc1tpXSA9ICZyZWxvY1tpXTsKLQotICByZWxvY3Nbbl9yZWxvY3NdID0gTlVMTDsKLQotI2lmZGVmIE9CSl9FTEYKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQgKG5fcmVsb2NzID09IDEpOwotCi0gICAgICBjb2RlID0gKmNvZGVzWzBdOwotCi0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICAgICAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gMDsJLyogZGVmYXVsdCAqLwotCi0gICAgICBhc3NlcnQgKHJlbG9jLT5ob3d0byAmJiBjb2RlID09IHJlbG9jLT5ob3d0by0+dHlwZSk7Ci0KLSAgICAgIC8qIE5vdywgZG8gYW55IHByb2Nlc3NpbmcgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhlIHJlbG9jYXRpb24gdHlwZS4gICovCi0gICAgICBzd2l0Y2ggKGNvZGUpCi0JewotCWNhc2UgUl9QQVJJU0NfRExUUkVMMjFMOgotCWNhc2UgUl9QQVJJU0NfRExUUkVMMTRSOgotCWNhc2UgUl9QQVJJU0NfRExUUkVMMTRGOgotCWNhc2UgUl9QQVJJU0NfUExBQkVMMzI6Ci0JY2FzZSBSX1BBUklTQ19QTEFCRUwyMUw6Ci0JY2FzZSBSX1BBUklTQ19QTEFCRUwxNFI6Ci0JICAvKiBGb3IgcGxhYmVsIHJlbG9jYXRpb25zLCB0aGUgYWRkZW5kIG9mIHRoZQotCSAgICAgcmVsb2NhdGlvbiBzaG91bGQgYmUgZWl0aGVyIDAgKG5vIHN0YXRpYyBsaW5rKSBvciAyCi0JICAgICAoc3RhdGljIGxpbmsgcmVxdWlyZWQpLgotCi0JICAgICBGSVhNRTogV2UgYWx3YXlzIGFzc3VtZSBubyBzdGF0aWMgbGluayEKLQotCSAgICAgV2UgYWxzbyBzbGFtIGEgemVybyBhZGRlbmQgaW50byB0aGUgRExUIHJlbGF0aXZlIHJlbG9jczsKLQkgICAgIGl0IGRvZXNuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSB0byB1c2UgYW55IGFkZGVuZCBzaW5jZQotCSAgICAgaXQgZ2V0cyB5b3UgYSBkaWZmZXJlbnQgKGVnIHVua25vd24pIERMVCBlbnRyeS4gICovCi0JICByZWxvYy0+YWRkZW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX1BBUklTQ19QQ1JFTDIxTDoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTdSOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxN0Y6Ci0JY2FzZSBSX1BBUklTQ19QQ1JFTDE3QzoKLQljYXNlIFJfUEFSSVNDX1BDUkVMMTRSOgotCWNhc2UgUl9QQVJJU0NfUENSRUwxNEY6Ci0JICAvKiBUaGUgY29uc3RhbnQgaXMgc3RvcmVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0JICByZWxvYy0+YWRkZW5kID0gSFBQQV9SX0FEREVORCAoaHBwYV9maXhwLT5meF9hcmdfcmVsb2MsIDApOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0jZWxzZSAvKiBPQkpfU09NICovCi0KLSAgLyogV2FsayBvdmVyIHJlYWNoIHJlbG9jYXRpb24gcmV0dXJuZWQgYnkgdGhlIEJGRCBiYWNrZW5kLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG5fcmVsb2NzOyBpKyspCi0gICAgewotICAgICAgY29kZSA9ICpjb2Rlc1tpXTsKLQotICAgICAgcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICAgICAgcmVsb2NzW2ldLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgICAgIHJlbG9jc1tpXS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICAgICAgc3dpdGNoIChjb2RlKQotCXsKLQljYXNlIFJfQ09NUDI6Ci0JICAvKiBUaGUgb25seSB0aW1lIHdlIGV2ZXIgdXNlIGEgUl9DT01QMiBmaXh1cCBpcyBmb3IgdGhlIGRpZmZlcmVuY2UKLQkgICAgIG9mIHR3byBzeW1ib2xzLiAgV2l0aCB0aGF0IGluIG1pbmQgd2UgZmlsbCBpbiBhbGwgZm91cgotCSAgICAgcmVsb2NzIG5vdyBhbmQgYnJlYWsgb3V0IG9mIHRoZSBsb29wLiAgKi8KLQkgIGFzc2VydCAoaSA9PSAxKTsKLQkgIHJlbG9jc1swXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgJihiZmRfYWJzX3N5bWJvbCk7Ci0JICByZWxvY3NbMF0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1swXSk7Ci0JICByZWxvY3NbMF0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMF0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbMV0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0JICAqcmVsb2NzWzFdLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0JICByZWxvY3NbMV0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1sxXSk7Ci0JICByZWxvY3NbMV0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMV0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbMl0tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0JICAqcmVsb2NzWzJdLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9zdWJzeSk7Ci0JICByZWxvY3NbMl0tPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsICpjb2Rlc1syXSk7Ci0JICByZWxvY3NbMl0tPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0JICByZWxvY3NbMl0tPmFkZGVuZCA9IDA7Ci0JICByZWxvY3NbM10tPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopICYoYmZkX2Fic19zeW1ib2wpOwotCSAgcmVsb2NzWzNdLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCAqY29kZXNbM10pOwotCSAgcmVsb2NzWzNdLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCSAgcmVsb2NzWzNdLT5hZGRlbmQgPSAwOwotCSAgcmVsb2NzWzRdLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSAmKGJmZF9hYnNfc3ltYm9sKTsKLQkgIHJlbG9jc1s0XS0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgKmNvZGVzWzRdKTsKLQkgIHJlbG9jc1s0XS0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQkgIHJlbG9jc1s0XS0+YWRkZW5kID0gMDsKLQkgIGdvdG8gZG9uZTsKLQljYXNlIFJfUENSRUxfQ0FMTDoKLQljYXNlIFJfQUJTX0NBTEw6Ci0JICByZWxvY3NbaV0tPmFkZGVuZCA9IEhQUEFfUl9BRERFTkQgKGhwcGFfZml4cC0+ZnhfYXJnX3JlbG9jLCAwKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX0RMVF9SRUw6Ci0JY2FzZSBSX0RBVEFfUExBQkVMOgotCWNhc2UgUl9DT0RFX1BMQUJFTDoKLQkgIC8qIEZvciBwbGFiZWwgcmVsb2NhdGlvbnMsIHRoZSBhZGRlbmQgb2YgdGhlCi0JICAgICByZWxvY2F0aW9uIHNob3VsZCBiZSBlaXRoZXIgMCAobm8gc3RhdGljIGxpbmspIG9yIDIKLQkgICAgIChzdGF0aWMgbGluayByZXF1aXJlZCkuCi0KLQkgICAgIEZJWE1FOiBXZSBhbHdheXMgYXNzdW1lIG5vIHN0YXRpYyBsaW5rIQotCi0JICAgICBXZSBhbHNvIHNsYW0gYSB6ZXJvIGFkZGVuZCBpbnRvIHRoZSBETFQgcmVsYXRpdmUgcmVsb2NzOwotCSAgICAgaXQgZG9lc24ndCBtYWtlIGEgbG90IG9mIHNlbnNlIHRvIHVzZSBhbnkgYWRkZW5kIHNpbmNlCi0JICAgICBpdCBnZXRzIHlvdSBhIGRpZmZlcmVudCAoZWcgdW5rbm93bikgRExUIGVudHJ5LiAgKi8KLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBSX05fTU9ERToKLQljYXNlIFJfU19NT0RFOgotCWNhc2UgUl9EX01PREU6Ci0JY2FzZSBSX1JfTU9ERToKLQljYXNlIFJfRlNFTDoKLQljYXNlIFJfTFNFTDoKLQljYXNlIFJfUlNFTDoKLQljYXNlIFJfQkVHSU5fQlJUQUI6Ci0JY2FzZSBSX0VORF9CUlRBQjoKLQljYXNlIFJfQkVHSU5fVFJZOgotCWNhc2UgUl9OMFNFTDoKLQljYXNlIFJfTjFTRUw6Ci0JICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgb3IgYWRkZW5kIGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBmaXh1cHMuICAqLwotICAgICAgICAgIHJlbG9jc1tpXS0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICAgICAqcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChkdW1teV9zeW1ib2wpOwotCSAgcmVsb2NzW2ldLT5hZGRlbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIFJfRU5EX1RSWToKLQljYXNlIFJfRU5UUlk6Ci0JY2FzZSBSX0VYSVQ6Ci0JICAvKiBUaGVyZSBpcyBubyBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIGZpeHVwcy4gICovCi0gICAgICAgICAgcmVsb2NzW2ldLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgICAgICpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGR1bW15X3N5bWJvbCk7Ci0JICByZWxvY3NbaV0tPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHJlbG9jc1tpXS0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotCX0KLSAgICB9Ci0KLSBkb25lOgotI2VuZGlmCi0KLSAgcmV0dXJuIHJlbG9jczsKLX0KLQotLyogUHJvY2VzcyBhbnkgbWFjaGluZSBkZXBlbmRlbnQgZnJhZyB0eXBlcy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgICAgcmVnaXN0ZXIgYmZkICphYmZkOwotICAgICByZWdpc3RlciBhc2VjdGlvbiAqc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHVuc2lnbmVkIGludCBhZGRyZXNzOwotCi0gIGlmIChmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKChpbnQpIGZyYWdQLT5mcl9zdWJ0eXBlKQotCXsKLQljYXNlIDA6Ci0JICBmcmFnUC0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0JICBrbm93IChmcmFnUC0+ZnJfdmFyID09IDEpOwotCSAga25vdyAoZnJhZ1AtPmZyX25leHQpOwotCSAgYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeDsKLQkgIGlmIChhZGRyZXNzICUgZnJhZ1AtPmZyX29mZnNldCkKLQkgICAgewotCSAgICAgIGZyYWdQLT5mcl9vZmZzZXQgPQotCQlmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwotCQktIGZyYWdQLT5mcl9hZGRyZXNzCi0JCS0gZnJhZ1AtPmZyX2ZpeDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBhc2VjdGlvbiAqc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIGludCBhbGlnbiA9IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnbWVudCk7Ci0gIGludCBhbGlnbjIgPSAoMSA8PCBhbGlnbikgLSAxOwotCi0gIHJldHVybiAoc2l6ZSArIGFsaWduMikgJiB+YWxpZ24yOwotfQotCi0vKiBSZXR1cm4gdGhlIGFwcHJveGltYXRlIHNpemUgb2YgYSBmcmFnIGJlZm9yZSByZWxheGF0aW9uIGhhcyBvY2N1cnJlZC4gICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICBhc2VjdGlvbiAqc2VnbWVudDsKLXsKLSAgaW50IHNpemU7Ci0KLSAgc2l6ZSA9IDA7Ci0KLSAgd2hpbGUgKChmcmFnUC0+ZnJfZml4ICsgc2l6ZSkgJSBmcmFnUC0+ZnJfb2Zmc2V0KQotICAgIHNpemUrKzsKLQotICByZXR1cm4gc2l6ZTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci19Ci0MCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gICovCi0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotewotICBjaGFyICpidWYgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4UDsKLSAgbG9uZyBuZXdfdmFsLCByZXN1bHQgPSAwOwotICB1bnNpZ25lZCBpbnQgdzEsIHcyLCB3LCByZXN1bHRpOwotCi0gIGhwcGFfZml4UCA9IChzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICopIGZpeFAtPnRjX2ZpeF9kYXRhOwotICAvKiBTT00gdXNlcyBSX0hQUEFfRU5UUlkgYW5kIFJfSFBQQV9FWElUIHJlbG9jYXRpb25zIHdoaWNoIGNhbgotICAgICBuZXZlciBiZSAiYXBwbGllZCIgKHRoZXkgYXJlIGp1c3QgbWFya2VycykuICBMaWtld2lzZSBmb3IKLSAgICAgUl9IUFBBX0JFR0lOX0JSVEFCIGFuZCBSX0hQUEFfRU5EX0JSVEFCLiAgKi8KLSNpZmRlZiBPQkpfU09NCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VOVFJZCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VYSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fQlJUQUIKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX0JSVEFCCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX0JFR0lOX1RSWSkKLSAgICByZXR1cm4gMTsKLQotICAvKiBEaXNndXN0aW5nLiAgV2UgbXVzdCBzZXQgZnhfb2Zmc2V0IG91cnNlbHZlcyAtLSBSX0hQUEFfRU5EX1RSWQotICAgICBmaXh1cHMgYXJlIGNvbnNpZGVyZWQgbm90IGFkanVzdGFibGUsIHdoaWNoIGluIHR1cm4gY2F1c2VzCi0gICAgIGFkanVzdF9yZWxvY19zeW1zIHRvIG5vdCBzZXQgZnhfb2Zmc2V0LiAgVWdoLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRU5EX1RSWSkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9vZmZzZXQgPSAqdmFscDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFRoZXJlIHNob3VsZCBoYXZlIGJlZW4gYW4gSFBQQSBzcGVjaWZpYyBmaXh1cCBhc3NvY2lhdGVkCi0gICAgIHdpdGggdGhlIEdBUyBmaXh1cC4gICovCi0gIGlmIChocHBhX2ZpeFApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBidWZfd2QgPSBiZmRfZ2V0XzMyIChzdGRvdXRwdXQsIGJ1Zik7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGZtdCA9IGJmZF9ocHBhX2luc24yZm10IChidWZfd2QpOwotCi0gICAgICAvKiBJZiB0aGVyZSBpcyBhIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaXh1cCwgdGhlbiBpdCdzIHNvbWV0aGluZwotCSB3aGljaCB3aWxsIG5lZWQgYSBTT00gcmVsb2NhdGlvbiAoZXhjZXB0IGZvciBzb21lIFBDLXJlbGF0aXZlIHJlbG9jcykuCi0JIEluIHN1Y2ggY2FzZXMgd2Ugc2hvdWxkIHRyZWF0IHRoZSAidmFsIiBvciAiYWRkZW5kIiBhcyB6ZXJvIHNpbmNlIGl0Ci0JIHdpbGwgYmUgYWRkZWQgaW4gYXMgbmVlZGVkIGZyb20gZnhfb2Zmc2V0IGluIHRjX2dlbl9yZWxvYy4gICovCi0gICAgICBpZiAoKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gUl9IUFBBX05PTkUpCi0jaWZkZWYgT0JKX1NPTQotCSAgJiYgZm10ICE9IDMyCi0jZW5kaWYKLQkgICkKLQluZXdfdmFsID0gKChmbXQgPT0gMTIgfHwgZm10ID09IDE3IHx8IGZtdCA9PSAyMikgPyA4IDogMCk7Ci0jaWZkZWYgT0JKX1NPTQotICAgICAgLyogVGhlc2UgZmllbGQgc2VsZWN0b3JzIGltcGx5IHRoYXQgd2UgZG8gbm90IHdhbnQgYW4gYWRkZW5kLiAgKi8KLSAgICAgIGVsc2UgaWYgKGhwcGFfZml4UC0+Znhfcl9maWVsZCA9PSBlX3BzZWwKLQkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfcnBzZWwKLQkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfbHBzZWwKLQkgICAgICAgfHwgaHBwYV9maXhQLT5meF9yX2ZpZWxkID09IGVfdHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9ydHNlbAotCSAgICAgICB8fCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQgPT0gZV9sdHNlbCkKLQluZXdfdmFsID0gKChmbXQgPT0gMTIgfHwgZm10ID09IDE3IHx8IGZtdCA9PSAyMikgPyA4IDogMCk7Ci0gICAgICAvKiBUaGlzIGlzIHRydWVseSBkaXNndXN0aW5nLiAgVGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBibGluZGx5Ci0JIGFkZHMgaW4gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYmVpbmcgcmVsb2NhdGVkIGFnYWluc3QuICBEYW1uISAgKi8KLSAgICAgIGVsc2UgaWYgKGZtdCA9PSAzMgotCSAgICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0JICAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSBiZmRfY29tX3NlY3Rpb25fcHRyKQotCW5ld192YWwgPSBocHBhX2ZpZWxkX2FkanVzdCAoKnZhbHAgLSBTX0dFVF9WQUxVRSAoZml4UC0+ZnhfYWRkc3kpLAotCQkJCSAgICAgMCwgaHBwYV9maXhQLT5meF9yX2ZpZWxkKTsKLSNlbmRpZgotICAgICAgZWxzZQotCW5ld192YWwgPSBocHBhX2ZpZWxkX2FkanVzdCAoKnZhbHAsIDAsIGhwcGFfZml4UC0+Znhfcl9maWVsZCk7Ci0KLSAgICAgIC8qIEhhbmRsZSBwYy1yZWxhdGl2ZSBleGNlcHRpb25zIGZyb20gYWJvdmUuICAqLwotI2RlZmluZSBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQoQ0FMTEVSLCBDQUxMRUUpIFwKLSAgKChDQUxMRUUpICYmIChDQUxMRVIpICYmICgoQ0FMTEVFKSAhPSAoQ0FMTEVSKSkpCi0gICAgICBpZiAoKGZtdCA9PSAxMiB8fCBmbXQgPT0gMTcgfHwgZm10ID09IDIyKQotCSAgJiYgZml4UC0+ZnhfYWRkc3kKLQkgICYmIGZpeFAtPmZ4X3BjcmVsCi0jaWZkZWYgT0JKX1NPTQotCSAgJiYgIWFyZ19yZWxvY19zdHViX25lZWRlZCAoKGxvbmcpICgob2JqX3N5bWJvbF90eXBlICopCi0JCXN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSkpLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jLAotCQlocHBhX2ZpeFAtPmZ4X2FyZ19yZWxvYykKLSNlbmRpZgotCSAgJiYgKCgoaW50KSgqdmFscCkgPiAtMjYyMTQ0ICYmIChpbnQpKCp2YWxwKSA8IDI2MjE0MykgJiYgZm10ICE9IDIyKQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpID09IGhwcGFfZml4UC0+c2VnbWVudAotCSAgJiYgIShmaXhQLT5meF9zdWJzeQotCSAgICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9zdWJzeSkgIT0gaHBwYV9maXhQLT5zZWdtZW50KSkKLQkgICAgICAKLQluZXdfdmFsID0gaHBwYV9maWVsZF9hZGp1c3QgKCp2YWxwLCAwLCBocHBhX2ZpeFAtPmZ4X3JfZmllbGQpOwotI3VuZGVmIGFyZ19yZWxvY19zdHViX25lZWRlZAotCQotICAgICAgc3dpdGNoIChmbXQpCi0JewotCS8qIEhhbmRsZSBhbGwgb3Bjb2RlcyB3aXRoIHRoZSAnaicgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDE0OgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDgxOTEsIC04MTkyLCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTQgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmYzAwMCwKLQkJICAgICAgYnVmKTsKLQkgIGxvd19zaWduX3VuZXh0IChuZXdfdmFsLCAxNCwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCBvcGNvZGVzIHdpdGggdGhlICdrJyBvcGVyYW5kIHR5cGUuICAqLwotCWNhc2UgMjE6Ci0JICBDSEVDS19GSUVMRCAobmV3X3ZhbCwgMjA5NzE1MiwgMCwgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDIxIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZlMDAwMDAsCi0JCSAgICAgIGJ1Zik7Ci0JICBkaXNfYXNzZW1ibGVfMjEgKG5ld192YWwsICZyZXN1bHRpKTsKLQkgIHJlc3VsdCA9IHJlc3VsdGk7Ci0JICBicmVhazsKLQotCS8qIEhhbmRsZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ2knIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxMToKLQkgIENIRUNLX0ZJRUxEIChuZXdfdmFsLCAxMDIzLCAtMTAyMywgMCk7Ci0KLQkgIC8qIE1hc2sgb2ZmIDExIGJpdHMgdG8gYmUgY2hhbmdlZC4gICovCi0JICBiZmRfcHV0XzMyIChzdGRvdXRwdXQsCi0JCSAgICAgIGJmZF9nZXRfMzIgKHN0ZG91dHB1dCwgYnVmKSAmIDB4ZmZmZjgwMCwKLQkJICAgICAgYnVmKTsKLQkgIGxvd19zaWduX3VuZXh0IChuZXdfdmFsLCAxMSwgJnJlc3VsdGkpOwotCSAgcmVzdWx0ID0gcmVzdWx0aTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIGFsbCB0aGUgb3Bjb2RlcyB3aXRoIHRoZSAndycgb3BlcmFuZCB0eXBlLiAgKi8KLQljYXNlIDEyOgotCSAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDgxOTksIC04MTg0LCAwKTsKLQotCSAgLyogTWFzayBvZmYgMTEgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgIHNpZ25fdW5leHQgKChuZXdfdmFsIC0gOCkgPj4gMiwgMTIsICZyZXN1bHRpKTsKLQkgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwKLQkJICAgICAgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmZmZTAwMiwKLQkJICAgICAgYnVmKTsKLQotCSAgZGlzX2Fzc2VtYmxlXzEyIChyZXN1bHRpLCAmdzEsICZ3KTsKLQkgIHJlc3VsdCA9ICgodzEgPDwgMikgfCB3KTsKLQkgIGJyZWFrOwotCi0JLyogSGFuZGxlIHNvbWUgb2YgdGhlIG9wY29kZXMgd2l0aCB0aGUgJ1cnIG9wZXJhbmQgdHlwZS4gICovCi0JY2FzZSAxNzoKLQkgIHsKLQkgICAgaW50IGRpc3RhbmNlID0gKnZhbHA7Ci0KLQkgICAgQ0hFQ0tfRklFTEQgKG5ld192YWwsIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkgICAgLyogSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBicmFuY2ggKGllIG5vIGxpbmspIHdpdGggYW4gb3V0IG9mCi0JICAgICAgIHJhbmdlIHRhcmdldCwgdGhlbiB3ZSB3YW50IHRvIGNvbXBsYWluLiAgKi8KLQkgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfUENSRUxfQ0FMTAotCQkmJiAoZGlzdGFuY2UgPiAyNjIxNDMgfHwgZGlzdGFuY2UgPCAtMjYyMTQ0KQotCQkmJiAoYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwMDAwMCkgPT0gMHhlODAwMDAwMCkKLQkgICAgICBDSEVDS19GSUVMRCAoZGlzdGFuY2UsIDI2MjE0MywgLTI2MjE0NCwgMCk7Ci0KLQkgICAgLyogTWFzayBvZmYgMTcgYml0cyB0byBiZSBjaGFuZ2VkLiAgKi8KLQkgICAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LAotCQkJYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpICYgMHhmZmUwZTAwMiwKLQkJCWJ1Zik7Ci0JICAgIHNpZ25fdW5leHQgKChuZXdfdmFsIC0gOCkgPj4gMiwgMTcsICZyZXN1bHRpKTsKLQkgICAgZGlzX2Fzc2VtYmxlXzE3IChyZXN1bHRpLCAmdzEsICZ3MiwgJncpOwotCSAgICByZXN1bHQgPSAoKHcyIDw8IDIpIHwgKHcxIDw8IDE2KSB8IHcpOwotCSAgICBicmVhazsKLQkgIH0KLQotCWNhc2UgMzI6Ci0JICByZXN1bHQgPSAwOwotCSAgYmZkX3B1dF8zMiAoc3Rkb3V0cHV0LCBuZXdfdmFsLCBidWYpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgYXNfYmFkIChfKCJVbmtub3duIHJlbG9jYXRpb24gZW5jb3VudGVyZWQgaW4gbWRfYXBwbHlfZml4LiIpKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogSW5zZXJ0IHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgICAgIGJmZF9wdXRfMzIgKHN0ZG91dHB1dCwgYmZkX2dldF8zMiAoc3Rkb3V0cHV0LCBidWYpIHwgcmVzdWx0LCBidWYpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmIChfKCJubyBocHBhX2ZpeHVwIGVudHJ5IGZvciB0aGlzIGZpeHVwIChmaXhQID0gMHgleCwgdHlwZSA9IDB4JXgpXG4iKSwKLQkgICAgICAodW5zaWduZWQgaW50KSBmaXhQLCBmaXhQLT5meF9yX3R5cGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgUEEsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldC4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLS8qIFJldHVybiBub256ZXJvIGlmIHRoZSBpbnB1dCBsaW5lIHBvaW50ZXIgaXMgYXQgdGhlIGVuZCBvZgotICAgYSBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgaW50Ci1pc19lbmRfb2Zfc3RhdGVtZW50ICgpCi17Ci0gIHJldHVybiAoKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1xuJykKLQkgIHx8ICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc7JykKLQkgIHx8ICgqaW5wdXRfbGluZV9wb2ludGVyID09ICchJykpOwotfQotCi0vKiBSZWFkIGEgbnVtYmVyIGZyb20gUy4gIFRoZSBudW1iZXIgbWlnaHQgY29tZSBpbiBvbmUgb2YgbWFueSBmb3JtcywKLSAgIHRoZSBtb3N0IGNvbW1vbiB3aWxsIGJlIGEgaGV4IG9yIGRlY2ltYWwgY29uc3RhbnQsIGJ1dCBpdCBjb3VsZCBiZQotICAgYSBwcmUtZGVmaW5lZCByZWdpc3RlciAoWXVrISksIG9yIGFuIGFic29sdXRlIHN5bWJvbC4KLQotICAgUmV0dXJuIGEgbnVtYmVyIG9yIC0xIGZvciBmYWlsdXJlLgotCi0gICBXaGVuIHBhcnNpbmcgUEEtODkgRlAgcmVnaXN0ZXIgbnVtYmVycyBSRVNVTFQgd2lsbCBiZQotICAgdGhlIGFkZHJlc3Mgb2YgYSBzdHJ1Y3R1cmUgdG8gcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0Ci0gICBML1IgaGFsZiBvZiBGUCByZWdpc3RlcnMsIHN0b3JlIHJlc3VsdHMgdGhlcmUgYXMgYXBwcm9wcmlhdGUuCi0KLSAgIHBhX3BhcnNlX251bWJlciBjYW4gbm90IGhhbmRsZSBuZWdhdGl2ZSBjb25zdGFudHMgYW5kIHdpbGwgZmFpbAotICAgaG9ycmlibHkgaWYgaXQgaXMgcGFzc2VkIHN1Y2ggYSBjb25zdGFudC4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX251bWJlciAocywgcmVzdWx0KQotICAgICBjaGFyICoqczsKLSAgICAgc3RydWN0IHBhXzExX2ZwX3JlZ19zdHJ1Y3QgKnJlc3VsdDsKLXsKLSAgaW50IG51bTsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0gIGludCBzdGF0dXM7Ci0gIGNoYXIgKnAgPSAqczsKLQotICAvKiBTa2lwIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBudW1iZXIuICAqLwotICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCi0gICAgcCA9IHAgKyAxOwotCi0gIC8qIFN0b3JlIGluZm8gaW4gUkVTVUxUIGlmIHJlcXVlc3RlZCBieSBjYWxsZXIuICAqLwotICBpZiAocmVzdWx0KQotICAgIHsKLSAgICAgIHJlc3VsdC0+bnVtYmVyX3BhcnQgPSAtMTsKLSAgICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IC0xOwotICAgIH0KLSAgbnVtID0gLTE7Ci0KLSAgaWYgKGlzZGlnaXQgKCpwKSkKLSAgICB7Ci0gICAgICAvKiBMb29rcyBsaWtlIGEgbnVtYmVyLiAgKi8KLSAgICAgIG51bSA9IDA7Ci0KLSAgICAgIGlmICgqcCA9PSAnMCcgJiYgKCoocCArIDEpID09ICd4JyB8fCAqKHAgKyAxKSA9PSAnWCcpKQotCXsKLQkgIC8qIFRoZSBudW1iZXIgaXMgc3BlY2lmaWVkIGluIGhleC4gICovCi0JICBwICs9IDI7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKnApIHx8ICgoKnAgPj0gJ2EnKSAmJiAoKnAgPD0gJ2YnKSkKLQkJIHx8ICgoKnAgPj0gJ0EnKSAmJiAoKnAgPD0gJ0YnKSkpCi0JICAgIHsKLQkgICAgICBpZiAoaXNkaWdpdCAoKnApKQotCQludW0gPSBudW0gKiAxNiArICpwIC0gJzAnOwotCSAgICAgIGVsc2UgaWYgKCpwID49ICdhJyAmJiAqcCA8PSAnZicpCi0JCW51bSA9IG51bSAqIDE2ICsgKnAgLSAnYScgKyAxMDsKLQkgICAgICBlbHNlCi0JCW51bSA9IG51bSAqIDE2ICsgKnAgLSAnQScgKyAxMDsKLQkgICAgICArK3A7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlIG51bWJlciBpcyBzcGVjaWZpZWQgaW4gZGVjaW1hbC4gICovCi0JICB3aGlsZSAoaXNkaWdpdCAoKnApKQotCSAgICB7Ci0JICAgICAgbnVtID0gbnVtICogMTAgKyAqcCAtICcwJzsKLQkgICAgICArK3A7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFN0b3JlIGluZm8gaW4gUkVTVUxUIGlmIHJlcXVlc3RlZCBieSB0aGUgY2FsbGVyLiAgKi8KLSAgICAgIGlmIChyZXN1bHQpCi0JewotCSAgcmVzdWx0LT5udW1iZXJfcGFydCA9IG51bTsKLQotCSAgaWYgKElTX1JfU0VMRUNUIChwKSkKLQkgICAgewotCSAgICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDE7Ci0JICAgICAgKytwOwotCSAgICB9Ci0JICBlbHNlIGlmIChJU19MX1NFTEVDVCAocCkpCi0JICAgIHsKLQkgICAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCSAgICAgICsrcDsKLQkgICAgfQotCSAgZWxzZQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCpwID09ICclJykKLSAgICB7Ci0gICAgICAvKiBUaGUgbnVtYmVyIG1pZ2h0IGJlIGEgcHJlZGVmaW5lZCByZWdpc3Rlci4gICovCi0gICAgICBudW0gPSAwOwotICAgICAgbmFtZSA9IHA7Ci0gICAgICBwKys7Ci0gICAgICBjID0gKnA7Ci0gICAgICAvKiBUZWdlIGhhY2s6IFNwZWNpYWwgY2FzZSBmb3IgZ2VuZXJhbCByZWdpc3RlcnMgYXMgdGhlIGdlbmVyYWwKLSAgICAgICAgIGNvZGUgbWFrZXMgYSBiaW5hcnkgc2VhcmNoIHdpdGggY2FzZSB0cmFuc2xhdGlvbiwgYW5kIGlzIFZFUlkKLSAgICAgICAgIHNsb3cuICovCi0gICAgICBpZiAoYyA9PSAncicpCi0JewotCSAgcCsrOwotCSAgaWYgKCpwID09ICdlJyAmJiAqKHAgKyAxKSA9PSAndCcKLQkgICAgICAmJiAoKihwICsgMikgPT0gJzAnIHx8ICoocCArIDIpID09ICcxJykpCi0JICAgIHsKLQkgICAgICBwICs9IDI7Ci0JICAgICAgbnVtID0gKnAgLSAnMCcgKyAyODsKLQkgICAgICBwKys7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICdwJykKLQkgICAgewotCSAgICAgIG51bSA9IDI7Ci0JICAgICAgcCsrOwotCSAgICB9Ci0JICBlbHNlIGlmICghaXNkaWdpdCAoKnApKQotCSAgICB7Ci0JICAgICAgaWYgKHByaW50X2Vycm9ycykKLQkJYXNfYmFkIChfKCJVbmRlZmluZWQgcmVnaXN0ZXI6ICclcycuIiksIG5hbWUpOwotCSAgICAgIG51bSA9IC0xOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBkbwotCQludW0gPSBudW0gKiAxMCArICpwKysgLSAnMCc7Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCpwKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRG8gYSBub3JtYWwgcmVnaXN0ZXIgc2VhcmNoLiAgKi8KLQkgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMpKQotCSAgICB7Ci0JICAgICAgcCA9IHAgKyAxOwotCSAgICAgIGMgPSAqcDsKLQkgICAgfQotCSAgKnAgPSAwOwotCSAgc3RhdHVzID0gcmVnX25hbWVfc2VhcmNoIChuYW1lKTsKLQkgIGlmIChzdGF0dXMgPj0gMCkKLQkgICAgbnVtID0gc3RhdHVzOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHByaW50X2Vycm9ycykKLQkJYXNfYmFkIChfKCJVbmRlZmluZWQgcmVnaXN0ZXI6ICclcycuIiksIG5hbWUpOwotCSAgICAgIG51bSA9IC0xOwotCSAgICB9Ci0JICAqcCA9IGM7Ci0JfQotCi0gICAgICAvKiBTdG9yZSBpbmZvIGluIFJFU1VMVCBpZiByZXF1ZXN0ZWQgYnkgY2FsbGVyLiAgKi8KLSAgICAgIGlmIChyZXN1bHQpCi0JewotCSAgcmVzdWx0LT5udW1iZXJfcGFydCA9IG51bTsKLQkgIGlmIChJU19SX1NFTEVDVCAocCAtIDEpKQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAxOwotCSAgZWxzZSBpZiAoSVNfTF9TRUxFQ1QgKHAgLSAxKSkKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQkgIGVsc2UKLQkgICAgcmVzdWx0LT5sX3Jfc2VsZWN0ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogQW5kIGZpbmFsbHksIGl0IGNvdWxkIGJlIGEgc3ltYm9sIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uIHdoaWNoCi0gICAgICAgICBpcyBlZmZlY3RpdmVseSBhIGNvbnN0YW50LiAgKi8KLSAgICAgIG51bSA9IDA7Ci0gICAgICBuYW1lID0gcDsKLSAgICAgIGMgPSAqcDsKLSAgICAgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMpKQotCXsKLQkgIHAgPSBwICsgMTsKLQkgIGMgPSAqcDsKLQl9Ci0gICAgICAqcCA9IDA7Ci0gICAgICBpZiAoKHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKSkgIT0gTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX2Fic19zZWN0aW9uKQotCSAgICBudW0gPSBTX0dFVF9WQUxVRSAoc3ltKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChwcmludF9lcnJvcnMpCi0JCWFzX2JhZCAoXygiTm9uLWFic29sdXRlIHN5bWJvbDogJyVzJy4iKSwgbmFtZSk7Ci0JICAgICAgbnVtID0gLTE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhlcmUgaXMgd2hlcmUgd2UnZCBjb21lIGZvciBhbiB1bmRlZmluZWQgc3ltYm9sCi0JICAgICBvciBmb3IgYW4gZW1wdHkgc3RyaW5nLiAgRm9yIGFuIGVtcHR5IHN0cmluZyB3ZQotCSAgICAgd2lsbCByZXR1cm4gemVyby4gIFRoYXQncyBhIGNvbmNlc3Npb24gbWFkZSBmb3IKLQkgICAgIGNvbXBhdGFiaWxpdHkgd2l0aCB0aGUgYnJhaW5kYW1hZ2VkIEhQIGFzc2VtYmxlcnMuICAqLwotCSAgaWYgKCpuYW1lID09IDApCi0JICAgIG51bSA9IDA7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHJpbnRfZXJyb3JzKQotCQlhc19iYWQgKF8oIlVuZGVmaW5lZCBhYnNvbHV0ZSBjb25zdGFudDogJyVzJy4iKSwgbmFtZSk7Ci0JICAgICAgbnVtID0gLTE7Ci0JICAgIH0KLQl9Ci0gICAgICAqcCA9IGM7Ci0KLSAgICAgIC8qIFN0b3JlIGluZm8gaW4gUkVTVUxUIGlmIHJlcXVlc3RlZCBieSBjYWxsZXIuICAqLwotICAgICAgaWYgKHJlc3VsdCkKLQl7Ci0JICByZXN1bHQtPm51bWJlcl9wYXJ0ID0gbnVtOwotCSAgaWYgKElTX1JfU0VMRUNUIChwIC0gMSkpCi0JICAgIHJlc3VsdC0+bF9yX3NlbGVjdCA9IDE7Ci0JICBlbHNlIGlmIChJU19MX1NFTEVDVCAocCAtIDEpKQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCSAgZWxzZQotCSAgICByZXN1bHQtPmxfcl9zZWxlY3QgPSAwOwotCX0KLSAgICB9Ci0KLSAgKnMgPSBwOwotICByZXR1cm4gbnVtOwotfQotCi0jZGVmaW5lIFJFR19OQU1FX0NOVAkoc2l6ZW9mKHByZV9kZWZpbmVkX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHBkX3JlZykpCi0KLS8qIEdpdmVuIE5BTUUsIGZpbmQgdGhlIHJlZ2lzdGVyIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhhdCBuYW1lLCByZXR1cm4KLSAgIHRoZSBpbnRlZ2VyIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciAtMSBvbiBmYWlsdXJlLiAgKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IFJFR19OQU1FX0NOVCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcHJlX2RlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcHJlX2RlZmluZWRfcmVnaXN0ZXJzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotCi0gIHJldHVybiAtMTsKLX0KLQotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZ2l2ZW4gSU5TTiBhbmQgTC9SIGluZm9ybWF0aW9uIHdpbGwgcmVxdWlyZQotICAgYSBuZXcgUEEtMS4xIG9wY29kZS4gICovCi0KLXN0YXRpYyBpbnQKLW5lZWRfcGExMV9vcGNvZGUgKGluc24sIHJlc3VsdCkKLSAgICAgc3RydWN0IHBhX2l0ICppbnNuOwotICAgICBzdHJ1Y3QgcGFfMTFfZnBfcmVnX3N0cnVjdCAqcmVzdWx0OwotewotICBpZiAocmVzdWx0LT5sX3Jfc2VsZWN0ID09IDEgJiYgIShpbnNuLT5mcG9mMSA9PSBEQkwgJiYgaW5zbi0+ZnBvZjIgPT0gREJMKSkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIGluc3RydWN0aW9uIGlzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBhcmNoaXRlY3R1cmUsCi0JIHRoZW4gc2V0IGEgbmV3IGFyY2hpdGVjdHVyZS4gICovCi0gICAgICBpZiAoYmZkX2dldF9tYWNoIChzdGRvdXRwdXQpIDwgcGExMSkKLQl7Ci0JICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIHBhMTEpKQotCSAgICBhc193YXJuIChfKCJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLQl9Ci0gICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8qIFBhcnNlIGEgY29uZGl0aW9uIGZvciBhIGZjbXAgaW5zdHJ1Y3Rpb24uICBSZXR1cm4gdGhlIG51bWVyaWNhbAotICAgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbmRpdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX2ZwX2NtcF9jb25kIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IGNvbmQsIGk7Ci0KLSAgY29uZCA9IDA7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jYXNlY21wICgqcywgZnBfY29uZF9tYXBbaV0uc3RyaW5nLAotCQkgICAgICAgc3RybGVuIChmcF9jb25kX21hcFtpXS5zdHJpbmcpKSA9PSAwKQotCXsKLQkgIGNvbmQgPSBmcF9jb25kX21hcFtpXS5jb25kOwotCSAgKnMgKz0gc3RybGVuIChmcF9jb25kX21hcFtpXS5zdHJpbmcpOwotCSAgLyogSWYgbm90IGEgY29tcGxldGUgbWF0Y2gsIGJhY2sgdXAgdGhlIGlucHV0IHN0cmluZyBhbmQKLQkgICAgIHJlcG9ydCBhbiBlcnJvci4gICovCi0JICBpZiAoKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkgICAgewotCSAgICAgICpzIC09IHN0cmxlbiAoZnBfY29uZF9tYXBbaV0uc3RyaW5nKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgd2hpbGUgKCoqcyA9PSAnICcgfHwgKipzID09ICdcdCcpCi0JICAgICpzID0gKnMgKyAxOwotCSAgcmV0dXJuIGNvbmQ7Ci0JfQotICAgIH0KLQotICBhc19iYWQgKF8oIkludmFsaWQgRlAgQ29tcGFyZSBDb25kaXRpb246ICVzIiksICpzKTsKLQotICAvKiBBZHZhbmNlIG92ZXIgdGhlIGJvZ3VzIGNvbXBsZXRlci4gICovCi0gIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0gICAgKnMgKz0gMTsKLQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBQYXJzZSBhbiBGUCBvcGVyYW5kIGZvcm1hdCBjb21wbGV0ZXIgcmV0dXJuaW5nIHRoZSBjb21wbGV0ZXIKLSAgIHR5cGUuICAqLwotCi1zdGF0aWMgZnBfb3BlcmFuZF9mb3JtYXQKLXBhX3BhcnNlX2ZwX2Zvcm1hdCAocykKLSAgICAgY2hhciAqKnM7Ci17Ci0gIGludCBmb3JtYXQ7Ci0KLSAgZm9ybWF0ID0gU0dMOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgaWYgKHN0cm5jYXNlY21wICgqcywgInNnbCIsIDMpID09IDApCi0JewotCSAgZm9ybWF0ID0gU0dMOwotCSAgKnMgKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnMsICJkYmwiLCAzKSA9PSAwKQotCXsKLQkgIGZvcm1hdCA9IERCTDsKLQkgICpzICs9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKCpzLCAicXVhZCIsIDQpID09IDApCi0JewotCSAgZm9ybWF0ID0gUVVBRDsKLQkgICpzICs9IDU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZvcm1hdCA9IElMTEVHQUxfRk1UOwotCSAgYXNfYmFkIChfKCJJbnZhbGlkIEZQIE9wZXJhbmQgRm9ybWF0OiAlM3MiKSwgKnMpOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZvcm1hdDsKLX0KLQotLyogQ29udmVydCBmcm9tIGEgc2VsZWN0b3Igc3RyaW5nIGludG8gYSBzZWxlY3RvciB0eXBlLiAgKi8KLQotc3RhdGljIGludAotcGFfY2hrX2ZpZWxkX3NlbGVjdG9yIChzdHIpCi0gICAgIGNoYXIgKipzdHI7Ci17Ci0gIGludCBtaWRkbGUsIGxvdywgaGlnaDsKLSAgaW50IGNtcDsKLSAgY2hhciBuYW1lWzRdOwotCi0gIC8qIFJlYWQgcGFzdCBhbnkgd2hpdGVzcGFjZS4gICovCi0gIC8qIEZJWE1FOiBzaG91bGQgd2UgcmVhZCBwYXN0IG5ld2xpbmVzIGFuZCBmb3JtZmVlZHM/Pz8gKi8KLSAgd2hpbGUgKCoqc3RyID09ICcgJyB8fCAqKnN0ciA9PSAnXHQnIHx8ICoqc3RyID09ICdcbicgfHwgKipzdHIgPT0gJ1xmJykKLSAgICAqc3RyID0gKnN0ciArIDE7Ci0KLSAgaWYgKCgqc3RyKVsxXSA9PSAnXCcnIHx8ICgqc3RyKVsxXSA9PSAnJScpCi0gICAgbmFtZVswXSA9IHRvbG93ZXIgKCgqc3RyKVswXSksCi0gICAgbmFtZVsxXSA9IDA7Ci0gIGVsc2UgaWYgKCgqc3RyKVsyXSA9PSAnXCcnIHx8ICgqc3RyKVsyXSA9PSAnJScpCi0gICAgbmFtZVswXSA9IHRvbG93ZXIgKCgqc3RyKVswXSksCi0gICAgbmFtZVsxXSA9IHRvbG93ZXIgKCgqc3RyKVsxXSksCi0gICAgbmFtZVsyXSA9IDA7Ci0jaWZkZWYgT0JKX1NPTQotICBlbHNlIGlmICgoKnN0cilbM10gPT0gJ1wnJyB8fCAoKnN0cilbM10gPT0gJyUnKQotICAgIG5hbWVbMF0gPSB0b2xvd2VyICgoKnN0cilbMF0pLAotICAgIG5hbWVbMV0gPSB0b2xvd2VyICgoKnN0cilbMV0pLAotICAgIG5hbWVbMl0gPSB0b2xvd2VyICgoKnN0cilbMl0pLAotICAgIG5hbWVbM10gPSAwOwotI2VuZGlmCi0gIGVsc2UKLSAgICByZXR1cm4gZV9mc2VsOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSBzaXplb2YgKHNlbGVjdG9yX3RhYmxlKSAvIHNpemVvZiAoc3RydWN0IHNlbGVjdG9yX2VudHJ5KSAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY21wIChuYW1lLCBzZWxlY3Rvcl90YWJsZVttaWRkbGVdLnByZWZpeCk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQl7Ci0JICAqc3RyICs9IHN0cmxlbiAobmFtZSkgKyAxOwotI2lmbmRlZiBPQkpfU09NCi0JICBpZiAoc2VsZWN0b3JfdGFibGVbbWlkZGxlXS5maWVsZF9zZWxlY3RvciA9PSBlX25zZWwpCi0JICAgIHJldHVybiBlX2ZzZWw7Ci0jZW5kaWYKLQkgIHJldHVybiBzZWxlY3Rvcl90YWJsZVttaWRkbGVdLmZpZWxkX3NlbGVjdG9yOwotCX0KLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0KLSAgcmV0dXJuIGVfZnNlbDsKLX0KLQotLyogTWFyayAodmlhIGV4cHJfZW5kKSB0aGUgZW5kIG9mIGFuIGV4cHJlc3Npb24gKEkgdGhpbmspLiAgRklYTUUuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfZXhwcmVzc2lvbiAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0gIGFzZWN0aW9uICpzZWc7Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBzZWcgPSBleHByZXNzaW9uICgmdGhlX2luc24uZXhwKTsKLSAgaWYgKCEoc2VnID09IGFic29sdXRlX3NlY3Rpb24KLQl8fCBzZWcgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQl8fCBTRUdfTk9STUFMIChzZWcpKSkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgc2VnbWVudCBpbiBleHByZXNzaW9uLiIpKTsKLSAgICAgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAwOwotfQotCi0vKiBNYXJrICh2aWEgZXhwcl9lbmQpIHRoZSBlbmQgb2YgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIEZJWE1FLiAqLwotc3RhdGljIGludAotcGFfZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKGluc24sIHN0cnApCi0gICAgIHN0cnVjdCBwYV9pdCAqaW5zbjsKLSAgICAgY2hhciAqKnN0cnA7Ci17Ci0gIGNoYXIgKnNhdmVfaW47Ci0KLSAgaW5zbi0+ZmllbGRfc2VsZWN0b3IgPSBwYV9jaGtfZmllbGRfc2VsZWN0b3IgKHN0cnApOwotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RycDsKLSAgZXhwcmVzc2lvbiAoJmluc24tPmV4cCk7Ci0gIC8qIFRoaXMgaXMgbm90IHBlcmZlY3QsIGJ1dCBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQgb3ZlciBkb2luZyBub3RoaW5nLgotCi0gICAgIFRoZSBQQSBhc3NlbWJseSBzeW50YXggaXMgYW1iaWdpb3VzIGluIGEgdmFyaWV0eSBvZiB3YXlzLiAgQ29uc2lkZXIKLSAgICAgdGhpcyBzdHJpbmcgIjQgJXI1IiAgSXMgdGhhdCB0aGUgbnVtYmVyIDQgZm9sbG93ZWQgYnkgdGhlIHJlZ2lzdGVyCi0gICAgIHI1LCBvciBpcyB0aGF0IDQgTU9EIDU/Ci0KLSAgICAgSWYgd2UgZ2V0IGEgbW9kdWxvIGV4cHJlc2lvbiBXaGVuIGxvb2tpbmcgZm9yIGFuIGFic29sdXRlLCB3ZSB0cnkKLSAgICAgYWdhaW4gY3V0dGluZyBvZmYgdGhlIGlucHV0IHN0cmluZyBhdCB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICAqLwotICBpZiAoaW5zbi0+ZXhwLlhfb3AgPT0gT19tb2R1bHVzKQotICAgIHsKLSAgICAgIGNoYXIgKnMsIGM7Ci0gICAgICBpbnQgcmV0dmFsOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqc3RycDsKLSAgICAgIHMgPSAqc3RycDsKLSAgICAgIHdoaWxlICgqcyAhPSAnLCcgJiYgKnMgIT0gJyAnICYmICpzICE9ICdcdCcpCi0gICAgICAgIHMrKzsKLQotICAgICAgYyA9ICpzOwotICAgICAgKnMgPSAwOwotCi0gICAgICByZXR2YWwgPSBwYV9nZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoaW5zbiwgc3RycCk7Ci0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICAqcyA9IGM7Ci0gICAgICByZXR1cm4gZXZhbHVhdGVfYWJzb2x1dGUgKGluc24pOwotICAgIH0KLSAgaWYgKGluc24tPmV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJCYWQgc2VnbWVudCAoc2hvdWxkIGJlIGFic29sdXRlKS4iKSk7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gZXZhbHVhdGVfYWJzb2x1dGUgKGluc24pOwotfQotCi0vKiBFdmFsdWF0ZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIEVYUCB3aGljaCBtYXkgYmUgbW9kaWZpZWQgYnkKLSAgIHRoZSBzZWxlY3RvciBGSUVMRF9TRUxFQ1RPUi4gIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICAqLwotc3RhdGljIGludAotZXZhbHVhdGVfYWJzb2x1dGUgKGluc24pCi0gICAgIHN0cnVjdCBwYV9pdCAqaW5zbjsKLXsKLSAgaW50IHZhbHVlOwotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBmaWVsZF9zZWxlY3RvciA9IGluc24tPmZpZWxkX3NlbGVjdG9yOwotCi0gIGV4cCA9IGluc24tPmV4cDsKLSAgdmFsdWUgPSBleHAuWF9hZGRfbnVtYmVyOwotCi0gIHN3aXRjaCAoZmllbGRfc2VsZWN0b3IpCi0gICAgewotICAgIC8qIE5vIGNoYW5nZS4gICovCi0gICAgY2FzZSBlX2ZzZWw6Ci0gICAgICBicmVhazsKLQotICAgIC8qIElmIGJpdCAyMSBpcyBvbiB0aGVuIGFkZCAweDgwMCBhbmQgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzLiAgKi8KLSAgICBjYXNlIGVfbHNzZWw6Ci0gICAgICBpZiAodmFsdWUgJiAweDAwMDAwNDAwKQotCXZhbHVlICs9IDB4ODAwOwotICAgICAgdmFsdWUgPSAodmFsdWUgJiAweGZmZmZmODAwKSA+PiAxMTsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogU2lnbiBleHRlbmQgZnJvbSBiaXQgMjEuICAqLwotICAgIGNhc2UgZV9yc3NlbDoKLSAgICAgIGlmICh2YWx1ZSAmIDB4MDAwMDA0MDApCi0JdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGVsc2UKLQl2YWx1ZSAmPSAweDdmZjsKLSAgICAgIGJyZWFrOwotCi0gICAgLyogQXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzLiAgKi8KLSAgICBjYXNlIGVfbHNlbDoKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNldCBiaXRzIDAtMjAgdG8gemVyby4gICovCi0gICAgY2FzZSBlX3JzZWw6Ci0gICAgICB2YWx1ZSA9IHZhbHVlICYgMHg3ZmY7Ci0gICAgICBicmVhazsKLQotICAgIC8qIEFkZCAweDgwMCBhbmQgYXJpdGhtZXRpYyBzaGlmdCByaWdodCAxMSBiaXRzLiAgKi8KLSAgICBjYXNlIGVfbGRzZWw6Ci0gICAgICB2YWx1ZSArPSAweDgwMDsKLSAgICAgIHZhbHVlID0gKHZhbHVlICYgMHhmZmZmZjgwMCkgPj4gMTE7Ci0gICAgICBicmVhazsKLQotICAgIC8qIFNldCBiaXRncyAwLTIxIHRvIG9uZS4gICovCi0gICAgY2FzZSBlX3Jkc2VsOgotICAgICAgdmFsdWUgfD0gMHhmZmZmZjgwMDsKLSAgICAgIGJyZWFrOwotCi0jZGVmaW5lIFJTRUxfUk9VTkQoYykgICgoKGMpICsgMHgxMDAwKSAmIH4weDFmZmYpCi0gICAgY2FzZSBlX3Jyc2VsOgotICAgICAgdmFsdWUgPSAoUlNFTF9ST1VORCAodmFsdWUpICYgMHg3ZmYpICsgKHZhbHVlIC0gUlNFTF9ST1VORCAodmFsdWUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBlX2xyc2VsOgotICAgICAgdmFsdWUgPSAoUlNFTF9ST1VORCAodmFsdWUpID4+IDExKSAmIDB4MWZmZmZmOwotICAgICAgYnJlYWs7Ci0jdW5kZWYgUlNFTF9ST1VORAotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmaWVsZF9zZWxlY3Rvcik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogR2l2ZW4gYW4gYXJndW1lbnQgbG9jYXRpb24gc3BlY2lmaWNhdGlvbiByZXR1cm4gdGhlIGFzc29jaWF0ZWQKLSAgIGFyZ3VtZW50IGxvY2F0aW9uIG51bWJlci4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBhX2J1aWxkX2FyZ19yZWxvYyAodHlwZV9uYW1lKQotICAgICBjaGFyICp0eXBlX25hbWU7Ci17Ci0KLSAgaWYgKHN0cm5jYXNlY21wICh0eXBlX25hbWUsICJubyIsIDIpID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAiZ3IiLCAyKSA9PSAwKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAiZnIiLCAyKSA9PSAwKQotICAgIHJldHVybiAyOwotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAodHlwZV9uYW1lLCAiZnUiLCAyKSA9PSAwKQotICAgIHJldHVybiAzOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCJJbnZhbGlkIGFyZ3VtZW50IGxvY2F0aW9uOiAlc1xuIiksIHR5cGVfbmFtZSk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEVuY29kZSBhbmQgcmV0dXJuIGFuIGFyZ3VtZW50IHJlbG9jYXRpb24gc3BlY2lmaWNhdGlvbiBmb3IKLSAgIHRoZSBnaXZlbiByZWdpc3RlciBpbiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGJ5IGFyZ19yZWxvYy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBhX2FsaWduX2FyZ19yZWxvYyAocmVnLCBhcmdfcmVsb2MpCi0gICAgIHVuc2lnbmVkIGludCByZWc7Ci0gICAgIHVuc2lnbmVkIGludCBhcmdfcmVsb2M7Ci17Ci0gIHVuc2lnbmVkIGludCBuZXdfcmVsb2M7Ci0KLSAgbmV3X3JlbG9jID0gYXJnX3JlbG9jOwotICBzd2l0Y2ggKHJlZykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgbmV3X3JlbG9jIDw8PSA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgbmV3X3JlbG9jIDw8PSA2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbmV3X3JlbG9jIDw8PSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgbmV3X3JlbG9jIDw8PSAyOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiSW52YWxpZCBhcmd1bWVudCBkZXNjcmlwdGlvbjogJWQiKSwgcmVnKTsKLSAgICB9Ci0KLSAgcmV0dXJuIG5ld19yZWxvYzsKLX0KLQotLyogUGFyc2UgYSBQQSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciAoLG4pLiAgUmV0dXJuIG5vbnplcm8gaWYgdGhlCi0gICBjb21wbGV0ZXIgd2FzIGZvdW5kOyByZXR1cm4gemVybyBpZiBubyBjb21wbGV0ZXIgd2FzIGZvdW5kLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2VfbnVsbGlmIChzKQotICAgICBjaGFyICoqczsKLXsKLSAgaW50IG51bGxpZjsKLQotICBudWxsaWYgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyA9ICpzICsgMTsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoKnMsICJuIiwgMSkgPT0gMCkKLQludWxsaWYgPSAxOwotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiSW52YWxpZCBOdWxsaWZpY2F0aW9uOiAoJWMpIiksICoqcyk7Ci0JICBudWxsaWYgPSAwOwotCX0KLSAgICAgICpzID0gKnMgKyAxOwotICAgIH0KLQotICByZXR1cm4gbnVsbGlmOwotfQotCi0vKiBQYXJzZSBhIG5vbi1uZWdhdGVkIGNvbXBhcmUvc3VidHJhY3QgY29tcGxldGVyIHJldHVybmluZyB0aGUKLSAgIG51bWJlciAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2Vfbm9ubmVnX2NtcHN1Yl9jbXBsdHIgKHMsIGlzYnJhbmNoKQotICAgICBjaGFyICoqczsKLSAgICAgaW50IGlzYnJhbmNoOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotICBpbnQgbnVsbGlmeSA9IDA7Ci0KLSAgY21wbHRyID0gMDsKLSAgaWYgKCoqcyA9PSAnLCcpCi0gICAgewotICAgICAgKnMgKz0gMTsKLSAgICAgIHdoaWxlICgqKnMgIT0gJywnICYmICoqcyAhPSAnICcgJiYgKipzICE9ICdcdCcpCi0JKnMgKz0gMTsKLSAgICAgIGMgPSAqKnM7Ci0gICAgICAqKnMgPSAweDAwOwotCi0KLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPDwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPDw9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQkgIG51bGxpZnkgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjbXBsdHIgPSAtMTsKLQl9Ci0gICAgICAqKnMgPSBjOwotICAgIH0KLQotICAvKiBSZXNldCBwb2ludGVycyBpZiB0aGlzIHdhcyByZWFsbHkgYSAsbiBmb3IgYSBicmFuY2ggaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAobnVsbGlmeSkKLSAgICAqcyA9IHNhdmVfczsKLQotCi0gIHJldHVybiBjbXBsdHI7Ci19Ci0KLS8qIFBhcnNlIGEgbmVnYXRlZCBjb21wYXJlL3N1YnRyYWN0IGNvbXBsZXRlciByZXR1cm5pbmcgdGhlCi0gICBudW1iZXIgKGZvciBlbmNvZGluZyBpbiBpbnN0cnV0aW9ucykgb2YgdGhlIGdpdmVuIGNvbXBsZXRlci4KLQotICAgSVNCUkFOQ0ggc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgaXMgcGFyc2luZyBhIGNvbmRpdGlvbgotICAgY29tcGxldGVyIGZvciBhIGJyYW5jaCAodnMgYSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlciBmb3IgYQotICAgY29tcHV0YXRpb25hbCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25lZ19jbXBzdWJfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLSAgaW50IG51bGxpZnkgPSAwOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLQotCi0gICAgICBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJuc3YiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDY7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA3OwotCX0KLSAgICAgIC8qIElmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgYWRkYixuIHRoZW4gdGhlcmUgaXMgbm8gY29uZGl0aW9uCi0gICAgICAgICBjb21wbGV0ZXIuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm4iKSA9PSAwICYmIGlzYnJhbmNoKQotCXsKLQkgIGNtcGx0ciA9IDA7Ci0JICBudWxsaWZ5ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG51bGxpZnkpCi0gICAgKnMgPSBzYXZlX3M7Ci0KLQotICByZXR1cm4gY21wbHRyOwotfQotCi0KLS8qIFBhcnNlIGEgbm9uLW5lZ2F0ZWQgYWRkaXRpb24gY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyCi0gICAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIGludAotcGFfcGFyc2Vfbm9ubmVnX2FkZF9jbXBsdHIgKHMsIGlzYnJhbmNoKQotICAgICBjaGFyICoqczsKLSAgICAgaW50IGlzYnJhbmNoOwotewotICBpbnQgY21wbHRyOwotICBjaGFyICpuYW1lID0gKnMgKyAxOwotICBjaGFyIGM7Ci0gIGNoYXIgKnNhdmVfcyA9ICpzOwotCi0gIGNtcGx0ciA9IDA7Ci0gIGlmICgqKnMgPT0gJywnKQotICAgIHsKLSAgICAgICpzICs9IDE7Ci0gICAgICB3aGlsZSAoKipzICE9ICcsJyAmJiAqKnMgIT0gJyAnICYmICoqcyAhPSAnXHQnKQotCSpzICs9IDE7Ci0gICAgICBjID0gKipzOwotICAgICAgKipzID0gMHgwMDsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsICI9IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjwiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDI7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiPD0iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm51diIpID09IDApCi0JewotCSAgY21wbHRyID0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiem52IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA1OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJzdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAib2QiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGNtcGx0ciA9PSAwICYmICpuYW1lID09ICduJyAmJiBpc2JyYW5jaCkKLSAgICAqcyA9IHNhdmVfczsKLQotICByZXR1cm4gY21wbHRyOwotfQotCi0vKiBQYXJzZSBhIG5lZ2F0ZWQgYWRkaXRpb24gY29tcGxldGVyIHJldHVybmluZyB0aGUgbnVtYmVyCi0gICAoZm9yIGVuY29kaW5nIGluIGluc3RydXRpb25zKSBvZiB0aGUgZ2l2ZW4gY29tcGxldGVyLgotCi0gICBJU0JSQU5DSCBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhpcyBpcyBwYXJzaW5nIGEgY29uZGl0aW9uCi0gICBjb21wbGV0ZXIgZm9yIGEgYnJhbmNoICh2cyBhIG51bGxpZmljYXRpb24gY29tcGxldGVyIGZvciBhCi0gICBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9uKS4gICovCi0KLXN0YXRpYyBpbnQKLXBhX3BhcnNlX25lZ19hZGRfY21wbHRyIChzLCBpc2JyYW5jaCkKLSAgICAgY2hhciAqKnM7Ci0gICAgIGludCBpc2JyYW5jaDsKLXsKLSAgaW50IGNtcGx0cjsKLSAgY2hhciAqbmFtZSA9ICpzICsgMTsKLSAgY2hhciBjOwotICBjaGFyICpzYXZlX3MgPSAqczsKLQotICBjbXBsdHIgPSAwOwotICBpZiAoKipzID09ICcsJykKLSAgICB7Ci0gICAgICAqcyArPSAxOwotICAgICAgd2hpbGUgKCoqcyAhPSAnLCcgJiYgKipzICE9ICcgJyAmJiAqKnMgIT0gJ1x0JykKLQkqcyArPSAxOwotICAgICAgYyA9ICoqczsKLSAgICAgICoqcyA9IDB4MDA7Ci0gICAgICBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInRyIikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIjw+IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj49IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIj4iKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDM7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgInV2IikgPT0gMCkKLQl7Ci0JICBjbXBsdHIgPSA0OwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJ2bnoiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDU7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgIm5zdiIpID09IDApCi0JewotCSAgY21wbHRyID0gNjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAiZXYiKSA9PSAwKQotCXsKLQkgIGNtcGx0ciA9IDc7Ci0JfQotICAgICAgLyogSWYgd2UgaGF2ZSBzb21ldGhpbmcgbGlrZSBhZGRiLG4gdGhlbiB0aGVyZSBpcyBubyBjb25kaXRpb24KLSAgICAgICAgIGNvbXBsZXRlci4gICovCi0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChuYW1lLCAibiIpID09IDAgJiYgaXNicmFuY2gpCi0JewotCSAgY21wbHRyID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY21wbHRyID0gLTE7Ci0JfQotICAgICAgKipzID0gYzsKLSAgICB9Ci0KLSAgLyogUmVzZXQgcG9pbnRlcnMgaWYgdGhpcyB3YXMgcmVhbGx5IGEgLG4gZm9yIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGNtcGx0ciA9PSAwICYmICpuYW1lID09ICduJyAmJiBpc2JyYW5jaCkKLSAgICAqcyA9IHNhdmVfczsKLQotICByZXR1cm4gY21wbHRyOwotfQotCi0jaWZkZWYgT0JKX1NPTQotLyogSGFuZGxlIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuICBTcGVjaWFsIHNvIHRoYXQgd2UgY2FuIHVwZGF0ZSB0aGUKLSAgIGFsaWdubWVudCBvZiB0aGUgc3Vic3BhY2UgaWYgbmVjZXNzYXJ5LiAgKi8KLXN0YXRpYyB2b2lkCi1wYV9hbGlnbiAoYnl0ZXMpCi17Ci0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotCi0gIC8qIExldCB0aGUgZ2VuZXJpYyBnYXMgY29kZSBkbyBtb3N0IG9mIHRoZSB3b3JrLiAgKi8KLSAgc19hbGlnbl9ieXRlcyAoYnl0ZXMpOwotCi0gIC8qIElmIGJ5dGVzIGlzIGEgcG93ZXIgb2YgMiwgdGhlbiB1cGRhdGUgdGhlIGN1cnJlbnQgc3Vic3BhY2UncwotICAgICBhbGlnbm1lbnQgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgaWYgKGxvZzIgKGJ5dGVzKSAhPSAtMSkKLSAgICByZWNvcmRfYWxpZ25tZW50IChjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc2VnLCBsb2cyIChieXRlcykpOwotfQotI2VuZGlmCi0KLS8qIEhhbmRsZSBhIC5CTE9DSyB0eXBlIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9ibG9jayAoeikKLSAgICAgaW50IHo7Ci17Ci0gIGNoYXIgKnA7Ci0gIGxvbmcgaW50IHRlbXBfZmlsbDsKLSAgdW5zaWduZWQgaW50IHRlbXBfc2l6ZTsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgdGVtcF9zaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgLyogQWx3YXlzIGZpbGwgd2l0aCB6ZXJvcywgdGhhdCdzIHdoYXQgdGhlIEhQIGFzc2VtYmxlciBkb2VzLiAgKi8KLSAgdGVtcF9maWxsID0gMDsKLQotICBwID0gZnJhZ192YXIgKHJzX2ZpbGwsIChpbnQpIHRlbXBfc2l6ZSwgKGludCkgdGVtcF9zaXplLAotCQkocmVsYXhfc3Vic3RhdGVUKSAwLCAoc3ltYm9sUyAqKSAwLCAob2Zmc2V0VCkgMSwgTlVMTCk7Ci0gIG1lbXNldCAocCwgMCwgdGVtcF9zaXplKTsKLQotICAvKiBDb252ZXJ0IDIgYnl0ZXMgYXQgYSB0aW1lLiAgKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgdGVtcF9zaXplOyBpICs9IDIpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgaSwKLQkJCSAgKHZhbHVlVCkgdGVtcF9maWxsLAotCQkJICAoaW50KSAoKHRlbXBfc2l6ZSAtIGkpID4gMiA/IDIgOiAodGVtcF9zaXplIC0gaSkpKTsKLSAgICB9Ci0KLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5iZWdpbl9icnRhYiBhbmQgLmVuZF9icnRhYiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfYnJ0YWIgKGJlZ2luKQotICAgICBpbnQgYmVnaW47Ci17Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFRoZSBCUlRBQiByZWxvY2F0aW9ucyBhcmUgb25seSBhdmFpbGJsZSBpbiBTT00gKHRvIGRlbm90ZQotICAgICB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYnJhbmNoIHRhYmxlcykuICAqLwotICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgd2hlcmUgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMCwKLQkJTlVMTCwgKG9mZnNldFQpIDAsIE5VTEwsCi0JCTAsIGJlZ2luID8gUl9IUFBBX0JFR0lOX0JSVEFCIDogUl9IUFBBX0VORF9CUlRBQiwKLQkJZV9mc2VsLCAwLCAwLCBOVUxMKTsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5iZWdpbl90cnkgYW5kIC5lbmRfdHJ5IHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV90cnkgKGJlZ2luKQotICAgICBpbnQgYmVnaW47Ci17Ci0jaWZkZWYgT0JKX1NPTQotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotICBpZiAoISBiZWdpbikKLSAgICBleHByZXNzaW9uICgmZXhwKTsKLQotICAvKiBUaGUgVFJZIHJlbG9jYXRpb25zIGFyZSBvbmx5IGF2YWlsYmxlIGluIFNPTSAodG8gZGVub3RlCi0gICAgIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBleGNlcHRpb24gaGFuZGxpbmcgcmVnaW9ucykuICAqLwotCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCU5VTEwsIChvZmZzZXRUKSAwLCBiZWdpbiA/IE5VTEwgOiAmZXhwLAotCQkwLCBiZWdpbiA/IFJfSFBQQV9CRUdJTl9UUlkgOiBSX0hQUEFfRU5EX1RSWSwKLQkJZV9mc2VsLCAwLCAwLCBOVUxMKTsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5DQUxMIHBzZXVkby1vcC4gIFRoaXMgaW52b2x2ZXMgc3RvcmluZyBhd2F5IGluZm9ybWF0aW9uCi0gICBhYm91dCB3aGVyZSBhcmd1bWVudHMgYXJlIHRvIGJlIGZvdW5kIHNvIHRoZSBsaW5rZXIgY2FuIGRldGVjdAotICAgKGFuZCBjb3JyZWN0KSBhcmd1bWVudCBsb2NhdGlvbiBtaXNtYXRjaGVzIGJldHdlZW4gY2FsbGVyIGFuZCBjYWxsZWUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2FsbCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBwYV9jYWxsX2FyZ3MgKCZsYXN0X2NhbGxfZGVzYyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIERvIHRoZSBkaXJ0eSB3b3JrIG9mIGJ1aWxkaW5nIGEgY2FsbCBkZXNjcmlwdG9yIHdoaWNoIGRlc2NyaWJlcwotICAgd2hlcmUgdGhlIGNhbGxlciBwbGFjZWQgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24gY2FsbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jYWxsX2FyZ3MgKGNhbGxfZGVzYykKLSAgICAgc3RydWN0IGNhbGxfZGVzYyAqY2FsbF9kZXNjOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgdW5zaWduZWQgaW50IHRlbXAsIGFyZ19yZWxvYzsKLQotICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIC8qIFByb2Nlc3MgYSBzb3VyY2UgYXJndW1lbnQuICAqLwotICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImFyZ3ciLCA0KSA9PSAwKSkKLQl7Ci0JICB0ZW1wID0gYXRvaSAobmFtZSArIDQpOwotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGFyZ19yZWxvYyA9IHBhX2J1aWxkX2FyZ19yZWxvYyAobmFtZSk7Ci0JICBjYWxsX2Rlc2MtPmFyZ19yZWxvYyB8PSBwYV9hbGlnbl9hcmdfcmVsb2MgKHRlbXAsIGFyZ19yZWxvYyk7Ci0JfQotICAgICAgLyogUHJvY2VzcyBhIHJldHVybiB2YWx1ZS4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJydG52YWwiLCA2KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgYXJnX3JlbG9jID0gcGFfYnVpbGRfYXJnX3JlbG9jIChuYW1lKTsKLQkgIGNhbGxfZGVzYy0+YXJnX3JlbG9jIHw9IChhcmdfcmVsb2MgJiAweDMpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIkludmFsaWQgLkNBTEwgYXJndW1lbnQ6ICVzIiksIG5hbWUpOwotCX0KLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gVFJVRSBpZiBGUkFHMSBhbmQgRlJBRzIgYXJlIHRoZSBzYW1lLiAgKi8KLQotc3RhdGljIGludAotaXNfc2FtZV9mcmFnIChmcmFnMSwgZnJhZzIpCi0gICAgIGZyYWdTICpmcmFnMTsKLSAgICAgZnJhZ1MgKmZyYWcyOwotewotCi0gIGlmIChmcmFnMSA9PSBOVUxMKQotICAgIHJldHVybiAoRkFMU0UpOwotICBlbHNlIGlmIChmcmFnMiA9PSBOVUxMKQotICAgIHJldHVybiAoRkFMU0UpOwotICBlbHNlIGlmIChmcmFnMSA9PSBmcmFnMikKLSAgICByZXR1cm4gKFRSVUUpOwotICBlbHNlIGlmIChmcmFnMi0+ZnJfdHlwZSA9PSByc19maWxsICYmIGZyYWcyLT5mcl9maXggPT0gMCkKLSAgICByZXR1cm4gKGlzX3NhbWVfZnJhZyAoZnJhZzEsIGZyYWcyLT5mcl9uZXh0KSk7Ci0gIGVsc2UKLSAgICByZXR1cm4gKEZBTFNFKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLS8qIEJ1aWxkIGFuIGVudHJ5IGluIHRoZSBVTldJTkQgc3Vic3BhY2UgZnJvbSB0aGUgZ2l2ZW4gZnVuY3Rpb24KLSAgIGF0dHJpYnV0ZXMgaW4gQ0FMTF9JTkZPLiAgVGhpcyBpcyBub3QgbmVlZGVkIGZvciBTT00gYXMgdXNpbmcKLSAgIFJfRU5UUlkgYW5kIFJfRVhJVCByZWxvY2F0aW9ucyBhbGxvdyB0aGUgbGlua2VyIHRvIGhhbmRsZSBidWlsZGluZwotICAgb2YgdGhlIHVud2luZCBzcGFjZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlIChjYWxsX2luZm8pCi0gICAgIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mbzsKLXsKLSNpZiAwCi0gIGNoYXIgKnVud2luZDsKLSAgYXNlY3Rpb24gKnNlZywgKnNhdmVfc2VnOwotICBzdWJzZWdUIHN1YnNlZywgc2F2ZV9zdWJzZWc7Ci0gIGludCBpOwotICBjaGFyIGMsICpwOwotCi0gIC8qIEdldCBpbnRvIHRoZSByaWdodCBzZWcvc3Vic2VnLiAgVGhpcyBtYXkgaW52b2x2ZSBjcmVhdGluZwotICAgICB0aGUgc2VnIHRoZSBmaXJzdCB0aW1lIHRocm91Z2guICBNYWtlIHN1cmUgdG8gaGF2ZSB0aGUKLSAgICAgb2xkIHNlZy9zdWJzZWcgc28gdGhhdCB3ZSBjYW4gcmVzZXQgdGhpbmdzIHdoZW4gd2UgYXJlIGRvbmUuICAqLwotICBzdWJzZWcgPSBTVUJTRUdfVU5XSU5EOwotICBzZWcgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoc3Rkb3V0cHV0LCBVTldJTkRfU0VDVElPTl9OQU1FKTsKLSAgaWYgKHNlZyA9PSBBU0VDX05VTEwpCi0gICAgewotICAgICAgc2VnID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChzdGRvdXRwdXQsIFVOV0lORF9TRUNUSU9OX05BTUUpOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCSAgICAgU0VDX1JFQURPTkxZIHwgU0VDX0hBU19DT05URU5UUwotCQkJICAgICB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DKTsKLSAgICB9Ci0KLSAgc2F2ZV9zZWcgPSBub3dfc2VnOwotICBzYXZlX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLQotCi0gIC8qIEdldCBzb21lIHNwYWNlIHRvIGhvbGQgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHVud2luZAotICAgICBkZXNjcmlwdG9yLiAgKi8KLSAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAocCwgMCwgNCk7Ci0KLSAgLyogUmVsb2NhdGlvbiBpbmZvLiBmb3Igc3RhcnQgb2Zmc2V0IG9mIHRoZSBmdW5jdGlvbi4gICovCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwKLQkJY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgUl9QQVJJU0NfRElSMzIsIGVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIDAsIDQpOwotCi0gIC8qIFJlbG9jYXRpb24gaW5mby4gZm9yIGVuZCBvZmZzZXQgb2YgdGhlIGZ1bmN0aW9uLgotCi0gICAgIEJlY2F1c2Ugd2UgYWxsb3cgcmVkdWN0aW9ucyBvZiAzMmJpdCByZWxvY2F0aW9ucyBmb3IgRUxGLCB0aGlzIHdpbGwgYmUKLSAgICAgcmVkdWNlZCB0byBzZWN0aW9uX3N5bSArIG9mZnNldCB3aGljaCBhdm9pZHMgcHV0dGluZyB0aGUgdGVtcG9yYXJ5Ci0gICAgIHN5bWJvbCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBJdCAoc2hvdWxkKSBlbmQgdXAgZ2l2aW5nIHRoZSBzYW1lCi0gICAgIHZhbHVlIGFzIGNhbGxfaW5mby0+c3RhcnRfc3ltYm9sICsgZnVuY3Rpb24gc2l6ZSBvbmNlIHRoZSBsaW5rZXIgaXMKLSAgICAgZmluaXNoZWQgd2l0aCBpdHMgd29yay4gICovCi0KLSAgZml4X25ld19ocHBhIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQljYWxsX2luZm8tPmVuZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkoZXhwcmVzc2lvblMgKikgTlVMTCwgMCwgUl9QQVJJU0NfRElSMzIsIGVfZnNlbCwgMzIsIDAsIE5VTEwpOwotCi0gIC8qIER1bXAgaXQuICovCi0gIHVud2luZCA9IChjaGFyICopICZjYWxsX2luZm8tPmNpX3Vud2luZDsKLSAgZm9yIChpID0gODsgaSA8IHNpemVvZiAoc3RydWN0IHVud2luZF90YWJsZSk7IGkrKykKLSAgICB7Ci0gICAgICBjID0gKih1bndpbmQgKyBpKTsKLSAgICAgIHsKLQlGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotICAgICAgfQotICAgIH0KLQotICAvKiBSZXR1cm4gYmFjayB0byB0aGUgb3JpZ2luYWwgc2VnbWVudC9zdWJzZWdtZW50LiAgKi8KLSAgc3Vic2VnX3NldCAoc2F2ZV9zZWcsIHNhdmVfc3Vic2VnKTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLS8qIFByb2Nlc3MgYSAuQ0FMTElORk8gcHNldWRvLW9wLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGxhdGVyCi0gICB0byBidWlsZCB1bndpbmQgZGVzY3JpcHRvcnMgYW5kIG1heWJlIG9uZSBkYXkgdG8gc3VwcG9ydAotICAgLkVOVEVSIGFuZCAuTEVBVkUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY2FsbGluZm8gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIGludCB0ZW1wOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIC8qIC5DQUxMSU5GTyBtdXN0IGFwcGVhciB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gICovCi0gIGlmICghd2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19iYWQgKF8oIi5jYWxsaW5mbyBpcyBub3Qgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24iKSk7Ci0KLSAgLyogTWFyayB0aGUgZmFjdCB0aGF0IHdlIGZvdW5kIHRoZSAuQ0FMTElORk8gZm9yIHRoZQotICAgICBjdXJyZW50IHByb2NlZHVyZS4gICovCi0gIGNhbGxpbmZvX2ZvdW5kID0gVFJVRTsKLQotICAvKiBJdGVyYXRlIG92ZXIgdGhlIC5DQUxMSU5GTyBhcmd1bWVudHMuICAqLwotICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIC8qIEZyYW1lIHNpemUgc3BlY2lmaWNhdGlvbi4gICovCi0gICAgICBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZnJhbWUiLCA1KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBpZiAoKHRlbXAgJiAweDMpICE9IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkZSQU1FIHBhcmFtZXRlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgODogJWRcbiIpLCB0ZW1wKTsKLQkgICAgICB0ZW1wID0gMDsKLQkgICAgfQotCi0JICAvKiBjYWxsaW5mbyBpcyBpbiBieXRlcyBhbmQgdW53aW5kX2Rlc2MgaXMgaW4gOCBieXRlIHVuaXRzLiAgKi8KLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5mcmFtZV9zaXplID0gdGVtcCAvIDg7Ci0KLQl9Ci0gICAgICAvKiBFbnRyeSByZWdpc3RlciAoR1IsIEdSIGFuZCBTUikgc3BlY2lmaWNhdGlvbnMuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZW50cnlfZ3IiLCA4KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICAvKiBUaGUgSFAgYXNzZW1ibGVyIGFjY2VwdHMgMTkgYXMgdGhlIGhpZ2ggYm91bmQgZm9yIEVOVFJZX0dSCi0JICAgICBldmVuIHRob3VnaCAlcjE5IGlzIGNhbGxlciBzYXZlZC4gIEkgdGhpbmsgdGhpcyBpcyBhIGJ1ZyBpbgotCSAgICAgdGhlIEhQIGFzc2VtYmxlciwgYW5kIHdlIGFyZSBub3QgZ29pbmcgdG8gZW11bGF0ZSBpdC4gICovCi0JICBpZiAodGVtcCA8IDMgfHwgdGVtcCA+IDE4KQotCSAgICBhc19iYWQgKF8oIlZhbHVlIGZvciBFTlRSWV9HUiBtdXN0IGJlIGluIHRoZSByYW5nZSAzLi4xOFxuIikpOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmVudHJ5X2dyID0gdGVtcCAtIDI7Ci0JfQotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiZW50cnlfZnIiLCA4KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICAvKiBTaW1pbGFybHkgdGhlIEhQIGFzc2VtYmxlciB0YWtlcyAzMSBhcyB0aGUgaGlnaCBib3VuZCBldmVuCi0JICAgICB0aG91Z2ggJWZyMjEgaXMgdGhlIGxhc3QgY2FsbGVlIHNhdmVkIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KLQkgIGlmICh0ZW1wIDwgMTIgfHwgdGVtcCA+IDIxKQotCSAgICBhc19iYWQgKF8oIlZhbHVlIGZvciBFTlRSWV9GUiBtdXN0IGJlIGluIHRoZSByYW5nZSAxMi4uMjFcbiIpKTsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5lbnRyeV9mciA9IHRlbXAgLSAxMTsKLQl9Ci0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJlbnRyeV9zciIsIDgpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmICh0ZW1wICE9IDMpCi0JICAgIGFzX2JhZCAoXygiVmFsdWUgZm9yIEVOVFJZX1NSIG11c3QgYmUgM1xuIikpOwotCX0KLSAgICAgIC8qIE5vdGUgd2hldGhlciBvciBub3QgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhbnkgY2FsbHMuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiY2FsbHMiLCA1KSA9PSAwKSB8fAotCSAgICAgICAoc3RybmNhc2VjbXAgKG5hbWUsICJjYWxsZXIiLCA2KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCX0KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgIm5vX2NhbGxzIiwgOCkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQl9Ci0gICAgICAvKiBTaG91bGQgUlAgYmUgc2F2ZWQgaW50byB0aGUgc3RhY2suICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAic2F2ZV9ycCIsIDcpID09IDApKQotCXsKLQkgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAqcCA9IGM7Ci0JICBsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3Iuc2F2ZV9ycCA9IDE7Ci0JfQotICAgICAgLyogTGlrZXdpc2UgZm9yIFNQLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNhdmVfc3AiLCA3KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLnNhdmVfc3AgPSAxOwotCX0KLSAgICAgIC8qIElzIHRoaXMgYW4gdW53aW5kYWJsZSBwcm9jZWR1cmUuICBJZiBzbyBtYXJrIGl0IHNvCi0gICAgICAgICBpbiB0aGUgdW53aW5kIGRlc2NyaXB0b3IuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAibm9fdW53aW5kIiwgOSkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5jYW5ub3RfdW53aW5kID0gMTsKLQl9Ci0gICAgICAvKiBJcyB0aGlzIGFuIGludGVycnVwdCByb3V0aW5lLiAgSWYgc28gbWFyayBpdCBpbiB0aGUKLSAgICAgICAgIHVud2luZCBkZXNjcmlwdG9yLiAgKi8KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImhwdXhfaW50IiwgNykgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5ocHV4X2ludGVycnVwdF9tYXJrZXIgPSAxOwotCX0KLSAgICAgIC8qIElzIHRoaXMgYSBtaWxsaWNvZGUgcm91dGluZS4gICJtaWxsaWNvZGUiIGlzbid0IGluIG15Ci0JIGFzc2VtYmxlciBtYW51YWwsIGJ1dCBteSBjb3B5IGlzIG9sZC4gIFRoZSBIUCBhc3NlbWJsZXIKLQkgYWNjZXB0cyBpdCwgYW5kIHRoZXJlJ3MgYSBwbGFjZSBpbiB0aGUgdW53aW5kIGRlc2NyaXB0b3IKLQkgdG8gZHJvcCB0aGUgaW5mb3JtYXRpb24sIHNvIHdlJ2xsIGFjY2VwdCBpdCB0b28uICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAibWlsbGljb2RlIiwgOSkgPT0gMCkpCi0JewotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQkgIGxhc3RfY2FsbF9pbmZvLT5jaV91bndpbmQuZGVzY3JpcHRvci5taWxsaWNvZGUgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oIkludmFsaWQgLkNBTExJTkZPIGFyZ3VtZW50OiAlcyIpLCBuYW1lKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCX0KLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogU3dpdGNoIGludG8gdGhlIGNvZGUgc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29kZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgY3VycmVudF9zcGFjZSA9IGlzX2RlZmluZWRfc3BhY2UgKCIkVEVYVCQiKTsKLSAgY3VycmVudF9zdWJzcGFjZQotICAgID0gcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoY3VycmVudF9zcGFjZS0+c2Rfc2VnLCAwKTsKLSNlbmRpZgotICBzX3RleHQgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgc3RhbmRhcmQgR0FTIHNfY29tbSgpLiBPbiBIUDkwMDAvODAwIG1hY2hpbmVzLAotICAgdGhlIC5jb21tIHBzZXVkby1vcCBoYXMgdGhlIGZvbGxvd2luZyBzeW10YXg6Ci0KLSAgIDxsYWJlbD4gLmNvbW0gPGxlbmd0aD4KLQotICAgd2hlcmUgPGxhYmVsPiBpcyBvcHRpb25hbCBhbmQgaXMgYSBzeW1ib2wgd2hvc2UgYWRkcmVzcyB3aWxsIGJlIHRoZSBzdGFydCBvZgotICAgYSBibG9jayBvZiBtZW1vcnkgPGxlbmd0aD4gYnl0ZXMgbG9uZy4gPGxlbmd0aD4gbXVzdCBiZSBhbiBhYnNvbHV0ZQotICAgZXhwcmVzc2lvbi4gIDxsZW5ndGg+IGJ5dGVzIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZSBjdXJyZW50IHNwYWNlCi0gICBhbmQgc3Vic3BhY2UuCi0KLSAgIEFsc28gbm90ZSB0aGUgbGFiZWwgbWF5IG5vdCBldmVuIGJlIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIC5jb21tLgotCi0gICBUaGlzIGRpZmZlcmVuY2UgaW4gc3ludGF4IG1lYW5zIHRoZSBjb2xvbiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotICAgb24gdGhlIHN5bWJvbCBiZWZvcmUgd2UgYXJyaXZlIGluIHBhX2NvbW0uICBjb2xvbiB3aWxsIHNldCBhIG51bWJlcgotICAgb2YgYXR0cmlidXRlcyBvZiB0aGUgc3ltYm9sIHRoYXQgbmVlZCB0byBiZSBmaXhlZCBoZXJlLiAgSW4gcGFydGljdWxhcgotICAgdGhlIHZhbHVlLCBzZWN0aW9uIHBvaW50ZXIsIGZyYWdtZW50IHBvaW50ZXIsIGZsYWdzLCBldGMuICBXaGF0Ci0gICBhIHBhaW4uCi0KLSAgIFRoaXMgYWxzbyBtYWtlcyBlcnJvciBkZXRlY3Rpb24gYWxsIGJ1dCBpbXBvc3NpYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2NvbW0gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIHN5bWJvbFMgKnN5bWJvbDsKLSAgbGFiZWxfc3ltYm9sX3N0cnVjdCAqbGFiZWxfc3ltYm9sID0gcGFfZ2V0X2xhYmVsICgpOwotCi0gIGlmIChsYWJlbF9zeW1ib2wpCi0gICAgc3ltYm9sID0gbGFiZWxfc3ltYm9sLT5sc3NfbGFiZWw7Ci0gIGVsc2UKLSAgICBzeW1ib2wgPSBOVUxMOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgc2l6ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGlmIChzeW1ib2wpCi0gICAgewotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbCwgc2l6ZSk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2wsIGJmZF91bmRfc2VjdGlvbl9wdHIpOwotICAgICAgU19TRVRfRVhURVJOQUwgKHN5bWJvbCk7Ci0KLSAgICAgIC8qIGNvbG9uKCkgaGFzIGFscmVhZHkgc2V0IHRoZSBmcmFnIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIGluIHRoZQotICAgICAgICAgY3VycmVudCBzdWJzcGFjZTsgd2UgbmVlZCB0byByZXNldCB0aGUgZnJhZ21lbnQgdG8gdGhlIHplcm8gYWRkcmVzcwotICAgICAgICAgZnJhZ21lbnQuICBXZSBhbHNvIG5lZWQgdG8gcmVzZXQgdGhlIHNlZ21lbnQgcG9pbnRlci4gICovCi0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFByb2Nlc3MgYSAuRU5EIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9lbmQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyBhIC5FTlRFUiBwc2V1ZG8tb3AuICBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICAqLwotc3RhdGljIHZvaWQKLXBhX2VudGVyICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIGFzX2JhZCAoXygiVGhlIC5FTlRFUiBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZCIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyBhIC5FTlRSWSBwc2V1ZG8tb3AuICAuRU5UUlkgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIHByb2Nlc3VyZS4gICovCi1zdGF0aWMgdm9pZAotcGFfZW50cnkgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgaWYgKCF3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2JhZCAoXygiTWlzcGxhY2VkIC5lbnRyeS4gSWdub3JlZC4iKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIWNhbGxpbmZvX2ZvdW5kKQotCWFzX2JhZCAoXygiTWlzc2luZyAuY2FsbGluZm8uIikpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgd2l0aGluX2VudHJ5X2V4aXQgPSBUUlVFOwotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBTT00gZGVmZXJzIGJ1aWxkaW5nIG9mIHVud2luZCBkZXNjcmlwdG9ycyB1bnRpbCB0aGUgbGluayBwaGFzZS4KLSAgICAgVGhlIGFzc2VtYmxlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYW4gUl9FTlRSWSByZWxvY2F0aW9uCi0gICAgIHRvIG1hcmsgdGhlIGJlZ2lubmluZyBvZiBhIHJlZ2lvbiBhbmQgaG9sZCB0aGUgdW53aW5kIGJpdHMsIGFuZAotICAgICBmb3IgY3JlYXRpbmcgYW4gUl9FWElUIHJlbG9jYXRpb24gdG8gbWFyayB0aGUgZW5kIG9mIHRoZSByZWdpb24uCi0KLSAgICAgRklYTUUuICBFTEYgc2hvdWxkIGJlIHVzaW5nIHRoZSBzYW1lIGNvbnZlbnRpb25zISAgVGhlIHByb2JsZW0KLSAgICAgaXMgYW4gdW53aW5kIHJlcXVpcmVzIHRvbyBtdWNoIHJlbG9jYXRpb24gc3BhY2UuICBIbW1tLiAgTWF5YmUKLSAgICAgaWYgd2Ugc3BsaXQgdGhlIHVud2luZCBiaXRzIHVwIGJldHdlZW4gdGhlIHJlbG9jYXRpb25zIHdoaWNoCi0gICAgIGRlbm90ZSB0aGUgZW50cnkgYW5kIGV4aXQgcG9pbnRzLiAgKi8KLSAgaWYgKGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMCk7Ci0KLSAgICAgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCSAgICBOVUxMLCAob2Zmc2V0VCkgMCwgTlVMTCwKLQkJICAgIDAsIFJfSFBQQV9FTlRSWSwgZV9mc2VsLCAwLCAwLAotCQkgICAgKGludCAqKSAmbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotLyogSGFuZGxlIGEgLkVRVSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfZXF1IChyZWcpCi0gICAgIGludCByZWc7Ci17Ci0gIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIGlmIChsYWJlbF9zeW1ib2wpCi0gICAgewotICAgICAgc3ltYm9sID0gbGFiZWxfc3ltYm9sLT5sc3NfbGFiZWw7Ci0gICAgICBpZiAocmVnKQotCVNfU0VUX1ZBTFVFIChzeW1ib2wsIHBhX3BhcnNlX251bWJlciAoJmlucHV0X2xpbmVfcG9pbnRlciwgMCkpOwotICAgICAgZWxzZQotCVNfU0VUX1ZBTFVFIChzeW1ib2wsICh1bnNpZ25lZCBpbnQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbCwgYmZkX2Fic19zZWN0aW9uX3B0cik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHJlZykKLQlhc19iYWQgKF8oIi5SRUcgbXVzdCB1c2UgYSBsYWJlbCIpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIi5FUVUgbXVzdCB1c2UgYSBsYWJlbCIpKTsKLSAgICB9Ci0KLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhlbHBlciBmdW5jdGlvbi4gIERvZXMgcHJvY2Vzc2luZyBmb3IgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uLiAgVGhpcwotICAgdXN1YWxseSBpbnZvbHZlcyBjcmVhdGluZyBzb21lIHJlbG9jYXRpb25zIG9yIGJ1aWxkaW5nIHNwZWNpYWwKLSAgIHN5bWJvbHMgdG8gbWFyayB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2V4aXQgKCkKLXsKLSAgY2hhciAqd2hlcmU7Ci0KLSAgd2hlcmUgPSBmcmFnX21vcmUgKDApOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBNYXJrIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBzdHVmZiBhd2F5IHRoZSBsb2NhdGlvbiBvZiB0aGUgZnJhZwotICAgICBmb3IgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24sIGFuZCBmaW5hbGx5IGNhbGwgcGFfYnVpbGRfdW53aW5kX3N1YnNwYWNlCi0gICAgIHRvIGFkZCBhbiBlbnRyeSBpbiB0aGUgdW53aW5kIHRhYmxlLiAgKi8KLSAgaHBwYV9lbGZfbWFya19lbmRfb2ZfZnVuY3Rpb24gKCk7Ci0gIHBhX2J1aWxkX3Vud2luZF9zdWJzcGFjZSAobGFzdF9jYWxsX2luZm8pOwotI2Vsc2UKLSAgLyogU09NIGRlZmVycyBidWlsZGluZyBvZiB1bndpbmQgZGVzY3JpcHRvcnMgdW50aWwgdGhlIGxpbmsgcGhhc2UuCi0gICAgIFRoZSBhc3NlbWJsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIFJfRU5UUlkgcmVsb2NhdGlvbgotICAgICB0byBtYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSByZWdpb24gYW5kIGhvbGQgdGhlIHVud2luZCBiaXRzLCBhbmQKLSAgICAgZm9yIGNyZWF0aW5nIGFuIFJfRVhJVCByZWxvY2F0aW9uIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgcmVnaW9uLgotCi0gICAgIEZJWE1FLiAgRUxGIHNob3VsZCBiZSB1c2luZyB0aGUgc2FtZSBjb252ZW50aW9ucyEgIFRoZSBwcm9ibGVtCi0gICAgIGlzIGFuIHVud2luZCByZXF1aXJlcyB0b28gbXVjaCByZWxvY2F0aW9uIHNwYWNlLiAgSG1tbS4gIE1heWJlCi0gICAgIGlmIHdlIHNwbGl0IHRoZSB1bndpbmQgYml0cyB1cCBiZXR3ZWVuIHRoZSByZWxvY2F0aW9ucyB3aGljaAotICAgICBkZW5vdGUgdGhlIGVudHJ5IGFuZCBleGl0IHBvaW50cy4gICovCi0gIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCU5VTEwsIChvZmZzZXRUKSAwLAotCQlOVUxMLCAwLCBSX0hQUEFfRVhJVCwgZV9mc2VsLCAwLCAwLAotCQkoaW50ICopICZsYXN0X2NhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IgKyAxKTsKLSNlbmRpZgotfQotCi0vKiBQcm9jZXNzIGEgLkVYSVQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2V4aXQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgaWYgKCF3aXRoaW5fcHJvY2VkdXJlKQotICAgIGFzX2JhZCAoXygiLkVYSVQgbXVzdCBhcHBlYXIgd2l0aGluIGEgcHJvY2VkdXJlIikpOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCFjYWxsaW5mb19mb3VuZCkKLQlhc19iYWQgKF8oIk1pc3NpbmcgLmNhbGxpbmZvIikpOwotICAgICAgZWxzZQotCXsKLQkgIGlmICghd2l0aGluX2VudHJ5X2V4aXQpCi0JICAgIGFzX2JhZCAoXygiTm8gLkVOVFJZIGZvciB0aGlzIC5FWElUIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2l0aGluX2VudHJ5X2V4aXQgPSBGQUxTRTsKLQkgICAgICBwcm9jZXNzX2V4aXQgKCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBQcm9jZXNzIGEgLkVYUE9SVCBkaXJlY3RpdmUuICBUaGlzIG1ha2VzIGZ1bmN0aW9ucyBleHRlcm5hbAotICAgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgYXJndW1lbnQgcmVsb2NhdGlvbiBlbnRyaWVzCi0gICB0byBjYWxsZXJzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2V4cG9ydCAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotICBjaGFyICpuYW1lLCBjLCAqcDsKLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyogTWFrZSBzdXJlIHRoZSBnaXZlbiBzeW1ib2wgZXhpc3RzLiAgKi8KLSAgaWYgKChzeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhbm5vdCBkZWZpbmUgZXhwb3J0IHN5bWJvbDogJXNcbiIpLCBuYW1lKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBPSy4gIFNldCB0aGUgZXh0ZXJuYWwgYml0cyBhbmQgcHJvY2VzcyBhcmd1bWVudCByZWxvY2F0aW9ucy4gICovCi0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBwYV90eXBlX2FyZ3MgKHN5bWJvbCwgMSk7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIZWxwZXIgZnVuY3Rpb24gdG8gcHJvY2VzcyBhcmd1bWVudHMgdG8gYSAuRVhQT1JUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV90eXBlX2FyZ3MgKHN5bWJvbFAsIGlzX2V4cG9ydCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgICAgaW50IGlzX2V4cG9ydDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnA7Ci0gIHVuc2lnbmVkIGludCB0ZW1wLCBhcmdfcmVsb2M7Ci0gIHBhX3N5bWJvbF90eXBlIHR5cGUgPSBTWU1CT0xfVFlQRV9VTktOT1dOOwotICBvYmpfc3ltYm9sX3R5cGUgKnN5bWJvbCA9IChvYmpfc3ltYm9sX3R5cGUgKikgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiYWJzb2x1dGUiLCA4KSA9PSAwKQotCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDg7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBiZmRfYWJzX3NlY3Rpb25fcHRyKTsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9BQlNPTFVURTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJjb2RlIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNDsKLSAgICAgIC8qIElNUE9SVGluZy9FWFBPUlRpbmcgQ09ERSB0eXBlcyBmb3IgZnVuY3Rpb25zIGlzIG1lYW5pbmdsZXNzIGZvciBTT00sCi0gICAgICAgICBpbnN0ZWFkIG9uZSBzaG91bGQgYmUgSU1QT1JUaW5nL0VYUE9SVGluZyBFTlRSWSB0eXBlcy4KLQotICAgICAgICAgQ29tcGxhaW4gaWYgb25lIHRyaWVzIHRvIEVYUE9SVCBhIENPREUgdHlwZSBzaW5jZSB0aGF0J3MgbmV2ZXIKLSAgICAgICAgIGRvbmUuICBCb3RoIEdDQyBhbmQgSFAgQyBzdGlsbCB0cnkgdG8gSU1QT1JUIENPREUgdHlwZXMsIHNvCi0gICAgICAgICBzaWxlbnRseSBmaXggdGhlbSB0byBiZSBFTlRSWSB0eXBlcy4gICovCi0gICAgICBpZiAoU19JU19GVU5DVElPTiAoc3ltYm9sUCkpCi0JewotCSAgaWYgKGlzX2V4cG9ydCkKLQkgICAgYXNfdHNrdHNrIChfKCJVc2luZyBFTlRSWSByYXRoZXIgdGhhbiBDT0RFIGluIGV4cG9ydCBkaXJlY3RpdmUgZm9yICVzIiksCi0JCSAgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLQkgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCSAgdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0JICB0eXBlID0gU1lNQk9MX1RZUEVfQ09ERTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZGF0YSIsIDQpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDQ7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzICY9IH5CU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfREFUQTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiZW50cnkiLCA1KSA9PSAwKSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNTsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotICAgICAgdHlwZSA9IFNZTUJPTF9UWVBFX0VOVFJZOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIm1pbGxpY29kZSIsIDkpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDk7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9NSUxMSUNPREU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAicGxhYmVsIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgJj0gfkJTRl9GVU5DVElPTjsKLSAgICAgIHR5cGUgPSBTWU1CT0xfVFlQRV9QTEFCRUw7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAicHJpX3Byb2ciLCA4KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA4OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfUFJJX1BST0c7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic2VjX3Byb2ciLCA4KSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA4OwotICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbFApLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0gICAgICB0eXBlID0gU1lNQk9MX1RZUEVfU0VDX1BST0c7Ci0gICAgfQotCi0gIC8qIFNPTSByZXF1aXJlcyBtdWNoIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc3ltYm9sIHR5cGVzCi0gICAgIHRoYW4gQkZEIHVuZGVyc3RhbmRzLiAgVGhpcyBpcyBob3cgd2UgZ2V0IHRoaXMgaW5mb3JtYXRpb24KLSAgICAgdG8gdGhlIFNPTSBCRkQgYmFja2VuZC4gICovCi0jaWZkZWYgb2JqX3NldF9zeW1ib2xfdHlwZQotICBvYmpfc2V0X3N5bWJvbF90eXBlIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCksIChpbnQpIHR5cGUpOwotI2VuZGlmCi0KLSAgLyogTm93IHRoYXQgdGhlIHR5cGUgb2YgdGhlIGV4cG9ydGVkIHN5bWJvbCBoYXMgYmVlbiBoYW5kbGVkLAotICAgICBoYW5kbGUgYW55IGFyZ3VtZW50IHJlbG9jYXRpb24gaW5mb3JtYXRpb24uICAqLwotICB3aGlsZSAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIC8qIEFyZ3VtZW50IHNvdXJjZXMuICAqLwotICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImFyZ3ciLCA0KSA9PSAwKSkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gYXRvaSAobmFtZSArIDQpOwotCSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkgIGFyZ19yZWxvYyA9IHBhX2FsaWduX2FyZ19yZWxvYyAodGVtcCwgcGFfYnVpbGRfYXJnX3JlbG9jIChuYW1lKSk7Ci0jaWZkZWYgT0JKX1NPTQotCSAgc3ltYm9sLT50Y19kYXRhLmFwLmhwcGFfYXJnX3JlbG9jIHw9IGFyZ19yZWxvYzsKLSNlbmRpZgotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgLyogVGhlIHJldHVybiB2YWx1ZS4gICovCi0gICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJydG52YWwiLCA2KSkgPT0gMCkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgYXJnX3JlbG9jID0gcGFfYnVpbGRfYXJnX3JlbG9jIChuYW1lKTsKLSNpZmRlZiBPQkpfU09NCi0JICBzeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9hcmdfcmVsb2MgfD0gYXJnX3JlbG9jOwotI2VuZGlmCi0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICAvKiBQcml2ZWxlZ2UgbGV2ZWwuICAqLwotICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAicHJpdl9sZXYiLCA4KSkgPT0gMCkKLQl7Ci0JICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKnAgPSBjOwotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICB0ZW1wID0gYXRvaSAoaW5wdXRfbGluZV9wb2ludGVyKTsKLSNpZmRlZiBPQkpfU09NCi0JICBzeW1ib2wtPnRjX2RhdGEuYXAuaHBwYV9wcml2X2xldmVsID0gdGVtcDsKLSNlbmRpZgotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiVW5kZWZpbmVkIC5FWFBPUlQvLklNUE9SVCBhcmd1bWVudCAoaWdub3JlZCk6ICVzIiksIG5hbWUpOwotCSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICpwID0gYzsKLQl9Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgYW4gLklNUE9SVCBwc2V1ZG8tb3AuICBBbnkgc3ltYm9sIHJlZmVyZW5jZWQgaW4gYSBnaXZlbgotICAgYXNzZW1ibHkgZmlsZSBtdXN0IGVpdGhlciBiZSBkZWZpbmVkIGluIHRoZSBhc3NlbWJseSBmaWxlLCBvcgotICAgZXhwbGljaXRseSBJTVBPUlRFRCBmcm9tIGFub3RoZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfaW1wb3J0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHN5bWJvbCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgLyogVWdoLiAgV2UgbWlnaHQgYmUgaW1wb3J0aW5nIGEgc3ltYm9sIGRlZmluZWQgZWFybGllciBpbiB0aGUgZmlsZSwKLSAgICAgaW4gd2hpY2ggY2FzZSBhbGwgdGhlIGNvZGUgYmVsb3cgd2lsbCByZWFsbHkgc2NyZXcgdGhpbmdzIHVwCi0gICAgIChzZXQgdGhlIHdyb25nIHNlZ21lbnQsIHN5bWJvbCBmbGFncyAmIHR5cGUsIGV0YykuICAqLwotICBpZiAoc3ltYm9sID09IE5VTEwgfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sKSkKLSAgICB7Ci0gICAgICBzeW1ib2wgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0KLSAgICAgIGlmICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHBhX3R5cGVfYXJncyAoc3ltYm9sLCAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogU2lnaC4gIFRvIGJlIGNvbXBhdGFibGUgd2l0aCB0aGUgSFAgYXNzZW1ibGVyIGFuZCB0byBoZWxwCi0JICAgICBwb29ybHkgd3JpdHRlbiBhc3NlbWJseSBjb2RlLCB3ZSBhc3NpZ24gYSB0eXBlIGJhc2VkIG9uCi0JICAgICB0aGUgdGhlIGN1cnJlbnQgc2VnbWVudC4gIE5vdGUgb25seSBCU0ZfRlVOQ1RJT04gcmVhbGx5Ci0JICAgICBtYXR0ZXJzLCB3ZSBkbyBub3QgbmVlZCB0byBzZXQgdGhlIGZ1bGwgU1lNQk9MX1RZUEVfKiBpbmZvLiAgKi8KLQkgIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLQkgICAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bWJvbCktPmZsYWdzIHw9IEJTRl9GVU5DVElPTjsKLQotCSAgLyogSWYgdGhlIHNlY3Rpb24gaXMgdW5kZWZpbmVkLCB0aGVuIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkCi0JICAgICBTaW5jZSB0aGlzIGlzIGFuIGltcG9ydCwgbGVhdmUgdGhlIHNlY3Rpb24gdW5kZWZpbmVkLiAgKi8KLQkgIFNfU0VUX1NFR01FTlQgKHN5bWJvbCwgYmZkX3VuZF9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgd2FzIGFscmVhZHkgZGVmaW5lZC4gIEp1c3QgZWF0IGV2ZXJ5dGhpbmcgdXAgdG8KLQkgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBzdGF0ZW1lbnQuICAqLwotICAgICAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuTEFCRUwgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xhYmVsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RybGVuIChuYW1lKSA+IDApCi0gICAgewotICAgICAgY29sb24gKG5hbWUpOwotICAgICAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICpwID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJNaXNzaW5nIGxhYmVsIG5hbWUgb24gLkxBQkVMIikpOwotICAgIH0KLQotICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiZXh0cmEgLkxBQkVMIGFyZ3VtZW50cyBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuTEVBVkUgcHNldWRvLW9wLiAgVGhpcyBpcyBub3Qgc3VwcG9ydGVkIHlldC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9sZWF2ZSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBhc19iYWQgKF8oIlRoZSAuTEVBVkUgcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5MRVZFTCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbGV2ZWwgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbGV2ZWw7Ci0KLSAgbGV2ZWwgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlmIChzdHJuY21wIChsZXZlbCwgIjEuMCIsIDMpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX2hwcGEsIDEwKSkKLQlhc193YXJuIChfKCJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGxldmVsLCAiMS4xIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICghYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfaHBwYSwgMTEpKQotCWFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAobGV2ZWwsICIyLjAiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgICAgaWYgKCFiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9ocHBhLCAyMCkpCi0JYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgLkxFVkVMIGFyZ3VtZW50XG4iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLk9SSUdJTiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfb3JpZ2luICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHNfb3JnICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5QQVJBTSBwc2V1ZG8tb3AuICBUaGlzIGlzIG11Y2ggbGlrZSBhIC5FWFBPUlQsIGV4Y2VwdCBpdAotICAgaXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICBGSVhNRS4gIFNob3VsZCBzaGFyZSBtb3JlIGNvZGUgd2l0aCAuRVhQT1JULiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3BhcmFtICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIGNoYXIgKm5hbWUsIGMsICpwOwotICBzeW1ib2xTICpzeW1ib2w7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGlmICgoc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJDYW5ub3QgZGVmaW5lIHN0YXRpYyBzeW1ib2w6ICVzXG4iKSwgbmFtZSk7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKnAgPSBjOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sKTsKLSAgICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBwYV90eXBlX2FyZ3MgKHN5bWJvbCwgMCk7Ci0JfQotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgYSAuUFJPQyBwc2V1ZG8tb3AuICBJdCBpcyB1c2VkIHRvIG1hcmsgdGhlIGJlZ2lubmluZwotICAgb2YgYSBwcm9jZWR1cmUgZnJvbSBhIHN5bnRhdGljYWwgcG9pbnQgb2Ygdmlldy4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9wcm9jICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mbzsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBpZiAod2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19mYXRhbCAoXygiTmVzdGVkIHByb2NlZHVyZXMiKSk7Ci0KLSAgLyogUmVzZXQgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgbmV3IHByb2NlZHVyZS4gICovCi0gIGNhbGxpbmZvX2ZvdW5kID0gRkFMU0U7Ci0gIHdpdGhpbl9wcm9jZWR1cmUgPSBUUlVFOwotCi0gIC8qIENyZWF0ZSBhbm90aGVyIGNhbGxfaW5mbyBzdHJ1Y3R1cmUuICAqLwotICBjYWxsX2luZm8gPSAoc3RydWN0IGNhbGxfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBjYWxsX2luZm8pKTsKLQotICBpZiAoIWNhbGxfaW5mbykKLSAgICBhc19mYXRhbCAoXygiQ2Fubm90IGFsbG9jYXRlIHVud2luZCBkZXNjcmlwdG9yXG4iKSk7Ci0KLSAgbWVtc2V0IChjYWxsX2luZm8sIDAsIHNpemVvZiAoc3RydWN0IGNhbGxfaW5mbykpOwotCi0gIGNhbGxfaW5mby0+Y2lfbmV4dCA9IE5VTEw7Ci0KLSAgaWYgKGNhbGxfaW5mb19yb290ID09IE5VTEwpCi0gICAgewotICAgICAgY2FsbF9pbmZvX3Jvb3QgPSBjYWxsX2luZm87Ci0gICAgICBsYXN0X2NhbGxfaW5mbyA9IGNhbGxfaW5mbzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0X2NhbGxfaW5mby0+Y2lfbmV4dCA9IGNhbGxfaW5mbzsKLSAgICAgIGxhc3RfY2FsbF9pbmZvID0gY2FsbF9pbmZvOwotICAgIH0KLQotICAvKiBzZXQgdXAgZGVmYXVsdHMgb24gY2FsbF9pbmZvIHN0cnVjdHVyZSAqLwotCi0gIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IuY2Fubm90X3Vud2luZCA9IDA7Ci0gIGNhbGxfaW5mby0+Y2lfdW53aW5kLmRlc2NyaXB0b3IucmVnaW9uX2Rlc2MgPSAxOwotICBjYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yLmhwdXhfaW50ZXJydXB0X21hcmtlciA9IDA7Ci0KLSAgLyogSWYgd2UgZ290IGEgLlBST0MgcHNldWRvLW9wLCB3ZSBrbm93IHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQKLSAgICAgbG9jYWxseS4gIE1ha2Ugc3VyZSBpdCBnZXRzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0gIHsKLSAgICBsYWJlbF9zeW1ib2xfc3RydWN0ICpsYWJlbF9zeW1ib2wgPSBwYV9nZXRfbGFiZWwgKCk7Ci0KLSAgICBpZiAobGFiZWxfc3ltYm9sKQotICAgICAgewotCWlmIChsYWJlbF9zeW1ib2wtPmxzc19sYWJlbCkKLQkgIHsKLQkgICAgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9IGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsOwotCSAgICBzeW1ib2xfZ2V0X2JmZHN5bSAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0JICB9Ci0JZWxzZQotCSAgYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIikpOwotICAgICAgfQotICAgIGVsc2UKLSAgICAgIGxhc3RfY2FsbF9pbmZvLT5zdGFydF9zeW1ib2wgPSBOVUxMOwotICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUHJvY2VzcyB0aGUgc3ludGF0aWNhbCBlbmQgb2YgYSBwcm9jZWR1cmUuICBNYWtlIHN1cmUgYWxsIHRoZQotICAgYXBwcm9wcmlhdGUgcHNldWRvLW9wcyB3ZXJlIGZvdW5kIHdpdGhpbiB0aGUgcHJvY2VkdXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3Byb2NlbmQgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLQotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICAvKiBJZiB3ZSBhcmUgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24sIG1ha2Ugc3VyZSB3ZSd2ZQotICAgICBkZWZpbmVkIGEgbGFiZWwgZm9yIHRoZSBwcm9jZWR1cmU7IGhhbmRsZSBjYXNlIHdoZXJlIHRoZQotICAgICBsYWJlbCB3YXMgZGVmaW5lZCBhZnRlciB0aGUgLlBST0MgZGlyZWN0aXZlLgotCi0gICAgIE5vdGUgdGhlcmUncyBub3QgbmVlZCB0byBkaWRkbGUgd2l0aCB0aGUgc2VnbWVudCBvciBmcmFnbWVudAotICAgICBmb3IgdGhlIGxhYmVsIHN5bWJvbCBpbiB0aGlzIGNhc2UuICBXZSBoYXZlIGFscmVhZHkgc3dpdGNoZWQKLSAgICAgaW50byB0aGUgbmV3ICRDT0RFJCBzdWJzcGFjZSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgaWYgKHdpdGhpbl9wcm9jZWR1cmUgJiYgbGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxhYmVsX3N5bWJvbF9zdHJ1Y3QgKmxhYmVsX3N5bWJvbCA9IHBhX2dldF9sYWJlbCAoKTsKLQotICAgICAgaWYgKGxhYmVsX3N5bWJvbCkKLQl7Ci0JICBpZiAobGFiZWxfc3ltYm9sLT5sc3NfbGFiZWwpCi0JICAgIHsKLQkgICAgICBsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sID0gbGFiZWxfc3ltYm9sLT5sc3NfbGFiZWw7Ci0JICAgICAgc3ltYm9sX2dldF9iZmRzeW0gKGxhYmVsX3N5bWJvbC0+bHNzX2xhYmVsKS0+ZmxhZ3MKLQkJfD0gQlNGX0ZVTkNUSU9OOwotI2lmZGVmIE9CSl9TT00KLQkgICAgICAvKiBBbHNvIGhhbmRsZSBhbGxvY2F0aW9uIG9mIGEgZml4dXAgdG8gaG9sZCB0aGUgdW53aW5kCi0JCSBpbmZvcm1hdGlvbiB3aGVuIHRoZSBsYWJlbCBhcHBlYXJzIGFmdGVyIHRoZSBwcm9jL3Byb2NlbmQuICAqLwotCSAgICAgIGlmICh3aXRoaW5fZW50cnlfZXhpdCkKLQkJewotCQkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgwKTsKLQotCQkgIGZpeF9uZXdfaHBwYSAoZnJhZ19ub3csIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDAsCi0JCQkJTlVMTCwgKG9mZnNldFQpIDAsIE5VTEwsCi0JCQkJMCwgUl9IUFBBX0VOVFJZLCBlX2ZzZWwsIDAsIDAsCi0JCQkJKGludCAqKSAmbGFzdF9jYWxsX2luZm8tPmNpX3Vud2luZC5kZXNjcmlwdG9yKTsKLQkJfQotI2VuZGlmCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgYXNfYmFkIChfKCJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIk1pc3NpbmcgZnVuY3Rpb24gbmFtZSBmb3IgLlBST0MiKSk7Ci0gICAgfQotCi0gIGlmICghd2l0aGluX3Byb2NlZHVyZSkKLSAgICBhc19iYWQgKF8oIm1pc3BsYWNlZCAucHJvY2VuZCIpKTsKLQotICBpZiAoIWNhbGxpbmZvX2ZvdW5kKQotICAgIGFzX2JhZCAoXygiTWlzc2luZyAuY2FsbGluZm8gZm9yIHRoaXMgcHJvY2VkdXJlIikpOwotCi0gIGlmICh3aXRoaW5fZW50cnlfZXhpdCkKLSAgICBhc19iYWQgKF8oIk1pc3NpbmcgLkVYSVQgZm9yIGEgLkVOVFJZIikpOwotCi0jaWZkZWYgT0JKX0VMRgotICAvKiBFTEYgbmVlZHMgdG8gbWFyayB0aGUgZW5kIG9mIGVhY2ggZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gY29tcHV0ZQotICAgICB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24gKGFwcGFyZW50bHkgaXRzIG5lZWRlZCBpbiB0aGUgc3ltYm9sIHRhYmxlKS4gICovCi0gIGhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uICgpOwotI2VuZGlmCi0KLSAgd2l0aGluX3Byb2NlZHVyZSA9IEZBTFNFOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogSWYgVkFMVUUgaXMgYW4gZXhhY3QgcG93ZXIgb2YgdHdvIGJldHdlZW4gemVybyBhbmQgMl4zMSwgdGhlbgotICAgcmV0dXJuIGxvZzIgKFZBTFVFKS4gIEVsc2UgcmV0dXJuIC0xLiAgKi8KLQotc3RhdGljIGludAotbG9nMiAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgaW50IHNoaWZ0ID0gMDsKLQotICB3aGlsZSAoKDEgPDwgc2hpZnQpICE9IHZhbHVlICYmIHNoaWZ0IDwgMzIpCi0gICAgc2hpZnQrKzsKLQotICBpZiAoc2hpZnQgPj0gMzIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlCi0gICAgcmV0dXJuIHNoaWZ0OwotfQotCi0KLSNpZmRlZiBPQkpfU09NCi0vKiBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKQotewotICBpZiAoY3VycmVudF9zcGFjZSA9PSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJOb3QgaW4gYSBzcGFjZS5cbiIpKTsKLQotICBpZiAoY3VycmVudF9zdWJzcGFjZSA9PSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJOb3QgaW4gYSBzdWJzcGFjZS5cbiIpKTsKLX0KLQotLyogUGFyc2UgdGhlIHBhcmFtZXRlcnMgdG8gYSAuU1BBQ0UgZGlyZWN0aXZlOyBpZiBDUkVBVEVfRkxBRyBpcyBub256ZXJvLAotICAgdGhlbiBjcmVhdGUgYSBuZXcgc3BhY2UgZW50cnkgdG8gaG9sZCB0aGUgaW5mb3JtYXRpb24gc3BlY2lmaWVkCi0gICBieSB0aGUgcGFyYW1ldGVycyB0byB0aGUgLlNQQUNFIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoc3BhY2VfbmFtZSwgY3JlYXRlX2ZsYWcpCi0gICAgIGNoYXIgKnNwYWNlX25hbWU7Ci0gICAgIGludCBjcmVhdGVfZmxhZzsKLXsKLSAgY2hhciAqbmFtZSwgKnB0ZW1wLCBjOwotICBjaGFyIGxvYWRhYmxlLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0OwotICBpbnQgc3BudW0sIHRlbXA7Ci0gIGFzZWN0aW9uICpzZWcgPSBOVUxMOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotCi0gIC8qIGxvYWQgZGVmYXVsdCB2YWx1ZXMgKi8KLSAgc3BudW0gPSAwOwotICBzb3J0ID0gMDsKLSAgbG9hZGFibGUgPSBUUlVFOwotICBkZWZpbmVkID0gVFJVRTsKLSAgcHJpdmF0ZSA9IEZBTFNFOwotICBpZiAoc3RyY21wIChzcGFjZV9uYW1lLCAiJFRFWFQkIikgPT0gMCkKLSAgICB7Ci0gICAgICBzZWcgPSBwYV9kZWZfc3BhY2VzWzBdLnNlZ21lbnQ7Ci0gICAgICBkZWZpbmVkID0gcGFfZGVmX3NwYWNlc1swXS5kZWZpbmVkOwotICAgICAgcHJpdmF0ZSA9IHBhX2RlZl9zcGFjZXNbMF0ucHJpdmF0ZTsKLSAgICAgIHNvcnQgPSBwYV9kZWZfc3BhY2VzWzBdLnNvcnQ7Ci0gICAgICBzcG51bSA9IHBhX2RlZl9zcGFjZXNbMF0uc3BudW07Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKHNwYWNlX25hbWUsICIkUFJJVkFURSQiKSA9PSAwKQotICAgIHsKLSAgICAgIHNlZyA9IHBhX2RlZl9zcGFjZXNbMV0uc2VnbWVudDsKLSAgICAgIGRlZmluZWQgPSBwYV9kZWZfc3BhY2VzWzFdLmRlZmluZWQ7Ci0gICAgICBwcml2YXRlID0gcGFfZGVmX3NwYWNlc1sxXS5wcml2YXRlOwotICAgICAgc29ydCA9IHBhX2RlZl9zcGFjZXNbMV0uc29ydDsKLSAgICAgIHNwbnVtID0gcGFfZGVmX3NwYWNlc1sxXS5zcG51bTsKLSAgICB9Ci0KLSAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIHByaW50X2Vycm9ycyA9IEZBTFNFOwotICAgICAgcHRlbXAgPSBpbnB1dF9saW5lX3BvaW50ZXIgKyAxOwotICAgICAgLyogRmlyc3Qgc2VlIGlmIHRoZSBzcGFjZSB3YXMgc3BlY2lmaWVkIGFzIGEgbnVtYmVyIHJhdGhlciB0aGFuCi0gICAgICAgICBhcyBhIG5hbWUuICBBY2NvcmRpbmcgdG8gdGhlIFBBIGFzc2VtYmx5IG1hbnVhbCB0aGUgcmVzdCBvZgotICAgICAgICAgdGhlIGxpbmUgc2hvdWxkIGJlIGlnbm9yZWQuICAqLwotICAgICAgdGVtcCA9IHBhX3BhcnNlX251bWJlciAoJnB0ZW1wLCAwKTsKLSAgICAgIGlmICh0ZW1wID49IDApCi0JewotCSAgc3BudW0gPSB0ZW1wOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gcHRlbXA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdoaWxlICghaXNfZW5kX29mX3N0YXRlbWVudCAoKSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgICAgIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJzcG51bSIsIDUpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgc3BudW0gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNvcnQiLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHNvcnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInVubG9hZGFibGUiLCAxMCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBsb2FkYWJsZSA9IEZBTFNFOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAibm90ZGVmaW5lZCIsIDEwKSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGRlZmluZWQgPSBGQUxTRTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInByaXZhdGUiLCA3KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIHByaXZhdGUgPSBUUlVFOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYXNfYmFkIChfKCJJbnZhbGlkIC5TUEFDRSBhcmd1bWVudCIpKTsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JCSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgcHJpbnRfZXJyb3JzID0gVFJVRTsKLSAgICB9Ci0KLSAgaWYgKGNyZWF0ZV9mbGFnICYmIHNlZyA9PSBOVUxMKQotICAgIHNlZyA9IHN1YnNlZ19uZXcgKHNwYWNlX25hbWUsIDApOwotCi0gIC8qIElmIGNyZWF0ZV9mbGFnIGlzIG5vbnplcm8sIHRoZW4gY3JlYXRlIHRoZSBuZXcgc3BhY2Ugd2l0aAotICAgICB0aGUgYXR0cmlidXRlcyBjb21wdXRlZCBhYm92ZS4gIEVsc2Ugc2V0IHRoZSB2YWx1ZXMgaW4KLSAgICAgYW4gYWxyZWFkeSBleGlzdGluZyBzcGFjZSAtLSB0aGlzIGNhbiBvbmx5IGhhcHBlbiBmb3IKLSAgICAgdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBhIGJ1aWx0LWluIHNwYWNlLiAgKi8KLSAgaWYgKGNyZWF0ZV9mbGFnKQotICAgIHNwYWNlID0gY3JlYXRlX25ld19zcGFjZSAoc3BhY2VfbmFtZSwgc3BudW0sIGxvYWRhYmxlLCBkZWZpbmVkLAotCQkJICAgICAgcHJpdmF0ZSwgc29ydCwgc2VnLCAxKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHNwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAoc3BhY2VfbmFtZSk7Ci0gICAgICBTUEFDRV9TUE5VTSAoc3BhY2UpID0gc3BudW07Ci0gICAgICBTUEFDRV9ERUZJTkVEIChzcGFjZSkgPSBkZWZpbmVkICYgMTsKLSAgICAgIFNQQUNFX1VTRVJfREVGSU5FRCAoc3BhY2UpID0gMTsKLSAgICB9Ci0KLSNpZmRlZiBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcwotICBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0LCBzcG51bSk7Ci0jZW5kaWYKLQotICByZXR1cm4gc3BhY2U7Ci19Ci0KLS8qIEhhbmRsZSBhIC5TUEFDRSBwc2V1ZG8tb3A7IHRoaXMgc3dpdGNoZXMgdGhlIGN1cnJlbnQgc3BhY2UgdG8gdGhlCi0gICBnaXZlbiBzcGFjZSwgY3JlYXRpbmcgdGhlIG5ldyBzcGFjZSBpZiBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfc3BhY2UgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZSwgYywgKnNwYWNlX25hbWUsICpzYXZlX3M7Ci0gIGludCB0ZW1wOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNkX2NoYWluOwotCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2FuXCd0IGNoYW5nZSBzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIENoZWNrIGZvciBzb21lIG9mIHRoZSBwcmVkZWZpbmVkIHNwYWNlcy4gICBGSVhNRTogbW9zdCBvZiB0aGUgY29kZQotICAgICAgICAgYmVsb3cgaXMgcmVwZWF0ZWQgc2V2ZXJhbCB0aW1lcywgY2FuIHdlIGV4dHJhY3QgdGhlIGNvbW1vbiBwYXJ0cwotICAgICAgICAgYW5kIHBsYWNlIHRoZW0gaW50byBhIHN1YnJvdXRpbmUgb3Igc29tZXRoaW5nIHNpbWlsYXI/ICAqLwotICAgICAgLyogRklYTUUgSXMgdGhpcyAoYW5kIHRoZSBuZXh0IElGIHN0bXQpIHJlYWxseSByaWdodD8KLQkgV2hhdCBpZiBJTlBVVF9MSU5FX1BPSU5URVIgcG9pbnRzIHRvICIkVEVYVCRGT08iPyAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIkVEVYVCQiLCA2KSA9PSAwKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotCSAgc2RfY2hhaW4gPSBpc19kZWZpbmVkX3NwYWNlICgiJFRFWFQkIik7Ci0JICBpZiAoc2RfY2hhaW4gPT0gTlVMTCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10ICgiJFRFWFQkIiwgMSk7Ci0JICBlbHNlIGlmIChTUEFDRV9VU0VSX0RFRklORUQgKHNkX2NoYWluKSA9PSAwKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkVEVYVCQiLCAwKTsKLQotCSAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgY3VycmVudF9zdWJzcGFjZQotCSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHRleHRfc2VjdGlvbiwKLQkJCQkJIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICIkUFJJVkFURSQiLCA5KSA9PSAwKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSA5OwotCSAgc2RfY2hhaW4gPSBpc19kZWZpbmVkX3NwYWNlICgiJFBSSVZBVEUkIik7Ci0JICBpZiAoc2RfY2hhaW4gPT0gTlVMTCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10ICgiJFBSSVZBVEUkIiwgMSk7Ci0JICBlbHNlIGlmIChTUEFDRV9VU0VSX0RFRklORUQgKHNkX2NoYWluKSA9PSAwKQotCSAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKCIkUFJJVkFURSQiLCAwKTsKLQotCSAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgY3VycmVudF9zdWJzcGFjZQotCSAgICA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKGRhdGFfc2VjdGlvbiwKLQkJCQkJIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmICghc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwKLQkJCUdEQl9ERUJVR19TUEFDRV9OQU1FLAotCQkJc3RybGVuIChHREJfREVCVUdfU1BBQ0VfTkFNRSkpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSBzdHJsZW4gKEdEQl9ERUJVR19TUEFDRV9OQU1FKTsKLQkgIHNkX2NoYWluID0gaXNfZGVmaW5lZF9zcGFjZSAoR0RCX0RFQlVHX1NQQUNFX05BTUUpOwotCSAgaWYgKHNkX2NoYWluID09IE5VTEwpCi0JICAgIHNkX2NoYWluID0gcGFfcGFyc2Vfc3BhY2Vfc3RtdCAoR0RCX0RFQlVHX1NQQUNFX05BTUUsIDEpOwotCSAgZWxzZSBpZiAoU1BBQ0VfVVNFUl9ERUZJTkVEIChzZF9jaGFpbikgPT0gMCkKLQkgICAgc2RfY2hhaW4gPSBwYV9wYXJzZV9zcGFjZV9zdG10IChHREJfREVCVUdfU1BBQ0VfTkFNRSwgMCk7Ci0KLQkgIGN1cnJlbnRfc3BhY2UgPSBzZF9jaGFpbjsKLQotCSAgewotCSAgICBhc2VjdGlvbiAqZ2RiX3NlY3Rpb24KLQkgICAgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN0ZG91dHB1dCwgR0RCX0RFQlVHX1NQQUNFX05BTUUpOwotCi0JICAgIHN1YnNlZ19zZXQgKGdkYl9zZWN0aW9uLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgICBjdXJyZW50X3N1YnNwYWNlCi0JICAgICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChnZGJfc2VjdGlvbiwKLQkJCQkJICAgc2RfY2hhaW4tPnNkX2xhc3Rfc3Vic2VnKTsKLQkgIH0KLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBJdCBjb3VsZCBiZSBhIHNwYWNlIHNwZWNpZmllZCBieSBudW1iZXIuICAqLwotICAgICAgcHJpbnRfZXJyb3JzID0gMDsKLSAgICAgIHNhdmVfcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmICgodGVtcCA9IHBhX3BhcnNlX251bWJlciAoJmlucHV0X2xpbmVfcG9pbnRlciwgMCkpID49IDApCi0JewotCSAgaWYgKChzZF9jaGFpbiA9IHBhX2ZpbmRfc3BhY2VfYnlfbnVtYmVyICh0ZW1wKSkpCi0JICAgIHsKLQkgICAgICBjdXJyZW50X3NwYWNlID0gc2RfY2hhaW47Ci0KLQkgICAgICBzdWJzZWdfc2V0IChzZF9jaGFpbi0+c2Rfc2VnLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotCSAgICAgIGN1cnJlbnRfc3Vic3BhY2UKLQkJPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChzZF9jaGFpbi0+c2Rfc2VnLAotCQkJCQkgICAgIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0JICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIE5vdCBhIG51bWJlciwgYXR0ZW1wdCB0byBjcmVhdGUgYSBuZXcgc3BhY2UuICAqLwotICAgICAgcHJpbnRfZXJyb3JzID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfczsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzcGFjZV9uYW1lID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICAgICAgc3RyY3B5IChzcGFjZV9uYW1lLCBuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICBzZF9jaGFpbiA9IHBhX3BhcnNlX3NwYWNlX3N0bXQgKHNwYWNlX25hbWUsIDEpOwotICAgICAgY3VycmVudF9zcGFjZSA9IHNkX2NoYWluOwotCi0gICAgICBzdWJzZWdfc2V0IChzZF9jaGFpbi0+c2Rfc2VnLCBzZF9jaGFpbi0+c2RfbGFzdF9zdWJzZWcpOwotICAgICAgY3VycmVudF9zdWJzcGFjZSA9IHBhX3N1YnNlZ21lbnRfdG9fc3Vic3BhY2UgKHNkX2NoYWluLT5zZF9zZWcsCi0JCQkJCQkgIHNkX2NoYWluLT5zZF9sYXN0X3N1YnNlZyk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLX0KLQotLyogU3dpdGNoIHRvIGEgbmV3IHNwYWNlLiAgKEkgdGhpbmspLiAgRklYTUUuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfc3BudW0gKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgc3BhY2UgPSBpc19kZWZpbmVkX3NwYWNlIChuYW1lKTsKLSAgaWYgKHNwYWNlKQotICAgIHsKLSAgICAgIHAgPSBmcmFnX21vcmUgKDQpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBTUEFDRV9TUE5VTSAoc3BhY2UpLCA0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCJVbmRlZmluZWQgc3BhY2U6ICclcycgQXNzdW1pbmcgc3BhY2UgbnVtYmVyID0gMC4iKSwgbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5TVUJTUEFDRSBwc2V1ZG8tb3A7IHRoaXMgc3dpdGNoZXMgdGhlIGN1cnJlbnQgc3Vic3BhY2UgdG8gdGhlCi0gICBnaXZlbiBzdWJzcGFjZSwgY3JlYXRpbmcgdGhlIG5ldyBzdWJzcGFjZSBpZiBuZWNlc3NhcnkuCi0KLSAgIEZJWE1FLiAgU2hvdWxkIG1pcnJvciBwYV9zcGFjZSBtb3JlIGNsb3NlbHksIGluIHBhcnRpY3VsYXIgaG93Ci0gICB0aGV5J3JlIGJyb2tlbiB1cCBpbnRvIHN1YnJvdXRpbmVzLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3N1YnNwYWNlIChjcmVhdGVfbmV3KQotICAgICBpbnQgY3JlYXRlX25ldzsKLXsKLSAgY2hhciAqbmFtZSwgKnNzX25hbWUsIGM7Ci0gIGNoYXIgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLCB6ZXJvLCBzb3J0OwotICBpbnQgaSwgYWNjZXNzLCBzcGFjZV9pbmRleCwgYWxpZ25tZW50LCBxdWFkcmFudCwgYXBwbGljYWJsZSwgZmxhZ3M7Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKnNzZDsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0KLSAgaWYgKGN1cnJlbnRfc3BhY2UgPT0gTlVMTCkKLSAgICBhc19mYXRhbCAoXygiTXVzdCBiZSBpbiBhIHNwYWNlIGJlZm9yZSBjaGFuZ2luZyBvciBkZWNsYXJpbmcgc3Vic3BhY2VzLlxuIikpOwotCi0gIGlmICh3aXRoaW5fcHJvY2VkdXJlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQ2FuXCd0IGNoYW5nZSBzdWJzcGFjZXMgd2l0aGluIGEgcHJvY2VkdXJlIGRlZmluaXRpb24uIElnbm9yZWQiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBzc19uYW1lID0geG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICAgICAgc3RyY3B5IChzc19uYW1lLCBuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICAvKiBMb2FkIGRlZmF1bHQgdmFsdWVzLiAgKi8KLSAgICAgIHNvcnQgPSAwOwotICAgICAgYWNjZXNzID0gMHg3ZjsKLSAgICAgIGxvYWRhYmxlID0gMTsKLSAgICAgIGNvbW1vbiA9IDA7Ci0gICAgICBkdXBfY29tbW9uID0gMDsKLSAgICAgIGNvZGVfb25seSA9IDA7Ci0gICAgICB6ZXJvID0gMDsKLSAgICAgIHNwYWNlX2luZGV4ID0gfjA7Ci0gICAgICBhbGlnbm1lbnQgPSAxOwotICAgICAgcXVhZHJhbnQgPSAwOwotCi0gICAgICBzcGFjZSA9IGN1cnJlbnRfc3BhY2U7Ci0gICAgICBpZiAoY3JlYXRlX25ldykKLQlzc2QgPSBOVUxMOwotICAgICAgZWxzZQotCXNzZCA9IGlzX2RlZmluZWRfc3Vic3BhY2UgKHNzX25hbWUpOwotICAgICAgLyogQWxsb3cgdXNlciB0byBvdmVycmlkZSB0aGUgYnVpbHRpbiBhdHRyaWJ1dGVzIG9mIHN1YnNwYWNlcy4gIEJ1dAotICAgICAgICAgb25seSBhbGxvdyB0aGUgYXR0cmlidXRlcyB0byBiZSBjaGFuZ2VkIG9uY2UhICAqLwotICAgICAgaWYgKHNzZCAmJiBTVUJTUEFDRV9ERUZJTkVEIChzc2QpKQotCXsKLQkgIHN1YnNlZ19zZXQgKHNzZC0+c3NkX3NlZywgc3NkLT5zc2Rfc3Vic2VnKTsKLQkgIGN1cnJlbnRfc3Vic3BhY2UgPSBzc2Q7Ci0JICBpZiAoIWlzX2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0JICAgIGFzX3dhcm4gKF8oIlBhcmFtZXRlcnMgb2YgYW4gZXhpc3Rpbmcgc3Vic3BhY2UgY2FuXCd0IGJlIG1vZGlmaWVkIikpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQSBuZXcgc3Vic3BhY2UuICBMb2FkIGRlZmF1bHQgdmFsdWVzIGlmIGl0IG1hdGNoZXMgb25lIG9mCi0JICAgICB0aGUgYnVpbHRpbiBzdWJzcGFjZXMuICAqLwotCSAgaSA9IDA7Ci0JICB3aGlsZSAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgc3NfbmFtZSkgPT0gMCkKLQkJewotCQkgIGxvYWRhYmxlID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5sb2FkYWJsZTsKLQkJICBjb21tb24gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvbW1vbjsKLQkJICBkdXBfY29tbW9uID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5kdXBfY29tbW9uOwotCQkgIGNvZGVfb25seSA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uY29kZV9vbmx5OwotCQkgIHplcm8gPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnplcm87Ci0JCSAgc3BhY2VfaW5kZXggPSBwYV9kZWZfc3Vic3BhY2VzW2ldLnNwYWNlX2luZGV4OwotCQkgIGFsaWdubWVudCA9IHBhX2RlZl9zdWJzcGFjZXNbaV0uYWxpZ25tZW50OwotCQkgIHF1YWRyYW50ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5xdWFkcmFudDsKLQkJICBhY2Nlc3MgPSBwYV9kZWZfc3Vic3BhY2VzW2ldLmFjY2VzczsKLQkJICBzb3J0ID0gcGFfZGVmX3N1YnNwYWNlc1tpXS5zb3J0OwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgaSsrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBXZSBzaG91bGQgYmUgd29ya2luZyB3aXRoIGEgbmV3IHN1YnNwYWNlIG5vdy4gIEZpbGwgaW4KLSAgICAgICAgIGFueSBpbmZvcm1hdGlvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuICAqLwotICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgd2hpbGUgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICAgICAgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInF1YWQiLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHF1YWRyYW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJhbGlnbiIsIDUpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JCSAgYWxpZ25tZW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JCSAgaWYgKGxvZzIgKGFsaWdubWVudCkgPT0gLTEpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiAyIikpOwotCQkgICAgICBhbGlnbm1lbnQgPSAxOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoKHN0cm5jYXNlY21wIChuYW1lLCAiYWNjZXNzIiwgNikgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICBhY2Nlc3MgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInNvcnQiLCA0KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQkgIHNvcnQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImNvZGVfb25seSIsIDkpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgY29kZV9vbmx5ID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgInVubG9hZGFibGUiLCAxMCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBsb2FkYWJsZSA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJjb21tb24iLCA2KSA9PSAwKSkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGNvbW1vbiA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJkdXBfY29tbSIsIDgpID09IDApKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgZHVwX2NvbW1vbiA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmICgoc3RybmNhc2VjbXAgKG5hbWUsICJ6ZXJvIiwgNCkgPT0gMCkpCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICB6ZXJvID0gMTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAobmFtZSwgImZpcnN0IiwgNSkgPT0gMCkpCi0JCWFzX2JhZCAoXygiRklSU1Qgbm90IHN1cHBvcnRlZCBhcyBhIC5TVUJTUEFDRSBhcmd1bWVudCIpKTsKLQkgICAgICBlbHNlCi0JCWFzX2JhZCAoXygiSW52YWxpZCAuU1VCU1BBQ0UgYXJndW1lbnQiKSk7Ci0JICAgICAgaWYgKCFpc19lbmRfb2Zfc3RhdGVtZW50ICgpKQotCQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgfQotCX0KLQotICAgICAgLyogQ29tcHV0ZSBhIHJlYXNvbmFibGUgc2V0IG9mIEJGRCBmbGFncyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24KLSAgICAgICAgIGluIHRoZSAuc3Vic3BhY2UgZGlyZWN0aXZlLiAgKi8KLSAgICAgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotICAgICAgZmxhZ3MgPSAwOwotICAgICAgaWYgKGxvYWRhYmxlKQotCWZsYWdzIHw9IChTRUNfQUxMT0MgfCBTRUNfTE9BRCk7Ci0gICAgICBpZiAoY29kZV9vbmx5KQotCWZsYWdzIHw9IFNFQ19DT0RFOwotICAgICAgaWYgKGNvbW1vbiB8fCBkdXBfY29tbW9uKQotCWZsYWdzIHw9IFNFQ19JU19DT01NT047Ci0KLSAgICAgIGZsYWdzIHw9IFNFQ19SRUxPQyB8IFNFQ19IQVNfQ09OVEVOVFM7Ci0KLSAgICAgIC8qIFRoaXMgaXMgYSB6ZXJvLWZpbGxlZCBzdWJzcGFjZSAoZWcgQlNTKS4gICovCi0gICAgICBpZiAoemVybykKLQlmbGFncyAmPSB+KFNFQ19MT0FEIHwgU0VDX0hBU19DT05URU5UUyk7Ci0KLSAgICAgIGFwcGxpY2FibGUgJj0gZmxhZ3M7Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gZXhpc3Rpbmcgc3Vic3BhY2UsIHRoZW4gd2Ugd2FudCB0byB1c2UgdGhlCi0gICAgICAgICBzZWdtZW50IGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdWJzcGFjZS4KLQotICAgICAgICAgRklYTUUgTk9XISAgRUxGIEJGRCBkb2Vzbid0IGFwcGVhciB0byBiZSByZWFkeSB0byBkZWFsIHdpdGgKLSAgICAgICAgIGxvdHMgb2Ygc2VjdGlvbnMuICBJdCBtaWdodCBiZSBhIHByb2JsZW0gaW4gdGhlIFBBIEVMRgotICAgICAgICAgY29kZSwgSSBkbyBub3Qga25vdyB5ZXQuICBGb3Igbm93IGF2b2lkIGNyZWF0aW5nIGFueXRoaW5nCi0gICAgICAgICBidXQgdGhlICJzdGFuZGFyZCIgc2VjdGlvbnMgZm9yIEVMRi4gICovCi0gICAgICBpZiAoY3JlYXRlX25ldykKLQlzZWN0aW9uID0gc3Vic2VnX2ZvcmNlX25ldyAoc3NfbmFtZSwgMCk7Ci0gICAgICBlbHNlIGlmIChzc2QpCi0Jc2VjdGlvbiA9IHNzZC0+c3NkX3NlZzsKLSAgICAgIGVsc2UKLQlzZWN0aW9uID0gc3Vic2VnX25ldyAoc3NfbmFtZSwgMCk7Ci0KLSAgICAgIGlmICh6ZXJvKQotCXNlZ19pbmZvIChzZWN0aW9uKS0+YnNzID0gMTsKLQotICAgICAgLyogTm93IHNldCB0aGUgZmxhZ3MuICAqLwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlY3Rpb24sIGFwcGxpY2FibGUpOwotCi0gICAgICAvKiBSZWNvcmQgYW55IGFsaWdubWVudCByZXF1ZXN0IGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2VjdGlvbiwgbG9nMiAoYWxpZ25tZW50KSk7Ci0KLSAgICAgIC8qIFNldCB0aGUgc3RhcnRpbmcgb2Zmc2V0IGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgYmZkX3NldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LCBzZWN0aW9uLAotCQkJICAgcGFfc3Vic3BhY2Vfc3RhcnQgKHNwYWNlLCBxdWFkcmFudCkpOwotCi0gICAgICAvKiBOb3cgdGhhdCBhbGwgdGhlIGZsYWdzIGFyZSBzZXQsIHVwZGF0ZSBhbiBleGlzdGluZyBzdWJzcGFjZSwKLSAgICAgICAgIG9yIGNyZWF0ZSBhIG5ldyBvbmUuICAqLwotICAgICAgaWYgKHNzZCkKLQotCWN1cnJlbnRfc3Vic3BhY2UgPSB1cGRhdGVfc3Vic3BhY2UgKHNwYWNlLCBzc19uYW1lLCBsb2FkYWJsZSwKLQkJCQkJICAgIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLAotCQkJCQkgICAgc29ydCwgemVybywgYWNjZXNzLCBzcGFjZV9pbmRleCwKLQkJCQkJICAgIGFsaWdubWVudCwgcXVhZHJhbnQsCi0JCQkJCSAgICBzZWN0aW9uKTsKLSAgICAgIGVsc2UKLQljdXJyZW50X3N1YnNwYWNlID0gY3JlYXRlX25ld19zdWJzcGFjZSAoc3BhY2UsIHNzX25hbWUsIGxvYWRhYmxlLAotCQkJCQkJY29kZV9vbmx5LCBjb21tb24sCi0JCQkJCQlkdXBfY29tbW9uLCB6ZXJvLCBzb3J0LAotCQkJCQkJYWNjZXNzLCBzcGFjZV9pbmRleCwKLQkJCQkJICAgICAgYWxpZ25tZW50LCBxdWFkcmFudCwgc2VjdGlvbik7Ci0KLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBjdXJyZW50X3N1YnNwYWNlLT5zc2Rfc2VnID0gc2VjdGlvbjsKLSAgICAgIHN1YnNlZ19zZXQgKGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zZWcsIGN1cnJlbnRfc3Vic3BhY2UtPnNzZF9zdWJzZWcpOwotICAgIH0KLSAgU1VCU1BBQ0VfREVGSU5FRCAoY3VycmVudF9zdWJzcGFjZSkgPSAxOwotfQotCi0KLS8qIENyZWF0ZSBkZWZhdWx0IHNwYWNlIGFuZCBzdWJzcGFjZSBkaWN0aW9uYXJpZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfc3BhY2VzX2JlZ2luICgpCi17Ci0gIGludCBpOwotCi0gIHNwYWNlX2RpY3Rfcm9vdCA9IE5VTEw7Ci0gIHNwYWNlX2RpY3RfbGFzdCA9IE5VTEw7Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlIChwYV9kZWZfc3BhY2VzW2ldLm5hbWUpCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLQotICAgICAgLyogUGljayB0aGUgcmlnaHQgbmFtZSB0byB1c2UgZm9yIHRoZSBuZXcgc2VjdGlvbi4gICovCi0gICAgICBuYW1lID0gcGFfZGVmX3NwYWNlc1tpXS5uYW1lOwotCi0gICAgICBwYV9kZWZfc3BhY2VzW2ldLnNlZ21lbnQgPSBzdWJzZWdfbmV3IChuYW1lLCAwKTsKLSAgICAgIGNyZWF0ZV9uZXdfc3BhY2UgKHBhX2RlZl9zcGFjZXNbaV0ubmFtZSwgcGFfZGVmX3NwYWNlc1tpXS5zcG51bSwKLQkJCXBhX2RlZl9zcGFjZXNbaV0ubG9hZGFibGUsIHBhX2RlZl9zcGFjZXNbaV0uZGVmaW5lZCwKLQkJCXBhX2RlZl9zcGFjZXNbaV0ucHJpdmF0ZSwgcGFfZGVmX3NwYWNlc1tpXS5zb3J0LAotCQkJcGFfZGVmX3NwYWNlc1tpXS5zZWdtZW50LCAwKTsKLSAgICAgIGkrKzsKLSAgICB9Ci0KLSAgaSA9IDA7Ci0gIHdoaWxlIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUpCi0gICAgewotICAgICAgY2hhciAqbmFtZTsKLSAgICAgIGludCBhcHBsaWNhYmxlLCBzdWJzZWdtZW50OwotICAgICAgYXNlY3Rpb24gKnNlZ21lbnQgPSBOVUxMOwotICAgICAgc2RfY2hhaW5fc3RydWN0ICpzcGFjZTsKLQotICAgICAgLyogUGljayB0aGUgcmlnaHQgbmFtZSBmb3IgdGhlIG5ldyBzZWN0aW9uIGFuZCBwaWNrIHRoZSByaWdodAotICAgICAgICAgc3Vic2VnbWVudCBudW1iZXIuICAqLwotICAgICAgbmFtZSA9IHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZTsKLSAgICAgIHN1YnNlZ21lbnQgPSAwOwotCi0gICAgICAvKiBDcmVhdGUgdGhlIG5ldyBzZWN0aW9uLiAgKi8KLSAgICAgIHNlZ21lbnQgPSBzdWJzZWdfbmV3IChuYW1lLCBzdWJzZWdtZW50KTsKLQotCi0gICAgICAvKiBGb3IgU09NIHdlIHdhbnQgdG8gcmVwbGFjZSB0aGUgc3RhbmRhcmQgLnRleHQsIC5kYXRhLCBhbmQgLmJzcwotICAgICAgICAgc2VjdGlvbnMgd2l0aCBvdXIgb3duLiAgIFdlIGFsc28gd2FudCB0byBzZXQgQkZEIGZsYWdzIGZvcgotCSBhbGwgdGhlIGJ1aWx0LWluIHN1YnNwYWNlcy4gICovCi0gICAgICBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJENPREUkIikpCi0JewotCSAgdGV4dF9zZWN0aW9uID0gc2VnbWVudDsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DIHwgU0VDX0NPREUKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkREFUQSQiKSkKLQl7Ci0JICBkYXRhX3NlY3Rpb24gPSBzZWdtZW50OwotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCi0KLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkQlNTJCIpKQotCXsKLQkgIGJzc19zZWN0aW9uID0gc2VnbWVudDsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiBTRUNfQUxMT0MpOwotCX0KLSAgICAgIGVsc2UgaWYgKCFzdHJjbXAgKHBhX2RlZl9zdWJzcGFjZXNbaV0ubmFtZSwgIiRMSVQkIikpCi0JewotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnbWVudCwKLQkJCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRAotCQkJCQkgICAgICAgfCBTRUNfUkVMT0MKLQkJCQkJICAgICAgIHwgU0VDX1JFQURPTkxZCi0JCQkJCSAgICAgICB8IFNFQ19IQVNfQ09OVEVOVFMpKTsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUsICIkTUlMTElDT0RFJCIpKQotCXsKLQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZ21lbnQsCi0JCQkJIGFwcGxpY2FibGUgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQKLQkJCQkJICAgICAgIHwgU0VDX1JFTE9DCi0JCQkJCSAgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICAgfCBTRUNfSEFTX0NPTlRFTlRTKSk7Ci0JfQotICAgICAgZWxzZSBpZiAoIXN0cmNtcCAocGFfZGVmX3N1YnNwYWNlc1tpXS5uYW1lLCAiJFVOV0lORCQiKSkKLQl7Ci0JICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWdtZW50LAotCQkJCSBhcHBsaWNhYmxlICYgKFNFQ19BTExPQyB8IFNFQ19MT0FECi0JCQkJCSAgICAgICB8IFNFQ19SRUxPQwotCQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkJICAgICAgIHwgU0VDX0hBU19DT05URU5UUykpOwotCX0KLQotICAgICAgLyogRmluZCB0aGUgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic3BhY2UuICAqLwotICAgICAgc3BhY2UgPSBwYV9zZWdtZW50X3RvX3NwYWNlIChwYV9kZWZfc3BhY2VzW3BhX2RlZl9zdWJzcGFjZXNbaV0uCi0JCQkJCQkgZGVmX3NwYWNlX2luZGV4XS5zZWdtZW50KTsKLSAgICAgIGlmIChzcGFjZSA9PSBOVUxMKQotCXsKLQkgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBlcnJvcjogVW5hYmxlIHRvIGZpbmQgY29udGFpbmluZyBzcGFjZSBmb3IgJXMuIiksCi0JCSAgICBwYV9kZWZfc3Vic3BhY2VzW2ldLm5hbWUpOwotCX0KLQotICAgICAgY3JlYXRlX25ld19zdWJzcGFjZSAoc3BhY2UsIG5hbWUsCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmxvYWRhYmxlLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5jb2RlX29ubHksCi0JCQkgICBwYV9kZWZfc3Vic3BhY2VzW2ldLmNvbW1vbiwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uZHVwX2NvbW1vbiwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uemVybywKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uc29ydCwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uYWNjZXNzLAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5zcGFjZV9pbmRleCwKLQkJCSAgIHBhX2RlZl9zdWJzcGFjZXNbaV0uYWxpZ25tZW50LAotCQkJICAgcGFfZGVmX3N1YnNwYWNlc1tpXS5xdWFkcmFudCwKLQkJCSAgIHNlZ21lbnQpOwotICAgICAgaSsrOwotICAgIH0KLX0KLQotCi0KLS8qIENyZWF0ZSBhIG5ldyBzcGFjZSBOQU1FLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmbGFncyBhcyBkZWZpbmVkCi0gICBieSB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotY3JlYXRlX25ld19zcGFjZSAobmFtZSwgc3BudW0sIGxvYWRhYmxlLCBkZWZpbmVkLCBwcml2YXRlLAotCQkgIHNvcnQsIHNlZywgdXNlcl9kZWZpbmVkKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgc3BudW07Ci0gICAgIGludCBsb2FkYWJsZTsKLSAgICAgaW50IGRlZmluZWQ7Ci0gICAgIGludCBwcml2YXRlOwotICAgICBpbnQgc29ydDsKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgaW50IHVzZXJfZGVmaW5lZDsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9lbnRyeTsKLQotICBjaGFpbl9lbnRyeSA9IChzZF9jaGFpbl9zdHJ1Y3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzZF9jaGFpbl9zdHJ1Y3QpKTsKLSAgaWYgKCFjaGFpbl9lbnRyeSkKLSAgICBhc19mYXRhbCAoXygiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIpLAotCSAgICAgIG5hbWUpOwotCi0gIFNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobmFtZSkgKyAxKTsKLSAgc3RyY3B5IChTUEFDRV9OQU1FIChjaGFpbl9lbnRyeSksIG5hbWUpOwotICBTUEFDRV9ERUZJTkVEIChjaGFpbl9lbnRyeSkgPSBkZWZpbmVkOwotICBTUEFDRV9VU0VSX0RFRklORUQgKGNoYWluX2VudHJ5KSA9IHVzZXJfZGVmaW5lZDsKLSAgU1BBQ0VfU1BOVU0gKGNoYWluX2VudHJ5KSA9IHNwbnVtOwotCi0gIGNoYWluX2VudHJ5LT5zZF9zZWcgPSBzZWc7Ci0gIGNoYWluX2VudHJ5LT5zZF9sYXN0X3N1YnNlZyA9IC0xOwotICBjaGFpbl9lbnRyeS0+c2Rfc3Vic3BhY2VzID0gTlVMTDsKLSAgY2hhaW5fZW50cnktPnNkX25leHQgPSBOVUxMOwotCi0gIC8qIEZpbmQgc3BvdCBmb3IgdGhlIG5ldyBzcGFjZSBiYXNlZCBvbiBpdHMgc29ydCBrZXkuICAqLwotICBpZiAoIXNwYWNlX2RpY3RfbGFzdCkKLSAgICBzcGFjZV9kaWN0X2xhc3QgPSBjaGFpbl9lbnRyeTsKLQotICBpZiAoc3BhY2VfZGljdF9yb290ID09IE5VTEwpCi0gICAgc3BhY2VfZGljdF9yb290ID0gY2hhaW5fZW50cnk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX3BvaW50ZXI7Ci0gICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnByZXZfY2hhaW5fcG9pbnRlcjsKLQotICAgICAgY2hhaW5fcG9pbnRlciA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgIHByZXZfY2hhaW5fcG9pbnRlciA9IE5VTEw7Ci0KLSAgICAgIHdoaWxlIChjaGFpbl9wb2ludGVyKQotCXsKLQkgIHByZXZfY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXI7Ci0JICBjaGFpbl9wb2ludGVyID0gY2hhaW5fcG9pbnRlci0+c2RfbmV4dDsKLQl9Ci0KLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UndmUgZm91bmQgdGhlIGNvcnJlY3QgcGxhY2UgdG8gYWRkIHRoZSBuZXcKLSAgICAgICAgIGVudHJ5LiAgU28gYWRkIGl0IGFuZCB1cGRhdGUgdGhlIGxpbmtlZCBsaXN0cyBhcyBhcHByb3ByaWF0ZS4gICovCi0gICAgICBpZiAocHJldl9jaGFpbl9wb2ludGVyKQotCXsKLQkgIGNoYWluX2VudHJ5LT5zZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKLQkgIHByZXZfY2hhaW5fcG9pbnRlci0+c2RfbmV4dCA9IGNoYWluX2VudHJ5OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzcGFjZV9kaWN0X3Jvb3QgPSBjaGFpbl9lbnRyeTsKLQkgIGNoYWluX2VudHJ5LT5zZF9uZXh0ID0gY2hhaW5fcG9pbnRlcjsKLQl9Ci0KLSAgICAgIGlmIChjaGFpbl9lbnRyeS0+c2RfbmV4dCA9PSBOVUxMKQotCXNwYWNlX2RpY3RfbGFzdCA9IGNoYWluX2VudHJ5OwotICAgIH0KLQotICAvKiBUaGlzIGlzIGhlcmUgdG8gY2F0Y2ggcHJlZGVmaW5lZCBzcGFjZXMgd2hpY2ggZG8gbm90IGdldAotICAgICBtb2RpZmllZCBieSB0aGUgdXNlcidzIGlucHV0LiAgQW5vdGhlciBjYWxsIGlzIGZvdW5kIGF0Ci0gICAgIHRoZSBib3R0b20gb2YgcGFfcGFyc2Vfc3BhY2Vfc3RtdCB0byBoYW5kbGUgY2FzZXMgd2hlcmUKLSAgICAgdGhlIHVzZXIgbW9kaWZpZXMgYSBwcmVkZWZpbmVkIHNwYWNlLiAgKi8KLSNpZmRlZiBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcwotICBvYmpfc2V0X3NlY3Rpb25fYXR0cmlidXRlcyAoc2VnLCBkZWZpbmVkLCBwcml2YXRlLCBzb3J0LCBzcG51bSk7Ci0jZW5kaWYKLQotICByZXR1cm4gY2hhaW5fZW50cnk7Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBzdWJzcGFjZSBOQU1FLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBmbGFncyBhcyBkZWZpbmVkCi0gICBieSB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLQotICAgQWRkIHRoZSBuZXcgc3Vic3BhY2UgdG8gdGhlIHN1YnNwYWNlIGRpY3Rpb25hcnkgY2hhaW4gaW4gbnVtZXJpY2FsCi0gICBvcmRlciBhcyBkZWZpbmVkIGJ5IHRoZSBTT1JUIGVudHJpZXMuICAqLwotCi1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCi1jcmVhdGVfbmV3X3N1YnNwYWNlIChzcGFjZSwgbmFtZSwgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLAotCQkgICAgIGR1cF9jb21tb24sIGlzX3plcm8sIHNvcnQsIGFjY2Vzcywgc3BhY2VfaW5kZXgsCi0JCSAgICAgYWxpZ25tZW50LCBxdWFkcmFudCwgc2VnKQotICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgbG9hZGFibGUsIGNvZGVfb25seSwgY29tbW9uLCBkdXBfY29tbW9uLCBpc196ZXJvOwotICAgICBpbnQgc29ydDsKLSAgICAgaW50IGFjY2VzczsKLSAgICAgaW50IHNwYWNlX2luZGV4OwotICAgICBpbnQgYWxpZ25tZW50OwotICAgICBpbnQgcXVhZHJhbnQ7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIHNzZF9jaGFpbl9zdHJ1Y3QgKmNoYWluX2VudHJ5OwotCi0gIGNoYWluX2VudHJ5ID0gKHNzZF9jaGFpbl9zdHJ1Y3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzc2RfY2hhaW5fc3RydWN0KSk7Ci0gIGlmICghY2hhaW5fZW50cnkpCi0gICAgYXNfZmF0YWwgKF8oIk91dCBvZiBtZW1vcnk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgc3Vic3BhY2UgY2hhaW4gZW50cnk6ICVzXG4iKSwgbmFtZSk7Ci0KLSAgU1VCU1BBQ0VfTkFNRSAoY2hhaW5fZW50cnkpID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEpOwotICBzdHJjcHkgKFNVQlNQQUNFX05BTUUgKGNoYWluX2VudHJ5KSwgbmFtZSk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBzdWJzcGFjZV9kZWZpbmVkLiAgV2hlbiB3ZSBoaXQgYSAuc3Vic3BhY2UgZGlyZWN0aXZlCi0gICAgIHdlJ2xsIHNldCBpdCB0byAxIHdoaWNoICJsb2Nrcy1pbiIgdGhlIHN1YnNwYWNlIGF0dHJpYnV0ZXMuICAqLwotICBTVUJTUEFDRV9ERUZJTkVEIChjaGFpbl9lbnRyeSkgPSAwOwotCi0gIGNoYWluX2VudHJ5LT5zc2Rfc3Vic2VnID0gMDsKLSAgY2hhaW5fZW50cnktPnNzZF9zZWcgPSBzZWc7Ci0gIGNoYWluX2VudHJ5LT5zc2RfbmV4dCA9IE5VTEw7Ci0KLSAgLyogRmluZCBzcG90IGZvciB0aGUgbmV3IHN1YnNwYWNlIGJhc2VkIG9uIGl0cyBzb3J0IGtleS4gICovCi0gIGlmIChzcGFjZS0+c2Rfc3Vic3BhY2VzID09IE5VTEwpCi0gICAgc3BhY2UtPnNkX3N1YnNwYWNlcyA9IGNoYWluX2VudHJ5OwotICBlbHNlCi0gICAgewotICAgICAgc3NkX2NoYWluX3N0cnVjdCAqY2hhaW5fcG9pbnRlcjsKLSAgICAgIHNzZF9jaGFpbl9zdHJ1Y3QgKnByZXZfY2hhaW5fcG9pbnRlcjsKLQotICAgICAgY2hhaW5fcG9pbnRlciA9IHNwYWNlLT5zZF9zdWJzcGFjZXM7Ci0gICAgICBwcmV2X2NoYWluX3BvaW50ZXIgPSBOVUxMOwotCi0gICAgICB3aGlsZSAoY2hhaW5fcG9pbnRlcikKLQl7Ci0JICBwcmV2X2NoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyOwotCSAgY2hhaW5fcG9pbnRlciA9IGNoYWluX3BvaW50ZXItPnNzZF9uZXh0OwotCX0KLQotICAgICAgLyogTm93IHdlIGhhdmUgc29tZXdoZXJlIHRvIHB1dCB0aGUgbmV3IGVudHJ5LiAgSW5zZXJ0IGl0IGFuZCB1cGRhdGUKLSAgICAgICAgIHRoZSBsaW5rcy4gICovCi0gICAgICBpZiAocHJldl9jaGFpbl9wb2ludGVyKQotCXsKLQkgIGNoYWluX2VudHJ5LT5zc2RfbmV4dCA9IGNoYWluX3BvaW50ZXI7Ci0JICBwcmV2X2NoYWluX3BvaW50ZXItPnNzZF9uZXh0ID0gY2hhaW5fZW50cnk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNwYWNlLT5zZF9zdWJzcGFjZXMgPSBjaGFpbl9lbnRyeTsKLQkgIGNoYWluX2VudHJ5LT5zc2RfbmV4dCA9IGNoYWluX3BvaW50ZXI7Ci0JfQotICAgIH0KLQotI2lmZGVmIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzCi0gIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWcsIHNwYWNlLT5zZF9zZWcsIGFjY2VzcywKLQkJCQkgc29ydCwgcXVhZHJhbnQpOwotI2VuZGlmCi0KLSAgcmV0dXJuIGNoYWluX2VudHJ5OwotfQotCi0vKiBVcGRhdGUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gc3Vic3BhY2UgYmFzZWQgdXBvbiB0aGUKLSAgIHZhcmlvdXMgYXJndW1lbnRzLiAgIFJldHVybiB0aGUgbW9kaWZpZWQgc3Vic3BhY2UgY2hhaW4gZW50cnkuICAqLwotCi1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCi11cGRhdGVfc3Vic3BhY2UgKHNwYWNlLCBuYW1lLCBsb2FkYWJsZSwgY29kZV9vbmx5LCBjb21tb24sIGR1cF9jb21tb24sIHNvcnQsCi0JCSB6ZXJvLCBhY2Nlc3MsIHNwYWNlX2luZGV4LCBhbGlnbm1lbnQsIHF1YWRyYW50LCBzZWN0aW9uKQotICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgbG9hZGFibGU7Ci0gICAgIGludCBjb2RlX29ubHk7Ci0gICAgIGludCBjb21tb247Ci0gICAgIGludCBkdXBfY29tbW9uOwotICAgICBpbnQgemVybzsKLSAgICAgaW50IHNvcnQ7Ci0gICAgIGludCBhY2Nlc3M7Ci0gICAgIGludCBzcGFjZV9pbmRleDsKLSAgICAgaW50IGFsaWdubWVudDsKLSAgICAgaW50IHF1YWRyYW50OwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgc3NkX2NoYWluX3N0cnVjdCAqY2hhaW5fZW50cnk7Ci0KLSAgY2hhaW5fZW50cnkgPSBpc19kZWZpbmVkX3N1YnNwYWNlIChuYW1lKTsKLQotI2lmZGVmIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzCi0gIG9ial9zZXRfc3Vic2VjdGlvbl9hdHRyaWJ1dGVzIChzZWN0aW9uLCBzcGFjZS0+c2Rfc2VnLCBhY2Nlc3MsCi0JCQkJIHNvcnQsIHF1YWRyYW50KTsKLSNlbmRpZgotCi0gIHJldHVybiBjaGFpbl9lbnRyeTsKLX0KLQotLyogUmV0dXJuIHRoZSBzcGFjZSBjaGFpbiBlbnRyeSBmb3IgdGhlIHNwYWNlIHdpdGggdGhlIG5hbWUgTkFNRSBvcgotICAgTlVMTCBpZiBubyBzdWNoIHNwYWNlIGV4aXN0cy4gICovCi0KLXN0YXRpYyBzZF9jaGFpbl9zdHJ1Y3QgKgotaXNfZGVmaW5lZF9zcGFjZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc2RfY2hhaW5fc3RydWN0ICpjaGFpbl9wb2ludGVyOwotCi0gIGZvciAoY2hhaW5fcG9pbnRlciA9IHNwYWNlX2RpY3Rfcm9vdDsKLSAgICAgICBjaGFpbl9wb2ludGVyOwotICAgICAgIGNoYWluX3BvaW50ZXIgPSBjaGFpbl9wb2ludGVyLT5zZF9uZXh0KQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKFNQQUNFX05BTUUgKGNoYWluX3BvaW50ZXIpLCBuYW1lKSA9PSAwKQotCXJldHVybiBjaGFpbl9wb2ludGVyOwotICAgIH0KLQotICAvKiBObyBtYXBwaW5nIGZyb20gc2VnbWVudCB0byBzcGFjZSB3YXMgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBGaW5kIGFuZCByZXR1cm4gdGhlIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gc2VnLiAgSWYgbm8gbWFwcGluZwotICAgZnJvbSB0aGUgZ2l2ZW4gc2VnIHRvIGEgc3BhY2UgaXMgZm91bmQsIHRoZW4gcmV0dXJuIE5VTEwuCi0KLSAgIFVubGlrZSBzdWJzcGFjZXMsIHRoZSBudW1iZXIgb2Ygc3BhY2VzIGlzIG5vdCBleHBlY3RlZCB0byBncm93IG11Y2gsCi0gICBzbyBhIGxpbmVhciBleGhhdXN0aXZlIHNlYXJjaCBpcyBPSyBoZXJlLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1wYV9zZWdtZW50X3RvX3NwYWNlIChzZWcpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIHNkX2NoYWluX3N0cnVjdCAqc3BhY2VfY2hhaW47Ci0KLSAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3BhY2UgbG9va2luZyBmb3IgdGhlIGNvcnJlY3QgbWFwcGluZy4gICovCi0gIGZvciAoc3BhY2VfY2hhaW4gPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgc3BhY2VfY2hhaW47Ci0gICAgICAgc3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3BhY2VfY2hhaW4tPnNkX3NlZyA9PSBzZWcpCi0JcmV0dXJuIHNwYWNlX2NoYWluOwotICAgIH0KLQotICAvKiBNYXBwaW5nIHdhcyBub3QgZm91bmQuICBSZXR1cm4gTlVMTC4gICovCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXR1cm4gdGhlIHNwYWNlIGNoYWluIGVudHJ5IGZvciB0aGUgc3Vic3BhY2Ugd2l0aCB0aGUgbmFtZSBOQU1FIG9yCi0gICBOVUxMIGlmIG5vIHN1Y2ggc3Vic3BhY2UgZXhpc3RzLgotCi0gICBVc2VzIGEgbGluZWFyIHNlYXJjaCB0aHJvdWdoIGFsbCB0aGUgc3BhY2VzIGFuZCBzdWJzcGFjZXMsIHRoaXMgbWF5Ci0gICBub3QgYmUgYXBwcm9wcmlhdGUgaWYgd2UgZXZlciBiZWluZyBwbGFjaW5nIGVhY2ggZnVuY3Rpb24gaW4gaXRzCi0gICBvd24gc3Vic3BhY2UuICAqLwotCi1zdGF0aWMgc3NkX2NoYWluX3N0cnVjdCAqCi1pc19kZWZpbmVkX3N1YnNwYWNlIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluOwotICBzc2RfY2hhaW5fc3RydWN0ICpzdWJzcGFjZV9jaGFpbjsKLQotICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzcGFjZS4gICovCi0gIGZvciAoc3BhY2VfY2hhaW4gPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgc3BhY2VfY2hhaW47Ci0gICAgICAgc3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzdWJzcGFjZSBsb29raW5nIGZvciBhIG5hbWUgd2hpY2ggbWF0Y2hlcy4gICovCi0gICAgICBmb3IgKHN1YnNwYWNlX2NoYWluID0gc3BhY2VfY2hhaW4tPnNkX3N1YnNwYWNlczsKLQkgICBzdWJzcGFjZV9jaGFpbjsKLQkgICBzdWJzcGFjZV9jaGFpbiA9IHN1YnNwYWNlX2NoYWluLT5zc2RfbmV4dCkKLQlpZiAoc3RyY21wIChTVUJTUEFDRV9OQU1FIChzdWJzcGFjZV9jaGFpbiksIG5hbWUpID09IDApCi0JICByZXR1cm4gc3Vic3BhY2VfY2hhaW47Ci0gICAgfQotCi0gIC8qIFN1YnNwYWNlIHdhc24ndCBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEZpbmQgYW5kIHJldHVybiB0aGUgc3Vic3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzZWcuICBJZiBubwotICAgbWFwcGluZyBmcm9tIHRoZSBnaXZlbiBzZWcgdG8gYSBzdWJzcGFjZSBpcyBmb3VuZCwgdGhlbiByZXR1cm4gTlVMTC4KLQotICAgSWYgd2UgZXZlciBwdXQgZWFjaCBwcm9jZWR1cmUvZnVuY3Rpb24gd2l0aGluIGl0cyBvd24gc3Vic3BhY2UKLSAgICh0byBtYWtlIGxpZmUgZWFzaWVyIG9uIHRoZSBjb21waWxlciBhbmQgbGlua2VyKSwgdGhlbiB0aGlzIHdpbGwgaGF2ZQotICAgdG8gYmVjb21lIG1vcmUgZWZmaWNpZW50LiAgKi8KLQotc3RhdGljIHNzZF9jaGFpbl9zdHJ1Y3QgKgotcGFfc3Vic2VnbWVudF90b19zdWJzcGFjZSAoc2VnLCBzdWJzZWcpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluOwotICBzc2RfY2hhaW5fc3RydWN0ICpzdWJzcGFjZV9jaGFpbjsKLQotICAvKiBXYWxrIHRocm91Z2ggZWFjaCBzcGFjZS4gICovCi0gIGZvciAoc3BhY2VfY2hhaW4gPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgc3BhY2VfY2hhaW47Ci0gICAgICAgc3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3BhY2VfY2hhaW4tPnNkX3NlZyA9PSBzZWcpCi0JewotCSAgLyogV2FsayB0aHJvdWdoIGVhY2ggc3Vic3BhY2Ugd2l0aGluIGVhY2ggc3BhY2UgbG9va2luZyBmb3IKLQkgICAgIHRoZSBjb3JyZWN0IG1hcHBpbmcuICAqLwotCSAgZm9yIChzdWJzcGFjZV9jaGFpbiA9IHNwYWNlX2NoYWluLT5zZF9zdWJzcGFjZXM7Ci0JICAgICAgIHN1YnNwYWNlX2NoYWluOwotCSAgICAgICBzdWJzcGFjZV9jaGFpbiA9IHN1YnNwYWNlX2NoYWluLT5zc2RfbmV4dCkKLQkgICAgaWYgKHN1YnNwYWNlX2NoYWluLT5zc2Rfc3Vic2VnID09IChpbnQpIHN1YnNlZykKLQkgICAgICByZXR1cm4gc3Vic3BhY2VfY2hhaW47Ci0JfQotICAgIH0KLQotICAvKiBObyBtYXBwaW5nIGZyb20gc3Vic2VnbWVudCB0byBzdWJzcGFjZSBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEdpdmVuIGEgbnVtYmVyLCB0cnkgYW5kIGZpbmQgYSBzcGFjZSB3aXRoIHRoZSBuYW1lIG51bWJlci4KLQotICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIHNwYWNlIGRpY3Rpb25hcnkgY2hhaW4gZW50cnkgZm9yIHRoZSBzcGFjZQotICAgdGhhdCB3YXMgZm91bmQgb3IgTlVMTCBvbiBmYWlsdXJlLiAgKi8KLQotc3RhdGljIHNkX2NoYWluX3N0cnVjdCAqCi1wYV9maW5kX3NwYWNlX2J5X251bWJlciAobnVtYmVyKQotICAgICBpbnQgbnVtYmVyOwotewotICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlX2NoYWluOwotCi0gIGZvciAoc3BhY2VfY2hhaW4gPSBzcGFjZV9kaWN0X3Jvb3Q7Ci0gICAgICAgc3BhY2VfY2hhaW47Ci0gICAgICAgc3BhY2VfY2hhaW4gPSBzcGFjZV9jaGFpbi0+c2RfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoU1BBQ0VfU1BOVU0gKHNwYWNlX2NoYWluKSA9PSAodW5zaWduZWQgaW50KSBudW1iZXIpCi0JcmV0dXJuIHNwYWNlX2NoYWluOwotICAgIH0KLQotICAvKiBObyBhcHByb3ByaWF0ZSBzcGFjZSBmb3VuZC4gIFJldHVybiBOVUxMLiAgKi8KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFJldHVybiB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3IgdGhlIGdpdmVuIHN1YnNwYWNlLiAgSWYgdGhlIHN0YXJ0aW5nCi0gICBhZGRyZXNzIGlzIHVua25vd24gdGhlbiByZXR1cm4gemVyby4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBhX3N1YnNwYWNlX3N0YXJ0IChzcGFjZSwgcXVhZHJhbnQpCi0gICAgIHNkX2NoYWluX3N0cnVjdCAqc3BhY2U7Ci0gICAgIGludCBxdWFkcmFudDsKLXsKLSAgLyogRklYTUUuICBBc3N1bWVzIGV2ZXJ5b25lIHB1dHMgcmVhZC93cml0ZSBkYXRhIGF0IDB4NDAwMDAwMCwgdGhpcwotICAgICBpcyBub3QgY29ycmVjdCBmb3IgdGhlIFBBIE9TRjEgcG9ydC4gICovCi0gIGlmICgoc3RyY21wIChTUEFDRV9OQU1FIChzcGFjZSksICIkUFJJVkFURSQiKSA9PSAwKSAmJiBxdWFkcmFudCA9PSAxKQotICAgIHJldHVybiAweDQwMDAwMDAwOwotICBlbHNlIGlmIChzcGFjZS0+c2Rfc2VnID09IGRhdGFfc2VjdGlvbiAmJiBxdWFkcmFudCA9PSAxKQotICAgIHJldHVybiAweDQwMDAwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAwOwotfQotCi0vKiBGSVhNRS4gIE5lZWRzIGRvY3VtZW50YXRpb24uICAqLwotc3RhdGljIGludAotcGFfbmV4dF9zdWJzZWcgKHNwYWNlKQotICAgICBzZF9jaGFpbl9zdHJ1Y3QgKnNwYWNlOwotewotCi0gIHNwYWNlLT5zZF9sYXN0X3N1YnNlZysrOwotICByZXR1cm4gc3BhY2UtPnNkX2xhc3Rfc3Vic2VnOwotfQotI2VuZGlmCi0KLS8qIEhlbHBlciBmdW5jdGlvbiBmb3IgcGFfc3RyaW5nZXIuICBVc2VkIHRvIGZpbmQgdGhlIGVuZCBvZgotICAgYSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wYV9zdHJpbmdlcl9hdXggKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHVuc2lnbmVkIGludCBjID0gKnMgJiBDSEFSX01BU0s7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFdlIG11c3QgaGF2ZSBhIHZhbGlkIHNwYWNlIGFuZCBzdWJzcGFjZS4gICovCi0gIHBhX2NoZWNrX2N1cnJlbnRfc3BhY2VfYW5kX3N1YnNwYWNlICgpOwotI2VuZGlmCi0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdcIic6Ci0gICAgICBjID0gTk9UX0FfQ0hBUjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBjOwotfQotCi0vKiBIYW5kbGUgYSAuU1RSSU5HIHR5cGUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX3N0cmluZ2VyIChhcHBlbmRfemVybykKLSAgICAgaW50IGFwcGVuZF96ZXJvOwotewotICBjaGFyICpzLCBudW1fYnVmWzRdOwotICB1bnNpZ25lZCBpbnQgYzsKLSAgaW50IGk7Ci0KLSAgLyogUHJlcHJvY2VzcyB0aGUgc3RyaW5nIHRvIGhhbmRsZSBQQS1zcGVjaWZpYyBlc2NhcGUgc2VxdWVuY2VzLgotICAgICBGb3IgZXhhbXBsZSwgXHhERCB3aGVyZSBERCBpcyBhIGhleGlkZWNpbWFsIG51bWJlciBzaG91bGQgYmUKLSAgICAgY2hhbmdlZCB0byBcT09PIHdoZXJlIE9PTyBpcyBhbiBvY3RhbCBudW1iZXIuICAqLwotCi0gIC8qIFNraXAgdGhlIG9wZW5pbmcgcXVvdGUuICAqLwotICBzID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQotICB3aGlsZSAoaXNfYV9jaGFyIChjID0gcGFfc3RyaW5nZXJfYXV4IChzKyspKSkKLSAgICB7Ci0gICAgICBpZiAoYyA9PSAnXFwnKQotCXsKLQkgIGMgPSAqczsKLQkgIHN3aXRjaCAoYykKLQkgICAgewotCSAgICAgIC8qIEhhbmRsZSBceDxudW0+LiAgKi8KLQkgICAgY2FzZSAneCc6Ci0JICAgICAgewotCQl1bnNpZ25lZCBpbnQgbnVtYmVyOwotCQlpbnQgbnVtX2RpZ2l0OwotCQljaGFyIGRnOwotCQljaGFyICpzX3N0YXJ0ID0gczsKLQotCQkvKiBHZXQgcGFzIHRoZSAneCcuICAqLwotCQlzKys7Ci0JCWZvciAobnVtX2RpZ2l0ID0gMCwgbnVtYmVyID0gMCwgZGcgPSAqczsKLQkJICAgICBudW1fZGlnaXQgPCAyCi0JCSAgICAgJiYgKGlzZGlnaXQgKGRnKSB8fCAoZGcgPj0gJ2EnICYmIGRnIDw9ICdmJykKLQkJCSB8fCAoZGcgPj0gJ0EnICYmIGRnIDw9ICdGJykpOwotCQkgICAgIG51bV9kaWdpdCsrKQotCQkgIHsKLQkJICAgIGlmIChpc2RpZ2l0IChkZykpCi0JCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnMCc7Ci0JCSAgICBlbHNlIGlmIChkZyA+PSAnYScgJiYgZGcgPD0gJ2YnKQotCQkgICAgICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGRnIC0gJ2EnICsgMTA7Ci0JCSAgICBlbHNlCi0JCSAgICAgIG51bWJlciA9IG51bWJlciAqIDE2ICsgZGcgLSAnQScgKyAxMDsKLQotCQkgICAgcysrOwotCQkgICAgZGcgPSAqczsKLQkJICB9Ci0JCWlmIChudW1fZGlnaXQgPiAwKQotCQkgIHsKLQkJICAgIHN3aXRjaCAobnVtX2RpZ2l0KQotCQkgICAgICB7Ci0JCSAgICAgIGNhc2UgMToKLQkJCXNwcmludGYgKG51bV9idWYsICIlMDJvIiwgbnVtYmVyKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIDI6Ci0JCQlzcHJpbnRmIChudW1fYnVmLCAiJTAzbyIsIG51bWJlcik7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgZm9yIChpID0gMDsgaSA8PSBudW1fZGlnaXQ7IGkrKykKLQkJICAgICAgc19zdGFydFtpXSA9IG51bV9idWZbaV07Ci0JCSAgfQotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIC8qIFRoaXMgbWlnaHQgYmUgYSAiXCIiLCBza2lwIG92ZXIgdGhlIGVzY2FwZWQgY2hhci4gICovCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcysrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgc3RyaW5nZXIgKGFwcGVuZF96ZXJvKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5WRVJTSU9OIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV92ZXJzaW9uICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIG9ial92ZXJzaW9uICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLSNpZmRlZiBPQkpfU09NCi0KLS8qIEhhbmRsZSBhIC5DT01QSUxFUiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29tcGlsZXIgKHVudXNlZCkKLSAgICAgaW50IHVudXNlZDsKLXsKLSAgb2JqX3NvbV9jb21waWxlciAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0jZW5kaWYKLQotLyogSGFuZGxlIGEgLkNPUFlSSUdIVCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29weXJpZ2h0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0gIG9ial9jb3B5cmlnaHQgKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogSnVzdCBsaWtlIGEgbm9ybWFsIGNvbnMsIGJ1dCB3aGVuIGZpbmlzaGVkIHdlIGhhdmUgdG8gdW5kZWZpbmUKLSAgIHRoZSBsYXRlc3Qgc3BhY2UgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfY29ucyAobmJ5dGVzKQotICAgICBpbnQgbmJ5dGVzOwotewotICBjb25zIChuYnl0ZXMpOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogU3dpdGNoIHRvIHRoZSBkYXRhIHNwYWNlLiAgQXMgdXN1YWwgZGVsZXRlIG91ciBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9kYXRhICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICBjdXJyZW50X3NwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRQUklWQVRFJCIpOwotICBjdXJyZW50X3N1YnNwYWNlCi0gICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChjdXJyZW50X3NwYWNlLT5zZF9zZWcsIDApOwotI2VuZGlmCi0gIHNfZGF0YSAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGZsb2F0X2NvbnMsIGJ1dCB3ZSBuZWVkIHRvIHVuZGVmaW5lIG91ciBsYWJlbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9mbG9hdF9jb25zIChmbG9hdF90eXBlKQotICAgICBpbnQgZmxvYXRfdHlwZTsKLXsKLSAgZmxvYXRfY29ucyAoZmxvYXRfdHlwZSk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIHNfZmlsbCwgYnV0IGRlbGV0ZSBvdXIgbGFiZWwgd2hlbiBmaW5pc2hlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1wYV9maWxsICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICAvKiBXZSBtdXN0IGhhdmUgYSB2YWxpZCBzcGFjZSBhbmQgc3Vic3BhY2UuICAqLwotICBwYV9jaGVja19jdXJyZW50X3NwYWNlX2FuZF9zdWJzcGFjZSAoKTsKLSNlbmRpZgotCi0gIHNfZmlsbCAoMCk7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGxjb21tLCBidXQgZGVsZXRlIG91ciBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhX2xjb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzX2xjb21tIChuZWVkc19hbGlnbik7Ci0gIHBhX3VuZGVmaW5lX2xhYmVsICgpOwotfQotCi0vKiBMaWtlIGxzeW0sIGJ1dCBkZWxldGUgb3VyIGxhYmVsIHdoZW4gZmluaXNoZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFfbHN5bSAodW51c2VkKQotICAgICBpbnQgdW51c2VkOwotewotI2lmZGVmIE9CSl9TT00KLSAgLyogV2UgbXVzdCBoYXZlIGEgdmFsaWQgc3BhY2UgYW5kIHN1YnNwYWNlLiAgKi8KLSAgcGFfY2hlY2tfY3VycmVudF9zcGFjZV9hbmRfc3Vic3BhY2UgKCk7Ci0jZW5kaWYKLQotICBzX2xzeW0gKDApOwotICBwYV91bmRlZmluZV9sYWJlbCAoKTsKLX0KLQotLyogU3dpdGNoIHRvIHRoZSB0ZXh0IHNwYWNlLiAgTGlrZSBzX3RleHQsIGJ1dCBkZWxldGUgb3VyCi0gICBsYWJlbCB3aGVuIGZpbmlzaGVkLiAgKi8KLXN0YXRpYyB2b2lkCi1wYV90ZXh0ICh1bnVzZWQpCi0gICAgIGludCB1bnVzZWQ7Ci17Ci0jaWZkZWYgT0JKX1NPTQotICBjdXJyZW50X3NwYWNlID0gaXNfZGVmaW5lZF9zcGFjZSAoIiRURVhUJCIpOwotICBjdXJyZW50X3N1YnNwYWNlCi0gICAgPSBwYV9zdWJzZWdtZW50X3RvX3N1YnNwYWNlIChjdXJyZW50X3NwYWNlLT5zZF9zZWcsIDApOwotI2VuZGlmCi0KLSAgc190ZXh0ICgwKTsKLSAgcGFfdW5kZWZpbmVfbGFiZWwgKCk7Ci19Ci0KLS8qIE9uIHRoZSBQQSByZWxvY2F0aW9ucyB3aGljaCBpbnZvbHZlIGZ1bmN0aW9uIHN5bWJvbHMgbXVzdCBub3QgYmUKLSAgIGFkanVzdGVkLiAgVGhpcyBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIGtub3cgd2hlbi9ob3cgdG8gY3JlYXRlIGFyZ3VtZW50Ci0gICByZWxvY2F0aW9uIHN0dWJzIGZvciBpbmRpcmVjdCBjYWxscyBhbmQgY2FsbHMgdG8gc3RhdGljIGZ1bmN0aW9ucy4KLQotICAgIlQiIGZpZWxkIHNlbGVjdG9ycyBjcmVhdGUgRExUIHJlbGF0aXZlIGZpeHVwcyBmb3IgYWNjZXNzaW5nCi0gICBnbG9iYWxzIGFuZCBzdGF0aWNzIGluIFBJQyBjb2RlOyBlYWNoIERMVCByZWxhdGl2ZSBmaXh1cCBjcmVhdGVzCi0gICBhbiBlbnRyeSBpbiB0aGUgRExUIHRhYmxlLiAgVGhlIGVudHJpZXMgY29udGFpbiB0aGUgYWRkcmVzcyBvZgotICAgdGhlIGZpbmFsIHRhcmdldCAoZWcgYWNjZXNzaW5nICJmb28iIHdvdWxkIGNyZWF0ZSBhIERMVCBlbnRyeQotICAgd2l0aCB0aGUgYWRkcmVzcyBvZiAiZm9vIikuCi0KLSAgIFVuZm9ydHVuYXRlbHksIHRoZSBIUCBsaW5rZXIgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCBhbnkgYWRkZW5kCi0gICB3aGVuIGdlbmVyYXRpbmcgdGhlIERMVDsgc28gYWNjZXNzaW5nICRMSVQkKzggcHV0cyB0aGUgYWRkcmVzcyBvZgotICAgJExJVCQgaW50byB0aGUgRExUIHJhdGhlciB0aGFuIHRoZSBhZGRyZXNzIG9mICRMSVQkKzguCi0KLSAgIFRoZSBlbmQgcmVzdWx0IGlzIHdlIGNhbid0IHBlcmZvcm0gcmVsb2NhdGlvbiBzeW1ib2wgcmVkdWN0aW9ucyBmb3IKLSAgIGFueSBmaXh1cCB3aGljaCBjcmVhdGVzIGVudHJpZXMgaW4gdGhlIERMVCAoZWcgdGhleSB1c2UgIlQiIGZpZWxkCi0gICBzZWxlY3RvcnMpLgotCi0gICBSZWplY3QgcmVkdWN0aW9ucyBpbnZvbHZpbmcgc3ltYm9scyB3aXRoIGV4dGVybmFsIHNjb3BlOyBzdWNoCi0gICByZWR1Y3Rpb25zIG1ha2UgbGlmZSBhIGxpdmluZyBoZWxsIGZvciBvYmplY3QgZmlsZSBlZGl0b3JzLiAKLQotICAgRklYTUUuICBBbHNvIHJlamVjdCBSX0hQUEEgcmVsb2NhdGlvbnMgd2hpY2ggYXJlIDMyYml0cyB3aWRlIGluCi0gICB0aGUgY29kZSBzcGFjZS4gIFRoZSBTT00gQkZEIGJhY2tlbmQgZG9lc24ndCBrbm93IGhvdyB0byBwdWxsIHRoZQotICAgcmlnaHQgYml0cyBvdXQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1pbnQKLWhwcGFfZml4X2FkanVzdGFibGUgKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKmhwcGFfZml4OwotCi0gIGhwcGFfZml4ID0gKHN0cnVjdCBocHBhX2ZpeF9zdHJ1Y3QgKikgZml4cC0+dGNfZml4X2RhdGE7Ci0KLSNpZmRlZiBPQkpfU09NCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gMzJiaXQgcmVsb2NzLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEEgJiYgaHBwYV9maXgtPmZ4X3JfZm9ybWF0ID09IDMyKQotICAgIHJldHVybiAwOwotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gc3ltMS1zeW0yIGV4cHJlc3Npb25zIHdoZW4KLSAgICAgdGhlIGZpeHVwIHdpbGwgb2NjdXIgaW4gYSBDT0RFIHN1YnNwYWNlLiAKLQotICAgICBYWFggRklYTUU6IExvbmcgdGVybSB3ZSBwcm9iYWJseSB3YW50IHRvIHJlamVjdCBhbGwgb2YgdGhlc2U7Ci0gICAgIGZvciBleGFtcGxlIHJlZHVjaW5nIGluIHRoZSBkZWJ1ZyBzZWN0aW9uIHdvdWxkIGxvc2UgaWYgd2UgZXZlcgotICAgICBzdXBwb3J0ZWQgdXNpbmcgdGhlIG9wdGltaXppbmcgaHAgbGlua2VyLiAgKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5Ci0gICAgICAmJiBmaXhwLT5meF9zdWJzeQotICAgICAgJiYgKGhwcGFfZml4LT5zZWdtZW50LT5mbGFncyAmIFNFQ19DT0RFKSkKLSAgICB7Ci0gICAgICAvKiBBcHBhcmVudGx5IHN5X3VzZWRfaW5fcmVsb2MgbmV2ZXIgZ2V0cyBzZXQgZm9yIHN1YiBzeW1ib2xzLiAgKi8KLSAgICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X3N1YnN5KTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBhZGp1c3QgYW55IHJlbG9jcyB0aGF0IHVzZSBMUiUgYW5kIFJSJSBmaWVsZCBzZWxlY3RvcnMuCi0gICAgIFRoYXQgY29uZnVzZXMgdGhlIEhQIGxpbmtlci4gICovCi0gIGlmIChocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xyc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jyc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX25scnNlbCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotCi0gIC8qIFJlamVjdCByZWR1Y3Rpb25zIG9mIHN5bWJvbHMgaW4gRExUIHJlbGF0aXZlIHJlbG9jcywKLSAgICAgcmVsb2NhdGlvbnMgd2l0aCBwbGFiZWxzLiAgKi8KLSAgaWYgKGhwcGFfZml4LT5meF9yX2ZpZWxkID09IGVfdHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9sdHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9ydHNlbAotICAgICAgfHwgaHBwYV9maXgtPmZ4X3JfZmllbGQgPT0gZV9wc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX3Jwc2VsCi0gICAgICB8fCBocHBhX2ZpeC0+Znhfcl9maWVsZCA9PSBlX2xwc2VsKQotICAgIHJldHVybiAwOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSAmJiBTX0lTX0VYVEVSTkFMIChmaXhwLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogUmVqZWN0IGFic29sdXRlIGNhbGxzIChqdW1wcykuICAqLwotICBpZiAoaHBwYV9maXgtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQUJTX0NBTEwpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogUmVqZWN0IHJlZHVjdGlvbnMgb2YgZnVuY3Rpb24gc3ltYm9scy4gICovCi0gIGlmIChmaXhwLT5meF9hZGRzeSA9PSAwIHx8ICEgU19JU19GVU5DVElPTiAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gbm9uemVybyBpZiB0aGUgZml4dXAgaW4gRklYUCB3aWxsIHJlcXVpcmUgYSByZWxvY2F0aW9uLAotICAgZXZlbiBpdCBpZiBhcHBlYXJzIHRoYXQgdGhlIGZpeHVwIGNvdWxkIGJlIGNvbXBsZXRlbHkgaGFuZGxlZAotICAgd2l0aGluIEdBUy4gICovCi0KLWludAotaHBwYV9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICBmaXhTICpmaXhwOwotewotICBzdHJ1Y3QgaHBwYV9maXhfc3RydWN0ICpocHBhX2ZpeHA7Ci0gIGludCBkaXN0YW5jZTsKLQotICBocHBhX2ZpeHAgPSAoc3RydWN0IGhwcGFfZml4X3N0cnVjdCAqKSBmaXhwLT50Y19maXhfZGF0YTsKLSNpZmRlZiBPQkpfU09NCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VOVFJZIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfRVhJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9CRUdJTl9CUlRBQgotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9FTkRfQlJUQUIKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBSX0hQUEFfQkVHSU5fVFJZCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gUl9IUFBBX0VORF9UUlkKLSAgICAgIHx8IChmaXhwLT5meF9hZGRzeSAhPSBOVUxMICYmIGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwKLQkgICYmIChocHBhX2ZpeHAtPnNlZ21lbnQtPmZsYWdzICYgU0VDX0NPREUpICE9IDApKQotICAgIHJldHVybiAxOwotI2VuZGlmCi0KLSNkZWZpbmUgYXJnX3JlbG9jX3N0dWJfbmVlZGVkKENBTExFUiwgQ0FMTEVFKSBcCi0gICgoQ0FMTEVFKSAmJiAoQ0FMTEVSKSAmJiAoKENBTExFRSkgIT0gKENBTExFUikpKQotCi0jaWZkZWYgT0JKX1NPTQotICAvKiBJdCBpcyBuZWNlc3NhcnkgdG8gZm9yY2UgUEMtcmVsYXRpdmUgY2FsbHMvanVtcHMgdG8gaGF2ZSBhIHJlbG9jYXRpb24KLSAgICAgZW50cnkgaWYgdGhleSdyZSBnb2luZyB0byBuZWVkIGVpdGhlciBhIGFyZ3VtZW50IHJlbG9jYXRpb24gb3IgbG9uZwotICAgICBjYWxsIHN0dWIuICBGSVhNRS4gIENhbid0IHdlIG5lZWQgdGhlIHNhbWUgZm9yIGFic29sdXRlIGNhbGxzPyAgKi8KLSAgaWYgKGZpeHAtPmZ4X3BjcmVsICYmIGZpeHAtPmZ4X2FkZHN5Ci0gICAgICAmJiAoYXJnX3JlbG9jX3N0dWJfbmVlZGVkICgobG9uZykgKChvYmpfc3ltYm9sX3R5cGUgKikKLQlzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpKS0+dGNfZGF0YS5hcC5ocHBhX2FyZ19yZWxvYywKLQlocHBhX2ZpeHAtPmZ4X2FyZ19yZWxvYykpKQotICAgIHJldHVybiAxOwotI2VuZGlmCi0gIGRpc3RhbmNlID0gKGZpeHAtPmZ4X29mZnNldCArIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICAtIG1kX3BjcmVsX2Zyb20gKGZpeHApKTsKLSAgLyogTm93IGNoZWNrIGFuZCBzZWUgaWYgd2UncmUgZ29pbmcgdG8gbmVlZCBhIGxvbmctYnJhbmNoIHN0dWIuICAqLwotICBpZiAoZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9QQ1JFTF9DQUxMCi0gICAgICAmJiAoZGlzdGFuY2UgPiAyNjIxNDMgfHwgZGlzdGFuY2UgPCAtMjYyMTQ0KSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZml4cC0+Znhfcl90eXBlID09IFJfSFBQQV9BQlNfQ0FMTCkKLSAgICByZXR1cm4gMTsKLSN1bmRlZiBhcmdfcmVsb2Nfc3R1Yl9uZWVkZWQKLQotICAvKiBObyBuZWVkICh5ZXQpIHRvIGZvcmNlIGFub3RoZXIgcmVsb2NhdGlvbnMgdG8gYmUgZW1pdHRlZC4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBOb3cgZm9yIHNvbWUgRUxGIHNwZWNpZmljIGNvZGUuICBGSVhNRS4gICovCi0jaWZkZWYgT0JKX0VMRgotLyogTWFyayB0aGUgZW5kIG9mIGEgZnVuY3Rpb24gc28gdGhhdCBpdCdzIHBvc3NpYmxlIHRvIGNvbXB1dGUKLSAgIHRoZSBzaXplIG9mIHRoZSBmdW5jdGlvbiBpbiBocHBhX2VsZl9maW5hbF9wcm9jZXNzaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFfZWxmX21hcmtfZW5kX29mX2Z1bmN0aW9uICgpCi17Ci0gIC8qIEVMRiBkb2VzIG5vdCBoYXZlIEVYSVQgcmVsb2NhdGlvbnMuICBBbGwgd2UgZG8gaXMgY3JlYXRlIGEKLSAgICAgdGVtcG9yYXJ5IHN5bWJvbCBtYXJraW5nIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgY2hhciAqbmFtZSA9IChjaGFyICopCi0gICAgeG1hbGxvYyAoc3RybGVuICgiTCRcMDAxZW5kXyIpICsKLQkgICAgIHN0cmxlbiAoU19HRVRfTkFNRSAobGFzdF9jYWxsX2luZm8tPnN0YXJ0X3N5bWJvbCkpICsgMSk7Ci0KLSAgaWYgKG5hbWUpCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAgICAgc3RyY3B5IChuYW1lLCAiTCRcMDAxZW5kXyIpOwotICAgICAgc3RyY2F0IChuYW1lLCBTX0dFVF9OQU1FIChsYXN0X2NhbGxfaW5mby0+c3RhcnRfc3ltYm9sKSk7Ci0KLSAgICAgIC8qIElmIHdlIGhhdmUgYSAuZXhpdCBmb2xsb3dlZCBieSBhIC5wcm9jZW5kLCB0aGVuIHRoZQotCSBzeW1ib2wgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBkZWZpbmVkLiAgKi8KLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0gICAgICBpZiAoc3ltYm9sUCkKLQl7Ci0JICAvKiBUaGUgc3ltYm9sIGhhcyBhbHJlYWR5IGJlZW4gZGVmaW5lZCEgIFRoaXMgY2FuCi0JICAgICBoYXBwZW4gaWYgd2UgaGF2ZSBhIC5leGl0IGZvbGxvd2VkIGJ5IGEgLnByb2NlbmQuCi0KLQkgICAgIFRoaXMgaXMgKm5vdCogYW4gZXJyb3IuICBBbGwgd2Ugd2FudCB0byBkbyBpcyBmcmVlCi0JICAgICB0aGUgbWVtb3J5IHdlIGp1c3QgYWxsb2NhdGVkIGZvciB0aGUgbmFtZSBhbmQgY29udGludWUuICAqLwotCSAgeGZyZWUgKG5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBzeW1ib2wgdmFsdWUgc2hvdWxkIGJlIHRoZSBvZmZzZXQgb2YgdGhlCi0JICAgICBsYXN0IGluc3RydWN0aW9uIG9mIHRoZSBmdW5jdGlvbiAqLwotCSAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIG5vd19zZWcsICh2YWx1ZVQpIChmcmFnX25vd19maXggKCkgLSA0KSwKLQkJCQlmcmFnX25vdyk7Ci0KLQkgIGFzc2VydCAoc3ltYm9sUCk7Ci0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotCX0KLQotICAgICAgaWYgKHN5bWJvbFApCi0JbGFzdF9jYWxsX2luZm8tPmVuZF9zeW1ib2wgPSBzeW1ib2xQOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiU3ltYm9sICclcycgY291bGQgbm90IGJlIGNyZWF0ZWQuIiksIG5hbWUpOwotCi0gICAgfQotICBlbHNlCi0gICAgYXNfYmFkIChfKCJObyBtZW1vcnkgZm9yIHN5bWJvbCBuYW1lLiIpKTsKLQotfQotCi0vKiBGb3IgRUxGLCB0aGlzIGZ1bmN0aW9uIHNlcnZlcyBvbmUgcHVycG9zZTogIHRvIHNldHVwIHRoZSBzdF9zaXplCi0gICBmaWVsZCBvZiBTVFRfRlVOQyBzeW1ib2xzLiAgVG8gZG8gdGhpcywgd2UgbmVlZCB0byBzY2FuIHRoZQotICAgY2FsbF9pbmZvIHN0cnVjdHVyZSBsaXN0LCBkZXRlcm1pbmluZyBzdF9zaXplIGluIGJ5IHRha2luZyB0aGUKLSAgIGRpZmZlcmVuY2UgaW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGJlZ2lubmluZy9lbmQgbWFya2VyIHN5bWJvbHMuICAqLwotCi12b2lkCi1lbGZfaHBwYV9maW5hbF9wcm9jZXNzaW5nICgpCi17Ci0gIHN0cnVjdCBjYWxsX2luZm8gKmNhbGxfaW5mb19wb2ludGVyOwotCi0gIGZvciAoY2FsbF9pbmZvX3BvaW50ZXIgPSBjYWxsX2luZm9fcm9vdDsKLSAgICAgICBjYWxsX2luZm9fcG9pbnRlcjsKLSAgICAgICBjYWxsX2luZm9fcG9pbnRlciA9IGNhbGxfaW5mb19wb2ludGVyLT5jaV9uZXh0KQotICAgIHsKLSAgICAgIGVsZl9zeW1ib2xfdHlwZSAqZXN5bQotCT0gKChlbGZfc3ltYm9sX3R5cGUgKikKLQkgICBzeW1ib2xfZ2V0X2JmZHN5bSAoY2FsbF9pbmZvX3BvaW50ZXItPnN0YXJ0X3N5bWJvbCkpOwotICAgICAgZXN5bS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplID0KLQlTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPmVuZF9zeW1ib2wpCi0JLSBTX0dFVF9WQUxVRSAoY2FsbF9pbmZvX3BvaW50ZXItPnN0YXJ0X3N5bWJvbCkgKyA0OwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1ocHBhLmggYi9nYXMvY29uZmlnL3RjLWhwcGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5ZGFlZC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWhwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKiB0Yy1ocHBhLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRoZSBQQQotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBIUCBQQS1SSVNDIHN1cHBvcnQgd2FzIGNvbnRyaWJ1dGVkIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UKLSAgIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWguICAqLwotCi0vKiBQbGVhc2UgcmVmcmFpbiBmcm9tIGV4cG9zaW5nIHRoZSB3b3JsZCB0byB0aGUgaW50ZXJuYWxzIG9mIHRjLWhwcGEuYwotICAgd2hlbiB0aGlzIGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIG1lYW5zIG9ubHkgZGVjbGFyaW5nIGV4cG9ydGVkIGZ1bmN0aW9ucywKLSAgIChwbGVhc2UgUEFSQU1pemUgdGhlbSEpIG5vdCBleHBvcnRpbmcgc3RydWN0dXJlcyBhbmQgZGF0YSBpdGVtcyB3aGljaAotICAgYXJlIHVzZWQgc29sZWx5IHdpdGhpbiB0Yy1ocHBhLmMsIGV0Yy4KLQotICAgQWxzbyByZWZyYWluIGZyb20gYWRkaW5nIGFueSBtb3JlIG9iamVjdCBmaWxlIGRlcGVuZGVudCBjb2RlLCB0aGVyZSBpcyAKLSAgIGFscmVhZHkgZmFyIHRvbyBtdWNoIG9iamVjdCBmaWxlIGZvcm1hdCBkZXBlbmRlbnQgY29kZSBpbiB0aGlzIGZpbGUuCi0gICBJbiB0aGVvcnkgdGhpcyBmaWxlIHNob3VsZCBjb250YWluIG9ubHkgZXhwb3J0ZWQgZnVuY3Rpb25zLCBzdHJ1Y3R1cmVzCi0gICBhbmQgZGF0YSBkZWNsYXJhdGlvbnMgY29tbW9uIHRvIGFsbCBQQSBhc3NlbWJsZXJzLiAgKi8KLQotI2lmbmRlZiBfVENfSFBQQV9ICi0jZGVmaW5lIF9UQ19IUFBBX0gKLQotI2lmbmRlZiBUQ19IUFBBCi0jZGVmaW5lIFRDX0hQUEEJMQotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX2hwcGEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIEZJWE1FLiAgVGhlIGxhY2sgb2YgYSBwbGFjZSB0byBwdXQgdGhpbmdzIHdoaWNoIGFyZSBib3RoIHRhcmdldCBjcHUKLSAgIGFuZCB0YXJnZXQgZm9ybWF0IGRlcGVuZGVudCBtYWtlcyBoYWNrcyBsaWtlIHRoaXMgbmVjZXNzYXJ5LiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0jaWZkZWYgQkZENjQKLSNpbmNsdWRlICJiZmQvZWxmNjQtaHBwYS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGY2NC1ocHBhIgotI2Vsc2UKLSNpbmNsdWRlICJiZmQvZWxmMzItaHBwYS5oIgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1ocHBhIgotI2VuZGlmCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9TT00KLSNpbmNsdWRlICJiZmQvc29tLmgiCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgInNvbSIKLSNlbmRpZgotCi0vKiBGSVhNRS4gIFdoeSBvaCB3aHkgYXJlbid0IHRoZXNlIGRlZmluZWQgc29tZXdoZXJlIGdsb2JhbGx5PyAgKi8KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgICAoMCkKLSNkZWZpbmUgVFJVRSAgICAoIUZBTFNFKQotI2VuZGlmCi0KLSNkZWZpbmUgQVNFQ19OVUxMIChhc2VjdGlvbiAqKTAKLQotLyogTGFiZWxzIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhIGNvbG9uIGZvciBhIHN1ZmZpeC4gICovCi0jZGVmaW5lIExBQkVMU19XSVRIT1VUX0NPTE9OUwotCi0vKiBGSVhNRS4gIFRoaXMgc2hvdWxkIGJlIHN0YXRpYyBhbmQgZGVjbGFyZWQgaW4gdGMtaHBwYS5jLCBidXQgCi0gICBwYV9kZWZpbmVfbGFiZWwgZ2V0cyB1c2VkIG91dHNpZGUgb2YgdGMtaHBwYS5jIHZpYSB0Y19mcm9iX2xhYmVsLgotICAgU2hvdWxkIGFsc28gYmUgUEFSQU1pemVkLCBidXQgc3ltYm9sUyBpc24ndCBhdmFpbGFibGUgaGVyZS4gICovCi1leHRlcm4gdm9pZCBwYV9kZWZpbmVfbGFiZWwgKCk7Ci0KLS8qIEZJWE1FLiAgVHlwZXMgbm90IGF2YWlsYWJsZSBoZXJlLCBzbyB0aGV5IGNhbid0IGJlIFBBUkFNaXplZC4gICovCi1leHRlcm4gdm9pZCBwYXJzZV9jb25zX2V4cHJlc3Npb25faHBwYSAoKTsKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19ocHBhICgpOwotZXh0ZXJuIGludCBocHBhX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLS8qIFRoaXMgZ2V0cyBjYWxsZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlIHRvIG1ha2Ugc3VyZQotICAgdGhpbmdzIGxpa2UgZW50cnkvZXhpdCBhbmQgcHJvYy9wcm9jZW5kIHBhaXJzIG1hdGNoLiAgKi8KLWV4dGVybiB2b2lkIHBhX2NoZWNrX2VvZiBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIHRjX2Zyb2JfZmlsZSBwYV9jaGVja19lb2YKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgcGFfZGVmaW5lX2xhYmVsIChzeW0pCi0KLS8qIFRoZSBQQSBkb2VzIG5vdCBuZWVkIHN1cHBvcnQgZm9yIGVpdGhlciBvZiB0aGVzZS4gICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihoZWFkZXJzKSB7O30KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGhlYWRlcnMpIHs7fQotCi0jZGVmaW5lIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotI2RlZmluZSBNQVhfUkVMT0NfRVhQQU5TSU9OIDYKLQotLyogRklYTUUuICBNb3JlIHRoaW5ncyB3aGljaCBhcmUgYm90aCBIUFBBIGFuZCBFTEYgc3BlY2lmaWMuICBUaGVyZSBpcyAKLSAgIG5vd2hlcmUgdG8gcHV0IHN1Y2ggdGhpbmdzLiAgKi8KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIGVsZl90Y19maW5hbF9wcm9jZXNzaW5nCWVsZl9ocHBhX2ZpbmFsX3Byb2Nlc3NpbmcKLXZvaWQgZWxmX2hwcGFfZmluYWxfcHJvY2Vzc2luZyBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotLyogVGhlIFBBIG5lZWRzIHRvIHBhcnNlIGZpZWxkIHNlbGVjdG9ycyBpbiAuYnl0ZSwgZXRjLiAgKi8KLQotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIFwKLSAgcGFyc2VfY29uc19leHByZXNzaW9uX2hwcGEgKEVYUCkKLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19ocHBhCi0KLS8qIE9uIHRoZSBQQSwgYW4gZXF1YWwgc2lnbiBvZnRlbiBhcHBlYXJzIGFzIGEgY29uZGl0aW9uIG9yIG51bGxpZmljYXRpb24KLSAgIGNvbXBsZXRlciBpbiBhbiBpbnN0cnVjdGlvbi4gIFRoaXMgY2FuIGJlIGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZQotICAgcHJldmlvdXMgY2hhcmFjdGVyLCBpZiB0aGUgY2hhcmFjdGVyIGlzIGEgY29tbWEsIHRoZW4gdGhlIGVxdWFsIGlzCi0gICBiZWluZyB1c2VkIGFzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBUQ19FUVVBTF9JTl9JTlNOKEMsIFBUUikJKChDKSA9PSAnLCcpCi0KLS8qIFNpbWlsYXJseSBmb3IgYW4gZXhjbGFtYXRpb24gcG9pbnQuICBJdCBpcyB1c2VkIGluIEZQIGNvbXBhcmlzb24KLSAgIGluc3RydWN0aW9ucyBhbmQgYXMgYW4gZW5kIG9mIGxpbmUgbWFya2VyLiAgV2hlbiB1c2VkIGluIGFuIGluc3RydWN0aW9uCi0gICBpdCB3aWxsIGFsd2F5cyBmb2xsb3cgYSBjb21tYS4gICovCi0jZGVmaW5lIFRDX0VPTF9JTl9JTlNOKFBUUikJKCooUFRSKSA9PSAnIScgJiYgKFBUUilbLTFdID09ICcsJykKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZSBocHBhX2ZpeF9hZGp1c3RhYmxlCi0KLS8qIEJlY2F1c2Ugb2YgdGhlIHN0cmFuZ2UgUEEgY2FsbGluZyBjb252ZW50aW9ucywgaXQgaXMgc29tZXRpbWVzCi0gICBuZWNlc3NhcnkgdG8gZW1pdCBhIHJlbG9jYXRpb24gZm9yIGEgY2FsbCBldmVuIHRob3VnaCBpdCB3b3VsZAotICAgbm9ybWFsbHkgYXBwZWFyIHNhZmUgdG8gaGFuZGxlIGl0IGNvbXBsZXRlbHkgd2l0aGluIEdBUy4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgaHBwYV9mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotCi0jaWZkZWYgT0JKX1NPTQotLyogSWYgYSBzeW1ib2wgaXMgaW1wb3J0ZWQsIGJ1dCBuZXZlciB1c2VkLCB0aGVuIHRoZSBzeW1ib2wgc2hvdWxkCi0gICAqbm90KiBlbmQgdXAgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIExpa2V3aXNlIGZvciBhYnNvbHV0ZSBzeW1ib2xzCi0gICB3aXRoIGxvY2FsIHNjb3BlLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpIFwKLSAgICBpZiAoKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF91bmRfc2VjdGlvbiAmJiAhIHN5bWJvbF91c2VkX3AgKHN5bSkpIFwKLQl8fCAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSAmYmZkX2Fic19zZWN0aW9uIFwKLQkgICAgJiYgISBTX0lTX0VYVEVSTkFMIChzeW0pKSkgXAotICAgICAgcHVudCA9IDEKLQotLyogV2UgbmVlZCB0byBiZSBhYmxlIHRvIG1ha2UgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHRoZSBkaWZmZXJlbmNlIG9mCi0gICB0d28gc3ltYm9scy4gIFRoaXMgaW5jbHVkZXMgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgd2hlbgotICAgb25lIG9mIHRoZW0gaXMgdW5kZWZpbmVkICh0aGlzIGNvbWVzIHVwIGluIFBJQyBjb2RlIGdlbmVyYXRpb24pLiAKLQotICAgV2UgZG9uJ3QgZGVmaW5lIERJRkZfRVhQUl9PSyBiZWNhdXNlIGl0IGRvZXMgdGhlIHdyb25nIHRoaW5nIGlmCi0gICB0aGUgYWRkIHN5bWJvbCBpcyB1bmRlZmluZWQgYW5kIHRoZSBzdWIgc3ltYm9sIGlzIGEgc3ltYm9sIGluCi0gICB0aGUgc2FtZSBzZWN0aW9uIGFzIHRoZSByZWxvY2F0aW9uLiAgV2UgYWxzbyBuZWVkIHNvbWUgd2F5IHRvCi0gICBzcGVjaWFsaXplIHNvbWUgY29kZSBpbiBhZGp1c3RfcmVsb2Nfc3ltcy4gICovCi0jZGVmaW5lIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpIFwKLSAgeyBcCi0gICAgaWYgKChTX0dFVF9TRUdNRU5UIChzeW0pID09ICZiZmRfdW5kX3NlY3Rpb24gJiYgISBzeW1ib2xfdXNlZF9wIChzeW0pKSBcCi0JfHwgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gJmJmZF9hYnNfc2VjdGlvbiBcCi0JICAgICYmICEgU19JU19FWFRFUk5BTCAoc3ltKSkpIFwKLSAgICAgIHB1bnQgPSAxOyBcCi0gIH0KLSNlbmRpZgotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBUQ19GSVhfVFlQRSBQVFIKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGSVhQKSAoKEZJWFApLT50Y19maXhfZGF0YSA9IE5VTEwpCi0KLSNlbmRpZiAvKiBfVENfSFBQQV9IICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWkzODYuYyBiL2dhcy9jb25maWcvdGMtaTM4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2ZjNWZkLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTM4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQ5MSArMCwwIEBACi0vKiBpMzg2LmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEludGVsIDgwMzg2Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICBJbnRlbCA4MDM4NiBtYWNoaW5lIHNwZWNpZmljIGdhcy4KLSAgV3JpdHRlbiBieSBFbGlvdCBEcmVzc2VsaGF1cyAoZWxpb3RAbWdtLm1pdC5lZHUpLgotICBCdWdzICYgc3VnZ2VzdGlvbnMgYXJlIGNvbXBsZXRlbHkgd2VsY29tZS4gIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4KLSAgUGxlYXNlIGhlbHAgdXMgbWFrZSBpdCBiZXR0ZXIuCi0gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2kzODYuaCIKLQotI2lmbmRlZiBUQ19SRUxPQwotI2RlZmluZSBUQ19SRUxPQyhYLFkpIChZKQotI2VuZGlmCi0KLSNpZm5kZWYgUkVHSVNURVJfV0FSTklOR1MKLSNkZWZpbmUgUkVHSVNURVJfV0FSTklOR1MgMQotI2VuZGlmCi0KLSNpZm5kZWYgU0NBTEUxX1dIRU5fTk9fSU5ERVgKLS8qIFNwZWNpZnlpbmcgYSBzY2FsZSBmYWN0b3IgYmVzaWRlcyAxIHdoZW4gdGhlcmUgaXMgbm8gaW5kZXggaXMKLSAgIGZ1dGlsZS4gIGVnLiBgbW92ICglZWJ4LDIpLCVhbCcgZG9lcyBleGFjdGx5IHRoZSBzYW1lIGFzCi0gICBgbW92ICglZWJ4KSwlYWwnLiAgVG8gc2xhdmlzaGx5IGZvbGxvdyB3aGF0IHRoZSBwcm9ncmFtbWVyCi0gICBzcGVjaWZpZWQsIHNldCBTQ0FMRTFfV0hFTl9OT19JTkRFWCB0byAwLiAgKi8KLSNkZWZpbmUgU0NBTEUxX1dIRU5fTk9fSU5ERVggMQotI2VuZGlmCi0KLSNkZWZpbmUgdHJ1ZSAxCi0jZGVmaW5lIGZhbHNlIDAKLQotc3RhdGljIHVuc2lnbmVkIGludCBtb2RlX2Zyb21fZGlzcF9zaXplIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotc3RhdGljIGludCBmaXRzX2luX3NpZ25lZF9ieXRlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl91bnNpZ25lZF9ieXRlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl91bnNpZ25lZF93b3JkIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgZml0c19pbl9zaWduZWRfd29yZCBQQVJBTVMgKChsb25nKSk7Ci1zdGF0aWMgaW50IHNtYWxsZXN0X2ltbV90eXBlIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyBpbnQgYWRkX3ByZWZpeCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNldF8xNmJpdF9jb2RlX2ZsYWcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzZXRfaW50ZWxfc3ludGF4IFBBUkFNUyAoKGludCkpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYwotICBQQVJBTVMgKChpbnQsIGludCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0jZW5kaWYKLQotLyogJ21kX2Fzc2VtYmxlICgpJyBnYXRoZXJzIHRvZ2V0aGVyIGluZm9ybWF0aW9uIGFuZCBwdXRzIGl0IGludG8gYQotICAgaTM4Nl9pbnNuLiAqLwotCi1zdHJ1Y3QgX2kzODZfaW5zbgotICB7Ci0gICAgLyogVE0gaG9sZHMgdGhlIHRlbXBsYXRlIGZvciB0aGUgaW5zbiB3ZXJlIGN1cnJlbnRseSBhc3NlbWJsaW5nLiAqLwotICAgIHRlbXBsYXRlIHRtOwotCi0gICAgLyogU1VGRklYIGhvbGRzIHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggaWYgZ2l2ZW4uCi0gICAgICAgKGUuZy4gJ2wnIGZvciAnbW92bCcpICAqLwotICAgIGNoYXIgc3VmZml4OwotCi0gICAgLyogT3BlcmFuZHMgYXJlIGNvZGVkIHdpdGggT1BFUkFORFMsIFRZUEVTLCBESVNQUywgSU1NUywgYW5kIFJFR1MuICovCi0KLSAgICAvKiBPUEVSQU5EUyBnaXZlcyB0aGUgbnVtYmVyIG9mIGdpdmVuIG9wZXJhbmRzLiAqLwotICAgIHVuc2lnbmVkIGludCBvcGVyYW5kczsKLQotICAgIC8qIFJFR19PUEVSQU5EUywgRElTUF9PUEVSQU5EUywgTUVNX09QRVJBTkRTLCBJTU1fT1BFUkFORFMgZ2l2ZSB0aGUgbnVtYmVyCi0gICAgICAgb2YgZ2l2ZW4gcmVnaXN0ZXIsIGRpc3BsYWNlbWVudCwgbWVtb3J5IG9wZXJhbmRzIGFuZCBpbW1lZGlhdGUKLSAgICAgICBvcGVyYW5kcy4gKi8KLSAgICB1bnNpZ25lZCBpbnQgcmVnX29wZXJhbmRzLCBkaXNwX29wZXJhbmRzLCBtZW1fb3BlcmFuZHMsIGltbV9vcGVyYW5kczsKLQotICAgIC8qIFRZUEVTIFtpXSBpcyB0aGUgdHlwZSAoc2VlIGFib3ZlICNkZWZpbmVzKSB3aGljaCB0ZWxscyB1cyBob3cgdG8KLSAgICAgICBzZWFyY2ggdGhyb3VnaCBESVNQUyBbaV0gJiBJTU1TIFtpXSAmIFJFR1MgW2ldIGZvciB0aGUgcmVxdWlyZWQKLSAgICAgICBvcGVyYW5kLiAgKi8KLSAgICB1bnNpZ25lZCBpbnQgdHlwZXNbTUFYX09QRVJBTkRTXTsKLQotICAgIC8qIERpc3BsYWNlbWVudHMgKGlmIGdpdmVuKSBmb3IgZWFjaCBvcGVyYW5kLiAqLwotICAgIGV4cHJlc3Npb25TICpkaXNwc1tNQVhfT1BFUkFORFNdOwotCi0gICAgLyogUmVsb2NhdGlvbiB0eXBlIGZvciBvcGVyYW5kICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgIGVudW0gYmZkX3JlbG9jX2NvZGVfcmVhbCBkaXNwX3JlbG9jW01BWF9PUEVSQU5EU107Ci0jZWxzZQotICAgIGludCBkaXNwX3JlbG9jW01BWF9PUEVSQU5EU107Ci0jZW5kaWYKLQotICAgIC8qIEltbWVkaWF0ZSBvcGVyYW5kcyAoaWYgZ2l2ZW4pIGZvciBlYWNoIG9wZXJhbmQuICovCi0gICAgZXhwcmVzc2lvblMgKmltbXNbTUFYX09QRVJBTkRTXTsKLQotICAgIC8qIFJlZ2lzdGVyIG9wZXJhbmRzIChpZiBnaXZlbikgZm9yIGVhY2ggb3BlcmFuZC4gKi8KLSAgICBjb25zdCByZWdfZW50cnkgKnJlZ3NbTUFYX09QRVJBTkRTXTsKLQotICAgIC8qIEJBU0VfUkVHLCBJTkRFWF9SRUcsIGFuZCBMT0cyX1NDQUxFX0ZBQ1RPUiBhcmUgdXNlZCB0byBlbmNvZGUKLSAgICAgICB0aGUgYmFzZSBpbmRleCBieXRlIGJlbG93LiAgKi8KLSAgICBjb25zdCByZWdfZW50cnkgKmJhc2VfcmVnOwotICAgIGNvbnN0IHJlZ19lbnRyeSAqaW5kZXhfcmVnOwotICAgIHVuc2lnbmVkIGludCBsb2cyX3NjYWxlX2ZhY3RvcjsKLQotICAgIC8qIFNFRyBnaXZlcyB0aGUgc2VnX2VudHJpZXMgb2YgdGhpcyBpbnNuLiAgVGhleSBhcmUgemVybyB1bmxlc3MKLSAgICAgICBleHBsaWNpdCBzZWdtZW50IG92ZXJyaWRlcyBhcmUgZ2l2ZW4uICovCi0gICAgY29uc3Qgc2VnX2VudHJ5ICpzZWdbMl07CS8qIHNlZ21lbnRzIGZvciBtZW1vcnkgb3BlcmFuZHMgKGlmIGdpdmVuKSAqLwotCi0gICAgLyogUFJFRklYIGhvbGRzIGFsbCB0aGUgZ2l2ZW4gcHJlZml4IG9wY29kZXMgKHVzdWFsbHkgbnVsbCkuCi0gICAgICAgUFJFRklYRVMgaXMgdGhlIG51bWJlciBvZiBwcmVmaXggb3Bjb2Rlcy4gICovCi0gICAgdW5zaWduZWQgaW50IHByZWZpeGVzOwotICAgIHVuc2lnbmVkIGNoYXIgcHJlZml4W01BWF9QUkVGSVhFU107Ci0KLSAgICAvKiBSTSBhbmQgU0lCIGFyZSB0aGUgbW9kcm0gYnl0ZSBhbmQgdGhlIHNpYiBieXRlIHdoZXJlIHRoZQotICAgICAgIGFkZHJlc3NpbmcgbW9kZXMgb2YgdGhpcyBpbnNuIGFyZSBlbmNvZGVkLiAgKi8KLQotICAgIG1vZHJtX2J5dGUgcm07Ci0gICAgc2liX2J5dGUgc2liOwotICB9OwotCi10eXBlZGVmIHN0cnVjdCBfaTM4Nl9pbnNuIGkzODZfaW5zbjsKLQotLyogTGlzdCBvZiBjaGFycyBiZXNpZGVzIHRob3NlIGluIGFwcC5jOnN5bWJvbF9jaGFycyB0aGF0IGNhbiBzdGFydCBhbgotICAgb3BlcmFuZC4gIFVzZWQgdG8gcHJldmVudCB0aGUgc2NydWJiZXIgZWF0aW5nIHZpdGFsIHdoaXRlLXNwYWNlLiAgKi8KLSNpZmRlZiBMRVhfQVQKLWNvbnN0IGNoYXIgZXh0cmFfc3ltYm9sX2NoYXJzW10gPSAiKiUtKEAiOwotI2Vsc2UKLWNvbnN0IGNoYXIgZXh0cmFfc3ltYm9sX2NoYXJzW10gPSAiKiUtKCI7Ci0jZW5kaWYKLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLSNpZiBkZWZpbmVkIChURV9JMzg2QUlYKSB8fCAoKGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpKSAmJiAhIGRlZmluZWQgKFRFX0xJTlVYKSkKLS8qIFB1dHRpbmcgJy8nIGhlcmUgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byB1c2UgdGhlIGRpdmlkZSBvcGVyYXRvci4KLSAgIEhvd2V2ZXIsIHdlIG5lZWQgaXQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTVlI0IHN5c3RlbXMuICAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIy8iOwotI2RlZmluZSBQUkVGSVhfU0VQQVJBVE9SICdcXCcKLSNlbHNlCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLSNkZWZpbmUgUFJFRklYX1NFUEFSQVRPUiAnLycKLSNlbmRpZgotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0ICovCi0vKiBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LiAqLwotLyogQWxzbyBub3RlIHRoYXQgY29tbWVudHMgc3RhcnRlZCBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsgaWYKLSAgICcvJyBpc24ndCBvdGhlcndpc2UgZGVmaW5lZC4gICovCi0jaWYgZGVmaW5lZCAoVEVfSTM4NkFJWCkgfHwgKChkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKSkgJiYgISBkZWZpbmVkIChURV9MSU5VWCkpCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiI7Ci0jZWxzZQotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIvIjsKLSNlbmRpZgotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZGZER4WCI7Ci0KLS8qIHRhYmxlcyBmb3IgbGV4aWNhbCBhbmFseXNpcyAqLwotc3RhdGljIGNoYXIgbW5lbW9uaWNfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIHJlZ2lzdGVyX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBvcGVyYW5kX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBpZGVudGlmaWVyX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBkaWdpdF9jaGFyc1syNTZdOwotCi0vKiBsZXhpY2FsIG1hY3JvcyAqLwotI2RlZmluZSBpc19tbmVtb25pY19jaGFyKHgpIChtbmVtb25pY19jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX29wZXJhbmRfY2hhcih4KSAob3BlcmFuZF9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX3JlZ2lzdGVyX2NoYXIoeCkgKHJlZ2lzdGVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfc3BhY2VfY2hhcih4KSAoKHgpID09ICcgJykKLSNkZWZpbmUgaXNfaWRlbnRpZmllcl9jaGFyKHgpIChpZGVudGlmaWVyX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfZGlnaXRfY2hhcih4KSAoZGlnaXRfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotCi0vKiBwdXQgaGVyZSBhbGwgbm9uLWRpZ2l0IG5vbi1sZXR0ZXIgY2hhcmN0ZXJzIHRoYXQgbWF5IG9jY3VyIGluIGFuIG9wZXJhbmQgKi8KLXN0YXRpYyBjaGFyIG9wZXJhbmRfc3BlY2lhbF9jaGFyc1tdID0gIiUkLSsoLCkqLl9+Lzw+fCZeITpbQF0iOwotCi0vKiBtZF9hc3NlbWJsZSgpIGFsd2F5cyBsZWF2ZXMgdGhlIHN0cmluZ3MgaXQncyBwYXNzZWQgdW5hbHRlcmVkLiAgVG8KLSAgIGVmZmVjdCB0aGlzIHdlIG1haW50YWluIGEgc3RhY2sgb2Ygc2F2ZWQgY2hhcmFjdGVycyB0aGF0IHdlJ3ZlIHNtYXNoZWQKLSAgIHdpdGggJ1wwJ3MgKGluZGljYXRpbmcgZW5kIG9mIHN0cmluZ3MgZm9yIHZhcmlvdXMgc3ViLWZpZWxkcyBvZiB0aGUKLSAgIGFzc2VtYmxlciBpbnN0cnVjdGlvbikuICovCi1zdGF0aWMgY2hhciBzYXZlX3N0YWNrWzMyXTsKLXN0YXRpYyBjaGFyICpzYXZlX3N0YWNrX3A7CS8qIHN0YWNrIHBvaW50ZXIgKi8KLSNkZWZpbmUgRU5EX1NUUklOR19BTkRfU0FWRShzKSBcCi0JZG8geyAqc2F2ZV9zdGFja19wKysgPSAqKHMpOyAqKHMpID0gJ1wwJzsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgUkVTVE9SRV9FTkRfU1RSSU5HKHMpIFwKLQlkbyB7ICoocykgPSAqLS1zYXZlX3N0YWNrX3A7IH0gd2hpbGUgKDApCi0KLS8qIFRoZSBpbnN0cnVjdGlvbiB3ZSdyZSBhc3NlbWJsaW5nLiAqLwotc3RhdGljIGkzODZfaW5zbiBpOwotCi0vKiBQb3NzaWJsZSB0ZW1wbGF0ZXMgZm9yIGN1cnJlbnQgaW5zbi4gICovCi1zdGF0aWMgY29uc3QgdGVtcGxhdGVzICpjdXJyZW50X3RlbXBsYXRlczsKLQotLyogUGVyIGluc3RydWN0aW9uIGV4cHJlc3Npb25TIGJ1ZmZlcnM6IDIgZGlzcGxhY2VtZW50cyAmIDIgaW1tZWRpYXRlIG1heC4gKi8KLXN0YXRpYyBleHByZXNzaW9uUyBkaXNwX2V4cHJlc3Npb25zWzJdLCBpbV9leHByZXNzaW9uc1syXTsKLQotc3RhdGljIGludCB0aGlzX29wZXJhbmQ7CS8qIGN1cnJlbnQgb3BlcmFuZCB3ZSBhcmUgd29ya2luZyBvbiAqLwotCi1zdGF0aWMgaW50IGZsYWdfZG9fbG9uZ19qdW1wOwkvKiBGSVhNRSB3aGF0IGRvZXMgdGhpcyBkbz8gKi8KLQotc3RhdGljIGludCBmbGFnXzE2Yml0X2NvZGU7CS8qIDEgaWYgd2UncmUgd3JpdGluZyAxNi1iaXQgY29kZSwgMCBpZiAzMi1iaXQgKi8KLQotc3RhdGljIGludCBpbnRlbF9zeW50YXggPSAwOwkvKiAxIGZvciBpbnRlbCBzeW50YXgsIDAgaWYgYXR0IHN5bnRheCAqLwotCi1zdGF0aWMgaW50IGFsbG93X25ha2VkX3JlZyA9IDA7ICAvKiAxIGlmIHJlZ2lzdGVyIHByZWZpeCAlIG5vdCByZXF1aXJlZCAqLwotCi0vKiBJbnRlcmZhY2UgdG8gcmVsYXhfc2VnbWVudC4KLSAgIFRoZXJlIGFyZSAyIHJlbGF4IHN0YXRlcyBmb3IgMzg2IGp1bXAgaW5zbnM6IG9uZSBmb3IgY29uZGl0aW9uYWwgJgotICAgb25lIGZvciB1bmNvbmRpdGlvbmFsIGp1bXBzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSB0aGVzZSB0d28gdHlwZXMKLSAgIG9mIGp1bXBzIGFkZCBkaWZmZXJlbnQgc2l6ZXMgdG8gZnJhZ3Mgd2hlbiB3ZSdyZSBmaWd1cmluZyBvdXQgd2hhdAotICAgc29ydCBvZiBqdW1wIHRvIGNob29zZSB0byByZWFjaCBhIGdpdmVuIGxhYmVsLiAgKi8KLQotLyogdHlwZXMgKi8KLSNkZWZpbmUgQ09ORF9KVU1QIDEJCS8qIGNvbmRpdGlvbmFsIGp1bXAgKi8KLSNkZWZpbmUgVU5DT05EX0pVTVAgMgkJLyogdW5jb25kaXRpb25hbCBqdW1wICovCi0vKiBzaXplcyAqLwotI2RlZmluZSBDT0RFMTYJMQotI2RlZmluZSBTTUFMTAkwCi0jZGVmaW5lIFNNQUxMMTYgKFNNQUxMfENPREUxNikKLSNkZWZpbmUgQklHCTIKLSNkZWZpbmUgQklHMTYJKEJJR3xDT0RFMTYpCi0KLSNpZm5kZWYgSU5MSU5FCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbHNlCi0jZGVmaW5lIElOTElORQotI2VuZGlmCi0jZW5kaWYKLQotI2RlZmluZSBFTkNPREVfUkVMQVhfU1RBVEUodHlwZSxzaXplKSBcCi0gICgocmVsYXhfc3Vic3RhdGVUKSgodHlwZTw8MikgfCAoc2l6ZSkpKQotI2RlZmluZSBTSVpFX0ZST01fUkVMQVhfU1RBVEUocykgXAotICAgICggKCgocykgJiAweDMpID09IEJJRyA/IDQgOiAoKChzKSAmIDB4MykgPT0gQklHMTYgPyAyIDogMSkpICkKLQotLyogVGhpcyB0YWJsZSBpcyB1c2VkIGJ5IHJlbGF4X2ZyYWcgdG8gcHJvbW90ZSBzaG9ydCBqdW1wcyB0byBsb25nCi0gICBvbmVzIHdoZXJlIG5lY2Vzc2FyeS4gIFNNQUxMIChzaG9ydCkganVtcHMgbWF5IGJlIHByb21vdGVkIHRvIEJJRwotICAgKDMyIGJpdCBsb25nKSBvbmVzLCBhbmQgU01BTEwxNiBqdW1wcyB0byBCSUcxNiAoMTYgYml0IGxvbmcpLiAgV2UKLSAgIGRvbid0IGFsbG93IGEgc2hvcnQganVtcCBpbiBhIDMyIGJpdCBjb2RlIHNlZ21lbnQgdG8gYmUgcHJvbW90ZWQgdG8KLSAgIGEgMTYgYml0IG9mZnNldCBqdW1wIGJlY2F1c2UgaXQncyBzbG93ZXIgKHJlcXVpcmVzIGRhdGEgc2l6ZQotICAgcHJlZml4KSwgYW5kIGRvZXNuJ3Qgd29yaywgdW5sZXNzIHRoZSBkZXN0aW5hdGlvbiBpcyBpbiB0aGUgYm90dG9tCi0gICA2NGsgb2YgdGhlIGNvZGUgc2VnbWVudCAoVGhlIHRvcCAxNiBiaXRzIG9mIGVpcCBhcmUgemVyb2VkKS4gICovCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotLyogVGhlIGZpZWxkcyBhcmU6Ci0gICAxKSBtb3N0IHBvc2l0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAyKSBtb3N0IG5lZ2F0aXZlIHJlYWNoIG9mIHRoaXMgc3RhdGUsCi0gICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgNCkgd2hpY2ggaW5kZXggaW50byB0aGUgdGFibGUgdG8gdHJ5IGlmIHdlIGNhbid0IGZpdCBpbnRvIHRoaXMgb25lLgotICAgKi8KLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsxMjcgKyAxLCAtMTI4ICsgMSwgMCwgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIEJJRyl9LAotICB7MTI3ICsgMSwgLTEyOCArIDEsIDAsIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBCSUcxNil9LAotICAvKiBkd29yZCBjb25kaXRpb25hbHMgYWRkcyA0IGJ5dGVzIHRvIGZyYWc6Ci0gICAgIDEgZXh0cmEgb3Bjb2RlIGJ5dGUsIDMgZXh0cmEgZGlzcGxhY2VtZW50IGJ5dGVzLiAgKi8KLSAgezAsIDAsIDQsIDB9LAotICAvKiB3b3JkIGNvbmRpdGlvbmFscyBhZGQgMiBieXRlcyB0byBmcmFnOgotICAgICAxIGV4dHJhIG9wY29kZSBieXRlLCAxIGV4dHJhIGRpc3BsYWNlbWVudCBieXRlLiAgKi8KLSAgezAsIDAsIDIsIDB9LAotCi0gIHsxMjcgKyAxLCAtMTI4ICsgMSwgMCwgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgQklHKX0sCi0gIHsxMjcgKyAxLCAtMTI4ICsgMSwgMCwgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgQklHMTYpfSwKLSAgLyogZHdvcmQgam1wIGFkZHMgMyBieXRlcyB0byBmcmFnOgotICAgICAwIGV4dHJhIG9wY29kZSBieXRlcywgMyBleHRyYSBkaXNwbGFjZW1lbnQgYnl0ZXMuICAqLwotICB7MCwgMCwgMywgMH0sCi0gIC8qIHdvcmQgam1wIGFkZHMgMSBieXRlIHRvIGZyYWc6Ci0gICAgIDAgZXh0cmEgb3Bjb2RlIGJ5dGVzLCAxIGV4dHJhIGRpc3BsYWNlbWVudCBieXRlLiAgKi8KLSAgezAsIDAsIDEsIDB9Ci0KLX07Ci0KLQotdm9pZAotaTM4Nl9hbGlnbl9jb2RlIChmcmFnUCwgY291bnQpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgaW50IGNvdW50OwotewotICAvKiBWYXJpb3VzIGVmZmljaWVudCBuby1vcCBwYXR0ZXJucyBmb3IgYWxpZ25pbmcgY29kZSBsYWJlbHMuICAqLwotICAvKiBOb3RlOiBEb24ndCB0cnkgdG8gYXNzZW1ibGUgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgY29tbWVudHMuICovCi0gIC8qICAgICAgIDBMIGFuZCAwdyBhcmUgbm90IGxlZ2FsICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xW10gPQotICAgIHsweDkwfTsJCQkJCS8qIG5vcAkJCSovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8yW10gPQotICAgIHsweDg5LDB4ZjZ9OwkJCQkvKiBtb3ZsICVlc2ksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfM1tdID0KLSAgICB7MHg4ZCwweDc2LDB4MDB9OwkJCQkvKiBsZWFsIDAoJWVzaSksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfNFtdID0KLSAgICB7MHg4ZCwweDc0LDB4MjYsMHgwMH07CQkJLyogbGVhbCAwKCVlc2ksMSksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfNVtdID0KLSAgICB7MHg5MCwJCQkJCS8qIG5vcAkJCSovCi0gICAgIDB4OGQsMHg3NCwweDI2LDB4MDB9OwkJCS8qIGxlYWwgMCglZXNpLDEpLCVlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzZbXSA9Ci0gICAgezB4OGQsMHhiNiwweDAwLDB4MDAsMHgwMCwweDAwfTsJCS8qIGxlYWwgMEwoJWVzaSksJWVzaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfN1tdID0KLSAgICB7MHg4ZCwweGI0LDB4MjYsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVzaSwxKSwlZXNpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl84W10gPQotICAgIHsweDkwLAkJCQkJLyogbm9wCQkJKi8KLSAgICAgMHg4ZCwweGI0LDB4MjYsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVzaSwxKSwlZXNpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl85W10gPQotICAgIHsweDg5LDB4ZjYsCQkJCQkvKiBtb3ZsICVlc2ksJWVzaQkqLwotICAgICAweDhkLDB4YmMsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwfTsJLyogbGVhbCAwTCglZWRpLDEpLCVlZGkgKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjMyXzEwW10gPQotICAgIHsweDhkLDB4NzYsMHgwMCwJCQkJLyogbGVhbCAwKCVlc2kpLCVlc2kJKi8KLSAgICAgMHg4ZCwweGJjLDB4MjcsMHgwMCwweDAwLDB4MDAsMHgwMH07CS8qIGxlYWwgMEwoJWVkaSwxKSwlZWRpICovCi0gIHN0YXRpYyBjb25zdCBjaGFyIGYzMl8xMVtdID0KLSAgICB7MHg4ZCwweDc0LDB4MjYsMHgwMCwJCQkvKiBsZWFsIDAoJWVzaSwxKSwlZXNpCSovCi0gICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTJbXSA9Ci0gICAgezB4OGQsMHhiNiwweDAwLDB4MDAsMHgwMCwweDAwLAkJLyogbGVhbCAwTCglZXNpKSwlZXNpCSovCi0gICAgIDB4OGQsMHhiZiwweDAwLDB4MDAsMHgwMCwweDAwfTsJCS8qIGxlYWwgMEwoJWVkaSksJWVkaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTNbXSA9Ci0gICAgezB4OGQsMHhiNiwweDAwLDB4MDAsMHgwMCwweDAwLAkJLyogbGVhbCAwTCglZXNpKSwlZXNpCSovCi0gICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTRbXSA9Ci0gICAgezB4OGQsMHhiNCwweDI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIGxlYWwgMEwoJWVzaSwxKSwlZXNpICovCi0gICAgIDB4OGQsMHhiYywweDI3LDB4MDAsMHgwMCwweDAwLDB4MDB9OwkvKiBsZWFsIDBMKCVlZGksMSksJWVkaSAqLwotICBzdGF0aWMgY29uc3QgY2hhciBmMzJfMTVbXSA9Ci0gICAgezB4ZWIsMHgwZCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsCS8qIGptcCAuKzE1OyBsb3RzYSBub3BzCSovCi0gICAgIDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MH07Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGYxNl80W10gPQotICAgIHsweDhkLDB4YjQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJXNpKSwlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzVbXSA9Ci0gICAgezB4OTAsCQkJCQkvKiBub3AJCQkqLwotICAgICAweDhkLDB4YjQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJXNpKSwlc2kJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzZbXSA9Ci0gICAgezB4ODksMHhmNiwJCQkJCS8qIG1vdiAlc2ksJXNpCQkqLwotICAgICAweDhkLDB4YmQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJWRpKSwlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzdbXSA9Ci0gICAgezB4OGQsMHg3NCwweDAwLAkJCQkvKiBsZWEgMCglc2kpLCVzaQkqLwotICAgICAweDhkLDB4YmQsMHgwMCwweDAwfTsJCQkvKiBsZWEgMHcoJWRpKSwlZGkJKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgZjE2XzhbXSA9Ci0gICAgezB4OGQsMHhiNCwweDAwLDB4MDAsCQkJLyogbGVhIDB3KCVzaSksJXNpCSovCi0gICAgIDB4OGQsMHhiZCwweDAwLDB4MDB9OwkJCS8qIGxlYSAwdyglZGkpLCVkaQkqLwotICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZjMyX3BhdHRbXSA9IHsKLSAgICBmMzJfMSwgZjMyXzIsIGYzMl8zLCBmMzJfNCwgZjMyXzUsIGYzMl82LCBmMzJfNywgZjMyXzgsCi0gICAgZjMyXzksIGYzMl8xMCwgZjMyXzExLCBmMzJfMTIsIGYzMl8xMywgZjMyXzE0LCBmMzJfMTUKLSAgfTsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGYxNl9wYXR0W10gPSB7Ci0gICAgZjMyXzEsIGYzMl8yLCBmMzJfMywgZjE2XzQsIGYxNl81LCBmMTZfNiwgZjE2XzcsIGYxNl84LAotICAgIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNSwgZjMyXzE1LCBmMzJfMTUsIGYzMl8xNQotICB9OwotCi0gIGlmIChjb3VudCA+IDAgJiYgY291bnQgPD0gMTUpCi0gICAgewotICAgICAgaWYgKGZsYWdfMTZiaXRfY29kZSkKLQl7Ci0JICBtZW1jcHkoZnJhZ1AtPmZyX2xpdGVyYWwgKyBmcmFnUC0+ZnJfZml4LAotCQkgZjE2X3BhdHRbY291bnQgLSAxXSwgY291bnQpOwotCSAgaWYgKGNvdW50ID4gOCkgLyogYWRqdXN0IGp1bXAgb2Zmc2V0ICovCi0JICAgIGZyYWdQLT5mcl9saXRlcmFsW2ZyYWdQLT5mcl9maXggKyAxXSA9IGNvdW50IC0gMjsKLQl9Ci0gICAgICBlbHNlCi0JbWVtY3B5KGZyYWdQLT5mcl9saXRlcmFsICsgZnJhZ1AtPmZyX2ZpeCwKLQkgICAgICAgZjMyX3BhdHRbY291bnQgLSAxXSwgY291bnQpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IGNvdW50OwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKm91dHB1dF9pbnZhbGlkIFBBUkFNUyAoKGludCBjKSk7Ci1zdGF0aWMgaW50IGkzODZfb3BlcmFuZCBQQVJBTVMgKChjaGFyICpvcGVyYW5kX3N0cmluZykpOwotc3RhdGljIGludCBpMzg2X2ludGVsX29wZXJhbmQgUEFSQU1TICgoY2hhciAqb3BlcmFuZF9zdHJpbmcsIGludCBnb3RfYV9mbG9hdCkpOwotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSAqcGFyc2VfcmVnaXN0ZXIgUEFSQU1TICgoY2hhciAqcmVnX3N0cmluZywKLQkJCQkJCWNoYXIgKiplbmRfb3ApKTsKLQotI2lmbmRlZiBJMzg2Q09GRgotc3RhdGljIHZvaWQgc19ic3MgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotc3ltYm9sUyAqR09UX3N5bWJvbDsJCS8qIFByZS1kZWZpbmVkICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iICovCi0KLXN0YXRpYyBJTkxJTkUgdW5zaWduZWQgaW50Ci1tb2RlX2Zyb21fZGlzcF9zaXplICh0KQotICAgICB1bnNpZ25lZCBpbnQgdDsKLXsKLSAgcmV0dXJuICh0ICYgRGlzcDgpID8gMSA6ICh0ICYgKERpc3AxNnxEaXNwMzIpKSA/IDIgOiAwOwotfQotCi1zdGF0aWMgSU5MSU5FIGludAotZml0c19pbl9zaWduZWRfYnl0ZSAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSAgcmV0dXJuIChudW0gPj0gLTEyOCkgJiYgKG51bSA8PSAxMjcpOwotfQkJCQkvKiBmaXRzX2luX3NpZ25lZF9ieXRlKCkgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWZpdHNfaW5fdW5zaWduZWRfYnl0ZSAobnVtKQotICAgICBsb25nIG51bTsKLXsKLSAgcmV0dXJuIChudW0gJiAweGZmKSA9PSBudW07Ci19CQkJCS8qIGZpdHNfaW5fdW5zaWduZWRfYnl0ZSgpICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1maXRzX2luX3Vuc2lnbmVkX3dvcmQgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0gIHJldHVybiAobnVtICYgMHhmZmZmKSA9PSBudW07Ci19CQkJCS8qIGZpdHNfaW5fdW5zaWduZWRfd29yZCgpICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1maXRzX2luX3NpZ25lZF93b3JkIChudW0pCi0gICAgIGxvbmcgbnVtOwotewotICByZXR1cm4gKC0zMjc2OCA8PSBudW0pICYmIChudW0gPD0gMzI3NjcpOwotfQkJCQkvKiBmaXRzX2luX3NpZ25lZF93b3JkKCkgKi8KLQotc3RhdGljIGludAotc21hbGxlc3RfaW1tX3R5cGUgKG51bSkKLSAgICAgbG9uZyBudW07Ci17Ci0jaWYgMAotICAvKiBUaGlzIGNvZGUgaXMgZGlzYWJsZWQgYmVjYXVzZSBhbGwgdGhlIEltbTEgZm9ybXMgaW4gdGhlIG9wY29kZSB0YWJsZQotICAgICBhcmUgc2xvd2VyIG9uIHRoZSBpNDg2LCBhbmQgdGhleSdyZSB0aGUgdmVyc2lvbnMgd2l0aCB0aGUgaW1wbGljaXRseQotICAgICBzcGVjaWZpZWQgc2luZ2xlLXBvc2l0aW9uIGRpc3BsYWNlbWVudCwgd2hpY2ggaGFzIGFub3RoZXIgc3ludGF4IGlmCi0gICAgIHlvdSByZWFsbHkgd2FudCB0byB1c2UgdGhhdCBmb3JtLiAgSWYgeW91IHJlYWxseSBwcmVmZXIgdG8gaGF2ZSB0aGUKLSAgICAgb25lLWJ5dGUtc2hvcnRlciBJbW0xIGZvcm0gZGVzcGl0ZSB0aGVzZSBwcm9ibGVtcywgcmUtZW5hYmxlIHRoaXMKLSAgICAgY29kZS4gICovCi0gIGlmIChudW0gPT0gMSkKLSAgICByZXR1cm4gSW1tMSB8IEltbTggfCBJbW04UyB8IEltbTE2IHwgSW1tMzI7Ci0jZW5kaWYKLSAgcmV0dXJuIChmaXRzX2luX3NpZ25lZF9ieXRlIChudW0pCi0JICA/IChJbW04UyB8IEltbTggfCBJbW0xNiB8IEltbTMyKQotCSAgOiBmaXRzX2luX3Vuc2lnbmVkX2J5dGUgKG51bSkKLQkgID8gKEltbTggfCBJbW0xNiB8IEltbTMyKQotCSAgOiAoZml0c19pbl9zaWduZWRfd29yZCAobnVtKSB8fCBmaXRzX2luX3Vuc2lnbmVkX3dvcmQgKG51bSkpCi0JICA/IChJbW0xNiB8IEltbTMyKQotCSAgOiAoSW1tMzIpKTsKLX0JCQkJLyogc21hbGxlc3RfaW1tX3R5cGUoKSAqLwotCi0vKiBSZXR1cm5zIDAgaWYgYXR0ZW1wdGluZyB0byBhZGQgYSBwcmVmaXggd2hlcmUgb25lIGZyb20gdGhlIHNhbWUKLSAgIGNsYXNzIGFscmVhZHkgZXhpc3RzLCAxIGlmIG5vbiByZXAvcmVwbmUgYWRkZWQsIDIgaWYgcmVwL3JlcG5lCi0gICBhZGRlZC4gICovCi1zdGF0aWMgaW50Ci1hZGRfcHJlZml4IChwcmVmaXgpCi0gICAgIHVuc2lnbmVkIGludCBwcmVmaXg7Ci17Ci0gIGludCByZXQgPSAxOwotICBpbnQgcTsKLQotICBzd2l0Y2ggKHByZWZpeCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotCi0gICAgY2FzZSBDU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgRFNfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIEVTX1BSRUZJWF9PUENPREU6Ci0gICAgY2FzZSBGU19QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgR1NfUFJFRklYX09QQ09ERToKLSAgICBjYXNlIFNTX1BSRUZJWF9PUENPREU6Ci0gICAgICBxID0gU0VHX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRVBORV9QUkVGSVhfT1BDT0RFOgotICAgIGNhc2UgUkVQRV9QUkVGSVhfT1BDT0RFOgotICAgICAgcmV0ID0gMjsKLSAgICAgIC8qIGZhbGwgdGhydSAqLwotICAgIGNhc2UgTE9DS19QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IExPQ0tSRVBfUFJFRklYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZXQUlUX09QQ09ERToKLSAgICAgIHEgPSBXQUlUX1BSRUZJWDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBRERSX1BSRUZJWF9PUENPREU6Ci0gICAgICBxID0gQUREUl9QUkVGSVg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgREFUQV9QUkVGSVhfT1BDT0RFOgotICAgICAgcSA9IERBVEFfUFJFRklYOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChpLnByZWZpeFtxXSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInNhbWUgdHlwZSBvZiBwcmVmaXggdXNlZCB0d2ljZSIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpLnByZWZpeGVzICs9IDE7Ci0gIGkucHJlZml4W3FdID0gcHJlZml4OwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZAotc2V0XzE2Yml0X2NvZGVfZmxhZyAobmV3XzE2Yml0X2NvZGVfZmxhZykKLQlpbnQgbmV3XzE2Yml0X2NvZGVfZmxhZzsKLXsKLSAgZmxhZ18xNmJpdF9jb2RlID0gbmV3XzE2Yml0X2NvZGVfZmxhZzsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9pbnRlbF9zeW50YXggKHN5bnRheF9mbGFnKQotCWludCBzeW50YXhfZmxhZzsKLXsKLSAgLyogRmluZCBvdXQgaWYgcmVnaXN0ZXIgcHJlZml4aW5nIGlzIHNwZWNpZmllZC4gICovCi0gIGludCBhc2tfbmFrZWRfcmVnID0gMDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBjaGFyICpzdHJpbmcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnQgZSA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgICBpZiAoc3RyY21wKHN0cmluZywgInByZWZpeCIpID09IDApCi0JYXNrX25ha2VkX3JlZyA9IDE7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoc3RyaW5nLCAibm9wcmVmaXgiKSA9PSAwKQotCWFza19uYWtlZF9yZWcgPSAtMTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIkJhZCBhcmd1bWVudCB0byBzeW50YXggZGlyZWN0aXZlLiIpKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBlOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgCi0gIGludGVsX3N5bnRheCA9IHN5bnRheF9mbGFnOwotCi0gIGlmIChhc2tfbmFrZWRfcmVnID09IDApCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGFsbG93X25ha2VkX3JlZyA9IChpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChzdGRvdXRwdXQpICE9ICdcMCcpKTsgCi0jZWxzZQotICAgICAgYWxsb3dfbmFrZWRfcmVnID0gMDsgLyogY29uc2VydmF0aXZlIGRlZmF1bHQgKi8KLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIGFsbG93X25ha2VkX3JlZyA9IChhc2tfbmFrZWRfcmVnIDwgMCk7Ci19Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0jaWZuZGVmIEkzODZDT0ZGCi0gIHsiYnNzIiwgc19ic3MsIDB9LAotI2VuZGlmCi0jaWYgIWRlZmluZWQoT0JKX0FPVVQpICYmICFkZWZpbmVkKFVTRV9BTElHTl9QVFdPKQotICB7ImFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0jZWxzZQotICB7ImFsaWduIiwgc19hbGlnbl9wdHdvLCAwfSwKLSNlbmRpZgotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZGZsb2F0IiwgZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJ0ZmxvYXQiLCBmbG9hdF9jb25zLCAneCd9LAotICB7InZhbHVlIiwgY29ucywgMn0sCi0gIHsibm9vcHQiLCBzX2lnbm9yZSwgMH0sCi0gIHsib3B0aW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsiY29kZTE2Iiwgc2V0XzE2Yml0X2NvZGVfZmxhZywgMX0sCi0gIHsiY29kZTMyIiwgc2V0XzE2Yml0X2NvZGVfZmxhZywgMH0sCi0gIHsiaW50ZWxfc3ludGF4Iiwgc2V0X2ludGVsX3N5bnRheCwgMX0sCi0gIHsiYXR0X3N5bnRheCIsIHNldF9pbnRlbF9zeW50YXgsIDB9LAotICB7MCwgMCwgMH0KLX07Ci0KLS8qIGZvciBpbnRlcmZhY2Ugd2l0aCBleHByZXNzaW9uICgpICovCi1leHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotCi0vKiBoYXNoIHRhYmxlIGZvciBpbnN0cnVjdGlvbiBtbmVtb25pYyBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotLyogaGFzaCB0YWJsZSBmb3IgcmVnaXN0ZXIgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcmVnX2hhc2g7Ci0MCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKmhhc2hfZXJyOwotCi0gIC8qIGluaXRpYWxpemUgb3BfaGFzaCBoYXNoIHRhYmxlICovCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICB7Ci0gICAgcmVnaXN0ZXIgY29uc3QgdGVtcGxhdGUgKm9wdGFiOwotICAgIHJlZ2lzdGVyIHRlbXBsYXRlcyAqY29yZV9vcHRhYjsKLQotICAgIG9wdGFiID0gaTM4Nl9vcHRhYjsJCS8qIHNldHVwIGZvciBsb29wICovCi0gICAgY29yZV9vcHRhYiA9ICh0ZW1wbGF0ZXMgKikgeG1hbGxvYyAoc2l6ZW9mICh0ZW1wbGF0ZXMpKTsKLSAgICBjb3JlX29wdGFiLT5zdGFydCA9IG9wdGFiOwotCi0gICAgd2hpbGUgKDEpCi0gICAgICB7Ci0JKytvcHRhYjsKLQlpZiAob3B0YWItPm5hbWUgPT0gTlVMTAotCSAgICB8fCBzdHJjbXAgKG9wdGFiLT5uYW1lLCAob3B0YWIgLSAxKS0+bmFtZSkgIT0gMCkKLQkgIHsKLQkgICAgLyogZGlmZmVyZW50IG5hbWUgLS0+IHNoaXAgb3V0IGN1cnJlbnQgdGVtcGxhdGUgbGlzdDsKLQkgICAgICAgYWRkIHRvIGhhc2ggdGFibGU7ICYgYmVnaW4gYW5ldyAqLwotCSAgICBjb3JlX29wdGFiLT5lbmQgPSBvcHRhYjsKLQkgICAgaGFzaF9lcnIgPSBoYXNoX2luc2VydCAob3BfaGFzaCwKLQkJCQkgICAgKG9wdGFiIC0gMSktPm5hbWUsCi0JCQkJICAgIChQVFIpIGNvcmVfb3B0YWIpOwotCSAgICBpZiAoaGFzaF9lcnIpCi0JICAgICAgewotCSAgICAgIGhhc2hfZXJyb3I6Ci0JCWFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogIENhbid0IGhhc2ggJXM6ICVzIiksCi0JCQkgIChvcHRhYiAtIDEpLT5uYW1lLAotCQkJICBoYXNoX2Vycik7Ci0JICAgICAgfQotCSAgICBpZiAob3B0YWItPm5hbWUgPT0gTlVMTCkKLQkgICAgICBicmVhazsKLQkgICAgY29yZV9vcHRhYiA9ICh0ZW1wbGF0ZXMgKikgeG1hbGxvYyAoc2l6ZW9mICh0ZW1wbGF0ZXMpKTsKLQkgICAgY29yZV9vcHRhYi0+c3RhcnQgPSBvcHRhYjsKLQkgIH0KLSAgICAgIH0KLSAgfQotCi0gIC8qIGluaXRpYWxpemUgcmVnX2hhc2ggaGFzaCB0YWJsZSAqLwotICByZWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgcmVnaXN0ZXIgY29uc3QgcmVnX2VudHJ5ICpyZWd0YWI7Ci0KLSAgICBmb3IgKHJlZ3RhYiA9IGkzODZfcmVndGFiOwotCSByZWd0YWIgPCBpMzg2X3JlZ3RhYiArIHNpemVvZiAoaTM4Nl9yZWd0YWIpIC8gc2l6ZW9mIChpMzg2X3JlZ3RhYlswXSk7Ci0JIHJlZ3RhYisrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKHJlZ19oYXNoLCByZWd0YWItPnJlZ19uYW1lLCAoUFRSKSByZWd0YWIpOwotCWlmIChoYXNoX2VycikKLQkgIGdvdG8gaGFzaF9lcnJvcjsKLSAgICAgIH0KLSAgfQotCi0gIC8qIGZpbGwgaW4gbGV4aWNhbCB0YWJsZXM6ICBtbmVtb25pY19jaGFycywgb3BlcmFuZF9jaGFycy4gICovCi0gIHsKLSAgICByZWdpc3RlciBpbnQgYzsKLSAgICByZWdpc3RlciBjaGFyICpwOwotCi0gICAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKQotICAgICAgewotCWlmIChpc2RpZ2l0IChjKSkKLQkgIHsKLQkgICAgZGlnaXRfY2hhcnNbY10gPSBjOwotCSAgICBtbmVtb25pY19jaGFyc1tjXSA9IGM7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gYzsKLQkgICAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0JZWxzZSBpZiAoaXNsb3dlciAoYykpCi0JICB7Ci0JICAgIG1uZW1vbmljX2NoYXJzW2NdID0gYzsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOwotCSAgICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQkgIH0KLQllbHNlIGlmIChpc3VwcGVyIChjKSkKLQkgIHsKLQkgICAgbW5lbW9uaWNfY2hhcnNbY10gPSB0b2xvd2VyIChjKTsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBtbmVtb25pY19jaGFyc1tjXTsKLQkgICAgb3BlcmFuZF9jaGFyc1tjXSA9IGM7Ci0JICB9Ci0KLQlpZiAoaXNhbHBoYSAoYykgfHwgaXNkaWdpdCAoYykpCi0JICBpZGVudGlmaWVyX2NoYXJzW2NdID0gYzsKLQllbHNlIGlmIChjID49IDEyOCkKLQkgIHsKLQkgICAgaWRlbnRpZmllcl9jaGFyc1tjXSA9IGM7Ci0JICAgIG9wZXJhbmRfY2hhcnNbY10gPSBjOwotCSAgfQotICAgICAgfQotCi0jaWZkZWYgTEVYX0FUCi0gICAgaWRlbnRpZmllcl9jaGFyc1snQCddID0gJ0AnOwotI2VuZGlmCi0gICAgcmVnaXN0ZXJfY2hhcnNbJyknXSA9ICcpJzsKLSAgICByZWdpc3Rlcl9jaGFyc1snKCddID0gJygnOwotICAgIGRpZ2l0X2NoYXJzWyctJ10gPSAnLSc7Ci0gICAgaWRlbnRpZmllcl9jaGFyc1snXyddID0gJ18nOwotICAgIGlkZW50aWZpZXJfY2hhcnNbJy4nXSA9ICcuJzsKLQotICAgIGZvciAocCA9IG9wZXJhbmRfc3BlY2lhbF9jaGFyczsgKnAgIT0gJ1wwJzsgcCsrKQotICAgICAgb3BlcmFuZF9jaGFyc1sodW5zaWduZWQgY2hhcikgKnBdID0gKnA7Ci0gIH0KLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgewotICAgICAgcmVjb3JkX2FsaWdubWVudCAodGV4dF9zZWN0aW9uLCAyKTsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKGRhdGFfc2VjdGlvbiwgMik7Ci0gICAgICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgMik7Ci0gICAgfQotI2VuZGlmCi19Ci0KLXZvaWQKLWkzODZfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAiaTM4NiBvcGNvZGUiLCBvcF9oYXNoKTsKLSAgaGFzaF9wcmludF9zdGF0aXN0aWNzIChmaWxlLCAiaTM4NiByZWdpc3RlciIsIHJlZ19oYXNoKTsKLX0KLQwKLQotI2lmZGVmIERFQlVHMzg2Ci0KLS8qIGRlYnVnZ2luZyByb3V0aW5lcyBmb3IgbWRfYXNzZW1ibGUgKi8KLXN0YXRpYyB2b2lkIHBpIFBBUkFNUyAoKGNoYXIgKiwgaTM4Nl9pbnNuICopKTsKLXN0YXRpYyB2b2lkIHB0ZSBQQVJBTVMgKCh0ZW1wbGF0ZSAqKSk7Ci1zdGF0aWMgdm9pZCBwdCBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyB2b2lkIHBlIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIHBzIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi1zdGF0aWMgdm9pZAotcGkgKGxpbmUsIHgpCi0gICAgIGNoYXIgKmxpbmU7Ci0gICAgIGkzODZfaW5zbiAqeDsKLXsKLSAgcmVnaXN0ZXIgdGVtcGxhdGUgKnA7Ci0gIGludCBpOwotCi0gIGZwcmludGYgKHN0ZG91dCwgIiVzOiB0ZW1wbGF0ZSAiLCBsaW5lKTsKLSAgcHRlICgmeC0+dG0pOwotICBmcHJpbnRmIChzdGRvdXQsICIgIG1vZHJtOiAgbW9kZSAleCAgcmVnICV4ICByZWcvbWVtICV4IiwKLQkgICB4LT5ybS5tb2RlLCB4LT5ybS5yZWcsIHgtPnJtLnJlZ21lbSk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIiBiYXNlICV4ICBpbmRleCAleCAgc2NhbGUgJXhcbiIsCi0JICAgeC0+YmkuYmFzZSwgeC0+YmkuaW5kZXgsIHgtPmJpLnNjYWxlKTsKLSAgZm9yIChpID0gMDsgaSA8IHgtPm9wZXJhbmRzOyBpKyspCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiICAgICMlZDogICIsIGkgKyAxKTsKLSAgICAgIHB0ICh4LT50eXBlc1tpXSk7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotICAgICAgaWYgKHgtPnR5cGVzW2ldCi0JICAmIChSZWcgfCBTUmVnMiB8IFNSZWczIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCB8IFJlZ01NWCB8IFJlZ1hNTSkpCi0JZnByaW50ZiAoc3Rkb3V0LCAiJXNcbiIsIHgtPnJlZ3NbaV0tPnJlZ19uYW1lKTsKLSAgICAgIGlmICh4LT50eXBlc1tpXSAmIEltbSkKLQlwZSAoeC0+aW1tc1tpXSk7Ci0gICAgICBpZiAoeC0+dHlwZXNbaV0gJiBEaXNwKQotCXBlICh4LT5kaXNwc1tpXSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHRlICh0KQotICAgICB0ZW1wbGF0ZSAqdDsKLXsKLSAgaW50IGk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIiAlZCBvcGVyYW5kcyAiLCB0LT5vcGVyYW5kcyk7Ci0gIGZwcmludGYgKHN0ZG91dCwgIm9wY29kZSAleCAiLAotCSAgIHQtPmJhc2Vfb3Bjb2RlKTsKLSAgaWYgKHQtPmV4dGVuc2lvbl9vcGNvZGUgIT0gTm9uZSkKLSAgICBmcHJpbnRmIChzdGRvdXQsICJleHQgJXggIiwgdC0+ZXh0ZW5zaW9uX29wY29kZSk7Ci0gIGlmICh0LT5vcGNvZGVfbW9kaWZpZXIgJiBEKQotICAgIGZwcmludGYgKHN0ZG91dCwgIkQiKTsKLSAgaWYgKHQtPm9wY29kZV9tb2RpZmllciAmIFcpCi0gICAgZnByaW50ZiAoc3Rkb3V0LCAiVyIpOwotICBmcHJpbnRmIChzdGRvdXQsICJcbiIpOwotICBmb3IgKGkgPSAwOyBpIDwgdC0+b3BlcmFuZHM7IGkrKykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgIyVkIHR5cGUgIiwgaSArIDEpOwotICAgICAgcHQgKHQtPm9wZXJhbmRfdHlwZXNbaV0pOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1wZSAoZSkKLSAgICAgZXhwcmVzc2lvblMgKmU7Ci17Ci0gIGZwcmludGYgKHN0ZG91dCwgIiAgICBvcGVyYXRpb24gICAgICAgJWRcbiIsIGUtPlhfb3ApOwotICBmcHJpbnRmIChzdGRvdXQsICIgICAgYWRkX251bWJlciAgICAlZCAoJXgpXG4iLAotCSAgIGUtPlhfYWRkX251bWJlciwgZS0+WF9hZGRfbnVtYmVyKTsKLSAgaWYgKGUtPlhfYWRkX3N5bWJvbCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgYWRkX3N5bWJvbCAgICAiKTsKLSAgICAgIHBzIChlLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoc3Rkb3V0LCAiXG4iKTsKLSAgICB9Ci0gIGlmIChlLT5YX29wX3N5bWJvbCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRvdXQsICIgICAgb3Bfc3ltYm9sICAgICIpOwotICAgICAgcHMgKGUtPlhfb3Bfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKHN0ZG91dCwgIlxuIik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHMgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGZwcmludGYgKHN0ZG91dCwgIiVzIHR5cGUgJXMlcyIsCi0JICAgU19HRVRfTkFNRSAocyksCi0JICAgU19JU19FWFRFUk5BTCAocykgPyAiRVhURVJOQUwgIiA6ICIiLAotCSAgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAocykpKTsKLX0KLQotc3RydWN0IHR5cGVfbmFtZQotICB7Ci0gICAgdW5zaWduZWQgaW50IG1hc2s7Ci0gICAgY2hhciAqdG5hbWU7Ci0gIH0KLQotdHlwZV9uYW1lc1tdID0KLXsKLSAgeyBSZWc4LCAicjgiIH0sCi0gIHsgUmVnMTYsICJyMTYiIH0sCi0gIHsgUmVnMzIsICJyMzIiIH0sCi0gIHsgSW1tOCwgImk4IiB9LAotICB7IEltbThTLCAiaThzIiB9LAotICB7IEltbTE2LCAiaTE2IiB9LAotICB7IEltbTMyLCAiaTMyIiB9LAotICB7IEltbTEsICJpMSIgfSwKLSAgeyBCYXNlSW5kZXgsICJCYXNlSW5kZXgiIH0sCi0gIHsgRGlzcDgsICJkOCIgfSwKLSAgeyBEaXNwMTYsICJkMTYiIH0sCi0gIHsgRGlzcDMyLCAiZDMyIiB9LAotICB7IEluT3V0UG9ydFJlZywgIkluT3V0UG9ydFJlZyIgfSwKLSAgeyBTaGlmdENvdW50LCAiU2hpZnRDb3VudCIgfSwKLSAgeyBDb250cm9sLCAiY29udHJvbCByZWciIH0sCi0gIHsgVGVzdCwgInRlc3QgcmVnIiB9LAotICB7IERlYnVnLCAiZGVidWcgcmVnIiB9LAotICB7IEZsb2F0UmVnLCAiRlJlZyIgfSwKLSAgeyBGbG9hdEFjYywgIkZBY2MiIH0sCi0gIHsgU1JlZzIsICJTUmVnMiIgfSwKLSAgeyBTUmVnMywgIlNSZWczIiB9LAotICB7IEFjYywgIkFjYyIgfSwKLSAgeyBKdW1wQWJzb2x1dGUsICJKdW1wIEFic29sdXRlIiB9LAotICB7IFJlZ01NWCwgInJNTVgiIH0sCi0gIHsgUmVnWE1NLCAiclhNTSIgfSwKLSAgeyBFc1NlZywgImVzIiB9LAotICB7IDAsICIiIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1wdCAodCkKLSAgICAgdW5zaWduZWQgaW50IHQ7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB0eXBlX25hbWUgKnR5OwotCi0gIGlmICh0ID09IFVua25vd24pCi0gICAgewotICAgICAgZnByaW50ZiAoc3Rkb3V0LCBfKCJVbmtub3duIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAodHkgPSB0eXBlX25hbWVzOyB0eS0+bWFzazsgdHkrKykKLQlpZiAodCAmIHR5LT5tYXNrKQotCSAgZnByaW50ZiAoc3Rkb3V0LCAiJXMsICIsIHR5LT50bmFtZSk7Ci0gICAgfQotICBmZmx1c2ggKHN0ZG91dCk7Ci19Ci0KLSNlbmRpZiAvKiBERUJVRzM4NiAqLwotDAotaW50Ci10Y19pMzg2X2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIHN0cnVjdCBmaXggKmZpeHA7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotI2Vsc2UKLSAgLyogRm9yIENPRkYgKi8KLSAgcmV0dXJuIGZpeHAtPmZ4X3JfdHlwZT09NzsKLSNlbmRpZgotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYwotICBQQVJBTVMgKChpbnQsIGludCwgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSk7Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLXJlbG9jIChzaXplLCBwY3JlbCwgb3RoZXIpCi0gICAgIGludCBzaXplOwotICAgICBpbnQgcGNyZWw7Ci0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBvdGhlcjsKLXsKLSAgaWYgKG90aGVyICE9IE5PX1JFTE9DKSByZXR1cm4gb3RoZXI7Ci0KLSAgaWYgKHBjcmVsKQotICAgIHsKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOiByZXR1cm4gQkZEX1JFTE9DXzhfUENSRUw7Ci0JY2FzZSAyOiByZXR1cm4gQkZEX1JFTE9DXzE2X1BDUkVMOwotCWNhc2UgNDogcmV0dXJuIEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQl9Ci0gICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIiksIHNpemUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOiByZXR1cm4gQkZEX1JFTE9DXzg7Ci0JY2FzZSAyOiByZXR1cm4gQkZEX1JFTE9DXzE2OwotCWNhc2UgNDogcmV0dXJuIEJGRF9SRUxPQ18zMjsKLQl9Ci0gICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIHNpemUpOwotICAgIH0KLQotICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Ci19Ci0KLS8qCi0gKiBIZXJlIHdlIGRlY2lkZSB3aGljaCBmaXh1cHMgY2FuIGJlIGFkanVzdGVkIHRvIG1ha2UgdGhlbSByZWxhdGl2ZSB0bwotICogdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiBpbnN0ZWFkIG9mIHRoZSBzeW1ib2wuICBCYXNpY2FsbHkgd2UgbmVlZAotICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXJlIGRvbmUgY29ycmVjdGx5LCBzbyBpbgotICogc29tZSBjYXNlcyB3ZSBmb3JjZSB0aGUgb3JpZ2luYWwgc3ltYm9sIHRvIGJlIHVzZWQuCi0gKi8KLWludAotdGNfaTM4Nl9maXhfYWRqdXN0YWJsZShmaXhQKQotICAgICBmaXhTICogZml4UDsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFByZXZlbnQgYWxsIGFkanVzdG1lbnRzIHRvIGdsb2JhbCBzeW1ib2xzLiAqLwotICBpZiAoU19JU19FWFRFUk4gKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotI2VuZGlmCi0gIC8qIGFkanVzdF9yZWxvY19zeW1zIGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgR09UICovCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9HT1RPRkYKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzg2X1BMVDMyCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzM4Nl9HT1QzMgotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotI2Vsc2UKLSNkZWZpbmUgcmVsb2MoU0laRSxQQ1JFTCxPVEhFUikJMAotI2RlZmluZSBCRkRfUkVMT0NfMTYJCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzMyCQkwCi0jZGVmaW5lIEJGRF9SRUxPQ18xNl9QQ1JFTAkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zMl9QQ1JFTAkwCi0jZGVmaW5lIEJGRF9SRUxPQ18zODZfUExUMzIJMAotI2RlZmluZSBCRkRfUkVMT0NfMzg2X0dPVDMyCTAKLSNkZWZpbmUgQkZEX1JFTE9DXzM4Nl9HT1RPRkYJMAotI2VuZGlmCi0KLWludAotaW50ZWxfZmxvYXRfb3BlcmFuZCAobW5lbW9uaWMpCi0gICAgIGNoYXIgKm1uZW1vbmljOwotewotICBpZiAobW5lbW9uaWNbMF0gPT0gJ2YnICYmIG1uZW1vbmljWzFdID09J2knKQotICAgIHJldHVybiAwOwotCi0gIGlmIChtbmVtb25pY1swXSA9PSAnZicpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIGd1dHMgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlci4gIExJTkUgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKGxpbmUpCi0gICAgIGNoYXIgKmxpbmU7Ci17Ci0gIC8qIFBvaW50cyB0byB0ZW1wbGF0ZSBvbmNlIHdlJ3ZlIGZvdW5kIGl0LiAqLwotICBjb25zdCB0ZW1wbGF0ZSAqdDsKLQotICAvKiBDb3VudCB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gZ2VuZXJhdGVkLiAgKi8KLSAgaW50IGluc25fc2l6ZSA9IDA7Ci0KLSAgaW50IGo7Ci0KLSAgY2hhciBtbmVtb25pY1tNQVhfTU5FTV9TSVpFXTsKLQotICAvKiBJbml0aWFsaXplIGdsb2JhbHMuICovCi0gIG1lbXNldCAoJmksICdcMCcsIHNpemVvZiAoaSkpOwotICBmb3IgKGogPSAwOyBqIDwgTUFYX09QRVJBTkRTOyBqKyspCi0gICAgaS5kaXNwX3JlbG9jW2pdID0gTk9fUkVMT0M7Ci0gIG1lbXNldCAoZGlzcF9leHByZXNzaW9ucywgJ1wwJywgc2l6ZW9mIChkaXNwX2V4cHJlc3Npb25zKSk7Ci0gIG1lbXNldCAoaW1fZXhwcmVzc2lvbnMsICdcMCcsIHNpemVvZiAoaW1fZXhwcmVzc2lvbnMpKTsKLSAgc2F2ZV9zdGFja19wID0gc2F2ZV9zdGFjazsJLyogcmVzZXQgc3RhY2sgcG9pbnRlciAqLwotCi0gIC8qIEZpcnN0IHBhcnNlIGFuIGluc3RydWN0aW9uIG1uZW1vbmljICYgY2FsbCBpMzg2X29wZXJhbmQgZm9yIHRoZSBvcGVyYW5kcy4KLSAgICAgV2UgYXNzdW1lIHRoYXQgdGhlIHNjcnViYmVyIGhhcyBhcnJhbmdlZCBpdCBzbyB0aGF0IGxpbmVbMF0gaXMgdGhlIHZhbGlkCi0gICAgIHN0YXJ0IG9mIGEgKHBvc3NpYmx5IHByZWZpeGVkKSBtbmVtb25pYy4gKi8KLSAgewotICAgIGNoYXIgKmwgPSBsaW5lOwotICAgIGNoYXIgKnRva2VuX3N0YXJ0ID0gbDsKLSAgICBjaGFyICptbmVtX3A7Ci0KLSAgICAvKiBOb24temVybyBpZiB3ZSBmb3VuZCBhIHByZWZpeCBvbmx5IGFjY2VwdGFibGUgd2l0aCBzdHJpbmcgaW5zbnMuICovCi0gICAgY29uc3QgY2hhciAqZXhwZWN0aW5nX3N0cmluZ19pbnN0cnVjdGlvbiA9IE5VTEw7Ci0KLSAgICB3aGlsZSAoMSkKLSAgICAgIHsKLQltbmVtX3AgPSBtbmVtb25pYzsKLQl3aGlsZSAoKCptbmVtX3AgPSBtbmVtb25pY19jaGFyc1sodW5zaWduZWQgY2hhcikgKmxdKSAhPSAwKQotCSAgewotCSAgICBtbmVtX3ArKzsKLQkgICAgaWYgKG1uZW1fcCA+PSBtbmVtb25pYyArIHNpemVvZiAobW5lbW9uaWMpKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJubyBzdWNoIDM4NiBpbnN0cnVjdGlvbjogYCVzJyIpLCB0b2tlbl9zdGFydCk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIGwrKzsKLQkgIH0KLQlpZiAoIWlzX3NwYWNlX2NoYXIgKCpsKQotCSAgICAmJiAqbCAhPSBFTkRfT0ZfSU5TTgotCSAgICAmJiAqbCAhPSBQUkVGSVhfU0VQQVJBVE9SKQotCSAgewotCSAgICBhc19iYWQgKF8oImludmFsaWQgY2hhcmFjdGVyICVzIGluIG1uZW1vbmljIiksCi0JCSAgICBvdXRwdXRfaW52YWxpZCAoKmwpKTsKLQkgICAgcmV0dXJuOwotCSAgfQotCWlmICh0b2tlbl9zdGFydCA9PSBsKQotCSAgewotCSAgICBpZiAoKmwgPT0gUFJFRklYX1NFUEFSQVRPUikKLQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBwcmVmaXg7IGdvdCBub3RoaW5nIikpOwotCSAgICBlbHNlCi0JICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgbW5lbW9uaWM7IGdvdCBub3RoaW5nIikpOwotCSAgICByZXR1cm47Ci0JICB9Ci0KLQkvKiBMb29rIHVwIGluc3RydWN0aW9uIChvciBwcmVmaXgpIHZpYSBoYXNoIHRhYmxlLiAgKi8KLQljdXJyZW50X3RlbXBsYXRlcyA9IGhhc2hfZmluZCAob3BfaGFzaCwgbW5lbW9uaWMpOwotCi0JaWYgKCpsICE9IEVORF9PRl9JTlNOCi0JICAgICYmICghIGlzX3NwYWNlX2NoYXIgKCpsKSB8fCBsWzFdICE9IEVORF9PRl9JTlNOKQotCSAgICAmJiBjdXJyZW50X3RlbXBsYXRlcwotCSAgICAmJiAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBJc1ByZWZpeCkpCi0JICB7Ci0JICAgIC8qIElmIHdlIGFyZSBpbiAxNi1iaXQgbW9kZSwgZG8gbm90IGFsbG93IGFkZHIxNiBvciBkYXRhMTYuCi0JICAgICAgIFNpbWlsYXJseSwgaW4gMzItYml0IG1vZGUsIGRvIG5vdCBhbGxvdyBhZGRyMzIgb3IgZGF0YTMyLiAgKi8KLQkgICAgaWYgKChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIChTaXplMTYgfCBTaXplMzIpKQotCQkmJiAoKChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIFNpemUzMikgIT0gMCkKLQkJICAgIF4gZmxhZ18xNmJpdF9jb2RlKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygicmVkdW5kYW50ICVzIHByZWZpeCIpLAotCQkJY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5uYW1lKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgLyogQWRkIHByZWZpeCwgY2hlY2tpbmcgZm9yIHJlcGVhdGVkIHByZWZpeGVzLiAgKi8KLQkgICAgc3dpdGNoIChhZGRfcHJlZml4IChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPmJhc2Vfb3Bjb2RlKSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSAwOgotCQlyZXR1cm47Ci0JICAgICAgY2FzZSAyOgotCQlleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uID0KLQkJICBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWU7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgLyogU2tpcCBwYXN0IFBSRUZJWF9TRVBBUkFUT1IgYW5kIHJlc2V0IHRva2VuX3N0YXJ0LiAgKi8KLQkgICAgdG9rZW5fc3RhcnQgPSArK2w7Ci0JICB9Ci0JZWxzZQotCSAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBpZiAoIWN1cnJlbnRfdGVtcGxhdGVzKQotICAgICAgewotCS8qIFNlZSBpZiB3ZSBjYW4gZ2V0IGEgbWF0Y2ggYnkgdHJpbW1pbmcgb2ZmIGEgc3VmZml4LgkqLwotCXN3aXRjaCAobW5lbV9wWy0xXSkKLQkgIHsKLQkgIGNhc2UgRFdPUkRfTU5FTV9TVUZGSVg6Ci0JICBjYXNlIFdPUkRfTU5FTV9TVUZGSVg6Ci0JICBjYXNlIEJZVEVfTU5FTV9TVUZGSVg6Ci0JICBjYXNlIFNIT1JUX01ORU1fU1VGRklYOgotI2lmIExPTkdfTU5FTV9TVUZGSVggIT0gRFdPUkRfTU5FTV9TVUZGSVgKLQkgIGNhc2UgTE9OR19NTkVNX1NVRkZJWDoKLSNlbmRpZgotCSAgICBpLnN1ZmZpeCA9IG1uZW1fcFstMV07Ci0JICAgIG1uZW1fcFstMV0gPSAnXDAnOwotCSAgICBjdXJyZW50X3RlbXBsYXRlcyA9IGhhc2hfZmluZCAob3BfaGFzaCwgbW5lbW9uaWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvKiBJbnRlbCBTeW50YXggKi8KLSAgICAgICAgICBjYXNlIElOVEVMX0RXT1JEX01ORU1fU1VGRklYOgotICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkuc3VmZml4ID0gbW5lbV9wWy0xXTsKLSAgICAgICAgICAgICAgICBtbmVtX3BbLTFdID0gJ1wwJzsKLSAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBsYXRlcyA9IGhhc2hfZmluZCAob3BfaGFzaCwgbW5lbW9uaWMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0JICB9Ci0JaWYgKCFjdXJyZW50X3RlbXBsYXRlcykKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJubyBzdWNoIDM4NiBpbnN0cnVjdGlvbjogYCVzJyIpLCB0b2tlbl9zdGFydCk7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIGNoZWNrIGZvciByZXAvcmVwbmUgd2l0aG91dCBhIHN0cmluZyBpbnN0cnVjdGlvbiAqLwotICAgIGlmIChleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uCi0JJiYgIShjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSkKLSAgICAgIHsKLQlhc19iYWQgKF8oImV4cGVjdGluZyBzdHJpbmcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgYCVzJyIpLAotCQlleHBlY3Rpbmdfc3RyaW5nX2luc3RydWN0aW9uKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICAvKiBUaGVyZSBtYXkgYmUgb3BlcmFuZHMgdG8gcGFyc2UuICovCi0gICAgaWYgKCpsICE9IEVORF9PRl9JTlNOKQotICAgICAgewotCS8qIHBhcnNlIG9wZXJhbmRzICovCi0KLQkvKiAxIGlmIG9wZXJhbmQgaXMgcGVuZGluZyBhZnRlciAnLCcuICovCi0JdW5zaWduZWQgaW50IGV4cGVjdGluZ19vcGVyYW5kID0gMDsKLQotCS8qIE5vbi16ZXJvIGlmIG9wZXJhbmQgcGFyZW5zIG5vdCBiYWxhbmNlZC4gKi8KLQl1bnNpZ25lZCBpbnQgcGFyZW5fbm90X2JhbGFuY2VkOwotCi0JZG8KLQkgIHsKLQkgICAgLyogc2tpcCBvcHRpb25hbCB3aGl0ZSBzcGFjZSBiZWZvcmUgb3BlcmFuZCAqLwotCSAgICBpZiAoaXNfc3BhY2VfY2hhciAoKmwpKQotCSAgICAgICsrbDsKLQkgICAgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpsKSAmJiAqbCAhPSBFTkRfT0ZfSU5TTikKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiaW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlIG9wZXJhbmQgJWQiKSwKLQkJCW91dHB1dF9pbnZhbGlkICgqbCksCi0JCQlpLm9wZXJhbmRzICsgMSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIHRva2VuX3N0YXJ0ID0gbDsJLyogYWZ0ZXIgd2hpdGUgc3BhY2UgKi8KLQkgICAgcGFyZW5fbm90X2JhbGFuY2VkID0gMDsKLQkgICAgd2hpbGUgKHBhcmVuX25vdF9iYWxhbmNlZCB8fCAqbCAhPSAnLCcpCi0JICAgICAgewotCQlpZiAoKmwgPT0gRU5EX09GX0lOU04pCi0JCSAgewotCQkgICAgaWYgKHBhcmVuX25vdF9iYWxhbmNlZCkKLQkJICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlbF9zeW50YXgpCi0JCQkgIGFzX2JhZCAoXygidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiBvcGVyYW5kICVkLiIpLAotCQkJCSAgaS5vcGVyYW5kcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotCQkJICBhc19iYWQgKF8oInVuYmFsYW5jZWQgYnJhY2tldHMgaW4gb3BlcmFuZCAlZC4iKSwKLQkJCQkgIGkub3BlcmFuZHMgKyAxKTsKLQkJCXJldHVybjsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICBicmVhazsJLyogd2UgYXJlIGRvbmUgKi8KLQkJICB9Ci0JCWVsc2UgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpsKSAmJiAhaXNfc3BhY2VfY2hhciAoKmwpKQotCQkgIHsKLQkJICAgIGFzX2JhZCAoXygiaW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gb3BlcmFuZCAlZCIpLAotCQkJICAgIG91dHB1dF9pbnZhbGlkICgqbCksCi0JCQkgICAgaS5vcGVyYW5kcyArIDEpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWludGVsX3N5bnRheCkKLSAgICAgICAgICAgICAgICAgIHsKLQkJICAgIGlmICgqbCA9PSAnKCcpCi0JCSAgICAgICsrcGFyZW5fbm90X2JhbGFuY2VkOwotCQkgICAgaWYgKCpsID09ICcpJykKLQkJICAgICAgLS1wYXJlbl9ub3RfYmFsYW5jZWQ7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotCQkgICAgaWYgKCpsID09ICdbJykKLQkJICAgICAgKytwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JCSAgICBpZiAoKmwgPT0gJ10nKQotCQkgICAgICAtLXBhcmVuX25vdF9iYWxhbmNlZDsKLSAgICAgICAgICAgICAgICAgIH0KLQkJbCsrOwotCSAgICAgIH0KLQkgICAgaWYgKGwgIT0gdG9rZW5fc3RhcnQpCi0JICAgICAgewkJCS8qIHllcywgd2UndmUgcmVhZCBpbiBhbm90aGVyIG9wZXJhbmQgKi8KLQkJdW5zaWduZWQgaW50IG9wZXJhbmRfb2s7Ci0JCXRoaXNfb3BlcmFuZCA9IGkub3BlcmFuZHMrKzsKLQkJaWYgKGkub3BlcmFuZHMgPiBNQVhfT1BFUkFORFMpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJzcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiKSwKLQkJCSAgICBNQVhfT1BFUkFORFMpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkJLyogbm93IHBhcnNlIG9wZXJhbmQgYWRkaW5nIGluZm8gdG8gJ2knIGFzIHdlIGdvIGFsb25nICovCi0JCUVORF9TVFJJTkdfQU5EX1NBVkUgKGwpOwotCi0gICAgICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgICAgICAgIG9wZXJhbmRfb2sgPSBpMzg2X2ludGVsX29wZXJhbmQgKHRva2VuX3N0YXJ0LCBpbnRlbF9mbG9hdF9vcGVyYW5kIChtbmVtb25pYykpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIG9wZXJhbmRfb2sgPSBpMzg2X29wZXJhbmQgKHRva2VuX3N0YXJ0KTsKLQotCQlSRVNUT1JFX0VORF9TVFJJTkcgKGwpOwkvKiByZXN0b3JlIG9sZCBjb250ZW50cyAqLwotCQlpZiAoIW9wZXJhbmRfb2spCi0JCSAgcmV0dXJuOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKGV4cGVjdGluZ19vcGVyYW5kKQotCQkgIHsKLQkJICBleHBlY3Rpbmdfb3BlcmFuZF9hZnRlcl9jb21tYToKLQkJICAgIGFzX2JhZCAoXygiZXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JCWlmICgqbCA9PSAnLCcpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJleHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIpKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0JICAgICAgfQotCi0JICAgIC8qIG5vdyAqbCBtdXN0IGJlIGVpdGhlciAnLCcgb3IgRU5EX09GX0lOU04gKi8KLQkgICAgaWYgKCpsID09ICcsJykKLQkgICAgICB7Ci0JCWlmICgqKytsID09IEVORF9PRl9JTlNOKQotCQkgIHsJCS8qIGp1c3Qgc2tpcCBpdCwgaWYgaXQncyBcbiBjb21wbGFpbiAqLwotCQkgICAgZ290byBleHBlY3Rpbmdfb3BlcmFuZF9hZnRlcl9jb21tYTsKLQkJICB9Ci0JCWV4cGVjdGluZ19vcGVyYW5kID0gMTsKLQkgICAgICB9Ci0JICB9Ci0Jd2hpbGUgKCpsICE9IEVORF9PRl9JTlNOKTsJLyogdW50aWwgd2UgZ2V0IGVuZCBvZiBpbnNuICovCi0gICAgICB9Ci0gIH0KLQotICAvKiBOb3cgd2UndmUgcGFyc2VkIHRoZSBtbmVtb25pYyBpbnRvIGEgc2V0IG9mIHRlbXBsYXRlcywgYW5kIGhhdmUgdGhlCi0gICAgIG9wZXJhbmRzIGF0IGhhbmQuCi0KLSAgICAgTmV4dCwgd2UgZmluZCBhIHRlbXBsYXRlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaW5zbiwKLSAgICAgbWFraW5nIHN1cmUgdGhlIG92ZXJsYXAgb2YgdGhlIGdpdmVuIG9wZXJhbmRzIHR5cGVzIGlzIGNvbnNpc3RlbnQKLSAgICAgd2l0aCB0aGUgdGVtcGxhdGUgb3BlcmFuZCB0eXBlcy4gKi8KLQotI2RlZmluZSBNQVRDSChvdmVybGFwLCBnaXZlbiwgdGVtcGxhdGUpIFwKLSAgKChvdmVybGFwKSBcCi0gICAmJiAoKGdpdmVuKSAmIEJhc2VJbmRleCkgPT0gKChvdmVybGFwKSAmIEJhc2VJbmRleCkgXAotICAgJiYgKChnaXZlbikgJiBKdW1wQWJzb2x1dGUpID09ICgodGVtcGxhdGUpICYgSnVtcEFic29sdXRlKSkKLQotICAvKiBJZiBnaXZlbiB0eXBlcyByMCBhbmQgcjEgYXJlIHJlZ2lzdGVycyB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZQotICAgICB1bmxlc3MgdGhlIGV4cGVjdGVkIG9wZXJhbmQgdHlwZSByZWdpc3RlciBvdmVybGFwIGlzIG51bGwuCi0gICAgIE5vdGUgdGhhdCBBY2MgaW4gYSB0ZW1wbGF0ZSBtYXRjaGVzIGV2ZXJ5IHNpemUgb2YgcmVnLiAgKi8KLSNkZWZpbmUgQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSChtMCwgZzAsIHQwLCBtMSwgZzEsIHQxKSBcCi0gICggKChnMCkgJiBSZWcpID09IDAgfHwgKChnMSkgJiBSZWcpID09IDAgfHwgXAotICAgICgoZzApICYgUmVnKSA9PSAoKGcxKSAmIFJlZykgfHwgXAotICAgICgoKChtMCkgJiBBY2MpID8gUmVnIDogKHQwKSkgJiAoKChtMSkgJiBBY2MpID8gUmVnIDogKHQxKSkgJiBSZWcpID09IDAgKQotCi0gIHsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgb3ZlcmxhcDAsIG92ZXJsYXAxOwotICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgdW5zaWduZWQgaW50IG92ZXJsYXAyOwotICAgIHVuc2lnbmVkIGludCBmb3VuZF9yZXZlcnNlX21hdGNoOwotICAgIGludCBzdWZmaXhfY2hlY2s7Ci0KLSAgICAvKiBBbGwgaW50ZWwgb3Bjb2RlcyBoYXZlIHJldmVyc2VkIG9wZXJhbmRzIGV4Y2VwdCBmb3IgQk9VTkQgYW5kIEVOVEVSICovCi0gICAgaWYgKGludGVsX3N5bnRheAotICAgICAgICAmJiAoc3RyY21wIChtbmVtb25pYywgImVudGVyIikgIT0gMCkKLSAgICAgICAgJiYgKHN0cmNtcCAobW5lbW9uaWMsICJib3VuZCIpICE9IDApCi0gICAgICAgICYmIChzdHJuY21wIChtbmVtb25pYywgImZzdWIiLCA0KSAhPTApCi0gICAgICAgICYmIChzdHJuY21wIChtbmVtb25pYywgImZkaXYiLCA0KSAhPTApKQotICAgICAgewotICAgICAgICBjb25zdCByZWdfZW50cnkgKnRlbXBfcmVnOwotICAgICAgICBleHByZXNzaW9uUyAqdGVtcF9kaXNwOwotICAgICAgICBleHByZXNzaW9uUyAqdGVtcF9pbW07Ci0gICAgICAgIHVuc2lnbmVkIGludCB0ZW1wX3R5cGU7Ci0gICAgICAgIGludCB4Y2hnMSwgeGNoZzI7Ci0KLSAgICAgICAgaWYgKGkub3BlcmFuZHMgPT0gMikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB4Y2hnMSA9IDA7Ci0gICAgICAgICAgICB4Y2hnMiA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChpLm9wZXJhbmRzID09IDMpCi0gICAgICAgICAgewotICAgICAgICAgICAgeGNoZzEgPSAwOwotICAgICAgICAgICAgeGNoZzIgPSAyOwotICAgICAgICAgIH0KLQotICAgICAgICBpZiAoaS5vcGVyYW5kcyA+IDEpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGVtcF90eXBlID0gaS50eXBlc1t4Y2hnMl07Ci0gICAgICAgICAgICBpZiAodGVtcF90eXBlICYgKFJlZyB8IEZsb2F0UmVnKSkKLSAgICAgICAgICAgICAgdGVtcF9yZWcgPSBpLnJlZ3NbeGNoZzJdOwotICAgICAgICAgICAgZWxzZSBpZiAodGVtcF90eXBlICYgSW1tKQotICAgICAgICAgICAgICB0ZW1wX2ltbSA9IGkuaW1tc1t4Y2hnMl07Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZW1wX3R5cGUgJiBEaXNwKQotICAgICAgICAgICAgICB0ZW1wX2Rpc3AgPSBpLmRpc3BzW3hjaGcyXTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICBpLnR5cGVzW3hjaGcyXSA9IGkudHlwZXNbeGNoZzFdOwotCi0gICAgICAgICAgICBpZiAoaS50eXBlc1t4Y2hnMV0gJiAoUmVnIHwgRmxvYXRSZWcpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaS5yZWdzW3hjaGcyXSA9IGkucmVnc1t4Y2hnMV07Ci0gICAgICAgICAgICAgICAgaS5yZWdzW3hjaGcxXSA9IE5VTEw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGkudHlwZXNbeGNoZzJdICYgSW1tKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaS5pbW1zW3hjaGcyXSA9IGkuaW1tc1t4Y2hnMV07Ci0gICAgICAgICAgICAgICAgaS5pbW1zW3hjaGcxXSA9IE5VTEw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGkudHlwZXNbeGNoZzJdICYgRGlzcCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkuZGlzcHNbeGNoZzJdID0gaS5kaXNwc1t4Y2hnMV07Ci0gICAgICAgICAgICAgICAgaS5kaXNwc1t4Y2hnMV0gPSBOVUxMOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0ZW1wX3R5cGUgJiAoUmVnIHwgRmxvYXRSZWcpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaS5yZWdzW3hjaGcxXSA9IHRlbXBfcmVnOwotICAgICAgICAgICAgICAgIGlmICghIChpLnR5cGVzW3hjaGcxXSAmIChSZWcgfCBGbG9hdFJlZykpKQotICAgICAgICAgICAgICAgICAgaS5yZWdzW3hjaGcyXSA9IE5VTEw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIEltbSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkuaW1tc1t4Y2hnMV0gPSB0ZW1wX2ltbTsKLSAgICAgICAgICAgICAgICBpZiAoISAoaS50eXBlc1t4Y2hnMV0gJiBJbW0pKQotICAgICAgICAgICAgICAgICAgaS5pbW1zW3hjaGcyXSA9IE5VTEw7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHRlbXBfdHlwZSAmIERpc3ApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpLmRpc3BzW3hjaGcxXSA9IHRlbXBfZGlzcDsKLSAgICAgICAgICAgICAgICBpZiAoISAoaS50eXBlc1t4Y2hnMV0gJiBEaXNwKSkKLSAgICAgICAgICAgICAgICAgIGkuZGlzcHNbeGNoZzJdID0gTlVMTDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgIGkudHlwZXNbeGNoZzFdID0gdGVtcF90eXBlOwotICAgICAgICAgICB9Ci0gICAgICAgaWYgKCFzdHJjbXAobW5lbW9uaWMsImptcCIpCi0gICAgICAgICAgIHx8ICFzdHJjbXAgKG1uZW1vbmljLCAiY2FsbCIpKQotICAgICAgICAgaWYgKChpLnR5cGVzWzBdICYgUmVnKSB8fCBpLnR5cGVzWzBdICYgQmFzZUluZGV4KQotICAgICAgICAgICBpLnR5cGVzWzBdIHw9IEp1bXBBYnNvbHV0ZTsKLSAgICAgICAgIAotICAgICAgIH0KLSAgICBvdmVybGFwMCA9IDA7Ci0gICAgb3ZlcmxhcDEgPSAwOwotICAgIG92ZXJsYXAyID0gMDsKLSAgICBmb3VuZF9yZXZlcnNlX21hdGNoID0gMDsKLSAgICBzdWZmaXhfY2hlY2sgPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWAotCQkgICAgPyBOb19iU3VmCi0JCSAgICA6IChpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYCi0JCSAgICAgICA/IE5vX3dTdWYKLQkJICAgICAgIDogKGkuc3VmZml4ID09IFNIT1JUX01ORU1fU1VGRklYCi0JCQkgID8gTm9fc1N1ZgotCQkJICA6IChpLnN1ZmZpeCA9PSBMT05HX01ORU1fU1VGRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTm9fbFN1ZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaS5zdWZmaXggPT0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTm9fZFN1ZiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaS5zdWZmaXggPT0gTE9OR19ET1VCTEVfTU5FTV9TVUZGSVggPyBOb194U3VmIDogMCkpKSkpKTsKLQotICAgIGZvciAodCA9IGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydDsKLQkgdCA8IGN1cnJlbnRfdGVtcGxhdGVzLT5lbmQ7Ci0JIHQrKykKLSAgICAgIHsKLQkvKiBNdXN0IGhhdmUgcmlnaHQgbnVtYmVyIG9mIG9wZXJhbmRzLiAqLwotCWlmIChpLm9wZXJhbmRzICE9IHQtPm9wZXJhbmRzKQotCSAgY29udGludWU7Ci0KLSAgICAgICAgLyogRm9yIHNvbWUgb3Bjb2RlcywgZG9uJ3QgY2hlY2sgdGhlIHN1ZmZpeCAqLwotICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJjbXAgKHQtPm5hbWUsICJmbnN0Y3ciKQotICAgICAgICAgICAgICAgICYmIHN0cmNtcCAodC0+bmFtZSwgImZsZGN3IikKLSAgICAgICAgICAgICAgICAmJiAodC0+b3Bjb2RlX21vZGlmaWVyICYgc3VmZml4X2NoZWNrKSkKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAvKiBNdXN0IG5vdCBoYXZlIGRpc2FsbG93ZWQgc3VmZml4LiAqLyAKLSAgICAgICAgZWxzZSBpZiAoKHQtPm9wY29kZV9tb2RpZmllciAmIHN1ZmZpeF9jaGVjaykpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotCWVsc2UgaWYgKCF0LT5vcGVyYW5kcykKLQkgIGJyZWFrOwkJLyogMCBvcGVyYW5kcyBhbHdheXMgbWF0Y2hlcyAqLwotCi0Jb3ZlcmxhcDAgPSBpLnR5cGVzWzBdICYgdC0+b3BlcmFuZF90eXBlc1swXTsKLQlzd2l0Y2ggKHQtPm9wZXJhbmRzKQotCSAgewotCSAgY2FzZSAxOgotCSAgICBpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1swXSkpCi0JICAgICAgY29udGludWU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAyOgotCSAgY2FzZSAzOgotCSAgICBvdmVybGFwMSA9IGkudHlwZXNbMV0gJiB0LT5vcGVyYW5kX3R5cGVzWzFdOwotCSAgICBpZiAoIU1BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwgdC0+b3BlcmFuZF90eXBlc1swXSkKLQkJfHwgIU1BVENIIChvdmVybGFwMSwgaS50eXBlc1sxXSwgdC0+b3BlcmFuZF90eXBlc1sxXSkKLQkJfHwgIUNPTlNJU1RFTlRfUkVHSVNURVJfTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLAotCQkJCQkgICAgICAgdC0+b3BlcmFuZF90eXBlc1swXSwKLQkJCQkJICAgICAgIG92ZXJsYXAxLCBpLnR5cGVzWzFdLAotCQkJCQkgICAgICAgdC0+b3BlcmFuZF90eXBlc1sxXSkpCi0JICAgICAgewotCi0JCS8qIGNoZWNrIGlmIG90aGVyIGRpcmVjdGlvbiBpcyB2YWxpZCAuLi4gKi8KLQkJaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiAoRHxGbG9hdEQpKSA9PSAwKQotCQkgIGNvbnRpbnVlOwotCi0JCS8qIHRyeSByZXZlcnNpbmcgZGlyZWN0aW9uIG9mIG9wZXJhbmRzICovCi0JCW92ZXJsYXAwID0gaS50eXBlc1swXSAmIHQtPm9wZXJhbmRfdHlwZXNbMV07Ci0JCW92ZXJsYXAxID0gaS50eXBlc1sxXSAmIHQtPm9wZXJhbmRfdHlwZXNbMF07Ci0JCWlmICghTUFUQ0ggKG92ZXJsYXAwLCBpLnR5cGVzWzBdLCB0LT5vcGVyYW5kX3R5cGVzWzFdKQotCQkgICAgfHwgIU1BVENIIChvdmVybGFwMSwgaS50eXBlc1sxXSwgdC0+b3BlcmFuZF90eXBlc1swXSkKLQkJICAgIHx8ICFDT05TSVNURU5UX1JFR0lTVEVSX01BVENIIChvdmVybGFwMCwgaS50eXBlc1swXSwKLQkJCQkJCSAgIHQtPm9wZXJhbmRfdHlwZXNbMV0sCi0JCQkJCQkgICBvdmVybGFwMSwgaS50eXBlc1sxXSwKLQkJCQkJCSAgIHQtPm9wZXJhbmRfdHlwZXNbMF0pKQotCQkgIHsKLQkJICAgIC8qIGRvZXMgbm90IG1hdGNoIGVpdGhlciBkaXJlY3Rpb24gKi8KLQkJICAgIGNvbnRpbnVlOwotCQkgIH0KLQkJLyogZm91bmRfcmV2ZXJzZV9tYXRjaCBob2xkcyB3aGljaCBvZiBEIG9yIEZsb2F0RFIKLQkJICAgd2UndmUgZm91bmQuICAqLwotCQlmb3VuZF9yZXZlcnNlX21hdGNoID0gdC0+b3Bjb2RlX21vZGlmaWVyICYgKER8RmxvYXREUik7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgLyogZm91bmQgYSBmb3J3YXJkIDIgb3BlcmFuZCBtYXRjaCBoZXJlICovCi0JICAgIGlmICh0LT5vcGVyYW5kcyA9PSAzKQotCSAgICAgIHsKLQkJLyogSGVyZSB3ZSBtYWtlIHVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBubwotCQkgICByZXZlcnNlIG1hdGNoIDMgb3BlcmFuZCBpbnN0cnVjdGlvbnMsIGFuZCBhbGwgMwotCQkgICBvcGVyYW5kIGluc3RydWN0aW9ucyBvbmx5IG5lZWQgdG8gYmUgY2hlY2tlZCBmb3IKLQkJICAgcmVnaXN0ZXIgY29uc2lzdGVuY3kgYmV0d2VlbiBvcGVyYW5kcyAyIGFuZCAzLiAgKi8KLQkJb3ZlcmxhcDIgPSBpLnR5cGVzWzJdICYgdC0+b3BlcmFuZF90eXBlc1syXTsKLQkJaWYgKCFNQVRDSCAob3ZlcmxhcDIsIGkudHlwZXNbMl0sIHQtPm9wZXJhbmRfdHlwZXNbMl0pCi0JCSAgICB8fCAhQ09OU0lTVEVOVF9SRUdJU1RFUl9NQVRDSCAob3ZlcmxhcDEsIGkudHlwZXNbMV0sCi0JCQkJCQkgICB0LT5vcGVyYW5kX3R5cGVzWzFdLAotCQkJCQkJICAgb3ZlcmxhcDIsIGkudHlwZXNbMl0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm9wZXJhbmRfdHlwZXNbMl0pKQotCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQkgICAgICB9Ci0JICAgIC8qIGZvdW5kIGVpdGhlciBmb3J3YXJkL3JldmVyc2UgMiBvciAzIG9wZXJhbmQgbWF0Y2ggaGVyZToKLQkgICAgICAgc2xpcCB0aHJvdWdoIHRvIGJyZWFrICovCi0JICB9Ci0JYnJlYWs7CQkJLyogd2UndmUgZm91bmQgYSBtYXRjaDsgYnJlYWsgb3V0IG9mIGxvb3AgKi8KLSAgICAgIH0JCQkJLyogZm9yICh0ID0gLi4uICovCi0gICAgaWYgKHQgPT0gY3VycmVudF90ZW1wbGF0ZXMtPmVuZCkKLSAgICAgIHsJCQkJLyogd2UgZm91bmQgbm8gbWF0Y2ggKi8KLQlhc19iYWQgKF8oInN1ZmZpeCBvciBvcGVyYW5kcyBpbnZhbGlkIGZvciBgJXMnIiksCi0JCWN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0JcmV0dXJuOwotICAgICAgfQotCi0gICAgaWYgKCh0LT5vcGNvZGVfbW9kaWZpZXIgJiAoSXNQcmVmaXh8SWdub3JlU2l6ZSkpID09IChJc1ByZWZpeHxJZ25vcmVTaXplKSkKLSAgICAgIHsKLQkvKiBXYXJuIHRoZW0gdGhhdCBhIGRhdGEgb3IgYWRkcmVzcyBzaXplIHByZWZpeCBkb2Vzbid0IGFmZmVjdAotCSAgIGFzc2VtYmx5IG9mIHRoZSBuZXh0IGxpbmUgb2YgY29kZS4gICovCi0JYXNfd2FybiAoXygic3RhbmQtYWxvbmUgYCVzJyBwcmVmaXgiKSwgdC0+bmFtZSk7Ci0gICAgICB9Ci0KLSAgICAvKiBDb3B5IHRoZSB0ZW1wbGF0ZSB3ZSBmb3VuZC4gICovCi0gICAgaS50bSA9ICp0OwotICAgIGlmIChmb3VuZF9yZXZlcnNlX21hdGNoKQotICAgICAgewotCWkudG0ub3BlcmFuZF90eXBlc1swXSA9IHQtPm9wZXJhbmRfdHlwZXNbMV07Ci0JaS50bS5vcGVyYW5kX3R5cGVzWzFdID0gdC0+b3BlcmFuZF90eXBlc1swXTsKLSAgICAgIH0KLQotCi0gICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgRldhaXQpCi0gICAgICBpZiAoISBhZGRfcHJlZml4IChGV0FJVF9PUENPREUpKQotCXJldHVybjsKLQotICAgIC8qIENoZWNrIHN0cmluZyBpbnN0cnVjdGlvbiBzZWdtZW50IG92ZXJyaWRlcyAqLwotICAgIGlmICgoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykgIT0gMCAmJiBpLm1lbV9vcGVyYW5kcyAhPSAwKQotICAgICAgewotCWludCBtZW1fb3AgPSAoaS50eXBlc1swXSAmIEFueU1lbSkgPyAwIDogMTsKLQlpZiAoKGkudG0ub3BlcmFuZF90eXBlc1ttZW1fb3BdICYgRXNTZWcpICE9IDApCi0JICB7Ci0JICAgIGlmIChpLnNlZ1swXSAhPSBOVUxMICYmIGkuc2VnWzBdICE9ICZlcykKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiYCVzJyBvcGVyYW5kICVkIG11c3QgdXNlIGAlJWVzJyBzZWdtZW50IiksCi0JCQlpLnRtLm5hbWUsCi0JCQltZW1fb3AgKyAxKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgICAgLyogVGhlcmUncyBvbmx5IGV2ZXIgb25lIHNlZ21lbnQgb3ZlcnJpZGUgYWxsb3dlZCBwZXIgaW5zdHJ1Y3Rpb24uCi0JICAgICAgIFRoaXMgaW5zdHJ1Y3Rpb24gcG9zc2libHkgaGFzIGEgbGVnYWwgc2VnbWVudCBvdmVycmlkZSBvbiB0aGUKLQkgICAgICAgc2Vjb25kIG9wZXJhbmQsIHNvIGNvcHkgdGhlIHNlZ21lbnQgdG8gd2hlcmUgbm9uLXN0cmluZwotCSAgICAgICBpbnN0cnVjdGlvbnMgc3RvcmUgaXQsIGFsbG93aW5nIGNvbW1vbiBjb2RlLiAgKi8KLQkgICAgaS5zZWdbMF0gPSBpLnNlZ1sxXTsKLQkgIH0KLQllbHNlIGlmICgoaS50bS5vcGVyYW5kX3R5cGVzW21lbV9vcCArIDFdICYgRXNTZWcpICE9IDApCi0JICB7Ci0JICAgIGlmIChpLnNlZ1sxXSAhPSBOVUxMICYmIGkuc2VnWzFdICE9ICZlcykKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiYCVzJyBvcGVyYW5kICVkIG11c3QgdXNlIGAlJWVzJyBzZWdtZW50IiksCi0JCQlpLnRtLm5hbWUsCi0JCQltZW1fb3AgKyAyKTsKLQkJcmV0dXJuOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIElmIG1hdGNoZWQgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVzIGFuIGV4cGxpY2l0IGluc3RydWN0aW9uIG1uZW1vbmljCi0gICAgICAgc3VmZml4LCB1c2UgaXQuICAqLwotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIChTaXplMTYgfCBTaXplMzIpKQotICAgICAgewotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFNpemUxNikKLQkgIGkuc3VmZml4ID0gV09SRF9NTkVNX1NVRkZJWDsKLQllbHNlCi0JICBpLnN1ZmZpeCA9IERXT1JEX01ORU1fU1VGRklYOwotICAgICAgfQotICAgIGVsc2UgaWYgKGkucmVnX29wZXJhbmRzKQotICAgICAgewotCS8qIElmIHRoZXJlJ3Mgbm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IHdlIHRyeSB0byBpbnZlbnQgb25lCi0JICAgYmFzZWQgb24gcmVnaXN0ZXIgb3BlcmFuZHMuICovCi0JaWYgKCFpLnN1ZmZpeCkKLQkgIHsKLQkgICAgLyogV2UgdGFrZSBpLnN1ZmZpeCBmcm9tIHRoZSBsYXN0IHJlZ2lzdGVyIG9wZXJhbmQgc3BlY2lmaWVkLAotCSAgICAgICBEZXN0aW5hdGlvbiByZWdpc3RlciB0eXBlIGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiBzb3VyY2UKLQkgICAgICAgcmVnaXN0ZXIgdHlwZS4gICovCi0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIGlmIChpLnR5cGVzW29wXSAmIFJlZykKLQkJewotCQkgIGkuc3VmZml4ID0gKChpLnR5cGVzW29wXSAmIFJlZzgpID8gQllURV9NTkVNX1NVRkZJWCA6Ci0JCQkgICAgICAoaS50eXBlc1tvcF0gJiBSZWcxNikgPyBXT1JEX01ORU1fU1VGRklYIDoKLQkJCSAgICAgIERXT1JEX01ORU1fU1VGRklYKTsKLQkJICBicmVhazsKLQkJfQotCSAgfQotCWVsc2UgaWYgKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVgpCi0JICB7Ci0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIHsKLQkJLyogSWYgdGhpcyBpcyBhbiBlaWdodCBiaXQgcmVnaXN0ZXIsIGl0J3MgT0suICBJZiBpdCdzCi0JCSAgIHRoZSAxNiBvciAzMiBiaXQgdmVyc2lvbiBvZiBhbiBlaWdodCBiaXQgcmVnaXN0ZXIsCi0JCSAgIHdlIHdpbGwganVzdCB1c2UgdGhlIGxvdyBwb3J0aW9uLCBhbmQgdGhhdCdzIE9LIHRvby4gKi8KLQkJaWYgKGkudHlwZXNbb3BdICYgUmVnOCkKLQkJICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIC8qIG1vdnp4IGFuZCBtb3ZzeCBzaG91bGQgbm90IGdlbmVyYXRlIHRoaXMgd2FybmluZy4gKi8KLSAgICAgICAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4Ci0gICAgICAgICAgICAgICAgICAgICYmIChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmI3Ci0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmI2Ci0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmJlCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmJmKSkKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0JCWlmICgoaS50eXBlc1tvcF0gJiBXb3JkUmVnKSAmJiBpLnJlZ3Nbb3BdLT5yZWdfbnVtIDwgNAotI2lmIDAKLQkJICAgIC8qIENoZWNrIHRoYXQgdGhlIHRlbXBsYXRlIGFsbG93cyBlaWdodCBiaXQgcmVncwotCQkgICAgICAgVGhpcyBraWxscyBpbnNucyBzdWNoIGFzIGBvcmIgJDEsJWVkeCcsIHdoaWNoCi0JCSAgICAgICBtYXliZSBzaG91bGQgYmUgYWxsb3dlZC4gICovCi0JCSAgICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWc4fEluT3V0UG9ydFJlZykpCi0jZW5kaWYKLQkJICAgICkKLQkJICB7Ci0jaWYgUkVHSVNURVJfV0FSTklOR1MKLQkJICAgIGlmICgoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIEluT3V0UG9ydFJlZykgPT0gMCkKLQkJICAgICAgYXNfd2FybiAoXygidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIpLAotCQkJICAgICAgIChpLnJlZ3Nbb3BdIC0gKGkudHlwZXNbb3BdICYgUmVnMTYgPyA4IDogMTYpKS0+cmVnX25hbWUsCi0JCQkgICAgICAgaS5yZWdzW29wXS0+cmVnX25hbWUsCi0JCQkgICAgICAgaS5zdWZmaXgpOwotI2VuZGlmCi0JCSAgICBjb250aW51ZTsKLQkJICB9Ci0JCS8qIEFueSBvdGhlciByZWdpc3RlciBpcyBiYWQgKi8KLQkJaWYgKGkudHlwZXNbb3BdICYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJCSAgIHwgU1JlZzIgfCBTUmVnMwotCQkJCSAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdAotCQkJCSAgIHwgRmxvYXRSZWcgfCBGbG9hdEFjYykpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJgJSUlcycgbm90IGFsbG93ZWQgd2l0aCBgJXMlYyciKSwKLQkJCSAgICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgICBpLnRtLm5hbWUsCi0JCQkgICAgaS5zdWZmaXgpOwotCQkgICAgcmV0dXJuOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0JZWxzZSBpZiAoaS5zdWZmaXggPT0gRFdPUkRfTU5FTV9TVUZGSVgpCi0JICB7Ci0JICAgIGludCBvcDsKLQkgICAgZm9yIChvcCA9IGkub3BlcmFuZHM7IC0tb3AgPj0gMDsgKQotCSAgICAgIC8qIFJlamVjdCBlaWdodCBiaXQgcmVnaXN0ZXJzLCBleGNlcHQgd2hlcmUgdGhlIHRlbXBsYXRlCi0JCSByZXF1aXJlcyB0aGVtLiAoZWcuIG1vdnpiKSAgKi8KLQkgICAgICBpZiAoKGkudHlwZXNbb3BdICYgUmVnOCkgIT0gMAotCQkgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzE2fFJlZzMyfEFjYykpICE9IDApCi0JCXsKLQkJICBhc19iYWQgKF8oImAlJSVzJyBub3QgYWxsb3dlZCB3aXRoIGAlcyVjJyIpLAotCQkJICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgaS50bS5uYW1lLAotCQkJICBpLnN1ZmZpeCk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0jaWYgUkVHSVNURVJfV0FSTklOR1MKLQkgICAgICAvKiBXYXJuIGlmIHRoZSBlIHByZWZpeCBvbiBhIGdlbmVyYWwgcmVnIGlzIG1pc3NpbmcuICAqLwotCSAgICAgIGVsc2UgaWYgKChpLnR5cGVzW29wXSAmIFJlZzE2KSAhPSAwCi0JCSAgICAgICAmJiAoaS50bS5vcGVyYW5kX3R5cGVzW29wXSAmIChSZWczMnxBY2MpKSAhPSAwKQotCQl7Ci0JCSAgYXNfd2FybiAoXygidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIpLAotCQkJICAgKGkucmVnc1tvcF0gKyA4KS0+cmVnX25hbWUsCi0JCQkgICBpLnJlZ3Nbb3BdLT5yZWdfbmFtZSwKLQkJCSAgIGkuc3VmZml4KTsKLQkJfQotI2VuZGlmCi0JICB9Ci0JZWxzZSBpZiAoaS5zdWZmaXggPT0gV09SRF9NTkVNX1NVRkZJWCkKLQkgIHsKLQkgICAgaW50IG9wOwotCSAgICBmb3IgKG9wID0gaS5vcGVyYW5kczsgLS1vcCA+PSAwOyApCi0JICAgICAgLyogUmVqZWN0IGVpZ2h0IGJpdCByZWdpc3RlcnMsIGV4Y2VwdCB3aGVyZSB0aGUgdGVtcGxhdGUKLQkJIHJlcXVpcmVzIHRoZW0uIChlZy4gbW92emIpICAqLwotCSAgICAgIGlmICgoaS50eXBlc1tvcF0gJiBSZWc4KSAhPSAwCi0JCSAgJiYgKGkudG0ub3BlcmFuZF90eXBlc1tvcF0gJiAoUmVnMTZ8UmVnMzJ8QWNjKSkgIT0gMCkKLQkJewotCQkgIGFzX2JhZCAoXygiYCUlJXMnIG5vdCBhbGxvd2VkIHdpdGggYCVzJWMnIiksCi0JCQkgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICBpLnRtLm5hbWUsCi0JCQkgIGkuc3VmZml4KTsKLQkJICByZXR1cm47Ci0JCX0KLSNpZiBSRUdJU1RFUl9XQVJOSU5HUwotCSAgICAgIC8qIFdhcm4gaWYgdGhlIGUgcHJlZml4IG9uIGEgZ2VuZXJhbCByZWcgaXMgcHJlc2VudC4gICovCi0JICAgICAgZWxzZSBpZiAoKGkudHlwZXNbb3BdICYgUmVnMzIpICE9IDAKLQkJICAgICAgICYmIChpLnRtLm9wZXJhbmRfdHlwZXNbb3BdICYgKFJlZzE2fEFjYykpICE9IDApCi0JCXsKLQkJICBhc193YXJuIChfKCJ1c2luZyBgJSUlcycgaW5zdGVhZCBvZiBgJSUlcycgZHVlIHRvIGAlYycgc3VmZml4IiksCi0JCQkgICAoaS5yZWdzW29wXSAtIDgpLT5yZWdfbmFtZSwKLQkJCSAgIGkucmVnc1tvcF0tPnJlZ19uYW1lLAotCQkJICAgaS5zdWZmaXgpOwotCQl9Ci0jZW5kaWYKLQkgIH0KLQllbHNlCi0JICBhYm9ydCgpOwotICAgICAgfQotCi0gICAgLyogTWFrZSBzdGlsbCB1bnJlc29sdmVkIGltbWVkaWF0ZSBtYXRjaGVzIGNvbmZvcm0gdG8gc2l6ZSBvZiBpbW1lZGlhdGUKLSAgICAgICBnaXZlbiBpbiBpLnN1ZmZpeC4gIE5vdGU6IG92ZXJsYXAyIGNhbm5vdCBiZSBhbiBpbW1lZGlhdGUhICAqLwotICAgIGlmICgob3ZlcmxhcDAgJiAoSW1tOCB8IEltbThTIHwgSW1tMTYgfCBJbW0zMikpCi0JJiYgb3ZlcmxhcDAgIT0gSW1tOCAmJiBvdmVybGFwMCAhPSBJbW04UwotCSYmIG92ZXJsYXAwICE9IEltbTE2ICYmIG92ZXJsYXAwICE9IEltbTMyKQotICAgICAgewotCWlmIChpLnN1ZmZpeCkKLQkgIHsKLQkgICBvdmVybGFwMCAmPSAoaS5zdWZmaXggPT0gQllURV9NTkVNX1NVRkZJWCA/IChJbW04IHwgSW1tOFMpIDoKLQkJCShpLnN1ZmZpeCA9PSBXT1JEX01ORU1fU1VGRklYID8gSW1tMTYgOiBJbW0zMikpOwotCSAgfQotCWVsc2UgaWYgKG92ZXJsYXAwID09IChJbW0xNiB8IEltbTMyKSkKLQkgIHsKLQkgICBvdmVybGFwMCA9Ci0JICAgICAgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtEQVRBX1BSRUZJWF0gIT0gMCkpID8gSW1tMTYgOiBJbW0zMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGFzX2JhZCAoXygibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuOyBjYW4ndCBkZXRlcm1pbmUgaW1tZWRpYXRlIHNpemUiKSk7Ci0JICAgIHJldHVybjsKLQkgIH0KLSAgICAgIH0KLSAgICBpZiAoKG92ZXJsYXAxICYgKEltbTggfCBJbW04UyB8IEltbTE2IHwgSW1tMzIpKQotCSYmIG92ZXJsYXAxICE9IEltbTggJiYgb3ZlcmxhcDEgIT0gSW1tOFMKLQkmJiBvdmVybGFwMSAhPSBJbW0xNiAmJiBvdmVybGFwMSAhPSBJbW0zMikKLSAgICAgIHsKLQlpZiAoaS5zdWZmaXgpCi0JICB7Ci0JICAgb3ZlcmxhcDEgJj0gKGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVggPyAoSW1tOCB8IEltbThTKSA6Ci0JCQkoaS5zdWZmaXggPT0gV09SRF9NTkVNX1NVRkZJWCA/IEltbTE2IDogSW1tMzIpKTsKLQkgIH0KLQllbHNlIGlmIChvdmVybGFwMSA9PSAoSW1tMTYgfCBJbW0zMikpCi0JICB7Ci0JICAgb3ZlcmxhcDEgPQotCSAgICAgIChmbGFnXzE2Yml0X2NvZGUgXiAoaS5wcmVmaXhbREFUQV9QUkVGSVhdICE9IDApKSA/IEltbTE2IDogSW1tMzI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBhc19iYWQgKF8oIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbjsgY2FuJ3QgZGV0ZXJtaW5lIGltbWVkaWF0ZSBzaXplIikpOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgYXNzZXJ0ICgob3ZlcmxhcDIgJiBJbW0pID09IDApOwotCi0gICAgaS50eXBlc1swXSA9IG92ZXJsYXAwOwotICAgIGlmIChvdmVybGFwMCAmIEltcGxpY2l0UmVnaXN0ZXIpCi0gICAgICBpLnJlZ19vcGVyYW5kcy0tOwotICAgIGlmIChvdmVybGFwMCAmIEltbTEpCi0gICAgICBpLmltbV9vcGVyYW5kcyA9IDA7CS8qIGtsdWRnZSBmb3Igc2hpZnQgaW5zbnMgKi8KLQotICAgIGkudHlwZXNbMV0gPSBvdmVybGFwMTsKLSAgICBpZiAob3ZlcmxhcDEgJiBJbXBsaWNpdFJlZ2lzdGVyKQotICAgICAgaS5yZWdfb3BlcmFuZHMtLTsKLQotICAgIGkudHlwZXNbMl0gPSBvdmVybGFwMjsKLSAgICBpZiAob3ZlcmxhcDIgJiBJbXBsaWNpdFJlZ2lzdGVyKQotICAgICAgaS5yZWdfb3BlcmFuZHMtLTsKLQotICAgIC8qIEZpbmFsaXplIG9wY29kZS4gIEZpcnN0LCB3ZSBjaGFuZ2UgdGhlIG9wY29kZSBiYXNlZCBvbiB0aGUgb3BlcmFuZAotICAgICAgIHNpemUgZ2l2ZW4gYnkgaS5zdWZmaXg6ICBXZSBuZWVkIG5vdCBjaGFuZ2UgdGhpbmdzIGZvciBieXRlIGluc25zLiAgKi8KLQotICAgIGlmICghaS5zdWZmaXggJiYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVykpCi0gICAgICB7Ci0JYXNfYmFkIChfKCJubyBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXggZ2l2ZW4gYW5kIG5vIHJlZ2lzdGVyIG9wZXJhbmRzOyBjYW4ndCBzaXplIGluc3RydWN0aW9uIikpOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIC8qIEZvciBtb3Z6eCBhbmQgbW92c3gsIG5lZWQgdG8gY2hlY2sgdGhlIHJlZ2lzdGVyIHR5cGUgKi8KLSAgICBpZiAoaW50ZWxfc3ludGF4Ci0gICAgICAgICYmIChpLnRtLmJhc2Vfb3Bjb2RlID09IDB4ZmI2IHx8IGkudG0uYmFzZV9vcGNvZGUgPT0gMHhmYmUpKQotICAgICAgaWYgKGkuc3VmZml4ICYmIGkuc3VmZml4ID09IEJZVEVfTU5FTV9TVUZGSVgpCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBpbnQgcHJlZml4ID0gREFUQV9QUkVGSVhfT1BDT0RFOwotCi0gICAgICAgICAgaWYgKChpLnJlZ3NbMV0tPnJlZ190eXBlICYgUmVnMTYpICE9IDApCi0gICAgICAgICAgICBpZiAoIWFkZF9wcmVmaXggKHByZWZpeCkpCi0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgaWYgKGkuc3VmZml4ICYmIGkuc3VmZml4ICE9IEJZVEVfTU5FTV9TVUZGSVgpCi0gICAgICB7Ci0JLyogSXQncyBub3QgYSBieXRlLCBzZWxlY3Qgd29yZC9kd29yZCBvcGVyYXRpb24uICAqLwotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFcpCi0JICB7Ci0JICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFNob3J0Rm9ybSkKLQkgICAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IDg7Ci0JICAgIGVsc2UKLQkgICAgICBpLnRtLmJhc2Vfb3Bjb2RlIHw9IDE7Ci0JICB9Ci0JLyogTm93IHNlbGVjdCBiZXR3ZWVuIHdvcmQgJiBkd29yZCBvcGVyYXRpb25zIHZpYSB0aGUgb3BlcmFuZAotCSAgIHNpemUgcHJlZml4LCBleGNlcHQgZm9yIGluc3RydWN0aW9ucyB0aGF0IHdpbGwgaWdub3JlIHRoaXMKLQkgICBwcmVmaXggYW55d2F5LiAgKi8KLQlpZiAoKChpbnRlbF9zeW50YXggJiYgKGkuc3VmZml4ID09IElOVEVMX0RXT1JEX01ORU1fU1VGRklYKSkKLSAgICAgICAgICAgICB8fCBpLnN1ZmZpeCA9PSBEV09SRF9NTkVNX1NVRkZJWAotCSAgICAgfHwgaS5zdWZmaXggPT0gTE9OR19NTkVNX1NVRkZJWCkgPT0gZmxhZ18xNmJpdF9jb2RlCi0JICAgICYmICEoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBJZ25vcmVTaXplKSkKLQkgIHsKLQkgICAgdW5zaWduZWQgaW50IHByZWZpeCA9IERBVEFfUFJFRklYX09QQ09ERTsKLQkgICAgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSnVtcEJ5dGUpIC8qIGpjeHosIGxvb3AgKi8KLQkgICAgICBwcmVmaXggPSBBRERSX1BSRUZJWF9PUENPREU7Ci0KLQkgICAgaWYgKCEgYWRkX3ByZWZpeCAocHJlZml4KSkKLQkgICAgICByZXR1cm47Ci0JICB9Ci0JLyogU2l6ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbi4gICovCi0JaWYgKGkuc3VmZml4ID09IExPTkdfTU5FTV9TVUZGSVgKLSAgICAgICAgICAgIHx8IChpbnRlbF9zeW50YXggJiYgaS5zdWZmaXggPT0gSU5URUxfRFdPUkRfTU5FTV9TVUZGSVgpKQotCSAgewotCSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBGbG9hdE1GKQotCSAgICAgIGkudG0uYmFzZV9vcGNvZGUgXj0gNDsKLQkgIH0KLQotICAgICAgICBpZiAoaW50ZWxfc3ludGF4ICYmIGkuc3VmZml4ID09IExPTkdfRE9VQkxFX01ORU1fU1VGRklYKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEZsb2F0TUYpCi0gICAgICAgICAgICAgIGkudG0uYmFzZV9vcGNvZGUgXj0gMjsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICBpZiAoaS50bS5vcGNvZGVfbW9kaWZpZXIgJiBJbW1FeHQpCi0gICAgICB7Ci0JLyogVGhlc2UgQU1EIDNETm93ISBhbmQgSW50ZWwgS2F0bWFpIE5ldyBJbnN0cnVjdGlvbnMgaGF2ZSBhbgotCSAgIG9wY29kZSBzdWZmaXggd2hpY2ggaXMgY29kZWQgaW4gdGhlIHNhbWUgcGxhY2UgYXMgYW4gOC1iaXQKLQkgICBpbW1lZGlhdGUgZmllbGQgd291bGQgYmUuICBIZXJlIHdlIGZha2UgYW4gOC1iaXQgaW1tZWRpYXRlCi0JICAgb3BlcmFuZCBmcm9tIHRoZSBvcGNvZGUgc3VmZml4IHN0b3JlZCBpbiB0bS5leHRlbnNpb25fb3Bjb2RlLiAgKi8KLQotCWV4cHJlc3Npb25TICpleHA7Ci0KLQlhc3NlcnQoaS5pbW1fb3BlcmFuZHMgPT0gMCAmJiBpLm9wZXJhbmRzIDw9IDIpOwotCi0JZXhwID0gJmltX2V4cHJlc3Npb25zW2kuaW1tX29wZXJhbmRzKytdOwotCWkuaW1tc1tpLm9wZXJhbmRzXSA9IGV4cDsKLQlpLnR5cGVzW2kub3BlcmFuZHMrK10gPSBJbW04OwotCWV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JZXhwLT5YX2FkZF9udW1iZXIgPSBpLnRtLmV4dGVuc2lvbl9vcGNvZGU7Ci0JaS50bS5leHRlbnNpb25fb3Bjb2RlID0gTm9uZTsKLSAgICAgIH0KLQotICAgIC8qIEZvciBpbnNucyB3aXRoIG9wZXJhbmRzIHRoZXJlIGFyZSBtb3JlIGRpZGRsZXMgdG8gZG8gdG8gdGhlIG9wY29kZS4gKi8KLSAgICBpZiAoaS5vcGVyYW5kcykKLSAgICAgIHsKLSAgICAgICAgLyogRGVmYXVsdCBzZWdtZW50IHJlZ2lzdGVyIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB1c2UKLQkgICBmb3IgbWVtb3J5IGFjY2Vzc2VzLiAgMCBtZWFucyB1bmtub3duLgotCSAgIFRoaXMgaXMgb25seSBmb3Igb3B0aW1pemluZyBvdXQgdW5uZWNlc3Nhcnkgc2VnbWVudCBvdmVycmlkZXMuICAqLwotCWNvbnN0IHNlZ19lbnRyeSAqZGVmYXVsdF9zZWcgPSAwOwotCi0JLyogSWYgd2UgZm91bmQgYSByZXZlcnNlIG1hdGNoIHdlIG11c3QgYWx0ZXIgdGhlIG9wY29kZQotCSAgIGRpcmVjdGlvbiBiaXQuICBmb3VuZF9yZXZlcnNlX21hdGNoIGhvbGRzIGJpdHMgdG8gY2hhbmdlCi0JICAgKGRpZmZlcmVudCBmb3IgaW50ICYgZmxvYXQgaW5zbnMpLiAgKi8KLQotCWkudG0uYmFzZV9vcGNvZGUgXj0gZm91bmRfcmV2ZXJzZV9tYXRjaDsKLQotCS8qIFRoZSBpbXVsICRpbW0sICVyZWcgaW5zdHJ1Y3Rpb24gaXMgY29udmVydGVkIGludG8KLQkgICBpbXVsICRpbW0sICVyZWcsICVyZWcsIGFuZCB0aGUgY2xyICVyZWcgaW5zdHJ1Y3Rpb24KLQkgICBpcyBjb252ZXJ0ZWQgaW50byB4b3IgJXJlZywgJXJlZy4gICovCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgcmVnS2x1ZGdlKQotCSAgewotCSAgICB1bnNpZ25lZCBpbnQgZmlyc3RfcmVnX29wID0gKGkudHlwZXNbMF0gJiBSZWcpID8gMCA6IDE7Ci0JICAgIC8qIFByZXRlbmQgd2Ugc2F3IHRoZSBleHRyYSByZWdpc3RlciBvcGVyYW5kLiAqLwotCSAgICBpLnJlZ3NbZmlyc3RfcmVnX29wKzFdID0gaS5yZWdzW2ZpcnN0X3JlZ19vcF07Ci0JICAgIGkucmVnX29wZXJhbmRzID0gMjsKLQkgIH0KLQotCWlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIFNob3J0Rm9ybSkKLQkgIHsKLQkgICAgLyogVGhlIHJlZ2lzdGVyIG9yIGZsb2F0IHJlZ2lzdGVyIG9wZXJhbmQgaXMgaW4gb3BlcmFuZCAwIG9yIDEuICovCi0JICAgIHVuc2lnbmVkIGludCBvcCA9IChpLnR5cGVzWzBdICYgKFJlZyB8IEZsb2F0UmVnKSkgPyAwIDogMTsKLQkgICAgLyogUmVnaXN0ZXIgZ29lcyBpbiBsb3cgMyBiaXRzIG9mIG9wY29kZS4gKi8KLQkgICAgaS50bS5iYXNlX29wY29kZSB8PSBpLnJlZ3Nbb3BdLT5yZWdfbnVtOwotCSAgICBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVWdoKSAhPSAwKQotCSAgICAgIHsKLQkJLyogV2FybiBhYm91dCBzb21lIGNvbW1vbiBlcnJvcnMsIGJ1dCBwcmVzcyBvbiByZWdhcmRsZXNzLgotCQkgICBUaGUgZmlyc3QgY2FzZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGdjYyAoPD0gMi44LjEpLiAgKi8KLQkJaWYgKGkub3BlcmFuZHMgPT0gMikKLQkJICB7Ci0JCSAgICAvKiByZXZlcnNlZCBhcmd1bWVudHMgb24gZmFkZHAsIGZzdWJwLCBldGMuICovCi0JCSAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcywlJSVzJyIpLCBpLnRtLm5hbWUsCi0JCQkgICAgIGkucmVnc1sxXS0+cmVnX25hbWUsCi0JCQkgICAgIGkucmVnc1swXS0+cmVnX25hbWUpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIGV4dHJhbmVvdXMgYGwnIHN1ZmZpeCBvbiBmcCBpbnNuICovCi0JCSAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcyciKSwgaS50bS5uYW1lLAotCQkJICAgICBpLnJlZ3NbMF0tPnJlZ19uYW1lKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgTW9kcm0pCi0JICB7Ci0JICAgIC8qIFRoZSBvcGNvZGUgaXMgY29tcGxldGVkIChtb2R1bG8gaS50bS5leHRlbnNpb25fb3Bjb2RlIHdoaWNoCi0JICAgICAgIG11c3QgYmUgcHV0IGludG8gdGhlIG1vZHJtIGJ5dGUpLgotCSAgICAgICBOb3csIHdlIG1ha2UgdGhlIG1vZHJtICYgaW5kZXggYmFzZSBieXRlcyBiYXNlZCBvbiBhbGwgdGhlCi0JICAgICAgIGluZm8gd2UndmUgY29sbGVjdGVkLiAqLwotCi0JICAgIC8qIGkucmVnX29wZXJhbmRzIE1VU1QgYmUgdGhlIG51bWJlciBvZiByZWFsIHJlZ2lzdGVyIG9wZXJhbmRzOwotCSAgICAgICBpbXBsaWNpdCByZWdpc3RlcnMgZG8gbm90IGNvdW50LiAqLwotCSAgICBpZiAoaS5yZWdfb3BlcmFuZHMgPT0gMikKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGludCBzb3VyY2UsIGRlc3Q7Ci0JCXNvdXJjZSA9ICgoaS50eXBlc1swXQotCQkJICAgJiAoUmVnIHwgUmVnTU1YIHwgUmVnWE1NCi0JCQkgICAgICB8IFNSZWcyIHwgU1JlZzMKLQkJCSAgICAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCkpCi0JCQkgID8gMCA6IDEpOwotCQlkZXN0ID0gc291cmNlICsgMTsKLQotCQlpLnJtLm1vZGUgPSAzOwotCQkvKiBPbmUgb2YgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzIHdpbGwgYmUgZW5jb2RlZCBpbiB0aGUKLQkJICAgaS50bS5yZWcgZmllbGQsIHRoZSBvdGhlciBpbiB0aGUgY29tYmluZWQgaS50bS5tb2RlCi0JCSAgIGFuZCBpLnRtLnJlZ21lbSBmaWVsZHMuICBJZiBubyBmb3JtIG9mIHRoaXMKLQkJICAgaW5zdHJ1Y3Rpb24gc3VwcG9ydHMgYSBtZW1vcnkgZGVzdGluYXRpb24gb3BlcmFuZCwKLQkJICAgdGhlbiB3ZSBhc3N1bWUgdGhlIHNvdXJjZSBvcGVyYW5kIG1heSBzb21ldGltZXMgYmUKLQkJICAgYSBtZW1vcnkgb3BlcmFuZCBhbmQgc28gd2UgbmVlZCB0byBzdG9yZSB0aGUKLQkJICAgZGVzdGluYXRpb24gaW4gdGhlIGkucm0ucmVnIGZpZWxkLiAgKi8KLQkJaWYgKChpLnRtLm9wZXJhbmRfdHlwZXNbZGVzdF0gJiBBbnlNZW0pID09IDApCi0JCSAgewotCQkgICAgaS5ybS5yZWcgPSBpLnJlZ3NbZGVzdF0tPnJlZ19udW07Ci0JCSAgICBpLnJtLnJlZ21lbSA9IGkucmVnc1tzb3VyY2VdLT5yZWdfbnVtOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGkucm0ucmVnID0gaS5yZWdzW3NvdXJjZV0tPnJlZ19udW07Ci0JCSAgICBpLnJtLnJlZ21lbSA9IGkucmVnc1tkZXN0XS0+cmVnX251bTsKLQkJICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewkJCS8qIGlmIGl0J3Mgbm90IDIgcmVnIG9wZXJhbmRzLi4uICovCi0JCWlmIChpLm1lbV9vcGVyYW5kcykKLQkJICB7Ci0JCSAgICB1bnNpZ25lZCBpbnQgZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDA7Ci0JCSAgICB1bnNpZ25lZCBpbnQgb3AgPSAoKGkudHlwZXNbMF0gJiBBbnlNZW0pCi0JCQkJICAgICAgID8gMAotCQkJCSAgICAgICA6IChpLnR5cGVzWzFdICYgQW55TWVtKSA/IDEgOiAyKTsKLQotCQkgICAgZGVmYXVsdF9zZWcgPSAmZHM7Ci0KLQkJICAgIGlmICghIGkuYmFzZV9yZWcpCi0JCSAgICAgIHsKLQkJCWkucm0ubW9kZSA9IDA7Ci0JCQlpZiAoISBpLmRpc3Bfb3BlcmFuZHMpCi0JCQkgIGZha2VfemVyb19kaXNwbGFjZW1lbnQgPSAxOwotCQkJaWYgKCEgaS5pbmRleF9yZWcpCi0JCQkgIHsKLQkJCSAgICAvKiBPcGVyYW5kIGlzIGp1c3QgPGRpc3A+ICovCi0JCQkgICAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkpCi0JCQkgICAgICB7Ci0JCQkJaS5ybS5yZWdtZW0gPSBOT19CQVNFX1JFR0lTVEVSXzE2OwotCQkJCWkudHlwZXNbb3BdICY9IH5EaXNwOwotCQkJCWkudHlwZXNbb3BdIHw9IERpc3AxNjsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkJaS5ybS5yZWdtZW0gPSBOT19CQVNFX1JFR0lTVEVSOwotCQkJCWkudHlwZXNbb3BdICY9IH5EaXNwOwotCQkJCWkudHlwZXNbb3BdIHw9IERpc3AzMjsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkJZWxzZSAvKiAhIGkuYmFzZV9yZWcgJiYgaS5pbmRleF9yZWcgKi8KLQkJCSAgewotCQkJICAgIGkuc2liLmluZGV4ID0gaS5pbmRleF9yZWctPnJlZ19udW07Ci0JCQkgICAgaS5zaWIuYmFzZSA9IE5PX0JBU0VfUkVHSVNURVI7Ci0JCQkgICAgaS5zaWIuc2NhbGUgPSBpLmxvZzJfc2NhbGVfZmFjdG9yOwotCQkJICAgIGkucm0ucmVnbWVtID0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkc7Ci0JCQkgICAgaS50eXBlc1tvcF0gJj0gfkRpc3A7Ci0JCQkgICAgaS50eXBlc1tvcF0gfD0gRGlzcDMyOwkvKiBNdXN0IGJlIDMyIGJpdCAqLwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMTYpCi0JCSAgICAgIHsKLQkJCXN3aXRjaCAoaS5iYXNlX3JlZy0+cmVnX251bSkKLQkJCSAgewotCQkJICBjYXNlIDM6IC8qICglYngpICovCi0JCQkgICAgaWYgKCEgaS5pbmRleF9yZWcpCi0JCQkgICAgICBpLnJtLnJlZ21lbSA9IDc7Ci0JCQkgICAgZWxzZSAvKiAoJWJ4LCVzaSkgLT4gMCwgb3IgKCVieCwlZGkpIC0+IDEgKi8KLQkJCSAgICAgIGkucm0ucmVnbWVtID0gaS5pbmRleF9yZWctPnJlZ19udW0gLSA2OwotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlIDU6IC8qICglYnApICovCi0JCQkgICAgZGVmYXVsdF9zZWcgPSAmc3M7Ci0JCQkgICAgaWYgKCEgaS5pbmRleF9yZWcpCi0JCQkgICAgICB7Ci0JCQkJaS5ybS5yZWdtZW0gPSA2OwotCQkJCWlmICgoaS50eXBlc1tvcF0gJiBEaXNwKSA9PSAwKQotCQkJCSAgewotCQkJCSAgICAvKiBmYWtlICglYnApIGludG8gMCglYnApICovCi0JCQkJICAgIGkudHlwZXNbb3BdIHw9IERpc3A4OwotCQkJCSAgICBmYWtlX3plcm9fZGlzcGxhY2VtZW50ID0gMTsKLQkJCQkgIH0KLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlIC8qICglYnAsJXNpKSAtPiAyLCBvciAoJWJwLCVkaSkgLT4gMyAqLwotCQkJICAgICAgaS5ybS5yZWdtZW0gPSBpLmluZGV4X3JlZy0+cmVnX251bSAtIDYgKyAyOwotCQkJICAgIGJyZWFrOwotCQkJICBkZWZhdWx0OiAvKiAoJXNpKSAtPiA0IG9yICglZGkpIC0+IDUgKi8KLQkJCSAgICBpLnJtLnJlZ21lbSA9IGkuYmFzZV9yZWctPnJlZ19udW0gLSA2ICsgNDsKLQkJCSAgfQotCQkJaS5ybS5tb2RlID0gbW9kZV9mcm9tX2Rpc3Bfc2l6ZSAoaS50eXBlc1tvcF0pOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIC8qIGkuYmFzZV9yZWcgYW5kIDMyIGJpdCBtb2RlICovCi0JCSAgICAgIHsKLQkJCWkucm0ucmVnbWVtID0gaS5iYXNlX3JlZy0+cmVnX251bTsKLQkJCWkuc2liLmJhc2UgPSBpLmJhc2VfcmVnLT5yZWdfbnVtOwotCQkJaWYgKGkuYmFzZV9yZWctPnJlZ19udW0gPT0gRUJQX1JFR19OVU0pCi0JCQkgIHsKLQkJCSAgICBkZWZhdWx0X3NlZyA9ICZzczsKLQkJCSAgICBpZiAoaS5kaXNwX29wZXJhbmRzID09IDApCi0JCQkgICAgICB7Ci0JCQkJZmFrZV96ZXJvX2Rpc3BsYWNlbWVudCA9IDE7Ci0JCQkJaS50eXBlc1tvcF0gfD0gRGlzcDg7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKGkuYmFzZV9yZWctPnJlZ19udW0gPT0gRVNQX1JFR19OVU0pCi0JCQkgIHsKLQkJCSAgICBkZWZhdWx0X3NlZyA9ICZzczsKLQkJCSAgfQotCQkJaS5zaWIuc2NhbGUgPSBpLmxvZzJfc2NhbGVfZmFjdG9yOwotCQkJaWYgKCEgaS5pbmRleF9yZWcpCi0JCQkgIHsKLQkJCSAgICAvKiA8ZGlzcD4oJWVzcCkgYmVjb21lcyB0d28gYnl0ZSBtb2RybQotCQkJICAgICAgIHdpdGggbm8gaW5kZXggcmVnaXN0ZXIuICBXZSd2ZSBhbHJlYWR5Ci0JCQkgICAgICAgc3RvcmVkIHRoZSBjb2RlIGZvciBlc3AgaW4gaS5ybS5yZWdtZW0KLQkJCSAgICAgICBpZS4gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkcuICBBbnkKLQkJCSAgICAgICBiYXNlIHJlZ2lzdGVyIGJlc2lkZXMgJWVzcCB3aWxsIG5vdCB1c2UKLQkJCSAgICAgICB0aGUgZXh0cmEgbW9kcm0gYnl0ZS4gICovCi0JCQkgICAgaS5zaWIuaW5kZXggPSBOT19JTkRFWF9SRUdJU1RFUjsKLSNpZiAhIFNDQUxFMV9XSEVOX05PX0lOREVYCi0JCQkgICAgLyogQW5vdGhlciBjYXNlIHdoZXJlIHdlIGZvcmNlIHRoZSBzZWNvbmQKLQkJCSAgICAgICBtb2RybSBieXRlLiAgKi8KLQkJCSAgICBpZiAoaS5sb2cyX3NjYWxlX2ZhY3RvcikKLQkJCSAgICAgIGkucm0ucmVnbWVtID0gRVNDQVBFX1RPX1RXT19CWVRFX0FERFJFU1NJTkc7Ci0jZW5kaWYKLQkJCSAgfQotCQkJZWxzZQotCQkJICB7Ci0JCQkgICAgaS5zaWIuaW5kZXggPSBpLmluZGV4X3JlZy0+cmVnX251bTsKLQkJCSAgICBpLnJtLnJlZ21lbSA9IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HOwotCQkJICB9Ci0JCQlpLnJtLm1vZGUgPSBtb2RlX2Zyb21fZGlzcF9zaXplIChpLnR5cGVzW29wXSk7Ci0JCSAgICAgIH0KLQotCQkgICAgaWYgKGZha2VfemVyb19kaXNwbGFjZW1lbnQpCi0JCSAgICAgIHsKLQkJCS8qIEZha2VzIGEgemVybyBkaXNwbGFjZW1lbnQgYXNzdW1pbmcgdGhhdCBpLnR5cGVzW29wXQotCQkJICAgaG9sZHMgdGhlIGNvcnJlY3QgZGlzcGxhY2VtZW50IHNpemUuICovCi0JCQlleHAgPSAmZGlzcF9leHByZXNzaW9uc1tpLmRpc3Bfb3BlcmFuZHMrK107Ci0JCQlpLmRpc3BzW29wXSA9IGV4cDsKLQkJCWV4cC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JCQlleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JCQlleHAtPlhfYWRkX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0JCQlleHAtPlhfb3Bfc3ltYm9sID0gKHN5bWJvbFMgKikgMDsKLQkJICAgICAgfQotCQkgIH0KLQotCQkvKiBGaWxsIGluIGkucm0ucmVnIG9yIGkucm0ucmVnbWVtIGZpZWxkIHdpdGggcmVnaXN0ZXIKLQkJICAgb3BlcmFuZCAoaWYgYW55KSBiYXNlZCBvbiBpLnRtLmV4dGVuc2lvbl9vcGNvZGUuCi0JCSAgIEFnYWluLCB3ZSBtdXN0IGJlIGNhcmVmdWwgdG8gbWFrZSBzdXJlIHRoYXQKLQkJICAgc2VnbWVudC9jb250cm9sL2RlYnVnL3Rlc3QvTU1YIHJlZ2lzdGVycyBhcmUgY29kZWQKLQkJICAgaW50byB0aGUgaS5ybS5yZWcgZmllbGQuICovCi0JCWlmIChpLnJlZ19vcGVyYW5kcykKLQkJICB7Ci0JCSAgICB1bnNpZ25lZCBpbnQgb3AgPQotCQkgICAgICAoKGkudHlwZXNbMF0KLQkJCSYgKFJlZyB8IFJlZ01NWCB8IFJlZ1hNTQotCQkJICAgfCBTUmVnMiB8IFNSZWczCi0JCQkgICB8IENvbnRyb2wgfCBEZWJ1ZyB8IFRlc3QpKQotCQkgICAgICAgPyAwCi0JCSAgICAgICA6ICgoaS50eXBlc1sxXQotCQkJICAgJiAoUmVnIHwgUmVnTU1YIHwgUmVnWE1NCi0JCQkgICAgICB8IFNSZWcyIHwgU1JlZzMKLQkJCSAgICAgIHwgQ29udHJvbCB8IERlYnVnIHwgVGVzdCkpCi0JCQkgID8gMQotCQkJICA6IDIpKTsKLQkJICAgIC8qIElmIHRoZXJlIGlzIGFuIGV4dGVuc2lvbiBvcGNvZGUgdG8gcHV0IGhlcmUsIHRoZQotCQkgICAgICAgcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgcHV0IGludG8gdGhlIHJlZ21lbSBmaWVsZC4gKi8KLQkJICAgIGlmIChpLnRtLmV4dGVuc2lvbl9vcGNvZGUgIT0gTm9uZSkKLQkJICAgICAgaS5ybS5yZWdtZW0gPSBpLnJlZ3Nbb3BdLT5yZWdfbnVtOwotCQkgICAgZWxzZQotCQkgICAgICBpLnJtLnJlZyA9IGkucmVnc1tvcF0tPnJlZ19udW07Ci0KLQkJICAgIC8qIE5vdywgaWYgbm8gbWVtb3J5IG9wZXJhbmQgaGFzIHNldCBpLnJtLm1vZGUgPSAwLCAxLCAyCi0JCSAgICAgICB3ZSBtdXN0IHNldCBpdCB0byAzIHRvIGluZGljYXRlIHRoaXMgaXMgYSByZWdpc3RlcgotCQkgICAgICAgb3BlcmFuZCBpbiB0aGUgcmVnbWVtIGZpZWxkLiAgKi8KLQkJICAgIGlmICghaS5tZW1fb3BlcmFuZHMpCi0JCSAgICAgIGkucm0ubW9kZSA9IDM7Ci0JCSAgfQotCi0JCS8qIEZpbGwgaW4gaS5ybS5yZWcgZmllbGQgd2l0aCBleHRlbnNpb24gb3Bjb2RlIChpZiBhbnkpLiAqLwotCQlpZiAoaS50bS5leHRlbnNpb25fb3Bjb2RlICE9IE5vbmUpCi0JCSAgaS5ybS5yZWcgPSBpLnRtLmV4dGVuc2lvbl9vcGNvZGU7Ci0JICAgICAgfQotCSAgfQotCWVsc2UgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgKFNlZzJTaG9ydEZvcm0gfCBTZWczU2hvcnRGb3JtKSkKLQkgIHsKLQkgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gUE9QX1NFR19TSE9SVCAmJiBpLnJlZ3NbMF0tPnJlZ19udW0gPT0gMSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygieW91IGNhbid0IGBwb3AgJSVjcyciKSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIGkudG0uYmFzZV9vcGNvZGUgfD0gKGkucmVnc1swXS0+cmVnX251bSA8PCAzKTsKLQkgIH0KLQllbHNlIGlmICgoaS50bS5iYXNlX29wY29kZSAmIH4oRHxXKSkgPT0gTU9WX0FYX0RJU1AzMikKLQkgIHsKLQkgICAgZGVmYXVsdF9zZWcgPSAmZHM7Ci0JICB9Ci0JZWxzZSBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgSXNTdHJpbmcpICE9IDApCi0JICB7Ci0JICAgIC8qIEZvciB0aGUgc3RyaW5nIGluc3RydWN0aW9ucyB0aGF0IGFsbG93IGEgc2VnbWVudCBvdmVycmlkZQotCSAgICAgICBvbiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMsIHRoZSBkZWZhdWx0IHNlZ21lbnQgaXMgZHMuICAqLwotCSAgICBkZWZhdWx0X3NlZyA9ICZkczsKLQkgIH0KLQotCS8qIElmIGEgc2VnbWVudCB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQsCi0JICAgYW5kIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBpcyBub3QgdGhlIGRlZmF1bHQsCi0JICAgdXNlIGFuIG9wY29kZSBwcmVmaXggdG8gc2VsZWN0IGl0LgotCSAgIElmIHdlIG5ldmVyIGZpZ3VyZWQgb3V0IHdoYXQgdGhlIGRlZmF1bHQgc2VnbWVudCBpcywKLQkgICB0aGVuIGRlZmF1bHRfc2VnIHdpbGwgYmUgemVybyBhdCB0aGlzIHBvaW50LAotCSAgIGFuZCB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgcHJlZml4IHdpbGwgYWx3YXlzIGJlIHVzZWQuICAqLwotCWlmICgoaS5zZWdbMF0pICYmIChpLnNlZ1swXSAhPSBkZWZhdWx0X3NlZykpCi0JICB7Ci0JICAgIGlmICghIGFkZF9wcmVmaXggKGkuc2VnWzBdLT5zZWdfcHJlZml4KSkKLQkgICAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgVWdoKSAhPSAwKQotICAgICAgewotICAgICAgIC8qIFVuaXhXYXJlIGZzdWIgbm8gYXJncyBpcyBhbGlhcyBmb3IgZnN1YnAsIGZhZGQgLT4gZmFkZHAsIGV0YyAqLwotICAgICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIHRvIGAlc3AnIiksIGkudG0ubmFtZSk7Ci0gICAgICB9Ci0gIH0KLQotICAvKiBIYW5kbGUgY29udmVyc2lvbiBvZiAnaW50ICQzJyAtLT4gc3BlY2lhbCBpbnQzIGluc24uICovCi0gIGlmIChpLnRtLmJhc2Vfb3Bjb2RlID09IElOVF9PUENPREUgJiYgaS5pbW1zWzBdLT5YX2FkZF9udW1iZXIgPT0gMykKLSAgICB7Ci0gICAgICBpLnRtLmJhc2Vfb3Bjb2RlID0gSU5UM19PUENPREU7Ci0gICAgICBpLmltbV9vcGVyYW5kcyA9IDA7Ci0gICAgfQotCi0gIC8qIFdlIGFyZSByZWFkeSB0byBvdXRwdXQgdGhlIGluc24uICovCi0gIHsKLSAgICByZWdpc3RlciBjaGFyICpwOwotCi0gICAgLyogT3V0cHV0IGp1bXBzLiAqLwotICAgIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEp1bXApCi0gICAgICB7Ci0JbG9uZyBuID0gKGxvbmcpIGkuZGlzcHNbMF0tPlhfYWRkX251bWJlcjsKLQlpbnQgcHJlZml4ID0gKGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwKTsKLQlpbnQgY29kZTE2ID0gMDsKLQotCWlmIChwcmVmaXgpCi0JICB7Ci0JICAgIGkucHJlZml4ZXMgLT0gMTsKLQkgICAgY29kZTE2ID0gQ09ERTE2OwotCSAgfQotCWlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICBjb2RlMTYgXj0gQ09ERTE2OwotCi0JaWYgKCFpbnRlbF9zeW50YXggJiYgKGkucHJlZml4ZXMgIT0gMCkpCi0JICBhc193YXJuIChfKCJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIikpOwotCi0JaWYgKGkuZGlzcHNbMF0tPlhfb3AgPT0gT19jb25zdGFudCkKLQkgIHsKLQkgICAgaWYgKGZpdHNfaW5fc2lnbmVkX2J5dGUgKG4pKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDI7Ci0JCXAgPSBmcmFnX21vcmUgKDIpOwotCQlwWzBdID0gaS50bS5iYXNlX29wY29kZTsKLQkJcFsxXSA9IG47Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCSAgICAgICAgLyogVXNlIDE2LWJpdCBqdW1wcyBvbmx5IGZvciAxNi1iaXQgY29kZSwKLQkJICAgYmVjYXVzZSB0ZXh0IHNlZ21lbnRzIGFyZSBsaW1pdGVkIHRvIDY0SyBhbnl3YXk7Ci0JICAgICAgICAgICBVc2UgMzItYml0IGp1bXBzIGZvciAzMi1iaXQgY29kZSwgYmVjYXVzZSB0aGV5J3JlIGZhc3RlciwKLQkJICAgYW5kIGEgMTYtYml0IGp1bXAgd2lsbCBjbGVhciB0aGUgdG9wIDE2IGJpdHMgb2YgJWVpcC4gICovCi0JCWludCBqbXBfc2l6ZSA9IGNvZGUxNiA/IDIgOiA0OwotCSAgICAgIAlpZiAoY29kZTE2ICYmICFmaXRzX2luX3NpZ25lZF93b3JkIChuKSkKLQkJICB7Ci0JCSAgICBhc19iYWQgKF8oIjE2LWJpdCBqdW1wIG91dCBvZiByYW5nZSIpKTsKLQkJICAgIHJldHVybjsKLQkJICB9Ci0KLQkJaWYgKGkudG0uYmFzZV9vcGNvZGUgPT0gSlVNUF9QQ19SRUxBVElWRSkKLQkJICB7CQkvKiBwYWNlICovCi0JCSAgICAvKiB1bmNvbmRpdGlvbmFsIGp1bXAgKi8KLQkJICAgIGluc25fc2l6ZSArPSBwcmVmaXggKyAxICsgam1wX3NpemU7Ci0JCSAgICBwID0gZnJhZ19tb3JlIChwcmVmaXggKyAxICsgam1wX3NpemUpOwotCQkgICAgaWYgKHByZWZpeCkKLQkJICAgICAgKnArKyA9IERBVEFfUFJFRklYX09QQ09ERTsKLQkJICAgICpwKysgPSAoY2hhcikgMHhlOTsKLQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgbiwgam1wX3NpemUpOwotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIC8qIGNvbmRpdGlvbmFsIGp1bXAgKi8KLQkJICAgIGluc25fc2l6ZSArPSBwcmVmaXggKyAyICsgam1wX3NpemU7Ci0JCSAgICBwID0gZnJhZ19tb3JlIChwcmVmaXggKyAyICsgam1wX3NpemUpOwotCQkgICAgaWYgKHByZWZpeCkKLQkJICAgICAgKnArKyA9IERBVEFfUFJFRklYX09QQ09ERTsKLQkJICAgICpwKysgPSBUV09fQllURV9PUENPREVfRVNDQVBFOwotCQkgICAgKnArKyA9IGkudG0uYmFzZV9vcGNvZGUgKyAweDEwOwotCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBuLCBqbXBfc2l6ZSk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGludCBzaXplID0gY29kZTE2ID8gMiA6IDQ7Ci0KLQkgICAgLyogSXQncyBhIHN5bWJvbDsgZW5kIGZyYWcgJiBzZXR1cCBmb3IgcmVsYXguCi0JICAgICAgIE1ha2Ugc3VyZSB0aGVyZSBhcmUgbW9yZSB0aGFuIDYgY2hhcnMgbGVmdCBpbiB0aGUgY3VycmVudCBmcmFnOwotCSAgICAgICBpZiBub3Qgd2UnbGwgaGF2ZSB0byBzdGFydCBhIG5ldyBvbmUuICovCi0JICAgIGZyYWdfZ3JvdyAocHJlZml4ICsgMSArIDIgKyBzaXplKTsKLQkgICAgaW5zbl9zaXplICs9IDEgKyBwcmVmaXg7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDEgKyBwcmVmaXgpOwotCSAgICBpZiAocHJlZml4KQotCSAgICAgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JICAgICpwID0gaS50bS5iYXNlX29wY29kZTsKLQkgICAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkgICAgICBwcmVmaXggKyAyICsgc2l6ZSwgLyogMiBvcGNvZGUvcHJlZml4ICsgZGlzcGxhY2VtZW50ICovCi0JCSAgICAgIDEsCi0JCSAgICAgICgodW5zaWduZWQgY2hhcikgKnAgPT0gSlVNUF9QQ19SRUxBVElWRQotCQkgICAgICAgPyBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBTTUFMTCkgfCBjb2RlMTYKLQkJICAgICAgIDogRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMKSB8IGNvZGUxNiksCi0JCSAgICAgIGkuZGlzcHNbMF0tPlhfYWRkX3N5bWJvbCwKLQkJICAgICAgKG9mZnNldFQpIG4sIHApOwotCSAgfQotICAgICAgfQotICAgIGVsc2UgaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgKEp1bXBCeXRlIHwgSnVtcER3b3JkKSkKLSAgICAgIHsKLQlpbnQgc2l6ZSA9IChpLnRtLm9wY29kZV9tb2RpZmllciAmIEp1bXBCeXRlKSA/IDEgOiA0OwotCWxvbmcgbiA9IChsb25nKSBpLmRpc3BzWzBdLT5YX2FkZF9udW1iZXI7Ci0KLQlpZiAoc2l6ZSA9PSAxKSAvKiB0aGVuIHRoaXMgaXMgYSBsb29wIG9yIGplY3h6IHR5cGUgaW5zdHJ1Y3Rpb24gKi8KLQkgIHsKLQkgICAgaWYgKGkucHJlZml4W0FERFJfUFJFRklYXSkKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAxOwotCQlGUkFHX0FQUEVORF8xX0NIQVIgKEFERFJfUFJFRklYX09QQ09ERSk7Ci0JCWkucHJlZml4ZXMgLT0gMTsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpbnQgY29kZTE2ID0gMDsKLQotCSAgICBpZiAoaS5wcmVmaXhbREFUQV9QUkVGSVhdKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDE7Ci0JCUZSQUdfQVBQRU5EXzFfQ0hBUiAoREFUQV9QUkVGSVhfT1BDT0RFKTsKLQkJaS5wcmVmaXhlcyAtPSAxOwotCQljb2RlMTYgPSBDT0RFMTY7Ci0JICAgICAgfQotCSAgICBpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgICAgIGNvZGUxNiBePSBDT0RFMTY7Ci0KLQkgICAgaWYgKGNvZGUxNikKLQkgICAgICBzaXplID0gMjsKLQkgIH0KLQotCWlmICghaW50ZWxfc3ludGF4ICYmIChpLnByZWZpeGVzICE9IDApKQotCSAgYXNfd2FybiAoXygic2tpcHBpbmcgcHJlZml4ZXMgb24gdGhpcyBpbnN0cnVjdGlvbiIpKTsKLQotCWlmIChmaXRzX2luX3Vuc2lnbmVkX2J5dGUgKGkudG0uYmFzZV9vcGNvZGUpKQotCSAgewotCSAgICBpbnNuX3NpemUgKz0gMSArIHNpemU7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDEgKyBzaXplKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAyICsgc2l6ZTsJLyogb3Bjb2RlIGNhbiBiZSBhdCBtb3N0IHR3byBieXRlcyAqLwotCSAgICBwID0gZnJhZ19tb3JlICgyICsgc2l6ZSk7Ci0JICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiA4KSAmIDB4ZmY7Ci0JICB9Ci0JKnArKyA9IGkudG0uYmFzZV9vcGNvZGUgJiAweGZmOwotCi0JaWYgKGkuZGlzcHNbMF0tPlhfb3AgPT0gT19jb25zdGFudCkKLQkgIHsKLQkgICAgaWYgKHNpemUgPT0gMSAmJiAhZml0c19pbl9zaWduZWRfYnl0ZSAobikpCi0JICAgICAgewotCQlhc19iYWQgKF8oImAlcycgb25seSB0YWtlcyBieXRlIGRpc3BsYWNlbWVudDsgJWxkIHNob3J0ZW5lZCB0byAlZCIpLAotCQkJaS50bS5uYW1lLCBuLCAqcCk7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChzaXplID09IDIgJiYgIWZpdHNfaW5fc2lnbmVkX3dvcmQgKG4pKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCIxNi1iaXQganVtcCBvdXQgb2YgcmFuZ2UiKSk7Ci0JCXJldHVybjsKLQkgICAgICB9Ci0JICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgbiwgc2l6ZSk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgc2l6ZSwKLQkJCSBpLmRpc3BzWzBdLCAxLCByZWxvYyAoc2l6ZSwgMSwgaS5kaXNwX3JlbG9jWzBdKSk7Ci0KLQkgIH0KLSAgICAgIH0KLSAgICBlbHNlIGlmIChpLnRtLm9wY29kZV9tb2RpZmllciAmIEp1bXBJbnRlclNlZ21lbnQpCi0gICAgICB7Ci0JaW50IHNpemU7Ci0JaW50IHJlbG9jX3R5cGU7Ci0JaW50IHByZWZpeCA9IGkucHJlZml4W0RBVEFfUFJFRklYXSAhPSAwOwotCWludCBjb2RlMTYgPSAwOwotCi0JaWYgKHByZWZpeCkKLQkgIHsKLQkgICAgY29kZTE2ID0gQ09ERTE2OwotCSAgICBpLnByZWZpeGVzIC09IDE7Ci0JICB9Ci0JaWYgKGZsYWdfMTZiaXRfY29kZSkKLQkgIGNvZGUxNiBePSBDT0RFMTY7Ci0KLQlzaXplID0gNDsKLQlyZWxvY190eXBlID0gQkZEX1JFTE9DXzMyOwotCWlmIChjb2RlMTYpCi0JICB7Ci0JICAgIHNpemUgPSAyOwotCSAgICByZWxvY190eXBlID0gQkZEX1JFTE9DXzE2OwotCSAgfQotCi0JaWYgKCFpbnRlbF9zeW50YXggJiYgKGkucHJlZml4ZXMgIT0gMCkpCi0JICBhc193YXJuIChfKCJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIikpOwotCi0JaW5zbl9zaXplICs9IHByZWZpeCArIDEgKyAyICsgc2l6ZTsgIC8qIDEgb3Bjb2RlOyAyIHNlZ21lbnQ7IG9mZnNldCAqLwotCXAgPSBmcmFnX21vcmUgKHByZWZpeCArIDEgKyAyICsgc2l6ZSk7Ci0JaWYgKHByZWZpeCkKLQkgICpwKysgPSBEQVRBX1BSRUZJWF9PUENPREU7Ci0JKnArKyA9IGkudG0uYmFzZV9vcGNvZGU7Ci0JaWYgKGkuaW1tc1sxXS0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgewotCSAgICBsb25nIG4gPSAobG9uZykgaS5pbW1zWzFdLT5YX2FkZF9udW1iZXI7Ci0KLQkgICAgaWYgKHNpemUgPT0gMiAmJiAhZml0c19pbl91bnNpZ25lZF93b3JkIChuKSkKLQkgICAgICB7Ci0JCWFzX2JhZCAoXygiMTYtYml0IGp1bXAgb3V0IG9mIHJhbmdlIikpOwotCQlyZXR1cm47Ci0JICAgICAgfQotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIG4sIHNpemUpOwotCSAgfQotCWVsc2UKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLAotCQkgICAgICAgaS5pbW1zWzFdLCAwLCByZWxvY190eXBlKTsKLQlpZiAoaS5pbW1zWzBdLT5YX29wICE9IE9fY29uc3RhbnQpCi0JICBhc19iYWQgKF8oImNhbid0IGhhbmRsZSBub24gYWJzb2x1dGUgc2VnbWVudCBpbiBgJXMnIiksCi0JCSAgaS50bS5uYW1lKTsKLQltZF9udW1iZXJfdG9fY2hhcnMgKHAgKyBzaXplLCAodmFsdWVUKSBpLmltbXNbMF0tPlhfYWRkX251bWJlciwgMik7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCS8qIE91dHB1dCBub3JtYWwgaW5zdHJ1Y3Rpb25zIGhlcmUuICovCi0JdW5zaWduZWQgY2hhciAqcTsKLQotCS8qIFRoZSBwcmVmaXggYnl0ZXMuICovCi0JZm9yIChxID0gaS5wcmVmaXg7Ci0JICAgICBxIDwgaS5wcmVmaXggKyBzaXplb2YgKGkucHJlZml4KSAvIHNpemVvZiAoaS5wcmVmaXhbMF0pOwotCSAgICAgcSsrKQotCSAgewotCSAgICBpZiAoKnEpCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJcCA9IGZyYWdfbW9yZSAoMSk7Ci0JCW1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgKnEsIDEpOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIE5vdyB0aGUgb3Bjb2RlOyBiZSBjYXJlZnVsIGFib3V0IHdvcmQgb3JkZXIgaGVyZSEgKi8KLQlpZiAoZml0c19pbl91bnNpZ25lZF9ieXRlIChpLnRtLmJhc2Vfb3Bjb2RlKSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDE7Ci0JICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoaS50bS5iYXNlX29wY29kZSk7Ci0JICB9Ci0JZWxzZSBpZiAoZml0c19pbl91bnNpZ25lZF93b3JkIChpLnRtLmJhc2Vfb3Bjb2RlKSkKLQkgIHsKLQkgICAgaW5zbl9zaXplICs9IDI7Ci0JICAgIHAgPSBmcmFnX21vcmUgKDIpOwotCSAgICAvKiBwdXQgb3V0IGhpZ2ggYnl0ZSBmaXJzdDogY2FuJ3QgdXNlIG1kX251bWJlcl90b19jaGFycyEgKi8KLQkgICAgKnArKyA9IChpLnRtLmJhc2Vfb3Bjb2RlID4+IDgpICYgMHhmZjsKLQkgICAgKnAgPSBpLnRtLmJhc2Vfb3Bjb2RlICYgMHhmZjsKLQkgIH0KLQllbHNlCi0JICB7CQkJLyogb3Bjb2RlIGlzIGVpdGhlciAzIG9yIDQgYnl0ZXMgKi8KLQkgICAgaWYgKGkudG0uYmFzZV9vcGNvZGUgJiAweGZmMDAwMDAwKQotCSAgICAgIHsKLQkJaW5zbl9zaXplICs9IDQ7Ci0JCXAgPSBmcmFnX21vcmUgKDQpOwotCQkqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gMjQpICYgMHhmZjsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWluc25fc2l6ZSArPSAzOwotCQlwID0gZnJhZ19tb3JlICgzKTsKLQkgICAgICB9Ci0JICAgICpwKysgPSAoaS50bS5iYXNlX29wY29kZSA+PiAxNikgJiAweGZmOwotCSAgICAqcCsrID0gKGkudG0uYmFzZV9vcGNvZGUgPj4gOCkgJiAweGZmOwotCSAgICAqcCA9IChpLnRtLmJhc2Vfb3Bjb2RlKSAmIDB4ZmY7Ci0JICB9Ci0KLQkvKiBOb3cgdGhlIG1vZHJtIGJ5dGUgYW5kIHNpYiBieXRlIChpZiBwcmVzZW50KS4gICovCi0JaWYgKGkudG0ub3Bjb2RlX21vZGlmaWVyICYgTW9kcm0pCi0JICB7Ci0JICAgIGluc25fc2l6ZSArPSAxOwotCSAgICBwID0gZnJhZ19tb3JlICgxKTsKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCSh2YWx1ZVQpIChpLnJtLnJlZ21lbSA8PCAwCi0JCQkJCSAgfCBpLnJtLnJlZyA8PCAzCi0JCQkJCSAgfCBpLnJtLm1vZGUgPDwgNiksCi0JCQkJMSk7Ci0JICAgIC8qIElmIGkucm0ucmVnbWVtID09IEVTUCAoNCkKLQkgICAgICAgJiYgaS5ybS5tb2RlICE9IChSZWdpc3RlciBtb2RlKQotCSAgICAgICAmJiBub3QgMTYgYml0Ci0JICAgICAgID09PiBuZWVkIHNlY29uZCBtb2RybSBieXRlLiAgKi8KLQkgICAgaWYgKGkucm0ucmVnbWVtID09IEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HCi0JCSYmIGkucm0ubW9kZSAhPSAzCi0JCSYmICEoaS5iYXNlX3JlZyAmJiAoaS5iYXNlX3JlZy0+cmVnX3R5cGUgJiBSZWcxNikgIT0gMCkpCi0JICAgICAgewotCQlpbnNuX3NpemUgKz0gMTsKLQkJcCA9IGZyYWdfbW9yZSAoMSk7Ci0JCW1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkgICAgKHZhbHVlVCkgKGkuc2liLmJhc2UgPDwgMAotCQkJCQkgICAgICB8IGkuc2liLmluZGV4IDw8IDMKLQkJCQkJICAgICAgfCBpLnNpYi5zY2FsZSA8PCA2KSwKLQkJCQkgICAgMSk7Ci0JICAgICAgfQotCSAgfQotCi0JaWYgKGkuZGlzcF9vcGVyYW5kcykKLQkgIHsKLQkgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IG47Ci0KLQkgICAgZm9yIChuID0gMDsgbiA8IGkub3BlcmFuZHM7IG4rKykKLQkgICAgICB7Ci0JCWlmIChpLmRpc3BzW25dKQotCQkgIHsKLQkJICAgIGlmIChpLmRpc3BzW25dLT5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICAgIHsKLQkJCWlmIChpLnR5cGVzW25dICYgRGlzcDgpCi0JCQkgIHsKLQkJCSAgICBpbnNuX3NpemUgKz0gMTsKLQkJCSAgICBwID0gZnJhZ19tb3JlICgxKTsKLQkJCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsCi0JCQkJCQkodmFsdWVUKSBpLmRpc3BzW25dLT5YX2FkZF9udW1iZXIsCi0JCQkJCQkxKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoaS50eXBlc1tuXSAmIERpc3AxNikKLQkJCSAgewotCQkJICAgIGluc25fc2l6ZSArPSAyOwotCQkJICAgIHAgPSBmcmFnX21vcmUgKDIpOwotCQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkJCSh2YWx1ZVQpIGkuZGlzcHNbbl0tPlhfYWRkX251bWJlciwKLQkJCQkJCTIpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsJLyogRGlzcDMyICovCi0JCQkgICAgaW5zbl9zaXplICs9IDQ7Ci0JCQkgICAgcCA9IGZyYWdfbW9yZSAoNCk7Ci0JCQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLAotCQkJCQkJKHZhbHVlVCkgaS5kaXNwc1tuXS0+WF9hZGRfbnVtYmVyLAotCQkJCQkJNCk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoaS50eXBlc1tuXSAmIERpc3AzMikKLQkJICAgICAgewotCQkJaW5zbl9zaXplICs9IDQ7Ci0JCQlwID0gZnJhZ19tb3JlICg0KTsKLQkJCWZpeF9uZXdfZXhwIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQkJCSAgICAgaS5kaXNwc1tuXSwgMCwKLQkJCQkgICAgIFRDX1JFTE9DIChpLmRpc3BfcmVsb2Nbbl0sIEJGRF9SRUxPQ18zMikpOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsgLyogbXVzdCBiZSBEaXNwMTYgKi8KLQkJCWluc25fc2l6ZSArPSAyOwotCQkJcCA9IGZyYWdfbW9yZSAoMik7Ci0JCQlmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgMiwKLQkJCQkgICAgIGkuZGlzcHNbbl0sIDAsCi0JCQkJICAgICBUQ19SRUxPQyAoaS5kaXNwX3JlbG9jW25dLCBCRkRfUkVMT0NfMTYpKTsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICB9CQkJLyogZW5kIGRpc3BsYWNlbWVudCBvdXRwdXQgKi8KLQotCS8qIG91dHB1dCBpbW1lZGlhdGUgKi8KLQlpZiAoaS5pbW1fb3BlcmFuZHMpCi0JICB7Ci0JICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBuOwotCi0JICAgIGZvciAobiA9IDA7IG4gPCBpLm9wZXJhbmRzOyBuKyspCi0JICAgICAgewotCQlpZiAoaS5pbW1zW25dKQotCQkgIHsKLQkJICAgIGlmIChpLmltbXNbbl0tPlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJaWYgKGkudHlwZXNbbl0gJiAoSW1tOCB8IEltbThTKSkKLQkJCSAgewotCQkJICAgIGluc25fc2l6ZSArPSAxOwotCQkJICAgIHAgPSBmcmFnX21vcmUgKDEpOwotCQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkJCSh2YWx1ZVQpIGkuaW1tc1tuXS0+WF9hZGRfbnVtYmVyLAotCQkJCQkJMSk7Ci0JCQkgIH0KLQkJCWVsc2UgaWYgKGkudHlwZXNbbl0gJiBJbW0xNikKLQkJCSAgewotCQkJICAgIGluc25fc2l6ZSArPSAyOwotCQkJICAgIHAgPSBmcmFnX21vcmUgKDIpOwotCQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkJCSh2YWx1ZVQpIGkuaW1tc1tuXS0+WF9hZGRfbnVtYmVyLAotCQkJCQkJMik7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGluc25fc2l6ZSArPSA0OwotCQkJICAgIHAgPSBmcmFnX21vcmUgKDQpOwotCQkJICAgIG1kX251bWJlcl90b19jaGFycyAocCwKLQkJCQkJCSh2YWx1ZVQpIGkuaW1tc1tuXS0+WF9hZGRfbnVtYmVyLAotCQkJCQkJNCk7Ci0JCQkgIH0KLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7CQkvKiBub3QgYWJzb2x1dGVfc2VjdGlvbiAqLwotCQkJLyogTmVlZCBhIDMyLWJpdCBmaXh1cCAoZG9uJ3Qgc3VwcG9ydCA4Yml0Ci0JCQkgICBub24tYWJzb2x1dGUgaW1zKS4gIFRyeSB0byBzdXBwb3J0IG90aGVyCi0JCQkgICBzaXplcyAuLi4gKi8KLQkJCWludCByX3R5cGU7Ci0JCQlpbnQgc2l6ZTsKLQkJCWludCBwY3JlbCA9IDA7Ci0KLQkJCWlmIChpLnR5cGVzW25dICYgKEltbTggfCBJbW04UykpCi0JCQkgIHNpemUgPSAxOwotCQkJZWxzZSBpZiAoaS50eXBlc1tuXSAmIEltbTE2KQotCQkJICBzaXplID0gMjsKLQkJCWVsc2UKLQkJCSAgc2l6ZSA9IDQ7Ci0JCQlpbnNuX3NpemUgKz0gc2l6ZTsKLQkJCXAgPSBmcmFnX21vcmUgKHNpemUpOwotCQkJcl90eXBlID0gcmVsb2MgKHNpemUsIDAsIGkuZGlzcF9yZWxvY1swXSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfMzIKLQkJCSAgICAmJiBHT1Rfc3ltYm9sCi0JCQkgICAgJiYgR09UX3N5bWJvbCA9PSBpLmltbXNbbl0tPlhfYWRkX3N5bWJvbAotCQkJICAgICYmIChpLmltbXNbbl0tPlhfb3AgPT0gT19zeW1ib2wKLQkJCQl8fCAoaS5pbW1zW25dLT5YX29wID09IE9fYWRkCi0JCQkJICAgICYmICgoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uCi0JCQkJCSAoaS5pbW1zW25dLT5YX29wX3N5bWJvbCktPlhfb3ApCi0JCQkJCT09IE9fc3VidHJhY3QpKSkpCi0JCQkgIHsKLQkJCSAgICByX3R5cGUgPSBCRkRfUkVMT0NfMzg2X0dPVFBDOwotCQkJICAgIGkuaW1tc1tuXS0+WF9hZGRfbnVtYmVyICs9IDM7Ci0JCQkgIH0KLSNlbmRpZgotCQkJZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIHNpemUsCi0JCQkJICAgICBpLmltbXNbbl0sIHBjcmVsLCByX3R5cGUpOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0JCQkvKiBlbmQgaW1tZWRpYXRlIG91dHB1dCAqLwotICAgICAgfQotCi0jaWZkZWYgREVCVUczODYKLSAgICBpZiAoZmxhZ19kZWJ1ZykKLSAgICAgIHsKLQlwaSAobGluZSwgJmkpOwotICAgICAgfQotI2VuZGlmIC8qIERFQlVHMzg2ICovCi0gIH0KLX0KLQwKLXN0YXRpYyBpbnQgaTM4Nl9pc19yZWcgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfaXNfcmVnIChyZWdfc3RyaW5nKQotICAgICBjaGFyICpyZWdfc3RyaW5nOwotewotICByZWdpc3RlciBjaGFyICpzID0gcmVnX3N0cmluZzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgY2hhciByZWdfbmFtZV9naXZlbltNQVhfUkVHX05BTUVfU0laRSArIDFdOwotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqcykpCi0gICAgKytzOwotCi0gIHAgPSByZWdfbmFtZV9naXZlbjsKLSAgd2hpbGUgKCgqcCsrID0gcmVnaXN0ZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpzKytdKSAhPSAnXDAnKQotICAgIGlmIChwID49IHJlZ19uYW1lX2dpdmVuICsgTUFYX1JFR19OQU1FX1NJWkUpCi0gICAgICByZXR1cm4gMDsKLQotICBpZiAoIWhhc2hfZmluZCAocmVnX2hhc2gsIHJlZ19uYW1lX2dpdmVuKSkKLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHJldHVybiAxOwotfQotIAotc3RhdGljIGludCBpMzg2X2ltbWVkaWF0ZSBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9pbW1lZGlhdGUgKGltbV9zdGFydCkKLSAgICAgY2hhciAqaW1tX3N0YXJ0OwotewotICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgc2VnVCBleHBfc2VnID0gMDsKLSAgZXhwcmVzc2lvblMgKiBleHA7Ci0KLSAgaWYgKGkuaW1tX29wZXJhbmRzID09IE1BWF9JTU1FRElBVEVfT1BFUkFORFMpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJPbmx5IDEgb3IgMiBpbW1lZGlhdGUgb3BlcmFuZHMgYXJlIGFsbG93ZWQiKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZXhwID0gJmltX2V4cHJlc3Npb25zW2kuaW1tX29wZXJhbmRzKytdOwotICBpLmltbXNbdGhpc19vcGVyYW5kXSA9IGV4cDsKLQotICBpZiAoaXNfc3BhY2VfY2hhciAoKmltbV9zdGFydCkpCi0gICAgKytpbW1fc3RhcnQ7Ci0KLSAgc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGltbV9zdGFydDsKLQotI2lmbmRlZiBMRVhfQVQKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogV2UgY2FuIGhhdmUgb3BlcmFuZHMgb2YgdGhlIGZvcm0KLSAgICAgICAqICAgPHN5bWJvbD5AR09UT0ZGKzxubm4+Ci0gICAgICAgKiBUYWtlIHRoZSBlYXN5IHdheSBvdXQgaGVyZSBhbmQgY29weSBldmVyeXRoaW5nCi0gICAgICAgKiBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlci4uLgotICAgICAgICovCi0gICAgICByZWdpc3RlciBjaGFyICpjcDsKLQotICAgICAgY3AgPSBzdHJjaHIgKGlucHV0X2xpbmVfcG9pbnRlciwgJ0AnKTsKLSAgICAgIGlmIChjcCAhPSBOVUxMKQotICAgICAgICB7Ci0JICBjaGFyICp0bXBidWY7Ci0JICBpbnQgbGVuLCBmaXJzdDsKLQotCSAgLyogR09UIHJlbG9jYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlICovCi0JICBpZiAoZmxhZ18xNmJpdF9jb2RlKQotCSAgICBhc19iYWQgKF8oIkdPVCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlIikpOwotCi0JICBpZiAoR09UX3N5bWJvbCA9PSBOVUxMKQotCSAgICBHT1Rfc3ltYm9sID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKTsKLQotCSAgaWYgKHN0cm5jbXAgKGNwICsgMSwgIlBMVCIsIDMpID09IDApCi0JICAgIHsKLQkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfUExUMzI7Ci0JICAgICAgbGVuID0gMzsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UT0ZGIiwgNikgPT0gMCkKLQkgICAgewotCSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1RPRkY7Ci0JICAgICAgbGVuID0gNjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RybmNtcCAoY3AgKyAxLCAiR09UIiwgMykgPT0gMCkKLQkgICAgewotCSAgICAgIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gQkZEX1JFTE9DXzM4Nl9HT1QzMjsKLQkgICAgICBsZW4gPSAzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygiQmFkIHJlbG9jIHNwZWNpZmllciBpbiBleHByZXNzaW9uIikpOwotCi0JICAvKiBSZXBsYWNlIHRoZSByZWxvY2F0aW9uIHRva2VuIHdpdGggJyAnLCBzbyB0aGF0IGVycm9ycyBsaWtlCi0JICAgICBmb29AR09UT0ZGMSB3aWxsIGJlIGRldGVjdGVkLiAgKi8KLQkgIGZpcnN0ID0gY3AgLSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB0bXBidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbihpbnB1dF9saW5lX3BvaW50ZXIpKTsKLQkgIG1lbWNweSAodG1wYnVmLCBpbnB1dF9saW5lX3BvaW50ZXIsIGZpcnN0KTsKLQkgIHRtcGJ1ZltmaXJzdF0gPSAnICc7Ci0JICBzdHJjcHkgKHRtcGJ1ZiArIGZpcnN0ICsgMSwgY3AgKyAxICsgbGVuKTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRtcGJ1ZjsKLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgZXhwX3NlZyA9IGV4cHJlc3Npb24gKGV4cCk7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICBhc19iYWQgKF8oIklnbm9yaW5nIGp1bmsgYCVzJyBhZnRlciBleHByZXNzaW9uIiksIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKGV4cC0+WF9vcCA9PSBPX2Fic2VudCkKLSAgICB7Ci0gICAgICAvKiBtaXNzaW5nIG9yIGJhZCBleHByIGJlY29tZXMgYWJzb2x1dGUgMCAqLwotICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIG9yIGludmFsaWQgaW1tZWRpYXRlIGV4cHJlc3Npb24gYCVzJyB0YWtlbiBhcyAwIiksCi0gICAgICAgICAgICAgIGltbV9zdGFydCk7Ci0gICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZXhwLT5YX2FkZF9zeW1ib2wgPSAoc3ltYm9sUyAqKSAwOwotICAgICAgZXhwLT5YX29wX3N5bWJvbCA9IChzeW1ib2xTICopIDA7Ci0gICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gSW1tOwotICAgIH0KLSAgZWxzZSBpZiAoZXhwLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9Ci0Jc21hbGxlc3RfaW1tX3R5cGUgKChsb25nKSBleHAtPlhfYWRkX251bWJlcik7Ci0gIAotICAgICAgLyogSWYgYSBzdWZmaXggaXMgZ2l2ZW4sIHRoaXMgb3BlcmFuZCBtYXkgYmUgc2hvcnRlbmRlZC4gKi8KLSAgICAgIHN3aXRjaCAoaS5zdWZmaXgpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBXT1JEX01ORU1fU1VGRklYOgotICAgICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBJbW0xNjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCWVRFX01ORU1fU1VGRklYOgotICAgICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBJbW0xNiB8IEltbTggfCBJbW04UzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSNpZmRlZiBPQkpfQU9VVAotICBlbHNlIGlmIChleHBfc2VnICE9IHRleHRfc2VjdGlvbgotICAgICAgICAgICAmJiBleHBfc2VnICE9IGRhdGFfc2VjdGlvbgotICAgICAgICAgICAmJiBleHBfc2VnICE9IGJzc19zZWN0aW9uCi0gICAgICAgICAgICYmIGV4cF9zZWcgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICAgICAgICYmICFiZmRfaXNfY29tX3NlY3Rpb24gKGV4cF9zZWcpCi0jZW5kaWYKLSAgICAgICAgICApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbmltcGxlbWVudGVkIHNlZ21lbnQgdHlwZSAlZCBpbiBvcGVyYW5kIiksIGV4cF9zZWcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2VuZGlmCi0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIGFkZHJlc3MuICBUaGUgc2l6ZSBvZiB0aGUgYWRkcmVzcyB3aWxsIGJlCi0gICAgICAgICBkZXRlcm1pbmVkIGxhdGVyLCBkZXBlbmRpbmcgb24gZGVzdGluYXRpb24gcmVnaXN0ZXIsCi0gICAgICAgICBzdWZmaXgsIG9yIHRoZSBkZWZhdWx0IGZvciB0aGUgc2VjdGlvbi4gIFdlIGV4Y2x1ZGUKLSAgICAgICAgIEltbThTIGhlcmUgc28gdGhhdCBgcHVzaCAkZm9vJyBhbmQgb3RoZXIgaW5zdHJ1Y3Rpb25zCi0gICAgICAgICB3aXRoIGFuIEltbThTIGZvcm0gd2lsbCB1c2UgSW1tMTYgb3IgSW1tMzIuICAqLwotICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IChJbW04IHwgSW1tMTYgfCBJbW0zMik7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGkzODZfc2NhbGUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfc2NhbGUgKHNjYWxlKQotICAgICBjaGFyICpzY2FsZTsKLXsKLSAgaWYgKCFpc2RpZ2l0ICgqc2NhbGUpKQotICAgIGdvdG8gYmFkX3NjYWxlOwotCi0gIHN3aXRjaCAoKnNjYWxlKQotICAgIHsKLSAgICBjYXNlICcwJzoKLSAgICBjYXNlICcxJzoKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnMic6Ci0gICAgICBpLmxvZzJfc2NhbGVfZmFjdG9yID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzQnOgotICAgICAgaS5sb2cyX3NjYWxlX2ZhY3RvciA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc4JzoKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAzOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICBiYWRfc2NhbGU6Ci0gICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBzY2FsZSBmYWN0b3Igb2YgMSwgMiwgNCwgb3IgODogZ290IGAlcyciKSwKLSAgICAgICAgICAgICAgc2NhbGUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpZiAoaS5sb2cyX3NjYWxlX2ZhY3RvciAhPSAwICYmICEgaS5pbmRleF9yZWcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygic2NhbGUgZmFjdG9yIG9mICVkIHdpdGhvdXQgYW4gaW5kZXggcmVnaXN0ZXIiKSwKLSAgICAgICAgICAgICAgIDEgPDwgaS5sb2cyX3NjYWxlX2ZhY3Rvcik7Ci0jaWYgU0NBTEUxX1dIRU5fTk9fSU5ERVgKLSAgICAgIGkubG9nMl9zY2FsZV9mYWN0b3IgPSAwOwotI2VuZGlmCi0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBpMzg2X2Rpc3BsYWNlbWVudCBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOwotCi1zdGF0aWMgaW50Ci1pMzg2X2Rpc3BsYWNlbWVudCAoZGlzcF9zdGFydCwgZGlzcF9lbmQpCi0gICAgIGNoYXIgKmRpc3Bfc3RhcnQ7Ci0gICAgIGNoYXIgKmRpc3BfZW5kOwotewotICByZWdpc3RlciBleHByZXNzaW9uUyAqZXhwOwotICBzZWdUIGV4cF9zZWcgPSAwOwotICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW50IGJpZ2Rpc3AgPSBEaXNwMzI7Ci0KLSAgLyogIEFsbCBvZiB0aGUgcGllY2VzIG9mIHRoZSBkaXNwbGFjZW1lbnQgZXhwcmVzc2lvbiBhcmUgaGFuZGxlZCB0b2dldGhlci4gKi8KLSAgaWYgKGludGVsX3N5bnRheCAmJiBpLmRpc3Bfb3BlcmFuZHMgIT0gMCkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSkKLSAgICBiaWdkaXNwID0gRGlzcDE2OwotICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gYmlnZGlzcDsKLQotICBleHAgPSAmZGlzcF9leHByZXNzaW9uc1tpLmRpc3Bfb3BlcmFuZHNdOwotICBpLmRpc3BzW3RoaXNfb3BlcmFuZF0gPSBleHA7Ci0gIGkuZGlzcF9yZWxvY1t0aGlzX29wZXJhbmRdID0gTk9fUkVMT0M7Ci0gIGkuZGlzcF9vcGVyYW5kcysrOwotICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gZGlzcF9zdGFydDsKLSAgRU5EX1NUUklOR19BTkRfU0FWRSAoZGlzcF9lbmQpOwotCi0jaWZuZGVmIEdDQ19BU01fT19IQUNLCi0jZGVmaW5lIEdDQ19BU01fT19IQUNLIDAKLSNlbmRpZgotI2lmIEdDQ19BU01fT19IQUNLCi0gIEVORF9TVFJJTkdfQU5EX1NBVkUgKGRpc3BfZW5kICsgMSk7Ci0gIGlmICgoaS50eXBlc1t0aGlzX29wZXJhbmRdICYgQmFzZUluZGV4KSAhPSAwCi0gICAgICAgJiYgZGlzcGxhY2VtZW50X3N0cmluZ19lbmRbLTFdID09ICcrJykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGhhY2sgaXMgdG8gYXZvaWQgYSB3YXJuaW5nIHdoZW4gdXNpbmcgdGhlICJvIgotICAgICAgICAgY29uc3RyYWludCB3aXRoaW4gZ2NjIGFzbSBzdGF0ZW1lbnRzLgotICAgICAgICAgRm9yIGluc3RhbmNlOgotCi0gICAgICAgICNkZWZpbmUgX3NldF90c3NsZHRfZGVzYyhuLGFkZHIsbGltaXQsdHlwZSkgXAotICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIFwKLSAgICAgICAgIm1vdncgJXcyLCUwXG5cdCIgXAotICAgICAgICAibW92dyAldzEsMislMFxuXHQiIFwKLSAgICAgICAgInJvcmwgJDE2LCUxXG5cdCIgXAotICAgICAgICAibW92YiAlYjEsNCslMFxuXHQiIFwKLSAgICAgICAgIm1vdmIgJTQsNSslMFxuXHQiIFwKLSAgICAgICAgIm1vdmIgJDAsNislMFxuXHQiIFwKLSAgICAgICAgIm1vdmIgJWgxLDcrJTBcblx0IiBcCi0gICAgICAgICJyb3JsICQxNiwlMSIgXAotICAgICAgICA6ICI9byIoKihuKSkgOiAicSIgKGFkZHIpLCAicmkiKGxpbWl0KSwgImkiKHR5cGUpKQotCi0gICAgICAgIFRoaXMgd29ya3MgZ3JlYXQgZXhjZXB0IHRoYXQgdGhlIG91dHB1dCBhc3NlbWJsZXIgZW5kcwotICAgICAgICB1cCBsb29raW5nIGEgYml0IHdlaXJkIGlmIGl0IHR1cm5zIG91dCB0aGF0IHRoZXJlIGlzCi0gICAgICAgIG5vIG9mZnNldC4gIFlvdSBlbmQgdXAgcHJvZHVjaW5nIGNvZGUgdGhhdCBsb29rcyBsaWtlOgotCi0gICAgICAgICNBUFAKLSAgICAgICAgICAgICAgIG1vdncgJDIzNSwoJWVheCkKLSAgICAgICAgICAgICAgIG1vdncgJWR4LDIrKCVlYXgpCi0gICAgICAgICAgICAgICByb3JsICQxNiwlZWR4Ci0gICAgICAgICAgICAgICBtb3ZiICVkbCw0KyglZWF4KQotICAgICAgICAgICAgICAgbW92YiAkMTM3LDUrKCVlYXgpCi0gICAgICAgICAgICAgICBtb3ZiICQwLDYrKCVlYXgpCi0gICAgICAgICAgICAgICBtb3ZiICVkaCw3KyglZWF4KQotICAgICAgICAgICAgICAgcm9ybCAkMTYsJWVkeAotICAgICAgICAjTk9fQVBQCi0KLSAgICAgICAgU28gaGVyZSB3ZSBwcm92aWRlIHRoZSBtaXNzaW5nIHplcm8uCi0gICAgKi8KLQotICAgICpkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCA9ICcwJzsKLSAgICB9Ci0jZW5kaWYKLSNpZm5kZWYgTEVYX0FUCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFdlIGNhbiBoYXZlIG9wZXJhbmRzIG9mIHRoZSBmb3JtCi0gICAgICAgKiAgIDxzeW1ib2w+QEdPVE9GRis8bm5uPgotICAgICAgICogVGFrZSB0aGUgZWFzeSB3YXkgb3V0IGhlcmUgYW5kIGNvcHkgZXZlcnl0aGluZwotICAgICAgICogaW50byBhIHRlbXBvcmFyeSBidWZmZXIuLi4KLSAgICAgICAqLwotICAgICAgcmVnaXN0ZXIgY2hhciAqY3A7Ci0KLSAgICAgIGNwID0gc3RyY2hyIChpbnB1dF9saW5lX3BvaW50ZXIsICdAJyk7Ci0gICAgICBpZiAoY3AgIT0gTlVMTCkKLSAgICAgICAgewotCSAgY2hhciAqdG1wYnVmOwotCSAgaW50IGxlbiwgZmlyc3Q7Ci0KLQkgLyogR09UIHJlbG9jYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIDE2IGJpdCBtb2RlICovCi0JIGlmIChmbGFnXzE2Yml0X2NvZGUpCi0JICAgYXNfYmFkIChfKCJHT1QgcmVsb2NhdGlvbnMgbm90IHN1cHBvcnRlZCBpbiAxNiBiaXQgbW9kZSIpKTsKLQotCSAgaWYgKEdPVF9zeW1ib2wgPT0gTlVMTCkKLQkgICAgR09UX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKEdMT0JBTF9PRkZTRVRfVEFCTEVfTkFNRSk7Ci0KLQkgIGlmIChzdHJuY21wIChjcCArIDEsICJQTFQiLCAzKSA9PSAwKQotCSAgICB7Ci0JICAgICAgaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPSBCRkRfUkVMT0NfMzg2X1BMVDMyOwotCSAgICAgIGxlbiA9IDM7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVE9GRiIsIDYpID09IDApCi0JICAgIHsKLQkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UT0ZGOwotCSAgICAgIGxlbiA9IDY7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cm5jbXAgKGNwICsgMSwgIkdPVCIsIDMpID09IDApCi0JICAgIHsKLQkgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zODZfR09UMzI7Ci0JICAgICAgbGVuID0gMzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBhc19iYWQgKF8oIkJhZCByZWxvYyBzcGVjaWZpZXIgaW4gZXhwcmVzc2lvbiIpKTsKLQotCSAgLyogUmVwbGFjZSB0aGUgcmVsb2NhdGlvbiB0b2tlbiB3aXRoICcgJywgc28gdGhhdCBlcnJvcnMgbGlrZQotCSAgICAgZm9vQEdPVE9GRjEgd2lsbCBiZSBkZXRlY3RlZC4gICovCi0JICBmaXJzdCA9IGNwIC0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgdG1wYnVmID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4oaW5wdXRfbGluZV9wb2ludGVyKSk7Ci0JICBtZW1jcHkgKHRtcGJ1ZiwgaW5wdXRfbGluZV9wb2ludGVyLCBmaXJzdCk7Ci0JICB0bXBidWZbZmlyc3RdID0gJyAnOwotCSAgc3RyY3B5ICh0bXBidWYgKyBmaXJzdCArIDEsIGNwICsgMSArIGxlbik7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0bXBidWY7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gICAgZXhwX3NlZyA9IGV4cHJlc3Npb24gKGV4cCk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgLyogV2UgZG8gdGhpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VjdGlvbiBzeW1ib2wgaXMgaW4KLSAgICAgICB0aGUgc3ltYm9sIHRhYmxlLiAgV2Ugd2lsbCB1bHRpbWF0ZWx5IGNoYW5nZSB0aGUgcmVsb2NhdGlvbgotICAgICAgIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3Rpb24gKi8KLSAgICBpZiAoaS5kaXNwX3JlbG9jW3RoaXNfb3BlcmFuZF0gPT0gQkZEX1JFTE9DXzM4Nl9HT1RPRkYpCi0gICAgICB7Ci0gICAgICAgIGlmIChTX0lTX0xPQ0FMKGV4cC0+WF9hZGRfc3ltYm9sKQotICAgICAgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoZXhwLT5YX2FkZF9zeW1ib2wpICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgICAgICAgIHNlY3Rpb25fc3ltYm9sIChTX0dFVF9TRUdNRU5UIChleHAtPlhfYWRkX3N5bWJvbCkpOwotICAgICAgICBhc3NlcnQgKGV4cC0+WF9vcCA9PSBPX3N5bWJvbCk7Ci0gICAgICAgIGV4cC0+WF9vcCA9IE9fc3VidHJhY3Q7Ci0gICAgICAgIGV4cC0+WF9vcF9zeW1ib2wgPSBHT1Rfc3ltYm9sOwotICAgICAgICBpLmRpc3BfcmVsb2NbdGhpc19vcGVyYW5kXSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIpCi0gICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBqdW5rIGAlcycgYWZ0ZXIgZXhwcmVzc2lvbiIpLAotICAgICAgICAgICAgICAgaW5wdXRfbGluZV9wb2ludGVyKTsKLSNpZiBHQ0NfQVNNX09fSEFDSwotICAgICBSRVNUT1JFX0VORF9TVFJJTkcgKGRpc3BfZW5kICsgMSk7Ci0jZW5kaWYKLSAgICAgUkVTVE9SRV9FTkRfU1RSSU5HIChkaXNwX2VuZCk7Ci0gICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgIGlmIChleHAtPlhfb3AgPT0gT19jb25zdGFudCkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoZml0c19pbl9zaWduZWRfYnl0ZSAoZXhwLT5YX2FkZF9udW1iZXIpKQotICAgICAgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gRGlzcDg7Ci0gICAgICAgfQotI2lmZGVmIE9CSl9BT1VUCi0gICAgIGVsc2UgaWYgKGV4cF9zZWcgIT0gdGV4dF9zZWN0aW9uCi0gICAgICAgICAgICAgICYmIGV4cF9zZWcgIT0gZGF0YV9zZWN0aW9uCi0gICAgICAgICAgICAgICYmIGV4cF9zZWcgIT0gYnNzX3NlY3Rpb24KLSAgICAgICAgICAgICAgJiYgZXhwX3NlZyAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYXNfYmFkIChfICgiVW5pbXBsZW1lbnRlZCBzZWdtZW50IHR5cGUgJWQgaW4gb3BlcmFuZCIpLCBleHBfc2VnKTsKLSAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9vcGVyYW5kX21vZGlmaWVyIFBBUkFNUyAoKGNoYXIgKiosIGludCkpOwotCi1zdGF0aWMgaW50Ci1pMzg2X29wZXJhbmRfbW9kaWZpZXIgKG9wX3N0cmluZywgZ290X2FfZmxvYXQpCi0gICAgIGNoYXIgKipvcF9zdHJpbmc7Ci0gICAgIGludCBnb3RfYV9mbG9hdDsKLXsKLSAgICBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiQllURSBQVFIiLCA4KSkKLSAgICAgIHsKLSAgICAgICAgaS5zdWZmaXggPSBCWVRFX01ORU1fU1VGRklYOwotICAgICAgICAqb3Bfc3RyaW5nICs9IDg7Ci0gICAgICAgIHJldHVybiBCWVRFX1BUUjsKLQotICAgICAgfQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIldPUkQgUFRSIiwgOCkpCi0gICAgICB7Ci0gICAgICAgIGkuc3VmZml4ID0gV09SRF9NTkVNX1NVRkZJWDsKLSAgICAgICAgKm9wX3N0cmluZyArPSA4OwotICAgICAgICByZXR1cm4gV09SRF9QVFI7Ci0gICAgICB9Ci0KLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJEV09SRCBQVFIiLCA5KSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGdvdF9hX2Zsb2F0KQotICAgICAgICAgIGkuc3VmZml4ID0gU0hPUlRfTU5FTV9TVUZGSVg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpLnN1ZmZpeCA9IERXT1JEX01ORU1fU1VGRklYOwotICAgICAgICAqb3Bfc3RyaW5nICs9IDk7Ci0gICAgICAgIHJldHVybiBEV09SRF9QVFI7Ci0gICAgICB9Ci0KLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJRV09SRCBQVFIiLCA5KSkKLSAgICAgIHsKLSAgICAgICAgaS5zdWZmaXggPSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWDsKLSAgICAgICAgKm9wX3N0cmluZyArPSA5OwotICAgICAgICByZXR1cm4gUVdPUkRfUFRSOwotICAgICAgfQotCi0gICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiWFdPUkQgUFRSIiwgOSkpCi0gICAgICB7Ci0gICAgICAgIGkuc3VmZml4ID0gTE9OR19ET1VCTEVfTU5FTV9TVUZGSVg7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gOTsKLSAgICAgICAgcmV0dXJuIFhXT1JEX1BUUjsKLSAgICAgIH0KLQotICAgIGVsc2UgaWYgKCFzdHJuY2FzZWNtcCAoKm9wX3N0cmluZywgIlNIT1JUIiwgNSkpCi0gICAgICB7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gNTsKLSAgICAgICAgcmV0dXJuIFNIT1JUOwotICAgICAgfQotCi0gICAgZWxzZSBpZiAoIXN0cm5jYXNlY21wICgqb3Bfc3RyaW5nLCAiT0ZGU0VUIEZMQVQ6IiwgMTIpKQotICAgICAgewotICAgICAgICAqb3Bfc3RyaW5nICs9IDEyOwotICAgICAgICByZXR1cm4gT0ZGU0VUX0ZMQVQ7Ci0gICAgICB9Ci0KLSAgICBlbHNlIGlmICghc3RybmNhc2VjbXAgKCpvcF9zdHJpbmcsICJGTEFUIiwgNCkpCi0gICAgICB7Ci0gICAgICAgICpvcF9zdHJpbmcgKz0gNDsKLSAgICAgICAgcmV0dXJuIEZMQVQ7Ci0gICAgICB9Ci0KLSAgICBlbHNlIHJldHVybiBOT05FX0ZPVU5EOwotfSAKLQotc3RhdGljIGNoYXIgKiBidWlsZF9kaXNwbGFjZW1lbnRfc3RyaW5nIFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci0KLXN0YXRpYyBjaGFyICoKLWJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgKGluaXRpYWxfZGlzcCwgb3Bfc3RyaW5nKQotICAgICBpbnQgaW5pdGlhbF9kaXNwOwotICAgICBjaGFyICpvcF9zdHJpbmc7Ci17Ci0gIGNoYXIgKnRlbXBfc3RyaW5nID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKG9wX3N0cmluZykgKyAxKTsKLSAgY2hhciAqZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICBjaGFyICp0YzsKLSAgY2hhciAqdGVtcF9kaXNwOwotCi0gIHRlbXBfc3RyaW5nWzBdID0gJ1wwJzsKLSAgdGMgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBzdHJjaHIgKG9wX3N0cmluZywgJ1snKTsKLSAgaWYgKCBpbml0aWFsX2Rpc3AgJiYgIWVuZF9vZl9vcGVyYW5kX3N0cmluZykKLSAgICB7Ci0gICAgICBzdHJjcHkgKHRlbXBfc3RyaW5nLCBvcF9zdHJpbmcpOwotICAgICAgcmV0dXJuICh0ZW1wX3N0cmluZyk7Ci0gICAgfQotCi0gIC8qIEJ1aWxkIHRoZSB3aG9sZSBkaXNwbGFjZW1lbnQgc3RyaW5nICovCi0gIGlmIChpbml0aWFsX2Rpc3ApCi0gICAgewotICAgICAgc3RybmNweSAodGVtcF9zdHJpbmcsIG9wX3N0cmluZywgZW5kX29mX29wZXJhbmRfc3RyaW5nIC0gb3Bfc3RyaW5nKTsKLSAgICAgIHRlbXBfc3RyaW5nW2VuZF9vZl9vcGVyYW5kX3N0cmluZyAtIG9wX3N0cmluZ10gPSAnXDAnOwotICAgICAgdGVtcF9kaXNwID0gdGM7Ci0gICAgfQotICBlbHNlIAotICAgIHRlbXBfZGlzcCA9IG9wX3N0cmluZzsKLQotICB3aGlsZSAoKnRlbXBfZGlzcCAhPSAnXDAnKQotICAgIHsKLSAgICAgIGludCBhZGRfbWludXMgPSAoKnRlbXBfZGlzcCA9PSAnLScpOwotCi0gICAgICBpZiAoKnRlbXBfZGlzcCA9PSAnKycgfHwgKnRlbXBfZGlzcCA9PSAnLScgfHwgKnRlbXBfZGlzcCA9PSAnWycpCi0gICAgICAgIHRlbXBfZGlzcCsrOwotCi0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKnRlbXBfZGlzcCkpCi0gICAgICAgIHRlbXBfZGlzcCsrOwotCi0gICAgICAvKiBEb24ndCBjb25zaWRlciByZWdpc3RlcnMgKi8KLSAgICAgIGlmICgqdGVtcF9kaXNwICE9IFJFR0lTVEVSX1BSRUZJWAotICAgICAgICAgICYmICEoYWxsb3dfbmFrZWRfcmVnICYmIGkzODZfaXNfcmVnICh0ZW1wX2Rpc3ApKSkKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgKnN0cmluZ19zdGFydCA9IHRlbXBfZGlzcDsKLQotICAgICAgICAgIHdoaWxlICgqdGVtcF9kaXNwICE9ICddJwotICAgICAgICAgICAgICAgICAmJiAqdGVtcF9kaXNwICE9ICcrJwotICAgICAgICAgICAgICAgICAmJiAqdGVtcF9kaXNwICE9ICctJwotICAgICAgICAgICAgICAgICAmJiAqdGVtcF9kaXNwICE9ICcqJykKLSAgICAgICAgICAgICsrdGVtcF9kaXNwOwotCi0gICAgICAgICAgaWYgKGFkZF9taW51cykKLSAgICAgICAgICAgIHN0cmNhdCAodGVtcF9zdHJpbmcsICItIik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyY2F0ICh0ZW1wX3N0cmluZywgIisiKTsKLQotICAgICAgICAgIHN0cm5jYXQgKHRlbXBfc3RyaW5nLCBzdHJpbmdfc3RhcnQsIHRlbXBfZGlzcCAtIHN0cmluZ19zdGFydCk7Ci0gICAgICAgICAgaWYgKCp0ZW1wX2Rpc3AgPT0gJysnIHx8ICp0ZW1wX2Rpc3AgPT0gJy0nKQotICAgICAgICAgICAgLS10ZW1wX2Rpc3A7Ci0gICAgICAgIH0KLQotICAgICAgd2hpbGUgKCp0ZW1wX2Rpc3AgIT0gJ1wwJwotICAgICAgICAgICAgICYmICp0ZW1wX2Rpc3AgIT0gJysnCi0gICAgICAgICAgICAgJiYgKnRlbXBfZGlzcCAhPSAnLScpCi0gICAgICAgICsrdGVtcF9kaXNwOwotICAgIH0KLQotICByZXR1cm4gdGVtcF9zdHJpbmc7Ci19Ci0KLXN0YXRpYyBpbnQgaTM4Nl9wYXJzZV9zZWcgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfcGFyc2Vfc2VnIChvcF9zdHJpbmcpCi0gICAgIGNoYXIgKm9wX3N0cmluZzsKLXsKLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotICAgICsrb3Bfc3RyaW5nOwotCi0gIC8qIFNob3VsZCBiZSBvbmUgb2YgZXMsIGNzLCBzcywgZHMgZnMgb3IgZ3MgKi8KLSAgc3dpdGNoICgqb3Bfc3RyaW5nKyspCi0gICAgewotICAgIGNhc2UgJ2UnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmVzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmY3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZzczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmRzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZic6Ci0gICAgICBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPSAmZnM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdnJzoKLSAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZnczsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oImJhZCBzZWdtZW50IG5hbWUgYCVzJyIpLCBvcF9zdHJpbmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGlmICgqb3Bfc3RyaW5nKysgIT0gJ3MnKQotICAgIHsKLSAgICAgICBhc19iYWQgKF8oImJhZCBzZWdtZW50IG5hbWUgYCVzJyIpLCBvcF9zdHJpbmcpOwotICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgKytvcF9zdHJpbmc7Ci0KLSAgaWYgKCpvcF9zdHJpbmcgIT0gJzonKQotICAgIHsKLSAgICAgICBhc19iYWQgKF8oImJhZCBzZWdtZW50IG5hbWUgYCVzJyIpLCBvcF9zdHJpbmcpOwotICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsgCi0gIAotfQotCi1zdGF0aWMgaW50IGkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWkzODZfaW50ZWxfbWVtb3J5X29wZXJhbmQgKG9wX3N0cmluZykKLSAgICAgY2hhciAqb3Bfc3RyaW5nOwotewotCi0gIGNoYXIgKmVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQotICBpZiAoaXNfZGlnaXRfY2hhciAoKm9wX3N0cmluZykKLSAgICAgICYmIHN0cmNociAob3Bfc3RyaW5nLCAnWycpID09IDApCi0gICAgewotICAgICAgaWYgKCFpMzg2X2ltbWVkaWF0ZSAob3Bfc3RyaW5nKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAvKiBMb29rIGZvciBkaXNwbGFjZW1lbnQgcHJlY2VkaW5nIG9wZW4gYnJhY2tldCAqLwotICBpZiAoKm9wX3N0cmluZyAhPSAnWycpCi0gICAgewotICAgICAgY2hhciAqZW5kX3NlZzsKLSAgICAgIGNoYXIgKnRlbXBfc3RyaW5nOwotCi0gICAgICBlbmRfc2VnID0gc3RyY2hyIChvcF9zdHJpbmcsICc6Jyk7Ci0gICAgICBpZiAoZW5kX3NlZykKLSAgICAgICAgewotICAgICAgICAgICBpZiAoIWkzODZfcGFyc2Vfc2VnIChvcF9zdHJpbmcpKQotICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICBvcF9zdHJpbmcgPSBlbmRfc2VnICsgMTsKLSAgICAgICAgfQotCi0gICAgICB0ZW1wX3N0cmluZyA9IGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgKHRydWUsIG9wX3N0cmluZyk7Ci0gICAgICBpZiAoIWkzODZfZGlzcGxhY2VtZW50ICh0ZW1wX3N0cmluZywgdGVtcF9zdHJpbmcgKyBzdHJsZW4gKHRlbXBfc3RyaW5nKSkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBzdHJjaHIgKG9wX3N0cmluZywgJ1snKTsKLSAgICAgIGlmICghZW5kX29mX29wZXJhbmRfc3RyaW5nKQotICAgICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmcgKyBzdHJsZW4gKG9wX3N0cmluZyk7Ci0KLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqZW5kX29mX29wZXJhbmRfc3RyaW5nKSkKLSAgICAgICAgLS1lbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0KLSAgICAgIG9wX3N0cmluZyA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLSAgICAgfQotCi0gIGlmICgqb3Bfc3RyaW5nID09ICdbJykKLSAgICB7Ci0gICAgICArK29wX3N0cmluZzsKLQotICAgICAgLyogUGljayBvZmYgZWFjaCBjb21wb25lbnQgYW5kIGZpZ3VyZSBvdXQgd2hlcmUgaXQgYmVsb25ncyAqLwotCi0gICAgICBlbmRfb2Zfb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmc7Ci0KLSAgICAgIHdoaWxlICgqb3Bfc3RyaW5nICE9ICddJykKLSAgICAgICAgewotCi0gICAgICAgICAgd2hpbGUgKCplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJysnCi0gICAgICAgICAgICAgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJy0nCi0gICAgICAgICAgICAgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJyonCi0gICAgICAgICAgICAgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJ10nKQotICAgICAgICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nKys7Ci0KLSAgICAgICAgICBpZiAoKm9wX3N0cmluZyA9PSAnKycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNoYXIgKnRlbXBfc3RyaW5nID0gb3Bfc3RyaW5nICsgMTsKLSAgICAgICAgICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCp0ZW1wX3N0cmluZykpCi0gICAgICAgICAgICAgICAgKyt0ZW1wX3N0cmluZzsKLSAgICAgICAgICAgICAgaWYgKCp0ZW1wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgKLSAgICAgICAgICAgICAgICAgIHx8IChhbGxvd19uYWtlZF9yZWcgJiYgaTM4Nl9pc19yZWcgKHRlbXBfc3RyaW5nKSkpCi0gICAgICAgICAgICAgICAgKytvcF9zdHJpbmc7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoKm9wX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgKLSAgICAgICAgICAgICAgfHwgKGFsbG93X25ha2VkX3JlZyAmJiBpMzg2X2lzX3JlZyAob3Bfc3RyaW5nKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNvbnN0IHJlZ19lbnRyeSAqdGVtcF9yZWc7Ci0gICAgICAgICAgICAgIGNoYXIgKmVuZF9vcDsKLQotICAgICAgICAgICAgICBFTkRfU1RSSU5HX0FORF9TQVZFIChlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpOwotICAgICAgICAgICAgICB0ZW1wX3JlZyA9IHBhcnNlX3JlZ2lzdGVyIChvcF9zdHJpbmcsICZlbmRfb3ApOwotICAgICAgICAgICAgICBSRVNUT1JFX0VORF9TVFJJTkcgKGVuZF9vZl9vcGVyYW5kX3N0cmluZyk7Ci0KLSAgICAgICAgICAgICAgaWYgKHRlbXBfcmVnID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgaWYgKGkuYmFzZV9yZWcgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBpLmJhc2VfcmVnID0gdGVtcF9yZWc7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpLmluZGV4X3JlZyA9IHRlbXBfcmVnOwotCi0gICAgICAgICAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBCYXNlSW5kZXg7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKSB8fCAqb3Bfc3RyaW5nID09ICcrJyB8fCAqb3Bfc3RyaW5nID09ICctJykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICBjaGFyICp0ZW1wX3N0cmluZyA9IGJ1aWxkX2Rpc3BsYWNlbWVudF9zdHJpbmcgKGZhbHNlLCBvcF9zdHJpbmcpOwotCi0gICAgICAgICAgICAgIGlmICgqdGVtcF9zdHJpbmcgPT0gJysnKQotICAgICAgICAgICAgICAgICsrdGVtcF9zdHJpbmc7Ci0KLSAgICAgICAgICAgICAgaWYgKCFpMzg2X2Rpc3BsYWNlbWVudCAodGVtcF9zdHJpbmcsIHRlbXBfc3RyaW5nICsgc3RybGVuICh0ZW1wX3N0cmluZykpKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIAotICAgICAgICAgICAgICArK29wX3N0cmluZzsKLSAgICAgICAgICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nID0gb3Bfc3RyaW5nOwotICAgICAgICAgICAgICB3aGlsZSAoKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnXScKLSAgICAgICAgICAgICAgICAgICAgICYmICplbmRfb2Zfb3BlcmFuZF9zdHJpbmcgIT0gJysnCi0gICAgICAgICAgICAgICAgICAgICAmJiAqZW5kX29mX29wZXJhbmRfc3RyaW5nICE9ICctJwotICAgICAgICAgICAgICAgICAgICAgJiYgKmVuZF9vZl9vcGVyYW5kX3N0cmluZyAhPSAnKicpCi0gICAgICAgICAgICAgICArK2VuZF9vZl9vcGVyYW5kX3N0cmluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICgqb3Bfc3RyaW5nID09ICcqJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKytvcF9zdHJpbmc7Ci0KLSAgICAgICAgICAgICAgaWYgKGkuYmFzZV9yZWcgJiYgIWkuaW5kZXhfcmVnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGkuaW5kZXhfcmVnID0gaS5iYXNlX3JlZzsKLSAgICAgICAgICAgICAgICAgIGkuYmFzZV9yZWcgPSAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBpZiAoIWkzODZfc2NhbGUgKG9wX3N0cmluZykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgb3Bfc3RyaW5nID0gZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgICAgICAgICsrZW5kX29mX29wZXJhbmRfc3RyaW5nOwotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGkzODZfaW50ZWxfb3BlcmFuZCBQQVJBTVMgKChjaGFyICosIGludCkpOwotCi1zdGF0aWMgaW50Ci1pMzg2X2ludGVsX29wZXJhbmQgKG9wZXJhbmRfc3RyaW5nLCBnb3RfYV9mbG9hdCkKLSAgICAgY2hhciAqb3BlcmFuZF9zdHJpbmc7Ci0gICAgIGludCBnb3RfYV9mbG9hdDsKLXsKLSAgY2hhciAqb3Bfc3RyaW5nID0gb3BlcmFuZF9zdHJpbmc7Ci0KLSAgaW50IG9wZXJhbmRfbW9kaWZpZXIgPSBpMzg2X29wZXJhbmRfbW9kaWZpZXIgKCZvcF9zdHJpbmcsIGdvdF9hX2Zsb2F0KTsKLSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotICAgICsrb3Bfc3RyaW5nOwotCi0gIHN3aXRjaCAob3BlcmFuZF9tb2RpZmllcikKLSAgICB7Ci0gICAgY2FzZSBCWVRFX1BUUjoKLSAgICBjYXNlIFdPUkRfUFRSOgotICAgIGNhc2UgRFdPUkRfUFRSOgotICAgIGNhc2UgUVdPUkRfUFRSOgotICAgIGNhc2UgWFdPUkRfUFRSOgotICAgICAgaWYgKChpLm1lbV9vcGVyYW5kcyA9PSAxCi0gICAgICAgICAgICYmIChjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm9wY29kZV9tb2RpZmllciAmIElzU3RyaW5nKSA9PSAwKQotICAgICAgICAgIHx8IGkubWVtX29wZXJhbmRzID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICBhc19iYWQgKF8oInRvbyBtYW55IG1lbW9yeSByZWZlcmVuY2VzIGZvciBgJXMnIiksCi0gICAgICAgICAgICAgICAgICBjdXJyZW50X3RlbXBsYXRlcy0+c3RhcnQtPm5hbWUpOwotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgIGlmICghaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCAob3Bfc3RyaW5nKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgIGkubWVtX29wZXJhbmRzKys7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRkxBVDoKLQotICAgIGNhc2UgT0ZGU0VUX0ZMQVQ6Ci0gICAgICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTSE9SVDoKLQotICAgIGNhc2UgTk9ORV9GT1VORDoKLSAgICAvKiBTaG91bGQgYmUgcmVnaXN0ZXIgb3IgaW1tZWRpYXRlICovCi0gICAgaWYgKGlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpCi0gICAgICAgICYmIHN0cmNociAob3Bfc3RyaW5nLCAnWycpID09IDApCi0gICAgICB7Ci0gICAgICBpZiAoIWkzODZfaW1tZWRpYXRlIChvcF9zdHJpbmcpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICBlbHNlIGlmICgqb3Bfc3RyaW5nID09IFJFR0lTVEVSX1BSRUZJWAotICAgICAgICAgICAgIHx8IChhbGxvd19uYWtlZF9yZWcKLQkgICAgICAgICAmJiBpMzg2X2lzX3JlZyAob3Bfc3RyaW5nKSkpCi0gICAgICB7Ci0KLSAgICAgICAgcmVnaXN0ZXIgY29uc3QgcmVnX2VudHJ5ICogcjsKLSAgICAgICAgY2hhciAqZW5kX29wOwotCi0gICAgICAgIHIgPSBwYXJzZV9yZWdpc3RlciAob3Bfc3RyaW5nLCAmZW5kX29wKTsKLSAgICAgICAgaWYgKHIgPT0gTlVMTCkKLSAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvKiBDaGVjayBmb3IgYSBzZWdtZW50IG92ZXJyaWRlIGJ5IHNlYXJjaGluZyBmb3IgJzonIGFmdGVyIGEKLSAgICAgICAgICAgc2VnbWVudCByZWdpc3Rlci4gICovCi0gICAgICAgIG9wX3N0cmluZyA9IGVuZF9vcDsKLSAgICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotICAgICAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgICBpZiAoKm9wX3N0cmluZyA9PSAnOicgJiYgKHItPnJlZ190eXBlICYgKFNSZWcyIHwgU1JlZzMpKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHItPnJlZ19udW0pCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZlczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZjczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZzczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZkczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZmczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIGkuc2VnW2kubWVtX29wZXJhbmRzXSA9ICZnczsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgfQotICAgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gci0+cmVnX3R5cGUgJiB+QmFzZUluZGV4OwotICAgICAgICBpLnJlZ3NbdGhpc19vcGVyYW5kXSA9IHI7Ci0gICAgICAgIGkucmVnX29wZXJhbmRzKys7Ci0gICAgICB9Ci0KLSAgICBlbHNlIAotICAgICAgewotCi0gICAgICAgIGlmICghaTM4Nl9pbnRlbF9tZW1vcnlfb3BlcmFuZCAob3Bfc3RyaW5nKSkKLSAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBpLm1lbV9vcGVyYW5kcysrOwotICAgICAgfQotICAgIGJyZWFrOwotCi0gIH0gIC8qIGVuZCBzd2l0Y2ggKi8KLSAgLyogU3BlY2lhbCBjYXNlIGZvciAoJWR4KSB3aGlsZSBkb2luZyBpbnB1dC9vdXRwdXQgb3AuICAqLwotICBpZiAoaS5iYXNlX3JlZwotICAgICAgJiYgaS5iYXNlX3JlZy0+cmVnX3R5cGUgPT0gKFJlZzE2IHwgSW5PdXRQb3J0UmVnKQotICAgICAgJiYgaS5pbmRleF9yZWcgPT0gMAotICAgICAgJiYgaS5sb2cyX3NjYWxlX2ZhY3RvciA9PSAwCi0gICAgICAmJiBpLnNlZ1tpLm1lbV9vcGVyYW5kc10gPT0gMAotICAgICAgJiYgKGkudHlwZXNbdGhpc19vcGVyYW5kXSAmIERpc3ApID09IDApCi0gICAgIHsKLSAgICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gPSBJbk91dFBvcnRSZWc7Ci0gICAgICAgcmV0dXJuIDE7Ci0gICAgIH0KLSAgLyogTWFrZSBzdXJlIHRoZSBtZW1vcnkgb3BlcmFuZCB3ZSd2ZSBiZWVuIGRlYWx0IGlzIHZhbGlkLiAgKi8KLSAgaWYgKGZsYWdfMTZiaXRfY29kZSBeIChpLnByZWZpeFtBRERSX1BSRUZJWF0gIT0gMCkpCi0gICAgewotICAgICAgaWYgKChpLmJhc2VfcmVnCi0JICAgJiYgKChpLmJhc2VfcmVnLT5yZWdfdHlwZSAmIChSZWcxNnxCYXNlSW5kZXgpKQotCQkhPSAoUmVnMTZ8QmFzZUluZGV4KSkpCi0JICAgICAgfHwgKGkuaW5kZXhfcmVnCi0JCSAgJiYgKCgoaS5pbmRleF9yZWctPnJlZ190eXBlICYgKFJlZzE2fEJhc2VJbmRleCkpCi0JCSAgICAgICAhPSAoUmVnMTZ8QmFzZUluZGV4KSkKLQkJICAgICAgfHwgISAoaS5iYXNlX3JlZwotCQkJICAgICYmIGkuYmFzZV9yZWctPnJlZ19udW0gPCA2Ci0JCQkgICAgJiYgaS5pbmRleF9yZWctPnJlZ19udW0gPj0gNgotCQkJICAgICYmIGkubG9nMl9zY2FsZV9mYWN0b3IgPT0gMCkpKSkKLQkgewotCSAgIGFzX2JhZCAoXygiYCVzJyBpcyBub3QgYSB2YWxpZCAlcyBiaXQgYmFzZS9pbmRleCBleHByZXNzaW9uIiksCi0gICAgICAgICAgICAgICAgICAgb3BlcmFuZF9zdHJpbmcsICIxNiIpOwotICAgICAgICAgICByZXR1cm4gMDsKLQkgfQotICAgIH0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKGkuYmFzZV9yZWcKLQkgICAgICAgJiYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMzIpID09IDApCi0JICAgICAgfHwgKGkuaW5kZXhfcmVnCi0JCSAgJiYgKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMzJ8QmFzZUluZGV4KSkKLQkJICAgICAgIT0gKFJlZzMyfEJhc2VJbmRleCkpKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYCVzJyBpcyBub3QgYSB2YWxpZCAlcyBiaXQgYmFzZS9pbmRleCBleHByZXNzaW9uIiksCi0JCSAgICAgIG9wZXJhbmRfc3RyaW5nLCAiMzIiKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFBhcnNlIE9QRVJBTkRfU1RSSU5HIGludG8gdGhlIGkzODZfaW5zbiBzdHJ1Y3R1cmUgSS4gIFJldHVybnMgbm9uLXplcm8KLSAgIG9uIGVycm9yLiAqLwotCi1zdGF0aWMgaW50IGkzODZfb3BlcmFuZCBQQVJBTVMgKChjaGFyICopKTsKLQotc3RhdGljIGludAotaTM4Nl9vcGVyYW5kIChvcGVyYW5kX3N0cmluZykKLSAgICAgY2hhciAqb3BlcmFuZF9zdHJpbmc7Ci17Ci0gIGNoYXIgKm9wX3N0cmluZyA9IG9wZXJhbmRfc3RyaW5nOwotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLSAgICArK29wX3N0cmluZzsKLQotICAvKiBXZSBjaGVjayBmb3IgYW4gYWJzb2x1dGUgcHJlZml4IChkaWZmZXJlbnRpYXRpbmcsCi0gICAgIGZvciBleGFtcGxlLCAnam1wIHBjX3JlbGF0aXZlX2xhYmVsJyBmcm9tICdqbXAgKmFic29sdXRlX2xhYmVsJy4gKi8KLSAgaWYgKCpvcF9zdHJpbmcgPT0gQUJTT0xVVEVfUFJFRklYKQotICAgIHsKLSAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpvcF9zdHJpbmcpKQotICAgICAgICArK29wX3N0cmluZzsKLSAgICAgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBKdW1wQWJzb2x1dGU7Ci0gICAgfQotCi0gIC8qIENoZWNrIGlmIG9wZXJhbmQgaXMgYSByZWdpc3Rlci4gKi8KLSAgaWYgKCpvcF9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYCi0gICAgICB8fCAoYWxsb3dfbmFrZWRfcmVnICYmIGkzODZfaXNfcmVnIChvcF9zdHJpbmcpKSkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjb25zdCByZWdfZW50cnkgKnI7Ci0gICAgICBjaGFyICplbmRfb3A7Ci0KLSAgICAgIHIgPSBwYXJzZV9yZWdpc3RlciAob3Bfc3RyaW5nLCAmZW5kX29wKTsKLSAgICAgIGlmIChyID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICAvKiBDaGVjayBmb3IgYSBzZWdtZW50IG92ZXJyaWRlIGJ5IHNlYXJjaGluZyBmb3IgJzonIGFmdGVyIGEKLQkgc2VnbWVudCByZWdpc3Rlci4gICovCi0gICAgICBvcF9zdHJpbmcgPSBlbmRfb3A7Ci0gICAgICBpZiAoaXNfc3BhY2VfY2hhciAoKm9wX3N0cmluZykpCi0gICAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgaWYgKCpvcF9zdHJpbmcgPT0gJzonICYmIChyLT5yZWdfdHlwZSAmIChTUmVnMiB8IFNSZWczKSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzd2l0Y2ggKHItPnJlZ19udW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmVzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDE6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmNzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDI6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJnNzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDM6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmRzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDQ6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmZzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDU6Ci0JICAgICAgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID0gJmdzOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIFNraXAgdGhlICc6JyBhbmQgd2hpdGVzcGFjZS4gICovCi0JICArK29wX3N0cmluZzsKLQkgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLQkgICAgKytvcF9zdHJpbmc7Ci0KLQkgIC8qIFByZXRlbmQgZ2l2ZW4gc3RyaW5nIHN0YXJ0cyBoZXJlLiAqLwotCSAgb3BlcmFuZF9zdHJpbmcgPSBvcF9zdHJpbmc7Ci0JICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCpvcF9zdHJpbmcpCi0JICAgICAgJiYgIWlzX2lkZW50aWZpZXJfY2hhciAoKm9wX3N0cmluZykKLQkgICAgICAmJiAqb3Bfc3RyaW5nICE9ICcoJwotCSAgICAgICYmICpvcF9zdHJpbmcgIT0gQUJTT0xVVEVfUFJFRklYKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgbWVtb3J5IG9wZXJhbmQgYCVzJyIpLCBvcF9zdHJpbmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAvKiBIYW5kbGUgY2FzZSBvZiAlZXM6KmZvby4gKi8KLQkgIGlmICgqb3Bfc3RyaW5nID09IEFCU09MVVRFX1BSRUZJWCkKLQkgICAgewotCSAgICAgICsrb3Bfc3RyaW5nOwotCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqb3Bfc3RyaW5nKSkKLQkJKytvcF9zdHJpbmc7Ci0JICAgICAgaS50eXBlc1t0aGlzX29wZXJhbmRdIHw9IEp1bXBBYnNvbHV0ZTsKLQkgICAgfQotCSAgZ290byBkb19tZW1vcnlfcmVmZXJlbmNlOwotCX0KLSAgICAgIGlmICgqb3Bfc3RyaW5nKQotCXsKLQkgIGFzX2JhZCAoXygiSnVuayBgJXMnIGFmdGVyIHJlZ2lzdGVyIiksIG9wX3N0cmluZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBpLnR5cGVzW3RoaXNfb3BlcmFuZF0gfD0gci0+cmVnX3R5cGUgJiB+QmFzZUluZGV4OwotICAgICAgaS5yZWdzW3RoaXNfb3BlcmFuZF0gPSByOwotICAgICAgaS5yZWdfb3BlcmFuZHMrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCpvcF9zdHJpbmcgPT0gSU1NRURJQVRFX1BSRUZJWCkKLSAgICB7CQkJCS8qIC4uLiBvciBhbiBpbW1lZGlhdGUgKi8KLSAgICAgICsrb3Bfc3RyaW5nOwotICAgICAgaWYgKCFpMzg2X2ltbWVkaWF0ZSAob3Bfc3RyaW5nKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBlbHNlIGlmIChpc19kaWdpdF9jaGFyICgqb3Bfc3RyaW5nKSAKLSAgICAgICAgICAgfHwgaXNfaWRlbnRpZmllcl9jaGFyICgqb3Bfc3RyaW5nKQotCSAgIHx8ICpvcF9zdHJpbmcgPT0gJygnICkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGEgbWVtb3J5IHJlZmVyZW5jZSBvZiBzb21lIHNvcnQuICovCi0gICAgICBjaGFyICplbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0gICAgICByZWdpc3RlciBjaGFyICpiYXNlX3N0cmluZzsKLSAgICAgIGludCBmb3VuZF9iYXNlX2luZGV4X2Zvcm07Ci0KLSAgICAgIC8qIFN0YXJ0IGFuZCBlbmQgb2YgZGlzcGxhY2VtZW50IHN0cmluZyBleHByZXNzaW9uIChpZiBmb3VuZCkuICovCi0gICAgICBjaGFyICpkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0OwotICAgICAgY2hhciAqZGlzcGxhY2VtZW50X3N0cmluZ19lbmQ7Ci0KLSAgICBkb19tZW1vcnlfcmVmZXJlbmNlOgotCi0gICAgICBpZiAoKGkubWVtX29wZXJhbmRzID09IDEKLQkgICAmJiAoY3VycmVudF90ZW1wbGF0ZXMtPnN0YXJ0LT5vcGNvZGVfbW9kaWZpZXIgJiBJc1N0cmluZykgPT0gMCkKLQkgIHx8IGkubWVtX29wZXJhbmRzID09IDIpCi0JewotCSAgYXNfYmFkIChfKCJ0b28gbWFueSBtZW1vcnkgcmVmZXJlbmNlcyBmb3IgYCVzJyIpLAotCQkgIGN1cnJlbnRfdGVtcGxhdGVzLT5zdGFydC0+bmFtZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIC8qIENoZWNrIGZvciBiYXNlIGluZGV4IGZvcm0uICBXZSBkZXRlY3QgdGhlIGJhc2UgaW5kZXggZm9ybSBieQotCSBsb29raW5nIGZvciBhbiAnKScgYXQgdGhlIGVuZCBvZiB0aGUgb3BlcmFuZCwgc2VhcmNoaW5nCi0JIGZvciB0aGUgJygnIG1hdGNoaW5nIGl0LCBhbmQgZmluZGluZyBhIFJFR0lTVEVSX1BSRUZJWCBvciAnLCcKLQkgYWZ0ZXIgdGhlICcoJy4gICovCi0gICAgICBmb3VuZF9iYXNlX2luZGV4X2Zvcm0gPSAwOwotICAgICAgZW5kX29mX29wZXJhbmRfc3RyaW5nID0gb3Bfc3RyaW5nICsgc3RybGVuIChvcF9zdHJpbmcpOwotCi0gICAgICAtLWVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqZW5kX29mX29wZXJhbmRfc3RyaW5nKSkKLQktLWVuZF9vZl9vcGVyYW5kX3N0cmluZzsKLQotICAgICAgYmFzZV9zdHJpbmcgPSBlbmRfb2Zfb3BlcmFuZF9zdHJpbmc7Ci0KLSAgICAgIGlmICgqYmFzZV9zdHJpbmcgPT0gJyknKQotCXsKLQkgIHVuc2lnbmVkIGludCBwYXJlbnNfYmFsYW5jZWQgPSAxOwotCSAgLyogV2UndmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlIG51bWJlciBvZiBsZWZ0ICYgcmlnaHQgKCkncyBhcmUKLQkgICAgIGVxdWFsLCBzbyB0aGlzIGxvb3Agd2lsbCBub3QgYmUgaW5maW5pdGUuICovCi0JICBkbwotCSAgICB7Ci0JICAgICAgYmFzZV9zdHJpbmctLTsKLQkgICAgICBpZiAoKmJhc2Vfc3RyaW5nID09ICcpJykKLQkJcGFyZW5zX2JhbGFuY2VkKys7Ci0JICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSAnKCcpCi0JCXBhcmVuc19iYWxhbmNlZC0tOwotCSAgICB9Ci0JICB3aGlsZSAocGFyZW5zX2JhbGFuY2VkKTsKLQotCSAgLyogSWYgdGhlcmUgaXMgYSBkaXNwbGFjZW1lbnQgc2V0LXVwIGZvciBpdCB0byBiZSBwYXJzZWQgbGF0ZXIuICovCi0JICBkaXNwbGFjZW1lbnRfc3RyaW5nX3N0YXJ0ID0gb3Bfc3RyaW5nOwotCSAgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgPSBiYXNlX3N0cmluZzsKLQotCSAgLyogU2tpcCBwYXN0ICcoJyBhbmQgd2hpdGVzcGFjZS4gICovCi0JICArK2Jhc2Vfc3RyaW5nOwotCSAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JICAgICsrYmFzZV9zdHJpbmc7Ci0KLQkgIGlmICgqYmFzZV9zdHJpbmcgPT0gUkVHSVNURVJfUFJFRklYCi0JICAgICAgfHwgKGFsbG93X25ha2VkX3JlZyAmJiBpMzg2X2lzX3JlZyAoYmFzZV9zdHJpbmcpKQotCSAgICAgIHx8ICpiYXNlX3N0cmluZyA9PSAnLCcpCi0JICAgIGZvdW5kX2Jhc2VfaW5kZXhfZm9ybSA9IDE7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBjYW4ndCBwYXJzZSBhIGJhc2UgaW5kZXggcmVnaXN0ZXIgZXhwcmVzc2lvbiwgd2UndmUgZm91bmQKLQkgYSBwdXJlIGRpc3BsYWNlbWVudCBleHByZXNzaW9uLiAgV2Ugc2V0IHVwIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQKLQkgYW5kIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kIGZvciB0aGUgY29kZSBiZWxvdy4gKi8KLSAgICAgIGlmICghZm91bmRfYmFzZV9pbmRleF9mb3JtKQotCXsKLQkgIGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgPSBvcF9zdHJpbmc7Ci0JICBkaXNwbGFjZW1lbnRfc3RyaW5nX2VuZCA9IGVuZF9vZl9vcGVyYW5kX3N0cmluZyArIDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGkudHlwZXNbdGhpc19vcGVyYW5kXSB8PSBCYXNlSW5kZXg7Ci0KLQkgIC8qIEZpbmQgYmFzZSByZWdpc3RlciAoaWYgYW55KS4gKi8KLQkgIGlmICgqYmFzZV9zdHJpbmcgIT0gJywnKQotCSAgICB7Ci0JICAgICAgY2hhciAqZW5kX29wOwotCi0JICAgICAgLyogVHJpbSBvZmYgdGhlIGNsb3NpbmcgJyknIHNvIHRoYXQgcGFyc2VfcmVnaXN0ZXIgd29uJ3QKLQkJIHNlZSBpdC4gICovCi0JICAgICAgRU5EX1NUUklOR19BTkRfU0FWRSAoZW5kX29mX29wZXJhbmRfc3RyaW5nKTsKLQkgICAgICBpLmJhc2VfcmVnID0gcGFyc2VfcmVnaXN0ZXIgKGJhc2Vfc3RyaW5nLCAmZW5kX29wKTsKLQkgICAgICBSRVNUT1JFX0VORF9TVFJJTkcgKGVuZF9vZl9vcGVyYW5kX3N0cmluZyk7Ci0KLQkgICAgICBpZiAoaS5iYXNlX3JlZyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCSAgICAgIGJhc2Vfc3RyaW5nID0gZW5kX29wOwotCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkrK2Jhc2Vfc3RyaW5nOwotCSAgICB9Ci0KLQkgIC8qIFRoZXJlIG1heSBiZSBhbiBpbmRleCByZWcgb3Igc2NhbGUgZmFjdG9yIGhlcmUuICAqLwotCSAgaWYgKCpiYXNlX3N0cmluZyA9PSAnLCcpCi0JICAgIHsKLQkgICAgICArK2Jhc2Vfc3RyaW5nOwotCSAgICAgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkrK2Jhc2Vfc3RyaW5nOwotCi0JICAgICAgaWYgKCpiYXNlX3N0cmluZyA9PSBSRUdJU1RFUl9QUkVGSVgKLQkJICB8fCAoYWxsb3dfbmFrZWRfcmVnICYmIGkzODZfaXNfcmVnIChiYXNlX3N0cmluZykpKQotCQl7Ci0JCSAgY2hhciAqZW5kX29wOwotCi0JCSAgRU5EX1NUUklOR19BTkRfU0FWRSAoZW5kX29mX29wZXJhbmRfc3RyaW5nKTsKLQkJICBpLmluZGV4X3JlZyA9IHBhcnNlX3JlZ2lzdGVyIChiYXNlX3N0cmluZywgJmVuZF9vcCk7Ci0JCSAgUkVTVE9SRV9FTkRfU1RSSU5HIChlbmRfb2Zfb3BlcmFuZF9zdHJpbmcpOwotCi0JCSAgaWYgKGkuaW5kZXhfcmVnID09IE5VTEwpCi0JCSAgICByZXR1cm4gMDsKLQotCQkgIGJhc2Vfc3RyaW5nID0gZW5kX29wOwotCQkgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkgICAgKytiYXNlX3N0cmluZzsKLQkJICBpZiAoKmJhc2Vfc3RyaW5nID09ICcsJykKLQkJICAgIHsKLQkJICAgICAgKytiYXNlX3N0cmluZzsKLQkJICAgICAgaWYgKGlzX3NwYWNlX2NoYXIgKCpiYXNlX3N0cmluZykpCi0JCQkrK2Jhc2Vfc3RyaW5nOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCpiYXNlX3N0cmluZyAhPSAnKScgKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oImV4cGVjdGluZyBgLCcgb3IgYCknIGFmdGVyIGluZGV4IHJlZ2lzdGVyIGluIGAlcyciKSwKLQkJCSAgICAgIG9wZXJhbmRfc3RyaW5nKTsKLQkJICAgICAgcmV0dXJuIDA7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIENoZWNrIGZvciBzY2FsZSBmYWN0b3IuICovCi0JICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqYmFzZV9zdHJpbmcpKQotCQl7Ci0gICAgICAgICAgICAgICAgICBpZiAoIWkzODZfc2NhbGUgKGJhc2Vfc3RyaW5nKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLQkJICArK2Jhc2Vfc3RyaW5nOwotCQkgIGlmIChpc19zcGFjZV9jaGFyICgqYmFzZV9zdHJpbmcpKQotCQkgICAgKytiYXNlX3N0cmluZzsKLQkJICBpZiAoKmJhc2Vfc3RyaW5nICE9ICcpJykKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgYCknIGFmdGVyIHNjYWxlIGZhY3RvciBpbiBgJXMnIiksCi0JCQkgICAgICBvcGVyYW5kX3N0cmluZyk7Ci0JCSAgICAgIHJldHVybiAwOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoIWkuaW5kZXhfcmVnKQotCQl7Ci0JCSAgYXNfYmFkIChfKCJleHBlY3RpbmcgaW5kZXggcmVnaXN0ZXIgb3Igc2NhbGUgZmFjdG9yIGFmdGVyIGAsJzsgZ290ICclYyciKSwKLQkJCSAgKmJhc2Vfc3RyaW5nKTsKLQkJICByZXR1cm4gMDsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmICgqYmFzZV9zdHJpbmcgIT0gJyknKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBiYXNlIHJlZ2lzdGVyIGluIGAlcyciKSwKLQkJICAgICAgb3BlcmFuZF9zdHJpbmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGVyZSdzIGFuIGV4cHJlc3Npb24gYmVnaW5uaW5nIHRoZSBvcGVyYW5kLCBwYXJzZSBpdCwKLQkgYXNzdW1pbmcgZGlzcGxhY2VtZW50X3N0cmluZ19zdGFydCBhbmQKLQkgZGlzcGxhY2VtZW50X3N0cmluZ19lbmQgYXJlIG1lYW5pbmdmdWwuICAqLwotICAgICAgaWYgKGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQgIT0gZGlzcGxhY2VtZW50X3N0cmluZ19lbmQpCi0JewotICAgICAgICAgIGlmICghaTM4Nl9kaXNwbGFjZW1lbnQgKGRpc3BsYWNlbWVudF9zdHJpbmdfc3RhcnQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYWNlbWVudF9zdHJpbmdfZW5kKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCX0KLQotICAgICAgLyogU3BlY2lhbCBjYXNlIGZvciAoJWR4KSB3aGlsZSBkb2luZyBpbnB1dC9vdXRwdXQgb3AuICAqLwotICAgICAgaWYgKGkuYmFzZV9yZWcKLQkgICYmIGkuYmFzZV9yZWctPnJlZ190eXBlID09IChSZWcxNiB8IEluT3V0UG9ydFJlZykKLQkgICYmIGkuaW5kZXhfcmVnID09IDAKLQkgICYmIGkubG9nMl9zY2FsZV9mYWN0b3IgPT0gMAotCSAgJiYgaS5zZWdbaS5tZW1fb3BlcmFuZHNdID09IDAKLQkgICYmIChpLnR5cGVzW3RoaXNfb3BlcmFuZF0gJiBEaXNwKSA9PSAwKQotCXsKLQkgIGkudHlwZXNbdGhpc19vcGVyYW5kXSA9IEluT3V0UG9ydFJlZzsKLQkgIHJldHVybiAxOwotCX0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0aGUgbWVtb3J5IG9wZXJhbmQgd2UndmUgYmVlbiBkZWFsdCBpcyB2YWxpZC4gICovCi0gICAgICBpZiAoZmxhZ18xNmJpdF9jb2RlIF4gKGkucHJlZml4W0FERFJfUFJFRklYXSAhPSAwKSkKLQl7Ci0JICBpZiAoKGkuYmFzZV9yZWcKLQkgICAgICAgJiYgKChpLmJhc2VfcmVnLT5yZWdfdHlwZSAmIChSZWcxNnxCYXNlSW5kZXgpKQotCQkgICAhPSAoUmVnMTZ8QmFzZUluZGV4KSkpCi0JICAgICAgfHwgKGkuaW5kZXhfcmVnCi0JCSAgJiYgKCgoaS5pbmRleF9yZWctPnJlZ190eXBlICYgKFJlZzE2fEJhc2VJbmRleCkpCi0JCSAgICAgICAhPSAoUmVnMTZ8QmFzZUluZGV4KSkKLQkJICAgICAgfHwgISAoaS5iYXNlX3JlZwotCQkJICAgICYmIGkuYmFzZV9yZWctPnJlZ19udW0gPCA2Ci0JCQkgICAgJiYgaS5pbmRleF9yZWctPnJlZ19udW0gPj0gNgotCQkJICAgICYmIGkubG9nMl9zY2FsZV9mYWN0b3IgPT0gMCkpKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYCVzJyBpcyBub3QgYSB2YWxpZCAlcyBiaXQgYmFzZS9pbmRleCBleHByZXNzaW9uIiksCi0JCSAgICAgIG9wZXJhbmRfc3RyaW5nLCAiMTYiKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKGkuYmFzZV9yZWcKLQkgICAgICAgJiYgKGkuYmFzZV9yZWctPnJlZ190eXBlICYgUmVnMzIpID09IDApCi0JICAgICAgfHwgKGkuaW5kZXhfcmVnCi0JCSAgJiYgKChpLmluZGV4X3JlZy0+cmVnX3R5cGUgJiAoUmVnMzJ8QmFzZUluZGV4KSkKLQkJICAgICAgIT0gKFJlZzMyfEJhc2VJbmRleCkpKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiYCVzJyBpcyBub3QgYSB2YWxpZCAlcyBiaXQgYmFzZS9pbmRleCBleHByZXNzaW9uIiksCi0JCSAgICAgIG9wZXJhbmRfc3RyaW5nLCAiMzIiKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICAgIGkubWVtX29wZXJhbmRzKys7Ci0gICAgfQotICBlbHNlCi0gICAgewkJCQkvKiBpdCdzIG5vdCBhIG1lbW9yeSBvcGVyYW5kOyBhcmdoISAqLwotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIGNoYXIgJXMgYmVnaW5uaW5nIG9wZXJhbmQgJWQgYCVzJyIpLAotCSAgICAgIG91dHB1dF9pbnZhbGlkICgqb3Bfc3RyaW5nKSwKLQkgICAgICB0aGlzX29wZXJhbmQgKyAxLAotCSAgICAgIG9wX3N0cmluZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwkJCS8qIG5vcm1hbCByZXR1cm4gKi8KLX0KLQwKLS8qCi0gKgkJCW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KCkKLSAqCi0gKiBDYWxsZWQganVzdCBiZWZvcmUgcmVsYXgoKS4KLSAqIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgotICogUmV0dXJuIHRoZSBjb3JyZWN0IGZyX3N1YnR5cGUgaW4gdGhlIGZyYWcuCi0gKiBSZXR1cm4gdGhlIGluaXRpYWwgImd1ZXNzIGZvciBmcl92YXIiIHRvIGNhbGxlci4KLSAqIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KLSAqIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCi0gKiBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCi0gKiAwIHZhbHVlLgotICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnQ7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKm9wY29kZTsKLSAgcmVnaXN0ZXIgaW50IG9sZF9mcl9maXg7Ci0KLSAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0gIG9wY29kZSA9ICh1bnNpZ25lZCBjaGFyICopIGZyYWdQLT5mcl9vcGNvZGU7Ci0gIC8qIFdlJ3ZlIGFscmVhZHkgZ290IGZyYWdQLT5mcl9zdWJ0eXBlIHJpZ2h0OyAgYWxsIHdlIGhhdmUgdG8gZG8gaXMKLSAgICAgY2hlY2sgZm9yIHVuLXJlbGF4YWJsZSBzeW1ib2xzLiAgKi8KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnQpCi0gICAgewotICAgICAgLyogc3ltYm9sIGlzIHVuZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQgKi8KLSAgICAgIGludCBjb2RlMTYgPSBmcmFnUC0+ZnJfc3VidHlwZSAmIENPREUxNjsKLSAgICAgIGludCBzaXplID0gY29kZTE2ID8gMiA6IDQ7Ci0gICAgICBpbnQgcGNyZWxfcmVsb2MgPSBjb2RlMTYgPyBCRkRfUkVMT0NfMTZfUENSRUwgOiBCRkRfUkVMT0NfMzJfUENSRUw7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlWzBdKQotCXsKLQljYXNlIEpVTVBfUENfUkVMQVRJVkU6CS8qIG1ha2Ugam1wICgweGViKSBhIGR3b3JkIGRpc3BsYWNlbWVudCBqdW1wICovCi0JICBvcGNvZGVbMF0gPSAweGU5OwkvKiBkd29yZCBkaXNwIGptcCAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSBzaXplOwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXgsIHNpemUsCi0JCSAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsCi0JCSAgIChHT1Rfc3ltYm9sICYmIC8qIE5vdCBxdWl0ZSByaWdodCAtIHdlIHNob3VsZCBzd2l0Y2ggb24KLQkJCQkgICAgIHByZXNlbmNlIG9mIEBQTFQsIGJ1dCBJIGNhbm5vdCBzZWUgaG93Ci0JCQkJICAgICB0byBnZXQgdG8gdGhhdCBmcm9tIGhlcmUuICBXZSBzaG91bGQgaGF2ZQotCQkJCSAgICAgZG9uZSB0aGlzIGluIG1kX2Fzc2VtYmxlIHRvIHJlYWxseQotCQkJCSAgICAgZ2V0IGl0IHJpZ2h0IGFsbCBvZiB0aGUgdGltZSwgYnV0IEkKLQkJCQkgICAgIHRoaW5rIGl0IGRvZXMgbm90IG1hdHRlciB0aGF0IG11Y2gsIGFzCi0JCQkJICAgICB0aGlzIHdpbGwgYmUgcmlnaHQgbW9zdCBvZiB0aGUgdGltZS4gRVJZKi8KLQkJICAgIFNfR0VUX1NFR01FTlQoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgID8gQkZEX1JFTE9DXzM4Nl9QTFQzMiA6IHBjcmVsX3JlbG9jKTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIC8qIFRoaXMgY2hhbmdlcyB0aGUgYnl0ZS1kaXNwbGFjZW1lbnQganVtcCAweDdOIC0tPgotCQkJICAgdGhlIGR3b3JkLWRpc3BsYWNlbWVudCBqdW1wIDB4MGY4TiAqLwotCSAgb3Bjb2RlWzFdID0gb3Bjb2RlWzBdICsgMHgxMDsKLQkgIG9wY29kZVswXSA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7CS8qIHR3by1ieXRlIGVzY2FwZSAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgc2l6ZTsJLyogd2UndmUgYWRkZWQgYW4gb3Bjb2RlIGJ5dGUgKi8KLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgc2l6ZSwKLQkJICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwKLQkJICAgKEdPVF9zeW1ib2wgJiYgIC8qIE5vdCBxdWl0ZSByaWdodCAtIHdlIHNob3VsZCBzd2l0Y2ggb24KLQkJCQkgICAgIHByZXNlbmNlIG9mIEBQTFQsIGJ1dCBJIGNhbm5vdCBzZWUgaG93Ci0JCQkJICAgICB0byBnZXQgdG8gdGhhdCBmcm9tIGhlcmUuICBFUlkgKi8KLQkJICAgIFNfR0VUX1NFR01FTlQoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgID8gQkZEX1JFTE9DXzM4Nl9QTFQzMiA6IHBjcmVsX3JlbG9jKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotICAgIH0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0MCi0vKgotICoJCQltZF9jb252ZXJ0X2ZyYWcoKTsKLSAqCi0gKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KLSAqIEluOglBZGRyZXNzIG9mIGZyYWcuCi0gKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCi0gKgotICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgotICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICovCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZWxzZQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZW5kaWYKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqb3Bjb2RlOwotICB1bnNpZ25lZCBjaGFyICp3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gTlVMTDsKLSAgdW5zaWduZWQgaW50IHRhcmdldF9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgb3Bjb2RlX2FkZHJlc3M7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb24gPSAwOwotICBpbnQgZGlzcGxhY2VtZW50X2Zyb21fb3Bjb2RlX3N0YXJ0OwotCi0gIG9wY29kZSA9ICh1bnNpZ25lZCBjaGFyICopIGZyYWdQLT5mcl9vcGNvZGU7Ci0KLSAgLyogQWRkcmVzcyB3ZSB3YW50IHRvIHJlYWNoIGluIGZpbGUgc3BhY2UuICovCi0gIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSIC8qIG5vdCBuZWVkZWQgb3RoZXJ3aXNlPyAqLwotICB0YXJnZXRfYWRkcmVzcyArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0KLSAgLyogQWRkcmVzcyBvcGNvZGUgcmVzaWRlcyBhdCBpbiBmaWxlIHNwYWNlLiAqLwotICBvcGNvZGVfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeDsKLQotICAvKiBEaXNwbGFjZW1lbnQgZnJvbSBvcGNvZGUgc3RhcnQgdG8gZmlsbCBpbnRvIGluc3RydWN0aW9uLiAqLwotICBkaXNwbGFjZW1lbnRfZnJvbV9vcGNvZGVfc3RhcnQgPSB0YXJnZXRfYWRkcmVzcyAtIG9wY29kZV9hZGRyZXNzOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIFNNQUxMKToKLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoQ09ORF9KVU1QLCBTTUFMTDE2KToKLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIFNNQUxMKToKLSAgICBjYXNlIEVOQ09ERV9SRUxBWF9TVEFURSAoVU5DT05EX0pVTVAsIFNNQUxMMTYpOgotICAgICAgLyogZG9uJ3QgaGF2ZSB0byBjaGFuZ2Ugb3Bjb2RlICovCi0gICAgICBleHRlbnNpb24gPSAxOwkJLyogMSBvcGNvZGUgKyAxIGRpc3BsYWNlbWVudCAqLwotICAgICAgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCA9ICZvcGNvZGVbMV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChDT05EX0pVTVAsIEJJRyk6Ci0gICAgICBleHRlbnNpb24gPSA1OwkJLyogMiBvcGNvZGUgKyA0IGRpc3BsYWNlbWVudCAqLwotICAgICAgb3Bjb2RlWzFdID0gb3Bjb2RlWzBdICsgMHgxMDsKLSAgICAgIG9wY29kZVswXSA9IFRXT19CWVRFX09QQ09ERV9FU0NBUEU7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsyXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKFVOQ09ORF9KVU1QLCBCSUcpOgotICAgICAgZXh0ZW5zaW9uID0gNDsJCS8qIDEgb3Bjb2RlICsgNCBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIG9wY29kZVswXSA9IDB4ZTk7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVhfU1RBVEUgKENPTkRfSlVNUCwgQklHMTYpOgotICAgICAgZXh0ZW5zaW9uID0gMzsJCS8qIDIgb3Bjb2RlICsgMiBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIG9wY29kZVsxXSA9IG9wY29kZVswXSArIDB4MTA7Ci0gICAgICBvcGNvZGVbMF0gPSBUV09fQllURV9PUENPREVfRVNDQVBFOwotICAgICAgd2hlcmVfdG9fcHV0X2Rpc3BsYWNlbWVudCA9ICZvcGNvZGVbMl07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYX1NUQVRFIChVTkNPTkRfSlVNUCwgQklHMTYpOgotICAgICAgZXh0ZW5zaW9uID0gMjsJCS8qIDEgb3Bjb2RlICsgMiBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIG9wY29kZVswXSA9IDB4ZTk7Ci0gICAgICB3aGVyZV90b19wdXRfZGlzcGxhY2VtZW50ID0gJm9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIC8qIG5vdyBwdXQgZGlzcGxhY2VtZW50IGFmdGVyIG9wY29kZSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKChjaGFyICopIHdoZXJlX3RvX3B1dF9kaXNwbGFjZW1lbnQsCi0JCSAgICAgICh2YWx1ZVQpIChkaXNwbGFjZW1lbnRfZnJvbV9vcGNvZGVfc3RhcnQgLSBleHRlbnNpb24pLAotCQkgICAgICBTSVpFX0ZST01fUkVMQVhfU1RBVEUgKGZyYWdQLT5mcl9zdWJ0eXBlKSk7Ci0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotfQotDAotCi1pbnQgbWRfc2hvcnRfanVtcF9zaXplID0gMjsJLyogc2l6ZSBvZiBieXRlIGRpc3BsYWNlbWVudCBqbXAgKi8KLWludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDU7CS8qIHNpemUgb2YgZHdvcmQgZGlzcGxhY2VtZW50IGptcCAqLwotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgbG9uZyBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAyKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4ZWIsIDEpOwkvKiBvcGNvZGUgZm9yIGJ5dGUtZGlzcCBqdW1wICovCi0gIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCAxKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIGxvbmcgb2Zmc2V0OwotCi0gIGlmIChmbGFnX2RvX2xvbmdfanVtcCkKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gU19HRVRfVkFMVUUgKHRvX3N5bWJvbCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHhlOSwgMSk7Lyogb3Bjb2RlIGZvciBsb25nIGptcCAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgICAgZml4X25ldyAoZnJhZywgKHB0ciArIDEpIC0gZnJhZy0+ZnJfbGl0ZXJhbCwgNCwKLQkgICAgICAgdG9fc3ltYm9sLCAob2Zmc2V0VCkgMCwgMCwgQkZEX1JFTE9DXzMyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDUpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4ZTksIDEpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIgKyAxLCAodmFsdWVUKSBvZmZzZXQsIDQpOwotICAgIH0KLX0KLQwKLS8qIEFwcGx5IGEgZml4dXAgKGZpeFMpIHRvIHNlZ21lbnQgZGF0YSwgb25jZSBpdCBoYXMgYmVlbiBkZXRlcm1pbmVkCi0gICBieSBvdXIgY2FsbGVyIHRoYXQgd2UgaGF2ZSBhbGwgdGhlIGluZm8gd2UgbmVlZCB0byBmaXggaXQgdXAuCi0KLSAgIE9uIHRoZSAzODYsIGltbWVkaWF0ZXMsIGRpc3BsYWNlbWVudHMsIGFuZCBkYXRhIHBvaW50ZXJzIGFyZSBhbGwgaW4KLSAgIHRoZSBzYW1lIChsaXR0bGUtZW5kaWFuKSBmb3JtYXQsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB3aGljaAotICAgd2UgYXJlIGhhbmRsaW5nLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhQLCB2YWxwLCBzZWcpCi0gICAgIGZpeFMgKmZpeFA7CQkvKiBUaGUgZml4IHdlJ3JlIHRvIHB1dCBpbi4gICovCi0gICAgIHZhbHVlVCAqdmFscDsJCS8qIFBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAgKi8KLSAgICAgc2VnVCBzZWc7CQkJLyogU2VnbWVudCBmaXggaXMgZnJvbS4gICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnAgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIHZhbHVlVCB2YWx1ZSA9ICp2YWxwOwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKFRFX01hY2gpCi0gIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLQl7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgLyoKLSAgICogVGhpcyBpcyBhIGhhY2suICBUaGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IHRvCi0gICAqIGhhbmRsZSB0aGlzLgotICAgKi8KLSAgaWYgKChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMCi0gICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNl9QQ1JFTAotICAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfOF9QQ1JFTCkKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHsKLSNpZm5kZWYgT0JKX0FPVVQKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSNpZmRlZiBURV9QRQotCSAgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cgotI2VuZGlmCi0JICApCi0JdmFsdWUgKz0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLSAgICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkgICYmIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgPT0gc2VnCi0JICAgICAgfHwgc3ltYm9sX3NlY3Rpb25fcCAoZml4UC0+ZnhfYWRkc3kpKQotCSAgJiYgISBTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKLQkgICYmICEgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAmJiAhIFNfSVNfQ09NTU9OIChmaXhQLT5meF9hZGRzeSkpCi0JewotCSAgLyogWWVzLCB3ZSBhZGQgdGhlIHZhbHVlcyBpbiB0d2ljZS4gIFRoaXMgaXMgYmVjYXVzZQotCSAgICAgYmZkX3BlcmZvcm1fcmVsb2NhdGlvbiBzdWJ0cmFjdHMgdGhlbSBvdXQgYWdhaW4uICBJIHRoaW5rCi0JICAgICBiZmRfcGVyZm9ybV9yZWxvY2F0aW9uIGlzIGJyb2tlbiwgYnV0IEkgZG9uJ3QgZGFyZSBjaGFuZ2UKLQkgICAgIGl0LiAgRklYTUUuICAqLwotCSAgdmFsdWUgKz0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotCX0KLSNlbmRpZgotI2lmIGRlZmluZWQgKE9CSl9DT0ZGKSAmJiBkZWZpbmVkIChURV9QRSkKLSAgICAgIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFBFIGZvcm1hdCBkb2VzIG5vdCBzdG9yZSBhIHNlY3Rpb24KLSAgICAgICAgIGFkZHJlc3Mgb2Zmc2V0IGZvciBhIFBDIHJlbGF0aXZlIHN5bWJvbC4gICovCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IHNlZykKLQl2YWx1ZSArPSBtZF9wY3JlbF9mcm9tIChmaXhQKTsKLSNlbmRpZgotICAgIH0KLQotICAvKiBGaXggYSBmZXcgdGhpbmdzIC0gdGhlIGR5bmFtaWMgbGlua2VyIGV4cGVjdHMgY2VydGFpbiB2YWx1ZXMgaGVyZSwKLSAgICAgYW5kIHdlIG11c3Qgbm90IGRpc3NhcHBvaW50IGl0LiAqLwotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKSB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X1BMVDMyOgotICAgICAgLyogTWFrZSB0aGUganVtcCBpbnN0cnVjdGlvbiBwb2ludCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb3BlcmFuZC4gIEF0Ci0JIHJ1bnRpbWUgd2UgbWVyZWx5IGFkZCB0aGUgb2Zmc2V0IHRvIHRoZSBhY3R1YWwgUExUIGVudHJ5LiAqLwotICAgICAgdmFsdWUgPSAweGZmZmZmZmZjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVFBDOgotLyoKLSAqICBUaGlzIGlzIHRvdWdoIHRvIGV4cGxhaW4uICBXZSBlbmQgdXAgd2l0aCB0aGlzIG9uZSBpZiB3ZSBoYXZlCi0gKiBvcGVyYW5kcyB0aGF0IGxvb2sgbGlrZSAiX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLS5MMjg0XSIuICBUaGUgZ29hbAotICogaGVyZSBpcyB0byBvYnRhaW4gdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgdGhlIEdPVCwgYW5kIGl0IGlzIHN0cm9uZ2x5Ci0gKiBwcmVmZXJhYmxlIGZyb20gYSBwZXJmb3JtYW5jZSBwb2ludCBvZiB2aWV3IHRvIGF2b2lkIHVzaW5nIGEgcnVudGltZQotICogcmVsb2NhdGlvbiBmb3IgdGhpcy4gIFRoZSBhY3R1YWwgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIG9mdGVuIGxvb2sgCi0gKiBzb21ldGhpbmcgbGlrZToKLSAqIAotICogCWNhbGwJLkw2NgotICogLkw2NjoKLSAqIAlwb3BsCSVlYngKLSAqIAlhZGRsCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkw2Nl0sJWVieAotICogCi0gKiAJVGhlIGNhbGwgYW5kIHBvcCBlc3NlbnRpYWxseSByZXR1cm4gdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YKLSAqIHRoZSBsYWJlbCAuTDY2IGFuZCBzdG9yZSBpdCBpbiAlZWJ4LiAgVGhlIGxpbmtlciBpdHNlbGYgd2lsbAotICogdWx0aW1hdGVseSBjaGFuZ2UgdGhlIGZpcnN0IG9wZXJhbmQgb2YgdGhlIGFkZGwgc28gdGhhdCAlZWJ4IHBvaW50cyB0bwotICogdGhlIEdPVCwgYnV0IHRvIGtlZXAgdGhpbmdzIHNpbXBsZSwgdGhlIC5vIGZpbGUgbXVzdCBoYXZlIHRoaXMgb3BlcmFuZAotICogc2V0IHNvIHRoYXQgaXQgZ2VuZXJhdGVzIG5vdCB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiAuTDY2LCBidXQgdGhlCi0gKiBhYnNvbHV0ZSBhZGRyZXNzIG9mIGl0c2VsZi4gIFRoaXMgYWxsb3dzIHRoZSBsaW5rZXIgaXRzZWxmIHNpbXBseQotICogdHJlYXQgYSBHT1RQQyByZWxvY2F0aW9uIGFzIGFza2luZyBmb3IgYSBwY3JlbCBvZmZzZXQgdG8gdGhlIEdPVCB0byBiZQotICogYWRkZWQgaW4sIGFuZCB0aGUgYWRkZW5kIG9mIHRoZSByZWxvY2F0aW9uIGlzIHN0b3JlZCBpbiB0aGUgb3BlcmFuZAotICogZmllbGQgZm9yIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYuCi0gKiAKLSAqIAlPdXIgam9iIGhlcmUgaXMgdG8gZml4IHRoZSBvcGVyYW5kIHNvIHRoYXQgaXQgd291bGQgYWRkIHRoZSBjb3JyZWN0Ci0gKiBvZmZzZXQgc28gdGhhdCAlZWJ4IHdvdWxkIHBvaW50IHRvIGl0c2VsZi4gIFRoZSB0aGluZyB0aGF0IGlzIHRyaWNreSBpcwotICogdGhhdCAuLS5MNjYgd2lsbCBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnN0cnVjdGlvbiwgc28gd2UgbmVlZAotICogdG8gZnVydGhlciBtb2RpZnkgdGhlIG9wZXJhbmQgc28gdGhhdCBpdCB3aWxsIHBvaW50IHRvIGl0c2VsZi4KLSAqIFRoZXJlIGFyZSBvdGhlciBjYXNlcyB3aGVyZSB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKLSAqIAotICogCS5sb25nCSRfR0xPQkFMX09GRlNFVF9UQUJMRV8rWy4tLkw2Nl0KLSAqIAotICogYW5kIGhlcmUgbm8gY29ycmVjdGlvbiB3b3VsZCBiZSByZXF1aXJlZC4gIEludGVybmFsbHkgaW4gdGhlIGFzc2VtYmxlcgotICogd2UgdHJlYXQgb3BlcmFuZHMgb2YgdGhpcyBmb3JtIGFzIG5vdCBiZWluZyBwY3JlbCBzaW5jZSB0aGUgJy4nIGlzIAotICogZXhwbGljaXRseSBtZW50aW9uZWQsIGFuZCBJIHdvbmRlciB3aGV0aGVyIGl0IHdvdWxkIHNpbXBsaWZ5IG1hdHRlcnMKLSAqIHRvIGRvIGl0IHRoaXMgd2F5LiAgV2hvIGtub3dzLiAgSW4gZWFybGllciB2ZXJzaW9ucyBvZiB0aGUgUElDIHBhdGNoZXMsCi0gKiB0aGUgcGNyZWxfYWRqdXN0IGZpZWxkIHdhcyB1c2VkIHRvIHN0b3JlIHRoZSBjb3JyZWN0aW9uLCBidXQgc2luY2UgdGhlCi0gKiBleHByZXNzaW9uIGlzIG5vdCBwY3JlbCwgSSBmZWx0IGl0IHdvdWxkIGJlIGNvbmZ1c2luZyB0byBkbyBpdCB0aGlzIHdheS4KLSAqLwotICAgICAgdmFsdWUgLT0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1QzMjoKLSAgICAgIHZhbHVlID0gMDsgLyogRnVsbHkgcmVzb2x2ZWQgYXQgcnVudGltZS4gIE5vIGFkZGVuZC4gKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9HT1RPRkY6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmIC8qIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpICovCi0gICp2YWxwID0gdmFsdWU7Ci0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKFRFX01hY2gpICovCi0gIG1kX251bWJlcl90b19jaGFycyAocCwgdmFsdWUsIGZpeFAtPmZ4X3NpemUpOwotCi0gIHJldHVybiAxOwotfQotCi0jaWYgMAotLyogVGhpcyBpcyBuZXZlciB1c2VkLiAgKi8KLWxvbmcJCQkJLyogS25vd3MgYWJvdXQgdGhlIGJ5dGUgb3JkZXIgaW4gYSB3b3JkLiAqLwotbWRfY2hhcnNfdG9fbnVtYmVyIChjb24sIG5ieXRlcykKLSAgICAgdW5zaWduZWQgY2hhciBjb25bXTsJLyogTG93IG9yZGVyIGJ5dGUgMXN0LiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbnB1dC4gKi8KLXsKLSAgbG9uZyByZXR2YWw7Ci0gIGZvciAocmV0dmFsID0gMCwgY29uICs9IG5ieXRlcyAtIDE7IG5ieXRlcy0tOyBjb24tLSkKLSAgICB7Ci0gICAgICByZXR2YWwgPDw9IEJJVFNfUEVSX0NIQVI7Ci0gICAgICByZXR2YWwgfD0gKmNvbjsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0jZW5kaWYgLyogMCAqLwotDAotCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgbGl0UCBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQKLSAgIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YgKCkiKTsKLSAgICB9Ci0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgLyogVGhpcyBsb29wcyBvdXRwdXRzIHRoZSBMSVRUTEVOVU1zIGluIFJFVkVSU0Ugb3JkZXI7IGluIGFjY29yZCB3aXRoCi0gICAgIHRoZSBiaWdlbmRpYW4gMzg2LiAgKi8KLSAgZm9yICh3b3JkUCA9IHdvcmRzICsgcHJlYyAtIDE7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSAoKndvcmRQLS0pLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1jaGFyIG91dHB1dF9pbnZhbGlkX2J1Zls4XTsKLQotc3RhdGljIGNoYXIgKiBvdXRwdXRfaW52YWxpZCBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNoYXIgKgotb3V0cHV0X2ludmFsaWQgKGMpCi0gICAgIGludCBjOwotewotICBpZiAoaXNwcmludCAoYykpCi0gICAgc3ByaW50ZiAob3V0cHV0X2ludmFsaWRfYnVmLCAiJyVjJyIsIGMpOwotICBlbHNlCi0gICAgc3ByaW50ZiAob3V0cHV0X2ludmFsaWRfYnVmLCAiKDB4JXgpIiwgKHVuc2lnbmVkKSBjKTsKLSAgcmV0dXJuIG91dHB1dF9pbnZhbGlkX2J1ZjsKLX0KLQotLyogUkVHX1NUUklORyBzdGFydHMgKmJlZm9yZSogUkVHSVNURVJfUFJFRklYLiAgKi8KLQotc3RhdGljIGNvbnN0IHJlZ19lbnRyeSAqIHBhcnNlX3JlZ2lzdGVyIFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKikpOwotCi1zdGF0aWMgY29uc3QgcmVnX2VudHJ5ICoKLXBhcnNlX3JlZ2lzdGVyIChyZWdfc3RyaW5nLCBlbmRfb3ApCi0gICAgIGNoYXIgKnJlZ19zdHJpbmc7Ci0gICAgIGNoYXIgKiplbmRfb3A7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnMgPSByZWdfc3RyaW5nOwotICByZWdpc3RlciBjaGFyICpwOwotICBjaGFyIHJlZ19uYW1lX2dpdmVuW01BWF9SRUdfTkFNRV9TSVpFICsgMV07Ci0gIGNvbnN0IHJlZ19lbnRyeSAqcjsKLQotICAvKiBTa2lwIHBvc3NpYmxlIFJFR0lTVEVSX1BSRUZJWCBhbmQgcG9zc2libGUgd2hpdGVzcGFjZS4gICovCi0gIGlmICgqcyA9PSBSRUdJU1RFUl9QUkVGSVgpCi0gICAgKytzOwotCi0gIGlmIChpc19zcGFjZV9jaGFyICgqcykpCi0gICAgKytzOwotCi0gIHAgPSByZWdfbmFtZV9naXZlbjsKLSAgd2hpbGUgKCgqcCsrID0gcmVnaXN0ZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpICpzKytdKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmIChwID49IHJlZ19uYW1lX2dpdmVuICsgTUFYX1JFR19OQU1FX1NJWkUpCi0JewotICAgICAgICAgIGlmICghYWxsb3dfbmFrZWRfcmVnKQotICAgICAgICAgICAgewotCSAgICAgICpwID0gJ1wwJzsKLQkgICAgICBhc19iYWQgKF8oImJhZCByZWdpc3RlciBuYW1lIGAlcyciKSwgcmVnX25hbWVfZ2l2ZW4pOwotICAgICAgICAgICAgfQotCSAgcmV0dXJuIChjb25zdCByZWdfZW50cnkgKikgTlVMTDsKLQl9Ci0gICAgfQotCi0gICplbmRfb3AgPSBzIC0gMTsKLQotICByID0gKGNvbnN0IHJlZ19lbnRyeSAqKSBoYXNoX2ZpbmQgKHJlZ19oYXNoLCByZWdfbmFtZV9naXZlbik7Ci0KLSAgaWYgKHIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoIWFsbG93X25ha2VkX3JlZykKLSAgICAgICAgYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIiksIHJlZ19uYW1lX2dpdmVuKTsKLSAgICAgIHJldHVybiAoY29uc3QgcmVnX2VudHJ5ICopIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiByOwotfQotDAotI2lmZGVmIE9CSl9FTEYKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJrbVZROiI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIm0iOwotI2VuZGlmCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ20nOgotICAgICAgZmxhZ19kb19sb25nX2p1bXAgPSAxOwotICAgICAgYnJlYWs7Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfTUFZQkVfRUxGKQotICAgICAgLyogLWs6IElnbm9yZSBmb3IgRnJlZUJTRCBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICBjYXNlICdrJzoKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtVjogU1ZSNCBhcmd1bWVudCB0byBwcmludCB2ZXJzaW9uIElELiAgKi8KLSAgICBjYXNlICdWJzoKLSAgICAgIHByaW50X3ZlcnNpb25faWQgKCk7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogLVF5LCAtUW46IFNWUjQgYXJndW1lbnRzIGNvbnRyb2xsaW5nIHdoZXRoZXIgYSAuY29tbWVudCBzZWN0aW9uCi0JIHNob3VsZCBiZSBlbWl0dGVkIG9yIG5vdC4gIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICAgIGNhc2UgJ1EnOgotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tbQkJCWRvIGxvbmcganVtcFxuIikpOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIE9CSl9NQVlCRV9FTEYKLSNpZmRlZiBPQkpfTUFZQkVfQ09GRgotCi0vKiBQaWNrIHRoZSB0YXJnZXQgZm9ybWF0IHRvIHVzZS4gICovCi0KLWNvbnN0IGNoYXIgICoKLWkzODZfdGFyZ2V0X2Zvcm1hdCAoKQotewotICBzd2l0Y2ggKE9VVFBVVF9GTEFWT1IpCi0gICAgewotICAgIGNhc2UgYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gImNvZmYtaTM4NiI7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyOgotICAgICAgcmV0dXJuICJlbGYzMi1pMzg2IjsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBPQkpfTUFZQkVfQ09GRiAqLwotI2VuZGlmIC8qIE9CSl9NQVlCRV9FTEYgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0MCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotCWlmICgqbmFtZSA9PSAnXycgJiYgKihuYW1lKzEpID09ICdHJwotCSAgICAmJiBzdHJjbXAobmFtZSwgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FKSA9PSAwKQotCSAgewotCSAgICBpZiAoIUdPVF9zeW1ib2wpCi0JICAgICAgewotCQlpZiAoc3ltYm9sX2ZpbmQgKG5hbWUpKQotCQkgIGFzX2JhZCAoXygiR09UIGFscmVhZHkgaW4gc3ltYm9sIHRhYmxlIikpOwotCQlHT1Rfc3ltYm9sID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJCSAodmFsdWVUKSAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCSAgICAgIH07Ci0JICAgIHJldHVybiBHT1Rfc3ltYm9sOwotCSAgfQotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogRm9yIGEub3V0LCBmb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuICBJZiB3ZSBkb24ndCBkbwotICAgICB0aGlzLCBCRkQgd2lsbCBhbGlnbiBpdCBmb3IgdXMsIGJ1dCBpdCB3aWxsIG5vdCB3cml0ZSBvdXQgdGhlCi0gICAgIGZpbmFsIGJ5dGVzIG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBtYXkgYmUgYSBidWcgaW4gQkZELCBidXQgaXQgaXMKLSAgICAgZWFzaWVyIHRvIGZpeCBpdCBoZXJlIHNpbmNlIHRoYXQgaXMgaG93IHRoZSBvdGhlciBhLm91dCB0YXJnZXRzCi0gICAgIHdvcmsuICAqLwotICBpbnQgYWxpZ247Ci0KLSAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICBzaXplID0gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoKHZhbHVlVCkgLTEgPDwgYWxpZ24pKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIE9uIHRoZSBpMzg2LCBQQy1yZWxhdGl2ZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCi0gICBuZXh0IGluc3RydWN0aW9uLiAgVGhhdCBpcywgdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cyBpdHMKLSAgIHNpemUsIHNpbmNlIHRoZSBvZmZzZXQgaXMgYWx3YXlzIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGluc24uICAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfc2l6ZSArIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzczsKLX0KLQotI2lmbmRlZiBJMzg2Q09GRgotCi1zdGF0aWMgdm9pZAotc19ic3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0jZW5kaWYKLQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi12b2lkCi1pMzg2X3ZhbGlkYXRlX2ZpeCAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3N1YnN5ICYmIGZpeHAtPmZ4X3N1YnN5ID09IEdPVF9zeW1ib2wpCi0gICAgewotICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzM4Nl9HT1RPRkY7Ci0gICAgICBmaXhwLT5meF9zdWJzeSA9IDA7Ci0gICAgfQotfQotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzM4Nl9QTFQzMjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UMzI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzg2X0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zODZfR09UUEM6Ci0gICAgY2FzZSBCRkRfUkVMT0NfUlZBOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIHN3aXRjaCAoZml4cC0+Znhfc2l6ZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iKSwKLQkJICAgICAgZml4cC0+Znhfc2l6ZSk7Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAxOiBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7ICBicmVhazsKLQkgICAgY2FzZSAyOiBjb2RlID0gQkZEX1JFTE9DXzE2X1BDUkVMOyBicmVhazsKLQkgICAgY2FzZSA0OiBjb2RlID0gQkZEX1JFTE9DXzMyX1BDUkVMOyBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGZpeHAtPmZ4X3NpemUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIiksIGZpeHAtPmZ4X3NpemUpOwotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfMzI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgMTogY29kZSA9IEJGRF9SRUxPQ184OyAgYnJlYWs7Ci0JICAgIGNhc2UgMjogY29kZSA9IEJGRF9SRUxPQ18xNjsgYnJlYWs7Ci0JICAgIGNhc2UgNDogY29kZSA9IEJGRF9SRUxPQ18zMjsgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGNvZGUgPT0gQkZEX1JFTE9DXzMyCi0gICAgICAmJiBHT1Rfc3ltYm9sCi0gICAgICAmJiBmaXhwLT5meF9hZGRzeSA9PSBHT1Rfc3ltYm9sKQotICAgIGNvZGUgPSBCRkRfUkVMT0NfMzg2X0dPVFBDOwotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLQotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIC8qIEhBQ0s6IFNpbmNlIGkzODYgRUxGIHVzZXMgUmVsIGluc3RlYWQgb2YgUmVsYSwgZW5jb2RlIHRoZQotICAgICB2dGFibGUgZW50cnkgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X29mZnNldDsKLQotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWwtPmFkZGVuZCA9IDA7Ci0KLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgaWYgKHJlbC0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIC8qIFNldCBob3d0byB0byBhIGdhcmJhZ2UgdmFsdWUgc28gdGhhdCB3ZSBjYW4ga2VlcCBnb2luZy4gICovCi0gICAgICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIEJGRF9SRUxPQ18zMik7Ci0gICAgICBhc3NlcnQgKHJlbC0+aG93dG8gIT0gTlVMTCk7Ci0gICAgfQotCi0gIHJldHVybiByZWw7Ci19Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jaWYgKGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkpCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIC8qCi0gICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KLSAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotCQkgICAgICAodmFsdWVUKSAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkJCSsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSksCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs2XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNF0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDMpICYgMHgwOCkKLQkgICAgICB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDEpICYgMHgwNikKLQkgICAgICB8ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDApICYgMHgwMSkgJiAweDBmKSk7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0jaWYgZGVmaW5lZCAoSTM4NkNPRkYpCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBSX0lNQUdFQkFTRSkKLSAgICByZXR1cm4gUl9JTUFHRUJBU0U7Ci0KLSAgcmV0dXJuIChmaXhQLT5meF9wY3JlbCA/Ci0JICAoZml4UC0+Znhfc2l6ZSA9PSAxID8gUl9QQ1JCWVRFIDoKLQkgICBmaXhQLT5meF9zaXplID09IDIgPyBSX1BDUldPUkQgOgotCSAgIFJfUENSTE9ORykgOgotCSAgKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUkVMQllURSA6Ci0JICAgZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9SRUxXT1JEIDoKLQkgICBSX0RJUjMyKSk7Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGlmIChmcmFnLT5mcl9uZXh0KQotICAgIHJldHVybiAoZnJhZy0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2FkZHJlc3MpOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBJMzg2Q09GRiAqLwotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0MCi0vKiBlbmQgb2YgdGMtaTM4Ni5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWkzODYuaCBiL2dhcy9jb25maWcvdGMtaTM4Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjc3OGMxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qIHRjLWkzODYuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtaTM4Ni5jCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgVENfSTM4NgotI2RlZmluZSBUQ19JMzg2IDEKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTAKLQotI2lmZGVmIFRFX0xZTlgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtaTM4Ni1seW54IgotI2VuZGlmCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHJlbG9jYXRpb24gdHlwZXMgaW4gdGMtaTM4Ni5jLiAgVGhlIGZpcnN0Ci0gICBwYXJhbWV0ZXIgaXMgdGhlIGN1cnJlbnQgcmVsb2NhdGlvbiB0eXBlLCB0aGUgc2Vjb25kIG9uZSBpcyB0aGUgZGVzaXJlZAotICAgdHlwZS4gIFRoZSBpZGVhIGlzIHRoYXQgaWYgdGhlIG9yaWdpbmFsIHR5cGUgaXMgYWxyZWFkeSBzb21lIGtpbmQgb2YgUElDCi0gICByZWxvY2F0aW9uLCB3ZSBsZWF2ZSBpdCBhbG9uZSwgb3RoZXJ3aXNlIHdlIGdpdmUgaXQgdGhlIGRlc2lyZWQgdHlwZSAqLwotCi0jZGVmaW5lIFRDX1JFTE9DKFgsWSkgKCgoWCkgIT0gQkZEX1JFTE9DXzM4Nl9QTFQzMiAmJiBcCi0JICAgKFgpICE9IEJGRF9SRUxPQ18zODZfR09UT0ZGICYmIFwKLQkgICAoWCkgIT0gQkZEX1JFTE9DXzM4Nl9HT1QzMiAmJiBcCi0JICAgKFgpICE9IEJGRF9SRUxPQ18zODZfR09UUEMpID8gWSA6IFgpCi0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoWCkgIHRjX2kzODZfZml4X2FkanVzdGFibGUoWCkKLWV4dGVybiBpbnQgdGNfaTM4Nl9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogVGhpcyBpcyB0aGUgcmVsb2NhdGlvbiB0eXBlIGZvciBkaXJlY3QgcmVmZXJlbmNlcyB0byBHTE9CQUxfT0ZGU0VUX1RBQkxFLgotICogSXQgY29tZXMgdXAgaW4gY29tcGxpY2F0ZWQgZXhwcmVzc2lvbnMgc3VjaCBhcyAKLSAqIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXytbLi0uTDI4NF0sIHdoaWNoIGNhbm5vdCBiZSBleHByZXNzZWQgbm9ybWFsbHkgd2l0aAotICogdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUaGUgZml4dXAgc3BlY2lmaWVkIGhlcmUgd2hlbiB1c2VkIGF0IHJ1bnRpbWUgCi0gKiBpbXBsaWVzIHRoYXQgd2Ugc2hvdWxkIGFkZCB0aGUgYWRkcmVzcyBvZiB0aGUgR09UIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24sCi0gKiBhbmQgYXMgYSByZXN1bHQgd2UgaGF2ZSBzaW1wbGlmaWVkIHRoZSBleHByZXNzaW9uIGludG8gc29tZXRoaW5nIHdlIGNhbiB1c2UuCi0gKi8KLSNkZWZpbmUgVENfUkVMT0NfR0xPQkFMX09GRlNFVF9UQUJMRSBCRkRfUkVMT0NfMzg2X0dPVFBDCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuCi0gICBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgcGNyZWwgcmVsb2NhdGlvbnMsIHNvIEdPVE9GRiBkb2VzIG5vdCBuZWVkIHRvIGJlCi0gICBjaGVja2VkIGhlcmUuICBJIGFtIG5vdCBzdXJlIGlmIHNvbWUgb2YgdGhlIG90aGVycyBhcmUgZXZlciB1c2VkIHdpdGgKLSAgIHBjcmVsLCBidXQgaXQgaXMgZWFzaWVyIHRvIGJlIHNhZmUgdGhhbiBzb3JyeS4gKi8KLQotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKQkJCQlcCi0gICgoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfUExUMzIJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfR09UMzIJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zODZfR09UUEMJCQlcCi0gICAmJiAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwJCQkJCVwKLSAgICAgICB8fCAoISBTX0lTX0VYVEVSTkFMICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJXAotCSAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkgICAmJiAhIFNfSVNfQ09NTU9OICgoRklYKS0+ZnhfYWRkc3kpKSkpCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX2kzODYKLQotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgVEVfTmV0QlNECi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJhLm91dC1pMzg2LW5ldGJzZCIKLSNlbmRpZgotI2lmZGVmIFRFXzM4NkJTRAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1ic2QiCi0jZW5kaWYKLSNpZmRlZiBURV9MSU5VWAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4Ni1saW51eCIKLSNlbmRpZgotI2lmZGVmIFRFX01hY2gKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LW1hY2gzIgotI2VuZGlmCi0jaWZkZWYgVEVfRFlOSVgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LWkzODYtZHluaXgiCi0jZW5kaWYKLSNpZm5kZWYgVEFSR0VUX0ZPUk1BVAotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtaTM4NiIKLSNlbmRpZgotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJlbGYzMi1pMzg2IgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfTUFZQkVfRUxGCi0jaWZkZWYgT0JKX01BWUJFX0NPRkYKLWV4dGVybiBjb25zdCBjaGFyICppMzg2X3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBUQVJHRVRfRk9STUFUIGkzODZfdGFyZ2V0X2Zvcm1hdCAoKQotI2VuZGlmCi0jZW5kaWYKLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIENPRkYgU1RVRkYgKi8KLQotI2RlZmluZSBDT0ZGX01BR0lDIEkzODZNQUdJQwotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF9pMzg2Ci0jZGVmaW5lIENPRkZfRkxBR1MgRl9BUjMyV1IKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3kgfHwgKHgpLT5meF9yX3R5cGU9PTcpCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIHRjX2NvZmZfZml4MnJ0eXBlKGZpeFApCi1leHRlcm4gc2hvcnQgdGNfY29mZl9maXgycnR5cGUgUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcChmcmFnKQotZXh0ZXJuIGludCB0Y19jb2ZmX3NpemVtYWNoZGVwIFBBUkFNUyAoKGZyYWdTICpmcmFnKSk7Ci0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykgMgotI2RlZmluZSBUQ19SVkFfUkVMT0MgNwotLyogTmVlZCB0aGlzIGZvciBQSUMgcmVsb2NhdGlvbnMgKi8KLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUKLQotCi0jaWZkZWYgVEVfMzg2QlNECi0vKiBUaGUgQlNESSBsaW5rZXIgYXBwYXJlbnRseSByZWplY3RzIG9iamVjdHMgd2l0aCBhIG1hY2hpbmUgdHlwZSBvZgotICAgTV8zODYgKDEwMCkuICAqLwotI2RlZmluZSBBT1VUX01BQ0hUWVBFIDAKLSNlbHNlCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgMTAwCi0jZW5kaWYKLQotI3VuZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKLQotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgdGNfaTM4Nl9mb3JjZV9yZWxvY2F0aW9uKGZpeHApCi1leHRlcm4gaW50IHRjX2kzODZfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKLSNlbHNlCi0jZGVmaW5lIE5PX1JFTE9DIDAKLSNlbmRpZgotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkJOwkvKiBub3QgdXNlZCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZm5kZWYgT0JKX0FPVVQKLSNpZm5kZWYgVEVfUEUKLSNpZm5kZWYgVEVfR08zMgotLyogTG9jYWwgbGFiZWxzIHN0YXJ0cyB3aXRoIC5MICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lWzBdID09ICcuJyBcCi0JCSAmJiAobmFtZVsxXSA9PSAnTCcgfHwgbmFtZVsxXSA9PSAnWCcgfHwgbmFtZVsxXSA9PSAnLicpKQotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0KLWV4dGVybiBjb25zdCBjaGFyIGV4dHJhX3N5bWJvbF9jaGFyc1tdOwotI2RlZmluZSB0Y19zeW1ib2xfY2hhcnMgZXh0cmFfc3ltYm9sX2NoYXJzCi0KLSNkZWZpbmUgTUFYX09QRVJBTkRTIDMJCS8qIG1heCBvcGVyYW5kcyBwZXIgaW5zbiAqLwotI2RlZmluZSBNQVhfSU1NRURJQVRFX09QRVJBTkRTIDIvKiBtYXggaW1tZWRpYXRlcyBwZXIgaW5zbiAobGNhbGwsIGxqbXApICovCi0jZGVmaW5lIE1BWF9NRU1PUllfT1BFUkFORFMgMgkvKiBtYXggbWVtb3J5IHJlZnMgcGVyIGluc24gKHN0cmluZyBvcHMpICovCi0KLS8qIFByZWZpeGVzIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUgb3JkZXIgZGVmaW5lZCBiZWxvdy4KLSAgIFdBSVRfUFJFRklYIG11c3QgYmUgdGhlIGZpcnN0IHByZWZpeCBzaW5jZSBGV0FJVCBpcyByZWFsbHkgaXMgYW4KLSAgIGluc3RydWN0aW9uLCBhbmQgc28gbXVzdCBjb21lIGJlZm9yZSBhbnkgcHJlZml4ZXMuICovCi0jZGVmaW5lIFdBSVRfUFJFRklYCTAKLSNkZWZpbmUgTE9DS1JFUF9QUkVGSVgJMQotI2RlZmluZSBBRERSX1BSRUZJWAkyCi0jZGVmaW5lIERBVEFfUFJFRklYCTMKLSNkZWZpbmUgU0VHX1BSRUZJWAk0Ci0jZGVmaW5lIE1BWF9QUkVGSVhFUwk1CS8qIG1heCBwcmVmaXhlcyBwZXIgb3Bjb2RlICovCi0KLS8qIHdlIGRlZmluZSB0aGUgc3ludGF4IGhlcmUgKG1vZHVsbyBiYXNlLGluZGV4LHNjYWxlIHN5bnRheCkgKi8KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYICclJwotI2RlZmluZSBJTU1FRElBVEVfUFJFRklYICckJwotI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJyonCi0KLSNkZWZpbmUgVFdPX0JZVEVfT1BDT0RFX0VTQ0FQRSAweDBmCi0jZGVmaW5lIE5PUF9PUENPREUgKGNoYXIpIDB4OTAKLQotLyogcmVnaXN0ZXIgbnVtYmVycyAqLwotI2RlZmluZSBFQlBfUkVHX05VTSA1Ci0jZGVmaW5lIEVTUF9SRUdfTlVNIDQKLQotLyogbW9kcm1fYnl0ZS5yZWdtZW0gZm9yIHR3b2J5dGUgZXNjYXBlICovCi0jZGVmaW5lIEVTQ0FQRV9UT19UV09fQllURV9BRERSRVNTSU5HIEVTUF9SRUdfTlVNCi0vKiBpbmRleF9iYXNlX2J5dGUuaW5kZXggZm9yIG5vIGluZGV4IHJlZ2lzdGVyIGFkZHJlc3NpbmcgKi8KLSNkZWZpbmUgTk9fSU5ERVhfUkVHSVNURVIgRVNQX1JFR19OVU0KLS8qIGluZGV4X2Jhc2VfYnl0ZS5iYXNlIGZvciBubyBiYXNlIHJlZ2lzdGVyIGFkZHJlc3NpbmcgKi8KLSNkZWZpbmUgTk9fQkFTRV9SRUdJU1RFUiBFQlBfUkVHX05VTQotI2RlZmluZSBOT19CQVNFX1JFR0lTVEVSXzE2IDYKLQotLyogdGhlc2UgYXJlIHRoZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcy4gICovCi0jZGVmaW5lIERXT1JEX01ORU1fU1VGRklYICdsJwotI2RlZmluZSBXT1JEX01ORU1fU1VGRklYICAndycKLSNkZWZpbmUgQllURV9NTkVNX1NVRkZJWCAgJ2InCi0jZGVmaW5lIFNIT1JUX01ORU1fU1VGRklYICdzJwotI2RlZmluZSBMT05HX01ORU1fU1VGRklYICAnbCcKLS8qIEludGVsIFN5bnRheCAqLwotI2RlZmluZSBMT05HX0RPVUJMRV9NTkVNX1NVRkZJWCAneCcKLS8qIEludGVsIFN5bnRheCAqLwotI2RlZmluZSBJTlRFTF9EV09SRF9NTkVNX1NVRkZJWCAnZCcKLQotLyogbW9kcm0ubW9kZSA9IFJFR01FTV9GSUVMRF9IQVNfUkVHIHdoZW4gYSByZWdpc3RlciBpcyBpbiB0aGVyZSAqLwotI2RlZmluZSBSRUdNRU1fRklFTERfSEFTX1JFRyAweDMvKiBhbHdheXMgPSAweDMgKi8KLSNkZWZpbmUgUkVHTUVNX0ZJRUxEX0hBU19NRU0gKH5SRUdNRU1fRklFTERfSEFTX1JFRykKLQotI2RlZmluZSBFTkRfT0ZfSU5TTiAnXDAnCi0KLS8qIEludGVsIFN5bnRheCAqLwotLyogVmFsdWVzIDAtNCBtYXAgb250byBzY2FsZSBmYWN0b3IgKi8KLSNkZWZpbmUgQllURV9QVFIgICAgIDAKLSNkZWZpbmUgV09SRF9QVFIgICAgIDEKLSNkZWZpbmUgRFdPUkRfUFRSICAgIDIKLSNkZWZpbmUgUVdPUkRfUFRSICAgIDMKLSNkZWZpbmUgWFdPUkRfUFRSICAgIDQKLSNkZWZpbmUgU0hPUlQgICAgICAgIDUKLSNkZWZpbmUgT0ZGU0VUX0ZMQVQgIDYKLSNkZWZpbmUgRkxBVCAgICAgICAgIDcKLSNkZWZpbmUgTk9ORV9GT1VORCAgIDgKLS8qCi0gIFdoZW4gYW4gb3BlcmFuZCBpcyByZWFkIGluIGl0IGlzIGNsYXNzaWZpZWQgYnkgaXRzIHR5cGUuICBUaGlzIHR5cGUgaW5jbHVkZXMKLSAgYWxsIHRoZSBwb3NzaWJsZSB3YXlzIGFuIG9wZXJhbmQgY2FuIGJlIHVzZWQuICBUaHVzLCAnJWVheCcgaXMgYm90aCAncmVnaXN0ZXIKLSAgIyAwJyBhbmQgJ1RoZSBBY2N1bXVsYXRvcicuICBJbiBvdXIgbGFuZ3VhZ2UgdGhpcyBpcyBleHByZXNzZWQgYnkgT1InaW5nCi0gICdSZWczMicgKGFueSAzMiBiaXQgcmVnaXN0ZXIpIGFuZCAnQWNjJyAodGhlIGFjY3VtdWxhdG9yKS4KLSAgT3BlcmFuZHMgYXJlIGNsYXNzaWZpZWQgc28gdGhhdCB3ZSBjYW4gbWF0Y2ggZ2l2ZW4gb3BlcmFuZCB0eXBlcyB3aXRoCi0gIHRoZSBvcGNvZGUgdGFibGUgaW4gb3Bjb2RlL2kzODYuaC4KLSAgKi8KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIFJlZzgJCSAgIDB4MQkvKiA4IGJpdCByZWcgKi8KLSNkZWZpbmUgUmVnMTYJCSAgIDB4MgkvKiAxNiBiaXQgcmVnICovCi0jZGVmaW5lIFJlZzMyCQkgICAweDQJLyogMzIgYml0IHJlZyAqLwotLyogaW1tZWRpYXRlICovCi0jZGVmaW5lIEltbTgJCSAgIDB4OAkvKiA4IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tOFMJCSAgMHgxMAkvKiA4IGJpdCBpbW1lZGlhdGUgc2lnbiBleHRlbmRlZCAqLwotI2RlZmluZSBJbW0xNgkJICAweDIwCS8qIDE2IGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgSW1tMzIJCSAgMHg0MAkvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIEltbTEJCSAgMHg4MAkvKiAxIGJpdCBpbW1lZGlhdGUgKi8KLS8qIG1lbW9yeSAqLwotI2RlZmluZSBCYXNlSW5kZXgJIDB4MTAwCi0vKiBEaXNwOCwxNiwzMiBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIG9uIHRoZQotICAgaW5zdHJ1Y3Rpb24uICBGb3IganVtcHMsIHRoZXkgc3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgUEMgcmVsYXRpdmUKLSAgIGRpc3BsYWNlbWVudCwgZm9yIGJhc2VpbmRleCB0eXBlIGluc3RydWN0aW9ucywgdGhleSBzcGVjaWZ5IHRoZQotICAgc2l6ZSBvZiB0aGUgb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBiYXNlIHJlZ2lzdGVyLCBhbmQgZm9yIG1lbW9yeQotICAgb2Zmc2V0IGluc3RydWN0aW9ucyBzdWNoIGFzIGBtb3YgMTIzNCwlYWwnIHRoZXkgc3BlY2lmeSB0aGUgc2l6ZSBvZgotICAgdGhlIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc2VnbWVudCBiYXNlLiAgKi8KLSNkZWZpbmUgRGlzcDgJCSAweDIwMAkvKiA4IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgRGlzcDE2CQkgMHg0MDAJLyogMTYgYml0IGRpc3BsYWNlbWVudCAqLwotI2RlZmluZSBEaXNwMzIJCSAweDgwMAkvKiAzMiBiaXQgZGlzcGxhY2VtZW50ICovCi0vKiBzcGVjaWFscyAqLwotI2RlZmluZSBJbk91dFBvcnRSZWcJMHgxMDAwCS8qIHJlZ2lzdGVyIHRvIGhvbGQgaW4vb3V0IHBvcnQgYWRkciA9IGR4ICovCi0jZGVmaW5lIFNoaWZ0Q291bnQJMHgyMDAwCS8qIHJlZ2lzdGVyIHRvIGhvbGQgc2hpZnQgY291bmQgPSBjbCAqLwotI2RlZmluZSBDb250cm9sCSAgICAgICAgMHg0MDAwCS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRGVidWcJICAgICAgICAweDgwMDAJLyogRGVidWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVGVzdAkgICAgICAgMHgxMDAwMAkvKiBUZXN0IHJlZ2lzdGVyICovCi0jZGVmaW5lIEZsb2F0UmVnICAgICAgIDB4MjAwMDAJLyogRmxvYXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRmxvYXRBY2MgICAgICAgMHg0MDAwMAkvKiBGbG9hdCBzdGFjayB0b3AgJXN0KDApICovCi0jZGVmaW5lIFNSZWcyCSAgICAgICAweDgwMDAwCS8qIDIgYml0IHNlZ21lbnQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1JlZzMJICAgICAgMHgxMDAwMDAJLyogMyBiaXQgc2VnbWVudCByZWdpc3RlciAqLwotI2RlZmluZSBBY2MJICAgICAgMHgyMDAwMDAJLyogQWNjdW11bGF0b3IgJWFsIG9yICVheCBvciAlZWF4ICovCi0jZGVmaW5lIEp1bXBBYnNvbHV0ZSAgMHg0MDAwMDAKLSNkZWZpbmUgUmVnTU1YCSAgICAgIDB4ODAwMDAwCS8qIE1NWCByZWdpc3RlciAqLwotI2RlZmluZSBSZWdYTU0JICAgICAweDEwMDAwMDAJLyogWE1NIHJlZ2lzdGVycyBpbiBQSUlJICovCi0jZGVmaW5lIEVzU2VnCSAgICAgMHgyMDAwMDAwCS8qIFN0cmluZyBpbnNuIG9wZXJhbmQgd2l0aCBmaXhlZCBlcyBzZWdtZW50ICovCi0vKiBJbnZNZW0gaXMgZm9yIGluc3RydWN0aW9ucyB3aXRoIGEgbW9kcm0gYnl0ZSB0aGF0IG9ubHkgYWxsb3cgYQotICAgZ2VuZXJhbCByZWdpc3RlciBlbmNvZGluZyBpbiB0aGUgaS50bS5tb2RlIGFuZCBpLnRtLnJlZ21lbSBmaWVsZHMsCi0gICBlZy4gY29udHJvbCByZWcgbW92ZXMuICBUaGV5IHJlYWxseSBvdWdodCB0byBzdXBwb3J0IGEgbWVtb3J5IGZvcm0sCi0gICBidXQgZG9uJ3QsIHNvIHdlIGFkZCBhbiBJbnZNZW0gZmxhZyB0byB0aGUgcmVnaXN0ZXIgb3BlcmFuZCB0bwotICAgaW5kaWNhdGUgdGhhdCBpdCBzaG91bGQgYmUgZW5jb2RlZCBpbiB0aGUgaS50bS5yZWdtZW0gZmllbGQuICAqLwotI2RlZmluZSBJbnZNZW0JICAgICAweDQwMDAwMDAKLQotI2RlZmluZSBSZWcJKFJlZzh8UmVnMTZ8UmVnMzIpCS8qIGdlbidsIHJlZ2lzdGVyICovCi0jZGVmaW5lIFdvcmRSZWcgKFJlZzE2fFJlZzMyKQotI2RlZmluZSBJbXBsaWNpdFJlZ2lzdGVyIChJbk91dFBvcnRSZWd8U2hpZnRDb3VudHxBY2N8RmxvYXRBY2MpCi0jZGVmaW5lIEltbQkoSW1tOHxJbW04U3xJbW0xNnxJbW0zMikgLyogZ2VuJ2wgaW1tZWRpYXRlICovCi0jZGVmaW5lIERpc3AJKERpc3A4fERpc3AxNnxEaXNwMzIpCS8qIEdlbmVyYWwgZGlzcGxhY2VtZW50ICovCi0jZGVmaW5lIEFueU1lbQkoRGlzcHxCYXNlSW5kZXh8SW52TWVtKQkvKiBHZW5lcmFsIG1lbW9yeSAqLwotLyogVGhlIGZvbGxvd2luZyBhbGlhc2VzIGFyZSBkZWZpbmVkIGJlY2F1c2UgdGhlIG9wY29kZSB0YWJsZQotICAgY2FyZWZ1bGx5IHNwZWNpZmllcyB0aGUgYWxsb3dlZCBtZW1vcnkgdHlwZXMgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24uCi0gICBBdCB0aGUgbW9tZW50IHdlIGNhbiBvbmx5IHRlbGwgYSBtZW1vcnkgcmVmZXJlbmNlIHNpemUgYnkgdGhlCi0gICBpbnN0cnVjdGlvbiBzdWZmaXgsIHNvIHRoZXJlJ3Mgbm90IG11Y2ggcG9pbnQgaW4gZGVmaW5pbmcgTWVtOCwKLSAgIE1lbTE2LCBNZW0zMiBhbmQgTWVtNjQgb3Bjb2RlIG1vZGlmaWVycyAtIFdlIG1pZ2h0IGFzIHdlbGwganVzdCB1c2UKLSAgIHRoZSBzdWZmaXggZGlyZWN0bHkgdG8gY2hlY2sgbWVtb3J5IG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgTExvbmdNZW0gQW55TWVtCQkvKiA2NCBiaXRzIChvciBtb3JlKSAqLwotI2RlZmluZSBMb25nTWVtIEFueU1lbQkJLyogMzIgYml0IG1lbW9yeSByZWYgKi8KLSNkZWZpbmUgU2hvcnRNZW0gQW55TWVtCQkvKiAxNiBiaXQgbWVtb3J5IHJlZiAqLwotI2RlZmluZSBXb3JkTWVtIEFueU1lbQkJLyogMTYgb3IgMzIgYml0IG1lbW9yeSByZWYgKi8KLSNkZWZpbmUgQnl0ZU1lbSBBbnlNZW0JCS8qIDggYml0IG1lbW9yeSByZWYgKi8KLQotI2RlZmluZSBTTUFMTEVTVF9ESVNQX1RZUEUobnVtKSBcCi0gICAgKGZpdHNfaW5fc2lnbmVkX2J5dGUobnVtKSA/IChEaXNwOHxEaXNwMzIpIDogRGlzcDMyKQotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBpbnN0cnVjdGlvbiBuYW1lIHNhbnMgd2lkdGggc3VmZml4ICgibW92IiBmb3IgbW92bCBpbnNucykgKi8KLSAgY2hhciAqbmFtZTsKLQotICAvKiBob3cgbWFueSBvcGVyYW5kcyAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlIHdpdGhvdXQgb3B0aW9uYWwKLSAgICAgcHJlZml4KGVzKS4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKLQotICAvKiBleHRlbnNpb25fb3Bjb2RlIGlzIHRoZSAzIGJpdCBleHRlbnNpb24gZm9yIGdyb3VwIDxuPiBpbnNucy4KLSAgICAgVGhpcyBmaWVsZCBpcyBhbHNvIHVzZWQgdG8gc3RvcmUgdGhlIDgtYml0IG9wY29kZSBzdWZmaXggZm9yIHRoZQotICAgICBBTUQgM0ROb3chIGluc3RydWN0aW9ucy4KLSAgICAgSWYgdGhpcyB0ZW1wbGF0ZSBoYXMgbm8gZXh0ZW5zaW9uIG9wY29kZSAodGhlIHVzdWFsIGNhc2UpIHVzZSBOb25lICovCi0gIHVuc2lnbmVkIGludCBleHRlbnNpb25fb3Bjb2RlOwotI2RlZmluZSBOb25lIDB4ZmZmZgkJLyogSWYgbm8gZXh0ZW5zaW9uX29wY29kZSBpcyBwb3NzaWJsZS4gKi8KLQotICAvKiB0aGUgYml0cyBpbiBvcGNvZGVfbW9kaWZpZXIgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGZpbmFsIG9wY29kZSBmcm9tCi0gICAgIHRoZSBiYXNlX29wY29kZS4gIFRoZXNlIGJpdHMgYWxzbyBhcmUgdXNlZCB0byBkZXRlY3QgYWx0ZXJuYXRlIGZvcm1zIG9mCi0gICAgIHRoZSBzYW1lIGluc3RydWN0aW9uICovCi0gIHVuc2lnbmVkIGludCBvcGNvZGVfbW9kaWZpZXI7Ci0KLSAgLyogb3Bjb2RlX21vZGlmaWVyIGJpdHM6ICovCi0jZGVmaW5lIFcJCSAgIDB4MQkvKiBzZXQgaWYgb3BlcmFuZHMgY2FuIGJlIHdvcmRzIG9yIGR3b3JkcwotCQkJCSAgIGVuY29kZWQgdGhlIGNhbm9uaWNhbCB3YXkgKi8KLSNkZWZpbmUgRAkJICAgMHgyCS8qIEQgPSAwIGlmIFJlZyAtLT4gUmVnbWVtOwotCQkJCSAgIEQgPSAxIGlmIFJlZ21lbSAtLT4gUmVnOiAgICBNVVNUIEJFIDB4MiAqLwotI2RlZmluZSBNb2RybQkJICAgMHg0Ci0jZGVmaW5lIEZsb2F0UgkJICAgMHg4CS8qIHNyYy9kZXN0IHN3YXAgZm9yIGZsb2F0czogICBNVVNUIEJFIDB4OCAqLwotI2RlZmluZSBTaG9ydEZvcm0JICAweDEwCS8qIHJlZ2lzdGVyIGlzIGluIGxvdyAzIGJpdHMgb2Ygb3Bjb2RlICovCi0jZGVmaW5lIEZsb2F0TUYJCSAgMHgyMAkvKiBGUCBpbnNuIG1lbW9yeSBmb3JtYXQgYml0LCBzaXplZCBieSAweDQgKi8KLSNkZWZpbmUgSnVtcAkJICAweDQwCS8qIHNwZWNpYWwgY2FzZSBmb3IganVtcCBpbnNucy4gKi8KLSNkZWZpbmUgSnVtcER3b3JkCSAgMHg4MCAgLyogY2FsbCBhbmQganVtcCAqLwotI2RlZmluZSBKdW1wQnl0ZQkgMHgxMDAgIC8qIGxvb3AgYW5kIGplY3h6ICovCi0jZGVmaW5lIEp1bXBJbnRlclNlZ21lbnQgMHgyMDAJLyogc3BlY2lhbCBjYXNlIGZvciBpbnRlcnNlZ21lbnQgbGVhcHMvY2FsbHMgKi8KLSNkZWZpbmUgRmxvYXRECQkgMHg0MDAJLyogZGlyZWN0aW9uIGZvciBmbG9hdCBpbnNuczogIE1VU1QgQkUgMHg0MDAgKi8KLSNkZWZpbmUgU2VnMlNob3J0Rm9ybQkgMHg4MDAJLyogZW5jb2Rpbmcgb2YgbG9hZCBzZWdtZW50IHJlZyBpbnNucyAqLwotI2RlZmluZSBTZWczU2hvcnRGb3JtCTB4MTAwMAkvKiBmcy9ncyBzZWdtZW50IHJlZ2lzdGVyIGluc25zLiAqLwotI2RlZmluZSBTaXplMTYJCTB4MjAwMAkvKiBuZWVkcyBzaXplIHByZWZpeCBpZiBpbiAzMi1iaXQgbW9kZSAqLwotI2RlZmluZSBTaXplMzIJCTB4NDAwMAkvKiBuZWVkcyBzaXplIHByZWZpeCBpZiBpbiAxNi1iaXQgbW9kZSAqLwotI2RlZmluZSBJZ25vcmVTaXplCTB4ODAwMCAgLyogaW5zdHJ1Y3Rpb24gaWdub3JlcyBvcGVyYW5kIHNpemUgcHJlZml4ICovCi0jZGVmaW5lIE5vX2JTdWYJICAgICAgIDB4MTAwMDAJLyogYiBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb193U3VmCSAgICAgICAweDIwMDAwCS8qIHcgc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgTm9fbFN1ZgkgICAgICAgMHg0MDAwMAkvKiBsIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX3NTdWYJICAgICAgIDB4ODAwMDAJLyogcyBzdWZmaXggb24gaW5zdHJ1Y3Rpb24gaWxsZWdhbCAqLwotI2RlZmluZSBOb19kU3VmICAgICAgIDB4MTAwMDAwICAvKiBkIHN1ZmZpeCBvbiBpbnN0cnVjdGlvbiBpbGxlZ2FsICovCi0jZGVmaW5lIE5vX3hTdWYgICAgICAgMHgyMDAwMDAgIC8qIHggc3VmZml4IG9uIGluc3RydWN0aW9uIGlsbGVnYWwgKi8KLSNkZWZpbmUgRldhaXQJICAgICAgMHg0MDAwMDAJLyogaW5zdHJ1Y3Rpb24gbmVlZHMgRldBSVQgKi8KLSNkZWZpbmUgSXNTdHJpbmcgICAgICAweDgwMDAwMAkvKiBxdWljayB0ZXN0IGZvciBzdHJpbmcgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIHJlZ0tsdWRnZSAgICAweDEwMDAwMDAJLyogZmFrZSBhbiBleHRyYSByZWcgb3BlcmFuZCBmb3IgY2xyLCBpbXVsICovCi0jZGVmaW5lIElzUHJlZml4ICAgICAweDIwMDAwMDAJLyogb3Bjb2RlIGlzIGEgcHJlZml4ICovCi0jZGVmaW5lIEltbUV4dAkgICAgIDB4NDAwMDAwMAkvKiBpbnN0cnVjdGlvbiBoYXMgZXh0ZW5zaW9uIGluIDggYml0IGltbSAqLwotI2RlZmluZSBVZ2gJICAgIDB4ODAwMDAwMDAJLyogZGVwcmVjYXRlZCBmcCBpbnNuLCBnZXRzIGEgd2FybmluZyAqLwotCi0gIC8qIG9wZXJhbmRfdHlwZXNbaV0gZGVzY3JpYmVzIHRoZSB0eXBlIG9mIG9wZXJhbmQgaS4gIFRoaXMgaXMgbWFkZQotICAgICBieSBPUidpbmcgdG9nZXRoZXIgYWxsIG9mIHRoZSBwb3NzaWJsZSB0eXBlIG1hc2tzLiAgKGUuZy4KLSAgICAgJ29wZXJhbmRfdHlwZXNbaV0gPSBSZWd8SW1tJyBzcGVjaWZpZXMgdGhhdCBvcGVyYW5kIGkgY2FuIGJlCi0gICAgIGVpdGhlciBhIHJlZ2lzdGVyIG9yIGFuIGltbWVkaWF0ZSBvcGVyYW5kICovCi0gIHVuc2lnbmVkIGludCBvcGVyYW5kX3R5cGVzWzNdOwotfQotdGVtcGxhdGU7Ci0KLS8qCi0gICd0ZW1wbGF0ZXMnIGlzIGZvciBncm91cGluZyB0b2dldGhlciAndGVtcGxhdGUnIHN0cnVjdHVyZXMgZm9yIG9wY29kZXMKLSAgb2YgdGhlIHNhbWUgbmFtZS4gIFRoaXMgaXMgb25seSB1c2VkIGZvciBzdG9yaW5nIHRoZSBpbnNucyBpbiB0aGUgZ3JhbmQKLSAgb2xlIGhhc2ggdGFibGUgb2YgaW5zbnMuCi0gIFRoZSB0ZW1wbGF0ZXMgdGhlbXNlbHZlcyBzdGFydCBhdCBTVEFSVCBhbmQgcmFuZ2UgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKQotICBFTkQuCi0gICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY29uc3QgdGVtcGxhdGUgKnN0YXJ0OwotICAgIGNvbnN0IHRlbXBsYXRlICplbmQ7Ci0gIH0gdGVtcGxhdGVzOwotCi0vKiB0aGVzZSBhcmUgZm9yIHJlZ2lzdGVyIG5hbWUgLS0+IG51bWJlciAmIHR5cGUgaGFzaCBsb29rdXAgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBjaGFyICpyZWdfbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgcmVnX3R5cGU7Ci0gICAgdW5zaWduZWQgaW50IHJlZ19udW07Ci0gIH0KLXJlZ19lbnRyeTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGNoYXIgKnNlZ19uYW1lOwotICAgIHVuc2lnbmVkIGludCBzZWdfcHJlZml4OwotICB9Ci1zZWdfZW50cnk7Ci0KLS8qIDM4NiBvcGVyYW5kIGVuY29kaW5nIGJ5dGVzOiAgc2VlIDM4NiBib29rIGZvciBkZXRhaWxzIG9mIHRoaXMuICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgaW50IHJlZ21lbTsJLyogY29kZXMgcmVnaXN0ZXIgb3IgbWVtb3J5IG9wZXJhbmQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcmVnOwkJLyogY29kZXMgcmVnaXN0ZXIgb3BlcmFuZCAob3IgZXh0ZW5kZWQgb3Bjb2RlKSAqLwotICAgIHVuc2lnbmVkIGludCBtb2RlOwkJLyogaG93IHRvIGludGVycHJldCByZWdtZW0gJiByZWcgKi8KLSAgfQotbW9kcm1fYnl0ZTsKLQotLyogMzg2IG9wY29kZSBieXRlIHRvIGNvZGUgaW5kaXJlY3QgYWRkcmVzc2luZy4gKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBiYXNlOwotICAgIHVuc2lnbmVkIGluZGV4OwotICAgIHVuc2lnbmVkIHNjYWxlOwotICB9Ci1zaWJfYnl0ZTsKLQotLyogVGhlIG5hbWUgb2YgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlci4gQWxsb3cKLSAgIHRoaXMgdG8gYmUgb3ZlcnJpZGRlbiBpZiBuZWVkIGJlLiAqLwotI2lmbmRlZiBHTE9CQUxfT0ZGU0VUX1RBQkxFX05BTUUKLSNkZWZpbmUgR0xPQkFMX09GRlNFVF9UQUJMRV9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQgaTM4Nl92YWxpZGF0ZV9maXggUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0jZGVmaW5lIFRDX1ZBTElEQVRFX0ZJWChGSVhQLFNFR1RZUEUsU0tJUCkgaTM4Nl92YWxpZGF0ZV9maXgoRklYUCkKLSNlbmRpZgotCi0jZW5kaWYgLyogVENfSTM4NiAqLwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotCi1leHRlcm4gaW50IGZsYWdfMTZiaXRfY29kZTsKLQotI2RlZmluZSBtZF9kb19hbGlnbihuLCBmaWxsLCBsZW4sIG1heCwgYXJvdW5kKQkJCQlcCi1pZiAoKG4pICYmICFuZWVkX3Bhc3NfMgkJCQkJCQlcCi0gICAgJiYgKCEoZmlsbCkgfHwgKChjaGFyKSooZmlsbCkgPT0gKGNoYXIpMHg5MCAmJiAobGVuKSA9PSAxKSkJCVwKLSAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKSkJCQkJCQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgY2hhciAqcDsJCQkJCQkJCVwKLSAgICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDE1LCAxLCAocmVsYXhfc3Vic3RhdGVUKSBtYXgsCQlcCi0JCSAgKHN5bWJvbFMgKikgMCwgKG9mZnNldFQpIChuKSwgKGNoYXIgKikgMCk7CQlcCi0gICAgKnAgPSAweDkwOwkJCQkJCQkJXAotICAgIGdvdG8gYXJvdW5kOwkJCQkJCQlcCi0gIH0KLQotZXh0ZXJuIHZvaWQgaTM4Nl9hbGlnbl9jb2RlIFBBUkFNUyAoKGZyYWdTICosIGludCkpOwotCi0jZGVmaW5lIEhBTkRMRV9BTElHTihmcmFnUCkJCQkJCQlcCi1pZiAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfYWxpZ25fY29kZSkgCQkJCQlcCi0gIGkzODZfYWxpZ25fY29kZSAoZnJhZ1AsIChmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcwkJCVwKLQkJCSAgIC0gZnJhZ1AtPmZyX2FkZHJlc3MJCQkJXAotCQkJICAgLSBmcmFnUC0+ZnJfZml4KSk7Ci0KLS8qIGNhbGwgbWRfYXBwbHlfZml4MyB3aXRoIHNlZ21lbnQgaW5zdGVhZCBvZiBtZF9hcHBseV9maXggKi8KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotCi12b2lkIGkzODZfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLSNkZWZpbmUgdGNfcHJpbnRfc3RhdGlzdGljcyBpMzg2X3ByaW50X3N0YXRpc3RpY3MKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0jaWZkZWYgU0NPX0VMRgotI2RlZmluZSB0Y19pbml0X2FmdGVyX2FyZ3MoKSBzY29faWQgKCkKLWV4dGVybiB2b2lkIHNjb19pZCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBESUZGX0VYUFJfT0sgICAgLyogZm9vLS4gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogZW5kIG9mIHRjLWkzODYuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pODYwLmMgYi9nYXMvY29uZmlnL3RjLWk4NjAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxNzI4Mi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk4NjAuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNjMgKzAsMCBAQAotLyogdGMtaTg2MC5jIC0tIEFzc2VtYmxlIGZvciB0aGUgSTg2MAotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvaTg2MC5oIgotCi12b2lkIG1kX2JlZ2luICgpOwotdm9pZCBtZF9udW1iZXJfdG9fY2hhcnMgKCk7Ci12b2lkIG1kX2Fzc2VtYmxlICgpOwotY2hhciAqbWRfYXRvZiAoKTsKLXZvaWQgbWRfY29udmVydF9mcmFnICgpOwotaW50IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4ICgpOwotdm9pZCBtZF9udW1iZXJfdG9faW1tICgpOwotdm9pZCBtZF9udW1iZXJfdG9fZGlzcCAoKTsKLXZvaWQgbWRfbnVtYmVyX3RvX2ZpZWxkICgpOwotdm9pZCBtZF9yaV90b19jaGFycyAoKTsKLXN0YXRpYyB2b2lkIGk4NjBfaXAgKCk7Ci0vKiB2b2lkIGVtaXRfbWFjaGluZV9yZWxvYygpOyAqLwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IHNpemVvZiAoc3RydWN0IHJlbG9jYXRpb25faW5mbyk7Ci0KLS8qIHZvaWQgKCptZF9lbWl0X3JlbG9jYXRpb25zKSgpID0gZW1pdF9tYWNoaW5lX3JlbG9jOyAqLwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLXN0YXRpYyB2b2lkIHNfZHVhbCAoKSwgc19lbmRkdWFsICgpOwotc3RhdGljIHZvaWQgc19hdG1wICgpOwotCi1jb25zdCBwc2V1ZG9fdHlwZVMKLSAgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ImR1YWwiLCBzX2R1YWwsIDR9LAotICB7ImVuZGR1YWwiLCBzX2VuZGR1YWwsIDR9LAotICB7ImF0bXAiLCBzX2F0bXAsIDR9LAotICB7TlVMTCwgMCwgMH0sCi19OwotCi0vKiBUaGlzIGFycmF5IGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIS8iOwkvKiBKRiByZW1vdmVkICd8JyBmcm9tIGNvbW1lbnRfY2hhcnMgKi8KLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIGxpa2UgdGhpcyBvbmUgd2lsbCBhbHdheXMgd29yay4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIy8iOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jIC4gIElkZWFsbHkgaXQgc2hvdWxkbid0IGhhdmUgdG8ga25vdyBhYm91dCBpdCBhdCBhbGwsCi0gICBidXQgbm90aGluZyBpcyBpZGVhbCBhcm91bmQgaGVyZS4KLSAgICovCi1pbnQgc2l6ZV9yZWxvY19pbmZvID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgb2N0YWxbMjU2XTsKLSNkZWZpbmUgaXNvY3RhbChjKSAgb2N0YWxbY10KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRvSGV4WzI1Nl07Ci0KLXN0cnVjdCBpODYwX2l0Ci0gIHsKLSAgICBjaGFyICplcnJvcjsKLSAgICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgICBzdHJ1Y3Qgbmxpc3QgKm5saXN0cDsKLSAgICBleHByZXNzaW9uUyBleHA7Ci0gICAgaW50IHBjcmVsOwotICAgIGVudW0gZXhwYW5kX3R5cGUgZXhwYW5kOwotICAgIGVudW0gaGlnaGxvd190eXBlIGhpZ2hsb3c7Ci0gICAgZW51bSByZWxvY190eXBlIHJlbG9jOwotICB9IHRoZV9pbnNuOwotCi0jaWYgX19TVERDX18gPT0gMQotCi1zdGF0aWMgdm9pZCBwcmludF9pbnNuIChzdHJ1Y3QgaTg2MF9pdCAqaW5zbik7Ci1zdGF0aWMgaW50IGdldEV4cHJlc3Npb24gKGNoYXIgKnN0cik7Ci0KLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotCi1zdGF0aWMgdm9pZCBwcmludF9pbnNuICgpOwotc3RhdGljIGludCBnZXRFeHByZXNzaW9uICgpOwotCi0jZW5kaWYgLyogbm90IF9fU1REQ19fICovCi0KLXN0YXRpYyBjaGFyICpleHByX2VuZDsKLXN0YXRpYyBjaGFyIGxhc3RfZXhwYW5kOwkvKiBlcnJvciBpZiBleHBhbnNpb24gYWZ0ZXIgYnJhbmNoICovCi0KLWVudW0gZHVhbAotewotICBEVUFMX09GRiA9IDAsIERVQUxfT04sIERVQUxfRERPVCwgRFVBTF9PTkRET1QsCi19Owotc3RhdGljIGVudW0gZHVhbCBkdWFsX21vZGUgPSBEVUFMX09GRjsJLyogZHVhbC1pbnN0cnVjdGlvbiBtb2RlICovCi0KLXN0YXRpYyB2b2lkCi1zX2R1YWwgKCkJCQkvKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgaGF2ZSBkdWFsIHNldCAqLwotewotICBkdWFsX21vZGUgPSBEVUFMX09OOwotfQotCi1zdGF0aWMgdm9pZAotc19lbmRkdWFsICgpCQkJLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGhhdmUgZHVhbCBzZXQgKi8KLXsKLSAgZHVhbF9tb2RlID0gRFVBTF9PRkY7Ci19Ci0KLXN0YXRpYyBpbnQgYXRtcCA9IDMxOwkJLyogdGVtcG9yYXJ5IHJlZ2lzdGVyIGZvciBwc2V1ZG8ncyAqLwotCi1zdGF0aWMgdm9pZAotc19hdG1wICgpCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic3AiLCAyKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgICAgYXRtcCA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJmcCIsIDIpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICBhdG1wID0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInIiLCAxKSA9PSAwKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAxOwotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKHRlbXAgPj0gMCAmJiB0ZW1wIDw9IDMxKQotCWF0bXAgPSB0ZW1wOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5rbm93biB0ZW1wb3JhcnkgcHNldWRvIHJlZ2lzdGVyIikpOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmV0dmFsID0gTlVMTDsKLSAgaW50IGxvc2UgPSAwOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHdoaWxlIChpIDwgTlVNT1BDT0RFUykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gaTg2MF9vcGNvZGVzW2ldLm5hbWU7Ci0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgJmk4NjBfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksCi0JCSAgIGk4NjBfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgICAgZG8KLQl7Ci0JICBpZiAoaTg2MF9vcGNvZGVzW2ldLm1hdGNoICYgaTg2MF9vcGNvZGVzW2ldLmxvc2UpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBsb3Npbmcgb3Bjb2RlOiBgJXMnIFwiJXNcIlxuIiksCi0JCSAgICAgICBpODYwX29wY29kZXNbaV0ubmFtZSwgaTg2MF9vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCBOVU1PUENPREVTCi0JICAgICAmJiAhc3RyY21wIChpODYwX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpOwotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgZm9yIChpID0gJzAnOyBpIDwgJzgnOyArK2kpCi0gICAgb2N0YWxbaV0gPSAxOwotICBmb3IgKGkgPSAnMCc7IGkgPD0gJzknOyArK2kpCi0gICAgdG9IZXhbaV0gPSBpIC0gJzAnOwotICBmb3IgKGkgPSAnYSc7IGkgPD0gJ2YnOyArK2kpCi0gICAgdG9IZXhbaV0gPSBpICsgMTAgLSAnYSc7Ci0gIGZvciAoaSA9ICdBJzsgaSA8PSAnRic7ICsraSkKLSAgICB0b0hleFtpXSA9IGkgKyAxMCAtICdBJzsKLX0KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICp0b1A7Ci0gIGludCByc2Q7Ci0gIGludCBub19vcGNvZGVzID0gMTsKLSAgaW50IGk7Ci0gIHN0cnVjdCBpODYwX2l0IHBzZXVkb1szXTsKLQotICBhc3NlcnQgKHN0cik7Ci0gIGk4NjBfaXAgKHN0cik7Ci0KLSAgLyogY2hlY2sgZm9yIGV4cGFuZGFibGUgZmxhZyB0byBwcm9kdWNlIHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLSAgaWYgKHRoZV9pbnNuLmV4cGFuZCAhPSAwICYmIHRoZV9pbnNuLmhpZ2hsb3cgPT0gTk9fU1BFQykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotCXBzZXVkb1tpXSA9IHRoZV9pbnNuOwotCi0gICAgICBzd2l0Y2ggKHRoZV9pbnNuLmV4cGFuZCkKLQl7Ci0KLQljYXNlIEVfREVMQVk6Ci0JICBub19vcGNvZGVzID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX01PVjoKLQkgIGlmICh0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IE5VTEwgJiYKLQkgICAgICB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyIDwgKDEgPDwgMTUpICYmCi0JICAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPj0gLSgxIDw8IDE1KSkpCi0JICAgIGJyZWFrOwotCSAgLyogb3IgbCVjb25zdCxyMCxpcmVnX2Rlc3QgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwMDFmMDAwMCkgfCAweGU0MDAwMDAwOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBQQUlSOwotCSAgLyogb3JoIGglY29uc3QsaXJlZ19kZXN0LGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAzZmZmZmZmKSB8IDB4ZWMwMDAwMDAgfAotCSAgICAoKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIDw8IDUpOwotCSAgcHNldWRvWzFdLmhpZ2hsb3cgPSBISUdIOwotCSAgbm9fb3Bjb2RlcyA9IDI7Ci0JICBicmVhazsKLQotCWNhc2UgRV9BRERSOgotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMKQotCSAgICBicmVhazsKLQkgIC8qIG9yaCBoYSVhZGRyX2V4cHIscjAscjMxICovCi0JICBwc2V1ZG9bMF0ub3Bjb2RlID0gMHhlYzAwMDAwMCB8IChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1swXS5oaWdobG93ID0gSElHSEFESjsKLQkgIHBzZXVkb1swXS5yZWxvYyA9IExPVzA7CS8qIG11c3Qgb3ZlcndyaXRlICovCi0JICAvKiBsJWFkZHJfZXhwcihyMzEpLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiB+MHgwMDNlMDAwMCkgfCAoYXRtcCA8PCAyMSk7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IFBBSVI7Ci0JICBub19vcGNvZGVzID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX1UzMjoJCS8qIDJuZCB2ZXJzaW9uIGVtdWxhdGVzIEludGVsIGFzLCBub3QgZG9jLiAqLwotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNikgJiYKLQkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAwKSkKLQkgICAgYnJlYWs7Ci0JICAvKiAkKG9wY29kZSloIGglY29uc3QsaXJlZ19zcmMyLGlyZWdfZGVzdAotCQkJICAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweGYzZmZmZmZmKSB8IDB4MGMwMDAwMDA7ICovCi0JICAvKiAkKG9wY29kZSloIGglY29uc3QsaXJlZ19zcmMyLHIzMSAqLwotCSAgcHNldWRvWzBdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweGYzZTBmZmZmKSB8IDB4MGMwMDAwMDAgfAotCSAgICAoYXRtcCA8PCAxNik7Ci0JICBwc2V1ZG9bMF0uaGlnaGxvdyA9IEhJR0g7Ci0JICAvKiAkKG9wY29kZSkgbCVjb25zdCxpcmVnX2Rlc3QsaXJlZ19kZXN0Ci0JCQkgICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4ZjAxZjAwMDApIHwgMHgwNDAwMDAwMCB8Ci0JCQkgICAoKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIDw8IDUpOyAqLwotCSAgLyogJChvcGNvZGUpIGwlY29uc3QscjMxLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweGYwMWYwMDAwKSB8IDB4MDQwMDAwMDAgfAotCSAgICAoYXRtcCA8PCAyMSk7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IFBBSVI7Ci0JICBub19vcGNvZGVzID0gMjsKLQkgIGJyZWFrOwotCi0JY2FzZSBFX0FORDoJCS8qIDJuZCB2ZXJzaW9uIGVtdWxhdGVzIEludGVsIGFzLCBub3QgZG9jLiAqLwotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNikgJiYKLQkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAwKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBhbmRub3QgaCVjb25zdCxpcmVnX3NyYzIsaXJlZ19kZXN0Ci0JCQkgICBwc2V1ZG9bMF0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDNmZmZmZmYpIHwgMHhkNDAwMDAwMDsgKi8KLQkgIC8qIGFuZG5vdCBoJWNvbnN0LGlyZWdfc3JjMixyMzEgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAodGhlX2luc24ub3Bjb2RlICYgMHgwM2UwZmZmZikgfCAweGQ0MDAwMDAwIHwKLQkgICAgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIOwotCSAgcHNldWRvWzBdLmV4cC5YX2FkZF9udW1iZXIgPSAtMSAtIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JICAvKiBhbmRub3QgbCVjb25zdCxpcmVnX2Rlc3QsaXJlZ19kZXN0Ci0JCQkgICBwc2V1ZG9bMV0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIHwgMHhkNDAwMDAwMCB8Ci0JCQkgICAoKHRoZV9pbnNuLm9wY29kZSAmIDB4MDAxZjAwMDApIDw8IDUpOyAqLwotCSAgLyogYW5kbm90IGwlY29uc3QscjMxLGlyZWdfZGVzdCAqLwotCSAgcHNldWRvWzFdLm9wY29kZSA9ICh0aGVfaW5zbi5vcGNvZGUgJiAweDAwMWYwMDAwKSB8IDB4ZDQwMDAwMDAgfAotCSAgICAoYXRtcCA8PCAyMSk7Ci0JICBwc2V1ZG9bMV0uaGlnaGxvdyA9IFBBSVI7Ci0JICBwc2V1ZG9bMV0uZXhwLlhfYWRkX251bWJlciA9IC0xIC0gdGhlX2luc24uZXhwLlhfYWRkX251bWJlcjsKLQkgIG5vX29wY29kZXMgPSAyOwotCSAgYnJlYWs7Ci0KLQljYXNlIEVfUzMyOgotCSAgaWYgKHRoZV9pbnNuLmV4cC5YX2FkZF9zeW1ib2wgPT0gTlVMTCAmJgotCSAgICAgIHRoZV9pbnNuLmV4cC5YX29wX3N5bWJvbCA9PSBOVUxMICYmCi0JICAgICAgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAoMSA8PCAxNSkgJiYKLQkgICAgICAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAtKDEgPDwgMTUpKSkKLQkgICAgYnJlYWs7Ci0JICAvKiBvcmggaCVjb25zdCxyMCxyMzEgKi8KLQkgIHBzZXVkb1swXS5vcGNvZGUgPSAweGVjMDAwMDAwIHwgKGF0bXAgPDwgMTYpOwotCSAgcHNldWRvWzBdLmhpZ2hsb3cgPSBISUdIOwotCSAgLyogb3IgbCVjb25zdCxyMzEscjMxICovCi0JICBwc2V1ZG9bMV0ub3Bjb2RlID0gMHhlNDAwMDAwMCB8IChhdG1wIDw8IDIxKSB8IChhdG1wIDw8IDE2KTsKLQkgIHBzZXVkb1sxXS5oaWdobG93ID0gUEFJUjsKLQkgIC8qIHIzMSxpcmVnX3NyYzIsaXJlZ19kZXN0ICovCi0JICBwc2V1ZG9bMl0ub3Bjb2RlID0gKHRoZV9pbnNuLm9wY29kZSAmIH4weDA0MDBmZmZmKSB8IChhdG1wIDw8IDExKTsKLQkgIHBzZXVkb1syXS5yZWxvYyA9IE5PX1JFTE9DOwotCSAgbm9fb3Bjb2RlcyA9IDM7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JfQotCi0gICAgICB0aGVfaW5zbiA9IHBzZXVkb1swXTsKLSAgICAgIC8qIGNoZWNrIGZvciBleHBhbmRlZCBvcGNvZGUgYWZ0ZXIgYnJhbmNoIG9yIGluIGR1YWwgKi8KLSAgICAgIGlmIChub19vcGNvZGVzID4gMSAmJiBsYXN0X2V4cGFuZCA9PSAxKQotCWFzX3dhcm4gKF8oIkV4cGFuZGVkIG9wY29kZSBhZnRlciBkZWxheWVkIGJyYW5jaDogYCVzJyIpLCBzdHIpOwotICAgICAgaWYgKG5vX29wY29kZXMgPiAxICYmIGR1YWxfbW9kZSAhPSBEVUFMX09GRikKLQlhc193YXJuIChfKCJFeHBhbmRlZCBvcGNvZGUgaW4gZHVhbCBtb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgfQotCi0gIGkgPSAwOwotICBkbwotICAgIHsJCQkJLyogYWx3YXlzIHByb2R1Y2UgYXQgbGVhc3Qgb25lIG9wY29kZSAqLwotICAgICAgdG9QID0gZnJhZ19tb3JlICg0KTsKLSAgICAgIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIHRoZV9pbnNuLm9wY29kZSwgNCk7Ci0KLSAgICAgIC8qIGNoZWNrIGZvciBleHBhbmRlZCBvcGNvZGUgYWZ0ZXIgYnJhbmNoIG9yIGluIGR1YWwgKi8KLSAgICAgIGxhc3RfZXhwYW5kID0gdGhlX2luc24ucGNyZWw7Ci0KLSAgICAgIC8qIHB1dCBvdXQgdGhlIHN5bWJvbC1kZXBlbmRlbnQgc3R1ZmYgKi8KLSAgICAgIGlmICh0aGVfaW5zbi5yZWxvYyAhPSBOT19SRUxPQykKLQl7Ci0JICBmaXhfbmV3IChmcmFnX25vdywJLyogd2hpY2ggZnJhZyAqLwotCQkgICAodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLAkvKiB3aGVyZSAqLwotCQkgICA0LAkJLyogc2l6ZSAqLwotCQkgICAmdGhlX2luc24uZXhwLAotCQkgICB0aGVfaW5zbi5wY3JlbCwKLQkgIC8qIG1lcmdlIGJpdCBmaWVsZHMgaW50byBvbmUgYXJndW1lbnQgKi8KLQkgIChpbnQpICgoKHRoZV9pbnNuLmhpZ2hsb3cgJiAweDMpIDw8IDQpIHwgKHRoZV9pbnNuLnJlbG9jICYgMHhmKSkpOwotCX0KLSAgICAgIHRoZV9pbnNuID0gcHNldWRvWysraV07Ci0gICAgfQotICB3aGlsZSAoLS1ub19vcGNvZGVzID4gMCk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLWk4NjBfaXAgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBjb25zdCBjaGFyICphcmdzOwotICBjaGFyIGM7Ci0gIHVuc2lnbmVkIGxvbmcgaTsKLSAgc3RydWN0IGk4NjBfb3Bjb2RlICppbnNuOwotICBjaGFyICphcmdzU3RhcnQ7Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICB1bnNpZ25lZCBpbnQgbWFzazsKLSAgaW50IG1hdGNoID0gMDsKLSAgaW50IGNvbW1hID0gMDsKLQotCi0gIGZvciAocyA9IHN0cjsgaXNsb3dlciAoKnMpIHx8ICpzID09ICcuJyB8fCAqcyA9PSAnMyc7ICsrcykKLSAgICA7Ci0gIHN3aXRjaCAoKnMpCi0gICAgewotCi0gICAgY2FzZSAnXDAnOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcsJzoKLSAgICAgIGNvbW1hID0gMTsKLQotICAgICAgLypGQUxMVEhST1VHSCovCi0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgfQotCi0gIGlmIChzdHJuY21wIChzdHIsICJkLiIsIDIpID09IDApCi0gICAgewkJCQkvKiBjaGVjayBmb3IgZC4gb3Bjb2RlIHByZWZpeCAqLwotICAgICAgaWYgKGR1YWxfbW9kZSA9PSBEVUFMX09OKQotCWR1YWxfbW9kZSA9IERVQUxfT05ERE9UOwotICAgICAgZWxzZQotCWR1YWxfbW9kZSA9IERVQUxfRERPVDsKLSAgICAgIHN0ciArPSAyOwotICAgIH0KLQotICBpZiAoKGluc24gPSAoc3RydWN0IGk4NjBfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoZHVhbF9tb2RlID09IERVQUxfRERPVCB8fCBkdWFsX21vZGUgPT0gRFVBTF9PTkRET1QpCi0Jc3RyIC09IDI7Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoY29tbWEpCi0gICAgewotICAgICAgKi0tcyA9ICcsJzsKLSAgICB9Ci0gIGFyZ3NTdGFydCA9IHM7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgb3Bjb2RlID0gaW5zbi0+bWF0Y2g7Ci0gICAgICBtZW1zZXQgKCZ0aGVfaW5zbiwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zbikpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSBOT19SRUxPQzsKLQotICAgICAgLyoKLQkJICogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZQotCQkgKiBzdXJlIHRoYXQgdGhlIG9wZXJhbmRzIG1hdGNoCi0JCSAqLwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLQl7Ci0JICBzd2l0Y2ggKCphcmdzKQotCSAgICB7Ci0KLQkgICAgY2FzZSAnXDAnOgkJLyogZW5kIG9mIGFyZ3MgKi8KLQkgICAgICBpZiAoKnMgPT0gJ1wwJykKLQkJewotCQkgIG1hdGNoID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJysnOgotCSAgICBjYXNlICcoJzoJCS8qIHRoZXNlIG11c3QgbWF0Y2ggZXhhY3RseSAqLwotCSAgICBjYXNlICcpJzoKLQkgICAgY2FzZSAnLCc6Ci0JICAgIGNhc2UgJyAnOgotCSAgICAgIGlmICgqcysrID09ICphcmdzKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcjJzoJCS8qIG11c3QgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0ICovCi0JICAgICAgaWYgKGlzZGlnaXQgKCpzKyspKQotCQl7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCpzKSkKLQkJICAgIHsKLQkJICAgICAgKytzOwotCQkgICAgfQotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnMSc6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJzInOgotCSAgICBjYXNlICdkJzoKLQkgICAgICBzd2l0Y2ggKCpzKQotCQl7Ci0KLQkJY2FzZSAnZic6CS8qIGZyYW1lIHBvaW50ZXIgKi8KLQkJICBzKys7Ci0JCSAgaWYgKCpzKysgPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBtYXNrID0gMHgzOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBnb3RvIGVycm9yOwotCi0JCWNhc2UgJ3MnOgkvKiBzdGFjayBwb2ludGVyICovCi0JCSAgcysrOwotCQkgIGlmICgqcysrID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgbWFzayA9IDB4MjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgZ290byBlcnJvcjsKLQotCQljYXNlICdyJzoJLyogYW55IHJlZ2lzdGVyICovCi0JCSAgcysrOwotCQkgIGlmICghaXNkaWdpdCAoYyA9ICpzKyspKQotCQkgICAgewotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGlmIChpc2RpZ2l0ICgqcykpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgoYyA9IDEwICogKGMgLSAnMCcpICsgKCpzKysgLSAnMCcpKSA+PSAzMikKLQkJCXsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGMgLT0gJzAnOwotCQkgICAgfQotCQkgIG1hc2sgPSBjOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6CS8qIG5vdCB0aGlzIG9wY29kZSAqLwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAvKgotCQkJCSAqIEdvdCB0aGUgcmVnaXN0ZXIsIG5vdyBmaWd1cmUgb3V0IHdoZXJlCi0JCQkJICogaXQgZ29lcyBpbiB0aGUgb3Bjb2RlLgotCQkJCSAqLwotCSAgICAgIHN3aXRjaCAoKmFyZ3MpCi0JCXsKLQotCQljYXNlICcxJzoKLQkJICBvcGNvZGUgfD0gbWFzayA8PCAxMTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICcyJzoKLQkJICBvcGNvZGUgfD0gbWFzayA8PCAyMTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdkJzoKLQkJICBvcGNvZGUgfD0gbWFzayA8PCAxNjsKLQkJICBjb250aW51ZTsKLQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZSc6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnZyc6Ci0JICAgICAgaWYgKCpzKysgPT0gJ2YnICYmIGlzZGlnaXQgKCpzKSkKLQkJewotCQkgIG1hc2sgPSAqcysrOwotCQkgIGlmIChpc2RpZ2l0ICgqcykpCi0JCSAgICB7Ci0JCSAgICAgIG1hc2sgPSAxMCAqIChtYXNrIC0gJzAnKSArICgqcysrIC0gJzAnKTsKLQkJICAgICAgaWYgKG1hc2sgPj0gMzIpCi0JCQl7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbWFzayAtPSAnMCc7Ci0JCSAgICB9Ci0JCSAgc3dpdGNoICgqYXJncykKLQkJICAgIHsKLQotCQkgICAgY2FzZSAnZSc6Ci0JCSAgICAgIG9wY29kZSB8PSBtYXNrIDw8IDExOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnZic6Ci0JCSAgICAgIG9wY29kZSB8PSBtYXNrIDw8IDIxOwotCQkgICAgICBjb250aW51ZTsKLQotCQkgICAgY2FzZSAnZyc6Ci0JCSAgICAgIG9wY29kZSB8PSBtYXNrIDw8IDE2OwotCQkgICAgICBpZiAoZHVhbF9tb2RlICE9IERVQUxfT0ZGKQotCQkJb3Bjb2RlIHw9ICgxIDw8IDkpOwkvKiBkdWFsIG1vZGUgaW5zdHJ1Y3Rpb24gKi8KLQkJICAgICAgaWYgKGR1YWxfbW9kZSA9PSBEVUFMX0RET1QpCi0JCQlkdWFsX21vZGUgPSBEVUFMX09GRjsKLQkJICAgICAgaWYgKGR1YWxfbW9kZSA9PSBEVUFMX09ORERPVCkKLQkJCWR1YWxfbW9kZSA9IERVQUxfT047Ci0JCSAgICAgIGlmICgob3Bjb2RlICYgKDEgPDwgMTApKSAmJiAobWFzayA9PSAoKG9wY29kZSA+PiAxMSkgJiAweDFmKSkpCi0JCQlhc193YXJuIChfKCJGc3IxIGVxdWFscyBmZGVzdCB3aXRoIFBpcGVsaW5pbmciKSk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYyc6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgImZpciIsIDMpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHgwIDw8IDIxOwotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAicHNyIiwgMykgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDEgPDwgMjE7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJkaXJiYXNlIiwgNykgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDIgPDwgMjE7Ci0JCSAgcyArPSA3OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJkYiIsIDIpID09IDApCi0JCXsKLQkJICBvcGNvZGUgfD0gMHgzIDw8IDIxOwotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiZnNyIiwgMykgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDQgPDwgMjE7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJlcHNyIiwgNCkgPT0gMCkKLQkJewotCQkgIG9wY29kZSB8PSAweDUgPDwgMjE7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNSc6CQkvKiA1IGJpdCBpbW1lZGlhdGUgaW4gc3JjMSAqLwotCSAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0JICAgICAgaWYgKCFnZXRFeHByZXNzaW9uIChzKSkKLQkJewotCQkgIHMgPSBleHByX2VuZDsKLQkJICBpZiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciAmIH4weDFmKQotCQkgICAgYXNfYmFkIChfKCI1LWJpdCBpbW1lZGlhdGUgdG9vIGxhcmdlIikpOwotCQkgIG9wY29kZSB8PSAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciAmIDB4MWYpIDw8IDExOwotCQkgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0JCSAgdGhlX2luc24ucmVsb2MgPSBOT19SRUxPQzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2wnOgkJLyogMjYgYml0IGltbWVkaWF0ZSwgcmVsYXRpdmUgYnJhbmNoICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCUkFERFI7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ3MnOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgc3BsaXQgcmVsYXRpdmUgYnJhbmNoICovCi0JICAgICAgLyogdXBwZXIgNSBiaXRzIG9mIG9mZnNldCBpbiBkZXN0IGZpZWxkICovCi0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gU1BMSVQwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ1MnOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgc3BsaXQgKHN0KSwgYWxpZ25lZCAqLwotCSAgICAgIGlmIChvcGNvZGUgJiAoMSA8PCAyOCkpCi0JCWlmIChvcGNvZGUgJiAweDEpCi0JCSAgdGhlX2luc24ucmVsb2MgPSBTUExJVDI7Ci0JCWVsc2UKLQkJICB0aGVfaW5zbi5yZWxvYyA9IFNQTElUMTsKLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnJlbG9jID0gU1BMSVQwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ0knOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgYWxpZ25lZCAqLwotCSAgICAgIGlmIChvcGNvZGUgJiAoMSA8PCAyOCkpCi0JCWlmIChvcGNvZGUgJiAweDEpCi0JCSAgdGhlX2luc24ucmVsb2MgPSBMT1cyOwotCQllbHNlCi0JCSAgdGhlX2luc24ucmVsb2MgPSBMT1cxOwotCSAgICAgIGVsc2UKLQkJdGhlX2luc24ucmVsb2MgPSBMT1cwOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2knOgkJLyogMTYgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gTE9XMDsKLQotCSAgICAgIC8qRkFMTFRIUk9VR0gqLwotCi0JICAgIGltbWVkaWF0ZToKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQlzKys7Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJoYSUiLCAzKSA9PSAwKQotCQl7Ci0JCSAgdGhlX2luc24uaGlnaGxvdyA9IEhJR0hBREo7Ci0JCSAgcyArPSAzOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3RybmNtcCAocywgImglIiwgMikgPT0gMCkKLQkJewotCQkgIHRoZV9pbnNuLmhpZ2hsb3cgPSBISUdIOwotCQkgIHMgKz0gMjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHMsICJsJSIsIDIpID09IDApCi0JCXsKLQkJICB0aGVfaW5zbi5oaWdobG93ID0gUEFJUjsKLQkJICBzICs9IDI7Ci0JCX0KLQkgICAgICB0aGVfaW5zbi5leHBhbmQgPSBpbnNuLT5leHBhbmQ7Ci0KLQkgICAgICAvKiBOb3RlIHRoYXQgaWYgdGhlIGdldEV4cHJlc3Npb24oKSBmYWlscywgd2Ugd2lsbCBzdGlsbCBoYXZlCi0JCQkJICAgY3JlYXRlZCBVIGVudHJpZXMgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlICdzeW1ib2xzJwotCQkJCSAgIGluIHRoZSBpbnB1dCBzdHJpbmcuICBUcnkgbm90IHRvIGNyZWF0ZSBVIHN5bWJvbHMgZm9yCi0JCQkJICAgcmVnaXN0ZXJzLCBldGMuICovCi0KLQkgICAgICBpZiAoIWdldEV4cHJlc3Npb24gKHMpKQotCQl7Ci0JCSAgcyA9IGV4cHJfZW5kOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjay4iKSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICBlcnJvcjoKLSAgICAgIGlmIChtYXRjaCA9PSAwKQotCXsKLQkgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotCSAgaWYgKCZpbnNuWzFdIC0gaTg2MF9vcGNvZGVzIDwgTlVNT1BDT0RFUwotCSAgICAgICYmICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpCi0JICAgIHsKLQkgICAgICArK2luc247Ci0JICAgICAgcyA9IGFyZ3NTdGFydDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzIikpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB0aGVfaW5zbi5vcGNvZGUgPSBvcGNvZGU7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldEV4cHJlc3Npb24gKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzYXZlX2luOwotICBzZWdUIHNlZzsKLQotICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0gIHNlZyA9IGV4cHJlc3Npb24gKCZ0aGVfaW5zbi5leHApOwotICBpZiAoc2VnICE9IGFic29sdXRlX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB1bmRlZmluZWRfc2VjdGlvbgotICAgICAgJiYgISBTRUdfTk9STUFMIChzZWcpKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLmVycm9yID0gXygiYmFkIHNlZ21lbnQiKTsKLSAgICAgIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZXhwcl9lbmQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gIHJldHVybiAwOwotfQotCi0KLS8qCi0gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBtZF9hdG9mIGluIG02OGsuYy4gIEkgdGhpbmsgdGhpcyBpcyByaWdodCwKLSAgYnV0IEknbSBub3Qgc3VyZS4KLQotICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotCi0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKgotICogV3JpdGUgb3V0IGJpZy1lbmRpYW4uCi0gKi8KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIG4sIGZpeFApCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGludCBuOwotICAgICBmaXhTICpmaXhQOwotewotICBlbnVtIHJlbG9jX3R5cGUgcmVsb2MgPSBmaXhQLT5meF9yX3R5cGUgJiAweGY7Ci0gIGVudW0gaGlnaGxvd190eXBlIGhpZ2hsb3cgPSAoZml4UC0+Znhfcl90eXBlID4+IDQpICYgMHgzOwotCi0gIGFzc2VydCAoYnVmKTsKLSAgYXNzZXJ0IChuID09IDQpOwkJLyogYWx3YXlzIG9uIGk4NjAgKi8KLQotICBzd2l0Y2ggKGhpZ2hsb3cpCi0gICAgewotCi0gICAgY2FzZSBISUdIQURKOgkJLyogYWRqdXN0cyB0aGUgaGlnaC1vcmRlciAxNi1iaXRzICovCi0gICAgICBpZiAodmFsICYgKDEgPDwgMTUpKQotCXZhbCArPSAoMSA8PCAxNik7Ci0KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotCi0gICAgY2FzZSBISUdIOgkJCS8qIHNlbGVjdHMgdGhlIGhpZ2gtb3JkZXIgMTYtYml0cyAqLwotICAgICAgdmFsID4+PSAxNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQQUlSOgkJCS8qIHNlbGVjdHMgdGhlIGxvdy1vcmRlciAxNi1iaXRzICovCi0gICAgICB2YWwgPSB2YWwgJiAweGZmZmY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgc3dpdGNoIChyZWxvYykKLSAgICB7Ci0KLSAgICBjYXNlIEJSQUREUjoJCS8qIGJyLGNhbGwsYmMsYmMudCxibmMsYm5jLnQgdy8yNi1iaXQgaW1tZWRpYXRlICovCi0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwgIT0gMSkKLQlhc19iYWQgKF8oIjI2LWJpdCBicmFuY2ggdy9vIHBjIHJlbGF0aXZlIHNldDogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgPj49IDI7CQkvKiBhbGlnbiBwY3JlbCBvZmZzZXQsIHNlZSBtYW51YWwgKi8KLQotICAgICAgaWYgKHZhbCA+PSAoMSA8PCAyNSkgfHwgdmFsIDwgLSgxIDw8IDI1KSkJLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JYXNfYmFkIChfKCIyNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IiksIHZhbCk7Ci0gICAgICBidWZbMF0gPSAoYnVmWzBdICYgMHhmYykgfCAoKHZhbCA+PiAyNCkgJiAweDMpOwotICAgICAgYnVmWzFdID0gdmFsID4+IDE2OwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU1BMSVQyOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgNC1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDMpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDQtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDM7CQkvKiA0LWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgU1BMSVQxOgkJLyogMTYgYml0IGltbWVkaWF0ZSwgMi1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDEpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDItYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDE7CQkvKiAyLWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgU1BMSVQwOgkJLyogc3QsYmxhLGJ0ZSxidG5lIHcvMTYtYml0IGltbWVkaWF0ZSAqLwotICAgICAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDEpCi0JdmFsID4+PSAyOwkJLyogYWxpZ24gcGNyZWwgb2Zmc2V0LCBzZWUgbWFudWFsICovCi0gICAgICAvKiBjaGVjayBmb3IgYm91bmRzICovCi0gICAgICBpZiAoaGlnaGxvdyAhPSBQQUlSICYmICh2YWwgPj0gKDEgPDwgMTYpIHx8IHZhbCA8IC0oMSA8PCAxNSkpKQotCWFzX2JhZCAoXygiMTYtYml0IGJyYW5jaCBvZmZzZXQgb3ZlcmZsb3c6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgYnVmWzFdID0gKGJ1ZlsxXSAmIH4weDFmKSB8ICgodmFsID4+IDExKSAmIDB4MWYpOwotICAgICAgYnVmWzJdID0gKGJ1ZlsyXSAmIH4weDcpIHwgKCh2YWwgPj4gOCkgJiAweDcpOwotICAgICAgYnVmWzNdIHw9IHZhbDsJCS8qIHBlcnNlcnZlIGJvdHRvbSBvcGNvZGUgYml0cyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIExPVzQ6CQkJLyogZmxkLHBmbGQscHN0LGZsdXNoIDE2LWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4ZikKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgMTYtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weGY7CQkvKiAxNi1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIExPVzM6CQkJLyogZmxkLHBmbGQscHN0LGZsdXNoIDgtYnl0ZSBhbGlnbmVkICovCi0gICAgICBpZiAodmFsICYgMHg3KQotCWFzX2JhZCAoXygiMTYtYml0IGltbWVkaWF0ZSA4LWJ5dGUgYWxpZ25tZW50IGVycm9yOiAweCUwOHgiKSwgdmFsKTsKLSAgICAgIHZhbCAmPSB+MHg3OwkJLyogOC1ieXRlIGFsaWduIHZhbHVlICovCi0gICAgICAvKkZBTExUSFJPVUdIKi8KLSAgICBjYXNlIExPVzI6CQkJLyogMTYgYml0IGltbWVkaWF0ZSwgNC1ieXRlIGFsaWduZWQgKi8KLSAgICAgIGlmICh2YWwgJiAweDMpCi0JYXNfYmFkIChfKCIxNi1iaXQgaW1tZWRpYXRlIDQtYnl0ZSBhbGlnbm1lbnQgZXJyb3I6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgdmFsICY9IH4weDM7CQkvKiA0LWJ5dGUgYWxpZ24gdmFsdWUgKi8KLSAgICAgIC8qRkFMTFRIUk9VR0gqLwotICAgIGNhc2UgTE9XMToJCQkvKiAxNiBiaXQgaW1tZWRpYXRlLCAyLWJ5dGUgYWxpZ25lZCAqLwotICAgICAgaWYgKHZhbCAmIDB4MSkKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgMi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IiksIHZhbCk7Ci0gICAgICB2YWwgJj0gfjB4MTsJCS8qIDItYnl0ZSBhbGlnbiB2YWx1ZSAqLwotICAgICAgLypGQUxMVEhST1VHSCovCi0gICAgY2FzZSBMT1cwOgkJCS8qIDE2IGJpdCBpbW1lZGlhdGUsIGJ5dGUgYWxpZ25lZCAqLwotICAgICAgLyogY2hlY2sgZm9yIGJvdW5kcyAqLwotICAgICAgaWYgKGhpZ2hsb3cgIT0gUEFJUiAmJiAodmFsID49ICgxIDw8IDE2KSB8fCB2YWwgPCAtKDEgPDwgMTUpKSkKLQlhc19iYWQgKF8oIjE2LWJpdCBpbW1lZGlhdGUgb3ZlcmZsb3c6IDB4JTA4eCIpLCB2YWwpOwotICAgICAgYnVmWzJdID0gdmFsID4+IDg7Ci0gICAgICBidWZbM10gfD0gdmFsOwkJLyogcGVyc2VydmUgYm90dG9tIG9wY29kZSBiaXRzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTk9fUkVMT0M6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygiYmFkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IiksIHJlbG9jKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotewotICBhc19mYXRhbCAoXygibWRfbnVtYmVyX3RvX2Rpc3BcbiIpKTsKLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2ZpZWxkIChidWYsIHZhbCwgZml4KQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICB2b2lkICpmaXg7Ci17Ci0gIGFzX2ZhdGFsIChfKCJpODYwX251bWJlcl90b19maWVsZFxuIikpOwotfQotCi0vKiB0aGUgYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QgcGxheXMgaGVsbAotICAgd2l0aCB0aGUgYnl0ZS1vcmRlciBwcm9ibGVtcyBvZiBjcm9zcy1hc3NlbWJseS4gIFNvIGFzIGEgaGFjaywKLSAgIEkgYWRkZWQgdGhpcyBtYWNoLiBkZXBlbmRlbnQgcmkgdHdpZGRsZXIuICBVZ2x5LCBidXQgaXQgZ2V0cwotICAgeW91IHRoZXJlLiAtS1dLICovCi0vKiBvbiBpODYwOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBuZXh0IHRocmVlCi0gICBieXRlcyBhcmUgaW5kZXgsIG1vc3Qgc2lnLiBieXRlIGZpcnN0LiAgQnl0ZSA3IGlzIGJyb2tlbiB1cCB3aXRoCi0gICBiaXQgNyBhcyBwY3JlbCwgYml0IDYgYXMgZXh0ZXJuLCBhbmQgdGhlIGxvd2VyIHNpeCBiaXRzIGFzCi0gICByZWxvY2F0aW9uIHR5cGUgKGhpZ2hsb3cgNS00KS4gIE5leHQgNCBieXRlcyBhcmUgbG9uZyBhZGRlbmQuICovCi0vKiBUaGFueCBhbmQgYSB0aXAgb2YgdGhlIGhhdCB0byBNaWNoYWVsIEJsb29tLCBtYkB0dGlkY2EudHRpLmNvbSAqLwotdm9pZAotbWRfcmlfdG9fY2hhcnMgKHJpX3AsIHJpKQotICAgICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyaV9wLCByaTsKLXsKLSNpZiAwCi0gIHVuc2lnbmVkIGNoYXIgdGhlX2J5dGVzW3NpemVvZiAoKnJpX3ApXTsKLQotICAvKiB0aGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLnJfYWRkcmVzcywgc2l6ZW9mIChyaS5yX2FkZHJlc3MpKTsKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgdGhlX2J5dGVzWzRdID0gKHJpLnJfaW5kZXggPj4gMTYpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s1XSA9IChyaS5yX2luZGV4ID4+IDgpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s2XSA9IHJpLnJfaW5kZXggJiAweDBmZjsKLSAgdGhlX2J5dGVzWzddID0gKChyaS5yX2V4dGVybiA8PCA3KSAmIDB4ODApIHwgKDAgJiAweDYwKSB8IChyaS5yX3R5cGUgJiAweDFGKTsKLSAgLyogQWxzbyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAoJnRoZV9ieXRlc1s4XSwgcmkucl9hZGRlbmQsIHNpemVvZiAocmkucl9hZGRlbmQpKTsKLSAgLyogbm93IHB1dCBpdCBiYWNrIHdoZXJlIHlvdSBmb3VuZCBpdCwgSnVuaW9yLi4uICovCi0gIG1lbWNweSAoKGNoYXIgKikgcmlfcCwgdGhlX2J5dGVzLCBzaXplb2YgKCpyaV9wKSk7Ci0jZW5kaWYKLX0KLQotLyogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmb3IgaTg2MCAqLwotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgYXNfZmF0YWwgKF8oImk4NjBfY29udmVydF9mcmFnXG4iKSk7Ci19Ci0KLS8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgZm9yIGk4NjAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWd0eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VndHlwZTsKLXsKLSAgYXNfZmF0YWwgKF8oImk4NjBfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXhcbiIpKTsKLX0KLQotLyogZm9yIGRlYnVnZ2luZyBvbmx5LCBtdXN0IG1hdGNoIGVudW0gcmVsb2NfdHlwZSAqLwotc3RhdGljIGNoYXIgKlJlbG9jW10gPQotewotICAiTk9fUkVMT0MiLAotICAiQlJBRERSIiwKLSAgIkxPVzAiLAotICAiTE9XMSIsCi0gICJMT1cyIiwKLSAgIkxPVzMiLAotICAiTE9XNCIsCi0gICJTUExJVDAiLAotICAiU1BMSVQxIiwKLSAgIlNQTElUMiIsCi0gICJSRUxPQ18zMiIsCi19Owotc3RhdGljIGNoYXIgKkhpZ2hsb3dbXSA9Ci17Ci0gICJOT19TUEVDIiwKLSAgIlBBSVIiLAotICAiSElHSCIsCi0gICJISUdIQURKIiwKLX07Ci1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbiAoaW5zbikKLSAgICAgc3RydWN0IGk4NjBfaXQgKmluc247Ci17Ci0gIGlmIChpbnNuLT5lcnJvcikKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogJXNcbiIpOwotICAgIH0KLSAgZnByaW50ZiAoc3RkZXJyLCAib3Bjb2RlPTB4JTA4eFx0IiwgaW5zbi0+b3Bjb2RlKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZXhwYW5kPTB4JTA4eFx0IiwgaW5zbi0+ZXhwYW5kKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAicmVsb2MgPSAlc1x0IiwgUmVsb2NbaW5zbi0+cmVsb2NdKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiaGlnaGxvdyA9ICVzXG4iLCBIaWdobG93W2luc24tPmhpZ2hsb3ddKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZXhwID0gIHtcbiIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9hZGRfc3ltYm9sID0gJXNcbiIsCi0JICAgaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCA/Ci0JICAgKFNfR0VUX05BTUUgKGluc24tPmV4cC5YX2FkZF9zeW1ib2wpID8KLQkgICAgU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfYWRkX3N5bWJvbCkgOiAiPz8/IikgOiAiMCIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcdFx0WF9vcF9zeW1ib2wgPSAlc1xuIiwKLQkgICBpbnNuLT5leHAuWF9vcF9zeW1ib2wgPwotCSAgIChTX0dFVF9OQU1FIChpbnNuLT5leHAuWF9vcF9zeW1ib2wpID8KLQkgICAgU19HRVRfTkFNRSAoaW5zbi0+ZXhwLlhfb3Bfc3ltYm9sKSA6ICI/Pz8iKSA6ICIwIik7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlx0XHRYX2FkZF9udW1iZXIgPSAlZFxuIiwKLQkgICBpbnNuLT5leHAuWF9hZGRfbnVtYmVyKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAifVxuIik7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotI2lmZGVmIGNvbW1lbnQKLS8qCi0gKiBJODYwIHJlbG9jYXRpb25zIGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudCwgc28gaXQgbmVlZHMKLSAqIHRoaXMgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZSB0byBlbWl0IHRoZW0uCi0gKi8KLXZvaWQKLWVtaXRfbWFjaGluZV9yZWxvYyAoZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIHJlZ2lzdGVyIGZpeFMgKmZpeFA7Ci0gICAgIHJlbGF4X2FkZHJlc3NUIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlOwotewotICBzdHJ1Y3QgcmVsb2NfaW5mb19pODYwIHJpOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBleHRlcm4gY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsKLSAgbG9uZyBhZGRfbnVtYmVyOwotCi0gIG1lbXNldCAoKGNoYXIgKikgJnJpLCAnXDAnLCBzaXplb2YgKHJpKSk7Ci0gIGZvciAoOyBmaXhQOyBmaXhQID0gZml4UC0+ZnhfbmV4dCkKLSAgICB7Ci0KLSAgICAgIGlmIChmaXhQLT5meF9yX3R5cGUgJiB+MHgzZikKLQl7Ci0JICBhc19mYXRhbCAoImZpeFAtPmZ4X3JfdHlwZSA9ICVkXG4iLCBmaXhQLT5meF9yX3R5cGUpOwotCX0KLSAgICAgIHJpLnJfcGNyZWwgPSBmaXhQLT5meF9wY3JlbDsKLSAgICAgIHJpLnJfdHlwZSA9IGZpeFAtPmZ4X3JfdHlwZTsKLQotICAgICAgaWYgKChzeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kpICE9IE5VTEwpCi0JewotCSAgcmkucl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArCi0JICAgIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci0JICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JICAgIHsKLQkgICAgICByaS5yX2V4dGVybiA9IDE7Ci0JICAgICAgcmkucl9zeW1ib2xudW0gPSBzeW1ib2xQLT5zeV9udW1iZXI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJpLnJfZXh0ZXJuID0gMDsKLQkgICAgICByaS5yX3N5bWJvbG51bSA9IFNfR0VUX1RZUEUgKHN5bWJvbFApOwotCSAgICB9Ci0JICBpZiAoc3ltYm9sUCAmJiBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApKQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgPSBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9hZGRyZXNzOwotCSAgICB9Ci0JICByaS5yX3R5cGUgPSBmaXhQLT5meF9yX3R5cGU7Ci0JICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JICAgIHsKLQkgICAgICAvKiBwcmVzZXJ2ZSBhY3R1YWwgb2Zmc2V0IHZzLiBwYyArIDQgKi8KLQkgICAgICByaS5yX2FkZGVuZCAtPSAocmkucl9hZGRyZXNzICsgNCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gZml4UC0+ZnhfYWRkbnVtYmVyOwotCSAgICB9Ci0KLQkgIG1kX3JpX3RvX2NoYXJzICgoY2hhciAqKSAmcmksIHJpKTsKLQkgIGFwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIChjaGFyICopICZyaSwgc2l6ZW9mIChyaSkpOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLSNpZmRlZiBPQkpfQU9VVAotCi0vKiBvbiBpODYwOiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBuZXh0IHRocmVlCi0gICBieXRlcyBhcmUgaW5kZXgsIG1vc3Qgc2lnLiBieXRlIGZpcnN0LiAgQnl0ZSA3IGlzIGJyb2tlbiB1cCB3aXRoCi0gICBiaXQgNyBhcyBwY3JlbCwgYml0IDYgYXMgZXh0ZXJuLCBhbmQgdGhlIGxvd2VyIHNpeCBiaXRzIGFzCi0gICByZWxvY2F0aW9uIHR5cGUgKGhpZ2hsb3cgNS00KS4gIE5leHQgNCBieXRlcyBhcmUgbG9uZyBhZGRlbmQuICovCi0KLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgbG9uZyByX2luZGV4OwotICBsb25nIHJfZXh0ZXJuOwotICBsb25nIHJfYWRkZW5kID0gMDsKLSAgbG9uZyByX2FkZHJlc3M7Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kpOwotICBrbm93ICghKGZpeFAtPmZ4X3JfdHlwZSAmIH4weDNmKSk7Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDE7Ci0gICAgICByX2luZGV4ID0gZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByX2V4dGVybiA9IDA7Ci0gICAgICByX2luZGV4ID0gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpOwotICAgIH0KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotCQkgICAgICByX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgd2hlcmVbNF0gPSAocl9pbmRleCA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9pbmRleCA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfaW5kZXggJiAweDBmZjsKLSAgd2hlcmVbN10gPSAoKChmaXhQLT5meF9wY3JlbCA8PCA3KSAmIDB4ODApCi0JICAgICAgfCAoKHJfZXh0ZXJuIDw8IDYpICYgMHg0MCkKLQkgICAgICB8IChmaXhQLT5meF9yX3R5cGUgJiAweDNGKSk7Ci0KLSAgaWYgKHN5bWJvbF9nZXRfZnJhZyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIHJfYWRkZW5kID0gc3ltYm9sX2dldF9mcmFnIChmaXhQLT5meF9hZGRzeSktPmZyX2FkZHJlc3M7Ci0gICAgfQotCi0gIGlmIChmaXhQLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICAvKiBwcmVzZXJ2ZSBhY3R1YWwgb2Zmc2V0IHZzLiBwYyArIDQgKi8KLSAgICAgIHJfYWRkZW5kIC09IChyX2FkZHJlc3MgKyA0KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByX2FkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLSAgICB9Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICgmd2hlcmVbOF0sIHJfYWRkZW5kLCA0KTsKLX0KLQotI2VuZGlmIC8qIE9CSl9BT1VUICovCi0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIGk4NjAsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cwotICAgaXRzIHNpemUuICg/Pz8gSXMgdGhpcyByaWdodD8gIEZJWE1FLVNPT04hKSAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqcGxhY2UgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgLyogbG9va3MgdG8gbWUgbGlrZSBpODYwIG5ldmVyIGhhcyBiaXQgZml4ZXMuIExldCdzIHNlZS4geG94b3JpY2guICovCi0gIGtub3cgKGZpeFAtPmZ4X2JpdF9maXhQID09IE5VTEwpOwotICBpZiAoIWZpeFAtPmZ4X2JpdF9maXhQKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKLSAgICAgIG1kX251bWJlcl90b19pbW0gKHBsYWNlLCB2YWwsIGZpeFAtPmZ4X3NpemUsIGZpeFApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19maWVsZCAocGxhY2UsIHZhbCwgZml4UC0+ZnhfYml0X2ZpeFApOwotICAgIH0KLX0KLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRjLWk4NjAuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1pODYwLmggYi9nYXMvY29uZmlnL3RjLWk4NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiMjFjMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLWk4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIHRjLWk4NjAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGhlIEk4NjAKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICAgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVENfSTg2MCAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soeCkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGMtaTg2MC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWk5NjAuYyBiL2dhcy9jb25maWcvdGMtaTk2MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGMxNWMwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTk2MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM0OSArMCwwIEBACi0vKiB0Yy1pOTYwLmMgLSBBbGwgdGhlIGk4MDk2MC1zcGVjaWZpYyBzdHVmZgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBTZWUgY29tbWVudCBvbiBtZF9wYXJzZV9vcHRpb24gZm9yIDgwOTYwLXNwZWNpZmljIGludm9jYXRpb24gb3B0aW9ucy4gKi8KLQotLyogVGhlcmUgYXJlIDQgZGlmZmVyZW50IGxlbmd0aHMgb2YgKHBvdGVudGlhbGx5KSBzeW1ib2wtYmFzZWQgZGlzcGxhY2VtZW50cwotICAgaW4gdGhlIDgwOTYwIGluc3RydWN0aW9uIHNldCwgZWFjaCBvZiB3aGljaCBjb3VsZCByZXF1aXJlIGFkZHJlc3MgZml4LXVwcwotICAgYW5kIChpbiB0aGUgY2FzZSBvZiBleHRlcm5hbCBzeW1ib2xzKSBlbWlzc2lvbiBvZiByZWxvY2F0aW9uIGRpcmVjdGl2ZXM6Ci0KLSAgIDMyLWJpdCAoTUVNQikKLSAgICAgICAgVGhpcyBpcyBhIHN0YW5kYXJkIGxlbmd0aCBmb3IgdGhlIGJhc2UgYXNzZW1ibGVyIGFuZCByZXF1aXJlcyBubwotICAgICAgICBzcGVjaWFsIGFjdGlvbi4KLQotICAgMTMtYml0IChDT0JSKQotICAgICAgICBUaGlzIGlzIGEgbm9uLXN0YW5kYXJkIGxlbmd0aCwgYnV0IHRoZSBiYXNlIGFzc2VtYmxlciBoYXMgYQotICAgICAgICBob29rIGZvciBiaXQgZmllbGQgYWRkcmVzcyBmaXh1cHM6IHRoZSBmaXhTIHN0cnVjdHVyZSBjYW4KLSAgICAgICAgcG9pbnQgdG8gYSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCwgaW4gd2hpY2ggY2FzZSBvdXIKLSAgICAgICAgbWRfbnVtYmVyX3RvX2ZpZWxkKCkgcm91dGluZSBnZXRzIGNhbGxlZCB0byBwcm9jZXNzIGl0LgotCi0gICAgICAgIEkgbWFkZSB0aGUgaG9vayBhIGxpdHRsZSBjbGVhbmVyIGJ5IGhhdmluZyBmaXhfbmV3KCkgKGluIHRoZSBiYXNlCi0gICAgICAgIGFzc2VtYmxlcikgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZml4UyBpbiBxdWVzdGlvbi4gIEFuZCBJIG1hZGUgaXQgYQotICAgICAgICBsaXR0bGUgc2ltcGxlciBieSBzdG9yaW5nIHRoZSBmaWVsZCBzaXplIChpbiB0aGlzIGNhc2UgMTMpIGluc3RlYWQgb2YKLSAgICAgICAgb2YgYSBwb2ludGVyIHRvIGFub3RoZXIgc3RydWN0dXJlOiAgODA5NjAgZGlzcGxhY2VtZW50cyBhcmUgQUxXQVlTCi0gICAgICAgIHN0b3JlZCBpbiB0aGUgbG93LW9yZGVyIGJpdHMgb2YgYSA0LWJ5dGUgd29yZC4KLQotICAgICAgICBTaW5jZSB0aGUgdGFyZ2V0IG9mIGEgQ09CUiBjYW5ub3QgYmUgZXh0ZXJuYWwsIG5vIHJlbG9jYXRpb24KLSAgICAgICAgZGlyZWN0aXZlcyBmb3IgdGhpcyBzaXplIGRpc3BsYWNlbWVudCBoYXZlIHRvIGJlIGdlbmVyYXRlZC4KLSAgICAgICAgQnV0IHRoZSBiYXNlIGFzc2VtYmxlciBoYWQgdG8gYmUgbW9kaWZpZWQgdG8gaXNzdWUgZXJyb3IKLSAgICAgICAgbWVzc2FnZXMgaWYgdGhlIHN5bWJvbCBkaWQgdHVybiBvdXQgdG8gYmUgZXh0ZXJuYWwuCi0KLSAgIDI0LWJpdCAoQ1RSTCkKLSAgICAgICAgRml4dXBzIGFyZSBoYW5kbGVkIGFzIGZvciB0aGUgMTMtYml0IGNhc2UgKGV4Y2VwdCB0aGF0IDI0IGlzIHN0b3JlZAotICAgICAgICBpbiB0aGUgZml4UykuCi0KLSAgICAgICAgVGhlIHJlbG9jYXRpb24gZGlyZWN0aXZlIGdlbmVyYXRlZCBpcyB0aGUgc2FtZSBhcyB0aGF0IGZvciB0aGUgMzItYml0Ci0gICAgICAgIGRpc3BsYWNlbWVudCwgZXhjZXB0IHRoYXQgaXQncyBQQy1yZWxhdGl2ZSAodGhlIDMyLWJpdCBkaXNwbGFjZW1lbnQKLSAgICAgICAgbmV2ZXIgaXMpLiAgIFRoZSBpODA5NjAgdmVyc2lvbiBvZiB0aGUgbGlua2VyIG5lZWRzIGEgbW9kIHRvCi0gICAgICAgIGRpc3Rpbmd1aXNoIGFuZCBoYW5kbGUgdGhlIDI0LWJpdCBjYXNlLgotCi0gICAxMi1iaXQgKE1FTUEpCi0gICAgICAgIE1FTUEgZm9ybWF0cyBhcmUgYWx3YXlzIHByb21vdGVkIHRvIE1FTUIgKDMyLWJpdCkgaWYgdGhlIGRpc3BsYWNlbWVudAotICAgICAgICBpcyBiYXNlZCBvbiBhIHN5bWJvbCwgYmVjYXVzZSBpdCBjb3VsZCBiZSByZWxvY2F0ZWQgYXQgbGluayB0aW1lLgotICAgICAgICBUaGUgb25seSB0aW1lIHdlIHVzZSB0aGUgMTItYml0IGZvcm1hdCBpcyBpZiBhbiBhYnNvbHV0ZSB2YWx1ZSBvZgotICAgICAgICBsZXNzIHRoYW4gNDA5NiBpcyBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2Ugd2UgbmVlZCBuZWl0aGVyIGEgZml4dXAgbm9yCi0gICAgICAgIGEgcmVsb2NhdGlvbiBkaXJlY3RpdmUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotI2luY2x1ZGUgIm9wY29kZS9pOTYwLmgiCi0KLSNpZiBkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoT0JKX0JPVVQpCi0KLSNkZWZpbmUgVENfU19JU19TWVNQUk9DKHMpCSgoMTw9U19HRVRfT1RIRVIocykpICYmIChTX0dFVF9PVEhFUihzKTw9MzIpKQotI2RlZmluZSBUQ19TX0lTX0JBTE5BTUUocykJKFNfR0VUX09USEVSKHMpID09IE5fQkFMTkFNRSkKLSNkZWZpbmUgVENfU19JU19DQUxMTkFNRShzKQkoU19HRVRfT1RIRVIocykgPT0gTl9DQUxMTkFNRSkKLSNkZWZpbmUgVENfU19JU19CQURQUk9DKHMpCSgoU19HRVRfT1RIRVIocykgIT0gMCkgJiYgIVRDX1NfSVNfQ0FMTE5BTUUocykgJiYgIVRDX1NfSVNfQkFMTkFNRShzKSAmJiAhVENfU19JU19TWVNQUk9DKHMpKQotCi0jZGVmaW5lIFRDX1NfU0VUX1NZU1BST0MocywgcCkJKFNfU0VUX09USEVSKChzKSwgKHApKzEpKQotI2RlZmluZSBUQ19TX0dFVF9TWVNQUk9DKHMpCShTX0dFVF9PVEhFUihzKS0xKQotCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRShzKQkoU19TRVRfT1RIRVIoKHMpLCBOX0JBTE5BTUUpKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0NBTExOQU1FKHMpCShTX1NFVF9PVEhFUigocyksIE5fQ0FMTE5BTUUpKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX1NZU1BST0MocykJezt9Ci0KLSNlbHNlIC8qICEgT0JKX0EvQk9VVCAqLwotI2lmZGVmIE9CSl9DT0ZGCi0KLSNkZWZpbmUgVENfU19JU19TWVNQUk9DKHMpCShTX0dFVF9TVE9SQUdFX0NMQVNTKHMpID09IENfU0NBTEwpCi0jZGVmaW5lIFRDX1NfSVNfQkFMTkFNRShzKQkoU0ZfR0VUX0JBTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfSVNfQ0FMTE5BTUUocykJKFNGX0dFVF9DQUxMTkFNRShzKSkKLSNkZWZpbmUgVENfU19JU19CQURQUk9DKHMpCShUQ19TX0lTX1NZU1BST0MocykgJiYgVENfU19HRVRfU1lTUFJPQyhzKSA8IDAgJiYgMzEgPCBUQ19TX0dFVF9TWVNQUk9DKHMpKQotCi0jZGVmaW5lIFRDX1NfU0VUX1NZU1BST0MocywgcCkJKChzKS0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMV0ueF9zYy54X3N0aW5keCA9IChwKSkKLSNkZWZpbmUgVENfU19HRVRfU1lTUFJPQyhzKQkoKHMpLT5zeV9zeW1ib2wub3N0X2F1eGVudFsxXS54X3NjLnhfc3RpbmR4KQotCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRShzKQkoU0ZfU0VUX0JBTE5BTUUocykpCi0jZGVmaW5lIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUocykJKFNGX1NFVF9DQUxMTkFNRShzKSkKLSNkZWZpbmUgVENfU19GT1JDRV9UT19TWVNQUk9DKHMpCShTX1NFVF9TVE9SQUdFX0NMQVNTKChzKSwgQ19TQ0FMTCkpCi0KLSNlbHNlIC8qICEgT0JKX0NPRkYgKi8KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIFRDX1NfSVNfU1lTUFJPQyhzKQkwCi0KLSNkZWZpbmUgVENfU19JU19CQUxOQU1FKHMpCTAKLSNkZWZpbmUgVENfU19JU19DQUxMTkFNRShzKQkwCi0jZGVmaW5lIFRDX1NfSVNfQkFEUFJPQyhzKQkwCi0KLSNkZWZpbmUgVENfU19TRVRfU1lTUFJPQyhzLCBwKQotI2RlZmluZSBUQ19TX0dFVF9TWVNQUk9DKHMpIDAKLQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUocykKLSNkZWZpbmUgVENfU19GT1JDRV9UT19DQUxMTkFNRShzKQotI2RlZmluZSBUQ19TX0ZPUkNFX1RPX1NZU1BST0MocykKLSNlbHNlCi0gI2Vycm9yIENPRkYsIGEub3V0LCBiLm91dCwgYW5kIEVMRiBhcmUgdGhlIG9ubHkgc3VwcG9ydGVkIGZvcm1hdHMuCi0jZW5kaWYgLyogISBPQkpfRUxGICovCi0jZW5kaWYgLyogISBPQkpfQ09GRiAqLwotI2VuZGlmIC8qICEgT0JKX0EvQk9VVCAqLwotCi1leHRlcm4gY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotCi0jaWYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmICFkZWZpbmVkIChCRkQpCi0jaWZkZWYgT0JKX0NPRkYKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2MpOwotI2Vsc2UgLyogT0JKX0NPRkYgKi8KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKTsKLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotI2VuZGlmCi0KLS8qIExvY2FsIGk4MDk2MCByb3V0aW5lcy4gICovCi0KLXN0YXRpYyB2b2lkIGJyY250X2VtaXQgKCk7CS8qIEVtaXQgYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uIGNvZGUgKi8KLXN0YXRpYyBjaGFyICpicmxhYl9uZXh0ICgpOwkvKiBSZXR1cm4gbmV4dCBicmFuY2ggbG9jYWwgbGFiZWwgKi8KLXZvaWQgYnJ0YWJfZW1pdCAoKTsJCS8qIEVtaXQgYnItcHJlZGljdCBpbnN0cnVtZW50YXRpb24gdGFibGUgKi8KLXN0YXRpYyB2b2lkIGNvYnJfZm10ICgpOwkvKiBHZW5lcmF0ZSBDT0JSIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZCBjdHJsX2ZtdCAoKTsJLyogR2VuZXJhdGUgQ1RSTCBpbnN0cnVjdGlvbiAqLwotc3RhdGljIGNoYXIgKmVtaXQgKCk7CQkvKiBFbWl0IChpbnRlcm5hbGx5KSBiaW5hcnkgKi8KLXN0YXRpYyBpbnQgZ2V0X2FyZ3MgKCk7CQkvKiBCcmVhayBhcmd1bWVudHMgb3V0IG9mIGNvbW1hLXNlcGFyYXRlZCBsaXN0ICovCi1zdGF0aWMgdm9pZCBnZXRfY2Rpc3AgKCk7CS8qIEhhbmRsZSBDT0JSIG9yIENUUkwgZGlzcGxhY2VtZW50ICovCi1zdGF0aWMgY2hhciAqZ2V0X2lzcGVjICgpOwkvKiBGaW5kIGluZGV4IHNwZWNpZmljYXRpb24gc3RyaW5nICovCi1zdGF0aWMgaW50IGdldF9yZWdudW0gKCk7CS8qIFRyYW5zbGF0ZSB0ZXh0IHRvIHJlZ2lzdGVyIG51bWJlciAqLwotc3RhdGljIGludCBpX3NjYW4gKCk7CQkvKiBMZXhpY2FsIHNjYW4gb2YgaW5zdHJ1Y3Rpb24gc291cmNlICovCi1zdGF0aWMgdm9pZCBtZW1fZm10ICgpOwkJLyogR2VuZXJhdGUgTUVNQSBvciBNRU1CIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZCBtZW1hX3RvX21lbWIgKCk7CS8qIENvbnZlcnQgTUVNQSBpbnN0cnVjdGlvbiB0byBNRU1CIGZvcm1hdCAqLwotc3RhdGljIHZvaWQgcGFyc2VfZXhwciAoKTsJLyogUGFyc2UgYW4gZXhwcmVzc2lvbiAqLwotc3RhdGljIGludCBwYXJzZV9sZGNvbnN0ICgpOwkvKiBQYXJzZSBhbmQgcmVwbGFjZSBhICdsZGNvbnN0JyBwc2V1ZG8tb3AgKi8KLXN0YXRpYyB2b2lkIHBhcnNlX21lbW9wICgpOwkvKiBQYXJzZSBhIG1lbW9yeSBvcGVyYW5kICovCi1zdGF0aWMgdm9pZCBwYXJzZV9wbyAoKTsJLyogUGFyc2UgbWFjaGluZS1kZXBlbmRlbnQgcHNldWRvLW9wICovCi1zdGF0aWMgdm9pZCBwYXJzZV9yZWdvcCAoKTsJLyogUGFyc2UgYSByZWdpc3RlciBvcGVyYW5kICovCi1zdGF0aWMgdm9pZCByZWdfZm10ICgpOwkJLyogR2VuZXJhdGUgYSBSRUcgZm9ybWF0IGluc3RydWN0aW9uICovCi12b2lkIHJlbG9jX2NhbGxqICgpOwkJLyogUmVsb2NhdGUgYSAnY2FsbGonIGluc3RydWN0aW9uICovCi1zdGF0aWMgdm9pZCByZWxheF9jb2JyICgpOwkvKiAiRGUtb3B0aW1pemUiIGNvYnIgaW50byBjb21wYXJlL2JyYW5jaCAqLwotc3RhdGljIHZvaWQgc19sZWFmcHJvYyAoKTsJLyogUHJvY2VzcyAnLmxlYWZwcm9jJyBwc2V1ZG8tb3AgKi8KLXN0YXRpYyB2b2lkIHNfc3lzcHJvYyAoKTsJLyogUHJvY2VzcyAnLnN5c3Byb2MnIHBzZXVkby1vcCAqLwotc3RhdGljIGludCBzaGlmdF9vayAoKTsJCS8qIFdpbGwgYSAnc2hsbycgc3Vic3RpdHVyZSBmb3IgYSAnbGRjb25zdCc/ICovCi1zdGF0aWMgdm9pZCBzeW50YXggKCk7CQkvKiBHaXZlIHN5bnRheCBlcnJvciAqLwotc3RhdGljIGludCB0YXJnX2hhc19zZnIgKCk7CS8qIFRhcmdldCBjaGlwIHN1cHBvcnRzIHNwZWMtZnVuYyByZWdpc3Rlcj8gKi8KLXN0YXRpYyBpbnQgdGFyZ19oYXNfaWNsYXNzICgpOwkvKiBUYXJnZXQgY2hpcCBzdXBwb3J0cyBpbnN0cnVjdGlvbiBzZXQ/ICovCi0KLS8qIFNlZSBtZF9wYXJzZV9vcHRpb24oKSBmb3IgbWVhbmluZ3Mgb2YgdGhlc2Ugb3B0aW9ucyAqLwotc3RhdGljIGNoYXIgbm9yZWxheDsJCS8qIFRydWUgaWYgLW5vcmVsYXggc3dpdGNoIHNlZW4gKi8KLXN0YXRpYyBjaGFyIGluc3RydW1lbnRfYnJhbmNoZXM7CS8qIFRydWUgaWYgLWIgc3dpdGNoIHNlZW4gKi8KLQotLyogQ2hhcmFjdGVycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuCi0gICBJZiB0aGUgcHJlLXByb2Nlc3NvciBpcyBkaXNhYmxlZCwgdGhlc2UgYXJlbid0IHZlcnkgdXNlZnVsLgotICovCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9ICIjIjsKLQotLyogQ2hhcmFjdGVycyB0aGF0IG9ubHkgc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgIGEgbGluZS4gIElmIHRoZSBsaW5lIHNlZW1zIHRvIGhhdmUgdGhlIGZvcm0gJyMgMTIzIGZpbGVuYW1lJwotICAgLmxpbmUgYW5kIC5maWxlIGRpcmVjdGl2ZXMgd2lsbCBhcHBlYXIgaW4gdGhlIHByZS1wcm9jZXNzZWQgb3V0cHV0LgotCi0gICBOb3RlIHRoYXQgaW5wdXRfZmlsZS5jIGhhbmQgY2hlY2tzIGZvciAnIycgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgIGZpcnN0IGxpbmUgb2YgdGhlIGlucHV0IGZpbGUuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG91dHB1dHMKLSAgICNOT19BUFAgYXQgdGhlIGJlZ2lubmluZyBvZiBpdHMgb3V0cHV0LgotICovCi0KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cyB3b3JrLiAqLwotCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1sxXTsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1sxXTsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwKLSAgIGFzIGluIDBmMTIuNDU2IG9yIDBkMS4yMzQ1ZTEyCi0gKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkZkRHRUIjsKLQotCi0vKiBUYWJsZSB1c2VkIGJ5IGJhc2UgYXNzZW1ibGVyIHRvIHJlbGF4IGFkZHJlc3NlcyBiYXNlZCBvbiB2YXJ5aW5nIGxlbmd0aAotICAgaW5zdHJ1Y3Rpb25zLiAgVGhlIGZpZWxkcyBhcmU6Ci0gICAgIDEpIG1vc3QgcG9zaXRpdmUgcmVhY2ggb2YgdGhpcyBzdGF0ZSwKLSAgICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgICAzKSBob3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZnJhZwotICAgICA0KSB3aGljaCBpbmRleCBpbnRvIHRoZSB0YWJsZSB0byB0cnkgaWYgd2UgY2FuJ3QgZml0IGludG8gdGhpcyBvbmUuCi0KLSAgIEZvciBpODA5NjAsIHRoZSBvbmx5IGFwcGxpY2F0aW9uIGlzIHRoZSAoZGUtKW9wdGltaXphdGlvbiBvZiBjb2JyCi0gICBpbnN0cnVjdGlvbnMgaW50byBzZXBhcmF0ZSBjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHdoZW4gYSAxMy1iaXQKLSAgIGRpc3BsYWNlbWVudCB3b24ndCBoYWNrIGl0LgotICovCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgezAsIDAsIDAsIDB9LAkJCS8qIFN0YXRlIDAgPT4gbm8gbW9yZSByZWxheGF0aW9uIHBvc3NpYmxlICovCi0gIHs0MDg4LCAtNDA5NiwgMCwgMn0sCQkvKiBTdGF0ZSAxOiBjb25kaXRpb25hbCBicmFuY2ggKGNvYnIpICovCi0gIHsweDgwMDAwMCAtIDgsIC0weDgwMDAwMCwgNCwgMH0sCS8qIFN0YXRlIDI6IGNvbXBhcmUgKHJlZykgJiBicmFuY2ggKGN0cmwpICovCi19OwotCi1zdGF0aWMgdm9pZCBzX2VuZGlhbiBQQVJBTVMgKChpbnQpKTsKLQotLyogVGhlc2UgYXJlIHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwc2V1ZG8tb3BzLgotCi0gICBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgICAgICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgICAgICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgICAgICAgaW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAqLwotI2RlZmluZSBTX0xFQUZQUk9DCTEKLSNkZWZpbmUgU19TWVNQUk9DCTIKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJic3MiLCBzX2xjb21tLCAxfSwKLSAgeyJlbmRpYW4iLCBzX2VuZGlhbiwgMH0sCi0gIHsiZXh0ZW5kZWQiLCBmbG9hdF9jb25zLCAndCd9LAotICB7ImxlYWZwcm9jIiwgcGFyc2VfcG8sIFNfTEVBRlBST0N9LAotICB7InN5c3Byb2MiLCBwYXJzZV9wbywgU19TWVNQUk9DfSwKLQotICB7IndvcmQiLCBjb25zLCA0fSwKLSAgeyJxdWFkIiwgY29ucywgMTZ9LAotCi0gIHswLCAwLCAwfQotfTsKLQwKLS8qIE1hY3JvcyB0byBleHRyYWN0IGluZm8gZnJvbSBhbiAnZXhwcmVzc2lvblMnIHN0cnVjdHVyZSAnZScgKi8KLSNkZWZpbmUgYWRkcyhlKQllLlhfYWRkX3N5bWJvbAotI2RlZmluZSBvZmZzKGUpCWUuWF9hZGRfbnVtYmVyCi0KLQotLyogQnJhbmNoLXByZWRpY3Rpb24gYml0cyBmb3IgQ1RSTC9DT0JSIGZvcm1hdCBvcGNvZGVzICovCi0jZGVmaW5lIEJQX01BU0sJCTB4MDAwMDAwMDIJLyogTWFzayBmb3IgYnJhbmNoLXByZWRpY3Rpb24gYml0ICovCi0jZGVmaW5lIEJQX1RBS0VOCTB4MDAwMDAwMDAJLyogVmFsdWUgdG8gT1IgaW4gdG8gcHJlZGljdCBicmFuY2ggKi8KLSNkZWZpbmUgQlBfTk9UX1RBS0VOCTB4MDAwMDAwMDIJLyogVmFsdWUgdG8gT1IgaW4gdG8gcHJlZGljdCBubyBicmFuY2ggKi8KLQotCi0vKiBTb21lIGluc3RydWN0aW9uIG9wY29kZXMgdGhhdCB3ZSBuZWVkIGV4cGxpY2l0bHkgKi8KLSNkZWZpbmUgQkUJMHgxMjAwMDAwMAotI2RlZmluZSBCRwkweDExMDAwMDAwCi0jZGVmaW5lIEJHRQkweDEzMDAwMDAwCi0jZGVmaW5lIEJMCTB4MTQwMDAwMDAKLSNkZWZpbmUgQkxFCTB4MTYwMDAwMDAKLSNkZWZpbmUgQk5FCTB4MTUwMDAwMDAKLSNkZWZpbmUgQk5PCTB4MTAwMDAwMDAKLSNkZWZpbmUgQk8JMHgxNzAwMDAwMAotI2RlZmluZSBDSEtCSVQJMHg1YTAwMjcwMAotI2RlZmluZSBDTVBJCTB4NWEwMDIwODAKLSNkZWZpbmUgQ01QTwkweDVhMDAyMDAwCi0KLSNkZWZpbmUgQgkweDA4MDAwMDAwCi0jZGVmaW5lIEJBTAkweDBiMDAwMDAwCi0jZGVmaW5lIENBTEwJMHgwOTAwMDAwMAotI2RlZmluZSBDQUxMUwkweDY2MDAzODAwCi0jZGVmaW5lIFJFVAkweDBhMDAwMDAwCi0KLQotLyogVGhlc2UgbWFza3MgYXJlIHVzZWQgdG8gYnVpbGQgdXAgYSBzZXQgb2YgTUVNQiBtb2RlIGJpdHMuICovCi0jZGVmaW5lCUFfQklUCQkweDA0MDAKLSNkZWZpbmUJSV9CSVQJCTB4MDgwMAotI2RlZmluZSBNRU1CX0JJVAkweDEwMDAKLSNkZWZpbmUJRF9CSVQJCTB4MjAwMAotCi0KLS8qIE1hc2sgZm9yIHRoZSBvbmx5IG1vZGUgYml0IGluIGEgTUVNQSBpbnN0cnVjdGlvbiAoaWYgc2V0LCBhYmFzZSByZWcgaXMKLSAgIHVzZWQpLiAgKi8KLSNkZWZpbmUgTUVNQV9BQkFTRQkweDIwMDAKLQotLyogSW5mbyBmcm9tIHdoaWNoIGEgTUVNQSBvciBNRU1CIGZvcm1hdCBpbnN0cnVjdGlvbiBjYW4gYmUgZ2VuZXJhdGVkICovCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgLyogKEZpcnN0KSAzMiBiaXRzIG9mIGluc3RydWN0aW9uICovCi0gICAgbG9uZyBvcGNvZGU7Ci0gICAgLyogMC0obm9uZSksIDEyLSBvciwgMzItYml0IGRpc3BsYWNlbWVudCBuZWVkZWQgKi8KLSAgICBpbnQgZGlzcDsKLSAgICAvKiBUaGUgZXhwcmVzc2lvbiBpbiB0aGUgc291cmNlIGluc3RydWN0aW9uIGZyb20gd2hpY2ggdGhlCi0gICAgICAgZGlzcGxhY2VtZW50IHNob3VsZCBiZSBkZXRlcm1pbmVkLiAgKi8KLSAgICBjaGFyICplOwotICB9Ci0KLW1lbVM7Ci0KLQotLyogVGhlIHR3byBwaWVjZXMgb2YgaW5mbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgcmVnaXN0ZXIgb3BlcmFuZCAqLwotc3RydWN0IHJlZ29wCi0gIHsKLSAgICBpbnQgbW9kZTsJCQkvKiAwID0+bG9jYWwvZ2xvYmFsL3NwZWMgcmVnOyAxPT4gbGl0ZXJhbCBvciBmcCByZWcgKi8KLSAgICBpbnQgc3BlY2lhbDsJCS8qIDAgPT5ub3QgYSBzZnI7ICAxPT4gaXMgYSBzZnIgKG5vdCB2YWxpZCB3L21vZGU9MCkgKi8KLSAgICBpbnQgbjsJCQkvKiBSZWdpc3RlciBudW1iZXIgb3IgbGl0ZXJhbCB2YWx1ZSAqLwotICB9OwotCi0KLS8qIE51bWJlciBhbmQgYXNzZW1ibGVyIG1uZW1vbmljIGZvciBhbGwgcmVnaXN0ZXJzIHRoYXQgY2FuIGFwcGVhciBpbgotICAgb3BlcmFuZHMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdAotICB7Ci0gICAgY2hhciAqcmVnX25hbWU7Ci0gICAgaW50IHJlZ19udW07Ci0gIH0KLXJlZ25hbWVzW10gPQotewotICB7ICJwZnAiLCAwIH0sCi0gIHsgInNwIiwgMSB9LAotICB7ICJyaXAiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJnMCIsIDE2IH0sCi0gIHsgImcxIiwgMTcgfSwKLSAgeyAiZzIiLCAxOCB9LAotICB7ICJnMyIsIDE5IH0sCi0gIHsgImc0IiwgMjAgfSwKLSAgeyAiZzUiLCAyMSB9LAotICB7ICJnNiIsIDIyIH0sCi0gIHsgImc3IiwgMjMgfSwKLSAgeyAiZzgiLCAyNCB9LAotICB7ICJnOSIsIDI1IH0sCi0gIHsgImcxMCIsIDI2IH0sCi0gIHsgImcxMSIsIDI3IH0sCi0gIHsgImcxMiIsIDI4IH0sCi0gIHsgImcxMyIsIDI5IH0sCi0gIHsgImcxNCIsIDMwIH0sCi0gIHsgImZwIiwgMzEgfSwKLQotICAvKiBOdW1iZXJzIGZvciBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVycyBhcmUgZm9yIGFzc2VtYmxlciBpbnRlcm5hbAotICAgICB1c2Ugb25seTogdGhleSBhcmUgc2NhbGVkIGJhY2sgdG8gcmFuZ2UgWzAtMzFdIGZvciBiaW5hcnkgb3V0cHV0LiAgKi8KLSNkZWZpbmUgU0YwCTMyCi0KLSAgeyAic2YwIiwgMzIgfSwKLSAgeyAic2YxIiwgMzMgfSwKLSAgeyAic2YyIiwgMzQgfSwKLSAgeyAic2YzIiwgMzUgfSwKLSAgeyAic2Y0IiwgMzYgfSwKLSAgeyAic2Y1IiwgMzcgfSwKLSAgeyAic2Y2IiwgMzggfSwKLSAgeyAic2Y3IiwgMzkgfSwKLSAgeyAic2Y4IiwgNDAgfSwKLSAgeyAic2Y5IiwgNDEgfSwKLSAgeyAic2YxMCIsIDQyIH0sCi0gIHsgInNmMTEiLCA0MyB9LAotICB7ICJzZjEyIiwgNDQgfSwKLSAgeyAic2YxMyIsIDQ1IH0sCi0gIHsgInNmMTQiLCA0NiB9LAotICB7ICJzZjE1IiwgNDcgfSwKLSAgeyAic2YxNiIsIDQ4IH0sCi0gIHsgInNmMTciLCA0OSB9LAotICB7ICJzZjE4IiwgNTAgfSwKLSAgeyAic2YxOSIsIDUxIH0sCi0gIHsgInNmMjAiLCA1MiB9LAotICB7ICJzZjIxIiwgNTMgfSwKLSAgeyAic2YyMiIsIDU0IH0sCi0gIHsgInNmMjMiLCA1NSB9LAotICB7ICJzZjI0IiwgNTYgfSwKLSAgeyAic2YyNSIsIDU3IH0sCi0gIHsgInNmMjYiLCA1OCB9LAotICB7ICJzZjI3IiwgNTkgfSwKLSAgeyAic2YyOCIsIDYwIH0sCi0gIHsgInNmMjkiLCA2MSB9LAotICB7ICJzZjMwIiwgNjIgfSwKLSAgeyAic2YzMSIsIDYzIH0sCi0KLSAgLyogTnVtYmVycyBmb3IgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFyZSBmb3IgYXNzZW1ibGVyIGludGVybmFsCi0gICAgIHVzZSBvbmx5OiB0aGV5IGFyZSBzY2FsZWQgYmFjayB0byBbMC0zXSBmb3IgYmluYXJ5IG91dHB1dC4gICovCi0jZGVmaW5lIEZQMAk2NAotCi0gIHsgImZwMCIsIDY0IH0sCi0gIHsgImZwMSIsIDY1IH0sCi0gIHsgImZwMiIsIDY2IH0sCi0gIHsgImZwMyIsIDY3IH0sCi0KLSAgeyBOVUxMLCAwIH0sCQkJCS8qIEVORCBPRiBMSVNUICovCi19OwotCi0jZGVmaW5lCUlTX1JHX1JFRyhuKQkoKDAgPD0gKG4pKSAmJiAoKG4pIDwgU0YwKSkKLSNkZWZpbmUJSVNfU0ZfUkVHKG4pCSgoU0YwIDw9IChuKSkgJiYgKChuKSA8IEZQMCkpCi0jZGVmaW5lCUlTX0ZQX1JFRyhuKQkoKG4pID49IEZQMCkKLQotLyogTnVtYmVyIGFuZCBhc3NlbWJsZXIgbW5lbW9uaWMgZm9yIGFsbCByZWdpc3RlcnMgdGhhdCBjYW4gYXBwZWFyIGFzCi0gICAnYWJhc2UnIChpbmRpcmVjdCBhZGRyZXNzaW5nKSByZWdpc3RlcnMuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdAotICB7Ci0gICAgY2hhciAqYXJlZ19uYW1lOwotICAgIGludCBhcmVnX251bTsKLSAgfQotYXJlZ3NbXSA9Ci17Ci0gIHsgIihwZnApIiwgMCB9LAotICB7ICIoc3ApIiwgMSB9LAotICB7ICIocmlwKSIsIDIgfSwKLSAgeyAiKHIzKSIsIDMgfSwKLSAgeyAiKHI0KSIsIDQgfSwKLSAgeyAiKHI1KSIsIDUgfSwKLSAgeyAiKHI2KSIsIDYgfSwKLSAgeyAiKHI3KSIsIDcgfSwKLSAgeyAiKHI4KSIsIDggfSwKLSAgeyAiKHI5KSIsIDkgfSwKLSAgeyAiKHIxMCkiLCAxMCB9LAotICB7ICIocjExKSIsIDExIH0sCi0gIHsgIihyMTIpIiwgMTIgfSwKLSAgeyAiKHIxMykiLCAxMyB9LAotICB7ICIocjE0KSIsIDE0IH0sCi0gIHsgIihyMTUpIiwgMTUgfSwKLSAgeyAiKGcwKSIsIDE2IH0sCi0gIHsgIihnMSkiLCAxNyB9LAotICB7ICIoZzIpIiwgMTggfSwKLSAgeyAiKGczKSIsIDE5IH0sCi0gIHsgIihnNCkiLCAyMCB9LAotICB7ICIoZzUpIiwgMjEgfSwKLSAgeyAiKGc2KSIsIDIyIH0sCi0gIHsgIihnNykiLCAyMyB9LAotICB7ICIoZzgpIiwgMjQgfSwKLSAgeyAiKGc5KSIsIDI1IH0sCi0gIHsgIihnMTApIiwgMjYgfSwKLSAgeyAiKGcxMSkiLCAyNyB9LAotICB7ICIoZzEyKSIsIDI4IH0sCi0gIHsgIihnMTMpIiwgMjkgfSwKLSAgeyAiKGcxNCkiLCAzMCB9LAotICB7ICIoZnApIiwgMzEgfSwKLQotI2RlZmluZSBJUFJFTAkzMgotICAvKiBGb3IgYXNzZW1ibGVyIGludGVybmFsIHVzZSBvbmx5OiB0aGlzIG51bWJlciBuZXZlciBhcHBlYXJzIGluIGJpbmFyeQotICAgICBvdXRwdXQuICAqLwotICB7ICIoaXApIiwgSVBSRUwgfSwKLQotICB7IE5VTEwsIDAgfSwJCQkJLyogRU5EIE9GIExJU1QgKi8KLX07Ci0KLQotLyogSGFzaCB0YWJsZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcmVnX2hhc2g7CS8qIFJlZ2lzdGVyIG5hbWUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmFyZWdfaGFzaDsJLyogQWJhc2UgcmVnaXN0ZXIgaGFzaCB0YWJsZSAqLwotCi0KLS8qIEFyY2hpdGVjdHVyZSBmb3Igd2hpY2ggd2UgYXJlIGFzc2VtYmxpbmcgKi8KLSNkZWZpbmUgQVJDSF9BTlkJMAkvKiBEZWZhdWx0OiBubyBhcmNoaXRlY3R1cmUgY2hlY2tpbmcgZG9uZSAqLwotI2RlZmluZSBBUkNIX0tBCQkxCi0jZGVmaW5lIEFSQ0hfS0IJCTIKLSNkZWZpbmUgQVJDSF9NQwkJMwotI2RlZmluZSBBUkNIX0NBCQk0Ci0jZGVmaW5lIEFSQ0hfSlgJCTUKLSNkZWZpbmUgQVJDSF9IWAkJNgotaW50IGFyY2hpdGVjdHVyZSA9IEFSQ0hfQU5ZOwkvKiBBcmNoaXRlY3R1cmUgcmVxdWVzdGVkIG9uIGludm9jYXRpb24gbGluZSAqLwotaW50IGljbGFzc2VzX3NlZW47CQkvKiBPUiBvZiBpbnN0cnVjdGlvbiBjbGFzc2VzIChJXyogY29uc3RhbnRzKQotCQkJCSAqICAgIGZvciB3aGljaCB3ZSd2ZSBhY3R1YWxseSBhc3NlbWJsZWQKLQkJCQkgKiAgICAgIGluc3RydWN0aW9ucy4KLQkJCQkgKi8KLQotCi0vKiBCUkFOQ0gtUFJFRElDVElPTiBJTlNUUlVNRU5UQVRJT04KLQotICAgICAgICBUaGUgZm9sbG93aW5nIHN1cHBvcnRzIGdlbmVyYXRpb24gb2YgYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uCi0gICAgICAgICh0dXJuZWQgb24gYnkgLWIgc3dpdGNoKS4gIFRoZSBpbnN0cnVtZW50YXRpb24gY29sbGVjdHMgY291bnRzCi0gICAgICAgIG9mIGJyYW5jaGVzIHRha2VuL25vdC10YWtlbiBmb3IgbGF0ZXIgaW5wdXQgdG8gYSB1dGlsaXR5IHRoYXQgd2lsbAotICAgICAgICBzZXQgdGhlIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMgb2YgdGhlIGluc3RydWN0aW9ucyBpbiBhY2NvcmRhbmNlIHdpdGgKLSAgICAgICAgdGhlIGJlaGF2aW9yIG9ic2VydmVkLiAgKE5vdGUgdGhhdCB0aGUgS1ggc2VyaWVzIGRvZXMgbm90IGhhdmUKLSAgICAgICAgYnJhY2gtcHJlZGljdGlvbi4pCi0KLSAgICAgICAgVGhlIGluc3RydW1lbnRhdGlvbiBjb25zaXN0cyBvZjoKLQotICAgICAgICAoMSkgYmVmb3JlIGFuZCBhZnRlciBlYWNoIGNvbmRpdGlvbmFsIGJyYW5jaCwgYSBjYWxsIHRvIGFuIGV4dGVybmFsCi0gICAgICAgICAgICByb3V0aW5lIHRoYXQgaW5jcmVtZW50cyBhbmQgc3RlcHMgb3ZlciBhbiBpbmxpbmUgY291bnRlci4gIFRoZQotICAgICAgICAgICAgY291bnRlciBpdHNlbGYsIGluaXRpYWxpemVkIHRvIDAsIGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlIGNhbGwKLSAgICAgICAgICAgIGluc3RydWN0aW9uLiAgRm9yIGVhY2ggYnJhbmNoLCB0aGUgY291bnRlciBmb2xsb3dpbmcgdGhlIGJyYW5jaAotICAgICAgICAgICAgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYnJhbmNoIHdhcyBub3QgdGFrZW4sIGFuZCB0aGUgZGlmZmVyZW5jZQotICAgICAgICAgICAgYmV0d2VlbiB0aGUgY291bnRlcnMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyBpdCB3YXMgdGFrZW4uICBBbgotICAgICAgICAgICAgZXhhbXBsZSBvZiBhbiBpbnN0cnVtZW50ZWQgY29uZGl0aW9uYWwgYnJhbmNoOgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgICAgQlJfQ05UX0ZVTkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndvcmQgICAwCi0gICAgICAgICAgICAgICAgTEJSQU5DSDIzOiAgICAgIGJlICAgICAgbGFiZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbCAgICBCUl9DTlRfRlVOQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud29yZCAgIDAKLQotICAgICAgICAoMikgYSB0YWJsZSBvZiBwb2ludGVycyB0byB0aGUgaW5zdHJ1bWVudGVkIGJyYW5jaGVzLCBzbyB0aGF0IGFuCi0gICAgICAgICAgICBleHRlcm5hbCBwb3N0cHJvY2Vzc2luZyByb3V0aW5lIGNhbiBsb2NhdGUgYWxsIG9mIHRoZSBjb3VudGVycy4KLSAgICAgICAgICAgIHRoZSB0YWJsZSBiZWdpbnMgd2l0aCBhIDItd29yZCBoZWFkZXI6IGEgcG9pbnRlciB0byB0aGUgbmV4dCBpbgotICAgICAgICAgICAgYSBsaW5rZWQgbGlzdCBvZiBzdWNoIHRhYmxlcyAoaW5pdGlhbGl6ZWQgdG8gMCk7ICBhbmQgYSBjb3VudAotICAgICAgICAgICAgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSB0YWJsZSAoZXhjbHVzaXZlIG9mIHRoZSBoZWFkZXIuCi0KLSAgICAgICAgICAgIE5vdGUgdGhhdCBpbnB1dCBzb3VyY2UgY29kZSBpcyBleHBlY3RlZCB0byBhbHJlYWR5IGNvbnRhaW4gY2FsbHMKLSAgICAgICAgICAgIGFuIGV4dGVybmFsIHJvdXRpbmUgdGhhdCB3aWxsIGxpbmsgdGhlIGJyYW5jaCBsb2NhbCB0YWJsZSBpbnRvIGEKLSAgICAgICAgICAgIGxpc3Qgb2Ygc3VjaCB0YWJsZXMuCi0gKi8KLQotLyogTnVtYmVyIG9mIGJyYW5jaGVzIGluc3RydW1lbnRlZCBzbyBmYXIuICBBbHNvIHVzZWQgdG8gZ2VuZXJhdGUKLSAgIHVuaXF1ZSBsb2NhbCBsYWJlbHMgZm9yIGVhY2ggaW5zdHJ1bWVudGVkIGJyYW5jaC4gICovCi1zdGF0aWMgaW50IGJyX2NudDsKLQotI2RlZmluZSBCUl9MQUJFTF9CQVNFCSJMQlJBTkNIIgotLyogQmFzZW5hbWUgb2YgbG9jYWwgbGFiZWxzIG9uIGluc3RydW1lbnRlZCBicmFuY2hlcywgdG8gYXZvaWQKLSAgIGNvbmZsaWN0IHdpdGggY29tcGlsZXItIGdlbmVyYXRlZCBsb2NhbCBsYWJlbHMuICAqLwotCi0jZGVmaW5lIEJSX0NOVF9GVU5DCSJfX2luY19icmFuY2giCi0vKiBOYW1lIG9mIHRoZSBleHRlcm5hbCByb3V0aW5lIHRoYXQgd2lsbCBpbmNyZW1lbnQgKGFuZCBzdGVwIG92ZXIpIGFuCi0gICBpbmxpbmUgY291bnRlci4gICovCi0KLSNkZWZpbmUgQlJfVEFCX05BTUUJIl9fQlJBTkNIX1RBQkxFX18iCi0vKiBOYW1lIG9mIHRoZSB0YWJsZSBvZiBwb2ludGVycyB0byBicmFuY2hlcy4gIEEgbG9jYWwgKGkuZS4sCi0gICBub24tZXh0ZXJuYWwpIHN5bWJvbC4gICovCi0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2JlZ2luOiAgT25lLXRpbWUgaW5pdGlhbGl6YXRpb24uCi0KLSAgCVNldCB1cCBoYXNoIHRhYmxlcy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGludCBpOwkJCS8qIExvb3AgY291bnRlciAqLwotICBjb25zdCBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwkvKiBQb2ludGVyIGludG8gb3Bjb2RlIHRhYmxlICovCi0gIGNvbnN0IGNoYXIgKnJldHZhbDsJCS8qIFZhbHVlIHJldHVybmVkIGJ5IGhhc2ggZnVuY3Rpb25zICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotICByZWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotICBhcmVnX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBiYXNlIGFzc2VtYmxlciB1c2VzIGFuIGVtcHR5IHN0cmluZyBmb3IgIm5vCi0gICAgIGVycm9yIG1lc3NhZ2UiLCBpbnN0ZWFkIG9mIGEgTlVMTCBwb2ludGVyLiAgKi8KLSAgcmV0dmFsID0gMDsKLQotICBmb3IgKG9QID0gaTk2MF9vcGNvZGVzOyBvUC0+bmFtZSAmJiAhcmV0dmFsOyBvUCsrKQotICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBvUC0+bmFtZSwgKFBUUikgb1ApOwotCi0gIGZvciAoaSA9IDA7IHJlZ25hbWVzW2ldLnJlZ19uYW1lICYmICFyZXR2YWw7IGkrKykKLSAgICByZXR2YWwgPSBoYXNoX2luc2VydCAocmVnX2hhc2gsIHJlZ25hbWVzW2ldLnJlZ19uYW1lLAotCQkJICAoY2hhciAqKSAmcmVnbmFtZXNbaV0ucmVnX251bSk7Ci0KLSAgZm9yIChpID0gMDsgYXJlZ3NbaV0uYXJlZ19uYW1lICYmICFyZXR2YWw7IGkrKykKLSAgICByZXR2YWwgPSBoYXNoX2luc2VydCAoYXJlZ19oYXNoLCBhcmVnc1tpXS5hcmVnX25hbWUsCi0JCQkgIChjaGFyICopICZhcmVnc1tpXS5hcmVnX251bSk7Ci0KLSAgaWYgKHJldHZhbCkKLSAgICBhc19mYXRhbCAoXygiSGFzaGluZyByZXR1cm5lZCBcIiVzXCIuIiksIHJldHZhbCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfYXNzZW1ibGU6ICBBc3NlbWJsZSBhbiBpbnN0cnVjdGlvbgotCi0gICBBc3N1bXB0aW9ucyBhYm91dCB0aGUgcGFzc2VkLWluIHRleHQ6Ci0gIAktIGFsbCBjb21tZW50cywgbGFiZWxzIHJlbW92ZWQKLSAgCS0gdGV4dCBpcyBhbiBpbnN0cnVjdGlvbgotICAJLSBhbGwgd2hpdGUgc3BhY2UgY29tcHJlc3NlZCB0byBzaW5nbGUgYmxhbmtzCi0gIAktIGFsbCBjaGFyYWN0ZXIgY29uc3RhbnRzIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGRlY2ltYWwKLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX2Fzc2VtYmxlICh0ZXh0UCkKLSAgICAgY2hhciAqdGV4dFA7CQkvKiBTb3VyY2UgdGV4dCBvZiBpbnN0cnVjdGlvbiAqLwotewotICAvKiBQYXJzZWQgaW5zdHJ1Y3Rpb24gdGV4dCwgY29udGFpbmluZyBOTyB3aGl0ZXNwYWNlOiBhcmdbMF0tPm9wY29kZQotICAgICBtbmVtb25pYyBhcmdbMS0zXS0+b3BlcmFuZHMsIHdpdGggY2hhciBjb25zdGFudHMgcmVwbGFjZWQgYnkKLSAgICAgZGVjaW1hbCBudW1iZXJzLiAgKi8KLSAgY2hhciAqYXJnc1s0XTsKLQotICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIGluc3RydWN0aW9uIG9wZXJhbmRzICovCi0gIC8qIFBvaW50ZXIgdG8gaW5zdHJ1Y3Rpb24gZGVzY3JpcHRpb24gKi8KLSAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsKLSAgLyogVFJVRSBpZmYgb3Bjb2RlIG1uZW1vbmljIGluY2x1ZGVkIGJyYW5jaC1wcmVkaWN0aW9uIHN1ZmZpeCAoIi5mIgotICAgICBvciAiLnQiKS4gICovCi0gIGludCBicmFuY2hfcHJlZGljdDsKLSAgLyogU2V0dGluZyBvZiBicmFuY2gtcHJlZGljdGlvbiBiaXQocykgdG8gYmUgT1InZCBpbnRvIGluc3RydWN0aW9uCi0gICAgIG9wY29kZSBvZiBDVFJML0NPQlIgZm9ybWF0IGluc3RydWN0aW9ucy4gICovCi0gIGxvbmcgYnBfYml0czsKLQotICBpbnQgbjsJCQkvKiBPZmZzZXQgb2YgbGFzdCBjaGFyYWN0ZXIgaW4gb3Bjb2RlIG1uZW1vbmljICovCi0KLSAgY29uc3QgY2hhciAqYnBfZXJyb3JfbXNnID0gXygiYnJhbmNoIHByZWRpY3Rpb24gaW52YWxpZCBvbiB0aGlzIG9wY29kZSIpOwotCi0KLSAgLyogUGFyc2UgaW5zdHJ1Y3Rpb24gaW50byBvcGNvZGUgYW5kIG9wZXJhbmRzICovCi0gIG1lbXNldCAoYXJncywgJ1wwJywgc2l6ZW9mIChhcmdzKSk7Ci0gIG5fb3BzID0gaV9zY2FuICh0ZXh0UCwgYXJncyk7Ci0gIGlmIChuX29wcyA9PSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm47CQkJLyogRXJyb3IgbWVzc2FnZSBhbHJlYWR5IGlzc3VlZCAqLwotICAgIH0KLQotICAvKiBEbyAibWFjcm8gc3Vic3RpdHV0aW9uIiAoc29ydCBvZikgb24gJ2xkY29uc3QnIHBzZXVkby1pbnN0cnVjdGlvbiAqLwotICBpZiAoIXN0cmNtcCAoYXJnc1swXSwgImxkY29uc3QiKSkKLSAgICB7Ci0gICAgICBuX29wcyA9IHBhcnNlX2xkY29uc3QgKGFyZ3MpOwotICAgICAgaWYgKG5fb3BzID09IC0xKQotCXsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0KLQotICAvKiBDaGVjayBmb3IgYnJhbmNoLXByZWRpY3Rpb24gc3VmZml4IG9uIG9wY29kZSBtbmVtb25pYywgc3RyaXAgaXQgb2ZmICovCi0gIG4gPSBzdHJsZW4gKGFyZ3NbMF0pIC0gMTsKLSAgYnJhbmNoX3ByZWRpY3QgPSAwOwotICBicF9iaXRzID0gMDsKLSAgaWYgKGFyZ3NbMF1bbiAtIDFdID09ICcuJyAmJiAoYXJnc1swXVtuXSA9PSAndCcgfHwgYXJnc1swXVtuXSA9PSAnZicpKQotICAgIHsKLSAgICAgIC8qIFdlIGNvdWxkIGNoZWNrIGhlcmUgdG8gc2VlIGlmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCi0JIHN1cHBvcnRzIGJyYW5jaCBwcmVkaWN0aW9uLCBidXQgd2h5IGJvdGhlcj8gIFRoZSBiaXQgd2lsbAotCSBqdXN0IGJlIGlnbm9yZWQgYnkgcHJvY2Vzc29ycyB0aGF0IGRvbid0IHVzZSBpdC4gICovCi0gICAgICBicmFuY2hfcHJlZGljdCA9IDE7Ci0gICAgICBicF9iaXRzID0gKGFyZ3NbMF1bbl0gPT0gJ3QnKSA/IEJQX1RBS0VOIDogQlBfTk9UX1RBS0VOOwotICAgICAgYXJnc1swXVtuIC0gMV0gPSAnXDAnOwkvKiBTdHJpcCBzdWZmaXggZnJvbSBvcGNvZGUgbW5lbW9uaWMgKi8KLSAgICB9Ci0KLSAgLyogTG9vayB1cCBvcGNvZGUgbW5lbW9uaWMgaW4gdGFibGUgYW5kIGNoZWNrIG51bWJlciBvZiBvcGVyYW5kcy4KLSAgICAgQ2hlY2sgdGhhdCBvcGNvZGUgaXMgbGVnYWwgZm9yIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAgSWYgYWxsCi0gICAgIGxvb2tzIGdvb2QsIGFzc2VtYmxlIGluc3RydWN0aW9uLiAgKi8KLSAgb1AgPSAoc3RydWN0IGk5NjBfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgYXJnc1swXSk7Ci0gIGlmICghb1AgfHwgIXRhcmdfaGFzX2ljbGFzcyAob1AtPmljbGFzcykpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbnZhbGlkIG9wY29kZSwgXCIlc1wiLiIpLCBhcmdzWzBdKTsKLQotICAgIH0KLSAgZWxzZSBpZiAobl9vcHMgIT0gb1AtPm51bV9vcHMpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJpbXByb3BlciBudW1iZXIgb2Ygb3BlcmFuZHMuICBleHBlY3RpbmcgJWQsIGdvdCAlZCIpLAotCSAgICAgIG9QLT5udW1fb3BzLCBuX29wcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChvUC0+Zm9ybWF0KQotCXsKLQljYXNlIEZCUkE6Ci0JY2FzZSBDVFJMOgotCSAgY3RybF9mbXQgKGFyZ3NbMV0sIG9QLT5vcGNvZGUgfCBicF9iaXRzLCBvUC0+bnVtX29wcyk7Ci0JICBpZiAob1AtPmZvcm1hdCA9PSBGQlJBKQotCSAgICB7Ci0JICAgICAgLyogTm93IGdlbmVyYXRlIGEgJ2JubycgdG8gc2FtZSBhcmcgKi8KLQkgICAgICBjdHJsX2ZtdCAoYXJnc1sxXSwgQk5PIHwgYnBfYml0cywgMSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ09CUjoKLQljYXNlIENPSjoKLQkgIGNvYnJfZm10IChhcmdzLCBvUC0+b3Bjb2RlIHwgYnBfYml0cywgb1ApOwotCSAgYnJlYWs7Ci0JY2FzZSBSRUc6Ci0JICBpZiAoYnJhbmNoX3ByZWRpY3QpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChicF9lcnJvcl9tc2cpOwotCSAgICB9Ci0JICByZWdfZm10IChhcmdzLCBvUCk7Ci0JICBicmVhazsKLQljYXNlIE1FTTE6Ci0JICBpZiAoYXJnc1swXVswXSA9PSAnYycgJiYgYXJnc1swXVsxXSA9PSAnYScpCi0JICAgIHsKLQkgICAgICBpZiAoYnJhbmNoX3ByZWRpY3QpCi0JCXsKLQkJICBhc193YXJuIChicF9lcnJvcl9tc2cpOwotCQl9Ci0JICAgICAgbWVtX2ZtdCAoYXJncywgb1AsIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JY2FzZSBNRU0yOgotCWNhc2UgTUVNNDoKLQljYXNlIE1FTTg6Ci0JY2FzZSBNRU0xMjoKLQljYXNlIE1FTTE2OgotCSAgaWYgKGJyYW5jaF9wcmVkaWN0KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoYnBfZXJyb3JfbXNnKTsKLQkgICAgfQotCSAgbWVtX2ZtdCAoYXJncywgb1AsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSBDQUxMSjoKLQkgIGlmIChicmFuY2hfcHJlZGljdCkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKGJwX2Vycm9yX21zZyk7Ci0JICAgIH0KLQkgIC8qIE91dHB1dCBvcGNvZGUgJiBzZXQgdXAgImZpeHVwIiAocmVsb2NhdGlvbik7IGZsYWcKLQkgICAgIHJlbG9jYXRpb24gYXMgJ2NhbGxqJyB0eXBlLiAgKi8KLQkgIGtub3cgKG9QLT5udW1fb3BzID09IDEpOwotCSAgZ2V0X2NkaXNwIChhcmdzWzFdLCAiQ1RSTCIsIG9QLT5vcGNvZGUsIDI0LCAwLCAxKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAob1AtPmZvcm1hdCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQkJCQkvKiBtZF9hc3NlbWJsZSgpICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfbnVtYmVyX3RvX2NoYXJzOiAgY29udmVydCBhIG51bWJlciB0byB0YXJnZXQgYnl0ZSBvcmRlcgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsdWUsIG4pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX2NoYXJzX3RvX251bWJlcjogIGNvbnZlcnQgZnJvbSB0YXJnZXQgYnl0ZSBvcmRlciB0byBob3N0IGJ5dGUgb3JkZXIuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1pbnQKLW1kX2NoYXJzX3RvX251bWJlciAodmFsLCBuKQotICAgICB1bnNpZ25lZCBjaGFyICp2YWw7CS8qIFZhbHVlIGluIHRhcmdldCBieXRlIG9yZGVyICovCi0gICAgIGludCBuOwkJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgaW5wdXQgKi8KLXsKLSAgaW50IHJldHZhbDsKLQotICBmb3IgKHJldHZhbCA9IDA7IG4tLTspCi0gICAgewotICAgICAgcmV0dmFsIDw8PSA4OwotICAgICAgcmV0dmFsIHw9IHZhbFtuXTsKLSAgICB9Ci0gIHJldHVybiByZXR2YWw7Ci19Ci0KLQotI2RlZmluZSBNQVhfTElUVExFTlVNUwk2Ci0jZGVmaW5lIExOVU1fU0laRQlzaXplb2YoTElUVExFTlVNX1RZUEUpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfYXRvZjoJY29udmVydCBhc2NpaSB0byBmbG9hdGluZyBwb2ludAotCi0gICBUdXJuIGEgc3RyaW5nIGF0IGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgJ3R5cGUnLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGF0ICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHJldHVybmVkIGF0ICdzaXplUCcuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBhIHBvaW50ZXIKLSAgIHRvIGFuIGVtcHR5IG1lc3NhZ2UgaWYgT0suCi0KLSAgIE5vdGUgd2UgY2FsbCB0aGUgaTM4NiBmbG9hdGluZyBwb2ludCByb3V0aW5lLCByYXRoZXIgdGhhbiBjb21wbGljYXRpbmcKLSAgIHRoaW5ncyB3aXRoIG1vcmUgZmlsZXMgb3Igc3ltYm9saWMgbGlua3MuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGludCBwcmVjOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICBjYXNlICdUJzoKLSAgICAgIHByZWMgPSA1OwotICAgICAgdHlwZSA9ICd4JzsJCS8qIFRoYXQncyB3aGF0IGF0b2ZfaWVlZSgpIHVuZGVyc3RhbmRzICovCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIG1kX2F0b2YoKSIpOwotICAgIH0KLQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLSAgICB9Ci0KLSAgKnNpemVQID0gcHJlYyAqIExOVU1fU0laRTsKLQotICAvKiBPdXRwdXQgdGhlIExJVFRMRU5VTXMgaW4gUkVWRVJTRSBvcmRlciBpbiBhY2NvcmQgd2l0aCBpODA5NjAKLSAgICAgd29yZC1vcmRlci4gIChEdW5ubyB3aHkgYXRvZl9pZWVlIGRvZXNuJ3QgZG8gaXQgaW4gdGhlIHJpZ2h0Ci0gICAgIG9yZGVyIGluIHRoZSBmaXJzdCBwbGFjZSAtLSBwcm9iYWJseSBiZWNhdXNlIGl0J3MgYSBoYWNrIG9mCi0gICAgIGF0b2ZfbTY4ay4pICAqLwotCi0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWMgLSAxOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKGxvbmcpICgqd29yZFAtLSksIExOVU1fU0laRSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1kX251bWJlcl90b19pbW0KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbik7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9udW1iZXJfdG9fZGlzcAotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotdm9pZAotbWRfbnVtYmVyX3RvX2Rpc3AgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfbnVtYmVyX3RvX2ZpZWxkOgotCi0gIAlTdGljayBhIHZhbHVlIChhbiBhZGRyZXNzIGZpeHVwKSBpbnRvIGEgYml0IGZpZWxkIG9mCi0gIAlwcmV2aW91c2x5LWdlbmVyYXRlZCBpbnN0cnVjdGlvbi4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLW1kX251bWJlcl90b19maWVsZCAoaW5zdHJQLCB2YWwsIGJmaXhQKQotICAgICBjaGFyICppbnN0clA7CQkvKiBQb2ludGVyIHRvIGluc3RydWN0aW9uIHRvIGJlIGZpeGVkICovCi0gICAgIGxvbmcgdmFsOwkJCS8qIEFkZHJlc3MgZml4dXAgdmFsdWUgKi8KLSAgICAgYml0X2ZpeFMgKmJmaXhQOwkJLyogRGVzY3JpcHRpb24gb2YgYml0IGZpZWxkIHRvIGJlIGZpeGVkIHVwICovCi17Ci0gIGludCBudW1iaXRzOwkJCS8qIExlbmd0aCBvZiBiaXQgZmllbGQgdG8gYmUgZml4ZWQgKi8KLSAgbG9uZyBpbnN0cjsJCQkvKiAzMi1iaXQgaW5zdHJ1Y3Rpb24gdG8gYmUgZml4ZWQtdXAgKi8KLSAgbG9uZyBzaWduOwkJCS8qIDAgb3IgLTEsIGFjY29yZGluZyB0byBzaWduIGJpdCBvZiAndmFsJyAqLwotCi0gIC8qIENvbnZlcnQgaW5zdHJ1Y3Rpb24gYmFjayB0byBob3N0IGJ5dGUgb3JkZXIuICAqLwotICBpbnN0ciA9IG1kX2NoYXJzX3RvX251bWJlciAoaW5zdHJQLCA0KTsKLQotICAvKiBTdXJwcmlzZSEgLS0gd2Ugc3RvcmVkIHRoZSBudW1iZXIgb2YgYml0cyB0byBiZSBtb2RpZmllZCByYXRoZXIKLSAgICAgdGhhbiBhIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUuICAqLwotICBudW1iaXRzID0gKGludCkgYmZpeFA7Ci0gIGlmIChudW1iaXRzID09IDEpCi0gICAgewotICAgICAgLyogVGhpcyBpcyBhIG5vLW9wLCBzdHVjayBoZXJlIGJ5IHJlbG9jX2NhbGxqKCkgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAga25vdyAoKG51bWJpdHMgPT0gMTMpIHx8IChudW1iaXRzID09IDI0KSk7Ci0KLSAgLyogUHJvcGFnYXRlIHNpZ24gYml0IG9mICd2YWwnIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJpdHMuICBSZXN1bHQKLSAgICAgc2hvdWxkIGJlIGFsbCAwIG9yIGFsbCAxLiAgKi8KLSAgc2lnbiA9IHZhbCA+PiAoKGludCkgbnVtYml0cyAtIDEpOwotICBpZiAoKCh2YWwgPCAwKSAmJiAoc2lnbiAhPSAtMSkpCi0gICAgICB8fCAoKHZhbCA+IDApICYmIChzaWduICE9IDApKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkZpeHVwIG9mICVsZCB0b28gbGFyZ2UgZm9yIGZpZWxkIHdpZHRoIG9mICVkIiksCi0JICAgICAgdmFsLCBudW1iaXRzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQdXQgYml0IGZpZWxkIGludG8gaW5zdHJ1Y3Rpb24gYW5kIHdyaXRlIGJhY2sgaW4gdGFyZ2V0Ci0gICAgICAgICAqIGJ5dGUgb3JkZXIuCi0gICAgICAgKi8KLSAgICAgIHZhbCAmPSB+KC0xIDw8IChpbnQpIG51bWJpdHMpOwkvKiBDbGVhciB1bnVzZWQgc2lnbiBiaXRzICovCi0gICAgICBpbnN0ciB8PSB2YWw7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGluc3RyUCwgaW5zdHIsIDQpOwotICAgIH0KLX0JCQkJLyogbWRfbnVtYmVyX3RvX2ZpZWxkKCkgKi8KLQwKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBtZF9wYXJzZV9vcHRpb24KLSAgCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gIAlTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBGb3IgdGhlIDk2MCwgdGhlc2UgYXJlOgotCi0gIAktbm9yZWxheDoKLSAgCQlDb25kaXRpb25hbCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSBkaXNwbGFjZW1lbnRzCi0gIAkJZ3JlYXRlciB0aGFuIDEzIGJpdHMgKG9yIHRoYXQgaGF2ZSBleHRlcm5hbCB0YXJnZXRzKSBzaG91bGQKLSAgCQlnZW5lcmF0ZSBlcnJvcnMuICBUaGUgZGVmYXVsdCBpcyB0byByZXBsYWNlIGVhY2ggc3VjaAotICAJCWluc3RydWN0aW9uIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSAob3IgY2hrYml0KSBhbmQKLSAgCQlicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgTm90ZSB0aGF0IHRoZSBJbnRlbCAiaiIgY29iciBkaXJlY3RpdmVzCi0gIAkJYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpbiB0aGlzIHdheSB3aGVuIG5lY2Vzc2FyeSwKLSAgCQlyZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIHRoaXMgb3B0aW9uLgotCi0gIAktYjoKLSAgCQlBZGQgY29kZSB0byBjb2xsZWN0IGluZm9ybWF0aW9uIGFib3V0IGJyYW5jaGVzIHRha2VuLCBmb3IKLSAgCQlsYXRlciBvcHRpbWl6YXRpb24gb2YgYnJhbmNoIHByZWRpY3Rpb24gYml0cyBieSBhIHNlcGFyYXRlCi0gIAkJdG9vbC4gIENPQlIgYW5kIENOVEwgZm9ybWF0IGluc3RydWN0aW9ucyBoYXZlIGJyYW5jaAotICAJCXByZWRpY3Rpb24gYml0cyAoaW4gdGhlIENYIGFyY2hpdGVjdHVyZSk7ICBpZiAiQlIiIHJlcHJlc2VudHMKLSAgCQlhbiBpbnN0cnVjdGlvbiBpbiBvbmUgb2YgdGhlc2UgY2xhc3NlcywgdGhlIGZvbGxvd2luZyByZXAtCi0gIAkJcmVzZW50cyB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlcjoKLQotICAJCQljYWxsCTxpbmNyZW1lbnQgcm91dGluZT4KLSAgCQkJLndvcmQJMAkjIHByZS1jb3VudGVyCi0gIAkJTGFiZWw6ICBCUgotICAJCQljYWxsCTxpbmNyZW1lbnQgcm91dGluZT4KLSAgCQkJLndvcmQJMAkjIHBvc3QtY291bnRlcgotCi0gIAkJQSB0YWJsZSBvZiBhbGwgc3VjaCAiTGFiZWxzIiBpcyBhbHNvIGdlbmVyYXRlZC4KLQotCi0gIAktQUtBLCAtQUtCLCAtQUtDLCAtQVNBLCAtQVNCLCAtQU1DLCAtQUNBOgotICAJCVNlbGVjdCB0aGUgODA5NjAgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdAotICAJCXN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsIGVycm9ycy4KLSAgCQlUaGUgZGVmYXVsdCBpcyB0byBnZW5lcmF0ZSBjb2RlIGZvciBhbnkgaW5zdHJ1Y3Rpb24gb3IgZmVhdHVyZQotICAJCXRoYXQgaXMgc3VwcG9ydGVkIGJ5IFNPTUUgdmVyc2lvbiBvZiB0aGUgOTYwIChldmVuIGlmIHRoaXMKLSAgCQltZWFucyBtaXhpbmcgYXJjaGl0ZWN0dXJlcyEpLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJBOmIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0KLXsKLSNkZWZpbmUgT1BUSU9OX0xJTktSRUxBWCAoT1BUSU9OX01EX0JBU0UpCi0gIHsibGlua3JlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MSU5LUkVMQVh9LAotICB7ImxpbmstcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJTktSRUxBWH0sCi0jZGVmaW5lIE9QVElPTl9OT1JFTEFYIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsibm9yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9SRUxBWH0sCi0gIHsibm8tcmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PUkVMQVh9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgKG1kX2xvbmdvcHRzKTsKLQotc3RydWN0IHRhYmVudHJ5Ci0gIHsKLSAgICBjaGFyICpmbGFnOwotICAgIGludCBhcmNoOwotICB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCB0YWJlbnRyeSBhcmNoX3RhYltdID0KLXsKLSAgeyJLQSIsIEFSQ0hfS0F9LAotICB7IktCIiwgQVJDSF9LQn0sCi0gIHsiU0EiLCBBUkNIX0tBfSwJCS8qIFN5bm9ueW0gZm9yIEtBICovCi0gIHsiU0IiLCBBUkNIX0tCfSwJCS8qIFN5bm9ueW0gZm9yIEtCICovCi0gIHsiS0MiLCBBUkNIX01DfSwJCS8qIFN5bm9ueW0gZm9yIE1DICovCi0gIHsiTUMiLCBBUkNIX01DfSwKLSAgeyJDQSIsIEFSQ0hfQ0F9LAotICB7IkpYIiwgQVJDSF9KWH0sCi0gIHsiSFgiLCBBUkNIX0hYfSwKLSAge05VTEwsIDB9Ci19OwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgT1BUSU9OX0xJTktSRUxBWDoKLSAgICAgIGxpbmtyZWxheCA9IDE7Ci0gICAgICBmbGFnX2tlZXBfbG9jYWxzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9SRUxBWDoKLSAgICAgIG5vcmVsYXggPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdiJzoKLSAgICAgIGluc3RydW1lbnRfYnJhbmNoZXMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdBJzoKLSAgICAgIHsKLQljb25zdCBzdHJ1Y3QgdGFiZW50cnkgKnRwOwotCWNoYXIgKnAgPSBhcmc7Ci0KLQlmb3IgKHRwID0gYXJjaF90YWI7IHRwLT5mbGFnICE9IE5VTEw7IHRwKyspCi0JICBpZiAoIXN0cmNtcCAocCwgdHAtPmZsYWcpKQotCSAgICBicmVhazsKLQotCWlmICh0cC0+ZmxhZyA9PSBOVUxMKQotCSAgewotCSAgICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlICVzIiksIHApOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQllbHNlCi0JICBhcmNoaXRlY3R1cmUgPSB0cC0+YXJjaDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGludCBpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIkk5NjAgb3B0aW9uczpcbiIpKTsKLSAgZm9yIChpID0gMDsgYXJjaF90YWJbaV0uZmxhZzsgaSsrKQotICAgIGZwcmludGYgKHN0cmVhbSwgIiVzLUElcyIsIGkgPyAiIHwgIiA6ICIiLCBhcmNoX3RhYltpXS5mbGFnKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcblwKLQkJCXNwZWNpZnkgdmFyaWFudCBvZiA5NjAgYXJjaGl0ZWN0dXJlXG5cCi0tYgkJCWFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlblxuXAotLWxpbmstcmVsYXgJCXByZXNlcnZlIGluZGl2aWR1YWwgYWxpZ25tZW50IGRpcmVjdGl2ZXMgc28gbGlua2VyXG5cCi0JCQljYW4gZG8gcmVsYXhpbmcgKGIub3V0IGZvcm1hdCBvbmx5KVxuXAotLW5vLXJlbGF4CQlkb24ndCBhbHRlciBjb21wYXJlLWFuZC1icmFuY2ggaW5zdHJ1Y3Rpb25zIGZvclxuXAotCQkJbG9uZyBkaXNwbGFjZW1lbnRzXG4iKSk7Ci19Ci0MCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfY29udmVydF9mcmFnOgotICAJQ2FsbGVkIGJ5IGJhc2UgYXNzZW1ibGVyIGFmdGVyIGFkZHJlc3MgcmVsYXhhdGlvbiBpcyBmaW5pc2hlZDogIG1vZGlmeQotICAJdmFyaWFibGUgZnJhZ21lbnRzIGFjY29yZGluZyB0byBob3cgbXVjaCByZWxheGF0aW9uIHdhcyBkb25lLgotCi0gIAlJZiB0aGUgZnJhZ21lbnQgc3Vic3RhdGUgaXMgc3RpbGwgMSwgYSAxMy1iaXQgZGlzcGxhY2VtZW50IHdhcyBlbm91Z2gKLSAgCXRvIHJlYWNoIHRoZSBzeW1ib2wgaW4gcXVlc3Rpb24uICBTZXQgdXAgYW4gYWRkcmVzcyBmaXh1cCwgYnV0IG90aGVyd2lzZQotICAJbGVhdmUgdGhlIGNvYnIgaW5zdHJ1Y3Rpb24gYWxvbmUuCi0KLSAgCUlmIHRoZSBmcmFnbWVudCBzdWJzdGF0ZSBpcyAyLCBhIDEzLWJpdCBkaXNwbGFjZW1lbnQgd2FzIG5vdCBlbm91Z2guCi0gIAlSZXBsYWNlIHRoZSBjb2JyIHdpdGggYSB0d28gaW5zdHJ1Y3Rpb25zIChhIGNvbXBhcmUgYW5kIGEgYnJhbmNoKS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbHNlCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ1ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLSNlbmRpZgotewotICBmaXhTICpmaXhQOwkJCS8qIFN0cnVjdHVyZSBkZXNjcmliaW5nIG5lZWRlZCBhZGRyZXNzIGZpeCAqLwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIC8qIExFQVZFIFNJTkdMRSBDT0JSIElOU1RSVUNUSU9OICovCi0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsCi0JCSAgICAgIGZyYWdQLT5mcl9vcGNvZGUgLSBmcmFnUC0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgNCwKLQkJICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkJICAgICAgMSwKLQkJICAgICAgTk9fUkVMT0MpOwotCi0gICAgICBmaXhQLT5meF9iaXRfZml4UCA9IChiaXRfZml4UyAqKSAxMzsJLyogc2l6ZSBvZiBiaXQgZmllbGQgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIC8qIFJFUExBQ0UgQ09CUiBXSVRIIENPTVBBUkUvQlJBTkNIIElOU1RSVUNUSU9OUyAqLwotICAgICAgcmVsYXhfY29iciAoZnJhZ1ApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEJBRF9DQVNFIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXg6ICBIb3cgbXVjaCBkb2VzIGl0IGxvb2sgbGlrZSAqZnJhZ1Agd2lsbCBncm93PwotCi0gIAlDYWxsZWQgYnkgYmFzZSBhc3NlbWJsZXIganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLgotICAJUmV0dXJuIHRoZSBhbW91bnQgYnkgd2hpY2ggdGhlIGZyYWdtZW50IHdpbGwgZ3Jvdy4KLQotICAJQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQ7IGNvYnIncwotICAJYmFzZWQgb24gdW5kZWZpbmVkIHN5bWJvbHMgd2lsbCBoYXZlIHRvIGJlIHJlcGxhY2VkIHdpdGggYSBjb21wYXJlCi0gIAlpbnN0cnVjdGlvbiBhbmQgYSBicmFuY2ggaW5zdHJ1Y3Rpb24sIGFuZCB0aGUgY29kZSBmcmFnbWVudCB3aWxsIGdyb3cKLSAgCWJ5IDQgYnl0ZXMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICAvKiBJZiBzeW1ib2wgaXMgdW5kZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgZ28gdG8gInJlbGF4ZWQiIHN0YXRlCi0gICAgIChjb21wYXJlIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zIGluc3RlYWQgb2YgY29icikgcmlnaHQgbm93LiAgKi8KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnRfdHlwZSkKLSAgICB7Ci0gICAgICByZWxheF9jb2JyIChmcmFnUCk7Ci0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0gIHJldHVybiAwOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0KLSNpZiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWRfcmlfdG9fY2hhcnM6Ci0gIAlUaGlzIHJvdXRpbmUgZXhpc3RzIGluIG9yZGVyIHRvIG92ZXJjb21lIG1hY2hpbmUgYnl0ZS1vcmRlciBwcm9ibGVtcwotICAJd2hlbiBkZWFsaW5nIHdpdGggYml0LWZpZWxkIGVudHJpZXMgaW4gdGhlIHJlbG9jYXRpb25faW5mbyBzdHJ1Y3QuCi0KLSAgCUJ1dCByZWxvY2F0aW9uIGluZm8gd2lsbCBiZSB1c2VkIG9uIHRoZSBob3N0IG1hY2hpbmUgb25seSAob25seQotICAJZXhlY3V0YWJsZSBjb2RlIGlzIGFjdHVhbGx5IGRvd25sb2FkZWQgdG8gdGhlIGk4MDk2MCkuICBUaGVyZWZvcmUsCi0gIAl3ZSBsZWF2ZSBpdCBpbiBob3N0IGJ5dGUgb3JkZXIuCi0KLSAgCVRoZSBhYm92ZSBjb21tZW50IGlzIG5vIGxvbmdlciB0cnVlLiAgVGhpcyByb3V0aW5lIG5vdyByZWFsbHkKLSAgCWRvZXMgZG8gdGhlIHJlb3JkZXJpbmcgKElhbiBUYXlsb3IgMjggQXVnIDkyKS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLQotc3RhdGljIHZvaWQKLW1kX3JpX3RvX2NoYXJzICh3aGVyZSwgcmkpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvICpyaTsKLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwgcmktPnJfYWRkcmVzcywKLQkJICAgICAgc2l6ZW9mIChyaS0+cl9hZGRyZXNzKSk7Ci0gIHdoZXJlWzRdID0gcmktPnJfaW5kZXggJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocmktPnJfaW5kZXggPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSAocmktPnJfaW5kZXggPj4gMTYpICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKChyaS0+cl9wY3JlbCA8PCAwKQotCSAgICAgIHwgKHJpLT5yX2xlbmd0aCA8PCAxKQotCSAgICAgIHwgKHJpLT5yX2V4dGVybiA8PCAzKQotCSAgICAgIHwgKHJpLT5yX2JzciA8PCA0KQotCSAgICAgIHwgKHJpLT5yX2Rpc3AgPDwgNSkKLQkgICAgICB8IChyaS0+cl9jYWxsaiA8PCA2KSk7Ci19Ci0KLSNlbmRpZiAvKiBkZWZpbmVkKE9CSl9BT1VUKSB8IGRlZmluZWQoT0JKX0JPVVQpICovCi0KLQwKLS8qIEZPTExPV0lORyBBUkUgVEhFIExPQ0FMIFJPVVRJTkVTLCBJTiBBTFBIQUJFVElDQUwgT1JERVIgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgYnJjbnRfZW1pdDoJRW1pdCBjb2RlIHRvIGluY3JlbWVudCBpbmxpbmUgYnJhbmNoIGNvdW50ZXIuCi0KLSAgCVNlZSB0aGUgY29tbWVudHMgYWJvdmUgdGhlIGRlY2xhcmF0aW9uIG9mICdicl9jbnQnIGZvciBkZXRhaWxzIG9uCi0gIAlicmFuY2gtcHJlZGljdGlvbiBpbnN0cnVtZW50YXRpb24uCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLWJyY250X2VtaXQgKCkKLXsKLSAgY3RybF9mbXQgKEJSX0NOVF9GVU5DLCBDQUxMLCAxKTsJLyogRW1pdCBjYWxsIHRvICJpbmNyZW1lbnQiIHJvdXRpbmUgKi8KLSAgZW1pdCAoMCk7CQkJLyogRW1pdCBpbmxpbmUgY291bnRlciB0byBiZSBpbmNyZW1lbnRlZCAqLwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGJybGFiX25leHQ6CWdlbmVyYXRlIHRoZSBuZXh0IGJyYW5jaCBsb2NhbCBsYWJlbAotCi0gIAlTZWUgdGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBkZWNsYXJhdGlvbiBvZiAnYnJfY250JyBmb3IgZGV0YWlscyBvbgotICAJYnJhbmNoLXByZWRpY3Rpb24gaW5zdHJ1bWVudGF0aW9uLgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBjaGFyICoKLWJybGFiX25leHQgKCkKLXsKLSAgc3RhdGljIGNoYXIgYnVmWzIwXTsKLQotICBzcHJpbnRmIChidWYsICIlcyVkIiwgQlJfTEFCRUxfQkFTRSwgYnJfY250KyspOwotICByZXR1cm4gYnVmOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGJydGFiX2VtaXQ6CWdlbmVyYXRlIHRoZSBmZXRjaC1wcmVkaWN0aW9uIGJyYW5jaCB0YWJsZS4KLQotICAJU2VlIHRoZSBjb21tZW50cyBhYm92ZSB0aGUgZGVjbGFyYXRpb24gb2YgJ2JyX2NudCcgZm9yIGRldGFpbHMgb24KLSAgCWJyYW5jaC1wcmVkaWN0aW9uIGluc3RydW1lbnRhdGlvbi4KLQotICAJVGhlIGNvZGUgZW1pdHRlZCBoZXJlIHdvdWxkIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcKLSAgCWV4YW1wbGUgYXNzZW1ibGVyIHNvdXJjZS4KLQotICAJCQkuZGF0YQotICAJCQkuYWxpZ24JMgotICAJICAgQlJfVEFCX05BTUU6Ci0gIAkJCS53b3JkCTAJCSMgbGluayB0byBuZXh0IHRhYmxlCi0gIAkJCS53b3JkCTMJCSMgbGVuZ3RoIG9mIHRhYmxlCi0gIAkJCS53b3JkCUxCUkFOQ0gwCSMgMXN0IGVudHJ5IGluIHRhYmxlIHByb3BlcgotICAJCQkud29yZAlMQlJBTkNIMQotICAJCQkud29yZAlMQlJBTkNIMgotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi12b2lkCi1icnRhYl9lbWl0ICgpCi17Ci0gIGludCBpOwotICBjaGFyIGJ1ZlsyMF07Ci0gIGNoYXIgKnA7CQkJLyogV2hlcmUgdGhlIGJpbmFyeSB3YXMgb3V0cHV0IHRvICovCi0gIC8qIFBvaW50ZXIgdG8gZGVzY3JpcHRpb24gb2YgZGVmZXJyZWQgYWRkcmVzcyBmaXh1cC4gICovCi0gIGZpeFMgKmZpeFA7Ci0KLSAgaWYgKCFpbnN0cnVtZW50X2JyYW5jaGVzKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAwKTsJLyogICAgICAuZGF0YSAqLwotICBmcmFnX2FsaWduICgyLCAwLCAwKTsJCS8qICAgICAgLmFsaWduIDIgKi8KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0gIGNvbG9uIChCUl9UQUJfTkFNRSk7CQkvKiBCUl9UQUJfTkFNRTogKi8KLSAgZW1pdCAoMCk7CQkJLyogICAgICAud29yZCAwICNsaW5rIHRvIG5leHQgdGFibGUgKi8KLSAgZW1pdCAoYnJfY250KTsJCS8qICAgICAgLndvcmQgbiAjbGVuZ3RoIG9mIHRhYmxlICovCi0KLSAgZm9yIChpID0gMDsgaSA8IGJyX2NudDsgaSsrKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzJWQiLCBCUl9MQUJFTF9CQVNFLCBpKTsKLSAgICAgIHAgPSBlbWl0ICgwKTsKLSAgICAgIGZpeFAgPSBmaXhfbmV3IChmcmFnX25vdywKLQkJICAgICAgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkgICAgICA0LAotCQkgICAgICBzeW1ib2xfZmluZCAoYnVmKSwKLQkJICAgICAgMCwKLQkJICAgICAgMCwKLQkJICAgICAgTk9fUkVMT0MpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBjb2JyX2ZtdDoJZ2VuZXJhdGUgYSBDT0JSLWZvcm1hdCBpbnN0cnVjdGlvbgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1jb2JyX2ZtdCAoYXJnLCBvcGNvZGUsIG9QKQotICAgICAvKiBhcmdbMF0tPm9wY29kZSBtbmVtb25pYywgYXJnWzEtM10tPm9wZXJhbmRzIChhc2NpaSkgKi8KLSAgICAgY2hhciAqYXJnW107Ci0gICAgIC8qIE9wY29kZSwgd2l0aCBicmFuY2gtcHJlZGljdGlvbiBiaXRzIGFscmVhZHkgc2V0IGlmIG5lY2Vzc2FyeS4gICovCi0gICAgIGxvbmcgb3Bjb2RlOwotICAgICAvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGluc3RydWN0aW9uLiAgKi8KLSAgICAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsKLXsKLSAgbG9uZyBpbnN0cjsJCQkvKiAzMi1iaXQgaW5zdHJ1Y3Rpb24gKi8KLSAgc3RydWN0IHJlZ29wIHJlZ29wOwkJLyogRGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLwotICBpbnQgbjsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgaW50IHZhcl9mcmFnOwkJCS8qIDEgaWYgdmFyeWluZyBsZW5ndGggY29kZSBmcmFnbWVudCBzaG91bGQKLQkJCQkgKiAgICBiZSBlbWl0dGVkOyAgMCBpZiBhbiBhZGRyZXNzIGZpeAotCQkJCSAqICAgICAgc2hvdWxkIGJlIGVtaXR0ZWQuCi0JCQkJICovCi0KLSAgaW5zdHIgPSBvcGNvZGU7Ci0gIG4gPSBvUC0+bnVtX29wczsKLQotICBpZiAobiA+PSAxKQotICAgIHsKLSAgICAgIC8qIEZpcnN0IG9wZXJhbmQgKGlmIGFueSkgb2YgYSBDT0JSIGlzIGFsd2F5cyBhIHJlZ2lzdGVyCi0JIG9wZXJhbmQuICBQYXJzZSBpdC4gICovCi0gICAgICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdbMV0sIG9QLT5vcGVyYW5kWzBdKTsKLSAgICAgIGluc3RyIHw9IChyZWdvcC5uIDw8IDE5KSB8IChyZWdvcC5tb2RlIDw8IDEzKTsKLSAgICB9Ci0gIGlmIChuID49IDIpCi0gICAgewotICAgICAgLyogU2Vjb25kIG9wZXJhbmQgKGlmIGFueSkgb2YgYSBDT0JSIGlzIGFsd2F5cyBhIHJlZ2lzdGVyCi0JIG9wZXJhbmQuICBQYXJzZSBpdC4gICovCi0gICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnWzJdLCBvUC0+b3BlcmFuZFsxXSk7Ci0gICAgICBpbnN0ciB8PSAocmVnb3AubiA8PCAxNCkgfCByZWdvcC5zcGVjaWFsOwotICAgIH0KLQotCi0gIGlmIChuIDwgMykKLSAgICB7Ci0gICAgICBlbWl0IChpbnN0cik7Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW5zdHJ1bWVudF9icmFuY2hlcykKLQl7Ci0JICBicmNudF9lbWl0ICgpOwotCSAgY29sb24gKGJybGFiX25leHQgKCkpOwotCX0KLQotICAgICAgLyogQSB0aGlyZCBvcGVyYW5kIHRvIGEgQ09CUiBpcyBhbHdheXMgYSBkaXNwbGFjZW1lbnQuICBQYXJzZQotICAgICAgICAgaXQ7IGlmIGl0J3MgcmVsYXhhYmxlIChhIGNvYnIgImoiIGRpcmVjdGl2ZSwgb3IgYW55IGNvYnIKLSAgICAgICAgIG90aGVyIHRoYW4gYmJzL2JiYyB3aGVuIHRoZSAiLW5vcmVsYXgiIG9wdGlvbiBpcyBub3QgaW4gdXNlKQotICAgICAgICAgc2V0IHVwIGEgdmFyaWFibGUgY29kZSBmcmFnbWVudDsgb3RoZXJ3aXNlIHNldCB1cCBhbiBhZGRyZXNzCi0gICAgICAgICBmaXguICAqLwotICAgICAgdmFyX2ZyYWcgPSAhbm9yZWxheCB8fCAob1AtPmZvcm1hdCA9PSBDT0opOwkvKiBUUlVFIG9yIEZBTFNFICovCi0gICAgICBnZXRfY2Rpc3AgKGFyZ1szXSwgIkNPQlIiLCBpbnN0ciwgMTMsIHZhcl9mcmFnLCAwKTsKLQotICAgICAgaWYgKGluc3RydW1lbnRfYnJhbmNoZXMpCi0JewotCSAgYnJjbnRfZW1pdCAoKTsKLQl9Ci0gICAgfQotfQkJCQkvKiBjb2JyX2ZtdCgpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBjdHJsX2ZtdDoJZ2VuZXJhdGUgYSBDVFJMLWZvcm1hdCBpbnN0cnVjdGlvbgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi12b2lkCi1jdHJsX2ZtdCAodGFyZ1AsIG9wY29kZSwgbnVtX29wcykKLSAgICAgY2hhciAqdGFyZ1A7CQkvKiBQb2ludGVyIHRvIHRleHQgb2YgbG9uZSBvcGVyYW5kIChpZiBhbnkpICovCi0gICAgIGxvbmcgb3Bjb2RlOwkJLyogVGVtcGxhdGUgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgaW50IG51bV9vcHM7CQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLXsKLSAgaW50IGluc3RydW1lbnQ7CQkvKiBUUlVFIGlmZiB3ZSBzaG91bGQgYWRkIGluc3RydW1lbnRhdGlvbiB0byB0cmFjawotCQkJCSAgICogaG93IG9mdGVuIHRoZSBicmFuY2ggaXMgdGFrZW4KLQkJCQkgKi8KLQotCi0gIGlmIChudW1fb3BzID09IDApCi0gICAgewotICAgICAgZW1pdCAob3Bjb2RlKTsJCS8qIE91dHB1dCBvcGNvZGUgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0KLSAgICAgIGluc3RydW1lbnQgPSBpbnN0cnVtZW50X2JyYW5jaGVzICYmIChvcGNvZGUgIT0gQ0FMTCkKLQkmJiAob3Bjb2RlICE9IEIpICYmIChvcGNvZGUgIT0gUkVUKSAmJiAob3Bjb2RlICE9IEJBTCk7Ci0KLSAgICAgIGlmIChpbnN0cnVtZW50KQotCXsKLQkgIGJyY250X2VtaXQgKCk7Ci0JICBjb2xvbiAoYnJsYWJfbmV4dCAoKSk7Ci0JfQotCi0gICAgICAvKiBUaGUgb3BlcmFuZCBNVVNUIGJlIGFuIGlwLXJlbGF0aXZlIGRpc3BsYWNtZW50LiBQYXJzZSBpdAotICAgICAgICAgKiBhbmQgc2V0IHVwIGFkZHJlc3MgZml4IGZvciB0aGUgaW5zdHJ1Y3Rpb24gd2UganVzdCBvdXRwdXQuCi0gICAgICAgKi8KLSAgICAgIGdldF9jZGlzcCAodGFyZ1AsICJDVFJMIiwgb3Bjb2RlLCAyNCwgMCwgMCk7Ci0KLSAgICAgIGlmIChpbnN0cnVtZW50KQotCXsKLQkgIGJyY250X2VtaXQgKCk7Ci0JfQotICAgIH0KLQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZW1pdDoJb3V0cHV0IGluc3RydWN0aW9uIGJpbmFyeQotCi0gIAlPdXRwdXQgaW5zdHJ1Y3Rpb24gYmluYXJ5LCBpbiB0YXJnZXQgYnl0ZSBvcmRlciwgNCBieXRlcyBhdCBhIHRpbWUuCi0gIAlSZXR1cm4gcG9pbnRlciB0byB3aGVyZSBpdCB3YXMgcGxhY2VkLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljCi1jaGFyICoKLWVtaXQgKGluc3RyKQotICAgICBsb25nIGluc3RyOwkJLyogV29yZCB0byBiZSBvdXRwdXQsIGhvc3QgYnl0ZSBvcmRlciAqLwotewotICBjaGFyICp0b1A7CQkJLyogV2hlcmUgdG8gb3V0cHV0IGl0ICovCi0KLSAgdG9QID0gZnJhZ19tb3JlICg0KTsJCS8qIEFsbG9jYXRlIHN0b3JhZ2UgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0b1AsIGluc3RyLCA0KTsJLyogQ29udmVydCB0byB0YXJnZXQgYnl0ZSBvcmRlciAqLwotICByZXR1cm4gdG9QOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZ2V0X2FyZ3M6CWJyZWFrIGluZGl2aWR1YWwgYXJndW1lbnRzIG91dCBvZiBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCi0gICBJbnB1dCBhc3N1bXB0aW9uczoKLSAgCS0gYWxsIGNvbW1lbnRzIGFuZCBsYWJlbHMgaGF2ZSBiZWVuIHJlbW92ZWQKLSAgCS0gYWxsIHN0cmluZ3Mgb2Ygd2hpdGVzcGFjZSBoYXZlIGJlZW4gY29sbGFwc2VkIHRvIGEgc2luZ2xlIGJsYW5rLgotICAJLSBhbGwgY2hhcmFjdGVyIGNvbnN0YW50cyAoJ3gnKSBoYXZlIGJlZW4gcmVwbGFjZWQgd2l0aCBkZWNpbWFsCi0KLSAgIE91dHB1dDoKLSAgCWFyZ3NbMF0gaXMgdW50b3VjaGVkLiBhcmdzWzFdIHBvaW50cyB0byBmaXJzdCBvcGVyYW5kLCBldGMuIEFsbCBhcmdzOgotICAJLSBhcmUgTlVMTC10ZXJtaW5hdGVkCi0gIAktIGNvbnRhaW4gbm8gd2hpdGVzcGFjZQotCi0gICBSZXR1cm4gdmFsdWU6Ci0gIAlOdW1iZXIgb2Ygb3BlcmFuZHMgKDAsMSwyLCBvciAzKSBvciAtMSBvbiBlcnJvci4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyBpbnQKLWdldF9hcmdzIChwLCBhcmdzKQotICAgICAvKiBQb2ludGVyIHRvIGNvbW1hLXNlcGFyYXRlZCBvcGVyYW5kczsgTVVDS0VEIEJZIFVTICovCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gICAgIC8qIE91dHB1dCBhcmc6IHBvaW50ZXJzIHRvIG9wZXJhbmRzIHBsYWNlZCBpbiBhcmdzWzEtM10uICBNVVNUCi0gICAgICAgIEFDQ09NTU9EQVRFIDQgRU5UUklFUyAoYXJnc1swLTNdKS4gICovCi0gICAgIGNoYXIgKmFyZ3NbXTsKLXsKLSAgcmVnaXN0ZXIgaW50IG47CQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgcmVnaXN0ZXIgY2hhciAqdG87Ci0KLSAgLyogU2tpcCBsZWFkIHdoaXRlIHNwYWNlICovCi0gIHdoaWxlICgqcCA9PSAnICcpCi0gICAgewotICAgICAgcCsrOwotICAgIH0KLQotICBpZiAoKnAgPT0gJ1wwJykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbiA9IDE7Ci0gIGFyZ3NbMV0gPSBwOwotCi0gIC8qIFNxdWV6ZSBibGFua3Mgb3V0IGJ5IG1vdmluZyBub24tYmxhbmtzIHRvd2FyZCBzdGFydCBvZiBzdHJpbmcuCi0gICAgICogSXNvbGF0ZSBvcGVyYW5kcywgd2hlbmV2ZXIgY29tbWEgaXMgZm91bmQuCi0gICAqLwotICB0byA9IHA7Ci0gIHdoaWxlICgqcCAhPSAnXDAnKQotICAgIHsKLQotICAgICAgaWYgKCpwID09ICcgJwotCSAgJiYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHBbMV0pCi0JICAgICAgfHwgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgcFstMV0pKSkKLQl7Ci0JICBwKys7Ci0KLQl9Ci0gICAgICBlbHNlIGlmICgqcCA9PSAnLCcpCi0JewotCi0JICAvKiBTdGFydCBvZiBvcGVyYW5kICovCi0JICBpZiAobiA9PSAzKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJ0b28gbWFueSBvcGVyYW5kcyIpKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgICp0bysrID0gJ1wwJzsJCS8qIFRlcm1pbmF0ZSBhcmd1bWVudCAqLwotCSAgYXJnc1srK25dID0gdG87CS8qIFN0YXJ0IG5leHQgYXJndW1lbnQgKi8KLQkgIHArKzsKLQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqdG8rKyA9ICpwKys7Ci0JfQotICAgIH0KLSAgKnRvID0gJ1wwJzsKLSAgcmV0dXJuIG47Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBnZXRfY2Rpc3A6CWhhbmRsZSBkaXNwbGFjZW1lbnQgZm9yIGEgQ09CUiBvciBDVFJMIGluc3RydWN0aW9uLgotCi0gIAlQYXJzZSBkaXNwbGFjZW1lbnQgZm9yIGEgQ09CUiBvciBDVFJMIGluc3RydWN0aW9uLgotCi0gIAlJZiBzdWNjZXNzZnVsLCBvdXRwdXQgdGhlIGluc3RydWN0aW9uIG9wY29kZSBhbmQgc2V0IHVwIGZvciBpdCwKLSAgCWRlcGVuZGluZyBvbiB0aGUgYXJnICd2YXJfZnJhZycsIGVpdGhlcjoKLSAgCSAgICBvIGFuIGFkZHJlc3MgZml4dXAgdG8gYmUgZG9uZSB3aGVuIGFsbCBzeW1ib2wgdmFsdWVzIGFyZSBrbm93biwgb3IKLSAgCSAgICBvIGEgdmFyeWluZyBsZW5ndGggY29kZSBmcmFnbWVudCwgd2l0aCBhZGRyZXNzIGZpeHVwIGluZm8uICBUaGlzCi0gIAkJd2lsbCBiZSBkb25lIGZvciBjb2JyIGluc3RydWN0aW9ucyB0aGF0IG1heSBoYXZlIHRvIGJlIHJlbGF4ZWQKLSAgCQlpbiB0byBjb21wYXJlL2JyYW5jaCBpbnN0cnVjdGlvbnMgKDggYnl0ZXMpIGlmIHRoZSBmaW5hbAotICAJCWFkZHJlc3MgZGlzcGxhY2VtZW50IGlzIGdyZWF0ZXIgdGhhbiAxMyBiaXRzLgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMKLXZvaWQKLWdldF9jZGlzcCAoZGlzcFAsIGlmbXRQLCBpbnN0ciwgbnVtYml0cywgdmFyX2ZyYWcsIGNhbGxqKQotICAgICAvKiBkaXNwbGFjZW1lbnQgYXMgc3BlY2lmaWVkIGluIHNvdXJjZSBpbnN0cnVjdGlvbiAqLwotICAgICBjaGFyICpkaXNwUDsKLSAgICAgLyogIkNPQlIiIG9yICJDVFJMIiAoZm9yIHVzZSBpbiBlcnJvciBtZXNzYWdlKSAqLwotICAgICBjaGFyICppZm10UDsKLSAgICAgLyogSW5zdHJ1Y3Rpb24gbmVlZGluZyB0aGUgZGlzcGxhY2VtZW50ICovCi0gICAgIGxvbmcgaW5zdHI7Ci0gICAgIC8qICMgYml0cyBvZiBkaXNwbGFjZW1lbnQgKDEzIGZvciBDT0JSLCAyNCBmb3IgQ1RSTCkgKi8KLSAgICAgaW50IG51bWJpdHM7Ci0gICAgIC8qIDEgaWYgdmFyeWluZyBsZW5ndGggY29kZSBmcmFnbWVudCBzaG91bGQgYmUgZW1pdHRlZDsKLSAgICAgICogICAgICAgMCBpZiBhbiBhZGRyZXNzIGZpeCBzaG91bGQgYmUgZW1pdHRlZC4KLSAgICAgICovCi0gICAgIGludCB2YXJfZnJhZzsKLSAgICAgLyogMSBpZiBjYWxsaiByZWxvY2F0aW9uIHNob3VsZCBiZSBkb25lOyBlbHNlIDAgKi8KLSAgICAgaW50IGNhbGxqOwotewotICBleHByZXNzaW9uUyBlOwkJLyogUGFyc2VkIGV4cHJlc3Npb24gKi8KLSAgZml4UyAqZml4UDsJCQkvKiBTdHJ1Y3R1cmUgZGVzY3JpYmluZyBuZWVkZWQgYWRkcmVzcyBmaXggKi8KLSAgY2hhciAqb3V0UDsJCQkvKiBXaGVyZSBpbnN0cnVjdGlvbiBiaW5hcnkgaXMgb3V0cHV0IHRvICovCi0KLSAgZml4UCA9IE5VTEw7Ci0KLSAgcGFyc2VfZXhwciAoZGlzcFAsICZlKTsKLSAgc3dpdGNoIChlLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgICAgYXNfYmFkIChfKCJleHByZXNzaW9uIHN5bnRheCBlcnJvciIpKTsKLQotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZS5YX2FkZF9zeW1ib2wpID09IG5vd19zZWcKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGUuWF9hZGRfc3ltYm9sKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQl7Ci0JICBpZiAodmFyX2ZyYWcpCi0JICAgIHsKLQkgICAgICBvdXRQID0gZnJhZ19tb3JlICg4KTsJLyogQWxsb2NhdGUgd29yc3QtY2FzZSBzdG9yYWdlICovCi0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvdXRQLCBpbnN0ciwgNCk7Ci0JICAgICAgZnJhZ192YXJpYW50IChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgNCwgMSwKLQkJCSAgICBhZGRzIChlKSwgb2ZmcyAoZSksIG91dFApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTZXQgdXAgYSBuZXcgZml4IHN0cnVjdHVyZSwgc28gYWRkcmVzcyBjYW4gYmUgdXBkYXRlZAotCSAgICAgICAqIHdoZW4gYWxsIHN5bWJvbCB2YWx1ZXMgYXJlIGtub3duLgotCSAgICAgICAqLwotCSAgICAgIG91dFAgPSBlbWl0IChpbnN0cik7Ci0JICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdfbm93LAotCQkJICAgICAgb3V0UCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgNCwKLQkJCSAgICAgIGFkZHMgKGUpLAotCQkJICAgICAgb2ZmcyAoZSksCi0JCQkgICAgICAxLAotCQkJICAgICAgTk9fUkVMT0MpOwotCi0JICAgICAgZml4UC0+ZnhfdGNiaXQgPSBjYWxsajsKLQotCSAgICAgIC8qIFdlIHdhbnQgdG8gbW9kaWZ5IGEgYml0IGZpZWxkIHdoZW4gdGhlIGFkZHJlc3MgaXMKLQkgICAgICAgKiBrbm93bi4gIEJ1dCB3ZSBkb24ndCBuZWVkIGFsbCB0aGUgZ2FyYmFnZSBpbiB0aGUKLQkgICAgICAgKiBiaXRfZml4IHN0cnVjdHVyZS4gIFNvIHdlJ3JlIGdvaW5nIHRvIGxpZSBhbmQgc3RvcmUKLQkgICAgICAgKiB0aGUgbnVtYmVyIG9mIGJpdHMgYWZmZWN0ZWQgaW5zdGVhZCBvZiBhIHBvaW50ZXIuCi0JICAgICAgICovCi0JICAgICAgZml4UC0+ZnhfYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgbnVtYml0czsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImF0dGVtcHQgdG8gYnJhbmNoIGludG8gZGlmZmVyZW50IHNlZ21lbnQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oInRhcmdldCBvZiAlcyBpbnN0cnVjdGlvbiBtdXN0IGJlIGEgbGFiZWwiKSwgaWZtdFApOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZ2V0X2lzcGVjOglwYXJzZSBhIG1lbW9yeSBvcGVyYW5kIGZvciBhbiBpbmRleCBzcGVjaWZpY2F0aW9uCi0KLSAgCUhlcmUsIGFuICJpbmRleCBzcGVjaWZpY2F0aW9uIiBpcyB0YWtlbiB0byBiZSBhbnl0aGluZyBzdXJyb3VuZGVkCi0gIAlieSBzcXVhcmUgYnJhY2tldHMgYW5kIE5PVCBmb2xsb3dlZCBieSBhbnl0aGluZyBlbHNlLgotCi0gIAlJZiBpdCdzIGZvdW5kLCBkZXRhY2ggaXQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCByZW1vdmUgdGhlIHN1cnJvdW5kaW5nCi0gIAlzcXVhcmUgYnJhY2tldHMsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LiAgT3RoZXJ3aXNlLCByZXR1cm4gTlVMTC4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotY2hhciAqCi1nZXRfaXNwZWMgKHRleHRQKQotICAgICAvKiBQb2ludGVyIHRvIG1lbW9yeSBvcGVyYW5kIGZyb20gc291cmNlIGluc3RydWN0aW9uLCBubyB3aGl0ZSBzcGFjZS4gICovCi0gICAgIGNoYXIgKnRleHRQOwotewotICAvKiBQb2ludHMgdG8gc3RhcnQgb2YgaW5kZXggc3BlY2lmaWNhdGlvbi4gICovCi0gIGNoYXIgKnN0YXJ0OwotICAvKiBQb2ludHMgdG8gZW5kIG9mIGluZGV4IHNwZWNpZmljYXRpb24uICAqLwotICBjaGFyICplbmQ7Ci0KLSAgLyogRmluZCBvcGVuaW5nIHNxdWFyZSBicmFja2V0LCBpZiBhbnkuICAqLwotICBzdGFydCA9IHN0cmNociAodGV4dFAsICdbJyk7Ci0KLSAgaWYgKHN0YXJ0ICE9IE5VTEwpCi0gICAgewotCi0gICAgICAvKiBFbGltaW5hdGUgJ1snLCBkZXRhY2ggZnJvbSByZXN0IG9mIG9wZXJhbmQgKi8KLSAgICAgICpzdGFydCsrID0gJ1wwJzsKLQotICAgICAgZW5kID0gc3RyY2hyIChzdGFydCwgJ10nKTsKLQotICAgICAgaWYgKGVuZCA9PSBOVUxMKQotCXsKLQkgIGFzX2JhZCAoXygidW5tYXRjaGVkICdbJyIpKTsKLQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBFbGltaW5hdGUgJ10nIGFuZCBtYWtlIHN1cmUgaXQgd2FzIHRoZSBsYXN0IHRoaW5nCi0JICAgICAqIGluIHRoZSBzdHJpbmcuCi0JICAgKi8KLQkgICplbmQgPSAnXDAnOwotCSAgaWYgKCooZW5kICsgMSkgIT0gJ1wwJykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiZ2FyYmFnZSBhZnRlciBpbmRleCBzcGVjIGlnbm9yZWQiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICByZXR1cm4gc3RhcnQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgZ2V0X3JlZ251bToKLQotICAJTG9vayB1cCBhIChzdXNwZWN0ZWQpIHJlZ2lzdGVyIG5hbWUgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlIGFuZCByZXR1cm4gdGhlCi0gIAlhc3NvY2lhdGVkIHJlZ2lzdGVyIG51bWJlciAob3IgLTEgaWYgbm90IGZvdW5kKS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotaW50Ci1nZXRfcmVnbnVtIChyZWduYW1lKQotICAgICBjaGFyICpyZWduYW1lOwkJLyogU3VzcGVjdGVkIHJlZ2lzdGVyIG5hbWUgKi8KLXsKLSAgaW50ICpyUDsKLQotICByUCA9IChpbnQgKikgaGFzaF9maW5kIChyZWdfaGFzaCwgcmVnbmFtZSk7Ci0gIHJldHVybiAoclAgPT0gTlVMTCkgPyAtMSA6ICpyUDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIGlfc2NhbjoJcGVyZm9ybSBsZXhpY2FsIHNjYW4gb2YgYXNjaWkgYXNzZW1ibGVyIGluc3RydWN0aW9uLgotCi0gICBJbnB1dCBhc3N1bXB0aW9uczoKLSAgCS0gaW5wdXQgc3RyaW5nIGlzIGFuIGk4MDk2MCBpbnN0cnVjdGlvbiAobm90IGEgcHNldWRvLW9wKQotICAJLSBhbGwgY29tbWVudHMgYW5kIGxhYmVscyBoYXZlIGJlZW4gcmVtb3ZlZAotICAJLSBhbGwgc3RyaW5ncyBvZiB3aGl0ZXNwYWNlIGhhdmUgYmVlbiBjb2xsYXBzZWQgdG8gYSBzaW5nbGUgYmxhbmsuCi0KLSAgIE91dHB1dDoKLSAgCWFyZ3NbMF0gcG9pbnRzIHRvIG9wY29kZSwgb3RoZXIgZW50cmllcyBwb2ludCB0byBvcGVyYW5kcy4gQWxsIHN0cmluZ3M6Ci0gIAktIGFyZSBOVUxMLXRlcm1pbmF0ZWQKLSAgCS0gY29udGFpbiBubyB3aGl0ZXNwYWNlCi0gIAktIGhhdmUgY2hhcmFjdGVyIGNvbnN0YW50cyAoJ3gnKSByZXBsYWNlZCB3aXRoIGEgZGVjaW1hbCBudW1iZXIKLQotICAgUmV0dXJuIHZhbHVlOgotICAJTnVtYmVyIG9mIG9wZXJhbmRzICgwLDEsMiwgb3IgMykgb3IgLTEgb24gZXJyb3IuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgaW50Ci1pX3NjYW4gKGlQLCBhcmdzKQotICAgICAvKiBQb2ludGVyIHRvIGFzY2lpIGluc3RydWN0aW9uOyAgTVVDS0VEIEJZIFVTLiAqLwotICAgICByZWdpc3RlciBjaGFyICppUDsKLSAgICAgLyogT3V0cHV0IGFyZzogcG9pbnRlcnMgdG8gb3Bjb2RlIGFuZCBvcGVyYW5kcyBwbGFjZWQgaGVyZS4gIE1VU1QKLQlBQ0NPTU1PREFURSA0IEVOVFJJRVMuICAqLwotICAgICBjaGFyICphcmdzW107Ci17Ci0KLSAgLyogSXNvbGF0ZSBvcGNvZGUgKi8KLSAgaWYgKCooaVApID09ICcgJykKLSAgICB7Ci0gICAgICBpUCsrOwotICAgIH0JCQkJLyogU2tpcCBsZWFkIHNwYWNlLCBpZiBhbnkgKi8KLSAgYXJnc1swXSA9IGlQOwotICBmb3IgKDsgKmlQICE9ICcgJzsgaVArKykKLSAgICB7Ci0gICAgICBpZiAoKmlQID09ICdcMCcpCi0JewotCSAgLyogVGhlcmUgYXJlIG5vIG9wZXJhbmRzICovCi0JICBpZiAoYXJnc1swXSA9PSBpUCkKLQkgICAgewotCSAgICAgIC8qIFdlIG5ldmVyIG1vdmVkOiB0aGVyZSB3YXMgbm8gb3Bjb2RlIGVpdGhlciEgKi8KLQkgICAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3Bjb2RlIikpOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgKmlQKysgPSAnXDAnOwkJCS8qIFRlcm1pbmF0ZSBvcGNvZGUgKi8KLSAgcmV0dXJuIChnZXRfYXJncyAoaVAsIGFyZ3MpKTsKLX0JCQkJLyogaV9zY2FuKCkgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIG1lbV9mbXQ6CWdlbmVyYXRlIGEgTUVNQS0gb3IgTUVNQi1mb3JtYXQgaW5zdHJ1Y3Rpb24KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYyB2b2lkCi1tZW1fZm10IChhcmdzLCBvUCwgY2FsbHgpCi0gICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMF0tPm9wY29kZSBtbmVtb25pYywgYXJnc1sxLTNdLT5vcGVyYW5kcyAqLwotICAgICBzdHJ1Y3QgaTk2MF9vcGNvZGUgKm9QOwkvKiBQb2ludGVyIHRvIGRlc2NyaXB0aW9uIG9mIGluc3RydWN0aW9uICovCi0gICAgIGludCBjYWxseDsJCQkvKiBJcyB0aGlzIGEgY2FsbHggb3Bjb2RlICovCi17Ci0gIGludCBpOwkJCS8qIExvb3AgY291bnRlciAqLwotICBzdHJ1Y3QgcmVnb3AgcmVnb3A7CQkvKiBEZXNjcmlwdGlvbiBvZiByZWdpc3RlciBvcGVyYW5kICovCi0gIGNoYXIgb3BkZXNjOwkJCS8qIE9wZXJhbmQgZGVzY3JpcHRvciBieXRlICovCi0gIG1lbVMgaW5zdHI7CQkJLyogRGVzY3JpcHRpb24gb2YgYmluYXJ5IHRvIGJlIG91dHB1dCAqLwotICBjaGFyICpvdXRQOwkJCS8qIFdoZXJlIHRoZSBiaW5hcnkgd2FzIG91dHB1dCB0byAqLwotICBleHByZXNzaW9uUyBleHByOwkJLyogUGFyc2VkIGV4cHJlc3Npb24gKi8KLSAgLyogLT5kZXNjcmlwdGlvbiBvZiBkZWZlcnJlZCBhZGRyZXNzIGZpeHVwICovCi0gIGZpeFMgKmZpeFA7Ci0KLSNpZmRlZiBPQkpfQ09GRgotICAvKiBDT0ZGIHN1cHBvcnQgaXNuJ3QgaW4gcGxhY2UgeWV0IGZvciBjYWxseCByZWxheGluZy4gICovCi0gIGNhbGx4ID0gMDsKLSNlbmRpZgotCi0gIG1lbXNldCAoJmluc3RyLCAnXDAnLCBzaXplb2YgKG1lbVMpKTsKLSAgaW5zdHIub3Bjb2RlID0gb1AtPm9wY29kZTsKLQotICAvKiBQcm9jZXNzIG9wZXJhbmRzLiAqLwotICBmb3IgKGkgPSAxOyBpIDw9IG9QLT5udW1fb3BzOyBpKyspCi0gICAgewotICAgICAgb3BkZXNjID0gb1AtPm9wZXJhbmRbaSAtIDFdOwotCi0gICAgICBpZiAoTUVNT1AgKG9wZGVzYykpCi0JewotCSAgcGFyc2VfbWVtb3AgKCZpbnN0ciwgYXJnc1tpXSwgb1AtPmZvcm1hdCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHBhcnNlX3JlZ29wICgmcmVnb3AsIGFyZ3NbaV0sIG9wZGVzYyk7Ci0JICBpbnN0ci5vcGNvZGUgfD0gcmVnb3AubiA8PCAxOTsKLQl9Ci0gICAgfQotCi0gIC8qIFBhcnNlIHRoZSBkaXNwbGFjZW1lbnQ7IHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSBlbWl0dGluZyB0aGUKLSAgICAgb3Bjb2RlLCBpbiBjYXNlIGl0IGlzIGFuIGV4cHJlc3Npb24gdXNpbmcgYC4nLiAgKi8KLSAgcGFyc2VfZXhwciAoaW5zdHIuZSwgJmV4cHIpOwotCi0gIC8qIE91dHB1dCBvcGNvZGUgKi8KLSAgb3V0UCA9IGVtaXQgKGluc3RyLm9wY29kZSk7Ci0KLSAgaWYgKGluc3RyLmRpc3AgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFByb2Nlc3MgdGhlIGRpc3BsYWNlbWVudCAqLwotICBzd2l0Y2ggKGV4cHIuWF9vcCkKLSAgICB7Ci0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgICBhc19iYWQgKF8oImV4cHJlc3Npb24gc3ludGF4IGVycm9yIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICBpZiAoaW5zdHIuZGlzcCA9PSAzMikKLQl7Ci0JICAodm9pZCkgZW1pdCAob2ZmcyAoZXhwcikpOwkvKiBPdXRwdXQgZGlzcGxhY2VtZW50ICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIDEyLWJpdCBkaXNwbGFjZW1lbnQgKi8KLQkgIGlmIChvZmZzIChleHByKSAmIH4weGZmZikKLQkgICAgewotCSAgICAgIC8qIFdvbid0IGZpdCBpbiAxMiBiaXRzOiBjb252ZXJ0IGFscmVhZHktb3V0cHV0Ci0JICAgICAgICogaW5zdHJ1Y3Rpb24gdG8gTUVNQiBmb3JtYXQsIG91dHB1dAotCSAgICAgICAqIGRpc3BsYWNlbWVudC4KLQkgICAgICAgKi8KLQkgICAgICBtZW1hX3RvX21lbWIgKG91dFApOwotCSAgICAgICh2b2lkKSBlbWl0IChvZmZzIChleHByKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIFdJTEwgZml0IGluIDEyIGJpdHM6ICBPUiBpbnRvIG9wY29kZSBhbmQKLQkgICAgICAgKiBvdmVyd3JpdGUgdGhlIGJpbmFyeSB3ZSBhbHJlYWR5IHB1dCBvdXQKLQkgICAgICAgKi8KLQkgICAgICBpbnN0ci5vcGNvZGUgfD0gb2ZmcyAoZXhwcik7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvdXRQLCBpbnN0ci5vcGNvZGUsIDQpOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGluc3RyLmRpc3AgPT0gMTIpCi0JewotCSAgLyogRGlzcGxhY2VtZW50IGlzIGRlcGVuZGVudCBvbiBhIHN5bWJvbCwgd2hvc2UgdmFsdWUKLQkgICAqIG1heSBjaGFuZ2UgYXQgbGluayB0aW1lLiAgV2UgSEFWRSB0byByZXNlcnZlIDMyIGJpdHMuCi0JICAgKiBDb252ZXJ0IGFscmVhZHktb3V0cHV0IG9wY29kZSB0byBNRU1CIGZvcm1hdC4KLQkgICAqLwotCSAgbWVtYV90b19tZW1iIChvdXRQKTsKLQl9Ci0KLSAgICAgIC8qIE91dHB1dCAwIGRpc3BsYWNlbWVudCBhbmQgc2V0IHVwIGFkZHJlc3MgZml4dXAgZm9yIHdoZW4KLSAgICAgICAqIHRoaXMgc3ltYm9sJ3MgdmFsdWUgYmVjb21lcyBrbm93bi4KLSAgICAgICAqLwotICAgICAgb3V0UCA9IGVtaXQgKChsb25nKSAwKTsKLSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgIG91dFAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgNCwKLQkJCSAgJmV4cHIsCi0JCQkgIDAsCi0JCQkgIE5PX1JFTE9DKTsKLSAgICAgIC8qIFN0ZXZlJ3MgbGlua2VyIHJlbGF4aW5nIGhhY2suICBNYXJrIHRoaXMgMzItYml0IHJlbG9jYXRpb24gYXMKLSAgICAgICAgIGJlaW5nIGluIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0sIHNwZWNpZmljYWxseSBhcyBwYXJ0IG9mIGEgY2FsbHgKLSAgICAgICAgIGluc3RydWN0aW9uLiAgKi8KLSAgICAgIGZpeFAtPmZ4X2JzciA9IGNhbGx4OwotICAgICAgYnJlYWs7Ci0gICAgfQotfQkJCQkvKiBtZW1mbXQoKSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgbWVtYV90b19tZW1iOgljb252ZXJ0IGEgTUVNQS1mb3JtYXQgb3Bjb2RlIHRvIGEgTUVNQi1mb3JtYXQgb3Bjb2RlLgotCi0gICBUaGVyZSBhcmUgMiBwb3NzaWJsZSBNRU1BIGZvcm1hdHM6Ci0gIAktIGRpc3BsYWNlbWVudCBvbmx5Ci0gIAktIGRpc3BsYWNlbWVudCArIGFiYXNlCi0KLSAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHNldHRpbmcgb2YgdGhlIE1FTUFfQUJBU0UgYml0LgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLW1lbWFfdG9fbWVtYiAob3Bjb2RlUCkKLSAgICAgY2hhciAqb3Bjb2RlUDsJCS8qIFdoZXJlIHRvIGZpbmQgdGhlIG9wY29kZSwgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLXsKLSAgbG9uZyBvcGNvZGU7CQkJLyogT3Bjb2RlIGluIGhvc3QgYnl0ZSBvcmRlciAqLwotICBsb25nIG1vZGU7CQkJLyogTW9kZSBiaXRzIGZvciBNRU1CIGluc3RydWN0aW9uICovCi0KLSAgb3Bjb2RlID0gbWRfY2hhcnNfdG9fbnVtYmVyIChvcGNvZGVQLCA0KTsKLSAga25vdyAoIShvcGNvZGUgJiBNRU1CX0JJVCkpOwotCi0gIG1vZGUgPSBNRU1CX0JJVCB8IERfQklUOwotICBpZiAob3Bjb2RlICYgTUVNQV9BQkFTRSkKLSAgICB7Ci0gICAgICBtb2RlIHw9IEFfQklUOwotICAgIH0KLQotICBvcGNvZGUgJj0gMHhmZmZmYzAwMDsJCS8qIENsZWFyIE1FTUEgb2Zmc2V0IGFuZCBtb2RlIGJpdHMgKi8KLSAgb3Bjb2RlIHw9IG1vZGU7CQkvKiBTZXQgTUVNQiBtb2RlIGJpdHMgKi8KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKG9wY29kZVAsIG9wY29kZSwgNCk7Ci19CQkJCS8qIG1lbWFfdG9fbWVtYigpICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBwYXJzZV9leHByOgkJcGFyc2UgYW4gZXhwcmVzc2lvbgotCi0gIAlVc2UgYmFzZSBhc3NlbWJsZXIncyBleHByZXNzaW9uIHBhcnNlciB0byBwYXJzZSBhbiBleHByZXNzaW9uLgotICAJSXQsIHVuZm9ydHVuYXRlbHksIHJ1bnMgb2ZmIGEgZ2xvYmFsIHdoaWNoIHdlIGhhdmUgdG8gc2F2ZS9yZXN0b3JlCi0gIAlpbiBvcmRlciB0byBtYWtlIGl0IHdvcmsgZm9yIHVzLgotCi0gIAlBbiBlbXB0eSBleHByZXNzaW9uIHN0cmluZyBpcyB0cmVhdGVkIGFzIGFuIGFic29sdXRlIDAuCi0KLSAgCVNldHMgT19pbGxlZ2FsIHJlZ2FyZGxlc3Mgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGlmIGVudGlyZSBpbnB1dAotICAJc3RyaW5nIGlzIG5vdCBjb25zdW1lZCBpbiB0aGUgZXZhbHVhdGlvbiAtLSB0b2xlcmF0ZSBubyBkYW5nbGluZyBqdW5rIQotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLXBhcnNlX2V4cHIgKHRleHRQLCBleHBQKQotICAgICBjaGFyICp0ZXh0UDsJCS8qIFRleHQgb2YgZXhwcmVzc2lvbiB0byBiZSBwYXJzZWQgKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cFA7CQkvKiBXaGVyZSB0byBwdXQgdGhlIHJlc3VsdHMgb2YgcGFyc2luZyAqLwotewotICBjaGFyICpzYXZlX2luOwkJLyogU2F2ZSBnbG9iYWwgaGVyZSAqLwotICBzeW1ib2xTICpzeW1QOwotCi0gIGtub3cgKHRleHRQKTsKLQotICBpZiAoKnRleHRQID09ICdcMCcpCi0gICAgewotICAgICAgLyogVHJlYXQgZW1wdHkgc3RyaW5nIGFzIGFic29sdXRlIDAgKi8KLSAgICAgIGV4cFAtPlhfYWRkX3N5bWJvbCA9IGV4cFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwkvKiBTYXZlIGdsb2JhbCAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gdGV4dFA7CS8qIE1ha2UgcGFyc2VyIHdvcmsgZm9yIHVzICovCi0KLSAgICAgICh2b2lkKSBleHByZXNzaW9uIChleHBQKTsKLSAgICAgIGlmICgoc2l6ZV90KSAoaW5wdXRfbGluZV9wb2ludGVyIC0gdGV4dFApICE9IHN0cmxlbiAodGV4dFApKQotCXsKLQkgIC8qIERpZCBub3QgY29uc3VtZSBhbGwgb2YgdGhlIGlucHV0ICovCi0JICBleHBQLT5YX29wID0gT19pbGxlZ2FsOwotCX0KLSAgICAgIHN5bVAgPSBleHBQLT5YX2FkZF9zeW1ib2w7Ci0gICAgICBpZiAoc3ltUCAmJiAoaGFzaF9maW5kIChyZWdfaGFzaCwgU19HRVRfTkFNRSAoc3ltUCkpKSkKLQl7Ci0JICAvKiBSZWdpc3RlciBuYW1lIGluIGFuIGV4cHJlc3Npb24gKi8KLQkgIC8qIEZJWE1FOiB0aGlzIGlzbid0IG11Y2ggb2YgYSBjaGVjayBhbnkgbW9yZS4gICovCi0JICBleHBQLT5YX29wID0gT19pbGxlZ2FsOwotCX0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsJLyogUmVzdG9yZSBnbG9iYWwgKi8KLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBwYXJzZV9sZGNvbnQ6Ci0gIAlQYXJzZSBhbmQgcmVwbGFjZSBhICdsZGNvbnN0JyBwc2V1ZG8taW5zdHJ1Y3Rpb24gd2l0aCBhbiBhcHByb3ByaWF0ZQotICAJaTgwOTYwIGluc3RydWN0aW9uLgotCi0gIAlBc3N1bWVzIHRoZSBpbnB1dCBjb25zaXN0cyBvZjoKLSAgCQlhcmdbMF0Jb3Bjb2RlIG1uZW1vbmljICgnbGRjb25zdCcpCi0gIAkJYXJnWzFdICBmaXJzdCBvcGVyYW5kIChjb25zdGFudCkKLSAgCQlhcmdbMl0JbmFtZSBvZiByZWdpc3RlciB0byBiZSBsb2FkZWQKLQotICAJUmVwbGFjZXMgb3Bjb2RlIGFuZC9vciBvcGVyYW5kcyBhcyBhcHByb3ByaWF0ZS4KLQotICAJUmV0dXJucyB0aGUgbmV3IG51bWJlciBvZiBhcmd1bWVudHMsIG9yIC0xIG9uIGZhaWx1cmUuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLWludAotcGFyc2VfbGRjb25zdCAoYXJnKQotICAgICBjaGFyICphcmdbXTsJCS8qIFNlZSBhYm92ZSAqLwotewotICBpbnQgbjsJCQkvKiBDb25zdGFudCB0byBiZSBsb2FkZWQgKi8KLSAgaW50IHNoaWZ0OwkJCS8qIFNoaWZ0IGNvdW50IGZvciAic2hsbyIgaW5zdHJ1Y3Rpb24gKi8KLSAgc3RhdGljIGNoYXIgYnVmWzVdOwkJLyogTGl0ZXJhbCBmb3IgZmlyc3Qgb3BlcmFuZCAqLwotICBzdGF0aWMgY2hhciBidWYyWzVdOwkJLyogTGl0ZXJhbCBmb3Igc2Vjb25kIG9wZXJhbmQgKi8KLSAgZXhwcmVzc2lvblMgZTsJCS8qIFBhcnNlZCBleHByZXNzaW9uICovCi0KLQotICBhcmdbM10gPSBOVUxMOwkJLyogU28gd2UgY2FuIHRlbGwgYXQgdGhlIGVuZCBpZiBpdCBnb3QgdXNlZCBvciBub3QgKi8KLQotICBwYXJzZV9leHByIChhcmdbMV0sICZlKTsKLSAgc3dpdGNoIChlLlhfb3ApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBXZSdyZSBkZXBlbmRlbnQgb24gb25lIG9yIG1vcmUgc3ltYm9scyAtLSB1c2UgImxkYSIgKi8KLSAgICAgIGFyZ1swXSA9ICJsZGEiOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgICAvKiBUcnkgdGhlIGZvbGxvd2luZyBtYXBwaW5nczoKLSAgICAgICAqICAgICAgbGRjb25zdCAwLDxyZWc+ICAtPm1vdiAgMCw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgMzEsPHJlZz4gLT5tb3YgIDMxLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCAzMiw8cmVnPiAtPmFkZG8gMSwzMSw8cmVnPgotICAgICAgICogICAgICAgIGxkY29uc3QgNjIsPHJlZz4gLT5hZGRvIDMxLDMxLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCA2NCw8cmVnPiAtPnNobG8gOCwzLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCAtMSw8cmVnPiAtPnN1Ym8gMSwwLDxyZWc+Ci0gICAgICAgKiAgICAgICAgbGRjb25zdCAtMzEsPHJlZz4tPnN1Ym8gMzEsMCw8cmVnPgotICAgICAgICoKLSAgICAgICAqIGFudGhpbmcgZWxzZSBiZWNvbWVzOgotICAgICAgICogICAgICAgIGxkYSB4eHgsPHJlZz4KLSAgICAgICAqLwotICAgICAgbiA9IG9mZnMgKGUpOwotICAgICAgaWYgKCgwIDw9IG4pICYmIChuIDw9IDMxKSkKLQl7Ci0JICBhcmdbMF0gPSAibW92IjsKLQotCX0KLSAgICAgIGVsc2UgaWYgKCgtMzEgPD0gbikgJiYgKG4gPD0gLTEpKQotCXsKLQkgIGFyZ1swXSA9ICJzdWJvIjsKLQkgIGFyZ1szXSA9IGFyZ1syXTsKLQkgIHNwcmludGYgKGJ1ZiwgIiVkIiwgLW4pOwotCSAgYXJnWzFdID0gYnVmOwotCSAgYXJnWzJdID0gIjAiOwotCi0JfQotICAgICAgZWxzZSBpZiAoKDMyIDw9IG4pICYmIChuIDw9IDYyKSkKLQl7Ci0JICBhcmdbMF0gPSAiYWRkbyI7Ci0JICBhcmdbM10gPSBhcmdbMl07Ci0JICBhcmdbMV0gPSAiMzEiOwotCSAgc3ByaW50ZiAoYnVmLCAiJWQiLCBuIC0gMzEpOwotCSAgYXJnWzJdID0gYnVmOwotCi0JfQotICAgICAgZWxzZSBpZiAoKHNoaWZ0ID0gc2hpZnRfb2sgKG4pKSAhPSAwKQotCXsKLQkgIGFyZ1swXSA9ICJzaGxvIjsKLQkgIGFyZ1szXSA9IGFyZ1syXTsKLQkgIHNwcmludGYgKGJ1ZiwgIiVkIiwgc2hpZnQpOwotCSAgYXJnWzFdID0gYnVmOwotCSAgc3ByaW50ZiAoYnVmMiwgIiVkIiwgbiA+PiBzaGlmdCk7Ci0JICBhcmdbMl0gPSBidWYyOwotCi0JfQotICAgICAgZWxzZQotCXsKLQkgIGFyZ1swXSA9ICJsZGEiOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX2lsbGVnYWw6Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgY29uc3RhbnQiKSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiAoYXJnWzNdID09IDApID8gMiA6IDM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfbWVtb3A6CXBhcnNlIGEgbWVtb3J5IG9wZXJhbmQKLQotICAJVGhpcyByb3V0aW5lIGlzIGJhc2VkIG9uIHRoZSBvYnNlcnZhdGlvbiB0aGF0IHRoZSA0IG1vZGUgYml0cyBvZiB0aGUKLSAgCU1FTUIgZm9ybWF0LCB0YWtlbiBpbmRpdmlkdWFsbHksIGhhdmUgZmFpcmx5IGNvbnNpc3RlbnQgbWVhbmluZzoKLQotICAJCSBNMyAoYml0IDEzKTogMSBpZiBkaXNwbGFjZW1lbnQgaXMgcHJlc2VudCAoRF9CSVQpCi0gIAkJIE0yIChiaXQgMTIpOiAxIGZvciBNRU1CIGluc3RydWN0aW9ucyAoTUVNQl9CSVQpCi0gIAkJIE0xIChiaXQgMTEpOiAxIGlmIGluZGV4IGlzIHByZXNlbnQgKElfQklUKQotICAJCSBNMCAoYml0IDEwKTogMSBpZiBhYmFzZSBpcyBwcmVzZW50IChBX0JJVCkKLQotICAJU28gd2UgcGFyc2UgdGhlIG1lbW9yeSBvcGVyYW5kIGFuZCBzZXQgYml0cyBpbiB0aGUgbW9kZSBhcyB3ZSBmaW5kCi0gIAl0aGluZ3MuICBUaGVuIGF0IHRoZSBlbmQsIGlmIHdlIGdvIHRvIE1FTUIgZm9ybWF0LCB3ZSBuZWVkIG9ubHkgc2V0Ci0gIAl0aGUgTUVNQiBiaXQgKE0yKSBhbmQgb3VyIG1vZGUgaXMgYnVpbHQgZm9yIHVzLgotCi0gIAlVbmZvcnR1bmF0ZWx5LCBJIHNhaWQgImZhaXJseSBjb25zaXN0ZW50Ii4gIFRoZSBleGNlcHRpb25zOgotCi0gIAkJIERCSUEKLSAgCQkgMDEwMAlXb3VsZCBzZWVtIGlsbGVnYWwsIGJ1dCBtZWFucyAiYWJhc2Utb25seSIuCi0KLSAgCQkgMDEwMQlXb3VsZCBzZWVtIHRvIG1lYW4gImFiYXNlLW9ubHkiIC0tIGl0IG1lYW5zIElQLXJlbGF0aXZlLgotICAJCQlNdXN0IGJlIGNvbnZlcnRlZCB0byAwMTAwLgotCi0gIAkJIDAxMTAJV291bGQgc2VlbSB0byBtZWFuICJpbmRleC1vbmx5IiwgYnV0IGlzIHJlc2VydmVkLgotICAJCQlXZSB0dXJuIG9uIHRoZSBEIGJpdCBhbmQgcHJvdmlkZSBhIDAgZGlzcGxhY2VtZW50LgotCi0gIAlUaGUgb3RoZXIgdGhpbmcgdG8gb2JzZXJ2ZSBpcyB0aGF0IHdlIHBhcnNlIGZyb20gdGhlIHJpZ2h0LCBwZWVsaW5nCi0gIAl0aGluZ3MgKiBvZmYgYXMgd2UgZ286ICBmaXJzdCBhbnkgaW5kZXggc3BlYywgdGhlbiBhbnkgYWJhc2UsIHRoZW4KLSAgCXRoZSBkaXNwbGFjZW1lbnQuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLXZvaWQKLXBhcnNlX21lbW9wIChtZW1QLCBhcmdQLCBvcHR5cGUpCi0gICAgIG1lbVMgKm1lbVA7CQkvKiBXaGVyZSB0byBwdXQgdGhlIHJlc3VsdHMgKi8KLSAgICAgY2hhciAqYXJnUDsJCS8qIFRleHQgb2YgdGhlIG9wZXJhbmQgdG8gYmUgcGFyc2VkICovCi0gICAgIGludCBvcHR5cGU7CQkvKiBNRU0xLCBNRU0yLCBNRU00LCBNRU04LCBNRU0xMiwgb3IgTUVNMTYgKi8KLXsKLSAgY2hhciAqaW5kZXhQOwkJCS8qIFBvaW50ZXIgdG8gaW5kZXggc3BlY2lmaWNhdGlvbiB3aXRoICJbXSIgcmVtb3ZlZCAqLwotICBjaGFyICpwOwkJCS8qIFRlbXAgY2hhciBwb2ludGVyICovCi0gIGNoYXIgaXByZWxfZmxhZzsJCS8qIFRydWUgaWYgdGhpcyBpcyBhbiBJUC1yZWxhdGl2ZSBvcGVyYW5kICovCi0gIGludCByZWdudW07CQkJLyogUmVnaXN0ZXIgbnVtYmVyICovCi0gIC8qIFNjYWxlIGZhY3RvcjogMSwyLDQsOCwgb3IgMTYuICBMYXRlciBjb252ZXJ0ZWQgdG8gaW50ZXJuYWwgZm9ybWF0Ci0gICAgICgwLDEsMiwzLDQgcmVzcGVjdGl2ZWx5KS4gICovCi0gIGludCBzY2FsZTsKLSAgaW50IG1vZGU7CQkJLyogTUVNQiBtb2RlIGJpdHMgKi8KLSAgaW50ICppbnRQOwkJCS8qIFBvaW50ZXIgdG8gcmVnaXN0ZXIgbnVtYmVyICovCi0KLSAgLyogVGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyB0aGUgZGVmYXVsdCBzY2FsZSBmYWN0b3JzIGZvciBlYWNoCi0gICAgIHR5cGUgb2YgbWVtb3J5IGluc3RydWN0aW9uLiAgSXQgaXMgYWNjZXNzZWQgdXNpbmcgKG9wdHlwZS1NRU0xKQotICAgICBhcyBhbiBpbmRleCAtLSB0aHVzIGl0IGFzc3VtZXMgdGhlICdvcHR5cGUnIGNvbnN0YW50cyBhcmUKLSAgICAgYXNzaWduZWQgY29uc2VjdXRpdmUgdmFsdWVzLCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhpcwotICAgICB0YWJsZS4gICovCi0gIHN0YXRpYyBjb25zdCBpbnQgZGVmX3NjYWxlW10gPQotICB7Ci0gICAgMSwJCQkJLyogTUVNMSAqLwotICAgIDIsCQkJCS8qIE1FTTIgKi8KLSAgICA0LAkJCQkvKiBNRU00ICovCi0gICAgOCwJCQkJLyogTUVNOCAqLwotICAgIC0xLAkJCQkvKiBNRU0xMiAtLSBubyB2YWxpZCBkZWZhdWx0ICovCi0gICAgMTYJCQkJLyogTUVNMTYgKi8KLSAgfTsKLQotCi0gIGlwcmVsX2ZsYWcgPSBtb2RlID0gMDsKLQotICAvKiBBbnkgaW5kZXggcHJlc2VudD8gKi8KLSAgaW5kZXhQID0gZ2V0X2lzcGVjIChhcmdQKTsKLSAgaWYgKGluZGV4UCkKLSAgICB7Ci0gICAgICBwID0gc3RyY2hyIChpbmRleFAsICcqJyk7Ci0gICAgICBpZiAocCA9PSBOVUxMKQotCXsKLQkgIC8qIE5vIGV4cGxpY2l0IHNjYWxlIC0tIHVzZSBkZWZhdWx0IGZvciB0aGlzIGluc3RydWN0aW9uCi0JICAgICB0eXBlIGFuZCBhc3NlbWJsZXIgbW9kZS4gICovCi0JICBpZiAoZmxhZ19tcmkpCi0JICAgIHNjYWxlID0gMTsKLQkgIGVsc2UKLQkgICAgLyogR05VOTYwIGNvbXBhdGliaWxpdHkgKi8KLQkgICAgc2NhbGUgPSBkZWZfc2NhbGVbb3B0eXBlIC0gTUVNMV07Ci0JfQotICAgICAgZWxzZQotCXsKLQkgICpwKysgPSAnXDAnOwkJLyogRWxpbWluYXRlICcqJyAqLwotCi0JICAvKiBOb3cgaW5kZXhQLT5hICdcMCctdGVybWluYXRlZCByZWdpc3RlciBuYW1lLAotCSAgICAgKiBhbmQgcC0+YSBzY2FsZSBmYWN0b3IuCi0JICAgKi8KLQotCSAgaWYgKCFzdHJjbXAgKHAsICIxNiIpKQotCSAgICB7Ci0JICAgICAgc2NhbGUgPSAxNjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY2hyICgiMTI0OCIsICpwKSAmJiAocFsxXSA9PSAnXDAnKSkKLQkgICAgewotCSAgICAgIHNjYWxlID0gKnAgLSAnMCc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNjYWxlID0gLTE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJlZ251bSA9IGdldF9yZWdudW0gKGluZGV4UCk7CS8qIEdldCBpbmRleCByZWcuICMgKi8KLSAgICAgIGlmICghSVNfUkdfUkVHIChyZWdudW0pKQotCXsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBpbmRleCByZWdpc3RlciIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIENvbnZlcnQgc2NhbGUgdG8gaXRzIGJpbmFyeSBlbmNvZGluZyAqLwotICAgICAgc3dpdGNoIChzY2FsZSkKLQl7Ci0JY2FzZSAxOgotCSAgc2NhbGUgPSAwIDw8IDc7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBzY2FsZSA9IDEgPDwgNzsKLQkgIGJyZWFrOwotCWNhc2UgNDoKLQkgIHNjYWxlID0gMiA8PCA3OwotCSAgYnJlYWs7Ci0JY2FzZSA4OgotCSAgc2NhbGUgPSAzIDw8IDc7Ci0JICBicmVhazsKLQljYXNlIDE2OgotCSAgc2NhbGUgPSA0IDw8IDc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYXNfYmFkIChfKCJpbnZhbGlkIHNjYWxlIGZhY3RvciIpKTsKLQkgIHJldHVybjsKLQl9OwotCi0gICAgICBtZW1QLT5vcGNvZGUgfD0gc2NhbGUgfCByZWdudW07CS8qIFNldCBpbmRleCBiaXRzIGluIG9wY29kZSAqLwotICAgICAgbW9kZSB8PSBJX0JJVDsJCS8qIEZvdW5kIGEgdmFsaWQgaW5kZXggc3BlYyAqLwotICAgIH0KLQotICAvKiBBbnkgYWJhc2UgKFJlZ2lzdGVyIEluZGlyZWN0KSBzcGVjaWZpY2F0aW9uIHByZXNlbnQ/ICovCi0gIGlmICgocCA9IHN0cnJjaHIgKGFyZ1AsICcoJykpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogIigiIGlzIHRoZXJlIC0tIGRvZXMgaXQgc3RhcnQgYSBsZWdhbCBhYmFzZSBzcGVjPyAgSWYgbm90LCBpdAotICAgICAgICAgY291bGQgYmUgcGFydCBvZiBhIGRpc3BsYWNlbWVudCBleHByZXNzaW9uLiAgKi8KLSAgICAgIGludFAgPSAoaW50ICopIGhhc2hfZmluZCAoYXJlZ19oYXNoLCBwKTsKLSAgICAgIGlmIChpbnRQICE9IE5VTEwpCi0JewotCSAgLyogR290IGFuIGFiYXNlIGhlcmUgKi8KLQkgIHJlZ251bSA9ICppbnRQOwotCSAgKnAgPSAnXDAnOwkJLyogZGlzY2FyZCByZWdpc3RlciBzcGVjICovCi0JICBpZiAocmVnbnVtID09IElQUkVMKQotCSAgICB7Ci0JICAgICAgLyogV2UgaGF2ZSB0byBzcGVjaWFsY2FzZSBpcC1yZWwgbW9kZSAqLwotCSAgICAgIGlwcmVsX2ZsYWcgPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZW1QLT5vcGNvZGUgfD0gcmVnbnVtIDw8IDE0OwotCSAgICAgIG1vZGUgfD0gQV9CSVQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEFueSBleHByZXNzaW9uIHByZXNlbnQ/ICovCi0gIG1lbVAtPmUgPSBhcmdQOwotICBpZiAoKmFyZ1AgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBtb2RlIHw9IERfQklUOwotICAgIH0KLQotICAvKiBTcGVjaWFsLWNhc2UgaXAtcmVsYXRpdmUgYWRkcmVzc2luZyAqLwotICBpZiAoaXByZWxfZmxhZykKLSAgICB7Ci0gICAgICBpZiAobW9kZSAmIElfQklUKQotCXsKLQkgIHN5bnRheCAoKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtUC0+b3Bjb2RlIHw9IDUgPDwgMTA7CS8qIElQLXJlbGF0aXZlIG1vZGUgKi8KLQkgIG1lbVAtPmRpc3AgPSAzMjsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBhbGwgb3RoZXIgbW9kZXMgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBjYXNlIERfQklUIHwgQV9CSVQ6Ci0gICAgICAvKiBHbyB3aXRoIE1FTUEgaW5zdHJ1Y3Rpb24gZm9ybWF0IGZvciBub3cgKGdyb3cgdG8gTUVNQiBsYXRlcgotICAgICAgICAgaWYgMTIgYml0cyBpcyBub3QgZW5vdWdoIGZvciB0aGUgZGlzcGxhY2VtZW50KS4gIE1FTUEgZm9ybWF0Ci0gICAgICAgICBoYXMgYSBzaW5nbGUgbW9kZSBiaXQ6IHNldCBpdCB0byBpbmRpY2F0ZSB0aGF0IGFiYXNlIGlzCi0gICAgICAgICBwcmVzZW50LiAgKi8KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBNRU1BX0FCQVNFOwotICAgICAgbWVtUC0+ZGlzcCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERfQklUOgotICAgICAgLyogR28gd2l0aCBNRU1BIGluc3RydWN0aW9uIGZvcm1hdCBmb3Igbm93IChncm93IHRvIE1FTUIgbGF0ZXIKLSAgICAgICAgIGlmIDEyIGJpdHMgaXMgbm90IGVub3VnaCBmb3IgdGhlIGRpc3BsYWNlbWVudCkuICAqLwotICAgICAgbWVtUC0+ZGlzcCA9IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFfQklUOgotICAgICAgLyogRm9yIHNvbWUgcmVhc29uLCB0aGUgYml0IHN0cmluZyBmb3IgdGhpcyBtb2RlIGlzIG5vdAotICAgICAgICAgY29uc2lzdGVudDogaXQgc2hvdWxkIGJlIDAgKGV4Y2x1c2l2ZSBvZiB0aGUgTUVNQiBiaXQpLCBzbyB3ZQotICAgICAgICAgc2V0IGl0ICJieSBoYW5kIiBoZXJlLiAgKi8KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBNRU1CX0JJVDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBX0JJVCB8IElfQklUOgotICAgICAgLyogc2V0IE1FTUIgYml0IGluIG1vZGUsIGFuZCBPUiBpbiBtb2RlIGJpdHMgKi8KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBtb2RlIHwgTUVNQl9CSVQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSV9CSVQ6Ci0gICAgICAvKiBUcmVhdCBtaXNzaW5nIGRpc3BsYWNlbWVudCBhcyBkaXNwbGFjZW1lbnQgb2YgMC4gICovCi0gICAgICBtb2RlIHw9IERfQklUOwotICAgICAgLyogRmFsbCBpbnRvIG5leHQgY2FzZS4gICovCi0gICAgY2FzZSBEX0JJVCB8IEFfQklUIHwgSV9CSVQ6Ci0gICAgY2FzZSBEX0JJVCB8IElfQklUOgotICAgICAgLyogc2V0IE1FTUIgYml0IGluIG1vZGUsIGFuZCBPUiBpbiBtb2RlIGJpdHMgKi8KLSAgICAgIG1lbVAtPm9wY29kZSB8PSBtb2RlIHwgTUVNQl9CSVQ7Ci0gICAgICBtZW1QLT5kaXNwID0gMzI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzeW50YXggKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgcGFyc2VfcG86CXBhcnNlIG1hY2hpbmUtZGVwZW5kZW50IHBzZXVkby1vcAotCi0gIAlUaGlzIGlzIGEgdG9wLWxldmVsIHJvdXRpbmUgZm9yIG1hY2hpbmUtZGVwZW5kZW50IHBzZXVkby1vcHMuICBJdCBzbHVycHMKLSAgCXVwIHRoZSByZXN0IG9mIHRoZSBpbnB1dCBsaW5lLCBicmVha3Mgb3V0IHRoZSBpbmRpdmlkdWFsIGFyZ3VtZW50cywKLSAgCWFuZCBkaXNwYXRjaGVzIHRoZW0gdG8gdGhlIGNvcnJlY3QgaGFuZGxlci4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLXZvaWQKLXBhcnNlX3BvIChwb19udW0pCi0gICAgIGludCBwb19udW07CQkvKiBQc2V1ZG8tb3AgbnVtYmVyOiAgY3VycmVudGx5IFNfTEVBRlBST0Mgb3IgU19TWVNQUk9DICovCi17Ci0gIC8qIFBvaW50ZXJzIG9wZXJhbmRzLCB3aXRoIG5vIGVtYmVkZGVkIHdoaXRlc3BhY2UuCi0gICAgIGFyZ1swXSB1bnVzZWQsIGFyZ1sxLTNdLT5vcGVyYW5kcyAqLwotICBjaGFyICphcmdzWzRdOwotICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gIGNoYXIgKnA7CQkJLyogUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdW5wYXJzZWQgYXJndW1lbnQgc3RyaW5nICovCi0gIGNoYXIgZW9sOwkJCS8qIENoYXJhY3RlciB0aGF0IGluZGljYXRlZCBlbmQgb2YgbGluZSAqLwotCi0gIGV4dGVybiBjaGFyIGlzX2VuZF9vZl9saW5lW107Ci0KLSAgLyogQWR2YW5jZSBpbnB1dCBwb2ludGVyIHRvIGVuZCBvZiBsaW5lLiAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVvbCA9ICppbnB1dF9saW5lX3BvaW50ZXI7CS8qIFNhdmUgZW5kLW9mLWxpbmUgY2hhciAqLwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsJLyogVGVybWluYXRlIGFyZ3VtZW50IGxpc3QgKi8KLQotICAvKiBQYXJzZSBvdXQgb3BlcmFuZHMgKi8KLSAgbl9vcHMgPSBnZXRfYXJncyAocCwgYXJncyk7Ci0gIGlmIChuX29wcyA9PSAtMSkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIERpc3BhdGNoIHRvIGNvcnJlY3QgaGFuZGxlciAqLwotICBzd2l0Y2ggKHBvX251bSkKLSAgICB7Ci0gICAgY2FzZSBTX1NZU1BST0M6Ci0gICAgICBzX3N5c3Byb2MgKG5fb3BzLCBhcmdzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU19MRUFGUFJPQzoKLSAgICAgIHNfbGVhZnByb2MgKG5fb3BzLCBhcmdzKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAocG9fbnVtKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBSZXN0b3JlIGVvbCwgc28gbGluZSBudW1iZXJzIGdldCB1cGRhdGVkIGNvcnJlY3RseS4gIEJhc2UKLSAgICAgYXNzZW1ibGVyIGFzc3VtZXMgd2UgbGVhdmUgaW5wdXQgcG9pbnRlciBwb2ludGluZyBhdCBjaGFyCi0gICAgIGZvbGxvd2luZyB0aGUgZW9sLiAgKi8KLSAgKmlucHV0X2xpbmVfcG9pbnRlcisrID0gZW9sOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHBhcnNlX3JlZ29wOiBwYXJzZSBhIHJlZ2lzdGVyIG9wZXJhbmQuCi0KLSAgCUluIGNhc2Ugb2YgaWxsZWdhbCBvcGVyYW5kLCBpc3N1ZSBhIG1lc3NhZ2UgYW5kIHJldHVybiBzb21lIHZhbGlkCi0gIAlpbmZvcm1hdGlvbiBzbyBpbnN0cnVjdGlvbiBwcm9jZXNzaW5nIGNhbiBjb250aW51ZS4KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMKLXZvaWQKLXBhcnNlX3JlZ29wIChyZWdvcFAsIG9wdGV4dCwgb3BkZXNjKQotICAgICBzdHJ1Y3QgcmVnb3AgKnJlZ29wUDsJLyogV2hlcmUgdG8gcHV0IGRlc2NyaXB0aW9uIG9mIHJlZ2lzdGVyIG9wZXJhbmQgKi8KLSAgICAgY2hhciAqb3B0ZXh0OwkJLyogVGV4dCBvZiBvcGVyYW5kICovCi0gICAgIGNoYXIgb3BkZXNjOwkJLyogRGVzY3JpcHRvciBieXRlOiAgd2hhdCdzIGxlZ2FsIGZvciB0aGlzIG9wZXJhbmQgKi8KLXsKLSAgaW50IG47CQkJLyogUmVnaXN0ZXIgbnVtYmVyICovCi0gIGV4cHJlc3Npb25TIGU7CQkvKiBQYXJzZWQgZXhwcmVzc2lvbiAqLwotCi0gIC8qIFNlZSBpZiBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIgKi8KLSAgbiA9IGdldF9yZWdudW0gKG9wdGV4dCk7Ci0gIGlmIChuID49IDApCi0gICAgewotICAgICAgaWYgKElTX1JHX1JFRyAobikpCi0JewotCSAgLyogZ2xvYmFsIG9yIGxvY2FsIHJlZ2lzdGVyICovCi0JICBpZiAoIVJFR19BTElHTiAob3BkZXNjLCBuKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygidW5hbGlnbmVkIHJlZ2lzdGVyIikpOwotCSAgICB9Ci0JICByZWdvcFAtPm4gPSBuOwotCSAgcmVnb3BQLT5tb2RlID0gMDsKLQkgIHJlZ29wUC0+c3BlY2lhbCA9IDA7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoSVNfRlBfUkVHIChuKSAmJiBGUF9PSyAob3BkZXNjKSkKLQl7Ci0JICAvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciwgYW5kIGl0J3MgYWxsb3dlZCAqLwotCSAgcmVnb3BQLT5uID0gbiAtIEZQMDsKLQkgIHJlZ29wUC0+bW9kZSA9IDE7Ci0JICByZWdvcFAtPnNwZWNpYWwgPSAwOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKElTX1NGX1JFRyAobikgJiYgU0ZSX09LIChvcGRlc2MpKQotCXsKLQkgIC8qIFNwZWNpYWwtZnVuY3Rpb24gcmVnaXN0ZXIsIGFuZCBpdCdzIGFsbG93ZWQgKi8KLQkgIHJlZ29wUC0+biA9IG4gLSBTRjA7Ci0JICByZWdvcFAtPm1vZGUgPSAwOwotCSAgcmVnb3BQLT5zcGVjaWFsID0gMTsKLQkgIGlmICghdGFyZ19oYXNfc2ZyIChyZWdvcFAtPm4pKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJubyBzdWNoIHNmciBpbiB0aGlzIGFyY2hpdGVjdHVyZSIpKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKExJVF9PSyAob3BkZXNjKSkKLSAgICB7Ci0gICAgICAvKiBIb3cgYWJvdXQgYSBsaXRlcmFsPyAgKi8KLSAgICAgIHJlZ29wUC0+bW9kZSA9IDE7Ci0gICAgICByZWdvcFAtPnNwZWNpYWwgPSAwOwotICAgICAgaWYgKEZQX09LIChvcGRlc2MpKQotCXsJCQkvKiBmbG9hdGluZyBwb2ludCBsaXRlcmFsIGFjY2VwdGFibGUgKi8KLQkgIC8qIFNraXAgb3ZlciAwZiwgMGQsIG9yIDBlIHByZWZpeCAqLwotCSAgaWYgKChvcHRleHRbMF0gPT0gJzAnKQotCSAgICAgICYmIChvcHRleHRbMV0gPj0gJ2QnKQotCSAgICAgICYmIChvcHRleHRbMV0gPD0gJ2YnKSkKLQkgICAgewotCSAgICAgIG9wdGV4dCArPSAyOwotCSAgICB9Ci0KLQkgIGlmICghc3RyY21wIChvcHRleHQsICIwLjAiKSB8fCAhc3RyY21wIChvcHRleHQsICIwIikpCi0JICAgIHsKLQkgICAgICByZWdvcFAtPm4gPSAweDEwOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgaWYgKCFzdHJjbXAgKG9wdGV4dCwgIjEuMCIpIHx8ICFzdHJjbXAgKG9wdGV4dCwgIjEiKSkKLQkgICAgewotCSAgICAgIHJlZ29wUC0+biA9IDB4MTY7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0KLQl9Ci0gICAgICBlbHNlCi0JewkJCS8qIGZpeGVkIHBvaW50IGxpdGVyYWwgYWNjZXB0YWJsZSAqLwotCSAgcGFyc2VfZXhwciAob3B0ZXh0LCAmZSk7Ci0JICBpZiAoZS5YX29wICE9IE9fY29uc3RhbnQKLQkgICAgICB8fCAob2ZmcyAoZSkgPCAwKSB8fCAob2ZmcyAoZSkgPiAzMSkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImlsbGVnYWwgbGl0ZXJhbCIpKTsKLQkgICAgICBvZmZzIChlKSA9IDA7Ci0JICAgIH0KLQkgIHJlZ29wUC0+biA9IG9mZnMgKGUpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogTm90aGluZyB3b3JrZWQgKi8KLSAgc3ludGF4ICgpOwotICByZWdvcFAtPm1vZGUgPSAwOwkJLyogUmVnaXN0ZXIgcjAgaXMgYWx3YXlzIGEgZ29vZCBvbmUgKi8KLSAgcmVnb3BQLT5uID0gMDsKLSAgcmVnb3BQLT5zcGVjaWFsID0gMDsKLX0JCQkJLyogcGFyc2VfcmVnb3AoKSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHJlZ19mbXQ6CWdlbmVyYXRlIGEgUkVHLWZvcm1hdCBpbnN0cnVjdGlvbgotCi0gICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotc3RhdGljIHZvaWQKLXJlZ19mbXQgKGFyZ3MsIG9QKQotICAgICBjaGFyICphcmdzW107CQkvKiBhcmdzWzBdLT5vcGNvZGUgbW5lbW9uaWMsIGFyZ3NbMS0zXS0+b3BlcmFuZHMgKi8KLSAgICAgc3RydWN0IGk5NjBfb3Bjb2RlICpvUDsJLyogUG9pbnRlciB0byBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbiAqLwotewotICBsb25nIGluc3RyOwkJCS8qIEJpbmFyeSB0byBiZSBvdXRwdXQgKi8KLSAgc3RydWN0IHJlZ29wIHJlZ29wOwkJLyogRGVzY3JpcHRpb24gb2YgcmVnaXN0ZXIgb3BlcmFuZCAqLwotICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0KLQotICBpbnN0ciA9IG9QLT5vcGNvZGU7Ci0gIG5fb3BzID0gb1AtPm51bV9vcHM7Ci0KLSAgaWYgKG5fb3BzID49IDEpCi0gICAgewotICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnc1sxXSwgb1AtPm9wZXJhbmRbMF0pOwotCi0gICAgICBpZiAoKG5fb3BzID09IDEpICYmICEoaW5zdHIgJiBNMykpCi0JewotCSAgLyogMS1vcGVyYW5kIGluc3RydWN0aW9uIGluIHdoaWNoIHRoZSBkc3QgZmllbGQgc2hvdWxkCi0JICAgICAqIGJlIHVzZWQgKGluc3RlYWQgb2Ygc3JjMSkuCi0JICAgKi8KLQkgIHJlZ29wLm4gPDw9IDE5OwotCSAgaWYgKHJlZ29wLnNwZWNpYWwpCi0JICAgIHsKLQkgICAgICByZWdvcC5tb2RlID0gcmVnb3Auc3BlY2lhbDsKLQkgICAgfQotCSAgcmVnb3AubW9kZSA8PD0gMTM7Ci0JICByZWdvcC5zcGVjaWFsID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogcmVnb3AubiBnb2VzIGluIGJpdCAwLCBuZWVkcyBubyBzaGlmdGluZyAqLwotCSAgcmVnb3AubW9kZSA8PD0gMTE7Ci0JICByZWdvcC5zcGVjaWFsIDw8PSA1OwotCX0KLSAgICAgIGluc3RyIHw9IHJlZ29wLm4gfCByZWdvcC5tb2RlIHwgcmVnb3Auc3BlY2lhbDsKLSAgICB9Ci0KLSAgaWYgKG5fb3BzID49IDIpCi0gICAgewotICAgICAgcGFyc2VfcmVnb3AgKCZyZWdvcCwgYXJnc1syXSwgb1AtPm9wZXJhbmRbMV0pOwotCi0gICAgICBpZiAoKG5fb3BzID09IDIpICYmICEoaW5zdHIgJiBNMykpCi0JewotCSAgLyogMi1vcGVyYW5kIGluc3RydWN0aW9uIGluIHdoaWNoIHRoZSBkc3QgZmllbGQgc2hvdWxkCi0JICAgICAqIGJlIHVzZWQgaW5zdGVhZCBvZiBzcmMyKS4KLQkgICAqLwotCSAgcmVnb3AubiA8PD0gMTk7Ci0JICBpZiAocmVnb3Auc3BlY2lhbCkKLQkgICAgewotCSAgICAgIHJlZ29wLm1vZGUgPSByZWdvcC5zcGVjaWFsOwotCSAgICB9Ci0JICByZWdvcC5tb2RlIDw8PSAxMzsKLQkgIHJlZ29wLnNwZWNpYWwgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICByZWdvcC5uIDw8PSAxNDsKLQkgIHJlZ29wLm1vZGUgPDw9IDEyOwotCSAgcmVnb3Auc3BlY2lhbCA8PD0gNjsKLQl9Ci0gICAgICBpbnN0ciB8PSByZWdvcC5uIHwgcmVnb3AubW9kZSB8IHJlZ29wLnNwZWNpYWw7Ci0gICAgfQotICBpZiAobl9vcHMgPT0gMykKLSAgICB7Ci0gICAgICBwYXJzZV9yZWdvcCAoJnJlZ29wLCBhcmdzWzNdLCBvUC0+b3BlcmFuZFsyXSk7Ci0gICAgICBpZiAocmVnb3Auc3BlY2lhbCkKLQl7Ci0JICByZWdvcC5tb2RlID0gcmVnb3Auc3BlY2lhbDsKLQl9Ci0gICAgICBpbnN0ciB8PSAocmVnb3AubiA8PD0gMTkpIHwgKHJlZ29wLm1vZGUgPDw9IDEzKTsKLSAgICB9Ci0gIGVtaXQgKGluc3RyKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIHJlbGF4X2NvYnI6Ci0gIAlSZXBsYWNlIGNvYnIgaW5zdHJ1Y3Rpb24gaW4gYSBjb2RlIGZyYWdtZW50IHdpdGggZXF1aXZhbGVudCBicmFuY2ggYW5kCi0gIAljb21wYXJlIGluc3RydWN0aW9ucywgc28gaXQgY2FuIHJlYWNoIGJleW9uZCBhIDEzLWJpdCBkaXNwbGFjZW1lbnQuCi0gIAlTZXQgdXAgYW4gYWRkcmVzcyBmaXgvcmVsb2NhdGlvbiBmb3IgdGhlIG5ldyBicmFuY2ggaW5zdHJ1Y3Rpb24uCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi0KLS8qIFRoaXMgImNvbmRpdGlvbmFsIGp1bXAiIHRhYmxlIG1hcHMgY29iciBpbnN0cnVjdGlvbnMgaW50bwotICAgZXF1aXZhbGVudCBjb21wYXJlIGFuZCBicmFuY2ggb3Bjb2Rlcy4gICovCi1zdGF0aWMgY29uc3QKLXN0cnVjdAotewotICBsb25nIGNvbXBhcmU7Ci0gIGxvbmcgYnJhbmNoOwotfQotCi1jb2pbXSA9Ci17CQkJCS8qIENPQlIgT1BDT0RFOiAqLwotICB7IENIS0JJVCwgQk5PIH0sCQkvKiAgICAgIDB4MzAgLSBiYmMgKi8KLSAgeyBDTVBPLCBCRyB9LAkJCS8qICAgICAgMHgzMSAtIGNtcG9iZyAqLwotICB7IENNUE8sIEJFIH0sCQkJLyogICAgICAweDMyIC0gY21wb2JlICovCi0gIHsgQ01QTywgQkdFIH0sCQkvKiAgICAgIDB4MzMgLSBjbXBvYmdlICovCi0gIHsgQ01QTywgQkwgfSwJCQkvKiAgICAgIDB4MzQgLSBjbXBvYmwgKi8KLSAgeyBDTVBPLCBCTkUgfSwJCS8qICAgICAgMHgzNSAtIGNtcG9ibmUgKi8KLSAgeyBDTVBPLCBCTEUgfSwJCS8qICAgICAgMHgzNiAtIGNtcG9ibGUgKi8KLSAgeyBDSEtCSVQsIEJPIH0sCQkvKiAgICAgIDB4MzcgLSBiYnMgKi8KLSAgeyBDTVBJLCBCTk8gfSwJCS8qICAgICAgMHgzOCAtIGNtcGlibm8gKi8KLSAgeyBDTVBJLCBCRyB9LAkJCS8qICAgICAgMHgzOSAtIGNtcGliZyAqLwotICB7IENNUEksIEJFIH0sCQkJLyogICAgICAweDNhIC0gY21waWJlICovCi0gIHsgQ01QSSwgQkdFIH0sCQkvKiAgICAgIDB4M2IgLSBjbXBpYmdlICovCi0gIHsgQ01QSSwgQkwgfSwJCQkvKiAgICAgIDB4M2MgLSBjbXBpYmwgKi8KLSAgeyBDTVBJLCBCTkUgfSwJCS8qICAgICAgMHgzZCAtIGNtcGlibmUgKi8KLSAgeyBDTVBJLCBCTEUgfSwJCS8qICAgICAgMHgzZSAtIGNtcGlibGUgKi8KLSAgeyBDTVBJLCBCTyB9LAkJCS8qICAgICAgMHgzZiAtIGNtcGlibyAqLwotfTsKLQotc3RhdGljCi12b2lkCi1yZWxheF9jb2JyIChmcmFnUCkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwkvKiBmcmFnUC0+ZnJfb3Bjb2RlIGlzIGFzc3VtZWQgdG8gcG9pbnQgdG8KLQkJCQkgKiB0aGUgY29iciBpbnN0cnVjdGlvbiwgd2hpY2ggY29tZXMgYXQgdGhlCi0JCQkJICogZW5kIG9mIHRoZSBjb2RlIGZyYWdtZW50LgotCQkJCSAqLwotewotICBpbnQgb3Bjb2RlLCBzcmMxLCBzcmMyLCBtMSwgczI7Ci0gIC8qIEJpdCBmaWVsZHMgZnJvbSBjb2JyIGluc3RydWN0aW9uICovCi0gIGxvbmcgYnBfYml0czsJCQkvKiBCcmFuY2ggcHJlZGljdGlvbiBiaXRzIGZyb20gY29iciBpbnN0cnVjdGlvbiAqLwotICBsb25nIGluc3RyOwkJCS8qIEEgc2luZ2xlIGk5NjAgaW5zdHJ1Y3Rpb24gKi8KLSAgLyogLT5pbnN0cnVjdGlvbiB0byBiZSByZXBsYWNlZCAqLwotICBjaGFyICppUDsKLSAgZml4UyAqZml4UDsJCQkvKiBSZWxvY2F0aW9uIHRoYXQgY2FuIGJlIGRvbmUgYXQgYXNzZW1ibHkgdGltZSAqLwotCi0gIC8qIFBJQ0sgVVAgJiBQQVJTRSBDT0JSIElOU1RSVUNUSU9OICovCi0gIGlQID0gZnJhZ1AtPmZyX29wY29kZTsKLSAgaW5zdHIgPSBtZF9jaGFyc190b19udW1iZXIgKGlQLCA0KTsKLSAgb3Bjb2RlID0gKChpbnN0ciA+PiAyNCkgJiAweGZmKSAtIDB4MzA7CS8qICItMHgzMCIgZm9yIHRhYmxlIGluZGV4ICovCi0gIHNyYzEgPSAoaW5zdHIgPj4gMTkpICYgMHgxZjsKLSAgbTEgPSAoaW5zdHIgPj4gMTMpICYgMTsKLSAgczIgPSBpbnN0ciAmIDE7Ci0gIHNyYzIgPSAoaW5zdHIgPj4gMTQpICYgMHgxZjsKLSAgYnBfYml0cyA9IGluc3RyICYgQlBfTUFTSzsKLQotICAvKiBHRU5FUkFURSBBTkQgT1VUUFVUIENPTVBBUkUgSU5TVFJVQ1RJT04gKi8KLSAgaW5zdHIgPSBjb2pbb3Bjb2RlXS5jb21wYXJlCi0gICAgfCBzcmMxIHwgKG0xIDw8IDExKSB8IChzMiA8PCA2KSB8IChzcmMyIDw8IDE0KTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChpUCwgaW5zdHIsIDQpOwotCi0gIC8qIE9VVFBVVCBCUkFOQ0ggSU5TVFJVQ1RJT04gKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChpUCArIDQsIGNvaltvcGNvZGVdLmJyYW5jaCB8IGJwX2JpdHMsIDQpOwotCi0gIC8qIFNFVCBVUCBBRERSRVNTIEZJWFVQL1JFTE9DQVRJT04gKi8KLSAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLAotCQkgIGlQICsgNCAtIGZyYWdQLT5mcl9saXRlcmFsLAotCQkgIDQsCi0JCSAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICBmcmFnUC0+ZnJfb2Zmc2V0LAotCQkgIDEsCi0JCSAgTk9fUkVMT0MpOwotCi0gIGZpeFAtPmZ4X2JpdF9maXhQID0gKGJpdF9maXhTICopIDI0OwkvKiBTdG9yZSBzaXplIG9mIGJpdCBmaWVsZCAqLwotCi0gIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgZnJhZ193YW5lIChmcmFnUCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICByZWxvY19jYWxsajoJUmVsb2NhdGUgYSAnY2FsbGonIGluc3RydWN0aW9uCi0KLSAgCVRoaXMgaXMgYSAibm9uLShHTlUpLXN0YW5kYXJkIiBtYWNoaW5lLWRlcGVuZGVudCBob29rLiAgVGhlIGJhc2UKLSAgCWFzc2VtYmxlciBjYWxscyBpdCB3aGVuIGl0IGRlY2lkZXMgaXQgY2FuIHJlbG9jYXRlIGFuIGFkZHJlc3MgYXQKLSAgCWFzc2VtYmx5IHRpbWUgaW5zdGVhZCBvZiBlbWl0dGluZyBhIHJlbG9jYXRpb24gZGlyZWN0aXZlLgotCi0gIAlDaGVjayB0byBzZWUgaWYgdGhlIHJlbG9jYXRpb24gaW52b2x2ZXMgYSAnY2FsbGonIGluc3RydWN0aW9uIHRvIGE6Ci0gIAkgICAgc3lzcHJvYzoJUmVwbGFjZSB0aGUgZGVmYXVsdCAnY2FsbCcgaW5zdHJ1Y3Rpb24gd2l0aCBhICdjYWxscycKLSAgCSAgICBsZWFmcHJvYzoJUmVwbGFjZSB0aGUgZGVmYXVsdCAnY2FsbCcgaW5zdHJ1Y3Rpb24gd2l0aCBhICdiYWwnLgotICAJICAgIG90aGVyIHByb2M6CURvIG5vdGhpbmcuCi0KLSAgCVNlZSBiLm91dC5oIGZvciBkZXRhaWxzIG9uIHRoZSAnbl9vdGhlcicgZmllbGQgaW4gYSBzeW1ib2wgc3RydWN0dXJlLgotCi0gICBJTVBPUlRBTlQhOgotICAJQXNzdW1lcyB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGZpZ3VyZWQgb3V0LCBpbiB0aGUgY2FzZSBvZiBhIGxlYWZwcm9jLAotICAJdG8gdXNlIHRoZSAnYmFsJyBlbnRyeSBwb2ludCwgYW5kIGhhcyBzdWJzdGl0dXRlZCB0aGF0IHN5bWJvbCBpbnRvIHRoZQotICAJcGFzc2VkIGZpeHVwIHN0cnVjdHVyZS4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXZvaWQKLXJlbG9jX2NhbGxqIChmaXhQKQotICAgICAvKiBSZWxvY2F0aW9uIHRoYXQgY2FuIGJlIGRvbmUgYXQgYXNzZW1ibHkgdGltZSAqLwotICAgICBmaXhTICpmaXhQOwotewotICAvKiBQb2ludHMgdG8gdGhlIGJpbmFyeSBmb3IgdGhlIGluc3RydWN0aW9uIGJlaW5nIHJlbG9jYXRlZC4gICovCi0gIGNoYXIgKndoZXJlOwotCi0gIGlmICghZml4UC0+ZnhfdGNiaXQpCi0gICAgewotICAgICAgLyogVGhpcyB3YXNuJ3QgYSBjYWxsaiBpbnN0cnVjdGlvbiBpbiB0aGUgZmlyc3QgcGxhY2UgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgd2hlcmUgPSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0KLSAgaWYgKFRDX1NfSVNfU1lTUFJPQyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFN5bWJvbCBpcyBhIC5zeXNwcm9jOiByZXBsYWNlICdjYWxsJyB3aXRoICdjYWxscycuICBTeXN0ZW0KLSAgICAgICAgIHByb2NlZHVyZSBudW1iZXIgaXMgKG90aGVyLTEpLiAgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsIENBTExTIHwgVENfU19HRVRfU1lTUFJPQyAoZml4UC0+ZnhfYWRkc3kpLCA0KTsKLQotICAgICAgLyogTm90aGluZyBlbHNlIG5lZWRzIHRvIGJlIGRvbmUgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICBNYWtlCi0gICAgICAgICBzdXJlICdtZF9udW1iZXJfdG9fZmllbGQoKScgd2lsbCBwZXJmb3JtIGEgbm8tb3AuICAqLwotICAgICAgZml4UC0+ZnhfYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgMTsKLQotICAgIH0KLSAgZWxzZSBpZiAoVENfU19JU19DQUxMTkFNRSAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuOiBzZWUgYmxvY2sgY29tbWVudCBhYm92ZSAqLwotICAgICAgYXNfZmF0YWwgKF8oIlRyeWluZyB0byAnYmFsJyB0byAlcyIpLCBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSkpOwotICAgIH0KLSAgZWxzZSBpZiAoVENfU19JU19CQUxOQU1FIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogUmVwbGFjZSAnY2FsbCcgd2l0aCAnYmFsJzsgYm90aCBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUgc2FtZQotICAgICAgICAgZm9ybWF0LCBzbyBjYWxsaW5nIGNvZGUgc2hvdWxkIGNvbXBsZXRlIHJlbG9jYXRpb24gYXMgaWYKLSAgICAgICAgIG5vdGhpbmcgaGFwcGVuZWQgaGVyZS4gICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLCBCQUwsIDQpOwotICAgIH0KLSAgZWxzZSBpZiAoVENfU19JU19CQURQUk9DIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJMb29rcyBsaWtlIGEgcHJvYywgYnV0IGNhbid0IHRlbGwgd2hhdCBraW5kLlxuIikpOwotICAgIH0JCQkJLyogc3dpdGNoIG9uIHByb2MgdHlwZSAqLwotCi0gIC8qIGVsc2UgU3ltYm9sIGlzIG5laXRoZXIgYSBzeXNwcm9jIG5vciBhIGxlYWZwcm9jICovCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBzX2xlYWZwcm9jOglwcm9jZXNzIC5sZWFmcHJvYyBwc2V1ZG8tb3AKLQotICAJLmxlYWZwcm9jIHRha2VzIHR3byBhcmd1bWVudHMsIHRoZSBzZWNvbmQgb25lIGlzIG9wdGlvbmFsOgotICAJCWFyZ1sxXTogbmFtZSBvZiAnY2FsbCcgZW50cnkgcG9pbnQgdG8gbGVhZiBwcm9jZWR1cmUKLSAgCQlhcmdbMl06IG5hbWUgb2YgJ2JhbCcgZW50cnkgcG9pbnQgdG8gbGVhZiBwcm9jZWR1cmUKLQotICAJSWYgdGhlIHR3byBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgb3IgaWYgdGhlIHNlY29uZCBvbmUgaXMgbWlzc2luZywKLSAgCXRoZSBmaXJzdCBhcmd1bWVudCBpcyB0YWtlbiB0byBiZSB0aGUgJ2JhbCcgZW50cnkgcG9pbnQuCi0KLSAgCUlmIHRoZXJlIGFyZSAyIGRpc3RpbmN0IGFyZ3VtZW50cywgd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgJ2JhbCcKLSAgCWVudHJ5IHBvaW50IGltbWVkaWF0ZWx5IGZvbGxvd3MgdGhlICdjYWxsJyBlbnRyeSBwb2ludCBpbiB0aGUgbGlua2VkCi0gIAlsaXN0IG9mIHN5bWJvbHMuCi0KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi1zdGF0aWMgdm9pZAotc19sZWFmcHJvYyAobl9vcHMsIGFyZ3MpCi0gICAgIGludCBuX29wczsJCQkvKiBOdW1iZXIgb2Ygb3BlcmFuZHMgKi8KLSAgICAgY2hhciAqYXJnc1tdOwkJLyogYXJnc1sxXS0+MXN0IG9wZXJhbmQsIGFyZ3NbMl0tPjJuZCBvcGVyYW5kICovCi17Ci0gIHN5bWJvbFMgKmNhbGxQOwkJLyogUG9pbnRlciB0byBsZWFmcHJvYyAnY2FsbCcgZW50cnkgcG9pbnQgc3ltYm9sICovCi0gIHN5bWJvbFMgKmJhbFA7CQkvKiBQb2ludGVyIHRvIGxlYWZwcm9jICdiYWwnIGVudHJ5IHBvaW50IHN5bWJvbCAqLwotCi0gIGlmICgobl9vcHMgIT0gMSkgJiYgKG5fb3BzICE9IDIpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic2hvdWxkIGhhdmUgMSBvciAyIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogQ2hlY2sgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotCi0gIC8qIEZpbmQgb3IgY3JlYXRlIHN5bWJvbCBmb3IgJ2NhbGwnIGVudHJ5IHBvaW50LiAqLwotICBjYWxsUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMV0pOwotCi0gIGlmIChUQ19TX0lTX0NBTExOQU1FIChjYWxsUCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiUmVkZWZpbmluZyBsZWFmcHJvYyAlcyIpLCBTX0dFVF9OQU1FIChjYWxsUCkpOwotICAgIH0JCQkJLyogaXMgbGVhZnByb2MgKi8KLQotICAvKiBJZiB0aGF0IHdhcyB0aGUgb25seSBhcmd1bWVudCwgdXNlIGl0IGFzIHRoZSAnYmFsJyBlbnRyeSBwb2ludC4KLSAgICAgKiBPdGhlcndpc2UsIG1hcmsgaXQgYXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCBhbmQgZmluZCBvciBjcmVhdGUKLSAgICAgKiBhbm90aGVyIHN5bWJvbCBmb3IgdGhlICdiYWwnIGVudHJ5IHBvaW50LgotICAgKi8KLSAgaWYgKChuX29wcyA9PSAxKSB8fCAhc3RyY21wIChhcmdzWzFdLCBhcmdzWzJdKSkKLSAgICB7Ci0gICAgICBUQ19TX0ZPUkNFX1RPX0JBTE5BTUUgKGNhbGxQKTsKLQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFRDX1NfRk9SQ0VfVE9fQ0FMTE5BTUUgKGNhbGxQKTsKLQotICAgICAgYmFsUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMl0pOwotICAgICAgaWYgKFRDX1NfSVNfQ0FMTE5BTUUgKGJhbFApKQotCXsKLQkgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiKSwgU19HRVRfTkFNRSAoYmFsUCkpOwotCX0KLSAgICAgIFRDX1NfRk9SQ0VfVE9fQkFMTkFNRSAoYmFsUCk7Ci0KLSNpZm5kZWYgT0JKX0VMRgotICAgICAgdGNfc2V0X2JhbF9vZl9jYWxsIChjYWxsUCwgYmFsUCk7Ci0jZW5kaWYKLSAgICB9CQkJCS8qIGlmIG9ubHkgb25lIGFyZywgb3IgdGhlIGFyZ3MgYXJlIHRoZSBzYW1lICovCi19Ci0KLQotLyoKLSAgIHNfc3lzcHJvYzogcHJvY2VzcyAuc3lzcHJvYyBwc2V1ZG8tb3AKLQotICAgICAgICAuc3lzcHJvYyB0YWtlcyB0d28gYXJndW1lbnRzOgotICAgICAgICAgICAgICAgIGFyZ1sxXTogbmFtZSBvZiBlbnRyeSBwb2ludCB0byBzeXN0ZW0gcHJvY2VkdXJlCi0gICAgICAgICAgICAgICAgYXJnWzJdOiAnZW50cnlfbnVtJyAoaW5kZXgpIG9mIHN5c3RlbSBwcm9jZWR1cmUgaW4gdGhlIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICBbMCwzMV0gaW5jbHVzaXZlLgotCi0gICAgICAgIEZvciBbYWJdLm91dCwgd2Ugc3RvcmUgdGhlICdlbnRyeW51bScgaW4gdGhlICduX290aGVyJyBmaWVsZCBvZgotICAgICAgICB0aGUgc3ltYm9sLiAgU2luY2UgdGhhdCBlbnRyeSBpcyBub3JtYWxseSAwLCB3ZSBiaWFzICdlbnRyeW51bScKLSAgICAgICAgYnkgYWRkaW5nIDEgdG8gaXQuICBJdCBtdXN0IGJlIHVuYmlhc2VkIGJlZm9yZSBpdCBpcyB1c2VkLiAgKi8KLXN0YXRpYyB2b2lkCi1zX3N5c3Byb2MgKG5fb3BzLCBhcmdzKQotICAgICBpbnQgbl9vcHM7CQkJLyogTnVtYmVyIG9mIG9wZXJhbmRzICovCi0gICAgIGNoYXIgKmFyZ3NbXTsJCS8qIGFyZ3NbMV0tPjFzdCBvcGVyYW5kLCBhcmdzWzJdLT4ybmQgb3BlcmFuZCAqLwotewotICBleHByZXNzaW9uUyBleHA7Ci0gIHN5bWJvbFMgKnN5bVA7Ci0KLSAgaWYgKG5fb3BzICE9IDIpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzaG91bGQgaGF2ZSB0d28gb3BlcmFuZHMiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQkJCQkvKiBiYWQgYXJnIGNvdW50ICovCi0KLSAgLyogUGFyc2UgImVudHJ5X251bSIgYXJndW1lbnQgYW5kIGNoZWNrIGl0IGZvciB2YWxpZGl0eS4gKi8KLSAgcGFyc2VfZXhwciAoYXJnc1syXSwgJmV4cCk7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCAob2ZmcyAoZXhwKSA8IDApCi0gICAgICB8fCAob2ZmcyAoZXhwKSA+IDMxKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIidlbnRyeV9udW0nIG11c3QgYmUgYWJzb2x1dGUgbnVtYmVyIGluIFswLDMxXSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRmluZC9tYWtlIHN5bWJvbCBhbmQgc3RpY2sgZW50cnkgbnVtYmVyIChiaWFzZWQgYnkgKzEpIGludG8gaXQgKi8KLSAgc3ltUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKGFyZ3NbMV0pOwotCi0gIGlmIChUQ19TX0lTX1NZU1BST0MgKHN5bVApKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIlJlZGVmaW5pbmcgZW50cnludW0gZm9yIHN5c3Byb2MgJXMiKSwgU19HRVRfTkFNRSAoc3ltUCkpOwotICAgIH0JCQkJLyogcmVkZWZpbmluZyAqLwotCi0gIFRDX1NfU0VUX1NZU1BST0MgKHN5bVAsIG9mZnMgKGV4cCkpOwkvKiBlbmNvZGUgZW50cnkgbnVtYmVyICovCi0gIFRDX1NfRk9SQ0VfVE9fU1lTUFJPQyAoc3ltUCk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBzaGlmdF9vazoKLSAgCURldGVybWluZSBpZiBhICJzaGxvIiBpbnN0cnVjdGlvbiBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSAibGRjb25zdCIuCi0gIAlUaGlzIG1lYW5zIHRoYXQgc29tZSBudW1iZXIgWCA8IDMyIGNhbiBiZSBzaGlmdGVkIGxlZnQgdG8gcHJvZHVjZSB0aGUKLSAgCWNvbnN0YW50IG9mIGludGVyZXN0LgotCi0gIAlSZXR1cm4gdGhlIHNoaWZ0IGNvdW50LCBvciAwIGlmIHdlIGNhbid0IGRvIGl0LgotICAJQ2FsbGVyIGNhbGN1bGF0ZXMgWCBieSBzaGlmdGluZyBvcmlnaW5hbCBjb25zdGFudCByaWdodCAnc2hpZnQnIHBsYWNlcy4KLQotICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLXN0YXRpYwotaW50Ci1zaGlmdF9vayAobikKLSAgICAgaW50IG47CQkJLyogVGhlIGNvbnN0YW50IG9mIGludGVyZXN0ICovCi17Ci0gIGludCBzaGlmdDsJCQkvKiBUaGUgc2hpZnQgY291bnQgKi8KLQotICBpZiAobiA8PSAwKQotICAgIHsKLSAgICAgIC8qIENhbid0IGRvIGl0IGZvciBuZWdhdGl2ZSBudW1iZXJzICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogU2hpZnQgJ24nIHJpZ2h0IHVudGlsIGEgMSBpcyBhYm91dCB0byBiZSBsb3N0ICovCi0gIGZvciAoc2hpZnQgPSAwOyAobiAmIDEpID09IDA7IHNoaWZ0KyspCi0gICAgewotICAgICAgbiA+Pj0gMTsKLSAgICB9Ci0KLSAgaWYgKG4gPj0gMzIpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gc2hpZnQ7Ci19Ci0KLQotLyogc3ludGF4OiBpc3N1ZSBzeW50YXggZXJyb3IgKi8KLQotc3RhdGljIHZvaWQKLXN5bnRheCAoKQotewotICBhc19iYWQgKF8oInN5bnRheCBlcnJvciIpKTsKLX0JCQkJLyogc3ludGF4KCkgKi8KLQotCi0vKiB0YXJnX2hhc19zZnI6Ci0KLSAgIFJldHVybiBUUlVFIGlmZiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyIChzZnIpLiAgKi8KLQotc3RhdGljCi1pbnQKLXRhcmdfaGFzX3NmciAobikKLSAgICAgaW50IG47CQkJLyogTnVtYmVyICgwLTMxKSBvZiBzZnIgKi8KLXsKLSAgc3dpdGNoIChhcmNoaXRlY3R1cmUpCi0gICAgewotICAgIGNhc2UgQVJDSF9LQToKLSAgICBjYXNlIEFSQ0hfS0I6Ci0gICAgY2FzZSBBUkNIX01DOgotICAgIGNhc2UgQVJDSF9KWDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgQVJDSF9IWDoKLSAgICAgIHJldHVybiAoKDAgPD0gbikgJiYgKG4gPD0gNCkpOwotICAgIGNhc2UgQVJDSF9DQToKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICgoMCA8PSBuKSAmJiAobiA8PSAyKSk7Ci0gICAgfQotfQotCi0KLS8qIHRhcmdfaGFzX2ljbGFzczoKLQotICAgUmV0dXJuIFRSVUUgaWZmIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIHRoZSBpbmRpY2F0ZWQKLSAgIGNsYXNzIG9mIGluc3RydWN0aW9ucy4gICovCi1zdGF0aWMKLWludAotdGFyZ19oYXNfaWNsYXNzIChpYykKLSAgICAgLyogSW5zdHJ1Y3Rpb24gY2xhc3M7ICBvbmUgb2Y6Ci0gICAgICAgIElfQkFTRSwgSV9DWCwgSV9ERUMsIElfS1gsIElfRlAsIElfTUlMLCBJX0NBU0lNLCBJX0NYMiwgSV9IWCwgSV9IWDIKLSAgICAgICovCi0gICAgIGludCBpYzsKLXsKLSAgaWNsYXNzZXNfc2VlbiB8PSBpYzsKLSAgc3dpdGNoIChhcmNoaXRlY3R1cmUpCi0gICAgewotICAgIGNhc2UgQVJDSF9LQToKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0tYKTsKLSAgICBjYXNlIEFSQ0hfS0I6Ci0gICAgICByZXR1cm4gaWMgJiAoSV9CQVNFIHwgSV9LWCB8IElfRlAgfCBJX0RFQyk7Ci0gICAgY2FzZSBBUkNIX01DOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfS1ggfCBJX0ZQIHwgSV9ERUMgfCBJX01JTCk7Ci0gICAgY2FzZSBBUkNIX0NBOgotICAgICAgcmV0dXJuIGljICYgKElfQkFTRSB8IElfQ1ggfCBJX0NYMiB8IElfQ0FTSU0pOwotICAgIGNhc2UgQVJDSF9KWDoKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0NYMiB8IElfSlgpOwotICAgIGNhc2UgQVJDSF9IWDoKLSAgICAgIHJldHVybiBpYyAmIChJX0JBU0UgfCBJX0NYMiB8IElfSlggfCBJX0hYKTsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKChpY2xhc3Nlc19zZWVuICYgKElfS1ggfCBJX0ZQIHwgSV9ERUMgfCBJX01JTCkpCi0JICAmJiAoaWNsYXNzZXNfc2VlbiAmIChJX0NYIHwgSV9DWDIpKSkKLQl7Ci0JICBhc193YXJuIChfKCJhcmNoaXRlY3R1cmUgb2Ygb3Bjb2RlIGNvbmZsaWN0cyB3aXRoIHRoYXQgb2YgZWFybGllciBpbnN0cnVjdGlvbihzKSIpKTsKLQkgIGljbGFzc2VzX3NlZW4gJj0gfmljOwotCX0KLSAgICAgIHJldHVybiAxOwotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgLmVuZGlhbiBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19lbmRpYW4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgaWYgKHN0cmNhc2VjbXAgKG5hbWUsICJsaXR0bGUiKSA9PSAwKQotICAgIDsKLSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobmFtZSwgImJpZyIpID09IDApCi0gICAgYXNfYmFkIChfKCJiaWcgZW5kaWFuIG1vZGUgaXMgbm90IHN1cHBvcnRlZCIpKTsKLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oImlnbm9yaW5nIHVucmVjb2duaXplZCAuZW5kaWFuIHR5cGUgYCVzJyIpLCBuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSBpOTYwLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBpbnN0cnVjdGlvbiwKLSAgIHdoaWNoIHdlIGhhdmUgc2V0IHVwIGFzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXh1cCB0b28uICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFscDsKLSNlbHNlCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci0jZW5kaWYKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGxvbmcgdmFsID0gKnZhbHA7Ci0jZW5kaWYKLSAgY2hhciAqcGxhY2UgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0KLSAgaWYgKCFmaXhQLT5meF9iaXRfZml4UCkKLSAgICB7Ci0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIC8qIEZvciBjYWxseCwgd2UgYWx3YXlzIHdhbnQgdG8gd3JpdGUgb3V0IHplcm8sIGFuZCBlbWl0IGEKLQkgc3ltYm9saWMgcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfYnNyKQotCXZhbCA9IDA7Ci0KLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKLSNlbmRpZgotCi0gICAgICBtZF9udW1iZXJfdG9faW1tIChwbGFjZSwgdmFsLCBmaXhQLT5meF9zaXplLCBmaXhQKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fZmllbGQgKHBsYWNlLCB2YWwsIGZpeFAtPmZ4X2JpdF9maXhQKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKLXZvaWQKLXRjX2JvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgc3RydWN0IHJlbG9jYXRpb25faW5mbyByaTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBtZW1zZXQgKChjaGFyICopICZyaSwgJ1wwJywgc2l6ZW9mIChyaSkpOwotICBzeW1ib2xQID0gZml4UC0+ZnhfYWRkc3k7Ci0gIGtub3cgKHN5bWJvbFAgIT0gMCB8fCBmaXhQLT5meF9yX3R5cGUgIT0gTk9fUkVMT0MpOwotICByaS5yX2JzciA9IGZpeFAtPmZ4X2JzcjsJLypTQUMgTEQgUkVMQVggSEFDSyAqLwotICAvKiBUaGVzZSB0d28gJ2N1eiBvZiBOUzMySyAqLwotICByaS5yX2NhbGxqID0gZml4UC0+ZnhfdGNiaXQ7Ci0gIGlmIChmaXhQLT5meF9iaXRfZml4UCkKLSAgICByaS5yX2xlbmd0aCA9IDI7Ci0gIGVsc2UKLSAgICByaS5yX2xlbmd0aCA9IG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXTsKLSAgcmkucl9wY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotICByaS5yX2FkZHJlc3MgPSBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLQotICBpZiAoZml4UC0+Znhfcl90eXBlICE9IE5PX1JFTE9DKQotICAgIHsKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIHJzX2FsaWduOgotCSAgcmkucl9pbmRleCA9IC0yOwotCSAgcmkucl9wY3JlbCA9IDE7Ci0JICByaS5yX2xlbmd0aCA9IGZpeFAtPmZ4X3NpemUgLSAxOwotCSAgYnJlYWs7Ci0JY2FzZSByc19vcmc6Ci0JICByaS5yX2luZGV4ID0gLTI7Ci0JICByaS5yX3BjcmVsID0gMDsKLQkgIGJyZWFrOwotCWNhc2UgcnNfZmlsbDoKLQkgIHJpLnJfaW5kZXggPSAtMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICByaS5yX2V4dGVybiA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChsaW5rcmVsYXggfHwgIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgZml4UC0+ZnhfYnNyKQotICAgIHsKLSAgICAgIHJpLnJfZXh0ZXJuID0gMTsKLSAgICAgIHJpLnJfaW5kZXggPSBzeW1ib2xQLT5zeV9udW1iZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmkucl9leHRlcm4gPSAwOwotICAgICAgcmkucl9pbmRleCA9IFNfR0VUX1RZUEUgKHN5bWJvbFApOwotICAgIH0KLQotICAvKiBPdXRwdXQgdGhlIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW4gbWFjaGluZS1kZXBlbmRlbnQgZm9ybS4gKi8KLSAgbWRfcmlfdG9fY2hhcnMgKHdoZXJlLCAmcmkpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotI2lmIGRlZmluZWQgKE9CSl9DT0ZGKSAmJiBkZWZpbmVkIChCRkQpCi1zaG9ydAotdGNfY29mZl9maXgycnR5cGUgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9ic3IpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsID09IDAgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBSX1JFTExPTkc7Ci0KLSAgaWYgKGZpeFAtPmZ4X3BjcmVsICE9IDAgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBSX0lQUk1FRDsKLQotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGlmIChmcmFnLT5mcl9uZXh0KQotICAgIHJldHVybiBmcmFnLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfYWRkcmVzczsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIEFsaWduIGFuIGFkZHJlc3MgYnkgcm91bmRpbmcgaXQgdXAgdG8gdGhlIHNwZWNpZmllZCBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwkJLyogQWRkcmVzcyB0byBiZSByb3VuZGVkIHVwICovCi17Ci0gIGludCBhbGlnbjsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotI2Vsc2UKLSAgYWxpZ24gPSBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddOwotI2VuZGlmCi0gIHJldHVybiAoYWRkciArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKTsKLX0KLQotZXh0ZXJuIGludCBjb2ZmX2ZsYWdzOwotCi0jaWZkZWYgT0JKX0NPRkYKLXZvaWQKLXRjX2hlYWRlcnNfaG9vayAoaGVhZGVycykKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci17Ci0gIHN3aXRjaCAoYXJjaGl0ZWN0dXJlKQotICAgIHsKLSAgICBjYXNlIEFSQ0hfS0E6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MEtBOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfS0I6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MEtCOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfTUM6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2ME1DOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfQ0E6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MENBOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfSlg6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MEpYOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFSQ0hfSFg6Ci0gICAgICBjb2ZmX2ZsYWdzIHw9IEZfSTk2MEhYOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKGljbGFzc2VzX3NlZW4gPT0gSV9CQVNFKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwQ09SRTsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0NYKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwQ0E7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgSV9IWCkKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MEhYOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfSlgpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBKWDsKLSAgICAgIGVsc2UgaWYgKGljbGFzc2VzX3NlZW4gJiBJX0NYMikKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MENBOwotICAgICAgZWxzZSBpZiAoaWNsYXNzZXNfc2VlbiAmIElfTUlMKQotCWNvZmZfZmxhZ3MgfD0gRl9JOTYwTUM7Ci0gICAgICBlbHNlIGlmIChpY2xhc3Nlc19zZWVuICYgKElfREVDIHwgSV9GUCkpCi0JY29mZl9mbGFncyB8PSBGX0k5NjBLQjsKLSAgICAgIGVsc2UKLQljb2ZmX2ZsYWdzIHw9IEZfSTk2MEtBOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChmbGFnX3JlYWRvbmx5X2RhdGFfaW5fdGV4dCkKLSAgICB7Ci0gICAgICBoZWFkZXJzLT5maWxlaGRyLmZfbWFnaWMgPSBJOTYwUldNQUdJQzsKLSAgICAgIGhlYWRlcnMtPmFvdXRoZHIubWFnaWMgPSBPTUFHSUM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGVhZGVycy0+ZmlsZWhkci5mX21hZ2ljID0gSTk2MFJPTUFHSUM7Ci0gICAgICBoZWFkZXJzLT5hb3V0aGRyLm1hZ2ljID0gTk1BR0lDOwotICAgIH0JCQkJLyogc2V0IG1hZ2ljIG51bWJlcnMgKi8KLX0KLQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBUaGluZ3MgZ29pbmcgb24gaGVyZToKLQotICAgRm9yIGJvdXQsIFdlIG5lZWQgdG8gYXNzdXJlIGEgY291cGxlIG9mIHNpbXBsaWZ5aW5nCi0gICBhc3N1bXB0aW9ucyBhYm91dCBsZWFmcHJvY3MgZm9yIHRoZSBsaW5rZXI6IHRoZSBsZWFmcHJvYwotICAgZW50cnkgc3ltYm9scyB3aWxsIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUgYXNzZW1ibHkgaW4KLSAgIHdoaWNoIHRoZXkncmUgZGVjbGFyZWQgd2l0aCB0aGUgJy5sZWFmcHJvYycgZGlyZWN0aXZlOwotICAgYW5kIGlmIGEgbGVhZnByb2MgaGFzIGJvdGggJ2NhbGwnIGFuZCAnYmFsJyBlbnRyeSBwb2ludHMKLSAgIHRoZXkgYXJlIGJvdGggZ2xvYmFsIG9yIGJvdGggbG9jYWwuCi0KLSAgIEZvciBjb2ZmLCB0aGUgY2FsbCBzeW1ib2wgaGFzIGEgc2Vjb25kIGF1eCBlbnRyeSB0aGF0Ci0gICBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50LiAgVGhlIGJhbCBzeW1ib2wgYmVjb21lcyBhCi0gICBsYWJlbC4KLQotICAgRm9yIGNvZmYgcmVwcmVzZW50YXRpb24sIHRoZSBjYWxsIHN5bWJvbCBoYXMgYSBzZWNvbmQgYXV4IGVudHJ5IHRoYXQKLSAgIGNvbnRhaW5zIHRoZSBiYWwgZW50cnkgcG9pbnQuICBUaGUgYmFsIHN5bWJvbCBiZWNvbWVzIGEgbGFiZWwuICAqLwotCi12b2lkCi10Y19jcmF3bF9zeW1ib2xfY2hhaW4gKGhlYWRlcnMpCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotewotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIGZvciAoc3ltYm9sUCA9IHN5bWJvbF9yb290UDsgc3ltYm9sUDsgc3ltYm9sUCA9IHN5bWJvbF9uZXh0IChzeW1ib2xQKSkKLSAgICB7Ci0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIGlmIChUQ19TX0lTX1NZU1BST0MgKHN5bWJvbFApKQotCXsKLQkgIC8qIHNlY29uZCBhdXggZW50cnkgYWxyZWFkeSBjb250YWlucyB0aGUgc3lzcHJvYyBudW1iZXIgKi8KLQkgIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bWJvbFAsIDIpOwotCSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19TQ0FMTCk7Ci0JICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCkgfCAoRFRfRkNOIDw8IE5fQlRTSEZUKSk7Ci0JICBjb250aW51ZTsKLQl9CQkJLyogcmV3cml0ZSBzeXNwcm9jICovCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotICAgICAgaWYgKCFUQ19TX0lTX0JBTE5BTUUgKHN5bWJvbFApICYmICFUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9CQkJLyogTm90IGEgbGVhZnByb2Mgc3ltYm9sICovCi0KLSAgICAgIGlmICghU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQl7Ci0JICBhc19iYWQgKF8oImxlYWZwcm9jIHN5bWJvbCAnJXMnIHVuZGVmaW5lZCIpLCBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0JfQkJCS8qIHVuZGVmaW5lZCBsZWFmICovCi0KLSAgICAgIGlmIChUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKLQl7Ci0JICBzeW1ib2xTICpiYWxQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChzeW1ib2xQKTsKLQkgIGlmIChTX0lTX0VYVEVSTkFMIChzeW1ib2xQKSAhPSBTX0lTX0VYVEVSTkFMIChiYWxQKSkKLQkgICAgewotCSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgICAgICBTX1NFVF9FWFRFUk5BTCAoYmFsUCk7Ci0JICAgICAgYXNfd2FybiAoXygiV2FybmluZzogbWFraW5nIGxlYWZwcm9jIGVudHJpZXMgJXMgYW5kICVzIGJvdGggZ2xvYmFsXG4iKSwKLQkJICAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCBTX0dFVF9OQU1FIChiYWxQKSk7Ci0JICAgIH0JCQkvKiBleHRlcm5hbGl0eSBtaXNtYXRjaCAqLwotCX0JCQkvKiBpZiBjYWxsbmFtZSAqLwotICAgIH0JCQkJLyogd2FsayB0aGUgc3ltYm9sIGNoYWluICovCi19Ci0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogRm9yIGFvdXQgb3IgYm91dCwgdGhlIGJhbCBpbW1lZGlhdGVseSBmb2xsb3dzIHRoZSBjYWxsLgotCi0gICBGb3IgY29mZiwgd2UgY2hlYXQgYW5kIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgYmFsIHN5bWJvbCBpbiB0aGUKLSAgIHNlY29uZCBhdXggZW50cnkgb2YgdGhlIGNhbGwuICAqLwotCi0jdW5kZWYgT0JKX0FCT1VUCi0jaWZkZWYgT0JKX0FPVVQKLSNkZWZpbmUgT0JKX0FCT1VUCi0jZW5kaWYKLSNpZmRlZiBPQkpfQk9VVAotI2RlZmluZSBPQkpfQUJPVVQKLSNlbmRpZgotCi12b2lkCi10Y19zZXRfYmFsX29mX2NhbGwgKGNhbGxQLCBiYWxQKQotICAgICBzeW1ib2xTICpjYWxsUDsKLSAgICAgc3ltYm9sUyAqYmFsUDsKLXsKLSAga25vdyAoVENfU19JU19DQUxMTkFNRSAoY2FsbFApKTsKLSAga25vdyAoVENfU19JU19CQUxOQU1FIChiYWxQKSk7Ci0KLSNpZmRlZiBPQkpfQ09GRgotCi0gIGNhbGxQLT5zeV90YyA9IGJhbFA7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKGNhbGxQLCAyKTsKLQotI2Vsc2UgLyogISBPQkpfQ09GRiAqLwotI2lmZGVmIE9CSl9BQk9VVAotCi0gIC8qIElmIHRoZSAnYmFsJyBlbnRyeSBkb2Vzbid0IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgJ2NhbGwnCi0gICAgICogc3ltYm9sLCB1bmxpbmsgaXQgZnJvbSB0aGUgc3ltYm9sIGxpc3QgYW5kIHJlLWluc2VydCBpdC4KLSAgICovCi0gIGlmIChzeW1ib2xfbmV4dCAoY2FsbFApICE9IGJhbFApCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoYmFsUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChiYWxQLCBjYWxsUCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgfQkJCQkvKiBpZiBub3QgaW4gb3JkZXIgKi8KLQotI2Vsc2UgLyogISBPQkpfQUJPVVQgKi8KLSAgYXNfZmF0YWwgKCJPbmx5IHN1cHBvcnRlZCBmb3IgYS5vdXQsIGIub3V0LCBvciBDT0ZGIik7Ci0jZW5kaWYgLyogISBPQkpfQUJPVVQgKi8KLSNlbmRpZiAvKiAhIE9CSl9DT0ZGICovCi19Ci0KLXN5bWJvbFMgKgotdGNfZ2V0X2JhbF9vZl9jYWxsIChjYWxsUCkKLSAgICAgc3ltYm9sUyAqY2FsbFA7Ci17Ci0gIHN5bWJvbFMgKnJldHZhbDsKLQotICBrbm93IChUQ19TX0lTX0NBTExOQU1FIChjYWxsUCkpOwotCi0jaWZkZWYgT0JKX0NPRkYKLSAgcmV0dmFsID0gY2FsbFAtPnN5X3RjOwotI2Vsc2UKLSNpZmRlZiBPQkpfQUJPVVQKLSAgcmV0dmFsID0gc3ltYm9sX25leHQgKGNhbGxQKTsKLSNlbHNlCi0gIGFzX2ZhdGFsICgiT25seSBzdXBwb3J0ZWQgZm9yIGEub3V0LCBiLm91dCwgb3IgQ09GRiIpOwotI2VuZGlmIC8qICEgT0JKX0FCT1VUICovCi0jZW5kaWYgLyogISBPQkpfQ09GRiAqLwotCi0gIGtub3cgKFRDX1NfSVNfQkFMTkFNRSAocmV0dmFsKSk7Ci0gIHJldHVybiByZXR2YWw7Ci19CQkJCS8qIF90Y19nZXRfYmFsX29mX2NhbGwoKSAqLwotCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGlmIChUQ19TX0lTX0NBTExOQU1FIChzeW1ib2xQKSkKLSAgICB7Ci0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIHN5bWJvbFMgKmJhbFAgPSB0Y19nZXRfYmFsX29mX2NhbGwgKHN5bWJvbFApOwotCi0jaWYgMAotICAgICAgLyogc2Vjb25kIGF1eCBlbnRyeSBjb250YWlucyB0aGUgYmFsIGVudHJ5IHBvaW50ICovCi0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW1ib2xQLCAyKTsKLSNlbmRpZgotICAgICAgc3ltYm9sUC0+c3lfc3ltYm9sLm9zdF9hdXhlbnRbMV0ueF9iYWwueF9iYWxudHJ5ID0gU19HRVRfVkFMVUUgKGJhbFApOwotICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApID09IENfRVhUKQotCVNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfTEVBRkVYVCk7Ci0gICAgICBlbHNlCi0JU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltYm9sUCwgQ19MRUFGU1RBVCk7Ci0gICAgICBTX1NFVF9EQVRBX1RZUEUgKHN5bWJvbFAsIFNfR0VUX0RBVEFfVFlQRSAoc3ltYm9sUCkgfCAoRFRfRkNOIDw8IE5fQlRTSEZUKSk7Ci0gICAgICAvKiBmaXggdXAgdGhlIGJhbCBzeW1ib2wgKi8KLSAgICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKGJhbFAsIENfTEFCRUwpOwotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0gICAgfQkJCQkvKiBvbmx5IG9uIGNhbGxzICovCi19Ci0KLXZvaWQKLWk5NjBfaGFuZGxlX2FsaWduIChmcmFncCkKLSAgICAgZnJhZ1MgKmZyYWdwOwotewotICBpZiAoIWxpbmtyZWxheCkKLSAgICByZXR1cm47Ci0KLSNpZm5kZWYgT0JKX0JPVVQKLQotICBhc19iYWQgKF8oIm9wdGlvbiAtLWxpbmstcmVsYXggaXMgb25seSBzdXBwb3J0ZWQgaW4gYi5vdXQgZm9ybWF0IikpOwotICBsaW5rcmVsYXggPSAwOwotICByZXR1cm47Ci0KLSNlbHNlCi0KLSAgLyogVGhlIHRleHQgc2VjdGlvbiAiZW5kcyIgd2l0aCBhbm90aGVyIGFsaWdubWVudCByZWxvYywgdG8gd2hpY2ggd2UKLSAgICAgYXJlbid0IGFkZGluZyBwYWRkaW5nLiAgKi8KLSAgaWYgKGZyYWdwLT5mcl9uZXh0ID09IHRleHRfbGFzdF9mcmFnCi0gICAgICB8fCBmcmFncC0+ZnJfbmV4dCA9PSBkYXRhX2xhc3RfZnJhZykKLSAgICByZXR1cm47Ci0KLSAgLyogYWxpZ25tZW50IGRpcmVjdGl2ZSAqLwotICBmaXhfbmV3IChmcmFncCwgZnJhZ3AtPmZyX2ZpeCwgZnJhZ3AtPmZyX29mZnNldCwgMCwgMCwgMCwKLQkgICAoaW50KSBmcmFncC0+ZnJfdHlwZSk7Ci0jZW5kaWYgLyogT0JKX0JPVVQgKi8KLX0KLQotaW50Ci1pOTYwX3ZhbGlkYXRlX2ZpeCAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUsIGFkZF9zeW1ib2xQUCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsKLSAgICAgc3ltYm9sUyAqKmFkZF9zeW1ib2xQUDsKLXsKLSNkZWZpbmUgYWRkX3N5bWJvbFAgKCphZGRfc3ltYm9sUFApCi0gIGlmIChmaXhQLT5meF90Y2JpdCAmJiBUQ19TX0lTX0NBTExOQU1FIChhZGRfc3ltYm9sUCkpCi0gICAgewotICAgICAgLyogUmVsb2NhdGlvbiBzaG91bGQgYmUgZG9uZSB2aWEgdGhlIGFzc29jaWF0ZWQgJ2JhbCcKLSAgICAgICAgIGVudHJ5IHBvaW50IHN5bWJvbC4gKi8KLQotICAgICAgaWYgKCFUQ19TX0lTX0JBTE5BTUUgKHRjX2dldF9iYWxfb2ZfY2FsbCAoYWRkX3N5bWJvbFApKSkKLQl7Ci0JICBhc19iYWQgKF8oIk5vICdiYWwnIGVudHJ5IHBvaW50IGZvciBsZWFmcHJvYyAlcyIpLAotCQkgIFNfR0VUX05BTUUgKGFkZF9zeW1ib2xQKSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IGFkZF9zeW1ib2xQID0gdGNfZ2V0X2JhbF9vZl9jYWxsIChhZGRfc3ltYm9sUCk7Ci0gICAgfQotI2lmIDAKLSAgLyogU3RpbGwgaGF2ZSB0byB3b3JrIG91dCBvdGhlciBjb25kaXRpb25zIGZvciB0aGVzZSB0ZXN0cy4gICovCi0gIHsKLSAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCi0gICAgICB7Ci0JYXNfYmFkIChfKCJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIHR3byBzeW1ib2xzIikpOwotCXJldHVybiAxOwotICAgICAgfQotICAgIHJlbG9jX2NhbGxqIChmaXhQKTsKLSAgICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCi0gICAgICB7Ci0JLyogVGhpcyBpcyBhIENPQlIgaW5zdHJ1Y3Rpb24uICBUaGV5IGhhdmUgb25seSBhIDEzLWJpdAotCSAgIGRpc3BsYWNlbWVudCBhbmQgYXJlIG9ubHkgdG8gYmUgdXNlZCBmb3IgbG9jYWwgYnJhbmNoZXM6Ci0JICAgZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUgcmVsb2NhdGlvbi4gICovCi0JYXNfYmFkIChfKCJjYW4ndCB1c2UgQ09CUiBmb3JtYXQgd2l0aCBleHRlcm5hbCBsYWJlbCIpKTsKLQlmaXhQLT5meF9hZGRzeSA9IE5VTEw7CS8qIE5vIHJlbG9jYXRpb25zIHBsZWFzZS4gKi8KLQlyZXR1cm4gMTsKLSAgICAgIH0KLSAgfQotI2VuZGlmCi0jdW5kZWYgYWRkX3N5bWJvbFAKLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLS8qIEZyb20gY2dlbi5jOiAgKi8KLQotc3RhdGljIHNob3J0Ci10Y19iZmRfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotI2lmIDAKLSAgaWYgKGZpeFAtPmZ4X2JzcikKLSAgICBhYm9ydCAoKTsKLSNlbmRpZgotCi0gIGlmIChmaXhQLT5meF9wY3JlbCA9PSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gQkZEX1JFTE9DXzMyOwotCi0gIGlmIChmaXhQLT5meF9wY3JlbCAhPSAwICYmIGZpeFAtPmZ4X3NpemUgPT0gNCkKLSAgICByZXR1cm4gQkZEX1JFTE9DXzI0X1BDUkVMOwotCi0gIGFib3J0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuCi0KLSAgIEZJWE1FOiBUbyB3aGF0IGV4dGVudCBjYW4gd2UgZ2V0IGFsbCByZWxldmFudCB0YXJnZXRzIHRvIHVzZSB0aGlzPyAgKi8KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeFApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhQOwotewotICBhcmVsZW50ICogcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICAvKiBIQUNLOiBJcyB0aGlzIHJpZ2h0PyAqLwotICBmaXhQLT5meF9yX3R5cGUgPSB0Y19iZmRfZml4MnJ0eXBlIChmaXhQKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4UC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJICAgICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgZXhwb3J0IHJlbG9jIHR5cGUgJWQgKGAlcycpIiwKLQkJICAgIGZpeFAtPmZ4X3JfdHlwZSwKLQkJICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChmaXhQLT5meF9yX3R5cGUpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBhc3NlcnQgKCFmaXhQLT5meF9wY3JlbCA9PSAhcmVsb2MtPmhvd3RvLT5wY19yZWxhdGl2ZSk7Ci0KLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4UC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKLSAgcmVsb2MtPmFkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0KLS8qIGVuZCBmcm9tIGNnZW4uYyAqLwotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBlbmQgb2YgdGMtaTk2MC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLWk5NjAuaCBiL2dhcy9jb25maWcvdGMtaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ2ZWRlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtaTk2MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qIHRjLWk5NjAuaCAtIEJhc2ljIDgwOTYwIGluc3RydWN0aW9uIGZvcm1hdHMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZm5kZWYgVENfSTk2MAotI2RlZmluZSBUQ19JOTYwIDEKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItaTk2MCIKLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfaTk2MAotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyoKLSAqIFRoZSAnQ09KJyBpbnN0cnVjdGlvbnMgYXJlIGFjdHVhbGx5IENPQlIgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlICdiJyBpbgotICogdGhlIG1uZW1vbmljIHJlcGxhY2VkIGJ5IGEgJ2onOyAgdGhleSBhcmUgQUxXQVlTICJkZS1vcHRpbWl6ZWQiIGlmIG5lY2Vzc2FyeToKLSAqIGlmIHRoZSBkaXNwbGFjZW1lbnQgd2lsbCBub3QgZml0IGluIDEzIGJpdHMsIHRoZSBhc3NlbWJsZXIgd2lsbCByZXBsYWNlIHRoZW0KLSAqIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4KLSAqCi0gKiBBbGwgb2YgdGhlICdNRU1uJyBpbnN0cnVjdGlvbnMgYXJlIHRoZSBzYW1lIGZvcm1hdDsgdGhlICduJyBpbiB0aGUgbmFtZQotICogaW5kaWNhdGVzIHRoZSBkZWZhdWx0IGluZGV4IHNjYWxlIGZhY3RvciAodGhlIHNpemUgb2YgdGhlIGRhdHVtIG9wZXJhdGVkIG9uKS4KLSAqCi0gKiBUaGUgRkJSQSBmb3JtYXRzIGFyZSBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgVGhleSBhcmUgdGhlCi0gKiAiY29udmVuaWVuY2UgZGlyZWN0aXZlcyIgZm9yIGJyYW5jaGluZyBvbiBmbG9hdGluZy1wb2ludCBjb21wYXJpc29ucywKLSAqIGVhY2ggb2Ygd2hpY2ggZ2VuZXJhdGVzIDIgaW5zdHJ1Y3Rpb25zIChhICdibm8nIGFuZCBvbmUgb3RoZXIgYnJhbmNoKS4KLSAqCi0gKiBUaGUgQ0FMTEogZm9ybWF0IGlzIG5vdCBhY3R1YWxseSBhbiBpbnN0cnVjdGlvbiBmb3JtYXQuICBJdCBpbmRpY2F0ZXMgdGhhdAotICogdGhlIGluc3RydWN0aW9uIGdlbmVyYXRlZCAoYSBDVFJMLWZvcm1hdCAnY2FsbCcpIHNob3VsZCBoYXZlIGl0cyByZWxvY2F0aW9uCi0gKiBzcGVjaWFsbHkgZmxhZ2dlZCBmb3IgbGluay10aW1lIHJlcGxhY2VtZW50IHdpdGggYSAnYmFsJyBvciAnY2FsbHMnIGlmCi0gKiBhcHByb3ByaWF0ZS4KLSAqLwotCi0vKiB0YWlsb3IgZ2FzICovCi0jZGVmaW5lIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSNkZWZpbmUgQklURklFTERfQ09OU19FWFBSRVNTSU9OUwotCi0vKiB0YWlsb3IgdGhlIGNvZmYgZm9ybWF0ICovCi0jZGVmaW5lIEJGRF9BUkNICQkJCWJmZF9hcmNoX2k5NjAKLSNkZWZpbmUgQ09GRl9GTEFHUwkJCQlGX0FSMzJXUgotI2RlZmluZSBDT0ZGX01BR0lDCQkJCUk5NjBST01BR0lDCi0jZGVmaW5lIE9CSl9DT0ZGX1NFQ1RJT05fSEVBREVSX0hBU19BTElHTk1FTlQKLSNkZWZpbmUgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMJCQkoMikKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoRklYUCkJCQkoIShGSVhQKS0+ZnhfZG9uZSkKLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoRklYUCkJCQl0Y19jb2ZmX2ZpeDJydHlwZShGSVhQKQotI2RlZmluZSBUQ19DT0ZGX1NJWkVNQUNIREVQKEZSQUdQKQkJdGNfY29mZl9zaXplbWFjaGRlcChGUkFHUCkKLSNkZWZpbmUgVENfQ09GRl9TRVRfTUFDSElORShIRFJTKQkJdGNfaGVhZGVyc19ob29rIChIRFJTKQotZXh0ZXJuIHZvaWQgdGNfaGVhZGVyc19ob29rICgpOwotZXh0ZXJuIHNob3J0IHRjX2NvZmZfZml4MnJ0eXBlICgpOwotZXh0ZXJuIGludCB0Y19jb2ZmX3NpemVtYWNoZGVwICgpOwotCi0vKiBNRUFOSU5HIE9GICduX290aGVyJyBpbiB0aGUgc3ltYm9sIHJlY29yZC4KLSAqCi0gKiBJZiBub24temVybywgdGhlICduX290aGVyJyBmaWVsZHMgaW5kaWNhdGVzIGVpdGhlciBhIGxlYWYgcHJvY2VkdXJlIG9yCi0gKiBhIHN5c3RlbSBwcm9jZWR1cmUsIGFzIGZvbGxvd3M6Ci0gKgotICoJMSA8PSBuX290aGVyIDw9IDMyIDoKLSAqCQlUaGUgc3ltYm9sIGlzIHRoZSBlbnRyeSBwb2ludCB0byBhIHN5c3RlbSBwcm9jZWR1cmUuCi0gKgkJJ25fdmFsdWUnIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSwgYXMgZm9yIGFueSBvdGhlcgotICoJCXByb2NlZHVyZS4gIFRoZSBzeXN0ZW0gcHJvY2VkdXJlIG51bWJlciAod2hpY2ggY2FuIGJlIHVzZWQgaW4KLSAqCQlhICdjYWxscycgaW5zdHJ1Y3Rpb24pIGlzIChuX290aGVyLTEpLiAgVGhlc2UgZW50cmllcyBjb21lIGZyb20KLSAqCQknLnN5c3Byb2MnIGRpcmVjdGl2ZXMuCi0gKgotICoJbl9vdGhlciA9PSBOX0NBTExOQU1FCi0gKgkJdGhlIHN5bWJvbCBpcyB0aGUgJ2NhbGwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlICpuZXh0KiBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZSBtdXN0IGJlIHRoZSBjb3JyZXNwb25kaW5nCi0gKgkJJ2JhbCcgZW50cnkgcG9pbnQgdG8gdGhlIHByb2NlZHVyZSAoc2VlIGZvbGxvd2luZykuICBUaGVzZQotICoJCWVudHJpZXMgY29tZSBmcm9tICcubGVhZnByb2MnIGRpcmVjdGl2ZXMgaW4gd2hpY2ggdHdvIGRpZmZlcmVudAotICoJCXN5bWJvbHMgYXJlIHNwZWNpZmllZCAodGhlIGZpcnN0IG9uZSBpcyByZXByZXNlbnRlZCBoZXJlKS4KLSAqCi0gKgotICoJbl9vdGhlciA9PSBOX0JBTE5BTUUKLSAqCQl0aGUgc3ltYm9sIGlzIHRoZSAnYmFsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgotICoJCVRoZXNlIGVudHJpZXMgcmVzdWx0IGZyb20gJy5sZWFmcHJvYycgZGlyZWN0aXZlcyBpbiB3aGljaCBvbmx5Ci0gKgkJb25lIHN5bWJvbCBpcyBzcGVjaWZpZWQsIG9yIGluIHdoaWNoIHRoZSBzYW1lIHN5bWJvbCBpcwotICoJCXNwZWNpZmllZCB0d2ljZS4KLSAqCi0gKiBOb3RlIHRoYXQgYW4gTl9DQUxMTkFNRSBlbnRyeSAqbXVzdCogaGF2ZSBhIGNvcnJlc3BvbmRpbmcgTl9CQUxOQU1FIGVudHJ5LAotICogYnV0IG5vdCBldmVyeSBOX0JBTE5BTUUgZW50cnkgbXVzdCBoYXZlIGFuIE5fQ0FMTE5BTUUgZW50cnkuCi0gKi8KLSNkZWZpbmUJTl9DQUxMTkFNRQkoKGNoYXIpLTEpCi0jZGVmaW5lCU5fQkFMTkFNRQkoKGNoYXIpLTIpCi0KLS8qIGk5NjAgdXNlcyBhIGN1c3RvbSByZWxvY2F0aW9uIHJlY29yZC4gKi8KLQotLyogbGV0IG9iai1hb3V0Lmgga25vdyAqLwotI2RlZmluZSBDVVNUT01fUkVMT0NfRk9STUFUIDEKLS8qIGxldCBhb3V0X2dudS5oIGtub3cgKi8KLSNkZWZpbmUgTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQgMQotc3RydWN0IHJlbG9jYXRpb25faW5mbwotICB7Ci0gICAgaW50IHJfYWRkcmVzczsJCS8qIEZpbGUgYWRkcmVzcyBvZiBpdGVtIHRvIGJlIHJlbG9jYXRlZAkqLwotICAgIHVuc2lnbmVkCi0gICAgICByX2luZGV4OjI0LAkJLyogSW5kZXggb2Ygc3ltYm9sIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMgYmFzZWQqLwotICAgICAgcl9wY3JlbDoxLAkJLyogMSA9PiByZWxvY2F0ZSBQQy1yZWxhdGl2ZTsgZWxzZSBhYnNvbHV0ZQotCQkJCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0Ci0JCQkJICoJYWRkcmVzcywgYWJzb2x1dGUgaW1wbGllcyAzMi1iaXQuCi0JCQkJICovCi0gICAgICByX2xlbmd0aDoyLAkJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHJlbG9jYXRlOgotCQkJCSAqCTAgPT4gMSBieXRlCi0JCQkJICoJMSA9PiAyIGJ5dGVzCi0JCQkJICoJMiA9PiA0IGJ5dGVzIC0tIG9ubHkgdmFsdWUgdXNlZCBmb3IgaTk2MAotCQkJCSAqLwotICAgICAgcl9leHRlcm46MSwgcl9ic3I6MSwJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9kaXNwOjEsCQkJLyogU29tZXRoaW5nIGZvciB0aGUgR05VIE5TMzJLIGFzc2VtYmxlciAqLwotICAgICAgcl9jYWxsajoxLAkJLyogMSBpZiByZWxvY2F0aW9uIHRhcmdldCBpcyBhbiBpOTYwICdjYWxsaicgKi8KLSAgICAgIG51dGhpbjoxOwkJCS8qIFVudXNlZAkJCQkqLwotICB9OwotCi0jaWZkZWYgT0JKX0NPRkYKLQotLyogV2Ugc3RvcmUgdGhlIGJhbCBpbmZvcm1hdGlvbiBpbiB0aGUgc3lfdGMgZmllbGQuICAqLwotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHN5bWJvbFMgKgotCi0jZGVmaW5lIFRDX0FESlVTVF9SRUxPQ19DT1VOVChGSVhQLENPVU5UKSBcCi0gIHsgZml4UyAqdGNmaXhwID0gKEZJWFApOyBcCi0gICAgZm9yICg7dGNmaXhwO3RjZml4cD10Y2ZpeHAtPmZ4X25leHQpIFwKLSAgICAgIGlmICh0Y2ZpeHAtPmZ4X3RjYml0ICYmIHRjZml4cC0+ZnhfYWRkc3kgIT0gMCkgXAotICAgICAgICArKyhDT1VOVCk7IFwKLSAgfQotI2VuZGlmCi0KLWV4dGVybiBpbnQgaTk2MF92YWxpZGF0ZV9maXggUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdULCBzeW1ib2xTICoqKSk7Ci0jZGVmaW5lIFRDX1ZBTElEQVRFX0ZJWChGSVhQLFNFR1RZUEUsTEFCRUwpIFwKLQlpZiAoaTk2MF92YWxpZGF0ZV9maXggKEZJWFAsIFNFR1RZUEUsICZhZGRfc3ltYm9sUCkgIT0gMCkgZ290byBMQUJFTAotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoRklYKSAgXAotICAoKEZJWCktPmZ4X2FkZHN5ID09IE5VTEwgXAotICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KSBcCi0gICAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0jZW5kaWYKLQotI2lmbmRlZiBPQkpfRUxGCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWFApCQkoKEZJWFApLT5meF9ic3IgPT0gMCkKLSNlbHNlCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWFApCQkJCQkJXAotICAoKEZJWFApLT5meF9ic3IgPT0gMAkJCQkJCQlcCi0gICAmJiAhIFNfSVNfRVhURVJOQUwgKChGSVhQKS0+ZnhfYWRkc3kpCQkJCVwKLSAgICYmICEgU19JU19XRUFLICgoRklYUCktPmZ4X2FkZHN5KSkKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBicnRhYl9lbWl0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZW5kKCkJYnJ0YWJfZW1pdCAoKQotCi1leHRlcm4gdm9pZCByZWxvY19jYWxsaiAoKTsKLQotZXh0ZXJuIHZvaWQgdGNfc2V0X2JhbF9vZl9jYWxsIFBBUkFNUyAoKHN5bWJvbFMgKiwgc3ltYm9sUyAqKSk7Ci0KLWV4dGVybiBzdHJ1Y3Qgc3ltYm9sICp0Y19nZXRfYmFsX29mX2NhbGwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLWV4dGVybiB2b2lkIGk5NjBfaGFuZGxlX2FsaWduICgpOwotI2RlZmluZSBIQU5ETEVfQUxJR04oRlJBRykJaTk2MF9oYW5kbGVfYWxpZ24gKEZSQUcpCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFCi0jZGVmaW5lIE5PX1JFTE9DIC0xCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0jZGVmaW5lIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLQotI2RlZmluZSBUQ19GSVhfVFlQRSBzdHJ1Y3QgeyB1bnNpZ25lZCBic3IgOiAxOyB9Ci0jZGVmaW5lIGZ4X2JzciB0Y19maXhfZGF0YS5ic3IKLSNkZWZpbmUgVENfSU5JVF9GSVhfREFUQShGKQkoKEYpLT50Y19maXhfZGF0YS5ic3IgPSAwKQotCi0jZW5kaWYKLQotLyogZW5kIG9mIHRjLWk5NjAuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmMgYi9nYXMvY29uZmlnL3RjLW0zMnIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwZjk5Ny4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW0zMnIuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMDQgKzAsMCBAQAotLyogdGMtbTMyci5jIC0tIEFzc2VtYmxlciBmb3IgdGhlIE1pdHN1YmlzaGkgTTMyUi4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiICAgICAKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGVzL20zMnItZGVzYy5oIgotI2luY2x1ZGUgIm9wY29kZXMvbTMyci1vcGMuaCIKLSNpbmNsdWRlICJjZ2VuLmgiCi0KLS8qIExpbmtlZCBsaXN0IG9mIHN5bWJvbHMgdGhhdCBhcmUgZGVidWdnaW5nIHN5bWJvbHMgdG8gYmUgZGVmaW5lZCBhcyB0aGUKLSAgIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBzeW1fbGluawotewotICBzdHJ1Y3Qgc3ltX2xpbmsgKm5leHQ7Ci0gIHN5bWJvbFMJICAqc3ltYm9sOwotfSBzeW1fbGlua1M7Ci0KLXN0YXRpYyBzeW1fbGlua1MgKmRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7Ci0gIAotLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBkZXNjcmliaW5nCi0gICBhbiBpbmRpdmlkdWFsIGluc3RydWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IENHRU5fSU5TTiAqCWluc247Ci0gIGNvbnN0IENHRU5fSU5TTiAqCW9yaWdfaW5zbjsKLSAgQ0dFTl9GSUVMRFMJCWZpZWxkczsKLSNpZiBDR0VOX0lOVF9JTlNOX1AKLSAgQ0dFTl9JTlNOX0lOVCAgICAgICAgIGJ1ZmZlciBbMV07Ci0jZGVmaW5lIElOU05fVkFMVUUoYnVmKSAoKihidWYpKQotI2Vsc2UKLSAgdW5zaWduZWQgY2hhciAgICAgICAgIGJ1ZmZlciBbQ0dFTl9NQVhfSU5TTl9TSVpFXTsKLSNkZWZpbmUgSU5TTl9WQUxVRShidWYpIChidWYpCi0jZW5kaWYKLSAgY2hhciAqCQlhZGRyOwotICBmcmFnUyAqCQlmcmFnOwotICBpbnQgICAgICAgICAgICAgICAgICAgbnVtX2ZpeHVwczsKLSAgZml4UyAqICAgICAgICAgICAgICAgIGZpeHVwcyBbR0FTX0NHRU5fTUFYX0ZJWFVQU107Ci0gIGludCAgICAgICAgICAgICAgICAgICBpbmRpY2VzIFtNQVhfT1BFUkFORF9JTlNUQU5DRVNdOwotICBzeW1fbGlua1MJCSpkZWJ1Z19zeW1fbGluazsKLX0KLW0zMnJfaW5zbjsKLQotLyogcHJldl9pbnNuLmluc24gaXMgbm9uLW51bGwgaWYgbGFzdCBpbnNuIHdhcyBhIDE2IGJpdCBpbnNuIG9uIGEgMzIgYml0Ci0gICBib3VuZGFyeSAoaS5lLiB3YXMgdGhlIGZpcnN0IG9mIHR3byAxNiBiaXQgaW5zbnMpLiAgKi8KLXN0YXRpYyBtMzJyX2luc24JcHJldl9pbnNuOwotCi0vKiBOb24temVybyBpZiB3ZSd2ZSBzZWVuIGEgcmVsYXhhYmxlIGluc24gc2luY2UgdGhlIGxhc3QgMzIgYml0Ci0gICBhbGlnbm1lbnQgcmVxdWVzdC4gICovCi1zdGF0aWMgaW50IHNlZW5fcmVsYXhhYmxlX3AgPSAwOwotCi0vKiBOb24temVybyBpZiAtcmVsYXggc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIHN1ZmZpY2llbnQgcmVsb2NzIGFyZSBvdXRwdXQKLSAgIGZvciB0aGUgbGlua2VyIHRvIGRvIHJlbGF4aW5nLgotICAgV2UgZG8gc2ltcGxlIGZvcm1zIG9mIHJlbGF4aW5nIGludGVybmFsbHksIGJ1dCB0aGV5IGFyZSBhbHdheXMgZG9uZS4KLSAgIFRoaXMgZmxhZyBkb2VzIG5vdCBhcHBseSB0byB0aGVtLiAgKi8KLXN0YXRpYyBpbnQgbTMycl9yZWxheDsKLQotI2lmIDAgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KLS8qIElmIG5vbi1OVUxMLCBwb2ludGVyIHRvIGNwdSBkZXNjcmlwdGlvbiBmaWxlIHRvIHJlYWQuCi0gICBUaGlzIGFsbG93cyBydW50aW1lIGFkZGl0aW9ucyB0byB0aGUgYXNzZW1ibGVyLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogbTMycl9jcHVfZGVzYzsKLSNlbmRpZgotCi0vKiBOb24temVybyBpZiB3YXJuIHdoZW4gYSBoaWdoL3NoaWdoIHJlbG9jIGhhcyBubyBtYXRjaGluZyBsb3cgcmVsb2MuCi0gICBFYWNoIGhpZ2gvc2hpZ2ggcmVsb2MgbXVzdCBiZSBwYWlyZWQgd2l0aCBpdCdzIGxvdyBjb3VzaW4gaW4gb3JkZXIgdG8KLSAgIHByb3Blcmx5IGNhbGN1bGF0ZSB0aGUgYWRkZW5kIGluIGEgcmVsb2NhdGFibGUgbGluayAoc2luY2UgdGhlcmUgaXMgYQotICAgcG90ZW50aWFsIGNhcnJ5IGZyb20gdGhlIGxvdyB0byB0aGUgaGlnaC9zaGlnaCkuCi0gICBUaGlzIG9wdGlvbiBpcyBvZmYgYnkgZGVmYXVsdCB0aG91Z2ggZm9yIHVzZXItd3JpdHRlbiBhc3NlbWJsZXIgY29kZSBpdAotICAgbWlnaHQgbWFrZSBzZW5zZSB0byBtYWtlIHRoZSBkZWZhdWx0IGJlIG9uIChpLmUuIGhhdmUgZ2NjIHBhc3MgYSBmbGFnCi0gICB0byB0dXJuIGl0IG9mZikuICBUaGlzIHdhcm5pbmcgbXVzdCBub3QgYmUgb24gZm9yIEdDQyBjcmVhdGVkIGNvZGUgYXMKLSAgIG9wdGltaXphdGlvbiBtYXkgZGVsZXRlIHRoZSBsb3cgYnV0IG5vdCB0aGUgaGlnaC9zaGlnaCAoYXQgbGVhc3Qgd2UKLSAgIHNob3VsZG4ndCBhc3N1bWUgb3IgcmVxdWlyZSBpdCB0bykuICAqLwotc3RhdGljIGludCB3YXJuX3VubWF0Y2hlZF9oaWdoID0gMDsKLQotCi0vKiBzdHVmZiBmb3IgLnNjb21tIHN5bWJvbHMuICAqLwotc3RhdGljIHNlZ1QgICAgIHNic3Nfc2VjdGlvbjsKLXN0YXRpYyBhc2VjdGlvbiBzY29tX3NlY3Rpb247Ci1zdGF0aWMgYXN5bWJvbCAgc2NvbV9zeW1ib2w7Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdICAgICAgICA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gICA9ICIjIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSAgICAgICAgICAgID0gImVFIjsKLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gICAgICAgICAgICA9ICJkRCI7Ci0KLS8qIFJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBhcmUgZG9uZSBpbiB0d28KLSAgIHBhcnRzLCB3aXRoIGEgSEkgcmVsb2NhdGlvbiBhbmQgYSBMTyByZWxvY2F0aW9uLiAgRWFjaCByZWxvY2F0aW9uCi0gICBoYXMgb25seSAxNiBiaXRzIG9mIHNwYWNlIHRvIHN0b3JlIGFuIGFkZGVuZC4gIFRoaXMgbWVhbnMgdGhhdCBpbgotICAgb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gaGFuZGxlIGNhcnJpZXMgY29ycmVjdGx5LCBpdCBtdXN0IGJlIGFibGUKLSAgIHRvIGxvY2F0ZSBib3RoIHRoZSBISSBhbmQgdGhlIExPIHJlbG9jYXRpb24uICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICByZWxvY2F0aW9ucyBtdXN0IGFwcGVhciBpbiBvcmRlciBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZS4KLQotICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoaXMsIHdlIGtlZXAgdHJhY2sgb2YgZWFjaCB1bm1hdGNoZWQgSEkKLSAgIHJlbG9jYXRpb24uICBXZSB0aGVuIHNvcnQgdGhlbSBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgTE8gcmVsb2NhdGlvbi4gKi8KLQotc3RydWN0IG0zMnJfaGlfZml4dXAKLXsKLSAgc3RydWN0IG0zMnJfaGlfZml4dXAgKiBuZXh0OyAgLyogTmV4dCBISSBmaXh1cC4gICovCi0gIGZpeFMgKiAgICAgICAgICAgICAgICAgZml4cDsgIC8qIFRoaXMgZml4dXAuICAqLwotICBzZWdUICAgICAgICAgICAgICAgICAgIHNlZzsgICAvKiBUaGUgc2VjdGlvbiB0aGlzIGZpeHVwIGlzIGluLiAgKi8KLQotfTsKLQotLyogVGhlIGxpc3Qgb2YgdW5tYXRjaGVkIEhJIHJlbG9jcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIG0zMnJfaGlfZml4dXBfbGlzdDsKLQotDAotDAotI2RlZmluZSBNMzJSX1NIT1JUT1BUUyAiIgotY29uc3QgY2hhciAqIG1kX3Nob3J0b3B0cyA9IE0zMlJfU0hPUlRPUFRTOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotCi0gIC8qIFNpZ2guICBJIGd1ZXNzIGFsbCB3YXJuaW5ncyBtdXN0IG5vdyBoYXZlIGJvdGggdmFyaWFudHMuICAqLwotI2RlZmluZSBPUFRJT05fV0FSTl9VTk1BVENIRUQgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyJ3YXJuLXVubWF0Y2hlZC1oaWdoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX1VOTUFUQ0hFRH0sCi0gIHsiV3VoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX1VOTUFUQ0hFRH0sCi0jZGVmaW5lIE9QVElPTl9OT19XQVJOX1VOTUFUQ0hFRCAoT1BUSU9OX01EX0JBU0UgKyA1KQotICB7Im5vLXdhcm4tdW5tYXRjaGVkLWhpZ2giLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fVU5NQVRDSEVEfSwKLSAgeyJXbnVoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX1VOTUFUQ0hFRH0sCi0KLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0jZGVmaW5lIE9QVElPTl9SRUxBWCAgKE9QVElPTl9NRF9CQVNFICsgNikKLSAgeyJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVh9LAotI2RlZmluZSBPUFRJT05fQ1BVX0RFU0MgKE9QVElPTl9NRF9CQVNFICsgNykKLSAgeyJjcHUtZGVzYyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ1BVX0RFU0N9LAotI2VuZGlmCi0KLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCAgICBjOwotICAgICBjaGFyICogYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotCi0gICAgY2FzZSBPUFRJT05fV0FSTl9VTk1BVENIRUQ6Ci0gICAgICB3YXJuX3VubWF0Y2hlZF9oaWdoID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fV0FSTl9VTk1BVENIRUQ6Ci0gICAgICB3YXJuX3VubWF0Y2hlZF9oaWdoID0gMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0jaWYgMCAvKiBub3Qgc3VwcG9ydGVkIHlldCAqLwotICAgIGNhc2UgT1BUSU9OX1JFTEFYOgotICAgICAgbTMycl9yZWxheCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9DUFVfREVTQzoKLSAgICAgIG0zMnJfY3B1X2Rlc2MgPSBhcmc7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChhcmcpCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pc2VkIGNvbW1hbmQgbGluZSBvcHRpb246IC0lY1xuIiksIG15bmFtZSwgYyk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pc2VkIGNvbW1hbmQgbGluZSBvcHRpb246IC0lYyVzXG4iKSwgbXluYW1lLCBjLCBhcmcpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICBGSUxFICogc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIiBNMzJSIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zOlxuIikpOwotCi0KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC13YXJuLXVubWF0Y2hlZC1oaWdoICAgIHdhcm4gd2hlbiBhbiAocyloaWdoIHJlbG9jIGhhcyBubyBtYXRjaGluZyBsb3cgcmVsb2NcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoIGRvIG5vdCB3YXJuIGFib3V0IG1pc3NpbmcgbG93IHJlbG9jc1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLSAgLVd1aCAgICAgICAgICAgICAgICAgICAgc3lub255bSBmb3IgLXdhcm4tdW5tYXRjaGVkLWhpZ2hcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1XbnVoICAgICAgICAgICAgICAgICAgIHN5bm9ueW0gZm9yIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoXG4iKSk7Ci0KLSNpZiAwCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotICAtcmVsYXggICAgICAgICAgICAgICAgIGNyZWF0ZSBsaW5rZXIgcmVsYXhhYmxlIGNvZGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0gIC1jcHUtZGVzYyAgICAgICAgICAgICAgcHJvdmlkZSBydW50aW1lIGNwdSBkZXNjcmlwdGlvbiBmaWxlXG4iKSk7Ci0jZW5kaWYKLX0gCi0KLXN0YXRpYyB2b2lkIGZpbGxfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG0zMnJfc2NvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWJ1Z19zeW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBleHBhbmRfZGVidWdfc3ltcyBQQVJBTVMgKChzeW1fbGlua1MgKiwgaW50KSk7Ci0KLS8qIFNldCBieSBtZF9hc3NlbWJsZSBmb3IgdXNlIGJ5IG0zMnJfZmlsbF9pbnNuLiAgKi8KLXN0YXRpYyBzdWJzZWdUIHByZXZfc3Vic2VnOwotc3RhdGljIHNlZ1QgcHJldl9zZWc7Ci0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsgIndvcmQiLAljb25zLAkJNCB9LAotICB7ICJmaWxsaW5zbiIsIGZpbGxfaW5zbiwJMCB9LAotICB7ICJzY29tbSIsCW0zMnJfc2NvbW0sCTAgfSwKLSAgeyAiZGVidWdzeW0iLAlkZWJ1Z19zeW0sCTAgfSwKLSAgeyBOVUxMLCBOVUxMLCAwIH0KLX07Ci0KLS8qIEZJWE1FOiBTaG91bGQgYmUgbWFjaGluZSBnZW5lcmF0ZWQuICAqLwotI2RlZmluZSBOT1BfSU5TTiAweDcwMDAKLSNkZWZpbmUgUEFSX05PUF9JTlNOIDB4ZjAwMCAvKiBjYW4gb25seSBiZSB1c2VkIGluIDJuZCBzbG90ICovCi0KLS8qIFdoZW4gd2UgYWxpZ24gdGhlIC50ZXh0IHNlY3Rpb24sIGluc2VydCB0aGUgY29ycmVjdCBOT1AgcGF0dGVybi4KLSAgIE4gaXMgdGhlIHBvd2VyIG9mIDIgYWxpZ25tZW50LiAgTEVOIGlzIHRoZSBsZW5ndGggb2YgcGF0dGVybiBGSUxMLgotICAgTUFYIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHNraXAgd2hlbiBkb2luZyB0aGUgYWxpZ25tZW50LAotICAgb3IgMCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLiAgKi8KLQotaW50Ci1tMzJyX2RvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50ICAgICAgICAgIG47Ci0gICAgIGNvbnN0IGNoYXIgKiBmaWxsOwotICAgICBpbnQgICAgICAgICAgbGVuOwotICAgICBpbnQgICAgICAgICAgbWF4OwotewotICAvKiBPbmx5IGRvIHRoaXMgaWYgdGhlIGZpbGwgcGF0dGVybiB3YXNuJ3Qgc3BlY2lmaWVkLiAgKi8KLSAgaWYgKGZpbGwgPT0gTlVMTAotICAgICAgJiYgc3Vic2VnX3RleHRfcCAobm93X3NlZykKLSAgICAgIC8qIE9ubHkgZG8gdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlmIGFsaWduaW5nIHRvIGF0IGxlYXN0IGEKLQkgNCBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgICAgICYmIG4gPiAxCi0gICAgIC8qIE9ubHkgZG8gdGhpcyBzcGVjaWFsIGhhbmRsaW5nIGlmIHdlJ3JlIGFsbG93ZWQgdG8gZW1pdCBhdAotCSBsZWFzdCB0d28gYnl0ZXMuICAqLwotICAgICAgJiYgKG1heCA9PSAwIHx8IG1heCA+IDEpKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vcF9wYXR0ZXJuW10gPSB7IDB4ZjAsIDB4MDAgfTsKLQotI2lmIDAKLSAgICAgIC8qIEZpcnN0IGFsaWduIHRvIGEgMiBieXRlIGJvdW5kYXJ5LCBpbiBjYXNlIHRoZXJlIGlzIGFuIG9kZCAuYnl0ZS4gICovCi0gICAgICAvKiBGSVhNRTogSG93IG11Y2ggbWVtb3J5IHdpbGwgY2F1c2UgZ2FzIHRvIHVzZSB3aGVuIGFzc2VtYmxpbmcgYSBiaWcKLQkgcHJvZ3JhbT8gIFBlcmhhcHMgd2UgY2FuIGF2b2lkIHRoZSBmcmFnX2FsaWduIGNhbGw/ICAqLwotICAgICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0jZW5kaWYKLSAgICAgIC8qIE5leHQgYWxpZ24gdG8gYSA0IGJ5dGUgYm91bmRhcnkgKHdlIGtub3cgbiA+PSAyKSB1c2luZyBhIHBhcmFsbGVsCi0JIG5vcC4gICovCi0gICAgICBmcmFnX2FsaWduX3BhdHRlcm4gKDIsIG5vcF9wYXR0ZXJuLCBzaXplb2Ygbm9wX3BhdHRlcm4sIDApOwotICAgICAgLyogSWYgZG9pbmcgbGFyZ2VyIGFsaWdubWVudHMgdXNlIGEgcmVwZWF0aW5nIHNlcXVlbmNlIG9mIGFwcHJvcHJpYXRlCi0JIG5vcHMuICAqLwotICAgICAgaWYgKG4gPiAyKQotCXsKLQkgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG11bHRpX25vcF9wYXR0ZXJuW10gPQotCSAgeyAweDcwLCAweDAwLCAweGYwLCAweDAwIH07Ci0JICBmcmFnX2FsaWduX3BhdHRlcm4gKG4sIG11bHRpX25vcF9wYXR0ZXJuLCBzaXplb2YgbXVsdGlfbm9wX3BhdHRlcm4sCi0JCQkgICAgICBtYXggPyBtYXggLSAyIDogMCk7Ci0JfQotICAgICAgCi0gICAgICBwcmV2X2luc24uaW5zbiA9IE5VTEw7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIElmIHRoZSBsYXN0IGluc3RydWN0aW9uIHdhcyB0aGUgZmlyc3Qgb2YgMiAxNiBiaXQgaW5zbnMsCi0gICBvdXRwdXQgYSBub3AgdG8gbW92ZSB0aGUgUEMgdG8gYSAzMiBiaXQgYm91bmRhcnkuCi0KLSAgIFRoaXMgaXMgZG9uZSB2aWEgYW4gYWxpZ25tZW50IHNwZWNpZmljYXRpb24gc2luY2UgYnJhbmNoIHJlbGF4aW5nCi0gICBtYXkgbWFrZSBpdCB1bm5lY2Vzc2FyeS4KLQotICAgSW50ZXJuYWxseSwgd2UgbmVlZCB0byBvdXRwdXQgb25lIG9mIHRoZXNlIGVhY2ggdGltZSBhIDMyIGJpdCBpbnNuIGlzCi0gICBzZWVuIGFmdGVyIGFuIGluc24gdGhhdCBpcyByZWxheGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotZmlsbF9pbnNuIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gICh2b2lkKSBtMzJyX2RvX2FsaWduICgyLCBOVUxMLCAwLCAwKTsKLSAgcHJldl9pbnNuLmluc24gPSBOVUxMOwotICBzZWVuX3JlbGF4YWJsZV9wID0gMDsKLX0KLQotLyogUmVjb3JkIHRoZSBzeW1ib2wgc28gdGhhdCB3aGVuIHdlIG91dHB1dCB0aGUgaW5zbiwgd2UgY2FuIGNyZWF0ZQotICAgYSBzeW1ib2wgdGhhdCBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkCi0gICB0byBlbWl0IHRoZSBsYWJlbCBmb3IgdGhlIHN0YXJ0IG9mIGEgYnJlYWtwb2ludCB3aXRob3V0IGNhdXNpbmcKLSAgIHRoZSBhc3NlbWJsZXIgdG8gZW1pdCBhIE5PUCBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gd2FzIGEKLSAgIDE2IGJpdCBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1kZWJ1Z19zeW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBkZWxpbTsKLSAgcmVnaXN0ZXIgY2hhciAqZW5kX25hbWU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHJlZ2lzdGVyIHN5bV9saW5rUyAqbGluazsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBkZWxpbSA9IGdldF9zeW1ib2xfZW5kICgpOwotICBlbmRfbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAKLSAgaWYgKChzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpKSA9PSBOVUxMCi0gICAgICAmJiAoc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgICB9Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCk7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmIFNfR0VUX1NFR01FTlQgKHN5bWJvbFApICE9IHJlZ19zZWN0aW9uKQotICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgYXNfYmFkIChfKCJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBsaW5rID0gKHN5bV9saW5rUyAqKSB4bWFsbG9jIChzaXplb2YgKHN5bV9saW5rUykpOwotICAgICAgbGluay0+c3ltYm9sID0gc3ltYm9sUDsKLSAgICAgIGxpbmstPm5leHQgPSBkZWJ1Z19zeW1fbGluazsKLSAgICAgIGRlYnVnX3N5bV9saW5rID0gbGluazsKLSAgICAgIHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKS0+bG9jYWwgPSAxOwotICAgIH0KLQotICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogU2Vjb25kIHBhc3MgdG8gZXhwYW5kaW5nIHRoZSBkZWJ1ZyBzeW1ib2xzLCBnbyB0aHJvdWdoIGxpbmtlZAotICAgbGlzdCBvZiBzeW1ib2xzIGFuZCByZWFzc2lnbiB0aGUgYWRkcmVzcy4gICovCi0KLXN0YXRpYyB2b2lkCi1leHBhbmRfZGVidWdfc3ltcyAoc3ltcywgYWxpZ24pCi0gICAgIHN5bV9saW5rUyAqc3ltczsKLSAgICAgaW50IGFsaWduOwotewotICBjaGFyICpzYXZlX2lucHV0X2xpbmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHN5bV9saW5rUyAqbmV4dF9zeW1zOwotCi0gIGlmICghc3ltcykKLSAgICByZXR1cm47Ci0KLSAgKHZvaWQpIG0zMnJfZG9fYWxpZ24gKGFsaWduLCBOVUxMLCAwLCAwKTsKLSAgZm9yICg7IHN5bXMgIT0gKHN5bV9saW5rUyAqKTA7IHN5bXMgPSBuZXh0X3N5bXMpCi0gICAgewotICAgICAgc3ltYm9sUyAqc3ltYm9sUCA9IHN5bXMtPnN5bWJvbDsKLSAgICAgIG5leHRfc3ltcyA9IHN5bXMtPm5leHQ7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAiLlxuIjsKLSAgICAgIHBzZXVkb19zZXQgKHN5bWJvbFApOwotICAgICAgZnJlZSAoKGNoYXIgKilzeW1zKTsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lOwotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byBmaWxsX2luc24gY2FsbGVkIGFmdGVyIGEgbGFiZWwgYW5kIGF0IGVuZCBvZiBhc3NlbWJseS4KLSAgIFRoZSByZXN1bHQgaXMgYWx3YXlzIDE6IHdlJ3JlIGNhbGxlZCBpbiBhIGNvbmRpdGlvbmFsIHRvIHNlZSBpZiB0aGUKLSAgIGN1cnJlbnQgbGluZSBpcyBhIGxhYmVsLiAgKi8KLQotaW50Ci1tMzJyX2ZpbGxfaW5zbiAoZG9uZSkKLSAgICAgaW50IGRvbmU7Ci17Ci0gIGlmIChwcmV2X3NlZyAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNlZ1QgICAgc2VnICAgID0gbm93X3NlZzsKLSAgICAgIHN1YnNlZ1Qgc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICAgICAgc3Vic2VnX3NldCAocHJldl9zZWcsIHByZXZfc3Vic2VnKTsKLSAgICAgIAotICAgICAgZmlsbF9pbnNuICgwKTsKLQotICAgICAgc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpOwotICAgIH0KLQotICBpZiAoZG9uZSAmJiBkZWJ1Z19zeW1fbGluaykKLSAgICB7Ci0gICAgICBleHBhbmRfZGVidWdfc3ltcyAoZGVidWdfc3ltX2xpbmssIDEpOwotICAgICAgZGVidWdfc3ltX2xpbmsgPSAoc3ltX2xpbmtTICopMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0MCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBmbGFnd29yZCBhcHBsaWNhYmxlOwotICBzZWdUICAgICBzZWc7Ci0gIHN1YnNlZ1QgIHN1YnNlZzsKLQotICAvKiBJbml0aWFsaXplIHRoZSBgY2dlbicgaW50ZXJmYWNlLiAgKi8KLSAgCi0gIC8qIFNldCB0aGUgbWFjaGluZSBudW1iZXIgYW5kIGVuZGlhbi4gICovCi0gIGdhc19jZ2VuX2NwdV9kZXNjID0gbTMycl9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX01BQ0hTLCAwLAotCQkJCQkgIENHRU5fQ1BVX09QRU5fRU5ESUFOLAotCQkJCQkgIENHRU5fRU5ESUFOX0JJRywKLQkJCQkJICBDR0VOX0NQVV9PUEVOX0VORCk7Ci0gIG0zMnJfY2dlbl9pbml0X2FzbSAoZ2FzX2NnZW5fY3B1X2Rlc2MpOwotCi0gIC8qIFRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlIGlzIHVzZWQgZHVyaW5nIG9wdGltaXphdGlvbiB0byBkZXRlcm1pbmUKLSAgICAgd2hpY2ggaW5zbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLiAgSXQgaXMgYWxzbyB1c2VkIHRvIGdpdmUKLSAgICAgd2FybmluZ3MgcmVnYXJkaW5nIG9wZXJhbmQgaW50ZXJmZXJlbmNlIGluIHBhcmFsbGVsIGluc25zLiAgKi8KLSAgbTMycl9jZ2VuX2luaXRfb3BpbnN0X3RhYmxlIChnYXNfY2dlbl9jcHVfZGVzYyk7Ci0KLSAgLyogVGhpcyBpcyBhIGNhbGxiYWNrIGZyb20gY2dlbiB0byBnYXMgdG8gcGFyc2Ugb3BlcmFuZHMuICAqLwotICBjZ2VuX3NldF9wYXJzZV9vcGVyYW5kX2ZuIChnYXNfY2dlbl9jcHVfZGVzYywgZ2FzX2NnZW5fcGFyc2Vfb3BlcmFuZCk7Ci0KLSNpZiAwIC8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0gIC8qIElmIGEgcnVudGltZSBjcHUgZGVzY3JpcHRpb24gZmlsZSB3YXMgcHJvdmlkZWQsIHBhcnNlIGl0LiAgKi8KLSAgaWYgKG0zMnJfY3B1X2Rlc2MgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogZXJybXNnOwotCi0gICAgICBlcnJtc2cgPSBjZ2VuX3JlYWRfY3B1X2ZpbGUgKGdhc19jZ2VuX2NwdV9kZXNjLCBtMzJyX2NwdV9kZXNjKTsKLSAgICAgIGlmIChlcnJtc2cgIT0gTlVMTCkKLQlhc19iYWQgKCIlczogJXMiLCBtMzJyX2NwdV9kZXNjLCBlcnJtc2cpOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIFNhdmUgdGhlIGN1cnJlbnQgc3Vic2VnIHNvIHdlIGNhbiByZXN0b3JlIGl0IFtpdCdzIHRoZSBkZWZhdWx0IG9uZSBhbmQKLSAgICAgd2UgZG9uJ3Qgd2FudCB0aGUgaW5pdGlhbCBzZWN0aW9uIHRvIGJlIC5zYnNzXS4gICovCi0gIHNlZyAgICA9IG5vd19zZWc7Ci0gIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgLyogVGhlIHNic3Mgc2VjdGlvbiBpcyBmb3IgbG9jYWwgLnNjb21tIHN5bWJvbHMuICAqLwotICBzYnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnNic3MiLCAwKTsKLSAgCi0gIC8qIFRoaXMgaXMgY29waWVkIGZyb20gcGVyZm9ybV9hbl9hc3NlbWJseV9wYXNzLiAgKi8KLSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUgJiBTRUNfQUxMT0MpOwotICAKLSNpZiAwIC8qIFdoYXQgZG9lcyB0aGlzIGRvPyBbc2VlIHBlcmZvcm1fYW5fYXNzZW1ibHlfcGFzc10gICovCi0gIHNlZ19pbmZvIChic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0jZW5kaWYKLQotICBzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0KLSAgLyogV2UgbXVzdCBjb25zdHJ1Y3QgYSBmYWtlIHNlY3Rpb24gc2ltaWxhciB0byBiZmRfY29tX3NlY3Rpb24KLSAgICAgYnV0IHdpdGggdGhlIG5hbWUgLnNjb21tb24uICAqLwotICBzY29tX3NlY3Rpb24gICAgICAgICAgICAgICAgPSBiZmRfY29tX3NlY3Rpb247Ci0gIHNjb21fc2VjdGlvbi5uYW1lICAgICAgICAgICA9ICIuc2NvbW1vbiI7Ci0gIHNjb21fc2VjdGlvbi5vdXRwdXRfc2VjdGlvbiA9ICYgc2NvbV9zZWN0aW9uOwotICBzY29tX3NlY3Rpb24uc3ltYm9sICAgICAgICAgPSAmIHNjb21fc3ltYm9sOwotICBzY29tX3NlY3Rpb24uc3ltYm9sX3B0cl9wdHIgPSAmIHNjb21fc2VjdGlvbi5zeW1ib2w7Ci0gIHNjb21fc3ltYm9sICAgICAgICAgICAgICAgICA9ICogYmZkX2NvbV9zZWN0aW9uLnN5bWJvbDsKLSAgc2NvbV9zeW1ib2wubmFtZSAgICAgICAgICAgID0gIi5zY29tbW9uIjsKLSAgc2NvbV9zeW1ib2wuc2VjdGlvbiAgICAgICAgID0gJiBzY29tX3NlY3Rpb247Ci0KLX0KLQotCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIG0zMnJfaW5zbiBpbnNuOwotICBjaGFyICogICAgZXJybXNnOwotICBjaGFyICogICAgc3RyMiA9IE5VTEw7Ci0KLSAgLyogSW5pdGlhbGl6ZSBHQVMncyBjZ2VuIGludGVyZmFjZSBmb3IgYSBuZXcgaW5zdHJ1Y3Rpb24uICAqLwotICBnYXNfY2dlbl9pbml0X3BhcnNlICgpOwotCi0gIAotICBpbnNuLmRlYnVnX3N5bV9saW5rID0gZGVidWdfc3ltX2xpbms7Ci0gIGRlYnVnX3N5bV9saW5rID0gKHN5bV9saW5rUyAqKTA7Ci0KLSAgaW5zbi5pbnNuID0gbTMycl9jZ2VuX2Fzc2VtYmxlX2luc24KLSAgICAoZ2FzX2NnZW5fY3B1X2Rlc2MsIHN0ciwgJiBpbnNuLmZpZWxkcywgaW5zbi5idWZmZXIsICYgZXJybXNnKTsKLSAgCi0gIGlmICghaW5zbi5pbnNuKQotICAgIHsKLSAgICAgIGFzX2JhZCAoZXJybXNnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgCi0gIGlmIChDR0VOX0lOU05fQklUU0laRSAoaW5zbi5pbnNuKSA9PSAzMikKLSAgICB7Ci0gICAgICAvKiAzMiBiaXQgaW5zbnMgbXVzdCBsaXZlIG9uIDMyIGJpdCBib3VuZGFyaWVzLiAgKi8KLSAgICAgIGlmIChwcmV2X2luc24uaW5zbiB8fCBzZWVuX3JlbGF4YWJsZV9wKQotCXsKLQkgIC8qID8/PyBJZiBjYWxsaW5nIGZpbGxfaW5zbiB0b28gbWFueSB0aW1lcyB0dXJucyB1cyBpbnRvIGEgbWVtb3J5Ci0JICAgICBwaWcsIGNhbiB3ZSBjYWxsIGEgZm4gdG8gYXNzZW1ibGUgYSBub3AgaW5zdGVhZCBvZgotCSAgICAgIXNlZW5fcmVsYXhhYmxlX3A/ICAqLwotCSAgZmlsbF9pbnNuICgwKTsKLQl9Ci0KLSAgICAgIGV4cGFuZF9kZWJ1Z19zeW1zIChpbnNuLmRlYnVnX3N5bV9saW5rLCAyKTsKLQotICAgICAgLyogRG9lc24ndCByZWFsbHkgbWF0dGVyIHdoYXQgd2UgcGFzcyBmb3IgUkVMQVhfUCBoZXJlLiAgKi8KLSAgICAgIGdhc19jZ2VuX2ZpbmlzaF9pbnNuIChpbnNuLmluc24sIGluc24uYnVmZmVyLAotCQkJICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgaW5zbi5maWVsZHMpLCAxLCBOVUxMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgb25fMzJiaXRfYm91bmRhcnlfcDsKLQotICAgICAgaWYgKENHRU5fSU5TTl9CSVRTSVpFIChpbnNuLmluc24pICE9IDE2KQotCWFib3J0KCk7Ci0KLSAgICAgIGluc24ub3JpZ19pbnNuID0gaW5zbi5pbnNuOwotCi0gICAgICAvKiBDb21wdXRlIHdoZXRoZXIgd2UncmUgb24gYSAzMiBiaXQgYm91bmRhcnkgb3Igbm90LgotCSBwcmV2X2luc24uaW5zbiBpcyBOVUxMIHdoZW4gd2UncmUgb24gYSAzMiBiaXQgYm91bmRhcnkuICAqLwotICAgICAgb25fMzJiaXRfYm91bmRhcnlfcCA9IHByZXZfaW5zbi5pbnNuID09IE5VTEw7Ci0KLQotICAgICAgZXhwYW5kX2RlYnVnX3N5bXMgKGluc24uZGVidWdfc3ltX2xpbmssIDEpOwotCi0gICAgICB7Ci0JaW50IGk7Ci0JZmluaXNoZWRfaW5zblMgZmk7Ci0KLQkvKiBFbnN1cmUgZWFjaCBwYWlyIG9mIDE2IGJpdCBpbnNucyBpcyBpbiB0aGUgc2FtZSBmcmFnLiAgKi8KLQlmcmFnX2dyb3cgKDQpOwotCi0JZ2FzX2NnZW5fZmluaXNoX2luc24gKGluc24ub3JpZ19pbnNuLCBpbnNuLmJ1ZmZlciwKLQkJCSAgICAgIENHRU5fRklFTERTX0JJVFNJWkUgKCYgaW5zbi5maWVsZHMpLAotCQkJICAgICAgMSAvKnJlbGF4X3AqLywgJmZpKTsKLQlpbnNuLmFkZHIgPSBmaS5hZGRyOwotCWluc24uZnJhZyA9IGZpLmZyYWc7Ci0JaW5zbi5udW1fZml4dXBzID0gZmkubnVtX2ZpeHVwczsKLQlmb3IgKGkgPSAwOyBpIDwgZmkubnVtX2ZpeHVwczsgKytpKQotCSAgaW5zbi5maXh1cHNbaV0gPSBmaS5maXh1cHNbaV07Ci0gICAgICB9Ci0KLQotICAgICAgLyogS2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlJ3ZlIHNlZW4gYSBwYWlyIG9mIDE2IGJpdCBpbnNucy4KLQkgcHJldl9pbnNuLmluc24gaXMgTlVMTCB3aGVuIHdlJ3JlIG9uIGEgMzIgYml0IGJvdW5kYXJ5LiAgKi8KLSAgICAgIGlmIChvbl8zMmJpdF9ib3VuZGFyeV9wKQotCXByZXZfaW5zbiA9IGluc247Ci0gICAgICBlbHNlCi0JcHJldl9pbnNuLmluc24gPSBOVUxMOwotICAgICAgCi0gICAgICAvKiBJZiB0aGUgaW5zbiBuZWVkcyB0aGUgZm9sbG93aW5nIG9uZSB0byBiZSBvbiBhIDMyIGJpdCBib3VuZGFyeQotCSAoZS5nLiBzdWJyb3V0aW5lIGNhbGxzKSwgZmlsbCB0aGlzIGluc24ncyBzbG90LiAgKi8KLSAgICAgIGlmIChvbl8zMmJpdF9ib3VuZGFyeV9wCi0JICAmJiBDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbi5vcmlnX2luc24sIENHRU5fSU5TTl9GSUxMX1NMT1QpICE9IDApCi0JZmlsbF9pbnNuICgwKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIHJlbGF4YWJsZSBpbnNuIChjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIGxhcmdlciB2ZXJzaW9uKQotCSBtYXJrIHRoZSBmYWN0IHNvIHRoYXQgd2UgY2FuIGVtaXQgYW4gYWxpZ25tZW50IGRpcmVjdGl2ZSBmb3IgYQotCSBmb2xsb3dpbmcgMzIgYml0IGluc24gaWYgd2Ugc2VlIG9uZS4gICAqLwotICAgICAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLm9yaWdfaW5zbiwgQ0dFTl9JTlNOX1JFTEFYQUJMRSkgIT0gMCkKLQlzZWVuX3JlbGF4YWJsZV9wID0gMTsKLSAgICB9Ci0KLSAgLyogU2V0IHRoZXNlIHNvIG0zMnJfZmlsbF9pbnNuIGNhbiB1c2UgdGhlbS4gICovCi0gIHByZXZfc2VnICAgID0gbm93X3NlZzsKLSAgcHJldl9zdWJzZWcgPSBub3dfc3Vic2VnOwotfQotCi0vKiBUaGUgc3ludGF4IGluIHRoZSBtYW51YWwgc2F5cyBjb25zdGFudHMgYmVnaW4gd2l0aCAnIycuCi0gICBXZSBqdXN0IGlnbm9yZSBpdC4gICovCi0KLXZvaWQgCi1tZF9vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUDsKLXsKLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcjJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKys7Ci0gICAgICBleHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gICAgfQotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1QgICBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWdtZW50KTsKLSAgcmV0dXJuICgoc2l6ZSArICgxIDw8IGFsaWduKSAtIDEpICYgKC0xIDw8IGFsaWduKSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgY2hhciAqIG5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotDAotLyogLnNjb21tIHBzZXVkby1vcCBoYW5kbGVyLgotCi0gICBUaGlzIGlzIGEgbmV3IHBzZXVkby1vcCB0byBoYW5kbGUgcHV0dGluZyBvYmplY3RzIGluIC5zY29tbW9uLgotICAgQnkgZG9pbmcgdGhpcyB0aGUgbGlua2VyIHdvbid0IG5lZWQgdG8gZG8gYW55IHdvcmsgYW5kIG1vcmUgaW1wb3J0YW50bHkKLSAgIGl0IHJlbW92ZXMgdGhlIGltcGxpY2l0IC1HIGFyZyBuZWNlc3NhcnkgdG8gY29ycmVjdGx5IGxpbmsgdGhlIG9iamVjdCBmaWxlLgotKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfc2NvbW0gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqICAgIG5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgICAgICBjOwotICByZWdpc3RlciBjaGFyICogICAgcDsKLSAgb2Zmc2V0VCAgICAgICAgICAgIHNpemU7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKiBzeW1ib2xQOwotICBvZmZzZXRUICAgICAgICAgICAgYWxpZ247Ci0gIGludCAgICAgICAgICAgICAgICBhbGlnbjI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqIHAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKChzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfd2FybiAoXygiLlNDT01Nb24gbGVuZ3RoICglbGQuKSA8MCEgSWdub3JlZC4iKSwgKGxvbmcpIHNpemUpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogVGhlIHRoaXJkIGFyZ3VtZW50IHRvIC5zY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KLSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhbGlnbiA9IDg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKGFsaWduIDw9IDApCi0JewotCSAgYXNfd2FybiAoXygiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpKTsKLQkgIGFsaWduID0gODsKLQl9Ci0gICAgfQotICAvKiBDb252ZXJ0IHRvIGEgcG93ZXIgb2YgMiBhbGlnbm1lbnQuICAqLwotICBpZiAoYWxpZ24pCi0gICAgewotICAgICAgZm9yIChhbGlnbjIgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKysgYWxpZ24yKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGFsaWduICE9IDEpCi0JewotCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhbGlnbjIgPSAwOwotCi0gICogcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKiBwID0gYzsKLQotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJy4iKSwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSBzaXplKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oIkxlbmd0aCBvZiAuc2NvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIiksCi0JICAgICAgU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JICAgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKLQkgICAgICAobG9uZykgc2l6ZSk7Ci0KLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsKQotICAgIHsKLSAgICAgIHNlZ1QgICBvbGRfc2VjICAgID0gbm93X3NlZzsKLSAgICAgIGludCAgICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgICAgIGNoYXIgKiBwZnJhZzsKLQotICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2Jzc19zZWN0aW9uLCBhbGlnbjIpOwotICAgICAgc3Vic2VnX3NldCAoc2Jzc19zZWN0aW9uLCAwKTsKLSAgICAgIAotICAgICAgaWYgKGFsaWduMikKLQlmcmFnX2FsaWduIChhbGlnbjIsIDAsIDApOwotICAgICAgCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gc2Jzc19zZWN0aW9uKQotCXN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0gICAgICAKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotICAgICAgCi0gICAgICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsIHNpemUsCi0JCQkoY2hhciAqKSAwKTsKLSAgICAgICogcGZyYWcgPSAwOwotICAgICAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBzYnNzX3NlY3Rpb24pOwotICAgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgICBzdWJzZWdfc2V0IChvbGRfc2VjLCBvbGRfc3Vic2VjKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0gICAgICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgYWxpZ24yKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsICYgc2NvbV9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIEludGVyZmFjZSB0byByZWxheF9zZWdtZW50LiAgKi8KLQotLyogRklYTUU6IEJ1aWxkIHRhYmxlIGJ5IGhhbmQsIGdldCBpdCB3b3JraW5nLCB0aGVuIG1hY2hpbmUgZ2VuZXJhdGUuICAqLwotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLS8qIFRoZSBmaWVsZHMgYXJlOgotICAgMSkgbW9zdCBwb3NpdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMikgbW9zdCBuZWdhdGl2ZSByZWFjaCBvZiB0aGlzIHN0YXRlLAotICAgMykgaG93IG1hbnkgYnl0ZXMgdGhpcyBtb2RlIHdpbGwgYWRkIHRvIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZyYWcKLSAgIDQpIHdoaWNoIGluZGV4IGludG8gdGhlIHRhYmxlIHRvIHRyeSBpZiB3ZSBjYW4ndCBmaXQgaW50byB0aGlzIG9uZS4gICovCi0KLSAgLyogVGhlIGZpcnN0IGVudHJ5IG11c3QgYmUgdW51c2VkIGJlY2F1c2UgYW4gYHJseF9tb3JlJyB2YWx1ZSBvZiB6ZXJvIGVuZHMKLSAgICAgZWFjaCBsaXN0LiAgKi8KLSAgezEsIDEsIDAsIDB9LAotCi0gIC8qIFRoZSBkaXNwbGFjZW1lbnQgdXNlZCBieSBHQVMgaXMgZnJvbSB0aGUgZW5kIG9mIHRoZSAyIGJ5dGUgaW5zbiwKLSAgICAgc28gd2Ugc3VidHJhY3QgMiBmcm9tIHRoZSBmb2xsb3dpbmcuICAqLwotICAvKiAxNiBiaXQgaW5zbiwgOCBiaXQgZGlzcCAtPiAxMCBiaXQgcmFuZ2UuCi0gICAgIFRoaXMgZG9lc24ndCBoYW5kbGUgYSBicmFuY2ggaW4gdGhlIHJpZ2h0IHNsb3QgYXQgdGhlIGJvcmRlcjoKLSAgICAgdGhlICImIC00IiBpc24ndCB0YWtlbiBpbnRvIGFjY291bnQuICBJdCdzIG5vdCBpbXBvcnRhbnQgZW5vdWdoIHRvCi0gICAgIGNvbXBsaWNhdGUgdGhpbmdzIG92ZXIgaXQsIHNvIHdlIHN1YnRyYWN0IGFuIGV4dHJhIDIgKG9yICsgMiBpbiAtdmUKLSAgICAgY2FzZSkuICAqLwotICB7NTExIC0gMiAtIDIsIC01MTIgLSAyICsgMiwgMCwgMiB9LAotICAvKiAzMiBiaXQgaW5zbiwgMjQgYml0IGRpc3AgLT4gMjYgYml0IHJhbmdlLiAgKi8KLSAgezB4MjAwMDAwMCAtIDEgLSAyLCAtMHgyMDAwMDAwIC0gMiwgMiwgMCB9LAotICAvKiBTYW1lIHRoaW5nLCBidXQgd2l0aCBsZWFkaW5nIG5vcCBmb3IgYWxpZ25tZW50LiAgKi8KLSAgezB4MjAwMDAwMCAtIDEgLSAyLCAtMHgyMDAwMDAwIC0gMiwgNCwgMCB9Ci19OwotCi1sb25nCi1tMzJyX3JlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQotICAgICBmcmFnUyAqIGZyYWdQOwotICAgICBsb25nICAgIHN0cmV0Y2g7Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgYnJhbmNoIGluc24uICAqLwotICBsb25nIGFkZHJlc3MgPSBmcmFnUC0+ZnJfYWRkcmVzcyArIGZyYWdQLT5mcl9maXggLSAyOwotICBsb25nIGdyb3d0aCA9IDA7Ci0KLSAgLyogS2VlcCAzMiBiaXQgaW5zbnMgYWxpZ25lZCBvbiAzMiBiaXQgYm91bmRhcmllcy4gICovCi0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDMpICE9IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAzOwotCSAgZ3Jvd3RoID0gMjsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGlmICgoYWRkcmVzcyAmIDMpID09IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAyOwotCSAgZ3Jvd3RoID0gLTI7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGdyb3d0aCA9IHJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKTsKLQotICAgICAgLyogTG9uZyBqdW1wIG9uIG9kZCBoYWxmd29yZCBib3VuZGFyeT8gICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMiAmJiAoYWRkcmVzcyAmIDMpICE9IDApCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSAzOwotCSAgZ3Jvd3RoICs9IDI7Ci0JfQotICAgIH0KLQotICByZXR1cm4gZ3Jvd3RoOwotfQotCi0vKiBSZXR1cm4gYW4gaW5pdGlhbCBndWVzcyBvZiB0aGUgbGVuZ3RoIGJ5IHdoaWNoIGEgZnJhZ21lbnQgbXVzdCBncm93IHRvCi0gICBob2xkIGEgYnJhbmNoIHRvIHJlYWNoIGl0cyBkZXN0aW5hdGlvbi4KLSAgIEFsc28gdXBkYXRlcyBmcl90eXBlL2ZyX3N1YnR5cGUgYXMgbmVjZXNzYXJ5LgotCi0gICBDYWxsZWQganVzdCBiZWZvcmUgZG9pbmcgcmVsYXhhdGlvbi4KLSAgIEFueSBzeW1ib2wgdGhhdCBpcyBub3cgdW5kZWZpbmVkIHdpbGwgbm90IGJlY29tZSBkZWZpbmVkLgotICAgVGhlIGd1ZXNzIGZvciBmcl92YXIgaXMgQUNUVUFMTFkgdGhlIGdyb3d0aCBiZXlvbmQgZnJfZml4LgotICAgV2hhdGV2ZXIgd2UgZG8gdG8gZ3JvdyBmcl9maXggb3IgZnJfdmFyIGNvbnRyaWJ1dGVzIHRvIG91ciByZXR1cm5lZCB2YWx1ZS4KLSAgIEFsdGhvdWdoIGl0IG1heSBub3QgYmUgZXhwbGljaXQgaW4gdGhlIGZyYWcsIHByZXRlbmQgZnJfdmFyIHN0YXJ0cyB3aXRoIGEKLSAgIDAgdmFsdWUuICAqLwotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudCkKLSAgICAgZnJhZ1MgKiBmcmFnUDsKLSAgICAgc2VnVCAgICBzZWdtZW50OwotewotICBpbnQgICAgb2xkX2ZyX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0KLSAgLyogVGhlIG9ubHkgdGhpbmcgd2UgaGF2ZSB0byBoYW5kbGUgaGVyZSBhcmUgc3ltYm9scyBvdXRzaWRlIG9mIHRoZQotICAgICBjdXJyZW50IHNlZ21lbnQuICBUaGV5IG1heSBiZSB1bmRlZmluZWQgb3IgaW4gYSBkaWZmZXJlbnQgc2VnbWVudCBpbgotICAgICB3aGljaCBjYXNlIGxpbmtlciBzY3JpcHRzIG1heSBwbGFjZSB0aGVtIGFueXdoZXJlLgotICAgICBIb3dldmVyLCB3ZSBjYW4ndCBmaW5pc2ggdGhlIGZyYWdtZW50IGhlcmUgYW5kIGVtaXQgdGhlIHJlbG9jIGFzIGluc24KLSAgICAgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBtYXkgbW92ZSB0aGUgaW5zbiBhYm91dC4gICovCi0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlZ21lbnQpCi0gICAgewotICAgICAgLyogVGhlIHN5bWJvbCBpcyB1bmRlZmluZWQgaW4gdGhpcyBzZWdtZW50LgotCSBDaGFuZ2UgdGhlIHJlbGF4YXRpb24gc3VidHlwZSB0byB0aGUgbWF4IGFsbG93YWJsZSBhbmQgbGVhdmUKLQkgYWxsIGZ1cnRoZXIgaGFuZGxpbmcgdG8gbWRfY29udmVydF9mcmFnLiAgKi8KLSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gMjsKLQotI2lmIDAgLyogQ2FuJ3QgdXNlIHRoaXMsIGJ1dCBsZWF2ZSBpbiBmb3IgaWxsdXN0cmF0aW9uLiAgKi8gICAgIAotICAgICAgLyogQ2hhbmdlIDE2IGJpdCBpbnNuIHRvIDMyIGJpdCBpbnNuLiAgKi8KLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gfD0gMHg4MDsKLQotICAgICAgLyogSW5jcmVhc2Uga25vd24gKGZpeGVkKSBzaXplIG9mIGZyYWdtZW50LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQotICAgICAgLyogQ3JlYXRlIGEgcmVsb2NhdGlvbiBmb3IgaXQuICAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXgsIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEgLyogcGNyZWwgKi8sCi0JICAgICAgIC8qIEZJWE1FOiBDYW4ndCB1c2UgYSByZWFsIEJGRCByZWxvYyBoZXJlLgotCQkgIGdhc19jZ2VuX21kX2FwcGx5X2ZpeDMgY2FuJ3QgaGFuZGxlIGl0LiAgKi8KLQkgICAgICAgQkZEX1JFTE9DX00zMlJfMjZfUENSRUwpOwotCi0gICAgICAvKiBNYXJrIHRoaXMgZnJhZ21lbnQgYXMgZmluaXNoZWQuICAqLwotICAgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0jZWxzZQotICAgICAgewotCWNvbnN0IENHRU5fSU5TTiAqIGluc247Ci0JaW50ICAgICAgICAgICAgICAgaTsKLQotCS8qIFVwZGF0ZSB0aGUgcmVjb3JkZWQgaW5zbi4KLQkgICBGb3J0dW5hdGVseSB3ZSBkb24ndCBoYXZlIHRvIGxvb2sgdmVyeSBmYXIuCi0JICAgRklYTUU6IENoYW5nZSB0aGlzIHRvIHJlY29yZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gdGhlIG5leHQgaGlnaGVyCi0JICAgcmVsYXhhYmxlIGluc24gdG8gdXNlLiAgKi8KLQlmb3IgKGkgPSAwLCBpbnNuID0gZnJhZ1AtPmZyX2NnZW4uaW5zbjsgaSA8IDQ7IGkrKywgaW5zbisrKQotCSAgewotCSAgICBpZiAoKHN0cmNtcCAoQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSwKLQkJCSBDR0VOX0lOU05fTU5FTU9OSUMgKGZyYWdQLT5mcl9jZ2VuLmluc24pKQotCQkgPT0gMCkKLQkJJiYgQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9SRUxBWCkpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JaWYgKGkgPT0gNCkKLQkgIGFib3J0ICgpOwotCi0JZnJhZ1AtPmZyX2NnZW4uaW5zbiA9IGluc247Ci0JcmV0dXJuIDI7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfSAKLQotLyogKmZyYWdQIGhhcyBiZWVuIHJlbGF4ZWQgdG8gaXRzIGZpbmFsIHNpemUsIGFuZCBub3cgbmVlZHMgdG8gaGF2ZQotICAgdGhlIGJ5dGVzIGluc2lkZSBpdCBtb2RpZmllZCB0byBjb25mb3JtIHRvIHRoZSBuZXcgc2l6ZS4KLQotICAgQ2FsbGVkIGFmdGVyIHJlbGF4YXRpb24gaXMgZmluaXNoZWQuCi0gICBmcmFnUC0+ZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAgIGZyYWdQLT5mcl9zdWJ0eXBlIGlzIHRoZSBzdWJ0eXBlIG9mIHdoYXQgdGhlIGFkZHJlc3MgcmVsYXhlZCB0by4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICogICBhYmZkOwotICBzZWdUICAgIHNlYzsKLSAgZnJhZ1MgKiBmcmFnUDsKLXsKLSAgY2hhciAqIG9wY29kZTsKLSAgY2hhciAqIGRpc3BsYWNlbWVudDsKLSAgaW50ICAgIHRhcmdldF9hZGRyZXNzOwotICBpbnQgICAgb3Bjb2RlX2FkZHJlc3M7Ci0gIGludCAgICBleHRlbnNpb247Ci0gIGludCAgICBhZGRlbmQ7Ci0KLSAgb3Bjb2RlID0gZnJhZ1AtPmZyX29wY29kZTsKLQotICAvKiBBZGRyZXNzIG9wY29kZSByZXNpZGVzIGF0IGluIGZpbGUgc3BhY2UuICAqLwotICBvcGNvZGVfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIDI7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSAxIDoKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMiA6Ci0gICAgICBvcGNvZGVbMF0gfD0gMHg4MDsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBkaXNwbGFjZW1lbnQgPSAmIG9wY29kZVsxXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMyA6Ci0gICAgICBvcGNvZGVbMl0gPSBvcGNvZGVbMF0gfCAweDgwOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChvcGNvZGUsIFBBUl9OT1BfSU5TTiwgMik7Ci0gICAgICBvcGNvZGVfYWRkcmVzcyArPSAyOwotICAgICAgZXh0ZW5zaW9uID0gNDsKLSAgICAgIGRpc3BsYWNlbWVudCA9ICYgb3Bjb2RlWzNdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpICE9IHNlYykKLSAgICB7Ci0gICAgICAvKiBzeW1ib2wgbXVzdCBiZSByZXNvbHZlZCBieSBsaW5rZXIgKi8KLSAgICAgIGlmIChmcmFnUC0+ZnJfb2Zmc2V0ICYgMykKLQlhc193YXJuIChfKCJBZGRlbmQgdG8gdW5yZXNvbHZlZCBzeW1ib2wgbm90IG9uIHdvcmQgYm91bmRhcnkuIikpOwotICAgICAgYWRkZW5kID0gZnJhZ1AtPmZyX29mZnNldCA+PiAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFkZHJlc3Mgd2Ugd2FudCB0byByZWFjaCBpbiBmaWxlIHNwYWNlLiAgKi8KLSAgICAgIHRhcmdldF9hZGRyZXNzID0gU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpICsgZnJhZ1AtPmZyX29mZnNldDsKLSAgICAgIHRhcmdldF9hZGRyZXNzICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0gICAgICBhZGRlbmQgPSAodGFyZ2V0X2FkZHJlc3MgLSAob3Bjb2RlX2FkZHJlc3MgJiAtNCkpID4+IDI7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhIHJlbG9jYXRpb24gZm9yIHN5bWJvbHMgdGhhdCBtdXN0IGJlIHJlc29sdmVkIGJ5IHRoZSBsaW5rZXIuCi0gICAgIE90aGVyd2lzZSBvdXRwdXQgdGhlIGNvbXBsZXRlZCBpbnNuLiAgKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgIT0gc2VjKQotICAgIHsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX3N1YnR5cGUgIT0gMSk7Ci0gICAgICBhc3NlcnQgKGZyYWdQLT5mcl9jZ2VuLmluc24gIT0gMCk7Ci0gICAgICBnYXNfY2dlbl9yZWNvcmRfZml4dXAgKGZyYWdQLAotCQkJICAgICAvKiBPZmZzZXQgb2YgYnJhbmNoIGluc24gaW4gZnJhZy4gICovCi0JCQkgICAgIGZyYWdQLT5mcl9maXggKyBleHRlbnNpb24gLSA0LAotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5pbnNuLAotCQkJICAgICA0IC8qbGVuZ3RoKi8sCi0JCQkgICAgIC8qIEZJWE1FOiBxdWljayBoYWNrICovCi0jaWYgMAotCQkJICAgICBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoZ2FzX2NnZW5fY3B1X2Rlc2MsCi0JCQkJCQkJIGZyYWdQLT5mcl9jZ2VuLm9waW5kZXgpLAotI2Vsc2UKLQkJCSAgICAgY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0gKGdhc19jZ2VuX2NwdV9kZXNjLAotCQkJCQkJCSBNMzJSX09QRVJBTkRfRElTUDI0KSwKLSNlbmRpZgotCQkJICAgICBmcmFnUC0+ZnJfY2dlbi5vcGluZm8sCi0JCQkgICAgIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQpOwotICAgIH0KLQotI2RlZmluZSBTSVpFX0ZST01fUkVMQVhfU1RBVEUobikgKChuKSA9PSAxID8gMSA6IDMpCi0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChkaXNwbGFjZW1lbnQsICh2YWx1ZVQpIGFkZGVuZCwKLQkJICAgICAgU0laRV9GUk9NX1JFTEFYX1NUQVRFIChmcmFnUC0+ZnJfc3VidHlwZSkpOwotCi0gIGZyYWdQLT5mcl9maXggKz0gZXh0ZW5zaW9uOwotfQotDAotLyogRnVuY3Rpb25zIGNvbmNlcm5pbmcgcmVsb2NzLiAgKi8KLQotLyogVGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggYSBQQyByZWxhdGl2ZSBqdW1wIHNob3VsZCBiZSBjYWxjdWxhdGVkLAotICAgZ2l2ZW4gYSBQQyByZWxhdGl2ZSByZWxvYy4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4UCwgc2VjKQotICAgICBmaXhTICogZml4UDsKLSAgICAgc2VnVCAgIHNlYzsKLXsKLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VjKSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZCAob3IgaXMgZGVmaW5lZCBidXQgbm90IGluIHRoaXMgc2VjdGlvbikuCi0JIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAoZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlKSAmIC00TDsKLX0KLQotLyogUmV0dXJuIHRoZSBiZmQgcmVsb2MgdHlwZSBmb3IgT1BFUkFORCBvZiBJTlNOIGF0IGZpeHVwIEZJWFAuCi0gICBSZXR1cm5zIEJGRF9SRUxPQ19OT05FIGlmIG5vIHJlbG9jIHR5cGUgY2FuIGJlIGZvdW5kLgotICAgKkZJWFAgbWF5IGJlIG1vZGlmaWVkIGlmIGRlc2lyZWQuICAqLwotCi1iZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLW1kX2NnZW5fbG9va3VwX3JlbG9jIChpbnNuLCBvcGVyYW5kLCBmaXhQKQotICAgICBjb25zdCBDR0VOX0lOU04gKiAgICBpbnNuOwotICAgICBjb25zdCBDR0VOX09QRVJBTkQgKiBvcGVyYW5kOwotICAgICBmaXhTICogICAgICAgICAgICAgICBmaXhQOwotewotICBzd2l0Y2ggKG9wZXJhbmQtPnR5cGUpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDogcmV0dXJuICBCRkRfUkVMT0NfTTMyUl8xMF9QQ1JFTDsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOiByZXR1cm4gQkZEX1JFTE9DX00zMlJfMThfUENSRUw7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDogcmV0dXJuIEJGRF9SRUxPQ19NMzJSXzI2X1BDUkVMOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6IHJldHVybiBCRkRfUkVMT0NfTTMyUl8yNDsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgLyogSWYgbG93L2hpZ2gvc2hpZ2gvc2RhIHdhcyB1c2VkLCBpdCBpcyByZWNvcmRlZCBpbiBgb3BpbmZvJy4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfY2dlbi5vcGluZm8gIT0gMCkKLQlyZXR1cm4gZml4UC0+ZnhfY2dlbi5vcGluZm87Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDogLyogYXZvaWQgLVdhbGwgd2FybmluZyAqLwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gQkZEX1JFTE9DX05PTkU7Ci19Ci0KLS8qIFJlY29yZCBhIEhJMTYgcmVsb2MgZm9yIGxhdGVyIG1hdGNoaW5nIHdpdGggaXRzIExPMTYgY291c2luLiAgKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfcmVjb3JkX2hpMTYgKHJlbG9jX3R5cGUsIGZpeFAsIHNlZykKLSAgICAgaW50ICAgIHJlbG9jX3R5cGU7Ci0gICAgIGZpeFMgKiBmaXhQOwotICAgICBzZWdUICAgc2VnOwotewotICBzdHJ1Y3QgbTMycl9oaV9maXh1cCAqIGhpX2ZpeHVwOwotCi0gIGFzc2VydCAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotCSAgfHwgcmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTyk7Ci0KLSAgaGlfZml4dXAgPSAoKHN0cnVjdCBtMzJyX2hpX2ZpeHVwICopCi0JICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbTMycl9oaV9maXh1cCkpKTsKLSAgaGlfZml4dXAtPmZpeHAgPSBmaXhQOwotICBoaV9maXh1cC0+c2VnICA9IG5vd19zZWc7Ci0gIGhpX2ZpeHVwLT5uZXh0ID0gbTMycl9oaV9maXh1cF9saXN0OwotICAKLSAgbTMycl9oaV9maXh1cF9saXN0ID0gaGlfZml4dXA7Ci19Ci0KLS8qIENhbGxlZCB3aGlsZSBwYXJzaW5nIGFuIGluc3RydWN0aW9uIHRvIGNyZWF0ZSBhIGZpeHVwLgotICAgV2UgbmVlZCB0byBjaGVjayBmb3IgSEkxNiByZWxvY3MgYW5kIHF1ZXVlIHRoZW0gdXAgZm9yIGxhdGVyIHNvcnRpbmcuICAqLwotCi1maXhTICoKLW0zMnJfY2dlbl9yZWNvcmRfZml4dXBfZXhwIChmcmFnLCB3aGVyZSwgaW5zbiwgbGVuZ3RoLCBvcGVyYW5kLCBvcGluZm8sIGV4cCkKLSAgICAgZnJhZ1MgKiAgICAgICAgICAgICAgZnJhZzsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgd2hlcmU7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqICAgIGluc247Ci0gICAgIGludCAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgY29uc3QgQ0dFTl9PUEVSQU5EICogb3BlcmFuZDsKLSAgICAgaW50ICAgICAgICAgICAgICAgICAgb3BpbmZvOwotICAgICBleHByZXNzaW9uUyAqICAgICAgICBleHA7Ci17Ci0gIGZpeFMgKiBmaXhQID0gZ2FzX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCAoZnJhZywgd2hlcmUsIGluc24sIGxlbmd0aCwKLQkJCQkJICAgb3BlcmFuZCwgb3BpbmZvLCBleHApOwotCi0gIHN3aXRjaCAob3BlcmFuZC0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICAvKiBJZiBsb3cvaGlnaC9zaGlnaC9zZGEgd2FzIHVzZWQsIGl0IGlzIHJlY29yZGVkIGluIGBvcGluZm8nLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9jZ2VuLm9waW5mbyA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotCSAgfHwgZml4UC0+ZnhfY2dlbi5vcGluZm8gPT0gQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8pCi0JbTMycl9yZWNvcmRfaGkxNiAoZml4UC0+ZnhfY2dlbi5vcGluZm8sIGZpeFAsIG5vd19zZWcpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6IC8qIGF2b2lkIC1XYWxsIHdhcm5pbmcgKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gZml4UDsKLX0KLQotLyogUmV0dXJuIEJGRCByZWxvYyB0eXBlIGZyb20gb3BpbmZvIGZpZWxkIGluIGEgZml4Uy4KLSAgIEl0J3MgdHJpY2t5IHVzaW5nIGZ4X3JfdHlwZSBpbiBtMzJyX2Zyb2JfZmlsZSBiZWNhdXNlIHRoZSB2YWx1ZXMKLSAgIGFyZSBCRkRfUkVMT0NfVU5VU0VEICsgb3BlcmFuZCBudW1iZXIuICAqLwotI2RlZmluZSBGWF9PUElORk9fUl9UWVBFKGYpICgoZiktPmZ4X2NnZW4ub3BpbmZvKQotCi0vKiBTb3J0IGFueSB1bm1hdGNoZWQgSEkxNiByZWxvY3Mgc28gdGhhdCB0aGV5IGltbWVkaWF0ZWx5IHByZWNlZGUKLSAgIHRoZSBjb3JyZXNwb25kaW5nIExPMTYgcmVsb2MuICBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgbWRfYXBwbHlfZml4IGFuZAotICAgdGNfZ2VuX3JlbG9jLiAgKi8KLQotdm9pZAotbTMycl9mcm9iX2ZpbGUgKCkKLXsKLSAgc3RydWN0IG0zMnJfaGlfZml4dXAgKiBsOwotCi0gIGZvciAobCA9IG0zMnJfaGlfZml4dXBfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzZWdtZW50X2luZm9fdHlwZSAqIHNlZ2luZm87Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgIHBhc3M7Ci0KLSAgICAgIGFzc2VydCAoRlhfT1BJTkZPX1JfVFlQRSAobC0+Zml4cCkgPT0gQkZEX1JFTE9DX00zMlJfSEkxNl9TTE8KLQkgICAgICB8fCBGWF9PUElORk9fUl9UWVBFIChsLT5maXhwKSA9PSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTyk7Ci0KLSAgICAgIC8qIENoZWNrIHF1aWNrbHkgd2hldGhlciB0aGUgbmV4dCBmaXh1cCBoYXBwZW5zIHRvIGJlIGEgbWF0Y2hpbmcgbG93LiAgKi8KLSAgICAgIGlmIChsLT5maXhwLT5meF9uZXh0ICE9IE5VTEwKLQkgICYmIEZYX09QSU5GT19SX1RZUEUgKGwtPmZpeHAtPmZ4X25leHQpID09IEJGRF9SRUxPQ19NMzJSX0xPMTYKLQkgICYmIGwtPmZpeHAtPmZ4X2FkZHN5ID09IGwtPmZpeHAtPmZ4X25leHQtPmZ4X2FkZHN5Ci0JICAmJiBsLT5maXhwLT5meF9vZmZzZXQgPT0gbC0+Zml4cC0+ZnhfbmV4dC0+Znhfb2Zmc2V0KQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBMb29rIHRocm91Z2ggdGhlIGZpeHVwcyBmb3IgdGhpcyBzZWdtZW50IGZvciBhIG1hdGNoaW5nIGBsb3cnLgotICAgICAgICAgV2hlbiB3ZSBmaW5kIG9uZSwgbW92ZSB0aGUgaGlnaC9zaGlnaCBqdXN0IGluIGZyb250IG9mIGl0LiAgV2UgZG8KLSAgICAgICAgIHRoaXMgaW4gdHdvIHBhc3Nlcy4gIEluIHRoZSBmaXJzdCBwYXNzLCB3ZSB0cnkgdG8gZmluZCBhCi0gICAgICAgICB1bmlxdWUgYGxvdycuICBJbiB0aGUgc2Vjb25kIHBhc3MsIHdlIHBlcm1pdCBtdWx0aXBsZSBoaWdoJ3MKLSAgICAgICAgIHJlbG9jcyBmb3IgYSBzaW5nbGUgYGxvdycuICAqLwotICAgICAgc2VnaW5mbyA9IHNlZ19pbmZvIChsLT5zZWcpOwotICAgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7IHBhc3MrKykKLQl7Ci0JICBmaXhTICogZjsKLQkgIGZpeFMgKiBwcmV2OwotCi0JICBwcmV2ID0gTlVMTDsKLQkgIGZvciAoZiA9IHNlZ2luZm8tPmZpeF9yb290OyBmICE9IE5VTEw7IGYgPSBmLT5meF9uZXh0KQotCSAgICB7Ci0JICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGEgYGxvdycgZml4dXAgd2hpY2ggbWF0Y2hlcyBsLT5maXhwLiAgKi8KLQkgICAgICBpZiAoRlhfT1BJTkZPX1JfVFlQRSAoZikgPT0gQkZEX1JFTE9DX00zMlJfTE8xNgotCQkgICYmIGYtPmZ4X2FkZHN5ID09IGwtPmZpeHAtPmZ4X2FkZHN5Ci0JCSAgJiYgZi0+Znhfb2Zmc2V0ID09IGwtPmZpeHAtPmZ4X29mZnNldAotCQkgICYmIChwYXNzID09IDEKLQkJICAgICAgfHwgcHJldiA9PSBOVUxMCi0JCSAgICAgIHx8IChGWF9PUElORk9fUl9UWVBFIChwcmV2KSAhPSBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTwotCQkJICAmJiBGWF9PUElORk9fUl9UWVBFIChwcmV2KSAhPSBCRkRfUkVMT0NfTTMyUl9ISTE2X1VMTykKLQkJICAgICAgfHwgcHJldi0+ZnhfYWRkc3kgIT0gZi0+ZnhfYWRkc3kKLQkJICAgICAgfHwgcHJldi0+Znhfb2Zmc2V0ICE9ICBmLT5meF9vZmZzZXQpKQotCQl7Ci0JCSAgZml4UyAqKiBwZjsKLQotCQkgIC8qIE1vdmUgbC0+Zml4cCBiZWZvcmUgZi4gICovCi0JCSAgZm9yIChwZiA9ICZzZWdpbmZvLT5maXhfcm9vdDsKLQkJICAgICAgICogcGYgIT0gbC0+Zml4cDsKLQkJICAgICAgIHBmID0gJiAoKiBwZiktPmZ4X25leHQpCi0JCSAgICBhc3NlcnQgKCogcGYgIT0gTlVMTCk7Ci0KLQkJICAqIHBmID0gbC0+Zml4cC0+ZnhfbmV4dDsKLQotCQkgIGwtPmZpeHAtPmZ4X25leHQgPSBmOwotCQkgIGlmIChwcmV2ID09IE5VTEwpCi0JCSAgICBzZWdpbmZvLT5maXhfcm9vdCA9IGwtPmZpeHA7Ci0JCSAgZWxzZQotCQkgICAgcHJldi0+ZnhfbmV4dCA9IGwtPmZpeHA7Ci0KLQkJICBicmVhazsKLQkJfQotCi0JICAgICAgcHJldiA9IGY7Ci0JICAgIH0KLQotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci0KLQkgIGlmIChwYXNzID09IDEKLQkgICAgICAmJiB3YXJuX3VubWF0Y2hlZF9oaWdoKQotCSAgICBhc193YXJuX3doZXJlIChsLT5maXhwLT5meF9maWxlLCBsLT5maXhwLT5meF9saW5lLAotCQkJICAgXygiVW5tYXRjaGVkIGhpZ2gvc2hpZ2ggcmVsb2MiKSk7Ci0JfQotICAgIH0KLX0KLQotLyogU2VlIHdoZXRoZXIgd2UgbmVlZCB0byBmb3JjZSBhIHJlbG9jYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuCi0gICBUaGlzIGlzIHVzZWQgdG8gZm9yY2Ugb3V0IHN3aXRjaCBhbmQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2hlbgotICAgcmVsYXhpbmcuICAqLwotCi1pbnQKLW0zMnJfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICogZml4OwotewotICBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotCi0gIGlmICghIG0zMnJfcmVsYXgpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIChmaXgtPmZ4X3BjcmVsCi0JICB8fCAwIC8qID8/PyAqLyk7Ci19Ci0MCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqIGJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50ICAgIG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSovCi0KLS8qIEVxdWFsIHRvIE1BWF9QUkVDSVNJT04gaW4gYXRvZi1pZWVlLmMgKi8KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCAgICAgICAgICAgICAgaTsKLSAgaW50ICAgICAgICAgICAgICBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSAgIHdvcmRzIFtNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKiAgICAgICAgICAgdDsKLSAgY2hhciAqICAgICAgICAgICBhdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgIC8qIEZJWE1FOiBTb21lIHRhcmdldHMgYWxsb3cgb3RoZXIgZm9ybWF0IGNoYXJzIGZvciBiaWdnZXIgc2l6ZXMgaGVyZS4gICovCi0KLSAgICBkZWZhdWx0OgotICAgICAgKiBzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gbWRfYXRvZigpIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotICAqIHNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgICAgICBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwKLQkJCSAgICAgIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1tMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpCi17Ci0gIC8qIElmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIGEgc2VjdGlvbiBhbmQgd2UgaGF2ZSBqdXN0IGVtaXR0ZWQgYQotICAgICAxNiBiaXQgaW5zbiwgdGhlbiBlbWl0IGEgbm9wIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIGVuZHMgb24KLSAgICAgYSAzMiBiaXQgYm91bmRhcnkuICAqLwotICAKLSAgaWYgKHByZXZfaW5zbi5pbnNuIHx8IHNlZW5fcmVsYXhhYmxlX3ApCi0gICAgKHZvaWQpIG0zMnJfZmlsbF9pbnNuICgwKTsKLX0KLQotYm9vbGVhbgotbTMycl9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgIGZpeFMgKmZpeFA7Ci17Ci0KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwpCi0gICAgcmV0dXJuIDE7Ci0gIAotICAvKiBQcmV2ZW50IGFsbCBhZGp1c3RtZW50cyB0byBnbG9iYWwgc3ltYm9scy4gKi8KLSAgaWYgKFNfSVNfRVhURVJOIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICByZXR1cm4gMDsKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tMzJyLmggYi9nYXMvY29uZmlnL3RjLW0zMnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjZmNhMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW0zMnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKiB0Yy1tMzJyLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLW0zMnIuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX00zMlIKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0vKiBsZWFkaW5nIHNwYWNlIHNvIHdpbGwgY29tcGlsZSB3aXRoIGNjICovCi0gI2Vycm9yIE0zMlIgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiTTMyUiBHQVMgIgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tMzJyCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbTMyciIKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLS8qIGNhbGwgbWRfcGNyZWxfZnJvbV9zZWN0aW9uLCBub3QgbWRfcGNyZWxfZnJvbSAqLwotbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpICAgCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIERJRkZfRVhQUl9PSwkJLyogLi1mb28gZ2V0cyB0dXJuZWQgaW50byBQQyByZWxhdGl2ZSByZWxvY3MgKi8KLQotLyogV2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgLndvcmQgc3RyYW5nZWx5LiAgKi8KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0vKiBGb3IgOCB2cyAxNiB2cyAzMiBiaXQgYnJhbmNoIHNlbGVjdGlvbi4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotI2lmIDAKLWV4dGVybiB2b2lkIG0zMnJfcHJlcGFyZV9yZWxheF9zY2FuICgpOwotI2RlZmluZSBtZF9wcmVwYXJlX3JlbGF4X3NjYW4oZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKSBcCi1tMzJyX3ByZXBhcmVfcmVsYXhfc2NhbiAoZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKQotI2Vsc2UKLWV4dGVybiBsb25nIG0zMnJfcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqLCBsb25nKSk7Ci0jZGVmaW5lIG1kX3JlbGF4X2ZyYWcoZnJhZ1AsIHN0cmV0Y2gpIFwKLW0zMnJfcmVsYXhfZnJhZyAoZnJhZ1AsIHN0cmV0Y2gpCi0jZW5kaWYKLS8qIEFjY291bnQgZm9yIG5vcCBpZiAzMiBiaXQgaW5zbiBmYWxscyBvbiBvZGQgaGFsZndvcmQgYm91bmRhcnkuICAqLwotI2RlZmluZSBUQ19DR0VOX01BWF9SRUxBWChpbnNuLCBsZW4pICg2KQotCi0vKiBBbGlnbm1lbnRzIGFyZSB1c2VkIHRvIGVuc3VyZSAzMiBiaXQgaW5zbnMgbGl2ZSBvbiAzMiBiaXQgYm91bmRhcmllcywgc28KLSAgIHdlIHVzZSBhIHNwZWNpYWwgYWxpZ25tZW50IGZ1bmN0aW9uIHRvIGluc2VydCB0aGUgY29ycmVjdCBub3AgcGF0dGVybi4gICovCi1leHRlcm4gaW50IG0zMnJfZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0jZGVmaW5lIG1kX2RvX2FsaWduKG4sIGZpbGwsIGxlbiwgbWF4LCBsKSBcCi1pZiAobTMycl9kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpKSBnb3RvIGwKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX2FwcGx5X2ZpeDMgZ2FzX2NnZW5fbWRfYXBwbHlfZml4MwotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSBtMzJyX2ZpeF9hZGp1c3RhYmxlKGZpeFApCi0KLS8qIEFmdGVyIGNyZWF0aW5nIGEgZml4dXAgZm9yIGFuIGluc3RydWN0aW9uIG9wZXJhbmQsIHdlIG5lZWQgdG8gY2hlY2sgZm9yCi0gICBISTE2IHJlbG9jcyBhbmQgcXVldWUgdGhlbSB1cCBmb3IgbGF0ZXIgc29ydGluZy4gICovCi0jZGVmaW5lIG1kX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cCBtMzJyX2NnZW5fcmVjb3JkX2ZpeHVwX2V4cAotCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotCi0jZGVmaW5lIHRjX2dlbl9yZWxvYyBnYXNfY2dlbl90Y19nZW5fcmVsb2MKLQotI2RlZmluZSB0Y19mcm9iX2ZpbGUoKSBtMzJyX2Zyb2JfZmlsZSAoKQotZXh0ZXJuIHZvaWQgbTMycl9mcm9iX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGVtaXQgdmFyaW91cyByZWxvY3Mgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0LiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIG0zMnJfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotZXh0ZXJuIGludCBtMzJyX2ZvcmNlX3JlbG9jYXRpb24gKCk7Ci0KLS8qIEVuc3VyZSBpbnNucyBhdCBsYWJlbHMgYXJlIGFsaWduZWQgdG8gMzIgYml0IGJvdW5kYXJpZXMuICAqLwotaW50IG0zMnJfZmlsbF9pbnNuIFBBUkFNUyAoKGludCkpOwotI2RlZmluZSBtZF9hZnRlcl9wYXNzX2hvb2soKQltMzJyX2ZpbGxfaW5zbiAoMSkKLSNkZWZpbmUgVENfU1RBUlRfTEFCRUwoY2gsIHB0cikJKGNoID09ICc6JyAmJiBtMzJyX2ZpbGxfaW5zbiAoMCkpCi0KLS8qIEFkZCBleHRyYSBNMzJSIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgRUxGX1RDX1NQRUNJQUxfU0VDVElPTlMgXAotICB7ICIuc2RhdGEiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAotICB7ICIuc2JzcyIsCQlTSFRfTk9CSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwKLQotI2RlZmluZSBtZF9jbGVhbnVwICAgICAgICAgICAgICAgICBtMzJyX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rCi0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rIG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sKLWV4dGVybiB2b2lkIG0zMnJfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2sgKCk7ICAgIApkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjg4NTEuaCBiL2dhcy9jb25maWcvdGMtbTY4ODUxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmQ3NDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tNjg4NTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtbTY4ODUxLmgKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIHBtbXUuaAotICovCi0KLS8qIEkgc3VwcG9zZSB3ZSBoYXZlIHRvIGNvcHlyaWdodCB0aGlzIGZpbGUuICBTb21lb25lIG9uIHRoZSBuZXQgc2VudCBpdAotICAgdG8gdXMgYXMgcGFydCBvZiB0aGUgY2hhbmdlcyBmb3IgdGhlIG02ODg1MSBNZW1vcnkgTWFuYWdlbWVudCBVbml0ICovCi0KLS8qIENvcHlyaWdodCAoQykgMTk4NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR2FzLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgVGhlIEdOVSBhc3NlbWJsZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCi0gICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWS4gIE5vIGF1dGhvciBvciBkaXN0cmlidXRvcgotICAgYWNjZXB0cyByZXNwb25zaWJpbGl0eSB0byBhbnlvbmUgZm9yIHRoZSBjb25zZXF1ZW5jZXMgb2YgdXNpbmcgaXQKLSAgIG9yIGZvciB3aGV0aGVyIGl0IHNlcnZlcyBhbnkgcGFydGljdWxhciBwdXJwb3NlIG9yIHdvcmtzIGF0IGFsbCwKLSAgIHVubGVzcyBoZSBzYXlzIHNvIGluIHdyaXRpbmcuICBSZWZlciB0byB0aGUgR05VIEFzc2VtYmxlciBHZW5lcmFsCi0gICBQdWJsaWMgTGljZW5zZSBmb3IgZnVsbCBkZXRhaWxzLgotICAgCi0gICBFdmVyeW9uZSBpcyBncmFudGVkIHBlcm1pc3Npb24gdG8gY29weSwgbW9kaWZ5IGFuZCByZWRpc3RyaWJ1dGUKLSAgIHRoZSBHTlUgQXNzZW1ibGVyLCBidXQgb25seSB1bmRlciB0aGUgY29uZGl0aW9ucyBkZXNjcmliZWQgaW4gdGhlCi0gICBHTlUgQXNzZW1ibGVyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBBIGNvcHkgb2YgdGhpcyBsaWNlbnNlIGlzCi0gICBzdXBwb3NlZCB0byBoYXZlIGJlZW4gZ2l2ZW4gdG8geW91IGFsb25nIHdpdGggdGhlIEdOVSBBc3NlbWJsZXIKLSAgIHNvIHlvdSBjYW4ga25vdyB5b3VyIHJpZ2h0cyBhbmQgcmVzcG9uc2liaWxpdGllcy4gIEl0IHNob3VsZCBiZQotICAgaW4gYSBmaWxlIG5hbWVkIENPUFlJTkcuICBBbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBjb3B5cmlnaHQKLSAgIG5vdGljZSBhbmQgdGhpcyBub3RpY2UgbXVzdCBiZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4gICovCi0KLSNpZmRlZiBtNjg4NTEKLQotLyoKLSAgSSBkaWRuJ3QgdXNlIG11Y2ggaW1hZ2luYXRpb24gaW4gY2hvb3NpbmcgdGhlIAotICBmb2xsb3dpbmcgY29kZXMsIHNvIG1hbnkgb2YgdGhlbSBhcmVuJ3QgdmVyeQotICBtbmVtb25pYy4gLXJhYgotICAKLSAgUCAgcG1tdSByZWdpc3RlcgotICBQb3NzaWJsZSB2YWx1ZXM6Ci0gIDAwMAlUQwlUcmFuc2xhdGlvbiBDb250cm9sIHJlZwotICAxMDAJQ0FMCUN1cnJlbnQgQWNjZXNzIExldmVsCi0gIDEwMQlWQUwJVmFsaWRhdGUgQWNjZXNzIExldmVsCi0gIDExMAlTQ0MJU3RhY2sgQ2hhbmdlIENvbnRyb2wKLSAgMTExCUFDCUFjY2VzcyBDb250cm9sCi0gIAotICBXICB3aWRlIHBtbXUgcmVnaXN0ZXJzCi0gIFBvc3NpYmxlIHZhbHVlczoKLSAgMDAxCURSUAlEbWEgUm9vdCBQb2ludGVyCi0gIDAxMAlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIKLSAgMDExCUNSUAlDcHUgUm9vdCBQb2ludGVyCi0gIAotICBmCWZ1bmN0aW9uIGNvZGUgcmVnaXN0ZXIKLSAgMAlTRkMKLSAgMQlERkMKLSAgCi0gIFYJVkFMIHJlZ2lzdGVyIG9ubHkKLSAgCi0gIFgJQkFEeCwgQkFDeAotICAxMDAJQkFECUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgRGF0YQotICAxMDEJQkFDCUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgQ29udHJvbAotICAKLSAgWQlQU1IKLSAgWglQQ1NSCi0gIAotICB8CW1lbW9yeSAJCShtb2RlcyAyLTYsIDcuKikKLSAgCi0gICovCi0KLS8qCi0gKiB0aGVzZSBkZWZpbmVzIHNob3VsZCBiZSBpbiBtNjhrLmMgYnV0Ci0gKiBpIHB1dCB0aGVtIGhlcmUgdG8ga2VlcCBhbGwgdGhlIG02ODg1MSBzdHVmZgotICogdG9nZXRoZXIgLXJhYgotICogSkYtLU1ha2Ugc3VyZSB0aGVzZSAjcyBkb24ndCBjbGFzaCB3aXRoIHRoZSBvbmVzIGluIG02OGsuYwotICogVGhhdCB3b3VsZCBiZSBCQUQuCi0gKi8KLSNkZWZpbmUgVEMJKEZQUysxKQkJLyogNDggKi8KLSNkZWZpbmUgRFJQCShUQysxKQkJLyogNDkgKi8KLSNkZWZpbmUgU1JQCShEUlArMSkJCS8qIDUwICovCi0jZGVmaW5lIENSUAkoU1JQKzEpCQkvKiA1MSAqLwotI2RlZmluZSBDQUwJKENSUCsxKQkJLyogNTIgKi8KLSNkZWZpbmUgVkFMCShDQUwrMSkJCS8qIDUzICovCi0jZGVmaW5lIFNDQwkoVkFMKzEpCQkvKiA1NCAqLwotI2RlZmluZSBBQwkoU0NDKzEpCQkvKiA1NSAqLwotI2RlZmluZSBCQUQJKEFDKzEpCQkvKiA1Niw1Nyw1OCw1OSwgNjAsNjEsNjIsNjMgKi8KLSNkZWZpbmUgQkFDCShCQUQrOCkJCS8qIDY0LDY1LDY2LDY3LCA2OCw2OSw3MCw3MSAqLwotI2RlZmluZSBQU1IJKEJBQys4KQkJLyogNzIgKi8KLSNkZWZpbmUgUENTUgkoUFNSKzEpCQkvKiA3MyAqLwotCi0vKiBuYW1lICovCS8qIG9wY29kZSAqLwkJLyogbWF0Y2ggKi8JCS8qIGFyZ3MgKi8KLQoteyJwYmFjIiwJb25lKDB4ZjBjNyksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmFjdyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJhcyIsCW9uZSgweGYwYzYpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJhc3ciLAlvbmUoMHhmMDg2KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYmMiLAlvbmUoMHhmMGMxKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiYmN3IiwJb25lKDB4ZjA4MSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmJzIiwJb25lKDB4ZjBjMCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmJzdyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjYyIsCW9uZSgweGYwY2YpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJjY3ciLAlvbmUoMHhmMDhmKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiY3MiLAlvbmUoMHhmMGNlKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiY3N3IiwJb25lKDB4ZjA4ZSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdjIiwJb25lKDB4ZjBjZCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmdjdyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJncyIsCW9uZSgweGYwY2MpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJnc3ciLAlvbmUoMHhmMDhjKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaWMiLAlvbmUoMHhmMGNiKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBiaWN3IiwJb25lKDB4ZjA4YiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmlzIiwJb25lKDB4ZjBjYSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYmlzdyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJsYyIsCW9uZSgweGYwYzMpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJsY3ciLAlvbmUoMHhmMDgzKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBibHMiLAlvbmUoMHhmMGMyKSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBibHN3IiwJb25lKDB4ZjA4MiksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNjIiwJb25lKDB4ZjBjNSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYnNjdyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJzcyIsCW9uZSgweGYwYzQpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLXsicGJzc3ciLAlvbmUoMHhmMDg0KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid2MiLAlvbmUoMHhmMGM5KSwJCW9uZSgweGZmYmYpLAkJIkJjIn0sCi17InBid2N3IiwJb25lKDB4ZjA4OSksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYndzIiwJb25lKDB4ZjBjOCksCQlvbmUoMHhmZmJmKSwJCSJCYyJ9LAoteyJwYndzdyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZiZiksCQkiQmMifSwKLSAgICAKLSAgICAKLXsicGRiYWMiLAl0d28oMHhmMDQ4LCAweDAwMDcpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJhcyIsCXR3bygweGYwNDgsIDB4MDAwNiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmJjIiwJdHdvKDB4ZjA0OCwgMHgwMDAxKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiYnMiLAl0d28oMHhmMDQ4LCAweDAwMDApLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJjYyIsCXR3bygweGYwNDgsIDB4MDAwZiksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmNzIiwJdHdvKDB4ZjA0OCwgMHgwMDBlKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiZ2MiLAl0d28oMHhmMDQ4LCAweDAwMGQpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJncyIsCXR3bygweGYwNDgsIDB4MDAwYyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmljIiwJdHdvKDB4ZjA0OCwgMHgwMDBiKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRiaXMiLAl0d28oMHhmMDQ4LCAweDAwMGEpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJsYyIsCXR3bygweGYwNDgsIDB4MDAwMyksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYmxzIiwJdHdvKDB4ZjA0OCwgMHgwMDAyKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRic2MiLAl0d28oMHhmMDQ4LCAweDAwMDUpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAoteyJwZGJzcyIsCXR3bygweGYwNDgsIDB4MDAwNCksCXR3bygweGZmZjgsIDB4ZmZmZiksCSJEc0J3In0sCi17InBkYndjIiwJdHdvKDB4ZjA0OCwgMHgwMDA5KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwJIkRzQncifSwKLXsicGRid3MiLAl0d28oMHhmMDQ4LCAweDAwMDgpLAl0d28oMHhmZmY4LCAweGZmZmYpLAkiRHNCdyJ9LAotICAgIAoteyJwZmx1c2hhIiwJdHdvKDB4ZjAwMCwgMHgyNDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiIgfSwKLSAgICAKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzMDEwKSwJdHdvKDB4ZmZjMCwgMHhmZTEwKSwJIlQzVDkiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzgxMCksCXR3bygweGZmYzAsIDB4ZmUxMCksCSJUM1Q5JnMiIH0sCi17InBmbHVzaCIsCXR3bygweGYwMDAsIDB4MzAwOCksCXR3bygweGZmYzAsIDB4ZmUxOCksCSJEM1Q5IiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDM4MDgpLAl0d28oMHhmZmMwLCAweGZlMTgpLAkiRDNUOSZzIiB9LAoteyJwZmx1c2giLAl0d28oMHhmMDAwLCAweDMwMDApLAl0d28oMHhmZmMwLCAweGZlMWUpLAkiZjNUOSIgfSwKLXsicGZsdXNoIiwJdHdvKDB4ZjAwMCwgMHgzODAwKSwJdHdvKDB4ZmZjMCwgMHhmZTFlKSwJImYzVDkmcyIgfSwKLSAgICAKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQxMCksCXR3bygweGZmZjgsIDB4ZmUxMCksCSJUM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwJdHdvKDB4ZmZmOCwgMHhmZTAwKSwJIlQzVDkmcyIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksCXR3bygweGZmZjgsIDB4ZmUxOCksCSJEM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzA4KSwJdHdvKDB4ZmZmOCwgMHhmZTE4KSwJIkQzVDkmcyIgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwMCksCXR3bygweGZmZjgsIDB4ZmUxZSksCSJmM1Q5IiB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwJdHdvKDB4ZmZmOCwgMHhmZTFlKSwJImYzVDkmcyJ9LAotICAgIAoteyJwZmx1c2hyIiwJdHdvKDB4ZjAwMCwgMHhhMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJInxzIiB9LAotICAgIAoteyJwbG9hZHIiLAl0d28oMHhmMDAwLCAweDIyMTApLAl0d28oMHhmZmMwLCAweGZmZjApLAkiVDMmcyIgfSwKLXsicGxvYWRyIiwJdHdvKDB4ZjAwMCwgMHgyMjA4KSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkQzJnMiIH0sCi17InBsb2FkciIsCXR3bygweGYwMDAsIDB4MjIwMCksCXR3bygweGZmYzAsIDB4ZmZmZSksCSJmMyZzIiB9LAoteyJwbG9hZHciLAl0d28oMHhmMDAwLCAweDIwMTApLAl0d28oMHhmZmMwLCAweGZmZjApLAkiVDMmcyIgfSwKLXsicGxvYWR3IiwJdHdvKDB4ZjAwMCwgMHgyMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwJIkQzJnMiIH0sCi17InBsb2FkdyIsCXR3bygweGYwMDAsIDB4MjAwMCksCXR3bygweGZmYzAsIDB4ZmZmZSksCSJmMyZzIiB9LAotICAgIAotICAgIC8qIFRDLCBDUlAsIERSUCwgU1JQLCBDQUwsIFZBTCwgU0NDLCBBQyAqLwoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDAwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSIqc1A4IiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDIwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJQOCVzIiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDAwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJ8c1c4IiB9LAoteyJwbW92ZSIsCXR3bygweGYwMDAsIDB4NDIwMCksCXR3bygweGZmYzAsIDB4ZTNmZiksCSJXOH5zIiB9LAotICAgIAotICAgIC8qIEJBRHgsIEJBQ3ggKi8KLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYyMDApLAl0d28oMHhmZmMwLCAweGUzZTMpLAkiKnNYMyIgfSwKLXsicG1vdmUiLAl0d28oMHhmMDAwLCAweDYwMDApLAl0d28oMHhmZmMwLCAweGUzZTMpLAkiWDMlcyIgfSwKLSAgICAKLSAgICAvKiBQU1IsIFBDU1IgKi8KLSAgICAvKiB7InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MTAwKSwJdHdvKG94ZmZjMCwgb3hmZmZmKSwJIipzWjgiIH0sICovCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIipzWTgiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2MjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlk4JXMiIH0sCi17InBtb3ZlIiwJdHdvKDB4ZjAwMCwgMHg2NjAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIlo4JXMiIH0sCi0gICAgCi17InByZXN0b3JlIiwJb25lKDB4ZjE0MCksCQlvbmUoMHhmZmMwKSwJCSImcyJ9LAoteyJwcmVzdG9yZSIsCW9uZSgweGYxNTgpLAkJb25lKDB4ZmZmOCksCQkiK3MifSwKLXsicHNhdmUiLAlvbmUoMHhmMTAwKSwJCW9uZSgweGZmYzApLAkJIiZzIn0sCi17InBzYXZlIiwJb25lKDB4ZjEwMCksCQlvbmUoMHhmZmMwKSwJCSIrcyJ9LAotICAgIAoteyJwc2FjIiwJdHdvKDB4ZjA0MCwgMHgwMDA3KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzYXMiLAl0d28oMHhmMDQwLCAweDAwMDYpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNiYyIsCXR3bygweGYwNDAsIDB4MDAwMSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2JzIiwJdHdvKDB4ZjA0MCwgMHgwMDAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzY2MiLAl0d28oMHhmMDQwLCAweDAwMGYpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNjcyIsCXR3bygweGYwNDAsIDB4MDAwZSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2djIiwJdHdvKDB4ZjA0MCwgMHgwMDBkKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzZ3MiLAl0d28oMHhmMDQwLCAweDAwMGMpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNpYyIsCXR3bygweGYwNDAsIDB4MDAwYiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc2lzIiwJdHdvKDB4ZjA0MCwgMHgwMDBhKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzbGMiLAl0d28oMHhmMDQwLCAweDAwMDMpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHNscyIsCXR3bygweGYwNDAsIDB4MDAwMiksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3NjIiwJdHdvKDB4ZjA0MCwgMHgwMDA1KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi17InBzc3MiLAl0d28oMHhmMDQwLCAweDAwMDQpLAl0d28oMHhmZmMwLCAweGZmZmYpLAkiQHMifSwKLXsicHN3YyIsCXR3bygweGYwNDAsIDB4MDAwOSksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJAcyJ9LAoteyJwc3dzIiwJdHdvKDB4ZjA0MCwgMHgwMDA4KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwJIkBzIn0sCi0gICAgCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODIxMCksCXR3bygweGZmYzAsIDB4ZTNmMCksCSJUMyZzUTgiIH0sCi17InB0ZXN0ciIsCXR3bygweGYwMDAsIDB4ODMxMCksCXR3bygweGZmYzAsIDB4ZTMxMCksCSJUMyZzUThBOSIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MjA4KSwJdHdvKDB4ZmZjMCwgMHhlM2Y4KSwJIkQzJnNROCIgfSwKLXsicHRlc3RyIiwJdHdvKDB4ZjAwMCwgMHg4MzA4KSwJdHdvKDB4ZmZjMCwgMHhlMzE4KSwJIkQzJnNROEE5IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgyMDApLAl0d28oMHhmZmMwLCAweGUzZmUpLAkiZjMmc1E4IiB9LAoteyJwdGVzdHIiLAl0d28oMHhmMDAwLCAweDgzMDApLAl0d28oMHhmZmMwLCAweGUzMWUpLAkiZjMmc1E4QTkiIH0sCi0gICAgCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODAxMCksCXR3bygweGZmYzAsIDB4ZTNmMCksCSJUMyZzUTgiIH0sCi17InB0ZXN0dyIsCXR3bygweGYwMDAsIDB4ODExMCksCXR3bygweGZmYzAsIDB4ZTMxMCksCSJUMyZzUThBOSIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MDA4KSwJdHdvKDB4ZmZjMCwgMHhlM2Y4KSwJIkQzJnNROCIgfSwKLXsicHRlc3R3IiwJdHdvKDB4ZjAwMCwgMHg4MTA4KSwJdHdvKDB4ZmZjMCwgMHhlMzE4KSwJIkQzJnNROEE5IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgwMDApLAl0d28oMHhmZmMwLCAweGUzZmUpLAkiZjMmc1E4IiB9LAoteyJwdGVzdHciLAl0d28oMHhmMDAwLCAweDgxMDApLAl0d28oMHhmZmMwLCAweGUzMWUpLAkiZjMmc1E4QTkiIH0sCi0gICAgCi17InB0cmFwYWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA3KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYWMiLAl0d28oMHhmMDdjLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYmN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYmNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYmMiLAl0d28oMHhmMDdjLCAweDAwMDEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwYnN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwYnNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAwKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwYnMiLAl0d28oMHhmMDdjLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwY3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwY3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwY3MiLAl0d28oMHhmMDdjLCAweDAwMGUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwZ2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwZ2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBkKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwZ2MiLAl0d28oMHhmMDdjLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwaWN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwaWNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwaWMiLAl0d28oMHhmMDdjLCAweDAwMGIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwaXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwaXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDBhKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwaXMiLAl0d28oMHhmMDdjLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwbHN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwbHNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwbHMiLAl0d28oMHhmMDdjLCAweDAwMDIpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwc2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwc2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA1KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwc2MiLAl0d28oMHhmMDdjLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwd2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwd2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwd2MiLAl0d28oMHhmMDdjLCAweDAwMDkpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB0cmFwd3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiN3In0sCi17InB0cmFwd3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA4KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwJIiNsIn0sCi17InB0cmFwd3MiLAl0d28oMHhmMDdjLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLAkiIn0sCi0gICAgCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MjgwMCksCXR3bygweGZmYzAsIDB4ZmZmZiksCSJWcyZzIn0sCi17InB2YWxpZCIsCXR3bygweGYwMDAsIDB4MmMwMCksCXR3bygweGZmYzAsIDB4ZmZmOCksCSJBMyZzIiB9LAotICAgIAotI2VuZGlmIC8qIG02ODg1MSAqLwotCi0vKiBlbmQgb2YgdGMtbTY4ODUxLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTY4ay5jIGIvZ2FzL2NvbmZpZy90Yy1tNjhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmYzZGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTM4ICswLDAgQEAKLS8qIHRjLW02OGsuYyAtLSBBc3NlbWJsZSBmb3IgdGhlIG02OGsgZmFtaWx5Ci0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9tNjhrLmgiCi0jaW5jbHVkZSAibTY4ay1wYXJzZS5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikKLSNpbmNsdWRlICJlbGYvbTY4ay5oIgotI2VuZGlmCi0KLS8qIFRoaXMgc3RyaW5nIGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gIFRoZSBtYWNybwotICAgdGNfY29tbWVudF9jaGFycyBwb2ludHMgdG8gdGhpcy4gIFdlIHVzZSB0aGlzLCByYXRoZXIgdGhhbiB0aGUKLSAgIHVzdWFsIGNvbW1lbnRfY2hhcnMsIHNvIHRoYXQgdGhlIC0tYml0d2lzZS1vciBvcHRpb24gd2lsbCB3b3JrLiAgKi8KLSNpZiBkZWZpbmVkIChURV9TVlI0KSB8fCBkZWZpbmVkIChURV9ERUxUQSkKLWNvbnN0IGNoYXIgKm02OGtfY29tbWVudF9jaGFycyA9ICJ8IyI7Ci0jZWxzZQotY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzID0gInwiOwotI2VuZGlmCi0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBjb21tZW50cyBsaWtlIHRoaXMgb25lIHdpbGwgYWx3YXlzIHdvcmsuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMqIjsKLQotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1DT05TVCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIGFzCi0gICBpbiAiMGYxMi40NTYiIG9yICIwZDEuMjM0NWUxMiIuICAqLwotCi1DT05TVCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhlRXBQIjsKLQotLyogQWxzbyBiZSBhd2FyZSB0aGF0IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCBtYXkgaGF2ZSB0byBiZQotICAgY2hhbmdlZCBpbiByZWFkLmMgLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLiAgKi8KLQotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLS8qIEFyZSB3ZSB0cnlpbmcgdG8gZ2VuZXJhdGUgUElDIGNvZGU/ICBJZiBzbywgYWJzb2x1dGUgcmVmZXJlbmNlcwotICAgb3VnaHQgdG8gYmUgbWFkZSBpbnRvIGxpbmthZ2UgdGFibGUgcmVmZXJlbmNlcyBvciBwYy1yZWxhdGl2ZQotICAgcmVmZXJlbmNlcy4gIE5vdCBpbXBsZW1lbnRlZC4gIEZvciBFTEYgdGhlcmUgYXJlIG90aGVyIG1lYW5zIAotICAgdG8gZGVub3RlIHBpYyByZWxvY2F0aW9ucy4gICovCi1pbnQgZmxhZ193YW50X3BpYzsKLQotc3RhdGljIGludCBmbGFnX3Nob3J0X3JlZnM7CS8qIC1sIG9wdGlvbiAqLwotc3RhdGljIGludCBmbGFnX2xvbmdfanVtcHM7CS8qIC1TIG9wdGlvbiAqLwotCi0jaWZkZWYgUkVHSVNURVJfUFJFRklYX09QVElPTkFMCi1pbnQgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gUkVHSVNURVJfUFJFRklYX09QVElPTkFMOwotI2Vsc2UKLWludCBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWw7Ci0jZW5kaWYKLQotLyogV2hldGhlciAtLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbCB3YXMgdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLXN0YXRpYyBpbnQgcmVnX3ByZWZpeF9vcHRpb25hbF9zZWVuOwotCi0vKiBUaGUgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IgdG8gdXNlIGJ5IGRlZmF1bHQuICAqLwotc3RhdGljIGVudW0gbTY4a19yZWdpc3RlciBtNjhrX2Zsb2F0X2NvcG51bSA9IENPUDE7Ci0KLS8qIElmIHRoaXMgaXMgbm9uLXplcm8sIHRoZW4gcmVmZXJlbmNlcyB0byBudW1iZXIoJXBjKSB3aWxsIGJlIHRha2VuCi0gICB0byByZWZlciB0byBudW1iZXIsIHJhdGhlciB0aGFuIHRvICVwYyArIG51bWJlci4gICovCi1zdGF0aWMgaW50IG02OGtfYWJzcGNhZGQ7Ci0KLS8qIElmIHRoaXMgaXMgbm9uLXplcm8sIHRoZW4gdGhlIHF1aWNrIGZvcm1zIG9mIHRoZSBtb3ZlLCBhZGQsIGFuZCBzdWIKLSAgIGluc3RydWN0aW9ucyBhcmUgdXNlZCB3aGVuIHBvc3NpYmxlLiAgKi8KLXN0YXRpYyBpbnQgbTY4a19xdWljayA9IDE7Ci0KLS8qIElmIHRoaXMgaXMgbm9uLXplcm8sIHRoZW4gaWYgdGhlIHNpemUgaXMgbm90IHNwZWNpZmllZCBmb3IgYSBiYXNlCi0gICBvciBvdXRlciBkaXNwbGFjZW1lbnQsIHRoZSBhc3NlbWJsZXIgYXNzdW1lcyB0aGF0IHRoZSBzaXplIHNob3VsZAotICAgYmUgMzIgYml0cy4gICovCi1zdGF0aWMgaW50IG02OGtfcmVsMzIgPSAxOwotCi0vKiBUaGlzIGlzIG5vbi16ZXJvIGlmIG02OGtfcmVsMzIgd2FzIHNldCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICAqLwotc3RhdGljIGludCBtNjhrX3JlbDMyX2Zyb21fY21kbGluZTsKLQotLyogVGhlIGRlZmF1bHQgd2lkdGggdG8gdXNlIGZvciBhbiBpbmRleCByZWdpc3RlciB3aGVuIHVzaW5nIGEgYmFzZQotICAgZGlzcGxhY2VtZW50LiAgKi8KLXN0YXRpYyBlbnVtIG02OGtfc2l6ZSBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPSBTSVpFX0xPTkc7Ci0KLS8qIFdlIHdhbnQgdG8gd2FybiBpZiBhbnkgdGV4dCBsYWJlbHMgYXJlIG1pc2FsaWduZWQuICBJbiBvcmRlciB0byBnZXQKLSAgIHRoZSByaWdodCBsaW5lIG51bWJlciwgd2UgbmVlZCB0byByZWNvcmQgdGhlIGxpbmUgbnVtYmVyIGZvciBlYWNoCi0gICBsYWJlbC4gICovCi0KLXN0cnVjdCBsYWJlbF9saW5lCi17Ci0gIHN0cnVjdCBsYWJlbF9saW5lICpuZXh0OwotICBzeW1ib2xTICpsYWJlbDsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIGludCB0ZXh0OwotfTsKLQotLyogVGhlIGxpc3Qgb2YgbGFiZWxzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBsYWJlbF9saW5lICpsYWJlbHM7Ci0KLS8qIFRoZSBjdXJyZW50IGxhYmVsLiAgKi8KLQotc3RhdGljIHN0cnVjdCBsYWJlbF9saW5lICpjdXJyZW50X2xhYmVsOwotCi0vKiBJdHMgYW4gYXJiaXRyYXJ5IG5hbWU6ICBUaGlzIG1lYW5zIEkgZG9uJ3QgYXBwcm92ZSBvZiBpdCAqLwotLyogU2VlIGZsYW1lcyBiZWxvdyAqLwotc3RhdGljIHN0cnVjdCBvYnN0YWNrIHJvYnluOwotCi0jZGVmaW5lIFRBQih4LHkpCSgoKHgpPDwyKSsoeSkpCi0jZGVmaW5lIFRBQlRZUEUoeHkpICAgICAoKHh5KSA+PiAyKQotI2RlZmluZSBCWVRFCQkwCi0jZGVmaW5lIFNIT1JUCQkxCi0jZGVmaW5lIExPTkcJCTIKLSNkZWZpbmUgU1pfVU5ERUYJMwotI3VuZGVmIEJSQU5DSAotLyogQ2FzZSBgZycgZXhjZXB0IHdoZW4gQkNDNjgwMDAgaXMgYXBwbGljYWJsZS4gICovCi0jZGVmaW5lIEFCUkFOQ0gJCTEKLS8qIENvcHJvY2Vzc29yIGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgRkJSQU5DSAkJMgotLyogTW9kZSA3LjIgLS0gcHJvZ3JhbSBjb3VudGVyIGluZGlyZWN0IHdpdGggKDE2LWJpdCkgZGlzcGxhY2VtZW50LAotICAgc3VwcG9ydGVkIG9uIGFsbCBjcHVzLiAgV2lkZW5zIHRvIDMyLWJpdCBhYnNvbHV0ZS4gICovCi0jZGVmaW5lIFBDUkVMCQkzCi0vKiBGb3IgaW5zZXJ0aW5nIGFuIGV4dHJhIGptcCBpbnN0cnVjdGlvbiB3aXRoIGxvbmcgb2Zmc2V0IG9uIDY4MDAwLAotICAgZm9yIGV4cGFuZGluZyBjb25kaXRpb25hbCBicmFuY2hlcy4gIChOb3QgYnNyIG9yIGJyYS4pICBTaW5jZSB0aGUKLSAgIDY4MDAwIGRvZXNuJ3Qgc3VwcG9ydCAzMi1iaXQgZGlzcGxhY2VtZW50cyBmb3IgY29uZGl0aW9uYWwKLSAgIGJyYW5jaGVzLCB3ZSBmYWtlIGl0IGJ5IHJldmVyc2luZyB0aGUgY29uZGl0aW9uIGFuZCBicmFuY2hpbmcKLSAgIGFyb3VuZCBhIGptcCB3aXRoIGFuIGFic29sdXRlIGxvbmcgb3BlcmFuZC4gICovCi0jZGVmaW5lIEJDQzY4MDAwICAgICAgICA0Ci0vKiBGb3IgdGhlIERCY2MgImluc3RydWN0aW9ucyIuICBJZiB0aGUgZGlzcGxhY2VtZW50IHJlcXVpcmVzIDMyIGJpdHMsCi0gICB0aGUgYnJhbmNoLWFyb3VuZC1hLWp1bXAgZ2FtZSBpcyBwbGF5ZWQgaGVyZSB0b28uICAqLwotI2RlZmluZSBEQkNDICAgICAgICAgICAgNQotLyogTm90IGN1cnJlbnRseSB1c2VkPyAgKi8KLSNkZWZpbmUgUENMRUEJCTYKLS8qIE1vZGUgQUlORFggKGFwYy1yZWxhdGl2ZSkgdXNpbmcgUEMsIHdpdGggdmFyaWFibGUgdGFyZ2V0LCBtaWdodCBmaXQKLSAgIGluIDE2IG9yIDggYml0cy4gICovCi0jZGVmaW5lIFBDSU5ERVgJCTcKLQotc3RydWN0IG02OGtfaW5jYW50Ci0gIHsKLSAgICBjb25zdCBjaGFyICptX29wZXJhbmRzOwotICAgIHVuc2lnbmVkIGxvbmcgbV9vcGNvZGU7Ci0gICAgc2hvcnQgbV9vcG51bTsKLSAgICBzaG9ydCBtX2NvZGVudW07Ci0gICAgaW50IG1fYXJjaDsKLSAgICBzdHJ1Y3QgbTY4a19pbmNhbnQgKm1fbmV4dDsKLSAgfTsKLQotI2RlZmluZSBnZXRvbmUoeCkJKCgoKHgpLT5tX29wY29kZSk+PjE2KSYweGZmZmYpCi0jZGVmaW5lIGdldHR3byh4KQkoKCh4KS0+bV9vcGNvZGUpJjB4ZmZmZikKLQotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwMDBfY29udHJvbF9yZWdzW10gPSB7IDAgfTsKLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4MDEwX2NvbnRyb2xfcmVnc1tdID0gewotICBTRkMsIERGQywgVVNQLCBWQlIsCi0gIDAKLX07Ci1zdGF0aWMgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyIG02ODAyMF9jb250cm9sX3JlZ3NbXSA9IHsKLSAgU0ZDLCBERkMsIFVTUCwgVkJSLCBDQUNSLCBDQUFSLCBNU1AsIElTUCwKLSAgMAotfTsKLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgbTY4MDQwX2NvbnRyb2xfcmVnc1tdID0gewotICBTRkMsIERGQywgQ0FDUiwgVEMsIElUVDAsIElUVDEsIERUVDAsIERUVDEsCi0gIFVTUCwgVkJSLCBNU1AsIElTUCwgTU1VU1IsIFVSUCwgU1JQLAotICAwCi19Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtNjgwNjBfY29udHJvbF9yZWdzW10gPSB7Ci0gIFNGQywgREZDLCBDQUNSLCBUQywgSVRUMCwgSVRUMSwgRFRUMCwgRFRUMSwgQlVTQ1IsCi0gIFVTUCwgVkJSLCBVUlAsIFNSUCwgUENSLAotICAwCi19Owotc3RhdGljIGNvbnN0IGVudW0gbTY4a19yZWdpc3RlciBtY2ZfY29udHJvbF9yZWdzW10gPSB7Ci0gIENBQ1IsIFRDLCBJVFQwLCBJVFQxLCBEVFQwLCBEVFQxLCBWQlIsIFJPTUJBUiwgCi0gIFJBTUJBUjAsIFJBTUJBUjEsIE1CQVIsCi0gIDAKLX07Ci0jZGVmaW5lIGNwdTMyX2NvbnRyb2xfcmVncyBtNjgwMTBfY29udHJvbF9yZWdzCi0KLXN0YXRpYyBjb25zdCBlbnVtIG02OGtfcmVnaXN0ZXIgKmNvbnRyb2xfcmVnczsKLQotLyogaW50ZXJuYWwgZm9ybSBvZiBhIDY4MDIwIGluc3RydWN0aW9uICovCi1zdHJ1Y3QgbTY4a19pdAotewotICBjb25zdCBjaGFyICplcnJvcjsKLSAgY29uc3QgY2hhciAqYXJnczsJCS8qIGxpc3Qgb2Ygb3Bjb2RlIGluZm8gKi8KLSAgaW50IG51bWFyZ3M7Ci0KLSAgaW50IG51bW87CQkJLyogTnVtYmVyIG9mIHNob3J0cyBpbiBvcGNvZGUgKi8KLSAgc2hvcnQgb3Bjb2RlWzExXTsKLQotICBzdHJ1Y3QgbTY4a19vcCBvcGVyYW5kc1s2XTsKLQotICBpbnQgbmV4cDsJCQkvKiBudW1iZXIgb2YgZXhwcnMgaW4gdXNlICovCi0gIHN0cnVjdCBtNjhrX2V4cCBleHByc1s0XTsKLQotICBpbnQgbmZyYWc7CQkJLyogTnVtYmVyIG9mIGZyYWdzIHdlIGhhdmUgdG8gcHJvZHVjZSAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgZnJhZ29mZjsJCS8qIFdoZXJlIGluIHRoZSBjdXJyZW50IG9wY29kZSB0aGUgZnJhZyBlbmRzICovCi0gICAgICBzeW1ib2xTICpmYWRkOwotICAgICAgb2Zmc2V0VCBmb2ZmOwotICAgICAgaW50IGZyYWd0eTsKLSAgICB9Ci0gIGZyYWdiWzRdOwotCi0gIGludCBucmVsOwkJCS8qIE51bSBvZiByZWxvYyBzdHJ1Y3MgaW4gdXNlICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCBuOwotICAgICAgZXhwcmVzc2lvblMgZXhwOwotICAgICAgY2hhciB3aWQ7Ci0gICAgICBjaGFyIHBjcmVsOwotICAgICAgLyogSW4gYSBwYyByZWxhdGl2ZSBhZGRyZXNzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3MKLQkgb2YgdGhlIG9mZnNldCBhbmQgdGhlIGFkZHJlc3MgdGhhdCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlCi0JIHRvLiAgVGhpcyBkZXBlbmRzIG9uIHRoZSBhZGRyZXNzaW5nIG1vZGUuICBCYXNpY2FsbHkgdGhpcwotCSBpcyB0aGUgdmFsdWUgdG8gcHV0IGluIHRoZSBvZmZzZXQgZmllbGQgdG8gYWRkcmVzcyB0aGUKLQkgZmlyc3QgYnl0ZSBvZiB0aGUgb2Zmc2V0LCB3aXRob3V0IHJlZ2FyZGluZyB0aGUgc3BlY2lhbAotCSBzaWduaWZpY2FuY2Ugb2Ygc29tZSB2YWx1ZXMgKGluIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24sIGZvcgotCSBleGFtcGxlKS4gICovCi0gICAgICBpbnQgcGNyZWxfZml4OwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIFdoZXRoZXIgdGhpcyBleHByZXNzaW9uIG5lZWRzIHNwZWNpYWwgcGljIHJlbG9jYXRpb24sIGFuZCBpZgotCSBzbywgd2hpY2guICAqLwotICAgICAgZW51bSBwaWNfcmVsb2NhdGlvbiBwaWNfcmVsb2M7Ci0jZW5kaWYKLSAgICB9Ci0gIHJlbG9jWzVdOwkJCS8qIEZpdmUgaXMgZW5vdWdoPz8/ICovCi19OwotCi0jZGVmaW5lIGNwdV9vZl9hcmNoKHgpCQkoKHgpICYgKG02ODAwMHVwfG1jZikpCi0jZGVmaW5lIGZsb2F0X29mX2FyY2goeCkJKCh4KSAmIG1mbG9hdCkKLSNkZWZpbmUgbW11X29mX2FyY2goeCkJCSgoeCkgJiBtbW11KQotI2RlZmluZSBhcmNoX2NvbGRmaXJlX3AoeCkJKCgoeCkgJiBtY2YpICE9IDApCi0KLS8qIE1hY3JvcyBmb3IgZGV0ZXJtaW5pbmcgaWYgY3B1IHN1cHBvcnRzIGEgc3BlY2lmaWMgYWRkcmVzc2luZyBtb2RlICovCi0jZGVmaW5lIEhBVkVfTE9OR19CUkFOQ0goeCkJKCh4KSAmIChtNjgwMjB8bTY4MDMwfG02ODA0MHxtNjgwNjB8Y3B1MzIpKQotCi1zdGF0aWMgc3RydWN0IG02OGtfaXQgdGhlX2luczsJLyogdGhlIGluc3RydWN0aW9uIGJlaW5nIGFzc2VtYmxlZCAqLwotCi0jZGVmaW5lIG9wKGV4KQkJKChleCktPmV4cC5YX29wKQotI2RlZmluZSBhZGRzKGV4KQkoKGV4KS0+ZXhwLlhfYWRkX3N5bWJvbCkKLSNkZWZpbmUgc3VicyhleCkJKChleCktPmV4cC5YX29wX3N5bWJvbCkKLSNkZWZpbmUgb2ZmcyhleCkJKChleCktPmV4cC5YX2FkZF9udW1iZXIpCi0KLS8qIE1hY3JvcyBmb3IgYWRkaW5nIHRoaW5ncyB0byB0aGUgbTY4a19pdCBzdHJ1Y3QgKi8KLQotI2RlZmluZSBhZGR3b3JkKHcpCXRoZV9pbnMub3Bjb2RlW3RoZV9pbnMubnVtbysrXT0odykKLQotLyogU3RhdGljIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkIGluc29wIFBBUkFNUyAoKGludCwgY29uc3Qgc3RydWN0IG02OGtfaW5jYW50ICopKTsKLXN0YXRpYyB2b2lkIGFkZF9maXggUEFSQU1TICgoaW50LCBzdHJ1Y3QgbTY4a19leHAgKiwgaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGFkZF9mcmFnIFBBUkFNUyAoKHN5bWJvbFMgKiwgb2Zmc2V0VCwgaW50KSk7Ci0KLS8qIExpa2UgYWRkd29yZCwgYnV0IGdvZXMgQkVGT1JFIGdlbmVyYWwgb3BlcmFuZHMgKi8KLXN0YXRpYyB2b2lkCi1pbnNvcCAodywgb3Bjb2RlKQotICAgICBpbnQgdzsKLSAgICAgY29uc3Qgc3RydWN0IG02OGtfaW5jYW50ICpvcGNvZGU7Ci17Ci0gIGludCB6OwotICBmb3Ioej10aGVfaW5zLm51bW87ej5vcGNvZGUtPm1fY29kZW51bTstLXopCi0gICAgdGhlX2lucy5vcGNvZGVbel09dGhlX2lucy5vcGNvZGVbei0xXTsKLSAgZm9yKHo9MDt6PHRoZV9pbnMubnJlbDt6KyspCi0gICAgdGhlX2lucy5yZWxvY1t6XS5uKz0yOwotICBmb3IgKHogPSAwOyB6IDwgdGhlX2lucy5uZnJhZzsgeisrKQotICAgIHRoZV9pbnMuZnJhZ2Jbel0uZnJhZ29mZisrOwotICB0aGVfaW5zLm9wY29kZVtvcGNvZGUtPm1fY29kZW51bV09dzsKLSAgdGhlX2lucy5udW1vKys7Ci19Ci0KLS8qIFRoZSBudW1vKzEga2x1ZGdlIGlzIHNvIHdlIGNhbiBoaXQgdGhlIGxvdyBvcmRlciBieXRlIG9mIHRoZSBwcmV2IHdvcmQuCi0gICBCbGVjY2guICAqLwotc3RhdGljIHZvaWQKLWFkZF9maXggKHdpZHRoLCBleHAsIHBjX3JlbCwgcGNfZml4KQotICAgICBpbnQgd2lkdGg7Ci0gICAgIHN0cnVjdCBtNjhrX2V4cCAqZXhwOwotICAgICBpbnQgcGNfcmVsOwotICAgICBpbnQgcGNfZml4OwotewotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbF0ubiA9ICgod2lkdGggPT0gJ0InIHx8IHdpZHRoID09ICczJykKLQkJCQkgICA/ICh0aGVfaW5zLm51bW8qMi0xKQotCQkJCSAgIDogKCgod2lkdGgpPT0nYicpCi0JCQkJICAgICAgPyAodGhlX2lucy5udW1vKjIrMSkKLQkJCQkgICAgICA6ICh0aGVfaW5zLm51bW8qMikpKTsKLSAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWxdLmV4cCA9IGV4cC0+ZXhwOwotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbF0ud2lkID0gd2lkdGg7Ci0gIHRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsXS5wY3JlbF9maXggPSBwY19maXg7Ci0jaWZkZWYgT0JKX0VMRgotICB0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbF0ucGljX3JlbG9jID0gZXhwLT5waWNfcmVsb2M7Ci0jZW5kaWYKLSAgdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWwrK10ucGNyZWwgPSBwY19yZWw7Ci19Ci0KLS8qIENhdXNlIGFuIGV4dHJhIGZyYWcgdG8gYmUgZ2VuZXJhdGVkIGhlcmUsIGluc2VydGluZyB1cCB0byAxMCBieXRlcwotICAgKHRoYXQgdmFsdWUgaXMgY2hvc2VuIGluIHRoZSBmcmFnX3ZhciBjYWxsIGluIG1kX2Fzc2VtYmxlKS4gIFRZUEUKLSAgIGlzIHRoZSBzdWJ0eXBlIG9mIHRoZSBmcmFnIHRvIGJlIGdlbmVyYXRlZDsgaXRzIHByaW1hcnkgdHlwZSBpcwotICAgcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0KLSAgIFRoZSBUWVBFIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQgYnkgbWRfY29udmVydF9mcmFnXzEgYW5kCi0gICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheC4gIFRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIGZpeHVwIHdpbGwKLSAgIGJlIGVtaXR0ZWQgYnkgbWRfY29udmVydF9mcmFnXzEuCi0KLSAgIEFERCBiZWNvbWVzIHRoZSBGUl9TWU1CT0wgZmllbGQgb2YgdGhlIGZyYWcsIGFuZCBPRkYgdGhlIEZSX09GRlNFVC4gICovCi1zdGF0aWMgdm9pZAotYWRkX2ZyYWcgKGFkZCwgb2ZmLCB0eXBlKQotICAgICBzeW1ib2xTICphZGQ7Ci0gICAgIG9mZnNldFQgb2ZmOwotICAgICBpbnQgdHlwZTsKLXsKLSAgdGhlX2lucy5mcmFnYlt0aGVfaW5zLm5mcmFnXS5mcmFnb2ZmPXRoZV9pbnMubnVtbzsKLSAgdGhlX2lucy5mcmFnYlt0aGVfaW5zLm5mcmFnXS5mYWRkPWFkZDsKLSAgdGhlX2lucy5mcmFnYlt0aGVfaW5zLm5mcmFnXS5mb2ZmPW9mZjsKLSAgdGhlX2lucy5mcmFnYlt0aGVfaW5zLm5mcmFnKytdLmZyYWd0eT10eXBlOwotfQotCi0jZGVmaW5lIGlzdmFyKGV4KSBcCi0gIChvcCAoZXgpICE9IE9fY29uc3RhbnQgJiYgb3AgKGV4KSAhPSBPX2JpZykKLQotc3RhdGljIGNoYXIgKmNyYWNrX29wZXJhbmQgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgbTY4a19vcCAqb3BQKSk7Ci1zdGF0aWMgaW50IGdldF9udW0gUEFSQU1TICgoc3RydWN0IG02OGtfZXhwICpleHAsIGludCBvaykpOwotc3RhdGljIHZvaWQgbTY4a19pcCBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGluc2VydF9yZWcgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNlbGVjdF9jb250cm9sX3JlZ3MgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgaW5pdF9yZWd0YWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHJldmVyc2VfMTZfYml0cyBQQVJBTVMgKChpbnQgaW4pKTsKLXN0YXRpYyBpbnQgcmV2ZXJzZV84X2JpdHMgUEFSQU1TICgoaW50IGluKSk7Ci1zdGF0aWMgdm9pZCBpbnN0YWxsX2dlbl9vcGVyYW5kIFBBUkFNUyAoKGludCBtb2RlLCBpbnQgdmFsKSk7Ci1zdGF0aWMgdm9pZCBpbnN0YWxsX29wZXJhbmQgUEFSQU1TICgoaW50IG1vZGUsIGludCB2YWwpKTsKLXN0YXRpYyB2b2lkIHNfYnNzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kYXRhMSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZGF0YTIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2V2ZW4gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX3Byb2MgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBtcmlfY2hpcCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzX2NoaXAgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2ZvcHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX29wdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfcmVnIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19yZXN0b3JlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19zYXZlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfaWYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9lbHNlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZW5kaSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2JyZWFrIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfbmV4dCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2ZvciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX2VuZGYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV9yZXBlYXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21yaV91bnRpbCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbXJpX3doaWxlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19tcmlfZW5kdyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1kX2FwcGx5X2ZpeF8yIFBBUkFNUyAoKGZpeFMgKiwgb2Zmc2V0VCkpOwotc3RhdGljIHZvaWQgbWRfY29udmVydF9mcmFnXzEgUEFSQU1TICgoZnJhZ1MgKikpOwotCi1zdGF0aWMgaW50IGN1cnJlbnRfYXJjaGl0ZWN0dXJlOwotCi1zdHJ1Y3QgbTY4a19jcHUgewotICB1bnNpZ25lZCBsb25nIGFyY2g7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGludCBhbGlhczsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbTY4a19jcHUgYXJjaHNbXSA9IHsKLSAgeyBtNjgwMDAsICI2ODAwMCIsIDAgfSwKLSAgeyBtNjgwMTAsICI2ODAxMCIsIDAgfSwKLSAgeyBtNjgwMjAsICI2ODAyMCIsIDAgfSwKLSAgeyBtNjgwMzAsICI2ODAzMCIsIDAgfSwKLSAgeyBtNjgwNDAsICI2ODA0MCIsIDAgfSwKLSAgeyBtNjgwNjAsICI2ODA2MCIsIDAgfSwKLSAgeyBjcHUzMiwgICJjcHUzMiIsIDAgfSwKLSAgeyBtNjg4ODEsICI2ODg4MSIsIDAgfSwKLSAgeyBtNjg4NTEsICI2ODg1MSIsIDAgfSwKLSAgeyBtY2Y1MjAwLCAiNTIwMCIsIDAgfSwKLSAgeyBtY2Y1MjA2ZSwgIjUyMDZlIiwgMCB9LAotICB7IG1jZjUzMDcsICI1MzA3IiwgMH0sCi0gIC8qIEFsaWFzZXMgKGVmZmVjdGl2ZWx5LCBzbyBmYXIgYXMgZ2FzIGlzIGNvbmNlcm5lZCkgZm9yIHRoZSBhYm92ZQotICAgICBjcHVzLiAgKi8KLSAgeyBtNjgwMjAsICI2OGsiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjgwMDgiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjgzMDIiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjgzMDYiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjgzMDciLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjgzMjIiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjgzNTYiLCAxIH0sCi0gIHsgbTY4MDAwLCAiNjhlYzAwMCIsIDEgfSwKLSAgeyBtNjgwMDAsICI2OGhjMDAwIiwgMSB9LAotICB7IG02ODAwMCwgIjY4aGMwMDEiLCAxIH0sCi0gIHsgbTY4MDIwLCAiNjhlYzAyMCIsIDEgfSwKLSAgeyBtNjgwMzAsICI2OGVjMDMwIiwgMSB9LAotICB7IG02ODA0MCwgIjY4ZWMwNDAiLCAxIH0sCi0gIHsgbTY4MDYwLCAiNjhlYzA2MCIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODMzMCIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODMzMSIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODMzMiIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODMzMyIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODMzNCIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODMzNiIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODM0MCIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODM0MSIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODM0OSIsIDEgfSwKLSAgeyBjcHUzMiwgICI2ODM2MCIsIDEgfSwKLSAgeyBtNjg4ODEsICI2ODg4MiIsIDEgfSwKLSAgeyBtY2Y1MjAwLCAiNTIwMiIsIDEgfSwKLSAgeyBtY2Y1MjAwLCAiNTIwNCIsIDEgfSwKLSAgeyBtY2Y1MjAwLCAiNTIwNiIsIDEgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgbl9hcmNocyA9IHNpemVvZiAoYXJjaHMpIC8gc2l6ZW9mIChhcmNoc1swXSk7Ci0KLS8qIEJDQzY4MDAwIGlzIGZvciBwYXRjaGluZyBpbiBhbiBleHRyYSBqbXAgaW5zdHJ1Y3Rpb24gZm9yIGxvbmcgb2Zmc2V0cwotICAgb24gdGhlIDY4MDAwLiAgVGhlIDY4MDAwIGRvZXNuJ3Qgc3VwcG9ydCBsb25nIGJyYW5jaGVzIHdpdGggYnJhbmNocyAqLwotCi0vKiBUaGlzIHRhYmxlIGRlc3JpYmVzIGhvdyB5b3UgY2hhbmdlIHNpemVzIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiB2YXJpYWJsZQotICAgc2l6ZSBleHByZXNzaW9ucy4gIFRoaXMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIHR3byBraW5kcy4gKi8KLQotLyogTm90ZSB0aGF0IGNhbGxzIHRvIGZyYWdfdmFyIG5lZWQgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBleHBhbnNpb24KLSAgIG5lZWRlZDsgdGhpcyBpcyBjdXJyZW50bHkgMTAgYnl0ZXMgZm9yIERCQ0MuICAqLwotCi0vKiBUaGUgZmllbGRzIGFyZToKLSAgIEhvdyBmYXIgRm9yd2FyZCB0aGlzIG1vZGUgd2lsbCByZWFjaDoKLSAgIEhvdyBmYXIgQmFja3dhcmQgdGhpcyBtb2RlIHdpbGwgcmVhY2g6Ci0gICBIb3cgbWFueSBieXRlcyB0aGlzIG1vZGUgd2lsbCBhZGQgdG8gdGhlIHNpemUgb2YgdGhlIGZyYWcKLSAgIFdoaWNoIG1vZGUgdG8gZ28gdG8gaWYgdGhlIG9mZnNldCB3b24ndCBmaXQgaW4gdGhpcyBvbmUKLSAgICovCi1yZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgezEsIDEsIDAsIDB9LAkJCS8qIEZpcnN0IGVudHJpZXMgYXJlbid0IHVzZWQgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIEZvciBubyBnb29kIHJlYXNvbiBleGNlcHQgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHRoYXQgdGhlIFZBWCBkb2Vzbid0IGVpdGhlciAqLwotICB7MSwgMSwgMCwgMH0sCi0KLSAgeygxMjcpLCAoLTEyOCksIDAsIFRBQiAoQUJSQU5DSCwgU0hPUlQpfSwKLSAgeygzMjc2NyksICgtMzI3NjgpLCAyLCBUQUIgKEFCUkFOQ0gsIExPTkcpfSwKLSAgezAsIDAsIDQsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgezEsIDEsIDAsIDB9LAkJCS8qIEZCUkFOQ0ggZG9lc24ndCBjb21lIEJZVEUgKi8KLSAgeygzMjc2NyksICgtMzI3NjgpLCAyLCBUQUIgKEZCUkFOQ0gsIExPTkcpfSwKLSAgezAsIDAsIDQsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0KLSAgezEsIDEsIDAsIDB9LAkJCS8qIFBDUkVMIGRvZXNuJ3QgY29tZSBCWVRFICovCi0gIHsoMzI3NjcpLCAoLTMyNzY4KSwgMiwgVEFCIChQQ1JFTCwgTE9ORyl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLQotICB7KDEyNyksICgtMTI4KSwgMCwgVEFCIChCQ0M2ODAwMCwgU0hPUlQpfSwKLSAgeygzMjc2NyksICgtMzI3NjgpLCAyLCBUQUIgKEJDQzY4MDAwLCBMT05HKX0sCi0gIHswLCAwLCA2LCAwfSwJCQkvKiBqbXAgbG9uZyBzcGFjZSAqLwotICB7MSwgMSwgMCwgMH0sCi0KLSAgezEsIDEsIDAsIDB9LAkJCS8qIERCQ0MgZG9lc24ndCBjb21lIEJZVEUgKi8KLSAgeygzMjc2NyksICgtMzI3NjgpLCAyLCBUQUIgKERCQ0MsIExPTkcpfSwKLSAgezAsIDAsIDEwLCAwfSwJCS8qIGJyYS9qbXAgbG9uZyBzcGFjZSAqLwotICB7MSwgMSwgMCwgMH0sCi0KLSAgezEsIDEsIDAsIDB9LAkJCS8qIFBDTEVBIGRvZXNuJ3QgY29tZSBCWVRFICovCi0gIHszMjc2NywgLTMyNzY4LCAyLCBUQUIgKFBDTEVBLCBMT05HKX0sCi0gIHswLCAwLCA2LCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIC8qIEZvciwgZS5nLiwgam1wIHBjcmVsIGluZGV4ZWQuICAqLwotICB7MTI1LCAtMTMwLCAwLCBUQUIgKFBDSU5ERVgsIFNIT1JUKX0sCi0gIHszMjc2NSwgLTMyNzcwLCAyLCBUQUIgKFBDSU5ERVgsIExPTkcpfSwKLSAgezAsIDAsIDQsIDB9LAotICB7MSwgMSwgMCwgMH0sCi19OwotCi0vKiBUaGVzZSBhcmUgdGhlIG1hY2hpbmUgZGVwZW5kZW50IHBzZXVkby1vcHMuICBUaGVzZSBhcmUgaW5jbHVkZWQgc28KLSAgIHRoZSBhc3NlbWJsZXIgY2FuIHdvcmsgb24gdGhlIG91dHB1dCBmcm9tIHRoZSBTVU4gQyBjb21waWxlciwgd2hpY2gKLSAgIGdlbmVyYXRlcyB0aGVzZS4KLSAgICovCi0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiZGF0YTEiLCBzX2RhdGExLCAwfSwKLSAgeyJkYXRhMiIsIHNfZGF0YTIsIDB9LAotICB7ImJzcyIsIHNfYnNzLCAwfSwKLSAgeyJldmVuIiwgc19ldmVuLCAwfSwKLSAgeyJza2lwIiwgc19zcGFjZSwgMH0sCi0gIHsicHJvYyIsIHNfcHJvYywgMH0sCi0jaWYgZGVmaW5lZCAoVEVfU1VOMykgfHwgZGVmaW5lZCAoT0JKX0VMRikKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotICB7InN3YmVnIiwgc19pZ25vcmUsIDB9LAotI2VuZGlmCi0gIHsiZXh0ZW5kIiwgZmxvYXRfY29ucywgJ3gnfSwKLSAgeyJsZG91YmxlIiwgZmxvYXRfY29ucywgJ3gnfSwKLQotICAvKiBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgYXJlIHN1cHBvcnRlZCBmb3IgTVJJIGNvbXBhdGliaWxpdHkuICAqLwotICB7ImNoaXAiLCBzX2NoaXAsIDB9LAotICB7ImNvbWxpbmUiLCBzX3NwYWNlLCAxfSwKLSAgeyJmb3B0Iiwgc19mb3B0LCAwfSwKLSAgeyJtYXNrMiIsIHNfaWdub3JlLCAwfSwKLSAgeyJvcHQiLCBzX29wdCwgMH0sCi0gIHsicmVnIiwgc19yZWcsIDB9LAotICB7InJlc3RvcmUiLCBzX3Jlc3RvcmUsIDB9LAotICB7InNhdmUiLCBzX3NhdmUsIDB9LAotCi0gIHsiaWYiLCBzX21yaV9pZiwgMH0sCi0gIHsiaWYuYiIsIHNfbXJpX2lmLCAnYid9LAotICB7ImlmLnciLCBzX21yaV9pZiwgJ3cnfSwKLSAgeyJpZi5sIiwgc19tcmlfaWYsICdsJ30sCi0gIHsiZWxzZSIsIHNfbXJpX2Vsc2UsIDB9LAotICB7ImVsc2UucyIsIHNfbXJpX2Vsc2UsICdzJ30sCi0gIHsiZWxzZS5sIiwgc19tcmlfZWxzZSwgJ2wnfSwKLSAgeyJlbmRpIiwgc19tcmlfZW5kaSwgMH0sCi0gIHsiYnJlYWsiLCBzX21yaV9icmVhaywgMH0sCi0gIHsiYnJlYWsucyIsIHNfbXJpX2JyZWFrLCAncyd9LAotICB7ImJyZWFrLmwiLCBzX21yaV9icmVhaywgJ2wnfSwKLSAgeyJuZXh0Iiwgc19tcmlfbmV4dCwgMH0sCi0gIHsibmV4dC5zIiwgc19tcmlfbmV4dCwgJ3MnfSwKLSAgeyJuZXh0LmwiLCBzX21yaV9uZXh0LCAnbCd9LAotICB7ImZvciIsIHNfbXJpX2ZvciwgMH0sCi0gIHsiZm9yLmIiLCBzX21yaV9mb3IsICdiJ30sCi0gIHsiZm9yLnciLCBzX21yaV9mb3IsICd3J30sCi0gIHsiZm9yLmwiLCBzX21yaV9mb3IsICdsJ30sCi0gIHsiZW5kZiIsIHNfbXJpX2VuZGYsIDB9LAotICB7InJlcGVhdCIsIHNfbXJpX3JlcGVhdCwgMH0sCi0gIHsidW50aWwiLCBzX21yaV91bnRpbCwgMH0sCi0gIHsidW50aWwuYiIsIHNfbXJpX3VudGlsLCAnYid9LAotICB7InVudGlsLnciLCBzX21yaV91bnRpbCwgJ3cnfSwKLSAgeyJ1bnRpbC5sIiwgc19tcmlfdW50aWwsICdsJ30sCi0gIHsid2hpbGUiLCBzX21yaV93aGlsZSwgMH0sCi0gIHsid2hpbGUuYiIsIHNfbXJpX3doaWxlLCAnYid9LAotICB7IndoaWxlLnciLCBzX21yaV93aGlsZSwgJ3cnfSwKLSAgeyJ3aGlsZS5sIiwgc19tcmlfd2hpbGUsICdsJ30sCi0gIHsiZW5kdyIsIHNfbXJpX2VuZHcsIDB9LAotCi0gIHswLCAwLCAwfQotfTsKLQotCi0vKiBUaGUgbW90ZSBwc2V1ZG8gb3BzIGFyZSBwdXQgaW50byB0aGUgb3Bjb2RlIHRhYmxlLCBzaW5jZSB0aGV5Ci0gICBkb24ndCBzdGFydCB3aXRoIGEgLiB0aGV5IGxvb2sgbGlrZSBvcGNvZGVzIHRvIGdhcy4KLSAgICovCi0KLSNpZmRlZiBNNjhLQ09GRgotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfc2VjdGlvbiBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotCi1DT05TVCBwc2V1ZG9fdHlwZVMgbW90ZV9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0KLSAgeyJkY2wiLCBjb25zLCA0fSwKLSAgeyJkYyIsIGNvbnMsIDJ9LAotICB7ImRjdyIsIGNvbnMsIDJ9LAotICB7ImRjYiIsIGNvbnMsIDF9LAotCi0gIHsiZHNsIiwgc19zcGFjZSwgNH0sCi0gIHsiZHMiLCBzX3NwYWNlLCAyfSwKLSAgeyJkc3ciLCBzX3NwYWNlLCAyfSwKLSAgeyJkc2IiLCBzX3NwYWNlLCAxfSwKLQotICB7InhkZWYiLCBzX2dsb2JsLCAwfSwKLSNpZmRlZiBPQkpfRUxGCi0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCAwfSwKLSNlbHNlCi0gIHsiYWxpZ24iLCBzX2FsaWduX3B0d28sIDB9LAotI2VuZGlmCi0jaWZkZWYgTTY4S0NPRkYKLSAgeyJzZWN0Iiwgb2JqX2NvZmZfc2VjdGlvbiwgMH0sCi0gIHsic2VjdGlvbiIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotI2VuZGlmCi0gIHswLCAwLCAwfQotfTsKLQotI2RlZmluZSBpc3NieXRlKHgpCSgoeCk+PS0xMjggJiYgKHgpPD0xMjcpCi0jZGVmaW5lIGlzdWJ5dGUoeCkJKCh4KT49MCAmJiAoeCk8PTI1NSkKLSNkZWZpbmUgaXNzd29yZCh4KQkoKHgpPj0tMzI3NjggJiYgKHgpPD0zMjc2NykKLSNkZWZpbmUgaXN1d29yZCh4KQkoKHgpPj0wICYmICh4KTw9NjU1MzUpCi0KLSNkZWZpbmUgaXNieXRlKHgpCSgoeCk+PSAtMjU1ICYmICh4KTw9MjU1KQotI2RlZmluZSBpc3dvcmQoeCkJKCh4KT49LTY1NTM2ICYmICh4KTw9NjU1MzUpCi0jZGVmaW5lIGlzbG9uZyh4KQkoMSkKLQotZXh0ZXJuIGNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsKLQotc3RhdGljIGNoYXIgbWtsb3dlcl90YWJsZVsyNTZdOwotI2RlZmluZSBta2xvd2VyKGMpIChta2xvd2VyX3RhYmxlWyh1bnNpZ25lZCBjaGFyKShjKV0pCi1zdGF0aWMgY2hhciBub3RlbmRfdGFibGVbMjU2XTsKLXN0YXRpYyBjaGFyIGFsdF9ub3RlbmRfdGFibGVbMjU2XTsKLSNkZWZpbmUgbm90ZW5kKHMpCQkJCQkJXAotICAoISAobm90ZW5kX3RhYmxlWyh1bnNpZ25lZCBjaGFyKSAqc10JCQkJXAotICAgICAgfHwgKCpzID09ICc6JwkJCQkJCVwKLQkgICYmIGFsdF9ub3RlbmRfdGFibGVbKHVuc2lnbmVkIGNoYXIpIHNbMV1dKSkpCi0KLSNpZiBkZWZpbmVkIChNNjhLQ09GRikgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0KLSNpZmRlZiBOT19QQ1JFTF9SRUxPQ1MKLQotaW50Ci1tYWtlX3BjcmVsX2Fic29sdXRlKGZpeFAsIGFkZF9udW1iZXIpCi0gICAgZml4UyAqZml4UDsKLSAgICBsb25nICphZGRfbnVtYmVyOwotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpvcGNvZGUgPSBmaXhQLT5meF9mcmFnLT5mcl9vcGNvZGU7Ci0KLSAgLyogcmV3cml0ZSB0aGUgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIHRvIGFic29sdXRlIGFkZHJlc3Mgb25lcy4KLSAgICogdGhlc2UgYXJlIHJ1bW91cmVkIHRvIGJlIGZhc3RlciwgYW5kIHRoZSBhcG9sbG8gbGlua2VyIHJlZnVzZXMKLSAgICogdG8gZGVhbCB3aXRoIHRoZSBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucy4KLSAgICovCi0gIGlmIChvcGNvZGVbMF0gPT0gMHg2MCAmJiBvcGNvZGVbMV0gPT0gMHhmZikgLyogQlJBIC0+IEpNUCAqLwotICAgIHsKLSAgICAgIG9wY29kZVswXSA9IDB4NGU7Ci0gICAgICBvcGNvZGVbMV0gPSAweGY5OwotICAgIH0KLSAgZWxzZSBpZiAob3Bjb2RlWzBdID09IDB4NjEgJiYgb3Bjb2RlWzFdID09IDB4ZmYpIC8qIEJTUiAtPiBKU1IgKi8KLSAgICB7Ci0gICAgICBvcGNvZGVbMF0gPSAweDRlOwotICAgICAgb3Bjb2RlWzFdID0gMHhiOTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhc19mYXRhbCAoXygiVW5rbm93biBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiIpKTsKLSAgKmFkZF9udW1iZXIgLT0gNDsKLSAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBOT19QQ1JFTF9SRUxPQ1MgKi8KLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBpZiAoZml4UC0+ZnhfdGNiaXQgJiYgZml4UC0+Znhfc2l6ZSA9PSA0KQotICAgIHJldHVybiBSX1JFTExPTkdfTkVHOwotI2lmZGVmIE5PX1BDUkVMX1JFTE9DUwotICBrbm93IChmaXhQLT5meF9wY3JlbCA9PSAwKTsKLSAgcmV0dXJuIChmaXhQLT5meF9zaXplID09IDEgPyBSX1JFTEJZVEUKLQkgIDogZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9ESVIxNgotCSAgOiBSX0RJUjMyKTsKLSNlbHNlCi0gIHJldHVybiAoZml4UC0+ZnhfcGNyZWwgPwotCSAgKGZpeFAtPmZ4X3NpemUgPT0gMSA/IFJfUENSQllURSA6Ci0JICAgZml4UC0+Znhfc2l6ZSA9PSAyID8gUl9QQ1JXT1JEIDoKLQkgICBSX1BDUkxPTkcpIDoKLQkgIChmaXhQLT5meF9zaXplID09IDEgPyBSX1JFTEJZVEUgOgotCSAgIGZpeFAtPmZ4X3NpemUgPT0gMiA/IFJfUkVMV09SRCA6Ci0JICAgUl9SRUxMT05HKSk7Ci0jZW5kaWYKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIENvbXB1dGUgdGhlIHJlbG9jYXRpb24gY29kZSBmb3IgYSBmaXh1cCBvZiBTSVpFIGJ5dGVzLCB1c2luZyBwYwotICAgcmVsYXRpdmUgcmVsb2NhdGlvbiBpZiBQQ1JFTCBpcyBub24temVyby4gIFBJQyBzYXlzIHdoZXRoZXIgYSBzcGVjaWFsCi0gICBwaWMgcmVsb2NhdGlvbiB3YXMgcmVxdWVzdGVkLiAgKi8KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBnZXRfcmVsb2NfY29kZQotICBQQVJBTVMgKChpbnQsIGludCwgZW51bSBwaWNfcmVsb2NhdGlvbikpOwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1nZXRfcmVsb2NfY29kZSAoc2l6ZSwgcGNyZWwsIHBpYykKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBwY3JlbDsKLSAgICAgZW51bSBwaWNfcmVsb2NhdGlvbiBwaWM7Ci17Ci0gIHN3aXRjaCAocGljKQotICAgIHsKLSAgICBjYXNlIHBpY19nb3RfcGNyZWw6Ci0gICAgICBzd2l0Y2ggKHNpemUpCi0JewotCWNhc2UgMToKLQkgIHJldHVybiBCRkRfUkVMT0NfOF9HT1RfUENSRUw7Ci0JY2FzZSAyOgotCSAgcmV0dXJuIEJGRF9SRUxPQ18xNl9HT1RfUENSRUw7Ci0JY2FzZSA0OgotCSAgcmV0dXJuIEJGRF9SRUxPQ18zMl9HT1RfUENSRUw7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHBpY19nb3Rfb2ZmOgotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzhfR09UT0ZGOwotCWNhc2UgMjoKLQkgIHJldHVybiBCRkRfUkVMT0NfMTZfR09UT0ZGOwotCWNhc2UgNDoKLQkgIHJldHVybiBCRkRfUkVMT0NfMzJfR09UT0ZGOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBwaWNfcGx0X3BjcmVsOgotICAgICAgc3dpdGNoIChzaXplKQotCXsKLQljYXNlIDE6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzhfUExUX1BDUkVMOwotCWNhc2UgMjoKLQkgIHJldHVybiBCRkRfUkVMT0NfMTZfUExUX1BDUkVMOwotCWNhc2UgNDoKLQkgIHJldHVybiBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBwaWNfcGx0X29mZjoKLSAgICAgIHN3aXRjaCAoc2l6ZSkKLQl7Ci0JY2FzZSAxOgotCSAgcmV0dXJuIEJGRF9SRUxPQ184X1BMVE9GRjsKLQljYXNlIDI6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzE2X1BMVE9GRjsKLQljYXNlIDQ6Ci0JICByZXR1cm4gQkZEX1JFTE9DXzMyX1BMVE9GRjsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcGljX25vbmU6Ci0gICAgICBpZiAocGNyZWwpCi0JewotCSAgc3dpdGNoIChzaXplKQotCSAgICB7Ci0JICAgIGNhc2UgMToKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICAgIGNhc2UgMjoKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzE2X1BDUkVMOwotCSAgICBjYXNlIDQ6Ci0JICAgICAgcmV0dXJuIEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKHNpemUpCi0JICAgIHsKLQkgICAgY2FzZSAxOgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfODsKLQkgICAgY2FzZSAyOgotCSAgICAgIHJldHVybiBCRkRfUkVMT0NfMTY7Ci0JICAgIGNhc2UgNDoKLQkgICAgICByZXR1cm4gQkZEX1JFTE9DXzMyOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAocGNyZWwpCi0gICAgewotICAgICAgaWYgKHBpYyA9PSBwaWNfbm9uZSkKLQlhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSByZWxvY2F0aW9uIiksIHNpemUpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHBpYyByZWxvY2F0aW9uIiksIHNpemUpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwaWMgPT0gcGljX25vbmUpCi0JYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgcmVsb2NhdGlvbiIpLCBzaXplKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIkNhbiBub3QgZG8gJWQgYnl0ZSBwaWMgcmVsb2NhdGlvbiIpLCBzaXplKTsKLSAgICB9Ci0KLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotfQotCi0vKiBIZXJlIHdlIGRlY2lkZSB3aGljaCBmaXh1cHMgY2FuIGJlIGFkanVzdGVkIHRvIG1ha2UgdGhlbSByZWxhdGl2ZQotICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2VjdGlvbiBpbnN0ZWFkIG9mIHRoZSBzeW1ib2wuICBCYXNpY2FsbHkKLSAgIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGR5bmFtaWMgcmVsb2NhdGlvbnMgYXJlIGRvbmUKLSAgIGNvcnJlY3RseSwgc28gaW4gc29tZSBjYXNlcyB3ZSBmb3JjZSB0aGUgb3JpZ2luYWwgc3ltYm9sIHRvIGJlCi0gICB1c2VkLiAgKi8KLWludAotdGNfbTY4a19maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCi0gIGlmIChTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKLSAgICAgIHx8IFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotCi0gIC8qIGFkanVzdF9yZWxvY19zeW1zIGRvZXNuJ3Qga25vdyBhYm91dCB0aGUgR09UICovCi0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ184X0dPVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfR09UX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzhfR09UT0ZGOgotICAgIGNhc2UgQkZEX1JFTE9DXzE2X0dPVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9HT1RPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfOF9QTFRfUENSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMTZfUExUX1BDUkVMOgotICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTDoKLSAgICBjYXNlIEJGRF9SRUxPQ184X1BMVE9GRjoKLSAgICBjYXNlIEJGRF9SRUxPQ18xNl9QTFRPRkY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUT0ZGOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci19Ci0KLSNlbHNlIC8qICFPQkpfRUxGICovCi0KLSNkZWZpbmUgZ2V0X3JlbG9jX2NvZGUoU0laRSxQQ1JFTCxPVEhFUikgTk9fUkVMT0MKLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgaWYgKGZpeHAtPmZ4X3RjYml0KQotICAgIGFib3J0ICgpOwotCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX05PTkUpCi0gICAgewotICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLQotICAgICAgLyogU2luY2UgRElGRl9FWFBSX09LIGlzIGRlZmluZWQgaW4gdGMtbTY4ay5oLCBpdCBpcyBwb3NzaWJsZQotICAgICAgICAgdGhhdCBmaXh1cF9zZWdtZW50IGNvbnZlcnRlZCBhIG5vbi1QQyByZWxhdGl2ZSByZWxvYyBpbnRvIGEKLSAgICAgICAgIFBDIHJlbGF0aXZlIHJlbG9jLiAgSW4gc3VjaCBhIGNhc2UsIHdlIG5lZWQgdG8gY29udmVydCB0aGUKLSAgICAgICAgIHJlbG9jIGNvZGUuICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCXsKLQkgIHN3aXRjaCAoY29kZSkKLQkgICAgewotCSAgICBjYXNlIEJGRF9SRUxPQ184OgotCSAgICAgIGNvZGUgPSBCRkRfUkVMT0NfOF9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18xNl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0JICAgICAgY29kZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCRkRfUkVMT0NfOF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ184X0dPVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9HT1RfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzhfR09UT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyX0dPVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfOF9QTFRfUENSRUw6Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BMVF9QQ1JFTDoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMzJfUExUX1BDUkVMOgotCSAgICBjYXNlIEJGRF9SRUxPQ184X1BMVE9GRjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfUExUT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QTFRPRkY6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oIkNhbm5vdCBtYWtlICVzIHJlbG9jYXRpb24gUEMgcmVsYXRpdmUiKSwKLQkJCSAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSNkZWZpbmUgRihTWixQQ1JFTCkJCSgoKFNaKSA8PCAxKSArIChQQ1JFTCkpCi0gICAgICBzd2l0Y2ggKEYgKGZpeHAtPmZ4X3NpemUsIGZpeHAtPmZ4X3BjcmVsKSkKLQl7Ci0jZGVmaW5lIE1BUChTWixQQ1JFTCxUWVBFKQljYXNlIEYoU1osUENSRUwpOiBjb2RlID0gKFRZUEUpOyBicmVhawotCSAgTUFQICgxLCAwLCBCRkRfUkVMT0NfOCk7Ci0JICBNQVAgKDIsIDAsIEJGRF9SRUxPQ18xNik7Ci0JICBNQVAgKDQsIDAsIEJGRF9SRUxPQ18zMik7Ci0JICBNQVAgKDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQkgIE1BUCAoMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLQkgIE1BUCAoNCwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLSN1bmRlZiBGCi0jdW5kZWYgTUFQCi0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSNpZm5kZWYgT0JKX0VMRgotICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgPSAwOwotI2Vsc2UKLSAgaWYgKCFmaXhwLT5meF9wY3JlbCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IChzZWN0aW9uLT52bWEKLQkJICAgICArIChmaXhwLT5meF9wY3JlbF9hZGp1c3QgPT0gNjQKLQkJCT8gLTEgOiBmaXhwLT5meF9wY3JlbF9hZGp1c3QpCi0JCSAgICAgKyBmaXhwLT5meF9hZGRudW1iZXIKLQkJICAgICArIG1kX3BjcmVsX2Zyb20gKGZpeHApKTsKLSNlbmRpZgotCi0gIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgYXNzZXJ0IChyZWxvYy0+aG93dG8gIT0gMCk7Ci0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0vKiBSZXR1cm4gemVybyBpZiB0aGUgcmVmZXJlbmNlIHRvIFNZTUJPTCBmcm9tIHdpdGhpbiB0aGUgc2FtZSBzZWdtZW50IG1heQotICAgYmUgcmVsYXhlZC4gICovCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBPbiBhbiBFTEYgc3lzdGVtLCB3ZSBjYW4ndCByZWxheCBhbiBleHRlcm5hbGx5IHZpc2libGUgc3ltYm9sLAotICAgYmVjYXVzZSBpdCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhIHNoYXJlZCBsaWJyYXJ5LiAgSG93ZXZlciwgaWYKLSAgIFRBUkdFVF9PUyBpcyAiZWxmIiwgdGhlbiB3ZSBwcmVzdW1lIHRoYXQgd2UgYXJlIGFzc2VtYmxpbmcgZm9yIGFuCi0gICBlbWJlZGRlZCBzeXN0ZW0sIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzaGFyZWQKLSAgIGxpYnJhcmllcywgYW5kIHdlIGNhbiByZWxheCBhbnl0aGluZy4gICovCi0KLSNkZWZpbmUgcmVsYXhhYmxlX3N5bWJvbChzeW1ib2wpCQlcCi0gIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpID09IDAJCVwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKHN5bWJvbCkJCQlcCi0gICAgICAgJiYgISBTX0lTX1dFQUsgKHN5bWJvbCkpKQotCi0jZWxzZQotCi0jZGVmaW5lIHJlbGF4YWJsZV9zeW1ib2woc3ltYm9sKSAxCi0KLSNlbmRpZgotIAotLyogSGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZS4gIE5VTEwgbWVhbnMgYW55IHVzZSBiZWZvcmUKLSAgIG02OGtfaXBfYmVnaW4oKSB3aWxsIGNyYXNoLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcF9oYXNoOwotDAotLyogQXNzZW1ibGUgYW4gbTY4ayBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tNjhrX2lwIChpbnN0cmluZykKLSAgICAgY2hhciAqaW5zdHJpbmc7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBtNjhrX29wICpvcFA7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtNjhrX2luY2FudCAqb3Bjb2RlOwotICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotICByZWdpc3RlciBpbnQgdG1wcmVnID0gMCwgYmFzZW8gPSAwLCBvdXRybyA9IDAsIG5leHR3b3JkOwotICBjaGFyICpwZG90LCAqcGRvdG1vdmU7Ci0gIGVudW0gbTY4a19zaXplIHNpejEsIHNpejI7Ci0gIGNoYXIgYzsKLSAgaW50IGxvc2luZzsKLSAgaW50IG9wc2ZvdW5kOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s2XTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRwOwotICB1bnNpZ25lZCBsb25nIG9rX2FyY2ggPSAwOwotCi0gIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotICAgIGluc3RyaW5nKys7CQkJLyogc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLQotICAvKiBTY2FuIHVwIHRvIGVuZCBvZiBvcGVyYXRpb24tY29kZSwgd2hpY2ggTVVTVCBlbmQgaW4gZW5kLW9mLXN0cmluZwotICAgICBvciBleGFjdGx5IDEgc3BhY2UuICovCi0gIHBkb3QgPSAwOwotICBmb3IgKHAgPSBpbnN0cmluZzsgKnAgIT0gJ1wwJzsgcCsrKQotICAgIHsKLSAgICAgIGlmICgqcCA9PSAnICcpCi0JYnJlYWs7Ci0gICAgICBpZiAoKnAgPT0gJy4nKQotCXBkb3QgPSBwOwotICAgIH0KLQotICBpZiAocCA9PSBpbnN0cmluZykKLSAgICB7Ci0gICAgICB0aGVfaW5zLmVycm9yID0gXygiTm8gb3BlcmF0b3IiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogcCBub3cgcG9pbnRzIHRvIHRoZSBlbmQgb2YgdGhlIG9wY29kZSBuYW1lLCBwcm9iYWJseSB3aGl0ZXNwYWNlLgotICAgICBNYWtlIHN1cmUgdGhlIG5hbWUgaXMgbnVsbCB0ZXJtaW5hdGVkIGJ5IGNsb2JiZXJpbmcgdGhlCi0gICAgIHdoaXRlc3BhY2UsIGxvb2sgaXQgdXAgaW4gdGhlIGhhc2ggdGFibGUsIHRoZW4gZml4IGl0IGJhY2suCi0gICAgIFJlbW92ZSBhIGRvdCwgZmlyc3QsIHNpbmNlIHRoZSBvcGNvZGUgdGFibGVzIGhhdmUgbm9uZS4gICovCi0gIGlmIChwZG90ICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwZG90bW92ZSA9IHBkb3Q7IHBkb3Rtb3ZlIDwgcDsgcGRvdG1vdmUrKykKLQkqcGRvdG1vdmUgPSBwZG90bW92ZVsxXTsKLSAgICAgIHAtLTsKLSAgICB9Ci0KLSAgYyA9ICpwOwotICAqcCA9ICdcMCc7Ci0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgbTY4a19pbmNhbnQgKikgaGFzaF9maW5kIChvcF9oYXNoLCBpbnN0cmluZyk7Ci0gICpwID0gYzsKLQotICBpZiAocGRvdCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAocGRvdG1vdmUgPSBwOyBwZG90bW92ZSA+IHBkb3Q7IHBkb3Rtb3ZlLS0pCi0JKnBkb3Rtb3ZlID0gcGRvdG1vdmVbLTFdOwotICAgICAgKnBkb3QgPSAnLic7Ci0gICAgICArK3A7Ci0gICAgfQotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICB0aGVfaW5zLmVycm9yID0gXygiVW5rbm93biBvcGVyYXRvciIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBmb3VuZCBhIGxlZ2l0aW1hdGUgb3Bjb2RlLCBzdGFydCBtYXRjaGluZyBvcGVyYW5kcyAqLwotICB3aGlsZSAoKnAgPT0gJyAnKQotICAgICsrcDsKLQotICBpZiAob3Bjb2RlLT5tX29wZXJhbmRzID09IDApCi0gICAgewotICAgICAgY2hhciAqb2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKm9sZCA9ICdcbic7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgICAgLyogQWhoIC0gaXQncyBhIG1vdG9yb2xhIHN0eWxlIHBzdWVkbyBvcCAqLwotICAgICAgbW90ZV9wc2V1ZG9fdGFibGVbb3Bjb2RlLT5tX29wbnVtXS5wb2NfaGFuZGxlcgotCShtb3RlX3BzZXVkb190YWJsZVtvcGNvZGUtPm1fb3BudW1dLnBvY192YWwpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb2xkOwotICAgICAgKm9sZCA9IDA7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZsYWdfbXJpICYmIG9wY29kZS0+bV9vcG51bSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEluIE1SSSBtb2RlLCByYW5kb20gZ2FyYmFnZSBpcyBhbGxvd2VkIGFmdGVyIGFuIGluc3RydWN0aW9uCi0gICAgICAgICB3aGljaCBhY2NlcHRzIG5vIG9wZXJhbmRzLiAgKi8KLSAgICAgIHRoZV9pbnMuYXJncyA9IG9wY29kZS0+bV9vcGVyYW5kczsKLSAgICAgIHRoZV9pbnMubnVtYXJncyA9IG9wY29kZS0+bV9vcG51bTsKLSAgICAgIHRoZV9pbnMubnVtbyA9IG9wY29kZS0+bV9jb2RlbnVtOwotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gPSBnZXRvbmUgKG9wY29kZSk7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSA9IGdldHR3byAob3Bjb2RlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZm9yIChvcFAgPSAmdGhlX2lucy5vcGVyYW5kc1swXTsgKnA7IG9wUCsrKQotICAgIHsKLSAgICAgIHAgPSBjcmFja19vcGVyYW5kIChwLCBvcFApOwotCi0gICAgICBpZiAob3BQLT5lcnJvcikKLQl7Ci0JICB0aGVfaW5zLmVycm9yID0gb3BQLT5lcnJvcjsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIG9wc2ZvdW5kID0gb3BQIC0gJnRoZV9pbnMub3BlcmFuZHNbMF07Ci0KLSAgLyogVGhpcyB1Z2x5IGhhY2sgaXMgdG8gc3VwcG9ydCB0aGUgZmxvYXRpbmcgcHQgb3Bjb2RlcyBpbiB0aGVpcgotICAgICBzdGFuZGFyZCBmb3JtLiAgRXNzZW50aWFsbHksIHdlIGZha2UgYSBmaXJzdCBlbnR5IG9mIHR5cGUgQ09QIzEgKi8KLSAgaWYgKG9wY29kZS0+bV9vcGVyYW5kc1swXSA9PSAnSScpCi0gICAgewotICAgICAgaW50IG47Ci0KLSAgICAgIGZvciAobiA9IG9wc2ZvdW5kOyBuID4gMDsgLS1uKQotCXRoZV9pbnMub3BlcmFuZHNbbl0gPSB0aGVfaW5zLm9wZXJhbmRzW24gLSAxXTsKLQotICAgICAgbWVtc2V0ICgoY2hhciAqKSAoJnRoZV9pbnMub3BlcmFuZHNbMF0pLCAnXDAnLAotCSAgICAgIHNpemVvZiAodGhlX2lucy5vcGVyYW5kc1swXSkpOwotICAgICAgdGhlX2lucy5vcGVyYW5kc1swXS5tb2RlID0gQ09OVFJPTDsKLSAgICAgIHRoZV9pbnMub3BlcmFuZHNbMF0ucmVnID0gbTY4a19mbG9hdF9jb3BudW07Ci0gICAgICBvcHNmb3VuZCsrOwotICAgIH0KLQotICAvKiBXZSd2ZSBnb3QgdGhlIG9wZXJhbmRzLiAgRmluZCBhbiBvcGNvZGUgdGhhdCdsbCBhY2NlcHQgdGhlbSAqLwotICBmb3IgKGxvc2luZyA9IDA7OykKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBkaWRuJ3QgZ2V0IHRoZSByaWdodCBudW1iZXIgb2Ygb3BzLCBvciB3ZSBoYXZlIG5vCi0JIGNvbW1vbiBtb2RlbCB3aXRoIHRoaXMgcGF0dGVybiB0aGVuIHJlamVjdCB0aGlzIHBhdHRlcm4uICovCi0KLSAgICAgIG9rX2FyY2ggfD0gb3Bjb2RlLT5tX2FyY2g7Ci0gICAgICBpZiAob3BzZm91bmQgIT0gb3Bjb2RlLT5tX29wbnVtCi0JICB8fCAoKG9wY29kZS0+bV9hcmNoICYgY3VycmVudF9hcmNoaXRlY3R1cmUpID09IDApKQotCSsrbG9zaW5nOwotICAgICAgZWxzZQotCXsKLQkgIGZvciAocyA9IG9wY29kZS0+bV9vcGVyYW5kcywgb3BQID0gJnRoZV9pbnMub3BlcmFuZHNbMF07Ci0JICAgICAgICpzICYmICFsb3Npbmc7Ci0JICAgICAgIHMgKz0gMiwgb3BQKyspCi0JICAgIHsKLQkgICAgICAvKiBXYXJuaW5nOiB0aGlzIHN3aXRjaCBpcyBodWdlISAqLwotCSAgICAgIC8qIEkndmUgdHJpZWQgdG8gb3JnYW5pemUgdGhlIGNhc2VzIGludG8gdGhpcyBvcmRlcjoKLQkJIG5vbi1hbHBoYSBmaXJzdCwgdGhlbiBhbHBoYSBieSBsZXR0ZXIuICBMb3dlci1jYXNlCi0JCSBnb2VzIGRpcmVjdGx5IGJlZm9yZSB1cHBlcmNhc2UgY291bnRlcnBhcnQuICAqLwotCSAgICAgIC8qIENvZGUgd2l0aCBtdWx0aXBsZSBjYXNlIC4uLjogZ2V0cyBzb3J0ZWQgYnkgdGhlIGxvd2VzdAotCQkgY2FzZSAuLi4gaXQgYmVsb25ncyB0by4gIEkgaG9wZSB0aGlzIG1ha2VzIHNlbnNlLiAgKi8KLQkgICAgICBzd2l0Y2ggKCpzKQotCQl7Ci0JCWNhc2UgJyEnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIEFJTkM6Ci0JCSAgICBjYXNlIEFERUM6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnPCc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICc+JzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgQUJTTDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMKLQkJCSAgfHwgb3BQLT5yZWcgPT0gWlBDKQotCQkJbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ20nOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBBSU5EUjoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCWNhc2UgJ24nOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBESVNQOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAnbyc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEJBU0U6Ci0JCSAgICBjYXNlIEFCU0w6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAncCc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIEFJTkRSOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgRElTUDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgfQotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJY2FzZSAncSc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIERSRUc6Ci0JCSAgICBjYXNlIEFJTkRSOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgRElTUDoKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDIHx8IG9wUC0+cmVnID09IFpQQykKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0JCWNhc2UgJ3YnOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBEUkVHOgotCQkgICAgY2FzZSBBSU5EUjoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgIGNhc2UgQUJTTDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIERJU1A6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnIyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBJTU1FRCkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2InCi0JCQkgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgJiYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICAgICAgfHwgISBpc2J5dGUgKG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyKSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChzWzFdID09ICdCJwotCQkJICAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJCSAgICYmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgICAgIHx8ICEgaXNzYnl0ZSAob3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ3cnCi0JCQkgICAmJiAhIGlzdmFyICgmb3BQLT5kaXNwKQotCQkJICAgJiYgKG9wUC0+ZGlzcC5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICAgICAgfHwgISBpc3dvcmQgKG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyKSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBlbHNlIGlmIChzWzFdID09ICdXJwotCQkJICAgJiYgISBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJCSAgICYmIChvcFAtPmRpc3AuZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJICAgICAgIHx8ICEgaXNzd29yZCAob3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ14nOgotCQljYXNlICdUJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IElNTUVEKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnJCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBBUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBGUFJFRwotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gSU1NRUQKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IFJFR0xTVAotCQkgICAgICB8fCAob3BQLT5tb2RlICE9IEFCU0wKLQkJCSAgJiYgKG9wUC0+cmVnID09IFBDCi0JCQkgICAgICB8fCBvcFAtPnJlZyA9PSBaUEMpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJyUnOgotCQkgIGlmIChvcFAtPm1vZGUgPT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRlBSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IFJFR0xTVAotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gSU1NRUQKLQkJICAgICAgfHwgKG9wUC0+bW9kZSAhPSBBQlNMCi0JCQkgICYmIChvcFAtPnJlZyA9PSBQQwotCQkJICAgICAgfHwgb3BQLT5yZWcgPT0gWlBDKSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICcmJzoKLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBBSU5DOgotCQkgICAgY2FzZSBBREVDOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgQUJTTDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMKLQkJCSAgfHwgb3BQLT5yZWcgPT0gWlBDKQotCQkJbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJyonOgotCQkgIGlmIChvcFAtPm1vZGUgPT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRlBSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IFJFR0xTVCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJysnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQUlOQykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJy0nOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQURFQykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJy8nOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnOyc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJz8nOgotCQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCQkgICAgewotCQkgICAgY2FzZSBBUkVHOgotCQkgICAgY2FzZSBDT05UUk9MOgotCQkgICAgY2FzZSBGUFJFRzoKLQkJICAgIGNhc2UgQUlOQzoKLQkJICAgIGNhc2UgQURFQzoKLQkJICAgIGNhc2UgSU1NRUQ6Ci0JCSAgICBjYXNlIFJFR0xTVDoKLQkJICAgICAgbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBBQlNMOgotCQkgICAgICBicmVhazsKLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQCc6Ci0JCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEFSRUc6Ci0JCSAgICBjYXNlIENPTlRST0w6Ci0JCSAgICBjYXNlIEZQUkVHOgotCQkgICAgY2FzZSBJTU1FRDoKLQkJICAgIGNhc2UgUkVHTFNUOgotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICBicmVhazsKLQotCQljYXNlICd+JzoJLyogRm9yIG5vdyEgKEpGIEZPTyBpcyB0aGlzIHJpZ2h0PykgKi8KLQkJICBzd2l0Y2ggKG9wUC0+bW9kZSkKLQkJICAgIHsKLQkJICAgIGNhc2UgRFJFRzoKLQkJICAgIGNhc2UgQVJFRzoKLQkJICAgIGNhc2UgQ09OVFJPTDoKLQkJICAgIGNhc2UgRlBSRUc6Ci0JCSAgICBjYXNlIElNTUVEOgotCQkgICAgY2FzZSBSRUdMU1Q6Ci0JCSAgICAgIGxvc2luZysrOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgQUJTTDoKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMKLQkJCSAgfHwgb3BQLT5yZWcgPT0gWlBDKQotCQkJbG9zaW5nKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJzMnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAob3BQLT5yZWcgIT0gVFQwICYmIG9wUC0+cmVnICE9IFRUMSkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdBJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEFSRUcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdhJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEFJTkRSKQotCQkgICAgKytsb3Npbmc7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQic6CS8qIEZPTyAqLwotCQkgIGlmIChvcFAtPm1vZGUgIT0gQUJTTAotCQkgICAgICB8fCAoZmxhZ19sb25nX2p1bXBzCi0JCQkgICYmIHN0cm5jbXAgKGluc3RyaW5nLCAiamJzciIsIDQpID09IDApKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IENDUikKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2QnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gRElTUAotCQkgICAgICB8fCBvcFAtPnJlZyA8IEFERFIwCi0JCSAgICAgIHx8IG9wUC0+cmVnID4gQUREUjcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdEJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IERSRUcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdFJzoKLQkJICBpZiAob3BQLT5yZWcgIT0gQUNDKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBGUFJFRykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0cnOgotCQkgIGlmIChvcFAtPnJlZyAhPSBNQUNTUikKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0gnOgotCQkgIGlmIChvcFAtPnJlZyAhPSBNQVNLKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnSSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IG9wUC0+cmVnIDwgQ09QMAotCQkgICAgICB8fCBvcFAtPnJlZyA+IENPUDcpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdKJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5yZWcgPCBVU1AKLQkJICAgICAgfHwgb3BQLT5yZWcgPiBsYXN0X21vdmVjX3JlZykKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgY29uc3QgZW51bSBtNjhrX3JlZ2lzdGVyICpycDsKLQkJICAgICAgZm9yIChycCA9IGNvbnRyb2xfcmVnczsgKnJwOyBycCsrKQotCQkJaWYgKCpycCA9PSBvcFAtPnJlZykKLQkJCSAgYnJlYWs7Ci0JCSAgICAgIGlmICgqcnAgPT0gMCkKLQkJCWxvc2luZysrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2snOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdsJzoKLQkJY2FzZSAnTCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSA9PSBEUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBBUkVHCi0JCSAgICAgIHx8IG9wUC0+bW9kZSA9PSBGUFJFRykKLQkJICAgIHsKLQkJICAgICAgaWYgKHNbMV0gPT0gJzgnKQotCQkJbG9zaW5nKys7Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgc3dpdGNoIChvcFAtPm1vZGUpCi0JCQkgICAgewotCQkJICAgIGNhc2UgRFJFRzoKLQkJCSAgICAgIG9wUC0+bWFzayA9IDEgPDwgKG9wUC0+cmVnIC0gREFUQTApOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSBBUkVHOgotCQkJICAgICAgb3BQLT5tYXNrID0gMSA8PCAob3BQLT5yZWcgLSBBRERSMCArIDgpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSBGUFJFRzoKLQkJCSAgICAgIG9wUC0+bWFzayA9IDEgPDwgKG9wUC0+cmVnIC0gRlAwICsgMTYpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgZGVmYXVsdDoKLQkJCSAgICAgIGFib3J0ICgpOwotCQkJICAgIH0KLQkJCSAgb3BQLT5tb2RlID0gUkVHTFNUOwotCQkJfQotCQkgICAgfQotCQkgIGVsc2UgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MKQotCQkgICAgewotCQkgICAgICBpZiAoc1sxXSAhPSAnOCcpCi0JCQlsb3NpbmcrKzsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBzd2l0Y2ggKG9wUC0+cmVnKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIEZQSToKLQkJCSAgICAgIG9wUC0+bWFzayA9IDEgPDwgMjQ7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIEZQUzoKLQkJCSAgICAgIG9wUC0+bWFzayA9IDEgPDwgMjU7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBjYXNlIEZQQzoKLQkJCSAgICAgIG9wUC0+bWFzayA9IDEgPDwgMjY7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICBkZWZhdWx0OgotCQkJICAgICAgbG9zaW5nKys7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQkgIG9wUC0+bW9kZSA9IFJFR0xTVDsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmIChvcFAtPm1vZGUgIT0gUkVHTFNUKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnOCcgJiYgKG9wUC0+bWFzayAmIDB4MGZmZmZmZikgIT0gMCkKLQkJICAgIGxvc2luZysrOwotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJzMnICYmIChvcFAtPm1hc2sgJiAweDcwMDAwMDApICE9IDApCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdNJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IElNTUVEKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgIHx8ICEgaXNzYnl0ZSAob3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoISBtNjhrX3F1aWNrCi0JCQkgICAmJiBpbnN0cmluZ1szXSAhPSAncScKLQkJCSAgICYmIGluc3RyaW5nWzRdICE9ICdxJykKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ08nOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gRFJFRwotCQkgICAgICAmJiBvcFAtPm1vZGUgIT0gSU1NRUQKLQkJICAgICAgJiYgb3BQLT5tb2RlICE9IEFCU0wpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdRJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IElNTUVEKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgIHx8IG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyIDwgMQotCQkJICAgfHwgb3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIgPiA4KQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAoISBtNjhrX3F1aWNrCi0JCQkgICAmJiAoc3RybmNtcCAoaW5zdHJpbmcsICJhZGQiLCAzKSA9PSAwCi0JCQkgICAgICAgfHwgc3RybmNtcCAoaW5zdHJpbmcsICJzdWIiLCAzKSA9PSAwKQotCQkJICAgJiYgaW5zdHJpbmdbM10gIT0gJ3EnKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBEUkVHICYmIG9wUC0+bW9kZSAhPSBBUkVHKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBBSU5EUgotCQkgICAgICAmJiAob3BQLT5tb2RlICE9IEJBU0UKLQkJCSAgfHwgKG9wUC0+cmVnICE9IDAKLQkJCSAgICAgICYmIG9wUC0+cmVnICE9IFpBRERSMCkKLQkJCSAgfHwgb3BQLT5kaXNwLmV4cC5YX29wICE9IE9fYWJzZW50Ci0JCQkgIHx8ICgob3BQLT5pbmRleC5yZWcgPCBEQVRBMAotCQkJICAgICAgIHx8IG9wUC0+aW5kZXgucmVnID4gREFUQTcpCi0JCQkgICAgICAmJiAob3BQLT5pbmRleC5yZWcgPCBBRERSMAotCQkJCSAgfHwgb3BQLT5pbmRleC5yZWcgPiBBRERSNykpCi0JCQkgIHx8IG9wUC0+aW5kZXguc2l6ZSAhPSBTSVpFX1VOU1BFQwotCQkJICB8fCBvcFAtPmluZGV4LnNjYWxlICE9IDEpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8ICEgKG9wUC0+cmVnID09IEZQSQotCQkJICAgIHx8IG9wUC0+cmVnID09IEZQUwotCQkJICAgIHx8IG9wUC0+cmVnID09IEZQQykpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdTJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gU1IpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICd0JzoKLQkJICBpZiAob3BQLT5tb2RlICE9IElNTUVEKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgZWxzZSBpZiAob3BQLT5kaXNwLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCSAgIHx8IG9wUC0+ZGlzcC5leHAuWF9hZGRfbnVtYmVyIDwgMAotCQkJICAgfHwgb3BQLT5kaXNwLmV4cC5YX2FkZF9udW1iZXIgPiA3KQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnVSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IFVTUCkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCSAgLyogSkYgdGhlc2UgYXJlIG91dCBvZiBvcmRlci4gIFdlIGNvdWxkIHB1dCB0aGVtCi0JCSAgICAgaW4gb3JkZXIgaWYgd2Ugd2VyZSB3aWxsaW5nIHRvIHB1dCB1cCB3aXRoCi0JCSAgICAgYnVuY2hlcyBvZiAjaWZkZWYgbTY4ODUxcyBpbiB0aGUgY29kZS4KLQotCQkgICAgIERvbid0IGZvcmdldCB0aGF0IHlvdSBuZWVkIHRoZXNlIG9wZXJhbmRzCi0JCSAgICAgdG8gdXNlIDY4MDMwIE1NVSBpbnN0cnVjdGlvbnMuICAqLwotI2lmbmRlZiBOT182ODg1MQotCQkgIC8qIE1lbW9yeSBhZGRyZXNzaW5nIG1vZGUgdXNlZCBieSBwZmx1c2hyICovCi0JCWNhc2UgJ3wnOgotCQkgIGlmIChvcFAtPm1vZGUgPT0gQ09OVFJPTAotCQkgICAgICB8fCBvcFAtPm1vZGUgPT0gRlBSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IERSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IEFSRUcKLQkJICAgICAgfHwgb3BQLT5tb2RlID09IFJFR0xTVCkKLQkJICAgIGxvc2luZysrOwotCQkgIC8qIFdlIHNob3VsZCBhY2NlcHQgaW1tZWRpYXRlIG9wZXJhbmRzLCBidXQgdGhleQotICAgICAgICAgICAgICAgICAgICAgc3VwcG9zZWRseSBoYXZlIHRvIGJlIHF1YWQgd29yZCwgYW5kIHdlIGRvbid0Ci0gICAgICAgICAgICAgICAgICAgICBoYW5kbGUgdGhhdC4gIEkgd291bGQgbGlrZSB0byBzZWUgd2hhdCBhIE1vdG9yb2xhCi0gICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZXIgZG9lcyBiZWZvcmUgZG9pbmcgc29tZXRoaW5nIGhlcmUuICAqLwotCQkgIGlmIChvcFAtPm1vZGUgPT0gSU1NRUQpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdmJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgKG9wUC0+cmVnICE9IFNGQyAmJiBvcFAtPnJlZyAhPSBERkMpKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnMCc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IFRDKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnMSc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MIHx8IG9wUC0+cmVnICE9IEFDKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnMic6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IChvcFAtPnJlZyAhPSBDQUwKLQkJCSAgJiYgb3BQLT5yZWcgIT0gVkFMCi0JCQkgICYmIG9wUC0+cmVnICE9IFNDQykpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdWJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgb3BQLT5yZWcgIT0gVkFMKQotCQkgICAgbG9zaW5nKys7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnVyc6Ci0JCSAgaWYgKG9wUC0+bW9kZSAhPSBDT05UUk9MCi0JCSAgICAgIHx8IChvcFAtPnJlZyAhPSBEUlAKLQkJCSAgJiYgb3BQLT5yZWcgIT0gU1JQCi0JCQkgICYmIG9wUC0+cmVnICE9IENSUCkpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdYJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wKLQkJICAgICAgfHwgKCEob3BQLT5yZWcgPj0gQkFEICYmIG9wUC0+cmVnIDw9IEJBRCArIDcpCi0JCQkgICYmICEob3BQLT5yZWcgPj0gQkFDICYmIG9wUC0+cmVnIDw9IEJBQyArIDcpKSkKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1knOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTCB8fCBvcFAtPnJlZyAhPSBQU1IpCi0JCSAgICBsb3NpbmcrKzsKLQkJICBicmVhazsKLQotCQljYXNlICdaJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IENPTlRST0wgfHwgb3BQLT5yZWcgIT0gUENTUikKLQkJICAgIGxvc2luZysrOwotCQkgIGJyZWFrOwotI2VuZGlmCi0JCWNhc2UgJ2MnOgotCQkgIGlmIChvcFAtPm1vZGUgIT0gQ09OVFJPTAotCQkgICAgICB8fCAob3BQLT5yZWcgIT0gTkMKLQkJCSAgJiYgb3BQLT5yZWcgIT0gSUMKLQkJCSAgJiYgb3BQLT5yZWcgIT0gREMKLQkJCSAgJiYgb3BQLT5yZWcgIT0gQkMpKQotCQkgICAgewotCQkgICAgICBsb3NpbmcrKzsKLQkJICAgIH0JCS8qIG5vdCBhIGNhY2hlIHNwZWNpZmllci4gKi8KLQkJICBicmVhazsKLQotCQljYXNlICdfJzoKLQkJICBpZiAob3BQLT5tb2RlICE9IEFCU0wpCi0JCSAgICArK2xvc2luZzsKLQkJICBicmVhazsKLQotCQljYXNlICd1JzoKLQkJICBpZiAob3BQLT5yZWcgPCBEQVRBMEwgfHwgb3BQLT5yZWcgPiBBRERSN1UpCi0JCSAgICBsb3NpbmcrKzsKLQkJICAvKiBGSVhNRToga2x1ZGdlIGluc3RlYWQgb2YgZml4aW5nIHBhcnNlcjoKLSAgICAgICAgICAgICAgICAgICAgIHVwcGVyL2xvd2VyIHJlZ2lzdGVycyBhcmUgKm5vdCogQ09OVFJPTAotICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJzLCBidXQgb3JkaW5hcnkgb25lcy4gKi8KLQkJICBpZiAoKG9wUC0+cmVnID49IERBVEEwTCAmJiBvcFAtPnJlZyA8PSBEQVRBN0wpCi0JCSAgICAgIHx8IChvcFAtPnJlZyA+PSBEQVRBMFUgJiYgb3BQLT5yZWcgPD0gREFUQTdVKSkKLQkJICAgIG9wUC0+bW9kZSA9IERSRUc7Ci0JCSAgZWxzZQotCQkgICAgb3BQLT5tb2RlID0gQVJFRzsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9CQkvKiBzd2l0Y2ggb24gdHlwZSBvZiBvcGVyYW5kICovCi0KLQkgICAgICBpZiAobG9zaW5nKQotCQlicmVhazsKLQkgICAgfQkJCS8qIGZvciBlYWNoIG9wZXJhbmQgKi8KLQl9CQkJLyogaWYgaW1tZWRpYXRlbHkgd3JvbmcgKi8KLQotICAgICAgaWYgKCFsb3NpbmcpCi0JewotCSAgYnJlYWs7Ci0JfQkJCS8qIGdvdCBpdC4gKi8KLQotICAgICAgb3Bjb2RlID0gb3Bjb2RlLT5tX25leHQ7Ci0KLSAgICAgIGlmICghb3Bjb2RlKQotCXsKLQkgIGlmIChva19hcmNoCi0JICAgICAgJiYgIShva19hcmNoICYgY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbMjAwXSwgKmNwOwotCi0JICAgICAgc3RyY3B5IChidWYsCi0JCSAgICAgIF8oImludmFsaWQgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyAiKSk7Ci0JICAgICAgY3AgPSBidWYgKyBzdHJsZW4gKGJ1Zik7Ci0JICAgICAgc3dpdGNoIChva19hcmNoKQotCQl7Ci0JCWNhc2UgbWZsb2F0OgotCQkgIHN0cmNweSAoY3AsIF8oImZwdSAoNjgwNDAsIDY4MDYwIG9yIDY4ODgxLzY4ODgyKSIpKTsKLQkJICBicmVhazsKLQkJY2FzZSBtbW11OgotCQkgIHN0cmNweSAoY3AsIF8oIm1tdSAoNjgwMzAgb3IgNjg4NTEpIikpOwotCQkgIGJyZWFrOwotCQljYXNlIG02ODAyMHVwOgotCQkgIHN0cmNweSAoY3AsIF8oIjY4MDIwIG9yIGhpZ2hlciIpKTsKLQkJICBicmVhazsKLQkJY2FzZSBtNjgwMDB1cDoKLQkJICBzdHJjcHkgKGNwLCBfKCI2ODAwMCBvciBoaWdoZXIiKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgbTY4MDEwdXA6Ci0JCSAgc3RyY3B5IChjcCwgXygiNjgwMTAgb3IgaGlnaGVyIikpOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIHsKLQkJICAgIGludCBnb3Rfb25lID0gMCwgaWR4OwotCQkgICAgZm9yIChpZHggPSAwOyBpZHggPCBzaXplb2YgKGFyY2hzKSAvIHNpemVvZiAoYXJjaHNbMF0pOwotCQkJIGlkeCsrKQotCQkgICAgICB7Ci0JCQlpZiAoKGFyY2hzW2lkeF0uYXJjaCAmIG9rX2FyY2gpCi0JCQkgICAgJiYgISBhcmNoc1tpZHhdLmFsaWFzKQotCQkJICB7Ci0JCQkgICAgaWYgKGdvdF9vbmUpCi0JCQkgICAgICB7Ci0JCQkJc3RyY3B5IChjcCwgIiBvciAiKTsKLQkJCQljcCArPSBzdHJsZW4gKGNwKTsKLQkJCSAgICAgIH0KLQkJCSAgICBnb3Rfb25lID0gMTsKLQkJCSAgICBzdHJjcHkgKGNwLCBhcmNoc1tpZHhdLm5hbWUpOwotCQkJICAgIGNwICs9IHN0cmxlbiAoY3ApOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JCX0KLQkgICAgICBjcCA9IHhtYWxsb2MgKHN0cmxlbiAoYnVmKSArIDEpOwotCSAgICAgIHN0cmNweSAoY3AsIGJ1Zik7Ci0JICAgICAgdGhlX2lucy5lcnJvciA9IGNwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHRoZV9pbnMuZXJyb3IgPSBfKCJvcGVyYW5kcyBtaXNtYXRjaCIpOwotCSAgcmV0dXJuOwotCX0JCQkvKiBGZWxsIG9mZiB0aGUgZW5kICovCi0KLSAgICAgIGxvc2luZyA9IDA7Ci0gICAgfQotCi0gIC8qIG5vdyBhc3NlbWJsZSBpdCAqLwotCi0gIHRoZV9pbnMuYXJncyA9IG9wY29kZS0+bV9vcGVyYW5kczsKLSAgdGhlX2lucy5udW1hcmdzID0gb3Bjb2RlLT5tX29wbnVtOwotICB0aGVfaW5zLm51bW8gPSBvcGNvZGUtPm1fY29kZW51bTsKLSAgdGhlX2lucy5vcGNvZGVbMF0gPSBnZXRvbmUgKG9wY29kZSk7Ci0gIHRoZV9pbnMub3Bjb2RlWzFdID0gZ2V0dHdvIChvcGNvZGUpOwotCi0gIGZvciAocyA9IHRoZV9pbnMuYXJncywgb3BQID0gJnRoZV9pbnMub3BlcmFuZHNbMF07ICpzOyBzICs9IDIsIG9wUCsrKQotICAgIHsKLSAgICAgIC8qIFRoaXMgc3dpdGNoIGlzIGEgZG9venkuCi0gICAgICAgV2F0Y2ggdGhlIGZpcnN0IHN0ZXA7IGl0cyBhIGJpZyBvbmUhICovCi0gICAgICBzd2l0Y2ggKHNbMF0pCi0JewotCi0JY2FzZSAnKic6Ci0JY2FzZSAnfic6Ci0JY2FzZSAnJSc6Ci0JY2FzZSAnOyc6Ci0JY2FzZSAnQCc6Ci0JY2FzZSAnISc6Ci0JY2FzZSAnJic6Ci0JY2FzZSAnJCc6Ci0JY2FzZSAnPyc6Ci0JY2FzZSAnLyc6Ci0JY2FzZSAnPCc6Ci0JY2FzZSAnPic6Ci0JY2FzZSAnbSc6Ci0JY2FzZSAnbic6Ci0JY2FzZSAnbyc6Ci0JY2FzZSAncCc6Ci0JY2FzZSAncSc6Ci0JY2FzZSAndic6Ci0jaWZuZGVmIE5PXzY4ODUxCi0JY2FzZSAnfCc6Ci0jZW5kaWYKLQkgIHN3aXRjaCAob3BQLT5tb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgSU1NRUQ6Ci0JICAgICAgdG1wcmVnID0gMHgzYzsJLyogNy40ICovCi0JICAgICAgaWYgKHN0cmNociAoImJ3bCIsIHNbMV0pKQotCQluZXh0d29yZCA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgICAgICBlbHNlCi0JCW5leHR3b3JkID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgMCk7Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJYWRkX2ZpeCAoc1sxXSwgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JICAgICAgc3dpdGNoIChzWzFdKQotCQl7Ci0JCWNhc2UgJ2InOgotCQkgIGlmICghaXNieXRlIChuZXh0d29yZCkpCi0JCSAgICBvcFAtPmVycm9yID0gXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UiKTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgYmFzZW8gPSAwOwotCQkgIGJyZWFrOwotCQljYXNlICd3JzoKLQkJICBpZiAoIWlzd29yZCAobmV4dHdvcmQpKQotCQkgICAgb3BQLT5lcnJvciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlIik7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJhc2VvID0gMDsKLQkJICBicmVhazsKLQkJY2FzZSAnVyc6Ci0JCSAgaWYgKCFpc3N3b3JkIChuZXh0d29yZCkpCi0JCSAgICBvcFAtPmVycm9yID0gXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UiKTsKLQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgYmFzZW8gPSAwOwotCQkgIGJyZWFrOwotCQljYXNlICdsJzoKLQkJICBhZGR3b3JkIChuZXh0d29yZCA+PiAxNik7Ci0JCSAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgIGJhc2VvID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlICdmJzoKLQkJICBiYXNlbyA9IDI7Ci0JCSAgb3V0cm8gPSA4OwotCQkgIGJyZWFrOwotCQljYXNlICdGJzoKLQkJICBiYXNlbyA9IDQ7Ci0JCSAgb3V0cm8gPSAxMTsKLQkJICBicmVhazsKLQkJY2FzZSAneCc6Ci0JCSAgYmFzZW8gPSA2OwotCQkgIG91dHJvID0gMTU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3AnOgotCQkgIGJhc2VvID0gNjsKLQkJICBvdXRybyA9IC0xOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgaWYgKCFiYXNlbykKLQkJYnJlYWs7Ci0KLQkgICAgICAvKiBXZSBnb3R0YSBwdXQgb3V0IHNvbWUgZmxvYXQgKi8KLQkgICAgICBpZiAob3AgKCZvcFAtPmRpc3ApICE9IE9fYmlnKQotCQl7Ci0JCSAgdmFsdWVUIHZhbDsKLQkJICBpbnQgZ2VuY250OwotCi0JCSAgLyogQ2FuIG90aGVyIGNhc2VzIGhhcHBlbiBoZXJlPyAgKi8KLQkJICBpZiAob3AgKCZvcFAtPmRpc3ApICE9IE9fY29uc3RhbnQpCi0JCSAgICBhYm9ydCAoKTsKLQotCQkgIHZhbCA9ICh2YWx1ZVQpIG9mZnMgKCZvcFAtPmRpc3ApOwotCQkgIGdlbmNudCA9IDA7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgZ2VuZXJpY19iaWdudW1bZ2VuY250XSA9IChMSVRUTEVOVU1fVFlQRSkgdmFsOwotCQkgICAgICB2YWwgPj49IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkJICAgICAgKytnZW5jbnQ7Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKHZhbCAhPSAwKTsKLQkJICBvZmZzICgmb3BQLT5kaXNwKSA9IGdlbmNudDsKLQkJfQotCSAgICAgIGlmIChvZmZzICgmb3BQLT5kaXNwKSA+IDApCi0JCXsKLQkJICBpZiAob2ZmcyAoJm9wUC0+ZGlzcCkgPiBiYXNlbykKLQkJICAgIHsKLQkJICAgICAgYXNfd2FybiAoXygiQmlnbnVtIHRvbyBiaWcgZm9yICVjIGZvcm1hdDsgdHJ1bmNhdGVkIiksCi0JCQkgICAgICAgc1sxXSk7Ci0JCSAgICAgIG9mZnMgKCZvcFAtPmRpc3ApID0gYmFzZW87Ci0JCSAgICB9Ci0JCSAgYmFzZW8gLT0gb2ZmcyAoJm9wUC0+ZGlzcCk7Ci0JCSAgd2hpbGUgKGJhc2VvLS0pCi0JCSAgICBhZGR3b3JkICgwKTsKLQkJICBmb3IgKHdvcmRwID0gZ2VuZXJpY19iaWdudW0gKyBvZmZzICgmb3BQLT5kaXNwKSAtIDE7Ci0JCSAgICAgICBvZmZzICgmb3BQLT5kaXNwKS0tOwotCQkgICAgICAgLS13b3JkcCkKLQkJICAgIGFkZHdvcmQgKCp3b3JkcCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCBiYXNlbywgKGxvbmcpIG91dHJvKTsKLQkgICAgICBmb3IgKHdvcmRwID0gd29yZHM7IGJhc2VvLS07IHdvcmRwKyspCi0JCWFkZHdvcmQgKCp3b3JkcCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFJFRzoKLQkgICAgICB0bXByZWcgPSBvcFAtPnJlZyAtIERBVEE7CS8qIDAuZHJlZyAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSRUc6Ci0JICAgICAgdG1wcmVnID0gMHgwOCArIG9wUC0+cmVnIC0gQUREUjsJLyogMS5hcmVnICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUlORFI6Ci0JICAgICAgdG1wcmVnID0gMHgxMCArIG9wUC0+cmVnIC0gQUREUjsJLyogMi5hcmVnICovCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQURFQzoKLQkgICAgICB0bXByZWcgPSAweDIwICsgb3BQLT5yZWcgLSBBRERSOwkvKiA0LmFyZWcgKi8KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBSU5DOgotCSAgICAgIHRtcHJlZyA9IDB4MTggKyBvcFAtPnJlZyAtIEFERFI7CS8qIDMuYXJlZyAqLwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERJU1A6Ci0KLQkgICAgICBuZXh0d29yZCA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQotCSAgICAgIGlmIChvcFAtPnJlZyA9PSBQQwotCQkgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCSAgJiYgbTY4a19hYnNwY2FkZCkKLQkJewotCQkgIG9wUC0+ZGlzcC5leHAuWF9vcCA9IE9fc3ltYm9sOwotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0JCSAgb3BQLT5kaXNwLmV4cC5YX2FkZF9zeW1ib2wgPSAmYWJzX3N5bWJvbDsKLSNlbHNlCi0JCSAgb3BQLT5kaXNwLmV4cC5YX2FkZF9zeW1ib2wgPQotCQkgICAgc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOwotI2VuZGlmCi0JCX0KLQotCSAgICAgIC8qIEZvcmNlIGludG8gaW5kZXggbW9kZS4gIEhvcGUgdGhpcyB3b3JrcyAqLwotCi0JICAgICAgLyogV2UgZG8gdGhlIGZpcnN0IGJpdCBmb3IgMzItYml0IGRpc3BsYWNlbWVudHMsIGFuZCB0aGUKLQkJIHNlY29uZCBiaXQgZm9yIDE2IGJpdCBvbmVzLiAgSXQgaXMgcG9zc2libGUgdGhhdCB3ZQotCQkgc2hvdWxkIG1ha2UgdGhlIGRlZmF1bHQgYmUgV09SRCBpbnN0ZWFkIG9mIExPTkcsIGJ1dAotCQkgSSB0aGluayB0aGF0J2QgYnJlYWsgR0NDLCBzbyB3ZSBwdXQgdXAgd2l0aCBhIGxpdHRsZQotCQkgaW5lZmZpY2llbmN5IGZvciB0aGUgc2FrZSBvZiB3b3JraW5nIG91dHB1dC4gICovCi0KLQkgICAgICBpZiAoIWlzc3dvcmQgKG5leHR3b3JkKQotCQkgIHx8IChpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJICAgICAgJiYgKChvcFAtPmRpc3Auc2l6ZSA9PSBTSVpFX1VOU1BFQwotCQkJICAgJiYgZmxhZ19zaG9ydF9yZWZzID09IDAKLQkJCSAgICYmIGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPj0gbTY4MDIwCi0JCQkgICAmJiAhIGFyY2hfY29sZGZpcmVfcCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCQkJICB8fCBvcFAtPmRpc3Auc2l6ZSA9PSBTSVpFX0xPTkcpKSkKLQkJewotCQkgIGlmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JCSAgICAgIHx8IGFyY2hfY29sZGZpcmVfcCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCQkgICAgb3BQLT5lcnJvciA9Ci0JCSAgICAgIF8oImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiKTsKLQkJICBpZiAob3BQLT5yZWcgPT0gUEMpCi0JCSAgICB0bXByZWcgPSAweDNCOwkvKiA3LjMgKi8KLQkJICBlbHNlCi0JCSAgICB0bXByZWcgPSAweDMwICsgb3BQLT5yZWcgLSBBRERSOwkvKiA2LmFyZWcgKi8KLQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQkgICAgewotCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMpCi0JCQl7Ci0JCQkgIGlmIChvcFAtPmRpc3Auc2l6ZSA9PSBTSVpFX0xPTkcKLSNpZmRlZiBPQkpfRUxGCi0JCQkgICAgICAvKiBJZiB0aGUgZGlzcGxhY2VtZW50IG5lZWRzIHBpYwotCQkJCSByZWxvY2F0aW9uIGl0IGNhbm5vdCBiZSByZWxheGVkLiAgKi8KLQkJCSAgICAgIHx8IG9wUC0+ZGlzcC5waWNfcmVsb2MgIT0gcGljX25vbmUKLSNlbmRpZgotCQkJICAgICAgKQotCQkJICAgIHsKLQkJCSAgICAgIGFkZHdvcmQgKDB4MDE3MCk7Ci0JCQkgICAgICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDEsIDIpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwKLQkJCQkJb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCQkJCVRBQiAoUENMRUEsIFNaX1VOREVGKSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgYWRkd29yZCAoMHgwMTcwKTsKLQkJCSAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBhZGR3b3JkICgweDAxNzApOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkID4+IDE2KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChvcFAtPnJlZyA9PSBQQykKLQkJICAgIHRtcHJlZyA9IDB4M0E7CS8qIDcuMiAqLwotCQkgIGVsc2UKLQkJICAgIHRtcHJlZyA9IDB4MjggKyBvcFAtPnJlZyAtIEFERFI7CS8qIDUuYXJlZyAqLwotCi0JCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKG9wUC0+cmVnID09IFBDKQotCQkJewotCQkJICBhZGRfZml4ICgndycsICZvcFAtPmRpc3AsIDEsIDApOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlhZGRfZml4ICgndycsICZvcFAtPmRpc3AsIDAsIDApOwotCQkgICAgfQotCQl9Ci0JICAgICAgYWRkd29yZCAobmV4dHdvcmQpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgUE9TVDoKLQkgICAgY2FzZSBQUkU6Ci0JICAgIGNhc2UgQkFTRToKLQkgICAgICBuZXh0d29yZCA9IDA7Ci0JICAgICAgYmFzZW8gPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0JICAgICAgaWYgKG9wUC0+bW9kZSA9PSBQT1NUIHx8IG9wUC0+bW9kZSA9PSBQUkUpCi0JCW91dHJvID0gZ2V0X251bSAoJm9wUC0+b2Rpc3AsIDgwKTsKLQkgICAgICAvKiBGaWd1cmUgb3V0IHRoZSBgYWRkcmVzc2luZyBtb2RlJy4KLQkJIEFsc28gdHVybiBvbiB0aGUgQkFTRV9ESVNBQkxFIGJpdCwgaWYgbmVlZGVkLiAgKi8KLQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMgfHwgb3BQLT5yZWcgPT0gWlBDKQotCQl7Ci0JCSAgdG1wcmVnID0gMHgzYjsJLyogNy4zICovCi0JCSAgaWYgKG9wUC0+cmVnID09IFpQQykKLQkJICAgIG5leHR3b3JkIHw9IDB4ODA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvcFAtPnJlZyA9PSAwKQotCQl7Ci0JCSAgbmV4dHdvcmQgfD0gMHg4MDsKLQkJICB0bXByZWcgPSAweDMwOwkvKiA2LmdhcmJhZ2UgKi8KLQkJfQotCSAgICAgIGVsc2UgaWYgKG9wUC0+cmVnID49IFpBRERSMCAmJiBvcFAtPnJlZyA8PSBaQUREUjcpCi0JCXsKLQkJICBuZXh0d29yZCB8PSAweDgwOwotCQkgIHRtcHJlZyA9IDB4MzAgKyBvcFAtPnJlZyAtIFpBRERSMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJdG1wcmVnID0gMHgzMCArIG9wUC0+cmVnIC0gQUREUjsJLyogNi5hcmVnICovCi0KLQkgICAgICBzaXoxID0gb3BQLT5kaXNwLnNpemU7Ci0JICAgICAgaWYgKG9wUC0+bW9kZSA9PSBQT1NUIHx8IG9wUC0+bW9kZSA9PSBQUkUpCi0JCXNpejIgPSBvcFAtPm9kaXNwLnNpemU7Ci0JICAgICAgZWxzZQotCQlzaXoyID0gU0laRV9VTlNQRUM7Ci0KLQkgICAgICAvKiBJbmRleCByZWdpc3RlciBzdHVmZiAqLwotCSAgICAgIGlmIChvcFAtPmluZGV4LnJlZyAhPSAwCi0JCSAgJiYgb3BQLT5pbmRleC5yZWcgPj0gREFUQQotCQkgICYmIG9wUC0+aW5kZXgucmVnIDw9IEFERFI3KQotCQl7Ci0JCSAgbmV4dHdvcmQgfD0gKG9wUC0+aW5kZXgucmVnIC0gREFUQSkgPDwgMTI7Ci0KLQkJICBpZiAob3BQLT5pbmRleC5zaXplID09IFNJWkVfTE9ORwotCQkgICAgICB8fCAob3BQLT5pbmRleC5zaXplID09IFNJWkVfVU5TUEVDCi0JCQkgICYmIG02OGtfaW5kZXhfd2lkdGhfZGVmYXVsdCA9PSBTSVpFX0xPTkcpKQotCQkgICAgbmV4dHdvcmQgfD0gMHg4MDA7Ci0KLQkJICBpZiAoKG9wUC0+aW5kZXguc2NhbGUgIT0gMSAKLQkJICAgICAgICYmIGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjApCi0JCSAgICAgIHx8IChvcFAtPmluZGV4LnNjYWxlID09IDggCi0JCQkgICYmIGFyY2hfY29sZGZpcmVfcCAoY3VycmVudF9hcmNoaXRlY3R1cmUpKSkKLQkJICAgIHsKLQkJICAgICAgb3BQLT5lcnJvciA9Ci0JCQlfKCJzY2FsZSBmYWN0b3IgaW52YWxpZCBvbiB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgY3B1MzIgb3IgNjgwMjAgb3IgaGlnaGVyIik7Ci0JCSAgICB9Ci0KLQkJICBpZiAoYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkKLQkJICAgICAgJiYgb3BQLT5pbmRleC5zaXplID09IFNJWkVfV09SRCkKLQkJICAgIG9wUC0+ZXJyb3IgPSBfKCJpbnZhbGlkIGluZGV4IHNpemUgZm9yIGNvbGRmaXJlIik7Ci0KLQkJICBzd2l0Y2ggKG9wUC0+aW5kZXguc2NhbGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIDE6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAyOgotCQkgICAgICBuZXh0d29yZCB8PSAweDIwMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDQ6Ci0JCSAgICAgIG5leHR3b3JkIHw9IDB4NDAwOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgODoKLQkJICAgICAgbmV4dHdvcmQgfD0gMHg2MDA7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYWJvcnQgKCk7Ci0JCSAgICB9Ci0JCSAgLyogSUYgaXRzIHNpbXBsZSwKLQkJICAgICBHRVQgVVMgT1VUIE9GIEhFUkUhICovCi0KLQkJICAvKiBNdXN0IGJlIElOREVYLCB3aXRoIGFuIGluZGV4IHJlZ2lzdGVyLiAgQWRkcmVzcwotCQkgICAgIHJlZ2lzdGVyIGNhbm5vdCBiZSBaRVJPLVBDLCBhbmQgZWl0aGVyIDpiIHdhcwotCQkgICAgIGZvcmNlZCwgb3Igd2Uga25vdyBpdCB3aWxsIGZpdC4gIEZvciBhIDY4MDAwIG9yCi0JCSAgICAgNjgwMTAsIGZvcmNlIHRoaXMgbW9kZSBhbnl3YXlzLCBiZWNhdXNlIHRoZQotCQkgICAgIGxhcmdlciBtb2RlcyBhcmVuJ3Qgc3VwcG9ydGVkLiAgKi8KLQkJICBpZiAob3BQLT5tb2RlID09IEJBU0UKLQkJICAgICAgJiYgKChvcFAtPnJlZyA+PSBBRERSMAotCQkJICAgJiYgb3BQLT5yZWcgPD0gQUREUjcpCi0JCQkgIHx8IG9wUC0+cmVnID09IFBDKSkKLQkJICAgIHsKLQkJICAgICAgaWYgKHNpejEgPT0gU0laRV9CWVRFCi0JCQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkJCSAgfHwgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkKLQkJCSAgfHwgKHNpejEgPT0gU0laRV9VTlNQRUMKLQkJCSAgICAgICYmICEgaXN2YXIgKCZvcFAtPmRpc3ApCi0JCQkgICAgICAmJiBpc3NieXRlIChiYXNlbykpKQotCQkJewotIAkJCSAgbmV4dHdvcmQgKz0gYmFzZW8gJiAweGZmOwotIAkJCSAgYWRkd29yZCAobmV4dHdvcmQpOwotIAkJCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBEbyBhIGJ5dGUgcmVsb2NhdGlvbi4gIElmIGl0IGRvZXNuJ3QKLQkJCQkgZml0IChwb3NzaWJsZSBvbiBtNjgwMDApIGxldCB0aGUKLQkJCQkgZml4dXAgcHJvY2Vzc2luZyBjb21wbGFpbiBsYXRlci4gICovCi0JCQkgICAgICBpZiAob3BQLT5yZWcgPT0gUEMpCi0JCQkJYWRkX2ZpeCAoJ0InLCAmb3BQLT5kaXNwLCAxLCAxKTsKLQkJCSAgICAgIGVsc2UKLQkJCQlhZGRfZml4ICgnQicsICZvcFAtPmRpc3AsIDAsIDApOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoc2l6MSAhPSBTSVpFX0JZVEUpCi0JCQkgICAgewotCQkJICAgICAgaWYgKHNpejEgIT0gU0laRV9VTlNQRUMpCi0JCQkJYXNfd2FybiAoXygiRm9yY2luZyBieXRlIGRpc3BsYWNlbWVudCIpKTsKLQkJCSAgICAgIGlmICghIGlzc2J5dGUgKGJhc2VvKSkKLQkJCQlvcFAtPmVycm9yID0gXygiYnl0ZSBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlIik7Ci0JCQkgICAgfQotCi0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChzaXoxID09IFNJWkVfVU5TUEVDCi0JCQkgICAgICAgJiYgb3BQLT5yZWcgPT0gUEMKLQkJCSAgICAgICAmJiBpc3ZhciAoJm9wUC0+ZGlzcCkKLQkJCSAgICAgICAmJiBzdWJzICgmb3BQLT5kaXNwKSA9PSBOVUxMCi0jaWZkZWYgT0JKX0VMRgotCQkJICAgICAgIC8qIElmIHRoZSBkaXNwbGFjZW1lbnQgbmVlZHMgcGljCi0JCQkJICByZWxvY2F0aW9uIGl0IGNhbm5vdCBiZSByZWxheGVkLiAgKi8KLQkJCSAgICAgICAmJiBvcFAtPmRpc3AucGljX3JlbG9jID09IHBpY19ub25lCi0jZW5kaWYKLQkJCSAgICAgICApCi0JCQl7Ci0JCQkgIC8qIFRoZSBjb2RlIGluIG1kX2NvbnZlcnRfZnJhZ18xIG5lZWRzIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFibGUgdG8gYWRqdXN0IG5leHR3b3JkLiAgQ2FsbCBmcmFnX2dyb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyYWcgb2JzdGFjayB0byBtYWtlIGFsbCB0aGUgYnl0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGlndW91cy4gICovCi0JCQkgIGZyYWdfZ3JvdyAoMTQpOwotIAkJCSAgbmV4dHdvcmQgKz0gYmFzZW8gJiAweGZmOwotIAkJCSAgYWRkd29yZCAobmV4dHdvcmQpOwotIAkJCSAgYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKLSAJCQkJICAgIFRBQiAoUENJTkRFWCwgU1pfVU5ERUYpKTsKLQotCQkJICBicmVhazsKLSAJCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBuZXh0d29yZCB8PSAweDQwOwkvKiBObyBpbmRleCByZWcgKi8KLQkJICBpZiAob3BQLT5pbmRleC5yZWcgPj0gWkRBVEEwCi0JCSAgICAgICYmIG9wUC0+aW5kZXgucmVnIDw9IFpEQVRBNykKLQkJICAgIG5leHR3b3JkIHw9IChvcFAtPmluZGV4LnJlZyAtIFpEQVRBMCkgPDwgMTI7Ci0JCSAgZWxzZSBpZiAob3BQLT5pbmRleC5yZWcgPj0gWkFERFIwCi0JCQkgICB8fCBvcFAtPmluZGV4LnJlZyA8PSBaQUREUjcpCi0JCSAgICBuZXh0d29yZCB8PSAob3BQLT5pbmRleC5yZWcgLSBaQUREUjAgKyA4KSA8PCAxMjsKLQkJfQotCi0JICAgICAgLyogSXQgaXNuJ3Qgc2ltcGxlLiAgKi8KLQotCSAgICAgIGlmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JCSAgfHwgYXJjaF9jb2xkZmlyZV9wIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JCW9wUC0+ZXJyb3IgPQotCQkgIF8oImludmFsaWQgb3BlcmFuZCBtb2RlIGZvciB0aGlzIGFyY2hpdGVjdHVyZTsgbmVlZHMgNjgwMjAgb3IgaGlnaGVyIik7Ci0KLQkgICAgICBuZXh0d29yZCB8PSAweDEwMDsKLQkgICAgICAvKiBJZiB0aGUgZ3V5IHNwZWNpZmllZCBhIHdpZHRoLCB3ZSBhc3N1bWUgdGhhdCBpdCBpcwotCQkgd2lkZSBlbm91Z2guICBNYXliZSBpdCBpc24ndC4gIElmIHNvLCB3ZSBsb3NlLiAgKi8KLQkgICAgICBzd2l0Y2ggKHNpejEpCi0JCXsKLQkJY2FzZSBTSVpFX1VOU1BFQzoKLQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApCi0JCSAgICAgID8gbTY4a19yZWwzMgotCQkgICAgICA6ICEgaXNzd29yZCAoYmFzZW8pKQotCQkgICAgewotCQkgICAgICBzaXoxID0gU0laRV9MT05HOwotCQkgICAgICBuZXh0d29yZCB8PSAweDMwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKCEgaXN2YXIgKCZvcFAtPmRpc3ApICYmIGJhc2VvID09IDApCi0JCSAgICBuZXh0d29yZCB8PSAweDEwOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgbmV4dHdvcmQgfD0gMHgyMDsKLQkJICAgICAgc2l6MSA9IFNJWkVfV09SRDsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJY2FzZSBTSVpFX0JZVEU6Ci0JCSAgYXNfd2FybiAoXygiOmIgbm90IHBlcm1pdHRlZDsgZGVmYXVsdGluZyB0byA6dyIpKTsKLQkJICAvKiBGYWxsIHRocm91Z2guICAqLwotCQljYXNlIFNJWkVfV09SRDoKLQkJICBuZXh0d29yZCB8PSAweDIwOwotCQkgIGJyZWFrOwotCQljYXNlIFNJWkVfTE9ORzoKLQkJICBuZXh0d29yZCB8PSAweDMwOwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICAvKiBGaWd1cmUgb3V0IGlubm5lciBkaXNwbGFjZW1lbnQgc3R1ZmYgKi8KLQkgICAgICBpZiAob3BQLT5tb2RlID09IFBPU1QgfHwgb3BQLT5tb2RlID09IFBSRSkKLQkJewotCQkgIGlmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpICYgY3B1MzIpCi0JCSAgICBvcFAtPmVycm9yID0gXygiaW52YWxpZCBvcGVyYW5kIG1vZGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiKTsKLQkJICBzd2l0Y2ggKHNpejIpCi0JCSAgICB7Ci0JCSAgICBjYXNlIFNJWkVfVU5TUEVDOgotCQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPm9kaXNwKQotCQkJICA/IG02OGtfcmVsMzIKLQkJCSAgOiAhIGlzc3dvcmQgKG91dHJvKSkKLQkJCXsKLQkJCSAgc2l6MiA9IFNJWkVfTE9ORzsKLQkJCSAgbmV4dHdvcmQgfD0gMHgzOwotCQkJfQotCQkgICAgICBlbHNlIGlmICghIGlzdmFyICgmb3BQLT5vZGlzcCkgJiYgb3V0cm8gPT0gMCkKLQkJCW5leHR3b3JkIHw9IDB4MTsKLQkJICAgICAgZWxzZQotCQkJewotCQkJICBuZXh0d29yZCB8PSAweDI7Ci0JCQkgIHNpejIgPSBTSVpFX1dPUkQ7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAxOgotCQkgICAgICBhc193YXJuIChfKCI6YiBub3QgcGVybWl0dGVkOyBkZWZhdWx0aW5nIHRvIDp3IikpOwotCQkgICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotCQkgICAgY2FzZSAyOgotCQkgICAgICBuZXh0d29yZCB8PSAweDI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAzOgotCQkgICAgICBuZXh0d29yZCB8PSAweDM7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGlmIChvcFAtPm1vZGUgPT0gUE9TVAotCQkgICAgICAmJiAobmV4dHdvcmQgJiAweDQwKSA9PSAwKQotCQkgICAgbmV4dHdvcmQgfD0gMHgwNDsKLQkJfQotCSAgICAgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQotCSAgICAgIGlmIChzaXoxICE9IFNJWkVfVU5TUEVDICYmIGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJewotCQkgIGlmIChvcFAtPnJlZyA9PSBQQyB8fCBvcFAtPnJlZyA9PSBaUEMpCi0JCSAgICBhZGRfZml4IChzaXoxID09IFNJWkVfTE9ORyA/ICdsJyA6ICd3JywgJm9wUC0+ZGlzcCwgMSwgMik7Ci0JCSAgZWxzZQotCQkgICAgYWRkX2ZpeCAoc2l6MSA9PSBTSVpFX0xPTkcgPyAnbCcgOiAndycsICZvcFAtPmRpc3AsIDAsIDApOwotCQl9Ci0JICAgICAgaWYgKHNpejEgPT0gU0laRV9MT05HKQotCQlhZGR3b3JkIChiYXNlbyA+PiAxNik7Ci0JICAgICAgaWYgKHNpejEgIT0gU0laRV9VTlNQRUMpCi0JCWFkZHdvcmQgKGJhc2VvKTsKLQotCSAgICAgIGlmIChzaXoyICE9IFNJWkVfVU5TUEVDICYmIGlzdmFyICgmb3BQLT5vZGlzcCkpCi0JCWFkZF9maXggKHNpejIgPT0gU0laRV9MT05HID8gJ2wnIDogJ3cnLCAmb3BQLT5vZGlzcCwgMCwgMCk7Ci0JICAgICAgaWYgKHNpejIgPT0gU0laRV9MT05HKQotCQlhZGR3b3JkIChvdXRybyA+PiAxNik7Ci0JICAgICAgaWYgKHNpejIgIT0gU0laRV9VTlNQRUMpCi0JCWFkZHdvcmQgKG91dHJvKTsKLQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgQUJTTDoKLQkgICAgICBuZXh0d29yZCA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgICAgICBzd2l0Y2ggKG9wUC0+ZGlzcC5zaXplKQotCQl7Ci0JCWRlZmF1bHQ6Ci0JCSAgYWJvcnQgKCk7Ci0JCWNhc2UgU0laRV9VTlNQRUM6Ci0JCSAgaWYgKCFpc3ZhciAoJm9wUC0+ZGlzcCkgJiYgaXNzd29yZCAob2ZmcyAoJm9wUC0+ZGlzcCkpKQotCQkgICAgewotCQkgICAgICB0bXByZWcgPSAweDM4OwkvKiA3LjAgKi8KLQkJICAgICAgYWRkd29yZCAobmV4dHdvcmQpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAvKiBEb24ndCBnZW5lcmF0ZSBwYyByZWxhdGl2ZSBjb2RlIG9uIDY4MDEwIGFuZAotCQkgICAgIDY4MDAwLiAgKi8KLQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApCi0JCSAgICAgICYmICFzdWJzICgmb3BQLT5kaXNwKQotCQkgICAgICAmJiBhZGRzICgmb3BQLT5kaXNwKQotI2lmZGVmIE9CSl9FTEYKLQkJICAgICAgLyogSWYgdGhlIGRpc3BsYWNlbWVudCBuZWVkcyBwaWMgcmVsb2NhdGlvbiBpdAotCQkJIGNhbm5vdCBiZSByZWxheGVkLiAgKi8KLQkJICAgICAgJiYgb3BQLT5kaXNwLnBpY19yZWxvYyA9PSBwaWNfbm9uZQotI2VuZGlmCi0JCSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGFkZHMgKCZvcFAtPmRpc3ApKSA9PSBub3dfc2VnCi0JCSAgICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGFkZHMgKCZvcFAtPmRpc3ApKQotCQkgICAgICAmJiBIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKQotCQkgICAgICAmJiAhZmxhZ19sb25nX2p1bXBzCi0JCSAgICAgICYmICFzdHJjaHIgKCJ+JSYkPyIsIHNbMF0pKQotCQkgICAgewotCQkgICAgICB0bXByZWcgPSAweDNBOwkvKiA3LjIgKi8KLQkJICAgICAgYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLAotCQkJCW9mZnMgKCZvcFAtPmRpc3ApLAotCQkJCVRBQiAoUENSRUwsIFNaX1VOREVGKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIC8qIEZhbGwgdGhyb3VnaCBpbnRvIGxvbmcgKi8KLQkJY2FzZSBTSVpFX0xPTkc6Ci0JCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJICAgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0KLQkJICB0bXByZWcgPSAweDM5Oy8qIDcuMSBtb2RlICovCi0JCSAgYWRkd29yZCAobmV4dHdvcmQgPj4gMTYpOwotCQkgIGFkZHdvcmQgKG5leHR3b3JkKTsKLQkJICBicmVhazsKLQotCQljYXNlIFNJWkVfQllURToKLQkJICBhc19iYWQgKF8oInVuc3VwcG9ydGVkIGJ5dGUgdmFsdWU7IHVzZSBhIGRpZmZlcmVudCBzdWZmaXgiKSk7Ci0JCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJY2FzZSBTSVpFX1dPUkQ6CS8qIFdvcmQgKi8KLQkJICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQkgICAgYWRkX2ZpeCAoJ3cnLCAmb3BQLT5kaXNwLCAwLCAwKTsKLQotCQkgIHRtcHJlZyA9IDB4Mzg7LyogNy4wIG1vZGUgKi8KLQkJICBhZGR3b3JkIChuZXh0d29yZCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDT05UUk9MOgotCSAgICBjYXNlIEZQUkVHOgotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygidW5rbm93bi9pbmNvcnJlY3Qgb3BlcmFuZCIpKTsKLQkgICAgICAvKiBhYm9ydCgpOyAqLwotCSAgICB9Ci0JICBpbnN0YWxsX2dlbl9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICcjJzoKLQljYXNlICdeJzoKLQkgIHN3aXRjaCAoc1sxXSkKLQkgICAgewkJCS8qIEpGOiBJIGhhdGUgZmxvYXRpbmcgcG9pbnQhICovCi0JICAgIGNhc2UgJ2onOgotCSAgICAgIHRtcHJlZyA9IDcwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICc4JzoKLQkgICAgICB0bXByZWcgPSAyMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQyc6Ci0JICAgICAgdG1wcmVnID0gNTA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJzMnOgotCSAgICBkZWZhdWx0OgotCSAgICAgIHRtcHJlZyA9IDgwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCB0bXByZWcpOwotCSAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkgICAgYWRkX2ZpeCAoc1sxXSwgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JICBzd2l0Y2ggKHNbMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnYic6CQkvKiBEYW5nZXI6ICBUaGVzZSBkbyBubyBjaGVjayBmb3IKLQkJCQkgICBjZXJ0YWluIHR5cGVzIG9mIG92ZXJmbG93LgotCQkJCSAgIHVzZXIgYmV3YXJlISAqLwotCSAgICAgIGlmICghaXNieXRlICh0bXByZWcpKQotCQlvcFAtPmVycm9yID0gXygib3V0IG9mIHJhbmdlIik7Ci0JICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPQotCQkgIChvcGNvZGUtPm1fY29kZW51bSkgKiAyICsgMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgaWYgKCFpc3NieXRlICh0bXByZWcpKQotCQlvcFAtPmVycm9yID0gXygib3V0IG9mIHJhbmdlIik7Ci0JICAgICAgdGhlX2lucy5vcGNvZGVbdGhlX2lucy5udW1vIC0gMV0gfD0gdG1wcmVnICYgMHhmZjsKLQkgICAgICBpZiAoaXN2YXIgKCZvcFAtPmRpc3ApKQotCQl0aGVfaW5zLnJlbG9jW3RoZV9pbnMubnJlbCAtIDFdLm4gPSBvcGNvZGUtPm1fY29kZW51bSAqIDIgLSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkgICAgICBpZiAoIWlzd29yZCAodG1wcmVnKSkKLQkJb3BQLT5lcnJvciA9IF8oIm91dCBvZiByYW5nZSIpOwotCSAgICAgIGluc29wICh0bXByZWcsIG9wY29kZSk7Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWwgLSAxXS5uID0gKG9wY29kZS0+bV9jb2RlbnVtKSAqIDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIGlmICghaXNzd29yZCAodG1wcmVnKSkKLQkJb3BQLT5lcnJvciA9IF8oIm91dCBvZiByYW5nZSIpOwotCSAgICAgIGluc29wICh0bXByZWcsIG9wY29kZSk7Ci0JICAgICAgaWYgKGlzdmFyICgmb3BQLT5kaXNwKSkKLQkJdGhlX2lucy5yZWxvY1t0aGVfaW5zLm5yZWwgLSAxXS5uID0gKG9wY29kZS0+bV9jb2RlbnVtKSAqIDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2wnOgotCSAgICAgIC8qIEJlY2F1c2Ugb2YgdGhlIHdheSBpbnNvcCB3b3Jrcywgd2UgcHV0IHRoZXNlIHR3byBvdXQKLQkJIGJhY2t3YXJkcy4gICovCi0JICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKLQkgICAgICBpbnNvcCAodG1wcmVnID4+IDE2LCBvcGNvZGUpOwotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXRoZV9pbnMucmVsb2NbdGhlX2lucy5ucmVsIC0gMV0ubiA9IChvcGNvZGUtPm1fY29kZW51bSkgKiAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICczJzoKLQkgICAgICB0bXByZWcgJj0gMHhGRjsKLQkgICAgY2FzZSAnOCc6Ci0JICAgIGNhc2UgJ0MnOgotCSAgICBjYXNlICdqJzoKLQkgICAgICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnKyc6Ci0JY2FzZSAnLSc6Ci0JY2FzZSAnQSc6Ci0JY2FzZSAnYSc6Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIG9wUC0+cmVnIC0gQUREUik7Ci0JICBicmVhazsKLQotCWNhc2UgJ0InOgotCSAgdG1wcmVnID0gZ2V0X251bSAoJm9wUC0+ZGlzcCwgODApOwotCSAgc3dpdGNoIChzWzFdKQotCSAgICB7Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIC8qIFRoZSBwY19maXggYXJndW1lbnQgd2luZHMgdXAgaW4gZnhfcGNyZWxfYWRqdXN0LAotICAgICAgICAgICAgICAgICB3aGljaCBpcyBhIGNoYXIsIGFuZCBtYXkgdGhlcmVmb3JlIGJlIHVuc2lnbmVkLiAgV2UKLSAgICAgICAgICAgICAgICAgd2FudCB0byBwYXNzIC0xLCBidXQgd2UgcGFzcyA2NCBpbnN0ZWFkLCBhbmQgY29udmVydAotICAgICAgICAgICAgICAgICBiYWNrIGluIG1kX3BjcmVsX2Zyb20uICAqLwotCSAgICAgIGFkZF9maXggKCdCJywgJm9wUC0+ZGlzcCwgMSwgNjQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdXJzoKLQkgICAgICBhZGRfZml4ICgndycsICZvcFAtPmRpc3AsIDEsIDApOwotCSAgICAgIGFkZHdvcmQgKDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdMJzoKLQkgICAgbG9uZ19icmFuY2g6Ci0JICAgICAgaWYgKCFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkJYXNfd2FybiAoXygiQ2FuJ3QgdXNlIGxvbmcgYnJhbmNoZXMgb24gNjgwMDAvNjgwMTAvNTIwMCIpKTsKLQkgICAgICB0aGVfaW5zLm9wY29kZVt0aGVfaW5zLm51bW8gLSAxXSB8PSAweGZmOwotCSAgICAgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JICAgICAgYWRkd29yZCAoMCk7Ci0JICAgICAgYWRkd29yZCAoMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2cnOgotCSAgICAgIGlmIChzdWJzICgmb3BQLT5kaXNwKSkJLyogV2UgY2FuJ3QgcmVsYXggaXQgKi8KLQkJZ290byBsb25nX2JyYW5jaDsKLQotI2lmZGVmIE9CSl9FTEYKLQkgICAgICAvKiBJZiB0aGUgZGlzcGxhY2VtZW50IG5lZWRzIHBpYyByZWxvY2F0aW9uIGl0IGNhbm5vdCBiZQotCQkgcmVsYXhlZC4gICovCi0JICAgICAgaWYgKG9wUC0+ZGlzcC5waWNfcmVsb2MgIT0gcGljX25vbmUpCi0JCWdvdG8gbG9uZ19icmFuY2g7Ci0jZW5kaWYKLQotCSAgICAgIC8qIFRoaXMgY291bGQgZWl0aGVyIGJlIGEgc3ltYm9sLCBvciBhbiBhYnNvbHV0ZQotCQkgYWRkcmVzcy4gIE5vIG1hdHRlciwgdGhlIGZyYWcgaGFja2luZyB3aWxsIGZpbmdlciBpdAotCQkgb3V0LiAgTm90IHF1aXRlOiBpdCBjYW4ndCBzd2l0Y2ggZnJvbSBCUkFOQ0ggdG8KLQkJIEJDQzY4MDAwIGZvciB0aGUgY2FzZSB3aGVyZSBvcG5kIGlzIGFic29sdXRlIChpdAotCQkgbmVlZHMgdG8gdXNlIHRoZSA2ODAwMCBoYWNrIHNpbmNlIG5vIGNvbmRpdGlvbmFsIGFicwotCQkganVtcHMpLiAgKi8KLQkgICAgICBpZiAoKCAhSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkKLQkJICAgfHwgKDAgPT0gYWRkcyAoJm9wUC0+ZGlzcCkpKQotCQkgICYmICh0aGVfaW5zLm9wY29kZVswXSA+PSAweDYyMDApCi0JCSAgJiYgKHRoZV9pbnMub3Bjb2RlWzBdIDw9IDB4NmYwMCkpCi0JCWFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCQkgIFRBQiAoQkNDNjgwMDAsIFNaX1VOREVGKSk7Ci0JICAgICAgZWxzZQotCQlhZGRfZnJhZyAoYWRkcyAoJm9wUC0+ZGlzcCksIG9mZnMgKCZvcFAtPmRpc3ApLAotCQkJICBUQUIgKEFCUkFOQ0gsIFNaX1VOREVGKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3cnOgotCSAgICAgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JCXsKLSNpZiAxCi0JCSAgLyogY2hlY2sgZm9yIERCY2MgaW5zdHJ1Y3Rpb24gKi8KLQkJICBpZiAoKHRoZV9pbnMub3Bjb2RlWzBdICYgMHhmMGY4KSA9PSAweDUwYzgpCi0JCSAgICB7Ci0JCSAgICAgIC8qIHNpemUgdmFyaWVzIGlmIHBhdGNoICovCi0JCSAgICAgIC8qIG5lZWRlZCBmb3IgbG9uZyBmb3JtICovCi0JCSAgICAgIGFkZF9mcmFnIChhZGRzICgmb3BQLT5kaXNwKSwgb2ZmcyAoJm9wUC0+ZGlzcCksCi0JCQkJVEFCIChEQkNDLCBTWl9VTkRFRikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLSNlbmRpZgotCQkgIGFkZF9maXggKCd3JywgJm9wUC0+ZGlzcCwgMSwgMCk7Ci0JCX0KLQkgICAgICBhZGR3b3JkICgwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnQyc6CQkvKiBGaXhlZCBzaXplIExPTkcgY29wcm9jIGJyYW5jaGVzICovCi0JICAgICAgYWRkX2ZpeCAoJ2wnLCAmb3BQLT5kaXNwLCAxLCAwKTsKLQkgICAgICBhZGR3b3JkICgwKTsKLQkgICAgICBhZGR3b3JkICgwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnYyc6CQkvKiBWYXIgc2l6ZSBDb3Byb2Nlc3Nzb3IgYnJhbmNoZXMgKi8KLQkgICAgICBpZiAoc3VicyAoJm9wUC0+ZGlzcCkpCi0JCXsKLQkJICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDEsIDApOwotCQkgIGFkZF9mcmFnICgoc3ltYm9sUyAqKSAwLCAob2Zmc2V0VCkgMCwgVEFCIChGQlJBTkNILCBMT05HKSk7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChhZGRzICgmb3BQLT5kaXNwKSkKLQkJYWRkX2ZyYWcgKGFkZHMgKCZvcFAtPmRpc3ApLCBvZmZzICgmb3BQLT5kaXNwKSwKLQkJCSAgVEFCIChGQlJBTkNILCBTWl9VTkRFRikpOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIGFkZF9mcmFnICgoc3ltYm9sUyAqKSAwLCBvZmZzICgmb3BQLT5kaXNwKSwKLQkJICAgICAJICAgICAgIFRBQihGQlJBTkNILFNIT1JUKSk7ICovCi0JCSAgdGhlX2lucy5vcGNvZGVbdGhlX2lucy5udW1vIC0gMV0gfD0gMHg0MDsKLQkJICBhZGRfZml4ICgnbCcsICZvcFAtPmRpc3AsIDEsIDApOwotCQkgIGFkZHdvcmQgKDApOwotCQkgIGFkZHdvcmQgKDApOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnQyc6CQkvKiBJZ25vcmUgaXQgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6CQkvKiBKRiB0aGlzIGlzIGEga2x1ZGdlICovCi0JICBpbnN0YWxsX29wZXJhbmQgKCdzJywgb3BQLT5yZWcgLSBBRERSKTsKLQkgIHRtcHJlZyA9IGdldF9udW0gKCZvcFAtPmRpc3AsIDgwKTsKLQkgIGlmICghaXNzd29yZCAodG1wcmVnKSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gb3V0IG9mIHJhbmdlLCB1c2luZyAwIikpOwotCSAgICAgIHRtcHJlZyA9IDA7Ci0JICAgIH0KLQkgIGFkZHdvcmQgKHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ0QnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIERBVEEpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdFJzoJCS8qIElnbm9yZSBpdCAqLwotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5yZWcgLSBGUDApOwotCSAgYnJlYWs7Ci0KLQljYXNlICdHJzoJCS8qIElnbm9yZSBpdCAqLwotCWNhc2UgJ0gnOgotCSAgYnJlYWs7Ci0KLQljYXNlICdJJzoKLQkgIHRtcHJlZyA9IG9wUC0+cmVnIC0gQ09QMDsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSic6CQkvKiBKRiBmb28gKi8KLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBTRkM6Ci0JICAgICAgdG1wcmVnID0gMHgwMDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgREZDOgotCSAgICAgIHRtcHJlZyA9IDB4MDAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENBQ1I6Ci0JICAgICAgdG1wcmVnID0gMHgwMDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVEM6Ci0JICAgICAgdG1wcmVnID0gMHgwMDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSVRUMDoKLQkgICAgICB0bXByZWcgPSAweDAwNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJVFQxOgotCSAgICAgIHRtcHJlZyA9IDB4MDA1OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERUVDA6Ci0JICAgICAgdG1wcmVnID0gMHgwMDY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFRUMToKLQkgICAgICB0bXByZWcgPSAweDAwNzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBCVVNDUjoKLQkgICAgICB0bXByZWcgPSAweDAwODsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFVTUDoKLQkgICAgICB0bXByZWcgPSAweDgwMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBWQlI6Ci0JICAgICAgdG1wcmVnID0gMHg4MDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0FBUjoKLQkgICAgICB0bXByZWcgPSAweDgwMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBNU1A6Ci0JICAgICAgdG1wcmVnID0gMHg4MDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSVNQOgotCSAgICAgIHRtcHJlZyA9IDB4ODA0OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1NVVNSOgotCSAgICAgIHRtcHJlZyA9IDB4ODA1OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFVSUDoKLQkgICAgICB0bXByZWcgPSAweDgwNjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUlA6Ci0JICAgICAgdG1wcmVnID0gMHg4MDc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSOgotCSAgICAgIHRtcHJlZyA9IDB4ODA4OwotCSAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBST01CQVI6Ci0JICAgICAgdG1wcmVnID0gMHhDMDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkFNQkFSMDoKLQkgICAgICB0bXByZWcgPSAweEMwNDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSQU1CQVIxOgotCSAgICAgIHRtcHJlZyA9IDB4QzA1OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE1CQVI6Ci0JICAgICAgdG1wcmVnID0gMHhDMEY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnayc6Ci0JICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA1NSk7Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyAmIDB4N2YpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdsJzoKLQkgIHRtcHJlZyA9IG9wUC0+bWFzazsKLQkgIGlmIChzWzFdID09ICd3JykKLQkgICAgewotCSAgICAgIGlmICh0bXByZWcgJiAweDdGRjAwMDApCi0JCWFzX2JhZCAoXygiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gcmVnaXN0ZXIgbGlzdCIpKTsKLQkgICAgICBpbnNvcCAocmV2ZXJzZV8xNl9iaXRzICh0bXByZWcpLCBvcGNvZGUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAodG1wcmVnICYgMHg3MDBGRkZGKQotCQlhc19iYWQgKF8oIldyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiKSk7Ci0JICAgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCByZXZlcnNlXzhfYml0cyAodG1wcmVnID4+IDE2KSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSAnTCc6Ci0JICB0bXByZWcgPSBvcFAtPm1hc2s7Ci0JICBpZiAoc1sxXSA9PSAndycpCi0JICAgIHsKLQkgICAgICBpZiAodG1wcmVnICYgMHg3RkYwMDAwKQotCQlhc19iYWQgKF8oIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIHJlZ2lzdGVyIGxpc3QiKSk7Ci0JICAgICAgaW5zb3AgKHRtcHJlZywgb3Bjb2RlKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc1sxXSA9PSAnOCcpCi0JICAgIHsKLQkgICAgICBpZiAodG1wcmVnICYgMHgwRkZGRkZGKQotCQlhc19iYWQgKF8oImluY29ycmVjdCByZWdpc3RlciBpbiByZWdsaXN0IikpOwotCSAgICAgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnID4+IDI0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHRtcHJlZyAmIDB4NzAwRkZGRikKLQkJYXNfYmFkIChfKCJ3cm9uZyByZWdpc3RlciBpbiBmbG9hdGluZy1wb2ludCByZWdsaXN0IikpOwotCSAgICAgIGVsc2UKLQkJaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcgPj4gMTYpOwotCSAgICB9Ci0JICBicmVhazsKLQotCWNhc2UgJ00nOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBnZXRfbnVtICgmb3BQLT5kaXNwLCA2MCkpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdPJzoKLQkgIHRtcHJlZyA9ICgob3BQLT5tb2RlID09IERSRUcpCi0JCSAgICA/IDB4MjAgKyBvcFAtPnJlZyAtIERBVEEKLQkJICAgIDogKGdldF9udW0gKCZvcFAtPmRpc3AsIDQwKSAmIDB4MUYpKTsKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUSc6Ci0JICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCAxMCk7Ci0JICBpZiAodG1wcmVnID09IDgpCi0JICAgIHRtcHJlZyA9IDA7Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ1InOgotCSAgLyogVGhpcyBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgQUREUiByZWdpc3RlcnMgYXJlIGVpZ2h0Ci0JICAgICBtb3JlIHRoYW4gdGhlaXIgY29ycmVzcG9uZGluZyBEQVRBIHJlZ3MsIHNvIHRoZSByZXN1bHQKLQkgICAgIHdpbGwgaGF2ZSB0aGUgQUREUl9SRUcgYml0IHNldCAqLwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIERBVEEpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdyJzoKLQkgIGlmIChvcFAtPm1vZGUgPT0gQUlORFIpCi0JICAgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgb3BQLT5yZWcgLSBEQVRBKTsKLQkgIGVsc2UKLQkgICAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPmluZGV4LnJlZyAtIERBVEEpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdzJzoKLQkgIGlmIChvcFAtPnJlZyA9PSBGUEkpCi0JICAgIHRtcHJlZyA9IDB4MTsKLQkgIGVsc2UgaWYgKG9wUC0+cmVnID09IEZQUykKLQkgICAgdG1wcmVnID0gMHgyOwotCSAgZWxzZSBpZiAob3BQLT5yZWcgPT0gRlBDKQotCSAgICB0bXByZWcgPSAweDQ7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdTJzoJCS8qIElnbm9yZSBpdCAqLwotCSAgYnJlYWs7Ci0KLQljYXNlICdUJzoKLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgZ2V0X251bSAoJm9wUC0+ZGlzcCwgMzApKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVSc6CQkvKiBJZ25vcmUgaXQgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSAnYyc6Ci0JICBzd2l0Y2ggKG9wUC0+cmVnKQotCSAgICB7Ci0JICAgIGNhc2UgTkM6Ci0JICAgICAgdG1wcmVnID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEQzoKLQkgICAgICB0bXByZWcgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElDOgotCSAgICAgIHRtcHJlZyA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQkM6Ci0JICAgICAgdG1wcmVnID0gMzsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjayIpKTsKLQkgICAgfQkJCS8qIHN3aXRjaCBvbiBjYWNoZSB0b2tlbiAqLwotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0jaWZuZGVmIE5PXzY4ODUxCi0JICAvKiBKRjogVGhlc2UgYXJlIG91dCBvZiBvcmRlciwgSSBmZWFyLiAqLwotCWNhc2UgJ2YnOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIFNGQzoKLQkgICAgICB0bXByZWcgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERGQzoKLQkgICAgICB0bXByZWcgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICB9Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCSAgc3dpdGNoIChvcFAtPnJlZykKLQkgICAgewotCSAgICBjYXNlIFRDOgotCSAgICAgIHRtcHJlZyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0FMOgotCSAgICAgIHRtcHJlZyA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgVkFMOgotCSAgICAgIHRtcHJlZyA9IDU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU0NDOgotCSAgICAgIHRtcHJlZyA9IDY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUM6Ci0JICAgICAgdG1wcmVnID0gNzsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdWJzoKLQkgIGlmIChvcFAtPnJlZyA9PSBWQUwpCi0JICAgIGJyZWFrOwotCSAgYWJvcnQgKCk7Ci0KLQljYXNlICdXJzoKLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBEUlA6Ci0JICAgICAgdG1wcmVnID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUlA6Ci0JICAgICAgdG1wcmVnID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDUlA6Ci0JICAgICAgdG1wcmVnID0gMzsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdYJzoKLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBCQUQ6Ci0JICAgIGNhc2UgQkFEICsgMToKLQkgICAgY2FzZSBCQUQgKyAyOgotCSAgICBjYXNlIEJBRCArIDM6Ci0JICAgIGNhc2UgQkFEICsgNDoKLQkgICAgY2FzZSBCQUQgKyA1OgotCSAgICBjYXNlIEJBRCArIDY6Ci0JICAgIGNhc2UgQkFEICsgNzoKLQkgICAgICB0bXByZWcgPSAoNCA8PCAxMCkgfCAoKG9wUC0+cmVnIC0gQkFEKSA8PCAyKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEJBQzoKLQkgICAgY2FzZSBCQUMgKyAxOgotCSAgICBjYXNlIEJBQyArIDI6Ci0JICAgIGNhc2UgQkFDICsgMzoKLQkgICAgY2FzZSBCQUMgKyA0OgotCSAgICBjYXNlIEJBQyArIDU6Ci0JICAgIGNhc2UgQkFDICsgNjoKLQkgICAgY2FzZSBCQUMgKyA3OgotCSAgICAgIHRtcHJlZyA9ICg1IDw8IDEwKSB8ICgob3BQLT5yZWcgLSBCQUMpIDw8IDIpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQgKCk7Ci0JICAgIH0KLQkgIGluc3RhbGxfb3BlcmFuZCAoc1sxXSwgdG1wcmVnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1knOgotCSAga25vdyAob3BQLT5yZWcgPT0gUFNSKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1onOgotCSAga25vdyAob3BQLT5yZWcgPT0gUENTUik7Ci0JICBicmVhazsKLSNlbmRpZiAvKiBtNjg4NTEgKi8KLQljYXNlICczJzoKLQkgIHN3aXRjaCAob3BQLT5yZWcpCi0JICAgIHsKLQkgICAgY2FzZSBUVDA6Ci0JICAgICAgdG1wcmVnID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBUVDE6Ci0JICAgICAgdG1wcmVnID0gMzsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQkgICAgfQotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCB0bXByZWcpOwotCSAgYnJlYWs7Ci0JY2FzZSAndCc6Ci0JICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCAyMCk7Ci0JICBpbnN0YWxsX29wZXJhbmQgKHNbMV0sIHRtcHJlZyk7Ci0JICBicmVhazsKLQljYXNlICdfJzoJLyogdXNlZCBvbmx5IGZvciBtb3ZlMTYgYWJzb2x1dGUgMzItYml0IGFkZHJlc3MgKi8KLQkgIGlmIChpc3ZhciAoJm9wUC0+ZGlzcCkpCi0JICAgIGFkZF9maXggKCdsJywgJm9wUC0+ZGlzcCwgMCwgMCk7Ci0JICB0bXByZWcgPSBnZXRfbnVtICgmb3BQLT5kaXNwLCA4MCk7Ci0JICBhZGR3b3JkICh0bXByZWcgPj4gMTYpOwotCSAgYWRkd29yZCAodG1wcmVnICYgMHhGRkZGKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3UnOgotCSAgaW5zdGFsbF9vcGVyYW5kIChzWzFdLCBvcFAtPnJlZyAtIERBVEEwTCk7Ci0JICBvcFAtPnJlZyAtPSAoREFUQTBMKTsKLQkgIG9wUC0+cmVnICY9IDB4MEY7CS8qIHJlbW92ZSB1cHBlci9sb3dlciBiaXQgKi8KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0gIC8qIEJ5IHRoZSB0aW1lIHdoZSBnZXQgaGVyZSAoRklOQUxMWSkgdGhlX2lucyBjb250YWlucyB0aGUgY29tcGxldGUKLSAgICAgaW5zdHJ1Y3Rpb24sIHJlYWR5IHRvIGJlIGVtaXR0ZWQuIC4gLiAqLwotfQotCi1zdGF0aWMgaW50Ci1yZXZlcnNlXzE2X2JpdHMgKGluKQotICAgICBpbnQgaW47Ci17Ci0gIGludCBvdXQgPSAwOwotICBpbnQgbjsKLQotICBzdGF0aWMgaW50IG1hc2tbMTZdID0KLSAgewotICAgIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAotICAgIDB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCwgMHg4MDAwCi0gIH07Ci0gIGZvciAobiA9IDA7IG4gPCAxNjsgbisrKQotICAgIHsKLSAgICAgIGlmIChpbiAmIG1hc2tbbl0pCi0Jb3V0IHw9IG1hc2tbMTUgLSBuXTsKLSAgICB9Ci0gIHJldHVybiBvdXQ7Ci19CQkJCS8qIHJldmVyc2VfMTZfYml0cygpICovCi0KLXN0YXRpYyBpbnQKLXJldmVyc2VfOF9iaXRzIChpbikKLSAgICAgaW50IGluOwotewotICBpbnQgb3V0ID0gMDsKLSAgaW50IG47Ci0KLSAgc3RhdGljIGludCBtYXNrWzhdID0KLSAgewotICAgIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwgMHgwMDgwLAotICB9OwotCi0gIGZvciAobiA9IDA7IG4gPCA4OyBuKyspCi0gICAgewotICAgICAgaWYgKGluICYgbWFza1tuXSkKLQlvdXQgfD0gbWFza1s3IC0gbl07Ci0gICAgfQotICByZXR1cm4gb3V0OwotfQkJCQkvKiByZXZlcnNlXzhfYml0cygpICovCi0KLS8qIENhdXNlIGFuIGV4dHJhIGZyYWcgdG8gYmUgZ2VuZXJhdGVkIGhlcmUsIGluc2VydGluZyB1cCB0byAxMCBieXRlcwotICAgKHRoYXQgdmFsdWUgaXMgY2hvc2VuIGluIHRoZSBmcmFnX3ZhciBjYWxsIGluIG1kX2Fzc2VtYmxlKS4gIFRZUEUKLSAgIGlzIHRoZSBzdWJ0eXBlIG9mIHRoZSBmcmFnIHRvIGJlIGdlbmVyYXRlZDsgaXRzIHByaW1hcnkgdHlwZSBpcwotICAgcnNfbWFjaGluZV9kZXBlbmRlbnQuCi0KLSAgIFRoZSBUWVBFIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQgYnkgbWRfY29udmVydF9mcmFnXzEgYW5kCi0gICBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheC4gIFRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIGZpeHVwIHdpbGwKLSAgIGJlIGVtaXR0ZWQgYnkgbWRfY29udmVydF9mcmFnXzEuCi0KLSAgIEFERCBiZWNvbWVzIHRoZSBGUl9TWU1CT0wgZmllbGQgb2YgdGhlIGZyYWcsIGFuZCBPRkYgdGhlIEZSX09GRlNFVC4gICovCi1zdGF0aWMgdm9pZAotaW5zdGFsbF9vcGVyYW5kIChtb2RlLCB2YWwpCi0gICAgIGludCBtb2RlOwotICAgICBpbnQgdmFsOwotewotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgJ3MnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsICYgMHhGRjsJLyogSkYgRkYgaXMgZm9yIE0ga2x1ZGdlICovCi0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9IHZhbCA8PCA5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnMSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICcyJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCA2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnMyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc0JzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzJdIHw9IHZhbCA8PCAxMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzUnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMl0gfD0gdmFsIDw8IDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc2JzoKLSAgICAgIC8qIERBTkdFUiEgIFRoaXMgaXMgYSBoYWNrIHRvIGZvcmNlIGNhczJsIGFuZCBjYXMydyBjbWRzIHRvIGJlCi0JIHRocmVlIHdvcmRzIGxvbmchICovCi0gICAgICB0aGVfaW5zLm51bW8rKzsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzJdIHw9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJzcnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICc4JzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCAxMDsKLSAgICAgIGJyZWFrOwotI2lmbmRlZiBOT182ODg1MQotICAgIGNhc2UgJzknOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsIDw8IDU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSAndCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAodmFsIDw8IDEwKSB8ICh2YWwgPDwgNyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdEJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICh2YWwgPDwgMTIpIHwgdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWwgPSAweGZmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWwgPDwgOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0MnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnaic6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWw7Ci0gICAgICB0aGVfaW5zLm51bW8rKzsJCS8qIFdoYXQgYSBoYWNrICovCi0gICAgICBicmVhazsKLSAgICBjYXNlICdrJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9IHZhbCA8PCA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAndyc6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnbCc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdlJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzBdIHw9ICh2YWwgPDwgNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdMJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdID0gKHZhbCA+PiAxNik7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsyXSA9IHZhbCAmIDB4ZmZmZjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ20nOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKCh2YWwgJiAweDgpIDw8ICg2IC0gMykpOwotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKCh2YWwgJiAweDcpIDw8IDkpOwotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKCh2YWwgJiAweDEwKSA8PCAoNyAtIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ24nOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKCh2YWwgJiAweDgpIDw8ICg2IC0gMykpOwotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gKCh2YWwgJiAweDcpIDw8IDkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnbyc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSB2YWwgPDwgMTI7Ci0gICAgICB0aGVfaW5zLm9wY29kZVsxXSB8PSAoKHZhbCAmIDB4MTApIDw8ICg3IC0gNCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnTSc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAodmFsICYgMHhGKTsKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICgodmFsICYgMHgxMCkgPDwgKDYgLSA0KSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdOJzoKLSAgICAgIHRoZV9pbnMub3Bjb2RlWzFdIHw9ICh2YWwgJiAweEYpOwotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKCh2YWwgJiAweDEwKSA8PCAoNiAtIDQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2gnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMV0gfD0gKCh2YWwgIT0gMSkgPDwgMTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYyc6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLSAgICB9Ci19CQkJCS8qIGluc3RhbGxfb3BlcmFuZCgpICovCi0KLXN0YXRpYyB2b2lkCi1pbnN0YWxsX2dlbl9vcGVyYW5kIChtb2RlLCB2YWwpCi0gICAgIGludCBtb2RlOwotICAgICBpbnQgdmFsOwotewotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgJ3MnOgotICAgICAgdGhlX2lucy5vcGNvZGVbMF0gfD0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICAvKiBUaGlzIGlzIGEga2x1ZGdlISEhICovCi0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSAodmFsICYgMHgwNykgPDwgOSB8ICh2YWwgJiAweDM4KSA8PCAzOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAndyc6Ci0gICAgY2FzZSAnbCc6Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAncCc6Ci0gICAgICB0aGVfaW5zLm9wY29kZVswXSB8PSB2YWw7Ci0gICAgICBicmVhazsKLSAgICAgIC8qIG1vcmUgc3R1ZmYgZ29lcyBoZXJlICovCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJmYWlsZWQgc2FuaXR5IGNoZWNrLiIpKTsKLSAgICB9Ci19CQkJCS8qIGluc3RhbGxfZ2VuX29wZXJhbmQoKSAqLwotCi0vKgotICogdmVyaWZ5IHRoYXQgd2UgaGF2ZSBzb21lIG51bWJlciBvZiBwYXJlbiBwYWlycywgZG8gbTY4a19pcF9vcCgpLCBhbmQKLSAqIHRoZW4gZGVhbCB3aXRoIHRoZSBiaXRmaWVsZCBoYWNrLgotICovCi0KLXN0YXRpYyBjaGFyICoKLWNyYWNrX29wZXJhbmQgKHN0ciwgb3BQKQotICAgICByZWdpc3RlciBjaGFyICpzdHI7Ci0gICAgIHJlZ2lzdGVyIHN0cnVjdCBtNjhrX29wICpvcFA7Ci17Ci0gIHJlZ2lzdGVyIGludCBwYXJlbnM7Ci0gIHJlZ2lzdGVyIGludCBjOwotICByZWdpc3RlciBjaGFyICpiZWdfc3RyOwotICBpbnQgaW5xdW90ZSA9IDA7Ci0KLSAgaWYgKCFzdHIpCi0gICAgewotICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0gIGJlZ19zdHIgPSBzdHI7Ci0gIGZvciAocGFyZW5zID0gMDsgKnN0ciAmJiAocGFyZW5zID4gMCB8fCBpbnF1b3RlIHx8IG5vdGVuZCAoc3RyKSk7IHN0cisrKQotICAgIHsKLSAgICAgIGlmICghIGlucXVvdGUpCi0JewotCSAgaWYgKCpzdHIgPT0gJygnKQotCSAgICBwYXJlbnMrKzsKLQkgIGVsc2UgaWYgKCpzdHIgPT0gJyknKQotCSAgICB7Ci0JICAgICAgaWYgKCFwYXJlbnMpCi0JCXsJCQkvKiBFUlJPUiAqLwotCQkgIG9wUC0+ZXJyb3IgPSBfKCJFeHRyYSApIik7Ci0JCSAgcmV0dXJuIHN0cjsKLQkJfQotCSAgICAgIC0tcGFyZW5zOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGZsYWdfbXJpICYmICpzdHIgPT0gJ1wnJykKLQlpbnF1b3RlID0gISBpbnF1b3RlOwotICAgIH0KLSAgaWYgKCEqc3RyICYmIHBhcmVucykKLSAgICB7CQkJCS8qIEVSUk9SICovCi0gICAgICBvcFAtPmVycm9yID0gXygiTWlzc2luZyApIik7Ci0gICAgICByZXR1cm4gc3RyOwotICAgIH0KLSAgYyA9ICpzdHI7Ci0gICpzdHIgPSAnXDAnOwotICBpZiAobTY4a19pcF9vcCAoYmVnX3N0ciwgb3BQKSAhPSAwKQotICAgIHsKLSAgICAgICpzdHIgPSBjOwotICAgICAgcmV0dXJuIHN0cjsKLSAgICB9Ci0gICpzdHIgPSBjOwotICBpZiAoYyA9PSAnfScpCi0gICAgYyA9ICorK3N0cjsJCQkvKiBKRiBiaXRmaWVsZCBoYWNrICovCi0gIGlmIChjKQotICAgIHsKLSAgICAgIGMgPSAqKytzdHI7Ci0gICAgICBpZiAoIWMpCi0JYXNfYmFkIChfKCJNaXNzaW5nIG9wZXJhbmQiKSk7Ci0gICAgfQotCi0gIC8qIERldGVjdCBNUkkgUkVHIHN5bWJvbHMgYW5kIGNvbnZlcnQgdGhlbSB0byBSRUdMU1RzLiAgKi8KLSAgaWYgKG9wUC0+bW9kZSA9PSBDT05UUk9MICYmIChpbnQpb3BQLT5yZWcgPCAwKQotICAgIHsKLSAgICAgIG9wUC0+bW9kZSA9IFJFR0xTVDsKLSAgICAgIG9wUC0+bWFzayA9IH4oaW50KW9wUC0+cmVnOwotICAgICAgb3BQLT5yZWcgPSAwOwotICAgIH0KLQotICByZXR1cm4gc3RyOwotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICAgKi8KLQotc3RhdGljIHZvaWQKLWluc2VydF9yZWcgKHJlZ25hbWUsIHJlZ251bSkKLSAgICAgY29uc3QgY2hhciAqcmVnbmFtZTsKLSAgICAgaW50IHJlZ251bTsKLXsKLSAgY2hhciBidWZbMTAwXTsKLSAgaW50IGk7Ci0KLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgaWYgKCFmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCi0gICAgewotICAgICAgYnVmWzBdID0gUkVHSVNURVJfUFJFRklYOwotICAgICAgc3RyY3B5IChidWYgKyAxLCByZWduYW1lKTsKLSAgICAgIHJlZ25hbWUgPSBidWY7Ci0gICAgfQotI2VuZGlmCi0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAocmVnbmFtZSwgcmVnX3NlY3Rpb24sIHJlZ251bSwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLQotICBmb3IgKGkgPSAwOyByZWduYW1lW2ldOyBpKyspCi0gICAgYnVmW2ldID0gaXNsb3dlciAocmVnbmFtZVtpXSkgPyB0b3VwcGVyIChyZWduYW1lW2ldKSA6IHJlZ25hbWVbaV07Ci0gIGJ1ZltpXSA9ICdcMCc7Ci0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoYnVmLCByZWdfc2VjdGlvbiwgcmVnbnVtLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotfQotCi1zdHJ1Y3QgaW5pdF9lbnRyeQotICB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBpbnQgbnVtYmVyOwotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGluaXRfZW50cnkgaW5pdF90YWJsZVtdID0KLXsKLSAgeyAiZDAiLCBEQVRBMCB9LAotICB7ICJkMSIsIERBVEExIH0sCi0gIHsgImQyIiwgREFUQTIgfSwKLSAgeyAiZDMiLCBEQVRBMyB9LAotICB7ICJkNCIsIERBVEE0IH0sCi0gIHsgImQ1IiwgREFUQTUgfSwKLSAgeyAiZDYiLCBEQVRBNiB9LAotICB7ICJkNyIsIERBVEE3IH0sCi0gIHsgImEwIiwgQUREUjAgfSwKLSAgeyAiYTEiLCBBRERSMSB9LAotICB7ICJhMiIsIEFERFIyIH0sCi0gIHsgImEzIiwgQUREUjMgfSwKLSAgeyAiYTQiLCBBRERSNCB9LAotICB7ICJhNSIsIEFERFI1IH0sCi0gIHsgImE2IiwgQUREUjYgfSwKLSAgeyAiZnAiLCBBRERSNiB9LAotICB7ICJhNyIsIEFERFI3IH0sCi0gIHsgInNwIiwgQUREUjcgfSwKLSAgeyAic3NwIiwgQUREUjcgfSwKLSAgeyAiZnAwIiwgRlAwIH0sCi0gIHsgImZwMSIsIEZQMSB9LAotICB7ICJmcDIiLCBGUDIgfSwKLSAgeyAiZnAzIiwgRlAzIH0sCi0gIHsgImZwNCIsIEZQNCB9LAotICB7ICJmcDUiLCBGUDUgfSwKLSAgeyAiZnA2IiwgRlA2IH0sCi0gIHsgImZwNyIsIEZQNyB9LAotICB7ICJmcGkiLCBGUEkgfSwKLSAgeyAiZnBpYXIiLCBGUEkgfSwKLSAgeyAiZnBjIiwgRlBJIH0sCi0gIHsgImZwcyIsIEZQUyB9LAotICB7ICJmcHNyIiwgRlBTIH0sCi0gIHsgImZwYyIsIEZQQyB9LAotICB7ICJmcGNyIiwgRlBDIH0sCi0gIHsgImNvbnRyb2wiLCBGUEMgfSwKLSAgeyAic3RhdHVzIiwgRlBTIH0sCi0gIHsgImlhZGRyIiwgRlBJIH0sCi0KLSAgeyAiY29wMCIsIENPUDAgfSwKLSAgeyAiY29wMSIsIENPUDEgfSwKLSAgeyAiY29wMiIsIENPUDIgfSwKLSAgeyAiY29wMyIsIENPUDMgfSwKLSAgeyAiY29wNCIsIENPUDQgfSwKLSAgeyAiY29wNSIsIENPUDUgfSwKLSAgeyAiY29wNiIsIENPUDYgfSwKLSAgeyAiY29wNyIsIENPUDcgfSwKLSAgeyAicGMiLCBQQyB9LAotICB7ICJ6cGMiLCBaUEMgfSwKLSAgeyAic3IiLCBTUiB9LAotCi0gIHsgImNjciIsIENDUiB9LAotICB7ICJjYyIsIENDUiB9LAotCi0gIHsgImFjYyIsIEFDQyB9LAotICB7ICJtYWNzciIsIE1BQ1NSIH0sCi0gIHsgIm1hc2siLCBNQVNLIH0sCi0KLSAgLyogY29udHJvbCByZWdpc3RlcnMgKi8KLSAgeyAic2ZjIiwgU0ZDIH0sCQkvKiBTb3VyY2UgRnVuY3Rpb24gQ29kZSAqLwotICB7ICJzZmNyIiwgU0ZDIH0sCi0gIHsgImRmYyIsIERGQyB9LAkJLyogRGVzdGluYXRpb24gRnVuY3Rpb24gQ29kZSAqLwotICB7ICJkZmNyIiwgREZDIH0sCi0gIHsgImNhY3IiLCBDQUNSIH0sCQkvKiBDYWNoZSBDb250cm9sIFJlZ2lzdGVyICovCi0gIHsgImNhYXIiLCBDQUFSIH0sCQkvKiBDYWNoZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0KLSAgeyAidXNwIiwgVVNQIH0sCQkvKiBVc2VyIFN0YWNrIFBvaW50ZXIgKi8KLSAgeyAidmJyIiwgVkJSIH0sCQkvKiBWZWN0b3IgQmFzZSBSZWdpc3RlciAqLwotICB7ICJtc3AiLCBNU1AgfSwJCS8qIE1hc3RlciBTdGFjayBQb2ludGVyICovCi0gIHsgImlzcCIsIElTUCB9LAkJLyogSW50ZXJydXB0IFN0YWNrIFBvaW50ZXIgKi8KLQotICB7ICJpdHQwIiwgSVRUMCB9LAkJLyogSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gUmVnIDAgKi8KLSAgeyAiaXR0MSIsIElUVDEgfSwJCS8qIEluc3RydWN0aW9uIFRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIFJlZyAxICovCi0gIHsgImR0dDAiLCBEVFQwIH0sCQkvKiBEYXRhIFRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIFJlZ2lzdGVyIDAgKi8KLSAgeyAiZHR0MSIsIERUVDEgfSwJCS8qIERhdGEgVHJhbnNwYXJlbnQgVHJhbnNsYXRpb24gUmVnaXN0ZXIgMSAqLwotCi0gIC8qIDY4ZWMwNDAgdmVyc2lvbnMgb2Ygc2FtZSAqLwotICB7ICJpYWNyMCIsIElUVDAgfSwJCS8qIEluc3RydWN0aW9uIEFjY2VzcyBDb250cm9sIFJlZ2lzdGVyIDAgKi8KLSAgeyAiaWFjcjEiLCBJVFQxIH0sCQkvKiBJbnN0cnVjdGlvbiBBY2Nlc3MgQ29udHJvbCBSZWdpc3RlciAwICovCi0gIHsgImRhY3IwIiwgRFRUMCB9LAkJLyogRGF0YSBBY2Nlc3MgQ29udHJvbCBSZWdpc3RlciAwICovCi0gIHsgImRhY3IxIiwgRFRUMSB9LAkJLyogRGF0YSBBY2Nlc3MgQ29udHJvbCBSZWdpc3RlciAwICovCi0KLSAgLyogbWNmNTIwMCB2ZXJzaW9ucyBvZiBzYW1lLiAgVGhlIENvbGRGaXJlIHByb2dyYW1tZXIncyByZWZlcmVuY2UKLSAgICAgbWFudWFsIGluZGljYXRlZCB0aGF0IHRoZSBvcmRlciBpcyAyLDMsMCwxLCBidXQgS2VuIFJvc2UKLSAgICAgPHJvc2VAbmV0Y29tLmNvbT4gc2F5cyB0aGF0IDAsMSwyLDMgaXMgdGhlIGNvcnJlY3Qgb3JkZXIuICAqLwotICB7ICJhY3IwIiwgSVRUMCB9LAkJLyogQWNjZXNzIENvbnRyb2wgVW5pdCAwICovCi0gIHsgImFjcjEiLCBJVFQxIH0sCQkvKiBBY2Nlc3MgQ29udHJvbCBVbml0IDEgKi8KLSAgeyAiYWNyMiIsIERUVDAgfSwJCS8qIEFjY2VzcyBDb250cm9sIFVuaXQgMiAqLwotICB7ICJhY3IzIiwgRFRUMSB9LAkJLyogQWNjZXNzIENvbnRyb2wgVW5pdCAzICovCi0KLSAgeyAidGMiLCBUQyB9LAkJCS8qIE1NVSBUcmFuc2xhdGlvbiBDb250cm9sIFJlZ2lzdGVyICovCi0gIHsgInRjciIsIFRDIH0sCi0KLSAgeyAibW11c3IiLCBNTVVTUiB9LAkJLyogTU1VIFN0YXR1cyBSZWdpc3RlciAqLwotICB7ICJzcnAiLCBTUlAgfSwJCS8qIFVzZXIgUm9vdCBQb2ludGVyICovCi0gIHsgInVycCIsIFVSUCB9LAkJLyogU3VwZXJ2aXNvciBSb290IFBvaW50ZXIgKi8KLQotICB7ICJidXNjciIsIEJVU0NSIH0sCi0gIHsgInBjciIsIFBDUiB9LAotCi0gIHsgInJvbWJhciIsIFJPTUJBUiB9LAkJLyogUk9NIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLwotICB7ICJyYW1iYXIwIiwgUkFNQkFSMCB9LAkvKiBST00gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0gIHsgInJhbWJhcjEiLCBSQU1CQVIxIH0sCS8qIFJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSAgeyAibWJhciIsIE1CQVIgfSwJCS8qIE1vZHVsZSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSAgLyogZW5kIG9mIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0KLSAgeyAiYWMiLCBBQyB9LAotICB7ICJiYyIsIEJDIH0sCi0gIHsgImNhbCIsIENBTCB9LAotICB7ICJjcnAiLCBDUlAgfSwKLSAgeyAiZHJwIiwgRFJQIH0sCi0gIHsgInBjc3IiLCBQQ1NSIH0sCi0gIHsgInBzciIsIFBTUiB9LAotICB7ICJzY2MiLCBTQ0MgfSwKLSAgeyAidmFsIiwgVkFMIH0sCi0gIHsgImJhZDAiLCBCQUQwIH0sCi0gIHsgImJhZDEiLCBCQUQxIH0sCi0gIHsgImJhZDIiLCBCQUQyIH0sCi0gIHsgImJhZDMiLCBCQUQzIH0sCi0gIHsgImJhZDQiLCBCQUQ0IH0sCi0gIHsgImJhZDUiLCBCQUQ1IH0sCi0gIHsgImJhZDYiLCBCQUQ2IH0sCi0gIHsgImJhZDciLCBCQUQ3IH0sCi0gIHsgImJhYzAiLCBCQUMwIH0sCi0gIHsgImJhYzEiLCBCQUMxIH0sCi0gIHsgImJhYzIiLCBCQUMyIH0sCi0gIHsgImJhYzMiLCBCQUMzIH0sCi0gIHsgImJhYzQiLCBCQUM0IH0sCi0gIHsgImJhYzUiLCBCQUM1IH0sCi0gIHsgImJhYzYiLCBCQUM2IH0sCi0gIHsgImJhYzciLCBCQUM3IH0sCi0KLSAgeyAiaWMiLCBJQyB9LAotICB7ICJkYyIsIERDIH0sCi0gIHsgIm5jIiwgTkMgfSwKLQotICB7ICJ0dDAiLCBUVDAgfSwKLSAgeyAidHQxIiwgVFQxIH0sCi0gIC8qIDY4ZWMwMzAgdmVyc2lvbnMgb2Ygc2FtZSAqLwotICB7ICJhYzAiLCBUVDAgfSwKLSAgeyAiYWMxIiwgVFQxIH0sCi0gIC8qIDY4ZWMwMzAgYWNjZXNzIGNvbnRyb2wgdW5pdCwgaWRlbnRpY2FsIHRvIDAzMCBNTVUgc3RhdHVzIHJlZyAqLwotICB7ICJhY3VzciIsIFBTUiB9LAotCi0gIC8qIFN1cHByZXNzZWQgZGF0YSBhbmQgYWRkcmVzcyByZWdpc3RlcnMuICAqLwotICB7ICJ6ZDAiLCBaREFUQTAgfSwKLSAgeyAiemQxIiwgWkRBVEExIH0sCi0gIHsgInpkMiIsIFpEQVRBMiB9LAotICB7ICJ6ZDMiLCBaREFUQTMgfSwKLSAgeyAiemQ0IiwgWkRBVEE0IH0sCi0gIHsgInpkNSIsIFpEQVRBNSB9LAotICB7ICJ6ZDYiLCBaREFUQTYgfSwKLSAgeyAiemQ3IiwgWkRBVEE3IH0sCi0gIHsgInphMCIsIFpBRERSMCB9LAotICB7ICJ6YTEiLCBaQUREUjEgfSwKLSAgeyAiemEyIiwgWkFERFIyIH0sCi0gIHsgInphMyIsIFpBRERSMyB9LAotICB7ICJ6YTQiLCBaQUREUjQgfSwKLSAgeyAiemE1IiwgWkFERFI1IH0sCi0gIHsgInphNiIsIFpBRERSNiB9LAotICB7ICJ6YTciLCBaQUREUjcgfSwKLQotICAvKiBVcHBlciBhbmQgbG93ZXIgZGF0YSBhbmQgYWRkcmVzcyByZWdpc3RlcnMsIHVzZWQgYnkgbWFjdyBhbmQgbXNhY3cuICovCi0gIHsgImQwbCIsIERBVEEwTCB9LAotICB7ICJkMWwiLCBEQVRBMUwgfSwKLSAgeyAiZDJsIiwgREFUQTJMIH0sCi0gIHsgImQzbCIsIERBVEEzTCB9LAotICB7ICJkNGwiLCBEQVRBNEwgfSwKLSAgeyAiZDVsIiwgREFUQTVMIH0sCi0gIHsgImQ2bCIsIERBVEE2TCB9LAotICB7ICJkN2wiLCBEQVRBN0wgfSwKLQotICB7ICJhMGwiLCBBRERSMEwgfSwKLSAgeyAiYTFsIiwgQUREUjFMIH0sCi0gIHsgImEybCIsIEFERFIyTCB9LAotICB7ICJhM2wiLCBBRERSM0wgfSwKLSAgeyAiYTRsIiwgQUREUjRMIH0sCi0gIHsgImE1bCIsIEFERFI1TCB9LAotICB7ICJhNmwiLCBBRERSNkwgfSwKLSAgeyAiYTdsIiwgQUREUjdMIH0sCi0KLSAgeyAiZDB1IiwgREFUQTBVIH0sCi0gIHsgImQxdSIsIERBVEExVSB9LAotICB7ICJkMnUiLCBEQVRBMlUgfSwKLSAgeyAiZDN1IiwgREFUQTNVIH0sCi0gIHsgImQ0dSIsIERBVEE0VSB9LAotICB7ICJkNXUiLCBEQVRBNVUgfSwKLSAgeyAiZDZ1IiwgREFUQTZVIH0sCi0gIHsgImQ3dSIsIERBVEE3VSB9LAotCi0gIHsgImEwdSIsIEFERFIwVSB9LAotICB7ICJhMXUiLCBBRERSMVUgfSwKLSAgeyAiYTJ1IiwgQUREUjJVIH0sCi0gIHsgImEzdSIsIEFERFIzVSB9LAotICB7ICJhNHUiLCBBRERSNFUgfSwKLSAgeyAiYTV1IiwgQUREUjVVIH0sCi0gIHsgImE2dSIsIEFERFI2VSB9LAotICB7ICJhN3UiLCBBRERSN1UgfSwKLQotICB7IDAsIDAgfQotfTsKLQotc3RhdGljIHZvaWQKLWluaXRfcmVndGFibGUgKCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGluaXRfdGFibGVbaV0ubmFtZTsgaSsrKQotICAgIGluc2VydF9yZWcgKGluaXRfdGFibGVbaV0ubmFtZSwgaW5pdF90YWJsZVtpXS5udW1iZXIpOwotfQotCi1zdGF0aWMgaW50IG5vXzY4ODUxLCBub182ODg4MTsKLQotI2lmZGVmIE9CSl9BT1VUCi0vKiBhLm91dCBtYWNoaW5lIHR5cGUuICBEZWZhdWx0IHRvIDY4MDIwLiAgKi8KLWludCBtNjhrX2FvdXRfbWFjaHR5cGUgPSAyOwotI2VuZGlmCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY29uc3QgY2hhciAqZXI7Ci0gIHNob3J0ICpmcm9tUDsKLSAgY2hhciAqdG9QID0gTlVMTDsKLSAgaW50IG0sIG4gPSAwOwotICBjaGFyICp0b19iZWdfUDsKLSAgaW50IHNob3J0c190aGlzX2ZyYWc7Ci0gIGZpeFMgKmZpeFA7Ci0KLSAgLyogSW4gTVJJIG1vZGUsIHRoZSBpbnN0cnVjdGlvbiBhbmQgb3BlcmFuZHMgYXJlIHNlcGFyYXRlZCBieSBhCi0gICAgIHNwYWNlLiAgQW55dGhpbmcgZm9sbG93aW5nIHRoZSBvcGVyYW5kcyBpcyBhIGNvbW1lbnQuICBUaGUgbGFiZWwKLSAgICAgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkLiAgKi8KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBpbnQgZmllbGRzID0gMDsKLSAgICAgIGludCBpbmZpZWxkID0gMDsKLSAgICAgIGludCBpbnF1b3RlID0gMDsKLQotICAgICAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnOyBzKyspCi0JewotCSAgaWYgKCgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykgJiYgISBpbnF1b3RlKQotCSAgICB7Ci0JICAgICAgaWYgKGluZmllbGQpCi0JCXsKLQkJICArK2ZpZWxkczsKLQkJICBpZiAoZmllbGRzID49IDIpCi0JCSAgICB7Ci0JCSAgICAgICpzID0gJ1wwJzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgaW5maWVsZCA9IDA7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgaW5maWVsZCkKLQkJaW5maWVsZCA9IDE7Ci0JICAgICAgaWYgKCpzID09ICdcJycpCi0JCWlucXVvdGUgPSAhIGlucXVvdGU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIG1lbXNldCAoKGNoYXIgKikgKCZ0aGVfaW5zKSwgJ1wwJywgc2l6ZW9mICh0aGVfaW5zKSk7Ci0gIG02OGtfaXAgKHN0cik7Ci0gIGVyID0gdGhlX2lucy5lcnJvcjsKLSAgaWYgKCFlcikKLSAgICB7Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgdGhlX2lucy5udW1hcmdzOyBuKyspCi0JaWYgKHRoZV9pbnMub3BlcmFuZHNbbl0uZXJyb3IpCi0JICB7Ci0JICAgIGVyID0gdGhlX2lucy5vcGVyYW5kc1tuXS5lcnJvcjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgfQotICBpZiAoZXIpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIlcyAtLSBzdGF0ZW1lbnQgYCVzJyBpZ25vcmVkIiksIGVyLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJZiB0aGVyZSBpcyBhIGN1cnJlbnQgbGFiZWwsIHJlY29yZCB0aGF0IGl0IG1hcmtzIGFuIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKGN1cnJlbnRfbGFiZWwgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjdXJyZW50X2xhYmVsLT50ZXh0ID0gMTsKLSAgICAgIGN1cnJlbnRfbGFiZWwgPSBOVUxMOwotICAgIH0KLQotICBpZiAodGhlX2lucy5uZnJhZyA9PSAwKQotICAgIHsKLSAgICAgIC8qIE5vIGZyYWcgaGFja2luZyBpbnZvbHZlZDsganVzdCBwdXQgaXQgb3V0ICovCi0gICAgICB0b1AgPSBmcmFnX21vcmUgKDIgKiB0aGVfaW5zLm51bW8pOwotICAgICAgZnJvbVAgPSAmdGhlX2lucy5vcGNvZGVbMF07Ci0gICAgICBmb3IgKG0gPSB0aGVfaW5zLm51bW87IG07IC0tbSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgKGxvbmcpICgqZnJvbVApLCAyKTsKLQkgIHRvUCArPSAyOwotCSAgZnJvbVArKzsKLQl9Ci0gICAgICAvKiBwdXQgb3V0IHN5bWJvbC1kZXBlbmRlbnQgaW5mbyAqLwotICAgICAgZm9yIChtID0gMDsgbSA8IHRoZV9pbnMubnJlbDsgbSsrKQotCXsKLQkgIHN3aXRjaCAodGhlX2lucy5yZWxvY1ttXS53aWQpCi0JICAgIHsKLQkgICAgY2FzZSAnQic6Ci0JICAgICAgbiA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2InOgotCSAgICAgIG4gPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICczJzoKLQkgICAgICBuID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAndyc6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICAgIG4gPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdsJzoKLQkgICAgICBuID0gNDsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiRG9uJ3Qga25vdyBob3cgdG8gZmlndXJlIHdpZHRoIG9mICVjIGluIG1kX2Fzc2VtYmxlKCkiKSwKLQkJCXRoZV9pbnMucmVsb2NbbV0ud2lkKTsKLQkgICAgfQotCi0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAgICAgKCh0b1AgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCkKLQkJCSAgICAgICAtIHRoZV9pbnMubnVtbyAqIDIgKyB0aGVfaW5zLnJlbG9jW21dLm4pLAotCQkJICAgICAgbiwKLQkJCSAgICAgICZ0aGVfaW5zLnJlbG9jW21dLmV4cCwKLQkJCSAgICAgIHRoZV9pbnMucmVsb2NbbV0ucGNyZWwsCi0JCQkgICAgICBnZXRfcmVsb2NfY29kZSAobiwgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCQkJICAgICAgdGhlX2lucy5yZWxvY1ttXS5waWNfcmVsb2MpKTsKLQkgIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IHRoZV9pbnMucmVsb2NbbV0ucGNyZWxfZml4OwotCSAgaWYgKHRoZV9pbnMucmVsb2NbbV0ud2lkID09ICdCJykKLQkgICAgZml4UC0+Znhfc2lnbmVkID0gMTsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZXJlJ3Mgc29tZSBmcmFnIGhhY2tpbmcgKi8KLSAgZm9yIChuID0gMCwgZnJvbVAgPSAmdGhlX2lucy5vcGNvZGVbMF07IG4gPCB0aGVfaW5zLm5mcmFnOyBuKyspCi0gICAgewotICAgICAgaW50IHdpZDsKLQotICAgICAgaWYgKG4gPT0gMCkKLQl3aWQgPSAyICogdGhlX2lucy5mcmFnYltuXS5mcmFnb2ZmOwotICAgICAgZWxzZQotCXdpZCA9IDIgKiAodGhlX2lucy5udW1vIC0gdGhlX2lucy5mcmFnYltuIC0gMV0uZnJhZ29mZik7Ci0gICAgICB0b1AgPSBmcmFnX21vcmUgKHdpZCk7Ci0gICAgICB0b19iZWdfUCA9IHRvUDsKLSAgICAgIHNob3J0c190aGlzX2ZyYWcgPSAwOwotICAgICAgZm9yIChtID0gd2lkIC8gMjsgbTsgLS1tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAodG9QLCAobG9uZykgKCpmcm9tUCksIDIpOwotCSAgdG9QICs9IDI7Ci0JICBmcm9tUCsrOwotCSAgc2hvcnRzX3RoaXNfZnJhZysrOwotCX0KLSAgICAgIGZvciAobSA9IDA7IG0gPCB0aGVfaW5zLm5yZWw7IG0rKykKLQl7Ci0JICBpZiAoKHRoZV9pbnMucmVsb2NbbV0ubikgPj0gMiAqIHNob3J0c190aGlzX2ZyYWcpCi0JICAgIHsKLQkgICAgICB0aGVfaW5zLnJlbG9jW21dLm4gLT0gMiAqIHNob3J0c190aGlzX2ZyYWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHdpZCA9IHRoZV9pbnMucmVsb2NbbV0ud2lkOwotCSAgaWYgKHdpZCA9PSAwKQotCSAgICBjb250aW51ZTsKLQkgIHRoZV9pbnMucmVsb2NbbV0ud2lkID0gMDsKLQkgIHdpZCA9ICh3aWQgPT0gJ2InKSA/IDEgOiAod2lkID09ICd3JykgPyAyIDogKHdpZCA9PSAnbCcpID8gNCA6IDQwMDA7Ci0KLQkgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCQkgICAgICAoKHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKQotCQkJICAgICAgIC0gdGhlX2lucy5udW1vICogMiArIHRoZV9pbnMucmVsb2NbbV0ubiksCi0JCQkgICAgICB3aWQsCi0JCQkgICAgICAmdGhlX2lucy5yZWxvY1ttXS5leHAsCi0JCQkgICAgICB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJICAgICAgZ2V0X3JlbG9jX2NvZGUgKHdpZCwgdGhlX2lucy5yZWxvY1ttXS5wY3JlbCwKLQkJCQkJICAgICAgdGhlX2lucy5yZWxvY1ttXS5waWNfcmVsb2MpKTsKLQkgIGZpeFAtPmZ4X3BjcmVsX2FkanVzdCA9IHRoZV9pbnMucmVsb2NbbV0ucGNyZWxfZml4OwotCX0KLSAgICAgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEwLCAwLAotCQkgICAgICAgKHJlbGF4X3N1YnN0YXRlVCkgKHRoZV9pbnMuZnJhZ2Jbbl0uZnJhZ3R5KSwKLQkJICAgICAgIHRoZV9pbnMuZnJhZ2Jbbl0uZmFkZCwgdGhlX2lucy5mcmFnYltuXS5mb2ZmLCB0b19iZWdfUCk7Ci0gICAgfQotICBuID0gKHRoZV9pbnMubnVtbyAtIHRoZV9pbnMuZnJhZ2JbbiAtIDFdLmZyYWdvZmYpOwotICBzaG9ydHNfdGhpc19mcmFnID0gMDsKLSAgaWYgKG4pCi0gICAgewotICAgICAgdG9QID0gZnJhZ19tb3JlIChuICogc2l6ZW9mIChzaG9ydCkpOwotICAgICAgd2hpbGUgKG4tLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHRvUCwgKGxvbmcpICgqZnJvbVApLCAyKTsKLQkgIHRvUCArPSAyOwotCSAgZnJvbVArKzsKLQkgIHNob3J0c190aGlzX2ZyYWcrKzsKLQl9Ci0gICAgfQotICBmb3IgKG0gPSAwOyBtIDwgdGhlX2lucy5ucmVsOyBtKyspCi0gICAgewotICAgICAgaW50IHdpZDsKLQotICAgICAgd2lkID0gdGhlX2lucy5yZWxvY1ttXS53aWQ7Ci0gICAgICBpZiAod2lkID09IDApCi0JY29udGludWU7Ci0gICAgICB0aGVfaW5zLnJlbG9jW21dLndpZCA9IDA7Ci0gICAgICB3aWQgPSAod2lkID09ICdiJykgPyAxIDogKHdpZCA9PSAndycpID8gMiA6ICh3aWQgPT0gJ2wnKSA/IDQgOiA0MDAwOwotCi0gICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LAotCQkJICAoKHRoZV9pbnMucmVsb2NbbV0ubiArIHRvUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKQotCQkJICAgLSBzaG9ydHNfdGhpc19mcmFnICogMiksCi0JCQkgIHdpZCwKLQkJCSAgJnRoZV9pbnMucmVsb2NbbV0uZXhwLAotCQkJICB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJICBnZXRfcmVsb2NfY29kZSAod2lkLCB0aGVfaW5zLnJlbG9jW21dLnBjcmVsLAotCQkJCQkgIHRoZV9pbnMucmVsb2NbbV0ucGljX3JlbG9jKSk7Ci0gICAgICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSB0aGVfaW5zLnJlbG9jW21dLnBjcmVsX2ZpeDsKLSAgICB9Ci19Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIC8qCi0gICAqIG1kX2JlZ2luIC0tIHNldCB1cCBoYXNoIHRhYmxlcyB3aXRoIDY4MDAwIGluc3RydWN0aW9ucy4KLSAgICogc2ltaWxhciB0byB3aGF0IHRoZSB2YXggYXNzZW1ibGVyIGRvZXMuICAtLS1waHIKLSAgICovCi0gIC8qIFJNUyBjbGFpbXMgdGhlIHRoaW5nIHRvIGRvIGlzIHRha2UgdGhlIG02OGstb3Bjb2RlLmggdGFibGUsIGFuZCBtYWtlCi0gICAgIGEgY29weSBvZiBpdCBhdCBydW50aW1lLCBhZGRpbmcgaW4gdGhlIGluZm9ybWF0aW9uIHdlIHdhbnQgYnV0IGlzbid0Ci0gICAgIHRoZXJlLiAgSSB0aGluayBpdCdkIGJlIGJldHRlciB0byBoYXZlIGFuIGF3ayBzY3JpcHQgaGFjayB0aGUgdGFibGUKLSAgICAgYXQgY29tcGlsZSB0aW1lLiAgT3IgZXZlbiBqdXN0IHhzdHIgdGhlIHRhYmxlIGFuZCB1c2UgaXQgYXMtaXMuICBCdXQKLSAgICAgbXkgbG9yZCBnaG9kIGhhdGggc3Bva2VuLCBzbyB3ZSBkbyBpdCB0aGlzIHdheS4gIEV4Y3VzZSB0aGUgdWdseSB2YXIKLSAgICAgbmFtZXMuICAqLwotCi0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqaW5zOwotICByZWdpc3RlciBzdHJ1Y3QgbTY4a19pbmNhbnQgKmhhY2ssICpzbGFrOwotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSAwOwkvKiBlbXB0eSBzdHJpbmcsIG9yIGVycm9yIG1zZyB0ZXh0ICovCi0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBpOwotICByZWdpc3RlciBjaGFyIGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IDE7Ci0gICAgICBtNjhrX2Fic3BjYWRkID0gMTsKLSAgICAgIGlmICghIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lKQotCW02OGtfcmVsMzIgPSAwOwotICAgIH0KLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgb2JzdGFja19iZWdpbiAoJnJvYnluLCA0MDAwKTsKLSAgZm9yIChpID0gMDsgaSA8IG02OGtfbnVtb3Bjb2RlczsgaSsrKQotICAgIHsKLSAgICAgIGhhY2sgPSBzbGFrID0gKHN0cnVjdCBtNjhrX2luY2FudCAqKSBvYnN0YWNrX2FsbG9jICgmcm9ieW4sIHNpemVvZiAoc3RydWN0IG02OGtfaW5jYW50KSk7Ci0gICAgICBkbwotCXsKLQkgIGlucyA9ICZtNjhrX29wY29kZXNbaV07Ci0JICAvKiBXZSAqY291bGQqIGlnbm9yZSBpbnNucyB0aGF0IGRvbid0IG1hdGNoIG91ciBhcmNoIGhlcmUKLQkgICAgIGJ1dCBqdXN0IGxlYXZpbmcgdGhlbSBvdXQgb2YgdGhlIGhhc2guICovCi0JICBzbGFrLT5tX29wZXJhbmRzID0gaW5zLT5hcmdzOwotCSAgc2xhay0+bV9vcG51bSA9IHN0cmxlbiAoc2xhay0+bV9vcGVyYW5kcykgLyAyOwotCSAgc2xhay0+bV9hcmNoID0gaW5zLT5hcmNoOwotCSAgc2xhay0+bV9vcGNvZGUgPSBpbnMtPm9wY29kZTsKLQkgIC8qIFRoaXMgaXMga2x1ZGdleSAqLwotCSAgc2xhay0+bV9jb2RlbnVtID0gKChpbnMtPm1hdGNoKSAmIDB4ZmZmZkwpID8gMiA6IDE7Ci0JICBpZiAoaSArIDEgIT0gbTY4a19udW1vcGNvZGVzCi0JICAgICAgJiYgIXN0cmNtcCAoaW5zLT5uYW1lLCBtNjhrX29wY29kZXNbaSArIDFdLm5hbWUpKQotCSAgICB7Ci0JICAgICAgc2xhay0+bV9uZXh0ID0gKHN0cnVjdCBtNjhrX2luY2FudCAqKSBvYnN0YWNrX2FsbG9jICgmcm9ieW4sIHNpemVvZiAoc3RydWN0IG02OGtfaW5jYW50KSk7Ci0JICAgICAgaSsrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHNsYWstPm1fbmV4dCA9IDA7Ci0JICBzbGFrID0gc2xhay0+bV9uZXh0OwotCX0KLSAgICAgIHdoaWxlIChzbGFrKTsKLQotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIGlucy0+bmFtZSwgKGNoYXIgKikgaGFjayk7Ci0gICAgICBpZiAocmV0dmFsKQotCWFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogIENhbid0IGhhc2ggJXM6ICVzIiksIGlucy0+bmFtZSwgcmV0dmFsKTsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG02OGtfbnVtYWxpYXNlczsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtNjhrX29wY29kZV9hbGlhc2VzW2ldLnByaW1hcnk7Ci0gICAgICBjb25zdCBjaGFyICphbGlhcyA9IG02OGtfb3Bjb2RlX2FsaWFzZXNbaV0uYWxpYXM7Ci0gICAgICBQVFIgdmFsID0gaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLSAgICAgIGlmICghdmFsKQotCWFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgZmluZCAlcyBpbiBoYXNoIHRhYmxlIiksIG5hbWUpOwotICAgICAgcmV0dmFsID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIGFsaWFzLCB2YWwpOwotICAgICAgaWYgKHJldHZhbCkKLQlhc19mYXRhbCAoXygiSW50ZXJuYWwgRXJyb3I6IENhbid0IGhhc2ggJXM6ICVzIiksIGFsaWFzLCByZXR2YWwpOwotICAgIH0KLQotICAvKiBJbiBNUkkgbW9kZSwgYWxsIHVuc2l6ZWQgYnJhbmNoZXMgYXJlIHZhcmlhYmxlIHNpemVkLiAgTm9ybWFsbHksCi0gICAgIHRoZXkgYXJlIHdvcmQgc2l6ZWQuICAqLwotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgc3RhdGljIHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyBtcmlfYWxpYXNlc1tdID0KLQl7Ci0JICB7ICJiaGkiLAkiamhpIiwgfSwKLQkgIHsgImJscyIsCSJqbHMiLCB9LAotCSAgeyAiYmNjIiwJImpjYyIsIH0sCi0JICB7ICJiY3MiLAkiamNzIiwgfSwKLQkgIHsgImJuZSIsCSJqbmUiLCB9LAotCSAgeyAiYmVxIiwJImplcSIsIH0sCi0JICB7ICJidmMiLAkianZjIiwgfSwKLQkgIHsgImJ2cyIsCSJqdnMiLCB9LAotCSAgeyAiYnBsIiwJImpwbCIsIH0sCi0JICB7ICJibWkiLAkiam1pIiwgfSwKLQkgIHsgImJnZSIsCSJqZ2UiLCB9LAotCSAgeyAiYmx0IiwJImpsdCIsIH0sCi0JICB7ICJiZ3QiLAkiamd0IiwgfSwKLQkgIHsgImJsZSIsCSJqbGUiLCB9LAotCSAgeyAiYnJhIiwJImpyYSIsIH0sCi0JICB7ICJic3IiLAkiamJzciIsIH0sCi0JfTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiBtcmlfYWxpYXNlcyAvIHNpemVvZiBtcmlfYWxpYXNlc1swXTsgaSsrKQotCXsKLQkgIGNvbnN0IGNoYXIgKm5hbWUgPSBtcmlfYWxpYXNlc1tpXS5wcmltYXJ5OwotCSAgY29uc3QgY2hhciAqYWxpYXMgPSBtcmlfYWxpYXNlc1tpXS5hbGlhczsKLQkgIFBUUiB2YWwgPSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG5hbWUpOwotCSAgaWYgKCF2YWwpCi0JICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgZmluZCAlcyBpbiBoYXNoIHRhYmxlIiksIG5hbWUpOwotCSAgcmV0dmFsID0gaGFzaF9qYW0gKG9wX2hhc2gsIGFsaWFzLCB2YWwpOwotCSAgaWYgKHJldHZhbCkKLQkgICAgYXNfZmF0YWwgKF8oIkludGVybmFsIEVycm9yOiBDYW4ndCBoYXNoICVzOiAlcyIpLCBhbGlhcywgcmV0dmFsKTsKLQl9Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG1rbG93ZXJfdGFibGUpOyBpKyspCi0gICAgbWtsb3dlcl90YWJsZVtpXSA9IChpc3VwcGVyIChjID0gKGNoYXIpIGkpKSA/IHRvbG93ZXIgKGMpIDogYzsKLQotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChub3RlbmRfdGFibGUpOyBpKyspCi0gICAgewotICAgICAgbm90ZW5kX3RhYmxlW2ldID0gMDsKLSAgICAgIGFsdF9ub3RlbmRfdGFibGVbaV0gPSAwOwotICAgIH0KLSAgbm90ZW5kX3RhYmxlWycsJ10gPSAxOwotICBub3RlbmRfdGFibGVbJ3snXSA9IDE7Ci0gIG5vdGVuZF90YWJsZVsnfSddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnYSddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnQSddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnZCddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnRCddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnIyddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnJiddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnZiddID0gMTsKLSAgYWx0X25vdGVuZF90YWJsZVsnRiddID0gMTsKLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLSAgYWx0X25vdGVuZF90YWJsZVtSRUdJU1RFUl9QUkVGSVhdID0gMTsKLSNlbmRpZgotCi0gIC8qIFdlIG5lZWQgdG8gcHV0ICcoJyBpbiBhbHRfbm90ZW5kX3RhYmxlIHRvIGhhbmRsZQotICAgICAgIGNhczIgJWQwOiVkMiwlZDM6JWQ0LCglYTApOiglYTEpCi0gICAgICovCi0gIGFsdF9ub3RlbmRfdGFibGVbJygnXSA9IDE7Ci0KLSAgLyogV2UgbmVlZCB0byBwdXQgJ0AnIGluIGFsdF9ub3RlbmRfdGFibGUgdG8gaGFuZGxlCi0gICAgICAgY2FzMiAlZDA6JWQyLCVkMzolZDQsQCglZDApOkAoJWQxKQotICAgICAqLwotICBhbHRfbm90ZW5kX3RhYmxlWydAJ10gPSAxOwotCi0gIC8qIFdlIG5lZWQgdG8gcHV0IGRpZ2l0cyBpbiBhbHRfbm90ZW5kX3RhYmxlIHRvIGhhbmRsZQotICAgICAgIGJmZXh0dSAlZDB7MjQ6MX0sJWQwCi0gICAgICovCi0gIGFsdF9ub3RlbmRfdGFibGVbJzAnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzEnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzInXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzMnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzQnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzUnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzYnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzcnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzgnXSA9IDE7Ci0gIGFsdF9ub3RlbmRfdGFibGVbJzknXSA9IDE7Ci0KLSNpZm5kZWYgTUlUX1NZTlRBWF9PTkxZCi0gIC8qIEluc2VydCBwc2V1ZG8gb3BzLCB0aGVzZSBoYXZlIHRvIGdvIGludG8gdGhlIG9wY29kZSB0YWJsZSBzaW5jZQotICAgICBnYXMgZXhwZWN0cyBwc2V1ZG8gb3BzIHRvIHN0YXJ0IHdpdGggYSBkb3QgKi8KLSAgewotICAgIGludCBuID0gMDsKLSAgICB3aGlsZSAobW90ZV9wc2V1ZG9fdGFibGVbbl0ucG9jX25hbWUpCi0gICAgICB7Ci0JaGFjayA9IChzdHJ1Y3QgbTY4a19pbmNhbnQgKikKLQkgIG9ic3RhY2tfYWxsb2MgKCZyb2J5biwgc2l6ZW9mIChzdHJ1Y3QgbTY4a19pbmNhbnQpKTsKLQloYXNoX2luc2VydCAob3BfaGFzaCwKLQkJICAgICBtb3RlX3BzZXVkb190YWJsZVtuXS5wb2NfbmFtZSwgKGNoYXIgKikgaGFjayk7Ci0JaGFjay0+bV9vcGVyYW5kcyA9IDA7Ci0JaGFjay0+bV9vcG51bSA9IG47Ci0JbisrOwotICAgICAgfQotICB9Ci0jZW5kaWYKLQotICBpbml0X3JlZ3RhYmxlICgpOwotCi0jaWZkZWYgT0JKX0VMRgotICByZWNvcmRfYWxpZ25tZW50ICh0ZXh0X3NlY3Rpb24sIDIpOwotICByZWNvcmRfYWxpZ25tZW50IChkYXRhX3NlY3Rpb24sIDIpOwotICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgMik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXNlbGVjdF9jb250cm9sX3JlZ3MgKCkKLXsKLSAgLyogTm90ZSB3aGljaCBzZXQgb2YgIm1vdmVjIiBjb250cm9sIHJlZ2lzdGVycyBpcyBhdmFpbGFibGUuICAqLwotICBzd2l0Y2ggKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0gICAgewotICAgIGNhc2UgbTY4MDAwOgotICAgICAgY29udHJvbF9yZWdzID0gbTY4MDAwX2NvbnRyb2xfcmVnczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbTY4MDEwOgotICAgICAgY29udHJvbF9yZWdzID0gbTY4MDEwX2NvbnRyb2xfcmVnczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbTY4MDIwOgotICAgIGNhc2UgbTY4MDMwOgotICAgICAgY29udHJvbF9yZWdzID0gbTY4MDIwX2NvbnRyb2xfcmVnczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbTY4MDQwOgotICAgICAgY29udHJvbF9yZWdzID0gbTY4MDQwX2NvbnRyb2xfcmVnczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbTY4MDYwOgotICAgICAgY29udHJvbF9yZWdzID0gbTY4MDYwX2NvbnRyb2xfcmVnczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgY3B1MzI6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBjcHUzMl9jb250cm9sX3JlZ3M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIG1jZjUyMDA6Ci0gICAgY2FzZSBtY2Y1MjA2ZToKLSAgICBjYXNlIG1jZjUzMDc6Ci0gICAgICBjb250cm9sX3JlZ3MgPSBtY2ZfY29udHJvbF9yZWdzOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotdm9pZAotbTY4a19pbml0X2FmdGVyX2FyZ3MgKCkKLXsKLSAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLSAgICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfY3B1ID0gVEFSR0VUX0NQVTsKLQotICAgICAgaWYgKCpkZWZhdWx0X2NwdSA9PSAnbScpCi0JZGVmYXVsdF9jcHUrKzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2FyY2hzOyBpKyspCi0JaWYgKHN0cmNhc2VjbXAgKGRlZmF1bHRfY3B1LCBhcmNoc1tpXS5uYW1lKSA9PSAwKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoaSA9PSBuX2FyY2hzKQotCXsKLQkgIGFzX2JhZCAoXygidW5yZWNvZ25pemVkIGRlZmF1bHQgY3B1IGAlcycgPz8/IiksIFRBUkdFVF9DUFUpOwotCSAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4MDIwOwotCX0KLSAgICAgIGVsc2UKLQljdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBhcmNoc1tpXS5hcmNoOwotICAgIH0KLSAgLyogUGVybWl0IG02ODg4MSBzcGVjaWZpY2F0aW9uIHdpdGggYWxsIGNwdXM7IHRob3NlIHRoYXQgY2FuJ3Qgd29yawotICAgICB3aXRoIGEgY29wcm9jZXNzb3IgY291bGQgYmUgZG9pbmcgZW11bGF0aW9uLiAgKi8KLSAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4ODUxKQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSAmIG02ODA0MCkKLQl7Ci0JICBhc193YXJuIChfKCI2ODA0MCBhbmQgNjg4NTEgc3BlY2lmaWVkOyBtbXUgaW5zdHJ1Y3Rpb25zIG1heSBhc3NlbWJsZSBpbmNvcnJlY3RseSIpKTsKLQl9Ci0gICAgfQotICAvKiBXaGF0IG90aGVyIGluY29tcGF0aWJpbGl0aWVzIGNvdWxkIHdlIGNoZWNrIGZvcj8gICovCi0KLSAgLyogVG9zcyBpbiBzb21lIGRlZmF1bHQgYXNzdW1wdGlvbnMgYWJvdXQgY29wcm9jZXNzb3JzLiAgKi8KLSAgaWYgKCFub182ODg4MQotICAgICAgJiYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkKLQkgIC8qIENhbiBDUFUzMiBoYXZlIGEgNjg4ODEgY29wcm9jZXNzb3I/PyAgKi8KLQkgICYgKG02ODAyMCB8IG02ODAzMCB8IGNwdTMyKSkpCi0gICAgewotICAgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOwotICAgIH0KLSAgaWYgKCFub182ODg1MQotICAgICAgJiYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgJiBtNjgwMjB1cCkgIT0gMAotICAgICAgJiYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgJiBtNjgwNDB1cCkgPT0gMCkKLSAgICB7Ci0gICAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4NTE7Ci0gICAgfQotICBpZiAobm9fNjg4ODEgJiYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4ODgxKSkKLSAgICBhc19iYWQgKF8oIm9wdGlvbnMgZm9yIDY4ODgxIGFuZCBuby02ODg4MSBib3RoIGdpdmVuIikpOwotICBpZiAobm9fNjg4NTEgJiYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4ODUxKSkKLSAgICBhc19iYWQgKF8oIm9wdGlvbnMgZm9yIDY4ODUxIGFuZCBuby02ODg1MSBib3RoIGdpdmVuIikpOwotCi0jaWZkZWYgT0JKX0FPVVQKLSAgLyogV29yayBvdXQgdGhlIG1hZ2ljIG51bWJlci4gIFRoaXMgaXNuJ3QgdmVyeSBnZW5lcmFsLiAgKi8KLSAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4MDAwKQotICAgIG02OGtfYW91dF9tYWNodHlwZSA9IDA7Ci0gIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4MDEwKQotICAgIG02OGtfYW91dF9tYWNodHlwZSA9IDE7Ci0gIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlICYgbTY4MDIwKQotICAgIG02OGtfYW91dF9tYWNodHlwZSA9IDI7Ci0gIGVsc2UKLSAgICBtNjhrX2FvdXRfbWFjaHR5cGUgPSAyOwotI2VuZGlmCi0KLSAgLyogTm90ZSB3aGljaCBzZXQgb2YgIm1vdmVjIiBjb250cm9sIHJlZ2lzdGVycyBpcyBhdmFpbGFibGUuICAqLwotICBzZWxlY3RfY29udHJvbF9yZWdzICgpOwotCi0gIGlmIChjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0gICAgICB8fCBhcmNoX2NvbGRmaXJlX3AgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLSAgICBtZF9yZWxheF90YWJsZVtUQUIgKFBDSU5ERVgsIEJZVEUpXS5ybHhfbW9yZSA9IDA7Ci19Ci0MCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgbGFiZWwgaXMgZGVmaW5lZC4gICovCi0KLXZvaWQKLW02OGtfZnJvYl9sYWJlbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN0cnVjdCBsYWJlbF9saW5lICpuOwotCi0gIG4gPSAoc3RydWN0IGxhYmVsX2xpbmUgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLSAgbi0+bmV4dCA9IGxhYmVsczsKLSAgbi0+bGFiZWwgPSBzeW07Ci0gIGFzX3doZXJlICgmbi0+ZmlsZSwgJm4tPmxpbmUpOwotICBuLT50ZXh0ID0gMDsKLSAgbGFiZWxzID0gbjsKLSAgY3VycmVudF9sYWJlbCA9IG47Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSB2YWx1ZSB0aGF0IGlzIG5vdCBhbiBpbnN0cnVjdGlvbiBpcyBlbWl0dGVkLiAgKi8KLQotdm9pZAotbTY4a19mbHVzaF9wZW5kaW5nX291dHB1dCAoKQotewotICBjdXJyZW50X2xhYmVsID0gTlVMTDsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHksIHdoZW4gdGhlIGZpbmFsIHZhbHVlIG9mCi0gICB0aGUgbGFiZWwgaXMga25vd24uICBXZSB3YXJuIGlmIHRoaXMgaXMgYSB0ZXh0IHN5bWJvbCBhbGlnbmVkIGF0IGFuCi0gICBvZGQgbG9jYXRpb24uICAqLwotCi12b2lkCi1tNjhrX2Zyb2Jfc3ltYm9sIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bSkgPT0gcmVnX3NlY3Rpb24KLSAgICAgICYmIChpbnQpIFNfR0VUX1ZBTFVFIChzeW0pIDwgMCkKLSAgICB7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW0sIGFic29sdXRlX3NlY3Rpb24pOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgfihpbnQpU19HRVRfVkFMVUUgKHN5bSkpOwotICAgIH0KLSAgZWxzZSBpZiAoKFNfR0VUX1ZBTFVFIChzeW0pICYgMSkgIT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbGFiZWxfbGluZSAqbDsKLQotICAgICAgZm9yIChsID0gbGFiZWxzOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCXsKLQkgIGlmIChsLT5sYWJlbCA9PSBzeW0pCi0JICAgIHsKLQkgICAgICBpZiAobC0+dGV4dCkKLQkJYXNfd2Fybl93aGVyZSAobC0+ZmlsZSwgbC0+bGluZSwKLQkJCSAgICAgICBfKCJ0ZXh0IGxhYmVsIGAlcycgYWxpZ25lZCB0byBvZGQgYm91bmRhcnkiKSwKLQkJCSAgICAgICBTX0dFVF9OQU1FIChzeW0pKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGlzIGNhbGxlZCBpZiB3ZSBnbyBpbiBvciBvdXQgb2YgTVJJIG1vZGUgYmVjYXVzZSBvZiB0aGUgLm1yaQotICAgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotbTY4a19tcmlfbW9kZV9jaGFuZ2UgKG9uKQotICAgICBpbnQgb247Ci17Ci0gIGlmIChvbikKLSAgICB7Ci0gICAgICBpZiAoISBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwpCi0JewotCSAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMTsKLSNpZmRlZiBSRUdJU1RFUl9QUkVGSVgKLQkgIGluaXRfcmVndGFibGUgKCk7Ci0jZW5kaWYKLQl9Ci0gICAgICBtNjhrX2Fic3BjYWRkID0gMTsKLSAgICAgIGlmICghIG02OGtfcmVsMzJfZnJvbV9jbWRsaW5lKQotCW02OGtfcmVsMzIgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIHJlZ19wcmVmaXhfb3B0aW9uYWxfc2VlbikKLQl7Ci0jaWZkZWYgUkVHSVNURVJfUFJFRklYX09QVElPTkFMCi0JICBmbGFnX3JlZ19wcmVmaXhfb3B0aW9uYWwgPSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUw7Ci0jZWxzZQotCSAgZmxhZ19yZWdfcHJlZml4X29wdGlvbmFsID0gMDsKLSNlbmRpZgotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotCSAgaW5pdF9yZWd0YWJsZSAoKTsKLSNlbmRpZgotCX0KLSAgICAgIG02OGtfYWJzcGNhZGQgPSAwOwotICAgICAgaWYgKCEgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUpCi0JbTY4a19yZWwzMiA9IDE7Ci0gICAgfQotfQotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICBvZiB0eXBlIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyCi0gICBvZiBMSVRUTEVOVU1TIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzCi0gICByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4gICovCi0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLX0KLQotc3RhdGljIHZvaWQKLW1kX2FwcGx5X2ZpeF8yIChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIG9mZnNldFQgdmFsOwotewotICBhZGRyZXNzVCB1cHBlcl9saW1pdDsKLSAgb2Zmc2V0VCBsb3dlcl9saW1pdDsKLQotICAvKiBUaGlzIGlzIHVubmVjZXNzYXJ5IGJ1dCBpdCBjb252aW5jZXMgdGhlIG5hdGl2ZSByczYwMDAgY29tcGlsZXIKLSAgICAgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgd2Ugd2FudC4gICovCi0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGJ1ZiArPSBmaXhQLT5meF93aGVyZTsKLSAgLyogZW5kIGlibSBjb21waWxlciB3b3JrYXJvdW5kICovCi0KLSAgaWYgKHZhbCAmIDB4ODAwMDAwMDApCi0gICAgdmFsIHw9IH4oYWRkcmVzc1QpMHg3ZmZmZmZmZjsKLSAgZWxzZQotICAgIHZhbCAmPSAweDdmZmZmZmZmOwotCi0jaWZkZWYgT0JKX0VMRgotICBpZiAoZml4UC0+ZnhfYWRkc3kpCi0gICAgewotICAgICAgbWVtc2V0IChidWYsIDAsIGZpeFAtPmZ4X3NpemUpOwotICAgICAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwkvKiBSZW1lbWJlciB2YWx1ZSBmb3IgZW1pdF9yZWxvYyAqLwotCi0gICAgICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotCSAgJiYgIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JICAmJiAhU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0JU19TRVRfV0VBSyAoZml4UC0+ZnhfYWRkc3kpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuOwotI2VuZGlmCi0KLSAgc3dpdGNoIChmaXhQLT5meF9zaXplKQotICAgIHsKLSAgICAgIC8qIFRoZSBjYXN0IHRvIG9mZnNldFQgYmVsb3cgYXJlIG5lY2Vzc2FyeSB0byBtYWtlIGNvZGUgY29ycmVjdCBmb3IKLQkgbWFjaGluZXMgd2hlcmUgaW50cyBhcmUgc21hbGxlciB0aGFuIG9mZnNldFQgKi8KLSAgICBjYXNlIDE6Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICB1cHBlcl9saW1pdCA9IDB4N2Y7Ci0gICAgICBsb3dlcl9saW1pdCA9IC0gKG9mZnNldFQpIDB4ODA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgdXBwZXJfbGltaXQgPSAweDdmZmY7Ci0gICAgICBsb3dlcl9saW1pdCA9IC0gKG9mZnNldFQpIDB4ODAwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMjQpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAxNik7Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgdXBwZXJfbGltaXQgPSAweDdmZmZmZmZmOwotICAgICAgbG93ZXJfbGltaXQgPSAtIChvZmZzZXRUKSAweDdmZmZmZmZmIC0gMTsJLyogYXZvaWQgY29uc3RhbnQgb3ZlcmZsb3cgKi8KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZml4UC0+Znhfc2l6ZSk7Ci0gICAgfQotCi0gIC8qIEZpeCB1cCBhIG5lZ2F0aXZlIHJlbG9jLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IE5VTEwgJiYgZml4UC0+Znhfc3Vic3kgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmaXhQLT5meF9hZGRzeSA9IGZpeFAtPmZ4X3N1YnN5OwotICAgICAgZml4UC0+Znhfc3Vic3kgPSBOVUxMOwotICAgICAgZml4UC0+ZnhfdGNiaXQgPSAxOwotICAgIH0KLQotICAvKiBGb3Igbm9uLXBjLXJlbGF0aXZlIHZhbHVlcywgaXQncyBjb25jZWl2YWJsZSB3ZSBtaWdodCBnZXQgc29tZXRoaW5nCi0gICAgIGxpa2UgIjB4ZmYiIGZvciBhIGJ5dGUgZmllbGQuICBTbyBleHRlbmQgdGhlIHVwcGVyIHBhcnQgb2YgdGhlIHJhbmdlCi0gICAgIHRvIGFjY2VwdCBzdWNoIG51bWJlcnMuICBXZSBhcmJpdHJhcmlseSBkaXNhbGxvdyAiLTB4ZmYiIG9yICIweGZmKzB4ZmYiLAotICAgICBzbyB0aGF0IHdlIGNhbiBkbyBhbnkgcmFuZ2UgY2hlY2tpbmcgYXQgYWxsLiAgKi8KLSAgaWYgKCEgZml4UC0+ZnhfcGNyZWwgJiYgISBmaXhQLT5meF9zaWduZWQpCi0gICAgdXBwZXJfbGltaXQgPSB1cHBlcl9saW1pdCAqIDIgKyAxOwotCi0gIGlmICgoYWRkcmVzc1QpIHZhbCA+IHVwcGVyX2xpbWl0Ci0gICAgICAmJiAodmFsID4gMCB8fCB2YWwgPCBsb3dlcl9saW1pdCkpCi0gICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKSk7Ci0KLSAgLyogQSBvbmUgYnl0ZSBQQy1yZWxhdGl2ZSByZWxvYyBtZWFucyBhIHNob3J0IGJyYW5jaC4gIFdlIGNhbid0IHVzZQotICAgICBhIHNob3J0IGJyYW5jaCB3aXRoIGEgdmFsdWUgb2YgMCBvciAtMSwgYmVjYXVzZSB0aG9zZSBpbmRpY2F0ZQotICAgICBkaWZmZXJlbnQgb3Bjb2RlcyAoYnJhbmNoZXMgd2l0aCBsb25nZXIgb2Zmc2V0cykuICBmaXh1cF9zZWdtZW50Ci0gICAgIGluIHdyaXRlLmMgbWF5IGhhdmUgY2xvYmJlcmVkIGZ4X3BjcmVsLCBzbyB3ZSBuZWVkIHRvIGV4YW1pbmUgdGhlCi0gICAgIHJlbG9jIHR5cGUuICAqLwotICBpZiAoKGZpeFAtPmZ4X3BjcmVsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfOF9QQ1JFTAotI2VuZGlmCi0gICAgICAgKQotICAgICAgJiYgZml4UC0+Znhfc2l6ZSA9PSAxCi0gICAgICAmJiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTAotCSAgfHwgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCi0gICAgICAmJiAodmFsID09IDAgfHwgdmFsID09IC0xKSkKLSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oImludmFsaWQgYnl0ZSBicmFuY2ggb2Zmc2V0IikpOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHApCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFscDsKLXsKLSAgbWRfYXBwbHlfZml4XzIgKGZpeFAsIChhZGRyZXNzVCkgKnZhbHApOwotICByZXR1cm4gMTsKLX0KLSNlbHNlCi12b2lkIG1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgbWRfYXBwbHlfZml4XzIgKGZpeFAsIChhZGRyZXNzVCkgdmFsKTsKLX0KLSNlbmRpZgotCi0vKiAqZnJhZ1AgaGFzIGJlZW4gcmVsYXhlZCB0byBpdHMgZmluYWwgc2l6ZSwgYW5kIG5vdyBuZWVkcyB0byBoYXZlCi0gICB0aGUgYnl0ZXMgaW5zaWRlIGl0IG1vZGlmaWVkIHRvIGNvbmZvcm0gdG8gdGhlIG5ldyBzaXplICBUaGVyZSBpcyBVR0xZCi0gICBNQUdJQyBoZXJlLiAuLgotICAgKi8KLXN0YXRpYyB2b2lkCi1tZF9jb252ZXJ0X2ZyYWdfMSAoZnJhZ1ApCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgbG9uZyBkaXNwOwotICBsb25nIGV4dCA9IDA7Ci0gIGZpeFMgKmZpeFA7Ci0KLSAgLyogQWRkcmVzcyBpbiBvYmplY3QgY29kZSBvZiB0aGUgZGlzcGxhY2VtZW50LiAgKi8KLSAgcmVnaXN0ZXIgaW50IG9iamVjdF9hZGRyZXNzID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9hZGRyZXNzOwotCi0gIC8qIEFkZHJlc3MgaW4gZ2FzIGNvcmUgb2YgdGhlIHBsYWNlIHRvIHN0b3JlIHRoZSBkaXNwbGFjZW1lbnQuICAqLwotICAvKiBUaGlzIGNvbnZpbmNlcyB0aGUgbmF0aXZlIHJzNjAwMCBjb21waWxlciB0byBnZW5lcmF0ZSB0aGUgY29kZSB3ZQotICAgICB3YW50LiAqLwotICByZWdpc3RlciBjaGFyICpidWZmZXJfYWRkcmVzcyA9IGZyYWdQLT5mcl9saXRlcmFsOwotICBidWZmZXJfYWRkcmVzcyArPSBmcmFnUC0+ZnJfZml4OwotICAvKiBlbmQgaWJtIGNvbXBpbGVyIHdvcmthcm91bmQgKi8KLQotICAvKiBUaGUgZGlzcGxhY2VtZW50IG9mIHRoZSBhZGRyZXNzLCBmcm9tIGN1cnJlbnQgbG9jYXRpb24uICAqLwotICBkaXNwID0gZnJhZ1AtPmZyX3N5bWJvbCA/IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSA6IDA7Ci0gIGRpc3AgPSAoZGlzcCArIGZyYWdQLT5mcl9vZmZzZXQpIC0gb2JqZWN0X2FkZHJlc3M7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGRpc3AgKz0gc3ltYm9sX2dldF9mcmFnIChmcmFnUC0+ZnJfc3ltYm9sKS0+ZnJfYWRkcmVzczsKLSNlbmRpZgotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgQllURSk6Ci0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIEJZVEUpOgotICAgICAga25vdyAoaXNzYnl0ZSAoZGlzcCkpOwotICAgICAgaWYgKGRpc3AgPT0gMCkKLQlhc19iYWQgKF8oInNob3J0IGJyYW5jaCB3aXRoIHplcm8gb2Zmc2V0OiB1c2UgOnciKSk7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gZGlzcDsKLSAgICAgIGV4dCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoREJDQywgU0hPUlQpOgotICAgICAga25vdyAoaXNzd29yZCAoZGlzcCkpOwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChCQ0M2ODAwMCwgU0hPUlQpOgotICAgIGNhc2UgVEFCIChBQlJBTkNILCBTSE9SVCk6Ci0gICAgICBrbm93IChpc3N3b3JkIChkaXNwKSk7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdID0gMHgwMDsKLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoQUJSQU5DSCwgTE9ORyk6Ci0gICAgICBpZiAoIUhBVkVfTE9OR19CUkFOQ0goY3VycmVudF9hcmNoaXRlY3R1cmUpKQotCXsKLQkgIGlmIChmcmFnUC0+ZnJfb3Bjb2RlWzBdID09IDB4NjEpCi0JICAgIC8qIEJTUiAqLwotCSAgICB7Ci0JICAgICAgZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweEI5OyAvKiBKQlNSIHdpdGggQUJTTCBMT05HIG9mZnNldCAqLwotCi0JICAgICAgZml4X25ldyAoZnJhZ1AsCi0JCSAgICAgICBmcmFnUC0+ZnJfZml4LAotCQkgICAgICAgNCwKLQkJICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCQkgICAgICAgMCwKLQkJICAgICAgIE5PX1JFTE9DKTsKLQotCSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgICBleHQgPSAwOwotCSAgICB9Ci0JICAvKiBCUkEgKi8KLQkgIGVsc2UgaWYgKGZyYWdQLT5mcl9vcGNvZGVbMF0gPT0gMHg2MCkKLQkgICAgewotCSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gPSAweDRFOwotCSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhGOTsgLyogSk1QICB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQkgICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLQkgICAgICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAgICAgZXh0ID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJMb25nIGJyYW5jaCBvZmZzZXQgbm90IHN1cHBvcnRlZC4iKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweGZmOwotCSAgZXh0ID0gNDsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIExPTkcpOgotICAgICAgLyogb25seSBCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLSAgICAgIC8qIGNoYW5nZSBiY2MgaW50byBiIWNjL2ptcCBhYnNsIGxvbmcgKi8KLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMF0gXj0gMHgwMTsJLyogaW52ZXJ0IGJjYyAqLwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IDB4NjsvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLwotCi0gICAgICAvKiBKRjogdGhlc2UgdXNlZCB0byBiZSBmcl9vcGNvZGVbMiwzXSwgYnV0IHRoZXkgbWF5IGJlIGluIGEKLQkgICBkaWZmZXJlbnQgZnJhZywgaW4gd2hpY2ggY2FzZSByZWZlcmluZyB0byB0aGVtIGlzIGEgbm8tbm8uCi0JICAgT25seSBmcl9vcGNvZGVbMCwxXSBhcmUgZ3VhcmFudGVlZCB0byB3b3JrLiAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDRlOwkvKiBwdXQgaW4gam1wIGxvbmcgKDB4NGVmOSkgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gKGNoYXIpIDB4Zjk7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDAsIE5PX1JFTE9DKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLSAgICAgIGV4dCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoREJDQywgTE9ORyk6Ci0gICAgICAvKiBvbmx5IERCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLSAgICAgIC8qIGNoYW5nZSBkYmNjIGludG8gZGJjYy9qbXAgYWJzbCBsb25nICovCi0gICAgICAvKiBKRjogdGhlc2UgdXNlZCB0byBiZSBmcl9vcGNvZGVbMi03XSwgYnV0IHRoYXQncyB3cm9uZyAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDAwOwkvKiBicmFuY2ggb2Zmc2V0ID0gNCAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDA0OwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDYwOwkvKiBwdXQgaW4gYnJhIHBjKzYgKi8KLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHgwNjsKLSAgICAgICpidWZmZXJfYWRkcmVzcysrID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0gICAgICAqYnVmZmVyX2FkZHJlc3MrKyA9IChjaGFyKSAweGY5OwotCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7CS8qIGFjY291bnQgZm9yIGJyYS9qbXAgaW5zdHJ1Y3Rpb25zICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChGQlJBTkNILCBTSE9SVCk6Ci0gICAgICBrbm93ICgoZnJhZ1AtPmZyX29wY29kZVsxXSAmIDB4NDApID09IDApOwotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChGQlJBTkNILCBMT05HKToKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gfD0gMHg0MDsJLyogVHVybiBvbiBMT05HIGJpdCAqLwotICAgICAgZXh0ID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ1JFTCwgU0hPUlQpOgotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ1JFTCwgTE9ORyk6Ci0gICAgICAvKiBUaGUgdGhpbmcgdG8gZG8gaGVyZSBpcyBmb3JjZSBpdCB0byBBQlNPTFVURSBMT05HLCBzaW5jZQotCVBDUkVMIGlzIHJlYWxseSB0cnlpbmcgdG8gc2hvcnRlbiBhbiBBQlNPTFVURSBhZGRyZXNzIGFueXdheSAqLwotICAgICAgLyogSkYgRk9PIFRoaXMgY29kZSBoYXMgbm90IGJlZW4gdGVzdGVkICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwgTk9fUkVMT0MpOwotICAgICAgaWYgKChmcmFnUC0+ZnJfb3Bjb2RlWzFdICYgMHgzRikgIT0gMHgzQSkKLQlhc19iYWQgKF8oIkludGVybmFsIGVycm9yIChsb25nIFBDLXJlbGF0aXZlIG9wZXJhbmQpIGZvciBpbnNuIDB4JTA0eCBhdCAweCVseCIpLAotCQkodW5zaWduZWQpIGZyYWdQLT5mcl9vcGNvZGVbMF0sCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcyk7Ci0gICAgICBmcmFnUC0+ZnJfb3Bjb2RlWzFdICY9IH4weDNGOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDM5OwkvKiBNb2RlIDcuMSAqLwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgICAgZXh0ID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCIChQQ0xFQSwgU0hPUlQpOgotICAgICAgZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotICAgICAgZnJhZ1AtPmZyX29wY29kZVsxXSAmPSB+MHgzRjsKLSAgICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gfD0gMHgzQTsgLyogMDcyIC0gbW9kZSA3LjIgKi8KLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENMRUEsIExPTkcpOgotICAgICAgZml4UCA9IGZpeF9uZXcgKGZyYWdQLCAoaW50KSAoZnJhZ1AtPmZyX2ZpeCkgKyAyLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0gICAgICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAyOwotICAgICAgLyogQWxyZWFkeSBzZXQgdG8gbW9kZSA3LjM7IHRoaXMgaW5kaWNhdGVzOiBQQyBpbmRpcmVjdCB3aXRoCi0JIHN1cHByZXNzZWQgaW5kZXgsIDMyLWJpdCBkaXNwbGFjZW1lbnQuICAqLwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDAxOwotICAgICAgKmJ1ZmZlcl9hZGRyZXNzKysgPSAweDcwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgICAgZXh0ID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUQUIgKFBDSU5ERVgsIEJZVEUpOgotICAgICAgZGlzcCArPSAyOwotICAgICAgaWYgKCFpc3NieXRlIChkaXNwKSkKLQl7Ci0JICBhc19iYWQgKF8oImRpc3BsYWNlbWVudCBkb2Vzbid0IGZpdCBpbiBvbmUgYnl0ZSIpKTsKLQkgIGRpc3AgPSAwOwotCX0KLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2ZpeCA+PSAyKTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0yXSAmPSB+MTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0xXSA9IGRpc3A7Ci0gICAgICBleHQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUQUIgKFBDSU5ERVgsIFNIT1JUKToKLSAgICAgIGRpc3AgKz0gMjsKLSAgICAgIGFzc2VydCAoaXNzd29yZCAoZGlzcCkpOwotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfZml4ID49IDIpOwotICAgICAgYnVmZmVyX2FkZHJlc3NbLTJdIHw9IDB4MTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0xXSA9IDB4MjA7Ci0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwgKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAwNzcpID09IDA3MywKLQkJICAgICAgTk9fUkVMT0MpOwotICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMjsKLSAgICAgIGV4dCA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRBQiAoUENJTkRFWCwgTE9ORyk6Ci0gICAgICBkaXNwICs9IDI7Ci0gICAgICBmaXhQID0gZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICAgZnJhZ1AtPmZyX29mZnNldCwgKGZyYWdQLT5mcl9vcGNvZGVbMV0gJiAwNzcpID09IDA3MywKLQkJICAgICAgTk9fUkVMT0MpOwotICAgICAgZml4UC0+ZnhfcGNyZWxfYWRqdXN0ID0gMjsKLSAgICAgIGFzc2VydCAoZnJhZ1AtPmZyX2ZpeCA+PSAyKTsKLSAgICAgIGJ1ZmZlcl9hZGRyZXNzWy0yXSB8PSAweDE7Ci0gICAgICBidWZmZXJfYWRkcmVzc1stMV0gPSAweDMwOwotICAgICAgZXh0ID0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBpZiAoZXh0KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyX2FkZHJlc3MsIChsb25nKSBkaXNwLCAoaW50KSBleHQpOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSBleHQ7Ci0gICAgfQotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWMsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgbWRfY29udmVydF9mcmFnXzEgKGZyYWdQKTsKLX0KLQotI2Vsc2UKLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIG1kX2NvbnZlcnRfZnJhZ18xIChmcmFnUCk7Ci19Ci0jZW5kaWYKLQotLyogRm9yY2UgdHJ1bHkgdW5kZWZpbmVkIHN5bWJvbHMgdG8gdGhlaXIgbWF4aW11bSBzaXplLCBhbmQgZ2VuZXJhbGx5IHNldCB1cAotICAgdGhlIGZyYWcgbGlzdCB0byBiZSByZWxheGVkCi0gICAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBpbnQgb2xkX2ZpeDsKLSAgcmVnaXN0ZXIgY2hhciAqYnVmZmVyX2FkZHJlc3MgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2xpdGVyYWw7Ci0KLSAgb2xkX2ZpeCA9IGZyYWdQLT5mcl9maXg7Ci0KLSAgLyogaGFuZGxlIFNaX1VOREVGIGZpcnN0LCBpdCBjYW4gYmUgY2hhbmdlZCB0byBCWVRFIG9yIFNIT1JUICovCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotCi0gICAgY2FzZSBUQUIgKEFCUkFOQ0gsIFNaX1VOREVGKToKLSAgICAgIHsKLQlpZiAoKGZyYWdQLT5mcl9zeW1ib2wgIT0gTlVMTCkJLyogTm90IGFic29sdXRlICovCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChUQUJUWVBFIChmcmFnUC0+ZnJfc3VidHlwZSksIEJZVEUpOwotCSAgICBicmVhazsKLQkgIH0KLQllbHNlIGlmICgoZnJhZ1AtPmZyX3N5bWJvbCA9PSAwKSB8fCAhSEFWRV9MT05HX0JSQU5DSChjdXJyZW50X2FyY2hpdGVjdHVyZSkpCi0JICB7Ci0JICAgIC8qIE9uIDY4MDAwLCBvciBmb3IgYWJzb2x1dGUgdmFsdWUsIHN3aXRjaCB0byBhYnMgbG9uZyAqLwotCSAgICAvKiBGSVhNRSwgd2Ugc2hvdWxkIGNoZWNrIGFicyB2YWwsIHBpY2sgc2hvcnQgb3IgbG9uZyAqLwotCSAgICBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYxKQotCSAgICAgIHsKLQkJZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JCWZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhCOTsgLyogSkJTUiB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQkJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsCi0JCQkgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCQlmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JCWZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX29wY29kZVswXSA9PSAweDYwKQotCSAgICAgIHsKLQkJZnJhZ1AtPmZyX29wY29kZVswXSA9IDB4NEU7Ci0JCWZyYWdQLT5mcl9vcGNvZGVbMV0gPSAoY2hhcikgMHhGOTsgLyogSk1QICB3aXRoIEFCU0wgTE9ORyBvZmZzZXQgKi8KLQkJZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDQsCi0JCQkgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgTk9fUkVMT0MpOwotCQlmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JCWZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYXNfd2FybiAoXygiTG9uZyBicmFuY2ggb2Zmc2V0IHRvIGV4dGVybiBzeW1ib2wgbm90IHN1cHBvcnRlZC4iKSk7Ci0JICAgICAgfQotCSAgfQotCWVsc2UKLQkgIHsJCQkvKiBTeW1ib2wgaXMgc3RpbGwgdW5kZWZpbmVkLiAgTWFrZSBpdCBzaW1wbGUgKi8KLQkgICAgZml4X25ldyAoZnJhZ1AsIChpbnQpIChmcmFnUC0+ZnJfZml4KSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSA9IChjaGFyKSAweGZmOwotCSAgICBmcmFnX3dhbmUgKGZyYWdQKTsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogY2FzZSBUQUIoQUJSQU5DSCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChGQlJBTkNILCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50Ci0JICAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgICAgfHwgZmxhZ19zaG9ydF9yZWZzKQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoRkJSQU5DSCwgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmaXhfbmV3IChmcmFnUCwgKGludCkgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgICAgZnJhZ1AtPmZyX29wY29kZVsxXSB8PSAweDQwOyAvKiBUdXJuIG9uIExPTkcgYml0ICovCi0JICAgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCSAgfQotCWJyZWFrOwotICAgICAgfQkJCQkvKiBUQUIoRkJSQU5DSCxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChQQ1JFTCwgU1pfVU5ERUYpOgotICAgICAgewotCWlmICgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICAgIHx8IGZsYWdfc2hvcnRfcmVmcwotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpIDwgbTY4MDIwCi0JICAgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKFBDUkVMLCBTSE9SVCk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ1JFTCwgTE9ORyk7Ci0JICAgIGZyYWdQLT5mcl92YXIgKz0gNDsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0JCQkJLyogVEFCKFBDUkVMLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKEJDQzY4MDAwLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwpCi0JICAgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAgJiYgcmVsYXhhYmxlX3N5bWJvbCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChCQ0M2ODAwMCwgQllURSk7Ci0JICAgIGJyZWFrOwotCSAgfQotCS8qIG9ubHkgQmNjIDY4MDAwIGluc3RydWN0aW9ucyBjYW4gY29tZSBoZXJlICovCi0JLyogY2hhbmdlIGJjYyBpbnRvIGIhY2Mvam1wIGFic2wgbG9uZyAqLwotCWZyYWdQLT5mcl9vcGNvZGVbMF0gXj0gMHgwMTsJLyogaW52ZXJ0IGJjYyAqLwotCWlmIChmbGFnX3Nob3J0X3JlZnMpCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDA0OwkvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLwotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbMiwzXSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1swXSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1sxXSA9IChjaGFyKSAweGY4OwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9vcGNvZGVbMV0gPSAweDA2OwkvKiBicmFuY2ggb2Zmc2V0ID0gNiAqLwotCSAgICAvKiBKRjogdGhlc2Ugd2VyZSBmcl9vcGNvZGVbMiwzXSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1swXSA9IDB4NGU7CS8qIHB1dCBpbiBqbXAgbG9uZyAoMHg0ZWY5KSAqLwotCSAgICBidWZmZXJfYWRkcmVzc1sxXSA9IChjaGFyKSAweGY5OwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IDI7CS8qIGFjY291bnQgZm9yIGptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgIH0KLQlmcmFnX3dhbmUgKGZyYWdQKTsKLQlicmVhazsKLSAgICAgIH0JCQkJLyogY2FzZSBUQUIoQkNDNjgwMDAsU1pfVU5ERUYpICovCi0KLSAgICBjYXNlIFRBQiAoREJDQywgU1pfVU5ERUYpOgotICAgICAgewotCWlmIChmcmFnUC0+ZnJfc3ltYm9sICE9IE5VTEwKLQkgICAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudAotCSAgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBUQUIgKERCQ0MsIFNIT1JUKTsKLQkgICAgZnJhZ1AtPmZyX3ZhciArPSAyOwotCSAgICBicmVhazsKLQkgIH0KLQkvKiBvbmx5IERCY2MgNjgwMDAgaW5zdHJ1Y3Rpb25zIGNhbiBjb21lIGhlcmUgKi8KLQkvKiBjaGFuZ2UgZGJjYyBpbnRvIGRiY2Mvam1wIGFic2wgbG9uZyAqLwotCS8qIEpGOiB0aGVzZSB1c2VkIHRvIGJlIGZyX29wY29kZVsyLTRdLCB3aGljaCBpcyB3cm9uZy4gKi8KLQlidWZmZXJfYWRkcmVzc1swXSA9IDB4MDA7CS8qIGJyYW5jaCBvZmZzZXQgPSA0ICovCi0JYnVmZmVyX2FkZHJlc3NbMV0gPSAweDA0OwotCWJ1ZmZlcl9hZGRyZXNzWzJdID0gMHg2MDsJLyogcHV0IGluIGJyYSBwYyArIC4uLiAqLwotCi0JaWYgKGZsYWdfc2hvcnRfcmVmcykKLQkgIHsKLQkgICAgLyogSkY6IHRoZXNlIHdlcmUgZnJfb3Bjb2RlWzUtN10gKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbM10gPSAweDA0OwkvKiBwbHVzIDQgKi8KLQkgICAgYnVmZmVyX2FkZHJlc3NbNF0gPSAweDRlOwkvKiBQdXQgaW4gSnVtcCBXb3JkICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzVdID0gKGNoYXIpIDB4Zjg7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIEpGOiB0aGVzZSB3ZXJlIGZyX29wY29kZVs1LTddICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzNdID0gMHgwNjsJLyogUGx1cyA2ICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzRdID0gMHg0ZTsJLyogcHV0IGluIGptcCBsb25nICgweDRlZjkpICovCi0JICAgIGJ1ZmZlcl9hZGRyZXNzWzVdID0gKGNoYXIpIDB4Zjk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNjsJLyogYWNjb3VudCBmb3IgYnJhL2ptcCBpbnN0cnVjdGlvbiAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBOT19SRUxPQyk7Ci0JICAgIGZyYWdQLT5mcl9maXggKz0gNDsKLQkgIH0KLQotCWZyYWdfd2FuZSAoZnJhZ1ApOwotCWJyZWFrOwotICAgICAgfQkJCQkvKiBjYXNlIFRBQihEQkNDLFNaX1VOREVGKSAqLwotCi0gICAgY2FzZSBUQUIgKFBDTEVBLCBTWl9VTkRFRik6Ci0gICAgICB7Ci0JaWYgKCgoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkpID09IHNlZ21lbnQKLQkgICAgICYmIHJlbGF4YWJsZV9zeW1ib2wgKGZyYWdQLT5mcl9zeW1ib2wpKQotCSAgICB8fCBmbGFnX3Nob3J0X3JlZnMKLQkgICAgfHwgY3B1X29mX2FyY2ggKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSA8IG02ODAyMAotCSAgICB8fCBjcHVfb2ZfYXJjaCAoY3VycmVudF9hcmNoaXRlY3R1cmUpID09IG1jZjUyMDApCi0JICB7Ci0JICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0xFQSwgU0hPUlQpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENMRUEsIExPTkcpOwotCSAgICBmcmFnUC0+ZnJfdmFyICs9IDY7Ci0JICB9Ci0JYnJlYWs7Ci0gICAgICB9CQkJCS8qIFRBQihQQ0xFQSxTWl9VTkRFRikgKi8KLQotICAgIGNhc2UgVEFCIChQQ0lOREVYLCBTWl9VTkRFRik6Ci0gICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQKLQkgICAmJiByZWxheGFibGVfc3ltYm9sIChmcmFnUC0+ZnJfc3ltYm9sKSkKLQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPCBtNjgwMjAKLQkgIHx8IGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgPT0gbWNmNTIwMCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IFRBQiAoUENJTkRFWCwgQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChQQ0lOREVYLCBMT05HKTsKLQkgIGZyYWdQLT5mcl92YXIgKz0gNDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyogbm93IHRoYXQgU1pfVU5ERUYgYXJlIHRha2VuIGNhcmUgb2YsIGNoZWNrIG90aGVycyAqLwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIFRBQiAoQkNDNjgwMDAsIEJZVEUpOgotICAgIGNhc2UgVEFCIChBQlJBTkNILCBCWVRFKToKLSAgICAgIC8qIFdlIGNhbid0IGRvIGEgc2hvcnQganVtcCB0byB0aGUgbmV4dCBpbnN0cnVjdGlvbiwgc28gaW4gdGhhdAotCSBjYXNlIHdlIGZvcmNlIHdvcmQgbW9kZS4gIEF0IHRoaXMgcG9pbnQgU19HRVRfVkFMVUUgc2hvdWxkCi0JIHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBzeW1ib2wgd2l0aGluIGl0cyBmcmFnLiAgSWYgdGhlCi0JIHN5bWJvbCBpcyBhdCB0aGUgc3RhcnQgb2YgYSBmcmFnLCBhbmQgaXQgaXMgdGhlIG5leHQgZnJhZwotCSB3aXRoIGFueSBkYXRhIGluIGl0ICh1c3VhbGx5IHRoaXMgaXMganVzdCB0aGUgbmV4dCBmcmFnLCBidXQKLQkgYXNzZW1ibGVyIGxpc3RpbmdzIG1heSBpbnRyb2R1Y2UgZW1wdHkgZnJhZ3MpLCB3ZSBtdXN0IHVzZQotCSB3b3JkIG1vZGUuICAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wgJiYgU19HRVRfVkFMVUUgKGZyYWdQLT5mcl9zeW1ib2wpID09IDApCi0JewotCSAgZnJhZ1MgKnN0b3A7Ci0JICBmcmFnUyAqbDsKLQotCSAgc3RvcCA9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0JICBmb3IgKGwgPSBmcmFnUC0+ZnJfbmV4dDsgbCAhPSBzdG9wOyBsID0gbC0+ZnJfbmV4dCkKLQkgICAgaWYgKGwtPmZyX2ZpeCArIGwtPmZyX3ZhciAhPSAwKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGwgPT0gc3RvcCkKLQkgICAgewotCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlID0gVEFCIChUQUJUWVBFIChmcmFnUC0+ZnJfc3VidHlwZSksIFNIT1JUKTsKLQkgICAgICBmcmFnUC0+ZnJfdmFyICs9IDI7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gZnJhZ1AtPmZyX3ZhciArIGZyYWdQLT5mcl9maXggLSBvbGRfZml4OwotfQotCi0jaWYgZGVmaW5lZChPQkpfQU9VVCkgfCBkZWZpbmVkKE9CSl9CT1VUKQotLyogdGhlIGJpdC1maWVsZCBlbnRyaWVzIGluIHRoZSByZWxvY2F0aW9uX2luZm8gc3RydWN0IHBsYXlzIGhlbGwKLSAgIHdpdGggdGhlIGJ5dGUtb3JkZXIgcHJvYmxlbXMgb2YgY3Jvc3MtYXNzZW1ibHkuICBTbyBhcyBhIGhhY2ssCi0gICBJIGFkZGVkIHRoaXMgbWFjaC4gZGVwZW5kZW50IHJpIHR3aWRkbGVyLiAgVWdseSwgYnV0IGl0IGdldHMKLSAgIHlvdSB0aGVyZS4gLUtXSyAqLwotLyogb24gbTY4azogZmlyc3QgNCBieXRlcyBhcmUgbm9ybWFsIHVuc2lnbmVkIGxvbmcsIG5leHQgdGhyZWUgYnl0ZXMKLSAgIGFyZSBzeW1ib2xudW0sIG1vc3Qgc2lnLiBieXRlIGZpcnN0LiAgTGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoCi0gICBiaXQgNyBhcyBwY3JlbCwgYml0cyA2ICYgNSBhcyBsZW5ndGgsIGJpdCA0IGFzIHBjcmVsLCBhbmQgdGhlIGxvd2VyCi0gICBuaWJibGUgYXMgbnV0aGluLiAob24gU3VuIDMgYXQgbGVhc3QpICovCi0vKiBUcmFuc2xhdGUgdGhlIGludGVybmFsIHJlbG9jYXRpb24gaW5mb3JtYXRpb24gaW50byB0YXJnZXQtc3BlY2lmaWMKLSAgIGZvcm1hdC4gKi8KLSNpZmRlZiBjb21tZW50Ci12b2lkCi1tZF9yaV90b19jaGFycyAodGhlX2J5dGVzLCByaSkKLSAgICAgY2hhciAqdGhlX2J5dGVzOwotICAgICBzdHJ1Y3QgcmVsb2NfaW5mb19nZW5lcmljICpyaTsKLXsKLSAgLyogdGhpcyBpcyBlYXN5ICovCi0gIG1kX251bWJlcl90b19jaGFycyAodGhlX2J5dGVzLCByaS0+cl9hZGRyZXNzLCA0KTsKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgdGhlX2J5dGVzWzRdID0gKHJpLT5yX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzVdID0gKHJpLT5yX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNl0gPSByaS0+cl9zeW1ib2xudW0gJiAweDBmZjsKLSAgdGhlX2J5dGVzWzddID0gKCgocmktPnJfcGNyZWwgPDwgNykgJiAweDgwKSB8ICgocmktPnJfbGVuZ3RoIDw8IDUpICYgMHg2MCkgfAotCQkgICgocmktPnJfZXh0ZXJuIDw8IDQpICYgMHgxMCkpOwotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgLyoKLSAgICogSW46IGxlbmd0aCBvZiByZWxvY2F0aW9uIChvciBvZiBhZGRyZXNzKSBpbiBjaGFyczogMSwgMiBvciA0LgotICAgKiBPdXQ6IEdOVSBMRCByZWxvY2F0aW9uIGxlbmd0aCBjb2RlOiAwLCAxLCBvciAyLgotICAgKi8KLQotICBzdGF0aWMgQ09OU1QgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs0XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNl0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDcpICYgMHg4MCkgfCAoKG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXSA8PCA1KSAmIDB4NjApIHwKLQkgICAgICAoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDQpICYgMHgxMCkpOwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLUNPTlNUIGludCBtZF9zaG9ydF9qdW1wX3NpemUgPSA0OwotQ09OU1QgaW50IG1kX2xvbmdfanVtcF9zaXplID0gNjsKLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgMik7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4NjAwMCwgMik7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMiwgKHZhbHVlVCkgb2Zmc2V0LCAyKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgaWYgKCFIQVZFX0xPTkdfQlJBTkNIKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gU19HRVRfVkFMVUUgKHRvX3N5bWJvbCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgKHZhbHVlVCkgMHg0RUY5LCAyKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocHRyICsgMiwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLSAgICAgIGZpeF9uZXcgKGZyYWcsIChwdHIgKyAyKSAtIGZyYWctPmZyX2xpdGVyYWwsIDQsIHRvX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JICAgICAgIDAsIE5PX1JFTE9DKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDIpOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4NjBmZiwgMik7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHB0ciArIDIsICh2YWx1ZVQpIG9mZnNldCwgNCk7Ci0gICAgfQotfQotCi0jZW5kaWYKLQotLyogRGlmZmVyZW50IHZhbHVlcyBvZiBPSyB0ZWxsIHdoYXQgaXRzIE9LIHRvIHJldHVybi4gIFRoaW5ncyB0aGF0Ci0gICBhcmVuJ3QgT0sgYXJlIGFuIGVycm9yICh3aGF0IGEgc2hvY2ssIG5vPykKLQotICAgMDogIEV2ZXJ5dGhpbmcgaXMgT0sKLSAgIDEwOiAgQWJzb2x1dGUgMTo4CW9ubHkKLSAgIDIwOiAgQWJzb2x1dGUgMDo3CW9ubHkKLSAgIDMwOiAgYWJzb2x1dGUgMDoxNQlvbmx5Ci0gICA0MDogIEFic29sdXRlIDA6MzEJb25seQotICAgNTA6ICBhYnNvbHV0ZSAwOjEyNwlvbmx5Ci0gICA1NTogIGFic29sdXRlIC02NDo2MyAgICBvbmx5Ci0gICA2MDogIGFic29sdXRlIC0xMjg6MTI3CW9ubHkKLSAgIDcwOiAgYWJzb2x1dGUgMDo0MDk1CW9ubHkKLSAgIDgwOiAgTm8gYmlnbnVtcwotCi0gICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfbnVtIChleHAsIG9rKQotICAgICBzdHJ1Y3QgbTY4a19leHAgKmV4cDsKLSAgICAgaW50IG9rOwotewotICBpZiAoZXhwLT5leHAuWF9vcCA9PSBPX2Fic2VudCkKLSAgICB7Ci0gICAgICAvKiBEbyB0aGUgc2FtZSB0aGluZyB0aGUgVkFYIGFzbSBkb2VzICovCi0gICAgICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7Ci0gICAgICBhZGRzIChleHApID0gMDsKLSAgICAgIHN1YnMgKGV4cCkgPSAwOwotICAgICAgb2ZmcyAoZXhwKSA9IDA7Ci0gICAgICBpZiAob2sgPT0gMTApCi0JewotCSAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMSIpKTsKLQkgIG9mZnMgKGV4cCkgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKGV4cC0+ZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9rKQotCXsKLQljYXNlIDEwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAxIHx8IG9mZnMgKGV4cCkgPiA4KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMSIpKTsKLQkgICAgICBvZmZzIChleHApID0gMTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAyMDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gNykKLQkgICAgZ290byBvdXRyYW5nZTsKLQkgIGJyZWFrOwotCWNhc2UgMzA6Ci0JICBpZiAob2ZmcyAoZXhwKSA8IDAgfHwgb2ZmcyAoZXhwKSA+IDE1KQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSA0MDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gMzIpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDUwOgotCSAgaWYgKG9mZnMgKGV4cCkgPCAwIHx8IG9mZnMgKGV4cCkgPiAxMjcpCi0JICAgIGdvdG8gb3V0cmFuZ2U7Ci0JICBicmVhazsKLQljYXNlIDU1OgotCSAgaWYgKG9mZnMgKGV4cCkgPCAtNjQgfHwgb2ZmcyAoZXhwKSA+IDYzKQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSA2MDoKLQkgIGlmIChvZmZzIChleHApIDwgLTEyOCB8fCBvZmZzIChleHApID4gMTI3KQotCSAgICBnb3RvIG91dHJhbmdlOwotCSAgYnJlYWs7Ci0JY2FzZSA3MDoKLQkgIGlmIChvZmZzIChleHApIDwgMCB8fCBvZmZzIChleHApID4gNDA5NSkKLQkgICAgewotCSAgICBvdXRyYW5nZToKLQkgICAgICBhc193YXJuIChfKCJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAwIikpOwotCSAgICAgIG9mZnMgKGV4cCkgPSAwOwotCSAgICB9Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZXhwLT5leHAuWF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICBpZiAob2ZmcyAoZXhwKSA8PSAwCS8qIGZsb251bSAqLwotCSAgJiYgKG9rID09IDgwCQkvKiBubyBiaWdudW1zICovCi0JICAgICAgfHwgKG9rID4gMTAJLyogc21hbGwtaW50IHJhbmdlcyBpbmNsdWRpbmcgMCBvayAqLwotCQkgIC8qIElmIHdlIGhhdmUgYSBmbG9udW0gemVybywgYSB6ZXJvIGludGVnZXIgc2hvdWxkCi0JCSAgICAgZG8gYXMgd2VsbCAoZS5nLiwgaW4gbW92ZXEpLiAgKi8KLQkJICAmJiBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci5leHBvbmVudCA9PSAwCi0JCSAgJiYgZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIubG93WzBdID09IDApKSkKLQl7Ci0JICAvKiBIQUNLISBUdXJuIGl0IGludG8gYSBsb25nICovCi0JICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s2XTsKLQotCSAgZ2VuX3RvX3dvcmRzICh3b3JkcywgMiwgOEwpOwkvKiBUaGVzZSBudW1iZXJzIGFyZSBtYWdpYyEgKi8KLQkgIG9wIChleHApID0gT19jb25zdGFudDsKLQkgIGFkZHMgKGV4cCkgPSAwOwotCSAgc3VicyAoZXhwKSA9IDA7Ci0JICBvZmZzIChleHApID0gd29yZHNbMV0gfCAod29yZHNbMF0gPDwgMTYpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9rICE9IDApCi0JewotCSAgb3AgKGV4cCkgPSBPX2NvbnN0YW50OwotCSAgYWRkcyAoZXhwKSA9IDA7Ci0JICBzdWJzIChleHApID0gMDsKLQkgIG9mZnMgKGV4cCkgPSAob2sgPT0gMTApID8gMSA6IDA7Ci0JICBhc193YXJuIChfKCJDYW4ndCBkZWFsIHdpdGggZXhwcmVzc2lvbjsgZGVmYXVsdGluZyB0byAlbGQiKSwKLQkJICAgb2ZmcyAoZXhwKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvayA+PSAxMCAmJiBvayA8PSA3MCkKLQl7Ci0JICBvcCAoZXhwKSA9IE9fY29uc3RhbnQ7Ci0JICBhZGRzIChleHApID0gMDsKLQkgIHN1YnMgKGV4cCkgPSAwOwotCSAgb2ZmcyAoZXhwKSA9IChvayA9PSAxMCkgPyAxIDogMDsKLQkgIGFzX3dhcm4gKF8oIkNhbid0IGRlYWwgd2l0aCBleHByZXNzaW9uOyBkZWZhdWx0aW5nIHRvICVsZCIpLAotCQkgICBvZmZzIChleHApKTsKLQl9Ci0gICAgfQotCi0gIGlmIChleHAtPnNpemUgIT0gU0laRV9VTlNQRUMpCi0gICAgewotICAgICAgc3dpdGNoIChleHAtPnNpemUpCi0JewotCWNhc2UgU0laRV9VTlNQRUM6Ci0JY2FzZSBTSVpFX0xPTkc6Ci0JICBicmVhazsKLQljYXNlIFNJWkVfQllURToKLQkgIGlmICghaXNieXRlIChvZmZzIChleHApKSkKLQkgICAgYXNfd2FybiAoXygiZXhwcmVzc2lvbiBkb2Vzbid0IGZpdCBpbiBCWVRFIikpOwotCSAgYnJlYWs7Ci0JY2FzZSBTSVpFX1dPUkQ6Ci0JICBpZiAoIWlzd29yZCAob2ZmcyAoZXhwKSkpCi0JICAgIGFzX3dhcm4gKF8oImV4cHJlc3Npb24gZG9lc24ndCBmaXQgaW4gV09SRCIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnMgKGV4cCk7Ci19Ci0KLS8qIFRoZXNlIGFyZSB0aGUgYmFjay1lbmRzIGZvciB0aGUgdmFyaW91cyBtYWNoaW5lIGRlcGVuZGVudCBwc2V1ZG8tb3BzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAxKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTIgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAyKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfYnNzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIC8qIFdlIGRvbid0IHN1cHBvcnQgcHV0dGluZyBmcmFncyBpbiB0aGUgQlNTIHNlZ21lbnQsIHdlIGZha2UgaXQKLSAgICAgYnkgbWFya2luZyBpbl9ic3MsIHRoZW4gbG9va2luZyBhdCBzX3NraXAgZm9yIGNsdWVzLiAgKi8KLQotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2V2ZW4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIGxvbmcgdGVtcF9maWxsOwotCi0gIHRlbXAgPSAxOwkJCS8qIEpGIHNob3VsZCBiZSAyPyAqLwotICB0ZW1wX2ZpbGwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgaWYgKCFuZWVkX3Bhc3NfMikJCS8qIE5ldmVyIG1ha2UgZnJhZyBpZiBleHBlY3QgZXh0cmEgcGFzcy4gKi8KLSAgICBmcmFnX2FsaWduICh0ZW1wLCAoaW50KSB0ZW1wX2ZpbGwsIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCB0ZW1wKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfcHJvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUHNldWRvLW9wcyBoYW5kbGVkIGZvciBNUkkgY29tcGF0aWJpbGl0eS4gICovCi0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiB0aGUgYXJndW1lbnQgaXMgYSBjb25kaXRpb25hbAotICAgcHNldWRvLW9wLiAgVGhpcyBpcyBjYWxsZWQgd2hlbiBjaGVja2luZyB3aGV0aGVyIGEgcGVuZGluZwotICAgYWxpZ25tZW50IGlzIG5lZWRlZC4gICovCi0KLWludAotbTY4a19jb25kaXRpb25hbF9wc2V1ZG9vcCAocG9wKQotICAgICBwc2V1ZG9fdHlwZVMgKnBvcDsKLXsKLSAgcmV0dXJuIChwb3AtPnBvY19oYW5kbGVyID09IHNfbXJpX2lmCi0JICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfbXJpX2Vsc2UpOwotfQotCi0vKiBIYW5kbGUgYW4gTVJJIHN0eWxlIGNoaXAgc3BlY2lmaWNhdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfY2hpcCAoKQotewotICBjaGFyICpzOwotICBjaGFyIGM7Ci0gIGludCBpOwotCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIC8qIFdlIGNhbid0IHVzZSBnZXRfc3ltYm9sX2VuZCBzaW5jZSB0aGUgcHJvY2Vzc29yIG5hbWVzIGFyZSBub3QgcHJvcGVyCi0gICAgIHN5bWJvbHMuICAqLwotICB3aGlsZSAoaXNfcGFydF9vZl9uYW1lIChjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKSkKLSAgICA7Ci0gICotLWlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBuX2FyY2hzOyBpKyspCi0gICAgaWYgKHN0cmNhc2VjbXAgKHMsIGFyY2hzW2ldLm5hbWUpID09IDApCi0gICAgICBicmVhazsKLSAgaWYgKGkgPj0gbl9hcmNocykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIiVzOiB1bnJlY29nbml6ZWQgcHJvY2Vzc29yIG5hbWUiKSwgcyk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLycpCi0gICAgY3VycmVudF9hcmNoaXRlY3R1cmUgPSAwOwotICBlbHNlCi0gICAgY3VycmVudF9hcmNoaXRlY3R1cmUgJj0gbTY4ODgxIHwgbTY4ODUxOwotICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBhcmNoc1tpXS5hcmNoOwotCi0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcvJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAvKiBXZSBjYW4ndCB1c2UgZ2V0X3N5bWJvbF9lbmQgc2luY2UgdGhlIHByb2Nlc3NvciBuYW1lcyBhcmUgbm90Ci0JIHByb3BlciBzeW1ib2xzLiAgKi8KLSAgICAgIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspKQotCTsKLSAgICAgICotLWlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gICAgICBpZiAoc3RyY21wIChzLCAiNjg4ODEiKSA9PSAwKQotCWN1cnJlbnRfYXJjaGl0ZWN0dXJlIHw9IG02ODg4MTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIjY4ODUxIikgPT0gMCkKLQljdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBtNjg4NTE7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIGluZm8gYWJvdXQgYXZhaWxhYmxlIGNvbnRyb2wgcmVnaXN0ZXJzLiAgKi8KLSAgc2VsZWN0X2NvbnRyb2xfcmVncyAoKTsKLX0KLQotLyogVGhlIE1SSSBDSElQIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NoaXAgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLSAgbXJpX2NoaXAgKCk7Ci0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIE1SSSBGT1BUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2ZvcHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiSUQ9IiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgdGVtcDsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDM7Ci0gICAgICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAodGVtcCA8IDAgfHwgdGVtcCA+IDcpCi0JYXNfYmFkIChfKCJiYWQgY29wcm9jZXNzb3IgaWQiKSk7Ci0gICAgICBlbHNlCi0JbTY4a19mbG9hdF9jb3BudW0gPSBDT1AwICsgdGVtcDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVucmVjb2duaXplZCBmb3B0IG9wdGlvbiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBoYW5kbGUgdGhlIE1SSSBPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RydWN0IG9wdF9hY3Rpb24KLXsKLSAgLyogVGhlIG5hbWUgb2YgdGhlIG9wdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogSWYgdGhpcyBpcyBub3QgTlVMTCwganVzdCBjYWxsIHRoaXMgZnVuY3Rpb24uICBUaGUgZmlyc3QgYXJndW1lbnQKLSAgICAgaXMgdGhlIEFSRyBmaWVsZCBvZiB0aGlzIHN0cnVjdHVyZSwgdGhlIHNlY29uZCBhcmd1bWVudCBpcwotICAgICB3aGV0aGVyIHRoZSBvcHRpb24gd2FzIG5lZ2F0ZWQuICAqLwotICB2b2lkICgqcGZuKSBQQVJBTVMgKChpbnQgYXJnLCBpbnQgb24pKTsKLQotICAvKiBJZiB0aGlzIGlzIG5vdCBOVUxMLCBhbmQgdGhlIFBGTiBmaWVsZCBpcyBOVUxMLCBzZXQgdGhlIHZhcmlhYmxlCi0gICAgIHRoaXMgcG9pbnRzIHRvLiAgU2V0IGl0IHRvIHRoZSBBUkcgZmllbGQgaWYgdGhlIG9wdGlvbiB3YXMgbm90Ci0gICAgIG5lZ2F0ZWQsIGFuZCB0aGUgTk9UQVJHIGZpZWxkIG90aGVyd2lzZS4gICovCi0gIGludCAqcHZhcjsKLQotICAvKiBUaGUgdmFsdWUgdG8gcGFzcyB0byBQRk4gb3IgdG8gYXNzaWduIHRvICpQVkFSLiAgKi8KLSAgaW50IGFyZzsKLQotICAvKiBUaGUgdmFsdWUgdG8gYXNzaWduIHRvICpQVkFSIGlmIHRoZSBvcHRpb24gaXMgbmVnYXRlZC4gIElmIFBGTiBpcwotICAgICBOVUxMLCBhbmQgUFZBUiBpcyBub3QgTlVMTCwgYW5kIEFSRyBhbmQgTk9UQVJHIGFyZSB0aGUgc2FtZSwgdGhlbgotICAgICB0aGUgb3B0aW9uIG1heSBub3QgYmUgbmVnYXRlZC4gICovCi0gIGludCBub3Rhcmc7Ci19OwotCi0vKiBUaGUgdGFibGUgdXNlZCB0byBoYW5kbGUgdGhlIE1SSSBPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQgc2tpcF90b19jb21tYSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3B0X25lc3QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIG9wdF9jaGlwIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBvcHRfbGlzdCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgb3B0X2xpc3Rfc3ltYm9scyBQQVJBTVMgKChpbnQsIGludCkpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdF9hY3Rpb24gb3B0X3RhYmxlW10gPQotewotICB7ICJhYnNwY2FkZCIsIDAsICZtNjhrX2Fic3BjYWRkLCAxLCAwIH0sCi0KLSAgLyogV2UgZG8gcmVsYXhpbmcsIHNvIHRoZXJlIGlzIGxpdHRsZSB1c2UgZm9yIHRoZXNlIG9wdGlvbnMuICAqLwotICB7ICJiIiwgMCwgMCwgMCwgMCB9LAotICB7ICJicnMiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImJyYiIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiYnJsIiwgMCwgMCwgMCwgMCB9LAotICB7ICJicnciLCAwLCAwLCAwLCAwIH0sCi0KLSAgeyAiYyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiY2V4IiwgMCwgMCwgMCwgMCB9LAotICB7ICJjYXNlIiwgMCwgJnN5bWJvbHNfY2FzZV9zZW5zaXRpdmUsIDEsIDAgfSwKLSAgeyAiY2wiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImNyZSIsIDAsIDAsIDAsIDAgfSwKLSAgeyAiZCIsIDAsICZmbGFnX2tlZXBfbG9jYWxzLCAxLCAwIH0sCi0gIHsgImUiLCAwLCAwLCAwLCAwIH0sCi0gIHsgImYiLCAwLCAmZmxhZ19zaG9ydF9yZWZzLCAxLCAwIH0sCi0gIHsgImZycyIsIDAsICZmbGFnX3Nob3J0X3JlZnMsIDEsIDAgfSwKLSAgeyAiZnJsIiwgMCwgJmZsYWdfc2hvcnRfcmVmcywgMCwgMSB9LAotICB7ICJnIiwgMCwgMCwgMCwgMCB9LAotICB7ICJpIiwgMCwgMCwgMCwgMCB9LAotICB7ICJtIiwgMCwgMCwgMCwgMCB9LAotICB7ICJtZXgiLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm1jIiwgMCwgMCwgMCwgMCB9LAotICB7ICJtZCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAibmVzdCIsIG9wdF9uZXN0LCAwLCAwLCAwIH0sCi0gIHsgIm5leHQiLCBza2lwX3RvX2NvbW1hLCAwLCAwLCAwIH0sCi0gIHsgIm8iLCAwLCAwLCAwLCAwIH0sCi0gIHsgIm9sZCIsIDAsIDAsIDAsIDAgfSwKLSAgeyAib3AiLCBza2lwX3RvX2NvbW1hLCAwLCAwLCAwIH0sCi0gIHsgInBjbyIsIDAsIDAsIDAsIDAgfSwKLSAgeyAicCIsIG9wdF9jaGlwLCAwLCAwLCAwIH0sCi0gIHsgInBjciIsIDAsIDAsIDAsIDAgfSwKLSAgeyAicGNzIiwgMCwgMCwgMCwgMCB9LAotICB7ICJyIiwgMCwgMCwgMCwgMCB9LAotICB7ICJxdWljayIsIDAsICZtNjhrX3F1aWNrLCAxLCAwIH0sCi0gIHsgInJlbDMyIiwgMCwgJm02OGtfcmVsMzIsIDEsIDAgfSwKLSAgeyAicyIsIG9wdF9saXN0LCAwLCAwLCAwIH0sCi0gIHsgInQiLCBvcHRfbGlzdF9zeW1ib2xzLCAwLCAwLCAwIH0sCi0gIHsgInciLCAwLCAmZmxhZ19ub193YXJuaW5ncywgMCwgMSB9LAotICB7ICJ4IiwgMCwgMCwgMCwgMCB9Ci19OwotCi0jZGVmaW5lIE9QVENPVU5UIChzaXplb2Ygb3B0X3RhYmxlIC8gc2l6ZW9mIG9wdF90YWJsZVswXSkKLQotLyogVGhlIE1SSSBPUFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfb3B0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGRvCi0gICAgewotICAgICAgaW50IHQ7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciBjOwotICAgICAgaW50IGk7Ci0gICAgICBjb25zdCBzdHJ1Y3Qgb3B0X2FjdGlvbiAqbzsKLQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICAgICB0ID0gMTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJOTyIsIDIpID09IDApCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICB0ID0gMDsKLQl9Ci0KLSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgICAgIGZvciAoaSA9IDAsIG8gPSBvcHRfdGFibGU7IGkgPCBPUFRDT1VOVDsgaSsrLCBvKyspCi0JewotCSAgaWYgKHN0cmNhc2VjbXAgKHMsIG8tPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoby0+cGZuKQotCQl7Ci0JCSAgLyogUmVzdG9yZSBpbnB1dF9saW5lX3BvaW50ZXIgbm93IGluIGNhc2UgdGhlIG9wdGlvbgotCQkgICAgIHRha2VzIGFyZ3VtZW50cy4gICovCi0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgKCpvLT5wZm4pIChvLT5hcmcsIHQpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoby0+cHZhciAhPSBOVUxMKQotCQl7Ci0JCSAgaWYgKCEgdCAmJiBvLT5hcmcgPT0gby0+bm90YXJnKQotCQkgICAgYXNfYmFkIChfKCJvcHRpb24gYCVzJyBtYXkgbm90IGJlIG5lZ2F0ZWQiKSwgcyk7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgKm8tPnB2YXIgPSB0ID8gby0+YXJnIDogby0+bm90YXJnOwotCQl9Ci0JICAgICAgZWxzZQotCQkqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChpID49IE9QVENPVU5UKQotCXsKLQkgIGFzX2JhZCAoXygib3B0aW9uIGAlcycgbm90IHJlY29nbml6ZWQiKSwgcyk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgLyogTW92ZSBiYWNrIHRvIHRlcm1pbmF0aW5nIGNoYXJhY3Rlci4gICovCi0gIC0taW5wdXRfbGluZV9wb2ludGVyOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBTa2lwIGFoZWFkIHRvIGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIE9QVCBvcHRpb25zIHdoaWNoIHdlIGRvCi0gICBub3Qgc3VwcG9yIHRhbmQgd2hpY2ggdGFrZSBhcmd1bWVudHMuICAqLwotCi1zdGF0aWMgdm9pZAotc2tpcF90b19jb21tYSAoYXJnLCBvbikKLSAgICAgaW50IGFyZzsKLSAgICAgaW50IG9uOwotewotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcKLQkgJiYgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgT1BUIE5FU1Q9ZGVwdGggb3B0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wdF9uZXN0IChhcmcsIG9uKQotICAgICBpbnQgYXJnOwotICAgICBpbnQgb247Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCBmb3JtYXQgb2YgT1BUIE5FU1Q9ZGVwdGgiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBtYXhfbWFjcm9fbmVzdCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE9QVCBQPWNoaXAgb3B0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW9wdF9jaGlwIChhcmcsIG9uKQotICAgICBpbnQgYXJnOwotICAgICBpbnQgb247Ci17Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGp1c3QgT1BUIFAsIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0LiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIG1yaV9jaGlwICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE9QVCBTIG9wdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1vcHRfbGlzdCAoYXJnLCBvbikKLSAgICAgaW50IGFyZzsKLSAgICAgaW50IG9uOwotewotICBsaXN0aW5nX2xpc3QgKG9uKTsKLX0KLQotLyogSGFuZGxlIHRoZSBPUFQgVCBvcHRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotb3B0X2xpc3Rfc3ltYm9scyAoYXJnLCBvbikKLSAgICAgaW50IGFyZzsKLSAgICAgaW50IG9uOwotewotICBpZiAob24pCi0gICAgbGlzdGluZyB8PSBMSVNUSU5HX1NZTUJPTFM7Ci0gIGVsc2UKLSAgICBsaXN0aW5nICY9fiBMSVNUSU5HX1NZTUJPTFM7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIFJFRyBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19yZWcgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqczsKLSAgaW50IGM7Ci0gIHN0cnVjdCBtNjhrX29wIHJvcDsKLSAgaW50IG1hc2s7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmIChsaW5lX2xhYmVsID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGxhYmVsIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgcyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKQotI2lmZGVmIFJFR0lTVEVSX1BSRUZJWAotCSB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09IFJFR0lTVEVSX1BSRUZJWAotI2VuZGlmCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy8nCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0KLSAgaWYgKG02OGtfaXBfb3AgKHMsICZyb3ApICE9IDApCi0gICAgewotICAgICAgaWYgKHJvcC5lcnJvciA9PSBOVUxMKQotCWFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIGxpc3QiKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJiYWQgcmVnaXN0ZXIgbGlzdDogJXMiKSwgcm9wLmVycm9yKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKHJvcC5tb2RlID09IFJFR0xTVCkKLSAgICBtYXNrID0gcm9wLm1hc2s7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IERSRUcpCi0gICAgbWFzayA9IDEgPDwgKHJvcC5yZWcgLSBEQVRBMCk7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IEFSRUcpCi0gICAgbWFzayA9IDEgPDwgKHJvcC5yZWcgLSBBRERSMCArIDgpOwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBGUFJFRykKLSAgICBtYXNrID0gMSA8PCAocm9wLnJlZyAtIEZQMCArIDE2KTsKLSAgZWxzZSBpZiAocm9wLm1vZGUgPT0gQ09OVFJPTAotCSAgICYmIHJvcC5yZWcgPT0gRlBJKQotICAgIG1hc2sgPSAxIDw8IDI0OwotICBlbHNlIGlmIChyb3AubW9kZSA9PSBDT05UUk9MCi0JICAgJiYgcm9wLnJlZyA9PSBGUFMpCi0gICAgbWFzayA9IDEgPDwgMjU7Ci0gIGVsc2UgaWYgKHJvcC5tb2RlID09IENPTlRST0wKLQkgICAmJiByb3AucmVnID09IEZQQykKLSAgICBtYXNrID0gMSA8PCAyNjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYmFkIHJlZ2lzdGVyIGxpc3QiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBTX1NFVF9TRUdNRU5UIChsaW5lX2xhYmVsLCByZWdfc2VjdGlvbik7Ci0gIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCB+bWFzayk7Ci0gIHN5bWJvbF9zZXRfZnJhZyAobGluZV9sYWJlbCwgJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBmb3IgdGhlIE1SSSBTQVZFIGFuZCBSRVNUT1JFIHBzZXVkby1vcHMuICAqLwotCi1zdHJ1Y3Qgc2F2ZV9vcHRzCi17Ci0gIHN0cnVjdCBzYXZlX29wdHMgKm5leHQ7Ci0gIGludCBhYnNwY2FkZDsKLSAgaW50IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmU7Ci0gIGludCBrZWVwX2xvY2FsczsKLSAgaW50IHNob3J0X3JlZnM7Ci0gIGludCBhcmNoaXRlY3R1cmU7Ci0gIGludCBxdWljazsKLSAgaW50IHJlbDMyOwotICBpbnQgbGlzdGluZzsKLSAgaW50IG5vX3dhcm5pbmdzOwotICAvKiBGSVhNRTogV2UgZG9uJ3Qgc2F2ZSBPUFQgUy4gICovCi19OwotCi0vKiBUaGlzIHZhcmlhYmxlIGhvbGRzIHRoZSBzdGFjayBvZiBzYXZlZCBvcHRpb25zLiAgKi8KLQotc3RhdGljIHN0cnVjdCBzYXZlX29wdHMgKnNhdmVfc3RhY2s7Ci0KLS8qIFRoZSBNUkkgU0FWRSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19zYXZlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN0cnVjdCBzYXZlX29wdHMgKnM7Ci0KLSAgcyA9IChzdHJ1Y3Qgc2F2ZV9vcHRzICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNhdmVfb3B0cykpOwotICBzLT5hYnNwY2FkZCA9IG02OGtfYWJzcGNhZGQ7Ci0gIHMtPnN5bWJvbHNfY2FzZV9zZW5zaXRpdmUgPSBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlOwotICBzLT5rZWVwX2xvY2FscyA9IGZsYWdfa2VlcF9sb2NhbHM7Ci0gIHMtPnNob3J0X3JlZnMgPSBmbGFnX3Nob3J0X3JlZnM7Ci0gIHMtPmFyY2hpdGVjdHVyZSA9IGN1cnJlbnRfYXJjaGl0ZWN0dXJlOwotICBzLT5xdWljayA9IG02OGtfcXVpY2s7Ci0gIHMtPnJlbDMyID0gbTY4a19yZWwzMjsKLSAgcy0+bGlzdGluZyA9IGxpc3Rpbmc7Ci0gIHMtPm5vX3dhcm5pbmdzID0gZmxhZ19ub193YXJuaW5nczsKLQotICBzLT5uZXh0ID0gc2F2ZV9zdGFjazsKLSAgc2F2ZV9zdGFjayA9IHM7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIE1SSSBSRVNUT1JFIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3Jlc3RvcmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3RydWN0IHNhdmVfb3B0cyAqczsKLQotICBpZiAoc2F2ZV9zdGFjayA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygicmVzdG9yZSB3aXRob3V0IHNhdmUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzID0gc2F2ZV9zdGFjazsKLSAgc2F2ZV9zdGFjayA9IHMtPm5leHQ7Ci0KLSAgbTY4a19hYnNwY2FkZCA9IHMtPmFic3BjYWRkOwotICBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlID0gcy0+c3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLSAgZmxhZ19rZWVwX2xvY2FscyA9IHMtPmtlZXBfbG9jYWxzOwotICBmbGFnX3Nob3J0X3JlZnMgPSBzLT5zaG9ydF9yZWZzOwotICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IHMtPmFyY2hpdGVjdHVyZTsKLSAgbTY4a19xdWljayA9IHMtPnF1aWNrOwotICBtNjhrX3JlbDMyID0gcy0+cmVsMzI7Ci0gIGxpc3RpbmcgPSBzLT5saXN0aW5nOwotICBmbGFnX25vX3dhcm5pbmdzID0gcy0+bm9fd2FybmluZ3M7Ci0KLSAgZnJlZSAocyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVHlwZXMgb2YgTVJJIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmVzLiAgKi8KLQotZW51bSBtcmlfY29udHJvbF90eXBlCi17Ci0gIG1yaV9mb3IsCi0gIG1yaV9pZiwKLSAgbXJpX3JlcGVhdCwKLSAgbXJpX3doaWxlCi19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0YWNrIHRoZSBNUkkgc3RydWN0dXJlZCBjb250cm9sCi0gICBkaXJlY3RpdmVzLiAgKi8KLQotc3RydWN0IG1yaV9jb250cm9sX2luZm8KLXsKLSAgLyogVGhlIGRpcmVjdGl2ZSB3aXRoaW4gd2hpY2ggdGhpcyBvbmUgaXMgZW5jbG9zZWQuICAqLwotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqb3V0ZXI7Ci0KLSAgLyogVGhlIHR5cGUgb2YgZGlyZWN0aXZlLiAgKi8KLSAgZW51bSBtcmlfY29udHJvbF90eXBlIHR5cGU7Ci0KLSAgLyogV2hldGhlciBhbiBFTFNFIGhhcyBiZWVuIGluIGFuIElGLiAgKi8KLSAgaW50IGVsc2Vfc2VlbjsKLQotICAvKiBUaGUgYWRkIG9yIHN1YiBzdGF0ZW1lbnQgYXQgdGhlIGVuZCBvZiBhIEZPUi4gICovCi0gIGNoYXIgKmluY3I7Ci0KLSAgLyogVGhlIGxhYmVsIG9mIHRoZSB0b3Agb2YgYSBGT1Igb3IgUkVQRUFUIGxvb3AuICAqLwotICBjaGFyICp0b3A7Ci0KLSAgLyogVGhlIGxhYmVsIHRvIGp1bXAgdG8gZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbiwgb3IgdGhlIGVsc2UKLSAgICAgZXhwcmVzc2lvbiBvZiBhIGNvbmRpdGlvbmFsLiAgKi8KLSAgY2hhciAqbmV4dDsKLQotICAvKiBUaGUgbGFiZWwgdG8ganVtcCB0byB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG9yIHRoZSBsYWJlbCBwYXN0Ci0gICAgIHRoZSBlbmQgb2YgYSBjb25kaXRpb25hbC4gICovCi0gIGNoYXIgKmJvdHRvbTsKLX07Ci0KLS8qIFRoZSBzdGFjayBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm1yaV9jb250cm9sX3N0YWNrOwotCi0vKiBUaGUgY3VycmVudCBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSBpbmRleCBudW1iZXIsIHVzZWQgdG8KLSAgIGdlbmVyYXRlIGxhYmVsIG5hbWVzLiAgKi8KLQotc3RhdGljIGludCBtcmlfY29udHJvbF9pbmRleDsKLQotLyogU29tZSBmdW5jdGlvbiBwcm90b3R5cGVzLiAgKi8KLQotc3RhdGljIHZvaWQgbXJpX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIGNoYXIgKm1yaV9jb250cm9sX2xhYmVsIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqcHVzaF9tcmlfY29udHJvbAotICBQQVJBTVMgKChlbnVtIG1yaV9jb250cm9sX3R5cGUpKTsKLXN0YXRpYyB2b2lkIHBvcF9tcmlfY29udHJvbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IHBhcnNlX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50ICopKTsKLXN0YXRpYyBpbnQgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZAotICBQQVJBTVMgKChpbnQgKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKiwgY2hhciAqKikpOwotc3RhdGljIGludCBzd2FwX21yaV9jb25kaXRpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IHJldmVyc2VfbXJpX2NvbmRpdGlvbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQKLSAgUEFSQU1TICgoaW50LCBpbnQsIGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgY29uc3QgY2hhciAqLAotCSAgIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwYXJzZV9tcmlfY29udHJvbF9leHByZXNzaW9uCi0gIFBBUkFNUyAoKGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0KLS8qIEFzc2VtYmxlIGFuIGluc3RydWN0aW9uIGZvciBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1tcmlfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotCi0gIC8qIG1kX2Fzc2VtYmxlIGV4cGVjdHMgdGhlIG9wY29kZSB0byBiZSBpbiBsb3dlciBjYXNlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnICcgJiYgKnMgIT0gJ1wwJzsgcysrKQotICAgIHsKLSAgICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMpKQotCSpzID0gdG9sb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKTsKLSAgICB9Ci0KLSAgbWRfYXNzZW1ibGUgKHN0cik7Ci19Ci0KLS8qIEdlbmVyYXRlIGEgbmV3IE1SSSBsYWJlbCBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIGxhYmVsIG5hbWUuICAqLwotCi1zdGF0aWMgY2hhciAqCi1tcmlfY29udHJvbF9sYWJlbCAoKQotewotICBjaGFyICpuOwotCi0gIG4gPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIHNwcmludGYgKG4sICIlc21jJWQiLCBGQUtFX0xBQkVMX05BTUUsIG1yaV9jb250cm9sX2luZGV4KTsKLSAgKyttcmlfY29udHJvbF9pbmRleDsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIENyZWF0ZSBhIG5ldyBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqCi1wdXNoX21yaV9jb250cm9sICh0eXBlKQotICAgICBlbnVtIG1yaV9jb250cm9sX3R5cGUgdHlwZTsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgbiA9IChzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtcmlfY29udHJvbF9pbmZvKSk7Ci0KLSAgbi0+dHlwZSA9IHR5cGU7Ci0gIG4tPmVsc2Vfc2VlbiA9IDA7Ci0gIGlmICh0eXBlID09IG1yaV9pZiB8fCB0eXBlID09IG1yaV93aGlsZSkKLSAgICBuLT50b3AgPSBOVUxMOwotICBlbHNlCi0gICAgbi0+dG9wID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0gIG4tPm5leHQgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLSAgbi0+Ym90dG9tID0gbXJpX2NvbnRyb2xfbGFiZWwgKCk7Ci0KLSAgbi0+b3V0ZXIgPSBtcmlfY29udHJvbF9zdGFjazsKLSAgbXJpX2NvbnRyb2xfc3RhY2sgPSBuOwotCi0gIHJldHVybiBuOwotfQotCi0vKiBQb3Agb2ZmIHRoZSBzdGFjayBvZiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcG9wX21yaV9jb250cm9sICgpCi17Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotCi0gIG4gPSBtcmlfY29udHJvbF9zdGFjazsKLSAgbXJpX2NvbnRyb2xfc3RhY2sgPSBuLT5vdXRlcjsKLSAgaWYgKG4tPnRvcCAhPSBOVUxMKQotICAgIGZyZWUgKG4tPnRvcCk7Ci0gIGZyZWUgKG4tPm5leHQpOwotICBmcmVlIChuLT5ib3R0b20pOwotICBmcmVlIChuKTsKLX0KLQotLyogUmVjb2duaXplIGEgY29uZGl0aW9uIGNvZGUgaW4gYW4gTVJJIHN0cnVjdHVyZWQgY29udHJvbCBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIGludAotcGFyc2VfbXJpX2NvbmRpdGlvbiAocGNjKQotICAgICBpbnQgKnBjYzsKLXsKLSAgY2hhciBjMSwgYzI7Ci0KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnPCcpOwotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBjMSA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgYzIgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz4nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIHN0cnVjdHVyZWQgY29udHJvbCBkaXJlY3RpdmUiKSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoaXN1cHBlciAoYzEpKQotICAgIGMxID0gdG9sb3dlciAoYzEpOwotICBpZiAoaXN1cHBlciAoYzIpKQotICAgIGMyID0gdG9sb3dlciAoYzIpOwotCi0gICpwY2MgPSAoYzEgPDwgOCkgfCBjMjsKLQotICByZXR1cm4gMTsKLX0KLQotLyogUGFyc2UgYSBzaW5nbGUgb3BlcmFuZCBpbiBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9tcmlfY29udHJvbF9vcGVyYW5kIChwY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsIHJpZ2h0c3RvcCkKLSAgICAgaW50ICpwY2M7Ci0gICAgIGNoYXIgKipsZWZ0c3RhcnQ7Ci0gICAgIGNoYXIgKipsZWZ0c3RvcDsKLSAgICAgY2hhciAqKnJpZ2h0c3RhcnQ7Ci0gICAgIGNoYXIgKipyaWdodHN0b3A7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gICpwY2MgPSAtMTsKLSAgKmxlZnRzdGFydCA9IE5VTEw7Ci0gICpsZWZ0c3RvcCA9IE5VTEw7Ci0gICpyaWdodHN0YXJ0ID0gTlVMTDsKLSAgKnJpZ2h0c3RvcCA9IE5VTEw7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzwnKQotICAgIHsKLSAgICAgIC8qIEl0J3MganVzdCBhIGNvbmRpdGlvbiBjb2RlLiAgKi8KLSAgICAgIHJldHVybiBwYXJzZV9tcmlfY29uZGl0aW9uIChwY2MpOwotICAgIH0KLQotICAvKiBMb29rIGFoZWFkIGZvciB0aGUgY29uZGl0aW9uIGNvZGUuICAqLwotICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7ICpzICE9ICdcMCc7ICsrcykKLSAgICB7Ci0gICAgICBpZiAoKnMgPT0gJzwnICYmIHNbMV0gIT0gJ1wwJyAmJiBzWzJdICE9ICdcMCcgJiYgc1szXSA9PSAnPicpCi0JYnJlYWs7Ci0gICAgfQotICBpZiAoKnMgPT0gJ1wwJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgY29uZGl0aW9uIGNvZGUgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAqbGVmdHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqbGVmdHN0b3AgPSBzOwotICBpZiAoKmxlZnRzdG9wID4gKmxlZnRzdGFydAotICAgICAgJiYgKCgqbGVmdHN0b3ApWy0xXSA9PSAnICcgfHwgKCpsZWZ0c3RvcClbLTFdID09ICdcdCcpKQotICAgIC0tKmxlZnRzdG9wOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGlmICghIHBhcnNlX21yaV9jb25kaXRpb24gKHBjYykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogTG9vayBhaGVhZCBmb3IgQU5EIG9yIE9SIG9yIGVuZCBvZiBsaW5lLiAgKi8KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAqcyAhPSAnXDAnOyArK3MpCi0gICAgewotICAgICAgaWYgKChzdHJuY2FzZWNtcCAocywgIkFORCIsIDMpID09IDAKLQkgICAmJiAoc1szXSA9PSAnLicgfHwgISBpc19wYXJ0X29mX25hbWUgKHNbM10pKSkKLQkgIHx8IChzdHJuY2FzZWNtcCAocywgIk9SIiwgMikgPT0gMAotCSAgICAgICYmIChzWzJdID09ICcuJyB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoc1syXSkpKSkKLQlicmVhazsKLSAgICB9Ci0KLSAgKnJpZ2h0c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpyaWdodHN0b3AgPSBzOwotICBpZiAoKnJpZ2h0c3RvcCA+ICpyaWdodHN0YXJ0Ci0gICAgICAmJiAoKCpyaWdodHN0b3ApWy0xXSA9PSAnICcgfHwgKCpyaWdodHN0b3ApWy0xXSA9PSAnXHQnKSkKLSAgICAtLSpyaWdodHN0b3A7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICByZXR1cm4gMTsKLX0KLQotI2RlZmluZSBNQ0MoYjEsIGIyKSAoKChiMSkgPDwgOCkgfCAoYjIpKQotCi0vKiBTd2FwIHRoZSBzZW5zZSBvZiBhIGNvbmRpdGlvbi4gIFRoaXMgY2hhbmdlcyB0aGUgY29uZGl0aW9uIHNvIHRoYXQKLSAgIGl0IGdlbmVyYXRlcyB0aGUgc2FtZSByZXN1bHQgd2hlbiB0aGUgb3BlcmFuZHMgYXJlIHN3YXBwZWQuICAqLwotCi1zdGF0aWMgaW50Ci1zd2FwX21yaV9jb25kaXRpb24gKGNjKQotICAgICBpbnQgY2M7Ci17Ci0gIHN3aXRjaCAoY2MpCi0gICAgewotICAgIGNhc2UgTUNDICgnaCcsICdpJyk6IHJldHVybiBNQ0MgKCdjJywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAncycpOiByZXR1cm4gTUNDICgnYycsICdjJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ2MnKTogcmV0dXJuIE1DQyAoJ2wnLCAncycpOwotICAgIGNhc2UgTUNDICgnYycsICdzJyk6IHJldHVybiBNQ0MgKCdoJywgJ2knKTsKLSAgICBjYXNlIE1DQyAoJ3AnLCAnbCcpOiByZXR1cm4gTUNDICgnbScsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdtJywgJ2knKTogcmV0dXJuIE1DQyAoJ3AnLCAnbCcpOwotICAgIGNhc2UgTUNDICgnZycsICdlJyk6IHJldHVybiBNQ0MgKCdsJywgJ2UnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAndCcpOiByZXR1cm4gTUNDICgnZycsICd0Jyk7Ci0gICAgY2FzZSBNQ0MgKCdnJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2wnLCAndCcpOwotICAgIGNhc2UgTUNDICgnbCcsICdlJyk6IHJldHVybiBNQ0MgKCdnJywgJ2UnKTsKLSAgICB9Ci0gIHJldHVybiBjYzsKLX0KLQotLyogUmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgYSBjb25kaXRpb24uICAqLwotCi1zdGF0aWMgaW50Ci1yZXZlcnNlX21yaV9jb25kaXRpb24gKGNjKQotICAgICBpbnQgY2M7Ci17Ci0gIHN3aXRjaCAoY2MpCi0gICAgewotICAgIGNhc2UgTUNDICgnaCcsICdpJyk6IHJldHVybiBNQ0MgKCdsJywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAncycpOiByZXR1cm4gTUNDICgnaCcsICdpJyk7Ci0gICAgY2FzZSBNQ0MgKCdjJywgJ2MnKTogcmV0dXJuIE1DQyAoJ2MnLCAncycpOwotICAgIGNhc2UgTUNDICgnYycsICdzJyk6IHJldHVybiBNQ0MgKCdjJywgJ2MnKTsKLSAgICBjYXNlIE1DQyAoJ24nLCAnZScpOiByZXR1cm4gTUNDICgnZScsICdxJyk7Ci0gICAgY2FzZSBNQ0MgKCdlJywgJ3EnKTogcmV0dXJuIE1DQyAoJ24nLCAnZScpOwotICAgIGNhc2UgTUNDICgndicsICdjJyk6IHJldHVybiBNQ0MgKCd2JywgJ3MnKTsKLSAgICBjYXNlIE1DQyAoJ3YnLCAncycpOiByZXR1cm4gTUNDICgndicsICdjJyk7Ci0gICAgY2FzZSBNQ0MgKCdwJywgJ2wnKTogcmV0dXJuIE1DQyAoJ20nLCAnaScpOwotICAgIGNhc2UgTUNDICgnbScsICdpJyk6IHJldHVybiBNQ0MgKCdwJywgJ2wnKTsKLSAgICBjYXNlIE1DQyAoJ2cnLCAnZScpOiByZXR1cm4gTUNDICgnbCcsICd0Jyk7Ci0gICAgY2FzZSBNQ0MgKCdsJywgJ3QnKTogcmV0dXJuIE1DQyAoJ2cnLCAnZScpOwotICAgIGNhc2UgTUNDICgnZycsICd0Jyk6IHJldHVybiBNQ0MgKCdsJywgJ2UnKTsKLSAgICBjYXNlIE1DQyAoJ2wnLCAnZScpOiByZXR1cm4gTUNDICgnZycsICd0Jyk7Ci0gICAgfQotICByZXR1cm4gY2M7Ci19Ci0KLS8qIEJ1aWxkIGFuIE1SSSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZXhwcmVzc2lvbi4gIFRoaXMgZ2VuZXJhdGVzIHRlc3QKLSAgIGFuZCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgSXQgZ29lcyB0byBUUlVFTEFCIGlmIHRoZSBjb25kaXRpb24gaXMKLSAgIHRydWUsIGFuZCB0byBGQUxTRUxBQiBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLiAgRXhhY3RseSBvbmUgb2YKLSAgIFRSVUVMQUIgYW5kIEZBTFNFTEFCIHdpbGwgYmUgTlVMTCwgbWVhbmluZyB0byBmYWxsIHRocm91Z2guICBRVUFMCi0gICBpcyB0aGUgc2l6ZSBxdWFsaWZpZXIgZm9yIHRoZSBleHByZXNzaW9uLiAgRVhURU5UIGlzIHRoZSBzaXplIHRvCi0gICB1c2UgZm9yIHRoZSBicmFuY2guICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkgICByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpCi0gICAgIGludCBxdWFsOwotICAgICBpbnQgY2M7Ci0gICAgIGNoYXIgKmxlZnRzdGFydDsKLSAgICAgY2hhciAqbGVmdHN0b3A7Ci0gICAgIGNoYXIgKnJpZ2h0c3RhcnQ7Ci0gICAgIGNoYXIgKnJpZ2h0c3RvcDsKLSAgICAgY29uc3QgY2hhciAqdHJ1ZWxhYjsKLSAgICAgY29uc3QgY2hhciAqZmFsc2VsYWI7Ci0gICAgIGludCBleHRlbnQ7Ci17Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqczsKLQotICBpZiAobGVmdHN0YXJ0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG02OGtfb3AgbGVmdG9wLCByaWdodG9wOwotICAgICAgY2hhciBjOwotCi0gICAgICAvKiBTd2FwIHRoZSBjb21wYXJlIG9wZXJhbmRzLCBpZiBuZWNlc3NhcnksIHRvIHByb2R1Y2UgYSBsZWdhbAotCSBtNjhrIGNvbXBhcmUgaW5zdHJ1Y3Rpb24uICBDb21wYXJpbmcgYSByZWdpc3RlciBvcGVyYW5kIHdpdGgKLQkgYSBub24tcmVnaXN0ZXIgb3BlcmFuZCByZXF1aXJlcyB0aGUgcmVnaXN0ZXIgdG8gYmUgb24gdGhlCi0JIHJpZ2h0IChjbXAsIGNtcGEpLiAgQ29tcGFyaW5nIGFuIGltbWVkaWF0ZSB2YWx1ZSB3aXRoCi0JIGFueXRoaW5nIHJlcXVpcmVzIHRoZSBpbW1lZGlhdGUgdmFsdWUgdG8gYmUgb24gdGhlIGxlZnQKLQkgKGNtcGkpLiAgKi8KLQotICAgICAgYyA9ICpsZWZ0c3RvcDsKLSAgICAgICpsZWZ0c3RvcCA9ICdcMCc7Ci0gICAgICAodm9pZCkgbTY4a19pcF9vcCAobGVmdHN0YXJ0LCAmbGVmdG9wKTsKLSAgICAgICpsZWZ0c3RvcCA9IGM7Ci0KLSAgICAgIGMgPSAqcmlnaHRzdG9wOwotICAgICAgKnJpZ2h0c3RvcCA9ICdcMCc7Ci0gICAgICAodm9pZCkgbTY4a19pcF9vcCAocmlnaHRzdGFydCwgJnJpZ2h0b3ApOwotICAgICAgKnJpZ2h0c3RvcCA9IGM7Ci0KLSAgICAgIGlmIChyaWdodG9wLm1vZGUgPT0gSU1NRUQKLQkgIHx8ICgobGVmdG9wLm1vZGUgPT0gRFJFRyB8fCBsZWZ0b3AubW9kZSA9PSBBUkVHKQotCSAgICAgICYmIChyaWdodG9wLm1vZGUgIT0gRFJFRyAmJiByaWdodG9wLm1vZGUgIT0gQVJFRykpKQotCXsKLQkgIGNoYXIgKnRlbXA7Ci0KLQkgIGNjID0gc3dhcF9tcmlfY29uZGl0aW9uIChjYyk7Ci0JICB0ZW1wID0gbGVmdHN0YXJ0OwotCSAgbGVmdHN0YXJ0ID0gcmlnaHRzdGFydDsKLQkgIHJpZ2h0c3RhcnQgPSB0ZW1wOwotCSAgdGVtcCA9IGxlZnRzdG9wOwotCSAgbGVmdHN0b3AgPSByaWdodHN0b3A7Ci0JICByaWdodHN0b3AgPSB0ZW1wOwotCX0KLSAgICB9Ci0KLSAgaWYgKHRydWVsYWIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBjYyA9IHJldmVyc2VfbXJpX2NvbmRpdGlvbiAoY2MpOwotICAgICAgdHJ1ZWxhYiA9IGZhbHNlbGFiOwotICAgIH0KLSAgICAgIAotICBpZiAobGVmdHN0YXJ0ICE9IE5VTEwpCi0gICAgewotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAKLQkJCSAgICAgICsgKGxlZnRzdG9wIC0gbGVmdHN0YXJ0KQotCQkJICAgICAgKyAocmlnaHRzdG9wIC0gcmlnaHRzdGFydCkpOwotICAgICAgcyA9IGJ1ZjsKLSAgICAgICpzKysgPSAnYyc7Ci0gICAgICAqcysrID0gJ20nOwotICAgICAgKnMrKyA9ICdwJzsKLSAgICAgIGlmIChxdWFsICE9ICdcMCcpCi0JKnMrKyA9IHF1YWw7Ci0gICAgICAqcysrID0gJyAnOwotICAgICAgbWVtY3B5IChzLCBsZWZ0c3RhcnQsIGxlZnRzdG9wIC0gbGVmdHN0YXJ0KTsKLSAgICAgIHMgKz0gbGVmdHN0b3AgLSBsZWZ0c3RhcnQ7Ci0gICAgICAqcysrID0gJywnOwotICAgICAgbWVtY3B5IChzLCByaWdodHN0YXJ0LCByaWdodHN0b3AgLSByaWdodHN0YXJ0KTsKLSAgICAgIHMgKz0gcmlnaHRzdG9wIC0gcmlnaHRzdGFydDsKLSAgICAgICpzID0gJ1wwJzsKLSAgICAgIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgfQotICAgICAgCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuICh0cnVlbGFiKSk7Ci0gIHMgPSBidWY7Ci0gICpzKysgPSAnYic7Ci0gICpzKysgPSBjYyA+PiA4OwotICAqcysrID0gY2MgJiAweGZmOwotICBpZiAoZXh0ZW50ICE9ICdcMCcpCi0gICAgKnMrKyA9IGV4dGVudDsKLSAgKnMrKyA9ICcgJzsKLSAgc3RyY3B5IChzLCB0cnVlbGFiKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotfQotCi0vKiBQYXJzZSBhbiBNUkkgc3RydWN0dXJlZCBjb250cm9sIGV4cHJlc3Npb24uICBUaGlzIGdlbmVyYXRlcyB0ZXN0Ci0gICBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4gIFNUT1AgaXMgd2hlcmUgdGhlIGV4cHJlc3Npb24gZW5kcy4gIEl0Ci0gICBnb2VzIHRvIFRSVUVMQUIgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBhbmQgdG8gRkFMU0VMQUIgaWYgdGhlCi0gICBjb25kaXRpb24gaXMgZmFsc2UuICBFeGFjdGx5IG9uZSBvZiBUUlVFTEFCIGFuZCBGQUxTRUxBQiB3aWxsIGJlCi0gICBOVUxMLCBtZWFuaW5nIHRvIGZhbGwgdGhyb3VnaC4gIFFVQUwgaXMgdGhlIHNpemUgcXVhbGlmaWVyIGZvciB0aGUKLSAgIGV4cHJlc3Npb24uICBFWFRFTlQgaXMgdGhlIHNpemUgdG8gdXNlIGZvciB0aGUgYnJhbmNoLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHN0b3AsIHF1YWwsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpCi0gICAgIGNoYXIgKnN0b3A7Ci0gICAgIGludCBxdWFsOwotICAgICBjb25zdCBjaGFyICp0cnVlbGFiOwotICAgICBjb25zdCBjaGFyICpmYWxzZWxhYjsKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgaW50IGM7Ci0gIGludCBjYzsKLSAgY2hhciAqbGVmdHN0YXJ0OwotICBjaGFyICpsZWZ0c3RvcDsKLSAgY2hhciAqcmlnaHRzdGFydDsKLSAgY2hhciAqcmlnaHRzdG9wOwotCi0gIGMgPSAqc3RvcDsKLSAgKnN0b3AgPSAnXDAnOwotCi0gIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAotCQkJCSAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKLSAgICB7Ci0gICAgICAqc3RvcCA9IGM7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQU5EIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpmbGFiOwotCi0gICAgICBpZiAoZmFsc2VsYWIgIT0gTlVMTCkKLQlmbGFiID0gZmFsc2VsYWI7Ci0gICAgICBlbHNlCi0JZmxhYiA9IG1yaV9jb250cm9sX2xhYmVsICgpOwotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCAoY29uc3QgY2hhciAqKSBOVUxMLCBmbGFiLCBleHRlbnQpOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMzsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcuJwotCSAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdcMCcpCi0JcXVhbCA9ICdcMCc7Ci0gICAgICBlbHNlCi0JewotCSAgcXVhbCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCX0KLQotICAgICAgaWYgKCEgcGFyc2VfbXJpX2NvbnRyb2xfb3BlcmFuZCAoJmNjLCAmbGVmdHN0YXJ0LCAmbGVmdHN0b3AsCi0JCQkJICAgICAgICZyaWdodHN0YXJ0LCAmcmlnaHRzdG9wKSkKLQl7Ci0JICAqc3RvcCA9IGM7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBidWlsZF9tcmlfY29udHJvbF9vcGVyYW5kIChxdWFsLCBjYywgbGVmdHN0YXJ0LCBsZWZ0c3RvcCwgcmlnaHRzdGFydCwKLQkJCQkgcmlnaHRzdG9wLCB0cnVlbGFiLCBmYWxzZWxhYiwgZXh0ZW50KTsKLQotICAgICAgaWYgKGZhbHNlbGFiID09IE5VTEwpCi0JY29sb24gKGZsYWIpOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIk9SIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICp0bGFiOwotCi0gICAgICBpZiAodHJ1ZWxhYiAhPSBOVUxMKQotCXRsYWIgPSB0cnVlbGFiOwotICAgICAgZWxzZQotCXRsYWIgPSBtcmlfY29udHJvbF9sYWJlbCAoKTsKLQotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdGxhYiwgKGNvbnN0IGNoYXIgKikgTlVMTCwgZXh0ZW50KTsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicKLQkgIHx8IGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAnXDAnKQotCXF1YWwgPSAnXDAnOwotICAgICAgZWxzZQotCXsKLQkgIHF1YWwgPSBpbnB1dF9saW5lX3BvaW50ZXJbMV07Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQl9Ci0KLSAgICAgIGlmICghIHBhcnNlX21yaV9jb250cm9sX29wZXJhbmQgKCZjYywgJmxlZnRzdGFydCwgJmxlZnRzdG9wLAotCQkJCSAgICAgICAmcmlnaHRzdGFydCwgJnJpZ2h0c3RvcCkpCi0JewotCSAgKnN0b3AgPSBjOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYnVpbGRfbXJpX2NvbnRyb2xfb3BlcmFuZCAocXVhbCwgY2MsIGxlZnRzdGFydCwgbGVmdHN0b3AsIHJpZ2h0c3RhcnQsCi0JCQkJIHJpZ2h0c3RvcCwgdHJ1ZWxhYiwgZmFsc2VsYWIsIGV4dGVudCk7Ci0KLSAgICAgIGlmICh0cnVlbGFiID09IE5VTEwpCi0JY29sb24gKHRsYWIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1aWxkX21yaV9jb250cm9sX29wZXJhbmQgKHF1YWwsIGNjLCBsZWZ0c3RhcnQsIGxlZnRzdG9wLCByaWdodHN0YXJ0LAotCQkJCSByaWdodHN0b3AsIHRydWVsYWIsIGZhbHNlbGFiLCBleHRlbnQpOwotICAgIH0KLQotICAqc3RvcCA9IGM7Ci0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXIgIT0gc3RvcCkKLSAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIikpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBJRiBwc2V1ZG8tb3AuICBUaGlzIG1heSBiZSBhIHN0cnVjdHVyZWQgY29udHJvbAotICAgZGlyZWN0aXZlLCBvciBpdCBtYXkgYmUgYSByZWd1bGFyIGFzc2VtYmxlciBjb25kaXRpb25hbCwgZGVwZW5kaW5nCi0gICBvbiBpdHMgb3BlcmFuZHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfaWYgKHF1YWwpCi0gICAgIGludCBxdWFsOwotewotICBjaGFyICpzOwotICBpbnQgYzsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgLyogQSBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIG11c3QgZW5kIHdpdGggVEhFTiB3aXRoIGFuCi0gICAgIG9wdGlvbmFsIHF1YWxpZmllci4gICovCi0gIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc10KLQkgJiYgKCEgZmxhZ19tcmkgfHwgKnMgIT0gJyonKSkKLSAgICArK3M7Ci0gIC0tczsKLSAgd2hpbGUgKHMgPiBpbnB1dF9saW5lX3BvaW50ZXIgJiYgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSkKLSAgICAtLXM7Ci0KLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPiAxCi0gICAgICAmJiBzWy0xXSA9PSAnLicpCi0gICAgcyAtPSAyOwotCi0gIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyIDwgMwotICAgICAgfHwgc3RybmNhc2VjbXAgKHMgLSAzLCAiVEhFTiIsIDQpICE9IDApCi0gICAgewotICAgICAgaWYgKHF1YWwgIT0gJ1wwJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgdGhlbiIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBJdCdzIGEgY29uZGl0aW9uYWwuICAqLwotICAgICAgc19pZiAoT19uZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNpbmNlIHRoaXMgbWlnaHQgYmUgYSBjb25kaXRpb25hbCBpZiwgdGhpcyBwc2V1ZG8tb3Agd2lsbCBiZQotICAgICBjYWxsZWQgZXZlbiBpZiB3ZSBhcmUgc3VwcG9ydGVkIHRvIGJlIGlnbm9yaW5nIGlucHV0LiAgRG91YmxlCi0gICAgIGNoZWNrIG5vdy4gIENsb2JiZXIgKmlucHV0X2xpbmVfcG9pbnRlciBzbyB0aGF0IGlnbm9yZV9pbnB1dAotICAgICB0aGlua3MgdGhhdCB0aGlzIGlzIG5vdCBhIHNwZWNpYWwgcHNldWRvLW9wLiAgKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSAwOwotICBpZiAoaWdub3JlX2lucHV0ICgpKQotICAgIHsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIG4gPSBwdXNoX21yaV9jb250cm9sIChtcmlfaWYpOwotCi0gIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMgLSAzLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCW4tPm5leHQsIHNbMV0gPT0gJy4nID8gc1syXSA6ICdcMCcpOwotCi0gIGlmIChzWzFdID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzICsgMzsKLSAgZWxzZQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHMgKyAxOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIGVsc2UgcHNldWRvLW9wLiAgSWYgd2UgYXJlIGN1cnJlbnRseSBkb2luZyBhbiBNUkkKLSAgIHN0cnVjdHVyZWQgSUYsIGFzc29jaWF0ZSB0aGUgRUxTRSB3aXRoIHRoZSBJRi4gIE90aGVyd2lzZSwgYXNzdW1lCi0gICBpdCBpcyBhIGNvbmRpdGlvbmFsIGVsc2UuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZWxzZSAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGludCBjOwotICBjaGFyICpidWY7Ci0gIGNoYXIgcVsyXTsKLQotICBpZiAocXVhbCA9PSAnXDAnCi0gICAgICAmJiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotCSAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmCi0JICB8fCBtcmlfY29udHJvbF9zdGFjay0+ZWxzZV9zZWVuKSkKLSAgICB7Ci0gICAgICBzX2Vsc2UgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IDA7Ci0gIGlmIChpZ25vcmVfaW5wdXQgKCkpCi0gICAgewotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9pZgotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPmVsc2Vfc2VlbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImVsc2Ugd2l0aG91dCBtYXRjaGluZyBpZiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4gPSAxOwotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKSk7Ci0gIHFbMF0gPSBxdWFsOwotICBxWzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBxLCBtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgRU5ESSBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfZW5kaSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX2lmKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kaSB3aXRob3V0IG1hdGNoaW5nIGlmIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogaWdub3JlX2lucHV0IHdpbGwgbm90IHJldHVybiB0cnVlIGZvciBFTkRJLCBzbyB3ZSBkb24ndCBuZWVkIHRvCi0gICAgIHdvcnJ5IGFib3V0IGNoZWNraW5nIGl0IGFnYWluIGhlcmUuICAqLwotCi0gIGlmICghIG1yaV9jb250cm9sX3N0YWNrLT5lbHNlX3NlZW4pCi0gICAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLSAgY29sb24gKG1yaV9jb250cm9sX3N0YWNrLT5ib3R0b20pOwotCi0gIHBvcF9tcmlfY29udHJvbCAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBCUkVBSyBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19tcmlfYnJlYWsgKGV4dGVudCkKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBleFsyXTsKLQotICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7Ci0gIHdoaWxlIChuICE9IE5VTEwKLQkgJiYgbi0+dHlwZSAhPSBtcmlfZm9yCi0JICYmIG4tPnR5cGUgIT0gbXJpX3JlcGVhdAotCSAmJiBuLT50eXBlICE9IG1yaV93aGlsZSkKLSAgICBuID0gbi0+b3V0ZXI7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJicmVhayBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKDIwICsgc3RybGVuIChuLT5ib3R0b20pKTsKLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBleCwgbi0+Ym90dG9tKTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIE5FWFQgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX25leHQgKGV4dGVudCkKLSAgICAgaW50IGV4dGVudDsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciBleFsyXTsKLQotICBuID0gbXJpX2NvbnRyb2xfc3RhY2s7Ci0gIHdoaWxlIChuICE9IE5VTEwKLQkgJiYgbi0+dHlwZSAhPSBtcmlfZm9yCi0JICYmIG4tPnR5cGUgIT0gbXJpX3JlcGVhdAotCSAmJiBuLT50eXBlICE9IG1yaV93aGlsZSkKLSAgICBuID0gbi0+b3V0ZXI7Ci0gIGlmIChuID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJuZXh0IG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG4tPm5leHQpKTsKLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgc3ByaW50ZiAoYnVmLCAiYnJhJXMgJXMiLCBleCwgbi0+bmV4dCk7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBGT1IgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX2ZvciAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNvbnN0IGNoYXIgKnZhcnN0YXJ0LCAqdmFyc3RvcDsKLSAgY29uc3QgY2hhciAqaW5pdHN0YXJ0LCAqaW5pdHN0b3A7Ci0gIGNvbnN0IGNoYXIgKmVuZHN0YXJ0LCAqZW5kc3RvcDsKLSAgY29uc3QgY2hhciAqYnlzdGFydCwgKmJ5c3RvcDsKLSAgaW50IHVwOwotICBpbnQgYnk7Ci0gIGludCBleHRlbnQ7Ci0gIHN0cnVjdCBtcmlfY29udHJvbF9pbmZvICpuOwotICBjaGFyICpidWY7Ci0gIGNoYXIgKnM7Ci0gIGNoYXIgZXhbMl07Ci0KLSAgLyogVGhlIHN5bnRheCBpcwotICAgICAgIEZPUi5xIHZhciA9IGluaXQgeyBUTyB8IERPV05UTyB9IGVuZCBbIEJZIGJ5IF0gRE8uZQotICAgICAqLwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgdmFyc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogTG9vayBmb3IgdGhlICc9Jy4gICovCi0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCSAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICc9JykKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJz0nKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyA9IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdmFyc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKHZhcnN0b3AgPiB2YXJzdGFydAotICAgICAgJiYgKHZhcnN0b3BbLTFdID09ICcgJyB8fCB2YXJzdG9wWy0xXSA9PSAnXHQnKSkKLSAgICAtLXZhcnN0b3A7Ci0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaW5pdHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIExvb2sgZm9yIFRPIG9yIERPV05UTy4gICovCi0gIHVwID0gMTsKLSAgaW5pdHN0b3AgPSBOVUxMOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJUTyIsIDIpID09IDAKLQkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKQotCXsKLQkgIGluaXRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPV05UTyIsIDYpID09IDAKLQkgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbNl0pKQotCXsKLQkgIGluaXRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgdXAgPSAwOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGlmIChpbml0c3RvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB0byBvciBkb3dudG8iKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKGluaXRzdG9wID4gaW5pdHN0YXJ0Ci0gICAgICAmJiAoaW5pdHN0b3BbLTFdID09ICcgJyB8fCBpbml0c3RvcFstMV0gPT0gJ1x0JykpCi0gICAgLS1pbml0c3RvcDsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGVuZHN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIExvb2sgZm9yIEJZIG9yIERPLiAgKi8KLSAgYnkgPSAwOwotICBlbmRzdG9wID0gTlVMTDsKLSAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiQlkiLCAyKSA9PSAwCi0JICAmJiAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkKLQl7Ci0JICBlbmRzdG9wID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgYnkgPSAxOwotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIkRPIiwgMikgPT0gMAotCSAgJiYgKGlucHV0X2xpbmVfcG9pbnRlclsyXSA9PSAnLicKLQkgICAgICB8fCAhIGlzX3BhcnRfb2ZfbmFtZSAoaW5wdXRfbGluZV9wb2ludGVyWzJdKSkpCi0JewotCSAgZW5kc3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCSAgYnJlYWs7Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotICBpZiAoZW5kc3RvcCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoZW5kc3RvcCA+IGVuZHN0YXJ0Ci0gICAgICAmJiAoZW5kc3RvcFstMV0gPT0gJyAnIHx8IGVuZHN0b3BbLTFdID09ICdcdCcpKQotICAgIC0tZW5kc3RvcDsKLQotICBpZiAoISBieSkKLSAgICB7Ci0gICAgICBieXN0YXJ0ID0gIiMxIjsKLSAgICAgIGJ5c3RvcCA9IGJ5c3RhcnQgKyAyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGJ5c3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIC8qIExvb2sgZm9yIERPLiAgKi8KLSAgICAgIGJ5c3RvcCA9IE5VTEw7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaWYgKHN0cm5jYXNlY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJETyIsIDIpID09IDAKLQkgICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJwotCQkgIHx8ICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbMl0pKSkKLQkgICAgewotCSAgICAgIGJ5c3RvcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotICAgICAgaWYgKGJ5c3RvcCA9PSBOVUxMKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyBkbyIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGJ5c3RvcCA+IGJ5c3RhcnQKLQkgICYmIChieXN0b3BbLTFdID09ICcgJyB8fCBieXN0b3BbLTFdID09ICdcdCcpKQotCS0tYnlzdG9wOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLicpCi0gICAgZXh0ZW50ID0gJ1wwJzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGV4dGVudCA9IGlucHV0X2xpbmVfcG9pbnRlclsxXTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgIH0KLQotICAvKiBXZSBoYXZlIGZ1bGx5IHBhcnNlZCB0aGUgRk9SIG9wZXJhbmRzLiAgTm93IGJ1aWxkIHRoZSBsb29wLiAgKi8KLQotICBuID0gcHVzaF9tcmlfY29udHJvbCAobXJpX2Zvcik7Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoNTAgKyAoaW5wdXRfbGluZV9wb2ludGVyIC0gdmFyc3RhcnQpKTsKLQotICAvKiBtb3ZlIGluaXQsdmFyICovCi0gIHMgPSBidWY7Ci0gICpzKysgPSAnbSc7Ci0gICpzKysgPSAnbyc7Ci0gICpzKysgPSAndic7Ci0gICpzKysgPSAnZSc7Ci0gIGlmIChxdWFsICE9ICdcMCcpCi0gICAgKnMrKyA9IHF1YWw7Ci0gICpzKysgPSAnICc7Ci0gIG1lbWNweSAocywgaW5pdHN0YXJ0LCBpbml0c3RvcCAtIGluaXRzdGFydCk7Ci0gIHMgKz0gaW5pdHN0b3AgLSBpbml0c3RhcnQ7Ci0gICpzKysgPSAnLCc7Ci0gIG1lbWNweSAocywgdmFyc3RhcnQsIHZhcnN0b3AgLSB2YXJzdGFydCk7Ci0gIHMgKz0gdmFyc3RvcCAtIHZhcnN0YXJ0OwotICAqcyA9ICdcMCc7Ci0gIG1yaV9hc3NlbWJsZSAoYnVmKTsKLQotICBjb2xvbiAobi0+dG9wKTsKLQotICAvKiBjbXAgZW5kLHZhciAqLwotICBzID0gYnVmOwotICAqcysrID0gJ2MnOwotICAqcysrID0gJ20nOwotICAqcysrID0gJ3AnOwotICBpZiAocXVhbCAhPSAnXDAnKQotICAgICpzKysgPSBxdWFsOwotICAqcysrID0gJyAnOwotICBtZW1jcHkgKHMsIGVuZHN0YXJ0LCBlbmRzdG9wIC0gZW5kc3RhcnQpOwotICBzICs9IGVuZHN0b3AgLSBlbmRzdGFydDsKLSAgKnMrKyA9ICcsJzsKLSAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKLSAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7Ci0gICpzID0gJ1wwJzsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotCi0gIC8qIGJjYyBib3R0b20gKi8KLSAgZXhbMF0gPSBleHRlbnQ7Ci0gIGV4WzFdID0gJ1wwJzsKLSAgaWYgKHVwKQotICAgIHNwcmludGYgKGJ1ZiwgImJsdCVzICVzIiwgZXgsIG4tPmJvdHRvbSk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChidWYsICJiZ3QlcyAlcyIsIGV4LCBuLT5ib3R0b20pOwotICBtcmlfYXNzZW1ibGUgKGJ1Zik7Ci0KLSAgLyogUHV0IHRvZ2V0aGVyIHRoZSBhZGQgb3Igc3ViIGluc3RydWN0aW9uIHVzZWQgYnkgRU5ERi4gICovCi0gIHMgPSBidWY7Ci0gIGlmICh1cCkKLSAgICBzdHJjcHkgKHMsICJhZGQiKTsKLSAgZWxzZQotICAgIHN0cmNweSAocywgInN1YiIpOwotICBzICs9IDM7Ci0gIGlmIChxdWFsICE9ICdcMCcpCi0gICAgKnMrKyA9IHF1YWw7Ci0gICpzKysgPSAnICc7Ci0gIG1lbWNweSAocywgYnlzdGFydCwgYnlzdG9wIC0gYnlzdGFydCk7Ci0gIHMgKz0gYnlzdG9wIC0gYnlzdGFydDsKLSAgKnMrKyA9ICcsJzsKLSAgbWVtY3B5IChzLCB2YXJzdGFydCwgdmFyc3RvcCAtIHZhcnN0YXJ0KTsKLSAgcyArPSB2YXJzdG9wIC0gdmFyc3RhcnQ7Ci0gICpzID0gJ1wwJzsKLSAgbi0+aW5jciA9IGJ1ZjsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBFTkRGIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbmRmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChtcmlfY29udHJvbF9zdGFjayA9PSBOVUxMCi0gICAgICB8fCBtcmlfY29udHJvbF9zdGFjay0+dHlwZSAhPSBtcmlfZm9yKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kZiB3aXRob3V0IGZvciIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgbXJpX2Fzc2VtYmxlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7Ci0KLSAgc3ByaW50ZiAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IsICJicmEgJXMiLCBtcmlfY29udHJvbF9zdGFjay0+dG9wKTsKLSAgbXJpX2Fzc2VtYmxlIChtcmlfY29udHJvbF9zdGFjay0+aW5jcik7Ci0KLSAgZnJlZSAobXJpX2NvbnRyb2xfc3RhY2stPmluY3IpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgUkVQRUFUIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9yZXBlYXQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3RydWN0IG1yaV9jb250cm9sX2luZm8gKm47Ci0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV9yZXBlYXQpOwotICBjb2xvbiAobi0+dG9wKTsKLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIFVOVElMIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV91bnRpbCAocXVhbCkKLSAgICAgaW50IHF1YWw7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKG1yaV9jb250cm9sX3N0YWNrID09IE5VTEwKLSAgICAgIHx8IG1yaV9jb250cm9sX3N0YWNrLT50eXBlICE9IG1yaV9yZXBlYXQpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJ1bnRpbCB3aXRob3V0IHJlcGVhdCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+bmV4dCk7Ci0KLSAgZm9yIChzID0gaW5wdXRfbGluZV9wb2ludGVyOyAhIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqc107IHMrKykKLSAgICA7Ci0KLSAgcGFyc2VfbXJpX2NvbnRyb2xfZXhwcmVzc2lvbiAocywgcXVhbCwgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQltcmlfY29udHJvbF9zdGFjay0+dG9wLCAnXDAnKTsKLQotICBjb2xvbiAobXJpX2NvbnRyb2xfc3RhY2stPmJvdHRvbSk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSBNUkkgV0hJTEUgcHNldWRvLW9wLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbXJpX3doaWxlIChxdWFsKQotICAgICBpbnQgcXVhbDsKLXsKLSAgY2hhciAqczsKLQotICBzdHJ1Y3QgbXJpX2NvbnRyb2xfaW5mbyAqbjsKLQotICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdCi0JICYmICghIGZsYWdfbXJpIHx8ICpzICE9ICcqJykpCi0gICAgcysrOwotICAtLXM7Ci0gIHdoaWxlICgqcyA9PSAnICcgfHwgKnMgPT0gJ1x0JykKLSAgICAtLXM7Ci0gIGlmIChzIC0gaW5wdXRfbGluZV9wb2ludGVyID4gMQotICAgICAgJiYgc1stMV0gPT0gJy4nKQotICAgIHMgLT0gMjsKLSAgaWYgKHMgLSBpbnB1dF9saW5lX3BvaW50ZXIgPCAyCi0gICAgICB8fCBzdHJuY2FzZWNtcCAocyAtIDEsICJETyIsIDIpICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGRvIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbiA9IHB1c2hfbXJpX2NvbnRyb2wgKG1yaV93aGlsZSk7Ci0KLSAgY29sb24gKG4tPm5leHQpOwotCi0gIHBhcnNlX21yaV9jb250cm9sX2V4cHJlc3Npb24gKHMgLSAxLCBxdWFsLCAoY29uc3QgY2hhciAqKSBOVUxMLCBuLT5ib3R0b20sCi0JCQkJc1sxXSA9PSAnLicgPyBzWzJdIDogJ1wwJyk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcyArIDE7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgewotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIE1SSSBFTkRXIHBzZXVkby1vcC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21yaV9lbmR3IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBpZiAobXJpX2NvbnRyb2xfc3RhY2sgPT0gTlVMTAotICAgICAgfHwgbXJpX2NvbnRyb2xfc3RhY2stPnR5cGUgIT0gbXJpX3doaWxlKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZW5kdyB3aXRob3V0IHdoaWxlIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoMjAgKyBzdHJsZW4gKG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KSk7Ci0gIHNwcmludGYgKGJ1ZiwgImJyYSAlcyIsIG1yaV9jb250cm9sX3N0YWNrLT5uZXh0KTsKLSAgbXJpX2Fzc2VtYmxlIChidWYpOwotICBmcmVlIChidWYpOwotCi0gIGNvbG9uIChtcmlfY29udHJvbF9zdGFjay0+Ym90dG9tKTsKLQotICBwb3BfbXJpX2NvbnRyb2wgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qCi0gKiBtZF9wYXJzZV9vcHRpb24KLSAqCUludm9jYXRpb24gbGluZSBpbmNsdWRlcyBhIHN3aXRjaCBub3QgcmVjb2duaXplZCBieSB0aGUgYmFzZSBhc3NlbWJsZXIuCi0gKglTZWUgaWYgaXQncyBhIHByb2Nlc3Nvci1zcGVjaWZpYyBvcHRpb24uICBUaGVzZSBhcmU6Ci0gKgotICoJLVtBXW1bY102ODAwMCwgLVtBXW1bY102ODAwOCwgLVtBXW1bY102ODAxMCwgLVtBXW1bY102ODAyMCwgLVtBXW1bY102ODAzMCwgLVtBXW1bY102ODA0MAotICoJLVtBXW1bY102ODg4MSwgLVtBXW1bY102ODg4MiwgLVtBXW1bY102ODg1MQotICoJCVNlbGVjdCB0aGUgYXJjaGl0ZWN0dXJlLiAgSW5zdHJ1Y3Rpb25zIG9yIGZlYXR1cmVzIG5vdAotICoJCXN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsCi0gKgkJZXJyb3JzLiAgTW9yZSB0aGFuIG9uZSBtYXkgYmUgc3BlY2lmaWVkLiAgVGhlIGRlZmF1bHQgaXMKLSAqCQktbTY4MDIwIC1tNjg4NTEgLW02ODg4MS4gIE5vdGUgdGhhdCAtbTY4MDA4IGlzIGEgc3lub255bQotICoJCWZvciAtbTY4MDAwLCBhbmQgLW02ODg4MiBpcyBhIHN5bm9ueW0gZm9yIC1tNjg4ODEuCi0gKgktW0FdbVtjXW5vLTY4ODUxLCAtW0FdbVtjXW5vLTY4ODgxCi0gKgkJRG9uJ3QgYWNjZXB0IDY4OD8xIGluc3RydWN0aW9ucy4gIChUaGUgImMiIGlzIGtpbmQgb2Ygc2lsbHksCi0gKgkJc28gZG9uJ3QgdXNlIG9yIGRvY3VtZW50IGl0LCBidXQgdGhhdCdzIHRoZSB3YXkgdGhlIHBhcnNpbmcKLSAqCQl3b3JrcykuCi0gKgotICoJLXBpYwlJbmRpY2F0ZXMgUElDLgotICoJLWsJSW5kaWNhdGVzIFBJQy4gIChTdW4gMyBvbmx5LikKLSAqCi0gKgktLWJpdHdpc2Utb3IKLSAqCQlQZXJtaXQgYHwnIHRvIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMuCi0gKgotICovCi0KLSNpZmRlZiBPQkpfRUxGCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAibFNBOm06a1E6ViI7Ci0jZWxzZQotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImxTQTptOmsiOwotI2VuZGlmCi0KLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSNkZWZpbmUgT1BUSU9OX1BJQyAoT1BUSU9OX01EX0JBU0UpCi0gIHsicGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9QSUN9LAotI2RlZmluZSBPUFRJT05fUkVHSVNURVJfUFJFRklYX09QVElPTkFMIChPUFRJT05fTURfQkFTRSArIDEpCi0gIHsicmVnaXN0ZXItcHJlZml4LW9wdGlvbmFsIiwgbm9fYXJndW1lbnQsIE5VTEwsCi0gICAgIE9QVElPTl9SRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUx9LAotI2RlZmluZSBPUFRJT05fQklUV0lTRV9PUiAoT1BUSU9OX01EX0JBU0UgKyAyKQotICB7ImJpdHdpc2Utb3IiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JJVFdJU0VfT1J9LAotI2RlZmluZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTYgKE9QVElPTl9NRF9CQVNFICsgMykKLSAgeyJiYXNlLXNpemUtZGVmYXVsdC0xNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTZ9LAotI2RlZmluZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzIgKE9QVElPTl9NRF9CQVNFICsgNCkKLSAgeyJiYXNlLXNpemUtZGVmYXVsdC0zMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMzJ9LAotI2RlZmluZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTYgKE9QVElPTl9NRF9CQVNFICsgNSkKLSAgeyJkaXNwLXNpemUtZGVmYXVsdC0xNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMTZ9LAotI2RlZmluZSBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzIgKE9QVElPTl9NRF9CQVNFICsgNikKLSAgeyJkaXNwLXNpemUtZGVmYXVsdC0zMiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTUF9TSVpFX0RFRkFVTFRfMzJ9LAotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ2wnOgkJCS8qIC1sIG1lYW5zIGtlZXAgZXh0ZXJuYWwgdG8gMiBiaXQgb2Zmc2V0Ci0JCQkJICAgcmF0aGVyIHRoYW4gMTYgYml0IG9uZSAqLwotICAgICAgZmxhZ19zaG9ydF9yZWZzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6CQkJLyogLVMgbWVhbnMgdGhhdCBqYnNyJ3MgYWx3YXlzIHR1cm4gaW50bwotCQkJCSAgIGpzcidzLiAgKi8KLSAgICAgIGZsYWdfbG9uZ19qdW1wcyA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgaWYgKCphcmcgPT0gJ20nKQotIAlhcmcrKzsKLSAgICAgIC8qIGludGVudGlvbmFsIGZhbGwtdGhyb3VnaCAqLwotICAgIGNhc2UgJ20nOgotCi0gICAgICBpZiAoYXJnWzBdID09ICduJyAmJiBhcmdbMV0gPT0gJ28nICYmIGFyZ1syXSA9PSAnLScpCi0JewotCSAgaW50IGk7Ci0JICB1bnNpZ25lZCBsb25nIGFyY2g7Ci0JICBjb25zdCBjaGFyICpvYXJnID0gYXJnOwotCi0JICBhcmcgKz0gMzsKLQkgIGlmICgqYXJnID09ICdtJykKLQkgICAgewotCSAgICAgIGFyZysrOwotCSAgICAgIGlmIChhcmdbMF0gPT0gJ2MnICYmIGFyZ1sxXSA9PSAnNicpCi0JCWFyZysrOwotCSAgICB9Ci0JICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoYXJnLCBhcmNoc1tpXS5uYW1lKSkKLQkgICAgICBicmVhazsKLQkgIGlmIChpID09IG5fYXJjaHMpCi0JICAgIHsKLQkgICAgdW5rbm93bjoKLQkgICAgICBhc19iYWQgKF8oInVucmVjb2duaXplZCBvcHRpb24gYCVzJyIpLCBvYXJnKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgYXJjaCA9IGFyY2hzW2ldLmFyY2g7Ci0JICBpZiAoYXJjaCA9PSBtNjg4ODEpCi0JICAgIG5vXzY4ODgxID0gMTsKLQkgIGVsc2UgaWYgKGFyY2ggPT0gbTY4ODUxKQotCSAgICBub182ODg1MSA9IDE7Ci0JICBlbHNlCi0JICAgIGdvdG8gdW5rbm93bjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGk7Ci0KLQkgIGlmIChhcmdbMF0gPT0gJ2MnICYmIGFyZ1sxXSA9PSAnNicpCi0JICAgIGFyZysrOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgbl9hcmNoczsgaSsrKQotCSAgICBpZiAoIXN0cmNtcCAoYXJnLCBhcmNoc1tpXS5uYW1lKSkKLQkgICAgICB7Ci0JCXVuc2lnbmVkIGxvbmcgYXJjaCA9IGFyY2hzW2ldLmFyY2g7Ci0JCWlmIChjcHVfb2ZfYXJjaCAoYXJjaCkpCi0JCSAgLyogSXQncyBhIGNwdSBzcGVjLiAgKi8KLQkJICB7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSAmPSB+bTY4MDAwdXA7Ci0JCSAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSB8PSBhcmNoOwotCQkgIH0KLQkJZWxzZSBpZiAoYXJjaCA9PSBtNjg4ODEpCi0JCSAgewotCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODgxOwotCQkgICAgbm9fNjg4ODEgPSAwOwotCQkgIH0KLQkJZWxzZSBpZiAoYXJjaCA9PSBtNjg4NTEpCi0JCSAgewotCQkgICAgY3VycmVudF9hcmNoaXRlY3R1cmUgfD0gbTY4ODUxOwotCQkgICAgbm9fNjg4NTEgPSAwOwotCQkgIH0KLQkJZWxzZQotCQkgIC8qID8/PyAqLwotCQkgIGFib3J0ICgpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICBpZiAoaSA9PSBuX2FyY2hzKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJ1bnJlY29nbml6ZWQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYCVzJyIpLCBhcmcpOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9QSUM6Ci0gICAgY2FzZSAnayc6Ci0gICAgICBmbGFnX3dhbnRfcGljID0gMTsKLSAgICAgIGJyZWFrOwkJCS8qIC1waWMsIFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKi8KLQotICAgIGNhc2UgT1BUSU9OX1JFR0lTVEVSX1BSRUZJWF9PUFRJT05BTDoKLSAgICAgIGZsYWdfcmVnX3ByZWZpeF9vcHRpb25hbCA9IDE7Ci0gICAgICByZWdfcHJlZml4X29wdGlvbmFsX3NlZW4gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0JJVFdJU0VfT1I6Ci0gICAgICB7Ci0JY2hhciAqbiwgKnQ7Ci0JY29uc3QgY2hhciAqczsKLQotCW4gPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG02OGtfY29tbWVudF9jaGFycykgKyAxKTsKLQl0ID0gbjsKLQlmb3IgKHMgPSBtNjhrX2NvbW1lbnRfY2hhcnM7ICpzICE9ICdcMCc7IHMrKykKLQkgIGlmICgqcyAhPSAnfCcpCi0JICAgICp0KysgPSAqczsKLQkqdCA9ICdcMCc7Ci0JbTY4a19jb21tZW50X2NoYXJzID0gbjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQkFTRV9TSVpFX0RFRkFVTFRfMTY6Ci0gICAgICBtNjhrX2luZGV4X3dpZHRoX2RlZmF1bHQgPSBTSVpFX1dPUkQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfU0laRV9ERUZBVUxUXzMyOgotICAgICAgbTY4a19pbmRleF93aWR0aF9kZWZhdWx0ID0gU0laRV9MT05HOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8xNjoKLSAgICAgIG02OGtfcmVsMzIgPSAwOwotICAgICAgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9ESVNQX1NJWkVfREVGQVVMVF8zMjoKLSAgICAgIG02OGtfcmVsMzIgPSAxOwotICAgICAgbTY4a19yZWwzMl9mcm9tX2NtZGxpbmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLTY4MFgwIG9wdGlvbnM6XG5cCi0tbAkJCXVzZSAxIHdvcmQgZm9yIHJlZnMgdG8gdW5kZWZpbmVkIHN5bWJvbHMgW2RlZmF1bHQgMl1cblwKLS1tNjgwMDAgfCAtbTY4MDA4IHwgLW02ODAxMCB8IC1tNjgwMjAgfCAtbTY4MDMwIHwgLW02ODA0MCB8IC1tNjgwNjBcblwKLSB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW02ODM2MFxuXAotIHwgLW1jcHUzMiB8IC1tNTIwMFxuXAotCQkJc3BlY2lmeSB2YXJpYW50IG9mIDY4MFgwIGFyY2hpdGVjdHVyZSBbZGVmYXVsdCA2ODAyMF1cblwKLS1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODJcblwKLQkJCXRhcmdldCBoYXMvbGFja3MgZmxvYXRpbmctcG9pbnQgY29wcm9jZXNzb3JcblwKLQkJCVtkZWZhdWx0IHllcyBmb3IgNjgwMjAsIDY4MDMwLCBhbmQgY3B1MzJdXG4iKSk7Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tbTY4ODUxIHwgLW1uby02ODg1MVxuXAotCQkJdGFyZ2V0IGhhcy9sYWNrcyBtZW1vcnktbWFuYWdlbWVudCB1bml0IGNvcHJvY2Vzc29yXG5cCi0JCQlbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwIGFuZCB1cF1cblwKLS1waWMsIC1rCQlnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCi0tUwkJCXR1cm4gamJzciBpbnRvIGpzclxuXAotLS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWxcblwKLQkJCXJlY29nbml6ZSByZWdpc3RlciBuYW1lcyB3aXRob3V0IHByZWZpeCBjaGFyYWN0ZXJcblwKLS0tYml0d2lzZS1vcgkJZG8gbm90IHRyZWF0IGB8JyBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLS1iYXNlLXNpemUtZGVmYXVsdC0xNgliYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMTYgYml0c1xuXAotLS1iYXNlLXNpemUtZGVmYXVsdC0zMgliYXNlIHJlZyB3aXRob3V0IHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcblwKLS0tZGlzcC1zaXplLWRlZmF1bHQtMTYJZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDE2IGJpdHNcblwKLS0tZGlzcC1zaXplLWRlZmF1bHQtMzIJZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG4iKSk7Ci19Ci0MCi0jaWZkZWYgVEVTVDIKLQotLyogVEVTVDI6ICBUZXN0IG1kX2Fzc2VtYmxlKCkgKi8KLS8qIFdhcm5pbmcsIHRoaXMgcm91dGluZSBwcm9iYWJseSBkb2Vzbid0IHdvcmsgYW55bW9yZSAqLwotCi1tYWluICgpCi17Ci0gIHN0cnVjdCBtNjhrX2l0IHRoZV9pbnM7Ci0gIGNoYXIgYnVmWzEyMF07Ci0gIGNoYXIgKmNwOwotICBpbnQgbjsKLQotICBtNjhrX2lwX2JlZ2luICgpOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmICghZ2V0cyAoYnVmKSB8fCAhKmJ1ZikKLQlicmVhazsKLSAgICAgIGlmIChidWZbMF0gPT0gJ3wnIHx8IGJ1ZlsxXSA9PSAnLicpCi0JY29udGludWU7Ci0gICAgICBmb3IgKGNwID0gYnVmOyAqY3A7IGNwKyspCi0JaWYgKCpjcCA9PSAnXHQnKQotCSAgKmNwID0gJyAnOwotICAgICAgaWYgKGlzX2xhYmVsIChidWYpKQotCWNvbnRpbnVlOwotICAgICAgbWVtc2V0ICgmdGhlX2lucywgJ1wwJywgc2l6ZW9mICh0aGVfaW5zKSk7Ci0gICAgICBtNjhrX2lwICgmdGhlX2lucywgYnVmKTsKLSAgICAgIGlmICh0aGVfaW5zLmVycm9yKQotCXsKLQkgIHByaW50ZiAoXygiRXJyb3IgJXMgaW4gJXNcbiIpLCB0aGVfaW5zLmVycm9yLCBidWYpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIk9wY29kZSglZC4lcyk6ICIpLCB0aGVfaW5zLm51bW8sIHRoZV9pbnMuYXJncyk7Ci0JICBmb3IgKG4gPSAwOyBuIDwgdGhlX2lucy5udW1vOyBuKyspCi0JICAgIHByaW50ZiAoIiAweCV4IiwgdGhlX2lucy5vcGNvZGVbbl0gJiAweGZmZmYpOwotCSAgcHJpbnRmICgiICAgICIpOwotCSAgcHJpbnRfdGhlX2luc24gKCZ0aGVfaW5zLm9wY29kZVswXSwgc3Rkb3V0KTsKLQkgICh2b2lkKSBwdXRjaGFyICgnXG4nKTsKLQl9Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgc3RybGVuICh0aGVfaW5zLmFyZ3MpIC8gMjsgbisrKQotCXsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmVycm9yKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgib3AlZCBFcnJvciAlcyBpbiAlc1xuIiwgbiwgdGhlX2lucy5vcGVyYW5kc1tuXS5lcnJvciwgYnVmKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCSAgcHJpbnRmICgibW9kZSAlZCwgcmVnICVkLCAiLCB0aGVfaW5zLm9wZXJhbmRzW25dLm1vZGUsIHRoZV9pbnMub3BlcmFuZHNbbl0ucmVnKTsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QpCi0JICAgIHByaW50ZiAoIkNvbnN0YW50OiAnJS4qcycsICIsIDEgKyB0aGVfaW5zLm9wZXJhbmRzW25dLmVfY29uc3QgLSB0aGVfaW5zLm9wZXJhbmRzW25dLmJfY29uc3QsIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9jb25zdCk7Ci0JICBwcmludGYgKCJpcmVnICVkLCBpc2l6ICVkLCBpbXVsICVkLCAiLCB0aGVfaW5zLm9wZXJhbmRzW25dLmlyZWcsIHRoZV9pbnMub3BlcmFuZHNbbl0uaXNpeiwgdGhlX2lucy5vcGVyYW5kc1tuXS5pbXVsKTsKLQkgIGlmICh0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCkKLQkgICAgcHJpbnRmICgiSWFkZDogJyUuKnMnLCIsIDEgKyB0aGVfaW5zLm9wZXJhbmRzW25dLmVfaWFkZCAtIHRoZV9pbnMub3BlcmFuZHNbbl0uYl9pYWRkLCB0aGVfaW5zLm9wZXJhbmRzW25dLmJfaWFkZCk7Ci0JICAodm9pZCkgcHV0Y2hhciAoJ1xuJyk7Ci0JfQotICAgIH0KLSAgbTY4a19pcF9lbmQgKCk7Ci0gIHJldHVybiAwOwotfQotCi1pc19sYWJlbCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLSAgd2hpbGUgKCpzdHIgJiYgKnN0ciAhPSAnICcpCi0gICAgc3RyKys7Ci0gIGlmIChzdHJbLTFdID09ICc6JyB8fCBzdHJbMV0gPT0gJz0nKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCi0KLS8qIFBvc3NpYmxlIHN0YXRlcyBmb3IgcmVsYXhhdGlvbjoKLQotICAgMCAwCWJyYW5jaCBvZmZzZXQJYnl0ZQkoYnJhLCBldGMpCi0gICAwIDEJCQl3b3JkCi0gICAwIDIJCQlsb25nCi0KLSAgIDEgMAlpbmRleGVkIG9mZnNldHMJYnl0ZQlhMEAoMzIsZDQ6dzoxKSBldGMKLSAgIDEgMQkJCXdvcmQKLSAgIDEgMgkJCWxvbmcKLQotICAgMiAwCXR3by1vZmZzZXQgaW5kZXggd29yZC13b3JkIGEwQCgzMixkNClAKDQ1KSBldGMKLSAgIDIgMQkJCXdvcmQtbG9uZwotICAgMiAyCQkJbG9uZy13b3JkCi0gICAyIDMJCQlsb25nLWxvbmcKLQotICAgKi8KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSNpZmRlZiBPQkpfQU9VVAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgLyogRm9yIGEub3V0LCBmb3JjZSB0aGUgc2VjdGlvbiBzaXplIHRvIGJlIGFsaWduZWQuICBJZiB3ZSBkb24ndCBkbwotICAgICB0aGlzLCBCRkQgd2lsbCBhbGlnbiBpdCBmb3IgdXMsIGJ1dCBpdCB3aWxsIG5vdCB3cml0ZSBvdXQgdGhlCi0gICAgIGZpbmFsIGJ5dGVzIG9mIHRoZSBzZWN0aW9uLiAgVGhpcyBtYXkgYmUgYSBidWcgaW4gQkZELCBidXQgaXQgaXMKLSAgICAgZWFzaWVyIHRvIGZpeCBpdCBoZXJlIHNpbmNlIHRoYXQgaXMgaG93IHRoZSBvdGhlciBhLm91dCB0YXJnZXRzCi0gICAgIHdvcmsuICAqLwotICBpbnQgYWxpZ247Ci0KLSAgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpOwotICBzaXplID0gKChzaXplICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoKHZhbHVlVCkgLTEgPDwgYWxpZ24pKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgcmV0dXJuIHNpemU7Ci19Ci0KLS8qIEV4YWN0bHkgd2hhdCBwb2ludCBpcyBhIFBDLXJlbGF0aXZlIG9mZnNldCByZWxhdGl2ZSBUTz8KLSAgIE9uIHRoZSA2OGssIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBleHRlbnNpb24KLSAgIHdvcmQuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzZXMgb2YgdGhlIG9mZnNldCBhbmQgdGhlCi0gICBmaXJzdCBleHRlbnNpb24gd29yZCBpcyBzdG9yZWQgaW4gZnhfcGNyZWxfYWRqdXN0LiAqLwotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaW50IGFkanVzdDsKLQotICAvKiBCZWNhdXNlIGZ4X3BjcmVsX2FkanVzdCBpcyBhIGNoYXIsIGFuZCBtYXkgYmUgdW5zaWduZWQsIHdlIHN0b3JlCi0gICAgIC0xIGFzIDY0LiAgKi8KLSAgYWRqdXN0ID0gZml4UC0+ZnhfcGNyZWxfYWRqdXN0OwotICBpZiAoYWRqdXN0ID09IDY0KQotICAgIGFkanVzdCA9IC0xOwotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzIC0gYWRqdXN0OwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfQ09GRgotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAoaWdub3JlKQotICAgICBzeW1ib2xTICppZ25vcmU7Ci17Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHN3aXRjaCAoZnJhZy0+ZnJfc3VidHlwZSAmIDB4MykKLSAgICB7Ci0gICAgY2FzZSBCWVRFOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBTSE9SVDoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgTE9ORzoKLSAgICAgIHJldHVybiA0OwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBPQkpfRUxGCi12b2lkIG02OGtfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcoKQotewotICAgLyogU2V0IGZpbGUtc3BlY2lmaWMgZmxhZ3MgaWYgdGhpcyBpcyBhIGNwdTMyIHByb2Nlc3NvciAqLwotICAgaWYgKGNwdV9vZl9hcmNoIChjdXJyZW50X2FyY2hpdGVjdHVyZSkgJiBjcHUzMikKLSAgICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9DUFUzMjsKLX0KLSNlbmRpZgotLyogZW5kIG9mIHRjLW02OGsuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tNjhrLmggYi9nYXMvY29uZmlnL3RjLW02OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg0OTJiOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW02OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtbTY4ay5oCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19NNjhLIDEKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZpeDsKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmZGVmIE9CSl9BT1VUCi0jaWZkZWYgVEVfU1VOMwotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1zdW5vcy1iaWciCi0jZW5kaWYKLSNpZmRlZiBURV9OZXRCU0QKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtbTY4ay1uZXRic2QiCi0jZW5kaWYKLSNpZmRlZiBURV9MSU5VWAotI2RlZmluZSBUQVJHRVRfRk9STUFUICJhLm91dC1tNjhrLWxpbnV4IgotI2VuZGlmCi0jaWZuZGVmIFRBUkdFVF9GT1JNQVQKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiYS5vdXQtemVyby1iaWciCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQVJHRVRfRk9STUFUICJlbGYzMi1tNjhrIgotI2VuZGlmCi0KLSNpZmRlZiBURV9BUE9MTE8KLSNkZWZpbmUgQ09GRl9NQUdJQwkJQVBPTExPTTY4S01BR0lDCi0jZGVmaW5lIENPRkZfQU9VVEhEUl9NQUdJQwlBUE9MTE9fQ09GRl9WRVJTSU9OX05VTUJFUgotI3VuZGVmIE9CSl9DT0ZGX09NSVRfT1BUSU9OQUxfSEVBREVSCi0jZW5kaWYKLQotI2lmZGVmIFRFX0xZTlgKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1seW54IgotI2VuZGlmCi0jaWZkZWYgVEVfQVVYCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQJCSJjb2ZmLW02OGstYXV4IgotI2VuZGlmCi0jaWZkZWYgVEVfREVMVEEKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImNvZmYtbTY4ay1zeXN2IgotI2VuZGlmCi0KLSNpZm5kZWYgQ09GRl9NQUdJQwotI2RlZmluZSBDT0ZGX01BR0lDIE1DNjhNQUdJQwotI2VuZGlmCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX202OGsgLyogZm9yIG5vbi1CRkRfQVNTRU1CTEVSICovCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX202OGsgLyogQkZEX0FTU0VNQkxFUiAqLwotI2RlZmluZSBDT0ZGX0ZMQUdTIEZfQVIzMlcKLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoeCkgKCh4KS0+ZnhfYWRkc3l8fCh4KS0+Znhfc3Vic3kpCi0KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoc3RydWN0IGZyYWcgKikpOwotI2lmZGVmIFRFX1NVTjMKLS8qIFRoaXMgdmFyaWFibGUgY29udGFpbnMgdGhlIHZhbHVlIHRvIHdyaXRlIG91dCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICB0aGUgYS5vdXQgZmlsZS4gIFRoZSAyPDwxNiBtZWFucyB0aGF0IHRoaXMgaXMgYSA2ODAyMCBmaWxlIGluc3RlYWQKLSAgIG9mIGFuIG9sZC1zdHlsZSA2ODAwMCBmaWxlICovCi0KLSNkZWZpbmUgREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFICgyPDwxNnxPTUFHSUMpOwkvKiBNYWdpYyBieXRlIGZvciBmaWxlIGhlYWRlciAqLwotI2VuZGlmIC8qIFRFX1NVTjMgKi8KLQotI2lmbmRlZiBBT1VUX01BQ0hUWVBFCi0jZGVmaW5lIEFPVVRfTUFDSFRZUEUgbTY4a19hb3V0X21hY2h0eXBlCi1leHRlcm4gaW50IG02OGtfYW91dF9tYWNodHlwZTsKLSNlbmRpZgotCi0jZGVmaW5lIHRjX2NvbW1lbnRfY2hhcnMgbTY4a19jb21tZW50X2NoYXJzCi1leHRlcm4gY29uc3QgY2hhciAqbTY4a19jb21tZW50X2NoYXJzOwotCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfaGVhZGVyc19ob29rKGEpCQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLQotI2RlZmluZSBMSVNUSU5HX1dPUkRfU0laRSAyCS8qIEEgd29yZCBpcyAyIGJ5dGVzICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIIDIJLyogT25lIHdvcmQgb24gdGhlIGZpcnN0IGxpbmUgKi8KLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEhfU0VDT05EIDIJLyogT25lIHdvcmQgb24gdGhlIHNlY29uZCBsaW5lICovCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNC8qIEFuZCA0IGxpbmVzIG1heCAqLwotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiNjhLIEdBUyAiCi0KLSNpZm5kZWYgUkVHSVNURVJfUFJFRklYCi0jZGVmaW5lIFJFR0lTVEVSX1BSRUZJWCAnJScKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKFJFR0lTVEVSX1BSRUZJWF9PUFRJT05BTCkKLSNpZiBkZWZpbmVkIChNNjhLQ09GRikgfHwgZGVmaW5lZCAoT0JKX0VMRikKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBMT0NBTF9MQUJFTChuYW1lKSAobmFtZVswXSA9PSAnLicgXAotCQkJICAgJiYgKG5hbWVbMV0gPT0gJ0wnIHx8IG5hbWVbMV0gPT0gJy4nKSkKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLSNkZWZpbmUgUkVHSVNURVJfUFJFRklYX09QVElPTkFMIDAKLSNlbHNlIC8qICEgKENPRkYgfHwgRUxGKSAqLwotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotI2VuZGlmIC8qICEgKENPRkYgfHwgRUxGKSAqLwotI2VuZGlmIC8qIG5vdCBkZWYgUkVHSVNURVJfUFJFRklYIGFuZCBub3QgZGVmIE9QVElPTkFMX1JFR0lTVEVSX1BSRUZJWCAqLwotCi0jaWZkZWYgVEVfREVMVEEKLS8qIE9uIHRoZSBEZWx0YSwgYCUnIGNhbiBvY2N1ciB3aXRoaW4gYSBsYWJlbCBuYW1lLCBidXQgbm90IGFzIHRoZQotICAgaW5pdGlhbCBjaGFyYWN0ZXIuICAqLwotI2RlZmluZSBMRVhfUENUIExFWF9OQU1FCi0vKiBPbiB0aGUgRGVsdGEsIGB+JyBjYW4gc3RhcnQgYSBsYWJlbCBuYW1lLCBidXQgaXMgY29udmVydGVkIHRvICcuJy4gKi8KLSNkZWZpbmUgTEVYX1RJTERFIExFWF9CRUdJTl9OQU1FCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShzKSAoKCoocykgPT0gJ34nID8gKihzKSA9ICcuJyA6ICcuJyksIHMpCi0vKiBPbiB0aGUgRGVsdGEsIGRvdHMgYXJlIG5vdCByZXF1aXJlZCBiZWZvcmUgcHNldWRvLW9wcy4gICovCi0jZGVmaW5lIE5PX1BTRVVET19ET1QKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotI3VuZGVmIExPQ0FMX0xBQkVMCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIFwKLSAgKG5hbWVbMF0gPT0gJy4nIHx8IChuYW1lWzBdID09ICdMJyAmJiBuYW1lWzFdID09ICclJykpCi0jZW5kaWYKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBtNjhrX21yaV9tb2RlX2NoYW5nZSBQQVJBTVMgKChpbnQpKTsKLSNkZWZpbmUgTVJJX01PREVfQ0hBTkdFKGkpIG02OGtfbXJpX21vZGVfY2hhbmdlIChpKQotCi1leHRlcm4gaW50IG02OGtfY29uZGl0aW9uYWxfcHNldWRvb3AgUEFSQU1TICgocHNldWRvX3R5cGVTICopKTsKLSNkZWZpbmUgdGNfY29uZGl0aW9uYWxfcHNldWRvb3AocG9wKSBtNjhrX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCi0KLWV4dGVybiB2b2lkIG02OGtfZnJvYl9sYWJlbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNkZWZpbmUgdGNfZnJvYl9sYWJlbChzeW0pIG02OGtfZnJvYl9sYWJlbCAoc3ltKQotCi1leHRlcm4gdm9pZCBtNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQoKSBtNjhrX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi0KLWV4dGVybiB2b2lkIG02OGtfZnJvYl9zeW1ib2wgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLHB1bnQpCQkJCVwKLWRvCQkJCQkJCQlcCi0gIHsJCQkJCQkJCVwKLSAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltKSA9PSByZWdfc2VjdGlvbikJCQlcCi0gICAgICBwdW50ID0gMTsJCQkJCQkJXAotICAgIG02OGtfZnJvYl9zeW1ib2wgKHN5bSk7CQkJCQlcCi0gIH0JCQkJCQkJCVwKLXdoaWxlICgwKQotCi0jZGVmaW5lIE5PX1JFTE9DIEJGRF9SRUxPQ19OT05FCi0KLSNpZmRlZiBPQkpfRUxGCi0KLS8qIFRoaXMgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UgaWYgdGhlIHJlbG9jYXRpb24gaXMgZm9yIGEgbG9jYWwgb2JqZWN0Ci0gICBmb3Igd2hpY2ggd2Ugc3RpbGwgd2FudCB0byBkbyB0aGUgcmVsb2NhdGlvbiBhdCBydW50aW1lLiAgVHJ1ZSBpZiB3ZQotICAgYXJlIHdpbGxpbmcgdG8gcGVyZm9ybSB0aGlzIHJlbG9jYXRpb24gd2hpbGUgYnVpbGRpbmcgdGhlIC5vIGZpbGUuICBJZgotICAgdGhlIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbCwgdGhlbiB0aGUgYXNzZW1ibGVyCi0gICBzaG91bGQgbmV2ZXIgZG8gdGhlIHJlbG9jYXRpb24uICAqLwotCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpCQkJXAotCSgoRklYKS0+ZnhfYWRkc3kgPT0gTlVMTAkJCVwKLQkgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJXAotCSAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkJCVwKLQkgICAgICYmIFNfSVNfREVGSU5FRCAoKEZJWCktPmZ4X2FkZHN5KQkJXAotCSAgICAgJiYgISBTX0lTX0NPTU1PTiAoKEZJWCktPmZ4X2FkZHN5KSkpCi0KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoWCkgdGNfbTY4a19maXhfYWRqdXN0YWJsZShYKQotZXh0ZXJuIGludCB0Y19tNjhrX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nCi1leHRlcm4gdm9pZCBtNjhrX2VsZl9maW5hbF9wcm9jZXNzaW5nIFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYKQkJCVwKLQkoKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJXAotCSB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIHRjX2Zyb2JfY29mZl9zeW1ib2woc3ltKSBtNjhrX2Zyb2Jfc3ltYm9sIChzeW0pCi0KLSNkZWZpbmUgTk9fUkVMT0MgMAotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCi0KLWV4dGVybiB2b2lkIG02OGtfaW5pdF9hZnRlcl9hcmdzIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgdGNfaW5pdF9hZnRlcl9hcmdzIG02OGtfaW5pdF9hZnRlcl9hcmdzCi0KLWV4dGVybiBpbnQgbTY4a19wYXJzZV9sb25nX29wdGlvbiBQQVJBTVMgKChjaGFyICopKTsKLSNkZWZpbmUgbWRfcGFyc2VfbG9uZ19vcHRpb24gbTY4a19wYXJzZV9sb25nX29wdGlvbgotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotI2RlZmluZSBUQVJHRVRfV09SRF9TSVpFIDMyCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX202OGsKLQotZXh0ZXJuIHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogQ29waWVkIGZyb20gd3JpdGUuYyAqLwotLyogVGhpcyB3YXMgZm9ybWVybHkgY2FsbGVkIE02OEtfQUlNX0tMVURHRS4gICovCi0jZGVmaW5lIG1kX3ByZXBhcmVfcmVsYXhfc2NhbihmcmFnUCwgYWRkcmVzcywgYWltLCB0aGlzX3N0YXRlLCB0aGlzX3R5cGUpIFwKLSAgaWYgKGFpbT09MCAmJiB0aGlzX3N0YXRlPT0gNCkgeyAvKiBoYXJkIGVuY29kZWQgZnJvbSB0Yy1tNjhrLmMgKi8gXAotICAgIGFpbT10aGlzX3R5cGUtPnJseF9mb3J3YXJkKzE7IC8qIEZvcmNlIHJlbGF4YXRpb24gaW50byB3b3JkIG1vZGUgKi8gXAotICB9Ci0KLS8qIGVuZCBvZiB0Yy1tNjhrLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtbTg4ay5jIGIvZ2FzL2NvbmZpZy90Yy1tODhrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzQ2MGEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tODhrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUyICswLDAgQEAKLS8qIG04OGsuYyAtLSBBc3NlbWJsZXIgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAotICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5Ci0gICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJtODhrLW9wY29kZS5oIgotCi1zdHJ1Y3QgZmllbGRfdmFsX2Fzc29jCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIHZhbDsKLX07Ci0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MgY3JfcmVnc1tdID0KLXsKLSAgeyJQSUQiLCAwfSwKLSAgeyJQU1IiLCAxfSwKLSAgeyJFUFNSIiwgMn0sCi0gIHsiU1NCUiIsIDN9LAotICB7IlNYSVAiLCA0fSwKLSAgeyJTTklQIiwgNX0sCi0gIHsiU0ZJUCIsIDZ9LAotICB7IlZCUiIsIDd9LAotICB7IkRNVDAiLCA4fSwKLSAgeyJETUQwIiwgOX0sCi0gIHsiRE1BMCIsIDEwfSwKLSAgeyJETVQxIiwgMTF9LAotICB7IkRNRDEiLCAxMn0sCi0gIHsiRE1BMSIsIDEzfSwKLSAgeyJETVQyIiwgMTR9LAotICB7IkRNRDIiLCAxNX0sCi0gIHsiRE1BMiIsIDE2fSwKLSAgeyJTUjAiLCAxN30sCi0gIHsiU1IxIiwgMTh9LAotICB7IlNSMiIsIDE5fSwKLSAgeyJTUjMiLCAyMH0sCi0KLSAge05VTEwsIDB9LAotfTsKLQotc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyBmY3JfcmVnc1tdID0KLXsKLSAgeyJGUEVDUiIsIDB9LAotICB7IkZQSFMxIiwgMX0sCi0gIHsiRlBMUzEiLCAyfSwKLSAgeyJGUEhTMiIsIDN9LAotICB7IkZQTFMyIiwgNH0sCi0gIHsiRlBQVCIsIDV9LAotICB7IkZQUkgiLCA2fSwKLSAgeyJGUFJMIiwgN30sCi0gIHsiRlBJVCIsIDh9LAotCi0gIHsiRlBTUiIsIDYyfSwKLSAgeyJGUENSIiwgNjN9LAotCi0gIHtOVUxMLCAwfSwKLX07Ci0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MgY21wc2xvdFtdID0KLXsKLS8qIEludGVnZXIJRmxvYXRpbmcgcG9pbnQgKi8KLSAgeyJuYyIsIDB9LAotICB7ImNwIiwgMX0sCi0gIHsiZXEiLCAyfSwKLSAgeyJuZSIsIDN9LAotICB7Imd0IiwgNH0sCi0gIHsibGUiLCA1fSwKLSAgeyJsdCIsIDZ9LAotICB7ImdlIiwgN30sCi0gIHsiaGkiLCA4fSwJeyJvdSIsIDh9LAotICB7ImxzIiwgOX0sCXsiaWIiLCA5fSwKLSAgeyJsbyIsIDEwfSwJeyJpbiIsIDEwfSwKLSAgeyJocyIsIDExfSwJeyJvYiIsIDExfSwKLSAgeyJiZSIsIDEyfSwJeyJ1ZSIsIDEyfSwKLSAgeyJuYiIsIDEzfSwJeyJsZyIsIDEzfSwKLSAgeyJoZSIsIDE0fSwJeyJ1ZyIsIDE0fSwKLSAgeyJuaCIsIDE1fSwJeyJ1bGUiLCAxNX0sCi0JCXsidWwiLCAxNn0sCi0JCXsidWdlIiwgMTd9LAotCi0gIHtOVUxMLCAwfSwKLX07Ci0KLXN0cnVjdCBmaWVsZF92YWxfYXNzb2MgY25kbXNrW10gPQotewotICB7Imd0MCIsIDF9LAotICB7ImVxMCIsIDJ9LAotICB7ImdlMCIsIDN9LAotICB7Imx0MCIsIDEyfSwKLSAgeyJuZTAiLCAxM30sCi0gIHsibGUwIiwgMTR9LAotCi0gIHtOVUxMLCAwfSwKLX07Ci0KLXN0cnVjdCBtODhrX2luc24KLXsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgZW51bSByZWxvY190eXBlIHJlbG9jOwotfTsKLQotc3RhdGljIGNoYXIgKmdldF9iZiBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXRfY21wIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldF9jbmQgUEFSQU1TICgoY2hhciAqcGFyYW0sIHVuc2lnbmVkICp2YWxwKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2NyIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqcmVnbm9wKSk7Ci1zdGF0aWMgY2hhciAqZ2V0X2ZjciBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnJlZ25vcCkpOwotc3RhdGljIGNoYXIgKmdldF9pbW0xNiBQQVJBTVMgKChjaGFyICpwYXJhbSwgc3RydWN0IG04OGtfaW5zbiAqaW5zbikpOwotc3RhdGljIGNoYXIgKmdldF9vNiBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgKnZhbHApKTsKLXN0YXRpYyBjaGFyICpnZXRfcmVnIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqcmVnbm9wLCBpbnQgcmVnX3ByZWZpeCkpOwotc3RhdGljIGNoYXIgKmdldF92ZWM5IFBBUkFNUyAoKGNoYXIgKnBhcmFtLCB1bnNpZ25lZCAqdmFscCkpOwotc3RhdGljIGNoYXIgKmdldHZhbCBQQVJBTVMgKChjaGFyICpwYXJhbSwgdW5zaWduZWQgaW50ICp2YWxwKSk7Ci0KLXN0YXRpYyBjaGFyICpnZXRfcGNyIFBBUkFNUyAoKGNoYXIgKnBhcmFtLCBzdHJ1Y3QgbTg4a19pbnNuICppbnNuLAotCQkgICAgICBlbnVtIHJlbG9jX3R5cGUgcmVsb2MpKTsKLQotc3RhdGljIGludCBjYWxjb3AgUEFSQU1TICgoc3RydWN0IG04OGtfb3Bjb2RlICpmb3JtYXQsCi0JCQkgICBjaGFyICpwYXJhbSwgc3RydWN0IG04OGtfaW5zbiAqaW5zbikpOwotCi0KLWV4dGVybiBjaGFyICpteW5hbWU7Ci1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaCA9IE5VTEw7Ci0KLS8qIFRoZXNlIGJpdHMgc2hvdWxkIGJlIHR1cm5lZCBvZmYgaW4gdGhlIGZpcnN0IGFkZHJlc3Mgb2YgZXZlcnkgc2VnbWVudCAqLwotaW50IG1kX3NlZ19hbGlnbiA9IDc7Ci0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotCi0vKiBUaGVzZSBjaGFycyBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi0vKiBDaGFycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHNlcGFyYXRlIG1hbnQgZnJvbSBleHAgaW4gZmxvYXRpbmcgcG9pbnQgbnVtcyAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBhcyBpbiAwZjEyMy40NTYgKi8KLS8qIG9yICAgIDBIMS4yMzRFLTEyIChzZWUgZXhwIGNoYXJzIGFib3ZlKSAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRGZGIjsKLQotZXh0ZXJuIHZvaWQgZmxvYXRfY29ucyAoKSwgY29ucyAoKSwgc19nbG9ibCAoKSwgc19zcGFjZSAoKSwKLSAgc19zZXQgKCksIHNfbGNvbW0gKCk7Ci0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiYWxpZ24iLCBzX2FsaWduX2J5dGVzLCA0fSwKLSAgeyJkZWYiLCBzX3NldCwgMH0sCi0gIHsiZGZsb2F0IiwgZmxvYXRfY29ucywgJ2QnfSwKLSAgeyJmZmxvYXQiLCBmbG9hdF9jb25zLCAnZid9LAotICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAotICB7ImhhbGYiLCBjb25zLCAyfSwKLSAgeyJic3MiLCBzX2xjb21tLCAxfSwKLSAgeyJzdHJpbmciLCBzdHJpbmdlciwgMH0sCi0gIHsid29yZCIsIGNvbnMsIDR9LAotICAvKiBGb3JjZSBzZXQgdG8gYmUgdHJlYXRlZCBhcyBhbiBpbnN0cnVjdGlvbi4gICovCi0gIHsic2V0IiwgTlVMTCwgMH0sCi0gIHsiLnNldCIsIHNfc2V0LCAwfSwKLSAgezB9Ci19OwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0KLSAgLyogaW5pdGlhbGl6ZSBoYXNoIHRhYmxlICovCi0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIGxvb3AgdW50aWwgeW91IHNlZSB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCi0KLSAgd2hpbGUgKCptODhrX29wY29kZXNbaV0ubmFtZSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lID0gbTg4a19vcGNvZGVzW2ldLm5hbWU7Ci0KLSAgICAgIC8qIGhhc2ggZWFjaCBtbmVtb25pYyBhbmQgcmVjb3JkIGl0cyBwb3NpdGlvbiAqLwotCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgbmFtZSwgJm04OGtfb3Bjb2Rlc1tpXSk7Ci0KLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQlhc19mYXRhbCAoXygiQ2FuJ3QgaGFzaCBpbnN0cnVjdGlvbiAnJXMnOiVzIiksCi0JCSAgbTg4a19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0KLSAgICAgIC8qIHNraXAgdG8gbmV4dCB1bmlxdWUgbW5lbW9uaWMgb3IgZW5kIG9mIGxpc3QgKi8KLQotICAgICAgZm9yIChpKys7ICFzdHJjbXAgKG04OGtfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKTsgaSsrKQotCTsKLSAgICB9Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotfQotDAotdm9pZAotbWRfYXNzZW1ibGUgKG9wKQotICAgICBjaGFyICpvcDsKLXsKLSAgY2hhciAqcGFyYW0sICp0aGlzZnJhZzsKLSAgY2hhciBjOwotICBzdHJ1Y3QgbTg4a19vcGNvZGUgKmZvcm1hdDsKLSAgc3RydWN0IG04OGtfaW5zbiBpbnNuOwotCi0gIGFzc2VydCAob3ApOwotCi0gIC8qIHNraXAgb3ZlciBpbnN0cnVjdGlvbiB0byBmaW5kIHBhcmFtZXRlcnMgKi8KLQotICBmb3IgKHBhcmFtID0gb3A7ICpwYXJhbSAhPSAwICYmICFpc3NwYWNlICgqcGFyYW0pOyBwYXJhbSsrKQotICAgIDsKLSAgYyA9ICpwYXJhbTsKLSAgKnBhcmFtKysgPSAnXDAnOwotCi0gIC8qIHRyeSB0byBmaW5kIHRoZSBpbnN0cnVjdGlvbiBpbiB0aGUgaGFzaCB0YWJsZSAqLwotCi0gIGlmICgoZm9ybWF0ID0gKHN0cnVjdCBtODhrX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIG9wKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkludmFsaWQgbW5lbW9uaWMgJyVzJyIpLCBvcCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIHRyeSBwYXJzaW5nIHRoaXMgaW5zdHJ1Y3Rpb24gaW50byBpbnNuICovCi0KLSAgaW5zbi5leHAuWF9hZGRfc3ltYm9sID0gMDsKLSAgaW5zbi5leHAuWF9vcF9zeW1ib2wgPSAwOwotICBpbnNuLmV4cC5YX2FkZF9udW1iZXIgPSAwOwotICBpbnNuLmV4cC5YX29wID0gT19pbGxlZ2FsOwotICBpbnNuLnJlbG9jID0gTk9fUkVMT0M7Ci0KLSAgd2hpbGUgKCFjYWxjb3AgKGZvcm1hdCwgcGFyYW0sICZpbnNuKSkKLSAgICB7Ci0gICAgICAvKiBpZiBpdCBkb2Vzbid0IHBhcnNlIHRyeSB0aGUgbmV4dCBpbnN0cnVjdGlvbiAqLwotCi0gICAgICBpZiAoIXN0cmNtcCAoZm9ybWF0WzBdLm5hbWUsIGZvcm1hdFsxXS5uYW1lKSkKLQlmb3JtYXQrKzsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19mYXRhbCAoXygiUGFyYW1ldGVyIHN5bnRheCBlcnJvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIGdyb3cgdGhlIGN1cnJlbnQgZnJhZyBhbmQgcGxvcCBpbiB0aGUgb3Bjb2RlICovCi0KLSAgdGhpc2ZyYWcgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoaXNmcmFnLCBpbnNuLm9wY29kZSwgNCk7Ci0KLSAgLyogaWYgdGhpcyBpbnN0cnVjdGlvbiByZXF1aXJlcyBsYWJlbHMgbWFyayBpdCBmb3IgbGF0ZXIgKi8KLQotICBzd2l0Y2ggKGluc24ucmVsb2MpCi0gICAgewotICAgIGNhc2UgTk9fUkVMT0M6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfTE8xNjoKLSAgICBjYXNlIFJFTE9DX0hJMTY6Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIHRoaXNmcmFnIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyAyLAotCQkgICAyLAotCQkgICAmaW5zbi5leHAsCi0JCSAgIDAsCi0JCSAgIGluc24ucmVsb2MpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0lXMTY6Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIHRoaXNmcmFnIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSAgIDQsCi0JCSAgICZpbnNuLmV4cCwKLQkJICAgMCwKLQkJICAgaW5zbi5yZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIDIsCi0JCSAgIDIsCi0JCSAgICZpbnNuLmV4cCwKLQkJICAgMSwKLQkJICAgaW5zbi5yZWxvYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgdGhpc2ZyYWcgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgNCwKLQkJICAgJmluc24uZXhwLAotCQkgICAxLAotCQkgICBpbnNuLnJlbG9jKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2ZhdGFsIChfKCJVbmtub3duIHJlbG9jYXRpb24gdHlwZSIpKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGludAotY2FsY29wIChmb3JtYXQsIHBhcmFtLCBpbnNuKQotICAgICBzdHJ1Y3QgbTg4a19vcGNvZGUgKmZvcm1hdDsKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHN0cnVjdCBtODhrX2luc24gKmluc247Ci17Ci0gIGNoYXIgKmZtdCA9IGZvcm1hdC0+b3Bfc3BlYzsKLSAgaW50IGY7Ci0gIHVuc2lnbmVkIHZhbDsKLSAgdW5zaWduZWQgb3Bjb2RlOwotICBpbnQgcmVnX3ByZWZpeCA9ICdyJzsKLQotICBpbnNuLT5vcGNvZGUgPSBmb3JtYXQtPm9wY29kZTsKLSAgb3Bjb2RlID0gMDsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmIChwYXJhbSA9PSAwKQotCXJldHVybiAwOwotICAgICAgZiA9ICpmbXQrKzsKLSAgICAgIHN3aXRjaCAoZikKLQl7Ci0JY2FzZSAwOgotCSAgaW5zbi0+b3Bjb2RlIHw9IG9wY29kZTsKLQkgIHJldHVybiAoKnBhcmFtID09IDAgfHwgKnBhcmFtID09ICdcbicpOwotCi0JZGVmYXVsdDoKLQkgIGlmIChmICE9ICpwYXJhbSsrKQotCSAgICByZXR1cm4gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZCc6Ci0JICBwYXJhbSA9IGdldF9yZWcgKHBhcmFtLCAmdmFsLCByZWdfcHJlZml4KTsKLQkgIHJlZ19wcmVmaXggPSAncic7Ci0JICBvcGNvZGUgfD0gdmFsIDw8IDIxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdvJzoKLQkgIHBhcmFtID0gZ2V0X282IChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gKCh2YWwgPj4gMikgPDwgNyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ3gnOgotCSAgcmVnX3ByZWZpeCA9ICd4JzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnMSc6Ci0JICBwYXJhbSA9IGdldF9yZWcgKHBhcmFtLCAmdmFsLCByZWdfcHJlZml4KTsKLQkgIHJlZ19wcmVmaXggPSAncic7Ci0JICBvcGNvZGUgfD0gdmFsIDw8IDE2OwotCSAgYnJlYWs7Ci0KLQljYXNlICcyJzoKLQkgIHBhcmFtID0gZ2V0X3JlZyAocGFyYW0sICZ2YWwsIHJlZ19wcmVmaXgpOwotCSAgcmVnX3ByZWZpeCA9ICdyJzsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJzMnOgotCSAgcGFyYW0gPSBnZXRfcmVnIChwYXJhbSwgJnZhbCwgJ3InKTsKLQkgIG9wY29kZSB8PSAodmFsIDw8IDE2KSB8IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSSc6Ci0JICBwYXJhbSA9IGdldF9pbW0xNiAocGFyYW0sIGluc24pOwotCSAgYnJlYWs7Ci0KLQljYXNlICdiJzoKLQkgIHBhcmFtID0gZ2V0X2JmIChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICdwJzoKLQkgIHBhcmFtID0gZ2V0X3BjciAocGFyYW0sIGluc24sIFJFTE9DX1BDMTYpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdQJzoKLQkgIHBhcmFtID0gZ2V0X3BjciAocGFyYW0sIGluc24sIFJFTE9DX1BDMjYpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdCJzoKLQkgIHBhcmFtID0gZ2V0X2NtcCAocGFyYW0sICZ2YWwpOwotCSAgb3Bjb2RlIHw9IHZhbDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTSc6Ci0JICBwYXJhbSA9IGdldF9jbmQgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWw7Ci0JICBicmVhazsKLQotCWNhc2UgJ2MnOgotCSAgcGFyYW0gPSBnZXRfY3IgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWwgPDwgNTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBwYXJhbSA9IGdldF9mY3IgKHBhcmFtLCAmdmFsKTsKLQkgIG9wY29kZSB8PSB2YWwgPDwgNTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVic6Ci0JICBwYXJhbSA9IGdldF92ZWM5IChwYXJhbSwgJnZhbCk7Ci0JICBvcGNvZGUgfD0gdmFsOwotCSAgYnJlYWs7Ci0KLQljYXNlICc/JzoKLQkgIC8qIEhhdmluZyB0aGlzIGhlcmUgcmVwZWF0cyB0aGUgd2FybmluZyBzb210aW1lcy4KLQkgICBCdXQgY2FuJ3Qgd2Ugc3RhbmQgdGhhdD8gICovCi0JICBhc193YXJuIChfKCJVc2Ugb2Ygb2Jzb2xldGUgaW5zdHJ1Y3Rpb24iKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1tYXRjaF9uYW1lIChwYXJhbSwgYXNzb2NfdGFiLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgc3RydWN0IGZpZWxkX3ZhbF9hc3NvYyAqYXNzb2NfdGFiOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBuYW1lX2xlbjsKLQotICBmb3IgKGkgPSAwOzsgaSsrKQotICAgIHsKLSAgICAgIG5hbWUgPSBhc3NvY190YWJbaV0ubmFtZTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBuYW1lX2xlbiA9IHN0cmxlbiAobmFtZSk7Ci0gICAgICBpZiAoIXN0cm5jbXAgKHBhcmFtLCBuYW1lLCBuYW1lX2xlbikpCi0JewotCSAgKnZhbHAgPSBhc3NvY190YWJbaV0udmFsOwotCSAgcmV0dXJuIHBhcmFtICsgbmFtZV9sZW47Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3JlZyAocGFyYW0sIHJlZ25vcCwgcmVnX3ByZWZpeCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICpyZWdub3A7Ci0gICAgIGludCByZWdfcHJlZml4OwotewotICB1bnNpZ25lZCBjOwotICB1bnNpZ25lZCByZWdubzsKLQotICBjID0gKnBhcmFtKys7Ci0gIGlmIChjID09IHJlZ19wcmVmaXgpCi0gICAgewotICAgICAgcmVnbm8gPSAqcGFyYW0rKyAtICcwJzsKLSAgICAgIGlmIChyZWdubyA8IDEwKQotCXsKLQkgIGlmIChyZWdubyA9PSAwKQotCSAgICB7Ci0JICAgICAgKnJlZ25vcCA9IDA7Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JICBjID0gKnBhcmFtIC0gJzAnOwotCSAgaWYgKGMgPCAxMCkKLQkgICAgewotCSAgICAgIHJlZ25vID0gcmVnbm8gKiAxMCArIGM7Ci0JICAgICAgaWYgKGMgPCAzMikKLQkJewotCQkgICpyZWdub3AgPSByZWdubzsKLQkJICByZXR1cm4gcGFyYW0gKyAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgICpyZWdub3AgPSByZWdubzsKLQkgICAgICByZXR1cm4gcGFyYW07Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKGMgPT0gJ3MnICYmIHBhcmFtWzBdID09ICdwJykKLSAgICB7Ci0gICAgICAqcmVnbm9wID0gMzE7Ci0gICAgICByZXR1cm4gcGFyYW0gKyAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2ltbTE2IChwYXJhbSwgaW5zbikKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHN0cnVjdCBtODhrX2luc24gKmluc247Ci17Ci0gIGVudW0gcmVsb2NfdHlwZSByZWxvYyA9IE5PX1JFTE9DOwotICB1bnNpZ25lZCBpbnQgdmFsOwotICBjaGFyICpzYXZlX3B0cjsKLQotICBpZiAoIXN0cm5jbXAgKHBhcmFtLCAiaGkxNiIsIDQpICYmICFpc2FsbnVtIChwYXJhbVs0XSkpCi0gICAgewotICAgICAgcmVsb2MgPSBSRUxPQ19ISTE2OwotICAgICAgcGFyYW0gKz0gNDsKLSAgICB9Ci0gIGVsc2UgaWYgKCFzdHJuY21wIChwYXJhbSwgImxvMTYiLCA0KSAmJiAhaXNhbG51bSAocGFyYW1bNF0pKQotICAgIHsKLSAgICAgIHJlbG9jID0gUkVMT0NfTE8xNjsKLSAgICAgIHBhcmFtICs9IDQ7Ci0gICAgfQotICBlbHNlIGlmICghc3RybmNtcCAocGFyYW0sICJpdzE2IiwgNCkgJiYgIWlzYWxudW0gKHBhcmFtWzRdKSkKLSAgICB7Ci0gICAgICByZWxvYyA9IFJFTE9DX0lXMTY7Ci0gICAgICBwYXJhbSArPSA0OwotICAgIH0KLQotICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gIGV4cHJlc3Npb24gKCZpbnNuLT5leHApOwotICBwYXJhbSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9wdHI7Ci0KLSAgdmFsID0gaW5zbi0+ZXhwLlhfYWRkX251bWJlcjsKLQotICBpZiAoaW5zbi0+ZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICAvKiBJbnNlcnQgdGhlIHZhbHVlIG5vdywgYW5kIHJlc2V0IHJlbG9jIHRvIE5PX1JFTE9DLiAgKi8KLSAgICAgIGlmIChyZWxvYyA9PSBOT19SRUxPQykKLQl7Ci0JICAvKiBXYXJuIGFib3V0IHRvbyBiaWcgZXhwcmVzc2lvbnMgaWYgbm90IHN1cnJvdW5kZWQgYnkgeHgxNi4gICovCi0JICBpZiAodmFsID4gMHhmZmZmKQotCSAgICBhc193YXJuIChfKCJFeHByZXNzaW9uIHRydW5jYXRlZCB0byAxNiBiaXRzIikpOwotCX0KLQotICAgICAgaWYgKHJlbG9jID09IFJFTE9DX0hJMTYpCi0JdmFsID4+PSAxNjsKLQotICAgICAgaW5zbi0+b3Bjb2RlIHw9IHZhbCAmIDB4ZmZmZjsKLSAgICAgIHJlbG9jID0gTk9fUkVMT0M7Ci0gICAgfQotICBlbHNlIGlmIChyZWxvYyA9PSBOT19SRUxPQykKLSAgICAvKiBXZSBhY2NlcHQgYSBzeW1ib2wgZXZlbiB3aXRob3V0IGxvMTYsIGhpMTYsIGV0YywgYW5kIGFzc3VtZQotICAgICAgIGxvMTYgd2FzIGludGVuZGVkLiAgKi8KLSAgICByZWxvYyA9IFJFTE9DX0xPMTY7Ci0KLSAgaW5zbi0+cmVsb2MgPSByZWxvYzsKLQotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9wY3IgKHBhcmFtLCBpbnNuLCByZWxvYykKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHN0cnVjdCBtODhrX2luc24gKmluc247Ci0gICAgIGVudW0gcmVsb2NfdHlwZSByZWxvYzsKLXsKLSAgY2hhciAqc2F2ZXB0ciwgKnNhdmVwYXJhbTsKLQotICBzYXZlcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLQotICBleHByZXNzaW9uICgmaW5zbi0+ZXhwKTsKLQotICBzYXZlcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVwdHI7Ci0KLSAgLyogQm90Y2g6IFdlIHNob3VsZCByZWxvY2F0ZSBub3cgaWYgT19jb25zdGFudC4gICovCi0gIGluc24tPnJlbG9jID0gcmVsb2M7Ci0KLSAgcmV0dXJuIHNhdmVwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2NtcCAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgdW5zaWduZWQgaW50IHZhbDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgc2F2ZV9wdHIgPSBwYXJhbTsKLQotICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBjbXBzbG90LCB2YWxwKTsKLSAgdmFsID0gKnZhbHA7Ci0KLSAgaWYgKHBhcmFtID09IE5VTEwpCi0gICAgewotICAgICAgcGFyYW0gPSBzYXZlX3B0cjsKLQotICAgICAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgICAgIHZhbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICAgICAgaWYgKHZhbCA+PSAzMikKLQl7Ci0JICBhc193YXJuIChfKCJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA1IGJpdHMiKSk7Ci0JICB2YWwgJT0gMzI7Ci0JfQotICAgIH0KLQotICAqdmFscCA9IHZhbCA8PCAyMTsKLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfY25kIChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCBpbnQgdmFsOwotCi0gIGlmIChpc2RpZ2l0ICgqcGFyYW0pKQotICAgIHsKLSAgICAgIHBhcmFtID0gZ2V0dmFsIChwYXJhbSwgJnZhbCk7Ci0KLSAgICAgIGlmICh2YWwgPj0gMzIpCi0JewotCSAgYXNfd2FybiAoXygiRXhwcmVzc2lvbiB0cnVuY2F0ZWQgdG8gNSBiaXRzIikpOwotCSAgdmFsICU9IDMyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKnBhcmFtKSkKLQkqcGFyYW0gPSB0b2xvd2VyICgqcGFyYW0pOwotCi0gICAgICBpZiAoaXN1cHBlciAocGFyYW1bMV0pKQotCXBhcmFtWzFdID0gdG9sb3dlciAocGFyYW1bMV0pOwotCi0gICAgICBwYXJhbSA9IG1hdGNoX25hbWUgKHBhcmFtLCBjbmRtc2ssIHZhbHApOwotCi0gICAgICBpZiAocGFyYW0gPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgdmFsID0gKnZhbHA7Ci0gICAgfQotCi0gICp2YWxwID0gdmFsIDw8IDIxOwotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9iZjIgKHBhcmFtLCBiYykKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIGludCBiYzsKLXsKLSAgaW50IGRlcHRoID0gMDsKLSAgaW50IGM7Ci0KLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjID0gKnBhcmFtOwotICAgICAgaWYgKGMgPT0gMCkKLQlyZXR1cm4gcGFyYW07Ci0gICAgICBlbHNlIGlmIChjID09ICcoJykKLQlkZXB0aCsrOwotICAgICAgZWxzZSBpZiAoYyA9PSAnKScpCi0JZGVwdGgtLTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gYmMgJiYgZGVwdGggPD0gMCkKLQlyZXR1cm4gcGFyYW07Ci0gICAgICBwYXJhbSsrOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X2JmX29mZnNldF9leHByZXNzaW9uIChwYXJhbSwgb2Zmc2V0cCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICpvZmZzZXRwOwotewotICB1bnNpZ25lZCBvZmZzZXQ7Ci0KLSAgaWYgKGlzYWxwaGEgKHBhcmFtWzBdKSkKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAocGFyYW1bMF0pKQotCXBhcmFtWzBdID0gdG9sb3dlciAocGFyYW1bMF0pOwotICAgICAgaWYgKGlzdXBwZXIgKHBhcmFtWzFdKSkKLQlwYXJhbVsxXSA9IHRvbG93ZXIgKHBhcmFtWzFdKTsKLQotICAgICAgcGFyYW0gPSBtYXRjaF9uYW1lIChwYXJhbSwgY21wc2xvdCwgb2Zmc2V0cCk7Ci0KLSAgICAgIHJldHVybiBwYXJhbTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgICAgIG9mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gICpvZmZzZXRwID0gb2Zmc2V0OwotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9iZiAocGFyYW0sIHZhbHApCi0gICAgIGNoYXIgKnBhcmFtOwotICAgICB1bnNpZ25lZCAqdmFscDsKLXsKLSAgdW5zaWduZWQgb2Zmc2V0ID0gMDsKLSAgdW5zaWduZWQgd2lkdGggPSAwOwotICBjaGFyICp4cDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgeHAgPSBnZXRfYmYyIChwYXJhbSwgJzwnKTsKLQotICBzYXZlX3B0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyYW07Ci0gIGlmICgqeHAgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBkaWQgbm90IGZpbmQgJzwnLiAgV2UgaGF2ZSBhbiBvZmZzZXQgKHdpZHRoIGltcGxpY2l0bHkgMzIpLiAgKi8KLSAgICAgIHBhcmFtID0gZ2V0X2JmX29mZnNldF9leHByZXNzaW9uIChwYXJhbSwgJm9mZnNldCk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLSAgICAgIGlmIChwYXJhbSA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICp4cCsrID0gMDsJCS8qIE92ZXJ3cml0ZSB0aGUgJzwnICovCi0gICAgICBwYXJhbSA9IGdldF9iZjIgKHhwLCAnPicpOwotICAgICAgaWYgKCpwYXJhbSA9PSAwKQotCXJldHVybiBOVUxMOwotICAgICAgKnBhcmFtKysgPSAwOwkJLyogT3ZlcndyaXRlIHRoZSAnPicgKi8KLQotICAgICAgd2lkdGggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHhwID0gZ2V0X2JmX29mZnNldF9leHByZXNzaW9uICh4cCwgJm9mZnNldCk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICAgICAgaWYgKHhwICsgMSAhPSBwYXJhbSkKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgKnZhbHAgPSAoKHdpZHRoICUgMzIpIDw8IDUpIHwgKG9mZnNldCAlIDMyKTsKLQotICByZXR1cm4gcGFyYW07Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdldF9jciAocGFyYW0sIHJlZ25vcCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICpyZWdub3A7Ci17Ci0gIHVuc2lnbmVkIHJlZ25vOwotICB1bnNpZ25lZCBjOwotCi0gIGlmICghc3RybmNtcCAocGFyYW0sICJjciIsIDIpKQotICAgIHsKLSAgICAgIHBhcmFtICs9IDI7Ci0KLSAgICAgIHJlZ25vID0gKnBhcmFtKysgLSAnMCc7Ci0gICAgICBpZiAocmVnbm8gPCAxMCkKLQl7Ci0JICBpZiAocmVnbm8gPT0gMCkKLQkgICAgewotCSAgICAgICpyZWdub3AgPSAwOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCSAgYyA9ICpwYXJhbSAtICcwJzsKLQkgIGlmIChjIDwgMTApCi0JICAgIHsKLQkgICAgICByZWdubyA9IHJlZ25vICogMTAgKyBjOwotCSAgICAgIGlmIChjIDwgNjQpCi0JCXsKLQkJICAqcmVnbm9wID0gcmVnbm87Ci0JCSAgcmV0dXJuIHBhcmFtICsgMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gcmVnbm87Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGNyX3JlZ3MsIHJlZ25vcCk7Ci0KLSAgcmV0dXJuIHBhcmFtOwotfQotCi1zdGF0aWMgY2hhciAqCi1nZXRfZmNyIChwYXJhbSwgcmVnbm9wKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnJlZ25vcDsKLXsKLSAgdW5zaWduZWQgcmVnbm87Ci0gIHVuc2lnbmVkIGM7Ci0KLSAgaWYgKCFzdHJuY21wIChwYXJhbSwgImZjciIsIDMpKQotICAgIHsKLSAgICAgIHBhcmFtICs9IDM7Ci0KLSAgICAgIHJlZ25vID0gKnBhcmFtKysgLSAnMCc7Ci0gICAgICBpZiAocmVnbm8gPCAxMCkKLQl7Ci0JICBpZiAocmVnbm8gPT0gMCkKLQkgICAgewotCSAgICAgICpyZWdub3AgPSAwOwotCSAgICAgIHJldHVybiBwYXJhbTsKLQkgICAgfQotCSAgYyA9ICpwYXJhbSAtICcwJzsKLQkgIGlmIChjIDwgMTApCi0JICAgIHsKLQkgICAgICByZWdubyA9IHJlZ25vICogMTAgKyBjOwotCSAgICAgIGlmIChjIDwgNjQpCi0JCXsKLQkJICAqcmVnbm9wID0gcmVnbm87Ci0JCSAgcmV0dXJuIHBhcmFtICsgMTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAqcmVnbm9wID0gcmVnbm87Ci0JICAgICAgcmV0dXJuIHBhcmFtOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHBhcmFtID0gbWF0Y2hfbmFtZSAocGFyYW0sIGZjcl9yZWdzLCByZWdub3ApOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X3ZlYzkgKHBhcmFtLCB2YWxwKQotICAgICBjaGFyICpwYXJhbTsKLSAgICAgdW5zaWduZWQgKnZhbHA7Ci17Ci0gIHVuc2lnbmVkIHZhbDsKLSAgY2hhciAqc2F2ZV9wdHI7Ci0KLSAgc2F2ZV9wdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHBhcmFtOwotICB2YWwgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgcGFyYW0gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfcHRyOwotCi0gIGlmICh2YWwgPj0gMSA8PCA5KQotICAgIGFzX3dhcm4gKF8oIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDkgYml0cyIpKTsKLQotICAqdmFscCA9IHZhbCAlICgxIDw8IDkpOwotCi0gIHJldHVybiBwYXJhbTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2V0X282IChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkICp2YWxwOwotewotICB1bnNpZ25lZCB2YWw7Ci0gIGNoYXIgKnNhdmVfcHRyOwotCi0gIHNhdmVfcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJhbTsKLSAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHBhcmFtID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX3B0cjsKLQotICBpZiAodmFsICYgMHgzKQotICAgIGFzX3dhcm4gKF8oIlJlbW92ZWQgbG93ZXIgMiBiaXRzIG9mIGV4cHJlc3Npb24iKSk7Ci0KLSAgKnZhbHAgPSB2YWw7Ci0KLSAgcmV0dXJuKHBhcmFtKTsKLX0KLQotI2RlZmluZSBoZXh2YWwoeikgXAotICAoaXNkaWdpdCAoeikgPyAoeikgLSAnMCcgOgkJCQkJCVwKLSAgIGlzbG93ZXIgKHopID8gKHopIC0gJ2EnICsgMTAgOiAJCQkJCVwKLSAgIGlzdXBwZXIgKHopID8gKHopIC0gJ0EnICsgMTAgOiAtMSkKLQotc3RhdGljIGNoYXIgKgotZ2V0dmFsIChwYXJhbSwgdmFscCkKLSAgICAgY2hhciAqcGFyYW07Ci0gICAgIHVuc2lnbmVkIGludCAqdmFscDsKLXsKLSAgdW5zaWduZWQgaW50IHZhbCA9IDA7Ci0gIHVuc2lnbmVkIGludCBjOwotCi0gIGMgPSAqcGFyYW0rKzsKLSAgaWYgKGMgPT0gJzAnKQotICAgIHsKLSAgICAgIGMgPSAqcGFyYW0rKzsKLSAgICAgIGlmIChjID09ICd4JyB8fCBjID09ICdYJykKLQl7Ci0JICBjID0gKnBhcmFtKys7Ci0JICBjID0gaGV4dmFsIChjKTsKLQkgIHdoaWxlIChjIDwgMTYpCi0JICAgIHsKLQkgICAgICB2YWwgPSB2YWwgKiAxNiArIGM7Ci0JICAgICAgYyA9ICpwYXJhbSsrOwotCSAgICAgIGMgPSBoZXh2YWwgKGMpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGMgLT0gJzAnOwotCSAgd2hpbGUgKGMgPCA4KQotCSAgICB7Ci0JICAgICAgdmFsID0gdmFsICogOCArIGM7Ci0JICAgICAgYyA9ICpwYXJhbSsrIC0gJzAnOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgLT0gJzAnOwotICAgICAgd2hpbGUgKGMgPCAxMCkKLQl7Ci0JICB2YWwgPSB2YWwgKiAxMCArIGM7Ci0JICBjID0gKnBhcmFtKysgLSAnMCc7Ci0JfQotICAgIH0KLQotICAqdmFscCA9IHZhbDsKLSAgcmV0dXJuIHBhcmFtIC0gMTsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbmJ5dGVzKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuYnl0ZXMpOwotfQotCi0jaWYgMAotCi0vKiBUaGlzIHJvdXRpbmUgaXMgbmV2ZXIgY2FsbGVkLiAgV2hhdCBpcyBpdCBmb3I/Ci0gICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCAxMyBKdWwgMTk5MyAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9faW1tIChidWYsIHZhbCwgbmJ5dGVzLCBmaXhQLCBzZWdfdHlwZSkKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICB1bnNpZ25lZCBpbnQgdmFsOwotICAgICBpbnQgbmJ5dGVzOwotICAgICBmaXhTICpmaXhQOwotICAgICBpbnQgc2VnX3R5cGU7Ci17Ci0gIGlmIChzZWdfdHlwZSAhPSBOX1RFWFQgfHwgZml4UC0+Znhfcl90eXBlID09IE5PX1JFTE9DKQotICAgIHsKLSAgICAgIHN3aXRjaCAobmJ5dGVzKQotCXsKLQljYXNlIDQ6Ci0JICAqYnVmKysgPSB2YWwgPj4gMjQ7Ci0JICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0JY2FzZSAyOgotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JY2FzZSAxOgotCSAgKmJ1ZiA9IHZhbDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUkVMT0NfSVcxNjoKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0xPMTY6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlsxXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19ISTE2OgotICAgICAgYnVmWzBdID0gdmFsID4+IDI0OwotICAgICAgYnVmWzFdID0gdmFsID4+IDE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICB2YWwgKz0gNDsKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICB2YWwgKz0gNDsKLSAgICAgIGJ1ZlswXSB8PSAodmFsID4+IDI2KSAmIDB4MDM7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTg7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gMTA7Ci0gICAgICBidWZbM10gPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ18zMjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAyNDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIkJhZCByZWxvY2F0aW9uIHR5cGUiKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLXZvaWQKLW1kX251bWJlcl90b19kaXNwIChidWYsIHZhbCwgbmJ5dGVzKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCB2YWw7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9udW1iZXJfdG9fZGlzcCBub3QgZGVmaW5lZCIpKTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbmJ5dGVzKTsKLX0KLQotdm9pZAotbWRfbnVtYmVyX3RvX2ZpZWxkIChidWYsIHZhbCwgbmJ5dGVzKQotICAgICBjaGFyICpidWY7Ci0gICAgIGludCB2YWw7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGFzX2ZhdGFsIChfKCJtZF9udW1iZXJfdG9fZmllbGQgbm90IGRlZmluZWQiKSk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG5ieXRlcyk7Ci19Ci0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNgotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICAgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIgb2YgTElUVExFTlVNUwotICAgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suCi0gKi8KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0UCwgc2l6ZVApCi0gICAgIGNoYXIgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSA0OwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHB0clswXSA9IChjaGFyKSAweGMwOwotICBwdHJbMV0gPSAweDAwOwotICBwdHJbMl0gPSAweDAwOwotICBwdHJbM10gPSAweDAwOwotICBmaXhfbmV3IChmcmFnLAotCSAgIHB0ciAtIGZyYWctPmZyX2xpdGVyYWwsCi0JICAgNCwKLQkgICB0b19zeW1ib2wsCi0JICAgKG9mZnNldFQpIDAsCi0JICAgMCwKLQkgICBSRUxPQ19QQzI2KTsJCS8qIEJvdGNoOiBTaG91bGRuJ3QgdGhpcyBiZSBSRUxPQ19QQzE2PyAqLwotfQotCi1pbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA0OwotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgcHRyWzBdID0gKGNoYXIpIDB4YzA7Ci0gIHB0clsxXSA9IDB4MDA7Ci0gIHB0clsyXSA9IDB4MDA7Ci0gIHB0clszXSA9IDB4MDA7Ci0gIGZpeF9uZXcgKGZyYWcsCi0JICAgcHRyIC0gZnJhZy0+ZnJfbGl0ZXJhbCwKLQkgICA0LAotCSAgIHRvX3N5bWJvbCwKLQkgICAob2Zmc2V0VCkgMCwKLQkgICAwLAotCSAgIFJFTE9DX1BDMjYpOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudF90eXBlOwotewotICBhc19mYXRhbCAoXygiUmVsYXhhdGlvbiBzaG91bGQgbmV2ZXIgb2NjdXIiKSk7Ci0gIHJldHVybiAoLTEpOwotfQotCi0jaWYgMAotCi0vKiBBcyBmYXIgYXMgSSBjYW4gdGVsbCwgdGhpcyByb3V0aW5lIGlzIG5ldmVyIGNhbGxlZC4gIFdoYXQgaXMgaXQKLSAgIGRvaW5nIGhlcmU/Ci0gICBJYW4gVGF5bG9yLCBDeWdudXMgU3VwcG9ydCAxMyBKdWwgMTk5MyAqLwotCi0KLS8qCi0gKiBSaXNjIHJlbG9jYXRpb25zIGFyZSBjb21wbGV0ZWx5IGRpZmZlcmVudCwgc28gaXQgbmVlZHMKLSAqIHRoaXMgbWFjaGluZSBkZXBlbmRlbnQgcm91dGluZSB0byBlbWl0IHRoZW0uCi0gKi8KLXZvaWQKLWVtaXRfcmVsb2NhdGlvbnMgKGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgc3RydWN0IHJlbG9jX2luZm9fbTg4ayByaTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgZXh0ZXJuIGNoYXIgKm5leHRfb2JqZWN0X2ZpbGVfY2hhclA7Ci0KLSAgYnplcm8gKChjaGFyICopICZyaSwgc2l6ZW9mIChyaSkpOwotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA+PSBOT19SRUxPQykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJmaXhQLT5meF9yX3R5cGUgPSAlZFxuIiwgZml4UC0+Znhfcl90eXBlKTsKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaWYgKChzeW1ib2xQID0gZml4UC0+ZnhfYWRkc3kpICE9IE5VTEwpCi0JewotCSAgcmkucl9hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArCi0JICAgIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci0JICBpZiAoKHN5bWJvbFAtPnN5X3R5cGUgJiBOX1RZUEUpID09IE5fVU5ERikKLQkgICAgewotCSAgICAgIHJpLnJfZXh0ZXJuID0gMTsKLQkgICAgICByaS5yX3N5bWJvbG51bSA9IHN5bWJvbFAtPnN5X251bWJlcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmkucl9leHRlcm4gPSAwOwotCSAgICAgIHJpLnJfc3ltYm9sbnVtID0gc3ltYm9sUC0+c3lfdHlwZSAmIE5fVFlQRTsKLQkgICAgfQotCSAgaWYgKHN5bWJvbFAgJiYgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSkKLQkgICAgewotCSAgICAgIHJpLnJfYWRkZW5kID0gc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfYWRkcmVzczsKLQkgICAgfQotCSAgcmkucl90eXBlID0gZml4UC0+Znhfcl90eXBlOwotCSAgaWYgKGZpeFAtPmZ4X3BjcmVsKQotCSAgICB7Ci0JICAgICAgcmkucl9hZGRlbmQgLT0gcmkucl9hZGRyZXNzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByaS5yX2FkZGVuZCA9IGZpeFAtPmZ4X2FkZG51bWJlcjsKLQkgICAgfQotCi0JICBhcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCAoY2hhciAqKSAmcmksIHNpemVvZiAocmkpKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYgLyogMCAqLwotCi0jaWYgMAotCi0vKiBUaGlzIHJvdXRpbmUgY2FuIGJlIHN1YnN1bWVkIGJ5IHNfbGNvbW0gaW4gcmVhZC5jLgotICAgSWFuIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQgMTMgSnVsIDE5OTMgKi8KLQotCi1zdGF0aWMgdm9pZAotc19ic3MgKCkKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICpwOwotICBpbnQgdGVtcCwgYnNzX2FsaWduOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBpZiAoKHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJTUyBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGJzc19hbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIGJzc19hbGlnbiA9IDA7Ci0KLSAgaWYgKCFTX0lTX0RFRklORUQoc3ltYm9sUCkKLSAgICAgIHx8IFNfR0VUX1NFR01FTlQoc3ltYm9sUCkgPT0gU0VHX0JTUykKLSAgICB7Ci0gICAgICBpZiAoISBuZWVkX3Bhc3NfMikKLQl7Ci0JICBjaGFyICpwOwotCSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0JICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCSAgc3Vic2VnX3NldCAoU0VHX0JTUywgMSk7IC8qIHN3aXRjaCB0byBic3MJKi8KLQotCSAgaWYgKGJzc19hbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYnNzX2FsaWduLCAwLCAwKTsKLQotCSAgLyogZGV0YWNoIGZyb20gb2xkIGZyYWcgKi8KLQkgIGlmIChzeW1ib2xQLT5zeV90eXBlID09IE5fQlNTICYmIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgIT0gTlVMTCkKLQkgICAgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gTlVMTDsKLQotCSAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0JICBwID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAotCQkJKG9mZnNldFQpIHRlbXAsIChjaGFyICopMCk7Ci0JICAqcCA9IDA7Ci0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTRUdfQlNTKTsKLQotCSAgc3Vic2VnX3NldCAoY3VycmVudF9zZWcsIGN1cnJlbnRfc3Vic2VnKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybiAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sICVzLiIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiAwICovCi0KLSNpZmRlZiBNODhLQ09GRgotCi0vKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5lZWRlZCBpZiB3ZSBhcmUgbGlua2luZyB3aXRoIG9iai1jb2ZmYmZkLmMuCi0gICBUaGF0IGZpbGUgbWF5IGJlIHJlcGxhY2VkIGJ5IGEgbW9yZSBCRkQgb3JpZW50ZWQgdmVyc2lvbiBhdCBzb21lCi0gICBwb2ludC4gIElmIHRoYXQgaGFwcGVucywgdGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSByZXhhbWluZWQuCi0KLSAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCAxMyBKdWx5IDE5OTMuICAqLwotCi0vKiBHaXZlbiBhIGZpeFMgc3RydWN0dXJlIChjcmVhdGVkIGJ5IGEgY2FsbCB0byBmaXhfbmV3LCBhYm92ZSksCi0gICByZXR1cm4gdGhlIEJGRCByZWxvY2F0aW9uIHR5cGUgdG8gdXNlIGZvciBpdC4gICovCi0KLXNob3J0Ci10Y19jb2ZmX2ZpeDJydHlwZSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUkVMT0NfTE8xNjoKLSAgICAgIHJldHVybiBSX0xWUlQxNjsKLSAgICBjYXNlIFJFTE9DX0hJMTY6Ci0gICAgICByZXR1cm4gUl9IVlJUMTY7Ci0gICAgY2FzZSBSRUxPQ19QQzE2OgotICAgICAgcmV0dXJuIFJfUENSMTZMOwotICAgIGNhc2UgUkVMT0NfUEMyNjoKLSAgICAgIHJldHVybiBSX1BDUjI2TDsKLSAgICBjYXNlIFJFTE9DXzMyOgotICAgICAgcmV0dXJuIFJfVlJUMzI7Ci0gICAgY2FzZSBSRUxPQ19JVzE2OgotICAgICAgcmV0dXJuIFJfVlJUMTY7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogQXBwbHkgYSBmaXhTIHRvIHRoZSBvYmplY3QgZmlsZS4gIFNpbmNlIENPRkYgZG9lcyBub3QgdXNlIGFkZGVuZHMKLSAgIGluIHJlbG9jcywgdGhlIGFkZGVuZCBpcyBhY3R1YWxseSBzdG9yZWQgZGlyZWN0bHkgaW4gdGhlIG9iamVjdAotICAgZmlsZSBpdHNlbGYuICAqLwotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeHAsIHZhbCkKLSAgICAgZml4UyAqZml4cDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZjsKLQotICBidWYgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gIGZpeHAtPmZ4X29mZnNldCA9IDA7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUkVMT0NfSVcxNjoKLSAgICAgIGZpeHAtPmZ4X29mZnNldCA9IHZhbCA+PiAxNjsKLSAgICAgIGJ1ZlsyXSA9IHZhbCA+PiA4OwotICAgICAgYnVmWzNdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX0xPMTY6Ci0gICAgICBmaXhwLT5meF9vZmZzZXQgPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlsxXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUxPQ19ISTE2OgotICAgICAgZml4cC0+Znhfb2Zmc2V0ID0gdmFsID4+IDE2OwotICAgICAgYnVmWzBdID0gdmFsID4+IDg7Ci0gICAgICBidWZbMV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfUEMxNjoKLSAgICAgIGJ1ZlswXSA9IHZhbCA+PiAxMDsKLSAgICAgIGJ1ZlsxXSA9IHZhbCA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICBidWZbMF0gfD0gKHZhbCA+PiAyNikgJiAweDAzOwotICAgICAgYnVmWzFdID0gdmFsID4+IDE4OwotICAgICAgYnVmWzJdID0gdmFsID4+IDEwOwotICAgICAgYnVmWzNdID0gdmFsID4+IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUkVMT0NfMzI6Ci0gICAgICBidWZbMF0gPSB2YWwgPj4gMjQ7Ci0gICAgICBidWZbMV0gPSB2YWwgPj4gMTY7Ci0gICAgICBidWZbMl0gPSB2YWwgPj4gODsKLSAgICAgIGJ1ZlszXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogV2hlcmUgYSBQQyByZWxhdGl2ZSBvZmZzZXQgaXMgY2FsY3VsYXRlZCBmcm9tLiAgT24gdGhlIG04OGsgdGhleQotICAgYXJlIGNhbGN1bGF0ZWQgZnJvbSBqdXN0IGFmdGVyIHRoZSBpbnN0cnVjdGlvbi4gICovCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHN3aXRjaCAoZml4cC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIFJFTE9DX1BDMTY6Ci0gICAgICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlIC0gMjsKLSAgICBjYXNlIFJFTE9DX1BDMjY6Ci0gICAgICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIC8qTk9UUkVBQ0hFRCovCi19Ci0KLS8qIFdoZW4gd2UgYWxpZ24gdGhlIC5pbml0IHNlY3Rpb24sIGluc2VydCB0aGUgY29ycmVjdCBOT1AgcGF0dGVybi4gICovCi0KLWludAotbTg4a19kb19hbGlnbiAobiwgZmlsbCwgbWF4LCBsZW4pCi0gICAgIGludCBuOwotICAgICBjb25zdCBjaGFyICpmaWxsOwotICAgICBpbnQgbGVuOwotICAgICBpbnQgbWF4OwotewotICBpZiAoZmlsbCA9PSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKG9ial9zZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmluaXQiKSA9PSAwKQotICAgIHsKLSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5vcF9wYXR0ZXJuW10gPSB7IDB4ZjQsIDB4MDAsIDB4NTgsIDB4MDAgfTsKLSAgICAgIGZyYWdfYWxpZ25fcGF0dGVybiAobiwgbm9wX3BhdHRlcm4sIHNpemVvZiAobm9wX3BhdHRlcm4pLCBtYXgpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIE04OEtDT0ZGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW04OGsuaCBiL2dhcy9jb25maWcvdGMtbTg4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjZiNjk3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbTg4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qIG04OGsuaCAtLSBBc3NlbWJsZXIgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMAotICAgQ29udHJpYnV0ZWQgYnkgRGV2b24gQm93ZW4gb2YgQnVmZmFsbyBVbml2ZXJzaXR5Ci0gICBhbmQgVG9yYmpvcm4gR3Jhbmx1bmQgb2YgdGhlIFN3ZWRpc2ggSW5zdGl0dXRlIG9mIENvbXB1dGVyIFNjaWVuY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19NODhLCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMQotCi0jaWZkZWYgTTg4S0NPRkYKLSNkZWZpbmUgQ09GRl9NQUdJQyBNQzg4T01BR0lDCi0jZGVmaW5lIEJGRF9BUkNIIGJmZF9hcmNoX204OGsKLSNkZWZpbmUgQ09GRl9GTEFHUyBGX0FSMzJXCi0jZW5kaWYKLQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotI2RlZmluZSBUQ19LRUVQX0ZYX09GRlNFVAotI2RlZmluZSBUQ19DT05TX1JFTE9DIFJFTE9DXzMyCi0KLS8qIGRpZmZlcmVudCB0eXBlIG9mIHJlbG9jYXRpb24gYXZhaWxhYmxlIGluIHRoZSBtODhrICovCi0KLWVudW0gcmVsb2NfdHlwZQotewotICBSRUxPQ19MTzE2LAkJCS8qIGxvMTYoc3ltKSAqLwotICBSRUxPQ19ISTE2LAkJCS8qIGhpMTYoc3ltKSAqLwotICBSRUxPQ19QQzE2LAkJCS8qIGJiMCwgYmIxLCBiY25kICovCi0gIFJFTE9DX1BDMjYsCQkJLyogYnIsIGJzciAqLwotICBSRUxPQ18zMiwJCQkvKiBqdW1wIHRhYmxlcywgZXRjICovCi0gIFJFTE9DX0lXMTYsCQkJLyogZ2xvYmFsIGFjY2VzcyB0aHJvdWdoIGxpbmtlciByZWdzIDI4ICovCi0gIE5PX1JFTE9DCi19OwotCi1zdHJ1Y3QgcmVsb2NfaW5mb19tODhrCi17Ci0gIHVuc2lnbmVkIGxvbmcgaW50IHJfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IHJfc3ltYm9sbnVtOjI0OwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgdW5zaWduZWQgaW50IHJfcGFkOjM7Ci0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU6NDsKLSAgbG9uZyBpbnQgcl9hZGRlbmQ7Ci19OwotCi0jZGVmaW5lIHJlbG9jYXRpb25faW5mbyByZWxvY19pbmZvX204OGsKLQotLyogVGhlIG04OGsgdXNlcyAnQCcgdG8gc3RhcnQgbG9jYWwgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTEVYX0FUIChMRVhfQkVHSU5fTkFNRSB8IExFWF9OQU1FKQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwobmFtZSkgXAotICAoKG5hbWVbMF0gPT0nQCcgJiYgKG5hbWUgWzFdID09ICdMJyB8fCBuYW1lIFsxXSA9PSAnLicpKSBcCi0gICB8fCAobmFtZVswXSA9PSAnTCcgJiYgbmFtZVsxXSA9PSAnMCcgJiYgbmFtZVsyXSA9PSAnXDAwMScpKQotI2VuZGlmCi0KLS8qIFRoZSBtODhrIHVzZXMgcHNldWRvLW9wcyB3aXRoIG5vIGxlYWRpbmcgcGVyaW9kLiAgKi8KLSNkZWZpbmUgTk9fUFNFVURPX0RPVAotCi0vKiBEb24ndCB3YXJuIG9uIHdvcmQgb3ZlcmZsb3c7IGl0IGhhcHBlbnMgb24gJWhpIHJlbG9jcy4gICovCi0jdW5kZWYgV0FSTl9TSUdORURfT1ZFUkZMT1dfV09SRAotCi0jZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhiLHMsZikJCXthc19mYXRhbCAoXygibTg4ayBjb252ZXJ0X2ZyYWdcbiIpKTt9Ci0KLS8qIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdW5kZWZpbmVkIHN5bWJvbHMuICAqLwotI2RlZmluZSBtZF91bmRlZmluZWRfc3ltYm9sKHMpIDAKLQotLyogV2UgaGF2ZSBubyBzcGVjaWFsIG9wZXJhbmQgaGFuZGxpbmcuICAqLwotI2RlZmluZSBtZF9vcGVyYW5kKGUpCi0KLSNpZmRlZiBNODhLQ09GRgotCi0vKiBXaGV0aGVyIGEgcmVsb2Mgc2hvdWxkIGJlIG91dHB1dC4gICovCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKGZpeHApICgoZml4cCktPmZ4X2FkZHN5ICE9IE5VTEwpCi0KLS8qIEdldCB0aGUgQkZEIHJlbG9jIHR5cGUgdG8gdXNlIGZvciBhIGdhcyBmaXhTIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeHApIHRjX2NvZmZfZml4MnJ0eXBlIChmaXhwKQotCi0vKiBObyBzcGVjaWFsIGhvb2sgbmVlZGVkIGZvciBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rKHMpCi0KLS8qIEFsaWduIHNlY3Rpb25zIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSNpZm5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpCSgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKLSNlbmRpZgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpCW1heCAoc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgKFNFRyldLCA0KQotCi0vKiBXZSB1c2UgYSBzcGVjaWFsIGFsaWdubWVudCBmdW5jdGlvbiB0byBpbnNlcnQgdGhlIGNvcnJlY3Qgbm9wCi0gICBwYXR0ZXJuIGluIC5pbml0LiAgKi8KLWV4dGVybiBpbnQgbTg4a19kb19hbGlnbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLSNkZWZpbmUgbWRfZG9fYWxpZ24obixmaWxsLGxlbixtYXgsbCkgaWYgKG04OGtfZG9fYWxpZ24obixmaWxsLG1heCxsZW4pKSBnb3RvIGwKLQotI2VuZGlmIC8qIE04OEtDT0ZGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1jb3JlLmMgYi9nYXMvY29uZmlnL3RjLW1jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzM2ZjOWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIyMSArMCwwIEBACi0vKiB0Yy1tY29yZS5jIC0tIEFzc2VtYmxlIGNvZGUgZm9yIE0qQ29yZQotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIi4uL29wY29kZXMvbWNvcmUtb3BjLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvbWNvcmUuaCIKLSNlbmRpZgotCi0jaWZuZGVmIHN0cmVxCi0jZGVmaW5lIHN0cmVxKGEsYikgKHN0cmNtcCAoYSwgYikgPT0gMCkKLSNlbmRpZgotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyBmb3IgZHVtYiBjb21waWxlcnMuICAqLwotc3RhdGljIHZvaWQgICBtY29yZV9zX2xpdGVyYWxzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zdHJpbmdlciBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyBpbnQgICAgbG9nMiBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLXN0YXRpYyBjaGFyICogcGFyc2VfcmVnIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKikpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9jcmVnIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgKikpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9leHAgUEFSQU1TICgoY2hhciAqLCBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCAgIG1ha2VfbmFtZSBQQVJBTVMgKChjaGFyICosIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50ICAgIGVudGVyX2xpdGVyYWwgUEFSQU1TICgoZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX3J0IFBBUkFNUyAoKGNoYXIgKiwgY2hhciAqKiwgaW50LCBleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgY2hhciAqIHBhcnNlX2ltbSBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkICosIHVuc2lnbmVkLCB1bnNpZ25lZCkpOwotc3RhdGljIGNoYXIgKiBwYXJzZV9tZW0gUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCAqLCB1bnNpZ25lZCAqLCB1bnNpZ25lZCkpOwotc3RhdGljIHZvaWQgICBkdW1wX2xpdGVyYWxzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBjaGVja19saXRlcmFscyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zX3RleHQgICAgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCAgIG1jb3JlX3NfZGF0YSAgICBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkICAgbWNvcmVfc19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgICBtY29yZV9zX2JzcyAgICAgUEFSQU1TICgoaW50KSk7Ci0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQgICBtY29yZV9zX2NvbW0gICAgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotCi0vKiBTZXZlcmFsIHBsYWNlcyBpbiB0aGlzIGZpbGUgaW5zZXJ0IHJhdyBpbnN0cnVjdGlvbnMgaW50byB0aGUKLSAgIG9iamVjdC4gVGhleSBzaG91bGQgdXNlIE1DT1JFX0lOU1RfWFhYIG1hY3JvcyB0byBnZXQgdGhlIG9wY29kZXMKLSAgIGFuZCB0aGVuIHVzZSB0aGVzZSB0d28gbWFjcm9zIHRvIGNyYWNrIHRoZSBNQ09SRV9JTlNUIHZhbHVlIGludG8KLSAgIHRoZSBhcHByb3ByaWF0ZSBieXRlIHZhbHVlcy4gICovCi0jZGVmaW5lCUlOU1RfQllURTAoeCkgICgoKHgpID4+IDgpICYgMHhGRikKLSNkZWZpbmUJSU5TVF9CWVRFMSh4KSAgKCh4KSAmIDB4RkYpCi0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMvIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICI7IjsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIy8iOwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7Ci0KLXN0YXRpYyBpbnQgZG9fanNyaTJic3IgPSAwOwkvKiBjaGFuZ2UgaGVyZSBmcm9tIDEgYnkgQ3J1ZXNzIDE5IEF1Z3VzdCA5NyAqLwotc3RhdGljIGludCBzaWZpbHRlcl9tb2RlID0gMDsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotI2RlZmluZSBDKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQotI2RlZmluZSBHRVRfV0hBVCh4KSAgICAoKHggPj4gMikpCi0KLS8qIFRoZXNlIGFyZSB0aGUgdHdvIHR5cGVzIG9mIHJlbGF4YWJsZSBpbnN0cnVjdGlvbiAqLwotI2RlZmluZSBDT05EX0pVTVAgIDEKLSNkZWZpbmUgVU5DRF9KVU1QICAyCi0KLSNkZWZpbmUgVU5ERUZfRElTUCAgICAgIDAKLSNkZWZpbmUgQ09ORDEyICAgICAgICAgIDEKLSNkZWZpbmUgQ09ORDMyICAgICAgICAgIDIKLSNkZWZpbmUgVU5DRDEyICAgICAgICAgIDEKLSNkZWZpbmUgVU5DRDMyICAgICAgICAgIDIKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDQKLSNkZWZpbmUgRU5EICAgICAgICAgICAgIDUKLQotI2RlZmluZSBDMTJfTEVOCSAgICAgICAgMgotI2RlZmluZSBDMzJfTEVOCSAgICAgICAxMAkvKiBhbGxvdyBmb3IgYWxpZ24gKi8KLSNkZWZpbmUgVTEyX0xFTgkgICAgICAgIDIKLSNkZWZpbmUgVTMyX0xFTgkgICAgICAgIDgJLyogYWxsb3cgZm9yIGFsaWduICovCi0KLQotLyogSW5pdGlhbGl6ZSB0aGUgcmVsYXggdGFibGUgKi8KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMDogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDE6IHVudXNlZCAqLyAgCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiAyOiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogMzogdW51c2VkICovICAKLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qIDQ6IHVudXNlZCAqLyAgCi17IDIwNDgsIC0yMDQ2LCBDMTJfTEVOLCBDKENPTkRfSlVNUCwgQ09ORDMyKSB9LAkvKiA1OiBDKENPTkRfSlVNUCwgQ09ORDEyKSAqLwoteyAgICAwLCAgICAgMCwgQzMyX0xFTiwgMCB9LAkJCS8qIDY6IEMoQ09ORF9KVU1QLCBDT05EMzIpICovCi17ICAgIDEsICAgICAxLAkgICAgIDAsIDAgfSwJCQkvKiA3OiB1bnVzZWQgKi8gIAoteyAgICAxLCAgICAgMSwJICAgICAwLCAwIH0sCQkJLyogODogdW51c2VkICovICAKLXsgMjA0OCwgLTIwNDYsIFUxMl9MRU4sIEMoVU5DRF9KVU1QLCBVTkNEMzIpIH0sCS8qIDk6IEMoVU5DRF9KVU1QLCBVTkNEMTIpICovCi17ICAgIDAsICAgICAwLCBVMzJfTEVOLCAwIH0sCQkJLyoxMDogQyhVTkNEX0pVTVAsIFVOQ0QzMikgKi8KLXsgICAgMSwgICAgIDEsCSAgICAgMCwgMCB9LAkJCS8qMTE6IHVudXNlZCAqLyAgCi17ICAgIDAsICAgICAwLAkgICAgIDAsIDAgfQkJCS8qMTI6IHVudXNlZCAqLyAgCi19OwotCi0vKiBMSVRFUkFMIFBPT0wgREFUQSBTVFJVQ1RVUkVTICovCi1zdHJ1Y3QgbGl0ZXJhbAotewotICB1bnNpZ25lZCBzaG9ydCAgcmVmY250OwotICB1bnNpZ25lZCBjaGFyCSAgaXNwY3JlbDsKLSAgdW5zaWduZWQgY2hhcgkgIHVudXNlZDsKLSAgZXhwcmVzc2lvblMJICBlOwotfTsKLQotI2RlZmluZSBNQVhfUE9PTF9TSVpFCSgxMDI0LzQpCi1zdGF0aWMgc3RydWN0IGxpdGVyYWwgbGl0cG9vbCBbTUFYX1BPT0xfU0laRV07Ci1zdGF0aWMgdW5zaWduZWQgcG9vbHNpemU7Ci1zdGF0aWMgdW5zaWduZWQgcG9vbG51bWJlcjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBvb2xzcGFuOwotCi0vKiBTUEFOUEFOSUM6IHRoZSBwb2ludCBhdCB3aGljaCB3ZSBnZXQgdG9vIHNjYXJlZCBhbmQgZm9yY2UgYSBkdW1wCi0gICBvZiB0aGUgbGl0ZXJhbCBwb29sLCBhbmQgcGVyaGFwcyBwdXQgYSBicmFuY2ggaW4gcGxhY2UuCi0gICBDYWxjdWxhdGVkIGFzOgotICAJCSAxMDI0CXNwYW4gb2YgbHJ3L2ptcGkvanNyaSBpbnNuIChhY3R1YWxseSBzcGFuKzEpCi0gIAkJLTIJcG9zc2libGUgYWxpZ25tZW50IGF0IHRoZSBpbnNuLgotICAJCS0yCXBvc3NpYmxlIGFsaWdubWVudCB0byBnZXQgdGhlIHRhYmxlIGFsaWduZWQuCi0gIAkJLTIJYW4gaW5zZXJ0ZWQgYnJhbmNoIGFyb3VuZCB0aGUgdGFibGUuCi0gIAkgICAgID09IDEwMTgKLSAgIGF0IDEwMTgsIHdlIG1pZ2h0IGJlIGluIHRyb3VibGUuCi0gICAtLSBzbyB3ZSBoYXZlIHRvIGJlIHNtYWxsZXIgdGhhbiAxMDE4IGFuZCBzaW5jZSB3ZSBkZWFsIHdpdGggMi1ieXRlCi0gICBpbnN0cnVjdGlvbnMsIHRoZSBuZXh0IGdvb2QgY2hvaWNlIGlzIDEwMTYuCi0gICAtLSBOb3RlIHdlIGhhdmUgYSB0ZXN0IGNhc2UgdGhhdCBmYWlscyB3aGVuIHdlJ3ZlIGdvdCAxMDE4IGhlcmUuICAqLwotI2RlZmluZSBTUEFOUEFOSUMJKDEwMTYpCQkvKiAxMDI0IC0gMSBlbnRyeSAtIDIgYnl0ZSByb3VuZGluZyAqLwotI2RlZmluZSBTUEFOQ0xPU0UJKDkwMCkKLSNkZWZpbmUgU1BBTkVYSVQJKDYwMCkKLXN0YXRpYyBzeW1ib2xTICogcG9vbHN5bTsJCS8qIGxhYmVsIGZvciBjdXJyZW50IHBvb2wgKi8KLXN0YXRpYyBjaGFyIHBvb2xuYW1lWzhdOwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKiBvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICAgIFBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICAgIEZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbiAgICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7ICJleHBvcnQiLCAgIHNfZ2xvYmwsICAgICAgICAgIDAgfSwKLSAgeyAiaW1wb3J0IiwgICBzX2lnbm9yZSwgICAgICAgICAwIH0sCi0gIHsgImxpdGVyYWxzIiwgbWNvcmVfc19saXRlcmFscywgMCB9LAotICB7ICJwYWdlIiwgICAgIGxpc3RpbmdfZWplY3QsICAgIDAgfSwKLQotICAvKiBUaGUgZm9sbG93aW5nIGFyZSB0byBpbnRlcmNlcHQgdGhlIHBsYWNlbWVudCBvZiBkYXRhIGludG8gdGhlIHRleHQKLSAgICAgc2VjdGlvbiAoZWcgYWRkcmVzc2VzIGZvciBhIHN3aXRjaCB0YWJsZSksIHNvIHRoYXQgdGhlIHNwYWNlIHRoZXkKLSAgICAgb2NjdXB5IGNhbiBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBkZWNpZGluZyB3aGV0aGVyIG9yIG5vdCB0bwotICAgICBkdW1wIHRoZSBjdXJyZW50IGxpdGVyYWwgcG9vbC4KLSAgICAgWFhYIC0gY3VycmVudGx5IHdlIGRvIG5vdCBjb3BlIHdpdGggdGhlIC5zcGFjZSBhbmQgLmRjYi5kIGRpcmVjdGl2ZXMuICAqLwotICB7ICJhc2NpaSIsICAgIG1jb3JlX3N0cmluZ2VyLCAgICAgICAwIH0sCi0gIHsgImFzY2l6IiwgICAgbWNvcmVfc3RyaW5nZXIsICAgICAgIDEgfSwKLSAgeyAiYnl0ZSIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMSB9LAotICB7ICJkYyIsICAgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgImRjLmIiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDEgfSwKLSAgeyAiZGMuZCIsICAgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZCcgfSwKLSAgeyAiZGMubCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAotICB7ICJkYy5zIiwgICAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJyB9LAotICB7ICJkYy53IiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgImRjLngiLCAgICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ3gnIH0sCi0gIHsgImRvdWJsZSIsICAgbWNvcmVfZmxvYXRfY29ucywgICAgJ2QnfSwKLSAgeyAiZmxvYXQiLCAgICBtY29yZV9mbG9hdF9jb25zLCAgICAnZid9LAotICB7ICJod29yZCIsICAgIG1jb3JlX2NvbnMsICAgICAgICAgICAyIH0sCi0gIHsgImludCIsICAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDQgfSwKLSAgeyAibG9uZyIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgNCB9LAotICB7ICJvY3RhIiwgICAgIG1jb3JlX2NvbnMsICAgICAgICAgIDE2IH0sCi0gIHsgInF1YWQiLCAgICAgbWNvcmVfY29ucywgICAgICAgICAgIDggfSwKLSAgeyAic2hvcnQiLCAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotICB7ICJzaW5nbGUiLCAgIG1jb3JlX2Zsb2F0X2NvbnMsICAgICdmJ30sCi0gIHsgInN0cmluZyIsICAgbWNvcmVfc3RyaW5nZXIsICAgICAgIDEgfSwKLSAgeyAid29yZCIsICAgICBtY29yZV9jb25zLCAgICAgICAgICAgMiB9LAotCi0gIC8qIEFsbG93IGZvciB0aGUgZWZmZWN0IG9mIHNlY3Rpb24gY2hhbmdlcy4gICovCi0gIHsgInRleHQiLCAgICAgIG1jb3JlX3NfdGV4dCwgICAgMCB9LAotICB7ICJkYXRhIiwgICAgICBtY29yZV9zX2RhdGEsICAgIDAgfSwKLSAgeyAiYnNzIiwgICAgICAgbWNvcmVfc19ic3MsICAgICAxIH0sCi0jaWZkZWYgT0JKX0VGCi0gIHsgImNvbW0iLCAgICAgIG1jb3JlX3NfY29tbSwgICAgMCB9LAotI2VuZGlmCi0gIHsgInNlY3Rpb24iLCAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICB7ICJzZWN0aW9uLnMiLCBtY29yZV9zX3NlY3Rpb24sIDAgfSwKLSAgeyAic2VjdCIsICAgICAgbWNvcmVfc19zZWN0aW9uLCAwIH0sCi0gIHsgInNlY3QucyIsICAgIG1jb3JlX3Nfc2VjdGlvbiwgMCB9LAotICAKLSAgeyAwLCAgICAgICAgICAwLCAgICAgICAgICAgICAgICAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zX2xpdGVyYWxzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1tY29yZV9jb25zIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGlmIChub3dfc2VnID09IHRleHRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBjaGFyICogcHRyID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaW50ICAgIGNvbW1hcyA9IDE7Ci0gICAgICAKLSAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIG9uIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCi0JY29tbWFzICs9ICogcHRyICsrID09ICcsJzsKLSAgICAgIAotICAgICAgcG9vbHNwYW4gKz0gbmJ5dGVzICogY29tbWFzOwotICAgIH0KLSAgCi0gIGNvbnMgKG5ieXRlcyk7Ci0KLSAgLyogSW4gdGhlb3J5IHdlIG91Z2h0IHRvIGNhbGwgY2hlY2tfbGl0ZXJhbHMgKDIsMCkgaGVyZSBpbiBjYXNlCi0gICAgIHdlIG5lZWQgdG8gZHVtcCB0aGUgbGl0ZXJhbCB0YWJsZS4gIFdlIGNhbm5vdCBkbyB0aGlzIGhvd2V2ZXIsCi0gICAgIGFzIHRoZSBkaXJlY3RpdmVzIHRoYXQgd2UgYXJlIGludGVyY2VwdGluZyBtYXkgYmUgYmVpbmcgdXNlZAotICAgICB0byBidWlsZCBhIHN3aXRjaCB0YWJsZSwgYW5kIHdlIG11c3Qgbm90IGludGVyZmVyZSB3aXRoIGl0cwotICAgICBjb250ZW50cy4gIEluc3RlYWQgd2UgY3Jvc3Mgb3VyIGZpbmdlcnMgYW5kIHByYXkuLi4gKi8KLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX2Zsb2F0X2NvbnMgKGZsb2F0X3R5cGUpCi0gICAgIGludCBmbG9hdF90eXBlOwotewotICBpZiAobm93X3NlZyA9PSB0ZXh0X3NlY3Rpb24pCi0gICAgewotICAgICAgY2hhciAqIHB0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGludCAgICBjb21tYXMgPSAxOwotCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLSNlcnJvciBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyBub3QgaGFuZGxlZAotI2VuZGlmCi0gICAgICAKLSAgICAgIC8qIENvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIG9uIHRoZSBsaW5lLiAgKi8KLSAgICAgIHdoaWxlICghIGlzX2VuZF9vZl9saW5lIFsqIHB0cl0pCi0JY29tbWFzICs9ICogcHRyICsrID09ICcsJzsKLQotICAgICAgLyogV2Ugd291bGQgbGlrZSB0byBjb21wdXRlICJoZXhfZmxvYXQgKGZsb2F0X3R5cGUpICogY29tbWFzIgotCSBidXQgaGV4X2Zsb2F0IGlzIG5vdCBleHBvcnRlZCBmcm9tIHJlYWQuYyAgKi8KLSAgICAgIGZsb2F0X3R5cGUgPT0gJ2YnID8gNCA6IChmbG9hdF90eXBlID09ICdkJyA/IDggOiAxMik7Ci0gICAgICBwb29sc3BhbiArPSBmbG9hdF90eXBlICogY29tbWFzOwotICAgIH0KLQotICBmbG9hdF9jb25zIChmbG9hdF90eXBlKTsKLSAgCi0gIC8qIFNlZSB0aGUgY29tbWVudCBpbiBtY29yZV9jb25zICgpIGFib3V0IGNhbGxpbmcgY2hlY2tfbGl0ZXJhbHMuCi0gICAgIEl0IGlzIHVubGlrZWx5IHRoYXQgYSBzd2l0Y2ggdGFibGUgd2lsbCBiZSBjb25zdHJ1Y3RlZCB1c2luZwotICAgICBmbG9hdGluZyBwb2ludCB2YWx1ZXMsIGJ1dCBpdCBpcyBzdGlsbCBsaWtlbHkgdGhhdCBhbiBpbmRleGVkCi0gICAgIHRhYmxlIG9mIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cyBpcyBiZWluZyBjcmVhdGVkIGJ5IHRoZXNlCi0gICAgIGRpcmVjdGl2ZXMsIHNvIGFnYWluIHdlIG11c3Qgbm90IGludGVyZmVyZSB3aXRoIHRoZWlyIHBsYWNlbWVudC4gICovCi19Ci0KLXN0YXRpYyB2b2lkCi1tY29yZV9zdHJpbmdlciAoYXBwZW5kX3plcm8pCi0gICAgIGludCBhcHBlbmRfemVybzsKLXsKLSAgaWYgKG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGNoYXIgKiBwdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAKLSAgICAgIC8qIEluIHRoZW9yeSB3ZSBzaG91bGQgY29tcHV0ZSBob3cgbWFueSBieXRlcyBhcmUgZ29pbmcgdG8KLQkgYmUgb2NjdXBpZWQgYnkgdGhlIHN0cmluZyhzKSBhbmQgYWRkIHRoaXMgdG8gdGhlIHBvb2xzcGFuLgotCSBUbyBrZWVwIHRoaW5ncyBzaW1wbGUgaG93ZXZlciwgd2UganVzdCBhZGQgdGhlIG51bWJlciBvZgotCSBieXRlcyBsZWZ0IG9uIHRoZSBjdXJyZW50IGxpbmUuICBUaGlzIHdpbGwgYmUgYW4gb3Zlci0KLQkgZXN0aW1hdGUsIHdoaWNoIGlzIE9LLCBhbmQgYXV0b21hdGljYWxseSBhbGxvd3MgZm9yIHRoZQotCSBhcHBlbmRpbmcgYSB6ZXJvIGJ5dGUsIHNpbmNlIHRoZSByZWFsIHN0cmluZyhzKSBpcy9hcmUKLQkgcmVxdWlyZWQgdG8gYmUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3Rlcy4gICovCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZSBbKiBwdHJdKQotCXB0ciArKzsKLQotICAgICAgcG9vbHNwYW4gKz0gcHRyIC0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgCi0gIHN0cmluZ2VyIChhcHBlbmRfemVybyk7Ci0KLSAgLyogV2UgY2FsbCBjaGVja19saXRlcmFscyBoZXJlIGluIGNhc2UgYSBsYXJnZSBudW1iZXIgb2Ygc3RyaW5ncyBhcmUKLSAgICAgYmVpbmcgcGxhY2VkIGludG8gdGhlIHRleHQgc2VjdGlvbiB3aXRoIGEgc2VxdWVuY2Ugb2Ygc3RyaW5nZXIKLSAgICAgZGlyZWN0aXZlcy4gIEluIHRoZW9yeSB3ZSBjb3VsZCBiZSB1cHNldHRpbmcgc29tZXRoaW5nIGlmIHRoZXNlCi0gICAgIHN0cmluZ3MgYXJlIGFjdHVhbGx5IGluIGFuIGluZGV4ZWQgdGFibGUgaW5zdGVhZCBvZiByZWZlcmVuY2VkIGJ5Ci0gICAgIGluZGl2aWR1YWwgbGFiZWxzLiAgTGV0IHVzIGhvcGUgdGhhdCB0aGF0IG5ldmVyIGhhcHBlbnMuICAqLwotICBjaGVja19saXRlcmFscyAoMiwgMCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgc2VjdGlvbiBjaGFuZ2luZyBwc2V1ZG8tb3BzLiAgVGhlc2UgY2FsbCB0aHJvdWdoIHRvIHRoZQotICAgbm9ybWFsIGltcGxlbWVudGF0aW9ucywgYnV0IHRoZXkgZHVtcCB0aGUgbGl0ZXJhbCBwb29sIGZpcnN0LiAgKi8KLQotc3RhdGljIHZvaWQKLW1jb3JlX3NfdGV4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgCi0jaWZkZWYgT0JKX0VMRgotICBvYmpfZWxmX3RleHQgKGlnbm9yZSk7Ci0jZWxzZQotICBzX3RleHQgKGlnbm9yZSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX3NfZGF0YSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgCi0jaWZkZWYgT0JKX0VMRgotICBvYmpfZWxmX2RhdGEgKGlnbm9yZSk7Ci0jZWxzZQotICBzX2RhdGEgKGlnbm9yZSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLW1jb3JlX3Nfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgb2JqX2VsZl9zZWN0aW9uIChpZ25vcmUpOwotI2VuZGlmCi0jaWZkZWYgT0JKX0NPRkYKLSAgb2JqX2NvZmZfc2VjdGlvbiAoaWdub3JlKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotbWNvcmVfc19ic3MgKG5lZWRzX2FsaWduKQotICAgICBpbnQgbmVlZHNfYWxpZ247Ci17Ci0gIGR1bXBfbGl0ZXJhbHMgKDApOwotICAKLSAgc19sY29tbV9ieXRlcyAobmVlZHNfYWxpZ24pOwotfQotCi0jaWZkZWYgT0JKX0VMRgotc3RhdGljIHZvaWQKLW1jb3JlX3NfY29tbSAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgZHVtcF9saXRlcmFscyAoMCk7Ci0gIAotICBvYmpfZWxmX2NvbW1vbiAobmVlZHNfYWxpZ24pOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAotICBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0YyB0aGF0IHRoZSBNRCBwYXJ0IG9mIHRoZSBhc3NlbWJsZXIgbmVlZHMuICAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcGNvZGU7Ci0gIGNoYXIgKiBwcmV2X25hbWUgPSAiIjsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBtY29yZV90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUgKyspCi0gICAgewotICAgICAgaWYgKHN0cmVxIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCi0JewotCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBzdHJpbmcuICAqLwotCSAgb3Bjb2RlLT5uYW1lID0gcHJldl9uYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcmVnX207Ci1zdGF0aWMgaW50IHJlZ19uOwotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotCi0vKiBHZXQgYSBsb2cyKHZhbCkuICAqLwotc3RhdGljIGludAotbG9nMiAodmFsKQotICAgIHVuc2lnbmVkIGludCB2YWw7Ci17Ci0gICAgaW50IGxvZyA9IC0xOwotICAgIHdoaWxlICh2YWwgIT0gMCkKLSAgICAgIHsKLSAgICAgICAgbG9nICsrOwotICAgICAgICB2YWwgPj49IDE7Ci0gICAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGxvZzsKLX0KLQotLyogVHJ5IHRvIHBhcnNlIGEgcmVnIG5hbWUuICAqLwotc3RhdGljIGNoYXIgKgotcGFyc2VfcmVnIChzLCByZWcpCi0gICAgIGNoYXIgKiBzOwotICAgICB1bnNpZ25lZCAqIHJlZzsKLXsKLSAgLyogU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0gICAgKysgczsKLSAgCi0gIGlmICh0b2xvd2VyIChzWzBdKSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNbMV0gPT0gJzEnICYmIHNbMl0gPj0gJzAnICYmIHNbMl0gPD0gJzUnKQotCXsKLQkgICpyZWcgPSAxMCArIHNbMl0gLSAnMCc7Ci0JICByZXR1cm4gcyArIDM7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1sxXSA+PSAnMCcgJiYgc1sxXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IHNbMV0gLSAnMCc7Ci0JICByZXR1cm4gcyArIDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoICAgdG9sb3dlciAoc1swXSkgPT0gJ3MnCi0JICAgJiYgdG9sb3dlciAoc1sxXSkgPT0gJ3AnCi0JICAgJiYgISBpc2FsbnVtIChzWzJdKSkKLSAgICB7Ci0gICAgICAqIHJlZyA9IDA7Ci0gICAgICByZXR1cm4gcyArIDI7Ci0gICAgfQotICAKLSAgYXNfYmFkIChfKCJyZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciKSwgcyk7Ci0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgc3RydWN0IENyZWdzCi17Ci0gIGNoYXIgKiBuYW1lOwotICB1bnNpZ25lZCBpbnQgY3JudW07Ci19Ci1jcmVnc1tdID0KLXsKLSAgeyAicHNyIiwJIDB9LAotICB7ICJ2YnIiLAkgMX0sCi0gIHsgImVwc3IiLAkgMn0sCi0gIHsgImZwc3IiLAkgM30sCi0gIHsgImVwYyIsCSA0fSwKLSAgeyAiZnBjIiwJIDV9LAotICB7ICJzczAiLAkgNn0sCi0gIHsgInNzMSIsCSA3fSwKLSAgeyAic3MyIiwJIDh9LAotICB7ICJzczMiLAkgOX0sCi0gIHsgInNzNCIsCTEwfSwKLSAgeyAiZ2NyIiwJMTF9LAotICB7ICJnc3IiLAkxMn0sCi0gIHsgIiIsCQkgMH0KLX07Ci0KLXN0YXRpYyBjaGFyICoKLXBhcnNlX2NyZWcgKHMsIHJlZykKLSAgICAgY2hhciAqIHM7Ci0gICAgIHVuc2lnbmVkICogcmVnOwotewotICBpbnQgaTsKLQotICAvKiBTdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICAqLwotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArK3M7Ci0gIAotICBpZiAoKHRvbG93ZXIgKHNbMF0pID09ICdjJyAmJiB0b2xvd2VyIChzWzFdKSA9PSAncicpKQotICAgIHsKLSAgICAgIGlmIChzWzJdID09ICczJyAmJiBzWzNdID49ICcwJyAmJiBzWzNdIDw9ICcxJykKLQl7Ci0JICAqcmVnID0gMzAgKyBzWzNdIC0gJzAnOwotCSAgcmV0dXJuIHMgKyA0OwotCX0KLSAgICAgIAotICAgICAgaWYgKHNbMl0gPT0gJzInICYmIHNbM10gPj0gJzAnICYmIHNbM10gPD0gJzknKQotCXsKLQkgICpyZWcgPSAyMCArIHNbM10gLSAnMCc7Ci0JICByZXR1cm4gcyArIDQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoc1syXSA9PSAnMScgJiYgc1szXSA+PSAnMCcgJiYgc1szXSA8PSAnOScpCi0JewotCSAgKnJlZyA9IDEwICsgc1szXSAtICcwJzsKLQkgIHJldHVybiBzICsgNDsKLQl9Ci0gICAgICAKLSAgICAgIGlmIChzWzJdID49ICcwJyAmJiBzWzJdIDw9ICc5JykKLQl7Ci0JICAqcmVnID0gc1syXSAtICcwJzsKLQkgIHJldHVybiBzICsgMzsKLQl9Ci0gICAgfQotICAKLSAgLyogTG9vayBhdCBhbHRlcm5hdGUgY3JlZyBuYW1lcyBiZWZvcmUgZ2l2aW5nIGVycm9yLiAgKi8KLSAgZm9yIChpID0gMDsgY3JlZ3NbaV0ubmFtZVswXSAhPSAnXDAnOyBpKyspCi0gICAgewotICAgICAgY2hhciBidWYgWzEwXTsKLSAgICAgIGludCAgbGVuZ3RoOwotICAgICAgaW50ICBqOwotICAgICAgCi0gICAgICBsZW5ndGggPSBzdHJsZW4gKGNyZWdzW2ldLm5hbWUpOwotICAgICAgCi0gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoOyBqKyspCi0JYnVmW2pdID0gdG9sb3dlciAoc1tqXSk7Ci0gICAgICAKLSAgICAgIGlmIChzdHJuY21wIChjcmVnc1tpXS5uYW1lLCBidWYsIGxlbmd0aCkgPT0gMCkKLQl7Ci0JICAqcmVnID0gY3JlZ3NbaV0uY3JudW07Ci0JICByZXR1cm4gcyArIGxlbmd0aDsKLQl9Ci0gICAgfQotICAKLSAgYXNfYmFkIChfKCJjb250cm9sIHJlZ2lzdGVyIGV4cGVjdGVkLCBidXQgc2F3ICclLjZzJyIpLCBzKTsKLSAgCi0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9leHAgKHMsIGUpCi0gICAgIGNoYXIgKiBzOwotICAgICBleHByZXNzaW9uUyAqIGU7Ci17Ci0gIGNoYXIgKiBzYXZlOwotICBjaGFyICogbmV3OwotCi0gIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHMpKQotICAgICsrIHM7Ci0gIAotICBzYXZlID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCi0gIGV4cHJlc3Npb24gKGUpOwotICAKLSAgaWYgKGUtPlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIAotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIAotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZAotbWFrZV9uYW1lIChzLCBwLCBuKQotICAgICBjaGFyICogczsKLSAgICAgY2hhciAqIHA7Ci0gICAgIGludCBuOwotewotICBzdGF0aWMgY29uc3QgY2hhciBoZXhbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLQotICBzWzBdID0gcFswXTsKLSAgc1sxXSA9IHBbMV07Ci0gIHNbMl0gPSBwWzJdOwotICBzWzNdID0gaGV4WyhuID4+IDEyKSAmIDB4Rl07Ci0gIHNbNF0gPSBoZXhbKG4gPj4gIDgpICYgMHhGXTsKLSAgc1s1XSA9IGhleFsobiA+PiAgNCkgJiAweEZdOwotICBzWzZdID0gaGV4WyhuKSAgICAgICAmIDB4Rl07Ci0gIHNbN10gPSAwOwotfQotCi0jZGVmaW5lIFBPT0xfRU5EX0xBQkVMICAgIi5MRSIKLSNkZWZpbmUgUE9PTF9TVEFSVF9MQUJFTCAiLkxTIgotCi1zdGF0aWMgdm9pZAotZHVtcF9saXRlcmFscyAoaXNmb3JjZSkKLSAgICAgaW50IGlzZm9yY2U7Ci17Ci0gIGludCBpOwotICBzdHJ1Y3QgbGl0ZXJhbCAqIHA7Ci0gIHN5bWJvbFMgKiBicmFyc3ltOwotICAKLSAgaWYgKHBvb2xzaXplID09IDApCi0gICAgcmV0dXJuOwotCi0gIC8qIE11c3Qgd2UgYnJhbmNoIGFyb3VuZCB0aGUgbGl0ZXJhbCB0YWJsZT8gKi8KLSAgaWYgKGlzZm9yY2UpCi0gICAgewotICAgICAgY2hhciAqIG91dHB1dDsKLSAgICAgIGNoYXIgYnJhcm5hbWVbOF07Ci0gICAgICAKLSAgICAgIG1ha2VfbmFtZSAoYnJhcm5hbWUsIFBPT0xfRU5EX0xBQkVMLCBwb29sbnVtYmVyKTsKLSAgICAgIAotICAgICAgYnJhcnN5bSA9IHN5bWJvbF9tYWtlIChicmFybmFtZSk7Ci0gICAgICAKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKGJyYXJzeW0pOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoLAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aCwKLQkJCSBDIChVTkNEX0pVTVAsIDApLCBicmFyc3ltLCAwLCAwKTsKLSAgICAgIG91dHB1dFswXSA9IElOU1RfQllURTAgKE1DT1JFX0lOU1RfQlIpOwkvKiBiciAuK3h4eCAqLwotICAgICAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoTUNPUkVfSU5TVF9CUik7Ci0gICAgfQotICAgICAgCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkIGFuZCB0aGF0Ci0gICAgIHRoZSBsaXRlcmFsIHRhYmxlIGlzIGFsaWduZWQgd2l0aGluIGl0LiAgKi8KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMik7Ci0gIGZyYWdfYWxpZ24gKDIsIDAsIDApOwotICAKLSAgY29sb24gKFNfR0VUX05BTUUgKHBvb2xzeW0pKTsKLSAgCi0gIGZvciAoaSA9IDAsIHAgPSBsaXRwb29sOyBpIDwgcG9vbHNpemU7IGkrKywgcCsrKQotICAgIGVtaXRfZXhwciAoJiBwLT5lLCA0KTsKLSAgCi0gIGlmIChpc2ZvcmNlKQotICAgIGNvbG9uIChTX0dFVF9OQU1FIChicmFyc3ltKSk7Ci0gIAotICAgcG9vbHNpemUgPSAwOwotfQotCi1zdGF0aWMgdm9pZAotY2hlY2tfbGl0ZXJhbHMgKGtpbmQsIG9mZnNldCkKLSAgICAgaW50IGtpbmQ7Ci0gICAgIGludCBvZmZzZXQ7Ci17Ci0gIHBvb2xzcGFuICs9IG9mZnNldDsKLSAgICAKLSAgLyogU1BBTkNMT1NFIGFuZCBTUEFORVhJVCBhcmUgc21hbGxlciBudW1iZXJzIHRoYW4gU1BBTlBBTklDLgotICAgICBTUEFOUEFOSUMgbWVhbnMgdGhhdCB3ZSBtdXN0IGR1bXAgbm93LgotICAgICBraW5kID09IDAgaXMgYW55IG9sZCBpbnN0cnVjdGlvbi4KLSAgICAga2luZCAgPiAwIG1lYW5zIHdlIGp1c3QgaGFkIGEgY29udHJvbCB0cmFuc2ZlciBpbnN0cnVjdGlvbi4KLSAgICAga2luZCA9PSAxIG1lYW5zIHdpdGhpbiBhIGZ1bmN0aW9uCi0gICAgIGtpbmQgPT0gMiBtZWFucyB3ZSBqdXN0IGxlZnQgYSBmdW5jdGlvbgotICAgIAotICAgICBUaGUgZHVtcF9saXRlcmFscyAoMSkgY2FsbCBpbnNlcnRzIGEgYnJhbmNoIGFyb3VuZCB0aGUgdGFibGUsIHNvCi0gICAgIHdlIGZpcnN0IGxvb2sgdG8gc2VlIGlmIGl0cyBhIHNpdHVhdGlvbiB3aGVyZSB3ZSB3b24ndCBoYXZlIHRvCi0gICAgIGluc2VydCBhIGJyYW5jaCAoZS5nLiwgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBhbiB1bmNvbmRpdGlvbmFsCi0gICAgIGJyYW5jaCkuCi0gICAgCi0gICAgIFNQQU5QQU5JQyBpcyB0aGUgcG9pbnQgd2hlcmUgd2UgbXVzdCBkdW1wIGEgc2luZ2xlLWVudHJ5IHBvb2wuCi0gICAgIGl0IGFjY291bnRzIGZvciBhbGlnbm1lbnRzIGFuZCBhbiBpbnNlcnRlZCBicmFuY2guCi0gICAgIHRoZSAncG9vbHNpemUqMicgYWNjb3VudHMgZm9yIHRoZSBzY2VuYXJpbyB3aGVyZSB3ZSBkbzoKLSAgICAgICBscncgcjEsbGl0MTsgbHJ3IHIyLGxpdDI7IGxydyByMyxsaXQzCi0gICAgIE5vdGUgdGhhdCB0aGUgJ2xpdDInIHJlZmVyZW5jZSBpcyAyIGJ5dGVzIGZ1cnRoZXIgYWxvbmcKLSAgICAgYnV0IHRoZSBsaXRlcmFsIGl0IHJlZmVyZW5jZXMgd2lsbCBiZSA0IGJ5dGVzIGZ1cnRoZXIgYWxvbmcsCi0gICAgIHNvIHdlIG11c3QgY29uc2lkZXIgdGhlIHBvb2xzaXplIGludG8gdGhpcyBlcXVhdGlvbi4KLSAgICAgVGhpcyBpcyBzbGlnaHRseSBvdmVyLWNhdXRpb3VzLCBidXQgZ3VhcmFudGVlcyB0aGF0IHdlIHdvbid0Ci0gICAgIHBhbmljIGJlY2F1c2UgYSByZWxvY2F0aW9uIGlzIHRvbyBkaXN0YW50LiAgKi8KLSAgCi0gIGlmIChwb29sc3BhbiA+IFNQQU5DTE9TRSAmJiBraW5kID4gMCkKLSAgICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgZWxzZSBpZiAocG9vbHNwYW4gPiBTUEFORVhJVCAmJiBraW5kID4gMSkKLSAgICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgZWxzZSBpZiAocG9vbHNwYW4gPj0gKFNQQU5QQU5JQyAtIHBvb2xzaXplICogMikpCi0gICAgZHVtcF9saXRlcmFscyAoMSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWVudGVyX2xpdGVyYWwgKGUsIGlzcGNyZWwpCi0gICAgIGV4cHJlc3Npb25TICogZTsKLSAgICAgaW50IGlzcGNyZWw7Ci17Ci0gIGludCBpOwotICBzdHJ1Y3QgbGl0ZXJhbCAqIHA7Ci0KLSAgaWYgKHBvb2xzaXplID49IE1BWF9QT09MX1NJWkUgLSAyKQotICAgIHsKLSAgICAgIC8qIFRoZSBsaXRlcmFsIHBvb2wgaXMgYXMgZnVsbCBhcyB3ZSBjYW4gaGFuZGxlLiBXZSBoYXZlCi0gICAgICAgICB0byBiZSAyIGVudHJpZXMgc2h5IG9mIHRoZSAxMDI0LzQ9MjU2IGVudHJpZXMgYmVjYXVzZSB3ZQotICAgICAgICAgaGF2ZSB0byBhbGxvdyBmb3IgdGhlIGJyYW5jaCAoMiBieXRlcykgYW5kIHRoZSBhbGlnbm1lbnQKLSAgICAgICAgICgyIGJ5dGVzIGJlZm9yZSB0aGUgZmlyc3QgaW5zbiByZWZlcmVuY2luZyB0aGUgcG9vbCBhbmQKLSAgICAgICAgIDIgYnl0ZXMgYmVmb3JlIHRoZSBwb29sIGl0c2VsZikgPT0gNiBieXRlcywgcm91bmRzIHVwCi0gICAgICAgICB0byAyIGVudHJpZXMuICAqLyAKLSAgICAgIGR1bXBfbGl0ZXJhbHMgKDEpOwotICAgIH0KLQotICBpZiAocG9vbHNpemUgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgbmV3IGxpdGVyYWwgcG9vbC4gICovCi0gICAgICBpZiAoKysgcG9vbG51bWJlciA+IDB4RkZGRikKLQlhc19mYXRhbCAoXygibW9yZSB0aGFuIDY1SyBsaXRlcmFsIHBvb2xzIikpOwotICAgICAgCi0gICAgICBtYWtlX25hbWUgKHBvb2xuYW1lLCBQT09MX1NUQVJUX0xBQkVMLCBwb29sbnVtYmVyKTsKLSAgICAgIHBvb2xzeW0gPSBzeW1ib2xfbWFrZSAocG9vbG5hbWUpOwotICAgICAgc3ltYm9sX3RhYmxlX2luc2VydCAocG9vbHN5bSk7Ci0gICAgICBwb29sc3BhbiA9IDA7Ci0gICAgfQotICAKLSAgLyogU2VhcmNoIHBvb2wgZm9yIHZhbHVlIHNvIHdlIGRvbid0IGhhdmUgZHVwbGljYXRlcy4gICovCi0gIGZvciAocCA9IGxpdHBvb2wsIGkgPSAwOyBpIDwgcG9vbHNpemU7IGkrKywgcCsrKQotICAgIHsKLSAgICAgIGlmIChlLT5YX29wID09IHAtPmUuWF9vcAotCSAgJiYgZS0+WF9hZGRfc3ltYm9sID09IHAtPmUuWF9hZGRfc3ltYm9sCi0JICAmJiBlLT5YX2FkZF9udW1iZXIgPT0gcC0+ZS5YX2FkZF9udW1iZXIKLQkgICYmIGlzcGNyZWwgPT0gcC0+aXNwY3JlbCkKLQl7Ci0JICBwLT5yZWZjbnQgKys7Ci0JICByZXR1cm4gaTsKLQl9Ci0gICAgfQotCi0gIHAtPnJlZmNudCAgPSAxOwotICBwLT5pc3BjcmVsID0gaXNwY3JlbDsKLSAgcC0+ZSAgICAgICA9ICogZTsKLSAgCi0gIHBvb2xzaXplICsrOwotCi0gIHJldHVybiBpOyAgIAotfQotCi0vKiBQYXJzZSBhIGxpdGVyYWwgc3BlY2lmaWNhdGlvbi4gLS0gZWl0aGVyIG5ldyBvciBvbGQgc3ludGF4LgotICAgb2xkIHN5bnRheDogdGhlIHVzZXIgc3VwcGxpZXMgdGhlIGxhYmVsIGFuZCBwbGFjZXMgdGhlIGxpdGVyYWwuCi0gICBuZXcgc3ludGF4OiB3ZSBwdXQgaXQgaW50byB0aGUgbGl0ZXJhbCBwb29sLiAgKi8KLXN0YXRpYyBjaGFyICoKLXBhcnNlX3J0IChzLCBvdXRwdXRwLCBpc3BjcmVsLCBlcCkKLSAgICAgY2hhciAqIHM7Ci0gICAgIGNoYXIgKiogb3V0cHV0cDsKLSAgICAgaW50IGlzcGNyZWw7Ci0gICAgIGV4cHJlc3Npb25TICogZXA7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIGludCBuOwotICAKLSAgaWYgKGVwKQotICAgIC8qIEluZGljYXRlIG5vdGhpbmcgdGhlcmUuICAqLwotICAgIGVwLT5YX29wID0gT19hYnNlbnQ7Ci0gIAotICBpZiAoKnMgPT0gJ1snKQotICAgIHsKLSAgICAgIHMgPSBwYXJzZV9leHAgKHMgKyAxLCAmIGUpOwotICAgICAgCi0gICAgICBpZiAoKnMgPT0gJ10nKQotCXMrKzsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oIm1pc3NpbmcgJ10nIikpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHMgPSBwYXJzZV9leHAgKHMsICYgZSk7Ci0gICAgICAKLSAgICAgIG4gPSBlbnRlcl9saXRlcmFsICgmIGUsIGlzcGNyZWwpOwotICAgICAgCi0gICAgICBpZiAoZXApCi0JKmVwID0gZTsKLQotICAgICAgLyogQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIHBvb2wgZW50cnkuICAqLwotICAgICAgZS5YX29wICAgICAgICAgPSBPX3N5bWJvbDsKLSAgICAgIGUuWF9hZGRfc3ltYm9sID0gcG9vbHN5bTsKLSAgICAgIGUuWF9hZGRfbnVtYmVyID0gbiA8PCAyOwotICAgIH0KLSAgCi0gICogb3V0cHV0cCA9IGZyYWdfbW9yZSAoMik7Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCAoKm91dHB1dHApIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsICYgZSwgMSwKLQkgICAgICAgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQpOwotCi0gIHJldHVybiBzOwotfQotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9pbW0gKHMsIHZhbCwgbWluLCBtYXgpCi0gICAgIGNoYXIgKiBzOwotICAgICB1bnNpZ25lZCAqIHZhbDsKLSAgICAgdW5zaWduZWQgbWluOwotICAgICB1bnNpZ25lZCBtYXg7Ci17Ci0gIGNoYXIgKiBuZXc7Ci0gIGV4cHJlc3Npb25TIGU7Ci0gIAotICBuZXcgPSBwYXJzZV9leHAgKHMsICYgZSk7Ci0gIAotICBpZiAoZS5YX29wID09IE9fYWJzZW50KQotICAgIDsgLyogQW4gZXJyb3IgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIGVtaXR0ZWQuICAqLwotICBlbHNlIGlmIChlLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIGNvbnN0YW50IikpOwotICBlbHNlIGlmIChlLlhfYWRkX251bWJlciA8IG1pbiB8fCBlLlhfYWRkX251bWJlciA+IG1heCkKLSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhYnNvbHV0ZSBpbiByYW5nZSAlZC4uJWQsIG5vdCAlZCIpLAotCSAgICBtaW4sIG1heCwgZS5YX2FkZF9udW1iZXIpOwotCi0gICogdmFsID0gZS5YX2FkZF9udW1iZXI7Ci0gIAotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9tZW0gKHMsIHJlZywgb2ZmLCBzaXopCi0gICAgIGNoYXIgKiBzOwotICAgICB1bnNpZ25lZCAqIHJlZzsKLSAgICAgdW5zaWduZWQgKiBvZmY7Ci0gICAgIHVuc2lnbmVkIHNpejsKLXsKLSAgY2hhciAqIG5ldzsKLQotICAqIG9mZiA9IDA7Ci0gIAotICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLSAgICArKyBzOwotICAgICAgCi0gIGlmICgqIHMgPT0gJygnKQotICAgIHsKLSAgICAgIHMgPSBwYXJzZV9yZWcgKHMgKyAxLCByZWcpOwotCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBzKSkKLQkrKyBzOwotICAgICAgCi0gICAgICBpZiAoKiBzID09ICcsJykKLQl7Ci0JICBzID0gcGFyc2VfaW1tIChzICsgMSwgb2ZmLCAwLCA2Myk7Ci0JICAKLQkgIGlmIChzaXogPiAxKQotCSAgICB7Ci0JICAgICAgaWYgKHNpeiA+IDIpCi0JCXsKLQkJICBpZiAoKiBvZmYgJiAweDMpCi0JCSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKSk7Ci0JCSAgCi0JCSAgKiBvZmYgPj49IDI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKiBvZmYgJiAweDEpCi0JCSAgICBhc19iYWQgKF8oIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDIiKSk7Ci0JCSAgCi0JCSAgKiBvZmYgPj49IDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIAotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogcykpCi0JKysgczsKLSAgICAgIAotICAgICAgaWYgKCogcyA9PSAnKScpCi0JcyArKzsKLSAgICB9Ci0gIGVsc2UKLSAgICBhc19iYWQgKF8oImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiKSk7Ci0gIAotICByZXR1cm4gczsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGNoYXIgKiBvcF9zdGFydDsKLSAgY2hhciAqIG9wX2VuZDsKLSAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcGNvZGU7Ci0gIGNoYXIgKiBvdXRwdXQ7Ci0gIGludCBubGVuID0gMDsKLSAgdW5zaWduZWQgc2hvcnQgaW5zdDsKLSAgdW5zaWduZWQgcmVnOwotICB1bnNpZ25lZCBvZmY7Ci0gIHVuc2lnbmVkIGlzaXplOwotICBleHByZXNzaW9uUyBlOwotICBjaGFyIG5hbWVbMjBdOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlLiAgKi8KLSAgd2hpbGUgKGlzc3BhY2UgKCogc3RyKSkKLSAgICBzdHIgKys7Ci0KLSAgLyogRmluZCB0aGUgb3AgY29kZSBlbmQuICAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOwotICAgICAgICogb3BfZW5kICYmIG5sZW4gPCAyMCAmJiAhaXNfZW5kX29mX2xpbmUgWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIG5hbWVbbmxlbl0gPSBvcF9zdGFydFtubGVuXTsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0gIAotICBuYW1lIFtubGVuXSA9IDA7Ci0gIAotICBpZiAobmxlbiA9PSAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvcGNvZGUgPSAobWNvcmVfb3Bjb2RlX2luZm8gKikgaGFzaF9maW5kIChvcGNvZGVfaGFzaF9jb250cm9sLCBuYW1lKTsKLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUgXCIlc1wiIiksIG5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIGluc3QgPSBvcGNvZGUtPmluc3Q7Ci0gIGlzaXplID0gMjsKLSAgCi0gIHN3aXRjaCAob3Bjb2RlLT5vcGNsYXNzKQotICAgIHsKLSAgICBjYXNlIE8wOgotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPVDoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDMpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE8xOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgSk1QOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICAvKiBJbiBhIHNpZmlsdGVyIG1vZGUsIHdlIGVtaXQgdGhpcyBpbnNuIDIgdGltZXMsCi0gICAgICAgICBmaXhlcyBwcm9ibGVtIG9mIGFuIGludGVycnVwdCBkdXJpbmcgYSBqbXAuLiAqLwotICAgICAgaWYgKHNpZmlsdGVyX21vZGUpCi0JewotCSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0JICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpTUjoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICBpZiAocmVnID09IDE1KQotCWFzX2JhZCAoXygiaW52YWxpZCByZWdpc3RlcjogcjE1IGlsbGVnYWwiKSk7Ci0gICAgICAKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIAotICAgICAgaWYgKHNpZmlsdGVyX21vZGUpCi0JewotCSAgLyogUmVwbGFjZSB3aXRoOiAgYnNyIC4rMiA7IGFkZGkgcjE1LDY7IGptcCByeCA7IGptcCByeCAqLwotCSAgaW5zdCA9IE1DT1JFX0lOU1RfQlNSOwkvKiB3aXRoIDAgZGlzcGxhY2VtZW50ICovCi0JICBvdXRwdXRbMF0gPSBJTlNUX0JZVEUwIChpbnN0KTsKLQkgIG91dHB1dFsxXSA9IElOU1RfQllURTEgKGluc3QpOwotCi0JICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotCSAgaW5zdCA9IE1DT1JFX0lOU1RfQURESTsKLQkgIGluc3QgfD0gMTU7CQkJLyogYWRkaSByMTUsNiAqLwotCSAgaW5zdCB8PSAoNiAtIDEpIDw8IDQ7CQkvKiBvdmVyIHRoZSBqbXAncyAqLwotCSAgb3V0cHV0WzBdID0gSU5TVF9CWVRFMCAoaW5zdCk7Ci0JICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLQotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQkgIGluc3QgPSBNQ09SRV9JTlNUX0pNUCB8IHJlZzsKLQkgIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotCSAgb3V0cHV0WzFdID0gSU5TVF9CWVRFMSAoaW5zdCk7Ci0KLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7CQkvKiAybmQgZW1pdHRlZCBpbiBmYWxsdGhydSAqLwotCX0KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBPQzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKm9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfY3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTzI6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBYMToJLyogSGFuZGxlIGJvdGggc3ludGF4LT4geHRyYi0gcjEscnggT1IgeHRyYi0gcnggKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykJLyogeHRyYi0gcjEscnggKi8KLQl7Ci0JICBpZiAocmVnICE9IDEpCi0JICAgIGFzX2JhZCAoXygiZGVzdGluYXRpb24gcmVnaXN0ZXIgbXVzdCBiZSByMSIpKTsKLQkgIAotCSAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JfQotICAgICAgCi0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTzFSMTogIC8qIGRpdi0gcngscjEgKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgaWYgKHJlZyAhPSAxKQotCSAgICBhc19iYWQgKF8oInNvdXJjZSByZWdpc3RlciBtdXN0IGJlIHIxIikpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0k6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMik7Ci0JICBpbnN0IHw9IChyZWcgLSAxKSA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0I6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAwLCAzMSk7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT0IyOgkJLyogbGlrZSBPQiwgYnV0IGFyZyBpcyAyXm4gaW5zdGVhZCBvZiBuICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAxIDw8IDMxKTsKLQkgIC8qIEZ1cnRoZXIgcmVzdHJpY3QgdGhlIGltbWVkaWF0ZSB0byBhIHBvd2VyIG9mIHR3by4gKi8KLQkgIGlmICgocmVnICYgKHJlZyAtIDEpKSA9PSAwKQotCSAgICByZWcgPSBsb2cyIChyZWcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVnID0gMDsKLQkgICAgICBhc19iYWQgKF8oImltbWVkaWF0ZSBpcyBub3QgYSBwb3dlciBvZiB0d28iKSk7Ci0JICAgIH0KLQkgIGluc3QgfD0gKHJlZykgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9CUmE6CS8qIFNwZWNpZmljIGZvciBiZ2VuaTogaW1tIG9mIDAtPjYgdHJhbnNsYXRlIHRvIG1vdmkuICovCi0gICAgY2FzZSBPQlJiOgotICAgIGNhc2UgT0JSYzoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDAsIDMxKTsKLQkgIC8qIGltbWVkaWF0ZSB2YWx1ZXMgb2YgMCAtPiA2IHRyYW5zbGF0ZSB0byBtb3ZpICovCi0JICBpZiAocmVnIDw9IDYpCi0JICAgIHsKLQkgICAgICBpbnN0ID0gKGluc3QgJiAweEYpIHwgTUNPUkVfSU5TVF9CR0VOSV9BTFQ7Ci0JICAgICAgcmVnID0gMHgxIDw8IHJlZzsKLQkgICAgICBhc193YXJuIChfKCJ0cmFuc2xhdGluZyBiZ2VuaSB0byBtb3ZpIikpOwotCSAgICB9Ci0JICBpbnN0ICY9IH4gMHgwMWYwOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9CUjI6CS8qIGxpa2UgT0JSLCBidXQgYXJnIGlzIDJebiBpbnN0ZWFkIG9mIG4gKi8KLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDEgPDwgMzEpOwotCSAgCi0JICAvKiBGdXJ0aGVyIHJlc3RyaWN0IHRoZSBpbW1lZGlhdGUgdG8gYSBwb3dlciBvZiB0d28uICAqLwotCSAgaWYgKChyZWcgJiAocmVnIC0gMSkpID09IDApCi0JICAgIHJlZyA9IGxvZzIgKHJlZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByZWcgPSAwOwotCSAgICAgIGFzX2JhZCAoXygiaW1tZWRpYXRlIGlzIG5vdCBhIHBvd2VyIG9mIHR3byIpKTsKLQkgICAgfQotCSAgCi0JICAvKiBJbW1lZGlhdGUgdmFsdWVzIG9mIDAgLT4gNiB0cmFuc2xhdGUgdG8gbW92aS4gKi8KLQkgIGlmIChyZWcgPD0gNikKLQkgICAgewotCSAgICAgIGluc3QgPSAoaW5zdCAmIDB4RikgfCBNQ09SRV9JTlNUX0JHRU5JX0FMVDsKLQkgICAgICByZWcgPSAweDEgPDwgcmVnOwotCSAgICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIG1nZW5pIHRvIG1vdmkiKSk7Ci0JICAgIH0KLQkgIAotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIE9NYToJLyogU3BlY2lmaWMgZm9yIGJtYXNraTogaW1tIDEtPjcgdHJhbnNsYXRlIHRvIG1vdmkuICAqLwotICAgIGNhc2UgT01iOgotICAgIGNhc2UgT01jOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzIpOwotCSAgCi0JICAvKiBJbW1lZGlhdGUgdmFsdWVzIG9mIDEgLT4gNyB0cmFuc2xhdGUgdG8gbW92aS4gKi8KLQkgIGlmIChyZWcgPD0gNykKLQkgICAgewotCSAgICAgIGluc3QgPSAoaW5zdCAmIDB4RikgfCBNQ09SRV9JTlNUX0JNQVNLSV9BTFQ7Ci0JICAgICAgcmVnID0gKDB4MSA8PCByZWcpIC0gMTsKLQkgICAgICBpbnN0IHw9IHJlZyA8PCA0OwotCSAgICAgIAotCSAgICAgIGFzX3dhcm4gKF8oInRyYW5zbGF0aW5nIGJtYXNraSB0byBtb3ZpIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnN0ICY9IH4gMHgwMUYwOwotCSAgICAgIGluc3QgfD0gKHJlZyAmIDB4MUYpIDw8IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNJOgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMSwgMzEpOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEk3OgotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfaW1tIChvcF9lbmQgKyAxLCAmIHJlZywgMCwgMHg3Rik7Ci0JICBpbnN0IHw9IHJlZyA8PCA0OwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTFM6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnIDw8IDg7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIGludCBzaXplOwotCSAgCi0JICBpZiAoKGluc3QgJiAweDYwMDApID09IDApCi0JICAgIHNpemUgPSA0OwotCSAgZWxzZSBpZiAoKGluc3QgJiAweDYwMDApID09IDB4NDAwMCkKLQkgICAgc2l6ZSA9IDI7Ci0JICBlbHNlIGlmICgoaW5zdCAmIDB4NjAwMCkgPT0gMHgyMDAwKQotCSAgICBzaXplID0gMTsKLQkgIAotCSAgb3BfZW5kID0gcGFyc2VfbWVtIChvcF9lbmQgKyAxLCAmIHJlZywgJiBvZmYsIHNpemUpOwotCSAgCi0JICBpZiAob2ZmID4gMTYpCi0JICAgIGFzX2JhZCAoXygiZGlzcGxhY2VtZW50IHRvbyBsYXJnZSAoJWQpIiksIG9mZik7Ci0JICBlbHNlCi0JICAgIGluc3QgfD0gKHJlZykgfCAob2ZmIDw8IDQpOwotCX0KLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG1pc3NpbmciKSk7Ci0gICAgICAKLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgTFI6Ci0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIAotICAgICAgaWYgKHJlZyA9PSAwIHx8IHJlZyA9PSAxNSkKLQlhc19iYWQgKF8oIkludmFsaWQgcmVnaXN0ZXI6IHIwIGFuZCByMTUgaWxsZWdhbCIpKTsKLSAgICAgIAotICAgICAgaW5zdCB8PSAocmVnIDw8IDgpOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQkvKiBwYXJzZV9ydCBjYWxscyBmcmFnX21vcmUoKSBmb3IgdXMuICAqLwotCWlucHV0X2xpbmVfcG9pbnRlciA9IHBhcnNlX3J0IChvcF9lbmQgKyAxLCAmIG91dHB1dCwgMCwgMCk7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsJCS8qIHNhdmUgaXRzIHNwYWNlICovCi0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIExKOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfcnQgKG9wX2VuZCArIDEsICYgb3V0cHV0LCAxLCAwKTsKLSAgICAgIC8qIHBhcnNlX3J0KCkgY2FsbHMgZnJhZ19tb3JlKCkgZm9yIHVzLiAgKi8KLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSTToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICBpZiAocmVnID09IDAgfHwgcmVnID09IDE1KQotCWFzX2JhZCAoXygiYmFkIHN0YXJ0aW5nIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGludmFsaWQiKSk7Ci0gICAgICAKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICctJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLQkgIAotCSAgaWYgKHJlZyAhPSAxNSkKLQkgICAgYXNfYmFkIChfKCJlbmRpbmcgcmVnaXN0ZXIgbXVzdCBiZSByMTUiKSk7Ci0JICAKLQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSAgICArKyBvcF9lbmQ7Ci0JfQotICAgICAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCArKzsKLQkgIAotCSAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JICAgICsrIG9wX2VuZDsKLSAgCi0JICBpZiAoKiBvcF9lbmQgPT0gJygnKQotCSAgICB7Ci0JICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0JICAgICAgCi0JICAgICAgaWYgKHJlZyAhPSAwKQotCQlhc19iYWQgKF8oImJhZCBiYXNlIHJlZ2lzdGVyOiBtdXN0IGJlIHIwIikpOwotCSAgICAgIAotCSAgICAgIGlmICgqIG9wX2VuZCA9PSAnKScpCi0JCW9wX2VuZCArKzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBhc19iYWQgKF8oImJhc2UgcmVnaXN0ZXIgZXhwZWN0ZWQiKSk7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBSUToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgCi0gICAgICBpZiAocmVnICE9IDQpCi0JYXNfZmF0YWwgKF8oImZpcnN0IHJlZ2lzdGVyIG11c3QgYmUgcjQiKSk7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJy0nKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCSAgCi0JICBpZiAocmVnICE9IDcpCi0JICAgIGFzX2ZhdGFsIChfKCJsYXN0IHJlZ2lzdGVyIG11c3QgYmUgcjciKSk7Ci0JICAKLQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSAgICArKyBvcF9lbmQ7Ci0gIAotCSAgaWYgKCogb3BfZW5kID09ICcsJykKLQkgICAgewotCSAgICAgIG9wX2VuZCArKzsKLQkgICAgICAKLQkgICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JCSsrIG9wX2VuZDsKLSAgCi0JICAgICAgaWYgKCogb3BfZW5kID09ICcoJykKLQkJewotCQkgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotCQkgIAotCQkgIGlmIChyZWcgPj0gNCAmJiByZWcgPD0gNykKLQkJICAgIGFzX2ZhdGFsICgiYmFzZSByZWdpc3RlciBjYW5ub3QgYmUgcjQsIHI1LCByNiwgb3IgcjciKTsKLQkJICAKLQkJICBpbnN0IHw9IHJlZzsKLQkJICAKLQkJICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotCQkgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JCSAgICArKyBvcF9lbmQ7Ci0JCSAgCi0JCSAgaWYgKCogb3BfZW5kID09ICcpJykKLQkJICAgIG9wX2VuZCArKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJYXNfYmFkIChfKCJiYXNlIHJlZ2lzdGVyIGV4cGVjdGVkIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJyZWctcmVnIGV4cGVjdGVkIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEJSOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfZXhwIChvcF9lbmQgKyAxLCAmIGUpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgCi0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIG91dHB1dC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgCi0JCSAgIDIsICYgZSwgMSwgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTExQlkyKTsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBCTDoKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWcgPDwgNDsKLSAgICAgIAotICAgICAgLyogU2tpcCB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIG9wX2VuZCkpCi0JKysgb3BfZW5kOwotICAKLSAgICAgIGlmICgqIG9wX2VuZCA9PSAnLCcpCi0JewotCSAgb3BfZW5kID0gcGFyc2VfZXhwIChvcF9lbmQgKyAxLCAmIGUpOwotCSAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLQkgIAotCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBvdXRwdXQtZnJhZ19ub3ctPmZyX2xpdGVyYWwsIAotCQkgICAgICAgMiwgJiBlLCAxLCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NNEJZMik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLQkgIG91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpDOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfZXhwIChvcF9lbmQgKyAxLCAmIGUpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsCi0JCQkgbWRfcmVsYXhfdGFibGVbQyAoQ09ORF9KVU1QLCBDT05EMzIpXS5ybHhfbGVuZ3RoLAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDEyKV0ucmx4X2xlbmd0aCwKLQkJCSBDIChDT05EX0pVTVAsIDApLCBlLlhfYWRkX3N5bWJvbCwgZS5YX2FkZF9udW1iZXIsIDApOwotICAgICAgaXNpemUgPSBDMzJfTEVOOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIEpVOgotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcGFyc2VfZXhwIChvcF9lbmQgKyAxLCAmIGUpOwotICAgICAgb3V0cHV0ID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDMyKV0ucmx4X2xlbmd0aCwKLQkJCSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QxMildLnJseF9sZW5ndGgsCi0JCQkgQyAoVU5DRF9KVU1QLCAwKSwgZS5YX2FkZF9zeW1ib2wsIGUuWF9hZGRfbnVtYmVyLCAwKTsKLSAgICAgIGlzaXplID0gVTMyX0xFTjsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBKTDoKLSAgICAgIGluc3QgPSBNQ09SRV9JTlNUX0pTUkk7CQkvKiBqc3JpICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwYXJzZV9ydCAob3BfZW5kICsgMSwgJiBvdXRwdXQsIDEsICYgZSk7Ci0gICAgICAvKiBwYXJzZV9ydCgpIGNhbGxzIGZyYWdfbW9yZSBmb3IgdXMgKi8KLSAgICAgIAotICAgICAgLyogT25seSBkbyB0aGlzIGlmIHdlIGtub3cgaG93IHRvIGRvIGl0IC4uLiAqLwotICAgICAgaWYgKGUuWF9vcCAhPSBPX2Fic2VudCAmJiBkb19qc3JpMmJzcikKLQl7Ci0JICAvKiBMb29rIGF0IGFkZGluZyB0aGUgUl9QQ1JFTF9KU1JJTU0xMUJZMi4gICovCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIG91dHB1dC1mcmFnX25vdy0+ZnJfbGl0ZXJhbCwgCi0JCSAgICAgICAyLCAmIGUsIDEsIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSU0k6CQkJCS8qIFNJLCBidXQgaW1tIGJlY29tZXMgMzItaW1tICovCi0gICAgICBvcF9lbmQgPSBwYXJzZV9yZWcgKG9wX2VuZCArIDEsICYgcmVnKTsKLSAgICAgIGluc3QgfD0gcmVnOwotICAgICAgCi0gICAgICAvKiBTa2lwIHdoaXRlc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCogb3BfZW5kKSkKLQkrKyBvcF9lbmQ7Ci0gIAotICAgICAgaWYgKCogb3BfZW5kID09ICcsJykKLQl7Ci0JICBvcF9lbmQgPSBwYXJzZV9pbW0gKG9wX2VuZCArIDEsICYgcmVnLCAxLCAzMSk7Ci0JICAKLQkgIHJlZyA9IDMyIC0gcmVnOwotCSAgaW5zdCB8PSByZWcgPDwgNDsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIERPMjE6CQkJLyogTzIsIGR1cCByZCwgbGl0IG11c3QgYmUgMSAqLwotICAgICAgb3BfZW5kID0gcGFyc2VfcmVnIChvcF9lbmQgKyAxLCAmIHJlZyk7Ci0gICAgICBpbnN0IHw9IHJlZzsKLSAgICAgIGluc3QgfD0gcmVnIDw8IDQ7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKLQkgIAotCSAgaWYgKHJlZyAhPSAxKQotCSAgICBhc19iYWQgKF8oInNlY29uZCBvcGVyYW5kIG11c3QgYmUgMSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJzZWNvbmQgb3BlcmFuZCBtaXNzaW5nIikpOwotICAgICAgCi0gICAgICBvdXRwdXQgPSBmcmFnX21vcmUgKDIpOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNJYToKLSAgICAgIG9wX2VuZCA9IHBhcnNlX3JlZyAob3BfZW5kICsgMSwgJiByZWcpOwotICAgICAgaW5zdCB8PSByZWc7Ci0gICAgICAKLSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0gICAgICB3aGlsZSAoaXNzcGFjZSAoKiBvcF9lbmQpKQotCSsrIG9wX2VuZDsKLSAgCi0gICAgICBpZiAoKiBvcF9lbmQgPT0gJywnKQotCXsKLQkgIG9wX2VuZCA9IHBhcnNlX2ltbSAob3BfZW5kICsgMSwgJiByZWcsIDEsIDMxKTsKLQotCSAgaWYgKHJlZyA9PSAwKQotCSAgICBhc19iYWQgKF8oInplcm8gdXNlZCBhcyBpbW1lZGlhdGUgdmFsdWUiKSk7Ci0JICAKLQkgIGluc3QgfD0gcmVnIDw8IDQ7Ci0JfQotICAgICAgZWxzZQotCWFzX2JhZCAoXygic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIpKTsKLSAgICAgIAotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygidW5pbXBsZW1lbnRlZCBvcGNvZGUgXCIlc1wiIiksIG5hbWUpOwotICAgIH0KLSAgCi0gIG91dHB1dFswXSA9IElOU1RfQllURTAgKGluc3QpOwotICBvdXRwdXRbMV0gPSBJTlNUX0JZVEUxIChpbnN0KTsKLSAgCi0gIGNoZWNrX2xpdGVyYWxzIChvcGNvZGUtPnRyYW5zZmVyLCBpc2l6ZSk7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgICBjaGFyICogbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX21jb3JlX2VuZCAoKQotewotICBkdW1wX2xpdGVyYWxzICgwKTsKLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLX0KLQotLyogVmFyaW91cyByb3V0aW5lcyB0byBraWxsIG9uZSBkYXkuICAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqIGxpdFA7Ci0gICAgIGludCAqIHNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBpbnQgICAgaTsKLSAgY2hhciAqIHQ7Ci0gIGNoYXIgKiBhdG9mX2llZWUgKCk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9OVE9GKCkiKTsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgCi0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotICAgICAgewotCW1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sCi0JCQkgICAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCWxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgICB9Ci0gIAotICByZXR1cm4gMDsKLX0KLQwKLUNPTlNUIGNoYXIgKiBtZF9zaG9ydG9wdHMgPSAiIjsKLQotI2RlZmluZSBPUFRJT05fSlNSSTJCU1JfT04JKE9QVElPTl9NRF9CQVNFICsgMCkKLSNkZWZpbmUgT1BUSU9OX0pTUkkyQlNSX09GRgkoT1BUSU9OX01EX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fU0lGSUxURVJfT04JKE9QVElPTl9NRF9CQVNFICsgMikKLSNkZWZpbmUgT1BUSU9OX1NJRklMVEVSX09GRgkoT1BUSU9OX01EX0JBU0UgKyAzKQotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotICB7ICJuby1qc3JpMmJzciIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSlNSSTJCU1JfT0ZGfSwKLSAgeyAianNyaTJic3IiLCAgICBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0pTUkkyQlNSX09OfSwKLSAgeyAic2lmaWx0ZXIiLCAgICBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NJRklMVEVSX09OfSwKLSAgeyAibm8tc2lmaWx0ZXIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NJRklMVEVSX09GRn0sCi0gIHsgTlVMTCwgICAgICAgICAgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZiAobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqIGFyZzsKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKiBwOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgICAKLSAgICBjYXNlIE9QVElPTl9KU1JJMkJTUl9PTjogIGRvX2pzcmkyYnNyID0gMTsgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9KU1JJMkJTUl9PRkY6IGRvX2pzcmkyYnNyID0gMDsgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TSUZJTFRFUl9PTjogIHNpZmlsdGVyX21vZGUgPSAxOyBicmVhazsKLSAgICBjYXNlIE9QVElPTl9TSUZJTFRFUl9PRkY6IHNpZmlsdGVyX21vZGUgPSAwOyBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICogc3RyZWFtOwotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLU1DT1JFIHNwZWNpZmljIG9wdGlvbnM6XG5cCi0gIC17bm8tfWpzcmkyYnNyCSAge2Rpc31hYmxlIGpzcmkgdG8gYnNyIHRyYW5zZm9ybWF0aW9uIChkZWY6IGRpcylcblwKLSAgLXtuby19c2lmaWx0ZXIJICB7ZGlzfWFibGUgc2lsaWNvbiBmaWx0ZXIgYmVoYXZpb3IgKGRlZjogZGlzKSIpKTsKLX0KLQwKLWludCBtZF9zaG9ydF9qdW1wX3NpemU7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fTmRkciwgdG9fTmRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICogcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX05kZHI7Ci0gICAgIGFkZHJlc3NUIHRvX05kZHI7Ci0gICAgIGZyYWdTICogZnJhZzsKLSAgICAgc3ltYm9sUyAqIHRvX3N5bWJvbDsKLXsKLSAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3J0X2p1bXAiKSk7Ci19Ci0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9OZGRyLCB0b19OZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKiBwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fTmRkcjsKLSAgICAgYWRkcmVzc1QgdG9fTmRkcjsKLSAgICAgZnJhZ1MgKiBmcmFnOwotICAgICBzeW1ib2xTICogdG9fc3ltYm9sOwotewotICBhc19mYXRhbCAoXygiZmFpbGVkIHNhbml0eSBjaGVjazogbG9uZ19qdW1wIikpOwotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgcmVsYXhpbmcsIGNoYW5nZSB0aGUgZnJhZ3Mgc28gdGhleSBrbm93IGhvdyBiaWcgdGhleSBhcmUuICAqLwotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKiBhYmZkOwotICAgICBzZWdUIHNlYzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKiBmcmFnUDsKLXsKLSAgdW5zaWduZWQgY2hhciAqIGJ1ZmZlcjsKLSAgaW50IHRhcmdfYWRkciA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gIAotICBidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKLSAgdGFyZ19hZGRyICs9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ1AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3M7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDIChDT05EX0pVTVAsIENPTkQxMik6Ci0gICAgY2FzZSBDIChVTkNEX0pVTVAsIFVOQ0QxMik6Ci0gICAgICB7Ci0JLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uICovCi0JaW50IG5leHRfaW5zdCA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzcyArIDI7Ci0JdW5zaWduZWQgY2hhciB0MDsKLQlpbnQgZGlzcCA9IHRhcmdfYWRkciAtIG5leHRfaW5zdDsKLQkKLQlpZiAoZGlzcCAmIDEpCi0JICBhc19iYWQgKF8oIm9kZCBkaXNwbGFjZW1lbnQgYXQgJXgiKSwgbmV4dF9pbnN0IC0gMik7Ci0JCi0JZGlzcCA+Pj0gMTsKLQkgIHsKLQkgICAgdDAgPSBidWZmZXJbMF0gJiAweEY4OwotCQotCSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciwgZGlzcCwgMik7Ci0JCi0JICAgIGJ1ZmZlclswXSA9IChidWZmZXJbMF0gJiAweDA3KSB8IHQwOwotCSAgfQotCQotCWZyYWdQLT5mcl9maXggKz0gMjsKLQlmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChDT05EX0pVTVAsIENPTkQzMik6Ci0gICAgY2FzZSBDIChDT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICB7Ci0JLyogQSBjb25kaXRpb25hbCBicmFuY2ggd29udCBmaXQgaW50byAxMiBiaXRzIHNvOgotCSAqCWIhY29uZAkxZgotCSAqCWptcGkJMGYKLQkgKgkuYWxpZ24gMgotCSAqIDA6CS5sb25nIGRpc3AKLQkgKiAxOgotCSAqCi0JICogaWYgdGhlIGIhY29uZCBpcyA0IGJ5dGUgYWxpZ25lZCwgdGhlIGxpdGVyYWwgd2hpY2ggd291bGQKLQkgKiBnbyBhdCB4KzQgd2lsbCBhbHNvIGJlIGFsaWduZWQuCi0JICovCi0JaW50IGZpcnN0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7Ci0JaW50IG5lZWRwYWQgPSAoZmlyc3RfaW5zdCAmIDMpOwotCi0JICBidWZmZXJbMF0gXj0gMHgwODsJLyogVG9nZ2xlIFQvRiBiaXQgKi8KLQotCWJ1ZmZlclsyXSA9IElOU1RfQllURTAgKE1DT1JFX0lOU1RfSk1QSSk7CS8qIEJ1aWxkIGptcGkgKi8KLQlidWZmZXJbM10gPSBJTlNUX0JZVEUxIChNQ09SRV9JTlNUX0pNUEkpOwotIAotCWlmIChuZWVkcGFkKQotCSAgewotCSAgICAgIHsKLQkJYnVmZmVyWzFdID0gNDsJLyogYnJhbmNoIG92ZXIgam1waSwgcGFkLCBhbmQgcHRyICovCi0JCWJ1ZmZlclszXSA9IDE7CS8qIGptcGkgb2Zmc2V0IG9mIDEgZ2V0cyB0aGUgcG9pbnRlciAqLwotCSAgICAgIH0KLQkgICAgCi0JICAgIGJ1ZmZlcls0XSA9IDA7CS8qIGFsaWdubWVudC9wYWQgKi8KLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgYnVmZmVyWzZdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCi0JICAgIGJ1ZmZlcls3XSA9IDA7Ci0JICAgIGJ1ZmZlcls4XSA9IDA7Ci0JICAgIGJ1ZmZlcls5XSA9IDA7Ci0JICAgIAotCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNiwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICAKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBDMzJfTEVOOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogU2VlIGNvbW1lbnQgYmVsb3cgYWJvdXQgdGhpcyBnaXZlbiBnYXMnIGxpbWl0YXRpb25zIGZvcgotCSAgICAgICBzaHJpbmtpbmcgdGhlIGZyYWdtZW50LiAnMycgaXMgdGhlIGFtb3VudCBvZiBjb2RlIHRoYXQKLQkgICAgICAgd2UgaW5zZXJ0ZWQgaGVyZSwgYnV0ICc0JyBpcyByaWdodCBmb3IgdGhlIHNwYWNlIHdlIHJlc2VydmVkCi0JICAgICAgIGZvciB0aGlzIGZyYWdtZW50LiAqLwotCSAgICAgIHsKLQkJYnVmZmVyWzFdID0gMzsJLyogYnJhbmNoIG92ZXIgam1waSwgYW5kIHB0ciAqLwotCQlidWZmZXJbM10gPSAwOwkvKiBqbXBpIG9mZnNldCBvZiAwIGdldHMgdGhlIHBvaW50ZXIgKi8KLQkgICAgICB9Ci0JICAgIAotCSAgICBidWZmZXJbNF0gPSAwOwkvKiBzcGFjZSBmb3IgMzIgYml0IGFkZHJlc3MgKi8KLQkgICAgYnVmZmVyWzVdID0gMDsKLQkgICAgYnVmZmVyWzZdID0gMDsKLQkgICAgYnVmZmVyWzddID0gMDsKLQkgICAgCi0JICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AuICAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDQsCi0JCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBDMzJfTEVOOwotCi0JICAgIC8qIEZyYWcgaXMgYWN0dWFsbHkgc2hvcnRlciAoc2VlIHRoZSBvdGhlciBzaWRlIG9mIHRoaXMgaWZkZWYpCi0JICAgICAgIGJ1dCBnYXMgaXNuJ3QgcHJlcGFyZWQgZm9yIHRoYXQuICBXZSBoYXZlIHRvIHJlLWFkanVzdAotCSAgICAgICB0aGUgYnJhbmNoIGRpc3BsYWNlbWVudCBzbyB0aGF0IGl0IGdvZXMgYmV5b25kIHRoZSAKLQkgICAgICAgZnVsbCBsZW5ndGggb2YgdGhlIGZyYWdtZW50LCBub3QganVzdCB3aGF0IHdlIGFjdHVhbGx5Ci0JICAgICAgIGZpbGxlZCBpbi4gICovCi0JICAgICAgYnVmZmVyWzFdID0gNDsJLyogam1waSwgcHRyLCBhbmQgdGhlICd0YWlsIHBhZCcgKi8KLQkgIH0KLQkKLQlmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChVTkNEX0pVTVAsIFVOQ0QzMik6Ci0gICAgY2FzZSBDIChVTkNEX0pVTVAsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICB7Ci0JLyogQW4gdW5jb25kaXRpb25hbCBicmFuY2ggd2lsbCBub3QgZml0IGluIDEyIGJpdHMsIG1ha2UgY29kZSB3aGljaAotCSAgIGxvb2tzIGxpa2U6Ci0JICAJam1waQkwZgotCSAgCS5hbGlnbiAyCi0JICAgICAwOgkubG9uZyBkaXNwCi0JICAgd2UgbmVlZCBhIHBhZCBpZiAiZmlyc3RfaW5zdCIgaXMgNCBieXRlIGFsaWduZWQuCi0JICAgW2JlY2F1c2UgdGhlIG5hdHVyYWwgbGl0ZXJhbCBwbGFjZSBpcyB4ICsgMl0gICovCi0JaW50IGZpcnN0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3M7Ci0JaW50IG5lZWRwYWQgPSAhKGZpcnN0X2luc3QgJiAzKTsKLQotCWJ1ZmZlclswXSA9IElOU1RfQllURTAgKE1DT1JFX0lOU1RfSk1QSSk7CS8qIEJ1aWxkIGptcGkgKi8KLQlidWZmZXJbMV0gPSBJTlNUX0JZVEUxIChNQ09SRV9JTlNUX0pNUEkpOwotCi0JaWYgKG5lZWRwYWQpCi0JICB7Ci0JICAgICAgYnVmZmVyWzFdID0gMTsJLyogam1waSBvZmZzZXQgb2YgMSBzaW5jZSBwYWRkZWQgKi8KLQkgICAgYnVmZmVyWzJdID0gMDsJLyogYWxpZ25tZW50ICovCi0JICAgIGJ1ZmZlclszXSA9IDA7Ci0JICAgIGJ1ZmZlcls0XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQgYWRkcmVzcyAqLwotCSAgICBidWZmZXJbNV0gPSAwOwotCSAgICBidWZmZXJbNl0gPSAwOwotCSAgICBidWZmZXJbN10gPSAwOwotCSAgICAKLQkgICAgLyogTWFrZSByZWxvYyBmb3IgdGhlIGxvbmcgZGlzcCAqLwotCSAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDQsCi0JCSAgICAgZnJhZ1AtPmZyX3N5bWJvbCwgZnJhZ1AtPmZyX29mZnNldCwgMCwgQkZEX1JFTE9DXzMyKTsKLQkgICAgCi0JICAgIGZyYWdQLT5mcl9maXggKz0gVTMyX0xFTjsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgICAgYnVmZmVyWzFdID0gMDsJLyogam1waSBvZmZzZXQgb2YgMCBpZiBubyBwYWQgKi8KLQkgICAgYnVmZmVyWzJdID0gMDsJLyogc3BhY2UgZm9yIDMyIGJpdCBhZGRyZXNzICovCi0JICAgIGJ1ZmZlclszXSA9IDA7Ci0JICAgIGJ1ZmZlcls0XSA9IDA7Ci0JICAgIGJ1ZmZlcls1XSA9IDA7Ci0JICAgIAotCSAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCi0JICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgNCwKLQkJICAgICBmcmFnUC0+ZnJfc3ltYm9sLCBmcmFnUC0+ZnJfb2Zmc2V0LCAwLCBCRkRfUkVMT0NfMzIpOwotCSAgICBmcmFnUC0+ZnJfZml4ICs9IFUzMl9MRU47Ci0JICB9Ci0KLQlmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogQXBwbGllcyB0aGUgZGVzaXJlZCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotICAgQWxzbyBzZXRzIHVwIGFkZGVuZHMgZm9yICdyZWxhJyB0eXBlIHJlbG9jYXRpb25zLiAgKi8KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFscCwgc2VnbWVudCkKLSAgICAgZml4UyAqICAgZml4UDsKLSAgICAgdmFsdWVUICogdmFscDsKLSAgICAgc2VnVCAgICAgc2VnbWVudDsKLXsKLSAgY2hhciAqICAgICAgIGJ1ZiAgPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gIGNoYXIgKiAgICAgICBmaWxlID0gZml4UC0+ZnhfZmlsZSA/IGZpeFAtPmZ4X2ZpbGUgOiBfKCJ1bmtub3duIik7Ci0gIGNvbnN0IGNoYXIgKiBzeW1uYW1lOwotICAvKiBOb3RlOiB1c2Ugb2Zmc2V0VCBiZWNhdXNlIGl0IGlzIHNpZ25lZCwgdmFsdWVUIGlzIHVuc2lnbmVkLiAgKi8KLSAgb2Zmc2V0VCAgICAgIHZhbCAgPSAob2Zmc2V0VCkgKiB2YWxwOyAKLSAgCi0gIHN5bW5hbWUgPSBmaXhQLT5meF9hZGRzeSA/IFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KSA6IF8oIjx1bmtub3duPiIpOwotICAvKiBTYXZlIHRoaXMgZm9yIHRoZSBhZGRlbmQgaW4gdGhlIHJlbG9jYXRpb24gcmVjb3JkLiAgKi8KLSAgZml4UC0+ZnhfYWRkbnVtYmVyID0gdmFsOwotCi0gIC8qIElmIHRoZSBmaXggaXMgcmVsYXRpdmUgdG8gYSBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQsIG9yIG5vdAotICAgICBpbiB0aGUgc2FtZSBzZWdtZW50IGFzIHRoZSBmaXgsIHdlIGNhbm5vdCByZXNvbHZlIGl0IGhlcmUuICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgKCAgICEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnbWVudCkpKQotICAgIHsKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIEZvciBFTEYgd2UgY2FuIGp1c3QgcmV0dXJuIGFuZCBsZXQgdGhlIHJlbG9jIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQKLQkgdGFrZSBjYXJlIG9mIGV2ZXJ5dGhpbmcuICBGb3IgQ09GRiB3ZSBzdGlsbCBoYXZlIHRvIGluc2VydCAndmFsJwotCSBpbnRvIHRoZSBpbnNuIHNpbmNlIHRoZSBhZGRlbmQgZmllbGQgd2lsbCBiZSBpZ25vcmVkLiAgKi8KLSAgICAgIHJldHVybiAwOwotI2VuZGlmCi0gICAgfQotICBlbHNlCi0gICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0gIAotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTI6ICAgICAvKiBzZWNvbmQgYnl0ZSBvZiAyIGJ5dGUgb3Bjb2RlICovCi0gICAgICBpZiAoKHZhbCAmIDEpICE9IDApCi0JYXNfYmFkX3doZXJlIChmaWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJvZGQgZGlzdGFuY2UgYnJhbmNoICgweCV4IGJ5dGVzKSIpLCB2YWwpOwotICAgICAgdmFsIC89IDI7Ci0gICAgICBpZiAoKCh2YWwgJiB+MHgzZmYpICE9IDApICYmICgodmFsIHwgMHgzZmYpICE9IC0xKSkKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oInBjcmVsIGZvciBicmFuY2ggdG8gJXMgdG9vIGZhciAoMHgleCkiKSwKLQkJICAgICAgc3ltbmFtZSwgdmFsKTsKLSAgICAgICAgYnVmWzBdIHw9ICgodmFsID4+IDgpICYgMHg3KTsKLSAgICAgICAgYnVmWzFdIHw9ICh2YWwgJiAweGZmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNDoJLyogbG93ZXIgOCBiaXRzIG9mIDIgYnl0ZSBvcGNvZGUgKi8KLSAgICAgIHZhbCArPSAzOwotICAgICAgdmFsIC89IDQ7Ci0gICAgICBpZiAodmFsICYgfjB4ZmYpCi0JYXNfYmFkX3doZXJlIChmaWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJwY3JlbCBmb3IgbHJ3L2ptcGkvanNyaSB0byAlcyB0b28gZmFyICgweCV4KSIpLAotCQkgICAgICBzeW1uYW1lLCB2YWwpOwotICAgICAgZWxzZQotCWJ1ZlsxXSB8PSAodmFsICYgMHhmZik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTTRCWTI6CS8qIGxvb3B0IGluc3RydWN0aW9uICovCi0gICAgICBpZiAoKHZhbCA8IC0zMikgfHwgKHZhbCA+IC0yKSkKLQlhc19iYWRfd2hlcmUgKGZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oInBjcmVsIGZvciBsb29wdCB0b28gZmFyICgweCV4KSIpLCB2YWwpOwotICAgICAgdmFsIC89IDI7Ci0gICAgICAgIGJ1ZlsxXSB8PSAodmFsICYgMHhmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyOgotICAgICAgLyogQ29uZGl0aW9uYWwgbGlua2VyIG1hcCBqc3JpIHRvIGJzci4gICovCi0gICAgICAvKiBJZiBpdHMgYSBsb2NhbCB0YXJnZXQgYW5kIGNsb3NlIGVub3VnaCwgZml4IGl0LiAKLSAgICAgICAgIE5COiA+PSAtMmsgZm9yIGJhY2t3YXJkcyBic3I7IDwgMmsgZm9yIGZvcndhcmRzLi4uICAqLwotICAgICAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgdmFsID49IC0yMDQ4ICAmJiB2YWwgPCAyMDQ4KQotCXsKLQkgIGxvbmcgbnZhbCA9ICh2YWwgLyAyKSAmIDB4N2ZmOwotCSAgbnZhbCB8PSBNQ09SRV9JTlNUX0JTUjsKLQkgIAotCSAgLyogUkVQTEFDRSB0aGUgaW5zdHJ1Y3Rpb24sIGRvbid0IGp1c3QgbW9kaWZ5IGl0LiAgKi8KLQkgIGJ1ZlswXSA9IElOU1RfQllURTAgKG52YWwpOwotCSAgYnVmWzFdID0gSU5TVF9CWVRFMSAobnZhbCk7Ci0JfQotICAgICAgZWxzZQotCWZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF8zMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfRU5UUlk6Ci0gICAgICBmaXhQLT5meF9kb25lID0gMDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKQotCXsKLQkgIC8qIElmIHRoZSBmaXggaXMgYW4gYWJzb2x1dGUgcmVsb2MgYmFzZWQgb24gYSBzeW1ib2wncwotCSAgICAgYWRkcmVzcywgdGhlbiBpdCBjYW5ub3QgYmUgcmVzb2x2ZWQgdW50aWwgdGhlIGZpbmFsIGxpbmsuICAqLwotCSAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0JfQotI2lmZGVmIE9CSl9FTEYgICAgICAKLSAgICAgIGVsc2UKLSNlbmRpZgotCXsKLQkgIGlmIChmaXhQLT5meF9zaXplID09IDQpCi0JICAgIDsKLQkgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMiAmJiB2YWwgPj0gLTMyNzY4ICYmIHZhbCA8PSAzMjc2NykKLQkgICAgOwotCSAgZWxzZSBpZiAoZml4UC0+Znhfc2l6ZSA9PSAxICYmIHZhbCA+PSAtMjU2ICYmIHZhbCA8PSAyNTUpCi0JICAgIDsKLQkgIGVsc2UKLQkgICAgYWJvcnQgKCk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBmaXhQLT5meF9zaXplKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7IC8qIFJldHVybiB2YWx1ZSBpcyBpZ25vcmVkLiAgKi8KLX0KLQotdm9pZAotbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIC8qIElnbm9yZSBsZWFkaW5nIGhhc2ggc3ltYm9sLCBpZiBwb3Jlc2VudC4gICovCi0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnIycpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotICAgICAgZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgIH0KLX0KLQotaW50IG1kX2xvbmdfanVtcF9zaXplOwotCi0vKiBDYWxsZWQganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLCByZXR1cm4gdGhlIGxlbmd0aAotICAgYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbi4gICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqIGZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDIChVTkNEX0pVTVAsIFVOREVGX0RJU1ApOgotICAgICAgLyogVXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24uICAqLwotICAgICAgaWYgKCFmcmFnUC0+ZnJfc3ltYm9sKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DRF9KVU1QLCBVTkNEMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ0RfSlVNUCwgVU5DRDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNEX0pVTVAsIFVOQ0QxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMTIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ0RfSlVNUCwgVU5ERUZfV09SRF9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChVTkNEX0pVTVAsIFVOQ0QzMildLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAoVU5DRF9KVU1QLCBVTkNEMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgICAgCi0gICAgY2FzZSBDIChDT05EX0pVTVAsIFVOREVGX0RJU1ApOgotICAgICAgLyogVXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24uICovCi0gICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbAotCSAgJiYgU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIC8qIEdvdCBhIHN5bWJvbCBhbmQgaXQncyBkZWZpbmVkIGluIHRoaXMgc2VnbWVudCwgYmVjb21lIGJ5dGUKLQkgICAgIHNpemVkIC0gbWF5YmUgaXQgd2lsbCBmaXggdXAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoQ09ORF9KVU1QLCBDT05EMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlIGlmIChmcmFnUC0+ZnJfc3ltYm9sKQotCXsKLQkgIC8qIEl0cyBnb3QgYSBzZWdtZW50LCBidXQgaXRzIG5vdCBvdXJzLCBzbyBpdCB3aWxsIGFsd2F5cyBiZSBsb25nLiAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoQ09ORF9KVU1QLCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKENPTkRfSlVNUCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQzMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFdlIGtub3cgdGhlIGFicyB2YWx1ZS4gICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKENPTkRfSlVNUCwgQ09ORDEyKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDIChDT05EX0pVTVAsIENPTkQxMildLnJseF9sZW5ndGg7Ci0JfQotCi0gICAgICBicmVhazsKLSAgICB9Ci0gIAotICByZXR1cm4gZnJhZ1AtPmZyX3ZhcjsKLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKHB0ciwgdXNlLCBuYnl0ZXMpCi0gICAgIGNoYXIgKiBwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gICAgc3dpdGNoIChuYnl0ZXMpCi0gICAgICB7Ci0gICAgICBjYXNlIDQ6ICpwdHIrKyA9ICh1c2UgPj4gMjQpICYgMHhmZjsgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDM6ICpwdHIrKyA9ICh1c2UgPj4gMTYpICYgMHhmZjsgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDI6ICpwdHIrKyA9ICh1c2UgPj4gIDgpICYgMHhmZjsgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICBjYXNlIDE6ICpwdHIrKyA9ICh1c2UgPj4gIDApICYgMHhmZjsgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiBhYm9ydCAoKTsKLSAgICAgIH0KLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuICAqLwotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCi0gICAgIGZpeFMgKiBmaXhwOwotICAgICBzZWdUIHNlYzsKLXsKLSNpZmRlZiBPQkpfRUxGCi0gIC8qIElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkIG9yIGRlZmluZWQgaW4gYW5vdGhlciBzZWN0aW9uCi0gICAgIHdlIGxlYXZlIHRoZSBhZGQgbnVtYmVyIGFsb25lIGZvciB0aGUgbGlua2VyIHRvIGZpeCBpdCBsYXRlci4KLSAgICAgT25seSBhY2NvdW50IGZvciB0aGUgUEMgcHJlLWJ1bXAgKHdoaWNoIGlzIDIgYnl0ZXMgb24gdGhlIE1Db3JlKS4gKi8KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICghIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpCi0JICB8fCAoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IHNlYykpKQotICAgICAgCi0gIHsKLSAgICBhc3NlcnQgKGZpeHAtPmZ4X3NpemUgPT0gMik7CS8qIG11c3QgYmUgYW4gaW5zbiAqLwotICAgIHJldHVybiBmaXhwLT5meF9zaXplOwotICB9Ci0jZW5kaWYKLQotICAvKiBUaGUgY2FzZSB3aGVyZSB3ZSBhcmUgZ29pbmcgdG8gcmVzb2x2ZSB0aGluZ3MuLi4gKi8KLSAgcmV0dXJuICBmaXhwLT5meF9zaXplICsgZml4cC0+Znhfd2hlcmUgKyBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0jZGVmaW5lIEYoU1osUENSRUwpCQkoKChTWikgPDwgMSkgKyAoUENSRUwpKQotI2RlZmluZSBNQVAoU1osUENSRUwsVFlQRSkJY2FzZSBGIChTWiwgUENSRUwpOiBjb2RlID0gKFRZUEUpOyBicmVhawotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKiBzZWN0aW9uOwotICAgICBmaXhTICogZml4cDsKLXsKLSAgYXJlbGVudCAqIHJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0gIGludCBoYW5kbGVkID0gMDsKLQotICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgICAvKiBUaGVzZSBjb25mdXNlIHRoZSBzaXplL3BjcmVsIG1hY3JvIGFwcHJvYWNoLiAqLwotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19NQ09SRV9QQ1JFTF9JTU00QlkyOgotICAgIGNhc2UgQkZEX1JFTE9DX01DT1JFX1BDUkVMX0lNTThCWTQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NMTFCWTI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSlNSX0lNTTExQlkyOgotICAgICAgY29kZSA9IGZpeHAtPmZ4X3JfdHlwZTsKLSAgICAgIGJyZWFrOwotICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBzd2l0Y2ggKEYgKGZpeHAtPmZ4X3NpemUsIGZpeHAtPmZ4X3BjcmVsKSkKLSAgICAgICAgewotICAgICAgICAgIE1BUCAoMSwgMCwgQkZEX1JFTE9DXzgpOwotICAgICAgICAgIE1BUCAoMiwgMCwgQkZEX1JFTE9DXzE2KTsKLSAgICAgICAgICBNQVAgKDQsIDAsIEJGRF9SRUxPQ18zMik7Ci0gICAgICAgICAgTUFQICgxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICAgICAgTUFQICgyLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgICAgIE1BUCAoNCwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgICAgZGVmYXVsdDoKLQkgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICAgICAgYXNfYmFkIChfKCJDYW4gbm90IGRvICVkIGJ5dGUgJXNyZWxvY2F0aW9uIiksCi0JCSAgZml4cC0+Znhfc2l6ZSwKLQkgICAgICAgICAgZml4cC0+ZnhfcGNyZWwgPyBfKCJwYy1yZWxhdGl2ZSIpIDogIiIpOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJlbCA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICAvKiBBbHdheXMgcGFzcyB0aGUgYWRkZW5kIGFsb25nISAgKi8KLSAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0KLSAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLSAgCi0gIGlmIChyZWwtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotICAgICAgICAgICAgICAgICAgICBfKCJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAotICAgICAgICAgICAgICAgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgCi0gICAgICAvKiBTZXQgaG93dG8gdG8gYSBnYXJiYWdlIHZhbHVlIHNvIHRoYXQgd2UgY2FuIGtlZXAgZ29pbmcuICAqLwotICAgICAgcmVsLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfMzIpOwotICAgICAgYXNzZXJ0IChyZWwtPmhvd3RvICE9IE5VTEwpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQotCi0jaWZkZWYgT0JKX0VMRgotLyogU2VlIHdoZXRoZXIgd2UgbmVlZCB0byBmb3JjZSBhIHJlbG9jYXRpb24gaW50byB0aGUgb3V0cHV0IGZpbGUuCi0gICBUaGlzIGlzIHVzZWQgdG8gZm9yY2Ugb3V0IHN3aXRjaCBhbmQgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMgd2hlbgotICAgcmVsYXhpbmcuICAqLwotaW50Ci1tY29yZV9mb3JjZV9yZWxvY2F0aW9uIChmaXgpCi0gICAgIGZpeFMgKiBmaXg7Ci17Ci0gIGlmICggICBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBmaXggY2FuIGJlIGhhbmRsZWQgYnkgR0FTLCBmYWxzZSBpZiBpdCBtdXN0Ci0gICBiZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgbGlua2VyLiAgKi8KLWJvb2xlYW4KLW1jb3JlX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqIGZpeFA7Ci17Ci0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMKQotICAgIHJldHVybiAxOwotICAKLSAgLyogV2UgbmVlZCB0aGUgc3ltYm9sIG5hbWUgZm9yIHRoZSBWVEFCTEUgZW50cmllcy4gICovCi0gIGlmICggICBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMTsKLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1jb3JlLmggYi9nYXMvY29uZmlnL3RjLW1jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTNjMjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1tY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyB0Yy1tY29yZS5oCi0KLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgKi8KLQotI2lmbmRlZglUQ19NQ09SRQotI2RlZmluZSBUQ19NQ09SRSAxCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICNlcnJvciBNQ09SRSBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0jZGVmaW5lIFRBUkdFVF9BUkNICWJmZF9hcmNoX21jb3JlCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotLyogRG9uJ3Qgd3JpdGUgb3V0IHJlbG9jcyBmb3IgcGNyZWwgc3R1ZmYuICAqLwotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoKCh4KS0+ZnhfYWRkc3kgfHwgKHgpLT5meF9zdWJzeSkgJiYgXAotCQkJICAgKHgpLT5meF9yX3R5cGUgPCBCRkRfUkVMT0NfTUNPUkVfUENSRUxfSU1NOEJZNCkKLQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShhLGIsYykgdGNfcmVsb2NfbWFuZ2xlIChhLCBiLCBjKQotCi0vKiBTb21lIHBzZXVkby1vcCBzZW1hbnRpYyBleHRlbnNpb25zLiAgKi8KLSNkZWZpbmUJUFNFVURPX0xDT01NX09QVElPTkFMX0FMSUdOCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgICAgICAgIAkiTS5DT1JFIEdBUyBWZXJzaW9uIDIuOS40IgotI2RlZmluZSBMSVNUSU5HX0xIU19DT05UX0xJTkVTCTQKLQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQkxCi0jZGVmaW5lIENPRkZfRkxBR1MgCTEKLQotLyogV2Ugd2FudCBsb2NhbCBsYWJlbCBzdXBwb3J0LiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSAgICAgCi0jZGVmaW5lIFRDX0NPRkZfU0laRU1BQ0hERVAoZnJhZykgdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotI2RlZmluZSBtZF9lbmQJbWRfbWNvcmVfZW5kCi0KLS8qIFdhbnQgdGhlIHNlY3Rpb24gaW5mb3JtYXRpb24gdG9vLi4uICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbiAoRklYUCwgU0VDKQotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMgIC8qIFdlIHdhbnQgdGhlIHNlZ21lbnQgYXMgd2VsbC4gICovCi0KLQotCi0jaWZkZWYgIE9CSl9DT0ZGCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkodGFyZ2V0X2JpZ19lbmRpYW4gPyAicGUtbWNvcmUtYmlnIiA6ICJwZS1tY29yZS1saXR0bGUiKQotCi1zdHJ1Y3QgbWNvcmVfdGNfc3kKLXsKLSAgaW50IHN5X2ZsYWdzOwotfTsKLQotI2RlZmluZSBUQ19TWU1GSUVMRF9UWVBFIHN0cnVjdCBtY29yZV90Y19zeQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotCi0jaWZkZWYgT0JKX0VMRgotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHRhcmdldF9iaWdfZW5kaWFuID8gImVsZjMyLW1jb3JlLWJpZyIgOiAiZWxmMzItbWNvcmUtbGl0dGxlIikKLQotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5jdG9ycyIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFIH0sIFwKLSAgeyAiLmR0b3JzIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgfSwgXAotLyogT3RoZXIgc3BlY2lhbCBzZWN0aW9ucyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXI6IC5yZWdpbmZvLAotICAgLmxpYmxpc3QsIC5jb25mbGljdCwgLmdwdGFiLCAuZ290LCAuZHluYW1pYywgLnJlbC5keW4uICAqLwotCi0vKiBXaGVuIHJlbGF4aW5nLCB3ZSBuZWVkIHRvIGVtaXQgdmFyaW91cyByZWxvY3Mgd2Ugb3RoZXJ3aXNlIHdvdWxkbid0LiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihmaXgpIG1jb3JlX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLWV4dGVybiBpbnQgbWNvcmVfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgbWNvcmVfZml4X2FkanVzdGFibGUgKGZpeFApCi1leHRlcm4gYm9vbGVhbiBtY29yZV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotI2lmbmRlZiBUQVJHRVRfRk9STUFUCi0jIGVycm9yIE5vIHRhcmdldCBmb3JtYXQgc3BlY2lmaWVkLgotI2VuZGlmCi0KLSNpbmNsdWRlICJ3cml0ZS5oIiAgICAgICAgLyogRm9yIGRlZmluaXRpb24gb2YgZml4UyAqLwotICAKLWV4dGVybiB2b2lkICAgICAgbWRfYmVnaW4gICAgICAgICAgICBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2Fzc2VtYmxlICAgICAgICAgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gc3ltYm9sUyAqIG1kX3VuZGVmaW5lZF9zeW1ib2wgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX21jb3JlX2VuZCAgICAgICAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKiAgICBtZF9hdG9mICAgICAgICAgICAgIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQgKikpOwotZXh0ZXJuIGludCAgICAgICBtZF9wYXJzZV9vcHRpb24gICAgIFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX3Nob3dfdXNhZ2UgICAgICAgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2NyZWF0ZV9zaG9ydF9qdW1wIAotICBQQVJBTVMgKChjaGFyICosIGFkZHJlc3NULCBhZGRyZXNzVCwgZnJhZ1MgKiwgc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX2NyZWF0ZV9sb25nX2p1bXAKLSAgUEFSQU1TICgoY2hhciAqLCBhZGRyZXNzVCwgYWRkcmVzc1QsIGZyYWdTICosIHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9jb252ZXJ0X2ZyYWcgICAgICAgICAgICAgICBQQVJBTVMgKChiZmQgKiwgc2VnVCwgZnJhZ1MgKikpOwotZXh0ZXJuIGludCAgICAgICBtZF9hcHBseV9maXgzICAgICAgICAgICAgICAgICBQQVJBTVMgKChmaXhTICosIHZhbHVlVCAqLCBzZWdUKSk7Ci1leHRlcm4gdm9pZCAgICAgIG1kX29wZXJhbmQgICAgICAgICAgICAgICAgICAgIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLWV4dGVybiBpbnQgICAgICAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggUEFSQU1TICgoZnJhZ1MgKiwgc2VnVCkpOwotZXh0ZXJuIHZvaWQgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgICAgICAgICAgICBQQVJBTVMgKChjaGFyICosIHZhbHVlVCwgaW50KSk7Ci1leHRlcm4gdmFsdWVUICAgIG1kX3NlY3Rpb25fYWxpZ24gICAgICAgICAgICAgIFBBUkFNUyAoKHNlZ1QsIHZhbHVlVCkpOwotZXh0ZXJuIGxvbmcgICAgICBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gICAgICAgICBQQVJBTVMgKChmaXhTICosIHNlZ1QpKTsKLWV4dGVybiBhcmVsZW50ICogdGNfZ2VuX3JlbG9jICAgICAgICAgICAgICAgICAgUEFSQU1TICgoYXNlY3Rpb24gKiwgZml4UyAqKSk7Ci0KLSNlbmRpZiAvKiBUQ19NQ09SRSAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1taXBzLmMgYi9nYXMvY29uZmlnL3RjLW1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzliMDYzMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1pcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDExNzkyICswLDAgQEAKLS8qIHRjLW1pcHMuYyAtLSBhc3NlbWJsZSBjb2RlIGZvciBhIE1JUFMgY2hpcC4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgdGhlIE9TRiBhbmQgUmFscGggQ2FtcGJlbGwuCi0gICBXcml0dGVuIGJ5IEtlaXRoIEtub3dsZXMgYW5kIFJhbHBoIENhbXBiZWxsLCB3b3JraW5nIGluZGVwZW5kZW50bHkuCi0gICBNb2RpZmllZCBmb3IgRUNPRkYgYW5kIFI0MDAwIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciBvZiBDeWdudXMKLSAgIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIFVTRV9TVERBUkcKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbmRpZgotI2lmZGVmIFVTRV9WQVJBUkdTCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJvcGNvZGUvbWlwcy5oIgotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZSBEQkcoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIERCRyh4KQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfTUFZQkVfRUxGCi0vKiBDbGVhbiB1cCBuYW1lc3BhY2Ugc28gd2UgY2FuIGluY2x1ZGUgb2JqLWVsZi5oIHRvby4gICovCi1zdGF0aWMgaW50IG1pcHNfb3V0cHV0X2ZsYXZvciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IG1pcHNfb3V0cHV0X2ZsYXZvciAoKSB7IHJldHVybiBPVVRQVVRfRkxBVk9SOyB9Ci0jdW5kZWYgT0JKX1BST0NFU1NfU1RBQgotI3VuZGVmIE9VVFBVVF9GTEFWT1IKLSN1bmRlZiBTX0dFVF9BTElHTgotI3VuZGVmIFNfR0VUX1NJWkUKLSN1bmRlZiBTX1NFVF9BTElHTgotI3VuZGVmIFNfU0VUX1NJWkUKLSN1bmRlZiBvYmpfZnJvYl9maWxlCi0jdW5kZWYgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLSN1bmRlZiBvYmpfZnJvYl9zeW1ib2wKLSN1bmRlZiBvYmpfcG9wX2luc2VydAotI3VuZGVmIG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotI3VuZGVmIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTCi0KLSNpbmNsdWRlICJvYmotZWxmLmgiCi0vKiBGaXggYW55IG9mIHRoZW0gdGhhdCB3ZSBhY3R1YWxseSBjYXJlIGFib3V0LiAgKi8KLSN1bmRlZiBPVVRQVVRfRkxBVk9SCi0jZGVmaW5lIE9VVFBVVF9GTEFWT1IgbWlwc19vdXRwdXRfZmxhdm9yKCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikKLSNpbmNsdWRlICJlbGYvbWlwcy5oIgotI2VuZGlmCi0KLSNpZm5kZWYgRUNPRkZfREVCVUdHSU5HCi0jZGVmaW5lIE5PX0VDT0ZGX0RFQlVHR0lORwotI2RlZmluZSBFQ09GRl9ERUJVR0dJTkcgMAotI2VuZGlmCi0KLSNpbmNsdWRlICJlY29mZi5oIgotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLXN0YXRpYyBjaGFyICptaXBzX3JlZ21hc2tfZnJhZzsKLSNlbmRpZgotCi0jZGVmaW5lIEFUICAxCi0jZGVmaW5lIFRSRUcgMjQKLSNkZWZpbmUgUElDX0NBTExfUkVHIDI1Ci0jZGVmaW5lIEtUMCAyNgotI2RlZmluZSBLVDEgMjcKLSNkZWZpbmUgR1AgIDI4Ci0jZGVmaW5lIFNQICAyOQotI2RlZmluZSBGUCAgMzAKLSNkZWZpbmUgUkEgIDMxCi0KLSNkZWZpbmUgSUxMRUdBTF9SRUcgKDMyKQotCi0vKiBBbGxvdyBvdmVycmlkZSBvZiBzdGFuZGFyZCBsaXR0bGUtZW5kaWFuIEVDT0ZGIGZvcm1hdC4gICovCi0KLSNpZm5kZWYgRUNPRkZfTElUVExFX0ZPUk1BVAotI2RlZmluZSBFQ09GRl9MSVRUTEVfRk9STUFUICJlY29mZi1saXR0bGVtaXBzIgotI2VuZGlmCi0KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLS8qIDEgaXMgd2Ugc2hvdWxkIHVzZSB0aGUgNjQgYml0IE1JUFMgRUxGIEFCSSwgMCBpZiB3ZSBzaG91bGQgdXNlIHRoZQotICAgMzIgYml0IEFCSS4gIFRoaXMgaGFzIG5vIG1lYW5pbmcgZm9yIEVDT0ZGLgotICAgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGlzIGFsd2F5cyAzMiBiaXQsIGV2ZW4gaWYgImNvbmZpZ3VyZWQiIGZvcgotICAgNjQgYml0IFtlLmcuIC0tdGFyZ2V0PW1pcHM2NC1lbGZdLiAgKi8KLXN0YXRpYyBpbnQgbWlwc182NDsKLQotLyogVGhlIGRlZmF1bHQgdGFyZ2V0IGZvcm1hdCB0byB1c2UuICAqLwotY29uc3QgY2hhciAqCi1taXBzX3RhcmdldF9mb3JtYXQgKCkKLXsKLSAgc3dpdGNoIChPVVRQVVRfRkxBVk9SKQotICAgIHsKLSAgICBjYXNlIGJmZF90YXJnZXRfYW91dF9mbGF2b3VyOgotICAgICAgcmV0dXJuIHRhcmdldF9iaWdfZW5kaWFuID8gImEub3V0LW1pcHMtYmlnIiA6ICJhLm91dC1taXBzLWxpdHRsZSI7Ci0gICAgY2FzZSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXI6Ci0gICAgICByZXR1cm4gdGFyZ2V0X2JpZ19lbmRpYW4gPyAiZWNvZmYtYmlnbWlwcyIgOiBFQ09GRl9MSVRUTEVfRk9STUFUOwotICAgIGNhc2UgYmZkX3RhcmdldF9lbGZfZmxhdm91cjoKLSAgICAgIHJldHVybiAodGFyZ2V0X2JpZ19lbmRpYW4KLQkgICAgICA/IChtaXBzXzY0ID8gImVsZjY0LWJpZ21pcHMiIDogImVsZjMyLWJpZ21pcHMiKQotCSAgICAgIDogKG1pcHNfNjQgPyAiZWxmNjQtbGl0dGxlbWlwcyIgOiAiZWxmMzItbGl0dGxlbWlwcyIpKTsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLS8qIFRoZSBuYW1lIG9mIHRoZSByZWFkb25seSBkYXRhIHNlY3Rpb24uICAqLwotI2RlZmluZSBSREFUQV9TRUNUSU9OX05BTUUgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIgXAotCQkJICAgID8gIi5kYXRhIiBcCi0JCQkgICAgOiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91ciBcCi0JCQkgICAgPyAiLnJkYXRhIiBcCi0JCQkgICAgOiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIgXAotCQkJICAgID8gIi5yb2RhdGEiIFwKLQkJCSAgICA6IChhYm9ydCAoKSwgIiIpKQotCi0vKiBUaGlzIGlzIHRoZSBzZXQgb2Ygb3B0aW9ucyB3aGljaCBtYXkgYmUgbW9kaWZpZWQgYnkgdGhlIC5zZXQKLSAgIHBzZXVkby1vcC4gIFdlIHVzZSBhIHN0cnVjdCBzbyB0aGF0IC5zZXQgcHVzaCBhbmQgLnNldCBwb3AgYXJlIG1vcmUKLSAgIHJlbGlhYmxlLiAgKi8KLQotc3RydWN0IG1pcHNfc2V0X29wdGlvbnMKLXsKLSAgLyogTUlQUyBJU0EgKEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUpIGxldmVsLiAgVGhpcyBpcyBzZXQgdG8gLTEKLSAgICAgaWYgaXQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiAgQ2hhbmdlZCBieSBgLnNldCBtaXBzTicsIGFuZCB0aGUKLSAgICAgLW1pcHNOIGNvbW1hbmQgbGluZSBvcHRpb24sIGFuZCB0aGUgZGVmYXVsdCBDUFUuICAqLwotICBpbnQgaXNhOwotICAvKiBXaGV0aGVyIHdlIGFyZSBhc3NlbWJsaW5nIGZvciB0aGUgbWlwczE2IHByb2Nlc3Nvci4gIDAgaWYgd2UgYXJlCi0gICAgIG5vdCwgMSBpZiB3ZSBhcmUsIGFuZCAtMSBpZiB0aGUgdmFsdWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLgotICAgICBDaGFuZ2VkIGJ5IGAuc2V0IG1pcHMxNicgYW5kIGAuc2V0IG5vbWlwczE2JywgYW5kIHRoZSAtbWlwczE2IGFuZAotICAgICAtbm9taXBzMTYgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFuZCB0aGUgZGVmYXVsdCBDUFUuICAqLwotICBpbnQgbWlwczE2OwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgbm90IHJlb3JkZXIgaW5zdHJ1Y3Rpb25zLiAgQ2hhbmdlZCBieSBgLnNldAotICAgICByZW9yZGVyJyBhbmQgYC5zZXQgbm9yZW9yZGVyJy4gICovCi0gIGludCBub3Jlb3JkZXI7Ci0gIC8qIE5vbi16ZXJvIGlmIHdlIHNob3VsZCBub3QgcGVybWl0IHRoZSAkYXQgKCQxKSByZWdpc3RlciB0byBiZSB1c2VkCi0gICAgIGluIGluc3RydWN0aW9ucy4gIENoYW5nZWQgYnkgYC5zZXQgYXQnIGFuZCBgLnNldCBub2F0Jy4gICovCi0gIGludCBub2F0OwotICAvKiBOb24temVybyBpZiB3ZSBzaG91bGQgd2FybiB3aGVuIGEgbWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kcyBpbnRvCi0gICAgIG1vcmUgdGhhbiBvbmUgbWFjaGluZSBpbnN0cnVjdGlvbi4gIENoYW5nZWQgYnkgYC5zZXQgbm9tYWNybycgYW5kCi0gICAgIGAuc2V0IG1hY3JvJy4gICovCi0gIGludCB3YXJuX2Fib3V0X21hY3JvczsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBtb3ZlIGluc3RydWN0aW9ucy4gIENoYW5nZWQgYnkgYC5zZXQKLSAgICAgbW92ZScsIGAuc2V0IHZvbGF0aWxlJywgYC5zZXQgbm9tb3ZlJywgYW5kIGAuc2V0IG5vdm9sYXRpbGUnLiAgKi8KLSAgaW50IG5vbW92ZTsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBvcHRpbWl6ZSBicmFuY2hlcyBieSBtb3ZpbmcgdGhlIHRhcmdldAotICAgICBvZiB0aGUgYnJhbmNoIGludG8gdGhlIGRlbGF5IHNsb3QuICBBY3R1YWxseSwgd2UgZG9uJ3QgcGVyZm9ybQotICAgICB0aGlzIG9wdGltaXphdGlvbiBhbnlob3cuICBDaGFuZ2VkIGJ5IGAuc2V0IGJvcHQnIGFuZCBgLnNldAotICAgICBub2JvcHQnLiAgKi8KLSAgaW50IG5vYm9wdDsKLSAgLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIG5vdCBhdXRvZXh0ZW5kIG1pcHMxNiBpbnN0cnVjdGlvbnMuCi0gICAgIENoYW5nZWQgYnkgYC5zZXQgYXV0b2V4dGVuZCcgYW5kIGAuc2V0IG5vYXV0b2V4dGVuZCcuICAqLwotICBpbnQgbm9hdXRvZXh0ZW5kOwotfTsKLQotLyogVGhpcyBpcyB0aGUgc3RydWN0IHdlIHVzZSB0byBob2xkIHRoZSBjdXJyZW50IHNldCBvZiBvcHRpb25zLiAgTm90ZQotICAgdGhhdCB3ZSBtdXN0IHNldCB0aGUgaXNhIGFuZCBtaXBzMTYgZmllbGRzIHRvIC0xIHRvIGluZGljYXRlIHRoYXQKLSAgIHRoZXkgaGF2ZSBub3QgYmVlbiBpbml0aWFsaXplZC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19zZXRfb3B0aW9ucyBtaXBzX29wdHMgPSB7IC0xLCAtMSB9OwotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSBtYXNrcyBvZiByZWdpc3RlcnMgdXNlZC4KLSAgIFRoZSBvYmplY3QgZm9ybWF0IGNvZGUgcmVhZHMgdGhlbSBhbmQgcHV0cyB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZQotICAgcGxhY2UuICAqLwotdW5zaWduZWQgbG9uZyBtaXBzX2dwcm1hc2s7Ci11bnNpZ25lZCBsb25nIG1pcHNfY3BybWFza1s0XTsKLQotLyogTUlQUyBJU0Egd2UgYXJlIHVzaW5nIGZvciB0aGlzIG91dHB1dCBmaWxlLiAgKi8KLXN0YXRpYyBpbnQgZmlsZV9taXBzX2lzYTsKLQotLyogVGhlIENQVSB0eXBlIGFzIGEgbnVtYmVyOiAyMDAwLCAzMDAwLCA0MDAwLCA0NDAwLCBldGMuICAqLwotc3RhdGljIGludCBtaXBzX2NwdSA9IC0xOwotCi0vKiBUaGUgYXJndW1lbnQgb2YgdGhlIC1tYWJpPSBmbGFnLiAqLwotc3RhdGljIGNoYXIqIG1pcHNfYWJpX3N0cmluZyA9IDA7Ci0KLS8qIFdldGhlciB3ZSBzaG91bGQgbWFyayB0aGUgZmlsZSBFQUJJNjQgb3IgRUFCSTMyLiAqLwotc3RhdGljIGludCBtaXBzX2VhYmk2NCA9IDA7Ci0KLS8qIElmIHRoZXkgYXNrZWQgZm9yIG1pcHMxIG9yIG1pcHMyIGFuZCBhIGNwdSB0aGF0IGlzCi0gICBtaXBzMyBvciBncmVhdGVyLCB0aGVuIG1hcmsgdGhlIG9iamVjdCBmaWxlIDMyQklUTU9ERS4gKi8KLXN0YXRpYyBpbnQgbWlwc18zMmJpdG1vZGUgPSAwOwotCi0vKiBXaGV0aGVyIHRoZSBwcm9jZXNzb3IgdXNlcyBoYXJkd2FyZSBpbnRlcmxvY2tzIHRvIHByb3RlY3QgCi0gICByZWFkcyBmcm9tIHRoZSBISSBhbmQgTE8gcmVnaXN0ZXJzLCBhbmQgdGh1cyBkb2VzIG5vdAotICAgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkLgotCi0gICBGSVhNRTogR0NDIG1ha2VzIGEgZGlzdGluY3Rpb24gYmV0d2VlbiAtbWNwdT1GT08gYW5kIC1tRk9POgotICAgLW1jcHU9Rk9PIHNjaGVkdWxlcyBmb3IgRk9PLCBidXQgc3RpbGwgcHJvZHVjZXMgY29kZSB0aGF0IG1lZXRzIHRoZQotICAgcmVxdWlyZW1lbnRzIG9mIE1JUFMgSVNBIEkuICBGb3IgZXhhbXBsZSwgaXQgd29uJ3QgZ2VuZXJhdGUgYW55Ci0gICBGT08tc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLCBhbmQgaXQgd2lsbCBzdGlsbCBhc3N1bWUgdGhhdCBhbnkKLSAgIHNjaGVkdWxpbmcgaGF6YXJkcyBkZXNjcmliZWQgaW4gTUlQUyBJU0EgSSBhcmUgdGhlcmUsIGV2ZW4gaWYgRk9PCi0gICBoYXMgaW50ZXJsb2Nrcy4gIC1tRk9PIGdpdmVzIEdDQyBwZXJtaXNzaW9uIHRvIGdlbmVyYXRlIGNvZGUgdGhhdAotICAgd2lsbCBvbmx5IHJ1biBvbiBhIEZPTzsgaXQgd2lsbCBnZW5lcmF0ZSBGT08tc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLAotICAgYW5kIGFzc3VtZSBpbnRlcmxvY2tzIHByb3ZpZGVkIGJ5IGEgRk9PLgotCi0gICBIb3dldmVyLCBHQVMgY3VycmVudGx5IGRvZXNuJ3QgbWFrZSB0aGlzIGRpc3RpbmN0aW9uOyBiZWZvcmUgSmFuIDI4Ci0gICAxOTk5LCBHQVMncyAtbWNwdT1GT08gaW1wbGllZCAtbUZPTywgd2hpY2ggdmlvbGF0ZXMgR0NDJ3MKLSAgIGFzc3VtcHRpb25zLiAgVGhlIEdDQyBkcml2ZXIgcGFzc2VzIHRoZXNlIGZsYWdzIHRocm91Z2ggdG8gR0FTLCBzbwotICAgaWYgR0FTIGFjdHVhbGx5IGRvZXMgYW55dGhpbmcgdGhhdCBkb2Vzbid0IG1lZXQgTUlQUyBJU0EgSSB3aXRoCi0gICAtbUZPTywgdGhlbiBHQ0MncyAtbWNwdT1GT08gZmxhZyBpc24ndCBnb2luZyB0byB3b3JrLgotCi0gICBBbmQgZnVydGhlcm1vcmUsIGl0IGRpZCBub3QgYXNzdW1lIHRoYXQgLW1GT08gaW1wbGllZCAtbWNwdT1GT08sCi0gICB3aGljaCBzZWVtcyBzZW5zZWxlc3MgLS0tIHdoeSBnZW5lcmF0ZSBjb2RlIHdoaWNoIHdpbGwgb25seSBydW4gb24KLSAgIGEgRk9PLCBidXQgc2NoZWR1bGUgZm9yIHNvbWV0aGluZyBlbHNlPwotCi0gICBTbyBub3csIGF0IGxlYXN0LCAtbWNwdT1GT08gYW5kIC1tRk9PIGFyZSBleGFjdGx5IGVxdWl2YWxlbnQuCi0KLSAgIC0tIEppbSBCbGFuZHkgPGppbWJAY3lnbnVzLmNvbT4gKi8KLQotI2RlZmluZSBoaWxvX2ludGVybG9ja3MgKG1pcHNfY3B1ID09IDQwMTAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgKQotCi0vKiBXaGV0aGVyIHRoZSBwcm9jZXNzb3IgdXNlcyBoYXJkd2FyZSBpbnRlcmxvY2tzIHRvIHByb3RlY3QgcmVhZHMKLSAgIGZyb20gdGhlIEdQUnMsIGFuZCB0aHVzIGRvZXMgbm90IHJlcXVpcmUgbm9wcyB0byBiZSBpbnNlcnRlZC4gICovCi0jZGVmaW5lIGdwcl9pbnRlcmxvY2tzIFwKLSAgKG1pcHNfb3B0cy5pc2EgPj0gMiAgXAotICAgfHwgbWlwc19jcHUgPT0gMzkwMCkKLQotLyogQXMgd2l0aCBvdGhlciAiaW50ZXJsb2NrcyIgdGhpcyBpcyB1c2VkIGJ5IGhhcmR3YXJlIHRoYXQgaGFzIEZQCi0gICAoY28tcHJvY2Vzc29yKSBpbnRlcmxvY2tzLiAgKi8KLS8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSNkZWZpbmUgY29wX2ludGVybG9ja3MgKG1pcHNfY3B1ID09IDQzMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJKQotCi0vKiBNSVBTIFBJQyBsZXZlbC4gICovCi0KLWVudW0gbWlwc19waWNfbGV2ZWwKLXsKLSAgLyogRG8gbm90IGdlbmVyYXRlIFBJQyBjb2RlLiAgKi8KLSAgTk9fUElDLAotCi0gIC8qIEdlbmVyYXRlIFBJQyBjb2RlIGFzIGluIElyaXggNC4gIFRoaXMgaXMgbm90IGltcGxlbWVudGVkLCBhbmQgSSdtCi0gICAgIG5vdCBzdXJlIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uICAqLwotICBJUklYNF9QSUMsCi0KLSAgLyogR2VuZXJhdGUgUElDIGNvZGUgYXMgaW4gdGhlIFNWUjQgTUlQUyBBQkkuICAqLwotICBTVlI0X1BJQywKLQotICAvKiBHZW5lcmF0ZSBQSUMgY29kZSB3aXRob3V0IHVzaW5nIGEgZ2xvYmFsIG9mZnNldCB0YWJsZTogdGhlIGRhdGEKLSAgICAgc2VnbWVudCBoYXMgYSBtYXhpbXVtIHNpemUgb2YgNjRLLCBhbGwgZGF0YSByZWZlcmVuY2VzIGFyZSBvZmYKLSAgICAgdGhlICRncCByZWdpc3RlciwgYW5kIGFsbCB0ZXh0IHJlZmVyZW5jZXMgYXJlIFBDIHJlbGF0aXZlLiAgVGhpcwotICAgICBpcyB1c2VkIG9uIHNvbWUgZW1iZWRkZWQgc3lzdGVtcy4gICovCi0gIEVNQkVEREVEX1BJQwotfTsKLQotc3RhdGljIGVudW0gbWlwc19waWNfbGV2ZWwgbWlwc19waWM7Ci0KLS8qIDEgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIDMyIGJpdCBvZmZzZXRzIGZyb20gdGhlIEdQIHJlZ2lzdGVyIGluCi0gICBTVlI0X1BJQyBtb2RlLiAgQ3VycmVudGx5IGhhcyBubyBtZWFuaW5nIGluIG90aGVyIG1vZGVzLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19iaWdfZ290OwotCi0vKiAxIGlmIHRyYXAgaW5zdHJ1Y3Rpb25zIHNob3VsZCB1c2VkIGZvciBvdmVyZmxvdyByYXRoZXIgdGhhbiBicmVhawotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLXN0YXRpYyBpbnQgbWlwc190cmFwOwotCi0vKiBOb24temVybyBpZiBhbnkgLnNldCBub3Jlb3JkZXIgZGlyZWN0aXZlcyB3ZXJlIHVzZWQuICAqLwotCi1zdGF0aWMgaW50IG1pcHNfYW55X25vcmVvcmRlcjsKLQotLyogVGhlIHNpemUgb2YgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbi4gICovCi1zdGF0aWMgaW50IGdfc3dpdGNoX3ZhbHVlID0gODsKLS8qIFdoZXRoZXIgdGhlIC1HIG9wdGlvbiB3YXMgdXNlZC4gICovCi1zdGF0aWMgaW50IGdfc3dpdGNoX3NlZW4gPSAwOwotCi0jZGVmaW5lIE5fUk1BU0sgMHhjNAotI2RlZmluZSBOX1ZGUCAgIDB4ZDQKLQotLyogSWYgd2UgY2FuIGRldGVybWluZSBpbiBhZHZhbmNlIHRoYXQgR1Agb3B0aW1pemF0aW9uIHdvbid0IGJlCi0gICBwb3NzaWJsZSwgd2UgY2FuIHNraXAgdGhlIHJlbGF4YXRpb24gc3R1ZmYgdGhhdCB0cmllcyB0byBwcm9kdWNlCi0gICBHUC1yZWxhdGl2ZSByZWZlcmVuY2VzLiAgVGhpcyBtYWtlcyBkZWxheSBzbG90IG9wdGltaXphdGlvbiB3b3JrCi0gICBiZXR0ZXIuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgcHJvdmlkZSBhIGd1ZXNzLCBidXQgaXQgc2VlbXMgdG8gd29yayBmb3IKLSAgIGdjYyBvdXRwdXQuICBJZiBpdCBndWVzc2VzIHdyb25nLCB0aGUgb25seSBsb3NzIHNob3VsZCBiZSBpbgotICAgZWZmaWNpZW5jeTsgaXQgc2hvdWxkbid0IGludHJvZHVjZSBhbnkgYnVncy4KLQotICAgSSBkb24ndCBrbm93IGlmIGEgZml4IGlzIG5lZWRlZCBmb3IgdGhlIFNWUjRfUElDIG1vZGUuICBJJ3ZlIG9ubHkKLSAgIGZpeGVkIGl0IGZvciB0aGUgbm9uLVBJQyBtb2RlLiAgS1IgOTUvMDQvMDcgICovCi1zdGF0aWMgaW50IG5vcGljX25lZWRfcmVsYXggUEFSQU1TICgoc3ltYm9sUyAqLCBpbnQpKTsKLQotLyogaGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wX2hhc2ggPSBOVUxMOwotCi0vKiBUaGUgb3Bjb2RlIGhhc2ggdGFibGUgd2UgdXNlIGZvciB0aGUgbWlwczE2LiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptaXBzMTZfb3BfaGFzaCA9IE5VTEw7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gIElmIHRoZQotICAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bCAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgdGhlIGNoYXJzIHRoYXQgb25seSBzdGFydCBhIGNvbW1lbnQgYXQgdGhlIGJlZ2lubmluZyBvZgotICAgYSBsaW5lLiAgSWYgdGhlIGxpbmUgc2VlbXMgdG8gaGF2ZSB0aGUgZm9ybSAnIyAxMjMgZmlsZW5hbWUnCi0gICAubGluZSBhbmQgLmZpbGUgZGlyZWN0aXZlcyB3aWxsIGFwcGVhciBpbiB0aGUgcHJlLXByb2Nlc3NlZCBvdXRwdXQgKi8KLS8qIE5vdGUgdGhhdCBpbnB1dF9maWxlLmMgaGFuZCBjaGVja3MgZm9yICcjJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQotICAgZmlyc3QgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgY29tcGlsZXIgb3V0cHV0cwotICAgI05PX0FQUCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cyBvdXRwdXQuICovCi0vKiBBbHNvIG5vdGUgdGhhdCBDIHN0eWxlIGNvbW1lbnRzIGFyZSBhbHdheXMgc3VwcG9ydGVkLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIFRoaXMgYXJyYXkgaG9sZHMgbWFjaGluZSBzcGVjaWZpYyBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXJzLiAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuCi0gKi8KLQotc3RhdGljIGNoYXIgKmluc25fZXJyb3I7Ci0KLXN0YXRpYyBpbnQgYXV0b19hbGlnbiA9IDE7Ci0KLS8qIFdoZW4gb3V0cHV0dGluZyBTVlI0IFBJQyBjb2RlLCB0aGUgYXNzZW1ibGVyIG5lZWRzIHRvIGtub3cgdGhlCi0gICBvZmZzZXQgaW4gdGhlIHN0YWNrIGZyYW1lIGZyb20gd2hpY2ggdG8gcmVzdG9yZSB0aGUgJGdwIHJlZ2lzdGVyLgotICAgVGhpcyBpcyBzZXQgYnkgdGhlIC5jcHJlc3RvcmUgcHNldWRvLW9wLCBhbmQgc2F2ZWQgaW4gdGhpcwotICAgdmFyaWFibGUuICAqLwotc3RhdGljIG9mZnNldFQgbWlwc19jcHJlc3RvcmVfb2Zmc2V0ID0gLTE7Ci0KLS8qIFRoaXMgaXMgdGhlIHJlZ2lzdGVyIHdoaWNoIGhvbGRzIHRoZSBzdGFjayBmcmFtZSwgYXMgc2V0IGJ5IHRoZQotICAgLmZyYW1lIHBzZXVkby1vcC4gIFRoaXMgaXMgbmVlZGVkIHRvIGltcGxlbWVudCAuY3ByZXN0b3JlLiAgKi8KLXN0YXRpYyBpbnQgbWlwc19mcmFtZV9yZWcgPSBTUDsKLQotLyogVG8gb3V0cHV0IE5PUCBpbnN0cnVjdGlvbnMgY29ycmVjdGx5LCB3ZSBuZWVkIHRvIGtlZXAgaW5mb3JtYXRpb24KLSAgIGFib3V0IHRoZSBwcmV2aW91cyB0d28gaW5zdHJ1Y3Rpb25zLiAgKi8KLQotLyogV2hldGhlciB3ZSBhcmUgb3B0aW1pemluZy4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDIgbWVhbnMgdG8gcmVtb3ZlCi0gICB1bm5lZWRlZCBOT1BzIGFuZCBzd2FwIGJyYW5jaCBpbnN0cnVjdGlvbnMgd2hlbiBwb3NzaWJsZS4gIEEgdmFsdWUKLSAgIG9mIDEgbWVhbnMgdG8gbm90IHN3YXAgYnJhbmNoZXMuICBBIHZhbHVlIG9mIDAgbWVhbnMgdG8gYWx3YXlzCi0gICBpbnNlcnQgTk9Qcy4gICovCi1zdGF0aWMgaW50IG1pcHNfb3B0aW1pemUgPSAyOwotCi0vKiBEZWJ1Z2dpbmcgbGV2ZWwuICAtZyBzZXRzIHRoaXMgdG8gMi4gIC1nTiBzZXRzIHRoaXMgdG8gTi4gIC1nMCBpcwotICAgZXF1aXZhbGVudCB0byBzZWVpbmcgbm8gLWcgb3B0aW9uIGF0IGFsbC4gICovCi1zdGF0aWMgaW50IG1pcHNfZGVidWcgPSAwOwotCi0vKiBUaGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHN0cnVjdCBtaXBzX2NsX2luc24gcHJldl9pbnNuOwotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gYmVmb3JlIHByZXZfaW5zbi4gICovCi1zdGF0aWMgc3RydWN0IG1pcHNfY2xfaW5zbiBwcmV2X3ByZXZfaW5zbjsKLQotLyogSWYgd2UgZG9uJ3Qgd2FudCBpbmZvcm1hdGlvbiBmb3IgcHJldl9pbnNuIG9yIHByZXZfcHJldl9pbnNuLCB3ZQotICAgcG9pbnQgdGhlIGluc25fbW8gZmllbGQgYXQgdGhpcyBkdW1teSBpbnRlZ2VyLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgZHVtbXlfb3Bjb2RlID0geyAwIH07Ci0KLS8qIE5vbi16ZXJvIGlmIHByZXZfaW5zbiBpcyB2YWxpZC4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl92YWxpZDsKLQotLyogVGhlIGZyYWcgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgc3RydWN0IGZyYWcgKnByZXZfaW5zbl9mcmFnOwotCi0vKiBUaGUgb2Zmc2V0IGludG8gcHJldl9pbnNuX2ZyYWcgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgbG9uZyBwcmV2X2luc25fd2hlcmU7Ci0KLS8qIFRoZSByZWxvYyB0eXBlIGZvciB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24sIGlmIGFueS4gICovCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHByZXZfaW5zbl9yZWxvY190eXBlOwotCi0vKiBUaGUgcmVsb2MgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgaWYgYW55LiAgKi8KLXN0YXRpYyBmaXhTICpwcmV2X2luc25fZml4cDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIGRlbGF5IHNsb3QuICAqLwotc3RhdGljIGludCBwcmV2X2luc25faXNfZGVsYXlfc2xvdDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIC5zZXQgbm9yZW9yZGVyLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9pbnNuX3VucmVvcmRlcmVkOwotCi0vKiBOb24temVybyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gdXNlcyBhbiBleHRlbmQgb3Bjb2RlIChpZgotICAgbWlwczE2KS4gICovCi1zdGF0aWMgaW50IHByZXZfaW5zbl9leHRlbmRlZDsKLQotLyogTm9uLXplcm8gaWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIC5zZXQKLSAgIG5vcmVvcmRlci4gICovCi1zdGF0aWMgaW50IHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkOwotCi0vKiBJZiB0aGlzIGlzIHNldCwgaXQgcG9pbnRzIHRvIGEgZnJhZyBob2xkaW5nIG5vcCBpbnN0cnVjdGlvbnMgd2hpY2gKLSAgIHdlcmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBzdGFydCBvZiBhIG5vcmVvcmRlciBzZWN0aW9uLiAgSWYgdGhvc2UKLSAgIG5vcHMgdHVybiBvdXQgdG8gYmUgdW5uZWNlc3NhcnksIHRoZSBzaXplIG9mIHRoZSBmcmFnIGNhbiBiZQotICAgZGVjcmVhc2VkLiAgKi8KLXN0YXRpYyBmcmFnUyAqcHJldl9ub3BfZnJhZzsKLQotLyogVGhlIG51bWJlciBvZiBub3AgaW5zdHJ1Y3Rpb25zIHdlIGNyZWF0ZWQgaW4gcHJldl9ub3BfZnJhZy4gICovCi1zdGF0aWMgaW50IHByZXZfbm9wX2ZyYWdfaG9sZHM7Ci0KLS8qIFRoZSBudW1iZXIgb2Ygbm9wIGluc3RydWN0aW9ucyB0aGF0IHdlIGtub3cgd2UgbmVlZCBpbgotICAgcHJldl9ub3BfZnJhZy4gKi8KLXN0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19yZXF1aXJlZDsKLQotLyogVGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgd2UndmUgc2VlbiBzaW5jZSBwcmV2X25vcF9mcmFnLiAgKi8KLXN0YXRpYyBpbnQgcHJldl9ub3BfZnJhZ19zaW5jZTsKLQotLyogRm9yIEVDT0ZGIGFuZCBFTEYsIHJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBhcmUgZG9uZSBpbiB0d28KLSAgIHBhcnRzLCB3aXRoIGEgSEkgcmVsb2NhdGlvbiBhbmQgYSBMTyByZWxvY2F0aW9uLiAgRWFjaCByZWxvY2F0aW9uCi0gICBoYXMgb25seSAxNiBiaXRzIG9mIHNwYWNlIHRvIHN0b3JlIGFuIGFkZGVuZC4gIFRoaXMgbWVhbnMgdGhhdCBpbgotICAgb3JkZXIgZm9yIHRoZSBsaW5rZXIgdG8gaGFuZGxlIGNhcnJpZXMgY29ycmVjdGx5LCBpdCBtdXN0IGJlIGFibGUKLSAgIHRvIGxvY2F0ZSBib3RoIHRoZSBISSBhbmQgdGhlIExPIHJlbG9jYXRpb24uICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICByZWxvY2F0aW9ucyBtdXN0IGFwcGVhciBpbiBvcmRlciBpbiB0aGUgcmVsb2NhdGlvbiB0YWJsZS4KLQotICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoaXMsIHdlIGtlZXAgdHJhY2sgb2YgZWFjaCB1bm1hdGNoZWQgSEkKLSAgIHJlbG9jYXRpb24uICBXZSB0aGVuIHNvcnQgdGhlbSBzbyB0aGF0IHRoZXkgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgTE8gcmVsb2NhdGlvbi4gKi8KLQotc3RydWN0IG1pcHNfaGlfZml4dXAKLXsKLSAgLyogTmV4dCBISSBmaXh1cC4gICovCi0gIHN0cnVjdCBtaXBzX2hpX2ZpeHVwICpuZXh0OwotICAvKiBUaGlzIGZpeHVwLiAgKi8KLSAgZml4UyAqZml4cDsKLSAgLyogVGhlIHNlY3Rpb24gdGhpcyBmaXh1cCBpcyBpbi4gICovCi0gIHNlZ1Qgc2VnOwotfTsKLQotLyogVGhlIGxpc3Qgb2YgdW5tYXRjaGVkIEhJIHJlbG9jcy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbWlwc19oaV9maXh1cCAqbWlwc19oaV9maXh1cF9saXN0OwotCi0vKiBNYXAgbm9ybWFsIE1JUFMgcmVnaXN0ZXIgbnVtYmVycyB0byBtaXBzMTYgcmVnaXN0ZXIgbnVtYmVycy4gICovCi0KLSNkZWZpbmUgWCBJTExFR0FMX1JFRwotc3RhdGljIGNvbnN0IGludCBtaXBzMzJfdG9fMTZfcmVnX21hcFtdID0KLXsKLSAgWCwgWCwgMiwgMywgNCwgNSwgNiwgNywKLSAgWCwgWCwgWCwgWCwgWCwgWCwgWCwgWCwKLSAgMCwgMSwgWCwgWCwgWCwgWCwgWCwgWCwKLSAgWCwgWCwgWCwgWCwgWCwgWCwgWCwgWAotfTsKLSN1bmRlZiBYCi0KLS8qIE1hcCBtaXBzMTYgcmVnaXN0ZXIgbnVtYmVycyB0byBub3JtYWwgTUlQUyByZWdpc3RlciBudW1iZXJzLiAgKi8KLQotc3RhdGljIGNvbnN0IGludCBtaXBzMTZfdG9fMzJfcmVnX21hcFtdID0KLXsKLSAgMTYsIDE3LCAyLCAzLCA0LCA1LCA2LCA3Ci19OwotDAotLyogU2luY2UgdGhlIE1JUFMgZG9lcyBub3QgaGF2ZSBtdWx0aXBsZSBmb3JtcyBvZiBQQyByZWxhdGl2ZQotICAgaW5zdHJ1Y3Rpb25zLCB3ZSBkbyBub3QgaGF2ZSB0byBkbyByZWxheGluZyBhcyBpcyBkb25lIG9uIG90aGVyCi0gICBwbGF0Zm9ybXMuICBIb3dldmVyLCB3ZSBkbyBoYXZlIHRvIGhhbmRsZSBHUCByZWxhdGl2ZSBhZGRyZXNzaW5nCi0gICBjb3JyZWN0bHksIHdoaWNoIHR1cm5zIG91dCB0byBiZSBhIHNpbWlsYXIgcHJvYmxlbS4KLQotICAgRXZlcnkgbWFjcm8gdGhhdCByZWZlcnMgdG8gYSBzeW1ib2wgY2FuIG9jY3VyIGluIChhdCBsZWFzdCkgdHdvCi0gICBmb3Jtcywgb25lIHdpdGggR1AgcmVsYXRpdmUgYWRkcmVzc2luZyBhbmQgb25lIHdpdGhvdXQuICBGb3IKLSAgIGV4YW1wbGUsIGxvYWRpbmcgYSBnbG9iYWwgdmFyaWFibGUgaW50byBhIHJlZ2lzdGVyIGdlbmVyYWxseSB1c2VzCi0gICBhIG1hY3JvIGluc3RydWN0aW9uIGxpa2UgdGhpczoKLSAgICAgbHcgJDQsaQotICAgSWYgaSBjYW4gYmUgYWRkcmVzc2VkIG9mZiB0aGUgR1AgcmVnaXN0ZXIgKHRoaXMgaXMgdHJ1ZSBpZiBpdCBpcyBpbgotICAgdGhlIC5zYnNzIG9yIC5zZGF0YSBzZWN0aW9uLCBvciBpZiBpdCBpcyBrbm93biB0byBiZSBzbWFsbGVyIHRoYW4KLSAgIHRoZSAtRyBhcmd1bWVudCkgdGhpcyB3aWxsIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb246Ci0gICAgIGx3ICQ0LGkoJGdwKQotICAgVGhpcyBpbnN0cnVjdGlvbiB3aWxsIHVzZSBhIEdQUkVMIHJlbG9jLiAgSWYgaSBjYW4gbm90IGJlIGFkZHJlc3NlZAotICAgb2ZmIHRoZSBHUCByZWdpc3RlciwgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbiBzZXF1ZW5jZSB3aWxsIGJlIHVzZWQ6Ci0gICAgIGx1aSAkYXQsaQotICAgICBsdyAkNCxpKCRhdCkKLSAgIEluIHRoaXMgY2FzZSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gd2lsbCBoYXZlIGEgSEkxNiByZWxvYywgYW5kIHRoZQotICAgc2Vjb25kIHJlbG9jIHdpbGwgaGF2ZSBhIExPMTYgcmVsb2MuICBCb3RoIHJlbG9jcyB3aWxsIGJlIGFnYWluc3QKLSAgIHRoZSBzeW1ib2wgaS4KLQotICAgVGhlIGlzc3VlIGhlcmUgaXMgdGhhdCB3ZSBtYXkgbm90IGtub3cgd2hldGhlciBpIGlzIEdQIGFkZHJlc3NhYmxlCi0gICB1bnRpbCBhZnRlciB3ZSBzZWUgdGhlIGluc3RydWN0aW9uIHRoYXQgdXNlcyBpdC4gIFRoZXJlZm9yZSwgd2UKLSAgIHdhbnQgdG8gYmUgYWJsZSB0byBjaG9vc2UgdGhlIGZpbmFsIGluc3RydWN0aW9uIHNlcXVlbmNlIG9ubHkgYXQKLSAgIHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSB3YXkgb3RoZXIKLSAgIHBsYXRmb3JtcyBjaG9vc2UgdGhlIHNpemUgb2YgYSBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiBvbmx5IGF0IHRoZQotICAgZW5kIG9mIGFzc2VtYmx5LgotCi0gICBXaGVuIGdlbmVyYXRpbmcgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSB3ZSBkbyBub3QgdXNlIEdQCi0gICBhZGRyZXNzaW5nIGluIHF1aXRlIHRoZSBzYW1lIHdheSwgYnV0IHRoZSBpc3N1ZSBzdGlsbCBhcmlzZXMgYXMKLSAgIGV4dGVybmFsIHN5bWJvbHMgYW5kIGxvY2FsIHN5bWJvbHMgbXVzdCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LgotCi0gICBXZSBoYW5kbGUgdGhlc2UgaXNzdWVzIGJ5IGFjdHVhbGx5IGdlbmVyYXRpbmcgYm90aCBwb3NzaWJsZQotICAgaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzLiAgVGhlIGxvbmdlciBvbmUgaXMgcHV0IGluIGEgZnJhZ192YXIgd2l0aAotICAgdHlwZSByc19tYWNoaW5lX2RlcGVuZGVudC4gIFdlIGVuY29kZSB3aGF0IHRvIGRvIHdpdGggdGhlIGZyYWcgaW4KLSAgIHRoZSBzdWJ0eXBlIGZpZWxkLiAgV2UgZW5jb2RlICgxKSB0aGUgbnVtYmVyIG9mIGV4aXN0aW5nIGJ5dGVzIHRvCi0gICByZXBsYWNlLCAoMikgdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgdG8gdXNlLCAoMykgdGhlIG9mZnNldCBmcm9tCi0gICB0aGUgc3RhcnQgb2YgdGhlIGV4aXN0aW5nIGJ5dGVzIHRvIHRoZSBmaXJzdCByZWxvYyB3ZSBtdXN0IGdlbmVyYXRlCi0gICAodGhhdCBpcywgdGhlIG9mZnNldCBpcyBhcHBsaWVkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZwotICAgYnl0ZXMgYWZ0ZXIgdGhleSBhcmUgcmVwbGFjZWQgYnkgdGhlIG5ldyBieXRlcywgaWYgYW55KSwgKDQpIHRoZQotICAgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBleGlzdGluZyBieXRlcyB0byB0aGUgc2Vjb25kIHJlbG9jLAotICAgKDUpIHdoZXRoZXIgYSB0aGlyZCByZWxvYyBpcyBuZWVkZWQgKHRoZSB0aGlyZCByZWxvYyBpcyBhbHdheXMgZm91cgotICAgYnl0ZXMgYWZ0ZXIgdGhlIHNlY29uZCByZWxvYyksIGFuZCAoNikgd2hldGhlciB0byB3YXJuIGlmIHRoaXMKLSAgIHZhcmlhbnQgaXMgdXNlZCAodGhpcyBpcyBzb21ldGltZXMgbmVlZGVkIGlmIC5zZXQgbm9tYWNybyBvciAuc2V0Ci0gICBub2F0IGlzIGluIGVmZmVjdCkuICBBbGwgdGhlc2UgbnVtYmVycyBhcmUgcmVhc29uYWJseSBzbWFsbC4KLQotICAgR2VuZXJhdGluZyB0d28gaW5zdHJ1Y3Rpb24gc2VxdWVuY2VzIG11c3QgYmUgaGFuZGxlZCBjYXJlZnVsbHkgdG8KLSAgIGVuc3VyZSB0aGF0IGRlbGF5IHNsb3RzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4gIEZvcnR1bmF0ZWx5LCB0aGVyZQotICAgYXJlIGEgbGltaXRlZCBudW1iZXIgb2YgY2FzZXMuICBXaGVuIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24KLSAgIHNlcXVlbmNlIGlzIGdlbmVyYXRlZCwgYXBwZW5kX2luc24gaXMgZGlyZWN0ZWQgdG8gbWFpbnRhaW4gdGhlCi0gICBleGlzdGluZyBkZWxheSBzbG90IGluZm9ybWF0aW9uLCBzbyBpdCBjb250aW51ZXMgdG8gYXBwbHkgdG8gYW55Ci0gICBjb2RlIGFmdGVyIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UuICBUaGlzIG1lYW5zIHRoYXQgdGhlCi0gICBzZWNvbmQgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgbXVzdCBub3QgaW1wb3NlIGFueSByZXF1aXJlbWVudHMgbm90Ci0gICByZXF1aXJlZCBieSB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UuCi0KLSAgIFRoZXNlIHZhcmlhbnQgZnJhZ3MgYXJlIHRoZW4gaGFuZGxlZCBpbiBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoZQotICAgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlLiAgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggcmV0dXJucwotICAgdGhlIGZpbmFsIHNpemUgb2YgdGhlIGZyYWcuICBtZF9jb252ZXJ0X2ZyYWcgc2V0cyB1cCB0aGUgZmluYWwgZm9ybQotICAgb2YgdGhlIGZyYWcuICB0Y19nZW5fcmVsb2MgYWRqdXN0IHRoZSBmaXJzdCByZWxvYyBhbmQgYWRkcyBhIHNlY29uZAotICAgb25lIGlmIG5lZWRlZC4gICovCi0jZGVmaW5lIFJFTEFYX0VOQ09ERShvbGQsIG5ldywgcmVsb2MxLCByZWxvYzIsIHJlbG9jMywgd2FybikgXAotICAoKHJlbGF4X3N1YnN0YXRlVCkgXAotICAgKCgob2xkKSA8PCAyMykgXAotICAgIHwgKChuZXcpIDw8IDE2KSBcCi0gICAgfCAoKChyZWxvYzEpICsgNjQpIDw8IDkpIFwKLSAgICB8ICgoKHJlbG9jMikgKyA2NCkgPDwgMikgXAotICAgIHwgKChyZWxvYzMpID8gKDEgPDwgMSkgOiAwKSBcCi0gICAgfCAoKHdhcm4pID8gMSA6IDApKSkKLSNkZWZpbmUgUkVMQVhfT0xEKGkpICgoKGkpID4+IDIzKSAmIDB4N2YpCi0jZGVmaW5lIFJFTEFYX05FVyhpKSAoKChpKSA+PiAxNikgJiAweDdmKQotI2RlZmluZSBSRUxBWF9SRUxPQzEoaSkgKChiZmRfdm1hKSgoKGkpID4+IDkpICYgMHg3ZikgLSA2NCkKLSNkZWZpbmUgUkVMQVhfUkVMT0MyKGkpICgoYmZkX3ZtYSkoKChpKSA+PiAyKSAmIDB4N2YpIC0gNjQpCi0jZGVmaW5lIFJFTEFYX1JFTE9DMyhpKSAoKChpKSA+PiAxKSAmIDEpCi0jZGVmaW5lIFJFTEFYX1dBUk4oaSkgKChpKSAmIDEpCi0KLS8qIEZvciBtaXBzMTYgY29kZSwgd2UgdXNlIGFuIGVudGlyZWx5IGRpZmZlcmVudCBmb3JtIG9mIHJlbGF4YXRpb24uCi0gICBtaXBzMTYgc3VwcG9ydHMgdHdvIHZlcnNpb25zIG9mIG1vc3QgaW5zdHJ1Y3Rpb25zIHdoaWNoIHRha2UKLSAgIGltbWVkaWF0ZSB2YWx1ZXM6IGEgc21hbGwgb25lIHdoaWNoIHRha2VzIHNvbWUgc21hbGwgdmFsdWUsIGFuZCBhCi0gICBsYXJnZXIgb25lIHdoaWNoIHRha2VzIGEgMTYgYml0IHZhbHVlLiAgU2luY2UgYnJhbmNoZXMgYWxzbyBmb2xsb3cKLSAgIHRoaXMgcGF0dGVybiwgcmVsYXhpbmcgdGhlc2UgdmFsdWVzIGlzIHJlcXVpcmVkLgotCi0gICBXZSBjYW4gYXNzZW1ibGUgYm90aCBtaXBzMTYgYW5kIG5vcm1hbCBNSVBTIGNvZGUgaW4gYSBzaW5nbGUKLSAgIG9iamVjdC4gIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBzdXBwb3J0IHRoaXMgdHlwZSBvZiByZWxheGF0aW9uIGF0Ci0gICB0aGUgc2FtZSB0aW1lIHRoYXQgd2Ugc3VwcG9ydCB0aGUgcmVsYXhhdGlvbiBkZXNjcmliZWQgYWJvdmUuICBXZQotICAgdXNlIHRoZSBoaWdoIGJpdCBvZiB0aGUgc3VidHlwZSBmaWVsZCB0byBkaXN0aW5ndWlzaCB0aGVzZSBjYXNlcy4KLQotICAgVGhlIGluZm9ybWF0aW9uIHdlIHN0b3JlIGZvciB0aGlzIHR5cGUgb2YgcmVsYXhhdGlvbiBpcyB0aGUKLSAgIGFyZ3VtZW50IGNvZGUgZm91bmQgaW4gdGhlIG9wY29kZSBmaWxlIGZvciB0aGlzIHJlbG9jYXRpb24sIHdoZXRoZXIKLSAgIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGEgc21hbGwgb3IgZXh0ZW5kZWQgZm9ybSwgYW5kIHdoZXRoZXIKLSAgIHRoZSByZWxvY2F0aW9uIGlzIGluIGEganVtcCBvciBqYWwgZGVsYXkgc2xvdC4gIFRoYXQgdGVsbHMgdXMgdGhlCi0gICBzaXplIG9mIHRoZSB2YWx1ZSwgYW5kIGhvdyBpdCBzaG91bGQgYmUgc3RvcmVkLiAgV2UgYWxzbyBzdG9yZQotICAgd2hldGhlciB0aGUgZnJhZ21lbnQgaXMgY29uc2lkZXJlZCB0byBiZSBleHRlbmRlZCBvciBub3QuICBXZSBhbHNvCi0gICBzdG9yZSB3aGV0aGVyIHRoaXMgaXMga25vd24gdG8gYmUgYSBicmFuY2ggdG8gYSBkaWZmZXJlbnQgc2VjdGlvbiwKLSAgIHdoZXRoZXIgd2UgaGF2ZSB0cmllZCB0byByZWxheCB0aGlzIGZyYWcgeWV0LCBhbmQgd2hldGhlciB3ZSBoYXZlCi0gICBldmVyIGV4dGVuZGVkIGEgUEMgcmVsYXRpdmUgZnJhZ21lbnQgYmVjYXVzZSBvZiBhIHNoaWZ0IGNvdW50LiAgKi8KLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0VOQ09ERSh0eXBlLCBzbWFsbCwgZXh0LCBkc2xvdCwgamFsX2RzbG90KQlcCi0gICgweDgwMDAwMDAwCQkJCQkJCVwKLSAgIHwgKCh0eXBlKSAmIDB4ZmYpCQkJCQkJXAotICAgfCAoKHNtYWxsKSA/IDB4MTAwIDogMCkJCQkJCVwKLSAgIHwgKChleHQpID8gMHgyMDAgOiAwKQkJCQkJXAotICAgfCAoKGRzbG90KSA/IDB4NDAwIDogMCkJCQkJCVwKLSAgIHwgKChqYWxfZHNsb3QpID8gMHg4MDAgOiAwKSkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1AoaSkgKCgoaSkgJiAweDgwMDAwMDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfVFlQRShpKSAoKGkpICYgMHhmZikKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1VTRVJfU01BTEwoaSkgKCgoaSkgJiAweDEwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X1VTRVJfRVhUKGkpICgoKGkpICYgMHgyMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9EU0xPVChpKSAoKChpKSAmIDB4NDAwKSAhPSAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfSkFMX0RTTE9UKGkpICgoKGkpICYgMHg4MDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9FWFRFTkRFRChpKSAoKChpKSAmIDB4MTAwMCkgIT0gMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X01BUktfRVhURU5ERUQoaSkgKChpKSB8IDB4MTAwMCkKLSNkZWZpbmUgUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEKGkpICgoaSkgJn4gMHgxMDAwKQotI2RlZmluZSBSRUxBWF9NSVBTMTZfTE9OR19CUkFOQ0goaSkgKCgoaSkgJiAweDIwMDApICE9IDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIKGkpICgoaSkgfCAweDIwMDApCi0jZGVmaW5lIFJFTEFYX01JUFMxNl9DTEVBUl9MT05HX0JSQU5DSChpKSAoKGkpICZ+IDB4MjAwMCkKLQwKLS8qIFByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSNkZWZpbmUgaW50ZXJuYWxFcnJvcigpIFwKLSAgICBhc19mYXRhbCAoXygiaW50ZXJuYWwgRXJyb3IsIGxpbmUgJWQsICVzIiksIF9fTElORV9fLCBfX0ZJTEVfXykKLSNlbHNlCi0jZGVmaW5lIGludGVybmFsRXJyb3IoKSBhc19mYXRhbCAoXygiTUlQUyBpbnRlcm5hbCBFcnJvciIpKTsKLSNlbmRpZgotCi1lbnVtIG1pcHNfcmVnY2xhc3MgeyBNSVBTX0dSX1JFRywgTUlQU19GUF9SRUcsIE1JUFMxNl9SRUcgfTsKLQotc3RhdGljIGludCBpbnNuX3VzZXNfcmVnIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKmlwLAotCQkJCSAgdW5zaWduZWQgaW50IHJlZywgZW51bSBtaXBzX3JlZ2NsYXNzIGNsYXNzKSk7Ci1zdGF0aWMgaW50IHJlZ19uZWVkc19kZWxheSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9tYXJrX2xhYmVscyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBhcHBlbmRfaW5zbiBQQVJBTVMgKChjaGFyICpwbGFjZSwKLQkJCQkgc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwLAotCQkJCSBleHByZXNzaW9uUyAqIHAsCi0JCQkJIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByLAotCQkJCSBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX25vX3ByZXZfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1pcHNfZW1pdF9kZWxheXMgUEFSQU1TICgoYm9vbGVhbikpOwotI2lmZGVmIFVTRV9TVERBUkcKLXN0YXRpYyB2b2lkIG1hY3JvX2J1aWxkIFBBUkFNUyAoKGNoYXIgKnBsYWNlLCBpbnQgKmNvdW50ZXIsIGV4cHJlc3Npb25TICogZXAsCi0JCQkJIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmZtdCwKLQkJCQkgLi4uKSk7Ci0jZWxzZQotc3RhdGljIHZvaWQgbWFjcm9fYnVpbGQgKCk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIG1pcHMxNl9tYWNyb19idWlsZCBQQVJBTVMgKChjaGFyICosIGludCAqLCBleHByZXNzaW9uUyAqLAotCQkJCQljb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKLQkJCQkJdmFfbGlzdCkpOwotc3RhdGljIHZvaWQgbWFjcm9fYnVpbGRfbHVpIFBBUkFNUyAoKGNoYXIgKnBsYWNlLCBpbnQgKmNvdW50ZXIsCi0JCQkJICAgICBleHByZXNzaW9uUyAqIGVwLCBpbnQgcmVnbnVtKSk7Ci1zdGF0aWMgdm9pZCBzZXRfYXQgUEFSQU1TICgoaW50ICpjb3VudGVyLCBpbnQgcmVnLCBpbnQgdW5zaWduZWRwKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19hYnNvbHV0ZV9leHByIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCwKLQkJCQkJIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIGxvYWRfcmVnaXN0ZXIgUEFSQU1TICgoaW50ICosIGludCwgZXhwcmVzc2lvblMgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBsb2FkX2FkZHJlc3MgUEFSQU1TICgoaW50ICpjb3VudGVyLCBpbnQgcmVnLCBleHByZXNzaW9uUyAqZXApKTsKLXN0YXRpYyB2b2lkIG1hY3JvIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotc3RhdGljIHZvaWQgbWlwczE2X21hY3JvIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotI2lmZGVmIExPU0lOR19DT01QSUxFUgotc3RhdGljIHZvaWQgbWFjcm8yIFBBUkFNUyAoKHN0cnVjdCBtaXBzX2NsX2luc24gKiBpcCkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBtaXBzX2lwIFBBUkFNUyAoKGNoYXIgKnN0ciwgc3RydWN0IG1pcHNfY2xfaW5zbiAqIGlwKSk7Ci1zdGF0aWMgdm9pZCBtaXBzMTZfaXAgUEFSQU1TICgoY2hhciAqc3RyLCBzdHJ1Y3QgbWlwc19jbF9pbnNuICogaXApKTsKLXN0YXRpYyB2b2lkIG1pcHMxNl9pbW1lZCBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgaW50LCBvZmZzZXRULCBib29sZWFuLAotCQkJCSAgYm9vbGVhbiwgYm9vbGVhbiwgdW5zaWduZWQgbG9uZyAqLAotCQkJCSAgYm9vbGVhbiAqLCB1bnNpZ25lZCBzaG9ydCAqKSk7Ci1zdGF0aWMgaW50IG15X2dldFNtYWxsRXhwcmVzc2lvbiBQQVJBTVMgKChleHByZXNzaW9uUyAqIGVwLCBjaGFyICpzdHIpKTsKLXN0YXRpYyB2b2lkIG15X2dldEV4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBlcCwgY2hhciAqc3RyKSk7Ci1zdGF0aWMgc3ltYm9sUyAqZ2V0X3N5bWJvbCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtaXBzX2FsaWduIFBBUkFNUyAoKGludCB0bywgaW50IGZpbGwsIHN5bWJvbFMgKmxhYmVsKSk7Ci1zdGF0aWMgdm9pZCBzX2FsaWduIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jaGFuZ2Vfc2VjIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19mbG9hdF9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX2dsb2JsIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19vcHRpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNzZXQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2FiaWNhbGxzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jcGxvYWQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2NwcmVzdG9yZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfZ3B3b3JkIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19jcGFkZCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfaW5zbiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIG1kX29ial9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtZF9vYmpfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBsb25nIGdldF9udW1iZXIgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgc19taXBzX2VudCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19lbmQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfZnJhbWUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX21pcHNfbWFzayBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfbWlwc19zdGFiIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19taXBzX3dlYWtleHQgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBzX2ZpbGUgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgaW50IG1pcHMxNl9leHRlbmRlZF9mcmFnIFBBUkFNUyAoKGZyYWdTICosIGFzZWN0aW9uICosIGxvbmcpKTsKLQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX21pcHNfaW5zbiBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKikpOwotDAotLyogUHNldWRvLW9wIHRhYmxlLgotCi0gICBUaGUgZm9sbG93aW5nIHBzZXVkby1vcHMgZnJvbSB0aGUgS2FuZSBhbmQgSGVpbnJpY2ggTUlQUyBib29rCi0gICBzaG91bGQgYmUgZGVmaW5lZCBoZXJlLCBidXQgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZDogLmFsaWFzLAotICAgLmdhbGl2ZSwgLmdqYWxkZWYsIC5nanJsaXZlLCAubGl2ZXJlZywgLm5vYWxpYXMuCi0KLSAgIFRoZSBmb2xsb3dpbmcgcHNldWRvLW9wcyBmcm9tIHRoZSBLYW5lIGFuZCBIZWlucmljaCBNSVBTIGJvb2sgYXJlCi0gICBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmVpbmcgZ2VuZXJhdGVkLCBhbmQKLSAgIHNob3VsZCBiZSBkZWZpbmVkIGJ5IHRoZSBvYmplY3QgZm9ybWF0OiAuYWVudCwgLmJlZ2luLCAuYmVuZCwKLSAgIC5iZ25iLCAuZW5kLCAuZW5kYiwgLmVudCwgLmZtYXNrLCAuZnJhbWUsIC5sb2MsIC5tYXNrLCAudmVyc3RhbXAsCi0gICAudnJlZy4KLQotICAgVGhlIGZvbGxvd2luZyBwc2V1ZG8tb3BzIGZyb20gdGhlIEthbmUgYW5kIEhlaW5yaWNoIE1JUFMgYm9vayBhcmUKLSAgIG5vdCBNSVBTIENQVSBzcGVjaWZpYywgYnV0IGFyZSBhbHNvIG5vdCBzcGVjaWZpYyB0byB0aGUgb2JqZWN0IGZpbGUKLSAgIGZvcm1hdC4gIFRoaXMgZmlsZSBpcyBwcm9iYWJseSB0aGUgYmVzdCBwbGFjZSB0byBkZWZpbmUgdGhlbSwgYnV0Ci0gICB0aGV5IGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZDogLmFzbTAsIC5lbmRyLCAubGFiLCAucmVwZWF0LAotICAgLnN0cnVjdC4gICovCi0KLXN0YXRpYyBjb25zdCBwc2V1ZG9fdHlwZVMgbWlwc19wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gLyogTUlQUyBzcGVjaWZpYyBwc2V1ZG8tb3BzLiAgKi8KLSAgeyJvcHRpb24iLCBzX29wdGlvbiwgMH0sCi0gIHsic2V0Iiwgc19taXBzc2V0LCAwfSwKLSAgeyJyZGF0YSIsIHNfY2hhbmdlX3NlYywgJ3InfSwKLSAgeyJzZGF0YSIsIHNfY2hhbmdlX3NlYywgJ3MnfSwKLSAgeyJsaXZlcmVnIiwgc19pZ25vcmUsIDB9LAotICB7ImFiaWNhbGxzIiwgc19hYmljYWxscywgMH0sCi0gIHsiY3Bsb2FkIiwgc19jcGxvYWQsIDB9LAotICB7ImNwcmVzdG9yZSIsIHNfY3ByZXN0b3JlLCAwfSwKLSAgeyJncHdvcmQiLCBzX2dwd29yZCwgMH0sCi0gIHsiY3BhZGQiLCBzX2NwYWRkLCAwfSwKLSAgeyJpbnNuIiwgc19pbnNuLCAwfSwKLQotIC8qIFJlbGF0aXZlbHkgZ2VuZXJpYyBwc2V1ZG8tb3BzIHRoYXQgaGFwcGVuIHRvIGJlIHVzZWQgb24gTUlQUwotICAgICBjaGlwcy4gICovCi0gIHsiYXNjaWl6Iiwgc3RyaW5nZXIsIDF9LAotICB7ImJzcyIsIHNfY2hhbmdlX3NlYywgJ2InfSwKLSAgeyJlcnIiLCBzX2VyciwgMH0sCi0gIHsiaGFsZiIsIHNfY29ucywgMX0sCi0gIHsiZHdvcmQiLCBzX2NvbnMsIDN9LAotICB7IndlYWtleHQiLCBzX21pcHNfd2Vha2V4dCwgMH0sCi0KLSAvKiBUaGVzZSBwc2V1ZG8tb3BzIGFyZSBkZWZpbmVkIGluIHJlYWQuYywgYnV0IG11c3QgYmUgb3ZlcnJpZGRlbgotICAgICBoZXJlIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuICAqLwotICB7ImFsaWduIiwgc19hbGlnbiwgMH0sCi0gIHsiYnl0ZSIsIHNfY29ucywgMH0sCi0gIHsiZGF0YSIsIHNfY2hhbmdlX3NlYywgJ2QnfSwKLSAgeyJkb3VibGUiLCBzX2Zsb2F0X2NvbnMsICdkJ30sCi0gIHsiZmxvYXQiLCBzX2Zsb2F0X2NvbnMsICdmJ30sCi0gIHsiZ2xvYmwiLCBzX21pcHNfZ2xvYmwsIDB9LAotICB7Imdsb2JhbCIsIHNfbWlwc19nbG9ibCwgMH0sCi0gIHsiaHdvcmQiLCBzX2NvbnMsIDF9LAotICB7ImludCIsIHNfY29ucywgMn0sCi0gIHsibG9uZyIsIHNfY29ucywgMn0sCi0gIHsib2N0YSIsIHNfY29ucywgNH0sCi0gIHsicXVhZCIsIHNfY29ucywgM30sCi0gIHsic2hvcnQiLCBzX2NvbnMsIDF9LAotICB7InNpbmdsZSIsIHNfZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJzdGFibiIsIHNfbWlwc19zdGFiLCAnbid9LAotICB7InRleHQiLCBzX2NoYW5nZV9zZWMsICd0J30sCi0gIHsid29yZCIsIHNfY29ucywgMn0sCi0gIHsgMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IHBzZXVkb190eXBlUyBtaXBzX25vbmVjb2ZmX3BzZXVkb190YWJsZVtdID0gewotIC8qIFRoZXNlIHBzZXVkby1vcHMgc2hvdWxkIGJlIGRlZmluZWQgYnkgdGhlIG9iamVjdCBmaWxlIGZvcm1hdC4KLSAgICBIb3dldmVyLCBhLm91dCBkb2Vzbid0IHN1cHBvcnQgdGhlbSwgc28gd2UgaGF2ZSB2ZXJzaW9ucyBoZXJlLiAgKi8KLSAgeyJhZW50Iiwgc19taXBzX2VudCwgMX0sCi0gIHsiYmduYiIsIHNfaWdub3JlLCAwfSwKLSAgeyJlbmQiLCBzX21pcHNfZW5kLCAwfSwKLSAgeyJlbmRiIiwgc19pZ25vcmUsIDB9LAotICB7ImVudCIsIHNfbWlwc19lbnQsIDB9LAotICB7ImZpbGUiLCBzX2ZpbGUsIDB9LAotICB7ImZtYXNrIiwgc19taXBzX21hc2ssICdGJ30sCi0gIHsiZnJhbWUiLCBzX21pcHNfZnJhbWUsIDB9LAotICB7ImxvYyIsIHNfaWdub3JlLCAwfSwKLSAgeyJtYXNrIiwgc19taXBzX21hc2ssICdSJ30sCi0gIHsidmVyc3RhbXAiLCBzX2lnbm9yZSwgMH0sCi0gIHsgMCB9LAotfTsKLQotZXh0ZXJuIHZvaWQgcG9wX2luc2VydCBQQVJBTVMgKChjb25zdCBwc2V1ZG9fdHlwZVMgKikpOwotCi12b2lkCi1taXBzX3BvcF9pbnNlcnQgKCkKLXsKLSAgcG9wX2luc2VydCAobWlwc19wc2V1ZG9fdGFibGUpOwotICBpZiAoISBFQ09GRl9ERUJVR0dJTkcpCi0gICAgcG9wX2luc2VydCAobWlwc19ub25lY29mZl9wc2V1ZG9fdGFibGUpOwotfQotDAotLyogU3ltYm9scyBsYWJlbGxpbmcgdGhlIGN1cnJlbnQgaW5zbi4gICovCi0KLXN0cnVjdCBpbnNuX2xhYmVsX2xpc3QKLXsKLSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbmV4dDsKLSAgc3ltYm9sUyAqbGFiZWw7Ci19OwotCi1zdGF0aWMgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqaW5zbl9sYWJlbHM7Ci1zdGF0aWMgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqZnJlZV9pbnNuX2xhYmVsczsKLQotc3RhdGljIHZvaWQgbWlwc19jbGVhcl9pbnNuX2xhYmVscyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotbWlwc19jbGVhcl9pbnNuX2xhYmVscyAoKQotewotICByZWdpc3RlciBzdHJ1Y3QgaW5zbl9sYWJlbF9saXN0ICoqcGw7Ci0KLSAgZm9yIChwbCA9ICZmcmVlX2luc25fbGFiZWxzOyAqcGwgIT0gTlVMTDsgcGwgPSAmKCpwbCktPm5leHQpCi0gICAgOwotICAqcGwgPSBpbnNuX2xhYmVsczsKLSAgaW5zbl9sYWJlbHMgPSBOVUxMOwotfQotDAotc3RhdGljIGNoYXIgKmV4cHJfZW5kOwotCi0vKiBFeHByZXNzaW9ucyB3aGljaCBhcHBlYXIgaW4gaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgYXJlIHNldCBieQotICAgbWlwc19pcC4gICovCi0KLXN0YXRpYyBleHByZXNzaW9uUyBpbW1fZXhwcjsKLXN0YXRpYyBleHByZXNzaW9uUyBvZmZzZXRfZXhwcjsKLQotLyogUmVsb2NzIGFzc29jaWF0ZWQgd2l0aCBpbW1fZXhwciBhbmQgb2Zmc2V0X2V4cHIuICAqLwotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGltbV9yZWxvYzsKLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgb2Zmc2V0X3JlbG9jOwotCi0vKiBUaGlzIGlzIHNldCBieSBtaXBzX2lwIGlmIGltbV9yZWxvYyBpcyBhbiB1bm1hdGNoZWQgSEkxNl9TIHJlbG9jLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gaW1tX3VubWF0Y2hlZF9oaTsKLQotLyogVGhlc2UgYXJlIHNldCBieSBtaXBzMTZfaXAgaWYgYW4gZXhwbGljaXQgZXh0ZW5zaW9uIGlzIHVzZWQuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBtaXBzMTZfc21hbGwsIG1pcHMxNl9leHQ7Ci0KLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotLyogVGhlIHBkciBzZWdtZW50IGZvciBwZXIgcHJvY2VkdXJlIGZyYW1lL3JlZ21hc2sgaW5mbyAqLwotCi1zdGF0aWMgc2VnVCBwZHJfc2VnOwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlLCBhdCBhc3NlbWJsZXIgc3RhcnR1cCB0aW1lLiAgSXQgc2hvdWxkCi0gKiBzZXQgdXAgYWxsIHRoZSB0YWJsZXMsIGV0Yy4gdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4KLSAqLwotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgYm9vbGVhbiBvayA9IGZhbHNlOwotICByZWdpc3RlciBjb25zdCBjaGFyICpyZXR2YWwgPSBOVUxMOwotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgaSA9IDA7Ci0gIGNvbnN0IGNoYXIgKmNwdTsKLSAgY2hhciAqYSA9IE5VTEw7Ci0gIGludCBicm9rZW4gPSAwOwotICBpbnQgbWlwc19pc2FfZnJvbV9jcHU7Ci0KLSAgY3B1ID0gVEFSR0VUX0NQVTsKLSAgaWYgKHN0cmNtcCAoY3B1ICsgKHNpemVvZiBUQVJHRVRfQ1BVKSAtIDMsICJlbCIpID09IDApCi0gICAgewotICAgICAgYSA9IHhtYWxsb2MgKHNpemVvZiBUQVJHRVRfQ1BVKTsKLSAgICAgIHN0cmNweSAoYSwgVEFSR0VUX0NQVSk7Ci0gICAgICBhWyhzaXplb2YgVEFSR0VUX0NQVSkgLSAzXSA9ICdcMCc7Ci0gICAgICBjcHUgPSBhOwotICAgIH0KLQotICBpZiAobWlwc19jcHUgPCAwKQotICAgIHsKLSAgICAgIC8qIFNldCBtaXBzX2NwdSBiYXNlZCBvbiBUQVJHRVRfQ1BVLCB1bmxlc3MgVEFSR0VUX0NQVSBpcwotICAgICAgICAganVzdCB0aGUgZ2VuZXJpYyAnbWlwcycsIGluIHdoaWNoIGNhc2Ugc2V0IG1pcHNfY3B1IGJhc2VkCi0gICAgICAgICBvbiB0aGUgZ2l2ZW4gSVNBLCBpZiBhbnkuICovCi0KLSAgICAgIGlmIChzdHJjbXAgKGNwdSwgIm1pcHMiKSA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPCAwKQotICAgICAgICAgICAgbWlwc19jcHUgPSAzMDAwOyAgIAotCi0gICAgICAgICAgZWxzZSBpZiAobWlwc19vcHRzLmlzYSA9PSAyKQotICAgICAgICAgICAgbWlwc19jcHUgPSA2MDAwOwotCi0gICAgICAgICAgZWxzZSBpZiAobWlwc19vcHRzLmlzYSA9PSAzKQotICAgICAgICAgICAgbWlwc19jcHUgPSA0MDAwOwotCi0gICAgICAgICAgZWxzZSBpZiAobWlwc19vcHRzLmlzYSA9PSA0KQotICAgICAgICAgICAgbWlwc19jcHUgPSA4MDAwOwotCi0gICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgIG1pcHNfY3B1ID0gMzAwMDsKLSAgICAgICAgfQotICAgICAgCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInIzOTAwIikgPT0gMAotICAgICAgICAgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzdHgzOSIpID09IDAKLSAgICAgICAgICAgICAgICkKLSAgICAgICAgbWlwc19jcHUgPSAzOTAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI2MDAwIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHMyIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA2MDAwOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJyNDAwMCIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJtaXBzMyIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDAwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNDQwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDQwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjRvcmlvbiIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChjcHUsICJyNDYwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDYwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNDY1MCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDY1MDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzNjR2cjQzMDAiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDQzMDA7Ci0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAibWlwczY0dnI0MTExIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSA0MTExOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNDEwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDEwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJyNDAxMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNDAxMDsKLQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGNwdSwgInI1MDAwIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGNwdSwgIm1pcHM2NHZyNTAwMCIpID09IDApCi0gICAgICAgIG1pcHNfY3B1ID0gNTAwMDsKLQotCi0KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjgwMDAiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoY3B1LCAibWlwczQiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDgwMDA7Ci0gICAgICAKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoY3B1LCAicjEwMDAwIikgPT0gMCkKLSAgICAgICAgbWlwc19jcHUgPSAxMDAwMDsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChjcHUsICJtaXBzMTYiKSA9PSAwKQotICAgICAgICBtaXBzX2NwdSA9IDA7IC8qIEZJWE1FICovCi0KLSAgICAgIGVsc2UKLSAgICAgICAgbWlwc19jcHUgPSAzMDAwOwotICAgIH0KLQotICBpZiAobWlwc19jcHUgPT0gMzAwMAotICAgICAgfHwgbWlwc19jcHUgPT0gMzkwMCkKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDE7Ci0KLSAgZWxzZSBpZiAobWlwc19jcHUgPT0gNjAwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQwMTApCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSAyOwotCi0gIGVsc2UgaWYgKG1pcHNfY3B1ID09IDQwMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0MTAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDExMQotCSAgIHx8IG1pcHNfY3B1ID09IDQ0MDAKLQkgICB8fCBtaXBzX2NwdSA9PSA0MzAwCi0JICAgfHwgbWlwc19jcHUgPT0gNDYwMAotCSAgIHx8IG1pcHNfY3B1ID09IDQ2NTApCi0gICAgbWlwc19pc2FfZnJvbV9jcHUgPSAzOwotCi0gIGVsc2UgaWYgKG1pcHNfY3B1ID09IDUwMDAKLQkgICB8fCBtaXBzX2NwdSA9PSA4MDAwCi0gICAgICAgICAgICAgICB8fCBtaXBzX2NwdSA9PSAxMDAwMCkKLSAgICBtaXBzX2lzYV9mcm9tX2NwdSA9IDQ7Ci0KLSAgZWxzZQotICAgIG1pcHNfaXNhX2Zyb21fY3B1ID0gLTE7Ci0KLSAgaWYgKG1pcHNfb3B0cy5pc2EgPT0gLTEpCi0gICAgewotICAgICAgaWYgKG1pcHNfaXNhX2Zyb21fY3B1ICE9IC0xKQotCW1pcHNfb3B0cy5pc2EgPSBtaXBzX2lzYV9mcm9tX2NwdTsKLSAgICAgIGVsc2UKLQltaXBzX29wdHMuaXNhID0gMTsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYgPCAwKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChUQVJHRVRfQ1BVLCAibWlwczE2Iiwgc2l6ZW9mICJtaXBzMTYiIC0gMSkgPT0gMCkKLQltaXBzX29wdHMubWlwczE2ID0gMTsKLSAgICAgIGVsc2UKLQltaXBzX29wdHMubWlwczE2ID0gMDsKLSAgICB9Ci0KLSAgLyogRW5kIG9mIFRBUkdFVF9DUFUgcHJvY2Vzc2luZywgZ2V0IHJpZCBvZiBtYWxsb2NlZCBtZW1vcnkKLSAgICAgaWYgbmVjZXNzYXJ5LiAqLwotICBjcHUgPSBOVUxMOwotICBpZiAoYSAhPSBOVUxMKQotICAgIHsKLSAgICBmcmVlIChhKTsKLSAgICBhID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfb3B0cy5pc2EgPCAyICYmIG1pcHNfdHJhcCkKLSAgICBhc19iYWQgKF8oInRyYXAgZXhjZXB0aW9uIG5vdCBzdXBwb3J0ZWQgYXQgSVNBIDEiKSk7Ci0KLSAgLyogU2V0IHRoZSBFQUJJIGtpbmQgYmFzZWQgb24gdGhlIElTQSBiZWZvcmUgdGhlIHVzZXIgZ2V0cwotICAgICB0byBjaGFuZ2UgdGhlIElTQSB3aXRoIGRpcmVjdGl2ZXMuICBUaGlzIGlzbid0IHJlYWxseQotICAgICB0aGUgYmVzdCwgYnV0IHRoZW4gbmVpdGhlciBpcyBiYXNpbmcgdGhlIGFiaSBvbiB0aGUgaXNhLiAqLyAgICAgCi0gIGlmIChtaXBzX29wdHMuaXNhID4gMiAKLSAgICAgICYmIG1pcHNfYWJpX3N0cmluZwotICAgICAgJiYgMCA9PSBzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywiZWFiaSIpKQotICAgIG1pcHNfZWFiaTY0ID0gMTsKLQotICBpZiAobWlwc19jcHUgIT0gMCAmJiBtaXBzX2NwdSAhPSAtMSkKLSAgICB7Ci0gICAgICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIG1pcHNfY3B1KTsKLQotICAgICAgLyogSWYgdGhleSBhc2tlZCBmb3IgbWlwczEgb3IgbWlwczIgYW5kIGEgY3B1IHRoYXQgaXMKLQkgbWlwczMgb3IgZ3JlYXRlciwgdGhlbiBtYXJrIHRoZSBvYmplY3QgZmlsZSAzMkJJVE1PREUuICovCi0gICAgICBpZiAobWlwc19pc2FfZnJvbV9jcHUgIT0gLTEKLQkgICYmIG1pcHNfb3B0cy5pc2EgPD0gMiAmJiBtaXBzX2lzYV9mcm9tX2NwdSA+IDIpCi0JbWlwc18zMmJpdG1vZGUgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAobWlwc19vcHRzLmlzYSkKLQl7Ci0JY2FzZSAxOgotCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCAzMDAwKTsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIG9rID0gYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfbWlwcywgNjAwMCk7Ci0JICBicmVhazsKLQljYXNlIDM6Ci0JICBvayA9IGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21pcHMsIDQwMDApOwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgb2sgPSBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9taXBzLCA4MDAwKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEgb2spCi0gICAgYXNfd2FybiAoXygiQ291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgZmlsZV9taXBzX2lzYSA9IG1pcHNfb3B0cy5pc2E7Ci0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1PUENPREVTOykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gbWlwc19vcGNvZGVzW2ldLm5hbWU7Ci0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAoUFRSKSAmbWlwc19vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKLQkJICAgbWlwc19vcGNvZGVzW2ldLm5hbWUsIHJldHZhbCk7Ci0JICAvKiBQcm9iYWJseSBhIG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0/ICBHaXZlIHVwIG5vdy4gICovCi0JICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0JfQotICAgICAgZG8KLQl7Ci0JICBpZiAobWlwc19vcGNvZGVzW2ldLnBpbmZvICE9IElOU05fTUFDUk8pCi0JICAgIHsKLQkgICAgICBpZiAoIXZhbGlkYXRlX21pcHNfaW5zbiAoJm1pcHNfb3Bjb2Rlc1tpXSkpCi0JCWJyb2tlbiA9IDE7Ci0JICAgIH0KLQkgICsraTsKLQl9Ci0gICAgICB3aGlsZSAoKGkgPCBOVU1PUENPREVTKSAmJiAhc3RyY21wIChtaXBzX29wY29kZXNbaV0ubmFtZSwgbmFtZSkpOwotICAgIH0KLQotICBtaXBzMTZfb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIGkgPSAwOwotICB3aGlsZSAoaSA8IGJmZF9taXBzMTZfbnVtX29wY29kZXMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1pcHMxNl9vcGNvZGVzW2ldLm5hbWU7Ci0KLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChtaXBzMTZfb3BfaGFzaCwgbmFtZSwgKFBUUikgJm1pcHMxNl9vcGNvZGVzW2ldKTsKLSAgICAgIGlmIChyZXR2YWwgIT0gTlVMTCkKLQlhc19mYXRhbCAoXygiaW50ZXJuYWw6IGNhbid0IGhhc2ggYCVzJzogJXMiKSwKLQkJICBtaXBzMTZfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotICAgICAgZG8KLQl7Ci0JICBpZiAobWlwczE2X29wY29kZXNbaV0ucGluZm8gIT0gSU5TTl9NQUNSTwotCSAgICAgICYmICgobWlwczE2X29wY29kZXNbaV0ubWF0Y2ggJiBtaXBzMTZfb3Bjb2Rlc1tpXS5tYXNrKQotCQkgICE9IG1pcHMxNl9vcGNvZGVzW2ldLm1hdGNoKSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiaW50ZXJuYWwgZXJyb3I6IGJhZCBtaXBzMTYgb3Bjb2RlOiAlcyAlc1xuIiksCi0JCSAgICAgICBtaXBzMTZfb3Bjb2Rlc1tpXS5uYW1lLCBtaXBzMTZfb3Bjb2Rlc1tpXS5hcmdzKTsKLQkgICAgICBicm9rZW4gPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCBiZmRfbWlwczE2X251bV9vcGNvZGVzCi0JICAgICAmJiBzdHJjbXAgKG1pcHMxNl9vcGNvZGVzW2ldLm5hbWUsIG5hbWUpID09IDApOwotICAgIH0KLQotICBpZiAoYnJva2VuKQotICAgIGFzX2ZhdGFsIChfKCJCcm9rZW4gYXNzZW1ibGVyLiAgTm8gYXNzZW1ibHkgYXR0ZW1wdGVkLiIpKTsKLQotICAvKiBXZSBhZGQgYWxsIHRoZSBnZW5lcmFsIHJlZ2lzdGVyIG5hbWVzIHRvIHRoZSBzeW1ib2wgdGFibGUuICBUaGlzCi0gICAgIGhlbHBzIHVzIGRldGVjdCBpbnZhbGlkIHVzZXMgb2YgdGhlbS4gICovCi0gIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgYnVmWzVdOwotCi0gICAgICBzcHJpbnRmIChidWYsICIkJWQiLCBpKTsKLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKGJ1ZiwgcmVnX3NlY3Rpb24sIGksCi0JCQkJICAgICAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICAgIH0KLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRmcCIsIHJlZ19zZWN0aW9uLCBGUCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRzcCIsIHJlZ19zZWN0aW9uLCBTUCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRncCIsIHJlZ19zZWN0aW9uLCBHUCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRhdCIsIHJlZ19zZWN0aW9uLCBBVCwKLQkJCQkgICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX25ldyAoIiRrdDAiLCByZWdfc2VjdGlvbiwgS1QwLAotCQkJCSAgICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xfbmV3ICgiJGt0MSIsIHJlZ19zZWN0aW9uLCBLVDEsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9uZXcgKCIkcGMiLCByZWdfc2VjdGlvbiwgLTEsCi0JCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0KLSAgbWlwc19ub19wcmV2X2luc24gKGZhbHNlKTsKLQotICBtaXBzX2dwcm1hc2sgPSAwOwotICBtaXBzX2Nwcm1hc2tbMF0gPSAwOwotICBtaXBzX2Nwcm1hc2tbMV0gPSAwOwotICBtaXBzX2Nwcm1hc2tbMl0gPSAwOwotICBtaXBzX2Nwcm1hc2tbM10gPSAwOwotCi0gIC8qIHNldCB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgZm9yIHRoZSB0ZXh0IHNlY3Rpb24gKDIqKjIpICovCi0gIHJlY29yZF9hbGlnbm1lbnQgKHRleHRfc2VjdGlvbiwgMik7Ci0KLSAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0gICAgYmZkX3NldF9ncF9zaXplIChzdGRvdXRwdXQsIGdfc3dpdGNoX3ZhbHVlKTsKLQotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIC8qIE9uIGEgbmF0aXZlIHN5c3RlbSwgc2VjdGlvbnMgbXVzdCBiZSBhbGlnbmVkIHRvIDE2IGJ5dGUKLQkgYm91bmRhcmllcy4gIFdoZW4gY29uZmlndXJlZCBmb3IgYW4gZW1iZWRkZWQgRUxGIHRhcmdldCwgd2UKLQkgZG9uJ3QgYm90aGVyLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JewotCSAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgdGV4dF9zZWN0aW9uLCA0KTsKLQkgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIGRhdGFfc2VjdGlvbiwgNCk7Ci0JICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBic3Nfc2VjdGlvbiwgNCk7Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYSAucmVnaW5mbyBzZWN0aW9uIGZvciByZWdpc3RlciBtYXNrcyBhbmQgYSAubWRlYnVnCi0JIHNlY3Rpb24gZm9yIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0gICAgICB7Ci0Jc2VnVCBzZWc7Ci0Jc3Vic2VnVCBzdWJzZWc7Ci0JZmxhZ3dvcmQgZmxhZ3M7Ci0Jc2VnVCBzZWM7Ci0KLQlzZWcgPSBub3dfc2VnOwotCXN1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLQkvKiBUaGUgQUJJIHNheXMgdGhpcyBzZWN0aW9uIHNob3VsZCBiZSBsb2FkZWQgc28gdGhhdCB0aGUKLQkgICBydW5uaW5nIHByb2dyYW0gY2FuIGFjY2VzcyBpdC4gIEhvd2V2ZXIsIHdlIGRvbid0IGxvYWQgaXQKLQkgICBpZiB3ZSBhcmUgY29uZmlndXJlZCBmb3IgYW4gZW1iZWRkZWQgdGFyZ2V0ICovCi0JZmxhZ3MgPSBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQTsKLQlpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCSAgZmxhZ3MgfD0gU0VDX0FMTE9DIHwgU0VDX0xPQUQ7Ci0KLQlpZiAoISBtaXBzXzY0KQotCSAgewotCSAgICBzZWMgPSBzdWJzZWdfbmV3ICgiLnJlZ2luZm8iLCAoc3Vic2VnVCkgMCk7Ci0KLQotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlYywgZmxhZ3MpOwotCSAgICAodm9pZCkgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWMsIDIpOwotCQotI2lmZGVmIE9CSl9FTEYKLQkgICAgbWlwc19yZWdtYXNrX2ZyYWcgPSBmcmFnX21vcmUgKHNpemVvZiAoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbykpOwotI2VuZGlmCi0JICB9Ci0JZWxzZQotCSAgewotCSAgICAvKiBUaGUgNjQtYml0IEFCSSB1c2VzIGEgLk1JUFMub3B0aW9ucyBzZWN0aW9uIHJhdGhlciB0aGFuCi0gICAgICAgICAgICAgICAucmVnaW5mbyBzZWN0aW9uLiAgKi8KLQkgICAgc2VjID0gc3Vic2VnX25ldyAoIi5NSVBTLm9wdGlvbnMiLCAoc3Vic2VnVCkgMCk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjLCBmbGFncyk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlYywgMyk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0JICAgIC8qIFNldCB1cCB0aGUgb3B0aW9uIGhlYWRlci4gICovCi0JICAgIHsKLQkgICAgICBFbGZfSW50ZXJuYWxfT3B0aW9ucyBvcHRoZHI7Ci0JICAgICAgY2hhciAqZjsKLQotCSAgICAgIG9wdGhkci5raW5kID0gT0RLX1JFR0lORk87Ci0JICAgICAgb3B0aGRyLnNpemUgPSAoc2l6ZW9mIChFbGZfRXh0ZXJuYWxfT3B0aW9ucykKLQkJCSAgICAgKyBzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pKTsKLQkgICAgICBvcHRoZHIuc2VjdGlvbiA9IDA7Ci0JICAgICAgb3B0aGRyLmluZm8gPSAwOwotCSAgICAgIGYgPSBmcmFnX21vcmUgKHNpemVvZiAoRWxmX0V4dGVybmFsX09wdGlvbnMpKTsKLQkgICAgICBiZmRfbWlwc19lbGZfc3dhcF9vcHRpb25zX291dCAoc3Rkb3V0cHV0LCAmb3B0aGRyLAotCQkJCQkgICAgIChFbGZfRXh0ZXJuYWxfT3B0aW9ucyAqKSBmKTsKLQotCSAgICAgIG1pcHNfcmVnbWFza19mcmFnID0gZnJhZ19tb3JlIChzaXplb2YgKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8pKTsKLQkgICAgfQotI2VuZGlmCi0JICB9Ci0KLQlpZiAoRUNPRkZfREVCVUdHSU5HKQotCSAgewotCSAgICBzZWMgPSBzdWJzZWdfbmV3ICgiLm1kZWJ1ZyIsIChzdWJzZWdUKSAwKTsKLQkgICAgKHZvaWQpIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsCi0JCQkJCSAgU0VDX0hBU19DT05URU5UUyB8IFNFQ19SRUFET05MWSk7Ci0JICAgICh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlYywgMik7Ci0JICB9Ci0KLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotCXBkcl9zZWcgPSBzdWJzZWdfbmV3ICgiLnBkciIsIChzdWJzZWdUKSAwKTsKLQkodm9pZCkgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHBkcl9zZWcsCi0JCQkgICAgIFNFQ19SRUFET05MWSB8IFNFQ19SRUxPQyB8IFNFQ19ERUJVR0dJTkcpOwotCSh2b2lkKSBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHBkcl9zZWcsIDIpOwotI2VuZGlmCi0KLQlzdWJzZWdfc2V0IChzZWcsIHN1YnNlZyk7Ci0gICAgICB9Ci0gICAgfQotCi0gIGlmICghIEVDT0ZGX0RFQlVHR0lORykKLSAgICBtZF9vYmpfYmVnaW4gKCk7Ci19Ci0KLXZvaWQKLW1kX21pcHNfZW5kICgpCi17Ci0gIGlmICghIEVDT0ZGX0RFQlVHR0lORykKLSAgICBtZF9vYmpfZW5kICgpOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHN0cnVjdCBtaXBzX2NsX2luc24gaW5zbjsKLQotICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIGltbV91bm1hdGNoZWRfaGkgPSBmYWxzZTsKLSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIG1pcHMxNl9pcCAoc3RyLCAmaW5zbik7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtaXBzX2lwIChzdHIsICZpbnNuKTsKLSAgICAgIERCRygoXygicmV0dXJuZWQgZnJvbSBtaXBzX2lwKCVzKSBpbnNuX29wY29kZSA9IDB4JXhcbiIpLCAKLQkJc3RyLCBpbnNuLmluc25fb3Bjb2RlKSk7Ci0gICAgfQotCi0gIGlmIChpbnNuX2Vycm9yKQotICAgIHsKLSAgICAgIGFzX2JhZCAoIiVzIGAlcyciLCBpbnNuX2Vycm9yLCBzdHIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5zbi5pbnNuX21vLT5waW5mbyA9PSBJTlNOX01BQ1JPKQotICAgIHsKLSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2KQotCW1pcHMxNl9tYWNybyAoJmluc24pOwotICAgICAgZWxzZQotCW1hY3JvICgmaW5zbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19hYnNlbnQpCi0JYXBwZW5kX2luc24gKChjaGFyICopIE5VTEwsICZpbnNuLCAmaW1tX2V4cHIsIGltbV9yZWxvYywKLQkJICAgICBpbW1fdW5tYXRjaGVkX2hpKTsKLSAgICAgIGVsc2UgaWYgKG9mZnNldF9leHByLlhfb3AgIT0gT19hYnNlbnQpCi0JYXBwZW5kX2luc24gKChjaGFyICopIE5VTEwsICZpbnNuLCAmb2Zmc2V0X2V4cHIsIG9mZnNldF9yZWxvYywgZmFsc2UpOwotICAgICAgZWxzZQotCWFwcGVuZF9pbnNuICgoY2hhciAqKSBOVUxMLCAmaW5zbiwgTlVMTCwgQkZEX1JFTE9DX1VOVVNFRCwgZmFsc2UpOwotICAgIH0KLX0KLQotLyogU2VlIHdoZXRoZXIgaW5zdHJ1Y3Rpb24gSVAgcmVhZHMgcmVnaXN0ZXIgUkVHLiAgQ0xBU1MgaXMgdGhlIHR5cGUKLSAgIG9mIHJlZ2lzdGVyLiAgKi8KLQotc3RhdGljIGludAotaW5zbl91c2VzX3JlZyAoaXAsIHJlZywgY2xhc3MpCi0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotICAgICB1bnNpZ25lZCBpbnQgcmVnOwotICAgICBlbnVtIG1pcHNfcmVnY2xhc3MgY2xhc3M7Ci17Ci0gIGlmIChjbGFzcyA9PSBNSVBTMTZfUkVHKQotICAgIHsKLSAgICAgIGFzc2VydCAobWlwc19vcHRzLm1pcHMxNik7Ci0gICAgICByZWcgPSBtaXBzMTZfdG9fMzJfcmVnX21hcFtyZWddOwotICAgICAgY2xhc3MgPSBNSVBTX0dSX1JFRzsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgcmVwb3J0IG9uIGdlbmVyYWwgcmVnaXN0ZXIgMCwgc2luY2UgaXQgbmV2ZXIgY2hhbmdlcy4gICovCi0gIGlmIChjbGFzcyA9PSBNSVBTX0dSX1JFRyAmJiByZWcgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoY2xhc3MgPT0gTUlQU19GUF9SRUcpCi0gICAgewotICAgICAgYXNzZXJ0ICghIG1pcHNfb3B0cy5taXBzMTYpOwotICAgICAgLyogSWYgd2UgYXJlIGNhbGxlZCB3aXRoIGVpdGhlciAkZjAgb3IgJGYxLCB3ZSBtdXN0IGNoZWNrICRmMC4KLQkgVGhpcyBpcyBub3Qgb3B0aW1hbCwgYmVjYXVzZSBpdCB3aWxsIGludHJvZHVjZSBhbiB1bm5lY2Vzc2FyeQotCSBOT1AgYmV0d2VlbiAibHdjMSAkZjAiIGFuZCAic3djMSAkZjEiLiAgVG8gZml4IHRoaXMgd2Ugd291bGQKLQkgbmVlZCB0byBkaXN0aW5ndWlzaCByZWFkaW5nIGJvdGggJGYwIGFuZCAkZjEgb3IganVzdCBvbmUgb2YKLQkgdGhlbS4gIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIHRoZSBvdGhlciB3YXksCi0JIGJlY2F1c2UgdGhlcmUgaXMgbm8gaW5zdHJ1Y3Rpb24gdGhhdCBzZXRzIGJvdGggJGYwIGFuZCAkZjEKLQkgYW5kIHJlcXVpcmVzIGEgZGVsYXkuICAqLwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfRlBSX1MpCi0JICAmJiAoKCgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZTKSAmIE9QX01BU0tfRlMpICZ+KHVuc2lnbmVkKTEpCi0JICAgICAgPT0gKHJlZyAmfiAodW5zaWduZWQpIDEpKSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0ZQUl9UKQotCSAgJiYgKCgoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GVCkgJiBPUF9NQVNLX0ZUKSAmfih1bnNpZ25lZCkxKQotCSAgICAgID09IChyZWcgJn4gKHVuc2lnbmVkKSAxKSkpCi0JcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlIGlmICghIG1pcHNfb3B0cy5taXBzMTYpCi0gICAgewotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfR1BSX1MpCi0JICAmJiAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SUykgJiBPUF9NQVNLX1JTKSA9PSByZWcpCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9HUFJfVCkKLQkgICYmICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpID09IHJlZykKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfWCkKLQkgICYmIChtaXBzMTZfdG9fMzJfcmVnX21hcFsoKGlwLT5pbnNuX29wY29kZSA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCQkgICAgJiBNSVBTMTZPUF9NQVNLX1JYKV0KLQkgICAgICA9PSByZWcpKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1kpCi0JICAmJiAobWlwczE2X3RvXzMyX3JlZ19tYXBbKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkJICAgICYgTUlQUzE2T1BfTUFTS19SWSldCi0JICAgICAgPT0gcmVnKSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9aKQotCSAgJiYgKG1pcHMxNl90b18zMl9yZWdfbWFwWygoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX01PVkUzMlopCi0JCQkJICAgICYgTUlQUzE2T1BfTUFTS19NT1ZFMzJaKV0KLQkgICAgICA9PSByZWcpKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1QpICYmIHJlZyA9PSBUUkVHKQotCXJldHVybiAxOwotICAgICAgaWYgKChpcC0+aW5zbl9tby0+cGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1NQKSAmJiByZWcgPT0gU1ApCi0JcmV0dXJuIDE7Ci0gICAgICBpZiAoKGlwLT5pbnNuX21vLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfMzEpICYmIHJlZyA9PSBSQSkKLQlyZXR1cm4gMTsKLSAgICAgIGlmICgoaXAtPmluc25fbW8tPnBpbmZvICYgTUlQUzE2X0lOU05fUkVBRF9HUFJfWCkKLQkgICYmICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JFR1IzMikKLQkgICAgICAmIE1JUFMxNk9QX01BU0tfUkVHUjMyKSA9PSByZWcpCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBtb2RpZnlpbmcgYSByZWdpc3RlciByZXF1aXJlcyBhCi0gICBkZWxheS4gICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uZWVkc19kZWxheSAocmVnKQotICAgICBpbnQgcmVnOwotewotICB1bnNpZ25lZCBsb25nIHByZXZfcGluZm87Ci0KLSAgcHJldl9waW5mbyA9IHByZXZfaW5zbi5pbnNuX21vLT5waW5mbzsKLSAgaWYgKCEgbWlwc19vcHRzLm5vcmVvcmRlcgotICAgICAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLSAgICAgICYmICgocHJldl9waW5mbyAmIElOU05fTE9BRF9DT1BST0NfREVMQVkpCi0JICB8fCAoISBncHJfaW50ZXJsb2NrcwotCSAgICAgICYmIChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpKSkKLSAgICB7Ci0gICAgICAvKiBBIGxvYWQgZnJvbSBhIGNvcHJvY2Vzc29yIG9yIGZyb20gbWVtb3J5LiAgQWxsIGxvYWQKLQkgZGVsYXlzIGRlbGF5IHRoZSB1c2Ugb2YgZ2VuZXJhbCByZWdpc3RlciBydCBmb3Igb25lCi0JIGluc3RydWN0aW9uIG9uIHRoZSByMzAwMC4gIFRoZSByNjAwMCBhbmQgcjQwMDAgdXNlCi0JIGludGVybG9ja3MuICAqLwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAga25vdyAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX1QpOwotICAgICAgaWYgKHJlZyA9PSAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKSkKLQlyZXR1cm4gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIE1hcmsgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluIG1pcHMxNiBtb2RlLiAgVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgdG8KLSAgIGhhbmRsZSB0aGVtIHNwZWNpYWxseSwgc3VjaCBhcyBnZW5lcmF0aW5nIGphbHggaW5zdHJ1Y3Rpb25zIHdoZW4KLSAgIG5lZWRlZC4gIFdlIGFsc28gbWFrZSB0aGVtIG9kZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhc3NlbWJseSwgaW4KLSAgIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSByaWdodCBzb3J0IG9mIGNvZGUuICBXZSB3aWxsIG1ha2UgdGhlbSBldmVuCi0gICBpbiB0aGUgYWRqdXN0X3N5bXRhYiByb3V0aW5lLCB3aGlsZSBsZWF2aW5nIHRoZW0gbWFya2VkLiAgVGhpcyBpcwotICAgY29udmVuaWVudCBmb3IgdGhlIGRlYnVnZ2VyIGFuZCB0aGUgZGlzYXNzZW1ibGVyLiAgVGhlIGxpbmtlciBrbm93cwotICAgdG8gbWFrZSB0aGVtIG9kZCBhZ2Fpbi4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzMTZfbWFya19sYWJlbHMgKCkKLXsKLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0gICAgewotICAgICAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotICAgICAgZm9yIChsID0gaW5zbl9sYWJlbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JewotI2lmZGVmIE9CSl9FTEYKLQkgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JICAgIFNfU0VUX09USEVSIChsLT5sYWJlbCwgU1RPX01JUFMxNik7Ci0jZW5kaWYKLQkgIGlmICgoU19HRVRfVkFMVUUgKGwtPmxhYmVsKSAmIDEpID09IDApCi0JICAgIFNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgU19HRVRfVkFMVUUgKGwtPmxhYmVsKSArIDEpOwotCX0KLSAgICB9Ci19Ci0KLS8qIE91dHB1dCBhbiBpbnN0cnVjdGlvbi4gIFBMQUNFIGlzIHdoZXJlIHRvIHB1dCB0aGUgaW5zdHJ1Y3Rpb247IGlmCi0gICBpdCBpcyBOVUxMLCB0aGlzIHVzZXMgZnJhZ19tb3JlIHRvIGdldCByb29tLiAgSVAgaXMgdGhlIGluc3RydWN0aW9uCi0gICBpbmZvcm1hdGlvbi4gIEFERFJFU1NfRVhQUiBpcyBhbiBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZQotICAgdXNlZCB3aXRoIFJFTE9DX1RZUEUuICAqLwotCi1zdGF0aWMgdm9pZAotYXBwZW5kX2luc24gKHBsYWNlLCBpcCwgYWRkcmVzc19leHByLCByZWxvY190eXBlLCB1bm1hdGNoZWRfaGkpCi0gICAgIGNoYXIgKnBsYWNlOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLSAgICAgZXhwcmVzc2lvblMgKmFkZHJlc3NfZXhwcjsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jX3R5cGU7Ci0gICAgIGJvb2xlYW4gdW5tYXRjaGVkX2hpOwotewotICByZWdpc3RlciB1bnNpZ25lZCBsb25nIHByZXZfcGluZm8sIHBpbmZvOwotICBjaGFyICpmOwotICBmaXhTICpmaXhwOwotICBpbnQgbm9wcyA9IDA7Ci0KLSAgLyogTWFyayBpbnN0cnVjdGlvbiBsYWJlbHMgaW4gbWlwczE2IG1vZGUuICAqLwotICBpZiAobWlwc19vcHRzLm1pcHMxNikKLSAgICBtaXBzMTZfbWFya19sYWJlbHMgKCk7Ci0KLSAgcHJldl9waW5mbyA9IHByZXZfaW5zbi5pbnNuX21vLT5waW5mbzsKLSAgcGluZm8gPSBpcC0+aW5zbl9tby0+cGluZm87Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwgJiYgKCEgbWlwc19vcHRzLm5vcmVvcmRlciB8fCBwcmV2X25vcF9mcmFnICE9IE5VTEwpKQotICAgIHsKLSAgICAgIGludCBwcmV2X3ByZXZfbm9wOwotCi0gICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zbiByZXF1aXJlZCBhbnkgZGVsYXkgc2xvdHMsIHNlZSBpZiB3ZSBuZWVkCi0JIHRvIGluc2VydCBhIE5PUCBvciB0d28uICBUaGVyZSBhcmUgZWlnaHQga2luZHMgb2YgcG9zc2libGUKLQkgaGF6YXJkcywgb2Ygd2hpY2ggYW4gaW5zdHJ1Y3Rpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgdHlwZS4KLQkgKDEpIGEgbG9hZCBmcm9tIG1lbW9yeSBkZWxheQotCSAoMikgYSBsb2FkIGZyb20gYSBjb3Byb2Nlc3NvciBkZWxheQotCSAoMykgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggZGVsYXkKLQkgKDQpIGEgY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5Ci0JICg1KSBhIG1vdmUgdG8gY29wcm9jZXNzb3IgcmVnaXN0ZXIgZGVsYXkKLQkgKDYpIGEgbG9hZCBjb3Byb2Nlc3NvciByZWdpc3RlciBmcm9tIG1lbW9yeSBkZWxheQotCSAoNykgYSBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZSBkZWxheQotCSAoOCkgYSBISS9MTyBzcGVjaWFsIHJlZ2lzdGVyIGRlbGF5Ci0KLQkgVGhlcmUgYXJlIGEgbG90IG9mIG9wdGltaXphdGlvbnMgd2UgY291bGQgZG8gdGhhdCB3ZSBkb24ndC4KLQkgSW4gcGFydGljdWxhciwgd2UgZG8gbm90LCBpbiBnZW5lcmFsLCByZW9yZGVyIGluc3RydWN0aW9ucy4KLQkgSWYgeW91IHVzZSBnY2Mgd2l0aCBvcHRpbWl6YXRpb24sIGl0IHdpbGwgcmVvcmRlcgotCSBpbnN0cnVjdGlvbnMgYW5kIGdlbmVyYWxseSBkbyBtdWNoIG1vcmUgb3B0aW1pemF0aW9uIHRoZW4gd2UKLQkgZG8gaGVyZTsgcmVwZWF0aW5nIGFsbCB0aGF0IHdvcmsgaW4gdGhlIGFzc2VtYmxlciB3b3VsZCBvbmx5Ci0JIGJlbmVmaXQgaGFuZCB3cml0dGVuIGFzc2VtYmx5IGNvZGUsIGFuZCBkb2VzIG5vdCBzZWVtIHdvcnRoCi0JIGl0LiAgKi8KLQotICAgICAgLyogVGhpcyBpcyBob3cgYSBOT1AgaXMgZW1pdHRlZC4gICovCi0jZGVmaW5lIGVtaXRfbm9wKCkJCQkJCVwKLSAgKG1pcHNfb3B0cy5taXBzMTYJCQkJCVwKLSAgID8gbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnX21vcmUgKDIpLCAweDY1MDAsIDIpCVwKLSAgIDogbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnX21vcmUgKDQpLCAwLCA0KSkKLQotICAgICAgLyogVGhlIHByZXZpb3VzIGluc24gbWlnaHQgcmVxdWlyZSBhIGRlbGF5IHNsb3QsIGRlcGVuZGluZyB1cG9uCi0JIHRoZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBpbnNuLiAgKi8KLSAgICAgIGlmICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JICAmJiAoKChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSkKLSAgICAgICAgICAgICAgICYmICEgY29wX2ludGVybG9ja3MpCi0JICAgICAgfHwgKCEgZ3ByX2ludGVybG9ja3MKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKSkpCi0JewotCSAgLyogQSBsb2FkIGZyb20gYSBjb3Byb2Nlc3NvciBvciBmcm9tIG1lbW9yeS4gIEFsbCBsb2FkCi0JICAgICBkZWxheXMgZGVsYXkgdGhlIHVzZSBvZiBnZW5lcmFsIHJlZ2lzdGVyIHJ0IGZvciBvbmUKLQkgICAgIGluc3RydWN0aW9uIG9uIHRoZSByMzAwMC4gIFRoZSByNjAwMCBhbmQgcjQwMDAgdXNlCi0JICAgICBpbnRlcmxvY2tzLiAgKi8KLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBrbm93IChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9HUFJfVCk7Ci0JICBpZiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JICAgICAgfHwgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfUlQpCi0JCQkJICYgT1BfTUFTS19SVCksCi0JCQkJTUlQU19HUl9SRUcpKQotCSAgICArK25vcHM7Ci0JfQotICAgICAgZWxzZSBpZiAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JICAgICAgICYmICgoKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZKQotICAgICAgICAgICAgICAgICAgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQotCQkgICB8fCAobWlwc19vcHRzLmlzYSA8IDIKLQkJICAgICAgICYmIChwcmV2X3BpbmZvICYgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZKSkpKQotCXsKLQkgIC8qIEEgZ2VuZXJpYyBjb3Byb2Nlc3NvciBkZWxheS4gIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbgotCSAgICAgbW9kaWZpZWQgYSBjb3Byb2Nlc3NvciBnZW5lcmFsIG9yIGNvbnRyb2wgcmVnaXN0ZXIuICBJZgotCSAgICAgaXQgbW9kaWZpZWQgYSBjb250cm9sIHJlZ2lzdGVyLCB3ZSBuZWVkIHRvIGF2b2lkIGFueQotCSAgICAgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgcHJvYmFibHkgbm90IGFsd2F5cwotCSAgICAgcmVxdWlyZWQsIGJ1dCBpdCBzb21ldGltZXMgaXMpLiAgSWYgaXQgbW9kaWZpZWQgYSBnZW5lcmFsCi0JICAgICByZWdpc3Rlciwgd2UgYXZvaWQgdXNpbmcgdGhhdCByZWdpc3Rlci4KLQotCSAgICAgT24gdGhlIHI2MDAwIGFuZCByNDAwMCBsb2FkaW5nIGEgY29wcm9jZXNzb3IgcmVnaXN0ZXIKLQkgICAgIGZyb20gbWVtb3J5IGlzIGludGVybG9ja2VkLCBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIGRlbGF5LgotCi0JICAgICBUaGlzIGNhc2UgaXMgbm90IGhhbmRsZWQgdmVyeSB3ZWxsLiAgVGhlcmUgaXMgbm8gc3BlY2lhbAotCSAgICAga25vd2xlZGdlIG9mIENQMCBoYW5kbGluZywgYW5kIHRoZSBjb3Byb2Nlc3NvcnMgb3RoZXIKLQkgICAgIHRoYW4gdGhlIGZsb2F0aW5nIHBvaW50IHVuaXQgYXJlIG5vdCBkaXN0aW5ndWlzaGVkIGF0Ci0JICAgICBhbGwuICAqLwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gRklYTUUhCi0gICAgICAgICAgICAgTmVlZCB0byBtb2RpZnkgdGhpcyB0byBpbmNsdWRlIGtub3dsZWRnZSBhYm91dCAKLSAgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBkZWxheXMhICAqLwotCSAgaWYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0ZQUl9UKQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0aW1pemUgPT0gMAotCQkgIHx8IGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9GVCkKLQkJCQkgICAgICYgT1BfTUFTS19GVCksCi0JCQkJICAgIE1JUFNfRlBfUkVHKSkKLQkJKytub3BzOwotCSAgICB9Ci0JICBlbHNlIGlmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9GUFJfUykKLQkgICAgewotCSAgICAgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUgPj4gT1BfU0hfRlMpCi0JCQkJICAgICAmIE9QX01BU0tfRlMpLAotCQkJCSAgICBNSVBTX0ZQX1JFRykpCi0JCSsrbm9wczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgZG9uJ3Qga25vdyBleGFjdGx5IHdoYXQgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uCi0JCSBkb2VzLiAgSWYgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gdXNlcyBhIGNvcHJvY2Vzc29yCi0JCSByZWdpc3Rlciwgd2UgbXVzdCBpbnNlcnQgYSBOT1AuICBJZiBwcmV2aW91cwotCQkgaW5zdHJ1Y3Rpb24gbWF5IHNldCB0aGUgY29uZGl0aW9uIGNvZGVzLCBhbmQgdGhlCi0JCSBjdXJyZW50IGluc3RydWN0aW9uIHVzZXMgdGhlbSwgd2UgbXVzdCBpbnNlcnQgdHdvCi0JCSBOT1BTLiAgKi8KLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgICAgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCAoKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkKLQkJICAgICAgJiYgKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkpKQotCQlub3BzICs9IDI7Ci0JICAgICAgZWxzZSBpZiAocGluZm8gJiBJTlNOX0NPUCkKLQkJKytub3BzOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0JICAgICAgICYmIChwcmV2X3BpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpCi0gICAgICAgICAgICAgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQotCXsKLQkgIC8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBzZXRzIHRoZSBjb3Byb2Nlc3NvciBjb25kaXRpb24KLQkgICAgIGNvZGVzLCBidXQgZG9lcyBub3QgcmVxdWlyZSBhIGdlbmVyYWwgY29wcm9jZXNzb3IgZGVsYXkKLQkgICAgICh0aGlzIG1lYW5zIGl0IGlzIGEgZmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbgotCSAgICAgaW5zdHJ1Y3Rpb24pLiAgSWYgdGhpcyBpbnN0cnVjdGlvbiB1c2VzIHRoZSBjb25kaXRpb24KLQkgICAgIGNvZGVzLCB3ZSBuZWVkIHRvIGluc2VydCBhIHNpbmdsZSBOT1AuICAqLwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIGlmIChtaXBzX29wdGltaXplID09IDAKLQkgICAgICB8fCAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkKLQkgICAgKytub3BzOwotCX0KLSAgICAgIGVsc2UgaWYgKHByZXZfcGluZm8gJiBJTlNOX1JFQURfTE8pCi0JewotCSAgLyogVGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHJlYWRzIHRoZSBMTyByZWdpc3RlcjsgaWYgdGhlCi0JICAgICBjdXJyZW50IGluc3RydWN0aW9uIHdyaXRlcyB0byB0aGUgTE8gcmVnaXN0ZXIsIHdlIG11c3QKLQkgICAgIGluc2VydCB0d28gTk9QUy4gIFNvbWUgbmV3ZXIgcHJvY2Vzc29ycyBoYXZlIGludGVybG9ja3MuIAotCSAgICAgQWxzbyB0aGUgdHgzOSdzIG11bHRpcGx5IGluc3RydWN0aW9ucyBjYW4gYmUgZXhlY3R1dGVkIAotICAgICAgICAgICAgIGltbWVkaWF0bHkgYWZ0ZXIgYSByZWFkIGZyb20gSEkvTE8gKHdpdGhvdXQgdGhlIGRlbGF5KSwKLSAgICAgICAgICAgICB0aG91Z2ggdGhlIHR4MzkncyBkaXZpZGUgaW5zbnMgc3RpbGwgZG8gcmVxdWlyZSB0aGUgCi0JICAgICBkZWxheS4gKi8KLQkgIGlmICghIChoaWxvX2ludGVybG9ja3MKLQkJIHx8IChtaXBzX2NwdSA9PSAzOTAwICYmIChwaW5mbyAmIElOU05fTVVMVCkpKQotCSAgICAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICB8fCAocGluZm8gJiBJTlNOX1dSSVRFX0xPKSkpCi0JICAgIG5vcHMgKz0gMjsKLQkgIC8qIE1vc3QgbWlwczE2IGJyYW5jaCBpbnNucyBkb24ndCBoYXZlIGEgZGVsYXkgc2xvdC4KLQkgICAgIElmIGEgcmVhZCBmcm9tIExPIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgYnJhbmNoCi0JICAgICB0byBhIHdyaXRlIHRvIExPIHdlIGhhdmUgYSByZWFkIGZvbGxvd2VkIGJ5IGEgd3JpdGUKLQkgICAgIGxlc3MgdGhhbiAyIGluc25zIGF3YXkuICBXZSBhc3N1bWUgdGhlIHRhcmdldCBvZgotCSAgICAgYSBicmFuY2ggbWlnaHQgYmUgYSB3cml0ZSB0byBMTywgYW5kIGluc2VydCBhIG5vcAotCSAgICAgYmV0d2VlbiBhIHJlYWQgYW5kIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBicmFuY2guICovCi0JICBlbHNlIGlmIChtaXBzX29wdHMubWlwczE2Ci0JCSAgICYmIChtaXBzX29wdGltaXplID09IDAKLQkJICAgICAgIHx8IChwaW5mbyAmIE1JUFMxNl9JTlNOX0JSQU5DSCkpKQotCSAgICBub3BzICs9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9SRUFEX0hJKQotCXsKLQkgIC8qIFRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiByZWFkcyB0aGUgSEkgcmVnaXN0ZXI7IGlmIHRoZQotCSAgICAgY3VycmVudCBpbnN0cnVjdGlvbiB3cml0ZXMgdG8gdGhlIEhJIHJlZ2lzdGVyLCB3ZSBtdXN0Ci0JICAgICBpbnNlcnQgYSBOT1AuICBTb21lIG5ld2VyIHByb2Nlc3NvcnMgaGF2ZSBpbnRlcmxvY2tzLgotCSAgICAgQWxzbyB0aGUgbm90ZSB0eDM5J3MgbXVsdGlwbHkgYWJvdmUuICovCi0JICBpZiAoISAoaGlsb19pbnRlcmxvY2tzCi0JCSB8fCAobWlwc19jcHUgPT0gMzkwMCAmJiAocGluZm8gJiBJTlNOX01VTFQpKSkKLQkgICAgICAmJiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgfHwgKHBpbmZvICYgSU5TTl9XUklURV9ISSkpKQotCSAgICBub3BzICs9IDI7Ci0JICAvKiBNb3N0IG1pcHMxNiBicmFuY2ggaW5zbnMgZG9uJ3QgaGF2ZSBhIGRlbGF5IHNsb3QuCi0JICAgICBJZiBhIHJlYWQgZnJvbSBISSBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGJyYW5jaAotCSAgICAgdG8gYSB3cml0ZSB0byBISSB3ZSBoYXZlIGEgcmVhZCBmb2xsb3dlZCBieSBhIHdyaXRlCi0JICAgICBsZXNzIHRoYW4gMiBpbnNucyBhd2F5LiAgV2UgYXNzdW1lIHRoZSB0YXJnZXQgb2YKLQkgICAgIGEgYnJhbmNoIG1pZ2h0IGJlIGEgd3JpdGUgdG8gSEksIGFuZCBpbnNlcnQgYSBub3AKLQkgICAgIGJldHdlZW4gYSByZWFkIGFuZCBhbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYnJhbmNoLiAqLwotCSAgZWxzZSBpZiAobWlwc19vcHRzLm1pcHMxNgotCQkgICAmJiAobWlwc19vcHRpbWl6ZSA9PSAwCi0JCSAgICAgICB8fCAocGluZm8gJiBNSVBTMTZfSU5TTl9CUkFOQ0gpKSkKLQkgICAgbm9wcyArPSAxOwotCX0KLQotICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBpbiBhIG5vcmVvcmRlciBzZWN0aW9uLCB0aGVuCi0gICAgICAgICB3ZSBkb24ndCB3YW50IHRvIGluc2VydCB0aGUgbm9wIGFmdGVyIGFsbC4gICovCi0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBpZiAocHJldl9pbnNuX3VucmVvcmRlcmVkKQotCW5vcHMgPSAwOwotCi0gICAgICAvKiBUaGVyZSBhcmUgdHdvIGNhc2VzIHdoaWNoIHJlcXVpcmUgdHdvIGludGVydmVuaW5nCi0JIGluc3RydWN0aW9uczogMSkgc2V0dGluZyB0aGUgY29uZGl0aW9uIGNvZGVzIHVzaW5nIGEgbW92ZSB0bwotCSBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiB3aGljaCByZXF1aXJlcyBhIGdlbmVyYWwgY29wcm9jZXNzb3IKLQkgZGVsYXkgYW5kIHRoZW4gcmVhZGluZyB0aGUgY29uZGl0aW9uIGNvZGVzIDIpIHJlYWRpbmcgdGhlIEhJCi0JIG9yIExPIHJlZ2lzdGVyIGFuZCB0aGVuIHdyaXRpbmcgdG8gaXQgKGV4Y2VwdCBvbiBwcm9jZXNzb3JzCi0JIHdoaWNoIGhhdmUgaW50ZXJsb2NrcykuICBJZiB3ZSBhcmUgbm90IGFscmVhZHkgZW1pdHRpbmcgYSBOT1AKLQkgaW5zdHJ1Y3Rpb24sIHdlIG11c3QgY2hlY2sgZm9yIHRoZXNlIGNhc2VzIGNvbXBhcmVkIHRvIHRoZQotCSBpbnN0cnVjdGlvbiBwcmV2aW91cyB0byB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgaWYgKCghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAmJiBtaXBzX29wdHMuaXNhIDwgNAotCSAgICYmIChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fQ09QUk9DX01PVkVfREVMQVkpCi0JICAgJiYgKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpCi0JICAgJiYgKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkKLQkgICAmJiAhIGNvcF9pbnRlcmxvY2tzKQotCSAgfHwgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9MTykKLQkgICAgICAmJiAocGluZm8gJiBJTlNOX1dSSVRFX0xPKQotCSAgICAgICYmICEgKGhpbG9faW50ZXJsb2NrcwotCQkgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpKQotCSAgfHwgKChwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fUkVBRF9ISSkKLQkgICAgICAmJiAocGluZm8gJiBJTlNOX1dSSVRFX0hJKQotCSAgICAgICYmICEgKGhpbG9faW50ZXJsb2NrcwotCQkgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpKSkKLQlwcmV2X3ByZXZfbm9wID0gMTsKLSAgICAgIGVsc2UKLQlwcmV2X3ByZXZfbm9wID0gMDsKLQotICAgICAgaWYgKHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkKQotCXByZXZfcHJldl9ub3AgPSAwOwotCi0gICAgICBpZiAocHJldl9wcmV2X25vcCAmJiBub3BzID09IDApCi0JKytub3BzOwotCi0gICAgICAvKiBJZiB3ZSBhcmUgYmVpbmcgZ2l2ZW4gYSBub3AgaW5zdHJ1Y3Rpb24sIGRvbid0IGJvdGhlciB3aXRoCi0JIG9uZSBvZiB0aGUgbm9wcyB3ZSB3b3VsZCBvdGhlcndpc2Ugb3V0cHV0LiAgVGhpcyB3aWxsIG9ubHkKLQkgaGFwcGVuIHdoZW4gYSBub3AgaW5zdHJ1Y3Rpb24gaXMgdXNlZCB3aXRoIG1pcHNfb3B0aW1pemUgc2V0Ci0JIHRvIDAuICAqLwotICAgICAgaWYgKG5vcHMgPiAwCi0JICAmJiAhIG1pcHNfb3B0cy5ub3Jlb3JkZXIKLQkgICYmIGlwLT5pbnNuX29wY29kZSA9PSAobWlwc19vcHRzLm1pcHMxNiA/IDB4NjUwMCA6IDApKQotCS0tbm9wczsKLQotICAgICAgLyogTm93IGVtaXQgdGhlIHJpZ2h0IG51bWJlciBvZiBOT1AgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICAgIGlmIChub3BzID4gMCAmJiAhIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JewotCSAgZnJhZ1MgKm9sZF9mcmFnOwotCSAgdW5zaWduZWQgbG9uZyBvbGRfZnJhZ19vZmZzZXQ7Ci0JICBpbnQgaTsKLQkgIHN0cnVjdCBpbnNuX2xhYmVsX2xpc3QgKmw7Ci0KLQkgIG9sZF9mcmFnID0gZnJhZ19ub3c7Ci0JICBvbGRfZnJhZ19vZmZzZXQgPSBmcmFnX25vd19maXggKCk7Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBub3BzOyBpKyspCi0JICAgIGVtaXRfbm9wICgpOwotCi0JICBpZiAobGlzdGluZykKLQkgICAgewotCSAgICAgIGxpc3RpbmdfcHJldl9saW5lICgpOwotCSAgICAgIC8qIFdlIG1heSBiZSBhdCB0aGUgc3RhcnQgb2YgYSB2YXJpYW50IGZyYWcuICBJbiBjYXNlIHdlCi0gICAgICAgICAgICAgICAgIGFyZSwgbWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIGZyYWcKLSAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGZyYWdzIGNyZWF0ZWQgYnkgbGlzdGluZ19wcmV2X2xpbmUuICBUaGUKLSAgICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gZnJhZ19ncm93IGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBhcyBsYXJnZQotICAgICAgICAgICAgICAgICBhcyB0aGUgYXJndW1lbnQgdG8gYWxsIG90aGVyIGNhbGxzIHRvIGZyYWdfZ3JvdyBpbgotICAgICAgICAgICAgICAgICB0aGlzIGZpbGUuICBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGJlaW5nIGluIHRoZQotICAgICAgICAgICAgICAgICBtaWRkbGUgb2YgYSB2YXJpYW50IGZyYWcsIGJlY2F1c2UgdGhlIHZhcmlhbnRzIGluc2VydAotICAgICAgICAgICAgICAgICBhbGwgbmVlZGVkIG5vcCBpbnN0cnVjdGlvbnMgdGhlbXNlbHZlcy4gICovCi0JICAgICAgZnJhZ19ncm93ICg0MCk7Ci0JICAgIH0KLQotCSAgZm9yIChsID0gaW5zbl9sYWJlbHM7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBhc3NlcnQgKFNfR0VUX1NFR01FTlQgKGwtPmxhYmVsKSA9PSBub3dfc2VnKTsKLQkgICAgICBzeW1ib2xfc2V0X2ZyYWcgKGwtPmxhYmVsLCBmcmFnX25vdyk7Ci0JICAgICAgU19TRVRfVkFMVUUgKGwtPmxhYmVsLCAodmFsdWVUKSBmcmFnX25vd19maXggKCkpOwotCSAgICAgIC8qIG1pcHMxNiB0ZXh0IGxhYmVscyBhcmUgc3RvcmVkIGFzIG9kZC4gICovCi0JICAgICAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0JCVNfU0VUX1ZBTFVFIChsLT5sYWJlbCwgU19HRVRfVkFMVUUgKGwtPmxhYmVsKSArIDEpOwotCSAgICB9Ci0KLSNpZm5kZWYgTk9fRUNPRkZfREVCVUdHSU5HCi0JICBpZiAoRUNPRkZfREVCVUdHSU5HKQotCSAgICBlY29mZl9maXhfbG9jIChvbGRfZnJhZywgb2xkX2ZyYWdfb2Zmc2V0KTsKLSNlbmRpZgotCX0KLSAgICAgIGVsc2UgaWYgKHByZXZfbm9wX2ZyYWcgIT0gTlVMTCkKLQl7Ci0JICAvKiBXZSBoYXZlIGEgZnJhZyBob2xkaW5nIG5vcHMgd2UgbWF5IGJlIGFibGUgdG8gcmVtb3ZlLiAgSWYKLSAgICAgICAgICAgICB3ZSBkb24ndCBuZWVkIGFueSBub3BzLCB3ZSBjYW4gZGVjcmVhc2UgdGhlIHNpemUgb2YKLSAgICAgICAgICAgICBwcmV2X25vcF9mcmFnIGJ5IHRoZSBzaXplIG9mIG9uZSBpbnN0cnVjdGlvbi4gIElmIHdlIGRvCi0gICAgICAgICAgICAgbmVlZCBzb21lIG5vcHMsIHdlIGNvdW50IHRoZW0gaW4gcHJldl9ub3BzX3JlcXVpcmVkLiAqLwotCSAgaWYgKHByZXZfbm9wX2ZyYWdfc2luY2UgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChub3BzID09IDApCi0JCXsKLQkJICBwcmV2X25vcF9mcmFnLT5mcl9maXggLT0gbWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0OwotCQkgIC0tcHJldl9ub3BfZnJhZ19ob2xkczsKLQkJfQotCSAgICAgIGVsc2UKLQkJcHJldl9ub3BfZnJhZ19yZXF1aXJlZCArPSBub3BzOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAocHJldl9wcmV2X25vcCA9PSAwKQotCQl7Ci0JCSAgcHJldl9ub3BfZnJhZy0+ZnJfZml4IC09IG1pcHNfb3B0cy5taXBzMTYgPyAyIDogNDsKLQkJICAtLXByZXZfbm9wX2ZyYWdfaG9sZHM7Ci0JCX0KLQkgICAgICBlbHNlCi0JCSsrcHJldl9ub3BfZnJhZ19yZXF1aXJlZDsKLQkgICAgfQotCi0JICBpZiAocHJldl9ub3BfZnJhZ19ob2xkcyA8PSBwcmV2X25vcF9mcmFnX3JlcXVpcmVkKQotCSAgICBwcmV2X25vcF9mcmFnID0gTlVMTDsKLQotCSAgKytwcmV2X25vcF9mcmFnX3NpbmNlOwotCi0JICAvKiBTYW5pdHkgY2hlY2s6IGJ5IHRoZSB0aW1lIHdlIHJlYWNoIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24KLSAgICAgICAgICAgICBhZnRlciBwcmV2X25vcF9mcmFnLCB3ZSBzaG91bGQgaGF2ZSB1c2VkIHVwIGFsbCB0aGUgbm9wcwotICAgICAgICAgICAgIG9uZSB3YXkgb3IgYW5vdGhlci4gICovCi0JICBhc3NlcnQgKHByZXZfbm9wX2ZyYWdfc2luY2UgPD0gMSB8fCBwcmV2X25vcF9mcmFnID09IE5VTEwpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHJlbG9jX3R5cGUgPiBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gc2V0IHVwIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgICAgIGFzc2VydCAobWlwc19vcHRzLm1pcHMxNiAmJiBhZGRyZXNzX2V4cHIgIT0gTlVMTCk7Ci0gICAgICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAwLAotCQkgICAgUkVMQVhfTUlQUzE2X0VOQ09ERSAocmVsb2NfdHlwZSAtIEJGRF9SRUxPQ19VTlVTRUQsCi0JCQkJCSBtaXBzMTZfc21hbGwsIG1pcHMxNl9leHQsCi0JCQkJCSAocHJldl9waW5mbwotCQkJCQkgICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKSwKLQkJCQkJIChwcmV2X2luc25fcmVsb2NfdHlwZQotCQkJCQkgID09IEJGRF9SRUxPQ19NSVBTMTZfSk1QKSksCi0JCSAgICBtYWtlX2V4cHJfc3ltYm9sIChhZGRyZXNzX2V4cHIpLCAob2Zmc2V0VCkgMCwKLQkJICAgIChjaGFyICopIE5VTEwpOwotICAgIH0KLSAgZWxzZSBpZiAocGxhY2UgIT0gTlVMTCkKLSAgICBmID0gcGxhY2U7Ci0gIGVsc2UgaWYgKG1pcHNfb3B0cy5taXBzMTYKLQkgICAmJiAhIGlwLT51c2VfZXh0ZW5kCi0JICAgJiYgcmVsb2NfdHlwZSAhPSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gc3dhcCB0aGlzIGluc3RydWN0aW9uIHdpdGgKLSAgICAgICAgIGEgZm9sbG93aW5nIGp1bXAgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZnJhZ19ncm93ICg2KTsKLSAgICAgIGYgPSBmcmFnX21vcmUgKDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChtaXBzX29wdHMubWlwczE2Ci0JICAmJiBtaXBzX29wdHMubm9yZW9yZGVyCi0JICAmJiAocHJldl9waW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkgIT0gMCkKLQlhc193YXJuIChfKCJleHRlbmRlZCBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IikpOwotCi0gICAgICBmID0gZnJhZ19tb3JlICg0KTsKLSAgICB9Ci0KLSAgZml4cCA9IE5VTEw7Ci0gIGlmIChhZGRyZXNzX2V4cHIgIT0gTlVMTCAmJiByZWxvY190eXBlIDwgQkZEX1JFTE9DX1VOVVNFRCkKLSAgICB7Ci0gICAgICBpZiAoYWRkcmVzc19leHByLT5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgc3dpdGNoIChyZWxvY190eXBlKQotCSAgICB7Ci0JICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlcjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDB4ZmZmZjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0pNUDoKLQkgICAgICBpZiAoKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMykgIT0gMCkKLQkJYXNfYmFkIChfKCJqdW1wIHRvIG1pc2FsaWduZWQgYWRkcmVzcyAoMHglbHgpIiksCi0JCQkodW5zaWduZWQgbG9uZykgYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIpOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSAoYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIgPj4gMikgJiAweDNmZmZmZmY7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQUzE2X0pNUDoKLQkgICAgICBpZiAoKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMykgIT0gMCkKLQkJYXNfYmFkIChfKCJqdW1wIHRvIG1pc2FsaWduZWQgYWRkcmVzcyAoMHglbHgpIiksCi0JCQkodW5zaWduZWQgbG9uZykgYWRkcmVzc19leHByLT5YX2FkZF9udW1iZXIpOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PQotCQkoKChhZGRyZXNzX2V4cHItPlhfYWRkX251bWJlciAmIDB4N2MwMDAwKSA8PCAzKQotCQkgfCAoKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMHhmODAwMDAwKSA+PiA3KQotCQkgfCAoKGFkZHJlc3NfZXhwci0+WF9hZGRfbnVtYmVyICYgMHgzZmZmYykgPj4gMikpOwotCSAgICAgIGJyZWFrOwotCi0KLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfUENSRUxfUzI6Ci0JICAgICAgZ290byBuZWVkX3JlbG9jOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JbmVlZF9yZWxvYzoKLQkgIC8qIERvbid0IGdlbmVyYXRlIGEgcmVsb2MgaWYgd2UgYXJlIHdyaXRpbmcgaW50byBhIHZhcmlhbnQKLQkgICAgIGZyYWcuICAqLwotCSAgaWYgKHBsYWNlID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBmaXhwID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCQkJICBhZGRyZXNzX2V4cHIsCi0JCQkJICByZWxvY190eXBlID09IEJGRF9SRUxPQ18xNl9QQ1JFTF9TMiwKLQkJCQkgIHJlbG9jX3R5cGUpOwotCSAgICAgIGlmICh1bm1hdGNoZWRfaGkpCi0JCXsKLQkJICBzdHJ1Y3QgbWlwc19oaV9maXh1cCAqaGlfZml4dXA7Ci0KLQkJICBhc3NlcnQgKHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DX0hJMTZfUyk7Ci0JCSAgaGlfZml4dXAgPSAoKHN0cnVjdCBtaXBzX2hpX2ZpeHVwICopCi0JCQkgICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBtaXBzX2hpX2ZpeHVwKSkpOwotCQkgIGhpX2ZpeHVwLT5maXhwID0gZml4cDsKLQkJICBoaV9maXh1cC0+c2VnID0gbm93X3NlZzsKLQkJICBoaV9maXh1cC0+bmV4dCA9IG1pcHNfaGlfZml4dXBfbGlzdDsKLQkJICBtaXBzX2hpX2ZpeHVwX2xpc3QgPSBoaV9maXh1cDsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoISBtaXBzX29wdHMubWlwczE2KQotICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaXAtPmluc25fb3Bjb2RlLCA0KTsKLSAgZWxzZSBpZiAocmVsb2NfdHlwZSA9PSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGlwLT5pbnNuX29wY29kZSA+PiAxNiwgMik7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGYgKyAyLCBpcC0+aW5zbl9vcGNvZGUgJiAweGZmZmYsIDIpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpcC0+dXNlX2V4dGVuZCkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIDB4ZjAwMCB8IGlwLT5leHRlbmQsIDIpOwotCSAgZiArPSAyOwotCX0KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaXAtPmluc25fb3Bjb2RlLCAyKTsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIHRoZSByZWdpc3RlciBtYXNrIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKCEgbWlwc19vcHRzLm1pcHMxNikKLSAgICB7Ci0gICAgICBpZiAocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpOwotICAgICAgaWYgKChwaW5mbyAmIChJTlNOX1dSSVRFX0dQUl9UIHwgSU5TTl9SRUFEX0dQUl9UKSkgIT0gMCkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKTsKLSAgICAgIGlmIChwaW5mbyAmIElOU05fUkVBRF9HUFJfUykKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SUykgJiBPUF9NQVNLX1JTKTsKLSAgICAgIGlmIChwaW5mbyAmIElOU05fV1JJVEVfR1BSXzMxKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8IDMxOwotICAgICAgaWYgKHBpbmZvICYgSU5TTl9XUklURV9GUFJfRCkKLQltaXBzX2Nwcm1hc2tbMV0gfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GRCkgJiBPUF9NQVNLX0ZEKTsKLSAgICAgIGlmICgocGluZm8gJiAoSU5TTl9XUklURV9GUFJfUyB8IElOU05fUkVBRF9GUFJfUykpICE9IDApCi0JbWlwc19jcHJtYXNrWzFdIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gT1BfU0hfRlMpICYgT1BfTUFTS19GUyk7Ci0gICAgICBpZiAoKHBpbmZvICYgKElOU05fV1JJVEVfRlBSX1QgfCBJTlNOX1JFQURfRlBSX1QpKSAhPSAwKQotCW1pcHNfY3BybWFza1sxXSB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE9QX1NIX0ZUKSAmIE9QX01BU0tfRlQpOwotICAgICAgaWYgKChwaW5mbyAmIElOU05fUkVBRF9GUFJfUikgIT0gMCkKLQltaXBzX2Nwcm1hc2tbMV0gfD0gMSA8PCAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9GUikgJiBPUF9NQVNLX0ZSKTsKLSAgICAgIGlmIChwaW5mbyAmIElOU05fQ09QKQotCXsKLQkgIC8qIFdlIGRvbid0IGtlZXAgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHNvcnQgdGhlc2UgY2FzZXMgb3V0LiAKLQkgICAgIFRoZSBpdGJsIHN1cHBvcnQgZG9lcyBrZWVwIHRoaXMgaW5mb3JtYXRpb24gaG93ZXZlciwgYWx0aG91Z2ggCi0JICAgICB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBpdGJsIGZwcm1hdHMgYXMgcGFydCBvZiB0aGUgY29wIAotCSAgICAgaW5zdHJ1Y3Rpb24uICBNYXkgd2FudCB0byBhZGQgdGhpcyBzdXBwb3J0IGluIHRoZSBmdXR1cmUuICovCi0JfQotICAgICAgLyogTmV2ZXIgc2V0IHRoZSBiaXQgZm9yICQwLCB3aGljaCBpcyBhbHdheXMgemVyby4gICovCi0gICAgICBtaXBzX2dwcm1hc2sgJj1+IDEgPDwgMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfWCB8IE1JUFMxNl9JTlNOX1JFQURfWCkpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlgpCi0JCQkgICAgICAmIE1JUFMxNk9QX01BU0tfUlgpOwotICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFX1kgfCBNSVBTMTZfSU5TTl9SRUFEX1kpKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8ICgoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JZKQotCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX1JZKTsKLSAgICAgIGlmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1opCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUlopCi0JCQkgICAgICAmIE1JUFMxNk9QX01BU0tfUlopOwotICAgICAgaWYgKHBpbmZvICYgKE1JUFMxNl9JTlNOX1dSSVRFX1QgfCBNSVBTMTZfSU5TTl9SRUFEX1QpKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8IFRSRUc7Ci0gICAgICBpZiAocGluZm8gJiAoTUlQUzE2X0lOU05fV1JJVEVfU1AgfCBNSVBTMTZfSU5TTl9SRUFEX1NQKSkKLQltaXBzX2dwcm1hc2sgfD0gMSA8PCBTUDsKLSAgICAgIGlmIChwaW5mbyAmIChNSVBTMTZfSU5TTl9XUklURV8zMSB8IE1JUFMxNl9JTlNOX1JFQURfMzEpKQotCW1pcHNfZ3BybWFzayB8PSAxIDw8IFJBOwotICAgICAgaWYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKGlwLT5pbnNuX29wY29kZSk7Ci0gICAgICBpZiAocGluZm8gJiBNSVBTMTZfSU5TTl9SRUFEX1opCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfTU9WRTMyWikKLQkJCSAgICAgICYgTUlQUzE2T1BfTUFTS19NT1ZFMzJaKTsKLSAgICAgIGlmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfR1BSX1gpCi0JbWlwc19ncHJtYXNrIHw9IDEgPDwgKChpcC0+aW5zbl9vcGNvZGUgPj4gTUlQUzE2T1BfU0hfUkVHUjMyKQotCQkJICAgICAgJiBNSVBTMTZPUF9NQVNLX1JFR1IzMik7Ci0gICAgfQotCi0gIGlmIChwbGFjZSA9PSBOVUxMICYmICEgbWlwc19vcHRzLm5vcmVvcmRlcikKLSAgICB7Ci0gICAgICAvKiBGaWxsaW5nIHRoZSBicmFuY2ggZGVsYXkgc2xvdCBpcyBtb3JlIGNvbXBsZXguICBXZSB0cnkgdG8KLQkgc3dpdGNoIHRoZSBicmFuY2ggd2l0aCB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24sIHdoaWNoIHdlIGNhbgotCSBkbyBpZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qgc2V0IHVwIGEgY29uZGl0aW9uCi0JIHRoYXQgdGhlIGJyYW5jaCB0ZXN0cyBhbmQgaWYgdGhlIGJyYW5jaCBpcyBub3QgaXRzZWxmIHRoZQotCSB0YXJnZXQgb2YgYW55IGJyYW5jaC4gICovCi0gICAgICBpZiAoKHBpbmZvICYgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZKQotCSAgfHwgKHBpbmZvICYgSU5TTl9DT05EX0JSQU5DSF9ERUxBWSkpCi0JewotCSAgaWYgKG1pcHNfb3B0aW1pemUgPCAyCi0JICAgICAgLyogSWYgd2UgaGF2ZSBzZWVuIC5zZXQgdm9sYXRpbGUgb3IgLnNldCBub21vdmUsIGRvbid0Ci0JCSBvcHRpbWl6ZS4gICovCi0JICAgICAgfHwgbWlwc19vcHRzLm5vbW92ZSAhPSAwCi0JICAgICAgLyogSWYgd2UgaGFkIHRvIGVtaXQgYW55IE5PUCBpbnN0cnVjdGlvbnMsIHRoZW4gd2UKLQkJIGFscmVhZHkga25vdyB3ZSBjYW4gbm90IHN3YXAuICAqLwotCSAgICAgIHx8IG5vcHMgIT0gMAotCSAgICAgIC8qIElmIHdlIGRvbid0IGV2ZW4ga25vdyB0aGUgcHJldmlvdXMgaW5zbiwgd2UgY2FuIG5vdAotCQkgc3dhcC4gKi8KLQkgICAgICB8fCAhIHByZXZfaW5zbl92YWxpZAotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnNuIGlzIGFscmVhZHkgaW4gYSBicmFuY2ggZGVsYXkKLQkJIHNsb3QsIHRoZW4gd2UgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCBwcmV2X2luc25faXNfZGVsYXlfc2xvdAotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBwcmV2aW91cyBpbnNuIHdhcyBpbiBhIC5zZXQKLQkJIG5vcmVvcmRlciwgd2UgY2FuJ3Qgc3dhcC4gIEFjdHVhbGx5LCB0aGUgTUlQUwotCQkgYXNzZW1ibGVyIHdpbGwgc3dhcCBpbiB0aGlzIHNpdHVhdGlvbi4gIEhvd2V2ZXIsIGdjYwotCQkgY29uZmlndXJlZCAtd2l0aC1nbnUtYXMgd2lsbCBnZW5lcmF0ZSBjb2RlIGxpa2UKLQkJICAgLnNldCBub3Jlb3JkZXIKLQkJICAgbHcJJDQsWFhYCi0JCSAgIC5zZXQJcmVvcmRlcgotCQkgICBJTlNOCi0JCSAgIGJuZQkkNCwkMCxmb28KLQkJIGluIHdoaWNoIHdlIGNhbiBub3Qgc3dhcCB0aGUgYm5lIGFuZCBJTlNOLiAgSWYgZ2NjIGlzCi0JCSBub3QgY29uZmlndXJlZCAtd2l0aC1nbnUtYXMsIGl0IGRvZXMgbm90IG91dHB1dCB0aGUKLQkJIC5zZXQgcHNldWRvLW9wcy4gIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sKLQkJIHByZXZfaW5zbl91bnJlb3JkZXJlZCwgYmVjYXVzZSBwcmV2X2luc25fdmFsaWQgd2lsbAotCQkgYmUgMCBpbiB0aGF0IGNhc2UuICBXZSBkb24ndCB3YW50IHRvIHVzZQotCQkgcHJldl9wcmV2X2luc25fdmFsaWQsIGJlY2F1c2Ugd2UgZG8gd2FudCB0byBiZSBhYmxlCi0JCSB0byBzd2FwIGF0IHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLiAgKi8KLQkgICAgICB8fCBwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZAotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggaXMgaXRzZWxmIHRoZSB0YXJnZXQgb2YgYSBicmFuY2gsIHdlCi0JCSBjYW4gbm90IHN3YXAuICBXZSBjaGVhdCBvbiB0aGlzOyBhbGwgd2UgY2hlY2sgZm9yIGlzCi0JCSB3aGV0aGVyIHRoZXJlIGlzIGEgbGFiZWwgb24gdGhpcyBpbnN0cnVjdGlvbi4gIElmCi0JCSB0aGVyZSBhcmUgYW55IGJyYW5jaGVzIHRvIGFueXRoaW5nIG90aGVyIHRoYW4gYQotCQkgbGFiZWwsIHVzZXJzIG11c3QgdXNlIC5zZXQgbm9yZW9yZGVyLiAgKi8KLQkgICAgICB8fCBpbnNuX2xhYmVscyAhPSBOVUxMCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGluIGEgdmFyaWFudCBmcmFnLCB3ZQotCQkgY2FuIG5vdCBkbyB0aGUgc3dhcC4gIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gdGhlCi0JCSBtaXBzMTYsIHdoaWNoIHVzZXMgdmFyaWFudCBmcmFncyBmb3IgZGlmZmVyZW50Ci0JCSBwdXJwb3Nlcy4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIHByZXZfaW5zbl9mcmFnLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggcmVhZHMgdGhlIGNvbmRpdGlvbiBjb2Rlcywgd2UgZG9uJ3QKLQkJIGV2ZW4gdHJ5IHRvIHN3YXAsIGJlY2F1c2UgaW4gdGhlIHNlcXVlbmNlCi0JCSAgIGN0YzEgJFgsJDMxCi0JCSAgIElOU04KLQkJICAgSU5TTgotCQkgICBiYzF0IExBQkVMCi0JCSB3ZSBjYW4gbm90IHN3YXAsIGFuZCBJIGRvbid0IGZlZWwgbGlrZSBoYW5kbGluZyB0aGF0Ci0JCSBjYXNlLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkJICAmJiAocGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkKLQkgICAgICAvKiBXZSBjYW4gbm90IHN3YXAgd2l0aCBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlcXVpcmVzIGEKLQkJIGRlbGF5IHNsb3QsIGJlY2FzZSB0aGUgdGFyZ2V0IG9mIHRoZSBicmFuY2ggbWlnaHQKLQkJIGludGVyZmVyZSB3aXRoIHRoYXQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiBtaXBzX29wdHMuaXNhIDwgNAotCQkgICYmIChwcmV2X3BpbmZvCi0gICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkJICAgICAgJiAoSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotCQkJIHwgSU5TTl9DT1BST0NfTU9WRV9ERUxBWQotCQkJIHwgSU5TTl9XUklURV9DT05EX0NPREUpKSkKLQkgICAgICB8fCAoISAoaGlsb19pbnRlcmxvY2tzCi0JCSAgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKHBpbmZvICYgSU5TTl9NVUxUKSkpCi0JCSAgJiYgKHByZXZfcGluZm8KLQkJICAgICAgJiAoSU5TTl9SRUFEX0xPCi0JCQkgfCBJTlNOX1JFQURfSEkpKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgISBncHJfaW50ZXJsb2NrcwotCQkgICYmIChwcmV2X3BpbmZvICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIG1pcHNfb3B0cy5pc2EgPCAyCi0gICAgICAgICAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkpKQotCSAgICAgIC8qIFdlIGNhbiBub3Qgc3dhcCB3aXRoIGEgYnJhbmNoIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICB8fCAocHJldl9waW5mbwotCQkgICYgKElOU05fVU5DT05EX0JSQU5DSF9ERUxBWQotCQkgICAgIHwgSU5TTl9DT05EX0JSQU5DSF9ERUxBWQotCQkgICAgIHwgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkpKQotCSAgICAgIC8qIFdlIGRvIG5vdCBzd2FwIHdpdGggYSB0cmFwIGluc3RydWN0aW9uLCBzaW5jZSBpdAotCQkgY29tcGxpY2F0ZXMgdHJhcCBoYW5kbGVycyB0byBoYXZlIHRoZSB0cmFwCi0JCSBpbnN0cnVjdGlvbiBiZSBpbiBhIGRlbGF5IHNsb3QuICAqLwotCSAgICAgIHx8IChwcmV2X3BpbmZvICYgSU5TTl9UUkFQKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggcmVhZHMgYSByZWdpc3RlciB0aGF0IHRoZSBwcmV2aW91cwotCQkgaW5zdHJ1Y3Rpb24gc2V0cywgd2UgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9UKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCQkgICAgICYgT1BfTUFTS19SVCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCSAgICAoKHByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLQkJCQkgICAgICYgT1BfTUFTS19SRCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmICgoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9YKQotCQkgICAgICAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAoKHByZXZfaW5zbi5pbnNuX29wY29kZQotCQkJCQkgICA+PiBNSVBTMTZPUF9TSF9SWCkKLQkJCQkJICAmIE1JUFMxNk9QX01BU0tfUlgpLAotCQkJCQkgTUlQUzE2X1JFRykpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX1kpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLAotCQkJCQkgICAgKChwcmV2X2luc24uaW5zbl9vcGNvZGUKLQkJCQkJICAgICAgPj4gTUlQUzE2T1BfU0hfUlkpCi0JCQkJCSAgICAgJiBNSVBTMTZPUF9NQVNLX1JZKSwKLQkJCQkJICAgIE1JUFMxNl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9aKQotCQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkJICAgICgocHJldl9pbnNuLmluc25fb3Bjb2RlCi0JCQkJCSAgICAgID4+IE1JUFMxNk9QX1NIX1JaKQotCQkJCQkgICAgICYgTUlQUzE2T1BfTUFTS19SWiksCi0JCQkJCSAgICBNSVBTMTZfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfVCkKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsIFRSRUcsIE1JUFNfR1JfUkVHKSkKLQkJICAgICAgfHwgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCQkgICYmIGluc25fdXNlc19yZWcgKGlwLCBSQSwgTUlQU19HUl9SRUcpKQotCQkgICAgICB8fCAoKHByZXZfcGluZm8gJiBNSVBTMTZfSU5TTl9XUklURV9HUFJfWSkKLQkJCSAgJiYgaW5zbl91c2VzX3JlZyAoaXAsCi0JCQkJCSAgICBNSVBTMTZPUF9FWFRSQUNUX1JFRzMyUiAocHJldl9pbnNuLgotCQkJCQkJCQkgICAgIGluc25fb3Bjb2RlKSwKLQkJCQkJICAgIE1JUFNfR1JfUkVHKSkpKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggd3JpdGVzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIHNldHMsIHdlIGNhbiBub3Qgc3dhcCAod2Uga25vdyB0aGF0Ci0JCSBicmFuY2hlcyB3cml0ZSBvbmx5IHRvIFJEIG9yIHRvICQzMSkuICAqLwotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX1QpCi0JCSAgJiYgKCgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICAgICAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKSAmIE9QX01BU0tfUlQpCi0JCQkgICA9PSAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKSkpCi0JCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQkJCSAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JUKQotCQkJICAgICAgICYgT1BfTUFTS19SVCkKLQkJCSAgICAgID09IDMxKSkpKQotCSAgICAgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfR1BSX0QpCi0JCSAgJiYgKCgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl9EKQotCQkgICAgICAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpCi0JCQkgICA9PSAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkgJiBPUF9NQVNLX1JEKSkpCi0JCSAgICAgIHx8ICgocGluZm8gJiBJTlNOX1dSSVRFX0dQUl8zMSkKLQkJCSAgJiYgKCgocHJldl9pbnNuLmluc25fb3Bjb2RlID4+IE9QX1NIX1JEKQotCQkJICAgICAgICYgT1BfTUFTS19SRCkKLQkJCSAgICAgID09IDMxKSkpKQotCSAgICAgIHx8IChtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCSAgJiYgKChwcmV2X3BpbmZvICYgTUlQUzE2X0lOU05fV1JJVEVfMzEpCi0JCSAgICAgIHx8ICgocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZKQotCQkJICAmJiAoTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKHByZXZfaW5zbi5pbnNuX29wY29kZSkKLQkJCSAgICAgID09IFJBKSkpKQotCSAgICAgIC8qIElmIHRoZSBicmFuY2ggd3JpdGVzIGEgcmVnaXN0ZXIgdGhhdCB0aGUgcHJldmlvdXMKLQkJIGluc3RydWN0aW9uIHJlYWRzLCB3ZSBjYW4gbm90IHN3YXAgKHdlIGtub3cgdGhhdAotCQkgYnJhbmNoZXMgb25seSB3cml0ZSB0byBSRCBvciB0byAkMzEpLiAgKi8KLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfRCkKLQkJICAmJiBpbnNuX3VzZXNfcmVnICgmcHJldl9pbnNuLAotCQkJCSAgICAoKGlwLT5pbnNuX29wY29kZSA+PiBPUF9TSF9SRCkKLQkJCQkgICAgICYgT1BfTUFTS19SRCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JCSAgJiYgKHBpbmZvICYgSU5TTl9XUklURV9HUFJfMzEpCi0JCSAgJiYgaW5zbl91c2VzX3JlZyAoJnByZXZfaW5zbiwgMzEsIE1JUFNfR1JfUkVHKSkKLQkgICAgICB8fCAobWlwc19vcHRzLm1pcHMxNgotCQkgICYmIChwaW5mbyAmIE1JUFMxNl9JTlNOX1dSSVRFXzMxKQotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sIFJBLCBNSVBTX0dSX1JFRykpCi0JICAgICAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUsIHRoZSBicmFuY2gKLQkJIG1pZ2h0IGJlIGV4cGFuZGVkIGludG8gYSBzZXF1ZW5jZSB3aGljaCB1c2VzICRhdCwgc28KLQkJIHdlIGNhbid0IHN3YXAgd2l0aCBhbiBpbnN0cnVjdGlvbiB3aGljaCByZWFkcyBpdC4gICovCi0JICAgICAgfHwgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotCQkgICYmIGluc25fdXNlc19yZWcgKCZwcmV2X2luc24sIEFULCBNSVBTX0dSX1JFRykpCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIHByZXZpb3VzIGluc3RydWN0aW9uIGhhcyBhIGxvYWQKLQkJIGRlbGF5LCBhbmQgc2V0cyBhIHJlZ2lzdGVyIHRoYXQgdGhlIGJyYW5jaCByZWFkcywgd2UKLQkJIGNhbiBub3Qgc3dhcC4gICovCi0JICAgICAgfHwgKCEgbWlwc19vcHRzLm1pcHMxNgotCQkgICYmIG1pcHNfb3B0cy5pc2EgPCA0Ci0gICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkJICAmJiAoKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvICYgSU5TTl9MT0FEX0NPUFJPQ19ERUxBWSkKLQkJICAgICAgfHwgKCEgZ3ByX2ludGVybG9ja3MKLQkJCSAgJiYgKHByZXZfcHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0JCQkgICAgICAmIElOU05fTE9BRF9NRU1PUllfREVMQVkpKSkKLQkJICAmJiBpbnNuX3VzZXNfcmVnIChpcCwKLQkJCQkgICAgKChwcmV2X3ByZXZfaW5zbi5pbnNuX29wY29kZSA+PiBPUF9TSF9SVCkKLQkJCQkgICAgICYgT1BfTUFTS19SVCksCi0JCQkJICAgIE1JUFNfR1JfUkVHKSkKLQkgICAgICAvKiBJZiBvbmUgaW5zdHJ1Y3Rpb24gc2V0cyBhIGNvbmRpdGlvbiBjb2RlIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgb3RoZXIgb25lIHVzZXMgYSBjb25kaXRpb24gY29kZSwgd2UgY2FuIG5vdCBzd2FwLiAgKi8KLQkgICAgICB8fCAoKHBpbmZvICYgSU5TTl9SRUFEX0NPTkRfQ09ERSkKLQkJICAmJiAocHJldl9waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKSkKLQkgICAgICB8fCAoKHBpbmZvICYgSU5TTl9XUklURV9DT05EX0NPREUpCi0JCSAgJiYgKHByZXZfcGluZm8gJiBJTlNOX1JFQURfQ09ORF9DT0RFKSkKLQkgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gdXNlcyB0aGUgUEMsIHdlIGNhbiBub3QKLSAgICAgICAgICAgICAgICAgc3dhcC4gICovCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYKLQkJICAmJiAocHJldl9waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfUEMpKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgZXh0ZW5kZWQsIHdlIGNhbiBub3QKLSAgICAgICAgICAgICAgICAgc3dhcC4gICovCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYgJiYgcHJldl9pbnNuX2V4dGVuZGVkKQotCSAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiBoYWQgYSBmaXh1cCBpbiBtaXBzMTYKLSAgICAgICAgICAgICAgICAgbW9kZSwgd2UgY2FuIG5vdCBzd2FwLiAgVGhpcyBub3JtYWxseSBtZWFucyB0aGF0IHRoZQotICAgICAgICAgICAgICAgICBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgYSA0IGJ5dGUgYnJhbmNoIGFueWhvdy4gICovCi0JICAgICAgfHwgKG1pcHNfb3B0cy5taXBzMTYgJiYgcHJldl9pbnNuX2ZpeHApCi0JICAgICAgLyogSWYgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIGlzIGEgc3luYywgc3luYy5sLCBvciAKLQkJIHN5bmMucCwgd2UgY2FuIG5vdCBzd2FwLiAqLwotCSAgICAgIHx8IChwcmV2X3BpbmZvICYmIElOU05fU1lOQykpCi0JICAgIHsKLQkgICAgICAvKiBXZSBjb3VsZCBkbyBldmVuIGJldHRlciBmb3IgdW5jb25kaXRpb25hbCBicmFuY2hlcyB0bwotCQkgcG9ydGlvbnMgb2YgdGhpcyBvYmplY3QgZmlsZTsgd2UgY291bGQgcGljayB1cCB0aGUKLQkJIGluc3RydWN0aW9uIGF0IHRoZSBkZXN0aW5hdGlvbiwgcHV0IGl0IGluIHRoZSBkZWxheQotCQkgc2xvdCwgYW5kIGJ1bXAgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MuICAqLwotCSAgICAgIGVtaXRfbm9wICgpOwotCSAgICAgIC8qIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW5zbiBpbmZvcm1hdGlvbi4gICovCi0JICAgICAgcHJldl9wcmV2X2luc24gPSAqaXA7Ci0JICAgICAgcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBJdCBsb29rcyBsaWtlIHdlIGNhbiBhY3R1YWxseSBkbyB0aGUgc3dhcC4gICovCi0JICAgICAgaWYgKCEgbWlwc19vcHRzLm1pcHMxNikKLQkJewotCQkgIGNoYXIgKnByZXZfZjsKLQkJICBjaGFyIHRlbXBbNF07Ci0KLQkJICBwcmV2X2YgPSBwcmV2X2luc25fZnJhZy0+ZnJfbGl0ZXJhbCArIHByZXZfaW5zbl93aGVyZTsKLQkJICBtZW1jcHkgKHRlbXAsIHByZXZfZiwgNCk7Ci0JCSAgbWVtY3B5IChwcmV2X2YsIGYsIDQpOwotCQkgIG1lbWNweSAoZiwgdGVtcCwgNCk7Ci0JCSAgaWYgKHByZXZfaW5zbl9maXhwKQotCQkgICAgewotCQkgICAgICBwcmV2X2luc25fZml4cC0+ZnhfZnJhZyA9IGZyYWdfbm93OwotCQkgICAgICBwcmV2X2luc25fZml4cC0+Znhfd2hlcmUgPSBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWw7Ci0JCSAgICB9Ci0JCSAgaWYgKGZpeHApCi0JCSAgICB7Ci0JCSAgICAgIGZpeHAtPmZ4X2ZyYWcgPSBwcmV2X2luc25fZnJhZzsKLQkJICAgICAgZml4cC0+Znhfd2hlcmUgPSBwcmV2X2luc25fd2hlcmU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjaGFyICpwcmV2X2Y7Ci0JCSAgY2hhciB0ZW1wWzJdOwotCi0JCSAgYXNzZXJ0IChwcmV2X2luc25fZml4cCA9PSBOVUxMKTsKLQkJICBwcmV2X2YgPSBwcmV2X2luc25fZnJhZy0+ZnJfbGl0ZXJhbCArIHByZXZfaW5zbl93aGVyZTsKLQkJICBtZW1jcHkgKHRlbXAsIHByZXZfZiwgMik7Ci0JCSAgbWVtY3B5IChwcmV2X2YsIGYsIDIpOwotCQkgIGlmIChyZWxvY190eXBlICE9IEJGRF9SRUxPQ19NSVBTMTZfSk1QKQotCQkgICAgewotCQkgICAgICBhc3NlcnQgKHJlbG9jX3R5cGUgPT0gQkZEX1JFTE9DX1VOVVNFRCk7Ci0JCSAgICAgIG1lbWNweSAoZiwgdGVtcCwgMik7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBtZW1jcHkgKGYsIGYgKyAyLCAyKTsKLQkJICAgICAgbWVtY3B5IChmICsgMiwgdGVtcCwgMik7Ci0JCSAgICB9Ci0JCSAgaWYgKGZpeHApCi0JCSAgICB7Ci0JCSAgICAgIGZpeHAtPmZ4X2ZyYWcgPSBwcmV2X2luc25fZnJhZzsKLQkJICAgICAgZml4cC0+Znhfd2hlcmUgPSBwcmV2X2luc25fd2hlcmU7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIC8qIFVwZGF0ZSB0aGUgcHJldmlvdXMgaW5zbiBpbmZvcm1hdGlvbjsgbGVhdmUgcHJldl9pbnNuCi0JCSB1bmNoYW5nZWQuICAqLwotCSAgICAgIHByZXZfcHJldl9pbnNuID0gKmlwOwotCSAgICB9Ci0JICBwcmV2X2luc25faXNfZGVsYXlfc2xvdCA9IDE7Ci0KLQkgIC8qIElmIHRoYXQgd2FzIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBmb3JnZXQgdGhlIHByZXZpb3VzCi0JICAgICBpbnNuIGluZm9ybWF0aW9uLiAgKi8KLQkgIGlmIChwaW5mbyAmIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSkKLQkgICAgewotCSAgICAgIHByZXZfcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotCSAgICAgIHByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgICAgfQotCi0JICBwcmV2X2luc25fZml4cCA9IE5VTEw7Ci0JICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICBwcmV2X2luc25fZXh0ZW5kZWQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKHBpbmZvICYgSU5TTl9DT05EX0JSQU5DSF9MSUtFTFkpCi0JewotCSAgLyogV2UgZG9uJ3QgeWV0IG9wdGltaXplIGEgYnJhbmNoIGxpa2VseS4gIFdoYXQgd2Ugc2hvdWxkIGRvCi0JICAgICBpcyBsb29rIGF0IHRoZSB0YXJnZXQsIGNvcHkgdGhlIGluc3RydWN0aW9uIGZvdW5kIHRoZXJlCi0JICAgICBpbnRvIHRoZSBkZWxheSBzbG90LCBhbmQgaW5jcmVtZW50IHRoZSBicmFuY2ggdG8ganVtcCB0bwotCSAgICAgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgZW1pdF9ub3AgKCk7Ci0JICAvKiBVcGRhdGUgdGhlIHByZXZpb3VzIGluc24gaW5mb3JtYXRpb24uICAqLwotCSAgcHJldl9wcmV2X2luc24gPSAqaXA7Ci0JICBwcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0JICBwcmV2X2luc25fZml4cCA9IE5VTEw7Ci0JICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0JICBwcmV2X2luc25fZXh0ZW5kZWQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBVcGRhdGUgdGhlIHByZXZpb3VzIGluc24gaW5mb3JtYXRpb24uICAqLwotCSAgaWYgKG5vcHMgPiAwKQotCSAgICBwcmV2X3ByZXZfaW5zbi5pbnNuX21vID0gJmR1bW15X29wY29kZTsKLQkgIGVsc2UKLQkgICAgcHJldl9wcmV2X2luc24gPSBwcmV2X2luc247Ci0JICBwcmV2X2luc24gPSAqaXA7Ci0KLQkgIC8qIEFueSB0aW1lIHdlIHNlZSBhIGJyYW5jaCwgd2UgYWx3YXlzIGZpbGwgdGhlIGRlbGF5IHNsb3QKLQkgICAgIGltbWVkaWF0ZWx5OyBzaW5jZSB0aGlzIGluc24gaXMgbm90IGEgYnJhbmNoLCB3ZSBrbm93IGl0Ci0JICAgICBpcyBub3QgaW4gYSBkZWxheSBzbG90LiAgKi8KLQkgIHByZXZfaW5zbl9pc19kZWxheV9zbG90ID0gMDsKLQotCSAgcHJldl9pbnNuX2ZpeHAgPSBmaXhwOwotCSAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSByZWxvY190eXBlOwotCSAgaWYgKG1pcHNfb3B0cy5taXBzMTYpCi0JICAgIHByZXZfaW5zbl9leHRlbmRlZCA9IChpcC0+dXNlX2V4dGVuZAotCQkJCSAgfHwgcmVsb2NfdHlwZSA+IEJGRF9SRUxPQ19VTlVTRUQpOwotCX0KLQotICAgICAgcHJldl9wcmV2X2luc25fdW5yZW9yZGVyZWQgPSBwcmV2X2luc25fdW5yZW9yZGVyZWQ7Ci0gICAgICBwcmV2X2luc25fdW5yZW9yZGVyZWQgPSAwOwotICAgICAgcHJldl9pbnNuX2ZyYWcgPSBmcmFnX25vdzsKLSAgICAgIHByZXZfaW5zbl93aGVyZSA9IGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbDsKLSAgICAgIHByZXZfaW5zbl92YWxpZCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChwbGFjZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIG5lZWQgdG8gcmVjb3JkIGEgYml0IG9mIGluZm9ybWF0aW9uIGV2ZW4gd2hlbiB3ZSBhcmUgbm90Ci0gICAgICAgICByZW9yZGVyaW5nLCBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIGJhc2UgYWRkcmVzcyBmb3IgbWlwczE2Ci0gICAgICAgICBQQyByZWxhdGl2ZSByZWxvY3MuICAqLwotICAgICAgcHJldl9wcmV2X2luc24gPSBwcmV2X2luc247Ci0gICAgICBwcmV2X2luc24gPSAqaXA7Ci0gICAgICBwcmV2X2luc25fcmVsb2NfdHlwZSA9IHJlbG9jX3R5cGU7Ci0gICAgICBwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCA9IHByZXZfaW5zbl91bnJlb3JkZXJlZDsKLSAgICAgIHByZXZfaW5zbl91bnJlb3JkZXJlZCA9IDE7Ci0gICAgfQotCi0gIC8qIFdlIGp1c3Qgb3V0cHV0IGFuIGluc24sIHNvIHRoZSBuZXh0IG9uZSBkb2Vzbid0IGhhdmUgYSBsYWJlbC4gICovCi0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci0KLSAgLyogV2UgbXVzdCBlbnN1cmUgdGhhdCBhIGZpeHVwIGFzc29jaWF0ZWQgd2l0aCBhbiB1bm1hdGNoZWQgJWhpCi0gICAgIHJlbG9jIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gIE90aGVyd2lzZSwgdGhlCi0gICAgIHJlYXJyYW5nZW1lbnQgb2YgJWhpIHJlbG9jcyBpbiBmcm9iX2ZpbGUgbWF5IGNvbmZ1c2UKLSAgICAgdGNfZ2VuX3JlbG9jLiAgKi8KLSAgaWYgKHVubWF0Y2hlZF9oaSkKLSAgICB7Ci0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gZm9yZ2V0cyB0aGF0IHRoZXJlIHdhcyBhbnkgcHJldmlvdXMgaW5zdHJ1Y3Rpb24gb3IKLSAgIGxhYmVsLiAgSWYgUFJFU0VSVkUgaXMgbm9uLXplcm8sIGl0IHJlbWVtYmVycyBlbm91Z2ggaW5mb3JtYXRpb24gdG8KLSAgIGtub3cgd2hldGhlciBub3BzIGFyZSBuZWVkZWQgYmVmb3JlIGEgbm9yZW9yZGVyIHNlY3Rpb24uICovCi0KLXN0YXRpYyB2b2lkCi1taXBzX25vX3ByZXZfaW5zbiAocHJlc2VydmUpCi0gICAgIGludCBwcmVzZXJ2ZTsKLXsKLSAgaWYgKCEgcHJlc2VydmUpCi0gICAgewotICAgICAgcHJldl9pbnNuLmluc25fbW8gPSAmZHVtbXlfb3Bjb2RlOwotICAgICAgcHJldl9wcmV2X2luc24uaW5zbl9tbyA9ICZkdW1teV9vcGNvZGU7Ci0gICAgICBwcmV2X25vcF9mcmFnID0gTlVMTDsKLSAgICAgIHByZXZfbm9wX2ZyYWdfaG9sZHMgPSAwOwotICAgICAgcHJldl9ub3BfZnJhZ19yZXF1aXJlZCA9IDA7Ci0gICAgICBwcmV2X25vcF9mcmFnX3NpbmNlID0gMDsKLSAgICB9Ci0gIHByZXZfaW5zbl92YWxpZCA9IDA7Ci0gIHByZXZfaW5zbl9pc19kZWxheV9zbG90ID0gMDsKLSAgcHJldl9pbnNuX3VucmVvcmRlcmVkID0gMDsKLSAgcHJldl9pbnNuX2V4dGVuZGVkID0gMDsKLSAgcHJldl9pbnNuX3JlbG9jX3R5cGUgPSBCRkRfUkVMT0NfVU5VU0VEOwotICBwcmV2X3ByZXZfaW5zbl91bnJlb3JkZXJlZCA9IDA7Ci0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2hlbmV2ZXIgd2UgdHVybiBvbiBub3Jlb3JkZXIgb3IgZW1pdAotICAgc29tZXRoaW5nIG90aGVyIHRoYW4gaW5zdHJ1Y3Rpb25zLiAgSXQgaW5zZXJ0cyBhbnkgTk9QUyB3aGljaCBtaWdodAotICAgYmUgbmVlZGVkIGJ5IHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiwgYW5kIGNsZWFycyB0aGUgaW5mb3JtYXRpb24KLSAgIGtlcHQgZm9yIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbnMuICBUaGUgSU5TTlMgcGFyYW1ldGVyIGlzIHRydWUgaWYKLSAgIGluc3RydWN0aW9ucyBhcmUgdG8gZm9sbG93LiAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19lbWl0X2RlbGF5cyAoaW5zbnMpCi0gICAgIGJvb2xlYW4gaW5zbnM7Ci17Ci0gIGlmICghIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0gICAgewotICAgICAgaW50IG5vcHM7Ci0KLSAgICAgIG5vcHMgPSAwOwotICAgICAgaWYgKCghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAmJiBtaXBzX29wdHMuaXNhIDwgNAotCSAgICYmICghIGNvcF9pbnRlcmxvY2tzCi0gICAgICAgICAgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0gICAgICAgICAgICAgICAgICAgJiAoSU5TTl9MT0FEX0NPUFJPQ19ERUxBWQotICAgICAgICAgICAgICAgICAgICAgIHwgSU5TTl9DT1BST0NfTU9WRV9ERUxBWQotICAgICAgICAgICAgICAgICAgICAgIHwgSU5TTl9XUklURV9DT05EX0NPREUpKSkpCi0JICB8fCAoISBoaWxvX2ludGVybG9ja3MKLQkgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0JCSAgJiAoSU5TTl9SRUFEX0xPCi0JCSAgICAgfCBJTlNOX1JFQURfSEkpKSkKLQkgIHx8ICghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAmJiAhIGdwcl9pbnRlcmxvY2tzCi0JICAgICAgJiYgKHByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAKLSAgICAgICAgICAgICAgICAgICYgSU5TTl9MT0FEX01FTU9SWV9ERUxBWSkpCi0JICB8fCAoISBtaXBzX29wdHMubWlwczE2Ci0JICAgICAgJiYgbWlwc19vcHRzLmlzYSA8IDIKLQkgICAgICAmJiAocHJldl9pbnNuLmluc25fbW8tPnBpbmZvCi0JCSAgJiBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkpKSkKLQl7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgKytub3BzOwotCSAgaWYgKCghIG1pcHNfb3B0cy5taXBzMTYKLQkgICAgICAgJiYgbWlwc19vcHRzLmlzYSA8IDQKLQkgICAgICAgJiYgKCEgY29wX2ludGVybG9ja3MKLSAgICAgICAgICAgICAgICAgICAmJiBwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1dSSVRFX0NPTkRfQ09ERSkpCi0JICAgICAgfHwgKCEgaGlsb19pbnRlcmxvY2tzCi0JCSAgJiYgKChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JCSAgICAgIHx8IChwcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfTE8pKSkpCi0JICAgICsrbm9wczsKLQotCSAgaWYgKHByZXZfaW5zbl91bnJlb3JkZXJlZCkKLQkgICAgbm9wcyA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoKCEgbWlwc19vcHRzLm1pcHMxNgotCQkmJiBtaXBzX29wdHMuaXNhIDwgNAotCQkmJiAoISBjb3BfaW50ZXJsb2NrcwotICAgICAgICAgICAgICAgICAgICAmJiBwcmV2X3ByZXZfaW5zbi5pbnNuX21vLT5waW5mbyAmIElOU05fV1JJVEVfQ09ORF9DT0RFKSkKLQkgICAgICAgfHwgKCEgaGlsb19pbnRlcmxvY2tzCi0JCSAgICYmICgocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfSEkpCi0JCSAgICAgICB8fCAocHJldl9wcmV2X2luc24uaW5zbl9tby0+cGluZm8gJiBJTlNOX1JFQURfTE8pKSkpCi0JewotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIGlmICghIHByZXZfcHJldl9pbnNuX3VucmVvcmRlcmVkKQotCSAgICArK25vcHM7Ci0JfQotCi0gICAgICBpZiAobm9wcyA+IDApCi0JewotCSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotCSAgaWYgKGluc25zKQotCSAgICB7Ci0JICAgICAgLyogUmVjb3JkIHRoZSBmcmFnIHdoaWNoIGhvbGRzIHRoZSBub3AgaW5zdHJ1Y3Rpb25zLCBzbwotICAgICAgICAgICAgICAgICB0aGF0IHdlIGNhbiByZW1vdmUgdGhlbSBpZiB3ZSBkb24ndCBuZWVkIHRoZW0uICAqLwotCSAgICAgIGZyYWdfZ3JvdyAobWlwc19vcHRzLm1pcHMxNiA/IG5vcHMgKiAyIDogbm9wcyAqIDQpOwotCSAgICAgIHByZXZfbm9wX2ZyYWcgPSBmcmFnX25vdzsKLQkgICAgICBwcmV2X25vcF9mcmFnX2hvbGRzID0gbm9wczsKLQkgICAgICBwcmV2X25vcF9mcmFnX3JlcXVpcmVkID0gMDsKLQkgICAgICBwcmV2X25vcF9mcmFnX3NpbmNlID0gMDsKLQkgICAgfQotCi0JICBmb3IgKDsgbm9wcyA+IDA7IC0tbm9wcykKLQkgICAgZW1pdF9ub3AgKCk7Ci0KLQkgIGlmIChpbnNucykKLQkgICAgewotCSAgICAgIC8qIE1vdmUgb24gdG8gYSBuZXcgZnJhZywgc28gdGhhdCBpdCBpcyBzYWZlIHRvIHNpbXBseQotICAgICAgICAgICAgICAgICBkZWNyZWFzZSB0aGUgc2l6ZSBvZiBwcmV2X25vcF9mcmFnLiAqLwotCSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotCSAgICAgIGZyYWdfbmV3ICgwKTsKLQkgICAgfQotCi0JICBmb3IgKGwgPSBpbnNuX2xhYmVsczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLQkgICAgewotCSAgICAgIGFzc2VydCAoU19HRVRfU0VHTUVOVCAobC0+bGFiZWwpID09IG5vd19zZWcpOwotCSAgICAgIHN5bWJvbF9zZXRfZnJhZyAobC0+bGFiZWwsIGZyYWdfbm93KTsKLQkgICAgICBTX1NFVF9WQUxVRSAobC0+bGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgICAgLyogbWlwczE2IHRleHQgbGFiZWxzIGFyZSBzdG9yZWQgYXMgb2RkLiAgKi8KLQkgICAgICBpZiAobWlwc19vcHRzLm1pcHMxNikKLQkJU19TRVRfVkFMVUUgKGwtPmxhYmVsLCBTX0dFVF9WQUxVRSAobC0+bGFiZWwpICsgMSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIE1hcmsgaW5zdHJ1Y3Rpb24gbGFiZWxzIGluIG1pcHMxNiBtb2RlLiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5taXBzMTYgJiYgaW5zbnMpCi0gICAgbWlwczE2X21hcmtfbGFiZWxzICgpOwotCi0gIG1pcHNfbm9fcHJldl9pbnNuIChpbnNucyk7Ci19Ci0KLS8qIEJ1aWxkIGFuIGluc3RydWN0aW9uIGNyZWF0ZWQgYnkgYSBtYWNybyBleHBhbnNpb24uICBUaGlzIGlzIHBhc3NlZAotICAgYSBwb2ludGVyIHRvIHRoZSBjb3VudCBvZiBpbnN0cnVjdGlvbnMgY3JlYXRlZCBzbyBmYXIsIGFuCi0gICBleHByZXNzaW9uLCB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYnVpbGQsIGFuIG9wZXJhbmQgZm9ybWF0Ci0gICBzdHJpbmcsIGFuZCBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cy4gICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi1zdGF0aWMgdm9pZAotbWFjcm9fYnVpbGQgKGNoYXIgKnBsYWNlLAotCSAgICAgaW50ICpjb3VudGVyLAotCSAgICAgZXhwcmVzc2lvblMgKiBlcCwKLQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JICAgICBjb25zdCBjaGFyICpmbXQsCi0JICAgICAuLi4pCi0jZWxzZQotc3RhdGljIHZvaWQKLW1hY3JvX2J1aWxkIChwbGFjZSwgY291bnRlciwgZXAsIG5hbWUsIGZtdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKnBsYWNlOwotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9kY2wKLSNlbmRpZgotewotICBzdHJ1Y3QgbWlwc19jbF9pbnNuIGluc247Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICB2YV9saXN0IGFyZ3M7Ci0gIGludCBpbnNuX2lzYTsKLQotI2lmZGVmIFVTRV9TVERBUkcKLSAgdmFfc3RhcnQgKGFyZ3MsIGZtdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0jZW5kaWYKLQotICAvKgotICAgKiBJZiB0aGUgbWFjcm8gaXMgYWJvdXQgdG8gZXhwYW5kIGludG8gYSBzZWNvbmQgaW5zdHJ1Y3Rpb24sCi0gICAqIHByaW50IGEgd2FybmluZyBpZiBuZWVkZWQuIFdlIG5lZWQgdG8gcGFzcyBpcCBhcyBhIHBhcmFtZXRlcgotICAgKiB0byBnZW5lcmF0ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UgaGVyZS4uLgotICAgKi8KLSAgaWYgKG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyAmJiBwbGFjZSA9PSBOVUxMICYmICpjb3VudGVyID09IDEpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMiKSk7Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgKmNvdW50ZXIgKz0gMTsJCS8qIGJ1bXAgaW5zdHJ1Y3Rpb24gY291bnRlciAqLwotCi0gIGlmIChtaXBzX29wdHMubWlwczE2KQotICAgIHsKLSAgICAgIG1pcHMxNl9tYWNyb19idWlsZCAocGxhY2UsIGNvdW50ZXIsIGVwLCBuYW1lLCBmbXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgciA9IEJGRF9SRUxPQ19VTlVTRUQ7Ci0gIGluc24uaW5zbl9tbyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLSAgYXNzZXJ0IChpbnNuLmluc25fbW8pOwotICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLQotICAvKiBTZWFyY2ggdW50aWwgd2UgZ2V0IGEgbWF0Y2ggZm9yIE5BTUUuICAqLwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpZiAoKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTEpCi0JaW5zbl9pc2EgPSAxOwotICAgICAgZWxzZSBpZiAoKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTIpCi0JaW5zbl9pc2EgPSAyOwotICAgICAgZWxzZSBpZiAoKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTMpCi0JaW5zbl9pc2EgPSAzOwotICAgICAgZWxzZSBpZiAoKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTQpCi0JaW5zbl9pc2EgPSA0OwotICAgICAgZWxzZQotCWluc25faXNhID0gMTU7Ci0KLSAgICAgIGlmIChzdHJjbXAgKGZtdCwgaW5zbi5pbnNuX21vLT5hcmdzKSA9PSAwCi0JICAmJiBpbnNuLmluc25fbW8tPnBpbmZvICE9IElOU05fTUFDUk8KLQkgICYmIChpbnNuX2lzYSA8PSBtaXBzX29wdHMuaXNhCi0JICAgICAgfHwgKG1pcHNfY3B1ID09IDQ2NTAKLQkJICAmJiAoaW5zbi5pbnNuX21vLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSAhPSAwKQotCSAgICAgIHx8IChtaXBzX2NwdSA9PSA0MDEwCi0JCSAgJiYgKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fNDAxMCkgIT0gMCkKLQkgICAgICB8fCAoKG1pcHNfY3B1ID09IDQxMDAKLQkJICAgfHwgbWlwc19jcHUgPT0gNDExMQotCQkgICApCi0JCSAgJiYgKGluc24uaW5zbl9tby0+bWVtYmVyc2hpcCAmIElOU05fNDEwMCkgIT0gMCkKLQkgICAgICB8fCAobWlwc19jcHUgPT0gMzkwMAotCQkgICYmIChpbnNuLmluc25fbW8tPm1lbWJlcnNoaXAgJiBJTlNOXzM5MDApICE9IDApKQotCSAgJiYgKG1pcHNfY3B1ICE9IDQ2NTAgfHwgKGluc24uaW5zbl9tby0+cGluZm8gJiBGUF9EKSA9PSAwKSkKLQlicmVhazsKLQotICAgICAgKytpbnNuLmluc25fbW87Ci0gICAgICBhc3NlcnQgKGluc24uaW5zbl9tby0+bmFtZSk7Ci0gICAgICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLSAgICB9Ci0KLSAgaW5zbi5pbnNuX29wY29kZSA9IGluc24uaW5zbl9tby0+bWF0Y2g7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgc3dpdGNoICgqZm10KyspCi0JewotCWNhc2UgJ1wwJzoKLQkgIGJyZWFrOwotCi0JY2FzZSAnLCc6Ci0JY2FzZSAnKCc6Ci0JY2FzZSAnKSc6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3QnOgotCWNhc2UgJ3cnOgotCWNhc2UgJ0UnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMTY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2MnOgotCWNhc2UgJ1QnOgotCWNhc2UgJ1cnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMTY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2QnOgotCWNhc2UgJ0cnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMTE7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1YnOgotCWNhc2UgJ1MnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMTE7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3onOgotCSAgY29udGludWU7Ci0KLQljYXNlICc8JzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ0QnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgNjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnQic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCA2OwotCSAgY29udGludWU7Ci0KLQljYXNlICdxJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCBpbnQpIDw8IDY7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2InOgotCWNhc2UgJ3MnOgotCWNhc2UgJ3InOgotCWNhc2UgJ3YnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgMjE7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ2knOgotCWNhc2UgJ2onOgotCWNhc2UgJ28nOgotCSAgciA9IChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIHZhX2FyZyAoYXJncywgaW50KTsKLQkgIGFzc2VydCAociA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTAotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX01JUFNfTElURVJBTAotCQkgIHx8IHIgPT0gQkZEX1JFTE9DX0xPMTYKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19DQUxMMTYKLQkJICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2Ci0JCSAgfHwgciA9PSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYKLQkJICB8fCAoZXAtPlhfb3AgPT0gT19zdWJ0cmFjdAotCQkgICAgICAmJiBub3dfc2VnID09IHRleHRfc2VjdGlvbgotCQkgICAgICAmJiByID09IEJGRF9SRUxPQ19QQ1JFTF9MTzE2KSk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3UnOgotCSAgciA9IChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIHZhX2FyZyAoYXJncywgaW50KTsKLQkgIGFzc2VydCAoZXAgIT0gTlVMTAotCQkgICYmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgIHx8IChlcC0+WF9vcCA9PSBPX3N5bWJvbAotCQkJICAmJiAociA9PSBCRkRfUkVMT0NfSEkxNl9TCi0JCQkgICAgICB8fCByID09IEJGRF9SRUxPQ19ISTE2Ci0JCQkgICAgICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci0JCQkgICAgICB8fCByID09IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNikpCi0JCSAgICAgIHx8IChlcC0+WF9vcCA9PSBPX3N1YnRyYWN0Ci0JCQkgICYmIG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uCi0JCQkgICYmIHIgPT0gQkZEX1JFTE9DX1BDUkVMX0hJMTZfUykpKTsKLQkgIGlmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgaW5zbi5pbnNuX29wY29kZSB8PSAoZXAtPlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0JICAgICAgZXAgPSBOVUxMOwotCSAgICAgIHIgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICB9Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3AnOgotCSAgYXNzZXJ0IChlcCAhPSBOVUxMKTsKLQkgIC8qCi0JICAgKiBUaGlzIGFsbG93cyBtYWNybygpIHRvIHBhc3MgYW4gaW1tZWRpYXRlIGV4cHJlc3Npb24gZm9yCi0JICAgKiBjcmVhdGluZyBzaG9ydCBicmFuY2hlcyB3aXRob3V0IGNyZWF0aW5nIGEgc3ltYm9sLgotCSAgICogTm90ZSB0aGF0IHRoZSBleHByZXNzaW9uIHN0aWxsIG1pZ2h0IGNvbWUgZnJvbSB0aGUgYXNzZW1ibHkKLQkgICAqIGlucHV0LCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSBpcyBub3QgY2hlY2tlZCBmb3IgcmFuZ2Ugbm9yCi0JICAgKiBpcyBhIHJlbG9jYXRpb24gZW50cnkgZ2VuZXJhdGVkICh5dWNrKS4KLQkgICAqLwotCSAgaWYgKGVwLT5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBpbnNuLmluc25fb3Bjb2RlIHw9IChlcC0+WF9hZGRfbnVtYmVyID4+IDIpICYgMHhmZmZmOwotCSAgICAgIGVwID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICByID0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyOwotCSAgY29udGludWU7Ci0KLQljYXNlICdhJzoKLQkgIGFzc2VydCAoZXAgIT0gTlVMTCk7Ci0JICByID0gQkZEX1JFTE9DX01JUFNfSk1QOwotCSAgY29udGludWU7Ci0KLQljYXNlICdDJzoKLQkgIGluc24uaW5zbl9vcGNvZGUgfD0gdmFfYXJnIChhcmdzLCB1bnNpZ25lZCBsb25nKTsKLQkgIGNvbnRpbnVlOwotCi0JZGVmYXVsdDoKLQkgIGludGVybmFsRXJyb3IgKCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB2YV9lbmQgKGFyZ3MpOwotICBhc3NlcnQgKHIgPT0gQkZEX1JFTE9DX1VOVVNFRCA/IGVwID09IE5VTEwgOiBlcCAhPSBOVUxMKTsKLQotICBhcHBlbmRfaW5zbiAocGxhY2UsICZpbnNuLCBlcCwgciwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZAotbWlwczE2X21hY3JvX2J1aWxkIChwbGFjZSwgY291bnRlciwgZXAsIG5hbWUsIGZtdCwgYXJncykKLSAgICAgY2hhciAqcGxhY2U7Ci0gICAgIGludCAqY291bnRlcjsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpmbXQ7Ci0gICAgIHZhX2xpc3QgYXJnczsKLXsKLSAgc3RydWN0IG1pcHNfY2xfaW5zbiBpbnNuOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLQotICByID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgaW5zbi5pbnNuX21vID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG1pcHMxNl9vcF9oYXNoLCBuYW1lKTsKLSAgYXNzZXJ0IChpbnNuLmluc25fbW8pOwotICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLQotICB3aGlsZSAoc3RyY21wIChmbXQsIGluc24uaW5zbl9tby0+YXJncykgIT0gMAotCSB8fCBpbnNuLmluc25fbW8tPnBpbmZvID09IElOU05fTUFDUk8pCi0gICAgewotICAgICAgKytpbnNuLmluc25fbW87Ci0gICAgICBhc3NlcnQgKGluc24uaW5zbl9tby0+bmFtZSk7Ci0gICAgICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLSAgICB9Ci0KLSAgaW5zbi5pbnNuX29wY29kZSA9IGluc24uaW5zbl9tby0+bWF0Y2g7Ci0gIGluc24udXNlX2V4dGVuZCA9IGZhbHNlOwotCi0gIGZvciAoOzspCi0gICAgewotICAgICAgaW50IGM7Ci0KLSAgICAgIGMgPSAqZm10Kys7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJ1wwJzoKLQkgIGJyZWFrOwotCi0JY2FzZSAnLCc6Ci0JY2FzZSAnKCc6Ci0JY2FzZSAnKSc6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3knOgotCWNhc2UgJ3cnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfUlk7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3gnOgotCWNhc2UgJ3YnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfUlg7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ3onOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfUlo7Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1onOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfTU9WRTMyWjsKLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnMCc6Ci0JY2FzZSAnUyc6Ci0JY2FzZSAnUCc6Ci0JY2FzZSAnUic6Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJ1gnOgotCSAgaW5zbi5pbnNuX29wY29kZSB8PSB2YV9hcmcgKGFyZ3MsIGludCkgPDwgTUlQUzE2T1BfU0hfUkVHUjMyOwotCSAgY29udGludWU7Ci0KLQljYXNlICdZJzoKLQkgIHsKLQkgICAgaW50IHJlZ25vOwotCi0JICAgIHJlZ25vID0gdmFfYXJnIChhcmdzLCBpbnQpOwotCSAgICByZWdubyA9ICgocmVnbm8gJiA3KSA8PCAyKSB8ICgocmVnbm8gJiAweDE4KSA+PiAzKTsKLQkgICAgaW5zbi5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SRUczMlI7Ci0JICB9Ci0JICBjb250aW51ZTsKLQotCWNhc2UgJzwnOgotCWNhc2UgJz4nOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJ0gnOgotCWNhc2UgJ1cnOgotCWNhc2UgJ0QnOgotCWNhc2UgJ2onOgotCWNhc2UgJzgnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ0MnOgotCWNhc2UgJ1UnOgotCWNhc2UgJ2snOgotCWNhc2UgJ0snOgotCWNhc2UgJ3AnOgotCWNhc2UgJ3EnOgotCSAgewotCSAgICBhc3NlcnQgKGVwICE9IE5VTEwpOwotCi0JICAgIGlmIChlcC0+WF9vcCAhPSBPX2NvbnN0YW50KQotCSAgICAgIHIgPSBCRkRfUkVMT0NfVU5VU0VEICsgYzsKLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbWlwczE2X2ltbWVkICgoY2hhciAqKSBOVUxMLCAwLCBjLCBlcC0+WF9hZGRfbnVtYmVyLCBmYWxzZSwKLQkJCSAgICAgIGZhbHNlLCBmYWxzZSwgJmluc24uaW5zbl9vcGNvZGUsCi0JCQkgICAgICAmaW5zbi51c2VfZXh0ZW5kLCAmaW5zbi5leHRlbmQpOwotCQllcCA9IE5VTEw7Ci0JCXIgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgIH0KLQkgIH0KLQkgIGNvbnRpbnVlOwotCi0JY2FzZSAnNic6Ci0JICBpbnNuLmluc25fb3Bjb2RlIHw9IHZhX2FyZyAoYXJncywgaW50KSA8PCBNSVBTMTZPUF9TSF9JTU02OwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYXNzZXJ0IChyID09IEJGRF9SRUxPQ19VTlVTRUQgPyBlcCA9PSBOVUxMIDogZXAgIT0gTlVMTCk7Ci0KLSAgYXBwZW5kX2luc24gKHBsYWNlLCAmaW5zbiwgZXAsIHIsIGZhbHNlKTsKLX0KLQotLyoKLSAqIEdlbmVyYXRlIGEgImx1aSIgaW5zdHJ1Y3Rpb24uCi0gKi8KLXN0YXRpYyB2b2lkCi1tYWNyb19idWlsZF9sdWkgKHBsYWNlLCBjb3VudGVyLCBlcCwgcmVnbnVtKQotICAgICBjaGFyICpwbGFjZTsKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBleHByZXNzaW9uUyAqZXA7Ci0gICAgIGludCByZWdudW07Ci17Ci0gIGV4cHJlc3Npb25TIGhpZ2hfZXhwcjsKLSAgc3RydWN0IG1pcHNfY2xfaW5zbiBpbnNuOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLSAgQ09OU1QgY2hhciAqbmFtZSA9ICJsdWkiOwotICBDT05TVCBjaGFyICpmbXQgPSAidCx1IjsKLQotICBhc3NlcnQgKCEgbWlwc19vcHRzLm1pcHMxNik7Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgaGlnaF9leHByID0gKmVwOwotICBlbHNlCi0gICAgewotICAgICAgaGlnaF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgaGlnaF9leHByLlhfYWRkX251bWJlciA9IGVwLT5YX2FkZF9udW1iZXI7Ci0gICAgfQotCi0gIGlmIChoaWdoX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIC8qIHdlIGNhbiBjb21wdXRlIHRoZSBpbnN0cnVjdGlvbiBub3cgd2l0aG91dCBhIHJlbG9jYXRpb24gZW50cnkgKi8KLSAgICAgIGlmIChoaWdoX2V4cHIuWF9hZGRfbnVtYmVyICYgMHg4MDAwKQotCWhpZ2hfZXhwci5YX2FkZF9udW1iZXIgKz0gMHgxMDAwMDsKLSAgICAgIGhpZ2hfZXhwci5YX2FkZF9udW1iZXIgPQotCSgodW5zaWduZWQgbG9uZykgaGlnaF9leHByLlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0gICAgICByID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc3NlcnQgKGVwLT5YX29wID09IE9fc3ltYm9sKTsKLSAgICAgIC8qIF9ncF9kaXNwIGlzIGEgc3BlY2lhbCBjYXNlLCB1c2VkIGZyb20gc19jcGxvYWQuICAqLwotICAgICAgYXNzZXJ0IChtaXBzX3BpYyA9PSBOT19QSUMKLQkgICAgICB8fCBzdHJjbXAgKFNfR0VUX05BTUUgKGVwLT5YX2FkZF9zeW1ib2wpLCAiX2dwX2Rpc3AiKSA9PSAwKTsKLSAgICAgIHIgPSBCRkRfUkVMT0NfSEkxNl9TOwotICAgIH0KLQotICAvKgotICAgKiBJZiB0aGUgbWFjcm8gaXMgYWJvdXQgdG8gZXhwYW5kIGludG8gYSBzZWNvbmQgaW5zdHJ1Y3Rpb24sCi0gICAqIHByaW50IGEgd2FybmluZyBpZiBuZWVkZWQuIFdlIG5lZWQgdG8gcGFzcyBpcCBhcyBhIHBhcmFtZXRlcgotICAgKiB0byBnZW5lcmF0ZSBhIGJldHRlciB3YXJuaW5nIG1lc3NhZ2UgaGVyZS4uLgotICAgKi8KLSAgaWYgKG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyAmJiBwbGFjZSA9PSBOVUxMICYmICpjb3VudGVyID09IDEpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgaW50byBtdWx0aXBsZSBpbnN0cnVjdGlvbnMiKSk7Ci0KLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgKmNvdW50ZXIgKz0gMTsJCS8qIGJ1bXAgaW5zdHJ1Y3Rpb24gY291bnRlciAqLwotCi0gIGluc24uaW5zbl9tbyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBuYW1lKTsKLSAgYXNzZXJ0IChpbnNuLmluc25fbW8pOwotICBhc3NlcnQgKHN0cmNtcCAobmFtZSwgaW5zbi5pbnNuX21vLT5uYW1lKSA9PSAwKTsKLSAgYXNzZXJ0IChzdHJjbXAgKGZtdCwgaW5zbi5pbnNuX21vLT5hcmdzKSA9PSAwKTsKLQotICBpbnNuLmluc25fb3Bjb2RlID0gaW5zbi5pbnNuX21vLT5tYXRjaCB8IChyZWdudW0gPDwgT1BfU0hfUlQpOwotICBpZiAociA9PSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGluc24uaW5zbl9vcGNvZGUgfD0gaGlnaF9leHByLlhfYWRkX251bWJlcjsKLSAgICAgIGFwcGVuZF9pbnNuIChwbGFjZSwgJmluc24sIE5VTEwsIHIsIGZhbHNlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhcHBlbmRfaW5zbiAocGxhY2UsICZpbnNuLCAmaGlnaF9leHByLCByLCBmYWxzZSk7Ci19Ci0KLS8qCQkJc2V0X2F0KCkKLSAqIEdlbmVyYXRlcyBjb2RlIHRvIHNldCB0aGUgJGF0IHJlZ2lzdGVyIHRvIHRydWUgKG9uZSkKLSAqIGlmIHJlZyBpcyBsZXNzIHRoYW4gdGhlIGltbWVkaWF0ZSBleHByZXNzaW9uLgotICovCi1zdGF0aWMgdm9pZAotc2V0X2F0IChjb3VudGVyLCByZWcsIHVuc2lnbmVkcCkKLSAgICAgaW50ICpjb3VudGVyOwotICAgICBpbnQgcmVnOwotICAgICBpbnQgdW5zaWduZWRwOwotewotICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0gICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmaW1tX2V4cHIsCi0JCSB1bnNpZ25lZHAgPyAic2x0aXUiIDogInNsdGkiLAotCQkgInQscixqIiwgQVQsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICBlbHNlCi0gICAgewotICAgICAgbG9hZF9yZWdpc3RlciAoY291bnRlciwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwKLQkJICAgdW5zaWduZWRwID8gInNsdHUiIDogInNsdCIsCi0JCSAgICJkLHYsdCIsIEFULCByZWcsIEFUKTsKLSAgICB9Ci19Ci0KLS8qIFdhcm4gaWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgYSBjb25zdGFudC4gICovCi0KLXN0YXRpYyB2b2lkCi1jaGVja19hYnNvbHV0ZV9leHByIChpcCwgZXgpCi0gICAgIHN0cnVjdCBtaXBzX2NsX2luc24gKmlwOwotICAgICBleHByZXNzaW9uUyAqZXg7Ci17Ci0gIGlmIChleC0+WF9vcCA9PSBPX2JpZykKLSAgICBhc19iYWQgKF8oInVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICBlbHNlIGlmIChleC0+WF9vcCAhPSBPX2NvbnN0YW50KQotICAgIGFzX2JhZCAoXygiSW5zdHJ1Y3Rpb24gJXMgcmVxdWlyZXMgYWJzb2x1dGUgZXhwcmVzc2lvbiIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci19Ci0KLS8qIENvdW50IHRoZSBsZWFkaW5nIHplcm9lcyBieSBwZXJmb3JtaW5nIGEgYmluYXJ5IGNob3AuIFRoaXMgaXMgYQotICAgYnVsa3kgYml0IG9mIHNvdXJjZSwgYnV0IHBlcmZvcm1hbmNlIGlzIGEgTE9UIGJldHRlciBmb3IgdGhlCi0gICBtYWpvcml0eSBvZiB2YWx1ZXMgdGhhbiBhIHNpbXBsZSBsb29wIHRvIGNvdW50IHRoZSBiaXRzOgotICAgICAgIGZvciAobGNudCA9IDA7IChsY250IDwgMzIpOyBsY250KyspCi0gICAgICAgICBpZiAoKHYpICYgKDEgPDwgKDMxIC0gbGNudCkpKQotICAgICAgICAgICBicmVhazsKLSAgSG93ZXZlciBpdCBpcyBub3QgY29kZSBzaXplIGZyaWVuZGx5LCBhbmQgdGhlIGdhaW4gd2lsbCBkcm9wIGEgYml0Ci0gIG9uIGNlcnRhaW4gY2FjaGVkIHN5c3RlbXMuCi0qLwotI2RlZmluZSBDT1VOVF9UT1BfWkVST0VTKHYpICAgICAgICAgICAgIFwKLSAgKCgodikgJiB+MHhmZmZmKSA9PSAwICAgICAgICAgICAgICAgICBcCi0gICA/ICgodikgJiB+MHhmZikgPT0gMCAgICAgICAgICAgICAgICAgXAotICAgICA/ICgodikgJiB+MHhmKSA9PSAwICAgICAgICAgICAgICAgIFwKLSAgICAgICA/ICgodikgJiB+MHgzKSA9PSAwICAgICAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxKSA9PSAwICAgICAgICAgICAgXAotICAgICAgICAgICA/ICEodikgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICA/IDMyICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgOiAzMSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDMwICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDcpID09IDAgICAgICAgICAgICBcCi0gICAgICAgICAgID8gMjkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDI4ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6ICgodikgJiB+MHgzZikgPT0gMCAgICAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZikgPT0gMCAgICAgICAgICAgXAotICAgICAgICAgICA/IDI3ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyNiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZikgPT0gMCAgICAgICAgICAgXAotICAgICAgICAgICA/IDI1ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAyNCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIDogKCh2KSAmIH4weGZmZikgPT0gMCAgICAgICAgICAgICAgXAotICAgICAgID8gKCh2KSAmIH4weDNmZikgPT0gMCAgICAgICAgICAgIFwKLSAgICAgICAgID8gKCh2KSAmIH4weDFmZikgPT0gMCAgICAgICAgICBcCi0gICAgICAgICAgID8gMjMgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDIyICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIDogKCh2KSAmIH4weDdmZikgPT0gMCAgICAgICAgICBcCi0gICAgICAgICAgID8gMjEgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICA6IDIwICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICA6ICgodikgJiB+MHgzZmZmKSA9PSAwICAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmKSA9PSAwICAgICAgICAgXAotICAgICAgICAgICA/IDE5ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxOCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmKSA9PSAwICAgICAgICAgXAotICAgICAgICAgICA/IDE3ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxNiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICA6ICgodikgJiB+MHhmZmZmZmYpID09IDAgICAgICAgICAgICAgXAotICAgICA/ICgodikgJiB+MHhmZmZmZikgPT0gMCAgICAgICAgICAgIFwKLSAgICAgICA/ICgodikgJiB+MHgzZmZmZikgPT0gMCAgICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmZikgPT0gMCAgICAgICAgXAotICAgICAgICAgICA/IDE1ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxNCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmZikgPT0gMCAgICAgICAgXAotICAgICAgICAgICA/IDEzICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiAxMiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiAoKHYpICYgfjB4M2ZmZmZmKSA9PSAwICAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmZmZmKSA9PSAwICAgICAgIFwKLSAgICAgICAgICAgPyAxMSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMTAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZmZmKSA9PSAwICAgICAgIFwKLSAgICAgICAgICAgPyA5ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogOCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICA6ICgodikgJiB+MHhmZmZmZmZmKSA9PSAwICAgICAgICAgIFwKLSAgICAgICA/ICgodikgJiB+MHgzZmZmZmZmKSA9PSAwICAgICAgICBcCi0gICAgICAgICA/ICgodikgJiB+MHgxZmZmZmZmKSA9PSAwICAgICAgXAotICAgICAgICAgICA/IDcgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiA2ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICA6ICgodikgJiB+MHg3ZmZmZmZmKSA9PSAwICAgICAgXAotICAgICAgICAgICA/IDUgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgOiA0ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgOiAoKHYpICYgfjB4M2ZmZmZmZmYpID09IDAgICAgICAgXAotICAgICAgICAgPyAoKHYpICYgfjB4MWZmZmZmZmYpID09IDAgICAgIFwKLSAgICAgICAgICAgPyAzICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgOiAoKHYpICYgfjB4N2ZmZmZmZmYpID09IDAgICAgIFwKLSAgICAgICAgICAgPyAxICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIDogMCkKLQotLyoJCQlsb2FkX3JlZ2lzdGVyKCkKLSAqICBUaGlzIHJvdXRpbmUgZ2VuZXJhdGVzIHRoZSBsZWFzdCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIG5lY2Nlc3NhcnkgdG8gbG9hZAotICogIGFuIGFic29sdXRlIGV4cHJlc3Npb24gdmFsdWUgaW50byBhIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgdm9pZAotbG9hZF9yZWdpc3RlciAoY291bnRlciwgcmVnLCBlcCwgZGJsKQotICAgICBpbnQgKmNvdW50ZXI7Ci0gICAgIGludCByZWc7Ci0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgaW50IGRibDsKLXsKLSAgaW50IGZyZWc7Ci0gIGV4cHJlc3Npb25TIGhpMzIsIGxvMzI7Ci0KLSAgaWYgKGVwLT5YX29wICE9IE9fYmlnKQotICAgIHsKLSAgICAgIGFzc2VydCAoZXAtPlhfb3AgPT0gT19jb25zdGFudCk7Ci0gICAgICBpZiAoZXAtPlhfYWRkX251bWJlciA8IDB4ODAwMAotCSAgJiYgKGVwLT5YX2FkZF9udW1iZXIgPj0gMAotCSAgICAgIHx8IChlcC0+WF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkJICAmJiAoISBkYmwKLQkJICAgICAgfHwgISBlcC0+WF91bnNpZ25lZAotCQkgICAgICB8fCBzaXplb2YgKGVwLT5YX2FkZF9udW1iZXIpID4gNCkpKSkKLQl7Ci0JICAvKiBXZSBjYW4gaGFuZGxlIDE2IGJpdCBzaWduZWQgdmFsdWVzIHdpdGggYW4gYWRkaXUgdG8KLQkgICAgICR6ZXJvLiAgTm8gbmVlZCB0byBldmVyIHVzZSBkYWRkaXUgaGVyZSwgc2luY2UgJHplcm8gYW5kCi0JICAgICB0aGUgcmVzdWx0IGFyZSBhbHdheXMgY29ycmVjdCBpbiAzMiBiaXQgbW9kZS4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJhZGRpdSIsICJ0LHIsaiIsIHJlZywgMCwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChlcC0+WF9hZGRfbnVtYmVyID49IDAgJiYgZXAtPlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgLyogV2UgY2FuIGhhbmRsZSAxNiBiaXQgdW5zaWduZWQgdmFsdWVzIHdpdGggYW4gb3JpIHRvCi0gICAgICAgICAgICAgJHplcm8uICAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAib3JpIiwgInQscixpIiwgcmVnLCAwLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UgaWYgKCgoKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4N2ZmZmZmZmYpID09IDAKLQkJIHx8ICgoZXAtPlhfYWRkX251bWJlciAmfiAob2Zmc2V0VCkgMHg3ZmZmZmZmZikKLQkJICAgICA9PSB+IChvZmZzZXRUKSAweDdmZmZmZmZmKSkKLQkJJiYgKCEgZGJsCi0JCSAgICB8fCAhIGVwLT5YX3Vuc2lnbmVkCi0JCSAgICB8fCBzaXplb2YgKGVwLT5YX2FkZF9udW1iZXIpID4gNAotCQkgICAgfHwgKGVwLT5YX2FkZF9udW1iZXIgJiAweDgwMDAwMDAwKSA9PSAwKSkKLQkgICAgICAgfHwgKChtaXBzX29wdHMuaXNhIDwgMyB8fCAhIGRibCkKLQkJICAgJiYgKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpID09IDApCi0JICAgICAgIHx8IChtaXBzX29wdHMuaXNhIDwgMwotCQkgICAmJiAhIGRibAotCQkgICAmJiAoKGVwLT5YX2FkZF9udW1iZXIgJn4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpCi0JCSAgICAgICA9PSB+IChvZmZzZXRUKSAweGZmZmZmZmZmKSkpCi0JewotCSAgLyogMzIgYml0IHZhbHVlcyByZXF1aXJlIGFuIGx1aS4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJsdWkiLCAidCx1IiwgcmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotCSAgaWYgKChlcC0+WF9hZGRfbnVtYmVyICYgMHhmZmZmKSAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJvcmkiLCAidCxyLGkiLCByZWcsIHJlZywKLQkJCSAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgaXMgbGFyZ2VyIHRoYW4gMzIgYml0cy4gICovCi0KLSAgaWYgKG1pcHNfb3B0cy5pc2EgPCAzKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiTnVtYmVyIGxhcmdlciB0aGFuIDMyIGJpdHMiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsICJhZGRpdSIsICJ0LHIsaiIsIHJlZywgMCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXAtPlhfb3AgIT0gT19iaWcpCi0gICAgewotICAgICAgaGkzMiA9ICplcDsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyID0gKHZhbHVlVCkgaGkzMi5YX2FkZF9udW1iZXIgPj4gMTY7Ci0gICAgICBoaTMyLlhfYWRkX251bWJlciA9ICh2YWx1ZVQpIGhpMzIuWF9hZGRfbnVtYmVyID4+IDE2OwotICAgICAgaGkzMi5YX2FkZF9udW1iZXIgJj0gMHhmZmZmZmZmZjsKLSAgICAgIGxvMzIgPSAqZXA7Ci0gICAgICBsbzMyLlhfYWRkX251bWJlciAmPSAweGZmZmZmZmZmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzc2VydCAoZXAtPlhfYWRkX251bWJlciA+IDIpOwotICAgICAgaWYgKGVwLT5YX2FkZF9udW1iZXIgPT0gMykKLQlnZW5lcmljX2JpZ251bVszXSA9IDA7Ci0gICAgICBlbHNlIGlmIChlcC0+WF9hZGRfbnVtYmVyID4gNCkKLQlhc19iYWQgKF8oIk51bWJlciBsYXJnZXIgdGhhbiA2NCBiaXRzIikpOwotICAgICAgbG8zMi5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGxvMzIuWF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMF0gKyAoZ2VuZXJpY19iaWdudW1bMV0gPDwgMTYpOwotICAgICAgaGkzMi5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGhpMzIuWF9hZGRfbnVtYmVyID0gZ2VuZXJpY19iaWdudW1bMl0gKyAoZ2VuZXJpY19iaWdudW1bM10gPDwgMTYpOwotICAgIH0KLQotICBpZiAoaGkzMi5YX2FkZF9udW1iZXIgPT0gMCkKLSAgICBmcmVnID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBzaGlmdCwgYml0OwotICAgICAgdW5zaWduZWQgbG9uZyBoaSwgbG87Ci0KLSAgICAgIGlmIChoaTMyLlhfYWRkX251bWJlciA9PSAweGZmZmZmZmZmKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZjgwMDApID09IDB4ZmZmZjgwMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgImFkZGl1IiwgInQscixqIiwKLQkJCSAgIHJlZywgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGxvMzIuWF9hZGRfbnVtYmVyICYgMHg4MDAwMDAwMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZsbzMyLCAibHVpIiwgInQsdSIsIHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIEJGRF9SRUxPQ19ISTE2KTsKLQkgICAgICBpZiAobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmYpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgIm9yaSIsICJ0LHIsaSIsCi0JCQkgICAgIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAvKiBDaGVjayBmb3IgMTZiaXQgc2hpZnRlZCBjb25zdGFudC4gIFdlIGtub3cgdGhhdCBoaTMyIGlzCi0gICAgICAgICBub24temVybywgc28gc3RhcnQgdGhlIG1hc2sgb24gdGhlIGZpcnN0IGJpdCBvZiB0aGUgaGkzMgotICAgICAgICAgdmFsdWUuICAqLwotICAgICAgc2hpZnQgPSAxNzsKLSAgICAgIGRvCi0gICAgICAgewotCSB1bnNpZ25lZCBsb25nIGhpbWFzaywgbG9tYXNrOwotCi0JIGlmIChzaGlmdCA8IDMyKQotCSAgIHsKLQkgICAgIGhpbWFzayA9IDB4ZmZmZiA+PiAoMzIgLSBzaGlmdCk7Ci0JICAgICBsb21hc2sgPSAoMHhmZmZmIDw8IHNoaWZ0KSAmIDB4ZmZmZmZmZmY7Ci0JICAgfQotCSBlbHNlCi0JICAgewotCSAgICAgaGltYXNrID0gMHhmZmZmIDw8IChzaGlmdCAtIDMyKTsKLQkgICAgIGxvbWFzayA9IDA7Ci0JICAgfQotCSBpZiAoKGhpMzIuWF9hZGRfbnVtYmVyICYgfiAob2Zmc2V0VCkgaGltYXNrKSA9PSAwCi0JICAgICAmJiAobG8zMi5YX2FkZF9udW1iZXIgJiB+IChvZmZzZXRUKSBsb21hc2spID09IDApCi0JICAgewotCSAgICAgZXhwcmVzc2lvblMgdG1wOwotCi0JICAgICB0bXAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICBpZiAoc2hpZnQgPCAzMikKLQkgICAgICAgdG1wLlhfYWRkX251bWJlciA9ICgoaGkzMi5YX2FkZF9udW1iZXIgPDwgKDMyIC0gc2hpZnQpKQotCQkJCSAgIHwgKGxvMzIuWF9hZGRfbnVtYmVyID4+IHNoaWZ0KSk7Ci0JICAgICBlbHNlCi0JICAgICAgIHRtcC5YX2FkZF9udW1iZXIgPSBoaTMyLlhfYWRkX251bWJlciA+PiAoc2hpZnQgLSAzMik7Ci0JICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJnRtcCwgIm9yaSIsICJ0LHIsaSIsIHJlZywgMCwKLQkJCSAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0JCQkgIChzaGlmdCA+PSAzMikgPyAiZHNsbDMyIiA6ICJkc2xsIiwKLQkJCSAgImQsdyw8IiwgcmVnLCByZWcsCi0JCQkgIChzaGlmdCA+PSAzMikgPyBzaGlmdCAtIDMyIDogc2hpZnQpOwotCSAgICAgcmV0dXJuOwotCSAgIH0KLSAgICAgICAgIHNoaWZ0Kys7Ci0gICAgICAgfSB3aGlsZSAoc2hpZnQgPD0gKDY0IC0gMTYpKTsKLQotICAgICAgLyogRmluZCB0aGUgYml0IG51bWJlciBvZiB0aGUgbG93ZXN0IG9uZSBiaXQsIGFuZCBzdG9yZSB0aGUKLSAgICAgICAgIHNoaWZ0ZWQgdmFsdWUgaW4gaGkvbG8uICAqLwotICAgICAgaGkgPSAodW5zaWduZWQgbG9uZykgKGhpMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmZmZmZik7Ci0gICAgICBsbyA9ICh1bnNpZ25lZCBsb25nKSAobG8zMi5YX2FkZF9udW1iZXIgJiAweGZmZmZmZmZmKTsKLSAgICAgIGlmIChsbyAhPSAwKQotCXsKLQkgIGJpdCA9IDA7Ci0JICB3aGlsZSAoKGxvICYgMSkgPT0gMCkKLQkgICAgewotCSAgICAgIGxvID4+PSAxOwotCSAgICAgICsrYml0OwotCSAgICB9Ci0JICBsbyB8PSAoaGkgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IGJpdCkgLSAxKSkgPDwgKDMyIC0gYml0KTsKLQkgIGhpID4+PSBiaXQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJpdCA9IDMyOwotCSAgd2hpbGUgKChoaSAmIDEpID09IDApCi0JICAgIHsKLQkgICAgICBoaSA+Pj0gMTsKLQkgICAgICArK2JpdDsKLQkgICAgfQotCSAgbG8gPSBoaTsKLQkgIGhpID0gMDsKLQl9Ci0KLSAgICAgIC8qIE9wdGltaXplIGlmIHRoZSBzaGlmdGVkIHZhbHVlIGlzIGEgKHBvd2VyIG9mIDIpIC0gMS4gICovCi0gICAgICBpZiAoKGhpID09IDAgJiYgKChsbyArIDEpICYgbG8pID09IDApCi0JICB8fCAobG8gPT0gMHhmZmZmZmZmZiAmJiAoKGhpICsgMSkgJiBoaSkgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzaGlmdCA9IENPVU5UX1RPUF9aRVJPRVMgKCh1bnNpZ25lZCBpbnQpIGhpMzIuWF9hZGRfbnVtYmVyKTsKLQkgIGlmIChzaGlmdCAhPSAwKQotICAgICAgICAgICAgewotCSAgICAgIGV4cHJlc3Npb25TIHRtcDsKLQotCSAgICAgIC8qIFRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCBzZXQgdGhlIHJlZ2lzdGVyIHRvIGJlIGFsbAotICAgICAgICAgICAgICAgICBvbmVzLiAgKi8KLSAgICAgICAgICAgICAgdG1wLlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgICAgICAgICB0bXAuWF9hZGRfbnVtYmVyID0gKG9mZnNldFQpIC0xOwotICAgICAgICAgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgJnRtcCwgImFkZGl1IiwgInQscixqIiwKLQkJCSAgIHJlZywgMCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgICAgICAgICBpZiAoYml0ICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgYml0ICs9IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdCA+PSAzMikgPyAiZHNsbDMyIiA6ICJkc2xsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZCx3LDwiLCByZWcsIHJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0ID49IDMyKSA/IGJpdCAtIDMyIDogYml0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCBOVUxMLAotCQkJICAgKHNoaWZ0ID49IDMyKSA/ICJkc3JsMzIiIDogImRzcmwiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImQsdyw8IiwgcmVnLCByZWcsCi0JCQkgICAoc2hpZnQgPj0gMzIpID8gc2hpZnQgLSAzMiA6IHNoaWZ0KTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIC8qIFNpZ24gZXh0ZW5kIGhpMzIgYmVmb3JlIGNhbGxpbmcgbG9hZF9yZWdpc3RlciwgYmVjYXVzZSB3ZSBjYW4KLSAgICAgICAgIGdlbmVyYWxseSBnZXQgYmV0dGVyIGNvZGUgd2hlbiB3ZSBsb2FkIGEgc2lnbiBleHRlbmRlZCB2YWx1ZS4gICovCi0gICAgICBpZiAoKGhpMzIuWF9hZGRfbnVtYmVyICYgMHg4MDAwMDAwMCkgIT0gMCkKLQloaTMyLlhfYWRkX251bWJlciB8PSB+IChvZmZzZXRUKSAweGZmZmZmZmZmOwotICAgICAgbG9hZF9yZWdpc3RlciAoY291bnRlciwgcmVnLCAmaGkzMiwgMCk7Ci0gICAgICBmcmVnID0gcmVnOwotICAgIH0KLSAgaWYgKChsbzMyLlhfYWRkX251bWJlciAmIDB4ZmZmZjAwMDApID09IDApCi0gICAgewotICAgICAgaWYgKGZyZWcgIT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgTlVMTCwgImRzbGwzMiIsICJkLHcsPCIsIHJlZywKLQkJICAgICAgIGZyZWcsIDApOwotCSAgZnJlZyA9IHJlZzsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgbWlkMTY7Ci0KLSAgICAgIGlmICgoZnJlZyA9PSAwKSAmJiAobG8zMi5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0gICAgICAgIHsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgImx1aSIsICJ0LHUiLCByZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfSEkxNik7Ci0gICAgICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc3JsMzIiLCAiZCx3LDwiLCByZWcsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZywgMCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgIGlmIChmcmVnICE9IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc2xsIiwgImQsdyw8IiwgcmVnLAotCQkgICAgICAgZnJlZywgMTYpOwotCSAgZnJlZyA9IHJlZzsKLQl9Ci0gICAgICBtaWQxNiA9IGxvMzI7Ci0gICAgICBtaWQxNi5YX2FkZF9udW1iZXIgPj49IDE2OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZtaWQxNiwgIm9yaSIsICJ0LHIsaSIsIHJlZywKLQkJICAgZnJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIE5VTEwsICJkc2xsIiwgImQsdyw8IiwgcmVnLAotCQkgICByZWcsIDE2KTsKLSAgICAgIGZyZWcgPSByZWc7Ci0gICAgfQotICBpZiAoKGxvMzIuWF9hZGRfbnVtYmVyICYgMHhmZmZmKSAhPSAwKQotICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCBjb3VudGVyLCAmbG8zMiwgIm9yaSIsICJ0LHIsaSIsIHJlZywgZnJlZywKLQkJIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLX0KLQotLyogTG9hZCBhbiBhZGRyZXNzIGludG8gYSByZWdpc3Rlci4gICovCi0KLXN0YXRpYyB2b2lkCi1sb2FkX2FkZHJlc3MgKGNvdW50ZXIsIHJlZywgZXApCi0gICAgIGludCAqY291bnRlcjsKLSAgICAgaW50IHJlZzsKLSAgICAgZXhwcmVzc2lvblMgKmVwOwotewotICBjaGFyICpwOwotCi0gIGlmIChlcC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICAmJiBlcC0+WF9vcCAhPSBPX3N5bWJvbCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0gICAgICBlcC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotCi0gIGlmIChlcC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKGNvdW50ZXIsIHJlZywgZXAsIDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotICAgIHsKLSAgICAgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIHdlIHdhbnQKLQkgICBhZGRpdQkkcmVnLCRncCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSBPdGhlcndpc2Ugd2Ugd2FudAotCSAgIGx1aQkJJHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHdlIGhhdmUgYW4gYWRkZW5kLCB3ZSBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgZm9ybS4gICovCi0gICAgICBpZiAoKHZhbHVlVCkgZXAtPlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0gICAgICAgICAgfHwgbm9waWNfbmVlZF9yZWxheCAoZXAtPlhfYWRkX3N5bWJvbCwgMSkpCi0JcCA9IE5VTEw7Ci0gICAgICBlbHNlCi0JewotCSAgZnJhZ19ncm93ICgyMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCAwLAotCQkJUkVMQVhfRU5DT0RFICg0LCA4LCAwLCA0LCAwLAotCQkJCSAgICAgIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCQllcC0+WF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0JfQotICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCBjb3VudGVyLCBlcCwgcmVnKTsKLSAgICAgIGlmIChwICE9IE5VTEwpCi0JcCArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGV4OwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgIGx3CQkkcmVnLDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICBsdwkJJHJlZyw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgbm9wCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIGl0IG11c3QgYmUgYWRkZWQgaW4gYWZ0ZXIuICAqLwotICAgICAgZXguWF9hZGRfbnVtYmVyID0gZXAtPlhfYWRkX251bWJlcjsKLSAgICAgIGVwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZnJhZ19ncm93ICgyMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAidCxvKGIpIiwgcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNCwgMCwKLQkJICAgIFJFTEFYX0VOQ09ERSAoMCwgNCwgLTgsIDAsIDAsIG1pcHNfb3B0cy53YXJuX2Fib3V0X21hY3JvcyksCi0JCSAgICBlcC0+WF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmIChleC5YX2FkZF9udW1iZXIgIT0gMCkKLQl7Ci0JICBpZiAoZXguWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCB8fCBleC5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZleCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHJlZywgcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgZXg7Ci0gICAgICBpbnQgb2ZmOwotCi0gICAgICAvKiBUaGlzIGlzIHRoZSBsYXJnZSBHT1QgY2FzZS4gIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4KLQkgZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgbHVpCQkkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpCi0JICAgYWRkdQkJJHJlZywkcmVnLCRncAotCSAgIGx3CQkkcmVnLDxzeW0+KCRyZWcpCShCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgT3RoZXJ3aXNlLCBmb3IgYSByZWZlcmVuY2UgdG8gYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICBsdwkJJHJlZyw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgbm9wCi0JICAgYWRkaXUJJHJlZywkcmVnLDxzeW0+CQkoQkZEX1JFTE9DX0xPMTYpCi0JIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIGl0IG11c3QgYmUgYWRkZWQgaW4gYWZ0ZXIuICAqLwotICAgICAgZXguWF9hZGRfbnVtYmVyID0gZXAtPlhfYWRkX251bWJlcjsKLSAgICAgIGVwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgaWYgKHJlZ19uZWVkc19kZWxheSAoR1ApKQotCW9mZiA9IDQ7Ci0gICAgICBlbHNlCi0Jb2ZmID0gMDsKLSAgICAgIGZyYWdfZ3JvdyAoMzIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLCAibHVpIiwgInQsdSIsIHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAiZCx2LHQiLCByZWcsIHJlZywgR1ApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgInQsbyhiKSIsIHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsIHJlZyk7Ci0gICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIG9mZiwgMCwKLQkJICAgIFJFTEFYX0VOQ09ERSAoMTIsIDEyICsgb2ZmLCBvZmYsIDggKyBvZmYsIDAsCi0JCQkJICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MpLAotCQkgICAgZXAtPlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsIChjaGFyICopIE5VTEwpOwotICAgICAgaWYgKG9mZiA+IDApCi0JewotCSAgLyogV2UgbmVlZCBhIG5vcCBiZWZvcmUgbG9hZGluZyBmcm9tICRncC4gIFRoaXMgc3BlY2lhbAotICAgICAgICAgICAgIGNoZWNrIGlzIHJlcXVpcmVkIGJlY2F1c2UgdGhlIGx1aSB3aGljaCBzdGFydHMgdGhlIG1haW4KLSAgICAgICAgICAgICBpbnN0cnVjdGlvbiBzdHJlYW0gZG9lcyBub3QgcmVmZXIgdG8gJGdwLCBhbmQgc28gd2lsbCBub3QKLSAgICAgICAgICAgICBpbnNlcnQgdGhlIG5vcCB3aGljaCBtYXkgYmUgcmVxdWlyZWQuICAqLwotCSAgbWFjcm9fYnVpbGQgKHAsIGNvdW50ZXIsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgcCArPSA0OwotCX0KLSAgICAgIG1hY3JvX2J1aWxkIChwLCBjb3VudGVyLCBlcCwKLQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkgICAgPyAibHciIDogImxkIiksCi0JCSAgICJ0LG8oYikiLCByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0gICAgICBwICs9IDQ7Ci0gICAgICBtYWNyb19idWlsZCAocCwgY291bnRlciwgZXAsCi0JCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgInQscixqIiwgcmVnLCByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGlmIChleC5YX2FkZF9udW1iZXIgIT0gMCkKLQl7Ci0JICBpZiAoZXguWF9hZGRfbnVtYmVyIDwgLTB4ODAwMCB8fCBleC5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsICZleCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCByZWcsIHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLSAgICB7Ci0gICAgICAvKiBXZSBhbHdheXMgZG8KLQkgICBhZGRpdQkkcmVnLCRncCw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsIGNvdW50ZXIsIGVwLAotCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICJ0LHIsaiIsIHJlZywgR1AsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotLyoKLSAqCQkJQnVpbGQgbWFjcm9zCi0gKiAgIFRoaXMgcm91dGluZSBpbXBsZW1lbnRzIHRoZSBzZWVtaW5nbHkgZW5kbGVzcyBtYWNybyBvciBzeW50aGVzaXplZAotICogaW5zdHJ1Y3Rpb25zIGFuZCBhZGRyZXNzaW5nIG1vZGVzIGluIHRoZSBtaXBzIGFzc2VtYmx5IGxhbmd1YWdlLiBNYW55Ci0gKiBvZiB0aGVzZSBtYWNyb3MgYXJlIHNpbXBsZSBhbmQgYXJlIHNpbWlsYXIgdG8gZWFjaCBvdGhlci4gVGhlc2UgY291bGQKLSAqIHByb2JhYmx5IGJlIGhhbmRsZWQgYnkgc29tZSBraW5kIG9mIHRhYmxlIG9yIGdyYW1tZXIgYXByb2FjaCBpbnN0ZWFkIG9mCi0gKiB0aGlzIHZlcmJvc2UgbWV0aG9kLiBPdGhlcnMgYXJlIG5vdCBzaW1wbGUgbWFjcm9zIGJ1dCBhcmUgbW9yZSBsaWtlCi0gKiBvcHRpbWl6aW5nIGNvZGUgZ2VuZXJhdGlvbi4KLSAqICAgT25lIGludGVyZXN0aW5nIG9wdGltaXphdGlvbiBpcyB3aGVuIHNldmVyYWwgc3RvcmUgbWFjcm9zIGFwcGVhcgotICogY29uc2VjdXRpdmx5IHRoYXQgd291bGQgbG9hZCBBVCB3aXRoIHRoZSB1cHBlciBoYWxmIG9mIHRoZSBzYW1lIGFkZHJlc3MuCi0gKiBUaGUgZW5zdWluZyBsb2FkIHVwcGVyIGluc3RydWN0aW9ucyBhcmUgb21taXRlZC4gVGhpcyBpbXBsaWVzIHNvbWUga2luZAotICogb2YgZ2xvYmFsIG9wdGltaXphdGlvbi4gV2UgY3VycmVudGx5IG9ubHkgb3B0aW1pemUgd2l0aGluIGEgc2luZ2xlIG1hY3JvLgotICogICBGb3IgbWFueSBvZiB0aGUgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIGlmIHRoZSBhZGRyZXNzIGlzIHNwZWNpZmllZCBhcyBhCi0gKiBjb25zdGFudCBleHByZXNzaW9uIGluIHRoZSBmaXJzdCA2NGsgb2YgbWVtb3J5IChpZSBsZCAkMiwweDQwMDBjKSB3ZQotICogZmlyc3QgbG9hZCByZWdpc3RlciAnYXQnIHdpdGggemVybyBhbmQgdXNlIGl0IGFzIHRoZSBiYXNlIHJlZ2lzdGVyLiBUaGUKLSAqIG1pcHMgYXNzZW1ibGVyIHNpbXBseSB1c2VzIHJlZ2lzdGVyICR6ZXJvLiBKdXN0IG9uZSB0aW55IG9wdGltaXphdGlvbgotICogd2UncmUgbWlzc2luZy4KLSAqLwotc3RhdGljIHZvaWQKLW1hY3JvIChpcCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci17Ci0gIHJlZ2lzdGVyIGludCB0cmVnLCBzcmVnLCBkcmVnLCBicmVnOwotICBpbnQgdGVtcHJlZzsKLSAgaW50IG1hc2s7Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHVzZWRfYXQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBjb25zdCBjaGFyICpzOwotICBjb25zdCBjaGFyICpzMjsKLSAgY29uc3QgY2hhciAqZm10OwotICBpbnQgbGlrZWx5ID0gMDsKLSAgaW50IGRibCA9IDA7Ci0gIGludCBjb3Byb2MgPSAwOwotICBpbnQgbHIgPSAwOwotICBpbnQgaW1tID0gMDsKLSAgb2Zmc2V0VCBtYXhudW07Ci0gIGludCBvZmY7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBjaGFyICpwOwotICBpbnQgaG9sZF9taXBzX29wdGltaXplOwotCi0gIGFzc2VydCAoISBtaXBzX29wdHMubWlwczE2KTsKLQotICB0cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxNikgJiAweDFmOwotICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwotICBzcmVnID0gYnJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMjEpICYgMHgxZjsKLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotCi0gIGV4cHIxLlhfb3AgPSBPX2NvbnN0YW50OwotICBleHByMS5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gIGV4cHIxLlhfYWRkX251bWJlciA9IDE7Ci0KLSAgc3dpdGNoIChtYXNrKQotICAgIHsKLSAgICBjYXNlIE1fREFCUzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX0FCUzoKLSAgICAgIC8qIGJnZXogJGEwLC4rMTIKLQkgbW92ZSB2MCwkYTAKLQkgc3ViIHYwLCR6ZXJvLCRhMAotCSAqLwotCi0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0KLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJnZXoiLCAicyxwIiwgc3JlZyk7Ci0gICAgICBpZiAoZHJlZyA9PSBzcmVnKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLSAgICAgIGVsc2UKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZHN1YiIgOiAic3ViIiwKLQkJICAgImQsdix0IiwgZHJlZywgMCwgc3JlZyk7Ci0KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9BRERfSToKLSAgICAgIHMgPSAiYWRkaSI7Ci0gICAgICBzMiA9ICJhZGQiOwotICAgICAgZ290byBkb19hZGRpOwotICAgIGNhc2UgTV9BRERVX0k6Ci0gICAgICBzID0gImFkZGl1IjsKLSAgICAgIHMyID0gImFkZHUiOwotICAgICAgZ290byBkb19hZGRpOwotICAgIGNhc2UgTV9EQUREX0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkYWRkaSI7Ci0gICAgICBzMiA9ICJkYWRkIjsKLSAgICAgIGdvdG8gZG9fYWRkaTsKLSAgICBjYXNlIE1fREFERFVfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRhZGRpdSI7Ci0gICAgICBzMiA9ICJkYWRkdSI7Ci0gICAgZG9fYWRkaToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsIHMsICJ0LHIsaiIsIHRyZWcsIHNyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMyLCAiZCx2LHQiLCB0cmVnLCBzcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BTkRfSToKLSAgICAgIHMgPSAiYW5kaSI7Ci0gICAgICBzMiA9ICJhbmQiOwotICAgICAgZ290byBkb19iaXQ7Ci0gICAgY2FzZSBNX09SX0k6Ci0gICAgICBzID0gIm9yaSI7Ci0gICAgICBzMiA9ICJvciI7Ci0gICAgICBnb3RvIGRvX2JpdDsKLSAgICBjYXNlIE1fTk9SX0k6Ci0gICAgICBzID0gIiI7Ci0gICAgICBzMiA9ICJub3IiOwotICAgICAgZ290byBkb19iaXQ7Ci0gICAgY2FzZSBNX1hPUl9JOgotICAgICAgcyA9ICJ4b3JpIjsKLSAgICAgIHMyID0gInhvciI7Ci0gICAgZG9fYml0OgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgaWYgKG1hc2sgIT0gTV9OT1JfSSkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsIHMsICJ0LHIsaSIsIHRyZWcsCi0JCQkgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJvcmkiLCAidCxyLGkiLAotCQkJICAgdHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vciIsICJkLHYsdCIsCi0JCQkgICB0cmVnLCB0cmVnLCAwKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQsdix0IiwgdHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVRX0k6Ci0gICAgICBzID0gImJlcSI7Ci0gICAgICBnb3RvIGJlcV9pOwotICAgIGNhc2UgTV9CRVFMX0k6Ci0gICAgICBzID0gImJlcWwiOwotICAgICAgbGlrZWx5ID0gMTsKLSAgICAgIGdvdG8gYmVxX2k7Ci0gICAgY2FzZSBNX0JORV9JOgotICAgICAgcyA9ICJibmUiOwotICAgICAgZ290byBiZXFfaTsKLSAgICBjYXNlIE1fQk5FTF9JOgotICAgICAgcyA9ICJibmVsIjsKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgYmVxX2k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAicyx0LHAiLCBzcmVnLAotCQkgICAgICAgMCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJzLHQscCIsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHRUw6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR0U6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJnZXpsIiA6ICJiZ2V6IiwKLQkJICAgICAgICJzLHAiLCBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJsZXpsIiA6ICJibGV6IiwKLQkJICAgICAgICJzLHAiLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHQiLCAiZCx2LHQiLCBBVCwgc3JlZywgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVExfSToKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVF9JOgotICAgICAgLyogY2hlY2sgZm9yID4gbWF4IGludGVnZXIgKi8KLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gbWF4bnVtCi0JICAmJiAobWlwc19vcHRzLmlzYSA8IDMgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JewotCWRvX2ZhbHNlOgotCSAgLyogcmVzdWx0IGlzIGFsd2F5cyBmYWxzZSAqLwotCSAgaWYgKCEgbGlrZWx5KQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiQnJhbmNoICVzIGlzIGFsd2F5cyBmYWxzZSAobm9wKSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJCcmFuY2ggbGlrZWx5ICVzIGlzIGFsd2F5cyBmYWxzZSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJibmVsIiwKLQkJCSAgICJzLHQscCIsIDAsIDApOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CR0VfSToKLSAgICBjYXNlIE1fQkdFTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CR0VMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmdlemwiIDogImJnZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmd0emwiIDogImJndHoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBtYXhudW0gPSAtIG1heG51bSAtIDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gbWF4bnVtCi0JICAmJiAobWlwc19vcHRzLmlzYSA8IDMgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JewotCWRvX3RydWU6Ci0JICAvKiByZXN1bHQgaXMgYWx3YXlzIHRydWUgKi8KLQkgIGFzX3dhcm4gKF8oIkJyYW5jaCAlcyBpcyBhbHdheXMgdHJ1ZSIpLCBpcC0+aW5zbl9tby0+bmFtZSk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImIiLCAicCIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR0VVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHRVU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgICAgICJzLHQscCIsIDAsIHRyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JHVFVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CR1RVX0k6Ci0gICAgICBpZiAoc3JlZyA9PSAwCi0JICB8fCAobWlwc19vcHRzLmlzYSA8IDMKLQkgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0JZ290byBkb19mYWxzZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlcisrOwotICAgICAgLyogRkFMTFRIUk9VR0ggKi8KLSAgICBjYXNlIE1fQkdFVV9JOgotICAgIGNhc2UgTV9CR0VVTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CR0VVTF9JKQotCWxpa2VseSA9IDE7Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYm5lbCIgOiAiYm5lIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR1RMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkdUOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ3R6bCIgOiAiYmd0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibHR6bCIgOiAiYmx0eiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CR1RVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JHVFU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCWdvdG8gZG9fZmFsc2U7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHRyZWcsCi0JCSAgIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxFOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibGV6bCIgOiAiYmxleiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ2V6bCIgOiAiYmdleiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHRyZWcsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJiZXFsIiA6ICJiZXEiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEVfSToKLSAgICAgIG1heG51bSA9IDB4N2ZmZmZmZmY7Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzICYmIHNpemVvZiAobWF4bnVtKSA+IDQpCi0JewotCSAgbWF4bnVtIDw8PSAxNjsKLQkgIG1heG51bSB8PSAweGZmZmY7Ci0JICBtYXhudW0gPDw9IDE2OwotCSAgbWF4bnVtIHw9IDB4ZmZmZjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gbWF4bnVtCi0JICAmJiAobWlwc19vcHRzLmlzYSA8IDMgfHwgc2l6ZW9mIChtYXhudW0pID4gNCkpCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CTFRfSToKLSAgICBjYXNlIE1fQkxUTF9JOgotICAgICAgaWYgKG1hc2sgPT0gTV9CTFRMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmx0emwiIDogImJsdHoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmxlemwiIDogImJsZXoiLAotCQkgICAgICAgInMscCIsIHNyZWcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTEVVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMRVU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICAgICAicyx0LHAiLCBzcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCWdvdG8gZG9fdHJ1ZTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsdHUiLCAiZCx2LHQiLCBBVCwgdHJlZywKLQkJICAgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgbGlrZWx5ID8gImJlcWwiIDogImJlcSIsCi0JCSAgICJzLHQscCIsIEFULCAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JMRVVMX0k6Ci0gICAgICBsaWtlbHkgPSAxOwotICAgIGNhc2UgTV9CTEVVX0k6Ci0gICAgICBpZiAoc3JlZyA9PSAwCi0JICB8fCAobWlwc19vcHRzLmlzYSA8IDMKLQkgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMHhmZmZmZmZmZikpCi0JZ290byBkb190cnVlOwotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKys7Ci0gICAgICAvKiBGQUxMVEhST1VHSCAqLwotICAgIGNhc2UgTV9CTFRVX0k6Ci0gICAgY2FzZSBNX0JMVFVMX0k6Ci0gICAgICBpZiAobWFzayA9PSBNX0JMVFVMX0kpCi0JbGlrZWx5ID0gMTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JZ290byBkb19mYWxzZTsKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBsaWtlbHkgPyAiYmVxbCIgOiAiYmVxIiwKLQkJICAgICAgICJzLHQscCIsIHNyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIHNldF9hdCAoJmljbnQsIHNyZWcsIDEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTFRMOgotICAgICAgbGlrZWx5ID0gMTsKLSAgICBjYXNlIE1fQkxUOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJibHR6bCIgOiAiYmx0eiIsCi0JCSAgICAgICAicyxwIiwgc3JlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKHNyZWcgPT0gMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGxpa2VseSA/ICJiZ3R6bCIgOiAiYmd0eiIsCi0JCSAgICAgICAicyxwIiwgdHJlZyk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgQVQsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9CTFRVTDoKLSAgICAgIGxpa2VseSA9IDE7Ci0gICAgY2FzZSBNX0JMVFU6Ci0gICAgICBpZiAodHJlZyA9PSAwKQotCWdvdG8gZG9fZmFsc2U7Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgbGlrZWx5ID8gImJuZWwiIDogImJuZSIsCi0JCSAgICAgICAicyx0LHAiLCAwLCB0cmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgQVQsIHNyZWcsCi0JCSAgIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgIGxpa2VseSA/ICJibmVsIiA6ICJibmUiLAotCQkgICAicyx0LHAiLCBBVCwgMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ERElWXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9ESVZfMzoKLSAgICAgIHMgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdjM7Ci0gICAgY2FzZSBNX0RSRU1fMzoKLSAgICAgIGRibCA9IDE7Ci0gICAgY2FzZSBNX1JFTV8zOgotICAgICAgcyA9ICJtZmhpIjsKLSAgICBkb19kaXYzOgotICAgICAgaWYgKHRyZWcgPT0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJEaXZpZGUgYnkgemVyby4iKSk7Ci0JICBpZiAobWlwc190cmFwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgMCwgMCk7Ci0JICBlbHNlCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgaWYgKG1pcHNfdHJhcCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgdHJlZywgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgICAgICBkYmwgPyAiZGRpdiIgOiAiZGl2IiwKLQkJICAgICAgICJ6LHMsdCIsIHNyZWcsIHRyZWcpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgICAgIGRibCA/ICJkZGl2IiA6ICJkaXYiLAotCQkgICAgICAgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA3KTsKLQl9Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAtMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICJ0LHIsaiIsIEFULCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSBtaXBzX3RyYXAgPyAoZGJsID8gMTIgOiA4KSA6IChkYmwgPyAyMCA6IDE2KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgdHJlZywgQVQpOwotICAgICAgaWYgKGRibCkKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJkYWRkaXUiLCAidCxyLGoiLCBBVCwgMCwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImRzbGwzMiIsICJkLHcsPCIsIEFULCBBVCwKLQkJICAgICAgIDMxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMHg4MDAwMDAwMDsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAibHVpIiwgInQsdSIsIEFULAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0hJMTYpOwotCX0KLSAgICAgIGlmIChtaXBzX3RyYXApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAidGVxIiwgInMsdCIsIHNyZWcsIEFUKTsKLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSA4OwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJibmUiLCAicyx0LHAiLCBzcmVnLCBBVCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJub3AiLCAiIiwgMCk7Ci0KLQkgIC8qIFdlIHdhbnQgdG8gY2xvc2UgdGhlIG5vcmVvcmRlciBibG9jayBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbwotCSAgICAgdGhhdCBsYXRlciBpbnNucyBhcmUgYXZhaWxhYmxlIGZvciBkZWxheSBzbG90IGZpbGxpbmcuICAqLwotCSAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImJyZWFrIiwgImMiLCA2KTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkIiwgZHJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ESVZfM0k6Ci0gICAgICBzID0gImRpdiI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRElWVV8zSToKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fUkVNXzNJOgotICAgICAgcyA9ICJkaXYiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX1JFTVVfM0k6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2Rpdmk7Ci0gICAgY2FzZSBNX0RESVZfM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9ERElWVV8zSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZpOwotICAgIGNhc2UgTV9EUkVNXzNJOgotICAgICAgZGJsID0gMTsKLSAgICAgIHMgPSAiZGRpdiI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2aTsKLSAgICBjYXNlIE1fRFJFTVVfM0k6Ci0gICAgICBkYmwgPSAxOwotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICBkb19kaXZpOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPT0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJEaXZpZGUgYnkgemVyby4iKSk7Ci0JICBpZiAobWlwc190cmFwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0ZXEiLCAicyx0IiwgMCwgMCk7Ci0JICBlbHNlCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDEpCi0JewotCSAgaWYgKHN0cmNtcCAoczIsICJtZmxvIikgPT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLAotCQkJIHNyZWcpOwotCSAgZWxzZQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsIGRyZWcsIDApOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAtMQotCSAgJiYgc1tzdHJsZW4gKHMpIC0gMV0gIT0gJ3UnKQotCXsKLQkgIGlmIChzdHJjbXAgKHMyLCAibWZsbyIpID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoZGJsKQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJkbmVnIiwgImQsdyIsIGRyZWcsCi0JCQkgICAgIHNyZWcpOwotCSAgICAgIGVsc2UKLQkJbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibmVnIiwgImQsdyIsIGRyZWcsCi0JCQkgICAgIHNyZWcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1vdmUiLCAiZCxzIiwgZHJlZywgMCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInoscyx0Iiwgc3JlZywgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RJVlVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX1JFTVVfMzoKLSAgICAgIHMgPSAiZGl2dSI7Ci0gICAgICBzMiA9ICJtZmhpIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RESVZVXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXZ1MzsKLSAgICBjYXNlIE1fRFJFTVVfMzoKLSAgICAgIHMgPSAiZGRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgZG9fZGl2dTM6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAobWlwc190cmFwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRlcSIsICJzLHQiLCB0cmVnLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInoscyx0Iiwgc3JlZywgdHJlZyk7Ci0JICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KLQkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KLQkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5lIiwgInMsdCxwIiwgdHJlZywgMCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ6LHMsdCIsIHNyZWcsIHRyZWcpOwotCi0JICAvKiBXZSB3YW50IHRvIGNsb3NlIHRoZSBub3Jlb3JkZXIgYmxvY2sgYXMgc29vbiBhcyBwb3NzaWJsZSwgc28KLQkgICAgIHRoYXQgbGF0ZXIgaW5zbnMgYXJlIGF2YWlsYWJsZSBmb3IgZGVsYXkgc2xvdCBmaWxsaW5nLiAgKi8KLQkgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDcpOwotCX0KLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgczIsICJkIiwgZHJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRExBX0FCOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTEFfQUI6Ci0gICAgICAvKiBMb2FkIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGludG8gYSByZWdpc3Rlci4gIElmIGJyZWcgaXMgbm90Ci0JIHplcm8sIHdlIHRoZW4gYWRkIGEgYmFzZSByZWdpc3RlciB0byBpdC4gICovCi0KLSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBlbWJlZGRlZCBQSUMgY29kZSwgd2UgcGVybWl0IGV4cHJlc3Npb25zIG9mCi0JIHRoZSBmb3JtCi0JICAgbGEJJDQsZm9vLWJhcgotCSB3aGVyZSBiYXIgaXMgYW4gYWRkcmVzcyBpbiB0aGUgLnRleHQgc2VjdGlvbi4gIFRoZXNlIGFyZSB1c2VkCi0JIHdoZW4gZ2V0dGluZyB0aGUgYWRkcmVzc2VzIG9mIGZ1bmN0aW9ucy4gIFdlIGRvbid0IHBlcm1pdAotCSBYX2FkZF9udW1iZXIgdG8gYmUgbm9uLXplcm8sIGJlY2F1c2UgaWYgdGhlIHN5bWJvbCBpcwotCSBleHRlcm5hbCB0aGUgcmVsYXhpbmcgY29kZSBuZWVkcyB0byBrbm93IHRoYXQgYW55IGFkZGVuZCBpcwotCSBwdXJlbHkgdGhlIG9mZnNldCB0byBYX29wX3N5bWJvbC4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDCi0JICAmJiBvZmZzZXRfZXhwci5YX29wID09IE9fc3VidHJhY3QKLQkgICYmIG5vd19zZWcgPT0gdGV4dF9zZWN0aW9uCi0JICAmJiAoc3ltYm9sX2NvbnN0YW50X3AgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKQotCSAgICAgID8gU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9vcF9zeW1ib2wpID09IHRleHRfc2VjdGlvbgotCSAgICAgIDogKHN5bWJvbF9lcXVhdGVkX3AgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKQotCQkgJiYgKFNfR0VUX1NFR01FTlQKLQkJICAgICAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChvZmZzZXRfZXhwci5YX29wX3N5bWJvbCkKLQkJICAgICAgLT5YX2FkZF9zeW1ib2wpCi0JCSAgICAgPT0gdGV4dF9zZWN0aW9uKSkpCi0JICAmJiBicmVnID09IDAKLQkgICYmIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgIDwgMykKLQkJCT8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRyZWcsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19QQ1JFTF9MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fc3ltYm9sCi0JICAmJiBvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JfQotCi0gICAgICBpZiAodHJlZyA9PSBicmVnKQotCXsKLQkgIHRlbXByZWcgPSBBVDsKLQkgIHVzZWRfYXQgPSAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB0ZW1wcmVnID0gdHJlZzsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLQotICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgdGVtcHJlZywgJm9mZnNldF9leHByLCBkYmwpOwotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCRncCw8c3ltPgkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfSEkxNl9TKQotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB3ZSBoYXZlIGEgY29uc3RhbnQsIHdlIG5lZWQgdHdvIGluc3RydWN0aW9ucyBhbnlob3csCi0JICAgICBzbyB3ZSBtYXkgYXMgd2VsbCBhbHdheXMgdXNlIHRoZSBsYXR0ZXIgZm9ybS4gICovCi0JICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLQkgICAgICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQotCSAgICBwID0gTlVMTDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZyYWdfZ3JvdyAoMjApOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgCSAgICAgfHwgbWlwc19vcHRzLmlzYSAgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIEdQLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCk7Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDQsIDgsIDAsIDQsIDAsCi0JCQkJCSAgbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zKSwKLQkJCSAgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgIChjaGFyICopIE5VTEwpOwotCSAgICB9Ci0JICBtYWNyb19idWlsZF9sdWkgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHRlbXByZWcpOwotCSAgaWYgKHAgIT0gTlVMTCkKLQkgICAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhICA8IDMpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIGFuZCB0aGVyZQotCSAgICAgaXMgbm8gY29uc3RhbnQsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0KLQkgICAgIElmIHdlIGhhdmUgYSBzbWFsbCBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxjb25zdGFudD4KLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudCB0aGUgc2FtZSBpbnN0cnVjdGlvbgotCSAgICAgc2VxdWVuY2UsIGJ1dCB3ZSBvdXRwdXQgYSBCRkRfUkVMT0NfTE8xNiByZWxvYyBvbiB0aGUKLQkgICAgIGFkZGl1IGluc3RydWN0aW9uLgotCi0JICAgICBJZiB3ZSBoYXZlIGEgbGFyZ2UgY29uc3RhbnQsIGFuZCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvCi0JICAgICBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIGx1aQkkYXQsPGhpY29uc3RhbnQ+Ci0JICAgICAgIGFkZGl1CSRhdCwkYXQsPGxvY29uc3RhbnQ+Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGF0Ci0JICAgICBGb3IgYSBsb2NhbCBzeW1ib2wsIHdlIHdhbnQgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24KLQkgICAgIHNlcXVlbmNlLCBidXQgd2Ugb3V0cHV0IGEgQkZEX1JFTE9DX0xPMTYgcmVsb2Mgb24gdGhlCi0JICAgICBhZGRpdSBpbnN0cnVjdGlvbi4gICovCi0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgZnJhZ19ncm93ICgzMik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgIGRibCA/ICJsZCIgOiAibHciLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyID09IDApCi0JICAgIHsKLQkgICAgICBpbnQgb2ZmOwotCi0JICAgICAgaWYgKGJyZWcgPT0gMCkKLQkJb2ZmID0gMDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBXZSdyZSBnb2luZyB0byBwdXQgaW4gYW4gYWRkdSBpbnN0cnVjdGlvbiB1c2luZwotCQkgICAgIHRlbXByZWcsIHNvIHdlIG1heSBhcyB3ZWxsIGluc2VydCB0aGUgbm9wIHJpZ2h0Ci0JCSAgICAgbm93LiAgKi8KLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICJub3AiLCAiIik7Ci0JCSAgb2ZmID0gNDsKLQkJfQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDggLSBvZmYsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgwLCA4IC0gb2ZmLCAtNCAtIG9mZiwgNCAtIG9mZiwgMCwKLQkJCQkJICAoYnJlZyA9PSAwCi0JCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgIDogMCkpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgICAgaWYgKGJyZWcgPT0gMCkKLQkJewotCQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JCSAgcCArPSA0OwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIC8qIEZJWE1FOiBJZiBicmVnID09IDAsIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbiB1c2VzCi0JCSAkdGVtcHJlZywgdGhlbiBpZiB0aGlzIHZhcmlhbnQgY2FzZSBpcyB1c2VkIGFuIGV4dHJhCi0JCSBub3Agd2lsbCBiZSBnZW5lcmF0ZWQuICAqLwotCSAgICB9Ci0JICBlbHNlIGlmIChleHByMS5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCQkgICAmJiBleHByMS5YX2FkZF9udW1iZXIgPCAweDgwMDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgIm5vcCIsICIiKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCQkgICAidCxyLGoiLCB0ZW1wcmVnLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgKHZvaWQpIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMCwgMCwKLQkJCSAgICAgICBSRUxBWF9FTkNPREUgKDAsIDAsIC0xMiwgLTQsIDAsIDApLAotCQkJICAgICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBvZmYxOwotCi0JICAgICAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIGFkZCBpbiBhIGJhc2UgcmVnaXN0ZXIsIGFuZCB0aGUKLQkJIHRhcmdldCByZWdpc3RlciBhbmQgdGhlIGJhc2UgcmVnaXN0ZXIgYXJlIHRoZSBzYW1lLAotCQkgdGhlbiB3ZSBhcmUgdXNpbmcgQVQgYXMgYSB0ZW1wb3JhcnkgcmVnaXN0ZXIuICBTaW5jZQotCQkgd2Ugd2FudCB0byBsb2FkIHRoZSBjb25zdGFudCBpbnRvIEFULCB3ZSBhZGQgb3VyCi0JCSBjdXJyZW50IEFUIChmcm9tIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlKSBhbmQgdGhlCi0JCSByZWdpc3RlciBpbnRvIHRoZSByZWdpc3RlciBub3csIGFuZCBwcmV0ZW5kIHdlIHdlcmUKLQkJIG5vdCB1c2luZyBhIGJhc2UgcmVnaXN0ZXIuICAqLwotCSAgICAgIGlmIChicmVnICE9IHRyZWcpCi0JCW9mZjEgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRyZWcsIEFULCBicmVnKTsKLQkJICBicmVnID0gMDsKLQkJICB0ZW1wcmVnID0gdHJlZzsKLQkJICBvZmYxID0gLTg7Ci0JCX0KLQotCSAgICAgIC8qIFNldCBtaXBzX29wdGltaXplIGFyb3VuZCB0aGUgbHVpIGluc3RydWN0aW9uIHRvIGF2b2lkCi0JCSBpbnNlcnRpbmcgYW4gdW5uZWNlc3Nhcnkgbm9wIGFmdGVyIHRoZSBsdy4gICovCi0JICAgICAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgICAgICBtaXBzX29wdGltaXplID0gMjsKLQkgICAgICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIEFUKTsKLQkgICAgICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCi0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgQVQsIEFULCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgdGVtcHJlZywgdGVtcHJlZywgQVQpOwotCSAgICAgICh2b2lkKSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDAsIDAsCi0JCQkgICAgICAgUkVMQVhfRU5DT0RFICgwLCAwLCAtMTYgKyBvZmYxLCAtOCwgMCwgMCksCi0JCQkgICAgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgICAgICB1c2VkX2F0ID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCXsKLQkgIGludCBncGRlbDsKLQotCSAgLyogVGhpcyBpcyB0aGUgbGFyZ2UgR09UIGNhc2UuICBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuCi0JICAgICBleHRlcm5hbCBzeW1ib2wsIGFuZCB0aGVyZSBpcyBubyBjb25zdGFudCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQotCSAgICAgSWYgd2UgaGF2ZSBhIHNtYWxsIGNvbnN0YW50LCBhbmQgdGhpcyBpcyBhIHJlZmVyZW5jZSB0bwotCSAgICAgYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRncAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkdGVtcHJlZykgKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PgotCSAgICAgRm9yIGEgbG9jYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSR0ZW1wcmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgYWRkaXUJJHRlbXByZWcsJHRlbXByZWcsPGNvbnN0YW50PiAoQkZEX1JFTE9DX0xPMTYpCi0KLQkgICAgIElmIHdlIGhhdmUgYSBsYXJnZSBjb25zdGFudCwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8KLQkgICAgIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4KLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkYXQKLQkgICAgIEZvciBhIGxvY2FsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbHVpCSRhdCw8aGljb25zdGFudD4KLQkgICAgICAgYWRkaXUJJGF0LCRhdCw8bG9jb25zdGFudD4JKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgICBhZGR1CSR0ZW1wcmVnLCR0ZW1wcmVnLCRhdAotCSAgICAgKi8KLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBmcmFnX2dyb3cgKDUyKTsKLQkgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkgICAgZ3BkZWwgPSA0OwotCSAgZWxzZQotCSAgICBncGRlbCA9IDA7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgZGJsID8gImxkIiA6ICJsdyIsCi0JCSAgICAgICAidCxvKGIpIiwgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0xPMTYsCi0JCSAgICAgICB0ZW1wcmVnKTsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPT0gMCkKLQkgICAgewotCSAgICAgIGludCBvZmY7Ci0KLQkgICAgICBpZiAoYnJlZyA9PSAwKQotCQlvZmYgPSAwOwotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIFdlJ3JlIGdvaW5nIHRvIHB1dCBpbiBhbiBhZGR1IGluc3RydWN0aW9uIHVzaW5nCi0JCSAgICAgdGVtcHJlZywgc28gd2UgbWF5IGFzIHdlbGwgaW5zZXJ0IHRoZSBub3AgcmlnaHQKLQkJICAgICBub3cuICAqLwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBvZmYgPSA0OwotCQl9Ci0KLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIGdwZGVsLCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoMTIgKyBvZmYsIDEyICsgZ3BkZWwsIGdwZGVsLAotCQkJCQkgIDggKyBncGRlbCwgMCwKLQkJCQkJICAoYnJlZyA9PSAwCi0JCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgIDogMCkpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGV4cHIxLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JCSAgICYmIGV4cHIxLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibm9wIiwgIiIpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgZ3BkZWwsIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgyMCwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwgMCwKLQkJCQkJICAoYnJlZyA9PSAwCi0JCQkJCSAgID8gbWlwc19vcHRzLndhcm5fYWJvdXRfbWFjcm9zCi0JCQkJCSAgIDogMCkpLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBhZGosIGRyZWc7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gYWRkIGluIGEgYmFzZSByZWdpc3RlciwgYW5kIHRoZQotCQkgdGFyZ2V0IHJlZ2lzdGVyIGFuZCB0aGUgYmFzZSByZWdpc3RlciBhcmUgdGhlIHNhbWUsCi0JCSB0aGVuIHdlIGFyZSB1c2luZyBBVCBhcyBhIHRlbXBvcmFyeSByZWdpc3Rlci4gIFNpbmNlCi0JCSB3ZSB3YW50IHRvIGxvYWQgdGhlIGNvbnN0YW50IGludG8gQVQsIHdlIGFkZCBvdXIKLQkJIGN1cnJlbnQgQVQgKGZyb20gdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUpIGFuZCB0aGUKLQkJIHJlZ2lzdGVyIGludG8gdGhlIHJlZ2lzdGVyIG5vdywgYW5kIHByZXRlbmQgd2Ugd2VyZQotCQkgbm90IHVzaW5nIGEgYmFzZSByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKGJyZWcgIT0gdHJlZykKLQkJewotCQkgIGFkaiA9IDA7Ci0JCSAgZHJlZyA9IHRlbXByZWc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc3NlcnQgKHRlbXByZWcgPT0gQVQpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm5vcCIsICIiKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRyZWcsIEFULCBicmVnKTsKLQkJICBkcmVnID0gdHJlZzsKLQkJICBhZGogPSA4OwotCQl9Ci0KLQkgICAgICAvKiBTZXQgbWlwc19vcHRpbWl6ZSBhcm91bmQgdGhlIGx1aSBpbnN0cnVjdGlvbiB0byBhdm9pZAotCQkgaW5zZXJ0aW5nIGFuIHVubmVjZXNzYXJ5IG5vcCBhZnRlciB0aGUgbHcuICAqLwotCSAgICAgIGhvbGRfbWlwc19vcHRpbWl6ZSA9IG1pcHNfb3B0aW1pemU7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBBVCk7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIEFULCBBVCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDE2ICsgZ3BkZWwgKyBhZGosIDAsCi0JCQkgICAgUkVMQVhfRU5DT0RFICgyNCArIGFkaiwgMTYgKyBncGRlbCArIGFkaiwgZ3BkZWwsCi0JCQkJCSAgOCArIGdwZGVsLCAwLAotCQkJCQkgIChicmVnID09IDAKLQkJCQkJICAgPyBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgOiAwKSksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQotCSAgICAgIHVzZWRfYXQgPSAxOwotCSAgICB9Ci0KLQkgIGlmIChncGRlbCA+IDApCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gdXNlcyAkZ3AsIGJ1dAotICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb24gdGhlIG1haW4gc3RyZWFtIGRvZXMgbm90LiAgKi8KLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICBkYmwgPyAibGQiIDogImx3IiwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA+PSAtMHg4MDAwCi0JICAgICAgJiYgZXhwcjEuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCSAgICB7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkJICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIC8qIEZJWE1FOiBJZiBhZGRfbnVtYmVyIGlzIDAsIGFuZCB0aGVyZSB3YXMgbm8gYmFzZQotICAgICAgICAgICAgICAgICByZWdpc3RlciwgdGhlIGV4dGVybmFsIHN5bWJvbCBjYXNlIGVuZGVkIHdpdGggYSBsb2FkLAotICAgICAgICAgICAgICAgICBzbyBpZiB0aGUgc3ltYm9sIHR1cm5zIG91dCB0byBub3QgYmUgZXh0ZXJuYWwsIGFuZAotICAgICAgICAgICAgICAgICB0aGUgbmV4dCBpbnN0cnVjdGlvbiB1c2VzIHRlbXByZWcsIGFuIHVubmVjZXNzYXJ5IG5vcAotICAgICAgICAgICAgICAgICB3aWxsIGJlIGluc2VydGVkLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGJyZWcgPT0gdHJlZykKLQkJewotCQkgIC8qIFdlIG11c3QgYWRkIGluIHRoZSBiYXNlIHJlZ2lzdGVyIG5vdywgYXMgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBzeW1ib2wgY2FzZS4gICovCi0JCSAgYXNzZXJ0ICh0ZW1wcmVnID09IEFUKTsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCQkgIHAgKz0gNDsKLQkJICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgICAgICJkLHYsdCIsIHRyZWcsIEFULCBicmVnKTsKLQkJICBwICs9IDQ7Ci0JCSAgdGVtcHJlZyA9IHRyZWc7Ci0JCSAgLyogV2Ugc2V0IGJyZWcgdG8gMCBiZWNhdXNlIHdlIGhhdmUgYXJyYW5nZWQgdG8gYWRkCi0gICAgICAgICAgICAgICAgICAgICBpdCBpbiBpbiBib3RoIGNhc2VzLiAgKi8KLQkJICBicmVnID0gMDsKLQkJfQotCi0JICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJmV4cHIxLCBBVCk7Ci0JICAgICAgcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJCSAgICJ0LHIsaiIsIEFULCBBVCwgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBBVCk7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gRU1CRURERURfUElDKQotCXsKLQkgIC8qIFdlIHVzZQotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkZ3AsPHN5bT4JKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCB0ZW1wcmVnLCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKGJyZWcgIT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkgICAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgImQsdix0IiwgdHJlZywgdGVtcHJlZywgYnJlZyk7Ci0KLSAgICAgIGlmICghIHVzZWRfYXQpCi0JcmV0dXJuOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9KX0E6Ci0gICAgICAvKiBUaGUgaiBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIHVzZWQgaW4gUElDIGNvZGUsIHNpbmNlIGl0Ci0JIHJlcXVpcmVzIGFuIGFic29sdXRlIGFkZHJlc3MuICBXZSBjb252ZXJ0IGl0IHRvIGEgYgotCSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAiaiIsICJhIik7Ci0gICAgICBlbHNlCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJiIiwgInAiKTsKLSAgICAgIHJldHVybjsKLQotICAgICAgLyogVGhlIGphbCBpbnN0cnVjdGlvbnMgbXVzdCBiZSBoYW5kbGVkIGFzIG1hY3JvcyBiZWNhdXNlIHdoZW4KLQkgZ2VuZXJhdGluZyBQSUMgY29kZSB0aGV5IGV4cGFuZCB0byBtdWx0aS1pbnN0cnVjdGlvbgotCSBzZXF1ZW5jZXMuICBOb3JtYWxseSB0aGV5IGFyZSBzaW1wbGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgICBjYXNlIE1fSkFMXzE6Ci0gICAgICBkcmVnID0gUkE7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgTV9KQUxfMjoKLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgIHx8IG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiamFsciIsCi0JCSAgICAgImQscyIsIGRyZWcsIHNyZWcpOwotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaWYgKHNyZWcgIT0gUElDX0NBTExfUkVHKQotCSAgICBhc193YXJuIChfKCJNSVBTIFBJQyBjYWxsIHRvIHJlZ2lzdGVyIG90aGVyIHRoYW4gJDI1IikpOwotICAgICAgCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiamFsciIsCi0JCSAgICAgICAiZCxzIiwgZHJlZywgc3JlZyk7Ci0JICBpZiAobWlwc19jcHJlc3RvcmVfb2Zmc2V0IDwgMCkKLQkgICAgYXNfd2FybiAoXygiTm8gLmNwcmVzdG9yZSBwc2V1ZG8tb3AgdXNlZCBpbiBQSUMgY29kZSIpKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IG1pcHNfY3ByZXN0b3JlX29mZnNldDsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsIG1pcHNfZnJhbWVfcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX0pBTF9BOgotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQykKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImphbCIsICJhIik7Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgYW5kIHdlIGFyZQotCSAgICAgdXNpbmcgYSBzbWFsbCBHT1QsIHdlIHdhbnQKLQkgICAgICAgbHcJJDI1LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19DQUxMMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBqYWxyCSQyNQotCSAgICAgICBub3AKLQkgICAgICAgbHcJJGdwLGNwcmVzdG9yZSgkc3ApCi0JICAgICBUaGUgY3ByZXN0b3JlIHZhbHVlIGlzIHNldCB1c2luZyB0aGUgLmNwcmVzdG9yZQotCSAgICAgcHNldWRvLW9wLiAgSWYgd2UgYXJlIHVzaW5nIGEgYmlnIEdPVCwgd2Ugd2FudAotCSAgICAgICBsdWkJJDI1LDxzeW0+CQkoQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2KQotCSAgICAgICBhZGR1CSQyNSwkMjUsJGdwCi0JICAgICAgIGx3CSQyNSw8c3ltPigkMjUpCQkoQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KQotCSAgICAgICBub3AKLQkgICAgICAgamFscgkkMjUKLQkgICAgICAgbm9wCi0JICAgICAgIGx3CSRncCxjcHJlc3RvcmUoJHNwKQotCSAgICAgSWYgdGhlIHN5bWJvbCBpcyBub3QgZXh0ZXJuYWwsIHdlIHdhbnQKLQkgICAgICAgbHcJJDI1LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSQyNSwkMjUsPHN5bT4JCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgamFscgkkMjUKLQkgICAgICAgbm9wCi0JICAgICAgIGx3ICRncCxjcHJlc3RvcmUoJHNwKSAqLwotCSAgZnJhZ19ncm93ICg0MCk7Ci0JICBpZiAoISBtaXBzX2JpZ19nb3QpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBQSUNfQ0FMTF9SRUcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19DQUxMMTYsIEdQKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgIm5vcCIsICIiKTsKLQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA0LCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoMCwgNCwgLTgsIDAsIDAsIDApLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBncGRlbDsKLQotCSAgICAgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkJZ3BkZWwgPSA0OwotCSAgICAgIGVsc2UKLQkJZ3BkZWwgPSAwOwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHVpIiwgInQsdSIsCi0JCQkgICBQSUNfQ0FMTF9SRUcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNik7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICAgImQsdix0IiwgUElDX0NBTExfUkVHLCBQSUNfQ0FMTF9SRUcsIEdQKTsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgICA/ICJsdyIgOiAibGQiKSwKLQkJCSAgICJ0LG8oYikiLCBQSUNfQ0FMTF9SRUcsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTYsIFBJQ19DQUxMX1JFRyk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICJub3AiLCAiIik7Ci0JICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIgKyBncGRlbCwgMCwKLQkJCSAgICBSRUxBWF9FTkNPREUgKDE2LCAxMiArIGdwZGVsLCBncGRlbCwgOCArIGdwZGVsLAotCQkJCQkgIDAsIDApLAotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgKG9mZnNldFQpIDAsCi0JCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0JICAgICAgaWYgKGdwZGVsID4gMCkKLQkJewotCQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JCSAgcCArPSA0OwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAibHciIDogImxkIiksCi0JCQkgICAidCxvKGIpIiwgUElDX0NBTExfUkVHLAotCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgICAgICBwICs9IDQ7Ci0JICAgIH0JCQkgICAKLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQk/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBQSUNfQ0FMTF9SRUcsIFBJQ19DQUxMX1JFRywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAiamFsciIsICJzIiwgUElDX0NBTExfUkVHKTsKLQkgIGlmIChtaXBzX2NwcmVzdG9yZV9vZmZzZXQgPCAwKQotCSAgICBhc193YXJuIChfKCJObyAuY3ByZXN0b3JlIHBzZXVkby1vcCB1c2VkIGluIFBJQyBjb2RlIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICJub3AiLCAiIik7Ci0JICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gbWlwc19jcHJlc3RvcmVfb2Zmc2V0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImx3IiA6ICJsZCIpLAotCQkJICAgInQsbyhiKSIsIEdQLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwKLQkJCSAgIG1pcHNfZnJhbWVfcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImJhbCIsICJwIik7Ci0JICAvKiBUaGUgbGlua2VyIG1heSBleHBhbmQgdGhlIGNhbGwgdG8gYSBsb25nZXIgc2VxdWVuY2Ugd2hpY2gKLQkgICAgIHVzZXMgJGF0LCBzbyB3ZSBtdXN0IGJyZWFrIHJhdGhlciB0aGFuIHJldHVybi4gICovCi0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9MQl9BQjoKLSAgICAgIHMgPSAibGIiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTEJVX0FCOgotICAgICAgcyA9ICJsYnUiOwotICAgICAgZ290byBsZDsKLSAgICBjYXNlIE1fTEhfQUI6Ci0gICAgICBzID0gImxoIjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xIVV9BQjoKLSAgICAgIHMgPSAibGh1IjsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xXX0FCOgotICAgICAgcyA9ICJsdyI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MwX0FCOgotICAgICAgcyA9ICJsd2MwIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MxX0FCOgotICAgICAgcyA9ICJsd2MxIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MyX0FCOgotICAgICAgcyA9ICJsd2MyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0MzX0FCOgotICAgICAgcyA9ICJsd2MzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV0xfQUI6Ci0gICAgICBzID0gImx3bCI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV1JfQUI6Ci0gICAgICBzID0gImx3ciI7Ci0gICAgICBsciA9IDE7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MREMxX0FCOgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBzID0gImxkYzEiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEQzJfQUI6Ci0gICAgICBzID0gImxkYzIiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEQzNfQUI6Ci0gICAgICBzID0gImxkYzMiOwotICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotICAgICAgY29wcm9jID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xETF9BQjoKLSAgICAgIHMgPSAibGRsIjsKLSAgICAgIGxyID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xEUl9BQjoKLSAgICAgIHMgPSAibGRyIjsKLSAgICAgIGxyID0gMTsKLSAgICAgIGdvdG8gbGQ7Ci0gICAgY2FzZSBNX0xMX0FCOgotICAgICAgcyA9ICJsbCI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MTERfQUI6Ci0gICAgICBzID0gImxsZCI7Ci0gICAgICBnb3RvIGxkOwotICAgIGNhc2UgTV9MV1VfQUI6Ci0gICAgICBzID0gImx3dSI7Ci0gICAgbGQ6Ci0gICAgICBpZiAoYnJlZyA9PSB0cmVnIHx8IGNvcHJvYyB8fCBscikKLQl7Ci0JICB0ZW1wcmVnID0gQVQ7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdGVtcHJlZyA9IHRyZWc7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBnb3RvIGxkX3N0OwotICAgIGNhc2UgTV9TQl9BQjoKLSAgICAgIHMgPSAic2IiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0hfQUI6Ci0gICAgICBzID0gInNoIjsKLSAgICAgIGdvdG8gc3Q7Ci0gICAgY2FzZSBNX1NXX0FCOgotICAgICAgcyA9ICJzdyI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MwX0FCOgotICAgICAgcyA9ICJzd2MwIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MxX0FCOgotICAgICAgcyA9ICJzd2MxIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MyX0FCOgotICAgICAgcyA9ICJzd2MyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0MzX0FCOgotICAgICAgcyA9ICJzd2MzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV0xfQUI6Ci0gICAgICBzID0gInN3bCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TV1JfQUI6Ci0gICAgICBzID0gInN3ciI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TQ19BQjoKLSAgICAgIHMgPSAic2MiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0NEX0FCOgotICAgICAgcyA9ICJzY2QiOwotICAgICAgZ290byBzdDsKLSAgICBjYXNlIE1fU0RDMV9BQjoKLSAgICAgIGlmIChtaXBzX2NwdSA9PSA0NjUwKQotCXsKLQkgIGFzX2JhZCAoXygib3Bjb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwcm9jZXNzb3IiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgcyA9ICJzZGMxIjsKLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TREMyX0FCOgotICAgICAgcyA9ICJzZGMyIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TREMzX0FCOgotICAgICAgcyA9ICJzZGMzIjsKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TRExfQUI6Ci0gICAgICBzID0gInNkbCI7Ci0gICAgICBnb3RvIHN0OwotICAgIGNhc2UgTV9TRFJfQUI6Ci0gICAgICBzID0gInNkciI7Ci0gICAgc3Q6Ci0gICAgICB0ZW1wcmVnID0gQVQ7Ci0gICAgICB1c2VkX2F0ID0gMTsKLSAgICBsZF9zdDoKLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGlmIChtYXNrID09IE1fTFdDMV9BQgotCSAgfHwgbWFzayA9PSBNX1NXQzFfQUIKLQkgIHx8IG1hc2sgPT0gTV9MREMxX0FCCi0JICB8fCBtYXNrID09IE1fU0RDMV9BQgotCSAgfHwgbWFzayA9PSBNX0xfREFCCi0JICB8fCBtYXNrID09IE1fU19EQUIpCi0JZm10ID0gIlQsbyhiKSI7Ci0gICAgICBlbHNlIGlmIChjb3Byb2MpCi0JZm10ID0gIkUsbyhiKSI7Ci0gICAgICBlbHNlCi0JZm10ID0gInQsbyhiKSI7Ci0KLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQKLQkgICYmIG9mZnNldF9leHByLlhfb3AgIT0gT19zeW1ib2wpCi0JewotCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JfQotCi0gICAgICAvKiBBIGNvbnN0YW50IGV4cHJlc3Npb24gaW4gUElDIGNvZGUgY2FuIGJlIGhhbmRsZWQganVzdCBhcyBpdAotCSBpcyBpbiBub24gUElDIGNvZGUuICAqLwotICAgICAgaWYgKG1pcHNfcGljID09IE5PX1BJQwotCSAgfHwgb2Zmc2V0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYSBHUCByZWxhdGl2ZSBzeW1ib2wsIGFuZCB0aGVyZQotCSAgICAgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2Ugd2FudAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgIElmIHdlIGhhdmUgYSBjb25zdGFudCwgd2UgbmVlZCB0d28gaW5zdHJ1Y3Rpb25zIGFueWhvdywKLQkgICAgIHNvIHdlIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBmb3JtLgotCi0JICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3RlciwgYW5kIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYQotCSAgICAgR1AgcmVsYXRpdmUgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJGJyZWcsJGdwCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIE90aGVyd2lzZSB3ZSB3YW50Ci0JICAgICAgIGx1aQkkdGVtcHJlZyw8c3ltPgkJKEJGRF9SRUxPQ19ISTE2X1MpCi0JICAgICAgIGFkZHUJJHRlbXByZWcsJHRlbXByZWcsJGJyZWcKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkdGVtcHJlZykJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgV2l0aCBhIGNvbnN0YW50IHdlIGFsd2F5cyB1c2UgdGhlIGxhdHRlciBjYXNlLiAgKi8KLQkgIGlmIChicmVnID09IDApCi0JICAgIHsKLQkgICAgICBpZiAoKHZhbHVlVCkgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IE1BWF9HUFJFTF9PRkZTRVQKLQkJICB8fCBub3BpY19uZWVkX3JlbGF4IChvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIDEpKQotCQlwID0gTlVMTDsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcmFnX2dyb3cgKDIwKTsKLQkJICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCBHUCk7Ci0JCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgOCwgMCwKLQkJCQlSRUxBWF9FTkNPREUgKDQsIDgsIDAsIDQsIDAsCi0JCQkJCSAgICAgIChtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MKLQkJCQkJICAgICAgIHx8ICh1c2VkX2F0Ci0JCQkJCQkgICAmJiBtaXBzX29wdHMubm9hdCkpKSwKLQkJCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJCShjaGFyICopIE5VTEwpOwotCQkgIHVzZWRfYXQgPSAwOwotCQl9Ci0JICAgICAgbWFjcm9fYnVpbGRfbHVpIChwLCAmaWNudCwgJm9mZnNldF9leHByLCB0ZW1wcmVnKTsKLQkgICAgICBpZiAocCAhPSBOVUxMKQotCQlwICs9IDQ7Ci0JICAgICAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwgdHJlZywKLQkJCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCB0ZW1wcmVnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCh2YWx1ZVQpIG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSBNQVhfR1BSRUxfT0ZGU0VUCi0JCSAgfHwgbm9waWNfbmVlZF9yZWxheCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAxKSkKLQkJcCA9IE5VTEw7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZnJhZ19ncm93ICgyOCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkJPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICAgICAiZCx2LHQiLCB0ZW1wcmVnLCBicmVnLCBHUCk7Ci0JCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTIsIDAsCi0JCQkJUkVMQVhfRU5DT0RFICg4LCAxMiwgMCwgOCwgMCwgMCksCi0JCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCQkoY2hhciAqKSBOVUxMKTsKLQkJfQotCSAgICAgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgdGVtcHJlZyk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIGJyZWcpOwotCSAgICAgIGlmIChwICE9IE5VTEwpCi0JCXAgKz0gNDsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LCB0cmVnLAotCQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIHRlbXByZWcpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMgJiYgISBtaXBzX2JpZ19nb3QpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBzeW1ib2wsIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJHRlbXByZWcpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkdGVtcHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIGFkZGl1CSR0ZW1wcmVnLCR0ZW1wcmVnLDxzeW0+CShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSBhZGQgaXQgdG8gJHRlbXByZWcgYmVmb3JlCi0JICAgICB0aGUgPG9wPi4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQsIHdlIHN0aWNrIGl0IGluIHRoZQotCSAgICAgPG9wPiBpbnN0cnVjdGlvbi4gIFdlIGRvbid0IGhhbmRsZSBjb25zdGFudHMgbGFyZ2VyIHRoYW4KLQkgICAgIDE2IGJpdHMsIGJlY2F1c2Ugd2UgaGF2ZSBubyB3YXkgdG8gbG9hZCB0aGUgdXBwZXIgMTYgYml0cwotCSAgICAgKGFjdHVhbGx5LCB3ZSBjb3VsZCBoYW5kbGUgdGhlbSBmb3IgdGhlIHN1YnNldCBvZiBjYXNlcwotCSAgICAgaW4gd2hpY2ggd2UgYXJlIG5vdCB1c2luZyAkYXQpLiAgKi8KLQkgIGFzc2VydCAob2Zmc2V0X2V4cHIuWF9vcCA9PSBPX3N5bWJvbCk7Ci0JICBleHByMS5YX2FkZF9udW1iZXIgPSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXI7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCSAgaWYgKGV4cHIxLlhfYWRkX251bWJlciA8IC0weDgwMDAKLQkgICAgICB8fCBleHByMS5YX2FkZF9udW1iZXIgPj0gMHg4MDAwKQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGZyYWdfZ3JvdyAoMjApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDAsIAotCQkJUkVMQVhfRU5DT0RFICgwLCA0LCAtOCwgMCwgMCwgMCksCi0JCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJKGNoYXIgKikgTlVMTCk7Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIHRlbXByZWcsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBicmVnKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsIHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgdGVtcHJlZyk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaW50IGdwZGVsOwotCi0JICAvKiBJZiB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJHRlbXByZWcsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkdGVtcHJlZywkdGVtcHJlZywkZ3AKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJHRlbXByZWcpIChCRkRfUkVMT0NfTUlQU19HT1RfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZywwKCR0ZW1wcmVnKQotCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICAgICAgbHcJJHRlbXByZWcsPHN5bT4oJGdwKQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICBhZGRpdQkkdGVtcHJlZywkdGVtcHJlZyw8c3ltPgkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIDxvcD4JJHRyZWcsMCgkdGVtcHJlZykKLQkgICAgIElmIHRoZXJlIGlzIGEgYmFzZSByZWdpc3Rlciwgd2UgYWRkIGl0IHRvICR0ZW1wcmVnIGJlZm9yZQotCSAgICAgdGhlIDxvcD4uICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCB3ZSBzdGljayBpdCBpbiB0aGUKLQkgICAgIDxvcD4gaW5zdHJ1Y3Rpb24uICBXZSBkb24ndCBoYW5kbGUgY29uc3RhbnRzIGxhcmdlciB0aGFuCi0JICAgICAxNiBiaXRzLCBiZWNhdXNlIHdlIGhhdmUgbm8gd2F5IHRvIGxvYWQgdGhlIHVwcGVyIDE2IGJpdHMKLQkgICAgIChhY3R1YWxseSwgd2UgY291bGQgaGFuZGxlIHRoZW0gZm9yIHRoZSBzdWJzZXQgb2YgY2FzZXMKLQkgICAgIGluIHdoaWNoIHdlIGFyZSBub3QgdXNpbmcgJGF0KS4gICovCi0JICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCkKLQkgICAgYXNfYmFkIChfKCJQSUMgY29kZSBvZmZzZXQgb3ZlcmZsb3cgKG1heCAxNiBzaWduZWQgYml0cykiKSk7Ci0JICBpZiAocmVnX25lZWRzX2RlbGF5IChHUCkpCi0JICAgIGdwZGVsID0gNDsKLQkgIGVsc2UKLQkgICAgZ3BkZWwgPSAwOwotCSAgZnJhZ19ncm93ICgzNik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX01JUFNfR09UX0hJMTYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCSAgICAgICAiZCx2LHQiLCB0ZW1wcmVnLCB0ZW1wcmVnLCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIHRlbXByZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2LAotCQkgICAgICAgdGVtcHJlZyk7Ci0JICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMiArIGdwZGVsLCAwLAotCQkJUkVMQVhfRU5DT0RFICgxMiwgMTIgKyBncGRlbCwgZ3BkZWwsIDggKyBncGRlbCwgMCwgMCksCi0JCQlvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLCAoY2hhciAqKSBOVUxMKTsKLQkgIGlmIChncGRlbCA+IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAibm9wIiwgIiIpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCB0ZW1wcmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgdGVtcHJlZywgdGVtcHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkJICJkLHYsdCIsIHRlbXByZWcsIHRlbXByZWcsIGJyZWcpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwgdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCB0ZW1wcmVnKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgLyogSWYgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlciwgd2Ugd2FudAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyLCB3ZSB3YW50Ci0JICAgICAgIGFkZHUJJHRlbXByZWcsJGJyZWcsJGdwCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJHRlbXByZWcpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICovCi0JICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19zeW1ib2wpOwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgR1ApOwotCSAgICAgIHVzZWRfYXQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCB0ZW1wcmVnLCBicmVnLCBHUCk7Ci0JICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJCSAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQotICAgICAgaWYgKCEgdXNlZF9hdCkKLQlyZXR1cm47Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0xJOgotICAgIGNhc2UgTV9MSV9TOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMCk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRExJOgotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMSk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fTElfU1M6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sCi0JCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQKLQkJCQkJICAgKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCkpLAotCQkJICAgICAiLmxpdDQiKSA9PSAwCi0JCSAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsd2MxIiwgIlQsbyhiKSIsCi0JCSAgICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMLCBHUCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgY2FzZSBNX0xJX0Q6Ci0gICAgICAvKiBJZiB3ZSBoYXZlIGEgY29uc3RhbnQgaW4gSU1NX0VYUFIsIHRoZW4gaW4gbWlwczMgbW9kZSBpdCBpcwotICAgICAgICAgdGhlIGVudGlyZSB2YWx1ZSwgYW5kIGluIG1pcHMxIG1vZGUgaXQgaXMgdGhlIGhpZ2ggb3JkZXIgMzIKLSAgICAgICAgIGJpdHMgb2YgdGhlIHZhbHVlIGFuZCB0aGUgbG93IG9yZGVyIDMyIGJpdHMgYXJlIGVpdGhlciB6ZXJvCi0gICAgICAgICBvciBpbiBvZmZzZXRfZXhwci4gICovCi0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50IHx8IGltbV9leHByLlhfb3AgPT0gT19iaWcpCi0JewotCSAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMykKLQkgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIHRyZWcsICZpbW1fZXhwciwgMSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgaHJlZywgbHJlZzsKLQotCSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQkJewotCQkgIGhyZWcgPSB0cmVnOwotCQkgIGxyZWcgPSB0cmVnICsgMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGhyZWcgPSB0cmVnICsgMTsKLQkJICBscmVnID0gdHJlZzsKLQkJfQotCi0JICAgICAgaWYgKGhyZWcgPD0gMzEpCi0JCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBocmVnLCAmaW1tX2V4cHIsIDApOwotCSAgICAgIGlmIChscmVnIDw9IDMxKQotCQl7Ci0JCSAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19hYnNlbnQpCi0JCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtb3ZlIiwgImQscyIsCi0JCQkJIGxyZWcsIDApOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpOwotCQkgICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgbHJlZywgJm9mZnNldF9leHByLCAwKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBXZSBrbm93IHRoYXQgc3ltIGlzIGluIHRoZSAucmRhdGEgc2VjdGlvbi4gIEZpcnN0IHdlIGdldCB0aGUKLQkgdXBwZXIgMTYgYml0cyBvZiB0aGUgYWRkcmVzcy4gICovCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDKQotCXsKLQkgIC8qIEZJWE1FOiBUaGlzIHdvbid0IHdvcmsgZm9yIGEgNjQgYml0IGFkZHJlc3MuICAqLwotCSAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBBVCk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMpCi0JewotCSAgLyogRm9yIGVtYmVkZGVkIFBJQyB3ZSBwaWNrIHVwIHRoZSBlbnRpcmUgYWRkcmVzcyBvZmYgJGdwIGluCi0JICAgICBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImFkZGl1IiA6ICJkYWRkaXUiKSwKLQkJICAgICAgICJ0LHIsaiIsIEFULCBHUCwgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLQkKLSAgICAgIC8qIE5vdyB3ZSBsb2FkIHRoZSByZWdpc3RlcihzKS4gICovCi0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAzKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGQiLCAidCxvKGIpIiwKLQkJICAgICB0cmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgZWxzZQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHciLCAidCxvKGIpIiwKLQkJICAgICAgIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBpZiAodHJlZyAhPSAzMSkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBIb3cgaW4gdGhlIHdvcmxkIGRvIHdlIGRlYWwgd2l0aCB0aGUgcG9zc2libGUKLQkJIG92ZXJmbG93IGhlcmU/ICAqLwotCSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibHciLCAidCxvKGIpIiwKLQkJCSAgIHRyZWcgKyAxLCAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBUbyBhdm9pZCBjb25mdXNpb24gaW4gdGNfZ2VuX3JlbG9jLCB3ZSBtdXN0IGVuc3VyZSB0aGF0IHRoaXMKLQkgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9MSV9ERDoKLSAgICAgIC8qIElmIHdlIGhhdmUgYSBjb25zdGFudCBpbiBJTU1fRVhQUiwgdGhlbiBpbiBtaXBzMyBtb2RlIGl0IGlzCi0gICAgICAgICB0aGUgZW50aXJlIHZhbHVlLCBhbmQgaW4gbWlwczEgbW9kZSBpdCBpcyB0aGUgaGlnaCBvcmRlciAzMgotICAgICAgICAgYml0cyBvZiB0aGUgdmFsdWUgYW5kIHRoZSBsb3cgb3JkZXIgMzIgYml0cyBhcmUgZWl0aGVyIHplcm8KLSAgICAgICAgIG9yIGluIG9mZnNldF9leHByLiAgKi8KLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgfHwgaW1tX2V4cHIuWF9vcCA9PSBPX2JpZykKLQl7Ci0JICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgbWlwc19vcHRzLmlzYSA+PSAzKTsKLQkgIGlmIChtaXBzX29wdHMuaXNhID49IDMpCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgImRtdGMxIiwgInQsUyIsIEFULCB0cmVnKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAibXRjMSIsICJ0LEciLCBBVCwgdHJlZyArIDEpOwotCSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fYWJzZW50KQotCQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgICAibXRjMSIsICJ0LEciLCAwLCB0cmVnKTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc3NlcnQgKG9mZnNldF9leHByLlhfb3AgPT0gT19jb25zdGFudCk7Ci0JCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmb2Zmc2V0X2V4cHIsIDApOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgIm10YzEiLCAidCxHIiwgQVQsIHRyZWcpOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLQotICAgICAgYXNzZXJ0IChvZmZzZXRfZXhwci5YX29wID09IE9fc3ltYm9sCi0JICAgICAgJiYgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID09IDApOwotICAgICAgcyA9IHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAob2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sKSk7Ci0gICAgICBpZiAoc3RyY21wIChzLCAiLmxpdDgiKSA9PSAwKQotCXsKLQkgIGlmIChtaXBzX29wdHMuaXNhID49IDIpCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImxkYzEiLAotCQkJICAgIlQsbyhiKSIsIHRyZWcsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0xJVEVSQUwsIEdQKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGJyZWcgPSBHUDsKLQkgIHIgPSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOwotCSAgZ290byBkb2I7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzc2VydCAoc3RyY21wIChzLCBSREFUQV9TRUNUSU9OX05BTUUpID09IDApOwotCSAgaWYgKG1pcHNfcGljID09IFNWUjRfUElDKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJCSAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICA/ICJsdyIgOiAibGQiKSwKLQkJCSAidCxvKGIpIiwgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVDE2LCBHUCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogVGhpcyB3b24ndCB3b3JrIGZvciBhIDY0IGJpdCBhZGRyZXNzLiAgKi8KLQkgICAgICBtYWNyb19idWlsZF9sdWkgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIEFUKTsKLQkgICAgfQotCSAgICAgIAotCSAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMikKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAibGRjMSIsCi0JCQkgICAiVCxvKGIpIiwgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQotCSAgICAgIC8qIFRvIGF2b2lkIGNvbmZ1c2lvbiBpbiB0Y19nZW5fcmVsb2MsIHdlIG11c3QgZW5zdXJlCi0JCSB0aGF0IHRoaXMgZG9lcyBub3QgYmVjb21lIGEgdmFyaWFudCBmcmFnLiAgKi8KLQkgICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLQkgICAgICBmcmFnX25ldyAoMCk7Ci0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlZyA9IEFUOwotCSAgciA9IEJGRF9SRUxPQ19MTzE2OwotCSAgZ290byBkb2I7Ci0JfQotCi0gICAgY2FzZSBNX0xfRE9COgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCi0JIHRvIGFkanVzdCB3aGVuIGxvYWRpbmcgZnJvbSBtZW1vcnkuICAqLwotICAgICAgciA9IEJGRF9SRUxPQ19MTzE2OwotICAgIGRvYjoKLSAgICAgIGFzc2VydCAobWlwc19vcHRzLmlzYSA8IDIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsd2MxIiwgIlQsbyhiKSIsCi0JCSAgIHRhcmdldF9iaWdfZW5kaWFuID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAoaW50KSByLCBicmVnKTsKLSAgICAgIC8qIEZJWE1FOiBBIHBvc3NpYmxlIG92ZXJmbG93IHdoaWNoIEkgZG9uJ3Qga25vdyBob3cgdG8gZGVhbAotCSB3aXRoLiAgKi8KLSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsd2MxIiwgIlQsbyhiKSIsCi0JCSAgIHRhcmdldF9iaWdfZW5kaWFuID8gdHJlZyA6IHRyZWcgKyAxLAotCQkgICAoaW50KSByLCBicmVnKTsKLQotICAgICAgLyogVG8gYXZvaWQgY29uZnVzaW9uIGluIHRjX2dlbl9yZWxvYywgd2UgbXVzdCBlbnN1cmUgdGhhdCB0aGlzCi0JIGRvZXMgbm90IGJlY29tZSBhIHZhcmlhbnQgZnJhZy4gICovCi0gICAgICBmcmFnX3dhbmUgKGZyYWdfbm93KTsKLSAgICAgIGZyYWdfbmV3ICgwKTsKLQotICAgICAgaWYgKGJyZWcgIT0gQVQpCi0JcmV0dXJuOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fTF9EQUI6Ci0gICAgICAvKgotICAgICAgICogVGhlIE1JUFMgYXNzZW1ibGVyIHNlZW1zIHRvIGNoZWNrIGZvciBYX2FkZF9udW1iZXIgbm90Ci0gICAgICAgKiBiZWluZyBkb3VibGUgYWxpZ25lZCBhbmQgZ2VuZXJhdGluZzoKLSAgICAgICAqCWx1aQlhdCwlaGkoZm9vKzEpCi0gICAgICAgKglhZGR1CWF0LGF0LHYxCi0gICAgICAgKglhZGRpdQlhdCxhdCwlbG8oZm9vKzEpCi0gICAgICAgKglsd2MxCWYyLDAoYXQpCi0gICAgICAgKglsd2MxCWYzLDQoYXQpCi0gICAgICAgKiBCdXQsIHRoZSByZXN1bHRpbmcgYWRkcmVzcyBpcyB0aGUgc2FtZSBhZnRlciByZWxvY2F0aW9uIHNvIHdoeQotICAgICAgICogZ2VuZXJhdGUgdGhlIGV4dHJhIGluc3RydWN0aW9uPwotICAgICAgICovCi0gICAgICBpZiAobWlwc19jcHUgPT0gNDY1MCkKLQl7Ci0JICBhc19iYWQgKF8oIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIikpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLSAgICAgIGNvcHJvYyA9IDE7Ci0gICAgICBpZiAobWlwc19vcHRzLmlzYSA+PSAyKQotCXsKLQkgIHMgPSAibGRjMSI7Ci0JICBnb3RvIGxkOwotCX0KLQotICAgICAgcyA9ICJsd2MxIjsKLSAgICAgIGZtdCA9ICJULG8oYikiOwotICAgICAgZ290byBsZGRfc3RkOwotCi0gICAgY2FzZSBNX1NfREFCOgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChtaXBzX29wdHMuaXNhID49IDIpCi0JewotCSAgcyA9ICJzZGMxIjsKLQkgIGdvdG8gc3Q7Ci0JfQotCi0gICAgICBzID0gInN3YzEiOwotICAgICAgZm10ID0gIlQsbyhiKSI7Ci0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBjb3Byb2MgPSAxOwotICAgICAgZ290byBsZGRfc3RkOwotCi0gICAgY2FzZSBNX0xEX0FCOgotICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMykKLQl7Ci0JICBzID0gImxkIjsKLQkgIGdvdG8gbGQ7Ci0JfQotCi0gICAgICBzID0gImx3IjsKLSAgICAgIGZtdCA9ICJ0LG8oYikiOwotICAgICAgZ290byBsZGRfc3RkOwotCi0gICAgY2FzZSBNX1NEX0FCOgotICAgICAgaWYgKG1pcHNfb3B0cy5pc2EgPj0gMykKLQl7Ci0JICBzID0gInNkIjsKLQkgIGdvdG8gc3Q7Ci0JfQotCi0gICAgICBzID0gInN3IjsKLSAgICAgIGZtdCA9ICJ0LG8oYikiOwotCi0gICAgbGRkX3N0ZDoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wICE9IE9fc3ltYm9sCi0JICAmJiBvZmZzZXRfZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgYXNfYmFkIChfKCJleHByZXNzaW9uIHRvbyBjb21wbGV4IikpOwotCSAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JfQotCi0gICAgICAvKiBFdmVuIG9uIGEgYmlnIGVuZGlhbiBtYWNoaW5lICRmbiBjb21lcyBiZWZvcmUgJGZuKzEuICBXZSBoYXZlCi0JIHRvIGFkanVzdCB3aGVuIGxvYWRpbmcgZnJvbSBtZW1vcnkuICBXZSBzZXQgY29wcm9jIGlmIHdlIG11c3QKLQkgbG9hZCAkZm4rMSBmaXJzdC4gICovCi0gICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQljb3Byb2MgPSAwOwotCi0gICAgICBpZiAobWlwc19waWMgPT0gTk9fUElDCi0JICB8fCBvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgLyogSWYgdGhpcyBpcyBhIHJlZmVyZW5jZSB0byBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRncCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgIElmIHdlIGhhdmUgYSBiYXNlIHJlZ2lzdGVyLCB3ZSB1c2UgdGhpcwotCSAgICAgICBhZGR1CSRhdCwkYnJlZywkZ3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB0aGlzIGlzIG5vdCBhIEdQIHJlbGF0aXZlIHN5bWJvbCwgd2Ugd2FudAotCSAgICAgICBsdWkJJGF0LDxzeW0+CQkoQkZEX1JFTE9DX0hJMTZfUykKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIsIHdlIGFkZCBpdCB0byAkYXQgYWZ0ZXIgdGhlCi0JICAgICBsdWkgaW5zdHJ1Y3Rpb24uICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50LCB3ZSBhbHdheXMgdXNlCi0JICAgICB0aGUgbGFzdCBjYXNlLiAgKi8KLQkgIGlmICgodmFsdWVUKSBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gTUFYX0dQUkVMX09GRlNFVAotCSAgICAgIHx8IG5vcGljX25lZWRfcmVsYXggKG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCwgMSkpCi0JICAgIHsKLQkgICAgICBwID0gTlVMTDsKLQkgICAgICB1c2VkX2F0ID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IG9mZjsKLQotCSAgICAgIGlmIChicmVnID09IDApCi0JCXsKLQkJICBmcmFnX2dyb3cgKDI4KTsKLQkJICB0ZW1wcmVnID0gR1A7Ci0JCSAgb2ZmID0gMDsKLQkJICB1c2VkX2F0ID0gMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZyYWdfZ3JvdyAoMzYpOwotCQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJCT8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAgICAgImQsdix0IiwgQVQsIGJyZWcsIEdQKTsKLQkJICB0ZW1wcmVnID0gQVQ7Ci0JCSAgb2ZmID0gNDsKLQkJICB1c2VkX2F0ID0gMTsKLQkJfQotCi0gICAgICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgZm10LAotCQkJICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkJICAgKGludCkgQkZEX1JFTE9DX01JUFNfR1BSRUwsIHRlbXByZWcpOwotCSAgICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotCi0JICAgICAgLyogU2V0IG1pcHNfb3B0aW1pemUgdG8gMiB0byBhdm9pZCBpbnNlcnRpbmcgYW4KLSAgICAgICAgICAgICAgICAgdW5kZXNpcmVkIG5vcC4gICovCi0JICAgICAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgICAgICBtaXBzX29wdGltaXplID0gMjsKLSAgICAgICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCQkgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCQkgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JICAgICAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotCSAgICAgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDEyICsgb2ZmLCAwLAotCQkJICAgIFJFTEFYX0VOQ09ERSAoOCArIG9mZiwgMTIgKyBvZmYsIDAsIDQgKyBvZmYsIDEsCi0JCQkJCSAgdXNlZF9hdCAmJiBtaXBzX29wdHMubm9hdCksCi0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCSAgICAoY2hhciAqKSBOVUxMKTsKLQotCSAgICAgIC8qIFdlIGp1c3QgZ2VuZXJhdGVkIHR3byByZWxvY3MuICBXaGVuIHRjX2dlbl9yZWxvYwotCQkgaGFuZGxlcyB0aGlzIGNhc2UsIGl0IHdpbGwgc2tpcCB0aGUgZmlyc3QgcmVsb2MgYW5kCi0JCSBoYW5kbGUgdGhlIHNlY29uZC4gIFRoZSBzZWNvbmQgcmVsb2MgYWxyZWFkeSBoYXMgYW4KLQkJIGV4dHJhIGFkZGVuZCBvZiA0LCB3aGljaCB3ZSBhZGRlZCBhYm92ZS4gIFdlIG11c3QKLQkJIHN1YnRyYWN0IGl0IG91dCwgYW5kIHRoZW4gc3VidHJhY3QgYW5vdGhlciA0IHRvIG1ha2UKLQkJIHRoZSBmaXJzdCByZWxvYyBjb21lIG91dCByaWdodC4gIFRoZSBzZWNvbmQgcmVsb2MKLQkJIHdpbGwgY29tZSBvdXQgcmlnaHQgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gYWRkIDQgdG8KLQkJIG9mZnNldF9leHByIHdoZW4gd2UgYnVpbGQgaXRzIGluc3RydWN0aW9uIGJlbG93LgotCi0JCSBJZiB3ZSBoYXZlIGEgc3ltYm9sLCB0aGVuIHdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZQotCQkgdGhlIG9mZnNldCwgYmVjYXVzZSBpdCB3aWxsIHdpbmQgdXAgYmVpbmcgaW5jbHVkZWQKLQkJIHdoZW4gd2UgZ2VuZXJhdGUgdGhlIHJlbG9jLiAgKi8KLQotCSAgICAgIGlmIChvZmZzZXRfZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSA4OwotCSAgICAgIGVsc2UKLQkJewotCQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IC00OwotCQkgIG9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQl9Ci0JICAgIH0KLQkgIG1hY3JvX2J1aWxkX2x1aSAocCwgJmljbnQsICZvZmZzZXRfZXhwciwgQVQpOwotCSAgaWYgKHAgIT0gTlVMTCkKLQkgICAgcCArPSA0OwotCSAgaWYgKGJyZWcgIT0gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSAgICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAgICJkLHYsdCIsIEFULCBicmVnLCBBVCk7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJcCArPSA0OwotCSAgICB9Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBpZiAocCAhPSBOVUxMKQotCSAgICBwICs9IDQ7Ci0JICAvKiBGSVhNRTogSG93IGRvIHdlIGhhbmRsZSBvdmVyZmxvdyBoZXJlPyAgKi8KLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCX0JICAKLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDICYmICEgbWlwc19iaWdfZ290KQotCXsKLQkgIGludCBvZmY7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx3CSRhdCw8c3ltPigkZ3ApCQkoQkZEX1JFTE9DX01JUFNfR09UMTYpCi0JICAgICAgIG5vcAotCSAgICAgICA8b3A+CSR0cmVnLDAoJGF0KQotCSAgICAgICA8b3A+CSR0cmVnKzEsNCgkYXQpCi0JICAgICBPdGhlcndpc2Ugd2Ugd2FudAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGdwKQkJKEJGRF9SRUxPQ19NSVBTX0dPVDE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkYXQpCShCRkRfUkVMT0NfTE8xNikKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICBJZiB0aGVyZSBpcyBhIGJhc2UgcmVnaXN0ZXIgd2UgYWRkIGl0IHRvICRhdCBiZWZvcmUgdGhlCi0JICAgICBsd2MxIGluc3RydWN0aW9ucy4gIElmIHRoZXJlIGlzIGEgY29uc3RhbnQgd2UgaW5jbHVkZSBpdAotCSAgICAgaW4gdGhlIGx3YzEgaW5zdHJ1Y3Rpb25zLiAgKi8KLQkgIHVzZWRfYXQgPSAxOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkgIGlmIChleHByMS5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0JICAgICAgfHwgZXhwcjEuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIDQpCi0JICAgIGFzX2JhZCAoXygiUElDIGNvZGUgb2Zmc2V0IG92ZXJmbG93IChtYXggMTYgc2lnbmVkIGJpdHMpIikpOwotCSAgaWYgKGJyZWcgPT0gMCkKLQkgICAgb2ZmID0gMDsKLQkgIGVsc2UKLQkgICAgb2ZmID0gNDsKLQkgIGZyYWdfZ3JvdyAoMjQgKyBvZmYpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJsdyIgOiAibGQiKSwKLQkJICAgICAgICJ0LG8oYikiLCBBVCwgKGludCkgQkZEX1JFTE9DX01JUFNfR09UMTYsIEdQKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICBpZiAoYnJlZyAhPSAwKQotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJICAgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCQkgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgImQsdix0IiwgQVQsIGJyZWcsIEFUKTsKLSAgICAgICAgICAvKiBJdGJsIHN1cHBvcnQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjYXJlIGhlcmUuICovCi0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgZm10LAotCQkgICAgICAgY29wcm9jID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLQkgIGV4cHIxLlhfYWRkX251bWJlciArPSA0OwotCi0JICAvKiBTZXQgbWlwc19vcHRpbWl6ZSB0byAyIHRvIGF2b2lkIGluc2VydGluZyBhbiB1bmRlc2lyZWQKLSAgICAgICAgICAgICBub3AuICAqLwotCSAgaG9sZF9taXBzX29wdGltaXplID0gbWlwc19vcHRpbWl6ZTsKLQkgIG1pcHNfb3B0aW1pemUgPSAyOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgbWlwc19vcHRpbWl6ZSA9IGhvbGRfbWlwc19vcHRpbWl6ZTsKLQotCSAgKHZvaWQpIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMCwgMCwKLQkJCSAgIFJFTEFYX0VOQ09ERSAoMCwgMCwgLTE2IC0gb2ZmLCAtOCwgMSwgMCksCi0JCQkgICBvZmZzZXRfZXhwci5YX2FkZF9zeW1ib2wsIChvZmZzZXRUKSAwLAotCQkJICAgKGNoYXIgKikgTlVMTCk7Ci0JfQotICAgICAgZWxzZSBpZiAobWlwc19waWMgPT0gU1ZSNF9QSUMpCi0JewotCSAgaW50IGdwZGVsLCBvZmY7Ci0KLQkgIC8qIElmIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgc3ltYm9sLCB3ZSB3YW50Ci0JICAgICAgIGx1aQkkYXQsPHN5bT4JCShCRkRfUkVMT0NfTUlQU19HT1RfSEkxNikKLQkgICAgICAgYWRkdQkkYXQsJGF0LCRncAotCSAgICAgICBsdwkkYXQsPHN5bT4oJGF0KQkJKEJGRF9SRUxPQ19NSVBTX0dPVF9MTzE2KQotCSAgICAgICBub3AKLQkgICAgICAgPG9wPgkkdHJlZywwKCRhdCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDQoJGF0KQotCSAgICAgT3RoZXJ3aXNlIHdlIHdhbnQKLQkgICAgICAgbHcJJGF0LDxzeW0+KCRncCkJCShCRkRfUkVMT0NfTUlQU19HT1QxNikKLQkgICAgICAgbm9wCi0JICAgICAgIDxvcD4JJHRyZWcsPHN5bT4oJGF0KQkoQkZEX1JFTE9DX0xPMTYpCi0JICAgICAgIDxvcD4JJHRyZWcrMSw8c3ltPis0KCRhdCkJKEJGRF9SRUxPQ19MTzE2KQotCSAgICAgSWYgdGhlcmUgaXMgYSBiYXNlIHJlZ2lzdGVyIHdlIGFkZCBpdCB0byAkYXQgYmVmb3JlIHRoZQotCSAgICAgbHdjMSBpbnN0cnVjdGlvbnMuICBJZiB0aGVyZSBpcyBhIGNvbnN0YW50IHdlIGluY2x1ZGUgaXQKLQkgICAgIGluIHRoZSBsd2MxIGluc3RydWN0aW9ucy4gICovCi0JICB1c2VkX2F0ID0gMTsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IG9mZnNldF9leHByLlhfYWRkX251bWJlcjsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IDA7Ci0JICBpZiAoZXhwcjEuWF9hZGRfbnVtYmVyIDwgLTB4ODAwMAotCSAgICAgIHx8IGV4cHIxLlhfYWRkX251bWJlciA+PSAweDgwMDAgLSA0KQotCSAgICBhc19iYWQgKF8oIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIpKTsKLQkgIGlmIChyZWdfbmVlZHNfZGVsYXkgKEdQKSkKLQkgICAgZ3BkZWwgPSA0OwotCSAgZWxzZQotCSAgICBncGRlbCA9IDA7Ci0JICBpZiAoYnJlZyA9PSAwKQotCSAgICBvZmYgPSAwOwotCSAgZWxzZQotCSAgICBvZmYgPSA0OwotCSAgZnJhZ19ncm93ICg1Nik7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgImx1aSIsICJ0LHUiLAotCQkgICAgICAgQVQsIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2KTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICAgImQsdix0IiwgQVQsIEFULCBHUCk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNiwgQVQpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCQkgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJCSAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJCSAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZGVzaXJlZAotICAgICAgICAgICAgIG5vcC4gICovCi0JICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyIC09IDQ7Ci0KLQkgIHAgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDE2ICsgZ3BkZWwgKyBvZmYsIDAsCi0JCQlSRUxBWF9FTkNPREUgKDI0ICsgb2ZmLCAxNiArIGdwZGVsICsgb2ZmLCBncGRlbCwKLQkJCQkgICAgICA4ICsgZ3BkZWwgKyBvZmYsIDEsIDApLAotCQkJb2Zmc2V0X2V4cHIuWF9hZGRfc3ltYm9sLCAob2Zmc2V0VCkgMCwKLQkJCShjaGFyICopIE5VTEwpOwotCSAgaWYgKGdwZGVsID4gMCkKLQkgICAgewotCSAgICAgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsICJub3AiLCAiIik7Ci0JICAgICAgcCArPSA0OwotCSAgICB9Ci0JICBtYWNyb19idWlsZCAocCwgJmljbnQsICZvZmZzZXRfZXhwciwKLQkJICAgICAgICgoYmZkX2FyY2hfYml0c19wZXJfYWRkcmVzcyAoc3Rkb3V0cHV0KSA9PSAzMgotCQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICAgID8gImx3IiA6ICJsZCIpLAotCQkgICAgICAgInQsbyhiKSIsIEFULCAoaW50KSBCRkRfUkVMT0NfTUlQU19HT1QxNiwgR1ApOwotCSAgcCArPSA0OwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgIm5vcCIsICIiKTsKLQkgIHAgKz0gNDsKLQkgIGlmIChicmVnICE9IDApCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAocCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCBBVCwgYnJlZywgQVQpOwotCSAgICAgIHAgKz0gNDsKLQkgICAgfQotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkIChwLCAmaWNudCwgJmV4cHIxLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnICsgMSA6IHRyZWcsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotCSAgcCArPSA0OwotCSAgZXhwcjEuWF9hZGRfbnVtYmVyICs9IDQ7Ci0KLQkgIC8qIFNldCBtaXBzX29wdGltaXplIHRvIDIgdG8gYXZvaWQgaW5zZXJ0aW5nIGFuIHVuZGVzaXJlZAotICAgICAgICAgICAgIG5vcC4gICovCi0JICBob2xkX21pcHNfb3B0aW1pemUgPSBtaXBzX29wdGltaXplOwotCSAgbWlwc19vcHRpbWl6ZSA9IDI7Ci0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKHAsICZpY250LCAmZXhwcjEsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0JICBtaXBzX29wdGltaXplID0gaG9sZF9taXBzX29wdGltaXplOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICAvKiBJZiB0aGVyZSBpcyBubyBiYXNlIHJlZ2lzdGVyLCB3ZSB1c2UKLQkgICAgICAgPG9wPgkkdHJlZyw8c3ltPigkZ3ApCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICAgPG9wPgkkdHJlZysxLDxzeW0+KzQoJGdwKQkoQkZEX1JFTE9DX01JUFNfR1BSRUwpCi0JICAgICBJZiB3ZSBoYXZlIGEgYmFzZSByZWdpc3Rlciwgd2UgdXNlCi0JICAgICAgIGFkZHUJJGF0LCRicmVnLCRncAotCSAgICAgICA8b3A+CSR0cmVnLDxzeW0+KCRhdCkJKEJGRF9SRUxPQ19NSVBTX0dQUkVMKQotCSAgICAgICA8b3A+CSR0cmVnKzEsPHN5bT4rNCgkYXQpCShCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkgICAgICovCi0JICBpZiAoYnJlZyA9PSAwKQotCSAgICB7Ci0JICAgICAgdGVtcHJlZyA9IEdQOwotCSAgICAgIHVzZWRfYXQgPSAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCQkJICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkJICAgID8gImFkZHUiIDogImRhZGR1IiksCi0JCQkgICAiZCx2LHQiLCBBVCwgYnJlZywgR1ApOwotCSAgICAgIHRlbXByZWcgPSBBVDsKLQkgICAgICB1c2VkX2F0ID0gMTsKLQkgICAgfQotCi0gICAgICAgICAgLyogSXRibCBzdXBwb3J0IG1heSByZXF1aXJlIGFkZGl0aW9uYWwgY2FyZSBoZXJlLiAqLwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsIGZtdCwKLQkJICAgICAgIGNvcHJvYyA/IHRyZWcgKyAxIDogdHJlZywKLQkJICAgICAgIChpbnQpIEJGRF9SRUxPQ19NSVBTX0dQUkVMLCB0ZW1wcmVnKTsKLQkgIG9mZnNldF9leHByLlhfYWRkX251bWJlciArPSA0OwotICAgICAgICAgIC8qIEl0Ymwgc3VwcG9ydCBtYXkgcmVxdWlyZSBhZGRpdGlvbmFsIGNhcmUgaGVyZS4gKi8KLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCBmbXQsCi0JCSAgICAgICBjb3Byb2MgPyB0cmVnIDogdHJlZyArIDEsCi0JCSAgICAgICAoaW50KSBCRkRfUkVMT0NfTUlQU19HUFJFTCwgdGVtcHJlZyk7Ci0JfQotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoISB1c2VkX2F0KQotCXJldHVybjsKLQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fTERfT0I6Ci0gICAgICBzID0gImx3IjsKLSAgICAgIGdvdG8gc2Rfb2I7Ci0gICAgY2FzZSBNX1NEX09COgotICAgICAgcyA9ICJzdyI7Ci0gICAgc2Rfb2I6Ci0gICAgICBhc3NlcnQgKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIgfHwgbWlwc19vcHRzLmlzYSA8IDMpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzLCAidCxvKGIpIiwgdHJlZyArIDEsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgLyogTmV3IGNvZGUgYWRkZWQgdG8gc3VwcG9ydCBDT1BaIGluc3RydWN0aW9ucy4KLSAgICAgIFRoaXMgY29kZSBidWlsZHMgdGFibGUgZW50cmllcyBvdXQgb2YgdGhlIG1hY3JvcyBpbiBtaXBfb3Bjb2Rlcy4KLSAgICAgIFI0MDAwIHVzZXMgaW50ZXJsb2NrcyB0byBoYW5kbGUgY29wcm9jIGRlbGF5cy4KLSAgICAgIE90aGVyIGNoaXBzIChsaWtlIHRoZSBSMzAwMCkgcmVxdWlyZSBub3BzIHRvIGJlIGluc2VydGVkIGZvciBkZWxheXMuCi0KLSAgICAgIEZJWE1FOiBDdXJyZW50bHksIHdlIHJlcXVpcmUgdGhhdCB0aGUgdXNlciBoYW5kbGUgZGVsYXlzLgotICAgICAgSW4gb3JkZXIgdG8gZmlsbCBkZWxheSBzbG90cyBmb3Igbm9uLWludGVybG9ja2VkIGNoaXBzLAotICAgICAgd2UgbXVzdCBoYXZlIGEgd2F5IHRvIHNwZWNpZnkgZGVsYXlzIGJhc2VkIG9uIHRoZSBjb3Byb2Nlc3Nvci4KLSAgICAgIEVnLiA0IGN5Y2xlcyBpZiBsb2FkIGNvcHJvYyByZWcgZnJvbSBtZW1vcnksIDEgaWYgaW4gY2FjaGUsIGV0Yy4KLSAgICAgIFdoYXQgYXJlIHRoZSBzaWRlLWVmZmVjdHMgb2YgdGhlIGNvcCBpbnN0cnVjdGlvbj8KLSAgICAgIFdoYXQgY2FjaGUgc3VwcG9ydCBtaWdodCB3ZSBoYXZlIGFuZCB3aGF0IGFyZSBpdHMgZWZmZWN0cz8KLSAgICAgIEJvdGggY29wcm9jZXNzb3IgJiBtZW1vcnkgcmVxdWlyZSBkZWxheXMuIGhvdyBsb25nPz8/Ci0gICAgICBXaGF0IHJlZ2lzdGVycyBhcmUgcmVhZC9zZXQvbW9kaWZpZWQ/IAotCi0gICAgICBJZiBhbiBpdGJsIGlzIHByb3ZpZGVkIHRvIGludGVycHJldCBjb3AgaW5zdHJ1Y3Rpb25zLAotICAgICAgdGhpcyBrbm93bGVkZ2UgY2FuIGJlIGVuY29kZWQgaW4gdGhlIGl0Ymwgc3BlYy4gKi8KLQotICAgIGNhc2UgTV9DT1AwOgotICAgICAgcyA9ICJjMCI7Ci0gICAgICBnb3RvIGNvcHo7Ci0gICAgY2FzZSBNX0NPUDE6Ci0gICAgICBzID0gImMxIjsKLSAgICAgIGdvdG8gY29wejsKLSAgICBjYXNlIE1fQ09QMjoKLSAgICAgIHMgPSAiYzIiOwotICAgICAgZ290byBjb3B6OwotICAgIGNhc2UgTV9DT1AzOgotICAgICAgcyA9ICJjMyI7Ci0gICAgY29wejoKLSAgICAgIC8qIEZvciBub3cgd2UganVzdCBkbyBDIChzYW1lIGFzIEN6KS4gIFRoZSBwYXJhbWV0ZXIgd2lsbCBiZQotICAgICAgICAgc3RvcmVkIGluIGluc25fb3Bjb2RlIGJ5IG1pcHNfaXAuICAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgcywgIkMiLAotCQkgICBpcC0+aW5zbl9vcGNvZGUpOwotICAgICAgcmV0dXJuOwotCi0jaWZkZWYgTE9TSU5HX0NPTVBJTEVSCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFRyeSBhbmQgc2VlIGlmIHRoaXMgaXMgYSBuZXcgaXRibCBpbnN0cnVjdGlvbi4KLSAgICAgICAgIFRoaXMgY29kZSBidWlsZHMgdGFibGUgZW50cmllcyBvdXQgb2YgdGhlIG1hY3JvcyBpbiBtaXBfb3Bjb2Rlcy4KLSAgICAgICAgIEZJWE1FOiBGb3Igbm93IHdlIGp1c3QgYXNzZW1ibGUgdGhlIGV4cHJlc3Npb24gYW5kIHBhc3MgaXQncwotICAgICAgICAgdmFsdWUgYWxvbmcgYXMgYSAzMi1iaXQgaW1tZWRpYXRlLgotICAgICAgICAgV2UgbWF5IHdhbnQgdG8gaGF2ZSB0aGUgYXNzZW1ibGVyIGFzc2VtYmxlIHRoaXMgdmFsdWUsIAotICAgICAgICAgc28gdGhhdCB3ZSBnYWluIHRoZSBhc3NlbWJsZXIncyBrbm93bGVkZ2Ugb2YgZGVsYXkgc2xvdHMsCi0gICAgICAgICBzeW1ib2xzLCBldGMuCi0gICAgICAgICBXb3VsZCBpdCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgbWFzayAoaWQpIGhlcmU/ICovCi0gICAgICBpZiAoaXRibF9oYXZlX2VudHJpZXMgCi0JICAmJiAoaW1tZWRfZXhwciA9IGl0YmxfYXNzZW1ibGUgKGlwLT5pbnNuX21vLT5uYW1lLCAiIikpKQotICAgICAgICB7Ci0JICBzID0gaXAtPmluc25fbW8tPm5hbWU7Ci0JICBzMiA9ICJjb3AzIjsKLQkgIGNvcHJvYyA9IElUQkxfREVDT0RFX1BOVU0gKGltbWVkX2V4cHIpOzsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbWVkX2V4cHIsIHMsICJDIik7Ci0JICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIG1hY3JvMiAoaXApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG1pcHNfb3B0cy5ub2F0KQotICAgIGFzX3dhcm4gKF8oIk1hY3JvIHVzZWQgJGF0IGFmdGVyIFwiLnNldCBub2F0XCIiKSk7Ci19Ci0gICAgICAgICAgCi1zdGF0aWMgdm9pZAotbWFjcm8yIChpcCkKLSAgICAgc3RydWN0IG1pcHNfY2xfaW5zbiAqaXA7Ci17Ci0gIHJlZ2lzdGVyIGludCB0cmVnLCBzcmVnLCBkcmVnLCBicmVnOwotICBpbnQgdGVtcHJlZzsKLSAgaW50IG1hc2s7Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHVzZWRfYXQ7Ci0gIGV4cHJlc3Npb25TIGV4cHIxOwotICBjb25zdCBjaGFyICpzOwotICBjb25zdCBjaGFyICpzMjsKLSAgY29uc3QgY2hhciAqZm10OwotICBpbnQgbGlrZWx5ID0gMDsKLSAgaW50IGRibCA9IDA7Ci0gIGludCBjb3Byb2MgPSAwOwotICBpbnQgbHIgPSAwOwotICBpbnQgaW1tID0gMDsKLSAgaW50IG9mZjsKLSAgb2Zmc2V0VCBtYXhudW07Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotICBjaGFyICpwOwotICAgICAgICAgIAotICB0cmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxNikgJiAweDFmOwotICBkcmVnID0gKGlwLT5pbnNuX29wY29kZSA+PiAxMSkgJiAweDFmOwotICBzcmVnID0gYnJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMjEpICYgMHgxZjsKLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotICAgICAgICAgIAotICBleHByMS5YX29wID0gT19jb25zdGFudDsKLSAgZXhwcjEuWF9vcF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgICAgIAotICBzd2l0Y2ggKG1hc2spCi0gICAgewotI2VuZGlmIC8qIExPU0lOR19DT01QSUxFUiAqLwotCi0gICAgY2FzZSBNX0RNVUw6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUw6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgInMsdCIsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRE1VTF9JOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMX0k6Ci0gICAgICAvKiBUaGUgTUlQUyBhc3NlbWJsZXIgc29tZSB0aW1lcyBnZW5lcmF0ZXMgc2hpZnRzIGFuZCBhZGRzLiAgSSdtCi0JIG5vdCB0cnlpbmcgdG8gYmUgdGhhdCBmYW5jeS4gR0NDIHNob3VsZCBkbyB0aGlzIGZvciB1cwotCSBhbnl3YXkuICAqLwotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIGRibCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdCIgOiAibXVsdCIsCi0JCSAgICJzLHQiLCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RNVUxPX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPX0k6Ci0gICAgICBpbW0gPSAxOwotICAgICAgZ290byBkb19tdWxvOwotCi0gICAgY2FzZSBNX0RNVUxPOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMTzoKLSAgICBkb19tdWxvOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgaWYgKGltbSkKLQlsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRtdWx0IiA6ICJtdWx0IiwKLQkJICAgInMsdCIsIHNyZWcsIGltbSA/IEFUIDogdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJtZmxvIiwgImQiLCBkcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzcmEzMiIgOiAic3JhIiwKLQkJICAgImQsdyw8IiwgZHJlZywgZHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZoaSIsICJkIiwgQVQpOwotICAgICAgaWYgKG1pcHNfdHJhcCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ0bmUiLCAicyx0IiwgZHJlZywgQVQpOwotICAgICAgZWxzZQotCXsKLQkgIGV4cHIxLlhfYWRkX251bWJlciA9IDg7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJlcSIsICJzLHQscCIsIGRyZWcsIEFUKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiLCAwKTsKLQkgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiYyIsIDYpOwotCX0KLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm1mbG8iLCAiZCIsIGRyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fRE1VTE9VX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUxPVV9JOgotICAgICAgaW1tID0gMTsKLSAgICAgIGdvdG8gZG9fbXVsb3U7Ci0KLSAgICBjYXNlIE1fRE1VTE9VOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fTVVMT1U6Ci0gICAgZG9fbXVsb3U6Ci0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBpZiAoaW1tKQotCWxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCBkYmwpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICBkYmwgPyAiZG11bHR1IiA6ICJtdWx0dSIsCi0JCSAgICJzLHQiLCBzcmVnLCBpbW0gPyBBVCA6IHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZoaSIsICJkIiwgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJkIiwgZHJlZyk7Ci0gICAgICBpZiAobWlwc190cmFwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInRuZSIsICJzLHQiLCBBVCwgMCk7Ci0gICAgICBlbHNlCi0JewotCSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gODsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYmVxIiwgInMsdCxwIiwgQVQsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIsIDApOwotCSAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICJjIiwgNik7Ci0JfQotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fUk9MOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic3VidSIsICJkLHYsdCIsIEFULCAwLCB0cmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybHYiLCAiZCx0LHMiLCBBVCwgc3JlZywgQVQpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsdiIsICJkLHQscyIsIGRyZWcsIHNyZWcsCi0JCSAgIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST0xfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJyb3RhdGUgY291bnQgdG9vIGxhcmdlIikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsIiwgImQsdyw8IiwgQVQsIHNyZWcsCi0JCSAgIChpbnQpIChpbW1fZXhwci5YX2FkZF9udW1iZXIgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBkcmVnLCBzcmVnLAotCQkgICAoaW50KSAoKDAgLSBpbW1fZXhwci5YX2FkZF9udW1iZXIpICYgMHgxZikpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCBkcmVnLCBkcmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ST1I6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzdWJ1IiwgImQsdix0IiwgQVQsIDAsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2xsdiIsICJkLHQscyIsIEFULCBzcmVnLCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmx2IiwgImQsdCxzIiwgZHJlZywgc3JlZywKLQkJICAgdHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1JPUl9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oInJvdGF0ZSBjb3VudCB0b28gbGFyZ2UiKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzcmwiLCAiZCx3LDwiLCBBVCwgc3JlZywKLQkJICAgKGludCkgKGltbV9leHByLlhfYWRkX251bWJlciAmIDB4MWYpKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIGRyZWcsIHNyZWcsCi0JCSAgIChpbnQpICgoMCAtIGltbV9leHByLlhfYWRkX251bWJlcikgJiAweDFmKSk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJvciIsICJkLHYsdCIsIGRyZWcsIGRyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NfRE9COgotICAgICAgaWYgKG1pcHNfY3B1ID09IDQ2NTApCi0JewotCSAgYXNfYmFkIChfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPCAyKTsKLSAgICAgIC8qIEV2ZW4gb24gYSBiaWcgZW5kaWFuIG1hY2hpbmUgJGZuIGNvbWVzIGJlZm9yZSAkZm4rMS4gIFdlIGhhdmUKLQkgdG8gYWRqdXN0IHdoZW4gc3RvcmluZyB0byBtZW1vcnkuICAqLwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJzd2MxIiwgIlQsbyhiKSIsCi0JCSAgIHRhcmdldF9iaWdfZW5kaWFuID8gdHJlZyArIDEgOiB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gNDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic3djMSIsICJULG8oYikiLAotCQkgICB0YXJnZXRfYmlnX2VuZGlhbiA/IHRyZWcgOiB0cmVnICsgMSwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIGJyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NFUToKLSAgICAgIGlmIChzcmVnID09IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpdSIsICJ0LHIsaiIsIGRyZWcsCi0JCSAgICAgdHJlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgZWxzZSBpZiAodHJlZyA9PSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAotCQkgICAgICAgc3JlZywgdHJlZyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywKLQkJICAgICAgIGRyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQl9Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0VRX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50ICYmIGltbV9leHByLlhfYWRkX251bWJlciA9PSAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2x0aXUiLCAidCxyLGoiLCBkcmVnLAotCQkgICAgICAgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlmIChzcmVnID09IDApCi0JewotCSAgYXNfd2FybiAoXygiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgZmFsc2UiKSwKLQkJICAgaXAtPmluc25fbW8tPm5hbWUpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibW92ZSIsICJkLHMiLCBkcmVnLCAwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHgxMDAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInhvcmkiLCAidCxyLGkiLCBkcmVnLAotCQkgICAgICAgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZSBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICAgICAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMCkKLQl7Ci0JICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLAotCQkgICAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCBBVCk7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInNsdGl1IiwgInQscixqIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgaWYgKHVzZWRfYXQpCi0JYnJlYWs7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fU0dFOgkJLyogc3JlZyA+PSB0cmVnIDw9PT4gbm90IChzcmVnIDwgdHJlZykgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2dlOwotICAgIGNhc2UgTV9TR0VVOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzZ2U6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIHNyZWcsIHRyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NHRV9JOgkJLyogc3JlZyA+PSBJIDw9PT4gbm90IChzcmVnIDwgSSkgKi8KLSAgICBjYXNlIE1fU0dFVV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKLQkJICAgICAgIG1hc2sgPT0gTV9TR0VfSSA/ICJzbHRpIiA6ICJzbHRpdSIsCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICB1c2VkX2F0ID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCQkgICAgICAgbWFzayA9PSBNX1NHRV9JID8gInNsdCIgOiAic2x0dSIsCi0JCSAgICAgICAiZCx2LHQiLCBkcmVnLCBzcmVnLCBBVCk7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBkcmVnLCBkcmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBpZiAodXNlZF9hdCkKLQlicmVhazsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TR1Q6CQkvKiBzcmVnID4gdHJlZyAgPD09PiAgdHJlZyA8IHNyZWcgKi8KLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIGdvdG8gc2d0OwotICAgIGNhc2UgTV9TR1RVOgotICAgICAgcyA9ICJzbHR1IjsKLSAgICBzZ3Q6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJkLHYsdCIsIGRyZWcsIHRyZWcsIHNyZWcpOwotICAgICAgcmV0dXJuOwotCi0gICAgY2FzZSBNX1NHVF9JOgkJLyogc3JlZyA+IEkgIDw9PT4gIEkgPCBzcmVnICovCi0gICAgICBzID0gInNsdCI7Ci0gICAgICBnb3RvIHNndGk7Ci0gICAgY2FzZSBNX1NHVFVfSToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgc2d0aToKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgQVQsIHNyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU0xFOgkJLyogc3JlZyA8PSB0cmVnICA8PT0+ICB0cmVnID49IHNyZWcgIDw9PT4gIG5vdCAodHJlZyA8IHNyZWcpICovCi0gICAgICBzID0gInNsdCI7Ci0gICAgICBnb3RvIHNsZTsKLSAgICBjYXNlIE1fU0xFVToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgc2xlOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiZCx2LHQiLCBkcmVnLCB0cmVnLCBzcmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAieG9yaSIsICJ0LHIsaSIsIGRyZWcsIGRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TTEVfSToJCS8qIHNyZWcgPD0gSSA8PT0+IEkgPj0gc3JlZyA8PT0+IG5vdCAoSSA8IHNyZWcpICovCi0gICAgICBzID0gInNsdCI7Ci0gICAgICBnb3RvIHNsZWk7Ci0gICAgY2FzZSBNX1NMRVVfSToKLSAgICAgIHMgPSAic2x0dSI7Ci0gICAgc2xlaToKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgImQsdix0IiwgZHJlZywgQVQsIHNyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJ4b3JpIiwgInQscixpIiwgZHJlZywgZHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU0xUX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gLTB4ODAwMAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMHg4MDAwKQotCXsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCAic2x0aSIsICJ0LHIsaiIsCi0JCSAgICAgICBkcmVnLCBzcmVnLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbG9hZF9yZWdpc3RlciAoJmljbnQsIEFULCAmaW1tX2V4cHIsIDApOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0IiwgImQsdix0IiwgZHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU0xUVV9JOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4ODAwMCkKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgInNsdGl1IiwgInQscixqIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgMCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgc3JlZywKLQkJICAgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU05FOgotICAgICAgaWYgKHNyZWcgPT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICB0cmVnKTsKLSAgICAgIGVsc2UgaWYgKHRyZWcgPT0gMCkKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICBzcmVnKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJ4b3IiLCAiZCx2LHQiLCBkcmVnLAotCQkgICAgICAgc3JlZywgdHJlZyk7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwKLQkJICAgICAgIGRyZWcpOwotCX0KLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9TTkVfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID09IDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAic2x0dSIsICJkLHYsdCIsIGRyZWcsIDAsCi0JCSAgICAgICBzcmVnKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBpZiAoc3JlZyA9PSAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkluc3RydWN0aW9uICVzOiByZXN1bHQgaXMgYWx3YXlzIHRydWUiKSwKLQkJICAgaXAtPmluc25fbW8tPm5hbWUpOwotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsCi0JCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgICA/ICJhZGRpdSIgOiAiZGFkZGl1IiksCi0JCSAgICAgICAidCxyLGoiLCBkcmVnLCAwLCAoaW50KSBCRkRfUkVMT0NfTE8xNik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgJiYgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDB4MTAwMDApCi0JewotCSAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJ4b3JpIiwgInQscixpIiwKLQkJICAgICAgIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHVzZWRfYXQgPSAwOwotCX0KLSAgICAgIGVsc2UgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAgICAgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCQkgfHwgbWlwc19vcHRzLmlzYSA8IDMpCi0JCSAgICAgICAgPyAiYWRkaXUiIDogImRhZGRpdSIpLAotCQkgICAgICAgInQscixqIiwgZHJlZywgc3JlZywgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotCSAgdXNlZF9hdCA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInhvciIsICJkLHYsdCIsIGRyZWcsCi0JCSAgICAgICBzcmVnLCBBVCk7Ci0JICB1c2VkX2F0ID0gMTsKLQl9Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbHR1IiwgImQsdix0IiwgZHJlZywgMCwgZHJlZyk7Ci0gICAgICBpZiAodXNlZF9hdCkKLQlicmVhazsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9EU1VCX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9TVUJfSToKLSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA+IC0weDgwMDAKLQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8PSAweDgwMDApCi0JewotCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLQkgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICAgICAgZGJsID8gImRhZGRpIiA6ICJhZGRpIiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzdWIiIDogInN1YiIsCi0JCSAgICJkLHYsdCIsIGRyZWcsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RTVUJVX0k6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9TVUJVX0k6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAtMHg4MDAwCi0JICAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgPD0gMHg4MDAwKQotCXsKLQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwKLQkJICAgICAgIGRibCA/ICJkYWRkaXUiIDogImFkZGl1IiwKLQkJICAgICAgICJ0LHIsaiIsIGRyZWcsIHNyZWcsIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBsb2FkX3JlZ2lzdGVyICgmaWNudCwgQVQsICZpbW1fZXhwciwgZGJsKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRzdWJ1IiA6ICJzdWJ1IiwKLQkJICAgImQsdix0IiwgZHJlZywgc3JlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fVEVRX0k6Ci0gICAgICBzID0gInRlcSI7Ci0gICAgICBnb3RvIHRyYXA7Ci0gICAgY2FzZSBNX1RHRV9JOgotICAgICAgcyA9ICJ0Z2UiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UR0VVX0k6Ci0gICAgICBzID0gInRnZXUiOwotICAgICAgZ290byB0cmFwOwotICAgIGNhc2UgTV9UTFRfSToKLSAgICAgIHMgPSAidGx0IjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVExUVV9JOgotICAgICAgcyA9ICJ0bHR1IjsKLSAgICAgIGdvdG8gdHJhcDsKLSAgICBjYXNlIE1fVE5FX0k6Ci0gICAgICBzID0gInRuZSI7Ci0gICAgdHJhcDoKLSAgICAgIGxvYWRfcmVnaXN0ZXIgKCZpY250LCBBVCwgJmltbV9leHByLCAwKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgcywgInMsdCIsIHNyZWcsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1RSVU5DV0Q6Ci0gICAgY2FzZSBNX1RSVU5DV1M6Ci0gICAgICBhc3NlcnQgKG1pcHNfb3B0cy5pc2EgPCAyKTsKLSAgICAgIHNyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IDExKSAmIDB4MWY7CS8qIGZsb2F0aW5nIHJlZyAqLwotICAgICAgZHJlZyA9IChpcC0+aW5zbl9vcGNvZGUgPj4gMDYpICYgMHgxZjsJLyogZmxvYXRpbmcgcmVnICovCi0KLSAgICAgIC8qCi0gICAgICAgKiBJcyB0aGUgZG91YmxlIGNmYzEgaW5zdHJ1Y3Rpb24gYSBidWcgaW4gdGhlIG1pcHMgYXNzZW1ibGVyOwotICAgICAgICogb3IgaXMgdGhlcmUgYSByZWFzb24gZm9yIGl0PwotICAgICAgICovCi0gICAgICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgICAgICsrbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIG1pcHNfYW55X25vcmVvcmRlciA9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjZmMxIiwgInQsRyIsIHRyZWcsIDMxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgImNmYzEiLCAidCxHIiwgdHJlZywgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMzsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAib3JpIiwgInQscixpIiwgQVQsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgInhvcmkiLCAidCxyLGkiLCBBVCwgQVQsCi0JCSAgICAgKGludCkgQkZEX1JFTE9DX0xPMTYpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiY3RjMSIsICJ0LEciLCBBVCwgMzEpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibm9wIiwgIiIpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLAotCSAgICAgIG1hc2sgPT0gTV9UUlVOQ1dEID8gImN2dC53LmQiIDogImN2dC53LnMiLCAiRCxTIiwgZHJlZywgc3JlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJjdGMxIiwgInQsRyIsIHRyZWcsIDMxKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm5vcCIsICIiKTsKLSAgICAgIC0tbWlwc19vcHRzLm5vcmVvcmRlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VMSDoKLSAgICAgIHMgPSAibGIiOwotICAgICAgZ290byB1bGg7Ci0gICAgY2FzZSBNX1VMSFU6Ci0gICAgICBzID0gImxidSI7Ci0gICAgdWxoOgotICAgICAgaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA+PSAweDdmZmYpCi0JYXNfYmFkIChfKCJvcGVyYW5kIG92ZXJmbG93IikpOwotICAgICAgLyogYXZvaWQgbG9hZCBkZWxheSAqLwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSAxOwotICAgICAgZWxzZQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsICJsYnUiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIHRyZWcsIHRyZWcsIDgpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCB0cmVnLCB0cmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VTEQ6Ci0gICAgICBzID0gImxkbCI7Ci0gICAgICBzMiA9ICJsZHIiOwotICAgICAgb2ZmID0gNzsKLSAgICAgIGdvdG8gdWx3OwotICAgIGNhc2UgTV9VTFc6Ci0gICAgICBzID0gImx3bCI7Ci0gICAgICBzMiA9ICJsd3IiOwotICAgICAgb2ZmID0gMzsKLSAgICB1bHc6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4ODAwMCAtIG9mZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gb2ZmOwotICAgICAgZWxzZQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgYnJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fVUxEX0E6Ci0gICAgICBzID0gImxkbCI7Ci0gICAgICBzMiA9ICJsZHIiOwotICAgICAgb2ZmID0gNzsKLSAgICAgIGdvdG8gdWx3YTsKLSAgICBjYXNlIE1fVUxXX0E6Ci0gICAgICBzID0gImx3bCI7Ci0gICAgICBzMiA9ICJsd3IiOwotICAgICAgb2ZmID0gMzsKLSAgICB1bHdhOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VTEhfQToKLSAgICBjYXNlIE1fVUxIVV9BOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwKLQkJICAgbWFzayA9PSBNX1VMSF9BID8gImxiIiA6ICJsYnUiLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgZWxzZQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImxidSIsICJ0LG8oYikiLCBBVCwKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNsbCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAib3IiLCAiZCx2LHQiLCB0cmVnLAotCQkgICB0cmVnLCBBVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9VU0g6Ci0gICAgICBpZiAob2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID49IDB4N2ZmZikKLQlhc19iYWQgKF8oIm9wZXJhbmQgb3ZlcmZsb3ciKSk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IDE7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgInNiIiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIEFULCB0cmVnLCA4KTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgLT0gMTsKLSAgICAgIGVsc2UKLQlvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgKz0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCAic2IiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VTRDoKLSAgICAgIHMgPSAic2RsIjsKLSAgICAgIHMyID0gInNkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1c3c7Ci0gICAgY2FzZSBNX1VTVzoKLSAgICAgIHMgPSAic3dsIjsKLSAgICAgIHMyID0gInN3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVzdzoKLSAgICAgIGlmIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg4MDAwIC0gb2ZmKQotCWFzX2JhZCAoXygib3BlcmFuZCBvdmVyZmxvdyIpKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciArPSBvZmY7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgcywgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCW9mZnNldF9leHByLlhfYWRkX251bWJlciAtPSBvZmY7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyICs9IG9mZjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJm9mZnNldF9leHByLCBzMiwgInQsbyhiKSIsIHRyZWcsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBicmVnKTsKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgTV9VU0RfQToKLSAgICAgIHMgPSAic2RsIjsKLSAgICAgIHMyID0gInNkciI7Ci0gICAgICBvZmYgPSA3OwotICAgICAgZ290byB1c3dhOwotICAgIGNhc2UgTV9VU1dfQToKLSAgICAgIHMgPSAic3dsIjsKLSAgICAgIHMyID0gInN3ciI7Ci0gICAgICBvZmYgPSAzOwotICAgIHVzd2E6Ci0gICAgICBsb2FkX2FkZHJlc3MgKCZpY250LCBBVCwgJm9mZnNldF9leHByKTsKLSAgICAgIGlmIChicmVnICE9IDApCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJICAgICAgIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICA/ICJhZGR1IiA6ICJkYWRkdSIpLAotCQkgICAgICJkLHYsdCIsIEFULCBBVCwgYnJlZyk7Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQlleHByMS5YX2FkZF9udW1iZXIgPSBvZmY7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCBzLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCWV4cHIxLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBlbHNlCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gb2ZmOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsIHMyLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1VTSF9BOgotICAgICAgbG9hZF9hZGRyZXNzICgmaWNudCwgQVQsICZvZmZzZXRfZXhwcik7Ci0gICAgICBpZiAoYnJlZyAhPSAwKQotCW1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSAgICAgICB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJICAgICAgPyAiYWRkdSIgOiAiZGFkZHUiKSwKLQkJICAgICAiZCx2LHQiLCBBVCwgQVQsIGJyZWcpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAic2IiLCAidCxvKGIpIiwgdHJlZywKLQkJICAgKGludCkgQkZEX1JFTE9DX0xPMTYsIEFUKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgInNybCIsICJkLHcsPCIsIHRyZWcsCi0JCSAgIHRyZWcsIDgpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzYiIsICJ0LG8oYikiLCB0cmVnLAotCQkgICAoaW50KSBCRkRfUkVMT0NfTE8xNiwgQVQpOwotICAgICAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JZXhwcjEuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIGVsc2UKLQlleHByMS5YX2FkZF9udW1iZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJsYnUiLCAidCxvKGIpIiwgQVQsCi0JCSAgIChpbnQpIEJGRF9SRUxPQ19MTzE2LCBBVCk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJzbGwiLCAiZCx3LDwiLCB0cmVnLAotCQkgICB0cmVnLCA4KTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwgIm9yIiwgImQsdix0IiwgdHJlZywKLQkJICAgdHJlZywgQVQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogRklYTUU6IENoZWNrIGlmIHRoaXMgaXMgb25lIG9mIHRoZSBpdGJsIG1hY3Jvcywgc2luY2UgdGhleQotCSBhcmUgYWRkZWQgZHluYW1pY2FsbHkuICovCi0gICAgICBhc19iYWQgKF8oIk1hY3JvICVzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSwgaXAtPmluc25fbW8tPm5hbWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZiAobWlwc19vcHRzLm5vYXQpCi0gICAgYXNfd2FybiAoXygiTWFjcm8gdXNlZCAkYXQgYWZ0ZXIgXCIuc2V0IG5vYXRcIiIpKTsKLX0KLQotLyogSW1wbGVtZW50IG1hY3JvcyBpbiBtaXBzMTYgbW9kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1taXBzMTZfbWFjcm8gKGlwKQotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgaW50IG1hc2s7Ci0gIGludCB4cmVnLCB5cmVnLCB6cmVnLCB0bXA7Ci0gIGludCBpY250OwotICBleHByZXNzaW9uUyBleHByMTsKLSAgaW50IGRibDsKLSAgY29uc3QgY2hhciAqcywgKnMyLCAqczM7Ci0KLSAgbWFzayA9IGlwLT5pbnNuX21vLT5tYXNrOwotCi0gIHhyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7Ci0gIHlyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JZKSAmIE1JUFMxNk9QX01BU0tfUlk7Ci0gIHpyZWcgPSAoaXAtPmluc25fb3Bjb2RlID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7Ci0KLSAgaWNudCA9IDA7Ci0KLSAgZXhwcjEuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHIxLlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMTsKLQotICBkYmwgPSAwOwotCi0gIHN3aXRjaCAobWFzaykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0KLSAgICBjYXNlIE1fRERJVl8zOgotICAgICAgZGJsID0gMTsKLSAgICBjYXNlIE1fRElWXzM6Ci0gICAgICBzID0gIm1mbG8iOwotICAgICAgZ290byBkb19kaXYzOwotICAgIGNhc2UgTV9EUkVNXzM6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9SRU1fMzoKLSAgICAgIHMgPSAibWZoaSI7Ci0gICAgZG9fZGl2MzoKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgKyttaXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWlwc19hbnlfbm9yZW9yZGVyID0gMTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgTlVMTCwKLQkJICAgZGJsID8gImRkaXYiIDogImRpdiIsCi0JCSAgICIwLHgseSIsIHhyZWcsIHlyZWcpOwotICAgICAgZXhwcjEuWF9hZGRfbnVtYmVyID0gMjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4cHIxLCAiYm5leiIsICJ4LHAiLCB5cmVnKTsKLQltYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsICJicmVhayIsICI2IiwgNyk7Ci0gICAgICAKLSAgICAgIC8qIEZJWE1FOiBUaGUgbm9ybWFsIGNvZGUgY2hlY2tzIGZvciBvZiAtMSAvIC0weDgwMDAwMDAwIGhlcmUsCi0gICAgICAgICBzaW5jZSB0aGF0IGNhdXNlcyBhbiBvdmVyZmxvdy4gIFdlIHNob3VsZCBkbyB0aGF0IGFzIHdlbGwsCi0gICAgICAgICBidXQgSSBkb24ndCBzZWUgaG93IHRvIGRvIHRoZSBjb21wYXJpc29ucyB3aXRob3V0IGEgdGVtcG9yYXJ5Ci0gICAgICAgICByZWdpc3Rlci4gICovCi0gICAgICAtLW1pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsIHMsICJ4IiwgenJlZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9ESVZVXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZsbyI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9SRU1VXzM6Ci0gICAgICBzID0gImRpdnUiOwotICAgICAgczIgPSAibWZoaSI7Ci0gICAgICBnb3RvIGRvX2RpdnUzOwotICAgIGNhc2UgTV9ERElWVV8zOgotICAgICAgcyA9ICJkZGl2dSI7Ci0gICAgICBzMiA9ICJtZmxvIjsKLSAgICAgIGdvdG8gZG9fZGl2dTM7Ci0gICAgY2FzZSBNX0RSRU1VXzM6Ci0gICAgICBzID0gImRkaXZ1IjsKLSAgICAgIHMyID0gIm1maGkiOwotICAgIGRvX2RpdnUzOgotICAgICAgbWlwc19lbWl0X2RlbGF5cyAodHJ1ZSk7Ci0gICAgICArK21pcHNfb3B0cy5ub3Jlb3JkZXI7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzLCAiMCx4LHkiLCB4cmVnLCB5cmVnKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJuZXoiLCAieCxwIiwgeXJlZyk7Ci0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAiYnJlYWsiLCAiNiIsIDcpOwotICAgICAgLS1taXBzX29wdHMubm9yZW9yZGVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCBzMiwgIngiLCB6cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RNVUw6Ci0gICAgICBkYmwgPSAxOwotICAgIGNhc2UgTV9NVUw6Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIE5VTEwsCi0JCSAgIGRibCA/ICJkbXVsdHUiIDogIm11bHR1IiwKLQkJICAgIngseSIsIHhyZWcsIHlyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCBOVUxMLCAibWZsbyIsICJ4IiwgenJlZyk7Ci0gICAgICByZXR1cm47Ci0KLSAgICBjYXNlIE1fRFNVQlVfSToKLSAgICAgIGRibCA9IDE7Ci0gICAgICBnb3RvIGRvX3N1YnU7Ci0gICAgY2FzZSBNX1NVQlVfSToKLSAgICBkb19zdWJ1OgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gLWltbV9leHByLlhfYWRkX251bWJlcjsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLAotCQkgICBkYmwgPyAiZGFkZGl1IiA6ICJhZGRpdSIsCi0JCSAgICJ5LHgsNCIsIHlyZWcsIHhyZWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU1VCVV9JXzI6Ci0gICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCWFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiKSk7Ci0gICAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSAtaW1tX2V4cHIuWF9hZGRfbnVtYmVyOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmaW1tX2V4cHIsICJhZGRpdSIsCi0JCSAgICJ4LGsiLCB4cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0RTVUJVX0lfMjoKLSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCBsYXJnZSBjb25zdGFudCIpKTsKLSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IC1pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZpbW1fZXhwciwgImRhZGRpdSIsCi0JCSAgICJ5LGoiLCB5cmVnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0JFUToKLSAgICAgIHMgPSAiY21wIjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoOwotICAgIGNhc2UgTV9CTkU6Ci0gICAgICBzID0gImNtcCI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaDsKLSAgICBjYXNlIE1fQkxUOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JMVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JMRToKLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7Ci0gICAgY2FzZSBNX0JMRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19yZXZlcnNlX2JyYW5jaDsKLSAgICBjYXNlIE1fQkdFOgotICAgICAgcyA9ICJzbHQiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JHRVU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgZ290byBkb19icmFuY2g7Ci0gICAgY2FzZSBNX0JHVDoKLSAgICAgIHMgPSAic2x0IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIGdvdG8gZG9fcmV2ZXJzZV9icmFuY2g7Ci0gICAgY2FzZSBNX0JHVFU6Ci0gICAgICBzID0gInNsdHUiOwotICAgICAgczIgPSAiYnRuZXoiOwotCi0gICAgZG9fcmV2ZXJzZV9icmFuY2g6Ci0gICAgICB0bXAgPSB4cmVnOwotICAgICAgeHJlZyA9IHlyZWc7Ci0gICAgICB5cmVnID0gdG1wOwotCi0gICAgZG9fYnJhbmNoOgotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwgcywgIngseSIsCi0JCSAgIHhyZWcsIHlyZWcpOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmb2Zmc2V0X2V4cHIsIHMyLCAicCIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fQkVRX0k6Ci0gICAgICBzID0gImNtcGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCxVIjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JORV9JOgotICAgICAgcyA9ICJjbXBpIjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsVSI7Ci0gICAgICBnb3RvIGRvX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTFRfSToKLSAgICAgIHMgPSAic2x0aSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkxUVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidG5leiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotICAgICAgZ290byBkb19icmFuY2hfaTsKLSAgICBjYXNlIE1fQkxFX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRuZXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYWRkb25lX2JyYW5jaF9pOwotICAgIGNhc2UgTV9CTEVVX0k6Ci0gICAgICBzID0gInNsdGl1IjsKLSAgICAgIHMyID0gImJ0bmV6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdFX0k6Ci0gICAgICBzID0gInNsdGkiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JHRVVfSToKLSAgICAgIHMgPSAic2x0aXUiOwotICAgICAgczIgPSAiYnRlcXoiOwotICAgICAgczMgPSAieCw4IjsKLSAgICAgIGdvdG8gZG9fYnJhbmNoX2k7Ci0gICAgY2FzZSBNX0JHVF9JOgotICAgICAgcyA9ICJzbHRpIjsKLSAgICAgIHMyID0gImJ0ZXF6IjsKLSAgICAgIHMzID0gIngsOCI7Ci0gICAgICBnb3RvIGRvX2FkZG9uZV9icmFuY2hfaTsKLSAgICBjYXNlIE1fQkdUVV9JOgotICAgICAgcyA9ICJzbHRpdSI7Ci0gICAgICBzMiA9ICJidGVxeiI7Ci0gICAgICBzMyA9ICJ4LDgiOwotCi0gICAgZG9fYWRkb25lX2JyYW5jaF9pOgotICAgICAgaWYgKGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQlhc19iYWQgKF8oIlVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IikpOwotICAgICAgKytpbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0KLSAgICBkb19icmFuY2hfaToKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmltbV9leHByLCBzLCBzMywgeHJlZyk7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZvZmZzZXRfZXhwciwgczIsICJwIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgTV9BQlM6Ci0gICAgICBleHByMS5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAmZXhwcjEsICJzbHRpIiwgIngsOCIsICB5cmVnKTsKLSAgICAgIGlmICh4cmVnICE9IHlyZWcpCi0JbWFjcm9fYnVpbGQgKChjaGFyICopIE5VTEwsICZpY250LCAoZXhwcmVzc2lvblMgKikgTlVMTCwKLQkJICAgICAibW92ZSIsICJ5LFgiLCB4cmVnLCB5cmVnKTsKLSAgICAgIGV4cHIxLlhfYWRkX251bWJlciA9IDI7Ci0gICAgICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleHByMSwgImJ0ZXF6IiwgInAiKTsKLSAgICAgIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgKGV4cHJlc3Npb25TICopIE5VTEwsCi0JCSAgICJuZWciLCAieCx3IiwgeHJlZywgeHJlZyk7Ci0gICAgfQotfQotCi0vKiBGb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcsIHZlcmlmeSB0aGF0IGFsbCBiaXRzIGFyZSBzcGVjaWZpZWQgZWl0aGVyCi0gICBieSB0aGUgbWF0Y2gvbWFzayBwYXJ0IG9mIHRoZSBpbnN0cnVjdGlvbiBkZWZpbml0aW9uLCBvciBieSB0aGUKLSAgIG9wZXJhbmQgbGlzdC4gICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9taXBzX2luc24gKG9wYykKLSAgICAgY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlICpvcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKnAgPSBvcGMtPmFyZ3M7Ci0gIGNoYXIgYzsKLSAgdW5zaWduZWQgbG9uZyB1c2VkX2JpdHMgPSBvcGMtPm1hc2s7Ci0KLSAgaWYgKCh1c2VkX2JpdHMgJiBvcGMtPm1hdGNoKSAhPSBvcGMtPm1hdGNoKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAobWFzayBlcnJvcik6ICVzICVzIiksCi0JICAgICAgb3BjLT5uYW1lLCBvcGMtPmFyZ3MpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2RlZmluZSBVU0VfQklUUyhtYXNrLHNoaWZ0KQkodXNlZF9iaXRzIHw9ICgobWFzaykgPDwgKHNoaWZ0KSkpCi0gIHdoaWxlICgqcCkKLSAgICBzd2l0Y2ggKGMgPSAqcCsrKQotICAgICAgewotICAgICAgY2FzZSAnLCc6IGJyZWFrOwotICAgICAgY2FzZSAnKCc6IGJyZWFrOwotICAgICAgY2FzZSAnKSc6IGJyZWFrOwotICAgICAgY2FzZSAnPCc6IFVTRV9CSVRTIChPUF9NQVNLX1NIQU1ULAlPUF9TSF9TSEFNVCk7CWJyZWFrOwotICAgICAgY2FzZSAnPic6CVVTRV9CSVRTIChPUF9NQVNLX1NIQU1ULAlPUF9TSF9TSEFNVCk7CWJyZWFrOwotICAgICAgY2FzZSAnQSc6IGJyZWFrOwotICAgICAgY2FzZSAnQic6CVVTRV9CSVRTIChPUF9NQVNLX1NZU0NBTEwsCU9QX1NIX1NZU0NBTEwpOwlicmVhazsKLSAgICAgIGNhc2UgJ0MnOglVU0VfQklUUyAoT1BfTUFTS19DT1BaLAkJT1BfU0hfQ09QWik7CWJyZWFrOwotICAgICAgY2FzZSAnRCc6CVVTRV9CSVRTIChPUF9NQVNLX0ZELAkJT1BfU0hfRkQpOwlicmVhazsKLSAgICAgIGNhc2UgJ0UnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdGJzogYnJlYWs7Ci0gICAgICBjYXNlICdHJzoJVVNFX0JJVFMgKE9QX01BU0tfUkQsCQlPUF9TSF9SRCk7CWJyZWFrOwotICAgICAgY2FzZSAnSSc6IGJyZWFrOwotICAgICAgY2FzZSAnTCc6IGJyZWFrOwotICAgICAgY2FzZSAnTSc6CVVTRV9CSVRTIChPUF9NQVNLX0NDQywJCU9QX1NIX0NDQyk7CWJyZWFrOwotICAgICAgY2FzZSAnTic6CVVTRV9CSVRTIChPUF9NQVNLX0JDQywJCU9QX1NIX0JDQyk7CWJyZWFrOwotICAgICAgY2FzZSAnUic6CVVTRV9CSVRTIChPUF9NQVNLX0ZSLAkJT1BfU0hfRlIpOwlicmVhazsKLSAgICAgIGNhc2UgJ1MnOglVU0VfQklUUyAoT1BfTUFTS19GUywJCU9QX1NIX0ZTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdUJzoJVVNFX0JJVFMgKE9QX01BU0tfRlQsCQlPUF9TSF9GVCk7CWJyZWFrOwotICAgICAgY2FzZSAnVic6CVVTRV9CSVRTIChPUF9NQVNLX0ZTLAkJT1BfU0hfRlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ1cnOglVU0VfQklUUyAoT1BfTUFTS19GVCwJCU9QX1NIX0ZUKTsJYnJlYWs7Ci0gICAgICBjYXNlICdhJzoJVVNFX0JJVFMgKE9QX01BU0tfVEFSR0VULAlPUF9TSF9UQVJHRVQpOwlicmVhazsKLSAgICAgIGNhc2UgJ2InOglVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdjJzoJVVNFX0JJVFMgKE9QX01BU0tfQ09ERSwJCU9QX1NIX0NPREUpOwlicmVhazsKLSAgICAgIGNhc2UgJ2QnOglVU0VfQklUUyAoT1BfTUFTS19SRCwJCU9QX1NIX1JEKTsJYnJlYWs7Ci0gICAgICBjYXNlICdmJzogYnJlYWs7Ci0gICAgICBjYXNlICdoJzoJVVNFX0JJVFMgKE9QX01BU0tfUFJFRlgsCU9QX1NIX1BSRUZYKTsJYnJlYWs7Ci0gICAgICBjYXNlICdpJzoJVVNFX0JJVFMgKE9QX01BU0tfSU1NRURJQVRFLAlPUF9TSF9JTU1FRElBVEUpOyBicmVhazsKLSAgICAgIGNhc2UgJ2onOglVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ2snOglVU0VfQklUUyAoT1BfTUFTS19DQUNIRSwJT1BfU0hfQ0FDSEUpOwlicmVhazsKLSAgICAgIGNhc2UgJ2wnOiBicmVhazsKLSAgICAgIGNhc2UgJ28nOiBVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ3AnOglVU0VfQklUUyAoT1BfTUFTS19ERUxUQSwJT1BfU0hfREVMVEEpOwlicmVhazsKLSAgICAgIGNhc2UgJ3EnOglVU0VfQklUUyAoT1BfTUFTS19DT0RFMiwJT1BfU0hfQ09ERTIpOwlicmVhazsKLSAgICAgIGNhc2UgJ3InOiBVU0VfQklUUyAoT1BfTUFTS19SUywJCU9QX1NIX1JTKTsJYnJlYWs7Ci0gICAgICBjYXNlICdzJzoJVVNFX0JJVFMgKE9QX01BU0tfUlMsCQlPUF9TSF9SUyk7CWJyZWFrOwotICAgICAgY2FzZSAndCc6CVVTRV9CSVRTIChPUF9NQVNLX1JULAkJT1BfU0hfUlQpOwlicmVhazsKLSAgICAgIGNhc2UgJ3UnOglVU0VfQklUUyAoT1BfTUFTS19JTU1FRElBVEUsCU9QX1NIX0lNTUVESUFURSk7IGJyZWFrOwotICAgICAgY2FzZSAndic6CVVTRV9CSVRTIChPUF9NQVNLX1JTLAkJT1BfU0hfUlMpOwlicmVhazsKLSAgICAgIGNhc2UgJ3cnOglVU0VfQklUUyAoT1BfTUFTS19SVCwJCU9QX1NIX1JUKTsJYnJlYWs7Ci0gICAgICBjYXNlICd4JzogYnJlYWs7Ci0gICAgICBjYXNlICd6JzogYnJlYWs7Ci0gICAgICBjYXNlICdQJzogVVNFX0JJVFMgKE9QX01BU0tfUEVSRlJFRywJT1BfU0hfUEVSRlJFRyk7CWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlhc19iYWQgKF8oImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKHVua25vd24gb3BlcmFuZCB0eXBlIGAlYycpOiAlcyAlcyIpLAotCQljLCBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0JcmV0dXJuIDA7Ci0gICAgICB9Ci0jdW5kZWYgVVNFX0JJVFMKLSAgaWYgKHVzZWRfYml0cyAhPSAweGZmZmZmZmZmKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAoYml0cyAweCVseCB1bmRlZmluZWQpOiAlcyAlcyIpLAotCSAgICAgIH51c2VkX2JpdHMgJiAweGZmZmZmZmZmLCBvcGMtPm5hbWUsIG9wYy0+YXJncyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiAxOwotfQotCi0vKiBUaGlzIHJvdXRpbmUgYXNzZW1ibGVzIGFuIGluc3RydWN0aW9uIGludG8gaXRzIGJpbmFyeSBmb3JtYXQuICBBcyBhCi0gICBzaWRlIGVmZmVjdCwgaXQgc2V0cyBvbmUgb2YgdGhlIGdsb2JhbCB2YXJpYWJsZXMgaW1tX3JlbG9jIG9yCi0gICBvZmZzZXRfcmVsb2MgdG8gdGhlIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBkbyBpZiBvbmUgb2YgdGhlIG9wZXJhbmRzCi0gICBpcyBhbiBhZGRyZXNzIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19pcCAoc3RyLCBpcCkKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY2hhciBjOwotICBzdHJ1Y3QgbWlwc19vcGNvZGUgKmluc247Ci0gIGNoYXIgKmFyZ3NTdGFydDsKLSAgdW5zaWduZWQgaW50IHJlZ25vOwotICB1bnNpZ25lZCBpbnQgbGFzdHJlZ25vID0gMDsKLSAgY2hhciAqc19yZXNldDsKLSAgY2hhciBzYXZlX2MgPSAwOwotICBpbnQgZnVsbF9vcGNvZGVfbWF0Y2ggPSAxOwotCi0gIGluc25fZXJyb3IgPSBOVUxMOwotCi0gIC8qIElmIHRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBhICcuJywgd2UgZmlyc3QgdHJ5IHRvIG1hdGNoIGFuIGluc3RydWN0aW9uCi0gICAgIGluY2x1ZGluZyB0aGUgJy4nLiAgVGhlbiB3ZSB0cnkgYWdhaW4gd2l0aG91dCB0aGUgJy4nLiAgKi8KLSAgaW5zbiA9IE5VTEw7Ci0gIGZvciAocyA9IHN0cjsgKnMgIT0gJ1wwJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotICAgIGNvbnRpbnVlOwotCi0gIC8qIElmIHdlIHN0b3BwZWQgb24gd2hpdGVzcGFjZSwgdGhlbiByZXBsYWNlIHRoZSB3aGl0ZXNwYWNlIHdpdGggbnVsbCBmb3IKLSAgICAgdGhlIGNhbGwgdG8gaGFzaF9maW5kLiAgU2F2ZSB0aGUgY2hhcmFjdGVyIHdlIHJlcGxhY2VkIGp1c3QgaW4gY2FzZSB3ZQotICAgICBoYXZlIHRvIHJlLXBhcnNlIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGlmIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotICAgIHsKLSAgICAgIHNhdmVfYyA9ICpzOwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgfQotCQotICBpbnNuID0gKHN0cnVjdCBtaXBzX29wY29kZSAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIHN0cik7Ci0KLSAgLyogSWYgd2UgZGlkbid0IGZpbmQgdGhlIGluc3RydWN0aW9uIGluIHRoZSBvcGNvZGUgdGFibGUsIHRyeSBhZ2FpbiwgYnV0Ci0gICAgIHRoaXMgdGltZSB3aXRoIGp1c3QgdGhlIGluc3RydWN0aW9uIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZyB0aGUKLSAgICAgZmlyc3QgJy4nLiAgKi8KLSAgaWYgKGluc24gPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBSZXN0b3JlIHRoZSBjaGFyYWN0ZXIgd2Ugb3ZlcndyaXRlIGFib3ZlIChpZiBhbnkpLiAgKi8gCi0gICAgICBpZiAoc2F2ZV9jKQotCSooLS1zKSA9IHNhdmVfYzsKLQotICAgICAgLyogU2NhbiB1cCB0byB0aGUgZmlyc3QgJy4nIG9yIHdoaXRlc3BhY2UuICAqLwotICAgICAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICpzICE9ICcuJyAmJiAhaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB3ZSBkaWQgbm90IGZpbmQgYSAnLicsIHRoZW4gd2UgY2FuIHF1aXQgbm93LiAgKi8KLSAgICAgIGlmICgqcyAhPSAnLicpCi0JewotCSAgaW5zbl9lcnJvciA9ICJ1bnJlY29nbml6ZWQgb3Bjb2RlIjsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIExvb2t1cCB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgICBpZiAoKGluc24gPSAoc3RydWN0IG1pcHNfb3Bjb2RlICopIGhhc2hfZmluZCAob3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLQl7Ci0JICBpbnNuX2Vycm9yID0gInVucmVjb2duaXplZCBvcGNvZGUiOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgZnVsbF9vcGNvZGVfbWF0Y2ggPSAwOwotICAgIH0KLQotICBhcmdzU3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGludCBpbnNuX2lzYTsKLSAgICAgIGJvb2xlYW4gb2s7Ci0KLSAgICAgIGFzc2VydCAoc3RyY21wIChpbnNuLT5uYW1lLCBzdHIpID09IDApOwotCi0gICAgICBpZiAoKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0ExKQotCWluc25faXNhID0gMTsKLSAgICAgIGVsc2UgaWYgKChpbnNuLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMikKLQlpbnNuX2lzYSA9IDI7Ci0gICAgICBlbHNlIGlmICgoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTMpCi0JaW5zbl9pc2EgPSAzOwotICAgICAgZWxzZSBpZiAoKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0E0KQotCWluc25faXNhID0gNDsKLSAgICAgIGVsc2UKLQlpbnNuX2lzYSA9IDE1OwotCi0gICAgICBpZiAoaW5zbl9pc2EgPD0gbWlwc19vcHRzLmlzYSkKLQlvayA9IHRydWU7Ci0gICAgICBlbHNlIGlmIChpbnNuLT5waW5mbyA9PSBJTlNOX01BQ1JPKQotCW9rID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmICgobWlwc19jcHUgPT0gNDY1MCAmJiAoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fNDY1MCkgIT0gMCkKLQkgICAgICAgfHwgKG1pcHNfY3B1ID09IDQwMTAgJiYgKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOXzQwMTApICE9IDApCi0JICAgICAgIHx8ICgobWlwc19jcHUgPT0gNDEwMAotCQkgICAgfHwgbWlwc19jcHUgPT0gNDExMQotCQkgICAgKQotCQkgICAmJiAoaW5zbi0+bWVtYmVyc2hpcCAmIElOU05fNDEwMCkgIT0gMCkKLQkgICAgICAgfHwgKG1pcHNfY3B1ID09IDM5MDAgJiYgKGluc24tPm1lbWJlcnNoaXAgJiBJTlNOXzM5MDApICE9IDApKQotCW9rID0gdHJ1ZTsKLSAgICAgIGVsc2UKLQlvayA9IGZhbHNlOwotCi0gICAgICBpZiAoaW5zbi0+cGluZm8gIT0gSU5TTl9NQUNSTykKLQl7Ci0JICBpZiAobWlwc19jcHUgPT0gNDY1MCAmJiAoaW5zbi0+cGluZm8gJiBGUF9EKSAhPSAwKQotCSAgICBvayA9IGZhbHNlOwotCX0KLQotICAgICAgaWYgKCEgb2spCi0JewotCSAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXQotCSAgICAgICYmIHN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSA9PSAwKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBpZiAoaW5zbl9pc2EgPT0gMTUgCi0gICAgICAgICAgICAgIHx8IGluc25faXNhIDw9IG1pcHNfb3B0cy5pc2EpCi0JICAgIGluc25fZXJyb3IgPSBfKCJvcGNvZGUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHByb2Nlc3NvciIpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLQkgICAgICBzcHJpbnRmIChidWYsIF8oIm9wY29kZSByZXF1aXJlcyAtbWlwcyVkIG9yIGdyZWF0ZXIiKSwgaW5zbl9pc2EpOwotCSAgICAgIGluc25fZXJyb3IgPSBidWY7Ci0JICAgIH0KLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlwLT5pbnNuX21vID0gaW5zbjsKLSAgICAgIGlwLT5pbnNuX29wY29kZSA9IGluc24tPm1hdGNoOwotICAgICAgZm9yIChhcmdzID0gaW5zbi0+YXJnczs7ICsrYXJncykKLQl7Ci0JICBpZiAoKnMgPT0gJyAnKQotCSAgICArK3M7Ci0JICBzd2l0Y2ggKCphcmdzKQotCSAgICB7Ci0JICAgIGNhc2UgJ1wwJzoJCS8qIGVuZCBvZiBhcmdzICovCi0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXJldHVybjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcsJzoKLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgcy0tOwotCSAgICAgIHN3aXRjaCAoKisrYXJncykKLQkJewotCQljYXNlICdyJzoKLQkJY2FzZSAndic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAyMTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICd3JzoKLQkJY2FzZSAnVyc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCAxNjsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdWJzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IDExOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKCc6Ci0JICAgICAgLyogSGFuZGxlIG9wdGlvbmFsIGJhc2UgcmVnaXN0ZXIuCi0JCSBFaXRoZXIgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgb21pdHRlZCBvcgotCQkgd2UgbXVzdCBoYXZlIGEgbGVmdCBwYXJlbi4gKi8KLQkgICAgICAvKiBUaGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgbmV4dCBvcGVyYW5kIHNwZWNpZmllcgotCQkgaXMgYSBiYXNlIHJlZ2lzdGVyIHNwZWNpZmljYXRpb24uICAqLwotCSAgICAgIGFzc2VydCAoYXJnc1sxXSA9PSAnYicgfHwgYXJnc1sxXSA9PSAnNScKLQkJICAgICAgfHwgYXJnc1sxXSA9PSAnLScgfHwgYXJnc1sxXSA9PSAnNCcpOwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQlyZXR1cm47Ci0KLQkgICAgY2FzZSAnKSc6CQkvKiB0aGVzZSBtdXN0IG1hdGNoIGV4YWN0bHkgKi8KLQkgICAgICBpZiAoKnMrKyA9PSAqYXJncykKLQkJY29udGludWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnPCc6CQkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBkaWdpdCAqLwotCSAgICAgIC8qCi0JICAgICAgICogQWNjb3JkaW5nIHRvIHRoZSBtYW51YWwsIGlmIHRoZSBzaGlmdCBhbW91bnQgaXMgZ3JlYXRlcgotCSAgICAgICAqIHRoYW4gMzEgb3IgbGVzcyB0aGFuIDAgdGhlIHRoZSBzaGlmdCBhbW91bnQgc2hvdWxkIGJlCi0JICAgICAgICogbW9kIDMyLiBJbiByZWFsaXR5IHRoZSBtaXBzIGFzc2VtYmxlciBpc3N1ZXMgYW4gZXJyb3IuCi0JICAgICAgICogV2UgaXNzdWUgYSB3YXJuaW5nIGFuZCBtYXNrIG91dCBhbGwgYnV0IHRoZSBsb3cgNSBiaXRzLgotCSAgICAgICAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAzMSkKLQkJewotCQkgIGFzX3dhcm4gKF8oIkltcHJvcGVyIHNoaWZ0IGFtb3VudCAoJWxkKSIpLAotCQkJICAgKGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlcik7Ci0JCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyICYgMHgxZjsKLQkJfQotCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgNjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJz4nOgkJLyogc2hpZnQgYW1vdW50IG1pbnVzIDMyICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA8IDMyCi0JCSAgfHwgKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDYzKQotCQlicmVhazsKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gKGltbV9leHByLlhfYWRkX251bWJlciAtIDMyKSA8PCA2OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQotCSAgICBjYXNlICdrJzoJCS8qIGNhY2hlIGNvZGUgKi8KLQkgICAgY2FzZSAnaCc6CQkvKiBwcmVmeCBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlciA+IDMxKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSW52YWxpZCB2YWx1ZSBmb3IgYCVzJyAoJWx1KSIpLAotCQkJICAgaXAtPmluc25fbW8tPm5hbWUsCi0JCQkgICAodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgxZjsKLQkJfQotCSAgICAgIGlmICgqYXJncyA9PSAnaycpCi0JCWlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPDwgT1BfU0hfQ0FDSEU7Ci0JICAgICAgZWxzZQotCQlpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IE9QX1NIX1BSRUZYOwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYyc6CQkvKiBicmVhayBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAxMDIzKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSWxsZWdhbCBicmVhayBjb2RlICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgzZmY7Ci0JCX0KLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDE2OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAncSc6CQkvKiBsb3dlciBicmVhayBjb2RlICovCi0JICAgICAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBjaGVja19hYnNvbHV0ZV9leHByIChpcCwgJmltbV9leHByKTsKLQkgICAgICBpZiAoKHVuc2lnbmVkKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAxMDIzKQotCQl7Ci0JCSAgYXNfd2FybiAoXygiSWxsZWdhbCBsb3dlciBicmVhayBjb2RlICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHgzZmY7Ci0JCX0KLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdCJzoJCS8qIHN5c2NhbGwgY29kZSAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCkgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gMHhmZmZmZikKLQkJYXNfd2FybiAoXygiSWxsZWdhbCBzeXNjYWxsIGNvZGUgKCVsZCkiKSwKLQkJCSAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDY7Ci0JICAgICAgaW1tX2V4cHIuWF9vcCA9IE9fYWJzZW50OwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgY2FzZSAnQyc6ICAgICAgICAgICAvKiBDb3Byb2Nlc3NvciBjb2RlICovCi0gICAgICAgICAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0gICAgICAgICAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49ICgxPDwyNSkpCi0JCXsKLSAgICAgICAgICAgICAgICAgIGFzX3dhcm4gKF8oIkNvcHJvY2Nlc29yIGNvZGUgPiAyNSBiaXRzICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAoKDE8PDI1KSAtIDEpOwotCQl9Ci0gICAgICAgICAgICAgIGlwLT5pbnNuX29wY29kZSB8PSBpbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0gICAgICAgICAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgICAgICAgICAgcyA9IGV4cHJfZW5kOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdQJzoJCS8qIFBlcmZvcm1hbmNlIHJlZ2lzdGVyICovCi0gICAgICAgICAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0gICAgICAgICAgICAgIGlmIChpbW1fZXhwci5YX2FkZF9udW1iZXIgIT0gMCAmJiBpbW1fZXhwci5YX2FkZF9udW1iZXIgIT0gMSkKLQkJewotICAgICAgICAgICAgICAgICAgYXNfd2FybiAoXygiSW52YWxpZGF0ZSBwZXJmb3JtYW5jZSByZWdzdGVyICglbGQpIiksCi0JCQkgICAobG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAxOwotCQl9Ci0gICAgICAgICAgICAgIGlwLT5pbnNuX29wY29kZSB8PSAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDw8IDEpOwotICAgICAgICAgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gICAgICAgICAgICAgIHMgPSBleHByX2VuZDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYic6CQkvKiBiYXNlIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ2QnOgkJLyogZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAncyc6CQkvKiBzb3VyY2UgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAndCc6CQkvKiB0YXJnZXQgcmVnaXN0ZXIgKi8KLQkgICAgY2FzZSAncic6CQkvKiBib3RoIHRhcmdldCBhbmQgc291cmNlICovCi0JICAgIGNhc2UgJ3YnOgkJLyogYm90aCBkZXN0IGFuZCBzb3VyY2UgKi8KLQkgICAgY2FzZSAndyc6CQkvKiBib3RoIGRlc3QgYW5kIHRhcmdldCAqLwotCSAgICBjYXNlICdFJzoJCS8qIGNvcHJvY2Vzc29yIHRhcmdldCByZWdpc3RlciAqLwotCSAgICBjYXNlICdHJzoJCS8qIGNvcHJvY2Vzc29yIGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ3gnOgkJLyogaWdub3JlIHJlZ2lzdGVyIG5hbWUgKi8KLQkgICAgY2FzZSAneic6CQkvKiBtdXN0IGJlIHplcm8gcmVnaXN0ZXIgKi8KLQkgICAgICBzX3Jlc2V0ID0gczsKLQkgICAgICBpZiAoc1swXSA9PSAnJCcpCi0JCXsKLQotCQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc1sxXSkpCi0JCSAgICB7Ci0JCSAgICAgICsrczsKLQkJICAgICAgcmVnbm8gPSAwOwotCQkgICAgICBkbwotCQkJewotCQkJICByZWdubyAqPSAxMDsKLQkJCSAgcmVnbm8gKz0gKnMgLSAnMCc7Ci0JCQkgICsrczsKLQkJCX0KLQkJICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpOwotCQkgICAgICBpZiAocmVnbm8gPiAzMSkKLQkJCWFzX2JhZCAoXygiSW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIpLCByZWdubyk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmFyZ3MgPT0gJ0UnIHx8ICphcmdzID09ICdHJykKLQkJICAgIGdvdG8gbm90cmVnOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaWYgKHNbMV0gPT0gJ2YnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gRlA7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ3MnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gU1A7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2cnICYmIHNbMl0gPT0gJ3AnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gR1A7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2EnICYmIHNbMl0gPT0gJ3QnKQotCQkJewotCQkJICBzICs9IDM7Ci0JCQkgIHJlZ25vID0gQVQ7Ci0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzAnKQotCQkJewotCQkJICBzICs9IDQ7Ci0JCQkgIHJlZ25vID0gS1QwOwotCQkJfQotCQkgICAgICBlbHNlIGlmIChzWzFdID09ICdrJyAmJiBzWzJdID09ICd0JyAmJiBzWzNdID09ICcxJykKLQkJCXsKLQkJCSAgcyArPSA0OwotCQkJICByZWdubyA9IEtUMTsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoaXRibF9oYXZlX2VudHJpZXMpCi0JCQl7Ci0JCQkgIGNoYXIgKnAsICpuOwotCQkJICB1bnNpZ25lZCBsb25nIHI7Ci0KLQkJCSAgcCA9IHMgKyAxOyAJLyogYWR2YW5jZSBwYXN0ICckJyAqLwotCQkJICBuID0gaXRibF9nZXRfZmllbGQgKCZwKTsgIC8qIG4gaXMgbmFtZSAqLwotCi0JCQkgIC8qIFNlZSBpZiB0aGlzIGlzIGEgcmVnaXN0ZXIgZGVmaW5lZCBpbiBhbgotCQkJICAgICBpdGJsIGVudHJ5LiAgKi8KLQkJCSAgaWYgKGl0YmxfZ2V0X3JlZ192YWwgKG4sICZyKSkKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBHZXRfZmllbGQgYWR2YW5jZXMgdG8gdGhlIHN0YXJ0IG9mCi0JCQkJIHRoZSBuZXh0IGZpZWxkLCBzbyB3ZSBuZWVkIHRvIGJhY2sKLQkJCQkgcmFjayB0byB0aGUgZW5kIG9mIHRoZSBsYXN0IGZpZWxkLiAgKi8KLQkJCSAgICAgIGlmIChwKSAKLQkJCQlzID0gcCAtIDE7Ci0JCQkgICAgICBlbHNlIAotCQkJCXMgPSBzdHJjaHIgKHMsICdcMCcpOwotCQkJICAgICAgcmVnbm8gPSByOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIGdvdG8gbm90cmVnOwotCQkJICB9Ci0JCSAgICAgIGVsc2UKLQkJCWdvdG8gbm90cmVnOwotCQkgICAgfQotCQkgIGlmIChyZWdubyA9PSBBVAotCQkgICAgICAmJiAhIG1pcHNfb3B0cy5ub2F0Ci0JCSAgICAgICYmICphcmdzICE9ICdFJwotCQkgICAgICAmJiAqYXJncyAhPSAnRycpCi0JCSAgICBhc193YXJuIChfKCJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JCSAgYyA9ICphcmdzOwotCQkgIGlmICgqcyA9PSAnICcpCi0JCSAgICBzKys7Ci0JCSAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjID09ICdyJyB8fCBjID09ICd2JyB8fCBjID09ICd3JykKLQkJCXsKLQkJCSAgcmVnbm8gPSBsYXN0cmVnbm87Ci0JCQkgIHMgPSBzX3Jlc2V0OwotCQkJICBhcmdzKys7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgLyogJ3onIG9ubHkgbWF0Y2hlcyAkMC4gICovCi0JCSAgaWYgKGMgPT0gJ3onICYmIHJlZ25vICE9IDApCi0JCSAgICBicmVhazsKLQotCS8qIE5vdyB0aGF0IHdlIGhhdmUgYXNzZW1ibGVkIG9uZSBvcGVyYW5kLCB3ZSB1c2UgdGhlIGFyZ3Mgc3RyaW5nIAotCSAqIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXQgZ29lcyBpbiB0aGUgaW5zdHJ1Y3Rpb24uICovCi0JCSAgc3dpdGNoIChjKQotCQkgICAgewotCQkgICAgY2FzZSAncic6Ci0JCSAgICBjYXNlICdzJzoKLQkJICAgIGNhc2UgJ3YnOgotCQkgICAgY2FzZSAnYic6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAyMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgIGNhc2UgJ0cnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAndyc6Ci0JCSAgICBjYXNlICd0JzoKLQkJICAgIGNhc2UgJ0UnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTY7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAneCc6Ci0JCSAgICAgIC8qIFRoaXMgY2FzZSBleGlzdHMgYmVjYXVzZSBvbiB0aGUgcjMwMDAgdHJ1bmMKLQkJCSBleHBhbmRzIGludG8gYSBtYWNybyB3aGljaCByZXF1aXJlcyBhIGdwCi0JCQkgcmVnaXN0ZXIuICBPbiB0aGUgcjYwMDAgb3IgcjQwMDAgaXQgaXMKLQkJCSBhc3NlbWJsZWQgaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbiB3aGljaAotCQkJIGlnbm9yZXMgdGhlIHJlZ2lzdGVyLiAgVGh1cyB0aGUgaW5zbiB2ZXJzaW9uCi0JCQkgaXMgTUlQU19JU0EyIGFuZCB1c2VzICd4JywgYW5kIHRoZSBtYWNybwotCQkJIHZlcnNpb24gaXMgTUlQU19JU0ExIGFuZCB1c2VzICd0Jy4gICovCi0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAneic6Ci0JCSAgICAgIC8qIFRoaXMgY2FzZSBpcyBmb3IgdGhlIGRpdiBpbnN0cnVjdGlvbiwgd2hpY2gKLQkJCSBhY3RzIGRpZmZlcmVudGx5IGlmIHRoZSBkZXN0aW5hdGlvbiBhcmd1bWVudAotCQkJIGlzICQwLiAgVGhpcyBvbmx5IG1hdGNoZXMgJDAsIGFuZCBpcyBjaGVja2VkCi0JCQkgb3V0c2lkZSB0aGUgc3dpdGNoLiAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgLyogSXRibCBvcGVyYW5kOyBub3QgeWV0IGltcGxlbWVudGVkLiBGSVhNRSA/PyAqLwotCQkgICAgICBicmVhazsKLQkJICAgICAgLyogV2hhdCBhYm91dCBhbGwgb3RoZXIgb3BlcmFuZHMgbGlrZSAnaScsIHdoaWNoCi0JCQkgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGUgb3Bjb2RlIHRhYmxlPyAqLwotCQkgICAgfQotCQkgIGxhc3RyZWdubyA9IHJlZ25vOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIG5vdHJlZzoKLQkgICAgICBzd2l0Y2ggKCphcmdzKyspCi0JCXsKLQkJY2FzZSAncic6Ci0JCWNhc2UgJ3YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMjE7Ci0JCSAgY29udGludWU7Ci0JCWNhc2UgJ3cnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTY7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdEJzoJCS8qIGZsb2F0aW5nIHBvaW50IGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1MnOgkJLyogZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1QnOgkJLyogZmxvYXRpbmcgcG9pbnQgdGFyZ2V0IHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1InOgkJLyogZmxvYXRpbmcgcG9pbnQgc291cmNlIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ1YnOgotCSAgICBjYXNlICdXJzoKLQkgICAgICBzX3Jlc2V0ID0gczsKLQkgICAgICBpZiAoc1swXSA9PSAnJCcgJiYgc1sxXSA9PSAnZicgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNbMl0pKQotCQl7Ci0JCSAgcyArPSAyOwotCQkgIHJlZ25vID0gMDsKLQkJICBkbwotCQkgICAgewotCQkgICAgICByZWdubyAqPSAxMDsKLQkJICAgICAgcmVnbm8gKz0gKnMgLSAnMCc7Ci0JCSAgICAgICsrczsKLQkJICAgIH0KLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0KLQkJICBpZiAocmVnbm8gPiAzMSkKLQkJICAgIGFzX2JhZCAoXygiSW52YWxpZCBmbG9hdCByZWdpc3RlciBudW1iZXIgKCVkKSIpLCByZWdubyk7Ci0KLQkJICBpZiAoKHJlZ25vICYgMSkgIT0gMAotCQkgICAgICAmJiBtaXBzX29wdHMuaXNhIDwgMwotCQkgICAgICAmJiAhIChzdHJjbXAgKHN0ciwgIm10YzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJtZmMxIikgPT0gMAotCQkJICAgIHx8IHN0cmNtcCAoc3RyLCAibHdjMSIpID09IDAKLQkJCSAgICB8fCBzdHJjbXAgKHN0ciwgInN3YzEiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJsLnMiKSA9PSAwCi0JCQkgICAgfHwgc3RyY21wIChzdHIsICJzLnMiKSA9PSAwKSkKLQkJICAgIGFzX3dhcm4gKF8oIkZsb2F0IHJlZ2lzdGVyIHNob3VsZCBiZSBldmVuLCB3YXMgJWQiKSwKLQkJCSAgICAgcmVnbm8pOwotCi0JCSAgYyA9ICphcmdzOwotCQkgIGlmICgqcyA9PSAnICcpCi0JCSAgICBzKys7Ci0JCSAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjID09ICdWJyB8fCBjID09ICdXJykKLQkJCXsKLQkJCSAgcmVnbm8gPSBsYXN0cmVnbm87Ci0JCQkgIHMgPSBzX3Jlc2V0OwotCQkJICBhcmdzKys7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgc3dpdGNoIChjKQotCQkgICAgewotCQkgICAgY2FzZSAnRCc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCA2OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1YnOgotCQkgICAgY2FzZSAnUyc6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAxMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdXJzoKLQkJICAgIGNhc2UgJ1QnOgotCQkgICAgICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgMTY7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUic6Ci0JCSAgICAgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCAyMTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgbGFzdHJlZ25vID0gcmVnbm87Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCi0JICAgICAgc3dpdGNoICgqYXJncysrKQotCQl7Ci0JCWNhc2UgJ1YnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTE7Ci0JCSAgY29udGludWU7Ci0JCWNhc2UgJ1cnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSBsYXN0cmVnbm8gPDwgMTY7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdJJzoKLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGlmIChpbW1fZXhwci5YX29wICE9IE9fYmlnCi0JCSAgJiYgaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQlpbnNuX2Vycm9yID0gXygiYWJzb2x1dGUgZXhwcmVzc2lvbiByZXF1aXJlZCIpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdBJzoKLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ18zMjsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnRic6Ci0JICAgIGNhc2UgJ0wnOgotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnbCc6Ci0JICAgICAgewotCQlpbnQgZjY0OwotCQljaGFyICpzYXZlX2luOwotCQljaGFyICplcnI7Ci0JCXVuc2lnbmVkIGNoYXIgdGVtcFs4XTsKLQkJaW50IGxlbjsKLQkJdW5zaWduZWQgaW50IGxlbmd0aDsKLQkJc2VnVCBzZWc7Ci0JCXN1YnNlZ1Qgc3Vic2VnOwotCQljaGFyICpwOwotCi0JCS8qIFRoZXNlIG9ubHkgYXBwZWFyIGFzIHRoZSBsYXN0IG9wZXJhbmQgaW4gYW4KLQkJICAgaW5zdHJ1Y3Rpb24sIGFuZCBldmVyeSBpbnN0cnVjdGlvbiB0aGF0IGFjY2VwdHMKLQkJICAgdGhlbSBpbiBhbnkgdmFyaWFudCBhY2NlcHRzIHRoZW0gaW4gYWxsIHZhcmlhbnRzLgotCQkgICBUaGlzIG1lYW5zIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYmFja2luZyBvdXQKLQkJICAgYW55IGNoYW5nZXMgaWYgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IG1hdGNoLgotCi0JCSAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyB0aGUgc2l6ZSBvZiB0aGUKLQkJICAgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgYW5kIHdoZXJlIGl0IGdvZXMuICBGb3IgJ0YnCi0JCSAgIGFuZCAnTCcgdGhlIGNvbnN0YW50IGlzIDY0IGJpdHM7IGZvciAnZicgYW5kICdsJyBpdAotCQkgICBpcyAzMiBiaXRzLiAgV2hlcmUgdGhlIGNvbnN0YW50IGlzIHBsYWNlZCBpcyBiYXNlZAotCQkgICBvbiBob3cgdGhlIE1JUFMgYXNzZW1ibGVyIGRvZXMgdGhpbmdzOgotCQkgICAgRiAtLSAucmRhdGEKLQkJICAgIEwgLS0gLmxpdDgKLQkJICAgIGYgLS0gaW1tZWRpYXRlIHZhbHVlCi0JCSAgICBsIC0tIC5saXQ0Ci0KLQkJICAgIFRoZSAubGl0NCBhbmQgLmxpdDggc2VjdGlvbnMgYXJlIG9ubHkgdXNlZCBpZgotCQkgICAgcGVybWl0dGVkIGJ5IHRoZSAtRyBhcmd1bWVudC4KLQotCQkgICAgV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSB1c2UgdGhlCi0JCSAgICAubGl0OCBzZWN0aW9uIGJ1dCBub3QgdGhlIC5saXQ0IHNlY3Rpb24gKHdlIGNhbiBkbwotCQkgICAgLmxpdDQgaW5saW5lIGVhc2lseTsgd2UgbmVlZCB0byBwdXQgLmxpdDgKLQkJICAgIHNvbWV3aGVyZSBpbiB0aGUgZGF0YSBzZWdtZW50LCBhbmQgdXNpbmcgLmxpdDgKLQkJICAgIHBlcm1pdHMgdGhlIGxpbmtlciB0byBldmVudHVhbGx5IGNvbWJpbmUgaWRlbnRpY2FsCi0JCSAgICAubGl0OCBlbnRyaWVzKS4gICovCi0KLQkJZjY0ID0gKmFyZ3MgPT0gJ0YnIHx8ICphcmdzID09ICdMJzsKLQotCQlzYXZlX2luID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQlpbnB1dF9saW5lX3BvaW50ZXIgPSBzOwotCQllcnIgPSBtZF9hdG9mIChmNjQgPyAnZCcgOiAnZicsIChjaGFyICopIHRlbXAsICZsZW4pOwotCQlsZW5ndGggPSBsZW47Ci0JCXMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCWlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0JCWlmIChlcnIgIT0gTlVMTCAmJiAqZXJyICE9ICdcMCcpCi0JCSAgewotCQkgICAgYXNfYmFkIChfKCJCYWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQ6ICVzIiksIGVycik7Ci0JCSAgICBtZW1zZXQgKHRlbXAsICdcMCcsIHNpemVvZiB0ZW1wKTsKLQkJICAgIGxlbmd0aCA9IGY2NCA/IDggOiA0OwotCQkgIH0KLQotCQlhc3NlcnQgKGxlbmd0aCA9PSAoZjY0ID8gOCA6IDQpKTsKLQotCQlpZiAoKmFyZ3MgPT0gJ2YnCi0JCSAgICB8fCAoKmFyZ3MgPT0gJ2wnCi0JCQkmJiAoISBVU0VfR0xPQkFMX1BPSU5URVJfT1BUCi0JCQkgICAgfHwgbWlwc19waWMgPT0gRU1CRURERURfUElDCi0JCQkgICAgfHwgZ19zd2l0Y2hfdmFsdWUgPCA0Ci0JCQkgICAgfHwgKHRlbXBbMF0gPT0gMCAmJiB0ZW1wWzFdID09IDApCi0JCQkgICAgfHwgKHRlbXBbMl0gPT0gMCAmJiB0ZW1wWzNdID09IDApKSkpCi0JCSAgewotCQkgICAgaW1tX2V4cHIuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JCSAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikKLQkJICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGwzMiAodGVtcCk7Ci0JCSAgICBlbHNlCi0JCSAgICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRiMzIgKHRlbXApOwotCQkgIH0KLQkJZWxzZSBpZiAobGVuZ3RoID4gNAotCQkJICYmICgodGVtcFswXSA9PSAwICYmIHRlbXBbMV0gPT0gMCkKLQkJCSAgICAgfHwgKHRlbXBbMl0gPT0gMCAmJiB0ZW1wWzNdID09IDApKQotCQkJICYmICgodGVtcFs0XSA9PSAwICYmIHRlbXBbNV0gPT0gMCkKLQkJCSAgICAgfHwgKHRlbXBbNl0gPT0gMCAmJiB0ZW1wWzddID09IDApKSkKLQkJICB7Ci0JCSAgICAvKiBUaGUgdmFsdWUgaXMgc2ltcGxlIGVub3VnaCB0byBsb2FkIHdpdGggYQotICAgICAgICAgICAgICAgICAgICAgICBjb3VwbGUgb2YgaW5zdHJ1Y3Rpb25zLiAgSW4gbWlwczEgbW9kZSwgc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgIGltbV9leHByIHRvIHRoZSBoaWdoIG9yZGVyIDMyIGJpdHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF9leHByIHRvIHRoZSBsb3cgb3JkZXIgMzIgYml0cy4KLSAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCBzZXQgaW1tX2V4cHIgdG8gdGhlIGVudGlyZSA2NCBiaXQKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnQuICAqLwotCQkgICAgaWYgKG1pcHNfb3B0cy5pc2EgPCAzKQotCQkgICAgICB7Ci0JCQlpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJCW9mZnNldF9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQkJaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JCQkgIHsKLQkJCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0bDMyICh0ZW1wICsgNCk7Ci0JCQkgICAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0gYmZkX2dldGwzMiAodGVtcCk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRiMzIgKHRlbXApOwotCQkJICAgIG9mZnNldF9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRiMzIgKHRlbXAgKyA0KTsKLQkJCSAgfQotCQkJaWYgKG9mZnNldF9leHByLlhfYWRkX251bWJlciA9PSAwKQotCQkJICBvZmZzZXRfZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKHNpemVvZiAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyKSA+IDQpCi0JCSAgICAgIHsKLQkJCWltbV9leHByLlhfb3AgPSBPX2NvbnN0YW50OwotCQkJaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JCQkgIGltbV9leHByLlhfYWRkX251bWJlciA9IGJmZF9nZXRsNjQgKHRlbXApOwotCQkJZWxzZQotCQkJICBpbW1fZXhwci5YX2FkZF9udW1iZXIgPSBiZmRfZ2V0YjY0ICh0ZW1wKTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlpbW1fZXhwci5YX29wID0gT19iaWc7Ci0JCQlpbW1fZXhwci5YX2FkZF9udW1iZXIgPSA0OwotCQkJaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0JCQkgIHsKLQkJCSAgICBnZW5lcmljX2JpZ251bVswXSA9IGJmZF9nZXRsMTYgKHRlbXApOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzFdID0gYmZkX2dldGwxNiAodGVtcCArIDIpOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzJdID0gYmZkX2dldGwxNiAodGVtcCArIDQpOwotCQkJICAgIGdlbmVyaWNfYmlnbnVtWzNdID0gYmZkX2dldGwxNiAodGVtcCArIDYpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBnZW5lcmljX2JpZ251bVswXSA9IGJmZF9nZXRiMTYgKHRlbXAgKyA2KTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVsxXSA9IGJmZF9nZXRiMTYgKHRlbXAgKyA0KTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVsyXSA9IGJmZF9nZXRiMTYgKHRlbXAgKyAyKTsKLQkJCSAgICBnZW5lcmljX2JpZ251bVszXSA9IGJmZF9nZXRiMTYgKHRlbXApOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBjb25zdCBjaGFyICpuZXduYW1lOwotCQkgICAgc2VnVCBuZXdfc2VnOwotCi0JCSAgICAvKiBTd2l0Y2ggdG8gdGhlIHJpZ2h0IHNlY3Rpb24uICAqLwotCQkgICAgc2VnID0gbm93X3NlZzsKLQkJICAgIHN1YnNlZyA9IG5vd19zdWJzZWc7Ci0JCSAgICBzd2l0Y2ggKCphcmdzKQotCQkgICAgICB7Ci0JCSAgICAgIGRlZmF1bHQ6IC8qIHVudXNlZCBkZWZhdWx0IGNhc2UgYXZvaWRzIHdhcm5pbmdzLiAgKi8KLQkJICAgICAgY2FzZSAnTCc6Ci0JCQluZXduYW1lID0gUkRBVEFfU0VDVElPTl9OQU1FOwotCQkJaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQgJiYgZ19zd2l0Y2hfdmFsdWUgPj0gOCkKLQkJCSAgbmV3bmFtZSA9ICIubGl0OCI7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSAnRic6Ci0JCQluZXduYW1lID0gUkRBVEFfU0VDVElPTl9OQU1FOwotCQkJYnJlYWs7Ci0JCSAgICAgIGNhc2UgJ2wnOgotCQkJYXNzZXJ0ICghVVNFX0dMT0JBTF9QT0lOVEVSX09QVAotCQkJCXx8IGdfc3dpdGNoX3ZhbHVlID49IDQpOwotCQkJbmV3bmFtZSA9ICIubGl0NCI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgbmV3X3NlZyA9IHN1YnNlZ19uZXcgKG5ld25hbWUsIChzdWJzZWdUKSAwKTsKLQkJICAgIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JCSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBuZXdfc2VnLAotCQkJCQkgICAgIChTRUNfQUxMT0MKLQkJCQkJICAgICAgfCBTRUNfTE9BRAotCQkJCQkgICAgICB8IFNFQ19SRUFET05MWQotCQkJCQkgICAgICB8IFNFQ19EQVRBKSk7Ci0JCSAgICBmcmFnX2FsaWduICgqYXJncyA9PSAnbCcgPyAyIDogMywgMCwgMCk7Ci0JCSAgICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyCi0JCQkmJiBzdHJjbXAgKFRBUkdFVF9PUywgImVsZiIpICE9IDApCi0JCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKG5ld19zZWcsIDQpOwotCQkgICAgZWxzZQotCQkgICAgICByZWNvcmRfYWxpZ25tZW50IChuZXdfc2VnLCAqYXJncyA9PSAnbCcgPyAyIDogMyk7Ci0JCSAgICBpZiAoc2VnID09IG5vd19zZWcpCi0JCSAgICAgIGFzX2JhZCAoXygiQ2FuJ3QgdXNlIGZsb2F0aW5nIHBvaW50IGluc24gaW4gdGhpcyBzZWN0aW9uIikpOwotCi0JCSAgICAvKiBTZXQgdGhlIGFyZ3VtZW50IHRvIHRoZSBjdXJyZW50IGFkZHJlc3MgaW4gdGhlCi0JCSAgICAgICBzZWN0aW9uLiAgKi8KLQkJICAgIG9mZnNldF9leHByLlhfb3AgPSBPX3N5bWJvbDsKLQkJICAgIG9mZnNldF9leHByLlhfYWRkX3N5bWJvbCA9Ci0JCSAgICAgIHN5bWJvbF9uZXcgKCJMMFwwMDEiLCBub3dfc2VnLAotCQkJCSAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLCBmcmFnX25vdyk7Ci0JCSAgICBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPSAwOwotCi0JCSAgICAvKiBQdXQgdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciBpbnRvIHRoZSBzZWN0aW9uLiAgKi8KLQkJICAgIHAgPSBmcmFnX21vcmUgKChpbnQpIGxlbmd0aCk7Ci0JCSAgICBtZW1jcHkgKHAsIHRlbXAsIGxlbmd0aCk7Ci0KLQkJICAgIC8qIFN3aXRjaCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzZWN0aW9uLiAgKi8KLQkJICAgIHN1YnNlZ19zZXQgKHNlZywgc3Vic2VnKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2knOgkJLyogMTYgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotCSAgICBjYXNlICdqJzoJCS8qIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlICovCi0JICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0xPMTY7Ci0JICAgICAgYyA9IG15X2dldFNtYWxsRXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkgICAgICBpZiAoYyAhPSAnXDAnKQotCQl7Ci0JCSAgaWYgKGMgIT0gJ2wnKQotCQkgICAgewotCQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkJaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0KLQkJCSAgKGltbV9leHByLlhfYWRkX251bWJlciA+PiAxNikgJiAweGZmZmY7Ci0JCSAgICAgIGVsc2UgaWYgKGMgPT0gJ2gnKQotCQkJewotCQkJICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfSEkxNl9TOwotCQkJICBpbW1fdW5tYXRjaGVkX2hpID0gdHJ1ZTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJaW1tX3JlbG9jID0gQkZEX1JFTE9DX0hJMTY7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCQkgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDB4ZmZmZjsKLQkJfQotCSAgICAgIGlmICgqYXJncyA9PSAnaScpCi0JCXsKLQkJICBpZiAoKGMgPT0gJ1wwJyAmJiBpbW1fZXhwci5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICAgIHx8ICgoaW1tX2V4cHIuWF9hZGRfbnVtYmVyIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID49IDB4MTAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICYmIGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpbnNuICsgMSA8ICZtaXBzX29wY29kZXNbTlVNT1BDT0RFU10gJiYKLQkJCSAgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKLQkJCWJyZWFrOwotCQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICYmIGltbV9leHByLlhfb3AgIT0gT19iaWcpCi0JCQlpbnNuX2Vycm9yID0gXygiYWJzb2x1dGUgZXhwcmVzc2lvbiByZXF1aXJlZCIpOwotCQkgICAgICBlbHNlCi0JCQlhc19iYWQgKF8oIjE2IGJpdCBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAwLi42NTUzNSIpKTsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGludCBtb3JlOwotCQkgIG9mZnNldFQgbWF4OwotCi0JCSAgLyogVGhlIHVwcGVyIGJvdW5kIHNob3VsZCBiZSAweDgwMDAsIGJ1dAotCQkgICAgIHVuZm9ydHVuYXRlbHkgdGhlIE1JUFMgYXNzZW1ibGVyIGFjY2VwdHMgbnVtYmVycwotCQkgICAgIGZyb20gMHg4MDAwIHRvIDB4ZmZmZiBhbmQgc2lnbiBleHRlbmRzIHRoZW0sIGFuZAotCQkgICAgIHdlIHdhbnQgdG8gYmUgY29tcGF0aWJsZS4gIFdlIG9ubHkgcGVybWl0IHRoaXMKLQkJICAgICBleHRlbmRlZCByYW5nZSBmb3IgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggZG9lcyBub3QKLQkJICAgICBwcm92aWRlIGFueSBmdXJ0aGVyIGFsdGVybmF0ZXMsIHNpbmNlIHRob3NlCi0JCSAgICAgYWx0ZXJuYXRlcyBtYXkgaGFuZGxlIG90aGVyIGNhc2VzLiAgUGVvcGxlIHNob3VsZAotCQkgICAgIHVzZSB0aGUgbnVtYmVycyB0aGV5IG1lYW4sIHJhdGhlciB0aGFuIHJlbHlpbmcgb24KLQkJICAgICBhIG15c3RlcmlvdXMgc2lnbiBleHRlbnNpb24uICAqLwotCQkgIG1vcmUgPSAoaW5zbiArIDEgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdICYmCi0JCQkgIHN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSA9PSAwKTsKLQkJICBpZiAobW9yZSkKLQkJICAgIG1heCA9IDB4ODAwMDsKLQkJICBlbHNlCi0JCSAgICBtYXggPSAweDEwMDAwOwotCQkgIGlmICgoYyA9PSAnXDAnICYmIGltbV9leHByLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgICAgfHwgKChpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAtMHg4MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBpbW1fZXhwci5YX2FkZF9udW1iZXIgPj0gbWF4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICAgIHx8IChtb3JlCi0JCQkgICYmIGltbV9leHByLlhfYWRkX251bWJlciA8IDAKLQkJCSAgJiYgbWlwc19vcHRzLmlzYSA+PSAzCi0JCQkgICYmIGltbV9leHByLlhfdW5zaWduZWQKLQkJCSAgJiYgc2l6ZW9mIChpbW1fZXhwci5YX2FkZF9udW1iZXIpIDw9IDQpKQotCQkgICAgewotCQkgICAgICBpZiAobW9yZSkKLQkJCWJyZWFrOwotCQkgICAgICBpZiAoaW1tX2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQkgICYmIGltbV9leHByLlhfb3AgIT0gT19iaWcpCi0JCQlpbnNuX2Vycm9yID0gXygiYWJzb2x1dGUgZXhwcmVzc2lvbiByZXF1aXJlZCIpOwotCQkgICAgICBlbHNlCi0JCQlhc19iYWQgKF8oIjE2IGJpdCBleHByZXNzaW9uIG5vdCBpbiByYW5nZSAtMzI3NjguLjMyNzY3IikpOwotCQkgICAgfQotCQl9Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ28nOgkJLyogMTYgYml0IG9mZnNldCAqLwotCSAgICAgIGMgPSBteV9nZXRTbWFsbEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0KLQkgICAgICAvKiBJZiB0aGlzIHZhbHVlIHdvbid0IGZpdCBpbnRvIGEgMTYgYml0IG9mZnNldCwgdGhlbiBnbwotCQkgZmluZCBhIG1hY3JvIHRoYXQgd2lsbCBnZW5lcmF0ZSB0aGUgMzIgYml0IG9mZnNldAotCQkgY29kZSBwYXR0ZXJuLiAgQXMgYSBzcGVjaWFsIGhhY2ssIHdlIGFjY2VwdCB0aGUKLQkJIGRpZmZlcmVuY2Ugb2YgdHdvIGxvY2FsIHN5bWJvbHMgYXMgYSBjb25zdGFudC4gIFRoaXMKLQkJIGlzIHJlcXVpcmVkIHRvIHN1cHBvc2UgZW1iZWRkZWQgUElDIHN3aXRjaGVzLCB3aGljaAotCQkgdXNlIGFuIGluc3RydWN0aW9uIHdoaWNoIGxvb2tzIGxpa2UKLQkJICAgICBsdyAkNCwkTDEyLSRMUzEyKCQ0KQotCQkgVGhlIHByb2JsZW0gd2l0aCBoYW5kbGluZyB0aGlzIGluIGEgbW9yZSBnZW5lcmFsCi0JCSBmYXNoaW9uIGlzIHRoYXQgdGhlIG1hY3JvIGZ1bmN0aW9uIGRvZXNuJ3QgZXhwZWN0IHRvCi0JCSBzZWUgYW55dGhpbmcgd2hpY2ggY2FuIGJlIGhhbmRsZWQgaW4gYSBzaW5nbGUKLQkJIGNvbnN0YW50IGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoYyA9PSAwCi0JCSAgJiYgKG9mZnNldF9leHByLlhfb3AgIT0gT19jb25zdGFudAotCQkgICAgICB8fCBvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj0gMHg4MDAwCi0JCSAgICAgIHx8IG9mZnNldF9leHByLlhfYWRkX251bWJlciA8IC0weDgwMDApCi0JCSAgJiYgKG1pcHNfcGljICE9IEVNQkVEREVEX1BJQwotCQkgICAgICB8fCBvZmZzZXRfZXhwci5YX29wICE9IE9fc3VidHJhY3QKLQkJICAgICAgfHwgbm93X3NlZyAhPSB0ZXh0X3NlY3Rpb24KLQkJICAgICAgfHwgKFNfR0VUX1NFR01FTlQgKG9mZnNldF9leHByLlhfb3Bfc3ltYm9sKQotCQkJICAhPSB0ZXh0X3NlY3Rpb24pKSkKLQkJYnJlYWs7Ci0KLQkgICAgICBpZiAoYyA9PSAnaCcgfHwgYyA9PSAnSCcpCi0JCXsKLQkJICBpZiAob2Zmc2V0X2V4cHIuWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgYnJlYWs7Ci0JCSAgb2Zmc2V0X2V4cHIuWF9hZGRfbnVtYmVyID0KLQkJICAgIChvZmZzZXRfZXhwci5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQl9Ci0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX0xPMTY7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3AnOgkJLyogcGMgcmVsYXRpdmUgb2Zmc2V0ICovCi0JICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyOwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3UnOgkJLyogdXBwZXIgMTYgYml0cyAqLwotCSAgICAgIGMgPSBteV9nZXRTbWFsbEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX0xPMTY7Ci0JICAgICAgaWYgKGMpCi0JCXsKLQkJICBpZiAoYyAhPSAnbCcpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCQlpbW1fZXhwci5YX2FkZF9udW1iZXIgPQotCQkJICAoaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQkJICAgICAgZWxzZSBpZiAoYyA9PSAnaCcpCi0JCQl7Ci0JCQkgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19ISTE2X1M7Ci0JCQkgIGltbV91bm1hdGNoZWRfaGkgPSB0cnVlOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlpbW1fcmVsb2MgPSBCRkRfUkVMT0NfSEkxNjsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChpbW1fZXhwci5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOwotCQl9Ci0JICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19jb25zdGFudAotCQkgICYmIChpbW1fZXhwci5YX2FkZF9udW1iZXIgPCAwCi0JCSAgICAgIHx8IGltbV9leHByLlhfYWRkX251bWJlciA+PSAweDEwMDAwKSkKLQkJYXNfYmFkIChfKCJsdWkgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgMC4uNjU1MzUiKSk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ2EnOgkJLyogMjYgYml0IGFkZHJlc3MgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBvZmZzZXRfcmVsb2MgPSBCRkRfUkVMT0NfTUlQU19KTVA7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnTic6CQkvKiAzIGJpdCBicmFuY2ggY29uZGl0aW9uIGNvZGUgKi8KLQkgICAgY2FzZSAnTSc6CQkvKiAzIGJpdCBjb21wYXJlIGNvbmRpdGlvbiBjb2RlICovCi0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIkZmNjIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIHJlZ25vID0gMDsKLQkgICAgICBkbwotCQl7Ci0JCSAgcmVnbm8gKj0gMTA7Ci0JCSAgcmVnbm8gKz0gKnMgLSAnMCc7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpOwotCSAgICAgIGlmIChyZWdubyA+IDcpCi0JCWFzX2JhZCAoXygiaW52YWxpZCBjb25kaXRpb24gY29kZSByZWdpc3RlciAkZmNjJWQiKSwgcmVnbm8pOwotCSAgICAgIGlmICgqYXJncyA9PSAnTicpCi0JCWlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBPUF9TSF9CQ0M7Ci0JICAgICAgZWxzZQotCQlpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgT1BfU0hfQ0NDOwotICAgICAgICAgICAgICBjb250aW51ZTsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2JhZCAoXygiYmFkIGNoYXIgPSAnJWMnXG4iKSwgKmFyZ3MpOwotCSAgICAgIGludGVybmFsRXJyb3IgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIC8qIEFyZ3MgZG9uJ3QgbWF0Y2guICAqLwotICAgICAgaWYgKGluc24gKyAxIDwgJm1pcHNfb3Bjb2Rlc1tOVU1PUENPREVTXSAmJgotCSAgIXN0cmNtcCAoaW5zbi0+bmFtZSwgaW5zblsxXS5uYW1lKSkKLQl7Ci0JICArK2luc247Ci0JICBzID0gYXJnc1N0YXJ0OwotCSAgY29udGludWU7Ci0JfQotICAgICAgaW5zbl9lcnJvciA9IF8oImlsbGVnYWwgb3BlcmFuZHMiKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgcm91dGluZSBhc3NlbWJsZXMgYW4gaW5zdHJ1Y3Rpb24gaW50byBpdHMgYmluYXJ5IGZvcm1hdCB3aGVuCi0gICBhc3NlbWJsaW5nIGZvciB0aGUgbWlwczE2LiAgQXMgYSBzaWRlIGVmZmVjdCwgaXQgc2V0cyBvbmUgb2YgdGhlCi0gICBnbG9iYWwgdmFyaWFibGVzIGltbV9yZWxvYyBvciBvZmZzZXRfcmVsb2MgdG8gdGhlIHR5cGUgb2YKLSAgIHJlbG9jYXRpb24gdG8gZG8gaWYgb25lIG9mIHRoZSBvcGVyYW5kcyBpcyBhbiBhZGRyZXNzIGV4cHJlc3Npb24uCi0gICBJdCBhbHNvIHNldHMgbWlwczE2X3NtYWxsIGFuZCBtaXBzMTZfZXh0IGlmIHRoZSB1c2VyIGV4cGxpY2l0bHkKLSAgIHJlcXVlc3RlZCBhIHNtYWxsIG9yIGV4dGVuZGVkIGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLW1pcHMxNl9pcCAoc3RyLCBpcCkKLSAgICAgY2hhciAqc3RyOwotICAgICBzdHJ1Y3QgbWlwc19jbF9pbnNuICppcDsKLXsKLSAgY2hhciAqczsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgc3RydWN0IG1pcHNfb3Bjb2RlICppbnNuOwotICBjaGFyICphcmdzc3RhcnQ7Ci0gIHVuc2lnbmVkIGludCByZWdubzsKLSAgdW5zaWduZWQgaW50IGxhc3RyZWdubyA9IDA7Ci0gIGNoYXIgKnNfcmVzZXQ7Ci0KLSAgaW5zbl9lcnJvciA9IE5VTEw7Ci0KLSAgbWlwczE2X3NtYWxsID0gZmFsc2U7Ci0gIG1pcHMxNl9leHQgPSBmYWxzZTsKLQotICBmb3IgKHMgPSBzdHI7IGlzbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcyk7ICsrcykKLSAgICA7Ci0gIHN3aXRjaCAoKnMpCi0gICAgewotICAgIGNhc2UgJ1wwJzoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnICc6Ci0gICAgICAqcysrID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLic6Ci0gICAgICBpZiAoc1sxXSA9PSAndCcgJiYgc1syXSA9PSAnICcpCi0JewotCSAgKnMgPSAnXDAnOwotCSAgbWlwczE2X3NtYWxsID0gdHJ1ZTsKLQkgIHMgKz0gMzsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKHNbMV0gPT0gJ2UnICYmIHNbMl0gPT0gJyAnKQotCXsKLQkgICpzID0gJ1wwJzsKLQkgIG1pcHMxNl9leHQgPSB0cnVlOwotCSAgcyArPSAzOwotCSAgYnJlYWs7Ci0JfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBkZWZhdWx0OgotICAgICAgaW5zbl9lcnJvciA9IF8oInVua25vd24gb3Bjb2RlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChtaXBzX29wdHMubm9hdXRvZXh0ZW5kICYmICEgbWlwczE2X2V4dCkKLSAgICBtaXBzMTZfc21hbGwgPSB0cnVlOwotCi0gIGlmICgoaW5zbiA9IChzdHJ1Y3QgbWlwc19vcGNvZGUgKikgaGFzaF9maW5kIChtaXBzMTZfb3BfaGFzaCwgc3RyKSkgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnNuX2Vycm9yID0gXygidW5yZWNvZ25pemVkIG9wY29kZSIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhcmdzc3RhcnQgPSBzOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGFzc2VydCAoc3RyY21wIChpbnNuLT5uYW1lLCBzdHIpID09IDApOwotCi0gICAgICBpcC0+aW5zbl9tbyA9IGluc247Ci0gICAgICBpcC0+aW5zbl9vcGNvZGUgPSBpbnNuLT5tYXRjaDsKLSAgICAgIGlwLT51c2VfZXh0ZW5kID0gZmFsc2U7Ci0gICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBpbW1fcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotICAgICAgb2Zmc2V0X2V4cHIuWF9vcCA9IE9fYWJzZW50OwotICAgICAgb2Zmc2V0X3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLSAgICAgIGZvciAoYXJncyA9IGluc24tPmFyZ3M7IDE7ICsrYXJncykKLQl7Ci0JICBpbnQgYzsKLQotCSAgaWYgKCpzID09ICcgJykKLQkgICAgKytzOwotCi0JICAvKiBJbiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQgd2UgY2FsbCBicmVhayBpZiB3ZSBkaWQgbm90IGZpbmQKLSAgICAgICAgICAgICBhIG1hdGNoLCBjb250aW51ZSBpZiB3ZSBkaWQgZmluZCBhIG1hdGNoLCBvciByZXR1cm4gaWYgd2UKLSAgICAgICAgICAgICBhcmUgZG9uZS4gICovCi0KLQkgIGMgPSAqYXJnczsKLQkgIHN3aXRjaCAoYykKLQkgICAgewotCSAgICBjYXNlICdcMCc6Ci0JICAgICAgaWYgKCpzID09ICdcMCcpCi0JCXsKLQkJICAvKiBTdHVmZiB0aGUgaW1tZWRpYXRlIHZhbHVlIGluIG5vdywgaWYgd2UgY2FuLiAgKi8KLQkJICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50Ci0JCSAgICAgICYmIGltbV9yZWxvYyA+IEJGRF9SRUxPQ19VTlVTRUQKLQkJICAgICAgJiYgaW5zbi0+cGluZm8gIT0gSU5TTl9NQUNSTykKLQkJICAgIHsKLQkJICAgICAgbWlwczE2X2ltbWVkICgoY2hhciAqKSBOVUxMLCAwLAotCQkJCSAgICBpbW1fcmVsb2MgLSBCRkRfUkVMT0NfVU5VU0VELAotCQkJCSAgICBpbW1fZXhwci5YX2FkZF9udW1iZXIsIHRydWUsIG1pcHMxNl9zbWFsbCwKLQkJCQkgICAgbWlwczE2X2V4dCwgJmlwLT5pbnNuX29wY29kZSwKLQkJCQkgICAgJmlwLT51c2VfZXh0ZW5kLCAmaXAtPmV4dGVuZCk7Ci0JCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkJICAgICAgaW1tX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkJICAgIH0KLQotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJywnOgotCSAgICAgIGlmICgqcysrID09IGMpCi0JCWNvbnRpbnVlOwotCSAgICAgIHMtLTsKLQkgICAgICBzd2l0Y2ggKCorK2FyZ3MpCi0JCXsKLQkJY2FzZSAndic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWDsKLQkJICBjb250aW51ZTsKLQkJY2FzZSAndyc6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJygnOgotCSAgICBjYXNlICcpJzoKLQkgICAgICBpZiAoKnMrKyA9PSBjKQotCQljb250aW51ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAndyc6Ci0JICAgICAgaWYgKHNbMF0gIT0gJyQnKQotCQl7Ci0JCSAgaWYgKGMgPT0gJ3YnKQotCQkgICAgaXAtPmluc25fb3Bjb2RlIHw9IGxhc3RyZWdubyA8PCBNSVBTMTZPUF9TSF9SWDsKLQkJICBlbHNlCi0JCSAgICBpcC0+aW5zbl9vcGNvZGUgfD0gbGFzdHJlZ25vIDw8IE1JUFMxNk9QX1NIX1JZOwotCQkgICsrYXJnczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JICAgIGNhc2UgJ3gnOgotCSAgICBjYXNlICd5JzoKLQkgICAgY2FzZSAneic6Ci0JICAgIGNhc2UgJ1onOgotCSAgICBjYXNlICcwJzoKLQkgICAgY2FzZSAnUyc6Ci0JICAgIGNhc2UgJ1InOgotCSAgICBjYXNlICdYJzoKLQkgICAgY2FzZSAnWSc6Ci0JICAgICAgaWYgKHNbMF0gIT0gJyQnKQotCQlicmVhazsKLQkgICAgICBzX3Jlc2V0ID0gczsKLQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIHNbMV0pKQotCQl7Ci0JCSAgKytzOwotCQkgIHJlZ25vID0gMDsKLQkJICBkbwotCQkgICAgewotCQkgICAgICByZWdubyAqPSAxMDsKLQkJICAgICAgcmVnbm8gKz0gKnMgLSAnMCc7Ci0JCSAgICAgICsrczsKLQkJICAgIH0KLQkJICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSk7Ci0JCSAgaWYgKHJlZ25vID4gMzEpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoXygiaW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIpLCByZWdubyk7Ci0JCSAgICAgIHJlZ25vID0gMjsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChzWzFdID09ICdmJyAmJiBzWzJdID09ICdwJykKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICByZWdubyA9IEZQOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ3MnICYmIHNbMl0gPT0gJ3AnKQotCQkgICAgewotCQkgICAgICBzICs9IDM7Ci0JCSAgICAgIHJlZ25vID0gU1A7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc1sxXSA9PSAnZycgJiYgc1syXSA9PSAncCcpCi0JCSAgICB7Ci0JCSAgICAgIHMgKz0gMzsKLQkJICAgICAgcmVnbm8gPSBHUDsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzWzFdID09ICdhJyAmJiBzWzJdID09ICd0JykKLQkJICAgIHsKLQkJICAgICAgcyArPSAzOwotCQkgICAgICByZWdubyA9IEFUOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzAnKQotCQkgICAgewotCQkgICAgICBzICs9IDQ7Ci0JCSAgICAgIHJlZ25vID0gS1QwOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNbMV0gPT0gJ2snICYmIHNbMl0gPT0gJ3QnICYmIHNbM10gPT0gJzEnKQotCQkgICAgewotCQkgICAgICBzICs9IDQ7Ci0JCSAgICAgIHJlZ25vID0gS1QxOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQkrK3M7Ci0JICAgICAgaWYgKGFyZ3NbMV0gIT0gKnMpCi0JCXsKLQkJICBpZiAoYyA9PSAndicgfHwgYyA9PSAndycpCi0JCSAgICB7Ci0JCSAgICAgIHJlZ25vID0gbWlwczE2X3RvXzMyX3JlZ19tYXBbbGFzdHJlZ25vXTsKLQkJICAgICAgcyA9IHNfcmVzZXQ7Ci0JCSAgICAgIGFyZ3MrKzsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgc3dpdGNoIChjKQotCQl7Ci0JCWNhc2UgJ3gnOgotCQljYXNlICd5JzoKLQkJY2FzZSAneic6Ci0JCWNhc2UgJ3YnOgotCQljYXNlICd3JzoKLQkJY2FzZSAnWic6Ci0JCSAgcmVnbm8gPSBtaXBzMzJfdG9fMTZfcmVnX21hcFtyZWdub107Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnMCc6Ci0JCSAgaWYgKHJlZ25vICE9IDApCi0JCSAgICByZWdubyA9IElMTEVHQUxfUkVHOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ1MnOgotCQkgIGlmIChyZWdubyAhPSBTUCkKLQkJICAgIHJlZ25vID0gSUxMRUdBTF9SRUc7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUic6Ci0JCSAgaWYgKHJlZ25vICE9IFJBKQotCQkgICAgcmVnbm8gPSBJTExFR0FMX1JFRzsKLQkJICBicmVhazsKLQotCQljYXNlICdYJzoKLQkJY2FzZSAnWSc6Ci0JCSAgaWYgKHJlZ25vID09IEFUICYmICEgbWlwc19vcHRzLm5vYXQpCi0JCSAgICBhc193YXJuIChfKCJ1c2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiKSk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICBpbnRlcm5hbEVycm9yICgpOwotCQl9Ci0KLQkgICAgICBpZiAocmVnbm8gPT0gSUxMRUdBTF9SRUcpCi0JCWJyZWFrOwotCi0JICAgICAgc3dpdGNoIChjKQotCQl7Ci0JCWNhc2UgJ3gnOgotCQljYXNlICd2JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUlg7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3knOgotCQljYXNlICd3JzoKLQkJICBpcC0+aW5zbl9vcGNvZGUgfD0gcmVnbm8gPDwgTUlQUzE2T1BfU0hfUlk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3onOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SWjsKLQkJICBicmVhazsKLQkJY2FzZSAnWic6Ci0JCSAgaXAtPmluc25fb3Bjb2RlIHw9IHJlZ25vIDw8IE1JUFMxNk9QX1NIX01PVkUzMlo7Ci0JCWNhc2UgJzAnOgotCQljYXNlICdTJzoKLQkJY2FzZSAnUic6Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1gnOgotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SRUdSMzI7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1knOgotCQkgIHJlZ25vID0gKChyZWdubyAmIDcpIDw8IDIpIHwgKChyZWdubyAmIDB4MTgpID4+IDMpOwotCQkgIGlwLT5pbnNuX29wY29kZSB8PSByZWdubyA8PCBNSVBTMTZPUF9TSF9SRUczMlI7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgaW50ZXJuYWxFcnJvciAoKTsKLQkJfQotCi0JICAgICAgbGFzdHJlZ25vID0gcmVnbm87Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIkcGMiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnPCc6Ci0JICAgIGNhc2UgJz4nOgotCSAgICBjYXNlICdbJzoKLQkgICAgY2FzZSAnXSc6Ci0JICAgIGNhc2UgJzQnOgotCSAgICBjYXNlICc1JzoKLQkgICAgY2FzZSAnSCc6Ci0JICAgIGNhc2UgJ1cnOgotCSAgICBjYXNlICdEJzoKLQkgICAgY2FzZSAnaic6Ci0JICAgIGNhc2UgJzgnOgotCSAgICBjYXNlICdWJzoKLQkgICAgY2FzZSAnQyc6Ci0JICAgIGNhc2UgJ1UnOgotCSAgICBjYXNlICdrJzoKLQkgICAgY2FzZSAnSyc6Ci0JICAgICAgaWYgKHNbMF0gPT0gJyUnCi0JCSAgJiYgc3RybmNtcCAocyArIDEsICJncHJlbCgiLCBzaXplb2YgImdwcmVsKCIgLSAxKSA9PSAwKQotCQl7Ci0JCSAgLyogVGhpcyBpcyAlZ3ByZWwoU1lNQk9MKS4gIFdlIG5lZWQgdG8gcmVhZCBTWU1CT0wsCi0gICAgICAgICAgICAgICAgICAgICBhbmQgZ2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIHJlbG9jLiAgSWYgdGhlIHRleHQKLSAgICAgICAgICAgICAgICAgICAgIGluc2lkZSAlZ3ByZWwgaXMgbm90IGEgc3ltYm9sIG5hbWUgd2l0aCBhbgotICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgb2Zmc2V0LCB0aGVuIHdlIGdlbmVyYXRlIGEgbm9ybWFsIHJlbG9jCi0gICAgICAgICAgICAgICAgICAgICBhbmQgd2lsbCBwcm9iYWJseSBmYWlsIGxhdGVyLiAgKi8KLQkJICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMgKyBzaXplb2YgIiVncHJlbCIgLSAxKTsKLQkJICBpZiAoaW1tX2V4cHIuWF9vcCA9PSBPX3N5bWJvbCkKLQkJICAgIHsKLQkJICAgICAgbWlwczE2X2V4dCA9IHRydWU7Ci0JCSAgICAgIGltbV9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw7Ci0JCSAgICAgIHMgPSBleHByX2VuZDsKLQkJICAgICAgaXAtPnVzZV9leHRlbmQgPSB0cnVlOwotCQkgICAgICBpcC0+ZXh0ZW5kID0gMDsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBKdXN0IHBpY2sgdXAgYSBub3JtYWwgZXhwcmVzc2lvbi4gICovCi0JCSAgbXlfZ2V0RXhwcmVzc2lvbiAoJmltbV9leHByLCBzKTsKLQkJfQotCi0JICAgICAgaWYgKGltbV9leHByLlhfb3AgPT0gT19yZWdpc3RlcikKLQkJewotCQkgIC8qIFdoYXQgd2UgdGhvdWdodCB3YXMgYW4gZXhwcmVzc2lvbiB0dXJuZWQgb3V0IHRvCi0gICAgICAgICAgICAgICAgICAgICBiZSBhIHJlZ2lzdGVyLiAgKi8KLQotCQkgIGlmIChzWzBdID09ICcoJyAmJiBhcmdzWzFdID09ICcoJykKLQkJICAgIHsKLQkJICAgICAgLyogSXQgbG9va3MgbGlrZSB0aGUgZXhwcmVzc2lvbiB3YXMgb21pdHRlZAotCQkJIGJlZm9yZSBhIHJlZ2lzdGVyIGluZGlyZWN0aW9uLCB3aGljaCBtZWFucwotCQkJIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgaW1wbGljaXRseSB6ZXJvLiAgV2UKLQkJCSBzdGlsbCBzZXQgdXAgaW1tX2V4cHIsIHNvIHRoYXQgd2UgaGFuZGxlCi0JCQkgZXhwbGljaXQgZXh0ZW5zaW9ucyBjb3JyZWN0bHkuICAqLwotCQkgICAgICBpbW1fZXhwci5YX29wID0gT19jb25zdGFudDsKLQkJICAgICAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID0gMDsKLQkJICAgICAgaW1tX3JlbG9jID0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCi0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gcmVsYXggdGhpcyBpbnN0cnVjdGlvbi4gICovCi0JICAgICAgaW1tX3JlbG9jID0gKGludCkgQkZEX1JFTE9DX1VOVVNFRCArIGM7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3AnOgotCSAgICBjYXNlICdxJzoKLQkgICAgY2FzZSAnQSc6Ci0JICAgIGNhc2UgJ0InOgotCSAgICBjYXNlICdFJzoKLQkgICAgICAvKiBXZSB1c2Ugb2Zmc2V0X3JlbG9jIHJhdGhlciB0aGFuIGltbV9yZWxvYyBmb3IgdGhlIFBDCi0gICAgICAgICAgICAgICAgIHJlbGF0aXZlIG9wZXJhbmRzLiAgVGhpcyBsZXRzIG1hY3JvcyB3aXRoIGJvdGgKLSAgICAgICAgICAgICAgICAgaW1tZWRpYXRlIGFuZCBhZGRyZXNzIG9wZXJhbmRzIHdvcmsgY29ycmVjdGx5LiAgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmb2Zmc2V0X2V4cHIsIHMpOwotCi0JICAgICAgaWYgKG9mZnNldF9leHByLlhfb3AgPT0gT19yZWdpc3RlcikKLQkJYnJlYWs7Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIHJlbGF4IHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIG9mZnNldF9yZWxvYyA9IChpbnQpIEJGRF9SRUxPQ19VTlVTRUQgKyBjOwotCSAgICAgIHMgPSBleHByX2VuZDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICc2JzoJCS8qIGJyZWFrIGNvZGUgKi8KLQkgICAgICBteV9nZXRFeHByZXNzaW9uICgmaW1tX2V4cHIsIHMpOwotCSAgICAgIGNoZWNrX2Fic29sdXRlX2V4cHIgKGlwLCAmaW1tX2V4cHIpOwotCSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgaW1tX2V4cHIuWF9hZGRfbnVtYmVyID4gNjMpCi0JCXsKLQkJICBhc193YXJuIChfKCJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIiksCi0JCQkgICBpcC0+aW5zbl9tby0+bmFtZSwKLQkJCSAgICh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIpOwotCQkgIGltbV9leHByLlhfYWRkX251bWJlciAmPSAweDNmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlciA8PCBNSVBTMTZPUF9TSF9JTU02OwotCSAgICAgIGltbV9leHByLlhfb3AgPSBPX2Fic2VudDsKLQkgICAgICBzID0gZXhwcl9lbmQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYSc6CQkvKiAyNiBiaXQgYWRkcmVzcyAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZvZmZzZXRfZXhwciwgcyk7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIG9mZnNldF9yZWxvYyA9IEJGRF9SRUxPQ19NSVBTMTZfSk1QOwotCSAgICAgIGlwLT5pbnNuX29wY29kZSA8PD0gMTY7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnbCc6CQkvKiByZWdpc3RlciBsaXN0IGZvciBlbnRyeSBtYWNybyAqLwotCSAgICBjYXNlICdMJzoJCS8qIHJlZ2lzdGVyIGxpc3QgZm9yIGV4aXQgbWFjcm8gKi8KLQkgICAgICB7Ci0JCWludCBtYXNrOwotCi0JCWlmIChjID09ICdsJykKLQkJICBtYXNrID0gMDsKLQkJZWxzZQotCQkgIG1hc2sgPSA3IDw8IDM7Ci0JCXdoaWxlICgqcyAhPSAnXDAnKQotCQkgIHsKLQkJICAgIGludCBmcmVnLCByZWcxLCByZWcyOwotCi0JCSAgICB3aGlsZSAoKnMgPT0gJyAnIHx8ICpzID09ICcsJykKLQkJICAgICAgKytzOwotCQkgICAgaWYgKCpzICE9ICckJykKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJjYW4ndCBwYXJzZSByZWdpc3RlciBsaXN0IikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICAgICsrczsKLQkJICAgIGlmICgqcyAhPSAnZicpCi0JCSAgICAgIGZyZWcgPSAwOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlmcmVnID0gMTsKLQkJCSsrczsKLQkJICAgICAgfQotCQkgICAgcmVnMSA9IDA7Ci0JCSAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgICAgewotCQkJcmVnMSAqPSAxMDsKLQkJCXJlZzEgKz0gKnMgLSAnMCc7Ci0JCQkrK3M7Ci0JCSAgICAgIH0KLQkJICAgIGlmICgqcyA9PSAnICcpCi0JCSAgICAgICsrczsKLQkJICAgIGlmICgqcyAhPSAnLScpCi0JCSAgICAgIHJlZzIgPSByZWcxOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQkrK3M7Ci0JCQlpZiAoKnMgIT0gJyQnKQotCQkJICBicmVhazsKLQkJCSsrczsKLQkJCWlmIChmcmVnKQotCQkJICB7Ci0JCQkgICAgaWYgKCpzID09ICdmJykKLQkJCSAgICAgICsrczsKLQkJCSAgICBlbHNlCi0JCQkgICAgICB7Ci0JCQkJYXNfYmFkIChfKCJpbnZhbGlkIHJlZ2lzdGVyIGxpc3QiKSk7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICB9Ci0JCQkgIH0KLQkJCXJlZzIgPSAwOwotCQkJd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCQkgIHsKLQkJCSAgICByZWcyICo9IDEwOwotCQkJICAgIHJlZzIgKz0gKnMgLSAnMCc7Ci0JCQkgICAgKytzOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGlmIChmcmVnICYmIHJlZzEgPT0gMCAmJiByZWcyID09IDAgJiYgYyA9PSAnTCcpCi0JCSAgICAgIHsKLQkJCW1hc2sgJj0gfiAoNyA8PCAzKTsKLQkJCW1hc2sgfD0gNSA8PCAzOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChmcmVnICYmIHJlZzEgPT0gMCAmJiByZWcyID09IDEgJiYgYyA9PSAnTCcpCi0JCSAgICAgIHsKLQkJCW1hc2sgJj0gfiAoNyA8PCAzKTsKLQkJCW1hc2sgfD0gNiA8PCAzOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmIChyZWcxID09IDQgJiYgcmVnMiA+PSA0ICYmIHJlZzIgPD0gNyAmJiBjICE9ICdMJykKLQkJICAgICAgbWFzayB8PSAocmVnMiAtIDMpIDw8IDM7Ci0JCSAgICBlbHNlIGlmIChyZWcxID09IDE2ICYmIHJlZzIgPj0gMTYgJiYgcmVnMiA8PSAxNykKLQkJICAgICAgbWFzayB8PSAocmVnMiAtIDE1KSA8PCAxOwotCQkgICAgZWxzZSBpZiAocmVnMSA9PSAzMSAmJiByZWcyID09IDMxKQotCQkgICAgICBtYXNrIHw9IDE7Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiaW52YWxpZCByZWdpc3RlciBsaXN0IikpOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCS8qIFRoZSBtYXNrIGlzIGZpbGxlZCBpbiBpbiB0aGUgb3Bjb2RlIHRhYmxlIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICBiZW5lZml0IG9mIHRoZSBkaXNhc3NlbWJsZXIuICBXZSByZW1vdmUgaXQgYmVmb3JlCi0gICAgICAgICAgICAgICAgICAgYXBwbHlpbmcgdGhlIGFjdHVhbCBtYXNrLiAgKi8KLQkJaXAtPmluc25fb3Bjb2RlICY9IH4gKCg3IDw8IDMpIDw8IE1JUFMxNk9QX1NIX0lNTTYpOwotCQlpcC0+aW5zbl9vcGNvZGUgfD0gbWFzayA8PCBNSVBTMTZPUF9TSF9JTU02OwotCSAgICAgIH0KLQkgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnZSc6CQkvKiBleHRlbmQgY29kZSAqLwotCSAgICAgIG15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JICAgICAgY2hlY2tfYWJzb2x1dGVfZXhwciAoaXAsICZpbW1fZXhwcik7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCBsb25nKSBpbW1fZXhwci5YX2FkZF9udW1iZXIgPiAweDdmZikKLQkJewotCQkgIGFzX3dhcm4gKF8oIkludmFsaWQgdmFsdWUgZm9yIGAlcycgKCVsdSkiKSwKLQkJCSAgIGlwLT5pbnNuX21vLT5uYW1lLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIGltbV9leHByLlhfYWRkX251bWJlcik7Ci0JCSAgaW1tX2V4cHIuWF9hZGRfbnVtYmVyICY9IDB4N2ZmOwotCQl9Ci0JICAgICAgaXAtPmluc25fb3Bjb2RlIHw9IGltbV9leHByLlhfYWRkX251bWJlcjsKLQkgICAgICBpbW1fZXhwci5YX29wID0gT19hYnNlbnQ7Ci0JICAgICAgcyA9IGV4cHJfZW5kOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotCi0gICAgICAvKiBBcmdzIGRvbid0IG1hdGNoLiAgKi8KLSAgICAgIGlmIChpbnNuICsgMSA8ICZtaXBzMTZfb3Bjb2Rlc1tiZmRfbWlwczE2X251bV9vcGNvZGVzXSAmJgotCSAgc3RyY21wIChpbnNuLT5uYW1lLCBpbnNuWzFdLm5hbWUpID09IDApCi0JewotCSAgKytpbnNuOwotCSAgcyA9IGFyZ3NzdGFydDsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaW5zbl9lcnJvciA9IF8oImlsbGVnYWwgb3BlcmFuZHMiKTsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gd2Uga25vdyBhYm91dCBhIG1pcHMxNiBpbW1lZGlhdGUKLSAgIGFyZ3VtZW50IHR5cGUuICAqLwotCi1zdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQKLXsKLSAgLyogVGhlIHR5cGUgY29kZSB1c2VkIGluIHRoZSBhcmd1bWVudCBzdHJpbmcgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIGludCB0eXBlOwotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHNob3J0IGZvcm0gb2YgdGhlIG9wY29kZS4gICovCi0gIGludCBuYml0czsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBleHRlbmRlZCBmb3JtIG9mIHRoZSBvcGNvZGUuICAqLwotICBpbnQgZXh0Yml0czsKLSAgLyogVGhlIGFtb3VudCBieSB3aGljaCB0aGUgc2hvcnQgZm9ybSBpcyBzaGlmdGVkIHdoZW4gaXQgaXMgdXNlZDsKLSAgICAgZm9yIGV4YW1wbGUsIHRoZSBzdyBpbnN0cnVjdGlvbiBoYXMgYSBzaGlmdCBjb3VudCBvZiAyLiAgKi8KLSAgaW50IHNoaWZ0OwotICAvKiBUaGUgYW1vdW50IGJ5IHdoaWNoIHRoZSBzaG9ydCBmb3JtIGlzIHNoaWZ0ZWQgd2hlbiBpdCBpcyBzdG9yZWQKLSAgICAgaW50byB0aGUgaW5zdHJ1Y3Rpb24gY29kZS4gICovCi0gIGludCBvcF9zaGlmdDsKLSAgLyogTm9uLXplcm8gaWYgdGhlIHNob3J0IGZvcm0gaXMgdW5zaWduZWQuICAqLwotICBpbnQgdW5zcDsKLSAgLyogTm9uLXplcm8gaWYgdGhlIGV4dGVuZGVkIGZvcm0gaXMgdW5zaWduZWQuICAqLwotICBpbnQgZXh0dTsKLSAgLyogTm9uLXplcm8gaWYgdGhlIHZhbHVlIGlzIFBDIHJlbGF0aXZlLiAgKi8KLSAgaW50IHBjcmVsOwotfTsKLQotLyogVGhlIG1pcHMxNiBpbW1lZGlhdGUgb3BlcmFuZCB0eXBlcy4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQgbWlwczE2X2ltbWVkX29wZXJhbmRzW10gPQotewotICB7ICc8JywgIDMsICA1LCAwLCBNSVBTMTZPUF9TSF9SWiwgICAxLCAxLCAwIH0sCi0gIHsgJz4nLCAgMywgIDUsIDAsIE1JUFMxNk9QX1NIX1JYLCAgIDEsIDEsIDAgfSwKLSAgeyAnWycsICAzLCAgNiwgMCwgTUlQUzE2T1BfU0hfUlosICAgMSwgMSwgMCB9LAotICB7ICddJywgIDMsICA2LCAwLCBNSVBTMTZPUF9TSF9SWCwgICAxLCAxLCAwIH0sCi0gIHsgJzQnLCAgNCwgMTUsIDAsIE1JUFMxNk9QX1NIX0lNTTQsIDAsIDAsIDAgfSwKLSAgeyAnNScsICA1LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMCB9LAotICB7ICdIJywgIDUsIDE2LCAxLCBNSVBTMTZPUF9TSF9JTU01LCAxLCAwLCAwIH0sCi0gIHsgJ1cnLCAgNSwgMTYsIDIsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDAgfSwKLSAgeyAnRCcsICA1LCAxNiwgMywgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMCB9LAotICB7ICdqJywgIDUsIDE2LCAwLCBNSVBTMTZPUF9TSF9JTU01LCAwLCAwLCAwIH0sCi0gIHsgJzgnLCAgOCwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDAsIDAgfSwKLSAgeyAnVicsICA4LCAxNiwgMiwgTUlQUzE2T1BfU0hfSU1NOCwgMSwgMCwgMCB9LAotICB7ICdDJywgIDgsIDE2LCAzLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAwLCAwIH0sCi0gIHsgJ1UnLCAgOCwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTgsIDEsIDEsIDAgfSwKLSAgeyAnaycsICA4LCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMCwgMCwgMCB9LAotICB7ICdLJywgIDgsIDE2LCAzLCBNSVBTMTZPUF9TSF9JTU04LCAwLCAwLCAwIH0sCi0gIHsgJ3AnLCAgOCwgMTYsIDAsIE1JUFMxNk9QX1NIX0lNTTgsIDAsIDAsIDEgfSwKLSAgeyAncScsIDExLCAxNiwgMCwgTUlQUzE2T1BfU0hfSU1NOCwgMCwgMCwgMSB9LAotICB7ICdBJywgIDgsIDE2LCAyLCBNSVBTMTZPUF9TSF9JTU04LCAxLCAwLCAxIH0sCi0gIHsgJ0InLCAgNSwgMTYsIDMsIE1JUFMxNk9QX1NIX0lNTTUsIDEsIDAsIDEgfSwKLSAgeyAnRScsICA1LCAxNiwgMiwgTUlQUzE2T1BfU0hfSU1NNSwgMSwgMCwgMSB9Ci19OwotCi0jZGVmaW5lIE1JUFMxNl9OVU1fSU1NRUQgXAotICAoc2l6ZW9mIG1pcHMxNl9pbW1lZF9vcGVyYW5kcyAvIHNpemVvZiBtaXBzMTZfaW1tZWRfb3BlcmFuZHNbMF0pCi0KLS8qIEhhbmRsZSBhIG1pcHMxNiBpbnN0cnVjdGlvbiB3aXRoIGFuIGltbWVkaWF0ZSB2YWx1ZS4gIFRoaXMgb3IncyB0aGUKLSAgIHNtYWxsIGltbWVkaWF0ZSB2YWx1ZSBpbnRvICpJTlNOLiAgSXQgc2V0cyAqVVNFX0VYVEVORCB0byBpbmRpY2F0ZQotICAgd2hldGhlciBhbiBleHRlbmRlZCB2YWx1ZSBpcyBuZWVkZWQ7IGlmIG9uZSBpcyBuZWVkZWQsIGl0IHNldHMKLSAgICpFWFRFTkQgdG8gdGhlIHZhbHVlLiAgVGhlIGFyZ3VtZW50IHR5cGUgaXMgVFlQRS4gIFRoZSB2YWx1ZSBpcyBWQUwuCi0gICBJZiBTTUFMTCBpcyB0cnVlLCBhbiB1bmV4dGVuZGVkIG9wY29kZSB3YXMgZXhwbGljaXRseSByZXF1ZXN0ZWQuCi0gICBJZiBFWFQgaXMgdHJ1ZSwgYW4gZXh0ZW5kZWQgb3Bjb2RlIHdhcyBleHBsaWNpdGx5IHJlcXVlc3RlZC4gIElmCi0gICBXQVJOIGlzIHRydWUsIHdhcm4gaWYgRVhUIGRvZXMgbm90IG1hdGNoIHJlYWxpdHkuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwczE2X2ltbWVkIChmaWxlLCBsaW5lLCB0eXBlLCB2YWwsIHdhcm4sIHNtYWxsLCBleHQsIGluc24sIHVzZV9leHRlbmQsCi0JICAgICAgZXh0ZW5kKQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgaW50IHR5cGU7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBib29sZWFuIHdhcm47Ci0gICAgIGJvb2xlYW4gc21hbGw7Ci0gICAgIGJvb2xlYW4gZXh0OwotICAgICB1bnNpZ25lZCBsb25nICppbnNuOwotICAgICBib29sZWFuICp1c2VfZXh0ZW5kOwotICAgICB1bnNpZ25lZCBzaG9ydCAqZXh0ZW5kOwotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgbWlwczE2X2ltbWVkX29wZXJhbmQgKm9wOwotICBpbnQgbWludGlueSwgbWF4dGlueTsKLSAgYm9vbGVhbiBuZWVkZXh0OwotCi0gIG9wID0gbWlwczE2X2ltbWVkX29wZXJhbmRzOwotICB3aGlsZSAob3AtPnR5cGUgIT0gdHlwZSkKLSAgICB7Ci0gICAgICArK29wOwotICAgICAgYXNzZXJ0IChvcCA8IG1pcHMxNl9pbW1lZF9vcGVyYW5kcyArIE1JUFMxNl9OVU1fSU1NRUQpOwotICAgIH0KLQotICBpZiAob3AtPnVuc3ApCi0gICAgewotICAgICAgaWYgKHR5cGUgPT0gJzwnIHx8IHR5cGUgPT0gJz4nIHx8IHR5cGUgPT0gJ1snIHx8IHR5cGUgPT0gJ10nKQotCXsKLQkgIG1pbnRpbnkgPSAxOwotCSAgbWF4dGlueSA9IDEgPDwgb3AtPm5iaXRzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBtaW50aW55ID0gMDsKLQkgIG1heHRpbnkgPSAoMSA8PCBvcC0+bmJpdHMpIC0gMTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWludGlueSA9IC0gKDEgPDwgKG9wLT5uYml0cyAtIDEpKTsKLSAgICAgIG1heHRpbnkgPSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpIC0gMTsKLSAgICB9Ci0KLSAgLyogQnJhbmNoIG9mZnNldHMgaGF2ZSBhbiBpbXBsaWNpdCAwIGluIHRoZSBsb3dlc3QgYml0LiAgKi8KLSAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotICAgIHZhbCAvPSAyOwotCi0gIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMAotICAgICAgfHwgdmFsIDwgKG1pbnRpbnkgPDwgb3AtPnNoaWZ0KQotICAgICAgfHwgdmFsID4gKG1heHRpbnkgPDwgb3AtPnNoaWZ0KSkKLSAgICBuZWVkZXh0ID0gdHJ1ZTsKLSAgZWxzZQotICAgIG5lZWRleHQgPSBmYWxzZTsKLQotICBpZiAod2FybiAmJiBleHQgJiYgISBuZWVkZXh0KQotICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIF8oImV4dGVuZGVkIG9wZXJhbmQgcmVxdWVzdGVkIGJ1dCBub3QgcmVxdWlyZWQiKSk7Ci0gIGlmIChzbWFsbCAmJiBuZWVkZXh0KQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgXygiaW52YWxpZCB1bmV4dGVuZGVkIG9wZXJhbmQgdmFsdWUiKSk7Ci0KLSAgaWYgKHNtYWxsIHx8ICghIGV4dCAmJiAhIG5lZWRleHQpKQotICAgIHsKLSAgICAgIGludCBpbnNudmFsOwotCi0gICAgICAqdXNlX2V4dGVuZCA9IGZhbHNlOwotICAgICAgaW5zbnZhbCA9ICgodmFsID4+IG9wLT5zaGlmdCkgJiAoKDEgPDwgb3AtPm5iaXRzKSAtIDEpKTsKLSAgICAgIGluc252YWwgPDw9IG9wLT5vcF9zaGlmdDsKLSAgICAgICppbnNuIHw9IGluc252YWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBtaW5leHQsIG1heGV4dDsKLSAgICAgIGludCBleHR2YWw7Ci0KLSAgICAgIGlmIChvcC0+ZXh0dSkKLQl7Ci0JICBtaW5leHQgPSAwOwotCSAgbWF4ZXh0ID0gKDEgPDwgb3AtPmV4dGJpdHMpIC0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWluZXh0ID0gLSAoMSA8PCAob3AtPmV4dGJpdHMgLSAxKSk7Ci0JICBtYXhleHQgPSAoMSA8PCAob3AtPmV4dGJpdHMgLSAxKSkgLSAxOwotCX0KLSAgICAgIGlmICh2YWwgPCBtaW5leHQgfHwgdmFsID4gbWF4ZXh0KQotCWFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJICAgICAgXygib3BlcmFuZCB2YWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIGluc3RydWN0aW9uIikpOwotCi0gICAgICAqdXNlX2V4dGVuZCA9IHRydWU7Ci0gICAgICBpZiAob3AtPmV4dGJpdHMgPT0gMTYpCi0JewotCSAgZXh0dmFsID0gKCh2YWwgPj4gMTEpICYgMHgxZikgfCAodmFsICYgMHg3ZTApOwotCSAgdmFsICY9IDB4MWY7Ci0JfQotICAgICAgZWxzZSBpZiAob3AtPmV4dGJpdHMgPT0gMTUpCi0JewotCSAgZXh0dmFsID0gKCh2YWwgPj4gMTEpICYgMHhmKSB8ICh2YWwgJiAweDdmMCk7Ci0JICB2YWwgJj0gMHhmOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHR2YWwgPSAoKHZhbCAmIDB4MWYpIDw8IDYpIHwgKHZhbCAmIDB4MjApOwotCSAgdmFsID0gMDsKLQl9Ci0KLSAgICAgICpleHRlbmQgPSAodW5zaWduZWQgc2hvcnQpIGV4dHZhbDsKLSAgICAgICppbnNuIHw9IHZhbDsKLSAgICB9Ci19Ci0MCi0jZGVmaW5lIExQICcoJwotI2RlZmluZSBSUCAnKScKLQotc3RhdGljIGludAotbXlfZ2V0U21hbGxFeHByZXNzaW9uIChlcCwgc3RyKQotICAgICBleHByZXNzaW9uUyAqZXA7Ci0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc3A7Ci0gIGludCBjID0gMDsKLQotICBpZiAoKnN0ciA9PSAnICcpCi0gICAgc3RyKys7Ci0gIGlmICgqc3RyID09IExQCi0gICAgICB8fCAoKnN0ciA9PSAnJScgJiYKLQkgICgoc3RyWzFdID09ICdoJyAmJiBzdHJbMl0gPT0gJ2knKQotCSAgIHx8IChzdHJbMV0gPT0gJ0gnICYmIHN0clsyXSA9PSAnSScpCi0JICAgfHwgKHN0clsxXSA9PSAnbCcgJiYgc3RyWzJdID09ICdvJykpCi0JICAmJiBzdHJbM10gPT0gTFApKQotICAgIHsKLSAgICAgIGlmICgqc3RyID09IExQKQotCWMgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGMgPSBzdHJbMV07Ci0JICBzdHIgKz0gMzsKLQl9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBBIHNtYWxsIGV4cHJlc3Npb24gbWF5IGJlIGZvbGxvd2VkIGJ5IGEgYmFzZSByZWdpc3Rlci4KLSAgICAgICAqIFNjYW4gdG8gdGhlIGVuZCBvZiB0aGlzIG9wZXJhbmQsIGFuZCB0aGVuIGJhY2sgb3ZlciBhIHBvc3NpYmxlCi0gICAgICAgKiBiYXNlIHJlZ2lzdGVyLiAgVGhlbiBzY2FuIHRoZSBzbWFsbCBleHByZXNzaW9uIHVwIHRvIHRoYXQKLSAgICAgICAqIHBvaW50LiAgKEJhc2VkIG9uIGNvZGUgaW4gc3BhcmMuYy4uLikKLSAgICAgICAqLwotICAgICAgZm9yIChzcCA9IHN0cjsgKnNwICYmICpzcCAhPSAnLCc7IHNwKyspCi0JOwotICAgICAgaWYgKHNwIC0gNCA+PSBzdHIgJiYgc3BbLTFdID09IFJQKQotCXsKLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc3BbLTJdKSkKLQkgICAgewotCSAgICAgIGZvciAoc3AgLT0gMzsgc3AgPj0gc3RyICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqc3ApOyBzcC0tKQotCQk7Ci0JICAgICAgaWYgKCpzcCA9PSAnJCcgJiYgc3AgPiBzdHIgJiYgc3BbLTFdID09IExQKQotCQl7Ci0JCSAgc3AtLTsKLQkJICBnb3RvIGRvX2l0OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNwIC0gNSA+PSBzdHIKLQkJICAgJiYgc3BbLTVdID09IExQCi0JCSAgICYmIHNwWy00XSA9PSAnJCcKLQkJICAgJiYgKChzcFstM10gPT0gJ2YnICYmIHNwWy0yXSA9PSAncCcpCi0JCSAgICAgICB8fCAoc3BbLTNdID09ICdzJyAmJiBzcFstMl0gPT0gJ3AnKQotCQkgICAgICAgfHwgKHNwWy0zXSA9PSAnZycgJiYgc3BbLTJdID09ICdwJykKLQkJICAgICAgIHx8IChzcFstM10gPT0gJ2EnICYmIHNwWy0yXSA9PSAndCcpKSkKLQkgICAgewotCSAgICAgIHNwIC09IDU7Ci0JICAgIGRvX2l0OgotCSAgICAgIGlmIChzcCA9PSBzdHIpCi0JCXsKLQkJICAvKiBubyBleHByZXNzaW9uIG1lYW5zIHplcm8gb2Zmc2V0ICovCi0JCSAgaWYgKGMpCi0JCSAgICB7Ci0JCSAgICAgIC8qICV4eChyZWcpIGlzIGFuIGVycm9yICovCi0JCSAgICAgIGVwLT5YX29wID0gT19hYnNlbnQ7Ci0JCSAgICAgIGV4cHJfZW5kID0gc3RyIC0gMzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGVwLT5YX29wID0gT19jb25zdGFudDsKLQkJICAgICAgZXhwcl9lbmQgPSBzcDsKLQkJICAgIH0KLQkJICBlcC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLQkJICBlcC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotCQkgIGVwLT5YX2FkZF9udW1iZXIgPSAwOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgKnNwID0gJ1wwJzsKLQkJICBteV9nZXRFeHByZXNzaW9uIChlcCwgc3RyKTsKLQkJICAqc3AgPSBMUDsKLQkJfQotCSAgICAgIHJldHVybiBjOwotCSAgICB9Ci0JfQotICAgIH0KLSAgbXlfZ2V0RXhwcmVzc2lvbiAoZXAsIHN0cik7Ci0gIHJldHVybiBjOwkJCS8qID0+ICVoaSBvciAlbG8gZW5jb3VudGVyZWQgKi8KLX0KLQotc3RhdGljIHZvaWQKLW15X2dldEV4cHJlc3Npb24gKGVwLCBzdHIpCi0gICAgIGV4cHJlc3Npb25TICplcDsKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzYXZlX2luOwotCi0gIHNhdmVfaW4gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLSAgZXhwcmVzc2lvbiAoZXApOwotICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbjsKLQotICAvKiBJZiB3ZSBhcmUgaW4gbWlwczE2IG1vZGUsIGFuZCB0aGlzIGlzIGFuIGV4cHJlc3Npb24gYmFzZWQgb24gYC4nLAotICAgICB0aGVuIHdlIGJ1bXAgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYnkgMSBzaW5jZSB0aGF0IGlzIGhvdyBvdGhlcgotICAgICB0ZXh0IHN5bWJvbHMgYXJlIGhhbmRsZWQuICBXZSBkb24ndCBib3RoZXIgdG8gaGFuZGxlIGNvbXBsZXgKLSAgICAgZXhwcmVzc2lvbnMsIGp1c3QgYC4nIHBsdXMgb3IgbWludXMgYSBjb25zdGFudC4gICovCi0gIGlmIChtaXBzX29wdHMubWlwczE2Ci0gICAgICAmJiBlcC0+WF9vcCA9PSBPX3N5bWJvbAotICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChlcC0+WF9hZGRfc3ltYm9sKSwgRkFLRV9MQUJFTF9OQU1FKSA9PSAwCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChlcC0+WF9hZGRfc3ltYm9sKSA9PSBub3dfc2VnCi0gICAgICAmJiBzeW1ib2xfZ2V0X2ZyYWcgKGVwLT5YX2FkZF9zeW1ib2wpID09IGZyYWdfbm93Ci0gICAgICAmJiBzeW1ib2xfY29uc3RhbnRfcCAoZXAtPlhfYWRkX3N5bWJvbCkKLSAgICAgICYmIFNfR0VUX1ZBTFVFIChlcC0+WF9hZGRfc3ltYm9sKSA9PSBmcmFnX25vd19maXggKCkpCi0gICAgU19TRVRfVkFMVUUgKGVwLT5YX2FkZF9zeW1ib2wsIFNfR0VUX1ZBTFVFIChlcC0+WF9hZGRfc3ltYm9sKSArIDEpOwotfQotCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0UC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVQIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplUCA9IHByZWMgKiAyOwotCi0gIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHsKLSAgICAgIGZvciAoaSA9IHByZWMgLSAxOyBpID49IDA7IGktLSkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCAyKTsKLQkgIGxpdFAgKz0gMjsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiTzo6Zzo6RzoiOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0jZGVmaW5lIE9QVElPTl9NSVBTMSAoT1BUSU9OX01EX0JBU0UgKyAxKQotICB7Im1pcHMwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSVBTMX0sCi0gIHsibWlwczEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMxfSwKLSNkZWZpbmUgT1BUSU9OX01JUFMyIChPUFRJT05fTURfQkFTRSArIDIpCi0gIHsibWlwczIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMyfSwKLSNkZWZpbmUgT1BUSU9OX01JUFMzIChPUFRJT05fTURfQkFTRSArIDMpCi0gIHsibWlwczMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFMzfSwKLSNkZWZpbmUgT1BUSU9OX01JUFM0IChPUFRJT05fTURfQkFTRSArIDQpCi0gIHsibWlwczQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JUFM0fSwKLSNkZWZpbmUgT1BUSU9OX01DUFUgKE9QVElPTl9NRF9CQVNFICsgNSkKLSAgeyJtY3B1IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQ1BVfSwKLSNkZWZpbmUgT1BUSU9OX01FTUJFRERFRF9QSUMgKE9QVElPTl9NRF9CQVNFICsgNikKLSAgeyJtZW1iZWRkZWQtcGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NRU1CRURERURfUElDfSwKLSNkZWZpbmUgT1BUSU9OX1RSQVAgKE9QVElPTl9NRF9CQVNFICsgOSkKLSAgeyJ0cmFwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFQfSwKLSAgeyJuby1icmVhayIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFJBUH0sCi0jZGVmaW5lIE9QVElPTl9CUkVBSyAoT1BUSU9OX01EX0JBU0UgKyAxMCkKLSAgeyJicmVhayIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQlJFQUt9LAotICB7Im5vLXRyYXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JSRUFLfSwKLSNkZWZpbmUgT1BUSU9OX0VCIChPUFRJT05fTURfQkFTRSArIDExKQotICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FQn0sCi0jZGVmaW5lIE9QVElPTl9FTCAoT1BUSU9OX01EX0JBU0UgKyAxMikKLSAgeyJFTCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRUx9LAotI2RlZmluZSBPUFRJT05fTTQ2NTAgKE9QVElPTl9NRF9CQVNFICsgMTMpCi0gIHsibTQ2NTAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX000NjUwfSwKLSNkZWZpbmUgT1BUSU9OX05PX000NjUwIChPUFRJT05fTURfQkFTRSArIDE0KQotICB7Im5vLW00NjUwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19NNDY1MH0sCi0jZGVmaW5lIE9QVElPTl9NNDAxMCAoT1BUSU9OX01EX0JBU0UgKyAxNSkKLSAgeyJtNDAxMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTQwMTB9LAotI2RlZmluZSBPUFRJT05fTk9fTTQwMTAgKE9QVElPTl9NRF9CQVNFICsgMTYpCi0gIHsibm8tbTQwMTAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX000MDEwfSwKLSNkZWZpbmUgT1BUSU9OX000MTAwIChPUFRJT05fTURfQkFTRSArIDE3KQotICB7Im00MTAwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NNDEwMH0sCi0jZGVmaW5lIE9QVElPTl9OT19NNDEwMCAoT1BUSU9OX01EX0JBU0UgKyAxOCkKLSAgeyJuby1tNDEwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fTTQxMDB9LAotI2RlZmluZSBPUFRJT05fTUlQUzE2IChPUFRJT05fTURfQkFTRSArIDIyKQotICB7Im1pcHMxNiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUlQUzE2fSwKLSNkZWZpbmUgT1BUSU9OX05PX01JUFMxNiAoT1BUSU9OX01EX0JBU0UgKyAyMykKLSAgeyJuby1taXBzMTYiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX01JUFMxNn0sCi0jZGVmaW5lIE9QVElPTl9NMzkwMCAoT1BUSU9OX01EX0JBU0UgKyAyNikKLSAgeyJtMzkwMCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTTM5MDB9LAotI2RlZmluZSBPUFRJT05fTk9fTTM5MDAgKE9QVElPTl9NRF9CQVNFICsgMjcpCi0gIHsibm8tbTM5MDAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX00zOTAwfSwKLQotCi0jZGVmaW5lIE9QVElPTl9NQUJJIChPUFRJT05fTURfQkFTRSArIDM4KQotICB7Im1hYmkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BQkl9LAotCi0jZGVmaW5lIE9QVElPTl9DQUxMX1NIQVJFRCAoT1BUSU9OX01EX0JBU0UgKyA3KQotI2RlZmluZSBPUFRJT05fTk9OX1NIQVJFRCAoT1BUSU9OX01EX0JBU0UgKyA4KQotI2RlZmluZSBPUFRJT05fWEdPVCAoT1BUSU9OX01EX0JBU0UgKyAxOSkKLSNkZWZpbmUgT1BUSU9OXzMyIChPUFRJT05fTURfQkFTRSArIDIwKQotI2RlZmluZSBPUFRJT05fNjQgKE9QVElPTl9NRF9CQVNFICsgMjEpCi0jaWZkZWYgT0JKX0VMRgotICB7IktQSUMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgeyJ4Z290Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9YR09UfSwKLSAgeyJjYWxsX3NoYXJlZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ0FMTF9TSEFSRUR9LAotICB7Im5vbl9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICB7IjMyIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl8zMn0sCi0gIHsiNjQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzY0fSwKLSNlbmRpZgotCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fVFJBUDoKLSAgICAgIG1pcHNfdHJhcCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0JSRUFLOgotICAgICAgbWlwc190cmFwID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRUI6Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VMOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdPJzoKLSAgICAgIGlmIChhcmcgJiYgYXJnWzFdID09ICcwJykKLQltaXBzX29wdGltaXplID0gMTsKLSAgICAgIGVsc2UKLQltaXBzX29wdGltaXplID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZyc6Ci0gICAgICBpZiAoYXJnID09IE5VTEwpCi0JbWlwc19kZWJ1ZyA9IDI7Ci0gICAgICBlbHNlCi0JbWlwc19kZWJ1ZyA9IGF0b2kgKGFyZyk7Ci0gICAgICAvKiBXaGVuIHRoZSBNSVBTIGFzc2VtYmxlciBzZWVzIC1nIG9yIC1nMiwgaXQgZG9lcyBub3QgZG8KLSAgICAgICAgIG9wdGltaXphdGlvbnMgd2hpY2ggbGltaXQgZnVsbCBzeW1ib2xpYyBkZWJ1Z2dpbmcuICBXZSB0YWtlCi0gICAgICAgICB0aGF0IHRvIGJlIGVxdWl2YWxlbnQgdG8gLU8wLiAgKi8KLSAgICAgIGlmIChtaXBzX2RlYnVnID09IDIpCi0JbWlwc19vcHRpbWl6ZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01JUFMxOgotICAgICAgbWlwc19vcHRzLmlzYSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01JUFMyOgotICAgICAgbWlwc19vcHRzLmlzYSA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01JUFMzOgotICAgICAgbWlwc19vcHRzLmlzYSA9IDM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01JUFM0OgotICAgICAgbWlwc19vcHRzLmlzYSA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01DUFU6Ci0gICAgICB7Ci0JY2hhciAqcDsKLQotCS8qIElkZW50aWZ5IHRoZSBwcm9jZXNzb3IgdHlwZSAqLwotCXAgPSBhcmc7Ci0JaWYgKHN0cmNtcCAocCwgImRlZmF1bHQiKSA9PSAwCi0JICAgIHx8IHN0cmNtcCAocCwgIkRFRkFVTFQiKSA9PSAwKQotCSAgbWlwc19jcHUgPSAtMTsKLQllbHNlCi0JICB7Ci0JICAgIGludCBzdiA9IDA7Ci0KLQkgICAgLyogV2UgbmVlZCB0byBjb3BlIHdpdGggdGhlIHZhcmlvdXMgInZyIiBwcmVmaXhlcyBmb3IgdGhlIDQzMDAKLQkgICAgICAgcHJvY2Vzc29yLiAgKi8KLQkgICAgaWYgKCpwID09ICd2JyB8fCAqcCA9PSAnVicpCi0JICAgICAgewotCQlzdiA9IDE7Ci0JCXArKzsKLQkgICAgICB9Ci0KLQkgICAgaWYgKCpwID09ICdyJyB8fCAqcCA9PSAnUicpCi0JICAgICAgcCsrOwotCi0JICAgIG1pcHNfY3B1ID0gLTE7Ci0JICAgIHN3aXRjaCAoKnApCi0JICAgICAgewotCSAgICAgIGNhc2UgJzEnOgotCQlpZiAoc3RyY21wIChwLCAiMTAwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIxMGsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIxMEsiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gMTAwMDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnMic6Ci0JCWlmIChzdHJjbXAgKHAsICIyMDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiMmsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICIySyIpID09IDApCi0JCSAgbWlwc19jcHUgPSAyMDAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzMnOgotCQlpZiAoc3RyY21wIChwLCAiMzAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjNrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiM0siKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gMzAwMDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKHAsICIzOTAwIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgIG1pcHNfY3B1ID0gMzkwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICc0JzoKLQkJaWYgKHN0cmNtcCAocCwgIjQwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI0ayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjRLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDQwMDA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQxMDAiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBtaXBzX2NwdSA9IDQxMDA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQxMTEiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBtaXBzX2NwdSA9IDQxMTE7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQzMDAiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gNDMwMDsKLQkJZWxzZSBpZiAoc3RyY21wIChwLCAiNDQwMCIpID09IDApCi0JCSAgbWlwc19jcHUgPSA0NDAwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0NjAwIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDQ2MDA7Ci0JCWVsc2UgaWYgKHN0cmNtcCAocCwgIjQ2NTAiKSA9PSAwKQotCQkgICAgbWlwc19jcHUgPSA0NjUwOwotCQllbHNlIGlmIChzdHJjbXAgKHAsICI0MDEwIikgPT0gMCkKLSAgICAgICAgICAgICAgICAgIG1pcHNfY3B1ID0gNDAxMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICc1JzoKLQkJaWYgKHN0cmNtcCAocCwgIjUwMDAiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI1ayIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjVLIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDUwMDA7Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSAnNic6Ci0JCWlmIChzdHJjbXAgKHAsICI2MDAwIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiNmsiKSA9PSAwCi0JCSAgICB8fCBzdHJjbXAgKHAsICI2SyIpID09IDApCi0JCSAgbWlwc19jcHUgPSA2MDAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgJzgnOgotCQlpZiAoc3RyY21wIChwLCAiODAwMCIpID09IDAKLQkJICAgIHx8IHN0cmNtcCAocCwgIjhrIikgPT0gMAotCQkgICAgfHwgc3RyY21wIChwLCAiOEsiKSA9PSAwKQotCQkgIG1pcHNfY3B1ID0gODAwMDsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlICdvJzoKLQkJaWYgKHN0cmNtcCAocCwgIm9yaW9uIikgPT0gMCkKLQkJICBtaXBzX2NwdSA9IDQ2MDA7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBpZiAoc3YKLQkJJiYgKG1pcHNfY3B1ICE9IDQzMDAKLQkJICAgICYmIG1pcHNfY3B1ICE9IDQxMDAKLQkJICAgICYmIG1pcHNfY3B1ICE9IDQxMTEKLQkJICAgICYmIG1pcHNfY3B1ICE9IDUwMDApKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJpZ25vcmluZyBpbnZhbGlkIGxlYWRpbmcgJ3YnIGluIC1tY3B1PSVzIHN3aXRjaCIpLCBhcmcpOwotCQlyZXR1cm4gMDsKLQkgICAgICB9Ci0KLQkgICAgaWYgKG1pcHNfY3B1ID09IC0xKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAtbWNwdT0lcyIpLCBhcmcpOwotCQlyZXR1cm4gMDsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX000NjUwOgotICAgICAgbWlwc19jcHUgPSA0NjUwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT19NNDY1MDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTTQwMTA6Ci0gICAgICBtaXBzX2NwdSA9IDQwMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PX000MDEwOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NNDEwMDoKLSAgICAgIG1pcHNfY3B1ID0gNDEwMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTk9fTTQxMDA6Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBPUFRJT05fTTM5MDA6Ci0gICAgICBtaXBzX2NwdSA9IDM5MDA7Ci0gICAgICBicmVhazsKLSAgICAgIAotICAgIGNhc2UgT1BUSU9OX05PX00zOTAwOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NSVBTMTY6Ci0gICAgICBtaXBzX29wdHMubWlwczE2ID0gMTsKLSAgICAgIG1pcHNfbm9fcHJldl9pbnNuIChmYWxzZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PX01JUFMxNjoKLSAgICAgIG1pcHNfb3B0cy5taXBzMTYgPSAwOwotICAgICAgbWlwc19ub19wcmV2X2luc24gKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUVNQkVEREVEX1BJQzoKLSAgICAgIG1pcHNfcGljID0gRU1CRURERURfUElDOwotICAgICAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQgJiYgZ19zd2l0Y2hfc2VlbikKLQl7Ci0JICBhc19iYWQgKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIGVtYmVkZGVkIFBJQyBjb2RlIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZ19zd2l0Y2hfdmFsdWUgPSAweDdmZmZmZmZmOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIFdoZW4gZ2VuZXJhdGluZyBFTEYgY29kZSwgd2UgcGVybWl0IC1LUElDIGFuZCAtY2FsbF9zaGFyZWQgdG8KLQkgc2VsZWN0IFNWUjRfUElDLCBhbmQgLW5vbl9zaGFyZWQgdG8gc2VsZWN0IG5vIFBJQy4gIFRoaXMgaXMKLQkgaW50ZW5kZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIElyaXggNS4gICovCi0gICAgY2FzZSBPUFRJT05fQ0FMTF9TSEFSRUQ6Ci0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGFzX2JhZCAoXygiLWNhbGxfc2hhcmVkIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBFTEYgZm9ybWF0IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgbWlwc19waWMgPSBTVlI0X1BJQzsKLSAgICAgIGlmIChnX3N3aXRjaF9zZWVuICYmIGdfc3dpdGNoX3ZhbHVlICE9IDApCi0JewotCSAgYXNfYmFkIChfKCItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBTVlI0IFBJQyBjb2RlIikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZ19zd2l0Y2hfdmFsdWUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT05fU0hBUkVEOgotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQl7Ci0JICBhc19iYWQgKF8oIi1ub25fc2hhcmVkIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBFTEYgZm9ybWF0IikpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgbWlwc19waWMgPSBOT19QSUM7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogVGhlIC14Z290IG9wdGlvbiB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvIHVzZSAzMiBvZmZzZXRzIHdoZW4KLSAgICAgICAgIGFjY2Vzc2luZyB0aGUgZ290IGluIFNWUjRfUElDIG1vZGUuICBJdCBpcyBmb3IgSXJpeAotICAgICAgICAgY29tcGF0aWJpbGl0eS4gICovCi0gICAgY2FzZSBPUFRJT05fWEdPVDoKLSAgICAgIG1pcHNfYmlnX2dvdCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0cnOgotICAgICAgaWYgKCEgVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLQl7Ci0JICBhc19iYWQgKF8oIi1HIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgY29uZmlndXJhdGlvbiIpKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGVsc2UgaWYgKG1pcHNfcGljID09IFNWUjRfUElDIHx8IG1pcHNfcGljID09IEVNQkVEREVEX1BJQykKLQl7Ci0JICBhc19iYWQgKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgb3IgZW1iZWRkZWQgUElDIGNvZGUiKSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBlbHNlCi0JZ19zd2l0Y2hfdmFsdWUgPSBhdG9pIChhcmcpOwotICAgICAgZ19zd2l0Y2hfc2VlbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogVGhlIC0zMiBhbmQgLTY0IG9wdGlvbnMgdGVsbCB0aGUgYXNzZW1ibGVyIHRvIG91dHB1dCB0aGUgMzIKLSAgICAgICAgIGJpdCBvciB0aGUgNjQgYml0IE1JUFMgRUxGIGZvcm1hdC4gICovCi0gICAgY2FzZSBPUFRJT05fMzI6Ci0gICAgICBtaXBzXzY0ID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fNjQ6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqKmxpc3QsICoqbDsKLQotCWxpc3QgPSBiZmRfdGFyZ2V0X2xpc3QgKCk7Ci0JZm9yIChsID0gbGlzdDsgKmwgIT0gTlVMTDsgbCsrKQotCSAgaWYgKHN0cmNtcCAoKmwsICJlbGY2NC1iaWdtaXBzIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoKmwsICJlbGY2NC1saXR0bGVtaXBzIikgPT0gMCkKLQkgICAgYnJlYWs7Ci0JaWYgKCpsID09IE5VTEwpCi0JICBhc19mYXRhbCAoXygiTm8gY29tcGlsZWQgaW4gc3VwcG9ydCBmb3IgNjQgYml0IG9iamVjdCBmaWxlIGZvcm1hdCIpKTsKLQlmcmVlIChsaXN0KTsKLQltaXBzXzY0ID0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIE9QVElPTl9NQUJJOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCIzMiIpID09IDAKLQkgIHx8IHN0cmNtcCAoYXJnLCJuMzIiKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZywiNjQiKSA9PSAwCi0JICB8fCBzdHJjbXAgKGFyZywibzY0IikgPT0gMAotCSAgfHwgc3RyY21wIChhcmcsImVhYmkiKSA9PSAwKQotCW1pcHNfYWJpX3N0cmluZyA9IGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMgdm9pZAotc2hvdyAoc3RyZWFtLCBzdHJpbmcsIGNvbF9wLCBmaXJzdF9wKQotICAgICBGSUxFICpzdHJlYW07Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgaW50ICpjb2xfcDsKLSAgICAgaW50ICpmaXJzdF9wOwotewotICBpZiAoKmZpcnN0X3ApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RyZWFtLCAiJTI0cyIsICIiKTsKLSAgICAgICpjb2xfcCA9IDI0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0cmVhbSwgIiwgIik7Ci0gICAgICAqY29sX3AgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKCpjb2xfcCArIHN0cmxlbiAoc3RyaW5nKSA+IDcyKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0cmVhbSwgIlxuJTI0cyIsICIiKTsKLSAgICAgICpjb2xfcCA9IDI0OwotICAgIH0KLQotICBmcHJpbnRmIChzdHJlYW0sICIlcyIsIHN0cmluZyk7Ci0gICpjb2xfcCArPSBzdHJsZW4gKHN0cmluZyk7Ci0KLSAgKmZpcnN0X3AgPSAwOwotfQotCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBpbnQgY29sdW1uLCBmaXJzdDsKLQotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotTUlQUyBvcHRpb25zOlxuXAotLW1lbWJlZGRlZC1waWMJCWdlbmVyYXRlIGVtYmVkZGVkIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcblwKLS1FQgkJCWdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG5cCi0tRUwJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIG91dHB1dFxuXAotLWcsIC1nMgkJCWRvIG5vdCByZW1vdmUgdW5lZWRlZCBOT1BzIG9yIHN3YXAgYnJhbmNoZXNcblwKLS1HIE5VTQkJCWFsbG93IHJlZmVyZW5jaW5nIG9iamVjdHMgdXAgdG8gTlVNIGJ5dGVzXG5cCi0JCQlpbXBsaWNpdGx5IHdpdGggdGhlIGdwIHJlZ2lzdGVyIFtkZWZhdWx0IDhdXG4iKSk7Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tbWlwczEJCQlnZW5lcmF0ZSBNSVBTIElTQSBJIGluc3RydWN0aW9uc1xuXAotLW1pcHMyCQkJZ2VuZXJhdGUgTUlQUyBJU0EgSUkgaW5zdHJ1Y3Rpb25zXG5cCi0tbWlwczMJCQlnZW5lcmF0ZSBNSVBTIElTQSBJSUkgaW5zdHJ1Y3Rpb25zXG5cCi0tbWlwczQJCQlnZW5lcmF0ZSBNSVBTIElTQSBJViBpbnN0cnVjdGlvbnNcblwKLS1tY3B1PUNQVQkJZ2VuZXJhdGUgY29kZSBmb3IgQ1BVLCB3aGVyZSBDUFUgaXMgb25lIG9mOlxuIikpOwotCi0gIGZpcnN0ID0gMTsKLQotICBzaG93IChzdHJlYW0sICIyMDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiMzAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjM5MDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDAxMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQxMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0MTExIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDMwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQ0MDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0NjAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDY1MCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjUwMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI2MDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiODAwMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjEwMDAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgZnB1dGMgKCdcbicsIHN0cmVhbSk7Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tbUNQVQkJCWVxdWl2YWxlbnQgdG8gLW1jcHU9Q1BVLlxuXAotLW5vLW1DUFUJCWRvbid0IGdlbmVyYXRlIGNvZGUgc3BlY2lmaWMgdG8gQ1BVLlxuXAotCQkJRm9yIC1tQ1BVIGFuZCAtbm8tbUNQVSwgQ1BVIG11c3QgYmUgb25lIG9mOlxuIikpOwotCi0gIGZpcnN0ID0gMTsKLQotICBzaG93IChzdHJlYW0sICIzOTAwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgc2hvdyAoc3RyZWFtLCAiNDAxMCIsICZjb2x1bW4sICZmaXJzdCk7Ci0gIHNob3cgKHN0cmVhbSwgIjQxMDAiLCAmY29sdW1uLCAmZmlyc3QpOwotICBzaG93IChzdHJlYW0sICI0NjUwIiwgJmNvbHVtbiwgJmZpcnN0KTsKLSAgZnB1dGMgKCdcbicsIHN0cmVhbSk7Ci0KLSAgZnByaW50ZihzdHJlYW0sIF8oIlwKLS1taXBzMTYJCQlnZW5lcmF0ZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zXG5cCi0tbm8tbWlwczE2CQlkbyBub3QgZ2VuZXJhdGUgbWlwczE2IGluc3RydWN0aW9uc1xuIikpOwotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLU8wCQkJcmVtb3ZlIHVubmVlZGVkIE5PUHMsIGRvIG5vdCBzd2FwIGJyYW5jaGVzXG5cCi0tTwkJCXJlbW92ZSB1bm5lZWRlZCBOT1BzIGFuZCBzd2FwIGJyYW5jaGVzXG5cCi0tLXRyYXAsIC0tbm8tYnJlYWsJdHJhcCBleGNlcHRpb24gb24gZGl2IGJ5IDAgYW5kIG11bHQgb3ZlcmZsb3dcblwKLS0tYnJlYWssIC0tbm8tdHJhcAlicmVhayBleGNlcHRpb24gb24gZGl2IGJ5IDAgYW5kIG11bHQgb3ZlcmZsb3dcbiIpKTsKLSNpZmRlZiBPQkpfRUxGCi0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi0tS1BJQywgLWNhbGxfc2hhcmVkCWdlbmVyYXRlIFNWUjQgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuXAotLW5vbl9zaGFyZWQJCWRvIG5vdCBnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG5cCi0teGdvdAkJCWFzc3VtZSBhIDMyIGJpdCBHT1RcblwKLS0zMgkJCWNyZWF0ZSAzMiBiaXQgb2JqZWN0IGZpbGUgKGRlZmF1bHQpXG5cCi0tNjQJCQljcmVhdGUgNjQgYml0IG9iamVjdCBmaWxlXG4iKSk7Ci0jZW5kaWYKLX0KLQwKLXZvaWQKLW1pcHNfaW5pdF9hZnRlcl9hcmdzICgpCi17Ci0gIC8qIGluaXRpYWxpemUgb3Bjb2RlcyAqLwotICBiZmRfbWlwc19udW1fb3Bjb2RlcyA9IGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXM7Ci0gIG1pcHNfb3Bjb2RlcyA9IChzdHJ1Y3QgbWlwc19vcGNvZGUqKSBtaXBzX2J1aWx0aW5fb3Bjb2RlczsKLX0KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmICEgU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgLyogVGhpcyBtYWtlcyBhIGJyYW5jaCB0byBhbiB1bmRlZmluZWQgc3ltYm9sIGJlIGEgYnJhbmNoIHRvIHRoZQotCSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLSAgICAgIHJldHVybiA0OwotICAgIH0KLQotICAvKiByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGRlbGF5IHNsb3QgKi8KLSAgcmV0dXJuIGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IGVtaXRfZXhwciB2aWEgVENfQ09OU19GSVhfTkVXIHdoZW4gY3JlYXRpbmcgYQotICAgcmVsb2MgZm9yIGEgY29ucy4gIFdlIGNvdWxkIHVzZSB0aGUgZGVmaW5pdGlvbiB0aGVyZSwgZXhjZXB0IHRoYXQKLSAgIHdlIHdhbnQgdG8gaGFuZGxlIDY0IGJpdCByZWxvY3Mgc3BlY2lhbGx5LiAgKi8KLQotdm9pZAotY29uc19maXhfbmV3X21pcHMgKGZyYWcsIHdoZXJlLCBuYnl0ZXMsIGV4cCkKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIGludCB3aGVyZTsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSNpZm5kZWYgT0JKX0VMRgotICAvKiBJZiB3ZSBhcmUgYXNzZW1ibGluZyBpbiAzMiBiaXQgbW9kZSwgdHVybiBhbiA4IGJ5dGUgcmVsb2MgaW50byBhCi0gICAgIDQgYnl0ZSByZWxvYy4gICovCi0gIGlmIChuYnl0ZXMgPT0gOCAmJiAhIG1pcHNfNjQpCi0gICAgewotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCXdoZXJlICs9IDQ7Ci0gICAgICBuYnl0ZXMgPSA0OwotICAgIH0KLSNlbmRpZgotCi0gIGlmIChuYnl0ZXMgIT0gMiAmJiBuYnl0ZXMgIT0gNCAmJiBuYnl0ZXMgIT0gOCkKLSAgICBhc19iYWQgKF8oIlVuc3VwcG9ydGVkIHJlbG9jIHNpemUgJWQiKSwgbmJ5dGVzKTsKLQotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHdoZXJlLCAoaW50KSBuYnl0ZXMsIGV4cCwgMCwKLQkgICAgICAgKG5ieXRlcyA9PSAyCi0JCT8gQkZEX1JFTE9DXzE2Ci0JCTogKG5ieXRlcyA9PSA0ID8gQkZEX1JFTE9DXzMyIDogQkZEX1JFTE9DXzY0KSkpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHN5bWJvbCB0YWJsZSBpcyBwcm9jZXNzZWQuICBJbiBvcmRlciB0bwotICAgd29yayB3aXRoIGdjYyB3aGVuIHVzaW5nIG1pcHMtdGZpbGUsIHdlIG11c3Qga2VlcCBhbGwgbG9jYWwgbGFiZWxzLgotICAgSG93ZXZlciwgaW4gb3RoZXIgY2FzZXMsIHdlIHdhbnQgdG8gZGlzY2FyZCB0aGVtLiAgSWYgd2Ugd2VyZQotICAgY2FsbGVkIHdpdGggLWcsIGJ1dCB3ZSBkaWRuJ3Qgc2VlIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIGl0IG1heQotICAgbWVhbiB0aGF0IGdjYyBpcyBzbXVnZ2xpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRocm91Z2ggdG8KLSAgIG1pcHMtdGZpbGUsIGluIHdoaWNoIGNhc2Ugd2UgbXVzdCBnZW5lcmF0ZSBhbGwgbG9jYWwgbGFiZWxzLiAgKi8KLQotdm9pZAotbWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotewotI2lmbmRlZiBOT19FQ09GRl9ERUJVR0dJTkcKLSAgaWYgKEVDT0ZGX0RFQlVHR0lORwotICAgICAgJiYgbWlwc19kZWJ1ZyAhPSAwCi0gICAgICAmJiAhIGVjb2ZmX2RlYnVnZ2luZ19zZWVuKQotICAgIGZsYWdfa2VlcF9sb2NhbHMgPSAxOwotI2VuZGlmCi19Ci0KLS8qIFNvcnQgYW55IHVubWF0Y2hlZCBISTE2X1MgcmVsb2NzIHNvIHRoYXQgdGhleSBpbW1lZGlhdGVseSBwcmVjZWRlCi0gICB0aGUgY29ycmVzcG9uZGluZyBMTyByZWxvYy4gIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBtZF9hcHBseV9maXggYW5kCi0gICB0Y19nZW5fcmVsb2MuICBVbm1hdGNoZWQgSEkxNl9TIHJlbG9jcyBjYW4gb25seSBiZSBnZW5lcmF0ZWQgYnkKLSAgIGV4cGxpY2l0IHVzZSBvZiB0aGUgJWhpIG1vZGlmaWVyLiAgKi8KLQotdm9pZAotbWlwc19mcm9iX2ZpbGUgKCkKLXsKLSAgc3RydWN0IG1pcHNfaGlfZml4dXAgKmw7Ci0KLSAgZm9yIChsID0gbWlwc19oaV9maXh1cF9saXN0OyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICAgICAgaW50IHBhc3M7Ci0KLSAgICAgIGFzc2VydCAobC0+Zml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19ISTE2X1MpOwotCi0gICAgICAvKiBDaGVjayBxdWlja2x5IHdoZXRoZXIgdGhlIG5leHQgZml4dXAgaGFwcGVucyB0byBiZSBhIG1hdGNoaW5nCi0gICAgICAgICAlbG8uICAqLwotICAgICAgaWYgKGwtPmZpeHAtPmZ4X25leHQgIT0gTlVMTAotCSAgJiYgbC0+Zml4cC0+ZnhfbmV4dC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19MTzE2Ci0JICAmJiBsLT5maXhwLT5meF9hZGRzeSA9PSBsLT5maXhwLT5meF9uZXh0LT5meF9hZGRzeQotCSAgJiYgbC0+Zml4cC0+Znhfb2Zmc2V0ID09IGwtPmZpeHAtPmZ4X25leHQtPmZ4X29mZnNldCkKLQljb250aW51ZTsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSBmaXh1cHMgZm9yIHRoaXMgc2VnbWVudCBmb3IgYSBtYXRjaGluZyAlbG8uCi0gICAgICAgICBXaGVuIHdlIGZpbmQgb25lLCBtb3ZlIHRoZSAlaGkganVzdCBpbiBmcm9udCBvZiBpdC4gIFdlIGRvCi0gICAgICAgICB0aGlzIGluIHR3byBwYXNzZXMuICBJbiB0aGUgZmlyc3QgcGFzcywgd2UgdHJ5IHRvIGZpbmQgYQotICAgICAgICAgdW5pcXVlICVsby4gIEluIHRoZSBzZWNvbmQgcGFzcywgd2UgcGVybWl0IG11bHRpcGxlICVoaQotICAgICAgICAgcmVsb2NzIGZvciBhIHNpbmdsZSAlbG8gKHRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uKS4gICovCi0gICAgICBzZWdpbmZvID0gc2VnX2luZm8gKGwtPnNlZyk7Ci0gICAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgcGFzcysrKQotCXsKLQkgIGZpeFMgKmYsICpwcmV2OwotCi0JICBwcmV2ID0gTlVMTDsKLQkgIGZvciAoZiA9IHNlZ2luZm8tPmZpeF9yb290OyBmICE9IE5VTEw7IGYgPSBmLT5meF9uZXh0KQotCSAgICB7Ci0JICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGEgJWxvIGZpeHVwIHdoaWNoIG1hdGNoZXMgbC0+Zml4cC4gICovCi0JICAgICAgaWYgKGYtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTE8xNgotCQkgICYmIGYtPmZ4X2FkZHN5ID09IGwtPmZpeHAtPmZ4X2FkZHN5Ci0JCSAgJiYgZi0+Znhfb2Zmc2V0ID09IGwtPmZpeHAtPmZ4X29mZnNldAotCQkgICYmIChwYXNzID09IDEKLQkJICAgICAgfHwgcHJldiA9PSBOVUxMCi0JCSAgICAgIHx8IHByZXYtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9TCi0JCSAgICAgIHx8IHByZXYtPmZ4X2FkZHN5ICE9IGYtPmZ4X2FkZHN5Ci0JCSAgICAgIHx8IHByZXYtPmZ4X29mZnNldCAhPSAgZi0+Znhfb2Zmc2V0KSkKLQkJewotCQkgIGZpeFMgKipwZjsKLQotCQkgIC8qIE1vdmUgbC0+Zml4cCBiZWZvcmUgZi4gICovCi0JCSAgZm9yIChwZiA9ICZzZWdpbmZvLT5maXhfcm9vdDsKLQkJICAgICAgICpwZiAhPSBsLT5maXhwOwotCQkgICAgICAgcGYgPSAmKCpwZiktPmZ4X25leHQpCi0JCSAgICBhc3NlcnQgKCpwZiAhPSBOVUxMKTsKLQotCQkgICpwZiA9IGwtPmZpeHAtPmZ4X25leHQ7Ci0KLQkJICBsLT5maXhwLT5meF9uZXh0ID0gZjsKLQkJICBpZiAocHJldiA9PSBOVUxMKQotCQkgICAgc2VnaW5mby0+Zml4X3Jvb3QgPSBsLT5maXhwOwotCQkgIGVsc2UKLQkJICAgIHByZXYtPmZ4X25leHQgPSBsLT5maXhwOwotCi0JCSAgYnJlYWs7Ci0JCX0KLQotCSAgICAgIHByZXYgPSBmOwotCSAgICB9Ci0KLQkgIGlmIChmICE9IE5VTEwpCi0JICAgIGJyZWFrOwotCi0jaWYgMCAvKiBHQ0MgY29kZSBtb3Rpb24gcGx1cyBpbmNvbXBsZXRlIGRlYWQgY29kZSBlbGltaW5hdGlvbgotCSBjYW4gbGVhdmUgYSAlaGkgd2l0aG91dCBhICVsby4gICovCi0JICBpZiAocGFzcyA9PSAxKQotCSAgICBhc193YXJuX3doZXJlIChsLT5maXhwLT5meF9maWxlLCBsLT5maXhwLT5meF9saW5lLAotCQkJICAgXygiVW5tYXRjaGVkICUlaGkgcmVsb2MiKSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotfQotCi0vKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUgd2UgbmVlZCB0byB1c2UgYSBzcGVjaWFsCi0gICByZWxvY2F0aW9uIHRvIHJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc3ltYm9scyBpbiB0aGUgLnRleHQKLSAgIHNlY3Rpb24gKHN3aXRjaCB0YWJsZXMgdXNlIGEgZGlmZmVyZW5jZSBvZiB0aGlzIHNvcnQpLiAgU2VlCi0gICBpbmNsdWRlL2NvZmYvbWlwcy5oIGZvciBkZXRhaWxzLiAgVGhpcyBtYWNybyBjaGVja3Mgd2hldGhlciB0aGlzCi0gICBmaXh1cCByZXF1aXJlcyB0aGUgc3BlY2lhbCByZWxvYy4gICovCi0jZGVmaW5lIFNXSVRDSF9UQUJMRShmaXhwKSBcCi0gICgoZml4cCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzIgXAotICAgJiYgKGZpeHApLT5meF9hZGRzeSAhPSBOVUxMIFwKLSAgICYmIChmaXhwKS0+Znhfc3Vic3kgIT0gTlVMTCBcCi0gICAmJiBTX0dFVF9TRUdNRU5UICgoZml4cCktPmZ4X2FkZHN5KSA9PSB0ZXh0X3NlY3Rpb24gXAotICAgJiYgU19HRVRfU0VHTUVOVCAoKGZpeHApLT5meF9zdWJzeSkgPT0gdGV4dF9zZWN0aW9uKQotCi0vKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUgd2UgbXVzdCBrZWVwIGFsbCBQQyByZWxhdGl2ZQotICAgcmVsb2NhdGlvbnMsIGluIGNhc2UgdGhlIGxpbmtlciBoYXMgdG8gcmVsYXggYSBjYWxsLiAgV2UgYWxzbyBuZWVkCi0gICB0byBrZWVwIHJlbG9jYXRpb25zIGZvciBzd2l0Y2ggdGFibGUgZW50cmllcy4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1taXBzX2ZvcmNlX3JlbG9jYXRpb24gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gKG1pcHNfcGljID09IEVNQkVEREVEX1BJQwotCSAgJiYgKGZpeHAtPmZ4X3BjcmVsCi0JICAgICAgfHwgU1dJVENIX1RBQkxFIChmaXhwKQotCSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfUENSRUxfSEkxNl9TCi0JICAgICAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9MTzE2KSk7Ci19Ci0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotaW50Ci1tZF9hcHBseV9maXggKGZpeFAsIHZhbHVlUCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWx1ZVA7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgbG9uZyBpbnNuLCB2YWx1ZTsKLQotICBhc3NlcnQgKGZpeFAtPmZ4X3NpemUgPT0gNAotCSAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNgotCSAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ182NAotCSAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotCSAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpOwotCi0gIHZhbHVlID0gKnZhbHVlUDsKLQotICAvKiBJZiB3ZSBhcmVuJ3QgYWRqdXN0aW5nIHRoaXMgZml4dXAgdG8gYmUgYWdhaW5zdCB0aGUgc2VjdGlvbgotICAgICBzeW1ib2wsIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSB2YWx1ZS4gICovCi0jaWZkZWYgT0JKX0VMRgotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCAmJiBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0gICAgaWYgKFNfR0VUX09USEVSIChmaXhQLT5meF9hZGRzeSkgPT0gU1RPX01JUFMxNiAKLSAgICAgICAgfHwgU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkKLSAgICAgICAgfHwgKHN5bWJvbF91c2VkX2luX3JlbG9jX3AgKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgICAgICAgJiYgKCgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCi0JCQkJCSBTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkpCi0JCSAgJiBTRUNfTElOS19PTkNFKSAhPSAwKQotCQl8fCAhc3RybmNtcCAoc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkpLAotCQkJICAgICAiLmdudS5saW5rb25jZSIsCi0JCQkgICAgIHNpemVvZiAoIi5nbnUubGlua29uY2UiKSAtIDEpKSkpCi0KLSAgICAgIHsKLSAgICAgICAgdmFsdWUgLT0gU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgICAgaWYgKHZhbHVlICE9IDAgJiYgISBmaXhQLT5meF9wY3JlbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbiB0aGlzIGNhc2UsIHRoZSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHJvdXRpbmUgd2lsbAotICAgICAgICAgICAgICAgaW5jb3JyZWN0bHkgYWRkIHRoZSBzeW1ib2wgdmFsdWUgYmFjayBpbi4gIFdlIGp1c3Qgd2FudAotICAgICAgICAgICAgICAgdGhlIGFkZGVuZCB0byBhcHBlYXIgaW4gdGhlIG9iamVjdCBmaWxlLiAgKi8KLSAgICAgICAgICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICAgICAgfQotICAgICAgfQotI2VuZGlmCi0KLQotICBmaXhQLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIHRjX2dlbl9yZWxvYyAqLwotCi0gIGlmIChmaXhQLT5meF9hZGRzeSA9PSBOVUxMICYmICEgZml4UC0+ZnhfcGNyZWwpCi0gICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0KLSAgc3dpdGNoIChmaXhQLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfSk1QOgotICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR1BSRUw6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19MSVRFUkFMOgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfQ0FMTDE2OgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HUFJFTDMyOgotICAgIGNhc2UgQkZEX1JFTE9DX01JUFNfR09UX0hJMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfR1BSRUw6Ci0gICAgICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkgICAgICBfKCJJbnZhbGlkIFBDIHJlbGF0aXZlIHJlbG9jIikpOwotICAgICAgLyogTm90aGluZyBuZWVkZWQgdG8gZG8uIFRoZSB2YWx1ZSBjb21lcyBmcm9tIHRoZSByZWxvYyBlbnRyeSAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTMTZfSk1QOgotICAgICAgLyogV2UgY3VycmVudGx5IGFsd2F5cyBnZW5lcmF0ZSBhIHJlbG9jIGFnYWluc3QgYSBzeW1ib2wsIHdoaWNoCi0gICAgICAgICBtZWFucyB0aGF0IHdlIGRvbid0IHdhbnQgYW4gYWRkZW5kIGV2ZW4gaWYgdGhlIHN5bWJvbCBpcwotICAgICAgICAgZGVmaW5lZC4gICovCi0gICAgICBmaXhQLT5meF9hZGRudW1iZXIgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1M6Ci0gICAgICAvKiBUaGUgYWRkZW5kIGZvciB0aGlzIGlzIHRyaWNreSBpZiBpdCBpcyBpbnRlcm5hbCwgc28gd2UganVzdAotCSBkbyBldmVyeXRoaW5nIGhlcmUgcmF0aGVyIHRoYW4gaW4gYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gICovCi0gICAgICBpZiAoKHN5bWJvbF9nZXRfYmZkc3ltIChmaXhQLT5meF9hZGRzeSktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSA9PSAwKQotCXsKLQkgIC8qIEZvciBhbiBleHRlcm5hbCBzeW1ib2wgYWRqdXN0IGJ5IHRoZSBhZGRyZXNzIHRvIG1ha2UgaXQKLQkgICAgIHBjcmVsX29mZnNldC4gIFdlIHVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgUkVMTE8gcmVsb2MKLQkgICAgIHdoaWNoIGZvbGxvd3MgdGhpcyBvbmUuICAqLwotCSAgdmFsdWUgKz0gKGZpeFAtPmZ4X25leHQtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJICAgICsgZml4UC0+ZnhfbmV4dC0+Znhfd2hlcmUpOwotCX0KLSAgICAgIGlmICh2YWx1ZSAmIDB4ODAwMCkKLQl2YWx1ZSArPSAweDEwMDAwOwotICAgICAgdmFsdWUgPj49IDE2OwotICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJ1ZiArPSAyOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfUENSRUxfTE8xNjoKLSAgICAgIC8qIFRoZSBhZGRlbmQgZm9yIHRoaXMgaXMgdHJpY2t5IGlmIGl0IGlzIGludGVybmFsLCBzbyB3ZSBqdXN0Ci0JIGRvIGV2ZXJ5dGhpbmcgaGVyZSByYXRoZXIgdGhhbiBpbiBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uLiAgKi8KLSAgICAgIGlmICgoc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDApCi0JdmFsdWUgKz0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJ1ZiArPSAyOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfNjQ6Ci0gICAgICAvKiBUaGlzIGlzIGhhbmRsZWQgbGlrZSBCRkRfUkVMT0NfMzIsIGJ1dCB3ZSBvdXRwdXQgYSBzaWduCi0gICAgICAgICBleHRlbmRlZCB2YWx1ZSBpZiB3ZSBhcmUgb25seSAzMiBiaXRzLiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lCi0JICB8fCAobWlwc19waWMgPT0gRU1CRURERURfUElDICYmIFNXSVRDSF9UQUJMRSAoZml4UCkpKQotCXsKLQkgIGlmICg4IDw9IHNpemVvZiAodmFsdWVUKSkKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmUsCi0JCQkJdmFsdWUsIDgpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbG9uZyB3MSwgdzI7Ci0JICAgICAgbG9uZyBoaXY7Ci0KLQkgICAgICB3MSA9IHcyID0gZml4UC0+Znhfd2hlcmU7Ci0JICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCQl3MSArPSA0OwotCSAgICAgIGVsc2UKLQkJdzIgKz0gNDsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyB3MSwgdmFsdWUsIDQpOwotCSAgICAgIGlmICgodmFsdWUgJiAweDgwMDAwMDAwKSAhPSAwKQotCQloaXYgPSAweGZmZmZmZmZmOwotCSAgICAgIGVsc2UKLQkJaGl2ID0gMDsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyB3MiwgaGl2LCA0KTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICAvKiBJZiB3ZSBhcmUgZGVsZXRpbmcgdGhpcyByZWxvYyBlbnRyeSwgd2UgbXVzdCBmaWxsIGluIHRoZQotCSB2YWx1ZSBub3cuICBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgaGF2ZSBhIC53b3JkIHdoaWNoIGlzIG5vdAotCSByZXNvbHZlZCB3aGVuIGl0IGFwcGVhcnMgYnV0IGlzIGxhdGVyIGRlZmluZWQuICBXZSBhbHNvIG5lZWQKLQkgdG8gZmlsbCBpbiB0aGUgdmFsdWUgaWYgdGhpcyBpcyBhbiBlbWJlZGRlZCBQSUMgc3dpdGNoIHRhYmxlCi0JIGVudHJ5LiAgKi8KLSAgICAgIGlmIChmaXhQLT5meF9kb25lCi0JICB8fCAobWlwc19waWMgPT0gRU1CRURERURfUElDICYmIFNXSVRDSF9UQUJMRSAoZml4UCkpKQotCW1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgIHZhbHVlLCA0KTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMTY6Ci0gICAgICAvKiBJZiB3ZSBhcmUgZGVsZXRpbmcgdGhpcyByZWxvYyBlbnRyeSwgd2UgbXVzdCBmaWxsIGluIHRoZQotICAgICAgICAgdmFsdWUgbm93LiAgKi8KLSAgICAgIGFzc2VydCAoZml4UC0+Znhfc2l6ZSA9PSAyKTsKLSAgICAgIGlmIChmaXhQLT5meF9kb25lKQotCW1kX251bWJlcl90b19jaGFycyAoZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeFAtPmZ4X3doZXJlLAotCQkJICAgIHZhbHVlLCAyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLSAgICAgIC8qIFdoZW4gaGFuZGxpbmcgYW4gZW1iZWRkZWQgUElDIHN3aXRjaCBzdGF0ZW1lbnQsIHdlIGNhbiB3aW5kCi0JIHVwIGRlbGV0aW5nIGEgTE8xNiByZWxvYy4gIFNlZSB0aGUgJ28nIGNhc2UgaW4gbWlwc19pcC4gICovCi0gICAgICBpZiAoZml4UC0+ZnhfZG9uZSkKLQl7Ci0JICBpZiAodmFsdWUgPCAtMHg4MDAwIHx8IHZhbHVlID4gMHg3ZmZmKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBidWYgPSAodW5zaWduZWQgY2hhciAqKSBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4UC0+Znhfd2hlcmU7Ci0JICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgIGJ1ZiArPSAyOwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbHVlLCAyKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotICAgICAgLyoKLSAgICAgICAqIFdlIG5lZWQgdG8gc2F2ZSB0aGUgYml0cyBpbiB0aGUgaW5zdHJ1Y3Rpb24gc2luY2UgZml4dXBfc2VnbWVudCgpCi0gICAgICAgKiBtaWdodCBiZSBkZWxldGluZyB0aGUgcmVsb2NhdGlvbiBlbnRyeSAoaS5lLiwgYSBicmFuY2ggd2l0aGluCi0gICAgICAgKiB0aGUgY3VycmVudCBzZWdtZW50KS4KLSAgICAgICAqLwotICAgICAgaWYgKCh2YWx1ZSAmIDB4MykgIT0gMCkKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oIkJyYW5jaCB0byBvZGQgYWRkcmVzcyAoJWx4KSIpLCB2YWx1ZSk7Ci0gICAgICB2YWx1ZSA+Pj0gMjsKLQotICAgICAgLyogdXBkYXRlIG9sZCBpbnN0cnVjdGlvbiBkYXRhICovCi0gICAgICBidWYgPSAodW5zaWduZWQgY2hhciAqKSAoZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsKTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlpbnNuID0gKGJ1ZlswXSA8PCAyNCkgfCAoYnVmWzFdIDw8IDE2KSB8IChidWZbMl0gPDwgOCkgfCBidWZbM107Ci0gICAgICBlbHNlCi0JaW5zbiA9IChidWZbM10gPDwgMjQpIHwgKGJ1ZlsyXSA8PCAxNikgfCAoYnVmWzFdIDw8IDgpIHwgYnVmWzBdOwotCi0gICAgICBpZiAodmFsdWUgPj0gLTB4ODAwMCAmJiB2YWx1ZSA8IDB4ODAwMCkKLQlpbnNuIHw9IHZhbHVlICYgMHhmZmZmOwotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBicmFuY2ggb2Zmc2V0IGlzIHRvbyBsYXJnZS4gIElmIHRoaXMgaXMgYW4KLSAgICAgICAgICAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgYW5kIHdlIGFyZSBub3QgZ2VuZXJhdGluZyBQSUMgY29kZSwKLSAgICAgICAgICAgICB3ZSBjYW4gY29udmVydCBpdCB0byBhbiBhYnNvbHV0ZSBqdW1wIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMKLQkgICAgICAmJiBmaXhQLT5meF9kb25lCi0JICAgICAgJiYgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyA+PSB0ZXh0X3NlY3Rpb24tPnZtYQotCSAgICAgICYmIChmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzCi0JCSAgPCB0ZXh0X3NlY3Rpb24tPnZtYSArIHRleHRfc2VjdGlvbi0+X3Jhd19zaXplKQotCSAgICAgICYmICgoaW5zbiAmIDB4ZmZmZjAwMDApID09IDB4MTAwMDAwMDAJIC8qIGJlcSAkMCwkMCAqLwotCQkgIHx8IChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgwNDAxMDAwMAkgLyogYmdleiAkMCAqLwotCQkgIHx8IChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgwNDExMDAwMCkpIC8qIGJnZXphbCAkMCAqLwotCSAgICB7Ci0JICAgICAgaWYgKChpbnNuICYgMHhmZmZmMDAwMCkgPT0gMHgwNDExMDAwMCkJIC8qIGJnZXphbCAkMCAqLwotCQlpbnNuID0gMHgwYzAwMDAwMDsJLyogamFsICovCi0JICAgICAgZWxzZQotCQlpbnNuID0gMHgwODAwMDAwMDsJLyogaiAqLwotCSAgICAgIGZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19NSVBTX0pNUDsKLQkgICAgICBmaXhQLT5meF9kb25lID0gMDsKLQkgICAgICBmaXhQLT5meF9hZGRzeSA9IHNlY3Rpb25fc3ltYm9sICh0ZXh0X3NlY3Rpb24pOwotCSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9ICh2YWx1ZSA8PCAyKSArIG1kX3BjcmVsX2Zyb20gKGZpeFApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRS4gIEl0IHdvdWxkIGJlIHBvc3NpYmxlIGluIHByaW5jaXBsZSB0byBoYW5kbGUKLSAgICAgICAgICAgICAgICAgY29uZGl0aW9uYWwgYnJhbmNoZXMgd2hpY2ggb3ZlcmZsb3cuICBUaGV5IGNvdWxkIGJlCi0gICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVkIGludG8gYSBicmFuY2ggYXJvdW5kIGEganVtcC4gIFRoaXMgd291bGQKLSAgICAgICAgICAgICAgICAgcmVxdWlyZSBzZXR0aW5nIHVwIHZhcmlhbnQgZnJhZ3MgZm9yIGVhY2ggZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgIGJyYW5jaCB0eXBlLiAgVGhlIG5hdGl2ZSBNSVBTIGFzc2VtYmxlciBhdHRlbXB0cyB0bwotICAgICAgICAgICAgICAgICBoYW5kbGUgdGhlc2UgY2FzZXMsIGJ1dCBpdCBhcHBlYXJzIHRvIGRvIGl0Ci0gICAgICAgICAgICAgICAgIGluY29ycmVjdGx5LiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgXygiQnJhbmNoIG91dCBvZiByYW5nZSIpKTsKLQkgICAgfQotCX0KLQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzICgoY2hhciAqKSBidWYsICh2YWx1ZVQpIGluc24sIDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgaWYgKGZpeFAtPmZ4X2FkZHN5Ci0gICAgICAgICAgJiYgIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAgICAgJiYgIVNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgICAgICBTX1NFVF9XRUFLIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICAgIGZpeFAtPmZ4X2RvbmUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaW50ZXJuYWxFcnJvciAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiAwCi12b2lkCi1wcmludEluc24gKG9jKQotICAgICB1bnNpZ25lZCBsb25nIG9jOwotewotICBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKnA7Ci0gIGludCB0cmVnLCBzcmVnLCBkcmVnLCBzaGFtdDsKLSAgc2hvcnQgaW1tOwotICBjb25zdCBjaGFyICphcmdzOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNT1BDT0RFUzsgKytpKQotICAgIHsKLSAgICAgIHAgPSAmbWlwc19vcGNvZGVzW2ldOwotICAgICAgaWYgKCgob2MgJiBwLT5tYXNrKSA9PSBwLT5tYXRjaCkgJiYgKHAtPnBpbmZvICE9IElOU05fTUFDUk8pKQotCXsKLQkgIHByaW50ZiAoIiUwOGx4ICVzXHQiLCBvYywgcC0+bmFtZSk7Ci0JICB0cmVnID0gKG9jID4+IDE2KSAmIDB4MWY7Ci0JICBzcmVnID0gKG9jID4+IDIxKSAmIDB4MWY7Ci0JICBkcmVnID0gKG9jID4+IDExKSAmIDB4MWY7Ci0JICBzaGFtdCA9IChvYyA+PiA2KSAmIDB4MWY7Ci0JICBpbW0gPSBvYzsKLQkgIGZvciAoYXJncyA9IHAtPmFyZ3M7OyArK2FyZ3MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCphcmdzKQotCQl7Ci0JCWNhc2UgJ1wwJzoKLQkJICBwcmludGYgKCJcbiIpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJywnOgotCQljYXNlICcoJzoKLQkJY2FzZSAnKSc6Ci0JCSAgcHJpbnRmICgiJWMiLCAqYXJncyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAncic6Ci0JCSAgYXNzZXJ0ICh0cmVnID09IHNyZWcpOwotCQkgIHByaW50ZiAoIiQlZCwkJWQiLCB0cmVnLCBzcmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdkJzoKLQkJY2FzZSAnRyc6Ci0JCSAgcHJpbnRmICgiJCVkIiwgZHJlZyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAndCc6Ci0JCWNhc2UgJ0UnOgotCQkgIHByaW50ZiAoIiQlZCIsIHRyZWcpOwotCQkgIGNvbnRpbnVlOwotCi0JCWNhc2UgJ2snOgotCQkgIHByaW50ZiAoIjB4JXgiLCB0cmVnKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdiJzoKLQkJY2FzZSAncyc6Ci0JCSAgcHJpbnRmICgiJCVkIiwgc3JlZyk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnYSc6Ci0JCSAgcHJpbnRmICgiMHglMDhseCIsIG9jICYgMHgxZmZmZmZmKTsKLQkJICBjb250aW51ZTsKLQotCQljYXNlICdpJzoKLQkJY2FzZSAnaic6Ci0JCWNhc2UgJ28nOgotCQljYXNlICd1JzoKLQkJICBwcmludGYgKCIlZCIsIGltbSk7Ci0JCSAgY29udGludWU7Ci0KLQkJY2FzZSAnPCc6Ci0JCWNhc2UgJz4nOgotCQkgIHByaW50ZiAoIiQlZCIsIHNoYW10KTsKLQkJICBjb250aW51ZTsKLQotCQlkZWZhdWx0OgotCQkgIGludGVybmFsRXJyb3IgKCk7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIHByaW50ZiAoXygiJTA4bHggIFVOREVGSU5FRFxuIiksIG9jKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3ltYm9sUyAqCi1nZXRfc3ltYm9sICgpCi17Ci0gIGludCBjOwotICBjaGFyICpuYW1lOwotICBzeW1ib2xTICpwOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IChzeW1ib2xTICopIHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgcmV0dXJuIHA7Ci19Ci0KLS8qIEFsaWduIHRoZSBjdXJyZW50IGZyYWcgdG8gYSBnaXZlbiBwb3dlciBvZiB0d28uICBUaGUgTUlQUyBhc3NlbWJsZXIKLSAgIGFsc28gYXV0b21hdGljYWxseSBhZGp1c3RzIGFueSBwcmVjZWRpbmcgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotbWlwc19hbGlnbiAodG8sIGZpbGwsIGxhYmVsKQotICAgICBpbnQgdG87Ci0gICAgIGludCBmaWxsOwotICAgICBzeW1ib2xTICpsYWJlbDsKLXsKLSAgbWlwc19lbWl0X2RlbGF5cyAoZmFsc2UpOwotICBmcmFnX2FsaWduICh0bywgZmlsbCwgMCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIHRvKTsKLSAgaWYgKGxhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0IChTX0dFVF9TRUdNRU5UIChsYWJlbCkgPT0gbm93X3NlZyk7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxhYmVsLCBmcmFnX25vdyk7Ci0gICAgICBTX1NFVF9WQUxVRSAobGFiZWwsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgfQotfQotCi0vKiBBbGlnbiB0byBhIGdpdmVuIHBvd2VyIG9mIHR3by4gIC5hbGlnbiAwIHR1cm5zIG9mZiB0aGUgYXV0b21hdGljCi0gICBhbGlnbm1lbnQgdXNlZCBieSB0aGUgZGF0YSBjcmVhdGluZyBwc2V1ZG8tb3BzLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxpZ24gKHgpCi0gICAgIGludCB4OwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLSAgcmVnaXN0ZXIgbG9uZyB0ZW1wX2ZpbGw7Ci0gIGxvbmcgbWF4X2FsaWdubWVudCA9IDE1OwotCi0gIC8qCi0KLSAgICBvICBOb3RlIHRoYXQgdGhlIGFzc2VtYmxlciBwdWxscyBkb3duIGFueSBpbW1lZGlhdGVseSBwcmVjZWVkaW5nIGxhYmVsCi0gICAgICAgdG8gdGhlIGFsaWduZWQgYWRkcmVzcy4KLSAgICBvICBJdCdzIG5vdCBkb2N1bWVudGVkIGJ1dCBhdXRvIGFsaWdubWVudCBpcyByZWluc3RhdGVkIGJ5Ci0gICAgICAgYSAuYWxpZ24gcHNldWRvIGluc3RydWN0aW9uLgotICAgIG8gIE5vdGUgYWxzbyB0aGF0IGFmdGVyIGF1dG8gYWxpZ25tZW50IGlzIHR1cm5lZCBvZmYgdGhlIG1pcHMgYXNzZW1ibGVyCi0gICAgICAgaXNzdWVzIGFuIGVycm9yIG9uIGF0dGVtcHQgdG8gYXNzZW1ibGUgYW4gaW1wcm9wZXJseSBhbGlnbmVkIGRhdGEgaXRlbS4KLSAgICAgICBXZSBkb24ndC4KLQotICAgICovCi0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAodGVtcCA+IG1heF9hbGlnbm1lbnQpCi0gICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgdGVtcCA9IG1heF9hbGlnbm1lbnQpOwotICBlbHNlIGlmICh0ZW1wIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJBbGlnbm1lbnQgbmVnYXRpdmU6IDAgYXNzdW1lZC4iKSk7Ci0gICAgICB0ZW1wID0gMDsKLSAgICB9Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHRlbXBfZmlsbCA9IDA7Ci0gIGlmICh0ZW1wKQotICAgIHsKLSAgICAgIGF1dG9fYWxpZ24gPSAxOwotICAgICAgbWlwc19hbGlnbiAodGVtcCwgKGludCkgdGVtcF9maWxsLAotCQkgIGluc25fbGFiZWxzICE9IE5VTEwgPyBpbnNuX2xhYmVscy0+bGFiZWwgOiBOVUxMKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhdXRvX2FsaWduID0gMDsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotbWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCAoKQotewotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0gIG1pcHNfY2xlYXJfaW5zbl9sYWJlbHMgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NoYW5nZV9zZWMgKHNlYykKLSAgICAgaW50IHNlYzsKLXsKLSAgc2VnVCBzZWc7Ci0KLSAgLyogV2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlLCB3ZSBvbmx5IHVzZSB0aGUgLnRleHQsIC5saXQ4LAotICAgICAuc2RhdGEgYW5kIC5zYnNzIHNlY3Rpb25zLiAgV2UgY2hhbmdlIHRoZSAuZGF0YSBhbmQgLnJkYXRhCi0gICAgIHBzZXVkby1vcHMgdG8gdXNlIC5zZGF0YS4gICovCi0gIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLSAgICAgICYmIChzZWMgPT0gJ2QnIHx8IHNlYyA9PSAncicpKQotICAgIHNlYyA9ICdzJzsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogVGhlIEVMRiBiYWNrZW5kIG5lZWRzIHRvIGtub3cgdGhhdCB3ZSBhcmUgY2hhbmdpbmcgc2VjdGlvbnMsIHNvCi0gICAgIHRoYXQgLnByZXZpb3VzIHdvcmtzIGNvcnJlY3RseS4gIFdlIGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIGNoZWNrCi0gICAgIGZvciBhIG9ial9zZWN0aW9uX2NoYW5nZV9ob29rIG1hY3JvLCBidXQgdGhhdCBtaWdodCBiZSBjb25mdXNpbmcKLSAgICAgYXMgaXQgd291bGQgbm90IGJlIGFwcHJvcHJpYXRlIHRvIHVzZSBpdCBpbiB0aGUgc2VjdGlvbiBjaGFuZ2luZwotICAgICBmdW5jdGlvbnMgaW4gcmVhZC5jLCBzaW5jZSBvYmotZWxmLmMgaW50ZXJjZXB0cyB0aG9zZS4gIEZJWE1FOgotICAgICBUaGlzIHNob3VsZCBiZSBjbGVhbmVyLCBzb21laG93LiAgKi8KLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rICgpOwotI2VuZGlmCi0KLSAgbWlwc19lbWl0X2RlbGF5cyAoZmFsc2UpOwotICBzd2l0Y2ggKHNlYykKLSAgICB7Ci0gICAgY2FzZSAndCc6Ci0gICAgICBzX3RleHQgKDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZCc6Ci0gICAgICBzX2RhdGEgKDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnYic6Ci0gICAgICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3InOgotICAgICAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0JewotCSAgc2VnID0gc3Vic2VnX25ldyAoUkRBVEFfU0VDVElPTl9OQU1FLAotCQkJICAgIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0JICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCSAgICB7Ci0JICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNlZywKLQkJCQkgICAgIChTRUNfQUxMT0MKLQkJCQkgICAgICB8IFNFQ19MT0FECi0JCQkJICAgICAgfCBTRUNfUkVBRE9OTFkKLQkJCQkgICAgICB8IFNFQ19SRUxPQwotCQkJCSAgICAgIHwgU0VDX0RBVEEpKTsKLQkgICAgICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSAhPSAwKQotCQliZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgNCk7Ci0JICAgIH0KLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiTm8gcmVhZCBvbmx5IGRhdGEgc2VjdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIGlmIChVU0VfR0xPQkFMX1BPSU5URVJfT1BUKQotCXsKLQkgIHNlZyA9IHN1YnNlZ19uZXcgKCIuc2RhdGEiLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCSAgaWYgKE9VVFBVVF9GTEFWT1IgPT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLQkgICAgewotCSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsCi0JCQkJICAgICBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgfCBTRUNfREFUQSk7Ci0JICAgICAgaWYgKHN0cmNtcCAoVEFSR0VUX09TLCAiZWxmIikgIT0gMCkKLQkJYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcsIDQpOwotCSAgICB9Ci0JICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFzX2JhZCAoXygiR2xvYmFsIHBvaW50ZXJzIG5vdCBzdXBwb3J0ZWQ7IHJlY29tcGlsZSAtRyAwIikpOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGF1dG9fYWxpZ24gPSAxOwotfQotCi12b2lkCi1taXBzX2VuYWJsZV9hdXRvX2FsaWduICgpCi17Ci0gIGF1dG9fYWxpZ24gPSAxOwotfQotCi1zdGF0aWMgdm9pZAotc19jb25zIChsb2dfc2l6ZSkKLSAgICAgaW50IGxvZ19zaXplOwotewotICBzeW1ib2xTICpsYWJlbDsKLQotICBsYWJlbCA9IGluc25fbGFiZWxzICE9IE5VTEwgPyBpbnNuX2xhYmVscy0+bGFiZWwgOiBOVUxMOwotICBtaXBzX2VtaXRfZGVsYXlzIChmYWxzZSk7Ci0gIGlmIChsb2dfc2l6ZSA+IDAgJiYgYXV0b19hbGlnbikKLSAgICBtaXBzX2FsaWduIChsb2dfc2l6ZSwgMCwgbGFiZWwpOwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotICBjb25zICgxIDw8IGxvZ19zaXplKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZmxvYXRfY29ucyAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIHN5bWJvbFMgKmxhYmVsOwotCi0gIGxhYmVsID0gaW5zbl9sYWJlbHMgIT0gTlVMTCA/IGluc25fbGFiZWxzLT5sYWJlbCA6IE5VTEw7Ci0KLSAgbWlwc19lbWl0X2RlbGF5cyAoZmFsc2UpOwotCi0gIGlmIChhdXRvX2FsaWduKQotICAgIHsKLSAgICAgIGlmICh0eXBlID09ICdkJykKLQltaXBzX2FsaWduICgzLCAwLCBsYWJlbCk7Ci0gICAgICBlbHNlCi0JbWlwc19hbGlnbiAoMiwgMCwgbGFiZWwpOwotICAgIH0KLQotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotCi0gIGZsb2F0X2NvbnMgKHR5cGUpOwotfQotCi0vKiBIYW5kbGUgLmdsb2JsLiAgV2UgbmVlZCB0byBvdmVycmlkZSBpdCBiZWNhdXNlIG9uIElyaXggNSB5b3UgYXJlCi0gICBwZXJtaXR0ZWQgdG8gc2F5Ci0gICAgICAgLmdsb2JsIGZvbyAudGV4dAotICAgd2hlcmUgZm9vIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wsIHRvIG1lYW4gdGhhdCBmb28gc2hvdWxkIGJlCi0gICBjb25zaWRlcmVkIHRvIGJlIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX2dsb2JsICh4KQotICAgICBpbnQgeDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGZsYWd3b3JkIGZsYWc7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogT24gSXJpeCA1LCBldmVyeSBnbG9iYWwgc3ltYm9sIHRoYXQgaXMgbm90IGV4cGxpY2l0bHkgbGFiZWxsZWQgYXMKLSAgICAgYmVpbmcgYSBmdW5jdGlvbiBpcyBhcHBhcmVudGx5IGxhYmVsbGVkIGFzIGJlaW5nIGFuIG9iamVjdC4gICovCi0gIGZsYWcgPSBCU0ZfT0JKRUNUOwotCi0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBjaGFyICpzZWNuYW1lOwotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgc2VjbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChzdGRvdXRwdXQsIHNlY25hbWUpOwotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotCWFzX2JhZCAoXygiJXM6IG5vIHN1Y2ggc2VjdGlvbiIpLCBzZWNuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gICAgICBpZiAoc2VjICE9IE5VTEwgJiYgKHNlYy0+ZmxhZ3MgJiBTRUNfQ09ERSkgIT0gMCkKLQlmbGFnID0gQlNGX0ZVTkNUSU9OOwotICAgIH0KLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IGZsYWc7Ci0KLSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotc19vcHRpb24gKHgpCi0gICAgIGludCB4OwotewotICBjaGFyICpvcHQ7Ci0gIGNoYXIgYzsKLQotICBvcHQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoKm9wdCA9PSAnTycpCi0gICAgewotICAgICAgLyogRklYTUU6IFdoYXQgZG9lcyB0aGlzIG1lYW4/ICAqLwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAob3B0LCAicGljIiwgMykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgaSA9IGF0b2kgKG9wdCArIDMpOwotICAgICAgaWYgKGkgPT0gMCkKLQltaXBzX3BpYyA9IE5PX1BJQzsKLSAgICAgIGVsc2UgaWYgKGkgPT0gMikKLQltaXBzX3BpYyA9IFNWUjRfUElDOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiLm9wdGlvbiBwaWMlZCBub3Qgc3VwcG9ydGVkIiksIGkpOwotCi0gICAgICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCAmJiBtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBpZiAoZ19zd2l0Y2hfc2VlbiAmJiBnX3N3aXRjaF92YWx1ZSAhPSAwKQotCSAgICBhc193YXJuIChfKCItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBTVlI0IFBJQyBjb2RlIikpOwotCSAgZ19zd2l0Y2hfdmFsdWUgPSAwOwotCSAgYmZkX3NldF9ncF9zaXplIChzdGRvdXRwdXQsIDApOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhc193YXJuIChfKCJVbnJlY29nbml6ZWQgb3B0aW9uIFwiJXNcIiIpLCBvcHQpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGhvbGQgYSBzdGFjayBvZiAuc2V0IHZhbHVlcy4gICovCi0KLXN0cnVjdCBtaXBzX29wdGlvbl9zdGFjawotewotICBzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKm5leHQ7Ci0gIHN0cnVjdCBtaXBzX3NldF9vcHRpb25zIG9wdGlvbnM7Ci19OwotCi1zdGF0aWMgc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICptaXBzX29wdHNfc3RhY2s7Ci0KLS8qIEhhbmRsZSB0aGUgLnNldCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzc2V0ICh4KQotICAgICBpbnQgeDsKLXsKLSAgY2hhciAqbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlciwgY2g7Ci0KLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGNoID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0KLSAgaWYgKHN0cmNtcCAobmFtZSwgInJlb3JkZXIiKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChtaXBzX29wdHMubm9yZW9yZGVyICYmIHByZXZfbm9wX2ZyYWcgIT0gTlVMTCkKLQl7Ci0JICAvKiBJZiB3ZSBzdGlsbCBoYXZlIHBlbmRpbmcgbm9wcywgd2UgY2FuIGRpc2NhcmQgdGhlbS4gIFRoZQotCSAgICAgdXN1YWwgbm9wIGhhbmRsaW5nIHdpbGwgaW5zZXJ0IGFueSB0aGF0IGFyZSBzdGlsbAotCSAgICAgbmVlZGVkLiAqLwotCSAgcHJldl9ub3BfZnJhZy0+ZnJfZml4IC09IChwcmV2X25vcF9mcmFnX2hvbGRzCi0JCQkJICAgICogKG1pcHNfb3B0cy5taXBzMTYgPyAyIDogNCkpOwotCSAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0JfQotICAgICAgbWlwc19vcHRzLm5vcmVvcmRlciA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub3Jlb3JkZXIiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotICAgICAgbWlwc19vcHRzLm5vcmVvcmRlciA9IDE7Ci0gICAgICBtaXBzX2FueV9ub3Jlb3JkZXIgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiYXQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2F0ID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm5vYXQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2F0ID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1hY3JvIikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9tYWNybyIpID09IDApCi0gICAgewotICAgICAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIgPT0gMCkKLQlhc19iYWQgKF8oImBub3Jlb3JkZXInIG11c3QgYmUgc2V0IGJlZm9yZSBgbm9tYWNybyciKSk7Ci0gICAgICBtaXBzX29wdHMud2Fybl9hYm91dF9tYWNyb3MgPSAxOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibW92ZSIpID09IDAgfHwgc3RyY21wIChuYW1lLCAibm92b2xhdGlsZSIpID09IDApCi0gICAgewotICAgICAgbWlwc19vcHRzLm5vbW92ZSA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub21vdmUiKSA9PSAwIHx8IHN0cmNtcCAobmFtZSwgInZvbGF0aWxlIikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMubm9tb3ZlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImJvcHQiKSA9PSAwKQotICAgIHsKLSAgICAgIG1pcHNfb3B0cy5ub2JvcHQgPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9ib3B0IikgPT0gMCkKLSAgICB7Ci0gICAgICBtaXBzX29wdHMubm9ib3B0ID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIm1pcHMxNiIpID09IDAKLQkgICB8fCBzdHJjbXAgKG5hbWUsICJNSVBTLTE2IikgPT0gMCkKLSAgICBtaXBzX29wdHMubWlwczE2ID0gMTsKLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAibm9taXBzMTYiKSA9PSAwCi0JICAgfHwgc3RyY21wIChuYW1lLCAibm9NSVBTLTE2IikgPT0gMCkKLSAgICBtaXBzX29wdHMubWlwczE2ID0gMDsKLSAgZWxzZSBpZiAoc3RybmNtcCAobmFtZSwgIm1pcHMiLCA0KSA9PSAwKQotICAgIHsKLSAgICAgIGludCBpc2E7Ci0KLSAgICAgIC8qIFBlcm1pdCB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIElTQSBvbiB0aGUgZmx5LiAgTmVlZGxlc3MgdG8KLQkgc2F5LCBtaXN1c2UgY2FuIGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMuICAqLwotICAgICAgaXNhID0gYXRvaSAobmFtZSArIDQpOwotICAgICAgaWYgKGlzYSA9PSAwKQotCW1pcHNfb3B0cy5pc2EgPSBmaWxlX21pcHNfaXNhOwotICAgICAgZWxzZSBpZiAoaXNhIDwgMSB8fCBpc2EgPiA0KQotCWFzX2JhZCAoXygidW5rbm93biBJU0EgbGV2ZWwiKSk7Ci0gICAgICBlbHNlCi0JbWlwc19vcHRzLmlzYSA9IGlzYTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgImF1dG9leHRlbmQiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5ub2F1dG9leHRlbmQgPSAwOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJub2F1dG9leHRlbmQiKSA9PSAwKQotICAgIG1pcHNfb3B0cy5ub2F1dG9leHRlbmQgPSAxOwotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJwdXNoIikgPT0gMCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbWlwc19vcHRpb25fc3RhY2sgKnM7Ci0KLSAgICAgIHMgPSAoc3RydWN0IG1pcHNfb3B0aW9uX3N0YWNrICopIHhtYWxsb2MgKHNpemVvZiAqcyk7Ci0gICAgICBzLT5uZXh0ID0gbWlwc19vcHRzX3N0YWNrOwotICAgICAgcy0+b3B0aW9ucyA9IG1pcHNfb3B0czsKLSAgICAgIG1pcHNfb3B0c19zdGFjayA9IHM7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICJwb3AiKSA9PSAwKQotICAgIHsKLSAgICAgIHN0cnVjdCBtaXBzX29wdGlvbl9zdGFjayAqczsKLQotICAgICAgcyA9IG1pcHNfb3B0c19zdGFjazsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JYXNfYmFkIChfKCIuc2V0IHBvcCB3aXRoIG5vIC5zZXQgcHVzaCIpKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJZiB3ZSdyZSBjaGFuZ2luZyB0aGUgcmVvcmRlciBtb2RlIHdlIG5lZWQgdG8gaGFuZGxlCi0gICAgICAgICAgICAgZGVsYXkgc2xvdHMgY29ycmVjdGx5LiAgKi8KLQkgIGlmIChzLT5vcHRpb25zLm5vcmVvcmRlciAmJiAhIG1pcHNfb3B0cy5ub3Jlb3JkZXIpCi0JICAgIG1pcHNfZW1pdF9kZWxheXMgKHRydWUpOwotCSAgZWxzZSBpZiAoISBzLT5vcHRpb25zLm5vcmVvcmRlciAmJiBtaXBzX29wdHMubm9yZW9yZGVyKQotCSAgICB7Ci0JICAgICAgaWYgKHByZXZfbm9wX2ZyYWcgIT0gTlVMTCkKLQkJewotCQkgIHByZXZfbm9wX2ZyYWctPmZyX2ZpeCAtPSAocHJldl9ub3BfZnJhZ19ob2xkcwotCQkJCQkgICAgKiAobWlwc19vcHRzLm1pcHMxNiA/IDIgOiA0KSk7Ci0JCSAgcHJldl9ub3BfZnJhZyA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCi0JICBtaXBzX29wdHMgPSBzLT5vcHRpb25zOwotCSAgbWlwc19vcHRzX3N0YWNrID0gcy0+bmV4dDsKLQkgIGZyZWUgKHMpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJUcmllZCB0byBzZXQgdW5yZWNvZ25pemVkIHN5bWJvbDogJXNcbiIpLCBuYW1lKTsKLSAgICB9Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjaDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWJpY2FsbHMgcHNldWRvLW9wLiAgSSBiZWxpZXZlIHRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgLm9wdGlvbiBwaWMyLiAgSXQgbWVhbnMgdG8gZ2VuZXJhdGUgU1ZSNCBQSUMgY2FsbHMuICAqLwotCi1zdGF0aWMgdm9pZAotc19hYmljYWxscyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBtaXBzX3BpYyA9IFNWUjRfUElDOwotICBpZiAoVVNFX0dMT0JBTF9QT0lOVEVSX09QVCkKLSAgICB7Ci0gICAgICBpZiAoZ19zd2l0Y2hfc2VlbiAmJiBnX3N3aXRjaF92YWx1ZSAhPSAwKQotCWFzX3dhcm4gKF8oIi1HIG1heSBub3QgYmUgdXNlZCB3aXRoIFNWUjQgUElDIGNvZGUiKSk7Ci0gICAgICBnX3N3aXRjaF92YWx1ZSA9IDA7Ci0gICAgfQotICBiZmRfc2V0X2dwX3NpemUgKHN0ZG91dHB1dCwgMCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmNwbG9hZCBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFNWUjQKLSAgIFBJQyBjb2RlLiAgSXQgc2V0cyB0aGUgJGdwIHJlZ2lzdGVyIGZvciB0aGUgZnVuY3Rpb24gYmFzZWQgb24gdGhlCi0gICBmdW5jdGlvbiBhZGRyZXNzLCB3aGljaCBpcyBpbiB0aGUgcmVnaXN0ZXIgbmFtZWQgaW4gdGhlIGFyZ3VtZW50LgotICAgVGhpcyB1c2VzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IF9ncF9kaXNwLCB3aGljaCBpcyBoYW5kbGVkIHNwZWNpYWxseQotICAgYnkgdGhlIGxpbmtlci4gIFRoZSByZXN1bHQgaXM6Ci0JbHVpCSRncCwlaGkoX2dwX2Rpc3ApCi0JYWRkaXUJJGdwLCRncCwlbG8oX2dwX2Rpc3ApCi0JYWRkdQkkZ3AsJGdwLC5jcGxvYWQgYXJndW1lbnQKLSAgIFRoZSAuY3Bsb2FkIGFyZ3VtZW50IGlzIG5vcm1hbGx5ICQyNSA9PSAkdDkuICAqLwotCi1zdGF0aWMgdm9pZAotc19jcGxvYWQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZXhwcmVzc2lvblMgZXg7Ci0gIGludCBpY250ID0gMDsKLQotICAvKiBJZiB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgU1ZSNCBQSUMgY29kZSwgLmNwbG9hZCBpcyBpZ25vcmVkLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogLmNwbG9hZCBzaG91bGQgYmUgYSBpbiAuc2V0IG5vcmVvcmRlciBzZWN0aW9uLiAgKi8KLSAgaWYgKG1pcHNfb3B0cy5ub3Jlb3JkZXIgPT0gMCkKLSAgICBhc193YXJuIChfKCIuY3Bsb2FkIG5vdCBpbiBub3Jlb3JkZXIgc2VjdGlvbiIpKTsKLQotICBleC5YX29wID0gT19zeW1ib2w7Ci0gIGV4LlhfYWRkX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKCJfZ3BfZGlzcCIpOwotICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4LlhfYWRkX251bWJlciA9IDA7Ci0KLSAgLyogSW4gRUxGLCB0aGlzIHN5bWJvbCBpcyBpbXBsaWNpdGx5IGFuIFNUVF9PQkpFQ1Qgc3ltYm9sLiAgKi8KLSAgc3ltYm9sX2dldF9iZmRzeW0gKGV4LlhfYWRkX3N5bWJvbCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgbWFjcm9fYnVpbGRfbHVpICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4LCBHUCk7Ci0gIG1hY3JvX2J1aWxkICgoY2hhciAqKSBOVUxMLCAmaWNudCwgJmV4LCAiYWRkaXUiLCAidCxyLGoiLCBHUCwgR1AsCi0JICAgICAgIChpbnQpIEJGRF9SRUxPQ19MTzE2KTsKLQotICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLCAiYWRkdSIsICJkLHYsdCIsCi0JICAgICAgIEdQLCBHUCwgdGNfZ2V0X3JlZ2lzdGVyICgwKSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuY3ByZXN0b3JlIHBzZXVkby1vcC4gIFRoaXMgc3RvcmVzICRncCBpbnRvIGEgZ2l2ZW4KLSAgIG9mZnNldCBmcm9tICRzcC4gIFRoZSBvZmZzZXQgaXMgcmVtZW1iZXJlZCwgYW5kIGFmdGVyIG1ha2luZyBhIFBJQwotICAgY2FsbCAkZ3AgaXMgcmVzdG9yZWQgZnJvbSB0aGF0IGxvY2F0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfY3ByZXN0b3JlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4OwotICBpbnQgaWNudCA9IDA7Ci0KLSAgLyogSWYgd2UgYXJlIG5vdCBnZW5lcmF0aW5nIFNWUjQgUElDIGNvZGUsIC5jcHJlc3RvcmUgaXMgaWdub3JlZC4gICovCi0gIGlmIChtaXBzX3BpYyAhPSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzX2lnbm9yZSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG1pcHNfY3ByZXN0b3JlX29mZnNldCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotICBleC5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gIGV4LlhfYWRkX251bWJlciA9IG1pcHNfY3ByZXN0b3JlX29mZnNldDsKLQotICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsICZleCwKLQkgICAgICAgKChiZmRfYXJjaF9iaXRzX3Blcl9hZGRyZXNzIChzdGRvdXRwdXQpID09IDMyCi0JCSB8fCBtaXBzX29wdHMuaXNhIDwgMykKLQkJPyAic3ciIDogInNkIiksCi0JICAgICAgICJ0LG8oYikiLCBHUCwgKGludCkgQkZEX1JFTE9DX0xPMTYsIFNQKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5ncHdvcmQgcHNldWRvLW9wLiAgVGhpcyBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyBQSUMKLSAgIGNvZGUuICBJdCBnZW5lcmF0ZXMgYSAzMiBiaXQgR1AgcmVsYXRpdmUgcmVsb2MuICAqLwotCi1zdGF0aWMgdm9pZAotc19ncHdvcmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc3ltYm9sUyAqbGFiZWw7Ci0gIGV4cHJlc3Npb25TIGV4OwotICBjaGFyICpwOwotCi0gIC8qIFdoZW4gbm90IGdlbmVyYXRpbmcgUElDIGNvZGUsIHRoaXMgaXMgdHJlYXRlZCBhcyAud29yZC4gICovCi0gIGlmIChtaXBzX3BpYyAhPSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzX2NvbnMgKDIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsYWJlbCA9IGluc25fbGFiZWxzICE9IE5VTEwgPyBpbnNuX2xhYmVscy0+bGFiZWwgOiBOVUxMOwotICBtaXBzX2VtaXRfZGVsYXlzICh0cnVlKTsKLSAgaWYgKGF1dG9fYWxpZ24pCi0gICAgbWlwc19hbGlnbiAoMiwgMCwgbGFiZWwpOwotICBtaXBzX2NsZWFyX2luc25fbGFiZWxzICgpOwotCi0gIGV4cHJlc3Npb24gKCZleCk7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19zeW1ib2wgfHwgZXguWF9hZGRfbnVtYmVyICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnN1cHBvcnRlZCB1c2Ugb2YgLmdwd29yZCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgfQotCi0gIHAgPSBmcmFnX21vcmUgKDQpOwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIDAsIDQpOwotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgNCwgJmV4LCAwLAotCSAgICAgICBCRkRfUkVMT0NfTUlQU19HUFJFTDMyKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5jcGFkZCBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBkZWFsaW5nIHdpdGggc3dpdGNoCi0gICB0YWJsZXMgaW4gU1ZSNCBQSUMgY29kZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX2NwYWRkIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBpY250ID0gMDsKLSAgaW50IHJlZzsKLQotICAvKiBUaGlzIGlzIGlnbm9yZWQgd2hlbiBub3QgZ2VuZXJhdGluZyBTVlI0IFBJQyBjb2RlLiAgKi8KLSAgaWYgKG1pcHNfcGljICE9IFNWUjRfUElDKQotICAgIHsKLSAgICAgIHNfaWdub3JlICgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQWRkICRncCB0byB0aGUgcmVnaXN0ZXIgbmFtZWQgYXMgYW4gYXJndW1lbnQuICAqLwotICByZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOwotICBtYWNyb19idWlsZCAoKGNoYXIgKikgTlVMTCwgJmljbnQsIChleHByZXNzaW9uUyAqKSBOVUxMLAotCSAgICAgICAoKGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgPT0gMzIKLQkJIHx8IG1pcHNfb3B0cy5pc2EgPCAzKQotCQk/ICJhZGR1IiA6ICJkYWRkdSIpLAotCSAgICAgICAiZCx2LHQiLCByZWcsIHJlZywgR1ApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7ICAKLX0KLQotLyogSGFuZGxlIHRoZSAuaW5zbiBwc2V1ZG8tb3AuICBUaGlzIG1hcmtzIGluc3RydWN0aW9uIGxhYmVscyBpbgotICAgbWlwczE2IG1vZGUuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBoYW5kbGUgdGhlbSBzcGVjaWFsbHksCi0gICBzdWNoIGFzIGdlbmVyYXRpbmcgamFseCBpbnN0cnVjdGlvbnMgd2hlbiBuZWVkZWQuICBXZSBhbHNvIG1ha2UKLSAgIHRoZW0gb2RkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFzc2VtYmx5LCBpbiBvcmRlciB0byBnZW5lcmF0ZSB0aGUKLSAgIHJpZ2h0IHNvcnQgb2YgY29kZS4gIFdlIHdpbGwgbWFrZSB0aGVtIGV2ZW4gaW4gdGhlIGFkanVzdF9zeW10YWIKLSAgIHJvdXRpbmUsIHdoaWxlIGxlYXZpbmcgdGhlbSBtYXJrZWQuICBUaGlzIGlzIGNvbnZlbmllbnQgZm9yIHRoZQotICAgZGVidWdnZXIgYW5kIHRoZSBkaXNhc3NlbWJsZXIuICBUaGUgbGlua2VyIGtub3dzIHRvIG1ha2UgdGhlbSBvZGQKLSAgIGFnYWluLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfaW5zbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAobWlwc19vcHRzLm1pcHMxNikKLSAgICBtaXBzMTZfbWFya19sYWJlbHMgKCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLnN0YWJuIGRpcmVjdGl2ZS4gIFdlIG5lZWQgdGhlc2UgaW4gb3JkZXIgdG8gbWFyayBhIGxhYmVsCi0gICBhcyBiZWluZyBhIG1pcHMxNiB0ZXh0IGxhYmVsIGNvcnJlY3RseS4gIFNvbWV0aW1lcyB0aGUgY29tcGlsZXIKLSAgIHdpbGwgZW1pdCBhIGxhYmVsLCBmb2xsb3dlZCBieSBhIC5zdGFibiwgYW5kIHRoZW4gc3dpdGNoIHNlY3Rpb25zLgotICAgSWYgdGhlIGxhYmVsIGFuZCAuc3RhYm4gYXJlIGluIG1pcHMxNiBtb2RlLCB0aGVuIHRoZSBsYWJlbCBpcwotICAgcmVhbGx5IGEgbWlwczE2IHRleHQgbGFiZWwuICAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX3N0YWIgKHR5cGUpCi0gICAgIGludCB0eXBlOwotewotICBpZiAodHlwZSA9PSAnbicgJiYgbWlwc19vcHRzLm1pcHMxNikKLSAgICBtaXBzMTZfbWFya19sYWJlbHMgKCk7Ci0KLSAgc19zdGFiICh0eXBlKTsKLX0KLQotLyogSGFuZGxlIHRoZSAud2Vha2V4dCBwc2V1ZG8tb3AgYXMgZGVmaW5lZCBpbiBLYW5lIGFuZCBIZWlucmljaC4KLSAqLwotCi1zdGF0aWMgdm9pZAotc19taXBzX3dlYWtleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgU19TRVRfV0VBSyAoc3ltYm9sUCk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBpZiAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgaWYgKFNfSVNfREVGSU5FRCAoc3ltYm9sUCkpCi0JewotCSAgYXNfYmFkICgiSWdub3JpbmcgYXR0ZW1wdCB0byByZWRlZmluZSBzeW1ib2wgYCVzJy4iLAotCQkgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JfQotICAgICAgCi0gICAgICBleHByZXNzaW9uICgmZXhwKTsKLSAgICAgIGlmIChleHAuWF9vcCAhPSBPX3N5bWJvbCkKLQl7Ci0JICBhc19iYWQgKCJiYWQgLndlYWtleHQgZGlyZWN0aXZlIik7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW1ib2xQLCAmZXhwKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogUGFyc2UgYSByZWdpc3RlciBzdHJpbmcgaW50byBhIG51bWJlci4gIENhbGxlZCBmcm9tIHRoZSBFQ09GRiBjb2RlCi0gICB0byBwYXJzZSAuZnJhbWUuICBUaGUgYXJndW1lbnQgaXMgbm9uLXplcm8gaWYgdGhpcyBpcyB0aGUgZnJhbWUKLSAgIHJlZ2lzdGVyLCBzbyB0aGF0IHdlIGNhbiByZWNvcmQgaXQgaW4gbWlwc19mcmFtZV9yZWcuICAqLwotCi1pbnQKLXRjX2dldF9yZWdpc3RlciAoZnJhbWUpCi0gICAgIGludCBmcmFtZTsKLXsKLSAgaW50IHJlZzsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyQnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oImV4cGVjdGVkIGAkJyIpKTsKLSAgICAgIHJlZyA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgewotICAgICAgcmVnID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAocmVnIDwgMCB8fCByZWcgPj0gMzIpCi0JewotCSAgYXNfd2FybiAoXygiQmFkIHJlZ2lzdGVyIG51bWJlciIpKTsKLQkgIHJlZyA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJmcCIsIDIpID09IDApCi0JcmVnID0gRlA7Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJzcCIsIDIpID09IDApCi0JcmVnID0gU1A7Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJncCIsIDIpID09IDApCi0JcmVnID0gR1A7Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJhdCIsIDIpID09IDApCi0JcmVnID0gQVQ7Ci0gICAgICBlbHNlCi0JewotCSAgYXNfd2FybiAoXygiVW5yZWNvZ25pemVkIHJlZ2lzdGVyIG5hbWUiKSk7Ci0JICByZWcgPSAwOwotCX0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICAgIH0KLSAgaWYgKGZyYW1lKQotICAgIG1pcHNfZnJhbWVfcmVnID0gcmVnICE9IDAgPyByZWcgOiBTUDsKLSAgcmV0dXJuIHJlZzsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFdlIGRvbid0IG5lZWQgdG8gYWxpZ24gRUxGIHNlY3Rpb25zIHRvIHRoZSBmdWxsIGFsaWdubWVudC4KLSAgICAgSG93ZXZlciwgSXJpeCA1IG1heSBwcmVmZXIgdGhhdCB3ZSBhbGlnbiB0aGVtIGF0IGxlYXN0IHRvIGEgMTYKLSAgICAgYnl0ZSBib3VuZGFyeS4gIFdlIGRvbid0IGJvdGhlciB0byBhbGlnbiB0aGUgc2VjdGlvbnMgaWYgd2UgYXJlCi0gICAgIHRhcmdldGVkIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uICAqLwotICBpZiAoc3RyY21wIChUQVJHRVRfT1MsICJlbGYiKSA9PSAwKQotICAgIHJldHVybiBhZGRyOwotICBpZiAoYWxpZ24gPiA0KQotICAgIGFsaWduID0gNDsKLSNlbmRpZgotCi0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0vKiBVdGlsaXR5IHJvdXRpbmUsIGNhbGxlZCBmcm9tIGFib3ZlIGFzIHdlbGwuICBJZiBjYWxsZWQgd2hpbGUgdGhlCi0gICBpbnB1dCBmaWxlIGlzIHN0aWxsIGJlaW5nIHJlYWQsIGl0J3Mgb25seSBhbiBhcHByb3hpbWF0aW9uLiAgKEZvcgotICAgZXhhbXBsZSwgYSBzeW1ib2wgbWF5IGxhdGVyIGJlY29tZSBkZWZpbmVkIHdoaWNoIGFwcGVhcmVkIHRvIGJlCi0gICB1bmRlZmluZWQgZWFybGllci4pICAqLwotCi1zdGF0aWMgaW50Ci1ub3BpY19uZWVkX3JlbGF4IChzeW0sIGJlZm9yZV9yZWxheGluZykKLSAgICAgc3ltYm9sUyAqc3ltOwotICAgICBpbnQgYmVmb3JlX3JlbGF4aW5nOwotewotICBpZiAoc3ltID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKFVTRV9HTE9CQUxfUE9JTlRFUl9PUFQpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc3ltbmFtZTsKLSAgICAgIGludCBjaGFuZ2U7Ci0KLSAgICAgIC8qIEZpbmQgb3V0IHdoZXRoZXIgdGhpcyBzeW1ib2wgY2FuIGJlIHJlZmVyZW5jZWQgb2ZmIHRoZSBHUAotCSByZWdpc3Rlci4gIEl0IGNhbiBiZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIC1HIHNpemUgb3IgaWYKLQkgaXQgaXMgaW4gdGhlIC5zZGF0YSBvciAuc2JzcyBzZWN0aW9uLiAgQ2VydGFpbiBzeW1ib2xzIGNhbgotCSBub3QgYmUgcmVmZXJlbmNlZCBvZmYgdGhlIEdQLCBhbHRob3VnaCBpdCBhcHBlYXJzIGFzIHRob3VnaAotCSB0aGV5IGNhbi4gICovCi0gICAgICBzeW1uYW1lID0gU19HRVRfTkFNRSAoc3ltKTsKLSAgICAgIGlmIChzeW1uYW1lICE9IChjb25zdCBjaGFyICopIE5VTEwKLQkgICYmIChzdHJjbXAgKHN5bW5hbWUsICJlcHJvbCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJldGV4dCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJfZ3AiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiZWRhdGEiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2Zic3MiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2ZkYXRhIikgPT0gMAotCSAgICAgIHx8IHN0cmNtcCAoc3ltbmFtZSwgIl9mdGV4dCIpID09IDAKLQkgICAgICB8fCBzdHJjbXAgKHN5bW5hbWUsICJlbmQiKSA9PSAwCi0JICAgICAgfHwgc3RyY21wIChzeW1uYW1lLCAiX2dwX2Rpc3AiKSA9PSAwKSkKLQljaGFuZ2UgPSAxOwotICAgICAgZWxzZSBpZiAoKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKQotCSAgICAgICAmJiAoMAotI2lmbmRlZiBOT19FQ09GRl9ERUJVR0dJTkcKLQkJICAgfHwgKHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9leHRlcm5fc2l6ZSAhPSAwCi0JCSAgICAgICAmJiAoc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2V4dGVybl9zaXplCi0JCQkgICA8PSBnX3N3aXRjaF92YWx1ZSkpCi0jZW5kaWYKLQkJICAgLyogV2UgbXVzdCBkZWZlciB0aGlzIGRlY2lzaW9uIHVudGlsIGFmdGVyIHRoZSB3aG9sZQotCQkgICAgICBmaWxlIGhhcyBiZWVuIHJlYWQsIHNpbmNlIHRoZXJlIG1pZ2h0IGJlIGEgLmV4dGVybgotCQkgICAgICBhZnRlciB0aGUgZmlyc3QgdXNlIG9mIHRoaXMgc3ltYm9sLiAgKi8KLQkJICAgfHwgKGJlZm9yZV9yZWxheGluZwotI2lmbmRlZiBOT19FQ09GRl9ERUJVR0dJTkcKLQkJICAgICAgICYmIHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9leHRlcm5fc2l6ZSA9PSAwCi0jZW5kaWYKLQkJICAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW0pID09IDApCi0JCSAgIHx8IChTX0dFVF9WQUxVRSAoc3ltKSAhPSAwCi0JCSAgICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA8PSBnX3N3aXRjaF92YWx1ZSkpKQotCWNoYW5nZSA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgY29uc3QgY2hhciAqc2VnbmFtZTsKLQotCSAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSk7Ci0JICBhc3NlcnQgKHN0cmNtcCAoc2VnbmFtZSwgIi5saXQ4IikgIT0gMAotCQkgICYmIHN0cmNtcCAoc2VnbmFtZSwgIi5saXQ0IikgIT0gMCk7Ci0JICBjaGFuZ2UgPSAoc3RyY21wIChzZWduYW1lLCAiLnNkYXRhIikgIT0gMAotCQkgICAgJiYgc3RyY21wIChzZWduYW1lLCAiLnNic3MiKSAhPSAwKTsKLQl9Ci0gICAgICByZXR1cm4gY2hhbmdlOwotICAgIH0KLSAgZWxzZQotICAgIC8qIFdlIGFyZSBub3Qgb3B0aW1pemluZyBmb3IgdGhlIEdQIHJlZ2lzdGVyLiAgKi8KLSAgICByZXR1cm4gMTsKLX0KLQotLyogR2l2ZW4gYSBtaXBzMTYgdmFyaWFudCBmcmFnIEZSQUdQLCByZXR1cm4gbm9uLXplcm8gaWYgaXQgbmVlZHMgYW4KLSAgIGV4dGVuZGVkIG9wY29kZS4gIFNFQyBpcyB0aGUgc2VjdGlvbiB0aGUgZnJhZyBpcyBpbi4gICovCi0KLXN0YXRpYyBpbnQKLW1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgc2VjLCBzdHJldGNoKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIGxvbmcgc3RyZXRjaDsKLXsKLSAgaW50IHR5cGU7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzMTZfaW1tZWRfb3BlcmFuZCAqb3A7Ci0gIG9mZnNldFQgdmFsOwotICBpbnQgbWludGlueSwgbWF4dGlueTsKLSAgc2VnVCBzeW1zZWM7Ci0KLSAgaWYgKFJFTEFYX01JUFMxNl9VU0VSX1NNQUxMIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChSRUxBWF9NSVBTMTZfVVNFUl9FWFQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLSAgICByZXR1cm4gMTsKLQotICB0eXBlID0gUkVMQVhfTUlQUzE2X1RZUEUgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLSAgb3AgPSBtaXBzMTZfaW1tZWRfb3BlcmFuZHM7Ci0gIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQotICAgIHsKLSAgICAgICsrb3A7Ci0gICAgICBhc3NlcnQgKG9wIDwgbWlwczE2X2ltbWVkX29wZXJhbmRzICsgTUlQUzE2X05VTV9JTU1FRCk7Ci0gICAgfQotCi0gIGlmIChvcC0+dW5zcCkKLSAgICB7Ci0gICAgICBpZiAodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCi0JewotCSAgbWludGlueSA9IDE7Ci0JICBtYXh0aW55ID0gMSA8PCBvcC0+bmJpdHM7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1pbnRpbnkgPSAwOwotCSAgbWF4dGlueSA9ICgxIDw8IG9wLT5uYml0cykgLSAxOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtaW50aW55ID0gLSAoMSA8PCAob3AtPm5iaXRzIC0gMSkpOwotICAgICAgbWF4dGlueSA9ICgxIDw8IChvcC0+bmJpdHMgLSAxKSkgLSAxOwotICAgIH0KLQotICAvKiBXZSBjYW4ndCBhbHdheXMgY2FsbCBTX0dFVF9WQUxVRSBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgbG9jayBpbiBhIHBhcnRpY3VsYXIgZnJhZyBhZGRyZXNzLiAgKi8KLSAgaWYgKHN5bWJvbF9jb25zdGFudF9wIChmcmFncC0+ZnJfc3ltYm9sKSkKLSAgICB7Ci0gICAgICB2YWwgPSAoU19HRVRfVkFMVUUgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICAgICArIHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MpOwotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0gICAgfQotICBlbHNlIGlmIChzeW1ib2xfZXF1YXRlZF9wIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgICYmIChzeW1ib2xfY29uc3RhbnRfcAotCSAgICAgICAoc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfc3ltYm9sKSkpCi0gICAgewotICAgICAgc3ltYm9sUyAqZXFzeW07Ci0KLSAgICAgIGVxc3ltID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfc3ltYm9sOwotICAgICAgdmFsID0gKFNfR0VUX1ZBTFVFIChlcXN5bSkKLQkgICAgICsgc3ltYm9sX2dldF9mcmFnIChlcXN5bSktPmZyX2FkZHJlc3MKLQkgICAgICsgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChmcmFncC0+ZnJfc3ltYm9sKS0+WF9hZGRfbnVtYmVyCi0JICAgICArIHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MpOwotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoZXFzeW0pOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAxOwotCi0gIGlmIChvcC0+cGNyZWwpCi0gICAgewotICAgICAgYWRkcmVzc1QgYWRkcjsKLQotICAgICAgLyogV2Ugd29uJ3QgaGF2ZSB0aGUgc2VjdGlvbiB3aGVuIHdlIGFyZSBjYWxsZWQgZnJvbQotICAgICAgICAgbWlwc19yZWxheF9mcmFnLiAgSG93ZXZlciwgd2Ugd2lsbCBhbHdheXMgaGF2ZSBiZWVuIGNhbGxlZAotICAgICAgICAgZnJvbSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBmaXJzdC4gIElmIHRoaXMgaXMgYQotICAgICAgICAgYnJhbmNoIHRvIGEgZGlmZmVyZW50IHNlY3Rpb24sIHdlIG1hcmsgaXQgYXMgc3VjaC4gIElmIFNFQyBpcwotICAgICAgICAgTlVMTCwgYW5kIHRoZSBmcmFnIGlzIG5vdCBtYXJrZWQsIHRoZW4gaXQgbXVzdCBiZSBhIGJyYW5jaCB0bwotICAgICAgICAgdGhlIHNhbWUgc2VjdGlvbi4gICovCi0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JewotCSAgaWYgKFJFTEFYX01JUFMxNl9MT05HX0JSQU5DSCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHN5bXNlYyAhPSBzZWMpCi0JICAgIHsKLQkgICAgICBmcmFncC0+ZnJfc3VidHlwZSA9Ci0JCVJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0KLQkgICAgICAvKiBGSVhNRTogV2Ugc2hvdWxkIHN1cHBvcnQgdGhpcywgYW5kIGxldCB0aGUgbGlua2VyCi0gICAgICAgICAgICAgICAgIGNhdGNoIGJyYW5jaGVzIGFuZCBsb2FkcyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UuICAqLwotCSAgICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLAotCQkJICAgIF8oInVuc3VwcG9ydGVkIFBDIHJlbGF0aXZlIHJlZmVyZW5jZSB0byBkaWZmZXJlbnQgc2VjdGlvbiIpKTsKLQotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJbiB0aGlzIGNhc2UsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGUgc3ltYm9sIGZyYWdtZW50IGlzIGluCi0JIHRoZSBzYW1lIHNlY3Rpb24uICBJZiB0aGUgZnJfYWRkcmVzcyBvZiB0aGUgc3ltYm9sIGZyYWdtZW50Ci0JIGlzIGdyZWF0ZXIgdGhlbiB0aGUgYWRkcmVzcyBvZiB0aGlzIGZyYWdtZW50IHdlIHdhbnQgdG8gYWRkCi0JIGluIFNUUkVUQ0ggaW4gb3JkZXIgdG8gZ2V0IGEgYmV0dGVyIGVzdGltYXRlIG9mIHRoZSBhZGRyZXNzLgotCSBUaGlzIHBhcnRpY3VsYXJseSBtYXR0ZXJzIGJlY2F1c2Ugb2YgdGhlIHNoaWZ0IGJpdHMuICAqLwotICAgICAgaWYgKHN0cmV0Y2ggIT0gMAotCSAgJiYgKHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCktPmZyX2FkZHJlc3MKLQkgICAgICA+PSBmcmFncC0+ZnJfYWRkcmVzcykpCi0JewotCSAgZnJhZ1MgKmY7Ci0KLQkgIC8qIEFkanVzdCBzdHJldGNoIGZvciBhbnkgYWxpZ25tZW50IGZyYWcuICBOb3RlIHRoYXQgaWYgaGF2ZQotICAgICAgICAgICAgIGJlZW4gZXhwYW5kaW5nIHRoZSBlYXJsaWVyIGNvZGUsIHRoZSBzeW1ib2wgbWF5IGJlCi0gICAgICAgICAgICAgZGVmaW5lZCBpbiB3aGF0IGFwcGVhcnMgdG8gYmUgYW4gZWFybGllciBmcmFnLiAgRklYTUU6Ci0gICAgICAgICAgICAgVGhpcyBkb2Vzbid0IGhhbmRsZSB0aGUgZnJfc3VidHlwZSBmaWVsZCwgd2hpY2ggc3BlY2lmaWVzCi0gICAgICAgICAgICAgYSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBza2lwIHdoZW4gZG9pbmcgYW4KLSAgICAgICAgICAgICBhbGlnbm1lbnQuICAqLwotCSAgZm9yIChmID0gZnJhZ3A7Ci0JICAgICAgIGYgIT0gTlVMTCAmJiBmICE9IHN5bWJvbF9nZXRfZnJhZyAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0JICAgICAgIGYgPSBmLT5mcl9uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKGYtPmZyX3R5cGUgPT0gcnNfYWxpZ24gfHwgZi0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlKQotCQl7Ci0JCSAgaWYgKHN0cmV0Y2ggPCAwKQotCQkgICAgc3RyZXRjaCA9IC0gKCgtIHN0cmV0Y2gpCi0JCQkJICYgfiAoKDEgPDwgKGludCkgZi0+ZnJfb2Zmc2V0KSAtIDEpKTsKLQkJICBlbHNlCi0JCSAgICBzdHJldGNoICY9IH4gKCgxIDw8IChpbnQpIGYtPmZyX29mZnNldCkgLSAxKTsKLQkJICBpZiAoc3RyZXRjaCA9PSAwKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGYgIT0gTlVMTCkKLQkgICAgdmFsICs9IHN0cmV0Y2g7Ci0JfQotCi0gICAgICBhZGRyID0gZnJhZ3AtPmZyX2FkZHJlc3MgKyBmcmFncC0+ZnJfZml4OwotCi0gICAgICAvKiBUaGUgYmFzZSBhZGRyZXNzIHJ1bGVzIGFyZSBjb21wbGljYXRlZC4gIFRoZSBiYXNlIGFkZHJlc3Mgb2YKLSAgICAgICAgIGEgYnJhbmNoIGlzIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uICBUaGUgYmFzZSBhZGRyZXNzIG9mIGEKLSAgICAgICAgIFBDIHJlbGF0aXZlIGxvYWQgb3IgYWRkIGlzIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYsIGJ1dCBpZiBpdAotICAgICAgICAgaXMgaW4gYSBkZWxheSBzbG90IChpbiB3aGljaCBjYXNlIGl0IGNhbiBub3QgYmUgZXh0ZW5kZWQpIHVzZQotICAgICAgICAgdGhlIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIHdob3NlIGRlbGF5IHNsb3QgaXQgaXMgaW4uICAqLwotICAgICAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotCXsKLQkgIGFkZHIgKz0gMjsKLQotCSAgLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3N1bWluZyB0aGF0IHRoaXMgZnJhZyBzaG91bGQgYmUKLQkgICAgIGV4dGVuZGVkLCB0aGVuLCB0aGUgY3VycmVudCBhZGRyZXNzIGlzIHR3byBieXRlcwotCSAgICAgaGlnaGVyLiAqLwotCSAgaWYgKFJFTEFYX01JUFMxNl9FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICBhZGRyICs9IDI7Ci0KLQkgIC8qIElnbm9yZSB0aGUgbG93IGJpdCBpbiB0aGUgdGFyZ2V0LCBzaW5jZSBpdCB3aWxsIGJlIHNldAotICAgICAgICAgICAgIGZvciBhIHRleHQgbGFiZWwuICAqLwotCSAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCSAgICAtLXZhbDsKLQl9Ci0gICAgICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfSkFMX0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JYWRkciAtPSA0OwotICAgICAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JYWRkciAtPSAyOwotCi0gICAgICB2YWwgLT0gYWRkciAmIH4gKCgxIDw8IG9wLT5zaGlmdCkgLSAxKTsKLQotICAgICAgLyogQnJhbmNoIG9mZnNldHMgaGF2ZSBhbiBpbXBsaWNpdCAwIGluIHRoZSBsb3dlc3QgYml0LiAgKi8KLSAgICAgIGlmICh0eXBlID09ICdwJyB8fCB0eXBlID09ICdxJykKLQl2YWwgLz0gMjsKLQotICAgICAgLyogSWYgYW55IG9mIHRoZSBzaGlmdGVkIGJpdHMgYXJlIHNldCwgd2UgbXVzdCB1c2UgYW4gZXh0ZW5kZWQKLSAgICAgICAgIG9wY29kZS4gIElmIHRoZSBhZGRyZXNzIGRlcGVuZHMgb24gdGhlIHNpemUgb2YgdGhpcwotICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoaXMgY2FuIGxlYWQgdG8gYSBsb29wLCBzbyB3ZSBhcnJhbmdlIHRvIGFsd2F5cwotICAgICAgICAgdXNlIGFuIGV4dGVuZGVkIG9wY29kZS4gIFdlIG9ubHkgY2hlY2sgdGhpcyB3aGVuIHdlIGFyZSBpbgotICAgICAgICAgdGhlIG1haW4gcmVsYXhhdGlvbiBsb29wLCB3aGVuIFNFQyBpcyBOVUxMLiAgKi8KLSAgICAgIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMCAmJiBzZWMgPT0gTlVMTCkKLQl7Ci0JICBmcmFncC0+ZnJfc3VidHlwZSA9Ci0JICAgIFJFTEFYX01JUFMxNl9NQVJLX0xPTkdfQlJBTkNIIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gMTsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGFyZSBhYm91dCB0byBtYXJrIGEgZnJhZyBhcyBleHRlbmRlZCBiZWNhdXNlIHRoZSB2YWx1ZQotICAgICAgICAgaXMgcHJlY2lzZWx5IG1heHRpbnkgKyAxLCB0aGVuIHRoZXJlIGlzIGEgY2hhbmNlIG9mIGFuCi0gICAgICAgICBpbmZpbml0ZSBsb29wIGFzIGluIHRoZSBmb2xsb3dpbmcgY29kZToKLQkgICAgIGxhCSQ0LGZvbwotCSAgICAgLnNraXAJMTAyMAotCSAgICAgLmFsaWduCTIKLQkgICBmb286Ci0JIEluIHRoaXMgY2FzZSB3aGVuIHRoZSBsYSBpcyBleHRlbmRlZCwgZm9vIGlzIDB4M2ZjIGJ5dGVzCi0JIGF3YXksIHNvIHRoZSBsYSBjYW4gYmUgc2hydW5rLCBidXQgdGhlbiBmb28gaXMgMHg0MDAgYXdheSwgc28KLQkgdGhlIGxhIG11c3QgYmUgZXh0ZW5kZWQuICBUbyBhdm9pZCB0aGlzIGxvb3AsIHdlIG1hcmsgdGhlCi0JIGZyYWcgYXMgZXh0ZW5kZWQgaWYgaXQgd2FzIHNtYWxsLCBhbmQgaXMgYWJvdXQgdG8gYmVjb21lCi0JIGV4dGVuZGVkIHdpdGggYSB2YWx1ZSBvZiBtYXh0aW55ICsgMS4gICovCi0gICAgICBpZiAodmFsID09ICgobWF4dGlueSArIDEpIDw8IG9wLT5zaGlmdCkKLQkgICYmICEgUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkKLQkgICYmIHNlYyA9PSBOVUxMKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0KLQkgICAgUkVMQVhfTUlQUzE2X01BUktfTE9OR19CUkFOQ0ggKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHN5bXNlYyAhPSBhYnNvbHV0ZV9zZWN0aW9uICYmIHNlYyAhPSBOVUxMKQotICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLCBfKCJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIikpOwotCi0gIGlmICgodmFsICYgKCgxIDw8IG9wLT5zaGlmdCkgLSAxKSkgIT0gMAotICAgICAgfHwgdmFsIDwgKG1pbnRpbnkgPDwgb3AtPnNoaWZ0KQotICAgICAgfHwgdmFsID4gKG1heHRpbnkgPDwgb3AtPnNoaWZ0KSkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBFc3RpbWF0ZSB0aGUgc2l6ZSBvZiBhIGZyYWcgYmVmb3JlIHJlbGF4aW5nLiAgVW5sZXNzIHRoaXMgaXMgdGhlCi0gICBtaXBzMTYsIHdlIGFyZSBub3QgcmVhbGx5IHJlbGF4aW5nIGhlcmUsIGFuZCB0aGUgZmluYWwgc2l6ZSBpcwotICAgZW5jb2RlZCBpbiB0aGUgc3VidHlwZSBpbmZvcm1hdGlvbi4gIEZvciB0aGUgbWlwczE2LCB3ZSBoYXZlIHRvCi0gICBkZWNpZGUgd2hldGhlciB3ZSBhcmUgdXNpbmcgYW4gZXh0ZW5kZWQgb3Bjb2RlIG9yIG5vdC4gICovCi0KLS8qQVJHU1VTRUQqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZ3R5cGUpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgYXNlY3Rpb24gKnNlZ3R5cGU7Ci17Ci0gIGludCBjaGFuZ2U7Ci0KLSAgaWYgKFJFTEFYX01JUFMxNl9QIChmcmFncC0+ZnJfc3VidHlwZSkpCi0gICAgewotICAgICAgaWYgKG1pcHMxNl9leHRlbmRlZF9mcmFnIChmcmFncCwgc2VndHlwZSwgMCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSBSRUxBWF9NSVBTMTZfTUFSS19FWFRFTkRFRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgfQotCi0gIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0gICAgewotICAgICAgY2hhbmdlID0gbm9waWNfbmVlZF9yZWxheCAoZnJhZ3AtPmZyX3N5bWJvbCwgMCk7Ci0gICAgfQotICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBhc2VjdGlvbiAqc3ltc2VjOwotCi0gICAgICBzeW0gPSBmcmFncC0+ZnJfc3ltYm9sOwotCi0gICAgICAvKiBIYW5kbGUgdGhlIGNhc2Ugb2YgYSBzeW1ib2wgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbC4gICovCi0gICAgICB3aGlsZSAoc3ltYm9sX2VxdWF0ZWRfcCAoc3ltKQotCSAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW0pIHx8IFNfSVNfQ09NTU9OIChzeW0pKSkKLQl7Ci0JICBzeW1ib2xTICpuOwotCi0JICAvKiBJdCdzIHBvc3NpYmxlIHRvIGdldCBhIGxvb3AgaGVyZSBpbiBhIGJhZGx5IHdyaXR0ZW4KLSAgICAgICAgICAgICBwcm9ncmFtLiAgKi8KLQkgIG4gPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bSktPlhfYWRkX3N5bWJvbDsKLQkgIGlmIChuID09IHN5bSkKLQkgICAgYnJlYWs7Ci0JICBzeW0gPSBuOwotCX0KLQotICAgICAgc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotICAgICAgLyogVGhpcyBtdXN0IGR1cGxpY2F0ZSB0aGUgdGVzdCBpbiBhZGp1c3RfcmVsb2Nfc3ltcy4gICovCi0gICAgICBjaGFuZ2UgPSAoc3ltc2VjICE9ICZiZmRfdW5kX3NlY3Rpb24KLQkJJiYgc3ltc2VjICE9ICZiZmRfYWJzX3NlY3Rpb24KLQkJJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNlYykpOwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotCi0gIGlmIChjaGFuZ2UpCi0gICAgewotICAgICAgLyogUmVjb3JkIHRoZSBvZmZzZXQgdG8gdGhlIGZpcnN0IHJlbG9jIGluIHRoZSBmcl9vcGNvZGUgZmllbGQuCi0JIFRoaXMgbGV0cyBtZF9jb252ZXJ0X2ZyYWcgYW5kIHRjX2dlbl9yZWxvYyBrbm93IHRoYXQgdGhlIGNvZGUKLQkgbXVzdCBiZSBleHBhbmRlZC4gICovCi0gICAgICBmcmFncC0+ZnJfb3Bjb2RlID0gKGZyYWdwLT5mcl9saXRlcmFsCi0JCQkgICsgZnJhZ3AtPmZyX2ZpeAotCQkJICAtIFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpCi0JCQkgICsgUkVMQVhfUkVMT0MxIChmcmFncC0+ZnJfc3VidHlwZSkpOwotICAgICAgLyogRklYTUU6IFRoaXMgcmVhbGx5IG5lZWRzIGFzX3dhcm5fd2hlcmUuICAqLwotICAgICAgaWYgKFJFTEFYX1dBUk4gKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlhc193YXJuIChfKCJBVCB1c2VkIGFmdGVyIFwiLnNldCBub2F0XCIgb3IgbWFjcm8gdXNlZCBhZnRlciBcIi5zZXQgbm9tYWNyb1wiIikpOwotICAgIH0KLQotICBpZiAoISBjaGFuZ2UpCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gUkVMQVhfTkVXIChmcmFncC0+ZnJfc3VidHlwZSkgLSBSRUxBWF9PTEQgKGZyYWdwLT5mcl9zdWJ0eXBlKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgdG8gc2VlIHdoZXRoZXIgYSByZWxvYyBhZ2FpbnN0IGEgZGVmaW5lZCBzeW1ib2wKLSAgIHNob3VsZCBiZSBjb252ZXJ0ZWQgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLiAgRG9uJ3QgYWRqdXN0Ci0gICBNSVBTMTYganVtcCByZWxvY2F0aW9ucywgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgZm9ybWF0Ci0gICBvZiB0aGUgb2Zmc2V0IGluIHRoZSAubyBmaWxlLiAgRG9uJ3QgYWRqdXN0IHJlbG9jYXRpb25zIGFnYWluc3QKLSAgIG1pcHMxNiBzeW1ib2xzLCBzbyB0aGF0IHRoZSBsaW5rZXIgY2FuIGZpbmQgdGhlbSBpZiBpdCBuZWVkcyB0byBzZXQKLSAgIHVwIGEgc3R1Yi4gICovCi0KLWludAotbWlwc19maXhfYWRqdXN0YWJsZSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQUzE2X0pNUCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSNpZmRlZiBPQkpfRUxGCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLSAgICAgICYmIFNfR0VUX09USEVSIChmaXhwLT5meF9hZGRzeSkgPT0gU1RPX01JUFMxNgotICAgICAgJiYgZml4cC0+Znhfc3Vic3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotICByZXR1cm4gMTsKLX0KLQotLyogVHJhbnNsYXRlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHJlbG9jYXRpb24gaW5mbyB0byBCRkQgdGFyZ2V0Ci0gICBmb3JtYXQuICAqLwotCi1hcmVsZW50ICoqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeHApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhwOwotewotICBzdGF0aWMgYXJlbGVudCAqcmV0dmFsWzRdOwotICBhcmVsZW50ICpyZWxvYzsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgcmVsb2MgPSByZXR2YWxbMF0gPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmV0dmFsWzFdID0gTlVMTDsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIGlmIChtaXBzX3BpYyA9PSBFTUJFRERFRF9QSUMKLSAgICAgICYmIFNXSVRDSF9UQUJMRSAoZml4cCkpCi0gICAgewotICAgICAgLyogRm9yIGEgc3dpdGNoIHRhYmxlIGVudHJ5IHdlIHVzZSBhIHNwZWNpYWwgcmVsb2MuICBUaGUgYWRkZW5kCi0JIGlzIGFjdHVhbGx5IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHJlbG9jIGFkZHJlc3MgYW5kIHRoZQotCSBzdWJ0cmFoZW5kLiAgKi8KLSAgICAgIHJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzcyAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBpZiAoT1VUUFVUX0ZMQVZPUiAhPSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIpCi0JYXNfZmF0YWwgKF8oIkRvdWJsZSBjaGVjayBmeF9yX3R5cGUgaW4gdGMtbWlwcy5jOnRjX2dlbl9yZWxvYyIpKTsKLSAgICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19HUFJFTDMyOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9MTzE2KQotICAgIHsKLSAgICAgIC8qIFdlIHVzZSBhIHNwZWNpYWwgYWRkZW5kIGZvciBhbiBpbnRlcm5hbCBSRUxMTyByZWxvYy4gICovCi0gICAgICBpZiAoc3ltYm9sX3NlY3Rpb25fcCAoZml4cC0+ZnhfYWRkc3kpKQotCXJlbG9jLT5hZGRlbmQgPSByZWxvYy0+YWRkcmVzcyAtIFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0gICAgICBlbHNlCi0JcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlciArIHJlbG9jLT5hZGRyZXNzOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QQ1JFTF9ISTE2X1MpCi0gICAgewotICAgICAgYXNzZXJ0IChmaXhwLT5meF9uZXh0ICE9IE5VTEwKLQkgICAgICAmJiBmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1BDUkVMX0xPMTYpOwotICAgICAgLyogV2UgdXNlIGEgc3BlY2lhbCBhZGRlbmQgZm9yIGFuIGludGVybmFsIFJFTEhJIHJlbG9jLiAgVGhlCi0JIHJlbG9jIGlzIHJlbGF0aXZlIHRvIHRoZSBSRUxMTzsgYWRqdXN0IHRoZSBhZGRlbmQKLQkgYWNjb3JkaW5nbHkuICAqLwotICAgICAgaWYgKHN5bWJvbF9zZWN0aW9uX3AgKGZpeHAtPmZ4X2FkZHN5KSkKLQlyZWxvYy0+YWRkZW5kID0gKGZpeHAtPmZ4X25leHQtPmZ4X2ZyYWctPmZyX2FkZHJlc3MKLQkJCSArIGZpeHAtPmZ4X25leHQtPmZ4X3doZXJlCi0JCQkgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpKTsKLSAgICAgIGVsc2UKLQlyZWxvYy0+YWRkZW5kID0gKGZpeHAtPmZ4X2FkZG51bWJlcgotCQkJICsgZml4cC0+ZnhfbmV4dC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcwotCQkJICsgZml4cC0+ZnhfbmV4dC0+Znhfd2hlcmUpOwotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfcGNyZWwgPT0gMCkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9hb3V0X2ZsYXZvdXIpCi0JLyogQSBncnVlc29tZSBoYWNrIHdoaWNoIGlzIGEgcmVzdWx0IG9mIHRoZSBncnVlc29tZSBnYXMgcmVsb2MKLQkgICBoYW5kbGluZy4gICovCi0JcmVsb2MtPmFkZGVuZCA9IHJlbG9jLT5hZGRyZXNzOwotICAgICAgZWxzZQotCXJlbG9jLT5hZGRlbmQgPSAtcmVsb2MtPmFkZHJlc3M7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSB2YXJpYW50IGZyYWcsIHdlIG1heSBuZWVkIHRvIGFkanVzdCB0aGUgZXhpc3RpbmcKLSAgICAgcmVsb2MgYW5kIGdlbmVyYXRlIGEgbmV3IG9uZS4gICovCi0gIGlmIChmaXhwLT5meF9mcmFnLT5mcl9vcGNvZGUgIT0gTlVMTAotICAgICAgJiYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTAotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVDE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTDE2Ci0JICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR09UX0hJMTYKLQkgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTExfSEkxNgotCSAgfHwgZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0NBTExfTE8xNikpCi0gICAgewotICAgICAgYXJlbGVudCAqcmVsb2MyOwotCi0gICAgICBhc3NlcnQgKCEgUkVMQVhfTUlQUzE2X1AgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpKTsKLQotICAgICAgLyogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgcmVsb2MgaW4gdGhpcyBmcmFnLCB0aGVuIHdlIGhhdmUgdHdvCi0JIEdQUkVMIHJlbG9jcywgb3IgYSBHT1RfSEkxNi9HT1RfTE8xNiBwYWlyLCBvciBhCi0JIENBTExfSEkxNi9DQUxMX0xPMTYsIGJvdGggb2Ygd2hpY2ggYXJlIGJlaW5nIHJlcGxhY2VkLiAgTGV0Ci0JIHRoZSBzZWNvbmQgb25lIGhhbmRsZSBhbGwgb2YgdGhlbS4gICovCi0gICAgICBpZiAoZml4cC0+ZnhfbmV4dCAhPSBOVUxMCi0JICAmJiBmaXhwLT5meF9mcmFnID09IGZpeHAtPmZ4X25leHQtPmZ4X2ZyYWcpCi0JewotCSAgYXNzZXJ0ICgoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dQUkVMCi0JCSAgICYmIGZpeHAtPmZ4X25leHQtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfTUlQU19HUFJFTCkKLQkJICB8fCAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19NSVBTX0dPVF9ISTE2Ci0JCSAgICAgICYmIChmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUKLQkJCSAgPT0gQkZEX1JFTE9DX01JUFNfR09UX0xPMTYpKQotCQkgIHx8IChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9ISTE2Ci0JCSAgICAgICYmIChmaXhwLT5meF9uZXh0LT5meF9yX3R5cGUKLQkJCSAgPT0gQkZEX1JFTE9DX01JUFNfQ0FMTF9MTzE2KSkpOwotCSAgcmV0dmFsWzBdID0gTlVMTDsKLQkgIHJldHVybiByZXR2YWw7Ci0JfQotCi0gICAgICBmaXhwLT5meF93aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX29wY29kZSAtIGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWw7Ci0gICAgICByZWxvYy0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIHJlbG9jMiA9IHJldHZhbFsxXSA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotICAgICAgcmV0dmFsWzJdID0gTlVMTDsKLSAgICAgIHJlbG9jMi0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgICAgICpyZWxvYzItPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIHJlbG9jMi0+YWRkcmVzcyA9IChyZWxvYy0+YWRkcmVzcwotCQkJICsgKFJFTEFYX1JFTE9DMiAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkKLQkJCSAgICAtIFJFTEFYX1JFTE9DMSAoZml4cC0+ZnhfZnJhZy0+ZnJfc3VidHlwZSkpKTsKLSAgICAgIHJlbG9jMi0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICAgICAgcmVsb2MyLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBCRkRfUkVMT0NfTE8xNik7Ci0gICAgICBhc3NlcnQgKHJlbG9jMi0+aG93dG8gIT0gTlVMTCk7Ci0KLSAgICAgIGlmIChSRUxBWF9SRUxPQzMgKGZpeHAtPmZ4X2ZyYWctPmZyX3N1YnR5cGUpKQotCXsKLQkgIGFyZWxlbnQgKnJlbG9jMzsKLQotCSAgcmVsb2MzID0gcmV0dmFsWzJdID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0JICByZXR2YWxbM10gPSBOVUxMOwotCSAgKnJlbG9jMyA9ICpyZWxvYzI7Ci0JICByZWxvYzMtPmFkZHJlc3MgKz0gNDsKLQl9Ci0KLSAgICAgIGlmIChtaXBzX3BpYyA9PSBOT19QSUMpCi0JewotCSAgYXNzZXJ0IChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX01JUFNfR1BSRUwpOwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX0hJMTZfUzsKLQl9Ci0gICAgICBlbHNlIGlmIChtaXBzX3BpYyA9PSBTVlI0X1BJQykKLQl7Ci0JICBzd2l0Y2ggKGZpeHAtPmZ4X3JfdHlwZSkKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0ICgpOwotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0dPVDE2OgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJGRF9SRUxPQ19NSVBTX0NBTEwxNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19HT1RfTE8xNjoKLQkgICAgY2FzZSBCRkRfUkVMT0NfTUlQU19DQUxMX0xPMTY6Ci0JICAgICAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX01JUFNfR09UMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFNpbmNlIE1JUFMgRUxGIHVzZXMgUmVsIGluc3RlYWQgb2YgUmVsYSwgZW5jb2RlIHRoZSB2dGFibGUgZW50cnkKLSAgICAgdG8gYmUgdXNlZCBpbiB0aGUgcmVsb2NhdGlvbidzIHNlY3Rpb24gb2Zmc2V0LiAgKi8KLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHsKLSAgICAgIHJlbG9jLT5hZGRyZXNzID0gcmVsb2MtPmFkZGVuZDsKLSAgICAgIHJlbG9jLT5hZGRlbmQgPSAwOwotICAgIH0KLQotICAvKiBTaW5jZSBESUZGX0VYUFJfT0sgaXMgZGVmaW5lZCBpbiB0Yy1taXBzLmgsIGl0IGlzIHBvc3NpYmxlIHRoYXQKLSAgICAgZml4dXBfc2VnbWVudCBjb252ZXJ0ZWQgYSBub24tUEMgcmVsYXRpdmUgcmVsb2MgaW50byBhIFBDCi0gICAgIHJlbGF0aXZlIHJlbG9jLiAgSW4gc3VjaCBhIGNhc2UsIHdlIG5lZWQgdG8gY29udmVydCB0aGUgcmVsb2MKLSAgICAgY29kZS4gICovCi0gIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNvZGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzg6Ci0JICBjb2RlID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMTZfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ18zMjoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ182NDoKLQkgIGNvZGUgPSBCRkRfUkVMT0NfNjRfUENSRUw7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ184X1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzY0X1BDUkVMOgotCWNhc2UgQkZEX1JFTE9DXzE2X1BDUkVMX1MyOgotCWNhc2UgQkZEX1JFTE9DX1BDUkVMX0hJMTZfUzoKLQljYXNlIEJGRF9SRUxPQ19QQ1JFTF9MTzE2OgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCV8oIkNhbm5vdCBtYWtlICVzIHJlbG9jYXRpb24gUEMgcmVsYXRpdmUiKSwKLQkJCWJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChjb2RlKSk7Ci0JfQotICAgIH0KLQotICAvKiBUbyBzdXBwb3J0IGEgUEMgcmVsYXRpdmUgcmVsb2Mgd2hlbiBnZW5lcmF0aW5nIGVtYmVkZGVkIFBJQyBjb2RlCi0gICAgIGZvciBFQ09GRiwgd2UgdXNlIGEgQ3lnbnVzIGV4dGVuc2lvbi4gIFdlIGNoZWNrIGZvciB0aGF0IGhlcmUgdG8KLSAgICAgbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgbGV0IHN1Y2ggYSByZWxvYyBlc2NhcGUgbm9ybWFsbHkuICAqLwotICBpZiAoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIKLSAgICAgICYmIGNvZGUgPT0gQkZEX1JFTE9DXzE2X1BDUkVMX1MyCi0gICAgICAmJiBtaXBzX3BpYyAhPSBFTUJFRERFRF9QSUMpCi0gICAgcmVsb2MtPmhvd3RvID0gTlVMTDsKLSAgZWxzZQotICAgIHJlbG9jLT5ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBjb2RlKTsKLQotICBpZiAocmVsb2MtPmhvd3RvID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGNvZGUpKTsKLSAgICAgIHJldHZhbFswXSA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qIFJlbGF4IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gIFRoaXMgcmV0dXJucyB0aGUgYW1vdW50IGJ5IHdoaWNoCi0gICB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBmcmFnIHNob3VsZCBjaGFuZ2UuICAqLwotCi1pbnQKLW1pcHNfcmVsYXhfZnJhZyAoZnJhZ3AsIHN0cmV0Y2gpCi0gICAgIGZyYWdTICpmcmFncDsKLSAgICAgbG9uZyBzdHJldGNoOwotewotICBpZiAoISBSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHJldHVybiAwOwotCi0gIGlmIChtaXBzMTZfZXh0ZW5kZWRfZnJhZyAoZnJhZ3AsIChhc2VjdGlvbiAqKSBOVUxMLCBzdHJldGNoKSkKLSAgICB7Ci0gICAgICBpZiAoUkVMQVhfTUlQUzE2X0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSkpCi0JcmV0dXJuIDA7Ci0gICAgICBmcmFncC0+ZnJfc3VidHlwZSA9IFJFTEFYX01JUFMxNl9NQVJLX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoISBSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQlyZXR1cm4gMDsKLSAgICAgIGZyYWdwLT5mcl9zdWJ0eXBlID0gUkVMQVhfTUlQUzE2X0NMRUFSX0VYVEVOREVEIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICByZXR1cm4gLTI7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBDb252ZXJ0IGEgbWFjaGluZSBkZXBlbmRlbnQgZnJhZy4gICovCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgYXNlYywgZnJhZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc2VnVCBhc2VjOwotICAgICBmcmFnUyAqZnJhZ3A7Ci17Ci0gIGludCBvbGQsIG5ldzsKLSAgY2hhciAqZml4cHRyOwotCi0gIGlmIChSRUxBWF9NSVBTMTZfUCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotICAgIHsKLSAgICAgIGludCB0eXBlOwotICAgICAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1pcHMxNl9pbW1lZF9vcGVyYW5kICpvcDsKLSAgICAgIGJvb2xlYW4gc21hbGwsIGV4dDsKLSAgICAgIG9mZnNldFQgdmFsOwotICAgICAgYmZkX2J5dGUgKmJ1ZjsKLSAgICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGV4dGVuZDsKLQotICAgICAgdHlwZSA9IFJFTEFYX01JUFMxNl9UWVBFIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICBvcCA9IG1pcHMxNl9pbW1lZF9vcGVyYW5kczsKLSAgICAgIHdoaWxlIChvcC0+dHlwZSAhPSB0eXBlKQotCSsrb3A7Ci0KLSAgICAgIGlmIChSRUxBWF9NSVBTMTZfRVhURU5ERUQgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQl7Ci0JICBzbWFsbCA9IGZhbHNlOwotCSAgZXh0ID0gdHJ1ZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc21hbGwgPSB0cnVlOwotCSAgZXh0ID0gZmFsc2U7Ci0JfQotCi0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZ3AtPmZyX3N5bWJvbCwgMSk7Ci0gICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoZnJhZ3AtPmZyX3N5bWJvbCk7Ci0gICAgICBpZiAob3AtPnBjcmVsKQotCXsKLQkgIGFkZHJlc3NUIGFkZHI7Ci0KLQkgIGFkZHIgPSBmcmFncC0+ZnJfYWRkcmVzcyArIGZyYWdwLT5mcl9maXg7Ci0KLQkgIC8qIFRoZSBydWxlcyBmb3IgdGhlIGJhc2UgYWRkcmVzcyBvZiBhIFBDIHJlbGF0aXZlIHJlbG9jIGFyZQotICAgICAgICAgICAgIGNvbXBsaWNhdGVkOyBzZWUgbWlwczE2X2V4dGVuZGVkX2ZyYWcuICAqLwotCSAgaWYgKHR5cGUgPT0gJ3AnIHx8IHR5cGUgPT0gJ3EnKQotCSAgICB7Ci0JICAgICAgYWRkciArPSAyOwotCSAgICAgIGlmIChleHQpCi0JCWFkZHIgKz0gMjsKLQkgICAgICAvKiBJZ25vcmUgdGhlIGxvdyBiaXQgaW4gdGhlIHRhcmdldCwgc2luY2UgaXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICBzZXQgZm9yIGEgdGV4dCBsYWJlbC4gICovCi0JICAgICAgaWYgKCh2YWwgJiAxKSAhPSAwKQotCQktLXZhbDsKLQkgICAgfQotCSAgZWxzZSBpZiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpKQotCSAgICBhZGRyIC09IDQ7Ci0JICBlbHNlIGlmIChSRUxBWF9NSVBTMTZfRFNMT1QgKGZyYWdwLT5mcl9zdWJ0eXBlKSkKLQkgICAgYWRkciAtPSAyOwotCi0JICBhZGRyICY9IH4gKGFkZHJlc3NUKSAoKDEgPDwgb3AtPnNoaWZ0KSAtIDEpOwotCSAgdmFsIC09IGFkZHI7Ci0KLQkgIC8qIE1ha2Ugc3VyZSB0aGUgc2VjdGlvbiB3aW5kcyB1cCB3aXRoIHRoZSBhbGlnbm1lbnQgd2UgaGF2ZQotICAgICAgICAgICAgIGFzc3VtZWQuICAqLwotCSAgaWYgKG9wLT5zaGlmdCA+IDApCi0JICAgIHJlY29yZF9hbGlnbm1lbnQgKGFzZWMsIG9wLT5zaGlmdCk7Ci0JfQotCi0gICAgICBpZiAoZXh0Ci0JICAmJiAoUkVMQVhfTUlQUzE2X0pBTF9EU0xPVCAoZnJhZ3AtPmZyX3N1YnR5cGUpCi0JICAgICAgfHwgUkVMQVhfTUlQUzE2X0RTTE9UIChmcmFncC0+ZnJfc3VidHlwZSkpKQotCWFzX3dhcm5fd2hlcmUgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwKLQkJICAgICAgIF8oImV4dGVuZGVkIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiKSk7Ci0KLSAgICAgIGJ1ZiA9IChiZmRfYnl0ZSAqKSAoZnJhZ3AtPmZyX2xpdGVyYWwgKyBmcmFncC0+ZnJfZml4KTsKLQotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWluc24gPSBiZmRfZ2V0YjE2IChidWYpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDE2IChidWYpOwotCi0gICAgICBtaXBzMTZfaW1tZWQgKGZyYWdwLT5mcl9maWxlLCBmcmFncC0+ZnJfbGluZSwgdHlwZSwgdmFsLAotCQkgICAgUkVMQVhfTUlQUzE2X1VTRVJfRVhUIChmcmFncC0+ZnJfc3VidHlwZSksCi0JCSAgICBzbWFsbCwgZXh0LCAmaW5zbiwgJnVzZV9leHRlbmQsICZleHRlbmQpOwotCi0gICAgICBpZiAodXNlX2V4dGVuZCkKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgMHhmMDAwIHwgZXh0ZW5kLCAyKTsKLQkgIGZyYWdwLT5mcl9maXggKz0gMjsKLQkgIGJ1ZiArPSAyOwotCX0KLQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIGluc24sIDIpOwotICAgICAgZnJhZ3AtPmZyX2ZpeCArPSAyOwotICAgICAgYnVmICs9IDI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGZyYWdwLT5mcl9vcGNvZGUgPT0gTlVMTCkKLQlyZXR1cm47Ci0KLSAgICAgIG9sZCA9IFJFTEFYX09MRCAoZnJhZ3AtPmZyX3N1YnR5cGUpOwotICAgICAgbmV3ID0gUkVMQVhfTkVXIChmcmFncC0+ZnJfc3VidHlwZSk7Ci0gICAgICBmaXhwdHIgPSBmcmFncC0+ZnJfbGl0ZXJhbCArIGZyYWdwLT5mcl9maXg7Ci0KLSAgICAgIGlmIChuZXcgPiAwKQotCW1lbWNweSAoZml4cHRyIC0gb2xkLCBmaXhwdHIsIG5ldyk7Ci0KLSAgICAgIGZyYWdwLT5mcl9maXggKz0gbmV3IC0gb2xkOwotICAgIH0KLX0KLQotI2lmZGVmIE9CSl9FTEYKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHJlbG9jcyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotICAgV2UndmUgYmVlbiBzdG9yaW5nIG1pcHMxNiB0ZXh0IGxhYmVscyBhcyBvZGQuICBIZXJlIHdlIGNvbnZlcnQgdGhlbQotICAgYmFjayB0byBldmVuIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgdGhlIGRlYnVnZ2VyLiAgKi8KLQotdm9pZAotbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpCi17Ci0gIGFzeW1ib2wgKipzeW1zOwotICB1bnNpZ25lZCBpbnQgY291bnQsIGk7Ci0KLSAgaWYgKE9VVFBVVF9GTEFWT1IgIT0gYmZkX3RhcmdldF9lbGZfZmxhdm91cikKLSAgICByZXR1cm47Ci0KLSAgc3ltcyA9IGJmZF9nZXRfb3V0c3ltYm9scyAoc3Rkb3V0cHV0KTsKLSAgY291bnQgPSBiZmRfZ2V0X3N5bWNvdW50IChzdGRvdXRwdXQpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3ltcysrKQotICAgIHsKLSAgICAgIGlmIChlbGZfc3ltYm9sICgqc3ltcyktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIgPT0gU1RPX01JUFMxNgotCSAgJiYgKCgqc3ltcyktPnZhbHVlICYgMSkgIT0gMCkKLQl7Ci0JICAoKnN5bXMpLT52YWx1ZSAmPSB+MTsKLQkgIC8qIElmIHRoZSBzeW1ib2wgaGFzIGFuIG9kZCBzaXplLCBpdCB3YXMgcHJvYmFibHkgY29tcHV0ZWQKLQkgICAgIGluY29ycmVjdGx5LCBzbyBhZGp1c3QgdGhhdCBhcyB3ZWxsLiAgKi8KLQkgIGlmICgoZWxmX3N5bWJvbCAoKnN5bXMpLT5pbnRlcm5hbF9lbGZfc3ltLnN0X3NpemUgJiAxKSAhPSAwKQotCSAgICArK2VsZl9zeW1ib2wgKCpzeW1zKS0+aW50ZXJuYWxfZWxmX3N5bS5zdF9zaXplOwotCX0KLSAgICB9Ci19Ci0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIGxhYmVsIGlzIGRlZmluZWQuICBJdCBpcyB1c2VkCi0gICB3aGVuIGhhbmRsaW5nIGJyYW5jaCBkZWxheXM7IGlmIGEgYnJhbmNoIGhhcyBhIGxhYmVsLCB3ZSBhc3N1bWUgd2UKLSAgIGNhbiBub3QgbW92ZSBpdC4gICovCi0KLXZvaWQKLW1pcHNfZGVmaW5lX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3RydWN0IGluc25fbGFiZWxfbGlzdCAqbDsKLQotICBpZiAoZnJlZV9pbnNuX2xhYmVscyA9PSBOVUxMKQotICAgIGwgPSAoc3RydWN0IGluc25fbGFiZWxfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKmwpOwotICBlbHNlCi0gICAgewotICAgICAgbCA9IGZyZWVfaW5zbl9sYWJlbHM7Ci0gICAgICBmcmVlX2luc25fbGFiZWxzID0gbC0+bmV4dDsKLSAgICB9Ci0KLSAgbC0+bGFiZWwgPSBzeW07Ci0gIGwtPm5leHQgPSBpbnNuX2xhYmVsczsKLSAgaW5zbl9sYWJlbHMgPSBsOwotfQotDAotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0KLS8qIFNvbWUgc3BlY2lhbCBwcm9jZXNzaW5nIGZvciBhIE1JUFMgRUxGIGZpbGUuICAqLwotCi12b2lkCi1taXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nICgpCi17Ci0gIC8qIFdyaXRlIG91dCB0aGUgcmVnaXN0ZXIgaW5mb3JtYXRpb24uICAqLwotICBpZiAoISBtaXBzXzY0KQotICAgIHsKLSAgICAgIEVsZjMyX1JlZ0luZm8gczsKLQotICAgICAgcy5yaV9ncHJtYXNrID0gbWlwc19ncHJtYXNrOwotICAgICAgcy5yaV9jcHJtYXNrWzBdID0gbWlwc19jcHJtYXNrWzBdOwotICAgICAgcy5yaV9jcHJtYXNrWzFdID0gbWlwc19jcHJtYXNrWzFdOwotICAgICAgcy5yaV9jcHJtYXNrWzJdID0gbWlwc19jcHJtYXNrWzJdOwotICAgICAgcy5yaV9jcHJtYXNrWzNdID0gbWlwc19jcHJtYXNrWzNdOwotICAgICAgLyogVGhlIGdwX3ZhbHVlIGZpZWxkIGlzIHNldCBieSB0aGUgTUlQUyBFTEYgYmFja2VuZC4gICovCi0KLSAgICAgIGJmZF9taXBzX2VsZjMyX3N3YXBfcmVnaW5mb19vdXQgKHN0ZG91dHB1dCwgJnMsCi0JCQkJICAgICAgICgoRWxmMzJfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkJCQltaXBzX3JlZ21hc2tfZnJhZykpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gczsKLQotICAgICAgcy5yaV9ncHJtYXNrID0gbWlwc19ncHJtYXNrOwotICAgICAgcy5yaV9wYWQgPSAwOwotICAgICAgcy5yaV9jcHJtYXNrWzBdID0gbWlwc19jcHJtYXNrWzBdOwotICAgICAgcy5yaV9jcHJtYXNrWzFdID0gbWlwc19jcHJtYXNrWzFdOwotICAgICAgcy5yaV9jcHJtYXNrWzJdID0gbWlwc19jcHJtYXNrWzJdOwotICAgICAgcy5yaV9jcHJtYXNrWzNdID0gbWlwc19jcHJtYXNrWzNdOwotICAgICAgLyogVGhlIGdwX3ZhbHVlIGZpZWxkIGlzIHNldCBieSB0aGUgTUlQUyBFTEYgYmFja2VuZC4gICovCi0KLSAgICAgIGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQgKHN0ZG91dHB1dCwgJnMsCi0JCQkJICAgICAgICgoRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbyAqKQotCQkJCQltaXBzX3JlZ21hc2tfZnJhZykpOwotICAgIH0KLQotICAvKiBTZXQgdGhlIE1JUFMgRUxGIGZsYWcgYml0cy4gIEZJWE1FOiBUaGVyZSBzaG91bGQgcHJvYmFibHkgYmUgc29tZQotICAgICBzb3J0IG9mIEJGRCBpbnRlcmZhY2UgZm9yIHRoaXMuICAqLwotICBpZiAobWlwc19hbnlfbm9yZW9yZGVyKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU19OT1JFT1JERVI7Ci0gIGlmIChtaXBzX3BpYyAhPSBOT19QSUMpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9NSVBTX1BJQzsKLQotICAvKiBTZXQgdGhlIE1JUFMgRUxGIEFCSSBmbGFncy4gKi8KLSAgaWYgKG1pcHNfYWJpX3N0cmluZyA9PSAwKQotICAgIDsKLSAgZWxzZSBpZiAoc3RyY21wIChtaXBzX2FiaV9zdHJpbmcsIjMyIikgPT0gMCkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfTzMyOwotICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywibzY0IikgPT0gMCkKLSAgICBlbGZfZWxmaGVhZGVyIChzdGRvdXRwdXQpLT5lX2ZsYWdzIHw9IEVfTUlQU19BQklfTzY0OwotICBlbHNlIGlmIChzdHJjbXAgKG1pcHNfYWJpX3N0cmluZywiZWFiaSIpID09IDApCi0gICAgewotICAgICAgaWYgKG1pcHNfZWFiaTY0KQotCWVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRV9NSVBTX0FCSV9FQUJJNjQ7Ci0gICAgICBlbHNlCi0JZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFX01JUFNfQUJJX0VBQkkzMjsKLSAgICB9Ci0KLSAgaWYgKG1pcHNfMzJiaXRtb2RlKQotICAgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfTUlQU18zMkJJVE1PREU7Ci19Ci0KLSNlbmRpZiAvKiBPQkpfRUxGIHx8IE9CSl9NQVlCRV9FTEYgKi8KLQwKLXR5cGVkZWYgc3RydWN0IHByb2MKLSAgewotICAgIHN5bWJvbFMgKmlzeW07Ci0gICAgdW5zaWduZWQgbG9uZyByZWdfbWFzazsKLSAgICB1bnNpZ25lZCBsb25nIHJlZ19vZmZzZXQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmcHJlZ19tYXNrOwotICAgIHVuc2lnbmVkIGxvbmcgZnByZWdfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfb2Zmc2V0OwotICAgIHVuc2lnbmVkIGxvbmcgZnJhbWVfcmVnOwotICAgIHVuc2lnbmVkIGxvbmcgcGNfcmVnOwotICB9Ci1wcm9jUzsKLQotc3RhdGljIHByb2NTIGN1cl9wcm9jOwotc3RhdGljIHByb2NTICpjdXJfcHJvY19wdHI7Ci1zdGF0aWMgaW50IG51bXByb2NzOwotCi1zdGF0aWMgdm9pZAotbWRfb2JqX2JlZ2luICgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi1tZF9vYmpfZW5kICgpCi17Ci0gIC8qIGNoZWNrIGZvciBwcmVtYXR1cmUgZW5kLCBuZXN0aW5nIGVycm9ycywgZXRjICovCi0gIGlmIChjdXJfcHJvY19wdHIpCi0gICAgYXNfd2FybiAoXygibWlzc2luZyBgLmVuZCcgYXQgZW5kIG9mIGFzc2VtYmx5IikpOwotfQotCi1zdGF0aWMgbG9uZwotZ2V0X251bWJlciAoKQotewotICBpbnQgbmVnYXRpdmUgPSAwOwotICBsb25nIHZhbCA9IDA7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgbmVnYXRpdmUgPSAxOwotICAgIH0KLSAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0gICAgYXNfYmFkIChfKCJFeHBlY3RlZCBzaW1wbGUgbnVtYmVyLiIpKTsKLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclswXSA9PSAnMCcpCi0gICAgewotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAneCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0JICB3aGlsZSAoaXN4ZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkgICAgewotCSAgICAgIHZhbCA8PD0gNDsKLQkgICAgICB2YWwgfD0gaGV4X3ZhbHVlICgqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCSAgICB9Ci0JICByZXR1cm4gbmVnYXRpdmUgPyAtdmFsIDogdmFsOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpCi0JICAgIHsKLQkgICAgICB2YWwgPDw9IDM7Ci0JICAgICAgdmFsIHw9ICppbnB1dF9saW5lX3BvaW50ZXIrKyAtICcwJzsKLQkgICAgfQotCSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKLQl9Ci0gICAgfQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiAqaW5wdXRfbGluZV9wb2ludGVyID09ICclYycgMHglMDJ4XG4iKSwKLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyLCAqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgbnVtYmVyIikpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLSAgICB7Ci0gICAgICB2YWwgKj0gMTA7Ci0gICAgICB2YWwgKz0gKmlucHV0X2xpbmVfcG9pbnRlcisrIC0gJzAnOwotICAgIH0KLSAgcmV0dXJuIG5lZ2F0aXZlID8gLXZhbCA6IHZhbDsKLX0KLQotLyogVGhlIC5maWxlIGRpcmVjdGl2ZTsganVzdCBsaWtlIHRoZSB1c3VhbCAuZmlsZSBkaXJlY3RpdmUsIGJ1dCB0aGVyZQotICAgaXMgYW4gaW5pdGlhbCBudW1iZXIgd2hpY2ggaXMgdGhlIEVDT0ZGIGZpbGUgaW5kZXguICAqLwotCi1zdGF0aWMgdm9pZAotc19maWxlICh4KQotICAgICBpbnQgeDsKLXsKLSAgaW50IGxpbmU7Ci0KLSAgbGluZSA9IGdldF9udW1iZXIgKCk7Ci0gIHNfYXBwX2ZpbGUgKDApOwotfQotCi0KLS8qIFRoZSAuZW5kIGRpcmVjdGl2ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZW5kICh4KQotICAgICBpbnQgeDsKLXsKLSAgc3ltYm9sUyAqcDsKLSAgaW50IG1heWJlX3RleHQ7Ci0KLSAgaWYgKCFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0gICAgewotICAgICAgcCA9IGdldF9zeW1ib2wgKCk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHAgPSBOVUxMOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKSAmIFNFQ19DT0RFKSAhPSAwKQotICAgIG1heWJlX3RleHQgPSAxOwotICBlbHNlCi0gICAgbWF5YmVfdGV4dCA9IDA7Ci0jZWxzZQotICBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24gJiYgbm93X3NlZyAhPSBic3Nfc2VjdGlvbikKLSAgICBtYXliZV90ZXh0ID0gMTsKLSAgZWxzZQotICAgIG1heWJlX3RleHQgPSAwOwotI2VuZGlmCi0KLSAgaWYgKCFtYXliZV90ZXh0KQotICAgIGFzX3dhcm4gKF8oIi5lbmQgbm90IGluIHRleHQgc2VjdGlvbiIpKTsKLQotICBpZiAoIWN1cl9wcm9jX3B0cikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlLiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChwICE9IE5VTEwpCi0gICAgewotICAgICAgYXNzZXJ0IChTX0dFVF9OQU1FIChwKSk7Ci0gICAgICBpZiAoc3RyY21wIChTX0dFVF9OQU1FIChwKSwgU19HRVRfTkFNRSAoY3VyX3Byb2NfcHRyLT5pc3ltKSkpCi0JYXNfd2FybiAoXygiLmVuZCBzeW1ib2wgZG9lcyBub3QgbWF0Y2ggLmVudCBzeW1ib2wuIikpOwotICAgIH0KLSAgZWxzZQotICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIG1pc3Npbmcgb3IgdW5rbm93biBzeW1ib2wiKSk7Ci0KLSNpZmRlZiBNSVBTX1NUQUJTX0VMRgotICB7Ci0gICAgc2VnVCBzYXZlZF9zZWcgPSBub3dfc2VnOwotICAgIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICBmcmFnUyAqc2F2ZWRfZnJhZyA9IGZyYWdfbm93OwotICAgIHZhbHVlVCBkb3Q7Ci0gICAgc2VnVCBzZWc7Ci0gICAgZXhwcmVzc2lvblMgZXhwOwotICAgIGNoYXIgKmZyYWdwOwotCi0gICAgZG90ID0gZnJhZ19ub3dfZml4ICgpOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gICAgYXNzZXJ0IChwZHJfc2VnKTsKLSAgICBzdWJzZWdfc2V0IChwZHJfc2VnLCAwKTsKLQotICAgIC8qIFdyaXRlIHRoZSBzeW1ib2wgKi8KLSAgICBleHAuWF9vcCA9IE9fc3ltYm9sOwotICAgIGV4cC5YX2FkZF9zeW1ib2wgPSBwOwotICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgIGVtaXRfZXhwciAoJmV4cCwgNCk7Ci0KLSAgICBmcmFncCA9IGZyYWdfbW9yZSAoNyo0KTsKLQotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AsICAgICAodmFsdWVUKSBjdXJfcHJvY19wdHItPnJlZ19tYXNrLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsgNCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5yZWdfb2Zmc2V0LCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsgOCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcHJlZ19tYXNrLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsxMiwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5mcHJlZ19vZmZzZXQsIDQpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoZnJhZ3AgKzE2LCAodmFsdWVUKSBjdXJfcHJvY19wdHItPmZyYW1lX29mZnNldCwgNCk7Ci0gICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFncCArMjAsICh2YWx1ZVQpIGN1cl9wcm9jX3B0ci0+ZnJhbWVfcmVnLCA0KTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdwICsyNCwgKHZhbHVlVCkgY3VyX3Byb2NfcHRyLT5wY19yZWcsIDQpOwotCi0gICAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotICB9Ci0jZW5kaWYKLQotICBjdXJfcHJvY19wdHIgPSBOVUxMOwotfQotCi0vKiBUaGUgLmFlbnQgYW5kIC5lbnQgZGlyZWN0aXZlcy4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfZW50IChhZW50KQotICAgICBpbnQgYWVudDsKLXsKLSAgaW50IG51bWJlciA9IDA7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGludCBtYXliZV90ZXh0OwotCi0gIHN5bWJvbFAgPSBnZXRfc3ltYm9sICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKQotICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLScpCi0gICAgbnVtYmVyID0gZ2V0X251bWJlciAoKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgbm93X3NlZykgJiBTRUNfQ09ERSkgIT0gMCkKLSAgICBtYXliZV90ZXh0ID0gMTsKLSAgZWxzZQotICAgIG1heWJlX3RleHQgPSAwOwotI2Vsc2UKLSAgaWYgKG5vd19zZWcgIT0gZGF0YV9zZWN0aW9uICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCi0gICAgbWF5YmVfdGV4dCA9IDE7Ci0gIGVsc2UKLSAgICBtYXliZV90ZXh0ID0gMDsKLSNlbmRpZgotCi0gIGlmICghbWF5YmVfdGV4dCkKLSAgICBhc193YXJuIChfKCIuZW50IG9yIC5hZW50IG5vdCBpbiB0ZXh0IHNlY3Rpb24uIikpOwotCi0gIGlmICghYWVudCAmJiBjdXJfcHJvY19wdHIpCi0gICAgYXNfd2FybiAoXygibWlzc2luZyBgLmVuZCciKSk7Ci0KLSAgaWYgKCFhZW50KQotICAgIHsKLSAgICAgIGN1cl9wcm9jX3B0ciA9ICZjdXJfcHJvYzsKLSAgICAgIG1lbXNldCAoY3VyX3Byb2NfcHRyLCAnXDAnLCBzaXplb2YgKHByb2NTKSk7Ci0KLSAgICAgIGN1cl9wcm9jX3B0ci0+aXN5bSA9IHN5bWJvbFA7Ci0KLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX0ZVTkNUSU9OOwotCi0gICAgICBudW1wcm9jcysrOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmZyYW1lIGRpcmVjdGl2ZS4gSWYgdGhlIG1kZWJ1ZyBzZWN0aW9uIGlzIHByZXNlbnQgKElSSVggNSBuYXRpdmUpCi0gICB0aGVuIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSkgaXMgdXNlZC4gRm9yIGVtYmVkZGVkIHRhcmdldHMsIAotICAgc19taXBzX2ZyYW1lIGlzIHVzZWQgc28gdGhhdCB3ZSBjYW4gc2V0IHRoZSBQRFIgaW5mb3JtYXRpb24gY29ycmVjdGx5LgotICAgV2UgY2FuJ3QgdXNlIHRoZSBlY29mZiByb3V0aW5lcyBiZWNhdXNlIHRoZXkgbWFrZSByZWZlcmVuY2UgdG8gdGhlIGVjb2ZmIAotICAgc3ltYm9sIHRhYmxlIChpbiB0aGUgbWRlYnVnIHNlY3Rpb24pLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfbWlwc19mcmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotI2lmZGVmIE1JUFNfU1RBQlNfRUxGCi0KLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAgKHByb2NTICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmZyYW1lIG91dHNpZGUgb2YgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+ZnJhbWVfcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCi0gICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPmZyYW1lX29mZnNldCA9IHZhbDsKLSAgY3VyX3Byb2NfcHRyLT5wY19yZWcgPSB0Y19nZXRfcmVnaXN0ZXIgKDApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0jZWxzZQotICBzX2lnbm9yZSAoaWdub3JlKTsKLSNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLwotfQotCi0vKiBUaGUgLmZtYXNrIGFuZCAubWFzayBkaXJlY3RpdmVzLiBJZiB0aGUgbWRlYnVnIHNlY3Rpb24gaXMgcHJlc2VudCAKLSAgIChJUklYIDUgbmF0aXZlKSB0aGVuIGVjb2ZmLmMgKGVjb2ZmX2RpcmVjdGl2ZV9tYXNrKSBpcyB1c2VkLiBGb3IgCi0gICBlbWJlZGRlZCB0YXJnZXRzLCBzX21pcHNfbWFzayBpcyB1c2VkIHNvIHRoYXQgd2UgY2FuIHNldCB0aGUgUERSCi0gICBpbmZvcm1hdGlvbiBjb3JyZWN0bHkuIFdlIGNhbid0IHVzZSB0aGUgZWNvZmYgcm91dGluZXMgYmVjYXVzZSB0aGV5IAotICAgbWFrZSByZWZlcmVuY2UgdG8gdGhlIGVjb2ZmIHN5bWJvbCB0YWJsZSAoaW4gdGhlIG1kZWJ1ZyBzZWN0aW9uKS4gICovCi0KLXN0YXRpYyB2b2lkCi1zX21pcHNfbWFzayAocmVnX3R5cGUpCi0gICAgIGNoYXIgcmVnX3R5cGU7Ci17Ci0jaWZkZWYgTUlQU19TVEFCU19FTEYKLSAgbG9uZyBtYXNrLCBvZmY7Ci0gIAotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jUyAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5tYXNrLy5mbWFzayBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZtYXNrKSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiQmFkIC5tYXNrLy5mbWFzayBkaXJlY3RpdmUiKSk7Ci0gICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG9mZiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIGlmIChyZWdfdHlwZSA9PSAnRicpCi0gICAgewotICAgICAgY3VyX3Byb2NfcHRyLT5mcHJlZ19tYXNrID0gbWFzazsKLSAgICAgIGN1cl9wcm9jX3B0ci0+ZnByZWdfb2Zmc2V0ID0gb2ZmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGN1cl9wcm9jX3B0ci0+cmVnX21hc2sgPSBtYXNrOwotICAgICAgY3VyX3Byb2NfcHRyLT5yZWdfb2Zmc2V0ID0gb2ZmOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotI2Vsc2UKLSAgc19pZ25vcmUgKHJlZ190eXBlKTsKLSNlbmRpZiAvKiBNSVBTX1NUQUJTX0VMRiAqLwotfQotCi0vKiBUaGUgLmxvYyBkaXJlY3RpdmUuICAqLwotCi0jaWYgMAotc3RhdGljIHZvaWQKLXNfbG9jICh4KQotICAgICBpbnQgeDsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgaW50IGxpbmVubzsKLSAgaW50IGFkZHJvZmY7Ci0KLSAgYXNzZXJ0IChub3dfc2VnID09IHRleHRfc2VjdGlvbik7Ci0KLSAgbGluZW5vID0gZ2V0X251bWJlciAoKTsKLSAgYWRkcm9mZiA9IGZyYWdfbm93X2ZpeCAoKTsKLQotICBzeW1ib2xQID0gc3ltYm9sX25ldyAoIiIsIE5fU0xJTkUsIGFkZHJvZmYsIGZyYWdfbm93KTsKLSAgU19TRVRfVFlQRSAoc3ltYm9sUCwgTl9TTElORSk7Ci0gIFNfU0VUX09USEVSIChzeW1ib2xQLCAwKTsKLSAgU19TRVRfREVTQyAoc3ltYm9sUCwgbGluZW5vKTsKLSAgc3ltYm9sUC0+c3lfc2VnbWVudCA9IG5vd19zZWc7Ci19Ci0jZW5kaWYKLQotCi0gIApkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1taXBzLmggYi9nYXMvY29uZmlnL3RjLW1pcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmZDk5OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKiB0Yy1taXBzLmggLS0gaGVhZGVyIGZpbGUgZm9yIHRjLW1pcHMuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSB0aGUgT1NGIGFuZCBSYWxwaCBDYW1wYmVsbC4KLSAgIFdyaXR0ZW4gYnkgS2VpdGggS25vd2xlcyBhbmQgUmFscGggQ2FtcGJlbGwsIHdvcmtpbmcgaW5kZXBlbmRlbnRseS4KLSAgIE1vZGlmaWVkIGZvciBFQ09GRiBzdXBwb3J0IGJ5IElhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUy4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBUQ19NSVBTCi0KLSNkZWZpbmUgVENfTUlQUwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgZnJhZzsKLXN0cnVjdCBleHByZXNzaW9uUzsKLSNlbmRpZgotCi0vKiBEZWZhdWx0IHRvIGJpZyBlbmRpYW4uICAqLwotI2lmbmRlZiBUQVJHRVRfQllURVNfQklHX0VORElBTgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTgkJMQotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbWlwcwotCi0jZGVmaW5lIE9OTFlfU1RBTkRBUkRfRVNDQVBFUwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECTEKLSNkZWZpbmUgT0xEX0ZMT0FUX1JFQURTCi0jZGVmaW5lIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TCi0jZGVmaW5lIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotI2RlZmluZSBNQVhfUkVMT0NfRVhQQU5TSU9OIDMKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogTWF4aW11bSBzeW1ib2wgb2Zmc2V0IHRoYXQgY2FuIGJlIGVuY29kZWQgaW4gYSBCRkRfUkVMT0NfTUlQU19HUFJFTAotICAgcmVsb2NhdGlvbjogKi8KLSNkZWZpbmUgTUFYX0dQUkVMX09GRlNFVCAoMHg3RkY0KQotCi0jZGVmaW5lIG1kX3JlbGF4X2ZyYWcoZnJhZ3AsIHN0cmV0Y2gpIG1pcHNfcmVsYXhfZnJhZyhmcmFncCwgc3RyZXRjaCkKLWV4dGVybiBpbnQgbWlwc19yZWxheF9mcmFnIFBBUkFNUyAoKHN0cnVjdCBmcmFnICosIGxvbmcpKTsKLQotI2RlZmluZSBtZF91bmRlZmluZWRfc3ltYm9sKG5hbWUpCSgwKQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIFdlIHBlcm1pdCBQQyByZWxhdGl2ZSBkaWZmZXJlbmNlIGV4cHJlc3Npb25zIHdoZW4gZ2VuZXJhdGluZwotICAgZW1iZWRkZWQgUElDIGNvZGUuICAqLwotI2RlZmluZSBESUZGX0VYUFJfT0sKLQotLyogVGVsbCBhc3NlbWJsZXIgdGhhdCB3ZSBoYXZlIGFuIGl0YmxfbWlwcy5oIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUuICovCi0jZGVmaW5lIEhBVkVfSVRCTF9DUFUKLQotLyogVGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHRhcmdldCBmb3JtYXQgbWF5IGNoYW5nZSBiYXNlZCBvbiBjb21tYW5kCi0gICBsaW5lIGFyZ3VtZW50cy4gICovCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgbWlwc190YXJnZXRfZm9ybWF0KCkKLWV4dGVybiBjb25zdCBjaGFyICptaXBzX3RhcmdldF9mb3JtYXQgUEFSQU1TICgodm9pZCkpOwotCi1zdHJ1Y3QgbWlwc19jbF9pbnNuCi17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl9vcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqaW5zbl9tbzsKLSAgLyogVGhlIG5leHQgdHdvIGZpZWxkcyBhcmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgbWlwczE2IGNvZGUuICAqLwotICBib29sZWFuIHVzZV9leHRlbmQ7Ci0gIHVuc2lnbmVkIHNob3J0IGV4dGVuZDsKLX07Ci0KLWV4dGVybiBpbnQgdGNfZ2V0X3JlZ2lzdGVyIFBBUkFNUyAoKGludCBmcmFtZSkpOwotCi0jZGVmaW5lIHRjX2luaXRfYWZ0ZXJfYXJncygpIG1pcHNfaW5pdF9hZnRlcl9hcmdzKCkKLWV4dGVybiB2b2lkIG1pcHNfaW5pdF9hZnRlcl9hcmdzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBtZF9wYXJzZV9sb25nX29wdGlvbihhcmcpIG1pcHNfcGFyc2VfbG9uZ19vcHRpb24gKGFyZykKLWV4dGVybiBpbnQgbWlwc19wYXJzZV9sb25nX29wdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgbWlwc19kZWZpbmVfbGFiZWwgKHN5bSkKLWV4dGVybiB2b2lkIG1pcHNfZGVmaW5lX2xhYmVsIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0KCkgbWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAoKQotZXh0ZXJuIHZvaWQgbWlwc19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgdGNfZnJvYl9maWxlKCkgbWlwc19mcm9iX2ZpbGUgKCkKLWV4dGVybiB2b2lkIG1pcHNfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2lmIGRlZmluZWQgKE9CSl9FTEYpIHx8IGRlZmluZWQgKE9CSl9NQVlCRV9FTEYpCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgbWlwc19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi1leHRlcm4gdm9pZCBtaXBzX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19taXBzCi1leHRlcm4gdm9pZCBjb25zX2ZpeF9uZXdfbWlwcwotICBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBpbnQsIHVuc2lnbmVkIGludCwgc3RydWN0IGV4cHJlc3Npb25TICopKTsKLQotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShmaXhwKSBtaXBzX2ZpeF9hZGp1c3RhYmxlIChmaXhwKQotZXh0ZXJuIGludCBtaXBzX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBXaGVuIGdlbmVyYXRpbmcgZW1iZWRkZWQgUElDIGNvZGUgd2UgbXVzdCBrZWVwIFBDIHJlbGF0aXZlCi0gICByZWxvY2F0aW9ucy4gICovCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgbWlwc19mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotZXh0ZXJuIGludCBtaXBzX2ZvcmNlX3JlbG9jYXRpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqKSk7Ci0KLS8qIG1kX2FwcGx5X2ZpeCBzZXRzIGZ4X2RvbmUgY29ycmVjdGx5LiAgKi8KLSNkZWZpbmUgVENfSEFORExFX0ZYX0RPTkUgMQotCi0vKiBSZWdpc3RlciBtYXNrIHZhcmlhYmxlcy4gIFRoZXNlIGFyZSBzZXQgYnkgdGhlIE1JUFMgYXNzZW1ibHkgY29kZQotICAgYW5kIHVzZWQgYnkgRUNPRkYgYW5kIHBvc3NpYmx5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuICAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWlwc19ncHJtYXNrOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWlwc19jcHJtYXNrWzRdOwotCi0jaWYgZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX01BWUJFX0VMRikKLQotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nCi1leHRlcm4gdm9pZCBtaXBzX2VsZl9maW5hbF9wcm9jZXNzaW5nIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5zZGF0YSIsCVNIVF9QUk9HQklUUywJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX01JUFNfR1BSRUwJfSwgXAotICB7ICIuc2JzcyIsCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKLSAgeyAiLmxpdDQiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKLSAgeyAiLmxpdDgiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9NSVBTX0dQUkVMCX0sIFwKLSAgeyAiLnVjb2RlIiwJU0hUX01JUFNfVUNPREUsCTAJCQkJCX0sIFwKLSAgeyAiLm1kZWJ1ZyIsCVNIVF9NSVBTX0RFQlVHLAkwCQkJCQl9LAotLyogT3RoZXIgc3BlY2lhbCBzZWN0aW9ucyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXI6IC5yZWdpbmZvLAotICAgLmxpYmxpc3QsIC5jb25mbGljdCwgLmdwdGFiLCAuZ290LCAuZHluYW1pYywgLnJlbC5keW4uICAqLwotCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgbWRfbWlwc19lbmQgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSBtZF9lbmQoKQltZF9taXBzX2VuZCgpCi0KLSNkZWZpbmUgVVNFX0dMT0JBTF9QT0lOVEVSX09QVAkoT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2Vjb2ZmX2ZsYXZvdXIgXAotCQkJCSB8fCBPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0KLWV4dGVybiB2b2lkIG1pcHNfcG9wX2luc2VydCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX3BvcF9pbnNlcnQoKQkJbWlwc19wb3BfaW5zZXJ0KCkKLQotZXh0ZXJuIHZvaWQgbWlwc19mbHVzaF9wZW5kaW5nX291dHB1dCBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IG1pcHNfZmx1c2hfcGVuZGluZ19vdXRwdXQKLQotZXh0ZXJuIHZvaWQgbWlwc19lbmFibGVfYXV0b19hbGlnbiBQQVJBTVMgKCh2b2lkKSk7Ci0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCkJbWlwc19lbmFibGVfYXV0b19hbGlnbigpCi0KLSNlbmRpZiAvKiBUQ19NSVBTICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuYyBiL2dhcy9jb25maWcvdGMtbW4xMDIwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRmN2JmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDIwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxNCArMCwwIEBACi0vKiB0Yy1tbjEwMjAwLmMgLS0gQXNzZW1ibGVyIGNvZGUgZm9yIHRoZSBNYXRzdXNoaXRhIDEwMjAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL21uMTAyMDAuaCIKLQwKLS8qIFN0cnVjdHVyZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHByZWRlZmluZWQgcmVnaXN0ZXJzLiAgKi8KLXN0cnVjdCByZWdfbmFtZQotewotICBjb25zdCBjaGFyICpuYW1lOwotICBpbnQgdmFsdWU7Ci19OwotCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9IHsKLSAgLyogYkNDIHJlbGF4aW5nICovCi0gIHsweDgxLCAtMHg3ZSwgMiwgMX0sCi0gIHsweDgwMDQsIC0weDdmZmIsIDUsIDJ9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNywgMH0sCi0gIC8qIGJDQ3ggcmVsYXhpbmcgKi8KLSAgezB4ODEsIC0weDdlLCAzLCA0fSwKLSAgezB4ODAwNCwgLTB4N2ZmYiwgNiwgNX0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA4LCAwfSwKLSAgLyoganNyIHJlbGF4aW5nICovCi0gIHsweDgwMDQsIC0weDdmZmIsIDMsIDd9LAotICB7MHg4MDAwMDYsIC0weDdmZmZmOSwgNSwgMH0sCi0gIC8qIGptcCByZWxheGluZyAqLwotICB7MHg4MSwgLTB4N2UsIDIsIDl9LAotICB7MHg4MDA0LCAtMHg3ZmZiLCAzLCAxMH0sCi0gIHsweDgwMDAwNiwgLTB4N2ZmZmY5LCA1LCAwfSwKLQotfTsKLS8qIGxvY2FsIGZ1bmN0aW9ucyAqLwotc3RhdGljIHZvaWQgbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nICosIHVuc2lnbmVkIGxvbmcgKiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMjAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQsIGNoYXIgKiwgdW5zaWduZWQsCi0JCQkJCSAgICB1bnNpZ25lZCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hlY2tfb3BlcmFuZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqLAotCQkJCQkgICAgb2Zmc2V0VCkpOwotc3RhdGljIGludCByZWdfbmFtZV9zZWFyY2ggUEFSQU1TICgoY29uc3Qgc3RydWN0IHJlZ19uYW1lICosIGludCwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBkYXRhX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBhZGRyZXNzX3JlZ2lzdGVyX25hbWUgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgYm9vbGVhbiBvdGhlcl9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotCi0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3QgbW4xMDIwMF9maXh1cAotewotICBleHByZXNzaW9uUyBleHA7Ci0gIGludCBvcGluZGV4OwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci19Owotc3RydWN0IG1uMTAyMDBfZml4dXAgZml4dXBzW01BWF9JTlNOX0ZJWFVQU107Ci1zdGF0aWMgaW50IGZjOwotDAotY29uc3QgY2hhciAqbWRfc2hvcnRvcHRzID0gIiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7IAotCi0vKiBUaGUgdGFyZ2V0IHNwZWNpZmljIHBzZXVkby1vcHMgd2hpY2ggd2Ugc3VwcG9ydC4gICovCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICB7IE5VTEwsICAgICAgIE5VTEwsICAgICAgICAgICAwIH0KLX07Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptbjEwMjAwX2hhc2g7Ci0KLS8qIFRoaXMgdGFibGUgaXMgc29ydGVkLiBTdWl0YWJsZSBmb3Igc2VhcmNoaW5nIGJ5IGEgYmluYXJ5IHNlYXJjaC4gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgZGF0YV9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImQwIiwgMCB9LAotICB7ICJkMSIsIDEgfSwKLSAgeyAiZDIiLCAyIH0sCi0gIHsgImQzIiwgMyB9LAotfTsKLSNkZWZpbmUgREFUQV9SRUdfTkFNRV9DTlQJKHNpemVvZihkYXRhX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBhZGRyZXNzX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCAwIH0sCi0gIHsgImExIiwgMSB9LAotICB7ICJhMiIsIDIgfSwKLSAgeyAiYTMiLCAzIH0sCi19OwotI2RlZmluZSBBRERSRVNTX1JFR19OQU1FX0NOVAkoc2l6ZW9mKGFkZHJlc3NfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIG90aGVyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWRyIiwgMCB9LAotICB7ICJwc3ciLCAwIH0sCi19OwotI2RlZmluZSBPVEhFUl9SRUdfTkFNRV9DTlQJKHNpemVvZihvdGhlcl9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLS8qIHJlZ19uYW1lX3NlYXJjaCBkb2VzIGEgYmluYXJ5IHNlYXJjaCBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgdGFibGUKLSAgIHRvIHNlZSBpZiAibmFtZSIgaXMgYSB2YWxpZCByZWdpdGVyIG5hbWUuICBSZXR1cm5zIHRoZSByZWdpc3RlcgotICAgbnVtYmVyIGZyb20gdGhlIGFycmF5IG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGZhaWx1cmUuICovCi0KLXN0YXRpYyBpbnQKLXJlZ19uYW1lX3NlYXJjaCAocmVncywgcmVnY291bnQsIG5hbWUpCi0gICAgIGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqcmVnczsKLSAgICAgaW50IHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UgCi0JICByZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWRhdGFfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoZGF0YV9yZWdpc3RlcnMsIERBVEFfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1hZGRyZXNzX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGFkZHJlc3NfcmVnaXN0ZXJzLCBBRERSRVNTX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotb3RoZXJfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAob3RoZXJfcmVnaXN0ZXJzLCBPVEhFUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiTU4xMDIwMCBvcHRpb25zOlxuXAotbm9uZSB5ZXRcbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICBpbnQgdHlwZTsKLSAgY2hhciAqbGl0cDsKLSAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZXAgPSBwcmVjICogMjsKLQotICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhYmVsX2NvdW50ID0gMDsKLSAgY2hhciBidWZbNDBdOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxKQotICAgIHsKLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgaW50IG9wY29kZSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGU4OgotCSAgb3Bjb2RlID0gMHhlOTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlOToKLQkgIG9wY29kZSA9IDB4ZTg7Ci0JICBicmVhazsKLQljYXNlIDB4ZTA6Ci0JICBvcGNvZGUgPSAweGUyOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUyOgotCSAgb3Bjb2RlID0gMHhlMDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMzoKLQkgIG9wY29kZSA9IDB4ZTE7Ci0JICBicmVhazsKLQljYXNlIDB4ZTE6Ci0JICBvcGNvZGUgPSAweGUzOwotCSAgYnJlYWs7Ci0JY2FzZSAweGU0OgotCSAgb3Bjb2RlID0gMHhlNjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNjoKLQkgIG9wY29kZSA9IDB4ZTQ7Ci0JICBicmVhazsKLQljYXNlIDB4ZTc6Ci0JICBvcGNvZGUgPSAweGU1OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU1OgotCSAgb3Bjb2RlID0gMHhlNzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4ZmM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMDoKLQkgIG9wY29kZSA9IDB4ZTI7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBvcGNvZGUgPSAweGUwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUzOgotCSAgb3Bjb2RlID0gMHhlMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMToKLQkgIG9wY29kZSA9IDB4ZTM7Ci0JICBicmVhazsKLQljYXNlIDB4ZTQ6Ci0JICBvcGNvZGUgPSAweGU2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU2OgotCSAgb3Bjb2RlID0gMHhlNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNzoKLQkgIG9wY29kZSA9IDB4ZTU7Ci0JICBicmVhazsKLQljYXNlIDB4ZTU6Ci0JICBvcGNvZGUgPSAweGU3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhmNDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdID0gMHhlMDsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgNCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzI0X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNCkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZmM6Ci0JICBvcGNvZGUgPSAweGZkOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZkOgotCSAgb3Bjb2RlID0gMHhmYzsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZToKLQkgIG9wY29kZSA9IDB4ZmY7Ci0JICBicmVhazsKLQljYXNlIDB4ZmY6Ci0JICBvcGNvZGUgPSAweGZlOwotCWNhc2UgMHhlODoKLQkgIG9wY29kZSA9IDB4ZTk7Ci0JICBicmVhazsKLQljYXNlIDB4ZTk6Ci0JICBvcGNvZGUgPSAweGU4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGUwOgotCSAgb3Bjb2RlID0gMHhlMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMjoKLQkgIG9wY29kZSA9IDB4ZTA7Ci0JICBicmVhazsKLQljYXNlIDB4ZTM6Ci0JICBvcGNvZGUgPSAweGUxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUxOgotCSAgb3Bjb2RlID0gMHhlMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNDoKLQkgIG9wY29kZSA9IDB4ZTY7Ci0JICBicmVhazsKLQljYXNlIDB4ZTY6Ci0JICBvcGNvZGUgPSAweGU0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU3OgotCSAgb3Bjb2RlID0gMHhlNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNToKLQkgIG9wY29kZSA9IDB4ZTc7Ci0JICBicmVhazsKLQljYXNlIDB4ZWM6Ci0JICBvcGNvZGUgPSAweGVkOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVkOgotCSAgb3Bjb2RlID0gMHhlYzsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZToKLQkgIG9wY29kZSA9IDB4ZWY7Ci0JICBicmVhazsKLQljYXNlIDB4ZWY6Ci0JICBvcGNvZGUgPSAweGVlOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZmM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDUpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gJiAweGZmOwotCi0gICAgICBzd2l0Y2ggKG9wY29kZSkKLQl7Ci0JY2FzZSAweGZjOgotCSAgb3Bjb2RlID0gMHhmZDsKLQkgIGJyZWFrOwotCWNhc2UgMHhmZDoKLQkgIG9wY29kZSA9IDB4ZmM7Ci0JICBicmVhazsKLQljYXNlIDB4ZmU6Ci0JICBvcGNvZGUgPSAweGZmOwotCSAgYnJlYWs7Ci0JY2FzZSAweGZmOgotCSAgb3Bjb2RlID0gMHhmZTsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMDoKLQkgIG9wY29kZSA9IDB4ZTI7Ci0JICBicmVhazsKLQljYXNlIDB4ZTI6Ci0JICBvcGNvZGUgPSAweGUwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGUzOgotCSAgb3Bjb2RlID0gMHhlMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhlMToKLQkgIG9wY29kZSA9IDB4ZTM7Ci0JICBicmVhazsKLQljYXNlIDB4ZTQ6Ci0JICBvcGNvZGUgPSAweGU2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU2OgotCSAgb3Bjb2RlID0gMHhlNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlNzoKLQkgIG9wY29kZSA9IDB4ZTU7Ci0JICBicmVhazsKLQljYXNlIDB4ZTU6Ci0JICBvcGNvZGUgPSAweGU3OwotCSAgYnJlYWs7Ci0JY2FzZSAweGVjOgotCSAgb3Bjb2RlID0gMHhlZDsKLQkgIGJyZWFrOwotCWNhc2UgMHhlZDoKLQkgIG9wY29kZSA9IDB4ZWM7Ci0JICBicmVhazsKLQljYXNlIDB4ZWU6Ci0JICBvcGNvZGUgPSAweGVmOwotCSAgYnJlYWs7Ci0JY2FzZSAweGVmOgotCSAgb3Bjb2RlID0gMHhlZTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNF0gPSAweGUwOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA1LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMjRfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDg7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA2KQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNykKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGUxOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbZnJhZ1AtPmZyX2ZpeF0gPSAweGVhOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDkpCi0gICAgewotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdID0gMHhmYzsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDM7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMCkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGY0OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGUwOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ18yNF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlICpvcDsKLQotICBtbjEwMjAwX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIE1OMTAyMDAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIG9wID0gbW4xMDIwMF9vcGNvZGVzOwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcC0+bmFtZSkpIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG1uMTAyMDBfaGFzaCwgb3AtPm5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGJvdGggYSBzaW1wbGlmaWNhdGlvbiAod2UgZG9uJ3QgaGF2ZSB0byB3cml0ZSBtZF9hcHBseV9maXgpCi0gICAgIGFuZCBzdXBwb3J0IGZvciBmdXR1cmUgb3B0aW1pemF0aW9ucyAoYnJhbmNoIHNob3J0ZW5pbmcgYW5kIHNpbWlsYXIKLSAgICAgc3R1ZmYgaW4gdGhlIGxpbmtlci4gICovCi0gIGxpbmtyZWxheCA9IDE7Ci19Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpIAotICAgICBjaGFyICpzdHI7Ci17Ci0gIGNoYXIgKnM7Ci0gIHN0cnVjdCBtbjEwMjAwX29wY29kZSAqb3Bjb2RlOwotICBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm5leHRfb3Bjb2RlOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLSAgaW50IG5leHRfb3BpbmRleCwgcmVsYXhhYmxlOwotICB1bnNpZ25lZCBsb25nIGluc24sIGV4dGVuc2lvbiwgc2l6ZSA9IDA7Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotICBpbnQgbWF0Y2g7Ci0KLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIGZpbmQgdGhlIGZpcnN0IG9wY29kZSB3aXRoIHRoZSBwcm9wZXIgbmFtZSAqLwotICBvcGNvZGUgPSAoc3RydWN0IG1uMTAyMDBfb3Bjb2RlICopaGFzaF9maW5kIChtbjEwMjAwX2hhc2gsIHN0cik7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3RyID0gczsKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICBmb3IoOzspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnID0gTlVMTDsKLSAgICAgIGludCBvcF9pZHg7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgaW50IGV4dHJhX3NoaWZ0ID0gMDsKLQotICAgICAgcmVsYXhhYmxlID0gMDsKLSAgICAgIGZjID0gMDsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0gICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgZm9yIChvcF9pZHggPSAxLCBvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7Ci0JICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgb3BpbmRleF9wdHIrKywgb3BfaWR4KyspCi0JewotCSAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLQkgIGV4cHJlc3Npb25TIGV4OwotCi0JICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMjAwX29wZXJhbmRzW25leHRfb3BpbmRleF07Ci0JICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLQkgICAgfQotCi0JICBlcnJtc2cgPSBOVUxMOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcpCi0JICAgICsrc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUkVMQVgpCi0JICAgIHJlbGF4YWJsZSA9IDE7Ci0KLQkgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gKi8KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICAvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSBvcGVyYW5kcy4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9EUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9BUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QU1cpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjbXAgKHN0YXJ0LCAicHN3IikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9NRFIpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjbXAgKHN0YXJ0LCAibWRyIikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoYWRkcmVzc19yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG90aGVyX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoKnN0ciA9PSAnKScgfHwgKnN0ciA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIHN0ciA9IGhvbGQ7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4KTsKLQkgICAgfQotCi0JICBzd2l0Y2ggKGV4Llhfb3ApIAotCSAgICB7Ci0JICAgIGNhc2UgT19pbGxlZ2FsOgotCSAgICAgIGVycm1zZyA9IF8oImlsbGVnYWwgb3BlcmFuZCIpOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIGNhc2UgT19hYnNlbnQ6Ci0JICAgICAgZXJybXNnID0gXygibWlzc2luZyBvcGVyYW5kIik7Ci0JICAgICAgZ290byBlcnJvcjsKLQkgICAgY2FzZSBPX3JlZ2lzdGVyOgotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAmIChNTjEwMjAwX09QRVJBTkRfRFJFRyB8IE1OMTAyMDBfT1BFUkFORF9BUkVHKSkgPT0gMCkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JCQotCSAgICAgIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMiB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNSkKLQkJZXh0cmFfc2hpZnQgPSA4OwotCSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF82Ci0JCSAgICAgICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNykKLQkJZXh0cmFfc2hpZnQgPSAxNjsKLQkgICAgICBlbHNlCi0JCWV4dHJhX3NoaWZ0ID0gMDsKLQkgICAgICAKLQkgICAgICBtbjEwMjAwX2luc2VydF9vcGVyYW5kICgmaW5zbiwgJmV4dGVuc2lvbiwgb3BlcmFuZCwKLQkJCQkgICAgICBleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCi0JCQkJICAgICAgMCwgZXh0cmFfc2hpZnQpOwotCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBPX2NvbnN0YW50OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIGFuZCBpdCBkb2Vzbid0Ci0JCSBmaXQgaW50byB0aGUgYWxsb2NhdGVkIGJpdGZpZWxkIGZvciB0aGlzIGluc24sCi0JCSB0aGVuIHByb21vdGUgaXQgKGllIHRoaXMgb3Bjb2RlIGRvZXMgbm90IG1hdGNoKS4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzCi0JCSAgJiAoTU4xMDIwMF9PUEVSQU5EX1BST01PVEUgfCBNTjEwMjAwX09QRVJBTkRfUkVMQVgpCi0JCSAgJiYgISBjaGVja19vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIpKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIG1uMTAyMDBfaW5zZXJ0X29wZXJhbmQgKCZpbnNuLCAmZXh0ZW5zaW9uLCBvcGVyYW5kLAotCQkJCSAgICAgIGV4LlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCwKLQkJCQkgICAgICAwLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIC8qIElmIHRoaXMgb3BlcmFuZCBjYW4gYmUgcHJvbW90ZWQsIHRoZW4gdGhpcyBvcGNvZGUgZGlkbid0Ci0JCSBtYXRjaCBzaW5jZSB3ZSBjYW4ndCBrbm93IGlmIGl0IG5lZWRlZCBwcm9tb3Rpb24hICAqLwotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQotCSAgICAgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkgICAgICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCQlhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgICAgIGZpeHVwc1tmY10uZXhwID0gZXg7Ci0JICAgICAgZml4dXBzW2ZjXS5vcGluZGV4ID0gKm9waW5kZXhfcHRyOwotCSAgICAgIGZpeHVwc1tmY10ucmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgICsrZmM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQota2VlcF9nb2luZzoKLQkgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLQkgIHdoaWxlICgqc3RyID09ICcgJyB8fCAqc3RyID09ICcsJykKLQkgICAgKytzdHI7Ci0KLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB3ZSB1c2VkIGFsbCB0aGUgb3BlcmFuZHMhICAqLwotICAgICAgaWYgKCpzdHIgIT0gJywnKQotCW1hdGNoID0gMTsKLQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0gICAgICAgIHsKLQkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKLQkgIGlmICghc3RyY21wKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQotCSAgICB7Ci0JICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIAotCSAgYXNfYmFkICgiJXMiLCBlcnJtc2cpOwotCSAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgICAKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlmICgqc3RyICE9ICdcMCcpCi0gICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfMSkKLSAgICBzaXplID0gMTsKLSAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzIgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzQpCi0gICAgc2l6ZSA9IDI7Ci0gIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF81KQotICAgIHNpemUgPSAzOwotICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfNikKLSAgICBzaXplID0gNDsKLSAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzcpCi0gICAgc2l6ZSA9IDU7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLSAgICAgICAgIAotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLQotICBpZiAocmVsYXhhYmxlICYmIGZjID4gMCkKLSAgICB7Ci0gICAgICBpbnQgdHlwZTsKLQotICAgICAgLyogYkNDICovCi0gICAgICBpZiAoc2l6ZSA9PSAyICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmMwMDAwKQotCXsKLQkgIC8qIEhhbmRsZSBicmEgc3BlY2lhbGx5LiAgQmFzaWNhbGx5IHRyZWF0IGl0IGxpa2Ugam1wIHNvCi0JICAgICB0aGF0IHdlIGF1dG9tYXRpY2FsbHkgaGFuZGxlIDgsIDE2IGFuZCAzMiBiaXQgb2Zmc2V0cwotCSAgICAgY29ycmVjdGx5IGFzIHdlbGwgYXMganVtcHMgdG8gYW4gdW5kZWZpbmVkIGFkZHJlc3MuCi0KLQkgICAgIEl0IGlzIGFsc28gaW1wb3J0YW50IHRvIG5vdCB0cmVhdCBpdCBsaWtlIG90aGVyIGJDQwotCSAgICAgaW5zdHJ1Y3Rpb25zIHNpbmNlIHRoZSBsb25nIGZvcm1zIG9mIGJyYSBpcyBkaWZmZXJlbnQKLQkgICAgIGZyb20gb3RoZXIgYkNDIGluc3RydWN0aW9ucy4gICovCi0gICAgICAgICAgaWYgKG9wY29kZS0+b3Bjb2RlID09IDB4ZWEwMCkKLSAgICAgICAgICAgIHR5cGUgPSA4OwotCSAgZWxzZQotCSAgICB0eXBlID0gMDsKLQl9Ci0gICAgICAvKiBqc3IgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gMyAmJiBvcGNvZGUtPm9wY29kZSA9PSAweGZkMDAwMCkKLQl0eXBlID0gNjsKLSAgICAgIC8qIGptcCAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAzICYmIG9wY29kZS0+b3Bjb2RlID09IDB4ZmMwMDAwKQotCXR5cGUgPSA4OwotICAgICAgLyogYkNDeCAqLwotICAgICAgZWxzZQotCXR5cGUgPSAzOwotCi0gICAgICBmID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA4LCA4IC0gc2l6ZSwgdHlwZSwKLQkJICAgIGZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCSAgICAoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLSAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIHNpemUpOwotICAgICAgaWYgKDggLSBzaXplID4gNCkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgc2l6ZSwgMCwgNCk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgc2l6ZSArIDQsIDAsIDggLSBzaXplIC0gNCk7Ci0JfQotICAgICAgZWxzZQotCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyBzaXplLCAwLCA4IC0gc2l6ZSk7Ci0gICAgfQotCi0gIGVsc2UKLSAgICB7Ci0gICAgICBmID0gZnJhZ19tb3JlIChzaXplKTsKLQotICAgICAgLyogT2gsIHdoYXQgYSBtZXNzLiAgVGhlIGluc3RydWN0aW9uIGlzIGluIGJpZyBlbmRpYW4gZm9ybWF0LCBidXQKLQkgMTYgYW5kIDI0Yml0IGltbWVkaWF0ZXMgYXJlIGxpdHRsZSBlbmRpYW4hICAqLwotICAgICAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF8zKQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmYsIDEpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDEsIGluc24gJiAweGZmZmYsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF82KQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgaW5zbiAmIDB4ZmZmZiwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UXzcpCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCBpbnNuICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyA0LCBleHRlbnNpb24gJiAweGZmLCAxKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgaW5zbiwgc2l6ZSA+IDQgPyA0IDogc2l6ZSk7Ci0JfQotCi0gICAgICAvKiBDcmVhdGUgYW55IGZpeHVwcy4gICovCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgZmM7IGkrKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotCi0JICBvcGVyYW5kID0gJm1uMTAyMDBfb3BlcmFuZHNbZml4dXBzW2ldLm9waW5kZXhdOwotCSAgaWYgKGZpeHVwc1tpXS5yZWxvYyAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICB7Ci0JICAgICAgcmVsb2NfaG93dG9fdHlwZSAqcmVsb2NfaG93dG87Ci0JICAgICAgaW50IHNpemU7Ci0JICAgICAgaW50IG9mZnNldDsKLQkgICAgICBmaXhTICpmaXhQOwotCi0JICAgICAgcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgICAgIGlmICghcmVsb2NfaG93dG8pCi0JCWFib3J0KCk7Ci0JICAKLQkgICAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChyZWxvY19ob3d0byk7Ci0KLQkgICAgICBpZiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDQpCi0JCWFib3J0KCk7Ci0KLQkgICAgICBvZmZzZXQgPSA0IC0gc2l6ZTsKLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICBzaXplLAotCQkJCSAgJmZpeHVwc1tpXS5leHAsIAotCQkJCSAgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCSAgZml4dXBzW2ldLnJlbG9jKTsKLQotCSAgICAgIC8qIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQKLQkJIGluc3RydWN0aW9uLCBub3QgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChyZWxvY19ob3d0by0+cGNfcmVsYXRpdmUpCi0JCWZpeFAtPmZ4X29mZnNldCArPSBzaXplOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnQgcmVsb2MsIHBjcmVsLCByZWxvY19zaXplLCBvZmZzZXQ7Ci0JICAgICAgZml4UyAqZml4UDsKLQotCSAgICAgIHJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0JICAgICAgLyogSG93IGJpZyBpcyB0aGUgcmVsb2M/ICBSZW1lbWJlciBTUExJVCByZWxvY3MgYXJlCi0JCSBpbXBsaWNpdGx5IDMyYml0cy4gICovCi0JICAgICAgcmVsb2Nfc2l6ZSA9IG9wZXJhbmQtPmJpdHM7Ci0KLQkgICAgICBvZmZzZXQgPSBzaXplIC0gcmVsb2Nfc2l6ZSAvIDg7Ci0KLQkgICAgICAvKiBJcyB0aGUgcmVsb2MgcGMtcmVsYXRpdmU/ICAqLwotCSAgICAgIHBjcmVsID0gKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BDUkVMKSAhPSAwOwotCi0KLQkgICAgICAvKiBDaG9vc2UgYSBwcm9wZXIgQkZEIHJlbG9jYXRpb24gdHlwZS4gICovCi0JICAgICAgaWYgKHBjcmVsKQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAyNCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzI0X1BDUkVMOwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJlbG9jX3NpemUgPT0gMzIpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18zMjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMTY7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfODsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDI0KQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMjQ7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQotCSAgICAgIC8qIENvbnZlcnQgdGhlIHNpemUgb2YgdGhlIHJlbG9jIGludG8gd2hhdCBmaXhfbmV3X2V4cCB3YW50cy4gICovCi0JICAgICAgcmVsb2Nfc2l6ZSA9IHJlbG9jX3NpemUgLyA4OwotCSAgICAgIGlmIChyZWxvY19zaXplID09IDgpCi0JCXJlbG9jX3NpemUgPSAwOwotCSAgICAgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCXJlbG9jX3NpemUgPSAxOwotCSAgICAgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMzIgfHwgcmVsb2Nfc2l6ZSA9PSAyNCkKLQkJcmVsb2Nfc2l6ZSA9IDI7Ci0KLQkgICAgICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwgKyBvZmZzZXQsCi0JCQkJICByZWxvY19zaXplLCAmZml4dXBzW2ldLmV4cCwgcGNyZWwsCi0JCQkJICAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgcmVsb2MpKTsKLQotCSAgICAgIC8qIFBDLXJlbGF0aXZlIG9mZnNldHMgYXJlIGZyb20gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIG5leHQKLQkJIGluc3RydWN0aW9uLCBub3QgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChwY3JlbCkKLQkJZml4UC0+Znhfb2Zmc2V0ICs9IHNpemU7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0KLS8qIGlmIHdoaWxlIHByb2Nlc3NpbmcgYSBmaXh1cCwgYSByZWxvYyByZWFsbHkgbmVlZHMgdG8gYmUgY3JlYXRlZCAqLwotLyogdGhlbiBpdCBpcyBkb25lIGhlcmUgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICBmaXhTICpmaXhwOwotewotICBhcmVsZW50ICpyZWxvYzsKLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgXygicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICYmIGZpeHAtPmZ4X3N1YnN5KQotICAgIHsKLSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpICE9IFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQl7Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkiRGlmZmVyZW5jZSBvZiBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmYmZkX2Fic19zeW1ib2w7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gKFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSArIGZpeHAtPmZ4X29mZnNldCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICAgIH0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHJldHVybiAyOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICByZXR1cm4gMzsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA3OwotCSAgcmV0dXJuIDU7Ci0JfQotICAgICAgcmV0dXJuIDM7Ci0gICAgfQotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gOCkKLSAgICB7Ci0gICAgICBpZiAoIVNfSVNfREVGSU5FRCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSAxMDsKLQkgIHJldHVybiA1OwotCX0KLSAgICAgIHJldHVybiAyOwotICAgIH0KLX0gCi0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeHApCi0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2lmIDAKLSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwgJiYgISBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICAvKiBUaGUgc3ltYm9sIGlzIHVuZGVmaW5lZC4gIExldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotI2VuZGlmCi19Ci0KLWludAotbWRfYXBwbHlfZml4MyAoZml4cCwgdmFsdWVwLCBzZWcpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHZhbHVlVCAqdmFsdWVwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgLyogV2Ugc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUgYmVjYXVzZSBsaW5rcmVsYXggaXMgbm9uemVyby4gICovCi0gIGFib3J0ICgpOwotICBmaXhwLT5meF9kb25lID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotbW4xMDIwMF9pbnNlcnRfb3BlcmFuZCAoaW5zbnAsIGV4dGVuc2lvbnAsIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSwgc2hpZnQpCi0gICAgIHVuc2lnbmVkIGxvbmcgKmluc25wOwotICAgICB1bnNpZ25lZCBsb25nICpleHRlbnNpb25wOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIHVuc2lnbmVkIGludCBzaGlmdDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAyNCBvciAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA8IDI0Ci0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfTk9DSEVDSykgPT0gMCkKLSAgICB7Ci0gICAgICBsb25nIG1pbiwgbWF4OwotICAgICAgb2Zmc2V0VCB0ZXN0OwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQl7Ci0JICBtYXggPSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSAtIDE7Ci0JICBtaW4gPSAtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpOwotCX0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLSAgICAgICAgICBtaW4gPSAwOwotICAgICAgICB9Ci0KLSAgICAgIHRlc3QgPSB2YWw7Ci0KLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgY29uc3QgY2hhciAqZXJyID0KLSAgICAgICAgICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLSAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOwotCi0gICAgICAgICAgc3ByaW50X3ZhbHVlIChidWYsIHRlc3QpOwotICAgICAgICAgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0gICAgICAgICAgICBhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGVyciwgYnVmLCBtaW4sIG1heCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCkgPT0gMCkKLSAgICB7Ci0gICAgICAqaW5zbnAgfD0gKCgobG9uZykgdmFsICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpCi0JCSA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCkpOwotCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEKSAhPSAwKQotCSppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJICAgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQgKyAyKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKmV4dGVuc2lvbnAgfD0gKHZhbCA+PiAxNikgJiAweGZmOwotICAgICAgKmluc25wIHw9IHZhbCAmIDB4ZmZmZjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1jaGVja19vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCB2YWwpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCB2YWw7Ci17Ci0gIC8qIE5vIG5lZWQgdG8gY2hlY2sgMjRiaXQgb3IgMzJiaXQgb3BlcmFuZHMgZm9yIGEgYml0LiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPCAyNAotICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0spID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXggPSAoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDE7Ci0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgfQotCi0gICAgICB0ZXN0ID0gdmFsOwotCi0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLQlyZXR1cm4gMDsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMjAwLmggYi9nYXMvY29uZmlnL3RjLW1uMTAyMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzZTU2OS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qIHRjLW1uMTAyMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtbW4xMDIwMC5jLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfTU4xMDIwMAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gI2Vycm9yIE1OMTAyMDAgc3VwcG9ydCByZXF1aXJlcyBCRkRfQVNTRU1CTEVSCi0jZW5kaWYKLQotLyogVGhlIHRhcmdldCBCRkQgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgVEFSR0VUX0FSQ0ggYmZkX2FyY2hfbW4xMDIwMAotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImVsZjMyLW1uMTAyMDAiCi0KLSNkZWZpbmUgTURfQVBQTFlfRklYMwotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIFBlcm1pdCB0ZW1wb3JhcnkgbnVtZXJpYyBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLQotLyogRG9uJ3QgYm90aGVyIHRvIGFkanVzdCByZWxvY3MuICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpIDAKLQotLyogV2UgZG8gcmVsYXhpbmcgaW4gdGhlIGFzc2VtYmxlciBhcyB3ZWxsIGFzIHRoZSBsaW5rZXIuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1tbjEwMzAwLmMgYi9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYxNDZkMS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NDkgKzAsMCBAQAotLyogdGMtbW4xMDMwMC5jIC0tIEFzc2VtYmxlciBjb2RlIGZvciB0aGUgTWF0c3VzaGl0YSAxMDMwMAotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIgICAgIAotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiCi0MCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHJlZ2lzdGVycy4gICovCi1zdHJ1Y3QgcmVnX25hbWUKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgaW50IHZhbHVlOwotfTsKLQotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsIHRhcmdldHMuICovCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYWx3YXlzIHN0YXJ0IGEgY29tbWVudC4gKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIjsjIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIAotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcgCi0gICBwb2ludCBudW1iZXIuICAqLwotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWVhbiB0aGF0IGEgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQsIAotICAgYXMgaW4gMGQxLjAuICAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJkRCI7Ci0MCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPSB7Ci0gIC8qIGJDQyByZWxheGluZyAqLwotICB7MHg3ZiwgLTB4ODAsIDIsIDF9LAotICB7MHg3ZmZmLCAtMHg4MDAwLCA1LCAyfSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA3LCAwfSwKLQotICAvKiBiQ0MgcmVsYXhpbmcgKHVuY29tbW9uIGNhc2VzKSAqLwotICB7MHg3ZiwgLTB4ODAsIDMsIDR9LAotICB7MHg3ZmZmLCAtMHg4MDAwLCA2LCA1fSwKLSAgezB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCA4LCAwfSwKLQotICAvKiBjYWxsIHJlbGF4aW5nICovCi0gIHsweDdmZmYsIC0weDgwMDAsIDUsIDd9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDcsIDB9LAotCi0gIC8qIGNhbGxzIHJlbGF4aW5nICovCi0gIHsweDdmZmYsIC0weDgwMDAsIDQsIDl9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDYsIDB9LAotCi0gIC8qIGptcCByZWxheGluZyAqLwotICB7MHg3ZiwgLTB4ODAsIDIsIDExfSwKLSAgezB4N2ZmZiwgLTB4ODAwMCwgMywgMTJ9LAotICB7MHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIDUsIDB9LAotCi19OwotCi0vKiBsb2NhbCBmdW5jdGlvbnMgKi8KLXN0YXRpYyB2b2lkIG1uMTAzMDBfaW5zZXJ0X29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgbG9uZyAqLCB1bnNpZ25lZCBsb25nICosCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICosCi0JCQkJCSAgICBvZmZzZXRULCBjaGFyICosIHVuc2lnbmVkLAotCQkJCQkgICAgdW5zaWduZWQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoZWNrX29wZXJhbmQgUEFSQU1TICgodW5zaWduZWQgbG9uZywKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKiwKLQkJCQkJICAgIG9mZnNldFQpKTsKLXN0YXRpYyBpbnQgcmVnX25hbWVfc2VhcmNoIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZGF0YV9yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGJvb2xlYW4gYWRkcmVzc19yZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHByZXNzaW9uUCkpOwotc3RhdGljIGJvb2xlYW4gb3RoZXJfcmVnaXN0ZXJfbmFtZSBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwcmVzc2lvblApKTsKLXN0YXRpYyB2b2lkIHNldF9hcmNoX21hY2ggUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBpbnQgY3VycmVudF9tYWNoaW5lOwotCi0vKiBmaXh1cHMgKi8KLSNkZWZpbmUgTUFYX0lOU05fRklYVVBTICg1KQotc3RydWN0IG1uMTAzMDBfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLXN0cnVjdCBtbjEwMzAwX2ZpeHVwIGZpeHVwc1tNQVhfSU5TTl9GSVhVUFNdOwotc3RhdGljIGludCBmYzsKLQotLyogV2UgbXVzdCBzdG9yZSB0aGUgdmFsdWUgb2YgZWFjaCByZWdpc3RlciBvcGVyYW5kIHNvIHRoYXQgd2UgY2FuCi0gICB2ZXJpZnkgdGhhdCBjZXJ0YWluIHJlZ2lzdGVycyBkbyBub3QgbWF0Y2guICAqLwotaW50IG1uMTAzMDBfcmVnX29wZXJhbmRzW01OMTAzMDBfTUFYX09QRVJBTkRTXTsKLQwKLWNvbnN0IGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOyAKLQotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYW0zMCIsCXNldF9hcmNoX21hY2gsCQkzMDAgfSwKLSAgeyAibW4xMDMwMCIsCXNldF9hcmNoX21hY2gsCQkzMDAgfSwKLSAge05VTEwsIDAsIDB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqbW4xMDMwMF9oYXNoOwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIGRhdGFfcmVnaXN0ZXJzW10gPQotewotICB7ICJkMCIsIDAgfSwKLSAgeyAiZDEiLCAxIH0sCi0gIHsgImQyIiwgMiB9LAotICB7ICJkMyIsIDMgfSwKLX07Ci0jZGVmaW5lIERBVEFfUkVHX05BTUVfQ05UCShzaXplb2YoZGF0YV9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCByZWdfbmFtZSkpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgYWRkcmVzc19yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgMCB9LAotICB7ICJhMSIsIDEgfSwKLSAgeyAiYTIiLCAyIH0sCi0gIHsgImEzIiwgMyB9LAotfTsKLSNkZWZpbmUgQUREUkVTU19SRUdfTkFNRV9DTlQJKHNpemVvZihhZGRyZXNzX3JlZ2lzdGVycykgLyBzaXplb2Yoc3RydWN0IHJlZ19uYW1lKSkKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIG90aGVyX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAibWRyIiwgMCB9LAotICB7ICJwc3ciLCAwIH0sCi0gIHsgInNwIiwgMCB9LAotfTsKLSNkZWZpbmUgT1RIRVJfUkVHX05BTUVfQ05UCShzaXplb2Yob3RoZXJfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcmVnX25hbWUpKQotCi0vKiByZWdfbmFtZV9zZWFyY2ggZG9lcyBhIGJpbmFyeSBzZWFyY2ggb2YgdGhlIGdpdmVuIHJlZ2lzdGVyIHRhYmxlCi0gICB0byBzZWUgaWYgIm5hbWUiIGlzIGEgdmFsaWQgcmVnaXRlciBuYW1lLiAgUmV0dXJucyB0aGUgcmVnaXN0ZXIKLSAgIG51bWJlciBmcm9tIHRoZSBhcnJheSBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLiAqLwotCi1zdGF0aWMgaW50Ci1yZWdfbmFtZV9zZWFyY2ggKHJlZ3MsIHJlZ2NvdW50LCBuYW1lKQotICAgICBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgKnJlZ3M7Ci0gICAgIGludCByZWdjb3VudDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotCi0gIGxvdyA9IDA7Ci0gIGhpZ2ggPSByZWdjb3VudCAtIDE7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBtaWRkbGUgPSAobG93ICsgaGlnaCkgLyAyOwotICAgICAgY21wID0gc3RyY2FzZWNtcCAobmFtZSwgcmVnc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JaGlnaCA9IG1pZGRsZSAtIDE7Ci0gICAgICBlbHNlIGlmIChjbXAgPiAwKQotCWxvdyA9IG1pZGRsZSArIDE7Ci0gICAgICBlbHNlIAotCSAgcmV0dXJuIHJlZ3NbbWlkZGxlXS52YWx1ZTsKLSAgICB9Ci0gIHdoaWxlIChsb3cgPD0gaGlnaCk7Ci0gIHJldHVybiAtMTsKLX0KLQotCi0KLS8qIFN1bW1hcnkgb2YgcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIHRvIDFzdCBjaGFyIG9mIG9wZXJhbmQuCi0gKgotICogb3V0OiBBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqCVhfYWRkX251bWJlciBpcyBzZXQgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciwgYW5kIHRydXRoIGlzIHJldHVybmVkLgotICoJSW5wdXRfbGluZV9wb2ludGVyLT4obmV4dCBub24tYmxhbmspIGNoYXIgYWZ0ZXIgb3BlcmFuZCwgb3IgaXMgaW4KLSAqCWl0cyBvcmlnaW5hbCBzdGF0ZS4KLSAqLwotc3RhdGljIGJvb2xlYW4KLWRhdGFfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoZGF0YV9yZWdpc3RlcnMsIERBVEFfUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsJLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi0vKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUy4KLSAqCVRoZSBvcGVyYW5kIG1heSBoYXZlIGJlZW4gYSByZWdpc3RlcjogaW4gdGhpcyBjYXNlLCBYX29wID09IE9fcmVnaXN0ZXIsCi0gKglYX2FkZF9udW1iZXIgaXMgc2V0IHRvIHRoZSByZWdpc3RlciBudW1iZXIsIGFuZCB0cnV0aCBpcyByZXR1cm5lZC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+KG5leHQgbm9uLWJsYW5rKSBjaGFyIGFmdGVyIG9wZXJhbmQsIG9yIGlzIGluCi0gKglpdHMgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLXN0YXRpYyBib29sZWFuCi1hZGRyZXNzX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKGFkZHJlc3NfcmVnaXN0ZXJzLCBBRERSRVNTX1JFR19OQU1FX0NOVCwgbmFtZSk7Ci0KLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgPSBOVUxMOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlc2V0IHRoZSBsaW5lIGFzIGlmIHdlIGhhZCBub3QgZG9uZSBhbnl0aGluZyAqLwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotb3RoZXJfcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICpleHByZXNzaW9uUDsKLXsKLSAgaW50IHJlZ19udW1iZXI7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgKnN0YXJ0OwotICBjaGFyIGM7Ci0KLSAgLyogRmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgc3RhcnQgPSBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAob3RoZXJfcmVnaXN0ZXJzLCBPVEhFUl9SRUdfTkFNRV9DTlQsIG5hbWUpOwotCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSByZWdfbnVtYmVyOwotCi0gICAgICAvKiBtYWtlIHRoZSByZXN0IG5pY2UgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotICAgICAgZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwkvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiTU4xMDMwMCBvcHRpb25zOlxuXAotbm9uZSB5ZXRcbiIpKTsKLX0gCi0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHJldHVybiAwOwotfQotCi1zeW1ib2xTICoKLW1kX3VuZGVmaW5lZF9zeW1ib2wgKG5hbWUpCi0gIGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiAwOwotfQotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdHAsIHNpemVwKQotICBpbnQgdHlwZTsKLSAgY2hhciAqbGl0cDsKLSAgaW50ICpzaXplcDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuICJiYWQgY2FsbCB0byBtZF9hdG9mIjsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZXAgPSBwcmVjICogMjsKLQotICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoYWJmZCwgc2VjLCBmcmFnUCkKLSAgYmZkICphYmZkOwotICBhc2VjdGlvbiAqc2VjOwotICBmcmFnUyAqZnJhZ1A7Ci17Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxhYmVsX2NvdW50ID0gMDsKLSAgY2hhciBidWZbNDBdOwotCi0gIHN1YnNlZ19jaGFuZ2UgKHNlYywgMCk7Ci0gIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMSkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXRdICYgMHhmZjsKLQotICAgICAgc3dpdGNoIChvcGNvZGUpCi0JewotCWNhc2UgMHhjODoKLQkgIG9wY29kZSA9IDB4Yzk7Ci0JICBicmVhazsKLQljYXNlIDB4Yzk6Ci0JICBvcGNvZGUgPSAweGM4OwotCSAgYnJlYWs7Ci0JY2FzZSAweGMwOgotCSAgb3Bjb2RlID0gMHhjMjsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMjoKLQkgIG9wY29kZSA9IDB4YzA7Ci0JICBicmVhazsKLQljYXNlIDB4YzM6Ci0JICBvcGNvZGUgPSAweGMxOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMxOgotCSAgb3Bjb2RlID0gMHhjMzsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNDoKLQkgIG9wY29kZSA9IDB4YzY7Ci0JICBicmVhazsKLQljYXNlIDB4YzY6Ci0JICBvcGNvZGUgPSAweGM0OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM3OgotCSAgb3Bjb2RlID0gMHhjNTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNToKLQkgIG9wY29kZSA9IDB4Yzc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IG9wY29kZTsKLQotICAgICAgLyogQ3JlYXRlIGEgZml4dXAgZm9yIHRoZSByZXZlcnNlZCBjb25kaXRpb25hbCBicmFuY2guICAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiLiVzXyVkIiwgRkFLRV9MQUJFTF9OQU1FLCBsYWJlbF9jb3VudCsrKTsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgMSwKLQkgICAgICAgc3ltYm9sX25ldyAoYnVmLCBzZWMsIDAsIGZyYWdQLT5mcl9uZXh0KSwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUKLQkgZmluYWwgdGFyZ2V0LiAgKi8KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDJdID0gMHhjYzsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMywgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDIpCi0gICAgewotICAgICAgLyogUmV2ZXJzZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBmaXJzdCBicmFuY2guICAqLwotICAgICAgaW50IG9mZnNldCA9IGZyYWdQLT5mcl9maXg7Ci0gICAgICBpbnQgb3Bjb2RlID0gZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4Yzg6Ci0JICBvcGNvZGUgPSAweGM5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM5OgotCSAgb3Bjb2RlID0gMHhjODsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMDoKLQkgIG9wY29kZSA9IDB4YzI7Ci0JICBicmVhazsKLQljYXNlIDB4YzI6Ci0JICBvcGNvZGUgPSAweGMwOwotCSAgYnJlYWs7Ci0JY2FzZSAweGMzOgotCSAgb3Bjb2RlID0gMHhjMTsKLQkgIGJyZWFrOwotCWNhc2UgMHhjMToKLQkgIG9wY29kZSA9IDB4YzM7Ci0JICBicmVhazsKLQljYXNlIDB4YzQ6Ci0JICBvcGNvZGUgPSAweGM2OwotCSAgYnJlYWs7Ci0JY2FzZSAweGM2OgotCSAgb3Bjb2RlID0gMHhjNDsKLQkgIGJyZWFrOwotCWNhc2UgMHhjNzoKLQkgIG9wY29kZSA9IDB4YzU7Ci0JICBicmVhazsKLQljYXNlIDB4YzU6Ci0JICBvcGNvZGUgPSAweGM3OwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSA9IDB4ZGM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDMsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDc7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAzKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMSwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDIsIDEsIEJGRF9SRUxPQ184X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAzOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNCkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGU5OgotCSAgb3Bjb2RlID0gMHhlODsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYToKLQkgIG9wY29kZSA9IDB4ZWI7Ci0JICBicmVhazsKLQljYXNlIDB4ZWI6Ci0JICBvcGNvZGUgPSAweGVhOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDFdID0gb3Bjb2RlOwotCi0gICAgICAvKiBDcmVhdGUgYSBmaXh1cCBmb3IgdGhlIHJldmVyc2VkIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBzcHJpbnRmIChidWYsICIuJXNfJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KyspOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAxLAotCSAgICAgICBzeW1ib2xfbmV3IChidWYsIHNlYywgMCwgZnJhZ1AtPmZyX25leHQpLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzhfUENSRUwpOwotCi0gICAgICAvKiBOb3cgY3JlYXRlIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCArIGZpeHVwIHRvIHRoZQotCSBmaW5hbCB0YXJnZXQuICAqLwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgM10gPSAweGNjOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyA0LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA2OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gNSkKLSAgICB7Ci0gICAgICAvKiBSZXZlcnNlIHRoZSBjb25kaXRpb24gb2YgdGhlIGZpcnN0IGJyYW5jaC4gICovCi0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGludCBvcGNvZGUgPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAxXSAmIDB4ZmY7Ci0KLSAgICAgIHN3aXRjaCAob3Bjb2RlKQotCXsKLQljYXNlIDB4ZTg6Ci0JICBvcGNvZGUgPSAweGU5OwotCSAgYnJlYWs7Ci0JY2FzZSAweGVhOgotCSAgb3Bjb2RlID0gMHhlYjsKLQkgIGJyZWFrOwotCWNhc2UgMHhlYjoKLQkgIG9wY29kZSA9IDB4ZWE7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSBvcGNvZGU7Ci0KLSAgICAgIC8qIENyZWF0ZSBhIGZpeHVwIGZvciB0aGUgcmV2ZXJzZWQgY29uZGl0aW9uYWwgYnJhbmNoLiAgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi4lc18lZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQrKyk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDEsCi0JICAgICAgIHN5bWJvbF9uZXcgKGJ1Ziwgc2VjLCAwLCBmcmFnUC0+ZnJfbmV4dCksCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0KLSAgICAgIC8qIE5vdyBjcmVhdGUgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoICsgZml4dXAgdG8gdGhlCi0JIGZpbmFsIHRhcmdldC4gICovCi0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAzXSA9IDB4ZGM7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDQsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDg7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA2KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4Y2Q7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDIsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDU7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSA3KQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZGQ7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA1XSA9IGZyYWdQLT5mcl9saXRlcmFsW29mZnNldCArIDNdOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgNl0gPSBmcmFnUC0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyA0XTsKLQotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAxLCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMSwgMSwgQkZEX1JFTE9DXzMyX1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA3OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOCkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGZhOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGZmOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXggKyAyLCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0ICsgMiwgMSwgQkZEX1JFTE9DXzE2X1BDUkVMKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gOSkKLSAgICB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgICAgIGZyYWdQLT5mcl9saXRlcmFsW29mZnNldF0gPSAweGZjOwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gPSAweGZmOwotCi0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAyLCAxLCBCRkRfUkVMT0NfMzJfUENSRUwpOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDY7Ci0gICAgfQotICBlbHNlIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAxMCkKLSAgICB7Ci0gICAgICBmcmFnUC0+ZnJfbGl0ZXJhbFtmcmFnUC0+ZnJfZml4XSA9IDB4Y2E7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDEsIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQgKyAxLCAxLCBCRkRfUkVMT0NfOF9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDExKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4Y2M7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18xNl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMzsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEyKQotICAgIHsKLSAgICAgIGludCBvZmZzZXQgPSBmcmFnUC0+ZnJfZml4OwotICAgICAgZnJhZ1AtPmZyX2xpdGVyYWxbb2Zmc2V0XSA9IDB4ZGM7Ci0KLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCArIDEsIDEsIEJGRF9SRUxPQ18zMl9QQ1JFTCk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWcsIGFkZHIpCi0gICAgIGFzZWN0aW9uICpzZWc7Ci0gICAgIHZhbHVlVCBhZGRyOwotewotICBpbnQgYWxpZ24gPSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZyk7Ci0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpvcDsKLQotICBtbjEwMzAwX2hhc2ggPSBoYXNoX25ldygpOwotCi0gIC8qIEluc2VydCB1bmlxdWUgbmFtZXMgaW50byBoYXNoIHRhYmxlLiAgVGhlIE1OMTAzMDAgaW5zdHJ1Y3Rpb24gc2V0Ci0gICAgIGhhcyBtYW55IGlkZW50aWNhbCBvcGNvZGUgbmFtZXMgdGhhdCBoYXZlIGRpZmZlcmVudCBvcGNvZGVzIGJhc2VkCi0gICAgIG9uIHRoZSBvcGVyYW5kcy4gIFRoaXMgaGFzaCB0YWJsZSB0aGVuIHByb3ZpZGVzIGEgcXVpY2sgaW5kZXggdG8KLSAgICAgdGhlIGZpcnN0IG9wY29kZSB3aXRoIGEgcGFydGljdWxhciBuYW1lIGluIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCi0gIG9wID0gbW4xMDMwMF9vcGNvZGVzOwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcC0+bmFtZSkpIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG1uMTAzMDBfaGFzaCwgb3AtPm5hbWUsIChjaGFyICopIG9wKTsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICAvKiBUaGlzIGlzIGJvdGggYSBzaW1wbGlmaWNhdGlvbiAod2UgZG9uJ3QgaGF2ZSB0byB3cml0ZSBtZF9hcHBseV9maXgpCi0gICAgIGFuZCBzdXBwb3J0IGZvciBmdXR1cmUgb3B0aW1pemF0aW9ucyAoYnJhbmNoIHNob3J0ZW5pbmcgYW5kIHNpbWlsYXIKLSAgICAgc3R1ZmYgaW4gdGhlIGxpbmtlcikuICAqLwotICBsaW5rcmVsYXggPSAxOwotCi0gIC8qIFNldCB0aGUgZGVmYXVsdCBtYWNoaW5lIHR5cGUuICAqLwotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21uMTAzMDAsIDMwMCkpCi0gICAgYXNfd2FybiAoXygiY291bGQgbm90IHNldCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUiKSk7Ci0KLSAgY3VycmVudF9tYWNoaW5lID0gMzAwOwotfQotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKSAKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgKm9wY29kZTsKLSAgc3RydWN0IG1uMTAzMDBfb3Bjb2RlICpuZXh0X29wY29kZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleF9wdHI7Ci0gIGludCBuZXh0X29waW5kZXgsIHJlbGF4YWJsZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuLCBleHRlbnNpb24sIHNpemUgPSAwOwotICBjaGFyICpmOwotICBpbnQgaTsKLSAgaW50IG1hdGNoOwotCi0gIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICEgaXNzcGFjZSAoKnMpOyBzKyspCi0gICAgOwotICBpZiAoKnMgIT0gJ1wwJykKLSAgICAqcysrID0gJ1wwJzsKLQotICAvKiBmaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUgKi8KLSAgb3Bjb2RlID0gKHN0cnVjdCBtbjEwMzAwX29wY29kZSAqKWhhc2hfZmluZCAobW4xMDMwMF9oYXNoLCBzdHIpOwotICBpZiAob3Bjb2RlID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ciA9IHM7Ci0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICArK3N0cjsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgZm9yKDs7KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgICAgIGludCBvcF9pZHg7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgaW50IGV4dHJhX3NoaWZ0ID0gMDsKLQotCi0gICAgICBlcnJtc2cgPSBfKCJJbnZhbGlkIG9wY29kZS9vcGVyYW5kcyIpOwotCi0gICAgICAvKiBSZXNldCB0aGUgYXJyYXkgb2YgcmVnaXN0ZXIgb3BlcmFuZHMuICAqLwotICAgICAgbWVtc2V0IChtbjEwMzAwX3JlZ19vcGVyYW5kcywgLTEsIHNpemVvZiAobW4xMDMwMF9yZWdfb3BlcmFuZHMpKTsKLQotICAgICAgcmVsYXhhYmxlID0gMDsKLSAgICAgIGZjID0gMDsKLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIG5leHRfb3BpbmRleCA9IDA7Ci0gICAgICBpbnNuID0gb3Bjb2RlLT5vcGNvZGU7Ci0gICAgICBleHRlbnNpb24gPSAwOwotCi0gICAgICAvKiBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgY3VycmVudCBtYWNoaW5lCi0JIHRoZW4gaXQgY2FuIG5vdCBwb3NzaWJseSBtYXRjaC4gICovCi0gICAgICBpZiAob3Bjb2RlLT5tYWNoaW5lCi0JICAmJiAob3Bjb2RlLT5tYWNoaW5lICE9IGN1cnJlbnRfbWFjaGluZSkpCi0JZ290byBlcnJvcjsKLQotICAgICAgZm9yIChvcF9pZHggPSAxLCBvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7Ci0JICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgb3BpbmRleF9wdHIrKywgb3BfaWR4KyspCi0JewotCSAgY29uc3Qgc3RydWN0IG1uMTAzMDBfb3BlcmFuZCAqb3BlcmFuZDsKLQkgIGV4cHJlc3Npb25TIGV4OwotCi0JICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJm1uMTAzMDBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzW25leHRfb3BpbmRleF07Ci0JICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLQkgICAgfQotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcpCi0JICAgICsrc3RyOwotCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVMQVgpCi0JICAgIHJlbGF4YWJsZSA9IDE7Ci0KLQkgIC8qIEdhdGhlciB0aGUgb3BlcmFuZC4gKi8KLQkgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLQkgIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikKLQkgICAgewotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICAvKiBTZWUgaWYgd2UgY2FuIG1hdGNoIHRoZSBvcGVyYW5kcy4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9EUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFkYXRhX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9BUkVHKQotCSAgICB7Ci0JICAgICAgaWYgKCFhZGRyZXNzX3JlZ2lzdGVyX25hbWUgKCZleCkpCi0JCXsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUCkKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAic3AiKSAhPSAwKQotCQl7Ci0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkJICBzdHIgPSBob2xkOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BTVykKLQkgICAgewotCSAgICAgIGNoYXIgKnN0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGNoYXIgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAicHN3IikgIT0gMCkKLQkJewotCQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgZ290byBrZWVwX2dvaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NRFIpCi0JICAgIHsKLQkgICAgICBjaGFyICpzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjaGFyIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotCSAgICAgIGlmIChzdHJjYXNlY21wIChzdGFydCwgIm1kciIpICE9IDApCi0JCXsKLQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgIHN0ciA9IGhvbGQ7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIGdvdG8ga2VlcF9nb2luZzsKLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOwotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdbJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgICAvKiBFYXQgdGhlICdbJy4gICovCi0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAKLQkgICAgICAvKiBXZSB1c2VkIHRvIHJlamVjdCBhIG51bGwgcmVnaXN0ZXIgbGlzdCBoZXJlOyBob3dldmVyLAotCQkgd2UgYWNjZXB0IGl0IG5vdyBzbyB0aGUgY29tcGlsZXIgY2FuIGVtaXQgImNhbGwiIGluc3RydWN0aW9ucwotCQkgZm9yIGFsbCBjYWxscyB0byBuYW1lZCBmdW5jdGlvbnMuCi0KLQkJIFRoZSBsaW5rZXIgY2FuIHRoZW4gZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgYml0cyBmb3IgdGhlCi0JCSByZWdpc3RlciBsaXN0IGFuZCBzdGFjayBzaXplIG9yIGNoYW5nZSB0aGUgaW5zdHJ1Y3Rpb24KLQkJIGludG8gYSAiY2FsbHMiIGlmIHVzaW5nICJjYWxsIiBpcyBub3QgcHJvZml0YWJsZS4gICovCi0JICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ10nKQotCQl7Ci0JCSAgY2hhciAqc3RhcnQ7Ci0JCSAgY2hhciBjOwotCi0JCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCQkgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLQkJICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkJICBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJkMiIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4ODA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAiZDMiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDQwOwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlIGlmIChzdHJjYXNlY21wIChzdGFydCwgImEyIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgdmFsdWUgfD0gMHgyMDsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc3RhcnQsICJhMyIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHZhbHVlIHw9IDB4MTA7Ci0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHN0YXJ0LCAib3RoZXIiKSA9PSAwKQotCQkgICAgewotCQkgICAgICB2YWx1ZSB8PSAweDA4OwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgICAgIHN0ciA9IGhvbGQ7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgICAgICAgICAgbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAoY2hhciAqKSBOVUxMLCAwLCAwKTsKLQkgICAgICBnb3RvIGtlZXBfZ29pbmc7Ci0KLQkgICAgfQotCSAgZWxzZSBpZiAoZGF0YV9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGFkZHJlc3NfcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgc3RyID0gaG9sZDsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICB9Ci0JICBlbHNlIGlmIChvdGhlcl9yZWdpc3Rlcl9uYW1lICgmZXgpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpzdHIgPT0gJyknIHx8ICpzdHIgPT0gJygnKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQkgICAgICBzdHIgPSBob2xkOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb24gKCZleCk7Ci0JICAgIH0KLQotCSAgc3dpdGNoIChleC5YX29wKSAKLQkgICAgewotCSAgICBjYXNlIE9faWxsZWdhbDoKLQkgICAgICBlcnJtc2cgPSBfKCJpbGxlZ2FsIG9wZXJhbmQiKTsKLQkgICAgICBnb3RvIGVycm9yOwotCSAgICBjYXNlIE9fYWJzZW50OgotCSAgICAgIGVycm1zZyA9IF8oIm1pc3Npbmcgb3BlcmFuZCIpOwotCSAgICAgIGdvdG8gZXJyb3I7Ci0JICAgIGNhc2UgT19yZWdpc3RlcjoKLQkgICAgICB7Ci0JCWludCBtYXNrOwotCi0JCW1hc2sgPSBNTjEwMzAwX09QRVJBTkRfRFJFRyB8IE1OMTAzMDBfT1BFUkFORF9BUkVHOwotCQlpZiAoKG9wZXJhbmQtPmZsYWdzICYgbWFzaykgPT0gMCkKLQkJICB7Ci0JCSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCQkgICAgc3RyID0gaG9sZDsKLQkJICAgIGdvdG8gZXJyb3I7Ci0JCSAgfQotCQkKLQkJaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzEpCi0JCSAgZXh0cmFfc2hpZnQgPSA4OwotCQllbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDIKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDQKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzYKLQkJCSB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDUpCi0JCSAgZXh0cmFfc2hpZnQgPSAxNjsKLQkJZWxzZQotCQkgIGV4dHJhX3NoaWZ0ID0gMDsKLQkgICAgICAKLQkJbW4xMDMwMF9pbnNlcnRfb3BlcmFuZCAoJmluc24sICZleHRlbnNpb24sIG9wZXJhbmQsCi0JCQkJCWV4LlhfYWRkX251bWJlciwgKGNoYXIgKikgTlVMTCwKLQkJCQkJMCwgZXh0cmFfc2hpZnQpOwotCi0KLQkJLyogQW5kIG5vdGUgdGhlIHJlZ2lzdGVyIG51bWJlciBpbiB0aGUgcmVnaXN0ZXIgYXJyYXkuICAqLwotCQltbjEwMzAwX3JlZ19vcGVyYW5kc1tvcF9pZHggLSAxXSA9IGV4LlhfYWRkX251bWJlcjsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGNhc2UgT19jb25zdGFudDoKLQkgICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgY2FuIGJlIHByb21vdGVkLCBhbmQgaXQgZG9lc24ndAotCQkgZml0IGludG8gdGhlIGFsbG9jYXRlZCBiaXRmaWVsZCBmb3IgdGhpcyBpbnNuLAotCQkgdGhlbiBwcm9tb3RlIGl0IChpZSB0aGlzIG9wY29kZSBkb2VzIG5vdCBtYXRjaCkuICAqLwotCSAgICAgIGlmIChvcGVyYW5kLT5mbGFncwotCQkgICYgKE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYKQotCQkgICYmICEgY2hlY2tfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyKSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgICBtbjEwMzAwX2luc2VydF9vcGVyYW5kICgmaW5zbiwgJmV4dGVuc2lvbiwgb3BlcmFuZCwKLQkJCQkgICAgICBleC5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwsCi0JCQkJICAgICAgMCwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgY2FuIGJlIHByb21vdGVkLCB0aGVuIHRoaXMgb3Bjb2RlIGRpZG4ndAotCQkgbWF0Y2ggc2luY2Ugd2UgY2FuJ3Qga25vdyBpZiBpdCBuZWVkZWQgcHJvbW90aW9uISAgKi8KLQkgICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSkKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JCSAgc3RyID0gaG9sZDsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICAgICAgaWYgKGZjID49IE1BWF9JTlNOX0ZJWFVQUykKLQkJYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQkgICAgICBmaXh1cHNbZmNdLmV4cCA9IGV4OwotCSAgICAgIGZpeHVwc1tmY10ub3BpbmRleCA9ICpvcGluZGV4X3B0cjsKLQkgICAgICBmaXh1cHNbZmNdLnJlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgICArK2ZjOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLWtlZXBfZ29pbmc6Ci0JICBzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcpCi0JICAgICsrc3RyOwotCi0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgdXNlZCBhbGwgdGhlIG9wZXJhbmRzISAgKi8KLSAgICAgIGlmICgqc3RyICE9ICcsJykKLQltYXRjaCA9IDE7Ci0KLSAgICAgIC8qIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIHJlZ2lzdGVycyB0aGF0IG11c3Qgbm90IG1hdGNoLCB2ZXJpZnkKLQkgdGhhdCB0aGV5IGRvIGluZGVlZCBub3QgbWF0Y2guICAqLwotICAgICAgaWYgKG9wY29kZS0+bm9fbWF0Y2hfb3BlcmFuZHMpCi0JewotCSAgaW50IGk7Ci0KLQkgIC8qIExvb2sgYXQgZWFjaCBvcGVyYW5kIHRvIHNlZSBpZiBpdCdzIG1hcmtlZC4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgTU4xMDMwMF9NQVhfT1BFUkFORFM7IGkrKykKLQkgICAgewotCSAgICAgIGlmICgoMSA8PCBpKSAmIG9wY29kZS0+bm9fbWF0Y2hfb3BlcmFuZHMpCi0JCXsKLQkJICBpbnQgajsKLQotCQkgIC8qIG9wZXJhbmQgSSBpcyBtYXJrZWQuICBDaGVjayB0aGF0IGl0IGRvZXMgbm90IG1hdGNoIGFueQotCQkgICAgIG9wZXJhbmRzID4gSSB3aGljaCBhcmUgbWFya2VkLiAgKi8KLQkJICBmb3IgKGogPSBpICsgMTsgaiA8IE1OMTAzMDBfTUFYX09QRVJBTkRTOyBqKyspCi0JCSAgICB7Ci0JCSAgICAgIGlmICgoKDEgPDwgaikgJiBvcGNvZGUtPm5vX21hdGNoX29wZXJhbmRzKQotCQkJICAmJiBtbjEwMzAwX3JlZ19vcGVyYW5kc1tpXSA9PSBtbjEwMzAwX3JlZ19vcGVyYW5kc1tqXSkKLQkJCXsKLQkJCSAgZXJybXNnID0gXygiSW52YWxpZCByZWdpc3RlciBzcGVjaWZpY2F0aW9uLiIpOwotCQkJICBtYXRjaCA9IDA7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0gICAgICAgIHsKLQkgIG5leHRfb3Bjb2RlID0gb3Bjb2RlICsgMTsKLQkgIGlmICghc3RyY21wKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpKQotCSAgICB7Ci0JICAgICAgb3Bjb2RlID0gbmV4dF9vcGNvZGU7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIAotCSAgYXNfYmFkICgiJXMiLCBlcnJtc2cpOwotCSAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgICAKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlmICgqc3RyICE9ICdcMCcpCi0gICAgYXNfYmFkIChfKCJqdW5rIGF0IGVuZCBvZiBsaW5lOiBgJXMnIiksIHN0cik7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCi0gIC8qIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MwKQotICAgIHNpemUgPSAxOwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzEgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QwKQotICAgIHNpemUgPSAyOwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzIgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QxKQotICAgIHNpemUgPSAzOwotCi0KLSAgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TNCkKLSAgICBzaXplID0gNTsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M2IHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9ENSkKLSAgICBzaXplID0gNzsKLQotICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyKQotICAgIHNpemUgPSA0OwotCi0gIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDQpCi0gICAgc2l6ZSA9IDY7Ci0KLSAgaWYgKHJlbGF4YWJsZSAmJiBmYyA+IDApCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0KLSAgICAgIC8qIGJDQyAqLwotICAgICAgaWYgKHNpemUgPT0gMikKLQl7Ci0JICAvKiBIYW5kbGUgYnJhIHNwZWNpYWxseS4gIEJhc2ljYWxseSB0cmVhdCBpdCBsaWtlIGptcCBzbwotCSAgICAgdGhhdCB3ZSBhdXRvbWF0aWNhbGx5IGhhbmRsZSA4LCAxNiBhbmQgMzIgYml0IG9mZnNldHMKLQkgICAgIGNvcnJlY3RseSBhcyB3ZWxsIGFzIGp1bXBzIHRvIGFuIHVuZGVmaW5lZCBhZGRyZXNzLgotCi0JICAgICBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3QgdHJlYXQgaXQgbGlrZSBvdGhlciBiQ0MKLQkgICAgIGluc3RydWN0aW9ucyBzaW5jZSB0aGUgbG9uZyBmb3JtcyBvZiBicmEgaXMgZGlmZmVyZW50Ci0JICAgICBmcm9tIG90aGVyIGJDQyBpbnN0cnVjdGlvbnMuICAqLwotCSAgaWYgKG9wY29kZS0+b3Bjb2RlID09IDB4Y2EwMCkKLQkgICAgdHlwZSA9IDEwOwotCSAgZWxzZQotCSAgICB0eXBlID0gMDsKLQl9Ci0gICAgICAvKiBjYWxsICovCi0gICAgICBlbHNlIGlmIChzaXplID09IDUpCi0gICAgICAgIHR5cGUgPSA2OwotICAgICAgLyogY2FsbHMgKi8KLSAgICAgIGVsc2UgaWYgKHNpemUgPT0gNCkKLQl0eXBlID0gODsKLSAgICAgIC8qIGptcCAqLwotICAgICAgZWxzZSBpZiAoc2l6ZSA9PSAzICYmIG9wY29kZS0+b3Bjb2RlID09IDB4Y2MwMDAwKQotCXR5cGUgPSAxMDsKLSAgICAgIC8qIGJDQyAodW5jb21tb24gY2FzZXMpICovCi0gICAgICBlbHNlCi0JdHlwZSA9IDM7Ci0KLSAgICAgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDggLSBzaXplLCB0eXBlLAotCQkgICAgZml4dXBzWzBdLmV4cC5YX2FkZF9zeW1ib2wsCi0JCSAgICBmaXh1cHNbMF0uZXhwLlhfYWRkX251bWJlciwKLQkJICAgIChjaGFyICopZml4dXBzWzBdLm9waW5kZXgpOwotICAgICAgCi0gICAgICAvKiBUaGlzIGlzIHByZXR0eSBob2tleS4gIFdlIGJhc2ljYWxseSBqdXN0IGNhcmUgYWJvdXQgdGhlCi0JIG9wY29kZSwgc28gd2UgaGF2ZSB0byB3cml0ZSBvdXQgdGhlIGZpcnN0IHdvcmQgYmlnIGVuZGlhbi4KLQotCSBUaGUgZXhjZXB0aW9uIGlzICJjYWxsIiwgd2hpY2ggaGFzIHR3byBvcGVyYW5kcyB0aGF0IHdlCi0JIGNhcmUgYWJvdXQuCi0KLQkgVGhlIGZpcnN0IG9wZXJhbmQgKHRoZSByZWdpc3RlciBsaXN0KSBoYXBwZW5zIHRvIGJlIGluIHRoZQotCSBmaXJzdCBpbnN0cnVjdGlvbiB3b3JkLCBhbmQgd2lsbCBiZSBpbiB0aGUgcmlnaHQgcGxhY2UgaWYKLQkgd2Ugb3V0cHV0IHRoZSBmaXJzdCB3b3JkIGluIGJpZyBlbmRpYW4gbW9kZS4KLQotCSBUaGUgc2Vjb25kIG9wZXJhbmQgKHN0YWNrIHNpemUpIGlzIGluIHRoZSBleHRlbnNpb24gd29yZCwKLQkgYW5kIHdlIHdhbnQgaXQgdG8gYXBwZWFyIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGV4dGVuc2lvbgotCSB3b3JkIChhcyBpdCBhcHBlYXJzIGluIG1lbW9yeSkuICBMdWNraWx5LCB3cml0aW5nIHRoZSBleHRlbnNpb24KLQkgd29yZCBpbiBiaWcgZW5kaWFuIGZvcm1hdCB3aWxsIGRvIHdoYXQgd2Ugd2FudC4gICovCi0gICAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCBzaXplID4gNCA/IDQgOiBzaXplKTsKLSAgICAgIGlmIChzaXplID4gOCkKLQl7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNCwgZXh0ZW5zaW9uLCA0KTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA4LCAwLCBzaXplIC0gOCk7Ci0JfQotICAgICAgZWxzZSBpZiAoc2l6ZSA+IDQpCi0JbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiArIDQsIGV4dGVuc2lvbiwgc2l6ZSAtIDQpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgZiA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0KLSAgICAgIC8qIEZpbGwgaW4gYnl0ZXMgZm9yIHRoZSBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCBvcGNvZGUgZmllbGRzCi0JIGFyZSB3cml0dGVuIGJpZy1lbmRpYW4sIDE2ICYgMzJiaXQgaW1tZWRpYXRlcyBhcmUgd3JpdHRlbgotCSBsaXR0bGUgZW5kaWFuLiAgRWdhZC4gICovCi0gICAgICBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MwCi0JICB8fCBvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzEKLQkgIHx8IG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMAotCSAgfHwgb3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QxKQotCXsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIGluc24sIHNpemUpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9TMgotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGRmMDAwMAotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGRlMDAwMCkKLQl7Ci0JICAvKiBBIGZvcm1hdCBTMiBpbnN0cnVjdGlvbiB0aGF0IGlzIF9ub3RfICJyZXQiIGFuZCAicmV0ZiIuICAqLwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMSwgaW5zbiAmIDB4ZmZmZiwgMik7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1MyKQotCXsKLQkgIC8qIFRoaXMgbXVzdCBiZSBhIHJldCBvciByZXRmLCB3aGljaCBpcyB3cml0dGVuIGVudGlyZWx5IGluCi0JICAgICBiaWctZW5kaWFuIGZvcm1hdC4gICovCi0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCAzKTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzQKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhkYzAwMDAwMCkKLQl7Ci0JICAvKiBUaGlzIG11c3QgYmUgYSBmb3JtYXQgUzQgImNhbGwiIGluc3RydWN0aW9uLiAgV2hhdCBhIHBhaW4uICAqLwotCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKGluc24gPj4gOCkgJiAweGZmZmY7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAyNCkgJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAxLCB0ZW1wLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyAzLCBpbnNuICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNCwgZXh0ZW5zaW9uICYgMHhmZiwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX1M0KQotCXsKLQkgIC8qIFRoaXMgbXVzdCBiZSBhIGZvcm1hdCBTNCAiam1wIiBpbnN0cnVjdGlvbi4gICovCi0JICB1bnNpZ25lZCBsb25nIHRlbXAgPSAoKGluc24gJiAweGZmZmZmZikgPDwgOCkgfCAoZXh0ZW5zaW9uICYgMHhmZik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAyNCkgJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAxLCB0ZW1wLCA0KTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfUzYpCi0JewotCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZmZmZmYpIDw8IDgpCi0JICAgIHwgKChleHRlbnNpb24gPj4gMTYpICYgMHhmZik7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAyNCkgJiAweGZmLCAxKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAxLCB0ZW1wLCA0KTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA1LCAoZXh0ZW5zaW9uID4+IDgpICYgMHhmZiwgMSk7Ci0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmICsgNiwgZXh0ZW5zaW9uICYgMHhmZiwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0QyCi0JICAgICAgICYmIG9wY29kZS0+b3Bjb2RlICE9IDB4ZmFmODAwMDAKLQkgICAgICAgJiYgb3Bjb2RlLT5vcGNvZGUgIT0gMHhmYWYwMDAwMAotCSAgICAgICAmJiBvcGNvZGUtPm9wY29kZSAhPSAweGZhZjQwMDAwKQotCXsKLQkgIC8qIEEgZm9ybWF0IEQyIGluc3RydWN0aW9uIHdoZXJlIHRoZSAxNmJpdCBpbW1lZGlhdGUgaXMKLQkgICAgIHJlYWxseSBhIHNpbmdsZSAxNmJpdCB2YWx1ZSwgbm90IHR3byA4Yml0IHZhbHVlcy4gICovCi0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCAoaW5zbiA+PiAxNikgJiAweGZmZmYsIDIpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoZiArIDIsIGluc24gJiAweGZmZmYsIDIpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wY29kZS0+Zm9ybWF0ID09IEZNVF9EMikKLQl7Ci0JICAvKiBBIGZvcm1hdCBEMiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgMTZiaXQgaW1tZWRpYXRlCi0JICAgICBpcyByZWFsbHkgdHdvIDhiaXQgaW1tZWRpYXRlcy4gICovCi0JICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChmLCBpbnNuLCA0KTsKLQl9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmZvcm1hdCA9PSBGTVRfRDQpCi0JewotCSAgdW5zaWduZWQgbG9uZyB0ZW1wID0gKChpbnNuICYgMHhmZmZmKSA8PCAxNikgfCAoZXh0ZW5zaW9uICYgMHhmZmZmKTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYsIChpbnNuID4+IDE2KSAmIDB4ZmZmZiwgMik7Ci0JICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChmICsgMiwgdGVtcCwgNCk7Ci0JfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5mb3JtYXQgPT0gRk1UX0Q1KQotCXsKLQkgIHVuc2lnbmVkIGxvbmcgdGVtcCA9ICgoaW5zbiAmIDB4ZmZmZikgPDwgMTYpCi0JICAgIAkJCXwgKChleHRlbnNpb24gPj4gOCkgJiAweGZmZmYpOwotCSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoZiwgKGluc24gPj4gMTYpICYgMHhmZmZmLCAyKTsKLQkgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGYgKyAyLCB0ZW1wLCA0KTsKLQkgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGYgKyA2LCBleHRlbnNpb24gJiAweGZmLCAxKTsKLQl9Ci0KLSAgICAgIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBmYzsgaSsrKQotCXsKLQkgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0KLQkgIG9wZXJhbmQgPSAmbW4xMDMwMF9vcGVyYW5kc1tmaXh1cHNbaV0ub3BpbmRleF07Ci0JICBpZiAoZml4dXBzW2ldLnJlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JICAgIHsKLQkgICAgICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0bzsKLQkgICAgICBpbnQgc2l6ZTsKLQkgICAgICBpbnQgb2Zmc2V0OwotCSAgICAgIGZpeFMgKmZpeFA7Ci0KLQkgICAgICByZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cHNbaV0ucmVsb2MpOwotCi0JICAgICAgaWYgKCFyZWxvY19ob3d0bykKLQkJYWJvcnQoKTsKLQkgIAotCSAgICAgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgICAgIGlmIChzaXplIDwgMSB8fCBzaXplID4gNCkKLQkJYWJvcnQoKTsKLQotCSAgICAgIG9mZnNldCA9IDQgLSBzaXplOwotCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKLQkJCQkgIHNpemUsICZmaXh1cHNbaV0uZXhwLAotCQkJCSAgcmVsb2NfaG93dG8tPnBjX3JlbGF0aXZlLAotCQkJCSAgZml4dXBzW2ldLnJlbG9jKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IHJlbG9jLCBwY3JlbCwgcmVsb2Nfc2l6ZSwgb2Zmc2V0OwotCSAgICAgIGZpeFMgKmZpeFA7Ci0KLQkgICAgICByZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotCSAgICAgIC8qIEhvdyBiaWcgaXMgdGhlIHJlbG9jPyAgUmVtZW1iZXIgU1BMSVQgcmVsb2NzIGFyZQotCQkgaW1wbGljaXRseSAzMmJpdHMuICAqLwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0JCXJlbG9jX3NpemUgPSAzMjsKLQkgICAgICBlbHNlCi0JCXJlbG9jX3NpemUgPSBvcGVyYW5kLT5iaXRzOwotCi0JICAgICAgLyogSXMgdGhlIHJlbG9jIHBjLXJlbGF0aXZlPyAgKi8KLQkgICAgICBwY3JlbCA9IChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCkgIT0gMDsKLQotCSAgICAgIC8qIEdyb3NzLiAgVGhpcyBkaXNndXN0aW5nIGhhY2sgaXMgdG8gbWFrZSBzdXJlIHdlCi0JCSBnZXQgdGhlIHJpZ2h0IG9mZnNldCBmb3IgdGhlIDE2LzMyIGJpdCByZWxvYyBpbiAKLQkJICJjYWxsIiBpbnN0cnVjdGlvbnMuICBCYXNpY2FsbHkgdGhleSdyZSBhIHBhaW4KLQkJIGJlY2F1c2UgdGhlIHJlbG9jIGlzbid0IGF0IHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoKHNpemUgPT0gNSB8fCBzaXplID09IDcpCi0JCSAgJiYgKCgoaW5zbiA+PiAyNCkgJiAweGZmKSA9PSAweGNkCi0JCSAgICAgIHx8ICgoaW5zbiA+PiAyNCkgJiAweGZmKSA9PSAweGRkKSkKLQkJc2l6ZSAtPSAyOwotCi0JICAgICAgLyogU2ltaWxhcmx5IGZvciBjZXJ0YWluIGJpdCBpbnN0cnVjdGlvbnMgd2hpY2ggZG9uJ3QKLQkJIGhhdiB0aGVpciAzMmJpdCByZWxvYyBhdCB0aGUgdGFpbCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGlmIChzaXplID09IDcKLQkJICAmJiAoKChpbnNuID4+IDE2KSAmIDB4ZmZmZikgPT0gMHhmZTAwCi0JCSAgICAgIHx8ICgoaW5zbiA+PiAxNikgJiAweGZmZmYpID09IDB4ZmUwMQotCQkgICAgICB8fCAoKGluc24gPj4gMTYpICYgMHhmZmZmKSA9PSAweGZlMDIpKQotCQlzaXplIC09IDE7Ci0JCi0JICAgICAgb2Zmc2V0ID0gc2l6ZSAtIHJlbG9jX3NpemUgLyA4OwotCi0JICAgICAgLyogQ2hvb3NlIGEgcHJvcGVyIEJGRCByZWxvY2F0aW9uIHR5cGUuICAqLwotCSAgICAgIGlmIChwY3JlbCkKLQkJewotCQkgIGlmIChyZWxvY19zaXplID09IDMyKQotCQkgICAgcmVsb2MgPSBCRkRfUkVMT0NfMzJfUENSRUw7Ci0JCSAgZWxzZSBpZiAocmVsb2Nfc2l6ZSA9PSAxNikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzE2X1BDUkVMOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gOCkKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzhfUENSRUw7Ci0JCSAgZWxzZQotCQkgICAgYWJvcnQgKCk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAocmVsb2Nfc2l6ZSA9PSAzMikKLQkJICAgIHJlbG9jID0gQkZEX1JFTE9DXzMyOwotCQkgIGVsc2UgaWYgKHJlbG9jX3NpemUgPT0gMTYpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ18xNjsKLQkJICBlbHNlIGlmIChyZWxvY19zaXplID09IDgpCi0JCSAgICByZWxvYyA9IEJGRF9SRUxPQ184OwotCQkgIGVsc2UKLQkJICAgIGFib3J0ICgpOwotCQl9Ci0KLQkgICAgICAvKiBDb252ZXJ0IHRoZSBzaXplIG9mIHRoZSByZWxvYyBpbnRvIHdoYXQgZml4X25ld19leHAgd2FudHMuICAqLwotCSAgICAgIHJlbG9jX3NpemUgPSByZWxvY19zaXplIC8gODsKLQkgICAgICBpZiAocmVsb2Nfc2l6ZSA9PSA4KQotCQlyZWxvY19zaXplID0gMDsKLQkgICAgICBlbHNlIGlmIChyZWxvY19zaXplID09IDE2KQotCQlyZWxvY19zaXplID0gMTsKLQkgICAgICBlbHNlIGlmIChyZWxvY19zaXplID09IDMyKQotCQlyZWxvY19zaXplID0gMjsKLQotCSAgICAgIGZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwKLQkJCQkgIHJlbG9jX3NpemUsICZmaXh1cHNbaV0uZXhwLCBwY3JlbCwKLQkJCQkgICgoYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlKSByZWxvYykpOwotCi0JICAgICAgaWYgKHBjcmVsKQotCQlmaXhQLT5meF9vZmZzZXQgKz0gb2Zmc2V0OwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi0vKiBpZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlICovCi0gICAgICAgICAgICAgICAgIAotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0gIHJlbG9jID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0gIGlmIChyZWxvYy0+aG93dG8gPT0gKHJlbG9jX2hvd3RvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAoaW50KWZpeHAtPmZ4X3JfdHlwZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotCi0gIGlmIChmaXhwLT5meF9hZGRzeSAmJiBmaXhwLT5meF9zdWJzeSkKLSAgICB7Ci0gICAgCi0gICAgICBpZiAoKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9zdWJzeSkpCi0JICB8fCBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJIkRpZmZlcmVuY2Ugb2Ygc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgaXMgbm90IHN1cHBvcnRlZCIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotCi0gICAgICByZWxvYy0+c3ltX3B0cl9wdHIgPSAmYmZkX2Fic19zeW1ib2w7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gKFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSkKLQkJICAgICAgIC0gU19HRVRfVkFMVUUgKGZpeHAtPmZ4X3N1YnN5KSArIGZpeHAtPmZ4X29mZnNldCk7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YoIGFzeW1ib2wgKikpOwotICAgICAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gICAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+Znhfb2Zmc2V0OwotICAgIH0KLSAgcmV0dXJuIHJlbG9jOwotfQotCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFncCwgc2VnKQotICAgICBmcmFnUyAqZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICpzZWc7Ci17Ci0gIGlmIChmcmFncC0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHJldHVybiAyOwotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICByZXR1cm4gMzsKLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDYpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA3OwotCSAgcmV0dXJuIDc7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiA1OwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDgpCi0gICAgewotICAgICAgaWYgKCFTX0lTX0RFRklORUQgKGZyYWdwLT5mcl9zeW1ib2wpCi0JICB8fCBzZWcgIT0gU19HRVRfU0VHTUVOVCAoZnJhZ3AtPmZyX3N5bWJvbCkpCi0JewotCSAgZnJhZ3AtPmZyX3N1YnR5cGUgPSA5OwotCSAgcmV0dXJuIDY7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiA0OwotICAgIH0KLSAgaWYgKGZyYWdwLT5mcl9zdWJ0eXBlID09IDEwKQotICAgIHsKLSAgICAgIGlmICghU19JU19ERUZJTkVEIChmcmFncC0+ZnJfc3ltYm9sKQotCSAgfHwgc2VnICE9IFNfR0VUX1NFR01FTlQgKGZyYWdwLT5mcl9zeW1ib2wpKQotCXsKLQkgIGZyYWdwLT5mcl9zdWJ0eXBlID0gMTI7Ci0JICByZXR1cm4gNTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDI7Ci0gICAgfQotfSAKLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0jaWYgMAotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTCAmJiAhIFNfSVNfREVGSU5FRCAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLiAgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIHJldHVybiBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0jZW5kaWYKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqZml4cDsKLSAgICAgdmFsdWVUICp2YWx1ZXA7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBXZSBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZSBiZWNhdXNlIGxpbmtyZWxheCBpcyBub256ZXJvLiAgKi8KLSAgYWJvcnQgKCk7Ci0gIGZpeHAtPmZ4X2RvbmUgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1tbjEwMzAwX2luc2VydF9vcGVyYW5kIChpbnNucCwgZXh0ZW5zaW9ucCwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzaGlmdCkKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKmV4dGVuc2lvbnA7Ci0gICAgIGNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIG9mZnNldFQgdmFsOwotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNoaWZ0OwotewotICAvKiBObyBuZWVkIHRvIGNoZWNrIDMyYml0IG9wZXJhbmRzIGZvciBhIGJpdC4gIE5vdGUgdGhhdAotICAgICBNTjEwMzAwX09QRVJBTkRfU1BMSVQgaXMgYW4gaW1wbGljaXQgMzJiaXQgb3BlcmFuZC4gICovCi0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyCi0gICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpID09IDApCi0gICAgewotICAgICAgbG9uZyBtaW4sIG1heDsKLSAgICAgIG9mZnNldFQgdGVzdDsKLSAgICAgIGludCBiaXRzOwotCi0gICAgICBiaXRzID0gb3BlcmFuZC0+Yml0czsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgbWF4ID0gKDEgPDwgKGJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsKLQl9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBtYXggPSAoMSA8PCBiaXRzKSAtIDE7Ci0gICAgICAgICAgbWluID0gMDsKLSAgICAgICAgfQotCi0gICAgICB0ZXN0ID0gdmFsOwotCi0KLSAgICAgIGlmICh0ZXN0IDwgKG9mZnNldFQpIG1pbiB8fCB0ZXN0ID4gKG9mZnNldFQpIG1heCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnN0IGNoYXIgKmVyciA9Ci0gICAgICAgICAgICBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJXMgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIik7Ci0gICAgICAgICAgY2hhciBidWZbMTAwXTsKLQotICAgICAgICAgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKLSAgICAgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotICAgICAgICAgICAgYXNfd2FybiAoZXJyLCBidWYsIG1pbiwgbWF4KTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotICAgICAgICB9Ci0gICAgfQotCi0gIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0gICAgewotICAgICAgKmluc25wIHw9ICh2YWwgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0gICAgICAqZXh0ZW5zaW9ucCB8PSAoKHZhbCAmICgoMSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkgLSAxKSkKLQkJICAgICAgPDwgb3BlcmFuZC0+c2hpZnQpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEKSA9PSAwKQotICAgIHsKLSAgICAgICppbnNucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJIDw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0KSk7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQpICE9IDApCi0JKmluc25wIHw9ICgoKGxvbmcpIHZhbCAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKQotCQkgICA8PCAob3BlcmFuZC0+c2hpZnQgKyBzaGlmdCArIG9wZXJhbmQtPmJpdHMpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqZXh0ZW5zaW9ucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJICAgICAgPDwgKG9wZXJhbmQtPnNoaWZ0ICsgc2hpZnQpKTsKLQotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRCkgIT0gMCkKLQkqZXh0ZW5zaW9ucCB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkJCTw8IChvcGVyYW5kLT5zaGlmdCArIHNoaWZ0ICsgb3BlcmFuZC0+Yml0cykpOwotICAgIH0KLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWNoZWNrX29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLXsKLSAgLyogTm8gbmVlZCB0byBjaGVjayAzMmJpdCBvcGVyYW5kcyBmb3IgYSBiaXQuICBOb3RlIHRoYXQKLSAgICAgTU4xMDMwMF9PUEVSQU5EX1NQTElUIGlzIGFuIGltcGxpY2l0IDMyYml0IG9wZXJhbmQuICAqLwotICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMgotICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NQTElUKSA9PSAwKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0gICAgICBpbnQgYml0czsKLQotICAgICAgYml0cyA9IG9wZXJhbmQtPmJpdHM7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCXsKLQkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsKLQkgIG1pbiA9IC0gKDEgPDwgKGJpdHMgLSAxKSk7Ci0JfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWF4ID0gKDEgPDwgYml0cykgLSAxOwotICAgICAgICAgIG1pbiA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgdGVzdCA9IHZhbDsKLQotCi0gICAgICBpZiAodGVzdCA8IChvZmZzZXRUKSBtaW4gfHwgdGVzdCA+IChvZmZzZXRUKSBtYXgpCi0JcmV0dXJuIDA7Ci0gICAgICBlbHNlCi0JcmV0dXJuIDE7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9hcmNoX21hY2ggKG1hY2gpCi0gICAgIGludCBtYWNoOwotewotICBpZiAoIWJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIGJmZF9hcmNoX21uMTAzMDAsIG1hY2gpKQotICAgIGFzX3dhcm4gKF8oImNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIikpOwotCi0gIGN1cnJlbnRfbWFjaGluZSA9IG1hY2g7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW1uMTAzMDAuaCBiL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNiMjI3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogdGMtbW4xMDMwMC5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1tbjEwMzAwLmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2RlZmluZSBUQ19NTjEwMzAwCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgTU4xMDMwMCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCBiZmRfYXJjaF9tbjEwMzAwCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAiZWxmMzItbW4xMDMwMCIKLQotI2RlZmluZSBNRF9BUFBMWV9GSVgzCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIFdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIC53b3JkIHN0cmFuZ2VseS4gICovCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0vKiBEb24ndCBib3RoZXIgdG8gYWRqdXN0IHJlbG9jcy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkgMAotCi0vKiBXZSBkbyByZWxheGluZyBpbiB0aGUgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlci4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1uczMyay5jIGIvZ2FzL2NvbmZpZy90Yy1uczMyay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWYxNDY3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtbnMzMmsuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMzAgKzAsMCBAQAotLyogbnMzMmsuYyAgLS0gQXNzZW1ibGUgb24gdGhlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgMzJrIHNlcmllcwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qI2RlZmluZSBTSE9XX05VTSAxKi8vKiB1bmNvbW1lbnQgZm9yIGRlYnVnZ2luZyAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvcGNvZGUvbnMzMmsuaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogTWFjcm9zICovCi0jZGVmaW5lIElJRl9FTlRSSUVTIDEzCQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBpaWYgKi8KLSNkZWZpbmUgUFJJVkFURV9TSVpFIDI1NgkvKiBzaXplIG9mIG15IGdhcmJhZ2UgbWVtb3J5ICovCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgREVGQVVMVAktMQkJLyogYWRkcl9tb2RlIHJldHVybnMgdGhpcyB2YWx1ZSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluIGNvbnN0YW50IG9yIGxhYmVsIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY291bnRlcmVkICovCi0KLSNkZWZpbmUgSUlGKHB0cixhMSxjMSxlMSxnMSxpMSxrMSxtMSxvMSxxMSxzMSx1MSkJXAotICAgIGlpZi5paWZQW3B0cl0udHlwZT0gYTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnNpemU9IGMxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5vYmplY3Q9IGUxOwkJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5vYmplY3RfYWRqdXN0PSBnMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5wY3JlbD0gaTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnBjcmVsX2FkanVzdD0gazE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uaW1fZGlzcD0gbTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLnJlbGF4X3N1YnN0YXRlPSBvMTsJCQlcCi0gICAgaWlmLmlpZlBbcHRyXS5iaXRfZml4UD0gcTE7CQkJCVwKLSAgICBpaWYuaWlmUFtwdHJdLmFkZHJfbW9kZT0gczE7CQkJXAotICAgIGlpZi5paWZQW3B0cl0uYnNyPSB1MTsKLQotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotI2RlZmluZSBMSU5FX0NPTU1FTlRfQ0hBUlMgInwiCi0jZGVmaW5lIEFCU09MVVRFX1BSRUZJWCAnQCcKLSNkZWZpbmUgSU1NRURJQVRFX1BSRUZJWCAnIycKLSNlbmRpZgotCi0jaWZuZGVmIExJTkVfQ09NTUVOVF9DSEFSUwotI2RlZmluZSBMSU5FX0NPTU1FTlRfQ0hBUlMgIiMiCi0jZW5kaWYKLQotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gTElORV9DT01NRU5UX0NIQVJTOwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0jaWYgIWRlZmluZWQoQUJTT0xVVEVfUFJFRklYKSAmJiAhZGVmaW5lZChJTU1FRElBVEVfUFJFRklYKQotI2RlZmluZSBBQlNPTFVURV9QUkVGSVggJ0AnCS8qIE9uZSBvciB0aGUgb3RoZXIgTVVTVCBiZSBkZWZpbmVkICovCi0jZW5kaWYKLQotc3RydWN0IGFkZHJfbW9kZQotICB7Ci0gICAgY2hhciBtb2RlOwkJCS8qIGFkZHJlc3NpbmcgbW9kZSBvZiBvcGVyYW5kICgwLTMxKSAqLwotICAgIGNoYXIgc2NhbGVkX21vZGU7CQkvKiBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkIG1vZGUgKi8KLSAgICBjaGFyIHNjYWxlZF9yZWc7CQkvKiByZWdpc3RlciB1c2VkIGluIHNjYWxlZCsxICgxLTgpICovCi0gICAgY2hhciBmbG9hdF9mbGFnOwkJLyogc2V0IGlmIFIwLi5SNyB3YXMgRjAuLkY3IGllIGEKLQkJCQkgICBmbG9hdGluZy1wb2ludC1yZWdpc3RlciAqLwotICAgIGNoYXIgYW1fc2l6ZTsJCS8qIGVzdGltYXRlZCBtYXggc2l6ZSBvZiBnZW5lcmFsIGFkZHItbW9kZQotCQkJCSAgIHBhcnRzICovCi0gICAgY2hhciBpbV9kaXNwOwkJLyogaWYgaW1fZGlzcD09MSB3ZSBoYXZlIGEgZGlzcGxhY2VtZW50ICovCi0gICAgY2hhciBwY3JlbDsJCQkvKiAxIGlmIHBjcmVsLCB0aGlzIGlzIHJlYWxseSByZWR1bmRhbnQgaW5mbyAqLwotICAgIGNoYXIgZGlzcF9zdWZmaXhbMl07CS8qIGxlbmd0aCBvZiBkaXNwbGFjZW1lbnQocyksIDA9dW5kZWZpbmVkICovCi0gICAgY2hhciAqZGlzcFsyXTsJCS8qIHBvaW50ZXIocykgYXQgZGlzcGxhY2VtZW50KHMpCi0JCQkJICAgb3IgaW1tZWRpYXRlcyhzKSAgICAgKGFzY2lpKSAqLwotICAgIGNoYXIgaW5kZXhfYnl0ZTsJCS8qIGluZGV4IGJ5dGUgKi8KLSAgfTsKLXR5cGVkZWYgc3RydWN0IGFkZHJfbW9kZSBhZGRyX21vZGVTOwotCi0KLWNoYXIgKmZyZWVwdHIsICpmcmVlcHRyX3N0YXRpYzsJLyogcG9pbnRzIGF0IHNvbWUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgKi8KLXN0cnVjdCBoYXNoX2NvbnRyb2wgKmluc3RfaGFzaF9oYW5kbGU7Ci0KLXN0cnVjdCBuczMya19vcGNvZGUgKmRlc2M7CS8qIHBvaW50ZXIgYXQgZGVzY3JpcHRpb24gb2YgaW5zdHJ1Y3Rpb24gKi8KLWFkZHJfbW9kZVMgYWRkcl9tb2RlUDsKLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJmZCI7CS8qIHdlIGRvbid0IHdhbnQgdG8gc3VwcG9ydCBsb3dlcmNhc2UsIGRvIHdlICovCi0KLS8qIFVQUEVSQ0FTRSBkZW5vdGVzIGxpdmUgbmFtZXMgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBidWlsdCwgSUlGIGlzCi0gKiB1c2VkIGFzIGFuIGludGVybWVkaWF0ZSBmb3JtIHRvIHN0b3JlIHRoZSBhY3R1YWwgcGFydHMgb2YgdGhlCi0gKiBpbnN0cnVjdGlvbi4gQSBuczMyayBtYWNoaW5lIGluc3RydWN0aW9uIGNhbiBiZSBkaXZpZGVkIGludG8gYQotICogY291cGxlIG9mIHN1YiBQQVJUcy4gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBhc3NlbWJsZWQgdGhlCi0gKiBhcHByb3ByaWF0ZSBQQVJUIGdldCBhbiBhc3NpZ25tZW50LiBXaGVuIGFuIElJRiBoYXMgYmVlbiBjb21wbGV0ZWQKLSAqIGl0IGlzIGNvbnZlcnRlZCB0byBhIEZSQUdtZW50IGFzIHNwZWNpZmllZCBpbiBBUy5IICovCi0KLS8qIGludGVybmFsIHN0cnVjdHMgKi8KLXN0cnVjdCBuczMya19vcHRpb24KLSAgewotICAgIGNoYXIgKnBhdHRlcm47Ci0gICAgdW5zaWduZWQgbG9uZyBvcjsKLSAgICB1bnNpZ25lZCBsb25nIGFuZDsKLSAgfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIGludCB0eXBlOwkJCS8qIGhvdyB0byBpbnRlcnByZXQgb2JqZWN0ICovCi0gICAgaW50IHNpemU7CQkJLyogRXN0aW1hdGVkIG1heCBzaXplIG9mIG9iamVjdCAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2JqZWN0OwkvKiBiaW5hcnkgZGF0YSAqLwotICAgIGludCBvYmplY3RfYWRqdXN0OwkJLyogbnVtYmVyIGFkZGVkIHRvIG9iamVjdCAqLwotICAgIGludCBwY3JlbDsJCQkvKiBUcnVlIGlmIG9iamVjdCBpcyBwY3JlbCAqLwotICAgIGludCBwY3JlbF9hZGp1c3Q7CQkvKiBsZW5ndGggaW4gYnl0ZXMgZnJvbSB0aGUKLQkJCQkJICAgaW5zdHJ1Y3Rpb24gc3RhcnQgdG8gdGhlCi0JCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotICAgIGludCBpbV9kaXNwOwkJLyogVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZGlzcGxhY2VtZW50ICovCi0gICAgcmVsYXhfc3Vic3RhdGVUIHJlbGF4X3N1YnN0YXRlOwkvKiBJbml0aWFsIHJlbGF4c3Vic3RhdGUgKi8KLSAgICBiaXRfZml4UyAqYml0X2ZpeFA7CQkvKiBQb2ludGVyIGF0IGJpdF9maXggc3RydWN0ICovCi0gICAgaW50IGFkZHJfbW9kZTsJCS8qIFdoYXQgYWRkcm1vZGUgZG8gd2UgYXNzb2NpYXRlIHdpdGggdGhpcwotCQkJCSAgIGlpZi1lbnRyeSAqLwotICAgIGNoYXIgYnNyOwkJCS8qIFNlcXVlbnQgaGFjayAqLwotICB9IGlpZl9lbnRyeVQ7CQkJLyogSW50ZXJuYWwgSW5zdHJ1Y3Rpb24gRm9ybWF0ICovCi0KLXN0cnVjdCBpbnRfaW5zX2Zvcm0KLSAgewotICAgIGludCBpbnN0cl9zaXplOwkJLyogTWF4IHNpemUgb2YgaW5zdHJ1Y3Rpb24gaW4gYnl0ZXMuICovCi0gICAgaWlmX2VudHJ5VCBpaWZQW0lJRl9FTlRSSUVTICsgMV07Ci0gIH07Ci1zdHJ1Y3QgaW50X2luc19mb3JtIGlpZjsKLWV4cHJlc3Npb25TIGV4cHJQOwotY2hhciAqaW5wdXRfbGluZV9wb2ludGVyOwotLyogZGVzY3JpcHRpb24gb2YgdGhlIFBBUlRzIGluIElJRgotICpvYmplY3Rbbl06Ci0gKiAwCXRvdGFsIGxlbmd0aCBpbiBieXRlcyBvZiBlbnRyaWVzIGluIGlpZgotICogMQlvcGNvZGUKLSAqIDIJaW5kZXhfYnl0ZV9hCi0gKiAzCWluZGV4X2J5dGVfYgotICogNAlkaXNwX2FfMQotICogNQlkaXNwX2FfMgotICogNglkaXNwX2JfMQotICogNwlkaXNwX2JfMgotICogOAlpbW1fYQotICogOQlpbW1fYgotICogMTAJaW1wbGllZDEKLSAqIDExCWltcGxpZWQyCi0gKgotICogRm9yIGV2ZXJ5IGVudHJ5IHRoZXJlIGlzIGEgZGF0YWxlbmd0aCBpbiBieXRlcy4gVGhpcyBpcyBzdG9yZWQgaW4gc2l6ZVtuXS4KLSAqCSAwLAl0aGUgb2JqZWN0bGVuZ3RoIGlzIG5vdCBleHBsaWNpdGx5IGdpdmVuIGJ5IHRoZSBpbnN0cnVjdGlvbgotICoJCWFuZCB0aGUgb3BlcmFuZCBpcyB1bmRlZmluZWQuIFRoaXMgaXMgYSBjYXNlIGZvciByZWxheGF0aW9uLgotICoJCVJlc2VydmUgNCBieXRlcyBmb3IgdGhlIGZpbmFsIG9iamVjdC4KLSAqCi0gKgkgMSwJdGhlIGVudHJ5IGNvbnRhaW5zIG9uZSBieXRlCi0gKgkgMiwJdGhlIGVudHJ5IGNvbnRhaW5zIHR3byBieXRlcwotICoJIDMsCXRoZSBlbnRyeSBjb250YWlucyB0aHJlZSBieXRlcwotICoJIDQsCXRoZSBlbnRyeSBjb250YWlucyBmb3VyIGJ5dGVzCi0gKglldGMKLSAqCi0gKiBGdXJ0aGVybW9yZSwgZXZlcnkgZW50cnkgaGFzIGEgZGF0YSB0eXBlIGlkZW50aWZpZXIgaW4gdHlwZVtuXS4KLSAqCi0gKiAJIDAsCXRoZSBlbnRyeSBpcyB2b2lkLCBpZ25vcmUgaXQuCi0gKiAJIDEsCXRoZSBlbnRyeSBpcyBhIGJpbmFyeSBudW1iZXIuCi0gKgkgMiwJdGhlIGVudHJ5IGlzIGEgcG9pbnRlciBhdCBhbiBleHByZXNzaW9uLgotICoJCVdoZXJlIGV4cHJlc3Npb24gbWF5IGJlIGFzIHNpbXBsZSBhcyBhIHNpbmdsZSAnMScsCi0gKgkJYW5kIGFzIGNvbXBsaWNhdGVkIGFzICBmb28tYmFyKzEyLAotICogCQlmb28gYW5kIGJhciBtYXkgYmUgdW5kZWZpbmVkIGJ1dCBzdWZmaXhlZCBieSA6e2J8d3xkfSB0bwotICoJCWNvbnRyb2wgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LgotICoKLSAqCSAzLAl0aGUgZW50cnkgaXMgYSBwb2ludGVyIGF0IGEgYmlnbnVtIHN0cnVjdAotICoKLSAqCi0gKiBUaGUgbG93LW9yZGVyLWJ5dGUgY29yZXNwb25kcyB0byBsb3cgcGh5c2ljYWwgbWVtb3J5LgotICogT2J2aW91c2x5IGEgRlJBR21lbnQgbXVzdCBiZSBjcmVhdGVkIGZvciBlYWNoIHZhbGlkIGRpc3AgaW4gUEFSVCB3aG9zZQotICogZGF0YWxlbmd0aCBpcyB1bmRlZmluZWQgKHRvIGJhZCkgLgotICogVGhlIGNhc2Ugd2hlcmUganVzdCB0aGUgZXhwcmVzc2lvbiBpcyB1bmRlZmluZWQgaXMgbGVzcyBzZXZlcmUgYW5kIGlzCi0gKiBoYW5kbGVkIGJ5IGZpeC4gSGVyZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvYmplY3RmaWxlIGlzIGtub3duLgotICogV2l0aCB0aGlzIHJlcHJlc2VudGF0aW9uIHdlIHNpbXBsaWZ5IHRoZSBhc3NlbWJseSBhbmQgc2VwYXJhdGVzIHRoZQotICogbWFjaGluZSBkZXBlbmRlbnQvaW5kZXBlbmRlbnQgcGFydHMgaW4gYSBtb3JlIGNsZWFuIHdheSAoc2FpZCBPRSkKLSAqLwotDAotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQxW10gPQkJLyogcmVzdG9yZSwgZXhpdCAqLwotewotICB7InIwIiwgMHg4MCwgMHhmZn0sCi0gIHsicjEiLCAweDQwLCAweGZmfSwKLSAgeyJyMiIsIDB4MjAsIDB4ZmZ9LAotICB7InIzIiwgMHgxMCwgMHhmZn0sCi0gIHsicjQiLCAweDA4LCAweGZmfSwKLSAgeyJyNSIsIDB4MDQsIDB4ZmZ9LAotICB7InI2IiwgMHgwMiwgMHhmZn0sCi0gIHsicjciLCAweDAxLCAweGZmfSwKLSAgezAsIDB4MDAsIDB4ZmZ9Ci19Owotc3RydWN0IG5zMzJrX29wdGlvbiBvcHQyW10gPQkJLyogc2F2ZSwgZW50ZXIgKi8KLXsKLSAgeyJyMCIsIDB4MDEsIDB4ZmZ9LAotICB7InIxIiwgMHgwMiwgMHhmZn0sCi0gIHsicjIiLCAweDA0LCAweGZmfSwKLSAgeyJyMyIsIDB4MDgsIDB4ZmZ9LAotICB7InI0IiwgMHgxMCwgMHhmZn0sCi0gIHsicjUiLCAweDIwLCAweGZmfSwKLSAgeyJyNiIsIDB4NDAsIDB4ZmZ9LAotICB7InI3IiwgMHg4MCwgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0M1tdID0JCS8qIHNldGNmZyAqLwotewotICB7ImMiLCAweDgsIDB4ZmZ9LAotICB7Im0iLCAweDQsIDB4ZmZ9LAotICB7ImYiLCAweDIsIDB4ZmZ9LAotICB7ImkiLCAweDEsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NFtdID0JCS8qIGNpbnYgKi8KLXsKLSAgeyJhIiwgMHg0LCAweGZmfSwKLSAgeyJpIiwgMHgyLCAweGZmfSwKLSAgeyJkIiwgMHgxLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG9wdDVbXSA9CQkvKiBzdHJpbmcgaW5zdCAqLwotewotICB7ImIiLCAweDIsIDB4ZmZ9LAotICB7InUiLCAweGMsIDB4ZmZ9LAotICB7InciLCAweDQsIDB4ZmZ9LAotICB7MCwgMHgwLCAweGZmfQotfTsKLXN0cnVjdCBuczMya19vcHRpb24gb3B0NltdID0JCS8qIHBsYWluIHJlZyBleHQsY3Z0cCBldGMgKi8KLXsKLSAgeyJyMCIsIDB4MDAsIDB4ZmZ9LAotICB7InIxIiwgMHgwMSwgMHhmZn0sCi0gIHsicjIiLCAweDAyLCAweGZmfSwKLSAgeyJyMyIsIDB4MDMsIDB4ZmZ9LAotICB7InI0IiwgMHgwNCwgMHhmZn0sCi0gIHsicjUiLCAweDA1LCAweGZmfSwKLSAgeyJyNiIsIDB4MDYsIDB4ZmZ9LAotICB7InI3IiwgMHgwNywgMHhmZn0sCi0gIHswLCAweDAwLCAweGZmfQotfTsKLQotI2lmICFkZWZpbmVkKE5TMzIwMzIpICYmICFkZWZpbmVkKE5TMzI1MzIpCi0jZGVmaW5lIE5TMzI1MzIKLSNlbmRpZgotCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIGNwdXJlZ181MzJbXSA9CS8qIGxwciBzcHIgKi8KLXsKLSAgeyJ1cyIsIDB4MCwgMHhmZn0sCi0gIHsiZGNyIiwgMHgxLCAweGZmfSwKLSAgeyJicGMiLCAweDIsIDB4ZmZ9LAotICB7ImRzciIsIDB4MywgMHhmZn0sCi0gIHsiY2FyIiwgMHg0LCAweGZmfSwKLSAgeyJmcCIsIDB4OCwgMHhmZn0sCi0gIHsic3AiLCAweDksIDB4ZmZ9LAotICB7InNiIiwgMHhhLCAweGZmfSwKLSAgeyJ1c3AiLCAweGIsIDB4ZmZ9LAotICB7ImNmZyIsIDB4YywgMHhmZn0sCi0gIHsicHNyIiwgMHhkLCAweGZmfSwKLSAgeyJpbnRiYXNlIiwgMHhlLCAweGZmfSwKLSAgeyJtb2QiLCAweGYsIDB4ZmZ9LAotICB7MCwgMHgwMCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG1tdXJlZ181MzJbXSA9CS8qIGxtciBzbXIgKi8KLXsKLSAgeyJtY3IiLCAweDksIDB4ZmZ9LAotICB7Im1zciIsIDB4YSwgMHhmZn0sCi0gIHsidGVhciIsIDB4YiwgMHhmZn0sCi0gIHsicHRiMCIsIDB4YywgMHhmZn0sCi0gIHsicHRiMSIsIDB4ZCwgMHhmZn0sCi0gIHsiaXZhcjAiLCAweGUsIDB4ZmZ9LAotICB7Iml2YXIxIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci0KLXN0cnVjdCBuczMya19vcHRpb24gY3B1cmVnXzAzMltdID0JLyogbHByIHNwciAqLwotewotICB7InVwc3IiLCAweDAsIDB4ZmZ9LAotICB7ImZwIiwgMHg4LCAweGZmfSwKLSAgeyJzcCIsIDB4OSwgMHhmZn0sCi0gIHsic2IiLCAweGEsIDB4ZmZ9LAotICB7InBzciIsIDB4ZCwgMHhmZn0sCi0gIHsiaW50YmFzZSIsIDB4ZSwgMHhmZn0sCi0gIHsibW9kIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci1zdHJ1Y3QgbnMzMmtfb3B0aW9uIG1tdXJlZ18wMzJbXSA9CS8qIGxtciBzbXIgKi8KLXsKLSAgeyJicHIwIiwgMHgwLCAweGZmfSwKLSAgeyJicHIxIiwgMHgxLCAweGZmfSwKLSAgeyJwZjAiLCAweDQsIDB4ZmZ9LAotICB7InBmMSIsIDB4NSwgMHhmZn0sCi0gIHsic2MiLCAweDgsIDB4ZmZ9LAotICB7Im1zciIsIDB4YSwgMHhmZn0sCi0gIHsiYmNudCIsIDB4YiwgMHhmZn0sCi0gIHsicHRiMCIsIDB4YywgMHhmZn0sCi0gIHsicHRiMSIsIDB4ZCwgMHhmZn0sCi0gIHsiZWlhIiwgMHhmLCAweGZmfSwKLSAgezAsIDB4MCwgMHhmZn0KLX07Ci0KLSNpZiBkZWZpbmVkKE5TMzI1MzIpCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uICpjcHVyZWcgPSBjcHVyZWdfNTMyOwotc3RydWN0IG5zMzJrX29wdGlvbiAqbW11cmVnID0gbW11cmVnXzUzMjsKLSNlbHNlCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uICpjcHVyZWcgPSBjcHVyZWdfMDMyOwotc3RydWN0IG5zMzJrX29wdGlvbiAqbW11cmVnID0gbW11cmVnXzAzMjsKLSNlbmRpZgotDAotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewkJCQkJLyogc28gZmFyIGVtcHR5ICovCi0gIHswLCAwLCAwfQotfTsKLQotI2RlZmluZSBJTkQoeCx5KQkoKCh4KTw8MikrKHkpKQotCi0vKiB0aG9zZSBhcmUgaW5kZXgncyB0byByZWxheCBncm91cHMgaW4gbWRfcmVsYXhfdGFibGUgaWUgaXQgbXVzdCBiZQotICAgbXVsdGlwbGllZCBieSA0IHRvIHBvaW50IGF0IGEgZ3JvdXAgc3RhcnQuIFZpeiBJTkQoeCx5KSBTZSBmdW5jdGlvbgotICAgcmVsYXhfc2VnbWVudCBpbiB3cml0ZS5jIGZvciBtb3JlIGluZm8gKi8KLQotI2RlZmluZSBCUkFOQ0gJCTEKLSNkZWZpbmUgUENSRUwJCTIKLQotLyogdGhvc2UgYXJlIGluZGV4J3MgdG8gZW50cmllcyBpbiBhIHJlbGF4IGdyb3VwICovCi0KLSNkZWZpbmUgQllURQkJMAotI2RlZmluZSBXT1JECQkxCi0jZGVmaW5lIERPVUJMRQkJMgotI2RlZmluZSBVTkRFRiAgICAgICAgICAgMwotLyogVGhvc2UgbGltaXRzIGFyZSBjYWxjdWxhdGVkIGZyb20gdGhlIGRpc3BsYWNlbWVudCBzdGFydCBpbiBtZW1vcnkuCi0gICBUaGUgbnMzMmsgdXNlcyB0aGUgYmVnaW5pbmcgb2YgdGhlIGluc3RydWN0aW9uIGFzIGRpc3BsYWNlbWVudAotICAgYmFzZS4gIFRoaXMgdHlwZSBvZiBkaXNwbGFjZW1lbnRzIGNvdWxkIGJlIGhhbmRsZWQgaGVyZSBieSBtb3ZpbmcKLSAgIHRoZSBsaW1pdCB3aW5kb3cgdXAgb3IgZG93bi4gSSBjaG9vc2UgdG8gdXNlIGFuIGludGVybmFsCi0gICBkaXNwbGFjZW1lbnQgYmFzZS1hZGp1c3QgYXMgdGhlcmUgYXJlIG90aGVyIHJvdXRpbmVzIHRoYXQgbXVzdAotICAgY29uc2lkZXIgdGhpcy4gQWxzbywgYXMgd2UgaGF2ZSB0d28gdmFyaW91cyBvZmZzZXQtYWRqdXN0cyBpbiB0aGUKLSAgIG5zMzJrIChhY2IgdmVyc3VzIGJyL2Jycy9qc3IvYmNvbmQpLCB0d28gc2V0IG9mIGxpbWl0cyB3b3VsZCBoYXZlCi0gICBoYWQgdG8gYmUgdXNlZC4gIE5vdyB3ZSBkb250IGhhdmUgdG8gdGhpbmsgYWJvdXQgdGhhdC4gKi8KLQotCi1jb25zdCByZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtdID0KLXsKLSAgezEsIDEsIDAsIDB9LAotICB7MSwgMSwgMCwgMH0sCi0gIHsxLCAxLCAwLCAwfSwKLSAgezEsIDEsIDAsIDB9LAotCi0gIHsoNjMpLCAoLTY0KSwgMSwgSU5EIChCUkFOQ0gsIFdPUkQpfSwKLSAgeyg4MTkyKSwgKC04MTkyKSwgMiwgSU5EIChCUkFOQ0gsIERPVUJMRSl9LAotICB7MCwgMCwgNCwgMH0sCi0gIHsxLCAxLCAwLCAwfQotfTsKLQotLyogQXJyYXkgdXNlZCB0byB0ZXN0IGlmIG1vZGUgY29udGFpbnMgZGlzcGxhY2VtZW50cy4KLSAgIFZhbHVlIGlzIHRydWUgaWYgbW9kZSBjb250YWlucyBkaXNwbGFjZW1lbnQuICovCi0KLWNoYXIgZGlzcF90ZXN0W10gPQotezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAxLCAxLCAxLCAwLCAwLCAxLCAxLCAwLAotIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9OwotCi0vKiBBcnJheSB1c2VkIHRvIGNhbGN1bGF0ZSBtYXggc2l6ZSBvZiBkaXNwbGFjZW1lbnRzICovCi0KLWNoYXIgZGlzcF9zaXplW10gPQotezQsIDEsIDIsIDAsIDR9OwotDAotc3RhdGljIHZvaWQgZXZhbHVhdGVfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqIHJlc3VsdFAsIGNoYXIgKnB0cikpOwotc3RhdGljIHZvaWQgbWRfbnVtYmVyX3RvX2Rpc3AgUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIHZhbCwgaW50IG4pKTsKLXN0YXRpYyB2b2lkIG1kX251bWJlcl90b19pbW0gUEFSQU1TICgoY2hhciAqYnVmLCBsb25nIHZhbCwgaW50IG4pKTsKLQotLyogUGFyc2VzIGEgZ2VuZXJhbCBvcGVyYW5kIGludG8gYW4gYWRkcmVzc2luZ21vZGUgc3RydWN0Ci0KLSAgIGluOiAgcG9pbnRlciBhdCBvcGVyYW5kIGluIGFzY2lpIGZvcm0KLSAgIHBvaW50ZXIgYXQgYWRkcl9tb2RlIHN0cnVjdCBmb3IgcmVzdWx0Ci0gICB0aGUgbGV2ZWwgb2YgcmVjdXJzaW9uLiAoYWx3YXlzIDAgb3IgMSkKLQotICAgb3V0OiBkYXRhIGluIGFkZHJfbW9kZSBzdHJ1Y3QKLSAgICovCi1pbnQKLWFkZHJfbW9kZSAob3BlcmFuZCwgYWRkcl9tb2RlUCwgcmVjdXJzaXZlX2xldmVsKQotICAgICBjaGFyICpvcGVyYW5kOwotICAgICByZWdpc3RlciBhZGRyX21vZGVTICphZGRyX21vZGVQOwotICAgICBpbnQgcmVjdXJzaXZlX2xldmVsOwotewotICByZWdpc3RlciBjaGFyICpzdHI7Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciBpbnQgc3RybDsKLSAgcmVnaXN0ZXIgaW50IG1vZGU7Ci0gIGludCBqOwotICBtb2RlID0gREVGQVVMVDsJCS8qIGRlZmF1bHQgKi8KLSAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSAwOwkvKiB3aHkgbm90ICovCi0gIGFkZHJfbW9kZVAtPnNjYWxlZF9yZWcgPSAwOwkvKiBpZiAwLCBub3Qgc2NhbGVkIGluZGV4ICovCi0gIGFkZHJfbW9kZVAtPmZsb2F0X2ZsYWcgPSAwOwotICBhZGRyX21vZGVQLT5hbV9zaXplID0gMDsKLSAgYWRkcl9tb2RlUC0+aW1fZGlzcCA9IDA7Ci0gIGFkZHJfbW9kZVAtPnBjcmVsID0gMDsJLyogbm90IHNldCBpbiB0aGlzIGZ1bmN0aW9uICovCi0gIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4WzBdID0gMDsKLSAgYWRkcl9tb2RlUC0+ZGlzcF9zdWZmaXhbMV0gPSAwOwotICBhZGRyX21vZGVQLT5kaXNwWzBdID0gTlVMTDsKLSAgYWRkcl9tb2RlUC0+ZGlzcFsxXSA9IE5VTEw7Ci0gIHN0ciA9IG9wZXJhbmQ7Ci0gIGlmIChzdHJbMF0gPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm4gKDApOwotICAgIH0JCQkJLyogd2UgZG9uJ3Qgd2FudCB0aGlzICovCi0gIHN0cmwgPSBzdHJsZW4gKHN0cik7Ci0gIHN3aXRjaCAoc3RyWzBdKQotICAgIHsKLSAgICAgIC8qIHRoZSBmb2xsb3dpbmcgdGhyZWUgY2FzZSBzdGF0ZW1lbnRzIGNvbnRyb2xzIHRoZSBtb2RlLWNoYXJzCi0JIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGVkIGlmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGVtICovCi0jaWZkZWYgQUJTT0xVVEVfUFJFRklYCi0gICAgY2FzZSBBQlNPTFVURV9QUkVGSVg6Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSA9PSAnXScpCi0JYnJlYWs7Ci0gICAgICBhZGRyX21vZGVQLT5tb2RlID0gMjE7CS8qIGFic29sdXRlICovCi0gICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgMTsKLSAgICAgIHJldHVybiAoLTEpOwotI2VuZGlmCi0jaWZkZWYgSU1NRURJQVRFX1BSRUZJWAotICAgIGNhc2UgSU1NRURJQVRFX1BSRUZJWDoKLSAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICddJykKLQlicmVhazsKLSAgICAgIGFkZHJfbW9kZVAtPm1vZGUgPSAyMDsJLyogaW1tZWRpYXRlICovCi0gICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgMTsKLSAgICAgIHJldHVybiAoLTEpOwotI2VuZGlmCi0gICAgY2FzZSAnLic6Ci0gICAgICBpZiAoc3RyW3N0cmwgLSAxXSAhPSAnXScpCi0JewotCSAgc3dpdGNoIChzdHJbMV0pCi0JICAgIHsKLQkgICAgY2FzZSAnLSc6Ci0JICAgIGNhc2UgJysnOgotCSAgICAgIGlmIChzdHJbMl0gIT0gJ1wwMDAnKQotCQl7Ci0JCSAgYWRkcl9tb2RlUC0+bW9kZSA9IDI3OwkvKiBwYy1yZWxhdGl2ICovCi0JCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0ciArIDI7Ci0JCSAgcmV0dXJuICgtMSk7Ci0JCX0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc193YXJuIChfKCJJbnZhbGlkIHN5bnRheCBpbiBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUiKSk7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2UnOgotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gIT0gJ10nKQotCXsKLQkgIGlmICgoIXN0cm5jbXAgKHN0ciwgImV4dCgiLCA0KSkgJiYgc3RybCA+IDcpCi0JICAgIHsJCQkJLyogZXh0ZXJuYWwgKi8KLQkgICAgICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgNDsKLQkgICAgICBpID0gMDsKLQkgICAgICBqID0gMjsKLQkgICAgICBkbwotCQl7CQkJLyogZGlzcFswXSdzIHRlcm1pbmF0aW9uIHBvaW50ICovCi0JCSAgaiArPSAxOwotCQkgIGlmIChzdHJbal0gPT0gJygnKQotCQkgICAgaSsrOwotCQkgIGlmIChzdHJbal0gPT0gJyknKQotCQkgICAgaS0tOwotCQl9Ci0JICAgICAgd2hpbGUgKGogPCBzdHJsICYmIGkgIT0gMCk7Ci0JICAgICAgaWYgKGkgIT0gMCB8fCAhKHN0cltqICsgMV0gPT0gJy0nIHx8IHN0cltqICsgMV0gPT0gJysnKSkKLQkJewotCQkgIGFzX3dhcm4gKF8oIkludmFsaWQgc3ludGF4IGluIEV4dGVybmFsIGFkZHJlc3NpbmcgbW9kZSIpKTsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgICAgc3RyW2pdID0gJ1wwMDAnOwkJLyogbnVsbCB0ZXJtaW5hdGUgZGlzcFswXSAqLwotCSAgICAgIGFkZHJfbW9kZVAtPmRpc3BbMV0gPSBzdHIgKyBqICsgMjsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gMjI7Ci0JICAgICAgcmV0dXJuICgtMSk7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OjsKLSAgICB9Ci0gIHN0cmwgPSBzdHJsZW4gKHN0cik7Ci0gIHN3aXRjaCAoc3RybCkKLSAgICB7Ci0gICAgY2FzZSAyOgotICAgICAgc3dpdGNoIChzdHJbMF0pCi0JewotCWNhc2UgJ2YnOgotCSAgYWRkcl9tb2RlUC0+ZmxvYXRfZmxhZyA9IDE7Ci0JY2FzZSAncic6Ci0JICBpZiAoc3RyWzFdID49ICcwJyAmJiBzdHJbMV0gPCAnOCcpCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gc3RyWzFdIC0gJzAnOwotCSAgICAgIHJldHVybiAoLTEpOwotCSAgICB9Ci0JfQotICAgIGNhc2UgMzoKLSAgICAgIGlmICghc3RybmNtcCAoc3RyLCAidG9zIiwgMykpCi0JewotCSAgYWRkcl9tb2RlUC0+bW9kZSA9IDIzOwkvKiBUb3BPZlN0YWNrICovCi0JICByZXR1cm4gKC0xKTsKLQl9Ci0gICAgZGVmYXVsdDo7Ci0gICAgfQotICBpZiAoc3RybCA+IDQpCi0gICAgewotICAgICAgaWYgKHN0cltzdHJsIC0gMV0gPT0gJyknKQotCXsKLQkgIGlmIChzdHJbc3RybCAtIDJdID09ICcpJykKLQkgICAgewotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNV0sICIoZnAiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAxNjsJCS8qIE1lbW9yeSBSZWxhdGl2ZSAqLwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA1XSwgIihzcCIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDE3OwotCQl9Ci0JICAgICAgaWYgKCFzdHJuY21wICgmc3RyW3N0cmwgLSA1XSwgIihzYiIsIDMpKQotCQl7Ci0JCSAgbW9kZSA9IDE4OwotCQl9Ci0JICAgICAgaWYgKG1vZGUgIT0gREVGQVVMVCkKLQkJewkJCS8qIG1lbW9yeSByZWxhdGl2ZSAqLwotCQkgIGFkZHJfbW9kZVAtPm1vZGUgPSBtb2RlOwotCQkgIGogPSBzdHJsIC0gNTsJCS8qIHRlbXAgZm9yIGVuZCBvZiBkaXNwWzBdICovCi0JCSAgaSA9IDA7Ci0JCSAgZG8KLQkJICAgIHsKLQkJICAgICAgc3RybCAtPSAxOwotCQkgICAgICBpZiAoc3RyW3N0cmxdID09ICcpJykKLQkJCWkrKzsKLQkJICAgICAgaWYgKHN0cltzdHJsXSA9PSAnKCcpCi0JCQlpLS07Ci0JCSAgICB9Ci0JCSAgd2hpbGUgKHN0cmwgPiAtMSAmJiBpICE9IDApOwotCQkgIGlmIChpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGFzX3dhcm4gKF8oIkludmFsaWQgc3ludGF4IGluIE1lbW9yeSBSZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUiKSk7Ci0JCSAgICAgIHJldHVybiAoMCk7Ci0JCSAgICB9Ci0JCSAgYWRkcl9tb2RlUC0+ZGlzcFsxXSA9IHN0cjsKLQkJICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyICsgc3RybCArIDE7Ci0JCSAgc3RyW2pdID0gJ1wwMDAnOwkvKiBudWxsIHRlcm1pbmF0ZSBkaXNwWzBdICovCi0JCSAgc3RyW3N0cmxdID0gJ1wwMDAnOwkvKiBudWxsIHRlcm1pbmF0ZSBkaXNwWzFdICovCi0JCSAgcmV0dXJuICgtMSk7Ci0JCX0KLQkgICAgfQotCSAgc3dpdGNoIChzdHJbc3RybCAtIDNdKQotCSAgICB7Ci0JICAgIGNhc2UgJ3InOgotCSAgICBjYXNlICdSJzoKLQkgICAgICBpZiAoc3RyW3N0cmwgLSAyXSA+PSAnMCcKLQkJICAmJiBzdHJbc3RybCAtIDJdIDwgJzgnCi0JCSAgJiYgc3RyW3N0cmwgLSA0XSA9PSAnKCcpCi0JCXsKLQkJICBhZGRyX21vZGVQLT5tb2RlID0gc3RyW3N0cmwgLSAyXSAtICcwJyArIDg7Ci0JCSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0cjsKLQkJICBzdHJbc3RybCAtIDRdID0gMDsKLQkJICByZXR1cm4gKC0xKTsJCS8qIHJlZyByZWwgKi8KLQkJfQotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoZnAiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNDsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoc3AiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNTsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIoc2IiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNjsKLQkJfQotCSAgICAgIGlmICghc3RybmNtcCAoJnN0cltzdHJsIC0gNF0sICIocGMiLCAzKSkKLQkJewotCQkgIG1vZGUgPSAyNzsKLQkJfQotCSAgICAgIGlmIChtb2RlICE9IERFRkFVTFQpCi0JCXsKLQkJICBhZGRyX21vZGVQLT5tb2RlID0gbW9kZTsKLQkJICBhZGRyX21vZGVQLT5kaXNwWzBdID0gc3RyOwotCQkgIHN0cltzdHJsIC0gNF0gPSAnXDAnOwotCQkgIHJldHVybiAoLTEpOwkJLyogbWVtb3J5IHNwYWNlICovCi0JCX0KLQkgICAgfQotCX0KLSAgICAgIC8qIG5vIHRyYWlsaW5nICcpJyBkbyB3ZSBoYXZlIGEgJ10nID8gKi8KLSAgICAgIGlmIChzdHJbc3RybCAtIDFdID09ICddJykKLQl7Ci0JICBzd2l0Y2ggKHN0cltzdHJsIC0gMl0pCi0JICAgIHsKLQkgICAgY2FzZSAnYic6Ci0JICAgICAgbW9kZSA9IDI4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICd3JzoKLQkgICAgICBtb2RlID0gMjk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIG1vZGUgPSAzMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncSc6Ci0JICAgICAgbW9kZSA9IDMxOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OjsKLQkgICAgICBhc193YXJuIChfKCJJbnZhbGlkIHNjYWxlZC1pbmRleGVkIG1vZGUsIHVzZSAoYix3LGQscSkiKSk7Ci0JICAgICAgaWYgKHN0cltzdHJsIC0gM10gIT0gJzonIHx8IHN0cltzdHJsIC0gNl0gIT0gJ1snCi0JCSAgfHwgc3RyW3N0cmwgLSA1XSA9PSAncicgfHwgc3RyW3N0cmwgLSA0XSA8ICcwJwotCQkgIHx8IHN0cltzdHJsIC0gNF0gPiAnNycpCi0JCXsKLQkJICBhc193YXJuIChfKCJTeW50YXggaW4gc2NhbGVkLWluZGV4ZWQgbW9kZSwgdXNlIFtSbjptXSB3aGVyZSBuPVswLi43XSBtPXtiLHcsZCxxfSIpKTsKLQkJfQotCSAgICB9IC8qIHNjYWxlZCBpbmRleCAqLwotCSAgewotCSAgICBpZiAocmVjdXJzaXZlX2xldmVsID4gMCkKLQkgICAgICB7Ci0JCWFzX3dhcm4gKF8oIlNjYWxlZC1pbmRleGVkIGFkZHJlc3NpbmcgbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZC1pbmRleCIpKTsKLQkJcmV0dXJuICgwKTsKLQkgICAgICB9Ci0JICAgIGFkZHJfbW9kZVAtPmFtX3NpemUgKz0gMTsJLyogc2NhbGVkIGluZGV4IGJ5dGUgKi8KLQkgICAgaiA9IHN0cltzdHJsIC0gNF0gLSAnMCc7CS8qIHN0b3JlIHRlbXBvcmFyeSAqLwotCSAgICBzdHJbc3RybCAtIDZdID0gJ1wwMDAnOwkvKiBudWxsdGVybWluYXRlIGZvciByZWN1cnNpdmUgY2FsbCAqLwotCSAgICBpID0gYWRkcl9tb2RlIChzdHIsIGFkZHJfbW9kZVAsIDEpOwotCSAgICBpZiAoIWkgfHwgYWRkcl9tb2RlUC0+bW9kZSA9PSAyMCkKLQkgICAgICB7Ci0JCWFzX3dhcm4gKF8oIkludmFsaWQgb3IgaWxsZWdhbCBhZGRyZXNzaW5nIG1vZGUgY29tYmluZWQgd2l0aCBzY2FsZWQtaW5kZXgiKSk7Ci0JCXJldHVybiAoMCk7Ci0JICAgICAgfQotCSAgICBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9IGFkZHJfbW9kZVAtPm1vZGU7CS8qIHN0b3JlIHRoZSBpbmZlcmlvcgotCQkJCQkJCSAgIG1vZGUgKi8KLQkgICAgYWRkcl9tb2RlUC0+bW9kZSA9IG1vZGU7Ci0JICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9yZWcgPSBqICsgMTsKLQkgICAgcmV0dXJuICgtMSk7Ci0JICB9Ci0JfQotICAgIH0KLSAgYWRkcl9tb2RlUC0+bW9kZSA9IERFRkFVTFQ7CS8qIGRlZmF1bHQgdG8gd2hhdGV2ZXIgKi8KLSAgYWRkcl9tb2RlUC0+ZGlzcFswXSA9IHN0cjsKLSAgcmV0dXJuICgtMSk7Ci19Ci0MCi0vKiBwdHIgcG9pbnRzIGF0IHN0cmluZyBhZGRyX21vZGVQIHBvaW50cyBhdCBzdHJ1Y3Qgd2l0aCByZXN1bHQgVGhpcwotICAgcm91dGluZSBjYWxscyBhZGRyX21vZGUgdG8gZGV0ZXJtaW5lIHRoZSBnZW5lcmFsIGFkZHIubW9kZSBvZiB0aGUKLSAgIG9wZXJhbmQuIFdoZW4gdGhpcyBpcyByZWFkeSBpdCBwYXJzZXMgdGhlIGRpc3BsYWNlbWVudHMgZm9yIHNpemUKLSAgIHNwZWNpZnlpbmcgc3VmZml4ZXMgYW5kIGRldGVybWluZXMgc2l6ZSBvZiBpbW1lZGlhdGUgbW9kZSB2aWEKLSAgIG5zMzJrLW9wY29kZS4gIEFsc28gYnVpbGRzIGluZGV4IGJ5dGVzIGlmIG5lZWRlZC4gICovCi1pbnQKLWdldF9hZGRyX21vZGUgKHB0ciwgYWRkcl9tb2RlUCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyX21vZGVTICphZGRyX21vZGVQOwotewotICBpbnQgdG1wOwotICBhZGRyX21vZGUgKHB0ciwgYWRkcl9tb2RlUCwgMCk7Ci0gIGlmIChhZGRyX21vZGVQLT5tb2RlID09IERFRkFVTFQgfHwgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPT0gLTEpCi0gICAgewotICAgICAgLyogcmVzb2x2ZSBhbWJpZ2lvdXMgb3BlcmFuZHMsIHRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBpZgotCSBvbmUgdXNlcyBzdGFuZGFyZCBOU0Mgb3BlcmFuZCBzeW50YXguIEJ1dCB0aGUgc2VxdWVudAotCSBjb21waWxlciBkb2Vzbid0ISEhICBUaGlzIGZpbmRzIGEgcHJvcGVyIGFkZHJlc3NpbmdpbmcgbW9kZQotCSBpZiBpdCBpcyBpbXBsaWNpdGx5IHN0YXRlZC4gU2VlIG5zMzJrLW9wY29kZS5oICovCi0gICAgICAodm9pZCkgZXZhbHVhdGVfZXhwciAoJmV4cHJQLCBwdHIpOyAvKiB0aGlzIGNhbGwgdGFrZXMgdGltZSBTaWdoISAqLwotICAgICAgaWYgKGFkZHJfbW9kZVAtPm1vZGUgPT0gREVGQVVMVCkKLQl7Ci0JICBpZiAoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+bW9kZSA9IGRlc2MtPmRlZmF1bHRfbW9kZWw7IC8qIHdlIGhhdmUgYSBsYWJlbCAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhZGRyX21vZGVQLT5tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlYzsgLyogd2UgaGF2ZSBhIGNvbnN0YW50ICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGV4cHJQLlhfYWRkX3N5bWJvbCB8fCBleHByUC5YX29wX3N5bWJvbCkKLQkgICAgewotCSAgICAgIGFkZHJfbW9kZVAtPnNjYWxlZF9tb2RlID0gZGVzYy0+ZGVmYXVsdF9tb2RlbDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPSBkZXNjLT5kZWZhdWx0X21vZGVjOwotCSAgICB9Ci0JfQotICAgICAgLyogbXVzdCBwdXQgdGhpcyBtZXNzIGRvd24gaW4gYWRkcl9tb2RlIHRvIGhhbmRsZSB0aGUgc2NhbGVkCi0gICAgICAgICBjYXNlIGJldHRlciAqLwotICAgIH0KLSAgLyogSXQgYXBwZWFycyBhcyB0aGUgc2VxdWVudCBjb21waWxlciB3YW50cyBhbiBhYnNvbHV0ZSB3aGVuIHdlIGhhdmUKLSAgICAgYSBsYWJlbCB3aXRob3V0IEAuIENvbnN0YW50cyBiZWNvbWVzIGltbWVkaWF0ZXMgYmVzaWRlcyB0aGUgYWRkcgotICAgICBjYXNlLiAgVGhpbmsgaXQgZG9lcyBzbyB3aXRoIGxvY2FsIGxhYmVscyB0b28sIG5vdCBvcHRpbXVtLCBwY3JlbAotICAgICBpcyBiZXR0ZXIuICBXaGVuIEkgaGF2ZSB0aW1lIEkgd2lsbCBtYWtlIGdhcyBjaGVjayB0aGlzIGFuZAotICAgICBzZWxlY3QgcGNyZWwgd2hlbiBwb3NzaWJsZSBBY3R1YWxseSB0aGF0IGlzIHRyaXZpYWwuICAqLwotICBpZiAodG1wID0gYWRkcl9tb2RlUC0+c2NhbGVkX3JlZykKLSAgICB7CQkJCS8qIGJ1aWxkIGluZGV4Ynl0ZSAqLwotICAgICAgdG1wLS07CQkJLyogcmVtZW1iZXIgcmVnbnVtYmVyIGNvbWVzIGluY3JlbWVudGVkIGZvcgotCQkJCSAgIGZsYWdwdXJwb3NlICovCi0gICAgICB0bXAgfD0gYWRkcl9tb2RlUC0+c2NhbGVkX21vZGUgPDwgMzsKLSAgICAgIGFkZHJfbW9kZVAtPmluZGV4X2J5dGUgPSAoY2hhcikgdG1wOwotICAgICAgYWRkcl9tb2RlUC0+YW1fc2l6ZSArPSAxOwotICAgIH0KLSAgaWYgKGRpc3BfdGVzdFthZGRyX21vZGVQLT5tb2RlXSkKLSAgICB7CQkJCS8qIHRoZXJlIHdhcyBhIGRpc3BsYWNlbWVudCwgcHJvYmUgZm9yIGxlbmd0aAotCQkJCSAgIHNwZWNpZnlpbmcgc3VmZml4ICovCi0gICAgICB7Ci0JcmVnaXN0ZXIgY2hhciBjOwotCXJlZ2lzdGVyIGNoYXIgc3VmZml4OwotCXJlZ2lzdGVyIGNoYXIgc3VmZml4X3N1YjsKLQlyZWdpc3RlciBpbnQgaTsKLQlyZWdpc3RlciBjaGFyICp0b1A7Ci0JcmVnaXN0ZXIgY2hhciAqZnJvbVA7Ci0KLQlhZGRyX21vZGVQLT5wY3JlbCA9IDA7Ci0JaWYgKGRpc3BfdGVzdFthZGRyX21vZGVQLT5tb2RlXSkKLQkgIHsJCQkvKiB0aGVyZSBpcyBhIGRpc3BsYWNlbWVudCAqLwotCSAgICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSAyNyB8fCBhZGRyX21vZGVQLT5zY2FsZWRfbW9kZSA9PSAyNykKLQkgICAgICB7CQkJLyogZG8gd2UgaGF2ZSBwY3JlbC4gbW9kZSAqLwotCQlhZGRyX21vZGVQLT5wY3JlbCA9IDE7Ci0JICAgICAgfQotCSAgICBhZGRyX21vZGVQLT5pbV9kaXNwID0gMTsKLQkgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKLQkgICAgICB7Ci0JCXN1ZmZpeF9zdWIgPSBzdWZmaXggPSAwOwotCQlpZiAodG9QID0gYWRkcl9tb2RlUC0+ZGlzcFtpXSkKLQkJICB7CQkvKiBzdWZmaXggb2YgZXhwcmVzc2lvbiwgdGhlIGxhcmdlc3Qgc2l6ZQotCQkJCSAgIHJ1bGVzICovCi0JCSAgICBmcm9tUCA9IHRvUDsKLQkJICAgIHdoaWxlIChjID0gKmZyb21QKyspCi0JCSAgICAgIHsKLQkJCSp0b1ArKyA9IGM7Ci0JCQlpZiAoYyA9PSAnOicpCi0JCQkgIHsKLQkJCSAgICBzd2l0Y2ggKCpmcm9tUCkKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgJ1wwJzoKLQkJCQlhc193YXJuIChfKCJQcmVtYXR1cmUgZW5kIG9mIHN1ZmZpeCAtLSBEZWZhdWx0aW5nIHRvIGQiKSk7Ci0JCQkJc3VmZml4ID0gNDsKLQkJCQljb250aW51ZTsKLQkJCSAgICAgIGNhc2UgJ2InOgotCQkJCXN1ZmZpeF9zdWIgPSAxOwotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAndyc6Ci0JCQkJc3VmZml4X3N1YiA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQkgICAgICBjYXNlICdkJzoKLQkJCQlzdWZmaXhfc3ViID0gNDsKLQkJCQlicmVhazsKLQkJCSAgICAgIGRlZmF1bHQ6Ci0JCQkJYXNfd2FybiAoXygiQmFkIHN1ZmZpeCBhZnRlciAnOicgdXNlIHtifHd8ZH0gRGVmYXVsdGluZyB0byBkIikpOwotCQkJCXN1ZmZpeCA9IDQ7Ci0JCQkgICAgICB9Ci0JCQkgICAgZnJvbVArKzsKLQkJCSAgICB0b1AtLTsJLyogU28gd2Ugd3JpdGUgb3ZlciB0aGUgJzonICovCi0JCQkgICAgaWYgKHN1ZmZpeCA8IHN1ZmZpeF9zdWIpCi0JCQkgICAgICBzdWZmaXggPSBzdWZmaXhfc3ViOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgICp0b1AgPSAnXDAnOy8qIHRlcm1pbmF0ZSBwcm9wZXJseSAqLwotCQkgICAgYWRkcl9tb2RlUC0+ZGlzcF9zdWZmaXhbaV0gPSBzdWZmaXg7Ci0JCSAgICBhZGRyX21vZGVQLT5hbV9zaXplICs9IHN1ZmZpeCA/IHN1ZmZpeCA6IDQ7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoYWRkcl9tb2RlUC0+bW9kZSA9PSAyMCkKLQl7CQkJLyogbG9vayBpbiBuczMya19vcGNvZGUgZm9yIHNpemUgKi8KLQkgIGFkZHJfbW9kZVAtPmRpc3Bfc3VmZml4WzBdID0gYWRkcl9tb2RlUC0+YW1fc2l6ZSA9IGRlc2MtPmltX3NpemU7Ci0JICBhZGRyX21vZGVQLT5pbV9kaXNwID0gMDsKLQl9Ci0gICAgfQotICByZXR1cm4gYWRkcl9tb2RlUC0+bW9kZTsKLX0KLQotCi0vKiByZWFkIGFuIG9wdGlvbmxpc3QgKi8KLXZvaWQKLW9wdGxpc3QgKHN0ciwgb3B0aW9uUCwgZGVmYXVsdF9tYXApCi0gICAgIGNoYXIgKnN0cjsJCQkvKiB0aGUgc3RyaW5nIHRvIGV4dHJhY3Qgb3B0aW9ucyBmcm9tICovCi0gICAgIHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7CS8qIGhvdyB0byBzZWFyY2ggdGhlIHN0cmluZyAqLwotICAgICB1bnNpZ25lZCBsb25nICpkZWZhdWx0X21hcDsJLyogZGVmYXVsdCBwYXR0ZXJuIGFuZCBvdXRwdXQgKi8KLXsKLSAgcmVnaXN0ZXIgaW50IGksIGosIGssIHN0cmxlbjEsIHN0cmxlbjI7Ci0gIHJlZ2lzdGVyIGNoYXIgKnBhdHRlcm5QLCAqc3RyUDsKLSAgc3RybGVuMSA9IHN0cmxlbiAoc3RyKTsKLSAgaWYgKHN0cmxlbjEgPCAxKQotICAgIHsKLSAgICAgIGFzX2ZhdGFsIChfKCJWZXJ5IHNob3J0IGluc3RyIHRvIG9wdGlvbiwgaWUgeW91IGNhbid0IGRvIGl0IG9uIGEgTlVMTHN0ciIpKTsKLSAgICB9Ci0gIGZvciAoaSA9IDA7IG9wdGlvblBbaV0ucGF0dGVybiAhPSAwOyBpKyspCi0gICAgewotICAgICAgc3RybGVuMiA9IHN0cmxlbiAob3B0aW9uUFtpXS5wYXR0ZXJuKTsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJsZW4xOyBqKyspCi0JewotCSAgcGF0dGVyblAgPSBvcHRpb25QW2ldLnBhdHRlcm47Ci0JICBzdHJQID0gJnN0cltqXTsKLQkgIGZvciAoayA9IDA7IGsgPCBzdHJsZW4yOyBrKyspCi0JICAgIHsKLQkgICAgICBpZiAoKihzdHJQKyspICE9ICoocGF0dGVyblArKykpCi0JCWJyZWFrOwotCSAgICB9Ci0JICBpZiAoayA9PSBzdHJsZW4yKQotCSAgICB7CQkJLyogbWF0Y2ggKi8KLQkgICAgICAqZGVmYXVsdF9tYXAgfD0gb3B0aW9uUFtpXS5vcjsKLQkgICAgICAqZGVmYXVsdF9tYXAgJj0gb3B0aW9uUFtpXS5hbmQ7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotCi0vKiBzZWFyY2ggc3RydWN0IGZvciBzeW1ib2xzCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZ2V0IHRoZSBzaG9ydCBpbnRlZ2VyIGZvcm0gb2YgcmVnIG5hbWVzIGluCi0gICB0aGUgaW5zdHJ1Y3Rpb25zIGxtciwgc21yLCBscHIsIHNwciByZXR1cm4gdHJ1ZSBpZiBzdHIgaXMgZm91bmQgaW4KLSAgIGxpc3QgKi8KLQotaW50Ci1saXN0X3NlYXJjaCAoc3RyLCBvcHRpb25QLCBkZWZhdWx0X21hcCkKLSAgICAgY2hhciAqc3RyOwkJCQkvKiB0aGUgc3RyaW5nIHRvIG1hdGNoICovCi0gICAgIHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7CS8qIGxpc3QgdG8gc2VhcmNoICovCi0gICAgIHVuc2lnbmVkIGxvbmcgKmRlZmF1bHRfbWFwOwkvKiBkZWZhdWx0IHBhdHRlcm4gYW5kIG91dHB1dCAqLwotewotICByZWdpc3RlciBpbnQgaTsKLSAgZm9yIChpID0gMDsgb3B0aW9uUFtpXS5wYXR0ZXJuICE9IDA7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXN0cm5jbXAgKG9wdGlvblBbaV0ucGF0dGVybiwgc3RyLCAyMCkpCi0JewkJCQkvKiB1c2Ugc3RybmNtcCB0byBiZSBzYWZlICovCi0JICAqZGVmYXVsdF9tYXAgfD0gb3B0aW9uUFtpXS5vcjsKLQkgICpkZWZhdWx0X21hcCAmPSBvcHRpb25QW2ldLmFuZDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgfQotICBhc193YXJuIChfKCJObyBzdWNoIGVudHJ5IGluIGxpc3QuIChjcHUvbW11IHJlZ2lzdGVyKSIpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ldmFsdWF0ZV9leHByIChyZXN1bHRQLCBwdHIpCi0gICAgIGV4cHJlc3Npb25TICpyZXN1bHRQOwotICAgICBjaGFyICpwdHI7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnRtcF9saW5lOwotCi0gIHRtcF9saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwdHI7Ci0gIGV4cHJlc3Npb24gKCZleHByUCk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHRtcF9saW5lOwotfQotDAotLyogQ29udmVydCBvcGVyYW5kcyB0byBpaWYtZm9ybWF0IGFuZCBhZGRzIGJpdGZpZWxkcyB0byB0aGUgb3Bjb2RlLgotICAgT3BlcmFuZHMgYXJlIHBhcnNlZCBpbiBzdWNoIGFuIG9yZGVyIHRoYXQgdGhlIG9wY29kZSBpcyB1cGRhdGVkIGZyb20KLSAgIGl0cyBtb3N0IHNpZ25pZmljYW50IGJpdCwgdGhhdCBpcyB3aGVuIHRoZSBvcGVyYW5kIG5lZWQgdG8gYWx0ZXIgdGhlCi0gICBvcGNvZGUuCi0gICBCZSBjYXJlZnVsbCBub3QgdG8gcHV0IHRvIG9iamVjdHMgaW4gdGhlIHNhbWUgaWlmLXNsb3QuCi0gICAqLwotCi12b2lkCi1lbmNvZGVfb3BlcmFuZCAoYXJnYywgYXJndiwgb3BlcmFuZHNQLCBzdWZmaXhQLCBpbV9zaXplLCBvcGNvZGVfYml0X3B0cikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotICAgICBjaGFyICpvcGVyYW5kc1A7Ci0gICAgIGNoYXIgKnN1ZmZpeFA7Ci0gICAgIGNoYXIgaW1fc2l6ZTsKLSAgICAgY2hhciBvcGNvZGVfYml0X3B0cjsKLXsKLSAgcmVnaXN0ZXIgaW50IGksIGo7Ci0gIGNoYXIgZDsKLSAgaW50IHBjcmVsLCB0bXAsIGIsIGxvb3AsIHBjcmVsX2FkanVzdDsKLSAgZm9yIChsb29wID0gMDsgbG9vcCA8IGFyZ2M7IGxvb3ArKykKLSAgICB7Ci0gICAgICBpID0gb3BlcmFuZHNQW2xvb3AgPDwgMV0gLSAnMSc7CS8qIHdoYXQgb3BlcmFuZCBhcmUgd2Ugc3VwcG9zZWQKLQkJCQkJICAgdG8gd29yayBvbiAqLwotICAgICAgaWYgKGkgPiAzKQotCWFzX2ZhdGFsIChfKCJJbnRlcm5hbCBjb25zaXN0ZW5jeSBlcnJvci4gIGNoZWNrIG5zMzJrLW9wY29kZS5oIikpOwotICAgICAgcGNyZWwgPSAwOwotICAgICAgcGNyZWxfYWRqdXN0ID0gMDsKLSAgICAgIHRtcCA9IDA7Ci0gICAgICBzd2l0Y2ggKChkID0gb3BlcmFuZHNQWyhsb29wIDw8IDEpICsgMV0pKQotCXsKLQljYXNlICdmJzoJCS8qIG9wZXJhbmQgb2Ygc2ZzciB0dXJucyBvdXQgdG8gYmUgYSBuYXN0eQotCQkJCSAgIHNwZWNpYWxjYXNlICovCi0JICBvcGNvZGVfYml0X3B0ciAtPSA1OwotCWNhc2UgJ1onOgkJLyogZmxvYXQgbm90IGltbWVkaWF0ZSAqLwotCWNhc2UgJ0YnOgkJLyogMzIgYml0IGZsb2F0CWdlbmVyYWwgZm9ybSAqLwotCWNhc2UgJ0wnOgkJLyogNjQgYml0IGZsb2F0CSovCi0JY2FzZSAnSSc6CQkvKiBpbnRlZ2VyIG5vdCBpbW1lZGlhdGUgKi8KLQljYXNlICdCJzoJCS8qIGJ5dGUJICovCi0JY2FzZSAnVyc6CQkvKiB3b3JkCSAqLwotCWNhc2UgJ0QnOgkJLyogZG91YmxlLXdvcmQJKi8KLQljYXNlICdBJzoJCS8qIGRvdWJsZS13b3JkCWdlbi1hZGRyZXNzLWZvcm0gaWUgbm8gcmVncwotCQkJCSAgIGFsbG93ZWQgKi8KLQkgIGdldF9hZGRyX21vZGUgKGFyZ3ZbaV0sICZhZGRyX21vZGVQKTsKLQkgIGlmKChhZGRyX21vZGVQLm1vZGUgPT0gMjApICYmCi0JICAgICAoZCA9PSAnSScgfHwgZCA9PSAnWicgfHwgZCA9PSAnQScpKSB7Ci0JICAgIGFzX2ZhdGFsKGQgPT0gJ0EnPyBfKCJBZGRyZXNzIG9mIGltbWVkaWF0ZSBvcGVyYW5kIik6Ci0JCSAgICAgXygiSW52YWxpZCBpbW1lZGlhdGUgd3JpdGUgb3BlcmFuZC4iKSk7Ci0JICB9Ci0KLQkgIGlmIChvcGNvZGVfYml0X3B0ciA9PSBkZXNjLT5vcGNvZGVfc2l6ZSkKLQkgICAgYiA9IDQ7Ci0JICBlbHNlCi0JICAgIGIgPSA2OwotCSAgZm9yIChqID0gYjsgaiA8IChiICsgMik7IGorKykKLQkgICAgewotCSAgICAgIGlmIChhZGRyX21vZGVQLmRpc3BbaiAtIGJdKQotCQl7Ci0JCSAgSUlGIChqLAotCQkgICAgICAgMiwKLQkJICAgICAgIGFkZHJfbW9kZVAuZGlzcF9zdWZmaXhbaiAtIGJdLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHJfbW9kZVAuZGlzcFtqIC0gYl0sCi0JCSAgICAgICAwLAotCQkgICAgICAgYWRkcl9tb2RlUC5wY3JlbCwKLQkJICAgICAgIGlpZi5pbnN0cl9zaXplLAotCQkgICAgICAgYWRkcl9tb2RlUC5pbV9kaXNwLAotCQkgICAgICAgSU5EIChCUkFOQ0gsIEJZVEUpLAotCQkgICAgICAgTlVMTCwKLQkJICAgICAgIChhZGRyX21vZGVQLnNjYWxlZF9yZWcgPyBhZGRyX21vZGVQLnNjYWxlZF9tb2RlCi0JCQk6IGFkZHJfbW9kZVAubW9kZSksCi0JCSAgICAgICAwKTsKLQkJfQotCSAgICB9Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA1OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9ICgobG9uZykgYWRkcl9tb2RlUC5tb2RlKSA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGlmIChhZGRyX21vZGVQLnNjYWxlZF9yZWcpCi0JICAgIHsKLQkgICAgICBqID0gYiAvIDI7Ci0JICAgICAgSUlGIChqLCAxLCAxLCAodW5zaWduZWQgbG9uZykgYWRkcl9tb2RlUC5pbmRleF9ieXRlLAotCQkgICAwLCAwLCAwLCAwLCAwLCBOVUxMLCAtMSwgMCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2InOgkJLyogbXVsdGlwbGUgaW5zdHJ1Y3Rpb24gZGlzcCAqLwotCSAgZnJlZXB0cisrOwkJLyogT1ZFOnRoaXMgaXMgYW4gdXNlZnVsIGhhY2sgKi8KLQkgIHNwcmludGYgKGZyZWVwdHIsICIoKCVzLTEpKiVkKVwwMDAiLCBhcmd2W2ldLCBkZXNjLT5pbV9zaXplKTsKLQkgIGFyZ3ZbaV0gPSBmcmVlcHRyOwotCSAgcGNyZWwgLT0gMTsJCS8qIG1ha2UgcGNyZWwgMCBpbnNwaXRlIG9mIHdoYXQgY2FzZSAncCc6Ci0JCQkJICAgd2FudHMgKi8KLQkgIC8qIGZhbGwgdGhydSAqLwotCWNhc2UgJ3AnOgkJLyogZGlzcGxhY2VtZW50IC0gcGMgcmVsYXRpdmUgYWRkcmVzc2luZyAqLwotCSAgcGNyZWwgKz0gMTsKLQkgIC8qIGZhbGwgdGhydSAqLwotCWNhc2UgJ2QnOgkJLyogZGlzcGxhY2VtZW50ICovCi0JICBpaWYuaW5zdHJfc2l6ZSArPSBzdWZmaXhQW2ldID8gc3VmZml4UFtpXSA6IDQ7Ci0JICBJSUYgKDEyLCAyLCBzdWZmaXhQW2ldLCAodW5zaWduZWQgbG9uZykgYXJndltpXSwgMCwKLQkgICAgICAgcGNyZWwsIHBjcmVsX2FkanVzdCwgMSwgSU5EIChCUkFOQ0gsIEJZVEUpLCBOVUxMLCAtMSwgMCk7Ci0JICBicmVhazsKLQljYXNlICdIJzoJCS8qIHNlcXVlbnQtaGFjazogdGhlIGxpbmtlciB3YW50cyBhIGJpdCBzZXQKLQkJCQkgICB3aGVuIGJzciAqLwotCSAgcGNyZWwgPSAxOwotCSAgaWlmLmluc3RyX3NpemUgKz0gc3VmZml4UFtpXSA/IHN1ZmZpeFBbaV0gOiA0OwotCSAgSUlGICgxMiwgMiwgc3VmZml4UFtpXSwgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sIDAsCi0JICAgICAgIHBjcmVsLCBwY3JlbF9hZGp1c3QsIDEsIElORCAoQlJBTkNILCBCWVRFKSwgTlVMTCwgLTEsIDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAncSc6CQkvKiBxdWljayAqLwotCSAgb3Bjb2RlX2JpdF9wdHIgLT0gNDsKLQkgIElJRiAoMTEsIDIsIDQyLCAodW5zaWduZWQgbG9uZykgYXJndltpXSwgMCwgMCwgMCwgMCwgMCwKLQkgICAgICAgYml0X2ZpeF9uZXcgKDQsIG9wY29kZV9iaXRfcHRyLCAtOCwgNywgMCwgMSwgMCksIC0xLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3InOgkJLyogcmVnaXN0ZXIgbnVtYmVyICgzIGJpdHMpICovCi0JICBsaXN0X3NlYXJjaCAoYXJndltpXSwgb3B0NiwgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSAzOwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgkJLyogc2V0Y2ZnIGluc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQzLCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6CQkvKiBjaW52IGluc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQ0LCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OyAvKiBpbnNlcnQgdGhlIHJlZ3R5cGUgaW4gb3Bjb2RlICovCi0JICBicmVhazsKLQljYXNlICdTJzoJCS8qIHN0cmluZ2luc3RydWN0aW9uIG9wdGlvbnNsaXN0ICovCi0JICBvcHRsaXN0IChhcmd2W2ldLCBvcHQ1LCAmdG1wKTsKLQkgIG9wY29kZV9iaXRfcHRyIC09IDQ7Ci0JICBpaWYuaWlmUFsxXS5vYmplY3QgfD0gdG1wIDw8IDE1OwotCSAgYnJlYWs7Ci0JY2FzZSAndSc6Ci0JY2FzZSAnVSc6CQkvKiByZWdpc3Rlcmxpc3QgKi8KLQkgIElJRiAoMTAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIE5VTEwsIC0xLCAwKTsKLQkgIHN3aXRjaCAob3BlcmFuZHNQWyhpIDw8IDEpICsgMV0pCi0JICAgIHsKLQkgICAgY2FzZSAndSc6CQkvKiByZXN0b3JlLCBleGl0ICovCi0JICAgICAgb3B0bGlzdCAoYXJndltpXSwgb3B0MSwgJmlpZi5paWZQWzEwXS5vYmplY3QpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdVJzoJCS8qIHNhdmUsZW50ZXIgKi8KLQkgICAgICBvcHRsaXN0IChhcmd2W2ldLCBvcHQyLCAmaWlmLmlpZlBbMTBdLm9iamVjdCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlpZi5pbnN0cl9zaXplICs9IDE7Ci0JICBicmVhazsKLQljYXNlICdNJzoJCS8qIG1tdSByZWdpc3RlciAqLwotCSAgbGlzdF9zZWFyY2ggKGFyZ3ZbaV0sIG1tdXJlZywgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgkJLyogY3B1IHJlZ2lzdGVyICAqLwotCSAgbGlzdF9zZWFyY2ggKGFyZ3ZbaV0sIGNwdXJlZywgJnRtcCk7Ci0JICBvcGNvZGVfYml0X3B0ciAtPSA0OwotCSAgaWlmLmlpZlBbMV0ub2JqZWN0IHw9IHRtcCA8PCBvcGNvZGVfYml0X3B0cjsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgkJLyogaW5zcyBleHRzICovCi0JICBpaWYuaW5zdHJfc2l6ZSArPSAxOwkvKiAxIGJ5dGUgaXMgYWxsb2NhdGVkIGFmdGVyIHRoZSBvcGNvZGUgKi8KLQkgIElJRiAoMTAsIDIsIDEsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKSBhcmd2W2ldLAkvKiBpIGFsd2F5cyAyIGhlcmUgKi8KLQkgICAgICAgMCwgMCwgMCwgMCwgMCwKLQkgICAgICAgYml0X2ZpeF9uZXcgKDMsIDUsIDAsIDcsIDAsIDAsIDApLCAvKiBhIGJpdF9maXggaXMgdGFyZ2V0ZWQgdG8KLQkJCQkJCSAgICAgdGhlIGJ5dGUgKi8KLQkgICAgICAgLTEsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICBJSUYgKDExLCAyLCA0MiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFyZ3ZbaV0sCS8qIGkgYWx3YXlzIDMgaGVyZSAqLwotCSAgICAgICAwLCAwLCAwLCAwLCAwLAotCSAgICAgICBiaXRfZml4X25ldyAoNSwgMCwgMSwgMzIsIC0xLCAwLCAtMSksIC0xLCAwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2knOgotCSAgaWlmLmluc3RyX3NpemUgKz0gMTsKLQkgIGIgPSAyICsgaTsJCS8qIHB1dCB0aGUgZXh0ZW5zaW9uIGJ5dGUgYWZ0ZXIgb3Bjb2RlICovCi0JICBJSUYgKGIsIDIsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAwKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19mYXRhbCAoXygiQmFkIG9wY29kZS10YWJsZS1vcHRpb24sIGNoZWNrIGluIGZpbGUgbnMzMmstb3Bjb2RlLmgiKSk7Ci0JfQotICAgIH0KLX0KLQwKLS8qIGluOiAgaW5zdHJ1Y3Rpb24gbGluZQotICAgb3V0OiBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgaGFzIGJlZW4gcHJlcGFyZWQgZm9yIGRpcmVjdCBjb252ZXJzaW9uIHRvIGZyYWdtZW50KHMpIGFuZAotICAgZml4ZXMgaW4gYSBzeXN0ZW1hdGljYWwgZmFzaGlvbgotICAgUmV0dXJuLXZhbHVlID0gcmVjdXJzaXZlX2xldmVsCi0gICAqLwotLyogYnVpbGQgaWlmIG9mIG9uZSBhc3NlbWJseSB0ZXh0IGxpbmUgKi8KLWludAotcGFyc2UgKGxpbmUsIHJlY3Vyc2l2ZV9sZXZlbCkKLSAgICAgY2hhciAqbGluZTsKLSAgICAgaW50IHJlY3Vyc2l2ZV9sZXZlbDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbGluZXB0ciwgYywgc3VmZml4X3NlcGFyYXRvcjsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBhcmdjLCBhcmdfdHlwZTsKLSAgY2hhciBzcXIsIHNlcDsKLSAgY2hhciBzdWZmaXhbTUFYX0FSR1NdLCAqYXJndltNQVhfQVJHU107CS8qIG5vIG1vcmUgdGhhbiA0IG9wZXJhbmRzICovCi0gIGlmIChyZWN1cnNpdmVfbGV2ZWwgPD0gMCkKLSAgICB7CQkJCS8qIGNhbGxlZCBmcm9tIG1kX2Fzc2VtYmxlICovCi0gICAgICBmb3IgKGxpbmVwdHIgPSBsaW5lOyAoKmxpbmVwdHIpICE9ICdcMCcgJiYgKCpsaW5lcHRyKSAhPSAnICc7IGxpbmVwdHIrKyk7Ci0gICAgICBjID0gKmxpbmVwdHI7Ci0gICAgICAqbGluZXB0ciA9ICdcMCc7Ci0gICAgICBpZiAoIShkZXNjID0gKHN0cnVjdCBuczMya19vcGNvZGUgKikgaGFzaF9maW5kIChpbnN0X2hhc2hfaGFuZGxlLCBsaW5lKSkpCi0JewotCSAgYXNfZmF0YWwgKF8oIk5vIHN1Y2ggb3Bjb2RlIikpOwotCX0KLSAgICAgICpsaW5lcHRyID0gYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsaW5lcHRyID0gbGluZTsKLSAgICB9Ci0gIGFyZ2MgPSAwOwotICBpZiAoKmRlc2MtPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGlmICgqbGluZXB0cisrICE9ICdcMCcpCi0JewotCSAgc3FyID0gJ1snOwotCSAgc2VwID0gJywnOwotCSAgd2hpbGUgKCpsaW5lcHRyICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBpZiAoZGVzYy0+b3BlcmFuZHNbYXJnYyA8PCAxXSkKLQkJewotCQkgIHN1ZmZpeFthcmdjXSA9IDA7Ci0JCSAgYXJnX3R5cGUgPSBkZXNjLT5vcGVyYW5kc1soYXJnYyA8PCAxKSArIDFdOwotCQkgIHN3aXRjaCAoYXJnX3R5cGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlICdkJzoKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgY2FzZSAncCc6Ci0JCSAgICBjYXNlICdIJzoJLyogdGhlIG9wZXJhbmQgaXMgc3VwcG9zZWQgdG8gYmUgYQotCQkJCSAgIGRpc3BsYWNlbWVudCAqLwotCQkgICAgICAvKiBIYWNrd2FybmluZzogZG8gbm90IGZvcmdldCB0byB1cGRhdGUgdGhlIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlcyBhYm92ZSB3aGVuIGVkaXRpbmcgbnMzMmstb3Bjb2RlLmggKi8KLQkJICAgICAgc3VmZml4X3NlcGFyYXRvciA9ICc6JzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBkZWZhdWx0OgotCQkgICAgICBzdWZmaXhfc2VwYXJhdG9yID0gJ1wyNTUnOyAvKiBpZiB0aGlzIGNoYXIgb2NjdXJzIHdlCi0JCQkJCQkgICAgbG9vc2UgKi8KLQkJICAgIH0KLQkJICBzdWZmaXhbYXJnY10gPSAwOyAvKiAwIHdoZW4gbm8gJzonIGlzIGVuY291bnRlcmVkICovCi0JCSAgYXJndlthcmdjXSA9IGZyZWVwdHI7Ci0JCSAgKmZyZWVwdHIgPSAnXDAnOwotCQkgIHdoaWxlICgoYyA9ICpsaW5lcHRyKSAhPSAnXDAnICYmIGMgIT0gc2VwKQotCQkgICAgewotCQkgICAgICBpZiAoYyA9PSBzcXIpCi0JCQl7Ci0JCQkgIGlmIChzcXIgPT0gJ1snKQotCQkJICAgIHsKLQkJCSAgICAgIHNxciA9ICddJzsKLQkJCSAgICAgIHNlcCA9ICdcMCc7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgc3FyID0gJ1snOwotCQkJICAgICAgc2VwID0gJywnOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgaWYgKGMgPT0gc3VmZml4X3NlcGFyYXRvcikKLQkJCXsJLyogJzonIC0gbGFiZWwvc3VmZml4IHNlcGFyYXRvciAqLwotCQkJICBzd2l0Y2ggKGxpbmVwdHJbMV0pCi0JCQkgICAgewotCQkJICAgIGNhc2UgJ2InOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gMTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJ3cnOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gMjsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgJ2QnOgotCQkJICAgICAgc3VmZml4W2FyZ2NdID0gNDsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkgICAgICBhc193YXJuIChfKCJCYWQgc3VmZml4LCBkZWZhdWx0aW5nIHRvIGQiKSk7Ci0JCQkgICAgICBzdWZmaXhbYXJnY10gPSA0OwotCQkJICAgICAgaWYgKGxpbmVwdHJbMV0gPT0gJ1wwJyB8fCBsaW5lcHRyWzFdID09IHNlcCkKLQkJCQl7Ci0JCQkJICBsaW5lcHRyICs9IDE7Ci0JCQkJICBjb250aW51ZTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBsaW5lcHRyICs9IDI7Ci0JCQkgIGNvbnRpbnVlOwotCQkJfQotCQkgICAgICAqZnJlZXB0cisrID0gYzsKLQkJICAgICAgbGluZXB0cisrOwotCQkgICAgfQotCQkgICpmcmVlcHRyKysgPSAnXDAnOwotCQkgIGFyZ2MgKz0gMTsKLQkJICBpZiAoKmxpbmVwdHIgPT0gJ1wwJykKLQkJICAgIGNvbnRpbnVlOwotCQkgIGxpbmVwdHIgKz0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2ZhdGFsIChfKCJUb28gbWFueSBvcGVyYW5kcyBwYXNzZWQgdG8gaW5zdHJ1Y3Rpb24iKSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChhcmdjICE9IHN0cmxlbiAoZGVzYy0+b3BlcmFuZHMpIC8gMikKLSAgICB7Ci0gICAgICBpZiAoc3RybGVuIChkZXNjLT5kZWZhdWx0X2FyZ3MpKQotCXsJCQkvKiB3ZSBjYW4gYXBwbHkgZGVmYXVsdCwgZG9udCBnb29mICovCi0JICBpZiAocGFyc2UgKGRlc2MtPmRlZmF1bHRfYXJncywgMSkgIT0gMSkKLQkgICAgewkJCS8qIGNoZWNrIGVycm9yIGluIGRlZmF1bHQgKi8KLQkgICAgICBhc19mYXRhbCAoXygiV3JvbmcgbnVtYmVycyBvZiBvcGVyYW5kcyBpbiBkZWZhdWx0LCBjaGVjayBuczMyay1vcGNvZGVzLmgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfZmF0YWwgKF8oIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyIpKTsKLQl9Ci0KLSAgICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBJSUZfRU5UUklFUzsgaSsrKQotICAgIHsKLSAgICAgIGlpZi5paWZQW2ldLnR5cGUgPSAwOwkvKiBtYXJrIGFsbCBlbnRyaWVzIGFzIHZvaWQqLwotICAgIH0KLQotICAvKiBidWlsZCBvcGNvZGUgaWlmLWVudHJ5ICovCi0gIGlpZi5pbnN0cl9zaXplID0gZGVzYy0+b3Bjb2RlX3NpemUgLyA4OwotICBJSUYgKDEsIDEsIGlpZi5pbnN0cl9zaXplLCBkZXNjLT5vcGNvZGVfc2VlZCwgMCwgMCwgMCwgMCwgMCwgMCwgLTEsIDApOwotCi0gIC8qIHRoaXMgY2FsbCBlbmNvZGVzIG9wZXJhbmRzIHRvIGlpZiBmb3JtYXQgKi8KLSAgaWYgKGFyZ2MpCi0gICAgewotICAgICAgZW5jb2RlX29wZXJhbmQgKGFyZ2MsCi0JCSAgICAgIGFyZ3YsCi0JCSAgICAgICZkZXNjLT5vcGVyYW5kc1swXSwKLQkJICAgICAgJnN1ZmZpeFswXSwKLQkJICAgICAgZGVzYy0+aW1fc2l6ZSwKLQkJICAgICAgZGVzYy0+b3Bjb2RlX3NpemUpOwotICAgIH0KLSAgcmV0dXJuIHJlY3Vyc2l2ZV9sZXZlbDsKLX0KLQwKLQotLyogQ29udmVydCBpaWYgdG8gZnJhZ21lbnRzLiAgRnJvbSB0aGlzIHBvaW50IHdlIHN0YXJ0IHRvIGRyaWJibGUgd2l0aAotICogZnVuY3Rpb25zIGluIG90aGVyIGZpbGVzIHRoYW4gdGhpcyBvbmUuKEV4Y2VwdCBoYXNoLmMpIFNvLCBpZiBpdCdzCi0gKiBwb3NzaWJsZSB0byBtYWtlIGFuIGlpZiBmb3IgYW4gb3RoZXIgQ1BVLCB5b3UgZG9uJ3QgbmVlZCB0byBrbm93Ci0gKiB3aGF0IGZyYWdzLCByZWxheCwgb2JzdGFja3MsIGV0YyBpcyBpbiBvcmRlciB0byBwb3J0IHRoaXMKLSAqIGFzc2VtYmxlci4gWW91IG9ubHkgbmVlZCB0byBrbm93IGlmIGl0J3MgcG9zc2libGUgdG8gcmVkdWNlIHlvdXIKLSAqIGNwdS1pbnN0cnVjdGlvbiB0byBpaWYtZm9ybWF0ICh0YWtlcyBzb21lIHdvcmspIGFuZCBhZG9wdCB0aGUgb3RoZXIKLSAqIG1kXz8gcGFydHMgYWNjb3JkaW5nIHRvIGdpdmVuIGluc3RydWN0aW9ucyBOb3RlIHRoYXQgaWlmIHdhcwotICogaW52ZW50ZWQgZm9yIHRoZSBjbGVhbiBuczMya2BzIGFyY2hpdGVjdXJlLgotICovCi0KLS8qIEdBUyBmb3IgdGhlIG5zMzJrIGhhcyBhIHByb2JsZW0uIFBDIHJlbGF0aXZlIGRpc3BsYWNlbWVudHMgYXJlCi0gKiByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb3Bjb2RlLCBub3QgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gKiBvcGVyYW5kLiBXZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBvcGVyYW5kCi0gKiBhbmQgdGhlIG9wY29kZSBpbiBwY3JlbF9hZGp1c3QgZm9yIGVhY2ggZnJhZyBhbmQgZWFjaCBmaXguIEhvd2V2ZXIsCi0gKiB3ZSBnZXQgaW50byB0cm91YmxlIHdoZXJlIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBwYy1yZWxhdGl2ZQotICogb3BlcmFuZHMgYW5kIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBvbmUgY2FuJ3QgYmUgZGV0ZXJtaW5lZC4gVGhlbiBpbgotICogdGhlIHJlbGF4IHBoYXNlLCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3Qgb3BlcmFuZCB3aWxsIGNoYW5nZSBhbmQKLSAqIHBjcmVsX2FkanVzdCB3aWxsIG5vIGxvbmdlciBiZSBjb3JyZWN0LiAgVGhlIGN1cnJlbnQgc29sdXRpb24gaXMKLSAqIGtlZXAgYSBwb2ludGVyIHRvIHRoZSBmcmFnIHdpdGggdGhlIG9wY29kZSBpbiBpdCBhbmQgdGhlIG9mZnNldCBpbgotICogdGhhdCBmcmFnIGZvciBlYWNoIGZyYWcgYW5kIGVhY2ggZml4LiBUaGVuLCB3aGVuIG5lZWRlZCwgd2UgY2FuCi0gKiBhbHdheXMgZmlndXJlIG91dCBob3cgZmFyIGl0IGlzIGJldHdlZW4gdGhlIG9wY29kZSBhbmQgdGhlIHBjcmVsCi0gKiBvYmplY3QuICBTZWUgYWxzbyBtZF9wY3JlbF9hZGp1c3QgYW5kIG1kX2ZpeF9wY3JlbF9hZGp1c3QuICBGb3IKLSAqIG9iamVjdHMgbm90IHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBwb2ludGVyIHRvIHRoZSBvcGNvZGUgZnJhZwotICogaXMgYWx3YXlzIHplcm8uICAqLwotCi12b2lkCi1jb252ZXJ0X2lpZiAoKQotewotICBpbnQgaTsKLSAgYml0X2ZpeFMgKmo7Ci0gIGZyYWdTICppbnN0X2ZyYWc7Ci0gIHVuc2lnbmVkIGludCBpbnN0X29mZnNldDsKLSAgY2hhciAqaW5zdF9vcGNvZGU7Ci0gIGNoYXIgKm1lbVA7Ci0gIGludCBsOwotICBpbnQgazsKLSAgY2hhciB0eXBlOwotICBjaGFyIHNpemUgPSAwOwotICBpbnQgc2l6ZV9zb19mYXI7Ci0KLSAgbWVtUCA9IGZyYWdfbW9yZSAoMCk7Ci0gIGluc3Rfb3Bjb2RlID0gbWVtUDsKLSAgaW5zdF9vZmZzZXQgPSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKTsKLSAgaW5zdF9mcmFnID0gZnJhZ19ub3c7Ci0KLSAgZm9yIChpID0gMDsgaSA8IElJRl9FTlRSSUVTOyBpKyspCi0gICAgewotICAgICAgaWYgKHR5cGUgPSBpaWYuaWlmUFtpXS50eXBlKQotCXsJCQkvKiB0aGUgb2JqZWN0IGV4aXN0LCBzbyBoYW5kbGUgaXQgKi8KLQkgIHN3aXRjaCAoc2l6ZSA9IGlpZi5paWZQW2ldLnNpemUpCi0JICAgIHsKLQkgICAgY2FzZSA0MjoKLQkgICAgICBzaXplID0gMDsJCS8qIGl0J3MgYSBiaXRmaXggdGhhdCBvcGVyYXRlcyBvbiBhbiBleGlzdGluZwotCQkJCSAgIG9iamVjdCovCi0JICAgICAgaWYgKGlpZi5paWZQW2ldLmJpdF9maXhQLT5meF9iaXRfYmFzZSkKLQkJewkJLyogZXhwYW5kIGZ4X2JpdF9iYXNlIHRvIHBvaW50IGF0IG9wY29kZSAqLwotCQkgIGlpZi5paWZQW2ldLmJpdF9maXhQLT5meF9iaXRfYmFzZSA9IChsb25nKSBpbnN0X29wY29kZTsKLQkJfQotCSAgICBjYXNlIDg6CQkvKiBiaWdudW0gb3IgZG91YmxlZmxvYXQgKi8KLQkgICAgY2FzZSAxOgotCSAgICBjYXNlIDI6Ci0JICAgIGNhc2UgMzoKLQkgICAgY2FzZSA0OgkJLyogdGhlIGZpbmFsIHNpemUgaW4gb2JqZWN0bWVtb3J5IGlzIGtub3duICovCi0JICAgICAgbWVtUCA9IGZyYWdfbW9yZShzaXplKTsKLQkgICAgICBqID0gaWlmLmlpZlBbaV0uYml0X2ZpeFA7Ci0JICAgICAgc3dpdGNoICh0eXBlKQotCQl7Ci0JCWNhc2UgMToJLyogdGhlIG9iamVjdCBpcyBwdXJlIGJpbmFyeSAqLwotCQkgIGlmIChqIHx8IGlpZi5paWZQW2ldLnBjcmVsKQotCQkgICAgewotCQkgICAgICBmaXhfbmV3X25zMzJrIChmcmFnX25vdywKLQkJCQkgICAgIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkgICAgIHNpemUsCi0JCQkJICAgICAwLAotCQkJCSAgICAgaWlmLmlpZlBbaV0ub2JqZWN0LAotCQkJCSAgICAgaWlmLmlpZlBbaV0ucGNyZWwsCi0JCQkJICAgICBpaWYuaWlmUFtpXS5pbV9kaXNwLAotCQkJCSAgICAgaiwKLQkJCQkgICAgIGlpZi5paWZQW2ldLmJzciwJLyogc2VxdWVudCBoYWNrICovCi0JCQkJICAgICBpbnN0X2ZyYWcsIGluc3Rfb2Zmc2V0KTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiBnb29kLCBqdXN0IHB1dCB0aGVtIGJ5dGVzIG91dCAqLwotCQkgICAgICBzd2l0Y2ggKGlpZi5paWZQW2ldLmltX2Rpc3ApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIG1kX251bWJlcl90b19jaGFycyAobWVtUCwgaWlmLmlpZlBbaV0ub2JqZWN0LCBzaXplKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkgIG1kX251bWJlcl90b19kaXNwIChtZW1QLCBpaWYuaWlmUFtpXS5vYmplY3QsIHNpemUpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGFzX2ZhdGFsIChfKCJpaWYgY29udmVydCBpbnRlcm5hbCBwY3JlbC9iaW5hcnkiKSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMjoKLQkJICAvKiB0aGUgb2JqZWN0IGlzIGEgcG9pbnRlciBhdCBhbiBleHByZXNzaW9uLCBzbwotICAgICAgICAgICAgICAgICAgICAgdW5wYWNrIGl0LCBub3RlIHRoYXQgYmlnbnVtcyBtYXkgcmVzdWx0IGZyb20gdGhlCi0gICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uICovCi0JCSAgZXZhbHVhdGVfZXhwciAoJmV4cHJQLCAoY2hhciAqKSBpaWYuaWlmUFtpXS5vYmplY3QpOwotCQkgIGlmIChleHByUC5YX29wID09IE9fYmlnIHx8IHNpemUgPT0gOCkKLQkJICAgIHsKLQkJICAgICAgaWYgKChrID0gZXhwclAuWF9hZGRfbnVtYmVyKSA+IDApCi0JCQl7Ci0JCQkgIC8qIHdlIGhhdmUgYSBiaWdudW0gaWUgYSBxdWFkLiBUaGlzIGNhbiBvbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHBlbnMgaW4gYSBsb25nIHN1ZmZpeGVkIGluc3RydWN0aW9uICovCi0JCQkgIGlmIChrICogMiA+IHNpemUpCi0JCQkgICAgYXNfd2FybiAoXygiQmlnbnVtIHRvbyBiaWcgZm9yIGxvbmciKSk7Ci0JCQkgIGlmIChrID09IDMpCi0JCQkgICAgbWVtUCArPSAyOwotCQkJICBmb3IgKGwgPSAwOyBrID4gMDsgay0tLCBsICs9IDIpCi0JCQkgICAgewotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChtZW1QICsgbCwKLQkJCQkJCSAgZ2VuZXJpY19iaWdudW1bbCA+PiAxXSwKLQkJCQkJCSAgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewkvKiBmbG9udW0gKi8KLQkJCSAgTElUVExFTlVNX1RZUEUgd29yZHNbNF07Ci0KLQkJCSAgc3dpdGNoIChzaXplKQotCQkJICAgIHsKLQkJCSAgICBjYXNlIDQ6Ci0JCQkgICAgICBnZW5fdG9fd29yZHMgKHdvcmRzLCAyLCA4KTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIChsb25nKSB3b3Jkc1swXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAgKyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSwKLQkJCQkJCShsb25nKSB3b3Jkc1sxXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIGNhc2UgODoKLQkJCSAgICAgIGdlbl90b193b3JkcyAod29yZHMsIDQsIDExKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIChsb25nKSB3b3Jkc1swXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKG1lbVAgKyBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSwKLQkJCQkJCShsb25nKSB3b3Jkc1sxXSwKLQkJCQkJCXNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLQkJCSAgICAgIG1kX251bWJlcl90b19pbW0gKChtZW1QICsgMgotCQkJCQkJICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpLAotCQkJCQkJKGxvbmcpIHdvcmRzWzJdLAotCQkJCQkJc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2ltbSAoKG1lbVAgKyAzCi0JCQkJCQkgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSksCi0JCQkJCQkobG9uZykgd29yZHNbM10sCi0JCQkJCQlzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JCQkgICAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGlmIChqIHx8Ci0JCSAgICAgIGV4cHJQLlhfYWRkX3N5bWJvbCB8fAotCQkgICAgICBleHByUC5YX29wX3N5bWJvbCB8fAotCQkgICAgICBpaWYuaWlmUFtpXS5wY3JlbCkKLQkJICAgIHsKLQkJICAgICAgLyogVGhlIGV4cHJlc3Npb24gd2FzIHVuZGVmaW5lZCBkdWUgdG8gYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgbGFiZWwuIENyZWF0ZSBhIGZpeCBzbyB3ZSBjYW4gZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG9iamVjdCBsYXRlci4gKi8KLQkJICAgICAgZXhwclAuWF9hZGRfbnVtYmVyICs9IGlpZi5paWZQW2ldLm9iamVjdF9hZGp1c3Q7Ci0JCSAgICAgIGZpeF9uZXdfbnMzMmtfZXhwIChmcmFnX25vdywKLQkJCQkJIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkJIHNpemUsCi0JCQkJCSAmZXhwclAsCi0JCQkJCSBpaWYuaWlmUFtpXS5wY3JlbCwKLQkJCQkJIGlpZi5paWZQW2ldLmltX2Rpc3AsCi0JCQkJCSBqLAotCQkJCQkgaWlmLmlpZlBbaV0uYnNyLAotCQkJCQkgaW5zdF9mcmFnLCBpbnN0X29mZnNldCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBnb29kLCBqdXN0IHB1dCB0aGVtIGJ5dGVzIG91dCAqLwotCQkgICAgICBzd2l0Y2ggKGlpZi5paWZQW2ldLmltX2Rpc3ApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIG1kX251bWJlcl90b19pbW0gKG1lbVAsIGV4cHJQLlhfYWRkX251bWJlciwgc2l6ZSk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAxOgotCQkJICBtZF9udW1iZXJfdG9fZGlzcCAobWVtUCwgZXhwclAuWF9hZGRfbnVtYmVyLCBzaXplKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBhc19mYXRhbCAoXygiaWlmIGNvbnZlcnQgaW50ZXJuYWwgcGNyZWwvcG9pbnRlciIpKTsKLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbbl0udHlwZSIpKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIDA6Ci0JICAgICAgLyogVG8gYmFkLCB0aGUgb2JqZWN0IG1heSBiZSB1bmRlZmluZWQgYXMgZmFyIGFzIGl0cwotCQkgZmluYWwgbnNpemUgaW4gb2JqZWN0IG1lbW9yeSBpcyBjb25jZXJuZWQuICBUaGUgc2l6ZQotCQkgb2YgdGhlIG9iamVjdCBpbiBvYmplY3RtZW1vcnkgaXMgbm90IGV4cGxpY2l0bHkKLQkJIGdpdmVuLiAgSWYgdGhlIG9iamVjdCBpcyBkZWZpbmVkIGl0cyBsZW5ndGggY2FuIGJlCi0JCSBkZXRlcm1pbmVkIGFuZCBhIGZpeCBjYW4gcmVwbGFjZSB0aGUgZnJhZy4gKi8KLQkgICAgICB7Ci0JCWV2YWx1YXRlX2V4cHIgKCZleHByUCwgKGNoYXIgKikgaWlmLmlpZlBbaV0ub2JqZWN0KTsKLQkJaWYgKChleHByUC5YX2FkZF9zeW1ib2wgfHwgZXhwclAuWF9vcF9zeW1ib2wpICYmCi0JCSAgICAhaWlmLmlpZlBbaV0ucGNyZWwpCi0JCSAgewotCQkgICAgLyogU2l6ZSBpcyB1bmtub3duIHVudGlsIGxpbmsgdGltZSBzbyBoYXZlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgIGFsbG93IDQgYnl0ZXMuICovCi0JCSAgICBzaXplID0gNDsKLQkJICAgIG1lbVAgPSBmcmFnX21vcmUoc2l6ZSk7Ci0JCSAgICBmaXhfbmV3X25zMzJrX2V4cCAoZnJhZ19ub3csCi0JCQkJICAgICAgIChsb25nKSAobWVtUCAtIGZyYWdfbm93LT5mcl9saXRlcmFsKSwKLQkJCQkgICAgICAgc2l6ZSwKLQkJCQkgICAgICAgJmV4cHJQLAotCQkJCSAgICAgICAwLCAvKiBuZXZlciBpaWYuaWlmUFtpXS5wY3JlbCwgKi8KLQkJCQkgICAgICAgMSwgLyogYWx3YXlzIGlpZi5paWZQW2ldLmltX2Rpc3AgKi8KLQkJCQkgICAgICAgKGJpdF9maXhTICopIDAsIDAsCi0JCQkJICAgICAgIGluc3RfZnJhZywKLQkJCQkgICAgICAgaW5zdF9vZmZzZXQpOwotCQkgICAgYnJlYWs7CQkvKiBleGl0IHRoaXMgYWJzb2x1dGUgaGFjayAqLwotCQkgIH0KLQotCQlpZiAoZXhwclAuWF9hZGRfc3ltYm9sIHx8IGV4cHJQLlhfb3Bfc3ltYm9sKQotCQkgIHsJCQkvKiBmcmFnIGl0ICovCi0JCSAgICBpZiAoZXhwclAuWF9vcF9zeW1ib2wpCi0JCSAgICAgIHsJCQkvKiBXZSBjYW50IHJlbGF4IHRoaXMgY2FzZSAqLwotCQkJYXNfZmF0YWwgKF8oIkNhbid0IHJlbGF4IGRpZmZlcmVuY2UiKSk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCi0JCQkvKiBTaXplIGlzIG5vdCBpbXBvcnRhbnQuIFRoaXMgZ2V0cyBmaXhlZCBieSByZWxheCwKLQkJCSAqIGJ1dCB3ZSBhc3N1bWUgMCBpbiB3aGF0IGZvbGxvd3MKLQkJCSAqLwotCQkJbWVtUCA9IGZyYWdfbW9yZSg0KTsgLyogTWF4IHNpemUgKi8KLQkJCXNpemUgPSAwOwotCi0JCQl7Ci0JCQkgIGZyYWdTICpvbGRfZnJhZyA9IGZyYWdfbm93OwotCQkJICBmcmFnX3ZhcmlhbnQgKHJzX21hY2hpbmVfZGVwZW5kZW50LAotCQkJCQk0LCAvKiBNYXggc2l6ZSAqLwotCQkJCQkwLCAvKiBzaXplICovCi0JCQkJCUlORCAoQlJBTkNILCBVTkRFRiksIC8qIGV4cGVjdGluZyB0aGUgd29yc3QgKi8KLQkJCQkJZXhwclAuWF9hZGRfc3ltYm9sLAotCQkJCQlleHByUC5YX2FkZF9udW1iZXIsCi0JCQkJCWluc3Rfb3Bjb2RlKTsKLQkJCSAgZnJhZ19vcGNvZGVfZnJhZyhvbGRfZnJhZykgPSBpbnN0X2ZyYWc7Ci0JCQkgIGZyYWdfb3Bjb2RlX29mZnNldChvbGRfZnJhZykgPSBpbnN0X29mZnNldDsKLQkJCSAgZnJhZ19ic3Iob2xkX2ZyYWcpID0gaWlmLmlpZlBbaV0uYnNyOwotCQkJfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgLyogVGhpcyBkdXBsaWNhdGVzIGNvZGUgaW4gbWRfbnVtYmVyX3RvX2Rpc3AgKi8KLQkJICAgIGlmICgtNjQgPD0gZXhwclAuWF9hZGRfbnVtYmVyICYmIGV4cHJQLlhfYWRkX251bWJlciA8PSA2MykKLQkJICAgICAgewotCQkJc2l6ZSA9IDE7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UKLQkJICAgICAgewotCQkJaWYgKC04MTkyIDw9IGV4cHJQLlhfYWRkX251bWJlcgotCQkJICAgICYmIGV4cHJQLlhfYWRkX251bWJlciA8PSA4MTkxKQotCQkJICB7Ci0JCQkgICAgc2l6ZSA9IDI7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgewotCQkJICAgIGlmICgtMHgyMDAwMDAwMDw9ZXhwclAuWF9hZGRfbnVtYmVyICYmCi0JCQkJZXhwclAuWF9hZGRfbnVtYmVyPD0weDFmZmZmZmZmKQotCQkJICAgICAgewotCQkJCXNpemUgPSA0OwotCQkJICAgICAgfQotCQkJICAgIGVsc2UKLQkJCSAgICAgIHsKLQkJCQlhc193YXJuIChfKCJEaXNwbGFjZW1lbnQgdG8gbGFyZ2UgZm9yIDpkIikpOwotCQkJCXNpemUgPSA0OwotCQkJICAgICAgfQotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIG1lbVAgPSBmcmFnX21vcmUoc2l6ZSk7Ci0JCSAgICBtZF9udW1iZXJfdG9fZGlzcCAobWVtUCwgZXhwclAuWF9hZGRfbnVtYmVyLCBzaXplKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGFzX2ZhdGFsIChfKCJJbnRlcm5hbCBsb2dpYyBlcnJvciBpbiBpaWYuaWlmUFtdLnR5cGUiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotfQotDAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIFRoaXMgZnVuY3Rpb25hbGl0eSBzaG91bGQgcmVhbGx5IGJlIGluIHRoZSBiZmQgbGlicmFyeSAqLwotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotcmVsb2MgKGludCBzaXplLCBpbnQgcGNyZWwsIGludCB0eXBlKQotewotICBpbnQgbGVuZ3RoLCBpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jc1tdID0gewotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fOCwKLSAgICBCRkRfUkVMT0NfTlMzMktfSU1NXzE2LAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMzIsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV84X1BDUkVMLAotICAgIEJGRF9SRUxPQ19OUzMyS19JTU1fMTZfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0lNTV8zMl9QQ1JFTCwKLQotICAgIC8qIG5zMzJrIGRpc3BsYWNlbWVudHMgKi8KLSAgICBCRkRfUkVMT0NfTlMzMktfRElTUF84LAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzE2LAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzMyLAotICAgIEJGRF9SRUxPQ19OUzMyS19ESVNQXzhfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMTZfUENSRUwsCi0gICAgQkZEX1JFTE9DX05TMzJLX0RJU1BfMzJfUENSRUwsCi0KLSAgICAvKiBOb3JtYWwgMidzIGNvbXBsZW1lbnQgKi8KLSAgICBCRkRfUkVMT0NfOCwKLSAgICBCRkRfUkVMT0NfMTYsCi0gICAgQkZEX1JFTE9DXzMyLAotICAgIEJGRF9SRUxPQ184X1BDUkVMLAotICAgIEJGRF9SRUxPQ18xNl9QQ1JFTCwKLSAgICBCRkRfUkVMT0NfMzJfUENSRUwKLSAgICB9OwotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGxlbmd0aCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgbGVuZ3RoID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBsZW5ndGggPSAtMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgaW5kZXggPSBsZW5ndGggKyAzICogcGNyZWwgKyA2ICogdHlwZTsKLSAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBzaXplb2YocmVsb2NzKS9zaXplb2YocmVsb2NzWzBdKSkKLSAgICByZXR1cm4gcmVsb2NzW2luZGV4XTsKLSAgaWYgKHBjcmVsKQotICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIHN0b3JhZ2UgdHlwZSAlZCIpLAotCSAgICBzaXplLCB0eXBlKTsKLSAgZWxzZQotICAgIGFzX2JhZCAoXygiQ2FuIG5vdCBkbyAlZCBieXRlIHJlbG9jYXRpb24gZm9yIHN0b3JhZ2UgdHlwZSAlZCIpLAotCSAgICBzaXplLCB0eXBlKTsKLSAgcmV0dXJuIEJGRF9SRUxPQ19OT05FOwotCi19Ci0KLSNlbmRpZgotCi12b2lkCi1tZF9hc3NlbWJsZSAobGluZSkKLSAgICAgY2hhciAqbGluZTsKLXsKLSAgZnJlZXB0ciA9IGZyZWVwdHJfc3RhdGljOwotICBwYXJzZSAobGluZSwgMCk7CQkvKiBleHBsb2RlIGxpbmUgdG8gbW9yZSBmaXggZm9ybSBpbiBpaWYgKi8KLSAgY29udmVydF9paWYgKCk7CQkvKiBjb252ZXJ0IGlpZiB0byBmcmFncywgZml4J3MgZXRjICovCi0jaWZkZWYgU0hPV19OVU0KLSAgcHJpbnRmICgiIFx0XHRcdCVzXG4iLCBsaW5lKTsKLSNlbmRpZgotfQotCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIC8qIGJ1aWxkIGEgaGFzaHRhYmxlIG9mIHRoZSBpbnN0cnVjdGlvbnMgKi8KLSAgY29uc3Qgc3RydWN0IG5zMzJrX29wY29kZSAqcHRyOwotICBjb25zdCBjaGFyICpzdGF0OwotICBpbnN0X2hhc2hfaGFuZGxlID0gaGFzaF9uZXcgKCk7Ci0gIGZvciAocHRyID0gbnMzMmtfb3Bjb2RlczsgcHRyIDwgZW5kb3A7IHB0cisrKQotICAgIHsKLSAgICAgIGlmICgoc3RhdCA9IGhhc2hfaW5zZXJ0IChpbnN0X2hhc2hfaGFuZGxlLCBwdHItPm5hbWUsIChjaGFyICopIHB0cikpKQotCXsKLQkgIGFzX2ZhdGFsIChfKCJDYW4ndCBoYXNoICVzOiAlcyIpLCBwdHItPm5hbWUsIHN0YXQpOwkvKmZhdGFsKi8KLQl9Ci0gICAgfQotICBmcmVlcHRyX3N0YXRpYyA9IChjaGFyICopIG1hbGxvYyAoUFJJVkFURV9TSVpFKTsgLyogc29tZSBwcml2YXRlIHNwYWNlCi0JCQkJCQkgICAgICBwbGVhc2UhICovCi19Ci0KLS8qIE11c3QgYmUgZXF1YWwgdG8gTUFYX1BSRUNJU09OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgbGl0UCBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIGVtaXQgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzLiAgVGhlIG51bWJlciBvZgotICAgTElUVExFTlVNUyBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcwotICAgcmV0dXJuZWQsIG9yIE5VTEwgb24gT0suICAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkcyArIHByZWM7IHByZWMtLTspCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAobG9uZykgKCotLXdvcmRQKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotDAotLyogQ29udmVydCBudW1iZXIgdG8gY2hhcnMgaW4gY29ycmVjdCBvcmRlciAqLwotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLQotLyogVGhpcyBpcyBhIHZhcmlhbnQgb2YgbWRfbnVtYmVyc190b19jaGFycy4gVGhlIHJlYXNvbiBmb3IgaXRzJwotICAgZXhpc3RlbmNlIGlzIHRoZSBmYWN0IHRoYXQgbnMzMmsgdXNlcyBIdWZmbWFuIGNvZGVkCi0gICBkaXNwbGFjZW1lbnRzLiBUaGlzIGltcGxpZXMgdGhhdCB0aGUgYml0IG9yZGVyIGlzIHJldmVyc2VkIGluCi0gICBkaXNwbGFjZW1lbnRzIGFuZCB0aGF0IHRoZXkgYXJlIHByZWZpeGVkIHdpdGggYSBzaXplLXRhZy4KLQotICAgYmluYXJ5OiBtc2IgLT4gbHNiCi0gICAweHh4eHh4eAkJCQlieXRlCi0gICAxMHh4eHh4eCB4eHh4eHh4eAkJCXdvcmQKLSAgIDExeHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4CWRvdWJsZSB3b3JkCi0KLSAgIFRoaXMgbXVzdCBiZSB0YWtlbiBjYXJlIG9mIGFuZCB3ZSBkbyBpdCBoZXJlISAgKi8KLXN0YXRpYyB2b2lkCi1tZF9udW1iZXJfdG9fZGlzcCAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgbG9uZyB2YWw7Ci0gICAgIGNoYXIgbjsKLXsKLSAgc3dpdGNoIChuKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBpZiAodmFsIDwgLTY0IHx8IHZhbCA+IDYzKQotCWFzX3dhcm4gKF8oIkJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZS4gIGxpbmUgbnVtYmVyIG5vdCB2YWxpZCIpKTsKLSAgICAgIHZhbCAmPSAweDdmOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHZhbCA8IC04MTkyIHx8IHZhbCA+IDgxOTEpCi0JYXNfd2FybiAoXygiV29yZCBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlLiAgbGluZSBudW1iZXIgbm90IHZhbGlkIikpOwotICAgICAgdmFsICY9IDB4M2ZmZjsKLSAgICAgIHZhbCB8PSAweDgwMDA7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiA4ICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAodmFsIDwgLTB4MjAwMDAwMDAgfHwgdmFsID49IDB4MjAwMDAwMDApCi0JYXNfd2FybiAoXygiRG91YmxlIHdvcmQgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIpKTsKLSAgICAgIHZhbCB8PSAweGMwMDAwMDAwOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMjQgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiAxNiAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IuICBsaW5lICVzLCBmaWxlIFwiJXNcIiIpLAotCQlfX0xJTkVfXywgX19GSUxFX18pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLW1kX251bWJlcl90b19pbW0gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIGxvbmcgdmFsOwotICAgICBjaGFyIG47Ci17Ci0gIHN3aXRjaCAobikKLSAgICB7Ci0gICAgY2FzZSAxOgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gOCAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDgpOwotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gdmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotI2lmZGVmIFNIT1dfTlVNCi0gICAgICBwcmludGYgKCIleCAiLCB2YWwgPj4gMjQgJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiAyNCk7Ci0jaWZkZWYgU0hPV19OVU0KLSAgICAgIHByaW50ZiAoIiV4ICIsIHZhbCA+PiAxNiAmIDB4ZmYpOwotI2VuZGlmCi0gICAgICAqYnVmKysgPSAodmFsID4+IDE2KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsID4+IDggJiAweGZmKTsKLSNlbmRpZgotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSNpZmRlZiBTSE9XX05VTQotICAgICAgcHJpbnRmICgiJXggIiwgdmFsICYgMHhmZik7Ci0jZW5kaWYKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiSW50ZXJuYWwgbG9naWMgZXJyb3IuIGxpbmUgJXMsIGZpbGUgXCIlc1wiIiksCi0JCV9fTElORV9fLCBfX0ZJTEVfXyk7Ci0gICAgfQotfQotCi0KLS8qIGZhc3QgYml0ZmlkZGxpbmcgc3VwcG9ydCAqLwotLyogbWFzayB1c2VkIHRvIHplcm8gYml0ZmllbGQgYmVmb3JlIG9yaW5nIGluIHRoZSB0cnVlIGZpZWxkICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxfbWFza1tdID0KLXsKLSAgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZSwgMHhmZmZmZmZmYywgMHhmZmZmZmZmOCwKLSAgMHhmZmZmZmZmMCwgMHhmZmZmZmZlMCwgMHhmZmZmZmZjMCwgMHhmZmZmZmY4MCwKLSAgMHhmZmZmZmYwMCwgMHhmZmZmZmUwMCwgMHhmZmZmZmMwMCwgMHhmZmZmZjgwMCwKLSAgMHhmZmZmZjAwMCwgMHhmZmZmZTAwMCwgMHhmZmZmYzAwMCwgMHhmZmZmODAwMCwKLSAgMHhmZmZmMDAwMCwgMHhmZmZlMDAwMCwgMHhmZmZjMDAwMCwgMHhmZmY4MDAwMCwKLSAgMHhmZmYwMDAwMCwgMHhmZmUwMDAwMCwgMHhmZmMwMDAwMCwgMHhmZjgwMDAwMCwKLSAgMHhmZjAwMDAwMCwgMHhmZTAwMDAwMCwgMHhmYzAwMDAwMCwgMHhmODAwMDAwMCwKLSAgMHhmMDAwMDAwMCwgMHhlMDAwMDAwMCwgMHhjMDAwMDAwMCwgMHg4MDAwMDAwMCwKLX07Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyByX21hc2tbXSA9Ci17Ci0gIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDcsCi0gIDB4MDAwMDAwMGYsIDB4MDAwMDAwMWYsIDB4MDAwMDAwM2YsIDB4MDAwMDAwN2YsCi0gIDB4MDAwMDAwZmYsIDB4MDAwMDAxZmYsIDB4MDAwMDAzZmYsIDB4MDAwMDA3ZmYsCi0gIDB4MDAwMDBmZmYsIDB4MDAwMDFmZmYsIDB4MDAwMDNmZmYsIDB4MDAwMDdmZmYsCi0gIDB4MDAwMGZmZmYsIDB4MDAwMWZmZmYsIDB4MDAwM2ZmZmYsIDB4MDAwN2ZmZmYsCi0gIDB4MDAwZmZmZmYsIDB4MDAxZmZmZmYsIDB4MDAzZmZmZmYsIDB4MDA3ZmZmZmYsCi0gIDB4MDBmZmZmZmYsIDB4MDFmZmZmZmYsIDB4MDNmZmZmZmYsIDB4MDdmZmZmZmYsCi0gIDB4MGZmZmZmZmYsIDB4MWZmZmZmZmYsIDB4M2ZmZmZmZmYsIDB4N2ZmZmZmZmYsCi19OwotI2RlZmluZSBNQVNLX0JJVFMgMzEKLS8qIEluc2VydCBiaXRmaWVsZCBkZXNjcmliZWQgYnkgZmllbGRfcHRyIGFuZCB2YWwgYXQgYnVmCi0gICBUaGlzIHJvdXRpbmUgaXMgd3JpdHRlbiBmb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBmaXJzdCA0IGJ5dGVzIHBvaW50ZWQKLSAgIHRvIGJ5IGJ1ZiwgdG8geWllbGQgc3BlZWQuCi0gICBUaGUgaWZkZWYgc3R1ZmYgaXMgZm9yIHNlbGVjdGlvbiBiZXR3ZWVuIGEgbnMzMmstZGVwZW5kZW50IHJvdXRpbmUKLSAgIGFuZCBhIGdlbmVyYWwgdmVyc2lvbi4gKE15IGFkdmljZTogdXNlIHRoZSBnZW5lcmFsIHZlcnNpb24hKQotICAgKi8KLQotc3RhdGljIHZvaWQKLW1kX251bWJlcl90b19maWVsZCAoYnVmLCB2YWwsIGZpZWxkX3B0cikKLSAgICAgcmVnaXN0ZXIgY2hhciAqYnVmOwotICAgICByZWdpc3RlciBsb25nIHZhbDsKLSAgICAgcmVnaXN0ZXIgYml0X2ZpeFMgKmZpZWxkX3B0cjsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBvYmplY3Q7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgLyogZGVmaW5lIEVORElBTiBvbiBhIG5zMzJrIG1hY2hpbmUgKi8KLSNpZmRlZiBFTkRJQU4KLSAgcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyAqbWVtX3B0cjsKLSNlbHNlCi0gIHJlZ2lzdGVyIGNoYXIgKm1lbV9wdHI7Ci0jZW5kaWYKLSAgaWYgKGZpZWxkX3B0ci0+ZnhfYml0X21pbiA8PSB2YWwgJiYgdmFsIDw9IGZpZWxkX3B0ci0+ZnhfYml0X21heCkKLSAgICB7Ci0jaWZkZWYgRU5ESUFOCi0gICAgICBpZiAoZmllbGRfcHRyLT5meF9iaXRfYmFzZSkKLQl7CQkJLyogb3ZlcnJpZGUgYnVmICovCi0JICBtZW1fcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgZmllbGRfcHRyLT5meF9iaXRfYmFzZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWVtX3B0ciA9ICh1bnNpZ25lZCBsb25nICopIGJ1ZjsKLQl9Ci0gICAgICBtZW1fcHRyID0gKCh1bnNpZ25lZCBsb25nICopCi0JCSAoKGNoYXIgKikgbWVtX3B0ciArIGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2VfYWRqKSk7Ci0jZWxzZQotICAgICAgaWYgKGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2UpCi0JewkJCS8qIG92ZXJyaWRlIGJ1ZiAqLwotCSAgbWVtX3B0ciA9IChjaGFyICopIGZpZWxkX3B0ci0+ZnhfYml0X2Jhc2U7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1lbV9wdHIgPSBidWY7Ci0JfQotICAgICAgbWVtX3B0ciArPSBmaWVsZF9wdHItPmZ4X2JpdF9iYXNlX2FkajsKLSNlbmRpZgotI2lmZGVmIEVORElBTgkJCS8qIHdlIGhhdmUgYSBuaWNlIG5zMzJrIG1hY2hpbmUgd2l0aCBsb3dieXRlCi0JCQkJICAgYXQgbG93LXBoeXNpY2FsIG1lbSAqLwotICAgICAgb2JqZWN0ID0gKm1lbV9wdHI7CS8qIGdldCBzb21lIGJ5dGVzICovCi0jZWxzZSAvKiBPVkUgR29vZiEgdGhlIG1hY2hpbmUgaXMgYSBtNjhrIG9yIGRpdG8gKi8KLSAgICAgIC8qIFRoYXQgdGFrZXMgbW9yZSBieXRlIGZpZGRsaW5nICovCi0gICAgICBvYmplY3QgPSAwOwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbM10gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMl0gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMV0gJiAweGZmOwotICAgICAgb2JqZWN0IDw8PSA4OwotICAgICAgb2JqZWN0IHw9IG1lbV9wdHJbMF0gJiAweGZmOwotI2VuZGlmCi0gICAgICBtYXNrID0gMDsKLSAgICAgIG1hc2sgfD0gKHJfbWFza1tmaWVsZF9wdHItPmZ4X2JpdF9vZmZzZXRdKTsKLSAgICAgIG1hc2sgfD0gKGxfbWFza1tmaWVsZF9wdHItPmZ4X2JpdF9vZmZzZXQgKyBmaWVsZF9wdHItPmZ4X2JpdF9zaXplXSk7Ci0gICAgICBvYmplY3QgJj0gbWFzazsKLSAgICAgIHZhbCArPSBmaWVsZF9wdHItPmZ4X2JpdF9hZGQ7Ci0gICAgICBvYmplY3QgfD0gKCh2YWwgPDwgZmllbGRfcHRyLT5meF9iaXRfb2Zmc2V0KSAmIChtYXNrIF4gMHhmZmZmZmZmZikpOwotI2lmZGVmIEVORElBTgotICAgICAgKm1lbV9wdHIgPSBvYmplY3Q7Ci0jZWxzZQotICAgICAgbWVtX3B0clswXSA9IChjaGFyKSBvYmplY3Q7Ci0gICAgICBvYmplY3QgPj49IDg7Ci0gICAgICBtZW1fcHRyWzFdID0gKGNoYXIpIG9iamVjdDsKLSAgICAgIG9iamVjdCA+Pj0gODsKLSAgICAgIG1lbV9wdHJbMl0gPSAoY2hhcikgb2JqZWN0OwotICAgICAgb2JqZWN0ID4+PSA4OwotICAgICAgbWVtX3B0clszXSA9IChjaGFyKSBvYmplY3Q7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCaXQgZmllbGQgb3V0IG9mIHJhbmdlIikpOwotICAgIH0KLX0KLQotaW50IG1kX3BjcmVsX2FkanVzdCAoZnJhZ1MgKmZyYWdQKQotewotICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gIGFkZHJlc3NUIG9wY29kZV9hZGRyZXNzOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICBvcGNvZGVfZnJhZyA9IGZyYWdfb3Bjb2RlX2ZyYWcoZnJhZ1ApOwotICBpZiAob3Bjb2RlX2ZyYWcgPT0gMCkKLSAgICByZXR1cm4gMDsKLSAgb2Zmc2V0ID0gZnJhZ19vcGNvZGVfb2Zmc2V0KGZyYWdQKTsKLSAgb3Bjb2RlX2FkZHJlc3MgPSBvZmZzZXQgKyBvcGNvZGVfZnJhZy0+ZnJfYWRkcmVzczsKLSAgcmV0dXJuIGZyYWdQLT5mcl9hZGRyZXNzICsgZnJhZ1AtPmZyX2ZpeCAtIG9wY29kZV9hZGRyZXNzOwotfQotCi1pbnQgbWRfZml4X3BjcmVsX2FkanVzdCAoZml4UyAqZml4UCkKLXsKLSAgZnJhZ1MgKmZyYWdQID0gZml4UC0+ZnhfZnJhZzsKLSAgZnJhZ1MgKm9wY29kZV9mcmFnOwotICBhZGRyZXNzVCBvcGNvZGVfYWRkcmVzczsKLSAgdW5zaWduZWQgaW50IG9mZnNldDsKLSAgb3Bjb2RlX2ZyYWcgPSBmaXhfb3Bjb2RlX2ZyYWcoZml4UCk7Ci0gIGlmIChvcGNvZGVfZnJhZyA9PSAwKQotICAgIHJldHVybiAwOwotICBvZmZzZXQgPSBmaXhfb3Bjb2RlX29mZnNldChmaXhQKTsKLSAgb3Bjb2RlX2FkZHJlc3MgPSBvZmZzZXQgKyBvcGNvZGVfZnJhZy0+ZnJfYWRkcmVzczsKLSAgcmV0dXJuIGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyAtIG9wY29kZV9hZGRyZXNzOwotfQotCi0vKiBBcHBseSBhIGZpeFMgKGZpeHVwIG9mIGFuIGluc3RydWN0aW9uIG9yIGRhdGEgdGhhdCB3ZSBkaWRuJ3QgaGF2ZQotICAgZW5vdWdoIGluZm8gdG8gY29tcGxldGUgaW1tZWRpYXRlbHkpIHRvIHRoZSBkYXRhIGluIGEgZnJhZy4KLQotICAgT24gdGhlIG5zMzJrLCBldmVyeXRoaW5nIGlzIGluIGEgZGlmZmVyZW50IGZvcm1hdCwgc28gd2UgaGF2ZSBicm9rZW4KLSAgIG91dCBzZXBhcmF0ZSBmdW5jdGlvbnMgZm9yIGVhY2gga2luZCBvZiB0aGluZyB3ZSBjb3VsZCBiZSBmaXhpbmcuCi0gICBUaGV5IGFsbCBnZXQgY2FsbGVkIGZyb20gaGVyZS4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFscCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxwOwotI2Vsc2UKLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLSNlbmRpZgotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgbG9uZyB2YWwgPSAqdmFscDsKLSNlbmRpZgotICBmcmFnUyAqZnJhZ1AgPSBmaXhQLT5meF9mcmFnOwotCi0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBpZiAoZml4X2JpdF9maXhQKGZpeFApKQotICAgIHsJCQkJLyogQml0ZmllbGRzIHRvIGZpeCwgc2lnaCAqLwotICAgICAgbWRfbnVtYmVyX3RvX2ZpZWxkIChidWYsIHZhbCwgZml4X2JpdF9maXhQKGZpeFApKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzd2l0Y2ggKGZpeF9pbV9kaXNwKGZpeFApKQotICAgICAgewotCi0gICAgICBjYXNlIDA6CQkJLyogSW1tZWRpYXRlIGZpZWxkICovCi0JbWRfbnVtYmVyX3RvX2ltbSAoYnVmLCB2YWwsIGZpeFAtPmZ4X3NpemUpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIDE6CQkJLyogRGlzcGxhY2VtZW50IGZpZWxkICovCi0JLyogQ2FsY3VsYXRlIG9mZnNldCAqLwotCXsKLQltZF9udW1iZXJfdG9fZGlzcCAoYnVmLAotCQkJICAgKGZpeFAtPmZ4X3BjcmVsID8gdmFsICsgbWRfZml4X3BjcmVsX2FkanVzdChmaXhQKQotCQkJICAgIDogdmFsKSwgZml4UC0+Znhfc2l6ZSk7Ci0JfQotCWJyZWFrOwotCi0gICAgICBjYXNlIDI6CQkJLyogUG9pbnRlciBpbiBhIGRhdGEgb2JqZWN0ICovCi0JbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0JYnJlYWs7Ci0gICAgICB9Ci0jaWZkZWYgQlNEX0FTU0VNQkxFUgotICByZXR1cm4gMTsKLSNlbmRpZgotfQotDAotLyogQ29udmVydCBhIHJlbGF4ZWQgZGlzcGxhY2VtZW50IHRvIGRpdHRvIGluIGZpbmFsIG91dHB1dCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW1kX2NvbnZlcnRfZnJhZyAoaGVhZGVycywgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnM7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZWxzZQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0jZW5kaWYKLXsKLSAgbG9uZyBkaXNwOwotICBsb25nIGV4dCA9IDA7Ci0KLSAgLyogQWRkcmVzcyBpbiBnYXMgY29yZSBvZiB0aGUgcGxhY2UgdG8gc3RvcmUgdGhlIGRpc3BsYWNlbWVudC4gICovCi0gIHJlZ2lzdGVyIGNoYXIgKmJ1ZmZlcl9hZGRyZXNzID0gZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsOwotICAvKiBBZGRyZXNzIGluIG9iamVjdCBjb2RlIG9mIHRoZSBkaXNwbGFjZW1lbnQuICAqLwotICBpbnQgb2JqZWN0X2FkZHJlc3M7Ci0KLSAgZnJhZ1MgKm9wY29kZV9mcmFnOwotCi0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgSU5EIChCUkFOQ0gsIEJZVEUpOgotICAgICAgZXh0ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU5EIChCUkFOQ0gsIFdPUkQpOgotICAgICAgZXh0ID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSU5EIChCUkFOQ0gsIERPVUJMRSk6Ci0gICAgICBleHQgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmKGV4dCA9PSAwKQotICAgIHJldHVybjsKLQotICBrbm93IChmcmFnUC0+ZnJfc3ltYm9sKTsKLQotICBvYmplY3RfYWRkcmVzcyA9IGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfYWRkcmVzczsKLSAgLyogVGhlIGRpc3BsYWNlbWVudCBvZiB0aGUgYWRkcmVzcywgZnJvbSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLSAgZGlzcCA9IChTX0dFVF9WQUxVRSAoZnJhZ1AtPmZyX3N5bWJvbCkgKyBmcmFnUC0+ZnJfb2Zmc2V0KSAtIG9iamVjdF9hZGRyZXNzOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZGlzcCArPSBzeW1ib2xfZ2V0X2ZyYWcgKGZyYWdQLT5mcl9zeW1ib2wpLT5mcl9hZGRyZXNzOwotI2VuZGlmCi0gIGRpc3AgKz0gbWRfcGNyZWxfYWRqdXN0KGZyYWdQKTsKLQotICBtZF9udW1iZXJfdG9fZGlzcCAoYnVmZmVyX2FkZHJlc3MsIChsb25nKSBkaXNwLCAoaW50KSBleHQpOwotICBmcmFnUC0+ZnJfZml4ICs9IGV4dDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBlc3RpbWF0ZWQgc2l6ZSBhIHZhcmlhYmxlIG9iamVjdCB3aWxsIG9jY3VweSwKLSAgIG9uZSBjYW4gc2F5IHRoYXQgd2UgdHJpZXMgdG8gZ3Vlc3MgdGhlIHNpemUgb2YgdGhlIG9iamVjdHMgYmVmb3JlIHdlCi0gICBhY3R1YWxseSBrbm93IGl0ICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgaW50IG9sZF9maXg7Ci0gIG9sZF9maXggPSBmcmFnUC0+ZnJfZml4OwotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIElORCAoQlJBTkNILCBVTkRFRik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKLQl7Ci0JICAvKiB0aGUgc3ltYm9sIGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gSU5EIChCUkFOQ0gsIEJZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiB3ZSBkb24ndCByZWxheCBzeW1ib2xzIGRlZmluZWQgaW4gYW4gb3RoZXIgc2VnbWVudCB0aGUKLQkgICAgIHRoaW5nIHRvIGRvIGlzIHRvIGFzc3VtZSB0aGUgb2JqZWN0IHdpbGwgb2NjdXB5IDQgYnl0ZXMgKi8KLQkgIGZpeF9uZXdfbnMzMmsgKGZyYWdQLAotCQkJIChpbnQpIChmcmFnUC0+ZnJfZml4KSwKLQkJCSA0LAotCQkJIGZyYWdQLT5mcl9zeW1ib2wsCi0JCQkgZnJhZ1AtPmZyX29mZnNldCwKLQkJCSAxLAotCQkJIDEsCi0JCQkgMCwKLQkJCSBmcmFnX2JzcihmcmFnUCksIC8qc2VxdWVudCBoYWNrICovCi0JCQkgZnJhZ19vcGNvZGVfZnJhZyhmcmFnUCksCi0JCQkgZnJhZ19vcGNvZGVfb2Zmc2V0KGZyYWdQKSk7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDQ7Ci0JICAvKiBmcmFnUC0+ZnJfb3Bjb2RlWzFdPTB4ZmY7ICovCi0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQkgIGJyZWFrOwotCX0KLSAgICBjYXNlIElORCAoQlJBTkNILCBCWVRFKToKLSAgICAgIGZyYWdQLT5mcl92YXIgKz0gMTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9maXg7Ci19Ci0KLWludCBtZF9zaG9ydF9qdW1wX3NpemUgPSAzOwotaW50IG1kX2xvbmdfanVtcF9zaXplID0gNTsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gODsJLyogU2l6ZSBvZiByZWxvY2F0aW9uIHJlY29yZCAqLwotCi12b2lkCi1tZF9jcmVhdGVfc2hvcnRfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIGZyb21fYWRkcjsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4RUEsIDEpOwotICBtZF9udW1iZXJfdG9fZGlzcCAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCAyKTsKLX0KLQotdm9pZAotbWRfY3JlYXRlX2xvbmdfanVtcCAocHRyLCBmcm9tX2FkZHIsIHRvX2FkZHIsIGZyYWcsIHRvX3N5bWJvbCkKLSAgICAgY2hhciAqcHRyOwotICAgICBhZGRyZXNzVCBmcm9tX2FkZHIsIHRvX2FkZHI7Ci0gICAgIGZyYWdTICpmcmFnOwotICAgICBzeW1ib2xTICp0b19zeW1ib2w7Ci17Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0KLSAgb2Zmc2V0ID0gdG9fYWRkciAtIGZyb21fYWRkcjsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsICh2YWx1ZVQpIDB4RUEsIDEpOwotICBtZF9udW1iZXJfdG9fZGlzcCAocHRyICsgMSwgKHZhbHVlVCkgb2Zmc2V0LCA0KTsKLX0KLQwKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJtOiI7Ci1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnbSc6Ci0gICAgICBpZiAoIXN0cmNtcCAoYXJnLCAiMzIwMzIiKSkKLQl7Ci0JICBjcHVyZWcgPSBjcHVyZWdfMDMyOwotCSAgbW11cmVnID0gbW11cmVnXzAzMjsKLQl9Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICIzMjUzMiIpKQotCXsKLQkgIGNwdXJlZyA9IGNwdXJlZ181MzI7Ci0JICBtbXVyZWcgPSBtbXVyZWdfNTMyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIG9wdGlvbiAtbSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotTlMzMksgb3B0aW9uczpcblwKLS1tMzIwMzIgfCAtbTMyNTMyCXNlbGVjdCB2YXJpYW50IG9mIE5TMzJLIGFyY2hpdGVjdHVyZVxuIikpOwotfQotCi0MCi0vKgotICoJCQliaXRfZml4X25ldygpCi0gKgotICogQ3JlYXRlIGEgYml0X2ZpeFMgaW4gb2JzdGFjayAnbm90ZXMnLgotICogVGhpcyBzdHJ1Y3QgaXMgdXNlZCB0byBwcm9maWxlIHRoZSBub3JtYWwgZml4LiBJZiB0aGUgYml0X2ZpeFAgaXMgYQotICogdmFsaWQgcG9pbnRlciAobm90IE5VTEwpIHRoZSBiaXRfZml4IGRhdGEgd2lsbCBiZSB1c2VkIHRvIGZvcm1hdCB0aGUgZml4LgotICovCi1iaXRfZml4UyAqCi1iaXRfZml4X25ldyAoc2l6ZSwgb2Zmc2V0LCBtaW4sIG1heCwgYWRkLCBiYXNlX3R5cGUsIGJhc2VfYWRqKQotICAgICBjaGFyIHNpemU7CQkJLyogTGVuZ3RoIG9mIGJpdGZpZWxkCQkqLwotICAgICBjaGFyIG9mZnNldDsJCS8qIEJpdCBvZmZzZXQgdG8gYml0ZmllbGQJKi8KLSAgICAgbG9uZyBtaW47CQkJLyogU2lnbmV4dGVuZGVkIG1pbiBmb3IgYml0ZmllbGQgKi8KLSAgICAgbG9uZyBtYXg7CQkJLyogU2lnbmV4dGVuZGVkIG1heCBmb3IgYml0ZmllbGQgKi8KLSAgICAgbG9uZyBhZGQ7CQkJLyogQWRkIG1hc2ssIHVzZWQgZm9yIGh1ZmZtYW4gcHJlZml4ICovCi0gICAgIGxvbmcgYmFzZV90eXBlOwkJLyogMCBvciAxLCBpZiAxIGl0J3MgZXhwbG9kZWQgdG8gb3Bjb2RlIHB0ciAqLwotICAgICBsb25nIGJhc2VfYWRqOwotewotICByZWdpc3RlciBiaXRfZml4UyAqYml0X2ZpeFA7Ci0KLSAgYml0X2ZpeFAgPSAoYml0X2ZpeFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKGJpdF9maXhTKSk7Ci0KLSAgYml0X2ZpeFAtPmZ4X2JpdF9zaXplID0gc2l6ZTsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGJpdF9maXhQLT5meF9iaXRfYmFzZSA9IGJhc2VfdHlwZTsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9iYXNlX2FkaiA9IGJhc2VfYWRqOwotICBiaXRfZml4UC0+ZnhfYml0X21heCA9IG1heDsKLSAgYml0X2ZpeFAtPmZ4X2JpdF9taW4gPSBtaW47Ci0gIGJpdF9maXhQLT5meF9iaXRfYWRkID0gYWRkOwotCi0gIHJldHVybiAoYml0X2ZpeFApOwotfQotCi12b2lkCi1maXhfbmV3X25zMzJrIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwKLQkgICAgICAgaW1fZGlzcCwgYml0X2ZpeFAsIGJzciwgb3Bjb2RlX2ZyYWcsIG9wY29kZV9vZmZzZXQpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwkvKiBYX2FkZF9zeW1ib2wuICovCi0gICAgIGxvbmcgb2Zmc2V0OwkJLyogWF9hZGRfbnVtYmVyLiAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotICAgICBjaGFyIGltX2Rpc3A7CQkvKiB0cnVlIGlmIHRoZSB2YWx1ZSB0byB3cml0ZSBpcyBhCi0JCQkJICAgZGlzcGxhY2VtZW50ICovCi0gICAgIGJpdF9maXhTICpiaXRfZml4UDsJLyogcG9pbnRlciBhdCBzdHJ1Y3Qgb2YgYml0X2ZpeCdzLCBpZ25vcmVkIGlmCi0JCQkJICAgTlVMTCAqLwotICAgICBjaGFyIGJzcjsJCQkvKiBzZXF1ZW50LWxpbmtlci1oYWNrOiAxIHdoZW4gcmVsb2NvYmplY3QgaXMKLQkJCQkgICBhIGJzciAqLwotICAgICBmcmFnUyAqb3Bjb2RlX2ZyYWc7Ci0gICAgIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OwotCi17Ci0gIGZpeFMgKmZpeFAgPSBmaXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwKLQkJCW9mZnNldCwgcGNyZWwsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJYml0X2ZpeFA/IE5PX1JFTE9DOiByZWxvYyhzaXplLCBwY3JlbCwgaW1fZGlzcCkKLSNlbHNlCi0JCQlOT19SRUxPQwotI2VuZGlmCi0JCQkpOwotCi0gIGZpeF9vcGNvZGVfZnJhZyhmaXhQKSA9IG9wY29kZV9mcmFnOwotICBmaXhfb3Bjb2RlX29mZnNldChmaXhQKSA9IG9wY29kZV9vZmZzZXQ7Ci0gIGZpeF9pbV9kaXNwKGZpeFApID0gaW1fZGlzcDsKLSAgZml4X2JzcihmaXhQKSA9IGJzcjsKLSAgZml4X2JpdF9maXhQKGZpeFApID0gYml0X2ZpeFA7Ci19CQkJCS8qIGZpeF9uZXdfbnMzMmsoKSAqLwotCi12b2lkCi1maXhfbmV3X25zMzJrX2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsCi0JCSAgIGltX2Rpc3AsIGJpdF9maXhQLCBic3IsIG9wY29kZV9mcmFnLCBvcGNvZGVfb2Zmc2V0KQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIgIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICovCi0gICAgIGludCBwY3JlbDsJCQkvKiBUUlVFIGlmIFBDLXJlbGF0aXZlIHJlbG9jYXRpb24uICovCi0gICAgIGNoYXIgaW1fZGlzcDsJCS8qIHRydWUgaWYgdGhlIHZhbHVlIHRvIHdyaXRlIGlzIGEKLQkJCQkgICBkaXNwbGFjZW1lbnQgKi8KLSAgICAgYml0X2ZpeFMgKmJpdF9maXhQOwkvKiBwb2ludGVyIGF0IHN0cnVjdCBvZiBiaXRfZml4J3MsIGlnbm9yZWQgaWYKLQkJCQkgICBOVUxMICovCi0gICAgIGNoYXIgYnNyOwkJCS8qIHNlcXVlbnQtbGlua2VyLWhhY2s6IDEgd2hlbiByZWxvY29iamVjdCBpcwotCQkJCSAgIGEgYnNyICovCi0gICAgIGZyYWdTICpvcGNvZGVfZnJhZzsKLSAgICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQ7Ci17Ci0gIGZpeFMgKmZpeFAgPSBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgcGNyZWwsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkJICAgIGJpdF9maXhQPyBOT19SRUxPQzogcmVsb2Moc2l6ZSwgcGNyZWwsIGltX2Rpc3ApCi0jZWxzZQotCQkJICAgIE5PX1JFTE9DCi0jZW5kaWYKLQkJCSAgICApOwotCi0gIGZpeF9vcGNvZGVfZnJhZyhmaXhQKSA9IG9wY29kZV9mcmFnOwotICBmaXhfb3Bjb2RlX29mZnNldChmaXhQKSA9IG9wY29kZV9vZmZzZXQ7Ci0gIGZpeF9pbV9kaXNwKGZpeFApID0gaW1fZGlzcDsKLSAgZml4X2JzcihmaXhQKSA9IGJzcjsKLSAgZml4X2JpdF9maXhQKGZpeFApID0gYml0X2ZpeFA7Ci19CQkJCS8qIGZpeF9uZXdfbnMzMmsoKSAqLwotCi0vKiBUaGlzIGlzIFRDX0NPTlNfRklYX05FVywgY2FsbGVkIGJ5IGVtaXRfZXhwciBpbiByZWFkLmMuICAqLwotCi12b2lkCi1jb25zX2ZpeF9uZXdfbnMzMmsgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiAgb3IgNCB1c3VhbGx5LiAqLwotICAgICBleHByZXNzaW9uUyAqZXhwOwkJLyogRXhwcmVzc2lvbi4gKi8KLXsKLSAgZml4X25ld19uczMya19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsCi0JCSAgICAgMCwgMiwgMCwgMCwgMCwgMCk7Ci19Ci0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogUm91bmQgdXAgYSBzZWN0aW9uIHNpemUgdG8gdGhlIGFwcHJvcHJpYXRlIGJvdW5kYXJ5LiAgKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuIHNpemU7CQkJLyogQnl0ZSBhbGlnbm1lbnQgaXMgZmluZSAqLwotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/ICBPbiB0aGUKLSAgIG5zMzJrLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICovCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICBsb25nIHJlczsKLSAgcmVzID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotICBpZiAoZnJhZ19ic3IoZml4UC0+ZnhfZnJhZykpCi0gICAgcmVzICs9IDB4MTIJCQkvKiBGT08gS2x1ZGdlIGFsZXJ0ISAqLwotI2VuZGlmCi0gICAgICByZXR1cm4gcmVzOwotfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIGNvZGU7Ci0KLSAgY29kZSA9IHJlbG9jKGZpeHAtPmZ4X3NpemUsIGZpeHAtPmZ4X3BjcmVsLCBmaXhfaW1fZGlzcChmaXhwKSk7Ci0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIHJlbC0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbC0+c3ltX3B0cl9wdHIgPSBzeW1ib2xfZ2V0X2JmZHN5bSAoZml4cC0+ZnhfYWRkc3kpOwotICByZWwtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICByZWwtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZQotICAgIHJlbC0+YWRkZW5kID0gMDsKLQotICByZWwtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAoIXJlbC0+aG93dG8pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9IF8oIjx1bmtub3duPiIpOwotICAgICAgYXNfZmF0YWwgKF8oIkNhbm5vdCBmaW5kIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVkIiksCi0JCW5hbWUsIChpbnQpIGNvZGUpOwotICAgIH0KLQotICByZXR1cm4gcmVsOwotfQotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgT0JKX0FPVVQKLXZvaWQKLWNvbnNfZml4X25ld19uczMyayAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgc3RydWN0IGZpeCAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIC8qCi0gICAqIEluOiBsZW5ndGggb2YgcmVsb2NhdGlvbiAob3Igb2YgYWRkcmVzcykgaW4gY2hhcnM6IDEsIDIgb3IgNC4KLSAgICogT3V0OiBHTlUgTEQgcmVsb2NhdGlvbiBsZW5ndGggY29kZTogMCwgMSwgb3IgMi4KLSAgICovCi0KLSAgc3RhdGljIHVuc2lnbmVkIGNoYXIgbmJ5dGVzX3JfbGVuZ3RoW10gPSB7NDIsIDAsIDEsIDQyLCAyfTsKLSAgbG9uZyByX3N5bWJvbG51bTsKLQotICBrbm93IChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKTsKLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKHdoZXJlLAotICAgICAgIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZSAtIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlLAotCQkgICAgICA0KTsKLQotICByX3N5bWJvbG51bSA9IChTX0lTX0RFRklORUQgKGZpeFAtPmZ4X2FkZHN5KQotCQkgPyBTX0dFVF9UWVBFIChmaXhQLT5meF9hZGRzeSkKLQkJIDogZml4UC0+ZnhfYWRkc3ktPnN5X251bWJlcik7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSArIDQsCi0JCSAgICAgICgobG9uZykgKHJfc3ltYm9sbnVtKQotCQkgICAgICAgfCAobG9uZykgKGZpeFAtPmZ4X3BjcmVsIDw8IDI0KQotCQkgICAgICAgfCAobG9uZykgKG5ieXRlc19yX2xlbmd0aFtmaXhQLT5meF9zaXplXSA8PCAyNSkKLQkJICAgICAgIHwgKGxvbmcpICgoIVNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpKSA8PCAyNykKLQkJICAgICAgIHwgKGxvbmcpIChmaXhfYnNyKGZpeFApIDw8IDI4KQotCQkgICAgICAgfCAobG9uZykgKGZpeF9pbV9kaXNwKGZpeFApIDw8IDI5KSksCi0JCSAgICAgIDQpOwotfQotCi0jZW5kaWYgLyogT0JKX0FPVVQgKi8KLSNlbmRpZiAvKiBCRkRfQVNTTUVCTEVSICovCi0KLS8qIGVuZCBvZiB0Yy1uczMyay5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLW5zMzJrLmggYi9nYXMvY29uZmlnL3RjLW5zMzJrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Yzg2ZWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1uczMyay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qIHRjLW5zMzJrLmggLS0gT3Bjb2RlIHRhYmxlIGZvciBOYXRpb25hbCBTZW1pIDMyayBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX05TMzJLCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4JMAotCi0jZGVmaW5lIFRDX1BDUkVMX0FESlVTVChGKSBtZF9wY3JlbF9hZGp1c3QoRikKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTk9fUkVMT0MgQkZEX1JFTE9DX05PTkUKLQotI2RlZmluZSBUQVJHRVRfQVJDSAkJYmZkX2FyY2hfbnMzMmsKLQotI2lmbmRlZiBUQVJHRVRfRk9STUFUCQkvKiBNYXliZSBkZWZpbmVkIGluIHRlLSouaCAqLwotI2RlZmluZSBUQVJHRVRfRk9STUFUCQkiYS5vdXQtcGM1MzItbWFjaCIKLSNlbmRpZgotI2Vsc2UKLSNkZWZpbmUgTk9fUkVMT0MgMAotI2VuZGlmCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgImJpdF9maXguaCIKLQotI2RlZmluZSB0Y19hb3V0X3ByZV93cml0ZV9ob29rKHgpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19jcmF3bF9zeW1ib2xfY2hhaW4oYSkJezt9CS8qIG5vdCB1c2VkICovCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIG5vdCB1c2VkICovCi0KLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZGVmaW5lIERFRl9NT0RFTCAyMQotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVDCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVMCi0jZGVmaW5lIERFRl9NT0RFTCAyMAotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0FSR1MgNAotI2RlZmluZSBBUkdfTEVOIDUwCi0KLSNkZWZpbmUgVENfQ09OU19GSVhfTkVXIGNvbnNfZml4X25ld19uczMyawotZXh0ZXJuIHZvaWQgZml4X25ld19uczMya19leHAgUEFSQU1TKChmcmFnUyAqZnJhZywKLQkJCQkgICBpbnQgd2hlcmUsCi0JCQkJICAgaW50IHNpemUsCi0JCQkJICAgZXhwcmVzc2lvblMgKmV4cCwKLQkJCQkgICBpbnQgcGNyZWwsCi0JCQkJICAgaW50IGltX2Rpc3AsCi0JCQkJICAgYml0X2ZpeFMgKmJpdF9maXhQLAkvKiByZWFsbHkgYml0X2ZpeFMgKi8KLQkJCQkgICBpbnQgYnNyLAotCQkJCSAgIGZyYWdTICpvcGNvZGVfZnJhZywKLQkJCQkgICB1bnNpZ25lZCBpbnQgb3Bjb2RlX29mZnNldCkpOwotCi0KLWV4dGVybiB2b2lkIGZpeF9uZXdfbnMzMmsgUEFSQU1TICgoZnJhZ1MgKmZyYWcsCi0JCQkJICAgaW50IHdoZXJlLAotCQkJCSAgIGludCBzaXplLAotCQkJCSAgIHN5bWJvbFMgKmFkZF9zeW1ib2wsCi0JCQkJICAgbG9uZyBvZmZzZXQsCi0JCQkJICAgaW50IHBjcmVsLAotCQkJCSAgIGludCBpbV9kaXNwLAotCQkJCSAgIGJpdF9maXhTICpiaXRfZml4UCwJLyogcmVhbGx5IGJpdF9maXhTICovCi0JCQkJICAgaW50IGJzciwKLQkJCQkgICBmcmFnUyAqb3Bjb2RlX2ZyYWcsCi0JCQkJICAgdW5zaWduZWQgaW50IG9wY29kZV9vZmZzZXQpKTsKLQotZXh0ZXJuIHZvaWQgY29uc19maXhfbmV3X25zMzJrIFBBUkFNUyAoKGZyYWdTICpmcmFnLAotCQkJCQlpbnQgd2hlcmUsCi0JCQkJCWludCBzaXplLAotCQkJCQlleHByZXNzaW9uUyAqZXhwKSk7Ci0KLS8qIHRoZSBOUzMyeDMyIGhhcyBhIG5vbiAwIG5vcCBpbnN0cnVjdGlvbiB3aGljaCBzaG91bGQgYmUgdXNlZCBpbiBhbGlnbnMgKi8KLSNkZWZpbmUgTk9QX09QQ09ERSAweGEyCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0jZGVmaW5lIFRDX0ZSQUdfVFlQRQkJCQlcCi1zdHJ1Y3QgewkJCQkJXAotICBmcmFnUyAqZnJfb3Bjb2RlX2ZyYWdQOwkJCVwKLSAgdW5zaWduZWQgaW50IGZyX29wY29kZV9vZmZzZXQ7CQlcCi0gIGNoYXIgZnJfYnNyOwkJCQkJXAotfQotCi0jZGVmaW5lIFRDX0ZSQUdfSU5JVChYKQkJCQlcCi0gIGRvCQkJCQkJXAotICAgICB7CQkJCQkJXAotICAgICAgIGZyYWdfb3Bjb2RlX2ZyYWcgKFgpID0gTlVMTDsJCVwKLSAgICAgICBmcmFnX29wY29kZV9vZmZzZXQgKFgpID0gMDsJCVwKLSAgICAgICBmcmFnX2JzciAoWCkgPSAwOwkJCQlcCi0gICAgIH0JCQkJCQlcCi0gIHdoaWxlKDApCi0KLS8qIEFjY2Vzc29yIG1hY3JvcyBmb3IgdGhpbmdzIHdoaWNoIG1heSBtb3ZlIGFyb3VuZCAqLwotI2RlZmluZSBmcmFnX29wY29kZV9mcmFnKFgpICAgKFgpLT50Y19mcmFnX2RhdGEuZnJfb3Bjb2RlX2ZyYWdQCi0jZGVmaW5lIGZyYWdfb3Bjb2RlX29mZnNldChYKSAoWCktPnRjX2ZyYWdfZGF0YS5mcl9vcGNvZGVfb2Zmc2V0Ci0jZGVmaW5lIGZyYWdfYnNyKFgpICAgICAgICAgICAoWCktPnRjX2ZyYWdfZGF0YS5mcl9ic3IKLQotI2RlZmluZSBUQ19GSVhfVFlQRQkJCQlcCi1zdHJ1Y3QJCQkJCQlcCi17CQkJCQkJXAotICBmcmFnUyAqb3Bjb2RlX2ZyYWdQOwkJCQlcCi0gIHVuc2lnbmVkIGludCBvcGNvZGVfb2Zmc2V0OwkJCVwKLSAgdW5zaWduZWQgaW50IGJzciA6IDE7CQkJCVwKLX0KLQotLyogQWNjZXNzb3IgbWFjcm9zIGZvciB0aGluZ3Mgd2hpY2ggbWF5IG1vdmUgYXJvdW5kLgotICAgU2VlIGNvbW1lbnRzIGluIHdyaXRlLmguICAqLwotI2RlZmluZSBmaXhfaW1fZGlzcChYKSAgICAgICAoWCktPmZ4X2ltX2Rpc3AKLSNkZWZpbmUgZml4X2JpdF9maXhQKFgpICAgICAgKFgpLT5meF9iaXRfZml4UAotI2RlZmluZSBmaXhfb3Bjb2RlX2ZyYWcoWCkgICAoWCktPnRjX2ZpeF9kYXRhLm9wY29kZV9mcmFnUAotI2RlZmluZSBmaXhfb3Bjb2RlX29mZnNldChYKSAoWCktPnRjX2ZpeF9kYXRhLm9wY29kZV9vZmZzZXQKLSNkZWZpbmUgZml4X2JzcihYKSAgICAgICAgICAgKFgpLT50Y19maXhfZGF0YS5ic3IKLQotI2RlZmluZSBUQ19JTklUX0ZJWF9EQVRBKFgpCQkJXAotICBkbwkJCQkJCVwKLSAgICAgewkJCQkJCVwKLSAgICAgICBmaXhfb3Bjb2RlX2ZyYWcoWCkgPSBOVUxMOwkJXAotICAgICAgIGZpeF9vcGNvZGVfb2Zmc2V0KFgpID0gMDsJCVwKLSAgICAgICBmaXhfYnNyKFgpID0gMDsJCQkJXAotICAgICB9CQkJCQkJXAotICB3aGlsZSgwKQotCi0jZGVmaW5lIFRDX0ZJWF9EQVRBX1BSSU5UKEZJTEUsIEZJWFApCQkJCQlcCi0gIGRvCQkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICBmcHJpbnRmKChGSUxFKSwgIm9wY29kZV9mcmFnPSVsZCwgb3BlcmFuZCBvZmZzZXQ9JWQsIGJzcj0lZFxuIiwJXAotCSAgICAgICh1bnNpZ25lZCBsb25nKSBmaXhfb3Bjb2RlX2ZyYWcgKEZJWFApLAkJCVwKLQkgICAgICBmaXhfb3Bjb2RlX29mZnNldCAoRklYUCksCQkJCQlcCi0JICAgICAgZml4X2JzciAoRklYUCkpOwkJCQkJCVwKLSAgICB9CQkJCQkJCQkJXAotICB3aGlsZSgwKQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy1wcGMuYyBiL2dhcy9jb25maWcvdGMtcHBjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YzJhNDguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1wcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMjUgKzAsMCBAQAotLyogdGMtcHBjLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBQb3dlclBDIG9yIFBPV0VSIChSUy82MDAwKQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9wcGMuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvcHBjLmgiCi0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi0jaW5jbHVkZSAiY29mZi9wZS5oIgotI2VuZGlmCi0KLS8qIFRoaXMgaXMgdGhlIGFzc2VtYmxlciBmb3IgdGhlIFBvd2VyUEMgb3IgUE9XRVIgKFJTLzYwMDApIGNoaXBzLiAgKi8KLQotLyogVGVsbCB0aGUgbWFpbiBjb2RlIHdoYXQgdGhlIGVuZGlhbm5lc3MgaXMuICAqLwotZXh0ZXJuIGludCB0YXJnZXRfYmlnX2VuZGlhbjsKLQotLyogV2hldGhlciBvciBub3QsIHdlJ3ZlIHNldCB0YXJnZXRfYmlnX2VuZGlhbi4gICovCi1zdGF0aWMgaW50IHNldF90YXJnZXRfZW5kaWFuID0gMDsKLQotLyogV2hldGhlciB0byB1c2UgdXNlciBmcmllbmRseSByZWdpc3RlciBuYW1lcy4gICovCi0jaWZuZGVmIFRBUkdFVF9SRUdfTkFNRVNfUAotI2lmZGVmIFRFX1BFCi0jZGVmaW5lIFRBUkdFVF9SRUdfTkFNRVNfUCB0cnVlCi0jZWxzZQotI2RlZmluZSBUQVJHRVRfUkVHX05BTUVTX1AgZmFsc2UKLSNlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyBib29sZWFuIHJlZ19uYW1lc19wID0gVEFSR0VUX1JFR19OQU1FU19QOwotCi1zdGF0aWMgYm9vbGVhbiByZWdpc3Rlcl9uYW1lIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIHBwY19zZXRfY3B1IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHBwY19pbnNlcnRfb3BlcmFuZAotICBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc24sIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQsCi0JICAgb2Zmc2V0VCB2YWwsIGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lKSk7Ci1zdGF0aWMgdm9pZCBwcGNfbWFjcm8gUEFSQU1TICgoY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm8pKTsKLXN0YXRpYyB2b2lkIHBwY19ieXRlIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGludCBwcGNfaXNfdG9jX3N5bSBQQVJBTVMgKChzeW1ib2xTICpzeW0pKTsKLXN0YXRpYyB2b2lkIHBwY190YyBQQVJBTVMgKChpbnQpKTsKLQotI2lmZGVmIE9CSl9YQ09GRgotc3RhdGljIHZvaWQgcHBjX2NvbW0gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmIgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmYgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfYmllaSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19icyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lYiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lZiBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lcyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19jc2VjdCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19jaGFuZ2VfY3NlY3QgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1zdGF0aWMgdm9pZCBwcGNfZnVuY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZXh0ZXJuIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2xnbG9ibCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19zZWN0aW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX25hbWVkX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfc3RhYnggUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcmVuYW1lIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3RvYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY194Y29mZl9jb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3ZieXRlIFBBUkFNUyAoKGludCkpOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHBwY19lbGZfc3VmZml4IFBBUkFNUyAoKGNoYXIgKiosIGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfY29ucyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19lbGZfcmRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfZWxmX2xjb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX2VsZl92YWxpZGF0ZV9maXggUEFSQU1TICgoZml4UyAqLCBzZWdUKSk7Ci0jZW5kaWYKLQotI2lmZGVmIFRFX1BFCi1zdGF0aWMgdm9pZCBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbiBQQVJBTVMgKChzZWdUKSk7Ci1zdGF0aWMgdm9pZCBwcGNfcHJldmlvdXMgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfeWRhdGEgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcmVsZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19yZGF0YSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY191YWxvbmcgUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfem5vcCBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHBwY19wZV9jb21tIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgcHBjX3BlX3NlY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfZnVuY3Rpb24gUEFSQU1TICgoaW50KSk7Ci1zdGF0aWMgdm9pZCBwcGNfcGVfdG9jZCBQQVJBTVMgKChpbnQpKTsKLSNlbmRpZgotDAotLyogR2VuZXJpYyBhc3NlbWJsZXIgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBtdXN0IGJlIGRlZmluZWQgYnkgYWxsCi0gICB0YXJnZXRzLiAgKi8KLQotI2lmZGVmIE9CSl9FTEYKLS8qIFRoaXMgc3RyaW5nIGhvbGRzIHRoZSBjaGFycyB0aGF0IGFsd2F5cyBzdGFydCBhIGNvbW1lbnQuICBJZiB0aGUKLSAgIHByZS1wcm9jZXNzb3IgaXMgZGlzYWJsZWQsIHRoZXNlIGFyZW4ndCB2ZXJ5IHVzZWZ1bC4gIFRoZSBtYWNybwotICAgdGNfY29tbWVudF9jaGFycyBwb2ludHMgdG8gdGhpcy4gIFdlIHVzZSB0aGlzLCByYXRoZXIgdGhhbiB0aGUKLSAgIHVzdWFsIGNvbW1lbnRfY2hhcnMsIHNvIHRoYXQgd2UgY2FuIHN3aXRjaCBmb3IgU29sYXJpcyBjb252ZW50aW9ucy4gICovCi1zdGF0aWMgY29uc3QgY2hhciBwcGNfc29sYXJpc19jb21tZW50X2NoYXJzW10gPSAiIyEiOwotc3RhdGljIGNvbnN0IGNoYXIgcHBjX2VhYmlfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0jaWZkZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotY29uc3QgY2hhciAqcHBjX2NvbW1lbnRfY2hhcnMgPSBwcGNfc29sYXJpc19jb21tZW50X2NoYXJzOwotI2Vsc2UKLWNvbnN0IGNoYXIgKnBwY19jb21tZW50X2NoYXJzID0gcHBjX2VhYmlfY29tbWVudF9jaGFyczsKLSNlbmRpZgotI2Vsc2UKLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotI2VuZGlmCi0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggbWF5IGJlIHVzZWQgdG8gc2VwYXJhdGUgbXVsdGlwbGUgY29tbWFuZHMgb24gYQotICAgc2luZ2xlIGxpbmUuICAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIGFyZSB1c2VkIHRvIGluZGljYXRlIGFuIGV4cG9uZW50IGluIGEgZmxvYXRpbmcKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwKLSAgIGFzIGluIDBkMS4wLiAgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZEQiOwotDAotLyogVGhlIHRhcmdldCBzcGVjaWZpYyBwc2V1ZG8tb3BzIHdoaWNoIHdlIHN1cHBvcnQuICAqLwotCi1jb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW10gPQotewotICAvKiBQc2V1ZG8tb3BzIHdoaWNoIG11c3QgYmUgb3ZlcnJpZGRlbi4gICovCi0gIHsgImJ5dGUiLAlwcGNfYnl0ZSwJMCB9LAotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gIC8qIFBzZXVkby1vcHMgc3BlY2lmaWMgdG8gdGhlIFJTLzYwMDAgWENPRkYgZm9ybWF0LiAgU29tZSBvZiB0aGVzZQotICAgICBsZWdpdGltYXRlbHkgYmVsb25nIGluIHRoZSBvYmotKi5jIGZpbGUuICBIb3dldmVyLCBYQ09GRiBpcyBiYXNlZAotICAgICBvbiBDT0ZGLCBhbmQgaXMgb25seSBpbXBsZW1lbnRlZCBmb3IgdGhlIFJTLzYwMDAuICBXZSBqdXN0IHVzZQotICAgICBvYmotY29mZi5jLCBhbmQgYWRkIHdoYXQgd2UgbmVlZCBoZXJlLiAgKi8KLSAgeyAiY29tbSIsCXBwY19jb21tLAkwIH0sCi0gIHsgImxjb21tIiwJcHBjX2NvbW0sCTEgfSwKLSAgeyAiYmIiLAlwcGNfYmIsCQkwIH0sCi0gIHsgImJjIiwJcHBjX2JjLAkJMCB9LAotICB7ICJiZiIsCXBwY19iZiwJCTAgfSwKLSAgeyAiYmkiLAlwcGNfYmllaSwJMCB9LAotICB7ICJicyIsCXBwY19icywJCTAgfSwKLSAgeyAiY3NlY3QiLAlwcGNfY3NlY3QsCTAgfSwKLSAgeyAiZGF0YSIsCXBwY19zZWN0aW9uLAknZCcgfSwKLSAgeyAiZWIiLAlwcGNfZWIsCQkwIH0sCi0gIHsgImVjIiwJcHBjX2VjLAkJMCB9LAotICB7ICJlZiIsCXBwY19lZiwJCTAgfSwKLSAgeyAiZWkiLAlwcGNfYmllaSwJMSB9LAotICB7ICJlcyIsCXBwY19lcywJCTAgfSwKLSAgeyAiZXh0ZXJuIiwJcHBjX2V4dGVybiwJMCB9LAotICB7ICJmdW5jdGlvbiIsCXBwY19mdW5jdGlvbiwJMCB9LAotICB7ICJsZ2xvYmwiLAlwcGNfbGdsb2JsLAkwIH0sCi0gIHsgInJlbmFtZSIsCXBwY19yZW5hbWUsCTAgfSwKLSAgeyAic2VjdGlvbiIsCXBwY19uYW1lZF9zZWN0aW9uLCAwIH0sCi0gIHsgInN0YWJ4IiwJcHBjX3N0YWJ4LAkwIH0sCi0gIHsgInRleHQiLAlwcGNfc2VjdGlvbiwJJ3QnIH0sCi0gIHsgInRvYyIsCXBwY190b2MsCTAgfSwKLSAgeyAibG9uZyIsCXBwY194Y29mZl9jb25zLAkyIH0sCi0gIHsgIndvcmQiLAlwcGNfeGNvZmZfY29ucywJMSB9LAotICB7ICJzaG9ydCIsCXBwY194Y29mZl9jb25zLAkxIH0sCi0gIHsgInZieXRlIiwgICAgcHBjX3ZieXRlLAkwIH0sCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSAgeyAibG9uZyIsCXBwY19lbGZfY29ucywJNCB9LAotICB7ICJ3b3JkIiwJcHBjX2VsZl9jb25zLAkyIH0sCi0gIHsgInNob3J0IiwJcHBjX2VsZl9jb25zLAkyIH0sCi0gIHsgInJkYXRhIiwJcHBjX2VsZl9yZGF0YSwJMCB9LAotICB7ICJyb2RhdGEiLAlwcGNfZWxmX3JkYXRhLAkwIH0sCi0gIHsgImxjb21tIiwJcHBjX2VsZl9sY29tbSwJMCB9LAotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotICAvKiBQc2V1ZG8tb3BzIHNwZWNpZmljIHRvIHRoZSBXaW5kb3dzIE5UIFBvd2VyUEMgUEUgKGNvZmYpIGZvcm1hdCAqLwotICB7ICJwcmV2aW91cyIsIHBwY19wcmV2aW91cywgICAwIH0sCi0gIHsgInBkYXRhIiwgICAgcHBjX3BkYXRhLCAgICAgIDAgfSwKLSAgeyAieWRhdGEiLCAgICBwcGNfeWRhdGEsICAgICAgMCB9LAotICB7ICJyZWxkYXRhIiwgIHBwY19yZWxkYXRhLCAgICAwIH0sCi0gIHsgInJkYXRhIiwgICAgcHBjX3JkYXRhLCAgICAgIDAgfSwKLSAgeyAidWFsb25nIiwgICBwcGNfdWFsb25nLCAgICAgMCB9LAotICB7ICJ6bm9wIiwgICAgIHBwY196bm9wLCAgICAgICAwIH0sCi0gIHsgImNvbW0iLAlwcGNfcGVfY29tbSwJMCB9LAotICB7ICJsY29tbSIsCXBwY19wZV9jb21tLAkxIH0sCi0gIHsgInNlY3Rpb24iLCAgcHBjX3BlX3NlY3Rpb24sIDAgfSwKLSAgeyAiZnVuY3Rpb24iLAlwcGNfcGVfZnVuY3Rpb24sMCB9LAotICB7ICJ0b2NkIiwgICAgIHBwY19wZV90b2NkLCAgICAwIH0sCi0jZW5kaWYKLQotICAvKiBUaGlzIHBzZXVkby1vcCBpcyB1c2VkIGV2ZW4gd2hlbiBub3QgZ2VuZXJhdGluZyBYQ09GRiBvdXRwdXQuICAqLwotICB7ICJ0YyIsCXBwY190YywJCTAgfSwKLQotICB7IE5VTEwsCU5VTEwsCQkwIH0KLX07Ci0KLQwKLS8qIFByZWRlZmluZWQgcmVnaXN0ZXIgbmFtZXMgaWYgLW1yZWduYW1lcyAob3IgZGVmYXVsdCBmb3IgV2luZG93cyBOVCkuICAqLwotLyogSW4gZ2VuZXJhbCwgdGhlcmUgYXJlIGxvdHMgb2YgdGhlbSwgaW4gYW4gYXR0ZW1wdCB0byBiZSBjb21wYXRpYmxlICovCi0vKiB3aXRoIGEgbnVtYmVyIG9mIG90aGVyIFdpbmRvd3MgTlQgYXNzZW1ibGVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHBkX3JlZwotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgdmFsdWU7Ci0gIH07Ci0KLS8qIExpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHByZS1kZWZpbmVkOgotCi0gICBFYWNoIGdlbmVyYWwgcmVnaXN0ZXIgaGFzIHByZWRlZmluZWQgbmFtZXMgb2YgdGhlIGZvcm06Ci0gICAxLiByPHJlZ19udW0+IHdoaWNoIGhhcyB0aGUgdmFsdWUgPHJlZ19udW0+LgotICAgMi4gci48cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0KLQotICAgRWFjaCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBoYXMgcHJlZGVmaW5lZCBuYW1lcyBvZiB0aGUgZm9ybToKLSAgIDEuIGY8cmVnX251bT4gd2hpY2ggaGFzIHRoZSB2YWx1ZSA8cmVnX251bT4uCi0gICAyLiBmLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLQotICAgRWFjaCBjb25kaXRpb24gcmVnaXN0ZXIgaGFzIHByZWRlZmluZWQgbmFtZXMgb2YgdGhlIGZvcm06Ci0gICAxLiBjcjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLSAgIDIuIGNyLjxyZWdfbnVtPiB3aGljaCBoYXMgdGhlIHZhbHVlIDxyZWdfbnVtPi4KLQotICAgVGhlcmUgYXJlIGluZGl2aWR1YWwgcmVnaXN0ZXJzIGFzIHdlbGw6Ci0gICBzcCBvciByLnNwICAgICBoYXMgdGhlIHZhbHVlIDEKLSAgIHJ0b2Mgb3Igci50b2MgIGhhcyB0aGUgdmFsdWUgMgotICAgZnBzY3IgICAgICAgICAgaGFzIHRoZSB2YWx1ZSAwCi0gICB4ZXIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDEKLSAgIGxyICAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgOAotICAgY3RyICAgICAgICAgICAgaGFzIHRoZSB2YWx1ZSA5Ci0gICBwbXIgICAgICAgICAgICBoYXMgdGhlIHZhbHVlIDAKLSAgIGRhciAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMTkKLSAgIGRzaXNyICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMTgKLSAgIGRlYyAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjIKLSAgIHNkcjEgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjUKLSAgIHNycjAgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjYKLSAgIHNycjEgICAgICAgICAgIGhhcyB0aGUgdmFsdWUgMjcKLQotICAgVGhlIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiY3IuMCIsIDAgfSwgICAgLyogQ29uZGl0aW9uIFJlZ2lzdGVycyAqLwotICB7ICJjci4xIiwgMSB9LAotICB7ICJjci4yIiwgMiB9LAotICB7ICJjci4zIiwgMyB9LAotICB7ICJjci40IiwgNCB9LAotICB7ICJjci41IiwgNSB9LAotICB7ICJjci42IiwgNiB9LAotICB7ICJjci43IiwgNyB9LAotCi0gIHsgImNyMCIsIDAgfSwKLSAgeyAiY3IxIiwgMSB9LAotICB7ICJjcjIiLCAyIH0sCi0gIHsgImNyMyIsIDMgfSwKLSAgeyAiY3I0IiwgNCB9LAotICB7ICJjcjUiLCA1IH0sCi0gIHsgImNyNiIsIDYgfSwKLSAgeyAiY3I3IiwgNyB9LAotCi0gIHsgImN0ciIsIDkgfSwKLQotICB7ICJkYXIiLCAxOSB9LCAgICAvKiBEYXRhIEFjY2VzcyBSZWdpc3RlciAqLwotICB7ICJkZWMiLCAyMiB9LCAgICAvKiBEZWNyZW1lbnRlciAqLwotICB7ICJkc2lzciIsIDE4IH0sICAvKiBEYXRhIFN0b3JhZ2UgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotCi0gIHsgImYuMCIsIDAgfSwgICAgIC8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLwotICB7ICJmLjEiLCAxIH0sIAotICB7ICJmLjEwIiwgMTAgfSwgCi0gIHsgImYuMTEiLCAxMSB9LCAKLSAgeyAiZi4xMiIsIDEyIH0sIAotICB7ICJmLjEzIiwgMTMgfSwgCi0gIHsgImYuMTQiLCAxNCB9LCAKLSAgeyAiZi4xNSIsIDE1IH0sIAotICB7ICJmLjE2IiwgMTYgfSwgCi0gIHsgImYuMTciLCAxNyB9LCAKLSAgeyAiZi4xOCIsIDE4IH0sIAotICB7ICJmLjE5IiwgMTkgfSwgCi0gIHsgImYuMiIsIDIgfSwgCi0gIHsgImYuMjAiLCAyMCB9LCAKLSAgeyAiZi4yMSIsIDIxIH0sIAotICB7ICJmLjIyIiwgMjIgfSwgCi0gIHsgImYuMjMiLCAyMyB9LCAKLSAgeyAiZi4yNCIsIDI0IH0sIAotICB7ICJmLjI1IiwgMjUgfSwgCi0gIHsgImYuMjYiLCAyNiB9LCAKLSAgeyAiZi4yNyIsIDI3IH0sIAotICB7ICJmLjI4IiwgMjggfSwgCi0gIHsgImYuMjkiLCAyOSB9LCAKLSAgeyAiZi4zIiwgMyB9LCAKLSAgeyAiZi4zMCIsIDMwIH0sCi0gIHsgImYuMzEiLCAzMSB9LAotICB7ICJmLjQiLCA0IH0sIAotICB7ICJmLjUiLCA1IH0sIAotICB7ICJmLjYiLCA2IH0sIAotICB7ICJmLjciLCA3IH0sIAotICB7ICJmLjgiLCA4IH0sIAotICB7ICJmLjkiLCA5IH0sIAotCi0gIHsgImYwIiwgMCB9LCAKLSAgeyAiZjEiLCAxIH0sIAotICB7ICJmMTAiLCAxMCB9LCAKLSAgeyAiZjExIiwgMTEgfSwgCi0gIHsgImYxMiIsIDEyIH0sIAotICB7ICJmMTMiLCAxMyB9LCAKLSAgeyAiZjE0IiwgMTQgfSwgCi0gIHsgImYxNSIsIDE1IH0sIAotICB7ICJmMTYiLCAxNiB9LCAKLSAgeyAiZjE3IiwgMTcgfSwgCi0gIHsgImYxOCIsIDE4IH0sIAotICB7ICJmMTkiLCAxOSB9LCAKLSAgeyAiZjIiLCAyIH0sIAotICB7ICJmMjAiLCAyMCB9LCAKLSAgeyAiZjIxIiwgMjEgfSwgCi0gIHsgImYyMiIsIDIyIH0sIAotICB7ICJmMjMiLCAyMyB9LCAKLSAgeyAiZjI0IiwgMjQgfSwgCi0gIHsgImYyNSIsIDI1IH0sIAotICB7ICJmMjYiLCAyNiB9LCAKLSAgeyAiZjI3IiwgMjcgfSwgCi0gIHsgImYyOCIsIDI4IH0sIAotICB7ICJmMjkiLCAyOSB9LCAKLSAgeyAiZjMiLCAzIH0sIAotICB7ICJmMzAiLCAzMCB9LAotICB7ICJmMzEiLCAzMSB9LAotICB7ICJmNCIsIDQgfSwgCi0gIHsgImY1IiwgNSB9LCAKLSAgeyAiZjYiLCA2IH0sIAotICB7ICJmNyIsIDcgfSwgCi0gIHsgImY4IiwgOCB9LCAKLSAgeyAiZjkiLCA5IH0sIAotCi0gIHsgImZwc2NyIiwgMCB9LAotCi0gIHsgImxyIiwgOCB9LCAgICAgLyogTGluayBSZWdpc3RlciAqLwotCi0gIHsgInBtciIsIDAgfSwKLQotICB7ICJyLjAiLCAwIH0sICAgIC8qIEdlbmVyYWwgUHVycG9zZSBSZWdpc3RlcnMgKi8KLSAgeyAici4xIiwgMSB9LAotICB7ICJyLjEwIiwgMTAgfSwKLSAgeyAici4xMSIsIDExIH0sCi0gIHsgInIuMTIiLCAxMiB9LAotICB7ICJyLjEzIiwgMTMgfSwKLSAgeyAici4xNCIsIDE0IH0sCi0gIHsgInIuMTUiLCAxNSB9LAotICB7ICJyLjE2IiwgMTYgfSwKLSAgeyAici4xNyIsIDE3IH0sCi0gIHsgInIuMTgiLCAxOCB9LAotICB7ICJyLjE5IiwgMTkgfSwKLSAgeyAici4yIiwgMiB9LAotICB7ICJyLjIwIiwgMjAgfSwKLSAgeyAici4yMSIsIDIxIH0sCi0gIHsgInIuMjIiLCAyMiB9LAotICB7ICJyLjIzIiwgMjMgfSwKLSAgeyAici4yNCIsIDI0IH0sCi0gIHsgInIuMjUiLCAyNSB9LAotICB7ICJyLjI2IiwgMjYgfSwKLSAgeyAici4yNyIsIDI3IH0sCi0gIHsgInIuMjgiLCAyOCB9LAotICB7ICJyLjI5IiwgMjkgfSwKLSAgeyAici4zIiwgMyB9LAotICB7ICJyLjMwIiwgMzAgfSwKLSAgeyAici4zMSIsIDMxIH0sCi0gIHsgInIuNCIsIDQgfSwKLSAgeyAici41IiwgNSB9LAotICB7ICJyLjYiLCA2IH0sCi0gIHsgInIuNyIsIDcgfSwKLSAgeyAici44IiwgOCB9LAotICB7ICJyLjkiLCA5IH0sCi0KLSAgeyAici5zcCIsIDEgfSwgICAvKiBTdGFjayBQb2ludGVyICovCi0KLSAgeyAici50b2MiLCAyIH0sICAvKiBQb2ludGVyIHRvIHRoZSB0YWJsZSBvZiBjb250ZW50cyAqLwotCi0gIHsgInIwIiwgMCB9LCAgICAgLyogTW9yZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCi0gIHsgInIxIiwgMSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJyMTYiLCAxNiB9LAotICB7ICJyMTciLCAxNyB9LAotICB7ICJyMTgiLCAxOCB9LAotICB7ICJyMTkiLCAxOSB9LAotICB7ICJyMiIsIDIgfSwKLSAgeyAicjIwIiwgMjAgfSwKLSAgeyAicjIxIiwgMjEgfSwKLSAgeyAicjIyIiwgMjIgfSwKLSAgeyAicjIzIiwgMjMgfSwKLSAgeyAicjI0IiwgMjQgfSwKLSAgeyAicjI1IiwgMjUgfSwKLSAgeyAicjI2IiwgMjYgfSwKLSAgeyAicjI3IiwgMjcgfSwKLSAgeyAicjI4IiwgMjggfSwKLSAgeyAicjI5IiwgMjkgfSwKLSAgeyAicjMiLCAzIH0sCi0gIHsgInIzMCIsIDMwIH0sCi0gIHsgInIzMSIsIDMxIH0sCi0gIHsgInI0IiwgNCB9LAotICB7ICJyNSIsIDUgfSwKLSAgeyAicjYiLCA2IH0sCi0gIHsgInI3IiwgNyB9LAotICB7ICJyOCIsIDggfSwKLSAgeyAicjkiLCA5IH0sCi0KLSAgeyAicnRvYyIsIDIgfSwgIC8qIFRhYmxlIG9mIGNvbnRlbnRzICovCi0KLSAgeyAic2RyMSIsIDI1IH0sIC8qIFN0b3JhZ2UgRGVzY3JpcHRpb24gUmVnaXN0ZXIgMSAqLwotCi0gIHsgInNwIiwgMSB9LAotCi0gIHsgInNycjAiLCAyNiB9LCAvKiBNYWNoaW5lIFN0YXR1cyBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMCAqLwotICB7ICJzcnIxIiwgMjcgfSwgLyogTWFjaGluZSBTdGF0dXMgU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDEgKi8KLQotICB7ICJ4ZXIiLCAxIH0sCi0KLX07Ci0KLSNkZWZpbmUgUkVHX05BTUVfQ05UCShzaXplb2YocHJlX2RlZmluZWRfcmVnaXN0ZXJzKSAvIHNpemVvZihzdHJ1Y3QgcGRfcmVnKSkKLQotLyogR2l2ZW4gTkFNRSwgZmluZCB0aGUgcmVnaXN0ZXIgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGF0IG5hbWUsIHJldHVybgotICAgdGhlIGludGVnZXIgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lIG9yIC0xIG9uIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgaW50IHJlZ19uYW1lX3NlYXJjaAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgcGRfcmVnICosIGludCwgY29uc3QgY2hhciAqIG5hbWUpKTsKLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSkKLSAgICAgY29uc3Qgc3RydWN0IHBkX3JlZyAqcmVnczsKLSAgICAgaW50IHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgbWlkZGxlLCBsb3csIGhpZ2g7Ci0gIGludCBjbXA7Ci0KLSAgbG93ID0gMDsKLSAgaGlnaCA9IHJlZ2NvdW50IC0gMTsKLQotICBkbwotICAgIHsKLSAgICAgIG1pZGRsZSA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgICBjbXAgPSBzdHJjYXNlY21wIChuYW1lLCByZWdzW21pZGRsZV0ubmFtZSk7Ci0gICAgICBpZiAoY21wIDwgMCkKLQloaWdoID0gbWlkZGxlIC0gMTsKLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0JbG93ID0gbWlkZGxlICsgMTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gcmVnc1ttaWRkbGVdLnZhbHVlOwotICAgIH0KLSAgd2hpbGUgKGxvdyA8PSBoaWdoKTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBTdW1tYXJ5IG9mIHJlZ2lzdGVyX25hbWUoKS4KLSAqCi0gKiBpbjoJSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICoKLSAqIG91dDoJQSBleHByZXNzaW9uUy4KLSAqICAgICAgVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBhIHJlZ2lzdGVyOiBpbiB0aGlzIGNhc2UsIFhfb3AgPT0gT19yZWdpc3RlciwKLSAqICAgICAgWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbiBpdHMKLSAqICAgICAgb3JpZ2luYWwgc3RhdGUuCi0gKi8KLQotc3RhdGljIGJvb2xlYW4KLXJlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGludCByZWdfbnVtYmVyOwotICBjaGFyICpuYW1lOwotICBjaGFyICpzdGFydDsKLSAgY2hhciBjOwotCi0gIC8qIEZpbmQgdGhlIHNwZWxsaW5nIG9mIHRoZSBvcGVyYW5kICovCi0gIHN0YXJ0ID0gbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKG5hbWVbMF0gPT0gJyUnICYmIGlzYWxwaGEgKG5hbWVbMV0pKQotICAgIG5hbWUgPSArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBlbHNlIGlmICghcmVnX25hbWVzX3AgfHwgIWlzYWxwaGEgKG5hbWVbMF0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHByZV9kZWZpbmVkX3JlZ2lzdGVycywgUkVHX05BTUVfQ05ULCBuYW1lKTsKLQotICAvKiBsb29rIHRvIHNlZSBpZiBpdCdzIGluIHRoZSByZWdpc3RlciB0YWJsZSAqLwotICBpZiAocmVnX251bWJlciA+PSAwKSAKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fcmVnaXN0ZXI7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLSAgICAgIAotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOyAgIC8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OyAvKiByZXNldCBpbnB1dF9saW5lIHBvaW50ZXIgKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBzeW1ib2wgc2VlbiBpbiBhbiBleHByZXNzaW9uLiAgSXQKLSAgIGhhbmRsZXMgdGhlIHNwZWNpYWwgcGFyc2luZyB3aGljaCBQb3dlclBDIGFzc2VtYmxlcnMgYXJlIHN1cHBvc2VkCi0gICB0byB1c2UgZm9yIGNvbmRpdGlvbiBjb2Rlcy4gICovCi0KLS8qIFdoZXRoZXIgdG8gZG8gdGhlIHNwZWNpYWwgcGFyc2luZy4gICovCi1zdGF0aWMgYm9vbGVhbiBjcl9vcGVyYW5kOwotCi0vKiBOYW1lcyB0byByZWNvZ25pemUgaW4gYSBjb25kaXRpb24gY29kZS4gIFRoaXMgdGFibGUgaXMgc29ydGVkLiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGRfcmVnIGNyX25hbWVzW10gPQotewotICB7ICJjcjAiLCAwIH0sCi0gIHsgImNyMSIsIDEgfSwKLSAgeyAiY3IyIiwgMiB9LAotICB7ICJjcjMiLCAzIH0sCi0gIHsgImNyNCIsIDQgfSwKLSAgeyAiY3I1IiwgNSB9LAotICB7ICJjcjYiLCA2IH0sCi0gIHsgImNyNyIsIDcgfSwKLSAgeyAiZXEiLCAyIH0sCi0gIHsgImd0IiwgMSB9LAotICB7ICJsdCIsIDAgfSwKLSAgeyAic28iLCAzIH0sCi0gIHsgInVuIiwgMyB9Ci19OwotCi0vKiBQYXJzaW5nIGZ1bmN0aW9uLiAgVGhpcyByZXR1cm5zIG5vbi16ZXJvIGlmIGl0IHJlY29nbml6ZWQgYW4KLSAgIGV4cHJlc3Npb24uICAqLwotCi1pbnQKLXBwY19wYXJzZV9uYW1lIChuYW1lLCBleHByKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBleHByZXNzaW9uUyAqZXhwcjsKLXsKLSAgaW50IHZhbDsKLQotICBpZiAoISBjcl9vcGVyYW5kKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IHJlZ19uYW1lX3NlYXJjaCAoY3JfbmFtZXMsIHNpemVvZiBjcl9uYW1lcyAvIHNpemVvZiBjcl9uYW1lc1swXSwKLQkJCSBuYW1lKTsKLSAgaWYgKHZhbCA8IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgZXhwci0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGV4cHItPlhfYWRkX251bWJlciA9IHZhbDsKLQotICByZXR1cm4gMTsKLX0KLQwKLS8qIExvY2FsIHZhcmlhYmxlcy4gICovCi0KLS8qIFRoZSB0eXBlIG9mIHByb2Nlc3NvciB3ZSBhcmUgYXNzZW1ibGluZyBmb3IuICBUaGlzIGlzIG9uZSBvciBtb3JlCi0gICBvZiB0aGUgUFBDX09QQ09ERSBmbGFncyBkZWZpbmVkIGluIG9wY29kZS9wcGMuaC4gICovCi1zdGF0aWMgaW50IHBwY19jcHUgPSAwOwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yIHdlIGFyZSBhc3NlbWJsaW5nIGZvci4gIFRoaXMgaXMgZWl0aGVyCi0gICBQUENfT1BDT0RFXzMyIG9yIFBQQ19PUENPREVfNjQuICAqLwotc3RhdGljIGludCBwcGNfc2l6ZSA9IFBQQ19PUENPREVfMzI7Ci0KLS8qIE9wY29kZSBoYXNoIHRhYmxlLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwcGNfaGFzaDsKLQotLyogTWFjcm8gaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcHBjX21hY3JvX2hhc2g7Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBXaGF0IHR5cGUgb2Ygc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCB0byB1c2UgKi8KLXN0YXRpYyBlbnVtIHsgU0hMSUJfTk9ORSwgU0hMSUJfUElDLCBTSElMQl9NUkVMT0NBVEFCTEUgfSBzaGxpYiA9IFNITElCX05PTkU7Ci0KLS8qIEZsYWdzIHRvIHNldCBpbiB0aGUgZWxmIGhlYWRlciAqLwotc3RhdGljIGZsYWd3b3JkIHBwY19mbGFncyA9IDA7Ci0KLS8qIFdoZXRoZXIgdGhpcyBpcyBTb2xhcmlzIG9yIG5vdC4gICovCi0jaWZkZWYgVEFSR0VUX1NPTEFSSVNfQ09NTUVOVAotI2RlZmluZSBTT0xBUklTX1AgdHJ1ZQotI2Vsc2UKLSNkZWZpbmUgU09MQVJJU19QIGZhbHNlCi0jZW5kaWYKLQotc3RhdGljIGJvb2xlYW4gbXNvbGFyaXMgPSBTT0xBUklTX1A7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBUaGUgUlMvNjAwMCBhc3NlbWJsZXIgdXNlcyB0aGUgLmNzZWN0IHBzZXVkby1vcCB0byBnZW5lcmF0ZSBjb2RlCi0gICB1c2luZyBhIGJ1bmNoIG9mIGRpZmZlcmVudCBzZWN0aW9ucy4gIFRoZXNlIGFzc2VtYmxlciBzZWN0aW9ucywKLSAgIGhvd2V2ZXIsIGFyZSBhbGwgZW5jb21wYXNzZWQgd2l0aGluIHRoZSAudGV4dCBvciAuZGF0YSBzZWN0aW9ucyBvZgotICAgdGhlIGZpbmFsIG91dHB1dCBmaWxlLiAgV2UgaGFuZGxlIHRoaXMgYnkgdXNpbmcgZGlmZmVyZW50Ci0gICBzdWJzZWdtZW50cyB3aXRoaW4gdGhlc2UgbWFpbiBzZWdtZW50cy4gICovCi0KLS8qIE5leHQgc3Vic2VnbWVudCB0byBhbGxvY2F0ZSB3aXRoaW4gdGhlIC50ZXh0IHNlZ21lbnQuICAqLwotc3RhdGljIHN1YnNlZ1QgcHBjX3RleHRfc3Vic2VnbWVudCA9IDI7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGNzZWN0cyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfdGV4dF9jc2VjdHM7Ci0KLS8qIE5leHQgc3Vic2VnbWVudCB0byBhbGxvY2F0ZSB3aXRoaW4gdGhlIC5kYXRhIHNlZ21lbnQuICAqLwotc3RhdGljIHN1YnNlZ1QgcHBjX2RhdGFfc3Vic2VnbWVudCA9IDI7Ci0KLS8qIExpbmtlZCBsaXN0IG9mIGNzZWN0cyBpbiB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfZGF0YV9jc2VjdHM7Ci0KLS8qIFRoZSBjdXJyZW50IGNzZWN0LiAgKi8KLXN0YXRpYyBzeW1ib2xTICpwcGNfY3VycmVudF9jc2VjdDsKLQotLyogVGhlIFJTLzYwMDAgYXNzZW1ibGVyIHVzZXMgYSBUT0Mgd2hpY2ggaG9sZHMgYWRkcmVzc2VzIG9mIGZ1bmN0aW9ucwotICAgYW5kIHZhcmlhYmxlcy4gIFN5bWJvbHMgYXJlIHB1dCBpbiB0aGUgVE9DIHdpdGggdGhlIC50YyBwc2V1ZG8tb3AuCi0gICBBIHNwZWNpYWwgcmVsb2NhdGlvbiBpcyB1c2VkIHdoZW4gYWNjZXNzaW5nIFRPQyBlbnRyaWVzLiAgV2UgaGFuZGxlCi0gICB0aGUgVE9DIGFzIGEgc3Vic2VnbWVudCB3aXRoaW4gdGhlIC5kYXRhIHNlZ21lbnQuICBXZSBzZXQgaXQgdXAgaWYKLSAgIHdlIHNlZSBhIC50b2MgcHNldWRvLW9wLCBhbmQgc2F2ZSB0aGUgY3NlY3Qgc3ltYm9sIGhlcmUuICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY190b2NfY3NlY3Q7Ci0KLS8qIFRoZSBmaXJzdCBmcmFnIGluIHRoZSBUT0Mgc3Vic2VnbWVudC4gICovCi1zdGF0aWMgZnJhZ1MgKnBwY190b2NfZnJhZzsKLQotLyogVGhlIGZpcnN0IGZyYWcgaW4gdGhlIGZpcnN0IHN1YnNlZ21lbnQgYWZ0ZXIgdGhlIFRPQyBpbiB0aGUgLmRhdGEKLSAgIHNlZ21lbnQuICBOVUxMIGlmIHRoZXJlIGFyZSBubyBzdWJzZWdtZW50cyBhZnRlciB0aGUgVE9DLiAgKi8KLXN0YXRpYyBmcmFnUyAqcHBjX2FmdGVyX3RvY19mcmFnOwotCi0vKiBUaGUgY3VycmVudCBzdGF0aWMgYmxvY2suICAqLwotc3RhdGljIHN5bWJvbFMgKnBwY19jdXJyZW50X2Jsb2NrOwotCi0vKiBUaGUgQ09GRiBkZWJ1Z2dpbmcgc2VjdGlvbjsgc2V0IGJ5IG1kX2JlZ2luLiAgVGhpcyBpcyBub3QgdGhlCi0gICAuZGVidWcgc2VjdGlvbiwgYnV0IGlzIGluc3RlYWQgdGhlIHNlY3JldCBCRkQgc2VjdGlvbiB3aGljaCB3aWxsCi0gICBjYXVzZSBCRkQgdG8gc2V0IHRoZSBzZWN0aW9uIG51bWJlciBvZiBhIHN5bWJvbCB0byBOX0RFQlVHLiAgKi8KLXN0YXRpYyBhc2VjdGlvbiAqcHBjX2NvZmZfZGVidWdfc2VjdGlvbjsKLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotCi0jaWZkZWYgVEVfUEUKLQotLyogVmFyaW91cyBzZWN0aW9ucyB0aGF0IHdlIG5lZWQgZm9yIFBFIGNvZmYgc3VwcG9ydC4gICovCi1zdGF0aWMgc2VnVCB5ZGF0YV9zZWN0aW9uOwotc3RhdGljIHNlZ1QgcGRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHJlbGRhdGFfc2VjdGlvbjsKLXN0YXRpYyBzZWdUIHJkYXRhX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCB0b2NkYXRhX3NlY3Rpb247Ci0KLS8qIFRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHRoZSBwcmV2aW91cyBzZWN0aW9uLiBTZWUgcHBjX3ByZXZpb3VzLiAqLwotc3RhdGljIHNlZ1QgcHBjX3ByZXZpb3VzX3NlY3Rpb247Ci1zdGF0aWMgc2VnVCBwcGNfY3VycmVudF9zZWN0aW9uOwotCi0jZW5kaWYgLyogVEVfUEUgKi8KLQotI2lmZGVmIE9CSl9FTEYKLXN5bWJvbFMgKkdPVF9zeW1ib2w7CQkvKiBQcmUtZGVmaW5lZCAiX0dMT0JBTF9PRkZTRVRfVEFCTEUiICovCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotDAotI2lmZGVmIE9CSl9FTEYKLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICJiOmw6dXNtOks6VlE6IjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAidW06IjsKLSNlbmRpZgotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ3UnOgotICAgICAgLyogLXUgbWVhbnMgdGhhdCBhbnkgdW5kZWZpbmVkIHN5bWJvbHMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMKLQkgZXh0ZXJuYWwsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGZvciBnYXMgYW55aG93LiAgKi8KLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgT0JKX0VMRgotICAgIGNhc2UgJ2wnOgotICAgICAgLyogU29sYXJpcyBhcyB0YWtlcyAtbGUgKHByZXN1bWFibHkgZm9yIGxpdHRsZSBlbmRpYW4pLiAgRm9yIGNvbXBsZXRlbmVzcwotICAgICAgICAgc2FrZSwgcmVjb2duaXplIC1iZSBhbHNvLiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKGFyZywgImUiKSA9PSAwKQotCXsKLQkgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLQkgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYic6Ci0gICAgICBpZiAoc3RyY21wIChhcmcsICJlIikgPT0gMCkKLQl7Ci0JICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0JICBzZXRfdGFyZ2V0X2VuZGlhbiA9IDE7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAwOwotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgICAgLyogUmVjb2duaXplIC1LIFBJQyAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiUElDIikgPT0gMCB8fCBzdHJjbXAgKGFyZywgInBpYyIpID09IDApCi0JewotCSAgc2hsaWIgPSBTSExJQl9QSUM7Ci0JICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFX0xJQjsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIDA7Ci0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSAgICBjYXNlICdtJzoKLSAgICAgIC8qIC1tcHdyeCBhbmQgLW1wd3IyIG1lYW4gdG8gYXNzZW1ibGUgZm9yIHRoZSBJQk0gUE9XRVIvMgotICAgICAgICAgKFJJT1MyKS4gICovCi0gICAgICBpZiAoc3RyY21wIChhcmcsICJwd3J4IikgPT0gMCB8fCBzdHJjbXAgKGFyZywgInB3cjIiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjI7Ci0gICAgICAvKiAtbXB3ciBtZWFucyB0byBhc3NlbWJsZSBmb3IgdGhlIElCTSBQT1dFUiAoUklPUzEpLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHdyIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKLSAgICAgIC8qIC1tNjAxIG1lYW5zIHRvIGFzc2VtYmxlIGZvciB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEsIHdoaWNoIGluY2x1ZGVzCi0gICAgICAgICBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaG9sZG92ZXJzIGZyb20gdGhlIFBvd2VyLiAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICI2MDEiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfNjAxOwotICAgICAgLyogLW1wcGMsIC1tcHBjMzIsIC1tNjAzLCBhbmQgLW02MDQgbWVhbiB0byBhc3NlbWJsZSBmb3IgdGhlCi0gICAgICAgICBNb3Rvcm9sYSBQb3dlclBDIDYwMy82MDQuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAicHBjMzIiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoYXJnLCAiNDAzIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGFyZywgIjYwMyIpID09IDAKLQkgICAgICAgfHwgc3RyY21wIChhcmcsICI2MDQiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX1BQQzsKLSAgICAgIC8qIC1tcHBjNjQgYW5kIC1tNjIwIG1lYW4gdG8gYXNzZW1ibGUgZm9yIHRoZSA2NC1iaXQgUG93ZXJQQwotICAgICAgICAgNjIwLiAgKi8KLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAicHBjNjQiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiNjIwIikgPT0gMCkKLQl7Ci0JICBwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEM7Ci0JICBwcGNfc2l6ZSA9IFBQQ19PUENPREVfNjQ7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJwcGM2NGJyaWRnZSIpID09IDApCi0JewotCSAgcHBjX2NwdSA9IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82NF9CUklER0U7Ci0JICBwcGNfc2l6ZSA9IFBQQ19PUENPREVfNjQ7Ci0JfQotICAgICAgLyogLW1jb20gbWVhbnMgYXNzZW1ibGUgZm9yIHRoZSBjb21tb24gaW50ZXJzZWN0aW9uIGJldHdlZW4gUG93ZXIKLQkgYW5kIFBvd2VyUEMuICBBdCBwcmVzZW50LCB3ZSBqdXN0IGFsbG93IHRoZSB1bmlvbiwgcmF0aGVyCi0JIHRoYW4gdGhlIGludGVyc2VjdGlvbi4gICovCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgImNvbSIpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfQ09NTU9OOwotICAgICAgLyogLW1hbnkgbWVhbnMgdG8gYXNzZW1ibGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKFBXUi9QV1JYL1BQQykuICAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJhbnkiKSA9PSAwKQotCXBwY19jcHUgPSBQUENfT1BDT0RFX0FOWTsKLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWduYW1lcyIpID09IDApCi0JcmVnX25hbWVzX3AgPSB0cnVlOwotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vLXJlZ25hbWVzIikgPT0gMCkKLQlyZWdfbmFtZXNfcCA9IGZhbHNlOwotCi0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogLW1yZWxvY2F0YWJsZS8tbXJlbG9jYXRhYmxlLWxpYiAtLSB3YXJuIGFib3V0IGluaXRpYWxpemF0aW9ucyB0aGF0IHJlcXVpcmUgcmVsb2NhdGlvbiAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWxvY2F0YWJsZSIpID09IDApCi0JewotCSAgc2hsaWIgPSBTSElMQl9NUkVMT0NBVEFCTEU7Ci0JICBwcGNfZmxhZ3MgfD0gRUZfUFBDX1JFTE9DQVRBQkxFOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJyZWxvY2F0YWJsZS1saWIiKSA9PSAwKQotCXsKLQkgIHNobGliID0gU0hJTEJfTVJFTE9DQVRBQkxFOwotCSAgcHBjX2ZsYWdzIHw9IEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUI7Ci0JfQotCi0gICAgICAvKiAtbWVtYiwgc2V0IGVtYmVkZGVkIGJpdCAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJlbWIiKSA9PSAwKQotCXBwY19mbGFncyB8PSBFRl9QUENfRU1COwotCi0gICAgICAvKiAtbWxpdHRsZS8tbWJpZyBzZXQgdGhlIGVuZGlhbmVzcyAqLwotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJsaXR0bGUiKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAibGl0dGxlLWVuZGlhbiIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJiaWciKSA9PSAwIHx8IHN0cmNtcCAoYXJnLCAiYmlnLWVuZGlhbiIpID09IDApCi0JewotCSAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAxOwotCSAgc2V0X3RhcmdldF9lbmRpYW4gPSAxOwotCX0KLQotICAgICAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJzb2xhcmlzIikgPT0gMCkKLQl7Ci0JICBtc29sYXJpcyA9IHRydWU7Ci0JICBwcGNfY29tbWVudF9jaGFycyA9IHBwY19zb2xhcmlzX2NvbW1lbnRfY2hhcnM7Ci0JfQotCi0gICAgICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIm5vLXNvbGFyaXMiKSA9PSAwKQotCXsKLQkgIG1zb2xhcmlzID0gZmFsc2U7Ci0JICBwcGNfY29tbWVudF9jaGFycyA9IHBwY19lYWJpX2NvbW1lbnRfY2hhcnM7Ci0JfQotI2VuZGlmCi0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkIChfKCJpbnZhbGlkIHN3aXRjaCAtbSVzIiksIGFyZyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIC8qIC1WOiBTVlI0IGFyZ3VtZW50IHRvIHByaW50IHZlcnNpb24gSUQuICAqLwotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAtUXksIC1RbjogU1ZSNCBhcmd1bWVudHMgY29udHJvbGxpbmcgd2hldGhlciBhIC5jb21tZW50IHNlY3Rpb24KLQkgc2hvdWxkIGJlIGVtaXR0ZWQgb3Igbm90LiAgRklYTUU6IE5vdCBpbXBsZW1lbnRlZC4gICovCi0gICAgY2FzZSAnUSc6Ci0gICAgICBicmVhazsKLQotICAgICAgLyogU29sYXJpcyB0YWtlcyAtcyB0byBzcGVjaWZ5IHRoYXQgLnN0YWJzIGdvIGluIGEgLnN0YWJzIHNlY3Rpb24sCi0JIHJhdGhlciB0aGFuIC5zdGFicy5leGNsLCB3aGljaCBpcyBpZ25vcmVkIGJ5IHRoZSBsaW5rZXIuCi0JIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQuICAqLwotICAgIGNhc2UgJ3MnOgotICAgICAgaWYgKGFyZykKLQlyZXR1cm4gMDsKLQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotUG93ZXJQQyBvcHRpb25zOlxuXAotLXUJCQlpZ25vcmVkXG5cCi0tbXB3cngsIC1tcHdyMgkJZ2VuZXJhdGUgY29kZSBmb3IgSUJNIFBPV0VSLzIgKFJJT1MyKVxuXAotLW1wd3IJCQlnZW5lcmF0ZSBjb2RlIGZvciBJQk0gUE9XRVIgKFJJT1MxKVxuXAotLW02MDEJCQlnZW5lcmF0ZSBjb2RlIGZvciBNb3Rvcm9sYSBQb3dlclBDIDYwMVxuXAotLW1wcGMsIC1tcHBjMzIsIC1tNDAzLCAtbTYwMywgLW02MDRcblwKLQkJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAzLzYwNFxuXAotLW1wcGM2NCwgLW02MjAJCWdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjIwXG5cCi0tbXBwYzY0YnJpZGdlCQlnZW5lcmF0ZSBjb2RlIGZvciBQb3dlclBDIDY0LCBpbmNsdWRpbmcgYnJpZGdlIGluc25zXG5cCi0tbWNvbQkJCWdlbmVyYXRlIGNvZGUgUG93ZXIvUG93ZXJQQyBjb21tb24gaW5zdHJ1Y3Rpb25zXG5cCi0tbWFueQkJCWdlbmVyYXRlIGNvZGUgZm9yIGFueSBhcmNoaXRlY3R1cmUgKFBXUi9QV1JYL1BQQylcblwKLS1tcmVnbmFtZXMJCUFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcblwKLS1tbm8tcmVnbmFtZXMJCURvIG5vdCBhbGxvdyBzeW1ib2xpYyBuYW1lcyBmb3IgcmVnaXN0ZXJzXG4iKSk7Ci0jaWZkZWYgT0JKX0VMRgotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotLW1yZWxvY2F0YWJsZQkJc3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlIG9wdGlvblxuXAotLW1yZWxvY2F0YWJsZS1saWIJc3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlLWxpYiBvcHRpb25cblwKLS1tZW1iCQkJc2V0IFBQQ19FTUIgYml0IGluIEVMRiBmbGFnc1xuXAotLW1saXR0bGUsIC1tbGl0dGxlLWVuZGlhblxuXAotCQkJZ2VuZXJhdGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmVcblwKLS1tYmlnLCAtbWJpZy1lbmRpYW4JZ2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcblwKLS1tc29sYXJpcwkJZ2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuXAotLW1uby1zb2xhcmlzCQlkbyBub3QgZ2VuZXJhdGUgY29kZSBmb3IgU29sYXJpc1xuXAotLVYJCQlwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcblwKLS1ReSwgLVFuCQlpZ25vcmVkXG4iKSk7Ci0jZW5kaWYKLX0KLQwKLS8qIFNldCBwcGNfY3B1IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfc2V0X2NwdSAoKQotewotICBjb25zdCBjaGFyICpkZWZhdWx0X29zICA9IFRBUkdFVF9PUzsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotCi0gIGlmIChwcGNfY3B1ID09IDApCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKGRlZmF1bHRfb3MsICJhaXgiLCAzKSA9PSAwCi0JICAmJiBkZWZhdWx0X29zWzNdID49ICc0JyAmJiBkZWZhdWx0X29zWzNdIDw9ICc5JykKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9DT01NT047Ci0gICAgICBlbHNlIGlmIChzdHJuY21wIChkZWZhdWx0X29zLCAiYWl4MyIsIDQpID09IDApCi0JcHBjX2NwdSA9IFBQQ19PUENPREVfUE9XRVI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicnM2MDAwIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QT1dFUjsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjIikgPT0gMAotCSAgICAgICB8fCBzdHJjbXAgKGRlZmF1bHRfY3B1LCAicG93ZXJwY2xlIikgPT0gMCkKLQlwcGNfY3B1ID0gUFBDX09QQ09ERV9QUEM7Ci0gICAgICBlbHNlCi0JYXNfZmF0YWwgKF8oIlVua25vd24gZGVmYXVsdCBjcHUgPSAlcywgb3MgPSAlcyIpLCBkZWZhdWx0X2NwdSwgZGVmYXVsdF9vcyk7Ci0gICAgfQotfQotCi0vKiBGaWd1cmUgb3V0IHRoZSBCRkQgYXJjaGl0ZWN0dXJlIHRvIHVzZS4gICovCi0KLWVudW0gYmZkX2FyY2hpdGVjdHVyZQotcHBjX2FyY2ggKCkKLXsKLSAgY29uc3QgY2hhciAqZGVmYXVsdF9jcHUgPSBUQVJHRVRfQ1BVOwotICBwcGNfc2V0X2NwdSAoKTsKLQotICBpZiAoKHBwY19jcHUgJiBQUENfT1BDT0RFX1BQQykgIT0gMCkKLSAgICByZXR1cm4gYmZkX2FyY2hfcG93ZXJwYzsKLSAgZWxzZSBpZiAoKHBwY19jcHUgJiBQUENfT1BDT0RFX1BPV0VSKSAhPSAwKQotICAgIHJldHVybiBiZmRfYXJjaF9yczYwMDA7Ci0gIGVsc2UgaWYgKChwcGNfY3B1ICYgKFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkpKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKGRlZmF1bHRfY3B1LCAicnM2MDAwIikgPT0gMCkKLQlyZXR1cm4gYmZkX2FyY2hfcnM2MDAwOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChkZWZhdWx0X2NwdSwgInBvd2VycGMiKSA9PSAwCi0JICAgICAgIHx8IHN0cmNtcCAoZGVmYXVsdF9jcHUsICJwb3dlcnBjbGUiKSA9PSAwKQotCXJldHVybiBiZmRfYXJjaF9wb3dlcnBjOwotICAgIH0KLQotICBhc19mYXRhbCAoXygiTmVpdGhlciBQb3dlciBub3IgUG93ZXJQQyBvcGNvZGVzIHdlcmUgc2VsZWN0ZWQuIikpOwotICByZXR1cm4gYmZkX2FyY2hfdW5rbm93bjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN0YXJ0cyB1cC4gIEl0IGlzIGNhbGxlZAotICAgYWZ0ZXIgdGhlIG9wdGlvbnMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgdGhlIG91dHB1dCBmaWxlIGhhcyBiZWVuCi0gICBvcGVuZWQuICAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wX2VuZDsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqbWFjcm9fZW5kOwotICBib29sZWFuIGR1cF9pbnNuID0gZmFsc2U7Ci0KLSAgcHBjX3NldF9jcHUgKCk7Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIFNldCB0aGUgRUxGIGZsYWdzIGlmIGRlc2lyZWQuICovCi0gIGlmIChwcGNfZmxhZ3MgJiYgIW1zb2xhcmlzKQotICAgIGJmZF9zZXRfcHJpdmF0ZV9mbGFncyAoc3Rkb3V0cHV0LCBwcGNfZmxhZ3MpOwotI2VuZGlmCi0KLSAgLyogSW5zZXJ0IHRoZSBvcGNvZGVzIGludG8gYSBoYXNoIHRhYmxlLiAgKi8KLSAgcHBjX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBvcF9lbmQgPSBwb3dlcnBjX29wY29kZXMgKyBwb3dlcnBjX251bV9vcGNvZGVzOwotICBmb3IgKG9wID0gcG93ZXJwY19vcGNvZGVzOyBvcCA8IG9wX2VuZDsgb3ArKykKLSAgICB7Ci0gICAgICBrbm93ICgob3AtPm9wY29kZSAmIG9wLT5tYXNrKSA9PSBvcC0+b3Bjb2RlKTsKLQotICAgICAgaWYgKChvcC0+ZmxhZ3MgJiBwcGNfY3B1KSAhPSAwCi0JICAmJiAoKG9wLT5mbGFncyAmIChQUENfT1BDT0RFXzMyIHwgUFBDX09QQ09ERV82NCkpID09IDAKLQkgICAgICB8fCAob3AtPmZsYWdzICYgKFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFXzY0KSkgPT0gcHBjX3NpemUKLQkgICAgICB8fCAocHBjX2NwdSAmIFBQQ19PUENPREVfNjRfQlJJREdFKSAhPSAwKSkKLQl7Ci0JICBjb25zdCBjaGFyICpyZXR2YWw7Ci0KLQkgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChwcGNfaGFzaCwgb3AtPm5hbWUsIChQVFIpIG9wKTsKLQkgIGlmIChyZXR2YWwgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkgICAgewotCSAgICAgIC8qIElnbm9yZSBQb3dlciBkdXBsaWNhdGVzIGZvciAtbTYwMSAqLwotCSAgICAgIGlmICgocHBjX2NwdSAmIFBQQ19PUENPREVfNjAxKSAhPSAwCi0JCSAgJiYgKG9wLT5mbGFncyAmIFBQQ19PUENPREVfUE9XRVIpICE9IDApCi0JCWNvbnRpbnVlOwotCi0JICAgICAgYXNfYmFkIChfKCJJbnRlcm5hbCBhc3NlbWJsZXIgZXJyb3IgZm9yIGluc3RydWN0aW9uICVzIiksIG9wLT5uYW1lKTsKLQkgICAgICBkdXBfaW5zbiA9IHRydWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIEluc2VydCB0aGUgbWFjcm9zIGludG8gYSBoYXNoIHRhYmxlLiAgKi8KLSAgcHBjX21hY3JvX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBtYWNyb19lbmQgPSBwb3dlcnBjX21hY3JvcyArIHBvd2VycGNfbnVtX21hY3JvczsKLSAgZm9yIChtYWNybyA9IHBvd2VycGNfbWFjcm9zOyBtYWNybyA8IG1hY3JvX2VuZDsgbWFjcm8rKykKLSAgICB7Ci0gICAgICBpZiAoKG1hY3JvLT5mbGFncyAmIHBwY19jcHUpICE9IDApCi0JewotCSAgY29uc3QgY2hhciAqcmV0dmFsOwotCi0JICByZXR2YWwgPSBoYXNoX2luc2VydCAocHBjX21hY3JvX2hhc2gsIG1hY3JvLT5uYW1lLCAoUFRSKSBtYWNybyk7Ci0JICBpZiAocmV0dmFsICE9IChjb25zdCBjaGFyICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkludGVybmFsIGFzc2VtYmxlciBlcnJvciBmb3IgbWFjcm8gJXMiKSwgbWFjcm8tPm5hbWUpOwotCSAgICAgIGR1cF9pbnNuID0gdHJ1ZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKGR1cF9pbnNuKQotICAgIGFib3J0ICgpOwotCi0gIC8qIFRlbGwgdGhlIG1haW4gY29kZSB3aGF0IHRoZSBlbmRpYW5uZXNzIGlzIGlmIGl0IGlzIG5vdCBvdmVyaWRkZW4gYnkgdGhlIHVzZXIuICAqLwotICBpZiAoIXNldF90YXJnZXRfZW5kaWFuKQotICAgIHsKLSAgICAgIHNldF90YXJnZXRfZW5kaWFuID0gMTsKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gUFBDX0JJR19FTkRJQU47Ci0gICAgfQotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gIHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24gPSBjb2ZmX3NlY3Rpb25fZnJvbV9iZmRfaW5kZXggKHN0ZG91dHB1dCwgTl9ERUJVRyk7Ci0KLSAgLyogQ3JlYXRlIGR1bW15IHN5bWJvbHMgdG8gc2VydmUgYXMgaW5pdGlhbCBjc2VjdHMuICBUaGlzIGZvcmNlcyB0aGUKLSAgICAgdGV4dCBjc2VjdHMgdG8gcHJlY2VkZSB0aGUgZGF0YSBjc2VjdHMuICBUaGVzZSBzeW1ib2xzIHdpbGwgbm90Ci0gICAgIGJlIG91dHB1dC4gICovCi0gIHBwY190ZXh0X2NzZWN0cyA9IHN5bWJvbF9tYWtlICgiZHVtbXlcMDAxIik7Ci0gIHN5bWJvbF9nZXRfdGMgKHBwY190ZXh0X2NzZWN0cyktPndpdGhpbiA9IHBwY190ZXh0X2NzZWN0czsKLSAgcHBjX2RhdGFfY3NlY3RzID0gc3ltYm9sX21ha2UgKCJkdW1teVwwMDEiKTsKLSAgc3ltYm9sX2dldF90YyAocHBjX2RhdGFfY3NlY3RzKS0+d2l0aGluID0gcHBjX2RhdGFfY3NlY3RzOwotI2VuZGlmCi0KLSNpZmRlZiBURV9QRQotCi0gIHBwY19jdXJyZW50X3NlY3Rpb24gPSB0ZXh0X3NlY3Rpb247Ci0gIHBwY19wcmV2aW91c19zZWN0aW9uID0gMDsgIAotCi0jZW5kaWYKLX0KLQotLyogSW5zZXJ0IGFuIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1wcGNfaW5zZXJ0X29wZXJhbmQgKGluc24sIG9wZXJhbmQsIHZhbCwgZmlsZSwgbGluZSkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBvZmZzZXRUIHZhbDsKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci17Ci0gIGlmIChvcGVyYW5kLT5iaXRzICE9IDMyKQotICAgIHsKLSAgICAgIGxvbmcgbWluLCBtYXg7Ci0gICAgICBvZmZzZXRUIHRlc3Q7Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDApCi0JewotCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05PUFQpICE9IDApCi0JICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgIGVsc2UKLQkgICAgbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQotCSAgaWYgKHBwY19zaXplID09IFBQQ19PUENPREVfMzIpCi0JICAgIHsKLQkgICAgICAvKiBTb21lIHBlb3BsZSB3cml0ZSAzMiBiaXQgaGV4IGNvbnN0YW50cyB3aXRoIHRoZSBzaWduCi0JCSBleHRlbnNpb24gZG9uZSBieSBoYW5kLiAgVGhpcyBzaG91bGRuJ3QgcmVhbGx5IGJlCi0JCSB2YWxpZCwgYnV0LCB0byBwZXJtaXQgdGhpcyBjb2RlIHRvIGFzc2VtYmxlIG9uIGEgNjQKLQkJIGJpdCBob3N0LCB3ZSBzaWduIGV4dGVuZCB0aGUgMzIgYml0IHZhbHVlLiAgKi8KLQkgICAgICBpZiAodmFsID4gMAotCQkgICYmICh2YWwgJiAweDgwMDAwMDAwKSAhPSAwCi0JCSAgJiYgKHZhbCAmIDB4ZmZmZmZmZmYpID09IHZhbCkKLQkJewotCQkgIHZhbCAtPSAweDgwMDAwMDAwOwotCQkgIHZhbCAtPSAweDgwMDAwMDAwOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgbWluID0gMDsKLQl9Ci0KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORUdBVElWRSkgIT0gMCkKLQl0ZXN0ID0gLSB2YWw7Ci0gICAgICBlbHNlCi0JdGVzdCA9IHZhbDsKLQotICAgICAgaWYgKHRlc3QgPCAob2Zmc2V0VCkgbWluIHx8IHRlc3QgPiAob2Zmc2V0VCkgbWF4KQotCXsKLQkgIGNvbnN0IGNoYXIgKmVyciA9Ci0JICAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLQkgIGNoYXIgYnVmWzEwMF07Ci0KLQkgIHNwcmludF92YWx1ZSAoYnVmLCB0ZXN0KTsKLQkgIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0JICAgIGFzX2JhZCAoZXJyLCBidWYsIG1pbiwgbWF4KTsKLQkgIGVsc2UKLQkgICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCBlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wZXJhbmQtPmluc2VydCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0KLSAgICAgIGVycm1zZyA9IE5VTEw7Ci0gICAgICBpbnNuID0gKCpvcGVyYW5kLT5pbnNlcnQpIChpbnNuLCAobG9uZykgdmFsLCAmZXJybXNnKTsKLSAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQlhc19iYWQgKGVycm1zZyk7Ci0gICAgfQotICBlbHNlCi0gICAgaW5zbiB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkKLQkgICAgIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotDAotI2lmZGVmIE9CSl9FTEYKLS8qIFBhcnNlIEBnb3QsIGV0Yy4gYW5kIHJldHVybiB0aGUgZGVzaXJlZCByZWxvY2F0aW9uLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLXBwY19lbGZfc3VmZml4IChzdHJfcCwgZXhwX3ApCi0gICAgIGNoYXIgKipzdHJfcDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cF9wOwotewotICBzdHJ1Y3QgbWFwX2JmZCB7Ci0gICAgY2hhciAqc3RyaW5nOwotICAgIGludCBsZW5ndGg7Ci0gICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICB9OwotCi0gIGNoYXIgaWRlbnRbMjBdOwotICBjaGFyICpzdHIgPSAqc3RyX3A7Ci0gIGNoYXIgKnN0cjI7Ci0gIGludCBjaDsKLSAgaW50IGxlbjsKLSAgc3RydWN0IG1hcF9iZmQgKnB0cjsKLQotI2RlZmluZSBNQVAoc3RyLHJlbG9jKSB7IHN0ciwgc2l6ZW9mKHN0ciktMSwgcmVsb2MgfQotCi0gIHN0YXRpYyBzdHJ1Y3QgbWFwX2JmZCBtYXBwaW5nW10gPSB7Ci0gICAgTUFQICgibCIsCQlCRkRfUkVMT0NfTE8xNiksCi0gICAgTUFQICgiaCIsCQlCRkRfUkVMT0NfSEkxNiksCi0gICAgTUFQICgiaGEiLAkJQkZEX1JFTE9DX0hJMTZfUyksCi0gICAgTUFQICgiYnJ0YWtlbiIsCUJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4pLAotICAgIE1BUCAoImJybnRha2VuIiwJQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU4pLAotICAgIE1BUCAoImdvdCIsCQlCRkRfUkVMT0NfMTZfR09UT0ZGKSwKLSAgICBNQVAgKCJnb3RAbCIsCUJGRF9SRUxPQ19MTzE2X0dPVE9GRiksCi0gICAgTUFQICgiZ290QGgiLAlCRkRfUkVMT0NfSEkxNl9HT1RPRkYpLAotICAgIE1BUCAoImdvdEBoYSIsCUJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGKSwKLSAgICBNQVAgKCJmaXh1cCIsCUJGRF9SRUxPQ19DVE9SKSwJCS8qIHdhcm5pbmdzIHdpdGggLW1yZWxvY2F0YWJsZSAqLwotICAgIE1BUCAoInBsdCIsCQlCRkRfUkVMT0NfMjRfUExUX1BDUkVMKSwKLSAgICBNQVAgKCJwbHRyZWwyNCIsCUJGRF9SRUxPQ18yNF9QTFRfUENSRUwpLAotICAgIE1BUCAoImNvcHkiLAlCRkRfUkVMT0NfUFBDX0NPUFkpLAotICAgIE1BUCAoImdsb2JkYXQiLAlCRkRfUkVMT0NfUFBDX0dMT0JfREFUKSwKLSAgICBNQVAgKCJsb2NhbDI0cGMiLAlCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQyksCi0gICAgTUFQICgibG9jYWwiLAlCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQyksCi0gICAgTUFQICgicGx0cmVsIiwJQkZEX1JFTE9DXzMyX1BMVF9QQ1JFTCksCi0gICAgTUFQICgicGx0QGwiLAlCRkRfUkVMT0NfTE8xNl9QTFRPRkYpLAotICAgIE1BUCAoInBsdEBoIiwJQkZEX1JFTE9DX0hJMTZfUExUT0ZGKSwKLSAgICBNQVAgKCJwbHRAaGEiLAlCRkRfUkVMT0NfSEkxNl9TX1BMVE9GRiksCi0gICAgTUFQICgic2RhcmVsIiwJQkZEX1JFTE9DX0dQUkVMMTYpLAotICAgIE1BUCAoInNlY3RvZmYiLAlCRkRfUkVMT0NfMzJfQkFTRVJFTCksCi0gICAgTUFQICgic2VjdG9mZkBsIiwJQkZEX1JFTE9DX0xPMTZfQkFTRVJFTCksCi0gICAgTUFQICgic2VjdG9mZkBoIiwJQkZEX1JFTE9DX0hJMTZfQkFTRVJFTCksCi0gICAgTUFQICgic2VjdG9mZkBoYSIsCUJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTCksCi0gICAgTUFQICgibmFkZHIiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjMyKSwKLSAgICBNQVAgKCJuYWRkcjE2IiwJQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNiksCi0gICAgTUFQICgibmFkZHJAbCIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE8pLAotICAgIE1BUCAoIm5hZGRyQGgiLAlCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJKSwKLSAgICBNQVAgKCJuYWRkckBoYSIsCUJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfSEEpLAotICAgIE1BUCAoInNkYWkxNiIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNiksCi0gICAgTUFQICgic2RhMnJlbCIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUwpLAotICAgIE1BUCAoInNkYTJpMTYiLAlCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2KSwKLSAgICBNQVAgKCJzZGEyMSIsCUJGRF9SRUxPQ19QUENfRU1CX1NEQTIxKSwKLSAgICBNQVAgKCJtcmtyZWYiLAlCRkRfUkVMT0NfUFBDX0VNQl9NUktSRUYpLAotICAgIE1BUCAoInJlbHNlY3QiLAlCRkRfUkVMT0NfUFBDX0VNQl9SRUxTRUMxNiksCi0gICAgTUFQICgicmVsc2VjdEBsIiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfTE8pLAotICAgIE1BUCAoInJlbHNlY3RAaCIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJKSwKLSAgICBNQVAgKCJyZWxzZWN0QGhhIiwJQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEEpLAotICAgIE1BUCAoImJpdGZsZCIsCUJGRF9SRUxPQ19QUENfRU1CX0JJVF9GTEQpLAotICAgIE1BUCAoInJlbHNkYSIsCUJGRF9SRUxPQ19QUENfRU1CX1JFTFNEQSksCi0gICAgTUFQICgieGdvdCIsCUJGRF9SRUxPQ19QUENfVE9DMTYpLAotCi0gICAgeyAoY2hhciAqKTAsCTAsCUJGRF9SRUxPQ19VTlVTRUQgfQotICB9OwotCi0gIGlmICgqc3RyKysgIT0gJ0AnKQotICAgIHJldHVybiBCRkRfUkVMT0NfVU5VU0VEOwotCi0gIGZvciAoY2ggPSAqc3RyLCBzdHIyID0gaWRlbnQ7Ci0gICAgICAgKHN0cjIgPCBpZGVudCArIHNpemVvZiAoaWRlbnQpIC0gMQotCSYmIChpc2FsbnVtIChjaCkgfHwgY2ggPT0gJ0AnKSk7Ci0gICAgICAgY2ggPSAqKytzdHIpCi0gICAgewotICAgICAgKnN0cjIrKyA9IChpc2xvd2VyIChjaCkpID8gY2ggOiB0b2xvd2VyIChjaCk7Ci0gICAgfQotCi0gICpzdHIyID0gJ1wwJzsKLSAgbGVuID0gc3RyMiAtIGlkZW50OwotCi0gIGNoID0gaWRlbnRbMF07Ci0gIGZvciAocHRyID0gJm1hcHBpbmdbMF07IHB0ci0+bGVuZ3RoID4gMDsgcHRyKyspCi0gICAgaWYgKGNoID09IHB0ci0+c3RyaW5nWzBdCi0JJiYgbGVuID09IHB0ci0+bGVuZ3RoCi0JJiYgbWVtY21wIChpZGVudCwgcHRyLT5zdHJpbmcsIHB0ci0+bGVuZ3RoKSA9PSAwKQotICAgICAgewotCWlmIChleHBfcC0+WF9hZGRfbnVtYmVyICE9IDAKLQkgICAgJiYgKHB0ci0+cmVsb2MgPT0gQkZEX1JFTE9DXzE2X0dPVE9GRgotCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19MTzE2X0dPVE9GRgotCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotCQl8fCBwdHItPnJlbG9jID09IEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGKSkKLQkgIGFzX3dhcm4gKF8oImlkZW50aWZpZXIrY29uc3RhbnRAZ290IG1lYW5zIGlkZW50aWZpZXJAZ290K2NvbnN0YW50IikpOwotCi0JLyogTm93IGNoZWNrIGZvciBpZGVudGlmaWVyQHN1ZmZpeCtjb25zdGFudCAqLwotCWlmICgqc3RyID09ICctJyB8fCAqc3RyID09ICcrJykKLQkgIHsKLQkgICAgY2hhciAqb3JpZ19saW5lID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICBleHByZXNzaW9uUyBuZXdfZXhwOwotCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQkgICAgZXhwcmVzc2lvbiAoJm5ld19leHApOwotCSAgICBpZiAobmV3X2V4cC5YX29wID09IE9fY29uc3RhbnQpCi0JICAgICAgewotCQlleHBfcC0+WF9hZGRfbnVtYmVyICs9IG5ld19leHAuWF9hZGRfbnVtYmVyOwotCQlzdHIgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgfQotCi0JICAgIGlmICgmaW5wdXRfbGluZV9wb2ludGVyICE9IHN0cl9wKQotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9yaWdfbGluZTsKLQkgIH0KLQotCSpzdHJfcCA9IHN0cjsKLQlyZXR1cm4gcHRyLT5yZWxvYzsKLSAgICAgIH0KLQotICByZXR1cm4gQkZEX1JFTE9DX1VOVVNFRDsKLX0KLQotLyogTGlrZSBub3JtYWwgLmxvbmcvLnNob3J0Ly53b3JkLCBleGNlcHQgc3VwcG9ydCBAZ290LCBldGMuICovCi0vKiBjbG9iYmVycyBpbnB1dF9saW5lX3BvaW50ZXIsIGNoZWNrcyAqLwotLyogZW5kLW9mLWxpbmUuICovCi1zdGF0aWMgdm9pZAotcHBjX2VsZl9jb25zIChuYnl0ZXMpCi0gICAgIHJlZ2lzdGVyIGludCBuYnl0ZXM7CS8qIDE9LmJ5dGUsIDI9LndvcmQsIDQ9LmxvbmcgKi8KLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0KLSAgaWYgKGlzX2l0X2VuZF9vZl9zdGF0ZW1lbnQgKCkpCi0gICAgewotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBleHByZXNzaW9uICgmZXhwKTsKLSAgICAgIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbAotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnQCcKLQkgICYmIChyZWxvYyA9IHBwY19lbGZfc3VmZml4ICgmaW5wdXRfbGluZV9wb2ludGVyLCAmZXhwKSkgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCByZWxvYyk7Ci0JICBpbnQgc2l6ZSA9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocmVsb2NfaG93dG8pOwotCi0JICBpZiAoc2l6ZSA+IG5ieXRlcykKLQkgICAgYXNfYmFkIChfKCIlcyByZWxvY2F0aW9ucyBkbyBub3QgZml0IGluICVkIGJ5dGVzXG4iKSwgcmVsb2NfaG93dG8tPm5hbWUsIG5ieXRlcyk7Ci0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlZ2lzdGVyIGNoYXIgKnAgPSBmcmFnX21vcmUgKChpbnQpIG5ieXRlcyk7Ci0JICAgICAgaW50IG9mZnNldCA9IG5ieXRlcyAtIHNpemU7Ci0KLQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCArIG9mZnNldCwgc2l6ZSwgJmV4cCwgMCwgcmVsb2MpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCWVtaXRfZXhwciAoJmV4cCwgKHVuc2lnbmVkIGludCkgbmJ5dGVzKTsKLSAgICB9Ci0gIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgPT0gJywnKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXItLTsJCS8qIFB1dCB0ZXJtaW5hdG9yIGJhY2sgaW50byBzdHJlYW0uICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFNvbGFyaXMgcHNlZHVvIG9wIHRvIGNoYW5nZSB0byB0aGUgLnJvZGF0YSBzZWN0aW9uLiAgKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX3JkYXRhICh4eHgpCi0gICAgIGludCB4eHg7Ci17Ci0gIGNoYXIgKnNhdmVfbGluZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgc3RhdGljIGNoYXIgc2VjdGlvbltdID0gIi5yb2RhdGFcbiI7Ci0KLSAgLyogSnVzdCBwcmV0ZW5kIHRoaXMgaXMgLnNlY3Rpb24gLnJvZGF0YSAqLwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzZWN0aW9uOwotICBvYmpfZWxmX3NlY3Rpb24gKHh4eCk7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9saW5lOwotfQotCi0vKiBQc2V1ZG8gb3AgdG8gbWFrZSBmaWxlIHNjb3BlIGJzcyBpdGVtcyAqLwotc3RhdGljIHZvaWQKLXBwY19lbGZfbGNvbW0oeHh4KQotICAgICBpbnQgeHh4OwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIG9mZnNldFQgc2l6ZTsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLSAgb2Zmc2V0VCBhbGlnbjsKLSAgc2VnVCBvbGRfc2VjOwotICBpbnQgb2xkX3N1YnNlYzsKLSAgY2hhciAqcGZyYWc7Ci0gIGludCBhbGlnbjI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKChzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSBzaXplKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAubGNvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICBhbGlnbiA9IDg7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoYWxpZ24gPD0gMCkKLQl7Ci0JICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgYWxpZ24gPSA4OwotCX0KLSAgICB9Ci0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLQotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJMZW5ndGggb2YgLmxjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCSAgICAgIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JICAgICAgKGxvbmcpIHNpemUpOwotCi0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBhbGxvY2F0ZV9ic3M6ICovCi0gIG9sZF9zZWMgPSBub3dfc2VnOwotICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgaWYgKGFsaWduKQotICAgIHsKLSAgICAgIC8qIGNvbnZlcnQgdG8gYSBwb3dlciBvZiAyIGFsaWdubWVudCAqLwotICAgICAgZm9yIChhbGlnbjIgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKythbGlnbjIpOwotICAgICAgaWYgKGFsaWduICE9IDEpCi0JewotCSAgYXNfYmFkIChfKCJDb21tb24gYWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBhbGlnbjIgPSAwOwotCi0gIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbjIpOwotICBzdWJzZWdfc2V0IChic3Nfc2VjdGlvbiwgMCk7Ci0gIGlmIChhbGlnbjIpCi0gICAgZnJhZ19hbGlnbiAoYWxpZ24yLCAwLCAwKTsKLSAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sUCwgZnJhZ19ub3cpOwotICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIHN5bWJvbFAsIHNpemUsCi0JCSAgICAoY2hhciAqKSAwKTsKLSAgKnBmcmFnID0gMDsKLSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWN0aW9uKTsKLSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFZhbGlkYXRlIGFueSByZWxvY2F0aW9ucyBlbWl0dGVkIGZvciAtbXJlbG9jYXRhYmxlLCBwb3NzaWJseSBhZGRpbmcKLSAgIGZpeHVwcyBmb3Igd29yZCByZWxvY2F0aW9ucyBpbiB3cml0YWJsZSBzZWdtZW50cywgc28gd2UgY2FuIGFkanVzdAotICAgdGhlbSBhdCBydW50aW1lLiAgKi8KLXN0YXRpYyB2b2lkCi1wcGNfZWxmX3ZhbGlkYXRlX2ZpeCAoZml4cCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICBzZWdUIHNlZzsKLXsKLSAgaWYgKGZpeHAtPmZ4X2RvbmUgfHwgZml4cC0+ZnhfcGNyZWwpCi0gICAgcmV0dXJuOwotCi0gIHN3aXRjaCAoc2hsaWIpCi0gICAgewotICAgIGNhc2UgU0hMSUJfTk9ORToKLSAgICBjYXNlIFNITElCX1BJQzoKLSAgICAgIHJldHVybjsKLQotICAgIGNhc2UgU0hJTEJfTVJFTE9DQVRBQkxFOgotICAgICAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA8PSBCRkRfUkVMT0NfVU5VU0VECi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzE2X0dPVE9GRgotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1NfR09UT0ZGCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzMyX0JBU0VSRUwKLQkgICYmIGZpeHAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfTE8xNl9CQVNFUkVMCi0JICAmJiBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfQkFTRVJFTAotCSAgJiYgZml4cC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19ISTE2X1NfQkFTRVJFTAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZ290MiIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLmR0b3JzIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuY3RvcnMiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5maXh1cCIpICE9IDAKLQkgICYmIHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWcpLCAiLnN0YWIiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5nY2NfZXhjZXB0X3RhYmxlIikgIT0gMAotCSAgJiYgc3RyY21wIChzZWdtZW50X25hbWUgKHNlZyksICIuZWhfZnJhbWUiKSAhPSAwCi0JICAmJiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoc2VnKSwgIi5leF9zaGFyZWQiKSAhPSAwKQotCXsKLQkgIGlmICgoc2VnLT5mbGFncyAmIChTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSkpICE9IDAKLQkgICAgICB8fCBmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0NUT1IpCi0JICAgIHsKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiUmVsb2NhdGlvbiBjYW5ub3QgYmUgZG9uZSB3aGVuIHVzaW5nIC1tcmVsb2NhdGFibGUiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQwKLSNpZmRlZiBURV9QRQotCi0vKgotICogU3VtbWFyeSBvZiBwYXJzZV90b2NfZW50cnkoKS4KLSAqCi0gKiBpbjoJSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byB0aGUgJ1snIGluIG9uZSBvZjoKLSAqCi0gKiAgICAgICAgW3RvY10gW3RvY3ZdIFt0b2MzMl0gW3RvYzY0XQotICoKLSAqICAgICAgQW55dGhpbmcgZWxzZSBpcyBhbiBlcnJvciBvZiBvbmUga2luZCBvciBhbm90aGVyLgotICoKLSAqIG91dDoJCi0gKiAgIHJldHVybiB2YWx1ZTogc3VjY2VzcyBvciBmYWlsdXJlCi0gKiAgIHRvY19raW5kOiAgICAga2luZCBvZiB0b2MgcmVmZXJlbmNlCi0gKiAgIGlucHV0X2xpbmVfcG9pbnRlcjoKLSAqICAgICBzdWNjZXNzOiBmaXJzdCBjaGFyIGFmdGVyIHRoZSAnXScKLSAqICAgICBmYWlsdXJlOiB1bmNoYW5nZWQKLSAqCi0gKiBzZXR0aW5nczoKLSAqCi0gKiAgICAgW3RvY10gICAtIHJ2ID09IHN1Y2Nlc3MsIHRvY19raW5kID0gZGVmYXVsdF90b2MKLSAqICAgICBbdG9jdl0gIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBkYXRhX2luX3RvYwotICogICAgIFt0b2MzMl0gLSBydiA9PSBzdWNjZXNzLCB0b2Nfa2luZCA9IG11c3RfYmVfMzIKLSAqICAgICBbdG9jNjRdIC0gcnYgPT0gc3VjY2VzcywgdG9jX2tpbmQgPSBtdXN0X2JlXzY0Ci0gKgotICovCi0KLWVudW0gdG9jX3NpemVfcXVhbGlmaWVyIAoteyAKLSAgZGVmYXVsdF90b2MsIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBzaG91bGQgYmUgdGhlIHN5c3RlbSBkZWZhdWx0IHNpemUgKi8KLSAgZGF0YV9pbl90b2MsIC8qIFRoaXMgaXMgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIGEgdG9jIGNlbGwgICAgICAgICAgICAgICAgICAgKi8KLSAgbXVzdF9iZV8zMiwgIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBtdXN0IGJlIDMyIGJpdHMgd2lkZSAgICAgICAgICAgICAgKi8KLSAgbXVzdF9iZV82NCAgIC8qIFRoZSB0b2MgY2VsbCBjb25zdHJ1Y3RlZCBtdXN0IGJlIDY0IGJpdHMgd2lkZSAgICAgICAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBpbnQKLXBhcnNlX3RvY19lbnRyeSh0b2Nfa2luZCkKLSAgICAgZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgKnRvY19raW5kOwotewotICBjaGFyICpzdGFydDsKLSAgY2hhciAqdG9jX3NwZWM7Ci0gIGNoYXIgYzsKLSAgZW51bSB0b2Nfc2l6ZV9xdWFsaWZpZXIgdDsKLQotICAvKiBzYXZlIHRoZSBpbnB1dF9saW5lX3BvaW50ZXIgKi8KLSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgLyogc2tpcCBvdmVyIHRoZSAnWycgLCBhbmQgd2hpdGVzcGFjZSAqLwotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICAKLSAgLyogZmluZCB0aGUgc3BlbGxpbmcgb2YgdGhlIG9wZXJhbmQgKi8KLSAgdG9jX3NwZWMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jIikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IGRlZmF1bHRfdG9jOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wKHRvY19zcGVjLCAidG9jdiIpID09IDApIAotICAgIHsKLSAgICAgIHQgPSBkYXRhX2luX3RvYzsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCh0b2Nfc3BlYywgInRvYzMyIikgPT0gMCkgCi0gICAgewotICAgICAgdCA9IG11c3RfYmVfMzI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAodG9jX3NwZWMsICJ0b2M2NCIpID09IDApIAotICAgIHsKLSAgICAgIHQgPSBtdXN0X2JlXzY0OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygic3ludGF4IGVycm9yOiBpbnZhbGlkIHRvYyBzcGVjaWZpZXIgYCVzJyIpLCB0b2Nfc3BlYyk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogbm93IGZpbmQgdGhlICddJyAqLwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0KLSAgU0tJUF9XSElURVNQQUNFICgpOwkgICAgIC8qIGxlYWRpbmcgd2hpdGVzcGFjZSBjb3VsZCBiZSB0aGVyZS4gKi8KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsgLyogaW5wdXRfbGluZV9wb2ludGVyLT5wYXN0IGNoYXIgaW4gYy4gKi8KLQotICBpZiAoYyAhPSAnXScpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3I6IGV4cGVjdGVkIGBdJywgZm91bmQgIGAlYyciKSwgYyk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsgLyogcmVzZXQgaW5wdXRfbGluZSBwb2ludGVyICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgKnRvY19raW5kID0gdDsgICAgICAgICAgICAgLyogc2V0IHJldHVybiB2YWx1ZSAqLwotICByZXR1cm4gMTsKLX0KLSNlbmRpZgotDAotCi0vKiBXZSBuZWVkIHRvIGtlZXAgYSBsaXN0IG9mIGZpeHVwcy4gIFdlIGNhbid0IHNpbXBseSBnZW5lcmF0ZSB0aGVtIGFzCi0gICB3ZSBnbywgYmVjYXVzZSB0aGF0IHdvdWxkIHJlcXVpcmUgdXMgdG8gZmlyc3QgY3JlYXRlIHRoZSBmcmFnLCBhbmQKLSAgIHRoYXQgd291bGQgc2NyZXcgdXAgcmVmZXJlbmNlcyB0byBgYC4nJy4gICovCi0KLXN0cnVjdCBwcGNfZml4dXAKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBpbnQgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdG8gYmUgYXNzZW1ibGVkLiAgKi8KLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBjaGFyICpzOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpvcGluZGV4X3B0cjsKLSAgaW50IHNraXBfb3B0aW9uYWw7Ci0gIGludCBuZWVkX3BhcmVuOwotICBpbnQgbmV4dF9vcGluZGV4OwotICBzdHJ1Y3QgcHBjX2ZpeHVwIGZpeHVwc1tNQVhfSU5TTl9GSVhVUFNdOwotICBpbnQgZmM7Ci0gIGNoYXIgKmY7Ci0gIGludCBpOwotI2lmZGVmIE9CSl9FTEYKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotI2VuZGlmCi0KLSAgLyogR2V0IHRoZSBvcGNvZGUuICAqLwotICBmb3IgKHMgPSBzdHI7ICpzICE9ICdcMCcgJiYgISBpc3NwYWNlICgqcyk7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgICpzKysgPSAnXDAnOwotCi0gIC8qIExvb2sgdXAgdGhlIG9wY29kZSBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIG9wY29kZSA9IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKikgaGFzaF9maW5kIChwcGNfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICopIE5VTEwpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfbWFjcm8gKm1hY3JvOwotCi0gICAgICBtYWNybyA9IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqKSBoYXNoX2ZpbmQgKHBwY19tYWNyb19oYXNoLCBzdHIpOwotICAgICAgaWYgKG1hY3JvID09IChjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyAqKSBOVUxMKQotCWFzX2JhZCAoXygiVW5yZWNvZ25pemVkIG9wY29kZTogYCVzJyIpLCBzdHIpOwotICAgICAgZWxzZQotCXBwY19tYWNybyAocywgbWFjcm8pOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLQotICBzdHIgPSBzOwotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgLyogUG93ZXJQQyBvcGVyYW5kcyBhcmUganVzdCBleHByZXNzaW9ucy4gIFRoZSBvbmx5IHJlYWwgaXNzdWUgaXMKLSAgICAgdGhhdCBhIGZldyBvcGVyYW5kIHR5cGVzIGFyZSBvcHRpb25hbC4gIEFsbCBjYXNlcyB3aGljaCBtaWdodCB1c2UKLSAgICAgYW4gb3B0aW9uYWwgb3BlcmFuZCBzZXBhcmF0ZSB0aGUgb3BlcmFuZHMgb25seSB3aXRoIGNvbW1hcyAoaW4KLSAgICAgc29tZSBjYXNlcyBwYXJlbnRoZXNlcyBhcmUgdXNlZCwgYXMgaW4gYGBsd3ogMSwwKDEpJycgYnV0IHN1Y2gKLSAgICAgY2FzZXMgbmV2ZXIgaGF2ZSBvcHRpb25hbCBvcGVyYW5kcykuICBUaGVyZSBpcyBuZXZlciBtb3JlIHRoYW4KLSAgICAgb25lIG9wdGlvbmFsIG9wZXJhbmQgZm9yIGFuIGluc3RydWN0aW9uLiAgU28sIGJlZm9yZSB3ZSBzdGFydAotICAgICBzZXJpb3VzbHkgcGFyc2luZyB0aGUgb3BlcmFuZHMsIHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFuCi0gICAgIG9wdGlvbmFsIG9wZXJhbmQsIGFuZCwgaWYgd2UgZG8sIHdlIGNvdW50IHRoZSBudW1iZXIgb2YgY29tbWFzIHRvCi0gICAgIHNlZSB3aGV0aGVyIHRoZSBvcGVyYW5kIHNob3VsZCBiZSBvbWl0dGVkLiAgKi8KLSAgc2tpcF9vcHRpb25hbCA9IDA7Ci0gIGZvciAob3BpbmRleF9wdHIgPSBvcGNvZGUtPm9wZXJhbmRzOyAqb3BpbmRleF9wdHIgIT0gMDsgb3BpbmRleF9wdHIrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotCi0gICAgICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9PUFRJT05BTCkgIT0gMCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgb3Bjb3VudDsKLQotCSAgLyogVGhlcmUgaXMgYW4gb3B0aW9uYWwgb3BlcmFuZC4gIENvdW50IHRoZSBudW1iZXIgb2YKLQkgICAgIGNvbW1hcyBpbiB0aGUgaW5wdXQgbGluZS4gICovCi0JICBpZiAoKnN0ciA9PSAnXDAnKQotCSAgICBvcGNvdW50ID0gMDsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wY291bnQgPSAxOwotCSAgICAgIHMgPSBzdHI7Ci0JICAgICAgd2hpbGUgKChzID0gc3RyY2hyIChzLCAnLCcpKSAhPSAoY2hhciAqKSBOVUxMKQotCQl7Ci0JCSAgKytvcGNvdW50OwotCQkgICsrczsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIElmIHRoZXJlIGFyZSBmZXdlciBvcGVyYW5kcyBpbiB0aGUgbGluZSB0aGVuIGFyZSBjYWxsZWQKLQkgICAgIGZvciBieSB0aGUgaW5zdHJ1Y3Rpb24sIHdlIHdhbnQgdG8gc2tpcCB0aGUgb3B0aW9uYWwKLQkgICAgIG9wZXJhbmQuICAqLwotCSAgaWYgKG9wY291bnQgPCBzdHJsZW4gKG9wY29kZS0+b3BlcmFuZHMpKQotCSAgICBza2lwX29wdGlvbmFsID0gMTsKLQotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBHYXRoZXIgdGhlIG9wZXJhbmRzLiAgKi8KLSAgbmVlZF9wYXJlbiA9IDA7Ci0gIG5leHRfb3BpbmRleCA9IDA7Ci0gIGZjID0gMDsKLSAgZm9yIChvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4X3B0ciAhPSAwOyBvcGluZGV4X3B0cisrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBjb25zdCBjaGFyICplcnJtc2c7Ci0gICAgICBjaGFyICpob2xkOwotICAgICAgZXhwcmVzc2lvblMgZXg7Ci0gICAgICBjaGFyIGVuZGM7Ci0KLSAgICAgIGlmIChuZXh0X29waW5kZXggPT0gMCkKLQlvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcGVyYW5kID0gJnBvd2VycGNfb3BlcmFuZHNbbmV4dF9vcGluZGV4XTsKLQkgIG5leHRfb3BpbmRleCA9IDA7Ci0JfQotCi0gICAgICBlcnJtc2cgPSBOVUxMOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgZmFrZSBvcGVyYW5kLCB0aGVuIHdlIGRvIG5vdCBleHBlY3QgYW55dGhpbmcKLQkgZnJvbSB0aGUgaW5wdXQuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZBS0UpICE9IDApCi0JewotCSAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgMEwsICZlcnJtc2cpOwotCSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKSBOVUxMKQotCSAgICBhc19iYWQgKGVycm1zZyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gb3B0aW9uYWwgb3BlcmFuZCwgYW5kIHdlIGFyZSBza2lwcGluZyBpdCwganVzdAotCSBpbnNlcnQgYSB6ZXJvLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9PUFRJT05BTCkgIT0gMAotCSAgJiYgc2tpcF9vcHRpb25hbCkKLQl7Ci0JICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotCSAgICB7Ci0JICAgICAgaW5zbiA9ICgqb3BlcmFuZC0+aW5zZXJ0KSAoaW5zbiwgMEwsICZlcnJtc2cpOwotCSAgICAgIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKikgTlVMTCkKLQkJYXNfYmFkIChlcnJtc2cpOwotCSAgICB9Ci0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfTkVYVCkgIT0gMCkKLQkgICAgbmV4dF9vcGluZGV4ID0gKm9waW5kZXhfcHRyICsgMTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogR2F0aGVyIHRoZSBvcGVyYW5kLiAgKi8KLSAgICAgIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSNpZmRlZiBURV9QRQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1snKSAKLQl7Ci0JICAvKiBXZSBhcmUgZXhwZWN0aW5nIHNvbWV0aGluZyBsaWtlIHRoZSBzZWNvbmQgYXJndW1lbnQgaGVyZToKLQotCSAgICAgICAgbHd6IHI0LFt0b2NdLkdTLjAuc3RhdGljX2ludChydG9jKQotICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KLQkgICAgIFRoZSBhcmd1bWVudCBmb2xsb3dpbmcgdGhlIGBdJyBtdXN0IGJlIGEgc3ltYm9sIG5hbWUsIGFuZCB0aGUgCi0gICAgICAgICAgICAgcmVnaXN0ZXIgbXVzdCBiZSB0aGUgdG9jIHJlZ2lzdGVyOiAncnRvYycgb3IgJzInCi0KLQkgICAgIFRoZSBlZmZlY3QgaXMgdG8gMCBhcyB0aGUgZGlzcGxhY2VtZW50IGZpZWxkCi0JICAgICBpbiB0aGUgaW5zdHJ1Y3Rpb24sIGFuZCBpc3N1ZSBhbiBJTUFHRV9SRUxfUFBDX1RPQ1JFTDE2IChvcgotCSAgICAgdGhlIGFwcHJvcHJpYXRlIHZhcmlhdGlvbikgcmVsb2MgYWdhaW5zdCBpdCBiYXNlZCBvbiB0aGUgc3ltYm9sLgotCSAgICAgVGhlIGxpbmtlciB3aWxsIGJ1aWxkIHRoZSB0b2MsIGFuZCBpbnNlcnQgdGhlIHJlc29sdmVkIHRvYyBvZmZzZXQuCi0KLQkgICAgIE5vdGU6Ci0JICAgICBvIFRoZSBzaXplIG9mIHRoZSB0b2MgZW50cnkgaXMgY3VycmVudGx5IGFzc3VtZWQgdG8gYmUKLQkgICAgICAgMzIgYml0cy4gVGhpcyBzaG91bGQgbm90IGJlIGFzc3VtZWQgdG8gYmUgYSBoYXJkIGNvZGVkCi0JICAgICAgIG51bWJlci4KLQkgICAgIG8gSW4gYW4gZWZmb3J0IHRvIGNvcGUgd2l0aCBhIGNoYW5nZSBmcm9tIDMyIHRvIDY0IGJpdHMsCi0JICAgICAgIHRoZXJlIGFyZSBhbHNvIHRvYyBlbnRyaWVzIHRoYXQgYXJlIHNwZWNpZmllZCB0byBiZQotCSAgICAgICBlaXRoZXIgMzIgb3IgNjQgYml0czoKLSAgICAgICAgICAgICAgICAgbHd6IHI0LFt0b2MzMl0uR1MuMC5zdGF0aWNfaW50KHJ0b2MpCi0JICAgICAgICAgbHd6IHI0LFt0b2M2NF0uR1MuMC5zdGF0aWNfaW50KHJ0b2MpCi0JICAgICAgIFRoZXNlIGRlbWFuZCB0b2MgZW50cmllcyBvZiB0aGUgc3BlY2lmaWVkIHNpemUsIGFuZCB0aGUKLQkgICAgICAgaW5zdHJ1Y3Rpb24gcHJvYmFibHkgcmVxdWlyZXMgaXQuCi0gICAgICAgICAgKi8KLQotCSAgaW50IHZhbGlkX3RvYzsKLQkgIGVudW0gdG9jX3NpemVfcXVhbGlmaWVyIHRvY19raW5kOwotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHRvY19yZWxvYzsKLQotCSAgLyogZ28gcGFyc2Ugb2ZmIHRoZSBbdG9jWFhdIHBhcnQgKi8KLQkgIHZhbGlkX3RvYyA9IHBhcnNlX3RvY19lbnRyeSgmdG9jX2tpbmQpOwotCi0JICBpZiAoIXZhbGlkX3RvYykgCi0JICAgIHsKLQkgICAgICAvKiBOb3RlOiBtZXNzYWdlIGhhcyBhbHJlYWR5IGJlZW4gaXNzdWVkLiAgICAgKi8KLQkgICAgICAvKiBGSVhNRTogd2hhdCBzb3J0IG9mIHJlY292ZXJ5IHNob3VsZCB3ZSBkbz8gKi8KLQkgICAgICAvKiAgICAgICAgZGVtYW5kX3Jlc3Rfb2ZfbGluZSgpOyByZXR1cm47ID8gICAgKi8KLQkgICAgfQotCi0JICAvKiBOb3cgZ2V0IHRoZSBzeW1ib2wgZm9sbG93aW5nIHRoZSAnXScgKi8KLQkgIGV4cHJlc3Npb24oJmV4KTsKLQotCSAgc3dpdGNoICh0b2Nfa2luZCkKLQkgICAgewotCSAgICBjYXNlIGRlZmF1bHRfdG9jOgotCSAgICAgIC8qIEluIHRoaXMgY2FzZSwgd2UgbWF5IG5vdCBoYXZlIHNlZW4gdGhlIHN5bWJvbCB5ZXQsIHNpbmNlICAqLwotCSAgICAgIC8qIGl0IGlzIGFsbG93ZWQgdG8gYXBwZWFyIG9uIGEgLmV4dGVybiBvciAuZ2xvYmwgb3IganVzdCBiZSAqLwotCSAgICAgIC8qIGEgbGFiZWwgaW4gdGhlIC5kYXRhIHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIHRvY19yZWxvYyA9IEJGRF9SRUxPQ19QUENfVE9DMTY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgZGF0YV9pbl90b2M6Ci0JICAgICAgLyogMS4gVGhlIHN5bWJvbCBtdXN0IGJlIGRlZmluZWQgYW5kIGVpdGhlciBpbiB0aGUgdG9jICAgICAgICAqLwotCSAgICAgIC8qICAgIHNlY3Rpb24sIG9yIGEgZ2xvYmFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkgICAgICAvKiAyLiBUaGUgcmVsb2MgZ2VuZXJhdGVkIG11c3QgaGF2ZSB0aGUgVE9DREVGTiBmbGFnIHNldCBpbiAgICovCi0JICAgICAgLyogICAgdXBwZXIgYml0IG1lc3Mgb2YgdGhlIHJlbG9jIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotCSAgICAgIC8qIEZJWE1FOiBJdCdzIGEgbGl0dGxlIGNvbmZ1c2luZyB3aGF0IHRoZSB0b2N2IHF1YWxpZmllciBjYW4gKi8KLQkgICAgICAvKiAgICAgICAgYmUgdXNlZCBmb3IuIEF0IHRoZSB2ZXJ5IGxlYXN0LCBJJ3ZlIHNlZW4gdGhyZWUgICAgICovCi0JICAgICAgLyogICAgICAgIHVzZXMsIG9ubHkgb25lIG9mIHdoaWNoIEknbSBzdXJlIEkgY2FuIGV4cGxhaW4uICAgICAqLwotCSAgICAgIGlmIChleC5YX29wID09IE9fc3ltYm9sKSAKLQkJewkJICAKLQkJICBhc3NlcnQgKGV4LlhfYWRkX3N5bWJvbCAhPSBOVUxMKTsKLQkJICBpZiAoc3ltYm9sX2dldF9iZmRzeW0gKGV4LlhfYWRkX3N5bWJvbCktPnNlY3Rpb24KLQkJICAgICAgIT0gdG9jZGF0YV9zZWN0aW9uKQotCQkgICAgewotCQkgICAgICBhc19iYWQoXygiW3RvY3ZdIHN5bWJvbCBpcyBub3QgYSB0b2Mgc3ltYm9sIikpOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIG11c3RfYmVfMzI6Ci0JICAgICAgLyogRklYTUU6IHRoZXNlIG5leHQgdHdvIHNwZWNpZmljYWxseSBzcGVjaWZ5IDMyLzY0IGJpdCB0b2MgICAqLwotCSAgICAgIC8qICAgICAgICBlbnRyaWVzLiBXZSBkb24ndCBzdXBwb3J0IHRoZW0gdG9kYXkuIElzIHRoaXMgdGhlICAgKi8KLQkgICAgICAvKiAgICAgICAgcmlnaHQgd2F5IHRvIHNheSB0aGF0PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JICAgICAgdG9jX3JlbG9jID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkgICAgICBhc19iYWQgKF8oIlVuaW1wbGVtZW50ZWQgdG9jMzIgZXhwcmVzc2lvbiBtb2RpZmllciIpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBtdXN0X2JlXzY0OgotCSAgICAgIC8qIEZJWE1FOiBzZWUgYWJvdmUgKi8KLQkgICAgICB0b2NfcmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgICAgIGFzX2JhZCAoXygiVW5pbXBsZW1lbnRlZCB0b2M2NCBleHByZXNzaW9uIG1vZGlmaWVyIikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYoc3RkZXJyLCAKLQkJICAgICAgXygiVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgWyVkXSBmcm9tIHBhcnNlX3RvY19lbnRyeSFcbiIpLAotCQkgICAgICB0b2Nfa2luZCk7Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCi0JICBmaXh1cHNbZmNdLnJlbG9jID0gdG9jX3JlbG9jOwotCSAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgIGZpeHVwc1tmY10ub3BpbmRleCA9ICpvcGluZGV4X3B0cjsKLQkgICsrZmM7Ci0KLSAgICAgICAgICAvKiBPay4gV2UndmUgc2V0IHVwIHRoZSBmaXh1cCBmb3IgdGhlIGluc3RydWN0aW9uLiBOb3cgbWFrZSBpdAotCSAgICAgbG9vayBsaWtlIHRoZSBjb25zdGFudCAwIHdhcyBmb3VuZCBoZXJlICovCi0JICBleC5YX3Vuc2lnbmVkID0gMTsKLQkgIGV4Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgZXguWF9hZGRfbnVtYmVyID0gMDsKLQkgIGV4LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICBleC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBlbHNlCi0jZW5kaWYJCS8qIFRFX1BFICovCi0JewotCSAgaWYgKCEgcmVnaXN0ZXJfbmFtZSAoJmV4KSkKLQkgICAgewotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9DUikgIT0gMCkKLQkJY3Jfb3BlcmFuZCA9IHRydWU7Ci0JICAgICAgZXhwcmVzc2lvbiAoJmV4KTsKLQkgICAgICBjcl9vcGVyYW5kID0gZmFsc2U7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHN0ciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0KLSAgICAgIGlmIChleC5YX29wID09IE9faWxsZWdhbCkKLQlhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLSAgICAgIGVsc2UgaWYgKGV4Llhfb3AgPT0gT19hYnNlbnQpCi0JYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gICAgICBlbHNlIGlmIChleC5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgaW5zbiA9IHBwY19pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAotCQkJCSAgICAgKGNoYXIgKikgTlVMTCwgMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoZXguWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLSNpZmRlZiBPQkpfRUxGCi0JICAvKiBBbGxvdyBASEEsIEBMLCBASCBvbiBjb25zdGFudHMuICovCi0JICBjaGFyICpvcmlnX3N0ciA9IHN0cjsKLQotCSAgaWYgKChyZWxvYyA9IHBwY19lbGZfc3VmZml4ICgmc3RyLCAmZXgpKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICBzd2l0Y2ggKHJlbG9jKQotCSAgICAgIHsKLQkgICAgICBkZWZhdWx0OgotCQlzdHIgPSBvcmlnX3N0cjsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCQkvKiBYX3Vuc2lnbmVkIGlzIHRoZSBkZWZhdWx0LCBzbyBpZiB0aGUgdXNlciBoYXMgZG9uZQotICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyB3aGljaCBjbGVhcmVkIGl0LCB3ZSBhbHdheXMgcHJvZHVjZSBhCi0gICAgICAgICAgICAgICAgICAgc2lnbmVkIHZhbHVlLiAgKi8KLQkJaWYgKGV4LlhfdW5zaWduZWQKLQkJICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1NJR05FRCkgPT0gMCkKLQkJICBleC5YX2FkZF9udW1iZXIgJj0gMHhmZmZmOwotCQllbHNlCi0JCSAgZXguWF9hZGRfbnVtYmVyID0gKCgoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmKQotCQkJCSAgICAgIF4gMHg4MDAwKQotCQkJCSAgICAgLSAweDgwMDApOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JCWV4LlhfYWRkX251bWJlciA9IChleC5YX2FkZF9udW1iZXIgPj4gMTYpICYgMHhmZmZmOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkJZXguWF9hZGRfbnVtYmVyID0gKCgoZXguWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZikKLQkJCQkgICArICgoZXguWF9hZGRfbnVtYmVyID4+IDE1KSAmIDEpKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotI2VuZGlmCi0JICBpbnNuID0gcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCi0JCQkJICAgICAoY2hhciAqKSBOVUxMLCAwKTsKLQl9Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgZWxzZSBpZiAoKHJlbG9jID0gcHBjX2VsZl9zdWZmaXggKCZzdHIsICZleCkpICE9IEJGRF9SRUxPQ19VTlVTRUQpCi0JewotCSAgLyogRm9yIHRoZSBhYnNvdWx0ZSBmb3JtcyBvZiBicmFuY2hzLCBjb252ZXJ0IHRoZSBQQyByZWxhdGl2ZSBmb3JtIGJhY2sgaW50bwotCSAgICAgdGhlIGFic29sdXRlLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMCkKLQkgICAgewotCSAgICAgIHN3aXRjaCAocmVsb2MpCi0JCXsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IyNjoKLQkJICByZWxvYyA9IEJGRF9SRUxPQ19QUENfQkEyNjsKLQkJICBicmVhazsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IxNjoKLQkJICByZWxvYyA9IEJGRF9SRUxPQ19QUENfQkExNjsKLQkJICBicmVhazsKLQkJY2FzZSBCRkRfUkVMT0NfUFBDX0IxNl9CUlRBS0VOOgotCQkgIHJlbG9jID0gQkZEX1JFTE9DX1BQQ19CQTE2X0JSVEFLRU47Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQkZEX1JFTE9DX1BQQ19CMTZfQlJOVEFLRU46Ci0JCSAgcmVsb2MgPSBCRkRfUkVMT0NfUFBDX0JBMTZfQlJOVEFLRU47Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgIGZpeHVwc1tmY10ub3BpbmRleCA9IDA7Ci0JICBmaXh1cHNbZmNdLnJlbG9jID0gcmVsb2M7Ci0JICArK2ZjOwotCX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBuZWVkIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIHRoaXMgZXhwcmVzc2lvbi4gICovCi0JICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCSAgICBhc19mYXRhbCAoXygidG9vIG1hbnkgZml4dXBzIikpOwotCSAgZml4dXBzW2ZjXS5leHAgPSBleDsKLQkgIGZpeHVwc1tmY10ub3BpbmRleCA9ICpvcGluZGV4X3B0cjsKLQkgIGZpeHVwc1tmY10ucmVsb2MgPSBCRkRfUkVMT0NfVU5VU0VEOwotCSAgKytmYzsKLQl9Ci0KLSAgICAgIGlmIChuZWVkX3BhcmVuKQotCXsKLQkgIGVuZGMgPSAnKSc7Ci0JICBuZWVkX3BhcmVuID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpICE9IDApCi0JewotCSAgZW5kYyA9ICcoJzsKLQkgIG5lZWRfcGFyZW4gPSAxOwotCX0KLSAgICAgIGVsc2UKLQllbmRjID0gJywnOwotCi0gICAgICAvKiBUaGUgY2FsbCB0byBleHByZXNzaW9uIHNob3VsZCBoYXZlIGFkdmFuY2VkIHN0ciBwYXN0IGFueQotCSB3aGl0ZXNwYWNlLiAgKi8KLSAgICAgIGlmICgqc3RyICE9IGVuZGMKLQkgICYmIChlbmRjICE9ICcsJyB8fCAqc3RyICE9ICdcMCcpKQotCXsKLQkgIGFzX2JhZCAoXygic3ludGF4IGVycm9yOyBmb3VuZCBgJWMnIGJ1dCBleHBlY3RlZCBgJWMnIiksICpzdHIsIGVuZGMpOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoKnN0ciAhPSAnXDAnKQotCSsrc3RyOwotICAgIH0KLQotICB3aGlsZSAoaXNzcGFjZSAoKnN0cikpCi0gICAgKytzdHI7Ci0KLSAgaWYgKCpzdHIgIT0gJ1wwJykKLSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0KLSAgLyogQ3JlYXRlIGFueSBmaXh1cHMuICBBdCB0aGlzIHBvaW50IHdlIGRvIG5vdCB1c2UgYQotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUsIGJ1dCBpbnN0ZWFkIGp1c3QgdXNlIHRoZQotICAgICBCRkRfUkVMT0NfVU5VU0VEIHBsdXMgdGhlIG9wZXJhbmQgaW5kZXguICBUaGlzIGxldHMgdXMgZWFzaWx5Ci0gICAgIGhhbmRsZSBmaXh1cHMgZm9yIGFueSBvcGVyYW5kIHR5cGUsIGFsdGhvdWdoIHRoYXQgaXMgYWRtaXR0ZWRseQotICAgICBub3QgYSB2ZXJ5IGV4Y2l0aW5nIGZlYXR1cmUuICBXZSBwaWNrIGEgQkZEIHJlbG9jIHR5cGUgaW4KLSAgICAgbWRfYXBwbHlfZml4LiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGZjOyBpKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLQotICAgICAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzW2ZpeHVwc1tpXS5vcGluZGV4XTsKLSAgICAgIGlmIChmaXh1cHNbaV0ucmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICpyZWxvY19ob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAoc3Rkb3V0cHV0LCBmaXh1cHNbaV0ucmVsb2MpOwotCSAgaW50IHNpemU7Ci0JICBpbnQgb2Zmc2V0OwotCSAgZml4UyAqZml4UDsKLQotCSAgaWYgKCFyZWxvY19ob3d0bykKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQkgIG9mZnNldCA9IHRhcmdldF9iaWdfZW5kaWFuID8gKDQgLSBzaXplKSA6IDA7Ci0KLQkgIGlmIChzaXplIDwgMSB8fCBzaXplID4gNCkKLQkgICAgYWJvcnQoKTsKLQotCSAgZml4UCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsICsgb2Zmc2V0LCBzaXplLAotCQkJICAgICAgJmZpeHVwc1tpXS5leHAsIHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCSAgICAgIGZpeHVwc1tpXS5yZWxvYyk7Ci0KLQkgIC8qIFR1cm4gb2ZmIGNvbXBsYWludHMgdGhhdCB0aGUgYWRkZW5kIGlzIHRvbyBsYXJnZSBmb3IgdGhpbmdzIGxpa2UKLQkgICAgIGZvbysxMDAwMDBAaGEuICAqLwotCSAgc3dpdGNoIChmaXh1cHNbaV0ucmVsb2MpCi0JICAgIHsKLQkgICAgY2FzZSBCRkRfUkVMT0NfMTZfR09UT0ZGOgotCSAgICBjYXNlIEJGRF9SRUxPQ19QUENfVE9DMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0xPMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JICAgIGNhc2UgQkZEX1JFTE9DX0hJMTZfUzoKLQkgICAgICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JZml4X25ld19leHAgKGZyYWdfbm93LCBmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCSAgICAgJmZpeHVwc1tpXS5leHAsCi0JCSAgICAgKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDAsCi0JCSAgICAgKChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpCi0JCSAgICAgICAoZml4dXBzW2ldLm9waW5kZXggKyAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKSkpOwotICAgIH0KLX0KLQotLyogSGFuZGxlIGEgbWFjcm8uICBHYXRoZXIgYWxsIHRoZSBvcGVyYW5kcywgdHJhbnNmb3JtIHRoZW0gYXMKLSAgIGRlc2NyaWJlZCBieSB0aGUgbWFjcm8sIGFuZCBjYWxsIG1kX2Fzc2VtYmxlIHJlY3Vyc2l2ZWx5LiAgQWxsIHRoZQotICAgb3BlcmFuZHMgYXJlIHNlcGFyYXRlZCBieSBjb21tYXM7IHdlIGRvbid0IGFjY2VwdCBwYXJlbnRoZXNlcwotICAgYXJvdW5kIG9wZXJhbmRzIGhlcmUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX21hY3JvIChzdHIsIG1hY3JvKQotICAgICBjaGFyICpzdHI7Ci0gICAgIGNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvICptYWNybzsKLXsKLSAgY2hhciAqb3BlcmFuZHNbMTBdOwotICB1bnNpZ25lZCBpbnQgY291bnQ7Ci0gIGNoYXIgKnM7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgaW50IGFyZzsKLSAgY2hhciAqc2VuZDsKLSAgY2hhciAqY29tcGxldGU7Ci0KLSAgLyogR2F0aGVyIHRoZSB1c2VycyBvcGVyYW5kcyBpbnRvIHRoZSBvcGVyYW5kcyBhcnJheS4gICovCi0gIGNvdW50ID0gMDsKLSAgcyA9IHN0cjsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaWYgKGNvdW50ID49IHNpemVvZiBvcGVyYW5kcyAvIHNpemVvZiBvcGVyYW5kc1swXSkKLQlicmVhazsKLSAgICAgIG9wZXJhbmRzW2NvdW50KytdID0gczsKLSAgICAgIHMgPSBzdHJjaHIgKHMsICcsJyk7Ci0gICAgICBpZiAocyA9PSAoY2hhciAqKSBOVUxMKQotCWJyZWFrOwotICAgICAgKnMrKyA9ICdcMCc7Ci0gICAgfSAgCi0KLSAgaWYgKGNvdW50ICE9IG1hY3JvLT5vcGVyYW5kcykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIndyb25nIG51bWJlciBvZiBvcGVyYW5kcyIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogV29yayBvdXQgaG93IGxhcmdlIHRoZSBzdHJpbmcgbXVzdCBiZSAodGhlIHNpemUgaXMgdW5ib3VuZGVkCi0gICAgIGJlY2F1c2UgaXQgaW5jbHVkZXMgdXNlciBpbnB1dCkuICAqLwotICBsZW4gPSAwOwotICBmb3JtYXQgPSBtYWNyby0+Zm9ybWF0OwotICB3aGlsZSAoKmZvcm1hdCAhPSAnXDAnKQotICAgIHsKLSAgICAgIGlmICgqZm9ybWF0ICE9ICclJykKLQl7Ci0JICArK2xlbjsKLQkgICsrZm9ybWF0OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhcmcgPSBzdHJ0b2wgKGZvcm1hdCArIDEsICZzZW5kLCAxMCk7Ci0JICBrbm93IChzZW5kICE9IGZvcm1hdCAmJiBhcmcgPj0gMCAmJiBhcmcgPCBjb3VudCk7Ci0JICBsZW4gKz0gc3RybGVuIChvcGVyYW5kc1thcmddKTsKLQkgIGZvcm1hdCA9IHNlbmQ7Ci0JfQotICAgIH0KLQotICAvKiBQdXQgdGhlIHN0cmluZyB0b2dldGhlci4gICovCi0gIGNvbXBsZXRlID0gcyA9IChjaGFyICopIGFsbG9jYSAobGVuICsgMSk7Ci0gIGZvcm1hdCA9IG1hY3JvLT5mb3JtYXQ7Ci0gIHdoaWxlICgqZm9ybWF0ICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCpmb3JtYXQgIT0gJyUnKQotCSpzKysgPSAqZm9ybWF0Kys7Ci0gICAgICBlbHNlCi0JewotCSAgYXJnID0gc3RydG9sIChmb3JtYXQgKyAxLCAmc2VuZCwgMTApOwotCSAgc3RyY3B5IChzLCBvcGVyYW5kc1thcmddKTsKLQkgIHMgKz0gc3RybGVuIChzKTsKLQkgIGZvcm1hdCA9IHNlbmQ7Ci0JfQotICAgIH0KLSAgKnMgPSAnXDAnOwotCi0gIC8qIEFzc2VtYmxlIHRoZSBjb25zdHJ1Y3RlZCBpbnN0cnVjdGlvbi4gICovCi0gIG1kX2Fzc2VtYmxlIChjb21wbGV0ZSk7Ci19ICAKLQwKLSNpZmRlZiBPQkpfRUxGCi0vKiBGb3IgRUxGLCBhZGQgc3VwcG9ydCBmb3IgU0hGX0VYQ0xVREUgYW5kIFNIVF9PUkRFUkVEICovCi0KLWludAotcHBjX3NlY3Rpb25fbGV0dGVyIChsZXR0ZXIsIHB0cl9tc2cpCi0gICAgIGludCBsZXR0ZXI7Ci0gICAgIGNoYXIgKipwdHJfbXNnOwotewotICBpZiAobGV0dGVyID09ICdlJykKLSAgICByZXR1cm4gU0hGX0VYQ0xVREU7Ci0KLSAgKnB0cl9tc2cgPSBfKCJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlOiB3YW50IGEsdyx4LGUgaW4gc3RyaW5nIik7Ci0gIHJldHVybiAwOwotfQotCi1pbnQKLXBwY19zZWN0aW9uX3dvcmQgKHN0ciwgbGVuKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIGlmIChsZW4gPT0gNyAmJiBzdHJuY21wIChzdHIsICJleGNsdWRlIiwgNykgPT0gMCkKLSAgICByZXR1cm4gU0hGX0VYQ0xVREU7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQKLXBwY19zZWN0aW9uX3R5cGUgKHN0ciwgbGVuKQotICAgICBjaGFyICpzdHI7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIGlmIChsZW4gPT0gNyAmJiBzdHJuY21wIChzdHIsICJvcmRlcmVkIiwgNykgPT0gMCkKLSAgICByZXR1cm4gU0hUX09SREVSRUQ7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQKLXBwY19zZWN0aW9uX2ZsYWdzIChmbGFncywgYXR0ciwgdHlwZSkKLSAgICAgaW50IGZsYWdzOwotICAgICBpbnQgYXR0cjsKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGlmICh0eXBlID09IFNIVF9PUkRFUkVEKQotICAgIGZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1NPUlRfRU5UUklFUzsKLQotICBpZiAoYXR0ciAmIFNIRl9FWENMVURFKQotICAgIGZsYWdzIHw9IFNFQ19FWENMVURFOwotCi0gIHJldHVybiBmbGFnczsKLX0KLSNlbmRpZiAvKiBPQkpfRUxGICovCi0KLQwKLS8qIFBzZXVkby1vcCBoYW5kbGluZy4gICovCi0KLS8qIFRoZSAuYnl0ZSBwc2V1ZG8tb3AuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIG5vcm1hbCAuYnl0ZQotICAgcHNldWRvLW9wLCBidXQgaXQgY2FuIGFsc28gdGFrZSBhIHNpbmdsZSBBU0NJSSBzdHJpbmcuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2J5dGUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKLSAgICB7Ci0gICAgICBjb25zICgxKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogR2F0aGVyIGNoYXJhY3RlcnMuICBBIHJlYWwgZG91YmxlIHF1b3RlIGlzIGRvdWJsZWQuICBVbnVzdWFsCi0gICAgIGNoYXJhY3RlcnMgYXJlIG5vdCBwZXJtaXR0ZWQuICAqLwotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciBjOwotCi0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gICAgICBpZiAoYyA9PSAnXCInKQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcIicpCi0JICAgIGJyZWFrOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotCi0gICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKGMpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotI2lmZGVmIE9CSl9YQ09GRgotCi0vKiBYQ09GRiBzcGVjaWZpYyBwc2V1ZG8tb3AgaGFuZGxpbmcuICAqLwotCi0vKiBUaGlzIGlzIHNldCBpZiB3ZSBhcmUgY3JlYXRpbmcgYSAuc3RhYnggc3ltYm9sLCBzaW5jZSB3ZSBkb24ndCB3YW50Ci0gICB0byBoYW5kbGUgc3ltYm9sIHN1ZmZpeGVzIGZvciBzdWNoIHN5bWJvbHMuICAqLwotc3RhdGljIGJvb2xlYW4gcHBjX3N0YWJfc3ltYm9sOwotCi0vKiBUaGUgLmNvbW0gYW5kIC5sY29tbSBwc2V1ZG8tb3BzIGZvciBYQ09GRi4gIFhDT0ZGIHB1dHMgY29tbW9uCi0gICBzeW1ib2xzIGluIHRoZSAuYnNzIHNlZ21lbnQgYXMgdGhvdWdoIHRoZXkgd2VyZSBsb2NhbCBjb21tb24KLSAgIHN5bWJvbHMsIGFuZCB1c2VzIGEgZGlmZmVyZW50IHNtY2xhcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY29tbSAobGNvbW0pCi0gICAgIGludCBsY29tbTsKLXsKLSAgYXNlY3Rpb24gKmN1cnJlbnRfc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgY2hhciAqZW5kX25hbWU7Ci0gIG9mZnNldFQgc2l6ZTsKLSAgb2Zmc2V0VCBhbGlnbjsKLSAgc3ltYm9sUyAqbGNvbW1fc3ltID0gTlVMTDsKLSAgc3ltYm9sUyAqc3ltOwotICBjaGFyICpwZnJhZzsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVuZF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqZW5kX25hbWUgPSBlbmRjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3Npbmcgc2l6ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm5lZ2F0aXZlIHNpemUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoISBsY29tbSkKLSAgICB7Ci0gICAgICAvKiBUaGUgdGhpcmQgYXJndW1lbnQgdG8gLmNvbW0gaXMgdGhlIGFsaWdubWVudC4gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JYWxpZ24gPSAzOwotICAgICAgZWxzZQotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQkgIGlmIChhbGlnbiA8PSAwKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiaWdub3JpbmcgYmFkIGFsaWdubWVudCIpKTsKLQkgICAgICBhbGlnbiA9IDM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbGNvbW1fbmFtZTsKLSAgICAgIGNoYXIgbGNvbW1fZW5kYzsKLQotICAgICAgaWYgKHNpemUgPD0gMSkKLQlhbGlnbiA9IDA7Ci0gICAgICBlbHNlIGlmIChzaXplIDw9IDIpCi0JYWxpZ24gPSAxOwotICAgICAgZWxzZSBpZiAoc2l6ZSA8PSA0KQotCWFsaWduID0gMjsKLSAgICAgIGVsc2UKLQlhbGlnbiA9IDM7Ci0KLSAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAubGNvbW0gYXBwZWFycyB0byBiZSB0aGUgcmVhbCBsb2NhbAotCSBjb21tb24gc3ltYm9sIHRvIGNyZWF0ZS4gIFJlZmVyZW5jZXMgdG8gdGhlIHN5bWJvbCBuYW1lZCBpbgotCSB0aGUgZmlyc3QgYXJndW1lbnQgYXJlIHR1cm5lZCBpbnRvIHJlZmVyZW5jZXMgdG8gdGhlIHRoaXJkCi0JIGFyZ3VtZW50LiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQl7Ci0JICBhc19iYWQgKF8oIm1pc3NpbmcgcmVhbCBzeW1ib2wgbmFtZSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIGxjb21tX25hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBsY29tbV9lbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICAKLSAgICAgIGxjb21tX3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKGxjb21tX25hbWUpOwotCi0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbGNvbW1fZW5kYzsKLSAgICB9Ci0KLSAgKmVuZF9uYW1lID0gJ1wwJzsKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICplbmRfbmFtZSA9IGVuZGM7Ci0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKQotICAgICAgfHwgU19HRVRfVkFMVUUgKHN5bSkgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gIHJlY29yZF9hbGlnbm1lbnQgKGJzc19zZWN0aW9uLCBhbGlnbik7Ci0JICAKLSAgaWYgKCEgbGNvbW0KLSAgICAgIHx8ICEgU19JU19ERUZJTkVEIChsY29tbV9zeW0pKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmRlZl9zeW07Ci0gICAgICBvZmZzZXRUIGRlZl9zaXplOwotCi0gICAgICBpZiAoISBsY29tbSkKLQl7Ci0JICBkZWZfc3ltID0gc3ltOwotCSAgZGVmX3NpemUgPSBzaXplOwotCSAgU19TRVRfRVhURVJOQUwgKHN5bSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbF9nZXRfdGMgKGxjb21tX3N5bSktPm91dHB1dCA9IDE7Ci0JICBkZWZfc3ltID0gbGNvbW1fc3ltOwotCSAgZGVmX3NpemUgPSAwOwotCX0KLQotICAgICAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDEpOwotICAgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotICAKLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoZGVmX3N5bSwgZnJhZ19ub3cpOwotICAgICAgcGZyYWcgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBkZWZfc3ltLAotCQkJZGVmX3NpemUsIChjaGFyICopIE5VTEwpOwotICAgICAgKnBmcmFnID0gMDsKLSAgICAgIFNfU0VUX1NFR01FTlQgKGRlZl9zeW0sIGJzc19zZWN0aW9uKTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKGRlZl9zeW0pLT5hbGlnbiA9IGFsaWduOwotICAgIH0KLSAgZWxzZSBpZiAobGNvbW0pCi0gICAgewotICAgICAgLyogQWxpZ24gdGhlIHNpemUgb2YgbGNvbW1fc3ltLiAgKi8KLSAgICAgIHN5bWJvbF9nZXRfZnJhZyAobGNvbW1fc3ltKS0+ZnJfb2Zmc2V0ID0KLQkoKHN5bWJvbF9nZXRfZnJhZyAobGNvbW1fc3ltKS0+ZnJfb2Zmc2V0ICsgKDEgPDwgYWxpZ24pIC0gMSkKLQkgJn4gKCgxIDw8IGFsaWduKSAtIDEpKTsKLSAgICAgIGlmIChhbGlnbiA+IHN5bWJvbF9nZXRfdGMgKGxjb21tX3N5bSktPmFsaWduKQotCXN5bWJvbF9nZXRfdGMgKGxjb21tX3N5bSktPmFsaWduID0gYWxpZ247Ci0gICAgfQotCi0gIGlmIChsY29tbSkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN5bSBhbiBvZmZzZXQgZnJvbSBsY29tbV9zeW0uICAqLwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCBic3Nfc2VjdGlvbik7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgc3ltYm9sX2dldF9mcmFnIChsY29tbV9zeW0pKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIHN5bWJvbF9nZXRfZnJhZyAobGNvbW1fc3ltKS0+ZnJfb2Zmc2V0KTsKLSAgICAgIHN5bWJvbF9nZXRfZnJhZyAobGNvbW1fc3ltKS0+ZnJfb2Zmc2V0ICs9IHNpemU7Ci0gICAgfQotCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5jc2VjdCBwc2V1ZG8tb3AuICBUaGlzIHN3aXRjaGVzIHVzIGludG8gYSBkaWZmZXJlbnQKLSAgIHN1YnNlZ21lbnQuICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSBzeW1ib2wgd2hvc2UgdmFsdWUgaXMgdGhlCi0gICBzdGFydCBvZiB0aGUgLmNzZWN0LiAgSW4gQ09GRiwgY3NlY3Qgc3ltYm9scyBnZXQgc3BlY2lhbCBhdXgKLSAgIGVudHJpZXMgZGVmaW5lZCBieSB0aGUgeF9jc2VjdCBmaWVsZCBvZiB1bmlvbiBpbnRlcm5hbF9hdXhlbnQuICBUaGUKLSAgIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgYWxpZ25tZW50ICh0aGUgZGVmYXVsdCBpcyAyKS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfY3NlY3QgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAKLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgaWYgKFNfR0VUX05BTUUgKHN5bSlbMF0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBBbiB1bm5hbWVkIGNzZWN0IGlzIGFzc3VtZWQgdG8gYmUgW1BSXS4gICovCi0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcyA9IFhNQ19QUjsKLSAgICB9Ci0KLSAgcHBjX2NoYW5nZV9jc2VjdCAoc3ltKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5hbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBDaGFuZ2UgdG8gYSBkaWZmZXJlbnQgY3NlY3QuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2NoYW5nZV9jc2VjdCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bSkpCi0gICAgc3Vic2VnX3NldCAoU19HRVRfU0VHTUVOVCAoc3ltKSwgc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFMgKipsaXN0X3B0cjsKLSAgICAgIGludCBhZnRlcl90b2M7Ci0gICAgICBpbnQgaG9sZF9jaHVua3NpemU7Ci0gICAgICBzeW1ib2xTICpsaXN0OwotCi0gICAgICAvKiBUaGlzIGlzIGEgbmV3IGNzZWN0LiAgV2UgbmVlZCB0byBsb29rIGF0IHRoZSBzeW1ib2wgY2xhc3MgdG8KLQkgZmlndXJlIG91dCB3aGV0aGVyIGl0IHNob3VsZCBnbyBpbiB0aGUgdGV4dCBzZWN0aW9uIG9yIHRoZQotCSBkYXRhIHNlY3Rpb24uICAqLwotICAgICAgYWZ0ZXJfdG9jID0gMDsKLSAgICAgIHN3aXRjaCAoc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MpCi0JewotCWNhc2UgWE1DX1BSOgotCWNhc2UgWE1DX1JPOgotCWNhc2UgWE1DX0RCOgotCWNhc2UgWE1DX0dMOgotCWNhc2UgWE1DX1hPOgotCWNhc2UgWE1DX1NWOgotCWNhc2UgWE1DX1RJOgotCWNhc2UgWE1DX1RCOgotCSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotCSAgc3ltYm9sX2dldF90YyAoc3ltKS0+c3Vic2VnID0gcHBjX3RleHRfc3Vic2VnbWVudDsKLQkgICsrcHBjX3RleHRfc3Vic2VnbWVudDsKLQkgIGxpc3RfcHRyID0gJnBwY190ZXh0X2NzZWN0czsKLQkgIGJyZWFrOwotCWNhc2UgWE1DX1JXOgotCWNhc2UgWE1DX1RDMDoKLQljYXNlIFhNQ19UQzoKLQljYXNlIFhNQ19EUzoKLQljYXNlIFhNQ19VQToKLQljYXNlIFhNQ19CUzoKLQljYXNlIFhNQ19VQzoKLQkgIGlmIChwcGNfdG9jX2NzZWN0ICE9IE5VTEwKLQkgICAgICAmJiAoc3ltYm9sX2dldF90YyAocHBjX3RvY19jc2VjdCktPnN1YnNlZyArIDEKLQkJICA9PSBwcGNfZGF0YV9zdWJzZWdtZW50KSkKLQkgICAgYWZ0ZXJfdG9jID0gMTsKLQkgIFNfU0VUX1NFR01FTlQgKHN5bSwgZGF0YV9zZWN0aW9uKTsKLQkgIHN5bWJvbF9nZXRfdGMgKHN5bSktPnN1YnNlZyA9IHBwY19kYXRhX3N1YnNlZ21lbnQ7Ci0JICArK3BwY19kYXRhX3N1YnNlZ21lbnQ7Ci0JICBsaXN0X3B0ciA9ICZwcGNfZGF0YV9jc2VjdHM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICAvKiBXZSBzZXQgdGhlIG9ic3RhY2sgY2h1bmsgc2l6ZSB0byBhIHNtYWxsIHZhbHVlIGJlZm9yZQotICAgICAgICAgY2hhbmdpbmcgc3Vic2VnbWVudHMsIHNvIHRoYXQgd2UgZG9uJ3QgdXNlIGEgbG90IG9mIG1lbW9yeQotICAgICAgICAgc3BhY2UgZm9yIHdoYXQgbWF5IGJlIGEgc21hbGwgc2VjdGlvbi4gICovCi0gICAgICBob2xkX2NodW5rc2l6ZSA9IGNodW5rc2l6ZTsKLSAgICAgIGNodW5rc2l6ZSA9IDY0OwotCi0gICAgICBzdWJzZWdfbmV3IChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKHN5bSkpLAotCQkgIHN5bWJvbF9nZXRfdGMgKHN5bSktPnN1YnNlZyk7Ci0KLSAgICAgIGNodW5rc2l6ZSA9IGhvbGRfY2h1bmtzaXplOwotCi0gICAgICBpZiAoYWZ0ZXJfdG9jKQotCXBwY19hZnRlcl90b2NfZnJhZyA9IGZyYWdfbm93OwotCi0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLQotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+YWxpZ24gPSAyOwotICAgICAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPndpdGhpbiA9IHN5bTsKLQkgIAotICAgICAgZm9yIChsaXN0ID0gKmxpc3RfcHRyOwotCSAgIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0ICE9IChzeW1ib2xTICopIE5VTEw7Ci0JICAgbGlzdCA9IHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0KQotCTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKGxpc3QpLT5uZXh0ID0gc3ltOwotCSAgCi0gICAgICBzeW1ib2xfcmVtb3ZlIChzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgc3ltYm9sX2FwcGVuZCAoc3ltLCBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+d2l0aGluLCAmc3ltYm9sX3Jvb3RQLAotCQkgICAgICZzeW1ib2xfbGFzdFApOwotICAgIH0KLQotICBwcGNfY3VycmVudF9jc2VjdCA9IHN5bTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSAudGV4dCBhbmQgLmRhdGEgcHNldWRvLW9wcy4gIFRoZXNlCi0gICBwc2V1ZG8tb3BzIGFyZW4ndCByZWFsbHkgdXNlZCBieSBYQ09GRjsgd2UgaW1wbGVtZW50IHRoZW0gZm9yIHRoZQotICAgY29udmVuaWVuY2Ugb2YgcGVvcGxlIHdobyBhcmVuJ3QgdXNlZCB0byBYQ09GRi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfc2VjdGlvbiAodHlwZSkKLSAgICAgaW50IHR5cGU7Ci17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBpZiAodHlwZSA9PSAndCcpCi0gICAgbmFtZSA9ICIudGV4dFtQUl0iOwotICBlbHNlIGlmICh0eXBlID09ICdkJykKLSAgICBuYW1lID0gIi5kYXRhW1JXXSI7Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICBwcGNfY2hhbmdlX2NzZWN0IChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgLnNlY3Rpb24gcHNldWRvLW9wLiAgVGhpcyBpcyBtb3N0bHkgdG8KLSAgIGdpdmUgYW4gZXJyb3IsIHNpbmNlIFhDT0ZGIG9ubHkgc3VwcG9ydHMgLnRleHQsIC5kYXRhIGFuZCAuYnNzLCBidXQKLSAgIHdlIGRvIHBlcm1pdCB0aGUgdXNlciB0byBuYW1lIHRoZSB0ZXh0IG9yIGRhdGEgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfbmFtZWRfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICp1c2VyX25hbWU7Ci0gIGNvbnN0IGNoYXIgKnJlYWxfbmFtZTsKLSAgY2hhciBjOwotICBzeW1ib2xTICpzeW07Ci0KLSAgdXNlcl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgaWYgKHN0cmNtcCAodXNlcl9uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIHJlYWxfbmFtZSA9ICIudGV4dFtQUl0iOwotICBlbHNlIGlmIChzdHJjbXAgKHVzZXJfbmFtZSwgIi5kYXRhIikgPT0gMCkKLSAgICByZWFsX25hbWUgPSAiLmRhdGFbUlddIjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVGhlIFhDT0ZGIGZpbGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgYXJiaXRyYXJ5IHNlY3Rpb25zIikpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChyZWFsX25hbWUpOwotCi0gIHBwY19jaGFuZ2VfY3NlY3QgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5leHRlcm4gcHNldWRvLW9wLiAgV2UgY3JlYXRlIGFuIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2V4dGVybiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICh2b2lkKSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmxnbG9ibCBwc2V1ZG8tb3AuICBLZWVwIHRoZSBzeW1ib2wgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfbGdsb2JsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAucmVuYW1lIHBzZXVkby1vcC4gIFRoZSBSUy82MDAwIGFzc2VtYmxlciBjYW4gcmVuYW1lIHN5bWJvbHMsCi0gICBhbHRob3VnaCBJIGRvbid0IGtub3cgd2h5IGl0IGJvdGhlcnMuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3JlbmFtZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGVuZGM7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgaW50IGxlbjsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyByZW5hbWUgc3RyaW5nIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPnJlYWxfbmFtZSA9IGRlbWFuZF9jb3B5X0Nfc3RyaW5nICgmbGVuKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLnN0YWJ4IHBzZXVkby1vcC4gIFRoaXMgaXMgc2ltaWxhciB0byBhIG5vcm1hbCAuc3RhYnMKLSAgIHBzZXVkby1vcCwgYnV0IHNsaWdodGx5IGRpZmZlcmVudC4gIEEgc2FtcGxlIGlzCi0gICAgICAgLnN0YWJ4ICJtYWluOkYtMSIsLm1haW4sMTQyLDAKLSAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgc3ltYm9sIG5hbWUgdG8gY3JlYXRlLiAgVGhlIHNlY29uZCBpcyB0aGUKLSAgIHZhbHVlLCBhbmQgdGhlIHRoaXJkIGlzIHRoZSBzdG9yYWdlIGNsYXNzLiAgVGhlIGZvdXJ0aCBzZWVtcyB0byBiZQotICAgYWx3YXlzIHplcm8sIGFuZCBJIGFtIGFzc3VtaW5nIGl0IGlzIHRoZSB0eXBlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19zdGFieCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgbGVuOwotICBzeW1ib2xTICpzeW07Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmFsdWUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBwcGNfc3RhYl9zeW1ib2wgPSB0cnVlOwotICBzeW0gPSBzeW1ib2xfbWFrZSAobmFtZSk7Ci0gIHBwY19zdGFiX3N5bWJvbCA9IGZhbHNlOwotCi0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPnJlYWxfbmFtZSA9IG5hbWU7Ci0KLSAgKHZvaWQpIGV4cHJlc3Npb24gKCZleHApOwotCi0gIHN3aXRjaCAoZXhwLlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgIGNhc2UgT19hYnNlbnQ6Ci0gICAgY2FzZSBPX2JpZzoKLSAgICAgIGFzX2JhZCAoXygiaWxsZWdhbCAuc3RhYnggZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19jb25zdGFudDoKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGV4cC5YX2FkZF9udW1iZXIpOwotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW0sICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0Jc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChzeW0sICZleHApOwotICAgICAgZWxzZQotCXsKLQkgIFNfU0VUX1ZBTFVFIChzeW0sCi0JCSAgICAgICBleHAuWF9hZGRfbnVtYmVyICsgU19HRVRfVkFMVUUgKGV4cC5YX2FkZF9zeW1ib2wpKTsKLQkgIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBzeW1ib2xfZ2V0X2ZyYWcgKGV4cC5YX2FkZF9zeW1ib2wpKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGUgdmFsdWUgaXMgc29tZSBjb21wbGV4IGV4cHJlc3Npb24uICBUaGlzIHdpbGwgcHJvYmFibHkKLSAgICAgICAgIGZhaWwgYXQgc29tZSBsYXRlciBwb2ludCwgYnV0IHRoaXMgaXMgcHJvYmFibHkgdGhlIHJpZ2h0Ci0gICAgICAgICB0aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgICAgIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltLCAmZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBTX1NFVF9TRUdNRU5UIChzeW0sIHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24pOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJtaXNzaW5nIGNsYXNzIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB0eXBlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgU19TRVRfREFUQV9UWVBFIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfU1RTWU0pCi0gICAgc3ltYm9sX2dldF90YyAoc3ltKS0+d2l0aGluID0gcHBjX2N1cnJlbnRfYmxvY2s7Ci0KLSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sCi0gICAgICB8fCAhIFNfSVNfRVhURVJOQUwgKGV4cC5YX2FkZF9zeW1ib2wpCi0gICAgICB8fCBTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSAhPSBic3Nfc2VjdGlvbikKLSAgICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbF9yZW1vdmUgKHN5bSwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfYXBwZW5kIChzeW0sIGV4cC5YX2FkZF9zeW1ib2wsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHBwY19jdXJyZW50X2NzZWN0KS0+d2l0aGluID09IGV4cC5YX2FkZF9zeW1ib2wpCi0Jc3ltYm9sX2dldF90YyAocHBjX2N1cnJlbnRfY3NlY3QpLT53aXRoaW4gPSBzeW07Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZnVuY3Rpb24gcHNldWRvLW9wLiAgVGhpcyB0YWtlcyBzZXZlcmFsIGFyZ3VtZW50cy4gIFRoZSBmaXJzdAotICAgYXJndW1lbnQgc2VlbXMgdG8gYmUgdGhlIGV4dGVybmFsIG5hbWUgb2YgdGhlIHN5bWJvbC4gIFRoZSBzZWNvbmQKLSAgIGFyZ21lbnQgc2VlbXMgdG8gYmUgdGhlIGxhYmVsIGZvciB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgZ2NjCi0gICB1c2VzIHRoZSBzYW1lIG5hbWUgZm9yIGJvdGguICBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSB0aGlyZCBhbmQKLSAgIGZvdXJ0aCBhcmd1bWVudHMgYXJlIG1lYW50IHRvIGJlLiAgVGhlIG9wdGlvbmFsIGZpZnRoIGFyZ3VtZW50IGlzCi0gICBhbiBleHByZXNzaW9uIGZvciB0aGUgc2l6ZSBvZiB0aGUgZnVuY3Rpb24uICBJbiBDT0ZGIHRoaXMgc3ltYm9sCi0gICBnZXRzIGFuIGF1eCBlbnRyeSBsaWtlIHRoYXQgdXNlZCBmb3IgYSBjc2VjdC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfZnVuY3Rpb24gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBjaGFyICpzOwotICBzeW1ib2xTICpleHRfc3ltOwotICBzeW1ib2xTICpsYWJfc3ltOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAvKiBJZ25vcmUgYW55IFtQUl0gc3VmZml4LiAgKi8KLSAgbmFtZSA9IHBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpOwotICBzID0gc3RyY2hyIChuYW1lLCAnWycpOwotICBpZiAocyAhPSAoY2hhciAqKSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHMgKyAxLCAiUFJdIikgPT0gMCkKLSAgICAqcyA9ICdcMCc7Ci0KLSAgZXh0X3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3Npbmcgc3ltYm9sIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGxhYl9zeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gZW5kYzsKLQotICBpZiAoZXh0X3N5bSAhPSBsYWJfc3ltKQotICAgIHsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotICAgICAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGV4cC5YX2FkZF9zeW1ib2wgPSBsYWJfc3ltOwotICAgICAgZXhwLlhfb3Bfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgZXhwLlhfdW5zaWduZWQgPSAwOwotICAgICAgc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uIChleHRfc3ltLCAmZXhwKTsKLSAgICB9Ci0KLSAgaWYgKHN5bWJvbF9nZXRfdGMgKGV4dF9zeW0pLT5jbGFzcyA9PSAtMSkKLSAgICBzeW1ib2xfZ2V0X3RjIChleHRfc3ltKS0+Y2xhc3MgPSBYTUNfUFI7Ci0gIHN5bWJvbF9nZXRfdGMgKGV4dF9zeW0pLT5vdXRwdXQgPSAxOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUyBpZ25vcmU7Ci0KLSAgICAgIC8qIElnbm9yZSB0aGUgdGhpcmQgYXJndW1lbnQuICAqLwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBleHByZXNzaW9uICgmaWdub3JlKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICAvKiBJZ25vcmUgdGhlIGZvdXJ0aCBhcmd1bWVudC4gICovCi0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGV4cHJlc3Npb24gKCZpZ25vcmUpOwotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSAgICB7Ci0JICAgICAgLyogVGhlIGZpZnRoIGFyZ3VtZW50IGlzIHRoZSBmdW5jdGlvbiBzaXplLiAgKi8KLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBzeW1ib2xfZ2V0X3RjIChleHRfc3ltKS0+c2l6ZSA9IHN5bWJvbF9uZXcgKCJMMFwwMDEiLAotCQkJCQkJCSAgYWJzb2x1dGVfc2VjdGlvbiwKLQkJCQkJCQkgICh2YWx1ZVQpIDAsCi0JCQkJCQkJICAmemVyb19hZGRyZXNzX2ZyYWcpOwotCSAgICAgIHBzZXVkb19zZXQgKHN5bWJvbF9nZXRfdGMgKGV4dF9zeW0pLT5zaXplKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgU19TRVRfREFUQV9UWVBFIChleHRfc3ltLCBEVF9GQ04gPDwgTl9CVFNIRlQpOwotICBTRl9TRVRfRlVOQ1RJT04gKGV4dF9zeW0pOwotICBTRl9TRVRfUFJPQ0VTUyAoZXh0X3N5bSk7Ci0gIGNvZmZfYWRkX2xpbmVzeW0gKGV4dF9zeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuYmYgcHNldWRvLW9wLiAgVGhpcyBpcyBqdXN0IGxpa2UgYSBDT0ZGIENfRkNOIHN5bWJvbCBuYW1lZAotICAgIi5iZiIuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JmIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5iZiIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19GQ04pOwotCi0gIGNvZmZfbGluZV9iYXNlID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltLCAxKTsKLSAgU0FfU0VUX1NZTV9MTk5PIChzeW0sIGNvZmZfbGluZV9iYXNlKTsKLQotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZWYgcHNldWRvLW9wLiAgVGhpcyBpcyBqdXN0IGxpa2UgYSBDT0ZGIENfRkNOIHN5bWJvbCBuYW1lZAotICAgIi5lZiIsIGV4Y2VwdCB0aGF0IHRoZSBsaW5lIG51bWJlciBpcyBhYnNvbHV0ZSwgbm90IHJlbGF0aXZlIHRvIHRoZQotICAgbW9zdCByZWNlbnQgIi5iZiIgc3ltYm9sLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19lZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzeW1ib2xTICpzeW07Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuZWYiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCB0ZXh0X3NlY3Rpb24pOwotICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotICBTX1NFVF9WQUxVRSAoc3ltLCBmcmFnX25vd19maXggKCkpOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfRkNOKTsKLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltLCAxKTsKLSAgU0FfU0VUX1NZTV9MTk5PIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmJpIGFuZCAuZWkgcHNldWRvLW9wcy4gIFRoZXNlIHRha2UgYSBzdHJpbmcgYXJndW1lbnQgYW5kCi0gICBnZW5lcmF0ZXMgYSBDX0JJTkNMIG9yIENfRUlOQ0wgc3ltYm9sLCB3aGljaCBnb2VzIGF0IHRoZSBzdGFydCBvZgotICAgdGhlIHN5bWJvbCBsaXN0LiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY19iaWVpIChlaSkKLSAgICAgaW50IGVpOwotewotICBzdGF0aWMgc3ltYm9sUyAqbGFzdF9iaWVpOwotCi0gIGNoYXIgKm5hbWU7Ci0gIGludCBsZW47Ci0gIHN5bWJvbFMgKnN5bTsKLSAgc3ltYm9sUyAqbG9vazsKLQotICBuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotCi0gIC8qIFRoZSB2YWx1ZSBvZiB0aGVzZSBzeW1ib2xzIGlzIGFjdHVhbGx5IGZpbGUgb2Zmc2V0LiAgSGVyZSB3ZSBzZXQKLSAgICAgdGhlIHZhbHVlIHRvIHRoZSBpbmRleCBpbnRvIHRoZSBsaW5lIG51bWJlciBlbnRyaWVzLiAgSW4KLSAgICAgcHBjX2Zyb2Jfc3ltYm9scyB3ZSBzZXQgdGhlIGZpeF9saW5lIGZpZWxkLCB3aGljaCB3aWxsIGNhdXNlIEJGRAotICAgICB0byBkbyB0aGUgcmlnaHQgdGhpbmcuICAqLwotCi0gIHN5bSA9IHN5bWJvbF9tYWtlIChuYW1lKTsKLSAgLyogb2JqLWNvZmYuYyBjdXJyZW50bHkgb25seSBoYW5kbGVzIGxpbmUgbnVtYmVycyBjb3JyZWN0bHkgaW4gdGhlCi0gICAgIC50ZXh0IHNlY3Rpb24uICAqLwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIGNvZmZfbl9saW5lX25vcyk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotCi0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgZWkgPyBDX0VJTkNMIDogQ19CSU5DTCk7Ci0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0gIAotICBmb3IgKGxvb2sgPSBsYXN0X2JpZWkgPyBsYXN0X2JpZWkgOiBzeW1ib2xfcm9vdFA7Ci0gICAgICAgKGxvb2sgIT0gKHN5bWJvbFMgKikgTlVMTAotCSYmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChsb29rKSA9PSBDX0ZJTEUKLQkgICAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAobG9vaykgPT0gQ19CSU5DTAotCSAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChsb29rKSA9PSBDX0VJTkNMKSk7Ci0gICAgICAgbG9vayA9IHN5bWJvbF9uZXh0IChsb29rKSkKLSAgICA7Ci0gIGlmIChsb29rICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9pbnNlcnQgKHN5bSwgbG9vaywgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBsYXN0X2JpZWkgPSBzeW07Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuYnMgcHNldWRvLW9wLiAgVGhpcyBnZW5lcmF0ZXMgYSBDX0JTVEFUIHN5bWJvbCBuYW1lZCAiLmJzIi4KLSAgIFRoZXJlIGlzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgYSBjc2VjdCBzeW1ib2wuICBUaGUgdmFsdWUgb2YgdGhlCi0gICAuYnMgc3ltYm9sIGlzIHRoZSBpbmRleCBvZiB0aGlzIGNzZWN0IHN5bWJvbC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcGNfYnMgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBlbmRjOwotICBzeW1ib2xTICpjc2VjdDsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIGlmIChwcGNfY3VycmVudF9ibG9jayAhPSBOVUxMKQotICAgIGFzX2JhZCAoXygibmVzdGVkIC5icyBibG9ja3MiKSk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZW5kYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIGNzZWN0ID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuYnMiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0JTVEFUKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+d2l0aGluID0gY3NlY3Q7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgcHBjX2N1cnJlbnRfYmxvY2sgPSBzeW07Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5lcyBwc2V1ZG8tb3AuICBHZW5lcmF0ZSBhIENfRVNUQVJUIHN5bWJvbCBuYW1lZCAuZXMuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2VzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBpZiAocHBjX2N1cnJlbnRfYmxvY2sgPT0gTlVMTCkKLSAgICBhc19iYWQgKF8oIi5lcyB3aXRob3V0IHByZWNlZGluZyAuYnMiKSk7Ci0KLSAgc3ltID0gc3ltYm9sX21ha2UgKCIuZXMiKTsKLSAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKTsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0VTVEFUKTsKLSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzIHw9IEJTRl9ERUJVR0dJTkc7Ci0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgcHBjX2N1cnJlbnRfYmxvY2sgPSBOVUxMOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuYmIgcHNldWRvLW9wLiAgR2VuZXJhdGUgYSBDX0JMT0NLIHN5bWJvbCBuYW1lZCAuYmIsIHdpdGggYQotICAgbGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JiIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5iYiIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19CTE9DSyk7Ci0KLSAgU19TRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltLCAxKTsKLSAgU0FfU0VUX1NZTV9MTk5PIChzeW0sIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLQotICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5vdXRwdXQgPSAxOwotCi0gIFNGX1NFVF9QUk9DRVNTIChzeW0pOwotCi0gIHBwY19mcm9iX2xhYmVsIChzeW0pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSAuZWIgcHNldWRvLW9wLiAgR2VuZXJhdGUgYSBDX0JMT0NLIHN5bWJvbCBuYW1lZCAuZWIsIHdpdGggYQotICAgbGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2ViIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lYiIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHRleHRfc2VjdGlvbik7Ci0gIHN5bWJvbF9zZXRfZnJhZyAoc3ltLCBmcmFnX25vdyk7Ci0gIFNfU0VUX1ZBTFVFIChzeW0sIGZyYWdfbm93X2ZpeCAoKSk7Ci0gIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19CTE9DSyk7Ci0gIFNfU0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSwgMSk7Ci0gIFNBX1NFVF9TWU1fTE5OTyAoc3ltLCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgU0ZfU0VUX1BST0NFU1MgKHN5bSk7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC5iYyBwc2V1ZG8tb3AuICBUaGlzIGp1c3QgY3JlYXRlcyBhIENfQkNPTU0gc3ltYm9sIHdpdGggYQotICAgc3BlY2lmaWVkIG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2JjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBsZW47Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotICBzeW0gPSBzeW1ib2xfbWFrZSAobmFtZSk7Ci0gIFNfU0VUX1NFR01FTlQgKHN5bSwgcHBjX2NvZmZfZGVidWdfc2VjdGlvbik7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfREVCVUdHSU5HOwotICBTX1NFVF9TVE9SQUdFX0NMQVNTIChzeW0sIENfQkNPTU0pOwotICBTX1NFVF9WQUxVRSAoc3ltLCAwKTsKLSAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICBwcGNfZnJvYl9sYWJlbCAoc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBUaGUgLmVjIHBzZXVkby1vcC4gIFRoaXMganVzdCBjcmVhdGVzIGEgQ19FQ09NTSBzeW1ib2wuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX2VjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnN5bTsKLQotICBzeW0gPSBzeW1ib2xfbWFrZSAoIi5lYyIpOwotICBTX1NFVF9TRUdNRU5UIChzeW0sIHBwY19jb2ZmX2RlYnVnX3NlY3Rpb24pOwotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgfD0gQlNGX0RFQlVHR0lORzsKLSAgU19TRVRfU1RPUkFHRV9DTEFTUyAoc3ltLCBDX0VDT01NKTsKLSAgU19TRVRfVkFMVUUgKHN5bSwgMCk7Ci0gIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0KLSAgcHBjX2Zyb2JfbGFiZWwgKHN5bSk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogVGhlIC50b2MgcHNldWRvLW9wLiAgU3dpdGNoIHRvIHRoZSAudG9jIHN1YnNlZ21lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotcHBjX3RvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAocHBjX3RvY19jc2VjdCAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgc3ltYm9sX2dldF90YyAocHBjX3RvY19jc2VjdCktPnN1YnNlZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWJzZWdUIHN1YnNlZzsKLSAgICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgIHN5bWJvbFMgKmxpc3Q7Ci0gICAgCi0gICAgICBzdWJzZWcgPSBwcGNfZGF0YV9zdWJzZWdtZW50OwotICAgICAgKytwcGNfZGF0YV9zdWJzZWdtZW50OwotCi0gICAgICBzdWJzZWdfbmV3IChzZWdtZW50X25hbWUgKGRhdGFfc2VjdGlvbiksIHN1YnNlZyk7Ci0gICAgICBwcGNfdG9jX2ZyYWcgPSBmcmFnX25vdzsKLQotICAgICAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoIlRPQ1tUQzBdIik7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCBkYXRhX3NlY3Rpb24pOwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPnN1YnNlZyA9IHN1YnNlZzsKLSAgICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPm91dHB1dCA9IDE7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW4gPSBzeW07Ci0KLSAgICAgIHBwY190b2NfY3NlY3QgPSBzeW07Ci0JICAKLSAgICAgIGZvciAobGlzdCA9IHBwY19kYXRhX2NzZWN0czsKLQkgICBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+bmV4dCAhPSAoc3ltYm9sUyAqKSBOVUxMOwotCSAgIGxpc3QgPSBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+bmV4dCkKLQk7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChsaXN0KS0+bmV4dCA9IHN5bTsKLQotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgc3ltYm9sX2dldF90YyAobGlzdCktPndpdGhpbiwgJnN5bWJvbF9yb290UCwKLQkJICAgICAmc3ltYm9sX2xhc3RQKTsKLSAgICB9Ci0KLSAgcHBjX2N1cnJlbnRfY3NlY3QgPSBwcGNfdG9jX2NzZWN0OwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIFRoZSBBSVggYXNzZW1ibGVyIGF1dG9tYXRpY2FsbHkgYWxpZ25zIHRoZSBvcGVyYW5kcyBvZiBhIC5sb25nIG9yCi0gICAuc2hvcnQgcHNldWRvLW9wLCBhbmQgd2Ugd2FudCB0byBiZSBjb21wYXRpYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY194Y29mZl9jb25zIChsb2dfc2l6ZSkKLSAgICAgaW50IGxvZ19zaXplOwotewotICBmcmFnX2FsaWduIChsb2dfc2l6ZSwgMCwgMCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIGxvZ19zaXplKTsKLSAgY29ucyAoMSA8PCBsb2dfc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcGNfdmJ5dGUgKGR1bW15KQotICAgICBpbnQgZHVtbXk7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgaW50IGJ5dGVfY291bnQ7Ci0KLSAgKHZvaWQpIGV4cHJlc3Npb24gKCZleHApOwotCi0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibm9uLWNvbnN0YW50IGJ5dGUgY291bnQiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGJ5dGVfY291bnQgPSBleHAuWF9hZGRfbnVtYmVyOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIm1pc3NpbmcgdmFsdWUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBjb25zIChieXRlX2NvdW50KTsKLX0KLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotDAotLyogVGhlIC50YyBwc2V1ZG8tb3AuICBUaGlzIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGVpdGhlciBYQ09GRiBvcgotICAgRUxGLiAgVGhpcyB0YWtlcyB0d28gb3IgbW9yZSBhcmd1bWVudHMuCi0KLSAgIFdoZW4gZ2VuZXJhdGluZyBYQ09GRiBvdXRwdXQsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbmFtZSB0bwotICAgZ2l2ZSB0byB0aGlzIGxvY2F0aW9uIGluIHRoZSB0b2M7IHRoaXMgd2lsbCBiZSBhIHN5bWJvbCB3aXRoIGNsYXNzCi0gICBUQy4gIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMgYXJlIDQgYnl0ZSB2YWx1ZXMgdG8gYWN0dWFsbHkgcHV0IGF0Ci0gICB0aGlzIGxvY2F0aW9uIGluIHRoZSBUT0M7IG9mdGVuIHRoZXJlIGlzIGp1c3Qgb25lIG1vcmUgYXJndW1lbnQsIGEKLSAgIHJlbG9jYXRlYWJsZSBzeW1ib2wgcmVmZXJlbmNlLgotCi0gICBXaGVuIG5vdCBnZW5lcmF0aW5nIFhDT0ZGIG91dHB1dCwgdGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUsIGJ1dAotICAgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIHNpbXBseSBpZ25vcmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXBwY190YyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotI2lmZGVmIE9CSl9YQ09GRgotCi0gIC8qIERlZmluZSB0aGUgVE9DIHN5bWJvbCBuYW1lLiAgKi8KLSAgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgY2hhciBlbmRjOwotICAgIHN5bWJvbFMgKnN5bTsKLQotICAgIGlmIChwcGNfdG9jX2NzZWN0ID09IChzeW1ib2xTICopIE5VTEwKLQl8fCBwcGNfdG9jX2NzZWN0ICE9IHBwY19jdXJyZW50X2NzZWN0KQotICAgICAgewotCWFzX2JhZCAoXygiLnRjIG5vdCBpbiAudG9jIHNlY3Rpb24iKSk7Ci0JaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQlyZXR1cm47Ci0gICAgICB9Ci0KLSAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIGVuZGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAgIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGVuZGM7Ci0KLSAgICBpZiAoU19JU19ERUZJTkVEIChzeW0pKQotICAgICAgewotCXN5bWJvbFMgKmxhYmVsOwotCi0JbGFiZWwgPSBzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbjsKLQlpZiAoc3ltYm9sX2dldF90YyAobGFiZWwpLT5jbGFzcyAhPSBYTUNfVEMwKQotCSAgewotCSAgICBhc19iYWQgKF8oIi50YyB3aXRoIG5vIGxhYmVsIikpOwotCSAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICByZXR1cm47Ci0JICB9Ci0KLQlTX1NFVF9TRUdNRU5UIChsYWJlbCwgU19HRVRfU0VHTUVOVCAoc3ltKSk7Ci0Jc3ltYm9sX3NldF9mcmFnIChsYWJlbCwgc3ltYm9sX2dldF9mcmFnIChzeW0pKTsKLQlTX1NFVF9WQUxVRSAobGFiZWwsIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQotCXdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0JcmV0dXJuOwotICAgICAgfQotCi0gICAgU19TRVRfU0VHTUVOVCAoc3ltLCBub3dfc2VnKTsKLSAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bSwgZnJhZ19ub3cpOwotICAgIFNfU0VUX1ZBTFVFIChzeW0sICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0gICAgc3ltYm9sX2dldF90YyAoc3ltKS0+Y2xhc3MgPSBYTUNfVEM7Ci0gICAgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0ID0gMTsKLQotICAgIHBwY19mcm9iX2xhYmVsIChzeW0pOwotICB9Ci0KLSNlbHNlIC8qICEgZGVmaW5lZCAoT0JKX1hDT0ZGKSAqLwotCi0gIC8qIFNraXAgdGhlIFRPQyBzeW1ib2wgbmFtZS4gICovCi0gIHdoaWxlIChpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1snCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ10nCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ3snCi0JIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ30nKQotICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIC8qIEFsaWduIHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5LiAgKi8KLSAgZnJhZ19hbGlnbiAoMiwgMCwgMCk7Ci0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIDIpOwotCi0jZW5kaWYgLyogISBkZWZpbmVkIChPQkpfWENPRkYpICovCi0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGNvbnMgKDQpOwotICAgIH0KLX0KLQwKLSNpZmRlZiBURV9QRQotCi0vKiBQc2V1ZG8tb3BzIHNwZWNpZmljIHRvIHRoZSBXaW5kb3dzIE5UIFBvd2VyUEMgUEUgKGNvZmYpIGZvcm1hdCAqLwotCi0vKiBTZXQgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotcHBjX3NldF9jdXJyZW50X3NlY3Rpb24gKG5ldykKLSAgICAgc2VnVCBuZXc7Ci17Ci0gIHBwY19wcmV2aW91c19zZWN0aW9uID0gcHBjX2N1cnJlbnRfc2VjdGlvbjsKLSAgcHBjX2N1cnJlbnRfc2VjdGlvbiA9IG5ldzsKLX0KLQotLyogcHNldWRvLW9wOiAucHJldmlvdXMKLSAgIGJlaGF2aW91cjogdG9nZ2xlcyB0aGUgY3VycmVudCBzZWN0aW9uIHdpdGggdGhlIHByZXZpb3VzIHNlY3Rpb24uCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgIk5vIHByZXZpb3VzIHNlY3Rpb24iCi0qLwotc3RhdGljIHZvaWQKLXBwY19wcmV2aW91cyhpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHN5bWJvbFMgKnRtcDsKLQotICBpZiAocHBjX3ByZXZpb3VzX3NlY3Rpb24gPT0gTlVMTCkgCi0gICAgewotICAgICAgYXNfd2FybihfKCJObyBwcmV2aW91cyBzZWN0aW9uIHRvIHJldHVybiB0by4gRGlyZWN0aXZlIGlnbm9yZWQuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBzdWJzZWdfc2V0KHBwY19wcmV2aW91c19zZWN0aW9uLCAwKTsKLQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihwcGNfcHJldmlvdXNfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnBkYXRhCi0gICBiZWhhdmlvdXI6IHByZWRlZmluZWQgcmVhZCBvbmx5IGRhdGEgc2VjdGlvbgotICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTm9uZQotICAgaW5pdGlhbDogICAuc2VjdGlvbiAucGRhdGEgImFkcjMiCi0gICAgICAgICAgICAgIGEgLSBkb24ndCBrbm93IC0tIG1heWJlIGEgbWlzcHJpbnQKLQkgICAgICBkIC0gaW5pdGlhbGl6ZWQgZGF0YQotCSAgICAgIHIgLSByZWFkYWJsZQotCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDQgYnl0ZSBib3VuZGFyeSkKLQotICAgY29tbWVudGFyeToKLSAgIFRhZyBpbmRleCB0YWJsZXMgKGFsc28ga25vd24gYXMgdGhlIGZ1bmN0aW9uIHRhYmxlKSBmb3IgZXhjZXB0aW9uCi0gICBoYW5kbGluZywgZGVidWdnaW5nLCBldGMuCi0KLSovCi1zdGF0aWMgdm9pZAotcHBjX3BkYXRhKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHBkYXRhX3NlY3Rpb24gPT0gMCkgCi0gICAgewotICAgICAgcGRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIucGRhdGEiLCAwKTsKLSAgICAgIAotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHBkYXRhX3NlY3Rpb24sCi0JCQkgICAgIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKLSAgICAgIAotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBwZGF0YV9zZWN0aW9uLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldygiLnBkYXRhIiwgMCk7Ci0gICAgfQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbihwZGF0YV9zZWN0aW9uKTsKLX0KLQotLyogcHNldWRvLW9wOiAueWRhdGEKLSAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIG9ubHkgZGF0YSBzZWN0aW9uCi0gICAgICAgICAgICAgIGRvdWJsZSB3b3JkIGFsaWduZWQKLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0gICBpbml0aWFsOiAgIC5zZWN0aW9uIC55ZGF0YSAiZHJ3MyIKLSAgICAgICAgICAgICAgYSAtIGRvbid0IGtub3cgLS0gbWF5YmUgYSBtaXNwcmludAotCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCi0JICAgICAgciAtIHJlYWRhYmxlCi0JICAgICAgMyAtIGRvdWJsZSB3b3JkIGFsaWduZWQgKHRoYXQgd291bGQgYmUgNCBieXRlIGJvdW5kYXJ5KQotICAgY29tbWVudGFyeToKLSAgIFRhZyB0YWJsZXMgKGFsc28ga25vd24gYXMgdGhlIHNjb3BlIHRhYmxlKSBmb3IgZXhjZXB0aW9uIGhhbmRsaW5nLAotICAgZGVidWdnaW5nLCBldGMuCi0qLwotc3RhdGljIHZvaWQKLXBwY195ZGF0YShpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICh5ZGF0YV9zZWN0aW9uID09IDApIAotICAgIHsKLSAgICAgIHlkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnlkYXRhIiwgMCk7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgeWRhdGFfc2VjdGlvbiwKLQkJCSAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MKLQkJCQkgICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCB5ZGF0YV9zZWN0aW9uLCAzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5ZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi55ZGF0YSIsIDApOwotICAgIH0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24oeWRhdGFfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnJlbGRhdGEKLSAgIGJlaGF2aW91cjogcHJlZGVmaW5lZCByZWFkIHdyaXRlIGRhdGEgc2VjdGlvbgotICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkICg0LWJ5dGUpCi0JICAgICAgRklYTUU6IHJlbG9jYXRpb24gaXMgYXBwbGllZCB0byBpdAotCSAgICAgIEZJWE1FOiB3aGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCAuZGF0YT8KLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0gICBpbml0aWFsOiAgIC5zZWN0aW9uIC5yZWxkYXRhICJkcnczIgotCSAgICAgIGQgLSBpbml0aWFsaXplZCBkYXRhCi0JICAgICAgciAtIHJlYWRhYmxlCi0JICAgICAgdyAtIHdyaXRlYWJsZQotCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDggYnl0ZSBib3VuZGFyeSkKLQotICAgY29tbWVudGFyeToKLSAgIExpa2UgLmRhdGEsIGJ1dCBpbnRlbmRlZCB0byBob2xkIGRhdGEgc3ViamVjdCB0byByZWxvY2F0aW9uLCBzdWNoIGFzCi0gICBmdW5jdGlvbiBkZXNjcmlwdG9ycywgZXRjLgotKi8KLXN0YXRpYyB2b2lkCi1wcGNfcmVsZGF0YShpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChyZWxkYXRhX3NlY3Rpb24gPT0gMCkKLSAgICB7Ci0gICAgICByZWxkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJlbGRhdGEiLCAwKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHJlbGRhdGFfc2VjdGlvbiwKLQkJCSAgICAgKCBTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyAKLQkJCSAgICAgIHwgU0VDX0RBVEEgKSk7Ci0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgcmVsZGF0YV9zZWN0aW9uLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWxkYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnJlbGRhdGEiLCAwKTsKLSAgICB9Ci0gIHBwY19zZXRfY3VycmVudF9zZWN0aW9uKHJlbGRhdGFfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnJkYXRhCi0gICBiZWhhdmlvdXI6IHByZWRlZmluZWQgcmVhZCBvbmx5IGRhdGEgc2VjdGlvbgotICAgICAgICAgICAgICBkb3VibGUgd29yZCBhbGlnbmVkCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTm9uZQotICAgaW5pdGlhbDogICAuc2VjdGlvbiAucmRhdGEgImRyMyIKLQkgICAgICBkIC0gaW5pdGlhbGl6ZWQgZGF0YQotCSAgICAgIHIgLSByZWFkYWJsZQotCSAgICAgIDMgLSBkb3VibGUgd29yZCBhbGlnbmVkICh0aGF0IHdvdWxkIGJlIDQgYnl0ZSBib3VuZGFyeSkKLSovCi1zdGF0aWMgdm9pZAotcHBjX3JkYXRhKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHJkYXRhX3NlY3Rpb24gPT0gMCkKLSAgICB7Ci0gICAgICByZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHJkYXRhX3NlY3Rpb24sCi0JCQkgICAgIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJICAgICAgfCBTRUNfUkVBRE9OTFkgfCBTRUNfREFUQSApKTsKLQotICAgICAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCByZGF0YV9zZWN0aW9uLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZGF0YV9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5yZGF0YSIsIDApOwotICAgIH0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24ocmRhdGFfc2VjdGlvbik7Ci19Ci0KLS8qIHBzZXVkby1vcDogLnVhbG9uZwotICAgYmVoYXZpb3VyOiBtdWNoIGxpa2UgLmludCwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgbm8gYWxpZ25tZW50IGlzIAotICAgICAgICAgICAgICBwZXJmb3JtZWQuCi0JICAgICAgRklYTUU6IHRlc3QgdGhlIGFsaWdubWVudCBzdGF0ZW1lbnQKLSAgIGVycm9yczogICAgTm9uZQotICAgd2FybmluZ3M6ICBOb25lCi0qLwotc3RhdGljIHZvaWQKLXBwY191YWxvbmcoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiB0cnkgZm9yIGxvbmcgKi8KLSAgY29ucyAoIDQgKTsKLX0KLQotLyogcHNldWRvLW9wOiAuem5vcCAgPHN5bWJvbCBuYW1lPgotICAgYmVoYXZpb3VyOiBJc3N1ZSBhIG5vcCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgICBJc3N1ZSBhIElNQUdFX1JFTF9QUENfSUZHTFVFIHJlbG9jYXRpb24gYWdhaW5zdCBpdCwgdXNpbmcKLQkgICAgICB0aGUgc3VwcGxpZWQgc3ltYm9sIG5hbWUuCi0gICBlcnJvcnM6ICAgIE5vbmUKLSAgIHdhcm5pbmdzOiAgTWlzc2luZyBzeW1ib2wgbmFtZQotKi8KLXN0YXRpYyB2b2lkCi1wcGNfem5vcChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGU7Ci0gIGV4cHJlc3Npb25TIGV4OwotICBjaGFyICpmOwotCi0gIHN5bWJvbFMgKnN5bTsKLQotICAvKiBTdHJpcCBvdXQgdGhlIHN5bWJvbCBuYW1lICovCi0gIGNoYXIgKnN5bWJvbF9uYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGludCBleHA7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBhc2VjdGlvbiAqc2VjOwotCi0gIHN5bWJvbF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHN5bWJvbF9uYW1lICsgMSk7Ci0gIHN0cmNweSAobmFtZSwgc3ltYm9sX25hbWUpOwotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBMb29rIHVwIHRoZSBvcGNvZGUgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICBvcGNvZGUgPSAoY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICopIGhhc2hfZmluZCAocHBjX2hhc2gsICJub3AiKTsKLQotICAvKiBzdGljayBpbiB0aGUgbm9wICovCi0gIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgNCk7Ci0gIGZpeF9uZXcgKGZyYWdfbm93LAotCSAgIGYgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkgICA0LAotCSAgIHN5bSwKLQkgICAwLAotCSAgIDAsCi0JICAgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTCk7Ci0KLX0KLQotLyogcHNldWRvLW9wOiAKLSAgIGJlaGF2aW91cjogCi0gICBlcnJvcnM6ICAgIAotICAgd2FybmluZ3M6ICAKLSovCi1zdGF0aWMgdm9pZAotcHBjX3BlX2NvbW0obGNvbW0pCi0gICAgIGludCBsY29tbTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqbmFtZTsKLSAgcmVnaXN0ZXIgY2hhciBjOwotICByZWdpc3RlciBjaGFyICpwOwotICBvZmZzZXRUIHRlbXA7Ci0gIHJlZ2lzdGVyIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIG9mZnNldFQgYWxpZ247Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIGp1c3QgYWZ0ZXIgbmFtZSBpcyBub3cgJ1wwJyAqLwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc3ltYm9sLW5hbWU6IHJlc3Qgb2YgbGluZSBpZ25vcmVkLiIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICghIGxjb21tKQotICAgIHsKLSAgICAgIC8qIFRoZSB0aGlyZCBhcmd1bWVudCB0byAuY29tbSBpcyB0aGUgYWxpZ25tZW50LiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLQlhbGlnbiA9IDM7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBhbGlnbiA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgaWYgKGFsaWduIDw9IDApCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJpZ25vcmluZyBiYWQgYWxpZ25tZW50IikpOwotCSAgICAgIGFsaWduID0gMzsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0KLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkpCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSAodmFsdWVUKSB0ZW1wKQotCWFzX2JhZCAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIpLAotCQlTX0dFVF9OQU1FIChzeW1ib2xQKSwKLQkJKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSwKLQkJKGxvbmcpIHRlbXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSB0ZW1wKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLSAgICB9Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyoKLSAqIGltcGxlbWVudCB0aGUgLnNlY3Rpb24gcHNldWRvIG9wOgotICoJLnNlY3Rpb24gbmFtZSB7LCAiZmxhZ3MifQotICogICAgICAgICAgICAgICAgXiAgICAgICAgIF4KLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICArLS0tIG9wdGlvbmFsIGZsYWdzOiAnYicgZm9yIGJzcwotICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpJyBmb3IgaW5mbwotICogICAgICAgICAgICAgICAgKy0tIHNlY3Rpb24gbmFtZSAgICAgICAgICAgICAgICdsJyBmb3IgbGliCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24nIGZvciBub2xvYWQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycgZm9yIG92ZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndycgZm9yIGRhdGEKLSAqCQkJCQkJICdkJyAoYXBwYXJlbnRseSBtODhrIGZvciBkYXRhKQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4JyBmb3IgdGV4dAotICogQnV0IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgYSBxdW90ZWQgc3RyaW5nLCB0cmVhdCBpdCBhcyBhCi0gKiBzdWJzZWdtZW50IG51bWJlci4KLSAqCi0gKiBGSVhNRTogdGhpcyBpcyBhIGNvcHkgb2YgdGhlIHNlY3Rpb24gcHJvY2Vzc2luZyBmcm9tIG9iai1jb2ZmLmMsIHdpdGgKLSAqIGFkZGl0aW9ucy9jaGFuZ2VzIGZvciB0aGUgbW90by1wYXMgYXNzZW1ibGVyIHN1cHBvcnQuIFRoZXJlIGFyZSB0aHJlZQotICogY2F0ZWdvcmllczoKLSAqCi0gKiBGSVhNRTogSSBqdXN0IG5vdGljZWQgdGhpcy4gVGhpcyBkb2Vzbid0IHdvcmsgYXQgYWxsIHJlYWxseS4gSXQgaXQgCi0gKiAgICAgICAgc2V0dGluZyBiaXRzIHRoYXQgYmZkIHByb2JhYmx5IG5laXRoZXIgdW5kZXJzdGFuZHMgb3IgdXNlcy4gVGhlCi0gKiAgICAgICAgY29ycmVjdCBhcHByb2FjaCAoPykgd2lsbCBoYXZlIHRvIGluY29ycG9yYXRlIGV4dHJhIGZpZWxkcyBhdHRhY2hlZAotICogICAgICAgIHRvIHRoZSBzZWN0aW9uIHRvIGhvbGQgdGhlIHN5c3RlbSBzcGVjaWZpYyBzdHVmZi4gKGtyaykKLSAqCi0gKiBTZWN0aW9uIENvbnRlbnRzOgotICogJ2EnIC0gdW5rbm93biAtIHJlZmVycmVkIHRvIGluIGRvY3VtZW50YXRpb24sIGJ1dCBubyBkZWZpbml0aW9uIHN1cHBsaWVkCi0gKiAnYycgLSBzZWN0aW9uIGhhcyBjb2RlCi0gKiAnZCcgLSBzZWN0aW9uIGhhcyBpbml0aWFsaXplZCBkYXRhCi0gKiAndScgLSBzZWN0aW9uIGhhcyB1bmluaXRpYWxpemVkIGRhdGEKLSAqICdpJyAtIHNlY3Rpb24gY29udGFpbnMgZGlyZWN0aXZlcyAoaW5mbykKLSAqICduJyAtIHNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZAotICogJ1InIC0gcmVtb3ZlIHNlY3Rpb24gYXQgbGluayB0aW1lCi0gKgotICogU2VjdGlvbiBQcm90ZWN0aW9uOgotICogJ3InIC0gc2VjdGlvbiBpcyByZWFkYWJsZQotICogJ3cnIC0gc2VjdGlvbiBpcyB3cml0ZWFibGUKLSAqICd4JyAtIHNlY3Rpb24gaXMgZXhlY3V0YWJsZQotICogJ3MnIC0gc2VjdGlvbiBpcyBzaGFyYWJsZQotICoKLSAqIFNlY3Rpb24gQWxpZ25tZW50OgotICogJzAnIC0gYWxpZ24gdG8gYnl0ZSBib3VuZGFyeQotICogJzEnIC0gYWxpZ24gdG8gaGFsZndvcmQgdW5kYXJ5Ci0gKiAnMicgLSBhbGlnbiB0byB3b3JkIGJvdW5kYXJ5Ci0gKiAnMycgLSBhbGlnbiB0byBkb3VibGV3b3JkIGJvdW5kYXJ5Ci0gKiAnNCcgLSBhbGlnbiB0byBxdWFkd29yZCBib3VuZGFyeQotICogJzUnIC0gYWxpZ24gdG8gMzIgYnl0ZSBib3VuZGFyeQotICogJzYnIC0gYWxpZ24gdG8gNjQgYnl0ZSBib3VuZGFyeQotICoKLSAqLwotCi12b2lkCi1wcGNfcGVfc2VjdGlvbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICAvKiBTdHJpcCBvdXQgdGhlIHNlY3Rpb24gbmFtZSAqLwotICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgaW50IGV4cDsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0gIHNlZ1Qgc2VjOwotICBpbnQgYWxpZ247Ci0KLSAgc2VjdGlvbl9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhtYWxsb2MgKGlucHV0X2xpbmVfcG9pbnRlciAtIHNlY3Rpb25fbmFtZSArIDEpOwotICBzdHJjcHkgKG5hbWUsIHNlY3Rpb25fbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGV4cCA9IDA7Ci0gIGZsYWdzID0gU0VDX05PX0ZMQUdTOwotCi0gIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkMiIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDMiKSA9PSAwKQotICAgIHsKLSAgICAgIGFsaWduID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAobmFtZSwgIi5pZGF0YSQ0IikgPT0gMCkKLSAgICB7Ci0gICAgICBhbGlnbiA9IDI7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKG5hbWUsICIuaWRhdGEkNSIpID09IDApCi0gICAgewotICAgICAgYWxpZ24gPSAyOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChuYW1lLCAiLmlkYXRhJDYiKSA9PSAwKQotICAgIHsKLSAgICAgIGFsaWduID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICBhbGlnbiA9IDQ7IC8qIGRlZmF1bHQgYWxpZ25tZW50IHRvIDE2IGJ5dGUgYm91bmRhcnkgKi8KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0JZXhwID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicKLQkJICYmICEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSAgICB7Ci0JICAgICAgc3dpdGNoICgqaW5wdXRfbGluZV9wb2ludGVyKQotCQl7Ci0JCSAgLyogU2VjdGlvbiBDb250ZW50cyAqLwotCQljYXNlICdhJzogLyogdW5rbm93biAqLwotCQkgIGFzX2JhZCAoXygiVW5zdXBwb3J0ZWQgc2VjdGlvbiBhdHRyaWJ1dGUgLS0gJ2EnIikpOwotCQkgIGJyZWFrOwotCQljYXNlICdjJzogLyogY29kZSBzZWN0aW9uICovCi0JCSAgZmxhZ3MgfD0gU0VDX0NPREU7IAotCQkgIGJyZWFrOwotCQljYXNlICdkJzogLyogc2VjdGlvbiBoYXMgaW5pdGlhbGl6ZWQgZGF0YSAqLwotCQkgIGZsYWdzIHw9IFNFQ19EQVRBOwotCQkgIGJyZWFrOwotCQljYXNlICd1JzogLyogc2VjdGlvbiBoYXMgdW5pbml0aWFsaXplZCBkYXRhICovCi0JCSAgLyogRklYTUU6IFRoaXMgaXMgSU1BR0VfU0NOX0NOVF9VTklOSVRJQUxJWkVEX0RBVEEKLQkJICAgICBpbiB3aW5udC5oICovCi0JCSAgZmxhZ3MgfD0gU0VDX1JPTTsKLQkJICBicmVhazsKLQkJY2FzZSAnaSc6IC8qIHNlY3Rpb24gY29udGFpbnMgZGlyZWN0aXZlcyAoaW5mbykgKi8KLQkJICAvKiBGSVhNRTogVGhpcyBpcyBJTUFHRV9TQ05fTE5LX0lORk8KLQkJICAgICBpbiB3aW5udC5oICovCi0JCSAgZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQkJICBicmVhazsKLQkJY2FzZSAnbic6IC8qIHNlY3Rpb24gY2FuIGJlIGRpc2NhcmRlZCAqLwotCQkgIGZsYWdzICY9fiBTRUNfTE9BRDsgCi0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1InOiAvKiBSZW1vdmUgc2VjdGlvbiBhdCBsaW5rIHRpbWUgKi8KLQkJICBmbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQkJICBicmVhazsKLQotCQkgIC8qIFNlY3Rpb24gUHJvdGVjdGlvbiAqLwotCQljYXNlICdyJzogLyogc2VjdGlvbiBpcyByZWFkYWJsZSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fUkVBRDsKLQkJICBicmVhazsKLQkJY2FzZSAndyc6IC8qIHNlY3Rpb24gaXMgd3JpdGVhYmxlICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX01FTV9XUklURTsKLQkJICBicmVhazsKLQkJY2FzZSAneCc6IC8qIHNlY3Rpb24gaXMgZXhlY3V0YWJsZSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9NRU1fRVhFQ1VURTsKLQkJICBicmVhazsKLQkJY2FzZSAncyc6IC8qIHNlY3Rpb24gaXMgc2hhcmFibGUgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fTUVNX1NIQVJFRDsKLQkJICBicmVhazsKLQotCQkgIC8qIFNlY3Rpb24gQWxpZ25tZW50ICovCi0JCWNhc2UgJzAnOiAvKiBhbGlnbiB0byBieXRlIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzFCWVRFUzsKLQkJICBhbGlnbiA9IDA7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzEnOiAgLyogYWxpZ24gdG8gaGFsZndvcmQgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMkJZVEVTOwotCQkgIGFsaWduID0gMTsKLQkJICBicmVhazsKLQkJY2FzZSAnMic6ICAvKiBhbGlnbiB0byB3b3JkIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzRCWVRFUzsKLQkJICBhbGlnbiA9IDI7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzMnOiAgLyogYWxpZ24gdG8gZG91Ymxld29yZCBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl84QllURVM7Ci0JCSAgYWxpZ24gPSAzOwotCQkgIGJyZWFrOwotCQljYXNlICc0JzogIC8qIGFsaWduIHRvIHF1YWR3b3JkIGJvdW5kYXJ5ICovCi0JCSAgZmxhZ3MgfD0gSU1BR0VfU0NOX0FMSUdOXzE2QllURVM7Ci0JCSAgYWxpZ24gPSA0OwotCQkgIGJyZWFrOwotCQljYXNlICc1JzogIC8qIGFsaWduIHRvIDMyIGJ5dGUgYm91bmRhcnkgKi8KLQkJICBmbGFncyB8PSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUzsKLQkJICBhbGlnbiA9IDU7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzYnOiAgLyogYWxpZ24gdG8gNjQgYnl0ZSBib3VuZGFyeSAqLwotCQkgIGZsYWdzIHw9IElNQUdFX1NDTl9BTElHTl82NEJZVEVTOwotCQkgIGFsaWduID0gNjsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIGFzX2JhZChfKCJ1bmtub3duIHNlY3Rpb24gYXR0cmlidXRlICclYyciKSwKLQkJCSAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkJICBicmVhazsKLQkJfQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICB9Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICB9Ci0KLSAgc2VjID0gc3Vic2VnX25ldyAobmFtZSwgKHN1YnNlZ1QpIGV4cCk7Ci0KLSAgcHBjX3NldF9jdXJyZW50X3NlY3Rpb24oc2VjKTsKLQotICBpZiAoZmxhZ3MgIT0gU0VDX05PX0ZMQUdTKQotICAgIHsKLSAgICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWMsIGZsYWdzKSkKLQlhc19iYWQgKF8oImVycm9yIHNldHRpbmcgZmxhZ3MgZm9yIFwiJXNcIjogJXMiKSwKLQkJYmZkX3NlY3Rpb25fbmFtZSAoc3Rkb3V0cHV0LCBzZWMpLAotCQliZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgfQotCi0gIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQoc3Rkb3V0cHV0LCBzZWMsIGFsaWduKTsKLQotfQotCi1zdGF0aWMgdm9pZAotcHBjX3BlX2Z1bmN0aW9uIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgZW5kYzsKLSAgc3ltYm9sUyAqZXh0X3N5bTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBlbmRjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgZXh0X3N5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBlbmRjOwotCi0gIFNfU0VUX0RBVEFfVFlQRSAoZXh0X3N5bSwgRFRfRkNOIDw8IE5fQlRTSEZUKTsKLSAgU0ZfU0VUX0ZVTkNUSU9OIChleHRfc3ltKTsKLSAgU0ZfU0VUX1BST0NFU1MgKGV4dF9zeW0pOwotICBjb2ZmX2FkZF9saW5lc3ltIChleHRfc3ltKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi1zdGF0aWMgdm9pZAotcHBjX3BlX3RvY2QgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgaWYgKHRvY2RhdGFfc2VjdGlvbiA9PSAwKQotICAgIHsKLSAgICAgIHRvY2RhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudG9jZCIsIDApOwotICAgICAgLyogRklYTUU6IHNlY3Rpb24gZmxhZ3Mgd29uJ3Qgd29yayAqLwotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHRvY2RhdGFfc2VjdGlvbiwKLQkJCSAgICAgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DCi0JCQkgICAgICB8IFNFQ19SRUFET05MWSB8IFNFQ19EQVRBICkpOwotCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHRvY2RhdGFfc2VjdGlvbiwgMik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmRhdGFfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudG9jZCIsIDApOwotICAgIH0KLQotICBwcGNfc2V0X2N1cnJlbnRfc2VjdGlvbih0b2NkYXRhX3NlY3Rpb24pOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIERvbid0IGFkanVzdCBUT0MgcmVsb2NzIHRvIHVzZSB0aGUgc2VjdGlvbiBzeW1ib2wuICAqLwotCi1pbnQKLXBwY19wZV9maXhfYWRqdXN0YWJsZSAoZml4KQotICAgICBmaXhTICpmaXg7Ci17Ci0gIHJldHVybiBmaXgtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfUFBDX1RPQzE2OwotfQotCi0jZW5kaWYKLQwKLSNpZmRlZiBPQkpfWENPRkYKLQotLyogWENPRkYgc3BlY2lmaWMgc3ltYm9sIGFuZCBmaWxlIGhhbmRsaW5nLiAgKi8KLQotLyogQ2Fub25pY2FsaXplIHRoZSBzeW1ib2wgbmFtZS4gIFdlIHVzZSB0aGUgdG8gZm9yY2UgdGhlIHN1ZmZpeCwgaWYKLSAgIGFueSwgdG8gdXNlIHNxdWFyZSBicmFja2V0cywgYW5kIHRvIGJlIGluIHVwcGVyIGNhc2UuICAqLwotCi1jaGFyICoKLXBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKnM7Ci0KLSAgaWYgKHBwY19zdGFiX3N5bWJvbCkKLSAgICByZXR1cm4gbmFtZTsKLQotICBmb3IgKHMgPSBuYW1lOyAqcyAhPSAnXDAnICYmICpzICE9ICd7JyAmJiAqcyAhPSAnWyc7IHMrKykKLSAgICA7Ci0gIGlmICgqcyAhPSAnXDAnKQotICAgIHsKLSAgICAgIGNoYXIgYnJhYzsKLQotICAgICAgaWYgKCpzID09ICdbJykKLQlicmFjID0gJ10nOwotICAgICAgZWxzZQotCXsKLQkgICpzID0gJ1snOwotCSAgYnJhYyA9ICd9JzsKLQl9Ci0KLSAgICAgIGZvciAocysrOyAqcyAhPSAnXDAnICYmICpzICE9IGJyYWM7IHMrKykKLQlpZiAoaXNsb3dlciAoKnMpKQotCSAgKnMgPSB0b3VwcGVyICgqcyk7Ci0KLSAgICAgIGlmICgqcyA9PSAnXDAnIHx8IHNbMV0gIT0gJ1wwJykKLQlhc19iYWQgKF8oImJhZCBzeW1ib2wgc3VmZml4IikpOwotCi0gICAgICAqcyA9ICddJzsKLSAgICB9Ci0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8qIFNldCB0aGUgY2xhc3Mgb2YgYSBzeW1ib2wgYmFzZWQgb24gdGhlIHN1ZmZpeCwgaWYgYW55LiAgVGhpcyBpcwotICAgY2FsbGVkIHdoZW5ldmVyIGEgbmV3IHN5bWJvbCBpcyBjcmVhdGVkLiAgKi8KLQotdm9pZAotcHBjX3N5bWJvbF9uZXdfaG9vayAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIHN0cnVjdCBwcGNfdGNfc3kgKnRjOwotICBjb25zdCBjaGFyICpzOwotCi0gIHRjID0gc3ltYm9sX2dldF90YyAoc3ltKTsKLSAgdGMtPm5leHQgPSBOVUxMOwotICB0Yy0+b3V0cHV0ID0gMDsKLSAgdGMtPmNsYXNzID0gLTE7Ci0gIHRjLT5yZWFsX25hbWUgPSBOVUxMOwotICB0Yy0+c3Vic2VnID0gMDsKLSAgdGMtPmFsaWduID0gMDsKLSAgdGMtPnNpemUgPSBOVUxMOwotICB0Yy0+d2l0aGluID0gTlVMTDsKLQotICBpZiAocHBjX3N0YWJfc3ltYm9sKQotICAgIHJldHVybjsKLQotICBzID0gc3RyY2hyIChTX0dFVF9OQU1FIChzeW0pLCAnWycpOwotICBpZiAocyA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzIG5vIHN1ZmZpeC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsrczsKLQotICBzd2l0Y2ggKHNbMF0pCi0gICAgewotICAgIGNhc2UgJ0InOgotICAgICAgaWYgKHN0cmNtcCAocywgIkJTXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX0JTOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRCc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiREJdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfREI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJEU10iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19EUzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0cnOgotICAgICAgaWYgKHN0cmNtcCAocywgIkdMXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX0dMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiUFJdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfUFI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdSJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJST10iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19STzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlJXXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1JXOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiU1ZdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfU1Y7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdUJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJUQ10iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19UQzsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlRJXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1RJOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChzLCAiVEJdIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfVEI7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKHMsICJUQzBdIikgPT0gMCB8fCBzdHJjbXAgKHMsICJUMF0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19UQzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdVJzoKLSAgICAgIGlmIChzdHJjbXAgKHMsICJVQV0iKSA9PSAwKQotCXRjLT5jbGFzcyA9IFhNQ19VQTsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocywgIlVDXSIpID09IDApCi0JdGMtPmNsYXNzID0gWE1DX1VDOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBpZiAoc3RyY21wIChzLCAiWE9dIikgPT0gMCkKLQl0Yy0+Y2xhc3MgPSBYTUNfWE87Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHRjLT5jbGFzcyA9PSAtMSkKLSAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBzeW1ib2wgc3VmZml4IikpOwotfQotCi0vKiBTZXQgdGhlIGNsYXNzIG9mIGEgbGFiZWwgYmFzZWQgb24gd2hlcmUgaXQgaXMgZGVmaW5lZC4gIFRoaXMKLSAgIGhhbmRsZXMgc3ltYm9scyB3aXRob3V0IHN1ZmZpeGVzLiAgQWxzbywgbW92ZSB0aGUgc3ltYm9sIHNvIHRoYXQgaXQKLSAgIGZvbGxvd3MgdGhlIGNzZWN0IHN5bWJvbC4gICovCi0KLXZvaWQKLXBwY19mcm9iX2xhYmVsIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaWYgKHBwY19jdXJyZW50X2NzZWN0ICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IC0xKQotCXN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gc3ltYm9sX2dldF90YyAocHBjX2N1cnJlbnRfY3NlY3QpLT5jbGFzczsKLQotICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLSAgICAgIHN5bWJvbF9hcHBlbmQgKHN5bSwgc3ltYm9sX2dldF90YyAocHBjX2N1cnJlbnRfY3NlY3QpLT53aXRoaW4sCi0JCSAgICAgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0gICAgICBzeW1ib2xfZ2V0X3RjIChwcGNfY3VycmVudF9jc2VjdCktPndpdGhpbiA9IHN5bTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IGJ5IHBwY19mcm9iX3N5bWJvbCBpZiBhbnkgYWJzb2x1dGUgc3ltYm9scyBhcmUKLSAgIHNlZW4uICBJdCB0ZWxscyBwcGNfYWRqdXN0X3N5bXRhYiB3aGV0aGVyIGl0IG5lZWRzIHRvIGxvb2sgdGhyb3VnaAotICAgdGhlIHN5bWJvbHMuICAqLwotCi1zdGF0aWMgYm9vbGVhbiBwcGNfc2F3X2FiczsKLQotLyogQ2hhbmdlIHRoZSBuYW1lIG9mIGEgc3ltYm9sIGp1c3QgYmVmb3JlIHdyaXRpbmcgaXQgb3V0LiAgU2V0IHRoZQotICAgcmVhbCBuYW1lIGlmIHRoZSAucmVuYW1lIHBzZXVkby1vcCB3YXMgdXNlZC4gIE90aGVyd2lzZSwgcmVtb3ZlIGFueQotICAgY2xhc3Mgc3VmZml4LiAgUmV0dXJuIDEgaWYgdGhlIHN5bWJvbCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIHRoZQotICAgc3ltYm9sIHRhYmxlLiAgKi8KLQotaW50Ci1wcGNfZnJvYl9zeW1ib2wgKHN5bSkKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBzdGF0aWMgc3ltYm9sUyAqcHBjX2xhc3RfZnVuY3Rpb247Ci0gIHN0YXRpYyBzeW1ib2xTICpzZXRfZW5kOwotCi0gIC8qIERpc2NhcmQgc3ltYm9scyB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBzeW1ib2wKLSAgICAgdGFibGUuICAqLwotICBpZiAoISBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzeW0pCi0gICAgICAmJiAoKHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMAotCSAgfHwgKCEgU19JU19FWFRFUk5BTCAoc3ltKQotCSAgICAgICYmICEgc3ltYm9sX2dldF90YyAoc3ltKS0+b3V0cHV0Ci0JICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0ZJTEUpKSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoc3ltYm9sX2dldF90YyAoc3ltKS0+cmVhbF9uYW1lICE9IChjaGFyICopIE5VTEwpCi0gICAgU19TRVRfTkFNRSAoc3ltLCBzeW1ib2xfZ2V0X3RjIChzeW0pLT5yZWFsX25hbWUpOwotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICAgIG5hbWUgPSBTX0dFVF9OQU1FIChzeW0pOwotICAgICAgcyA9IHN0cmNociAobmFtZSwgJ1snKTsKLSAgICAgIGlmIChzICE9IChjaGFyICopIE5VTEwpCi0JewotCSAgdW5zaWduZWQgaW50IGxlbjsKLQkgIGNoYXIgKnNuZXc7Ci0KLQkgIGxlbiA9IHMgLSBuYW1lOwotCSAgc25ldyA9IHhtYWxsb2MgKGxlbiArIDEpOwotCSAgbWVtY3B5IChzbmV3LCBuYW1lLCBsZW4pOwotCSAgc25ld1tsZW5dID0gJ1wwJzsKLQotCSAgU19TRVRfTkFNRSAoc3ltLCBzbmV3KTsKLQl9Ci0gICAgfQotCi0gIGlmIChzZXRfZW5kICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgewotICAgICAgU0FfU0VUX1NZTV9FTkRORFggKHNldF9lbmQsIHN5bSk7Ci0gICAgICBzZXRfZW5kID0gTlVMTDsKLSAgICB9Ci0KLSAgaWYgKFNGX0dFVF9GVU5DVElPTiAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAocHBjX2xhc3RfZnVuY3Rpb24gIT0gKHN5bWJvbFMgKikgTlVMTCkKLQlhc19iYWQgKF8oInR3byAuZnVuY3Rpb24gcHNldWRvLW9wcyB3aXRoIG5vIGludGVydmVuaW5nIC5lZiIpKTsKLSAgICAgIHBwY19sYXN0X2Z1bmN0aW9uID0gc3ltOwotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPnNpemUgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sX2dldF90YyAoc3ltKS0+c2l6ZSwgMSk7Ci0JICBTQV9TRVRfU1lNX0ZTSVpFIChzeW0sCi0JCQkgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5zaXplKSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0ZDTgotCSAgICYmIHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltKSwgIi5lZiIpID09IDApCi0gICAgewotICAgICAgaWYgKHBwY19sYXN0X2Z1bmN0aW9uID09IChzeW1ib2xTICopIE5VTEwpCi0JYXNfYmFkIChfKCIuZWYgd2l0aCBubyBwcmVjZWRpbmcgLmZ1bmN0aW9uIikpOwotICAgICAgZWxzZQotCXsKLQkgIHNldF9lbmQgPSBwcGNfbGFzdF9mdW5jdGlvbjsKLQkgIHBwY19sYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQotCSAgLyogV2UgZG9uJ3QgaGF2ZSBhIENfRUZDTiBzeW1ib2wsIGJ1dCB3ZSBuZWVkIHRvIGZvcmNlIHRoZQotCSAgICAgQ09GRiBiYWNrZW5kIHRvIGJlbGlldmUgdGhhdCBpdCBoYXMgc2VlbiBvbmUuICAqLwotCSAgY29mZl9sYXN0X2Z1bmN0aW9uID0gTlVMTDsKLQl9Ci0gICAgfQotCi0gIGlmICghIFNfSVNfRVhURVJOQUwgKHN5bSkKLSAgICAgICYmIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pID09IDAKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19GSUxFCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfRkNOCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfQkxPQ0sKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19CU1RBVAotICAgICAgJiYgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSAhPSBDX0VTVEFUCi0gICAgICAmJiBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pICE9IENfQklOQ0wKLSAgICAgICYmIFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgIT0gQ19FSU5DTAotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltKSAhPSBwcGNfY29mZl9kZWJ1Z19zZWN0aW9uKQotICAgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSwgQ19ISURFWFQpOwotCi0gIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCi0gICAgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfSElERVhUKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgdW5pb24gaW50ZXJuYWxfYXV4ZW50ICphOwotCi0gICAgICAvKiBDcmVhdGUgYSBjc2VjdCBhdXguICAqLwotICAgICAgaSA9IFNfR0VUX05VTUJFUl9BVVhJTElBUlkgKHN5bSk7Ci0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChzeW0sIGkgKyAxKTsKLSAgICAgIGEgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbaSArIDFdLnUuYXV4ZW50OwotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IFhNQ19UQzApCi0JewotCSAgLyogVGhpcyBpcyB0aGUgVE9DIHRhYmxlLiAgKi8KLQkgIGtub3cgKHN0cmNtcCAoU19HRVRfTkFNRSAoc3ltKSwgIlRPQyIpID09IDApOwotCSAgYS0+eF9jc2VjdC54X3Njbmxlbi5sID0gMDsKLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9ICgyIDw8IDMpIHwgWFRZX1NEOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPnN1YnNlZyAhPSAwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBjc2VjdCBzeW1ib2wuICB4X3NjbmxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUKLQkgICAgIGNzZWN0LiAgKi8KLQkgIGlmIChzeW1ib2xfZ2V0X3RjIChzeW0pLT5uZXh0ID09IChzeW1ib2xTICopIE5VTEwpCi0JICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsCi0JCQkJCQkgICAgICAgU19HRVRfU0VHTUVOVCAoc3ltKSkKLQkJCQkgICAgIC0gU19HRVRfVkFMVUUgKHN5bSkpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bWJvbF9nZXRfdGMgKHN5bSktPm5leHQsIDEpOwotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChTX0dFVF9WQUxVRSAoc3ltYm9sX2dldF90YyAoc3ltKS0+bmV4dCkKLQkJCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgIH0KLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9IChzeW1ib2xfZ2V0X3RjIChzeW0pLT5hbGlnbiA8PCAzKSB8IFhUWV9TRDsKLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IGJzc19zZWN0aW9uKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgKi8KLQkgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IHN5bWJvbF9nZXRfZnJhZyAoc3ltKS0+ZnJfb2Zmc2V0OwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gKHN5bWJvbF9nZXRfdGMgKHN5bSktPmFsaWduIDw8IDMpIHwgWFRZX0NNOwotCSAgaWYgKFNfSVNfRVhURVJOQUwgKHN5bSkpCi0JICAgIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID0gWE1DX1JXOwotCSAgZWxzZQotCSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcyA9IFhNQ19CUzsKLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IGFic29sdXRlX3NlY3Rpb24pCi0JewotCSAgLyogVGhpcyBpcyBhbiBhYnNvbHV0ZSBzeW1ib2wuICBUaGUgY3NlY3Qgd2lsbCBiZSBjcmVhdGVkIGJ5Ci0gICAgICAgICAgICAgcHBjX2FkanVzdF9zeW10YWIuICAqLwotCSAgcHBjX3Nhd19hYnMgPSB0cnVlOwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gWFRZX0xEOwotCSAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IC0xKQotCSAgICBzeW1ib2xfZ2V0X3RjIChzeW0pLT5jbGFzcyA9IFhNQ19YTzsKLQl9Ci0gICAgICBlbHNlIGlmICghIFNfSVNfREVGSU5FRCAoc3ltKSkKLQl7Ci0JICAvKiBUaGlzIGlzIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0JICBhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAwOwotCSAgYS0+eF9jc2VjdC54X3NtdHlwID0gWFRZX0VSOwotCX0KLSAgICAgIGVsc2UgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IFhNQ19UQykKLQl7Ci0JICBzeW1ib2xTICpuZXh0OwotCi0JICAvKiBUaGlzIGlzIGEgVE9DIGRlZmluaXRpb24uICB4X3NjbmxlbiBpcyB0aGUgc2l6ZSBvZiB0aGUKLQkgICAgIFRPQyBlbnRyeS4gICovCi0JICBuZXh0ID0gc3ltYm9sX25leHQgKHN5bSk7Ci0JICB3aGlsZSAoc3ltYm9sX2dldF90YyAobmV4dCktPmNsYXNzID09IFhNQ19UQzApCi0JICAgIG5leHQgPSBzeW1ib2xfbmV4dCAobmV4dCk7Ci0JICBpZiAobmV4dCA9PSAoc3ltYm9sUyAqKSBOVUxMCi0JICAgICAgfHwgc3ltYm9sX2dldF90YyAobmV4dCktPmNsYXNzICE9IFhNQ19UQykKLQkgICAgewotCSAgICAgIGlmIChwcGNfYWZ0ZXJfdG9jX2ZyYWcgPT0gKGZyYWdTICopIE5VTEwpCi0JCWEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChiZmRfc2VjdGlvbl9zaXplIChzdGRvdXRwdXQsCi0JCQkJCQkJICAgZGF0YV9zZWN0aW9uKQotCQkJCQkgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgICAgZWxzZQotCQlhLT54X2NzZWN0Lnhfc2NubGVuLmwgPSAocHBjX2FmdGVyX3RvY19mcmFnLT5mcl9hZGRyZXNzCi0JCQkJCSAtIFNfR0VUX1ZBTFVFIChzeW0pKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKG5leHQsIDEpOwotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IChTX0dFVF9WQUxVRSAobmV4dCkKLQkJCQkgICAgICAgLSBTX0dFVF9WQUxVRSAoc3ltKSk7Ci0JICAgIH0KLQkgIGEtPnhfY3NlY3QueF9zbXR5cCA9ICgyIDw8IDMpIHwgWFRZX1NEOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzeW1ib2xTICpjc2VjdDsKLQotCSAgLyogVGhpcyBpcyBhIG5vcm1hbCBzeW1ib2wgZGVmaW5pdGlvbi4gIHhfc2NubGVuIGlzIHRoZQotCSAgICAgc3ltYm9sIGluZGV4IG9mIHRoZSBjb250YWluaW5nIGNzZWN0LiAgKi8KLQkgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IHRleHRfc2VjdGlvbikKLQkgICAgY3NlY3QgPSBwcGNfdGV4dF9jc2VjdHM7Ci0JICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pID09IGRhdGFfc2VjdGlvbikKLQkgICAgY3NlY3QgPSBwcGNfZGF0YV9jc2VjdHM7Ci0JICBlbHNlCi0JICAgIGFib3J0ICgpOwotCi0JICAvKiBTa2lwIHRoZSBpbml0aWFsIGR1bW15IHN5bWJvbC4gICovCi0JICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dDsKLQotCSAgaWYgKGNzZWN0ID09IChzeW1ib2xTICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJ3YXJuaW5nOiBzeW1ib2wgJXMgaGFzIG5vIGNzZWN0IiksIFNfR0VUX05BTUUgKHN5bSkpOwotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdoaWxlIChzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQkJewotCQkgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQsIDEpOwotCQkgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sX2dldF90YyAoY3NlY3QpLT5uZXh0KQotCQkgICAgICA+IFNfR0VUX1ZBTFVFIChzeW0pKQotCQkgICAgYnJlYWs7Ci0JCSAgY3NlY3QgPSBzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQ7Ci0JCX0KLQotCSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ucCA9Ci0JCWNvZmZzeW1ib2wgKHN5bWJvbF9nZXRfYmZkc3ltIChjc2VjdCkpLT5uYXRpdmU7Ci0JICAgICAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbaSArIDFdLmZpeF9zY25sZW4gPQotCQkxOwotCSAgICB9Ci0JICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfTEQ7Ci0JfQotCQotICAgICAgYS0+eF9jc2VjdC54X3Bhcm1oYXNoID0gMDsKLSAgICAgIGEtPnhfY3NlY3QueF9zbmhhc2ggPSAwOwotICAgICAgaWYgKHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IC0xKQotCWEtPnhfY3NlY3QueF9zbWNsYXMgPSBYTUNfUFI7Ci0gICAgICBlbHNlCi0JYS0+eF9jc2VjdC54X3NtY2xhcyA9IHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzOwotICAgICAgYS0+eF9jc2VjdC54X3N0YWIgPSAwOwotICAgICAgYS0+eF9jc2VjdC54X3Nuc3RhYiA9IDA7Ci0KLSAgICAgIC8qIERvbid0IGxldCB0aGUgQ09GRiBiYWNrZW5kIHJlc29ydCB0aGVzZSBzeW1ib2xzLiAgKi8KLSAgICAgIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfTk9UX0FUX0VORDsKLSAgICB9Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19CU1RBVCkKLSAgICB7Ci0gICAgICAvKiBXZSB3YW50IHRoZSB2YWx1ZSB0byBiZSB0aGUgc3ltYm9sIGluZGV4IG9mIHRoZSByZWZlcmVuY2VkCi0JIGNzZWN0IHN5bWJvbC4gIEJGRCB3aWxsIGRvIHRoYXQgZm9yIHVzIGlmIHdlIHNldCB0aGUgcmlnaHQKLQkgZmxhZ3MuICAqLwotICAgICAgU19TRVRfVkFMVUUgKHN5bSwKLQkJICAgKCh2YWx1ZVQpCi0JCSAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bQotCQkJCShzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW4pKS0+bmF0aXZlKSk7Ci0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+Zml4X3ZhbHVlID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bSkgPT0gQ19TVFNZTSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpibG9jazsKLSAgICAgIHN5bWJvbFMgKmNzZWN0OwotCi0gICAgICAvKiBUaGUgdmFsdWUgaXMgdGhlIG9mZnNldCBmcm9tIHRoZSBlbmNsb3NpbmcgY3NlY3QuICAqLwotICAgICAgYmxvY2sgPSBzeW1ib2xfZ2V0X3RjIChzeW0pLT53aXRoaW47Ci0gICAgICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGJsb2NrKS0+d2l0aGluOwotICAgICAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGNzZWN0LCAxKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW0sIFNfR0VUX1ZBTFVFIChzeW0pIC0gU19HRVRfVkFMVUUgKGNzZWN0KSk7Ci0gICAgfQotICBlbHNlIGlmIChTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfQklOQ0wKLQkgICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRUlOQ0wpCi0gICAgewotICAgICAgLyogV2Ugd2FudCB0aGUgdmFsdWUgdG8gYmUgYSBmaWxlIG9mZnNldCBpbnRvIHRoZSBsaW5lIG51bWJlcnMuCi0gICAgICAgICBCRkQgd2lsbCBkbyB0aGF0IGZvciB1cyBpZiB3ZSBzZXQgdGhlIHJpZ2h0IGZsYWdzLiAgV2UgaGF2ZQotICAgICAgICAgYWxyZWFkeSBzZXQgdGhlIHZhbHVlIGNvcnJlY3RseS4gICovCi0gICAgICBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltKSktPm5hdGl2ZS0+Zml4X2xpbmUgPSAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogQWRqdXN0IHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIGNyZWF0ZXMgY3NlY3Qgc3ltYm9scyBmb3IgYWxsCi0gICBhYnNvbHV0ZSBzeW1ib2xzLiAgKi8KLQotdm9pZAotcHBjX2FkanVzdF9zeW10YWIgKCkKLXsKLSAgc3ltYm9sUyAqc3ltOwotCi0gIGlmICghIHBwY19zYXdfYWJzKQotICAgIHJldHVybjsKLQotICBmb3IgKHN5bSA9IHN5bWJvbF9yb290UDsgc3ltICE9IE5VTEw7IHN5bSA9IHN5bWJvbF9uZXh0IChzeW0pKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmNzZWN0OwotICAgICAgaW50IGk7Ci0gICAgICB1bmlvbiBpbnRlcm5hbF9hdXhlbnQgKmE7Ci0KLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW0pICE9IGFic29sdXRlX3NlY3Rpb24pCi0JY29udGludWU7Ci0KLSAgICAgIGNzZWN0ID0gc3ltYm9sX2NyZWF0ZSAoIi5hYnNbWE9dIiwgYWJzb2x1dGVfc2VjdGlvbiwKLQkJCSAgICAgU19HRVRfVkFMVUUgKHN5bSksICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBzeW1ib2xfZ2V0X2JmZHN5bSAoY3NlY3QpLT52YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW0pOwotICAgICAgU19TRVRfU1RPUkFHRV9DTEFTUyAoY3NlY3QsIENfSElERVhUKTsKLSAgICAgIGkgPSBTX0dFVF9OVU1CRVJfQVVYSUxJQVJZIChjc2VjdCk7Ci0gICAgICBTX1NFVF9OVU1CRVJfQVVYSUxJQVJZIChjc2VjdCwgaSArIDEpOwotICAgICAgYSA9ICZjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoY3NlY3QpKS0+bmF0aXZlW2kgKyAxXS51LmF1eGVudDsKLSAgICAgIGEtPnhfY3NlY3QueF9zY25sZW4ubCA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc210eXAgPSBYVFlfU0Q7Ci0gICAgICBhLT54X2NzZWN0LnhfcGFybWhhc2ggPSAwOwotICAgICAgYS0+eF9jc2VjdC54X3NuaGFzaCA9IDA7Ci0gICAgICBhLT54X2NzZWN0Lnhfc21jbGFzID0gWE1DX1hPOwotICAgICAgYS0+eF9jc2VjdC54X3N0YWIgPSAwOwotICAgICAgYS0+eF9jc2VjdC54X3Nuc3RhYiA9IDA7Ci0KLSAgICAgIHN5bWJvbF9pbnNlcnQgKGNzZWN0LCBzeW0sICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gICAgICBpID0gU19HRVRfTlVNQkVSX0FVWElMSUFSWSAoc3ltKTsKLSAgICAgIGEgPSAmY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbaV0udS5hdXhlbnQ7Ci0gICAgICBhLT54X2NzZWN0Lnhfc2NubGVuLnAgPSBjb2Zmc3ltYm9sIChzeW1ib2xfZ2V0X2JmZHN5bSAoY3NlY3QpKS0+bmF0aXZlOwotICAgICAgY29mZnN5bWJvbCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSkpLT5uYXRpdmVbaV0uZml4X3NjbmxlbiA9IDE7Ci0gICAgfQotCi0gIHBwY19zYXdfYWJzID0gZmFsc2U7Ci19Ci0KLS8qIFNldCB0aGUgVk1BIGZvciBhIHNlY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBvbiBhbGwgdGhlIHNlY3Rpb25zIGluCi0gICB0dXJuLiAgKi8KLQotdm9pZAotcHBjX2Zyb2Jfc2VjdGlvbiAoc2VjKQotICAgICBhc2VjdGlvbiAqc2VjOwotewotICBzdGF0aWMgYmZkX3NpemVfdHlwZSB2bWEgPSAwOwotCi0gIGJmZF9zZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgc2VjLCB2bWEpOwotICB2bWEgKz0gYmZkX3NlY3Rpb25fc2l6ZSAoc3Rkb3V0cHV0LCBzZWMpOwotfQotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0MCi0vKiBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIG9mIHR5cGUgdHlwZSwgYW5kIHN0b3JlIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBpbiAqbGl0cC4gIFRoZSBudW1iZXIKLSAgIG9mIExJVFRMRU5VTVMgZW1pdHRlZCBpcyBzdG9yZWQgaW4gKnNpemVwIC4gIEFuIGVycm9yIG1lc3NhZ2UgaXMKLSAgIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLiAgKi8KLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRwLCBzaXplcCkKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNoYXIgKmxpdHA7Ci0gICAgIGludCAqc2l6ZXA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqdDsKLSAgaW50IGk7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVwID0gMDsKLSAgICAgIHJldHVybiBfKCJiYWQgY2FsbCB0byBtZF9hdG9mIik7Ci0gICAgfQotCi0gIHQgPSBhdG9mX2llZWUgKGlucHV0X2xpbmVfcG9pbnRlciwgdHlwZSwgd29yZHMpOwotICBpZiAodCkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0OwotCi0gICpzaXplcCA9IHByZWMgKiAyOwotCi0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0cCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0cCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0JICBsaXRwICs9IDI7Ci0JfQotICAgIH0KLSAgICAgCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBXcml0ZSBhIHZhbHVlIG91dCB0byB0aGUgb2JqZWN0IGZpbGUsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZQotICAgZW5kaWFubmVzcy4gICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIG4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLSAgICAgaW50IG47Ci17Ci0gIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLSAgICBudW1iZXJfdG9fY2hhcnNfYmlnZW5kaWFuIChidWYsIHZhbCwgbik7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChidWYsIHZhbCwgbik7Ci19Ci0KLS8qIEFsaWduIGEgc2VjdGlvbiAoSSBkb24ndCBrbm93IHdoeSB0aGlzIGlzIG1hY2hpbmUgZGVwZW5kZW50KS4gICovCi0KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnLCBhZGRyKQotICAgICBhc2VjdGlvbiAqc2VnOwotICAgICB2YWx1ZVQgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotCi0gIHJldHVybiAoKGFkZHIgKyAoMSA8PCBhbGlnbikgLSAxKSAmICgtMSA8PCBhbGlnbikpOwotfQotCi0vKiBXZSBkb24ndCBoYXZlIGFueSBmb3JtIG9mIHJlbGF4aW5nLiAgKi8KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ3AsIHNlZykKLSAgICAgZnJhZ1MgKmZyYWdwOwotICAgICBhc2VjdGlvbiAqc2VnOwotewotICBhYm9ydCAoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnQgYSBtYWNoaW5lIGRlcGVuZGVudCBmcmFnLiAgV2UgbmV2ZXIgZ2VuZXJhdGUgdGhlc2UuICAqLwotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGFiZmQsIHNlYywgZnJhZ3ApCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgZnJhZ1MgKmZyYWdwOwotewotICBhYm9ydCAoKTsKLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgY29uY2VybmluZyByZWxvY3MuICAqLwotCi0vKiBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCBhIFBDIHJlbGF0aXZlIGp1bXAgc2hvdWxkIGJlIGNhbGN1bGF0ZWQsCi0gICBnaXZlbiBhIFBDIHJlbGF0aXZlIHJlbG9jLiAgKi8KLQotbG9uZwotbWRfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWMpCi0gICAgIGZpeFMgKmZpeHA7Ci0gICAgIHNlZ1Qgc2VjOwotewotICByZXR1cm4gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotfQotCi0jaWZkZWYgT0JKX1hDT0ZGCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHRvIHNlZSB3aGV0aGVyIGEgZml4dXAgc2hvdWxkIGJlIGFkanVzdGVkIHRvIHVzZSBhCi0gICBzZWN0aW9uIHN5bWJvbC4gIFdlIHRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIGNoYW5nZSBhIGZpeHVwIGFnYWluc3QKLSAgIGEgc3ltYm9sIGluIHRoZSBUT0Mgc3Vic2VnbWVudCBpbnRvIGEgcmVsb2MgYWdhaW5zdCB0aGUKLSAgIGNvcnJlc3BvbmRpbmcgLnRjIHN5bWJvbC4gICovCi0KLWludAotcHBjX2ZpeF9hZGp1c3RhYmxlIChmaXgpCi0gICAgIGZpeFMgKmZpeDsKLXsKLSAgdmFsdWVUIHZhbDsKLQotICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZml4LT5meF9hZGRzeSwgMSk7Ci0gIHZhbCA9IFNfR0VUX1ZBTFVFIChmaXgtPmZ4X2FkZHN5KTsKLSAgaWYgKHBwY190b2NfY3NlY3QgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgZml4LT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiBmaXgtPmZ4X2FkZHN5ICE9IHBwY190b2NfY3NlY3QKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeC0+ZnhfYWRkc3kpID09IGRhdGFfc2VjdGlvbgotICAgICAgJiYgdmFsID49IHBwY190b2NfZnJhZy0+ZnJfYWRkcmVzcwotICAgICAgJiYgKHBwY19hZnRlcl90b2NfZnJhZyA9PSAoZnJhZ1MgKikgTlVMTAotCSAgfHwgdmFsIDwgcHBjX2FmdGVyX3RvY19mcmFnLT5mcl9hZGRyZXNzKSkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeTsKLQotICAgICAgZm9yIChzeSA9IHN5bWJvbF9uZXh0IChwcGNfdG9jX2NzZWN0KTsKLQkgICBzeSAhPSAoc3ltYm9sUyAqKSBOVUxMOwotCSAgIHN5ID0gc3ltYm9sX25leHQgKHN5KSkKLQl7Ci0JICBpZiAoc3ltYm9sX2dldF90YyAoc3kpLT5jbGFzcyA9PSBYTUNfVEMwKQotCSAgICBjb250aW51ZTsKLQkgIGlmIChzeW1ib2xfZ2V0X3RjIChzeSktPmNsYXNzICE9IFhNQ19UQykKLQkgICAgYnJlYWs7Ci0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ksIDEpOwotCSAgaWYgKHZhbCA9PSBTX0dFVF9WQUxVRSAoc3kpKQotCSAgICB7Ci0JICAgICAgZml4LT5meF9hZGRzeSA9IHN5OwotCSAgICAgIGZpeC0+ZnhfYWRkbnVtYmVyID0gdmFsIC0gcHBjX3RvY19mcmFnLT5mcl9hZGRyZXNzOwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JfQotCi0gICAgICBhc19iYWRfd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkgICAgXygic3ltYm9sIGluIC50b2MgZG9lcyBub3QgbWF0Y2ggYW55IC50YyIpKTsKLSAgICB9Ci0KLSAgLyogUG9zc2libHkgYWRqdXN0IHRoZSByZWxvYyB0byBiZSBhZ2FpbnN0IHRoZSBjc2VjdC4gICovCi0gIGlmIChmaXgtPmZ4X2FkZHN5ICE9IChzeW1ib2xTICopIE5VTEwKLSAgICAgICYmIHN5bWJvbF9nZXRfdGMgKGZpeC0+ZnhfYWRkc3kpLT5zdWJzZWcgPT0gMAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPmNsYXNzICE9IFhNQ19UQzAKLSAgICAgICYmIHN5bWJvbF9nZXRfdGMgKGZpeC0+ZnhfYWRkc3kpLT5jbGFzcyAhPSBYTUNfVEMKLSAgICAgICYmIFNfR0VUX1NFR01FTlQgKGZpeC0+ZnhfYWRkc3kpICE9IGJzc19zZWN0aW9uCi0gICAgICAvKiBEb24ndCBhZGp1c3QgaWYgdGhpcyBpcyBhIHJlbG9jIGluIHRoZSB0b2Mgc2VjdGlvbi4gICovCi0gICAgICAmJiAoU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgIT0gZGF0YV9zZWN0aW9uCi0JICB8fCBwcGNfdG9jX2NzZWN0ID09IE5VTEwKLQkgIHx8IHZhbCA8IHBwY190b2NfZnJhZy0+ZnJfYWRkcmVzcwotCSAgfHwgKHBwY19hZnRlcl90b2NfZnJhZyAhPSBOVUxMCi0JICAgICAgJiYgdmFsID49IHBwY19hZnRlcl90b2NfZnJhZy0+ZnJfYWRkcmVzcykpKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKmNzZWN0OwotCi0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgPT0gdGV4dF9zZWN0aW9uKQotCWNzZWN0ID0gcHBjX3RleHRfY3NlY3RzOwotICAgICAgZWxzZSBpZiAoU19HRVRfU0VHTUVOVCAoZml4LT5meF9hZGRzeSkgPT0gZGF0YV9zZWN0aW9uKQotCWNzZWN0ID0gcHBjX2RhdGFfY3NlY3RzOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICAvKiBTa2lwIHRoZSBpbml0aWFsIGR1bW15IHN5bWJvbC4gICovCi0gICAgICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dDsKLQotICAgICAgaWYgKGNzZWN0ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgd2hpbGUgKHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dCAhPSAoc3ltYm9sUyAqKSBOVUxMCi0JCSAmJiAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xfZ2V0X3RjIChjc2VjdCktPm5leHQpLT5mcl9hZGRyZXNzCi0JCSAgICAgPD0gc3ltYm9sX2dldF9mcmFnIChmaXgtPmZ4X2FkZHN5KS0+ZnJfYWRkcmVzcykpCi0JICAgIHsKLQkgICAgICAvKiBJZiB0aGUgY3NlY3QgYWRkcmVzcyBlcXVhbHMgdGhlIHN5bWJvbCB2YWx1ZSwgdGhlbiB3ZQotICAgICAgICAgICAgICAgICBoYXZlIHRvIGxvb2sgdGhyb3VnaCB0aGUgZnVsbCBzeW1ib2wgdGFibGUgdG8gc2VlCi0gICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhpcyBpcyB0aGUgY3NlY3Qgd2Ugd2FudC4gIE5vdGUgdGhhdCB3ZSB3aWxsCi0gICAgICAgICAgICAgICAgIG9ubHkgZ2V0IGhlcmUgaWYgdGhlIGNzZWN0IGhhcyB6ZXJvIGxlbmd0aC4gICovCi0JICAgICAgaWYgKChzeW1ib2xfZ2V0X2ZyYWcgKGNzZWN0KS0+ZnJfYWRkcmVzcwotCQkgICA9PSBzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9hZGRyZXNzKQotCQkgICYmIFNfR0VUX1ZBTFVFIChjc2VjdCkgPT0gU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpKQotCQl7Ci0JCSAgc3ltYm9sUyAqc2NhbjsKLQotCQkgIGZvciAoc2NhbiA9IHN5bWJvbF9uZXh0IChjc2VjdCk7Ci0JCSAgICAgICBzY2FuICE9IE5VTEw7Ci0JCSAgICAgICBzY2FuID0gc3ltYm9sX25leHQgKHNjYW4pKQotCQkgICAgewotCQkgICAgICBpZiAoc3ltYm9sX2dldF90YyAoc2NhbiktPnN1YnNlZyAhPSAwKQotCQkJYnJlYWs7Ci0JCSAgICAgIGlmIChzY2FuID09IGZpeC0+ZnhfYWRkc3kpCi0JCQlicmVhazsKLQkJICAgIH0KLQotCQkgIC8qIElmIHdlIGZvdW5kIHRoZSBzeW1ib2wgYmVmb3JlIHRoZSBuZXh0IGNzZWN0Ci0gICAgICAgICAgICAgICAgICAgICBzeW1ib2wsIHRoZW4gdGhpcyBpcyB0aGUgY3NlY3Qgd2Ugd2FudC4gICovCi0JCSAgaWYgKHNjYW4gPT0gZml4LT5meF9hZGRzeSkKLQkJICAgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBjc2VjdCA9IHN5bWJvbF9nZXRfdGMgKGNzZWN0KS0+bmV4dDsKLQkgICAgfQotCi0JICBmaXgtPmZ4X29mZnNldCArPSAoU19HRVRfVkFMVUUgKGZpeC0+ZnhfYWRkc3kpCi0JCQkgICAgIC0gc3ltYm9sX2dldF9mcmFnIChjc2VjdCktPmZyX2FkZHJlc3MpOwotCSAgZml4LT5meF9hZGRzeSA9IGNzZWN0OwotCX0KLSAgICB9Ci0KLSAgLyogQWRqdXN0IGEgcmVsb2MgYWdhaW5zdCBhIC5sY29tbSBzeW1ib2wgdG8gYmUgYWdhaW5zdCB0aGUgYmFzZQotICAgICAubGNvbW0uICAqLwotICBpZiAoZml4LT5meF9hZGRzeSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0gICAgICAmJiBTX0dFVF9TRUdNRU5UIChmaXgtPmZ4X2FkZHN5KSA9PSBic3Nfc2VjdGlvbgotICAgICAgJiYgISBTX0lTX0VYVEVSTkFMIChmaXgtPmZ4X2FkZHN5KSkKLSAgICB7Ci0gICAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltYm9sX2dldF9mcmFnIChmaXgtPmZ4X2FkZHN5KS0+ZnJfc3ltYm9sLCAxKTsKLSAgICAgIGZpeC0+Znhfb2Zmc2V0ICs9Ci0JKFNfR0VUX1ZBTFVFIChmaXgtPmZ4X2FkZHN5KQotCSAtIFNfR0VUX1ZBTFVFIChzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9zeW1ib2wpKTsKLSAgICAgIGZpeC0+ZnhfYWRkc3kgPSBzeW1ib2xfZ2V0X2ZyYWcgKGZpeC0+ZnhfYWRkc3kpLT5mcl9zeW1ib2w7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi0vKiBBIHJlbG9jIGZyb20gb25lIGNzZWN0IHRvIGFub3RoZXIgbXVzdCBiZSBrZXB0LiAgVGhlIGFzc2VtYmxlcgotICAgd2lsbCwgb2YgY291cnNlLCBrZWVwIHJlbG9jcyBiZXR3ZWVuIHNlY3Rpb25zLCBhbmQgaXQgd2lsbCBrZWVwCi0gICBhYnNvbHV0ZSByZWxvY3MsIGJ1dCB3ZSBuZWVkIHRvIGZvcmNlIGl0IHRvIGtlZXAgUEMgcmVsYXRpdmUgcmVsb2NzCi0gICBiZXR3ZWVuIHR3byBjc2VjdHMgaW4gdGhlIHNhbWUgc2VjdGlvbi4gICovCi0KLWludAotcHBjX2ZvcmNlX3JlbG9jYXRpb24gKGZpeCkKLSAgICAgZml4UyAqZml4OwotewotICAvKiBBdCB0aGlzIHBvaW50IGZpeC0+ZnhfYWRkc3kgc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0bwotICAgICBhIGNzZWN0IHN5bWJvbC4gIElmIHRoZSBjc2VjdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBmcmFnbWVudCwgdGhlbgotICAgICB3ZSBuZWVkIHRvIGZvcmNlIHRoZSByZWxvY2F0aW9uLiAgKi8KLSAgaWYgKGZpeC0+ZnhfcGNyZWwKLSAgICAgICYmIGZpeC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPnN1YnNlZyAhPSAwCi0gICAgICAmJiAoKHN5bWJvbF9nZXRfZnJhZyAoZml4LT5meF9hZGRzeSktPmZyX2FkZHJlc3MKLQkgICA+IGZpeC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcykKLQkgIHx8IChzeW1ib2xfZ2V0X3RjIChmaXgtPmZ4X2FkZHN5KS0+bmV4dCAhPSBOVUxMCi0JICAgICAgJiYgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sX2dldF90YyAoZml4LT5meF9hZGRzeSktPm5leHQpLT5mcl9hZGRyZXNzCi0JCSAgPD0gZml4LT5meF9mcmFnLT5mcl9hZGRyZXNzKSkpKQotICAgIHJldHVybiAxOwotCi0gIHJldHVybiAwOwotfQotCi0jZW5kaWYgLyogT0JKX1hDT0ZGICovCi0KLS8qIFNlZSB3aGV0aGVyIGEgc3ltYm9sIGlzIGluIHRoZSBUT0Mgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBpbnQKLXBwY19pc190b2Nfc3ltIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSNpZmRlZiBPQkpfWENPRkYKLSAgcmV0dXJuIHN5bWJvbF9nZXRfdGMgKHN5bSktPmNsYXNzID09IFhNQ19UQzsKLSNlbHNlCi0gIHJldHVybiBzdHJjbXAgKHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltKSksICIuZ290IikgPT0gMDsKLSNlbmRpZgotfQotCi0vKiBBcHBseSBhIGZpeHVwIHRvIHRoZSBvYmplY3QgY29kZS4gIFRoaXMgaXMgY2FsbGVkIGZvciBhbGwgdGhlCi0gICBmaXh1cHMgd2UgZ2VuZXJhdGVkIGJ5IHRoZSBjYWxsIHRvIGZpeF9uZXdfZXhwLCBhYm92ZS4gIEluIHRoZSBjYWxsCi0gICBhYm92ZSB3ZSB1c2VkIGEgcmVsb2MgY29kZSB3aGljaCB3YXMgdGhlIGxhcmdlc3QgbGVnYWwgcmVsb2MgY29kZQotICAgcGx1cyB0aGUgb3BlcmFuZCBpbmRleC4gIEhlcmUgd2UgdW5kbyB0aGF0IHRvIHJlY292ZXIgdGhlIG9wZXJhbmQKLSAgIGluZGV4LiAgQXQgdGhpcyBwb2ludCBhbGwgc3ltYm9sIHZhbHVlcyBzaG91bGQgYmUgZnVsbHkgcmVzb2x2ZWQsCi0gICBhbmQgd2UgYXR0ZW1wdCB0byBjb21wbGV0ZWx5IHJlc29sdmUgdGhlIHJlbG9jLiAgSWYgd2UgY2FuIG5vdCBkbwotICAgdGhhdCwgd2UgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IHJlbG9jIGNvZGUgYW5kIHB1dCBpdCBiYWNrIGluIHRoZQotICAgZml4dXAuICAqLwotCi1pbnQKLW1kX2FwcGx5X2ZpeDMgKGZpeHAsIHZhbHVlcCwgc2VnKQotICAgICBmaXhTICpmaXhwOwotICAgICB2YWx1ZVQgKnZhbHVlcDsKLSAgICAgc2VnVCBzZWc7Ci17Ci0gIHZhbHVlVCB2YWx1ZTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgdmFsdWUgPSAqdmFsdWVwOwotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBgKnZhbHVlcCcgbWF5IGNvbnRhaW4gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgb24gd2hpY2ggdGhlIHJlbG9jCi0JIHdpbGwgYmUgYmFzZWQ7IHdlIGhhdmUgdG8gcmVtb3ZlIGl0LiAgKi8KLSAgICAgIGlmIChzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChmaXhwLT5meF9hZGRzeSkKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X2FkZHN5KSAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgICYmICEgYmZkX2lzX2NvbV9zZWN0aW9uIChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkpKQotCXZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9hZGRzeSk7Ci0KLSAgICAgIC8qIEZJWE1FOiBXaHkgJysnPyAgQmV0dGVyIHlldCwgd2hhdCBleGFjdGx5IGlzICcqdmFsdWVwJwotCSBzdXBwb3NlZCB0byBiZT8gIEkgdGhpbmsgdGhpcyBpcyByZWxhdGVkIHRvIHZhcmlvdXMgc2ltaWxhcgotCSBGSVhNRXMgaW4gdGMtaTM4Ni5jIGFuZCB0Yy1zcGFyYy5jLiAgKi8KLSAgICAgIGlmIChmaXhwLT5meF9wY3JlbCkKLQl2YWx1ZSArPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotI2Vsc2UKLSAgLyogRklYTUUgRklYTUUgRklYTUU6IFRoZSB2YWx1ZSB3ZSBhcmUgcGFzc2VkIGluICp2YWx1ZXAgaW5jbHVkZXMKLSAgICAgdGhlIHN5bWJvbCB2YWx1ZXMuICBTaW5jZSB3ZSBhcmUgdXNpbmcgQkZEX0FTU0VNQkxFUiwgaWYgd2UgYXJlCi0gICAgIGRvaW5nIHRoaXMgcmVsb2NhdGlvbiB0aGUgY29kZSBpbiB3cml0ZS5jIGlzIGdvaW5nIHRvIGNhbGwKLSAgICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiwgd2hpY2ggaXMgYWxzbyBnb2luZyB0byB1c2UgdGhlIHN5bWJvbAotICAgICB2YWx1ZS4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgcmVsb2MgaXMgZnVsbHkgcmVzb2x2ZWQgd2Ugd2FudCB0bwotICAgICB1c2UgKnZhbHVlcCBzaW5jZSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIGlzIG5vdCBiZWluZyB1c2VkLgotICAgICBIb3dldmVyLCBpZiB0aGUgcmVsb2MgaXMgbm90IGZ1bGx5IHJlc29sdmVkIHdlIGRvIG5vdCB3YW50IHRvIHVzZQotICAgICAqdmFsdWVwLCBhbmQgbXVzdCB1c2UgZnhfb2Zmc2V0IGluc3RlYWQuICBIb3dldmVyLCBpZiB0aGUgcmVsb2MKLSAgICAgaXMgUEMgcmVsYXRpdmUsIHdlIGRvIHdhbnQgdG8gdXNlICp2YWx1ZXAgc2luY2UgaXQgaW5jbHVkZXMgdGhlCi0gICAgIHJlc3VsdCBvZiBtZF9wY3JlbF9mcm9tLiAgVGhpcyBpcyBjb25mdXNpbmcuICAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICp2YWx1ZXA7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHZhbHVlID0gKnZhbHVlcDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbHVlID0gZml4cC0+Znhfb2Zmc2V0OwotICAgICAgaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IChzeW1ib2xTICopIE5VTEwpCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKGZpeHAtPmZ4X3N1YnN5KSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotCSAgICB2YWx1ZSAtPSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogV2UgY2FuJ3QgYWN0dWFsbHkgc3VwcG9ydCBzdWJ0cmFjdGluZyBhIHN5bWJvbC4gICovCi0JICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgIF8oImV4cHJlc3Npb24gdG9vIGNvbXBsZXgiKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKChpbnQpIGZpeHAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgIGNoYXIgKndoZXJlOwotICAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gICAgICBvcGluZGV4ID0gKGludCkgZml4cC0+Znhfcl90eXBlIC0gKGludCkgQkZEX1JFTE9DX1VOVVNFRDsKLQotICAgICAgb3BlcmFuZCA9ICZwb3dlcnBjX29wZXJhbmRzW29waW5kZXhdOwotCi0jaWZkZWYgT0JKX1hDT0ZGCi0gICAgICAvKiBJdCBhcHBlYXJzIHRoYXQgYW4gaW5zdHJ1Y3Rpb24gbGlrZQotCSAgICAgbCA5LExDLi4xKDMwKQotCSB3aGVuIExDLi4xIGlzIG5vdCBhIFRPQyBzeW1ib2wgZG9lcyBub3QgZ2VuZXJhdGUgYSByZWxvYy4gIEl0Ci0JIHVzZXMgdGhlIG9mZnNldCBvZiBMQy4uMSB3aXRoaW4gaXRzIGNzZWN0LiAgSG93ZXZlciwgLmxvbmcKLQkgTEMuLjEgd2lsbCBnZW5lcmF0ZSBhIHJlbG9jLiAgSSBjYW4ndCBmaW5kIGFueSBkb2N1bWVudGF0aW9uCi0JIG9uIGhvdyB0aGVzZSBjYXNlcyBhcmUgdG8gYmUgZGlzdGluZ3Vpc2hlZCwgc28gdGhpcyBpcyBhIHdpbGQKLQkgZ3Vlc3MuICBUaGVzZSBjYXNlcyBhcmUgZ2VuZXJhdGVkIGJ5IGdjYyAtbW1pbmltYWwtdG9jLiAgKi8KLSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpICE9IDAKLQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKLQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDAKLQkgICYmIG9wZXJhbmQtPmluc2VydCA9PSBOVUxMCi0JICAmJiBmaXhwLT5meF9hZGRzeSAhPSBOVUxMCi0JICAmJiBzeW1ib2xfZ2V0X3RjIChmaXhwLT5meF9hZGRzeSktPnN1YnNlZyAhPSAwCi0JICAmJiBzeW1ib2xfZ2V0X3RjIChmaXhwLT5meF9hZGRzeSktPmNsYXNzICE9IFhNQ19UQwotCSAgJiYgc3ltYm9sX2dldF90YyAoZml4cC0+ZnhfYWRkc3kpLT5jbGFzcyAhPSBYTUNfVEMwCi0JICAmJiBTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gYnNzX3NlY3Rpb24pCi0JewotCSAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0JICBmaXhwLT5meF9kb25lID0gMTsKLQl9Ci0jZW5kaWYKLQotICAgICAgLyogRmV0Y2ggdGhlIGluc3RydWN0aW9uLCBpbnNlcnQgdGhlIGZ1bGx5IHJlc29sdmVkIG9wZXJhbmQKLQkgdmFsdWUsIGFuZCBzdHVmZiB0aGUgaW5zdHJ1Y3Rpb24gYmFjayBhZ2Fpbi4gICovCi0gICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQlpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZQotCWluc24gPSBiZmRfZ2V0bDMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBpbnNuID0gcHBjX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAob2Zmc2V0VCkgdmFsdWUsCi0JCQkJIGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUpOwotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCWJmZF9wdXRiMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgLyogTm90aGluZyBlbHNlIHRvIGRvIGhlcmUuICAqLwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24uCi0JIFdlIGFyZSBvbmx5IHByZXBhcmVkIHRvIHR1cm4gYSBmZXcgb2YgdGhlIG9wZXJhbmRzIGludG8KLQkgcmVsb2NzLgotCSBGSVhNRTogV2UgbmVlZCB0byBoYW5kbGUgdGhlIERTIGZpZWxkIGF0IHRoZSB2ZXJ5IGxlYXN0LgotCSBGSVhNRTogU2VsZWN0aW5nIHRoZSByZWxvYyB0eXBlIGlzIGEgYml0IGhhcGhhemFyZDsgcGVyaGFwcwotCSB0aGVyZSBzaG91bGQgYmUgYSBuZXcgZmllbGQgaW4gdGhlIG9wZXJhbmQgdGFibGUuICAqLwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1JFTEFUSVZFKSAhPSAwCi0JICAmJiBvcGVyYW5kLT5iaXRzID09IDI2Ci0JICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAwKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19QUENfQjI2OwotICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDAKLQkgICYmIG9wZXJhbmQtPmJpdHMgPT0gMTYKLQkgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CMTY7Ci0gICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9BQlNPTFVURSkgIT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDI2Ci0JICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDApCi0JZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19CQTI2OwotICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQUJTT0xVVEUpICE9IDAKLQkgICAgICAgJiYgb3BlcmFuZC0+Yml0cyA9PSAxNgotCSAgICAgICAmJiBvcGVyYW5kLT5zaGlmdCA9PSAwKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19QUENfQkExNjsKLSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX1BBUkVOUykgIT0gMAotCSAgICAgICAmJiBvcGVyYW5kLT5iaXRzID09IDE2Ci0JICAgICAgICYmIG9wZXJhbmQtPnNoaWZ0ID09IDAKLQkgICAgICAgJiYgb3BlcmFuZC0+aW5zZXJ0ID09IE5VTEwKLQkgICAgICAgJiYgZml4cC0+ZnhfYWRkc3kgIT0gTlVMTAotCSAgICAgICAmJiBwcGNfaXNfdG9jX3N5bSAoZml4cC0+ZnhfYWRkc3kpKQotCXsKLQkgIGZpeHAtPmZ4X3NpemUgPSAyOwotCSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCSAgICBmaXhwLT5meF93aGVyZSArPSAyOwotCSAgZml4cC0+Znhfcl90eXBlID0gQkZEX1JFTE9DX1BQQ19UT0MxNjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqc2ZpbGU7Ci0JICB1bnNpZ25lZCBpbnQgc2xpbmU7Ci0KLQkgIC8qIFVzZSBleHByX3N5bWJvbF93aGVyZSB0byBzZWUgaWYgdGhpcyBpcyBhbiBleHByZXNzaW9uCi0gICAgICAgICAgICAgc3ltYm9sLiAgKi8KLQkgIGlmIChleHByX3N5bWJvbF93aGVyZSAoZml4cC0+ZnhfYWRkc3ksICZzZmlsZSwgJnNsaW5lKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICBfKCJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIikpOwotCSAgZWxzZQotCSAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgIF8oInVuc3VwcG9ydGVkIHJlbG9jYXRpb24gdHlwZSIpKTsKLQkgIGZpeHAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZmRlZiBPQkpfRUxGCi0gICAgICBwcGNfZWxmX3ZhbGlkYXRlX2ZpeCAoZml4cCwgc2VnKTsKLSNlbmRpZgotICAgICAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzMyOgotCWNhc2UgQkZEX1JFTE9DX0NUT1I6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMl9QQ1JFTDsKLQkJCQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19SVkE6Ci0JY2FzZSBCRkRfUkVMT0NfMzJfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfMzJfQkFTRVJFTDoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMzI6Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZSwKLQkJCSAgICAgIHZhbHVlLCA0KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQljYXNlIEJGRF9SRUxPQ18xNjoKLQljYXNlIEJGRF9SRUxPQ19HUFJFTDE2OgotCWNhc2UgQkZEX1JFTE9DXzE2X0dPVF9QQ1JFTDoKLQljYXNlIEJGRF9SRUxPQ18xNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfTE8xNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9HT1RPRkY6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9TX0dPVE9GRjoKLQljYXNlIEJGRF9SRUxPQ19MTzE2X0JBU0VSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9CQVNFUkVMOgotCWNhc2UgQkZEX1JFTE9DX0hJMTZfU19CQVNFUkVMOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNjoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX05BRERSMTZfTE86Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9OQUREUjE2X0hJOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfTkFERFIxNl9IQToKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQUkxNjoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1NEQTJSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9TREEySTE2OgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU0VDMTY6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTVF9MTzoKLQljYXNlIEJGRF9SRUxPQ19QUENfRU1CX1JFTFNUX0hJOgotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfUkVMU1RfSEE6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0VNQl9SRUxTREE6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX1RPQzE2OgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICB7Ci0JICAgICAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwpCi0JCWFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJCSAgICAgIF8oImNhbm5vdCBlbWl0IFBDIHJlbGF0aXZlICVzIHJlbG9jYXRpb24gYWdhaW5zdCAlcyIpLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSksCi0JCQkgICAgICBTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSkpOwotCSAgICAgIGVsc2UKLQkJYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkJICAgICAgXygiY2Fubm90IGVtaXQgUEMgcmVsYXRpdmUgJXMgcmVsb2NhdGlvbiIpLAotCQkJICAgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSkpOwotCSAgICB9Ci0KLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDIpOwotCSAgYnJlYWs7Ci0KLQkgIC8qIFRoaXMgY2FzZSBoYXBwZW5zIHdoZW4geW91IHdyaXRlLCBmb3IgZXhhbXBsZSwKLQkgICAgIGxpcyAlcjMsKEwxLUwyKUBoYQotCSAgICAgd2hlcmUgTDEgYW5kIEwyIGFyZSBkZWZpbmVkIGxhdGVyLiAgKi8KLQljYXNlIEJGRF9SRUxPQ19ISTE2OgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUgPj4gMTYsIDIpOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfSEkxNl9TOgotCSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotCSAgICBhYm9ydCAoKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgKHZhbHVlICsgMHg4MDAwKSA+PiAxNiwgMik7Ci0JICBicmVhazsKLQotCSAgLyogQmVjYXVzZSBTREEyMSBtb2RpZmllcyB0aGUgcmVnaXN0ZXIgZmllbGQsIHRoZSBzaXplIGlzIHNldCB0byA0Ci0JICAgICBieXRlcywgcmF0aGVyIHRoYW4gMiwgc28gb2Zmc2V0IGl0IGhlcmUgYXBwcm9wcmlhdGVseSAqLwotCWNhc2UgQkZEX1JFTE9DX1BQQ19FTUJfU0RBMjE6Ci0JICBpZiAoZml4cC0+ZnhfcGNyZWwpCi0JICAgIGFib3J0ICgpOwotCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZQotCQkJICAgICAgKyAoKHRhcmdldF9iaWdfZW5kaWFuKSA/IDIgOiAwKSwKLQkJCSAgICAgIHZhbHVlLCAyKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfODoKLQkgIGlmIChmaXhwLT5meF9wY3JlbCkKLQkgICAgYWJvcnQgKCk7Ci0KLQkgIG1kX251bWJlcl90b19jaGFycyAoZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCArIGZpeHAtPmZ4X3doZXJlLAotCQkJICAgICAgdmFsdWUsIDEpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ18yNF9QTFRfUENSRUw6Ci0JY2FzZSBCRkRfUkVMT0NfUFBDX0xPQ0FMMjRQQzoKLQkgIGlmICghZml4cC0+ZnhfcGNyZWwgJiYgIWZpeHAtPmZ4X2RvbmUpCi0JICAgIGFib3J0ICgpOwotCi0JICBpZiAoZml4cC0+ZnhfZG9uZSkKLQkgIHsKLQkgICAgY2hhciAqd2hlcmU7Ci0JICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLQkgICAgCi0JICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0JICAgICAgIHZhbHVlLCBhbmQgc3R1ZmYgdGhlIGluc3RydWN0aW9uIGJhY2sgYWdhaW4uICAqLwotCSAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLQkgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCSAgICAgIGluc24gPSBiZmRfZ2V0YjMyICgodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICAgIGVsc2UKLQkgICAgICBpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotCSAgICBpZiAoKHZhbHVlICYgMykgIT0gMCkKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygibXVzdCBicmFuY2ggdG8gYW4gYWRkcmVzcyBhIG11bHRpcGxlIG9mIDQiKSk7Ci0JICAgIGlmICgob2Zmc2V0VCkgdmFsdWUgPCAtMHg0MDAwMDAwMAotCQl8fCAob2Zmc2V0VCkgdmFsdWUgPj0gMHg0MDAwMDAwMCkKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiQGxvY2FsIG9yIEBwbHQgYnJhbmNoIGRlc3RpbmF0aW9uIGlzIHRvbyBmYXIgYXdheSwgJWxkIGJ5dGVzIiksCi0JCQkgICAgdmFsdWUpOwotCSAgICBpbnNuID0gaW5zbiB8ICh2YWx1ZSAmIDB4MDNmZmZmZmMpOwotCSAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JICAgICAgYmZkX3B1dGIzMiAoKGJmZF92bWEpIGluc24sICh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLQkgICAgZWxzZQotCSAgICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUOgotCSAgZml4cC0+ZnhfZG9uZSA9IDA7Ci0JICBpZiAoZml4cC0+ZnhfYWRkc3kKLQkgICAgICAmJiAhU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICAmJiAhU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCi0JICAgIFNfU0VUX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotCSAgZml4cC0+ZnhfZG9uZSA9IDA7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBmcHJpbnRmKHN0ZGVyciwKLQkJICBfKCJHYXMgZmFpbHVyZSwgcmVsb2MgdmFsdWUgJWRcbiIpLCBmaXhwLT5meF9yX3R5cGUpOwotCSAgZmZsdXNoKHN0ZGVycik7Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi0jaWZkZWYgT0JKX0VMRgotICBmaXhwLT5meF9hZGRudW1iZXIgPSB2YWx1ZTsKLSNlbHNlCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1BQQ19UT0MxNikKLSAgICBmaXhwLT5meF9hZGRudW1iZXIgPSAwOwotICBlbHNlCi0gICAgewotI2lmZGVmIFRFX1BFCi0gICAgICBmaXhwLT5meF9hZGRudW1iZXIgPSAwOwotI2Vsc2UKLSAgICAgIC8qIFdlIHdhbnQgdG8gdXNlIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHNlZ21lbnQgb2YgdGhlCi0JIHN5bWJvbCwgbm90IHRoZSBhY3R1YWwgVk1BIG9mIHRoZSBzeW1ib2wuICAqLwotICAgICAgZml4cC0+ZnhfYWRkbnVtYmVyID0KLQktIGJmZF9nZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwgU19HRVRfU0VHTUVOVCAoZml4cC0+ZnhfYWRkc3kpKTsKLSNlbmRpZgotICAgIH0KLSNlbmRpZgotCi0gIHJldHVybiAxOwotfQotCi0vKiBHZW5lcmF0ZSBhIHJlbG9jIGZvciBhIGZpeHVwLiAgKi8KLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlZywgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlZzsKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgYXJlbGVudCAqcmVsb2M7Ci0KLSAgcmVsb2MgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLQotICByZWxvYy0+c3ltX3B0cl9wdHIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgKnJlbG9jLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzID0gZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeHAtPmZ4X3doZXJlOwotICByZWxvYy0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgZml4cC0+Znhfcl90eXBlKTsKLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksIChpbnQpZml4cC0+Znhfcl90eXBlKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLQotICByZXR1cm4gcmVsb2M7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXBwYy5oIGIvZ2FzL2NvbmZpZy90Yy1wcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkMzJkNi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXBwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qIHRjLXBwYy5oIC0tIEhlYWRlciBmaWxlIGZvciB0Yy1wcGMuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNkZWZpbmUgVENfUFBDCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBmaXg7Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBlbmRpYW5uZXNzIHdlIGFyZSB1c2luZy4gIERlZmF1bHQgdG8gYmlnIGVuZGlhbi4gICovCi0jaWZuZGVmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgUG93ZXJQQyBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBJZiBPQkpfQ09GRiBpcyBkZWZpbmVkLCBhbmQgVEVfUEUgaXMgbm90IGRlZmluZWQsIHdlIGFyZSBhc3NlbWJsaW5nCi0gICBYQ09GRiBmb3IgQUlYIG9yIFBvd2VyTWFjLiAgSWYgVEVfUEUgaXMgZGVmaW5lZCwgd2UgYXJlIGFzc2VtYmxpbmcKLSAgIENPRkYgZm9yIFdpbmRvd3MgTlQuICAqLwotCi0jaWZkZWYgT0JKX0NPRkYKLSNpZm5kZWYgVEVfUEUKLSNkZWZpbmUgT0JKX1hDT0ZGCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCAocHBjX2FyY2ggKCkpCi1leHRlcm4gZW51bSBiZmRfYXJjaGl0ZWN0dXJlIHBwY19hcmNoIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogV2hldGhlciBvciBub3QgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0vKiBUaGUgdGFyZ2V0IEJGRCBmb3JtYXQuICAqLwotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfUEUKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAicGUtcG93ZXJwYyIgOiAicGUtcG93ZXJwY2xlIikKLSNlbHNlCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImFpeGNvZmYtcnM2MDAwIgotI2VuZGlmCi0jZW5kaWYKLQotLyogUG93ZXJNYWMgaGFzIGEgQkZEIHNsaWdodGx5IGRpZmZlcmVudCBmcm9tIEFJWCdzLiAgKi8KLSNpZmRlZiBURV9QT1dFUk1BQwotI2lmZGVmIFRBUkdFVF9GT1JNQVQKLSN1bmRlZiBUQVJHRVRfRk9STUFUCi0jZW5kaWYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAieGNvZmYtcG93ZXJtYWMiCi0jZW5kaWYKLQotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAodGFyZ2V0X2JpZ19lbmRpYW4gPyAiZWxmMzItcG93ZXJwYyIgOiAiZWxmMzItcG93ZXJwY2xlIikKLSNlbmRpZgotCi0vKiBQZXJtaXQgdGVtcG9yYXJ5IG51bWVyaWMgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogJCBpcyB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgRE9MTEFSX0RPVAotCi0vKiBTdHJpbmdzIGRvIG5vdCB1c2UgYmFja3NsYXNoIGVzY2FwZXMgdW5kZXIgQ09GRi4gICovCi0jaWZkZWYgT0JKX0NPRkYKLSNkZWZpbmUgTk9fU1RSSU5HX0VTQ0FQRVMKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBESUZGX0VYUFJfT0sJCS8qIGZvby0uIGdldHMgdHVybmVkIGludG8gUEMgcmVsYXRpdmUgcmVsb2NzICovCi0jZW5kaWYKLQotI2lmIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCi0jZGVmaW5lIFBQQ19CSUdfRU5ESUFOIDEKLSNlbHNlCi0jZGVmaW5lIFBQQ19CSUdfRU5ESUFOIDAKLSNlbmRpZgotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFdlIHNldCB0aGUgZnhfZG9uZSBmaWVsZCBhcHByb3ByaWF0ZWx5IGluIG1kX2FwcGx5X2ZpeC4gICovCi0jZGVmaW5lIFRDX0hBTkRMRVNfRlhfRE9ORQotDAotI2lmZGVmIFRFX1BFCi0KLS8qIFF1ZXN0aW9uIG1hcmtzIGFyZSBwZXJtaXR0ZWQgaW4gc3ltYm9sIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX1FNIDEKLQotLyogRG9uJ3QgYWRqdXN0IFRPQyByZWxvY3MuICAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShmaXhwKSBwcGNfcGVfZml4X2FkanVzdGFibGUgKGZpeHApCi1leHRlcm4gaW50IHBwY19wZV9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfWENPRkYKLQotLyogRGVjbGFyYXRpb25zIG5lZWRlZCB3aGVuIGdlbmVyYXRpbmcgWENPRkYgY29kZS4gIFhDT0ZGIGlzIGFuCi0gICBleHRlbnNpb24gb2YgQ09GRiwgdXNlZCBvbmx5IG9uIHRoZSBSUy82MDAwLiAgUmF0aGVyIHRoYW4gY3JlYXRlIGFuCi0gICBvYmoteGNvZmYsIHdlIGp1c3QgdXNlIG9iai1jb2ZmLCBhbmQgaGFuZGxlIHRoZSBleHRlbnNpb25zIGhlcmUgaW4KLSAgIHRjLXBwYy4gICovCi0KLS8qIFdlIG5lZWQgdG8ga2VlcCBzb21lIGluZm9ybWF0aW9uIGZvciBzeW1ib2xzLiAgKi8KLXN0cnVjdCBwcGNfdGNfc3kKLXsKLSAgLyogV2Uga2VlcCBhIGZldyBsaW5rZWQgbGlzdHMgb2Ygc3ltYm9scy4gICovCi0gIHN5bWJvbFMgKm5leHQ7Ci0gIC8qIE5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgc2hvdWxkIGJlIG91dHB1dC4gIFRoZSBSUy82MDAwIGFzc2VtYmxlcgotICAgICBvbmx5IG91dHB1dHMgc3ltYm9scyB0aGF0IGFyZSBleHRlcm5hbCBvciBhcmUgbWVudGlvbmVkIGluIGEKLSAgICAgLmdsb2JsIG9yIC5sZ2xvYmwgc3RhdGVtZW50LiAgKi8KLSAgaW50IG91dHB1dDsKLSAgLyogVGhlIHN5bWJvbCBjbGFzcy4gICovCi0gIGludCBjbGFzczsKLSAgLyogVGhlIHJlYWwgbmFtZSwgaWYgdGhlIHN5bWJvbCB3YXMgcmVuYW1lZC4gICovCi0gIGNoYXIgKnJlYWxfbmFtZTsKLSAgLyogRm9yIGEgY3NlY3Qgc3ltYm9sLCB0aGUgc3Vic2VnbWVudCB3ZSBhcmUgdXNpbmcuICBUaGlzIGlzIHplcm8KLSAgICAgZm9yIHN5bWJvbHMgdGhhdCBhcmUgbm90IGNzZWN0cy4gICovCi0gIHN1YnNlZ1Qgc3Vic2VnOwotICAvKiBGb3IgYSBjc2VjdCBvciBjb21tb24gc3ltYm9sLCB0aGUgYWxpZ25tZW50IHRvIHVzZS4gICovCi0gIGludCBhbGlnbjsKLSAgLyogRm9yIGEgZnVuY3Rpb24gc3ltYm9sLCBhIHN5bWJvbCB3aG9zZSB2YWx1ZSBpcyB0aGUgc2l6ZS4gIFRoZQotICAgICBmaWVsZCBpcyBOVUxMIGlmIHRoZXJlIGlzIG5vIHNpemUuICAqLwotICBzeW1ib2xTICpzaXplOwotICAvKiBGb3IgYSBjc2VjdCBzeW1ib2wsIHRoZSBsYXN0IHN5bWJvbCB3aGljaCBoYXMgYmVlbiBkZWZpbmVkIGluCi0gICAgIHRoaXMgY3NlY3QsIG9yIE5VTEwgaWYgbm9uZSBoYXZlIGJlZW4gZGVmaW5lZCBzbyBmYXIuICBGb3IgYSAuYnMKLSAgICAgc3ltYm9sLCB0aGUgcmVmZXJlbmNlZCBjc2VjdCBzeW1ib2wuICAqLwotICBzeW1ib2xTICp3aXRoaW47Ci19OwotCi0jZGVmaW5lIFRDX1NZTUZJRUxEX1RZUEUgc3RydWN0IHBwY190Y19zeQotCi0vKiBXZSBuZWVkIGFuIGFkZGl0aW9uYWwgYXV4ZW50IGZvciBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgT0JKX0NPRkZfTUFYX0FVWEVOVFJJRVMgMgotCi0vKiBTcXVhcmUgYW5kIGN1cmx5IGJyYWNrZXRzIGFyZSBwZXJtaXR0ZWQgaW4gc3ltYm9sIG5hbWVzLiAgKi8KLSNkZWZpbmUgTEVYX0JSIDMKLQotLyogQ2Fub25pY2FsaXplIHRoZSBzeW1ib2wgbmFtZS4gICovCi0jZGVmaW5lIHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZShuYW1lKSBwcGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lIChuYW1lKQotZXh0ZXJuIGNoYXIgKnBwY19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgUEFSQU1TICgoY2hhciAqKSk7Ci0KLS8qIEdldCB0aGUgc3ltYm9sIGNsYXNzIGZyb20gdGhlIG5hbWUuICAqLwotI2RlZmluZSB0Y19zeW1ib2xfbmV3X2hvb2soc3ltKSBwcGNfc3ltYm9sX25ld19ob29rIChzeW0pCi1leHRlcm4gdm9pZCBwcGNfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBTZXQgdGhlIHN5bWJvbCBjbGFzcyBvZiBhIGxhYmVsIGJhc2VkIG9uIHRoZSBjc2VjdC4gICovCi0jZGVmaW5lIHRjX2Zyb2JfbGFiZWwoc3ltKSBwcGNfZnJvYl9sYWJlbCAoc3ltKQotZXh0ZXJuIHZvaWQgcHBjX2Zyb2JfbGFiZWwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLS8qIFRPQyByZWxvY3MgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKGZpeHApIHBwY19maXhfYWRqdXN0YWJsZSAoZml4cCkKLWV4dGVybiBpbnQgcHBjX2ZpeF9hZGp1c3RhYmxlIFBBUkFNUyAoKHN0cnVjdCBmaXggKikpOwotCi0vKiBBIHJlbG9jYXRpb24gZnJvbSBvbmUgY3NlY3QgdG8gYW5vdGhlciBtdXN0IGJlIGtlcHQuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKEZJWFApIHBwY19mb3JjZV9yZWxvY2F0aW9uIChGSVhQKQotZXh0ZXJuIGludCBwcGNfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogV2UgbmVlZCB0byBzZXQgdGhlIHNlY3Rpb24gVk1BLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zZWN0aW9uKHNlYykgcHBjX2Zyb2Jfc2VjdGlvbiAoc2VjKQotZXh0ZXJuIHZvaWQgcHBjX2Zyb2Jfc2VjdGlvbiBQQVJBTVMgKChhc2VjdGlvbiAqKSk7Ci0KLS8qIEZpbmlzaCB1cCB0aGUgc3ltYm9sLiAgKi8KLSNkZWZpbmUgdGNfZnJvYl9zeW1ib2woc3ltLCBwdW50KSBwdW50ID0gcHBjX2Zyb2Jfc3ltYm9sIChzeW0pCi1leHRlcm4gaW50IHBwY19mcm9iX3N5bWJvbCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotLyogRmluaXNoIHVwIHRoZSBlbnRpcmUgc3ltdGFiLiAgKi8KLSNkZWZpbmUgdGNfYWRqdXN0X3N5bXRhYigpIHBwY19hZGp1c3Rfc3ltdGFiICgpCi1leHRlcm4gdm9pZCBwcGNfYWRqdXN0X3N5bXRhYiBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIE5pY2xhcyBBbmRlcnNzb24gPG5pY2FuQGlkYS5saXUuc2U+IHNheXMgdGhpcyBpcyBuZWVkZWQuICAqLwotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpIDIKLQotI2VuZGlmIC8qIE9CSl9YQ09GRiAqLwotCi0jaWZkZWYgT0JKX0VMRgotCi0vKiBCcmFuY2ggcHJlZGljdGlvbiByZWxvY2F0aW9ucyBtdXN0IGZvcmNlIHJlbG9jYXRpb24sIGFzIG11c3QKLSAgIHRoZSB2dGFibGUgZGVzY3JpcHRpb24gcmVsb2NzLiAgKi8KLSNkZWZpbmUgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQkJCQkJXAotKChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQjE2X0JSVEFLRU4JCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQjE2X0JSTlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQkExNl9CUlRBS0VOCQkJXAotIHx8IChGSVhQKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19QUENfQkExNl9CUk5UQUtFTgkJCVwKLSB8fCAoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJCQlcCi0gfHwgKEZJWFApLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLQotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OX1NFQ1RJT04oRklYUCxTRUMpCQkJCVwKLShUQ19GT1JDRV9SRUxPQ0FUSU9OIChGSVhQKQkJCQkJCVwKLSB8fCAoKEZJWFApLT5meF9hZGRzeSAmJiAhKEZJWFApLT5meF9zdWJzeQkJCQlcCi0gICAgICYmIFNfR0VUX1NFR01FTlQgKChGSVhQKS0+ZnhfYWRkc3kpICE9IFNFQykpCi0KLS8qIFN1cHBvcnQgZm9yIFNIRl9FWENMVURFIGFuZCBTSFRfT1JERVJFRCAqLwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl9sZXR0ZXIgUEFSQU1TICgoaW50LCBjaGFyICoqKSk7Ci1leHRlcm4gaW50IHBwY19zZWN0aW9uX3R5cGUgUEFSQU1TICgoY2hhciAqLCBzaXplX3QpKTsKLWV4dGVybiBpbnQgcHBjX3NlY3Rpb25fd29yZCBQQVJBTVMgKChjaGFyICosIHNpemVfdCkpOwotZXh0ZXJuIGludCBwcGNfc2VjdGlvbl9mbGFncyBQQVJBTVMgKChpbnQsIGludCwgaW50KSk7Ci0KLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fbGV0dGVyKExFVFRFUiwgUFRSX01TRykJcHBjX3NlY3Rpb25fbGV0dGVyIChMRVRURVIsIFBUUl9NU0cpCi0jZGVmaW5lIG1kX2VsZl9zZWN0aW9uX3R5cGUoU1RSLCBMRU4pCQlwcGNfc2VjdGlvbl90eXBlIChTVFIsIExFTikKLSNkZWZpbmUgbWRfZWxmX3NlY3Rpb25fd29yZChTVFIsIExFTikJCXBwY19zZWN0aW9uX3dvcmQgKFNUUiwgTEVOKQotI2RlZmluZSBtZF9lbGZfc2VjdGlvbl9mbGFncyhGTEFHUywgQVRUUiwgVFlQRSkJcHBjX3NlY3Rpb25fZmxhZ3MgKEZMQUdTLCBBVFRSLCBUWVBFKQotCi0vKiBBZGQgZXh0cmEgUFBDIHNlY3Rpb25zIC0tIE5vdGUsIGZvciBub3csIG1ha2UgLnNic3MyIGFuZCAuUFBDLkVNQi5zYnNzMCBhCi0gICBub3JtYWwgc2VjdGlvbiwgYW5kIG5vdCBhIGJzcyBzZWN0aW9uIHNvIHRoYXQgdGhlIGxpbmtlciBkb2Vzbid0IGNyYXRlcgotICAgd2hlbiB0cnlpbmcgdG8gbWFrZSBtb3JlIHRoYW4gMiBzZWN0aW9ucy4gICovCi0jZGVmaW5lIEVMRl9UQ19TUEVDSUFMX1NFQ1RJT05TIFwKLSAgeyAiLnRhZ3MiLAkJU0hUX09SREVSRUQsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5zZGF0YSIsCQlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5zYnNzIiwJCVNIVF9OT0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LCBcCi0gIHsgIi5zZGF0YTIiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwgXAotICB7ICIuc2JzczIiLAkJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwgXAotICB7ICIuUFBDLkVNQi5zZGF0YTAiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyB9LCBcCi0gIHsgIi5QUEMuRU1CLnNic3MwIiwJU0hUX1BST0dCSVRTLAlTSEZfQUxMT0MgfSwKLQotI2RlZmluZSB0Y19jb21tZW50X2NoYXJzIHBwY19jb21tZW50X2NoYXJzCi1leHRlcm4gY29uc3QgY2hhciAqcHBjX2NvbW1lbnRfY2hhcnM7Ci0KLS8qIEtlZXAgcmVsb2NhdGlvbnMgcmVsYXRpdmUgdG8gdGhlIEdPVCwgb3Igbm9uLVBDIHJlbGF0aXZlLiAqLwotI2RlZmluZSB0Y19maXhfYWRqdXN0YWJsZShGSVgpICAgICAgICAgICAgICAgICAgICAgICAgICAJCVwKLSAgKChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DXzE2X0dPVE9GRiAgICAgICAgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19MTzE2X0dPVE9GRiAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfSEkxNl9HT1RPRkYgICAgICAgICAJCVwKLSAgICYmIChGSVgpLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX0hJMTZfU19HT1RPRkYgICAgICAgCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19HUFJFTDE2ICAgICAgICAgICAgIAkJXAotICAgJiYgKEZJWCktPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQJCQlcCi0gICAmJiAoRklYKS0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkJCQlcCi0gICAmJiAhIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJCQlcCi0gICAmJiAoKEZJWCktPmZ4X3BjcmVsCQkJCSAgICAgICAgCQlcCi0gICAgICAgfHwgKChGSVgpLT5meF9zdWJzeSAhPSBOVUxMCQkJCQlcCi0JICAgJiYgKFNfR0VUX1NFR01FTlQgKChGSVgpLT5meF9zdWJzeSkJCQkJXAotCSAgICAgICA9PSBTX0dFVF9TRUdNRU5UICgoRklYKS0+ZnhfYWRkc3kpKSkJCQlcCi0gICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FICgoRklYKS0+ZnhfYWRkc3kpLCAnXDAwMScpICE9IE5VTEwJCVwKLSAgICAgICB8fCBzdHJjaHIgKFNfR0VUX05BTUUgKChGSVgpLT5meF9hZGRzeSksICdcMDAyJykgIT0gTlVMTCkpCi0KLS8qIFdlIG11c3QgbmV2ZXIgZXZlciB0cnkgdG8gcmVzb2x2ZSByZWZlcmVuY2VzIHRvIGV4dGVybmFsbHkgdmlzaWJsZQotICAgc3ltYm9scyBpbiB0aGUgYXNzZW1ibGVyLCBiZWNhdXNlIHRoZSAubyBmaWxlIG1pZ2h0IGdvIGludG8gYSBzaGFyZWQKLSAgIGxpYnJhcnksIGFuZCBzb21lIG90aGVyIHNoYXJlZCBsaWJyYXJ5IG1pZ2h0IG92ZXJyaWRlIHRoYXQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgVENfUkVMT0NfUlRTWU1fTE9DX0ZJWFVQKEZJWCkgIFwKLSAgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMIFwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotCi0jZW5kaWYgLyogT0JKX0VMRiAqLwotCi0vKiBjYWxsIG1kX2FwcGx5X2ZpeDMgd2l0aCBzZWdtZW50IGluc3RlYWQgb2YgbWRfYXBwbHlfZml4ICovCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLQotLyogY2FsbCBtZF9wY3JlbF9mcm9tX3NlY3Rpb24sIG5vdCBtZF9wY3JlbF9mcm9tICovCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb21fc2VjdGlvbihGSVhQLCBTRUMpCi1leHRlcm4gbG9uZyBtZF9wY3JlbF9mcm9tX3NlY3Rpb24gUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzZWdUKSk7Ci0KLSNkZWZpbmUgbWRfcGFyc2VfbmFtZShuYW1lLCBleHApIHBwY19wYXJzZV9uYW1lIChuYW1lLCBleHApCi1leHRlcm4gaW50IHBwY19wYXJzZV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgc3RydWN0IGV4cHJlc3Npb25TICopKTsKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc2guYyBiL2dhcy9jb25maWcvdGMtc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1MmQwMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDI2ICswLDAgQEAKLS8qIHRjLXNoLmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIEhpdGFjaGkgU3VwZXItSAotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICAgV3JpdHRlbiBCeSBTdGV2ZSBDaGFtYmVybGFpbgotICAgc2FjQGN5Z251cy5jb20KLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAib3Bjb2Rlcy9zaC1vcGMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiISI7Ci1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiEjIjsKLQotc3RhdGljIHZvaWQgc191c2VzIFBBUkFNUyAoKGludCkpOwotCi1zdGF0aWMgdm9pZCBzaF9jb3VudF9yZWxvY3MgUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOwotc3RhdGljIHZvaWQgc2hfZnJvYl9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBzZWdULCBQVFIpKTsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLSAgIHBzZXVkby1vcCBuYW1lIHdpdGhvdXQgZG90Ci0gICBmdW5jdGlvbiB0byBjYWxsIHRvIGV4ZWN1dGUgdGhpcyBwc2V1ZG8tb3AKLSAgIEludGVnZXIgYXJnIHRvIHBhc3MgdG8gdGhlIGZ1bmN0aW9uCi0gKi8KLQotdm9pZCBjb25zICgpOwotdm9pZCBzX2FsaWduX2J5dGVzICgpOwotc3RhdGljIHZvaWQgc191YWNvbnMgUEFSQU1TICgoaW50KSk7Ci0KLWludCBzaGwgPSAwOwotCi1zdGF0aWMgdm9pZAotbGl0dGxlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNobCA9IDE7Ci0gIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLX0KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCA0fSwKLSAgeyJ3b3JkIiwgY29ucywgMn0sCi0gIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7ImxpdHRsZSIsIGxpdHRsZSwgMH0sCi0gIHsiaGVhZGluZyIsIGxpc3RpbmdfdGl0bGUsIDB9LAotICB7ImltcG9ydCIsIHNfaWdub3JlLCAwfSwKLSAgeyJwYWdlIiwgbGlzdGluZ19lamVjdCwgMH0sCi0gIHsicHJvZ3JhbSIsIHNfaWdub3JlLCAwfSwKLSAgeyJ1c2VzIiwgc191c2VzLCAwfSwKLSAgeyJ1YXdvcmQiLCBzX3VhY29ucywgMn0sCi0gIHsidWFsb25nIiwgc191YWNvbnMsIDR9LAotICB7MCwgMCwgMH0KLX07Ci0KLS8qaW50IG1kX3JlbG9jX3NpemU7ICovCi0KLWludCBzaF9yZWxheDsJCS8qIHNldCBpZiAtcmVsYXggc2VlbiAqLwotCi0vKiBXaGV0aGVyIC1zbWFsbCB3YXMgc2Vlbi4gICovCi0KLWludCBzaF9zbWFsbDsKLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLQotI2RlZmluZSBKUkVHIDE0CQkJLyogUmVnaXN0ZXIgdXNlZCBhcyBhIHRlbXAgd2hlbiByZWxheGluZyAqLwotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDQpICsgKGxlbmd0aCkpCi0jZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+NCkpCi0KLS8qIFRoZXNlIGFyZSB0aGUgdGhyZWUgdHlwZXMgb2YgcmVsYXhhYmxlIGluc3RyY3Rpb24gKi8KLSNkZWZpbmUgQ09ORF9KVU1QIDEKLSNkZWZpbmUgQ09ORF9KVU1QX0RFTEFZIDIKLSNkZWZpbmUgVU5DT05EX0pVTVAgIDMKLSNkZWZpbmUgRU5EIDQKLQotI2RlZmluZSBVTkRFRl9ESVNQIDAKLSNkZWZpbmUgQ09ORDggIDEKLSNkZWZpbmUgQ09ORDEyIDIKLSNkZWZpbmUgQ09ORDMyIDMKLSNkZWZpbmUgVU5DT05EMTIgMQotI2RlZmluZSBVTkNPTkQzMiAyCi0jZGVmaW5lIFVOREVGX1dPUkRfRElTUCA0Ci0KLSNkZWZpbmUgVU5DT05EMTIgMQotI2RlZmluZSBVTkNPTkQzMiAyCi0KLS8qIEJyYW5jaCBkaXNwbGFjZW1lbnRzIGFyZSBmcm9tIHRoZSBhZGRyZXNzIG9mIHRoZSBicmFuY2ggcGx1cwotICAgZm91ciwgdGh1cyBhbGwgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgaGF2ZSA0IGFkZGVkIHRvIHRoZW0uICAqLwotI2RlZmluZSBDT05EOF9GIDI1OAotI2RlZmluZSBDT05EOF9NIC0yNTIKLSNkZWZpbmUgQ09ORDhfTEVOR1RIIDIKLQotLyogVGhlcmUgaXMgb25lIGV4dHJhIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgYnJhbmNoLCBzbyB3ZSBtdXN0IGFkZAotICAgdHdvIG1vcmUgYnl0ZXMgdG8gYWNjb3VudCBmb3IgaXQuICAqLwotI2RlZmluZSBDT05EMTJfRiA0MTAwCi0jZGVmaW5lIENPTkQxMl9NIC00MDkwCi0jZGVmaW5lIENPTkQxMl9MRU5HVEggNgotCi0jZGVmaW5lIENPTkQxMl9ERUxBWV9MRU5HVEggNAotCi0vKiA/Pz8gVGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGFyZSB3cm9uZywgYnV0IHRoaXMgZG9lcyBub3QgbWF0dGVyCi0gICBzaW5jZSB0aGlzIHJlbG9jYXRpb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4gICovCi0jZGVmaW5lIENPTkQzMl9GICgxPDwzMCkKLSNkZWZpbmUgQ09ORDMyX00gLSgxPDwzMCkKLSNkZWZpbmUgQ09ORDMyX0xFTkdUSCAxNAotCi0jZGVmaW5lIFVOQ09ORDEyX0YgNDA5OAotI2RlZmluZSBVTkNPTkQxMl9NIC00MDkyCi0jZGVmaW5lIFVOQ09ORDEyX0xFTkdUSCAyCi0KLS8qID8/PyBUaGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgYXJlIHdyb25nLCBidXQgdGhpcyBkb2VzIG5vdCBtYXR0ZXIKLSAgIHNpbmNlIHRoaXMgcmVsb2NhdGlvbiB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAgKi8KLSNkZWZpbmUgVU5DT05EMzJfRiAoMTw8MzApCi0jZGVmaW5lIFVOQ09ORDMyX00gLSgxPDwzMCkKLSNkZWZpbmUgVU5DT05EMzJfTEVOR1RIIDE0Ci0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW0MgKEVORCwgMCldID0gewotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLQotICB7IDAgfSwKLSAgLyogQyAoQ09ORF9KVU1QLCBDT05EOCkgKi8KLSAgeyBDT05EOF9GLCBDT05EOF9NLCBDT05EOF9MRU5HVEgsIEMgKENPTkRfSlVNUCwgQ09ORDEyKSB9LAotICAvKiBDIChDT05EX0pVTVAsIENPTkQxMikgKi8KLSAgeyBDT05EMTJfRiwgQ09ORDEyX00sIENPTkQxMl9MRU5HVEgsIEMgKENPTkRfSlVNUCwgQ09ORDMyKSwgfSwKLSAgLyogQyAoQ09ORF9KVU1QLCBDT05EMzIpICovCi0gIHsgQ09ORDMyX0YsIENPTkQzMl9NLCBDT05EMzJfTEVOR1RILCAwLCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotCi0gIHsgMCB9LAotICAvKiBDIChDT05EX0pVTVBfREVMQVksIENPTkQ4KSAqLwotICB7IENPTkQ4X0YsIENPTkQ4X00sIENPTkQ4X0xFTkdUSCwgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpIH0sCi0gIC8qIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDEyKSAqLwotICB7IENPTkQxMl9GLCBDT05EMTJfTSwgQ09ORDEyX0RFTEFZX0xFTkdUSCwgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMzIpLCB9LAotICAvKiBDIChDT05EX0pVTVBfREVMQVksIENPTkQzMikgKi8KLSAgeyBDT05EMzJfRiwgQ09ORDMyX00sIENPTkQzMl9MRU5HVEgsIDAsIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotICB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sCi0KLSAgeyAwIH0sCi0gIC8qIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMikgKi8KLSAgeyBVTkNPTkQxMl9GLCBVTkNPTkQxMl9NLCBVTkNPTkQxMl9MRU5HVEgsIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMiksIH0sCi0gIC8qIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMikgKi8KLSAgeyBVTkNPTkQzMl9GLCBVTkNPTkQzMl9NLCBVTkNPTkQzMl9MRU5HVEgsIDAsIH0sCi0gIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwKLSAgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKm9wY29kZV9oYXNoX2NvbnRyb2w7CS8qIE9wY29kZSBtbmVtb25pY3MgKi8KLQotLyoKLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gKi8KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgY2hhciAqcHJldl9uYW1lID0gIiI7Ci0KLSAgaWYgKCEgc2hsKQotICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMTsKLQotICBvcGNvZGVfaGFzaF9jb250cm9sID0gaGFzaF9uZXcgKCk7Ci0KLSAgLyogSW5zZXJ0IHVuaXF1ZSBuYW1lcyBpbnRvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChvcGNvZGUgPSBzaF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wY29kZS0+bmFtZSkpCi0JewotCSAgcHJldl9uYW1lID0gb3Bjb2RlLT5uYW1lOwotCSAgaGFzaF9pbnNlcnQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG9wY29kZS0+bmFtZSwgKGNoYXIgKikgb3Bjb2RlKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTWFrZSBhbGwgdGhlIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIHBvaW50IHRvIHRoZSBzYW1lCi0JICAgICBzdHJpbmcgKi8KLQkgIG9wY29kZS0+bmFtZSA9IHByZXZfbmFtZTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IHJlZ19tOwotc3RhdGljIGludCByZWdfbjsKLXN0YXRpYyBpbnQgcmVnX2I7Ci0KLXN0YXRpYyBleHByZXNzaW9uUyBpbW1lZGlhdGU7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHNoX2FyZ190eXBlIHR5cGU7Ci0gICAgaW50IHJlZzsKLSAgfQotCi1zaF9vcGVyYW5kX2luZm87Ci0KLS8qIHRyeSBhbmQgcGFyc2UgYSByZWcgbmFtZSwgcmV0dXJucyBudW1iZXIgb2YgY2hhcnMgY29uc3VtZWQgKi8KLXN0YXRpYyBpbnQKLXBhcnNlX3JlZyAoc3JjLCBtb2RlLCByZWcpCi0gICAgIGNoYXIgKnNyYzsKLSAgICAgaW50ICptb2RlOwotICAgICBpbnQgKnJlZzsKLXsKLSAgLyogV2UgdXNlICFpc2FsbnVtIGZvciB0aGUgbmV4dCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHJlZ2lzdGVyIG5hbWUsIHRvCi0gICAgIG1ha2Ugc3VyZSB0aGF0IHdlIHdvbid0IGFjY2lkZW50YWxseSByZWNvZ25pemUgYSBzeW1ib2wgbmFtZSBzdWNoIGFzCi0gICAgICdzcmFtJyBhcyBiZWluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVnaXN0ZXIgJ3NyJy4gICovCi0KLSAgaWYgKHNyY1swXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc3JyAmJiBzdHJuY21wKCZzcmNbMl0sICJfYmFuayIsIDUpID09IDAKLQkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s3XSkpCi0JewotCSAgKm1vZGUgPSBBX1JFR19COwotCSAgKnJlZyAgPSAoc3JjWzFdIC0gJzAnKTsKLQkgIHJldHVybiA3OwotCX0KLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncicpCi0gICAgewotICAgICAgaWYgKHNyY1sxXSA9PSAnMScpCi0JewotCSAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc1JwotCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IEFfUkVHX047Ci0JICAgICAgKnJlZyA9IDEwICsgc3JjWzJdIC0gJzAnOwotCSAgICAgIHJldHVybiAzOwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1sxXSA+PSAnMCcgJiYgc3JjWzFdIDw9ICc5JwotCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLQl7Ci0JICAqbW9kZSA9IEFfUkVHX047Ci0JICAqcmVnID0gKHNyY1sxXSAtICcwJyk7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnCi0gICAgICAmJiBzcmNbMV0gPT0gJ3MnCi0gICAgICAmJiBzcmNbMl0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NTUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnICYmIHNyY1syXSA9PSAnYycKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NQQzsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ2cnICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NHUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdkJyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0RCUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1syXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX1NSOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3MnICYmIHNyY1sxXSA9PSAncCcgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzJdKSkKLSAgICB7Ci0gICAgICAqbW9kZSA9IEFfUkVHX047Ci0gICAgICAqcmVnID0gMTU7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAncCcgJiYgc3JjWzFdID09ICdyJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9QUjsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAncCcgJiYgc3JjWzFdID09ICdjJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbMl0pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9ESVNQX1BDOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdnJyAmJiBzcmNbMV0gPT0gJ2InICYmIHNyY1syXSA9PSAncicKLSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0gICAgewotICAgICAgKm1vZGUgPSBBX0dCUjsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAndicgJiYgc3JjWzFdID09ICdiJyAmJiBzcmNbMl0gPT0gJ3InCi0gICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotICAgIHsKLSAgICAgICptb2RlID0gQV9WQlI7Ci0gICAgICByZXR1cm4gMzsKLSAgICB9Ci0KLSAgaWYgKHNyY1swXSA9PSAnbScgJiYgc3JjWzFdID09ICdhJyAmJiBzcmNbMl0gPT0gJ2MnCi0gICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotICAgIHsKLSAgICAgIGlmIChzcmNbM10gPT0gJ2wnKQotCXsKLQkgICptb2RlID0gQV9NQUNMOwotCSAgcmV0dXJuIDQ7Ci0JfQotICAgICAgaWYgKHNyY1szXSA9PSAnaCcpCi0JewotCSAgKm1vZGUgPSBBX01BQ0g7Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3InKQotICAgIHsKLSAgICAgIGlmIChzcmNbMl0gPT0gJzEnKQotCXsKLQkgIGlmIChzcmNbM10gPj0gJzAnICYmIHNyY1szXSA8PSAnNScKLQkgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBGX1JFR19OOwotCSAgICAgICpyZWcgPSAxMCArIHNyY1szXSAtICcwJzsKLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnOScKLQkgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1szXSkpCi0JewotCSAgKm1vZGUgPSBGX1JFR19OOwotCSAgKnJlZyA9IChzcmNbMl0gLSAnMCcpOwotCSAgcmV0dXJuIDM7Ci0JfQotICAgIH0KLSAgaWYgKHNyY1swXSA9PSAnZCcgJiYgc3JjWzFdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzJdID09ICcxJykKLQl7Ci0JICBpZiAoc3JjWzNdID49ICcwJyAmJiBzcmNbM10gPD0gJzQnICYmICEgKChzcmNbM10gLSAnMCcpICYgMSkKLQkgICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotCSAgICB7Ci0JICAgICAgKm1vZGUgPSBEX1JFR19OOwotCSAgICAgICpyZWcgPSAxMCArIHNyY1szXSAtICcwJzsKLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzcmNbMl0gPj0gJzAnICYmIHNyY1syXSA8PSAnOCcgJiYgISAoKHNyY1syXSAtICcwJykgJiAxKQotCSAgJiYgISBpc2FsbnVtICgodW5zaWduZWQgY2hhcikgc3JjWzNdKSkKLQl7Ci0JICAqbW9kZSA9IERfUkVHX047Ci0JICAqcmVnID0gKHNyY1syXSAtICcwJyk7Ci0JICByZXR1cm4gMzsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICd4JyAmJiBzcmNbMV0gPT0gJ2QnKQotICAgIHsKLSAgICAgIGlmIChzcmNbMl0gPT0gJzEnKQotCXsKLQkgIGlmIChzcmNbM10gPj0gJzAnICYmIHNyY1szXSA8PSAnNCcgJiYgISAoKHNyY1szXSAtICcwJykgJiAxKQotCSAgICAgICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s0XSkpCi0JICAgIHsKLQkgICAgICAqbW9kZSA9IFhfUkVHX047Ci0JICAgICAgKnJlZyA9IDExICsgc3JjWzNdIC0gJzAnOwotCSAgICAgIHJldHVybiA0OwotCSAgICB9Ci0JfQotICAgICAgaWYgKHNyY1syXSA+PSAnMCcgJiYgc3JjWzJdIDw9ICc4JyAmJiAhICgoc3JjWzJdIC0gJzAnKSAmIDEpCi0JICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotCXsKLQkgICptb2RlID0gWF9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKSArIDE7Ci0JICByZXR1cm4gMzsKLQl9Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdmJyAmJiBzcmNbMV0gPT0gJ3YnKQotICAgIHsKLSAgICAgIGlmIChzcmNbMl0gPT0gJzEnJiYgc3JjWzNdID09ICcyJyAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotCXsKLQkgICptb2RlID0gVl9SRUdfTjsKLQkgICpyZWcgPSAxMjsKLQkgIHJldHVybiA0OwotCX0KLSAgICAgIGlmICgoc3JjWzJdID09ICcwJyB8fCBzcmNbMl0gPT0gJzQnIHx8IHNyY1syXSA9PSAnOCcpCi0JICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbM10pKQotCXsKLQkgICptb2RlID0gVl9SRUdfTjsKLQkgICpyZWcgPSAoc3JjWzJdIC0gJzAnKTsKLQkgIHJldHVybiAzOwotCX0KLSAgICB9Ci0gIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcgJiYgc3JjWzJdID09ICd1JyAmJiBzcmNbM10gPT0gJ2wnCi0gICAgICAmJiAhIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBzcmNbNF0pKQotICAgIHsKLSAgICAgICptb2RlID0gRlBVTF9OOwotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ2YnICYmIHNyY1sxXSA9PSAncCcgJiYgc3JjWzJdID09ICdzJyAmJiBzcmNbM10gPT0gJ2MnCi0gICAgICAmJiBzcmNbNF0gPT0gJ3InICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s1XSkpCi0gICAgewotICAgICAgKm1vZGUgPSBGUFNDUl9OOwotICAgICAgcmV0dXJuIDU7Ci0gICAgfQotCi0gIGlmIChzcmNbMF0gPT0gJ3gnICYmIHNyY1sxXSA9PSAnbScgJiYgc3JjWzJdID09ICd0JyAmJiBzcmNbM10gPT0gJ3InCi0gICAgICAmJiBzcmNbNF0gPT0gJ3gnICYmICEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIHNyY1s1XSkpCi0gICAgewotICAgICAgKm1vZGUgPSBYTVRSWF9NNDsKLSAgICAgIHJldHVybiA1OwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHN5bWJvbFMgKmRvdCgpCi17Ci0gIGNvbnN0IGNoYXIgKmZha2U7Ci0KLSAgLyogSkY6ICcuJyBpcyBwc2V1ZG8gc3ltYm9sIHdpdGggdmFsdWUgb2YgY3VycmVudCBsb2NhdGlvbgotICAgICBpbiBjdXJyZW50IHNlZ21lbnQuICAqLwotICBmYWtlID0gRkFLRV9MQUJFTF9OQU1FOwotICByZXR1cm4gIHN5bWJvbF9uZXcgKGZha2UsCi0JCSAgICAgIG5vd19zZWcsCi0JCSAgICAgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJICAgICAgZnJhZ19ub3cpOwotCi19Ci0KLQotc3RhdGljCi1jaGFyICoKLXBhcnNlX2V4cCAocykKLSAgICAgY2hhciAqczsKLXsKLSAgY2hhciAqc2F2ZTsKLSAgY2hhciAqbmV3OwotCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKCZpbW1lZGlhdGUpOwotICBpZiAoaW1tZWRpYXRlLlhfb3AgPT0gT19hYnNlbnQpCi0gICAgYXNfYmFkIChfKCJtaXNzaW5nIG9wZXJhbmQiKSk7Ci0gIG5ldyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotCi0vKiBUaGUgbWFueSBmb3JtcyBvZiBvcGVyYW5kOgotCi0gICBSbiAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBkaXJlY3QKLSAgIEBSbiAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIGluZGlyZWN0Ci0gICBAUm4rICAgICAgICAgICAgICAgICBBdXRvaW5jcmVtZW50Ci0gICBALVJuICAgICAgICAgICAgICAgICBBdXRvZGVjcmVtZW50Ci0gICBAKGRpc3A6NCxSbikKLSAgIEAoZGlzcDo4LEdCUikKLSAgIEAoZGlzcDo4LFBDKQotCi0gICBAKFIwLFJuKQotICAgQChSMCxHQlIpCi0KLSAgIGRpc3A6OAotICAgZGlzcDoxMgotICAgI2ltbTgKLSAgIHByLCBnYnIsIHZiciwgbWFjbCwgbWFjaAotCi0gKi8KLQotc3RhdGljCi1jaGFyICoKLXBhcnNlX2F0IChzcmMsIG9wKQotICAgICBjaGFyICpzcmM7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3A7Ci17Ci0gIGludCBsZW47Ci0gIGludCBtb2RlOwotICBzcmMrKzsKLSAgaWYgKHNyY1swXSA9PSAnLScpCi0gICAgewotICAgICAgLyogTXVzdCBiZSBwcmVkZWNyZW1lbnQgKi8KLSAgICAgIHNyYysrOwotCi0gICAgICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotICAgICAgaWYgKG1vZGUgIT0gQV9SRUdfTikKLQlhc19iYWQgKF8oImlsbGVnYWwgcmVnaXN0ZXIgYWZ0ZXIgQC0iKSk7Ci0KLSAgICAgIG9wLT50eXBlID0gQV9ERUNfTjsKLSAgICAgIHNyYyArPSBsZW47Ci0gICAgfQotICBlbHNlIGlmIChzcmNbMF0gPT0gJygnKQotICAgIHsKLSAgICAgIC8qIENvdWxkIGJlIEAoZGlzcCwgcm4pLCBAKGRpc3AsIGdiciksIEAoZGlzcCwgcGMpLCAgQChyMCwgZ2JyKSBvcgotICAgICAgICAgQChyMCwgcm4pICovCi0gICAgICBzcmMrKzsKLSAgICAgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJihvcC0+cmVnKSk7Ci0gICAgICBpZiAobGVuICYmIG1vZGUgPT0gQV9SRUdfTikKLQl7Ci0JICBzcmMgKz0gbGVuOwotCSAgaWYgKG9wLT5yZWcgIT0gMCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygibXVzdCBiZSBAKHIwLC4uLikiKSk7Ci0JICAgIH0KLQkgIGlmIChzcmNbMF0gPT0gJywnKQotCSAgICBzcmMrKzsKLQkgIC8qIE5vdyBjYW4gYmUgcm4gb3IgZ2JyICovCi0JICBsZW4gPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUsICYob3AtPnJlZykpOwotCSAgaWYgKG1vZGUgPT0gQV9HQlIpCi0JICAgIHsKLQkgICAgICBvcC0+dHlwZSA9IEFfUjBfR0JSOwotCSAgICB9Ci0JICBlbHNlIGlmIChtb2RlID09IEFfUkVHX04pCi0JICAgIHsKLQkgICAgICBvcC0+dHlwZSA9IEFfSU5EX1IwX1JFR19OOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBAKHIwLC4uLikiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTXVzdCBiZSBhbiBAKGRpc3AsLi4gdGhpbmcpICovCi0JICBzcmMgPSBwYXJzZV9leHAgKHNyYyk7Ci0JICBpZiAoc3JjWzBdID09ICcsJykKLQkgICAgc3JjKys7Ci0JICAvKiBOb3cgY2FuIGJlIHJuLCBnYnIgb3IgcGMgKi8KLQkgIGxlbiA9IHBhcnNlX3JlZyAoc3JjLCAmbW9kZSwgJm9wLT5yZWcpOwotCSAgaWYgKGxlbikKLQkgICAgewotCSAgICAgIGlmIChtb2RlID09IEFfUkVHX04pCi0JCXsKLQkJICBvcC0+dHlwZSA9IEFfRElTUF9SRUdfTjsKLQkJfQotCSAgICAgIGVsc2UgaWYgKG1vZGUgPT0gQV9HQlIpCi0JCXsKLQkJICBvcC0+dHlwZSA9IEFfRElTUF9HQlI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChtb2RlID09IEFfRElTUF9QQykKLQkJewotCQkgIC8qIFR1cm4gYSBwbGFpbiBAKDQscGMpIGludG8gQCguKzQscGMpICovCi0JCSAgaWYgKGltbWVkaWF0ZS5YX29wID09IE9fY29uc3RhbnQpIHsgCi0JCSAgICBpbW1lZGlhdGUuWF9hZGRfc3ltYm9sID0gZG90KCk7Ci0JCSAgICBpbW1lZGlhdGUuWF9vcCA9IE9fc3ltYm9sOwotCQkgIH0KLQkJICBvcC0+dHlwZSA9IEFfRElTUF9QQzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX2JhZCAoXygic3ludGF4IGVycm9yIGluIEAoZGlzcCxbUm4sIGdiciwgcGNdKSIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBpbiBAKGRpc3AsW1JuLCBnYnIsIHBjXSkiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICBzcmMgKz0gbGVuOwotICAgICAgaWYgKHNyY1swXSAhPSAnKScpCi0JYXNfYmFkIChfKCJleHBlY3RpbmcgKSIpKTsKLSAgICAgIGVsc2UKLQlzcmMrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzcmMgKz0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLSAgICAgIGlmIChtb2RlICE9IEFfUkVHX04pCi0JewotCSAgYXNfYmFkIChfKCJpbGxlZ2FsIHJlZ2lzdGVyIGFmdGVyIEAiKSk7Ci0JfQotICAgICAgaWYgKHNyY1swXSA9PSAnKycpCi0JewotCSAgb3AtPnR5cGUgPSBBX0lOQ19OOwotCSAgc3JjKys7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG9wLT50eXBlID0gQV9JTkRfTjsKLQl9Ci0gICAgfQotICByZXR1cm4gc3JjOwotfQotCi1zdGF0aWMgdm9pZAotZ2V0X29wZXJhbmQgKHB0ciwgb3ApCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3A7Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCBtb2RlID0gLTE7Ci0gIHVuc2lnbmVkIGludCBsZW47Ci0KLSAgaWYgKHNyY1swXSA9PSAnIycpCi0gICAgewotICAgICAgc3JjKys7Ci0gICAgICAqcHRyID0gcGFyc2VfZXhwIChzcmMpOwotICAgICAgb3AtPnR5cGUgPSBBX0lNTTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZWxzZSBpZiAoc3JjWzBdID09ICdAJykKLSAgICB7Ci0gICAgICAqcHRyID0gcGFyc2VfYXQgKHNyYywgb3ApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgbGVuID0gcGFyc2VfcmVnIChzcmMsICZtb2RlLCAmKG9wLT5yZWcpKTsKLSAgaWYgKGxlbikKLSAgICB7Ci0gICAgICAqcHRyID0gc3JjICsgbGVuOwotICAgICAgb3AtPnR5cGUgPSBtb2RlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIE5vdCBhIHJlZywgdGhlIG9ubHkgdGhpbmcgbGVmdCBpcyBhIGRpc3BsYWNlbWVudCAqLwotICAgICAgKnB0ciA9IHBhcnNlX2V4cCAoc3JjKTsKLSAgICAgIG9wLT50eXBlID0gQV9ESVNQX1BDOwotICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotc3RhdGljCi1jaGFyICoKLWdldF9vcGVyYW5kcyAoaW5mbywgYXJncywgb3BlcmFuZCkKLSAgICAgc2hfb3Bjb2RlX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIHNoX29wZXJhbmRfaW5mbyAqb3BlcmFuZDsKLQotewotICBjaGFyICpwdHIgPSBhcmdzOwotICBpZiAoaW5mby0+YXJnWzBdKQotICAgIHsKLSAgICAgIHB0cisrOwotCi0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDApOwotICAgICAgaWYgKGluZm8tPmFyZ1sxXSkKLQl7Ci0JICBpZiAoKnB0ciA9PSAnLCcpCi0JICAgIHsKLQkgICAgICBwdHIrKzsKLQkgICAgfQotCSAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxKTsKLQkgIGlmIChpbmZvLT5hcmdbMl0pCi0JICAgIHsKLQkgICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JCXsKLQkJICBwdHIrKzsKLQkJfQotCSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMik7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wZXJhbmRbMl0udHlwZSA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BlcmFuZFsxXS50eXBlID0gMDsKLQkgIG9wZXJhbmRbMl0udHlwZSA9IDA7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG9wZXJhbmRbMF0udHlwZSA9IDA7Ci0gICAgICBvcGVyYW5kWzFdLnR5cGUgPSAwOwotICAgICAgb3BlcmFuZFsyXS50eXBlID0gMDsKLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIFBhc3NlZCBhIHBvaW50ZXIgdG8gYSBsaXN0IG9mIG9wY29kZXMgd2hpY2ggdXNlIGRpZmZlcmVudAotICAgYWRkcmVzc2luZyBtb2RlcywgcmV0dXJuIHRoZSBvcGNvZGUgd2hpY2ggbWF0Y2hlcyB0aGUgb3Bjb2RlcwotICAgcHJvdmlkZWQKLSAqLwotCi1zdGF0aWMKLXNoX29wY29kZV9pbmZvICoKLWdldF9zcGVjaWZpYyAob3Bjb2RlLCBvcGVyYW5kcykKLSAgICAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgICAgc2hfb3BlcmFuZF9pbmZvICpvcGVyYW5kczsKLXsKLSAgc2hfb3Bjb2RlX2luZm8gKnRoaXNfdHJ5ID0gb3Bjb2RlOwotICBjaGFyICpuYW1lID0gb3Bjb2RlLT5uYW1lOwotICBpbnQgbiA9IDA7Ci0gIHdoaWxlIChvcGNvZGUtPm5hbWUpCi0gICAgewotICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKLSAgICAgIGlmICh0aGlzX3RyeS0+bmFtZSAhPSBuYW1lKQotCXsKLQkgIC8qIFdlJ3ZlIGxvb2tlZCBzbyBmYXIgZG93biB0aGUgdGFibGUgdGhhdCB3ZSd2ZSBydW4gb3V0IG9mCi0JICAgICBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSAqLwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgLyogbG9vayBhdCBib3RoIG9wZXJhbmRzIG5lZWRlZCBieSB0aGUgb3Bjb2RlcyBhbmQgcHJvdmlkZWQgYnkKLSAgICAgICAgIHRoZSB1c2VyIC0gc2luY2UgYW4gYXJnIHRlc3Qgd2lsbCBvZnRlbiBmYWlsIG9uIHRoZSBzYW1lIGFyZwotICAgICAgICAgYWdhaW4gYW5kIGFnYWluLCB3ZSdsbCB0cnkgYW5kIHRlc3QgdGhlIGxhc3QgZmFpbGluZyBhcmcgdGhlCi0gICAgICAgICBmaXJzdCBvbiBlYWNoIG9wY29kZSB0cnkgKi8KLQotICAgICAgZm9yIChuID0gMDsgdGhpc190cnktPmFyZ1tuXTsgbisrKQotCXsKLQkgIHNoX29wZXJhbmRfaW5mbyAqdXNlciA9IG9wZXJhbmRzICsgbjsKLQkgIHNoX2FyZ190eXBlIGFyZyA9IHRoaXNfdHJ5LT5hcmdbbl07Ci0JICBzd2l0Y2ggKGFyZykKLQkgICAgewotCSAgICBjYXNlIEFfSU1NOgotCSAgICBjYXNlIEFfQkRJU1AxMjoKLQkgICAgY2FzZSBBX0JESVNQODoKLQkgICAgY2FzZSBBX0RJU1BfR0JSOgotCSAgICBjYXNlIEFfRElTUF9QQzoKLQkgICAgY2FzZSBBX01BQ0g6Ci0JICAgIGNhc2UgQV9QUjoKLQkgICAgY2FzZSBBX01BQ0w6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SMDoKLQkgICAgICAvKiBvcGNvZGUgbmVlZHMgcjAgKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBBX1JFR19OIHx8IHVzZXItPnJlZyAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SMF9HQlI6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gQV9SMF9HQlIgfHwgdXNlci0+cmVnICE9IDApCi0JCWdvdG8gZmFpbDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGX0ZSMDoKLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBGX1JFR19OIHx8IHVzZXItPnJlZyAhPSAwKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBX1JFR19OOgotCSAgICBjYXNlIEFfSU5DX046Ci0JICAgIGNhc2UgQV9ERUNfTjoKLQkgICAgY2FzZSBBX0lORF9OOgotCSAgICBjYXNlIEFfSU5EX1IwX1JFR19OOgotCSAgICBjYXNlIEFfRElTUF9SRUdfTjoKLQkgICAgY2FzZSBGX1JFR19OOgotCSAgICBjYXNlIERfUkVHX046Ci0JICAgIGNhc2UgWF9SRUdfTjoKLQkgICAgY2FzZSBWX1JFR19OOgotCSAgICBjYXNlIEZQVUxfTjoKLQkgICAgY2FzZSBGUFNDUl9OOgotCSAgICAgIC8qIE9wY29kZSBuZWVkcyBybiAqLwotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZykKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19uID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZEX1JFR19OOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IEZfUkVHX04gJiYgdXNlci0+dHlwZSAhPSBEX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX24gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX046Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gRF9SRUdfTiAmJiB1c2VyLT50eXBlICE9IFhfUkVHX04pCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbiA9IHVzZXItPnJlZzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0dCUjoKLQkgICAgY2FzZSBBX1NSOgotCSAgICBjYXNlIEFfVkJSOgotCSAgICBjYXNlIEFfU1NSOgotCSAgICBjYXNlIEFfU1BDOgotCSAgICBjYXNlIEFfU0dSOgotCSAgICBjYXNlIEFfREJSOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IGFyZykKLQkJZ290byBmYWlsOwotCSAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIEFfUkVHX0I6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gYXJnKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX2IgPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBX1JFR19NOgotCSAgICBjYXNlIEFfSU5DX006Ci0JICAgIGNhc2UgQV9ERUNfTToKLQkgICAgY2FzZSBBX0lORF9NOgotCSAgICBjYXNlIEFfSU5EX1IwX1JFR19NOgotCSAgICBjYXNlIEFfRElTUF9SRUdfTToKLQkgICAgICAvKiBPcGNvZGUgbmVlZHMgcm4gKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcgLSBBX1JFR19NICsgQV9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19tID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgRl9SRUdfTToKLQkgICAgY2FzZSBEX1JFR19NOgotCSAgICBjYXNlIFhfUkVHX006Ci0JICAgIGNhc2UgVl9SRUdfTToKLQkgICAgY2FzZSBGUFVMX006Ci0JICAgIGNhc2UgRlBTQ1JfTToKLQkgICAgICAvKiBPcGNvZGUgbmVlZHMgcm4gKi8KLQkgICAgICBpZiAodXNlci0+dHlwZSAhPSBhcmcgLSBGX1JFR19NICsgRl9SRUdfTikKLQkJZ290byBmYWlsOwotCSAgICAgIHJlZ19tID0gdXNlci0+cmVnOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIERYX1JFR19NOgotCSAgICAgIGlmICh1c2VyLT50eXBlICE9IERfUkVHX04gJiYgdXNlci0+dHlwZSAhPSBYX1JFR19OKQotCQlnb3RvIGZhaWw7Ci0JICAgICAgcmVnX20gPSB1c2VyLT5yZWc7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgWE1UUlhfTTQ6Ci0JICAgICAgaWYgKHVzZXItPnR5cGUgIT0gWE1UUlhfTTQpCi0JCWdvdG8gZmFpbDsKLQkgICAgICByZWdfbSA9IDQ7Ci0JICAgICAgYnJlYWs7Ci0JCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmIChfKCJ1bmhhbmRsZWQgJWRcbiIpLCBhcmcpOwotCSAgICAgIGdvdG8gZmFpbDsKLQkgICAgfQotCX0KLSAgICAgIHJldHVybiB0aGlzX3RyeTsKLSAgICBmYWlsOjsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7Ci0gICAgIGludCBsb3c7Ci0gICAgIGludCBoaWdoOwotewotICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIiksIGxvdywgaGlnaCk7Ci0gICAgfQotICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotfQotCi0KLXN0YXRpYyB2b2lkCi1pbnNlcnQgKHdoZXJlLCBob3csIHBjcmVsKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgaW50IGhvdzsKLSAgICAgaW50IHBjcmVsOwotewotICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JICAgICAgIHdoZXJlIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JICAgICAgIDIsCi0JICAgICAgICZpbW1lZGlhdGUsCi0JICAgICAgIHBjcmVsLAotCSAgICAgICBob3cpOwotfQotCi1zdGF0aWMgdm9pZAotYnVpbGRfcmVsYXggKG9wY29kZSkKLSAgICAgc2hfb3Bjb2RlX2luZm8gKm9wY29kZTsKLXsKLSAgaW50IGhpZ2hfYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMCA6IDE7Ci0gIGNoYXIgKnA7Ci0KLSAgaWYgKG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1A4KQotICAgIHsKLSAgICAgIGludCB3aGF0ID0gKG9wY29kZS0+bmliYmxlc1sxXSAmIDQpID8gQ09ORF9KVU1QX0RFTEFZIDogQ09ORF9KVU1QOwotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQzMildLnJseF9sZW5ndGgsCi0JCSAgICBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGgsCi0JCSAgICBDICh3aGF0LCAwKSwKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9zeW1ib2wsCi0JCSAgICBpbW1lZGlhdGUuWF9hZGRfbnVtYmVyLAotCQkgICAgMCk7Ci0gICAgICBwW2hpZ2hfYnl0ZV0gPSAob3Bjb2RlLT5uaWJibGVzWzBdIDw8IDQpIHwgKG9wY29kZS0+bmliYmxlc1sxXSk7Ci0gICAgfQotICBlbHNlIGlmIChvcGNvZGUtPmFyZ1swXSA9PSBBX0JESVNQMTIpCi0gICAgewotICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJICAgIG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQzMildLnJseF9sZW5ndGgsCi0JCSAgICBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpXS5ybHhfbGVuZ3RoLAotCQkgICAgQyAoVU5DT05EX0pVTVAsIDApLAotCQkgICAgaW1tZWRpYXRlLlhfYWRkX3N5bWJvbCwKLQkJICAgIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCi0JCSAgICAwKTsKLSAgICAgIHBbaGlnaF9ieXRlXSA9IChvcGNvZGUtPm5pYmJsZXNbMF0gPDwgNCk7Ci0gICAgfQotCi19Ci0KLS8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCi0gKi8KLXN0YXRpYyB2b2lkCi1idWlsZF9NeXRlcyAob3Bjb2RlLCBvcGVyYW5kKQotICAgICBzaF9vcGNvZGVfaW5mbyAqb3Bjb2RlOwotICAgICBzaF9vcGVyYW5kX2luZm8gKm9wZXJhbmQ7Ci0KLXsKLSAgaW50IGluZGV4OwotICBjaGFyIG5idWZbNF07Ci0gIGNoYXIgKm91dHB1dCA9IGZyYWdfbW9yZSAoMik7Ci0gIGludCBsb3dfYnl0ZSA9IHRhcmdldF9iaWdfZW5kaWFuID8gMSA6IDA7Ci0gIG5idWZbMF0gPSAwOwotICBuYnVmWzFdID0gMDsKLSAgbmJ1ZlsyXSA9IDA7Ci0gIG5idWZbM10gPSAwOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IDQ7IGluZGV4KyspCi0gICAgewotICAgICAgc2hfbmliYmxlX3R5cGUgaSA9IG9wY29kZS0+bmliYmxlc1tpbmRleF07Ci0gICAgICBpZiAoaSA8IDE2KQotCXsKLQkgIG5idWZbaW5kZXhdID0gaTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3dpdGNoIChpKQotCSAgICB7Ci0JICAgIGNhc2UgUkVHX046Ci0JICAgICAgbmJ1ZltpbmRleF0gPSByZWdfbjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRUdfTToKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19tOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJFR19OTToKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19uIHwgKHJlZ19tID4+IDIpOwotCSAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBSRUdfQjoKLQkgICAgICBuYnVmW2luZGV4XSA9IHJlZ19iIHwgMHgwODsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBESVNQXzQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV80Qlk0OgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU00Qlk0LCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fNEJZMjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NNEJZMiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTQsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTV84Qlk0OgotCSAgICAgIGluc2VydCAob3V0cHV0ICsgbG93X2J5dGUsIEJGRF9SRUxPQ19TSF9JTU04Qlk0LCAwKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJTU1fOEJZMjoKLQkgICAgICBpbnNlcnQgKG91dHB1dCArIGxvd19ieXRlLCBCRkRfUkVMT0NfU0hfSU1NOEJZMiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NXzg6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQgKyBsb3dfYnl0ZSwgQkZEX1JFTE9DX1NIX0lNTTgsIDApOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMSU1NXzhCWTQ6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTQsIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFBDUkVMSU1NXzhCWTI6Ci0JICAgICAgaW5zZXJ0IChvdXRwdXQsIEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIsIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHByaW50ZiAoXygiZmFpbGVkIGZvciAlZFxuIiksIGkpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pIHsKLSAgICBvdXRwdXRbMV0gPSAobmJ1ZlswXSA8PCA0KSB8IChuYnVmWzFdKTsKLSAgICBvdXRwdXRbMF0gPSAobmJ1ZlsyXSA8PCA0KSB8IChuYnVmWzNdKTsKLSAgfQotICBlbHNlIHsKLSAgICBvdXRwdXRbMF0gPSAobmJ1ZlswXSA8PCA0KSB8IChuYnVmWzFdKTsKLSAgICBvdXRwdXRbMV0gPSAobmJ1ZlsyXSA8PCA0KSB8IChuYnVmWzNdKTsKLSAgfQotfQotCi0vKiBUaGlzIGlzIHRoZSBndXRzIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBTVFIgcG9pbnRzIHRvIGEKLSAgIG1hY2hpbmUgZGVwZW5kZW50IGluc3RydWN0aW9uLiAgVGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0byBlbWl0Ci0gICB0aGUgZnJhZ3MvYnl0ZXMgaXQgYXNzZW1ibGVzIHRvLgotICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqb3Bfc3RhcnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX2VuZDsKLSAgc2hfb3BlcmFuZF9pbmZvIG9wZXJhbmRbM107Ci0gIHNoX29wY29kZV9pbmZvICpvcGNvZGU7Ci0gIGNoYXIgbmFtZVsyMF07Ci0gIGludCBubGVuID0gMDsKLSAgLyogRHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKCpzdHIgPT0gJyAnKQotICAgIHN0cisrOwotCi0gIC8qIGZpbmQgdGhlIG9wIGNvZGUgZW5kICovCi0gIGZvciAob3Bfc3RhcnQgPSBvcF9lbmQgPSAodW5zaWduZWQgY2hhciAqKSAoc3RyKTsKLSAgICAgICAqb3BfZW5kCi0gICAgICAgJiYgbmxlbiA8IDIwCi0gICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWypvcF9lbmRdICYmICpvcF9lbmQgIT0gJyAnOwotICAgICAgIG9wX2VuZCsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG9wX3N0YXJ0W25sZW5dOwotCi0gICAgICAvKiBUaGUgbWFjaGluZSBpbmRlcGVuZGVudCBjb2RlIHdpbGwgY29udmVydCBDTVAvRVEgaW50byBjbXAvRVEKLQkgYmVjYXVzZSBpdCB0aGlua3MgdGhlICcvJyBpcyB0aGUgZW5kIG9mIHRoZSBzeW1ib2wuICBJbnN0ZWFkIG9mCi0JIGhhY2tpbmcgdXAgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSwgd2UganVzdCBkZWFsIHdpdGggaXQKLQkgaGVyZS4gICovCi0gICAgICBjID0gaXN1cHBlciAoYykgPyB0b2xvd2VyIChjKSA6IGM7Ci0gICAgICBuYW1lW25sZW5dID0gYzsKLSAgICAgIG5sZW4rKzsKLSAgICB9Ci0gIG5hbWVbbmxlbl0gPSAwOwotCi0gIGlmIChubGVuID09IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjYW4ndCBmaW5kIG9wY29kZSAiKSk7Ci0gICAgfQotCi0gIG9wY29kZSA9IChzaF9vcGNvZGVfaW5mbyAqKSBoYXNoX2ZpbmQgKG9wY29kZV9oYXNoX2NvbnRyb2wsIG5hbWUpOwotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoc2hfcmVsYXgKLSAgICAgICYmICEgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQotICAgIHsKLSAgICAgIC8qIE91dHB1dCBhIENPREUgcmVsb2MgdG8gdGVsbCB0aGUgbGlua2VyIHRoYXQgdGhlIGZvbGxvd2luZwotICAgICAgICAgYnl0ZXMgYXJlIGluc3RydWN0aW9ucywgbm90IGRhdGEuICAqLwotICAgICAgZml4X25ldyAoZnJhZ19ub3csIGZyYWdfbm93X2ZpeCAoKSwgMiwgJmFic19zeW1ib2wsIDAsIDAsCi0JICAgICAgIEJGRF9SRUxPQ19TSF9DT0RFKTsKLSAgICAgIHNlZ19pbmZvIChub3dfc2VnKS0+dGNfc2VnbWVudF9pbmZvX2RhdGEuaW5fY29kZSA9IDE7Ci0gICAgfQotCi0gIGlmIChvcGNvZGUtPmFyZ1swXSA9PSBBX0JESVNQMTIKLSAgICAgIHx8IG9wY29kZS0+YXJnWzBdID09IEFfQkRJU1A4KQotICAgIHsKLSAgICAgIHBhcnNlX2V4cCAob3BfZW5kICsgMSk7Ci0gICAgICBidWlsZF9yZWxheCAob3Bjb2RlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5hcmdbMF0gIT0gQV9FTkQpCi0JewotCSAgZ2V0X29wZXJhbmRzIChvcGNvZGUsIG9wX2VuZCwgb3BlcmFuZCk7Ci0JfQotICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOwotCi0gICAgICBpZiAob3Bjb2RlID09IDApCi0JewotCSAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLQkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotCSAgd2hlcmVbMF0gPSAweDA7Ci0JICB3aGVyZVsxXSA9IDB4MDsKLQkgIGFzX2JhZCAoXygiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYnVpbGRfTXl0ZXMgKG9wY29kZSwgb3BlcmFuZCk7Ci0gICAgfQotCi19Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZWFjaCB0aW1lIGEgbGFiZWwgZGVmaW5pdGlvbiBpcyBzZWVuLiAgSXQKLSAgIGVtaXRzIGEgQkZEX1JFTE9DX1NIX0xBQkVMIHJlbG9jIGlmIG5lY2Vzc2FyeS4gICovCi0KLXZvaWQKLXNoX2Zyb2JfbGFiZWwgKCkKLXsKLSAgc3RhdGljIGZyYWdTICpsYXN0X2xhYmVsX2ZyYWc7Ci0gIHN0YXRpYyBpbnQgbGFzdF9sYWJlbF9vZmZzZXQ7Ci0KLSAgaWYgKHNoX3JlbGF4Ci0gICAgICAmJiBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUpCi0gICAgewotICAgICAgaW50IG9mZnNldDsKLQotICAgICAgb2Zmc2V0ID0gZnJhZ19ub3dfZml4ICgpOwotICAgICAgaWYgKGZyYWdfbm93ICE9IGxhc3RfbGFiZWxfZnJhZwotCSAgfHwgb2Zmc2V0ICE9IGxhc3RfbGFiZWxfb2Zmc2V0KQotCXsJCi0JICBmaXhfbmV3IChmcmFnX25vdywgb2Zmc2V0LCAyLCAmYWJzX3N5bWJvbCwgMCwgMCwgQkZEX1JFTE9DX1NIX0xBQkVMKTsKLQkgIGxhc3RfbGFiZWxfZnJhZyA9IGZyYWdfbm93OwotCSAgbGFzdF9sYWJlbF9vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgaXMgYWJvdXQgdG8gb3V0cHV0IHNvbWUKLSAgIGRhdGEuICBJdCBlbWl0cyBhIEJGRF9SRUxPQ19TSF9EQVRBIHJlbG9jIGlmIG5lY2Vzc2FyeS4gICovCi0KLXZvaWQKLXNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpCi17Ci0gIGlmIChzaF9yZWxheAotICAgICAgJiYgc2VnX2luZm8gKG5vd19zZWcpLT50Y19zZWdtZW50X2luZm9fZGF0YS5pbl9jb2RlKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDIsICZhYnNfc3ltYm9sLCAwLCAwLAotCSAgICAgICBCRkRfUkVMT0NfU0hfREFUQSk7Ci0gICAgICBzZWdfaW5mbyAobm93X3NlZyktPnRjX3NlZ21lbnRfaW5mb19kYXRhLmluX2NvZGUgPSAwOwotICAgIH0KLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi0jaWZkZWYgT0JKX0NPRkYKLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotdm9pZAotREVGVU4gKHRjX2hlYWRlcnNfaG9vaywgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2hlYWRlcnNfaG9vayBcbiIpKTsKLX0KLQotI2VuZGlmCi0KLS8qIFZhcmlvdXMgcm91dGluZXMgdG8ga2lsbCBvbmUgZGF5ICovCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzWzRdOwotICBjaGFyICp0OwotICBpbnQgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIDI7Ci0KLSAgaWYgKCEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gcHJlYyAtIDE7IGkgPj0gMDsgaS0tKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrKQotCXsKLQkgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgd29yZHNbaV0sIDIpOwotCSAgbGl0UCArPSAyOwotCX0KLSAgICB9Ci0gICAgIAotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSGFuZGxlIHRoZSAudXNlcyBwc2V1ZG8tb3AuICBUaGlzIHBzZXVkby1vcCBpcyB1c2VkIGp1c3QgYmVmb3JlIGEKLSAgIGNhbGwgaW5zdHJ1Y3Rpb24uICBJdCByZWZlcnMgdG8gYSBsYWJlbCBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hpY2gKLSAgIGxvYWRzIHRoZSByZWdpc3RlciB3aGljaCB0aGUgY2FsbCB1c2VzLiAgV2UgdXNlIGl0IHRvIGdlbmVyYXRlIGEKLSAgIHNwZWNpYWwgcmVsb2MgZm9yIHRoZSBsaW5rZXIuICAqLwotCi1zdGF0aWMgdm9pZAotc191c2VzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIGV4OwotCi0gIGlmICghIHNoX3JlbGF4KQotICAgIGFzX3dhcm4gKF8oIi51c2VzIHBzZXVkby1vcCBzZWVuIHdoZW4gbm90IHJlbGF4aW5nIikpOwotCi0gIGV4cHJlc3Npb24gKCZleCk7Ci0KLSAgaWYgKGV4Llhfb3AgIT0gT19zeW1ib2wgfHwgZXguWF9hZGRfbnVtYmVyICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgLnVzZXMgZm9ybWF0IikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZml4X25ld19leHAgKGZyYWdfbm93LCBmcmFnX25vd19maXggKCksIDIsICZleCwgMSwgQkZEX1JFTE9DX1NIX1VTRVMpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLQotI2RlZmluZSBPUFRJT05fUkVMQVggIChPUFRJT05fTURfQkFTRSkKLSNkZWZpbmUgT1BUSU9OX0xJVFRMRSAoT1BUSU9OX01EX0JBU0UgKyAxKQotI2RlZmluZSBPUFRJT05fU01BTEwgKE9QVElPTl9MSVRUTEUgKyAxKQotCi0gIHsicmVsYXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JFTEFYfSwKLSAgeyJsaXR0bGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRX0sCi0gIHsic21hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NNQUxMfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIHNoX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTElUVExFOgotICAgICAgc2hsID0gMTsKLSAgICAgIHRhcmdldF9iaWdfZW5kaWFuID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU01BTEw6Ci0gICAgICBzaF9zbWFsbCA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotU0ggb3B0aW9uczpcblwKLS1saXR0bGUJCQlnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIGNvZGVcblwKLS1yZWxheAkJCWFsdGVyIGp1bXAgaW5zdHJ1Y3Rpb25zIGZvciBsb25nIGRpc3BsYWNlbWVudHNcblwKLS1zbWFsbAkJCWFsaWduIHNlY3Rpb25zIHRvIDQgYnl0ZSBib3VuZGFyaWVzLCBub3QgMTZcbiIpKTsKLX0KLQwKLXZvaWQKLXRjX05vdXRfZml4X3RvX2NoYXJzICgpCi17Ci0gIHByaW50ZiAoXygiY2FsbCB0byB0Y19Ob3V0X2ZpeF90b19jaGFycyBcbiIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgdG8gc2hfY291bnRfcmVsb2NzIHRocm91Z2gKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLXN0cnVjdCBzaF9jb3VudF9yZWxvY3MKLXsKLSAgLyogU3ltYm9sIHdlIGFyZSBsb29raW5nIGZvci4gICovCi0gIHN5bWJvbFMgKnN5bTsKLSAgLyogQ291bnQgb2YgcmVsb2NzIGZvdW5kLiAgKi8KLSAgaW50IGNvdW50OwotfTsKLQotLyogQ291bnQgdGhlIG51bWJlciBvZiBmaXh1cHMgaW4gYSBzZWN0aW9uIHdoaWNoIHJlZmVyIHRvIGEgcGFydGljdWxhcgotICAgc3ltYm9sLiAgV2hlbiB1c2luZyBCRkRfQVNTRU1CTEVSLCB0aGlzIGlzIGNhbGxlZCB2aWEKLSAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHZvaWQKLXNoX2NvdW50X3JlbG9jcyAoYWJmZCwgc2VjLCBkYXRhKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBQVFIgZGF0YTsKLXsKLSAgc3RydWN0IHNoX2NvdW50X3JlbG9jcyAqaW5mbyA9IChzdHJ1Y3Qgc2hfY291bnRfcmVsb2NzICopIGRhdGE7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICBzeW1ib2xTICpzeW07Ci0gIGZpeFMgKmZpeDsKLQotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIHN5bSA9IGluZm8tPnN5bTsKLSAgZm9yIChmaXggPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4ICE9IE5VTEw7IGZpeCA9IGZpeC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBpZiAoZml4LT5meF9hZGRzeSA9PSBzeW0pCi0JewotCSAgKytpbmZvLT5jb3VudDsKLQkgIGZpeC0+ZnhfdGNiaXQgPSAxOwotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgY291bnQgcmVsb2NzIGZvciBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFdoZW4gdXNpbmcKLSAgIEJGRF9BU1NFTUJMRVIsIHRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1zaF9mcm9iX3NlY3Rpb24gKGFiZmQsIHNlYywgaWdub3JlKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICBQVFIgaWdub3JlOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgZml4UyAqZml4OwotCi0gIHNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChmaXggPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4ICE9IE5VTEw7IGZpeCA9IGZpeC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBiZmRfdm1hIHZhbDsKLSAgICAgIGZpeFMgKmZzY2FuOwotICAgICAgc3RydWN0IHNoX2NvdW50X3JlbG9jcyBpbmZvOwotCi0gICAgICBpZiAoZml4LT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX1VTRVMpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoZSBCRkRfUkVMT0NfU0hfVVNFUyByZWxvYyBzaG91bGQgcmVmZXIgdG8gYSBkZWZpbmVkIGxvY2FsCi0JIHN5bWJvbCBpbiB0aGUgc2FtZSBzZWN0aW9uLiAgKi8KLSAgICAgIHN5bSA9IGZpeC0+ZnhfYWRkc3k7Ci0gICAgICBpZiAoc3ltID09IE5VTEwKLQkgIHx8IGZpeC0+Znhfc3Vic3kgIT0gTlVMTAotCSAgfHwgZml4LT5meF9hZGRudW1iZXIgIT0gMAotCSAgfHwgU19HRVRfU0VHTUVOVCAoc3ltKSAhPSBzZWMKLSNpZiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmIGRlZmluZWQgKE9CSl9DT0ZGKQotCSAgfHwgU19HRVRfU1RPUkFHRV9DTEFTUyAoc3ltKSA9PSBDX0VYVAotI2VuZGlmCi0JICB8fCBTX0lTX0VYVEVSTkFMIChzeW0pKQotCXsKLQkgIGFzX3dhcm5fd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkJIF8oIi51c2VzIGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIExvb2sgdGhyb3VnaCB0aGUgZml4dXBzIGFnYWluLCB0aGlzIHRpbWUgbG9va2luZyBmb3Igb25lCi0JIGF0IHRoZSBzYW1lIGxvY2F0aW9uIGFzIHN5bS4gICovCi0gICAgICB2YWwgPSBTX0dFVF9WQUxVRSAoc3ltKTsKLSAgICAgIGZvciAoZnNjYW4gPSBzZWdpbmZvLT5maXhfcm9vdDsKLQkgICBmc2NhbiAhPSBOVUxMOwotCSAgIGZzY2FuID0gZnNjYW4tPmZ4X25leHQpCi0JaWYgKHZhbCA9PSBmc2Nhbi0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZzY2FuLT5meF93aGVyZQotCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9BTElHTgotCSAgICAmJiBmc2Nhbi0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ19TSF9DT0RFCi0JICAgICYmIGZzY2FuLT5meF9yX3R5cGUgIT0gQkZEX1JFTE9DX1NIX0RBVEEKLQkgICAgJiYgZnNjYW4tPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfU0hfTEFCRUwpCi0JICBicmVhazsKLSAgICAgIGlmIChmc2NhbiA9PSBOVUxMKQotCXsKLQkgIGFzX3dhcm5fd2hlcmUgKGZpeC0+ZnhfZmlsZSwgZml4LT5meF9saW5lLAotCQkJIF8oImNhbid0IGZpbmQgZml4dXAgcG9pbnRlZCB0byBieSAudXNlcyIpKTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKGZzY2FuLT5meF90Y2JpdCkKLQl7Ci0JICAvKiBXZSd2ZSBhbHJlYWR5IGRvbmUgdGhpcyBvbmUuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBmc2NhbiBzaG91bGQgYWxzbyBiZSBhIGZpeHVwIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lCi0JIHNlY3Rpb24uICAqLwotICAgICAgc3ltID0gZnNjYW4tPmZ4X2FkZHN5OwotICAgICAgaWYgKHN5bSA9PSBOVUxMCi0JICB8fCBmc2Nhbi0+Znhfc3Vic3kgIT0gTlVMTAotCSAgfHwgZnNjYW4tPmZ4X2FkZG51bWJlciAhPSAwCi0JICB8fCBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHNlYwotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgZGVmaW5lZCAoT0JKX0NPRkYpCi0JICB8fCBTX0dFVF9TVE9SQUdFX0NMQVNTIChzeW0pID09IENfRVhUCi0jZW5kaWYKLQkgIHx8IFNfSVNfRVhURVJOQUwgKHN5bSkpCi0JewotCSAgYXNfd2Fybl93aGVyZSAoZml4LT5meF9maWxlLCBmaXgtPmZ4X2xpbmUsCi0JCQkgXygiLnVzZXMgdGFyZ2V0IGRvZXMgbm90IHJlZmVyIHRvIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBzYW1lIHNlY3Rpb24iKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIE5vdyB3ZSBsb29rIHRocm91Z2ggYWxsIHRoZSBmaXh1cHMgb2YgYWxsIHRoZSBzZWN0aW9ucywKLQkgY291bnRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBmaW5kIGEgcmVmZXJlbmNlIHRvIHN5bS4gICovCi0gICAgICBpbmZvLnN5bSA9IHN5bTsKLSAgICAgIGluZm8uY291bnQgPSAwOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCBzaF9jb3VudF9yZWxvY3MsIChQVFIpICZpbmZvKTsKLSNlbHNlCi0gICAgICB7Ci0JaW50IGlzY2FuOwotCi0JZm9yIChpc2NhbiA9IFNFR19FMDsgaXNjYW4gPCBTRUdfVU5LTk9XTjsgaXNjYW4rKykKLQkgIHNoX2NvdW50X3JlbG9jcyAoKGJmZCAqKSBOVUxMLCBpc2NhbiwgKFBUUikgJmluZm8pOwotICAgICAgfQotI2VuZGlmCi0KLSAgICAgIGlmIChpbmZvLmNvdW50IDwgMSkKLQlhYm9ydCAoKTsKLQotICAgICAgLyogR2VuZXJhdGUgYSBCRkRfUkVMT0NfU0hfQ09VTlQgZml4dXAgYXQgdGhlIGxvY2F0aW9uIG9mIHN5bS4KLQkgV2UgaGF2ZSBhbHJlYWR5IGFkanVzdGVkIHRoZSB2YWx1ZSBvZiBzeW0gdG8gaW5jbHVkZSB0aGUKLQkgZnJhZ21lbnQgYWRkcmVzcywgc28gd2UgdW5kbyB0aGF0IGFkanVzdG1lbnQgaGVyZS4gICovCi0gICAgICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOwotICAgICAgZml4X25ldyAoc3ltYm9sX2dldF9mcmFnIChzeW0pLAotCSAgICAgICBTX0dFVF9WQUxVRSAoc3ltKSAtIHN5bWJvbF9nZXRfZnJhZyAoc3ltKS0+ZnJfYWRkcmVzcywKLQkgICAgICAgNCwgJmFic19zeW1ib2wsIGluZm8uY291bnQsIDAsIEJGRF9SRUxPQ19TSF9DT1VOVCk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgc3ltYm9sIHRhYmxlIGhhcyBiZWVuIGNvbXBsZXRlZCwKLSAgIGJ1dCBiZWZvcmUgdGhlIHJlbG9jcyBvciBzZWN0aW9uIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuIG91dC4KLSAgIElmIHdlIGhhdmUgc2VlbiBhbnkgLnVzZXMgcHNldWRvLW9wcywgdGhleSBwb2ludCB0byBhbiBpbnN0cnVjdGlvbgotICAgd2hpY2ggbG9hZHMgYSByZWdpc3RlciB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uICBXZSBsb29rCi0gICB0aHJvdWdoIHRoZSBmaXh1cHMgdG8gZmluZCB3aGVyZSB0aGUgZnVuY3Rpb24gYWRkcmVzcyBpcyBiZWluZwotICAgbG9hZGVkIGZyb20uICBXZSB0aGVuIGdlbmVyYXRlIGEgQ09VTlQgcmVsb2MgZ2l2aW5nIHRoZSBudW1iZXIgb2YKLSAgIHRpbWVzIHRoYXQgZnVuY3Rpb24gYWRkcmVzcyBpcyByZWZlcnJlZCB0by4gIFRoZSBsaW5rZXIgdXNlcyB0aGlzCi0gICBpbmZvcm1hdGlvbiB3aGVuIGRvaW5nIHJlbGF4aW5nLCB0byBkZWNpZGUgd2hlbiBpdCBjYW4gZWxpbWluYXRlCi0gICB0aGUgc3RvcmVkIGZ1bmN0aW9uIGFkZHJlc3MgZW50aXJlbHkuICAqLwotCi12b2lkCi1zaF9mcm9iX2ZpbGUgKCkKLXsKLSAgaWYgKCEgc2hfcmVsYXgpCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgc2hfZnJvYl9zZWN0aW9uLCAoUFRSKSBOVUxMKTsKLSNlbHNlCi0gIHsKLSAgICBpbnQgaXNlZzsKLQotICAgIGZvciAoaXNlZyA9IFNFR19FMDsgaXNlZyA8IFNFR19VTktOT1dOOyBpc2VnKyspCi0gICAgICBzaF9mcm9iX3NlY3Rpb24gKChiZmQgKikgTlVMTCwgaXNlZywgKFBUUikgTlVMTCk7Ci0gIH0KLSNlbmRpZgotfQotCi0vKiBDYWxsZWQgYWZ0ZXIgcmVsYXhpbmcuICBTZXQgdGhlIGNvcnJlY3Qgc2l6ZXMgb2YgdGhlIGZyYWdtZW50cywgYW5kCi0gICBjcmVhdGUgcmVsb2NzIHNvIHRoYXQgbWRfYXBwbHlfZml4IHdpbGwgZmlsbCBpbiB0aGUgY29ycmVjdCB2YWx1ZXMuICAqLwotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICBiZmQgKmhlYWRlcnM7Ci0jZWxzZQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSNlbmRpZgotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBpbnQgZG9uZXJlbGF4ID0gMDsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDgpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EOCk6Ci0gICAgICBzdWJzZWdfY2hhbmdlIChzZWcsIDApOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gMjsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik6Ci0gICAgICBzdWJzZWdfY2hhbmdlIChzZWcsIDApOwotICAgICAgZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsIGZyYWdQLT5mcl9zeW1ib2wsIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMik7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IDI7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpOgotICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICBpZiAoZnJhZ1AtPmZyX3N5bWJvbCA9PSBOVUxMKQotCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcyk7Ci0gICAgICBlbHNlIGlmIChTX0lTX0RFRklORUQgKGZyYWdQLT5mcl9zeW1ib2wpKQotCWFzX2JhZCAoXygiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byBkZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQotCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7Ci0gICAgICBlbHNlCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIHVuZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDEyLWJpdCBmaWVsZCIpLAotCQkodW5zaWduZWQgbG9uZykgZnJhZ1AtPmZyX2FkZHJlc3MsCQkKLQkJU19HRVRfTkFNRSAoZnJhZ1AtPmZyX3N5bWJvbCkpOwotCi0jaWYgMAkJCQkvKiBUaGlzIGNvZGUgd29ya3MsIGJ1dCBnZW5lcmF0ZXMgcG9vciBjb2RlIGFuZCB0aGUgY29tcGlsZXIKLQkJCQkgICBzaG91bGQgbmV2ZXIgcHJvZHVjZSBhIHNlcXVlbmNlIHRoYXQgcmVxdWlyZXMgaXQgdG8gYmUgdXNlZC4gICovCi0KLSAgICAgIC8qIEEganVtcCB3b250IGZpdCBpbiAxMiBiaXRzLCBtYWtlIGNvZGUgd2hpY2ggbG9va3MgbGlrZQotCSBicmEgZm9vCi0JIG1vdi53IEAoMCwgUEMpLCByMTQKLQkgLmxvbmcgZGlzcAotCSBmb286IGJyYSBAcjE0Ci0JICovCi0gICAgICBpbnQgdCA9IGJ1ZmZlclswXSAmIDB4MTA7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZV0gPSAweGEwOwkvKiBicmFuY2ggb3ZlciBtb3ZlIGFuZCBkaXNwICovCi0gICAgICBidWZmZXJbbG93Ynl0ZV0gPSAzOwotICAgICAgYnVmZmVyW2hpZ2hieXRlKzJdID0gMHhkMCB8IEpSRUc7CS8qIEJ1aWxkIG1vdiBpbnNuICovCi0gICAgICBidWZmZXJbbG93Ynl0ZSsyXSA9IDB4MDA7Ci0KLSAgICAgIGJ1ZmZlcltoaWdoYnl0ZSs0XSA9IDA7CS8qIHNwYWNlIGZvciAzMiBiaXQganVtcCBkaXNwICovCi0gICAgICBidWZmZXJbbG93Ynl0ZSs0XSA9IDA7Ci0gICAgICBidWZmZXJbaGlnaGJ5dGUrNl0gPSAwOwotICAgICAgYnVmZmVyW2xvd2J5dGUrNl0gPSAwOwotCi0gICAgICBidWZmZXJbaGlnaGJ5dGUrOF0gPSAweDQwIHwgSlJFRzsJLyogQnVpbGQgam1wIEBKUkVHICovCi0gICAgICBidWZmZXJbbG93Ynl0ZSs4XSA9IHQgPyAweGIgOiAweDJiOwotCi0gICAgICBidWZmZXJbaGlnaGJ5dGUrMTBdID0gMHgyMDsgLyogYnVpbGQgbm9wICovCi0gICAgICBidWZmZXJbbG93Ynl0ZSsxMF0gPSAweDBiOwotCi0gICAgICAvKiBNYWtlIHJlbG9jIGZvciB0aGUgbG9uZyBkaXNwICovCi0gICAgICBmaXhfbmV3IChmcmFnUCwKLQkgICAgICAgZnJhZ1AtPmZyX2ZpeCArIDQsCi0JICAgICAgIDQsCi0JICAgICAgIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsCi0JICAgICAgIDAsCi0JICAgICAgIEJGRF9SRUxPQ18zMik7Ci0gICAgICBmcmFnUC0+ZnJfZml4ICs9IFVOQ09ORDMyX0xFTkdUSDsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZG9uZXJlbGF4ID0gMTsKLSNlbmRpZgotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBDT05EMTIpOgotICAgIGNhc2UgQyAoQ09ORF9KVU1QX0RFTEFZLCBDT05EMTIpOgotICAgICAgLyogQSBiY29uZCB3b24ndCBmaXQsIHNvIHR1cm4gaXQgaW50byBhIGIhY29uZDsgYnJhIGRpc3A7IG5vcCAqLwotICAgICAgLyogSSBmb3VuZCB0aGF0IGEgcmVsYXggZmFpbHVyZSBmb3IgZ2NjLmMtdG9ydHVyZS9leGVjdXRlLzkzMDYyOC0xLmMKLQkgd2FzIGR1ZSB0byBnYXMgaW5jb3JyZWN0bHkgcmVsYXhpbmcgYW4gb3V0LW9mLXJhbmdlIGNvbmRpdGlvbmFsCi0JIGJyYW5jaCB3aXRoIGRlbGF5IHNsb3QuICBJdCB0dXJuZWQ6Ci0gICAgICAgICAgICAgICAgICAgICBiZi5zICAgIEw2ICAgICAgICAgICAgICAoc2xvdCBtb3YubCAgIHIxMixAKDQ0LHIwKSkKLSAgICAgICAgIGludG86Ci0gICAKLTJjOiAgOGYgMDEgYTAgOGIgICAgIGJmLnMgICAgMzIgPF9tYWluKzMyPiAgIChzbG90IGJyYSAgICAgICBMNikKLTMwOiAgMDAgMDkgICAgICAgICAgIG5vcAotMzI6ICAxMCBjYiAgICAgICAgICAgbW92LmwgICByMTIsQCg0NCxyMCkKLSAgICAgICAgIFRoZXJlZm9yZSwgYnJhbmNoZXMgd2l0aCBkZWxheSBzbG90cyBoYXZlIHRvIGJlIGhhbmRsZWQKLQkgZGlmZmVyZW50bHkgZnJvbSBvbmVzIHdpdGhvdXQgZGVsYXkgc2xvdHMuICAqLwotICAgICAgewotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9Ci0JICAodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKLQlpbnQgaGlnaGJ5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDAgOiAxOwotCWludCBsb3dieXRlID0gdGFyZ2V0X2JpZ19lbmRpYW4gPyAxIDogMDsKLQlpbnQgZGVsYXkgPSBmcmFnUC0+ZnJfc3VidHlwZSA9PSBDIChDT05EX0pVTVBfREVMQVksIENPTkQxMik7Ci0KLQkvKiBUb2dnbGUgdGhlIHRydWUvZmFsc2UgYml0IG9mIHRoZSBiY29uZC4gICovCi0JYnVmZmVyW2hpZ2hieXRlXSBePSAweDI7Ci0KLQkvKiBJZiB0aGlzIGlzIGEgZGFsYXllZCBicmFuY2gsIHdlIG1heSBub3QgcHV0IHRoZSB0aGUgYnJhIGluIHRoZQotCSAgIHNsb3QuICBTbyB3ZSBjaGFuZ2UgaXQgdG8gYSBub24tZGVsYXllZCBicmFuY2gsIGxpa2UgdGhhdDoKLQkgICBiISBjb25kIHNsb3RfbGFiZWw7IGJyYSBkaXNwOyBzbG90X2xhYmVsOiBzbG90X2luc24KLQkgICA/Pz8gV2Ugc2hvdWxkIHRyeSBpZiBzd2FwcGluZyB0aGUgY29uZGl0aW9uYWwgYnJhbmNoIGFuZAotCSAgIGl0cyBkZWxheS1zbG90IGluc24gYWxyZWFkeSBtYWtlcyB0aGUgYnJhbmNoIHJlYWNoLiAgKi8KLQotCS8qIEJ1aWxkIGEgcmVsb2NhdGlvbiB0byBzaXggLyBmb3VyIGJ5dGVzIGZhcnRoZXIgb24uICAqLwotCXN1YnNlZ19jaGFuZ2UgKHNlZywgMCk7Ci0JZml4X25ldyAoZnJhZ1AsIGZyYWdQLT5mcl9maXgsIDIsCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkgc2VjdGlvbl9zeW1ib2wgKHNlZyksCi0jZWxzZQotCQkgc2VnX2luZm8gKHNlZyktPmRvdCwKLSNlbmRpZgotCQkgZnJhZ1AtPmZyX2FkZHJlc3MgKyBmcmFnUC0+ZnJfZml4ICsgKGRlbGF5ID8gNCA6IDYpLAotCQkgMSwgQkZEX1JFTE9DX1NIX1BDRElTUDhCWTIpOwotCi0JLyogU2V0IHVwIGEganVtcCBpbnN0cnVjdGlvbi4gICovCi0JYnVmZmVyW2hpZ2hieXRlICsgMl0gPSAweGEwOwotCWJ1ZmZlcltsb3dieXRlICsgMl0gPSAwOwotCWZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4ICsgMiwgMiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMik7Ci0KLQlpZiAoZGVsYXkpCi0JICB7Ci0JICAgIGJ1ZmZlcltoaWdoYnl0ZV0gJj0gfjB4NDsgLyogUmVtb3ZlcyBkZWxheSBzbG90IGZyb20gYnJhbmNoLiAgKi8KLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgLyogRmlsbCBpbiBhIE5PUCBpbnN0cnVjdGlvbi4gICovCi0JICAgIGJ1ZmZlcltoaWdoYnl0ZSArIDRdID0gMHgwOwotCSAgICBidWZmZXJbbG93Ynl0ZSArIDRdID0gMHg5OwotCi0JICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLQkgIH0KLQlmcmFnUC0+ZnJfdmFyID0gMDsKLQlkb25lcmVsYXggPSAxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgQ09ORDMyKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgQ09ORDMyKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGlmIChmcmFnUC0+ZnJfc3ltYm9sID09IE5VTEwpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyA4LWJpdCBmaWVsZCIpLCAKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzKTsKLSAgICAgIGVsc2UgaWYgKFNfSVNfREVGSU5FRCAoZnJhZ1AtPmZyX3N5bWJvbCkpCi0JYXNfYmFkIChfKCJhdCAweCVseCwgZGlzcGxhY2VtZW50IHRvIGRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyA4LWJpdCBmaWVsZCAiKSwKLQkJKHVuc2lnbmVkIGxvbmcpIGZyYWdQLT5mcl9hZGRyZXNzLAkJCi0JCVNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpKTsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgOC1iaXQgZmllbGQgIiksCi0JCSh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfYWRkcmVzcywJCQotCQlTX0dFVF9OQU1FIChmcmFnUC0+ZnJfc3ltYm9sKSk7Ci0KLSNpZiAwCQkJCS8qIFRoaXMgY29kZSB3b3JrcywgYnV0IGdlbmVyYXRlcyBwb29yIGNvZGUsIGFuZCB0aGUgY29tcGlsZXIKLQkJCQkgICBzaG91bGQgbmV2ZXIgcHJvZHVjZSBhIHNlcXVlbmNlIHRoYXQgcmVxdWlyZXMgaXQgdG8gYmUgdXNlZC4gICovCi0KLSAgICAgIC8qIEEgYmNvbmQgd29uJ3QgZml0IGFuZCBpdCB3b24ndCBnbyBpbnRvIGEgMTIgYml0Ci0JIGRpc3BsYWNlbWVudCBlaXRoZXIsIHRoZSBjb2RlIHNlcXVlbmNlIGxvb2tzIGxpa2U6Ci0JIGIhY29uZCBmb29wCi0JIG1vdi53IEAobiwgUEMpLCByMTQKLQkgam1wICBAcjE0Ci0JIG5vcAotCSAubG9uZyB3aGVyZQotCSBmb29wOgotCSAqLwotCi0gICAgICBidWZmZXJbMF0gXj0gMHgyOwkJLyogVG9nZ2xlIFQvRiBiaXQgKi8KLSNkZWZpbmUgSlJFRyAxNAotICAgICAgYnVmZmVyWzFdID0gNTsJCS8qIGJyYW5jaCBvdmVyIG1vdiwganVtcCwgbm9wIGFuZCBwdHIgKi8KLSAgICAgIGJ1ZmZlclsyXSA9IDB4ZDAgfCBKUkVHOwkvKiBCdWlsZCBtb3YgaW5zbiAqLwotICAgICAgYnVmZmVyWzNdID0gMHgyOwotICAgICAgYnVmZmVyWzRdID0gMHg0MCB8IEpSRUc7CS8qIEJ1aWxkIGptcCBASlJFRyAqLwotICAgICAgYnVmZmVyWzVdID0gMHgwYjsKLSAgICAgIGJ1ZmZlcls2XSA9IDB4MjA7CQkvKiBidWlsZCBub3AgKi8KLSAgICAgIGJ1ZmZlcls3XSA9IDB4MGI7Ci0gICAgICBidWZmZXJbOF0gPSAwOwkJLyogc3BhY2UgZm9yIDMyIGJpdCBqdW1wIGRpc3AgKi8KLSAgICAgIGJ1ZmZlcls5XSA9IDA7Ci0gICAgICBidWZmZXJbMTBdID0gMDsKLSAgICAgIGJ1ZmZlclsxMV0gPSAwOwotICAgICAgYnVmZmVyWzEyXSA9IDA7Ci0gICAgICBidWZmZXJbMTNdID0gMDsKLSAgICAgIC8qIE1ha2UgcmVsb2MgZm9yIHRoZSBsb25nIGRpc3AgKi8KLSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgOCwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gQ09ORDMyX0xFTkdUSDsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZG9uZXJlbGF4ID0gMTsKLSNlbmRpZgotCi0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgaWYgKGRvbmVyZWxheCAmJiAhc2hfcmVsYXgpCi0gICAgYXNfd2Fybl93aGVyZSAoZnJhZ1AtPmZyX2ZpbGUsIGZyYWdQLT5mcl9saW5lLAotCQkgICBfKCJvdmVyZmxvdyBpbiBicmFuY2ggdG8gJXM7IGNvbnZlcnRlZCBpbnRvIGxvbmdlciBpbnN0cnVjdGlvbiBzZXF1ZW5jZSIpLAotCQkgICAoZnJhZ1AtPmZyX3N5bWJvbCAhPSBOVUxMCi0JCSAgICA/IFNfR0VUX05BTUUgKGZyYWdQLT5mcl9zeW1ib2wpCi0JCSAgICA6ICIiKSk7Ci19Ci0KLXZhbHVlVAotREVGVU4gKG1kX3NlY3Rpb25fYWxpZ24sIChzZWcsIHNpemUpLAotICAgICAgIHNlZ1Qgc2VnIEFORAotICAgICAgIHZhbHVlVCBzaXplKQotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBPQkpfRUxGCi0gIHJldHVybiBzaXplOwotI2Vsc2UgLyogISBPQkpfRUxGICovCi0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZykpIC0gMSkKLQkgICYgKC0xIDw8IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkpOwotI2VuZGlmIC8qICEgT0JKX0VMRiAqLwotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpCi0JICAmICgtMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSk7Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi19Ci0KLS8qIFRoaXMgc3RhdGljIHZhcmlhYmxlIGlzIHNldCBieSBzX3VhY29ucyB0byB0ZWxsIHNoX2NvbnNfYWxpZ24gdGhhdAotICAgdGhlIGV4cGVzc2lvbiBkb2VzIG5vdCBuZWVkIHRvIGJlIGFsaWduZWQuICAqLwotCi1zdGF0aWMgaW50IHNoX25vX2FsaWduX2NvbnMgPSAwOwotCi0vKiBUaGlzIGhhbmRsZXMgdGhlIHVuYWxpZ25lZCBzcGFjZSBhbGxvY2F0aW9uIHBzZXVkby1vcHMsIHN1Y2ggYXMKLSAgIC51YXdvcmQuICAudWF3b3JkIGlzIGp1c3QgbGlrZSAud29yZCwgYnV0IHRoZSB2YWx1ZSBkb2VzIG5vdCBuZWVkCi0gICB0byBiZSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfdWFjb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICAvKiBUZWxsIHNoX2NvbnNfYWxpZ24gbm90IHRvIGFsaWduIHRoaXMgdmFsdWUuICAqLwotICBzaF9ub19hbGlnbl9jb25zID0gMTsKLSAgY29ucyAoYnl0ZXMpOwotfQotCi0vKiBJZiBhIC53b3JkLCBldC4gYWwuLCBwc2V1ZC1vcCBpcyBzZWVuLCB3YXJuIGlmIHRoZSB2YWx1ZSBpcyBub3QKLSAgIGFsaWduZWQgY29ycmVjdGx5LiAgTm90ZSB0aGF0IHRoaXMgY2FuIGNhdXNlIHdhcm5pbmdzIHRvIGJlIGlzc3VlZAotICAgd2hlbiBhc3NlbWJsaW5nIGluaXRpYWxpemVkIHN0cnVjdHVyZWQgd2hpY2ggd2VyZSBkZWNsYXJlZCB3aXRoIHRoZQotICAgcGFja2VkIGF0dHJpYnV0ZS4gIEZJWE1FOiBQZXJoYXBzIHdlIHNob3VsZCByZXF1aXJlIGFuIG9wdGlvbiB0bwotICAgZW5hYmxlIHRoaXMgd2FybmluZz8gICovCi0KLXZvaWQKLXNoX2NvbnNfYWxpZ24gKG5ieXRlcykKLSAgICAgaW50IG5ieXRlczsKLXsKLSAgaW50IG5hbGlnbjsKLSAgY2hhciAqcDsKLQotICBpZiAoc2hfbm9fYWxpZ25fY29ucykKLSAgICB7Ci0gICAgICAvKiBUaGlzIGlzIGFuIHVuYWxpZ25lZCBwc2V1ZG8tb3AuICAqLwotICAgICAgc2hfbm9fYWxpZ25fY29ucyA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbGlnbiA9IDA7Ci0gIHdoaWxlICgobmJ5dGVzICYgMSkgPT0gMCkKLSAgICB7Ci0gICAgICArK25hbGlnbjsKLSAgICAgIG5ieXRlcyA+Pj0gMTsKLSAgICB9Ci0KLSAgaWYgKG5hbGlnbiA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAobm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGlmICgoYWJzX3NlY3Rpb25fb2Zmc2V0ICYgKCgxIDw8IG5hbGlnbikgLSAxKSkgIT0gMCkKLQlhc193YXJuIChfKCJtaXNhbGlnbmVkIGRhdGEiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHAgPSBmcmFnX3ZhciAocnNfYWxpZ25fY29kZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKLQkJKHN5bWJvbFMgKikgTlVMTCwgKG9mZnNldFQpIG5hbGlnbiwgKGNoYXIgKikgTlVMTCk7Ci0KLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgbmFsaWduKTsKLX0KLQotLyogV2hlbiByZWxheGluZywgd2UgbmVlZCB0byBvdXRwdXQgYSByZWxvYyBmb3IgYW55IC5hbGlnbiBkaXJlY3RpdmUKLSAgIHRoYXQgcmVxdWVzdHMgYWxpZ25tZW50IHRvIGEgZm91ciBieXRlIGJvdW5kYXJ5IG9yIGxhcmdlci4gIFRoaXMgaXMKLSAgIGFsc28gd2hlcmUgd2UgY2hlY2sgZm9yIG1pc2FsaWduZWQgZGF0YS4gICovCi0KLXZvaWQKLXNoX2hhbmRsZV9hbGlnbiAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGlmIChzaF9yZWxheAotICAgICAgJiYgZnJhZy0+ZnJfdHlwZSA9PSByc19hbGlnbgotICAgICAgJiYgZnJhZy0+ZnJfYWRkcmVzcyArIGZyYWctPmZyX2ZpeCA+IDAKLSAgICAgICYmIGZyYWctPmZyX29mZnNldCA+IDEKLSAgICAgICYmIG5vd19zZWcgIT0gYnNzX3NlY3Rpb24pCi0gICAgZml4X25ldyAoZnJhZywgZnJhZy0+ZnJfZml4LCAyLCAmYWJzX3N5bWJvbCwgZnJhZy0+ZnJfb2Zmc2V0LCAwLAotCSAgICAgQkZEX1JFTE9DX1NIX0FMSUdOKTsKLQotICBpZiAoZnJhZy0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlCi0gICAgICAmJiBmcmFnLT5mcl9uZXh0LT5mcl9hZGRyZXNzIC0gZnJhZy0+ZnJfYWRkcmVzcyAtIGZyYWctPmZyX2ZpeCAhPSAwKQotICAgIGFzX3dhcm5fd2hlcmUgKGZyYWctPmZyX2ZpbGUsIGZyYWctPmZyX2xpbmUsIF8oIm1pc2FsaWduZWQgZGF0YSIpKTsKLX0KLQotLyogVGhpcyBtYWNybyBkZWNpZGVzIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHJlbG9jIGlzIGFuIGVudHJ5IGluIGEKLSAgIHN3aXRjaCB0YWJsZS4gIEl0IGlzIHVzZWQgd2hlbiByZWxheGluZywgYmVjYXVzZSB0aGUgbGlua2VyIG5lZWRzCi0gICB0byBrbm93IGFib3V0IGFsbCBzdWNoIGVudHJpZXMgc28gdGhhdCBpdCBjYW4gYWRqdXN0IHRoZW0gaWYKLSAgIG5lY2Vzc2FyeS4gICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIFNXSVRDSF9UQUJMRV9DT05TKGZpeCkgKDApCi0jZWxzZQotI2RlZmluZSBTV0lUQ0hfVEFCTEVfQ09OUyhmaXgpCQkJCVwKLSAgKChmaXgpLT5meF9yX3R5cGUgPT0gMAkJCQlcCi0gICAmJiAoKGZpeCktPmZ4X3NpemUgPT0gMgkJCQlcCi0gICAgICAgfHwgKGZpeCktPmZ4X3NpemUgPT0gMQkJCQlcCi0gICAgICAgfHwgKGZpeCktPmZ4X3NpemUgPT0gNCkpCi0jZW5kaWYKLQotI2RlZmluZSBTV0lUQ0hfVEFCTEUoZml4KQkJCQlcCi0gICgoZml4KS0+ZnhfYWRkc3kgIT0gTlVMTAkJCQlcCi0gICAmJiAoZml4KS0+Znhfc3Vic3kgIT0gTlVMTAkJCQlcCi0gICAmJiBTX0dFVF9TRUdNRU5UICgoZml4KS0+ZnhfYWRkc3kpID09IHRleHRfc2VjdGlvbglcCi0gICAmJiBTX0dFVF9TRUdNRU5UICgoZml4KS0+Znhfc3Vic3kpID09IHRleHRfc2VjdGlvbglcCi0gICAmJiAoKGZpeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzIJCQlcCi0gICAgICAgfHwgKGZpeCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMTYJCVwKLSAgICAgICB8fCAoZml4KS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184CQlcCi0gICAgICAgfHwgU1dJVENIX1RBQkxFX0NPTlMgKGZpeCkpKQotCi0vKiBTZWUgd2hldGhlciB3ZSBuZWVkIHRvIGZvcmNlIGEgcmVsb2NhdGlvbiBpbnRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFRoaXMgaXMgdXNlZCB0byBmb3JjZSBvdXQgc3dpdGNoIGFuZCBQQyByZWxhdGl2ZSByZWxvY2F0aW9ucyB3aGVuCi0gICByZWxheGluZy4gICovCi0KLWludAotc2hfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotICAgICBmaXhTICpmaXg7Ci17Ci0KLSAgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVAotICAgICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICByZXR1cm4gMTsKLQotICBpZiAoISBzaF9yZWxheCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGZpeC0+ZnhfcGNyZWwKLQkgIHx8IFNXSVRDSF9UQUJMRSAoZml4KQotCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0NPVU5UCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04KLQkgIHx8IGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT0RFCi0JICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfREFUQQotCSAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0xBQkVMKTsKLX0KLQotI2lmZGVmIE9CSl9FTEYKLWJvb2xlYW4KLXNoX2ZpeF9hZGp1c3RhYmxlIChmaXhQKQotICAgZml4UyAqZml4UDsKLXsKLQotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAgCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQotI2VuZGlmCi0KLS8qIEFwcGx5IGEgZml4dXAgdG8gdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWludAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWxwKQotICAgICBmaXhTICpmaXhQOwotICAgICB2YWx1ZVQgKnZhbHA7Ci0jZWxzZQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotI2VuZGlmCi17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLSAgaW50IGxvd2J5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDEgOiAwOwotICBpbnQgaGlnaGJ5dGUgPSB0YXJnZXRfYmlnX2VuZGlhbiA/IDAgOiAxOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgbG9uZyB2YWwgPSAqdmFscDsKLSNlbmRpZgotICBsb25nIG1heCwgbWluOwotICBpbnQgc2hpZnQ7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIGFkanVzdF9yZWxvY19zeW1zIHdvbid0IGNvbnZlcnQgYSByZWxvYyBhZ2FpbnN0IGEgd2VhayBzeW1ib2wKLSAgICAgaW50byBhIHJlbG9jIGFnYWluc3QgYSBzZWN0aW9uLCBidXQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbiB3aWxsCi0gICAgIHNjcmV3IHVwIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCwgc28gd2UgaGF2ZSB0byBhZGp1c3QgdmFsIGhlcmUKLSAgICAgdG8gYXZvaWQgdGhlIHNjcmV3IHVwIGxhdGVyLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmIFNfSVNfV0VBSyAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHZhbCAtPSBTX0dFVF9WQUxVRSAgKGZpeFAtPmZ4X2FkZHN5KTsKLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChmaXhQLT5meF9zaXplID09IDIpCi0JZml4UC0+Znhfcl90eXBlID0gQkZEX1JFTE9DXzE2OwotICAgICAgZWxzZSBpZiAoZml4UC0+Znhfc2l6ZSA9PSA0KQotCWZpeFAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGVsc2UgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSkKLQlmaXhQLT5meF9yX3R5cGUgPSBCRkRfUkVMT0NfODsKLSAgICAgIGVsc2UKLQlhYm9ydCAoKTsKLSAgICB9Ci0jZW5kaWYKLQotICBtYXggPSBtaW4gPSAwOwotICBzaGlmdCA9IDA7Ci0gIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotICAgIHsKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU00OgotICAgICAgbWF4ID0gMHhmOwotICAgICAgKmJ1ZiA9ICgqYnVmICYgMHhmMCkgfCAodmFsICYgMHhmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfSU1NNEJZMjoKLSAgICAgIG1heCA9IDB4ZjsKLSAgICAgIHNoaWZ0ID0gMTsKLSAgICAgICpidWYgPSAoKmJ1ZiAmIDB4ZjApIHwgKCh2YWwgPj4gMSkgJiAweGYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU00Qlk0OgotICAgICAgbWF4ID0gMHhmOwotICAgICAgc2hpZnQgPSAyOwotICAgICAgKmJ1ZiA9ICgqYnVmICYgMHhmMCkgfCAoKHZhbCA+PiAyKSAmIDB4Zik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0lNTThCWTI6Ci0gICAgICBtYXggPSAweGZmOwotICAgICAgc2hpZnQgPSAxOwotICAgICAgKmJ1ZiA9IHZhbCA+PiAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU04Qlk0OgotICAgICAgbWF4ID0gMHhmZjsKLSAgICAgIHNoaWZ0ID0gMjsKLSAgICAgICpidWYgPSB2YWwgPj4gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfODoKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9JTU04OgotICAgICAgLyogU29tZXRpbWVzIHRoZSA4IGJpdCB2YWx1ZSBpcyBzaWduIGV4dGVuZGVkIChlLmcuLCBhZGQpIGFuZAotICAgICAgICAgc29tZXRpbWVzIGl0IGlzIG5vdCAoZS5nLiwgYW5kKS4gIFdlIHBlcm1pdCBhbnkgOCBiaXQgdmFsdWUuCi0gICAgICAgICBOb3RlIHRoYXQgYWRkaW5nIGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG1heSBpbnZhbGlkYXRlCi0gICAgICAgICByZWFzb25hYmxlIGxvb2tpbmcgYXNzZW1ibHkgY29kZSwgc3VjaCBhcyBgYGFuZCAtMHgxLHIwJycuICAqLwotICAgICAgbWF4ID0gMHhmZjsKLSAgICAgIG1pbiA9IC0gMHhmZjsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04Qlk0OgotICAgICAgLyogVGhlIGxvd2VyIHR3byBiaXRzIG9mIHRoZSBQQyBhcmUgY2xlYXJlZCBiZWZvcmUgdGhlCi0gICAgICAgICBkaXNwbGFjZW1lbnQgaXMgYWRkZWQgaW4uICBXZSBjYW4gYXNzdW1lIHRoYXQgdGhlIGRlc3RpbmF0aW9uCi0gICAgICAgICBpcyBvbiBhIDQgYnl0ZSBib3VuZGF5LiAgSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhbHNvIG9uIGEgNAotICAgICAgICAgYnl0ZSBib3VuZGFyeSwgdGhlbiB3ZSB3YW50Ci0JICAgKHRhcmdldCAtIGhlcmUpIC8gNAotCSBhbmQgdGFyZ2V0IC0gaGVyZSBpcyBhIG11bHRpcGxlIG9mIDQuCi0JIE90aGVyd2lzZSwgd2UgYXJlIG9uIGEgMiBieXRlIGJvdW5kYXJ5LCBhbmQgd2Ugd2FudAotCSAgICh0YXJnZXQgLSAoaGVyZSAtIDIpKSAvIDQKLQkgYW5kIHRhcmdldCAtIGhlcmUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNC4gIENvbXB1dGluZwotCSAgICh0YXJnZXQgLSAoaGVyZSAtIDIpKSAvIDQgPT0gKHRhcmdldCAtIGhlcmUgKyAyKSAvIDQKLQkgd29ya3MgZm9yIGJvdGggY2FzZXMsIHNpbmNlIGluIHRoZSBmaXJzdCBjYXNlIHRoZSBhZGRpdGlvbiBvZgotCSAyIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgZGl2aXNpb24uICB0YXJnZXQgLSBoZXJlIGlzIGluIHRoZQotCSB2YXJpYWJsZSB2YWwuICAqLwotICAgICAgdmFsID0gKHZhbCArIDIpIC8gNDsKLSAgICAgIGlmICh2YWwgJiB+MHhmZikKLQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oInBjcmVsIHRvbyBmYXIiKSk7Ci0gICAgICBidWZbbG93Ynl0ZV0gPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZMjoKLSAgICAgIHZhbCAvPSAyOwotICAgICAgaWYgKHZhbCAmIH4weGZmKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygicGNyZWwgdG9vIGZhciIpKTsKLSAgICAgIGJ1Zltsb3dieXRlXSA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfUENESVNQOEJZMjoKLSAgICAgIHZhbCAvPSAyOwotICAgICAgaWYgKHZhbCA8IC0weDgwIHx8IHZhbCA+IDB4N2YpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJwY3JlbCB0b28gZmFyIikpOwotICAgICAgYnVmW2xvd2J5dGVdID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9QQ0RJU1AxMkJZMjoKLSAgICAgIHZhbCAvPSAyOwotICAgICAgaWYgKHZhbCA8IC0weDgwMCB8fCB2YWwgPj0gMHg3ZmYpCi0JYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLCBfKCJwY3JlbCB0b28gZmFyIikpOwotICAgICAgYnVmW2xvd2J5dGVdID0gdmFsICYgMHhmZjsKLSAgICAgIGJ1ZltoaWdoYnl0ZV0gfD0gKHZhbCA+PiA4KSAmIDB4ZjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfMzI6Ci0gICAgICBpZiAoISB0YXJnZXRfYmlnX2VuZGlhbikgCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDA7Ci0JICAqYnVmKysgPSB2YWwgPj4gODsKLQkgICpidWYrKyA9IHZhbCA+PiAxNjsKLQkgICpidWYrKyA9IHZhbCA+PiAyNDsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgICpidWYrKyA9IHZhbCA+PiAyNDsKLQkgICpidWYrKyA9IHZhbCA+PiAxNjsKLQkgICpidWYrKyA9IHZhbCA+PiA4OwotCSAgKmJ1ZisrID0gdmFsID4+IDA7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEJGRF9SRUxPQ18xNjoKLSAgICAgIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotCXsKLQkgICpidWYrKyA9IHZhbCA+PiAwOwotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JfSAKLSAgICAgIGVsc2UgCi0JewotCSAgKmJ1ZisrID0gdmFsID4+IDg7Ci0JICAqYnVmKysgPSB2YWwgPj4gMDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQkZEX1JFTE9DX1NIX1VTRVM6Ci0gICAgICAvKiBQYXNzIHRoZSB2YWx1ZSBpbnRvIHNoX2NvZmZfcmVsb2NfbWFuZ2xlLiAgKi8KLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfU0hfQ09VTlQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU0hfQUxJR046Ci0gICAgY2FzZSBCRkRfUkVMT0NfU0hfQ09ERToKLSAgICBjYXNlIEJGRF9SRUxPQ19TSF9EQVRBOgotICAgIGNhc2UgQkZEX1JFTE9DX1NIX0xBQkVMOgotICAgICAgLyogTm90aGluZyB0byBkbyBoZXJlLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZOgotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgcmV0dXJuIDA7Ci0jZWxzZQotICAgICAgcmV0dXJuOwotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGlmIChzaGlmdCAhPSAwKQotICAgIHsKLSAgICAgIGlmICgodmFsICYgKCgxIDw8IHNoaWZ0KSAtIDEpKSAhPSAwKQotCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwgXygibWlzYWxpZ25lZCBvZmZzZXQiKSk7Ci0gICAgICBpZiAodmFsID49IDApCi0JdmFsID4+PSBzaGlmdDsKLSAgICAgIGVsc2UKLQl2YWwgPSAoKHZhbCA+PiBzaGlmdCkKLQkgICAgICAgfCAoKGxvbmcpIC0xICYgfiAoKGxvbmcpIC0xID4+IHNoaWZ0KSkpOwotICAgIH0KLSAgaWYgKG1heCAhPSAwICYmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KSkKLSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsIF8oIm9mZnNldCBvdXQgb2YgcmFuZ2UiKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLS8qIENhbGxlZCBqdXN0IGJlZm9yZSBhZGRyZXNzIHJlbGF4YXRpb24uICBSZXR1cm4gdGhlIGxlbmd0aAotICAgYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbi4gICovCi0KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3N1YnR5cGUpCi0gICAgewotICAgIGNhc2UgQyAoVU5DT05EX0pVTVAsIFVOREVGX0RJU1ApOgotICAgICAgLyogdXNlZCB0byBiZSBhIGJyYW5jaCB0byBzb21ld2hlcmUgd2hpY2ggd2FzIHVua25vd24gKi8KLSAgICAgIGlmICghZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMik7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDEyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDIChVTkNPTkRfSlVNUCwgVU5DT05EMTIpOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKFVOQ09ORF9KVU1QLCBVTkNPTkQxMildLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAoVU5DT05EX0pVTVAsIFVOREVGX1dPUkRfRElTUCk7Ci0JICBmcmFnUC0+ZnJfdmFyID0gbWRfcmVsYXhfdGFibGVbQyAoVU5DT05EX0pVTVAsIFVOQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQkgIHJldHVybiBtZF9yZWxheF90YWJsZVtDIChVTkNPTkRfSlVNUCwgVU5DT05EMzIpXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgQyAoQ09ORF9KVU1QLCBVTkRFRl9ESVNQKToKLSAgICBjYXNlIEMgKENPTkRfSlVNUF9ERUxBWSwgVU5ERUZfRElTUCk6Ci0gICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLwotICAgICAgaWYgKGZyYWdQLT5mcl9zeW1ib2wKLQkgICYmIFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JICAgICBzaXplZCAtIG1heWJlIGl0IHdpbGwgZml4IHVwICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIENPTkQ4KTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGg7Ci0JfQotICAgICAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N5bWJvbCkKLQl7Ci0JICBpbnQgd2hhdCA9IEdFVF9XSEFUIChmcmFnUC0+ZnJfc3VidHlwZSk7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZyAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIENPTkQzMildLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgQ09ORDMyKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IHdoYXQgPSBHRVRfV0hBVCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotCSAgLyogV2Uga25vdyB0aGUgYWJzIHZhbHVlICovCi0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEMgKHdoYXQsIENPTkQ4KTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBDT05EOCldLnJseF9sZW5ndGg7Ci0JfQotCi0gICAgICBicmVhazsKLSAgICB9Ci0gIHJldHVybiBmcmFnUC0+ZnJfdmFyOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIHVzZSwgbmJ5dGVzKQotICAgICBjaGFyICpwdHI7Ci0gICAgIHZhbHVlVCB1c2U7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGlmICghIHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotICBlbHNlCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAocHRyLCB1c2UsIG5ieXRlcyk7Ci19Ci0KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgMjsKLX0KLQotI2lmZGVmIE9CSl9DT0ZGCi0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLQotLyogV2hlbiB3ZSBhbGlnbiB0aGUgLnRleHQgc2VjdGlvbiwgaW5zZXJ0IHRoZSBjb3JyZWN0IE5PUCBwYXR0ZXJuLiAgKi8KLQotaW50Ci1zaF9kb19hbGlnbiAobiwgZmlsbCwgbGVuLCBtYXgpCi0gICAgIGludCBuOwotICAgICBjb25zdCBjaGFyICpmaWxsOwotICAgICBpbnQgbGVuOwotICAgICBpbnQgbWF4OwotewotICBpZiAoZmlsbCA9PSBOVUxMCi0gICAgICAmJiBzdWJzZWdfdGV4dF9wIChub3dfc2VnKQotICAgICAgJiYgbiA+IDEpCi0gICAgewotICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYmlnX25vcF9wYXR0ZXJuW10gPSB7IDB4MDAsIDB4MDkgfTsKLSAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGxpdHRsZV9ub3BfcGF0dGVybltdID0geyAweDA5LCAweDAwIH07Ci0KLSAgICAgIC8qIEZpcnN0IGFsaWduIHRvIGEgMiBieXRlIGJvdW5kYXJ5LCBpbiBjYXNlIHRoZXJlIGlzIGFuIG9kZAotICAgICAgICAgLmJ5dGUuICAqLwotICAgICAgZnJhZ19hbGlnbiAoMSwgMCwgMCk7Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBiaWdfbm9wX3BhdHRlcm4sIHNpemVvZiBiaWdfbm9wX3BhdHRlcm4sIG1heCk7Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBsaXR0bGVfbm9wX3BhdHRlcm4sIHNpemVvZiBsaXR0bGVfbm9wX3BhdHRlcm4sCi0JCQkgICAgbWF4KTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jaWZkZWYgT0JKX0NPRkYKLQotLyogTWFwIEJGRCByZWxvY3MgdG8gU0ggQ09GRiByZWxvY3MuICAqLwotCi1zdHJ1Y3QgcmVsb2NfbWFwCi17Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBiZmRfcmVsb2M7Ci0gIGludCBzaF9yZWxvYzsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVsb2NfbWFwIGNvZmZfcmVsb2NfbWFwW10gPQotewotICB7IEJGRF9SRUxPQ18zMiwgUl9TSF9JTU0zMiB9LAotICB7IEJGRF9SRUxPQ18xNiwgUl9TSF9JTU0xNiB9LAotICB7IEJGRF9SRUxPQ184LCBSX1NIX0lNTTggfSwKLSAgeyBCRkRfUkVMT0NfU0hfUENESVNQOEJZMiwgUl9TSF9QQ0RJU1A4QlkyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyLCBSX1NIX1BDRElTUCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU00LCBSX1NIX0lNTTQgfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NNEJZMiwgUl9TSF9JTU00QlkyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTTRCWTQsIFJfU0hfSU1NNEJZNCB9LAotICB7IEJGRF9SRUxPQ19TSF9JTU04LCBSX1NIX0lNTTggfSwKLSAgeyBCRkRfUkVMT0NfU0hfSU1NOEJZMiwgUl9TSF9JTU04QlkyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0lNTThCWTQsIFJfU0hfSU1NOEJZNCB9LAotICB7IEJGRF9SRUxPQ19TSF9QQ1JFTElNTThCWTIsIFJfU0hfUENSRUxJTU04QlkyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNCwgUl9TSF9QQ1JFTElNTThCWTQgfSwKLSAgeyBCRkRfUkVMT0NfOF9QQ1JFTCwgUl9TSF9TV0lUQ0g4IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDE2LCBSX1NIX1NXSVRDSDE2IH0sCi0gIHsgQkZEX1JFTE9DX1NIX1NXSVRDSDMyLCBSX1NIX1NXSVRDSDMyIH0sCi0gIHsgQkZEX1JFTE9DX1NIX1VTRVMsIFJfU0hfVVNFUyB9LAotICB7IEJGRF9SRUxPQ19TSF9DT1VOVCwgUl9TSF9DT1VOVCB9LAotICB7IEJGRF9SRUxPQ19TSF9BTElHTiwgUl9TSF9BTElHTiB9LAotICB7IEJGRF9SRUxPQ19TSF9DT0RFLCBSX1NIX0NPREUgfSwKLSAgeyBCRkRfUkVMT0NfU0hfREFUQSwgUl9TSF9EQVRBIH0sCi0gIHsgQkZEX1JFTE9DX1NIX0xBQkVMLCBSX1NIX0xBQkVMIH0sCi0gIHsgQkZEX1JFTE9DX1VOVVNFRCwgMCB9Ci19OwotCi0vKiBBZGp1c3QgYSByZWxvYyBmb3IgdGhlIFNILiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBnZW5lcmljIGNvZGUsCi0gICBidXQgZG9lcyBzb21lIG1pbm9yIHR3ZWFraW5nLiAgKi8KLQotdm9pZAotc2hfY29mZl9yZWxvY19tYW5nbGUgKHNlZywgZml4LCBpbnRyLCBwYWRkcikKLSAgICAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZzsKLSAgICAgZml4UyAqZml4OwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludHI7Ci0gICAgIHVuc2lnbmVkIGludCBwYWRkcjsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sX3B0ciA9IGZpeC0+ZnhfYWRkc3k7Ci0gIHN5bWJvbFMgKmRvdDsKLQotICBpbnRyLT5yX3ZhZGRyID0gcGFkZHIgKyBmaXgtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXgtPmZ4X3doZXJlOwotCi0gIGlmICghIFNXSVRDSF9UQUJMRSAoZml4KSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcmVsb2NfbWFwICpybTsKLQotICAgICAgZm9yIChybSA9IGNvZmZfcmVsb2NfbWFwOyBybS0+YmZkX3JlbG9jICE9IEJGRF9SRUxPQ19VTlVTRUQ7IHJtKyspCi0JaWYgKHJtLT5iZmRfcmVsb2MgPT0gKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSkgZml4LT5meF9yX3R5cGUpCi0JICBicmVhazsKLSAgICAgIGlmIChybS0+YmZkX3JlbG9jID09IEJGRF9SRUxPQ19VTlVTRUQpCi0JYXNfYmFkX3doZXJlIChmaXgtPmZ4X2ZpbGUsIGZpeC0+ZnhfbGluZSwKLQkJICAgICAgXygiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIpLAotCQkgICAgICBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoZml4LT5meF9yX3R5cGUpKTsKLSAgICAgIGludHItPnJfdHlwZSA9IHJtLT5zaF9yZWxvYzsKLSAgICAgIGludHItPnJfb2Zmc2V0ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBrbm93IChzaF9yZWxheCk7Ci0KLSAgICAgIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMTYpCi0JaW50ci0+cl90eXBlID0gUl9TSF9TV0lUQ0gxNjsKLSAgICAgIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ184KQotCWludHItPnJfdHlwZSA9IFJfU0hfU1dJVENIODsKLSAgICAgIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMikKLQlpbnRyLT5yX3R5cGUgPSBSX1NIX1NXSVRDSDMyOwotICAgICAgZWxzZQotCWFib3J0ICgpOwotCi0gICAgICAvKiBGb3IgYSBzd2l0Y2ggcmVsb2MsIHdlIHNldCByX29mZnNldCB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCi0gICAgICAgICB0aGUgcmVsb2MgYWRkcmVzcyBhbmQgdGhlIHN1YnRyYWhlbmQuICBXaGVuIHRoZSBsaW5rZXIgaXMKLSAgICAgICAgIGRvaW5nIHJlbGF4aW5nLCBpdCBjYW4gdXNlIHRoZSBkZXRlcm1pbmUgdGhlIHN0YXJ0aW5nIGFuZAotICAgICAgICAgZW5kaW5nIHBvaW50cyBvZiB0aGUgc3dpdGNoIGRpZmZlcmVuY2UgZXhwcmVzc2lvbi4gICovCi0gICAgICBpbnRyLT5yX29mZnNldCA9IGludHItPnJfdmFkZHIgLSBTX0dFVF9WQUxVRSAoZml4LT5meF9zdWJzeSk7Ci0gICAgfQotCi0gIC8qIFBDIHJlbGF0aXZlIHJlbG9jcyBhcmUgYWx3YXlzIGFnYWluc3QgdGhlIGN1cnJlbnQgc2VjdGlvbi4gICovCi0gIGlmIChzeW1ib2xfcHRyID09IE5VTEwpCi0gICAgewotICAgICAgc3dpdGNoIChmaXgtPmZ4X3JfdHlwZSkKLQl7Ci0JY2FzZSBCRkRfUkVMT0NfU0hfUENSRUxJTU04QlkyOgotCWNhc2UgQkZEX1JFTE9DX1NIX1BDUkVMSU1NOEJZNDoKLQljYXNlIEJGRF9SRUxPQ19TSF9QQ0RJU1A4QlkyOgotCWNhc2UgQkZEX1JFTE9DX1NIX1BDRElTUDEyQlkyOgotCWNhc2UgQkZEX1JFTE9DX1NIX1VTRVM6Ci0JICBzeW1ib2xfcHRyID0gc2VnLT5kb3Q7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX1VTRVMpCi0gICAgewotICAgICAgLyogV2UgY2FuJ3Qgc3RvcmUgdGhlIG9mZnNldCBpbiB0aGUgb2JqZWN0IGZpbGUsIHNpbmNlIHRoaXMKLQkgcmVsb2MgZG9lcyBub3QgdGFrZSB1cCBhbnkgc3BhY2UsIHNvIHdlIHN0b3JlIGl0IGluIHJfb2Zmc2V0LgotCSBUaGUgZnhfYWRkbnVtYmVyIGZpZWxkIHdhcyBzZXQgaW4gbWRfYXBwbHlfZml4LiAgKi8KLSAgICAgIGludHItPnJfb2Zmc2V0ID0gZml4LT5meF9hZGRudW1iZXI7Ci0gICAgfQotICBlbHNlIGlmIChmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQ09VTlQpCi0gICAgewotICAgICAgLyogV2UgY2FuJ3Qgc3RvcmUgdGhlIGNvdW50IGluIHRoZSBvYmplY3QgZmlsZSwgc2luY2UgdGhpcyByZWxvYwotICAgICAgICAgZG9lcyBub3QgdGFrZSB1cCBhbnkgc3BhY2UsIHNvIHdlIHN0b3JlIGl0IGluIHJfb2Zmc2V0LiAgVGhlCi0gICAgICAgICBmeF9vZmZzZXQgZmllbGQgd2FzIHNldCB3aGVuIHRoZSBmaXh1cCB3YXMgY3JlYXRlZCBpbgotICAgICAgICAgc2hfY29mZl9mcm9iX2ZpbGUuICAqLwotICAgICAgaW50ci0+cl9vZmZzZXQgPSBmaXgtPmZ4X29mZnNldDsKLSAgICAgIC8qIFRoaXMgcmVsb2MgaXMgYWx3YXlzIGFic29sdXRlLiAgKi8KLSAgICAgIHN5bWJvbF9wdHIgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0FMSUdOKQotICAgIHsKLSAgICAgIC8qIFN0b3JlIHRoZSBhbGlnbm1lbnQgaW4gdGhlIHJfb2Zmc2V0IGZpZWxkLiAgKi8KLSAgICAgIGludHItPnJfb2Zmc2V0ID0gZml4LT5meF9vZmZzZXQ7Ci0gICAgICAvKiBUaGlzIHJlbG9jIGlzIGFsd2F5cyBhYnNvbHV0ZS4gICovCi0gICAgICBzeW1ib2xfcHRyID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgaWYgKGZpeC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19TSF9DT0RFCi0JICAgfHwgZml4LT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1NIX0RBVEEKLQkgICB8fCBmaXgtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU0hfTEFCRUwpCi0gICAgewotICAgICAgLyogVGhlc2UgcmVsb2NzIGFyZSBhbHdheXMgYWJzb2x1dGUuICAqLwotICAgICAgc3ltYm9sX3B0ciA9IE5VTEw7Ci0gICAgfQotCi0gIC8qIFR1cm4gdGhlIHNlZ21lbnQgb2YgdGhlIHN5bWJvbCBpbnRvIGFuIG9mZnNldC4gICovCi0gIGlmIChzeW1ib2xfcHRyICE9IE5VTEwpCi0gICAgewotICAgICAgZG90ID0gc2VnbWVudF9pbmZvW1NfR0VUX1NFR01FTlQgKHN5bWJvbF9wdHIpXS5kb3Q7Ci0gICAgICBpZiAoZG90ICE9IE5VTEwpCi0JaW50ci0+cl9zeW1uZHggPSBkb3QtPnN5X251bWJlcjsKLSAgICAgIGVsc2UKLQlpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICBpbnRyLT5yX3N5bW5keCA9IC0xOwotfQotCi0jZW5kaWYgLyogT0JKX0NPRkYgKi8KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogQ3JlYXRlIGEgcmVsb2MuICAqLwotCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsKLQotICByZWwgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsLT5zeW1fcHRyX3B0ciA9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbC0+YWRkcmVzcyA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLQotICByX3R5cGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0KLSAgaWYgKFNXSVRDSF9UQUJMRSAoZml4cCkpCi0gICAgewotICAgICAgcmVsLT5hZGRlbmQgPSByZWwtPmFkZHJlc3MgLSBTX0dFVF9WQUxVRSAoZml4cC0+Znhfc3Vic3kpOwotICAgICAgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfMTYpCi0Jcl90eXBlID0gQkZEX1JFTE9DX1NIX1NXSVRDSDE2OwotICAgICAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ184KQotCXJfdHlwZSA9IEJGRF9SRUxPQ184X1BDUkVMOwotICAgICAgZWxzZSBpZiAocl90eXBlID09IEJGRF9SRUxPQ18zMikKLQlyX3R5cGUgPSBCRkRfUkVMT0NfU0hfU1dJVENIMzI7Ci0gICAgICBlbHNlCi0JYWJvcnQgKCk7Ci0gICAgfQotICBlbHNlIGlmIChyX3R5cGUgPT0gQkZEX1JFTE9DX1NIX1VTRVMpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQ09VTlQpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfU0hfQUxJR04pCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UgaWYgKHJfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgICAgICAgfHwgcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gIGVsc2UgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIHJlbC0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsLT5hZGRlbmQgPSAwOwotCi0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgcl90eXBlKTsKLSAgaWYgKHJlbC0+aG93dG8gPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICBfKCJDYW5ub3QgcmVwcmVzZW50IHJlbG9jYXRpb24gdHlwZSAlcyIpLAotCQkgICAgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKHJfdHlwZSkpOwotICAgICAgLyogU2V0IGhvd3RvIHRvIGEgZ2FyYmFnZSB2YWx1ZSBzbyB0aGF0IHdlIGNhbiBrZWVwIGdvaW5nLiAgKi8KLSAgICAgIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgQkZEX1JFTE9DXzMyKTsKLSAgICAgIGFzc2VydCAocmVsLT5ob3d0byAhPSBOVUxMKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHJlbDsKLX0KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc2guaCBiL2dhcy9jb25maWcvdGMtc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQyNzhjMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXNoLmgKLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX1NICi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX3NoCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBzZWdtZW50X2luZm9fc3RydWN0Owotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLS8qIFdoZXRoZXIgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLiAgKi8KLWV4dGVybiBpbnQgc2hsOwotCi0vKiBXaGV0aGVyIC1yZWxheCB3YXMgdXNlZC4gICovCi1leHRlcm4gaW50IHNoX3JlbGF4OwotCi0vKiBXaGV0aGVyIC1zbWFsbCB3YXMgdXNlZC4gICovCi1leHRlcm4gaW50IHNoX3NtYWxsOwotCi0vKiBEb24ndCB0cnkgdG8gYnJlYWsgd29yZHMuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLS8qIFdlIHJlcXVpcmUgLmxvbmcsIGV0LiBhbC4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5LiAgKi8KLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpIHNoX2NvbnNfYWxpZ24gKG5ieXRlcykKLWV4dGVybiB2b2lkIHNoX2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci0KLS8qIFdoZW4gcmVsYXhpbmcsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgcmVsb2NhdGlvbnMgZm9yIGFsaWdubWVudAotICAgZGlyZWN0aXZlcy4gICovCi0jZGVmaW5lIEhBTkRMRV9BTElHTihmcmFnKSBzaF9oYW5kbGVfYWxpZ24gKGZyYWcpCi1leHRlcm4gdm9pZCBzaF9oYW5kbGVfYWxpZ24gUEFSQU1TICgoZnJhZ1MgKikpOwotCi0vKiBXZSBuZWVkIHRvIGZvcmNlIG91dCBzb21lIHJlbG9jYXRpb25zIHdoZW4gcmVsYXhpbmcuICAqLwotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeCkgc2hfZm9yY2VfcmVsb2NhdGlvbiAoZml4KQotZXh0ZXJuIGludCBzaF9mb3JjZV9yZWxvY2F0aW9uICgpOwotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBvYmpfZml4X2FkanVzdGFibGUoZml4UCkgc2hfZml4X2FkanVzdGFibGUoZml4UCkKLXN0cnVjdCBmaXg7Ci1leHRlcm4gYm9vbGVhbiBzaF9maXhfYWRqdXN0YWJsZSBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNlbmRpZgotCi0jZGVmaW5lIElHTk9SRV9OT05TVEFOREFSRF9FU0NBUEVTCi0KLSNkZWZpbmUgTElTVElOR19IRUFERVIgKHNobCA/ICJIaXRhY2hpIFN1cGVyLUggR0FTIExpdHRsZSBFbmRpYW4iIDogIkhpdGFjaGkgU3VwZXItSCBHQVMgQmlnIEVuZGlhbiIpCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IHJlbGF4X3R5cGUgbWRfcmVsYXhfdGFibGVbXTsKLSNkZWZpbmUgVENfR0VORVJJQ19SRUxBWF9UQUJMRSBtZF9yZWxheF90YWJsZQotCi0vKiBXZSB1c2UgYSBzcGVjaWFsIGFsaWdubWVudCBmdW5jdGlvbiB0byBpbnNlcnQgdGhlIGNvcnJlY3Qgbm9wCi0gICBwYXR0ZXJuLiAgKi8KLWV4dGVybiBpbnQgc2hfZG9fYWxpZ24gUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci0jZGVmaW5lIG1kX2RvX2FsaWduKG4sZmlsbCxsZW4sbWF4LGwpIGlmIChzaF9kb19hbGlnbiAobixmaWxsLGxlbixtYXgpKSBnb3RvIGwKLQotLyogV2UgcmVjb3JkLCBmb3IgZWFjaCBzZWN0aW9uLCB3aGV0aGVyIHdlIGhhdmUgbW9zdCByZWNlbnRseSBvdXRwdXQgYQotICAgQ09ERSByZWxvYyBvciBhIERBVEEgcmVsb2MuICAqLwotc3RydWN0IHNoX3NlZ21lbnRfaW5mb190eXBlCi17Ci0gIGludCBpbl9jb2RlIDogMTsKLX07Ci0jZGVmaW5lIFRDX1NFR01FTlRfSU5GT19UWVBFIHN0cnVjdCBzaF9zZWdtZW50X2luZm9fdHlwZQotCi0vKiBXZSBjYWxsIGEgcm91dGluZSB0byBlbWl0IGEgcmVsb2MgZm9yIGEgbGFiZWwsIHNvIHRoYXQgdGhlIGxpbmtlcgotICAgY2FuIGFsaWduIGxvYWRzIGFuZCBzdG9yZXMgd2l0aG91dCBjcm9zc2luZyBhIGxhYmVsLiAgKi8KLWV4dGVybiB2b2lkIHNoX2Zyb2JfbGFiZWwgUEFSQU1TICgodm9pZCkpOwotI2RlZmluZSB0Y19mcm9iX2xhYmVsKHN5bSkgc2hfZnJvYl9sYWJlbCAoKQotCi0vKiBXZSBjYWxsIGEgcm91dGluZSB0byBmbHVzaCBwZW5kaW5nIG91dHB1dCBpbiBvcmRlciB0byBvdXRwdXQgYSBEQVRBCi0gICByZWxvYyB3aGVuIHJlcXVpcmVkLiAgKi8KLWV4dGVybiB2b2lkIHNoX2ZsdXNoX3BlbmRpbmdfb3V0cHV0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQoKSBzaF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCBzaF9mcm9iX2ZpbGUKLSNlbHNlCi0jZGVmaW5lIHRjX2Zyb2JfZmlsZSBzaF9mcm9iX2ZpbGUKLSNlbmRpZgotZXh0ZXJuIHZvaWQgc2hfZnJvYl9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLQotI2lmZGVmIE9CSl9DT0ZGCi0vKiBDT0ZGIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KLQotI2RlZmluZSBET19OT1RfU1RSSVAgMAotCi0vKiBUaGlzIG1hY3JvIHRyYW5zbGF0ZXMgYmV0d2VlbiBhbiBpbnRlcm5hbCBmaXggYW5kIGFuIGNvZmYgcmVsb2MgdHlwZSAqLwotI2RlZmluZSBUQ19DT0ZGX0ZJWDJSVFlQRShmaXgpICgoZml4KS0+Znhfcl90eXBlKQotCi0jZGVmaW5lIEJGRF9BUkNIIFRBUkdFVF9BUkNICi0KLSNkZWZpbmUgQ09GRl9NQUdJQyAoc2hsID8gU0hfQVJDSF9NQUdJQ19MSVRUTEUgOiBTSF9BUkNIX01BR0lDX0JJRykKLQotLyogV2UgbmVlZCB0byB3cml0ZSBvdXQgcmVsb2NzIHdoaWNoIGhhdmUgbm90IGJlZW4gY29tcGxldGVkLiAgKi8KLSNkZWZpbmUgVENfQ09VTlRfUkVMT0MoZml4KSAoKGZpeCktPmZ4X2FkZHN5ICE9IE5VTEwpCi0KLSNkZWZpbmUgVENfUkVMT0NfTUFOR0xFKHNlZywgZml4LCBpbnQsIHBhZGRyKSBcCi0gIHNoX2NvZmZfcmVsb2NfbWFuZ2xlICgoc2VnKSwgKGZpeCksIChpbnQpLCAocGFkZHIpKQotZXh0ZXJuIHZvaWQgc2hfY29mZl9yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IHNlZ21lbnRfaW5mb19zdHJ1Y3QgKiwgc3RydWN0IGZpeCAqLAotCSAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqLCB1bnNpZ25lZCBpbnQpKTsKLQotI2RlZmluZSB0Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2soYSkgOyAvKiBub3QgdXNlZCAqLwotCi0jZGVmaW5lIE5FRURfRlhfUl9UWVBFIDEKLQotI2RlZmluZSBUQ19LRUVQX0ZYX09GRlNFVCAxCi0KLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi1leHRlcm4gaW50IHRjX2NvZmZfc2l6ZW1hY2hkZXAgUEFSQU1TICgoZnJhZ1MgKikpOwotCi0vKiBXZSBhbGlnbiBtb3N0IHNlY3Rpb25zIHRvIGEgMTYgYnl0ZSBib3VuZGFyeS4gICovCi0jZGVmaW5lIFNVQl9TRUdNRU5UX0FMSUdOKFNFRykJCQkJCVwKLSAgKHN0cm5jbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIuc3RhYnN0ciIsIDgpID09IDAJCVwKLSAgID8gMAkJCQkJCQkJXAotICAgOiAoKHN0cm5jbXAgKG9ial9zZWdtZW50X25hbWUgKFNFRyksICIuc3RhYiIsIDUpID09IDAJXAotICAgICAgIHx8IHN0cmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5jdG9ycyIpID09IDAJXAotICAgICAgIHx8IHN0cmNtcCAob2JqX3NlZ21lbnRfbmFtZSAoU0VHKSwgIi5kdG9ycyIpID09IDApCVwKLSAgICAgID8gMgkJCQkJCQlcCi0gICAgICA6IChzaF9zbWFsbCA/IDIgOiA0KSkpCi0KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0jaWZkZWYgT0JKX0VMRgotLyogRUxGIHNwZWNpZmljIGRlZmluaXRpb25zLiAgKi8KLQotLyogV2hldGhlciBvciBub3QgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuICovCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgKHNobCA/ICJlbGYzMi1zaGwiIDogImVsZjMyLXNoIikKLQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLQotLyogZW5kIG9mIHRjLXNoLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtc3BhcmMuYyBiL2dhcy9jb25maWcvdGMtc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4Yzg5MC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXNwYXJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODM1ICswLDAgQEAKLS8qIHRjLXNwYXJjLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBTUEFSQwotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MC05NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUKLSAgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0KLSNpbmNsdWRlICJvcGNvZGUvc3BhcmMuaCIKLQotI2lmZGVmIE9CSl9FTEYKLSNpbmNsdWRlICJlbGYvc3BhcmMuaCIKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHNwYXJjX2FyY2ggKmxvb2t1cF9hcmNoIFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgaW5pdF9kZWZhdWx0X2FyY2ggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBzcGFyY19pcCBQQVJBTVMgKChjaGFyICosIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiopKTsKLXN0YXRpYyBpbnQgaW5fc2lnbmVkX3JhbmdlIFBBUkFNUyAoKGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGludCBpbl91bnNpZ25lZF9yYW5nZSBQQVJBTVMgKChiZmRfdm1hLCBiZmRfdm1hKSk7Ci1zdGF0aWMgaW50IGluX2JpdGZpZWxkX3JhbmdlIFBBUkFNUyAoKGJmZF9zaWduZWRfdm1hLCBiZmRfc2lnbmVkX3ZtYSkpOwotc3RhdGljIGludCBzcGFyY19mZnMgUEFSQU1TICgodW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBzeW50aGV0aXplX3NldHV3IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotc3RhdGljIHZvaWQgc3ludGhldGl6ZV9zZXRzdyBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICopKTsKLXN0YXRpYyB2b2lkIHN5bnRoZXRpemVfc2V0eCBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICopKTsKLXN0YXRpYyBiZmRfdm1hIEJTUiBQQVJBTVMgKChiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBpbnQgY21wX3JlZ19lbnRyeSBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGludCBwYXJzZV9rZXl3b3JkX2FyZyBQQVJBTVMgKChpbnQgKCopIChjb25zdCBjaGFyICopLCBjaGFyICoqLCBpbnQgKikpOwotc3RhdGljIGludCBwYXJzZV9jb25zdF9leHByX2FyZyBQQVJBTVMgKChjaGFyICoqLCBpbnQgKikpOwotc3RhdGljIGludCBnZXRfZXhwcmVzc2lvbiBQQVJBTVMgKChjaGFyICpzdHIpKTsKLQotLyogRGVmYXVsdCBhcmNoaXRlY3R1cmUuICAqLwotLyogPz8/IFRoZSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBWOCwgYnV0IHNwYXJjbGl0ZSBzdXBwb3J0IHdhcyBhZGRlZAotICAgYnkgbWFraW5nIGl0IHRoZSBkZWZhdWx0LiAgR0NDIG5vdyBwYXNzZXMgLUFzcGFyY2xpdGUsIHNvIG1heWJlIHNvbWV0aW1lIGluCi0gICB0aGUgZnV0dXJlIHdlIGNhbiBzZXQgdGhpcyB0byBWOC4gICovCi0jaWZuZGVmIERFRkFVTFRfQVJDSAotI2RlZmluZSBERUZBVUxUX0FSQ0ggInNwYXJjbGl0ZSIKLSNlbmRpZgotc3RhdGljIGNoYXIgKmRlZmF1bHRfYXJjaCA9IERFRkFVTFRfQVJDSDsKLQotLyogTm9uLXplcm8gaWYgdGhlIGluaXRpYWwgdmFsdWVzIG9mIGBtYXhfYXJjaGl0ZWN0dXJlJyBhbmQgYHNwYXJjX2FyY2hfc2l6ZScKLSAgIGhhdmUgYmVlbiBzZXQuICAqLwotc3RhdGljIGludCBkZWZhdWx0X2luaXRfcDsKLQotLyogQ3VycmVudCBhcmNoaXRlY3R1cmUuICBXZSBkb24ndCBidW1wIHVwIHVubGVzcyBuZWNlc3NhcnkuICAqLwotc3RhdGljIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsIGN1cnJlbnRfYXJjaGl0ZWN0dXJlID0gU1BBUkNfT1BDT0RFX0FSQ0hfVjY7Ci0KLS8qIFRoZSBtYXhpbXVtIGFyY2hpdGVjdHVyZSBsZXZlbCB3ZSBjYW4gYnVtcCB1cCB0by4KLSAgIEluIGEgMzIgYml0IGVudmlyb25tZW50LCBkb24ndCBhbGxvdyBidW1waW5nIHVwIHRvIHY5IGJ5IGRlZmF1bHQuCi0gICBUaGUgbmF0aXZlIGFzc2VtYmxlciB3b3JrcyB0aGlzIHdheS4gIFRoZSB1c2VyIGlzIHJlcXVpcmVkIHRvIHBhc3MKLSAgIGFuIGV4cGxpY2l0IGFyZ3VtZW50IGJlZm9yZSB3ZSdsbCBjcmVhdGUgdjkgb2JqZWN0IGZpbGVzLiAgSG93ZXZlciwgaWYKLSAgIHdlIGRvbid0IHNlZSBhbnkgdjkgaW5zbnMsIGEgdjhwbHVzIG9iamVjdCBmaWxlIGlzIG5vdCBjcmVhdGVkLiAgKi8KLXN0YXRpYyBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBtYXhfYXJjaGl0ZWN0dXJlOwotCi0vKiBFaXRoZXIgMzIgb3IgNjQsIHNlbGVjdHMgZmlsZSBmb3JtYXQuICAqLwotc3RhdGljIGludCBzcGFyY19hcmNoX3NpemU7Ci0vKiBJbml0aWFsIChkZWZhdWx0KSB2YWx1ZSwgcmVjb3JkZWQgc2VwYXJhdGVseSBpbiBjYXNlIGEgdXNlciBvcHRpb24KLSAgIGNoYW5nZXMgdGhlIHZhbHVlIGJlZm9yZSBtZF9zaG93X3VzYWdlIGlzIGNhbGxlZC4gICovCi1zdGF0aWMgaW50IGRlZmF1bHRfYXJjaF9zaXplOwotCi0jaWZkZWYgT0JKX0VMRgotLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCB2OSBtZW1vcnkgbW9kZWwuICBDdXJyZW50bHkgb25seSB1c2VkIGZvcgotICAgRUxGLiAgKi8KLXN0YXRpYyBlbnVtIHsgTU1fVFNPLCBNTV9QU08sIE1NX1JNTyB9IHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1JNTzsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGFyY2hpdGVjdHVyZV9yZXF1ZXN0ZWQ7Ci1zdGF0aWMgaW50IHdhcm5fb25fYnVtcDsKLQotLyogSWYgd2Fybl9vbl9idW1wIGFuZCB0aGUgbmVlZGVkIGFyY2hpdGVjdHVyZSBpcyBoaWdoZXIgdGhhbiB0aGlzCi0gICBhcmNoaXRlY3R1cmUsIGlzc3VlIGEgd2FybmluZy4gICovCi1zdGF0aWMgZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmU7Ci0KLS8qIE5vbi16ZXJvIGlmIHdlIGFyZSBnZW5lcmF0aW5nIFBJQyBjb2RlLiAgKi8KLWludCBzcGFyY19waWNfY29kZTsKLQotLyogTm9uLXplcm8gaWYgd2Ugc2hvdWxkIGdpdmUgYW4gZXJyb3Igd2hlbiBtaXNhbGlnbmVkIGRhdGEgaXMgc2Vlbi4gICovCi1zdGF0aWMgaW50IGVuZm9yY2VfYWxpZ25lZF9kYXRhOwotCi1leHRlcm4gaW50IHRhcmdldF9iaWdfZW5kaWFuOwotCi1zdGF0aWMgaW50IHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGE7Ci0KLS8qIFY5IGFuZCA4NnggaGF2ZSBiaWcgYW5kIGxpdHRsZSBlbmRpYW4gZGF0YSwgYnV0IGluc3RydWN0aW9ucyBhcmUgYWx3YXlzIGJpZwotICAgZW5kaWFuLiAgVGhlIHNwYXJjbGV0IGhhcyBiaS1lbmRpYW4gc3VwcG9ydCBidXQgYm90aCBkYXRhIGFuZCBpbnNucyBoYXZlCi0gICB0aGUgc2FtZSBlbmRpYW5uZXNzLiAgR2xvYmFsIGB0YXJnZXRfYmlnX2VuZGlhbicgaXMgdXNlZCBmb3IgZGF0YS4KLSAgIFRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgdXNlZCBmb3IgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNpZm5kZWYgSU5TTl9CSUdfRU5ESUFOCi0jZGVmaW5lIElOU05fQklHX0VORElBTiAodGFyZ2V0X2JpZ19lbmRpYW4gXAotCQkJIHx8IGRlZmF1bHRfYXJjaF90eXBlID09IHNwYXJjODZ4IFwKLQkJCSB8fCBTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLSNlbmRpZgotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLQotc3RhdGljIGludCBsb2cyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19kYXRhMSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzX3NlZyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfcHJvYyBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfcmVzZXJ2ZSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfY29tbW9uIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19lbXB0eSBQQVJBTVMgKChpbnQpKTsKLXN0YXRpYyB2b2lkIHNfdWFjb25zIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgc19uY29ucyBQQVJBTVMgKChpbnQpKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJhbGlnbiIsIHNfYWxpZ25fYnl0ZXMsIDB9LAkvKiBEZWZhdWx0aW5nIGlzIGludmFsaWQgKDApICovCi0gIHsiY29tbW9uIiwgc19jb21tb24sIDB9LAotICB7ImVtcHR5Iiwgc19lbXB0eSwgMH0sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiaGFsZiIsIGNvbnMsIDJ9LAotICB7Im53b3JkIiwgc19uY29ucywgMH0sCi0gIHsib3B0aW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsicHJvYyIsIHNfcHJvYywgMH0sCi0gIHsicmVzZXJ2ZSIsIHNfcmVzZXJ2ZSwgMH0sCi0gIHsic2VnIiwgc19zZWcsIDB9LAotICB7InNraXAiLCBzX3NwYWNlLCAwfSwKLSAgeyJ3b3JkIiwgY29ucywgNH0sCi0gIHsieHdvcmQiLCBjb25zLCA4fSwKLSAgeyJ1YWhhbGYiLCBzX3VhY29ucywgMn0sCi0gIHsidWF3b3JkIiwgc191YWNvbnMsIDR9LAotICB7InVheHdvcmQiLCBzX3VhY29ucywgOH0sCi0jaWZkZWYgT0JKX0VMRgotICAvKiB0aGVzZSBhcmUgc3BlY2lmaWMgdG8gc3BhcmMvc3ZyNCAqLwotICB7IjJieXRlIiwgc191YWNvbnMsIDJ9LAotICB7IjRieXRlIiwgc191YWNvbnMsIDR9LAotICB7IjhieXRlIiwgc191YWNvbnMsIDh9LAotI2VuZGlmCi0gIHtOVUxMLCAwLCAwfSwKLX07Ci0KLWNvbnN0IGludCBtZF9yZWxvY19zaXplID0gMTI7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAgSWYgdGhlCi0gICBwcmUtcHJvY2Vzc29yIGlzIGRpc2FibGVkLCB0aGVzZSBhcmVuJ3QgdmVyeSB1c2VmdWwgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEiOwkvKiBKRiByZW1vdmVkICd8JyBmcm9tIGNvbW1lbnRfY2hhcnMgKi8KLQotLyogVGhpcyBhcnJheSBob2xkcyB0aGUgY2hhcnMgdGhhdCBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mCi0gICBhIGxpbmUuICBJZiB0aGUgbGluZSBzZWVtcyB0byBoYXZlIHRoZSBmb3JtICcjIDEyMyBmaWxlbmFtZScKLSAgIC5saW5lIGFuZCAuZmlsZSBkaXJlY3RpdmVzIHdpbGwgYXBwZWFyIGluIHRoZSBwcmUtcHJvY2Vzc2VkIG91dHB1dCAqLwotLyogTm90ZSB0aGF0IGlucHV0X2ZpbGUuYyBoYW5kIGNoZWNrcyBmb3IgJyMnIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICBmaXJzdCBsaW5lIG9mIHRoZSBpbnB1dCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBjb21waWxlciBvdXRwdXRzCi0gICAjTk9fQVBQIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXRzIG91dHB1dC4gKi8KLS8qIEFsc28gbm90ZSB0aGF0IGNvbW1lbnRzIHN0YXJ0ZWQgbGlrZSB0aGlzIG9uZSB3aWxsIGFsd2F5cwotICAgd29yayBpZiAnLycgaXNuJ3Qgb3RoZXJ3aXNlIGRlZmluZWQuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogQXMgaW4gMGYxMi40NTYgKi8KLS8qIG9yICAgIDBkMS4yMzQ1ZTEyICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gInJSc1NmRmREeFhwUCI7Ci0KLS8qIEFsc28gYmUgYXdhcmUgdGhhdCBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgbWF5IGhhdmUgdG8gYmUKLSAgIGNoYW5nZWQgaW4gcmVhZC5jLiAgSWRlYWxseSBpdCBzaG91bGRuJ3QgaGF2ZSB0byBrbm93IGFib3V0IGl0IGF0IGFsbCwKLSAgIGJ1dCBub3RoaW5nIGlzIGlkZWFsIGFyb3VuZCBoZXJlLiAgKi8KLQotI2RlZmluZSBpc29jdGFsKGMpICAoKHVuc2lnbmVkKSgoYykgLSAnMCcpIDwgJzgnKQotCi1zdHJ1Y3Qgc3BhcmNfaXQKLSAgewotICAgIGNoYXIgKmVycm9yOwotICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICAgIHN0cnVjdCBubGlzdCAqbmxpc3RwOwotICAgIGV4cHJlc3Npb25TIGV4cDsKLSAgICBleHByZXNzaW9uUyBleHAyOwotICAgIGludCBwY3JlbDsKLSAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gIH07Ci0KLXN0cnVjdCBzcGFyY19pdCB0aGVfaW5zbiwgc2V0X2luc247Ci0KLXN0YXRpYyB2b2lkIG91dHB1dF9pbnNuCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKiwgc3RydWN0IHNwYXJjX2l0ICopKTsKLQwKLS8qIFRhYmxlIG9mIGFyZ3VtZW50cyB0byAtQS4KLSAgIFRoZSBzcGFyY19vcGNvZGVfYXJjaCB0YWJsZSBpbiBzcGFyYy1vcGMuYyBpcyBpbnN1ZmZpY2llbnQgYW5kIGluY29ycmVjdAotICAgZm9yIHRoaXMgdXNlLiAgVGhhdCB0YWJsZSBpcyBmb3Igb3Bjb2RlcyBvbmx5LiAgVGhpcyB0YWJsZSBpcyBmb3Igb3Bjb2RlcwotICAgYW5kIGZpbGUgZm9ybWF0cy4gICovCi0KLWVudW0gc3BhcmNfYXJjaF90eXBlcyB7djYsIHY3LCB2OCwgc3BhcmNsZXQsIHNwYXJjbGl0ZSwgc3BhcmM4NngsIHY4cGx1cywKLQkJICAgICAgIHY4cGx1c2EsIHY5LCB2OWEsIHY5XzY0fTsKLQotc3RhdGljIHN0cnVjdCBzcGFyY19hcmNoIHsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqb3Bjb2RlX2FyY2g7Ci0gIGVudW0gc3BhcmNfYXJjaF90eXBlcyBhcmNoX3R5cGU7Ci0gIC8qIERlZmF1bHQgd29yZCBzaXplLCBhcyBzcGVjaWZpZWQgZHVyaW5nIGNvbmZpZ3VyYXRpb24uCi0gICAgIEEgdmFsdWUgb2YgemVybyBtZWFucyBjYW4ndCBiZSB1c2VkIHRvIHNwZWNpZnkgZGVmYXVsdCBhcmNoaXRlY3R1cmUuICAqLwotICBpbnQgZGVmYXVsdF9hcmNoX3NpemU7Ci0gIC8qIEFsbG93YWJsZSBhcmcgdG8gLUE/ICAqLwotICBpbnQgdXNlcl9vcHRpb25fcDsKLX0gc3BhcmNfYXJjaF90YWJsZVtdID0gewotICB7ICJ2NiIsICJ2NiIsIHY2LCAwLCAxIH0sCi0gIHsgInY3IiwgInY3IiwgdjcsIDAsIDEgfSwKLSAgeyAidjgiLCAidjgiLCB2OCwgMzIsIDEgfSwKLSAgeyAic3BhcmNsZXQiLCAic3BhcmNsZXQiLCBzcGFyY2xldCwgMzIsIDEgfSwKLSAgeyAic3BhcmNsaXRlIiwgInNwYXJjbGl0ZSIsIHNwYXJjbGl0ZSwgMzIsIDEgfSwKLSAgeyAic3BhcmM4NngiLCAic3BhcmNsaXRlIiwgc3BhcmM4NngsIDMyLCAxIH0sCi0gIHsgInY4cGx1cyIsICJ2OSIsIHY5LCAwLCAxIH0sCi0gIHsgInY4cGx1c2EiLCAidjlhIiwgdjksIDAsIDEgfSwKLSAgeyAidjkiLCAidjkiLCB2OSwgMCwgMSB9LAotICB7ICJ2OWEiLCAidjlhIiwgdjksIDAsIDEgfSwKLSAgLyogVGhpcyBleGlzdHMgdG8gYWxsb3cgY29uZmlndXJlLmluL01ha2VmaWxlLmluIHRvIHBhc3Mgb25lCi0gICAgIHZhbHVlIHRvIHNwZWNpZnkgYm90aCB0aGUgZGVmYXVsdCBtYWNoaW5lIGFuZCBkZWZhdWx0IHdvcmQgc2l6ZS4gICovCi0gIHsgInY5LTY0IiwgInY5IiwgdjksIDY0LCAwIH0sCi0gIHsgTlVMTCwgTlVMTCwgdjgsIDAsIDAgfQotfTsKLQotLyogVmFyaWFudCBvZiBkZWZhdWx0X2FyY2ggKi8KLXN0YXRpYyBlbnVtIHNwYXJjX2FyY2hfdHlwZXMgZGVmYXVsdF9hcmNoX3R5cGU7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BhcmNfYXJjaCAqCi1sb29rdXBfYXJjaCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IHNwYXJjX2FyY2ggKnNhOwotCi0gIGZvciAoc2EgPSAmc3BhcmNfYXJjaF90YWJsZVswXTsgc2EtPm5hbWUgIT0gTlVMTDsgc2ErKykKLSAgICBpZiAoc3RyY21wIChzYS0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIGJyZWFrOwotICBpZiAoc2EtPm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLSAgcmV0dXJuIHNhOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IG9wY29kZSBhcmNoIGFuZCB3b3JkIHNpemUgZnJvbSB0aGUgZGVmYXVsdAotICAgYXJjaGl0ZWN0dXJlIG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF9kZWZhdWx0X2FyY2ggKCkKLXsKLSAgc3RydWN0IHNwYXJjX2FyY2ggKnNhID0gbG9va3VwX2FyY2ggKGRlZmF1bHRfYXJjaCk7Ci0KLSAgaWYgKHNhID09IE5VTEwKLSAgICAgIHx8IHNhLT5kZWZhdWx0X2FyY2hfc2l6ZSA9PSAwKQotICAgIGFzX2ZhdGFsIChfKCJJbnZhbGlkIGRlZmF1bHQgYXJjaGl0ZWN0dXJlLCBicm9rZW4gYXNzZW1ibGVyLiIpKTsKLQotICBtYXhfYXJjaGl0ZWN0dXJlID0gc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoIChzYS0+b3Bjb2RlX2FyY2gpOwotICBpZiAobWF4X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9CQUQpCi0gICAgYXNfZmF0YWwgKF8oIkJhZCBvcGNvZGUgdGFibGUsIGJyb2tlbiBhc3NlbWJsZXIuIikpOwotICBkZWZhdWx0X2FyY2hfc2l6ZSA9IHNwYXJjX2FyY2hfc2l6ZSA9IHNhLT5kZWZhdWx0X2FyY2hfc2l6ZTsKLSAgZGVmYXVsdF9pbml0X3AgPSAxOwotICBkZWZhdWx0X2FyY2hfdHlwZSA9IHNhLT5hcmNoX3R5cGU7Ci19Ci0KLS8qIENhbGxlZCBieSBUQVJHRVRfRk9STUFULiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY190YXJnZXRfZm9ybWF0ICgpCi17Ci0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSB3ZSdyZSBjYWxsZWQsCi0gICAgIHNvIGhhbmRsZSB0aGF0IG5vdy4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0jaWZkZWYgT0JKX0FPVVQKLSNpZmRlZiBURV9OZXRCU0QKLSAgcmV0dXJuICJhLm91dC1zcGFyYy1uZXRic2QiOwotI2Vsc2UKLSNpZmRlZiBURV9TUEFSQ0FPVVQKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIHJldHVybiAiYS5vdXQtc3Vub3MtYmlnIjsKLSAgZWxzZSBpZiAoZGVmYXVsdF9hcmNoX3R5cGUgPT0gc3BhcmM4NnggJiYgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSkKLSAgICByZXR1cm4gImEub3V0LXN1bm9zLWJpZyI7Ci0gIGVsc2UgcmV0dXJuICJhLm91dC1zcGFyYy1saXR0bGUiOwotI2Vsc2UKLSAgcmV0dXJuICJhLm91dC1zdW5vcy1iaWciOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0JPVVQKLSAgcmV0dXJuICJiLm91dC5iaWciOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQ09GRgotI2lmZGVmIFRFX0xZTlgKLSAgcmV0dXJuICJjb2ZmLXNwYXJjLWx5bngiOwotI2Vsc2UKLSAgcmV0dXJuICJjb2ZmLXNwYXJjIjsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0gIHJldHVybiBzcGFyY19hcmNoX3NpemUgPT0gNjQgPyAiZWxmNjQtc3BhcmMiIDogImVsZjMyLXNwYXJjIjsKLSNlbmRpZgotCi0gIGFib3J0ICgpOwotfQotDAotLyoKLSAqIG1kX3BhcnNlX29wdGlvbgotICoJSW52b2NhdGlvbiBsaW5lIGluY2x1ZGVzIGEgc3dpdGNoIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBiYXNlIGFzc2VtYmxlci4KLSAqCVNlZSBpZiBpdCdzIGEgcHJvY2Vzc29yLXNwZWNpZmljIG9wdGlvbi4gIFRoZXNlIGFyZToKLSAqCi0gKgktYnVtcAotICoJCVdhcm4gb24gYXJjaGl0ZWN0dXJlIGJ1bXBzLiAgU2VlIGFsc28gLUEuCi0gKgotICoJLUF2NiwgLUF2NywgLUF2OCwgLUFzcGFyY2xpdGUsIC1Bc3BhcmNsZXQKLSAqCQlTdGFuZGFyZCAzMiBiaXQgYXJjaGl0ZWN0dXJlcy4KLSAqCS1BdjhwbHVzLCAtQXY4cGx1c2EKLSAqCQlTcGFyYzY0IGluIGEgMzIgYml0IHdvcmxkLgotICoJLUF2OSwgLUF2OWEKLSAqCQlTcGFyYzY0IGluIGVpdGhlciBhIDMyIG9yIDY0IGJpdCB3b3JsZCAoLTMyLy02NCBzYXlzIHdoaWNoKS4KLSAqCQlUaGlzIHVzZWQgdG8gb25seSBtZWFuIDY0IGJpdHMsIGJ1dCBwcm9wZXJseSBzcGVjaWZ5aW5nIGl0Ci0gKgkJY29tcGxpY2F0ZWQgZ2NjJ3MgQVNNX1NQRUNzLCBzbyBub3cgb3Bjb2RlIHNlbGVjdGlvbiBpcwotICoJCXNwZWNpZmllZCBvcnRob2dvbmFsbHkgdG8gd29yZCBzaXplIChleGNlcHQgd2hlbiBzcGVjaWZ5aW5nCi0gKgkJdGhlIGRlZmF1bHQsIGJ1dCB0aGF0IGlzIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCkuCi0gKgkteGFyY2g9djhwbHVzLCAteGFyY2g9djhwbHVzYQotICoJCVNhbWUgYXMgLUF2OHBsdXN7LGF9LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFN1bidzIGFzc2VtYmxlci4KLSAqCi0gKgkJU2VsZWN0IHRoZSBhcmNoaXRlY3R1cmUgYW5kIHBvc3NpYmx5IHRoZSBmaWxlIGZvcm1hdC4KLSAqCQlJbnN0cnVjdGlvbnMgb3IgZmVhdHVyZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQKLSAqCQlhcmNoaXRlY3R1cmUgY2F1c2UgZmF0YWwgZXJyb3JzLgotICoKLSAqCQlUaGUgZGVmYXVsdCBpcyB0byBzdGFydCBhdCB2NiwgYW5kIGJ1bXAgdGhlIGFyY2hpdGVjdHVyZSB1cAotICoJCXdoZW5ldmVyIGFuIGluc3RydWN0aW9uIGlzIHNlZW4gYXQgYSBoaWdoZXIgbGV2ZWwuICBJbiAzMiBiaXQKLSAqCQllbnZpcm9ubWVudHMsIHY5IGlzIG5vdCBidW1wZWQgdXAgdG8sIHRoZSB1c2VyIG11c3QgcGFzcwotICogCQktQXY4cGx1c3ssYX0uCi0gKgotICoJCUlmIC1idW1wIGlzIHNwZWNpZmllZCwgYSB3YXJuaW5nIGlzIHByaW50aW5nIHdoZW4gYnVtcGluZyB0bwotICoJCWhpZ2hlciBsZXZlbHMuCi0gKgotICoJCUlmIGFuIGFyY2hpdGVjdHVyZSBpcyBzcGVjaWZpZWQsIGFsbCBpbnN0cnVjdGlvbnMgbXVzdCBtYXRjaAotICoJCXRoYXQgYXJjaGl0ZWN0dXJlLiAgQW55IGhpZ2hlciBsZXZlbCBpbnN0cnVjdGlvbnMgYXJlIGZsYWdnZWQKLSAqCQlhcyBlcnJvcnMuICBOb3RlIHRoYXQgaW4gdGhlIDMyIGJpdCBlbnZpcm9ubWVudCBzcGVjaWZ5aW5nCi0gKgkJLUF2OHBsdXMgZG9lcyBub3QgYXV0b21hdGljYWxseSBjcmVhdGUgYSB2OHBsdXMgb2JqZWN0IGZpbGUsIGEKLSAqCQl2OSBpbnNuIG11c3QgYmUgc2Vlbi4KLSAqCi0gKgkJSWYgYm90aCBhbiBhcmNoaXRlY3R1cmUgYW5kIC1idW1wIGFyZSBzcGVjaWZpZWQsIHRoZQotICoJCWFyY2hpdGVjdHVyZSBzdGFydHMgYXQgdGhlIHNwZWNpZmllZCBsZXZlbCwgYnV0IGJ1bXBzIGFyZQotICoJCXdhcm5pbmdzLiAgTm90ZSB0aGF0IHdlIGNhbid0IHNldCBgY3VycmVudF9hcmNoaXRlY3R1cmUnIHRvCi0gKgkJdGhlIHJlcXVlc3RlZCBsZXZlbCBpbiB0aGlzIGNhc2U6IGluIHRoZSAzMiBiaXQgZW52aXJvbm1lbnQsCi0gKgkJd2Ugc3RpbGwgbXVzdCBhdm9pZCBjcmVhdGluZyB2OHBsdXMgb2JqZWN0IGZpbGVzIHVubGVzcyB2OQotICogCQlpbnNucyBhcmUgc2Vlbi4KLSAqCi0gKiBOb3RlOgotICoJCUJ1bXBpbmcgYmV0d2VlbiBpbmNvbXBhdGlibGUgYXJjaGl0ZWN0dXJlcyBpcyBhbHdheXMgYW4KLSAqCQllcnJvci4gIEZvciBleGFtcGxlLCBmcm9tIHNwYXJjbGl0ZSB0byB2OS4KLSAqLwotCi0jaWZkZWYgT0JKX0VMRgotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gIkE6SzpWUTpzcSI7Ci0jZWxzZQotI2lmZGVmIE9CSl9BT1VUCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQTprIjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiQToiOwotI2VuZGlmCi0jZW5kaWYKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSNkZWZpbmUgT1BUSU9OX0JVTVAgKE9QVElPTl9NRF9CQVNFKQotICB7ImJ1bXAiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JVTVB9LAotI2RlZmluZSBPUFRJT05fU1BBUkMgKE9QVElPTl9NRF9CQVNFICsgMSkKLSAgeyJzcGFyYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1BBUkN9LAotI2RlZmluZSBPUFRJT05fWEFSQ0ggKE9QVElPTl9NRF9CQVNFICsgMikKLSAgeyJ4YXJjaCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fWEFSQ0h9LAotI2lmZGVmIE9CSl9FTEYKLSNkZWZpbmUgT1BUSU9OXzMyIChPUFRJT05fTURfQkFTRSArIDMpCi0gIHsiMzIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzMyfSwKLSNkZWZpbmUgT1BUSU9OXzY0IChPUFRJT05fTURfQkFTRSArIDQpCi0gIHsiNjQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OXzY0fSwKLSNkZWZpbmUgT1BUSU9OX1RTTyAoT1BUSU9OX01EX0JBU0UgKyA1KQotICB7IlRTTyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFNPfSwKLSNkZWZpbmUgT1BUSU9OX1BTTyAoT1BUSU9OX01EX0JBU0UgKyA2KQotICB7IlBTTyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFNPfSwKLSNkZWZpbmUgT1BUSU9OX1JNTyAoT1BUSU9OX01EX0JBU0UgKyA3KQotICB7IlJNTyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUk1PfSwKLSNlbmRpZgotI2lmZGVmIFNQQVJDX0JJRU5ESUFOCi0jZGVmaW5lIE9QVElPTl9MSVRUTEVfRU5ESUFOIChPUFRJT05fTURfQkFTRSArIDgpCi0gIHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRV9FTkRJQU59LAotI2RlZmluZSBPUFRJT05fQklHX0VORElBTiAoT1BUSU9OX01EX0JBU0UgKyA5KQotICB7IkVCIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CSUdfRU5ESUFOfSwKLSNlbmRpZgotI2RlZmluZSBPUFRJT05fRU5GT1JDRV9BTElHTkVEX0RBVEEgKE9QVElPTl9NRF9CQVNFICsgMTApCi0gIHsiZW5mb3JjZS1hbGlnbmVkLWRhdGEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VORk9SQ0VfQUxJR05FRF9EQVRBfSwKLSNkZWZpbmUgT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQSAoT1BUSU9OX01EX0JBU0UgKyAxMSkKLSAgeyJsaXR0bGUtZW5kaWFuLWRhdGEiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQX0sCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSB3ZSdyZSBjYWxsZWQsCi0gICAgIHNvIGhhbmRsZSB0aGF0IG5vdy4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSBPUFRJT05fQlVNUDoKLSAgICAgIHdhcm5fb25fYnVtcCA9IDE7Ci0gICAgICB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSA9IFNQQVJDX09QQ09ERV9BUkNIX1Y2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9YQVJDSDoKLSAgICAgIC8qIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBTdW4ncyBhc3NlbWJsZXIuICAqLwotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAidjhwbHVzIikgIT0gMAotCSAgJiYgc3RyY21wIChhcmcsICJ2OHBsdXNhIikgIT0gMCkKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC14YXJjaD0lcyIpLCBhcmcpOwotCSAgcmV0dXJuIDA7Ci0JfQotCi0gICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgIGNhc2UgJ0EnOgotICAgICAgewotCXN0cnVjdCBzcGFyY19hcmNoICpzYTsKLQllbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBvcGNvZGVfYXJjaDsKLQotCXNhID0gbG9va3VwX2FyY2ggKGFyZyk7Ci0JaWYgKHNhID09IE5VTEwKLQkgICAgfHwgISBzYS0+dXNlcl9vcHRpb25fcCkKLQkgIHsKLQkgICAgYXNfYmFkIChfKCJpbnZhbGlkIGFyY2hpdGVjdHVyZSAtQSVzIiksIGFyZyk7Ci0JICAgIHJldHVybiAwOwotCSAgfQotCi0Jb3Bjb2RlX2FyY2ggPSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKHNhLT5vcGNvZGVfYXJjaCk7Ci0JaWYgKG9wY29kZV9hcmNoID09IFNQQVJDX09QQ09ERV9BUkNIX0JBRCkKLQkgIGFzX2ZhdGFsIChfKCJCYWQgb3Bjb2RlIHRhYmxlLCBicm9rZW4gYXNzZW1ibGVyLiIpKTsKLQotCW1heF9hcmNoaXRlY3R1cmUgPSBvcGNvZGVfYXJjaDsKLQlhcmNoaXRlY3R1cmVfcmVxdWVzdGVkID0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU1BBUkM6Ci0gICAgICAvKiBJZ25vcmUgLXNwYXJjLCB1c2VkIGJ5IFN1bk9TIG1ha2UgZGVmYXVsdCAucy5vIHJ1bGUuICAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FTkZPUkNFX0FMSUdORURfREFUQToKLSAgICAgIGVuZm9yY2VfYWxpZ25lZF9kYXRhID0gMTsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSAgICBjYXNlIE9QVElPTl9MSVRUTEVfRU5ESUFOOgotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgaWYgKGRlZmF1bHRfYXJjaF90eXBlICE9IHNwYXJjbGV0KQotCWFzX2ZhdGFsICgiVGhpcyB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCAtRUwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0xJVFRMRV9FTkRJQU5fREFUQToKLSAgICAgIHRhcmdldF9saXR0bGVfZW5kaWFuX2RhdGEgPSAxOwotICAgICAgdGFyZ2V0X2JpZ19lbmRpYW4gPSAwOwotICAgICAgaWYgKGRlZmF1bHRfYXJjaF90eXBlICE9IHNwYXJjODZ4Ci0JICAmJiBkZWZhdWx0X2FyY2hfdHlwZSAhPSB2OSkKLQlhc19mYXRhbCAoIlRoaXMgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgLS1saXR0bGUtZW5kaWFuLWRhdGEiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0JJR19FTkRJQU46Ci0gICAgICB0YXJnZXRfYmlnX2VuZGlhbiA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0FPVVQKLSAgICBjYXNlICdrJzoKLSAgICAgIHNwYXJjX3BpY19jb2RlID0gMTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNpZmRlZiBPQkpfRUxGCi0gICAgY2FzZSBPUFRJT05fMzI6Ci0gICAgY2FzZSBPUFRJT05fNjQ6Ci0gICAgICB7Ci0JY29uc3QgY2hhciAqKmxpc3QsICoqbDsKLQotCXNwYXJjX2FyY2hfc2l6ZSA9IGMgPT0gT1BUSU9OXzMyID8gMzIgOiA2NDsKLQlsaXN0ID0gYmZkX3RhcmdldF9saXN0ICgpOwotCWZvciAobCA9IGxpc3Q7ICpsICE9IE5VTEw7IGwrKykKLQkgIHsKLQkgICAgaWYgKHNwYXJjX2FyY2hfc2l6ZSA9PSAzMikKLQkgICAgICB7Ci0JCWlmIChzdHJjbXAgKCpsLCAiZWxmMzItc3BhcmMiKSA9PSAwKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKHN0cmNtcCAoKmwsICJlbGY2NC1zcGFyYyIpID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCWlmICgqbCA9PSBOVUxMKQotCSAgYXNfZmF0YWwgKF8oIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yICVkIGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiKSwKLQkJICAgIHNwYXJjX2FyY2hfc2l6ZSk7Ci0JZnJlZSAobGlzdCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1RTTzoKLSAgICAgIHNwYXJjX21lbW9yeV9tb2RlbCA9IE1NX1RTTzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFNPOgotICAgICAgc3BhcmNfbWVtb3J5X21vZGVsID0gTU1fUFNPOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9STU86Ci0gICAgICBzcGFyY19tZW1vcnlfbW9kZWwgPSBNTV9STU87Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgcHJpbnRfdmVyc2lvbl9pZCAoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUSc6Ci0gICAgICAvKiBReSAtIGRvIGVtaXQgLmNvbW1lbnQKLQkgUW4gLSBkbyBub3QgZW1pdCAuY29tbWVudCAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdzJzoKLSAgICAgIC8qIHVzZSAuc3RhYiBpbnN0ZWFkIG9mIC5zdGFiLmV4Y2wgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncSc6Ci0gICAgICAvKiBxdWljayAtLSBuYXRpdmUgYXNzZW1ibGVyIGRvZXMgZmV3ZXIgY2hlY2tzICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0snOgotICAgICAgaWYgKHN0cmNtcCAoYXJnLCAiUElDIikgIT0gMCkKLQlhc193YXJuIChfKCJVbnJlY29nbml6ZWQgb3B0aW9uIGZvbGxvd2luZyAtSyIpKTsKLSAgICAgIGVsc2UKLQlzcGFyY19waWNfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGNvbnN0IHN0cnVjdCBzcGFyY19hcmNoICphcmNoOwotCi0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSB3ZSdyZSBjYWxsZWQsCi0gICAgIHNvIGhhbmRsZSB0aGF0IG5vdy4gICovCi0gIGlmICghIGRlZmF1bHRfaW5pdF9wKQotICAgIGluaXRfZGVmYXVsdF9hcmNoICgpOwotCi0gIGZwcmludGYoc3RyZWFtLCBfKCJTUEFSQyBvcHRpb25zOlxuIikpOwotICBmb3IgKGFyY2ggPSAmc3BhcmNfYXJjaF90YWJsZVswXTsgYXJjaC0+bmFtZTsgYXJjaCsrKQotICAgIHsKLSAgICAgIGlmIChhcmNoICE9ICZzcGFyY19hcmNoX3RhYmxlWzBdKQotCWZwcmludGYgKHN0cmVhbSwgIiB8ICIpOwotICAgICAgaWYgKGFyY2gtPnVzZXJfb3B0aW9uX3ApCi0JZnByaW50ZiAoc3RyZWFtLCAiLUElcyIsIGFyY2gtPm5hbWUpOwotICAgIH0KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcbi14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLQkJCXNwZWNpZnkgdmFyaWFudCBvZiBTUEFSQyBhcmNoaXRlY3R1cmVcblwKLS1idW1wCQkJd2FybiB3aGVuIGFzc2VtYmxlciBzd2l0Y2hlcyBhcmNoaXRlY3R1cmVzXG5cCi0tc3BhcmMJCQlpZ25vcmVkXG5cCi0tLWVuZm9yY2UtYWxpZ25lZC1kYXRhCWZvcmNlIC5sb25nLCBldGMuLCB0byBiZSBhbGlnbmVkIGNvcnJlY3RseVxuIikpOwotI2lmZGVmIE9CSl9BT1VUCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotLWsJCQlnZW5lcmF0ZSBQSUNcbiIpKTsKLSNlbmRpZgotI2lmZGVmIE9CSl9FTEYKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tMzIJCQljcmVhdGUgMzIgYml0IG9iamVjdCBmaWxlXG5cCi0tNjQJCQljcmVhdGUgNjQgYml0IG9iamVjdCBmaWxlXG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotCQkJW2RlZmF1bHQgaXMgJWRdXG4iKSwgZGVmYXVsdF9hcmNoX3NpemUpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLS1UU08JCQl1c2UgVG90YWwgU3RvcmUgT3JkZXJpbmdcblwKLS1QU08JCQl1c2UgUGFydGlhbCBTdG9yZSBPcmRlcmluZ1xuXAotLVJNTwkJCXVzZSBSZWxheGVkIE1lbW9yeSBPcmRlcmluZ1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLQkJCVtkZWZhdWx0IGlzICVzXVxuIiksIChkZWZhdWx0X2FyY2hfc2l6ZSA9PSA2NCkgPyAiUk1PIiA6ICJUU08iKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tS1BJQwkJCWdlbmVyYXRlIFBJQ1xuXAotLVYJCQlwcmludCBhc3NlbWJsZXIgdmVyc2lvbiBudW1iZXJcblwKLS1xCQkJaWdub3JlZFxuXAotLVF5LCAtUW4JCWlnbm9yZWRcblwKLS1zCQkJaWdub3JlZFxuIikpOwotI2VuZGlmCi0jaWZkZWYgU1BBUkNfQklFTkRJQU4KLSAgZnByaW50ZiAoc3RyZWFtLCBfKCJcCi0tRUwJCQlnZW5lcmF0ZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZVxuXAotLUVCCQkJZ2VuZXJhdGUgY29kZSBmb3IgYSBiaWcgZW5kaWFuIG1hY2hpbmVcblwKLS0tbGl0dGxlLWVuZGlhbi1kYXRhCWdlbmVyYXRlIGNvZGUgZm9yIGEgbWFjaGluZSBoYXZpbmcgYmlnIGVuZGlhblxuXAotICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zIGFuZCBsaXR0bGUgZW5kaWFuIGRhdGEuIikpOwotI2VuZGlmCi19Ci0MCi0vKiBuYXRpdmUgb3BlcmFuZCBzaXplIG9wY29kZSB0cmFuc2xhdGlvbiAqLwotc3RydWN0Ci0gIHsKLSAgICBjaGFyICpuYW1lOwotICAgIGNoYXIgKm5hbWUzMjsKLSAgICBjaGFyICpuYW1lNjQ7Ci0gIH0gbmF0aXZlX29wX3RhYmxlW10gPQotewotICB7ImxkbiIsICJsZCIsICJsZHgifSwKLSAgeyJsZG5hIiwgImxkYSIsICJsZHhhIn0sCi0gIHsic3RuIiwgInN0IiwgInN0eCJ9LAotICB7InN0bmEiLCAic3RhIiwgInN0eGEifSwKLSAgeyJzbGxuIiwgInNsbCIsICJzbGx4In0sCi0gIHsic3JsbiIsICJzcmwiLCAic3JseCJ9LAotICB7InNyYW4iLCAic3JhIiwgInNyYXgifSwKLSAgeyJjYXNuIiwgImNhcyIsICJjYXN4In0sCi0gIHsiY2FzbmEiLCAiY2FzYSIsICJjYXN4YSJ9LAotICB7ImNscm4iLCAiY2xyIiwgImNscngifSwKLSAge05VTEwsIE5VTEwsIE5VTEx9LAotfTsKLQwKLS8qIHNwYXJjNjQgcHJpdmlsZWRnZWQgcmVnaXN0ZXJzICovCi0KLXN0cnVjdCBwcml2X3JlZ19lbnRyeQotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgcmVnbnVtOwotICB9OwotCi1zdHJ1Y3QgcHJpdl9yZWdfZW50cnkgcHJpdl9yZWdfdGFibGVbXSA9Ci17Ci0gIHsidHBjIiwgMH0sCi0gIHsidG5wYyIsIDF9LAotICB7InRzdGF0ZSIsIDJ9LAotICB7InR0IiwgM30sCi0gIHsidGljayIsIDR9LAotICB7InRiYSIsIDV9LAotICB7InBzdGF0ZSIsIDZ9LAotICB7InRsIiwgN30sCi0gIHsicGlsIiwgOH0sCi0gIHsiY3dwIiwgOX0sCi0gIHsiY2Fuc2F2ZSIsIDEwfSwKLSAgeyJjYW5yZXN0b3JlIiwgMTF9LAotICB7ImNsZWFud2luIiwgMTJ9LAotICB7Im90aGVyd2luIiwgMTN9LAotICB7IndzdGF0ZSIsIDE0fSwKLSAgeyJmcSIsIDE1fSwKLSAgeyJ2ZXIiLCAzMX0sCi0gIHsiIiwgLTF9LAkJCS8qIGVuZCBtYXJrZXIgKi8KLX07Ci0KLS8qIHY5YSBzcGVjaWZpYyBhc3JzICovCi0KLXN0cnVjdCBwcml2X3JlZ19lbnRyeSB2OWFfYXNyX3RhYmxlW10gPQotewotICB7InRpY2tfY21wciIsIDIzfSwKLSAgeyJzb2Z0aW50IiwgMjJ9LAotICB7InNldF9zb2Z0aW50IiwgMjB9LAotICB7InBpYyIsIDE3fSwKLSAgeyJwY3IiLCAxNn0sCi0gIHsiZ3NyIiwgMTl9LAotICB7ImRjciIsIDE4fSwKLSAgeyJjbGVhcl9zb2Z0aW50IiwgMjF9LAotICB7IiIsIC0xfSwJCQkvKiBlbmQgbWFya2VyICovCi19OwotCi1zdGF0aWMgaW50Ci1jbXBfcmVnX2VudHJ5IChwYXJnLCBxYXJnKQotICAgICBjb25zdCBQVFIgcGFyZzsKLSAgICAgY29uc3QgUFRSIHFhcmc7Ci17Ci0gIGNvbnN0IHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcCA9IChjb25zdCBzdHJ1Y3QgcHJpdl9yZWdfZW50cnkgKikgcGFyZzsKLSAgY29uc3Qgc3RydWN0IHByaXZfcmVnX2VudHJ5ICpxID0gKGNvbnN0IHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqKSBxYXJnOwotCi0gIHJldHVybiBzdHJjbXAgKHEtPm5hbWUsIHAtPm5hbWUpOwotfQotDAotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSwgYXQgYXNzZW1ibGVyIHN0YXJ0dXAgdGltZS4gIEl0IHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuIHRoYXQgdGhlIE1EIHBhcnQgb2YgdGhlIGFzc2VtYmxlciB3aWxsIG5lZWQuICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnJldHZhbCA9IE5VTEw7Ci0gIGludCBsb3NlID0gMDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGkgPSAwOwotCi0gIC8qIFdlIGRvbid0IGdldCBhIGNoYW5jZSB0byBpbml0aWFsaXplIGFueXRoaW5nIGJlZm9yZSBtZF9wYXJzZV9vcHRpb24KLSAgICAgaXMgY2FsbGVkLCBhbmQgaXQgbWF5IG5vdCBiZSBjYWxsZWQsIHNvIGhhbmRsZSBkZWZhdWx0IGluaXRpYWxpemF0aW9uCi0gICAgIG5vdyBpZiBub3QgYWxyZWFkeSBkb25lLiAgKi8KLSAgaWYgKCEgZGVmYXVsdF9pbml0X3ApCi0gICAgaW5pdF9kZWZhdWx0X2FyY2ggKCk7Ci0KLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIHdoaWxlIChpIDwgKHVuc2lnbmVkIGludCkgc3BhcmNfbnVtX29wY29kZXMpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHNwYXJjX29wY29kZXNbaV0ubmFtZTsKLSAgICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYW1lLCAoUFRSKSAmc3BhcmNfb3Bjb2Rlc1tpXSk7Ci0gICAgICBpZiAocmV0dmFsICE9IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIiksCi0JCSAgc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgbG9zZSA9IDE7Ci0JfQotICAgICAgZG8KLQl7Ci0JICBpZiAoc3BhcmNfb3Bjb2Rlc1tpXS5tYXRjaCAmIHNwYXJjX29wY29kZXNbaV0ubG9zZSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iKSwKLQkJICAgICAgc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCBzcGFyY19vcGNvZGVzW2ldLmFyZ3MpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGkgPCAodW5zaWduZWQgaW50KSBzcGFyY19udW1fb3Bjb2RlcwotCSAgICAgJiYgIXN0cmNtcCAoc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCBuYW1lKSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IG5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLSAgICAgIGNoYXIgKm5hbWUgPSBzcGFyY19hcmNoX3NpemUgPT0gMzIgPyBuYXRpdmVfb3BfdGFibGVbaV0ubmFtZTMyIDoKLQkJCW5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lNjQ7Ci0gICAgICBpbnNuID0gKHN0cnVjdCBzcGFyY19vcGNvZGUgKiloYXNoX2ZpbmQgKG9wX2hhc2gsIG5hbWUpOwotICAgICAgaWYgKGluc24gPT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgIGFzX2JhZCAoXygiSW50ZXJuYWwgZXJyb3I6IGNhbid0IGZpbmQgb3Bjb2RlIGAlcycgZm9yIGAlcydcbiIpLAotICAgICAgICAgIAkgIG5hbWUsIG5hdGl2ZV9vcF90YWJsZVtpXS5uYW1lKTsKLSAgICAgICAgICBsb3NlID0gMTsKLSAgICAgICAgfQotICAgICAgZWxzZQotCXsKLQkgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCBuYXRpdmVfb3BfdGFibGVbaV0ubmFtZSwgKFBUUikgaW5zbik7Ci0JICBpZiAocmV0dmFsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIGAlcyc6ICVzXG4iKSwKLQkJICAgICAgc3BhcmNfb3Bjb2Rlc1tpXS5uYW1lLCByZXR2YWwpOwotCSAgICAgIGxvc2UgPSAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAobG9zZSkKLSAgICBhc19mYXRhbCAoXygiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iKSk7Ci0KLSAgcXNvcnQgKHByaXZfcmVnX3RhYmxlLCBzaXplb2YgKHByaXZfcmVnX3RhYmxlKSAvIHNpemVvZiAocHJpdl9yZWdfdGFibGVbMF0pLAotCSBzaXplb2YgKHByaXZfcmVnX3RhYmxlWzBdKSwgY21wX3JlZ19lbnRyeSk7Ci0KLSAgLyogSWYgLWJ1bXAsIHJlY29yZCB0aGUgYXJjaGl0ZWN0dXJlIGxldmVsIGF0IHdoaWNoIHdlIHN0YXJ0IGlzc3VpbmcKLSAgICAgd2FybmluZ3MuICBUaGUgYmVoYXZpb3VyIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIGFuCi0gICAgIGFyY2hpdGVjdHVyZSB3YXMgZXhwbGljaXRseSBzcGVjaWZpZWQuICBJZiBpdCB3YXNuJ3QsIHdlIGlzc3VlIHdhcm5pbmdzCi0gICAgIGZvciBhbGwgdXB3YXJkcyBidW1wcy4gIElmIGl0IHdhcywgd2UgZG9uJ3Qgc3RhcnQgaXNzdWluZyB3YXJuaW5ncyB1bnRpbAotICAgICB3ZSBuZWVkIHRvIGJ1bXAgYmV5b25kIHRoZSByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlIG9yIHdoZW4gd2UgYnVtcCBiZXR3ZWVuCi0gICAgIGNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyZXMuICAqLwotCi0gIGlmICh3YXJuX29uX2J1bXAKLSAgICAgICYmIGFyY2hpdGVjdHVyZV9yZXF1ZXN0ZWQpCi0gICAgewotICAgICAgLyogYG1heF9hcmNoaXRlY3R1cmUnIHJlY29yZHMgdGhlIHJlcXVlc3RlZCBhcmNoaXRlY3R1cmUuCi0JIElzc3VlIHdhcm5pbmdzIGlmIHdlIGdvIGFib3ZlIGl0LiAgKi8KLSAgICAgIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlID0gbWF4X2FyY2hpdGVjdHVyZTsKLQotICAgICAgLyogRmluZCB0aGUgaGlnaGVzdCBhcmNoaXRlY3R1cmUgbGV2ZWwgdGhhdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGgKLQkgdGhlIHJlcXVlc3RlZCBvbmUuICAqLwotICAgICAgZm9yIChtYXhfYXJjaGl0ZWN0dXJlID0gU1BBUkNfT1BDT0RFX0FSQ0hfTUFYOwotCSAgIG1heF9hcmNoaXRlY3R1cmUgPiB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZTsKLQkgICAtLW1heF9hcmNoaXRlY3R1cmUpCi0JaWYgKCEgU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1AgKG1heF9hcmNoaXRlY3R1cmUsCi0JCQkJICAgICAgIHdhcm5fYWZ0ZXJfYXJjaGl0ZWN0dXJlKSkKLQkgIGJyZWFrOwotICAgIH0KLX0KLQotLyogQ2FsbGVkIGFmdGVyIGFsbCBhc3NlbWJseSBoYXMgYmVlbiBkb25lLiAgKi8KLQotdm9pZAotc3BhcmNfbWRfZW5kICgpCi17Ci0gIGlmIChzcGFyY19hcmNoX3NpemUgPT0gNjQpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfdjlhKTsKLSAgICAgIGVsc2UKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfdjkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfdjhwbHVzKTsKLSAgICAgIGVsc2UgaWYgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlID09IFNQQVJDX09QQ09ERV9BUkNIX1Y5QSkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfdjhwbHVzYSk7Ci0gICAgICBlbHNlIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsZXQpOwotICAgICAgZWxzZSBpZiAoZGVmYXVsdF9hcmNoX3R5cGUgPT0gc3BhcmM4NnggJiYgdGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YSkKLQliZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBiZmRfYXJjaF9zcGFyYywgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBUaGUgc3BhcmNsaXRlIGlzIHRyZWF0ZWQgbGlrZSBhIG5vcm1hbCBzcGFyYy4gIFBlcmhhcHMgaXQgc2hvdWxkbid0Ci0JICAgICBiZSBidXQgZm9yIG5vdyBpdCBpcyAoc2luY2UgdGhhdCdzIHRoZSB3YXkgaXQncyBhbHdheXMgYmVlbgotCSAgICAgdHJlYXRlZCkuICAqLwotCSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgYmZkX2FyY2hfc3BhcmMsIGJmZF9tYWNoX3NwYXJjKTsKLQl9Ci0gICAgfQotfQotDAotLyogUmV0dXJuIG5vbi16ZXJvIGlmIFZBTCBpcyBpbiB0aGUgcmFuZ2UgLShNQVgrMSkgdG8gTUFYLiAgKi8KLQotc3RhdGljIElOTElORSBpbnQKLWluX3NpZ25lZF9yYW5nZSAodmFsLCBtYXgpCi0gICAgIGJmZF9zaWduZWRfdm1hIHZhbCwgbWF4OwotewotICBpZiAobWF4IDw9IDApCi0gICAgYWJvcnQgKCk7Ci0gIC8qIFNpZ24tZXh0ZW5kIHRoZSB2YWx1ZSBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgd29yZCBzaXplLCBzbyB0aGF0Ci0gICAgIDB4ZmZmZmZmZmYgaXMgYWx3YXlzIGNvbnNpZGVyZWQgLTEgb24gc3BhcmMzMi4gICovCi0gIGlmIChzcGFyY19hcmNoX3NpemUgPT0gMzIpCi0gICAgewotICAgICAgYmZkX3NpZ25lZF92bWEgc2lnbiA9IChiZmRfc2lnbmVkX3ZtYSkxIDw8IDMxOwotICAgICAgdmFsID0gKCh2YWwgJiAweGZmZmZmZmZmKSBeIHNpZ24pIC0gc2lnbjsKLSAgICB9Ci0gIGlmICh2YWwgPiBtYXgpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICh2YWwgPCB+bWF4KQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIFZBTCBpcyBpbiB0aGUgcmFuZ2UgMCB0byBNQVguICAqLwotCi1zdGF0aWMgSU5MSU5FIGludAotaW5fdW5zaWduZWRfcmFuZ2UgKHZhbCwgbWF4KQotICAgICBiZmRfdm1hIHZhbCwgbWF4OwotewotICBpZiAodmFsID4gbWF4KQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIFZBTCBpcyBpbiB0aGUgcmFuZ2UgLShNQVgvMisxKSB0byBNQVguCi0gICAoZS5nLiAtMTUgdG8gKzMxKS4gICovCi0KLXN0YXRpYyBJTkxJTkUgaW50Ci1pbl9iaXRmaWVsZF9yYW5nZSAodmFsLCBtYXgpCi0gICAgIGJmZF9zaWduZWRfdm1hIHZhbCwgbWF4OwotewotICBpZiAobWF4IDw9IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmICh2YWwgPiBtYXgpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICh2YWwgPCB+KG1heCA+PiAxKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQKLXNwYXJjX2ZmcyAobWFzaykKLSAgICAgdW5zaWduZWQgaW50IG1hc2s7Ci17Ci0gIGludCBpOwotCi0gIGlmIChtYXNrID09IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoaSA9IDA7IChtYXNrICYgMSkgPT0gMDsgKytpKQotICAgIG1hc2sgPj49IDE7Ci0gIHJldHVybiBpOwotfQotCi0vKiBJbXBsZW1lbnQgYmlnIHNoaWZ0IHJpZ2h0LiAgKi8KLXN0YXRpYyBiZmRfdm1hCi1CU1IgKHZhbCwgYW1vdW50KQotICAgICBiZmRfdm1hIHZhbDsKLSAgICAgaW50IGFtb3VudDsKLXsKLSAgaWYgKHNpemVvZiAoYmZkX3ZtYSkgPD0gNCAmJiBhbW91bnQgPj0gMzIpCi0gICAgYXNfZmF0YWwgKF8oIlN1cHBvcnQgZm9yIDY0LWJpdCBhcml0aG1ldGljIG5vdCBjb21waWxlZCBpbi4iKSk7Ci0gIHJldHVybiB2YWwgPj4gYW1vdW50OwotfQotDAotLyogRm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBzcGFyY19pcCBhbmQgZ2V0X2V4cHJlc3Npb24uICAqLwotc3RhdGljIGNoYXIgKmV4cHJfZW5kOwotCi0vKiBWYWx1ZXMgZm9yIGBzcGVjaWFsX2Nhc2UnLgotICAgSW5zdHJ1Y3Rpb25zIHRoYXQgcmVxdWlyZSB3aWVyZCBoYW5kbGluZyBiZWNhdXNlIHRoZXkncmUgbG9uZ2VyIHRoYW4KLSAgIDQgYnl0ZXMuICAqLwotI2RlZmluZSBTUEVDSUFMX0NBU0VfTk9ORQkwCi0jZGVmaW5lCVNQRUNJQUxfQ0FTRV9TRVQJMQotI2RlZmluZSBTUEVDSUFMX0NBU0VfU0VUU1cJMgotI2RlZmluZSBTUEVDSUFMX0NBU0VfU0VUWAkzCi0vKiBGSVhNRTogc3BhcmMtb3BjLmMgZG9lc24ndCBoYXZlIG5lY2Vzc2FyeSAiUyIgdHJpZ2dlciB0byBlbmFibGUgdGhpcy4gICovCi0jZGVmaW5lCVNQRUNJQUxfQ0FTRV9GRElWCTQKLQotLyogQml0IG1hc2tzIG9mIHZhcmlvdXMgaW5zbnMuICAqLwotI2RlZmluZSBOT1BfSU5TTiAweDAxMDAwMDAwCi0jZGVmaW5lIE9SX0lOU04gMHg4MDEwMDAwMAotI2RlZmluZSBYT1JfSU5TTiAweDgwMTgwMDAwCi0jZGVmaW5lIEZNT1ZTX0lOU04gMHg4MUEwMDAyMAotI2RlZmluZSBTRVRISV9JTlNOIDB4MDEwMDAwMDAKLSNkZWZpbmUgU0xMWF9JTlNOIDB4ODEyODEwMDAKLSNkZWZpbmUgU1JBX0lOU04gMHg4MTM4MDAwMAotCi0vKiBUaGUgbGFzdCBpbnN0cnVjdGlvbiB0byBiZSBhc3NlbWJsZWQuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKmxhc3RfaW5zbjsKLS8qIFRoZSBhc3NlbWJsZWQgb3Bjb2RlIG9mIGBsYXN0X2luc24nLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Rfb3Bjb2RlOwotDAotLyogSGFuZGxlIHRoZSBzZXQgYW5kIHNldHV3IHN5bnRoZXRpYyBpbnN0cnVjdGlvbnMuICAqLwotc3RhdGljIHZvaWQKLXN5bnRoZXRpemVfc2V0dXcgKGluc24pCi0gICAgIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKmluc247Ci17Ci0gIGludCBuZWVkX2hpMjJfcCA9IDA7Ci0gIGludCByZCA9ICh0aGVfaW5zbi5vcGNvZGUgJiBSRCAofjApKSA+PiAyNTsKLQotICBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkpCi0JewotCSAgaWYgKHNpemVvZihvZmZzZXRUKSA+IDQKLQkgICAgICAmJiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8IDAKLQkJICB8fCB0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID4gKG9mZnNldFQpIDB4ZmZmZmZmZmYpKQotCSAgICBhc193YXJuIChfKCJzZXQ6IG51bWJlciBub3QgaW4gMC4uNDI5NDk2NzI5NSByYW5nZSIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHNpemVvZihvZmZzZXRUKSA+IDQKLQkgICAgICAmJiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8IC0ob2Zmc2V0VCkgMHg4MDAwMDAwMAotCQkgIHx8IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPiAob2Zmc2V0VCkgMHhmZmZmZmZmZikpCi0JICAgIGFzX3dhcm4gKF8oInNldDogbnVtYmVyIG5vdCBpbiAtMjE0NzQ4MzY0OC4uNDI5NDk2NzI5NSByYW5nZSIpKTsKLQkgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPSAoaW50KXRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JfQotICAgIH0KLQotICAvKiBTZWUgaWYgb3BlcmFuZCBpcyBhYnNvbHV0ZSBhbmQgc21hbGw7IHNraXAgc2V0aGkgaWYgc28uICAqLwotICBpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+PSAoMSA8PCAxMikKLSAgICAgIHx8IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPCAtKDEgPDwgMTIpKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTRVRISV9JTlNOIHwgUkQgKHJkKQotCQkJIHwgKCh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyID4+IDEwKQotCQkJICAgICYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQgPyAweDNmZmZmZiA6IDApKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQk/IEJGRF9SRUxPQ19ISTIyCi0JCQk6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgICAgbmVlZF9oaTIyX3AgPSAxOwotICAgIH0KLQotICAvKiBTZWUgaWYgb3BlcmFuZCBoYXMgbm8gbG93LW9yZGVyIGJpdHM7IHNraXAgT1IgaWYgc28uICAqLwotICBpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgKG5lZWRfaGkyMl9wICYmICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICYgMHgzRkYpICE9IDApCi0gICAgICB8fCAhIG5lZWRfaGkyMl9wKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOIHwgKG5lZWRfaGkyMl9wID8gUlMxIChyZCkgOiAwKQotCQkJIHwgUkQgKHJkKSB8IElNTUVECi0JCQkgfCAodGhlX2luc24uZXhwLlhfYWRkX251bWJlcgotCQkJICAgICYgKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQgPyAwIDoKLQkJCSAgICAgICBuZWVkX2hpMjJfcCA/IDB4M2ZmIDogMHgxZmZmKSkpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJPyBCRkRfUkVMT0NfTE8xMAotCQkJOiBCRkRfUkVMT0NfTk9ORSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci19Ci0gICAgCi0vKiBIYW5kbGUgdGhlIHNldHN3IHN5bnRoZXRpYyBpbnN0cnVjdGlvbi4gICovCi1zdGF0aWMgdm9pZAotc3ludGhldGl6ZV9zZXRzdyAoaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLXsKLSAgaW50IGxvdzMyLCByZCwgb3BjOwotCi0gIHJkID0gKHRoZV9pbnNuLm9wY29kZSAmIFJEICh+MCkpID4+IDI1OwotCi0gIGlmICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIHN5bnRoZXRpemVfc2V0dXcgKGluc24pOwotCi0gICAgICAvKiBOZWVkIHRvIHNpZ24gZXh0ZW5kIGl0LiAgKi8KLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChTUkFfSU5TTiB8IFJTMSAocmQpIHwgUkQgKHJkKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzaXplb2Yob2Zmc2V0VCkgPiA0Ci0gICAgICAmJiAodGhlX2luc24uZXhwLlhfYWRkX251bWJlciA8IC0ob2Zmc2V0VCkgMHg4MDAwMDAwMAotCSAgfHwgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciA+IChvZmZzZXRUKSAweGZmZmZmZmZmKSkKLSAgICBhc193YXJuIChfKCJzZXRzdzogbnVtYmVyIG5vdCBpbiAtMjE0NzQ4MzY0OC4uNDI5NDk2NzI5NSByYW5nZSIpKTsKLQotICBsb3czMiA9IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7CQotCSAgICAgIAotICBpZiAobG93MzIgPj0gMCkKLSAgICB7Ci0gICAgICBzeW50aGV0aXplX3NldHV3IChpbnNuKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgb3BjID0gT1JfSU5TTjsKLSAgICAKLSAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgLyogU2VlIGlmIG9wZXJhbmQgaXMgYWJzb2x1dGUgYW5kIHNtYWxsOyBza2lwIHNldGhpIGlmIHNvLiAgKi8KLSAgaWYgKGxvdzMyIDwgLSgxIDw8IDEyKSkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0VUSElfSU5TTiB8IFJEIChyZCkKLQkJCSB8ICgoKH50aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyKSA+PiAxMCkgJiAweDNmZmZmZikpOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgICBsb3czMiA9IDB4MWMwMCB8IChsb3czMiAmIDB4M2ZmKTsKLSAgICAgIG9wYyA9IFJTMSAocmQpIHwgWE9SX0lOU047Ci0gICAgfQotCi0gIHRoZV9pbnNuLm9wY29kZSA9IChvcGMgfCBSRCAocmQpIHwgSU1NRUQKLQkJICAgICB8IChsb3czMiAmIDB4MWZmZikpOwotICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLX0KLQotLyogSGFuZGxlIHRoZSBzZXRzdyBzeW50aGV0aWMgaW5zdHJ1Y3Rpb24uICAqLwotc3RhdGljIHZvaWQKLXN5bnRoZXRpemVfc2V0eCAoaW5zbikKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLXsKLSAgaW50IHVwcGVyMzIsIGxvd2VyMzI7Ci0gIGludCB0bXByZWcgPSAodGhlX2luc24ub3Bjb2RlICYgUlMxICh+MCkpID4+IDE0OwotICBpbnQgZHN0cmVnID0gKHRoZV9pbnNuLm9wY29kZSAmIFJEICh+MCkpID4+IDI1OwotICBpbnQgdXBwZXJfZHN0cmVnOwotICBpbnQgbmVlZF9oaDIyX3AgPSAwLCBuZWVkX2htMTBfcCA9IDAsIG5lZWRfaGkyMl9wID0gMCwgbmVlZF9sbzEwX3AgPSAwOwotICBpbnQgbmVlZF94b3IxMF9wID0gMDsKLSAgICAKLSNkZWZpbmUgU0lHTkVYVDMyKHgpICgoKCh4KSAmIDB4ZmZmZmZmZmYpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotICBsb3dlcjMyID0gU0lHTkVYVDMyICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyKTsKLSAgdXBwZXIzMiA9IFNJR05FWFQzMiAoQlNSICh0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyLCAzMikpOwotI3VuZGVmIFNJR05FWFQzMgotCi0gIHVwcGVyX2RzdHJlZyA9IHRtcHJlZzsKLSAgLyogVGhlIHRtcCByZWcgc2hvdWxkIG5vdCBiZSB0aGUgZHN0IHJlZy4gICovCi0gIGlmICh0bXByZWcgPT0gZHN0cmVnKQotICAgIGFzX3dhcm4gKF8oInNldHg6IHRlbXBvcmFyeSByZWdpc3RlciBzYW1lIGFzIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIikpOwotCi0gIC8qID8/PyBPYnZpb3VzbHkgdGhlcmUgYXJlIG90aGVyIG9wdGltaXphdGlvbnMgd2UgY2FuIGRvCi0gICAgIChlLmcuIHNldGhpK3NoaWZ0IGZvciAweDFmMDAwMDAwMCkgYW5kIHBlcmhhcHMgd2Ugc2hvdWxkbid0IGJlCi0gICAgIGRvaW5nIHNvbWUgb2YgdGhlc2UuICBMYXRlci4gIElmIHlvdSBkbyBjaGFuZ2UgdGhpbmdzLCB0cnkgdG8KLSAgICAgY2hhbmdlIGFsbCBvZiB0aGlzIHRvIGJlIHRhYmxlIGRyaXZlbiBhcyB3ZWxsLiAgKi8KLSAgLyogV2hhdCB0byBvdXRwdXQgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIGlmIGl0J3MgY29uc3RhbnQuCi0gICAgIENvbXB1dGUgdGhhdCBmaXJzdCwgdGhlbiBvdXRwdXQgd2hhdCB3ZSd2ZSBkZWNpZGVkIHVwb24uICAqLwotICBpZiAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDMyKQotCXsKLQkgIC8qIFdoZW4gYXJjaCBzaXplIGlzIDMyLCB3ZSB3YW50IHNldHggdG8gYmUgZXF1aXZhbGVudAotCSAgICAgdG8gc2V0dXcgZm9yIGFueXRoaW5nIGJ1dCBjb25zdGFudHMuICAqLwotCSAgdGhlX2luc24uZXhwLlhfYWRkX251bWJlciAmPSAweGZmZmZmZmZmOwotCSAgc3ludGhldGl6ZV9zZXR1dyAoaW5zbik7Ci0JICByZXR1cm47Ci0JfQotICAgICAgbmVlZF9oaDIyX3AgPSBuZWVkX2htMTBfcCA9IG5lZWRfaGkyMl9wID0gbmVlZF9sbzEwX3AgPSAxOwotICAgICAgbG93ZXIzMiA9IDA7IHVwcGVyMzIgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFJlc2V0IFhfYWRkX251bWJlciwgd2UndmUgZXh0cmFjdGVkIGl0IGFzIHVwcGVyMzIvbG93ZXIzMi4KLQkgT3RoZXJ3aXNlIGZpeHVwX3NlZ21lbnQgd2lsbCBjb21wbGFpbiBhYm91dCBub3QgYmVpbmcgYWJsZSB0bwotCSB3cml0ZSBhbiA4IGJ5dGUgbnVtYmVyIGluIGEgNCBieXRlIGZpZWxkLiAgKi8KLSAgICAgIHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgIAotICAgICAgLyogT25seSBuZWVkIGhoMjIgaWYgYG9yJyBpbnNuIGNhbid0IGhhbmRsZSBjb25zdGFudC4gICovCi0gICAgICBpZiAodXBwZXIzMiA8IC0oMSA8PCAxMikgfHwgdXBwZXIzMiA+PSAoMSA8PCAxMikpCi0JbmVlZF9oaDIyX3AgPSAxOwotICAgIAotICAgICAgLyogRG9lcyBib3R0b20gcGFydCAoYWZ0ZXIgc2V0aGkpIGhhdmUgYml0cz8gICovCi0gICAgICBpZiAoKG5lZWRfaGgyMl9wICYmICh1cHBlcjMyICYgMHgzZmYpICE9IDApCi0JICAvKiBObyBoaDIyLCBidXQgZG9lcyB1cHBlcjMyIHN0aWxsIGhhdmUgYml0cyB3ZSBjYW4ndCBzZXQKLQkgICAgIGZyb20gbG93ZXIzMj8gICovCi0JICB8fCAoISBuZWVkX2hoMjJfcCAmJiB1cHBlcjMyICE9IDAgJiYgdXBwZXIzMiAhPSAtMSkpCi0JbmVlZF9obTEwX3AgPSAxOwotICAgIAotICAgICAgLyogSWYgdGhlIGxvd2VyIGhhbGYgaXMgYWxsIHplcm8sIHdlIGJ1aWxkIHRoZSB1cHBlciBoYWxmIGRpcmVjdGx5Ci0JIGludG8gdGhlIGRzdCByZWcuICAqLwotICAgICAgaWYgKGxvd2VyMzIgIT0gMAotCSAgLyogTmVlZCBsb3dlciBoYWxmIGlmIG51bWJlciBpcyB6ZXJvIG9yIDB4ZmZmZmZmZmYwMDAwMDAwMC4gICovCi0JICB8fCAoISBuZWVkX2hoMjJfcCAmJiAhIG5lZWRfaG0xMF9wKSkKLQl7Ci0JICAvKiBObyBuZWVkIGZvciBzZXRoaSBpZiBgb3InIGluc24gY2FuIGhhbmRsZSBjb25zdGFudC4gICovCi0JICBpZiAobG93ZXIzMiA8IC0oMSA8PCAxMikgfHwgbG93ZXIzMiA+PSAoMSA8PCAxMikKLQkgICAgICAvKiBOb3RlIHRoYXQgd2UgY2FuJ3QgdXNlIGEgbmVnYXRpdmUgY29uc3RhbnQgaW4gdGhlIGBvcicKLQkJIGluc24gdW5sZXNzIHRoZSB1cHBlciAzMiBiaXRzIGFyZSBhbGwgb25lcy4gICovCi0JICAgICAgfHwgKGxvd2VyMzIgPCAwICYmIHVwcGVyMzIgIT0gLTEpCi0JICAgICAgfHwgKGxvd2VyMzIgPj0gMCAmJiB1cHBlcjMyID09IC0xKSkKLQkgICAgbmVlZF9oaTIyX3AgPSAxOwotCQkgICAgICAKLQkgIGlmIChuZWVkX2hpMjJfcCAmJiB1cHBlcjMyID09IC0xKQotCSAgICBuZWVkX3hvcjEwX3AgPSAxOwotCi0JICAvKiBEb2VzIGJvdHRvbSBwYXJ0IChhZnRlciBzZXRoaSkgaGF2ZSBiaXRzPyAgKi8KLQkgIGVsc2UgaWYgKChuZWVkX2hpMjJfcCAmJiAobG93ZXIzMiAmIDB4M2ZmKSAhPSAwKQotCQkgICAvKiBObyBzZXRoaS4gICovCi0JCSAgIHx8ICghIG5lZWRfaGkyMl9wICYmIChsb3dlcjMyICYgMHgxZmZmKSAhPSAwKQotCQkgICAvKiBOZWVkIGBvcicgaWYgd2UgZGlkbid0IHNldCBhbnl0aGluZyBlbHNlLiAgKi8KLQkJICAgfHwgKCEgbmVlZF9oaTIyX3AgJiYgISBuZWVkX2hoMjJfcCAmJiAhIG5lZWRfaG0xMF9wKSkKLQkgICAgbmVlZF9sbzEwX3AgPSAxOwotCX0KLSAgICAgIGVsc2UKLQkvKiBPdXRwdXQgZGlyZWN0bHkgdG8gZHN0IHJlZyBpZiBsb3dlciAzMiBiaXRzIGFyZSBhbGwgemVyby4gICovCi0JdXBwZXJfZHN0cmVnID0gZHN0cmVnOwotICAgIH0KLSAgICAKLSAgaWYgKCF1cHBlcl9kc3RyZWcgJiYgZHN0cmVnKQotICAgIGFzX3dhcm4gKF8oInNldHg6IGlsbGVnYWwgdGVtcG9yYXJ5IHJlZ2lzdGVyIGcwIikpOwotCi0gIGlmIChuZWVkX2hoMjJfcCkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0VUSElfSU5TTiB8IFJEICh1cHBlcl9kc3RyZWcpCi0JCQkgfCAoKHVwcGVyMzIgPj4gMTApICYgMHgzZmZmZmYpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCT8gQkZEX1JFTE9DX1NQQVJDX0hIMjIgOiBCRkRfUkVMT0NfTk9ORSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci0gICAgCi0gIGlmIChuZWVkX2hpMjJfcCkKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoU0VUSElfSU5TTiB8IFJEIChkc3RyZWcpCi0JCQkgfCAoKChuZWVkX3hvcjEwX3AgPyB+bG93ZXIzMiA6IGxvd2VyMzIpCi0JCQkgICAgPj4gMTApICYgMHgzZmZmZmYpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gKHRoZV9pbnNuLmV4cC5YX29wICE9IE9fY29uc3RhbnQKLQkJCT8gQkZEX1JFTE9DX1NQQVJDX0xNMjIgOiBCRkRfUkVMT0NfTk9ORSk7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci0KLSAgaWYgKG5lZWRfaG0xMF9wKQotICAgIHsKLSAgICAgIHRoZV9pbnNuLm9wY29kZSA9IChPUl9JTlNOCi0JCQkgfCAobmVlZF9oaDIyX3AgPyBSUzEgKHVwcGVyX2RzdHJlZykgOiAwKQotCQkJIHwgUkQgKHVwcGVyX2RzdHJlZykKLQkJCSB8IElNTUVECi0JCQkgfCAodXBwZXIzMiAmIChuZWVkX2hoMjJfcCA/IDB4M2ZmIDogMHgxZmZmKSkpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSAodGhlX2luc24uZXhwLlhfb3AgIT0gT19jb25zdGFudAotCQkJPyBCRkRfUkVMT0NfU1BBUkNfSE0xMCA6IEJGRF9SRUxPQ19OT05FKTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLSAgICAKLSAgaWYgKG5lZWRfbG8xMF9wKQotICAgIHsKLSAgICAgIC8qIEZJWE1FOiBPbmUgbmljZSBvcHRpbWl6YXRpb24gdG8gZG8gaGVyZSBpcyB0byBPUiB0aGUgbG93IHBhcnQKLQkgd2l0aCB0aGUgaGlnaHBhcnQgaWYgaGkyMiBpc24ndCBuZWVkZWQgYW5kIHRoZSBsb3cgcGFydCBpcwotCSBwb3NpdGl2ZS4gICovCi0gICAgICB0aGVfaW5zbi5vcGNvZGUgPSAoT1JfSU5TTiB8IChuZWVkX2hpMjJfcCA/IFJTMSAoZHN0cmVnKSA6IDApCi0JCQkgfCBSRCAoZHN0cmVnKQotCQkJIHwgSU1NRUQKLQkJCSB8IChsb3dlcjMyICYgKG5lZWRfaGkyMl9wID8gMHgzZmYgOiAweDFmZmYpKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9ICh0aGVfaW5zbi5leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCQk/IEJGRF9SRUxPQ19MTzEwIDogQkZEX1JFTE9DX05PTkUpOwotICAgICAgb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0gICAgfQotICAgIAotICAvKiBJZiB3ZSBuZWVkZWQgdG8gYnVpbGQgdGhlIHVwcGVyIHBhcnQsIHNoaWZ0IGl0IGludG8gcGxhY2UuICAqLwotICBpZiAobmVlZF9oaDIyX3AgfHwgbmVlZF9obTEwX3ApCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKFNMTFhfSU5TTiB8IFJTMSAodXBwZXJfZHN0cmVnKSB8IFJEICh1cHBlcl9kc3RyZWcpCi0JCQkgfCBJTU1FRCB8IDMyKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci0gICAgCi0gIC8qIFRvIGdldCAtMSBpbiB1cHBlcjMyLCB3ZSBkbyBzZXRoaSAlaGkofngpLCByOyB4b3IgciwgLTB4NDAwIHwgeCwgci4gICovCi0gIGlmIChuZWVkX3hvcjEwX3ApCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKFhPUl9JTlNOIHwgUlMxIChkc3RyZWcpIHwgUkQgKGRzdHJlZykgfCBJTU1FRAotCQkJIHwgMHgxYzAwIHwgKGxvd2VyMzIgJiAweDNmZikpOwotICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfTk9ORTsKLSAgICAgIG91dHB1dF9pbnNuIChpbnNuLCAmdGhlX2luc24pOwotICAgIH0KLQotICAvKiBJZiB3ZSBuZWVkZWQgdG8gYnVpbGQgYm90aCB1cHBlciBhbmQgbG93ZXIgcGFydHMsIE9SIHRoZW0gdG9nZXRoZXIuICAqLwotICBlbHNlIGlmICgobmVlZF9oaDIyX3AgfHwgbmVlZF9obTEwX3ApICYmIChuZWVkX2hpMjJfcCB8fCBuZWVkX2xvMTBfcCkpCi0gICAgewotICAgICAgdGhlX2luc24ub3Bjb2RlID0gKE9SX0lOU04gfCBSUzEgKGRzdHJlZykgfCBSUzIgKHVwcGVyX2RzdHJlZykKLQkJCSB8IFJEIChkc3RyZWcpKTsKLSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICB9Ci19Ci0MCi0vKiBNYWluIGVudHJ5IHBvaW50IHRvIGFzc2VtYmxlIG9uZSBpbnN0cnVjdGlvbi4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLSAgaW50IHNwZWNpYWxfY2FzZTsKLQotICBrbm93IChzdHIpOwotICBzcGVjaWFsX2Nhc2UgPSBzcGFyY19pcCAoc3RyLCAmaW5zbik7Ci0KLSAgLyogV2Ugd2FybiBhYm91dCBhdHRlbXB0cyB0byBwdXQgYSBmbG9hdGluZyBwb2ludCBicmFuY2ggaW4gYSBkZWxheSBzbG90LAotICAgICB1bmxlc3MgdGhlIGRlbGF5IHNsb3QgaGFzIGJlZW4gYW5udWxsZWQuICAqLwotICBpZiAoaW5zbiAhPSBOVUxMCi0gICAgICAmJiBsYXN0X2luc24gIT0gTlVMTAotICAgICAgJiYgKGluc24tPmZsYWdzICYgRl9GQlIpICE9IDAKLSAgICAgICYmIChsYXN0X2luc24tPmZsYWdzICYgRl9ERUxBWUVEKSAhPSAwCi0gICAgICAvKiA/Pz8gVGhpcyB0ZXN0IGlzbid0IGNvbXBsZXRlbHkgYWNjdXJhdGUuICBXZSBhc3N1bWUgYW55dGhpbmcgd2l0aAotCSBGX3tVTkJSLENPTkRCUixGQlJ9IHNldCBpcyBhbm51bGxhYmxlLiAgKi8KLSAgICAgICYmICgobGFzdF9pbnNuLT5mbGFncyAmIChGX1VOQlIgfCBGX0NPTkRCUiB8IEZfRkJSKSkgPT0gMAotCSAgfHwgKGxhc3Rfb3Bjb2RlICYgQU5OVUwpID09IDApKQotICAgIGFzX3dhcm4gKF8oIkZQIGJyYW5jaCBpbiBkZWxheSBzbG90IikpOwotCi0gIC8qIFNQQVJDIGJlZm9yZSB2OSByZXF1aXJlcyBhIG5vcCBpbnN0cnVjdGlvbiBiZXR3ZWVuIGEgZmxvYXRpbmcKLSAgICAgcG9pbnQgaW5zdHJ1Y3Rpb24gYW5kIGEgZmxvYXRpbmcgcG9pbnQgYnJhbmNoLiAgV2UgaW5zZXJ0IG9uZQotICAgICBhdXRvbWF0aWNhbGx5LCB3aXRoIGEgd2FybmluZy4gICovCi0gIGlmIChtYXhfYXJjaGl0ZWN0dXJlIDwgU1BBUkNfT1BDT0RFX0FSQ0hfVjkKLSAgICAgICYmIGluc24gIT0gTlVMTAotICAgICAgJiYgbGFzdF9pbnNuICE9IE5VTEwKLSAgICAgICYmIChpbnNuLT5mbGFncyAmIEZfRkJSKSAhPSAwCi0gICAgICAmJiAobGFzdF9pbnNuLT5mbGFncyAmIEZfRkxPQVQpICE9IDApCi0gICAgewotICAgICAgc3RydWN0IHNwYXJjX2l0IG5vcF9pbnNuOwotCi0gICAgICBub3BfaW5zbi5vcGNvZGUgPSBOT1BfSU5TTjsKLSAgICAgIG5vcF9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX05PTkU7Ci0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJm5vcF9pbnNuKTsKLSAgICAgIGFzX3dhcm4gKF8oIkZQIGJyYW5jaCBwcmVjZWRlZCBieSBGUCBpbnN0cnVjdGlvbjsgTk9QIGluc2VydGVkIikpOwotICAgIH0KLQotICBzd2l0Y2ggKHNwZWNpYWxfY2FzZSkKLSAgICB7Ci0gICAgY2FzZSBTUEVDSUFMX0NBU0VfTk9ORToKLSAgICAgIC8qIG5vcm1hbCBpbnNuICovCi0gICAgICBvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTUEVDSUFMX0NBU0VfU0VUU1c6Ci0gICAgICBzeW50aGV0aXplX3NldHN3IChpbnNuKTsKLSAgICAgIGJyZWFrOwotCSAgCi0gICAgY2FzZSBTUEVDSUFMX0NBU0VfU0VUOgotICAgICAgc3ludGhldGl6ZV9zZXR1dyAoaW5zbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgU1BFQ0lBTF9DQVNFX1NFVFg6Ci0gICAgICBzeW50aGV0aXplX3NldHggKGluc24pOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlIFNQRUNJQUxfQ0FTRV9GRElWOgotICAgICAgewotCWludCByZCA9ICh0aGVfaW5zbi5vcGNvZGUgPj4gMjUpICYgMHgxZjsKLSAgICAKLQlvdXRwdXRfaW5zbiAoaW5zbiwgJnRoZV9pbnNuKTsKLSAgICAKLQkvKiBBY2NvcmRpbmcgdG8gaW5mb3JtYXRpb24gbGVha2VkIGZyb20gU3VuLCB0aGUgImZkaXYiIGluc3RydWN0aW9ucwotCSAgIG9uIGVhcmx5IFNQQVJDIG1hY2hpbmVzIHdvdWxkIHByb2R1Y2UgaW5jb3JyZWN0IHJlc3VsdHMgc29tZXRpbWVzLgotCSAgIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGFkZCBhbiBmbW92cyBvZiB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIgdG8KLQkgICBpdHNlbGYganVzdCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24uICBUaGlzIHdhcyB0cnVlIG9uIG1hY2hpbmVzCi0JICAgd2l0aCBXZWl0ZWsgMTE2NSBmbG9hdCBjaGlwcywgc3VjaCBhcyB0aGUgU3VuLTQvMjYwIGFuZCAvMjgwLiAqLwotCWFzc2VydCAodGhlX2luc24ucmVsb2MgPT0gQkZEX1JFTE9DX05PTkUpOwotCXRoZV9pbnNuLm9wY29kZSA9IEZNT1ZTX0lOU04gfCByZCB8IFJEIChyZCk7Ci0Jb3V0cHV0X2luc24gKGluc24sICZ0aGVfaW5zbik7Ci0JcmV0dXJuOwotICAgICAgfQotICAgIAotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19mYXRhbCAoXygiZmFpbGVkIHNwZWNpYWwgY2FzZSBpbnNuIHNhbml0eSBjaGVjayIpKTsKLSAgICB9Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbWRfYXNzZW1ibGUgdG8gZG8gdGhlIGFjdHVhbCBwYXJzaW5nLiAgKi8KLQotc3RhdGljIGludAotc3BhcmNfaXAgKHN0ciwgcGluc24pCi0gICAgIGNoYXIgKnN0cjsKLSAgICAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKnBpbnNuOwotewotICBjaGFyICplcnJvcl9tZXNzYWdlID0gIiI7Ci0gIGNoYXIgKnM7Ci0gIGNvbnN0IGNoYXIgKmFyZ3M7Ci0gIGNoYXIgYzsKLSAgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqaW5zbjsKLSAgY2hhciAqYXJnc1N0YXJ0OwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLSAgdW5zaWduZWQgaW50IG1hc2sgPSAwOwotICBpbnQgbWF0Y2ggPSAwOwotICBpbnQgY29tbWEgPSAwOwotICBpbnQgdjlfYXJnX3A7Ci0gIGludCBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfTk9ORTsKLQotICBzID0gc3RyOwotICBpZiAoaXNsb3dlciAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLSAgICB7Ci0gICAgICBkbwotCSsrczsKLSAgICAgIHdoaWxlIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMpIHx8IGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpOwotICAgIH0KLQotICBzd2l0Y2ggKCpzKQotICAgIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJywnOgotICAgICAgY29tbWEgPSAxOwotCi0gICAgICAvKkZBTExUSFJPVUdIICovCi0KLSAgICBjYXNlICcgJzoKLSAgICAgICpzKysgPSAnXDAnOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNfZmF0YWwgKF8oIlVua25vd24gb3Bjb2RlOiBgJXMnIiksIHN0cik7Ci0gICAgfQotICBpbnNuID0gKHN0cnVjdCBzcGFyY19vcGNvZGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCBzdHIpOwotICAqcGluc24gPSBpbnNuOwotICBpZiAoaW5zbiA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiVW5rbm93biBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIHJldHVybiBzcGVjaWFsX2Nhc2U7Ci0gICAgfQotICBpZiAoY29tbWEpCi0gICAgewotICAgICAgKi0tcyA9ICcsJzsKLSAgICB9Ci0KLSAgYXJnc1N0YXJ0ID0gczsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBvcGNvZGUgPSBpbnNuLT5tYXRjaDsKLSAgICAgIG1lbXNldCAoJnRoZV9pbnNuLCAnXDAnLCBzaXplb2YgKHRoZV9pbnNuKSk7Ci0gICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOwotICAgICAgdjlfYXJnX3AgPSAwOwotCi0gICAgICAvKgotICAgICAgICogQnVpbGQgdGhlIG9wY29kZSwgY2hlY2tpbmcgYXMgd2UgZ28gdG8gbWFrZQotICAgICAgICogc3VyZSB0aGF0IHRoZSBvcGVyYW5kcyBtYXRjaAotICAgICAgICovCi0gICAgICBmb3IgKGFyZ3MgPSBpbnNuLT5hcmdzOzsgKythcmdzKQotCXsKLQkgIHN3aXRjaCAoKmFyZ3MpCi0JICAgIHsKLQkgICAgY2FzZSAnSyc6Ci0JICAgICAgewotCQlpbnQga21hc2sgPSAwOwotCi0JCS8qIFBhcnNlIGEgc2VyaWVzIG9mIG1hc2tzLiAgKi8KLQkJaWYgKCpzID09ICcjJykKLQkJICB7Ci0JCSAgICB3aGlsZSAoKnMgPT0gJyMnKQotCQkgICAgICB7Ci0JCQlpbnQgbWFzazsKLQotCQkJaWYgKCEgcGFyc2Vfa2V5d29yZF9hcmcgKHNwYXJjX2VuY29kZV9tZW1iYXIsICZzLAotCQkJCQkJICZtYXNrKSkKLQkJCSAgewotCQkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgbWVtYmFyIG1hc2sgbmFtZSIpOwotCQkJICAgIGdvdG8gZXJyb3I7Ci0JCQkgIH0KLQkJCWttYXNrIHw9IG1hc2s7Ci0JCQl3aGlsZSAoKnMgPT0gJyAnKSB7ICsrczsgY29udGludWU7IH0KLQkJCWlmICgqcyA9PSAnfCcgfHwgKnMgPT0gJysnKQotCQkJICArK3M7Ci0JCQl3aGlsZSAoKnMgPT0gJyAnKSB7ICsrczsgY29udGludWU7IH0KLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGlmICghIHBhcnNlX2NvbnN0X2V4cHJfYXJnICgmcywgJmttYXNrKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBtZW1iYXIgbWFzayBleHByZXNzaW9uIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgICBpZiAoa21hc2sgPCAwIHx8IGttYXNrID4gMTI3KQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIG1lbWJhciBtYXNrIG51bWJlciIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQotCQlvcGNvZGUgfD0gTUVNQkFSIChrbWFzayk7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICBjYXNlICcqJzoKLQkgICAgICB7Ci0JCWludCBmY24gPSAwOwotCi0JCS8qIFBhcnNlIGEgcHJlZmV0Y2ggZnVuY3Rpb24uICAqLwotCQlpZiAoKnMgPT0gJyMnKQotCQkgIHsKLQkJICAgIGlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfcHJlZmV0Y2gsICZzLCAmZmNuKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBuYW1lIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKCEgcGFyc2VfY29uc3RfZXhwcl9hcmcgKCZzLCAmZmNuKSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBleHByZXNzaW9uIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgICBpZiAoZmNuIDwgMCB8fCBmY24gPiAzMSkKLQkJICAgICAgewotCQkJZXJyb3JfbWVzc2FnZSA9IF8oIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBudW1iZXIiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCW9wY29kZSB8PSBSRCAoZmNuKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGNhc2UgJyEnOgotCSAgICBjYXNlICc/JzoKLQkgICAgICAvKiBQYXJzZSBhIHNwYXJjNjQgcHJpdmlsZWdlZCByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKCpzID09ICclJykKLQkJewotCQkgIHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcCA9IHByaXZfcmVnX3RhYmxlOwotCQkgIHVuc2lnbmVkIGludCBsZW4gPSA5OTk5OTk5OyAvKiBpbml0IHRvIG1ha2UgZ2NjIGhhcHB5ICovCi0KLQkJICBzICs9IDE7Ci0JCSAgd2hpbGUgKHAtPm5hbWVbMF0gPiBzWzBdKQotCQkgICAgcCsrOwotCQkgIHdoaWxlIChwLT5uYW1lWzBdID09IHNbMF0pCi0JCSAgICB7Ci0JCSAgICAgIGxlbiA9IHN0cmxlbiAocC0+bmFtZSk7Ci0JCSAgICAgIGlmIChzdHJuY21wIChwLT5uYW1lLCBzLCBsZW4pID09IDApCi0JCQlicmVhazsKLQkJICAgICAgcCsrOwotCQkgICAgfQotCQkgIGlmIChwLT5uYW1lWzBdICE9IHNbMF0pCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiKTsKLQkJICAgICAgZ290byBlcnJvcjsKLQkJICAgIH0KLQkJICBpZiAoKmFyZ3MgPT0gJz8nKQotCQkgICAgb3Bjb2RlIHw9IChwLT5yZWdudW0gPDwgMTQpOwotCQkgIGVsc2UKLQkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDI1KTsKLQkJICBzICs9IGxlbjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVycm9yX21lc3NhZ2UgPSBfKCI6IHVucmVjb2duaXphYmxlIHByaXZpbGVnZWQgcmVnaXN0ZXIiKTsKLQkJICBnb3RvIGVycm9yOwotCQl9Ci0KLQkgICAgY2FzZSAnXyc6Ci0JICAgIGNhc2UgJy8nOgotCSAgICAgIC8qIFBhcnNlIGEgdjlhIGFuY2lsbGFyeSBzdGF0ZSByZWdpc3Rlci4gICovCi0JICAgICAgaWYgKCpzID09ICclJykKLQkJewotCQkgIHN0cnVjdCBwcml2X3JlZ19lbnRyeSAqcCA9IHY5YV9hc3JfdGFibGU7Ci0JCSAgdW5zaWduZWQgaW50IGxlbiA9IDk5OTk5OTk7IC8qIGluaXQgdG8gbWFrZSBnY2MgaGFwcHkgKi8KLQotCQkgIHMgKz0gMTsKLQkJICB3aGlsZSAocC0+bmFtZVswXSA+IHNbMF0pCi0JCSAgICBwKys7Ci0JCSAgd2hpbGUgKHAtPm5hbWVbMF0gPT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgbGVuID0gc3RybGVuIChwLT5uYW1lKTsKLQkJICAgICAgaWYgKHN0cm5jbXAgKHAtPm5hbWUsIHMsIGxlbikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgICBwKys7Ci0JCSAgICB9Ci0JCSAgaWYgKHAtPm5hbWVbMF0gIT0gc1swXSkKLQkJICAgIHsKLQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogdW5yZWNvZ25pemFibGUgdjlhIGFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGlmICgqYXJncyA9PSAnLycgJiYgKHAtPnJlZ251bSA9PSAyMCB8fCBwLT5yZWdudW0gPT0gMjEpKQotCQkgICAgewotCQkgICAgICBlcnJvcl9tZXNzYWdlID0gXygiOiByZCBvbiB3cml0ZSBvbmx5IGFuY2lsbGFyeSBzdGF0ZSByZWdpc3RlciIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQkJICAgICAgCi0JCSAgaWYgKCphcmdzID09ICcvJykKLQkJICAgIG9wY29kZSB8PSAocC0+cmVnbnVtIDw8IDE0KTsKLQkJICBlbHNlCi0JCSAgICBvcGNvZGUgfD0gKHAtPnJlZ251bSA8PCAyNSk7Ci0JCSAgcyArPSBsZW47Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiB1bnJlY29nbml6YWJsZSB2OWEgYW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIik7Ci0JCSAgZ290byBlcnJvcjsKLQkJfQotCi0JICAgIGNhc2UgJ00nOgotCSAgICBjYXNlICdtJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVhc3IiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCi0JCSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSAgICB7Ci0JCSAgICAgIGxvbmcgbnVtID0gMDsKLQotCQkgICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJCXsKLQkJCSAgbnVtID0gbnVtICogMTAgKyAqcyAtICcwJzsKLQkJCSAgKytzOwotCQkJfQotCi0JCSAgICAgIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQkJCXsKLQkJCSAgaWYgKG51bSA8IDE2IHx8IDMxIDwgbnVtKQotCQkJICAgIHsKLQkJCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGFzciBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDE2IGFuZCAzMSIpOwotCQkJICAgICAgZ290byBlcnJvcjsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgaWYgKG51bSA8IDAgfHwgMzEgPCBudW0pCi0JCQkgICAgewotCQkJICAgICAgZXJyb3JfbWVzc2FnZSA9IF8oIjogYXNyIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzEiKTsKLQkJCSAgICAgIGdvdG8gZXJyb3I7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIG9wY29kZSB8PSAoKmFyZ3MgPT0gJ00nID8gUlMxIChudW0pIDogUkQgKG51bSkpOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGV4cGVjdGluZyAlYXNyTiIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQl9IC8qIGlmICVhc3IgKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdJJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ18xMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdqJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ18xMDsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdYJzoKLQkgICAgICAvKiBWOCBzeXN0ZW1zIGRvbid0IHVuZGVyc3RhbmQgQkZEX1JFTE9DX1NQQVJDXzUuICAqLwotCSAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfNTsKLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7Ci0JICAgICAgLyogVGhlc2UgZmllbGRzIGFyZSB1bnNpZ25lZCwgYnV0IGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eSwKLQkJIGFsbG93IG5lZ2F0aXZlIHZhbHVlcyBhcyB3ZWxsLiAgKi8KLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdZJzoKLQkgICAgICAvKiBWOCBzeXN0ZW1zIGRvbid0IHVuZGVyc3RhbmQgQkZEX1JFTE9DX1NQQVJDXzYuICAqLwotCSAgICAgIGlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfNjsKLQkgICAgICBlbHNlCi0JCXRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDMTM7Ci0JICAgICAgLyogVGhlc2UgZmllbGRzIGFyZSB1bnNpZ25lZCwgYnV0IGZvciB1cHdhcmQgY29tcGF0aWJpbGl0eSwKLQkJIGFsbG93IG5lZ2F0aXZlIHZhbHVlcyBhcyB3ZWxsLiAgKi8KLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdrJzoKLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IC8qIFJFTE9DX1dESVNQMl8xNCAqLyBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxNjsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnRyc6Ci0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOTsKLQkgICAgICB0aGVfaW5zbi5wY3JlbCA9IDE7Ci0JICAgICAgZ290byBpbW1lZGlhdGU7Ci0KLQkgICAgY2FzZSAnTic6Ci0JICAgICAgaWYgKCpzID09ICdwJyAmJiBzWzFdID09ICduJykKLQkJewotCQkgIHMgKz0gMjsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1QnOgotCSAgICAgIGlmICgqcyA9PSAncCcgJiYgc1sxXSA9PSAndCcpCi0JCXsKLQkJICBzICs9IDI7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd6JzoKLQkgICAgICBpZiAoKnMgPT0gJyAnKQotCQl7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlaWNjIiwgNCkgPT0gMCkKLQkJewotCQkgIHMgKz0gNDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1onOgotCSAgICAgIGlmICgqcyA9PSAnICcpCi0JCXsKLQkJICArK3M7Ci0JCX0KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV4Y2MiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNic6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzAiLCA1KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA1OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnNyc6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzEiLCA1KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA1OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnOCc6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzIiLCA1KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA1OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnOSc6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJewotCQkgICsrczsKLQkJfQotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZjYzMiLCA1KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA1OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlcGMiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIldGljayIsIDUpID09IDApCi0JCXsKLQkJICBzICs9IDU7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdcMCc6CQkvKiBlbmQgb2YgYXJncyAqLwotCSAgICAgIGlmICgqcyA9PSAnXDAnKQotCQl7Ci0JCSAgbWF0Y2ggPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnKyc6Ci0JICAgICAgaWYgKCpzID09ICcrJykKLQkJewotCQkgICsrczsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmICgqcyA9PSAnLScpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1snOgkJLyogdGhlc2UgbXVzdCBtYXRjaCBleGFjdGx5ICovCi0JICAgIGNhc2UgJ10nOgotCSAgICBjYXNlICcsJzoKLQkgICAgY2FzZSAnICc6Ci0JICAgICAgaWYgKCpzKysgPT0gKmFyZ3MpCi0JCWNvbnRpbnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJyMnOgkJLyogbXVzdCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgKi8KLQkgICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKyspKQotCQl7Ci0JCSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCSAgICB7Ci0JCSAgICAgICsrczsKLQkJICAgIH0KLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0MnOgkJLyogY29wcm9jZXNzb3Igc3RhdGUgcmVnaXN0ZXIgKi8KLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVjc3IiLCA0KSA9PSAwKQotCQl7Ci0JCSAgcyArPSA0OwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnYic6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBjb3Byb2Nlc3NvciByZWdpc3RlciAqLwotCSAgICBjYXNlICdjJzoKLQkgICAgY2FzZSAnRCc6Ci0JICAgICAgaWYgKCpzKysgPT0gJyUnICYmICpzKysgPT0gJ2MnICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCXsKLQkJICBtYXNrID0gKnMrKzsKLQkJICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKSkKLQkJICAgIHsKLQkJICAgICAgbWFzayA9IDEwICogKG1hc2sgLSAnMCcpICsgKCpzKysgLSAnMCcpOwotCQkgICAgICBpZiAobWFzayA+PSAzMikKLQkJCXsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBtYXNrIC09ICcwJzsKLQkJICAgIH0KLQkJICBzd2l0Y2ggKCphcmdzKQotCQkgICAgewotCi0JCSAgICBjYXNlICdiJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTQ7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdjJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2s7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdEJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjU7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAncic6CQkvKiBuZXh0IG9wZXJhbmQgbXVzdCBiZSBhIHJlZ2lzdGVyICovCi0JICAgIGNhc2UgJ08nOgotCSAgICBjYXNlICcxJzoKLQkgICAgY2FzZSAnMic6Ci0JICAgIGNhc2UgJ2QnOgotCSAgICAgIGlmICgqcysrID09ICclJykKLQkJewotCQkgIHN3aXRjaCAoYyA9ICpzKyspCi0JCSAgICB7Ci0KLQkJICAgIGNhc2UgJ2YnOgkvKiBmcmFtZSBwb2ludGVyICovCi0JCSAgICAgIGlmICgqcysrID09ICdwJykKLQkJCXsKLQkJCSAgbWFzayA9IDB4MWU7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdnJzoJLyogZ2xvYmFsIHJlZ2lzdGVyICovCi0JCSAgICAgIGMgPSAqcysrOwotCQkgICAgICBpZiAoaXNvY3RhbCAoYykpCi0JCQl7Ci0JCQkgIG1hc2sgPSBjIC0gJzAnOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAnaSc6CS8qIGluIHJlZ2lzdGVyICovCi0JCSAgICAgIGMgPSAqcysrOwotCQkgICAgICBpZiAoaXNvY3RhbCAoYykpCi0JCQl7Ci0JCQkgIG1hc2sgPSBjIC0gJzAnICsgMjQ7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBnb3RvIGVycm9yOwotCi0JCSAgICBjYXNlICdsJzoJLyogbG9jYWwgcmVnaXN0ZXIgKi8KLQkJICAgICAgYyA9ICpzKys7Ci0JCSAgICAgIGlmIChpc29jdGFsIChjKSkKLQkJCXsKLQkJCSAgbWFzayA9IChjIC0gJzAnICsgMTYpOwotCQkJICBicmVhazsKLQkJCX0KLQkJICAgICAgZ290byBlcnJvcjsKLQotCQkgICAgY2FzZSAnbyc6CS8qIG91dCByZWdpc3RlciAqLwotCQkgICAgICBjID0gKnMrKzsKLQkJICAgICAgaWYgKGlzb2N0YWwgKGMpKQotCQkJewotCQkJICBtYXNrID0gKGMgLSAnMCcgKyA4KTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ3MnOgkvKiBzdGFjayBwb2ludGVyICovCi0JCSAgICAgIGlmICgqcysrID09ICdwJykKLQkJCXsKLQkJCSAgbWFzayA9IDB4ZTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0KLQkJICAgIGNhc2UgJ3InOgkvKiBhbnkgcmVnaXN0ZXIgKi8KLQkJICAgICAgaWYgKCFpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKGMgPSAqcysrKSkpCi0JCQl7Ci0JCQkgIGdvdG8gZXJyb3I7Ci0JCQl9Ci0JCSAgICAgIC8qIEZBTExUSFJPVUdIICovCi0JCSAgICBjYXNlICcwJzoKLQkJICAgIGNhc2UgJzEnOgotCQkgICAgY2FzZSAnMic6Ci0JCSAgICBjYXNlICczJzoKLQkJICAgIGNhc2UgJzQnOgotCQkgICAgY2FzZSAnNSc6Ci0JCSAgICBjYXNlICc2JzoKLQkJICAgIGNhc2UgJzcnOgotCQkgICAgY2FzZSAnOCc6Ci0JCSAgICBjYXNlICc5JzoKLQkJICAgICAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JCQl7Ci0JCQkgIGlmICgoYyA9IDEwICogKGMgLSAnMCcpICsgKCpzKysgLSAnMCcpKSA+PSAzMikKLQkJCSAgICB7Ci0JCQkgICAgICBnb3RvIGVycm9yOwotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBjIC09ICcwJzsKLQkJCX0KLQkJICAgICAgbWFzayA9IGM7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBkZWZhdWx0OgotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCi0JCSAgLyogR290IHRoZSByZWdpc3Rlciwgbm93IGZpZ3VyZSBvdXQgd2hlcmUKLQkJICAgICBpdCBnb2VzIGluIHRoZSBvcGNvZGUuICAqLwotCQkgIHN3aXRjaCAoKmFyZ3MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICcxJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMTQ7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICcyJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2s7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdkJzoKLQkJICAgICAgb3Bjb2RlIHw9IG1hc2sgPDwgMjU7Ci0JCSAgICAgIGNvbnRpbnVlOwotCi0JCSAgICBjYXNlICdyJzoKLQkJICAgICAgb3Bjb2RlIHw9IChtYXNrIDw8IDI1KSB8IChtYXNrIDw8IDE0KTsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ08nOgotCQkgICAgICBvcGNvZGUgfD0gKG1hc2sgPDwgMjUpIHwgKG1hc2sgPDwgMCk7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnZSc6CQkvKiBuZXh0IG9wZXJhbmQgaXMgYSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAqLwotCSAgICBjYXNlICd2JzoKLQkgICAgY2FzZSAnVic6Ci0KLQkgICAgY2FzZSAnZic6Ci0JICAgIGNhc2UgJ0InOgotCSAgICBjYXNlICdSJzoKLQotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnSCc6Ci0JICAgIGNhc2UgJ0onOgotCSAgICAgIHsKLQkJY2hhciBmb3JtYXQ7Ci0KLQkJaWYgKCpzKysgPT0gJyUnCi0JCSAgICAmJiAoKGZvcm1hdCA9ICpzKSA9PSAnZicpCi0JCSAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKisrcykpCi0JCSAgewotCQkgICAgZm9yIChtYXNrID0gMDsgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzKTsgKytzKQotCQkgICAgICB7Ci0JCQltYXNrID0gMTAgKiBtYXNrICsgKCpzIC0gJzAnKTsKLQkJICAgICAgfQkJLyogcmVhZCB0aGUgbnVtYmVyICovCi0KLQkJICAgIGlmICgoKmFyZ3MgPT0gJ3YnCi0JCQkgfHwgKmFyZ3MgPT0gJ0InCi0JCQkgfHwgKmFyZ3MgPT0gJ0gnKQotCQkJJiYgKG1hc2sgJiAxKSkKLQkJICAgICAgewotCQkJYnJlYWs7Ci0JCSAgICAgIH0JCS8qIHJlZ2lzdGVyIG11c3QgYmUgZXZlbiBudW1iZXJlZCAqLwotCi0JCSAgICBpZiAoKCphcmdzID09ICdWJwotCQkJIHx8ICphcmdzID09ICdSJwotCQkJIHx8ICphcmdzID09ICdKJykKLQkJCSYmIChtYXNrICYgMykpCi0JCSAgICAgIHsKLQkJCWJyZWFrOwotCQkgICAgICB9CQkvKiByZWdpc3RlciBtdXN0IGJlIG11bHRpcGxlIG9mIDQgKi8KLQotCQkgICAgaWYgKG1hc2sgPj0gNjQpCi0JCSAgICAgIHsKLQkJCWlmIChTUEFSQ19PUENPREVfQVJDSF9WOV9QIChtYXhfYXJjaGl0ZWN0dXJlKSkKLQkJCSAgZXJyb3JfbWVzc2FnZSA9IF8oIjogVGhlcmUgYXJlIG9ubHkgNjQgZiByZWdpc3RlcnM7IFswLTYzXSIpOwotCQkJZWxzZQotCQkJICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9CS8qIG9uIGVycm9yICovCi0JCSAgICBlbHNlIGlmIChtYXNrID49IDMyKQotCQkgICAgICB7Ci0JCQlpZiAoU1BBUkNfT1BDT0RFX0FSQ0hfVjlfUCAobWF4X2FyY2hpdGVjdHVyZSkpCi0JCQkgIHsKLQkJCSAgICB2OV9hcmdfcCA9IDE7Ci0JCQkgICAgbWFzayAtPSAzMTsJLyogd3JhcCBoaWdoIGJpdCAqLwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIHsKLQkJCSAgICBlcnJvcl9tZXNzYWdlID0gXygiOiBUaGVyZSBhcmUgb25seSAzMiBmIHJlZ2lzdGVyczsgWzAtMzFdIik7Ci0JCQkgICAgZ290byBlcnJvcjsKLQkJCSAgfQotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgYnJlYWs7Ci0JCSAgfQkvKiBpZiBub3QgYW4gJ2YnIHJlZ2lzdGVyLiAqLwotCi0JCXN3aXRjaCAoKmFyZ3MpCi0JCSAgewotCQkgIGNhc2UgJ3YnOgotCQkgIGNhc2UgJ1YnOgotCQkgIGNhc2UgJ2UnOgotCQkgICAgb3Bjb2RlIHw9IFJTMSAobWFzayk7Ci0JCSAgICBjb250aW51ZTsKLQotCi0JCSAgY2FzZSAnZic6Ci0JCSAgY2FzZSAnQic6Ci0JCSAgY2FzZSAnUic6Ci0JCSAgICBvcGNvZGUgfD0gUlMyIChtYXNrKTsKLQkJICAgIGNvbnRpbnVlOwotCi0JCSAgY2FzZSAnZyc6Ci0JCSAgY2FzZSAnSCc6Ci0JCSAgY2FzZSAnSic6Ci0JCSAgICBvcGNvZGUgfD0gUkQgKG1hc2spOwotCQkgICAgY29udGludWU7Ci0JCSAgfQkJLyogcGFjayBpdCBpbi4gKi8KLQotCQlrbm93ICgwKTsKLQkJYnJlYWs7Ci0JICAgICAgfQkJCS8qIGZsb2F0IGFyZyAqLwotCi0JICAgIGNhc2UgJ0YnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWZzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICcwJzoJCS8qIDY0IGJpdCBpbW1lZGlhdGUgKHNldCwgc2V0c3csIHNldHggaW5zbikgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19OT05FOyAvKiByZWxvYyBoYW5kbGVkIGVsc2V3aGVyZSAqLwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ2wnOgkJLyogMjIgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DX1NQQVJDX1dESVNQMjI7Ci0JICAgICAgdGhlX2luc24ucGNyZWwgPSAxOwotCSAgICAgIGdvdG8gaW1tZWRpYXRlOwotCi0JICAgIGNhc2UgJ0wnOgkJLyogMzAgYml0IGltbWVkaWF0ZSAqLwotCSAgICAgIHRoZV9pbnNuLnJlbG9jID0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyOwotCSAgICAgIHRoZV9pbnNuLnBjcmVsID0gMTsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdoJzoKLQkgICAgY2FzZSAnbic6CQkvKiAyMiBiaXQgaW1tZWRpYXRlICovCi0JICAgICAgdGhlX2luc24ucmVsb2MgPSBCRkRfUkVMT0NfU1BBUkMyMjsKLQkgICAgICBnb3RvIGltbWVkaWF0ZTsKLQotCSAgICBjYXNlICdpJzoJCS8qIDEzIGJpdCBpbW1lZGlhdGUgKi8KLQkgICAgICB0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQzEzOwotCi0JICAgICAgLyogZmFsbHRocm91Z2ggKi8KLQotCSAgICBpbW1lZGlhdGU6Ci0JICAgICAgaWYgKCpzID09ICcgJykKLQkJcysrOwotCi0JICAgICAgewotCQljaGFyICpzMTsKLQkJY2hhciAqb3BfYXJnID0gTlVMTDsKLQkJZXhwcmVzc2lvblMgb3BfZXhwOwotCQliZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgb2xkX3JlbG9jID0gdGhlX2luc24ucmVsb2M7Ci0KLQkJLyogQ2hlY2sgZm9yICVoaSwgZXRjLiAgKi8KLQkJaWYgKCpzID09ICclJykKLQkJICB7Ci0JCSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IG9wcyB7Ci0JCSAgICAgIC8qIFRoZSBuYW1lIGFzIGl0IGFwcGVhcnMgaW4gYXNzZW1ibGVyLiAgKi8KLQkJICAgICAgY2hhciAqbmFtZTsKLQkJICAgICAgLyogc3RybGVuIChuYW1lKSwgcHJlY29tcHV0ZWQgZm9yIHNwZWVkICovCi0JCSAgICAgIGludCBsZW47Ci0JCSAgICAgIC8qIFRoZSByZWxvYyB0aGlzIHBzZXVkby1vcCB0cmFuc2xhdGVzIHRvLiAgKi8KLQkJICAgICAgaW50IHJlbG9jOwotCQkgICAgICAvKiBOb24temVybyBpZiBmb3Igdjkgb25seS4gICovCi0JCSAgICAgIGludCB2OV9wOwotCQkgICAgICAvKiBOb24temVybyBpZiBjYW4gYmUgdXNlZCBpbiBwYy1yZWxhdGl2ZSBjb250ZXh0cy4gICovCi0JCSAgICAgIGludCBwY3JlbF9wOy8qRklYTUU6d2lwKi8KLQkJICAgIH0gb3BzW10gPSB7Ci0JCSAgICAgIC8qIGhpeC9sb3ggbXVzdCBhcHBlYXIgYmVmb3JlIGhpL2xvIHNvICVoaXggd29uJ3QgYmUKLQkJCSBtaXN0YWtlbiBmb3IgJWhpLiAgKi8KLQkJICAgICAgeyAiaGl4IiwgMywgQkZEX1JFTE9DX1NQQVJDX0hJWDIyLCAxLCAwIH0sCi0JCSAgICAgIHsgImxveCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19MT1gxMCwgMSwgMCB9LAotCQkgICAgICB7ICJoaSIsIDIsIEJGRF9SRUxPQ19ISTIyLCAwLCAxIH0sCi0JCSAgICAgIHsgImxvIiwgMiwgQkZEX1JFTE9DX0xPMTAsIDAsIDEgfSwKLQkJICAgICAgeyAiaGgiLCAyLCBCRkRfUkVMT0NfU1BBUkNfSEgyMiwgMSwgMSB9LAotCQkgICAgICB7ICJobSIsIDIsIEJGRF9SRUxPQ19TUEFSQ19ITTEwLCAxLCAxIH0sCi0JCSAgICAgIHsgImxtIiwgMiwgQkZEX1JFTE9DX1NQQVJDX0xNMjIsIDEsIDEgfSwKLQkJICAgICAgeyAiaDQ0IiwgMywgQkZEX1JFTE9DX1NQQVJDX0g0NCwgMSwgMCB9LAotCQkgICAgICB7ICJtNDQiLCAzLCBCRkRfUkVMT0NfU1BBUkNfTTQ0LCAxLCAwIH0sCi0JCSAgICAgIHsgImw0NCIsIDMsIEJGRF9SRUxPQ19TUEFSQ19MNDQsIDEsIDAgfSwKLQkJICAgICAgeyAidWhpIiwgMywgQkZEX1JFTE9DX1NQQVJDX0hIMjIsIDEsIDAgfSwKLQkJICAgICAgeyAidWxvIiwgMywgQkZEX1JFTE9DX1NQQVJDX0hNMTAsIDEsIDAgfSwKLQkJICAgICAgeyBOVUxMIH0KLQkJICAgIH07Ci0JCSAgICBjb25zdCBzdHJ1Y3Qgb3BzICpvOwotICAKLQkJICAgIGZvciAobyA9IG9wczsgby0+bmFtZTsgbysrKQotCQkgICAgICBpZiAoc3RybmNtcCAocyArIDEsIG8tPm5hbWUsIG8tPmxlbikgPT0gMCkKLQkJCWJyZWFrOwotCQkgICAgaWYgKG8tPm5hbWUgPT0gTlVMTCkKLQkJICAgICAgYnJlYWs7Ci0JCSAgICAgIAotCQkgICAgaWYgKHNbby0+bGVuICsgMV0gIT0gJygnKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6ICUlJXMgcmVxdWlyZXMgYXJndW1lbnRzIGluICgpIiksIG8tPm5hbWUpOwotCQkJcmV0dXJuIHNwZWNpYWxfY2FzZTsKLQkJICAgICAgfQotCi0JCSAgICBvcF9hcmcgPSBvLT5uYW1lOwotCQkgICAgdGhlX2luc24ucmVsb2MgPSBvLT5yZWxvYzsKLQkJICAgIHMgKz0gby0+bGVuICsgMjsKLQkJICAgIHY5X2FyZ19wID0gby0+djlfcDsKLQkJICB9Ci0KLQkJLyogTm90ZSB0aGF0IGlmIHRoZSBnZXRfZXhwcmVzc2lvbigpIGZhaWxzLCB3ZSB3aWxsIHN0aWxsCi0JCSAgIGhhdmUgY3JlYXRlZCBVIGVudHJpZXMgaW4gdGhlIHN5bWJvbCB0YWJsZSBmb3IgdGhlCi0JCSAgICdzeW1ib2xzJyBpbiB0aGUgaW5wdXQgc3RyaW5nLiAgVHJ5IG5vdCB0byBjcmVhdGUgVQotCQkgICBzeW1ib2xzIGZvciByZWdpc3RlcnMsIGV0Yy4gICovCi0KLQkJLyogVGhpcyBzdHVmZiBjaGVja3MgdG8gc2VlIGlmIHRoZSBleHByZXNzaW9uIGVuZHMgaW4KLQkJICAgKyVyZWcuICBJZiBpdCBkb2VzLCBpdCByZW1vdmVzIHRoZSByZWdpc3RlciBmcm9tCi0JCSAgIHRoZSBleHByZXNzaW9uLCBhbmQgcmUtc2V0cyAncycgdG8gcG9pbnQgdG8gdGhlCi0JCSAgIHJpZ2h0IHBsYWNlLiAgKi8KLQotCQlpZiAob3BfYXJnKQotCQkgIHsKLQkJICAgIGludCBucGFyID0gMDsKLQotCQkgICAgZm9yIChzMSA9IHM7ICpzMSAmJiAqczEgIT0gJywnICYmICpzMSAhPSAnXSc7IHMxKyspCi0JCSAgICAgIGlmICgqczEgPT0gJygnKQotCQkJbnBhcisrOwotCQkgICAgICBlbHNlIGlmICgqczEgPT0gJyknKQotCQkJewotCQkJICBpZiAoIW5wYXIpCi0JCQkgICAgYnJlYWs7Ci0JCQkgIG5wYXItLTsKLQkJCX0KLQotCQkgICAgaWYgKCpzMSAhPSAnKScpCi0JCSAgICAgIHsKLQkJCWFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kczogJSUlcyByZXF1aXJlcyBhcmd1bWVudHMgaW4gKCkiKSwgb3BfYXJnKTsKLQkJCXJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JCSAgICAgIH0KLQkJICAgIAotCQkgICAgKnMxID0gJ1wwJzsKLQkJICAgICh2b2lkKSBnZXRfZXhwcmVzc2lvbiAocyk7Ci0JCSAgICAqczEgPSAnKSc7Ci0JCSAgICBzID0gczEgKyAxOwotCQkgICAgaWYgKCpzID09ICcsJyB8fCAqcyA9PSAnXScgfHwgISpzKQotCQkgICAgICBjb250aW51ZTsKLQkJICAgIGlmICgqcyAhPSAnKycgJiYgKnMgIT0gJy0nKQotCQkgICAgICB7Ci0JCQlhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6IENhbid0IGRvIGFyaXRobWV0aWNzIG90aGVyIHRoYW4gKyBhbmQgLSBpbnZvbHZpbmcgJSUlcygpIiksIG9wX2FyZyk7Ci0JCQlyZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkgICAgICB9Ci0JCSAgICAqczEgPSAnMCc7Ci0JCSAgICBzID0gczE7Ci0JCSAgICBvcF9leHAgPSB0aGVfaW5zbi5leHA7Ci0JCSAgICBtZW1zZXQgKCZ0aGVfaW5zbi5leHAsIDAsIHNpemVvZih0aGVfaW5zbi5leHApKTsKLQkJICB9Ci0KLQkJZm9yIChzMSA9IHM7ICpzMSAmJiAqczEgIT0gJywnICYmICpzMSAhPSAnXSc7IHMxKyspIDsKLQotCQlpZiAoczEgIT0gcyAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgczFbLTFdKSkKLQkJICB7Ci0JCSAgICBpZiAoczFbLTJdID09ICclJyAmJiBzMVstM10gPT0gJysnKQotCQkgICAgICBzMSAtPSAzOwotCQkgICAgZWxzZSBpZiAoc3RyY2hyICgiZ29saTAxMjM0NTY3ODkiLCBzMVstMl0pICYmIHMxWy0zXSA9PSAnJScgJiYgczFbLTRdID09ICcrJykKLQkJICAgICAgczEgLT0gNDsKLQkJICAgIGVsc2UKLQkJICAgICAgczEgPSBOVUxMOwotCQkgICAgaWYgKHMxKQotCQkgICAgICB7Ci0JCQkqczEgPSAnXDAnOwotCQkJKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJCSpzMSA9ICcrJzsKLQkJCWlmIChvcF9hcmcpCi0JCQkgICpzID0gJyknOwotCQkJcyA9IHMxOwotCQkgICAgICB9Ci0JCSAgfQotCQllbHNlCi0JCSAgczEgPSBOVUxMOwotCi0JCWlmICghczEpCi0JCSAgewotCQkgICAgKHZvaWQpIGdldF9leHByZXNzaW9uIChzKTsKLQkJICAgIGlmIChvcF9hcmcpCi0JCSAgICAgICpzID0gJyknOwotCQkgICAgcyA9IGV4cHJfZW5kOwotCQkgIH0KLQotCQlpZiAob3BfYXJnKQotCQkgIHsKLQkJICAgIHRoZV9pbnNuLmV4cDIgPSB0aGVfaW5zbi5leHA7Ci0JCSAgICB0aGVfaW5zbi5leHAgPSBvcF9leHA7Ci0JCSAgICBpZiAodGhlX2luc24uZXhwMi5YX29wID09IE9fYWJzZW50KQotCQkgICAgICB0aGVfaW5zbi5leHAyLlhfb3AgPSBPX2lsbGVnYWw7Ci0JCSAgICBlbHNlIGlmICh0aGVfaW5zbi5leHAuWF9vcCA9PSBPX2Fic2VudCkKLQkJICAgICAgewotCQkJdGhlX2luc24uZXhwID0gdGhlX2luc24uZXhwMjsKLQkJCXRoZV9pbnNuLmV4cDIuWF9vcCA9IE9faWxsZWdhbDsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAodGhlX2luc24uZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJdmFsdWVUIHZhbCA9IHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXI7Ci0JCQlzd2l0Y2ggKHRoZV9pbnNuLnJlbG9jKQotCQkJICB7Ci0JCQkgIGRlZmF1bHQ6Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSEgyMjoKLQkJCSAgICB2YWwgPSBCU1IgKHZhbCwgMzIpOwotCQkJICAgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE0yMjoKLQkJCSAgY2FzZSBCRkRfUkVMT0NfSEkyMjoKLQkJCSAgICB2YWwgPSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hNMTA6Ci0JCQkgICAgdmFsID0gQlNSICh2YWwsIDMyKTsKLQkJCSAgICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX0xPMTA6Ci0JCQkgICAgdmFsICY9IDB4M2ZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKLQkJCSAgICB2YWwgPj49IDIyOwotCQkJICAgIHZhbCAmPSAweDNmZmZmZjsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6Ci0JCQkgICAgdmFsID4+PSAxMjsKLQkJCSAgICB2YWwgJj0gMHgzZmY7Ci0JCQkgICAgYnJlYWs7Ci0KLQkJCSAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTDQ0OgotCQkJICAgIHZhbCAmPSAweGZmZjsKLQkJCSAgICBicmVhazsKLQotCQkJICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19ISVgyMjoKLQkJCSAgICB2YWwgPSB+IHZhbDsKLQkJCSAgICB2YWwgPSAodmFsID4+IDEwKSAmIDB4M2ZmZmZmOwotCQkJICAgIGJyZWFrOwotCi0JCQkgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0xPWDEwOgotCQkJICAgIHZhbCA9ICh2YWwgJiAweDNmZikgfCAweDFjMDA7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkJCXRoZV9pbnNuLmV4cCA9IHRoZV9pbnNuLmV4cDI7Ci0JCQl0aGVfaW5zbi5leHAuWF9hZGRfbnVtYmVyICs9IHZhbDsKLQkJCXRoZV9pbnNuLmV4cDIuWF9vcCA9IE9faWxsZWdhbDsKLQkJCXRoZV9pbnNuLnJlbG9jID0gb2xkX3JlbG9jOwotCQkgICAgICB9Ci0JCSAgICBlbHNlIGlmICh0aGVfaW5zbi5leHAyLlhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgICAgewotCQkJYXNfYmFkIChfKCJJbGxlZ2FsIG9wZXJhbmRzOiBDYW4ndCBhZGQgbm9uLWNvbnN0YW50IGV4cHJlc3Npb24gdG8gJSUlcygpIiksIG9wX2FyZyk7Ci0JCQlyZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkgICAgICB9Ci0JCSAgICBlbHNlCi0JCSAgICAgIHsKLQkJCWlmICgxIHx8IG9sZF9yZWxvYyAhPSBCRkRfUkVMT0NfU1BBUkMxMwotCQkJICAgIHx8IHRoZV9pbnNuLnJlbG9jICE9IEJGRF9SRUxPQ19MTzEwCi0JCQkgICAgfHwgc3BhcmNfYXJjaF9zaXplICE9IDY0Ci0JCQkgICAgfHwgc3BhcmNfcGljX2NvZGUpCi0JCQkgIHsKLQkJCSAgICBhc19iYWQgKF8oIklsbGVnYWwgb3BlcmFuZHM6IENhbid0IGRvIGFyaXRobWV0aWNzIGludm9sdmluZyAlJSVzKCkgb2YgYSByZWxvY2F0YWJsZSBzeW1ib2wiKSwgb3BfYXJnKTsKLQkJCSAgICByZXR1cm4gc3BlY2lhbF9jYXNlOwotCQkJICB9Ci0JCQl0aGVfaW5zbi5yZWxvYyA9IEJGRF9SRUxPQ19TUEFSQ19PTE8xMDsKLQkJICAgICAgfQotCQkgIH0KLQkgICAgICB9Ci0JICAgICAgLyogQ2hlY2sgZm9yIGNvbnN0YW50cyB0aGF0IGRvbid0IHJlcXVpcmUgZW1pdHRpbmcgYSByZWxvYy4gICovCi0JICAgICAgaWYgKHRoZV9pbnNuLmV4cC5YX29wID09IE9fY29uc3RhbnQKLQkJICAmJiB0aGVfaW5zbi5leHAuWF9hZGRfc3ltYm9sID09IDAKLQkJICAmJiB0aGVfaW5zbi5leHAuWF9vcF9zeW1ib2wgPT0gMCkKLQkJewotCQkgIC8qIEZvciBwYy1yZWxhdGl2ZSBjYWxsIGluc3RydWN0aW9ucywgd2UgcmVqZWN0Ci0JCSAgICAgY29uc3RhbnRzIHRvIGdldCBiZXR0ZXIgY29kZS4gICovCi0JCSAgaWYgKHRoZV9pbnNuLnBjcmVsCi0JCSAgICAgICYmIHRoZV9pbnNuLnJlbG9jID09IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMgotCQkgICAgICAmJiBpbl9zaWduZWRfcmFuZ2UgKHRoZV9pbnNuLmV4cC5YX2FkZF9udW1iZXIsIDB4M2ZmZikpCi0JCSAgICB7Ci0JCSAgICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IFBDLXJlbGF0aXZlIG9wZXJhbmQgY2FuJ3QgYmUgYSBjb25zdGFudCIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCi0JCSAgLyogQ29uc3RhbnRzIHRoYXQgd29uJ3QgZml0IGFyZSBjaGVja2VkIGluIG1kX2FwcGx5X2ZpeDMKLQkJICAgICBhbmQgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4KLQkJICAgICA/Pz8gSXQgd291bGQgYmUgcHJlZmVyYWJsZSB0byBpbnN0YWxsIHRoZSBjb25zdGFudHMKLQkJICAgICBpbnRvIHRoZSBpbnNuIGhlcmUgYW5kIHNhdmUgaGF2aW5nIHRvIGNyZWF0ZSBhIGZpeFMKLQkJICAgICBmb3IgZWFjaCBvbmUuICBUaGVyZSBhbHJlYWR5IGV4aXN0cyBjb2RlIHRvIGhhbmRsZQotCQkgICAgIGFsbCB0aGUgdmFyaW91cyBjYXNlcyAoZS5nLiBpbiBtZF9hcHBseV9maXgzIGFuZAotCQkgICAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24pIHNvIGR1cGxpY2F0aW5nIGFsbCB0aGF0IGNvZGUKLQkJICAgICBoZXJlIGlzbid0IHJpZ2h0LiAgKi8KLQkJfQotCi0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgaWYgKCpzKysgPT0gJ2EnKQotCQl7Ci0JCSAgb3Bjb2RlIHw9IEFOTlVMOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnQSc6Ci0JICAgICAgewotCQlpbnQgYXNpID0gMDsKLQotCQkvKiBQYXJzZSBhbiBhc2kuICAqLwotCQlpZiAoKnMgPT0gJyMnKQotCQkgIHsKLQkJICAgIGlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfYXNpLCAmcywgJmFzaSkpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgQVNJIG5hbWUiKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAoISBwYXJzZV9jb25zdF9leHByX2FyZyAoJnMsICZhc2kpKQotCQkgICAgICB7Ci0JCQllcnJvcl9tZXNzYWdlID0gXygiOiBpbnZhbGlkIEFTSSBleHByZXNzaW9uIik7Ci0JCQlnb3RvIGVycm9yOwotCQkgICAgICB9Ci0JCSAgICBpZiAoYXNpIDwgMCB8fCBhc2kgPiAyNTUpCi0JCSAgICAgIHsKLQkJCWVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgQVNJIG51bWJlciIpOwotCQkJZ290byBlcnJvcjsKLQkJICAgICAgfQotCQkgIH0KLQkJb3Bjb2RlIHw9IEFTSSAoYXNpKTsKLQkJY29udGludWU7Ci0JICAgICAgfQkJCS8qIGFsdGVybmF0ZSBzcGFjZSAqLwotCi0JICAgIGNhc2UgJ3AnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXBzciIsIDQpID09IDApCi0JCXsKLQkJICBzICs9IDQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdxJzoJCS8qIGZsb2F0aW5nIHBvaW50IHF1ZXVlICovCi0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnEiLCAzKSA9PSAwKQotCQl7Ci0JCSAgcyArPSAzOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUSc6CQkvKiBjb3Byb2Nlc3NvciBxdWV1ZSAqLwotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJWNxIiwgMykgPT0gMCkKLQkJewotCQkgIHMgKz0gMzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ1MnOgotCSAgICAgIGlmIChzdHJjbXAgKHN0ciwgInNldCIpID09IDAKLQkJICB8fCBzdHJjbXAgKHN0ciwgInNldHV3IikgPT0gMCkKLQkJewotCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9TRVQ7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChzdHJjbXAgKHN0ciwgInNldHN3IikgPT0gMCkKLQkJewotCQkgIHNwZWNpYWxfY2FzZSA9IFNQRUNJQUxfQ0FTRV9TRVRTVzsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAoc3RyLCAic2V0eCIpID09IDApCi0JCXsKLQkJICBzcGVjaWFsX2Nhc2UgPSBTUEVDSUFMX0NBU0VfU0VUWDsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cm5jbXAgKHN0ciwgImZkaXYiLCA0KSA9PSAwKQotCQl7Ci0JCSAgc3BlY2lhbF9jYXNlID0gU1BFQ0lBTF9DQVNFX0ZESVY7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdvJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVhc2kiLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAncyc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIlZnBycyIsIDUpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNTsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICdFJzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiVjY3IiLCA0KSAhPSAwKQotCQlicmVhazsKLQkgICAgICBzICs9IDQ7Ci0JICAgICAgY29udGludWU7Ci0KLQkgICAgY2FzZSAndCc6Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICIldGJyIiwgNCkgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSA0OwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3cnOgotCSAgICAgIGlmIChzdHJuY21wIChzLCAiJXdpbSIsIDQpICE9IDApCi0JCWJyZWFrOwotCSAgICAgIHMgKz0gNDsKLQkgICAgICBjb250aW51ZTsKLQotCSAgICBjYXNlICd4JzoKLQkgICAgICB7Ci0JCWNoYXIgKnB1c2ggPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCWV4cHJlc3Npb25TIGU7Ci0KLQkJaW5wdXRfbGluZV9wb2ludGVyID0gczsKLQkJZXhwcmVzc2lvbiAoJmUpOwotCQlpZiAoZS5YX29wID09IE9fY29uc3RhbnQpCi0JCSAgewotCQkgICAgaW50IG4gPSBlLlhfYWRkX251bWJlcjsKLQkJICAgIGlmIChuICE9IGUuWF9hZGRfbnVtYmVyIHx8IChuICYgfjB4MWZmKSAhPSAwKQotCQkgICAgICBhc19iYWQgKF8oIk9QRiBpbW1lZGlhdGUgb3BlcmFuZCBvdXQgb2YgcmFuZ2UgKDAtMHgxZmYpIikpOwotCQkgICAgZWxzZQotCQkgICAgICBvcGNvZGUgfD0gZS5YX2FkZF9udW1iZXIgPDwgNTsKLQkJICB9Ci0JCWVsc2UKLQkJICBhc19iYWQgKF8oIm5vbi1pbW1lZGlhdGUgT1BGIG9wZXJhbmQsIGlnbm9yZWQiKSk7Ci0JCXMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCWlucHV0X2xpbmVfcG9pbnRlciA9IHB1c2g7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQotCSAgICBjYXNlICd5JzoKLQkgICAgICBpZiAoc3RybmNtcCAocywgIiV5IiwgMikgIT0gMCkKLQkJYnJlYWs7Ci0JICAgICAgcyArPSAyOwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAgIGNhc2UgJ3UnOgotCSAgICBjYXNlICdVJzoKLQkgICAgICB7Ci0JCS8qIFBhcnNlIGEgc3BhcmNsZXQgY3ByZWcuICAqLwotCQlpbnQgY3ByZWc7Ci0JCWlmICghIHBhcnNlX2tleXdvcmRfYXJnIChzcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcsICZzLCAmY3ByZWcpKQotCQkgIHsKLQkJICAgIGVycm9yX21lc3NhZ2UgPSBfKCI6IGludmFsaWQgY3ByZWcgbmFtZSIpOwotCQkgICAgZ290byBlcnJvcjsKLQkJICB9Ci0JCW9wY29kZSB8PSAoKmFyZ3MgPT0gJ1UnID8gUlMxIChjcHJlZykgOiBSRCAoY3ByZWcpKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYXNfZmF0YWwgKF8oImZhaWxlZCBzYW5pdHkgY2hlY2suIikpOwotCSAgICB9CQkJLyogc3dpdGNoIG9uIGFyZyBjb2RlICovCi0KLQkgIC8qIEJyZWFrIG91dCBvZiBmb3IoKSBsb29wLiAgKi8KLQkgIGJyZWFrOwotCX0JCQkvKiBmb3IgZWFjaCBhcmcgdGhhdCB3ZSBleHBlY3QgKi8KLQotICAgIGVycm9yOgotICAgICAgaWYgKG1hdGNoID09IDApCi0JewotCSAgLyogQXJncyBkb24ndCBtYXRjaC4gKi8KLQkgIGlmICgmaW5zblsxXSAtIHNwYXJjX29wY29kZXMgPCBzcGFyY19udW1fb3Bjb2RlcwotCSAgICAgICYmIChpbnNuLT5uYW1lID09IGluc25bMV0ubmFtZQotCQkgIHx8ICFzdHJjbXAgKGluc24tPm5hbWUsIGluc25bMV0ubmFtZSkpKQotCSAgICB7Ci0JICAgICAgKytpbnNuOwotCSAgICAgIHMgPSBhcmdzU3RhcnQ7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiSWxsZWdhbCBvcGVyYW5kcyVzIiksIGVycm9yX21lc3NhZ2UpOwotCSAgICAgIHJldHVybiBzcGVjaWFsX2Nhc2U7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2UgaGF2ZSBhIG1hdGNoLiAgTm93IHNlZSBpZiB0aGUgYXJjaGl0ZWN0dXJlIGlzIG9rLiAgKi8KLQkgIGludCBuZWVkZWRfYXJjaF9tYXNrID0gaW5zbi0+YXJjaGl0ZWN0dXJlOwotCi0JICBpZiAodjlfYXJnX3ApCi0JICAgIHsKLQkgICAgICBuZWVkZWRfYXJjaF9tYXNrICY9IH4gKCgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotCQkJCSAgICAgfCAoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOUEpKTsKLQkgICAgICBuZWVkZWRfYXJjaF9tYXNrIHw9ICgxIDw8IFNQQVJDX09QQ09ERV9BUkNIX1Y5KTsKLQkgICAgfQotCi0JICBpZiAobmVlZGVkX2FyY2hfbWFzayAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKGN1cnJlbnRfYXJjaGl0ZWN0dXJlKSkKLQkgICAgOyAvKiBvayAqLwotCSAgLyogQ2FuIHdlIGJ1bXAgdXAgdGhlIGFyY2hpdGVjdHVyZT8gICovCi0JICBlbHNlIGlmIChuZWVkZWRfYXJjaF9tYXNrICYgU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAobWF4X2FyY2hpdGVjdHVyZSkpCi0JICAgIHsKLQkgICAgICBlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCBuZWVkZWRfYXJjaGl0ZWN0dXJlID0KLQkJc3BhcmNfZmZzIChTUEFSQ19PUENPREVfU1VQUE9SVEVEIChtYXhfYXJjaGl0ZWN0dXJlKQotCQkJICAgJiBuZWVkZWRfYXJjaF9tYXNrKTsKLQotCSAgICAgIGFzc2VydCAobmVlZGVkX2FyY2hpdGVjdHVyZSA8PSBTUEFSQ19PUENPREVfQVJDSF9NQVgpOwotCSAgICAgIGlmICh3YXJuX29uX2J1bXAKLQkJICAmJiBuZWVkZWRfYXJjaGl0ZWN0dXJlID4gd2Fybl9hZnRlcl9hcmNoaXRlY3R1cmUpCi0JCXsKLQkJICBhc193YXJuIChfKCJhcmNoaXRlY3R1cmUgYnVtcGVkIGZyb20gXCIlc1wiIHRvIFwiJXNcIiBvbiBcIiVzXCIiKSwKLQkJCSAgIHNwYXJjX29wY29kZV9hcmNoc1tjdXJyZW50X2FyY2hpdGVjdHVyZV0ubmFtZSwKLQkJCSAgIHNwYXJjX29wY29kZV9hcmNoc1tuZWVkZWRfYXJjaGl0ZWN0dXJlXS5uYW1lLAotCQkJICAgc3RyKTsKLQkJICB3YXJuX2FmdGVyX2FyY2hpdGVjdHVyZSA9IG5lZWRlZF9hcmNoaXRlY3R1cmU7Ci0JCX0KLQkgICAgICBjdXJyZW50X2FyY2hpdGVjdHVyZSA9IG5lZWRlZF9hcmNoaXRlY3R1cmU7Ci0JICAgIH0KLQkgIC8qIENvbmZsaWN0LiAgKi8KLQkgIC8qID8/PyBUaGlzIHNlZW1zIHRvIGJlIGEgYml0IGZyYWdpbGUuICBXaGF0IGlmIHRoZSBuZXh0IGVudHJ5IGluCi0JICAgICB0aGUgb3Bjb2RlIHRhYmxlIGlzIHRoZSBvbmUgd2Ugd2FudCBhbmQgaXQgaXMgc3VwcG9ydGVkPwotCSAgICAgSXQgaXMgcG9zc2libGUgdG8gYXJyYW5nZSB0aGUgdGFibGUgdG9kYXkgc28gdGhhdCB0aGlzIGNhbid0Ci0JICAgICBoYXBwZW4gYnV0IHdoYXQgYWJvdXQgdG9tb3Jyb3c/ICAqLwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IGFyY2gscHJpbnRlZF9vbmVfcCA9IDA7Ci0JICAgICAgY2hhciAqcDsKLQkgICAgICBjaGFyIHJlcXVpcmVkX2FyY2hzW1NQQVJDX09QQ09ERV9BUkNIX01BWCAqIDE2XTsKLQotCSAgICAgIC8qIENyZWF0ZSBhIGxpc3Qgb2YgdGhlIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IHRoZSBpbnNuLiAgKi8KLQkgICAgICBuZWVkZWRfYXJjaF9tYXNrICY9IH4gU1BBUkNfT1BDT0RFX1NVUFBPUlRFRCAobWF4X2FyY2hpdGVjdHVyZSk7Ci0JICAgICAgcCA9IHJlcXVpcmVkX2FyY2hzOwotCSAgICAgIGFyY2ggPSBzcGFyY19mZnMgKG5lZWRlZF9hcmNoX21hc2spOwotCSAgICAgIHdoaWxlICgoMSA8PCBhcmNoKSA8PSBuZWVkZWRfYXJjaF9tYXNrKQotCQl7Ci0JCSAgaWYgKCgxIDw8IGFyY2gpICYgbmVlZGVkX2FyY2hfbWFzaykKLQkJICAgIHsKLQkJICAgICAgaWYgKHByaW50ZWRfb25lX3ApCi0JCQkqcCsrID0gJ3wnOwotCQkgICAgICBzdHJjcHkgKHAsIHNwYXJjX29wY29kZV9hcmNoc1thcmNoXS5uYW1lKTsKLQkJICAgICAgcCArPSBzdHJsZW4gKHApOwotCQkgICAgICBwcmludGVkX29uZV9wID0gMTsKLQkJICAgIH0KLQkJICArK2FyY2g7Ci0JCX0KLQotCSAgICAgIGFzX2JhZCAoXygiQXJjaGl0ZWN0dXJlIG1pc21hdGNoIG9uIFwiJXNcIi4iKSwgc3RyKTsKLQkgICAgICBhc190c2t0c2sgKF8oIiAoUmVxdWlyZXMgJXM7IHJlcXVlc3RlZCBhcmNoaXRlY3R1cmUgaXMgJXMuKSIpLAotCQkJIHJlcXVpcmVkX2FyY2hzLAotCQkJIHNwYXJjX29wY29kZV9hcmNoc1ttYXhfYXJjaGl0ZWN0dXJlXS5uYW1lKTsKLQkgICAgICByZXR1cm4gc3BlY2lhbF9jYXNlOwotCSAgICB9Ci0JfSAvKiBpZiBubyBtYXRjaCAqLwotCi0gICAgICBicmVhazsKLSAgICB9IC8qIGZvcmV2ZXIgbG9va2luZyBmb3IgYSBtYXRjaCAqLwotCi0gIHRoZV9pbnNuLm9wY29kZSA9IG9wY29kZTsKLSAgcmV0dXJuIHNwZWNpYWxfY2FzZTsKLX0KLQotLyogUGFyc2UgYW4gYXJndW1lbnQgdGhhdCBjYW4gYmUgZXhwcmVzc2VkIGFzIGEga2V5d29yZC4KLSAgIChlZzogI1N0b3JlU3RvcmUgb3IgJWNjZnIpLgotICAgVGhlIHJlc3VsdCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLgotICAgSWYgc3VjY2Vzc2Z1bCwgSU5QVVRfUE9JTlRFUiBpcyB1cGRhdGVkLiAgKi8KLQotc3RhdGljIGludAotcGFyc2Vfa2V5d29yZF9hcmcgKGxvb2t1cF9mbiwgaW5wdXRfcG9pbnRlclAsIHZhbHVlUCkKLSAgICAgaW50ICgqbG9va3VwX2ZuKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLSAgICAgY2hhciAqKmlucHV0X3BvaW50ZXJQOwotICAgICBpbnQgKnZhbHVlUDsKLXsKLSAgaW50IHZhbHVlOwotICBjaGFyIGMsICpwLCAqcTsKLQotICBwID0gKmlucHV0X3BvaW50ZXJQOwotICBmb3IgKHEgPSBwICsgKCpwID09ICcjJyB8fCAqcCA9PSAnJScpOwotICAgICAgIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcSkgfHwgKnEgPT0gJ18nOwotICAgICAgICsrcSkKLSAgICBjb250aW51ZTsKLSAgYyA9ICpxOwotICAqcSA9IDA7Ci0gIHZhbHVlID0gKCpsb29rdXBfZm4pIChwKTsKLSAgKnEgPSBjOwotICBpZiAodmFsdWUgPT0gLTEpCi0gICAgcmV0dXJuIDA7Ci0gICp2YWx1ZVAgPSB2YWx1ZTsKLSAgKmlucHV0X3BvaW50ZXJQID0gcTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFBhcnNlIGFuIGFyZ3VtZW50IHRoYXQgaXMgYSBjb25zdGFudCBleHByZXNzaW9uLgotICAgVGhlIHJlc3VsdCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGludAotcGFyc2VfY29uc3RfZXhwcl9hcmcgKGlucHV0X3BvaW50ZXJQLCB2YWx1ZVApCi0gICAgIGNoYXIgKippbnB1dF9wb2ludGVyUDsKLSAgICAgaW50ICp2YWx1ZVA7Ci17Ci0gIGNoYXIgKnNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSAqaW5wdXRfcG9pbnRlclA7Ci0gIC8qIFRoZSBuZXh0IGV4cHJlc3Npb24gbWF5IGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgY29uc3RhbnQKLSAgICAgKHNheSBpZiB3ZSdyZSBub3QgcHJvY2Vzc2luZyB0aGUgcmlnaHQgdmFyaWFudCBvZiB0aGUgaW5zbikuCi0gICAgIERvbid0IGNhbGwgZXhwcmVzc2lvbiB1bmxlc3Mgd2UncmUgc3VyZSBpdCB3aWxsIHN1Y2NlZWQgYXMgaXQgd2lsbAotICAgICBzaWduYWwgYW4gZXJyb3IgKHdoaWNoIHdlIHdhbnQgdG8gZGVmZXIgdW50aWwgbGF0ZXIpLiAgKi8KLSAgLyogRklYTUU6IEl0IG1pZ2h0IGJlIGJldHRlciB0byBkZWZpbmUgbWRfb3BlcmFuZCBhbmQgaGF2ZSBpdCByZWNvZ25pemUKLSAgICAgdGhpbmdzIGxpa2UgJWFzaSwgZXRjLiBidXQgY29udGludWluZyB0aGF0IHJvdXRlIHRocm91Z2ggdG8gdGhlIGVuZAotICAgICBpcyBhIGxvdCBvZiB3b3JrLiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJyUnKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGV4cHJlc3Npb24gKCZleHApOwotICAqaW5wdXRfcG9pbnRlclAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIGlmIChleHAuWF9vcCAhPSBPX2NvbnN0YW50KQotICAgIHJldHVybiAwOwotICAqdmFsdWVQID0gZXhwLlhfYWRkX251bWJlcjsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2Ygc3BhcmNfaXAgdG8gcGFyc2UgYW4gZXhwcmVzc2lvbi4gICovCi0KLXN0YXRpYyBpbnQKLWdldF9leHByZXNzaW9uIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc2F2ZV9pbjsKLSAgc2VnVCBzZWc7Ci0KLSAgc2F2ZV9pbiA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotICBzZWcgPSBleHByZXNzaW9uICgmdGhlX2luc24uZXhwKTsKLSAgaWYgKHNlZyAhPSBhYnNvbHV0ZV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gdGV4dF9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gZGF0YV9zZWN0aW9uCi0gICAgICAmJiBzZWcgIT0gYnNzX3NlY3Rpb24KLSAgICAgICYmIHNlZyAhPSB1bmRlZmluZWRfc2VjdGlvbikKLSAgICB7Ci0gICAgICB0aGVfaW5zbi5lcnJvciA9IF8oImJhZCBzZWdtZW50Iik7Ci0gICAgICBleHByX2VuZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfaW47Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cHJfZW5kID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2luOwotICByZXR1cm4gMDsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtZF9hc3NlbWJsZSB0byBvdXRwdXQgb25lIGluc24uICAqLwotCi1zdGF0aWMgdm9pZAotb3V0cHV0X2luc24gKGluc24sIHRoZV9pbnNuKQotICAgICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICppbnNuOwotICAgICBzdHJ1Y3Qgc3BhcmNfaXQgKnRoZV9pbnNuOwotewotICBjaGFyICp0b1AgPSBmcmFnX21vcmUgKDQpOwotCi0gIC8qIHB1dCBvdXQgdGhlIG9wY29kZSAqLwotICBpZiAoSU5TTl9CSUdfRU5ESUFOKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHRvUCwgKHZhbHVlVCkgdGhlX2luc24tPm9wY29kZSwgNCk7Ci0gIGVsc2UKLSAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuICh0b1AsICh2YWx1ZVQpIHRoZV9pbnNuLT5vcGNvZGUsIDQpOwotCi0gIC8qIHB1dCBvdXQgdGhlIHN5bWJvbC1kZXBlbmRlbnQgc3R1ZmYgKi8KLSAgaWYgKHRoZV9pbnNuLT5yZWxvYyAhPSBCRkRfUkVMT0NfTk9ORSkKLSAgICB7Ci0gICAgICBmaXhTICpmaXhQID0gIGZpeF9uZXdfZXhwIChmcmFnX25vdywJLyogd2hpY2ggZnJhZyAqLwotCQkJCSAodG9QIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpLAkvKiB3aGVyZSAqLwotCQkJCSA0LAkJLyogc2l6ZSAqLwotCQkJCSAmdGhlX2luc24tPmV4cCwKLQkJCQkgdGhlX2luc24tPnBjcmVsLAotCQkJCSB0aGVfaW5zbi0+cmVsb2MpOwotICAgICAgLyogVHVybiBvZmYgb3ZlcmZsb3cgY2hlY2tpbmcgaW4gZml4dXBfc2VnbWVudC4gIFdlJ2xsIGRvIG91cgotCSBvd24gb3ZlcmZsb3cgY2hlY2tpbmcgaW4gbWRfYXBwbHlfZml4My4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UKLQkgdGhlIGluc24gc2l6ZSBpcyA0IGFuZCBmaXh1cF9zZWdtZW50IHdpbGwgc2lnbmFsIGFuIG92ZXJmbG93IGZvcgotCSBsYXJnZSA4IGJ5dGUgcXVhbnRpdGllcy4gICovCi0gICAgICBmaXhQLT5meF9ub19vdmVyZmxvdyA9IDE7Ci0gICAgfQotCi0gIGxhc3RfaW5zbiA9IGluc247Ci0gIGxhc3Rfb3Bjb2RlID0gdGhlX2luc24tPm9wY29kZTsKLX0KLQwKLS8qCi0gIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBtZF9hdG9mIGluIG02OGsuYy4gIEkgdGhpbmsgdGhpcyBpcyByaWdodCwKLSAgYnV0IEknbSBub3Qgc3VyZS4KLQotICBUdXJuIGEgc3RyaW5nIGluIGlucHV0X2xpbmVfcG9pbnRlciBpbnRvIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgb2YgdHlwZQotICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICAqLwotCi0vKiBFcXVhbCB0byBNQVhfUFJFQ0lTSU9OIGluIGF0b2YtaWVlZS5jICovCi0jZGVmaW5lIE1BWF9MSVRUTEVOVU1TIDYKLQotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgaSxwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIGNoYXIgKnQ7Ci0KLSAgc3dpdGNoICh0eXBlKQotICAgIHsKLSAgICBjYXNlICdmJzoKLSAgICBjYXNlICdGJzoKLSAgICBjYXNlICdzJzoKLSAgICBjYXNlICdTJzoKLSAgICAgIHByZWMgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIHByZWMgPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd4JzoKLSAgICBjYXNlICdYJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdQJzoKLSAgICAgIHByZWMgPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgKnNpemVQID0gMDsKLSAgICAgIHJldHVybiBfKCJCYWQgY2FsbCB0byBNRF9BVE9GKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICpzaXplUCA9IHByZWMgKiBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQotICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IHByZWM7IGkrKykKLQl7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpIHdvcmRzW2ldLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0JICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0JewotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRQLCAodmFsdWVUKSB3b3Jkc1tpXSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotCSAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLQl9Ci0gICAgfQotICAgICAKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdyaXRlIGEgdmFsdWUgb3V0IHRvIHRoZSBvYmplY3QgZmlsZSwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCi0gICBlbmRpYW5uZXNzLiAgKi8KLQotdm9pZAotbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgbikKLSAgICAgY2hhciAqYnVmOwotICAgICB2YWx1ZVQgdmFsOwotICAgICBpbnQgbjsKLXsKLSAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKTsKLSAgZWxzZSBpZiAodGFyZ2V0X2xpdHRsZV9lbmRpYW5fZGF0YQotCSAgICYmICgobiA9PSA0IHx8IG4gPT0gMikgJiYgfm5vd19zZWctPmZsYWdzICYgU0VDX0FMTE9DKSkKLSAgICAvKiBPdXRwdXQgZGVidWcgd29yZHMsIHdoaWNoIGFyZSBub3QgaW4gYWxsb2NhdGVkIHNlY3Rpb25zLCBhcyBiaWcgZW5kaWFuICovCi0gICAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICBlbHNlIGlmICh0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhIHx8ICEgdGFyZ2V0X2JpZ19lbmRpYW4pCi0gICAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbiAoYnVmLCB2YWwsIG4pOwotfQotDAotLyogQXBwbHkgYSBmaXhTIHRvIHRoZSBmcmFncywgbm93IHRoYXQgd2Uga25vdyB0aGUgdmFsdWUgaXQgb3VnaHQgdG8KLSAgIGhvbGQuICovCi0KLWludAotbWRfYXBwbHlfZml4MyAoZml4UCwgdmFsdWUsIHNlZ21lbnQpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIHZhbHVlVCAqdmFsdWU7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBvZmZzZXRUIHZhbDsKLSAgbG9uZyBpbnNuOwotCi0gIHZhbCA9ICp2YWx1ZTsKLQotICBhc3NlcnQgKGZpeFAtPmZ4X3JfdHlwZSA8IEJGRF9SRUxPQ19VTlVTRUQpOwotCi0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IHZhbDsJLyogUmVtZW1iZXIgdmFsdWUgZm9yIGVtaXRfcmVsb2MgKi8KLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogRklYTUU6IFNQQVJDIEVMRiByZWxvY2F0aW9ucyBkb24ndCB1c2UgYW4gYWRkZW5kIGluIHRoZSBkYXRhCi0gICAgIGZpZWxkIGl0c2VsZi4gIFRoaXMgd2hvbGUgYXBwcm9hY2ggc2hvdWxkIGJlIHNvbWVob3cgY29tYmluZWQKLSAgICAgd2l0aCB0aGUgY2FsbHMgdG8gYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gIEFsc28sIHRoZSB2YWx1ZSBwYXNzZWQKLSAgICAgaW4gYnkgZml4dXBfc2VnbWVudCBpbmNsdWRlcyB0aGUgdmFsdWUgb2YgYSBkZWZpbmVkIHN5bWJvbC4gIFdlCi0gICAgIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgdmFsdWUgb2YgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbC4gICovCi0gIGlmIChmaXhQLT5meF9hZGRzeSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChmaXhQLT5meF9hZGRzeSkKLQkgICYmIChTX0lTX0VYVEVSTkFMIChmaXhQLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KQotCSAgICAgIHx8IChzcGFyY19waWNfY29kZSAmJiAhIGZpeFAtPmZ4X3BjcmVsKQotCSAgICAgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhQLT5meF9hZGRzeSkgIT0gc2VnbWVudAotCQkgICYmICgoYmZkX2dldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsCi0JCQkJCSAgICAgIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkKLQkJICAgICAgICYgU0VDX0xJTktfT05DRSkgIT0gMAotCQkgICAgICB8fCBzdHJuY21wIChzZWdtZW50X25hbWUgKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSksCi0JCQkJICAiLmdudS5saW5rb25jZSIsCi0JCQkJICBzaXplb2YgIi5nbnUubGlua29uY2UiIC0gMSkgPT0gMCkpKQotCSAgJiYgU19HRVRfU0VHTUVOVCAoZml4UC0+ZnhfYWRkc3kpICE9IGFic29sdXRlX3NlY3Rpb24KLQkgICYmIFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSAhPSB1bmRlZmluZWRfc2VjdGlvbgotCSAgJiYgISBiZmRfaXNfY29tX3NlY3Rpb24gKFNfR0VUX1NFR01FTlQgKGZpeFAtPmZ4X2FkZHN5KSkpCi0JZml4UC0+ZnhfYWRkbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChmaXhQLT5meF9hZGRzeSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBUaGlzIGlzIGEgaGFjay4gIFRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8KLSAgICAgaGFuZGxlIHRoaXMuICBQcm9iYWJseSBpbiB0ZXJtcyBvZiBob3d0byBmaWVsZHMsIG9uY2UKLSAgICAgd2UgY2FuIGxvb2sgYXQgdGhlc2UgZml4dXBzIGluIHRlcm1zIG9mIGhvd3Rvcy4gICovCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyICYmIGZpeFAtPmZ4X2FkZHN5KQotICAgIHZhbCArPSBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3M7Ci0KLSNpZmRlZiBPQkpfQU9VVAotICAvKiBGSVhNRTogTW9yZSByaWRpY3Vsb3VzIGdhcyByZWxvYyBoYWNraW5nLiAgSWYgd2UgYXJlIGdvaW5nIHRvCi0gICAgIGdlbmVyYXRlIGEgcmVsb2MsIHRoZW4gd2UganVzdCB3YW50IHRvIGxldCB0aGUgcmVsb2MgYWRkZW5kIHNldAotICAgICB0aGUgdmFsdWUuICBXZSBkbyBub3Qgd2FudCB0byBhbHNvIHN0dWZmIHRoZSBhZGRlbmQgaW50byB0aGUKLSAgICAgb2JqZWN0IGZpbGUuICBJbmNsdWRpbmcgdGhlIGFkZGVuZCBpbiB0aGUgb2JqZWN0IGZpbGUgd29ya3Mgd2hlbgotICAgICBkb2luZyBhIHN0YXRpYyBsaW5rLCBiZWNhdXNlIHRoZSBsaW5rZXIgd2lsbCBpZ25vcmUgdGhlIG9iamVjdAotICAgICBmaWxlIGNvbnRlbnRzLiAgSG93ZXZlciwgdGhlIGR5bmFtaWMgbGlua2VyIGRvZXMgbm90IGlnbm9yZSB0aGUKLSAgICAgb2JqZWN0IGZpbGUgY29udGVudHMuICAqLwotICBpZiAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTAotICAgICAgJiYgZml4UC0+Znhfcl90eXBlICE9IEJGRF9SRUxPQ18zMl9QQ1JFTF9TMikKLSAgICB2YWwgPSAwOwotCi0gIC8qIFdoZW4gZ2VuZXJhdGluZyBQSUMgY29kZSwgd2UgZG8gbm90IHdhbnQgYW4gYWRkZW5kIGZvciBhIHJlbG9jCi0gICAgIGFnYWluc3QgYSBsb2NhbCBzeW1ib2wuICBXZSBhZGp1c3QgZnhfYWRkbnVtYmVyIHRvIGNhbmNlbCBvdXQgdGhlCi0gICAgIHZhbHVlIGFscmVhZHkgaW5jbHVkZWQgaW4gdmFsLCBhbmQgdG8gYWxzbyBjYW5jZWwgb3V0IHRoZQotICAgICBhZGp1c3RtZW50IHdoaWNoIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gd2lsbCBjcmVhdGUuICAqLwotICBpZiAoc3BhcmNfcGljX2NvZGUKLSAgICAgICYmIGZpeFAtPmZ4X3JfdHlwZSAhPSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLSAgICAgICYmIGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwKLSAgICAgICYmICEgU19JU19DT01NT04gKGZpeFAtPmZ4X2FkZHN5KQotICAgICAgJiYgc3ltYm9sX3NlY3Rpb25fcCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIGZpeFAtPmZ4X2FkZG51bWJlciAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLQotICAvKiBXaGVuIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG5lZWQgdG8gZmlkZGxlIHRvIGdldAotICAgICBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIHRvIGRvIHRoZSByaWdodCB0aGluZyBmb3IgYSBQQyByZWxhdGl2ZQotICAgICByZWxvYyBhZ2FpbnN0IGEgbG9jYWwgc3ltYm9sIHdoaWNoIHdlIGFyZSBnb2luZyB0byBrZWVwLiAgKi8KLSAgaWYgKHNwYXJjX3BpY19jb2RlCi0gICAgICAmJiBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzMyX1BDUkVMX1MyCi0gICAgICAmJiBmaXhQLT5meF9hZGRzeSAhPSBOVUxMCi0gICAgICAmJiAoU19JU19FWFRFUk5BTCAoZml4UC0+ZnhfYWRkc3kpCi0JICB8fCBTX0lTX1dFQUsgKGZpeFAtPmZ4X2FkZHN5KSkKLSAgICAgICYmIFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0gICAgICAmJiAhIFNfSVNfQ09NTU9OIChmaXhQLT5meF9hZGRzeSkpCi0gICAgewotICAgICAgdmFsID0gMDsKLSAgICAgIGZpeFAtPmZ4X2FkZG51bWJlciAtPSAyICogU19HRVRfVkFMVUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICB9Ci0jZW5kaWYKLQotICAvKiBJZiB0aGlzIGlzIGEgZGF0YSByZWxvY2F0aW9uLCBqdXN0IG91dHB1dCBWQUwuICAqLwotCi0gIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzE2KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIDIpOwotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18zMgotCSAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfU1BBUkNfUkVWMzIpCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgNCk7Ci0gICAgfQotICBlbHNlIGlmIChmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DXzY0KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWwsIDgpOwotICAgIH0KLSAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVCAKLSAgICAgICAgICAgfHwgZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkpCi0gICAgewotICAgICAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJdCdzIGEgcmVsb2NhdGlvbiBhZ2FpbnN0IGFuIGluc3RydWN0aW9uLiAgKi8KLQotICAgICAgaWYgKElOU05fQklHX0VORElBTikKLQlpbnNuID0gYmZkX2dldGIzMiAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAgIGVsc2UKLQlpbnNuID0gYmZkX2dldGwzMiAoKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAKLSAgICAgIHN3aXRjaCAoZml4UC0+Znhfcl90eXBlKQotCXsKLQljYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMjoKLQkgIHZhbCA9IHZhbCA+PiAyOwotCSAgLyogRklYTUU6IFRoaXMgaW5jcmVtZW50LWJ5LW9uZSBkZXNlcnZlcyBhIGNvbW1lbnQgb2Ygd2h5IGl0J3MKLQkgICAgIGJlaW5nIGRvbmUhICAqLwotCSAgaWYgKCEgc3BhcmNfcGljX2NvZGUKLQkgICAgICB8fCBmaXhQLT5meF9hZGRzeSA9PSBOVUxMCi0JICAgICAgfHwgc3ltYm9sX3NlY3Rpb25fcCAoZml4UC0+ZnhfYWRkc3kpKQotCSAgICArK3ZhbDsKLQkgIGluc24gfD0gdmFsICYgMHgzZmZmZmZmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfMTE6Ci0JICBpZiAoISBpbl9zaWduZWRfcmFuZ2UgKHZhbCwgMHg3ZmYpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4N2ZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ18xMDoKLQkgIGlmICghIGluX3NpZ25lZF9yYW5nZSAodmFsLCAweDNmZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgzZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDXzc6Ci0JICBpZiAoISBpbl9iaXRmaWVsZF9yYW5nZSAodmFsLCAweDdmKSkKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSB2YWwgJiAweDdmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ182OgotCSAgaWYgKCEgaW5fYml0ZmllbGRfcmFuZ2UgKHZhbCwgMHgzZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgzZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfNToKLQkgIGlmICghIGluX2JpdGZpZWxkX3JhbmdlICh2YWwsIDB4MWYpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBpbnNuIHw9IHZhbCAmIDB4MWY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTY6Ci0JICAvKiBGSVhNRTogc2ltcGxpZnkgKi8KLQkgIGlmICgoKHZhbCA+IDApICYmICh2YWwgJiB+MHgzZmZmYykpCi0JICAgICAgfHwgKCh2YWwgPCAwKSAmJiAofih2YWwgLSAxKSAmIH4weDNmZmZjKSkpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIC8qIEZJWE1FOiBUaGUgKzEgZGVzZXJ2ZXMgYSBjb21tZW50LiAgKi8KLQkgIHZhbCA9ICh2YWwgPj4gMikgKyAxOwotCSAgaW5zbiB8PSAoKHZhbCAmIDB4YzAwMCkgPDwgNikgfCAodmFsICYgMHgzZmZmKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOToKLQkgIC8qIEZJWE1FOiBzaW1wbGlmeSAqLwotCSAgaWYgKCgodmFsID4gMCkgJiYgKHZhbCAmIH4weDFmZmZmYykpCi0JICAgICAgfHwgKCh2YWwgPCAwKSAmJiAofih2YWwgLSAxKSAmIH4weDFmZmZmYykpKQotCSAgICBhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICAvKiBGSVhNRTogVGhlICsxIGRlc2VydmVzIGEgY29tbWVudC4gICovCi0JICB2YWwgPSAodmFsID4+IDIpICsgMTsKLQkgIGluc24gfD0gdmFsICYgMHg3ZmZmZjsKLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfSEgyMjoKLQkgIHZhbCA9IEJTUiAodmFsLCAzMik7Ci0JICAvKiBpbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE0yMjoKLQljYXNlIEJGRF9SRUxPQ19ISTIyOgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIGluc24gfD0gKHZhbCA+PiAxMCkgJiAweDNmZmZmZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IE5lZWQgY29tbWVudCBleHBsYWluaW5nIHdoeSB3ZSBkbyB0aGlzLiAgKi8KLQkgICAgICBpbnNuICY9IH4weGZmZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkMyMjoKLQkgIGlmICh2YWwgJiB+MHgwMDNmZmZmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJyZWxvY2F0aW9uIG92ZXJmbG93IikpOwotCSAgaW5zbiB8PSAodmFsICYgMHgzZmZmZmYpOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19ITTEwOgotCSAgdmFsID0gQlNSICh2YWwsIDMyKTsKLQkgIC8qIGludGVudGlvbmFsIGZhbGx0aHJvdWdoICovCi0KLQljYXNlIEJGRF9SRUxPQ19MTzEwOgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgewotCSAgICAgIGluc24gfD0gdmFsICYgMHgzZmY7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBOZWVkIGNvbW1lbnQgZXhwbGFpbmluZyB3aHkgd2UgZG8gdGhpcy4gICovCi0JICAgICAgaW5zbiAmPSB+MHhmZjsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQzEzOgotCSAgaWYgKCEgaW5fc2lnbmVkX3JhbmdlICh2YWwsIDB4MWZmZikpCi0JICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgIGluc24gfD0gdmFsICYgMHgxZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyOgotCSAgdmFsID0gKHZhbCA+PiAyKSArIDE7Ci0JICAvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0JBU0UyMjoKLQkgIGluc24gfD0gdmFsICYgMHgzZmZmZmY7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIHsKLQkgICAgICBiZmRfdm1hIHR2YWwgPSB2YWw7Ci0JICAgICAgdHZhbCA+Pj0gMjI7Ci0JICAgICAgaW5zbiB8PSB0dmFsICYgMHgzZmZmZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTTQ0OgotCSAgaWYgKCFmaXhQLT5meF9hZGRzeSkKLQkgICAgaW5zbiB8PSAodmFsID4+IDEyKSAmIDB4M2ZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19MNDQ6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICBpbnNuIHw9IHZhbCAmIDB4ZmZmOwotCSAgYnJlYWs7Ci0KLQljYXNlIEJGRF9SRUxPQ19TUEFSQ19ISVgyMjoKLQkgIGlmICghZml4UC0+ZnhfYWRkc3kpCi0JICAgIHsKLQkgICAgICB2YWwgXj0gfiAob2Zmc2V0VCkgMDsKLQkgICAgICBpbnNuIHw9ICh2YWwgPj4gMTApICYgMHgzZmZmZmY7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBCRkRfUkVMT0NfU1BBUkNfTE9YMTA6Ci0JICBpZiAoIWZpeFAtPmZ4X2FkZHN5KQotCSAgICBpbnNuIHw9IDB4MWMwMCB8ICh2YWwgJiAweDNmZik7Ci0JICBicmVhazsKLQotCWNhc2UgQkZEX1JFTE9DX05PTkU6Ci0JZGVmYXVsdDoKLQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCV8oImJhZCBvciB1bmhhbmRsZWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiKSwKLQkJCWZpeFAtPmZ4X3JfdHlwZSk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChJTlNOX0JJR19FTkRJQU4pCi0JYmZkX3B1dGIzMiAoaW5zbiwgKHVuc2lnbmVkIGNoYXIgKikgYnVmKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyIChpbnNuLCAodW5zaWduZWQgY2hhciAqKSBidWYpOwotICAgIH0KLQotICAvKiBBcmUgd2UgZmluaXNoZWQgd2l0aCB0aGlzIHJlbG9jYXRpb24gbm93PyAgKi8KLSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgIWZpeFAtPmZ4X3BjcmVsKQotICAgIGZpeFAtPmZ4X2RvbmUgPSAxOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBUcmFuc2xhdGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgcmVsb2NhdGlvbiBpbmZvIHRvIEJGRCB0YXJnZXQKLSAgIGZvcm1hdC4gICovCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VjdGlvbiwgZml4cCkKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGZpeFMgKmZpeHA7Ci17Ci0gIGFyZWxlbnQgKnJlbG9jOwotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgY29kZTsKLQotICByZWxvYyA9IChhcmVsZW50ICopIHhtYWxsb2MgKHNpemVvZiAoYXJlbGVudCkpOwotCi0gIHJlbG9jLT5zeW1fcHRyX3B0ciA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzaXplb2YgKGFzeW1ib2wgKikpOwotICAqcmVsb2MtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeHAtPmZ4X2FkZHN5KTsKLSAgcmVsb2MtPmFkZHJlc3MgPSBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgc3dpdGNoIChmaXhwLT5meF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgQkZEX1JFTE9DXzE2OgotICAgIGNhc2UgQkZEX1JFTE9DXzMyOgotICAgIGNhc2UgQkZEX1JFTE9DX0hJMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfTE8xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ18zMl9QQ1JFTF9TMjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQzEzOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfQkFTRTEzOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1dESVNQMTY6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfV0RJU1AxOToKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19XRElTUDIyOgotICAgIGNhc2UgQkZEX1JFTE9DXzY0OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzU6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfNjoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ183OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDXzExOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hIMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfSE0xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19MTTIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1BDX0hIMjI6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfUENfSE0xMDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19QQ19MTTIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0g0NDoKLSAgICBjYXNlIEJGRF9SRUxPQ19TUEFSQ19NNDQ6Ci0gICAgY2FzZSBCRkRfUkVMT0NfU1BBUkNfTDQ0OgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0hJWDIyOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX0xPWDEwOgotICAgIGNhc2UgQkZEX1JFTE9DX1NQQVJDX1JFVjMyOgotICAgIGNhc2UgQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWToKLSAgICBjYXNlIEJGRF9SRUxPQ19WVEFCTEVfSU5IRVJJVDoKLSAgICAgIGNvZGUgPSBmaXhwLT5meF9yX3R5cGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQU9VVCkKLSAgLyogSWYgd2UgYXJlIGdlbmVyYXRpbmcgUElDIGNvZGUsIHdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBkaWZmZXJlbnQKLSAgICAgc2V0IG9mIHJlbG9jcy4gICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIEdPVF9OQU1FICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iCi0jZWxzZQotI2RlZmluZSBHT1RfTkFNRSAiX19HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSNlbmRpZgotCi0gIGlmIChzcGFyY19waWNfY29kZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNvZGUpCi0JewotCWNhc2UgQkZEX1JFTE9DXzMyX1BDUkVMX1MyOgotCSAgaWYgKCEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKLQkgICAgICB8fCBTX0lTX0NPTU1PTiAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgfHwgU19JU19FWFRFUk5BTCAoZml4cC0+ZnhfYWRkc3kpCi0JICAgICAgfHwgU19JU19XRUFLIChmaXhwLT5meF9hZGRzeSkpCi0JICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfV1BMVDMwOwotCSAgYnJlYWs7Ci0JY2FzZSBCRkRfUkVMT0NfSEkyMjoKLQkgIGlmIChmaXhwLT5meF9hZGRzeSAhPSBOVUxMCi0JICAgICAgJiYgc3RyY21wIChTX0dFVF9OQU1FIChmaXhwLT5meF9hZGRzeSksIEdPVF9OQU1FKSA9PSAwKQotCSAgICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX1BDMjI7Ci0JICBlbHNlCi0JICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfR09UMjI7Ci0JICBicmVhazsKLQljYXNlIEJGRF9SRUxPQ19MTzEwOgotCSAgaWYgKGZpeHAtPmZ4X2FkZHN5ICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKFNfR0VUX05BTUUgKGZpeHAtPmZ4X2FkZHN5KSwgR09UX05BTUUpID09IDApCi0JICAgIGNvZGUgPSBCRkRfUkVMT0NfU1BBUkNfUEMxMDsKLQkgIGVsc2UKLQkgICAgY29kZSA9IEJGRF9SRUxPQ19TUEFSQ19HT1QxMDsKLQkgIGJyZWFrOwotCWNhc2UgQkZEX1JFTE9DX1NQQVJDMTM6Ci0JICBjb2RlID0gQkZEX1JFTE9DX1NQQVJDX0dPVDEzOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZCAoT0JKX0VMRikgfHwgZGVmaW5lZCAoT0JKX0FPVVQpICovCi0KLSAgcmVsb2MtPmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGNvZGUpOwotICBpZiAocmVsb2MtPmhvd3RvID09IDApCi0gICAgewotICAgICAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgXygiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGV4cG9ydCByZWxvYyB0eXBlICVkIChgJXMnKSIpLAotCQkgICAgZml4cC0+Znhfcl90eXBlLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qIEBAIFdoeSBmeF9hZGRudW1iZXIgc29tZXRpbWVzIGFuZCBmeF9vZmZzZXQgb3RoZXIgdGltZXM/ICAqLwotI2lmZGVmIE9CSl9BT1VUCi0KLSAgaWYgKHJlbG9jLT5ob3d0by0+cGNfcmVsYXRpdmUgPT0gMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMxMAotICAgICAgfHwgY29kZSA9PSBCRkRfUkVMT0NfU1BBUkNfUEMyMikKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlIGlmIChzcGFyY19waWNfY29kZQotCSAgICYmIGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIKLQkgICAmJiBmaXhwLT5meF9hZGRzeSAhPSBOVUxMCi0JICAgJiYgKFNfSVNfRVhURVJOQUwgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICAgICB8fCBTX0lTX1dFQUsgKGZpeHAtPmZ4X2FkZHN5KSkKLQkgICAmJiBTX0lTX0RFRklORUQgKGZpeHAtPmZ4X2FkZHN5KQotCSAgICYmICEgU19JU19DT01NT04gKGZpeHAtPmZ4X2FkZHN5KSkKLSAgICByZWxvYy0+YWRkZW5kID0gZml4cC0+ZnhfYWRkbnVtYmVyOwotICBlbHNlCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldCAtIHJlbG9jLT5hZGRyZXNzOwotCi0jZWxzZSAvKiBlbGYgb3IgY29mZiAqLwotCi0gIGlmIChyZWxvYy0+aG93dG8tPnBjX3JlbGF0aXZlID09IDAKLSAgICAgIHx8IGNvZGUgPT0gQkZEX1JFTE9DX1NQQVJDX1BDMTAKLSAgICAgIHx8IGNvZGUgPT0gQkZEX1JFTE9DX1NQQVJDX1BDMjIpCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X2FkZG51bWJlcjsKLSAgZWxzZSBpZiAoc3ltYm9sX3NlY3Rpb25fcCAoZml4cC0+ZnhfYWRkc3kpKQotICAgIHJlbG9jLT5hZGRlbmQgPSAoc2VjdGlvbi0+dm1hCi0JCSAgICAgKyBmaXhwLT5meF9hZGRudW1iZXIKLQkJICAgICArIG1kX3BjcmVsX2Zyb20gKGZpeHApKTsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9vZmZzZXQ7Ci0jZW5kaWYKLQotICByZXR1cm4gcmVsb2M7Ci19Ci0MCi0vKiBXZSBoYXZlIG5vIG5lZWQgdG8gZGVmYXVsdCB2YWx1ZXMgb2Ygc3ltYm9scy4gKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19CQkJCS8qIG1kX3VuZGVmaW5lZF9zeW1ib2woKSAqLwotCi0vKiBSb3VuZCB1cCBhIHNlY3Rpb24gc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgYm91bmRhcnkuICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0jaWZuZGVmIE9CSl9FTEYKLSAgLyogVGhpcyBpcyBub3QgcmlnaHQgZm9yIEVMRjsgYS5vdXQgd2FudHMgaXQsIGFuZCBDT0ZGIHdpbGwgZm9yY2UKLSAgICAgdGhlIGFsaWdubWVudCBhbnl3YXlzLiAgKi8KLSAgdmFsdWVUIGFsaWduID0gKCh2YWx1ZVQpIDEKLQkJICA8PCAodmFsdWVUKSBiZmRfZ2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZ21lbnQpKTsKLSAgdmFsdWVUIG5ld3NpemU7Ci0gIC8qIHR1cm4gYWxpZ25tZW50IHZhbHVlIGludG8gYSBtYXNrICovCi0gIGFsaWduLS07Ci0gIG5ld3NpemUgPSAoc2l6ZSArIGFsaWduKSAmIH5hbGlnbjsKLSAgcmV0dXJuIG5ld3NpemU7Ci0jZWxzZQotICByZXR1cm4gc2l6ZTsKLSNlbmRpZgotfQotCi0vKiBFeGFjdGx5IHdoYXQgcG9pbnQgaXMgYSBQQy1yZWxhdGl2ZSBvZmZzZXQgcmVsYXRpdmUgVE8/Ci0gICBPbiB0aGUgc3BhcmMsIHRoZXkncmUgcmVsYXRpdmUgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIG9mZnNldCwgcGx1cwotICAgaXRzIHNpemUuICBUaGlzIGdldHMgdXMgdG8gdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4KLSAgICg/Pz8gSXMgdGhpcyByaWdodD8gIEZJWE1FLVNPT04pICovCi1sb25nIAotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotICBpZiAoISBzcGFyY19waWNfY29kZQotICAgICAgfHwgZml4UC0+ZnhfYWRkc3kgPT0gTlVMTAotICAgICAgfHwgc3ltYm9sX3NlY3Rpb25fcCAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldCArPSBmaXhQLT5meF9zaXplOwotICByZXR1cm4gcmV0OwotfQotDAotLyogUmV0dXJuIGxvZzIgKFZBTFVFKSwgb3IgLTEgaWYgVkFMVUUgaXMgbm90IGFuIGV4YWN0IHBvc2l0aXZlIHBvd2VyCi0gICBvZiB0d28uICAqLwotCi1zdGF0aWMgaW50Ci1sb2cyICh2YWx1ZSkKLSAgICAgaW50IHZhbHVlOwotewotICBpbnQgc2hpZnQ7Ci0KLSAgaWYgKHZhbHVlIDw9IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIGZvciAoc2hpZnQgPSAwOyAodmFsdWUgJiAxKSA9PSAwOyB2YWx1ZSA+Pj0gMSkKLSAgICArK3NoaWZ0OwotCi0gIHJldHVybiAodmFsdWUgPT0gMSkgPyBzaGlmdCA6IC0xOwotfQotCi0vKgotICogc29ydCBvZiBsaWtlIHNfbGNvbW0KLSAqLwotCi0jaWZuZGVmIE9CSl9FTEYKLXN0YXRpYyBpbnQgbWF4X2FsaWdubWVudCA9IDE1OwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1zX3Jlc2VydmUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciAqcDsKLSAgY2hhciBjOwotICBpbnQgYWxpZ247Ci0gIGludCBzaXplOwotICBpbnQgdGVtcDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotICBpZiAoKHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSkgPCAwKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiQlNTIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgc2l6ZSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0JCQkJLyogYmFkIGxlbmd0aCAqLwotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIixcImJzc1wiIiwgNikgIT0gMAotICAgICAgJiYgc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiLFwiLmJzc1wiIiwgNykgIT0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCAucmVzZXJ2ZSBzZWdtZW50IC0tIGV4cGVjdGVkIEJTUyBzZWdtZW50IikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzJdID09ICcuJykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNzsKLSAgZWxzZQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSA2OwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyBhbGlnbm1lbnQiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgYWxpZ24gPSAoaW50KSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotI2lmbmRlZiBPQkpfRUxGCi0gICAgICBpZiAoYWxpZ24gPiBtYXhfYWxpZ25tZW50KQotCXsKLQkgIGFsaWduID0gbWF4X2FsaWdubWVudDsKLQkgIGFzX3dhcm4gKF8oImFsaWdubWVudCB0b28gbGFyZ2U7IGFzc3VtaW5nICVkIiksIGFsaWduKTsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGFsaWduIDwgMCkKLQl7Ci0JICBhc19iYWQgKF8oIm5lZ2F0aXZlIGFsaWdubWVudCIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBpZiAoYWxpZ24gIT0gMCkKLQl7Ci0JICB0ZW1wID0gbG9nMiAoYWxpZ24pOwotCSAgaWYgKHRlbXAgPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICBhbGlnbiA9IHRlbXA7Ci0JfQotCi0gICAgICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotICAgIH0KLSAgZWxzZQotICAgIGFsaWduID0gMDsKLQotICBpZiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkKLSNpZmRlZiBPQkpfQU9VVAotICAgICAgJiYgU19HRVRfT1RIRVIgKHN5bWJvbFApID09IDAKLSAgICAgICYmIFNfR0VUX0RFU0MgKHN5bWJvbFApID09IDAKLSNlbmRpZgotICAgICAgKQotICAgIHsKLSAgICAgIGlmICghIG5lZWRfcGFzc18yKQotCXsKLQkgIGNoYXIgKnBmcmFnOwotCSAgc2VnVCBjdXJyZW50X3NlZyA9IG5vd19zZWc7Ci0JICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDEpOyAvKiBzd2l0Y2ggdG8gYnNzICovCi0KLQkgIGlmIChhbGlnbikKLQkgICAgZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOyAvKiBkbyBhbGlnbm1lbnQgKi8KLQotCSAgLyogZGV0YWNoIGZyb20gb2xkIGZyYWcgKi8KLQkgIGlmIChTX0dFVF9TRUdNRU5UKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCSAgICBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSBOVUxMOwotCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkwLCBzeW1ib2xQLAotCQkJICAgIChvZmZzZXRUKSBzaXplLCAoY2hhciAqKTApOwotCSAgKnBmcmFnID0gMDsKLQotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotCi0JICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0jaWZkZWYgT0JKX0VMRgotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0jZW5kaWYKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYXNfd2FybigiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sICVzIiwKLQkgICAgICBTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0gICAgfQkJCQkvKiBpZiBub3QgcmVkZWZpbmluZyAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX2NvbW1vbiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIGNoYXIgKnA7Ci0gIGludCB0ZW1wLCBzaXplOwotICBzeW1ib2xTICpzeW1ib2xQOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJCS8qIHNraXAgJywnICovCi0gIGlmICgodGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKSA8IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iKSwgdGVtcCk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgc2l6ZSA9IHRlbXA7Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9ICh2YWx1ZVQpIHNpemUpCi0JewotCSAgYXNfd2FybiAoXygiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWQuIiksCi0JCSAgIFNfR0VUX05BTUUgKHN5bWJvbFApLCAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApLCBzaXplKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotI2lmbmRlZiBPQkpfRUxGCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYKLSAgICB9Ci0gIGtub3cgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCkgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnIicpCi0gICAgewotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0jaWZuZGVmIE9CSl9FTEYKLSAgICAgIGlmICh0ZW1wID4gbWF4X2FsaWdubWVudCkKLQl7Ci0JICB0ZW1wID0gbWF4X2FsaWdubWVudDsKLQkgIGFzX3dhcm4gKF8oImFsaWdubWVudCB0b28gbGFyZ2U7IGFzc3VtaW5nICVkIiksIHRlbXApOwotCX0KLSNlbmRpZgotCi0gICAgICBpZiAodGVtcCA8IDApCi0JewotCSAgYXNfYmFkIChfKCJuZWdhdGl2ZSBhbGlnbm1lbnQiKSk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLQotI2lmZGVmIE9CSl9FTEYKLSAgICAgIGlmIChzeW1ib2xfZ2V0X29iaiAoc3ltYm9sUCktPmxvY2FsKQotCXsKLQkgIHNlZ1Qgb2xkX3NlYzsKLQkgIGludCBvbGRfc3Vic2VjOwotCSAgY2hhciAqcDsKLQkgIGludCBhbGlnbjsKLQotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLQotCSAgaWYgKHRlbXAgPT0gMCkKLQkgICAgYWxpZ24gPSAwOwotCSAgZWxzZQotCSAgICBhbGlnbiA9IGxvZzIgKHRlbXApOwotCi0JICBpZiAoYWxpZ24gPCAwKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICByZWNvcmRfYWxpZ25tZW50IChic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIDApOwotCSAgaWYgKGFsaWduKQotCSAgICBmcmFnX2FsaWduIChhbGlnbiwgMCwgMCk7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYnNzX3NlY3Rpb24pCi0JICAgIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHAgPSBmcmFnX3ZhciAocnNfb3JnLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCBzeW1ib2xQLAotCQkJKG9mZnNldFQpIHNpemUsIChjaGFyICopIDApOwotCSAgKnAgPSAwOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYnNzX3NlY3Rpb24pOwotCSAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLQkgIHN1YnNlZ19zZXQgKG9sZF9zZWMsIG9sZF9zdWJzZWMpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBPQkpfRUxGICovCi0JewotCWFsbG9jYXRlX2NvbW1vbjoKLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBzaXplKTsKLSNpZmRlZiBPQkpfRUxGCi0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9TSVpFIChzeW1ib2xQLCBzaXplKTsKLSNlbmRpZgotCSAgU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotCSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYmZkX2NvbV9zZWN0aW9uX3B0cik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSB1c2UgdGhlIGRvdCwgc29tZSBkb24ndC4gIENhbiB3ZSBnZXQgc29tZSBjb25zaXN0ZW5jeT8/ICAqLwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy4nKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgLyogQEAgU29tZSBzYXkgZGF0YSwgc29tZSBzYXkgYnNzLiAgKi8KLSAgICAgIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJic3NcIiIsIDQpCi0JICAmJiBzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJkYXRhXCIiLCA1KSkKLQl7Ci0JICB3aGlsZSAoKi0taW5wdXRfbGluZV9wb2ludGVyICE9ICciJykKLQkgICAgOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JICBnb3RvIGJhZF9jb21tb25fc2VnbWVudDsKLQl9Ci0gICAgICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICciJykKLQk7Ci0gICAgICBnb3RvIGFsbG9jYXRlX2NvbW1vbjsKLSAgICB9Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW1ib2xQKS0+ZmxhZ3MgfD0gQlNGX09CSkVDVDsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gIHJldHVybjsKLQotICB7Ci0gIGJhZF9jb21tb25fc2VnbWVudDoKLSAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnXG4nKQotICAgICAgcCsrOwotICAgIGMgPSAqcDsKLSAgICAqcCA9ICdcMCc7Ci0gICAgYXNfYmFkIChfKCJiYWQgLmNvbW1vbiBzZWdtZW50ICVzIiksIGlucHV0X2xpbmVfcG9pbnRlciArIDEpOwotICAgICpwID0gYzsKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBwOwotICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVtcHR5IHBzZXVkby1vcC4gIFRoaXMgc3VwcmVzc2VzIHRoZSB3YXJuaW5ncyBhYm91dAotICAgaW52YWxpZCBkZWxheSBzbG90IHVzYWdlLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfZW1wdHkgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgLyogVGhlIGVhc3kgd2F5IHRvIGltcGxlbWVudCBpcyB0byBqdXN0IGZvcmdldCBhYm91dCB0aGUgbGFzdAotICAgICBpbnN0cnVjdGlvbi4gICovCi0gIGxhc3RfaW5zbiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zX3NlZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotCi0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJcInRleHRcIiIsIDYpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDY7Ci0gICAgICBzX3RleHQgKDApOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgIlwiZGF0YVwiIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNjsKLSAgICAgIHNfZGF0YSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJkYXRhMVwiIiwgNykgPT0gMCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gNzsKLSAgICAgIHNfZGF0YTEgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAiXCJic3NcIiIsIDUpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDU7Ci0gICAgICAvKiBXZSBvbmx5IHN1cHBvcnQgMiBzZWdtZW50cyAtLSB0ZXh0IGFuZCBkYXRhIC0tIGZvciBub3csIHNvCi0JIHRoaW5ncyBpbiB0aGUgImJzcyBzZWdtZW50IiB3aWxsIGhhdmUgdG8gZ28gaW50byBkYXRhIGZvciBub3cuCi0JIFlvdSBjYW4gc3RpbGwgYWxsb2NhdGUgU0VHX0JTUyBzdHVmZiB3aXRoIC5sY29tbSBvciAucmVzZXJ2ZS4gKi8KLSAgICAgIHN1YnNlZ19zZXQgKGRhdGFfc2VjdGlvbiwgMjU1KTsJLyogRklYTUUtU09NRURBWSAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgYXNfYmFkIChfKCJVbmtub3duIHNlZ21lbnQgdHlwZSIpKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfZGF0YTEgKCkKLXsKLSAgc3Vic2VnX3NldCAoZGF0YV9zZWN0aW9uLCAxKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotc3RhdGljIHZvaWQKLXNfcHJvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0gICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0vKiBUaGlzIHN0YXRpYyB2YXJpYWJsZSBpcyBzZXQgYnkgc191YWNvbnMgdG8gdGVsbCBzcGFyY19jb25zX2FsaWduCi0gICB0aGF0IHRoZSBleHBlc3Npb24gZG9lcyBub3QgbmVlZCB0byBiZSBhbGlnbmVkLiAgKi8KLQotc3RhdGljIGludCBzcGFyY19ub19hbGlnbl9jb25zID0gMDsKLQotLyogVGhpcyBoYW5kbGVzIHRoZSB1bmFsaWduZWQgc3BhY2UgYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLCBzdWNoIGFzCi0gICAudWF3b3JkLiAgLnVhd29yZCBpcyBqdXN0IGxpa2UgLndvcmQsIGJ1dCB0aGUgdmFsdWUgZG9lcyBub3QgbmVlZAotICAgdG8gYmUgYWxpZ25lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX3VhY29ucyAoYnl0ZXMpCi0gICAgIGludCBieXRlczsKLXsKLSAgLyogVGVsbCBzcGFyY19jb25zX2FsaWduIG5vdCB0byBhbGlnbiB0aGlzIHZhbHVlLiAgKi8KLSAgc3BhcmNfbm9fYWxpZ25fY29ucyA9IDE7Ci0gIGNvbnMgKGJ5dGVzKTsKLX0KLQotLyogVGhpcyBoYW5kbGVzIHRoZSBuYXRpdmUgd29yZCBhbGxvY2F0aW9uIHBzZXVkby1vcCAubndvcmQuCi0gICBGb3Igc3BhcmNfYXJjaF9zaXplIDMyIGl0IGlzIGVxdWl2YWxlbnQgdG8gLndvcmQsICBmb3IKLSAgIHNwYXJjX2FyY2hfc2l6ZSA2NCBpdCBpcyBlcXVpdmFsZW50IHRvIC54d29yZC4gICovCi0KLXN0YXRpYyB2b2lkCi1zX25jb25zIChieXRlcykKLSAgICAgaW50IGJ5dGVzOwotewotICBjb25zIChzcGFyY19hcmNoX3NpemUgPT0gMzIgPyA0IDogOCk7Ci19Ci0KLS8qIElmIHRoZSAtLWVuZm9yY2UtYWxpZ25lZC1kYXRhIG9wdGlvbiBpcyB1c2VkLCB3ZSByZXF1aXJlIC53b3JkLAotICAgZXQuIGFsLiwgdG8gYmUgYWxpZ25lZCBjb3JyZWN0bHkuICBXZSBkbyBpdCBieSBzZXR0aW5nIHVwIGFuCi0gICByc19hbGlnbl9jb2RlIGZyYWcsIGFuZCBjaGVja2luZyBpbiBIQU5ETEVfQUxJR04gdG8gbWFrZSBzdXJlIHRoYXQKLSAgIG5vIHVuZXhwZWN0ZWQgYWxpZ25tZW50IHdhcyBpbnRyb2R1Y2VkLgotCi0gICBUaGUgU3VuT1MgYW5kIFNvbGFyaXMgbmF0aXZlIGFzc2VtYmxlcnMgZW5mb3JjZSBhbGlnbmVkIGRhdGEgYnkKLSAgIGRlZmF1bHQuICBXZSBkb24ndCB3YW50IHRvIGRvIHRoYXQsIGJlY2F1c2UgZ2NjIGNhbiBkZWxpYmVyYXRlbHkKLSAgIGdlbmVyYXRlIG1pc2FsaWduZWQgZGF0YSBpZiB0aGUgcGFja2VkIGF0dHJpYnV0ZSBpcyB1c2VkLiAgSW5zdGVhZCwKLSAgIHdlIHBlcm1pdCBtaXNhbGlnbmVkIGRhdGEgYnkgZGVmYXVsdCwgYW5kIHBlcm1pdCB0aGUgdXNlciB0byBzZXQgYW4KLSAgIG9wdGlvbiB0byBjaGVjayBmb3IgaXQuICAqLwotCi12b2lkCi1zcGFyY19jb25zX2FsaWduIChuYnl0ZXMpCi0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIGludCBuYWxpZ247Ci0gIGNoYXIgKnA7Ci0KLSAgLyogT25seSBkbyB0aGlzIGlmIHdlIGFyZSBlbmZvcmNpbmcgYWxpZ25lZCBkYXRhLiAgKi8KLSAgaWYgKCEgZW5mb3JjZV9hbGlnbmVkX2RhdGEpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzcGFyY19ub19hbGlnbl9jb25zKQotICAgIHsKLSAgICAgIC8qIFRoaXMgaXMgYW4gdW5hbGlnbmVkIHBzZXVkby1vcC4gICovCi0gICAgICBzcGFyY19ub19hbGlnbl9jb25zID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFsaWduID0gbG9nMiAobmJ5dGVzKTsKLSAgaWYgKG5hbGlnbiA9PSAwKQotICAgIHJldHVybjsKLQotICBhc3NlcnQgKG5hbGlnbiA+IDApOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKChhYnNfc2VjdGlvbl9vZmZzZXQgJiAoKDEgPDwgbmFsaWduKSAtIDEpKSAhPSAwKQotCWFzX2JhZCAoXygibWlzYWxpZ25lZCBkYXRhIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBwID0gZnJhZ192YXIgKHJzX2FsaWduX2NvZGUsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsCi0JCShzeW1ib2xTICopIE5VTEwsIChvZmZzZXRUKSBuYWxpZ24sIChjaGFyICopIE5VTEwpOwotCi0gIHJlY29yZF9hbGlnbm1lbnQgKG5vd19zZWcsIG5hbGlnbik7Ci19Ci0KLS8qIFRoaXMgaXMgd2hlcmUgd2UgZG8gdGhlIHVuZXhwZWN0ZWQgYWxpZ25tZW50IGNoZWNrLgotICAgVGhpcyBpcyBjYWxsZWQgZnJvbSBIQU5ETEVfQUxJR04gaW4gdGMtc3BhcmMuaC4gICovCi0KLXZvaWQKLXNwYXJjX2hhbmRsZV9hbGlnbiAoZnJhZ3ApCi0gICAgIGZyYWdTICpmcmFncDsKLXsKLSAgaWYgKGZyYWdwLT5mcl90eXBlID09IHJzX2FsaWduX2NvZGUgJiYgIWZyYWdwLT5mcl9zdWJ0eXBlCi0gICAgICAmJiBmcmFncC0+ZnJfbmV4dC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9hZGRyZXNzIC0gZnJhZ3AtPmZyX2ZpeCAhPSAwKQotICAgIGFzX2JhZF93aGVyZSAoZnJhZ3AtPmZyX2ZpbGUsIGZyYWdwLT5mcl9saW5lLCBfKCJtaXNhbGlnbmVkIGRhdGEiKSk7Ci0gIGlmIChmcmFncC0+ZnJfdHlwZSA9PSByc19hbGlnbl9jb2RlICYmIGZyYWdwLT5mcl9zdWJ0eXBlID09IDEwMjQpCi0gICAgewotICAgICAgaW50IGNvdW50ID0gZnJhZ3AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFncC0+ZnJfYWRkcmVzcyAtIGZyYWdwLT5mcl9maXg7Ci0gICAgICAKLSAgICAgIGlmIChjb3VudCA+PSA0Ci0JICAmJiAhKGNvdW50ICYgMykKLQkgICYmIGNvdW50IDw9IDEwMjQKLQkgICYmICEoKGxvbmcpKGZyYWdwLT5mcl9saXRlcmFsICsgZnJhZ3AtPmZyX2ZpeCkgJiAzKSkKLSAgICAgICAgewotICAgICAgICAgIHVuc2lnbmVkICpwID0gKHVuc2lnbmVkICopKGZyYWdwLT5mcl9saXRlcmFsICsgZnJhZ3AtPmZyX2ZpeCk7Ci0gICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgCi0gICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICs9IDQsIHArKykKLSAgICAgICAgICAgIGlmIChJTlNOX0JJR19FTkRJQU4pCi0gICAgICAgICAgICAgIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKChjaGFyICopcCwgMHgwMTAwMDAwMCwgNCk7IC8qIGVtaXQgbm9wcyAqLwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuICgoY2hhciAqKXAsIDB4MTAwMDAwMDAsIDQpOwotCi0gICAgICAgICAgaWYgKFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AgKG1heF9hcmNoaXRlY3R1cmUpICYmIGNvdW50ID4gOCkKLSAgICAgICAgICAgIHsKLQkgICAgICBjaGFyICp3YWRkciA9ICZmcmFncC0+ZnJfbGl0ZXJhbFtmcmFncC0+ZnJfZml4XTsKLQkgICAgICB1bnNpZ25lZCB3dmFsID0gKDB4MzA2ODAwMDAgfCBjb3VudCA+PiAyKTsgLyogYmEsYSxwdCAleGNjLCAxZiAqLwotCSAgICAgIGlmIChJTlNOX0JJR19FTkRJQU4pCi0JCW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHdhZGRyLCB3dmFsLCA0KTsKLQkgICAgICBlbHNlCi0JCW51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKHdhZGRyLCB3dmFsLCA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICBmcmFncC0+ZnJfdmFyID0gY291bnQ7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNpZmRlZiBPQkpfRUxGCi0vKiBTb21lIHNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgYSBTcGFyYyBFTEYgZmlsZS4gICovCi0KLXZvaWQKLXNwYXJjX2VsZl9maW5hbF9wcm9jZXNzaW5nICgpCi17Ci0gIC8qIFNldCB0aGUgU3BhcmMgRUxGIGZsYWcgYml0cy4gIEZJWE1FOiBUaGVyZSBzaG91bGQgcHJvYmFibHkgYmUgc29tZQotICAgICBzb3J0IG9mIEJGRCBpbnRlcmZhY2UgZm9yIHRoaXMuICAqLwotICBpZiAoc3BhcmNfYXJjaF9zaXplID09IDY0KQotICAgIHsKLSAgICAgIHN3aXRjaCAoc3BhcmNfbWVtb3J5X21vZGVsKQotCXsKLQljYXNlIE1NX1JNTzoKLQkgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNWOV9STU87Ci0JICBicmVhazsKLQljYXNlIE1NX1BTTzoKLQkgIGVsZl9lbGZoZWFkZXIgKHN0ZG91dHB1dCktPmVfZmxhZ3MgfD0gRUZfU1BBUkNWOV9QU087Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoY3VycmVudF9hcmNoaXRlY3R1cmUgPj0gU1BBUkNfT1BDT0RFX0FSQ0hfVjkpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9TUEFSQ18zMlBMVVM7Ci0gIGlmIChjdXJyZW50X2FyY2hpdGVjdHVyZSA9PSBTUEFSQ19PUENPREVfQVJDSF9WOUEpCi0gICAgZWxmX2VsZmhlYWRlciAoc3Rkb3V0cHV0KS0+ZV9mbGFncyB8PSBFRl9TUEFSQ19TVU5fVVMxOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IGVtaXRfZXhwciB2aWEgVENfQ09OU19GSVhfTkVXIHdoZW4gY3JlYXRpbmcgYQotICAgcmVsb2MgZm9yIGEgY29ucy4gIFdlIGNvdWxkIHVzZSB0aGUgZGVmaW5pdGlvbiB0aGVyZSwgZXhjZXB0IHRoYXQKLSAgIHdlIHdhbnQgdG8gaGFuZGxlIGxpdHRsZSBlbmRpYW4gcmVsb2NzIHNwZWNpYWxseS4gICovCi0KLXZvaWQKLWNvbnNfZml4X25ld19zcGFyYyAoZnJhZywgd2hlcmUsIG5ieXRlcywgZXhwKQotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgaW50IHdoZXJlOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcjsKLQotICByID0gKG5ieXRlcyA9PSAxID8gQkZEX1JFTE9DXzggOgotICAgICAgIChuYnl0ZXMgPT0gMiA/IEJGRF9SRUxPQ18xNiA6Ci0JKG5ieXRlcyA9PSA0ID8gQkZEX1JFTE9DXzMyIDogQkZEX1JFTE9DXzY0KSkpOwotCi0gIGlmICh0YXJnZXRfbGl0dGxlX2VuZGlhbl9kYXRhICYmIG5ieXRlcyA9PSA0Ci0gICAgICAmJiBub3dfc2VnLT5mbGFncyAmIFNFQ19BTExPQykgIAotICAgIHIgPSBCRkRfUkVMT0NfU1BBUkNfUkVWMzI7Ci0gIGZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgKGludCkgbmJ5dGVzLCBleHAsIDAsIHIpOwotfQotCi0jaWZkZWYgT0JKX0VMRgotaW50Ci1lbGYzMl9zcGFyY19mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICAgc3RydWN0IGZpeCAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotIAotICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXNwYXJjLmggYi9nYXMvY29uZmlnL3RjLXNwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MDMxZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy1zcGFyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qIHRjLXNwYXJjLmggLSBNYWNyb3MgYW5kIHR5cGUgZGVmaW5lcyBmb3IgdGhlIHNwYXJjLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MC05NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsCi0gICBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLSAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotICAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRDX1NQQVJDCi0jZGVmaW5lIFRDX1NQQVJDIDEKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGZyYWc7Ci0jZW5kaWYKLQotLyogVGhpcyBpcyB1c2VkIHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYHRhcmdldF9iaWdfZW5kaWFuJy4gICovCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jZGVmaW5lIFRBUkdFVF9BUkNIIGJmZF9hcmNoX3NwYXJjCi0KLWV4dGVybiBjb25zdCBjaGFyICpzcGFyY190YXJnZXRfZm9ybWF0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCBzcGFyY190YXJnZXRfZm9ybWF0ICgpCi0KLSNpZiAwCi0jaWZkZWYgVEVfU1BBUkNBT1VUCi0vKiBCaS1lbmRpYW4gc3VwcG9ydCBtYXkgZXZlbnR1YWxseSBiZSB1bmNvbmRpdGlvbmFsLCBidXQgdW50aWwgdGhpbmdzIGFyZQotICAgd29ya2luZyB3ZWxsIGl0J3Mgb25seSBwcm92aWRlZCBmb3IgdGFyZ2V0cyB0aGF0IG5lZWQgaXQuICAqLwotI2RlZmluZSBTUEFSQ19CSUVORElBTgotI2VuZGlmCi0jZW5kaWYKLS8qIE1ha2UgaXQgdW5jb25kaXRpb25hbCBhbmQgY2hlY2sgaWYgLUVMIGlzIHZhbGlkIGFmdGVyIG9wdGlvbiBwYXJzaW5nICovCi0jZGVmaW5lIFNQQVJDX0JJRU5ESUFOCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jZGVmaW5lIG1kX2NvbnZlcnRfZnJhZyhiLHMsZikJCXthc19mYXRhbCAoXygic3BhcmMgY29udmVydF9mcmFnXG4iKSk7fQotI2RlZmluZSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheChmLHMpIFwKLQkJCShhc19mYXRhbChfKCJlc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBjYWxsZWQiKSksMSkKLQotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiU1BBUkMgR0FTICIKLQotZXh0ZXJuIGludCBzcGFyY19waWNfY29kZTsKLQotI2RlZmluZSBtZF9kb19hbGlnbihuLCBmaWxsLCBsZW4sIG1heCwgYXJvdW5kKQkJCQlcCi1pZiAoKG4pICYmIChuKSA8PSAxMCAmJiAhbmVlZF9wYXNzXzIgJiYgIShmaWxsKQkJCQlcCi0gICAgJiYgc3Vic2VnX3RleHRfcCAobm93X3NlZykpCQkJCQkJXAotICB7CQkJCQkJCQkJXAotICAgIGNoYXIgKnA7CQkJCQkJCQlcCi0gICAgcCA9IGZyYWdfdmFyIChyc19hbGlnbl9jb2RlLCAxIDw8IG4sIDEsIChyZWxheF9zdWJzdGF0ZVQpIDEwMjQsCVwKLSAgICAgICAgICAgICAgICAgIChzeW1ib2xTICopIDAsIChvZmZzZXRUKSAobiksIChjaGFyICopIDApOwkJXAotICAgICpwID0gMHgwMDsJCQkJCQkJCVwKLSAgICBnb3RvIGFyb3VuZDsJCQkJCQkJXAotICB9Ci0KLS8qIFdlIHJlcXVpcmUgLndvcmQsIGV0LiBhbC4sIHRvIGJlIGFsaWduZWQgY29ycmVjdGx5LiAgKi8KLSNkZWZpbmUgbWRfY29uc19hbGlnbihuYnl0ZXMpIHNwYXJjX2NvbnNfYWxpZ24gKG5ieXRlcykKLWV4dGVybiB2b2lkIHNwYXJjX2NvbnNfYWxpZ24gUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIEhBTkRMRV9BTElHTihmcmFncCkgc3BhcmNfaGFuZGxlX2FsaWduIChmcmFncCkKLWV4dGVybiB2b2lkIHNwYXJjX2hhbmRsZV9hbGlnbiBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqKSk7Ci0KLSNpZiBkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQU9VVCkKLQotLyogVGhpcyBleHByZXNzaW9uIGV2YWx1YXRlcyB0byBmYWxzZSBpZiB0aGUgcmVsb2NhdGlvbiBpcyBmb3IgYSBsb2NhbAotICAgb2JqZWN0IGZvciB3aGljaCB3ZSBzdGlsbCB3YW50IHRvIGRvIHRoZSByZWxvY2F0aW9uIGF0IHJ1bnRpbWUuCi0gICBUcnVlIGlmIHdlIGFyZSB3aWxsaW5nIHRvIHBlcmZvcm0gdGhpcyByZWxvY2F0aW9uIHdoaWxlIGJ1aWxkaW5nCi0gICB0aGUgLm8gZmlsZS4KLQotICAgSWYgdGhlIHJlbG9jIGlzIGFnYWluc3QgYW4gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbCwgdGhlbiB0aGUKLSAgIGEub3V0IGFzc2VtYmxlciBzaG91bGQgbm90IGRvIHRoZSByZWxvY2F0aW9uIGlmIGdlbmVyYXRpbmcgUElDLCBhbmQKLSAgIHRoZSBFTEYgYXNzZW1ibGVyIHNob3VsZCBuZXZlciBkbyB0aGUgcmVsb2NhdGlvbi4gICovCi0KLSNpZmRlZiBPQkpfRUxGCi0jZGVmaW5lIG9ial9yZWxvY2F0ZV9leHRlcm4gMAotI2Vsc2UKLSNkZWZpbmUgb2JqX3JlbG9jYXRlX2V4dGVybiAoISBzcGFyY19waWNfY29kZSkKLSNlbmRpZgotCi0jZGVmaW5lIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUChGSVgpICBcCi0gIChvYmpfcmVsb2NhdGVfZXh0ZXJuIFwKLSAgIHx8IChGSVgpLT5meF9hZGRzeSA9PSBOVUxMIFwKLSAgIHx8ICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpIFwKLSAgICAgICAmJiBTX0lTX0RFRklORUQgKChGSVgpLT5meF9hZGRzeSkgXAotICAgICAgICYmICEgU19JU19DT01NT04gKChGSVgpLT5meF9hZGRzeSkpKQotI2VuZGlmCi0KLS8qIEkga25vdyB0aGF0ICJjYWxsIDAiIGZhaWxzIGluIHNwYXJjLWNvZmYgaWYgdGhpcyBkb2Vzbid0IHJldHVybiAxLiAgSQotICAgZG9uJ3Qga25vdyBhYm91dCBvdGhlciByZWxvY2F0aW9uIHR5cGVzLCBvciBvdGhlciBmb3JtYXRzLCB5ZXQuICAqLwotI2lmZGVmIE9CSl9DT0ZGCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkJXAotCSgoRklYUCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzJfUENSRUxfUzIgXAotCSAmJiAoKEZJWFApLT5meF9hZGRzeSA9PSAwIFwKLQkgICAgIHx8IFNfR0VUX1NFR01FTlQgKChGSVhQKS0+ZnhfYWRkc3kpID09IGFic29sdXRlX3NlY3Rpb24pKQotI2RlZmluZSBSRUxPQ19SRVFVSVJFU19TWU1CT0wKLSNlbmRpZgotCi0jaWZkZWYgT0JKX0VMRgotI2RlZmluZSBUQ19GT1JDRV9SRUxPQ0FUSU9OKGZpeHApIGVsZjMyX3NwYXJjX2ZvcmNlX3JlbG9jYXRpb24oZml4cCkKLWV4dGVybiBpbnQgZWxmMzJfc3BhcmNfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLSNlbmRpZgotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgVENfSEFORExFU19GWF9ET05FCi0KLSNpZmRlZiBPQkpfRUxGCi0vKiBLZWVwIHJlbG9jYXRpb25zIGFnYWluc3QgZ2xvYmFsIHN5bWJvbHMuICBEb24ndCB0dXJuIHRoZW0gaW50bwotICAgcmVsb2NhdGlvbnMgYWdhaW5zdCBzZWN0aW9ucy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBkeW5hbWljCi0gICBsaW5rZXIgdG8gb3BlcmF0ZSBwcm9wZXJseS4gIFdoZW4gZ2VuZXJhdGluZyBQSUMsIHdlIG5lZWQgdG8ga2VlcAotICAgYW55IG5vbiBQQyByZWxhdGl2ZSByZWxvYy4gICovCi0jZGVmaW5lIHRjX2ZpeF9hZGp1c3RhYmxlKEZJWCkJCQkJCQlcCi0gICghIFNfSVNfRVhURVJOQUwgKChGSVgpLT5meF9hZGRzeSkJCQkJCVwKLSAgICYmICEgU19JU19XRUFLICgoRklYKS0+ZnhfYWRkc3kpCQkJCQlcCi0gICAmJiAoISBzcGFyY19waWNfY29kZQkJCQkJCQlcCi0gICAgICAgfHwgKEZJWCktPmZ4X3BjcmVsCQkJCQkJXAotICAgICAgIHx8ICgoRklYKS0+Znhfc3Vic3kgIT0gTlVMTAkJCQkJXAotCSAgICYmIChTX0dFVF9TRUdNRU5UICgoRklYKS0+Znhfc3Vic3kpCQkJCVwKLQkgICAgICAgPT0gU19HRVRfU0VHTUVOVCAoKEZJWCktPmZ4X2FkZHN5KSkpCQkJXAotICAgICAgIHx8IHN0cmNociAoU19HRVRfTkFNRSAoKEZJWCktPmZ4X2FkZHN5KSwgJ1wwMDEnKSAhPSBOVUxMCQlcCi0gICAgICAgfHwgc3RyY2hyIChTX0dFVF9OQU1FICgoRklYKS0+ZnhfYWRkc3kpLCAnXDAwMicpICE9IE5VTEwpKQotI2VuZGlmCi0KLSNpZmRlZiBPQkpfQU9VVAotLyogV2hlbiBnZW5lcmF0aW5nIFBJQyBjb2RlLCB3ZSBtdXN0IG5vdCBhZGp1c3QgYW55IHJlbG9jIHdoaWNoIHdpbGwKLSAgIHR1cm4gaW50byBhIHJlbG9jIGFnYWluc3QgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUsIG5vciBhbnkgcmVsb2MKLSAgIHdoaWNoIHdlIHdpbGwgbmVlZCBpZiBhIHN5bWJvbCBpcyBvdmVycmlkZGVuLiAgKi8KLSNkZWZpbmUgdGNfZml4X2FkanVzdGFibGUoRklYKQkJCQkJCVwKLSAgKCEgc3BhcmNfcGljX2NvZGUJCQkJCQkJXAotICAgfHwgKChGSVgpLT5meF9wY3JlbAkJCQkJCQlcCi0gICAgICAgJiYgKChGSVgpLT5meF9hZGRzeSA9PSBOVUxMCQkJCQlcCi0JICAgfHwgKCEgU19JU19FWFRFUk5BTCAoKEZJWCktPmZ4X2FkZHN5KQkJCVwKLQkgICAgICAgJiYgISBTX0lTX1dFQUsgKChGSVgpLT5meF9hZGRzeSkpKSkJCQlcCi0gICB8fCAoRklYKS0+Znhfcl90eXBlID09IEJGRF9SRUxPQ18xNgkJCQkJXAotICAgfHwgKEZJWCktPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfMzIpCi0jZW5kaWYKLQotI2RlZmluZSBlbGZfdGNfZmluYWxfcHJvY2Vzc2luZyBzcGFyY19lbGZfZmluYWxfcHJvY2Vzc2luZwotZXh0ZXJuIHZvaWQgc3BhcmNfZWxmX2ZpbmFsX3Byb2Nlc3NpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIHZvaWQgc3BhcmNfbWRfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgbWRfZW5kKCkgc3BhcmNfbWRfZW5kICgpCi0KLSNlbmRpZgotCi0jZGVmaW5lIFRDX0NPTlNfRklYX05FVyBjb25zX2ZpeF9uZXdfc3BhcmMKLWV4dGVybiB2b2lkIGNvbnNfZml4X25ld19zcGFyYwotICBQQVJBTVMgKChzdHJ1Y3QgZnJhZyAqLCBpbnQsIHVuc2lnbmVkIGludCwgc3RydWN0IGV4cHJlc3Npb25TICopKTsKLQotLyogZW5kIG9mIHRjLXNwYXJjLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGFob2UuYyBiL2dhcy9jb25maWcvdGMtdGFob2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhNzUyNC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRhaG9lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDI3ICswLDAgQEAKLS8qIHRjLXRhaG9lLmMKLSAgIE5vdCBwYXJ0IG9mIEdBUyB5ZXQuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogdGhpcyBiaXQgZ2xvbW1lZCBmcm9tIHRhaG9lLWluc3QuaCAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZTsKLXR5cGVkZWYgYnl0ZSB0YWhvZV9vcGNvZGVUOwotCi0vKgotICogVGhpcyBpcyBwYXJ0IG9mIHRhaG9lLWlucy1wYXJzZS5jICYgZnJpZW5kcy4KLSAqIFdlIHdhbnQgdG8gcGFyc2UgYSB0YWhvZSBpbnN0cnVjdGlvbiB0ZXh0IGludG8gYSB0cmVlIGRlZmluZWQgaGVyZS4KLSAqLwotCi0jZGVmaW5lIFRJVF9NQVhfT1BFUkFORFMgKDQpCS8qIG1heGltdW0gbnVtYmVyIG9mIG9wZXJhbmRzIGluIG9uZQotCQkJCSAgIHNpbmdsZSB0YWhvZSBpbnN0cnVjdGlvbiAqLwotCi1zdHJ1Y3QgdG9wCQkJLyogdGFob2UgaW5zdHJ1Y3Rpb24gb3BlcmFuZCAqLwotewotICBpbnQgdG9wX25keDsJCQkvKiAtMSwgb3IgaW5kZXggcmVnaXN0ZXIuIGVnIDc9W1I3XSAqLwotICBpbnQgdG9wX3JlZzsJCQkvKiAtMSwgb3IgcmVnaXN0ZXIgbnVtYmVyLiBlZyA3ID0gUjcgb3IgKFI3KSAqLwotICBieXRlIHRvcF9tb2RlOwkJLyogQWRkcmVzc2luZyBtb2RlIGJ5dGUuIFRoaXMgYnl0ZSwgZGVmaW5lcwotCQkJCSAgIHdoaWNoIG9mIHRoZSAxMSBtb2RlcyBvcGNvZGUgaXMuICovCi0KLSAgY2hhciB0b3BfYWNjZXNzOwkJLyogQWNjZXNzIHR5cGUgd2FudGVkIGZvciB0aGlzIG9wcGVyYW5kCi0JCQkJICAgJ2InYnJhbmNoICcgJ25vLWluc3RydWN0aW9uICdhbXJ2dycgKi8KLSAgY2hhciB0b3Bfd2lkdGg7CQkvKiBPcGVyYW5kIHdpZHRoIGV4cGVjdGVkLCBvbmUgb2YgImJ3bHE/LTohIiAqLwotCi0gIGNoYXIgKnRvcF9lcnJvcjsJCS8qIFNheSBpZiBvcGVyYW5kIGlzIGluYXBwcm9wcmlhdGUgICAgICAgICAqLwotCi0gIHNlZ1Qgc2VnX29mX29wZXJhbmQ7CQkvKiBzZWdtZW50IGFzIHJldHVybmVkIGJ5IGV4cHJlc3Npb24oKSovCi0KLSAgZXhwcmVzc2lvblMgZXhwX29mX29wZXJhbmQ7CS8qIFRoZSBleHByZXNzaW9uIGFzIHBhcnNlZCBieSBleHByZXNzaW9uKCkqLwotCi0gIGJ5dGUgdG9wX2Rpc3BzaXplOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBkaXNwbGFjZW1lbnQgaWYgd2UKLQkJCQkgICBjYW4gZmlndXJlIGl0IG91dCAqLwotfTsKLQotLyogVGhlIGFkZHJlc3NpbmcgbW9kZXMgZm9yIGFuIG9wZXJhbmQuIFRoZXNlIG51bWJlcnMgYXJlIHRoZSBhY3V0YWwgdmFsdWVzCi0gICBmb3IgY2VydGFpbiBtb2Rlcywgc28gYmUgY2FyZWZ1bGwgaWYgeW91IHNjcmV3IHdpdGggdGhlbS4gKi8KLSNkZWZpbmUgVEFIT0VfRElSRUNUX1JFRyAoMHg1MCkKLSNkZWZpbmUgVEFIT0VfUkVHX0RFRkVSUkVEICgweDYwKQotCi0jZGVmaW5lIFRBSE9FX1JFR19ESVNQICgweEUwKQotI2RlZmluZSBUQUhPRV9SRUdfRElTUF9ERUZFUlJFRCAoMHhGMCkKLQotI2RlZmluZSBUQUhPRV9JTU1FRElBVEUgKDB4OEYpCi0jZGVmaW5lIFRBSE9FX0lNTUVESUFURV9CWVRFICgweDg4KQotI2RlZmluZSBUQUhPRV9JTU1FRElBVEVfV09SRCAoMHg4OSkKLSNkZWZpbmUgVEFIT0VfSU1NRURJQVRFX0xPTkdXT1JEICgweDhGKQotI2RlZmluZSBUQUhPRV9BQlNPTFVURV9BRERSICgweDlGKQotCi0jZGVmaW5lIFRBSE9FX0RJU1BMQUNFRF9SRUxBVElWRSAoMHhFRikKLSNkZWZpbmUgVEFIT0VfRElTUF9SRUxfREVGRVJSRUQgKDB4RkYpCi0KLSNkZWZpbmUgVEFIT0VfQVVUT19ERUMgKDB4N0UpCi0jZGVmaW5lIFRBSE9FX0FVVE9fSU5DICgweDhFKQotI2RlZmluZSBUQUhPRV9BVVRPX0lOQ19ERUZFUlJFRCAoMHg5RSkKLS8qIElOREVYRURfUkVHIGlzIGRlY2lkZWQgYnkgdGhlIGV4aXN0YW5jZSBvciBsYWNrIG9mIGEgW3JlZ10gKi8KLQotLyogVGhlc2UgYXJlIGVuY29kZWQgaW50byB0b3Bfd2lkdGggd2hlbiB0b3BfYWNjZXNzPT0nYicKLSAgIGFuZCBpdCdzIGEgcHN1ZWRvIG9wLiovCi0jZGVmaW5lIFRBSE9FX1dJRFRIX0FMV0FZU19KVU1QICAgICAgJy0nCi0jZGVmaW5lIFRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVAgJz8nCi0jZGVmaW5lIFRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUCAgICAgJyEnCi0jZGVmaW5lIFRBSE9FX1dJRFRIX0JJR19OT05fUkVWX0pVTVAgJzonCi0KLS8qIFRoZSBoZXggY29kZSBmb3IgY2VydGFpbiB0YWhvZSBjb21tYW5kcyBhbmQgbW9kZXMuCi0gICBUaGlzIGlzIGp1c3QgZm9yIHJlYWRhYmlsaXR5LiAqLwotI2RlZmluZSBUQUhPRV9KTVAgKDB4NzEpCi0jZGVmaW5lIFRBSE9FX1BDX1JFTF9MT05HICgweEVGKQotI2RlZmluZSBUQUhPRV9CUkIgKDB4MTEpCi0jZGVmaW5lIFRBSE9FX0JSVyAoMHgxMykKLS8qIFRoZXNlLCB3aGVuICdvcmVkJyB3aXRoLCBvciBhZGRlZCB0bywgYSByZWdpc3RlciBudW1iZXIsCi0gICBzZXQgdXAgdGhlIG51bWJlciBmb3IgdGhlIGRpc3BsYWNlbWVudCBtb2RlLiAqLwotI2RlZmluZSBUQUhPRV9QQ19PUl9CWVRFICgweEEwKQotI2RlZmluZSBUQUhPRV9QQ19PUl9XT1JEICgweEMwKQotI2RlZmluZSBUQUhPRV9QQ19PUl9MT05HICgweEUwKQotCi1zdHJ1Y3QgdGl0CQkJLyogZ2V0IGl0IG91dCBvZiB0aGUgc2V3ZXIsIGl0IHN0YW5kcyBmb3IKLQkJCQkgICB0YWhvZSBpbnN0cnVjdGlvbiB0cmVlIChHZWV6ZSEpICovCi17Ci0gIHRhaG9lX29wY29kZVQgdGl0X29wY29kZTsJLyogVGhlIG9wY29kZS4gKi8KLSAgYnl0ZSB0aXRfb3BlcmFuZHM7CQkvKiBIb3cgbWFueSBvcGVyYW5kcyBhcmUgaGVyZS4gKi8KLSAgc3RydWN0IHRvcCB0aXRfb3BlcmFuZFtUSVRfTUFYX09QRVJBTkRTXTsJLyogT3BlcmFuZHMgKi8KLSAgY2hhciAqdGl0X2Vycm9yOwkJLyogIiIgb3IgZmF0YWwgZXJyb3IgdGV4dCAqLwotfTsKLQotLyogZW5kOiB0YWhvZS1pbnN0LmggKi8KLQotLyogdGFob2UuYyAtIHRhaG9lLXNwZWNpZmljIC0KLSAgIE5vdCBwYXJ0IG9mIGdhcyB5ZXQuCi0gICAqLwotCi0jaW5jbHVkZSAib3Bjb2RlL3RhaG9lLmgiCi0KLS8qIFRoaXMgaXMgdGhlIG51bWJlciB0byBwdXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYS5vdXQgZmlsZSAqLwotbG9uZyBvbWFnaWMgPSBPTUFHSUM7Ci0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgb3IgYSBxdW90ZWQgc3RyaW5nLiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIzsiOwotCi0vKiBUaGVzZSBjaGFycyBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc2VwYXJhdGUgbWFudCBmcm9tIGV4cCBpbiBmbG9hdGluZyBwb2ludCBudW1zICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAgIGFzIGluIDBmMTIzLjQ1NgotICAgb3IgICAgMGQxLjIzNEUtMTIgKHNlZSBleHAgY2hhcnMgYWJvdmUpCi0gICBOb3RlOiBUaGUgVGFob2UgcG9ydCBkb2Vzbid0IHN1cHBvcnQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLiBUaGlzIGlzCi0gICAgICAgICBjb25zaXN0YW50IHdpdGggJ2FzJyBJZiBpdCdzIG5lZWRlZCwgSSBjYW4gYWx3YXlzIGFkZCBpdCBsYXRlci4gKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZGYiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuCi0gICAoVGhlIHRhaG9lIGhhcyBwbGVudHkgb2Ygcm9vbSwgc28gdGhlIGNoYW5nZSBjdXJyZW50bHkgaXNuJ3QgbmVlZGVkLikKLSAgICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGl0IHQ7CQkvKiBBIHRhaG9lIGluc3RydWN0aW9uIGFmdGVyIGRlY29kaW5nLiAqLwotCi12b2lkIGZsb2F0X2NvbnMgKCk7Ci0vKiBBIHRhYmxlIG9mIHBzZXVkbyBvcHMgKHNhbnMgLiksIHRoZSBmdW5jdGlvbiBjYWxsZWQsIGFuZCBhbiBpbnRlZ2VyIG9wCi0gICB0aGF0IHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aC4gKi8KLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHswfQotfTsKLQwKLS8qCi0gKiBGb3IgVGFob2UsIHJlbGF0aXZlIGFkZHJlc3NlcyBvZiAianVzdCB0aGUgcmlnaHQgbGVuZ3RoIiBhcmUgcHJldHR5IGVhc3kuCi0gKiBUaGUgYnJhbmNoIGRpc3BsYWNlbWVudCBpcyBhbHdheXMgdGhlIGxhc3Qgb3BlcmFuZCwgZXZlbiBpbgotICogc3ludGhldGljIGluc3RydWN0aW9ucy4KLSAqIEZvciBUYWhvZSwgd2UgZW5jb2RlIHRoZSByZWxheF9zdWJzdGF0ZVRzIChpbiBlLmcuIGZyX3N1YnN0YXRlKSBhczoKLSAqCi0gKgkJICAgIDQgICAgICAgMyAgICAgICAyICAgICAgIDEgICAgICAgMAkgICAgIGJpdCBudW1iZXIKLSAqCS0tLS8gLy0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKLSAqCQl8ICAgICB3aGF0IHN0YXRlID8JfCAgaG93IGxvbmcgPwl8Ci0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgotICogVGhlICJob3cgbG9uZyIgYml0cyBhcmUgMDA9Ynl0ZSwgMDE9d29yZCwgMTA9bG9uZy4KLSAqIFRoaXMgaXMgYSBVbip4IGNvbnZlbnRpb24uCi0gKiBOb3QgYWxsIGxlbmd0aHMgYXJlIGxlZ2l0IGZvciBhIGdpdmVuIHZhbHVlIG9mICh3aGF0IHN0YXRlKS4KLSAqIFRoZSBmb3VyIHN0YXRlcyBhcmUgbGlzdGVkIGJlbG93LgotICogVGhlICJob3cgbG9uZyIgcmVmZXJzIG1lcmVseSB0byB0aGUgZGlzcGxhY2VtZW50IGxlbmd0aC4KLSAqIFRoZSBhZGRyZXNzIHVzdWFsbHkgaGFzIHNvbWUgY29uc3RhbnQgYnl0ZXMgaW4gaXQgYXMgd2VsbC4KLSAqCi0KLVN0YXRlcyBmb3IgVGFob2UgYWRkcmVzcyByZWxheGluZy4KLTEuCVRBSE9FX1dJRFRIX0FMV0FZU19KVU1QICgtKQotCUZvcm1hdDogImItIgotCVRhaG9lIG9wY29kZXMgYXJlOgkoSGV4KQotCQlqcgkJMTEKLQkJamJyCQkxMQotCVNpbXBsZSBicmFuY2guCi0JQWx3YXlzLCAxIGJ5dGUgb3Bjb2RlLCB0aGVuIGRpc3BsYWNlbWVudC9hYnNvbHV0ZS4KLQlJZiB3b3JkIG9yIGxvbmd3b3JkLCBjaGFuZ2Ugb3Bjb2RlIHRvIGJydyBvciBqbXAuCi0KLQkKLTIuCVRBSE9FX1dJRFRIX0NPTkRJVElPTkFMX0pVTVAgKD8pCi0JSjxjb25kPiB3aGVyZSA8Y29uZD4gaXMgYSBzaW1wbGUgZmxhZyB0ZXN0LgotCUZvcm1hdDogImI/IgotCVRhaG9lIG9wY29kZXMgYXJlOgkoSGV4KQotCQlqbmVxL2puZXF1CTIxCi0JCWplcWwvamVxbHUJMzEKLQkJamd0cgkJNDEKLQkJamxlcQkJNTEKLQkJamdlcQkJODEKLQkJamxzcwkJOTEKLQkJamd0cnUJCWExCi0JCWpsZXF1CQliMQotCQlqdmMJCWMxCi0JCWp2cwkJZDEKLQkJamxzc3UvamNzCWUxCi0JCWpnZXF1L2pjYwlmMQotCUFsd2F5cywgeW91IGNvbXBsZW1lbnQgNHRoIGJpdCB0byByZXZlcnNlIHRoZSBjb25kaXRpb24uCi0JQWx3YXlzLCAxLWJ5dGUgb3Bjb2RlLCB0aGVuIDEtYnl0ZSBkaXNwbGFjZW1lbnQuCi0KLTMuCVRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUCAoISkKLQlKYmMvSmJzIHdoZXJlIGNvbmQgdGVzdHMgYSBtZW1vcnkgYml0LgotCUZvcm1hdDogInJsdmxiISIKLQlUYWhvZSBvcGNvZGVzIGFyZToJKEhleCkKLQkJamJzCQkwZQotCQlqYmMJCTFlCi0JQWx3YXlzLCB5b3UgY29tcGxlbWVudCA0dGggYml0IHRvIHJldmVyc2UgdGhlIGNvbmRpdGlvbi4KLQlBbHdheXMsIDEtYnl0ZSBvcGNkZSwgbG9uZ3dvcmQsIGxvbmd3b3JkLWFkZHJlc3MsIDEtd29yZC1kaXNwbGFjZW1lbnQKLQotNC4JVEFIT0VfV0lEVEhfQklHX05PTl9SRVZfSlVNUCAoOikKLQlKYW9ibFhYL0pic3NpCi0JRm9ybWF0OiAicmxtbGI6IgotCVRhaG9lIG9wY29kZXMgYXJlOgkoSGV4KQotCQlhb2psc3MJCTJmCi0JCWphb2Jsc3MJCTJmCi0JCWFvamxlcQkJM2YKLQkJamFvYmxlcQkJM2YKLQkJamJzc2kJCTVmCi0JQWx3YXlzLCB3ZSBjYW5ub3QgcmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIGJyYW5jaDsgd2UgaGF2ZSBhIHdvcmQKLQlkaXNwbGFjZW1lbnQuCi0KLVdlIG5lZWQgdG8gbW9kaWZ5IHRoZSBvcGNvZGUgaXMgZm9yIGNsYXNzIDEsIDIgYW5kIDMgaW5zdHJ1Y3Rpb25zLgotQWZ0ZXIgcmVsYXgoKSB3ZSBtYXkgY29tcGxlbWVudCB0aGUgNHRoIGJpdCBvZiAyIG9yIDMgdG8gcmV2ZXJzZSBzZW5zZSBvZgotYnJhbmNoLgotCi1XZSBzb21ldGltZXMgc3RvcmUgY29udGV4dCBpbiB0aGUgb3BlcmFuZCBsaXRlcmFsLiBUaGlzIHdheSB3ZSBjYW4gZmlndXJlIG91dAotYWZ0ZXIgcmVsYXgoKSB3aGF0IHRoZSBvcmlnaW5hbCBhZGRyZXNzaW5nIG1vZGUgd2FzLiAoV2FzIGlzIHBjX3JlbCwgb3IKLXBjX3JlbF9kaXNwPyBUaGF0IHNvcnQgb2YgdGhpbmcuKSAqLwotDAotLyogVGhlc2UgZGlzcGxhY2VtZW50cyBhcmUgcmVsYXRpdmUgdG8gdGhlIFNUQVJUIGFkZHJlc3Mgb2YgdGhlCi0gICBkaXNwbGFjZW1lbnQgd2hpY2ggaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBkaXNwbGFjZW1lbnQsIG5vdCB0aGUgZW5kIG9mCi0gICB0aGUgaW5zdHJ1Y3Rpb24uIFRoZSBoYXJkd2FyZSBwY19yZWwgaXMgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb25zLgotICAgVGhhdCdzIHdoeSBhbGwgdGhlIGRpc3BsYWNlbWVudHMgaGF2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBkaXNwbGFjZW1lbnQgYWRkZWQKLSAgIHRvIHRoZW0uIChXRiArIGxlbmd0aCh3b3JkKSkKLQotICAgVGhlIGZpcnN0IGxldHRlciBpcyBCeXRlLCBXb3JkLgotICAgMm5kIGxldHRlciBpcyBGb3J3YXJkLCBCYWNrd2FyZC4gKi8KLSNkZWZpbmUgQkYgKDErIDEyNykKLSNkZWZpbmUgQkIgKDErLTEyOCkKLSNkZWZpbmUgV0YgKDIrIDMyNzY3KQotI2RlZmluZSBXQiAoMistMzI3NjgpCi0vKiBEb250IG5lZWQgTEYsIExCIGJlY2F1c2UgdGhleSBhbHdheXMgcmVhY2guIFtUaGV5IGFyZSBjb2RlZCBhcyAwLl0gKi8KLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLS8qIFRoaXMgbWFjcm8gaGFzIG5vIHNpZGUtZWZmZWN0cy4gKi8KLSNkZWZpbmUgRU5DT0RFX1JFTEFYKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQotI2RlZmluZSBSRUxBWF9TVEFURSh3aGF0KSAoKHdoYXQpID4+IDIpCi0jZGVmaW5lIFJFTEFYX0xFTkdUSChsZW5ndGgpICgobGVuZ3RoKSAmJiAzKQotCi0jZGVmaW5lIFNUQVRFX0FMV0FZU19CUkFOQ0ggICAgICAgICAgICAgKDEpCi0jZGVmaW5lIFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCAgICAgICAgKDIpCi0jZGVmaW5lIFNUQVRFX0JJR19SRVZfQlJBTkNIICAgICAgICAgICAgKDMpCi0jZGVmaW5lIFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCAgICAgICAgKDQpCi0jZGVmaW5lIFNUQVRFX1BDX1JFTEFUSVZFCQkoNSkKLQotI2RlZmluZSBTVEFURV9CWVRFICAgICAgICAgICAgICAgICAgICAgICgwKQotI2RlZmluZSBTVEFURV9XT1JEICAgICAgICAgICAgICAgICAgICAgICgxKQotI2RlZmluZSBTVEFURV9MT05HICAgICAgICAgICAgICAgICAgICAgICgyKQotI2RlZmluZSBTVEFURV9VTkRGICAgICAgICAgICAgICAgICAgICAgICgzKQkvKiBTeW1ib2wgdW5kZWZpbmVkIGluIHBhc3MxICovCi0KLS8qIFRoaXMgaXMgdGhlIHRhYmxlIHVzZWQgYnkgZ2FzIHRvIGZpZ3VyZSBvdXQgcmVsYXhpbmcgbW9kZXMuIFRoZSBmaWVsZHMgYXJlCi0gICBmb3J3YXJkX2JyYW5jaCByZWFjaCwgYmFja3dhcmRfYnJhbmNoIHJlYWNoLCBudW1iZXIgb2YgYnl0ZXMgaXQgd291bGQgdGFrZSwKLSAgIHdoZXJlIHRoZSBuZXh0IGJpZ2dlc3QgYnJhbmNoIGlzLiAqLwotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIGVycm9yIHNlbnRpbmVsICAgMCwwCSovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMCwxCSovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMCwyCSovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMCwzCSovCi0vKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCBjYXNlcyAianJiIgotICAgICBUaGUgcmVsYXggcGFydCBpcyB0aGUgYWN0dWFsIGRpc3BsYWNlbWVudCAqLwotICB7Ci0gICAgQkYsIEJCLCAxLCBDICgxLCAxKQotICB9LAkJCQkvKiBicmIgQmBmb28JICAgIDEsMCAqLwotICB7Ci0gICAgV0YsIFdCLCAyLCBDICgxLCAyKQotICB9LAkJCQkvKiBicncgV2Bmb28JICAgIDEsMSAqLwotICB7Ci0gICAgMCwgMCwgNSwgMAotICB9LAkJCQkvKiBKbXAgTGBmb28JICAgIDEsMiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDEsMyAqLwotLyogUmV2ZXJzaWJsZSBDb25kaXRpb25hbCBCcmFuY2guIElmIHRoZSBicmFuY2ggd29uJ3QgcmVhY2gsIHJldmVyc2UKLSAgICAgaXQsIGFuZCBqdW1wIG92ZXIgYSBicncgb3IgYSBqbXAgdGhhdCB3aWxsIHJlYWNoLiBUaGUgcmVsYXggcGFydCBpcyB0aGUKLSAgICAgYWN0dWFsIGFkZHJlc3MuICovCi0gIHsKLSAgICBCRiwgQkIsIDEsIEMgKDIsIDEpCi0gIH0sCQkJCS8qIGI8Y29uZD4gQmBmb28gICAgMiwwICovCi0gIHsKLSAgICBXRiArIDIsIFdCICsgMiwgNCwgQyAoMiwgMikKLSAgfSwJCQkJLyogYnJldiBvdmVyLCBicncgV2Bmb28sIG92ZXI6IDIsMSAqLwotICB7Ci0gICAgMCwgMCwgNywgMAotICB9LAkJCQkvKiBicmV2IG92ZXIsIGptcCBMYGZvbywgb3ZlcjogMiwyICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMiwzICovCi0vKiBBbm90aGVyIHR5cGUgb2YgcmV2ZXJzYWJsZSBicmFuY2guIEJ1dCB0aGlzIG9ubHkgaGFzIGEgd29yZAotICAgICBkaXNwbGFjZW1lbnQuICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgMywwICovCi0gIHsKLSAgICBXRiwgV0IsIDIsIEMgKDMsIDIpCi0gIH0sCQkJCS8qIGpiWCBXYGZvbwkgICAgMywxICovCi0gIHsKLSAgICAwLCAwLCA4LCAwCi0gIH0sCQkJCS8qIGpyZXZYIG92ZXIsIGptcCBMYGZvbywgb3ZlcjogIDMsMiAqLwotICB7Ci0gICAgMSwgMSwgMCwgMAotICB9LAkJCQkvKiB1bnVzZWQJICAgIDMsMyAqLwotLyogVGhlc2UgYXJlIHRoZSBub24gcmV2ZXJzYWJsZSBicmFuY2hlcywgYWxsIG9mIHdoaWNoIGhhdmUgYSB3b3JkCi0gICAgIGRpc3BsYWNlbWVudC4gSWYgSSBjYW4ndCByZWFjaCwgYnJhbmNoIG92ZXIgYSBieXRlIGJyYW5jaCwgdG8gYQotICAgICBqdW1wIHRoYXQgd2lsbCByZWFjaC4gVGhlIGp1bXBlZCBicmFuY2gganVtcHMgb3ZlciB0aGUgcmVhY2hpbmcKLSAgICAgYnJhbmNoLCB0byBjb250aW51ZSB3aXRoIHRoZSBmbG93IG9mIHRoZSBwcm9ncmFtLiBJdCdzIGxpa2UgcGxheWluZwotICAgICBsZWFwIGZyb2cuICovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgNCwwICovCi0gIHsKLSAgICBXRiwgV0IsIDIsIEMgKDQsIDIpCi0gIH0sCQkJCS8qIGFvYmxfIFdgZm9vCSAgICA0LDEgKi8KLSAgewotICAgIDAsIDAsIDEwLCAwCi0gIH0sCQkJCS8qYW9ibF8gV2Bob3AsYnIgb3Zlcixob3A6IGptcCBMXmZvbyxvdmVyIDQsMiovCi0gIHsKLSAgICAxLCAxLCAwLCAwCi0gIH0sCQkJCS8qIHVudXNlZAkgICAgNCwzICovCi0vKiBOb3JtYWwgZGlzcGxhY2VtZW50IG1vZGUsIG5vIGp1bXBpbmcgb3IgYW55dGhpbmcgbGlrZSB0aGF0LgotICAgICBUaGUgcmVsYXggcG9pbnRzIHRvIG9uZSBieXRlIGJlZm9yZSB0aGUgYWRkcmVzcywgdGhhdHMgd2h5IGFsbAotICAgICB0aGUgbnVtYmVycyBhcmUgdXAgYnkgb25lLiAqLwotICB7Ci0gICAgQkYgKyAxLCBCQiArIDEsIDIsIEMgKDUsIDEpCi0gIH0sCQkJCS8qIEJeImZvbyIJICAgIDUsMCAqLwotICB7Ci0gICAgV0YgKyAxLCBXQiArIDEsIDMsIEMgKDUsIDIpCi0gIH0sCQkJCS8qIFdeImZvbyIJICAgIDUsMSAqLwotICB7Ci0gICAgMCwgMCwgNSwgMAotICB9LAkJCQkvKiBMXiJmb28iCSAgICA1LDIgKi8KLSAgewotICAgIDEsIDEsIDAsIDAKLSAgfSwJCQkJLyogdW51c2VkCSAgICA1LDMgKi8KLX07Ci0KLSN1bmRlZiBDCi0jdW5kZWYgQkYKLSN1bmRlZiBCQgotI3VuZGVmIFdGCi0jdW5kZWYgV0IKLS8qIEVuZCByZWxheCBzdHVmZiAqLwotDAotLyogSGFuZGxlIG9mIHRoZSBPUENPREUgaGFzaCB0YWJsZS4gIE5VTEwgbWVhbnMgYW55IHVzZSBiZWZvcmUKLSAgIG1kX2JlZ2luKCkgd2lsbCBjcmFzaC4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLQotLyogSW5pdCBmdW5jdGlvbi4gQnVpbGQgdGhlIGhhc2ggdGFibGUuICovCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBzdHJ1Y3QgdG90ICp0UDsKLSAgY2hhciAqZXJyb3J2YWwgPSAwOwotICBpbnQgc3ludGhldGljX3RvbyA9IDE7CS8qIElmIDAsIGp1c3QgdXNlIHJlYWwgb3Bjb2Rlcy4gKi8KLQotICBvcF9oYXNoID0gaGFzaF9uZXcgKCk7Ci0KLSAgZm9yICh0UCA9IHRvdHN0cnM7ICp0UC0+bmFtZSAmJiAhZXJyb3J2YWw7IHRQKyspCi0gICAgZXJyb3J2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgdFAtPm5hbWUsICZ0UC0+ZGV0YWlsKTsKLQotICBpZiAoc3ludGhldGljX3RvbykKLSAgICBmb3IgKHRQID0gc3ludGhldGljX3RvdHN0cnM7ICp0UC0+bmFtZSAmJiAhZXJyb3J2YWw7IHRQKyspCi0gICAgICBlcnJvcnZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB0UC0+bmFtZSwgJnRQLT5kZXRhaWwpOwotCi0gIGlmIChlcnJvcnZhbCkKLSAgICBhc19mYXRhbCAoZXJyb3J2YWwpOwotfQotDAotQ09OU1QgY2hhciAqbWRfc2hvcnRvcHRzID0gImFkOlNUdDpWIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdhJzoKLSAgICAgIGFzX3dhcm4gKF8oIlRoZSAtYSBvcHRpb24gZG9lc24ndCBleGlzdC4gKERlc3BpdGUgd2hhdCB0aGUgbWFuIHBhZ2Ugc2F5cyEiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgYXNfd2FybiAoXygiRGlzcGxhY2VtZW50IGxlbmd0aCAlcyBpZ25vcmVkISIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgIGFzX3dhcm4gKF8oIlNZTUJPTCBUQUJMRSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgYXNfd2FybiAoXygiVE9LRU4gVFJBQ0Ugbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd0JzoKLSAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgbmVlZCBvciB1c2UgdGVtcC4gZmlsZSBcIiVzXCIuIiksIGFyZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1YnOgotICAgICAgYXNfd2FybiAoXygiSSBkb24ndCB1c2UgYW4gaW50ZXJwYXNzIGZpbGUhIC1WIGlnbm9yZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotVGFob2Ugb3B0aW9uczpcblwKLS1hCQkJaWdub3JlZFxuXAotLWQgTEVOR1RICQlpZ25vcmVkXG5cCi0tSgkJCWlnbm9yZWRcblwKLS1TCQkJaWdub3JlZFxuXAotLXQgRklMRQkJCWlnbm9yZWRcblwKLS1UCQkJaWdub3JlZFxuXAotLVYJCQlpZ25vcmVkXG4iKSk7Ci19Ci0MCi0vKiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiB0YWtlIG51bWJlcnMgaW4gdGhlIG1hY2hpbmUgZm9ybWF0LCBhbmQKLSAgIG11bmdlcyB0aGVtIGludG8gVGFob2UgYnl0ZSBvcmRlci4KLSAgIFRoZXkgZXhpc3QgcHJpbWFyaWx5IGZvciBjcm9zcyBhc3NlbWJseSBwdXJwb3NlLiAqLwotdm9pZAkJCQkvKiBLbm93cyBhYm91dCBvcmRlciBvZiBieXRlcyBpbiBhZGRyZXNzLiAqLwotbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgdmFsdWVUIHZhbHVlOwkJLyogVGhlIHZhbHVlIG9mIHRoZSBiaXRzLiAqLwotICAgICBpbnQgbmJ5dGVzOwkJLyogTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBvdXRwdXQuICovCi17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLSNpZmRlZiBjb21tZW50Ci12b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCi1tZF9udW1iZXJfdG9faW1tIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgbG9uZyBpbnQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpOwotfQotCi0jZW5kaWYgLyogY29tbWVudCAqLwotCi12b2lkCi10Y19hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIC8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgKi8KLSAga25vdyAoMCk7Ci19Ci0KLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX251bWJlcl90b19kaXNwIChjb24sIHZhbHVlLCBuYnl0ZXMpCi0gICAgIGNoYXIgY29uW107CQkvKiBSZXR1cm4gJ25ieXRlcycgb2YgY2hhcnMgaGVyZS4gKi8KLSAgICAgbG9uZyBpbnQgdmFsdWU7CQkvKiBUaGUgdmFsdWUgb2YgdGhlIGJpdHMuICovCi0gICAgIGludCBuYnl0ZXM7CQkvKiBOdW1iZXIgb2YgYnl0ZXMgaW4gdGhlIG91dHB1dC4gKi8KLXsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChjb24sIHZhbHVlLCBuYnl0ZXMpOwotfQotCi12b2lkCQkJCS8qIEtub3dzIGFib3V0IG9yZGVyIG9mIGJ5dGVzIGluIGFkZHJlc3MuICovCi1tZF9udW1iZXJfdG9fZmllbGQgKGNvbiwgdmFsdWUsIG5ieXRlcykKLSAgICAgY2hhciBjb25bXTsJCS8qIFJldHVybiAnbmJ5dGVzJyBvZiBjaGFycyBoZXJlLiAqLwotICAgICBsb25nIGludCB2YWx1ZTsJCS8qIFRoZSB2YWx1ZSBvZiB0aGUgYml0cy4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgb3V0cHV0LiAqLwotewotICBtZF9udW1iZXJfdG9fY2hhcnMgKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLS8qIFB1dCB0aGUgYml0cyBpbiBhbiBvcmRlciB0aGF0IGEgdGFob2Ugd2lsbCB1bmRlcnN0YW5kLCBkZXNwaXRlIHRoZSBvcmRlcmluZwotICAgb2YgdGhlIG5hdGl2ZSBtYWNoaW5lLgotICAgT24gVGFob2U6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBiaWcgZW5kaWFuIGxvbmcsCi0gICBuZXh0IHRocmVlIGJ5dGVzIGFyZSBzeW1ib2xudW0sIGluIGtpbmQgb2YgMyBieXRlIGJpZyBlbmRpYW4gKGxlYXN0IHNpZy4gYnl0ZSBsYXN0KS4KLSAgIFRoZSBsYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGggYml0IDcgYXMgcGNyZWwsCi0gICAJYml0cyA2ICYgNSBhcyBsZW5ndGgsCi0JYml0IDQgYXMgZXh0ZXJuIGFuZCB0aGUgbGFzdCBuaWJibGUgYXMgJ3VuZGVmaW5lZCcuICovCi0KLSNpZiBjb21tZW50Ci12b2lkCi1tZF9yaV90b19jaGFycyAocmlfcCwgcmkpCi0gICAgIHN0cnVjdCByZWxvY2F0aW9uX2luZm8gKnJpX3AsIHJpOwotewotICBieXRlIHRoZV9ieXRlc1tzaXplb2YgKHN0cnVjdCByZWxvY2F0aW9uX2luZm8pXTsKLSAgLyogVGhlIHJlYXNvbiBJIGNhbid0IGp1c3QgZW5jb2RlIHRoZXNlIGRpcmVjdGx5IGludG8gcmlfcCBpcyB0aGF0Ci0gICAgIHJpX3AgbWF5IHBvaW50IHRvIHJpLiAqLwotCi0gIC8qIFRoaXMgaXMgZWFzeSAqLwotICBtZF9udW1iZXJfdG9fY2hhcnMgKHRoZV9ieXRlcywgcmkucl9hZGRyZXNzLCBzaXplb2YgKHJpLnJfYWRkcmVzcykpOwotCi0gIC8qIG5vdyB0aGUgZnVuIHN0dWZmICovCi0gIHRoZV9ieXRlc1s0XSA9IChyaS5yX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzVdID0gKHJpLnJfc3ltYm9sbnVtID4+IDgpICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s2XSA9IHJpLnJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHRoZV9ieXRlc1s3XSA9ICgoKHJpLnJfZXh0ZXJuIDw8IDQpICYgMHgxMCkgfCAoKHJpLnJfbGVuZ3RoIDw8IDUpICYgMHg2MCkgfAotCQkgICgocmkucl9wY3JlbCA8PCA3KSAmIDB4ODApKSAmIDB4ZjA7Ci0KLSAgYmNvcHkgKHRoZV9ieXRlcywgKGNoYXIgKikgcmlfcCwgc2l6ZW9mIChzdHJ1Y3QgcmVsb2NhdGlvbl9pbmZvKSk7Ci19Ci0KLSNlbmRpZiAvKiBjb21tZW50ICovCi0KLS8qIFB1dCB0aGUgYml0cyBpbiBhbiBvcmRlciB0aGF0IGEgdGFob2Ugd2lsbCB1bmRlcnN0YW5kLCBkZXNwaXRlIHRoZSBvcmRlcmluZwotICAgb2YgdGhlIG5hdGl2ZSBtYWNoaW5lLgotICAgT24gVGFob2U6IGZpcnN0IDQgYnl0ZXMgYXJlIG5vcm1hbCB1bnNpZ25lZCBiaWcgZW5kaWFuIGxvbmcsCi0gICBuZXh0IHRocmVlIGJ5dGVzIGFyZSBzeW1ib2xudW0sIGluIGtpbmQgb2YgMyBieXRlIGJpZyBlbmRpYW4gKGxlYXN0IHNpZy4gYnl0ZSBsYXN0KS4KLSAgIFRoZSBsYXN0IGJ5dGUgaXMgYnJva2VuIHVwIHdpdGggYml0IDcgYXMgcGNyZWwsCi0gICAJYml0cyA2ICYgNSBhcyBsZW5ndGgsCi0JYml0IDQgYXMgZXh0ZXJuIGFuZCB0aGUgbGFzdCBuaWJibGUgYXMgJ3VuZGVmaW5lZCcuICovCi0KLXZvaWQgCi10Y19hb3V0X2ZpeF90b19jaGFycyAod2hlcmUsIGZpeFAsIHNlZ21lbnRfYWRkcmVzc19pbl9maWxlKQotICAgICBjaGFyICp3aGVyZTsKLSAgICAgZml4UyAqZml4UDsKLSAgICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGU7Ci17Ci0gIGxvbmcgcl9zeW1ib2xudW07Ci0KLSAga25vdyAoZml4UC0+ZnhfYWRkc3kgIT0gTlVMTCk7Ci0KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh3aGVyZSwKLSAgICAgICBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4UC0+Znhfd2hlcmUgLSBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZSwKLQkJICAgICAgNCk7Ci0KLSAgcl9zeW1ib2xudW0gPSAoU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkKLQkJID8gU19HRVRfVFlQRSAoZml4UC0+ZnhfYWRkc3kpCi0JCSA6IGZpeFAtPmZ4X2FkZHN5LT5zeV9udW1iZXIpOwotCi0gIHdoZXJlWzRdID0gKHJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB3aGVyZVs1XSA9IChyX3N5bWJvbG51bSA+PiA4KSAmIDB4MGZmOwotICB3aGVyZVs2XSA9IHJfc3ltYm9sbnVtICYgMHgwZmY7Ci0gIHdoZXJlWzddID0gKCgoaXNfcGNyZWwgKGZpeFApIDw8IDcpICYgMHg4MCkKLQkgICAgICB8ICgoKChmaXhQLT5meF90eXBlID09IEZYXzggfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDgKLQkJICAgID8gMAotCQkgICAgOiAoZml4UC0+ZnhfdHlwZSA9PSBGWF8xNiB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMMTYKLQkJICAgICAgID8gMQotCQkgICAgOiAoZml4UC0+ZnhfdHlwZSA9PSBGWF8zMiB8fCBmaXhQLT5meF90eXBlID09IEZYX1BDUkVMMzIKLQkJICAgICAgID8gMgotCQkgICAgICAgOiA0MikpKSkgPDwgNSkgJiAweDYwKQotCSAgICAgIHwgKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkgPDwgNCkgJiAweDEwKSk7Ci19Ci0KLS8qIFJlbG9jYXRlIGJ5dGUgc3R1ZmYgKi8KLQwKLS8qIFRoaXMgaXMgZm9yIGJyb2tlbiB3b3JkLiAqLwotY29uc3QgaW50IG1kX3Nob3J0X2p1bXBfc2l6ZSA9IDM7Ci0KLXZvaWQKLW1kX2NyZWF0ZV9zaG9ydF9qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDEpOwotICAqcHRyKysgPSBUQUhPRV9CUlc7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCBvZmZzZXQsIDIpOwotfQotCi1jb25zdCBpbnQgbWRfbG9uZ19qdW1wX3NpemUgPSA2OwotY29uc3QgaW50IG1kX3JlbG9jX3NpemUgPSA4OwkvKiBTaXplIG9mIHJlbG9jYXRpb24gcmVjb3JkICovCi0KLXZvaWQKLW1kX2NyZWF0ZV9sb25nX2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIG9mZnNldCA9IHRvX2FkZHIgLSAoZnJvbV9hZGRyICsgNCk7Ci0gICpwdHIrKyA9IFRBSE9FX0pNUDsKLSAgKnB0cisrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCBvZmZzZXQsIDQpOwotfQotDAotLyoKLSAqCQkJbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgoKQotICoKLSAqIENhbGxlZCBqdXN0IGJlZm9yZSByZWxheCgpLgotICogQW55IHN5bWJvbCB0aGF0IGlzIG5vdyB1bmRlZmluZWQgd2lsbCBub3QgYmVjb21lIGRlZmluZWQsIHNvIHdlIGFzc3VtZWQKLSAqIHRoYXQgaXQgd2lsbCBiZSByZXNvbHZlZCBieSB0aGUgbGlua2VyLgotICogUmV0dXJuIHRoZSBjb3JyZWN0IGZyX3N1YnR5cGUgaW4gdGhlIGZyYWcsIGZvciByZWxheCgpCi0gKiBSZXR1cm4gdGhlIGluaXRpYWwgImd1ZXNzIGZvciBmcl92YXIiIHRvIGNhbGxlci4gKEhvdyBiaWcgSSB0aGluayB0aGlzCi0gKiB3aWxsIGJlLikKLSAqIFRoZSBndWVzcyBmb3IgZnJfdmFyIGlzIEFDVFVBTExZIHRoZSBncm93dGggYmV5b25kIGZyX2ZpeC4KLSAqIFdoYXRldmVyIHdlIGRvIHRvIGdyb3cgZnJfZml4IG9yIGZyX3ZhciBjb250cmlidXRlcyB0byBvdXIgcmV0dXJuZWQgdmFsdWUuCi0gKiBBbHRob3VnaCBpdCBtYXkgbm90IGJlIGV4cGxpY2l0IGluIHRoZSBmcmFnLCBwcmV0ZW5kIGZyX3ZhciBzdGFydHMgd2l0aCBhCi0gKiAwIHZhbHVlLgotICovCi1pbnQKLW1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCwgc2VnbWVudF90eXBlKQotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci0gICAgIHNlZ1Qgc2VnbWVudF90eXBlOwkJLyogTl9EQVRBIG9yIE5fVEVYVC4gKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgcmVnaXN0ZXIgaW50IG9sZF9mcl9maXg7Ci0gIC8qICBpbnQgcGNfcmVsOyBGSVhNRTogcmVtb3ZlIHRoaXMgKi8KLQotICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgLyogVGhlIHN5bWJvbCB3YXMgaW4gdGhlIHNhbWUgc2VnbWVudCBhcyB0aGUgb3Bjb2RlLCBhbmQgaXQncwotCSBhIHJlYWwgcGNfcmVsIGNhc2Ugc28gaXQncyBhIHJlbGF4YWJsZSBjYXNlLiAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBjYXNlIGlzIHN0aWxsIHVuZGVmaW5lZCwgc28gYXN1bWUgaXQncyBhIGxvbmcgd29yZCBmb3IgdGhlCi0JIGxpbmtlciB0byBmaXguICovCi0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKnAgfD0gVEFIT0VfUENfT1JfTE9ORzsKLQkgIC8qIFdlIG5vdyBrbm93IGhvdyBiaWcgaXQgd2lsbCBiZSwgb25lIGxvbmcgd29yZC4gKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDEsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfQllURSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSBePSAweDEwOwkvKiBSZXZlcnNlIHNlbnNlIG9mIGJyYW5jaC4gKi8KLQkgICpwKysgPSA2OwotCSAgKnArKyA9IFRBSE9FX0pNUDsKLQkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDEgKyAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMywgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudF90eXBlKQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0KLQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqZnJhZ1AtPmZyX29wY29kZSBePSAweDEwOwkvKiBSZXZlcnNlIHNlbnNlIG9mIGJyYW5jaC4gKi8KLQkgICpwKysgPSAwOwotCSAgKnArKyA9IDY7Ci0JICAqcCsrID0gVEFIT0VfSk1QOwotCSAgKnArKyA9IFRBSE9FX1BDX1JFTF9MT05HOwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAyICsgMiArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIEZYX1BDUkVMMzIsIE5VTEwpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfV09SRCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICAqcCsrID0gMjsKLQkgICpwKysgPSAwOwotCSAgKnArKyA9IFRBSE9FX0JSQjsKLQkgICpwKysgPSA2OwotCSAgKnArKyA9IFRBSE9FX0pNUDsKLQkgICpwKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLQkgIGZyYWdQLT5mcl9maXggKz0gMiArIDIgKyAyICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgNiwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgRlhfUENSRUwzMiwgTlVMTCk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50X3R5cGUpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgPSBUQUhPRV9KTVA7Ci0JICAqcCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyAxLCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCBGWF9QQ1JFTDMyLCBOVUxMKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0MCi0vKgotICoJCQltZF9jb252ZXJ0X2ZyYWcoKTsKLSAqCi0gKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KLSAqIEluOglBZGRyZXNzIG9mIGZyYWcuCi0gKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCi0gKgotICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgotICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotewotICByZWdpc3RlciBjaGFyICphZGRyZXNzUDsJLyogLT4gX3ZhciB0byBjaGFuZ2UuICovCi0gIHJlZ2lzdGVyIGNoYXIgKm9wY29kZVA7CS8qIC0+IG9wY29kZSBjaGFyKHMpIHRvIGNoYW5nZS4gKi8KLSAgcmVnaXN0ZXIgc2hvcnQgaW50IGxlbmd0aF9jb2RlOwkvKiAyPWxvbmcgMT13b3JkIDA9Ynl0ZSAqLwotICByZWdpc3RlciBzaG9ydCBpbnQgZXh0ZW5zaW9uID0gMDsJLyogU2l6ZSBvZiByZWxheGVkIGFkZHJlc3MuCi0JCQkJICAgQWRkZWQgdG8gZnJfZml4OiBpbmNsLiBBTEwgdmFyIGNoYXJzLiAqLwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICByZWdpc3RlciBsb25nIGludCB3aGVyZTsKLSAgcmVnaXN0ZXIgbG9uZyBpbnQgYWRkcmVzc19vZl92YXI7Ci0gIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBpcyBfdmFyIG9mICpmcmFnUD8gKi8KLSAgcmVnaXN0ZXIgbG9uZyBpbnQgdGFyZ2V0X2FkZHJlc3M7Ci0gIC8qIFdoZXJlLCBpbiBmaWxlIHNwYWNlLCBkb2VzIGFkZHIgcG9pbnQ/ICovCi0KLSAga25vdyAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfbWFjaGluZV9kZXBlbmRlbnQpOwotICBsZW5ndGhfY29kZSA9IFJFTEFYX0xFTkdUSCAoZnJhZ1AtPmZyX3N1YnR5cGUpOwotICBrbm93IChsZW5ndGhfY29kZSA+PSAwICYmIGxlbmd0aF9jb2RlIDwgMyk7Ci0gIHdoZXJlID0gZnJhZ1AtPmZyX2ZpeDsKLSAgYWRkcmVzc1AgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIHdoZXJlOwotICBvcGNvZGVQID0gZnJhZ1AtPmZyX29wY29kZTsKLSAgc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0gIGtub3cgKHN5bWJvbFApOwotICB0YXJnZXRfYWRkcmVzcyA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKSArIGZyYWdQLT5mcl9vZmZzZXQ7Ci0gIGFkZHJlc3Nfb2ZfdmFyID0gZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZTsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKToKLSAgICAgIC8qICphZGRyZXNzUCBob2xkcyB0aGUgcmVnaXN0ZXJzIG51bWJlciwgcGx1cyAweDEwLCBpZiBpdCdzIGRlZmVycmVkCi0gICAgICAgbW9kZS4gVG8gc2V0IHVwIHRoZSByaWdodCBtb2RlLCBqdXN0IE9SIHRoZSBzaXplIG9mIHRoaXMgZGlzcGxhY2VtZW50ICovCi0gICAgICAvKiBCeXRlIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgICphZGRyZXNzUCsrIHw9IFRBSE9FX1BDX09SX0JZVEU7Ci0gICAgICAqYWRkcmVzc1AgPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9XT1JEKToKLSAgICAgIC8qIFdvcmQgZGlzcGxhY2VtZW50LiAqLwotICAgICAgKmFkZHJlc3NQKysgfD0gVEFIT0VfUENfT1JfV09SRDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMyksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9MT05HKToKLSAgICAgIC8qIExvbmcgd29yZCBkaXNwbGFjZW1lbnQuICovCi0gICAgICAqYWRkcmVzc1ArKyB8PSBUQUhPRV9QQ19PUl9MT05HOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA1KSwgNCk7Ci0gICAgICBleHRlbnNpb24gPSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9CWVRFKToKLSAgICAgICphZGRyZXNzUCA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7Ci0gICAgICBleHRlbnNpb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgICpvcGNvZGVQIF49IDB4MTA7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCi0gICAgICAqYWRkcmVzc1ArKyA9IDM7CQkvKiBKdW1wIG92ZXIgd29yZCBicmFuY2ggKi8KLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfQlJXOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA0KSwgMik7Ci0gICAgICBleHRlbnNpb24gPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9MT05HKToKLSAgICAgICpvcGNvZGVQIF49IDB4MTA7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCi0gICAgICAqYWRkcmVzc1ArKyA9IDY7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0pNUDsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSA3OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk6Ci0gICAgICAqYWRkcmVzc1AgPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOwotICAgICAgZXh0ZW5zaW9uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgKm9wY29kZVAgPSBUQUhPRV9CUlc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDIpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBTVEFURV9MT05HKToKLSAgICAgICpvcGNvZGVQID0gVEFIT0VfSk1QOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgNSksIDQpOwotICAgICAgZXh0ZW5zaW9uID0gNTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMiksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19SRVZfQlJBTkNILCBTVEFURV9MT05HKToKLSAgICAgICpvcGNvZGVQIF49IDB4MTA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IDA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IDY7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0pNUDsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfUENfUkVMX0xPTkc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQLCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSA4OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX05PTl9SRVZfQlJBTkNILCBTVEFURV9XT1JEKToKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMiksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0JJR19OT05fUkVWX0JSQU5DSCwgU1RBVEVfTE9ORyk6Ci0gICAgICAqYWRkcmVzc1ArKyA9IDA7Ci0gICAgICAqYWRkcmVzc1ArKyA9IDI7Ci0gICAgICAqYWRkcmVzc1ArKyA9IFRBSE9FX0JSQjsKLSAgICAgICphZGRyZXNzUCsrID0gNjsKLSAgICAgICphZGRyZXNzUCsrID0gVEFIT0VfSk1QOwotICAgICAgKmFkZHJlc3NQKysgPSBUQUhPRV9QQ19SRUxfTE9ORzsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDEwOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19CQkJCS8qIG1kX2NvbnZlcnRfZnJhZyAqLwotDAotCi0vKiBUaGlzIGlzIHRoZSBzdHVmZiBmb3IgbWRfYXNzZW1ibGUuICovCi0jZGVmaW5lIEZQX1JFRyAxMwotI2RlZmluZSBTUF9SRUcgMTQKLSNkZWZpbmUgUENfUkVHIDE1Ci0jZGVmaW5lIEJJR0dFU1RSRUcgUENfUkVHCi0KLS8qCi0gKiBQYXJzZSB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgU1RBUlQKLSAqIElmIGl0IHJlcHJlc2VudHMgYSB2YWxpZCByZWdpc3RlciwgcG9pbnQgU1RBUlQgdG8gdGhlIGNoYXJhY3RlciBhZnRlcgotICogdGhlIGxhc3QgdmFsaWQgcmVnaXN0ZXIgY2hhciwgYW5kIHJldHVybiB0aGUgcmVnaXN0ZXIgbnVtYmVyICgwLTE1KS4KLSAqIElmIGludmFsaWQsIGxlYXZlIFNUQVJUIGFsb25lLCByZXR1cm4gLTEuCi0gKiBUaGUgZm9ybWF0IGhhcyB0byBiZSBleGFjdC4gSSBkb24ndCBkbyB0aGluZ3MgbGlrZSBlYXQgbGVhZGluZyB6ZXJvcwotICogb3IgdGhlIGxpa2UuCi0gKiBOb3RlOiBUaGlzIGRvZXNuJ3QgY2hlY2sgZm9yIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIG1ha2luZwotICogdGhpcyBpbnZhbGlkLiBFeDogUjEyMyB3b3VsZCByZXR1cm4gMTIsIGl0J3MgdGhlIGNhbGxlcnMgam9iIHRvIGNoZWNrCi0gKiB3aGF0IHN0YXJ0IGlzIHBvaW50IHRvIGFwb24gcmV0dXJuLgotICoKLSAqIFZhbGlkIHJlZ2lzdGVycyBhcmUgUjEtUjE1LCAlMS0lMTUsIEZQICgxMyksIFNQICgxNCksIFBDICgxNSkKLSAqIENhc2UgZG9lc24ndCBtYXR0ZXIuCi0gKi8KLWludAotdGFob2VfcmVnX3BhcnNlIChzdGFydCkKLSAgICAgY2hhciAqKnN0YXJ0OwkJLyogQSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdG8gcGFyc2UuICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJlZ3BvaW50ID0gKnN0YXJ0OwotICByZWdpc3RlciBpbnQgcmVnbnVtID0gLTE7Ci0KLSAgc3dpdGNoICgqcmVncG9pbnQrKykKLSAgICB7Ci0gICAgY2FzZSAnJSc6CQkJLyogUmVnaXN0ZXJzIGNhbiBzdGFydCB3aXRoIGEgJSwKLQkJCQkgICBSIG9yIHIsIGFuZCB0aGVuIGEgbnVtYmVyLiAqLwotICAgIGNhc2UgJ1InOgotICAgIGNhc2UgJ3InOgotICAgICAgaWYgKGlzZGlnaXQgKCpyZWdwb2ludCkpCi0JewotCSAgLyogR290IHRoZSBmaXJzdCBkaWdpdC4gKi8KLQkgIHJlZ251bSA9ICpyZWdwb2ludCsrIC0gJzAnOwotCSAgaWYgKChyZWdudW0gPT0gMSkgJiYgaXNkaWdpdCAoKnJlZ3BvaW50KSkKLQkgICAgewotCSAgICAgIC8qIEl0cyBhIHR3byBkaWdpdCBudW1iZXIuICovCi0JICAgICAgcmVnbnVtID0gMTAgKyAoKnJlZ3BvaW50KysgLSAnMCcpOwotCSAgICAgIGlmIChyZWdudW0gPiBCSUdHRVNUUkVHKQotCQl7CQkvKiBOdW1iZXIgdG9vIGJpZz8gKi8KLQkJICByZWdudW0gPSAtMTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRic6CQkJLyogSXMgaXQgdGhlIEZQICovCi0gICAgY2FzZSAnZic6Ci0gICAgICBzd2l0Y2ggKCpyZWdwb2ludCsrKQotCXsKLQljYXNlICdwJzoKLQljYXNlICdQJzoKLQkgIHJlZ251bSA9IEZQX1JFRzsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoJCQkvKiBIb3cgYWJvdXQgdGhlIFNQICovCi0gICAgY2FzZSAnUyc6Ci0gICAgICBzd2l0Y2ggKCpyZWdwb2ludCsrKQotCXsKLQljYXNlICdwJzoKLQljYXNlICdQJzoKLQkgIHJlZ251bSA9IFNQX1JFRzsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdwJzoJCQkvKiBPUiB0aGUgUEMgZXZlbiAqLwotICAgIGNhc2UgJ1AnOgotICAgICAgc3dpdGNoICgqcmVncG9pbnQrKykKLQl7Ci0JY2FzZSAnYyc6Ci0JY2FzZSAnQyc6Ci0JICByZWdudW0gPSBQQ19SRUc7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIGlmIChyZWdudW0gIT0gLTEpCi0gICAgewkJCQkvKiBObyBlcnJvciwgc28gbW92ZSBzdHJpbmcgcG9pbnRlciAqLwotICAgICAgKnN0YXJ0ID0gcmVncG9pbnQ7Ci0gICAgfQotICByZXR1cm4gcmVnbnVtOwkJLyogUmV0dXJuIHJlc3VsdHMgKi8KLX0JCQkJLyogdGFob2VfcmVnX3BhcnNlICovCi0MCi0vKgotICogVGhpcyBjaG9wcyB1cCBhbiBvcGVyYW5kIGFuZCBmaWd1cmVzIG91dCBpdHMgbW9kZXMgYW5kIHN0dWZmLgotICogSXQncyBhIGxpdHRsZSB0b3VjaHkgYWJvdXQgZXh0cmEgY2hhcmFjdGVycy4KLSAqIE9wdGV4IHRvIHN0YXJ0IHdpdGggb25lIGV4dHJhIGNoYXJhY3RlciBzbyBpdCBjYW4gYmUgb3ZlcndyaXR0ZW4gZm9yCi0gKiB0aGUgYmFja3dhcmQgcGFydCBvZiB0aGUgcGFyc2luZy4KLSAqIFlvdSBjYW4ndCBwdXQgYSBidW5jaCBvZiBleHRyYSBjaGFyYWN0ZXJzIGluIHNpZGUgdG8KLSAqIG1ha2UgdGhlIGNvbW1hbmQgbG9vayBjdXRlLiBpZTogKiBmb28gKCByMSApIFsgIHIwIF0KLSAqIElmIHlvdSBsaWtlIGRvaW5nIGEgbG90IG9mIHR5cGluZywgdHJ5IENPQk9MIQotICogQWN0dWFsbHksIHRoaXMgcGFyc2VyIGlzIGEgbGl0dGxlIHdlYWsgYWxsIGFyb3VuZC4gSXQncyBkZXNpZ25lZCB0byBiZQotICogdXNlZCB3aXRoIGNvbXBsaWVycywgc28gSSBlbXBoaXNpc2UgY29ycmVjdCBkZWNvZGluZyBvZiB2YWxpZCBjb2RlIHF1aWNrbHkKLSAqIHJhdGhlciB0aGF0IGNhdGNoaW5nIGV2ZXJ5IHBvc3NhYmxlIGVycm9yLgotICogTm90ZTogVGhpcyB1c2VzIHRoZSBleHByZXNzaW9uIGZ1bmN0aW9uLCBzbyBzYXZlIGlucHV0X2xpbmVfcG9pbnRlciBiZWZvcmUKLSAqIGNhbGxpbmcuCi0gKgotICogU3BlcnJ5IGRlZmluZXMgdGhlIHNlbWFudGljcyBvZiBhZGRyZXNzIG1vZGVzIChhbmQgdmFsdWVzKQotICogYnkgYSB0d28tbGV0dGVyIGNvZGUsIGV4cGxhaW5lZCBoZXJlLgotICoKLSAqICAgbGV0dGVyIDE6ICAgYWNjZXNzIHR5cGUKLSAqCi0gKiAgICAgYSAgICAgICAgIGFkZHJlc3MgY2FsY3VsYXRpb24gLSBubyBkYXRhIGFjY2VzcywgcmVnaXN0ZXJzIGZvcmJpZGRlbgotICogICAgIGIgICAgICAgICBicmFuY2ggZGlzcGxhY2VtZW50Ci0gKiAgICAgbSAgICAgICAgIHJlYWQgLSBsZXQgZ28gb2YgYnVzIC0gd3JpdGUgYmFjayAibW9kaWZ5IgotICogICAgIHIgICAgICAgICByZWFkCi0gKiAgICAgdyAgICAgICAgIHdyaXRlCi0gKiAgICAgdiAgICAgICAgIGJpdCBmaWVsZCBhZGRyZXNzOiBsaWtlICdhJyBidXQgcmVnaXN0ZXJzIGFyZSBPSwotICoKLSAqICAgbGV0dGVyIDI6ICAgZGF0YSB0eXBlIChpLmUuIHdpZHRoLCBhbGlnbm1lbnQpCi0gKgotICogICAgIGIgICAgICAgICBieXRlCi0gKiAgICAgdyAgICAgICAgIHdvcmQKLSAqICAgICBsICAgICAgICAgbG9uZ3dvcmQKLSAqICAgICBxICAgICAgICAgcXVhZHdvcmQgKEV2ZW4gcmVncyA8IDE0IGFsbG93ZWQpIChpZiAxMiwgeW91IGdldCBhIHdhcm5pbmcpCi0gKiAgICAgLQkgdW5jb25kaXRpb25hbCBzeW50aGV0aWMgamJyIG9wZXJhbmQKLSAqICAgICA/CSBzaW1wbGUgc3ludGhldGljIHJldmVyc2FibGUgYnJhbmNoIG9wZXJhbmQKLSAqICAgICAhCSBjb21wbGV4IHN5bnRoZXRpYyByZXZlcnNhYmxlIGJyYW5jaCBvcGVyYW5kCi0gKiAgICAgOgkgY29tcGxleCBzeW50aGV0aWMgbm9uLXJldmVyc2FibGUgYnJhbmNoIG9wZXJhbmQKLSAqCi0gKiBUaGUgJy0/ITonIGxldHRlciAyJ3MgYXJlIG5vdCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24uIFRoZXkgYXJlIHVzZWQKLSAqIGJ5IEdBUyBmb3IgcHN1ZWRvIG9wcyByZWxheGluZyBjb2RlLgotICoKLSAqIEFmdGVyIHBhcnNpbmcgdG9wUCBoYXM6Ci0gKgotICogICB0b3BfbmR4OiAgICAgICAgLTEsIG9yIHRoZSBpbmRleCByZWdpc3Rlci4gZWcgNz1bUjddCi0gKiAgIHRvcF9yZWc6ICAgICAgICAtMSwgb3IgcmVnaXN0ZXIgbnVtYmVyLiBlZyA3ID0gUjcgb3IgKFI3KQotICogICB0b3BfbW9kZTogICAgICAgVGhlIGFkZHJlc3NpbmcgbW9kZSBieXRlLiBUaGlzIGJ5dGUsIGRlZmluZXMgd2hpY2ggb2YKLSAqICAgICAgICAgICAgICAgICAgIHRoZSAxMSBtb2RlcyBvcGNvZGUgaXMuCi0gKiAgIHRvcF9hY2Nlc3M6ICAgICBBY2Nlc3MgdHlwZSB3YW50ZWQgZm9yIHRoaXMgb3BwZXJhbmQgJ2InYnJhbmNoICcgJwotICogICAgICAgICAgICAgICAgICAgbm8taW5zdHJ1Y3Rpb24gJ2FtcnZ3JwotICogICB0b3Bfd2lkdGg6ICAgICAgT3BlcmFuZCB3aWR0aCBleHBlY3RlZCwgb25lIG9mICJid2xxPy06ISIKLSAqICAgZXhwX29mX29wZXJhbmQ6IFRoZSBleHByZXNzaW9uIGFzIHBhcnNlZCBieSBleHByZXNzaW9uKCkKLSAqICAgdG9wX2Rpc3BzaXplOiAgIE51bWJlciBvZiBieXRlcyBpbiB0aGUgZGlzcGxhY2VtZW50IGlmIHdlIGNhbiBmaWd1cmUgaXQKLSAqICAgICAgICAgICAgICAgICAgIG91dCBhbmQgaXQncyByZWxhdmVudC4KLSAqCi0gKiBOZWVkIHN5bnRheCBjaGVja3MgYnVpbHQuCi0gKi8KLQotdm9pZAotdGlwX29wIChvcHRleCwgdG9wUCkKLSAgICAgY2hhciAqb3B0ZXg7CQkvKiBUaGUgdXNlcnMgdGV4dCBpbnB1dCwgd2l0aCBvbmUgbGVhZGluZyBjaGFyYWN0ZXIgKi8KLSAgICAgc3RydWN0IHRvcCAqdG9wUDsJCS8qIFRoZSB0YWhvZSBpbnN0cnVjdGlvbiB3aXRoIHNvbWUgZmllbGRzIGFscmVhZHkgc2V0OgotCQkJIGluOiBhY2Nlc3MsIHdpZHRoCi0JCQkgb3V0OiBuZHgsIHJlZywgbW9kZSwgZXJyb3IsIGRpc3BzaXplICovCi0KLXsKLSAgaW50IG1vZGUgPSAwOwkJCS8qIFRoaXMgb3BlcmFuZCdzIG1vZGUuICovCi0gIGNoYXIgc2VnZmF1bHQgPSAqb3B0ZXg7CS8qIFRvIGtlZXAgdGhlIGJhY2sgcGFyc2luZyBmcm9tIGZyZWFraW5nLiAqLwotICBjaGFyICpwb2ludCA9IG9wdGV4ICsgMTsJLyogUGFyc2luZyBmcm9tIGZyb250IHRvIGJhY2suICovCi0gIGNoYXIgKmVuZDsJCQkvKiBQYXJzaW5nIGZyb20gYmFjayB0byBmcm9udC4gKi8KLSAgaW50IHJlZyA9IC0xOwkJCS8qIG1ham9yIHJlZ2lzdGVyLCAtMSBtZWFucyBhYnNlbnQgKi8KLSAgaW50IGltcmVnID0gLTE7CQkvKiBNYWpvciByZWdpc3RlciBpbiBpbW1lZGlhdGUgbW9kZSAqLwotICBpbnQgbmR4ID0gLTE7CQkJLyogaW5kZXggcmVnaXN0ZXIgbnVtYmVyLCAtMSBtZWFucyBhYnNlbnQgKi8KLSAgY2hhciBkZWNfaW5jID0gJyAnOwkJLyogSXMgdGhlIFNQIGF1dG8taW5jcmVtZW50ZWQgJysnIG9yCi0JCQkJICAgYXV0by1kZWNyZW1lbnRlZCAnLScgb3IgbmVpdGhlciAnICcuICovCi0gIGludCBpbW1lZGlhdGUgPSAwOwkJLyogMSBpZiAnJCcgaW1tZWRpYXRlIG1vZGUgKi8KLSAgaW50IGNhbGxfd2lkdGggPSAwOwkJLyogSWYgdGhlIGNhbGxlciBjYXN0cyB0aGUgZGlzcGxhY2VtZW50ICovCi0gIGludCBhYnNfd2lkdGggPSAwOwkJLyogVGhlIHdpZHRoIG9mIHRoZSBhYnNvbHV0ZSBkaXNwbGFjbWVudCAqLwotICBpbnQgY29tX3dpZHRoID0gMDsJCS8qIERpc3BsYWNlbWVudCB3aWR0aCByZXF1aXJlZCBieSBicmFuY2ggKi8KLSAgaW50IGRlZmVycmVkID0gMDsJCS8qIDEgaWYgJyonIGRlZmVycmFsIGlzIHVzZWQgKi8KLSAgYnl0ZSBkaXNwX3NpemUgPSAwOwkJLyogSG93IGJpZyBpcyB0aGlzIG9wZXJhbmQuIDAgPT0gZG9uJ3Qga25vdyAqLwotICBjaGFyICpvcF9iYWQgPSAiIjsJCS8qIEJhZCBvcGVyYW5kIGVycm9yICovCi0KLSAgY2hhciAqdHAsICp0ZW1wLCBjOwkJLyogVGVtcG9yYXJ5IGhvbGRlcnMgKi8KLQotICBjaGFyIGFjY2VzcyA9IHRvcFAtPnRvcF9hY2Nlc3M7CS8qIFNhdmUgb24gYSBkZXJlZi4gKi8KLSAgY2hhciB3aWR0aCA9IHRvcFAtPnRvcF93aWR0aDsKLQotICBpbnQgcmVhbGx5X25vbmUgPSAwOwkJLyogRW1wdHkgZXhwcmVzc2lvbnMgZXZhbHVhdGUgdG8gMAotCQkJCSAgIGJ1dCBJIG5lZWQgdG8ga25vdyBpZiBpdCdzIHRoZXJlIG9yIG5vdCAqLwotICBleHByZXNzaW9uUyAqZXhwUDsJCS8qIC0+IGV4cHJlc3Npb24gdmFsdWVzIGZvciB0aGlzIG9wZXJhbmQgKi8KLQotICAvKiBEb2VzIHRoaXMgY29tbWFuZCByZXN0cmljdCB0aGUgZGlzcGxhY2VtZW50IHNpemUuICovCi0gIGlmIChhY2Nlc3MgPT0gJ2InKQotICAgIGNvbV93aWR0aCA9ICh3aWR0aCA9PSAnYicgPyAxIDoKLQkJICh3aWR0aCA9PSAndycgPyAyIDoKLQkJICAod2lkdGggPT0gJ2wnID8gNCA6IDApKSk7Ci0KLSAgKm9wdGV4ID0gJ1wwJzsJCS8qIFRoaXMgaXMga2luZCBvZiBhIGJhY2sgc3RvcCBmb3IgYWxsCi0JCQkJICAgdGhlIHNlYXJjaGVzIHRvIGZhaWwgb24gaWYgbmVlZGVkLiovCi0gIGlmICgqcG9pbnQgPT0gJyonKQotICAgIHsJCQkJLyogQSBkZXJlZmVyZW5jZT8gKi8KLSAgICAgIGRlZmVycmVkID0gMTsKLSAgICAgIHBvaW50Kys7Ci0gICAgfQotCi0gIC8qIEZvcmNlIHdvcmRzIGludG8gYSBjZXJ0YWluIG1vZGUgKi8KLSAgLyogQml0Y2gsIEJpdGNoLCBCaXRjaCEgKi8KLSAgLyoKLSAgICogVXNpbmcgdGhlIF4gb3BlcmF0b3IgaXMgYW1iaWdvdXMuIElmIEkgaGF2ZSBhbiBhYnNvbHV0ZSBsYWJlbAotICAgKiBjYWxsZWQgJ3cnIHNldCB0bywgc2F5IDIsIGFuZCBJIGhhdmUgdGhlIGV4cHJlc3Npb24gJ3deMScsIGRvIEkgZ2V0Ci0gICAqIDEsIGZvcmNlZCB0byBiZSBpbiB3b3JkIGRpc3BsYWNlbWVudCBtb2RlLCBvciBkbyBJIGdldCB0aGUgdmFsdWUgb2YKLSAgICogJ3cnIG9yJ2VkIHdpdGggMSAoMyBpbiB0aGlzIGNhc2UpLgotICAgKiBUaGUgZGVmYXVsdCBpcyAndycgYXMgYW4gb2Zmc2V0LCBzbyB0aGF0J3Mgd2hhdCBJIHVzZS4KLSAgICogU3RpY2sgd2l0aCBgLCBpdCBkb2VzIHRoZSBzYW1lLCBhbmQgaXNuJ3QgYW1iaWcuCi0gICAqLwotCi0gIGlmICgqcG9pbnQgIT0gJ1wwJyAmJiAoKHBvaW50WzFdID09ICdeJykgfHwgKHBvaW50WzFdID09ICdgJykpKQotICAgIHN3aXRjaCAoKnBvaW50KQotICAgICAgewotICAgICAgY2FzZSAnYic6Ci0gICAgICBjYXNlICdCJzoKLSAgICAgIGNhc2UgJ3cnOgotICAgICAgY2FzZSAnVyc6Ci0gICAgICBjYXNlICdsJzoKLSAgICAgIGNhc2UgJ0wnOgotCWlmIChjb21fd2lkdGgpCi0JICBhc193YXJuIChfKCJDYXN0aW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCBpcyBiYWQgZm9ybSwgYW5kIGlzIGlnbm9yZWQuIikpOwotCWVsc2UKLQkgIHsKLQkgICAgYyA9IChpc3VwcGVyICgqcG9pbnQpID8gdG9sb3dlciAoKnBvaW50KSA6ICpwb2ludCk7Ci0JICAgIGNhbGxfd2lkdGggPSAoKGMgPT0gJ2InKSA/IDEgOgotCQkJICAoKGMgPT0gJ3cnKSA/IDIgOiA0KSk7Ci0JICB9Ci0JcG9pbnQgKz0gMjsKLQlicmVhazsKLSAgICAgIH0KLQotICAvKiBTZXR0aW5nIGltbWVkaWF0ZSBtb2RlICovCi0gIGlmICgqcG9pbnQgPT0gJyQnKQotICAgIHsKLSAgICAgIGltbWVkaWF0ZSA9IDE7Ci0gICAgICBwb2ludCsrOwotICAgIH0KLQotICAvKgotICAgKiBJJ3ZlIHB1bGxlZCBvZmYgYWxsIHRoZSBlYXN5IHN0dWZmIG9mZiB0aGUgZnJvbnQsIG1vdmUgdG8gdGhlIGVuZCBhbmQKLSAgICogeWFuay4KLSAgICovCi0KLSAgZm9yIChlbmQgPSBwb2ludDsgKmVuZCAhPSAnXDAnOyBlbmQrKykJLyogTW92ZSB0byB0aGUgZW5kLiAqLwotICAgIDsKLQotICBpZiAoZW5kICE9IHBvaW50KQkJLyogTnVsbCBzdHJpbmc/ICovCi0gICAgZW5kLS07Ci0KLSAgaWYgKGVuZCA+IHBvaW50ICYmICplbmQgPT0gJyAnICYmIGVuZFstMV0gIT0gJ1wnJykKLSAgICBlbmQtLTsJCQkvKiBIb3Agd2hpdGUgc3BhY2UgKi8KLQotICAvKiBJcyB0aGlzIGFuIGluZGV4IHJlZy4gKi8KLSAgaWYgKCgqZW5kID09ICddJykgJiYgKGVuZFstMV0gIT0gJ1wnJykpCi0gICAgewotICAgICAgdGVtcCA9IGVuZDsKLQotICAgICAgLyogRmluZCBvcGVuaW5nIGJyYWNlLiAqLwotICAgICAgZm9yICgtLWVuZDsgKCplbmQgIT0gJ1snICYmIGVuZCAhPSBwb2ludCk7IGVuZC0tKQotCTsKLQotICAgICAgLyogSWYgSSBmb3VuZCB0aGUgb3BlbmluZyBicmFjZSwgZ2V0IHRoZSBpbmRleCByZWdpc3RlciBudW1iZXIuICovCi0gICAgICBpZiAoKmVuZCA9PSAnWycpCi0JewotCSAgdHAgPSBlbmQgKyAxOwkJLyogdHAgc2hvdWxkIHBvaW50IHRvIHRoZSBzdGFydCBvZiBhIHJlZy4gKi8KLQkgIG5keCA9IHRhaG9lX3JlZ19wYXJzZSAoJnRwKTsKLQkgIGlmICh0cCAhPSB0ZW1wKQotCSAgICB7CQkJLyogUmVnLiBwYXJzZSBlcnJvci4gKi8KLQkgICAgICBuZHggPSAtMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZW5kLS07CQkvKiBGb3VuZCBpdCwgbW92ZSBwYXN0IGJyYWNlLiAqLwotCSAgICB9Ci0JICBpZiAobmR4ID09IC0xKQotCSAgICB7Ci0JICAgICAgb3BfYmFkID0gXygiQ291bGRuJ3QgcGFyc2UgdGhlIFtpbmRleF0gaW4gdGhpcyBvcGVyYW5kLiIpOwotCSAgICAgIGVuZCA9IHBvaW50OwkvKiBGb3JjZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIHRvIGZhaWwuICovCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3BfYmFkID0gXygiQ291bGRuJ3QgZmluZCB0aGUgb3BlbmluZyAnWycgZm9yIHRoZSBpbmRleCBvZiB0aGlzIG9wZXJhbmQuIik7Ci0JICBlbmQgPSBwb2ludDsJCS8qIEZvcmNlIGFsbCB0aGUgcmVzdCBvZiB0aGUgdGVzdHMgdG8gZmFpbC4gKi8KLQl9Ci0gICAgfQotCi0gIC8qIFBvc3QgaW5jcmVtZW50PyAqLwotICBpZiAoKmVuZCA9PSAnKycpCi0gICAgewotICAgICAgZGVjX2luYyA9ICcrJzsKLSAgICAgIC8qIHdhczogICAgKmVuZC0tOyAqLwotICAgICAgZW5kLS07Ci0gICAgfQotCi0gIC8qIHJlZ2lzdGVyIGluIHBhcmVucz8gKi8KLSAgaWYgKCgqZW5kID09ICcpJykgJiYgKGVuZFstMV0gIT0gJ1wnJykpCi0gICAgewotICAgICAgdGVtcCA9IGVuZDsKLQotICAgICAgLyogRmluZCBvcGVuaW5nIHBhcmVuLiAqLwotICAgICAgZm9yICgtLWVuZDsgKCplbmQgIT0gJygnICYmIGVuZCAhPSBwb2ludCk7IGVuZC0tKQotCTsKLQotICAgICAgLyogSWYgSSBmb3VuZCB0aGUgb3BlbmluZyBwYXJlbiwgZ2V0IHRoZSByZWdpc3RlciBudW1iZXIuICovCi0gICAgICBpZiAoKmVuZCA9PSAnKCcpCi0JewotCSAgdHAgPSBlbmQgKyAxOwotCSAgcmVnID0gdGFob2VfcmVnX3BhcnNlICgmdHApOwotCSAgaWYgKHRwICE9IHRlbXApCi0JICAgIHsKLQkgICAgICAvKiBOb3QgYSByZWdpc3RlciwgYnV0IGNvdWxkIGJlIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24uICovCi0JICAgICAgcmVnID0gLTE7Ci0JICAgICAgZW5kID0gdGVtcDsJLyogUmVzdCB0aGUgcG9pbnRlciBiYWNrICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVuZC0tOwkJLyogRm91bmQgdGhlIHJlZy4gbW92ZSBiZWZvcmUgb3BlbmluZyBwYXJlbi4gKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBvcF9iYWQgPSBfKCJDb3VsZG4ndCBmaW5kIHRoZSBvcGVuaW5nICcoJyBmb3IgdGhlIGRlcmVmIG9mIHRoaXMgb3BlcmFuZC4iKTsKLQkgIGVuZCA9IHBvaW50OwkJLyogRm9yY2UgYWxsIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyB0byBmYWlsLiAqLwotCX0KLSAgICB9Ci0KLSAgLyogUHJlIGRlY3JlbWVudD8gKi8KLSAgaWYgKCplbmQgPT0gJy0nKQotICAgIHsKLSAgICAgIGlmIChkZWNfaW5jICE9ICcgJykKLQl7Ci0JICBvcF9iYWQgPSBfKCJPcGVyYW5kIGNhbid0IGJlIGJvdGggcHJlLWluYyBhbmQgcG9zdC1kZWMuIik7Ci0JICBlbmQgPSBwb2ludDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZGVjX2luYyA9ICctJzsKLQkgIC8qIHdhczogICAgICAqZW5kLS07ICovCi0JICBlbmQtLTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIEV2ZXJ5dGhpbmcgYmV0d2VlbiBwb2ludCBhbmQgZW5kIGlzIHRoZSAnZXhwcmVzc2lvbicsIHVubGVzcyBpdCdzCi0gICAqIGEgcmVnaXN0ZXIgbmFtZS4KLSAgICovCi0KLSAgYyA9IGVuZFsxXTsKLSAgZW5kWzFdID0gJ1wwJzsKLQotICB0cCA9IHBvaW50OwotICBpbXJlZyA9IHRhaG9lX3JlZ19wYXJzZSAoJnBvaW50KTsJLyogR2V0IHRoZSBpbW1lZGlhdGUgcmVnaXN0ZXIKLQkJCQkgICAgICBpZiBpdCBpcyB0aGVyZS4qLwotICBpZiAoKnBvaW50ICE9ICdcMCcpCi0gICAgewotICAgICAgLyogSWYgdGhlcmUgaXMganVuayBhZnRlciBwb2ludCwgdGhlbiB0aGUgaXQncyBub3QgaW1tZWRpYXRlIHJlZy4gKi8KLSAgICAgIHBvaW50ID0gdHA7Ci0gICAgICBpbXJlZyA9IC0xOwotICAgIH0KLQotICBpZiAoaW1yZWcgIT0gLTEgJiYgcmVnICE9IC0xKQotICAgIG9wX2JhZCA9IF8oIkkgcGFyc2VkIDIgcmVnaXN0ZXJzIGluIHRoaXMgb3BlcmFuZC4iKTsKLQotICAvKgotICAgKiBFdmFsdWF0ZSB3aGF0cyBsZWZ0IG9mIHRoZSBleHByZXNzaW9uIHRvIHNlZSBpZiBpdCdzIHZhbGlkLgotICAgKiBOb3RlIGFnYWluOiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY2FsbGluZyBleHByZXNzaW9uIGhhcyBzYXZlZAotICAgKiBpbnB1dF9saW5lX3BvaW50ZXIuIChOYWcsIG5hZywgbmFnISkKLSAgICovCi0KLSAgaWYgKCpvcF9iYWQgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBzdGF0ZW1lbnQgaGFzIG5vIHN5bnRheCBnb29mcyB5ZXQ6IGxldHMgc25pZmYgdGhlIGV4cHJlc3Npb24gKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHBvaW50OwotICAgICAgZXhwUCA9ICYodG9wUC0+ZXhwX29mX29wZXJhbmQpOwotICAgICAgdG9wUC0+c2VnX29mX29wZXJhbmQgPSBleHByZXNzaW9uIChleHBQKTsKLSAgICAgIHN3aXRjaCAoZXhwUC0+WF9vcCkKLQl7Ci0JY2FzZSBPX2Fic2VudDoKLQkgIC8qIE5vIGV4cHJlc3Npb24uIEZvciBCU0Q0LjIgY29tcGF0aWJpbGl0eSwgbWlzc2luZyBleHByZXNzaW9uIGlzCi0JICAgICBhYnNvbHV0ZSAwICovCi0JICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLQkgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0JICByZWFsbHlfbm9uZSA9IDE7Ci0JY2FzZSBPX2NvbnN0YW50OgotCSAgLyogZm9yIFNFR19BQlNPTFVURSwgd2Ugc2hvdWxkbnQgbmVlZCB0byBzZXQgWF9vcF9zeW1ib2wsCi0JICAgICBYX2FkZF9zeW1ib2wgdG8gYW55IHBhcnRpY3VsYXIgdmFsdWUuICovCi0JICAvKiBCdXQsIHdlIHdpbGwgcHJvZ3JhbSBkZWZlbnNpdmVseS4gU2luY2UgdGhpcyBzaXR1YXRpb24gb2NjdXJzCi0JICAgICByYXJlbHkgc28gaXQgY29zdHMgdXMgbGl0dGxlIHRvIGRvIHNvLiAqLwotCSAgZXhwUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIGV4cFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgIC8qIEhvdyBtYW55IGJ5dGVzIGFyZSBuZWVkZWQgdG8gZXhwcmVzcyB0aGlzIGFicyB2YWx1ZT8gKi8KLQkgIGFic193aWR0aCA9Ci0JICAgICgoKChleHBQLT5YX2FkZF9udW1iZXIgJiAweEZGRkZGRjgwKSA9PSAwKSB8fAotCSAgICAgICgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGRkY4MCkgPT0gMHhGRkZGRkY4MCkpID8gMSA6Ci0JICAgICAoKChleHBQLT5YX2FkZF9udW1iZXIgJiAweEZGRkY4MDAwKSA9PSAwKSB8fAotCSAgICAgICgoZXhwUC0+WF9hZGRfbnVtYmVyICYgMHhGRkZGODAwMCkgPT0gMHhGRkZGODAwMCkpID8gMiA6IDQpOwotCi0JY2FzZSBPX3N5bWJvbDoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIC8qCi0JICAgKiBNYWpvciBidWcuIFdlIGNhbid0IGhhbmRsZSB0aGUgY2FzZSBvZiBhIG9wZXJhdG9yCi0JICAgKiBleHByZXNzaW9uIGluIGEgc3ludGhldGljIG9wY29kZSB2YXJpYWJsZS1sZW5ndGgKLQkgICAqIGluc3RydWN0aW9uLiAgV2UgZG9uJ3QgaGF2ZSBhIGZyYWcgdHlwZSB0aGF0IGlzIHNtYXJ0Ci0JICAgKiBlbm91Z2ggdG8gcmVsYXggYSBvcGVyYXRvciwgYW5kIHNvIHdlIGp1c3QgZm9yY2UgYWxsCi0JICAgKiBvcGVyYXRvcnMgdG8gYmVoYXZlIGxpa2UgU0VHX1BBU1Mxcy4gIENsZWFybHksIGlmIHRoZXJlIGlzCi0JICAgKiBhIGRlbWFuZCB3ZSBjYW4gaW52ZW50IGEgbmV3IG9yIG1vZGlmaWVkIGZyYWcgdHlwZSBhbmQKLQkgICAqIHRoZW4gY29kaW5nIHVwIGEgZnJhZyBmb3IgdGhpcyBjYXNlIHdpbGwgYmUgZWFzeS4KLQkgICAqLwotCSAgbmVlZF9wYXNzXzIgPSAxOwotCSAgb3BfYmFkID0gXygiQ2FuJ3QgcmVsb2NhdGUgZXhwcmVzc2lvbiBlcnJvci4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2JpZzoKLQkgIC8qIFRoaXMgaXMgYW4gZXJyb3IuIFRhaG9lIGRvZXNuJ3QgYWxsb3cgYW55IGV4cHJlc3Npb25zCi0JICAgICBiaWdnZXIgdGhhdCBhIDMyIGJpdCBsb25nIHdvcmQuIEFueSBiaWdnZXIgaGFzIHRvIGJlIHJlZmVyZW5jZWQKLQkgICAgIGJ5IGFkZHJlc3MuICovCi0JICBvcF9iYWQgPSBfKCJFeHByZXNzaW9uIGlzIHRvbyBsYXJnZSBmb3IgYSAzMiBiaXRzLiIpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wwJykKLQl7Ci0JICBvcF9iYWQgPSBfKCJKdW5rIGF0IGVuZCBvZiBleHByZXNzaW9uLiIpOwotCX0KLSAgICB9Ci0KLSAgZW5kWzFdID0gYzsKLQotICAvKiBJJ20gZG9uZSwgc28gcmVzdG9yZSBvcHRleCAqLwotICAqb3B0ZXggPSBzZWdmYXVsdDsKLQotCi0gIC8qCi0gICAqIEF0IHRoaXMgcG9pbnQgaW4gdGhlIGdhbWUsIHdlIChpbiB0aGVvcnkpIGhhdmUgYWxsIHRoZSBjb21wb25lbnRzIG9mCi0gICAqIHRoZSBvcGVyYW5kIGF0IGxlYXN0IHBhcnNlZC4gTm93IGl0J3MgdGltZSB0byBjaGVjayBmb3Igc3ludGF4L3NlbWFudGljCi0gICAqIGVycm9ycywgYW5kIGJ1aWxkIHRoZSBtb2RlLgotICAgKiBUaGlzIGlzIHdoYXQgSSBoYXZlOgotICAgKiAgIGRlZmVycmVkID0gMSBpZiAnKicKLSAgICogICBjYWxsX3dpZHRoID0gMCwxLDIsNAotICAgKiAgIGFic193aWR0aCA9IDAsMSwyLDQKLSAgICogICBjb21fd2lkdGggPSAwLDEsMiw0Ci0gICAqICAgaW1tZWRpYXRlID0gMSBpZiAnJCcKLSAgICogICBuZHggPSAtMSBvciByZWcgbnVtCi0gICAqICAgZGVjX2luYyA9ICctJyBvciAnKycgb3IgJyAnCi0gICAqICAgcmVnID0gLTEgb3IgcmVnIG51bQotICAgKiAgIGltcmVnID0gLTEgb3IgcmVnIG51bQotICAgKiAgIHRvcFAtPmV4cF9vZl9vcGVyYW5kCi0gICAqICAgcmVhbGx5X25vbmUKLSAgICovCi0gIC8qIElzIHRoZXJlIGEgZGlzcGxhY2VtZW50IHNpemU/ICovCi0gIGRpc3Bfc2l6ZSA9IChjYWxsX3dpZHRoID8gY2FsbF93aWR0aCA6Ci0JICAgICAgIChjb21fd2lkdGggPyBjb21fd2lkdGggOgotCQlhYnNfd2lkdGggPyBhYnNfd2lkdGggOiAwKSk7Ci0KLSAgaWYgKCpvcF9iYWQgPT0gJ1wwJykKLSAgICB7Ci0gICAgICBpZiAoaW1yZWcgIT0gLTEpCi0JewotCSAgLyogUm4gKi8KLQkgIG1vZGUgPSBUQUhPRV9ESVJFQ1RfUkVHOwotCSAgaWYgKGRlZmVycmVkIHx8IGltbWVkaWF0ZSB8fCAoZGVjX2luYyAhPSAnICcpIHx8Ci0JICAgICAgKHJlZyAhPSAtMSkgfHwgIXJlYWxseV9ub25lKQotCSAgICBvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gZGlyZWN0IHJlZ2lzdGVyIG1vZGUuIik7Ci0JICBlbHNlIGlmIChuZHggIT0gLTEpCi0JICAgIG9wX2JhZCA9IF8oIllvdSBjYW4ndCBpbmRleCBhIHJlZ2lzdGVyIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIpOwotCSAgZWxzZSBpZiAoaW1yZWcgPT0gU1BfUkVHICYmIGFjY2VzcyA9PSAncicpCi0JICAgIG9wX2JhZCA9Ci0JICAgICAgXygiU1AgY2FuJ3QgYmUgdGhlIHNvdXJjZSBvcGVyYW5kIHdpdGggZGlyZWN0IHJlZ2lzdGVyIGFkZHJlc3NpbmcuIik7Ci0JICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2EnKQotCSAgICBvcF9iYWQgPSBfKCJDYW4ndCB0YWtlIHRoZSBhZGRyZXNzIG9mIGEgcmVnaXN0ZXIuIik7Ci0JICBlbHNlIGlmIChhY2Nlc3MgPT0gJ2InKQotCSAgICBvcF9iYWQgPSBfKCJEaXJlY3QgUmVnaXN0ZXIgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iKTsKLQkgIGVsc2UgaWYgKHdpZHRoID09ICdxJyAmJiAoKGltcmVnICUgMikgfHwgKGltcmVnID4gMTMpKSkKLQkgICAgb3BfYmFkID0gXygiRm9yIHF1YWQgYWNjZXNzLCB0aGUgcmVnaXN0ZXIgbXVzdCBiZSBldmVuIGFuZCA8IDE0LiIpOwotCSAgZWxzZSBpZiAoY2FsbF93aWR0aCkKLQkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGNhc3QgYSBkaXJlY3QgcmVnaXN0ZXIuIik7Ci0KLQkgIGlmICgqb3BfYmFkID09ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiBObyBlcnJvcnMsIGNoZWNrIGZvciB3YXJuaW5ncyAqLwotCSAgICAgIGlmICh3aWR0aCA9PSAncScgJiYgaW1yZWcgPT0gMTIpCi0JCWFzX3dhcm4gKF8oIlVzaW5nIHJlZyAxNCBmb3IgcXVhZHdvcmRzIGNhbiB0cm9tcCB0aGUgRlAgcmVnaXN0ZXIuIikpOwotCi0JICAgICAgcmVnID0gaW1yZWc7Ci0JICAgIH0KLQotCSAgLyogV2Uga25vdzogaW1tID0gLTEgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChkZWNfaW5jID09ICctJykKLQl7Ci0JICAvKiAtKFNQKSAqLwotCSAgbW9kZSA9IFRBSE9FX0FVVE9fREVDOwotCSAgaWYgKGRlZmVycmVkIHx8IGltbWVkaWF0ZSB8fCAhcmVhbGx5X25vbmUpCi0JICAgIG9wX2JhZCA9IF8oIlN5bnRheCBlcnJvciBpbiBhdXRvLWRlYyBtb2RlLiIpOwotCSAgZWxzZSBpZiAobmR4ICE9IC0xKQotCSAgICBvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGRlYyBtb2RlLiIpOwotCSAgZWxzZSBpZiAoYWNjZXNzID09ICdyJykKLQkgICAgb3BfYmFkID0gXygiQXV0byBkZWMgbW9kZSBjYW50IGJlIHVzZWQgZm9yIHJlYWRpbmcuIik7Ci0JICBlbHNlIGlmIChyZWcgIT0gU1BfUkVHKQotCSAgICBvcF9iYWQgPSBfKCJBdXRvIGRlYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iKTsKLQkgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCi0JICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7Ci0JICBlbHNlIGlmICh3aWR0aCA9PSAncScpCi0JICAgIG9wX2JhZCA9IF8oIkF1dG8gZGVjIHdvbid0IHdvcmsgd2l0aCBxdWFkd29yZHMuIik7Ci0KLQkgIC8qIFdlIGtub3c6IGltbSA9IC0xLCBkZWNfaW5jICE9ICctJyAqLwotCX0KLSAgICAgIGVsc2UgaWYgKGRlY19pbmMgPT0gJysnKQotCXsKLQkgIGlmIChpbW1lZGlhdGUgfHwgIXJlYWxseV9ub25lKQotCSAgICBvcF9iYWQgPSBfKCJTeW50YXggZXJyb3IgaW4gb25lIG9mIHRoZSBhdXRvLWluYyBtb2Rlcy4iKTsKLQkgIGVsc2UgaWYgKGRlZmVycmVkKQotCSAgICB7Ci0JICAgICAgLyogKihTUCkrICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0FVVE9fSU5DX0RFRkVSUkVEOwotCSAgICAgIGlmIChyZWcgIT0gU1BfUkVHKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyBkZWZlcnJlZCBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iKTsKLQkgICAgICBlbHNlIGlmIChuZHggIT0gLTEpCi0JCW9wX2JhZCA9IF8oIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGF1dG8gaW5jIGRlZmVycmVkIG1vZGUuIik7Ci0JICAgICAgZWxzZSBpZiAoYWNjZXNzID09ICdiJykKLQkJb3BfYmFkID0gXygiQXV0byBpbmMgY2FuJ3QgYmUgdXNlZCBpbiBhIGJyYW5jaC4iKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogKFNQKSsgKi8KLQkgICAgICBtb2RlID0gVEFIT0VfQVVUT19JTkM7Ci0JICAgICAgaWYgKGFjY2VzcyA9PSAnbScgfHwgYWNjZXNzID09ICd3JykKLQkJb3BfYmFkID0gXygiWW91IGNhbid0IHdyaXRlIHRvIGFuIGF1dG8gaW5jIHJlZ2lzdGVyLiIpOwotCSAgICAgIGVsc2UgaWYgKHJlZyAhPSBTUF9SRUcpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIG9ubHkgd29ya3Mgb2YgdGhlIFNQIHJlZ2lzdGVyLiIpOwotCSAgICAgIGVsc2UgaWYgKGFjY2VzcyA9PSAnYicpCi0JCW9wX2JhZCA9IF8oIkF1dG8gaW5jIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIik7Ci0JICAgICAgZWxzZSBpZiAod2lkdGggPT0gJ3EnKQotCQlvcF9iYWQgPSBfKCJBdXRvIGluYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIpOwotCSAgICAgIGVsc2UgaWYgKG5keCAhPSAtMSkKLQkJb3BfYmFkID0gXygiWW91IGNhbid0IGhhdmUgYW4gaW5kZXggaW4gYXV0byBpbmMgbW9kZS4iKTsKLQkgICAgfQotCi0JICAvKiBXZSBrbm93OiBpbW0gPSAtMSwgZGVjX2luYyA9PSAnICcgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChyZWcgIT0gLTEpCi0JewotCSAgaWYgKChuZHggIT0gLTEpICYmIChyZWcgPT0gU1BfUkVHKSkKLQkgICAgb3BfYmFkID0gXygiWW91IGNhbid0IGluZGV4IHRoZSBzcCByZWdpc3Rlci4iKTsKLQkgIGlmIChkZWZlcnJlZCkKLQkgICAgewotCSAgICAgIC8qICo8ZGlzcD4oUm4pICovCi0JICAgICAgbW9kZSA9IFRBSE9FX1JFR19ESVNQX0RFRkVSUkVEOwotCSAgICAgIGlmIChpbW1lZGlhdGUpCi0JCW9wX2JhZCA9IF8oIlN5bnRheCBlcnJvciBpbiByZWdpc3RlciBkaXNwbGFjZWQgbW9kZS4iKTsKLQkgICAgfQotCSAgZWxzZSBpZiAocmVhbGx5X25vbmUpCi0JICAgIHsKLQkgICAgICAvKiAoUm4pICovCi0JICAgICAgbW9kZSA9IFRBSE9FX1JFR19ERUZFUlJFRDsKLQkgICAgICAvKiBpZiByZWcgPSBTUCB0aGVuIGNhbnQgYmUgaW5kZXhlZCAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiA8ZGlzcD4oUm4pICovCi0JICAgICAgbW9kZSA9IFRBSE9FX1JFR19ESVNQOwotCSAgICB9Ci0KLQkgIC8qIFdlIGtub3c6IGltbSA9IC0xLCBkZWNfaW5jID09ICcgJywgUmVnID0gLTEgKi8KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJlYWxseV9ub25lKQotCSAgICBvcF9iYWQgPSBfKCJBbiBvZmZlc3QgaXMgbmVlZGVkIGZvciB0aGlzIG9wZXJhbmQuIik7Ci0JICBpZiAoZGVmZXJyZWQgJiYgaW1tZWRpYXRlKQotCSAgICB7Ci0JICAgICAgLyogKiQ8QUREUj4gKi8KLQkgICAgICBtb2RlID0gVEFIT0VfQUJTT0xVVEVfQUREUjsKLQkgICAgICBkaXNwX3NpemUgPSA0OwotCSAgICB9Ci0JICBlbHNlIGlmIChpbW1lZGlhdGUpCi0JICAgIHsKLQkgICAgICAvKiAkPGRpc3A+ICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0lNTUVESUFURTsKLQkgICAgICBpZiAobmR4ICE9IC0xKQotCQlvcF9iYWQgPSBfKCJZb3UgY2FuJ3QgaW5kZXggYSByZWdpc3RlciBpbiBpbW1lZGlhdGUgbW9kZS4iKTsKLQkgICAgICBpZiAoYWNjZXNzID09ICdhJykKLQkJb3BfYmFkID0gXygiSW1tZWRpYXRlIGFjY2VzcyBjYW4ndCBiZSB1c2VkIGFzIGFuIGFkZHJlc3MuIik7Ci0JICAgICAgLyogcG9uZGVyIHRoZSB3aXNkb20gb2YgYSBjYXN0IGJlY2F1c2UgaXQgZG9lc24ndCBkbyBhbnkgZ29vZC4gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoZGVmZXJyZWQpCi0JICAgIHsKLQkgICAgICAvKiAqPGRpc3A+ICovCi0JICAgICAgbW9kZSA9IFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiA8ZGlzcD4gKi8KLQkgICAgICBtb2RlID0gVEFIT0VfRElTUExBQ0VEX1JFTEFUSVZFOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBBdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9ycyB3ZSBjYW4gZG8gaGF2ZSBiZSBjaGVja2VkIGZvci4KLSAgICogV2UgY2FuIGJ1aWxkIHRoZSAndG9wJy4gKi8KLQotICB0b3BQLT50b3BfbmR4ID0gbmR4OwotICB0b3BQLT50b3BfcmVnID0gcmVnOwotICB0b3BQLT50b3BfbW9kZSA9IG1vZGU7Ci0gIHRvcFAtPnRvcF9lcnJvciA9IG9wX2JhZDsKLSAgdG9wUC0+dG9wX2Rpc3BzaXplID0gZGlzcF9zaXplOwotfQkJCQkvKiB0aXBfb3AgKi8KLQwKLS8qCi0gKiAgICAgICAgICAgICAgICAgIHQgaSBwICggKQotICoKLSAqIFRoaXMgY29udmVydHMgYSBzdHJpbmcgaW50byBhIHRhaG9lIGluc3RydWN0aW9uLgotICogVGhlIHN0cmluZyBtdXN0IGJlIGEgYmFyZSBzaW5nbGUgaW5zdHJ1Y3Rpb24gaW4gdGFob2UgKHdpdGggQlNENCBmcm9icykKLSAqIGZvcm1hdC4KLSAqIEl0IHByb3ZpZGVzIGF0IG1vc3Qgb25lIGZhdGFsIGVycm9yIG1lc3NhZ2UgKHdoaWNoIHN0b3BzIHRoZSBzY2FuKQotICogc29tZSB3YXJuaW5nIG1lc3NhZ2VzIGFzIGl0IGZpbmRzIHRoZW0uCi0gKiBUaGUgdGFob2UgaW5zdHJ1Y3Rpb24gaXMgcmV0dXJuZWQgaW4gZXhwbG9kZWQgZm9ybS4KLSAqCi0gKiBUaGUgZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaXMgcmV0dXJuZWQgdG8gYSBzdHJ1Y3QgdGl0IG9mIHlvdXIgY2hvaWNlLgotICogI2luY2x1ZGUgInRhaG9lLWluc3QuaCIgdG8ga25vdyB3aGF0IGEgc3RydWN0IHRpdCBpcy4KLSAqCi0gKi8KLQotc3RhdGljIHZvaWQKLXRpcCAodGl0UCwgaW5zdHJpbmcpCi0gICAgIHN0cnVjdCB0aXQgKnRpdFA7CQkvKiBXZSBidWlsZCBhbiBleHBsb2RlZCBpbnN0cnVjdGlvbiBoZXJlLiAqLwotICAgICBjaGFyICppbnN0cmluZzsJCS8qIFRleHQgb2YgYSB2YXggaW5zdHJ1Y3Rpb246IHdlIG1vZGlmeS4gKi8KLXsKLSAgcmVnaXN0ZXIgc3RydWN0IHRvdF93b3QgKnR3UCA9IE5VTEw7CS8qIEhvdyB0byBiaXQtZW5jb2RlIHRoaXMgb3Bjb2RlLiAqLwotICByZWdpc3RlciBjaGFyICpwOwkJLyogMS9za2lwIHdoaXRlc3BhY2UuMi9zY2FuIHZvdF9ob3cgKi8KLSAgcmVnaXN0ZXIgY2hhciAqcTsJCS8qICAqLwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIGNvdW50OwkvKiBjb3VudHMgbnVtYmVyIG9mIG9wZXJhbmRzIHNlZW4gKi8KLSAgcmVnaXN0ZXIgc3RydWN0IHRvcCAqb3BlcmFuZHA7Lyogc2NhbiBvcGVyYW5kcyBpbiBzdHJ1Y3QgdGl0ICovCi0gIHJlZ2lzdGVyIGNoYXIgKmFsbG9wZXJyID0gIiI7CS8qIGVycm9yIG92ZXIgYWxsIG9wZXJhbmRzICovCi0gIHJlZ2lzdGVyIGNoYXIgYzsJCS8qIFJlbWVtYmVyIGNoYXIsICh3ZSBjbG9iYmVyIGl0Ci0JCQkJICAgd2l0aCAnXDAnIHRlbXBvcmFyaWx5KS4gKi8KLSAgY2hhciAqc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKCppbnN0cmluZyA9PSAnICcpCi0gICAgKytpbnN0cmluZzsJCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLSAgZm9yIChwID0gaW5zdHJpbmc7ICpwICYmICpwICE9ICcgJzsgcCsrKQotICAgIDsJCQkJLyogTVVTVCBlbmQgaW4gZW5kLW9mLXN0cmluZyBvcgotCQkJCSAgIGV4YWN0bHkgMSBzcGFjZS4gKi8KLSAgLyogU2Nhbm5lZCB1cCB0byBlbmQgb2Ygb3BlcmF0aW9uLWNvZGUuICovCi0gIC8qIE9wZXJhdGlvbi1jb2RlIGlzIGVuZGVkIHdpdGggd2hpdGVzcGFjZS4gKi8KLSAgaWYgKHAgPT0gaW5zdHJpbmcpCi0gICAgewotICAgICAgdGl0UC0+dGl0X2Vycm9yID0gXygiTm8gb3BlcmF0b3IiKTsKLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIHRpdFAtPnRpdF9vcGNvZGUgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAqcDsKLSAgICAgICpwID0gJ1wwJzsKLSAgICAgIC8qCi0gICAgICogSGVyZSB3aXRoIGluc3RyaW5nIHBvaW50aW5nIHRvIHdoYXQgYmV0dGVyIGJlIGFuIG9wLW5hbWUsIGFuZCBwCi0gICAgICogcG9pbnRpbmcgdG8gY2hhcmFjdGVyIGp1c3QgcGFzdCB0aGF0LgotICAgICAqIFdlIHRydXN0IGluc3RyaW5nIHBvaW50cyB0byBhbiBvcC1uYW1lLCB3aXRoIG5vIHdoaXRlc3BhY2UuCi0gICAgICovCi0gICAgICB0d1AgPSAoc3RydWN0IHRvdF93b3QgKikgaGFzaF9maW5kIChvcF9oYXNoLCBpbnN0cmluZyk7Ci0gICAgICAqcCA9IGM7CQkJLyogUmVzdG9yZSBjaGFyIGFmdGVyIG9wLWNvZGUuICovCi0gICAgICBpZiAodHdQID09IDApCi0JewotCSAgdGl0UC0+dGl0X2Vycm9yID0gXygiVW5rbm93biBvcGVyYXRvciIpOwotCSAgY291bnQgPSAwOwotCSAgdGl0UC0+dGl0X29wY29kZSA9IDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qCi0gICAgICAgKiBXZSBmb3VuZCBhIG1hdGNoISBTbyBsZXRzIHBpY2sgdXAgYXMgbWFueSBvcGVyYW5kcyBhcyB0aGUKLSAgICAgICAqIGluc3RydWN0aW9uIHdhbnRzLCBhbmQgZXZlbiBncmlwZSBpZiB0aGVyZSBhcmUgdG9vIG1hbnkuCi0gICAgICAgKiBXZSBleHBlY3QgY29tbWEgdG8gc2VwZXJhdGUgZWFjaCBvcGVyYW5kLgotICAgICAgICogV2UgbGV0IGluc3RyaW5nIHRyYWNrIHRoZSB0ZXh0LCB3aGlsZSBwIHRyYWNrcyBhIHBhcnQgb2YgdGhlCi0gICAgICAgKiBzdHJ1Y3QgdG90LgotICAgICAgICovCi0KLQkgIGNvdW50ID0gMDsJCS8qIG5vIG9wZXJhbmRzIHNlZW4geWV0ICovCi0JICBpbnN0cmluZyA9IHAgKyAoKnAgIT0gJ1wwJyk7CS8qIHBvaW50IHBhc3QgdGhlIG9wZXJhdGlvbiBjb2RlICovCi0JICAvKiB0aXBfb3AoKSBzY3Jld3Mgd2l0aCB0aGUgaW5wdXRfbGluZV9wb2ludGVyLCBzbyBzYXZlIGl0IGJlZm9yZQotCSBJIGp1bXAgaW4gKi8KLQkgIHNhdmVfaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgZm9yIChwID0gdHdQLT5hcmdzLCBvcGVyYW5kcCA9IHRpdFAtPnRpdF9vcGVyYW5kOwotCSAgICAgICAhKmFsbG9wZXJyICYmICpwOwotCSAgICAgICBvcGVyYW5kcCsrLCBwICs9IDIpCi0JICAgIHsKLQkgICAgICAvKgotCSAqIEhlcmUgdG8gcGFyc2Ugb25lIG9wZXJhbmQuIExlYXZlIGluc3RyaW5nIHBvaW50aW5nIGp1c3QKLQkgKiBwYXN0IGFueSBvbmUgJywnIHRoYXQgbWFya3MgdGhlIGVuZCBvZiB0aGlzIG9wZXJhbmQuCi0JICovCi0JICAgICAgaWYgKCFwWzFdKQotCQlhc19mYXRhbCAoXygiQ29tcGlsZXIgYnVnOiBPREQgbnVtYmVyIG9mIGJ5dGVzIGluIGFyZyBzdHJ1Y3R1cmUgJXMuIiksCi0JCQkgIHR3UC0+YXJncyk7Ci0JICAgICAgZWxzZSBpZiAoKmluc3RyaW5nKQotCQl7Ci0JCSAgZm9yIChxID0gaW5zdHJpbmc7ICgqcSAhPSAnLCcgJiYgKnEgIT0gJ1wwJyk7IHErKykKLQkJICAgIHsKLQkJICAgICAgaWYgKCpxID09ICdcJycgJiYgcVsxXSAhPSAnXDAnKQkvKiBKdW1wIHF1b3RlZCBjaGFyYWN0ZXJzICovCi0JCQlxKys7Ci0JCSAgICB9Ci0JCSAgYyA9ICpxOwotCQkgIC8qCi0JICAgKiBRIHBvaW50cyB0byAnLCcgb3IgJ1wwJyB0aGF0IGVuZHMgYXJndW1lbnQuIEMgaXMgdGhhdAotCSAgICogY2hhcmFjdGVyLgotCSAgICovCi0JCSAgKnEgPSAnXDAnOwotCQkgIG9wZXJhbmRwLT50b3BfYWNjZXNzID0gcFswXTsKLQkJICBvcGVyYW5kcC0+dG9wX3dpZHRoID0gcFsxXTsKLQkJICB0aXBfb3AgKGluc3RyaW5nIC0gMSwgb3BlcmFuZHApOwotCQkgICpxID0gYzsJLyogUmVzdG9yZSBpbnB1dCB0ZXh0LiAqLwotCQkgIGlmICgqKG9wZXJhbmRwLT50b3BfZXJyb3IpKQotCQkgICAgewotCQkgICAgICBhbGxvcGVyciA9IG9wZXJhbmRwLT50b3BfZXJyb3I7Ci0JCSAgICB9Ci0JCSAgaW5zdHJpbmcgPSBxICsgKGMgPyAxIDogMCk7CS8qIG5leHQgb3BlcmFuZCAoaWYgYW55KSAqLwotCQkgIGNvdW50Kys7CS8qICB3b24gYW5vdGhlciBhcmd1bWVudCwgbWF5IGhhdmUgYW4gb3BlcnIgKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJYWxsb3BlcnIgPSBfKCJOb3QgZW5vdWdoIG9wZXJhbmRzIik7Ci0JICAgIH0KLQkgIC8qIFJlc3RvcmUgdGhlIHBvaW50ZXIuICovCi0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQotCSAgaWYgKCEqYWxsb3BlcnIpCi0JICAgIHsKLQkgICAgICBpZiAoKmluc3RyaW5nID09ICcgJykKLQkJaW5zdHJpbmcrKzsJLyogU2tpcCB3aGl0ZXNwYWNlLiAqLwotCSAgICAgIGlmICgqaW5zdHJpbmcpCi0JCWFsbG9wZXJyID0gXygiVG9vIG1hbnkgb3BlcmFuZHMiKTsKLQkgICAgfQotCSAgdGl0UC0+dGl0X2Vycm9yID0gYWxsb3BlcnI7Ci0JfQotICAgIH0KLQotICB0aXRQLT50aXRfb3Bjb2RlID0gdHdQLT5jb2RlOwkvKiBUaGUgb3AtY29kZS4gKi8KLSAgdGl0UC0+dGl0X29wZXJhbmRzID0gY291bnQ7Ci19CQkJCS8qIHRpcCAqLwotDAotLyogbWRfYXNzZW1ibGUoKSBlbWl0IGZyYWdzIGZvciAxIGluc3RydWN0aW9uICovCi12b2lkCi1tZF9hc3NlbWJsZSAoaW5zdHJ1Y3Rpb25fc3RyaW5nKQotICAgICBjaGFyICppbnN0cnVjdGlvbl9zdHJpbmc7CS8qIEEgc3RyaW5nOiBhc3NlbWJsZSAxIGluc3RydWN0aW9uLiAqLwotewotICBjaGFyICpwOwotICByZWdpc3RlciBzdHJ1Y3QgdG9wICpvcGVyYW5kUDsvKiBBbiBvcGVyYW5kLiBTY2FucyBhbGwgb3BlcmFuZHMuICovCi0gIC8qICBjaGFyIGNfc2F2ZTsJZml4bWU6IHJlbW92ZSB0aGlzIGxpbmUgKi8vKiBXaGF0IHVzZWQgdG8gbGl2ZSBhZnRlciBhbiBleHByZXNzaW9uLiAqLwotICAvKiAgc3RydWN0IGZyYWcgKmZyYWdQOwlmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIEZyYWdtZW50IG9mIGNvZGUgd2UganVzdCBtYWRlLiAqLwotICAvKiAgcmVnaXN0ZXIgc3RydWN0IHRvcCAqZW5kX29wZXJhbmRQOyBmaXhtZTogcmVtb3ZlIHRoaXMgbGluZSAqLy8qIC0+IHNsb3QganVzdCBhZnRlciBsYXN0IG9wZXJhbmQKLQkJCQkJTGltaXQgb2YgdGhlIGZvciAoZWFjaCBvcGVyYW5kKS4gKi8KLSAgcmVnaXN0ZXIgZXhwcmVzc2lvblMgKmV4cFA7CS8qIC0+IGV4cHJlc3Npb24gdmFsdWVzIGZvciB0aGlzIG9wZXJhbmQgKi8KLQotICAvKiBUaGVzZSByZWZlciB0byBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kIGV4cHJlc3Npb24uICovCi0gIHNlZ1QgdG9fc2VnOwkJCS8qIFRhcmdldCBzZWdtZW50IG9mIHRoZSBhZGRyZXNzLgkgKi8KLQotICByZWdpc3RlciB2YWx1ZVQgdGhpc19hZGRfbnVtYmVyOwotICByZWdpc3RlciBzeW1ib2xTICp0aGlzX2FkZF9zeW1ib2w7CS8qICt2ZSAobWludWVuZCkgc3ltYm9sLiAqLwotCi0gIC8qICB0YWhvZV9vcGNvZGVUIG9wY29kZV9hc19udW1iZXI7IGZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogVGhlIG9wY29kZSBhcyBhIG51bWJlci4gKi8KLSAgY2hhciAqb3Bjb2RlUDsJCS8qIFdoZXJlIGl0IGlzIGluIGEgZnJhZy4gKi8KLSAgLyogIGNoYXIgKm9wbW9kZVA7CWZpeG1lOiByZW1vdmUgdGhpcyBsaW5lICovLyogV2hlcmUgb3Bjb2RlIHR5cGUgaXMsIGluIGEgZnJhZy4gKi8KLQotICBpbnQgZGlzcHNpemU7CQkJLyogRnJvbSB0b3BfZGlzcHNpemU6IHRhaG9lX29wZXJhbmRfd2lkdGgKLQkJCQkgICAoaW4gYnl0ZXMpICovCi0gIGludCBpc191bmRlZmluZWQ7CQkvKiAxIGlmIG9wZXJhbmQgZXhwcmVzc2lvbidzCi0JCQkJICAgc2VnbWVudCBub3Qga25vd24geWV0LiAqLwotICBpbnQgcGNfcmVsOwkJCS8qIElzIHRoaXMgb3BlcmFuZCBwYyByZWxhdGl2ZT8gKi8KLQotICAvKiBEZWNvZGUgdGhlIG9wZXJhbmQuICovCi0gIHRpcCAoJnQsIGluc3RydWN0aW9uX3N0cmluZyk7Ci0KLSAgLyoKLSAgICogQ2hlY2sgdG8gc2VlIGlmIHRoaXMgb3BlcmFuZCBkZWNvZGUgcHJvcGVybHkuCi0gICAqIE5vdGljZSB0aGF0IHdlIGhhdmVuJ3QgbWFkZSBhbnkgZnJhZ3MgeWV0LgotICAgKiBJZiBpdCBnb29mZWQsIHRoZW4gdGhpcyBpbnN0cnVjdGlvbiB3aWxsIHdlZGdlIGluIGFueSBwYXNzLAotICAgKiBhbmQgd2UgY2FuIHNhZmVseSBmbHVzaCBpdCwgd2l0aG91dCBjYXVzaW5nIGludGVycGFzcyBzeW1ib2wgcGhhc2UKLSAgICogZXJyb3JzLiBUaGF0IGlzLCB3aXRob3V0IGNoYW5naW5nIGxhYmVsIHZhbHVlcyBpbiBkaWZmZXJlbnQgcGFzc2VzLgotICAgKi8KLSAgaWYgKCp0LnRpdF9lcnJvcikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJJZ25vcmluZyBzdGF0ZW1lbnQgZHVlIHRvIFwiJXNcIiIpLCB0LnRpdF9lcnJvcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2Ugc2F3IG5vIGVycm9ycyBpbiBhbnkgb3BlcmFuZHMgLSB0cnkgdG8gbWFrZSBmcmFnKHMpICovCi0gICAgICAvKiBFbWl0IG9wLWNvZGUuICovCi0gICAgICAvKiBSZW1lbWJlciB3aGVyZSBpdCBpcywgaW4gY2FzZSB3ZSB3YW50IHRvIG1vZGlmeSB0aGUgb3AtY29kZSBsYXRlci4gKi8KLSAgICAgIG9wY29kZVAgPSBmcmFnX21vcmUgKDEpOwotICAgICAgKm9wY29kZVAgPSB0LnRpdF9vcGNvZGU7Ci0gICAgICAvKiBOb3cgZG8gZWFjaCBvcGVyYW5kLiAqLwotICAgICAgZm9yIChvcGVyYW5kUCA9IHQudGl0X29wZXJhbmQ7Ci0JICAgb3BlcmFuZFAgPCB0LnRpdF9vcGVyYW5kICsgdC50aXRfb3BlcmFuZHM7Ci0JICAgb3BlcmFuZFArKykKLQl7CQkJLyogZm9yIGVhY2ggb3BlcmFuZCAqLwotCSAgZXhwUCA9ICYob3BlcmFuZFAtPmV4cF9vZl9vcGVyYW5kKTsKLQkgIGlmIChvcGVyYW5kUC0+dG9wX25keCA+PSAwKQotCSAgICB7Ci0JICAgICAgLyogSW5kZXhlZCBhZGRyZXNzaW5nIGJ5dGUKLQkgICBMZWdhbGl0eSBvZiBpbmRleGVkIG1vZGUgYWxyZWFkeSBjaGVja2VkOiBpdCBpcyBPSyAqLwotCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoMHg0MCArIG9wZXJhbmRQLT50b3BfbmR4KTsKLQkgICAgfQkJCS8qIGlmKHRvcF9uZHg+PTApICovCi0KLQkgIC8qIEhlcmUgdG8gbWFrZSBtYWluIG9wZXJhbmQgZnJhZyhzKS4gKi8KLQkgIHRoaXNfYWRkX251bWJlciA9IGV4cFAtPlhfYWRkX251bWJlcjsKLQkgIHRoaXNfYWRkX3N5bWJvbCA9IGV4cFAtPlhfYWRkX3N5bWJvbDsKLQkgIHRvX3NlZyA9IG9wZXJhbmRQLT5zZWdfb2Zfb3BlcmFuZDsKLQkgIGtub3cgKHRvX3NlZyA9PSBTRUdfVU5LTk9XTiB8fCBcCi0JCXRvX3NlZyA9PSBTRUdfQUJTT0xVVEUgfHwgXAotCQl0b19zZWcgPT0gU0VHX0RBVEEgfHwgXAotCQl0b19zZWcgPT0gU0VHX1RFWFQgfHwgXAotCQl0b19zZWcgPT0gU0VHX0JTUyk7Ci0JICBpc191bmRlZmluZWQgPSAodG9fc2VnID09IFNFR19VTktOT1dOKTsKLQkgIC8qIERvIHdlIGtub3cgaG93IGJpZyB0aGlzIG9wcGVyYW5kIGlzPyAqLwotCSAgZGlzcHNpemUgPSBvcGVyYW5kUC0+dG9wX2Rpc3BzaXplOwotCSAgcGNfcmVsID0gMDsKLQkgIC8qIERlYWwgd2l0aCB0aGUgYnJhbmNoIHBvc3NhYmlsaXRpZXMuIChOb3RlLCB0aGlzIGRvZXNuJ3QgaW5jbHVkZQotCSBqdW1wcy4pKi8KLQkgIGlmIChvcGVyYW5kUC0+dG9wX2FjY2VzcyA9PSAnYicpCi0JICAgIHsKLQkgICAgICAvKiBCcmFuY2hlcyBtdXN0IGJlIGV4cHJlc3Npb25zLiBBIHBzdWVkbyBicmFuY2ggY2FuIGFsc28ganVtcCB0bwotCSAgIGFuIGFic29sdXRlIGFkZHJlc3MuICovCi0JICAgICAgaWYgKHRvX3NlZyA9PSBub3dfc2VnIHx8IGlzX3VuZGVmaW5lZCkKLQkJewotCQkgIC8qIElmIGlzX3VuZGVmaW5lZCwgdGhlbiBpdCBtaWdodCBCRUNPTUUgbm93X3NlZyBieSByZWxheCB0aW1lLiAqLwotCQkgIGlmIChkaXNwc2l6ZSkKLQkJICAgIHsKLQkJICAgICAgLyogSSBrbm93IGhvdyBiaWcgdGhlIGJyYW5jaCBpcyBzdXBwb3NlZCB0byBiZSAoaXQncyBhIG5vcm1hbAotCSAgICAgICBicmFuY2gpLCBzbyBJIHNldCB1cCB0aGUgZnJhZywgYW5kIGxldCBHQVMgZG8gdGhlIHJlc3QuICovCi0JCSAgICAgIHAgPSBmcmFnX21vcmUgKGRpc3BzaXplKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCSAgICAgICBzaXplX3RvX2Z4IChkaXNwc2l6ZSwgMSksCi0JCQkgICAgICAgTlVMTCk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiAodG9fc2VnPT1ub3dfc2VnIHx8IHRvX3NlZyA9PSBTRUdfVU5LTk9XTikgJiYgZGlzcHNpemU9PTAgKi8KLQkJICAgICAgLyogSWYgd2UgZG9uJ3Qga25vdyBob3cgYmlnIGl0IGlzLCB0aGVuIGl0cyBhIHN5bnRoZXRpYyBicmFuY2gsCi0JICAgICAgIHNvIHdlIHNldCB1cCBhIHNpbXBsZSByZWxheCBzdGF0ZS4gKi8KLQkJICAgICAgc3dpdGNoIChvcGVyYW5kUC0+dG9wX3dpZHRoKQotCQkJewotCQkJY2FzZSBUQUhPRV9XSURUSF9DT05ESVRJT05BTF9KVU1QOgotCQkJICAvKiBTaW1wbGUgKGNvbmRpdGlvbmFsKSBqdW1wLiBJIG1heSBoYXZlIHRvIHJldmVyc2UgdGhlCi0JCSBjb25kaXRpb24gb2Ygb3Bjb2RlUCwgYW5kIHRoZW4ganVtcCB0byBteSBkZXN0aW5hdGlvbi4KLQkJIEkgc2V0IDEgYnl0ZSBhc2lkZSBmb3IgdGhlIGJyYW5jaCBvZmYgc2V0LCBhbmQgY291bGQgbmVlZCA2Ci0JCSBtb3JlIGJ5dGVzIGZvciB0aGUgcGNfcmVsIGp1bXAgKi8KLQkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA3LCAxLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwKLQkJCQkgICAgaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEUpLAotCQkJCSB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwgb3Bjb2RlUCk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSBUQUhPRV9XSURUSF9BTFdBWVNfSlVNUDoKLQkJCSAgLyogU2ltcGxlICh1bmNvbmRpdGlvbmFsKSBqdW1wLiBJIG1heSBoYXZlIHRvIGNvbnZlcnQgdGhpcyB0bwotCQkgYSB3b3JkIGJyYW5jaCwgb3IgYW4gYWJzb2x1dGUganVtcC4gKi8KLQkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA1LCAxLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9CWVRFKSwKLQkJCQkgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIG9wY29kZVApOwotCQkJICBicmVhazsKLQkJCSAgLyogVGhlIHNtYWxsZXN0IHNpemUgZm9yIHRoZSBuZXh0IDIgY2FzZXMgaXMgd29yZC4gKi8KLQkJCWNhc2UgVEFIT0VfV0lEVEhfQklHX1JFVl9KVU1QOgotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDgsIDIsCi0JCQkJICAgIEVOQ09ERV9SRUxBWCAoU1RBVEVfQklHX1JFVl9CUkFOQ0gsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9XT1JEKSwKLQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJICAgIG9wY29kZVApOwotCQkJICBicmVhazsKLQkJCWNhc2UgVEFIT0VfV0lEVEhfQklHX05PTl9SRVZfSlVNUDoKLQkJCSAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCAxMCwgMiwKLQkJCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9CSUdfTk9OX1JFVl9CUkFOQ0gsCi0JCQkJICAgIGlzX3VuZGVmaW5lZCA/IFNUQVRFX1VOREYgOiBTVEFURV9XT1JEKSwKLQkJCQkgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJICAgIG9wY29kZVApOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGFzX2ZhdGFsIChfKCJDb21wbGlsZXIgYnVnOiBHb3QgYSBjYXNlICglZCkgSSB3YXNuJ3QgZXhwZWN0aW5nLiIpLAotCQkJCSAgICBvcGVyYW5kUC0+dG9wX3dpZHRoKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIHRvX3NlZyAhPSBub3dfc2VnICYmIHRvX3NlZyAhPSBzZWdfdW5rbm93biAoc3RpbGwgaW4gYnJhbmNoKQotCSAgICAgSW4gb3RoZXIgd29yZHMsIEknbSBqdW1waW5nIG91dCBvZiBteSBzZWdtZW50IHNvIGV4dGVuZCB0aGUKLQkgICAgIGJyYW5jaGVzIHRvIGp1bXBzLCBhbmQgbGV0IEdBUyBmaXggdGhlbS4gKi8KLQotCQkgIC8qIFRoZXNlIGFyZSAiYnJhbmNoZXMiIHdoYXQgd2lsbCBhbHdheXMgYmUgYnJhbmNoZXMgYXJvdW5kIGEganVtcAotCSAgICAgdG8gdGhlIGNvcnJlY3QgYWRkcmVzc3MgaW4gcmVhbCBsaWZlLgotCSAgICAgSWYgdG9fc2VnIGlzIFNFR19BQlNPTFVURSwganVzdCBlbmNvZGUgdGhlIGJyYW5jaCBpbiwKLQkgICAgIGVsc2UgbGV0IEdBUyBmaXggdGhlIGFkZHJlc3MuICovCi0KLQkJICBzd2l0Y2ggKG9wZXJhbmRQLT50b3Bfd2lkdGgpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoZSB0aGVvcnk6Ci0JICAgICAgIEZvciBTRUdfQUJTT0xVVEUsIHRoZW4gbW9kZSBpcyBBQlNPTFVURV9BRERSLCBqdW1wCi0JICAgICAgIHRvIHRoYXQgYWRkcmVzc3MgKG5vdCBwY19yZWwpLgotCSAgICAgICBGb3Igb3RoZXIgc2VncywgYWRkcmVzcyBpcyBhIGxvbmcgd29yZCBQQyByZWwganVtcC4gKi8KLQkJICAgIGNhc2UgVEFIT0VfV0lEVEhfQ09ORElUSU9OQUxfSlVNUDoKLQkJICAgICAgLyogYjxjb25kPiAqLwotCQkgICAgICAvKiBUbyByZXZlcnNlIHRoZSBjb25kaXRpb24gaW4gYSBUQUhPRSBicmFuY2gsCi0JICAgICAgIGNvbXBsZW1lbnQgYml0IDQgKi8KLQkJICAgICAgKm9wY29kZVAgXj0gMHgxMDsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNyk7Ci0JCSAgICAgICpwKysgPSA2OwotCQkgICAgICAqcCsrID0gVEFIT0VfSk1QOwotCQkgICAgICAqcCsrID0gKG9wZXJhbmRQLT50b3BfbW9kZSA9PQotCQkJICAgICAgVEFIT0VfQUJTT0xVVEVfQUREUiA/IFRBSE9FX0FCU09MVVRFX0FERFIgOgotCQkJICAgICAgVEFIT0VfUENfUkVMX0xPTkcpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkgICAgICAgKHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpID8gRlhfUENSRUwzMiA6IEZYXzMyLCBOVUxMKTsKLQkJICAgICAgLyoKLQkgICAgICogTm93IChlZykJQkxFUQkxZgotCSAgICAgKgkJSk1QCWZvbwotCSAgICAgKgkxOgotCSAgICAgKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFRBSE9FX1dJRFRIX0FMV0FZU19KVU1QOgotCQkgICAgICAvKiBiciwganVzdCB0dXJuIGl0IGludG8gYSBqdW1wICovCi0JCSAgICAgICpvcGNvZGVQID0gVEFIT0VfSk1QOwotCQkgICAgICBwID0gZnJhZ19tb3JlICg1KTsKLQkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KLQkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKLQkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7Ci0JCSAgICAgIC8qIE5vdyAoZWcpIEpNUCBmb28gKi8KLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIFRBSE9FX1dJRFRIX0JJR19SRVZfSlVNUDoKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0JCSAgICAgICpvcGNvZGVQIF49IDB4MTA7Ci0JCSAgICAgICpwKysgPSAwOwotCQkgICAgICAqcCsrID0gNjsKLQkJICAgICAgKnArKyA9IFRBSE9FX0pNUDsKLQkJICAgICAgKnArKyA9IChvcGVyYW5kUC0+dG9wX21vZGUgPT0KLQkJCSAgICAgIFRBSE9FX0FCU09MVVRFX0FERFIgPyBUQUhPRV9BQlNPTFVURV9BRERSIDoKLQkJCSAgICAgIFRBSE9FX1BDX1JFTF9MT05HKTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgICB0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJICAgICAgICh0b19zZWcgIT0gU0VHX0FCU09MVVRFKSA/IEZYX1BDUkVMMzIgOiBGWF8zMiwgTlVMTCk7Ci0JCSAgICAgIC8qCi0JICAgICAqIE5vdyAoZWcpCUFDQngJMWYKLQkgICAgICoJCUpNUCAgICAgZm9vCi0JICAgICAqCTE6Ci0JICAgICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgVEFIT0VfV0lEVEhfQklHX05PTl9SRVZfSlVNUDoKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoMTApOwotCQkgICAgICAqcCsrID0gMDsKLQkJICAgICAgKnArKyA9IDI7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9CUkI7Ci0JCSAgICAgICpwKysgPSA2OwotCQkgICAgICAqcCsrID0gVEFIT0VfSk1QOwotCQkgICAgICAqcCsrID0gKG9wZXJhbmRQLT50b3BfbW9kZSA9PQotCQkJICAgICAgVEFIT0VfQUJTT0xVVEVfQUREUiA/IFRBSE9FX0FCU09MVVRFX0FERFIgOgotCQkJICAgICAgVEFIT0VfUENfUkVMX0xPTkcpOwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkgICAgICAgKHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpID8gRlhfUENSRUwzMiA6IEZYXzMyLCBOVUxMKTsKLQkJICAgICAgLyoKLQkgICAgICogTm93IChlZykJeE9CeHh4CTFmCi0JICAgICAqCQlCUkIJMmYKLQkgICAgICoJMToJSk1QCUAjZm9vCi0JICAgICAqCTI6Ci0JICAgICAqLwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ2InOgotCQkgICAgY2FzZSAndyc6Ci0JCSAgICAgIGFzX3dhcm4gKF8oIlJlYWwgYnJhbmNoIGRpc3BsYWNlbWVudHMgbXVzdCBiZSBleHByZXNzaW9ucy4iKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgYXNfZmF0YWwgKF8oIkNvbXBsaWVyIGVycm9yOiBJIGdvdCBhbiB1bmtub3duIHN5bnRoZXRpYyBicmFuY2ggOiVjIiksCi0JCQkJb3BlcmFuZFAtPnRvcF93aWR0aCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEl0IGFpbid0IGEgYnJhbmNoIG9wZXJhbmQuICovCi0JICAgICAgc3dpdGNoIChvcGVyYW5kUC0+dG9wX21vZGUpCi0JCXsKLQkJICAvKiBBdXRvLWZvbyBhY2Nlc3MsIG9ubHkgd29ya3MgZm9yIG9uZSByZWcgKFNQKQotCSAgICAgc28gdGhlIG9ubHkgdGhpbmcgbmVlZGVkIGlzIHRoZSBtb2RlLiAqLwotCQljYXNlIFRBSE9FX0FVVE9fREVDOgotCQljYXNlIFRBSE9FX0FVVE9fSU5DOgotCQljYXNlIFRBSE9FX0FVVE9fSU5DX0RFRkVSUkVEOgotCQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAob3BlcmFuZFAtPnRvcF9tb2RlKTsKLQkJICBicmVhazsKLQotCQkgIC8qIE51bWJlcmVkIFJlZ2lzdGVyIG9ubHkgYWNjZXNzLiBPbmx5IHRoaW5nIG5lZWRlZCBpcyB0aGUKLQkgICAgIG1vZGUgKyBSZWdpc3RlciBudW1iZXIgKi8KLQkJY2FzZSBUQUhPRV9ESVJFQ1RfUkVHOgotCQljYXNlIFRBSE9FX1JFR19ERUZFUlJFRDoKLQkJICBGUkFHX0FQUEVORF8xX0NIQVIgKG9wZXJhbmRQLT50b3BfbW9kZSArIG9wZXJhbmRQLT50b3BfcmVnKTsKLQkJICBicmVhazsKLQotCQkgIC8qIEFuIGFic29sdXRlIGFkZHJlc3MuIEl0J3Mgc2l6ZSBpcyBhbHdheXMgNSBieXRlcy4KLQkgICAgIChtb2RlX3R5cGUgKyA0IGJ5dGUgYWRkcmVzcykuICovCi0JCWNhc2UgVEFIT0VfQUJTT0xVVEVfQUREUjoKLQkJICBrbm93ICgodGhpc19hZGRfc3ltYm9sID09IE5VTEwpKTsKLQkJICBwID0gZnJhZ19tb3JlICg1KTsKLQkJICAqcCA9IFRBSE9FX0FCU09MVVRFX0FERFI7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJICBicmVhazsKLQotCQkgIC8qIEltbWVkaWF0ZSBkYXRhLiBJZiB0aGUgc2l6ZSBpc24ndCBrbm93biwgdGhlbiBpdCdzIGFuIGFkZHJlc3MKLQkgICAgICsgYW5kIG9mZnNldCwgd2hpY2ggaXMgNCBieXRlcyBiaWcuICovCi0JCWNhc2UgVEFIT0VfSU1NRURJQVRFOgotCQkgIGlmICh0aGlzX2FkZF9zeW1ib2wgIT0gTlVMTCkKLQkJICAgIHsKLQkJICAgICAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCSAgICAgICpwKysgPSBUQUhPRV9JTU1FRElBVEVfTE9OR1dPUkQ7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkgICAgICAgRlhfMzIsIE5VTEwpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgLyogSXQncyBhIGludGVnZXIsIGFuZCBJIGtub3cgaXQncyBzaXplLiAqLwotCQkgICAgICBpZiAoKHVuc2lnbmVkKSB0aGlzX2FkZF9udW1iZXIgPCAweDQwKQotCQkJewotCQkJICAvKiBXaWxsIGl0IGZpdCBpbiBhIGxpdGVyYWw/ICovCi0JCQkgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoKGJ5dGUpIHRoaXNfYWRkX251bWJlcik7Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgcCA9IGZyYWdfbW9yZSAoZGlzcHNpemUgKyAxKTsKLQkJCSAgc3dpdGNoIChkaXNwc2l6ZSkKLQkJCSAgICB7Ci0JCQkgICAgY2FzZSAxOgotCQkJICAgICAgKnArKyA9IFRBSE9FX0lNTUVESUFURV9CWVRFOwotCQkJICAgICAgKnAgPSAoYnl0ZSkgdGhpc19hZGRfbnVtYmVyOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSAyOgotCQkJICAgICAgKnArKyA9IFRBSE9FX0lNTUVESUFURV9XT1JEOwotCQkJICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCB0aGlzX2FkZF9udW1iZXIsIDIpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgY2FzZSA0OgotCQkJICAgICAgKnArKyA9IFRBSE9FX0lNTUVESUFURV9MT05HV09SRDsKLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBicmVhazsKLQotCQkgIC8qIERpc3RhbmNlIGZyb20gdGhlIFBDLiBJZiB0aGUgc2l6ZSBpc24ndCBrbm93biwgd2UgaGF2ZSB0byByZWxheAotCSAgICAgaW50byBpdC4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzIGFuZCBkaXNwKHNwKSBpcyB0aGF0Ci0JICAgICB0aGlzIG9mZnNldCBpcyBwY19yZWwsIGFuZCBkaXNwKHNwKSBpc24ndC4KLQkgICAgIE5vdGUgdGhlIGRyb3AgdGhyb3VnaCBjb2RlLiAqLwotCi0JCWNhc2UgVEFIT0VfRElTUExBQ0VEX1JFTEFUSVZFOgotCQljYXNlIFRBSE9FX0RJU1BfUkVMX0RFRkVSUkVEOgotCQkgIG9wZXJhbmRQLT50b3BfcmVnID0gUENfUkVHOwotCQkgIHBjX3JlbCA9IDE7Ci0KLQkJICAvKiBSZWdpc3RlciwgcGx1cyBhIGRpc3BsYWNlbWVudCBtb2RlLiBTYXZlIHRoZSByZWdpc3RlciBudW1iZXIsCi0JICAgICBhbmQgd2VhdGhlciBpdHMgZGVmZmVyZWQgb3Igbm90LCBhbmQgcmVsYXggdGhlIHNpemUgaWYgaXQgaXNuJ3QKLQkgICAgIGtub3duLiAqLwotCQljYXNlIFRBSE9FX1JFR19ESVNQOgotCQljYXNlIFRBSE9FX1JFR19ESVNQX0RFRkVSUkVEOgotCQkgIGlmIChvcGVyYW5kUC0+dG9wX21vZGUgPT0gVEFIT0VfRElTUF9SRUxfREVGRVJSRUQgfHwKLQkJICAgICAgb3BlcmFuZFAtPnRvcF9tb2RlID09IFRBSE9FX1JFR19ESVNQX0RFRkVSUkVEKQotCQkgICAgb3BlcmFuZFAtPnRvcF9yZWcgKz0gMHgxMDsJLyogZGVmZmVyZWQgbW9kZSBpcyBhbHdheXMgMHgxMCBoaWdoZXIKLQkJCQkJICB0aGFuIGl0J3Mgbm9uLWRlZmZlcmVkIHNpYmxpbmcuICovCi0KLQkJICAvKiBJcyB0aGlzIGEgdmFsdWUgb3V0IG9mIHRoaXMgc2VnbWVudD8KLQkgICAgIFRoZSBmaXJzdCBwYXJ0IG9mIHRoaXMgY29uZGl0aW9uYWwgaXMgYSBjbHVkZ2UgdG8gbWFrZSBnYXMKLQkgICAgIHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0IGFzICdhcycgd2hlbiB0aGVyZSBpcyBhIGxhYmxlLCBpbgotCSAgICAgdGhlIGN1cnJlbnQgc2VnbWVudCwgZGlzcGxhY2VpbmcgYSByZWdpc3Rlci4gSXQncyBzdHJhbmdlLAotCSAgICAgYW5kIG5vIG9uZSBpbiB0aGVpciByaWdodCBtaW5kIHdvdWxkIGRvIGl0LCBidXQgaXQncyBlYXN5Ci0JICAgICB0byBjbHVkZ2UuICovCi0JCSAgaWYgKChkaXNwc2l6ZSA9PSAwICYmICFwY19yZWwpIHx8Ci0JCSAgICAgICh0b19zZWcgIT0gbm93X3NlZyAmJiAhaXNfdW5kZWZpbmVkICYmIHRvX3NlZyAhPSBTRUdfQUJTT0xVVEUpKQotCQkgICAgZGlzcHNpemUgPSA0OwotCi0JCSAgaWYgKGRpc3BzaXplID09IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JICAgICAqIFdlIGhhdmUgYSBTRUdfVU5LTk9XTiBzeW1ib2wsIG9yIHRoZSBzaXplIGlzbid0IGNhc3QuCi0JICAgICAqIEl0IG1pZ2h0IHR1cm4gb3V0IHRvIGJlIGluIHRoZSBzYW1lIHNlZ21lbnQgYXMKLQkgICAgICogdGhlIGluc3RydWN0aW9uLCBwZXJtaXR0aW5nIHJlbGF4YXRpb24uCi0JICAgICAqLwotCQkgICAgICBwID0gZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA1LCAyLAotCQkJCSAgICBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLAotCQkJCSAgICBpc191bmRlZmluZWQgPyBTVEFURV9VTkRGIDogU1RBVEVfQllURSksCi0JCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLCAwKTsKLQkJICAgICAgKnAgPSBvcGVyYW5kUC0+dG9wX3JlZzsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIC8qIEVpdGhlciB0aGlzIGlzIGFuIGFicywgb3IgYSBjYXN0LiAqLwotCQkgICAgICBwID0gZnJhZ19tb3JlIChkaXNwc2l6ZSArIDEpOwotCQkgICAgICBzd2l0Y2ggKGRpc3BzaXplKQotCQkJewotCQkJY2FzZSAxOgotCQkJICAqcCA9IFRBSE9FX1BDX09SX0JZVEUgKyBvcGVyYW5kUC0+dG9wX3JlZzsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkgICpwID0gVEFIT0VfUENfT1JfV09SRCArIG9wZXJhbmRQLT50b3BfcmVnOwotCQkJICBicmVhazsKLQkJCWNhc2UgNDoKLQkJCSAgKnAgPSBUQUhPRV9QQ19PUl9MT05HICsgb3BlcmFuZFAtPnRvcF9yZWc7Ci0JCQkgIGJyZWFrOwotCQkJfTsKLQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkgICAgICAgc2l6ZV90b19meCAoZGlzcHNpemUsIHBjX3JlbCksIE5VTEwpOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGFzX2ZhdGFsIChfKCJCYXJmLCBiYWQgbW9kZSAleFxuIiksIG9wZXJhbmRQLT50b3BfbW9kZSk7Ci0JCX0KLQkgICAgfQotCX0JCQkvKiBmb3Iob3BlcmFuZFApICovCi0gICAgfQkJCQkvKiBpZighbmVlZF9wYXNzXzIgJiYgIWdvb2ZlZCkgKi8KLX0JCQkJLyogdGFob2VfYXNzZW1ibGUoKSAqLwotCi0KLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0JCQkJLyogbWRfdW5kZWZpbmVkX3N5bWJvbCgpICovCi0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gKi8KLXZhbHVlVAotbWRfc2VjdGlvbl9hbGlnbiAoc2VnbWVudCwgc2l6ZSkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICB2YWx1ZVQgc2l6ZTsKLXsKLSAgcmV0dXJuICgoc2l6ZSArIDcpICYgfjcpOwkvKiBSb3VuZCBhbGwgc2VjdHMgdG8gbXVsdGlwbGUgb2YgOCAqLwotfQkJCQkvKiBtZF9zZWN0aW9uX2FsaWduKCkgKi8KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIHNwYXJjLCB0aGV5J3JlIHJlbGF0aXZlIHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBvZmZzZXQsIHBsdXMKLSAgIGl0cyBzaXplLiAgVGhpcyBnZXRzIHVzIHRvIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24uCi0gICAoPz8/IElzIHRoaXMgcmlnaHQ/ICBGSVhNRS1TT09OKSAqLwotbG9uZyAKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiAoKChmaXhQLT5meF90eXBlID09IEZYXzgKLQkgICAgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDgpCi0JICAgPyAxCi0JICAgOiAoKGZpeFAtPmZ4X3R5cGUgPT0gRlhfMTYKLQkgICAgICAgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDE2KQotCSAgICAgID8gMgotCSAgICAgIDogKChmaXhQLT5meF90eXBlID09IEZYXzMyCi0JCSAgfHwgZml4UC0+ZnhfdHlwZSA9PSBGWF9QQ1JFTDMyKQotCQkgPyA0Ci0JCSA6IDApKSkgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MpOwotfQkJCQkvKiBtZF9wY3JlbF9mcm9tKCkgKi8KLQotaW50IAotdGNfaXNfcGNyZWwgKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIC8qIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgKi8KLSAga25vdyAoMCk7Ci0gIHJldHVybiAoMCk7Ci19CQkJCS8qIHRjX2lzX3BjcmVsKCkgKi8KLQotLyogZW5kIG9mIHRjLXRhaG9lLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGFob2UuaCBiL2dhcy9jb25maWcvdGMtdGFob2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU4YTViZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtdGFob2UuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRDX1RBSE9FIDEKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgTk9fTElTVElORwotCi0jZGVmaW5lIHRjX2hlYWRlcnNfaG9vayhhKQkJezt9CS8qIGRvbid0IG5lZWQgaXQuICovCi0jZGVmaW5lIHRjX2NyYXdsX3N5bWJvbF9jaGFpbihhKQl7O30JLyogZG9uJ3QgbmVlZCBpdC4gKi8KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayhhKQl7O30KLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy10YWhvZS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzMwLmMgYi9nYXMvY29uZmlnL3RjLXRpYzMwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NWMwNmEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg4OCArMCwwIEBACi0vKiB0Yy1jMzAuYyAtLSBBc3NlbWJseSBjb2RlIGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzMwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgIFRleGFzIEluc3RydW1lbnRzIFRNUzMyMEMzMCBtYWNoaW5lIHNwZWNpZmljIGdhcy4KLSAgIFdyaXR0ZW4gYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkuCi0gICBCdWdzICYgc3VnZ2VzdGlvbnMgYXJlIGNvbXBsZXRlbHkgd2VsY29tZS4gIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4KLSAgIFBsZWFzZSBoZWxwIHVzIG1ha2UgaXQgYmV0dGVyLgotICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgIm9wY29kZS90aWMzMC5oIgotCi0vKiBwdXQgaGVyZSBhbGwgbm9uLWRpZ2l0IG5vbi1sZXR0ZXIgY2hhcmN0ZXJzIHRoYXQgbWF5IG9jY3VyIGluIGFuIG9wZXJhbmQgKi8KLXN0YXRpYyBjaGFyIG9wZXJhbmRfc3BlY2lhbF9jaGFyc1tdID0gIiUkLSsoLCkqLl9+Lzw+Jl4hOltAXSI7Ci1zdGF0aWMgY2hhciAqb3JkaW5hbF9uYW1lc1tdID0KLXsiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIiwgImZvdXJ0aCIsICJmaWZ0aCJ9OwotCi1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDA7Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIqIjsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9ICIiOwotCi1jb25zdCBjaGFyICptZF9zaG9ydG9wdHMgPSAiIjsKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9Ci17Ci0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mIChtZF9sb25nb3B0cyk7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZkZkRHhYIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiB0YWJsZXMgZm9yIGxleGljYWwgYW5hbHlzaXMgKi8KLXN0YXRpYyBjaGFyIG9wY29kZV9jaGFyc1syNTZdOwotc3RhdGljIGNoYXIgcmVnaXN0ZXJfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIG9wZXJhbmRfY2hhcnNbMjU2XTsKLXN0YXRpYyBjaGFyIHNwYWNlX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBpZGVudGlmaWVyX2NoYXJzWzI1Nl07Ci1zdGF0aWMgY2hhciBkaWdpdF9jaGFyc1syNTZdOwotCi0vKiBsZXhpY2FsIG1hY3JvcyAqLwotI2RlZmluZSBpc19vcGNvZGVfY2hhcih4KSAob3Bjb2RlX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfb3BlcmFuZF9jaGFyKHgpIChvcGVyYW5kX2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLSNkZWZpbmUgaXNfcmVnaXN0ZXJfY2hhcih4KSAocmVnaXN0ZXJfY2hhcnNbKHVuc2lnbmVkIGNoYXIpIHhdKQotI2RlZmluZSBpc19zcGFjZV9jaGFyKHgpIChzcGFjZV9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX2lkZW50aWZpZXJfY2hhcih4KSAoaWRlbnRpZmllcl9jaGFyc1sodW5zaWduZWQgY2hhcikgeF0pCi0jZGVmaW5lIGlzX2RpZ2l0X2NoYXIoeCkgKGRpZ2l0X2NoYXJzWyh1bnNpZ25lZCBjaGFyKSB4XSkKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgezAsIDAsIDB9Ci19OwotCi0jdW5kZWYgVVNFX1NURE9VVAotI2RlZmluZSBVU0VfU1RET1VUIDEKLQotI2lmZGVmIFVTRV9TVERBUkcKLQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi1pbnQKLWRlYnVnIChjb25zdCBjaGFyICpzdHJpbmcsLi4uKQotewotICBpZiAoZmxhZ19kZWJ1ZykKLSAgICB7Ci0gICAgICB2YV9saXN0IGFyZ3B0cjsKLSAgICAgIGNoYXIgc3RyWzEwMF07Ci0KLSAgICAgIHZhX3N0YXJ0IChhcmdwdHIsIHN0cmluZyk7Ci0gICAgICB2c3ByaW50ZiAoc3RyLCBzdHJpbmcsIGFyZ3B0cik7Ci0gICAgICBpZiAoc3RyWzBdID09ICdcMCcpCi0JcmV0dXJuICgwKTsKLSAgICAgIHZhX2VuZCAoYXJncHRyKTsKLSAgICAgIGZwdXRzIChzdHIsIFVTRV9TVERPVVQgPyBzdGRvdXQgOiBzdGRlcnIpOwotICAgICAgcmV0dXJuIHN0cmxlbiAoc3RyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLSNlbHNlCi1pbnQKLWRlYnVnIChzdHJpbmcsIHZhX2FsaXN0KQotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIHZhX2RjbAotewotICBpZiAoZmxhZ19kZWJ1ZykKLSAgICB7Ci0gICAgICB2YV9saXN0IGFyZ3B0cjsKLSAgICAgIGNoYXIgc3RyWzEwMF07Ci0gICAgICBpbnQgY250OwotCi0gICAgICB2YV9zdGFydCAoYXJncHRyLCBzdHJpbmcpOwotICAgICAgY250ID0gdnNwcmludGYgKHN0ciwgc3RyaW5nLCBhcmdwdHIpOwotICAgICAgaWYgKHN0clswXSA9PSBOVUxMKQotCXJldHVybiAoMCk7Ci0gICAgICB2YV9lbmQgKGFyZ3B0cik7Ci0gICAgICBmcHV0cyAoc3RyLCBVU0VfU1RET1VUID8gc3Rkb3V0IDogc3RkZXJyKTsKLSAgICAgIHJldHVybiAoY250KTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiBoYXNoIHRhYmxlIGZvciBvcGNvZGUgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLS8qIGhhc2ggdGFibGUgZm9yIHBhcmFsbGVsIG9wY29kZSBsb29rdXAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwYXJvcF9oYXNoOwotLyogaGFzaCB0YWJsZSBmb3IgcmVnaXN0ZXIgbG9va3VwICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqcmVnX2hhc2g7Ci0vKiBoYXNoIHRhYmxlIGZvciBpbmRpcmVjdCBhZGRyZXNzaW5nIGxvb2t1cCAqLwotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmluZF9oYXNoOwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBjb25zdCBjaGFyICpoYXNoX2VycjsKLSAgZGVidWcgKCJJbiBtZF9iZWdpbigpXG4iKTsKLSAgb3BfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgY29uc3QgdGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSB0aWMzMF9vcHRhYjsKLSAgICBmb3IgKDsgY3VycmVudF9vcHRhYiA8IHRpYzMwX29wdGFiX2VuZDsgY3VycmVudF9vcHRhYisrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKG9wX2hhc2gsIGN1cnJlbnRfb3B0YWItPm5hbWUsIChjaGFyICopIGN1cnJlbnRfb3B0YWIpOwotCWlmIChoYXNoX2VycikKLQkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9vcHRhYi0+bmFtZSwgaGFzaF9lcnIpOwotICAgICAgfQotICB9Ci0gIHBhcm9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgewotICAgIGNvbnN0IHBhcnRlbXBsYXRlICpjdXJyZW50X3Bhcm9wID0gdGljMzBfcGFyb3B0YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfcGFyb3AgPCB0aWMzMF9wYXJvcHRhYl9lbmQ7IGN1cnJlbnRfcGFyb3ArKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChwYXJvcF9oYXNoLCBjdXJyZW50X3Bhcm9wLT5uYW1lLCAoY2hhciAqKSBjdXJyZW50X3Bhcm9wKTsKLQlpZiAoaGFzaF9lcnIpCi0JICBhc19mYXRhbCAoIkludGVybmFsIEVycm9yOiBDYW4ndCBIYXNoICVzOiAlcyIsIGN1cnJlbnRfcGFyb3AtPm5hbWUsIGhhc2hfZXJyKTsKLSAgICAgIH0KLSAgfQotICByZWdfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgY29uc3QgcmVnICpjdXJyZW50X3JlZyA9IHRpYzMwX3JlZ3RhYjsKLSAgICBmb3IgKDsgY3VycmVudF9yZWcgPCB0aWMzMF9yZWd0YWJfZW5kOyBjdXJyZW50X3JlZysrKQotICAgICAgewotCWhhc2hfZXJyID0gaGFzaF9pbnNlcnQgKHJlZ19oYXNoLCBjdXJyZW50X3JlZy0+bmFtZSwgKGNoYXIgKikgY3VycmVudF9yZWcpOwotCWlmIChoYXNoX2VycikKLQkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9yZWctPm5hbWUsIGhhc2hfZXJyKTsKLSAgICAgIH0KLSAgfQotICBpbmRfaGFzaCA9IGhhc2hfbmV3ICgpOwotICB7Ci0gICAgY29uc3QgaW5kX2FkZHJfdHlwZSAqY3VycmVudF9pbmQgPSB0aWMzMF9pbmRhZGRyX3RhYjsKLSAgICBmb3IgKDsgY3VycmVudF9pbmQgPCB0aWMzMF9pbmRhZGRydGFiX2VuZDsgY3VycmVudF9pbmQrKykKLSAgICAgIHsKLQloYXNoX2VyciA9IGhhc2hfaW5zZXJ0IChpbmRfaGFzaCwgY3VycmVudF9pbmQtPnN5bnRheCwgKGNoYXIgKikgY3VycmVudF9pbmQpOwotCWlmIChoYXNoX2VycikKLQkgIGFzX2ZhdGFsICgiSW50ZXJuYWwgRXJyb3I6IENhbid0IEhhc2ggJXM6ICVzIiwgY3VycmVudF9pbmQtPnN5bnRheCwgaGFzaF9lcnIpOwotICAgICAgfQotICB9Ci0gIC8qIGZpbGwgaW4gbGV4aWNhbCB0YWJsZXM6ICBvcGNvZGVfY2hhcnMsIG9wZXJhbmRfY2hhcnMsIHNwYWNlX2NoYXJzICovCi0gIHsKLSAgICByZWdpc3RlciBpbnQgYzsKLSAgICByZWdpc3RlciBjaGFyICpwOwotCi0gICAgZm9yIChjID0gMDsgYyA8IDI1NjsgYysrKQotICAgICAgewotCWlmIChpc2xvd2VyIChjKSB8fCBpc2RpZ2l0IChjKSkKLQkgIHsKLQkgICAgb3Bjb2RlX2NoYXJzW2NdID0gYzsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBjOwotCSAgfQotCWVsc2UgaWYgKGlzdXBwZXIgKGMpKQotCSAgewotCSAgICBvcGNvZGVfY2hhcnNbY10gPSB0b2xvd2VyIChjKTsKLQkgICAgcmVnaXN0ZXJfY2hhcnNbY10gPSBvcGNvZGVfY2hhcnNbY107Ci0JICB9Ci0JZWxzZSBpZiAoYyA9PSAnKScgfHwgYyA9PSAnKCcpCi0JICB7Ci0JICAgIHJlZ2lzdGVyX2NoYXJzW2NdID0gYzsKLQkgIH0KLQlpZiAoaXN1cHBlciAoYykgfHwgaXNsb3dlciAoYykgfHwgaXNkaWdpdCAoYykpCi0JICBvcGVyYW5kX2NoYXJzW2NdID0gYzsKLQlpZiAoaXNkaWdpdCAoYykgfHwgYyA9PSAnLScpCi0JICBkaWdpdF9jaGFyc1tjXSA9IGM7Ci0JaWYgKGlzYWxwaGEgKGMpIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy4nIHx8IGlzZGlnaXQgKGMpKQotCSAgaWRlbnRpZmllcl9jaGFyc1tjXSA9IGM7Ci0JaWYgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKLQkgIHNwYWNlX2NoYXJzW2NdID0gYzsKLQlpZiAoYyA9PSAnXycpCi0JICBvcGNvZGVfY2hhcnNbY10gPSBjOwotICAgICAgfQotICAgIGZvciAocCA9IG9wZXJhbmRfc3BlY2lhbF9jaGFyczsgKnAgIT0gJ1wwJzsgcCsrKQotICAgICAgb3BlcmFuZF9jaGFyc1sodW5zaWduZWQgY2hhcikgKnBdID0gKnA7Ci0gIH0KLX0KLQotLyogQWRkcmVzcyBNb2RlIE9SIHZhbHVlcyAqLwotI2RlZmluZSBBTV9SZWdpc3RlciAgMHgwMDAwMDAwMAotI2RlZmluZSBBTV9EaXJlY3QgICAgMHgwMDIwMDAwMAotI2RlZmluZSBBTV9JbmRpcmVjdCAgMHgwMDQwMDAwMAotI2RlZmluZSBBTV9JbW1lZGlhdGUgMHgwMDYwMDAwMAotI2RlZmluZSBBTV9Ob3RSZXEgICAgMHhGRkZGRkZGRgotCi0vKiBQQyBSZWxhdGl2ZSBPUiB2YWx1ZXMgKi8KLSNkZWZpbmUgUENfUmVnaXN0ZXIgMHgwMDAwMDAwMAotI2RlZmluZSBQQ19SZWxhdGl2ZSAweDAyMDAwMDAwCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIG9wX3R5cGU7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIGludCByZXNvbHZlZDsKLSAgICAgIHVuc2lnbmVkIGFkZHJlc3M7Ci0gICAgICBjaGFyICpsYWJlbDsKLSAgICAgIGV4cHJlc3Npb25TIGRpcmVjdF9leHByOwotICAgIH0KLSAgZGlyZWN0OwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBtb2Q7Ci0gICAgICBpbnQgQVJudW07Ci0gICAgICB1bnNpZ25lZCBjaGFyIGRpc3A7Ci0gICAgfQotICBpbmRpcmVjdDsKLSAgc3RydWN0Ci0gICAgewotICAgICAgdW5zaWduZWQgb3Bjb2RlOwotICAgIH0KLSAgcmVnOwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBpbnQgcmVzb2x2ZWQ7Ci0gICAgICBpbnQgZGVjaW1hbF9mb3VuZDsKLSAgICAgIGZsb2F0IGZfbnVtYmVyOwotICAgICAgaW50IHNfbnVtYmVyOwotICAgICAgdW5zaWduZWQgaW50IHVfbnVtYmVyOwotICAgICAgY2hhciAqbGFiZWw7Ci0gICAgICBleHByZXNzaW9uUyBpbW1fZXhwcjsKLSAgICB9Ci0gIGltbWVkaWF0ZTsKLX0KLW9wZXJhbmQ7Ci0KLWludCB0aWMzMF9wYXJhbGxlbF9pbnNuIFBBUkFNUyAoKGNoYXIgKikpOwotb3BlcmFuZCAqdGljMzBfb3BlcmFuZCBQQVJBTVMgKChjaGFyICopKTsKLWNoYXIgKnRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbiBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOwotCi10ZW1wbGF0ZSAqb3Bjb2RlOwotCi1zdHJ1Y3QgdGljMzBfaW5zbgotICB7Ci0gICAgdGVtcGxhdGUgKnRtOwkJLyogVGVtcGxhdGUgb2YgY3VycmVudCBpbnN0cnVjdGlvbiAqLwotICAgIHVuc2lnbmVkIG9wY29kZTsJCS8qIEZpbmFsIG9wY29kZSAqLwotICAgIGludCBvcGVyYW5kczsJCS8qIE51bWJlciBvZiBnaXZlbiBvcGVyYW5kcyAqLwotICAgIC8qIFR5cGUgb2Ygb3BlcmFuZCBnaXZlbiBpbiBpbnN0cnVjdGlvbiAqLwotICAgIG9wZXJhbmQgKm9wZXJhbmRfdHlwZVtNQVhfT1BFUkFORFNdOwotICAgIHVuc2lnbmVkIGFkZHJlc3NpbmdfbW9kZTsJLyogRmluYWwgYWRkcmVzc2luZyBtb2RlIG9mIGluc3RydWN0aW9uICovCi0gIH07Ci0KLXN0cnVjdCB0aWMzMF9pbnNuIGluc247Ci1zdGF0aWMgaW50IGZvdW5kX3BhcmFsbGVsX2luc247Ci0KLXZvaWQKLW1kX2Fzc2VtYmxlIChsaW5lKQotICAgICBjaGFyICpsaW5lOwotewotICB0ZW1wbGF0ZSAqb3Bjb2RlOwotICBjaGFyICpjdXJyZW50X3Bvc247Ci0gIGNoYXIgKnRva2VuX3N0YXJ0OwotICBjaGFyIHNhdmVfY2hhcjsKLSAgaW50IGNvdW50OwotCi0gIGRlYnVnICgiSW4gbWRfYXNzZW1ibGUoKSB3aXRoIGFyZ3VtZW50ICVzXG4iLCBsaW5lKTsKLSAgbWVtc2V0ICgmaW5zbiwgJ1wwJywgc2l6ZW9mIChpbnNuKSk7Ci0gIGlmIChmb3VuZF9wYXJhbGxlbF9pbnNuKQotICAgIHsKLSAgICAgIGRlYnVnICgiTGluZSBpcyBzZWNvbmQgcGFydCBvZiBwYXJhbGxlbCBpbnN0cnVjdGlvblxuXG4iKTsKLSAgICAgIGZvdW5kX3BhcmFsbGVsX2luc24gPSAwOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKChjdXJyZW50X3Bvc24gPSB0aWMzMF9maW5kX3BhcmFsbGVsX2luc24gKGxpbmUsIGlucHV0X2xpbmVfcG9pbnRlciArIDEpKSA9PSBOVUxMKQotICAgIGN1cnJlbnRfcG9zbiA9IGxpbmU7Ci0gIGVsc2UKLSAgICBmb3VuZF9wYXJhbGxlbF9pbnNuID0gMTsKLSAgd2hpbGUgKGlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotICAgIGN1cnJlbnRfcG9zbisrOwotICB0b2tlbl9zdGFydCA9IGN1cnJlbnRfcG9zbjsKLSAgaWYgKCFpc19vcGNvZGVfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0gICAgewotICAgICAgYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gb3Bjb2RlIiwgb3V0cHV0X2ludmFsaWQgKCpjdXJyZW50X3Bvc24pKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qIENoZWNrIGlmIGluc3RydWN0aW9uIGlzIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb24gYnkgc2VlaW5nIGlmIHRoZSBmaXJzdAotICAgICBjaGFyYWN0ZXIgaXMgYSBxLiAqLwotICBpZiAoKnRva2VuX3N0YXJ0ID09ICdxJykKLSAgICB7Ci0gICAgICBpZiAodGljMzBfcGFyYWxsZWxfaW5zbiAodG9rZW5fc3RhcnQpKQotCXsKLQkgIGlmIChmb3VuZF9wYXJhbGxlbF9pbnNuKQotCSAgICBmcmVlICh0b2tlbl9zdGFydCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgd2hpbGUgKGlzX29wY29kZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLSAgICBjdXJyZW50X3Bvc24rKzsKLSAgewkJCQkvKiBGaW5kIGluc3RydWN0aW9uICovCi0gICAgc2F2ZV9jaGFyID0gKmN1cnJlbnRfcG9zbjsKLSAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKLSAgICBvcGNvZGUgPSAodGVtcGxhdGUgKikgaGFzaF9maW5kIChvcF9oYXNoLCB0b2tlbl9zdGFydCk7Ci0gICAgaWYgKG9wY29kZSkKLSAgICAgIHsKLQlkZWJ1ZyAoIkZvdW5kIGluc3RydWN0aW9uICVzXG4iLCBvcGNvZGUtPm5hbWUpOwotCWluc24udG0gPSBvcGNvZGU7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWRlYnVnICgiRGlkbid0IGZpbmQgaW5zblxuIik7Ci0JYXNfYmFkICgiVW5rbm93biBUTVMzMjBDMzAgaW5zdHJ1Y3Rpb246ICVzIiwgdG9rZW5fc3RhcnQpOwotCXJldHVybjsKLSAgICAgIH0KLSAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOwotICB9Ci0gIGlmICgqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKQotICAgIHsJCQkJLyogRmluZCBvcGVyYW5kcyAqLwotICAgICAgaW50IHBhcmVuX25vdF9iYWxhbmNlZDsKLSAgICAgIGludCBleHBlY3Rpbmdfb3BlcmFuZCA9IDA7Ci0gICAgICBpbnQgdGhpc19vcGVyYW5kOwotICAgICAgZG8KLQl7Ci0JICAvKiBza2lwIG9wdGlvbmFsIHdoaXRlIHNwYWNlIGJlZm9yZSBvcGVyYW5kICovCi0JICB3aGlsZSAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTikKLQkgICAgewotCSAgICAgIGlmICghaXNfc3BhY2VfY2hhciAoKmN1cnJlbnRfcG9zbikpCi0JCXsKLQkJICBhc19iYWQgKCJJbnZhbGlkIGNoYXJhY3RlciAlcyBiZWZvcmUgJXMgb3BlcmFuZCIsCi0JCQkgIG91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKLQkJCSAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgY3VycmVudF9wb3NuKys7Ci0JICAgIH0KLQkgIHRva2VuX3N0YXJ0ID0gY3VycmVudF9wb3NuOwkvKiBhZnRlciB3aGl0ZSBzcGFjZSAqLwotCSAgcGFyZW5fbm90X2JhbGFuY2VkID0gMDsKLQkgIHdoaWxlIChwYXJlbl9ub3RfYmFsYW5jZWQgfHwgKmN1cnJlbnRfcG9zbiAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSBFTkRfT0ZfSU5TTikKLQkJewotCQkgIGlmIChwYXJlbl9ub3RfYmFsYW5jZWQpCi0JCSAgICB7Ci0JCSAgICAgIGFzX2JhZCAoIlVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gJXMgb3BlcmFuZC4iLAotCQkJICAgICAgb3JkaW5hbF9uYW1lc1tpbnNuLm9wZXJhbmRzXSk7Ci0JCSAgICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICBicmVhazsJLyogd2UgYXJlIGRvbmUgKi8KLQkJfQotCSAgICAgIGVsc2UgaWYgKCFpc19vcGVyYW5kX2NoYXIgKCpjdXJyZW50X3Bvc24pICYmICFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSkKLQkJewotCQkgIGFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGluICVzIG9wZXJhbmQiLAotCQkJICBvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbiksCi0JCQkgIG9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09ICcoJykKLQkJKytwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JICAgICAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJyknKQotCQktLXBhcmVuX25vdF9iYWxhbmNlZDsKLQkgICAgICBjdXJyZW50X3Bvc24rKzsKLQkgICAgfQotCSAgaWYgKGN1cnJlbnRfcG9zbiAhPSB0b2tlbl9zdGFydCkKLQkgICAgewkJCS8qIHllcywgd2UndmUgcmVhZCBpbiBhbm90aGVyIG9wZXJhbmQgKi8KLQkgICAgICB0aGlzX29wZXJhbmQgPSBpbnNuLm9wZXJhbmRzKys7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZHMgPiBNQVhfT1BFUkFORFMpCi0JCXsKLQkJICBhc19iYWQgKCJTcHVyaW91cyBvcGVyYW5kczsgKCVkIG9wZXJhbmRzL2luc3RydWN0aW9uIG1heCkiLAotCQkJICBNQVhfT1BFUkFORFMpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIC8qIG5vdyBwYXJzZSBvcGVyYW5kIGFkZGluZyBpbmZvIHRvICdpbnNuJyBhcyB3ZSBnbyBhbG9uZyAqLwotCSAgICAgIHNhdmVfY2hhciA9ICpjdXJyZW50X3Bvc247Ci0JICAgICAgKmN1cnJlbnRfcG9zbiA9ICdcMCc7Ci0JICAgICAgaW5zbi5vcGVyYW5kX3R5cGVbdGhpc19vcGVyYW5kXSA9IHRpYzMwX29wZXJhbmQgKHRva2VuX3N0YXJ0KTsKLQkgICAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVt0aGlzX29wZXJhbmRdID09IE5VTEwpCi0JCXJldHVybjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGV4cGVjdGluZ19vcGVyYW5kKQotCQl7Ci0JCSAgYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGlmICgqY3VycmVudF9wb3NuID09ICcsJykKLQkJewotCQkgIGFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIik7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgIH0KLQkgIC8qIG5vdyAqY3VycmVudF9wb3NuIG11c3QgYmUgZWl0aGVyICcsJyBvciBFTkRfT0ZfSU5TTiAqLwotCSAgaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQotCSAgICB7Ci0JICAgICAgaWYgKCorK2N1cnJlbnRfcG9zbiA9PSBFTkRfT0ZfSU5TTikKLQkJewkJLyoganVzdCBza2lwIGl0LCBpZiBpdCdzIFxuIGNvbXBsYWluICovCi0JCSAgYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4cGVjdGluZ19vcGVyYW5kID0gMTsKLQkgICAgfQotCX0KLSAgICAgIHdoaWxlICgqY3VycmVudF9wb3NuICE9IEVORF9PRl9JTlNOKTsJLyogdW50aWwgd2UgZ2V0IGVuZCBvZiBpbnNuICovCi0gICAgfQotICBkZWJ1ZyAoIk51bWJlciBvZiBvcGVyYW5kcyBmb3VuZDogJWRcbiIsIGluc24ub3BlcmFuZHMpOwotICAvKiBDaGVjayB0aGF0IG51bWJlciBvZiBvcGVyYW5kcyBpcyBjb3JyZWN0ICovCi0gIGlmIChpbnNuLm9wZXJhbmRzICE9IGluc24udG0tPm9wZXJhbmRzKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgaW50IG51bW9wcyA9IGluc24udG0tPm9wZXJhbmRzOwotICAgICAgLyogSWYgb3BlcmFuZHMgYXJlIG5vdCB0aGUgc2FtZSwgdGhlbiBzZWUgaWYgYW55IG9mIHRoZSBvcGVyYW5kcyBhcmUgbm90Ci0gICAgICAgICByZXF1aXJlZC4gIFRoZW4gcmVjaGVjayB3aXRoIG51bWJlciBvZiBnaXZlbiBvcGVyYW5kcy4gIElmIHRoZXkgYXJlIHN0aWxsIG5vdAotICAgICAgICAgdGhlIHNhbWUsIHRoZW4gZ2l2ZSBhbiBlcnJvciwgb3RoZXJ3aXNlIGNhcnJ5IG9uLiAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IGluc24udG0tPm9wZXJhbmRzOyBpKyspCi0JaWYgKGluc24udG0tPm9wZXJhbmRfdHlwZXNbaV0gJiBOb3RSZXEpCi0JICBudW1vcHMtLTsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRzICE9IG51bW9wcykKLQl7Ci0JICBhc19iYWQgKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG9wZXJhbmRzIGdpdmVuIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9Ob3RSZXE7Ci0gIGZvciAoY291bnQgPSAwOyBjb3VudCA8IGluc24ub3BlcmFuZHM7IGNvdW50KyspCi0gICAgewotICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlW2NvdW50XS0+b3BfdHlwZSAmIGluc24udG0tPm9wZXJhbmRfdHlwZXNbY291bnRdKQotCXsKLQkgIGRlYnVnICgiT3BlcmFuZCAlZCBtYXRjaGVzXG4iLCBjb3VudCArIDEpOwotCSAgLyogSWYgaW5zdHJ1Y3Rpb24gaGFzIHR3byBvcGVyYW5kcyBhbmQgaGFzIGFuIEFkZHJlc3NNb2RlIG1vZGlmaWVyIHRoZW4gc2V0Ci0JICAgICBhZGRyZXNzaW5nIG1vZGUgdHlwZSBmb3IgaW5zdHJ1Y3Rpb24gKi8KLQkgIGlmIChpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gQWRkcmVzc01vZGUpCi0JICAgIHsKLQkgICAgICBpbnQgYWRkcl9pbnNuID0gMDsKLQkgICAgICAvKiBTdG9yZSBpbnN0cnVjdGlvbiB1c2VzIHRoZSBzZWNvbmQgb3BlcmFuZCBmb3IgdGhlIGFkZHJlc3MgbW9kZS4gKi8KLQkgICAgICBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMV0gJiAoSW5kaXJlY3QgfCBEaXJlY3QpKSA9PSAoSW5kaXJlY3QgfCBEaXJlY3QpKQotCQlhZGRyX2luc24gPSAxOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVthZGRyX2luc25dLT5vcF90eXBlICYgKEFsbFJlZykpCi0JCWluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fUmVnaXN0ZXI7Ci0JICAgICAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbYWRkcl9pbnNuXS0+b3BfdHlwZSAmIERpcmVjdCkKLQkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9EaXJlY3Q7Ci0JICAgICAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbYWRkcl9pbnNuXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCQlpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX0luZGlyZWN0OwotCSAgICAgIGVsc2UKLQkJaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbW1lZGlhdGU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfYmFkICgiVGhlICVzIG9wZXJhbmQgZG9lc24ndCBtYXRjaCIsIG9yZGluYWxfbmFtZXNbY291bnRdKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICAvKiBOb3cgc2V0IHRoZSBhZGRyZXNzaW5nIG1vZGUgZm9yIDMgb3BlcmFuZCBpbnN0cnVjdGlvbnMuICovCi0gIGlmICgoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSAmIG9wM1QxKSAmJiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1sxXSAmIG9wM1QyKSkKLSAgICB7Ci0gICAgICAvKiBTZXQgdGhlIGFkZHJlc3NpbmcgbW9kZSB0byB0aGUgdmFsdWVzIHVzZWQgZm9yIDIgb3BlcmFuZCBpbnN0cnVjdGlvbnMgaW4gdGhlCi0gICAgICAgICBHIGFkZHJlc3NpbmcgZmllbGQgb2YgdGhlIG9wY29kZS4gKi8KLSAgICAgIGNoYXIgKnA7Ci0gICAgICBzd2l0Y2ggKGluc24ub3BlcmFuZF90eXBlWzBdLT5vcF90eXBlKQotCXsKLQljYXNlIFJuOgotCWNhc2UgQVJuOgotCWNhc2UgRFBSZWc6Ci0JY2FzZSBPdGhlclJlZzoKLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCSAgICBpbnNuLmFkZHJlc3NpbmdfbW9kZSA9IEFNX1JlZ2lzdGVyOwotCSAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9EaXJlY3Q7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTaG91bGRuJ3QgbWFrZSBpdCB0byB0aGlzIHN0YWdlICovCi0JICAgICAgYXNfYmFkICgiSW5jb21wYXRpYmxlIGZpcnN0IGFuZCBzZWNvbmQgb3BlcmFuZHMgaW4gaW5zdHJ1Y3Rpb24iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgSW5kaXJlY3Q6Ci0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkgICAgaW5zbi5hZGRyZXNzaW5nX21vZGUgPSBBTV9JbmRpcmVjdDsKLQkgIGVsc2UgaWYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgIGluc24uYWRkcmVzc2luZ19tb2RlID0gQU1fSW1tZWRpYXRlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogU2hvdWxkbid0IG1ha2UgaXQgdG8gdGhpcyBzdGFnZSAqLwotCSAgICAgIGFzX2JhZCAoIkluY29tcGF0aWJsZSBmaXJzdCBhbmQgc2Vjb25kIG9wZXJhbmRzIGluIGluc3RydWN0aW9uIik7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICAvKiBOb3cgbWFrZSB1cCB0aGUgb3Bjb2RlIGZvciB0aGUgMyBvcGVyYW5kIGluc3RydWN0aW9ucy4gIEFzIGluIHBhcmFsbGVsCi0gICAgICAgICBpbnN0cnVjdGlvbnMsIHRoZXJlIHdpbGwgYmUgbm8gdW5yZXNvbHZlZCB2YWx1ZXMsIHNvIHRoZXkgY2FuIGJlIGZ1bGx5IGZvcm1lZAotICAgICAgICAgYW5kIGFkZGVkIHRvIHRoZSBmcmFnIHRhYmxlLiAqLwotICAgICAgaW5zbi5vcGNvZGUgPSBpbnNuLnRtLT5iYXNlX29wY29kZTsKLSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCXsKLQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JfQotICAgICAgZWxzZQotCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSk7Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQl7Ci0JICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCX0KLSAgICAgIGVsc2UKLQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUgPDwgOCk7Ci0gICAgICBpZiAoaW5zbi5vcGVyYW5kcyA9PSAzKQotCWluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsyXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0gICAgICBpbnNuLm9wY29kZSB8PSBpbnNuLmFkZHJlc3NpbmdfbW9kZTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKElOU05fU0laRSk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotICAgIH0KLSAgZWxzZQotICAgIHsJCQkJLyogTm90IGEgdGhyZWUgb3BlcmFuZCBpbnN0cnVjdGlvbiAqLwotICAgICAgY2hhciAqcDsKLSAgICAgIGludCBhbV9pbnNuID0gLTE7Ci0gICAgICBpbnNuLm9wY29kZSA9IGluc24udG0tPmJhc2Vfb3Bjb2RlOwotICAgICAgLyogQ3JlYXRlIGZyYWcgZm9yIGluc3RydWN0aW9uIC0gYWxsIGluc3RydWN0aW9ucyBhcmUgNCBieXRlcyBsb25nLiAqLwotICAgICAgcCA9IGZyYWdfbW9yZSAoSU5TTl9TSVpFKTsKLSAgICAgIGlmICgoaW5zbi5vcGVyYW5kcyA+IDApICYmIChpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gQWRkcmVzc01vZGUpKQotCXsKLQkgIGluc24ub3Bjb2RlIHw9IGluc24uYWRkcmVzc2luZ19tb2RlOwotCSAgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX0luZGlyZWN0KQotCSAgICB7Ci0JICAgICAgLyogRGV0ZXJtaW5lIHdoaWNoIG9wZXJhbmQgZ2l2ZXMgdGhlIGFkZHJlc3NpbmcgbW9kZSAqLwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCQlhbV9pbnNuID0gMDsKLQkgICAgICBpZiAoKGluc24ub3BlcmFuZHMgPiAxKSAmJiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkpCi0JCWFtX2luc24gPSAxOwotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+aW5kaXJlY3QuZGlzcCk7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbIWFtX2luc25dLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCSAgICB9Ci0JICBlbHNlIGlmIChpbnNuLmFkZHJlc3NpbmdfbW9kZSA9PSBBTV9SZWdpc3RlcikKLQkgICAgewotCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSk7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluc24uYWRkcmVzc2luZ19tb2RlID09IEFNX0RpcmVjdCkKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+b3BfdHlwZSAmIERpcmVjdCkKLQkJYW1faW5zbiA9IDA7Ci0JICAgICAgaWYgKChpbnNuLm9wZXJhbmRzID4gMSkgJiYgKGluc24ub3BlcmFuZF90eXBlWzFdLT5vcF90eXBlICYgRGlyZWN0KSkKLQkJYW1faW5zbiA9IDE7Ci0JICAgICAgaWYgKGluc24ub3BlcmFuZHMgPiAxKQotCQlpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbIWFtX2luc25dLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbYW1faW5zbl0tPmRpcmVjdC5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgLyogUmVzb2x2ZWQgdmFsdWVzIGNhbiBiZSBwbGFjZWQgc3RyYWlnaHQgaW50byBpbnN0cnVjdGlvbiB3b3JkLCBhbmQgb3V0cHV0ICovCi0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlW2FtX2luc25dLT5kaXJlY3QuYWRkcmVzcyAmIDB4MDAwMEZGRkYpOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsJCS8qIFVucmVzb2x2ZWQgZGlyZWN0IGFkZHJlc3NpbmcgbW9kZSBpbnN0cnVjdGlvbiAqLwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgZml4X25ld19leHAgKGZyYWdfbm93LCBwICsgMiAtIChmcmFnX25vdy0+ZnJfbGl0ZXJhbCksIDIsICZpbnNuLm9wZXJhbmRfdHlwZVthbV9pbnNuXS0+ZGlyZWN0LmRpcmVjdF9leHByLCAwLCAwKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChpbnNuLmFkZHJlc3NpbmdfbW9kZSA9PSBBTV9JbW1lZGlhdGUpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgY2hhciAqa2VlcGxvYzsKLQkJICBpbnQgc2l6ZTsKLQkJICBpZiAoaW5zbi5vcGVyYW5kcyA+IDEpCi0JCSAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCQkgIHN3aXRjaCAoaW5zbi50bS0+aW1tX2FyZ190eXBlKQotCQkgICAgewotCQkgICAgY2FzZSBJbW1fRmxvYXQ6Ci0JCSAgICAgIGRlYnVnICgiRmxvYXRpbmcgcG9pbnQgZmlyc3Qgb3BlcmFuZFxuIik7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICAgIGtlZXBsb2MgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUubGFiZWw7Ci0JCSAgICAgIGlmIChtZF9hdG9mICgnZicsIHAgKyAyLCAmc2l6ZSkgIT0gMCkKLQkJCXsKLQkJCSAgYXNfYmFkICgiaW52YWxpZCBzaG9ydCBmb3JtIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBvcGVyYW5kIik7Ci0JCQkgIHJldHVybjsKLQkJCX0KLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0ga2VlcGxvYzsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIEltbV9VSW50OgotCQkgICAgICBkZWJ1ZyAoIlVuc2lnbmVkIGludCBmaXJzdCBvcGVyYW5kXG4iKTsKLQkJICAgICAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuZGVjaW1hbF9mb3VuZCkKLQkJCWFzX3dhcm4gKCJyb3VuZGluZyBkb3duIGZpcnN0IG9wZXJhbmQgZmxvYXQgdG8gdW5zaWduZWQgaW50Iik7Ci0JCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyID4gMHhGRkZGKQotCQkJYXNfd2FybiAoIm9ubHkgbG93ZXIgMTYtYml0cyBvZiBmaXJzdCBvcGVyYW5kIGFyZSB1c2VkIik7Ci0JCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyICYgMHgwMDAwRkZGRkwpOwotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgSW1tX1NJbnQ6Ci0JCSAgICAgIGRlYnVnICgiSW50IGZpcnN0IG9wZXJhbmRcbiIpOwotCQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kKQotCQkJYXNfd2FybiAoInJvdW5kaW5nIGRvd24gZmlyc3Qgb3BlcmFuZCBmbG9hdCB0byBzaWduZWQgaW50Iik7Ci0JCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyIDwgLTMyNzY4IHx8Ci0JCQkgIGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPiAzMjc2NykKLQkJCXsKLQkJCSAgYXNfYmFkICgiZmlyc3Qgb3BlcmFuZCBpcyB0b28gbGFyZ2UgZm9yIDE2LWJpdCBzaWduZWQgaW50Iik7Ci0JCQkgIHJldHVybjsKLQkJCX0KLQkJICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgJiAweDAwMDBGRkZGTCk7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiBVbnJlc29sdmVkIGltbWVkaWF0ZSBsYWJlbCAqLwotCQkgIGlmIChpbnNuLm9wZXJhbmRzID4gMSkKLQkJICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMiwgJmluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDAsIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gUENSZWwpCi0JewotCSAgLyogQ29uZGl0aW9uYWwgQnJhbmNoIGFuZCBDYWxsIGluc3RydWN0aW9ucyAqLwotCSAgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgKEFsbFJlZyB8IERpc3ApKSA9PSAoQWxsUmVnIHwgRGlzcCkpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiAoQWxsUmVnKSkKLQkJewotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+cmVnLm9wY29kZSk7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVnaXN0ZXI7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGluc24ub3Bjb2RlIHw9IFBDX1JlbGF0aXZlOwotCQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JCSAgICB7Ci0JCSAgICAgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnNfbnVtYmVyICYgMHgwMDAwRkZGRik7Ci0JCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMiwgJmluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDEsIDApOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgQVJuKSA9PSBBUm4pCi0JICAgIHsKLQkgICAgICAvKiBEZWNyZW1lbnQgYW5kIEJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLQkgICAgICBpbnNuLm9wY29kZSB8PSAoKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlIC0gMHgwOCkgPDwgMjIpOwotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+b3BfdHlwZSAmIChBbGxSZWcpKQotCQl7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzFdLT5yZWcub3Bjb2RlKTsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWdpc3RlcjsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMV0tPmltbWVkaWF0ZS5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuZGVjaW1hbF9mb3VuZCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiZmlyc3Qgb3BlcmFuZCBpcyBmbG9hdGluZyBwb2ludCIpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuc19udW1iZXIgPCAtMzI3NjggfHwKLQkJICAgICAgaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5zX251bWJlciA+IDMyNzY3KQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJmaXJzdCBvcGVyYW5kIGlzIHRvbyBsYXJnZSBmb3IgMTYtYml0IHNpZ25lZCBpbnQiKTsKLQkJICAgICAgcmV0dXJuOwotCQkgICAgfQotCQkgIGluc24ub3Bjb2RlIHw9IChpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW1tZWRpYXRlLnNfbnVtYmVyKTsKLQkJICBpbnNuLm9wY29kZSB8PSBQQ19SZWxhdGl2ZTsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5zbi5vcGNvZGUgfD0gUENfUmVsYXRpdmU7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAyIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDIsICZpbnNuLm9wZXJhbmRfdHlwZVsxXS0+aW1tZWRpYXRlLmltbV9leHByLCAxLCAwKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXSA9PSBJVmVjdG9yKQotCXsKLQkgIC8qIFRyYXAgaW5zdHJ1Y3Rpb25zICovCi0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBJVmVjdG9yKQotCSAgICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlcik7Ci0JICBlbHNlCi0JICAgIHsJCQkvKiBTaG91bGRuJ3QgZ2V0IGhlcmUgKi8KLQkgICAgICBhc19iYWQgKCJpbnRlcnJ1cHQgdmVjdG9yIGZvciB0cmFwIGluc3RydWN0aW9uIG91dCBvZiByYW5nZSIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gU3RhY2tPcCB8fCBpbnNuLnRtLT5vcGNvZGVfbW9kaWZpZXIgPT0gUm90YXRlKQotCXsKLQkgIC8qIFB1c2gsIFBvcCBhbmQgUm90YXRlIGluc3RydWN0aW9ucyAqLwotCSAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JfQotICAgICAgZWxzZSBpZiAoKGluc24udG0tPm9wZXJhbmRfdHlwZXNbMF0gJiAoQWJzMjQgfCBEaXJlY3QpKSA9PSAoQWJzMjQgfCBEaXJlY3QpKQotCXsKLQkgIC8qIExEUCBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSB0ZXN0ZWQgZm9yIGJlZm9yZSB0aGUgbmV4dCBzZWN0aW9uICovCi0JICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPm9wX3R5cGUgJiBEaXJlY3QpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmRpcmVjdC5yZXNvbHZlZCA9PSAxKQotCQl7Ci0JCSAgLyogRGlyZWN0IGFkZHJlc3NpbmcgdXNlcyBsb3dlciA4IGJpdHMgb2YgZGlyZWN0IGFkZHJlc3MgKi8KLQkJICBpbnNuLm9wY29kZSB8PSAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmRpcmVjdC5hZGRyZXNzICYgMHgwMEZGMDAwMCkgPj4gMTY7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZpeFMgKmZpeDsKLQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCQkgIGZpeCA9IGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDMgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAxLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmRpcmVjdC5kaXJlY3RfZXhwciwgMCwgMCk7Ci0JCSAgLyogRW5zdXJlIHRoYXQgdGhlIGFzc2VtYmxlciBkb2Vzbid0IGNvbXBsYWluIGFib3V0IGZpdHRpbmcgYSAyNC1iaXQKLQkJICAgICBhZGRyZXNzIGludG8gOCBiaXRzLiAqLwotCQkgIGZpeC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JCXsKLQkJICAvKiBJbW1lZGlhdGUgYWRkcmVzc2luZyB1c2VzIHVwcGVyIDggYml0cyBvZiBhZGRyZXNzICovCi0JCSAgaWYgKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgPiAweDAwRkZGRkZGKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKCJMRFAgaW5zdHJ1Y3Rpb24gbmVlZHMgYSAyNC1iaXQgb3BlcmFuZCIpOwotCQkgICAgICByZXR1cm47Ci0JCSAgICB9Ci0JCSAgaW5zbi5vcGNvZGUgfD0gKChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnVfbnVtYmVyICYgMHgwMEZGMDAwMCkgPj4gMTYpOwotCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmaXhTICpmaXg7Ci0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQkJICBmaXggPSBmaXhfbmV3X2V4cCAoZnJhZ19ub3csIHAgKyAzIC0gKGZyYWdfbm93LT5mcl9saXRlcmFsKSwgMSwgJmluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUuaW1tX2V4cHIsIDAsIDApOwotCQkgIGZpeC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgKEltbTI0KSkKLQl7Ci0JICAvKiBVbmNvbmRpdGlvbmFsIEJyYW5jaCBhbmQgQ2FsbCBpbnN0cnVjdGlvbnMgKi8KLQkgIGlmIChpbnNuLm9wZXJhbmRfdHlwZVswXS0+aW1tZWRpYXRlLnJlc29sdmVkID09IDEpCi0JICAgIHsKLQkgICAgICBpZiAoaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS51X251bWJlciA+IDB4MDBGRkZGRkYpCi0JCWFzX3dhcm4gKCJmaXJzdCBvcGVyYW5kIGlzIHRvbyBsYXJnZSBmb3IgYSAyNC1iaXQgZGlzcGxhY2VtZW50Iik7Ci0JICAgICAgaW5zbi5vcGNvZGUgfD0gKGluc24ub3BlcmFuZF90eXBlWzBdLT5pbW1lZGlhdGUudV9udW1iZXIgJiAweDAwRkZGRkZGKTsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCSAgICAgIGZpeF9uZXdfZXhwIChmcmFnX25vdywgcCArIDEgLSAoZnJhZ19ub3ctPmZyX2xpdGVyYWwpLCAzLCAmaW5zbi5vcGVyYW5kX3R5cGVbMF0tPmltbWVkaWF0ZS5pbW1fZXhwciwgMCwgMCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLnRtLT5vcGVyYW5kX3R5cGVzWzBdICYgTm90UmVxKQotCXsKLQkgIC8qIENoZWNrIGZvciBOT1AgaW5zdHJ1Y3Rpb24gd2l0aG91dCBhcmd1bWVudHMuICovCi0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIGluc24ub3Bjb2RlLCBJTlNOX1NJWkUpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluc24udG0tPm9wZXJhbmRzID09IDApCi0JewotCSAgLyogQ2hlY2sgZm9yIGluc3RydWN0aW9ucyB3aXRob3V0IG9wZXJhbmRzLiAqLwotCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBpbnNuLm9wY29kZSwgSU5TTl9TSVpFKTsKLQl9Ci0gICAgfQotICBkZWJ1ZyAoIkFkZHJlc3NpbmcgbW9kZTogJTA4WFxuIiwgaW5zbi5hZGRyZXNzaW5nX21vZGUpOwotICB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGluc24ub3BlcmFuZHM7IGkrKykKLSAgICAgIHsKLQlpZiAoaW5zbi5vcGVyYW5kX3R5cGVbaV0tPmltbWVkaWF0ZS5sYWJlbCkKLQkgIGZyZWUgKGluc24ub3BlcmFuZF90eXBlW2ldLT5pbW1lZGlhdGUubGFiZWwpOwotCWZyZWUgKGluc24ub3BlcmFuZF90eXBlW2ldKTsKLSAgICAgIH0KLSAgfQotICBkZWJ1ZyAoIkZpbmFsIG9wY29kZTogJTA4WFxuIiwgaW5zbi5vcGNvZGUpOwotICBkZWJ1ZyAoIlxuIik7Ci19Ci0KLXN0cnVjdCB0aWMzMF9wYXJfaW5zbgotewotICBwYXJ0ZW1wbGF0ZSAqdG07CQkvKiBUZW1wbGF0ZSBvZiBjdXJyZW50IHBhcmFsbGVsIGluc3RydWN0aW9uICovCi0gIGludCBvcGVyYW5kc1syXTsJCS8qIE51bWJlciBvZiBnaXZlbiBvcGVyYW5kcyBmb3IgZWFjaCBpbnNuICovCi0gIC8qIFR5cGUgb2Ygb3BlcmFuZCBnaXZlbiBpbiBpbnN0cnVjdGlvbiAqLwotICBvcGVyYW5kICpvcGVyYW5kX3R5cGVbMl1bTUFYX09QRVJBTkRTXTsKLSAgaW50IHN3YXBfb3BlcmFuZHM7CQkvKiBXaGV0aGVyIHRvIHN3YXAgb3BlcmFuZHMgYXJvdW5kLiAqLwotICB1bnNpZ25lZCBwX2ZpZWxkOwkJLyogVmFsdWUgb2YgcCBmaWVsZCBpbiBtdWx0aXBseSBhZGQvc3ViIGluc3RydWN0aW9ucyAqLwotICB1bnNpZ25lZCBvcGNvZGU7CQkvKiBGaW5hbCBvcGNvZGUgKi8KLX07Ci0KLXN0cnVjdCB0aWMzMF9wYXJfaW5zbiBwX2luc247Ci0KLWludAotdGljMzBfcGFyYWxsZWxfaW5zbiAoY2hhciAqdG9rZW4pCi17Ci0gIHN0YXRpYyBwYXJ0ZW1wbGF0ZSAqcF9vcGNvZGU7Ci0gIGNoYXIgKmN1cnJlbnRfcG9zbiA9IHRva2VuOwotICBjaGFyICp0b2tlbl9zdGFydDsKLSAgY2hhciBzYXZlX2NoYXI7Ci0KLSAgZGVidWcgKCJJbiB0aWMzMF9wYXJhbGxlbF9pbnNuIHdpdGggJXNcbiIsIHRva2VuKTsKLSAgbWVtc2V0ICgmcF9pbnNuLCAnXDAnLCBzaXplb2YgKHBfaW5zbikpOwotICB3aGlsZSAoaXNfb3Bjb2RlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotICAgIGN1cnJlbnRfcG9zbisrOwotICB7CQkJCS8qIEZpbmQgaW5zdHJ1Y3Rpb24gKi8KLSAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOwotICAgICpjdXJyZW50X3Bvc24gPSAnXDAnOwotICAgIHBfb3Bjb2RlID0gKHBhcnRlbXBsYXRlICopIGhhc2hfZmluZCAocGFyb3BfaGFzaCwgdG9rZW4pOwotICAgIGlmIChwX29wY29kZSkKLSAgICAgIHsKLQlkZWJ1ZyAoIkZvdW5kIGluc3RydWN0aW9uICVzXG4iLCBwX29wY29kZS0+bmFtZSk7Ci0JcF9pbnNuLnRtID0gcF9vcGNvZGU7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWNoYXIgZmlyc3Rfb3Bjb2RlWzZdID0KLQl7MH07Ci0JY2hhciBzZWNvbmRfb3Bjb2RlWzZdID0KLQl7MH07Ci0JaW50IGk7Ci0JaW50IGN1cnJlbnRfb3Bjb2RlID0gLTE7Ci0JaW50IGNoYXJfcHRyID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4gKHRva2VuKTsgaSsrKQotCSAgewotCSAgICBjaGFyIGNoID0gKih0b2tlbiArIGkpOwotCSAgICBpZiAoY2ggPT0gJ18nICYmIGN1cnJlbnRfb3Bjb2RlID09IC0xKQotCSAgICAgIHsKLQkJY3VycmVudF9vcGNvZGUgPSAwOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIGlmIChjaCA9PSAnXycgJiYgY3VycmVudF9vcGNvZGUgPT0gMCkKLQkgICAgICB7Ci0JCWN1cnJlbnRfb3Bjb2RlID0gMTsKLQkJY2hhcl9wdHIgPSAwOwotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIHN3aXRjaCAoY3VycmVudF9vcGNvZGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgMDoKLQkJZmlyc3Rfb3Bjb2RlW2NoYXJfcHRyKytdID0gY2g7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgMToKLQkJc2Vjb25kX29wY29kZVtjaGFyX3B0cisrXSA9IGNoOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JZGVidWcgKCJmaXJzdF9vcGNvZGUgPSAlc1xuIiwgZmlyc3Rfb3Bjb2RlKTsKLQlkZWJ1ZyAoInNlY29uZF9vcGNvZGUgPSAlc1xuIiwgc2Vjb25kX29wY29kZSk7Ci0Jc3ByaW50ZiAodG9rZW4sICJxXyVzXyVzIiwgc2Vjb25kX29wY29kZSwgZmlyc3Rfb3Bjb2RlKTsKLQlwX29wY29kZSA9IChwYXJ0ZW1wbGF0ZSAqKSBoYXNoX2ZpbmQgKHBhcm9wX2hhc2gsIHRva2VuKTsKLQlpZiAocF9vcGNvZGUpCi0JICB7Ci0JICAgIGRlYnVnICgiRm91bmQgaW5zdHJ1Y3Rpb24gJXNcbiIsIHBfb3Bjb2RlLT5uYW1lKTsKLQkgICAgcF9pbnNuLnRtID0gcF9vcGNvZGU7Ci0JICAgIHBfaW5zbi5zd2FwX29wZXJhbmRzID0gMTsKLQkgIH0KLQllbHNlCi0JICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAqY3VycmVudF9wb3NuID0gc2F2ZV9jaGFyOwotICB9Ci0gIHsJCQkJLyogRmluZCBvcGVyYW5kcyAqLwotICAgIGludCBwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0gICAgaW50IGV4cGVjdGluZ19vcGVyYW5kID0gMDsKLSAgICBpbnQgZm91bmRfc2VwYXJhdG9yID0gMDsKLSAgICBkbwotICAgICAgewotCS8qIHNraXAgb3B0aW9uYWwgd2hpdGUgc3BhY2UgYmVmb3JlIG9wZXJhbmQgKi8KLQl3aGlsZSAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTikKLQkgIHsKLQkgICAgaWYgKCFpc19zcGFjZV9jaGFyICgqY3VycmVudF9wb3NuKSAmJiAqY3VycmVudF9wb3NuICE9IFBBUkFMTEVMX1NFUEFSQVRPUikKLQkgICAgICB7Ci0JCWFzX2JhZCAoIkludmFsaWQgY2hhcmFjdGVyICVzIGJlZm9yZSAlcyBvcGVyYW5kIiwKLQkJCW91dHB1dF9pbnZhbGlkICgqY3VycmVudF9wb3NuKSwKLQkJCW9yZGluYWxfbmFtZXNbaW5zbi5vcGVyYW5kc10pOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09IFBBUkFMTEVMX1NFUEFSQVRPUikKLQkgICAgICBmb3VuZF9zZXBhcmF0b3IgPSAxOwotCSAgICBjdXJyZW50X3Bvc24rKzsKLQkgIH0KLQl0b2tlbl9zdGFydCA9IGN1cnJlbnRfcG9zbjsJLyogYWZ0ZXIgd2hpdGUgc3BhY2UgKi8KLQlwYXJlbl9ub3RfYmFsYW5jZWQgPSAwOwotCXdoaWxlIChwYXJlbl9ub3RfYmFsYW5jZWQgfHwgKmN1cnJlbnRfcG9zbiAhPSAnLCcpCi0JICB7Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQotCSAgICAgIHsKLQkJaWYgKHBhcmVuX25vdF9iYWxhbmNlZCkKLQkJICB7Ci0JCSAgICBhc19iYWQgKCJVbmJhbGFuY2VkIHBhcmVudGhlc2lzIGluICVzIG9wZXJhbmQuIiwKLQkJCSAgICBvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJICAgIHJldHVybiAxOwotCQkgIH0KLQkJZWxzZQotCQkgIGJyZWFrOwkvKiB3ZSBhcmUgZG9uZSAqLwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoKmN1cnJlbnRfcG9zbiA9PSBQQVJBTExFTF9TRVBBUkFUT1IpCi0JICAgICAgewotCQl3aGlsZSAoaXNfc3BhY2VfY2hhciAoKihjdXJyZW50X3Bvc24gLSAxKSkpCi0JCSAgY3VycmVudF9wb3NuLS07Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoIWlzX29wZXJhbmRfY2hhciAoKmN1cnJlbnRfcG9zbikgJiYgIWlzX3NwYWNlX2NoYXIgKCpjdXJyZW50X3Bvc24pKQotCSAgICAgIHsKLQkJYXNfYmFkICgiSW52YWxpZCBjaGFyYWN0ZXIgJXMgaW4gJXMgb3BlcmFuZCIsCi0JCQlvdXRwdXRfaW52YWxpZCAoKmN1cnJlbnRfcG9zbiksCi0JCQlvcmRpbmFsX25hbWVzW2luc24ub3BlcmFuZHNdKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnKCcpCi0JICAgICAgKytwYXJlbl9ub3RfYmFsYW5jZWQ7Ci0JICAgIGlmICgqY3VycmVudF9wb3NuID09ICcpJykKLQkgICAgICAtLXBhcmVuX25vdF9iYWxhbmNlZDsKLQkgICAgY3VycmVudF9wb3NuKys7Ci0JICB9Ci0JaWYgKGN1cnJlbnRfcG9zbiAhPSB0b2tlbl9zdGFydCkKLQkgIHsJCQkvKiB5ZXMsIHdlJ3ZlIHJlYWQgaW4gYW5vdGhlciBvcGVyYW5kICovCi0JICAgIHBfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdKys7Ci0JICAgIGlmIChwX2luc24ub3BlcmFuZHNbZm91bmRfc2VwYXJhdG9yXSA+IE1BWF9PUEVSQU5EUykKLQkgICAgICB7Ci0JCWFzX2JhZCAoIlNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIsCi0JCQlNQVhfT1BFUkFORFMpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIC8qIG5vdyBwYXJzZSBvcGVyYW5kIGFkZGluZyBpbmZvIHRvICdpbnNuJyBhcyB3ZSBnbyBhbG9uZyAqLwotCSAgICBzYXZlX2NoYXIgPSAqY3VycmVudF9wb3NuOwotCSAgICAqY3VycmVudF9wb3NuID0gJ1wwJzsKLQkgICAgcF9pbnNuLm9wZXJhbmRfdHlwZVtmb3VuZF9zZXBhcmF0b3JdW3BfaW5zbi5vcGVyYW5kc1tmb3VuZF9zZXBhcmF0b3JdIC0gMV0gPQotCSAgICAgIHRpYzMwX29wZXJhbmQgKHRva2VuX3N0YXJ0KTsKLQkgICAgKmN1cnJlbnRfcG9zbiA9IHNhdmVfY2hhcjsKLQkgICAgaWYgKCFwX2luc24ub3BlcmFuZF90eXBlW2ZvdW5kX3NlcGFyYXRvcl1bcF9pbnNuLm9wZXJhbmRzW2ZvdW5kX3NlcGFyYXRvcl0gLSAxXSkKLQkgICAgICByZXR1cm4gMTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmIChleHBlY3Rpbmdfb3BlcmFuZCkKLQkgICAgICB7Ci0JCWFzX2JhZCAoIkV4cGVjdGluZyBvcGVyYW5kIGFmdGVyICcsJzsgZ290IG5vdGhpbmciKTsKLQkJcmV0dXJuIDE7Ci0JICAgICAgfQotCSAgICBpZiAoKmN1cnJlbnRfcG9zbiA9PSAnLCcpCi0JICAgICAgewotCQlhc19iYWQgKCJFeHBlY3Rpbmcgb3BlcmFuZCBiZWZvcmUgJywnOyBnb3Qgbm90aGluZyIpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICB9Ci0JLyogbm93ICpjdXJyZW50X3Bvc24gbXVzdCBiZSBlaXRoZXIgJywnIG9yIEVORF9PRl9JTlNOICovCi0JaWYgKCpjdXJyZW50X3Bvc24gPT0gJywnKQotCSAgewotCSAgICBpZiAoKisrY3VycmVudF9wb3NuID09IEVORF9PRl9JTlNOKQotCSAgICAgIHsJCQkvKiBqdXN0IHNraXAgaXQsIGlmIGl0J3MgXG4gY29tcGxhaW4gKi8KLQkJYXNfYmFkICgiRXhwZWN0aW5nIG9wZXJhbmQgYWZ0ZXIgJywnOyBnb3Qgbm90aGluZyIpOwotCQlyZXR1cm4gMTsKLQkgICAgICB9Ci0JICAgIGV4cGVjdGluZ19vcGVyYW5kID0gMTsKLQkgIH0KLSAgICAgIH0KLSAgICB3aGlsZSAoKmN1cnJlbnRfcG9zbiAhPSBFTkRfT0ZfSU5TTik7CS8qIHVudGlsIHdlIGdldCBlbmQgb2YgaW5zbiAqLwotICB9Ci0gIGlmIChwX2luc24uc3dhcF9vcGVyYW5kcykKLSAgICB7Ci0gICAgICBpbnQgdGVtcF9udW0sIGk7Ci0gICAgICBvcGVyYW5kICp0ZW1wX29wOwotCi0gICAgICB0ZW1wX251bSA9IHBfaW5zbi5vcGVyYW5kc1swXTsKLSAgICAgIHBfaW5zbi5vcGVyYW5kc1swXSA9IHBfaW5zbi5vcGVyYW5kc1sxXTsKLSAgICAgIHBfaW5zbi5vcGVyYW5kc1sxXSA9IHRlbXBfbnVtOwotICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9PUEVSQU5EUzsgaSsrKQotCXsKLQkgIHRlbXBfb3AgPSBwX2luc24ub3BlcmFuZF90eXBlWzBdW2ldOwotCSAgcF9pbnNuLm9wZXJhbmRfdHlwZVswXVtpXSA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1baV07Ci0JICBwX2luc24ub3BlcmFuZF90eXBlWzFdW2ldID0gdGVtcF9vcDsKLQl9Ci0gICAgfQotICBpZiAocF9pbnNuLm9wZXJhbmRzWzBdICE9IHBfaW5zbi50bS0+b3BlcmFuZHNfMSkKLSAgICB7Ci0gICAgICBhc19iYWQgKCJpbmNvcnJlY3QgbnVtYmVyIG9mIG9wZXJhbmRzIGdpdmVuIGluIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAocF9pbnNuLm9wZXJhbmRzWzFdICE9IHBfaW5zbi50bS0+b3BlcmFuZHNfMikKLSAgICB7Ci0gICAgICBhc19iYWQgKCJpbmNvcnJlY3QgbnVtYmVyIG9mIG9wZXJhbmRzIGdpdmVuIGluIHRoZSBzZWNvbmQgaW5zdHJ1Y3Rpb24iKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgZGVidWcgKCJOdW1iZXIgb2Ygb3BlcmFuZHMgaW4gZmlyc3QgaW5zbjogJWRcbiIsIHBfaW5zbi5vcGVyYW5kc1swXSk7Ci0gIGRlYnVnICgiTnVtYmVyIG9mIG9wZXJhbmRzIGluIHNlY29uZCBpbnNuOiAlZFxuIiwgcF9pbnNuLm9wZXJhbmRzWzFdKTsKLSAgewkJCQkvKiBOb3cgY2hlY2sgaWYgb3BlcmFuZHMgYXJlIGNvcnJlY3QgKi8KLSAgICBpbnQgY291bnQ7Ci0gICAgaW50IG51bV9ybiA9IDA7Ci0gICAgaW50IG51bV9pbmQgPSAwOwotICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IDI7IGNvdW50KyspCi0gICAgICB7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IHBfaW5zbi5vcGVyYW5kc1tjb3VudF07IGkrKykKLQkgIHsKLQkgICAgaWYgKChwX2luc24ub3BlcmFuZF90eXBlW2NvdW50XVtpXS0+b3BfdHlwZSAmCi0JCSBwX2luc24udG0tPm9wZXJhbmRfdHlwZXNbY291bnRdW2ldKSA9PSAwKQotCSAgICAgIHsKLQkJYXNfYmFkICgiJXMgaW5zdHJ1Y3Rpb24sIG9wZXJhbmQgJWQgZG9lc24ndCBtYXRjaCIsIG9yZGluYWxfbmFtZXNbY291bnRdLCBpICsgMSk7Ci0JCXJldHVybiAxOwotCSAgICAgIH0KLQkgICAgLyogR2V0IG51bWJlciBvZiBSIHJlZ2lzdGVyIGFuZCBpbmRpcmVjdCByZWZlcmVuY2UgY29udGFpbmVkIHdpdGhpbiB0aGUgZmlyc3QKLQkgICAgICAgdHdvIG9wZXJhbmRzIG9mIGVhY2ggaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgbXVsdGlwbHkKLQkgICAgICAgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIHdoaWNoIHJlcXVpcmUgdHdvIFIgcmVnaXN0ZXJzIGFuZCB0d28gaW5kaXJlY3QKLQkgICAgICAgcmVmZXJlbmNlcywgYnV0IG5vdCBpbiBhbnkgcGFydGljdWxhciBwbGFjZS4gKi8KLQkgICAgaWYgKChwX2luc24ub3BlcmFuZF90eXBlW2NvdW50XVtpXS0+b3BfdHlwZSAmIFJuKSAmJiBpIDwgMikKLQkgICAgICBudW1fcm4rKzsKLQkgICAgZWxzZSBpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbY291bnRdW2ldLT5vcF90eXBlICYgSW5kaXJlY3QpICYmIGkgPCAyKQotCSAgICAgIG51bV9pbmQrKzsKLQkgIH0KLSAgICAgIH0KLSAgICBpZiAoKHBfaW5zbi50bS0+b3BlcmFuZF90eXBlc1swXVswXSAmIChJbmRpcmVjdCB8IFJuKSkgPT0gKEluZGlyZWN0IHwgUm4pKQotICAgICAgewotCS8qIENoZWNrIGZvciB0aGUgbXVsdGlwbHkgaW5zdHJ1Y3Rpb25zICovCi0JaWYgKG51bV9ybiAhPSAyKQotCSAgewotCSAgICBhc19iYWQgKCJpbmNvcnJlY3QgZm9ybWF0IGZvciBtdWx0aXBseSBwYXJhbGxlbCBpbnN0cnVjdGlvbiIpOwotCSAgICByZXR1cm4gMTsKLQkgIH0KLQlpZiAobnVtX2luZCAhPSAyKQotCSAgewkJCS8qIFNob3VsZG4ndCBnZXQgaGVyZSAqLwotCSAgICBhc19iYWQgKCJpbmNvcnJlY3QgZm9ybWF0IGZvciBtdWx0aXBseSBwYXJhbGxlbCBpbnN0cnVjdGlvbiIpOwotCSAgICByZXR1cm4gMTsKLQkgIH0KLQlpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgIT0gMHgwMCkgJiYKLQkgICAgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgIT0gMHgwMSkpCi0JICB7Ci0JICAgIGFzX2JhZCAoImRlc3RpbmF0aW9uIGZvciBtdWx0aXBseSBjYW4gb25seSBiZSBSMCBvciBSMSIpOwotCSAgICByZXR1cm4gMTsKLQkgIH0KLQlpZiAoKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMl0tPnJlZy5vcGNvZGUgIT0gMHgwMikgJiYKLQkgICAgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMl0tPnJlZy5vcGNvZGUgIT0gMHgwMykpCi0JICB7Ci0JICAgIGFzX2JhZCAoImRlc3RpbmF0aW9uIGZvciBhZGQvc3VidHJhY3QgY2FuIG9ubHkgYmUgUjIgb3IgUjMiKTsKLQkgICAgcmV0dXJuIDE7Ci0JICB9Ci0JLyogTm93IGRldGVybWluZSB0aGUgUCBmaWVsZCBmb3IgdGhlIGluc3RydWN0aW9uICovCi0JaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgIHsKLQkgICAgaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPm9wX3R5cGUgJiBJbmRpcmVjdCkKLQkgICAgICBwX2luc24ucF9maWVsZCA9IDB4MDAwMDAwMDA7CS8qIEluZCAqIEluZCwgUm4gICsvLSBSbiAgKi8KLQkgICAgZWxzZSBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+b3BfdHlwZSAmIEluZGlyZWN0KQotCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMTAwMDAwMDsJLyogSW5kICogUm4sICBJbmQgKy8tIFJuICAqLwotCSAgICBlbHNlCi0JICAgICAgcF9pbnNuLnBfZmllbGQgPSAweDAzMDAwMDAwOwkvKiBJbmQgKiBSbiwgIFJuICArLy0gSW5kICovCi0JICB9Ci0JZWxzZQotCSAgewotCSAgICBpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+b3BfdHlwZSAmIFJuKQotCSAgICAgIHBfaW5zbi5wX2ZpZWxkID0gMHgwMjAwMDAwMDsJLyogUm4gICogUm4sICBJbmQgKy8tIEluZCAqLwotCSAgICBlbHNlIGlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5vcF90eXBlICYgSW5kaXJlY3QpCi0JICAgICAgewotCQlvcGVyYW5kICp0ZW1wOwotCQlwX2luc24ucF9maWVsZCA9IDB4MDEwMDAwMDA7CS8qIFJuICAqIEluZCwgSW5kICsvLSBSbiAgKi8KLQkJLyogTmVlZCB0byBzd2FwIHRoZSB0d28gbXVsdGlwbHkgb3BlcmFuZHMgYXJvdW5kIHNvIHRoYXQgZXZlcnl0aGluZyBpcyBpbgotCQkgICBpdHMgcGxhY2UgZm9yIHRoZSBvcGNvZGUgbWFrZXVwIGllIHNvIEluZCAqIFJuLCBJbmQgKy8tIFJuICovCi0JCXRlbXAgPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdOwotCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdID0gcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXTsKLQkJcF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXSA9IHRlbXA7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlvcGVyYW5kICp0ZW1wOwotCQlwX2luc24ucF9maWVsZCA9IDB4MDMwMDAwMDA7CS8qIFJuICAqIEluZCwgUm4gICsvLSBJbmQgKi8KLQkJdGVtcCA9IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF07Ci0JCXBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0gPSBwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdOwotCQlwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdID0gdGVtcDsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSAgZGVidWcgKCJQIGZpZWxkOiAlMDhYXG4iLCBwX2luc24ucF9maWVsZCk7Ci0gIC8qIEZpbmFsaXNlIG9wY29kZS4gIFRoaXMgaXMgZWFzaWVyIGZvciBwYXJhbGxlbCBpbnN0cnVjdGlvbnMgYXMgdGhleSBoYXZlIHRvIGJlCi0gICAgIGZ1bGx5IHJlc29sdmVkLCB0aGVyZSBhcmUgbm8gbWVtb3J5IGFkZHJlc3NlcyBhbGxvd2VkLCBleGNlcHQgdGhyb3VnaCBpbmRpcmVjdAotICAgICBhZGRyZXNzaW5nLCBzbyB0aGVyZSBhcmUgbm8gbGFiZWxzIHRvIHJlc29sdmUuICovCi0gIHsKLSAgICBwX2luc24ub3Bjb2RlID0gcF9pbnNuLnRtLT5iYXNlX29wY29kZTsKLSAgICBzd2l0Y2ggKHBfaW5zbi50bS0+b3BvcmRlcikKLSAgICAgIHsKLSAgICAgIGNhc2UgT09fNG9wMToKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PXzRvcDI6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWlmIChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlID09IHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUpCi0JICBhc193YXJuICgibG9hZGluZyB0aGUgc2FtZSByZWdpc3RlciBpbiBwYXJhbGxlbCBvcGVyYXRpb24iKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fNG9wMzoKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+cmVnLm9wY29kZSA8PCAyMik7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIE9PXzVvcDE6Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QuQVJudW0pOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgPDwgMjIpOwotCWJyZWFrOwotICAgICAgY2FzZSBPT181b3AyOgotCXBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzFdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQlwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzJdLT5yZWcub3Bjb2RlIDw8IDIyKTsKLQlicmVhazsKLSAgICAgIGNhc2UgT09fUEZpZWxkOgotCXBfaW5zbi5vcGNvZGUgfD0gcF9pbnNuLnBfZmllbGQ7Ci0JaWYgKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMl0tPnJlZy5vcGNvZGUgPT0gMHgwMSkKLQkgIHBfaW5zbi5vcGNvZGUgfD0gMHgwMDgwMDAwMDsKLQlpZiAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsyXS0+cmVnLm9wY29kZSA9PSAweDAzKQotCSAgcF9pbnNuLm9wY29kZSB8PSAweDAwNDAwMDAwOwotCXN3aXRjaCAocF9pbnNuLnBfZmllbGQpCi0JICB7Ci0JICBjYXNlIDB4MDAwMDAwMDA6Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCSAgICBicmVhazsKLQkgIGNhc2UgMHgwMTAwMDAwMDoKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QuQVJudW0pOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMyk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMF0tPmluZGlyZWN0LkFSbnVtIDw8IDgpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5tb2QgPDwgMTEpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5yZWcub3Bjb2RlIDw8IDE2KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVsxXS0+cmVnLm9wY29kZSA8PCAxOSk7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAweDAyMDAwMDAwOgotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzFdWzFdLT5pbmRpcmVjdC5BUm51bSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0Lm1vZCA8PCAzKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+aW5kaXJlY3QuQVJudW0gPDwgOCk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMF0tPmluZGlyZWN0Lm1vZCA8PCAxMSk7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMTYpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5yZWcub3Bjb2RlIDw8IDE5KTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDB4MDMwMDAwMDA6Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMV1bMV0tPmluZGlyZWN0LkFSbnVtKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVsxXS0+aW5kaXJlY3QubW9kIDw8IDMpOwotCSAgICBwX2luc24ub3Bjb2RlIHw9IChwX2luc24ub3BlcmFuZF90eXBlWzBdWzBdLT5pbmRpcmVjdC5BUm51bSA8PCA4KTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVswXVswXS0+aW5kaXJlY3QubW9kIDw8IDExKTsKLQkgICAgcF9pbnNuLm9wY29kZSB8PSAocF9pbnNuLm9wZXJhbmRfdHlwZVsxXVswXS0+cmVnLm9wY29kZSA8PCAxNik7Ci0JICAgIHBfaW5zbi5vcGNvZGUgfD0gKHBfaW5zbi5vcGVyYW5kX3R5cGVbMF1bMV0tPnJlZy5vcGNvZGUgPDwgMTkpOwotCSAgICBicmVhazsKLQkgIH0KLQlicmVhazsKLSAgICAgIH0KLSAgfQkJCQkvKiBPcGNvZGUgaXMgZmluYWxpc2VkIGF0IHRoaXMgcG9pbnQgZm9yIGFsbCBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuICovCi0gIHsJCQkJLyogT3V0cHV0IG9wY29kZSAqLwotICAgIGNoYXIgKnA7Ci0gICAgcCA9IGZyYWdfbW9yZSAoSU5TTl9TSVpFKTsKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIHBfaW5zbi5vcGNvZGUsIElOU05fU0laRSk7Ci0gIH0KLSAgewotICAgIGludCBpLCBqOwotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICBmb3IgKGogPSAwOyBqIDwgcF9pbnNuLm9wZXJhbmRzW2ldOyBqKyspCi0JZnJlZSAocF9pbnNuLm9wZXJhbmRfdHlwZVtpXVtqXSk7Ci0gIH0KLSAgZGVidWcgKCJGaW5hbCBvcGNvZGU6ICUwOFhcbiIsIHBfaW5zbi5vcGNvZGUpOwotICBkZWJ1ZyAoIlxuIik7Ci0gIHJldHVybiAxOwotfQotCi1vcGVyYW5kICoKLXRpYzMwX29wZXJhbmQgKHRva2VuKQotICAgICBjaGFyICp0b2tlbjsKLXsKLSAgaW50IGNvdW50OwotICBjaGFyIGluZF9idWZmZXJbc3RybGVuICh0b2tlbildOwotICBvcGVyYW5kICpjdXJyZW50X29wOwotCi0gIGRlYnVnICgiSW4gdGljMzBfb3BlcmFuZCB3aXRoICVzXG4iLCB0b2tlbik7Ci0gIGN1cnJlbnRfb3AgPSAob3BlcmFuZCAqKSBtYWxsb2MgKHNpemVvZiAob3BlcmFuZCkpOwotICBtZW1zZXQgKGN1cnJlbnRfb3AsICdcMCcsIHNpemVvZiAob3BlcmFuZCkpOwotICBpZiAoKnRva2VuID09IERJUkVDVF9SRUZFUkVOQ0UpCi0gICAgewotICAgICAgY2hhciAqdG9rZW5fcG9zbiA9IHRva2VuICsgMTsKLSAgICAgIGludCBkaXJlY3RfbGFiZWwgPSAwOwotICAgICAgZGVidWcgKCJGb3VuZCBkaXJlY3QgcmVmZXJlbmNlXG4iKTsKLSAgICAgIHdoaWxlICgqdG9rZW5fcG9zbikKLQl7Ci0JICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCp0b2tlbl9wb3NuKSkKLQkgICAgZGlyZWN0X2xhYmVsID0gMTsKLQkgIHRva2VuX3Bvc24rKzsKLQl9Ci0gICAgICBpZiAoZGlyZWN0X2xhYmVsKQotCXsKLQkgIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgc2VnVCByZXR2YWw7Ci0JICBkZWJ1ZyAoIkRpcmVjdCByZWZlcmVuY2UgaXMgYSBsYWJlbFxuIik7Ci0JICBjdXJyZW50X29wLT5kaXJlY3QubGFiZWwgPSB0b2tlbiArIDE7Ci0JICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHRva2VuICsgMTsKLQkgIGRlYnVnICgiQ3VycmVudCBpbnB1dF9saW5lX3BvaW50ZXI6ICVzXG4iLCBpbnB1dF9saW5lX3BvaW50ZXIpOwotCSAgcmV0dmFsID0gZXhwcmVzc2lvbiAoJmN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwcik7Ci0JICBkZWJ1ZyAoIkV4cHJlc3Npb24gdHlwZTogJWRcbiIsIGN1cnJlbnRfb3AtPmRpcmVjdC5kaXJlY3RfZXhwci5YX29wKTsKLQkgIGRlYnVnICgiRXhwcmVzc2lvbiBhZGRudW06ICVkXG4iLCBjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIuWF9hZGRfbnVtYmVyKTsKLQkgIGRlYnVnICgiU2VnbWVudDogJWRcbiIsIHJldHZhbCk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGlmIChjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIuWF9vcCA9PSBPX2NvbnN0YW50KQotCSAgICB7Ci0JICAgICAgY3VycmVudF9vcC0+ZGlyZWN0LmFkZHJlc3MgPSBjdXJyZW50X29wLT5kaXJlY3QuZGlyZWN0X2V4cHIuWF9hZGRfbnVtYmVyOwotCSAgICAgIGN1cnJlbnRfb3AtPmRpcmVjdC5yZXNvbHZlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZGVidWcgKCJEaXJlY3QgcmVmZXJlbmNlIGlzIGEgbnVtYmVyXG4iKTsKLQkgIGN1cnJlbnRfb3AtPmRpcmVjdC5hZGRyZXNzID0gYXRvaSAodG9rZW4gKyAxKTsKLQkgIGN1cnJlbnRfb3AtPmRpcmVjdC5yZXNvbHZlZCA9IDE7Ci0JfQotICAgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IERpcmVjdDsKLSAgICB9Ci0gIGVsc2UgaWYgKCp0b2tlbiA9PSBJTkRJUkVDVF9SRUZFUkVOQ0UpCi0gICAgewkJCQkvKiBJbmRpcmVjdCByZWZlcmVuY2Ugb3BlcmFuZCAqLwotICAgICAgaW50IGZvdW5kX2FyID0gMDsKLSAgICAgIGludCBmb3VuZF9kaXNwID0gMDsKLSAgICAgIGludCBhcl9udW1iZXIgPSAtMTsKLSAgICAgIGludCBkaXNwX251bWJlciA9IDA7Ci0gICAgICBpbnQgYnVmZmVyX3Bvc24gPSAxOwotICAgICAgaW5kX2FkZHJfdHlwZSAqaW5kX2FkZHJfb3A7Ci0gICAgICBkZWJ1ZyAoIkZvdW5kIGluZGlyZWN0IHJlZmVyZW5jZVxuIik7Ci0gICAgICBpbmRfYnVmZmVyWzBdID0gKnRva2VuOwotICAgICAgZm9yIChjb3VudCA9IDE7IGNvdW50IDwgc3RybGVuICh0b2tlbik7IGNvdW50KyspCi0JewkJCS8qIFN0cmlwIG9wZXJhbmQgKi8KLQkgIGluZF9idWZmZXJbYnVmZmVyX3Bvc25dID0gdG9sb3dlciAoKih0b2tlbiArIGNvdW50KSk7Ci0JICBpZiAoKCoodG9rZW4gKyBjb3VudCAtIDEpID09ICdhJyB8fCAqKHRva2VuICsgY291bnQgLSAxKSA9PSAnQScpICYmCi0JICAgICAgKCoodG9rZW4gKyBjb3VudCkgPT0gJ3InIHx8ICoodG9rZW4gKyBjb3VudCkgPT0gJ1InKSkKLQkgICAgewotCSAgICAgIC8qIEFSIHJlZmVyZW5jZSBpcyBmb3VuZCwgc28gZ2V0IGl0cyBudW1iZXIgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBidWZmZXIKLQkgICAgICAgICBzbyBpdCBjYW4gcGFzcyB0aHJvdWdoIGhhc2hfZmluZCgpICovCi0JICAgICAgaWYgKGZvdW5kX2FyKQotCQl7Ci0JCSAgYXNfYmFkICgiTW9yZSB0aGFuIG9uZSBBUiByZWdpc3RlciBmb3VuZCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkJICByZXR1cm4gTlVMTDsKLQkJfQotCSAgICAgIGlmICgqKHRva2VuICsgY291bnQgKyAxKSA8ICcwJyB8fCAqKHRva2VuICsgY291bnQgKyAxKSA+ICc3JykKLQkJewotCQkgIGFzX2JhZCAoIklsbGVnYWwgQVIgcmVnaXN0ZXIgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JCSAgcmV0dXJuIE5VTEw7Ci0JCX0KLQkgICAgICBhcl9udW1iZXIgPSAqKHRva2VuICsgY291bnQgKyAxKSAtICcwJzsKLQkgICAgICBmb3VuZF9hciA9IDE7Ci0JICAgICAgY291bnQrKzsKLQkgICAgfQotCSAgaWYgKCoodG9rZW4gKyBjb3VudCkgPT0gJygnKQotCSAgICB7Ci0JICAgICAgLyogUGFyZW50aGVzaXMgZm91bmQsIHNvIGNoZWNrIGlmIGEgZGlzcGxhY2VtZW50IHZhbHVlIGlzIGluc2lkZS4gIElmIHNvLCBnZXQKLQkgICAgICAgICB0aGUgdmFsdWUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBidWZmZXIuICovCi0JICAgICAgaWYgKGlzX2RpZ2l0X2NoYXIgKCoodG9rZW4gKyBjb3VudCArIDEpKSkKLQkJewotCQkgIGNoYXIgZGlzcFsxMF07Ci0JCSAgaW50IGRpc3BfcG9zbiA9IDA7Ci0KLQkJICBpZiAoZm91bmRfZGlzcCkKLQkJICAgIHsKLQkJICAgICAgYXNfYmFkICgiTW9yZSB0aGFuIG9uZSBkaXNwbGFjZW1lbnQgZm91bmQgaW4gaW5kaXJlY3QgcmVmZXJlbmNlIik7Ci0JCSAgICAgIHJldHVybiBOVUxMOwotCQkgICAgfQotCQkgIGNvdW50Kys7Ci0JCSAgd2hpbGUgKCoodG9rZW4gKyBjb3VudCkgIT0gJyknKQotCQkgICAgewotCQkgICAgICBpZiAoIWlzX2RpZ2l0X2NoYXIgKCoodG9rZW4gKyBjb3VudCkpKQotCQkJewotCQkJICBhc19iYWQgKCJJbnZhbGlkIGRpc3BsYWNlbWVudCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkJCSAgcmV0dXJuIE5VTEw7Ci0JCQl9Ci0JCSAgICAgIGRpc3BbZGlzcF9wb3NuKytdID0gKih0b2tlbiArIChjb3VudCsrKSk7Ci0JCSAgICB9Ci0JCSAgZGlzcFtkaXNwX3Bvc25dID0gJ1wwJzsKLQkJICBkaXNwX251bWJlciA9IGF0b2kgKGRpc3ApOwotCQkgIGNvdW50LS07Ci0JCSAgZm91bmRfZGlzcCA9IDE7Ci0JCX0KLQkgICAgfQotCSAgYnVmZmVyX3Bvc24rKzsKLQl9Ci0gICAgICBpbmRfYnVmZmVyW2J1ZmZlcl9wb3NuXSA9ICdcMCc7Ci0gICAgICBpZiAoIWZvdW5kX2FyKQotCXsKLQkgIGFzX2JhZCAoIkFSIHJlZ2lzdGVyIG5vdCBmb3VuZCBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkgIHJldHVybiBOVUxMOwotCX0KLSAgICAgIGluZF9hZGRyX29wID0gKGluZF9hZGRyX3R5cGUgKikgaGFzaF9maW5kIChpbmRfaGFzaCwgaW5kX2J1ZmZlcik7Ci0gICAgICBpZiAoaW5kX2FkZHJfb3ApCi0JewotCSAgZGVidWcgKCJGb3VuZCBpbmRpcmVjdCByZWZlcmVuY2U6ICVzXG4iLCBpbmRfYWRkcl9vcC0+c3ludGF4KTsKLQkgIGlmIChpbmRfYWRkcl9vcC0+ZGlzcGxhY2VtZW50ID09IElNUExJRURfRElTUCkKLQkgICAgewotCSAgICAgIGZvdW5kX2Rpc3AgPSAxOwotCSAgICAgIGRpc3BfbnVtYmVyID0gMTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKGluZF9hZGRyX29wLT5kaXNwbGFjZW1lbnQgPT0gRElTUF9SRVFVSVJFRCkgJiYgIWZvdW5kX2Rpc3ApCi0JICAgIHsKLQkgICAgICAvKiBNYXliZSBhbiBpbXBsaWVkIGRpc3BsYWNlbWVudCBvZiAxIGFnYWluICovCi0JICAgICAgYXNfYmFkICgicmVxdWlyZWQgZGlzcGxhY2VtZW50IHdhc24ndCBnaXZlbiBpbiBpbmRpcmVjdCByZWZlcmVuY2UiKTsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKCJpbGxlZ2FsIGluZGlyZWN0IHJlZmVyZW5jZSIpOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgaWYgKGZvdW5kX2Rpc3AgJiYgKGRpc3BfbnVtYmVyIDwgMCB8fCBkaXNwX251bWJlciA+IDI1NSkpCi0JewotCSAgYXNfYmFkICgiZGlzcGxhY2VtZW50IG11c3QgYmUgYW4gdW5zaWduZWQgOC1iaXQgbnVtYmVyIik7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBjdXJyZW50X29wLT5pbmRpcmVjdC5tb2QgPSBpbmRfYWRkcl9vcC0+bW9kZmllbGQ7Ci0gICAgICBjdXJyZW50X29wLT5pbmRpcmVjdC5kaXNwID0gZGlzcF9udW1iZXI7Ci0gICAgICBjdXJyZW50X29wLT5pbmRpcmVjdC5BUm51bSA9IGFyX251bWJlcjsKLSAgICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBJbmRpcmVjdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWcgKnJlZ29wID0gKHJlZyAqKSBoYXNoX2ZpbmQgKHJlZ19oYXNoLCB0b2tlbik7Ci0gICAgICBpZiAocmVnb3ApCi0JewotCSAgZGVidWcgKCJGb3VuZCByZWdpc3RlciBvcGVyYW5kOiAlc1xuIiwgcmVnb3AtPm5hbWUpOwotCSAgaWYgKHJlZ29wLT5yZWd0eXBlID09IFJFR19BUm4pCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBBUm47Ci0JICBlbHNlIGlmIChyZWdvcC0+cmVndHlwZSA9PSBSRUdfUm4pCi0JICAgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBSbjsKLQkgIGVsc2UgaWYgKHJlZ29wLT5yZWd0eXBlID09IFJFR19EUCkKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSA9IERQUmVnOwotCSAgZWxzZQotCSAgICBjdXJyZW50X29wLT5vcF90eXBlID0gT3RoZXJSZWc7Ci0JICBjdXJyZW50X29wLT5yZWcub3Bjb2RlID0gcmVnb3AtPm9wY29kZTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCFpc19kaWdpdF9jaGFyICgqdG9rZW4pIHx8ICoodG9rZW4gKyAxKSA9PSAneCcgfHwgc3RyY2hyICh0b2tlbiwgJ2gnKSkKLQkgICAgewotCSAgICAgIGNoYXIgKnNhdmVfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIHNlZ1QgcmV0dmFsOwotCSAgICAgIGRlYnVnICgiUHJvYmFibHkgYSBsYWJlbDogJXNcbiIsIHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWwgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAodG9rZW4pICsgMSk7Ci0JICAgICAgc3RyY3B5IChjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWwsIHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWxbc3RybGVuICh0b2tlbildID0gJ1wwJzsKLQkgICAgICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSB0b2tlbjsKLQkgICAgICBkZWJ1ZyAoIkN1cnJlbnQgaW5wdXRfbGluZV9wb2ludGVyOiAlc1xuIiwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICByZXR2YWwgPSBleHByZXNzaW9uICgmY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByKTsKLQkgICAgICBkZWJ1ZyAoIkV4cHJlc3Npb24gdHlwZTogJWRcbiIsIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX29wKTsKLQkgICAgICBkZWJ1ZyAoIkV4cHJlc3Npb24gYWRkbnVtOiAlZFxuIiwgY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfYWRkX251bWJlcik7Ci0JICAgICAgZGVidWcgKCJTZWdtZW50OiAlZFxuIiwgcmV0dmFsKTsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpZiAoY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5zX251bWJlciA9IGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5pbW1fZXhwci5YX2FkZF9udW1iZXI7Ci0JCSAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyID0gKHVuc2lnbmVkIGludCkgY3VycmVudF9vcC0+aW1tZWRpYXRlLmltbV9leHByLlhfYWRkX251bWJlcjsKLQkJICBjdXJyZW50X29wLT5pbW1lZGlhdGUucmVzb2x2ZWQgPSAxOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGNvdW50OwotCSAgICAgIGRlYnVnICgiRm91bmQgYSBudW1iZXIgb3IgZGlzcGxhY2VtZW50XG4iKTsKLQkgICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBzdHJsZW4gKHRva2VuKTsgY291bnQrKykKLQkJaWYgKCoodG9rZW4gKyBjb3VudCkgPT0gJy4nKQotCQkgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5kZWNpbWFsX2ZvdW5kID0gMTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWwgPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAodG9rZW4pICsgMSk7Ci0JICAgICAgc3RyY3B5IChjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWwsIHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUubGFiZWxbc3RybGVuICh0b2tlbildID0gJ1wwJzsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUuZl9udW1iZXIgPSAoZmxvYXQpIGF0b2YgKHRva2VuKTsKLQkgICAgICBjdXJyZW50X29wLT5pbW1lZGlhdGUuc19udW1iZXIgPSAoaW50KSBhdG9pICh0b2tlbik7Ci0JICAgICAgY3VycmVudF9vcC0+aW1tZWRpYXRlLnVfbnVtYmVyID0gKHVuc2lnbmVkIGludCkgYXRvaSAodG9rZW4pOwotCSAgICAgIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS5yZXNvbHZlZCA9IDE7Ci0JICAgIH0KLQkgIGN1cnJlbnRfb3AtPm9wX3R5cGUgPSBEaXNwIHwgQWJzMjQgfCBJbW0xNiB8IEltbTI0OwotCSAgaWYgKGN1cnJlbnRfb3AtPmltbWVkaWF0ZS51X251bWJlciA+PSAwICYmIGN1cnJlbnRfb3AtPmltbWVkaWF0ZS51X251bWJlciA8PSAzMSkKLQkgICAgY3VycmVudF9vcC0+b3BfdHlwZSB8PSBJVmVjdG9yOwotCX0KLSAgICB9Ci0gIHJldHVybiBjdXJyZW50X29wOwotfQotCi0vKiBuZXh0X2xpbmUgcG9pbnRzIHRvIHRoZSBuZXh0IGxpbmUgYWZ0ZXIgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKGN1cnJlbnRfbGluZSkuCi0gICBTZWFyY2ggZm9yIHRoZSBwYXJhbGxlbCBiYXJzLCBhbmQgaWYgZm91bmQsIG1lcmdlIHR3byBsaW5lcyBpbnRvIGludGVybmFsIHN5bnRheAotICAgZm9yIGEgcGFyYWxsZWwgaW5zdHJ1Y3Rpb246Ci0gICBxX1tJTlNOMV1fW0lOU04yXSBbT1BFUkFORFMxXSB8IFtPUEVSQU5EUzJdCi0gICBCeSB0aGlzIHN0YWdlLCBhbGwgY29tbWVudHMgYXJlIHNjcnViYmVkLCBhbmQgb25seSB0aGUgYmFyZSBsaW5lcyBhcmUgZ2l2ZW4uCi0gKi8KLQotI2RlZmluZSBOT05FICAgICAgICAgICAwCi0jZGVmaW5lIFNUQVJUX09QQ09ERSAgIDEKLSNkZWZpbmUgRU5EX09QQ09ERSAgICAgMgotI2RlZmluZSBTVEFSVF9PUEVSQU5EUyAzCi0jZGVmaW5lIEVORF9PUEVSQU5EUyAgIDQKLQotY2hhciAqCi10aWMzMF9maW5kX3BhcmFsbGVsX2luc24gKGN1cnJlbnRfbGluZSwgbmV4dF9saW5lKQotICAgICBjaGFyICpjdXJyZW50X2xpbmU7Ci0gICAgIGNoYXIgKm5leHRfbGluZTsKLXsKLSAgaW50IGZvdW5kX3BhcmFsbGVsID0gMDsKLSAgY2hhciBmaXJzdF9vcGNvZGVbMjU2XTsKLSAgY2hhciBzZWNvbmRfb3Bjb2RlWzI1Nl07Ci0gIGNoYXIgZmlyc3Rfb3BlcmFuZHNbMjU2XTsKLSAgY2hhciBzZWNvbmRfb3BlcmFuZHNbMjU2XTsKLSAgY2hhciAqcGFyYWxsZWxfaW5zbjsKLQotICBkZWJ1ZyAoIkluIHRpYzMwX2ZpbmRfcGFyYWxsZWxfaW5zbigpXG4iKTsKLSAgd2hpbGUgKCFpc19lbmRfb2ZfbGluZVsoaW50KSAqbmV4dF9saW5lXSkKLSAgICB7Ci0gICAgICBpZiAoKm5leHRfbGluZSA9PSBQQVJBTExFTF9TRVBBUkFUT1IgJiYgKihuZXh0X2xpbmUgKyAxKSA9PSBQQVJBTExFTF9TRVBBUkFUT1IpCi0JewotCSAgZm91bmRfcGFyYWxsZWwgPSAxOwotCSAgbmV4dF9saW5lKys7Ci0JICBicmVhazsKLQl9Ci0gICAgICBuZXh0X2xpbmUrKzsKLSAgICB9Ci0gIGlmICghZm91bmRfcGFyYWxsZWwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGRlYnVnICgiRm91bmQgYSBwYXJhbGxlbCBpbnN0cnVjdGlvblxuIik7Ci0gIHsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpvcGNvZGUsICpvcGVyYW5kcywgKmxpbmU7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgewotCWlmIChpID09IDApCi0JICB7Ci0JICAgIG9wY29kZSA9ICZmaXJzdF9vcGNvZGVbMF07Ci0JICAgIG9wZXJhbmRzID0gJmZpcnN0X29wZXJhbmRzWzBdOwotCSAgICBsaW5lID0gY3VycmVudF9saW5lOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgb3Bjb2RlID0gJnNlY29uZF9vcGNvZGVbMF07Ci0JICAgIG9wZXJhbmRzID0gJnNlY29uZF9vcGVyYW5kc1swXTsKLQkgICAgbGluZSA9IG5leHRfbGluZTsKLQkgIH0KLQl7Ci0JICBpbnQgc2VhcmNoX3N0YXR1cyA9IE5PTkU7Ci0JICBpbnQgY2hhcl9wdHIgPSAwOwotCSAgY2hhciBjOwotCi0JICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyhpbnQpIChjID0gKmxpbmUpXSAmJiAqbGluZSkKLQkgICAgewotCSAgICAgIGlmIChpc19vcGNvZGVfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBOT05FKQotCQl7Ci0JCSAgb3Bjb2RlW2NoYXJfcHRyKytdID0gdG9sb3dlciAoYyk7Ci0JCSAgc2VhcmNoX3N0YXR1cyA9IFNUQVJUX09QQ09ERTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGlzX29wY29kZV9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IFNUQVJUX09QQ09ERSkKLQkJewotCQkgIG9wY29kZVtjaGFyX3B0cisrXSA9IHRvbG93ZXIgKGMpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoIWlzX29wY29kZV9jaGFyIChjKSAmJiBzZWFyY2hfc3RhdHVzID09IFNUQVJUX09QQ09ERSkKLQkJewotCQkgIG9wY29kZVtjaGFyX3B0cl0gPSAnXDAnOwotCQkgIGNoYXJfcHRyID0gMDsKLQkJICBzZWFyY2hfc3RhdHVzID0gRU5EX09QQ09ERTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGlzX29wZXJhbmRfY2hhciAoYykgJiYgc2VhcmNoX3N0YXR1cyA9PSBTVEFSVF9PUEVSQU5EUykKLQkJewotCQkgIG9wZXJhbmRzW2NoYXJfcHRyKytdID0gYzsKLQkJfQotCSAgICAgIGlmIChpc19vcGVyYW5kX2NoYXIgKGMpICYmIHNlYXJjaF9zdGF0dXMgPT0gRU5EX09QQ09ERSkKLQkJewotCQkgIG9wZXJhbmRzW2NoYXJfcHRyKytdID0gYzsKLQkJICBzZWFyY2hfc3RhdHVzID0gU1RBUlRfT1BFUkFORFM7Ci0JCX0KLQkgICAgICBsaW5lKys7Ci0JICAgIH0KLQkgIGlmIChzZWFyY2hfc3RhdHVzICE9IFNUQVJUX09QRVJBTkRTKQotCSAgICByZXR1cm4gTlVMTDsKLQkgIG9wZXJhbmRzW2NoYXJfcHRyXSA9ICdcMCc7Ci0JfQotICAgICAgfQotICB9Ci0gIHBhcmFsbGVsX2luc24gPSAoY2hhciAqKSBtYWxsb2MgKHN0cmxlbiAoZmlyc3Rfb3Bjb2RlKSArIHN0cmxlbiAoZmlyc3Rfb3BlcmFuZHMpICsKLQkJICAgICBzdHJsZW4gKHNlY29uZF9vcGNvZGUpICsgc3RybGVuIChzZWNvbmRfb3BlcmFuZHMpICsgOCk7Ci0gIHNwcmludGYgKHBhcmFsbGVsX2luc24sICJxXyVzXyVzICVzIHwgJXMiLCBmaXJzdF9vcGNvZGUsIHNlY29uZF9vcGNvZGUsIGZpcnN0X29wZXJhbmRzLCBzZWNvbmRfb3BlcmFuZHMpOwotICBkZWJ1ZyAoInBhcmFsbGVsIGluc24gPSAlc1xuIiwgcGFyYWxsZWxfaW5zbik7Ci0gIHJldHVybiBwYXJhbGxlbF9pbnNuOwotfQotCi0jdW5kZWYgTk9ORQotI3VuZGVmIFNUQVJUX09QQ09ERQotI3VuZGVmIEVORF9PUENPREUKLSN1bmRlZiBTVEFSVF9PUEVSQU5EUwotI3VuZGVmIEVORF9PUEVSQU5EUwotCi0vKiBJbiBvcmRlciB0byBnZXQgZ2FzIHRvIGlnbm9yZSBhbnkgfCBjaGFycyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLAotICAgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgYSB8IGlzIGZvdW5kIGluIGEgbGluZS4gKi8KLQotaW50Ci10aWMzMF91bnJlY29nbml6ZWRfbGluZSAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGRlYnVnICgiSW4gdGNfdW5yZWNvZ25pemVkX2xpbmVcbiIpOwotICByZXR1cm4gKGMgPT0gUEFSQUxMRUxfU0VQQVJBVE9SKTsKLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBkZWJ1ZyAoIkluIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4KClcbiIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHNlZ1Qgc2VjOwotICAgICByZWdpc3RlciBmcmFnUyAqZnJhZ1A7Ci17Ci0gIGRlYnVnICgiSW4gbWRfY29udmVydF9mcmFnKClcbiIpOwotfQotCi1pbnQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsUCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgdmFsdWVUICp2YWxQOwotewotICB2YWx1ZVQgdmFsdWUgPSAqdmFsUDsKLQotICBkZWJ1ZyAoIkluIG1kX2FwcGx5X2ZpeCgpIHdpdGggdmFsdWUgPSAlbGRcbiIsIChsb25nKSB2YWx1ZSk7Ci0gIGRlYnVnICgiVmFsdWVzIGluIGZpeFBcbiIpOwotICBkZWJ1ZyAoImZ4X3NpemUgPSAlZFxuIiwgZml4UC0+Znhfc2l6ZSk7Ci0gIGRlYnVnICgiZnhfcGNyZWwgPSAlZFxuIiwgZml4UC0+ZnhfcGNyZWwpOwotICBkZWJ1ZyAoImZ4X3doZXJlID0gJWRcbiIsIGZpeFAtPmZ4X3doZXJlKTsKLSAgZGVidWcgKCJmeF9vZmZzZXQgPSAlZFxuIiwgKGludCkgZml4UC0+Znhfb2Zmc2V0KTsKLSAgewotICAgIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhQLT5meF93aGVyZTsKLSAgICB2YWx1ZSAvPSBJTlNOX1NJWkU7Ci0gICAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSkKLSAgICAgIHsJCQkJLyogU3BlY2lhbCBmaXggZm9yIExEUCBpbnN0cnVjdGlvbi4gKi8KLQl2YWx1ZSA9ICh2YWx1ZSAmIDB4MDBGRjAwMDApID4+IDE2OwotICAgICAgfQotICAgIGRlYnVnICgibmV3IHZhbHVlID0gJWxkXG4iLCAobG9uZykgdmFsdWUpOwotICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmLCB2YWx1ZSwgZml4UC0+Znhfc2l6ZSk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCBjOwotICAgICBjaGFyICphcmc7Ci17Ci0gIGludCBpOwotCi0gIGRlYnVnICgiSW4gbWRfcGFyc2Vfb3B0aW9uKClcbiIpOwotICBmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKQotICAgIHsKLSAgICAgIHByaW50ZiAoIiVjXG4iLCBhcmdbY10pOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBkZWJ1ZyAoIkluIG1kX3Nob3dfdXNhZ2UoKVxuIik7Ci19Ci0KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgZGVidWcgKCJJbiBtZF91bmRlZmluZWRfc3ltYm9sKClcbiIpOwotICByZXR1cm4gKHN5bWJvbFMgKikgMDsKLX0KLQotdmFsdWVUCi1tZF9zZWN0aW9uX2FsaWduIChzZWdtZW50LCBzaXplKQotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCBzaXplOwotewotICBkZWJ1ZyAoIkluIG1kX3NlY3Rpb25fYWxpZ24oKSBzZWdtZW50ID0gJWQgYW5kIHNpemUgPSAlZFxuIiwgc2VnbWVudCwgc2l6ZSk7Ci0gIHNpemUgPSAoc2l6ZSArIDMpIC8gNDsKLSAgc2l6ZSAqPSA0OwotICBkZWJ1ZyAoIk5ldyBzaXplIHZhbHVlID0gJWRcbiIsIHNpemUpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaW50IG9mZnNldDsKLQotICBkZWJ1ZyAoIkluIG1kX3BjcmVsX2Zyb20oKVxuIik7Ci0gIGRlYnVnICgiZnhfd2hlcmUgPSAlZFxuIiwgZml4UC0+Znhfd2hlcmUpOwotICBkZWJ1ZyAoImZ4X3NpemUgPSAlZFxuIiwgZml4UC0+Znhfc2l6ZSk7Ci0gIC8qIEZpbmQgdGhlIG9wY29kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gaW4gdGhlIGZyX2xpdGVyYWwKLSAgICAgc3RvcmFnZSBhcmVhLCBhbmQgY2hlY2sgYml0IDIxLiAgQml0IDIxIGNvbnRhaW5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24KLSAgICAgaXMgYSBkZWxheWVkIG9uZSBvciBub3QsIGFuZCB0aGVuIHNldCB0aGUgb2Zmc2V0IHZhbHVlIGFwcHJvcHJpYXRlbHkuICovCi0gIGlmIChmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsW2ZpeFAtPmZ4X3doZXJlIC0gZml4UC0+Znhfc2l6ZSArIDFdICYgMHgyMCkKLSAgICBvZmZzZXQgPSAzOwotICBlbHNlCi0gICAgb2Zmc2V0ID0gMTsKLSAgZGVidWcgKCJvZmZzZXQgPSAlZFxuIiwgb2Zmc2V0KTsKLSAgLyogUEMgUmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIGhhdmUgYSBmb3JtYXQ6Ci0gICAgIGRpc3BsYWNlbWVudCA9IExhYmVsIC0gKFBDICsgb2Zmc2V0KQotICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgUEMgKyBvZmZzZXQgd2hlcmU6Ci0gICAgIGZ4X3doZXJlIC0gZnhfc2l6ZSA9IFBDCi0gICAgIElOU05fU0laRSAqIG9mZnNldCA9IG9mZnNldCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zCi0gICAqLwotICByZXR1cm4gZml4UC0+Znhfd2hlcmUgLSBmaXhQLT5meF9zaXplICsgKElOU05fU0laRSAqIG9mZnNldCk7Ci19Ci0KLWNoYXIgKgotbWRfYXRvZiAod2hhdF9zdGF0ZW1lbnRfdHlwZSwgbGl0ZXJhbFAsIHNpemVQKQotICAgICBpbnQgd2hhdF9zdGF0ZW1lbnRfdHlwZTsKLSAgICAgY2hhciAqbGl0ZXJhbFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBjaGFyICp0b2tlbjsKLSAgY2hhciBrZWVwdmFsOwotICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAvKiAgY2hhciAqYXRvZl9pZWVlICgpOyAqLwotICBmbG9hdCBmbG9hdF92YWx1ZTsKLSAgZGVidWcgKCJJbiBtZF9hdG9mKClcbiIpOwotICBkZWJ1ZyAoInByZWNpc2lvbiA9ICVjXG4iLCB3aGF0X3N0YXRlbWVudF90eXBlKTsKLSAgZGVidWcgKCJsaXRlcmFsID0gJXNcbiIsIGxpdGVyYWxQKTsKLSAgZGVidWcgKCJsaW5lID0gIik7Ci0gIHRva2VuID0gaW5wdXRfbGluZV9wb2ludGVyOwotICB3aGlsZSAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCkgKmlucHV0X2xpbmVfcG9pbnRlcl0gJiYgKCppbnB1dF9saW5lX3BvaW50ZXIpICYmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykpCi0gICAgewotICAgICAgZGVidWcgKCIlYyIsICppbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBrZWVwdmFsID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0gIGRlYnVnICgiXG4iKTsKLSAgZmxvYXRfdmFsdWUgPSAoZmxvYXQpIGF0b2YgKHRva2VuKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGtlZXB2YWw7Ci0gIGRlYnVnICgiZmxvYXRfdmFsdWUgPSAlZlxuIiwgZmxvYXRfdmFsdWUpOwotICBzd2l0Y2ggKHdoYXRfc3RhdGVtZW50X3R5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuICJCYWQgY2FsbCB0byBNRF9BVE9GKCkiOwotICAgIH0KLSAgaWYgKGZsb2F0X3ZhbHVlID09IDAuMCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IChwcmVjID09IDIpID8gMHgwMDAwODAwMEwgOiAweDgwMDAwMDAwTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGV4cCwgc2lnbiwgbWFudCwgdG1zZmxvYXQ7Ci0gICAgICB0bXNmbG9hdCA9ICooKGxvbmcgKikgJmZsb2F0X3ZhbHVlKTsKLSAgICAgIHNpZ24gPSB0bXNmbG9hdCAmIDB4ODAwMDAwMDA7Ci0gICAgICBtYW50ID0gdG1zZmxvYXQgJiAweDAwN0ZGRkZGOwotICAgICAgZXhwID0gdG1zZmxvYXQgJiAweDdGODAwMDAwOwotICAgICAgZXhwIDw8PSAxOwotICAgICAgaWYgKGV4cCA9PSAweEZGMDAwMDAwKQotCXsKLQkgIGlmIChtYW50ID09IDApCi0JICAgIHZhbHVlID0gMHg3RjdGRkZGRjsKLQkgIGVsc2UgaWYgKHNpZ24gPT0gMCkKLQkgICAgdmFsdWUgPSAweDdGN0ZGRkZGOwotCSAgZWxzZQotCSAgICB2YWx1ZSA9IDB4N0Y4MDAwMDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGV4cCAtPSAweDdGMDAwMDAwOwotCSAgaWYgKHNpZ24pCi0JICAgIHsKLQkgICAgICBtYW50ID0gbWFudCAmIDB4MDA3RkZGRkY7Ci0JICAgICAgbWFudCA9IC1tYW50OwotCSAgICAgIG1hbnQgPSBtYW50ICYgMHgwMEZGRkZGRjsKLQkgICAgICBpZiAobWFudCA9PSAwKQotCQl7Ci0JCSAgbWFudCB8PSAweDAwODAwMDAwOwotCQkgIGV4cCA9IChsb25nKSBleHAgLSAweDAxMDAwMDAwOwotCQl9Ci0JICAgIH0KLQkgIHRtc2Zsb2F0ID0gZXhwIHwgbWFudDsKLQkgIHZhbHVlID0gdG1zZmxvYXQ7Ci0JfQotICAgICAgaWYgKHByZWMgPT0gMikKLQl7Ci0JICBsb25nIGV4cCwgbWFudDsKLQotCSAgaWYgKHRtc2Zsb2F0ID09IDB4ODAwMDAwMDApCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IDB4ODAwMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAwOwotCSAgICAgIGV4cCA9ICh0bXNmbG9hdCAmIDB4RkYwMDAwMDApOwotCSAgICAgIGV4cCA+Pj0gMjQ7Ci0JICAgICAgbWFudCA9IHRtc2Zsb2F0ICYgMHgwMDdGRkZGRjsKLQkgICAgICBpZiAodG1zZmxvYXQgJiAweDAwODAwMDAwKQotCQl7Ci0JCSAgbWFudCB8PSAweEZGMDAwMDAwOwotCQkgIG1hbnQgKz0gMHgwMDAwMDgwMDsKLQkJICBtYW50ID4+PSAxMjsKLQkJICBtYW50IHw9IDB4MDAwMDA4MDA7Ci0JCSAgbWFudCAmPSAweDBGRkY7Ci0JCSAgaWYgKGV4cCA+IDcpCi0JCSAgICB2YWx1ZSA9IDB4NzgwMDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG1hbnQgfD0gMHgwMDgwMDAwMDsKLQkJICBtYW50ICs9IDB4MDAwMDA4MDA7Ci0JCSAgZXhwICs9IChtYW50ID4+IDI0KTsKLQkJICBtYW50ID4+PSAxMjsKLQkJICBtYW50ICY9IDB4MDdGRjsKLQkJICBpZiAoZXhwID4gNykKLQkJICAgIHZhbHVlID0gMHg3N0ZGOwotCQl9Ci0JICAgICAgaWYgKGV4cCA8IC04KQotCQl2YWx1ZSA9IDB4ODAwMDsKLQkgICAgICBpZiAodmFsdWUgPT0gMCkKLQkJewotCQkgIG1hbnQgPSAoZXhwIDw8IDEyKSB8IG1hbnQ7Ci0JCSAgdmFsdWUgPSBtYW50ICYgMHhGRkZGOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdGVyYWxQLCB2YWx1ZSwgcHJlYyk7Ci0gICpzaXplUCA9IHByZWM7Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1tZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBkZWJ1ZyAoIkluIG1kX251bWJlcl90b19jaGFycygpXG4iKTsKLSAgbnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbiAoYnVmLCB2YWwsIG4pOwotICAvKiAgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbihidWYsdmFsLG4pOyAqLwotfQotCi0jZGVmaW5lIEYoU1osUENSRUwpCQkoKChTWikgPDwgMSkgKyAoUENSRUwpKQotI2RlZmluZSBNQVAoU1osUENSRUwsVFlQRSkJY2FzZSBGKFNaLFBDUkVMKTogY29kZSA9IChUWVBFKTsgYnJlYWsKLQotYXJlbGVudCAqCi10Y19nZW5fcmVsb2MgKHNlY3Rpb24sIGZpeFApCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBmaXhTICpmaXhQOwotewotICBhcmVsZW50ICpyZWw7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBjb2RlID0gMDsKLQotICBkZWJ1ZyAoIkluIHRjX2dlbl9yZWxvYygpXG4iKTsKLSAgZGVidWcgKCJmaXhQLnNpemUgPSAlZFxuIiwgZml4UC0+Znhfc2l6ZSk7Ci0gIGRlYnVnICgiZml4UC5wY3JlbCA9ICVkXG4iLCBmaXhQLT5meF9wY3JlbCk7Ci0gIGRlYnVnICgiYWRkc3kubmFtZSA9ICVzXG4iLCBTX0dFVF9OQU1FIChmaXhQLT5meF9hZGRzeSkpOwotICBzd2l0Y2ggKEYgKGZpeFAtPmZ4X3NpemUsIGZpeFAtPmZ4X3BjcmVsKSkKLSAgICB7Ci0gICAgICBNQVAgKDEsIDAsIEJGRF9SRUxPQ19USUMzMF9MRFApOwotICAgICAgTUFQICgyLCAwLCBCRkRfUkVMT0NfMTYpOwotICAgICAgTUFQICgzLCAwLCBCRkRfUkVMT0NfMjQpOwotICAgICAgTUFQICgyLCAxLCBCRkRfUkVMT0NfMTZfUENSRUwpOwotICAgICAgTUFQICg0LCAwLCBCRkRfUkVMT0NfMzIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKCJDYW4gbm90IGRvICVkIGJ5dGUgJXNyZWxvY2F0aW9uIiwgZml4UC0+Znhfc2l6ZSwKLQkgICAgICBmaXhQLT5meF9wY3JlbCA/ICJwYy1yZWxhdGl2ZSAiIDogIiIpOwotICAgIH0KLSN1bmRlZiBNQVAKLSN1bmRlZiBGCi0KLSAgcmVsID0gKGFyZWxlbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChhcmVsZW50KSk7Ci0gIGFzc2VydCAocmVsICE9IDApOwotICByZWwtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWwtPnN5bV9wdHJfcHRyID0gc3ltYm9sX2dldF9iZmRzeW0gKGZpeFAtPmZ4X2FkZHN5KTsKLSAgcmVsLT5hZGRyZXNzID0gZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlOwotICBpZiAoZml4UC0+ZnhfcGNyZWwpCi0gICAgcmVsLT5hZGRlbmQgPSBmaXhQLT5meF9hZGRudW1iZXI7Ci0gIGVsc2UKLSAgICByZWwtPmFkZGVuZCA9IDA7Ci0gIHJlbC0+aG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwgY29kZSk7Ci0gIGlmICghcmVsLT5ob3d0bykKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgbmFtZSA9IFNfR0VUX05BTUUgKGZpeFAtPmZ4X2FkZHN5KTsKLSAgICAgIGlmIChuYW1lID09IE5VTEwpCi0JbmFtZSA9ICI8dW5rbm93bj4iOwotICAgICAgYXNfZmF0YWwgKCJDYW5ub3QgZ2VuZXJhdGUgcmVsb2NhdGlvbiB0eXBlIGZvciBzeW1ib2wgJXMsIGNvZGUgJXMiLCBuYW1lLCBiZmRfZ2V0X3JlbG9jX2NvZGVfbmFtZSAoY29kZSkpOwotICAgIH0KLSAgcmV0dXJuIHJlbDsKLX0KLQotdm9pZAotdGNfYW91dF9wcmVfd3JpdGVfaG9vayAoKQotewotICBkZWJ1ZyAoIkluIHRjX2FvdXRfcHJlX3dyaXRlX2hvb2soKVxuIik7Ci19Ci0KLXZvaWQKLW1kX29wZXJhbmQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGRlYnVnICgiSW4gbWRfb3BlcmFuZCgpXG4iKTsKLX0KLQotY2hhciBvdXRwdXRfaW52YWxpZF9idWZbOF07Ci0KLWNoYXIgKgotb3V0cHV0X2ludmFsaWQgKGMpCi0gICAgIGNoYXIgYzsKLXsKLSAgaWYgKGlzcHJpbnQgKGMpKQotICAgIHNwcmludGYgKG91dHB1dF9pbnZhbGlkX2J1ZiwgIiclYyciLCBjKTsKLSAgZWxzZQotICAgIHNwcmludGYgKG91dHB1dF9pbnZhbGlkX2J1ZiwgIigweCV4KSIsICh1bnNpZ25lZCkgYyk7Ci0gIHJldHVybiBvdXRwdXRfaW52YWxpZF9idWY7Ci19CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzMwLmggYi9nYXMvY29uZmlnL3RjLXRpYzMwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzJkMmUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWMzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogdGMtdGljMzAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtdGljMzAuYwotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX1RDX1RJQzMwX0hfCi0jZGVmaW5lIF9UQ19USUMzMF9IXwotCi0jZGVmaW5lIFRDX1RJQzMwIDEKLQotI2lmZGVmIE9CSl9BT1VUCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImEub3V0LXRpYzMwIgotI2VuZGlmCi0KLSNkZWZpbmUgVEFSR0VUX0FSQ0gJCWJmZF9hcmNoX3RpYzMwCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOCTEKLQotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLWNoYXIgKm91dHB1dF9pbnZhbGlkIFBBUkFNUyAoKGludCBjKSk7Ci0KLSNkZWZpbmUgRU5EX09GX0lOU04gJ1wwJwotI2RlZmluZSBNQVhfT1BFUkFORFMgNgotI2RlZmluZSBESVJFQ1RfUkVGRVJFTkNFICdAJwotI2RlZmluZSBJTkRJUkVDVF9SRUZFUkVOQ0UgJyonCi0jZGVmaW5lIFBBUkFMTEVMX1NFUEFSQVRPUiAnfCcKLSNkZWZpbmUgSU5TTl9TSVpFIDQKLQotLyogRGVmaW5lIHRoaXMgdG8gMSBpZiB5b3Ugd2FudCB0aGUgZGVidWcgb3V0cHV0IHRvIGJlIG9uIHN0ZG91dCwKLSAgIG90aGVyd2lzZSBzdGRlcnIgd2lsbCBiZSB1c2VkLiAgSWYgc3RkZXJyIGlzIHVzZWQsIHRoZXJlIHdpbGwgYmUgYQotICAgYmV0dGVyIHN5bmNocm9uaXNhdGlvbiB3aXRoIHRoZSBhc19iYWQgb3V0cHV0cywgYnV0IHlvdSBjYW4ndAotICAgY2FwdHVyZSB0aGUgb3V0cHV0LiAqLwotI2RlZmluZSBVU0VfU1RET1VUIDAKLQotI2RlZmluZSB0Y191bnJlY29nbml6ZWRfbGluZSB0aWMzMF91bnJlY29nbml6ZWRfbGluZQotCi1leHRlcm4gaW50IHRpYzMwX3VucmVjb2duaXplZF9saW5lIFBBUkFNUyAoKGludCkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdGljODAuYyBiL2dhcy9jb25maWcvdGMtdGljODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxZGJhMy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXRpYzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYxICswLDAgQEAKLS8qIHRjLXRpYzgwLmMgLS0gQXNzZW1ibGUgZm9yIHRoZSBUSSBUTVMzMjBDODAgKE1WKQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKLQotI2RlZmluZSBpbnRlcm5hbF9lcnJvcih3aGF0KSBcCi0gIGFzX2ZhdGFsKF8oImludGVybmFsIGVycm9yOiVzOiVkOiAlc1xuIiksX19GSUxFX18sX19MSU5FX18sd2hhdCkKLSNkZWZpbmUgaW50ZXJuYWxfZXJyb3JfYSh3aGF0LGFyZykgXAotICBhc19mYXRhbChfKCJpbnRlcm5hbCBlcnJvcjolczolZDogJXMgJWRcbiIpLF9fRklMRV9fLF9fTElORV9fLHdoYXQsYXJnKQotCi0MCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyojIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtYXkgYmUgdXNlZCB0byBzZXBhcmF0ZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIHNpbmdsZQotICAgbGluZS4gVGhlIHNlbWljb2xvbiBpcyBzdWNoIGEgY2hhcmFjdGVyIGJ5IGRlZmF1bHQgYW5kIHNob3VsZCBub3QgYmUKLSAgIGV4cGxpY2l0bHkgbGlzdGVkLiAqLwotY29uc3QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIiI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZjEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImZGIjsKLQotLyogVGhpcyB0YWJsZSBkZXNjcmliZXMgYWxsIHRoZSBtYWNoaW5lIHNwZWNpZmljIHBzZXVkby1vcHMgdGhlIGFzc2VtYmxlcgotICAgaGFzIHRvIHN1cHBvcnQuICBUaGUgZmllbGRzIGFyZToKLQotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgaW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gKi8KLQotZXh0ZXJuIHZvaWQgb2JqX2NvZmZfc2VjdGlvbiAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyAiYWxpZ24iLAlzX2FsaWduX2J5dGVzLAkJNCB9LAkvKiBEbyBieXRlIGFsaWdubWVudCwgZGVmYXVsdCBpcyBhIDQgYnl0ZSBib3VuZGFyeSAqLwotICB7ICJ3b3JkIiwJY29ucywJCQk0IH0sCS8qIEZJWE1FOiBTaG91bGQgdGhpcyBiZSBtYWNoaW5lIGluZGVwZW5kZW50PyAqLwotICB7ICJic3MiLAlzX2xjb21tX2J5dGVzLAkJMSB9LAotICB7ICJzZWN0IiwJb2JqX2NvZmZfc2VjdGlvbiwJMH0sCS8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggVEkgdG9vbHMgKi8KLSAgeyAic2VjdGlvbiIsCW9ial9jb2ZmX3NlY3Rpb24sCTB9LAkvKiBTdGFuZGFyZCBDT0ZGIC5zZWN0aW9uIHBzZXVkby1vcCAqLwotICB7IE5VTEwsCU5VTEwsCQkJMCB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqdGljODBfaGFzaDsKLQotc3RhdGljIHN0cnVjdCB0aWM4MF9vcGNvZGUgKiBmaW5kX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgdGljODBfb3Bjb2RlICosIGV4cHJlc3Npb25TIFtdKSk7Ci1zdGF0aWMgdm9pZCBidWlsZF9pbnNuIFBBUkFNUyAoKHN0cnVjdCB0aWM4MF9vcGNvZGUgKiwgZXhwcmVzc2lvblMgKikpOwotc3RhdGljIGludCBnZXRfb3BlcmFuZHMgUEFSQU1TICgoZXhwcmVzc2lvblMgZXhwW10pKTsKLXN0YXRpYyBpbnQgY29uc3Rfb3ZlcmZsb3cgUEFSQU1TICgodW5zaWduZWQgbG9uZyBudW0sIGludCBiaXRzLCBpbnQgZmxhZ3MpKTsKLQotLyogUmVwbGFjZSBzaG9ydCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbnMgd2l0aCBsb25nIGZvcm0gd2hlbiBuZWNlc3NhcnkuICBDdXJyZW50bHkKLSAgIHRoaXMgaXMgb2ZmIGJ5IGRlZmF1bHQgb3Igd2hlbiBnaXZlbiB0aGUgLW5vLXJlbGF4IG9wdGlvbi4gIFR1cm5pbmcgaXQgb24gYnkgdXNpbmcKLSAgIHRoZSAtcmVsYXggb3B0aW9uIGZvcmNlcyBhbGwgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIHRvIHVzZSB0aGUgbG9uZyBmb3JtLCB3aGljaAotICAgaXMgd2h5IGl0IGlzIGN1cnJlbnRseSBub3QgdGhlIGRlZmF1bHQuICovCi1zdGF0aWMgaW50IHRpYzgwX3JlbGF4ID0gMDsKLQotDAotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgZnJhZ1MgKmZyYWdQOwotICAgICBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgaW50ZXJuYWxfZXJyb3IgKF8oIlJlbGF4YXRpb24gaXMgYSBsdXh1cnkgd2UgY2FuJ3QgYWZmb3JkIikpOwotICByZXR1cm4gKC0xKTsKLX0KLQotLyogV2UgaGF2ZSBubyBuZWVkIHRvIGRlZmF1bHQgdmFsdWVzIG9mIHN5bWJvbHMuICAqLwotCi0vKiBBUkdTVVNFRCAqLwotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICByZXR1cm4gMDsKLX0KLQotLyogVHVybiBhIHN0cmluZyBpbiBpbnB1dF9saW5lX3BvaW50ZXIgaW50byBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IG9mIHR5cGUKLSAgIHR5cGUsIGFuZCBzdG9yZSB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgaW4gKmxpdFAuICBUaGUgbnVtYmVyIG9mIExJVFRMRU5VTVMKLSAgIGVtaXR0ZWQgaXMgc3RvcmVkIGluICpzaXplUCAuICBBbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLCBvciBOVUxMIG9uIE9LLgotICovCi0KLSNkZWZpbmUgTUFYX0xJVFRMRU5VTVMgNAotCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqbGl0UDsKLSAgICAgaW50ICpzaXplUDsKLXsKLSAgaW50IHByZWM7Ci0gIExJVFRMRU5VTV9UWVBFIHdvcmRzW01BWF9MSVRUTEVOVU1TXTsKLSAgTElUVExFTlVNX1RZUEUgKndvcmRQOwotICBjaGFyICp0OwotICBjaGFyICphdG9mX2llZWUgKCk7Ci0gIAotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YgKCkiKTsKLSAgICB9Ci0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0gICAgfQotICAKLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAKLSAgZm9yICh3b3JkUCA9IHdvcmRzOyBwcmVjLS07KQotICAgIHsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAobGl0UCwgKHZhbHVlVCkgKCp3b3JkUCsrKSwgc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSkpOwotICAgICAgbGl0UCArPSBzaXplb2YgKExJVFRMRU5VTV9UWVBFKTsKLSAgICB9Ci0gIHJldHVybiAoTlVMTCk7Ci19Ci0KLS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgY29uc3RhbnQgdmFsdWUgaW4gTlVNIHdpbGwgZml0IGluIGEgZmllbGQgb2YKLSAgIHdpZHRoIEJJVFMgaWYgaXQgaGFzIGZsYWdzIEZMQUdTLiAqLwotCi1zdGF0aWMgaW50Ci1jb25zdF9vdmVyZmxvdyAobnVtLCBiaXRzLCBmbGFncykKLSAgICAgdW5zaWduZWQgbG9uZyBudW07Ci0gICAgIGludCBiaXRzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGxvbmcgbWluLCBtYXg7Ci0gIGludCByZXR2YWwgPSAwOwotCi0gIC8qIE9ubHkgbmVlZCB0byBjaGVjayBmaWVsZHMgbGVzcyB0aGFuIDMyIGJpdHMgd2lkZSAqLwotICBpZiAoYml0cyA8IDMyKQotICAgIGlmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKQotICAgICAgewotCW1heCA9ICgxIDw8IChiaXRzIC0gMSkpIC0gMTsgCi0JbWluID0gLSAoMSA8PCAoYml0cyAtIDEpKTsgIAotCXJldHZhbCA9ICgobG9uZykgbnVtID4gbWF4KSB8fCAoKGxvbmcpIG51bSA8IG1pbik7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCW1heCA9ICgxIDw8IGJpdHMpIC0gMTsKLQltaW4gPSAwOwotCXJldHZhbCA9IChudW0gPiBtYXgpIHx8IChudW0gPCBtaW4pOwotICAgICAgfQotICByZXR1cm4gKHJldHZhbCk7Ci19Ci0KLS8qIGdldF9vcGVyYW5kcygpIHBhcnNlcyBhIHN0cmluZyBvZiBvcGVyYW5kcyBhbmQgZmlsbHMgaW4gYSBwYXNzZWQgYXJyYXkgb2YKLSAgIGV4cHJlc3Npb25zIGluIEVYUC4KLQotICAgTm90ZSB0aGF0IHdlIHVzZSBPX2Fic2VudCBleHByZXNzaW9ucyB0byByZWNvcmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgYWJvdXQgdGhlIHByZXZpb3VzIG5vbi1PX2Fic2VudCBleHByZXNzaW9uLCBzdWNoIGFzICI6bSIgb3IgIjpzIgotICAgbW9kaWZpZXJzIG9yIHJlZ2lzdGVyIG51bWJlcnMgZW5jbG9zZWQgaW4gcGFyZW5zIGxpa2UgIihyMTApIi4KLQotICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIHRoYXQgd2VyZSBwbGFjZWQgaW4gRVhQLgotCi0gICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfb3BlcmFuZHMgKGV4cCkgCi0gICAgIGV4cHJlc3Npb25TIGV4cFtdOwotewotICBjaGFyICpwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnQgbnVtZXhwID0gMDsKLSAgaW50IG1mbGFnID0gMDsKLSAgaW50IHNmbGFnID0gMDsKLSAgaW50IHBhcmVucyA9IDA7Ci0KLSAgd2hpbGUgKCpwKSAgCi0gICAgewotICAgICAgLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnLCcpIAotCXsKLQkgIHArKzsKLQl9Ci0KLSAgICAgIC8qIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGFueSBvcGVyYW5kcyBsZWZ0IHRvIHBhcnNlICovCi0gICAgICBpZiAoKnAgPT0gMCB8fCAqcCA9PSAnXG4nIHx8ICpwID09ICdccicpIAotCXsKLQkgIGJyZWFrOwotCX0KLSAgICAgIAotICAgICAgLyogTm90aWNlIHNjYWxpbmcgb3IgZGlyZWN0IG1lbW9yeSBvcGVyYW5kIG1vZGlmaWVycyBhbmQgc2F2ZSB0aGVtIGluCi0JIGFuIE9fYWJzZW50IGV4cHJlc3Npb24gYWZ0ZXIgdGhlIGV4cHJlc3Npb24gdGhhdCB0aGV5IG1vZGlmeS4gKi8KLQotICAgICAgaWYgKCpwID09ICc6JykgCi0JewotCSAgcCsrOwotCSAgZXhwW251bWV4cF0uWF9vcCA9IE9fYWJzZW50OwotCSAgaWYgKCpwID09ICdtJykgCi0JICAgIHsKLQkgICAgICBwKys7Ci0JICAgICAgLyogVGhpcyBpcyBhICI6bSIgbW9kaWZpZXIgKi8KLQkgICAgICBleHBbbnVtZXhwXS5YX2FkZF9udW1iZXIgPSBUSUM4MF9PUEVSQU5EX01fU0kgfCBUSUM4MF9PUEVSQU5EX01fTEk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCpwID09ICdzJykKLQkgICAgewotCSAgICAgIHArKzsKLQkgICAgICAvKiBUaGlzIGlzIGEgIjpzIiBtb2RpZmllciAqLwotCSAgICAgIGV4cFtudW1leHBdLlhfYWRkX251bWJlciA9IFRJQzgwX09QRVJBTkRfU0NBTEVEOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIic6JyBub3QgZm9sbG93ZWQgYnkgJ20nIG9yICdzJyIpKTsKLQkgICAgfQotCSAgbnVtZXhwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEhhbmRsZSBsZWFkaW5nICcoJyBvbiBvcGVyYW5kcyB0aGF0IHVzZSB0aGVtLCBieSByZWNvcmRpbmcgdGhhdCB3ZQotCSBoYXZlIGVudGVyZWQgYSBwYXJlbiBuZXN0aW5nIGxldmVsIGFuZCB0aGVuIGNvbnRpbnVpbmcuICBXZSBjb21wbGFpbgotCSBhYm91dCBtdWx0aXBsZSBuZXN0aW5nLiAqLwotCi0gICAgICBpZiAoKnAgPT0gJygnKQotCXsKLQkgIGlmICgrK3BhcmVucyAhPSAxKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJwYXJlbiBuZXN0aW5nIikpOwotCSAgICB9Ci0JICBwKys7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIEhhbmRsZSB0cmFpbGluZyAnKScgb24gb3BlcmFuZHMgdGhhdCB1c2UgdGhlbSwgYnkgcmVkdWNpbmcgdGhlCi0JIG5lc3RpbmcgbGV2ZWwgYW5kIHRoZW4gY29udGludWluZy4gIFdlIGNvbXBsYWluIGlmIHRoZXJlIHdlcmUgdG9vCi0JIG1hbnkgY2xvc3VyZXMuICovCi0KLSAgICAgIGlmICgqcCA9PSAnKScpIAotCXsKLQkgIC8qIFJlY29yZCB0aGF0IHdlIGhhdmUgbGVmdCBhIHBhcmVuIGdyb3VwIGFuZCBjb250aW51ZSAqLwotCSAgaWYgKC0tcGFyZW5zIDwgMCkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygibWlzbWF0Y2hlZCBwYXJlbnRoZXNpcyIpKTsKLQkgICAgfQotCSAgcCsrOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBCZWdpbiBvcGVyYW5kIHBhcnNpbmcgYXQgdGhlIGN1cnJlbnQgc2NhbiBwb2ludC4gKi8KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gcDsKLSAgICAgIGV4cHJlc3Npb24gKCZleHBbbnVtZXhwXSk7Ci0KLSAgICAgIGlmIChleHBbbnVtZXhwXS5YX29wID09IE9faWxsZWdhbCkKLQl7Ci0JICBhc19iYWQgKF8oImlsbGVnYWwgb3BlcmFuZCIpKTsKLQl9Ci0gICAgICBlbHNlIGlmIChleHBbbnVtZXhwXS5YX29wID09IE9fYWJzZW50KQotCXsKLQkgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotCX0KLQotICAgICAgbnVtZXhwKys7Ci0gICAgICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBpZiAocGFyZW5zKQotICAgIHsKLSAgICAgIGV4cFtudW1leHBdLlhfb3AgPSBPX2Fic2VudDsKLSAgICAgIGV4cFtudW1leHArK10uWF9hZGRfbnVtYmVyID0gVElDODBfT1BFUkFORF9QQVJFTlM7Ci0gICAgfQotCi0gIC8qIE1hcmsgdGhlIGVuZCBvZiB0aGUgdmFsaWQgb3BlcmFuZHMgd2l0aCBhbiBpbGxlZ2FsIGV4cHJlc3Npb24uICovCi0gIGV4cFtudW1leHBdLlhfb3AgPSBPX2lsbGVnYWw7Ci0KLSAgcmV0dXJuIChudW1leHApOwotfQotCi0vKiBmaW5kX29wY29kZSgpIGdldHMgYSBwb2ludGVyIHRvIHRoZSBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlIHRoYXQKLSAgIG1hdGNoZXMgdGhlIGluc3RydWN0aW9uIGJlaW5nIGFzc2VtYmxlZCwgb3IgcmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggbWF0Y2gKLSAgIGlzIGZvdW5kLgotCi0gICBGaXJzdCBpdCBwYXJzZXMgYWxsIHRoZSBvcGVyYW5kcyBhbmQgc2F2ZSB0aGVtIGFzIGV4cHJlc3Npb25zLiAgTm90ZSB0aGF0Ci0gICB3ZSB1c2UgT19hYnNlbnQgZXhwcmVzc2lvbnMgdG8gcmVjb3JkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0gICBwcmV2aW91cyBub24tT19hYnNlbnQgZXhwcmVzc2lvbiwgc3VjaCBhcyAiOm0iIG9yICI6cyIgbW9kaWZpZXJzIG9yCi0gICByZWdpc3RlciBudW1iZXJzIGVuY2xvc2VkIGluIHBhcmVucyBsaWtlICIocjEwKSIuCi0KLSAgIEl0IHRoZW4gbG9va3MgYXQgYWxsIG9wY29kZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCB1c2VzIHRoZSBvcGVyYW5kcyB0bwotICAgY2hvb3NlIHRoZSBjb3JyZWN0IG9wY29kZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgdGljODBfb3Bjb2RlICoKLWZpbmRfb3Bjb2RlIChvcGNvZGUsIG15b3BzKQotICAgICBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TIG15b3BzW107Ci17Ci0gIGludCBudW1leHA7CQkJCS8qIE51bWJlciBvZiBleHByZXNzaW9ucyBmcm9tIHBhcnNpbmcgb3BlcmFuZHMgKi8KLSAgaW50IGV4cGk7CQkJCS8qIEluZGV4IG9mIGN1cnJlbnQgZXhwcmVzc2lvbiB0byBtYXRjaCAqLwotICBpbnQgb3BpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IG9wZXJhbmQgdG8gbWF0Y2ggKi8KLSAgaW50IG1hdGNoID0gMDsJCQkvKiBTZXQgdG8gMSB3aGVuIGFuIG9wZXJhbmQgbWF0Y2ggaXMgZm91bmQgKi8KLSAgc3RydWN0IHRpYzgwX29wY29kZSAqb3BjID0gb3Bjb2RlOwkvKiBQb2ludGVyIHRvIGN1cnJlbnQgb3Bjb2RlIHRhYmxlIGVudHJ5ICovCi0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKmVuZDsJLyogUG9pbnRlciB0byBlbmQgb2Ygb3Bjb2RlIHRhYmxlICovCi0KLSAgLyogRmlyc3QgcGFyc2UgYWxsIHRoZSBvcGVyYW5kcyBzbyB3ZSBvbmx5IGhhdmUgdG8gZG8gaXQgb25jZS4gIFRoZXJlIG1heQotICAgICBiZSBtb3JlIGV4cHJlc3Npb25zIGdlbmVyYXRlZCB0aGFuIHRoZXJlIGFyZSBvcGVyYW5kcy4gKi8KLQotICBudW1leHAgPSBnZXRfb3BlcmFuZHMgKG15b3BzKTsKLQotICAvKiBGb3IgZWFjaCBvcGNvZGUgd2l0aCB0aGUgc2FtZSBuYW1lLCB0cnkgdG8gbWF0Y2ggaXQgYWdhaW5zdCB0aGUgcGFyc2VkCi0gICAgIG9wZXJhbmRzLiAqLwotCi0gIGVuZCA9IHRpYzgwX29wY29kZXMgKyB0aWM4MF9udW1fb3Bjb2RlczsKLSAgd2hpbGUgKCFtYXRjaCAmJiAob3BjIDwgZW5kKSAmJiAoc3RyY21wIChvcGMgLT4gbmFtZSwgb3Bjb2RlIC0+IG5hbWUpID09IDApKQotICAgIHsKLSAgICAgIC8qIFN0YXJ0IG9mZiBhc3N1bWluZyBhIG1hdGNoLiAgSWYgd2UgZmluZCBhIG1pc21hdGNoLCB0aGVuIHRoaXMgaXMKLQkgcmVzZXQgYW5kIHRoZSBvcGVyYW5kL2V4cHIgbWF0Y2hpbmcgbG9vcCB0ZXJtaW5hdGVzIHdpdGggbWF0Y2gKLQkgZXF1YWwgdG8gemVybywgd2hpY2ggYWxsb3dzIHVzIHRvIHRyeSB0aGUgbmV4dCBvcGNvZGUuICovCi0KLSAgICAgIG1hdGNoID0gMTsKLQotICAgICAgLyogRm9yIGVhY2ggZXhwcmVzc2lvbiwgdHJ5IHRvIG1hdGNoIGl0IGFnYWluc3QgdGhlIGN1cnJlbnQgb3BlcmFuZAotCSBmb3IgdGhlIGN1cnJlbnQgb3Bjb2RlLiAgVXBvbiBhbnkgbWlzbWF0Y2gsIHdlIGFiYW5kb24gZnVydGhlcgotCSBtYXRjaGluZyBmb3IgdGhlIGN1cnJlbnQgb3Bjb2RlIHRhYmxlIGVudHJ5LiAgKi8KLQotICAgICAgZm9yIChleHBpID0gMCwgb3BpID0gLTE7IChleHBpIDwgbnVtZXhwKSAmJiBtYXRjaDsgZXhwaSsrKQotCXsKLQkgIGludCBiaXRzLCBmbGFncywgWF9vcCwgbnVtOwotCi0JICBYX29wID0gbXlvcHNbZXhwaV0uWF9vcDsKLQkgIG51bSA9IG15b3BzW2V4cGldLlhfYWRkX251bWJlcjsKLQotCSAgLyogVGhlIE9fYWJzZW50IGV4cHJlc3Npb25zIGFwcGx5IHRvIHRoZSBzYW1lIG9wZXJhbmQgYXMgdGhlIG1vc3QKLQkgICAgIHJlY2VudCBub24gT19hYnNlbnQgZXhwcmVzc2lvbi4gIFNvIG9ubHkgaW5jcmVtZW50IHRoZSBvcGVyYW5kCi0JICAgICBpbmRleCB3aGVuIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgbm90IG9uZSBvZiB0aGVzZSBzcGVjaWFsCi0JICAgICBleHByZXNzaW9ucy4gKi8KLQotCSAgaWYgKFhfb3AgIT0gT19hYnNlbnQpCi0JICAgIHsKLQkgICAgICBvcGkrKzsKLQkgICAgfQotCi0JICBmbGFncyA9IHRpYzgwX29wZXJhbmRzW29wYyAtPiBvcGVyYW5kc1tvcGldXS5mbGFnczsKLQkgIGJpdHMgPSB0aWM4MF9vcGVyYW5kc1tvcGMgLT4gb3BlcmFuZHNbb3BpXV0uYml0czsKLQotCSAgc3dpdGNoIChYX29wKQotCSAgICB7Ci0JICAgIGNhc2UgT19yZWdpc3RlcjoKLQkgICAgICAvKiBBbHNvIGNoZWNrIHRoYXQgcmVnaXN0ZXJzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGV2ZW4gYWN0dWFsbHkKLQkJIGFyZSBldmVuLiAqLwotCSAgICAgIGlmICgoKGZsYWdzICYgVElDODBfT1BFUkFORF9HUFIpICE9IChudW0gJiBUSUM4MF9PUEVSQU5EX0dQUikpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRlBBKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9GUEEpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9DUikpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRVZFTikgJiYgKG51bSAmIDEpKSB8fAotCQkgIGNvbnN0X292ZXJmbG93IChudW0gJiB+VElDODBfT1BFUkFORF9NQVNLLCBiaXRzLCBmbGFncykpCi0JCXsKLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2NvbnN0YW50OgotCSAgICAgIGlmICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0VORE1BU0spICYmIChudW0gPT0gMzIpKQotCQl7Ci0JCSAgLyogRW5kbWFzayB2YWx1ZXMgb2YgMCBhbmQgMzIgZ2l2ZSBpZGVudGljYWwgcmVzdWx0cyAqLwotCQkgIG51bSA9IDA7Ci0JCX0KLQkgICAgICBpZiAoKGZsYWdzICYgKFRJQzgwX09QRVJBTkRfRlBBIHwgVElDODBfT1BFUkFORF9HUFIpKSB8fAotCQkgIGNvbnN0X292ZXJmbG93IChudW0sIGJpdHMsIGZsYWdzKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fc3ltYm9sOgotCSAgICAgIGlmICgoYml0cyA8IDMyKSAmJiAoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BDUkVMKSAmJiAhdGljODBfcmVsYXgpCi0JCXsKLQkJICAvKiBUaGUgZGVmYXVsdCBpcyB0byBwcmVmZXIgdGhlIHNob3J0IGZvcm0gb2YgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JCSAgICAgVGhpcyBpcyB0aGUgb25seSBmb3JtIHRoYXQgdGhlIFRJIGFzc2VtYmxlciBzdXBwb3J0cy4KLQkJICAgICBJZiB0aGUgLXJlbGF4IG9wdGlvbiBpcyBnaXZlbiwgd2UgbmV2ZXIgdXNlIHRoZSBzaG9ydCBmb3Jtcy4KLQkJICAgICBGSVhNRTogU2hvdWxkIGJlIGFibGUgdG8gY2hvb3NlICJiZXN0LWZpdCIuICovCi0JCX0KLQkgICAgICBlbHNlIGlmICgoYml0cyA9PSAzMikgLyogJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9CQVNFUkVMKSAqLykKLQkJewotCQkgIC8qIFRoZSBkZWZhdWx0IGlzIHRvIHByZWZlciB0aGUgbG9uZyBmb3JtIG9mIGJhc2UgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JCSAgICAgVGhpcyBpcyB0aGUgb25seSBmb3JtIHRoYXQgdGhlIFRJIGFzc2VtYmxlciBzdXBwb3J0cy4KLQkJICAgICBJZiB0aGUgLW5vLXJlbGF4IG9wdGlvbiBpcyBnaXZlbiwgd2UgYWx3YXlzIHVzZSB0aGUgbG9uZyBmb3JtIG9mCi0JCSAgICAgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbnMuCi0JCSAgICAgRklYTUU6IFNob3VsZCBiZSBhYmxlIHRvIGNob29zZSAiYmVzdC1maXQiLiAqLwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogU3ltYm9scyB0aGF0IGRvbid0IG1hdGNoIG9uZSBvZiB0aGUgYWJvdmUgY2FzZXMgYXJlCi0JCSAgICAgcmVqZWN0ZWQgYXMgYW4gb3BlcmFuZC4gKi8KLQkJICBtYXRjaCA9IDA7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2Fic2VudDoKLQkgICAgICAvKiBJZiB0aGlzIGlzIGFuIE9fYWJzZW50IGV4cHJlc3Npb24sIHRoZW4gaXQgbWF5IGJlIGFuIGV4cHJlc3Npb24gdGhhdAotCQkgc3VwcGxpZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3BlcmFuZCwgc3VjaCBhcyAiOm0iIG9yCi0JCSAiOnMiIG1vZGlmaWVycy4gQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIG9wZXJhbmQgbWF0Y2hlcyB0aGlzIHJlcXVpcmVtZW50LiAqLwotCSAgICAgIGlmICghKChudW0gJiBUSUM4MF9PUEVSQU5EX01fU0kpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9TSSkgfHwKLQkJICAgIChudW0gJiBUSUM4MF9PUEVSQU5EX01fTEkpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkgfHwKLQkJICAgIChudW0gJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9TQ0FMRUQpKSkKLQkJewotCQkgIG1hdGNoID0gMDsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fYmlnOgotCSAgICAgIGlmICgobnVtID4gMCkgfHwgIShmbGFncyAmIFRJQzgwX09QRVJBTkRfRkxPQVQpKQotCQl7Ci0JCSAgbWF0Y2ggPSAwOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19pbGxlZ2FsOgotCSAgICBjYXNlIE9fc3ltYm9sX3J2YToKLQkgICAgY2FzZSBPX3VtaW51czoKLQkgICAgY2FzZSBPX2JpdF9ub3Q6Ci0JICAgIGNhc2UgT19sb2dpY2FsX25vdDoKLQkgICAgY2FzZSBPX211bHRpcGx5OgotCSAgICBjYXNlIE9fZGl2aWRlOgotCSAgICBjYXNlIE9fbW9kdWx1czoKLQkgICAgY2FzZSBPX2xlZnRfc2hpZnQ6Ci0JICAgIGNhc2UgT19yaWdodF9zaGlmdDoKLQkgICAgY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6Ci0JICAgIGNhc2UgT19iaXRfb3Jfbm90OgotCSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoKLQkgICAgY2FzZSBPX2JpdF9hbmQ6Ci0JICAgIGNhc2UgT19hZGQ6Ci0JICAgIGNhc2UgT19zdWJ0cmFjdDoKLQkgICAgY2FzZSBPX2VxOgotCSAgICBjYXNlIE9fbmU6Ci0JICAgIGNhc2UgT19sdDoKLQkgICAgY2FzZSBPX2xlOgotCSAgICBjYXNlIE9fZ2U6Ci0JICAgIGNhc2UgT19ndDoKLQkgICAgY2FzZSBPX2xvZ2ljYWxfYW5kOgotCSAgICBjYXNlIE9fbG9naWNhbF9vcjoKLQkgICAgY2FzZSBPX21heDoKLQkgICAgZGVmYXVsdDoKLQkgICAgICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgZXhwcmVzc2lvbiB0eXBlIiksIFhfb3ApOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCFtYXRjaCkKLQl7Ci0JICBvcGMrKzsKLQl9Ci0gICAgfSAgCi0KLSAgcmV0dXJuIChtYXRjaCA/IG9wYyA6IE5VTEwpOwotCi0jaWYgMAotCi0gIC8qIE5vdyBzZWFyY2ggdGhlIG9wY29kZSB0YWJsZSB0YWJsZSBmb3Igb25lIHdpdGggb3BlcmFuZHMgdGhhdAotICAgICBtYXRjaGVzIHdoYXQgd2UndmUgZ290LiAqLwotCi0gIHdoaWxlICghbWF0Y2gpCi0gICAgewotICAgICAgbWF0Y2ggPSAxOwotICAgICAgZm9yIChpID0gMDsgb3Bjb2RlIC0+IG9wZXJhbmRzW2ldOyBpKyspIAotCXsKLQkgIGludCBmbGFncyA9IHRpYzgwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzOwotCSAgaW50IFhfb3AgPSBteW9wc1tpXS5YX29wOwotCSAgaW50IG51bSA9IG15b3BzW2ldLlhfYWRkX251bWJlcjsKLQotCSAgaWYgKFhfb3AgPT0gMCkgCi0JICAgIHsKLQkgICAgICBtYXRjaCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgICAgICAKLQkgIGlmIChmbGFncyAmIChUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRlBBIHwgVElDODBfT1BFUkFORF9DUikpIAotCSAgICB7Ci0JICAgICAgaWYgKChYX29wICE9IE9fcmVnaXN0ZXIpIHx8Ci0JCSAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfR1BSKSAhPSAobnVtICYgVElDODBfT1BFUkFORF9HUFIpKSB8fAotCQkgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0ZQQSkgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfRlBBKSkgfHwKLQkJICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gKG51bSAmIFRJQzgwX09QRVJBTkRfQ1IpKSkKLQkJewotCQkgIG1hdGNoPTA7Ci0JCSAgYnJlYWs7Ci0JCX0JICAKLQkgICAgfQotCSAgICAgIAotCSAgaWYgKCgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX01JTlVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9NSU5VUykpKSB8fAotCSAgICAgICgoZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1BMVVMpICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX1BMVVMpKSkgfHwKLQkgICAgICAoKGZsYWdzICYgVElDODBfT1BFUkFORF9BVE1JTlVTKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9BVE1JTlVTKSkpIHx8Ci0JICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQVRQQVIpICYmICgoWF9vcCAhPSBPX2Fic2VudCkgfHwgKG51bSAhPSBUSUM4MF9PUEVSQU5EX0FUUEFSKSkpIHx8Ci0JICAgICAgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfQVRTSUdOKSAmJiAoKFhfb3AgIT0gT19hYnNlbnQpIHx8IChudW0gIT0gVElDODBfT1BFUkFORF9BVFNJR04pKSkpIAotCSAgICB7Ci0JICAgICAgbWF0Y2g9MDsKLQkgICAgICBicmVhazsKLQkgICAgfQkgICAgICAKLQl9Ci0gICAgICAvKiB3ZSdyZSBvbmx5IGRvbmUgaWYgdGhlIG9wZXJhbmRzIG1hdGNoZWQgc28gZmFyIEFORCB0aGVyZQotCSBhcmUgbm8gbW9yZSB0byBjaGVjayAqLwotICAgICAgaWYgKG1hdGNoICYmIG15b3BzW2ldLlhfb3A9PTApIAotCWJyZWFrOwotICAgICAgZWxzZQotCW1hdGNoID0gMDsKLQotICAgICAgbmV4dF9vcGNvZGUgPSBvcGNvZGUrMTsKLSAgICAgIGlmIChuZXh0X29wY29kZS0+b3Bjb2RlID09IDApIAotCWJyZWFrOwotICAgICAgaWYgKHN0cmNtcChuZXh0X29wY29kZS0+bmFtZSwgb3Bjb2RlLT5uYW1lKSkKLQlicmVhazsKLSAgICAgIG9wY29kZSA9IG5leHRfb3Bjb2RlOwotICAgIH0KLQotICBpZiAoIW1hdGNoKSAgCi0gICAgewotICAgICAgYXNfYmFkIChfKCJiYWQgb3Bjb2RlIG9yIG9wZXJhbmRzIikpOwotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCBhbGwgcmVnaXN0ZXJzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGJlIGV2ZW4gYXJlLiAqLwotICAvKiBBbHNvLCBpZiBhbnkgb3BlcmFuZHMgd2VyZSBtYXJrZWQgYXMgcmVnaXN0ZXJzLCBidXQgd2VyZSByZWFsbHkgc3ltYm9scyAqLwotICAvKiBmaXggdGhhdCBoZXJlLiAqLwotICBmb3IgKGk9MDsgb3Bjb2RlLT5vcGVyYW5kc1tpXTsgaSsrKSAKLSAgICB7Ci0gICAgICBpZiAoKHRpYzgwX29wZXJhbmRzW29wY29kZS0+b3BlcmFuZHNbaV1dLmZsYWdzICYgVElDODBfT1BFUkFORF9FVkVOKSAmJgotCSAgKG15b3BzW2ldLlhfYWRkX251bWJlciAmIDEpKSAKLQlhc19mYXRhbCAoXygiUmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgRVZFTiIpKTsKLSAgICAgIGlmIChteW9wc1tpXS5YX29wID09IE9fcmVnaXN0ZXIpCi0JewotCSAgaWYgKCEodGljODBfb3BlcmFuZHNbb3Bjb2RlLT5vcGVyYW5kc1tpXV0uZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1JFRykpIAotCSAgICB7Ci0JICAgICAgbXlvcHNbaV0uWF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIG15b3BzW2ldLlhfYWRkX3N5bWJvbCA9IHN5bWJvbF9maW5kX29yX21ha2UgKChjaGFyICopbXlvcHNbaV0uWF9vcF9zeW1ib2wpOwotCSAgICAgIG15b3BzW2ldLlhfYWRkX251bWJlciA9IDA7Ci0JICAgICAgbXlvcHNbaV0uWF9vcF9zeW1ib2wgPSBOVUxMOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2VuZGlmCi19Ci0KLS8qIGJ1aWxkX2luc24gdGFrZXMgYSBwb2ludGVyIHRvIHRoZSBvcGNvZGUgZW50cnkgaW4gdGhlIG9wY29kZSB0YWJsZQotICAgYW5kIHRoZSBhcnJheSBvZiBvcGVyYW5kIGV4cHJlc3Npb25zIGFuZCB3cml0ZXMgb3V0IHRoZSBpbnN0cnVjdGlvbi4KLQotICAgTm90ZSB0aGF0IHRoZSBvcGNvZGUgd29yZCBhbmQgZXh0ZW5kZWQgd29yZCBtYXkgYmUgd3JpdHRlbiB0byBkaWZmZXJlbnQKLSAgIGZyYWdzLCB3aXRoIHRoZSBvcGNvZGUgYXQgdGhlIGVuZCBvZiBvbmUgZnJhZyBhbmQgdGhlIGV4dGVuc2lvbiBhdCB0aGUKLSAgIGJlZ2lubmluZyBvZiB0aGUgbmV4dC4gKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2luc24gKG9wY29kZSwgb3BlcnMpIAotICAgICBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gICAgIGV4cHJlc3Npb25TICpvcGVyczsKLXsKLSAgaW50IGV4cGk7CQkJCS8qIEluZGV4IG9mIGN1cnJlbnQgZXhwcmVzc2lvbiB0byBtYXRjaCAqLwotICBpbnQgb3BpOwkJCQkvKiBJbmRleCBvZiBjdXJyZW50IG9wZXJhbmQgdG8gbWF0Y2ggKi8KLSAgdW5zaWduZWQgbG9uZyBpbnNuWzJdOwkJLyogSW5zdHJ1Y3Rpb24gYW5kIGxvbmcgaW1tZWRpYXRlIChpZiBhbnkpICovCi0gIGNoYXIgKmY7CQkJCS8qIFBvaW50ZXIgdG8gZnJhZyBsb2NhdGlvbiBmb3IgaW5zblswXSAqLwotICBmcmFnUyAqZmZyYWc7CQkJCS8qIEZyYWcgY29udGFpbmluZyBsb2NhdGlvbiBmICovCi0gIGNoYXIgKmZ4ID0gTlVMTDsJCQkvKiBQb2ludGVyIHRvIGZyYWcgbG9jYXRpb24gZm9yIGluc25bMV0gKi8KLSAgZnJhZ1MgKmZ4ZnJhZzsJCQkvKiBGcmFnIGNvbnRhaW5pbmcgbG9jYXRpb24gZnggKi8KLQotICAvKiBTdGFydCB3aXRoIHRoZSByYXcgb3Bjb2RlIGJpdHMgZnJvbSB0aGUgb3Bjb2RlIHRhYmxlLiAqLwotICBpbnNuWzBdID0gb3Bjb2RlIC0+IG9wY29kZTsKLQotICAvKiBXZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGF0IGxlYXN0IG9uZSAzMiBiaXQgb3Bjb2RlIHNvIGdldCB0aGUKLSAgICAgZnJhZyBub3cuICovCi0KLSAgZiA9IGZyYWdfbW9yZSAoNCk7Ci0gIGZmcmFnID0gZnJhZ19ub3c7Ci0KLSAgLyogRm9yIGVhY2ggb3BlcmFuZCBleHByZXNzaW9uLCBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW50byB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gLiAqLwotICBmb3IgKGV4cGkgPSAwLCBvcGkgPSAtMTsgb3BlcnNbZXhwaV0uWF9vcCAhPSBPX2lsbGVnYWw7IGV4cGkrKykKLSAgICB7Ci0gICAgICBpbnQgYml0cywgc2hpZnQsIGZsYWdzLCBYX29wLCBudW07Ci0KLSAgICAgIFhfb3AgPSBvcGVyc1tleHBpXS5YX29wOwotICAgICAgbnVtID0gb3BlcnNbZXhwaV0uWF9hZGRfbnVtYmVyOwotCi0gICAgICAvKiBUaGUgT19hYnNlbnQgZXhwcmVzc2lvbnMgYXBwbHkgdG8gdGhlIHNhbWUgb3BlcmFuZCBhcyB0aGUgbW9zdAotCSByZWNlbnQgbm9uIE9fYWJzZW50IGV4cHJlc3Npb24uICBTbyBvbmx5IGluY3JlbWVudCB0aGUgb3BlcmFuZAotCSBpbmRleCB3aGVuIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gaXMgbm90IG9uZSBvZiB0aGVzZSBzcGVjaWFsCi0JIGV4cHJlc3Npb25zLiAqLwotCi0gICAgICBpZiAoWF9vcCAhPSBPX2Fic2VudCkKLQl7Ci0JICBvcGkrKzsKLQl9Ci0KLSAgICAgIGZsYWdzID0gdGljODBfb3BlcmFuZHNbb3Bjb2RlIC0+IG9wZXJhbmRzW29waV1dLmZsYWdzOwotICAgICAgYml0cyA9IHRpYzgwX29wZXJhbmRzW29wY29kZSAtPiBvcGVyYW5kc1tvcGldXS5iaXRzOwotICAgICAgc2hpZnQgPSB0aWM4MF9vcGVyYW5kc1tvcGNvZGUgLT4gb3BlcmFuZHNbb3BpXV0uc2hpZnQ7Ci0KLSAgICAgIHN3aXRjaCAoWF9vcCkKLQl7Ci0JY2FzZSBPX3JlZ2lzdGVyOgotCSAgbnVtICY9IH5USUM4MF9PUEVSQU5EX01BU0s7Ci0JICBpbnNuWzBdID0gaW5zblswXSB8IChudW0gPDwgc2hpZnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBPX2NvbnN0YW50OgotCSAgaWYgKChmbGFncyAmIFRJQzgwX09QRVJBTkRfRU5ETUFTSykgJiYgKG51bSA9PSAzMikpCi0JICAgIHsKLQkgICAgICAvKiBFbmRtYXNrIHZhbHVlcyBvZiAwIGFuZCAzMiBnaXZlIGlkZW50aWNhbCByZXN1bHRzICovCi0JICAgICAgbnVtID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoKGZsYWdzICYgVElDODBfT1BFUkFORF9CSVROVU0pKQotCSAgICB7Ci0JICAgICAgLyogQklUTlVNIHZhbHVlcyBhcmUgc3RvcmVkIGluIG9uZSdzIGNvbXBsZW1lbnQgZm9ybSAqLwotCSAgICAgIG51bSA9ICh+bnVtICYgMHgxRik7Ci0JICAgIH0KLQkgIC8qIE1hc2sgb2ZmIHVwcGVyIGJpdHMsIGp1c3QgaXQgY2FzZSBpdCBpcyBzaWduZWQgYW5kIGlzIG5lZ2F0aXZlICovCi0JICBpZiAoYml0cyA8IDMyKQotCSAgICB7Ci0JICAgICAgbnVtICY9ICgxIDw8IGJpdHMpIC0gMTsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8IChudW0gPDwgc2hpZnQpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmeCA9IGZyYWdfbW9yZSAoNCk7Ci0JICAgICAgZnhmcmFnID0gZnJhZ19ub3c7Ci0JICAgICAgaW5zblsxXSA9IG51bTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBPX3N5bWJvbDoKLQkgIGlmIChiaXRzID09IDMyKQotCSAgICB7Ci0JICAgICAgZnggPSBmcmFnX21vcmUgKDQpOwotCSAgICAgIGZ4ZnJhZyA9IGZyYWdfbm93OwotCSAgICAgIGluc25bMV0gPSAwOwotCSAgICAgIGlmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUENSRUwpCi0JCXsKLQkJICBmaXhfbmV3X2V4cCAoZnhmcmFnLAotCQkJICAgICAgIGZ4IC0gKGZ4ZnJhZyAtPiBmcl9saXRlcmFsKSwKLQkJCSAgICAgICA0LAotCQkJICAgICAgICZvcGVyc1tleHBpXSwgCi0JCQkgICAgICAgMSwKLQkJCSAgICAgICBSX01QUENSKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGZpeF9uZXdfZXhwIChmeGZyYWcsCi0JCQkgICAgICAgZnggLSAoZnhmcmFnIC0+IGZyX2xpdGVyYWwpLAotCQkJICAgICAgIDQsCi0JCQkgICAgICAgJm9wZXJzW2V4cGldLCAKLQkJCSAgICAgICAwLAotCQkJICAgICAgIFJfUkVMTE9OR1gpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkKLQkgICAgewotCSAgICAgIGZpeF9uZXdfZXhwIChmZnJhZywKLQkJCSAgIGYgLSAoZmZyYWcgLT4gZnJfbGl0ZXJhbCksCi0JCQkgICA0LAkJCS8qIEZJWE1FISBob3cgaXMgdGhpcyB1c2VkPyAqLwotCQkJICAgJm9wZXJzW2V4cGldLAotCQkJICAgMSwKLQkJCSAgIFJfTVBQQ1IxNVcpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnRlcm5hbF9lcnJvciAoXygic3ltYm9sIHJlbG9jIHRoYXQgaXMgbm90IFBDIHJlbGF0aXZlIG9yIDMyIGJpdHMiKSk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT19hYnNlbnQ6Ci0JICAvKiBFYWNoIE9fYWJzZW50IGV4cHJlc3Npb24gY2FuIGluZGljYXRlIGV4YWN0bHkgb25lIHBvc3NpYmxlIG1vZGlmaWVyLiAqLwotCSAgaWYgKChudW0gJiBUSUM4MF9PUEVSQU5EX01fU0kpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9TSSkpCi0JICAgIHsKLQkgICAgICBpbnNuWzBdID0gaW5zblswXSB8ICgxIDw8IDE3KTsKLQkgICAgfQotCSAgZWxzZSBpZiAoKG51bSAmIFRJQzgwX09QRVJBTkRfTV9MSSkgJiYgKGZsYWdzICYgVElDODBfT1BFUkFORF9NX0xJKSkKLQkgICAgewotCSAgICAgIGluc25bMF0gPSBpbnNuWzBdIHwgKDEgPDwgMTUpOwotCSAgICB9Ci0JICBlbHNlIGlmICgobnVtICYgVElDODBfT1BFUkFORF9TQ0FMRUQpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfU0NBTEVEKSkKLQkgICAgewotCSAgICAgIGluc25bMF0gPSBpbnNuWzBdIHwgKDEgPDwgMTEpOwotCSAgICB9Ci0JICBlbHNlIGlmICgobnVtICYgVElDODBfT1BFUkFORF9QQVJFTlMpICYmIChmbGFncyAmIFRJQzgwX09QRVJBTkRfUEFSRU5TKSkKLQkgICAgewotCSAgICAgIC8qIE5vIGNvZGUgdG8gZ2VuZXJhdGUsIGp1c3QgYWNjZXB0IGFuZCBkaXNjYXJkIHRoaXMgZXhwcmVzc2lvbiAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgb3BlcmFuZCBtb2RpZmllciIpLCBvcGVyc1tleHBpXS5YX2FkZF9udW1iZXIpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9fYmlnOgotCSAgZnggPSBmcmFnX21vcmUgKDQpOwotCSAgZnhmcmFnID0gZnJhZ19ub3c7Ci0JICB7Ci0JICAgIGludCBwcmVjaXNpb24gPSAyOwotCSAgICBsb25nIGV4cG9uZW50X2JpdHMgPSA4TDsKLQkgICAgTElUVExFTlVNX1RZUEUgd29yZHNbMl07Ci0JICAgIC8qIFZhbHVlIGlzIHN0aWxsIGluIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyICovCi0JICAgIGdlbl90b193b3JkcyAod29yZHMsIHByZWNpc2lvbiwgZXhwb25lbnRfYml0cyk7Ci0JICAgIGluc25bMV0gPSAod29yZHNbMF0gPDwgMTYpIHwgd29yZHNbMV07Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9faWxsZWdhbDoKLQljYXNlIE9fc3ltYm9sX3J2YToKLQljYXNlIE9fdW1pbnVzOgotCWNhc2UgT19iaXRfbm90OgotCWNhc2UgT19sb2dpY2FsX25vdDoKLQljYXNlIE9fbXVsdGlwbHk6Ci0JY2FzZSBPX2RpdmlkZToKLQljYXNlIE9fbW9kdWx1czoKLQljYXNlIE9fbGVmdF9zaGlmdDoKLQljYXNlIE9fcmlnaHRfc2hpZnQ6Ci0JY2FzZSBPX2JpdF9pbmNsdXNpdmVfb3I6Ci0JY2FzZSBPX2JpdF9vcl9ub3Q6Ci0JY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0JY2FzZSBPX2JpdF9hbmQ6Ci0JY2FzZSBPX2FkZDoKLQljYXNlIE9fc3VidHJhY3Q6Ci0JY2FzZSBPX2VxOgotCWNhc2UgT19uZToKLQljYXNlIE9fbHQ6Ci0JY2FzZSBPX2xlOgotCWNhc2UgT19nZToKLQljYXNlIE9fZ3Q6Ci0JY2FzZSBPX2xvZ2ljYWxfYW5kOgotCWNhc2UgT19sb2dpY2FsX29yOgotCWNhc2UgT19tYXg6Ci0JZGVmYXVsdDoKLQkgIGludGVybmFsX2Vycm9yX2EgKF8oInVuaGFuZGxlZCBleHByZXNzaW9uIiksIFhfb3ApOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBXcml0ZSBvdXQgdGhlIGluc3RydWN0aW9uLCBlaXRoZXIgNCBvciA4IGJ5dGVzLiAgKi8KLQotICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc25bMF0sIDQpOwotICBpZiAoZnggIT0gTlVMTCkKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZ4LCBpbnNuWzFdLCA0KTsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIuICBHYXMKLSAgIGNhbGxzIHRoaXMgZnVuY3Rpb24gZm9yIGVhY2ggaW5wdXQgbGluZSB3aGljaCBkb2VzIG5vdCBjb250YWluIGEKLSAgIHBzZXVkb29wLgotCi0gIFNUUiBwb2ludHMgdG8gYSBOVUxMIHRlcm1pbmF0ZWQgbWFjaGluZSBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb24uICBUaGlzCi0gIGZ1bmN0aW9uIGlzIHN1cHBvc2VkIHRvIGVtaXQgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4gICovCi0KLXZvaWQKLW1kX2Fzc2VtYmxlIChzdHIpCi0gICAgIGNoYXIgKnN0cjsKLXsKLSAgY2hhciAqc2NhbjsKLSAgdW5zaWduZWQgY2hhciAqaW5wdXRfbGluZV9zYXZlOwotICBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gIGV4cHJlc3Npb25TIG15b3BzWzE2XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotCi0gIC8qIEVuc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdGhlcmUgdG8gYXNzZW1ibGUuICovCi0gIGFzc2VydCAoc3RyKTsKLQotICAvKiBEcm9wIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0gIHdoaWxlIChpc3NwYWNlICgqc3RyKSkKLSAgICB7Ci0gICAgICBzdHIrKzsKLSAgICB9Ci0KLSAgLyogSXNvbGF0ZSB0aGUgbW5lbW9uaWMgZnJvbSB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIGJ5IGZpbmRpbmcgdGhlIGZpcnN0Ci0gICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGFuZCB6YXBwaW5nIGl0IHRvIGEgbnVsbCBieXRlLiAqLwotICBmb3IgKHNjYW4gPSBzdHI7ICpzY2FuICE9ICdcMDAwJyAmJiAhaXNzcGFjZSAoKnNjYW4pOyBzY2FuKyspIHs7fQotICBpZiAoKnNjYW4gIT0gJ1wwMDAnKQotICAgIHsKLSAgICAgICpzY2FuKysgPSAnXDAwMCc7Ci0gICAgfQotCi0gIC8qIFRyeSB0byBmaW5kIHRoaXMgbW5lbW9uaWMgaW4gdGhlIGhhc2ggdGFibGUgKi8KLSAgaWYgKChvcGNvZGUgPSAoc3RydWN0IHRpYzgwX29wY29kZSAqKSBoYXNoX2ZpbmQgKHRpYzgwX2hhc2gsIHN0cikpID09IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJJbnZhbGlkIG1uZW1vbmljOiAnJXMnIiksIHN0cik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ciA9IHNjYW47Ci0gIHdoaWxlIChpc3NwYWNlICgqc2NhbikpCi0gICAgewotICAgICAgc2NhbisrOwotICAgIH0KLQotICBpbnB1dF9saW5lX3NhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotICBvcGNvZGUgPSBmaW5kX29wY29kZSAob3Bjb2RlLCBteW9wcyk7Ci0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkludmFsaWQgb3BlcmFuZHM6ICclcyciKSwgaW5wdXRfbGluZV9zYXZlKTsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gaW5wdXRfbGluZV9zYXZlOwotICBidWlsZF9pbnNuIChvcGNvZGUsIG15b3BzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBhdCB0aGUgc3RhcnQgb2YgYXNzZW1ibHksIGFmdGVyIHRoZSBjb21tYW5kCi0gICBsaW5lIGFyZ3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIGFuZCBhbGwgdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQKLSAgIGluaXRpYWxpemF0aW9ucyBoYXZlIGJlZW4gY29tcGxldGVkLgotCi0gICBJdCBzaG91bGQgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMuLCB0aGF0IHRoZSBtYWNoaW5lIGRlcGVuZGVudCBwYXJ0IG9mCi0gICB0aGUgYXNzZW1ibGVyIHdpbGwgbmVlZC4gICovCi0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcDsKLSAgcmVnaXN0ZXIgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3BfZW5kOwotICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7Ci0gIGV4dGVybiBpbnQgY29mZl9mbGFnczsJCQkvKiBEZWZpbmVkIGluIG9iai1jb2ZmLmMgKi8KLQotICAvKiBTZXQgRl9BUjMyV1IgaW4gY29mZl9mbGFncywgd2hpY2ggd2lsbCBlbmQgdXAgaW4gdGhlIGZpbGUgaGVhZGVyCi0gICAgIGZfZmxhZ3MgZmllbGQuICovCi0KLSAgY29mZl9mbGFncyB8PSBGX0FSMzJXUjsJLyogVEljODAgaXMgMzIgYml0IGxpdHRsZSBlbmRpYW4gKi8KLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBUSWM4MCBpbnN0cnVjdGlvbiBzZXQKLSAgICAgaGFzIG1hbnkgaWRlbnRpY2FsIG9wY29kZSBuYW1lcyB0aGF0IGhhdmUgZGlmZmVyZW50IG9wY29kZXMgYmFzZWQKLSAgICAgb24gdGhlIG9wZXJhbmRzLiAgVGhpcyBoYXNoIHRhYmxlIHRoZW4gcHJvdmlkZXMgYSBxdWljayBpbmRleCB0bwotICAgICB0aGUgZmlyc3Qgb3Bjb2RlIHdpdGggYSBwYXJ0aWN1bGFyIG5hbWUgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0KLSAgdGljODBfaGFzaCA9IGhhc2hfbmV3ICgpOwotICBvcF9lbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7Ci0gIGZvciAob3AgPSB0aWM4MF9vcGNvZGVzOyBvcCA8IG9wX2VuZDsgb3ArKykKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwcmV2X25hbWUsIG9wIC0+IG5hbWUpICE9IDApIAotCXsKLQkgIHByZXZfbmFtZSA9IChjaGFyICopIG9wIC0+IG5hbWU7Ci0JICBoYXNoX2luc2VydCAodGljODBfaGFzaCwgb3AgLT4gbmFtZSwgKGNoYXIgKikgb3ApOwotCX0KLSAgICB9Ci0KLSAgLyogSW5zZXJ0IHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgV2UgdXNlIHN5bWJvbF9jcmVhdGUKLSAgICAgcmF0aGVyIHRoYW4gc3ltYm9sX25ldyBzbyB0aGF0IHRoZXNlIHN5bWJvbHMgZG9uJ3QgZW5kIHVwIGluIHRoZSBvYmplY3QKLSAgICAgZmlsZXMnIHN5bWJvbCB0YWJsZS4gIE5vdGUgdGhhdCB0aGUgdmFsdWVzIG9mIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgaW5jbHVkZQotICAgICBzb21lIHVwcGVyIGJpdHMgdGhhdCBkaXN0aW5ndWlzaCB0aGUgdHlwZSBvZiB0aGUgc3ltYm9sIChyZWdpc3RlciwgYml0bnVtLAotICAgICBjb25kaXRpb24gY29kZSwgZXRjKSBhbmQgdGhlc2UgYml0cyBtdXN0IGJlIG1hc2tlZCBhd2F5IGJlZm9yZSBhY3R1YWxseQotICAgICBpbnNlcnRpbmcgdGhlIHZhbHVlcyBpbnRvIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0uICBGb3IgcmVnaXN0ZXJzIHdlIHB1dAotICAgICB0aGVzZSBiaXRzIGluIHRoZSBzeW1ib2wgdGFibGUgc2luY2Ugd2UgdXNlIHRoZW0gbGF0ZXIgYW5kIHRoZXJlIGlzIG5vCi0gICAgIHF1ZXN0aW9uIHRoYXQgdGhleSBhcmVuJ3QgcGFydCBvZiB0aGUgcmVnaXN0ZXIgbnVtYmVyLiAgRm9yIGNvbnN0YW50cyB3ZQotICAgICBjYW4ndCBkbyB0aGF0IHNpbmNlIHRoZSBjb25zdGFudCBjYW4gYmUgYW55IHZhbHVlLCBzbyB0aGV5IGFyZSBtYXNrZWQgb2ZmCi0gICAgIGJlZm9yZSBwdXR0aW5nIHRoZW0gaW50byB0aGUgc3ltYm9sIHRhYmxlLiAqLwotCi0gIHBkc3AgPSBOVUxMOwotICB3aGlsZSAoKHBkc3AgPSB0aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sIChwZHNwKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgICB2YWx1ZVQgdmFsdTsKLSAgICAgIGludCBzeW10eXBlOwotCi0gICAgICBzeW10eXBlID0gUERTX1ZBTFVFIChwZHNwKSAmIFRJQzgwX09QRVJBTkRfTUFTSzsKLSAgICAgIHN3aXRjaCAoc3ltdHlwZSkKLQl7Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0dQUjoKLQljYXNlIFRJQzgwX09QRVJBTkRfRlBBOgotCWNhc2UgVElDODBfT1BFUkFORF9DUjoKLQkgIHNlZ21lbnQgPSByZWdfc2VjdGlvbjsKLQkgIHZhbHUgPSBQRFNfVkFMVUUgKHBkc3ApOwotCSAgYnJlYWs7Ci0JY2FzZSBUSUM4MF9PUEVSQU5EX0NDOgotCWNhc2UgVElDODBfT1BFUkFORF9CSVROVU06Ci0JICBzZWdtZW50ID0gYWJzb2x1dGVfc2VjdGlvbjsKLQkgIHZhbHUgPSBQRFNfVkFMVUUgKHBkc3ApICYgflRJQzgwX09QRVJBTkRfTUFTSzsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBpbnRlcm5hbF9lcnJvcl9hIChfKCJ1bmhhbmRsZWQgcHJlZGVmaW5lZCBzeW1ib2wgYml0cyIpLCBzeW10eXBlKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKFBEU19OQU1FIChwZHNwKSwgc2VnbWVudCwgdmFsdSwKLQkJCQkJICAmemVyb19hZGRyZXNzX2ZyYWcpKTsKLSAgICB9Ci19Ci0KLQwKLQotLyogVGhlIGFzc2VtYmxlciBhZGRzIG1kX3Nob3J0b3B0cyB0byB0aGUgc3RyaW5nIHBhc3NlZCB0byBnZXRvcHQuICovCi0KLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotCi0vKiBUaGUgYXNzZW1ibGVyIGFkZHMgbWRfbG9uZ29wdHMgdG8gdGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgbG9uZyBvcHRpb25zCi0gICB0aGF0IGFyZSBwYXNzZWQgdG8gZ2V0b3B0LiAqLwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPSB7Ci0KLSNkZWZpbmUgT1BUSU9OX1JFTEFYCShPUFRJT05fTURfQkFTRSkKLSAgeyJyZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUkVMQVh9LAotCi0jZGVmaW5lIE9QVElPTl9OT19SRUxBWAkoT1BUSU9OX1JFTEFYICsgMSkKLSAgeyJuby1yZWxheCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fUkVMQVh9LAotCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotLyogVGhlIG1kX3BhcnNlX29wdGlvbiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBnZXRvcHQgcmV0dXJucyBhbgotICAgdW5yZWNvZ25pemVkIGNvZGUsIHByZXN1bWFibHkgaW5kaWNhdGluZyBhIHNwZWNpYWwgY29kZSB2YWx1ZSB3aGljaAotICAgYXBwZWFycyBpbiBtZF9sb25nb3B0cyBmb3IgbWFjaGluZSBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9ucy4gKi8KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIE9QVElPTl9SRUxBWDoKLSAgICAgIHRpYzgwX3JlbGF4ID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX05PX1JFTEFYOgotICAgICAgdGljODBfcmVsYXggPSAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICByZXR1cm4gKDEpOwotfQotCi0vKiBUaGUgbWRfc2hvd191c2FnZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIHVzYWdlIG1lc3NhZ2UgaXMKLSAgIHByaW50ZWQuICBJdCBzaG91bGQgcHJpbnQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjaGluZSBzcGVjaWZpYyBvcHRpb25zCi0gICBmb3VuZCBpbiBtZF9sb25nb3B0cy4gKi8KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYgKHN0cmVhbSwgIlwKLVRJYzgwIG9wdGlvbnM6XG5cCi0tcmVsYXgJCQlhbHRlciBQQyByZWxhdGl2ZSBicmFuY2ggaW5zdHJ1Y3Rpb25zIHRvIHVzZSBsb25nIGZvcm0gd2hlbiBuZWVkZWRcblwKLS1uby1yZWxheAkJYWx3YXlzIHVzZSBzaG9ydCBQQyByZWxhdGl2ZSBicmFuY2ggaW5zdHJ1Y3Rpb25zLCBlcnJvciBvbiBvdmVyZmxvd1xuIik7Ci19Ci0KLQwKLS8qIEF0dGVtcHQgdG8gc2ltcGxpZnkgb3IgZXZlbiBlbGltaW5hdGUgYSBmaXh1cC4gIFRoZSByZXR1cm4gdmFsdWUgaXMKLSAgIGlnbm9yZWQ7IHBlcmhhcHMgaXQgd2FzIG9uY2UgbWVhbmluZ2Z1bCwgYnV0IG5vdyBpdCBpcyBoaXN0b3JpY2FsLgotICAgVG8gaW5kaWNhdGUgdGhhdCBhIGZpeHVwIGhhcyBiZWVuIGVsaW1pbmF0ZWQsIHNldCBmaXhQLT5meF9kb25lLgotICAgKi8KLQotdm9pZAotbWRfYXBwbHlfZml4IChmaXhQLCB2YWwpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsOwotewotICBjaGFyICpkZXN0ID0gIGZpeFAgLT4gZnhfZnJhZyAtPiBmcl9saXRlcmFsICsgZml4UCAtPiBmeF93aGVyZTsKLSAgaW50IG92ZXJmbG93OwotCi0gIHN3aXRjaCAoZml4UCAtPiBmeF9yX3R5cGUpCi0gICAgewotICAgIGNhc2UgUl9SRUxMT05HWDoKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZGVzdCwgKHZhbHVlVCkgdmFsLCA0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9NUFBDUjoKLSAgICAgIHZhbCA+Pj0gMjsKLSAgICAgIHZhbCArPSAxOwkgIC8qIFRhcmdldCBhZGRyZXNzIGNvbXB1dGVkIGZyb20gaW5zdCBzdGFydCAqLwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChkZXN0LCAodmFsdWVUKSB2YWwsIDQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX01QUENSMTVXOgotICAgICAgb3ZlcmZsb3cgPSAodmFsIDwgLTY1NTM2TCkgfHwgKHZhbCA+IDY1NTMyTCk7Ci0gICAgICBpZiAob3ZlcmZsb3cpCi0JewotCSAgYXNfYmFkX3doZXJlIChmaXhQIC0+IGZ4X2ZpbGUsIGZpeFAgLT4gZnhfbGluZSwKLQkJCV8oIlBDIG9mZnNldCAweCVseCBvdXRzaWRlIHJhbmdlIDB4JWx4LTB4JWx4IiksCi0JCQl2YWwsIC02NTUzNkwsIDY1NTMyTCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHZhbCA+Pj0gMjsKLQkgICpkZXN0KysgPSB2YWwgJiAweEZGOwotCSAgdmFsID4+PSA4OwotCSAgKmRlc3QgPSAoKmRlc3QgJiAweDgwKSB8ICh2YWwgJiAweDdGKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfQUJTOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChkZXN0LCAodmFsdWVUKSB2YWwsIGZpeFAgLT4gZnhfc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgaW50ZXJuYWxfZXJyb3JfYSAoXygidW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZSBpbiBmaXh1cCIpLCBmaXhQIC0+IGZ4X3JfdHlwZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLQwKLS8qIEZ1bmN0aW9ucyBjb25jZXJuaW5nIHJlbG9jcy4gICovCi0KLS8qIFRoZSBsb2NhdGlvbiBmcm9tIHdoaWNoIGEgUEMgcmVsYXRpdmUganVtcCBzaG91bGQgYmUgY2FsY3VsYXRlZCwKLSAgIGdpdmVuIGEgUEMgcmVsYXRpdmUgcmVsb2MuCi0KLSAgIEZvciB0aGUgVEljODAsIHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIDMyIGJpdCBvcGNvZGUgY29udGFpbmluZwotICAgdGhlIFBDIHJlbGF0aXZlIGZpZWxkLiAqLwotCi1sb25nCi1tZF9wY3JlbF9mcm9tIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gKGZpeFAgLT4gZnhfZnJhZyAtPiBmcl9hZGRyZXNzICsgZml4UCAtPiBmeF93aGVyZSkgOwotfQotCi0vKgotICogQ2FsbGVkIGFmdGVyIHJlbGF4KCkgaXMgZmluaXNoZWQuCi0gKiBJbjoJQWRkcmVzcyBvZiBmcmFnLgotICoJZnJfdHlwZSA9PSByc19tYWNoaW5lX2RlcGVuZGVudC4KLSAqCWZyX3N1YnR5cGUgaXMgd2hhdCB0aGUgYWRkcmVzcyByZWxheGVkIHRvLgotICoKLSAqIE91dDoJQW55IGZpeFNzIGFuZCBjb25zdGFudHMgYXJlIHNldCB1cC4KLSAqCUNhbGxlciB3aWxsIHR1cm4gZnJhZyBpbnRvIGEgIi5zcGFjZSAwIi4KLSAqLwotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBpbnRlcm5hbF9lcnJvciAoXygibWRfY29udmVydF9mcmFnKCkgbm90IGltcGxlbWVudGVkIHlldCIpKTsKLSAgYWJvcnQgKCk7Ci19Ci0KLQwKLS8qQVJHU1VTRUQqLwotdm9pZAotdGNfY29mZl9zeW1ib2xfZW1pdF9ob29rIChpZ25vcmUpCi0gICAgIHN5bWJvbFMgKmlnbm9yZTsKLXsKLX0KLQotI2lmIGRlZmluZWQgT0JKX0NPRkYKLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhQKQotICAgICBmaXhTICpmaXhQOwotewotICByZXR1cm4gKGZpeFAgLT4gZnhfcl90eXBlKTsKLX0KLQotI2VuZGlmCS8qIE9CSl9DT0ZGICovCi0KLS8qIGVuZCBvZiB0Yy10aWM4MC5jICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXRpYzgwLmggYi9nYXMvY29uZmlnL3RjLXRpYzgwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZmYyNDkuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy10aWM4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXRpYzgwLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQ19USUM4MAotCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDAKLQotI2RlZmluZSBUQVJHRVRfQVJDSAliZmRfYXJjaF90aWM4MAotI2RlZmluZSBUQVJHRVRfRk9STUFUCSJjb2ZmLXRpYzgwIgotI2RlZmluZSBCRkRfQVJDSAlUQVJHRVRfQVJDSAotCi0vKiBXZSBuZWVkIHRoZSBleHRyYSBmaWVsZCBpbiB0aGUgZml4dXAgc3RydWN0IHRvIHB1dCB0aGUgcmVsb2NhdGlvbiBpbi4gKi8KLQotI2RlZmluZSBORUVEX0ZYX1JfVFlQRQotCi0vKiBEZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIGFzIHRoZSBhcHByb3ByaWF0ZSBzdGFuZGFyZCBiaWcgZW5kaWFuIG9yCi0gICBsaXR0bGUgZW5kaWFuIGZ1bmN0aW9uLiAgU2hvdWxkIHdlIHNvbWVkYXkgc3VwcG9ydCBlbmRpYW5uZXNzIGFzIGEKLSAgIHJ1bnRpbWUgZGVjaXNpb24sIHRoaXMgd2lsbCBuZWVkIHRvIGNoYW5nZS4gKi8KLQotI2RlZmluZSBtZF9udW1iZXJfdG9fY2hhcnMgbnVtYmVyX3RvX2NoYXJzX2xpdHRsZWVuZGlhbgotCi0vKiBEZWZpbmUgYXdheSB0aGUgY2FsbCB0byBtZF9vcGVyYW5kIGluIHRoZSBleHByZXNzaW9uIHBhcnNpbmcgY29kZS4KLSAgIFRoaXMgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBleHByZXNzaW9uIHBhcnNlciBjYW4ndCBwYXJzZSB0aGUgaW5wdXQKLSAgIGFuZCBnaXZlcyB0aGUgYXNzZW1ibGVyIGJhY2tlbmQgYSBjaGFuY2UgdG8gZGVhbCB3aXRoIGl0IGluc3RlYWQuICovCi0KLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jaWZkZWYgT0JKX0NPRkYKLQotLyogQ09GRiBzcGVjaWZpYyBkZWZpbml0aW9ucy4gICovCi0KLSNkZWZpbmUgQ09GRl9NQUdJQwlUSUM4MF9BUkNIX01BR0lDCi0KLS8qIFdoZXRoZXIgYSByZWxvYyBzaG91bGQgYmUgb3V0cHV0LiAgKi8KLQotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyhmaXhwKSAoKGZpeHApIC0+IGZ4X2FkZHN5ICE9IE5VTEwpCi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLQotZXh0ZXJuIHNob3J0IHRjX2NvZmZfZml4MnJ0eXBlICgpOwotCi0jZW5kaWYJLyogT0JKX0NPRkYgKi8KLQotLyogZW5kIG9mIHRjLXRpYzgwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdjg1MC5jIGIvZ2FzL2NvbmZpZy90Yy12ODUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNGE5MWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12ODUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDc5ICswLDAgQEAKLS8qIHRjLXY4NTAuYyAtLSBBc3NlbWJsZXIgY29kZSBmb3IgdGhlIE5FQyBWODUwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIiAgICAgCi0jaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIKLQotI2RlZmluZSBBUkVBX1pEQSAwCi0jZGVmaW5lIEFSRUFfU0RBIDEKLSNkZWZpbmUgQVJFQV9UREEgMgotCi0vKiBzaWduLWV4dGVuZCBhIDE2LWJpdCBudW1iZXIgKi8KLSNkZWZpbmUgU0VYVDE2KHgpCSgoKCh4KSAmIDB4ZmZmZikgXiAofiAweDdmZmYpKSArIDB4ODAwMCkKLQotLyogVGVtcG9yYXJpbHkgaG9sZHMgdGhlIHJlbG9jIGluIGEgY29ucyBleHByZXNzaW9uLiAgKi8KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgaG9sZF9jb25zX3JlbG9jOwotCi0vKiBTZXQgdG8gVFJVRSBpZiB3ZSB3YW50IHRvIGJlIHBlZGFudGljIGFib3V0IHNpZ25lZCBvdmVyZmxvd3MuICAqLwotc3RhdGljIGJvb2xlYW4gd2Fybl9zaWduZWRfb3ZlcmZsb3dzICAgPSBGQUxTRTsKLXN0YXRpYyBib29sZWFuIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzID0gRkFMU0U7Ci0KLS8qIEluZGljYXRlcyB0aGUgdGFyZ2V0IEJGRCBtYWNoaW5lIG51bWJlci4gICovCi1zdGF0aWMgaW50ICAgICBtYWNoaW5lID0gLTE7Ci0KLS8qIEluZGljYXRlcyB0aGUgdGFyZ2V0IHByb2Nlc3NvcihzKSBmb3IgdGhlIGFzc2VtYmxlLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQJcHJvY2Vzc29yX21hc2sgPSAtMTsKLQotDAotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHJlZ19uYW1lCi17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lOwotICBpbnQgICAgICAgICAgdmFsdWU7Ci19OwotCi0vKiBHZW5lcmljIGFzc2VtYmxlciBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIG11c3QgYmUgZGVmaW5lZCBieSBhbGwgdGFyZ2V0cy4gKi8KLQotLyogQ2hhcmFjdGVycyB3aGljaCBhbHdheXMgc3RhcnQgYSBjb21tZW50LiAqLwotY29uc3QgY2hhciBjb21tZW50X2NoYXJzW10gPSAiIyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYSBjb21tZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLiAgKi8KLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPSAiOyMiOwotCi0vKiBDaGFyYWN0ZXJzIHdoaWNoIG1heSBiZSB1c2VkIHRvIHNlcGFyYXRlIG11bHRpcGxlIGNvbW1hbmRzIG9uIGEgCi0gICBzaW5nbGUgbGluZS4gICovCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiOyI7Ci0KLS8qIENoYXJhY3RlcnMgd2hpY2ggYXJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXhwb25lbnQgaW4gYSBmbG9hdGluZyAKLSAgIHBvaW50IG51bWJlci4gICovCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcmFjdGVycyB3aGljaCBtZWFuIHRoYXQgYSBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCwgCi0gICBhcyBpbiAwZDEuMC4gICovCi1jb25zdCBjaGFyIEZMVF9DSEFSU1tdID0gImREIjsKLQwKLQotY29uc3QgcmVsYXhfdHlwZVMgbWRfcmVsYXhfdGFibGVbXSA9Ci17Ci0gIC8qIENvbmRpdGlvbmFsIGJyYW5jaGVzLiAgKi8KLSAgezB4ZmYsICAgICAtMHgxMDAsICAgIDIsIDF9LAotICB7MHgxZmZmZmYsIC0weDIwMDAwMCwgNiwgMH0sCi0gIC8qIFVuY29uZGl0aW9uYWwgYnJhbmNoZXMuICAqLwotICB7MHhmZiwgICAgIC0weDEwMCwgICAgMiwgM30sCi0gIHsweDFmZmZmZiwgLTB4MjAwMDAwLCA0LCAwfSwKLX07Ci0KLQotc3RhdGljIHNlZ1Qgc2RhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB0ZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHpkYXRhX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1Qgc2Jzc19zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHRic3Nfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCB6YnNzX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1Qgcm9zZGF0YV9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHJvemRhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCBzY29tbW9uX3NlY3Rpb24gPSBOVUxMOwotc3RhdGljIHNlZ1QgdGNvbW1vbl9zZWN0aW9uID0gTlVMTDsKLXN0YXRpYyBzZWdUIHpjb21tb25fc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCBjYWxsX3RhYmxlX2RhdGFfc2VjdGlvbiA9IE5VTEw7Ci1zdGF0aWMgc2VnVCBjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiA9IE5VTEw7Ci0KLS8qIGZpeHVwcyAqLwotI2RlZmluZSBNQVhfSU5TTl9GSVhVUFMgKDUpCi1zdHJ1Y3Qgdjg1MF9maXh1cAotewotICBleHByZXNzaW9uUyAgICAgICAgICAgICAgZXhwOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgb3BpbmRleDsKLSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotfTsKLQotc3RydWN0IHY4NTBfZml4dXAgZml4dXBzIFtNQVhfSU5TTl9GSVhVUFNdOwotc3RhdGljIGludCBmYzsKLQotDAotdm9pZAotdjg1MF9zZGF0YSAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChzZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfdGRhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAodGRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfemRhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoemRhdGFfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfc2JzcyAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChzYnNzX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3Ric3MgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAodGJzc19zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF96YnNzIChpbnQgaWdub3JlKQotewotICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLSAgCi0gIHN1YnNlZ19zZXQgKHpic3Nfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfcm9zZGF0YSAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChyb3NkYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX3JvemRhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAocm96ZGF0YV9zZWN0aW9uLCAoc3Vic2VnVCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpOwotICAKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotdjg1MF9jYWxsX3RhYmxlX2RhdGEgKGludCBpZ25vcmUpCi17Ci0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24sIChzdWJzZWdUKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKSk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX2NhbGxfdGFibGVfdGV4dCAoaW50IGlnbm9yZSkKLXsKLSAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0gIAotICBzdWJzZWdfc2V0IChjYWxsX3RhYmxlX3RleHRfc2VjdGlvbiwgKHN1YnNlZ1QpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpKTsKLSAgCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQKLXY4NTBfYnNzIChpbnQgaWdub3JlKQotewotICByZWdpc3RlciBpbnQgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotICAKLSAgc3Vic2VnX3NldCAoYnNzX3NlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKLSAgIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi12ODUwX29mZnNldCAoaW50IGlnbm9yZSkKLXsKLSAgaW50IHRlbXAgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgCi0gIHRlbXAgLT0gZnJhZ19ub3dfZml4KCk7Ci0gIAotICBpZiAodGVtcCA+IDApCi0gICAgKHZvaWQpIGZyYWdfbW9yZSAodGVtcCk7Ci0gIAotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBDb3BpZWQgZnJvbSBvYmpfZWxmX2NvbW1vbigpIGluIGdhcy9jb25maWcvb2JqLWVsZi5jICovCi1zdGF0aWMgdm9pZAotdjg1MF9jb21tIChhcmVhKQotICAgICBpbnQgYXJlYTsKLXsKLSAgY2hhciAqICAgIG5hbWU7Ci0gIGNoYXIgICAgICBjOwotICBjaGFyICogICAgcDsKLSAgaW50ICAgICAgIHRlbXA7Ci0gIGludCAgICAgICBzaXplOwotICBzeW1ib2xTICogc3ltYm9sUDsKLSAgaW50ICAgICAgIGhhdmVfYWxpZ247Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpbnB1dF9saW5lX3BvaW50ZXIgKys7CQkvKiBza2lwICcsJyAqLwotICAKLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgYXNfYmFkIChfKCIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8IDAhIElnbm9yZWQuIiksIHRlbXApOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBzaXplID0gdGVtcDsKLSAgKnAgPSAwOwotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICpwID0gYzsKLSAgCi0gIGlmIChTX0lTX0RFRklORUQgKHN5bWJvbFApICYmICEgU19JU19DT01NT04gKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIAotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApICE9IDApCi0gICAgewotICAgICAgaWYgKFNfR0VUX1ZBTFVFIChzeW1ib2xQKSAhPSBzaXplKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBhc193YXJuIChfKCJMZW5ndGggb2YgLmNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlZC4iKSwKLQkJICAgU19HRVRfTkFNRSAoc3ltYm9sUCksIChsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksIHNpemUpOwotCX0KLSAgICB9Ci0gIAotICBrbm93IChzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApID09ICYgemVyb19hZGRyZXNzX2ZyYWcpOwotICAKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGhhdmVfYWxpZ24gPSAwOwotICBlbHNlCi0gICAgewotICAgICAgaGF2ZV9hbGlnbiA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIAotICBpZiAoISBoYXZlX2FsaWduIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotICAgIHsKLSAgICAgIGlmICghIGhhdmVfYWxpZ24pCi0JdGVtcCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgCi0JICBpZiAodGVtcCA8IDApCi0JICAgIHsKLQkgICAgICB0ZW1wID0gMDsKLQkgICAgICBhc193YXJuIChfKCJDb21tb24gYWxpZ25tZW50IG5lZ2F0aXZlOyAwIGFzc3VtZWQiKSk7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIGlmIChzeW1ib2xQLT5sb2NhbCkKLQl7Ci0JICBzZWdUICAgb2xkX3NlYzsKLQkgIGludCAgICBvbGRfc3Vic2VjOwotCSAgY2hhciAqIHBmcmFnOwotCSAgaW50ICAgIGFsaWduOwotCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQotCSAgb2xkX3NlYyA9IG5vd19zZWc7Ci0JICBvbGRfc3Vic2VjID0gbm93X3N1YnNlZzsKLSAgICAgIAotCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JICBhcHBsaWNhYmxlICY9IFNFQ19BTExPQzsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgaWYgKHNic3Nfc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgc2Jzc19zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5zYnNzIiwgMCk7Ci0JICAgICAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNic3Nfc2VjdGlvbiwgYXBwbGljYWJsZSk7Ci0JICAgICAgCi0JCSAgc2VnX2luZm8gKHNic3Nfc2VjdGlvbiktPmJzcyA9IDE7Ci0JCX0KLQkgICAgICBicmVhazsKLQkgIAotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIGlmICh6YnNzX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIHpic3Nfc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIuemJzcyIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzYnNzX3NlY3Rpb24sIGFwcGxpY2FibGUpOwotCSAgICAgIAotCQkgIHNlZ19pbmZvICh6YnNzX3NlY3Rpb24pLT5ic3MgPSAxOwotCQl9Ci0JICAgICAgYnJlYWs7Ci0JICAKLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBpZiAodGJzc19zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICB0YnNzX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnRic3MiLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgdGJzc19zZWN0aW9uLCBhcHBsaWNhYmxlKTsKLQkJICAKLQkJICBzZWdfaW5mbyAodGJzc19zZWN0aW9uKS0+YnNzID0gMTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIGlmICh0ZW1wKQotCSAgICB7Ci0JICAgICAgLyogY29udmVydCB0byBhIHBvd2VyIG9mIDIgYWxpZ25tZW50ICovCi0JICAgICAgZm9yIChhbGlnbiA9IDA7ICh0ZW1wICYgMSkgPT0gMDsgdGVtcCA+Pj0gMSwgKythbGlnbikKLQkJOwotCSAgICAgIAotCSAgICAgIGlmICh0ZW1wICE9IDEpCi0JCXsKLQkJICBhc19iYWQgKF8oIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkJICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCQkgIHJldHVybjsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIGFsaWduID0gMDsKLQkgIAotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgcmVjb3JkX2FsaWdubWVudCAoc2Jzc19zZWN0aW9uLCBhbGlnbik7Ci0JICAgICAgb2JqX2VsZl9zZWN0aW9uX2NoYW5nZV9ob29rKCk7Ci0JICAgICAgc3Vic2VnX3NldCAoc2Jzc19zZWN0aW9uLCAwKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHpic3Nfc2VjdGlvbiwgYWxpZ24pOwotCSAgICAgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotCSAgICAgIHN1YnNlZ19zZXQgKHpic3Nfc2VjdGlvbiwgMCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICByZWNvcmRfYWxpZ25tZW50ICh0YnNzX3NlY3Rpb24sIGFsaWduKTsKLQkgICAgICBvYmpfZWxmX3NlY3Rpb25fY2hhbmdlX2hvb2soKTsKLQkgICAgICBzdWJzZWdfc2V0ICh0YnNzX3NlY3Rpb24sIDApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCSAgCi0JICBpZiAoYWxpZ24pCi0JICAgIGZyYWdfYWxpZ24gKGFsaWduLCAwLCAwKTsKLQotCSAgc3dpdGNoIChhcmVhKQotCSAgICB7Ci0JICAgIGNhc2UgQVJFQV9TREE6Ci0JICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IHNic3Nfc2VjdGlvbikKLQkJc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gMDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEFSRUFfWkRBOgotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSB6YnNzX3NlY3Rpb24pCi0JCXN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX3N5bWJvbCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gdGJzc19zZWN0aW9uKQotCQlzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApLT5mcl9zeW1ib2wgPSAwOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCSAgCi0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIGZyYWdfbm93KTsKLQkgIHBmcmFnID0gZnJhZ192YXIgKHJzX29yZywgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwgc3ltYm9sUCwKLQkJCSAgICAob2Zmc2V0VCkgc2l6ZSwgKGNoYXIgKikgMCk7Ci0JICAqcGZyYWcgPSAwOwotCSAgU19TRVRfU0laRSAoc3ltYm9sUCwgc2l6ZSk7Ci0JICAKLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNic3Nfc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJFQV9aREE6Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgemJzc19zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCB0YnNzX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQkgICAgCi0JICBTX0NMRUFSX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIG9ial9lbGZfc2VjdGlvbl9jaGFuZ2VfaG9vaygpOwotCSAgc3Vic2VnX3NldCAob2xkX3NlYywgb2xkX3N1YnNlYyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQlhbGxvY2F0ZV9jb21tb246Ci0JICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgc2l6ZSk7Ci0JICBTX1NFVF9BTElHTiAoc3ltYm9sUCwgdGVtcCk7Ci0JICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0JICAKLQkgIHN3aXRjaCAoYXJlYSkKLQkgICAgewotCSAgICBjYXNlIEFSRUFfU0RBOgotCSAgICAgIGlmIChzY29tbW9uX3NlY3Rpb24gPT0gTlVMTCkKLQkJewotCQkgIGZsYWd3b3JkCWFwcGxpY2FibGU7Ci0JCSAgCi0JCSAgYXBwbGljYWJsZSA9IGJmZF9hcHBsaWNhYmxlX3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCk7Ci0JCSAgCi0JCSAgc2NvbW1vbl9zZWN0aW9uID0gc3Vic2VnX25ldyAoIi5zY29tbW9uIiwgMCk7Ci0JCSAgCi0JCSAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIHNjb21tb25fc2VjdGlvbiwgYXBwbGljYWJsZQotCQkgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFTE9DIHwgU0VDX0RBVEEKLQkJCXwgU0VDX0hBU19DT05URU5UUykgfCBTRUNfSVNfQ09NTU9OKTsKLQkJfQotCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIHNjb21tb25fc2VjdGlvbik7Ci0JICAgICAgYnJlYWs7Ci0JICAgICAgCi0JICAgIGNhc2UgQVJFQV9aREE6Ci0JICAgICAgaWYgKHpjb21tb25fc2VjdGlvbiA9PSBOVUxMKQotCQl7Ci0JCSAgZmxhZ3dvcmQJYXBwbGljYWJsZTsKLQkJICAKLQkJICBhcHBsaWNhYmxlID0gYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KTsKLQkJICAKLQkJICB6Y29tbW9uX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLnpjb21tb24iLCAwKTsKLQkJICAKLQkJICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgemNvbW1vbl9zZWN0aW9uLCBhcHBsaWNhYmxlCi0JCSAgICAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfUkVMT0MgfCBTRUNfREFUQQotCQkJfCBTRUNfSEFTX0NPTlRFTlRTKSB8IFNFQ19JU19DT01NT04pOwotCQl9Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgemNvbW1vbl9zZWN0aW9uKTsKLQkgICAgICBicmVhazsKLQkgICAgICAKLQkgICAgY2FzZSBBUkVBX1REQToKLQkgICAgICBpZiAodGNvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0JCXsKLQkJICBmbGFnd29yZAlhcHBsaWNhYmxlOwotCQkgIAotCQkgIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotCQkgIAotCQkgIHRjb21tb25fc2VjdGlvbiA9IHN1YnNlZ19uZXcgKCIudGNvbW1vbiIsIDApOwotCQkgIAotCQkgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCB0Y29tbW9uX3NlY3Rpb24sIGFwcGxpY2FibGUKLQkJICAgICAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQyB8IFNFQ19EQVRBCi0JCQl8IFNFQ19IQVNfQ09OVEVOVFMpIHwgU0VDX0lTX0NPTU1PTik7Ci0JCX0KLQkgICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCB0Y29tbW9uX3NlY3Rpb24pOwotCSAgICAgIGJyZWFrOwotCSAgICAgIAotCSAgICBkZWZhdWx0OgotCSAgICAgIGFib3J0KCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHVzZSB0aGUgZG90LCBzb21lIGRvbid0LiAgQ2FuIHdlIGdldCBzb21lIGNvbnNpc3RlbmN5Pz8gICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLicpCi0JaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICAvKiBAQCBTb21lIHNheSBkYXRhLCBzb21lIHNheSBic3MuICAqLwotICAgICAgaWYgKHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImJzc1wiIiwgNCkKLQkgICYmIHN0cm5jbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgImRhdGFcIiIsIDUpKQotCXsKLQkgIHdoaWxlICgqLS1pbnB1dF9saW5lX3BvaW50ZXIgIT0gJyInKQotCSAgICA7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgIGdvdG8gYmFkX2NvbW1vbl9zZWdtZW50OwotCX0KLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJyInKQotCTsKLSAgICAgIGdvdG8gYWxsb2NhdGVfY29tbW9uOwotICAgIH0KLQotICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltYm9sUCktPmZsYWdzIHw9IEJTRl9PQkpFQ1Q7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcmV0dXJuOwotCi0gIHsKLSAgYmFkX2NvbW1vbl9zZWdtZW50OgotICAgIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgd2hpbGUgKCpwICYmICpwICE9ICdcbicpCi0gICAgICBwKys7Ci0gICAgYyA9ICpwOwotICAgICpwID0gJ1wwJzsKLSAgICBhc19iYWQgKF8oImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiKSwgaW5wdXRfbGluZV9wb2ludGVyICsgMSk7Ci0gICAgKnAgPSBjOwotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHA7Ci0gICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZAotc2V0X21hY2hpbmUgKGludCBudW1iZXIpCi17Ci0gIG1hY2hpbmUgPSBudW1iZXI7Ci0gIGJmZF9zZXRfYXJjaF9tYWNoIChzdGRvdXRwdXQsIFRBUkdFVF9BUkNILCBtYWNoaW5lKTsKLQotICBzd2l0Y2ggKG1hY2hpbmUpCi0gICAgewotICAgIGNhc2UgMDogcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MDsgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF92ODUwZTogIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFOyBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX3Y4NTBlYTogcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOyBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFRoZSB0YXJnZXQgc3BlY2lmaWMgcHNldWRvLW9wcyB3aGljaCB3ZSBzdXBwb3J0LiAgKi8KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsic2RhdGEiLCAgIHY4NTBfc2RhdGEsICAgMH0sCi0gIHsidGRhdGEiLCAgIHY4NTBfdGRhdGEsICAgMH0sCi0gIHsiemRhdGEiLCAgIHY4NTBfemRhdGEsICAgMH0sCi0gIHsic2JzcyIsICAgIHY4NTBfc2JzcywgICAgMH0sCi0gIHsidGJzcyIsICAgIHY4NTBfdGJzcywgICAgMH0sCi0gIHsiemJzcyIsICAgIHY4NTBfemJzcywgICAgMH0sCi0gIHsicm9zZGF0YSIsIHY4NTBfcm9zZGF0YSwgMH0sCi0gIHsicm96ZGF0YSIsIHY4NTBfcm96ZGF0YSwgMH0sCi0gIHsiYnNzIiwgICAgIHY4NTBfYnNzLCAgICAgMH0sCi0gIHsib2Zmc2V0IiwgIHY4NTBfb2Zmc2V0LCAgMH0sCi0gIHsid29yZCIsICAgIGNvbnMsICAgICAgICAgNH0sCi0gIHsiemNvbW0iLCAgIHY4NTBfY29tbSwgICAgQVJFQV9aREF9LAotICB7InNjb21tIiwgICB2ODUwX2NvbW0sICAgIEFSRUFfU0RBfSwKLSAgeyJ0Y29tbSIsICAgdjg1MF9jb21tLCAgICBBUkVBX1REQX0sCi0gIHsidjg1MCIsICAgIHNldF9tYWNoaW5lLCAgMH0sCi0gIHsiY2FsbF90YWJsZV9kYXRhIiwgdjg1MF9jYWxsX3RhYmxlX2RhdGEsIDB9LAotICB7ImNhbGxfdGFibGVfdGV4dCIsIHY4NTBfY2FsbF90YWJsZV90ZXh0LCAwfSwKLSAgeyJ2ODUwZSIsICAgICAgICAgICBzZXRfbWFjaGluZSwgICAgICAgICAgYmZkX21hY2hfdjg1MGV9LAotICB7InY4NTBlYSIsICAgICAgICAgIHNldF9tYWNoaW5lLCAgICAgICAgICBiZmRfbWFjaF92ODUwZWF9LAotICB7IE5VTEwsICAgICBOVUxMLCAgICAgICAgIDB9Ci19OwotCi0vKiBPcGNvZGUgaGFzaCB0YWJsZS4gICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqdjg1MF9oYXNoOwotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiZXAiLCAgMzAgfSwJCS8qIGVwIC0gZWxlbWVudCBwdHIgKi8KLSAgeyAiZ3AiLCAgIDQgfSwJCS8qIGdwIC0gZ2xvYmFsIHB0ciAqLwotICB7ICJocCIsICAgMiB9LAkJLyogaHAgLSBoYW5kbGVyIHN0YWNrIHB0ciAqLwotICB7ICJscCIsICAzMSB9LAkJLyogbHAgLSBsaW5rIHB0ciAqLwotICB7ICJyMCIsICAgMCB9LAotICB7ICJyMSIsICAgMSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJyMTYiLCAxNiB9LAotICB7ICJyMTciLCAxNyB9LAotICB7ICJyMTgiLCAxOCB9LAotICB7ICJyMTkiLCAxOSB9LAotICB7ICJyMiIsICAgMiB9LAotICB7ICJyMjAiLCAyMCB9LAotICB7ICJyMjEiLCAyMSB9LAotICB7ICJyMjIiLCAyMiB9LAotICB7ICJyMjMiLCAyMyB9LAotICB7ICJyMjQiLCAyNCB9LAotICB7ICJyMjUiLCAyNSB9LAotICB7ICJyMjYiLCAyNiB9LAotICB7ICJyMjciLCAyNyB9LAotICB7ICJyMjgiLCAyOCB9LAotICB7ICJyMjkiLCAyOSB9LAotICB7ICJyMyIsICAgMyB9LAotICB7ICJyMzAiLCAzMCB9LAotICB7ICJyMzEiLCAzMSB9LAotICB7ICJyNCIsICAgNCB9LAotICB7ICJyNSIsICAgNSB9LAotICB7ICJyNiIsICAgNiB9LAotICB7ICJyNyIsICAgNyB9LAotICB7ICJyOCIsICAgOCB9LAotICB7ICJyOSIsICAgOSB9LAotICB7ICJzcCIsICAgMyB9LAkJLyogc3AgLSBzdGFjayBwdHIgKi8KLSAgeyAidHAiLCAgIDUgfSwJCS8qIHRwIC0gdGV4dCBwdHIgKi8KLSAgeyAiemVybyIsIDAgfSwKLX07Ci0jZGVmaW5lIFJFR19OQU1FX0NOVAkoc2l6ZW9mIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQotCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX25hbWUgc3lzdGVtX3JlZ2lzdGVyc1tdID0gCi17Ci0gIHsgImN0YnAiLCAgMjAgfSwKLSAgeyAiY3RwYyIsICAxNiB9LAotICB7ICJjdHBzdyIsIDE3IH0sCi0gIHsgImRicGMiLCAgMTggfSwKLSAgeyAiZGJwc3ciLCAxOSB9LAotICB7ICJlY3IiLCAgICA0IH0sCi0gIHsgImVpcGMiLCAgIDAgfSwKLSAgeyAiZWlwc3ciLCAgMSB9LAotICB7ICJmZXBjIiwgICAyIH0sCi0gIHsgImZlcHN3IiwgIDMgfSwKLSAgeyAicHN3IiwgICAgNSB9LAotfTsKLSNkZWZpbmUgU1lTUkVHX05BTUVfQ05UCShzaXplb2YgKHN5c3RlbV9yZWdpc3RlcnMpIC8gc2l6ZW9mIChzdHJ1Y3QgcmVnX25hbWUpKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19uYW1lIHN5c3RlbV9saXN0X3JlZ2lzdGVyc1tdID0KLXsKLSAgeyJQUyIsICAgICAgNSB9LAotICB7IlNSIiwgICAgICAwICsgMX0KLX07Ci0jZGVmaW5lIFNZU1JFR0xJU1RfTkFNRV9DTlQJKHNpemVvZiAoc3lzdGVtX2xpc3RfcmVnaXN0ZXJzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfbmFtZSBjY19uYW1lc1tdID0KLXsKLSAgeyAiYyIsICAweDEgfSwKLSAgeyAiZSIsICAweDIgfSwKLSAgeyAiZ2UiLCAweGUgfSwKLSAgeyAiZ3QiLCAweGYgfSwKLSAgeyAiaCIsICAweGIgfSwKLSAgeyAibCIsICAweDEgfSwKLSAgeyAibGUiLCAweDcgfSwKLSAgeyAibHQiLCAweDYgfSwKLSAgeyAibiIsICAweDQgfSwKLSAgeyAibmMiLCAweDkgfSwKLSAgeyAibmUiLCAweGEgfSwKLSAgeyAibmgiLCAweDMgfSwKLSAgeyAibmwiLCAweDkgfSwKLSAgeyAibnMiLCAweGMgfSwKLSAgeyAibnYiLCAweDggfSwKLSAgeyAibnoiLCAweGEgfSwKLSAgeyAicCIsICAweGMgfSwKLSAgeyAicyIsICAweDQgfSwKLSAgeyAic2EiLCAweGQgfSwKLSAgeyAidCIsICAweDUgfSwKLSAgeyAidiIsICAweDAgfSwKLSAgeyAieiIsICAweDIgfSwKLX07Ci0jZGVmaW5lIENDX05BTUVfQ05UCShzaXplb2YgKGNjX25hbWVzKSAvIHNpemVvZiAoc3RydWN0IHJlZ19uYW1lKSkKLQotLyogcmVnX25hbWVfc2VhcmNoIGRvZXMgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBnaXZlbiByZWdpc3RlciB0YWJsZQotICAgdG8gc2VlIGlmICJuYW1lIiBpcyBhIHZhbGlkIHJlZ2l0ZXIgbmFtZS4gIFJldHVybnMgdGhlIHJlZ2lzdGVyCi0gICBudW1iZXIgZnJvbSB0aGUgYXJyYXkgb24gc3VjY2Vzcywgb3IgLTEgb24gZmFpbHVyZS4gKi8KLQotc3RhdGljIGludAotcmVnX25hbWVfc2VhcmNoIChyZWdzLCByZWdjb3VudCwgbmFtZSwgYWNjZXB0X251bWJlcnMpCi0gICAgIGNvbnN0IHN0cnVjdCByZWdfbmFtZSAqIHJlZ3M7Ci0gICAgIGludCAgICAgICAgICAgICAgICAgICAgIHJlZ2NvdW50OwotICAgICBjb25zdCBjaGFyICogICAgICAgICAgICBuYW1lOwotICAgICBib29sZWFuICAgICAgICAgICAgICAgICBhY2NlcHRfbnVtYmVyczsKLXsKLSAgaW50IG1pZGRsZSwgbG93LCBoaWdoOwotICBpbnQgY21wOwotICBzeW1ib2xTICogc3ltYm9sUDsKLQotICAvKiBJZiB0aGUgcmVnaXN0ZXIgbmFtZSBpcyBhIHN5bWJvbCwgdGhlbiBldmFsdWF0ZSBpdC4gICovCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGFuIGFsaWFzIGZvciBhbm90aGVyIG5hbWUgdGhlbiB1c2UgdGhhdC4KLQkgSWYgdGhlIHN5bWJvbCBpcyBhbiBhbGlhcyBmb3IgYSBudW1iZXIsIHRoZW4gcmV0dXJuIHRoZSBudW1iZXIuICAqLwotICAgICAgaWYgKHN5bWJvbF9lcXVhdGVkX3AgKHN5bWJvbFApKQotCXsKLQkgIG5hbWUgPSBTX0dFVF9OQU1FIChzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFApLT5YX2FkZF9zeW1ib2wpOwotCX0KLSAgICAgIGVsc2UgaWYgKGFjY2VwdF9udW1iZXJzKQotCXsKLQkgIGludCByZWcgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JICAKLQkgIGlmIChyZWcgPj0gMCAmJiByZWcgPD0gMzEpCi0JICAgIHJldHVybiByZWc7Ci0JfQotCi0gICAgICAvKiBPdGhlcndpc2UgZHJvcCB0aHJvdWdoIGFuZCB0cnkgcGFyc2luZyBuYW1lIG5vcm1hbGx5LiAgKi8KLSAgICB9Ci0gIAotICBsb3cgPSAwOwotICBoaWdoID0gcmVnY291bnQgLSAxOwotCi0gIGRvCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHJlZ3NbbWlkZGxlXS5uYW1lKTsKLSAgICAgIGlmIChjbXAgPCAwKQotCWhpZ2ggPSBtaWRkbGUgLSAxOwotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQlsb3cgPSBtaWRkbGUgKyAxOwotICAgICAgZWxzZQotCXJldHVybiByZWdzW21pZGRsZV0udmFsdWU7Ci0gICAgfQotICB3aGlsZSAobG93IDw9IGhpZ2gpOwotICByZXR1cm4gLTE7Ci19Ci0KLQotLyogU3VtbWFyeSBvZiByZWdpc3Rlcl9uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotcmVnaXN0ZXJfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGludCAgICByZWdfbnVtYmVyOwotICBjaGFyICogbmFtZTsKLSAgY2hhciAqIHN0YXJ0OwotICBjaGFyICAgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIHJlZ19udW1iZXIgPSByZWdfbmFtZV9zZWFyY2ggKHByZV9kZWZpbmVkX3JlZ2lzdGVycywgUkVHX05BTUVfQ05ULAotCQkJCW5hbWUsIEZBTFNFKTsKLQotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7CS8qIHB1dCBiYWNrIHRoZSBkZWxpbWl0aW5nIGNoYXIgKi8KLSAgCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wICAgICAgICAgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgID0gTlVMTDsKLSAgICAgIAotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKLSAgICAgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiBzeXN0ZW1fcmVnaXN0ZXJfbmFtZSgpLgotICoKLSAqIGluOiAgSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLgotICogICAgICBleHByZXNzaW9uUCBwb2ludHMgdG8gYW4gZXhwcmVzc2lvbiBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGluLgotICogICAgICBhY2NlcHRfbnVtYmVycyBpcyB0cnVlIGlmZiBudW1lcmljYWwgcmVnaXN0ZXIgbmFtZXMgbWF5IGJlIHVzZWQuCi0gKiAgICAgIGFjY2VwdF9saXN0X25hbWVzIGlzIHRydWUgaWZmIHRoZSBzcGVjaWFsIG5hbWVzIFBTIGFuZCBTUiBtYXkgYmUgCi0gKiAgICAgIGFjY2VwdGVkLgotICoKLSAqIG91dDogQSBleHByZXNzaW9uUyBzdHJ1Y3R1cmUgaW4gZXhwcmVzc2lvblAuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotc3lzdGVtX3JlZ2lzdGVyX25hbWUgKGV4cHJlc3Npb25QLCBhY2NlcHRfbnVtYmVycywgYWNjZXB0X2xpc3RfbmFtZXMpCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci0gICAgIGJvb2xlYW4gICAgICAgYWNjZXB0X251bWJlcnM7Ci0gICAgIGJvb2xlYW4gICAgICAgYWNjZXB0X2xpc3RfbmFtZXM7Ci17Ci0gIGludCAgICByZWdfbnVtYmVyOwotICBjaGFyICogbmFtZTsKLSAgY2hhciAqIHN0YXJ0OwotICBjaGFyICAgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChzeXN0ZW1fcmVnaXN0ZXJzLCBTWVNSRUdfTkFNRV9DTlQsIG5hbWUsCi0JCQkJYWNjZXB0X251bWJlcnMpOwotCi0gICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0gIAotICBpZiAocmVnX251bWJlciA8IDAKLSAgICAgICYmIGFjY2VwdF9udW1iZXJzKQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciAgID0gc3RhcnQ7IC8qIHJlc2V0IGlucHV0X2xpbmUgcG9pbnRlciAqLwotCi0gICAgICBpZiAoaXNkaWdpdCAoKiBpbnB1dF9saW5lX3BvaW50ZXIpKQotCXsKLQkgIHJlZ19udW1iZXIgPSBzdHJ0b2wgKGlucHV0X2xpbmVfcG9pbnRlciwgJiBpbnB1dF9saW5lX3BvaW50ZXIsIDEwKTsKLQotCSAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHJlZ2lzdGVyIG51bWJlciBpcyBhbGxvd2FibGUuICovCi0JICBpZiAoICAgcmVnX251bWJlciA8IDAKLQkJIHx8IHJlZ19udW1iZXIgPiA1Ci0JCSAmJiByZWdfbnVtYmVyIDwgMTYKLQkJIHx8IHJlZ19udW1iZXIgPiAyMAotCQkgKQotCSAgICB7Ci0JICAgICAgcmVnX251bWJlciA9IC0xOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoYWNjZXB0X2xpc3RfbmFtZXMpCi0JewotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCSAgcmVnX251bWJlciA9IHJlZ19uYW1lX3NlYXJjaCAoc3lzdGVtX2xpc3RfcmVnaXN0ZXJzLAotCQkJCQlTWVNSRUdMSVNUX05BTUVfQ05ULCBuYW1lLCBGQUxTRSk7Ci0KLQkgICogaW5wdXRfbGluZV9wb2ludGVyID0gYzsgICAvKiBwdXQgYmFjayB0aGUgZGVsaW1pdGluZyBjaGFyICovCi0JfQotICAgIH0KLSAgCi0gIC8qIGxvb2sgdG8gc2VlIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdGVyIHRhYmxlICovCi0gIGlmIChyZWdfbnVtYmVyID49IDApIAotICAgIHsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wICAgICAgICAgPSBPX3JlZ2lzdGVyOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IHJlZ19udW1iZXI7Ci0KLSAgICAgIC8qIG1ha2UgdGhlIHJlc3QgbmljZSAqLwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wgID0gTlVMTDsKLQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogcmVzZXQgdGhlIGxpbmUgYXMgaWYgd2UgaGFkIG5vdCBkb25lIGFueXRoaW5nICovCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsKLSAgICAgIAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU3VtbWFyeSBvZiBjY19uYW1lKCkuCi0gKgotICogaW46IElucHV0X2xpbmVfcG9pbnRlciBwb2ludHMgdG8gMXN0IGNoYXIgb2Ygb3BlcmFuZC4KLSAqCi0gKiBvdXQ6IEEgZXhwcmVzc2lvblMuCi0gKglUaGUgb3BlcmFuZCBtYXkgaGF2ZSBiZWVuIGEgcmVnaXN0ZXI6IGluIHRoaXMgY2FzZSwgWF9vcCA9PSBPX3JlZ2lzdGVyLAotICoJWF9hZGRfbnVtYmVyIGlzIHNldCB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLCBhbmQgdHJ1dGggaXMgcmV0dXJuZWQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLCBvciBpcyBpbgotICoJaXRzIG9yaWdpbmFsIHN0YXRlLgotICovCi1zdGF0aWMgYm9vbGVhbgotY2NfbmFtZSAoZXhwcmVzc2lvblApCi0gICAgIGV4cHJlc3Npb25TICogZXhwcmVzc2lvblA7Ci17Ci0gIGludCAgICByZWdfbnVtYmVyOwotICBjaGFyICogbmFtZTsKLSAgY2hhciAqIHN0YXJ0OwotICBjaGFyICAgYzsKLQotICAvKiBGaW5kIHRoZSBzcGVsbGluZyBvZiB0aGUgb3BlcmFuZCAqLwotICBzdGFydCA9IG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICByZWdfbnVtYmVyID0gcmVnX25hbWVfc2VhcmNoIChjY19uYW1lcywgQ0NfTkFNRV9DTlQsIG5hbWUsIEZBTFNFKTsKLQotICAqIGlucHV0X2xpbmVfcG9pbnRlciA9IGM7ICAgLyogcHV0IGJhY2sgdGhlIGRlbGltaXRpbmcgY2hhciAqLwotICAKLSAgLyogbG9vayB0byBzZWUgaWYgaXQncyBpbiB0aGUgcmVnaXN0ZXIgdGFibGUgKi8KLSAgaWYgKHJlZ19udW1iZXIgPj0gMCkgCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgICAgICAgICA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gcmVnX251bWJlcjsKLQotICAgICAgLyogbWFrZSB0aGUgcmVzdCBuaWNlICovCi0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCAgPSBOVUxMOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiByZXNldCB0aGUgbGluZSBhcyBpZiB3ZSBoYWQgbm90IGRvbmUgYW55dGhpbmcgKi8KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwotICAgICAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc2tpcF93aGl0ZV9zcGFjZSAodm9pZCkKLXsKLSAgd2hpbGUgKCAgICogaW5wdXRfbGluZV9wb2ludGVyID09ICcgJwotCSB8fCAqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnXHQnKQotICAgICsrIGlucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotLyogU3VtbWFyeSBvZiBwYXJzZV9yZWdpc3Rlcl9saXN0ICgpLgotICoKLSAqIGluOiBJbnB1dF9saW5lX3BvaW50ZXIgIHBvaW50cyB0byAxc3QgY2hhciBvZiBhIGxpc3Qgb2YgcmVnaXN0ZXJzLgotICogICAgIGluc24gICAgICAgICAgICAgICAgaXMgdGhlIHBhcnRpYWxseSBjb25zdHJ1Y3RlZCBpbnN0cnVjdGlvbi4KLSAqICAgICBvcGVyYW5kICAgICAgICAgICAgIGlzIHRoZSBvcGVyYW5kIGJlaW5nIGluc2VydGVkLgotICoKLSAqIG91dDogTlVMTCBpZiB0aGUgcGFyc2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgb3RoZXJ3aXNlIGEKLSAqICAgICAgcG9pbnRlciB0byBhbiBlcnJvciBtZXNzYWdlIGlzIHJldHVybmVkLiAgSWYgdGhlIHBhcnNlCi0gKiAgICAgIGNvbXBsZXRlcyB0aGUgY29ycmVjdCBiaXQgZmllbGRzIGluIHRoZSBpbnN0cnVjdGlvbgotICogICAgICB3aWxsIGJlIGZpbGxlZCBpbi4KLSAqCi0gKiBQYXJzZXMgcmVnaXN0ZXIgbGlzdHMgd2l0aCB0aGUgc3ludGF4OgotICoKLSAqICAgeyByWCB9Ci0gKiAgIHsgclgsIHJZIH0KLSAqICAgeyByWCAtIHJZIH0KLSAqICAgeyByWCAtIHJZLCByWiB9Ci0gKiAgIGV0YwotICoKLSAqIGFuZCBhbHNvIHBhcnNlcyBjb25zdGFudCBlcHhyZXNzaW9ucyB3aG9lcyBiaXRzIGluZGljYXRlIHRoZQotICogcmVnaXN0ZXJzIGluIHRoZSBsaXN0cy4gIFRoZSBMU0IgaW4gdGhlIGV4cHJlc3Npb24gcmVmZXJzIHRvCi0gKiB0aGUgbG93ZXN0IG51bWJlcmVkIHBlcm1pc3NhYmxlIHJlZ2lzdGVyIGluIHRoZSByZWdpc3RlciBsaXN0LAotICogYW5kIHNvIG9uIHVwd2FyZHMuICBTeXN0ZW0gcmVnaXN0ZXJzIGFyZSBjb25zaWRlcmVkIHRvIGJlIHZlcnkKLSAqIGhpZ2ggbnVtYmVycy4KLSAqIAotICovCi1zdGF0aWMgY2hhciAqCi1wYXJzZV9yZWdpc3Rlcl9saXN0Ci0oCi0gIHVuc2lnbmVkIGxvbmcgKiAgICAgICAgICAgICBpbnNuLAotICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZAotKQotewotICBzdGF0aWMgaW50ICB0eXBlMV9yZWdzWyAzMiBdID0geyAzMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotICBzdGF0aWMgaW50ICB0eXBlMl9yZWdzWyAzMiBdID0geyAxOSwgMTgsIDE3LCAxNiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMzAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotICBzdGF0aWMgaW50ICB0eXBlM19yZWdzWyAzMiBdID0geyAgMywgIDIsICAxLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMTQsIDE1LCAxMywgMTIsICA3LCAgNiwgIDUsICA0LCAxMSwgMTAsICA5LCAgOCB9OwotICBpbnQgKiAgICAgICByZWdzOwotICBleHByZXNzaW9uUyBleHA7Ci0KLQotICAvKiBTZWxlY3QgYSByZWdpc3RlciBhcnJheSB0byBwYXJzZS4gKi8KLSAgc3dpdGNoIChvcGVyYW5kLT5zaGlmdCkKLSAgICB7Ci0gICAgY2FzZSAweGZmZTAwMDAxOiByZWdzID0gdHlwZTFfcmVnczsgYnJlYWs7Ci0gICAgY2FzZSAweGZmZjgwMDBmOiByZWdzID0gdHlwZTJfcmVnczsgYnJlYWs7Ci0gICAgY2FzZSAweGZmZjgwMDFmOiByZWdzID0gdHlwZTNfcmVnczsgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGVyYW5kIHNoaWZ0OiAleFxuIiksIG9wZXJhbmQtPnNoaWZ0KTsKLSAgICAgIHJldHVybiBfKCJpbnRlcm5hbCBmYWlsdXJlIGluIHBhcnNlX3JlZ2lzdGVyX2xpc3QiKTsKLSAgICB9Ci0KLSAgc2tpcF93aGl0ZV9zcGFjZSAoKTsKLQotICAvKiBJZiB0aGUgZXhwcmVzc2lvbiBzdGFydHMgd2l0aCBhIGN1cmx5IGJyYWNlIGl0IGlzIGEgcmVnaXN0ZXIgbGlzdC4KLSAgICAgT3RoZXJ3aXNlIGl0IGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbiwgd2hvZXMgYml0cyBpbmRpY2F0ZSB3aGljaAotICAgICByZWdpc3RlcnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0LiAgKi8KLSAgCi0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciAhPSAneycpCi0gICAgewotICAgICAgaW50IGJpdHM7Ci0gICAgICBpbnQgcmVnOwotICAgICAgaW50IGk7Ci0JCQotICAgICAgZXhwcmVzc2lvbiAoJiBleHApOwotICAgICAgCi0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLQlyZXR1cm4gXygiY29uc3RhbnQgZXhwcmVzc2lvbiBvciByZWdpc3RlciBsaXN0IGV4cGVjdGVkIik7Ci0KLSAgICAgIGlmIChyZWdzID09IHR5cGUxX3JlZ3MpCi0JewotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAweEZGRkZGMDAwKQotCSAgICByZXR1cm4gXygiaGlnaCBiaXRzIHNldCBpbiByZWdpc3RlciBsaXN0IGV4cHJlc3Npb24iKTsKLQkgIAotCSAgZm9yIChyZWcgPSAyMDsgcmVnIDwgMzI7IHJlZyArKykKLQkgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAocmVnIC0gMjApKSkKLQkgICAgICB7Ci0JCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQkgIGlmIChyZWdzW2ldID09IHJlZykKLQkJICAgICogaW5zbiB8PSAoMSA8PCBpKTsKLQkgICAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAocmVncyA9PSB0eXBlMl9yZWdzKQotCXsKLQkgIGlmIChleHAuWF9hZGRfbnVtYmVyICYgMHhGRkZFMDAwMCkKLQkgICAgcmV0dXJuIF8oImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIik7Ci0JICAKLQkgIGZvciAocmVnID0gMTsgcmVnIDwgMTY7IHJlZyArKykKLQkgICAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAocmVnIC0gMSkpKQotCSAgICAgIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCSAgaWYgKHJlZ3NbaV0gPT0gcmVnKQotCQkgICAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCSAgICAgIH0KLQotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAxNSkpCi0JICAgICogaW5zbiB8PSAoMSA8PCAzKTsKLQkgIAotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAxNikpCi0JICAgICogaW5zbiB8PSAoMSA8PCAxOSk7Ci0JfQotICAgICAgZWxzZSAvKiByZWdzID09IHR5cGUzX3JlZ3MgKi8KLQl7Ci0JICBpZiAoZXhwLlhfYWRkX251bWJlciAmIDB4RkZGRTAwMDApCi0JICAgIHJldHVybiBfKCJoaWdoIGJpdHMgc2V0IGluIHJlZ2lzdGVyIGxpc3QgZXhwcmVzc2lvbiIpOwotCSAgCi0JICBmb3IgKHJlZyA9IDE2OyByZWcgPCAzMjsgcmVnICsrKQotCSAgICBpZiAoZXhwLlhfYWRkX251bWJlciAmICgxIDw8IChyZWcgLSAxNikpKQotCSAgICAgIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCSAgaWYgKHJlZ3NbaV0gPT0gcmVnKQotCQkgICAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCSAgICAgIH0KLQotCSAgaWYgKGV4cC5YX2FkZF9udW1iZXIgJiAoMSA8PCAxNikpCi0JICAgICogaW5zbiB8PSAoMSA8PCAxOSk7Ci0JfQotCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotCi0gIC8qIFBhcnNlIHRoZSByZWdpc3RlciBsaXN0IHVudGlsIGEgdGVybWluYXRvciAoY2xvc2luZyBjdXJseSBicmFjZSBvcgotICAgICBuZXctbGluZSkgaXMgZm91bmQuICAqLwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmIChyZWdpc3Rlcl9uYW1lICgmIGV4cCkpCi0JewotCSAgaW50ICBpOwotCSAgCi0JICAvKiBMb2NhdGUgdGhlIGdpdmVuIHJlZ2lzdGVyIGluIHRoZSBsaXN0LCBhbmQgaWYgaXQgaXMgdGhlcmUsCi0JICAgICBpbnNlcnQgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGludG8gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKHJlZ3NbIGkgXSA9PSBleHAuWF9hZGRfbnVtYmVyKQotCQl7Ci0JCSAgKiBpbnNuIHw9ICgxIDw8IGkpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGkgPT0gMzIpCi0JICAgIHsKLQkgICAgICByZXR1cm4gXygiaWxsZWdhbCByZWdpc3RlciBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChzeXN0ZW1fcmVnaXN0ZXJfbmFtZSAoJiBleHAsIHRydWUsIHRydWUpKQotCXsKLQkgIGlmIChyZWdzID09IHR5cGUxX3JlZ3MpCi0JICAgIHsKLQkgICAgICByZXR1cm4gXygic3lzdGVtIHJlZ2lzdGVycyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChleHAuWF9hZGRfbnVtYmVyID09IDUpCi0JICAgIHsKLQkgICAgICBpZiAocmVncyA9PSB0eXBlMl9yZWdzKQotCQlyZXR1cm4gXygiUFNXIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0Iik7Ci0JICAgICAgZWxzZQotCQkqIGluc24gfD0gMHg4OwotCSAgICB9Ci0JICBlbHNlIGlmIChleHAuWF9hZGRfbnVtYmVyIDwgNCkKLQkgICAgKiBpbnNuIHw9IDB4ODAwMDA7Ci0JICBlbHNlCi0JICAgIHJldHVybiBfKCJIaWdoIHZhbHVlIHN5c3RlbSByZWdpc3RlcnMgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiKTsKLQl9Ci0gICAgICBlbHNlIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnfScpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyICsrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgZWxzZSBpZiAoKiBpbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlciArKzsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICctJykKLQl7Ci0JICAvKiBXZSBoYXZlIGVuY291bnRlcmVkIGEgcmFuZ2Ugb2YgcmVnaXN0ZXJzOiByWCAtIHJZICovCi0JICBpbnQgICAgICAgICBqOwotCSAgZXhwcmVzc2lvblMgZXhwMjsKLQotCSAgLyogU2tpcCB0aGUgZGFzaC4gICovCi0JICArKyBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLQkgIC8qIEdldCB0aGUgc2Vjb25kIHJlZ2lzdGVyIGluIHRoZSByYW5nZS4gICovCi0JICBpZiAoISByZWdpc3Rlcl9uYW1lICgmIGV4cDIpKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIF8oInNlY29uZCByZWdpc3RlciBzaG91bGQgZm9sbG93IGRhc2ggaW4gcmVnaXN0ZXIgbGlzdCIpOwotCSAgICAgIGV4cDIuWF9hZGRfbnVtYmVyID0gZXhwLlhfYWRkX251bWJlcjsKLQkgICAgfQotCi0JICAvKiBBZGQgdGhlIHJlc3Qgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGUgcmFuZ2UuICAqLwotCSAgZm9yIChqID0gZXhwLlhfYWRkX251bWJlciArIDE7IGogPD0gZXhwMi5YX2FkZF9udW1iZXI7IGorKykKLQkgICAgewotCSAgICAgIGludCAgaTsKLQkgIAotCSAgICAgIC8qIExvY2F0ZSB0aGUgZ2l2ZW4gcmVnaXN0ZXIgaW4gdGhlIGxpc3QsIGFuZCBpZiBpdCBpcyB0aGVyZSwKLQkJIGluc2VydCB0aGUgY29ycmVzcG9uZGluZyBiaXQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQotCQl7Ci0JCSAgaWYgKHJlZ3NbIGkgXSA9PSBqKQotCQkgICAgewotCQkgICAgICAqIGluc24gfD0gKDEgPDwgaSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0KLQkgICAgICBpZiAoaSA9PSAzMikKLQkJcmV0dXJuIF8oImlsbGVnYWwgcmVnaXN0ZXIgaW5jbHVkZWQgaW4gbGlzdCIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgc2tpcF93aGl0ZV9zcGFjZSAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLUNPTlNUIGNoYXIgKiBtZF9zaG9ydG9wdHMgPSAibToiOwotCi1zdHJ1Y3Qgb3B0aW9uIG1kX2xvbmdvcHRzW10gPQotewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YgbWRfbG9uZ29wdHM7IAotCi0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgRklMRSAqIHN0cmVhbTsKLXsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgVjg1MCBvcHRpb25zOlxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW13YXJuLXNpZ25lZC1vdmVyZmxvdyAgICBXYXJuIGlmIHNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93XG4iKSk7Ci0gIGZwcmludGYgKHN0cmVhbSwgXygiICAtbXdhcm4tdW5zaWduZWQtb3ZlcmZsb3cgIFdhcm4gaWYgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvd1xuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW12ODUwICAgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MFxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW12ODUwZSAgICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyB0YXJnZXRlZCBhdCB0aGUgdjg1MGVcbiIpKTsKLSAgZnByaW50ZiAoc3RyZWFtLCBfKCIgIC1tdjg1MGVhICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBlYVxuIikpOwotICBmcHJpbnRmIChzdHJlYW0sIF8oIiAgLW12ODUwYW55ICAgICAgICAgICAgICAgICBUaGUgY29kZSBpcyBnZW5lcmljLCBkZXNwaXRlIGFueSBwcm9jZXNzb3Igc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zXG4iKSk7Ci19Ci0KLWludAotbWRfcGFyc2Vfb3B0aW9uIChjLCBhcmcpCi0gICAgIGludCAgICBjOwotICAgICBjaGFyICogYXJnOwotewotICBpZiAoYyAhPSAnbScpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBjb21tYW5kIGxpbmUgb3B0aW9uOiAtJWMlc1xuIiksIGMsIGFyZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgaWYgKHN0cmNtcCAoYXJnLCAid2Fybi1zaWduZWQtb3ZlcmZsb3ciKSA9PSAwKQotICAgIHsKLSAgICAgIHdhcm5fc2lnbmVkX292ZXJmbG93cyA9IFRSVUU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgIndhcm4tdW5zaWduZWQtb3ZlcmZsb3ciKSA9PSAwKQotICAgIHsKLSAgICAgIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzID0gVFJVRTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MCIpID09IDApCi0gICAgewotICAgICAgbWFjaGluZSA9IDA7Ci0gICAgICBwcm9jZXNzb3JfbWFzayA9IFBST0NFU1NPUl9WODUwOwotICAgIH0KLSAgZWxzZSBpZiAoc3RyY21wIChhcmcsICJ2ODUwZSIpID09IDApCi0gICAgewotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX3Y4NTBlOwotICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEU7Ci0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGFyZywgInY4NTBlYSIpID09IDApCi0gICAgewotICAgICAgbWFjaGluZSA9IGJmZF9tYWNoX3Y4NTBlYTsKLSAgICAgIHByb2Nlc3Nvcl9tYXNrID0gUFJPQ0VTU09SX1Y4NTBFQTsKLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoYXJnLCAidjg1MGFueSIpID09IDApCi0gICAgewotICAgICAgbWFjaGluZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAvKiBUZWxsIHRoZSB3b3JsZCB0aGF0IHRoaXMgaXMgZm9yIGFueSB2ODUwIGNoaXAuICAqLwotICAgICAgcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOyAvKiBCdXQgc3VwcG9ydCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBleHRlbmRlZCB2ZXJzaW9ucy4gICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygidW5rbm93biBjb21tYW5kIGxpbmUgb3B0aW9uOiAtJWMlc1xuIiksIGMsIGFyZyk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIAotICByZXR1cm4gMTsKLX0KLQotc3ltYm9sUyAqCi1tZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKQotICBjaGFyICogbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLWNoYXIgKgotbWRfYXRvZiAodHlwZSwgbGl0cCwgc2l6ZXApCi0gIGludCAgICB0eXBlOwotICBjaGFyICogbGl0cDsKLSAgaW50ICogIHNpemVwOwotewotICBpbnQgICAgICAgICAgICBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1s0XTsKLSAgY2hhciAqICAgICAgICAgdDsKLSAgaW50ICAgICAgICAgICAgaTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZXAgPSAwOwotICAgICAgcmV0dXJuIF8oImJhZCBjYWxsIHRvIG1kX2F0b2YiKTsKLSAgICB9Ci0gIAotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZXAgPSBwcmVjICogMjsKLQotICBmb3IgKGkgPSBwcmVjIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaXRwLCAodmFsdWVUKSB3b3Jkc1tpXSwgMik7Ci0gICAgICBsaXRwICs9IDI7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0KLS8qIFZlcnkgZ3Jvc3MuICAqLwotdm9pZAotbWRfY29udmVydF9mcmFnIChhYmZkLCBzZWMsIGZyYWdQKQotICBiZmQgKiAgICAgIGFiZmQ7Ci0gIGFzZWN0aW9uICogc2VjOwotICBmcmFnUyAqICAgIGZyYWdQOwotewotICBzdWJzZWdfY2hhbmdlIChzZWMsIDApOwotICAKLSAgLyogSW4gcmFuZ2UgY29uZGl0aW9uYWwgb3IgdW5jb25kaXRpb25hbCBicmFuY2guICAqLwotICBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMCB8fCBmcmFnUC0+ZnJfc3VidHlwZSA9PSAyKQotICAgIHsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLCBmcmFnUC0+ZnJfZml4LCAyLCBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBCRkRfUkVMT0NfVU5VU0VEICsgKGludClmcmFnUC0+ZnJfb3Bjb2RlKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSAyOwotICAgIH0KLSAgLyogT3V0IG9mIHJhbmdlIGNvbmRpdGlvbmFsIGJyYW5jaC4gIEVtaXQgYSBicmFuY2ggYXJvdW5kIGEganVtcC4gICovCi0gIGVsc2UgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlID09IDEpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyID0gCi0JKHVuc2lnbmVkIGNoYXIgKikgKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbCk7Ci0KLSAgICAgIC8qIFJldmVyc2UgdGhlIGNvbmRpdGlvbiBvZiB0aGUgZmlyc3QgYnJhbmNoLiAgKi8KLSAgICAgIGJ1ZmZlclswXSBePSAweDA4OwotICAgICAgLyogTWFzayBvZmYgYWxsIHRoZSBkaXNwbGFjZW1lbnQgYml0cy4gICovCi0gICAgICBidWZmZXJbMF0gJj0gMHg4ZjsKLSAgICAgIGJ1ZmZlclsxXSAmPSAweDA3OwotICAgICAgLyogTm93IHNldCB0aGUgZGlzcGxhY2VtZW50IGJpdHMgc28gdGhhdCB3ZSBicmFuY2gKLQkgYXJvdW5kIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0gICAgICBidWZmZXJbMF0gfD0gMHgzMDsKLQotICAgICAgLyogTm93IGNyZWF0ZSB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggKyBmaXh1cCB0byB0aGUgZmluYWwKLQkgdGFyZ2V0LiAgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYnVmZmVyICsgMiwgMHgwMDAwMDc4MCwgNCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCArIDIsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JICAgICAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIEJGRF9SRUxPQ19VTlVTRUQgKwotCSAgICAgICAoaW50KSBmcmFnUC0+ZnJfb3Bjb2RlICsgMSk7Ci0gICAgICBmcmFnUC0+ZnJfdmFyID0gMDsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gNjsKLSAgICB9Ci0gIC8qIE91dCBvZiByYW5nZSB1bmNvbmRpdGlvbmFsIGJyYW5jaC4gIEVtaXQgYSBqdW1wLiAgKi8KLSAgZWxzZSBpZiAoZnJhZ1AtPmZyX3N1YnR5cGUgPT0gMykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfbGl0ZXJhbCwgMHgwMDAwMDc4MCwgNCk7Ci0gICAgICBmaXhfbmV3IChmcmFnUCwgZnJhZ1AtPmZyX2ZpeCwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgQkZEX1JFTE9DX1VOVVNFRCArCi0JICAgICAgIChpbnQpIGZyYWdQLT5mcl9vcGNvZGUgKyAxKTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgZnJhZ1AtPmZyX2ZpeCArPSA0OwotICAgIH0KLSAgZWxzZQotICAgIGFib3J0ICgpOwotfQotCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZywgYWRkcikKLSAgICAgYXNlY3Rpb24gKiBzZWc7Ci0gICAgIHZhbHVlVCAgICAgYWRkcjsKLXsKLSAgaW50IGFsaWduID0gYmZkX2dldF9zZWN0aW9uX2FsaWdubWVudCAoc3Rkb3V0cHV0LCBzZWcpOwotICByZXR1cm4gKChhZGRyICsgKDEgPDwgYWxpZ24pIC0gMSkgJiAoLTEgPDwgYWxpZ24pKTsKLX0KLQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9uYW1lID0gIiI7Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCB2ODUwX29wY29kZSAqIG9wOwotICBmbGFnd29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhYmxlOwotCi0gIGlmIChzdHJuY21wIChUQVJHRVRfQ1BVLCAidjg1MGVhIiwgNikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWFjaGluZSA9PSAtMSkKLQltYWNoaW5lID0gYmZkX21hY2hfdjg1MGVhOwotICAgICAgCi0gICAgICBpZiAocHJvY2Vzc29yX21hc2sgPT0gLTEpCi0JcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEVBOwotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoVEFSR0VUX0NQVSwgInY4NTBlIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWFjaGluZSA9PSAtMSkKLQltYWNoaW5lICAgICAgICA9IGJmZF9tYWNoX3Y4NTBlOwotICAgICAgCi0gICAgICBpZiAocHJvY2Vzc29yX21hc2sgPT0gLTEpCi0JcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MEU7Ci0gICAgfQotICBlbHNlCi0gIGlmIChzdHJuY21wIChUQVJHRVRfQ1BVLCAidjg1MCIsIDQpID09IDApCi0gICAgewotICAgICAgaWYgKG1hY2hpbmUgPT0gLTEpCi0JbWFjaGluZSAgICAgICAgPSAwOwotICAgICAgCi0gICAgICBpZiAocHJvY2Vzc29yX21hc2sgPT0gLTEpCi0JcHJvY2Vzc29yX21hc2sgPSBQUk9DRVNTT1JfVjg1MDsKLSAgICB9Ci0gIGVsc2UKLSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgIGFzX2JhZCAoXygiVW5hYmxlIHRvIGRldGVybWluZSBkZWZhdWx0IHRhcmdldCBwcm9jZXNzb3IgZnJvbSBzdHJpbmc6ICVzIiksIAotICAgICAgICAgICAgVEFSR0VUX0NQVSk7Ci0KLSAgdjg1MF9oYXNoID0gaGFzaF9uZXcoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZS4gIFRoZSBWODUwIGluc3RydWN0aW9uIHNldAotICAgICBoYXMgbWFueSBpZGVudGljYWwgb3Bjb2RlIG5hbWVzIHRoYXQgaGF2ZSBkaWZmZXJlbnQgb3Bjb2RlcyBiYXNlZAotICAgICBvbiB0aGUgb3BlcmFuZHMuICBUaGlzIGhhc2ggdGFibGUgdGhlbiBwcm92aWRlcyBhIHF1aWNrIGluZGV4IHRvCi0gICAgIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotICBvcCA9IHY4NTBfb3Bjb2RlczsKLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHByZXZfbmFtZSwgb3AtPm5hbWUpKSAKLQl7Ci0JICBwcmV2X25hbWUgPSAoY2hhciAqKSBvcC0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0ICh2ODUwX2hhc2gsIG9wLT5uYW1lLCAoY2hhciAqKSBvcCk7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgYmZkX3NldF9hcmNoX21hY2ggKHN0ZG91dHB1dCwgVEFSR0VUX0FSQ0gsIG1hY2hpbmUpOwotCi0gIGFwcGxpY2FibGUgPSBiZmRfYXBwbGljYWJsZV9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQpOwotICAKLSAgY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLmNhbGxfdGFibGVfZGF0YSIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgY2FsbF90YWJsZV9kYXRhX3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUxPQwotCQkJCSAgICAgICB8IFNFQ19EQVRBIHwgU0VDX0hBU19DT05URU5UUykpOwotICAKLSAgY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24gPSBzdWJzZWdfbmV3ICgiLmNhbGxfdGFibGVfdGV4dCIsIDApOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgY2FsbF90YWJsZV90ZXh0X3NlY3Rpb24sCi0JCQkgYXBwbGljYWJsZSAmIChTRUNfQUxMT0MgfCBTRUNfTE9BRCB8IFNFQ19SRUFET05MWQotCQkJCSAgICAgICB8IFNFQ19DT0RFKSk7Ci0gIAotICAvKiBSZXN0b3JlIHRleHQgc2VjdGlvbiBhcyB0aGUgY3VycmVudCBkZWZhdWx0LiAgKi8KLSAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLX0KLQotCi1zdGF0aWMgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlCi1oYW5kbGVfY3RvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZCA9PSBOVUxMKQotICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQ7Ci0KLSAgaWYgKCAgIG9wZXJhbmQtPmJpdHMgICE9IDYKLSAgICAgIHx8IG9wZXJhbmQtPnNoaWZ0ICE9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjdG9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IikpOwotICAgICAgcmV0dXJuIEJGRF9SRUxPQ182NDsgIC8qIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLSAgICB9Ci0gICAgICAKLSAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX0NBTExUXzZfN19PRkZTRVQ7Ci19Ci0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLWhhbmRsZV9zZGFvZmYgKGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgKiBvcGVyYW5kKQotewotICBpZiAob3BlcmFuZCA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1NEQV8xNl8xNl9PRkZTRVQ7Ci0gIGlmIChvcGVyYW5kLT5iaXRzID09IDE1ICYmIG9wZXJhbmQtPnNoaWZ0ID09IDE3KSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE1XzE2X09GRlNFVDsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gLTEpICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VUOwotICAKLSAgaWYgKCAgIG9wZXJhbmQtPmJpdHMgICE9IDE2Ci0gICAgICB8fCBvcGVyYW5kLT5zaGlmdCAhPSAxNikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInNkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IikpOwotICAgICAgcmV0dXJuIEJGRF9SRUxPQ182NDsgIC8qIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLSAgICB9Ci0gIAotICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfU0RBXzE2XzE2X09GRlNFVDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotaGFuZGxlX3pkYW9mZiAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDsKLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMTUgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMTcpIHJldHVybiBCRkRfUkVMT0NfVjg1MF9aREFfMTVfMTZfT0ZGU0VUOwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSAtMSkgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQ7Ci0KLSAgaWYgKCAgIG9wZXJhbmQtPmJpdHMgICE9IDE2Ci0gICAgICB8fCBvcGVyYW5kLT5zaGlmdCAhPSAxNikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInpkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IikpOwotICAgICAgcmV0dXJuIEJGRF9SRUxPQ182NDsgIC8qIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLSAgICB9Ci0gIAotICByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfWkRBXzE2XzE2X09GRlNFVDsKLX0KLQotc3RhdGljIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZQotaGFuZGxlX3RkYW9mZiAoY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQpCi17Ci0gIGlmIChvcGVyYW5kID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfN183X09GRlNFVDsgIC8qIGRhdGEgaXRlbSwgbm90IGFuIGluc3RydWN0aW9uLiAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gNiAmJiBvcGVyYW5kLT5zaGlmdCA9PSAxKSAgICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV82XzhfT0ZGU0VUOyAgLyogc2xkLncvc3N0LncsIG9wZXJhbmQ6IEQ4XzYgICovCi0gIGlmIChvcGVyYW5kLT5iaXRzID09IDQgJiYgb3BlcmFuZC0+aW5zZXJ0ICE9IE5VTEwpIHJldHVybiBCRkRfUkVMT0NfVjg1MF9UREFfNF81X09GRlNFVDsgIC8qIHNsZC5odSwgb3BlcmFuZDogRDUtNCAqLwotICBpZiAob3BlcmFuZC0+Yml0cyA9PSA0ICYmIG9wZXJhbmQtPmluc2VydCA9PSBOVUxMKSByZXR1cm4gQkZEX1JFTE9DX1Y4NTBfVERBXzRfNF9PRkZTRVQ7ICAvKiBzbGQuYnUsIG9wZXJhbmQ6IEQ0ICAgKi8KLSAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMTYgJiYgb3BlcmFuZC0+c2hpZnQgPT0gMTYpICAgcmV0dXJuIEJGRF9SRUxPQ19WODUwX1REQV8xNl8xNl9PRkZTRVQ7IC8qIHNldDEgJiBjaHVtcywgb3BlcmFuZHM6IEQxNiAqLwotICAKLSAgaWYgKG9wZXJhbmQtPmJpdHMgIT0gNykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInRkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IikpOwotICAgICAgcmV0dXJuIEJGRF9SRUxPQ182NDsgIC8qIFVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLSAgICB9Ci0gIAotICByZXR1cm4gIG9wZXJhbmQtPmluc2VydCAhPSBOVUxMCi0gICAgPyBCRkRfUkVMT0NfVjg1MF9UREFfN184X09GRlNFVCAgICAgLyogc2xkLmgvc3N0LmgsIG9wZXJhbmQ6IEQ4XzcgKi8KLSAgICA6IEJGRF9SRUxPQ19WODUwX1REQV83XzdfT0ZGU0VUOyAgICAvKiBzbGQuYi9zc3QuYiwgb3ByZWFuZDogRDcgICAqLwotfQotCi0vKiBXYXJuaW5nOiBUaGUgY29kZSBpbiB0aGlzIGZ1bmN0aW9uIHJlbGllcyB1cG9uIHRoZSBkZWZpbml0aW9ucwotICAgaW4gdGhlIHY4NTBfb3BlcmFuZHNbXSBhcnJheSAoZGVmaW5lZCBpbiBvcGNvZGVzL3Y4NTAtb3BjLmMpCi0gICBtYXRjaGluZyB0aGUgaGFyZCBjb2RlZCB2YWx1ZXMgY29udGFpbmVkIGhlcmVpbi4gICovCi0KLXN0YXRpYyBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUKLXY4NTBfcmVsb2NfcHJlZml4IChjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZCkKLXsKLSAgYm9vbGVhbiBwYXJlbl9za2lwcGVkID0gZmFsc2U7Ci0KLQotICAvKiBTa2lwIGxlYWRpbmcgb3BlbmluZyBwYXJlbnRoZXNpcy4gICovCi0gIGlmICgqIGlucHV0X2xpbmVfcG9pbnRlciA9PSAnKCcpCi0gICAgewotICAgICAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcGFyZW5fc2tpcHBlZCA9IHRydWU7Ci0gICAgfQotCi0jZGVmaW5lIENIRUNLXyhuYW1lLCByZWxvYykgCQkJCQkJXAotICBpZiAoc3RybmNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCBuYW1lIyMiKCIsIHN0cmxlbiAobmFtZSkgKyAxKSA9PSAwKQlcCi0gICAgewkJCQkJCQkJCVwKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSBzdHJsZW4gKG5hbWUpOwkJCQlcCi0gICAgICByZXR1cm4gcmVsb2M7CQkJCQkJCVwKLSAgICB9Ci0gIAotICBDSEVDS18gKCJoaTAiLCAgICBCRkRfUkVMT0NfSEkxNik7Ci0gIENIRUNLXyAoImhpIiwgICAgIEJGRF9SRUxPQ19ISTE2X1MpOwotICBDSEVDS18gKCJsbyIsICAgICBCRkRfUkVMT0NfTE8xNik7Ci0gIENIRUNLXyAoInNkYW9mZiIsIGhhbmRsZV9zZGFvZmYgKG9wZXJhbmQpKTsKLSAgQ0hFQ0tfICgiemRhb2ZmIiwgaGFuZGxlX3pkYW9mZiAob3BlcmFuZCkpOwotICBDSEVDS18gKCJ0ZGFvZmYiLCBoYW5kbGVfdGRhb2ZmIChvcGVyYW5kKSk7Ci0gIENIRUNLXyAoImhpbG8iLCAgIEJGRF9SRUxPQ18zMik7Ci0gIENIRUNLXyAoImN0b2ZmIiwgIGhhbmRsZV9jdG9mZiAob3BlcmFuZCkpOwotICAKLSAgLyogUmVzdG9yZSBza2lwcGVkIHBhcmVudGhlc2lzLiAgKi8KLSAgaWYgKHBhcmVuX3NraXBwZWQpCi0gICAgLS0gaW5wdXRfbGluZV9wb2ludGVyOwotICAKLSAgcmV0dXJuIEJGRF9SRUxPQ19VTlVTRUQ7Ci19Ci0KLS8qIEluc2VydCBhbiBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotdjg1MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgdmFsLCBmaWxlLCBsaW5lLCBzdHIpCi0gICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZDsKLSAgICAgb2Zmc2V0VCAgICAgICAgICAgICAgICAgICAgIHZhbDsKLSAgICAgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIGZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBsaW5lOwotICAgICBjaGFyICogICAgICAgICAgICAgICAgICAgICAgc3RyOwotewotICBpZiAob3BlcmFuZC0+aW5zZXJ0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKiBtZXNzYWdlID0gTlVMTDsKLSAgICAgIAotICAgICAgaW5zbiA9IG9wZXJhbmQtPmluc2VydCAoaW5zbiwgdmFsLCAmIG1lc3NhZ2UpOwotICAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkKLQl7Ci0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKLQkgICAgICAmJiAhIHdhcm5fc2lnbmVkX292ZXJmbG93cwotCSAgICAgICYmIHN0cnN0ciAobWVzc2FnZSwgIm91dCBvZiByYW5nZSIpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBza2lwIHdhcm5pbmcuLi4gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkgPT0gMAotCQkgICAmJiAhIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzCi0JCSAgICYmIHN0cnN0ciAobWVzc2FnZSwgIm91dCBvZiByYW5nZSIpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBza2lwIHdhcm5pbmcuLi4gKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyKQotCSAgICB7Ci0JICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLQkJYXNfd2FybiAoIiVzOiAlcyIsIHN0ciwgbWVzc2FnZSk7Ci0JICAgICAgZWxzZQotCQlhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCAiJXM6ICVzIiwgc3RyLCBtZXNzYWdlKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGZpbGUgPT0gKGNoYXIgKikgTlVMTCkKLQkJYXNfd2FybiAobWVzc2FnZSk7Ci0JICAgICAgZWxzZQotCQlhc193YXJuX3doZXJlIChmaWxlLCBsaW5lLCBtZXNzYWdlKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAob3BlcmFuZC0+Yml0cyAhPSAzMikKLQl7Ci0JICBsb25nICAgIG1pbiwgbWF4OwotCSAgb2Zmc2V0VCB0ZXN0OwotCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkgIT0gMCkKLQkgICAgewotCSAgICAgIGlmICghIHdhcm5fc2lnbmVkX292ZXJmbG93cykKLQkJbWF4ID0gKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxOwotCSAgICAgIGVsc2UKLQkJbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCSAgICAgIAotCSAgICAgIG1pbiA9IC0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1heCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQkgICAgICAKLQkgICAgICBpZiAoISB3YXJuX3Vuc2lnbmVkX292ZXJmbG93cykKLQkJbWluID0gLSAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQkgICAgICBlbHNlCi0JCW1pbiA9IDA7Ci0JICAgIH0KLQkgIAotCSAgaWYgKHZhbCA8IChvZmZzZXRUKSBtaW4gfHwgdmFsID4gKG9mZnNldFQpIG1heCkKLQkgICAgewotCSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgICAgY29uc3QgY2hhciAqIGVyciA9IF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKTsKLQkgICAgICBjaGFyICAgICAgICAgYnVmWzEwMF07Ci0JICAgICAgCi0JICAgICAgLyogUmVzdG9yZSBtaW4gYW5kIG1peCB0byBleHBlY3RlZCB2YWx1ZXMgZm9yIGRlY2ltYWwgcmFuZ2VzLiAgKi8KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKLQkJICAmJiAhIHdhcm5fc2lnbmVkX292ZXJmbG93cykKLQkJbWF4ID0gKDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKSkgLSAxOwotCi0JICAgICAgaWYgKCEgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKLQkJICAmJiAhIHdhcm5fdW5zaWduZWRfb3ZlcmZsb3dzKQotCQltaW4gPSAwOwotCi0JICAgICAgaWYgKHN0cikKLQkJewotCQkgIHNwcmludGYgKGJ1ZiwgIiVzOiAiLCBzdHIpOwotCQkgIAotCQkgIHNwcmludF92YWx1ZSAoYnVmICsgc3RybGVuIChidWYpLCB2YWwpOwotCQl9Ci0JICAgICAgZWxzZQotCQlzcHJpbnRfdmFsdWUgKGJ1ZiwgdmFsKTsKLQkgICAgICAKLQkgICAgICBpZiAoZmlsZSA9PSAoY2hhciAqKSBOVUxMKQotCQlhc193YXJuIChlcnIsIGJ1ZiwgbWluLCBtYXgpOwotCSAgICAgIGVsc2UKLQkJYXNfd2Fybl93aGVyZSAoZmlsZSwgbGluZSwgZXJyLCBidWYsIG1pbiwgbWF4KTsKLQkgICAgfQotCX0KLQotICAgICAgaW5zbiB8PSAoKChsb25nKSB2YWwgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQpOwotICAgIH0KLSAgCi0gIHJldHVybiBpbnNuOwotfQotCi0MCi1zdGF0aWMgY2hhciAgICAgICAgICAgICAgICAgY29weV9vZl9pbnN0cnVjdGlvbiBbMTI4XTsKLQotdm9pZAotbWRfYXNzZW1ibGUgKHN0cikgCi0gICAgIGNoYXIgKiBzdHI7Ci17Ci0gIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgczsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICBzdGFydF9vZl9vcGVyYW5kczsKLSAgc3RydWN0IHY4NTBfb3Bjb2RlICogICAgICBvcGNvZGU7Ci0gIHN0cnVjdCB2ODUwX29wY29kZSAqICAgICAgbmV4dF9vcGNvZGU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiAgICAgb3BpbmRleF9wdHI7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9vcGluZGV4OwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIHJlbGF4YWJsZTsKLSAgdW5zaWduZWQgbG9uZyAgICAgICAgICAgICBpbnNuOwotICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgIGluc25fc2l6ZTsKLSAgY2hhciAqICAgICAgICAgICAgICAgICAgICBmOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGk7Ci0gIGludCAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2g7Ci0gIGJvb2xlYW4gICAgICAgICAgICAgICAgICAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gZmFsc2U7Ci0gIHVuc2lnbmVkICAgICAgICAgICAgICAgICAgZXh0cmFfZGF0YV9sZW47Ci0gIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgZXh0cmFfZGF0YTsKLSAgY2hhciAqCQkgICAgc2F2ZWRfaW5wdXRfbGluZV9wb2ludGVyOwotCi0gIAotICBzdHJuY3B5IChjb3B5X29mX2luc3RydWN0aW9uLCBzdHIsIHNpemVvZiAoY29weV9vZl9pbnN0cnVjdGlvbikgLSAxKTsKLSAgCi0gIC8qIEdldCB0aGUgb3Bjb2RlLiAgKi8KLSAgZm9yIChzID0gc3RyOyAqcyAhPSAnXDAnICYmICEgaXNzcGFjZSAoKnMpOyBzKyspCi0gICAgY29udGludWU7Ci0gIAotICBpZiAoKnMgIT0gJ1wwJykKLSAgICAqcysrID0gJ1wwJzsKLQotICAvKiBmaW5kIHRoZSBmaXJzdCBvcGNvZGUgd2l0aCB0aGUgcHJvcGVyIG5hbWUgKi8KLSAgb3Bjb2RlID0gKHN0cnVjdCB2ODUwX29wY29kZSAqKSBoYXNoX2ZpbmQgKHY4NTBfaGFzaCwgc3RyKTsKLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBhc19iYWQgKF8oIlVucmVjb2duaXplZCBvcGNvZGU6IGAlcyciKSwgc3RyKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ciA9IHM7Ci0gIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0gICAgKysgc3RyOwotCi0gIHN0YXJ0X29mX29wZXJhbmRzID0gc3RyOwotCi0gIHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgCi0gIGZvciAoOzspCi0gICAgewotICAgICAgY29uc3QgY2hhciAqIGVycm1zZyA9IE5VTEw7Ci0KLSAgICAgIG1hdGNoID0gMDsKLSAgICAgIAotICAgICAgaWYgKChvcGNvZGUtPnByb2Nlc3NvcnMgJiBwcm9jZXNzb3JfbWFzaykgPT0gMCkKLQl7Ci0JICBlcnJtc2cgPSBfKCJUYXJnZXQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpbnN0cnVjdGlvbi4iKTsKLQkgIGdvdG8gZXJyb3I7Ci0JfQotICAgICAgCi0gICAgICByZWxheGFibGUgPSAwOwotICAgICAgZmMgPSAwOwotICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLSAgICAgIGluc24gPSBvcGNvZGUtPm9wY29kZTsKLSAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IGZhbHNlOwotCi0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHIgPSBzdGFydF9vZl9vcGVyYW5kczsKLQotICAgICAgZm9yIChvcGluZGV4X3B0ciA9IG9wY29kZS0+b3BlcmFuZHM7ICpvcGluZGV4X3B0ciAhPSAwOyBvcGluZGV4X3B0ciArKykKLQl7Ci0JICBjb25zdCBzdHJ1Y3Qgdjg1MF9vcGVyYW5kICogb3BlcmFuZDsKLQkgIGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICBob2xkOwotCSAgZXhwcmVzc2lvblMgICAgICAgICAgICAgICAgIGV4OwotCSAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlICAgIHJlbG9jOwotCi0JICBpZiAobmV4dF9vcGluZGV4ID09IDApCi0JICAgIHsKLQkgICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyAqIG9waW5kZXhfcHRyIF07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG9wZXJhbmQgICAgICA9ICYgdjg1MF9vcGVyYW5kc1sgbmV4dF9vcGluZGV4IF07Ci0JICAgICAgbmV4dF9vcGluZGV4ID0gMDsKLQkgICAgfQotCi0JICBlcnJtc2cgPSBOVUxMOwotCi0JICB3aGlsZSAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnLCcgfHwgKnN0ciA9PSAnWycgfHwgKnN0ciA9PSAnXScpCi0JICAgICsrIHN0cjsKLQotCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFTEFYKQotCSAgICByZWxheGFibGUgPSAxOwotCi0JICAvKiBHYXRoZXIgdGhlIG9wZXJhbmQuICovCi0JICBob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RyOwotCSAgCi0JICAvKiBsbygpLCBoaSgpLCBoaTAoKSwgZXRjLi4uICovCi0JICBpZiAoKHJlbG9jID0gdjg1MF9yZWxvY19wcmVmaXggKG9wZXJhbmQpKSAhPSBCRkRfUkVMT0NfVU5VU0VEKQotCSAgICB7Ci0JICAgICAgLyogVGhpcyBpcyBhIGZha2UgcmVsb2MsIHVzZWQgdG8gaW5kaWNhdGUgYW4gZXJyb3IgY29uZGl0aW9uLiAgKi8KLQkgICAgICBpZiAocmVsb2MgPT0gQkZEX1JFTE9DXzY0KQotCQl7Ci0JCSAgbWF0Y2ggPSAxOwotCQkgIGdvdG8gZXJyb3I7Ci0JCX0KLQkJIAotCSAgICAgIGV4cHJlc3Npb24gKCYgZXgpOwotCi0JICAgICAgaWYgKGV4Llhfb3AgPT0gT19jb25zdGFudCkKLQkJewotCQkgIHN3aXRjaCAocmVsb2MpCi0JCSAgICB7Ci0JCSAgICBjYXNlIEJGRF9SRUxPQ19WODUwX1pEQV8xNl8xNl9PRkZTRVQ6Ci0JCSAgICAgIC8qIFRvIGNvcGUgd2l0aCAibm90MSA3LCB6ZGFvZmYoMHhmZmZmZjAwNilbcjBdIgotCQkJIGFuZCB0aGUgbGlrZS4gICovCi0JCSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0JCSAgICAgIAotCQkgICAgY2FzZSBCRkRfUkVMT0NfTE8xNjoKLQkJICAgICAgewotCQkJLyogVHJ1bmNhdGUsIHRoZW4gc2lnbiBleHRlbmQgdGhlIHZhbHVlLiAgKi8KLQkJCWV4LlhfYWRkX251bWJlciA9IFNFWFQxNiAoZXguWF9hZGRfbnVtYmVyKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0KLQkJICAgIGNhc2UgQkZEX1JFTE9DX0hJMTY6Ci0JCSAgICAgIHsKLQkJCS8qIFRydW5jYXRlLCB0aGVuIHNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4gICovCi0JCQlleC5YX2FkZF9udW1iZXIgPSBTRVhUMTYgKGV4LlhfYWRkX251bWJlciA+PiAxNik7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCi0JCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0JCSAgICAgIHsKLQkJCS8qIFRydW5jYXRlLCB0aGVuIHNpZ24gZXh0ZW5kIHRoZSB2YWx1ZS4gICovCi0JCSAgICAgICAgaW50IHRlbXAgPSAoZXguWF9hZGRfbnVtYmVyID4+IDE2KSAmIDB4ZmZmZjsKLQotCQkJdGVtcCArPSAoZXguWF9hZGRfbnVtYmVyID4+IDE1KSAmIDE7Ci0KLQkJCWV4LlhfYWRkX251bWJlciA9IFNFWFQxNiAodGVtcCk7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgCi0JCSAgICBjYXNlIEJGRF9SRUxPQ18zMjoKLQkJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX0lNTUVESUFURTMyKSA9PSAwKQotCQkJewotCQkJICBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgb3BlcmFuZCBpcyB0b28gbGFyZ2UiKTsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgICAgCi0JCSAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7Ci0JCSAgICAgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDQ7Ci0JCSAgICAgIGV4dHJhX2RhdGEgICAgICAgICAgICA9IGV4LlhfYWRkX251bWJlcjsKLQkJICAgICAgZXguWF9hZGRfbnVtYmVyICAgICAgID0gMDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICAgIAotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLCAicmVsb2M6ICVkXG4iLCByZWxvYyk7Ci0JCSAgICAgIGFzX2JhZCAoXygiQUFBUkcgLT4gdW5oYW5kbGVkIGNvbnN0YW50IHJlbG9jIikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgIGlmIChmYyA+IE1BWF9JTlNOX0ZJWFVQUykKLQkJICAgIGFzX2ZhdGFsIChfKCJ0b28gbWFueSBmaXh1cHMiKSk7Ci0JCSAgCi0JCSAgZml4dXBzWyBmYyBdLmV4cCAgICAgPSBleDsKLQkJICBmaXh1cHNbIGZjIF0ub3BpbmRleCA9ICogb3BpbmRleF9wdHI7Ci0JCSAgZml4dXBzWyBmYyBdLnJlbG9jICAgPSByZWxvYzsKLQkJICBmYysrOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHJlbG9jID09IEJGRF9SRUxPQ18zMikKLQkJICAgIHsKLQkJICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX0lNTUVESUFURTMyKSA9PSAwKQotCQkJewotCQkJICBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgb3BlcmFuZCBpcyB0b28gbGFyZ2UiKTsKLQkJCSAgZ290byBlcnJvcjsKLQkJCX0KLQkJICAgICAgCi0JCSAgICAgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7Ci0JCSAgICAgIGV4dHJhX2RhdGFfbGVuICAgICAgICA9IDQ7Ci0JCSAgICAgIGV4dHJhX2RhdGEgICAgICAgICAgICA9IGV4LlhfYWRkX251bWJlcjsKLQkJICAgIH0KLQkJICAgICAgCi0JCSAgaWYgKGZjID4gTUFYX0lOU05fRklYVVBTKQotCQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCQkgIGZpeHVwc1sgZmMgXS5leHAgICAgID0gZXg7Ci0JCSAgZml4dXBzWyBmYyBdLm9waW5kZXggPSAqIG9waW5kZXhfcHRyOwotCQkgIGZpeHVwc1sgZmMgXS5yZWxvYyAgID0gcmVsb2M7Ci0JCSAgZmMrKzsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBlcnJtc2cgPSBOVUxMOwotCSAgICAgIAotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSAhPSAwKSAKLQkJewotCQkgIGlmICghcmVnaXN0ZXJfbmFtZSAoJiBleCkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oImludmFsaWQgcmVnaXN0ZXIgbmFtZSIpOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfTk9UX1IwKQotCQkgICAgICAmJiBleC5YX2FkZF9udW1iZXIgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgZXJybXNnID0gXygicmVnaXN0ZXIgcjAgY2Fubm90IGJlIHVzZWQgaGVyZSIpOwotCQkgICAgICAKLQkJICAgICAgLyogRm9yY2UgYW4gZXJyb3IgbWVzc2FnZSB0byBiZSBnZW5lcmF0ZWQgYnkKLQkJCSBza2lwcGluZyBvdmVyIGFueSBmb2xsb3dpbmcgcG90ZW50aWFsIG1hdGNoZXMKLQkJCSBmb3IgdGhpcyBvcGNvZGUuICAqLwotCQkgICAgICBvcGNvZGUgKz0gMzsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TUkcpICE9IDApIAotCQl7Ci0JCSAgaWYgKCFzeXN0ZW1fcmVnaXN0ZXJfbmFtZSAoJiBleCwgdHJ1ZSwgZmFsc2UpKQotCQkgICAgewotCQkgICAgICBlcnJtc2cgPSBfKCJpbnZhbGlkIHN5c3RlbSByZWdpc3RlciBuYW1lIik7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfRVApICE9IDApCi0JCXsKLQkJICBjaGFyICogc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCSAgY2hhciAgIGMgICAgID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JCSAgCi0JCSAgaWYgKHN0cmNtcCAoc3RhcnQsICJlcCIpICE9IDAgJiYgc3RyY21wIChzdGFydCwgInIzMCIpICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIC8qIFB1dCB0aGluZ3MgYmFjayB0aGUgd2F5IHdlIGZvdW5kIHRoZW0uICAqLwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gc3RhcnQ7Ci0JCSAgICAgIGVycm1zZyA9IF8oImV4cGVjdGVkIEVQIHJlZ2lzdGVyIik7Ci0JCSAgICAgIGdvdG8gZXJyb3I7Ci0JCSAgICB9Ci0JCSAgCi0JCSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0JICAgICAgCi0JCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnIHx8ICpzdHIgPT0gJ1snIHx8ICpzdHIgPT0gJ10nKQotCQkgICAgKysgc3RyOwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX0NDKSAhPSAwKSAKLQkJewotCQkgIGlmICghY2NfbmFtZSAoJiBleCkpCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oImludmFsaWQgY29uZGl0aW9uIGNvZGUgbmFtZSIpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9QVVNIX1BPUCkgCi0JCXsKLQkJICBlcnJtc2cgPSBwYXJzZV9yZWdpc3Rlcl9saXN0ICgmIGluc24sIG9wZXJhbmQpOwotCQkgIAotCQkgIC8qIFRoZSBwYXJzZV9yZWdpc3Rlcl9saXN0KCkgZnVuY3Rpb24gaGFzIGFscmVhZHkgZG9uZQotCQkgICAgIGV2ZXJ5dGhpbmcsIHNvIGZha2UgYSBkdW1teSBleHByZXNzaW9uLiAgKi8KLQkJICBleC5YX29wICAgICAgICAgPSBPX2NvbnN0YW50OwotCQkgIGV4LlhfYWRkX251bWJlciA9IDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBFX0lNTUVESUFURTE2KSAKLQkJewotCQkgIGV4cHJlc3Npb24gKCYgZXgpOwotCi0JCSAgaWYgKGV4Llhfb3AgIT0gT19jb25zdGFudCkKLQkJICAgIGVycm1zZyA9IF8oImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKLQkJICBlbHNlIGlmIChleC5YX2FkZF9udW1iZXIgJiAweGZmZmYwMDAwKQotCQkgICAgewotCQkgICAgICBpZiAoZXguWF9hZGRfbnVtYmVyICYgMHhmZmZmKQotCQkJZXJybXNnID0gXygiY29uc3RhbnQgdG9vIGJpZyB0byBmaXQgaW50byBpbnN0cnVjdGlvbiIpOwotCQkgICAgICBlbHNlIGlmICgoaW5zbiAmIDB4MDAxZmZmYzApID09IDB4MDAxMzA3ODApCi0JCQlleC5YX2FkZF9udW1iZXIgPj49IDE2OwotCQkgICAgICBlbHNlCi0JCQllcnJtc2cgPSBfKCJjb25zdGFudCB0b28gYmlnIHRvIGZpdCBpbnRvIGluc3RydWN0aW9uIik7Ci0JCSAgICB9Ci0JCSAgCi0JCSAgZXh0cmFfZGF0YV9hZnRlcl9pbnNuID0gdHJ1ZTsKLQkJICBleHRyYV9kYXRhX2xlbiAgICAgICAgPSAyOwotCQkgIGV4dHJhX2RhdGEgICAgICAgICAgICA9IGV4LlhfYWRkX251bWJlcjsKLQkJICBleC5YX2FkZF9udW1iZXIgICAgICAgPSAwOwotCQl9Ci0JICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwRV9JTU1FRElBVEUzMikgCi0JCXsKLQkJICBleHByZXNzaW9uICgmIGV4KTsKLQkJICAKLQkJICBpZiAoZXguWF9vcCAhPSBPX2NvbnN0YW50KQotCQkgICAgZXJybXNnID0gXygiY29uc3RhbnQgZXhwcmVzc2lvbiBleHBlY3RlZCIpOwotCQkgIAotCQkgIGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbiA9IHRydWU7Ci0JCSAgZXh0cmFfZGF0YV9sZW4gICAgICAgID0gNDsKLQkJICBleHRyYV9kYXRhICAgICAgICAgICAgPSBleC5YX2FkZF9udW1iZXI7Ci0JCSAgZXguWF9hZGRfbnVtYmVyICAgICAgID0gMDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHJlZ2lzdGVyX25hbWUgKCYgZXgpCi0JCSAgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfUkVHKSA9PSAwKQotCQl7Ci0JCSAgY2hhciBjOwotCQkgIGludCAgZXhpc3RzID0gMDsKLQkJICAKLQkJICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGFuIGFsaWFzIGhhcyBiZWVuIGRlZmluZWQgdGhhdAotCQkgICAgIG1hdGNoZXMgYSByZWdpc3RlciBuYW1lLiAgRm9yIGV4YW1wbGUgdGhlIGNvZGUgbWF5Ci0JCSAgICAgaW5jbHVkZSBhICIuc2V0IFpFUk8sIDAiIGRpcmVjdGl2ZSwgd2hpY2ggbWF0Y2hlcwotCQkgICAgIHRoZSByZWdpc3RlciBuYW1lICJ6ZXJvIi4gIEF0dGVtcHQgdG8gcmVwYXJzZSB0aGUKLQkJICAgICBmaWVsZCBhcyBhbiBleHByZXNzaW9uLCBhbmQgb25seSBjb21wbGFpbiBpZiB3ZQotCQkgICAgIGNhbm5vdCBnZW5lcmF0ZSBhIGNvbnN0YW50LiAgKi8KLQotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQotCQkgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQkJICAKLQkJICBpZiAoc3ltYm9sX2ZpbmQgKHN0cikgIT0gTlVMTCkKLQkJICAgIGV4aXN0cyA9IDE7Ci0JCSAgCi0JCSAgKiBpbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0cjsKLQkJICAKLQkJICBleHByZXNzaW9uICgmIGV4KTsKLQotCQkgIGlmIChleC5YX29wICE9IE9fY29uc3RhbnQpCi0JCSAgICB7Ci0JCSAgICAgIC8qIElmIHRoaXMgcmVnaXN0ZXIgaXMgYWN0dWFsbHkgb2NjdXJpbmcgdG9vIGVhcmx5IG9uCi0JCQkgdGhlIHBhcnNpbmcgb2YgdGhlIGluc3RydWN0aW9uLCAoYmVjYXVzZSBhbm90aGVyCi0JCQkgZmllbGQgaXMgbWlzc2luZykgdGhlbiByZXBvcnQgdGhpcy4gICovCi0JCSAgICAgIGlmIChvcGluZGV4X3B0clsxXSAhPSAwCi0JCQkgICYmICh2ODUwX29wZXJhbmRzIFtvcGluZGV4X3B0ciBbMV1dLmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykpCi0JCQllcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IHZhbHVlIGlzIG1pc3NpbmcgYmVmb3JlIHRoZSByZWdpc3RlciBuYW1lIik7Ci0JCSAgICAgIGVsc2UKLQkJCWVycm1zZyA9IF8oInN5bnRheCBlcnJvcjogcmVnaXN0ZXIgbm90IGV4cGVjdGVkIik7Ci0KLQkJICAgICAgLyogSWYgd2UgY3JlYXRlZCBhIHN5bWJvbCBpbiB0aGUgcHJvY2VzcyBvZiB0aGlzIHRlc3QgdGhlbgotCQkJIGRlbGV0ZSBpdCBub3csIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUgb3V0cHV0IHdpdGggdGhlIHJlYWwKLQkJCSBzeW1ib2xzLi4uICovCi0JCSAgICAgIGlmIChleGlzdHMgPT0gMAotCQkJICAmJiBleC5YX29wID09IE9fc3ltYm9sKQotCQkJc3ltYm9sX3JlbW92ZSAoZXguWF9hZGRfc3ltYm9sLAotCQkJCSAgICAgICAmIHN5bWJvbF9yb290UCwgJiBzeW1ib2xfbGFzdFApOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoc3lzdGVtX3JlZ2lzdGVyX25hbWUgKCYgZXgsIGZhbHNlLCBmYWxzZSkKLQkJICAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9TUkcpID09IDApCi0JCXsKLQkJICBlcnJtc2cgPSBfKCJzeW50YXggZXJyb3I6IHN5c3RlbSByZWdpc3RlciBub3QgZXhwZWN0ZWQiKTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGNjX25hbWUgKCZleCkKLQkJICAgICAgICYmIChvcGVyYW5kLT5mbGFncyAmIFY4NTBfT1BFUkFORF9DQykgPT0gMCkKLQkJewotCQkgIGVycm1zZyA9IF8oInN5bnRheCBlcnJvcjogY29uZGl0aW9uIGNvZGUgbm90IGV4cGVjdGVkIik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBleHByZXNzaW9uICgmIGV4KTsKLQkJICAvKiBTcGVjaWFsIGNhc2U6Ci0JCSAgICAgSWYgd2UgYXJlIGFzc2VtYmxpbmcgYSBNT1YgaW5zdHJ1Y3Rpb24gKG9yIGEgQ0FMTFQuLi4uIDotKQotCQkgICAgIGFuZCB0aGUgaW1tZWRpYXRlIHZhbHVlIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBiaXRzCi0JCSAgICAgYXZhaWxhYmxlIHRoZW4gY3JlYXRlIGEgZmFrZSBlcnJvciBzbyB0aGF0IHRoZSBuZXh0IE1PVgotCQkgICAgIGluc3RydWN0aW9uIHdpbGwgYmUgc2VsZWN0ZWQuICBUaGlzIG9uZSBoYXMgYSAzMiBiaXQKLQkJICAgICBpbW1lZGlhdGUgZmllbGQuICAqLwotCi0JCSAgaWYgKCgoaW5zbiAmIDB4MDdlMCkgPT0gMHgwMjAwKQotCQkgICAgICAmJiBleC5YX29wID09IE9fY29uc3RhbnQKLQkJICAgICAgJiYgKGV4LlhfYWRkX251bWJlciA8ICgtICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKQotCQkJICB8fCBleC5YX2FkZF9udW1iZXIgPiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkpCi0JCSAgICBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgb3BlcmFuZCBpcyB0b28gbGFyZ2UiKTsKLQkJfQotCi0JICAgICAgaWYgKGVycm1zZykKLQkJZ290byBlcnJvcjsKLQkgICAgICAKLS8qIGZwcmludGYgKHN0ZGVyciwgIiBpbnNuOiAleCwgb3BlcmFuZCAlZCwgb3A6ICVkLCBhZGRfbnVtYmVyOiAlZFxuIiwKLSAgIGluc24sIG9waW5kZXhfcHRyIC0gb3Bjb2RlLT5vcGVyYW5kcywgZXguWF9vcCwgZXguWF9hZGRfbnVtYmVyKTsgKi8KLQotCSAgICAgIHN3aXRjaCAoZXguWF9vcCkgCi0JCXsKLQkJY2FzZSBPX2lsbGVnYWw6Ci0JCSAgZXJybXNnID0gXygiaWxsZWdhbCBvcGVyYW5kIik7Ci0JCSAgZ290byBlcnJvcjsKLQkJY2FzZSBPX2Fic2VudDoKLQkJICBlcnJtc2cgPSBfKCJtaXNzaW5nIG9wZXJhbmQiKTsKLQkJICBnb3RvIGVycm9yOwotCQljYXNlIE9fcmVnaXN0ZXI6Ci0JCSAgaWYgKChvcGVyYW5kLT5mbGFncyAmIChWODUwX09QRVJBTkRfUkVHIHwgVjg1MF9PUEVSQU5EX1NSRykpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGVycm1zZyA9IF8oImludmFsaWQgb3BlcmFuZCIpOwotCQkgICAgICBnb3RvIGVycm9yOwotCQkgICAgfQotCQkgIGluc24gPSB2ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCBleC5YX2FkZF9udW1iZXIsCi0JCQkJCSAgICAgIChjaGFyICopIE5VTEwsIDAsCi0JCQkJCSAgICAgIGNvcHlfb2ZfaW5zdHJ1Y3Rpb24pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgT19jb25zdGFudDoKLQkJICBpbnNuID0gdjg1MF9pbnNlcnRfb3BlcmFuZCAoaW5zbiwgb3BlcmFuZCwgZXguWF9hZGRfbnVtYmVyLAotCQkJCQkgICAgICAoY2hhciAqKSBOVUxMLCAwLAotCQkJCQkgICAgICBjb3B5X29mX2luc3RydWN0aW9uKTsKLQkJICBicmVhazsKLQotCQlkZWZhdWx0OgotCQkgIC8qIFdlIG5lZWQgdG8gZ2VuZXJhdGUgYSBmaXh1cCBmb3IgdGhpcyBleHByZXNzaW9uLiAgKi8KLQkJICBpZiAoZmMgPj0gTUFYX0lOU05fRklYVVBTKQotCQkgICAgYXNfZmF0YWwgKF8oInRvbyBtYW55IGZpeHVwcyIpKTsKLQotCQkgIGZpeHVwc1sgZmMgXS5leHAgICAgID0gZXg7Ci0JCSAgZml4dXBzWyBmYyBdLm9waW5kZXggPSAqIG9waW5kZXhfcHRyOwotCQkgIGZpeHVwc1sgZmMgXS5yZWxvYyAgID0gQkZEX1JFTE9DX1VOVVNFRDsKLQkJICArK2ZjOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQotCSAgc3RyID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gaG9sZDsKLQotCSAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJywnIHx8ICpzdHIgPT0gJ1snIHx8ICpzdHIgPT0gJ10nCi0JCSB8fCAqc3RyID09ICcpJykKLQkgICAgKytzdHI7Ci0JfQotICAgICAgbWF0Y2ggPSAxOwotCi0gICAgZXJyb3I6Ci0gICAgICBpZiAobWF0Y2ggPT0gMCkKLSAgICAgICAgewotCSAgbmV4dF9vcGNvZGUgPSBvcGNvZGUgKyAxOwotCSAgaWYgKG5leHRfb3Bjb2RlLT5uYW1lICE9IE5VTEwKLQkgICAgICAmJiBzdHJjbXAgKG5leHRfb3Bjb2RlLT5uYW1lLCBvcGNvZGUtPm5hbWUpID09IDApCi0JICAgIHsKLQkgICAgICBvcGNvZGUgPSBuZXh0X29wY29kZTsKLQotCSAgICAgIC8qIFNraXAgdmVyc2lvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0Ci0JCSBwcm9jZXNzb3IuICAqLwotCSAgICAgIGlmICgob3Bjb2RlLT5wcm9jZXNzb3JzICYgcHJvY2Vzc29yX21hc2spID09IDApCi0JCWdvdG8gZXJyb3I7Ci0JICAgICAgCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIAotCSAgYXNfYmFkICgiJXM6ICVzIiwgY29weV9vZl9pbnN0cnVjdGlvbiwgZXJybXNnKTsKLQkgIAotCSAgaWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICddJykKLQkgICAgKysgaW5wdXRfbGluZV9wb2ludGVyOwotCSAgCi0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZWRfaW5wdXRfbGluZV9wb2ludGVyOwotCSAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgICAKLSAgd2hpbGUgKGlzc3BhY2UgKCpzdHIpKQotICAgICsrc3RyOwotCi0gIGlmICgqc3RyICE9ICdcMCcpCi0gICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICBhc19iYWQgKF8oImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciKSwgc3RyKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdHI7Ci0KLSAgLyogV3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgCi0gIGlmIChyZWxheGFibGUgJiYgZmMgPiAwKQotICAgIHsKLSAgICAgIGluc25fc2l6ZSA9IDI7Ci0gICAgICBmYyA9IDA7Ci0KLSAgICAgIGlmICghc3RyY21wIChvcGNvZGUtPm5hbWUsICJiciIpKQotCXsKLQkgIGYgPSBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDQsIDIsIDIsCi0JCQlmaXh1cHNbMF0uZXhwLlhfYWRkX3N5bWJvbCwKLQkJCWZpeHVwc1swXS5leHAuWF9hZGRfbnVtYmVyLAotCQkJKGNoYXIgKilmaXh1cHNbMF0ub3BpbmRleCk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYsIGluc24sIGluc25fc2l6ZSk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGYgKyAyLCAwLCAyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZiA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNiwgNCwgMCwKLQkJCWZpeHVwc1swXS5leHAuWF9hZGRfc3ltYm9sLAotCQkJZml4dXBzWzBdLmV4cC5YX2FkZF9udW1iZXIsCi0JCQkoY2hhciAqKWZpeHVwc1swXS5vcGluZGV4KTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgaW5zbl9zaXplKTsKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiArIDIsIDAsIDQpOwotCX0KLSAgICB9Ci0gIGVsc2UgCi0gICAgewotICAgICAgLyogRm91ciBieXRlIGluc25zIGhhdmUgYW4gb3Bjb2RlIHdpdGggdGhlIHR3byBoaWdoIGJpdHMgb24uICAqLwotICAgICAgaWYgKChpbnNuICYgMHgwNjAwKSA9PSAweDA2MDApCi0JaW5zbl9zaXplID0gNDsKLSAgICAgIGVsc2UKLQlpbnNuX3NpemUgPSAyOwotCi0gICAgICAvKiBTcGVjaWFsIGNhc2U6IDMyIGJpdCBNT1YgKi8KLSAgICAgIGlmICgoaW5zbiAmIDB4ZmZlMCkgPT0gMHgwNjIwKQotCWluc25fc2l6ZSA9IDI7Ci0gICAgICAKLSAgICAgIGYgPSBmcmFnX21vcmUgKGluc25fc2l6ZSk7Ci0gICAgICAKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoZiwgaW5zbiwgaW5zbl9zaXplKTsKLQotICAgICAgaWYgKGV4dHJhX2RhdGFfYWZ0ZXJfaW5zbikKLQl7Ci0JICBmID0gZnJhZ19tb3JlIChleHRyYV9kYXRhX2xlbik7Ci0JICAKLQkgIG1kX251bWJlcl90b19jaGFycyAoZiwgZXh0cmFfZGF0YSwgZXh0cmFfZGF0YV9sZW4pOwotCi0JICBleHRyYV9kYXRhX2FmdGVyX2luc24gPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIC8qIENyZWF0ZSBhbnkgZml4dXBzLiAgQXQgdGhpcyBwb2ludCB3ZSBkbyBub3QgdXNlIGEKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlLCBidXQgaW5zdGVhZCBqdXN0IHVzZSB0aGUKLSAgICAgQkZEX1JFTE9DX1VOVVNFRCBwbHVzIHRoZSBvcGVyYW5kIGluZGV4LiAgVGhpcyBsZXRzIHVzIGVhc2lseQotICAgICBoYW5kbGUgZml4dXBzIGZvciBhbnkgb3BlcmFuZCB0eXBlLCBhbHRob3VnaCB0aGF0IGlzIGFkbWl0dGVkbHkKLSAgICAgbm90IGEgdmVyeSBleGNpdGluZyBmZWF0dXJlLiAgV2UgcGljayBhIEJGRCByZWxvYyB0eXBlIGluCi0gICAgIG1kX2FwcGx5X2ZpeC4gICovICAKLSAgZm9yIChpID0gMDsgaSA8IGZjOyBpKyspCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0gICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgICAgcmVsb2M7Ci0gICAgICAKLSAgICAgIG9wZXJhbmQgPSAmIHY4NTBfb3BlcmFuZHNbIGZpeHVwc1tpXS5vcGluZGV4IF07Ci0KLSAgICAgIHJlbG9jID0gZml4dXBzW2ldLnJlbG9jOwotICAgICAgCi0gICAgICBpZiAocmVsb2MgIT0gQkZEX1JFTE9DX1VOVVNFRCkKLQl7Ci0JICByZWxvY19ob3d0b190eXBlICogcmVsb2NfaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKHN0ZG91dHB1dCwKLQkJCQkJCQkJICByZWxvYyk7Ci0JICBpbnQgICAgICAgICAgICAgICAgc2l6ZTsKLQkgIGludCAgICAgICAgICAgICAgICBhZGRyZXNzOwotCSAgZml4UyAqICAgICAgICAgICAgIGZpeFA7Ci0KLQkgIGlmICghcmVsb2NfaG93dG8pCi0JICAgIGFib3J0KCk7Ci0JICAKLQkgIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jX2hvd3RvKTsKLQotCSAgLyogWFhYIFRoaXMgd2lsbCBhYm9ydCBvbiBhbiBSX1Y4NTBfOCByZWxvYyAtCi0JICAgICBpcyB0aGlzIHJlbG9jIGFjdHVhbGx5IHVzZWQgPyAqLwotCSAgaWYgKHNpemUgIT0gMiAmJiBzaXplICE9IDQpIAotCSAgICBhYm9ydCAoKTsKLQotCSAgYWRkcmVzcyA9IChmIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwpICsgaW5zbl9zaXplIC0gc2l6ZTsKLQotCSAgaWYgKHJlbG9jID09IEJGRF9SRUxPQ18zMikKLQkgICAgewotCSAgICAgIGFkZHJlc3MgKz0gMjsKLQkgICAgfQotCSAgCi0JICBmaXhQID0gZml4X25ld19leHAgKGZyYWdfbm93LCBhZGRyZXNzLCBzaXplLAotCQkJICAgICAgJiBmaXh1cHNbaV0uZXhwLCAKLQkJCSAgICAgIHJlbG9jX2hvd3RvLT5wY19yZWxhdGl2ZSwKLQkJCSAgICAgIHJlbG9jKTsKLQotCSAgc3dpdGNoIChyZWxvYykKLQkgICAgewotCSAgICBjYXNlIEJGRF9SRUxPQ19MTzE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2OgotCSAgICBjYXNlIEJGRF9SRUxPQ19ISTE2X1M6Ci0JICAgICAgZml4UC0+Znhfbm9fb3ZlcmZsb3cgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZpeF9uZXdfZXhwICgKLQkJICAgICAgIGZyYWdfbm93LAotCQkgICAgICAgZiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQkgICAgICAgJiBmaXh1cHNbaV0uZXhwLAotCQkgICAgICAgMSAvKiBGSVhNRTogVjg1MF9PUEVSQU5EX1JFTEFUSVZFID8/PyAqLywKLQkJICAgICAgIChiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUpIChmaXh1cHNbaV0ub3BpbmRleAotCQkJCQkJICAgKyAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotCQkgICAgICAgKTsKLQl9Ci0gICAgfQotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVkX2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotCi0vKiBJZiB3aGlsZSBwcm9jZXNzaW5nIGEgZml4dXAsIGEgcmVsb2MgcmVhbGx5IG5lZWRzIHRvIGJlIGNyZWF0ZWQgKi8KLS8qIHRoZW4gaXQgaXMgZG9uZSBoZXJlLiAgKi8KLSAgICAgICAgICAgICAgICAgCi1hcmVsZW50ICoKLXRjX2dlbl9yZWxvYyAoc2VnLCBmaXhwKQotICAgICBhc2VjdGlvbiAqIHNlZzsKLSAgICAgZml4UyAqICAgICBmaXhwOwotewotICBhcmVsZW50ICogcmVsb2M7Ci0gIAotICByZWxvYyAgICAgICAgICAgICAgPSAoYXJlbGVudCAqKSB4bWFsbG9jIChzaXplb2YgKGFyZWxlbnQpKTsKLSAgcmVsb2MtPnN5bV9wdHJfcHRyID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICpyZWxvYy0+c3ltX3B0cl9wdHI9IHN5bWJvbF9nZXRfYmZkc3ltIChmaXhwLT5meF9hZGRzeSk7Ci0gIHJlbG9jLT5hZGRyZXNzICAgICA9IGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLSAgcmVsb2MtPmhvd3RvICAgICAgID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChzdGRvdXRwdXQsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0KLSAgaWYgKHJlbG9jLT5ob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZF93aGVyZSAoZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwKLQkJICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICAgICAgICAgICAgICAgIF8oInJlbG9jICVkIG5vdCBzdXBwb3J0ZWQgYnkgb2JqZWN0IGZpbGUgZm9ybWF0IiksCi0JCSAgICAoaW50KSBmaXhwLT5meF9yX3R5cGUpOwotCi0gICAgICB4ZnJlZSAocmVsb2MpOwotICAgICAgCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIAotICBpZiAoZml4cC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19WVEFCTEVfRU5UUlkKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQpCi0gICAgcmVsb2MtPmFkZGVuZCA9IGZpeHAtPmZ4X29mZnNldDsKLSAgZWxzZQotICAgIHJlbG9jLT5hZGRlbmQgPSBmaXhwLT5meF9hZGRudW1iZXI7Ci0gIAotICByZXR1cm4gcmVsb2M7Ci19Ci0KLS8qIEFzc3VtZSBldmVyeXRoaW5nIHdpbGwgZml0IGluIHR3byBieXRlcywgdGhlbiBleHBhbmQgYXMgbmVjZXNzYXJ5LiAgKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdwLCBzZWcpCi0gICAgIGZyYWdTICogZnJhZ3A7Ci0gICAgIGFzZWN0aW9uICogc2VnOwotewotICBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMCkKLSAgICBmcmFncC0+ZnJfdmFyID0gNDsKLSAgZWxzZSBpZiAoZnJhZ3AtPmZyX3N1YnR5cGUgPT0gMikKLSAgICBmcmFncC0+ZnJfdmFyID0gMjsKLSAgZWxzZQotICAgIGFib3J0ICgpOwotICByZXR1cm4gMjsKLX0gCi0KLWxvbmcKLXY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uIChmaXhwLCBzZWN0aW9uKQotICAgICBmaXhTICogZml4cDsKLSAgICAgc2VnVCAgIHNlY3Rpb247Ci17Ci0gIC8qIElmIHRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkLCBvciBpbiBhIHNlY3Rpb24gb3RoZXIgdGhhbiBvdXIgb3duLAotICAgICB0aGVuIGxldCB0aGUgbGlua2VyIGZpZ3VyZSBpdCBvdXQuICAqLwotICBpZiAoZml4cC0+ZnhfYWRkc3kgIT0gKHN5bWJvbFMgKikgTlVMTAotICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChmaXhwLT5meF9hZGRzeSkKLQkgIHx8IChTX0dFVF9TRUdNRU5UIChmaXhwLT5meF9hZGRzeSkgIT0gc2VjdGlvbikpKQotICAgIHsKLSAgICAgIC8qIFRoZSBzeW1ib2wgaXMgdW5kZWZpbmVkL25vdCBpbiBvdXIgc2VjdGlvbi4KLQkgTGV0IHRoZSBsaW5rZXIgZmlndXJlIGl0IG91dC4gICovCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIGZpeHAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhwLT5meF93aGVyZTsKLX0KLQotaW50Ci1tZF9hcHBseV9maXgzIChmaXhwLCB2YWx1ZXAsIHNlZykKLSAgICAgZml4UyAqICAgZml4cDsKLSAgICAgdmFsdWVUICogdmFsdWVwOwotICAgICBzZWdUICAgICBzZWc7Ci17Ci0gIHZhbHVlVCB2YWx1ZTsKLSAgY2hhciAqIHdoZXJlOwotCi0gIGlmIChmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9JTkhFUklUCi0gICAgICB8fCBmaXhwLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX1ZUQUJMRV9FTlRSWSkKLSAgICB7Ci0gICAgICBmaXhwLT5meF9kb25lID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoZml4cC0+ZnhfYWRkc3kgPT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICB2YWx1ZSA9ICogdmFsdWVwOwotICAgICAgZml4cC0+ZnhfZG9uZSA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChmaXhwLT5meF9wY3JlbCkKLSAgICB2YWx1ZSA9ICogdmFsdWVwOwotICBlbHNlCi0gICAgewotICAgICAgdmFsdWUgPSBmaXhwLT5meF9vZmZzZXQ7Ci0gICAgICBpZiAoZml4cC0+Znhfc3Vic3kgIT0gKHN5bWJvbFMgKikgTlVMTCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAoZml4cC0+Znhfc3Vic3kpID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHZhbHVlIC09IFNfR0VUX1ZBTFVFIChmaXhwLT5meF9zdWJzeSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBXZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHN1YnRyYWN0aW5nIGEgc3ltYm9sLiAgKi8KLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygiZXhwcmVzc2lvbiB0b28gY29tcGxleCIpKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgaWYgKChpbnQpIGZpeHAtPmZ4X3JfdHlwZSA+PSAoaW50KSBCRkRfUkVMT0NfVU5VU0VEKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBvcGluZGV4OwotICAgICAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqIG9wZXJhbmQ7Ci0gICAgICB1bnNpZ25lZCBsb25nICAgICAgICAgICAgICAgaW5zbjsKLQotICAgICAgb3BpbmRleCA9IChpbnQpIGZpeHAtPmZ4X3JfdHlwZSAtIChpbnQpIEJGRF9SRUxPQ19VTlVTRUQ7Ci0gICAgICBvcGVyYW5kID0gJiB2ODUwX29wZXJhbmRzWyBvcGluZGV4IF07Ci0KLSAgICAgIC8qIEZldGNoIHRoZSBpbnN0cnVjdGlvbiwgaW5zZXJ0IHRoZSBmdWxseSByZXNvbHZlZCBvcGVyYW5kCi0gICAgICAgICB2YWx1ZSwgYW5kIHN0dWZmIHRoZSBpbnN0cnVjdGlvbiBiYWNrIGFnYWluLgotCi0JIE5vdGUgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIHN0b3JlZCBpbiBsaXR0bGUgZW5kaWFuCi0JIGZvcm1hdCEgICovCi0gICAgICB3aGVyZSA9IGZpeHAtPmZ4X2ZyYWctPmZyX2xpdGVyYWwgKyBmaXhwLT5meF93aGVyZTsKLQotICAgICAgaW5zbiA9IGJmZF9nZXRsMzIgKCh1bnNpZ25lZCBjaGFyICopIHdoZXJlKTsKLSAgICAgIGluc24gPSB2ODUwX2luc2VydF9vcGVyYW5kIChpbnNuLCBvcGVyYW5kLCAob2Zmc2V0VCkgdmFsdWUsCi0JCQkJICBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBOVUxMKTsKLSAgICAgIGJmZF9wdXRsMzIgKChiZmRfdm1hKSBpbnNuLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9kb25lKQotCXsKLQkgIC8qIE5vdGhpbmcgZWxzZSB0byBkbyBoZXJlLiAqLwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBEZXRlcm1pbmUgYSBCRkQgcmVsb2MgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgaW5mb3JtYXRpb24uICAKLQkgV2UgYXJlIG9ubHkgcHJlcGFyZWQgdG8gdHVybiBhIGZldyBvZiB0aGUgb3BlcmFuZHMgaW50byByZWxvY3MuICovCi0KLSAgICAgIGlmIChvcGVyYW5kLT5iaXRzID09IDIyKQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19WODUwXzIyX1BDUkVMOwotICAgICAgZWxzZSBpZiAob3BlcmFuZC0+Yml0cyA9PSA5KQotCWZpeHAtPmZ4X3JfdHlwZSA9IEJGRF9SRUxPQ19WODUwXzlfUENSRUw7Ci0gICAgICBlbHNlCi0JewotCSAgLyogZnByaW50ZiAoc3RkZXJyLCAiYml0czogJWQsIGluc246ICV4XG4iLCBvcGVyYW5kLT5iaXRzLCBpbnNuKTsgKi8KLQkgIAotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLAotCQkgICAgICAgXygidW5yZXNvbHZlZCBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSByZXNvbHZlZCIpKTsKLQkgIGZpeHAtPmZ4X2RvbmUgPSAxOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZml4cC0+ZnhfZG9uZSkKLSAgICB7Ci0gICAgICAvKiBXZSBzdGlsbCBoYXZlIHRvIGluc2VydCB0aGUgdmFsdWUgaW50byBtZW1vcnkhICAqLwotICAgICAgd2hlcmUgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0KLSAgICAgIGlmIChmaXhwLT5meF9zaXplID09IDEpCi0JKiB3aGVyZSA9IHZhbHVlICYgMHhmZjsKLSAgICAgIGVsc2UgaWYgKGZpeHAtPmZ4X3NpemUgPT0gMikKLQliZmRfcHV0bDE2ICh2YWx1ZSAmIDB4ZmZmZiwgKHVuc2lnbmVkIGNoYXIgKikgd2hlcmUpOwotICAgICAgZWxzZSBpZiAoZml4cC0+Znhfc2l6ZSA9PSA0KQotCWJmZF9wdXRsMzIgKHZhbHVlLCAodW5zaWduZWQgY2hhciAqKSB3aGVyZSk7Ci0gICAgfQotICAKLSAgZml4cC0+ZnhfYWRkbnVtYmVyID0gdmFsdWU7Ci0gIHJldHVybiAxOwotfQotCi0MCi0vKiBQYXJzZSBhIGNvbnMgZXhwcmVzc2lvbi4gIFdlIGhhdmUgdG8gaGFuZGxlIGhpKCksIGxvKCksIGV0YwotICAgb24gdGhlIHY4NTAuICAqLwotdm9pZAotcGFyc2VfY29uc19leHByZXNzaW9uX3Y4NTAgKGV4cCkKLSAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgLyogU2VlIGlmIHRoZXJlJ3MgYSByZWxvYyBwcmVmaXggbGlrZSBoaSgpIHdlIGhhdmUgdG8gaGFuZGxlLiAgKi8KLSAgaG9sZF9jb25zX3JlbG9jID0gdjg1MF9yZWxvY19wcmVmaXggKE5VTEwpOwotCi0gIC8qIERvIG5vcm1hbCBleHByZXNzaW9uIHBhcnNpbmcuICAqLwotICBleHByZXNzaW9uIChleHApOwotfQotCi0vKiBDcmVhdGUgYSBmaXh1cCBmb3IgYSBjb25zIGV4cHJlc3Npb24uICBJZiBwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MAotICAgZm91bmQgYSByZWxvYyBwcmVmaXgsIHRoZW4gd2UgdXNlIHRoYXQgcmVsb2MsIGVsc2Ugd2UgY2hvb3NlIGFuCi0gICBhcHByb3ByaWF0ZSBvbmUgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGV4cHJlc3Npb24uICAqLwotdm9pZAotY29uc19maXhfbmV3X3Y4NTAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHApCi0gICAgIGZyYWdTICpmcmFnOwotICAgICBpbnQgd2hlcmU7Ci0gICAgIGludCBzaXplOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBpZiAoaG9sZF9jb25zX3JlbG9jID09IEJGRF9SRUxPQ19VTlVTRUQpCi0gICAgewotICAgICAgaWYgKHNpemUgPT0gNCkKLQlob2xkX2NvbnNfcmVsb2MgPSBCRkRfUkVMT0NfMzI7Ci0gICAgICBpZiAoc2l6ZSA9PSAyKQotCWhvbGRfY29uc19yZWxvYyA9IEJGRF9SRUxPQ18xNjsKLSAgICAgIGlmIChzaXplID09IDEpCi0JaG9sZF9jb25zX3JlbG9jID0gQkZEX1JFTE9DXzg7Ci0gICAgfQotCi0gIGlmIChleHAgIT0gTlVMTCkKLSAgICBmaXhfbmV3X2V4cCAoZnJhZywgd2hlcmUsIHNpemUsIGV4cCwgMCwgaG9sZF9jb25zX3JlbG9jKTsKLSAgZWxzZQotICAgIGZpeF9uZXcgKGZyYWcsIHdoZXJlLCBzaXplLCBOVUxMLCAwLCAwLCBob2xkX2NvbnNfcmVsb2MpOwotfQotYm9vbGVhbgotdjg1MF9maXhfYWRqdXN0YWJsZSAoZml4UCkKLSAgICBmaXhTICpmaXhQOwotewotIAotICBpZiAoZml4UC0+ZnhfYWRkc3kgPT0gTlVMTCkKLSAgICByZXR1cm4gMTsKLSAKLSAgLyogUHJldmVudCBhbGwgYWRqdXN0bWVudHMgdG8gZ2xvYmFsIHN5bWJvbHMuICovCi0gIGlmIChTX0lTX0VYVEVSTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotICBpZiAoU19JU19XRUFLIChmaXhQLT5meF9hZGRzeSkpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIERvbid0IGFkanVzdCBmdW5jdGlvbiBuYW1lcyAqLwotICBpZiAoU19JU19GVU5DVElPTiAoZml4UC0+ZnhfYWRkc3kpKQotICAgIHJldHVybiAwOwotCi0gIC8qIFdlIG5lZWQgdGhlIHN5bWJvbCBuYW1lIGZvciB0aGUgVlRBQkxFIGVudHJpZXMgKi8KLSAgaWYgKGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeFAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAwOwotIAotICByZXR1cm4gMTsKLX0KLSAKLWludAotdjg1MF9mb3JjZV9yZWxvY2F0aW9uIChmaXhwKQotICAgICAgc3RydWN0IGZpeCAqZml4cDsKLXsKLSAgaWYgKGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0lOSEVSSVQKLSAgICAgIHx8IGZpeHAtPmZ4X3JfdHlwZSA9PSBCRkRfUkVMT0NfVlRBQkxFX0VOVFJZKQotICAgIHJldHVybiAxOwotIAotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdjg1MC5oIGIvZ2FzL2NvbmZpZy90Yy12ODUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZDRkMWMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKiB0Yy12ODUwLmggLS0gSGVhZGVyIGZpbGUgZm9yIHRjLXY4NTAuYy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX1Y4NTAKLQotI2luY2x1ZGUgPGVsZi92ODUwLmg+Ci0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSAjZXJyb3IgVjg1MCBzdXBwb3J0IHJlcXVpcmVzIEJGRF9BU1NFTUJMRVIKLSNlbmRpZgotCi0vKiBUaGUgdGFyZ2V0IEJGRCBhcmNoaXRlY3R1cmUuICAqLwotI2RlZmluZSBUQVJHRVRfQVJDSCAJCWJmZF9hcmNoX3Y4NTAKLQotLyogVGhlIHRhcmdldCBCRkQgZm9ybWF0LiAgKi8KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVCAJCSJlbGYzMi12ODUwIgotCi0jZGVmaW5lIE1EX0FQUExZX0ZJWDMKLSNkZWZpbmUgbWRfb3BlcmFuZCh4KQotCi0jZGVmaW5lIG9ial9maXhfYWRqdXN0YWJsZShmaXhQKSB2ODUwX2ZpeF9hZGp1c3RhYmxlKGZpeFApCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oZml4cCkgdjg1MF9mb3JjZV9yZWxvY2F0aW9uKGZpeHApCi1leHRlcm4gaW50IHY4NTBfZm9yY2VfcmVsb2NhdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZml4ICopKTsKLQotLyogUGVybWl0IHRlbXBvcmFyeSBudW1lcmljIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNkZWZpbmUgRElGRl9FWFBSX09LCQkvKiBmb28tLiBnZXRzIHR1cm5lZCBpbnRvIFBDIHJlbGF0aXZlIHJlbG9jcyAqLwotCi0vKiBXZSBkb24ndCBuZWVkIHRvIGhhbmRsZSAud29yZCBzdHJhbmdlbHkuICAqLwotI2RlZmluZSBXT1JLSU5HX0RPVF9XT1JECi0KLSNkZWZpbmUgbWRfbnVtYmVyX3RvX2NoYXJzIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4KLSAgICAgCi0vKiBXZSBuZWVkIHRvIGhhbmRsZSBsbygpLCBoaSgpLCBldGMgZXRjIGluIC5od29yZCwgLndvcmQsIGV0YwotICAgZGlyZWN0aXZlcywgc28gd2UgaGF2ZSB0byBwYXJzZSAiY29ucyIgZXhwcmVzc2lvbnMgb3Vyc2VsdmVzLiAgKi8KLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBwYXJzZV9jb25zX2V4cHJlc3Npb25fdjg1MCAoRVhQKQotI2RlZmluZSBUQ19DT05TX0ZJWF9ORVcgY29uc19maXhfbmV3X3Y4NTAKLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLQotLyogVGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gdGhlIHNtYWxsIGRhdGEgYXJlYSAocG9pbnRlZCB0byBieSBHUCkuICAqLwotI2RlZmluZSBTSEZfVjg1MF9HUFJFTAkJMHgxMDAwMDAwMAotLyogVGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gdGhlIHRpbnkgZGF0YSBhcmVhIChwb2ludGVkIHRvIGJ5IEVQKS4gICovCi0jZGVmaW5lIFNIRl9WODUwX0VQUkVMCQkweDIwMDAwMDAwCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgemVybyBkYXRhIGFyZWEgKHBvaW50ZWQgdG8gYnkgUjApLiAgKi8KLSNkZWZpbmUgU0hGX1Y4NTBfUjBSRUwJCTB4NDAwMDAwMDAKLQotI2RlZmluZSBFTEZfVENfU1BFQ0lBTF9TRUNUSU9OUyBcCi0gIHsgIi5zZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0dQUkVMCX0sIFwKLSAgeyAiLnJvc2RhdGEiLAlTSFRfUFJPR0JJVFMsCQlTSEZfQUxMT0MgKyAgICAgICAgICAgICBTSEZfVjg1MF9HUFJFTAl9LCBcCi0gIHsgIi5zYnNzIiwJU0hUX05PQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0dQUkVMCX0sIFwKLSAgeyAiLnNjb21tb24iLAlTSFRfVjg1MF9TQ09NTU9OLCAJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfR1BSRUwJfSwgXAotICB7ICIudGRhdGEiLAlTSFRfUFJPR0JJVFMsCQlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9FUFJFTAl9LCBcCi0gIHsgIi50YnNzIiwJU0hUX05PQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX0VQUkVMCX0sIFwKLSAgeyAiLnRjb21tb24iLAlTSFRfVjg1MF9UQ09NTU9OLAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi56ZGF0YSIsCVNIVF9QUk9HQklUUywJCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9WODUwX1IwUkVMCX0sIFwKLSAgeyAiLnJvemRhdGEiLAlTSFRfUFJPR0JJVFMsCQlTSEZfQUxMT0MgKyAgICAgICAgICAgICBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi56YnNzIiwJU0hUX05PQklUUywJICAJU0hGX0FMTE9DICsgU0hGX1dSSVRFICsgU0hGX1Y4NTBfUjBSRUwJfSwgXAotICB7ICIuemNvbW1vbiIsCVNIVF9WODUwX1pDT01NT04sIAlTSEZfQUxMT0MgKyBTSEZfV1JJVEUgKyBTSEZfVjg1MF9SMFJFTAl9LCBcCi0gIHsgIi5jYWxsX3RhYmxlX2RhdGEiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSB9LAkgICBcCi0gIHsgIi5jYWxsX3RhYmxlX3RleHQiLAlTSFRfUFJPR0JJVFMsCVNIRl9BTExPQyArIFNIRl9XUklURSArIFNIRl9FWEVDSU5TVFIgfSwKLQotI2RlZmluZSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04oZml4UCxzZWN0aW9uKSB2ODUwX3BjcmVsX2Zyb21fc2VjdGlvbiAoZml4UCwgc2VjdGlvbikKLWV4dGVybiBsb25nIHY4NTBfcGNyZWxfZnJvbV9zZWN0aW9uICgpOwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy12YXguYyBiL2dhcy9jb25maWcvdGMtdmF4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjVjY2MuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy12YXguYworKysgL2Rldi9udWxsCkBAIC0xLDMyNDMgKzAsMCBAQAotLyogdGMtdmF4LmMgLSB2YXgtc3BlY2lmaWMgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLSNpbmNsdWRlICJ2YXgtaW5zdC5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIJCS8qIEZvciBGUkFHX0FQUEVORF8xX0NIQVIgbWFjcm8gaW4gImZyYWdzLmgiICovCi0KLS8qIFRoZXNlIGNoYXJzIHN0YXJ0IGEgY29tbWVudCBhbnl3aGVyZSBpbiBhIHNvdXJjZSBmaWxlIChleGNlcHQgaW5zaWRlCi0gICBhbm90aGVyIGNvbW1lbnQgKi8KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi0vKiBUaGVzZSBjaGFycyBvbmx5IHN0YXJ0IGEgY29tbWVudCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gKi8KLS8qIE5vdGUgdGhhdCBmb3IgdGhlIFZBWCB0aGUgYXJlIHRoZSBzYW1lIGFzIGNvbW1lbnRfY2hhcnMgYWJvdmUuICovCi1jb25zdCBjaGFyIGxpbmVfY29tbWVudF9jaGFyc1tdID0gIiMiOwotCi1jb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW10gPSAiIjsKLQotLyogQ2hhcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBzZXBhcmF0ZSBtYW50IGZyb20gZXhwIGluIGZsb2F0aW5nIHBvaW50IG51bXMgKi8KLWNvbnN0IGNoYXIgRVhQX0NIQVJTW10gPSAiZUUiOwotCi0vKiBDaGFycyB0aGF0IG1lYW4gdGhpcyBudW1iZXIgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCAqLwotLyogYXMgaW4gMGYxMjMuNDU2ICovCi0vKiBvciAgICAwSDEuMjM0RS0xMiAoc2VlIGV4cCBjaGFycyBhYm92ZSkgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiZERmRmdHaEgiOwotCi0vKiBBbHNvIGJlIGF3YXJlIHRoYXQgTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUIG1heSBoYXZlIHRvIGJlCi0gICBjaGFuZ2VkIGluIHJlYWQuYyAuICBJZGVhbGx5IGl0IHNob3VsZG4ndCBoYXZlIHRvIGtub3cgYWJvdXQgaXQgYXQgYWxsLAotICAgYnV0IG5vdGhpbmcgaXMgaWRlYWwgYXJvdW5kIGhlcmUuICAqLwotCi0vKiBIb2xkIGRldGFpbHMgb2YgYW4gb3BlcmFuZCBleHByZXNzaW9uICovCi1zdGF0aWMgZXhwcmVzc2lvblMgZXhwX29mX29wZXJhbmRbVklUX01BWF9PUEVSQU5EU107Ci1zdGF0aWMgc2VnVCBzZWdfb2Zfb3BlcmFuZFtWSVRfTUFYX09QRVJBTkRTXTsKLQotLyogQSB2YXggaW5zdHJ1Y3Rpb24gYWZ0ZXIgZGVjb2RpbmcuICovCi1zdGF0aWMgc3RydWN0IHZpdCB2OwotCi0vKiBIb2xkIGRldGFpbHMgb2YgYmlnIG9wZXJhbmRzLiAqLwotTElUVExFTlVNX1RZUEUgYmlnX29wZXJhbmRfYml0c1tWSVRfTUFYX09QRVJBTkRTXVtTSVpFX09GX0xBUkdFX05VTUJFUl07Ci1GTE9OVU1fVFlQRSBmbG9hdF9vcGVyYW5kW1ZJVF9NQVhfT1BFUkFORFNdOwotLyogQWJvdmUgaXMgbWFkZSB0byBwb2ludCBpbnRvIGJpZ19vcGVyYW5kX2JpdHMgYnkgbWRfYmVnaW4oKS4gKi8KLQotaW50IGZsYWdfaGFzaF9sb25nX25hbWVzOwkvKiAtKyAqLwotaW50IGZsYWdfb25lOwkJCS8qIC0xICovCi1pbnQgZmxhZ19zaG93X2FmdGVyX3RydW5jOwkvKiAtSCAqLwotaW50IGZsYWdfbm9faGFzaF9taXhlZF9jYXNlOwkvKiAtaCBOVU0gKi8KLQwKLS8qCi0gKiBGb3IgVkFYLCByZWxhdGl2ZSBhZGRyZXNzZXMgb2YgImp1c3QgdGhlIHJpZ2h0IGxlbmd0aCIgYXJlIGVhc3kuCi0gKiBUaGUgYnJhbmNoIGRpc3BsYWNlbWVudCBpcyBhbHdheXMgdGhlIGxhc3Qgb3BlcmFuZCwgZXZlbiBpbgotICogc3ludGhldGljIGluc3RydWN0aW9ucy4KLSAqIEZvciBWQVgsIHdlIGVuY29kZSB0aGUgcmVsYXhfc3Vic3RhdGVUcyAoaW4gZS5nLiBmcl9zdWJzdGF0ZSkgYXM6Ci0gKgotICoJCSAgICA0ICAgICAgIDMgICAgICAgMiAgICAgICAxICAgICAgIDAJICAgICBiaXQgbnVtYmVyCi0gKgktLS0vIC8tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCi0gKgkJfCAgICAgd2hhdCBzdGF0ZSA/CXwgIGhvdyBsb25nID8JfAotICoJLS0tLyAvLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwotICoKLSAqIFRoZSAiaG93IGxvbmciIGJpdHMgYXJlIDAwPWJ5dGUsIDAxPXdvcmQsIDEwPWxvbmcuCi0gKiBUaGlzIGlzIGEgVW4qeCBjb252ZW50aW9uLgotICogTm90IGFsbCBsZW5ndGhzIGFyZSBsZWdpdCBmb3IgYSBnaXZlbiB2YWx1ZSBvZiAod2hhdCBzdGF0ZSkuCi0gKiBUaGUgImhvdyBsb25nIiByZWZlcnMgbWVyZWx5IHRvIHRoZSBkaXNwbGFjZW1lbnQgbGVuZ3RoLgotICogVGhlIGFkZHJlc3MgdXN1YWxseSBoYXMgc29tZSBjb25zdGFudCBieXRlcyBpbiBpdCBhcyB3ZWxsLgotICoKLQotIGdyb3VwcyBmb3IgVkFYIGFkZHJlc3MgcmVsYXhpbmcuCi0KLSAxLgkiZm9vIiBwYy1yZWxhdGl2ZS4KLSBsZW5ndGggb2YgYnl0ZSwgd29yZCwgbG9uZwotCi0gMmEuCUo8Y29uZD4gd2hlcmUgPGNvbmQ+IGlzIGEgc2ltcGxlIGZsYWcgdGVzdC4KLSBsZW5ndGggb2YgYnl0ZSwgd29yZCwgbG9uZy4KLSBWQVggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYm5lcS9ibmVxdQkxMgotIGJlcWwvYmVxbHUJMTMKLSBiZ3RyCQkxNAotIGJsZXEJCTE1Ci0gYmdlcQkJMTgKLSBibHNzCQkxOQotIGJndHJ1CQkxYQotIGJsZXF1CQkxYgotIGJ2YwkJMWMKLSBidnMJCTFkCi0gYmdlcXUvYmNjCTFlCi0gYmxzc3UvYmNzCTFmCi0gQWx3YXlzLCB5b3UgY29tcGxlbWVudCAwdGggYml0IHRvIHJldmVyc2UgY29uZGl0aW9uLgotIEFsd2F5cywgMS1ieXRlIG9wY29kZSwgdGhlbiAxLWJ5dGUgZGlzcGxhY2VtZW50LgotCi0gMmIuCUo8Y29uZD4gd2hlcmUgY29uZCB0ZXN0cyBhIG1lbW9yeSBiaXQuCi0gbGVuZ3RoIG9mIGJ5dGUsIHdvcmQsIGxvbmcuCi0gVmF4IG9wY29kZXMgYXJlOgkoSGV4KQotIGJicwkJZTAKLSBiYmMJCWUxCi0gYmJzcwkJZTIKLSBiYmNzCQllMwotIGJic2MJCWU0Ci0gYmJjYwkJZTUKLSBiYnNzaQkJZTYKLSBiYmNjaQkJZTcKLSBBbHdheXMsIHlvdSBjb21wbGVtZW50IDB0aCBiaXQgdG8gcmV2ZXJzZSBjb25kaXRpb24uCi0gQWx3YXlzLCAxLWJ5dGUgb3BjZGUsIGxvbmd3b3JkLWFkZHJlc3MsIGJ5dGUtYWRkcmVzcywgMS1ieXRlLWRpc3BsYWNlbWVudAotCi0gMmMuCUo8Y29uZD4gd2hlcmUgY29uZCB0ZXN0cyBsb3ctb3JkZXIgbWVtb3J5IGJpdAotIGxlbmd0aCBvZiBieXRlLHdvcmQsbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYmxicwkJZTgKLSBibGJjCQllOQotIEFsd2F5cywgeW91IGNvbXBsZW1lbnQgMHRoIGJpdCB0byByZXZlcnNlIGNvbmRpdGlvbi4KLSBBbHdheXMsIDEtYnl0ZSBvcGNvZGUsIGxvbmd3b3JkLWFkZHJlc3MsIDEtYnl0ZSBkaXNwbGFjZW1lbnQuCi0KLSAzLglKYnMvSmJyLgotIGxlbmd0aCBvZiBieXRlLHdvcmQsbG9uZy4KLSBWYXggb3Bjb2RlcyBhcmU6CShIZXgpCi0gYnNiYgkJMTAKLSBicmIJCTExCi0gVGhlc2UgYXJlIGxpa2UgKDIpIGJ1dCB0aGVyZSBpcyBubyBjb25kaXRpb24gdG8gcmV2ZXJzZS4KLSBBbHdheXMsIDEgYnl0ZSBvcGNvZGUsIHRoZW4gZGlzcGxhY2VtZW50L2Fic29sdXRlLgotCi0gNGEuCUphY2JYCi0gbGVuZ3RoIG9mIHdvcmQsIGxvbmcuCi0gVmF4IG9wY29kZXMgYXJlOgkoSGV4KQotIGFjYncJCTNkCi0gYWNiZgkJNGYKLSBhY2JkCQk2ZgotIGFiY2IJCTlkCi0gYWNibAkJZjEKLSBhY2JnCSAgICAgIDRmZmQKLSBhY2JoCSAgICAgIDZmZmQKLSBBbHdheXMsIHdlIGNhbm5vdCByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoOyB3ZSBoYXZlIGEgd29yZAotIGRpc3BsYWNlbWVudC4KLSBUaGUgZG91YmxlLWJ5dGUgb3AtY29kZXMgZG9uJ3QgaHVydDogd2UgbmV2ZXIgd2FudCB0byBtb2RpZnkgdGhlCi0gb3Bjb2RlLCBzbyB3ZSBkb24ndCBjYXJlIGhvdyBtYW55IGJ5dGVzIGFyZSBiZXR3ZWVuIHRoZSBvcGNvZGUgYW5kCi0gdGhlIG9wZXJhbmQuCi0KLSA0Yi4JSlhvYlhYWAotIGxlbmd0aCBvZiBsb25nLCBsb25nLCBieXRlLgotIFZheCBvcGNvZGVzIGFyZToJKEhleCkKLSBhb2Jsc3MJCWYyCi0gYW9ibGVxCQlmMwotIHNvYmdlcQkJZjQKLSBzb2JndHIJCWY1Ci0gQWx3YXlzLCB3ZSBjYW5ub3QgcmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIGJyYW5jaDsgd2UgaGF2ZSBhIGJ5dGUKLSBkaXNwbGFjZW1lbnQuCi0KLSBUaGUgb25seSB0aW1lIHdlIG5lZWQgdG8gbW9kaWZ5IHRoZSBvcGNvZGUgaXMgZm9yIGNsYXNzIDIgaW5zdHJ1Y3Rpb25zLgotIEFmdGVyIHJlbGF4KCkgd2UgbWF5IGNvbXBsZW1lbnQgdGhlIGxvd2VzdCBvcmRlciBiaXQgb2Ygc3VjaCBpbnN0cnVjdGlvbgotIHRvIHJldmVyc2Ugc2Vuc2Ugb2YgYnJhbmNoLgotCi0gRm9yIGNsYXNzIDIgaW5zdHJ1Y3Rpb25zLCB3ZSBzdG9yZSBjb250ZXh0IG9mICJ3aGVyZSBpcyB0aGUgb3Bjb2RlIGxpdGVyYWwiLgotIFdlIGNhbiBjaGFuZ2UgYW4gb3Bjb2RlJ3MgbG93ZXN0IG9yZGVyIGJpdCB3aXRob3V0IGJyZWFraW5nIGFueXRoaW5nIGVsc2UuCi0KLSBXZSBzb21ldGltZXMgc3RvcmUgY29udGV4dCBpbiB0aGUgb3BlcmFuZCBsaXRlcmFsLiBUaGlzIHdheSB3ZSBjYW4gZmlndXJlIG91dAotIGFmdGVyIHJlbGF4KCkgd2hhdCB0aGUgb3JpZ2luYWwgYWRkcmVzc2luZyBtb2RlIHdhcy4KLSAqLwotDAotLyogVGhlc2UgZGlzcGxhY2VtZW50cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlCi0gICBkaXNwbGFjZW1lbnQuICBUaGUgZmlyc3QgbGV0dGVyIGlzIEJ5dGUsIFdvcmQuICAybmQgbGV0dGVyIGlzCi0gICBGb3J3YXJkLCBCYWNrd2FyZC4gKi8KLSNkZWZpbmUgQkYgKDErIDEyNykKLSNkZWZpbmUgQkIgKDErLTEyOCkKLSNkZWZpbmUgV0YgKDIrIDMyNzY3KQotI2RlZmluZSBXQiAoMistMzI3NjgpCi0vKiBEb250IG5lZWQgTEYsIExCIGJlY2F1c2UgdGhleSBhbHdheXMgcmVhY2guIFtUaGV5IGFyZSBjb2RlZCBhcyAwLl0gKi8KLQotCi0jZGVmaW5lIEMoYSxiKSBFTkNPREVfUkVMQVgoYSxiKQotLyogVGhpcyBtYWNybyBoYXMgbm8gc2lkZS1lZmZlY3RzLiAqLwotI2RlZmluZSBFTkNPREVfUkVMQVgod2hhdCxsZW5ndGgpICgoKHdoYXQpIDw8IDIpICsgKGxlbmd0aCkpCi0KLWNvbnN0IHJlbGF4X3R5cGVTIG1kX3JlbGF4X3RhYmxlW10gPQotewotICB7MSwgMSwgMCwgMH0sCQkJLyogZXJyb3Igc2VudGluZWwgICAwLDAJKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMCwxCSovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDAsMgkqLwotICB7MSwgMSwgMCwgMH0sCQkJLyogdW51c2VkCSAgICAwLDMJKi8KLSAge0JGICsgMSwgQkIgKyAxLCAyLCBDICgxLCAxKX0sLyogQl4iZm9vIgkgICAgMSwwICovCi0gIHtXRiArIDEsIFdCICsgMSwgMywgQyAoMSwgMil9LC8qIFdeImZvbyIJICAgIDEsMSAqLwotICB7MCwgMCwgNSwgMH0sCQkJLyogTF4iZm9vIgkgICAgMSwyICovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDEsMyAqLwotICB7QkYsIEJCLCAxLCBDICgyLCAxKX0sCS8qIGI8Y29uZD4gQl4iZm9vIiAgMiwwICovCi0gIHtXRiArIDIsIFdCICsgMiwgNCwgQyAoMiwgMil9LC8qIGJyLis/IGJydyBYCSAgICAyLDEgKi8KLSAgezAsIDAsIDcsIDB9LAkJCS8qIGJyLis/IGptcCBYCSAgICAyLDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMiwzICovCi0gIHtCRiwgQkIsIDEsIEMgKDMsIDEpfSwJLyogYnJiIEJeZm9vCSAgICAzLDAgKi8KLSAge1dGLCBXQiwgMiwgQyAoMywgMil9LAkvKiBicncgV15mb28JICAgIDMsMSAqLwotICB7MCwgMCwgNSwgMH0sCQkJLyogSm1wIExeZm9vCSAgICAzLDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgMywzICovCi0gIHsxLCAxLCAwLCAwfSwJCQkvKiB1bnVzZWQJICAgIDQsMCAqLwotICB7V0YsIFdCLCAyLCBDICg0LCAyKX0sCS8qIGFjYl8gXldmb28JICAgIDQsMSAqLwotICB7MCwgMCwgMTAsIDB9LAkJLyogYWNiXyxicixqbXAgTF5mb280LDIgKi8KLSAgezEsIDEsIDAsIDB9LAkJCS8qIHVudXNlZAkgICAgNCwzICovCi0gIHtCRiwgQkIsIDEsIEMgKDUsIDEpfSwJLyogWG9iX19fLCxmb28gICAgICA1LDAgKi8KLSAge1dGICsgNCwgV0IgKyA0LCA2LCBDICg1LCAyKX0sLyogWG9iLisyLGJyYi4rMyxicnc1LDEgKi8KLSAgezAsIDAsIDksIDB9LAkJCS8qIFhvYi4rMixicmIuKzYsam1wNSwyICovCi19OwotCi0jdW5kZWYgQwotI3VuZGVmIEJGCi0jdW5kZWYgQkIKLSN1bmRlZiBXRgotI3VuZGVmIFdCCi0KLXZvaWQgZmxvYXRfY29ucyAoKTsKLQotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJkZmxvYXQiLCBmbG9hdF9jb25zLCAnZCd9LAotICB7ImZmbG9hdCIsIGZsb2F0X2NvbnMsICdmJ30sCi0gIHsiZ2Zsb2F0IiwgZmxvYXRfY29ucywgJ2cnfSwKLSAgeyJoZmxvYXQiLCBmbG9hdF9jb25zLCAnaCd9LAotICB7MH0sCi19OwotCi0jZGVmaW5lIFNUQVRFX1BDX1JFTEFUSVZFCQkoMSkKLSNkZWZpbmUgU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNICSgyKQotI2RlZmluZSBTVEFURV9BTFdBWVNfQlJBTkNICQkoMykJLyogaW5jbHVkZXMgQlNCLi4uICovCi0jZGVmaW5lIFNUQVRFX0NPTVBMRVhfQlJBTkNICSAgICAgICAgKDQpCi0jZGVmaW5lIFNUQVRFX0NPTVBMRVhfSE9QCQkoNSkKLQotI2RlZmluZSBTVEFURV9CWVRFCQkJKDApCi0jZGVmaW5lIFNUQVRFX1dPUkQJCQkoMSkKLSNkZWZpbmUgU1RBVEVfTE9ORwkJCSgyKQotI2RlZmluZSBTVEFURV9VTkRGCQkJKDMpCS8qIFN5bWJvbCB1bmRlZmluZWQgaW4gcGFzczEgKi8KLQotCi0jZGVmaW5lIG1pbihhLCBiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotCi1pbnQgZmxvbnVtX2dlbjJ2YXggUEFSQU1TICgoY2hhciBmb3JtYXRfbGV0dGVyLCBGTE9OVU1fVFlQRSAqIGYsCi0JCQkgICAgTElUVExFTlVNX1RZUEUgKiB3b3JkcykpOwotc3RhdGljIGNvbnN0IGNoYXIgKnZpcF9iZWdpbiBQQVJBTVMgKChpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgdmlwX29wX2RlZmF1bHRzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHZpcF9vcCBQQVJBTVMgKChjaGFyICosIHN0cnVjdCB2b3AgKikpOwotc3RhdGljIHZvaWQgdmlwIFBBUkFNUyAoKHN0cnVjdCB2aXQgKiwgY2hhciAqKSk7Ci0KLXZvaWQKLW1kX2JlZ2luICgpCi17Ci0gIGNvbnN0IGNoYXIgKmVycnR4dDsKLSAgRkxPTlVNX1RZUEUgKmZQOwotICBpbnQgaTsKLQotICBpZiAoKGVycnR4dCA9IHZpcF9iZWdpbiAoMSwgIiQiLCAiKiIsICJgIikpICE9IDApCi0gICAgewotICAgICAgYXNfZmF0YWwgKF8oIlZJUF9CRUdJTiBlcnJvcjolcyIpLCBlcnJ0eHQpOwotICAgIH0KLQotICBmb3IgKGkgPSAwLCBmUCA9IGZsb2F0X29wZXJhbmQ7Ci0gICAgICAgZlAgPCBmbG9hdF9vcGVyYW5kICsgVklUX01BWF9PUEVSQU5EUzsKLSAgICAgICBpKyssIGZQKyspCi0gICAgewotICAgICAgZlAtPmxvdyA9ICZiaWdfb3BlcmFuZF9iaXRzW2ldWzBdOwotICAgICAgZlAtPmhpZ2ggPSAmYmlnX29wZXJhbmRfYml0c1tpXVtTSVpFX09GX0xBUkdFX05VTUJFUiAtIDFdOwotICAgIH0KLX0KLQwKLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAoY29uLCB2YWx1ZSwgbmJ5dGVzKQotICAgICBjaGFyIGNvbltdOwotICAgICB2YWx1ZVQgdmFsdWU7Ci0gICAgIGludCBuYnl0ZXM7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGNvbiwgdmFsdWUsIG5ieXRlcyk7Ci19Ci0KLS8qIEZpeCB1cCBzb21lIGRhdGEgb3IgaW5zdHJ1Y3Rpb25zIGFmdGVyIHdlIGZpbmQgb3V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbAotICAgdGhhdCB0aGV5IHJlZmVyZW5jZS4gICovCi0KLXZvaWQJCQkJLyogS25vd3MgYWJvdXQgb3JkZXIgb2YgYnl0ZXMgaW4gYWRkcmVzcy4gKi8KLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsdWUpCi0gICAgIGZpeFMgKmZpeFA7Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIG51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkodmFsdWVUKSB2YWx1ZSwgZml4UC0+Znhfc2l6ZSk7Ci19Ci0KLWxvbmcKLW1kX2NoYXJzX3RvX251bWJlciAoY29uLCBuYnl0ZXMpCi0gICAgIHVuc2lnbmVkIGNoYXIgY29uW107CS8qIExvdyBvcmRlciBieXRlIDFzdC4gKi8KLSAgICAgaW50IG5ieXRlczsJCS8qIE51bWJlciBvZiBieXRlcyBpbiB0aGUgaW5wdXQuICovCi17Ci0gIGxvbmcgcmV0dmFsOwotICBmb3IgKHJldHZhbCA9IDAsIGNvbiArPSBuYnl0ZXMgLSAxOyBuYnl0ZXMtLTsgY29uLS0pCi0gICAgewotICAgICAgcmV0dmFsIDw8PSBCSVRTX1BFUl9DSEFSOwotICAgICAgcmV0dmFsIHw9ICpjb247Ci0gICAgfQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogdmF4Om1kX2Fzc2VtYmxlKCkgZW1pdCBmcmFncyBmb3IgMSBpbnN0cnVjdGlvbiAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoaW5zdHJ1Y3Rpb25fc3RyaW5nKQotICAgICBjaGFyICppbnN0cnVjdGlvbl9zdHJpbmc7CS8qIEEgc3RyaW5nOiBhc3NlbWJsZSAxIGluc3RydWN0aW9uLiAqLwotewotICAvKiBOb24temVybyBpZiBvcGVyYW5kIGV4cHJlc3Npb24ncyBzZWdtZW50IGlzIG5vdCBrbm93biB5ZXQuICovCi0gIGludCBpc191bmRlZmluZWQ7Ci0KLSAgaW50IGxlbmd0aF9jb2RlOwotICBjaGFyICpwOwotICAvKiBBbiBvcGVyYW5kLiBTY2FucyBhbGwgb3BlcmFuZHMuICovCi0gIHN0cnVjdCB2b3AgKm9wZXJhbmRQOwotICBjaGFyICpzYXZlX2lucHV0X2xpbmVfcG9pbnRlcjsKLQkJCS8qIFdoYXQgdXNlZCB0byBsaXZlIGFmdGVyIGFuIGV4cHJlc3Npb24uICovCi0gIGNoYXIgY19zYXZlOwotICAvKiAxOiBpbnN0cnVjdGlvbl9zdHJpbmcgYmFkIGZvciBhbGwgcGFzc2VzLiAqLwotICBpbnQgZ29vZmVkOwotICAvKiBQb2ludHMgdG8gc2xvdCBqdXN0IGFmdGVyIGxhc3Qgb3BlcmFuZC4gICovCi0gIHN0cnVjdCB2b3AgKmVuZF9vcGVyYW5kUDsKLSAgLyogUG9pbnRzIHRvIGV4cHJlc3Npb24gdmFsdWVzIGZvciB0aGlzIG9wZXJhbmQuICAqLwotICBleHByZXNzaW9uUyAqZXhwUDsKLSAgc2VnVCAqc2VnUDsKLQotICAvKiBUaGVzZSByZWZlciB0byBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kIGV4cHJlc3Npb24uICovCi0gIC8qIFRhcmdldCBzZWdtZW50IG9mIHRoZSBhZGRyZXNzLgkgKi8KLSAgc2VnVCB0b19zZWc7Ci0gIHZhbHVlVCB0aGlzX2FkZF9udW1iZXI7Ci0gIC8qIFBvc2l0aXZlIChtaW51ZW5kKSBzeW1ib2wuICovCi0gIHN5bWJvbFMgKnRoaXNfYWRkX3N5bWJvbDsKLSAgLyogQXMgYSBudW1iZXIuICovCi0gIGxvbmcgb3Bjb2RlX2FzX251bWJlcjsKLSAgLyogTGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSAxc3QuICovCi0gIGNoYXIgKm9wY29kZV9hc19jaGFyczsKLSAgLyogQXMgYW4gYXJyYXkgb2YgY2hhcmFjdGVycy4gKi8KLSAgLyogTGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSAxc3QgKi8KLSAgY2hhciAqb3Bjb2RlX2xvd19ieXRlUDsKLSAgLyogbGVuZ3RoIChieXRlcykgbWVhbnQgYnkgdm9wX3Nob3J0LiAqLwotICBpbnQgbGVuZ3RoOwotICAvKiAwLCBvciAxIGlmICdAJyBpcyBpbiBhZGRyZXNzaW5nIG1vZGUuICovCi0gIGludCBhdDsKLSAgLyogRnJvbSB2b3BfbmJ5dGVzOiB2YXhfb3BlcmFuZF93aWR0aCAoaW4gYnl0ZXMpICovCi0gIGludCBuYnl0ZXM7Ci0gIEZMT05VTV9UWVBFICpmbG9hdFA7Ci0gIExJVFRMRU5VTV9UWVBFIGxpdGVyYWxfZmxvYXRbOF07Ci0gIC8qIEJpZyBlbm91Z2ggZm9yIGFueSBmbG9hdGluZyBwb2ludCBsaXRlcmFsLiAqLwotCi0gIHZpcCAoJnYsIGluc3RydWN0aW9uX3N0cmluZyk7Ci0KLSAgLyoKLSAgICogTm93IHdlIHRyeSB0byBmaW5kIGFzIG1hbnkgYXNfd2FybigpcyBhcyB3ZSBjYW4uIElmIHdlIGRvIGFueSBhc193YXJuKClzCi0gICAqIHRoZW4gZ29vZmVkPTEuIE5vdGljZSB0aGF0IHdlIGRvbid0IG1ha2UgYW55IGZyYWdzIHlldC4KLSAgICogU2hvdWxkIGdvb2ZlZCBiZSAxLCB0aGVuIHRoaXMgaW5zdHJ1Y3Rpb24gd2lsbCB3ZWRnZSBpbiBhbnkgcGFzcywKLSAgICogYW5kIHdlIGNhbiBzYWZlbHkgZmx1c2ggaXQsIHdpdGhvdXQgY2F1c2luZyBpbnRlcnBhc3Mgc3ltYm9sIHBoYXNlCi0gICAqIGVycm9ycy4gVGhhdCBpcywgd2l0aG91dCBjaGFuZ2luZyBsYWJlbCB2YWx1ZXMgaW4gZGlmZmVyZW50IHBhc3Nlcy4KLSAgICovCi0gIGlmICgoZ29vZmVkID0gKCp2LnZpdF9lcnJvcikpICE9IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3RhdGVtZW50IGR1ZSB0byBcIiVzXCIiKSwgdi52aXRfZXJyb3IpOwotICAgIH0KLSAgLyoKLSAgICogV2UgbmVlZCB0byB1c2UgZXhwcmVzc2lvbigpIGFuZCBmcmllbmRzLCB3aGljaCByZXF1aXJlIHVzIHRvIGRpZGRsZQotICAgKiBpbnB1dF9saW5lX3BvaW50ZXIuIFNvIHdlIHNhdmUgaXQgYW5kIHJlc3RvcmUgaXQgbGF0ZXIuCi0gICAqLwotICBzYXZlX2lucHV0X2xpbmVfcG9pbnRlciA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgZm9yIChvcGVyYW5kUCA9IHYudml0X29wZXJhbmQsCi0gICAgICAgZXhwUCA9IGV4cF9vZl9vcGVyYW5kLAotICAgICAgIHNlZ1AgPSBzZWdfb2Zfb3BlcmFuZCwKLSAgICAgICBmbG9hdFAgPSBmbG9hdF9vcGVyYW5kLAotICAgICAgIGVuZF9vcGVyYW5kUCA9IHYudml0X29wZXJhbmQgKyB2LnZpdF9vcGVyYW5kczsKLQotICAgICAgIG9wZXJhbmRQIDwgZW5kX29wZXJhbmRQOwotCi0gICAgICAgb3BlcmFuZFArKywgZXhwUCsrLCBzZWdQKyssIGZsb2F0UCsrKQotICAgIHsJCQkJLyogZm9yIGVhY2ggb3BlcmFuZCAqLwotICAgICAgaWYgKG9wZXJhbmRQLT52b3BfZXJyb3IpCi0JewotCSAgYXNfd2FybiAoXygiSWdub3Jpbmcgc3RhdGVtZW50IGJlY2F1c2UgXCIlc1wiIiksIG9wZXJhbmRQLT52b3BfZXJyb3IpOwotCSAgZ29vZmVkID0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogc3RhdGVtZW50IGhhcyBubyBzeW50YXggZ29vZnM6IGxldHMgc25pZmYgdGhlIGV4cHJlc3Npb24gKi8KLQkgIGludCBjYW5fYmVfc2hvcnQgPSAwOwkvKiAxIGlmIGEgYmlnbnVtIGNhbiBiZSByZWR1Y2VkIHRvIGEgc2hvcnQgbGl0ZXJhbC4gKi8KLQotCSAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BlcmFuZFAtPnZvcF9leHByX2JlZ2luOwotCSAgY19zYXZlID0gb3BlcmFuZFAtPnZvcF9leHByX2VuZFsxXTsKLQkgIG9wZXJhbmRQLT52b3BfZXhwcl9lbmRbMV0gPSAnXDAnOwotCSAgLyogSWYgdG9fc2VnID09IFNFR19QQVNTMSwgZXhwcmVzc2lvbigpIHdpbGwgaGF2ZSBzZXQgbmVlZF9wYXNzXzIgPSAxLiAqLwotCSAgKnNlZ1AgPSBleHByZXNzaW9uIChleHBQKTsKLQkgIHN3aXRjaCAoZXhwUC0+WF9vcCkKLQkgICAgewotCSAgICBjYXNlIE9fYWJzZW50OgotCSAgICAgIC8qIGZvciBCU0Q0LjIgY29tcGF0aWJpbGl0eSwgbWlzc2luZyBleHByZXNzaW9uIGlzIGFic29sdXRlIDAgKi8KLQkgICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgICBleHBQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICAgIC8qIEZvciBTRUdfQUJTT0xVVEUsIHdlIHNob3VsZG4ndCBuZWVkIHRvIHNldCBYX29wX3N5bWJvbCwKLQkJIFhfYWRkX3N5bWJvbCB0byBhbnkgcGFydGljdWxhciB2YWx1ZS4gIEJ1dCwgd2Ugd2lsbCBwcm9ncmFtCi0JCSBkZWZlbnNpdmVseS4gU2luY2UgdGhpcyBzaXR1YXRpb24gb2NjdXJzIHJhcmVseSBzbyBpdCBjb3N0cwotCQkgdXMgbGl0dGxlIHRvIGRvLCBhbmQgc3RvcHMgRGVhbiB3b3JyeWluZyBhYm91dCB0aGUgb3JpZ2luIG9mCi0JCSByYW5kb20gYml0cyBpbiBleHByZXNzaW9uUydzLiAgKi8KLQkgICAgICBleHBQLT5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgICAgIGV4cFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9fc3ltYm9sOgotCSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICAvKgotCSAgICAgICAqIE1ham9yIGJ1Zy4gV2UgY2FuJ3QgaGFuZGxlIHRoZSBjYXNlIG9mIGEKLQkgICAgICAgKiBTRUdfT1AgZXhwcmVzc2lvbiBpbiBhIFZJVF9PUENPREVfU1lOVEhFVElDCi0JICAgICAgICogdmFyaWFibGUtbGVuZ3RoIGluc3RydWN0aW9uLgotCSAgICAgICAqIFdlIGRvbid0IGhhdmUgYSBmcmFnIHR5cGUgdGhhdCBpcyBzbWFydCBlbm91Z2ggdG8KLQkgICAgICAgKiByZWxheCBhIFNFR19PUCwgYW5kIHNvIHdlIGp1c3QgZm9yY2UgYWxsCi0JICAgICAgICogU0VHX09QcyB0byBiZWhhdmUgbGlrZSBTRUdfUEFTUzFzLgotCSAgICAgICAqIENsZWFybHksIGlmIHRoZXJlIGlzIGEgZGVtYW5kIHdlIGNhbiBpbnZlbnQgYSBuZXcgb3IKLQkgICAgICAgKiBtb2RpZmllZCBmcmFnIHR5cGUgYW5kIHRoZW4gY29kaW5nIHVwIGEgZnJhZyBmb3IgdGhpcwotCSAgICAgICAqIGNhc2Ugd2lsbCBiZSBlYXN5LiBTRUdfT1Agd2FzIGludmVudGVkIGZvciB0aGUKLQkgICAgICAgKiAud29yZHMgYWZ0ZXIgYSBDQVNFIG9wY29kZSwgYW5kIHdhcyBuZXZlciBpbnRlbmRlZCBmb3IKLQkgICAgICAgKiBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KLQkgICAgICAgKi8KLQkgICAgICBuZWVkX3Bhc3NfMiA9IDE7Ci0JICAgICAgYXNfd2FybiAoXygiQ2FuJ3QgcmVsb2NhdGUgZXhwcmVzc2lvbiIpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE9fYmlnOgotCSAgICAgIC8qIFByZXNlcnZlIHRoZSBiaXRzLiAqLwotCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPiAwKQotCQl7Ci0JCSAgYmlnbnVtX2NvcHkgKGdlbmVyaWNfYmlnbnVtLCBleHBQLT5YX2FkZF9udW1iZXIsCi0JCQkgICAgICAgZmxvYXRQLT5sb3csIFNJWkVfT0ZfTEFSR0VfTlVNQkVSKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGtub3cgKGV4cFAtPlhfYWRkX251bWJlciA8IDApOwotCQkgIGZsb251bV9jb3B5ICgmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIsCi0JCQkgICAgICAgZmxvYXRQKTsKLQkJICBpZiAoc3RyY2hyICgicyBpIiwgb3BlcmFuZFAtPnZvcF9zaG9ydCkpCi0JCSAgICB7Ci0JCSAgICAgIC8qIENvdWxkIHBvc3NpYmx5IGJlY29tZSBTXiMgKi8KLQkJICAgICAgZmxvbnVtX2dlbjJ2YXggKC1leHBQLT5YX2FkZF9udW1iZXIsIGZsb2F0UCwgbGl0ZXJhbF9mbG9hdCk7Ci0JCSAgICAgIHN3aXRjaCAoLWV4cFAtPlhfYWRkX251bWJlcikKLQkJCXsKLQkJCWNhc2UgJ2YnOgotCQkJICBjYW5fYmVfc2hvcnQgPQotCQkJICAgIChsaXRlcmFsX2Zsb2F0WzBdICYgMHhGQzBGKSA9PSAweDQwMDAKLQkJCSAgICAmJiBsaXRlcmFsX2Zsb2F0WzFdID09IDA7Ci0JCQkgIGJyZWFrOwotCi0JCQljYXNlICdkJzoKLQkJCSAgY2FuX2JlX3Nob3J0ID0KLQkJCSAgICAobGl0ZXJhbF9mbG9hdFswXSAmIDB4RkMwRikgPT0gMHg0MDAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsxXSA9PSAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFsyXSA9PSAwCi0JCQkgICAgJiYgbGl0ZXJhbF9mbG9hdFszXSA9PSAwOwotCQkJICBicmVhazsKLQotCQkJY2FzZSAnZyc6Ci0JCQkgIGNhbl9iZV9zaG9ydCA9Ci0JCQkgICAgKGxpdGVyYWxfZmxvYXRbMF0gJiAweEZGODEpID09IDB4NDAwMAotCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbMV0gPT0gMAotCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbMl0gPT0gMAotCQkJICAgICYmIGxpdGVyYWxfZmxvYXRbM10gPT0gMDsKLQkJCSAgYnJlYWs7Ci0KLQkJCWNhc2UgJ2gnOgotCQkJICBjYW5fYmVfc2hvcnQgPSAoKGxpdGVyYWxfZmxvYXRbMF0gJiAweEZGRjgpID09IDB4NDAwMAotCQkJCQkgICYmIChsaXRlcmFsX2Zsb2F0WzFdICYgMHhFMDAwKSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFsyXSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFszXSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFs0XSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFs1XSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFs2XSA9PSAwCi0JCQkJCSAgJiYgbGl0ZXJhbF9mbG9hdFs3XSA9PSAwKTsKLQkJCSAgYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkgIEJBRF9DQVNFICgtZXhwUC0+WF9hZGRfbnVtYmVyKTsKLQkJCSAgYnJlYWs7Ci0JCQl9CS8qIHN3aXRjaCAoZmxvYXQgdHlwZSkgKi8KLQkJICAgIH0JCS8qIGlmIChjb3VsZCB3YW50IHRvIGJlY29tZSBTXiMuLi4pICovCi0JCX0JCS8qIGJpZ251bSBvciBmbG9udW0gPyAqLwotCi0JICAgICAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnCi0JCSAgfHwgb3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnaScKLQkJICB8fCAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcKLQkJICAgICAgJiYgb3BlcmFuZFAtPnZvcF9yZWcgPT0gMHhGCi0JCSAgICAgICYmIChvcGVyYW5kUC0+dm9wX21vZGUgJiAweEUpID09IDB4OCkpCi0JCXsKLQkJICAvKiBTYXcgYSAnIycuICovCi0JCSAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJyAnKQotCQkgICAgewotCQkgICAgICAvKiBXZSBtdXN0IGNob3NlIFNeIG9yIEleLiAqLwotCQkgICAgICBpZiAoZXhwUC0+WF9hZGRfbnVtYmVyID4gMCkKLQkJCXsKLQkJCSAgLyogQmlnbnVtOiBTaG9ydCBsaXRlcmFsIGltcG9zc2libGUuICovCi0JCQkgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAnaSc7Ci0JCQkgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDg7Ci0JCQkgIG9wZXJhbmRQLT52b3BfcmVnID0gMHhGOwkvKiBWQVggUEMuICovCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyogRmxvbnVtOiBUcnkgdG8gZG8gaXQuICovCi0JCQkgIGlmIChjYW5fYmVfc2hvcnQpCi0JCQkgICAgewotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdzJzsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3BfbW9kZSA9IDA7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX25keCA9IC0xOwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAtMTsKLQkJCSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAnaSc7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQyAqLwotCQkJICAgIH0KLQkJCX0JLyogYmlnbnVtIG9yIGZsb251bSA/ICovCi0JCSAgICB9CQkvKiAgaWYgIywgYnV0IG5vIFNeIG9yIEleIHNlZW4uICovCi0JCSAgLyogTm8gbW9yZSAnICcgY2FzZTogZWl0aGVyICdzJyBvciAnaScuICovCi0JCSAgaWYgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ3MnKQotCQkgICAgewotCQkgICAgICAvKiBXYW50cyB0byBiZSBhIHNob3J0IGxpdGVyYWwuICovCi0JCSAgICAgIGlmIChleHBQLT5YX2FkZF9udW1iZXIgPiAwKQotCQkJewotCQkJICBhc193YXJuIChfKCJCaWdudW0gbm90IHBlcm1pdHRlZCBpbiBzaG9ydCBsaXRlcmFsLiBJbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIpKTsKLQkJCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJCSAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKLQkJCSAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7CS8qIFZBWCBQQy4gKi8KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAoIWNhbl9iZV9zaG9ydCkKLQkJCSAgICB7Ci0JCQkgICAgICBhc193YXJuIChfKCJDYW4ndCBkbyBmbG9udW0gc2hvcnQgbGl0ZXJhbDogaW1tZWRpYXRlIG1vZGUgdXNlZC4iKSk7Ci0JCQkgICAgICBvcGVyYW5kUC0+dm9wX3Nob3J0ID0gJ2knOwotCQkJICAgICAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKLQkJCSAgICAgIG9wZXJhbmRQLT52b3BfcmVnID0gMHhGOwkvKiBWQVggUEMuICovCi0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewkvKiBFbmNvZGUgc2hvcnQgbGl0ZXJhbCBub3cuICovCi0JCQkgICAgICBpbnQgdGVtcCA9IDA7Ci0KLQkJCSAgICAgIHN3aXRjaCAoLWV4cFAtPlhfYWRkX251bWJlcikKLQkJCQl7Ci0JCQkJY2FzZSAnZic6Ci0JCQkJY2FzZSAnZCc6Ci0JCQkJICB0ZW1wID0gbGl0ZXJhbF9mbG9hdFswXSA+PiA0OwotCQkJCSAgYnJlYWs7Ci0KLQkJCQljYXNlICdnJzoKLQkJCQkgIHRlbXAgPSBsaXRlcmFsX2Zsb2F0WzBdID4+IDE7Ci0JCQkJICBicmVhazsKLQotCQkJCWNhc2UgJ2gnOgotCQkJCSAgdGVtcCA9ICgobGl0ZXJhbF9mbG9hdFswXSA8PCAzKSAmIDA3MCkKLQkJCQkgICAgfCAoKGxpdGVyYWxfZmxvYXRbMV0gPj4gMTMpICYgMDcpOwotCQkJCSAgYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCSAgQkFEX0NBU0UgKC1leHBQLT5YX2FkZF9udW1iZXIpOwotCQkJCSAgYnJlYWs7Ci0JCQkJfQotCi0JCQkgICAgICBmbG9hdFAtPmxvd1swXSA9IHRlbXAgJiAwNzc7Ci0JCQkgICAgICBmbG9hdFAtPmxvd1sxXSA9IDA7Ci0JCQkgICAgfQkvKiBpZiBjYW4gYmUgc2hvcnQgbGl0ZXJhbCBmbG9hdCAqLwotCQkJfQkvKiBmbG9udW0gb3IgYmlnbnVtID8gKi8KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiBJXiMgc2Vlbjogc2V0IGl0IHVwIGlmIGZsb2F0LiAqLwotCQkgICAgICBpZiAoZXhwUC0+WF9hZGRfbnVtYmVyIDwgMCkKLQkJCXsKLQkJCSAgbWVtY3B5IChmbG9hdFAtPmxvdywgbGl0ZXJhbF9mbG9hdCwgc2l6ZW9mIChsaXRlcmFsX2Zsb2F0KSk7Ci0JCQl9Ci0JCSAgICB9CQkvKiBpZiBTXiMgc2Vlbi4gKi8KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFzX3dhcm4gKF8oIkEgYmlnbnVtL2Zsb251bSBtYXkgbm90IGJlIGEgZGlzcGxhY2VtZW50OiAweCVseCB1c2VkIiksCi0JCQkgICAoZXhwUC0+WF9hZGRfbnVtYmVyID0gMHg4MDAwMDAwMEwpKTsKLQkJICAvKiBDaG9zZW4gc28gbHVzZXIgZ2V0cyB0aGUgbW9zdCBvZmZzZXQgYml0cyB0byBwYXRjaCBsYXRlci4gKi8KLQkJfQotCSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IGZsb2F0UC0+bG93WzBdCi0JCXwgKChMSVRUTEVOVU1fTUFTSyAmIChmbG9hdFAtPmxvd1sxXSkpIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyk7Ci0JICAgICAgLyoKLQkgICAgICAgKiBGb3IgdGhlIE9fYmlnIGNhc2Ugd2UgaGF2ZToKLQkgICAgICAgKiBJZiB2b3Bfc2hvcnQgPT0gJ3MnIHRoZW4gYSBzaG9ydCBmbG9hdGluZyBsaXRlcmFsIGlzIGluIHRoZQotCSAgICAgICAqCWxvd2VzdCA2IGJpdHMgb2YgZmxvYXRQIC0+IGxvdyBbMF0sIHdoaWNoIGlzCi0JICAgICAgICoJYmlnX29wZXJhbmRfYml0cyBbLS0tXSBbMF0uCi0JICAgICAgICogSWYgdm9wX3Nob3J0ID09ICdpJyB0aGVuIHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgZWxlbWVudHMKLQkgICAgICAgKglvZiBiaWdfb3BlcmFuZF9iaXRzIFstLS1dIFsuLi5dIGFyZSBzZXQgdXAgd2l0aCB0aGUgY29ycmVjdAotCSAgICAgICAqCWJpdHMuCi0JICAgICAgICogQWxzbywganVzdCBpbiBjYXNlIHdpZHRoIGlzIGJ5dGUgd29yZCBvciBsb25nLCB3ZSBjb3B5IHRoZSBsb3dlc3QKLQkgICAgICAgKiAzMiBiaXRzIG9mIHRoZSBudW1iZXIgdG8gWF9hZGRfbnVtYmVyLgotCSAgICAgICAqLwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAoaW5wdXRfbGluZV9wb2ludGVyICE9IG9wZXJhbmRQLT52b3BfZXhwcl9lbmQgKyAxKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoIkp1bmsgYXQgZW5kIG9mIGV4cHJlc3Npb24gXCIlc1wiIiwgaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICAgICBnb29mZWQgPSAxOwotCSAgICB9Ci0JICBvcGVyYW5kUC0+dm9wX2V4cHJfZW5kWzFdID0gY19zYXZlOwotCX0KLSAgICB9CQkJCS8qIGZvcihlYWNoIG9wZXJhbmQpICovCi0KLSAgaW5wdXRfbGluZV9wb2ludGVyID0gc2F2ZV9pbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKG5lZWRfcGFzc18yIHx8IGdvb2ZlZCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgLyogRW1pdCBvcC1jb2RlLiAqLwotICAvKiBSZW1lbWJlciB3aGVyZSBpdCBpcywgaW4gY2FzZSB3ZSB3YW50IHRvIG1vZGlmeSB0aGUgb3AtY29kZSBsYXRlci4gKi8KLSAgb3Bjb2RlX2xvd19ieXRlUCA9IGZyYWdfbW9yZSAodi52aXRfb3Bjb2RlX25ieXRlcyk7Ci0gIG1lbWNweSAob3Bjb2RlX2xvd19ieXRlUCwgdi52aXRfb3Bjb2RlLCB2LnZpdF9vcGNvZGVfbmJ5dGVzKTsKLSAgb3Bjb2RlX2FzX251bWJlciA9IG1kX2NoYXJzX3RvX251bWJlciAob3Bjb2RlX2FzX2NoYXJzID0gdi52aXRfb3Bjb2RlLCA0KTsKLSAgZm9yIChvcGVyYW5kUCA9IHYudml0X29wZXJhbmQsCi0gICAgICAgZXhwUCA9IGV4cF9vZl9vcGVyYW5kLAotICAgICAgIHNlZ1AgPSBzZWdfb2Zfb3BlcmFuZCwKLSAgICAgICBmbG9hdFAgPSBmbG9hdF9vcGVyYW5kLAotICAgICAgIGVuZF9vcGVyYW5kUCA9IHYudml0X29wZXJhbmQgKyB2LnZpdF9vcGVyYW5kczsKLQotICAgICAgIG9wZXJhbmRQIDwgZW5kX29wZXJhbmRQOwotCi0gICAgICAgb3BlcmFuZFArKywKLSAgICAgICBmbG9hdFArKywKLSAgICAgICBzZWdQKyssCi0gICAgICAgZXhwUCsrKQotICAgIHsKLSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX25keCA+PSAwKQotCXsKLQkgIC8qIGluZGV4ZWQgYWRkcmVzc2luZyBieXRlICovCi0JICAvKiBMZWdhbGl0eSBvZiBpbmRleGVkIG1vZGUgYWxyZWFkeSBjaGVja2VkOiBpdCBpcyBPSyAqLwotCSAgRlJBR19BUFBFTkRfMV9DSEFSICgweDQwICsgb3BlcmFuZFAtPnZvcF9uZHgpOwotCX0JCQkvKiBpZih2b3BfbmR4Pj0wKSAqLwotCi0gICAgICAvKiBIZXJlIHRvIG1ha2UgbWFpbiBvcGVyYW5kIGZyYWcocykuICovCi0gICAgICB0aGlzX2FkZF9udW1iZXIgPSBleHBQLT5YX2FkZF9udW1iZXI7Ci0gICAgICB0aGlzX2FkZF9zeW1ib2wgPSBleHBQLT5YX2FkZF9zeW1ib2w7Ci0gICAgICB0b19zZWcgPSAqc2VnUDsKLSAgICAgIGlzX3VuZGVmaW5lZCA9ICh0b19zZWcgPT0gU0VHX1VOS05PV04pOwotICAgICAgYXQgPSBvcGVyYW5kUC0+dm9wX21vZGUgJiAxOwotICAgICAgbGVuZ3RoID0gKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ2InCi0JCT8gMSA6IChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICd3JwotCQkgICAgICAgPyAyIDogKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJ2wnCi0JCQkgICAgICA/IDQgOiAwKSkpOwotICAgICAgbmJ5dGVzID0gb3BlcmFuZFAtPnZvcF9uYnl0ZXM7Ci0gICAgICBpZiAob3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ2InKQotCXsKLQkgIGlmICh0b19zZWcgPT0gbm93X3NlZyB8fCBpc191bmRlZmluZWQpCi0JICAgIHsKLQkgICAgICAvKiBJZiBpc191bmRlZmluZWQsIHRoZW4gaXQgbWlnaHQgQkVDT01FIG5vd19zZWcuICovCi0JICAgICAgaWYgKG5ieXRlcykKLQkJewotCQkgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyk7Ci0JCSAgZml4X25ldyAoZnJhZ19ub3csIHAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwgbmJ5dGVzLAotCQkJICAgdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewkJLyogdG9fc2VnPT1ub3dfc2VnIHx8IHRvX3NlZyA9PSBTRUdfVU5LTk9XTiAqLwotCQkgIC8qIG5ieXRlcz09MCAqLwotCQkgIGxlbmd0aF9jb2RlID0gaXNfdW5kZWZpbmVkID8gU1RBVEVfVU5ERiA6IFNUQVRFX0JZVEU7Ci0JCSAgaWYgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NQRUNJQUwpCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9VTkNPTkRJVElPTkFMX0pVTVApCi0JCQl7Ci0JCQkgIC8qIGJyIG9yIGpzYiAqLwotCQkJICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDUsIDEsCi0JCQkgICAgRU5DT0RFX1JFTEFYIChTVEFURV9BTFdBWVNfQlJBTkNILCBsZW5ndGhfY29kZSksCi0JCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCSAgICBvcGNvZGVfbG93X2J5dGVQKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBpZiAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfV09SRF9KVU1QKQotCQkJICAgIHsKLQkJCSAgICAgIGxlbmd0aF9jb2RlID0gU1RBVEVfV09SRDsKLQkJCSAgICAgIC8qIEpGOiBUaGVyZSBpcyBubyBzdGF0ZV9ieXRlIGZvciB0aGlzIG9uZSEgKi8KLQkJCSAgICAgIGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDIsCi0JCQkJCUVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIGxlbmd0aF9jb2RlKSwKLQkJCQkJdGhpc19hZGRfc3ltYm9sLCB0aGlzX2FkZF9udW1iZXIsCi0JCQkJCW9wY29kZV9sb3dfYnl0ZVApOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0JZVEVfSlVNUCk7Ci0JCQkgICAgICBmcmFnX3ZhciAocnNfbWFjaGluZV9kZXBlbmRlbnQsIDksIDEsCi0JCQkgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBsZW5ndGhfY29kZSksCi0JCQkJCXRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCQlvcGNvZGVfbG93X2J5dGVQKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBrbm93IChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9DT05ESVRJT05BTF9KVU1QKTsKLQkJICAgICAgZnJhZ192YXIgKHJzX21hY2hpbmVfZGVwZW5kZW50LCA3LCAxLAotCQkgICAgICAgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIGxlbmd0aF9jb2RlKSwKLQkJCQl0aGlzX2FkZF9zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCQlvcGNvZGVfbG93X2J5dGVQKTsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiB0b19zZWcgIT0gbm93X3NlZyAmJiB0b19zZWcgIT0gU0VHX1VOS05PV04gKi8KLQkgICAgICAvKgotCSAgICAgICAqIC0tLSBTRUcgRkxPQVQgTUFZIEFQUEVBUiBIRVJFIC0tLS0KLQkgICAgICAgKi8KLQkgICAgICBpZiAodG9fc2VnID09IFNFR19BQlNPTFVURSkKLQkJewotCQkgIGlmIChuYnl0ZXMpCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKCEob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1lOVEhFVElDKSk7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyk7Ci0JCSAgICAgIC8qIENvbnZlbnRpb25hbCByZWxvY2F0aW9uLiAqLwotCQkgICAgICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJICAgICAgIG5ieXRlcywgJmFic19zeW1ib2wsIHRoaXNfYWRkX251bWJlciwKLQkJCSAgICAgICAxLCBOT19SRUxPQyk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBrbm93IChvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TWU5USEVUSUMpOwotCQkgICAgICBpZiAob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1BFQ0lBTCkKLQkJCXsKLQkJCSAgaWYgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX1VOQ09ORElUSU9OQUxfSlVNUCkKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBiciBvciBqc2IgKi8KLQkJCSAgICAgICpvcGNvZGVfbG93X2J5dGVQID0gb3Bjb2RlX2FzX2NoYXJzWzBdICsgVkFYX1dJREVOX0xPTkc7Ci0JCQkgICAgICBrbm93IChvcGNvZGVfYXNfY2hhcnNbMV0gPT0gMCk7Ci0JCQkgICAgICBwID0gZnJhZ19tb3JlICg1KTsKLQkJCSAgICAgIHBbMF0gPSBWQVhfQUJTT0xVVEVfTU9ERTsJLyogQCMuLi4gKi8KLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkgICAgICAvKiBOb3cgKGVnKSBKTVAgQCNmb28gb3IgSlNCIEAjZm9vLiAqLwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9XT1JEX0pVTVApCi0JCQkJewotCQkJCSAgcCA9IGZyYWdfbW9yZSAoMTApOwotCQkJCSAgcFswXSA9IDI7Ci0JCQkJICBwWzFdID0gMDsKLQkJCQkgIHBbMl0gPSBWQVhfQlJCOwotCQkJCSAgcFszXSA9IDY7Ci0JCQkJICBwWzRdID0gVkFYX0pNUDsKLQkJCQkgIHBbNV0gPSBWQVhfQUJTT0xVVEVfTU9ERTsJLyogQCMuLi4gKi8KLQkJCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDYsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkJICAvKgotCQkJCSAgICogTm93IChlZykJQUNCeAkxZgotCQkJCSAgICoJCUJSQgkyZgotCQkJCSAgICoJMToJSk1QCUAjZm9vCi0JCQkJICAgKgkyOgotCQkJCSAgICovCi0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGtub3cgKG9wZXJhbmRQLT52b3Bfd2lkdGggPT0gVkFYX1dJRFRIX0JZVEVfSlVNUCk7Ci0JCQkJICBwID0gZnJhZ19tb3JlICg5KTsKLQkJCQkgIHBbMF0gPSAyOwotCQkJCSAgcFsxXSA9IFZBWF9CUkI7Ci0JCQkJICBwWzJdID0gNjsKLQkJCQkgIHBbM10gPSBWQVhfSk1QOwotCQkJCSAgcFs0XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFICsgMTsJLyogQCMuLi4gKi8KLQkJCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDUsIHRoaXNfYWRkX251bWJlciwgNCk7Ci0JCQkJICAvKgotCQkJCSAgICogTm93IChlZykJeE9CeHh4CTFmCi0JCQkJICAgKgkJQlJCCTJmCi0JCQkJICAgKgkxOglKTVAJQCNmb28KLQkJCQkgICAqCTI6Ci0JCQkJICAgKi8KLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIGI8Y29uZD4gKi8KLQkJCSAgKm9wY29kZV9sb3dfYnl0ZVAgXj0gMTsKLQkJCSAgLyogVG8gcmV2ZXJzZSB0aGUgY29uZGl0aW9uIGluIGEgVkFYIGJyYW5jaCwKLQkJCSAgICAgY29tcGxlbWVudCB0aGUgbG93ZXN0IG9yZGVyIGJpdC4gKi8KLQkJCSAgcCA9IGZyYWdfbW9yZSAoNyk7Ci0JCQkgIHBbMF0gPSA2OwotCQkJICBwWzFdID0gVkFYX0pNUDsKLQkJCSAgcFsyXSA9IFZBWF9BQlNPTFVURV9NT0RFOwkvKiBAIy4uLiAqLwotCQkJICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAzLCB0aGlzX2FkZF9udW1iZXIsIDQpOwotCQkJICAvKgotCQkJICAgKiBOb3cgKGVnKQlCTEVRCTFmCi0JCQkgICAqCQlKTVAJQCNmb28KLQkJCSAgICoJMToKLQkJCSAgICovCi0JCQl9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiB0b19zZWcgIT0gbm93X3NlZyAmJiB0b19zZWcgIT0gU0VHX1VOS05PV04gJiYgdG9fU2VnICE9IFNFR19BQlNPTFVURSAqLwotCQkgIGlmIChuYnl0ZXMgPiAwKQotCQkgICAgewotCQkgICAgICAvKiBQYy1yZWxhdGl2ZS4gQ29udmVudGlvbmFsIHJlbG9jYXRpb24uICovCi0JCSAgICAgIGtub3cgKCEob3Bjb2RlX2FzX251bWJlciAmIFZJVF9PUENPREVfU1lOVEhFVElDKSk7Ci0JCSAgICAgIHAgPSBmcmFnX21vcmUgKG5ieXRlcyk7Ci0JCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkgICAgICAgbmJ5dGVzLCAmYWJzX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJICAgICAgIDEsIE5PX1JFTE9DKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGtub3cgKG9wY29kZV9hc19udW1iZXIgJiBWSVRfT1BDT0RFX1NZTlRIRVRJQyk7Ci0JCSAgICAgIGlmIChvcGNvZGVfYXNfbnVtYmVyICYgVklUX09QQ09ERV9TUEVDSUFMKQotCQkJewotCQkJICBpZiAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfVU5DT05ESVRJT05BTF9KVU1QKQotCQkJICAgIHsKLQkJCSAgICAgIC8qIGJyIG9yIGpzYiAqLwotCQkJICAgICAga25vdyAob3Bjb2RlX2FzX2NoYXJzWzFdID09IDApOwotCQkJICAgICAgKm9wY29kZV9sb3dfYnl0ZVAgPSBvcGNvZGVfYXNfY2hhcnNbMF0gKyBWQVhfV0lERU5fTE9ORzsKLQkJCSAgICAgIHAgPSBmcmFnX21vcmUgKDUpOwotCQkJICAgICAgcFswXSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotCQkJICAgICAgZml4X25ldyAoZnJhZ19ub3csCi0JCQkJICAgICAgIHAgKyAxIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIDQsCi0JCQkJICAgICAgIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICAgICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7Ci0JCQkgICAgICAvKiBOb3cgZWcgSk1QIGZvbyBvciBKU0IgZm9vLiAqLwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9XT1JEX0pVTVApCi0JCQkJewotCQkJCSAgcCA9IGZyYWdfbW9yZSAoMTApOwotCQkJCSAgcFswXSA9IDA7Ci0JCQkJICBwWzFdID0gMjsKLQkJCQkgIHBbMl0gPSBWQVhfQlJCOwotCQkJCSAgcFszXSA9IDY7Ci0JCQkJICBwWzRdID0gVkFYX0pNUDsKLQkJCQkgIHBbNV0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLQkJCQkgIGZpeF9uZXcgKGZyYWdfbm93LAotCQkJCQkgICBwICsgNiAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCA0LAotCQkJCQkgICB0aGlzX2FkZF9zeW1ib2wsCi0JCQkJCSAgIHRoaXNfYWRkX251bWJlciwgMSwgTk9fUkVMT0MpOwotCQkJCSAgLyoKLQkJCQkgICAqIE5vdyAoZWcpCUFDQngJMWYKLQkJCQkgICAqCQlCUkIJMmYKLQkJCQkgICAqCTE6CUpNUAlmb28KLQkJCQkgICAqCTI6Ci0JCQkJICAgKi8KLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF93aWR0aCA9PSBWQVhfV0lEVEhfQllURV9KVU1QKTsKLQkJCQkgIHAgPSBmcmFnX21vcmUgKDEwKTsKLQkJCQkgIHBbMF0gPSAyOwotCQkJCSAgcFsxXSA9IFZBWF9CUkI7Ci0JCQkJICBwWzJdID0gNjsKLQkJCQkgIHBbM10gPSBWQVhfSk1QOwotCQkJCSAgcFs0XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwotCQkJCSAgZml4X25ldyAoZnJhZ19ub3csCi0JCQkJCSAgIHAgKyA1IC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCQkJCSAgIDQsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkJICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7Ci0JCQkJICAvKgotCQkJCSAgICogTm93IChlZykJeE9CeHh4CTFmCi0JCQkJICAgKgkJQlJCCTJmCi0JCQkJICAgKgkxOglKTVAJZm9vCi0JCQkJICAgKgkyOgotCQkJCSAgICovCi0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBrbm93IChvcGVyYW5kUC0+dm9wX3dpZHRoID09IFZBWF9XSURUSF9DT05ESVRJT05BTF9KVU1QKTsKLQkJCSAgKm9wY29kZV9sb3dfYnl0ZVAgXj0gMTsJLyogUmV2ZXJzZSBicmFuY2ggY29uZGl0aW9uLiAqLwotCQkJICBwID0gZnJhZ19tb3JlICg3KTsKLQkJCSAgcFswXSA9IDY7Ci0JCQkgIHBbMV0gPSBWQVhfSk1QOwotCQkJICBwWzJdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7Ci0JCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMyAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCSAgIDQsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGtub3cgKG9wZXJhbmRQLT52b3BfYWNjZXNzICE9ICdiJyk7CS8qIFNvIGl0IGlzIG9yZGluYXJ5IG9wZXJhbmQuICovCi0JICBrbm93IChvcGVyYW5kUC0+dm9wX2FjY2VzcyAhPSAnICcpOwkvKiAnICcgdGFyZ2V0LWluZGVwZW5kZW50OiBlbHNld2hlcmUuICovCi0JICBrbm93IChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAnYScKLQkJfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ20nCi0JCXx8IG9wZXJhbmRQLT52b3BfYWNjZXNzID09ICdyJwotCQl8fCBvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndicKLQkJfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ3cnKTsKLQkgIGlmIChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICdzJykKLQkgICAgewotCSAgICAgIGlmICh0b19zZWcgPT0gU0VHX0FCU09MVVRFKQotCQl7Ci0JCSAgaWYgKHRoaXNfYWRkX251bWJlciA+PSA2NCkKLQkJICAgIHsKLQkJICAgICAgYXNfd2FybiAoXygiU2hvcnQgbGl0ZXJhbCBvdmVyZmxvdyglbGQuKSwgaW1tZWRpYXRlIG1vZGUgYXNzdW1lZC4iKSwKLQkJCSAgICAgICAobG9uZykgdGhpc19hZGRfbnVtYmVyKTsKLQkJICAgICAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJICAgICAgb3BlcmFuZFAtPnZvcF9tb2RlID0gODsKLQkJICAgICAgb3BlcmFuZFAtPnZvcF9yZWcgPSAweEY7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhc193YXJuIChfKCJGb3JjZWQgc2hvcnQgbGl0ZXJhbCB0byBpbW1lZGlhdGUgbW9kZS4gbm93X3NlZz0lcyB0b19zZWc9JXMiKSwKLQkJCSAgIHNlZ21lbnRfbmFtZSAobm93X3NlZyksIHNlZ21lbnRfbmFtZSAodG9fc2VnKSk7Ci0JCSAgb3BlcmFuZFAtPnZvcF9zaG9ydCA9ICdpJzsKLQkJICBvcGVyYW5kUC0+dm9wX21vZGUgPSA4OwotCQkgIG9wZXJhbmRQLT52b3BfcmVnID0gMHhGOwotCQl9Ci0JICAgIH0KLQkgIGlmIChvcGVyYW5kUC0+dm9wX3JlZyA+PSAwICYmIChvcGVyYW5kUC0+dm9wX21vZGUgPCA4Ci0JCSAgfHwgKG9wZXJhbmRQLT52b3BfcmVnICE9IDB4RiAmJiBvcGVyYW5kUC0+dm9wX21vZGUgPCAxMCkpKQotCSAgICB7Ci0JICAgICAgLyogT25lIGJ5dGUgb3BlcmFuZC4gKi8KLQkgICAgICBrbm93IChvcGVyYW5kUC0+dm9wX21vZGUgPiAzKTsKLQkgICAgICBGUkFHX0FQUEVORF8xX0NIQVIgKG9wZXJhbmRQLT52b3BfbW9kZSA8PCA0IHwgb3BlcmFuZFAtPnZvcF9yZWcpOwotCSAgICAgIC8qIEFsbCAxLWJ5dGVzIGV4Y2VwdCBTXiMgaGFwcGVuIGhlcmUuICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHtAfXtxXn1mb297KFJuKX0gb3IgU14jZm9vICovCi0JICAgICAgaWYgKG9wZXJhbmRQLT52b3BfcmVnID09IC0xICYmIG9wZXJhbmRQLT52b3Bfc2hvcnQgIT0gJ3MnKQotCQl7Ci0JCSAgLyogIntAfXtxXn1mb28iICovCi0JCSAgaWYgKHRvX3NlZyA9PSBub3dfc2VnKQotCQkgICAgewotCQkgICAgICBpZiAobGVuZ3RoID09IDApCi0JCQl7Ci0JCQkgIGtub3cgKG9wZXJhbmRQLT52b3Bfc2hvcnQgPT0gJyAnKTsKLQkJCSAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgMTAsIDIsCi0JCQkgICAgICAgRU5DT0RFX1JFTEFYIChTVEFURV9QQ19SRUxBVElWRSwgU1RBVEVfQllURSksCi0JCQkJCXRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCQlvcGNvZGVfbG93X2J5dGVQKTsKLQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9tb2RlID09IDEwICsgYXQpOwotCQkJICAqcCA9IGF0IDw8IDQ7Ci0JCQkgIC8qIEF0IGlzIHRoZSBvbmx5IGNvbnRleHQgd2UgbmVlZCB0byBjYXJyeQotCQkJICAgICB0byBvdGhlciBzaWRlIG9mIHJlbGF4KCkgcHJvY2Vzcy4gIE11c3QKLQkJCSAgICAgYmUgaW4gdGhlIGNvcnJlY3QgYml0IHBvc2l0aW9uIG9mIFZBWAotCQkJICAgICBvcGVyYW5kIHNwZWMuIGJ5dGUuICovCi0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAga25vdyAobGVuZ3RoKTsKLQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAnICcpOwotCQkJICBwID0gZnJhZ19tb3JlIChsZW5ndGggKyAxKTsKLQkJCSAgcFswXSA9IDB4RiB8ICgoYXQgKyAiP1wxMlwxND9cMTYiW2xlbmd0aF0pIDw8IDQpOwotCQkJICBmaXhfbmV3IChmcmFnX25vdywgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCQkgICBsZW5ndGgsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDEsIE5PX1JFTE9DKTsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiB0b19zZWcgIT0gbm93X3NlZyAqLwotCQkgICAgICBpZiAodGhpc19hZGRfc3ltYm9sID09IE5VTEwpCi0JCQl7Ci0JCQkgIGtub3cgKHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUpOwotCQkJICAvKiBEbyBAI2Zvbzogc2ltcGxlciByZWxvY2F0aW9uIHRoYW4gZm9vLS4ocGMpIGFueXdheS4gKi8KLQkJCSAgcCA9IGZyYWdfbW9yZSAoNSk7Ci0JCQkgIHBbMF0gPSBWQVhfQUJTT0xVVEVfTU9ERTsJLyogQCMuLi4gKi8KLQkJCSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwICsgMSwgdGhpc19hZGRfbnVtYmVyLCA0KTsKLQkJCSAgaWYgKGxlbmd0aCAmJiBsZW5ndGggIT0gNCkKLQkJCSAgICB7Ci0JCQkgICAgICBhc193YXJuIChfKCJMZW5ndGggc3BlY2lmaWNhdGlvbiBpZ25vcmVkLiBBZGRyZXNzIG1vZGUgOUYgdXNlZCIpKTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIGVsc2UKLQkJCXsKLQkJCSAgLyoge0B9e3FefW90aGVyX3NlZyAqLwotCQkJICBrbm93ICgobGVuZ3RoID09IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpCi0JCQkgICAgIHx8IChsZW5ndGggPiAwICYmIG9wZXJhbmRQLT52b3Bfc2hvcnQgIT0gJyAnKSk7Ci0JCQkgIGlmIChpc191bmRlZmluZWQpCi0JCQkgICAgewotCQkJICAgICAgLyoKLQkJCSAgICAgICAqIFdlIGhhdmUgYSBTRUdfVU5LTk9XTiBzeW1ib2wuIEl0IG1pZ2h0Ci0JCQkgICAgICAgKiB0dXJuIG91dCB0byBiZSBpbiB0aGUgc2FtZSBzZWdtZW50IGFzCi0JCQkgICAgICAgKiB0aGUgaW5zdHJ1Y3Rpb24sIHBlcm1pdHRpbmcgcmVsYXhhdGlvbi4KLQkJCSAgICAgICAqLwotCQkJICAgICAgcCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwgNSwgMiwKLQkJCSAgICAgICBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9VTkRGKSwKLQkJCQkJICAgIHRoaXNfYWRkX3N5bWJvbCwgdGhpc19hZGRfbnVtYmVyLAotCQkJCQkgICAgMCk7Ci0JCQkgICAgICBwWzBdID0gYXQgPDwgNDsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAobGVuZ3RoID09IDApCi0JCQkJewotCQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpOwotCQkJCSAgbGVuZ3RoID0gNDsJLyogTG9uZ2VzdCBwb3NzaWJsZS4gKi8KLQkJCQl9Ci0JCQkgICAgICBwID0gZnJhZ19tb3JlIChsZW5ndGggKyAxKTsKLQkJCSAgICAgIHBbMF0gPSAweEYgfCAoKGF0ICsgIj9cMTJcMTQ/XDE2IltsZW5ndGhdKSA8PCA0KTsKLQkJCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgbGVuZ3RoKTsKLQkJCSAgICAgIGZpeF9uZXcgKGZyYWdfbm93LAotCQkJCSAgICAgICBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCSAgICAgICBsZW5ndGgsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICAgICAgdGhpc19hZGRfbnVtYmVyLCAxLCBOT19SRUxPQyk7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyoge0B9e3FefWZvbyhSbikgb3IgU14jIG9yIEleIyBvciAjICovCi0JCSAgaWYgKG9wZXJhbmRQLT52b3BfbW9kZSA8IDB4QSkKLQkJICAgIHsKLQkJICAgICAgLyogIyBvciBTXiMgb3IgSV4jICovCi0JCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX2FjY2VzcyA9PSAndicKLQkJCSAgfHwgb3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ2EnKQotCQkJewotCQkJICBpZiAob3BlcmFuZFAtPnZvcF9hY2Nlc3MgPT0gJ3YnKQotCQkJICAgIGFzX3dhcm4gKF8oIkludmFsaWQgb3BlcmFuZDogIGltbWVkaWF0ZSB2YWx1ZSB1c2VkIGFzIGJhc2UgYWRkcmVzcy4iKSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBhc193YXJuIChfKCJJbnZhbGlkIG9wZXJhbmQ6ICBpbW1lZGlhdGUgdmFsdWUgdXNlZCBhcyBhZGRyZXNzLiIpKTsKLQkJCSAgLyogZ2NjIDIuNi4zIGlzIGtub3duIHRvIGdlbmVyYXRlIHRoZXNlIGluIGF0IGxlYXN0Ci0JCQkgICAgIG9uZSBjYXNlLiAgKi8KLQkJCX0KLQkJICAgICAgaWYgKGxlbmd0aCA9PSAwCi0JCQkgICYmIHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUgJiYgKGV4cFAtPlhfb3AgIT0gT19iaWcpCi0JCQkgICYmIG9wZXJhbmRQLT52b3BfbW9kZSA9PSA4CS8qIE5vICdAJy4gKi8KLQkJCSAgJiYgdGhpc19hZGRfbnVtYmVyIDwgNjQpCi0JCQl7Ci0JCQkgIG9wZXJhbmRQLT52b3Bfc2hvcnQgPSAncyc7Ci0JCQl9Ci0JCSAgICAgIGlmIChvcGVyYW5kUC0+dm9wX3Nob3J0ID09ICdzJykKLQkJCXsKLQkJCSAgRlJBR19BUFBFTkRfMV9DSEFSICh0aGlzX2FkZF9udW1iZXIpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIC8qIEleIy4uLiAqLwotCQkJICBrbm93IChuYnl0ZXMpOwotCQkJICBwID0gZnJhZ19tb3JlIChuYnl0ZXMgKyAxKTsKLQkJCSAga25vdyAob3BlcmFuZFAtPnZvcF9yZWcgPT0gMHhGKTsKLQkJCSAgcFswXSA9IChvcGVyYW5kUC0+dm9wX21vZGUgPDwgNCkgfCAweEY7Ci0JCQkgIGlmICgodG9fc2VnID09IFNFR19BQlNPTFVURSkgJiYgKGV4cFAtPlhfb3AgIT0gT19iaWcpKQotCQkJICAgIHsKLQkJCSAgICAgIC8qCi0JCQkgICAgICAgKiBJZiBuYnl0ZXMgPiA0LCB0aGVuIHdlIGFyZSBzY3JvZC4gV2UKLQkJCSAgICAgICAqIGRvbid0IGtub3cgaWYgdGhlIGhpZ2ggb3JkZXIgYnl0ZXMKLQkJCSAgICAgICAqIGFyZSB0byBiZSAweEZGIG9yIDB4MDAuICBCU0Q0LjIgJiBSTVMKLQkJCSAgICAgICAqIHNheSB1c2UgMHgwMC4gT0sgLS0tIGJ1dCB0aGlzCi0JCQkgICAgICAgKiBhc3NlbWJsZXIgbmVlZHMgQU5PVEhFUiByZXdyaXRlIHRvCi0JCQkgICAgICAgKiBjb3BlIHByb3Blcmx5IHdpdGggdGhpcyBidWcuICovCi0JCQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyAxLCB0aGlzX2FkZF9udW1iZXIsIG1pbiAoNCwgbmJ5dGVzKSk7Ci0JCQkgICAgICBpZiAobmJ5dGVzID4gNCkKLQkJCQl7Ci0JCQkJICBtZW1zZXQgKHAgKyA1LCAnXDAnLCBuYnl0ZXMgLSA0KTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgaWYgKGV4cFAtPlhfb3AgPT0gT19iaWcpCi0JCQkJewotCQkJCSAgLyoKLQkJCQkgICAqIFByb2JsZW0gaGVyZSBpcyB0byBnZXQgdGhlIGJ5dGVzCi0JCQkJICAgKiBpbiB0aGUgcmlnaHQgb3JkZXIuICBXZSBzdG9yZWQKLQkJCQkgICAqIG91ciBjb25zdGFudCBhcyBMSVRUTEVOVU1zLCBub3QKLQkJCQkgICAqIGJ5dGVzLiAqLwotCQkJCSAgTElUVExFTlVNX1RZUEUgKmxQOwotCi0JCQkJICBsUCA9IGZsb2F0UC0+bG93OwotCQkJCSAgaWYgKG5ieXRlcyAmIDEpCi0JCQkJICAgIHsKLQkJCQkgICAgICBrbm93IChuYnl0ZXMgPT0gMSk7Ci0JCQkJICAgICAgcFsxXSA9ICpsUDsKLQkJCQkgICAgfQotCQkJCSAgZWxzZQotCQkJCSAgICB7Ci0JCQkJICAgICAgZm9yIChwKys7IG5ieXRlczsgbmJ5dGVzIC09IDIsIHAgKz0gMiwgbFArKykKLQkJCQkJewotCQkJCQkgIG1kX251bWJlcl90b19jaGFycyAocCwgKmxQLCAyKTsKLQkJCQkJfQotCQkJCSAgICB9Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIGZpeF9uZXcgKGZyYWdfbm93LCBwICsgMSAtIGZyYWdfbm93LT5mcl9saXRlcmFsLAotCQkJCQkgICBuYnl0ZXMsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkJICAgdGhpc19hZGRfbnVtYmVyLCAwLCBOT19SRUxPQyk7Ci0JCQkJfQotCQkJICAgIH0KLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7CQkvKiB7QH17cV59Zm9vKFJuKSAqLwotCQkgICAgICBrbm93ICgobGVuZ3RoID09IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCA9PSAnICcpCi0JCQkgICAgfHwgKGxlbmd0aCA+IDAgJiYgb3BlcmFuZFAtPnZvcF9zaG9ydCAhPSAnICcpKTsKLQkJICAgICAgaWYgKGxlbmd0aCA9PSAwKQotCQkJewotCQkJICBpZiAodG9fc2VnID09IFNFR19BQlNPTFVURSkKLQkJCSAgICB7Ci0JCQkgICAgICBsb25nIHRlc3Q7Ci0KLQkJCSAgICAgIHRlc3QgPSB0aGlzX2FkZF9udW1iZXI7Ci0KLQkJCSAgICAgIGlmICh0ZXN0IDwgMCkKLQkJCQl0ZXN0ID0gfnRlc3Q7Ci0KLQkJCSAgICAgIGxlbmd0aCA9IHRlc3QgJiAweGZmZmY4MDAwID8gNAotCQkJCTogdGVzdCAmIDB4ZmZmZmZmODAgPyAyCi0JCQkJOiAxOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgIGxlbmd0aCA9IDQ7Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBwID0gZnJhZ19tb3JlICgxICsgbGVuZ3RoKTsKLQkJICAgICAga25vdyAob3BlcmFuZFAtPnZvcF9yZWcgPj0gMCk7Ci0JCSAgICAgIHBbMF0gPSBvcGVyYW5kUC0+dm9wX3JlZwotCQkJfCAoKGF0IHwgIj9cMTJcMTQ/XDE2IltsZW5ndGhdKSA8PCA0KTsKLQkJICAgICAgaWYgKHRvX3NlZyA9PSBTRUdfQUJTT0xVVEUpCi0JCQl7Ci0JCQkgIG1kX251bWJlcl90b19jaGFycyAocCArIDEsIHRoaXNfYWRkX251bWJlciwgbGVuZ3RoKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBmaXhfbmV3IChmcmFnX25vdywgcCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJCQkgICBsZW5ndGgsIHRoaXNfYWRkX3N5bWJvbCwKLQkJCQkgICB0aGlzX2FkZF9udW1iZXIsIDAsIE5PX1JFTE9DKTsKLQkJCX0KLQkJICAgIH0KLQkJfQotCSAgICB9CQkJLyogaWYoc2luZ2xlLWJ5dGUtb3BlcmFuZCkgKi8KLQl9Ci0gICAgfQkJCQkvKiBmb3Iob3BlcmFuZFApICovCi19CQkJCS8qIHZheF9hc3NlbWJsZSgpICovCi0MCi0vKgotICoJCQltZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpCi0gKgotICogQ2FsbGVkIGp1c3QgYmVmb3JlIHJlbGF4KCkuCi0gKiBBbnkgc3ltYm9sIHRoYXQgaXMgbm93IHVuZGVmaW5lZCB3aWxsIG5vdCBiZWNvbWUgZGVmaW5lZC4KLSAqIFJldHVybiB0aGUgY29ycmVjdCBmcl9zdWJ0eXBlIGluIHRoZSBmcmFnLgotICogUmV0dXJuIHRoZSBpbml0aWFsICJndWVzcyBmb3IgZnJfdmFyIiB0byBjYWxsZXIuCi0gKiBUaGUgZ3Vlc3MgZm9yIGZyX3ZhciBpcyBBQ1RVQUxMWSB0aGUgZ3Jvd3RoIGJleW9uZCBmcl9maXguCi0gKiBXaGF0ZXZlciB3ZSBkbyB0byBncm93IGZyX2ZpeCBvciBmcl92YXIgY29udHJpYnV0ZXMgdG8gb3VyIHJldHVybmVkIHZhbHVlLgotICogQWx0aG91Z2ggaXQgbWF5IG5vdCBiZSBleHBsaWNpdCBpbiB0aGUgZnJhZywgcHJldGVuZCBmcl92YXIgc3RhcnRzIHdpdGggYQotICogMCB2YWx1ZS4KLSAqLwotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnQpCi0gICAgIGZyYWdTICpmcmFnUDsKLSAgICAgc2VnVCBzZWdtZW50OwotewotICBjaGFyICpwOwotICBpbnQgb2xkX2ZyX2ZpeDsKLQotICBvbGRfZnJfZml4ID0gZnJhZ1AtPmZyX2ZpeDsKLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsJCQkvKiBBIHJlbGF4YWJsZSBjYXNlLiAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX1BDX1JFTEFUSVZFLCBTVEFURV9CWVRFKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcCA9IGZyYWdQLT5mcl9saXRlcmFsICsgb2xkX2ZyX2ZpeDsKLQkgIHBbMF0gfD0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIFByZXNlcnZlIEAgYml0LiAqLwotCSAgZnJhZ1AtPmZyX2ZpeCArPSAxICsgNDsKLQkgIGZpeF9uZXcgKGZyYWdQLCBvbGRfZnJfZml4ICsgMSwgNCwgZnJhZ1AtPmZyX3N5bWJvbCwKLQkJICAgZnJhZ1AtPmZyX29mZnNldCwgMSwgTk9fUkVMT0MpOwotCSAgZnJhZ193YW5lIChmcmFnUCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09ORElUSU9OQUxfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgXj0gMTsJLyogUmV2ZXJzZSBzZW5zZSBvZiBicmFuY2guICovCi0JICBwWzBdID0gNjsKLQkgIHBbMV0gPSBWQVhfSk1QOwotCSAgcFsyXSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwkvKiAuLi4oUEMpICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDEgKyAxICsgMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDMsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfQlJBTkNILCBTVEFURV9VTkRGKToKLSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChmcmFnUC0+ZnJfc3ltYm9sKSA9PSBzZWdtZW50KQotCXsKLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0JSQU5DSCwgU1RBVEVfV09SRCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHAgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIG9sZF9mcl9maXg7Ci0JICBwWzBdID0gMjsKLQkgIHBbMV0gPSAwOwotCSAgcFsyXSA9IFZBWF9CUkI7Ci0JICBwWzNdID0gNjsKLQkgIHBbNF0gPSBWQVhfSk1QOwotCSAgcFs1XSA9IFZBWF9QQ19SRUxBVElWRV9NT0RFOwkvKiAuLi4ocGMpICovCi0JICBmcmFnUC0+ZnJfZml4ICs9IDIgKyAyICsgMSArIDEgKyA0OwotCSAgZml4X25ldyAoZnJhZ1AsIG9sZF9mcl9maXggKyA2LCA0LCBmcmFnUC0+ZnJfc3ltYm9sLAotCQkgICBmcmFnUC0+ZnJfb2Zmc2V0LCAxLCBOT19SRUxPQyk7Ci0JICBmcmFnX3dhbmUgKGZyYWdQKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfVU5ERik6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZnJhZ1AtPmZyX3N5bWJvbCkgPT0gc2VnbWVudCkKLQl7Ci0JICBmcmFnUC0+ZnJfc3VidHlwZSA9IEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgcFswXSA9IDI7Ci0JICBwWzFdID0gVkFYX0JSQjsKLQkgIHBbMl0gPSA2OwotCSAgcFszXSA9IFZBWF9KTVA7Ci0JICBwWzRdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihwYykgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDIgKyAxICsgMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDUsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX1VOREYpOgotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnQpCi0JewotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0JZVEUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyBvbGRfZnJfZml4OwotCSAgKmZyYWdQLT5mcl9vcGNvZGUgKz0gVkFYX1dJREVOX0xPTkc7Ci0JICBwWzBdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7CS8qIC4uLihQQykgKi8KLQkgIGZyYWdQLT5mcl9maXggKz0gMSArIDQ7Ci0JICBmaXhfbmV3IChmcmFnUCwgb2xkX2ZyX2ZpeCArIDEsIDQsIGZyYWdQLT5mcl9zeW1ib2wsCi0JCSAgIGZyYWdQLT5mcl9vZmZzZXQsIDEsIE5PX1JFTE9DKTsKLQkgIGZyYWdfd2FuZSAoZnJhZ1ApOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIChmcmFnUC0+ZnJfdmFyICsgZnJhZ1AtPmZyX2ZpeCAtIG9sZF9mcl9maXgpOwotfQkJCQkvKiBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpICovCi0MCi0vKgotICoJCQltZF9jb252ZXJ0X2ZyYWcoKTsKLSAqCi0gKiBDYWxsZWQgYWZ0ZXIgcmVsYXgoKSBpcyBmaW5pc2hlZC4KLSAqIEluOglBZGRyZXNzIG9mIGZyYWcuCi0gKglmcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50LgotICoJZnJfc3VidHlwZSBpcyB3aGF0IHRoZSBhZGRyZXNzIHJlbGF4ZWQgdG8uCi0gKgotICogT3V0OglBbnkgZml4U3MgYW5kIGNvbnN0YW50cyBhcmUgc2V0IHVwLgotICoJQ2FsbGVyIHdpbGwgdHVybiBmcmFnIGludG8gYSAiLnNwYWNlIDAiLgotICovCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBjaGFyICphZGRyZXNzUDsJCS8qIC0+IF92YXIgdG8gY2hhbmdlLiAqLwotICBjaGFyICpvcGNvZGVQOwkJLyogLT4gb3Bjb2RlIGNoYXIocykgdG8gY2hhbmdlLiAqLwotICBzaG9ydCBpbnQgbGVuZ3RoX2NvZGU7CS8qIDI9bG9uZyAxPXdvcmQgMD1ieXRlICovCi0gIHNob3J0IGludCBleHRlbnNpb24gPSAwOwkvKiBTaXplIG9mIHJlbGF4ZWQgYWRkcmVzcy4gKi8KLSAgLyogQWRkZWQgdG8gZnJfZml4OiBpbmNsLiBBTEwgdmFyIGNoYXJzLiAqLwotICBzeW1ib2xTICpzeW1ib2xQOwotICBsb25nIHdoZXJlOwotICBsb25nIGFkZHJlc3Nfb2ZfdmFyOwotICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgaXMgX3ZhciBvZiAqZnJhZ1A/ICovCi0gIGxvbmcgdGFyZ2V0X2FkZHJlc3MgPSAwOwotICAvKiBXaGVyZSwgaW4gZmlsZSBzcGFjZSwgZG9lcyBhZGRyIHBvaW50PyAqLwotCi0gIGtub3cgKGZyYWdQLT5mcl90eXBlID09IHJzX21hY2hpbmVfZGVwZW5kZW50KTsKLSAgbGVuZ3RoX2NvZGUgPSBmcmFnUC0+ZnJfc3VidHlwZSAmIDM7CS8qIGRlcGVuZHMgb24gRU5DT0RFX1JFTEFYKCkgKi8KLSAga25vdyAobGVuZ3RoX2NvZGUgPj0gMCAmJiBsZW5ndGhfY29kZSA8IDMpOwotICB3aGVyZSA9IGZyYWdQLT5mcl9maXg7Ci0gIGFkZHJlc3NQID0gZnJhZ1AtPmZyX2xpdGVyYWwgKyB3aGVyZTsKLSAgb3Bjb2RlUCA9IGZyYWdQLT5mcl9vcGNvZGU7Ci0gIHN5bWJvbFAgPSBmcmFnUC0+ZnJfc3ltYm9sOwotICBrbm93IChzeW1ib2xQKTsKLSAgdGFyZ2V0X2FkZHJlc3MgPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCkgKyBmcmFnUC0+ZnJfb2Zmc2V0OwotICBhZGRyZXNzX29mX3ZhciA9IGZyYWdQLT5mcl9hZGRyZXNzICsgd2hlcmU7Ci0KLSAgc3dpdGNoIChmcmFnUC0+ZnJfc3VidHlwZSkKLSAgICB7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0JZVEUpOgotICAgICAga25vdyAoKmFkZHJlc3NQID09IDAgfHwgKmFkZHJlc3NQID09IDB4MTApOwkvKiAnQCcgYml0LiAqLwotICAgICAgYWRkcmVzc1BbMF0gfD0gMHhBRjsJLyogQnl0ZSBkaXNwbGFjZW1lbnQuICovCi0gICAgICBhZGRyZXNzUFsxXSA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX1dPUkQpOgotICAgICAga25vdyAoKmFkZHJlc3NQID09IDAgfHwgKmFkZHJlc3NQID09IDB4MTApOwkvKiAnQCcgYml0LiAqLwotICAgICAgYWRkcmVzc1BbMF0gfD0gMHhDRjsJLyogV29yZCBkaXNwbGFjZW1lbnQuICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQICsgMSwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAzKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfUENfUkVMQVRJVkUsIFNUQVRFX0xPTkcpOgotICAgICAga25vdyAoKmFkZHJlc3NQID09IDAgfHwgKmFkZHJlc3NQID09IDB4MTApOwkvKiAnQCcgYml0LiAqLwotICAgICAgYWRkcmVzc1BbMF0gfD0gMHhFRjsJLyogTG9uZyB3b3JkIGRpc3BsYWNlbWVudC4gKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAxLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDUpLCA0KTsKLSAgICAgIGV4dGVuc2lvbiA9IDU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0JZVEUpOgotICAgICAgYWRkcmVzc1BbMF0gPSB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDEpOwotICAgICAgZXh0ZW5zaW9uID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTkRJVElPTkFMX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBvcGNvZGVQWzBdIF49IDE7CQkvKiBSZXZlcnNlIHNlbnNlIG9mIHRlc3QuICovCi0gICAgICBhZGRyZXNzUFswXSA9IDM7Ci0gICAgICBhZGRyZXNzUFsxXSA9IFZBWF9CUkIgKyBWQVhfV0lERU5fV09SRDsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAyLCB0YXJnZXRfYWRkcmVzcyAtIChhZGRyZXNzX29mX3ZhciArIDQpLCAyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT05ESVRJT05BTF9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgb3Bjb2RlUFswXSBePSAxOwkJLyogUmV2ZXJzZSBzZW5zZSBvZiB0ZXN0LiAqLwotICAgICAgYWRkcmVzc1BbMF0gPSA2OwotICAgICAgYWRkcmVzc1BbMV0gPSBWQVhfSk1QOwotICAgICAgYWRkcmVzc1BbMl0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyAzLCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSA3OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfQllURSk6Ci0gICAgICBhZGRyZXNzUFswXSA9IHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMSk7Ci0gICAgICBleHRlbnNpb24gPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQUxXQVlTX0JSQU5DSCwgU1RBVEVfV09SRCk6Ci0gICAgICBvcGNvZGVQWzBdICs9IFZBWF9XSURFTl9XT1JEOwkvKiBicmIgLT4gYnJ3LCBic2JiIC0+IGJzYncgKi8KLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AsIHRhcmdldF9hZGRyZXNzIC0gKGFkZHJlc3Nfb2ZfdmFyICsgMiksIDIpOwotICAgICAgZXh0ZW5zaW9uID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0FMV0FZU19CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgb3Bjb2RlUFswXSArPSBWQVhfV0lERU5fTE9ORzsJLyogYnJiIC0+IGptcCwgYnNiYiAtPiBqc2IgKi8KLSAgICAgIGFkZHJlc3NQWzBdID0gVkFYX1BDX1JFTEFUSVZFX01PREU7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQICsgMSwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA1KSwgNCk7Ci0gICAgICBleHRlbnNpb24gPSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIFNUQVRFX1dPUkQpOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChhZGRyZXNzUCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAyKSwgMik7Ci0gICAgICBleHRlbnNpb24gPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9CUkFOQ0gsIFNUQVRFX0xPTkcpOgotICAgICAgYWRkcmVzc1BbMF0gPSAyOwotICAgICAgYWRkcmVzc1BbMV0gPSAwOwotICAgICAgYWRkcmVzc1BbMl0gPSBWQVhfQlJCOwotICAgICAgYWRkcmVzc1BbM10gPSA2OwotICAgICAgYWRkcmVzc1BbNF0gPSBWQVhfSk1QOwotICAgICAgYWRkcmVzc1BbNV0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyA2LCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSAxMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBFTkNPREVfUkVMQVggKFNUQVRFX0NPTVBMRVhfSE9QLCBTVEFURV9CWVRFKToKLSAgICAgIGFkZHJlc3NQWzBdID0gdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyAxKTsKLSAgICAgIGV4dGVuc2lvbiA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRU5DT0RFX1JFTEFYIChTVEFURV9DT01QTEVYX0hPUCwgU1RBVEVfV09SRCk6Ci0gICAgICBhZGRyZXNzUFswXSA9IDI7Ci0gICAgICBhZGRyZXNzUFsxXSA9IFZBWF9CUkI7Ci0gICAgICBhZGRyZXNzUFsyXSA9IDM7Ci0gICAgICBhZGRyZXNzUFszXSA9IFZBWF9CUlc7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGFkZHJlc3NQICsgNCwgdGFyZ2V0X2FkZHJlc3MgLSAoYWRkcmVzc19vZl92YXIgKyA2KSwgMik7Ci0gICAgICBleHRlbnNpb24gPSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEVOQ09ERV9SRUxBWCAoU1RBVEVfQ09NUExFWF9IT1AsIFNUQVRFX0xPTkcpOgotICAgICAgYWRkcmVzc1BbMF0gPSAyOwotICAgICAgYWRkcmVzc1BbMV0gPSBWQVhfQlJCOwotICAgICAgYWRkcmVzc1BbMl0gPSA2OwotICAgICAgYWRkcmVzc1BbM10gPSBWQVhfSk1QOwotICAgICAgYWRkcmVzc1BbNF0gPSBWQVhfUENfUkVMQVRJVkVfTU9ERTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAoYWRkcmVzc1AgKyA1LCB0YXJnZXRfYWRkcmVzcywgNCk7Ci0gICAgICBleHRlbnNpb24gPSA5OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgQkFEX0NBU0UgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgZnJhZ1AtPmZyX2ZpeCArPSBleHRlbnNpb247Ci19CQkJCS8qIG1kX2NvbnZlcnRfZnJhZygpICovCi0KLS8qIFRyYW5zbGF0ZSBpbnRlcm5hbCBmb3JtYXQgb2YgcmVsb2NhdGlvbiBpbmZvIGludG8gdGFyZ2V0IGZvcm1hdC4KLQotICAgT24gdmF4OiBmaXJzdCA0IGJ5dGVzIGFyZSBub3JtYWwgdW5zaWduZWQgbG9uZywgbmV4dCB0aHJlZSBieXRlcwotICAgYXJlIHN5bWJvbG51bSwgbGVhc3Qgc2lnLiBieXRlIGZpcnN0LiAgTGFzdCBieXRlIGlzIGJyb2tlbiB1cCB3aXRoCi0gICB0aGUgdXBwZXIgbmliYmxlIGFzIG51dGhpbiwgYml0IDMgYXMgZXh0ZXJuLCBiaXRzIDIgJiAxIGFzIGxlbmd0aCwgYW5kCi0gICBiaXQgMCBhcyBwY3JlbC4gKi8KLSNpZmRlZiBjb21tZW50Ci12b2lkCi1tZF9yaV90b19jaGFycyAodGhlX2J5dGVzLCByaSkKLSAgICAgY2hhciAqdGhlX2J5dGVzOwotICAgICBzdHJ1Y3QgcmVsb2NfaW5mb19nZW5lcmljIHJpOwotewotICAvKiB0aGlzIGlzIGVhc3kgKi8KLSAgbWRfbnVtYmVyX3RvX2NoYXJzICh0aGVfYnl0ZXMsIHJpLnJfYWRkcmVzcywgc2l6ZW9mIChyaS5yX2FkZHJlc3MpKTsKLSAgLyogbm93IHRoZSBmdW4gc3R1ZmYgKi8KLSAgdGhlX2J5dGVzWzZdID0gKHJpLnJfc3ltYm9sbnVtID4+IDE2KSAmIDB4MGZmOwotICB0aGVfYnl0ZXNbNV0gPSAocmkucl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgdGhlX2J5dGVzWzRdID0gcmkucl9zeW1ib2xudW0gJiAweDBmZjsKLSAgdGhlX2J5dGVzWzddID0gKCgocmkucl9leHRlcm4gPDwgMykgJiAweDA4KSB8ICgocmkucl9sZW5ndGggPDwgMSkgJiAweDA2KSB8Ci0JCSAgKChyaS5yX3BjcmVsIDw8IDApICYgMHgwMSkpICYgMHgwRjsKLX0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotdm9pZCAKLXRjX2FvdXRfZml4X3RvX2NoYXJzICh3aGVyZSwgZml4UCwgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBmaXhTICpmaXhQOwotICAgICByZWxheF9hZGRyZXNzVCBzZWdtZW50X2FkZHJlc3NfaW5fZmlsZTsKLXsKLSAgLyoKLSAgICogSW46IGxlbmd0aCBvZiByZWxvY2F0aW9uIChvciBvZiBhZGRyZXNzKSBpbiBjaGFyczogMSwgMiBvciA0LgotICAgKiBPdXQ6IEdOVSBMRCByZWxvY2F0aW9uIGxlbmd0aCBjb2RlOiAwLCAxLCBvciAyLgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBuYnl0ZXNfcl9sZW5ndGhbXSA9IHs0MiwgMCwgMSwgNDIsIDJ9OwotICBsb25nIHJfc3ltYm9sbnVtOwotCi0gIGtub3cgKGZpeFAtPmZ4X2FkZHN5ICE9IE5VTEwpOwotCi0gIG1kX251bWJlcl90b19jaGFycyAod2hlcmUsCi0gICAgICAgZml4UC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcyArIGZpeFAtPmZ4X3doZXJlIC0gc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUsCi0JCSAgICAgIDQpOwotCi0gIHJfc3ltYm9sbnVtID0gKFNfSVNfREVGSU5FRCAoZml4UC0+ZnhfYWRkc3kpCi0JCSA/IFNfR0VUX1RZUEUgKGZpeFAtPmZ4X2FkZHN5KQotCQkgOiBmaXhQLT5meF9hZGRzeS0+c3lfbnVtYmVyKTsKLQotICB3aGVyZVs2XSA9IChyX3N5bWJvbG51bSA+PiAxNikgJiAweDBmZjsKLSAgd2hlcmVbNV0gPSAocl9zeW1ib2xudW0gPj4gOCkgJiAweDBmZjsKLSAgd2hlcmVbNF0gPSByX3N5bWJvbG51bSAmIDB4MGZmOwotICB3aGVyZVs3XSA9ICgoKCghU19JU19ERUZJTkVEIChmaXhQLT5meF9hZGRzeSkpIDw8IDMpICYgMHgwOCkKLQkgICAgICB8ICgobmJ5dGVzX3JfbGVuZ3RoW2ZpeFAtPmZ4X3NpemVdIDw8IDEpICYgMHgwNikKLQkgICAgICB8ICgoKGZpeFAtPmZ4X3BjcmVsIDw8IDApICYgMHgwMSkgJiAweDBmKSk7Ci19Ci0KLS8qCi0gKiAgICAgICBCVUdTLCBHUklQRVMsICBBUE9MT0dJQSwgZXRjLgotICoKLSAqIFRoZSBvcGNvZGUgdGFibGUgJ3ZvdHN0cnMnIG5lZWRzIHRvIGJlIHNvcnRlZCBvbiBvcGNvZGUgZnJlcXVlbmN5LgotICogVGhhdCBpcywgQUZURVIgd2UgaGFzaCBpdCB3aXRoIGhhc2hfLi4uKCksIHdlIHdhbnQgbW9zdC11c2VkIG9wY29kZXMKLSAqIHRvIGNvbWUgb3V0IG9mIHRoZSBoYXNoIHRhYmxlIGZhc3Rlci4KLSAqCi0gKiBJIGFtIHNvcnJ5IHRvIGluZmxpY3QgeWV0IGFub3RoZXIgVkFYIGFzc2VtYmxlciBvbiB0aGUgd29ybGQsIGJ1dAotICogUk1TIHNheXMgd2UgbXVzdCBkbyBldmVyeXRoaW5nIGZyb20gc2NyYXRjaCwgdG8gcHJldmVudCBwaW4taGVhZHMKLSAqIHJlc3RyaWN0aW5nIHRoaXMgc29mdHdhcmUuCi0gKi8KLQotLyoKLSAqIFRoaXMgaXMgYSB2YWd1ZWx5IG1vZHVsYXIgc2V0IG9mIHJvdXRpbmVzIGluIEMgdG8gcGFyc2UgVkFYCi0gKiBhc3NlbWJseSBjb2RlIHVzaW5nIERFQyBtbmVtb25pY3MuIEl0IGlzIE5PVCB1bip4IHNwZWNpZmljLgotICoKLSAqIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCB0aGUgYXNzZW1ibGVyIGhhcyB0YWtlbiBjYXJlIG9mIGFsbDoKLSAqICAgbGFiZWxzCi0gKiAgIG1hY3JvcwotICogICBsaXN0aW5nCi0gKiAgIHBzZXVkby1vcHMKLSAqICAgbGluZSBjb250aW51YXRpb24KLSAqICAgY29tbWVudHMKLSAqICAgY29uZGVuc2luZyBhbnkgd2hpdGVzcGFjZSBkb3duIHRvIGV4YWN0bHkgb25lIHNwYWNlCi0gKiBhbmQgYWxsIHdlIGhhdmUgdG8gZG8gaXMgcGFyc2UgMSBsaW5lIGludG8gYSB2YXggaW5zdHJ1Y3Rpb24KLSAqIHBhcnRpYWxseSBmb3JtZWQuIFdlIHdpbGwgYWNjZXB0IGEgbGluZSwgYW5kIGRlbGl2ZXI6Ci0gKiAgIGFuIGVycm9yIG1lc3NhZ2UgKGhvcGVmdWxseSBlbXB0eSkKLSAqICAgYSBza2VsZXRvbiBWQVggaW5zdHJ1Y3Rpb24gKHRyZWUgc3RydWN0dXJlKQotICogICB0ZXh0dWFsIHBvaW50ZXJzIHRvIGFsbCB0aGUgb3BlcmFuZCBleHByZXNzaW9ucwotICogICBhIHdhcm5pbmcgbWVzc2FnZSB0aGF0IG5vdGVzIGEgc2lsbHkgb3BlcmFuZCAoaG9wZWZ1bGx5IGVtcHR5KQotICovCi0MCi0vKgotICoJCUUgRCBJIFQgICBIIEkgUyBUIE8gUiBZCi0gKgotICogMTdtYXk4NiBEZWFuIEVsc25lci4gQnVnIGlmIGxpbmUgZW5kcyBpbW1lZGlhdGVseSBhZnRlciBvcGNvZGUuCi0gKiAzMGFwcjg2IERlYW4gRWxzbmVyLiBOZXcgdmlwX29wKCkgdXNlcyBhcmcgYmxvY2sgc28gY2hhbmdlIGNhbGwuCi0gKiAgNmphbjg2IERlYW4gRWxzbmVyLiBDcm9jayB2aXBfYmVnaW4oKSB0byBjYWxsIHZpcF9vcF9kZWZhdWx0cygpLgotICogIDJqYW44NiBEZWFuIEVsc25lci4gSW52ZW50IHN5bnRoZXRpYyBvcGNvZGVzLgotICoJV2lkZW4gdmF4X29wY29kZVQgdG8gMzIgYml0cy4gVXNlIGEgYml0IGZvciBWSVRfT1BDT0RFX1NZTlRIRVRJQywKLSAqCXdoaWNoIG1lYW5zIHRoaXMgaXMgbm90IGEgcmVhbCBvcGNvZGUsIGl0IGlzIGxpa2UgYSBtYWNybzsgaXQgd2lsbAotICoJYmUgcmVsYXgoKWVkIGludG8gMSBvciBtb3JlIGluc3RydWN0aW9ucy4KLSAqCVVzZSBhbm90aGVyIGJpdCBmb3IgVklUX09QQ09ERV9TUEVDSUFMIGlmIHRoZSBvcC1jb2RlIGlzIG5vdCBvcHRpbWlzZWQKLSAqCWxpa2UgYSByZWd1bGFyIGJyYW5jaCBpbnN0cnVjdGlvbi4gT3B0aW9uIGFkZGVkIHRvIHZpcF9iZWdpbigpOgotICoJZXhjbHVkZQlzeW50aGV0aWMgb3Bjb2Rlcy4gSW52ZW50IHN5bnRoZXRpY192b3RzdHJzW10uCi0gKiAzMWRlYzg1IERlYW4gRWxzbmVyLiBJbnZlbnQgdml0X29wY29kZV9uYnl0ZXMuCi0gKglBbHNvIG1ha2Ugdml0X29wY29kZSBpbnRvIGEgY2hhcltdLiBXZSBub3cgaGF2ZSBuLWJ5dGUgdmF4IG9wY29kZXMsCi0gKglzbyBjYWxsZXIncyBkb24ndCBoYXZlIHRvIGtub3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIDEtYnl0ZSAmIGEKLSAqCTItYnl0ZSBvcC1jb2RlLiBTdGlsbCBuZWVkIHZheF9vcGNvZGVUIGNvbmNlcHQsIHNvIHdlIGtub3cgaG93Ci0gKgliaWcgYW4gb2JqZWN0IG11c3QgYmUgdG8gaG9sZCBhbiBvcC5jb2RlLgotICogMzBkZWM4NSBEZWFuIEVsc25lci4gV2lkZW4gdHlwZWRlZiB2YXhfb3Bjb2RlVCBpbiAidmF4LWluc3QuaCIKLSAqCWJlY2F1c2UgdmF4IG9wY29kZXMgbWF5IGJlIDE2IGJpdHMuIE91ciBjcnVmdHkgQyBjb21waWxlciB3YXMKLSAqCWhhcHBpbHkgaW5pdGlhbGlzaW5nIDgtYml0IHZvdF9jb2RlcyB3aXRoIDE2LWJpdCBudW1iZXJzIQotICoJKFdvdWxkbid0IHRoZSAncGhvbmUgY29tcGFueSBsaWtlIHRvIGNvbXByZXNzIGRhdGEgc28gZWFzaWx5ISkKLSAqIDI5ZGVjODUgRGVhbiBFbHNuZXIuIE5ldyBzdGF0aWMgdGFibGUgdmF4X29wZXJhbmRfd2lkdGhfc2l6ZVtdLgotICoJSW52ZW50ZWQgc28gd2Uga25vdyBodyBtYW55IGJ5dGVzIGEgIkleIzQyIiBuZWVkcyBpbiBpdHMgaW1tZWRpYXRlCi0gKglvcGVyYW5kLiBSZXZpc2VkIHN0cnVjdCB2b3AgaW4gInZheC1pbnN0LmgiOiBleHBsaWNpdGx5IGluY2x1ZGUKLSAqCWJ5dGUgbGVuZ3RoIG9mIGVhY2ggb3BlcmFuZCwgYW5kIGl0J3MgbGV0dGVyLWNvZGUgZGF0dW0gdHlwZS4KLSAqIDE3bm92ODUgRGVhbiBFbHNuZXIuIE5hbWUgQ2hhbmdlLgotICoJRHVlIHRvIGFyKDEpIHRydW5jYXRpbmcgbmFtZXMsIHdlIGxlYXJuZWQgdGhlIGhhcmQgd2F5IHRoYXQKLSAqCSJ2YXgtaW5zdC1wYXJzZS5jIiAtPiAidmF4LWluc3QtcGFyc2UuIiBkcm9wcGluZyB0aGUgIm8iIG9mZgotICoJdGhlIGFyY2hpdmVkIG9iamVjdCBuYW1lLiBTTy4uLiB3ZSBzaG9ydGVuZWQgdGhlIG5hbWUgb2YgdGhpcwotICoJc291cmNlIGZpbGUsIGFuZCBjaGFuZ2VkIHRoZSBtYWtlZmlsZS4KLSAqLwotCi0vKiBoYW5kbGUgb2YgdGhlIE9QQ09ERSBoYXNoIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3BfaGFzaDsKLQotLyoKLSAqIEluOgkxIGNoYXJhY3RlciwgZnJvbSAiYmRmZ2hsb3FwdyIgYmVpbmcgdGhlIGRhdGEtdHlwZSBvZiBhbiBvcGVyYW5kCi0gKglvZiBhIHZheCBpbnN0cnVjdGlvbi4KLSAqCi0gKiBPdXQ6CXRoZSBsZW5ndGggb2YgYW4gb3BlcmFuZCBvZiB0aGF0IHR5cGUsIGluIGJ5dGVzLgotICoJU3BlY2lhbCBicmFuY2ggb3BlcmFuZHMgdHlwZXMgIi0/ISIgaGF2ZSBsZW5ndGggMC4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgaW50IHZheF9vcGVyYW5kX3dpZHRoX3NpemVbMjU2XSA9Ci17Ci0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAxLCAwLCA4LCAwLCA0LCA4LCAxNiwgMCwgMCwgMCwgNCwgMCwgMCwxNiwJLyogLi5iLmQuZmdoLi4ubC4ubyAqLwotICAwLCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogLnEuLi4uLncuLi4uLi4uLiAqLwotICAwLCAwLCAxLCAwLCA4LCAwLCA0LCA4LCAxNiwgMCwgMCwgMCwgNCwgMCwgMCwxNiwJLyogLi5iLmQuZmdoLi4ubC4ubyAqLwotICAwLCA4LCAwLCAwLCAwLCAwLCAwLCAyLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogLnEuLi4uLncuLi4uLi4uLiAqLwotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi19OwotDAotLyoKLSAqIFRoaXMgcGVydmVyc2lvbiBlbmNvZGVzIGFsbCB0aGUgdmF4IG9wY29kZXMgYXMgYSBidW5jaCBvZiBzdHJpbmdzLgotICogUk1TIHNheXMgd2Ugc2hvdWxkIGJ1aWxkIG91ciBoYXNoLXRhYmxlIGF0IHJ1bi10aW1lLiBIbW0uCi0gKiBQbGVhc2Ugd291bGQgc29tZW9uZSBhcnJhbmdlIHRoZXNlIGluIGRlY3JlYXNpbmcgZnJlcXVlbmN5IG9mIG9wY29kZT8KLSAqIEJlY2F1c2Ugb2YgdGhlIHdheSBoYXNoXy4uLigpIHdvcmtzLCB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQgb3Bjb2RlCi0gKiBzaG91bGQgYmUgdGV4dHVhbGx5IGZpcnN0IGFuZCBzbyBvbi4KLSAqCi0gKiBJbnB1dCBmb3IgdGhpcyB0YWJsZSB3YXMgJ3ZheC5vcGNvZGVzJywgYXdrKDEpZWQgYnkgJ3ZheC5vcGNvZGVzLmMuYXdrJyAuCi0gKiBTbyBjaGFuZ2UgJ3ZheC5vcGNvZGVzJywgdGhlbiByZS1nZW5lcmF0ZSB0aGlzIHRhYmxlLgotICovCi0KLSNpbmNsdWRlICJvcGNvZGUvdmF4LmgiCi0MCi0vKgotICogVGhpcyBpcyBhIHRhYmxlIG9mIG9wdGlvbmFsIG9wLWNvZGVzLiBBbGwgb2YgdGhlbSByZXByZXNlbnQKLSAqICdzeW50aGV0aWMnIGluc3RydWN0aW9ucyB0aGF0IHNlZW0gcG9wdWxhci4KLSAqCi0gKiBIZXJlIHdlIG1ha2Ugc29tZSBwc2V1ZG8gb3AtY29kZXMuIEV2ZXJ5IGNvZGUgaGFzIGEgYml0IHNldCB0byBzYXkKLSAqIGl0IGlzIHN5bnRoZXRpYy4gVGhpcyBsZXRzIHlvdSBjYXRjaCB0aGVtIGlmIHlvdSB3YW50IHRvCi0gKiBiYW4gdGhlc2Ugb3Bjb2Rlcy4gVGhleSBhcmUgbW5lbW9uaWNzIGZvciAiZWxhc3RpYyIgaW5zdHJ1Y3Rpb25zCi0gKiB0aGF0IGFyZSBzdXBwb3NlZCB0byBhc3NlbWJsZSBpbnRvIHRoZSBmZXdlc3QgYnl0ZXMgbmVlZGVkIHRvIGRvIGEKLSAqIGJyYW5jaCwgb3IgdG8gZG8gYSBjb25kaXRpb25hbCBicmFuY2gsIG9yIHdoYXRldmVyLgotICoKLSAqIFRoZSBvcGNvZGUgaXMgaW4gdGhlIHVzdWFsIHBsYWNlIFtsb3ctb3JkZXIgbio4IGJpdHNdLiBUaGlzIG1lYW5zCi0gKiB0aGF0IGlmIHlvdSBtYXNrIG9mZiB0aGUgYnVja3kgYml0cywgdGhlIHVzdWFsIHJ1bGVzIGFwcGx5IGFib3V0Ci0gKiBob3cgbG9uZyB0aGUgb3Bjb2RlIGlzLgotICoKLSAqIEFsbCBWQVggYnJhbmNoIGRpc3BsYWNlbWVudHMgY29tZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAqIEZvciBzaW1wbGUgYnJhbmNoZXMgKDEtYnl0ZSBvcGNvZGUgKyAxLWJ5dGUgZGlzcGxhY2VtZW50KSB0aGUgbGFzdAotICogb3BlcmFuZCBpcyBjb2RlZCAnYj8nIHdoZXJlIHRoZSAiZGF0YSB0eXBlIiAnPycgaXMgYSBjbHVlIHRoYXQgd2UKLSAqIG1heSByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgYnJhbmNoIChjb21wbGVtZW50IGxvd2VzdCBvcmRlciBiaXQpCi0gKiBhbmQgYnJhbmNoIGFyb3VuZCBhIGp1bXAuIFRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbW1vbiBjYXNlLgotICogVGhhdCBpcyB3aHkgdGhlIFZJVF9PUENPREVfU1lOVEhFVElDIGJpdCBpcyBzZXQ6IGl0IHNheXMgdGhpcyBpcwotICogYSAwLWJ5dGUgb3AtY29kZSBmb2xsb3dlZCBieSAyIG9yIG1vcmUgYnl0ZXMgb2Ygb3BlcmFuZCBhZGRyZXNzLgotICoKLSAqIElmIHRoZSBvcC1jb2RlIGhhcyBWSVRfT1BDT0RFX1NQRUNJQUwgc2V0LCB0aGVuIHdlIGhhdmUgYSBtb3JlIHVudXN1YWwKLSAqIGNhc2UuCi0gKgotICogRm9yIEpCU0IgJiBKQlIgdGhlIHRyZWF0bWVudCBpcyB0aGUgc2ltaWxhciwgZXhjZXB0ICgxKSB3ZSBoYXZlIGEgJ2J3JwotICogb3B0aW9uIGJlZm9yZSAoMikgd2UgY2FuIGRpcmVjdGx5IEpTQi9KTVAgYmVjYXVzZSB0aGVyZSBpcyBubyBjb25kaXRpb24uCi0gKiBUaGVzZSBvcGVyYW5kcyBoYXZlICdiLScgYXMgdGhlaXIgYWNjZXNzL2RhdGEgdHlwZS4KLSAqCi0gKiBUaGF0IGxlYXZlcyBhIGJ1bmNoIG9mIHJhbmRvbSBvcGNvZGVzOiBKQUNCeCwgSnhPQnh4eC4gSW4gdGhlc2UKLSAqIGNhc2VzLCB3ZSBkbyB0aGUgc2FtZSBpZGVhLiBKQUNCeHh4IGFyZSBhbGwgbWFya2VkIHdpdGggYSAnYiEnCi0gKiBKQU9CeHh4ICYgSlNPQnh4eCBhcmUgbWFya2VkIHdpdGggYSAnYjonLgotICoKLSAqLwotI2lmIChWSVRfT1BDT0RFX1NZTlRIRVRJQyAhPSAweDgwMDAwMDAwKQotWW91IGhhdmUganVzdCBicm9rZW4gdGhlIGVuY29kaW5nIGJlbG93LCB3aGljaCBhc3N1bWVzIHRoZSBzaWduIGJpdAotICBtZWFucyAnSSBhbSBhbiBpbWFnaW5hcnkgaW5zdHJ1Y3Rpb24nLgotI2VuZGlmCi0KLSNpZiAoVklUX09QQ09ERV9TUEVDSUFMICE9IDB4NDAwMDAwMDApCi0gIFlvdSBoYXZlIGp1c3QgYnJva2VuIHRoZSBlbmNvZGluZyBiZWxvdywgd2hpY2ggYXNzdW1lcyB0aGUgMHg0MCBNIGJpdCBtZWFucwotICAnSSBhbSBub3QgdG8gYmUgIm9wdGltaXNlZCIgdGhlIHdheSBub3JtYWwgYnJhbmNoZXMgYXJlJy4KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHZvdAotICBzeW50aGV0aWNfdm90c3Ryc1tdID0KLXsKLSAgeyJqYnNiIiwJeyJiLSIsIDB4QzAwMDAwMTB9fSwJCS8qIEJTRCA0LjIgKi8KLS8qIGpzYiB1c2VkIGFscmVhZHkgKi8KLSAgeyJqYnIiLAl7ImItIiwgMHhDMDAwMDAxMX19LAkJLyogQlNEIDQuMiAqLwotICB7ImpyIiwJeyJiLSIsIDB4QzAwMDAwMTF9fSwJCS8qIGNvbnNpc3RlbnQgKi8KLSAgeyJqbmVxIiwJeyJiPyIsIDB4ODAwMDAwMTJ9fSwKLSAgeyJqbmVxdSIsCXsiYj8iLCAweDgwMDAwMDEyfX0sCi0gIHsiamVxbCIsCXsiYj8iLCAweDgwMDAwMDEzfX0sCi0gIHsiamVxbHUiLAl7ImI/IiwgMHg4MDAwMDAxM319LAotICB7ImpndHIiLAl7ImI/IiwgMHg4MDAwMDAxNH19LAotICB7ImpsZXEiLAl7ImI/IiwgMHg4MDAwMDAxNX19LAotLyogdW4tdXNlZCBvcGNvZGVzIGhlcmUgKi8KLSAgeyJqZ2VxIiwJeyJiPyIsIDB4ODAwMDAwMTh9fSwKLSAgeyJqbHNzIiwJeyJiPyIsIDB4ODAwMDAwMTl9fSwKLSAgeyJqZ3RydSIsCXsiYj8iLCAweDgwMDAwMDFhfX0sCi0gIHsiamxlcXUiLAl7ImI/IiwgMHg4MDAwMDAxYn19LAotICB7Imp2YyIsCXsiYj8iLCAweDgwMDAwMDFjfX0sCi0gIHsianZzIiwJeyJiPyIsIDB4ODAwMDAwMWR9fSwKLSAgeyJqZ2VxdSIsCXsiYj8iLCAweDgwMDAwMDFlfX0sCi0gIHsiamNjIiwJeyJiPyIsIDB4ODAwMDAwMWV9fSwKLSAgeyJqbHNzdSIsCXsiYj8iLCAweDgwMDAwMDFmfX0sCi0gIHsiamNzIiwJeyJiPyIsIDB4ODAwMDAwMWZ9fSwKLQotICB7ImphY2J3IiwJeyJyd3J3bXdiISIsIDB4QzAwMDAwM2R9fSwKLSAgeyJqYWNiZiIsCXsicmZyZm1mYiEiLCAweEMwMDAwMDRmfX0sCi0gIHsiamFjYmQiLAl7InJkcmRtZGIhIiwgMHhDMDAwMDA2Zn19LAotICB7ImphY2JiIiwJeyJyYnJibWJiISIsIDB4QzAwMDAwOWR9fSwKLSAgeyJqYWNibCIsCXsicmxybG1sYiEiLCAweEMwMDAwMGYxfX0sCi0gIHsiamFjYmciLAl7InJncmdtZ2IhIiwgMHhDMDAwNGZmZH19LAotICB7ImphY2JoIiwJeyJyaHJobWhiISIsIDB4QzAwMDZmZmR9fSwKLQotICB7ImpicyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlMH19LAotICB7ImpiYyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlMX19LAotICB7Impic3MiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTJ9fSwKLSAgeyJqYmNzIiwJeyJybHZiYj8iLCAweDgwMDAwMGUzfX0sCi0gIHsiamJzYyIsCXsicmx2YmI/IiwgMHg4MDAwMDBlNH19LAotICB7ImpiY2MiLAl7InJsdmJiPyIsIDB4ODAwMDAwZTV9fSwKLSAgeyJqYnNzaSIsCXsicmx2YmI/IiwgMHg4MDAwMDBlNn19LAotICB7ImpiY2NpIiwJeyJybHZiYj8iLCAweDgwMDAwMGU3fX0sCi0gIHsiamxicyIsCXsicmxiPyIsIDB4ODAwMDAwZTh9fSwKLSAgeyJqbGJjIiwJeyJybGI/IiwgMHg4MDAwMDBlOX19LAotCi0gIHsiamFvYmxzcyIsCXsicmxtbGI6IiwgMHhDMDAwMDBmMn19LAotICB7Imphb2JsZXEiLAl7InJsbWxiOiIsIDB4QzAwMDAwZjN9fSwKLSAgeyJqc29iZ2VxIiwJeyJtbGI6IiwgMHhDMDAwMDBmNH19LAotICB7Impzb2JndHIiLAl7Im1sYjoiLCAweEMwMDAwMGY1fX0sCi0KLS8qIENBU0V4IGhhcyBubyBicmFuY2ggYWRkcmVzc2VzIGluIG91ciBjb25jZXB0aW9uIG9mIGl0LiAqLwotLyogWW91IHNob3VsZCB1c2UgIi53b3JkIC4uLiIgc3RhdGVtZW50cyBhZnRlciB0aGUgImNhc2UgLi4uIi4gKi8KLQotICB7IiIsCXsiIiwgMH19CQkJLyogZW1wdHkgaXMgZW5kIHNlbnRpbmVsICovCi0KLX07CQkJCS8qIHN5bnRoZXRpY192b3RzdHJzICovCi0MCi0vKgotICogICAgICAgICAgICAgICAgICB2IGkgcCBfIGIgZSBnIGkgbiAoICkKLSAqCi0gKiBDYWxsIG1lIG9uY2UgYmVmb3JlIHlvdSBkZWNvZGUgYW55IGxpbmVzLgotICogSSBkZWNvZGUgdm90c3RycyBpbnRvIGEgaGFzaCB0YWJsZSBhdCBvcF9oYXNoICh3aGljaCBJIGNyZWF0ZSkuCi0gKiBJIHJldHVybiBhbiBlcnJvciB0ZXh0IG9yIG51bGwuCi0gKiBJZiB5b3Ugd2FudCwgSSB3aWxsIGluY2x1ZGUgdGhlICdzeW50aGV0aWMnIGpYWFggaW5zdHJ1Y3Rpb25zIGluIHRoZQotICogaW5zdHJ1Y3Rpb24gdGFibGUuCi0gKiBZb3UgbXVzdCBub21pbmF0ZSBtZXRhY2hhcmFjdGVycyBmb3IgZWcgREVDJ3MgIiMiLCAiQCIsICJeIi4KLSAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi12aXBfYmVnaW4gKHN5bnRoZXRpY190b28sIGltbWVkaWF0ZSwgaW5kaXJlY3QsIGRpc3BsZW4pCi0gICAgIGludCBzeW50aGV0aWNfdG9vOwkJLyogMSBtZWFucyBpbmNsdWRlIGpYWFggb3AtY29kZXMuICovCi0gICAgIGNvbnN0IGNoYXIgKmltbWVkaWF0ZSwgKmluZGlyZWN0LCAqZGlzcGxlbjsKLXsKLSAgY29uc3Qgc3RydWN0IHZvdCAqdlA7CQkvKiBzY2FuIHZvdHN0cnMgKi8KLSAgY29uc3QgY2hhciAqcmV0dmFsID0gMDsJLyogZXJyb3IgdGV4dCAqLwotCi0gIG9wX2hhc2ggPSBoYXNoX25ldyAoKTsKLQotICBmb3IgKHZQID0gdm90c3RyczsgKnZQLT52b3RfbmFtZSAmJiAhcmV0dmFsOyB2UCsrKQotICAgIHJldHZhbCA9IGhhc2hfaW5zZXJ0IChvcF9oYXNoLCB2UC0+dm90X25hbWUsIChQVFIpICZ2UC0+dm90X2RldGFpbCk7Ci0KLSAgaWYgKHN5bnRoZXRpY190b28pCi0gICAgZm9yICh2UCA9IHN5bnRoZXRpY192b3RzdHJzOyAqdlAtPnZvdF9uYW1lICYmICFyZXR2YWw7IHZQKyspCi0gICAgICByZXR2YWwgPSBoYXNoX2luc2VydCAob3BfaGFzaCwgdlAtPnZvdF9uYW1lLCAoUFRSKSAmdlAtPnZvdF9kZXRhaWwpOwotCi0jaWZuZGVmIENPTlNUX1RBQkxFCi0gIHZpcF9vcF9kZWZhdWx0cyAoaW1tZWRpYXRlLCBpbmRpcmVjdCwgZGlzcGxlbik7Ci0jZW5kaWYKLQotICByZXR1cm4gcmV0dmFsOwotfQotCi0KLS8qCi0gKiAgICAgICAgICAgICAgICAgIHYgaSBwICggKQotICoKLSAqIFRoaXMgY29udmVydHMgYSBzdHJpbmcgaW50byBhIHZheCBpbnN0cnVjdGlvbi4KLSAqIFRoZSBzdHJpbmcgbXVzdCBiZSBhIGJhcmUgc2luZ2xlIGluc3RydWN0aW9uIGluIGRlYy12YXggKHdpdGggQlNENCBmcm9icykKLSAqIGZvcm1hdC4KLSAqIEl0IHByb3ZpZGVzIHNvbWUgZXJyb3IgbWVzc2FnZXM6IGF0IG1vc3Qgb25lIGZhdGFsIGVycm9yIG1lc3NhZ2UgKHdoaWNoCi0gKiBzdG9wcyB0aGUgc2NhbikgYW5kIGF0IG1vc3Qgb25lIHdhcm5pbmcgbWVzc2FnZSBmb3IgZWFjaCBvcGVyYW5kLgotICogVGhlIHZheCBpbnN0cnVjdGlvbiBpcyByZXR1cm5lZCBpbiBleHBsb2RlZCBmb3JtLCBzaW5jZSB3ZSBoYXZlIG5vCi0gKiBrbm93bGVkZ2Ugb2YgaG93IHlvdSBwYXJzZSAob3IgZXZhbHVhdGUpIHlvdXIgZXhwcmVzc2lvbnMuCi0gKiBXZSBkbyBob3dldmVyIHN0cmlwIG9mZiBhbmQgZGVjb2RlIGFkZHJlc3NpbmcgbW9kZXMgYW5kIG9wZXJhdGlvbgotICogbW5lbW9uaWMuCi0gKgotICogVGhlIGV4cGxvZGVkIGluc3RydWN0aW9uIGlzIHJldHVybmVkIHRvIGEgc3RydWN0IHZpdCBvZiB5b3VyIGNob2ljZS4KLSAqICNpbmNsdWRlICJ2YXgtaW5zdC5oIiB0byBrbm93IHdoYXQgYSBzdHJ1Y3Qgdml0IGlzLgotICoKLSAqIFRoaXMgZnVuY3Rpb24ncyB2YWx1ZSBpcyBhIHN0cmluZy4gSWYgaXQgaXMgbm90ICIiIHRoZW4gYW4gaW50ZXJuYWwKLSAqIGxvZ2ljIGVycm9yIHdhcyBmb3VuZDogcmVhZCB0aGlzIGNvZGUgdG8gYXNzaWduIG1lYW5pbmcgdG8gdGhlIHN0cmluZy4KLSAqIE5vIGFyZ3VtZW50IHN0cmluZyBzaG91bGQgZ2VuZXJhdGUgc3VjaCBhbiBlcnJvciBzdHJpbmc6Ci0gKiBpdCBtZWFucyBhIGJ1ZyBpbiBvdXIgY29kZSwgbm90IGluIHRoZSB1c2VyJ3MgdGV4dC4KLSAqCi0gKiBZb3UgTVVTVCBoYXZlIGNhbGxlZCB2aXBfYmVnaW4oKSBvbmNlIGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLgotICovCi0KLXN0YXRpYyB2b2lkCi12aXAgKHZpdFAsIGluc3RyaW5nKQotICAgICBzdHJ1Y3Qgdml0ICp2aXRQOwkJLyogV2UgYnVpbGQgYW4gZXhwbG9kZWQgaW5zdHJ1Y3Rpb24gaGVyZS4gKi8KLSAgICAgY2hhciAqaW5zdHJpbmc7CQkvKiBUZXh0IG9mIGEgdmF4IGluc3RydWN0aW9uOiB3ZSBtb2RpZnkuICovCi17Ci0gIC8qIEhvdyB0byBiaXQtZW5jb2RlIHRoaXMgb3Bjb2RlLiAqLwotICBzdHJ1Y3Qgdm90X3dvdCAqdndQOwotICAvKiAxL3NraXAgd2hpdGVzcGFjZS4yL3NjYW4gdm90X2hvdyAqLwotICBjaGFyICpwOwotICBjaGFyICpxOwotICAvKiBjb3VudHMgbnVtYmVyIG9mIG9wZXJhbmRzIHNlZW4gKi8KLSAgdW5zaWduZWQgY2hhciBjb3VudDsKLSAgLyogc2NhbiBvcGVyYW5kcyBpbiBzdHJ1Y3Qgdml0ICovCi0gIHN0cnVjdCB2b3AgKm9wZXJhbmRwOwotICAvKiBlcnJvciBvdmVyIGFsbCBvcGVyYW5kcyAqLwotICBjb25zdCBjaGFyICphbGxvcGVycjsKLSAgLyogUmVtZW1iZXIgY2hhciwgKHdlIGNsb2JiZXIgaXQgd2l0aCAnXDAnIHRlbXBvcmFyaWx5KS4gKi8KLSAgY2hhciBjOwotICAvKiBPcC1jb2RlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uICovCi0gIHZheF9vcGNvZGVUIG9jOwotCi0gIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotICAgICsraW5zdHJpbmc7CQkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UuICovCi0gIGZvciAocCA9IGluc3RyaW5nOyAqcCAmJiAqcCAhPSAnICc7IHArKyk7OwkvKiBNVVNUIGVuZCBpbiBlbmQtb2Ytc3RyaW5nIG9yIGV4YWN0bHkgMSBzcGFjZS4gKi8KLSAgLyogU2Nhbm5lZCB1cCB0byBlbmQgb2Ygb3BlcmF0aW9uLWNvZGUuICovCi0gIC8qIE9wZXJhdGlvbi1jb2RlIGlzIGVuZGVkIHdpdGggd2hpdGVzcGFjZS4gKi8KLSAgaWYgKHAgLSBpbnN0cmluZyA9PSAwKQotICAgIHsKLSAgICAgIHZpdFAtPnZpdF9lcnJvciA9IF8oIk5vIG9wZXJhdG9yIik7Ci0gICAgICBjb3VudCA9IDA7Ci0gICAgICBtZW1zZXQgKHZpdFAtPnZpdF9vcGNvZGUsICdcMCcsIHNpemVvZiAodml0UC0+dml0X29wY29kZSkpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGMgPSAqcDsKLSAgICAgICpwID0gJ1wwJzsKLSAgICAgIC8qCi0gICAgICAgKiBIZXJlIHdpdGggaW5zdHJpbmcgcG9pbnRpbmcgdG8gd2hhdCBiZXR0ZXIgYmUgYW4gb3AtbmFtZSwgYW5kIHAKLSAgICAgICAqIHBvaW50aW5nIHRvIGNoYXJhY3RlciBqdXN0IHBhc3QgdGhhdC4KLSAgICAgICAqIFdlIHRydXN0IGluc3RyaW5nIHBvaW50cyB0byBhbiBvcC1uYW1lLCB3aXRoIG5vIHdoaXRlc3BhY2UuCi0gICAgICAgKi8KLSAgICAgIHZ3UCA9IChzdHJ1Y3Qgdm90X3dvdCAqKSBoYXNoX2ZpbmQgKG9wX2hhc2gsIGluc3RyaW5nKTsKLSAgICAgICpwID0gYzsJCQkvKiBSZXN0b3JlIGNoYXIgYWZ0ZXIgb3AtY29kZS4gKi8KLSAgICAgIGlmICh2d1AgPT0gMCkKLQl7Ci0JICB2aXRQLT52aXRfZXJyb3IgPSBfKCJVbmtub3duIG9wZXJhdG9yIik7Ci0JICBjb3VudCA9IDA7Ci0JICBtZW1zZXQgKHZpdFAtPnZpdF9vcGNvZGUsICdcMCcsIHNpemVvZiAodml0UC0+dml0X29wY29kZSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogV2UgZm91bmQgYSBtYXRjaCEgU28gbGV0cyBwaWNrIHVwIGFzIG1hbnkgb3BlcmFuZHMgYXMgdGhlCi0JICAgKiBpbnN0cnVjdGlvbiB3YW50cywgYW5kIGV2ZW4gZ3JpcGUgaWYgdGhlcmUgYXJlIHRvbyBtYW55LgotCSAgICogV2UgZXhwZWN0IGNvbW1hIHRvIHNlcGVyYXRlIGVhY2ggb3BlcmFuZC4KLQkgICAqIFdlIGxldCBpbnN0cmluZyB0cmFjayB0aGUgdGV4dCwgd2hpbGUgcCB0cmFja3MgYSBwYXJ0IG9mIHRoZQotCSAgICogc3RydWN0IHZvdC4KLQkgICAqLwotCSAgY29uc3QgY2hhciAqaG93cDsKLQkgIC8qCi0JICAgKiBUaGUgbGluZXMgYmVsb3cga25vdyBhYm91dCAyLWJ5dGUgb3Bjb2RlcyBzdGFydGluZyBGRCxGRSBvciBGRi4KLQkgICAqIFRoZXkgYWxzbyB1bmRlcnN0YW5kIHN5bnRoZXRpYyBvcGNvZGVzLiBOb3RlOgotCSAgICogd2UgcmV0dXJuIDMyIGJpdHMgb2Ygb3Bjb2RlLCBpbmNsdWRpbmcgYnVja3kgYml0cywgQlVUCi0JICAgKiBhbiBvcGNvZGUgbGVuZ3RoIGlzIGVpdGhlciA4IG9yIDE2IGJpdHMgZm9yIHZpdF9vcGNvZGVfbmJ5dGVzLgotCSAgICovCi0JICBvYyA9IHZ3UC0+dm90X2NvZGU7CS8qIFRoZSBvcC1jb2RlLiAqLwotCSAgdml0UC0+dml0X29wY29kZV9uYnl0ZXMgPSAob2MgJiAweEZGKSA+PSAweEZEID8gMiA6IDE7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKHZpdFAtPnZpdF9vcGNvZGUsIG9jLCA0KTsKLQkgIGNvdW50ID0gMDsJCS8qIG5vIG9wZXJhbmRzIHNlZW4geWV0ICovCi0JICBpbnN0cmluZyA9IHA7CQkvKiBwb2ludCBqdXN0IHBhc3Qgb3BlcmF0aW9uIGNvZGUgKi8KLQkgIGFsbG9wZXJyID0gIiI7Ci0JICBmb3IgKGhvd3AgPSB2d1AtPnZvdF9ob3csIG9wZXJhbmRwID0gdml0UC0+dml0X29wZXJhbmQ7Ci0JICAgICAgICEoYWxsb3BlcnIgJiYgKmFsbG9wZXJyKSAmJiAqaG93cDsKLQkgICAgICAgb3BlcmFuZHArKywgaG93cCArPSAyKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBIZXJlIHRvIHBhcnNlIG9uZSBvcGVyYW5kLiBMZWF2ZSBpbnN0cmluZyBwb2ludGluZyBqdXN0Ci0JICAgICAgICogcGFzdCBhbnkgb25lICcsJyB0aGF0IG1hcmtzIHRoZSBlbmQgb2YgdGhpcyBvcGVyYW5kLgotCSAgICAgICAqLwotCSAgICAgIGlmICghaG93cFsxXSkKLQkJYXNfZmF0YWwgKF8oIm9kZCBudW1iZXIgb2YgYnl0ZXMgaW4gb3BlcmFuZCBkZXNjcmlwdGlvbiIpKTsKLQkgICAgICBlbHNlIGlmICgqaW5zdHJpbmcpCi0JCXsKLQkJICBmb3IgKHEgPSBpbnN0cmluZzsgKGMgPSAqcSkgJiYgYyAhPSAnLCc7IHErKykKLQkJICAgIDsKLQkJICAvKgotCQkgICAqIFEgcG9pbnRzIHRvICcsJyBvciAnXDAnIHRoYXQgZW5kcyBhcmd1bWVudC4gQyBpcyB0aGF0Ci0JCSAgICogY2hhcmFjdGVyLgotCQkgICAqLwotCQkgICpxID0gMDsKLQkJICBvcGVyYW5kcC0+dm9wX3dpZHRoID0gaG93cFsxXTsKLQkJICBvcGVyYW5kcC0+dm9wX25ieXRlcyA9IHZheF9vcGVyYW5kX3dpZHRoX3NpemVbKHVuc2lnbmVkKSBob3dwWzFdXTsKLQkJICBvcGVyYW5kcC0+dm9wX2FjY2VzcyA9IGhvd3BbMF07Ci0JCSAgdmlwX29wIChpbnN0cmluZywgb3BlcmFuZHApOwotCQkgICpxID0gYzsJLyogUmVzdG9yZSBpbnB1dCB0ZXh0LiAqLwotCQkgIGlmIChvcGVyYW5kcC0+dm9wX2Vycm9yKQotCQkgICAgYWxsb3BlcnIgPSBfKCJCYWQgb3BlcmFuZCIpOwotCQkgIGluc3RyaW5nID0gcSArIChjID8gMSA6IDApOwkvKiBuZXh0IG9wZXJhbmQgKGlmIGFueSkgKi8KLQkJICBjb3VudCsrOwkvKiAgd29uIGFub3RoZXIgYXJndW1lbnQsIG1heSBoYXZlIGFuIG9wZXJyICovCi0JCX0KLQkgICAgICBlbHNlCi0JCWFsbG9wZXJyID0gXygiTm90IGVub3VnaCBvcGVyYW5kcyIpOwotCSAgICB9Ci0JICBpZiAoISphbGxvcGVycikKLQkgICAgewotCSAgICAgIGlmICgqaW5zdHJpbmcgPT0gJyAnKQotCQlpbnN0cmluZysrOwkvKiBTa2lwIHdoaXRlc3BhY2UuICovCi0JICAgICAgaWYgKCppbnN0cmluZykKLQkJYWxsb3BlcnIgPSBfKCJUb28gbWFueSBvcGVyYW5kcyIpOwotCSAgICB9Ci0JICB2aXRQLT52aXRfZXJyb3IgPSBhbGxvcGVycjsKLQl9Ci0gICAgfQotICB2aXRQLT52aXRfb3BlcmFuZHMgPSBjb3VudDsKLX0KLQwKLSNpZmRlZiB0ZXN0Ci0KLS8qCi0gKiBUZXN0IHByb2dyYW0gZm9yIGFib3ZlLgotICovCi0KLXN0cnVjdCB2aXQgbXl2aXQ7CQkvKiBidWlsZCBhbiBleHBsb2RlZCB2YXggaW5zdHJ1Y3Rpb24gaGVyZSAqLwotY2hhciBhbnN3ZXJbMTAwXTsJCS8qIGh1bWFuIHR5cGVzIGEgbGluZSBvZiB2YXggYXNzZW1ibGVyIGhlcmUgKi8KLWNoYXIgKm15YnVnOwkJCS8qICIiIG9yIGFuIGludGVybmFsIGxvZ2ljIGRpYWdub3N0aWMgKi8KLWludCBteWNvdW50OwkJCS8qIG51bWJlciBvZiBvcGVyYW5kcyAqLwotc3RydWN0IHZvcCAqbXl2b3A7CQkvKiBzY2FuIG9wZXJhbmRzIGZyb20gbXl2aXQgKi8KLWludCBteXN5bnRoOwkJCS8qIDEgbWVhbnMgd2FudCBzeW50aGV0aWMgb3Bjb2Rlcy4gKi8KLWNoYXIgbXlfaW1tZWRpYXRlWzIwMF07Ci1jaGFyIG15X2luZGlyZWN0WzIwMF07Ci1jaGFyIG15X2Rpc3BsZW5bMjAwXTsKLQotbWFpbiAoKQotewotICBjaGFyICpwOwotCi0gIHByaW50ZiAoIjAgbWVhbnMgbm8gc3ludGhldGljIGluc3RydWN0aW9ucy4gICAiKTsKLSAgcHJpbnRmICgiVmFsdWUgZm9yIHZpcF9iZWdpbj8gICIpOwotICBnZXRzIChhbnN3ZXIpOwotICBzc2NhbmYgKGFuc3dlciwgIiVkIiwgJm15c3ludGgpOwotICBwcmludGYgKCJTeW50aGV0aWMgb3Bjb2RlcyAlcyBiZSBpbmNsdWRlZC5cbiIsIG15c3ludGggPyAid2lsbCIgOiAid2lsbCBub3QiKTsKLSAgcHJpbnRmICgiZW50ZXIgaW1tZWRpYXRlIHN5bWJvbHMgZWcgZW50ZXIgIyAgICIpOwotICBnZXRzIChteV9pbW1lZGlhdGUpOwotICBwcmludGYgKCJlbnRlciBpbmRpcmVjdCBzeW1ib2xzICBlZyBlbnRlciBAICAgIik7Ci0gIGdldHMgKG15X2luZGlyZWN0KTsKLSAgcHJpbnRmICgiZW50ZXIgZGlzcGxlbiBzeW1ib2xzICAgZWcgZW50ZXIgXiAgICIpOwotICBnZXRzIChteV9kaXNwbGVuKTsKLSAgaWYgKHAgPSB2aXBfYmVnaW4gKG15c3ludGgsIG15X2ltbWVkaWF0ZSwgbXlfaW5kaXJlY3QsIG15X2Rpc3BsZW4pKQotICAgIHsKLSAgICAgIGVycm9yICgidmlwX2JlZ2luPSVzIiwgcCk7Ci0gICAgfQotICBwcmludGYgKCJBbiBlbXB0eSBpbnB1dCBsaW5lIHdpbGwgcXVpdCB5b3UgZnJvbSB0aGUgdmF4IGluc3RydWN0aW9uIHBhcnNlclxuIik7Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgcHJpbnRmICgidmF4IGluc3RydWN0aW9uOiAiKTsKLSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLSAgICAgIGdldHMgKGFuc3dlcik7Ci0gICAgICBpZiAoISphbnN3ZXIpCi0JewotCSAgYnJlYWs7CQkvKiBvdXQgb2YgZm9yIGVhY2ggaW5wdXQgdGV4dCBsb29wICovCi0JfQotICAgICAgdmlwICgmbXl2aXQsIGFuc3dlcik7Ci0gICAgICBpZiAoKm15dml0LnZpdF9lcnJvcikKLQl7Ci0JICBwcmludGYgKCJFUlI6XCIlc1wiXG4iLCBteXZpdC52aXRfZXJyb3IpOwotCX0KLSAgICAgIHByaW50ZiAoIm9wY29kZT0iKTsKLSAgICAgIGZvciAobXljb3VudCA9IG15dml0LnZpdF9vcGNvZGVfbmJ5dGVzLCBwID0gbXl2aXQudml0X29wY29kZTsKLQkgICBteWNvdW50OwotCSAgIG15Y291bnQtLSwgcCsrCi0JKQotCXsKLQkgIHByaW50ZiAoIiUwMnggIiwgKnAgJiAweEZGKTsKLQl9Ci0gICAgICBwcmludGYgKCIgICBvcGVyYW5kIGNvdW50PSVkLlxuIiwgbXljb3VudCA9IG15dml0LnZpdF9vcGVyYW5kcyk7Ci0gICAgICBmb3IgKG15dm9wID0gbXl2aXQudml0X29wZXJhbmQ7IG15Y291bnQ7IG15Y291bnQtLSwgbXl2b3ArKykKLQl7Ci0JICBwcmludGYgKCJtb2RlPSV4eCByZWc9JXh4IG5keD0leHggbGVuPSclYyc9JWMlYyVkLiBleHByPVwiIiwKLQkJICBteXZvcC0+dm9wX21vZGUsIG15dm9wLT52b3BfcmVnLCBteXZvcC0+dm9wX25keCwKLQkJICBteXZvcC0+dm9wX3Nob3J0LCBteXZvcC0+dm9wX2FjY2VzcywgbXl2b3AtPnZvcF93aWR0aCwKLQkJICBteXZvcC0+dm9wX25ieXRlcyk7Ci0JICBmb3IgKHAgPSBteXZvcC0+dm9wX2V4cHJfYmVnaW47IHAgPD0gbXl2b3AtPnZvcF9leHByX2VuZDsgcCsrKQotCSAgICB7Ci0JICAgICAgcHV0Y2hhciAoKnApOwotCSAgICB9Ci0JICBwcmludGYgKCJcIlxuIik7Ci0JICBpZiAobXl2b3AtPnZvcF9lcnJvcikKLQkgICAgewotCSAgICAgIHByaW50ZiAoIiAgZXJyOlwiJXNcIlxuIiwgbXl2b3AtPnZvcF9lcnJvcik7Ci0JICAgIH0KLQkgIGlmIChteXZvcC0+dm9wX3dhcm4pCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIgIHdybjpcIiVzXCJcbiIsIG15dm9wLT52b3Bfd2Fybik7Ci0JICAgIH0KLQl9Ci0gICAgfQotICB2aXBfZW5kICgpOwotICBleGl0IChFWElUX1NVQ0NFU1MpOwotfQotCi0jZW5kaWYgLyogI2lmZGVmIHRlc3QgKi8KLQotLyogZW5kIG9mIHZheF9pbnNfcGFyc2UuYyAqLwotCi0vKiB2YXhfcmVnX3BhcnNlLmMgLSBjb252ZXJ0IGEgVkFYIHJlZ2lzdGVyIG5hbWUgdG8gYSBudW1iZXIgKi8KLQotLyogQ29weXJpZ2h0IChDKSAxOTg3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiBBIHBhcnQgb2YgR05VLiAqLwotCi0vKgotICogICAgICAgICAgdiBhIHggXyByIGUgZyBfIHAgYSByIHMgZSAoICkKLSAqCi0gKiBUYWtlIDMgY2hhci5zLCB0aGUgbGFzdCBvZiB3aGljaCBtYXkgYmUgYFwwYCAobm9uLWV4aXN0ZW50KQotICogYW5kIHJldHVybiB0aGUgVkFYIHJlZ2lzdGVyIG51bWJlciB0aGF0IHRoZXkgcmVwcmVzZW50LgotICoKLSAqIFJldHVybiAtMSBpZiB0aGV5IGRvbid0IGZvcm0gYSByZWdpc3RlciBuYW1lLiBHb29kIG5hbWVzIHJldHVybgotICogYSBudW1iZXIgZnJvbSAwOjE1IGluY2x1c2l2ZS4KLSAqCi0gKiBDYXNlIGlzIG5vdCBpbXBvcnRhbnQgaW4gYSBuYW1lLgotICoKLSAqIFJlZ2lzdGVyIG5hbWVzIHVuZGVyc3Rvb2QgYXJlOgotICoKLSAqCVIwCi0gKglSMQotICoJUjIKLSAqCVIzCi0gKglSNAotICoJUjUKLSAqCVI2Ci0gKiAJUjcKLSAqCVI4Ci0gKglSOQotICoJUjEwCi0gKglSMTEKLSAqCVIxMglBUAotICoJUjEzCUZQCi0gKglSMTQJU1AKLSAqCVIxNQlQQwotICoKLSAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgQVAgKDEyKQotI2RlZmluZSBGUCAoMTMpCi0jZGVmaW5lIFNQICgxNCkKLSNkZWZpbmUgUEMgKDE1KQotDAotaW50CQkJCS8qIHJldHVybiAtMSBvciAwOjE1ICovCi12YXhfcmVnX3BhcnNlIChjMSwgYzIsIGMzKQkvKiAzIGNoYXJzIG9mIHJlZ2lzdGVyIG5hbWUgKi8KLSAgICAgY2hhciBjMSwgYzIsIGMzOwkJLyogYzMgPT0gMCBpZiAyLWNoYXJhY3RlciByZWcgbmFtZSAqLwotewotICBpbnQgcmV0dmFsOwkJLyogcmV0dXJuIC0xOjE1ICovCi0KLSAgcmV0dmFsID0gLTE7Ci0KLSAgaWYgKGlzdXBwZXIgKGMxKSkKLSAgICBjMSA9IHRvbG93ZXIgKGMxKTsKLSAgaWYgKGlzdXBwZXIgKGMyKSkKLSAgICBjMiA9IHRvbG93ZXIgKGMyKTsKLSAgaWYgKGlzZGlnaXQgKGMyKSAmJiBjMSA9PSAncicpCi0gICAgewotICAgICAgcmV0dmFsID0gYzIgLSAnMCc7Ci0gICAgICBpZiAoaXNkaWdpdCAoYzMpKQotCXsKLQkgIHJldHZhbCA9IHJldHZhbCAqIDEwICsgYzMgLSAnMCc7Ci0JICByZXR2YWwgPSAocmV0dmFsID4gMTUpID8gLTEgOiByZXR2YWw7Ci0JICAvKiBjbGFtcCB0aGUgcmVnaXN0ZXIgdmFsdWUgdG8gMSBoZXggZGlnaXQgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChjMykKLQlyZXR2YWwgPSAtMTsJCS8qIGMzIG11c3QgYmUgJ1wwJyBvciBhIGRpZ2l0ICovCi0gICAgfQotICBlbHNlIGlmIChjMykJCQkvKiBUaGVyZSBhcmUgbm8gdGhyZWUgbGV0dGVyIHJlZ3MgKi8KLSAgICByZXR2YWwgPSAtMTsKLSAgZWxzZSBpZiAoYzIgPT0gJ3AnKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYzEpCi0JewotCWNhc2UgJ3MnOgotCSAgcmV0dmFsID0gU1A7Ci0JICBicmVhazsKLQljYXNlICdmJzoKLQkgIHJldHZhbCA9IEZQOwotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICByZXR2YWwgPSBBUDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICByZXR2YWwgPSAtMTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChjMSA9PSAncCcgJiYgYzIgPT0gJ2MnKQotICAgIHJldHZhbCA9IFBDOwotICBlbHNlCi0gICAgcmV0dmFsID0gLTE7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQotLyoKLSAqICAgICAgICAgICAgICAgdiBpIHAgXyBvIHAgKCApCi0gKgotICogUGFyc2UgYSB2YXggb3BlcmFuZCBpbiBERUMgYXNzZW1ibGVyIG5vdGF0aW9uLgotICogRm9yIHNwZWVkLCBleHBlY3QgYSBzdHJpbmcgb2Ygd2hpdGVzcGFjZSB0byBiZSByZWR1Y2VkIHRvIGEgc2luZ2xlICcgJy4KLSAqIFRoaXMgaXMgdGhlIGNhc2UgZm9yIEdOVSBBUywgYW5kIGlzIGVhc3kgZm9yIG90aGVyIERFQy1jb21wYXRpYmxlCi0gKiBhc3NlbWJsZXJzLgotICoKLSAqIEtub3dsZWRnZSBhYm91dCBERUMgVkFYIGFzc2VtYmxlciBvcGVyYW5kIG5vdGF0aW9uIGxpdmVzIGhlcmUuCi0gKiBUaGlzIGRvZXNuJ3QgZXZlbiBrbm93IHdoYXQgYSByZWdpc3RlciBuYW1lIGlzLCBleGNlcHQgaXQgYmVsaWV2ZXMKLSAqIGFsbCByZWdpc3RlciBuYW1lcyBhcmUgMiBvciAzIGNoYXJhY3RlcnMsIGFuZCBsZXRzIHZheF9yZWdfcGFyc2UoKSBzYXkKLSAqIHdoYXQgbnVtYmVyIGVhY2ggbmFtZSByZXByZXNlbnRzLgotICogSXQgZG9lcywgaG93ZXZlciwga25vdyB0aGF0IFBDLCBTUCBldGMgYXJlIHNwZWNpYWwgcmVnaXN0ZXJzIHNvIGl0IGNhbgotICogZGV0ZWN0IGFkZHJlc3NpbmcgbW9kZXMgdGhhdCBhcmUgc2lsbHkgZm9yIHRob3NlIHJlZ2lzdGVycy4KLSAqCi0gKiBXaGVyZSBwb3NzaWJsZSwgaXQgZGVsaXZlcnMgMSBmYXRhbCBvciAxIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgb3BlcmFuZAotICogaXMgc3VzcGVjdC4gRXhhY3RseSB3aGF0IHdlIHRlc3QgZm9yIGlzIHN0aWxsIGV2b2x2aW5nLgotICovCi0KLS8qCi0gKgkJICAgCUIgdSBnIHMKLSAqCi0gKglBcmcgYmxvY2suCi0gKgotICogVGhlcmUgd2VyZSBhIG51bWJlciBvZiAnbWlzbWF0Y2hlZCBhcmd1bWVudCB0eXBlJyBidWdzIHRvIHZpcF9vcC4KLSAqIFRoZSBtb3N0IGdlbmVyYWwgc29sdXRpb24gaXMgdG8gdHlwZWRlZiBlYWNoIChvZiBtYW55KSBhcmd1bWVudHMuCi0gKiBXZSB1c2VkIGluc3RlYWQgYSB0eXBlZGVmJ2QgYXJndW1lbnQgYmxvY2suIFRoaXMgaXMgbGVzcyBtb2R1bGFyCi0gKiB0aGFuIHVzaW5nIHNlcGVyYXRlIHJldHVybiBwb2ludGVycyBmb3IgZWFjaCByZXN1bHQsIGJ1dCBydW5zIGZhc3RlcgotICogb24gbW9zdCBlbmdpbmVzLCBhbmQgc2VlbXMgdG8ga2VlcCBwcm9ncmFtbWVycyBoYXBweS4gSXQgd2lsbCBoYXZlCi0gKiB0byBiZSBkb25lIHByb3Blcmx5IGlmIHdlIGV2ZXIgd2FudCB0byB1c2UgdmlwX29wIGFzIGEgZ2VuZXJhbC1wdXJwb3NlCi0gKiBtb2R1bGUgKGl0IHdhcyBkZXNpZ25lZCB0byBiZSkuCi0gKgotICoJR14KLSAqCi0gKiBEb2Vzbid0IHN1cHBvcnQgREVDICJHXiIgZm9ybWF0IG9wZXJhbmRzLiBUaGVzZSBhbHdheXMgdGFrZSA1IGJ5dGVzCi0gKiB0byBleHByZXNzLCBhbmQgY29kZSBhcyBtb2RlcyA4RiBvciA5Ri4gUmVhc29uOiAiR14iIGRlcHJpdmVzIHlvdSBvZgotICogb3B0aW1pc2luZyB0byAoc2F5KSBhICJCXiIgaWYgeW91IGFyZSBsdWNreSBpbiB0aGUgd2F5IHlvdSBsaW5rLgotICogV2hlbiBzb21lb25lIGJ1aWxkcyBhIGxpbmtlciBzbWFydCBlbm91Z2ggdG8gY29udmVydCAiR14iIHRvICJCXiIsICJXXiIKLSAqIHdoZW5ldmVyIHBvc3NpYmxlLCB0aGVuIHdlIHNob3VsZCBpbXBsZW1lbnQgaXQuCi0gKiBJZiB0aGVyZSBpcyBzb21lIG90aGVyIHVzZSBmb3IgIkdeIiwgZmVlbCBmcmVlIHRvIGNvZGUgaXQgaW4hCi0gKgotICoKLSAqCXNwZWVkCi0gKgotICogSWYgSSBuZXN0ZWQgaWYoKXMgbW9yZSwgSSBjb3VsZCBhdm9pZCB0ZXN0aW5nICgqZXJyKSB3aGljaCB3b3VsZCBzYXZlCi0gKiB0aW1lLCBzcGFjZSBhbmQgcGFnZSBmYXVsdHMuIEkgZGlkbid0IG5lc3QgYWxsIHRob3NlIGlmKClzIGZvciBjbGFyaXR5Ci0gKiBhbmQgYmVjYXVzZSBJIHRoaW5rIHRoZSBtb2RlIHRlc3RpbmcgY2FuIGJlIHJlLWFycmFuZ2VkIDFzdCB0byB0ZXN0IHRoZQotICogY29tbW9uZXIgY29uc3RydWN0cyAxc3QuIERvZXMgYW55Ym9keSBoYXZlIHN0YXRpc3RpY3Mgb24gdGhpcz8KLSAqCi0gKgotICoKLSAqCWVycm9yIG1lc3NhZ2VzCi0gKgotICogSW4gZnV0dXJlLCB3ZSBzaG91bGQgYmUgYWJsZSB0byAnY29tcG9zZScgZXJyb3IgbWVzc2FnZXMgaW4gYSBzY3JhdGNoIGFyZWEKLSAqIGFuZCBnaXZlIHRoZSB1c2VyIE1VQ0ggbW9yZSBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gQWx0aG91Z2ggdGhpcyB0YWtlcwotICogYSBsaXR0bGUgbW9yZSBjb2RlIGF0IHJ1bi10aW1lLCBpdCB3aWxsIG1ha2UgdGhpcyBtb2R1bGUgbXVjaCBtb3JlIHNlbGYtCi0gKiBkb2N1bWVudGluZy4gQXMgYW4gZXhhbXBsZSBvZiB3aGF0IHN1Y2tzIG5vdzogbW9zdCBlcnJvciBtZXNzYWdlcyBoYXZlCi0gKiBoYXJkd2lyZWQgaW50byB0aGVtIHRoZSBERUMgVkFYIG1ldGFjaGFyYWN0ZXJzICIjXkAiIHdoaWNoIGFyZSBub3RoaW5nIGxpa2UKLSAqIHRoZSBVbip4IGNoYXJhY3RlcnMgIiRgKiIsIHRoYXQgbW9zdCB1c2VycyB3aWxsIGV4cGVjdCBmcm9tIHRoaXMgQVMuCi0gKi8KLQwKLS8qCi0gKiBUaGUgaW5wdXQgaXMgYSBzdHJpbmcsIGVuZGluZyB3aXRoICdcMCcuCi0gKgotICogV2UgYWxzbyByZXF1aXJlIGEgJ2hpbnQnIG9mIHdoYXQga2luZCBvZiBvcGVyYW5kIGlzIGV4cGVjdGVkOiBzbwotICogd2UgY2FuIHJlbWluZCBjYWxsZXIgbm90IHRvIHdyaXRlIGludG8gbGl0ZXJhbHMgZm9yIGluc3RhbmNlLgotICoKLSAqIFRoZSBvdXRwdXQgaXMgYSBza2VsZXRhbCBpbnN0cnVjdGlvbi4KLSAqCi0gKiBUaGUgYWxnb3JpdGhtIGhhcyB0d28gcGFydHMuCi0gKiAxLiBleHRyYWN0IHRoZSBzeW50YWN0aWMgZmVhdHVyZXMgKHBhcnNlIG9mZiBhbGwgdGhlIEBeIy0oKStbXSBtb2RlIGNydWQpOwotICogMi4gZXhwcmVzcyB0aGUgQF4jLSgpK1tdIGFzIHNvbWUgcGFyYW1ldGVycyBzdWl0ZWQgdG8gZnVydGhlciBhbmFseXNpcy4KLSAqCi0gKiAybmQgc3RlcCBpcyB3aGVyZSB3ZSBkZXRlY3QgdGhlIGdvb2dsZXMgb2YgcG9zc2libGUgaW52YWxpZCBjb21iaW5hdGlvbnMKLSAqIGEgaHVtYW4gKG9yIGNvbXBpbGVyKSBtaWdodCB3cml0ZS4gTm90ZSB0aGF0IGlmIHdlIGRvIGEgaGFsZi13YXkKLSAqIGRlY2VudCBhc3NlbWJsZXIsIHdlIGRvbid0IGtub3cgaG93IGxvbmcgdG8gbWFrZSAoZWcpIGRpc3BsYWNlbWVudAotICogZmllbGRzIHdoZW4gd2UgZmlyc3QgbWVldCB0aGVtIChiZWNhdXNlIHRoZXkgbWF5IG5vdCBoYXZlIGRlZmluZWQgdmFsdWVzKS4KLSAqIFNvIHdlIG11c3Qgd2FpdCB1bnRpbCB3ZSBrbm93IGhvdyBtYW55IGJpdHMgYXJlIG5lZWRlZCBmb3IgZWFjaCBhZGRyZXNzLAotICogdGhlbiB3ZSBjYW4ga25vdyBib3RoIGxlbmd0aCBhbmQgb3Bjb2RlcyBvZiBpbnN0cnVjdGlvbnMuCi0gKiBGb3IgcmVhc29uKHMpIGFib3ZlLCB3ZSB3aWxsIHBhc3MgdG8gb3VyIGNhbGxlciBhICdicm9rZW4nIGluc3RydWN0aW9uCi0gKiBvZiB0aGVzZSBtYWpvciBjb21wb25lbnRzLCBmcm9tIHdoaWNoIG91ciBjYWxsZXIgY2FuIGdlbmVyYXRlIGluc3RydWN0aW9uczoKLSAqICAtICBkaXNwbGFjZW1lbnQgbGVuZ3RoICAgICAgSV4gU14gTF4gQl4gV14gdW5zcGVjaWZpZWQKLSAqICAtICBtb2RlICAgICAgICAgICAgICAgICAgICAgKG1hbnkpCi0gKiAgLSAgcmVnaXN0ZXIgICAgICAgICAgICAgICAgIFIwLVIxNSBvciBhYnNlbnQKLSAqICAtICBpbmRleCByZWdpc3RlciAgICAgICAgICAgUjAtUjE1IG9yIGFic2VudAotICogIC0gIGV4cHJlc3Npb24gdGV4dCAgICAgICAgICB3aGF0IHdlIGRvbid0IHBhcnNlCi0gKiAgLSAgZXJyb3IgdGV4dChzKSAgICAgICAgICAgIHdoeSB3ZSBjb3VsZG4ndCB1bmRlcnN0YW5kIHRoZSBvcGVyYW5kCi0gKi8KLQotLyoKLSAqIFRvIGRlY29kZSBvdXRwdXQgb2YgdGhpcywgdGVzdCBlcnJ0eHQuIElmIGVycnR4dFswXSA9PSAnXDAnLCB0aGVuCi0gKiB3ZSBoYWQgbm8gZXJyb3JzIHRoYXQgcHJldmVudGVkIHBhcnNpbmcuIEFsc28sIGlmIHdlIGV2ZXIgcmVwb3J0Ci0gKiBhbiBpbnRlcm5hbCBidWcsIGVycnR4dFswXSBpcyBzZXQgbm9uLXplcm8uIFNvIG9uZSB0ZXN0IHRlbGxzIHlvdQotICogaWYgdGhlIG90aGVyIG91dHB1dHMgYXJlIHRvIGJlIHRha2VuIHNlcmlvdXNseS4KLSAqLwotCi0KLS8qCi0gKiBCZWNhdXNlIHRoaXMgbW9kdWxlIGlzIHVzZWZ1bCBmb3IgYm90aCBWTVMgYW5kIFVOKlggc3R5bGUgYXNzZW1ibGVycwotICogYW5kIGJlY2F1c2Ugb2YgdGhlIHZhcmlldHkgb2YgVU4qWCBhc3NlbWJsZXJzIHdlIG11c3QgcmVjb2duaXNlCi0gKiB0aGUgZGlmZmVyZW50IGNvbnZlbnRpb25zIGZvciBhc3NlbWJsZXIgb3BlcmFuZCBub3RhdGlvbi4gRm9yIGV4YW1wbGUKLSAqIFZNUyBzYXlzICIjNDIiIGZvciBpbW1lZGlhdGUgbW9kZSwgd2hpbGUgbW9zdCBVTipYIHNheSAiJDQyIi4KLSAqIFdlIHBlcm1pdCBhcmJpdHJhcnkgc2V0cyBvZiAoc2luZ2xlKSBjaGFyYWN0ZXJzIHRvIHJlcHJlc2VudCB0aGUKLSAqIDMgY29uY2VwdHMgdGhhdCBERUMgd3JpdGVzICcjJywgJ0AnLCAnXicuCi0gKi8KLQotLyogY2hhcmFjdGVyIHRlc3RzICovCi0jZGVmaW5lIFZJUF9JTU1FRElBVEUgMDEJLyogQ2hhcmFjdGVyIGlzIGxpa2UgREVDICMgKi8KLSNkZWZpbmUgVklQX0lORElSRUNUICAwMgkvKiBDaGFyIGlzIGxpa2UgREVDIEAgKi8KLSNkZWZpbmUgVklQX0RJU1BMRU4gICAwNAkvKiBDaGFyIGlzIGxpa2UgREVDIF4gKi8KLQotI2RlZmluZSBJTU1FRElBVEVQKGMpCSh2aXBfbWV0YWNoYXJhY3RlcnMgWyhjKSYweGZmXSZWSVBfSU1NRURJQVRFKQotI2RlZmluZSBJTkRJUkVDVFAoYykJKHZpcF9tZXRhY2hhcmFjdGVycyBbKGMpJjB4ZmZdJlZJUF9JTkRJUkVDVCkKLSNkZWZpbmUgRElTUExFTlAoYykJKHZpcF9tZXRhY2hhcmFjdGVycyBbKGMpJjB4ZmZdJlZJUF9ESVNQTEVOKQotCi0vKiBXZSBhc3N1bWUgOCBiaXRzIHBlciBieXRlLiBVc2UgdmlwX29wX2RlZmF1bHRzKCkgdG8gc2V0IHRoZXNlIHVwIEJFRk9SRSB3ZQotICogYXJlIGV2ZXIgY2FsbGVkLgotICovCi0KLSNpZiBkZWZpbmVkKENPTlNUX1RBQkxFKQotI2RlZmluZSBfIDAsCi0jZGVmaW5lIEkgVklQX0lNTUVESUFURSwKLSNkZWZpbmUgUyBWSVBfSU5ESVJFQ1QsCi0jZGVmaW5lIEQgVklQX0RJU1BMRU4sCi1zdGF0aWMgY29uc3QgY2hhcgotdmlwX21ldGFjaGFyYWN0ZXJzWzI1Nl0gPQotewotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qIF5AIF5BIF5CIF5DIF5EIF5FIF5GIF5HIF5IIF5JIF5KIF5LIF5MIF5NIF5OIF5PKi8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKiBeUCBeUSBeUiBeUyBeVCBeVSBeViBeVyBeWCBeWSBeWiBeWyBeXCBeXSBeXiBeXyAqLwotICBfIF8gXyBfIEkgXyBfIF8gXyBfIFMgXyBfIF8gXyBfCS8qIHNwICEgICIgICMgICQgICUgICYgJyAgKCAgKSAgKiAgKyAgLCAgLSAgLiAgLyAqLwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgOiAgOyAgPCAgPSAgPiAgPyovCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLypAICBBICBCICBDICBEICBFICBGICBHICBIICBJICBKICBLICBMICBNICBOICBPKi8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwkvKlAgIFEgIFIgIFMgIFQgIFUgIFYgIFcgIFggIFkgIFogIFsgIFwgIF0gIF4gIF8qLwotICBEIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCS8qYCAgYSAgYiAgYyAgZCAgZSAgZiAgZyAgaCAgaSAgaiAgayAgbCAgbSAgbiAgbyovCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8JLypwICBxICByICBzICB0ICB1ICB2ICB3ICB4ICB5ICB6ICB7ICB8ICB9ICB+ICBePyovCi0KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi0gIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8KLSAgXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXwotICBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfIF8gXyBfCi19OwotI3VuZGVmIF8KLSN1bmRlZiBJCi0jdW5kZWYgUwotI3VuZGVmIEQKLSNlbHNlCi1zdGF0aWMgY2hhciB2aXBfbWV0YWNoYXJhY3RlcnNbMjU2XTsKLQotc3RhdGljIHZvaWQKLXZpcF9vcF8xIChiaXQsIHN5bXMpCi0gICAgIGludCBiaXQ7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bXM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgdDsKLQotICB3aGlsZSAoKHQgPSAqc3ltcysrKSAhPSAwKQotICAgIHZpcF9tZXRhY2hhcmFjdGVyc1t0XSB8PSBiaXQ7Ci19Ci0KLS8qIENhbiBiZSBjYWxsZWQgYW55IHRpbWUuICBNb3JlIGFyZ3VtZW50cyBtYXkgYXBwZWFyIGluIGZ1dHVyZS4gICovCi1zdGF0aWMgdm9pZCAKLXZpcF9vcF9kZWZhdWx0cyAoaW1tZWRpYXRlLCBpbmRpcmVjdCwgZGlzcGxlbikKLSAgICAgY29uc3QgY2hhciAqaW1tZWRpYXRlOwotICAgICBjb25zdCBjaGFyICppbmRpcmVjdDsKLSAgICAgY29uc3QgY2hhciAqZGlzcGxlbjsKLXsKLSAgdmlwX29wXzEgKFZJUF9JTU1FRElBVEUsIGltbWVkaWF0ZSk7Ci0gIHZpcF9vcF8xIChWSVBfSU5ESVJFQ1QsIGluZGlyZWN0KTsKLSAgdmlwX29wXzEgKFZJUF9ESVNQTEVOLCBkaXNwbGVuKTsKLX0KLQotI2VuZGlmCi0MCi0KLS8qCi0gKiBEZWMgZGVmaW5lcyB0aGUgc2VtYW50aWNzIG9mIGFkZHJlc3MgbW9kZXMgKGFuZCB2YWx1ZXMpCi0gKiBieSBhIHR3by1sZXR0ZXIgY29kZSwgZXhwbGFpbmVkIGhlcmUuCi0gKgotICogICBsZXR0ZXIgMTogICBhY2Nlc3MgdHlwZQotICoKLSAqICAgICBhICAgICAgICAgYWRkcmVzcyBjYWxjdWxhdGlvbiAtIG5vIGRhdGEgYWNjZXNzLCByZWdpc3RlcnMgZm9yYmlkZGVuCi0gKiAgICAgYiAgICAgICAgIGJyYW5jaCBkaXNwbGFjZW1lbnQKLSAqICAgICBtICAgICAgICAgcmVhZCAtIGxldCBnbyBvZiBidXMgLSB3cml0ZSBiYWNrICAgICJtb2RpZnkiCi0gKiAgICAgciAgICAgICAgIHJlYWQKLSAqICAgICB2ICAgICAgICAgYml0IGZpZWxkIGFkZHJlc3M6IGxpa2UgJ2EnIGJ1dCByZWdpc3RlcnMgYXJlIE9LCi0gKiAgICAgdyAgICAgICAgIHdyaXRlCi0gKiAgICAgc3BhY2UJIG5vIG9wZXJhdG9yIChlZyAiLmxvbmcgZm9vIikgW291ciBjb252ZW50aW9uXQotICoKLSAqICAgbGV0dGVyIDI6ICAgZGF0YSB0eXBlIChpLmUuIHdpZHRoLCBhbGlnbm1lbnQpCi0gKgotICogICAgIGIgICAgICAgICBieXRlCi0gKiAgICAgZCAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKEQgZm9ybWF0KQotICogICAgIGYgICAgICAgICBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IChGIGZvcm1hdCkKLSAqICAgICBnICAgICAgICAgRyBmb3JtYXQgZmxvYXRpbmcKLSAqICAgICBoICAgICAgICAgSCBmb3JtYXQgZmxvYXRpbmcKLSAqICAgICBsICAgICAgICAgbG9uZ3dvcmQKLSAqICAgICBvICAgICAgICAgb2N0YXdvcmQKLSAqICAgICBxICAgICAgICAgcXVhZHdvcmQKLSAqICAgICB3ICAgICAgICAgd29yZAotICogICAgID8JIHNpbXBsZSBzeW50aGV0aWMgYnJhbmNoIG9wZXJhbmQKLSAqICAgICAtCSB1bmNvbmRpdGlvbmFsIHN5bnRoZXRpYyBKU0IvSlNSIG9wZXJhbmQKLSAqICAgICAhCSBjb21wbGV4IHN5bnRoZXRpYyBicmFuY2ggb3BlcmFuZAotICoKLSAqIFRoZSAnLT8hJyBsZXR0ZXIgMidzIGFyZSBub3QgZm9yIGV4dGVybmFsIGNvbnN1bXB0aW9uLiBUaGV5IGFyZSB1c2VkCi0gKiBmb3IgdmFyaW91cyBhc3NlbWJsZXJzLiBHZW5lcmFsbHksIGFsbCB1bmtub3duIHdpZHRocyBhcmUgYXNzdW1lZCAwLgotICogV2UgZG9uJ3QgbGltaXQgeW91ciBjaG9pY2Ugb2Ygd2lkdGggY2hhcmFjdGVyLgotICoKLSAqIERFQyBvcGVyYW5kcyBhcmUgaGFyZCB3b3JrIHRvIHBhcnNlLiBGb3IgZXhhbXBsZSwgJ0AnIGFzIHRoZSBmaXJzdAotICogY2hhcmFjdGVyIG1lYW5zIGluZGlyZWN0IChkZWZlcnJlZCkgbW9kZSBidXQgZWxzd2hlcmUgaXQgaXMgYSBzaGlmdAotICogb3BlcmF0b3IuCi0gKiBUaGUgbG9uZy13aW5kZWQgZXhwbGFuYXRpb24gb2YgaG93IHRoaXMgaXMgc3VwcG9zZWQgdG8gd29yayBpcwotICogY2FuY2VsbGVkLiBSZWFkIGEgREVDIHZheCBtYW51YWwuCi0gKiBXZSB0cnkgaGFyZCBub3QgdG8gcGFyc2UgYW55dGhpbmcgdGhhdCBNSUdIVCBiZSBwYXJ0IG9mIHRoZSBleHByZXNzaW9uCi0gKiBidXJpZWQgaW4gdGhhdCBzeW50YXguIEZvciBleGFtcGxlIGlmIHdlIHNlZSBALi4uKFJuKSB3ZSBkb24ndCBjaGVjawotICogZm9yICctJyBiZWZvcmUgdGhlICcoJyBiZWNhdXNlIG1vZGUgQC0oUm4pIGRvZXMgbm90IGV4aXN0LgotICoKLSAqIEFmdGVyIHBhcnNpbmcgd2UgaGF2ZToKLSAqCi0gKiBhdCAgICAgICAgICAgICAgICAgICAgIDEgaWYgbGVhZGluZyAnQCcgKG9yIFVuKnggJyonKQotICogbGVuICAgICAgICAgICAgICAgICAgICB0YWtlcyBvbmUgdmFsdWUgZnJvbSAiIGJpbHN3Ii4gZWcgQl4gLT4gJ2InLgotICogaGFzaCAgICAgICAgICAgICAgICAgICAxIGlmIGxlYWRpbmcgJyMnIChvciBVbip4ICckJykKLSAqIGV4cHJfYmVnaW4sIGV4cHJfZW5kICAgdGhlIGV4cHJlc3Npb24gd2UgZGlkIG5vdCBwYXJzZQotICogICAgICAgICAgICAgICAgICAgICAgICBldmVuIHRob3VnaCB3ZSBkb24ndCBpbnRlcnByZXQgaXQsIHdlIG1ha2UgdXNlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG9mIGl0cyBwcmVzZW5jZSBvciBhYnNlbmNlLgotICogc2lnbiAgICAgICAgICAgICAgICAgICAtMTogLShSbikgICAgMDogYWJzZW50ICAgICsxOiAoUm4pKwotICogcGFyZW4gICAgICAgICAgICAgICAgICAxIGlmICgpIGFyZSBhcm91bmQgcmVnaXN0ZXIKLSAqIHJlZyAgICAgICAgICAgICAgICAgICAgbWFqb3IgcmVnaXN0ZXIgbnVtYmVyIDA6MTUgICAgLTEgbWVhbnMgYWJzZW50Ci0gKiBuZHggICAgICAgICAgICAgICAgICAgIGluZGV4IHJlZ2lzdGVyIG51bWJlciAwOjE1ICAgIC0xIG1lYW5zIGFic2VudAotICoKLSAqIEFnYWluLCBJIGRhcmUgbm90IGV4cGxhaW4gaXQ6IGp1c3QgdHJhY2UgQUxMIHRoZSBjb2RlIQotICovCi0MCi1zdGF0aWMgdm9pZAotdmlwX29wIChvcHRleHQsIHZvcFApCi0gICAgIC8qIHVzZXIncyBpbnB1dCBzdHJpbmcgZS5nLjogIkBCXmZvb0BiYXIoQVApW0ZQXToiICovCi0gICAgIGNoYXIgKm9wdGV4dDsKLSAgICAgLyogSW5wdXQgZmllbGRzOiB2b3BfYWNjZXNzLCB2b3Bfd2lkdGguCi0JT3V0cHV0IGZpZWxkczogX25keCwgX3JlZywgX21vZGUsIF9zaG9ydCwgX3dhcm4sCi0JX2Vycm9yIF9leHByX2JlZ2luLCBfZXhwcl9lbmQsIF9uYnl0ZXMuCi0Jdm9wX25ieXRlcyA6IG51bWJlciBvZiBieXRlcyBpbiBhIGRhdHVtLiAqLwotICAgICBzdHJ1Y3Qgdm9wICp2b3BQOwotewotICAvKiB0cmFjayBvcGVyYW5kIHRleHQgZm9yd2FyZCAqLwotICBjaGFyICpwOwotICAvKiB0cmFjayBvcGVyYW5kIHRleHQgYmFja3dhcmQgKi8KLSAgY2hhciAqcTsKLSAgLyogMSBpZiBsZWFkaW5nICdAJyAoJyonKSBzZWVuICovCi0gIGludCBhdDsKLSAgLyogb25lIG9mICIgYmlsc3ciICovCi0gIGNoYXIgbGVuOwotICAvKiAxIGlmIGxlYWRpbmcgJyMnICgnJCcpIHNlZW4gKi8KLSAgaW50IGhhc2g7Ci0gIC8qIC0xLCAwIG9yICsxICovCi0gIGludCBzaWduID0gMDsKLSAgLyogMSBpZiAoKSBzdXJyb3VuZCByZWdpc3RlciAqLwotICBpbnQgcGFyZW4gPSAwOwotICAvKiByZWdpc3RlciBudW1iZXIsIC0xOmFic2VudCAqLwotICBpbnQgcmVnID0gMDsKLSAgLyogaW5kZXggcmVnaXN0ZXIgbnVtYmVyIC0xOmFic2VudCAqLwotICBpbnQgbmR4ID0gMDsKLSAgLyogcmVwb3J0IGlsbGVnYWwgb3BlcmFuZCwgIiI9PU9LICovCi0gIC8qICIgIiBpcyBhIEZBS0UgZXJyb3I6IG1lYW5zIHdlIHdvbiAqLwotICAvKiBBTlkgZXJyIHRoYXQgYmVnaW5zIHdpdGggJyAnIGlzIGEgZmFrZS4gKi8KLSAgLyogIiAiIGlzIGNvbnZlcnRlZCB0byAiIiBiZWZvcmUgcmV0dXJuICovCi0gIGNvbnN0IGNoYXIgKmVycjsKLSAgLyogd2FybiBhYm91dCB3ZWlyZCBtb2RlcyBwZiBhZGRyZXNzICovCi0gIGNvbnN0IGNoYXIgKndybjsKLSAgLyogcHJlc2VydmUgcSBpbiBjYXNlIHdlIGJhY2t1cCAqLwotICBjaGFyICpvbGRxID0gTlVMTDsKLSAgLyogYnVpbGQgdXAgNC1iaXQgb3BlcmFuZCBtb2RlIGhlcmUgKi8KLSAgLyogbm90ZTogaW5kZXggbW9kZSBpcyBpbiBuZHgsIHRoaXMgaXMgKi8KLSAgLyogdGhlIG1ham9yIG1vZGUgb2Ygb3BlcmFuZCBhZGRyZXNzICovCi0gIGludCBtb2RlID0gMDsKLSAgLyoKLSAgICogTm90aWNlIGhvdyB3ZSBtb3ZlIHdyb25nLWFyZy10eXBlIGJ1Z3MgSU5TSURFIHRoaXMgbW9kdWxlOiBpZiB3ZQotICAgKiBnZXQgdGhlIHR5cGVzIHdyb25nIGJlbG93LCB3ZSBsb3NlIGF0IGNvbXBpbGUgdGltZSByYXRoZXIgdGhhbiBhdAotICAgKiBsaW50IG9yIHJ1biB0aW1lLgotICAgKi8KLSAgY2hhciBhY2Nlc3NfbW9kZTsJCS8qIHZvcF9hY2Nlc3MuICovCi0gIGNoYXIgd2lkdGg7CQkJLyogdm9wX3dpZHRoLiAqLwotCi0gIGFjY2Vzc19tb2RlID0gdm9wUC0+dm9wX2FjY2VzczsKLSAgd2lkdGggPSB2b3BQLT52b3Bfd2lkdGg7Ci0gIC8qIE5vbmUgb2Ygb3VyIGNvZGUgYnVncyAoeWV0KSwgbm8gdXNlciB0ZXh0IGVycm9ycywgbm8gd2FybmluZ3MKLSAgICAgZXZlbi4gICovCi0gIGVyciA9IHdybiA9IDA7Ci0KLSAgcCA9IG9wdGV4dDsKLQotICBpZiAoKnAgPT0gJyAnKQkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLwotICAgIHArKzsJCQkvKiBza2lwIG92ZXIgd2hpdGVzcGFjZSAqLwotCi0gIGlmICgoYXQgPSBJTkRJUkVDVFAgKCpwKSkgIT0gMCkKLSAgICB7CQkJCS8qIDEgaWYgKnA9PSdAJyhvciAnKicgZm9yIFVuKngpICovCi0gICAgICBwKys7CQkJLyogYXQgaXMgZGV0ZXJtaW5lZCAqLwotICAgICAgaWYgKCpwID09ICcgJykJCS8qIEV4cGVjdCBhbGwgd2hpdGVzcGFjZSByZWR1Y2VkIHRvICcgJy4gKi8KLQlwKys7CQkJLyogc2tpcCBvdmVyIHdoaXRlc3BhY2UgKi8KLSAgICB9Ci0KLSAgLyoKLSAgICogVGhpcyBjb2RlIGlzIHN1YnRsZS4gSXQgdHJpZXMgdG8gZGV0ZWN0IGFsbCBsZWdhbCAobGV0dGVyKSdeJwotICAgKiBidXQgaXQgZG9lc24ndCB3YXN0ZSB0aW1lIGV4cGxpY2l0bHkgdGVzdGluZyBmb3IgcHJlbWF0dXJlICdcMCcgYmVjYXVzZQotICAgKiB0aGlzIGNhc2UgaXMgcmVqZWN0ZWQgYXMgYSBtaXNtYXRjaCBhZ2FpbnN0IGVpdGhlciAobGV0dGVyKSBvciAnXicuCi0gICAqLwotICB7Ci0gICAgY2hhciBjOwotCi0gICAgYyA9ICpwOwotICAgIGlmIChpc3VwcGVyIChjKSkKLSAgICAgIGMgPSB0b2xvd2VyIChjKTsKLSAgICBpZiAoRElTUExFTlAgKHBbMV0pICYmIHN0cmNociAoImJpbHdzIiwgbGVuID0gYykpCi0gICAgICBwICs9IDI7CQkJLyogc2tpcCAobGV0dGVyKSAnXicgKi8KLSAgICBlbHNlCQkJLyogbm8gKGxldHRlcikgJ14nIHNlZW4gKi8KLSAgICAgIGxlbiA9ICcgJzsJCS8qIGxlbiBpcyBkZXRlcm1pbmVkICovCi0gIH0KLQotICBpZiAoKnAgPT0gJyAnKQkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLwotICAgIHArKzsJCQkvKiBza2lwIG92ZXIgd2hpdGVzcGFjZSAqLwotCi0gIGlmICgoaGFzaCA9IElNTUVESUFURVAgKCpwKSkgIT0gMCkJLyogMSBpZiAqcD09JyMnICgnJCcgZm9yIFVuKngpICovCi0gICAgcCsrOwkJCS8qIGhhc2ggaXMgZGV0ZXJtaW5lZCAqLwotCi0gIC8qCi0gICAqIHAgcG9pbnRzIHRvIHdoYXQgbWF5IGJlIHRoZSBiZWdpbm5pbmcgb2YgYW4gZXhwcmVzc2lvbi4KLSAgICogV2UgaGF2ZSBwZWVsZWQgb2ZmIHRoZSBmcm9udCBhbGwgdGhhdCBpcyBwZWVsYWJsZS4KLSAgICogV2Uga25vdyBhdCwgbGVuLCBoYXNoLgotICAgKgotICAgKiBMZXRzIHBvaW50IHEgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dCBhbmQgcGFyc2UgdGhhdCAoYmFja3dhcmRzKS4KLSAgICovCi0KLSAgZm9yIChxID0gcDsgKnE7IHErKykKLSAgICA7Ci0gIHEtLTsJCQkJLyogbm93IHEgcG9pbnRzIGF0IGxhc3QgY2hhciBvZiB0ZXh0ICovCi0MCi0gIGlmICgqcSA9PSAnICcgJiYgcSA+PSBwKQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0gICAgcS0tOwotICAvKiByZXZlcnNlIG92ZXIgd2hpdGVzcGFjZSwgYnV0IGRvbid0ICovCi0gIC8qIHJ1biBiYWNrIG92ZXIgKnAgKi8KLQotICAvKgotICAgKiBBcyBhIG1hdHRlciBvZiBwb2xpY3kgaGVyZSwgd2UgbG9vayBmb3IgW1JuXSwgYWx0aG91Z2ggYm90aCBSbiBhbmQgU14jCi0gICAqIGZvcmJpZCBbUm5dLiBUaGlzIGlzIGJlY2F1c2UgaXQgaXMgZWFzeSwgYW5kIGJlY2F1c2Ugb25seSBhIHNpY2sKLSAgICogY3lib3JnIHdvdWxkIGhhdmUgWy4uLl0gdHJhaWxpbmcgYW4gZXhwcmVzc2lvbiBpbiBhIFZBWC1saWtlIGFzc2VtYmxlci4KLSAgICogQSBtZXRpY3Vsb3VzIHBhcnNlciB3b3VsZCBmaXJzdCBjaGVjayBmb3IgUm4gZm9sbG93ZWQgYnkgJygnIG9yICdbJwotICAgKiBhbmQgbm90IHBhcnNlIGEgdHJhaWxpbmcgJ10nIGlmIGl0IGZvdW5kIGFub3RoZXIuIFdlIGp1c3QgYmFuIGV4cHJlc3Npb25zCi0gICAqIGVuZGluZyBpbiAnXScuCi0gICAqLwotICBpZiAoKnEgPT0gJ10nKQotICAgIHsKLSAgICAgIHdoaWxlIChxID49IHAgJiYgKnEgIT0gJ1snKQotCXEtLTsKLSAgICAgIC8qIGVpdGhlciBxPHAgb3Igd2UgZ290IG1hdGNoaW5nICdbJyAqLwotICAgICAgaWYgKHEgPCBwKQotCWVyciA9IF8oIm5vICdbJyB0byBtYXRjaCAnXSciKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogQ29uZnVzZXJzIGxpa2UgIltdIiB3aWxsIGV2ZW50dWFsbHkgbG9zZSB3aXRoIGEgYmFkIHJlZ2lzdGVyCi0JICAgKiBuYW1lIGVycm9yLiBTbyBhZ2FpbiB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGZvciBlYXJseSAnXDAnLgotCSAgICovCi0JICBpZiAocVszXSA9PSAnXScpCi0JICAgIG5keCA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIDApOwotCSAgZWxzZSBpZiAocVs0XSA9PSAnXScpCi0JICAgIG5keCA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIHFbM10pOwotCSAgZWxzZQotCSAgICBuZHggPSAtMTsKLQkgIC8qCi0JICAgKiBTaW5jZSB3ZSBzYXcgYSAnXScgd2Ugd2lsbCBkZW1hbmQgYSByZWdpc3RlciBuYW1lIGluIHRoZSBbXS4KLQkgICAqIElmIGx1c2VyIGhhc24ndCBnaXZlbiB1cyBvbmU6IGJlIHJ1ZGUuCi0JICAgKi8KLQkgIGlmIChuZHggPCAwKQotCSAgICBlcnIgPSBfKCJiYWQgcmVnaXN0ZXIgaW4gW10iKTsKLQkgIGVsc2UgaWYgKG5keCA9PSBQQykKLQkgICAgZXJyID0gXygiW1BDXSBpbmRleCBiYW5uZWQiKTsKLQkgIGVsc2UKLQkgICAgcS0tOwkJLyogcG9pbnQgcSBqdXN0IGJlZm9yZSAiWy4uLl0iICovCi0JfQotICAgIH0KLSAgZWxzZQotICAgIG5keCA9IC0xOwkJCS8qIG5vICddJywgc28gbm8gaU5EZVggcmVnaXN0ZXIgKi8KLQotICAvKgotICAgKiBJZiBlcnIgPSAiLi4uIiB0aGVuIHdlIGxvc3Q6IHJ1biBhd2F5LgotICAgKiBPdGhlcndpc2UgbmR4ID09IC0xIGlmIHRoZXJlIHdhcyBubyAiWy4uLl0iLgotICAgKiBPdGhlcndpc2UsIG5keCBpcyBpbmRleCByZWdpc3RlciBudW1iZXIsIGFuZCBxIHBvaW50cyBiZWZvcmUgIlsuLi5dIi4KLSAgICovCi0MCi0gIGlmICgqcSA9PSAnICcgJiYgcSA+PSBwKQkvKiBFeHBlY3QgYWxsIHdoaXRlc3BhY2UgcmVkdWNlZCB0byAnICcuICovCi0gICAgcS0tOwotICAvKiByZXZlcnNlIG92ZXIgd2hpdGVzcGFjZSwgYnV0IGRvbid0ICovCi0gIC8qIHJ1biBiYWNrIG92ZXIgKnAgKi8KLSAgaWYgKCFlcnIgfHwgISplcnIpCi0gICAgewotICAgICAgc2lnbiA9IDA7CQkJLyogbm8gKCkrIG9yIC0oKSBzZWVuIHlldCAqLwotCi0gICAgICBpZiAocSA+IHAgKyAzICYmICpxID09ICcrJyAmJiBxWy0xXSA9PSAnKScpCi0JewotCSAgc2lnbiA9IDE7CQkvKiB3ZSBzYXcgYSAiKSsiICovCi0JICBxLS07CQkJLyogcSBwb2ludHMgdG8gJyknICovCi0JfQotCi0gICAgICBpZiAoKnEgPT0gJyknICYmIHEgPiBwICsgMikKLQl7Ci0JICBwYXJlbiA9IDE7CQkvKiBhc3N1bWUgd2UgaGF2ZSAiKC4uLikiICovCi0JICB3aGlsZSAocSA+PSBwICYmICpxICE9ICcoJykKLQkgICAgcS0tOwotCSAgLyogZWl0aGVyIHE8cCBvciB3ZSBnb3QgbWF0Y2hpbmcgJygnICovCi0JICBpZiAocSA8IHApCi0JICAgIGVyciA9IF8oIm5vICcoJyB0byBtYXRjaCAnKSciKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogQ29uZnVzZXJzIGxpa2UgIigpIiB3aWxsIGV2ZW50dWFsbHkgbG9zZSB3aXRoIGEgYmFkIHJlZ2lzdGVyCi0JICAgICAgICogbmFtZSBlcnJvci4gU28gYWdhaW4gd2UgZG9uJ3QgbmVlZCB0byBjaGVjayBmb3IgZWFybHkgJ1wwJy4KLQkgICAgICAgKi8KLQkgICAgICBpZiAocVszXSA9PSAnKScpCi0JCXJlZyA9IHZheF9yZWdfcGFyc2UgKHFbMV0sIHFbMl0sIDApOwotCSAgICAgIGVsc2UgaWYgKHFbNF0gPT0gJyknKQotCQlyZWcgPSB2YXhfcmVnX3BhcnNlIChxWzFdLCBxWzJdLCBxWzNdKTsKLQkgICAgICBlbHNlCi0JCXJlZyA9IC0xOwotCSAgICAgIC8qCi0JICAgICAgICogU2luY2Ugd2Ugc2F3IGEgJyknIHdlIHdpbGwgZGVtYW5kIGEgcmVnaXN0ZXIgbmFtZSBpbiB0aGUgJyknLgotCSAgICAgICAqIFRoaXMgaXMgbmFzdHk6IHdoeSBjYW4ndCBvdXIgaHlwb3RoZXRpY2FsIGFzc2VtYmxlciBwZXJtaXQKLQkgICAgICAgKiBwYXJlbnRoZXNpc2VkIGV4cHJlc3Npb25zPyBCRUNBVVNFIEkgQU0gTEFaWSEgVGhhdCBpcyB3aHkuCi0JICAgICAgICogQWJ1c2UgbHVzZXIgaWYgd2UgZGlkbid0IHNweSBhIHJlZ2lzdGVyIG5hbWUuCi0JICAgICAgICovCi0JICAgICAgaWYgKHJlZyA8IDApCi0JCXsKLQkJICAvKiBKRiBhbGxvdyBwYXJlbnRoYXNpemVkIGV4cHJlc3Npb25zLiAgSSBob3BlIHRoaXMgd29ya3MgKi8KLQkJICBwYXJlbiA9IDA7Ci0JCSAgd2hpbGUgKCpxICE9ICcpJykKLQkJICAgIHErKzsKLQkJICAvKiBlcnIgPSAidW5rbm93biByZWdpc3RlciBpbiAoKSI7ICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXEtLTsJCS8qIHBvaW50IGp1c3QgYmVmb3JlICcoJyBvZiAiKC4uLikiICovCi0JICAgICAgLyoKLQkgICAgICAgKiBJZiBlcnIgPT0gIi4uLiIgdGhlbiB3ZSBsb3N0LiBSdW4gYXdheS4KLQkgICAgICAgKiBPdGhlcndpc2UgaWYgcmVnID49IDAgdGhlbiB3ZSBzYXcgKFJuKS4KLQkgICAgICAgKi8KLQkgICAgfQotCSAgLyoKLQkgICAqIElmIGVyciA9PSAiLi4uIiB0aGVuIHdlIGxvc3QuCi0JICAgKiBPdGhlcndpc2UgcGFyZW49PTEgYW5kIHJlZyA9IHJlZ2lzdGVyIGluICIoKSIuCi0JICAgKi8KLQl9Ci0gICAgICBlbHNlCi0JcGFyZW4gPSAwOwotICAgICAgLyoKLSAgICAgICAqIElmIGVyciA9PSAiLi4uIiB0aGVuIHdlIGxvc3QuCi0gICAgICAgKiBPdGhlcndpc2UsIHEgcG9pbnRzIGp1c3QgYmVmb3JlICIoUm4pIiwgaWYgYW55LgotICAgICAgICogSWYgdGhlcmUgd2FzIGEgIiguLi4pIiB0aGVuIHBhcmVuPT0xLCBhbmQgcmVnIGlzIHRoZSByZWdpc3Rlci4KLSAgICAgICAqLwotDAotICAgICAgLyoKLSAgICAgICAqIFdlIHNob3VsZCBvbmx5IHNlZWsgJy0nIG9mICItKC4uLikiIGlmOgotICAgICAgICogICB3ZSBzYXcgIiguLi4pIiAgICAgICAgICAgICAgICAgICAgcGFyZW4gPT0gMQotICAgICAgICogICB3ZSBoYXZlIG5vIGVycm9ycyBzbyBmYXIgICAgICAgICAgISAqZXJyCi0gICAgICAgKiAgIHdlIGRpZCBub3Qgc2VlICcrJyBvZiAiKC4uLikrIiAgICBzaWduIDwgMQotICAgICAgICogV2UgZG9uJ3QgY2hlY2sgbGVuLiBXZSB3YW50IGEgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSBsYXRlciBpZgotICAgICAgICogdXNlciB0cmllcyAieF4uLi4tKFJuKSIuIFRoaXMgaXMgYSBmZWF0dXJlIG5vdCBhIGJ1Zy4KLSAgICAgICAqLwotICAgICAgaWYgKCFlcnIgfHwgISplcnIpCi0JewotCSAgaWYgKHBhcmVuICYmIHNpZ24gPCAxKS8qICFzaWduIGlzIGFkZXF1YXRlIHRlc3QgKi8KLQkgICAgewotCSAgICAgIGlmICgqcSA9PSAnLScpCi0JCXsKLQkJICBzaWduID0gLTE7Ci0JCSAgcS0tOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBXZSBoYXZlIGJhY2stdHJhY2tlZCBvdmVyIG1vc3QKLQkgICAqIG9mIHRoZSBjcnVkIGF0IHRoZSBlbmQgb2YgYW4gb3BlcmFuZC4KLQkgICAqIFVubGVzcyBlcnIsIHdlIGtub3c6IHNpZ24sIHBhcmVuLiBJZiBwYXJlbiwgd2Uga25vdyByZWcuCi0JICAgKiBUaGUgbGFzdCBjYXNlIGlzIG9mIGFuIGV4cHJlc3Npb24gIlJuIi4KLQkgICAqIFRoaXMgaXMgd29ydGggaHVudGluZyBmb3IgaWYgIWVyciwgIXBhcmVuLgotCSAgICogV2Ugd291bGRuJ3QgYmUgaGVyZSBpZiBlcnIuCi0JICAgKiBXZSByZW1lbWJlciB0byBzYXZlIHEsIGluIGNhc2Ugd2UgZGlkbid0IHdhbnQgIlJuIiBhbnl3YXkuCi0JICAgKi8KLQkgIGlmICghcGFyZW4pCi0JICAgIHsKLQkgICAgICBpZiAoKnEgPT0gJyAnICYmIHEgPj0gcCkJLyogRXhwZWN0IGFsbCB3aGl0ZXNwYWNlIHJlZHVjZWQgdG8gJyAnLiAqLwotCQlxLS07Ci0JICAgICAgLyogcmV2ZXJzZSBvdmVyIHdoaXRlc3BhY2UsIGJ1dCBkb24ndCAqLwotCSAgICAgIC8qIHJ1biBiYWNrIG92ZXIgKnAgKi8KLQkgICAgICBpZiAocSA+IHAgJiYgcSA8IHAgKyAzKQkvKiByb29tIGZvciBSbiBvciBSbm4gZXhhY3RseT8gKi8KLQkJcmVnID0gdmF4X3JlZ19wYXJzZSAocFswXSwgcFsxXSwgcSA8IHAgKyAyID8gMCA6IHBbMl0pOwotCSAgICAgIGVsc2UKLQkJcmVnID0gLTE7CS8qIGFsd2F5cyBjb21lcyBoZXJlIGlmIG5vIHJlZ2lzdGVyIGF0IGFsbCAqLwotCSAgICAgIC8qCi0JICAgICAgICogSGVyZSB3aXRoIGEgZGVmaW5pdGl2ZSByZWcgdmFsdWUuCi0JICAgICAgICovCi0JICAgICAgaWYgKHJlZyA+PSAwKQotCQl7Ci0JCSAgb2xkcSA9IHE7Ci0JCSAgcSA9IHAgLSAxOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICAvKgotICAgKiBoYXZlIHJlZy4gLTE6YWJzZW50OyBlbHNlIDA6MTUKLSAgICovCi0KLSAgLyoKLSAgICogV2UgaGF2ZTogIGVyciwgYXQsIGxlbiwgaGFzaCwgbmR4LCBzaWduLCBwYXJlbiwgcmVnLgotICAgKiBBbHNvLCBhbnkgcmVtYWluaW5nIGV4cHJlc3Npb24gaXMgZnJvbSAqcCB0aHJvdWdoICpxIGluY2x1c2l2ZS4KLSAgICogU2hvdWxkIHRoZXJlIGJlIG5vIGV4cHJlc3Npb24sIHE9PXAtMS4gU28gZXhwcmVzc2lvbiBsZW5ndGggPSBxLXArMS4KLSAgICogVGhpcyBjb21wbGV0ZXMgdGhlIGZpcnN0IHBhcnQ6IHBhcnNpbmcgdGhlIG9wZXJhbmQgdGV4dC4KLSAgICovCi0MCi0gIC8qCi0gICAqIFdlIG5vdyB3YW50IHRvIGJvaWwgdGhlIGRhdGEgZG93biwgY2hlY2tpbmcgY29uc2lzdGVuY3kgb24gdGhlIHdheS4KLSAgICogV2Ugd2FudDogIGxlbiwgbW9kZSwgcmVnLCBuZHgsIGVyciwgcCwgcSwgd3JuLCBidWcuCi0gICAqIFdlIHdpbGwgZGVsaXZlciBhIDQtYml0IHJlZywgYW5kIGEgNC1iaXQgbW9kZS4KLSAgICovCi0KLSAgLyoKLSAgICogQ2FzZSBvZiBicmFuY2ggb3BlcmFuZC4gRGlmZmVyZW50LiBObyBMXkJeV15JXlNeIGFsbG93ZWQgZm9yIGluc3RhbmNlLgotICAgKgotICAgKiBpbjogIGF0CT8KLSAgICogICAgICBsZW4JPwotICAgKiAgICAgIGhhc2gJPwotICAgKiAgICAgIHA6cQk/Ci0gICAqICAgICAgc2lnbiAgPwotICAgKiAgICAgIHBhcmVuCT8KLSAgICogICAgICByZWcgICA/Ci0gICAqICAgICAgbmR4ICAgPwotICAgKgotICAgKiBvdXQ6IG1vZGUgIDAKLSAgICogICAgICByZWcgICAtMQotICAgKiAgICAgIGxlbgknICcKLSAgICogICAgICBwOnEJd2hhdGV2ZXIgd2FzIGlucHV0Ci0gICAqICAgICAgbmR4CS0xCi0gICAqICAgICAgZXJyCSIgIgkJIG9yIGVycm9yIG1lc3NhZ2UsIGFuZCBvdGhlciBvdXRwdXRzIHRyYXNoZWQKLSAgICovCi0gIC8qIGJyYW5jaCBvcGVyYW5kcyBoYXZlIHJlc3RyaWN0ZWQgZm9ybXMgKi8KLSAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBhY2Nlc3NfbW9kZSA9PSAnYicpCi0gICAgewotICAgICAgaWYgKGF0IHx8IGhhc2ggfHwgc2lnbiB8fCBwYXJlbiB8fCBuZHggPj0gMCB8fCByZWcgPj0gMCB8fCBsZW4gIT0gJyAnKQotCWVyciA9IF8oImludmFsaWQgYnJhbmNoIG9wZXJhbmQiKTsKLSAgICAgIGVsc2UKLQllcnIgPSAiICI7Ci0gICAgfQotDAotICAvKiBTaW5jZSBub2JvZHkgc2VlbXMgdG8gdXNlIGl0OiBjb21tZW50IHRoaXMgJ2ZlYXR1cmUnKD8pIG91dCBmb3Igbm93LiAqLwotI2lmZGVmIE5FVkVSCi0gIC8qCi0gICAqIENhc2Ugb2Ygc3RhbmQtYWxvbmUgb3BlcmFuZC4gZS5nLiAiLmxvbmcgZm9vIgotICAgKgotICAgKiBpbjogIGF0CT8KLSAgICogICAgICBsZW4JPwotICAgKiAgICAgIGhhc2gJPwotICAgKiAgICAgIHA6cQk/Ci0gICAqICAgICAgc2lnbiAgPwotICAgKiAgICAgIHBhcmVuCT8KLSAgICogICAgICByZWcgICA/Ci0gICAqICAgICAgbmR4ICAgPwotICAgKgotICAgKiBvdXQ6IG1vZGUgIDAKLSAgICogICAgICByZWcgICAtMQotICAgKiAgICAgIGxlbgknICcKLSAgICogICAgICBwOnEJd2hhdGV2ZXIgd2FzIGlucHV0Ci0gICAqICAgICAgbmR4CS0xCi0gICAqICAgICAgZXJyCSIgIgkJIG9yIGVycm9yIG1lc3NhZ2UsIGFuZCBvdGhlciBvdXRwdXRzIHRyYXNoZWQKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgYWNjZXNzX21vZGUgPT0gJyAnKQotICAgIHsKLSAgICAgIGlmIChhdCkKLQllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyBAIik7Ci0gICAgICBlbHNlIGlmIChoYXNoKQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzICMiKTsKLSAgICAgIGVsc2UgaWYgKHNpZ24pCi0JewotCSAgaWYgKHNpZ24gPCAwKQotCSAgICBlcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyAtKCkiKTsKLQkgIGVsc2UKLQkgICAgZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgKCkrIik7Ci0JfQotICAgICAgZWxzZSBpZiAocGFyZW4pCi0JZXJyID0gXygiYWRkcmVzcyBwcm9oaWJpdHMgKCkiKTsKLSAgICAgIGVsc2UgaWYgKG5keCA+PSAwKQotCWVyciA9IF8oImFkZHJlc3MgcHJvaGliaXRzIFtdIik7Ci0gICAgICBlbHNlIGlmIChyZWcgPj0gMCkKLQllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyByZWdpc3RlciIpOwotICAgICAgZWxzZSBpZiAobGVuICE9ICcgJykKLQllcnIgPSBfKCJhZGRyZXNzIHByb2hpYml0cyBkaXNwbGFjZW1lbnQgbGVuZ3RoIHNwZWNpZmllciIpOwotICAgICAgZWxzZQotCXsKLQkgIGVyciA9ICIgIjsJLyogc3VjY2VlZCAqLwotCSAgbW9kZSA9IDA7Ci0JfQotICAgIH0KLSNlbmRpZiAvKiNJZmRlZiBORVZFUiovCi0MCi0gIC8qCi0gICAqIENhc2Ugb2YgU14jLgotICAgKgotICAgKiBpbjogIGF0ICAgICAgIDAKLSAgICogICAgICBsZW4gICAgICAncycgICAgICAgICAgICAgICBkZWZpbml0aW9uCi0gICAqICAgICAgaGFzaCAgICAgMSAgICAgICAgICAgICAgZGVtYW5kCi0gICAqICAgICAgcDpxICAgICAgICAgICAgICAgICAgICAgICAgZGVtYW5kIG5vdCBlbXB0eQotICAgKiAgICAgIHNpZ24gICAgIDAgICAgICAgICAgICAgICAgIGJ5IHBhcmVuPT0wCi0gICAqICAgICAgcGFyZW4gICAgMCAgICAgICAgICAgICBieSAiKCkiIHNjYW4gbG9naWMgYmVjYXVzZSAiU14iIHNlZW4KLSAgICogICAgICByZWcgICAgICAtMSAgICAgICAgICAgICAgICBvciBubiBieSBtaXN0YWtlCi0gICAqICAgICAgbmR4ICAgICAgLTEKLSAgICoKLSAgICogb3V0OiBtb2RlICAgICAwCi0gICAqICAgICAgcmVnICAgICAgLTEKLSAgICogICAgICBsZW4gICAgICAncycKLSAgICogICAgICBleHAKLSAgICogICAgICBuZHggICAgICAtMQotICAgKi8KLSAgaWYgKCghZXJyIHx8ICEqZXJyKSAmJiBsZW4gPT0gJ3MnKQotICAgIHsKLSAgICAgIGlmICghaGFzaCB8fCBwYXJlbiB8fCBhdCB8fCBuZHggPj0gMCkKLQllcnIgPSBfKCJpbnZhbGlkIG9wZXJhbmQgb2YgU14jIik7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJlZyA+PSAwKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBTSElUISB3ZSBzYXcgU14jUm5uICEgcHV0IHRoZSBSbm4gYmFjayBpbgotCSAgICAgICAqIGV4cHJlc3Npb24uIEtMVURHRSEgVXNlIG9sZHEgc28gd2UgZG9uJ3QKLQkgICAgICAgKiBuZWVkIHRvIGtub3cgZXhhY3QgbGVuZ3RoIG9mIHJlZyBuYW1lLgotCSAgICAgICAqLwotCSAgICAgIHEgPSBvbGRxOwotCSAgICAgIHJlZyA9IDA7Ci0JICAgIH0KLQkgIC8qCi0JICAgKiBXZSBoYXZlIGFsbCB0aGUgZXhwcmVzc2lvbiB3ZSB3aWxsIGV2ZXIgZ2V0LgotCSAgICovCi0JICBpZiAocCA+IHEpCi0JICAgIGVyciA9IF8oIlNeIyBuZWVkcyBleHByZXNzaW9uIik7Ci0JICBlbHNlIGlmIChhY2Nlc3NfbW9kZSA9PSAncicpCi0JICAgIHsKLQkgICAgICBlcnIgPSAiICI7CS8qIFdJTiEgKi8KLQkgICAgICBtb2RlID0gMDsKLQkgICAgfQotCSAgZWxzZQotCSAgICBlcnIgPSBfKCJTXiMgbWF5IG9ubHkgcmVhZC1hY2Nlc3MiKTsKLQl9Ci0gICAgfQotDAotICAvKgotICAgKiBDYXNlIG9mIC0oUm4pLCB3aGljaCBpcyB3ZWlyZCBjYXNlLgotICAgKgotICAgKiBpbjogIGF0ICAgICAgIDAKLSAgICogICAgICBsZW4gICAgICAnCi0gICAqICAgICAgaGFzaCAgICAgMAotICAgKiAgICAgIHA6cSAgICAgIHE8cAotICAgKiAgICAgIHNpZ24gICAgIC0xICAgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBwYXJlbiAgICAxICAgICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgcmVnICAgICAgcHJlc2VudCAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCi0gICAqCi0gICAqIG91dDogbW9kZSAgICAgNwotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQKLSAgICogICAgICBsZW4gICAgICAnICcKLSAgICogICAgICBleHAgICAgICAiIiAgICAgICAgICAgICAgICBlbmZvcmNlIGVtcHR5IGV4cHJlc3Npb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbCAgICAgICAgICB3YXJuIGlmIHNhbWUgYXMgcmVnCi0gICAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmIHNpZ24gPCAwKQotICAgIHsKLSAgICAgIGlmIChsZW4gIT0gJyAnIHx8IGhhc2ggfHwgYXQgfHwgcCA8PSBxKQotCWVyciA9IF8oImludmFsaWQgb3BlcmFuZCBvZiAtKCkiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBlcnIgPSAiICI7CQkvKiB3aW4gKi8KLQkgIG1vZGUgPSA3OwotCSAgaWYgKHJlZyA9PSBQQykKLQkgICAgd3JuID0gXygiLShQQykgdW5wcmVkaWN0YWJsZSIpOwotCSAgZWxzZSBpZiAocmVnID09IG5keCkKLQkgICAgd3JuID0gXygiW11pbmRleCBzYW1lIGFzIC0oKXJlZ2lzdGVyOiB1bnByZWRpY3RhYmxlIik7Ci0JfQotICAgIH0KLQwKLSAgLyoKLSAgICogV2UgY29udmVydCAiKFJuKSIgdG8gIkBSbiIgZm9yIG91ciBjb252ZW5pZW5jZS4KLSAgICogKEkgaG9wZSB0aGlzIGlzIGNvbnZlbmllbnQ6IGhhcyBzb21lb25lIGdvdCBhIGJldHRlciB3YXkgdG8gcGFyc2UgdGhpcz8pCi0gICAqIEEgc2lkZS1lZmZlY3Qgb2YgdGhpcyBpcyB0aGF0ICJAUm4iIGlzIGEgdmFsaWQgb3BlcmFuZC4KLSAgICovCi0gIGlmIChwYXJlbiAmJiAhc2lnbiAmJiAhaGFzaCAmJiAhYXQgJiYgbGVuID09ICcgJyAmJiBwID4gcSkKLSAgICB7Ci0gICAgICBhdCA9IDE7Ci0gICAgICBwYXJlbiA9IDA7Ci0gICAgfQotCi0gIC8qCi0gICAqIENhc2Ugb2YgKFJuKSssIHdoaWNoIGlzIHNsaWdodGx5IGRpZmZlcmVudC4KLSAgICoKLSAgICogaW46ICBhdAotICAgKiAgICAgIGxlbiAgICAgICcgJwotICAgKiAgICAgIGhhc2ggICAgIDAKLSAgICogICAgICBwOnEgICAgICBxPHAKLSAgICogICAgICBzaWduICAgICArMSAgICAgICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgcGFyZW4gICAgMSAgICAgICAgICAgICAgYnkgZGVmaW5pdGlvbgotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbAotICAgKgotICAgKiBvdXQ6IG1vZGUgICAgIDgrQAotICAgKiAgICAgIHJlZyAgICAgIHByZXNlbnQKLSAgICogICAgICBsZW4gICAgICAnICcKLSAgICogICAgICBleHAgICAgICAiIiAgICAgICAgICAgICAgICBlbmZvcmNlIGVtcHR5IGV4cHJlc3Npb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbCAgICAgICAgICB3YXJuIGlmIHNhbWUgYXMgcmVnCi0gICAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmIHNpZ24gPiAwKQotICAgIHsKLSAgICAgIGlmIChsZW4gIT0gJyAnIHx8IGhhc2ggfHwgcCA8PSBxKQotCWVyciA9IF8oImludmFsaWQgb3BlcmFuZCBvZiAoKSsiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBlcnIgPSAiICI7CQkvKiB3aW4gKi8KLQkgIG1vZGUgPSA4ICsgKGF0ID8gMSA6IDApOwotCSAgaWYgKHJlZyA9PSBQQykKLQkgICAgd3JuID0gXygiKFBDKSsgdW5wcmVkaWN0YWJsZSIpOwotCSAgZWxzZSBpZiAocmVnID09IG5keCkKLQkgICAgd3JuID0gXygiW11pbmRleCBzYW1lIGFzICgpK3JlZ2lzdGVyOiB1bnByZWRpY3RhYmxlIik7Ci0JfQotICAgIH0KLQwKLSAgLyoKLSAgICogQ2FzZSBvZiAjLCB3aXRob3V0IFNeLgotICAgKgotICAgKiBpbjogIGF0Ci0gICAqICAgICAgbGVuICAgICAgJyAnIG9yICdpJwotICAgKiAgICAgIGhhc2ggICAgIDEgICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICBwOnEKLSAgICogICAgICBzaWduICAgICAwCi0gICAqICAgICAgcGFyZW4gICAgMAotICAgKiAgICAgIHJlZyAgICAgIGFic2VudAotICAgKiAgICAgIG5keCAgICAgIG9wdGlvbmFsCi0gICAqCi0gICAqIG91dDogbW9kZSAgICAgOCtACi0gICAqICAgICAgcmVnICAgICAgUEMKLSAgICogICAgICBsZW4gICAgICAnICcgb3IgJ2knCi0gICAqICAgICAgZXhwCi0gICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKLSAgICovCi0gIGlmICgoIWVyciB8fCAhKmVycikgJiYgaGFzaCkKLSAgICB7Ci0gICAgICBpZiAobGVuICE9ICdpJyAmJiBsZW4gIT0gJyAnKQotCWVyciA9IF8oIiMgY29uZmxpY3RzIGxlbmd0aCIpOwotICAgICAgZWxzZSBpZiAocGFyZW4pCi0JZXJyID0gXygiIyBiYXJzIHJlZ2lzdGVyIik7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHJlZyA+PSAwKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBTSElUISB3ZSBzYXcgI1JubiEgUHV0IHRoZSBSbm4gYmFjayBpbnRvIHRoZSBleHByZXNzaW9uLgotCSAgICAgICAqIEJ5IHVzaW5nIG9sZHEsIHdlIGRvbid0IG5lZWQgdG8ga25vdyBob3cgbG9uZyBSbm4gd2FzLgotCSAgICAgICAqIEtMVURHRSEKLQkgICAgICAgKi8KLQkgICAgICBxID0gb2xkcTsKLQkgICAgICByZWcgPSAtMTsJCS8qIG5vIHJlZ2lzdGVyIGFueSBtb3JlICovCi0JICAgIH0KLQkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLwotCi0JICAvKiBKRiBhIGJ1Z2ZpeCwgSSB0aGluayEgKi8KLQkgIGlmIChhdCAmJiBhY2Nlc3NfbW9kZSA9PSAnYScpCi0JICAgIHZvcFAtPnZvcF9uYnl0ZXMgPSA0OwotCi0JICBtb2RlID0gKGF0ID8gOSA6IDgpOwotCSAgcmVnID0gUEM7Ci0JICBpZiAoKGFjY2Vzc19tb2RlID09ICdtJyB8fCBhY2Nlc3NfbW9kZSA9PSAndycpICYmICFhdCkKLQkgICAgd3JuID0gXygid3JpdGluZyBvciBtb2RpZnlpbmcgIyBpcyB1bnByZWRpY3RhYmxlIik7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogSWYgISplcnIsIHRoZW4gICAgICAgIHNpZ24gPT0gMAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgaGFzaCA9PSAwCi0gICAqLwotDAotICAvKgotICAgKiBDYXNlIG9mIFJuLiBXZSBzZXBlcmF0ZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGhhcyBhIGZldyBzcGVjaWFsCi0gICAqIGVycm9ycyB0aGUgcmVtYWluaW5nIG1vZGVzIGxhY2suCi0gICAqCi0gICAqIGluOiAgYXQgICAgICAgb3B0aW9uYWwKLSAgICogICAgICBsZW4gICAgICAnICcKLSAgICogICAgICBoYXNoICAgICAwICAgICAgICAgICAgIGJ5IHByb2dyYW0gbG9naWMKLSAgICogICAgICBwOnEgICAgICBlbXB0eQotICAgKiAgICAgIHNpZ24gICAgIDAgICAgICAgICAgICAgICAgIGJ5IHByb2dyYW0gbG9naWMKLSAgICogICAgICBwYXJlbiAgICAwICAgICAgICAgICAgIGJ5IGRlZmluaXRpb24KLSAgICogICAgICByZWcgICAgICBwcmVzZW50ICAgICAgICAgICBieSBkZWZpbml0aW9uCi0gICAqICAgICAgbmR4ICAgICAgb3B0aW9uYWwKLSAgICoKLSAgICogb3V0OiBtb2RlICAgICA1K0AKLSAgICogICAgICByZWcgICAgICBwcmVzZW50Ci0gICAqICAgICAgbGVuICAgICAgJyAnICAgICAgICAgICAgICAgZW5mb3JjZSBubyBsZW5ndGgKLSAgICogICAgICBleHAgICAgICAiIiAgICAgICAgICAgICAgICBlbmZvcmNlIGVtcHR5IGV4cHJlc3Npb24KLSAgICogICAgICBuZHggICAgICBvcHRpb25hbCAgICAgICAgICB3YXJuIGlmIHNhbWUgYXMgcmVnCi0gICAqLwotICBpZiAoKCFlcnIgfHwgISplcnIpICYmICFwYXJlbiAmJiByZWcgPj0gMCkKLSAgICB7Ci0gICAgICBpZiAobGVuICE9ICcgJykKLQllcnIgPSBfKCJsZW5ndGggbm90IG5lZWRlZCIpOwotICAgICAgZWxzZSBpZiAoYXQpCi0JewotCSAgZXJyID0gIiAiOwkJLyogd2luICovCi0JICBtb2RlID0gNjsJCS8qIEBSbiAqLwotCX0KLSAgICAgIGVsc2UgaWYgKG5keCA+PSAwKQotCWVyciA9IF8oImNhbid0IFtdaW5kZXggYSByZWdpc3RlciwgYmVjYXVzZSBpdCBoYXMgbm8gYWRkcmVzcyIpOwotICAgICAgZWxzZSBpZiAoYWNjZXNzX21vZGUgPT0gJ2EnKQotCWVyciA9IF8oImEgcmVnaXN0ZXIgaGFzIG5vIGFkZHJlc3MiKTsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogSWRlYSBoZXJlIGlzIHRvIGRldGVjdCBmcm9tIGxlbmd0aCBvZiBkYXR1bQotCSAgICogYW5kIGZyb20gcmVnaXN0ZXIgbnVtYmVyIGlmIHdlIHdpbGwgdG91Y2ggUEMuCi0JICAgKiBXYXJuIGlmIHdlIGRvLgotCSAgICogdm9wX25ieXRlcyBpcyBudW1iZXIgb2YgYnl0ZXMgaW4gb3BlcmFuZC4KLQkgICAqIENvbXB1dGUgaGlnaGVzdCBieXRlIGFmZmVjdGVkLCBjb21wYXJlIHRvIFBDMC4KLQkgICAqLwotCSAgaWYgKCh2b3BQLT52b3BfbmJ5dGVzICsgcmVnICogNCkgPiA2MCkKLQkgICAgd3JuID0gXygiUEMgcGFydCBvZiBvcGVyYW5kIHVucHJlZGljdGFibGUiKTsKLQkgIGVyciA9ICIgIjsJCS8qIHdpbiAqLwotCSAgbW9kZSA9IDU7CQkvKiBSbiAqLwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIElmICEqZXJyLCAgICAgICAgc2lnbiAgPT0gMAotICAgKiAgICAgICAgICAgICAgICAgIGhhc2ggID09IDAKLSAgICogICAgICAgICAgICAgICAgICBwYXJlbiA9PSAxICBPUiByZWc9PS0xCi0gICAqLwotDAotICAvKgotICAgKiBSZXN0IG9mIGNhc2VzIGZpdCBpbnRvIG9uZSBidW5jaC4KLSAgICoKLSAgICogaW46ICBhdCAgICAgICBvcHRpb25hbAotICAgKiAgICAgIGxlbiAgICAgICcgJyBvciAnYicgb3IgJ3cnIG9yICdsJwotICAgKiAgICAgIGhhc2ggICAgIDAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYwotICAgKiAgICAgIHA6cSAgICAgIGV4cGVjdGVkICAgICAgICAgIChlbXB0eSBpcyBub3QgYW4gZXJyb3IpCi0gICAqICAgICAgc2lnbiAgICAgMCAgICAgICAgICAgICAgICAgYnkgcHJvZ3JhbSBsb2dpYwotICAgKiAgICAgIHBhcmVuICAgIG9wdGlvbmFsCi0gICAqICAgICAgcmVnICAgICAgb3B0aW9uYWwKLSAgICogICAgICBuZHggICAgICBvcHRpb25hbAotICAgKgotICAgKiBvdXQ6IG1vZGUgICAgIDEwICsgQCArIGxlbgotICAgKiAgICAgIHJlZyAgICAgIG9wdGlvbmFsCi0gICAqICAgICAgbGVuICAgICAgJyAnIG9yICdiJyBvciAndycgb3IgJ2wnCi0gICAqICAgICAgZXhwICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmUgZW1wdHkKLSAgICogICAgICBuZHggICAgICBvcHRpb25hbCAgICAgICAgICB3YXJuIGlmIHNhbWUgYXMgcmVnCi0gICAqLwotICBpZiAoIWVyciB8fCAhKmVycikKLSAgICB7Ci0gICAgICBlcnIgPSAiICI7CQkvKiB3aW4gKGFsd2F5cykgKi8KLSAgICAgIG1vZGUgPSAxMCArIChhdCA/IDEgOiAwKTsKLSAgICAgIHN3aXRjaCAobGVuKQotCXsKLQljYXNlICdsJzoKLQkgIG1vZGUgKz0gMjsKLQljYXNlICd3JzoKLQkgIG1vZGUgKz0gMjsKLQljYXNlICcgJzoJCS8qIGFzc3VtZWQgQl4gdW50aWwgb3VyIGNhbGxlciBjaGFuZ2VzIGl0ICovCi0JY2FzZSAnYic6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIGhlcmUgd2l0aCBjb21wbGV0ZWx5IHNwZWNpZmllZCAgICAgbW9kZQotICAgKgkJCQkJbGVuCi0gICAqCQkJCQlyZWcKLSAgICoJCQkJCWV4cHJlc3Npb24gICBwLHEKLSAgICoJCQkJCW5keAotICAgKi8KLQotICBpZiAoKmVyciA9PSAnICcpCi0gICAgZXJyID0gMDsJCQkvKiAiICIgaXMgbm8gbG9uZ2VyIGFuIGVycm9yICovCi0KLSAgdm9wUC0+dm9wX21vZGUgPSBtb2RlOwotICB2b3BQLT52b3BfcmVnID0gcmVnOwotICB2b3BQLT52b3Bfc2hvcnQgPSBsZW47Ci0gIHZvcFAtPnZvcF9leHByX2JlZ2luID0gcDsKLSAgdm9wUC0+dm9wX2V4cHJfZW5kID0gcTsKLSAgdm9wUC0+dm9wX25keCA9IG5keDsKLSAgdm9wUC0+dm9wX2Vycm9yID0gZXJyOwotICB2b3BQLT52b3Bfd2FybiA9IHdybjsKLX0KLQwKLS8qCi0KLSAgU3VtbWFyeSBvZiB2aXBfb3Agb3V0cHV0cy4KLQotICBtb2RlCXJlZwlsZW4JbmR4Ci0gIChSbikgPT4gQFJuCi0gIHtAfVJuCQkJNStACW4JJyAnCW9wdGlvbmFsCi0gIGJyYW5jaCBvcGVyYW5kCQkwCS0xCScgJwktMQotICBTXiNmb28JCQkwCS0xCSdzJwktMQotICAtKFJuKQkJCTcJbgknICcJb3B0aW9uYWwKLSAge0B9KFJuKSsJCTgrQAluCScgJwlvcHRpb25hbAotICB7QH0jZm9vLCBubyBTXgkJOCtACVBDCSIgaSIJb3B0aW9uYWwKLSAge0B9e3FefXsoUm4pfQkJMTArQCtxCW9wdGlvbgkiIGJ3bCIJb3B0aW9uYWwKLQotICAqLwotDAotI2lmZGVmIFRFU1QJCQkvKiAjRGVmaW5lIHRvIHVzZSB0aGlzIHRlc3RiZWQuICovCi0KLS8qCi0gKiBGb2xsb3dzIGEgdGVzdCBwcm9ncmFtIGZvciB0aGlzIGZ1bmN0aW9uLgotICogV2UgZGVjbGFyZSBhcnJheXMgbm9uLWxvY2FsIGluIGNhc2Ugc29tZSBvZiBvdXIgdGlueS1taW5kZWQgbWFjaGluZXMKLSAqIGRlZmF1bHQgdG8gc21hbGwgc3RhY2tzLiBBbHNvLCBoZWxwcyB3aXRoIHNvbWUgZGVidWdnZXJzLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1jaGFyIGFuc3dlclsxMDBdOwkJLyogaHVtYW4gdHlwZXMgaW50byBoZXJlICovCi1jaGFyICpwOwkJCS8qICAqLwotY2hhciAqbXllcnI7Ci1jaGFyICpteXdybjsKLWNoYXIgKm15YnVnOwotY2hhciBteWFjY2VzczsKLWNoYXIgbXl3aWR0aDsKLWNoYXIgbXltb2RlOwotY2hhciBteXJlZzsKLWNoYXIgbXlsZW47Ci1jaGFyICpteWxlZnQ7Ci1jaGFyICpteXJpZ2h0OwotY2hhciBteW5keDsKLWludCBteV9vcGVyYW5kX2xlbmd0aDsKLWNoYXIgbXlfaW1tZWRpYXRlWzIwMF07Ci1jaGFyIG15X2luZGlyZWN0WzIwMF07Ci1jaGFyIG15X2Rpc3BsZW5bMjAwXTsKLQotbWFpbiAoKQotewotICBwcmludGYgKCJlbnRlciBpbW1lZGlhdGUgc3ltYm9scyBlZyBlbnRlciAjICAgIik7Ci0gIGdldHMgKG15X2ltbWVkaWF0ZSk7Ci0gIHByaW50ZiAoImVudGVyIGluZGlyZWN0IHN5bWJvbHMgIGVnIGVudGVyIEAgICAiKTsKLSAgZ2V0cyAobXlfaW5kaXJlY3QpOwotICBwcmludGYgKCJlbnRlciBkaXNwbGVuIHN5bWJvbHMgICBlZyBlbnRlciBeICAgIik7Ci0gIGdldHMgKG15X2Rpc3BsZW4pOwotICB2aXBfb3BfZGVmYXVsdHMgKG15X2ltbWVkaWF0ZSwgbXlfaW5kaXJlY3QsIG15X2Rpc3BsZW4pOwotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHByaW50ZiAoImFjY2Vzcyx3aWR0aCAoZWcgJ2FiJyBvciAnd2gnKSBbZW1wdHkgbGluZSB0byBxdWl0XSA6ICAiKTsKLSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLSAgICAgIGdldHMgKGFuc3dlcik7Ci0gICAgICBpZiAoIWFuc3dlclswXSkKLQlleGl0IChFWElUX1NVQ0NFU1MpOwotICAgICAgbXlhY2Nlc3MgPSBhbnN3ZXJbMF07Ci0gICAgICBteXdpZHRoID0gYW5zd2VyWzFdOwotICAgICAgc3dpdGNoIChteXdpZHRoKQotCXsKLQljYXNlICdiJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMTsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSA4OwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDQ7Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMTY7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMzI7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gNDsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSAxNjsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgbXlfb3BlcmFuZF9sZW5ndGggPSA4OwotCSAgYnJlYWs7Ci0JY2FzZSAndyc6Ci0JICBteV9vcGVyYW5kX2xlbmd0aCA9IDI7Ci0JICBicmVhazsKLQljYXNlICchJzoKLQljYXNlICc/JzoKLQljYXNlICctJzoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMDsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIG15X29wZXJhbmRfbGVuZ3RoID0gMjsKLQkgIHByaW50ZiAoIkkgZG4ndCB1bmRlcnN0YW5kIGFjY2VzcyB3aWR0aCAlY1xuIiwgbXl3aWR0aCk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBwcmludGYgKCJWQVggYXNzZW1ibGVyIGluc3RydWN0aW9uIG9wZXJhbmQ6ICIpOwotICAgICAgZmZsdXNoIChzdGRvdXQpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIG15YnVnID0gdmlwX29wIChhbnN3ZXIsIG15YWNjZXNzLCBteXdpZHRoLCBteV9vcGVyYW5kX2xlbmd0aCwKLQkJICAgICAgJm15bW9kZSwgJm15cmVnLCAmbXlsZW4sICZteWxlZnQsICZteXJpZ2h0LCAmbXluZHgsCi0JCSAgICAgICZteWVyciwgJm15d3JuKTsKLSAgICAgIGlmICgqbXllcnIpCi0JewotCSAgcHJpbnRmICgiZXJyb3I6IFwiJXNcIlxuIiwgbXllcnIpOwotCSAgaWYgKCpteWJ1ZykKLQkgICAgcHJpbnRmICgiIGJ1ZzogXCIlc1wiXG4iLCBteWJ1Zyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmICgqbXl3cm4pCi0JICAgIHByaW50ZiAoIndhcm5pbmc6IFwiJXNcIlxuIiwgbXl3cm4pOwotCSAgbXVtYmxlICgibW9kZSIsIG15bW9kZSk7Ci0JICBtdW1ibGUgKCJyZWdpc3RlciIsIG15cmVnKTsKLQkgIG11bWJsZSAoImluZGV4IiwgbXluZHgpOwotCSAgcHJpbnRmICgid2lkdGg6JyVjJyAgIiwgbXlsZW4pOwotCSAgcHJpbnRmICgiZXhwcmVzc2lvbjogXCIiKTsKLQkgIHdoaWxlIChteWxlZnQgPD0gbXlyaWdodCkKLQkgICAgcHV0Y2hhciAoKm15bGVmdCsrKTsKLQkgIHByaW50ZiAoIlwiXG4iKTsKLQl9Ci0gICAgfQotfQotCi1tdW1ibGUgKHRleHQsIHZhbHVlKQotICAgICBjaGFyICp0ZXh0OwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHByaW50ZiAoIiVzOiIsIHRleHQpOwotICBpZiAodmFsdWUgPj0gMCkKLSAgICBwcmludGYgKCIleHgiLCB2YWx1ZSk7Ci0gIGVsc2UKLSAgICBwcmludGYgKCJBQlNFTlQiKTsKLSAgcHJpbnRmICgiICAiKTsKLX0KLQotI2VuZGlmIC8qIGlmZGVmIFRFU1QgKi8KLQotLyogZW5kOiB2aXBfb3AuYyAqLwotCi1jb25zdCBpbnQgbWRfc2hvcnRfanVtcF9zaXplID0gMzsKLWNvbnN0IGludCBtZF9sb25nX2p1bXBfc2l6ZSA9IDY7Ci1jb25zdCBpbnQgbWRfcmVsb2Nfc2l6ZSA9IDg7CS8qIFNpemUgb2YgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotdm9pZAotbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHB0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBmcmFnLCB0b19zeW1ib2wpCi0gICAgIGNoYXIgKnB0cjsKLSAgICAgYWRkcmVzc1QgZnJvbV9hZGRyLCB0b19hZGRyOwotICAgICBmcmFnUyAqZnJhZzsKLSAgICAgc3ltYm9sUyAqdG9fc3ltYm9sOwotewotICB2YWx1ZVQgb2Zmc2V0OwotCi0gIC8qIFRoaXMgZm9ybWVyIGNhbGN1bGF0aW9uIHdhcyBvZmYgYnkgdHdvOgotICAgICAgb2Zmc2V0ID0gdG9fYWRkciAtIChmcm9tX2FkZHIgKyAxKTsKLSAgICAgV2UgbmVlZCB0byBhY2NvdW50IGZvciB0aGUgb25lIGJ5dGUgaW5zdHJ1Y3Rpb24gYW5kIGFsc28gaXRzCi0gICAgIHR3byBieXRlIG9wZXJhbmQuICAqLwotICBvZmZzZXQgPSB0b19hZGRyIC0gKGZyb21fYWRkciArIDEgKyAyKTsKLSAgKnB0cisrID0gVkFYX0JSVzsJCS8qIGJyYW5jaCB3aXRoIHdvcmQgKDE2IGJpdCkgb2Zmc2V0ICovCi0gIG1kX251bWJlcl90b19jaGFycyAocHRyLCBvZmZzZXQsIDIpOwotfQotCi12b2lkCi1tZF9jcmVhdGVfbG9uZ19qdW1wIChwdHIsIGZyb21fYWRkciwgdG9fYWRkciwgZnJhZywgdG9fc3ltYm9sKQotICAgICBjaGFyICpwdHI7Ci0gICAgIGFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLSAgICAgZnJhZ1MgKmZyYWc7Ci0gICAgIHN5bWJvbFMgKnRvX3N5bWJvbDsKLXsKLSAgdmFsdWVUIG9mZnNldDsKLQotICBvZmZzZXQgPSB0b19hZGRyIC0gU19HRVRfVkFMVUUgKHRvX3N5bWJvbCk7Ci0gICpwdHIrKyA9IFZBWF9KTVA7CQkvKiBhcmJpdHJhcnkganVtcCAqLwotICAqcHRyKysgPSBWQVhfQUJTT0xVVEVfTU9ERTsKLSAgbWRfbnVtYmVyX3RvX2NoYXJzIChwdHIsIG9mZnNldCwgNCk7Ci0gIGZpeF9uZXcgKGZyYWcsIHB0ciAtIGZyYWctPmZyX2xpdGVyYWwsIDQsIHRvX3N5bWJvbCwgKGxvbmcpIDAsIDAsIE5PX1JFTE9DKTsKLX0KLQwKLSNpZmRlZiBPQkpfVk1TCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiZDpTVHQ6VisxaDpIdjo6IjsKLSNlbHNlCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiZDpTVHQ6ViI7Ci0jZW5kaWYKLXN0cnVjdCBvcHRpb24gbWRfbG9uZ29wdHNbXSA9IHsKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLXNpemVfdCBtZF9sb25nb3B0c19zaXplID0gc2l6ZW9mKG1kX2xvbmdvcHRzKTsKLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsIGFyZykKLSAgICAgaW50IGM7Ci0gICAgIGNoYXIgKmFyZzsKLXsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdTJzoKLSAgICAgIGFzX3dhcm4gKF8oIlNZTUJPTCBUQUJMRSBub3QgaW1wbGVtZW50ZWQiKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgYXNfd2FybiAoXygiVE9LRU4gVFJBQ0Ugbm90IGltcGxlbWVudGVkIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICAgIGFzX3dhcm4gKF8oIkRpc3BsYWNlbWVudCBsZW5ndGggJXMgaWdub3JlZCEiKSwgYXJnKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICBhc193YXJuIChfKCJJIGRvbid0IG5lZWQgb3IgdXNlIHRlbXAuIGZpbGUgXCIlc1wiLiIpLCBhcmcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgIGFzX3dhcm4gKF8oIkkgZG9uJ3QgdXNlIGFuIGludGVycGFzcyBmaWxlISAtViBpZ25vcmVkIikpOwotICAgICAgYnJlYWs7Ci0KLSNpZmRlZiBPQkpfVk1TCi0gICAgY2FzZSAnKyc6CQkJLyogRm9yIGcrKy4gIEhhc2ggYW55IG5hbWUgPiAzMSBjaGFycyBsb25nLiAqLwotICAgICAgZmxhZ19oYXNoX2xvbmdfbmFtZXMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzoJCQkvKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLwotICAgICAgZmxhZ19vbmUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdIJzoJCQkvKiBTaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uICovCi0gICAgICBmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoJCQkvKiBObyBoYXNoaW5nIG9mIG1peGVkLWNhc2UgbmFtZXMgKi8KLSAgICAgIHsKLQlleHRlcm4gY2hhciB2bXNfbmFtZV9tYXBwaW5nOwotCXZtc19uYW1lX21hcHBpbmcgPSBhdG9pIChhcmcpOwotCWZsYWdfbm9faGFzaF9taXhlZF9jYXNlID0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndic6Ci0gICAgICB7Ci0JZXh0ZXJuIGNoYXIgKmNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nOwotCWlmICghYXJnIHx8ICEqYXJnIHx8IGFjY2VzcyAoYXJnLCAwKSA9PSAwKQotCSAgcmV0dXJuIDA7CQkvKiBoYXZlIGNhbGxlciBzaG93IHRoZSBhc3NlbWJsZXIgdmVyc2lvbiAqLwotCWNvbXBpbGVyX3ZlcnNpb25fc3RyaW5nID0gYXJnOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQKLW1kX3Nob3dfdXNhZ2UgKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwotewotICBmcHJpbnRmKHN0cmVhbSwgXygiXAotVkFYIG9wdGlvbnM6XG5cCi0tZCBMRU5HVEgJCWlnbm9yZWRcblwKLS1KCQkJaWdub3JlZFxuXAotLVMJCQlpZ25vcmVkXG5cCi0tdCBGSUxFCQkJaWdub3JlZFxuXAotLVQJCQlpZ25vcmVkXG5cCi0tVgkJCWlnbm9yZWRcbiIpKTsKLSNpZmRlZiBPQkpfVk1TCi0gIGZwcmludGYgKHN0cmVhbSwgXygiXAotVk1TIG9wdGlvbnM6XG5cCi0tKwkJCWhhc2ggZW5jb2RlIG5hbWVzIGxvbmdlciB0aGFuIDMxIGNoYXJhY3RlcnNcblwKLS0xCQkJYGNvbnN0JyBoYW5kbGluZyBjb21wYXRpYmxlIHdpdGggZ2NjIDEueFxuXAotLUgJCQlzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG5cCi0taCBOVU0JCQlkb24ndCBoYXNoIG1peGVkLWNhc2UgbmFtZXMsIGFuZCBhZGp1c3QgY2FzZTpcblwKLQkJCTAgPSB1cHBlciwgMiA9IGxvd2VyLCAzID0gcHJlc2VydmUgY2FzZVxuXAotLXZcIlZFUlNJT05cIgkJY29kZSBiZWluZyBhc3NlbWJsZWQgd2FzIHByb2R1Y2VkIGJ5IGNvbXBpbGVyIFwiVkVSU0lPTlwiXG4iKSk7Ci0jZW5kaWYKLX0KLQwKLS8qIFdlIGhhdmUgbm8gbmVlZCB0byBkZWZhdWx0IHZhbHVlcyBvZiBzeW1ib2xzLiAgKi8KLQotLyogQVJHU1VTRUQgKi8KLXN5bWJvbFMgKgotbWRfdW5kZWZpbmVkX3N5bWJvbCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJvdW5kIHVwIGEgc2VjdGlvbiBzaXplIHRvIHRoZSBhcHByb3ByaWF0ZSBib3VuZGFyeS4gICovCi12YWx1ZVQKLW1kX3NlY3Rpb25fYWxpZ24gKHNlZ21lbnQsIHNpemUpCi0gICAgIHNlZ1Qgc2VnbWVudDsKLSAgICAgdmFsdWVUIHNpemU7Ci17Ci0gIHJldHVybiBzaXplOwkJCS8qIEJ5dGUgYWxpZ25tZW50IGlzIGZpbmUgKi8KLX0KLQotLyogRXhhY3RseSB3aGF0IHBvaW50IGlzIGEgUEMtcmVsYXRpdmUgb2Zmc2V0IHJlbGF0aXZlIFRPPwotICAgT24gdGhlIHZheCwgdGhleSdyZSByZWxhdGl2ZSB0byB0aGUgYWRkcmVzcyBvZiB0aGUgb2Zmc2V0LCBwbHVzCi0gICBpdHMgc2l6ZS4gKD8/PyBJcyB0aGlzIHJpZ2h0PyAgRklYTUUtU09PTikgKi8KLWxvbmcKLW1kX3BjcmVsX2Zyb20gKGZpeFApCi0gICAgIGZpeFMgKmZpeFA7Ci17Ci0gIHJldHVybiBmaXhQLT5meF9zaXplICsgZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9hZGRyZXNzOwotfQotCi0vKiBlbmQgb2YgdGMtdmF4LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtdmF4LmggYi9nYXMvY29uZmlnL3RjLXZheC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjc5MWY3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtdmF4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKiB0Yy12YXguaCAtLSBIZWFkZXIgZmlsZSBmb3IgdGMtdmF4LmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkxLCA5MiwgOTMsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jZGVmaW5lIFRDX1ZBWCAxCi0KLSNkZWZpbmUgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4gMAotCi0jZGVmaW5lIE5PX1JFTE9DIDAKLSNkZWZpbmUgTk9QX09QQ09ERSAweDAxCi0KLSNkZWZpbmUgdGNfYW91dF9wcmVfd3JpdGVfaG9vayh4KQl7O30JLyogbm90IHVzZWQgKi8KLSNkZWZpbmUgdGNfY3Jhd2xfc3ltYm9sX2NoYWluKGEpCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSB0Y19oZWFkZXJzX2hvb2soYSkJCXs7fQkvKiBub3QgdXNlZCAqLwotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLWxvbmcgbWRfY2hhcnNfdG9fbnVtYmVyIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50KSk7Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcmVsYXhfdHlwZSBtZF9yZWxheF90YWJsZVtdOwotI2RlZmluZSBUQ19HRU5FUklDX1JFTEFYX1RBQkxFIG1kX3JlbGF4X3RhYmxlCi0KLS8qCi0gKiBMb2NhbCBWYXJpYWJsZXM6Ci0gKiBjb21tZW50LWNvbHVtbjogMAotICogZmlsbC1jb2x1bW46IDEzMQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0Yy12YXguaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90Yy13NjUuYyBiL2dhcy9jb25maWcvdGMtdzY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1N2ViMGYuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90Yy13NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTkgKzAsMCBAQAotLyogdGMtdzY1LmMgLS0gQXNzZW1ibGUgY29kZSBmb3IgdGhlIFc2NTgxNgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAgIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgIHNhY0BjeWdudXMuY29tCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jZGVmaW5lIERFRklORV9UQUJMRQotI2luY2x1ZGUgIi4uL29wY29kZXMvdzY1LW9wYy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLWNvbnN0IGNoYXIgY29tbWVudF9jaGFyc1tdID0gIiEiOwotQ09OU1QgY2hhciBsaW5lX3NlcGFyYXRvcl9jaGFyc1tdID0gIjsiOwotY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXSA9ICIhIyI7Ci0KLS8qIFRoaXMgdGFibGUgZGVzY3JpYmVzIGFsbCB0aGUgbWFjaGluZSBzcGVjaWZpYyBwc2V1ZG8tb3BzIHRoZSBhc3NlbWJsZXIKLSAgIGhhcyB0byBzdXBwb3J0LiAgVGhlIGZpZWxkcyBhcmU6Ci0gICBwc2V1ZG8tb3AgbmFtZSB3aXRob3V0IGRvdAotICAgZnVuY3Rpb24gdG8gY2FsbCB0byBleGVjdXRlIHRoaXMgcHNldWRvLW9wCi0gICBJbnRlZ2VyIGFyZyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbgotICovCi0KLSNkZWZpbmUgT1BfQkNDCTB4OTAKLSNkZWZpbmUgT1BfQkNTCTB4QjAKLSNkZWZpbmUgT1BfQkVRCTB4RjAKLSNkZWZpbmUgT1BfQk1JCTB4MzAKLSNkZWZpbmUgT1BfQk5FCTB4RDAKLSNkZWZpbmUgT1BfQlBMCTB4MTAKLSNkZWZpbmUgT1BfQlJBCTB4ODAKLSNkZWZpbmUgT1BfQlJMCTB4ODIKLSNkZWZpbmUgT1BfQlZDCTB4NTAKLSNkZWZpbmUgT1BfQlZTCTB4NzAKLQotdm9pZCBzX2xvbmdhICgpOwotY29uc3QgcHNldWRvX3R5cGVTIG1kX3BzZXVkb190YWJsZVtdID0KLXsKLSAgeyJpbnQiLCBjb25zLCAyfSwKLSAgeyJ3b3JkIiwgY29ucywgMn0sCi0gIHsibG9uZ2EiLCBzX2xvbmdhLCAwfSwKLSAgeyJsb25naSIsIHNfbG9uZ2EsIDF9LAotICB7MCwgMCwgMH0KLX07Ci0KLQotdm9pZCBjb25zICgpOwotdm9pZCBzX2FsaWduX2J5dGVzICgpOwotCi0KLS8qaW50IG1kX3JlbG9jX3NpemU7ICovCi0KLXN0YXRpYyBpbnQgcmVsYXg7CQkvKiBzZXQgaWYgLXJlbGF4IHNlZW4gKi8KLQotY29uc3QgY2hhciBFWFBfQ0hBUlNbXSA9ICJlRSI7Ci0KLS8qIENoYXJzIHRoYXQgbWVhbiB0aGlzIG51bWJlciBpcyBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50ICovCi0vKiBBcyBpbiAwZjEyLjQ1NiAqLwotLyogb3IgICAgMGQxLjIzNDVlMTIgKi8KLWNvbnN0IGNoYXIgRkxUX0NIQVJTW10gPSAiclJzU2ZGZER4WHBQIjsKLQotCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpvcGNvZGVfaGFzaF9jb250cm9sOwkvKiBPcGNvZGUgbW5lbW9uaWNzICovCi0KLWludCBNOwkJCQkvKiBNIGZsYWcgKi8KLWludCBYOwkJCQkvKiBYIGZsYWcgKi8KLQotCi0KLQotI2RlZmluZSBDKGEsYikgRU5DT0RFX1JFTEFYKGEsYikKLSNkZWZpbmUgRU5DT0RFX1JFTEFYKHdoYXQsbGVuZ3RoKSAoKCh3aGF0KSA8PCAyKSArIChsZW5ndGgpKQotCi0jZGVmaW5lIEdFVF9XSEFUKHgpICgoeD4+MikpCi0KLSNkZWZpbmUgQllURV9ESVNQIDEKLSNkZWZpbmUgV09SRF9ESVNQIDIKLSNkZWZpbmUgVU5ERUZfQllURV9ESVNQIDAKLSNkZWZpbmUgVU5ERUZfV09SRF9ESVNQIDMKLQotI2RlZmluZSBDT05EX0JSQU5DSCAJMQotI2RlZmluZSBVTkNPTkRfQlJBTkNIICAgMgotI2RlZmluZSBFTkQgCTMKLQotI2RlZmluZSBCWVRFX0YgMTI3CQkvKiBIb3cgZmFyIHdlIGNhbiBicmFuY2ggZm9yd2FyZHMgKi8KLSNkZWZpbmUgQllURV9CIC0xMjYJCS8qIEhvdyBmYXIgd2UgY2FuIGJyYW5jaCBiYWNrd2FyZHMgKi8KLSNkZWZpbmUgV09SRF9GIDMyNzY3Ci0jZGVmaW5lIFdPUkRfQiAzMjc2OAotCi1yZWxheF90eXBlUyBtZF9yZWxheF90YWJsZVtDIChFTkQsIDApXTsKLQotLyoKLSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UsIGF0IGFzc2VtYmxlciBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZAotICAgc2V0IHVwIGFsbCB0aGUgdGFibGVzLCBldGMgdGhhdCB0aGUgTUQgcGFydCBvZiB0aGUgYXNzZW1ibGVyIG5lZWRzCi0gKi8KLQotCi12b2lkCi1zX2xvbmdhICh4bW9kZSkKLXsKLSAgaW50ICpwID0geG1vZGUgPyAmWCA6ICZNOwotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvbiIsIDIpID09IDApCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0gICAgICAqcCA9IDA7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wIChpbnB1dF9saW5lX3BvaW50ZXIsICJvZmYiLCAzKSA9PSAwKQotICAgIHsKLSAgICAgICpwID0gMTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAzOwotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygibmVlZCBvbiBvciBvZmYuIikpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotdm9pZAotbWRfYmVnaW4gKCkKLXsKLSAgcmVsYXhfdHlwZVMgKnRhYmxlOwotICBzdHJ1Y3Qgb3BpbmZvICpvcGNvZGU7Ci0gIGNoYXIgKnByZXZfbmFtZSA9ICIiOwotCi0gIG9wY29kZV9oYXNoX2NvbnRyb2wgPSBoYXNoX25ldyAoKTsKLQotICAvKiBJbnNlcnQgdW5pcXVlIG5hbWVzIGludG8gaGFzaCB0YWJsZSAqLwotICBmb3IgKG9wY29kZSA9IG9wdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocHJldl9uYW1lLCBvcGNvZGUtPm5hbWUpKQotCXsKLQkgIHByZXZfbmFtZSA9IG9wY29kZS0+bmFtZTsKLQkgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBvcGNvZGUtPm5hbWUsIChjaGFyICopIG9wY29kZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE1ha2UgYWxsIHRoZSBvcGNvZGVzIHdpdGggdGhlIHNhbWUgbmFtZSBwb2ludCB0byB0aGUgc2FtZQotCSAgICAgc3RyaW5nICovCi0JICBvcGNvZGUtPm5hbWUgPSBwcmV2X25hbWU7Ci0JfQotICAgIH0KLQotCi0gIC8qIEluaXRpYWxpemUgdGhlIHJlbGF4IHRhYmxlLiAgV2UgdXNlIGEgbG9jYWwgdmFyaWFibGUgdG8gYXZvaWQKLSAgICAgd2FybmluZ3MgYWJvdXQgbW9kaWZ5aW5nIGEgc3VwcG9zZWRseSBjb25zdCBkYXRhIHN0cnVjdHVyZS4gICovCi0gIHRhYmxlID0gKHJlbGF4X3R5cGVTICopIG1kX3JlbGF4X3RhYmxlOwotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfYmFja3dhcmQgPSBCWVRFX0I7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoID0gMjsKLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCk7Ci0KLSAgdGFibGVbQyAoQ09ORF9CUkFOQ0gsIFdPUkRfRElTUCldLnJseF9mb3J3YXJkID0gV09SRF9GOwotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aCA9IDU7Ci0gIHRhYmxlW0MgKENPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbW9yZSA9IDA7Ci0KLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2ZvcndhcmQgPSBCWVRFX0Y7Ci0gIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9iYWNrd2FyZCA9IEJZVEVfQjsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKV0ucmx4X2xlbmd0aCA9IDI7Ci0gIHRhYmxlW0MgKFVOQ09ORF9CUkFOQ0gsIEJZVEVfRElTUCldLnJseF9tb3JlID0gQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKTsKLQotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfZm9yd2FyZCA9IFdPUkRfRjsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X2JhY2t3YXJkID0gV09SRF9COwotICB0YWJsZVtDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoID0gMzsKLSAgdGFibGVbQyAoVU5DT05EX0JSQU5DSCwgV09SRF9ESVNQKV0ucmx4X21vcmUgPSAwOwotCi0gIGZsYWdfc2lnbmVkX292ZXJmbG93X29rID0gMTsKLX0KLQotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTsJLyogYWJzb2x1dGUgZXhwcmVzc2lvbiAqLwotc3RhdGljIGV4cHJlc3Npb25TIGltbWVkaWF0ZTE7CS8qIGFic29sdXRlIGV4cHJlc3Npb24gKi8KLQotCi1zdGF0aWMgc3ltYm9sUyAqCi1kb3QgKCkKLXsKLSAgY29uc3QgY2hhciAqZmFrZTsKLQotICAvKiBKRjogJy4nIGlzIHBzZXVkbyBzeW1ib2wgd2l0aCB2YWx1ZSBvZiBjdXJyZW50IGxvY2F0aW9uCi0gICAgIGluIGN1cnJlbnQgc2VnbWVudC4gICovCi0gIGZha2UgPSBGQUtFX0xBQkVMX05BTUU7Ci0gIHJldHVybiBzeW1ib2xfbmV3IChmYWtlLAotCQkgICAgIG5vd19zZWcsCi0JCSAgICAgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkgICAgIGZyYWdfbm93KTsKLQotfQotCi1pbnQgZXhwcl9zaXplOwotaW50IGV4cHJfc2hpZnQ7Ci1pbnQgdGNfY29uc19yZWxvYzsKLXZvaWQKLXc2NV9leHByZXNzaW9uIChkZXN0LCBieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmRlc3Q7Ci0gICAgIHVuc2lnbmVkIGludCBieXRlczsKLXsKLSAgZXhwcl9zaXplID0gMDsKLSAgZXhwcl9zaGlmdCA9IDA7Ci0gIHRjX2NvbnNfcmVsb2MgPSAwOwotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJzwnKQotICAgIHsKLSAgICAgIGV4cHJfc2l6ZSA9IDE7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJz4nKQotICAgIHsKLSAgICAgIGV4cHJfc2hpZnQgPSAxOwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgfQotICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdeJykKLSAgICB7Ci0gICAgICBleHByX3NoaWZ0ID0gMjsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLQotICBleHByICgwLCBkZXN0KTsKLX0KLQotaW50IGFtb2RlOwotc3RhdGljCi1jaGFyICoKLXBhcnNlX2V4cCAocywgYnl0ZXMpCi0gICAgIGNoYXIgKnM7Ci0gICAgIGludCBieXRlczsKLXsKLSAgY2hhciAqc2F2ZTsKLSAgY2hhciAqbmV3OwotCi0gIHNhdmUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIHc2NV9leHByZXNzaW9uICgmaW1tZWRpYXRlLCBieXRlcyk7Ci0gIGlmIChpbW1lZGlhdGUuWF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3Npbmcgb3BlcmFuZCIpKTsKLSAgbmV3ID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzYXZlOwotICByZXR1cm4gbmV3OwotfQotCi0KLXN0YXRpYwotY2hhciAqCi1nZXRfb3BlcmFuZHMgKGluZm8sIHB0cikKLSAgICAgc3RydWN0IG9waW5mbyAqaW5mbzsKLSAgICAgY2hhciAqcHRyOwotewotICByZWdpc3RlciBpbnQgb3ZlcnJpZGVfbGVuID0gMDsKLSAgcmVnaXN0ZXIgaW50IGJ5dGVzID0gMDsKLSAgd2hpbGUgKCpwdHIgPT0gJyAnKQotICAgIHB0cisrOwotCi0gIGlmIChwdHJbMF0gPT0gJyMnKQotICAgIHsKLSAgICAgIHB0cisrOwotICAgICAgc3dpdGNoIChpbmZvLT5hbW9kZSkKLQl7Ci0JY2FzZSBBRERSX0lNTVRPSToKLQkgIGJ5dGVzID0gWCA/IDEgOiAyOwotCSAgYW1vZGUgPSBBRERSX0lNTVRPSTsKLQkgIGJyZWFrOwotCWNhc2UgQUREUl9JTU1UT0E6Ci0JICBieXRlcyA9IE0gPyAxIDogMjsKLQkgIGFtb2RlID0gQUREUl9JTU1UT0E7Ci0JICBicmVhazsKLQljYXNlIEFERFJfSU1NQ09QOgotCSAgYnl0ZXMgPSAxOwotCSAgYW1vZGUgPSBBRERSX0lNTUNPUDsKLQkgIGJyZWFrOwotCWNhc2UgQUREUl9ESVI6Ci0JICBieXRlcyA9IDI7Ci0JICBhbW9kZSA9IEFERFJfQUJTOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIpOwotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICchJykKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotICAgICAgaWYgKHB0clswXSA9PSAnLCcpCi0JewotCSAgaWYgKHB0clsxXSA9PSAneScpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfQUJTX0lEWF9ZOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAocHRyWzFdID09ICd4JykKLQkgICAgewotCSAgICAgIGFtb2RlID0gQUREUl9BQlNfSURYX1g7Ci0JICAgICAgYnl0ZXMgPSAyOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oInN5bnRheCBlcnJvciBhZnRlciA8ZXhwIikpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGFtb2RlID0gQUREUl9BQlM7Ci0JICBieXRlcyA9IDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAocHRyWzBdID09ICc+JykKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotICAgICAgaWYgKHB0clswXSA9PSAnLCcgJiYgcHRyWzFdID09ICd4JykKLQl7Ci0JICBhbW9kZSA9IEFERFJfQUJTX0xPTkdfSURYX1g7Ci0JICBieXRlcyA9IDM7Ci0JICBwdHIgKz0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYW1vZGUgPSBBRERSX0FCU19MT05HOwotCSAgYnl0ZXMgPSAzOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHB0clswXSA9PSAnPCcpCi0gICAgewotICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIgKyAxKTsKLSAgICAgIGlmIChwdHJbMF0gPT0gJywnKQotCXsKLQkgIGlmIChwdHJbMV0gPT0gJ3knKQotCSAgICB7Ci0JICAgICAgYW1vZGUgPSBBRERSX0RJUl9JRFhfWTsKLQkgICAgICBwdHIgKz0gMjsKLQkgICAgICBieXRlcyA9IDI7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHB0clsxXSA9PSAneCcpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfRElSX0lEWF9YOwotCSAgICAgIHB0ciArPSAyOwotCSAgICAgIGJ5dGVzID0gMjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgYWZ0ZXIgPGV4cCIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhbW9kZSA9IEFERFJfRElSOwotCSAgYnl0ZXMgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHB0clswXSA9PSAnYScpCi0gICAgewotICAgICAgYW1vZGUgPSBBRERSX0FDQzsKLSAgICB9Ci0gIGVsc2UgaWYgKHB0clswXSA9PSAnKCcpCi0gICAgewotICAgICAgLyogTG9vayBmb3IgKGV4cCkseQotCSAoPGV4cCkseQotCSAoZXhwLHgpCi0JICg8ZXhwLHgpCi0JIChleHApCi0JICghZXhwKQotCSAoZXhwKQotCSAoPGV4cCkKLQkgKGV4cCx4KQotCSAoIWV4cCx4KQotCSAoZXhwLHMpCi0JIChleHAscykseSAqLwotCi0gICAgICBwdHIrKzsKLSAgICAgIGlmIChwdHJbMF0gPT0gJzwnKQotCXsKLQkgIG92ZXJyaWRlX2xlbiA9IDE7Ci0JICBwdHIrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJyEnKQotCXsKLQkgIG92ZXJyaWRlX2xlbiA9IDI7Ci0JICBwdHIrKzsKLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJz4nKQotCXsKLQkgIG92ZXJyaWRlX2xlbiA9IDM7Ci0JICBwdHIrKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3ZlcnJpZGVfbGVuID0gMDsKLQl9Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0cik7Ci0KLSAgICAgIGlmIChwdHJbMF0gPT0gJywnKQotCXsKLQkgIHB0cisrOwotCSAgaWYgKHB0clswXSA9PSAneCcgJiYgcHRyWzFdID09ICcpJykKLQkgICAgewotCSAgICAgIHB0ciArPSAyOwotCi0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0RJUl9JRFhfSU5EX1g7Ci0JCSAgYnl0ZXMgPSAyOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0FCU19JTkRfSURYOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChwdHJbMF0gPT0gJ3MnICYmIHB0clsxXSA9PSAnKScgJiYgcHRyWzJdID09ICcsJyAmJiBwdHJbM10gPT0gJ3knKQotCSAgICB7Ci0JICAgICAgYW1vZGUgPSBBRERSX1NUQUNLX1JFTF9JTkRYX0lEWDsKLQkgICAgICBieXRlcyA9IDE7Ci0JICAgICAgcHRyICs9IDQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChwdHJbMF0gPT0gJyknKQotCXsKLQkgIGlmIChwdHJbMV0gPT0gJywnICYmIHB0clsyXSA9PSAneScpCi0JICAgIHsKLQkgICAgICBhbW9kZSA9IEFERFJfRElSX0lORF9JRFhfWTsKLQkgICAgICBwdHIgKz0gMzsKLQkgICAgICBieXRlcyA9IDI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKLQkJewotCQkgIGFtb2RlID0gQUREUl9ESVJfSU5EOwotCQkgIGJ5dGVzID0gMTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGFtb2RlID0gQUREUl9BQlNfSU5EOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICAgIHB0cisrOwotCi0JICAgIH0KLQl9Ci0KLSAgICB9Ci0gIGVsc2UgaWYgKHB0clswXSA9PSAnWycpCi0gICAgewotICAgICAgcHRyID0gcGFyc2VfZXhwIChwdHIgKyAxKTsKLSAgICAgIGlmIChwdHJbMF0gPT0gJ10nKQotCXsKLQkgIHB0cisrOwotCSAgaWYgKHB0clswXSA9PSAnLCcgJiYgcHRyWzFdID09ICd5JykKLQkgICAgewotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBhbW9kZSA9IEFERFJfRElSX0lORF9JRFhfWV9MT05HOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaW5mby0+Y29kZSA9PSBPX2ptcCkgCi0JCXsKLQkJYnl0ZXMgPSAyOwotCQlhbW9kZSA9IEFERFJfQUJTX0lORF9MT05HOwotCSAgICAgIH0gCi0JICAgICAgZWxzZSAKLXsKLQkJYnl0ZXMgPSAxOwotCSAgICAgIAotCQlhbW9kZSA9IEFERFJfRElSX0lORF9MT05HOwotCSAgICAgIH0KLQkgICAgfQotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciwgMik7Ci0gICAgICBpZiAocHRyWzBdID09ICcsJykKLQl7Ci0JICBpZiAocHRyWzFdID09ICd5JykKLQkgICAgewotCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKLQkJewotCQkgIGJ5dGVzID0gMTsKLQkJICBhbW9kZSA9IEFERFJfRElSX0lEWF9ZOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0FCU19JRFhfWTsKLQkJICBieXRlcyA9IDI7Ci0JCX0KLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAocHRyWzFdID09ICd4JykKLQkgICAgewotCSAgICAgIGlmIChvdmVycmlkZV9sZW4gPT0gMSkKLQkJewotCQkgIGFtb2RlID0gQUREUl9ESVJfSURYX1g7Ci0JCSAgYnl0ZXMgPSAxOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0FCU19JRFhfWDsKLQkJICBieXRlcyA9IDI7Ci0JCX0KLQkgICAgICBwdHIgKz0gMjsKLQkgICAgfQotCSAgZWxzZSBpZiAocHRyWzFdID09ICdzJykKLQkgICAgewotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBhbW9kZSA9IEFERFJfU1RBQ0tfUkVMOwotCSAgICAgIHB0ciArPSAyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBieXRlcyA9IDE7Ci0JICAgICAgaW1tZWRpYXRlMSA9IGltbWVkaWF0ZTsKLQkgICAgICBwdHIgPSBwYXJzZV9leHAgKHB0ciArIDEpOwotCSAgICAgIGFtb2RlID0gQUREUl9CTE9DS19NT1ZFOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN3aXRjaCAoaW5mby0+YW1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBBRERSX1BDX1JFTDoKLQkgICAgICBhbW9kZSA9IEFERFJfUENfUkVMOwotCSAgICAgIGJ5dGVzID0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBRERSX1BDX1JFTF9MT05HOgotCSAgICAgIGFtb2RlID0gQUREUl9QQ19SRUxfTE9ORzsKLQkgICAgICBieXRlcyA9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgaWYgKG92ZXJyaWRlX2xlbiA9PSAxKQotCQl7Ci0JCSAgYW1vZGUgPSBBRERSX0RJUjsKLQkJICBieXRlcyA9IDE7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChvdmVycmlkZV9sZW4gPT0gMykKLQkJewotCQkgIGJ5dGVzID0gMzsKLQkJICBhbW9kZSA9IEFERFJfQUJTX0xPTkc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBhbW9kZSA9IEFERFJfQUJTOwotCQkgIGJ5dGVzID0gMjsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBzd2l0Y2ggKGJ5dGVzKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBzd2l0Y2ggKGV4cHJfc2hpZnQpCi0JewotCWNhc2UgMDoKLQkgIGlmIChhbW9kZSA9PSBBRERSX0RJUikKLQl0Y19jb25zX3JlbG9jID0gUl9XNjVfRFA7Ci0JICBlbHNlCi10Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTODsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIHRjX2NvbnNfcmVsb2MgPSBSX1c2NV9BQlM4Uzg7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTOFMxNjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIHN3aXRjaCAoZXhwcl9zaGlmdCkKLQl7Ci0JY2FzZSAwOgotCSAgdGNfY29uc19yZWxvYyA9IFJfVzY1X0FCUzE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgdGNfY29uc19yZWxvYyA9IFJfVzY1X0FCUzE2Uzg7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICB0Y19jb25zX3JlbG9jID0gUl9XNjVfQUJTMTZTMTY7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gcHRyOwotfQotCi0vKiBQYXNzZWQgYSBwb2ludGVyIHRvIGEgbGlzdCBvZiBvcGNvZGVzIHdoaWNoIHVzZSBkaWZmZXJlbnQKLSAgIGFkZHJlc3NpbmcgbW9kZXMsIHJldHVybiB0aGUgb3Bjb2RlIHdoaWNoIG1hdGNoZXMgdGhlIG9wY29kZXMKLSAgIHByb3ZpZGVkCi0gKi8KLQotc3RhdGljCi1zdHJ1Y3Qgb3BpbmZvICoKLWdldF9zcGVjaWZpYyAob3Bjb2RlKQotICAgICBzdHJ1Y3Qgb3BpbmZvICpvcGNvZGU7Ci17Ci0gIGludCBvY29kZSA9IG9wY29kZS0+Y29kZTsKLQotICBmb3IgKDsgb3Bjb2RlLT5jb2RlID09IG9jb2RlOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBhbW9kZSkKLQlyZXR1cm4gb3Bjb2RlOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotY2hlY2sgKG9wZXJhbmQsIGxvdywgaGlnaCkKLSAgICAgZXhwcmVzc2lvblMgKm9wZXJhbmQ7Ci0gICAgIGludCBsb3c7Ci0gICAgIGludCBoaWdoOwotewotICBpZiAob3BlcmFuZC0+WF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPCBsb3cKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlciA+IGhpZ2gpCi0gICAgewotICAgICAgYXNfYmFkICgib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCIsIGxvdywgaGlnaCk7Ci0gICAgfQotICByZXR1cm4gb3BlcmFuZC0+WF9hZGRfbnVtYmVyOwotfQotCi0KLXN0YXRpYyBpbnQgbG9nMltdID0KLXswLCAwLCAxLCAwLCAyfTsKLQotLyogTm93IHdlIGtub3cgd2hhdCBzb3J0IG9mIG9wY29kZXMgaXQgaXMsIGxldHMgYnVpbGQgdGhlIGJ5dGVzIC0KLSAqLwotc3RhdGljIHZvaWQKLWJ1aWxkX015dGVzIChvcGNvZGUpCi0gICAgIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKLXsKLSAgaW50IHNpemU7Ci0gIGludCB0eXBlOwotICBpbnQgcGNyZWw7Ci0gIGNoYXIgKm91dHB1dDsKLQotICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBBRERSX0lNUExJRUQpCi0gICAgewotICAgICAgb3V0cHV0ID0gZnJhZ19tb3JlICgxKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wY29kZS0+YW1vZGUgPT0gQUREUl9QQ19SRUwpCi0gICAgewotICAgICAgaW50IHR5cGU7Ci0gICAgICAvKiBUaGlzIGlzIGEgcmVsYXhhYmxlIGluc24sIHNvIHdlIGRvIHNvbWUgc3BlY2lhbCBoYW5kbGluZyAqLwotICAgICAgdHlwZSA9IG9wY29kZS0+dmFsID09IE9QX0JSQSA/IFVOQ09ORF9CUkFOQ0ggOiBDT05EX0JSQU5DSDsKLSAgICAgIG91dHB1dCA9IGZyYWdfdmFyIChyc19tYWNoaW5lX2RlcGVuZGVudCwKLQkJCSBtZF9yZWxheF90YWJsZVtDICh0eXBlLCBXT1JEX0RJU1ApXS5ybHhfbGVuZ3RoLAotCQkJIG1kX3JlbGF4X3RhYmxlW0MgKHR5cGUsIEJZVEVfRElTUCldLnJseF9sZW5ndGgsCi0JCQkgQyAodHlwZSwgVU5ERUZfQllURV9ESVNQKSwKLQkJCSBpbW1lZGlhdGUuWF9hZGRfc3ltYm9sLAotCQkJIGltbWVkaWF0ZS5YX2FkZF9udW1iZXIsCi0JCQkgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3dpdGNoIChvcGNvZGUtPmFtb2RlKQotCXsKLQkgIEdFVElORk8gKHNpemUsIHR5cGUsIHBjcmVsKTsKLQl9Ci0KLSAgICAgIC8qIElmIHNvbWV0aGluZyBzcGVjaWFsIHdhcyBkb25lIGluIHRoZQotCSBleHByZXNzaW9uIG1vZGlmeSB0aGUgcmVsb2MgdHlwZSAqLwotICAgICAgaWYgKHRjX2NvbnNfcmVsb2MpCi0JewotCSAgdHlwZSA9IHRjX2NvbnNfcmVsb2M7Ci0JfQotCi0KLQotICAgICAgLyogMSBieXRlIGZvciB0aGUgb3Bjb2RlICsgdGhlIGJ5dGVzIGZvciB0aGUgYWRkcm1vZGUgKi8KLSAgICAgIG91dHB1dCA9IGZyYWdfbW9yZSAoc2l6ZSArIDEpOwotCi0gICAgICBpZiAob3Bjb2RlLT5hbW9kZSA9PSBBRERSX0JMT0NLX01PVkUpCi0JewotCSAgLyogVHdvIHJlbG9jcyBmb3IgdGhpcyBvbmUgKi8KLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIDEsCi0JCSAgICAgICAmaW1tZWRpYXRlLAotCQkgICAgICAgMCwKLQkJICAgICAgIFJfVzY1X0FCUzhTMTYpOwotCi0JICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgICAgICBvdXRwdXQgKyAyIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAxLAotCQkgICAgICAgJmltbWVkaWF0ZTEsCi0JCSAgICAgICAwLAotCQkgICAgICAgUl9XNjVfQUJTOFMxNik7Ci0JfQotICAgICAgZWxzZSBpZiAodHlwZSA+PSAwCi0JICAgICAgICYmIG9wY29kZS0+YW1vZGUgIT0gQUREUl9JTVBMSUVECi0JICAgICAgICYmIG9wY29kZS0+YW1vZGUgIT0gQUREUl9BQ0MKLQkgICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX1NUQUNLKQotCXsKLQkgIGZpeF9uZXdfZXhwIChmcmFnX25vdywKLQkJICAgICAgIG91dHB1dCArIDEgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCwKLQkJICAgICAgIHNpemUsCi0JCSAgICAgICAmaW1tZWRpYXRlLAotCQkgICAgICAgcGNyZWwsCi0JCSAgICAgICB0eXBlKTsKLQl9Ci0gICAgfQotICBvdXRwdXRbMF0gPSBvcGNvZGUtPnZhbDsKLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAqLwotCi12b2lkCi1tZF9hc3NlbWJsZSAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKm9wX3N0YXJ0OwotICB1bnNpZ25lZCBjaGFyICpvcF9lbmQ7Ci0gIHN0cnVjdCBvcGluZm8gKm9wY29kZTsKLSAgY2hhciBuYW1lWzIwXTsKLSAgaW50IG5sZW4gPSAwOwotICBjaGFyICpwOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBhbGwgb3Bjb2RlcyBhcmUgdGhyZWUgbGV0dGVycyAqLwotICBuYW1lWzBdID0gc3RyWzBdOwotICBuYW1lWzFdID0gc3RyWzFdOwotICBuYW1lWzJdID0gc3RyWzJdOwotICBuYW1lWzNdID0gMDsKLQotICB0Y19jb25zX3JlbG9jID0gMDsKLSAgc3RyICs9IDM7Ci0gIG9wY29kZSA9IChzdHJ1Y3Qgb3BpbmZvICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwgbmFtZSk7Ci0KLSAgaWYgKG9wY29kZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygidW5rbm93biBvcGNvZGUiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChvcGNvZGUtPmFtb2RlICE9IEFERFJfSU1QTElFRAotICAgICAgJiYgb3Bjb2RlLT5hbW9kZSAhPSBBRERSX1NUQUNLKQotICAgIHsKLSAgICAgIGdldF9vcGVyYW5kcyAob3Bjb2RlLCBzdHIpOwotICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUpOwotICAgIH0KLQotICBpZiAob3Bjb2RlID09IDApCi0gICAgewotICAgICAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLQotCi0gICAgICBjaGFyICp3aGVyZSA9IGZyYWdfbW9yZSAoMSk7Ci0KLSAgICAgIHdoZXJlWzBdID0gMHgwOwotICAgICAgd2hlcmVbMV0gPSAweDA7Ci0gICAgICBhc19iYWQgKF8oImludmFsaWQgb3BlcmFuZHMgZm9yIG9wY29kZSIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYnVpbGRfTXl0ZXMgKG9wY29kZSk7Ci19Ci0KLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1ERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAqLwotY2hhciAqCi1tZF9hdG9mICh0eXBlLCBsaXRQLCBzaXplUCkKLSAgICAgY2hhciB0eXBlOwotICAgICBjaGFyICpsaXRQOwotICAgICBpbnQgKnNpemVQOwotewotICBpbnQgcHJlYzsKLSAgTElUVExFTlVNX1RZUEUgd29yZHNbTUFYX0xJVFRMRU5VTVNdOwotICBMSVRUTEVOVU1fVFlQRSAqd29yZFA7Ci0gIGNoYXIgKnQ7Ci0gIGNoYXIgKmF0b2ZfaWVlZSAoKTsKLQotICBzd2l0Y2ggKHR5cGUpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgIGNhc2UgJ0YnOgotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ1MnOgotICAgICAgcHJlYyA9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ3InOgotICAgIGNhc2UgJ1InOgotICAgICAgcHJlYyA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgcHJlYyA9IDY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAqc2l6ZVAgPSAwOwotICAgICAgcmV0dXJuIF8oIkJhZCBjYWxsIHRvIE1EX05UT0YoKSIpOwotICAgIH0KLSAgdCA9IGF0b2ZfaWVlZSAoaW5wdXRfbGluZV9wb2ludGVyLCB0eXBlLCB3b3Jkcyk7Ci0gIGlmICh0KQotICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHQ7Ci0KLSAgKnNpemVQID0gcHJlYyAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICBmb3IgKHdvcmRQID0gd29yZHMgKyBwcmVjIC0gMTsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsICh2YWx1ZVQpICgqd29yZFAtLSksIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKTsKLSAgICAgIGxpdFAgKz0gc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotaW50Ci1tZF9wYXJzZV9vcHRpb24gKGMsYSkKLSAgICBpbnQgYzsKLSAgICBjaGFyICphOwotCi17Ci0gIHJldHVybiAxOwotfQotCi12b2lkCi10Y19Ob3V0X2ZpeF90b19jaGFycyAoKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfTm91dF9maXhfdG9fY2hhcnMgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi0vKgotY2FsbGVkIGFmdGVyIHJlbGF4aW5nLCBjaGFuZ2UgdGhlIGZyYWdzIHNvIHRoZXkga25vdyBob3cgYmlnIHRoZXkgYXJlCi0qLwotdm9pZAotbWRfY29udmVydF9mcmFnIChoZWFkZXJzLCBzZWcsIGZyYWdQKQotICAgICBvYmplY3RfaGVhZGVycyAqaGVhZGVyczsKLSAgICAgc2VnVCBzZWc7Ci0gICAgIGZyYWdTICpmcmFnUDsKLXsKLSAgaW50IGRpc3Bfc2l6ZSA9IDA7Ci0gIGludCBpbnN0X3NpemUgPSAwOwotICB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSAoZnJhZ1AtPmZyX2ZpeCArIGZyYWdQLT5mcl9saXRlcmFsKTsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBjYXNlIEMgKENPTkRfQlJBTkNILCBCWVRFX0RJU1ApOgotICAgIGNhc2UgQyAoVU5DT05EX0JSQU5DSCwgQllURV9ESVNQKToKLSAgICAgIGRpc3Bfc2l6ZSA9IDE7Ci0gICAgICBpbnN0X3NpemUgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNvbmQgYnJhbmNoZXMgdG8gYSBrbm93biAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0gICAgY2FzZSBDIChDT05EX0JSQU5DSCwgV09SRF9ESVNQKToKLSAgICAgIHN3aXRjaCAoYnVmZmVyWzBdKQotCXsKLQljYXNlIE9QX0JDQzoKLQljYXNlIE9QX0JDUzoKLQljYXNlIE9QX0JFUToKLQljYXNlIE9QX0JNSToKLQljYXNlIE9QX0JORToKLQljYXNlIE9QX0JQTDoKLQljYXNlIE9QX0JWUzoKLQljYXNlIE9QX0JWQzoKLQkgIC8qIEludmVydCB0aGUgc2Vuc2Ugb2YgdGhlIHRlc3QgKi8KLQkgIGJ1ZmZlclswXSBePSAweDIwOwotCSAgYnVmZmVyWzFdID0gMzsJLyogSnVtcCBvdmVyIGZvbGxvd2luZyBicmwgKi8KLQkgIGJ1ZmZlclsyXSA9IE9QX0JSTDsKLQkgIGJ1ZmZlclszXSA9IDA7Ci0JICBidWZmZXJbNF0gPSAwOwotCSAgZGlzcF9zaXplID0gMjsKLQkgIGluc3Rfc2l6ZSA9IDM7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDIChVTkNPTkRfQlJBTkNILCBXT1JEX0RJU1ApOgotICAgICAgLyogVW5jb25kaXRpb25hbCBicmFuY2hlcyB0byBhIGtub3duIDE2IGJpdCBkaXNwbGFjZW1lbnQgKi8KLQotICAgICAgc3dpdGNoIChidWZmZXJbMF0pCi0JewotCWNhc2UgT1BfQlJBOgotCSAgYnVmZmVyWzBdID0gT1BfQlJMOwotCSAgZGlzcF9zaXplID0gMjsKLQkgIGluc3Rfc2l6ZSA9IDE7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgICAvKiBnb3QgdG8gY3JlYXRlIGEgYnJhbmNoIG92ZXIgYSByZWxvYyBoZXJlICovCi0gICAgY2FzZSBDIChDT05EX0JSQU5DSCwgVU5ERUZfV09SRF9ESVNQKToKLSAgICAgIGJ1ZmZlclswXSBePSAweDIwOwkvKiBpbnZlcnQgdGVzdCAqLwotICAgICAgYnVmZmVyWzFdID0gMzsKLSAgICAgIGJ1ZmZlclsyXSA9IE9QX0JSTDsKLSAgICAgIGJ1ZmZlclszXSA9IDA7Ci0gICAgICBidWZmZXJbNF0gPSAwOwotICAgICAgZml4X25ldyAoZnJhZ1AsCi0JICAgICAgIGZyYWdQLT5mcl9maXggKyAzLAotCSAgICAgICA0LAotCSAgICAgICBmcmFnUC0+ZnJfc3ltYm9sLAotCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0LAotCSAgICAgICAwLAotCSAgICAgICBSX1c2NV9QQ1IxNik7Ci0KLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEMgKFVOQ09ORF9CUkFOQ0gsIFVOREVGX1dPUkRfRElTUCk6Ci0gICAgICBidWZmZXJbMF0gPSBPUF9CUkw7Ci0gICAgICBidWZmZXJbMV0gPSAwOwotICAgICAgYnVmZmVyWzJdID0gMDsKLSAgICAgIGZpeF9uZXcgKGZyYWdQLAotCSAgICAgICBmcmFnUC0+ZnJfZml4ICsgMSwKLQkgICAgICAgNCwKLQkgICAgICAgZnJhZ1AtPmZyX3N5bWJvbCwKLQkgICAgICAgZnJhZ1AtPmZyX29mZnNldCwKLQkgICAgICAgMCwKLQkgICAgICAgUl9XNjVfUENSMTYpOwotCi0gICAgICBmcmFnUC0+ZnJfZml4ICs9IGRpc3Bfc2l6ZSArIGluc3Rfc2l6ZTsKLSAgICAgIGZyYWdQLT5mcl92YXIgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLSAgaWYgKGluc3Rfc2l6ZSkKLSAgICB7Ci0gICAgICAvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGludCBuZXh0X2luc3QgPSBmcmFnUC0+ZnJfZml4ICsgZnJhZ1AtPmZyX2FkZHJlc3MgKyBkaXNwX3NpemUgKyBpbnN0X3NpemU7Ci0gICAgICBpbnQgdGFyZ19hZGRyID0gKFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKSArCi0JCSAgICAgICBmcmFnUC0+ZnJfb2Zmc2V0KTsKLSAgICAgIGludCBkaXNwID0gdGFyZ19hZGRyIC0gbmV4dF9pbnN0OwotCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGJ1ZmZlciArIGluc3Rfc2l6ZSwgZGlzcCwgZGlzcF9zaXplKTsKLSAgICAgIGZyYWdQLT5mcl9maXggKz0gZGlzcF9zaXplICsgaW5zdF9zaXplOwotICAgICAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci0gICAgfQotfQotCi0KLXZhbHVlVAotREVGVU4gKG1kX3NlY3Rpb25fYWxpZ24sIChzZWcsIHNpemUpLAotICAgICAgIHNlZ1Qgc2VnIEFORAotICAgICAgIHZhbHVlVCBzaXplKQotewotICByZXR1cm4gKChzaXplICsgKDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkgLSAxKQotCSAgJiAoLTEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkpOwotCi19Ci0KLXZvaWQKLW1kX2FwcGx5X2ZpeCAoZml4UCwgdmFsKQotICAgICBmaXhTICpmaXhQOwotICAgICBsb25nIHZhbDsKLXsKLSAgY2hhciAqYnVmID0gZml4UC0+Znhfd2hlcmUgKyBmaXhQLT5meF9mcmFnLT5mcl9saXRlcmFsOwotICBpbnQgYWRkciA9IGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgKyBmaXhQLT5meF93aGVyZTsKLQotICBpZiAoZml4UC0+Znhfcl90eXBlID09IDApCi0gICAgewotICAgICAgaWYgKGZpeFAtPmZ4X3NpemUgPT0gMSkKLQlmaXhQLT5meF9yX3R5cGUgPSBSX1c2NV9BQlM4OwotICAgICAgZWxzZQotCWZpeFAtPmZ4X3JfdHlwZSA9IFJfVzY1X0FCUzE2OwotICAgIH0KLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX1c2NV9BQlM4UzE2OgotICAgICAgdmFsID4+PSA4OwotICAgIGNhc2UgUl9XNjVfQUJTOFM4OgotICAgICAgdmFsID4+PSA4OwotICAgIGNhc2UgUl9XNjVfQUJTODoKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfQUJTMTZTMTY6Ci0gICAgICB2YWwgPj49IDg7Ci0gICAgY2FzZSBSX1c2NV9BQlMxNlM4OgotICAgICAgdmFsID4+PSA4OwotICAgIGNhc2UgUl9XNjVfQUJTMTY6Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9BQlMyNDoKLSAgICAgICpidWYrKyA9IHZhbCA+PiAwOwotICAgICAgKmJ1ZisrID0gdmFsID4+IDg7Ci0gICAgICAqYnVmKysgPSB2YWwgPj4gMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfVzY1X1BDUjg6Ci0gICAgICAqYnVmKysgPSB2YWwgLSBhZGRyIC0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9XNjVfUENSMTY6Ci0gICAgICB2YWwgPSB2YWwgLSBhZGRyIC0gMTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgICpidWYrKyA9IHZhbCA+PiA4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSX1c2NV9EUDoKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotLyogUHV0IG51bWJlciBpbnRvIHRhcmdldCBieXRlIG9yZGVyICovCi0KLXZvaWQKLW1kX251bWJlcl90b19jaGFycyAocHRyLCB1c2UsIG5ieXRlcykKLSAgICAgY2hhciAqcHRyOwotICAgICB2YWx1ZVQgdXNlOwotICAgICBpbnQgbmJ5dGVzOwotewotICBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIChwdHIsIHVzZSwgbmJ5dGVzKTsKLX0KLQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgaW50IGdhcCA9IGZpeFAtPmZ4X3NpemUgKyBmaXhQLT5meF93aGVyZSArIGZpeFAtPmZ4X2ZyYWctPmZyX2FkZHJlc3MgLSAxOwotICByZXR1cm4gZ2FwOwotfQotCi12b2lkCi10Y19jb2ZmX3N5bWJvbF9lbWl0X2hvb2sgKHgpCi0gICAgc3ltYm9sUyAqeDsKLXsKLX0KLQotc2hvcnQKLXRjX2NvZmZfZml4MnJ0eXBlIChmaXhfcHRyKQotICAgICBmaXhTICpmaXhfcHRyOwotewotICByZXR1cm4gZml4X3B0ci0+Znhfcl90eXBlOwotfQotCi12b2lkCi10Y19yZWxvY19tYW5nbGUgKGZpeF9wdHIsIGludHIsIGJhc2UpCi0gICAgIGZpeFMgKmZpeF9wdHI7Ci0gICAgIHN0cnVjdCBpbnRlcm5hbF9yZWxvYyAqaW50cjsKLSAgICAgYmZkX3ZtYSBiYXNlOwotCi17Ci0gIHN5bWJvbFMgKnN5bWJvbF9wdHI7Ci0KLSAgc3ltYm9sX3B0ciA9IGZpeF9wdHItPmZ4X2FkZHN5OwotCi0gIC8qIElmIHRoaXMgcmVsb2NhdGlvbiBpcyBhdHRhY2hlZCB0byBhIHN5bWJvbCB0aGVuIGl0J3Mgb2sKLSAgICAgdG8gb3V0cHV0IGl0ICovCi0gIGlmIChmaXhfcHRyLT5meF9yX3R5cGUgPT0gUkVMT0NfMzIpCi0gICAgewotICAgICAgLyogY29ucyBsaWtlcyB0byBjcmVhdGUgcmVsb2MzMidzIHdoYXRldmVyIHRoZSBzaXplIG9mIHRoZSByZWxvYy4uCi0gICAgICAgKi8KLSAgICAgIHN3aXRjaCAoZml4X3B0ci0+Znhfc2l6ZSkKLQl7Ci0JY2FzZSAyOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU0xNjsKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIGludHItPnJfdHlwZSA9IFJfSU1NODsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKGZpeF9wdHItPmZ4X3NpemUgPT0gNCkKLQlpbnRyLT5yX3R5cGUgPSBSX1c2NV9BQlMyNDsKLSAgICAgIGVsc2UKLQlpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICAvKiBUdXJuIHRoZSBzZWdtZW50IG9mIHRoZSBzeW1ib2wgaW50byBhbiBvZmZzZXQuICAqLwotICBpZiAoc3ltYm9sX3B0cikKLSAgICB7Ci0gICAgICBzeW1ib2xTICpkb3Q7Ci0KLSAgICAgIGRvdCA9IHNlZ21lbnRfaW5mb1tTX0dFVF9TRUdNRU5UIChzeW1ib2xfcHRyKV0uZG90OwotICAgICAgaWYgKGRvdCkKLQl7Ci0JICBpbnRyLT5yX29mZnNldCArPSBTX0dFVF9WQUxVRSAoc3ltYm9sX3B0cik7Ci0JICBpbnRyLT5yX3N5bW5keCA9IGRvdC0+c3lfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaW50ci0+cl9zeW1uZHggPSAtMTsKLSAgICB9Ci19Ci0KLWludAotdGNfY29mZl9zaXplbWFjaGRlcCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIHJldHVybiBtZF9yZWxheF90YWJsZVtmcmFnLT5mcl9zdWJ0eXBlXS5ybHhfbGVuZ3RoOwotfQotCi0KLQotCi0KLS8qCi1jYWxsZWQganVzdCBiZWZvcmUgYWRkcmVzcyByZWxheGF0aW9uLCByZXR1cm4gdGhlIGxlbmd0aAotYnkgd2hpY2ggYSBmcmFnbWVudCBtdXN0IGdyb3cgdG8gcmVhY2ggaXQncyBkZXN0aW5hdGlvbgotKi8KLWludAotbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50X3R5cGUpCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLSAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50X3R5cGU7Ci17Ci0gIGludCB3aGF0ID0gR0VUX1dIQVQgKGZyYWdQLT5mcl9zdWJ0eXBlKTsKLQotICBzd2l0Y2ggKGZyYWdQLT5mcl9zdWJ0eXBlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgY2FzZSBDIChDT05EX0JSQU5DSCwgVU5ERUZfQllURV9ESVNQKToKLSAgICBjYXNlIEMgKFVOQ09ORF9CUkFOQ0gsIFVOREVGX0JZVEVfRElTUCk6Ci0gICAgICAvKiB1c2VkIHRvIGJlIGEgYnJhbmNoIHRvIHNvbWV3aGVyZSB3aGljaCB3YXMgdW5rbm93biAqLwotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKGZyYWdQLT5mcl9zeW1ib2wpID09IHNlZ21lbnRfdHlwZSkKLQl7Ci0JICAvKiBHb3QgYSBzeW1ib2wgYW5kIGl0J3MgZGVmaW5lZCBpbiB0aGlzIHNlZ21lbnQsIGJlY29tZSBieXRlCi0JIHNpemVkIC0gbWF5YmUgaXQgd2lsbCBmaXggdXAgKi8KLQkgIGZyYWdQLT5mcl9zdWJ0eXBlID0gQyAod2hhdCwgQllURV9ESVNQKTsKLQkgIGZyYWdQLT5mcl92YXIgPSBtZF9yZWxheF90YWJsZVtDICh3aGF0LCBCWVRFX0RJU1ApXS5ybHhfbGVuZ3RoOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBJdHMgZ290IGEgc2VnbWVudCwgYnV0IGl0cyBub3Qgb3Vycywgc28gaXQgd2lsbCBhbHdheXMgYmUgbG9uZyAqLwotCSAgZnJhZ1AtPmZyX3N1YnR5cGUgPSBDICh3aGF0LCBVTkRFRl9XT1JEX0RJU1ApOwotCSAgZnJhZ1AtPmZyX3ZhciA9IG1kX3JlbGF4X3RhYmxlW0MgKHdoYXQsIFdPUkRfRElTUCldLnJseF9sZW5ndGg7Ci0JICByZXR1cm4gbWRfcmVsYXhfdGFibGVbQyAod2hhdCwgV09SRF9ESVNQKV0ucmx4X2xlbmd0aDsKLQl9Ci0gICAgfQotICByZXR1cm4gZnJhZ1AtPmZyX3ZhcjsKLX0KLQotCi0KLUNPTlNUIGNoYXIgKm1kX3Nob3J0b3B0cyA9ICIiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotI2RlZmluZSBPUFRJT05fUkVMQVggKE9QVElPTl9NRF9CQVNFKQotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19OwotCi12b2lkCi1tZF9zaG93X3VzYWdlIChzdHJlYW0pCi0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLQotfQotCi1zaXplX3QgbWRfbG9uZ29wdHNfc2l6ZSA9IHNpemVvZihtZF9sb25nb3B0cyk7CmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXc2NS5oIGIvZ2FzL2NvbmZpZy90Yy13NjUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5NGFkMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXc2NS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRjLXc2NS5oCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2RlZmluZSBUQ19XNjUKLQotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAwCi0KLSNpZiBBTlNJX1BST1RPVFlQRVMKLXN0cnVjdCBpbnRlcm5hbF9yZWxvYzsKLSNlbmRpZgotCi0jZGVmaW5lIFdPUktJTkdfRE9UX1dPUkQKLQotLyogVGhpcyBtYWNybyB0cmFuc2xhdGVzIGJldHdlZW4gYW4gaW50ZXJuYWwgZml4IGFuZCBhbiBjb2ZmIHJlbG9jIHR5cGUgKi8KLSNkZWZpbmUgVENfQ09GRl9GSVgyUlRZUEUoZml4UCkgdGNfY29mZl9maXgycnR5cGUoZml4UCkKLQotI2RlZmluZSBCRkRfQVJDSCBiZmRfYXJjaF93NjUKLSNkZWZpbmUgQ09GRl9NQUdJQyAweDY1MDAKLQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCi1leHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOwotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJXNjU4MTYgR0FTICIKLSNkZWZpbmUgTkVFRF9GWF9SX1RZUEUgMQotI2RlZmluZSBSRUxPQ18zMiAxMjM0Ci0KLSNkZWZpbmUgVENfQ09GRl9TSVpFTUFDSERFUChmcmFnKSB0Y19jb2ZmX3NpemVtYWNoZGVwKGZyYWcpCi0jZGVmaW5lIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTihFWFAsIE5CWVRFUykgdzY1X2V4cHJlc3Npb24gKEVYUCwgTkJZVEVTKQotI2RlZmluZSBUQ19DT1VOVF9SRUxPQyh4KSAoMSkKLSNkZWZpbmUgVENfQ09OU19SRUxPQyB0Y19jb25zX3JlbG9jCi0jZGVmaW5lIERPTlRfT1ZFUkZMT1cKLWludCB0Y19jb25zX3JlbG9jOwotCi0jZGVmaW5lIG1kX29wZXJhbmQoeCkKLQotZXh0ZXJuIHN0cnVjdCByZWxheF90eXBlIG1kX3JlbGF4X3RhYmxlW107Ci0jZGVmaW5lIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUgbWRfcmVsYXhfdGFibGUKLQotLyogZW5kIG9mIHRjLXc2NS5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RjLXo4ay5jIGIvZ2FzL2NvbmZpZy90Yy16OGsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg5YjE0Yi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RjLXo4ay5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU4OSArMCwwIEBACi0vKiB0Yy16OGsuYyAtLSBBc3NlbWJsZSBjb2RlIGZvciB0aGUgWmlsb2cgWjgwMG4KLSAgIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gIFdyaXR0ZW4gQnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAgc2FjQGN5Z251cy5jb20KLSAgKi8KLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgIm9wY29kZXMvejhrLW9wYy5oIgotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi1jb25zdCBjaGFyIGNvbW1lbnRfY2hhcnNbXSA9Ci17JyEnLCAwfTsKLWNvbnN0IGNoYXIgbGluZV9zZXBhcmF0b3JfY2hhcnNbXSA9Ci17JzsnLCAwfTsKLWNvbnN0IGNoYXIgbGluZV9jb21tZW50X2NoYXJzW10gPQoteycjJywgMH07Ci0KLWV4dGVybiBpbnQgbWFjaGluZTsKLWV4dGVybiBpbnQgY29mZl9mbGFnczsKLWludCBzZWdtZW50ZWRfbW9kZTsKLWNvbnN0IGludCBtZF9yZWxvY19zaXplOwotCi0vKiBUaGlzIHRhYmxlIGRlc2NyaWJlcyBhbGwgdGhlIG1hY2hpbmUgc3BlY2lmaWMgcHNldWRvLW9wcyB0aGUgYXNzZW1ibGVyCi0gICBoYXMgdG8gc3VwcG9ydC4gIFRoZSBmaWVsZHMgYXJlOgotICAgcHNldWRvLW9wIG5hbWUgd2l0aG91dCBkb3QKLSAgIGZ1bmN0aW9uIHRvIGNhbGwgdG8gZXhlY3V0ZSB0aGlzIHBzZXVkby1vcAotICAgSW50ZWdlciBhcmcgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24KLSAgICovCi0KLXZvaWQgY29ucyAoKTsKLQotdm9pZAotc19zZWdtICgpCi17Ci0gIHNlZ21lbnRlZF9tb2RlID0gMTsKLSAgbWFjaGluZSA9IGJmZF9tYWNoX3o4MDAxOwotICBjb2ZmX2ZsYWdzID0gRl9aODAwMTsKLX0KLQotdm9pZAotc191bnNlZyAoKQotewotICBzZWdtZW50ZWRfbW9kZSA9IDA7Ci0gIG1hY2hpbmUgPSBiZmRfbWFjaF96ODAwMjsKLSAgY29mZl9mbGFncyA9IEZfWjgwMDI7Ci19Ci0KLXN0YXRpYwotdm9pZAotZXZlbiAoKQotewotICBmcmFnX2FsaWduICgxLCAwLCAwKTsKLSAgcmVjb3JkX2FsaWdubWVudCAobm93X3NlZywgMSk7Ci19Ci0KLXZvaWQgb2JqX2NvZmZfc2VjdGlvbiAoKTsKLQotaW50Ci10b2hleCAoYykKLSAgICAgaW50IGM7Ci17Ci0gIGlmIChpc2RpZ2l0IChjKSkKLSAgICByZXR1cm4gYyAtICcwJzsKLSAgaWYgKGlzbG93ZXIgKGMpKQotICAgIHJldHVybiBjIC0gJ2EnICsgMTA7Ci0gIHJldHVybiBjIC0gJ0EnICsgMTA7Ci19Ci0KLXZvaWQKLXN2YWwgKCkKLXsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycpCi0gICAgewotICAgICAgaW50IGM7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICB3aGlsZSAoYyAhPSAnXCcnKQotCXsKLQkgIGlmIChjID09ICclJykKLQkgICAgewotCSAgICAgIGMgPSAodG9oZXggKGlucHV0X2xpbmVfcG9pbnRlclswXSkgPDwgNCkKLQkJfCB0b2hleCAoaW5wdXRfbGluZV9wb2ludGVyWzFdKTsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQkgICAgfQotCSAgRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKLQkgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JfQotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICB9Ci0KLX0KLWNvbnN0IHBzZXVkb190eXBlUyBtZF9wc2V1ZG9fdGFibGVbXSA9Ci17Ci0gIHsiaW50IiwgY29ucywgMn0sCi0gIHsiZGF0YS5iIiwgY29ucywgMX0sCi0gIHsiZGF0YS53IiwgY29ucywgMn0sCi0gIHsiZGF0YS5sIiwgY29ucywgNH0sCi0gIHsiZm9ybSIsIGxpc3RpbmdfcHNpemUsIDB9LAotICB7ImhlYWRpbmciLCBsaXN0aW5nX3RpdGxlLCAwfSwKLSAgeyJpbXBvcnQiLCBzX2lnbm9yZSwgMH0sCi0gIHsicGFnZSIsIGxpc3RpbmdfZWplY3QsIDB9LAotICB7InByb2dyYW0iLCBzX2lnbm9yZSwgMH0sCi0gIHsiejgwMDEiLCBzX3NlZ20sIDB9LAotICB7Ino4MDAyIiwgc191bnNlZywgMH0sCi0KLQotICB7InNlZ20iLCBzX3NlZ20sIDB9LAotICB7InVuc2VnbSIsIHNfdW5zZWcsIDB9LAotICB7InVuc2VnIiwgc191bnNlZywgMH0sCi0gIHsibmFtZSIsIHNfYXBwX2ZpbGUsIDB9LAotICB7Imdsb2JhbCIsIHNfZ2xvYmwsIDB9LAotICB7Ind2YWwiLCBjb25zLCAyfSwKLSAgeyJsdmFsIiwgY29ucywgNH0sCi0gIHsiYnZhbCIsIGNvbnMsIDF9LAotICB7InN2YWwiLCBzdmFsLCAwfSwKLSAgeyJyc2VjdCIsIG9ial9jb2ZmX3NlY3Rpb24sIDB9LAotICB7InNlY3QiLCBvYmpfY29mZl9zZWN0aW9uLCAwfSwKLSAgeyJibG9jayIsIHNfc3BhY2UsIDB9LAotICB7ImV2ZW4iLCBldmVuLCAwfSwKLSAgezAsIDAsIDB9Ci19OwotCi1jb25zdCBjaGFyIEVYUF9DSEFSU1tdID0gImVFIjsKLQotLyogQ2hhcnMgdGhhdCBtZWFuIHRoaXMgbnVtYmVyIGlzIGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgKi8KLS8qIEFzIGluIDBmMTIuNDU2ICovCi0vKiBvciAgICAwZDEuMjM0NWUxMiAqLwotY29uc3QgY2hhciBGTFRfQ0hBUlNbXSA9ICJyUnNTZkZkRHhYcFAiOwotCi1zdGF0aWMgc3RydWN0IGhhc2hfY29udHJvbCAqb3Bjb2RlX2hhc2hfY29udHJvbDsJLyogT3Bjb2RlIG1uZW1vbmljcyAqLwotCi12b2lkCi1tZF9iZWdpbiAoKQotewotICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOwotICBjaGFyICpwcmV2X25hbWUgPSAiIjsKLSAgaW50IGlkeCA9IDA7Ci0KLSAgb3Bjb2RlX2hhc2hfY29udHJvbCA9IGhhc2hfbmV3ICgpOwotCi0gIGZvciAob3Bjb2RlID0gejhrX3RhYmxlOyBvcGNvZGUtPm5hbWU7IG9wY29kZSsrKQotICAgIHsKLSAgICAgIC8qIE9ubHkgZW50ZXIgdW5pcXVlIGNvZGVzIGludG8gdGhlIHRhYmxlICovCi0gICAgICBjaGFyICpzcmMgPSBvcGNvZGUtPm5hbWU7Ci0KLSAgICAgIGlmIChzdHJjbXAgKG9wY29kZS0+bmFtZSwgcHJldl9uYW1lKSkKLQl7Ci0JICBoYXNoX2luc2VydCAob3Bjb2RlX2hhc2hfY29udHJvbCwgb3Bjb2RlLT5uYW1lLCAoY2hhciAqKSBvcGNvZGUpOwotCSAgaWR4Kys7Ci0JfQotICAgICAgb3Bjb2RlLT5pZHggPSBpZHg7Ci0gICAgICBwcmV2X25hbWUgPSBvcGNvZGUtPm5hbWU7Ci0gICAgfQotCi0gIC8qIGRlZmF1bHQgdG8gejgwMDIgKi8KLSAgc191bnNlZyAoKTsKLQotICAvKiBpbnNlcnQgdGhlIHBzZXVkbyBvcHMgdG9vICovCi0gIGZvciAoaWR4ID0gMDsgbWRfcHNldWRvX3RhYmxlW2lkeF0ucG9jX25hbWU7IGlkeCsrKQotICAgIHsKLSAgICAgIG9wY29kZV9lbnRyeV90eXBlICpmYWtlX29wY29kZTsKLSAgICAgIGZha2Vfb3Bjb2RlID0gKG9wY29kZV9lbnRyeV90eXBlICopIG1hbGxvYyAoc2l6ZW9mIChvcGNvZGVfZW50cnlfdHlwZSkpOwotICAgICAgZmFrZV9vcGNvZGUtPm5hbWUgPSBtZF9wc2V1ZG9fdGFibGVbaWR4XS5wb2NfbmFtZSwKLQlmYWtlX29wY29kZS0+ZnVuYyA9ICh2b2lkICopIChtZF9wc2V1ZG9fdGFibGUgKyBpZHgpOwotICAgICAgZmFrZV9vcGNvZGUtPm9wY29kZSA9IDI1MDsKLSAgICAgIGhhc2hfaW5zZXJ0IChvcGNvZGVfaGFzaF9jb250cm9sLCBmYWtlX29wY29kZS0+bmFtZSwgZmFrZV9vcGNvZGUpOwotICAgIH0KLQotICBsaW5rcmVsYXggPSAxOwotfQotCi1zdHJ1Y3QgejhrX2V4cAotewotICBjaGFyICplX2JlZzsKLSAgY2hhciAqZV9lbmQ7Ci0gIGV4cHJlc3Npb25TIGVfZXhwOwotfTsKLXR5cGVkZWYgc3RydWN0IHo4a19vcAotewotICBjaGFyIHJlZ3NpemU7CQkJLyogJ2InLCd3JywncicsJ3EnICovCi0gIHVuc2lnbmVkIGludCByZWc7CQkvKiAwLi4xNSAqLwotCi0gIGludCBtb2RlOwotCi0gIHVuc2lnbmVkIGludCB4X3JlZzsJCS8qIGFueSBvdGhlciByZWdpc3RlciBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGUgKi8KLSAgZXhwcmVzc2lvblMgZXhwOwkJLyogYW55IGV4cHJlc3Npb24gKi8KLX0KLQotb3BfdHlwZTsKLQotc3RhdGljIGV4cHJlc3Npb25TICpkYV9vcGVyYW5kOwotc3RhdGljIGV4cHJlc3Npb25TICppbW1fb3BlcmFuZDsKLQotaW50IHJlZ1sxNl07Ci1pbnQgdGhlX2NjOwotaW50IHRoZV9jdHJsOwotaW50IHRoZV9mbGFnczsKLWludCB0aGVfaW50ZXJydXB0OwotCi1jaGFyICoKLURFRlVOICh3aGF0cmVnLCAocmVnLCBzcmMpLAotICAgICAgIGludCAqcmVnIEFORAotICAgICAgIGNoYXIgKnNyYykKLXsKLSAgaWYgKGlzZGlnaXQgKHNyY1sxXSkpCi0gICAgewotICAgICAgKnJlZyA9IChzcmNbMF0gLSAnMCcpICogMTAgKyBzcmNbMV0gLSAnMCc7Ci0gICAgICByZXR1cm4gc3JjICsgMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqcmVnID0gKHNyY1swXSAtICcwJyk7Ci0gICAgICByZXR1cm4gc3JjICsgMTsKLSAgICB9Ci19Ci0KLS8qCi0gIHBhcnNlIG9wZXJhbmRzCi0KLSAgcmgwLXJoNywgcmwwLXJsNwotICByMC1yMTUKLSAgcnIwLXJyMTQKLSAgcnEwLS1ycTEyCi0gIFdSRUcgcjAscjEscjIscjMscjQscjUscjYscjcsZnAsc3AKLSAgcjBsLHIwaCwuLnI3bCxyN2gKLSAgQFdSRUcKLSAgQFdSRUcrCi0gIEAtV1JFRwotICAjY29uc3QKLQotICAqLwotCi0vKiB0cnkgYW5kIHBhcnNlIGEgcmVnIG5hbWUsIHJldHVybnMgbnVtYmVyIG9mIGNoYXJzIGNvbnN1bWVkICovCi1jaGFyICoKLURFRlVOIChwYXJzZV9yZWcsIChzcmMsIG1vZGUsIHJlZyksCi0gICAgICAgY2hhciAqc3JjIEFORAotICAgICAgIGludCAqbW9kZSBBTkQKLSAgICAgICB1bnNpZ25lZCBpbnQgKnJlZykKLXsKLSAgY2hhciAqcmVzID0gMDsKLSAgY2hhciByZWdubzsKLQotICBpZiAoc3JjWzBdID09ICdzJyAmJiBzcmNbMV0gPT0gJ3AnKQotICAgIHsKLSAgICAgIGlmIChzZWdtZW50ZWRfbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0xPTkc7Ci0gICAgICAgICAgKnJlZyA9IDE0OwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqbW9kZSA9IENMQVNTX1JFR19XT1JEOwotICAgICAgICAgICpyZWcgPSAxNTsKLSAgICAgICAgfQotICAgICAgcmV0dXJuIHNyYyArIDI7Ci0gICAgfQotICBpZiAoc3JjWzBdID09ICdyJykKLSAgICB7Ci0gICAgICBpZiAoc3JjWzFdID09ICdyJykKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0xPTkc7Ci0gICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAyKTsKLQkgIHJlZ25vID0gKnJlZzsKLQkgIGlmIChyZWdubyA+IDE0KQotICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciByciVkLCBvdXQgb2YgcmFuZ2UuIikscmVnbm8pOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChzcmNbMV0gPT0gJ2gnKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfQllURTsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gNykKLSAgICAgICAgICAJYXNfd2FybiAoXygicmVnaXN0ZXIgcmglZCwgb3V0IG9mIHJhbmdlLiIpLHJlZ25vKTsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAoc3JjWzFdID09ICdsJykKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX0JZVEU7Ci0gICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAyKTsKLQkgIHJlZ25vID0gKnJlZzsKLQkgIGlmIChyZWdubyA+IDcpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJsJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgICAgKnJlZyArPSA4OwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChzcmNbMV0gPT0gJ3EnKQotICAgICAgICB7Ci0gICAgICAgICAgKm1vZGUgPSBDTEFTU19SRUdfUVVBRDsKLSAgICAgICAgICByZXMgPSB3aGF0cmVnIChyZWcsIHNyYyArIDIpOwotCSAgcmVnbm8gPSAqcmVnOwotCSAgaWYgKHJlZ25vID4gMTIpCi0gICAgICAgICAgCWFzX3dhcm4gKF8oInJlZ2lzdGVyIHJxJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICptb2RlID0gQ0xBU1NfUkVHX1dPUkQ7Ci0gICAgICAgICAgcmVzID0gd2hhdHJlZyAocmVnLCBzcmMgKyAxKTsKLQkgIHJlZ25vID0gKnJlZzsKLQkgIGlmIChyZWdubyA+IDE1KQotICAgICAgICAgIAlhc193YXJuIChfKCJyZWdpc3RlciByJWQsIG91dCBvZiByYW5nZS4iKSxyZWdubyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIHJldHVybiByZXM7Ci0KLX0KLQotY2hhciAqCi1ERUZVTiAocGFyc2VfZXhwLCAocywgb3ApLAotICAgICAgIGNoYXIgKnMgQU5ECi0gICAgICAgZXhwcmVzc2lvblMgKiBvcCkKLXsKLSAgY2hhciAqc2F2ZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqbmV3OwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHM7Ci0gIGV4cHJlc3Npb24gKG9wKTsKLSAgaWYgKG9wLT5YX29wID09IE9fYWJzZW50KQotICAgIGFzX2JhZCAoXygibWlzc2luZyBvcGVyYW5kIikpOwotICBuZXcgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmU7Ci0gIHJldHVybiBuZXc7Ci19Ci0KLS8qIFRoZSBtYW55IGZvcm1zIG9mIG9wZXJhbmQ6Ci0KLSAgIDxyYj4KLSAgIDxyPgotICAgPHJyPgotICAgPHJxPgotICAgQHIKLSAgICNleHAKLSAgIGV4cAotICAgZXhwKHIpCi0gICByKCNleHApCi0gICByKHIpCi0KLQotCi0gICAqLwotCi1zdGF0aWMKLWNoYXIgKgotREVGVU4gKGNoZWNrZm9yLCAocHRyLCB3aGF0KSwKLSAgICAgICBjaGFyICpwdHIgQU5ECi0gICAgICAgY2hhciB3aGF0KQotewotICBpZiAoKnB0ciA9PSB3aGF0KQotICAgIHB0cisrOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJleHBlY3RlZCAlYyIpLCB3aGF0KTsKLSAgICB9Ci0gIHJldHVybiBwdHI7Ci19Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgbW9kZSBzdXBwbGllZCBpcyB0aGUgc2l6ZSBvZiBhIHdvcmQgKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocmVnd29yZCwgKG1vZGUsIHN0cmluZyksCi0gICAgICAgaW50IG1vZGUgQU5ECi0gICAgICAgY2hhciAqc3RyaW5nKQotewotICBpbnQgb2s7Ci0KLSAgb2sgPSBDTEFTU19SRUdfV09SRDsKLSAgaWYgKG9rICE9IG1vZGUpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJyZWdpc3RlciBpcyB3cm9uZyBzaXplIGZvciBhIHdvcmQgJXMiKSwgc3RyaW5nKTsKLSAgICB9Ci19Ci0KLS8qIE1ha2Ugc3VyZSB0aGUgbW9kZSBzdXBwbGllZCBpcyB0aGUgc2l6ZSBvZiBhbiBhZGRyZXNzICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHJlZ2FkZHIsIChtb2RlLCBzdHJpbmcpLAotICAgICAgIGludCBtb2RlIEFORAotICAgICAgIGNoYXIgKnN0cmluZykKLXsKLSAgaW50IG9rOwotCi0gIG9rID0gc2VnbWVudGVkX21vZGUgPyBDTEFTU19SRUdfTE9ORyA6IENMQVNTX1JFR19XT1JEOwotICBpZiAob2sgIT0gbW9kZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInJlZ2lzdGVyIGlzIHdyb25nIHNpemUgZm9yIGFkZHJlc3MgJXMiKSwgc3RyaW5nKTsKLSAgICB9Ci19Ci0KLXN0cnVjdCBjdHJsX25hbWVzCi17Ci0gICBpbnQgdmFsdWU7Ci0gICBjaGFyICpuYW1lOwotfTsKLQotc3RydWN0IGN0cmxfbmFtZXMgY3RybF90YWJsZVtdID0KLXsKLSAgIDB4MiwgImZjdyIsCi0gICAwWDMsICJyZWZyZXNoIiwKLSAgIDB4NCwgInBzYXBzZWciLAotICAgMHg1LCAicHNhcG9mZiIsCi0gICAweDUsICJwc2FwIiwKLSAgIDB4NiwgIm5zcHNlZyIsCi0gICAweDcsICJuc3BvZmYiLAotICAgMHg3LCAibnNwIiwKLSAgIDAsIDAKLX07Ci0gICAKLXN0YXRpYyB2b2lkCi1ERUZVTiAoZ2V0X2N0cmxfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKLSAgICAgICBjaGFyICoqcHRyIEFORAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGRzdCkKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IHI7Ci0gIGludCBpOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLQotICBtb2RlLT5tb2RlID0gQ0xBU1NfQ1RSTDsKLSAgZm9yIChpID0gMDsgY3RybF90YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgaW50IGo7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGN0cmxfdGFibGVbaV0ubmFtZVtqXTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGN0cmxfdGFibGVbaV0ubmFtZVtqXSAhPSBzcmNbal0pCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLSAgICAgIHRoZV9jdHJsID0gY3RybF90YWJsZVtpXS52YWx1ZTsKLSAgICAgICpwdHIgPSBzcmMgKyBqOwotICAgICAgcmV0dXJuOwotICAgIGZhaWw6OwotICAgIH0KLSAgdGhlX2N0cmwgPSAwOwotICByZXR1cm47Ci19Ci0KLXN0cnVjdCBmbGFnX25hbWVzCi17Ci0gIGludCB2YWx1ZTsKLSAgY2hhciAqbmFtZTsKLQotfTsKLQotc3RydWN0IGZsYWdfbmFtZXMgZmxhZ190YWJsZVtdID0KLXsKLSAgMHgxLCAicCIsCi0gIDB4MSwgInYiLAotICAweDIsICJzIiwKLSAgMHg0LCAieiIsCi0gIDB4OCwgImMiLAotICAweDAsICIrIiwKLSAgMCwgMAotfTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChnZXRfZmxhZ3Nfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKLSAgICAgICBjaGFyICoqcHRyIEFORAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGRzdCkKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IHI7Ci0gIGludCBpOwotICBpbnQgajsKLQotICB3aGlsZSAoKnNyYyA9PSAnICcpCi0gICAgc3JjKys7Ci0KLSAgbW9kZS0+bW9kZSA9IENMQVNTX0ZMQUdTOwotICB0aGVfZmxhZ3MgPSAwOwotICBmb3IgKGogPSAwOyBqIDw9IDk7IGorKykKLSAgICB7Ci0gICAgIGlmICghc3JjW2pdKQotCWdvdG8gZG9uZTsKLSAgICAgZm9yIChpID0gMDsgZmxhZ190YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZmxhZ190YWJsZVtpXS5uYW1lWzBdID09IHNyY1tqXSkKLQkJewotCSAgICAgICAgdGhlX2ZsYWdzID0gdGhlX2ZsYWdzIHwgZmxhZ190YWJsZVtpXS52YWx1ZTsKLQkJZ290byBtYXRjaDsKLQkJfQotICAgICAgICB9Ci0gICAgICBnb3RvIGRvbmU7Ci0gICAgbWF0Y2g6Ci0gICAgIDsKLSAgICB9Ci0gIGRvbmU6Ci0gICpwdHIgPSBzcmMgKyBqOwotICByZXR1cm47Ci19Ci0KLQotc3RydWN0IGludGVycnVwdF9uYW1lcwotewotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKm5hbWU7Ci0KLX07Ci0KLXN0cnVjdCBpbnRlcnJ1cHRfbmFtZXMgaW50cl90YWJsZVtdID0KLXsKLSAgMHgxLCAibnZpIiwKLSAgMHgyLCAidmkiLAotICAweDMsICJib3RoIiwKLSAgMHgzLCAiYWxsIiwKLSAgMCwgMAotfTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChnZXRfaW50ZXJydXB0X29wZXJhbmQsIChwdHIsIG1vZGUsIGRzdCksCi0gICAgICAgY2hhciAqKnB0ciBBTkQKLSAgICAgICBzdHJ1Y3QgejhrX29wICptb2RlIEFORAotICAgICAgIHVuc2lnbmVkIGludCBkc3QpCi17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGludCByOwotICBpbnQgaTsKLQotICB3aGlsZSAoKnNyYyA9PSAnICcpCi0gICAgc3JjKys7Ci0KLSAgbW9kZS0+bW9kZSA9IENMQVNTX0lNTTsKLSAgZm9yIChpID0gMDsgaW50cl90YWJsZVtpXS5uYW1lOyBpKyspCi0gICAgewotICAgICAgaW50IGo7Ci0KLSAgICAgIGZvciAoaiA9IDA7IGludHJfdGFibGVbaV0ubmFtZVtqXTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGludHJfdGFibGVbaV0ubmFtZVtqXSAhPSBzcmNbal0pCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLSAgICAgIHRoZV9pbnRlcnJ1cHQgPSBpbnRyX3RhYmxlW2ldLnZhbHVlOwotICAgICAgKnB0ciA9IHNyYyArIGo7Ci0gICAgICByZXR1cm47Ci0gICAgZmFpbDo7Ci0gICAgfQotICB0aGVfaW50ZXJydXB0ID0gMHgwOwotICByZXR1cm47Ci19Ci0KLXN0cnVjdCBjY19uYW1lcwotewotICBpbnQgdmFsdWU7Ci0gIGNoYXIgKm5hbWU7Ci0KLX07Ci0KLXN0cnVjdCBjY19uYW1lcyB0YWJsZVtdID0KLXsKLSAgMHgwLCAiZiIsCi0gIDB4MSwgImx0IiwKLSAgMHgyLCAibGUiLAotICAweDMsICJ1bGUiLAotICAweDQsICJvdiIsCi0gIDB4NCwgInBlIiwKLSAgMHg1LCAibWkiLAotICAweDYsICJlcSIsCi0gIDB4NiwgInoiLAotICAweDcsICJjIiwKLSAgMHg3LCAidWx0IiwKLSAgMHg4LCAidCIsCi0gIDB4OSwgImdlIiwKLSAgMHhhLCAiZ3QiLAotICAweGIsICJ1Z3QiLAotICAweGMsICJub3YiLAotICAweGMsICJwbyIsCi0gIDB4ZCwgInBsIiwKLSAgMHhlLCAibmUiLAotICAweGUsICJueiIsCi0gIDB4ZiwgIm5jIiwKLSAgMHhmLCAidWdlIiwKLSAgMCwgMAotfTsKLQotc3RhdGljIHZvaWQKLURFRlVOIChnZXRfY2Nfb3BlcmFuZCwgKHB0ciwgbW9kZSwgZHN0KSwKLSAgICAgICBjaGFyICoqcHRyIEFORAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm1vZGUgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IGRzdCkKLXsKLSAgY2hhciAqc3JjID0gKnB0cjsKLSAgaW50IHI7Ci0gIGludCBpOwotCi0gIHdoaWxlICgqc3JjID09ICcgJykKLSAgICBzcmMrKzsKLQotICBtb2RlLT5tb2RlID0gQ0xBU1NfQ0M7Ci0gIGZvciAoaSA9IDA7IHRhYmxlW2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgajsKLQotICAgICAgZm9yIChqID0gMDsgdGFibGVbaV0ubmFtZVtqXTsgaisrKQotCXsKLQkgIGlmICh0YWJsZVtpXS5uYW1lW2pdICE9IHNyY1tqXSkKLQkgICAgZ290byBmYWlsOwotCX0KLSAgICAgIHRoZV9jYyA9IHRhYmxlW2ldLnZhbHVlOwotICAgICAgKnB0ciA9IHNyYyArIGo7Ci0gICAgICByZXR1cm47Ci0gICAgZmFpbDo7Ci0gICAgfQotICB0aGVfY2MgPSAweDg7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRfb3BlcmFuZCAocHRyLCBtb2RlLCBkc3QpCi0gICAgIGNoYXIgKipwdHI7Ci0gICAgIHN0cnVjdCB6OGtfb3AgKm1vZGU7Ci0gICAgIHVuc2lnbmVkIGludCBkc3Q7Ci17Ci0gIGNoYXIgKnNyYyA9ICpwdHI7Ci0gIGNoYXIgKmVuZDsKLSAgdW5zaWduZWQgaW50IG51bTsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgdW5zaWduZWQgaW50IHNpemU7Ci0KLSAgbW9kZS0+bW9kZSA9IDA7Ci0KLSAgd2hpbGUgKCpzcmMgPT0gJyAnKQotICAgIHNyYysrOwotICBpZiAoKnNyYyA9PSAnIycpCi0gICAgewotICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX0lNTTsKLSAgICAgIGltbV9vcGVyYW5kID0gJihtb2RlLT5leHApOwotICAgICAgc3JjID0gcGFyc2VfZXhwIChzcmMgKyAxLCAmKG1vZGUtPmV4cCkpOwotICAgIH0KLSAgZWxzZSBpZiAoKnNyYyA9PSAnQCcpCi0gICAgewotICAgICAgaW50IGQ7Ci0KLSAgICAgIG1vZGUtPm1vZGUgPSBDTEFTU19JUjsKLSAgICAgIHNyYyA9IHBhcnNlX3JlZyAoc3JjICsgMSwgJmQsICZtb2RlLT5yZWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCByZWduOwotCi0gICAgICBlbmQgPSBwYXJzZV9yZWcgKHNyYywgJm1vZGUtPm1vZGUsICZyZWduKTsKLQotICAgICAgaWYgKGVuZCkKLQl7Ci0JICBpbnQgbncsIG5yOwotCi0JICBzcmMgPSBlbmQ7Ci0JICBpZiAoKnNyYyA9PSAnKCcpCi0JICAgIHsKLQkgICAgICBzcmMrKzsKLQkgICAgICBlbmQgPSBwYXJzZV9yZWcgKHNyYywgJm53LCAmbnIpOwotCSAgICAgIGlmIChlbmQpCi0JCXsKLQkJICAvKiBHb3QgUmEoUmIpICovCi0JCSAgc3JjID0gZW5kOwotCi0JCSAgaWYgKCpzcmMgIT0gJyknKQotCQkgICAgewotCQkgICAgICBhc19iYWQgKF8oIk1pc3NpbmcgKSBpbiByYShyYikiKSk7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBzcmMrKzsKLQkJICAgIH0KLQotCQkgIHJlZ2FkZHIgKG1vZGUtPm1vZGUsICJyYShyYikgcmEiKTsKLS8qCQkgIHJlZ3dvcmQgKG1vZGUtPm1vZGUsICJyYShyYikgcmIiKTsqLwotCQkgIG1vZGUtPm1vZGUgPSBDTEFTU19CWDsKLQkJICBtb2RlLT5yZWcgPSByZWduOwotCQkgIG1vZGUtPnhfcmVnID0gbnI7Ci0JCSAgcmVnW0FSR19SWF0gPSBucjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIC8qIEdvdCBSYShkaXNwKSAqLwotCQkgIGlmICgqc3JjID09ICcjJykKLQkJICAgIHNyYysrOwotCQkgIHNyYyA9IHBhcnNlX2V4cCAoc3JjLCAmKG1vZGUtPmV4cCkpOwotCQkgIHNyYyA9IGNoZWNrZm9yIChzcmMsICcpJyk7Ci0JCSAgbW9kZS0+bW9kZSA9IENMQVNTX0JBOwotCQkgIG1vZGUtPnJlZyA9IHJlZ247Ci0JCSAgbW9kZS0+eF9yZWcgPSAwOwotCQkgIGltbV9vcGVyYW5kID0gJihtb2RlLT5leHApOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG1vZGUtPnJlZyA9IHJlZ247Ci0JICAgICAgbW9kZS0+eF9yZWcgPSAwOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE5vIGluaXRpYWwgcmVnICovCi0JICBzcmMgPSBwYXJzZV9leHAgKHNyYywgJihtb2RlLT5leHApKTsKLQkgIGlmICgqc3JjID09ICcoJykKLQkgICAgewotCSAgICAgIHNyYysrOwotCSAgICAgIGVuZCA9IHBhcnNlX3JlZyAoc3JjLCAmKG1vZGUtPm1vZGUpLCAmcmVnbik7Ci0JICAgICAgcmVnd29yZCAobW9kZS0+bW9kZSwgImFkZHIoUmEpIHJhIik7Ci0JICAgICAgbW9kZS0+bW9kZSA9IENMQVNTX1g7Ci0JICAgICAgbW9kZS0+cmVnID0gcmVnbjsKLQkgICAgICBtb2RlLT54X3JlZyA9IDA7Ci0JICAgICAgZGFfb3BlcmFuZCA9ICYobW9kZS0+ZXhwKTsKLQkgICAgICBzcmMgPSBjaGVja2ZvciAoZW5kLCAnKScpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IGFuIGFkZHJlc3MgKi8KLQkgICAgICBtb2RlLT5tb2RlID0gQ0xBU1NfREE7Ci0JICAgICAgbW9kZS0+cmVnID0gMDsKLQkgICAgICBtb2RlLT54X3JlZyA9IDA7Ci0JICAgICAgZGFfb3BlcmFuZCA9ICYobW9kZS0+ZXhwKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gICpwdHIgPSBzcmM7Ci19Ci0KLXN0YXRpYwotY2hhciAqCi1nZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLCBvcGVyYW5kKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOwotICAgICBjaGFyICpvcF9lbmQ7Ci0gICAgIG9wX3R5cGUgKm9wZXJhbmQ7Ci17Ci0gIGNoYXIgKnB0ciA9IG9wX2VuZDsKLWNoYXIgKnNhdnB0cjsKLSAgc3dpdGNoIChvcGNvZGUtPm5vcGVyYW5kcykKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgb3BlcmFuZFswXS5tb2RlID0gMDsKLSAgICAgIG9wZXJhbmRbMV0ubW9kZSA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIHB0cisrOwotICAgICAgaWYgKG9wY29kZS0+YXJnX2luZm9bMF0gPT0gQ0xBU1NfQ0MpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfY2Nfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0ZMQUdTKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X2ZsYWdzX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSAoQ0xBU1NfSU1NICsoQVJHX0lNTTIpKSkKLSAgICAgICAgewotICAgICAgICAgIGdldF9pbnRlcnJ1cHRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgICB9Ci0gICAgICBvcGVyYW5kWzFdLm1vZGUgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6Ci0gICAgICBwdHIrKzsKLSAgICAgIHNhdnB0ciA9IHB0cjsKLSAgICAgIGlmIChvcGNvZGUtPmFyZ19pbmZvWzBdID09IENMQVNTX0NDKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X2NjX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAob3Bjb2RlLT5hcmdfaW5mb1swXSA9PSBDTEFTU19DVFJMKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGdldF9jdHJsX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgICAgICAgIGlmICh0aGVfY3RybCA9PSAwKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgcHRyID0gc2F2cHRyOwotICAgICAgICAgICAgICAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKHB0ciA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgIGlmICgqcHRyID09ICcsJykKLSAgICAgICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICAgIGdldF9jdHJsX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gcHRyOwotICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgICAgfQotICAgICAgaWYgKHB0ciA9PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0gICAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDAsIDApOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAxLCAxKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMiwgMik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNDoKLSAgICAgIHB0cisrOwotICAgICAgZ2V0X29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAwLCAwKTsKLSAgICAgIGlmICgqcHRyID09ICcsJykKLQlwdHIrKzsKLSAgICAgIGdldF9vcGVyYW5kICgmcHRyLCBvcGVyYW5kICsgMSwgMSk7Ci0gICAgICBpZiAoKnB0ciA9PSAnLCcpCi0JcHRyKys7Ci0gICAgICBnZXRfb3BlcmFuZCAoJnB0ciwgb3BlcmFuZCArIDIsIDIpOwotICAgICAgaWYgKCpwdHIgPT0gJywnKQotCXB0cisrOwotICAgICAgZ2V0X2NjX29wZXJhbmQgKCZwdHIsIG9wZXJhbmQgKyAzLCAzKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogUGFzc2VkIGEgcG9pbnRlciB0byBhIGxpc3Qgb2Ygb3Bjb2RlcyB3aGljaCB1c2UgZGlmZmVyZW50Ci0gICBhZGRyZXNzaW5nIG1vZGVzLCByZXR1cm4gdGhlIG9wY29kZSB3aGljaCBtYXRjaGVzIHRoZSBvcGNvZGVzCi0gICBwcm92aWRlZAotICAgKi8KLQotc3RhdGljCi1vcGNvZGVfZW50cnlfdHlwZSAqCi1ERUZVTiAoZ2V0X3NwZWNpZmljLCAob3Bjb2RlLCBvcGVyYW5kcyksCi0gICAgICAgb3Bjb2RlX2VudHJ5X3R5cGUgKiBvcGNvZGUgQU5ECi0gICAgICAgb3BfdHlwZSAqIG9wZXJhbmRzKQotCi17Ci0gIG9wY29kZV9lbnRyeV90eXBlICp0aGlzX3RyeSA9IG9wY29kZTsKLSAgaW50IGZvdW5kID0gMDsKLSAgdW5zaWduZWQgaW50IG5vcGVyYW5kcyA9IG9wY29kZS0+bm9wZXJhbmRzOwotCi0gIHVuc2lnbmVkIGludCBkaXNwcmVnOwotICB1bnNpZ25lZCBpbnQgdGhpc19pbmRleCA9IG9wY29kZS0+aWR4OwotCi0gIHdoaWxlICh0aGlzX2luZGV4ID09IG9wY29kZS0+aWR4ICYmICFmb3VuZCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgdGhpc190cnkgPSBvcGNvZGUrKzsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBub3BlcmFuZHM7IGkrKykKLQl7Ci0JICBpbnQgbW9kZSA9IG9wZXJhbmRzW2ldLm1vZGU7Ci0KLQkgIGlmICgobW9kZSAmIENMQVNTX01BU0spICE9ICh0aGlzX3RyeS0+YXJnX2luZm9baV0gJiBDTEFTU19NQVNLKSkKLQkgICAgewotCSAgICAgIC8qIGl0IGNvdWxkIGJlIGFuIHBjIHJlbCBvcGVyYW5kLCBpZiB0aGlzIGlzIGEgZGEgbW9kZSBhbmQKLQkgICB3ZSBsaWtlIGRpc3BzLCB0aGVuIGluc2VydCBpdCAqLwotCi0JICAgICAgaWYgKG1vZGUgPT0gQ0xBU1NfREEgJiYgdGhpc190cnktPmFyZ19pbmZvW2ldID09IENMQVNTX0RJU1ApCi0JCXsKLQkJICAvKiBUaGlzIGlzIHRoZSBjYXNlICovCi0JCSAgb3BlcmFuZHNbaV0ubW9kZSA9IENMQVNTX0RJU1A7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChtb2RlID09IENMQVNTX0JBICYmIHRoaXNfdHJ5LT5hcmdfaW5mb1tpXSkKLQkJewotCQkgIC8qIENhbid0IHRoaW5rIG9mIGEgd2F5IHRvIHR1cm4gd2hhdCB3ZSd2ZSBiZWVuIGdpdmVuIGludG8KLQkgICAgIHNvbWV0aGluZyB0aGF0J3Mgb2sgKi8KLQkJICBnb3RvIGZhaWw7Ci0JCX0KLQkgICAgICBlbHNlIGlmICh0aGlzX3RyeS0+YXJnX2luZm9baV0gJiBDTEFTU19QUikKLQkJewotCQkgIGlmIChtb2RlID09IENMQVNTX1JFR19MT05HICYmIHNlZ21lbnRlZF9tb2RlKQotCQkgICAgewotCQkgICAgICAvKiBvayAqLwotCQkgICAgfQotCQkgIGVsc2UgaWYgKG1vZGUgPT0gQ0xBU1NfUkVHX1dPUkQgJiYgIXNlZ21lbnRlZF9tb2RlKQotCQkgICAgewotCQkgICAgICAvKiBvayAqLwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIGdvdG8gZmFpbDsKLQkJfQotCSAgICAgIGVsc2UKLQkJZ290byBmYWlsOwotCSAgICB9Ci0JICBzd2l0Y2ggKG1vZGUgJiBDTEFTU19NQVNLKQotCSAgICB7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfWDoKLQkgICAgY2FzZSBDTEFTU19JUjoKLQkgICAgY2FzZSBDTEFTU19CQToKLQkgICAgY2FzZSBDTEFTU19CWDoKLQkgICAgY2FzZSBDTEFTU19ESVNQOgotCSAgICBjYXNlIENMQVNTX1JFRzoKLQkgICAgY2FzZSBDTEFTU19SRUdfV09SRDoKLQkgICAgY2FzZSBDTEFTU19SRUdfQllURToKLQkgICAgY2FzZSBDTEFTU19SRUdfUVVBRDoKLQkgICAgY2FzZSBDTEFTU19SRUdfTE9ORzoKLQkgICAgY2FzZSBDTEFTU19SRUdOMDoKLQkgICAgICByZWdbdGhpc190cnktPmFyZ19pbmZvW2ldICYgQVJHX01BU0tdID0gb3BlcmFuZHNbaV0ucmVnOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICBmb3VuZCA9IDE7Ci0gICAgZmFpbDo7Ci0gICAgfQotICBpZiAoZm91bmQpCi0gICAgcmV0dXJuIHRoaXNfdHJ5OwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoY2hlY2tfb3BlcmFuZCwgKG9wZXJhbmQsIHdpZHRoLCBzdHJpbmcpLAotICAgICAgIHN0cnVjdCB6OGtfb3AgKm9wZXJhbmQgQU5ECi0gICAgICAgdW5zaWduZWQgaW50IHdpZHRoIEFORAotICAgICAgIGNoYXIgKnN0cmluZykKLXsKLSAgaWYgKG9wZXJhbmQtPmV4cC5YX2FkZF9zeW1ib2wgPT0gMAotICAgICAgJiYgb3BlcmFuZC0+ZXhwLlhfb3Bfc3ltYm9sID09IDApCi0gICAgewotCi0gICAgICAvKiBObyBzeW1ib2wgaW52b2x2ZWQsIGxldCdzIGxvb2sgYXQgb2Zmc2V0LCBpdCdzIGRhbmdlcm91cyBpZiBhbnkgb2YKLSAgICAgICB0aGUgaGlnaCBiaXRzIGFyZSBub3QgMCBvciBmZidzLCBmaW5kIG91dCBieSBvcmluZyBvciBhbmRpbmcgd2l0aAotICAgICAgIHRoZSB3aWR0aCBhbmQgc2VlaW5nIGlmIHRoZSBhbnN3ZXIgaXMgMCBvciBhbGwgZnMqLwotICAgICAgaWYgKChvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyICYgfndpZHRoKSAhPSAwICYmCi0JICAob3BlcmFuZC0+ZXhwLlhfYWRkX251bWJlciB8IHdpZHRoKSAhPSAofjApKQotCXsKLQkgIGFzX3dhcm4gKF8oIm9wZXJhbmQgJXMweCV4IG91dCBvZiByYW5nZS4iKSwgc3RyaW5nLCBvcGVyYW5kLT5leHAuWF9hZGRfbnVtYmVyKTsKLQl9Ci0gICAgfQotCi19Ci0KLXN0YXRpYyBjaGFyIGJ1ZmZlclsyMF07Ci0KLXN0YXRpYyB2b2lkCi1ERUZVTiAobmV3Zml4LCAocHRyLCB0eXBlLCBvcGVyYW5kKSwKLSAgICAgICBpbnQgcHRyIEFORAotICAgICAgIGludCB0eXBlIEFORAotICAgICAgIGV4cHJlc3Npb25TICogb3BlcmFuZCkKLXsKLSAgaWYgKG9wZXJhbmQtPlhfYWRkX3N5bWJvbAotICAgICAgfHwgb3BlcmFuZC0+WF9vcF9zeW1ib2wKLSAgICAgIHx8IG9wZXJhbmQtPlhfYWRkX251bWJlcikKLSAgICB7Ci0gICAgICBmaXhfbmV3X2V4cCAoZnJhZ19ub3csCi0JCSAgIHB0ciwKLQkJICAgMSwKLQkJICAgb3BlcmFuZCwKLQkJICAgMCwKLQkJICAgdHlwZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1ERUZVTiAoYXBwbHlfZml4LCAocHRyLCB0eXBlLCBvcGVyYW5kLCBzaXplKSwKLSAgICAgICBjaGFyICpwdHIgQU5ECi0gICAgICAgaW50IHR5cGUgQU5ECi0gICAgICAgZXhwcmVzc2lvblMgKiBvcGVyYW5kIEFORAotICAgICAgIGludCBzaXplKQotewotICBpbnQgbiA9IG9wZXJhbmQtPlhfYWRkX251bWJlcjsKLQotICBvcGVyYW5kLT5YX2FkZF9udW1iZXIgPSBuOwotICBuZXdmaXggKChwdHIgLSBidWZmZXIpIC8gMiwgdHlwZSwgb3BlcmFuZCk7Ci0jaWYgMQotICBzd2l0Y2ggKHNpemUpCi0gICAgewotICAgIGNhc2UgODoJCQkvKiA4IG5pYmJsZXMgPT0gMzIgYml0cyAqLwotICAgICAgKnB0cisrID0gbiA+PiAyODsKLSAgICAgICpwdHIrKyA9IG4gPj4gMjQ7Ci0gICAgICAqcHRyKysgPSBuID4+IDIwOwotICAgICAgKnB0cisrID0gbiA+PiAxNjsKLSAgICBjYXNlIDQ6CQkJLyogNCBuaWJsbGVzID09IDE2IGJpdHMgKi8KLSAgICAgICpwdHIrKyA9IG4gPj4gMTI7Ci0gICAgICAqcHRyKysgPSBuID4+IDg7Ci0gICAgY2FzZSAyOgotICAgICAgKnB0cisrID0gbiA+PiA0OwotICAgIGNhc2UgMToKLSAgICAgICpwdHIrKyA9IG4gPj4gMDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gcHRyOwotCi19Ci0KLS8qIE5vdyB3ZSBrbm93IHdoYXQgc29ydCBvZiBvcGNvZGVzIGl0IGlzLCBsZXRzIGJ1aWxkIHRoZSBieXRlcyAtCi0gKi8KLSNkZWZpbmUgSU5TRVJUKHgseSkgKngrKyA9IHk+PjI0OyAqeCsrID0geT4+IDE2OyAqeCsrPXk+Pjg7ICp4KysgPXk7Ci1zdGF0aWMgdm9pZAotYnVpbGRfYnl0ZXMgKHRoaXNfdHJ5LCBvcGVyYW5kKQotICAgICBvcGNvZGVfZW50cnlfdHlwZSAqIHRoaXNfdHJ5OwotICAgICBzdHJ1Y3QgejhrX29wICpvcGVyYW5kOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBpbnQgbGVuZ3RoOwotICBjaGFyICpvdXRwdXQ7Ci0gIGNoYXIgKm91dHB1dF9wdHIgPSBidWZmZXI7Ci0gIGNoYXIgcGFydDsKLSAgaW50IGM7Ci0gIGNoYXIgaGlnaDsKLSAgaW50IG5pYjsKLSAgaW50IG5pYmJsZTsKLSAgdW5zaWduZWQgaW50ICpjbGFzc19wdHI7Ci0KLSAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gIGZyYWdfbmV3ICgwKTsKLQotICBtZW1zZXQgKGJ1ZmZlciwgMjAsIDApOwotICBjbGFzc19wdHIgPSB0aGlzX3RyeS0+Ynl0ZV9pbmZvOwotdG9wOjsKLQotICBmb3IgKG5pYmJsZSA9IDA7IGMgPSAqY2xhc3NfcHRyKys7IG5pYmJsZSsrKQotICAgIHsKLQotICAgICAgc3dpdGNoIChjICYgQ0xBU1NfTUFTSykKLQl7Ci0JZGVmYXVsdDoKLQotCSAgYWJvcnQgKCk7Ci0JY2FzZSBDTEFTU19BRERSRVNTOgotCSAgLyogRGlyZWN0IGFkZHJlc3MsIHdlIGRvbid0IGNvcGUgd2l0aCB0aGUgU1MgbW9kZSByaWdodCBub3cgKi8KLQkgIGlmIChzZWdtZW50ZWRfbW9kZSkKLQkgICAgewotCSAgICAgIGRhX29wZXJhbmQtPlhfYWRkX251bWJlciB8PSAweDgwMDAwMDAwOwotCSAgICAgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMzIsIGRhX29wZXJhbmQsIDgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTE2LCBkYV9vcGVyYW5kLCA0KTsKLQkgICAgfQotCSAgZGFfb3BlcmFuZCA9IDA7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A4OgotCSAgLyogcGMgcmVsIDggYml0ICovCi0JICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0pSLCBkYV9vcGVyYW5kLCAyKTsKLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENMQVNTXzBESVNQNzoKLQkgIC8qIHBjIHJlbCA3IGJpdCAqLwotCSAgKm91dHB1dF9wdHIgPSAwOwotCSAgb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9ESVNQNywgZGFfb3BlcmFuZCwgMik7Ci0JICBkYV9vcGVyYW5kID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSBDTEFTU18xRElTUDc6Ci0JICAvKiBwYyByZWwgNyBiaXQgKi8KLQkgICpvdXRwdXRfcHRyID0gMHg4MDsKLQkgIG91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfRElTUDcsIGRhX29wZXJhbmQsIDIpOwotICAgICAgICAgIG91dHB1dF9wdHJbLTJdID0gIDB4ODsKLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENMQVNTX0JJVF8xT1IyOgotCSAgKm91dHB1dF9wdHIgPSBjICYgMHhmOwotCSAgaWYgKGltbV9vcGVyYW5kKQotCSAgICB7Ci0JICAgICAgaWYgKGltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgPT0gMikKLQkJewotCQkgICpvdXRwdXRfcHRyIHw9IDI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyICE9IDEpCi0JCXsKLQkJICBhc19iYWQgKF8oImltbWVkaWF0ZSBtdXN0IGJlIDEgb3IgMiIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImltbWVkaWF0ZSAxIG9yIDIgZXhwZWN0ZWQiKSk7Ci0JICAgIH0KLQkgIG91dHB1dF9wdHIrKzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ0M6Ci0JICAqb3V0cHV0X3B0cisrID0gdGhlX2NjOwotCSAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfMENDQzoKLSAgICAgICAgICAqb3V0cHV0X3B0cisrID0gdGhlX2N0cmw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfMUNDQzoKLSAgICAgICAgICAqb3V0cHV0X3B0cisrID0gdGhlX2N0cmwgfCAweDg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0xBU1NfMDBJSToKLSAgICAgICAgICAqb3V0cHV0X3B0cisrID0gKH50aGVfaW50ZXJydXB0ICYgMHgzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDTEFTU18wMUlJOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSAofnRoZV9pbnRlcnJ1cHQgJiAweDMpIHwgMHg0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENMQVNTX0ZMQUdTOgotICAgICAgICAgICpvdXRwdXRfcHRyKysgPSB0aGVfZmxhZ3M7Ci0gICAgICAgICAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CSVQ6Ci0JICAqb3V0cHV0X3B0cisrID0gYyAmIDB4ZjsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHTjA6Ci0JICBpZiAocmVnW2MgJiAweGZdID09IDApCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImNhbid0IHVzZSBSMCBoZXJlIikpOwotCSAgICB9Ci0JY2FzZSBDTEFTU19SRUc6Ci0JY2FzZSBDTEFTU19SRUdfQllURToKLQljYXNlIENMQVNTX1JFR19XT1JEOgotCWNhc2UgQ0xBU1NfUkVHX0xPTkc6Ci0JY2FzZSBDTEFTU19SRUdfUVVBRDoKLQkgIC8qIEluc2VydCBiaXQgbWF0dGVybiBvZgotCSByaWdodCByZWcgKi8KLQkgICpvdXRwdXRfcHRyKysgPSByZWdbYyAmIDB4Zl07Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0RJU1A6Ci0JICBvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTE2LCBkYV9vcGVyYW5kLCA0KTsKLQkgIGRhX29wZXJhbmQgPSAwOwotCSAgYnJlYWs7Ci0KLQljYXNlIENMQVNTX0lNTToKLQkgIHsKLQkgICAgbmliID0gMDsKLQkgICAgc3dpdGNoIChjICYgQVJHX01BU0spCi0JICAgICAgewotCSAgICAgIGNhc2UgQVJHX0lNTTQ6Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NNEwsIGltbV9vcGVyYW5kLCAxKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfSU1NNE0xOgotCQlpbW1fb3BlcmFuZC0+WF9hZGRfbnVtYmVyLS07Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NNEwsIGltbV9vcGVyYW5kLCAxKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfSU1NTk1JTlVTMToKLQkJaW1tX29wZXJhbmQtPlhfYWRkX251bWJlci0tOwotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTRMLCBpbW1fb3BlcmFuZCwgMSk7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgQVJHX05JTTg6Ci0JCWltbV9vcGVyYW5kLT5YX2FkZF9udW1iZXIgPSAtaW1tX29wZXJhbmQtPlhfYWRkX251bWJlcjsKLQkgICAgICBjYXNlIEFSR19JTU04OgotCQlvdXRwdXRfcHRyID0gYXBwbHlfZml4IChvdXRwdXRfcHRyLCBSX0lNTTgsIGltbV9vcGVyYW5kLCAyKTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBBUkdfSU1NMTY6Ci0JCW91dHB1dF9wdHIgPSBhcHBseV9maXggKG91dHB1dF9wdHIsIFJfSU1NMTYsIGltbV9vcGVyYW5kLCA0KTsKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIEFSR19JTU0zMjoKLQkJb3V0cHV0X3B0ciA9IGFwcGx5X2ZpeCAob3V0cHV0X3B0ciwgUl9JTU0zMiwgaW1tX29wZXJhbmQsIDgpOwotCQlicmVhazsKLQotCSAgICAgIGRlZmF1bHQ6Ci0JCWFib3J0ICgpOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0gICAgfQotCi0gIC8qIENvcHkgZnJvbSB0aGUgbmliYmxlIGJ1ZmZlciBpbnRvIHRoZSBmcmFnICovCi0KLSAgewotICAgIGludCBsZW5ndGggPSAob3V0cHV0X3B0ciAtIGJ1ZmZlcikgLyAyOwotICAgIGNoYXIgKnNyYyA9IGJ1ZmZlcjsKLSAgICBjaGFyICpmcmFncCA9IGZyYWdfbW9yZSAobGVuZ3RoKTsKLQotICAgIHdoaWxlIChzcmMgPCBvdXRwdXRfcHRyKQotICAgICAgewotCSpmcmFncCA9IChzcmNbMF0gPDwgNCkgfCBzcmNbMV07Ci0Jc3JjICs9IDI7Ci0JZnJhZ3ArKzsKLSAgICAgIH0KLQotICB9Ci0KLX0KLQotLyogVGhpcyBpcyB0aGUgZ3V0cyBvZiB0aGUgbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyLiAgU1RSIHBvaW50cyB0byBhCi0gICBtYWNoaW5lIGRlcGVuZGVudCBpbnN0cnVjdGlvbi4gIFRoaXMgZnVuY2l0b24gaXMgc3VwcG9zZWQgdG8gZW1pdAotICAgdGhlIGZyYWdzL2J5dGVzIGl0IGFzc2VtYmxlcyB0by4KLSAgICovCi0KLXZvaWQKLURFRlVOIChtZF9hc3NlbWJsZSwgKHN0ciksCi0gICAgICAgY2hhciAqc3RyKQotewotICBjaGFyICpvcF9zdGFydDsKLSAgY2hhciAqb3BfZW5kOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgc3RydWN0IHo4a19vcCBvcGVyYW5kWzNdOwotICBvcGNvZGVfZW50cnlfdHlwZSAqb3Bjb2RlOwotICBvcGNvZGVfZW50cnlfdHlwZSAqcHJldl9vcGNvZGU7Ci0KLSAgY2hhciAqZG90ID0gMDsKLSAgY2hhciBjOwotCi0gIC8qIERyb3AgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gIHdoaWxlICgqc3RyID09ICcgJykKLSAgICBzdHIrKzsKLQotICAvKiBmaW5kIHRoZSBvcCBjb2RlIGVuZCAqLwotICBmb3IgKG9wX3N0YXJ0ID0gb3BfZW5kID0gc3RyOwotICAgICAgICpvcF9lbmQgIT0gMCAmJiAqb3BfZW5kICE9ICcgJzsKLSAgICAgICBvcF9lbmQrKykKLSAgICB7Ci0gICAgfQotCi0gIDsKLQotICBpZiAob3BfZW5kID09IG9wX3N0YXJ0KQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiY2FuJ3QgZmluZCBvcGNvZGUgIikpOwotICAgIH0KLSAgYyA9ICpvcF9lbmQ7Ci0KLSAgKm9wX2VuZCA9IDA7Ci0KLSAgb3Bjb2RlID0gKG9wY29kZV9lbnRyeV90eXBlICopIGhhc2hfZmluZCAob3Bjb2RlX2hhc2hfY29udHJvbCwKLQkJCQkJICAgIG9wX3N0YXJ0KTsKLQotCi0gIGlmIChvcGNvZGUgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oInVua25vd24gb3Bjb2RlIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAob3Bjb2RlLT5vcGNvZGUgPT0gMjUwKQotICAgIHsKLSAgICAgIC8qIHdhcyByZWFsbHkgYSBwc2V1ZG8gb3AgKi8KLQotICAgICAgcHNldWRvX3R5cGVTICpwOwotICAgICAgY2hhciBvYzsKLQotICAgICAgY2hhciAqb2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgKm9wX2VuZCA9IGM7Ci0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gb3BfZW5kOwotCi0gICAgICBvYyA9ICpvbGQ7Ci0gICAgICAqb2xkID0gJ1xuJzsKLSAgICAgIHdoaWxlICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHAgPSAocHNldWRvX3R5cGVTICopIChvcGNvZGUtPmZ1bmMpOwotCi0gICAgICAocC0+cG9jX2hhbmRsZXIpIChwLT5wb2NfdmFsKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG9sZDsKLSAgICAgICpvbGQgPSBvYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBnZXRfb3BlcmFuZHMgKG9wY29kZSwgb3BfZW5kLAotCQkJCQkgb3BlcmFuZCk7Ci0gICAgICBwcmV2X29wY29kZSA9IG9wY29kZTsKLQotICAgICAgb3Bjb2RlID0gZ2V0X3NwZWNpZmljIChvcGNvZGUsIG9wZXJhbmQpOwotCi0gICAgICBpZiAob3Bjb2RlID09IDApCi0JewotCSAgLyogQ291bGRuJ3QgZmluZCBhbiBvcGNvZGUgd2hpY2ggbWF0Y2hlZCB0aGUgb3BlcmFuZHMgKi8KLQkgIGNoYXIgKndoZXJlID0gZnJhZ19tb3JlICgyKTsKLQotCSAgd2hlcmVbMF0gPSAweDA7Ci0JICB3aGVyZVsxXSA9IDB4MDsKLQotCSAgYXNfYmFkIChfKCJDYW4ndCBmaW5kIG9wY29kZSB0byBtYXRjaCBvcGVyYW5kcyIpKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGJ1aWxkX2J5dGVzIChvcGNvZGUsIG9wZXJhbmQpOwotICAgIH0KLX0KLQotdm9pZAotREVGVU4gKHRjX2NyYXdsX3N5bWJvbF9jaGFpbiwgKGhlYWRlcnMpLAotICAgICAgIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvIHRjX2NyYXdsX3N5bWJvbF9jaGFpbiBcbiIpKTsKLX0KLQotc3ltYm9sUyAqCi1ERUZVTiAobWRfdW5kZWZpbmVkX3N5bWJvbCwgKG5hbWUpLAotICAgICAgIGNoYXIgKm5hbWUpCi17Ci0gIHJldHVybiAwOwotfQotCi12b2lkCi1ERUZVTiAodGNfaGVhZGVyc19ob29rLCAoaGVhZGVycyksCi0gICAgICAgb2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfaGVhZGVyc19ob29rIFxuIikpOwotfQotCi0vKiBWYXJpb3VzIHJvdXRpbmVzIHRvIGtpbGwgb25lIGRheSAqLwotLyogRXF1YWwgdG8gTUFYX1BSRUNJU0lPTiBpbiBhdG9mLWllZWUuYyAqLwotI2RlZmluZSBNQVhfTElUVExFTlVNUyA2Ci0KLS8qIFR1cm4gYSBzdHJpbmcgaW4gaW5wdXRfbGluZV9wb2ludGVyIGludG8gYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBvZiB0eXBlCi0gICB0eXBlLCBhbmQgc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGluICpsaXRQLiAgVGhlIG51bWJlciBvZiBMSVRUTEVOVU1TCi0gICBlbWl0dGVkIGlzIHN0b3JlZCBpbiAqc2l6ZVAgLiAgQW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCwgb3IgTlVMTCBvbiBPSy4KLSAgICovCi1jaGFyICoKLW1kX2F0b2YgKHR5cGUsIGxpdFAsIHNpemVQKQotICAgICBjaGFyIHR5cGU7Ci0gICAgIGNoYXIgKmxpdFA7Ci0gICAgIGludCAqc2l6ZVA7Ci17Ci0gIGludCBwcmVjOwotICBMSVRUTEVOVU1fVFlQRSB3b3Jkc1tNQVhfTElUVExFTlVNU107Ci0gIExJVFRMRU5VTV9UWVBFICp3b3JkUDsKLSAgY2hhciAqdDsKLSAgY2hhciAqYXRvZl9pZWVlICgpOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBwcmVjID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAnUic6Ci0gICAgICBwcmVjID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnWCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncCc6Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBwcmVjID0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICpzaXplUCA9IDA7Ci0gICAgICByZXR1cm4gXygiQmFkIGNhbGwgdG8gTURfQVRPRigpIik7Ci0gICAgfQotICB0ID0gYXRvZl9pZWVlIChpbnB1dF9saW5lX3BvaW50ZXIsIHR5cGUsIHdvcmRzKTsKLSAgaWYgKHQpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyID0gdDsKLQotICAqc2l6ZVAgPSBwcmVjICogc2l6ZW9mIChMSVRUTEVOVU1fVFlQRSk7Ci0gIGZvciAod29yZFAgPSB3b3JkczsgcHJlYy0tOykKLSAgICB7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGxpdFAsIChsb25nKSAoKndvcmRQKyspLCBzaXplb2YgKExJVFRMRU5VTV9UWVBFKSk7Ci0gICAgICBsaXRQICs9IHNpemVvZiAoTElUVExFTlVNX1RZUEUpOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0MCi1DT05TVCBjaGFyICptZF9zaG9ydG9wdHMgPSAiejoiOwotc3RydWN0IG9wdGlvbiBtZF9sb25nb3B0c1tdID0gewotICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci19Owotc2l6ZV90IG1kX2xvbmdvcHRzX3NpemUgPSBzaXplb2YobWRfbG9uZ29wdHMpOwotCi1pbnQKLW1kX3BhcnNlX29wdGlvbiAoYywgYXJnKQotICAgICBpbnQgYzsKLSAgICAgY2hhciAqYXJnOwotewotICBzd2l0Y2ggKGMpCi0gICAgewotICAgIGNhc2UgJ3onOgotICAgICAgaWYgKCFzdHJjbXAgKGFyZywgIjgwMDEiKSkKLQlzX3NlZ20gKCk7Ci0gICAgICBlbHNlIGlmICghc3RyY21wIChhcmcsICI4MDAyIikpCi0Jc191bnNlZyAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImludmFsaWQgYXJjaGl0ZWN0dXJlIC16JXMiKSwgYXJnKTsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotdm9pZAotbWRfc2hvd191c2FnZSAoc3RyZWFtKQotICAgICBGSUxFICpzdHJlYW07Ci17Ci0gIGZwcmludGYoc3RyZWFtLCBfKCJcCi1aOEsgb3B0aW9uczpcblwKLS16ODAwMQkJCWdlbmVyYXRlIHNlZ21lbnRlZCBjb2RlXG5cCi0tejgwMDIJCQlnZW5lcmF0ZSB1bnNlZ21lbnRlZCBjb2RlXG4iKSk7Ci19Ci0MCi12b2lkCi10Y19hb3V0X2ZpeF90b19jaGFycyAoKQotewotICBwcmludGYgKF8oImNhbGwgdG8gdGNfYW91dF9maXhfdG9fY2hhcnMgXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi12b2lkCi1tZF9jb252ZXJ0X2ZyYWcgKGhlYWRlcnMsIHNlZywgZnJhZ1ApCi0gICAgIG9iamVjdF9oZWFkZXJzICpoZWFkZXJzOwotICAgICBzZWdUIHNlZzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotewotICBwcmludGYgKF8oImNhbGwgdG8gbWRfY29udmVydF9mcmFnIFxuIikpOwotICBhYm9ydCAoKTsKLX0KLQotdmFsdWVUCi1ERUZVTiAobWRfc2VjdGlvbl9hbGlnbiwgKHNlZywgc2l6ZSksCi0gICAgICAgc2VnVCBzZWcgQU5ECi0gICAgICAgdmFsdWVUIHNpemUpCi17Ci0gIHJldHVybiAoKHNpemUgKyAoMSA8PCBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddKSAtIDEpICYgKC0xIDw8IHNlY3Rpb25fYWxpZ25tZW50WyhpbnQpIHNlZ10pKTsKLQotfQotCi12b2lkCi1tZF9hcHBseV9maXggKGZpeFAsIHZhbCkKLSAgICAgZml4UyAqZml4UDsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IGZpeFAtPmZ4X3doZXJlICsgZml4UC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbDsKLQotICBzd2l0Y2ggKGZpeFAtPmZ4X3JfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSBSX0lNTTRMOgotICAgICAgYnVmWzBdID0gKGJ1ZlswXSAmIDB4ZjApIHwgKChidWZbMF0gKyB2YWwpICYgMHhmKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0pSOgotCi0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICAvKiAgICBpZiAodmFsICE9IDApIGFib3J0KCk7Ki8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSX0RJU1A3OgotCi0gICAgICAqYnVmKysgKz0gdmFsOwotICAgICAgLyogICAgaWYgKHZhbCAhPSAwKSBhYm9ydCgpOyovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgUl9JTU04OgotICAgICAgYnVmWzBdICs9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUl9JTU0xNjoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFJfSU1NMzI6Ci0gICAgICAqYnVmKysgPSAodmFsID4+IDI0KTsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gKHZhbCA+PiA4KTsKLSAgICAgICpidWYrKyA9IHZhbDsKLSAgICAgIGJyZWFrOwotI2lmIDAKLSAgICBjYXNlIFJfREEgfCBSX1NFRzoKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gMTYpOwotICAgICAgKmJ1ZisrID0gMHgwMDsKLSAgICAgICpidWYrKyA9ICh2YWwgPj4gOCk7Ci0gICAgICAqYnVmKysgPSB2YWw7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgY2FzZSAwOgotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChidWYsIHZhbCwgZml4UC0+Znhfc2l6ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLQotICAgIH0KLX0KLQotaW50Ci1tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZ1AsIHNlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZnJhZ1MgKmZyYWdQOwotICAgICByZWdpc3RlciBzZWdUIHNlZ21lbnRfdHlwZTsKLXsKLSAgcHJpbnRmIChfKCJjYWxsIHRvbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggXG4iKSk7Ci0gIGFib3J0ICgpOwotfQotCi0vKiBQdXQgbnVtYmVyIGludG8gdGFyZ2V0IGJ5dGUgb3JkZXIgKi8KLQotdm9pZAotREVGVU4gKG1kX251bWJlcl90b19jaGFycywgKHB0ciwgdXNlLCBuYnl0ZXMpLAotICAgICAgIGNoYXIgKnB0ciBBTkQKLSAgICAgICB2YWx1ZVQgdXNlIEFORAotICAgICAgIGludCBuYnl0ZXMpCi17Ci0gIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKHB0ciwgdXNlLCBuYnl0ZXMpOwotfQotbG9uZwotbWRfcGNyZWxfZnJvbSAoZml4UCkKLSAgICAgZml4UyAqZml4UDsKLXsKLSAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLXRjX2NvZmZfc3ltYm9sX2VtaXRfaG9vayAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLX0KLQotdm9pZAotdGNfcmVsb2NfbWFuZ2xlIChmaXhfcHRyLCBpbnRyLCBiYXNlKQotICAgICBmaXhTICpmaXhfcHRyOwotICAgICBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKmludHI7Ci0gICAgIGJmZF92bWEgYmFzZTsKLQotewotICBzeW1ib2xTICpzeW1ib2xfcHRyOwotCi0gIGlmIChmaXhfcHRyLT5meF9hZGRzeSAmJgotICAgICAgZml4X3B0ci0+Znhfc3Vic3kpIAotICAgIHsKLSAgICAgIHN5bWJvbFMgKmFkZCA9IGZpeF9wdHItPmZ4X2FkZHN5OwotICAgICAgc3ltYm9sUyAqc3ViID0gZml4X3B0ci0+Znhfc3Vic3k7Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVChhZGQpICE9IFNfR0VUX1NFR01FTlQoc3ViKSkKLQl7Ci0JICBhc19iYWQoXygiQ2FuJ3Qgc3VidHJhY3Qgc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VjdGlvbnMgJXMgJXMiKSwKLQkJIFNfR0VUX05BTUUoYWRkKSwgU19HRVRfTkFNRShzdWIpKTsKLQl9Ci0gICAgICBlbHNlIHsKLQlpbnQgZGlmZiA9IFNfR0VUX1ZBTFVFKGFkZCkgLSBTX0dFVF9WQUxVRShzdWIpOwotCWZpeF9wdHItPmZ4X2FkZHN5ID0gMDsKLQlmaXhfcHRyLT5meF9zdWJzeSA9IDA7Ci0JZml4X3B0ci0+Znhfb2Zmc2V0ICs9IGRpZmY7Ci0gICAgICB9Ci0gICAgfQotICBzeW1ib2xfcHRyID0gZml4X3B0ci0+ZnhfYWRkc3k7Ci0KLSAgLyogSWYgdGhpcyByZWxvY2F0aW9uIGlzIGF0dGFjaGVkIHRvIGEgc3ltYm9sIHRoZW4gaXQncyBvawotICAgICB0byBvdXRwdXQgaXQgKi8KLSAgaWYgKGZpeF9wdHItPmZ4X3JfdHlwZSA9PSAwKQotICAgIHsKLSAgICAgIC8qIGNvbnMgbGlrZXMgdG8gY3JlYXRlIHJlbG9jMzIncyB3aGF0ZXZlciB0aGUgc2l6ZSBvZiB0aGUgcmVsb2MuLiAqLwotICAgICAgc3dpdGNoIChmaXhfcHRyLT5meF9zaXplKQotCXsKLQljYXNlIDI6Ci0JICBpbnRyLT5yX3R5cGUgPSBSX0lNTTE2OwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaW50ci0+cl90eXBlID0gUl9JTU04OwotCSAgYnJlYWs7Ci0JY2FzZSA0OgotCSAgaW50ci0+cl90eXBlID0gUl9JTU0zMjsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnRyLT5yX3R5cGUgPSBmaXhfcHRyLT5meF9yX3R5cGU7Ci0gICAgfQotCi0gIGludHItPnJfdmFkZHIgPSBmaXhfcHRyLT5meF9mcmFnLT5mcl9hZGRyZXNzICsgZml4X3B0ci0+Znhfd2hlcmUgKyBiYXNlOwotICBpbnRyLT5yX29mZnNldCA9IGZpeF9wdHItPmZ4X29mZnNldDsKLQotICBpZiAoc3ltYm9sX3B0cikKLSAgICBpbnRyLT5yX3N5bW5keCA9IHN5bWJvbF9wdHItPnN5X251bWJlcjsKLSAgZWxzZQotICAgIGludHItPnJfc3ltbmR4ID0gLTE7Ci19Ci0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGMtejhrLmggYi9nYXMvY29uZmlnL3RjLXo4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODhiNjU2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGMtejhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGMtejhrLmgKLSAgIENvcHlyaWdodCAoQykgMTk4Ny0xOTkyLCA5MywgOTUsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNkZWZpbmUgVENfWjhLCi0jZGVmaW5lIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOIDEKLQotI2lmIEFOU0lfUFJPVE9UWVBFUwotc3RydWN0IGludGVybmFsX3JlbG9jOwotI2VuZGlmCi0KLSNkZWZpbmUgV09SS0lOR19ET1RfV09SRAotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgTE9DQUxfTEFCRUwoeCkgMAotI2VuZGlmCi0KLS8qIFRoaXMgbWFjcm8gdHJhbnNsYXRlcyBiZXR3ZWVuIGFuIGludGVybmFsIGZpeCBhbmQgYW4gY29mZiByZWxvYyB0eXBlICovCi0jZGVmaW5lIFRDX0NPRkZfRklYMlJUWVBFKGZpeFApIGFib3J0KCk7Ci0KLSNkZWZpbmUgQkZEX0FSQ0ggYmZkX2FyY2hfejhrCi0jZGVmaW5lIENPRkZfTUFHSUMgMHg4MDAwCi0jZGVmaW5lIFRDX0NPVU5UX1JFTE9DKHgpICgxKQotI2RlZmluZSBJR05PUkVfTk9OU1RBTkRBUkRfRVNDQVBFUwotCi0jZGVmaW5lIFRDX1JFTE9DX01BTkdMRShzLGEsYixjKSB0Y19yZWxvY19tYW5nbGUoYSxiLGMpCi1leHRlcm4gdm9pZCB0Y19yZWxvY19tYW5nbGUKLSAgUEFSQU1TICgoc3RydWN0IGZpeCAqLCBzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MgKiwgYmZkX3ZtYSkpOwotCi0jZGVmaW5lIERPX05PVF9TVFJJUCAwCi0jZGVmaW5lIExJU1RJTkdfSEVBREVSICJaaWxvZyBaODAwMCBHQVMgIgotI2RlZmluZSBORUVEX0ZYX1JfVFlQRSAxCi0jZGVmaW5lIFJFTE9DXzMyIDEyMzQKLQotI2RlZmluZSBtZF9vcGVyYW5kKHgpCi0KLS8qIGVuZCBvZiB0Yy16OGsuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS0zODZic2QuaCBiL2dhcy9jb25maWcvdGUtMzg2YnNkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZmY5OTAuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS0zODZic2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIHRlLTM4NmJzZC5oIC0tIDM4NkJTRCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotICAgCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotICAgCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEVfMzg2QlNECTEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBmaWxsLWNvbHVtbjogMTMxCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHRlLXN1bjMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1hdXguaCBiL2dhcy9jb25maWcvdGUtYXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmZhMDEuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1hdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNkZWZpbmUgVEVfQVVYCi0KLS8qIEZyb20gb2JqLWNvZmYuaDoKLSAgIFRoaXMgaW50ZXJuYWxfbGluZW5vIGNyYXAgaXMgdG8gc3RvcCBuYW1lc3BhY2UgcG9sbHV0aW9uIGZyb20gdGhlCi0gICBiZmQgaW50ZXJuYWwgY29mZiBoZWFkZXJmaWxlLiAqLwotI2RlZmluZSBpbnRlcm5hbF9saW5lbm8gYmZkX2ludGVybmFsX2xpbmVubwotI2luY2x1ZGUgImNvZmYvYXV4LWNvZmYuaCIJLyogb3ZlcnJpZGUgYml0cyBpbiBjb2ZmL2ludGVybmFsLmggKi8KLSN1bmRlZiBpbnRlcm5hbF9saW5lbm8KLQotI2RlZmluZSBDT0ZGX05PTE9BRF9QUk9CTEVNCi0jZGVmaW5lIEtFRVBfUkVMT0NfSU5GTwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oIGIvZ2FzL2NvbmZpZy90ZS1kZWx0ODguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjZDZiNy4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWRlbHQ4OC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRlLWRlbHRhODguaC4gICovCi0KLSNkZWZpbmUgVEVfREVMVEE4OCAxCi0KLSNkZWZpbmUgQ09GRl9OT0xPQURfUFJPQkxFTQkxCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSCTEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCCQkxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWRlbHRhLmggYi9nYXMvY29uZmlnL3RlLWRlbHRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmM2MmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1kZWx0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI2RlZmluZSBURV9ERUxUQQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0jZGVmaW5lIENPRkZfTk9MT0FEX1BST0JMRU0JMQotI2RlZmluZSBDT0ZGX0NPTU1PTl9BRERFTkQJMQotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUgkxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQgkJMQotCi0vKiBlbmQgb2YgdGUtZGVsdGEuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1kcHgyLmggYi9nYXMvY29uZmlnL3RlLWRweDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUzNDFjYS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWRweDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qIE1hY2hpbmUgc3BlY2lmaWMgZGVmaW5lcyBmb3IgdGhlIGRweDIgbWFjaGluZSAqLwotCi0vKiBUaGUgbWFnaWMgbnVtYmVyIGlzIG5vdCB0aGUgdXN1YWwgTUM2OE1BR0lDLiAqLwotI2RlZmluZSBDT0ZGX01BR0lDICAgICAgIE1DNjhLQkNTTUFHSUMKLQotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotCi0jZGVmaW5lIFRBUkdFVF9GT1JNQVQgImNvZmYtbTY4ay11biIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLWRweDIuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1keW5peC5oIGIvZ2FzL2NvbmZpZy90ZS1keW5peC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTdiMzBmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZHluaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotLyogVGhpcyBpcyBmb3IgaTM4Ni1zZXF1ZW50LWJzZC4gIFRoZSBhc3NlbWJsZXIgcHJvYmFibHkgZG9lcyBub3QKLSAgIGFjdHVhbGx5IHdvcmssIGFzIHRoZSBzdXBwb3J0IGluIEJGRCBpcyBub3QgY29tcGxldGUgYXMgb2YgdGhpcwotICAgd3JpdGluZy4gIFNlZSBiZmQvaTM4Ni1keW5peC5jLiAgKi8KLQotI2RlZmluZSBURV9EWU5JWCAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWVwb2MtcGUuaCBiL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzVmOTE0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZXBvYy1wZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jZGVmaW5lIFRFX1BFCi0jZGVmaW5lIFRFX0VQT0MKLSNkZWZpbmUgTEVYX0FUIDEgLyogY2FuIGhhdmUgQCdzIGluc2lkZSBsYWJlbHMgKi8KLQotLyogVGhlIFBFIGZvcm1hdCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMuICAqLwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1nZW5lcmljLmggYi9nYXMvY29uZmlnL3RlLWdlbmVyaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlZGE0NS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWdlbmVyaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogdGFyZ2V0IGVudmlyb25tZW50IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBJdCBpcyBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgd2lsbCBldm9sdmUgaW50byBhIGZpbGUgc3VpdGFibGUgZm9yIGNvbmZpZywKLSAqIGNvbXBpbGUsIGFuZCBjb3B5aW5nIGFzIGFuIGFpZCBmb3IgdGVzdGluZyBhbmQgcG9ydGluZy4gIHhveG9yaWNoLgotICovCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpZmRlZiBPQkpfSEVBREVSCi0jaW5jbHVkZSBPQkpfSEVBREVSCi0jZWxzZQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLSNlbmRpZgotCi0vKiBlbmQgb2YgdGUtZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWdvMzIuaCBiL2dhcy9jb25maWcvdGUtZ28zMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWZiZDJlLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtZ28zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1nbzMyLmgKLSAqLwotCi0jZGVmaW5lIFRFX0dPMzIKLQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2RlZmluZSBUQVJHRVRfRk9STUFUICJjb2ZmLWdvMzIiCi0KLS8qIEdBUyBzaG91bGQgdHJlYXQgJy5hbGlnbiB2YWx1ZScgYXMgYW4gYWxpZ25tZW50IG9mIDIqKnZhbHVlICovCi0jZGVmaW5lIFVTRV9BTElHTl9QVFdPCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1ocDMwMC5oIGIvZ2FzL2NvbmZpZy90ZS1ocDMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTk0YWI0Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtaHAzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIHRlLWhwMzAwLmggLS0gaHB1eCA5MDAwLzMwMCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIGVuZCBvZiB0ZS1ocDMwMC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLWhwcGEuaCBiL2dhcy9jb25maWcvdGUtaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmM0ZmE3Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtaHBwYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyogTWFjaGluZSBzcGVjaWZpYyBkZWZpbmVzIGZvciB0aGUgUEEgbWFjaGluZQotICAgQ29weXJpZ2h0IDE5ODcsIDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLQlIUCBQQS1SSVNDIGFuZCBPU0YvMSBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSB0aGUgQ2VudGVyIGZvcgotCVNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaC4KLSAqLwotCi0vKiB0aGVzZSBkZWZpbmUgaW50ZXJmYWNlcyAqLwotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtaTM4NmFpeC5oIGIvZ2FzL2NvbmZpZy90ZS1pMzg2YWl4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjA5NDUuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1pMzg2YWl4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLWkzODZhaXguaCBhbmQgaXMgYnVpbHQgZnJvbSBwaWVjZXMgb2YgY29kZSBmcm9tIE1pbmggVHJhbi1MZQotICogPFRSQU5MRUBJTlRFTExJQ09SUC5DT00+IGJ5IHJpY2hAY3lnbnVzLmNvbS4KLSAqLwotCi0jZGVmaW5lIFRFX0kzODZBSVggMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKgotICogVW5kZWZpbmUgUkVWRVJTRV9TT1JUX1JFTE9DUyB0byBrZWVwIHRoZSByZWxvY2F0aW9uIGVudHJpZXMgc29ydGVkCi0gKiBpbiBhc2NlbmRpbmcgdmFkZHIuCi0gKi8KLSN1bmRlZiBSRVZFUlNFX1NPUlRfUkVMT0NTCi0KLS8qCi0gKiBEZWZpbmUgS0VFUF9SRUxPQ19JTkZPIHNvIHRoYXQgdGhlIHN0cmlwIHJlbG9jIGluZm8gZmxhZyBGX1JFTEZMRwotICogaXMgbm90IHVzZWQgaW4gdGhlIGZpbGVoZHIgZm9yIENPRkYgb3V0cHV0LgotICovCi0jZGVmaW5lIEtFRVBfUkVMT0NfSU5GTwotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiA3OQotICogRW5kOgotICovCi0KLS8qIGVuZCBvZiB0ZS1pMzg2YWl4LmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtaWM5NjAuaCBiL2dhcy9jb25maWcvdGUtaWM5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzMWZiOS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWljOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgdGUtaWM5NjAuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LTE5OTIsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1pYzk2MC5oIGFuZCBpcyBpbnRlbmRlZCB0byBkZWZpbmUgaWM5NjAgZW52aXJvbm1lbnQKLSAqIHNwZWNpZmljIGRpZmZlcmVuY2VzLgotICovCi0KLSNkZWZpbmUgT0JKX0NPRkZfT01JVF9PUFRJT05BTF9IRUFERVIKLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpICgobmFtZVswXSA9PSdMJykgXAotCQkJICAgfHwgKG5hbWVbMF0gPT0nLicgXAotCQkJICAgICAgICYmIChuYW1lWzFdPT0nQycgXAotCQkJCSAgIHx8IG5hbWVbMV09PSdJJyBcCi0JCQkJICAgfHwgbmFtZVsxXT09Jy4nKSkpCi0jZW5kaWYKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogZW5kIG9mIHRlLWljOTYwLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbGludXguaCBiL2dhcy9jb25maWcvdGUtbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzNWE3YS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWxpbnV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNkZWZpbmUgVEVfTElOVVgKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbG5ld3MuaCBiL2dhcy9jb25maWcvdGUtbG5ld3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiY2M1YS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLWxuZXdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qIHRlLWxuZXdzLmggLS0gbGl0dGxlLWVuZGlhbiBORVdTIGVtdWxhdGlvbi4gICovCi0KLSNkZWZpbmUgRUNPRkZfTElUVExFX0ZPUk1BVCAiZWNvZmYtYmlnbGl0dGxlbWlwcyIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtbHlueC5oIGIvZ2FzL2NvbmZpZy90ZS1seW54LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwODUxNWQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1seW54LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNkZWZpbmUgVEVfTFlOWAotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMU19GQgotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW1hY2guaCBiL2dhcy9jb25maWcvdGUtbWFjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzU0N2Y4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbWFjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jZGVmaW5lIFRFX01hY2gKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW1hY29zLmggYi9nYXMvY29uZmlnL3RlLW1hY29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNDhkYzQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1tYWNvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHRlLW1hY29zLmguICAqLwotCi0jZGVmaW5lIFRFX1BPV0VSTUFDIDEKLQotLyogQWRkZWQgdGhlc2UsIGJlY2F1c2UgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHdlJ3JlIHRhcmdldHRpbmcgd2UgbWF5Ci0gICBuZWVkIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mIGxpYmdjYywgYW5kIHRoYXQgd2lsbCB1c2UgbG9jYWwKLSAgIGxhYmVscy4gICovCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1tdWx0aS5oIGIvZ2FzL2NvbmZpZy90ZS1tdWx0aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGVkYTQ1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbXVsdGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtZ2VuZXJpYy5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgotICogdGFyZ2V0IGVudmlyb25tZW50IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBJdCBpcyBteSBpbnRlbnQgdGhhdCB0aGlzIGZpbGUgd2lsbCBldm9sdmUgaW50byBhIGZpbGUgc3VpdGFibGUgZm9yIGNvbmZpZywKLSAqIGNvbXBpbGUsIGFuZCBjb3B5aW5nIGFzIGFuIGFpZCBmb3IgdGVzdGluZyBhbmQgcG9ydGluZy4gIHhveG9yaWNoLgotICovCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotI2RlZmluZSBMT0NBTF9MQUJFTFNfRE9MTEFSIDEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotLyogdGhlc2UgZGVmaW5lIGludGVyZmFjZXMgKi8KLSNpZmRlZiBPQkpfSEVBREVSCi0jaW5jbHVkZSBPQkpfSEVBREVSCi0jZWxzZQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLSNlbmRpZgotCi0vKiBlbmQgb2YgdGUtZ2VuZXJpYy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW5ic2QuaCBiL2dhcy9jb25maWcvdGUtbmJzZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWU0NjAwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbmJzZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogdGUtbmJzZC5oIC0tIE5ldEJTRCB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEVfTmV0QlNECTEKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLW5ic2Q1MzIuaCBiL2dhcy9jb25maWcvdGUtbmJzZDUzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2Y5ZTVmLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtbmJzZDUzMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyB0ZS1uZXRic2Q1MzIuaAotICoKLSAqIFdyaXR0ZW4gYnkgSWFuIERhbGwgPGlkYWxsQGVsZWNlbmcuYWRlbGFpZGUuZWR1LmF1PgotICogCi0gKiAxOS1KdW4tOTQKLSAqIAotICovCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LW5zMzJrLW5ldGJzZCIKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKLQotLyogTWF5YmUgdGhlc2Ugc2hvdWxkIGJlIG1vcmUgbGlrZSBUQ19OUzMyNTMyIGFuZCBUQ19OUzMyMzgxIGluIGNhc2UKLSAqIG9mIGNvbmZsaWN0cy4gTlMzMjM4MSBpcyB1c2VkIGluIG9wY29kZS9uczMyay5oIGFuZCB0aGF0IGlzIGFsc28KLSAqIHVzZWQgYnkgR0RCLiBOZWVkIHRvIGNoZWNrLgotICovCi0jZGVmaW5lIE5TMzI1MzIKLSNkZWZpbmUgTlMzMjM4MQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wYzUzMm1hY2guaCBiL2dhcy9jb25maWcvdGUtcGM1MzJtYWNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZTdmZjguLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1wYzUzMm1hY2guaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgdGUtcGM1MzIuaAotICoKLSAqIFdyaXR0ZW4gYnkgSWFuIERhbGwgPGlkYWxsQGVsZWNlbmcuYWRlbGFpZGUuZWR1LmF1PgotICogCi0gKiAyNC1NYXktOTQKLSAqIAotICovCi0KLSNkZWZpbmUgVEFSR0VUX0ZPUk1BVAkJImEub3V0LXBjNTMyLW1hY2giCi0KLSNpbmNsdWRlICJvYmotZm9ybWF0LmgiCi0KLS8qIE1heWJlIHRoZXNlIHNob3VsZCBiZSBtb3JlIGxpa2UgVENfTlMzMjUzMiBhbmQgVENfTlMzMjM4MSBpbiBjYXNlCi0gKiBvZiBjb25mbGljdHMuIE5TMzIzODEgaXMgdXNlZCBpbiBvcGNvZGUvbnMzMmsuaCBhbmQgdGhhdCBpcyBhbHNvCi0gKiB1c2VkIGJ5IEdEQi4gTmVlZCB0byBjaGVjay4KLSAqLwotI2RlZmluZSBOUzMyNTMyCi0jZGVmaW5lIE5TMzIzODEKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcGUuaCBiL2dhcy9jb25maWcvdGUtcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxZjBiMi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNkZWZpbmUgVEVfUEUKLSNkZWZpbmUgTEVYX0FUIDEgLyogY2FuIGhhdmUgQCdzIGluc2lkZSBsYWJlbHMgKi8KLQotLyogVGhlIFBFIGZvcm1hdCBzdXBwb3J0cyBsb25nIHNlY3Rpb24gbmFtZXMuICAqLwotI2RlZmluZSBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1wcGNudy5oIGIvZ2FzL2NvbmZpZy90ZS1wcGNudy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGRmMDUwLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtcHBjbncuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIHRlLXBwY253LmggLS0gUG93ZXIgUEMgcnVubmluZyBOZXR3YXJlIGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBZGRlZCB0aGVzZSwgYmVjYXVzZSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgd2UncmUgdGFyZ2V0dGluZyB3ZSBtYXkKLSAgIG5lZWQgYW4gYXNzZW1ibGVyIHZlcnNpb24gb2YgbGliZ2NjLCBhbmQgdGhhdCB3aWxsIHVzZSBsb2NhbAotICAgbGFiZWxzLiAgKi8KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIHRoZXNlIGRlZmluZSBpbnRlcmZhY2VzICovCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBnY2MgdXNlcyBlc2NhcGUgc2VxdWVuY2VzIGZvciBwcGMvbmV0d2FyZSAqLwotCi0jdW5kZWYgTk9fU1RSSU5HX0VTQ0FQRVMKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtcHNvcy5oIGIvZ2FzL2NvbmZpZy90ZS1wc29zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDQxNTMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1wc29zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHRlLXBzb3MuaCBmb3IgZW1iZWRkZWQgc3lzdGVtcyBydW5uaW5nIHBTT1MuCi0gKiBDb250cmlidXRlZCBieSBNYXJ0aW4gQW5hbnRoYXJhbWFuIChtYXJ0aW5AbWFpbC5pbWVjaC51bmktZHVpc2J1cmcuZGUpCi0gKi8KLQotI2RlZmluZSBURV9QU09TCi0KLS8qIEFkZGVkIHRoZXNlLCBiZWNhdXNlIGlmIHdlIGRvbid0IGtub3cgd2hhdCB3ZSdyZSB0YXJnZXR0aW5nIHdlIG1heQotICAgbmVlZCBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiBsaWJnY2MsIGFuZCB0aGF0IHdpbGwgdXNlIGxvY2FsCi0gICBsYWJlbHMuICAqLwotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0vKiBUaGlzIG1ha2VzIEdBUyBtb3JlIHZlcnNhdGlsZSBhbmQgYmxvY2tzIHNvbWUgRUxGJ2lzbXMgaW4KLSAgIHRjLW02OGsuaC4gKi8KLQotI2RlZmluZSBSRUdJU1RFUl9QUkVGSVhfT1BUSU9OQUwgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtcHNvcy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXJpc2NpeC5oIGIvZ2FzL2NvbmZpZy90ZS1yaXNjaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M3MjUzZS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXJpc2NpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jZGVmaW5lIFRFX1JJU0NJWAotCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19ET0xMQVIgMQotI2RlZmluZSBMT0NBTF9MQUJFTFNfRkIgMQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zcGFyY2FvdXQuaCBiL2dhcy9jb25maWcvdGUtc3BhcmNhb3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTAxODQuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy90ZS1zcGFyY2FvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIHRlLXNwYXJjYW91dC5oIC0tIGVtYmVkZGVkIHNwYXJjLWFvdXQgdGFyZ2V0IGVudmlyb25tZW50IGRlY2xhcmF0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLSAgIAotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAgIAotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAgIAotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRFX1NQQVJDQU9VVAkxCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZy90ZS1zdW4zLmggYi9nYXMvY29uZmlnL3RlLXN1bjMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZDQyYi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3RlLXN1bjMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qIHRlLXN1bjMuaCAtLSBTdW4tMyB0YXJnZXQgZW52aXJvbm1lbnQgZGVjbGFyYXRpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlICNkZWZpbmVzIHNwZWNpZmljCi0gICB0byBTVU4gY29tcHV0ZXIgU1VOIDMgc2VyaWVzIGNvbXB1dGVycy4gIChUaGUgb25seSBraW5kCi0gICB3ZSBoYXZlIGFyb3VuZCBoZXJlLCB1bmZvcnR1bmF0bHkuKQotCi0gICBSdW1vciBoYXMgaXQgdGhhdCB0aGlzIGZpbGUgd2lsbCB3b3JrIG9uIHRoZSBTdW4tMiBpZiB0aGUgYXNzZW1ibGVyCi0gICBpcyBjYWxsZWQgd2l0aCAtbTY4MDEwICBUaGlzIGlzIG5vdCB0ZXN0ZWQuICAqLwotCi0KLSNkZWZpbmUgVEVfU1VOMwkxCi0KLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0RPTExBUiAxCi0jZGVmaW5lIExPQ0FMX0xBQkVMU19GQiAxCi0KLS8qIENvdWxkIGFsc28gYmUgOgotICAgI2RlZmluZSBTX0xPQ0FMX05BTUUocykJKFNfR0VUX05BTUUocylbMF0gPT0gJy4nICYmCi0gICBTX0dFVF9OQU1FKHMpWzFdID09ICdMJyB8fAotICAgU19HRVRfTkFNRShzKVsxXSA9PSAnLicpCi0gICAqLwotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKgotICogTG9jYWwgVmFyaWFibGVzOgotICogY29tbWVudC1jb2x1bW46IDAKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwotCi0vKiBlbmQgb2YgdGUtc3VuMy5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3RlLXN2cjQuaCBiL2dhcy9jb25maWcvdGUtc3ZyNC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjE3ZWUxLi4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtc3ZyNC5oCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jZGVmaW5lIFRFX1NWUjQKLSNkZWZpbmUgTE9DQUxfTEFCRUxTX0ZCIDEKLQotI2luY2x1ZGUgIm9iai1mb3JtYXQuaCIKZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdGUtc3lzdjMyLmggYi9nYXMvY29uZmlnL3RlLXN5c3YzMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlNmU1Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdGUtc3lzdjMyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS8qIFJlbW92ZSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSB0aGUgZ2NjIGdlbmVyYXRlZCBzeW1ib2wgbmFtZXMgKi8KLSNkZWZpbmUgU1RSSVBfVU5ERVJTQ09SRQotCi0jaW5jbHVkZSAib2JqLWZvcm1hdC5oIgotCi0vKiBlbmQgb2YgdGUtc3lzdjMyLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9jb25maWcvdmF4LWluc3QuaCBiL2dhcy9jb25maWcvdmF4LWluc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkOGY5OC4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlnL3ZheC1pbnN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKiB2YXgtaW5zdC5oIC0gR05VIC0gUGFydCBvZiB2YXguYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyLCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBUaGlzIGlzIHBhcnQgb2YgdmF4LWlucy1wYXJzZS5jICYgZnJpZW5kcy4KLSAqIFdlIHdhbnQgdG8gcGFyc2UgYSB2YXggaW5zdHJ1Y3Rpb24gdGV4dCBpbnRvIGEgdHJlZSBkZWZpbmVkIGhlcmUuCi0gKi8KLQotI2RlZmluZSBWSVRfTUFYX09QRVJBTkRTICg2KQkvKiBtYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBpbiBvbmUgICAgICAgKi8KLS8qIHNpbmdsZSB2YXggaW5zdHJ1Y3Rpb24gKi8KLQotc3RydWN0IHZvcAkJCS8qIHZheCBpbnN0cnVjdGlvbiBvcGVyYW5kICAgICAgICAgICAgICAgICAqLwotewotICBzaG9ydCBpbnQgdm9wX25keDsJCS8qIC0xLCBvciBpbmRleCByZWdpc3Rlci4gZWcgNz1bUjddCSAgICovCi0gIHNob3J0IGludCB2b3BfcmVnOwkJLyogLTEsIG9yIHJlZ2lzdGVyIG51bWJlci4gZWcgQEleIz0weEYgICAgICovCi0gIC8qIEhlbHBzIGRpc3Rpbmd1aXNoICJhYnMiIGZyb20gImFicyhQQykiLiAqLwotICBzaG9ydCBpbnQgdm9wX21vZGU7CQkvKiBhZGRyZXNzaW5nIG1vZGUgNCBiaXRzLiBlZyBJXiM9MHg5CSAgICovCi0gIGNoYXIgdm9wX3Nob3J0OwkJLyogb3BlcmFuZCBkaXNwbGFjZW1lbnQgbGVuZ3RoIGFzIHdyaXR0ZW4gICovCi0gIC8qICcgJz1ub25lLCAiYmlsc3ciPUJeSV5MXlNeV14uICAgICAgICAgICAqLwotICBjaGFyIHZvcF9hY2Nlc3M7CQkvKiAnYidicmFuY2ggJyAnbm8taW5zdHJ1Y3Rpb24gJ2FtcnZ3J25vcm0gKi8KLSAgY2hhciB2b3Bfd2lkdGg7CQkvKiBPcGVyYW5kIHdpZHRoLCBvbmUgb2YgImJkZmdobG9xdyIJICAgKi8KLSAgY29uc3QgY2hhciAqdm9wX3dhcm47CQkvKiB3YXJuaW5nIG1lc3NhZ2Ugb2YgdGhpcyBvcGVyYW5kLCBpZiBhbnkgKi8KLSAgY29uc3QgY2hhciAqdm9wX2Vycm9yOwkvKiBzYXkgaWYgb3BlcmFuZCBpcyBpbmFwcHJvcHJpYXRlICAgICAgICAgKi8KLSAgY2hhciAqdm9wX2V4cHJfYmVnaW47CQkvKiBVbnBhcnNlZCBleHByZXNzaW9uLCAxc3QgY2hhciAuLi4JICAgKi8KLSAgY2hhciAqdm9wX2V4cHJfZW5kOwkJLyogLi4uIGxhc3QgY2hhci4JCQkgICAqLwotICB1bnNpZ25lZCBjaGFyIHZvcF9uYnl0ZXM7CS8qIG51bWJlciBvZiBieXRlcyBpbiBkYXR1bQkJICAgKi8KLX07Ci0KLQotdHlwZWRlZiBsb25nIHZheF9vcGNvZGVUOwkvKiBGb3IgaW5pdGlhbGlzaW5nIGFycmF5IG9mIG9wY29kZXMJICAgKi8KLS8qIFNvbWUgc3ludGhldGljIG9wY29kZXMgPiAxNiBiaXRzISAgICAgICAqLwotCi0jZGVmaW5lIFZJVF9PUENPREVfU1lOVEhFVElDIDB4ODAwMDAwMDAJLyogTm90IHJlYWwgaGFyZHdhcmUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBWSVRfT1BDT0RFX1NQRUNJQUwgICAweDQwMDAwMDAwCS8qIE5vdCBub3JtYWwgYnJhbmNoIG9wdGltaXNpbmcuICAgKi8KLS8qIE5ldmVyIHNldCB3aXRob3V0IC4uLl9TWU5USEVUSUMgKi8KLQotI2RlZmluZSBWQVhfV0lEVEhfVU5DT05ESVRJT05BTF9KVU1QICctJwkvKiBUaGVzZSBhcmUgZW5jb2RlZCBpbnRvICAgICAgICAgKi8KLSNkZWZpbmUgVkFYX1dJRFRIX0NPTkRJVElPTkFMX0pVTVAgICAnPycJLyogdm9wX3dpZHRoIHdoZW4gdm9wX2FjY2Vzcz09J2InICovCi0jZGVmaW5lIFZBWF9XSURUSF9XT1JEX0pVTVAgICAgICAgICAgJyEnCS8qIGFuZCBWSVRfT1BDT0RFX1NZTlRIRVRJQyBzZXQuICAqLwotI2RlZmluZSBWQVhfV0lEVEhfQllURV9KVU1QCSAgICAgJzonCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFZBWF9KTVAgKDB4MTcpCQkvKiBVc2VmdWwgZm9yIGJyYW5jaCBvcHRpbWlzaW5nLiBKdW1wIGluc3RyKi8KLSNkZWZpbmUgVkFYX1BDX1JFTEFUSVZFX01PREUgKDB4ZWYpCS8qIFVzZSBpdCBhZnRlciBWQVhfSk1QCQkgICAqLwotI2RlZmluZSBWQVhfQUJTT0xVVEVfTU9ERSAoMHg5RikvKiBVc2UgYXMgQCMuLi4JCQkgICAqLwotI2RlZmluZSBWQVhfQlJCICgweDExKQkJLyogQ2Fub25pY2FsIGJyYW5jaC4JCQkgICAqLwotI2RlZmluZSBWQVhfQlJXICgweDMxKQkJLyogQW5vdGhlciBjYW5vbmljYWwgYnJhbmNoCQkgICAqLwotI2RlZmluZSBWQVhfV0lERU5fV09SRCAoMHgyMCkJLyogQWRkIHRoaXMgdG8gYnl0ZSBicmFuY2ggdG8gZ2V0IHdvcmQgYnIuICovCi0jZGVmaW5lIFZBWF9XSURFTl9MT05HICgweDYpCS8qIEFkZCB0aGlzIHRvIGJ5dGUgYnJhbmNoIHRvIGdldCBsb25nIGptcC4qLwotLyogTmVlZHMgVkFYX1BDX1JFTEFUSVZFX01PREUgYnl0ZSBhZnRlciBpdCovCi0KLXN0cnVjdCB2aXQJCQkvKiB2YXggaW5zdHJ1Y3Rpb24gdHJlZSAgICAgICAgICAgICAgICAgICAgKi8KLXsKLSAgLyogdml0X29wY29kZSBpcyBjaGFyW10gZm9yIHBvcnRhYmlsaXR5LiAgICovCi0gIGNoYXIgdml0X29wY29kZVtzaXplb2YgKHZheF9vcGNvZGVUKV07Ci0gIHVuc2lnbmVkIGNoYXIgdml0X29wY29kZV9uYnl0ZXM7CS8qIEhvdyBsb25nIGlzIF9vcGNvZGU/IChjaGFycykJICAgKi8KLSAgdW5zaWduZWQgY2hhciB2aXRfb3BlcmFuZHM7CS8qCQkJCQkgICAqLwotICBzdHJ1Y3Qgdm9wIHZpdF9vcGVyYW5kW1ZJVF9NQVhfT1BFUkFORFNdOwkvKiBvcGVyYW5kcyAgICAgICAgICAgICAqLwotICBjb25zdCBjaGFyICp2aXRfZXJyb3I7CS8qICIiIG9yIGVycm9yIHRleHQgKi8KLX07Ci0KLS8qIGVuZCBvZiB2YXgtaW5zdC5oICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3Ztcy1hLWNvbmYuaCBiL2dhcy9jb25maWcvdm1zLWEtY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODhmYzY4Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWcvdm1zLWEtY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIHZtcy1hbHBoYS1jb25mLmguICBHZW5lcmF0ZWQgbWFudWFsbHkgZnJvbSBjb25mLmluLAotICAgYW5kIHVzZWQgYnkgY29uZmlnLWdhcy1hbHBoYS5jb20gd2hlbiBjb25zdHJ1Y3RpbmcgY29uZmlnLmguICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgQ19BTExPQ0EKLSNlbHNlCi0jZGVmaW5lIENfQUxMT0NBCi0jZW5kaWYKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIGlubGluZQotI2VuZGlmCi0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0JU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotCVNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotCVNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICgtMSkKLQotLyogU2hvdWxkIGdhcyB1c2UgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlcz8gICovCi0jZGVmaW5lIEJGRF9BU1NFTUJMRVIKLQotLyogU29tZSBhc3NlcnQvcHJlcHJvY2Vzc29yIGNvbWJpbmF0aW9ucyBhcmUgaW5jYXBhYmxlIG9mIGhhbmRsaW5nCi0gICBjZXJ0YWluIGtpbmRzIG9mIGNvbnN0cnVjdHMgaW4gdGhlIGFyZ3VtZW50IG9mIGFzc2VydC4gIEZvciBleGFtcGxlLAotICAgcXVvdGVkIHN0cmluZ3MgKGlmIHJlcXVvdGluZyBpc24ndCBkb25lIHJpZ2h0KSBvciBuZXdsaW5lcy4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBCUk9LRU5fQVNTRVJUCi0jZWxzZQotI2RlZmluZSBCUk9LRU5fQVNTRVJUCi0jZW5kaWYKLQotLyogSWYgd2UgYXJlbid0IGRvaW5nIGNyb3NzLWFzc2VtYmxpbmcsIHNvbWUgb3BlcmF0aW9ucyBjYW4gYmUgb3B0aW1pemVkLAotICAgc2luY2UgYnl0ZSBvcmRlcnMgYW5kIHZhbHVlIHNpemVzIGRvbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQuICAqLwotI3VuZGVmIENST1NTX0NPTVBJTEUKLQotLyogU29tZSBnYXMgY29kZSB3YW50cyB0byBrbm93IHRoZXNlIHBhcmFtZXRlcnMuICAqLwotI2RlZmluZSBUQVJHRVRfQUxJQVMJImFscGhhLXZtcyIKLSNkZWZpbmUgVEFSR0VUX0NQVQkiYWxwaGEiCi0jZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwJImFscGhhLWRlYy12bXMiCi0jZGVmaW5lIFRBUkdFVF9PUwkib3BlblZNUy9BbHBoYSIKLSNkZWZpbmUgVEFSR0VUX1ZFTkRPUgkiZGVjIgotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBtYWxsb2MgYW5kIHJlYWxsb2MuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fTUFMTE9DCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIGZyZWUuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBTb21ldGltZXMgZXJybm8uaCBkb2Vzbid0IGRlY2xhcmUgZXJybm8gaXRzZWxmLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PCi0KLSN1bmRlZiBNQU5ZX1NFR01FTlRTCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBzcGFyYyBjb25maWd1cmF0aW9uICovCi0jdW5kZWYgc3BhcmN2OQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfUkVNT1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdW5saW5rIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1VOTElOSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfRVJSTk9fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTUVNT1JZX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVERBUkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBIQVZFX1NZU19UWVBFU19ICi0jZWxzZQotI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKLSNlbmRpZgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1VOSVNURF9ICS8qIGNvbmZpZy1nYXMuY29tIHdpbGwgbWFrZSBvbmUgaWYgbmVjZXNzYXJ5ICovCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhcmFyZ3MuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVkFSQVJHU19ICi0KLS8qIFZNUy1zcGVjaWZpYzogIHdlIG5lZWQgdG8gc2V0IHVwIEVYSVRfeHh4IGhlcmUgYmVjYXVzZSB0aGUgZGVmYXVsdAotICAgdmFsdWVzIGluIGFzLmggYXJlIGluYXBwcm9wcmlhdGUgZm9yIFZNUywgYnV0IHdlIGFsc28gd2FudCB0byBwcmV2ZW50Ci0gICBhcy5oJ3MgaW5jbHVzaW9uIG9mIDxzdGRsaWIuaD4gZnJvbSB0cmlnZ2VyaW5nIHJlZGVmaW5pdGlvbiB3YXJuaW5ncy4KLSAgIDxzdGRsaWIuaD4gZ3VhcmRzIGl0c2VsZiBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiwgc28gaW5jbHVkaW5nIGl0Ci0gICBoZXJlIHR1cm5zIGFzLmgncyBsYXRlciAjaW5jbHVkZSBpbnRvIGEgbm8tb3AuICAoV2UgY2FuJ3Qgc2ltcGx5IHVzZQotICAgI2lmbmRlZiBIQVZFX1NURExJQl9IIGhlcmUsIGJlY2F1c2UgdGhlIDxzdGRsaWIuaD4gaW4gc2V2ZXJhbCBvbGRlcgotICAgZ2NjLXZtcyBkaXN0cmlidXRpb25zIG5lZ2xlY3RzIHRvIGRlZmluZSB0aGVzZSB0d28gcmVxdWlyZWQgbWFjcm9zLikgICovCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWYgX19ERUNDCi0jdW5kZWYgRVhJVF9TVUNDRVNTCi0jdW5kZWYgRVhJVF9GQUlMVVJFCi0jZGVmaW5lIEVYSVRfU1VDQ0VTUyAxCQkJLyogU1MkX05PUk1BTCwgU1RTJEtfU1VDQ0VTUyAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgMHgxMDAwMDAwMgkJLyogKFNUUyRLX0VSUk9SIHwgU1RTJE1fSU5ISUJfTVNHKSAqLwotI2VuZGlmCi0KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jaWYgX19ERUNDCi1leHRlcm4gaW50IHN0cmNhc2VjbXAgKCk7Ci1leHRlcm4gaW50IHN0cm5jYXNlY21wICgpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvY29uZmlnL3Ztcy1jb25mLmggYi9nYXMvY29uZmlnL3Ztcy1jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMjVjZmMuLjAwMDAwMDAKLS0tIGEvZ2FzL2NvbmZpZy92bXMtY29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qIHZtcy1jb25mLmguICBHZW5lcmF0ZWQgbWFudWFsbHkgZnJvbSBjb25mLmluLAotICAgYW5kIHVzZWQgYnkgY29uZmlnLWdhcy5jb20gd2hlbiBjb25zdHJ1Y3RpbmcgY29uZmlnLmguICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jdW5kZWYgQ19BTExPQ0EKLSNlbHNlCi0jZGVmaW5lIENfQUxMT0NBCi0jZW5kaWYKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jaWZkZWYgX19HTlVDX18KLSN1bmRlZiBpbmxpbmUKLSNlbHNlCi0jZGVmaW5lIGlubGluZQotI2VuZGlmCi0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICgtMSkKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBOYW1lIG9mIHBhY2thZ2UuICAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBvZiBwYWNrYWdlLiAgKi8KLS8qIERlZmluZSBpbiBieSBjb25maWctZ2FzLmNvbSAqLwotLyogI3VuZGVmIFZFUlNJT04gKi8KLQotLyogU2hvdWxkIGdhcyB1c2UgaGlnaC1sZXZlbCBCRkQgaW50ZXJmYWNlcz8gICovCi0jdW5kZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBTb21lIGFzc2VydC9wcmVwcm9jZXNzb3IgY29tYmluYXRpb25zIGFyZSBpbmNhcGFibGUgb2YgaGFuZGxpbmcKLSAgIGNlcnRhaW4ga2luZHMgb2YgY29uc3RydWN0cyBpbiB0aGUgYXJndW1lbnQgb2YgYXNzZXJ0LiAgRm9yIGV4YW1wbGUsCi0gICBxdW90ZWQgc3RyaW5ncyAoaWYgcmVxdW90aW5nIGlzbid0IGRvbmUgcmlnaHQpIG9yIG5ld2xpbmVzLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotI3VuZGVmIEJST0tFTl9BU1NFUlQKLSNlbHNlCi0jZGVmaW5lIEJST0tFTl9BU1NFUlQKLSNlbmRpZgotCi0vKiBJZiB3ZSBhcmVuJ3QgZG9pbmcgY3Jvc3MtYXNzZW1ibGluZywgc29tZSBvcGVyYXRpb25zIGNhbiBiZSBvcHRpbWl6ZWQsCi0gICBzaW5jZSBieXRlIG9yZGVycyBhbmQgdmFsdWUgc2l6ZXMgZG9uJ3QgbmVlZCB0byBiZSBhZGp1c3RlZC4gICovCi0jdW5kZWYgQ1JPU1NfQ09NUElMRQotCi0vKiBTb21lIGdhcyBjb2RlIHdhbnRzIHRvIGtub3cgdGhlc2UgcGFyYW1ldGVycy4gICovCi0jZGVmaW5lIFRBUkdFVF9BTElBUwkidm1zIgotI2RlZmluZSBUQVJHRVRfQ1BVCSJ2YXgiCi0jZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwJInZheC1kZWMtdm1zIgotI2RlZmluZSBUQVJHRVRfT1MJInZtcyIKLSNkZWZpbmUgVEFSR0VUX1ZFTkRPUgkiZGVjIgotCi0vKiBTb21ldGltZXMgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgZG9uJ3QgZGVjbGFyZSBzdHJzdHIuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIG1hbGxvYyBhbmQgcmVhbGxvYy4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9NQUxMT0MKLQotLyogU29tZXRpbWVzIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIGRvbid0IGRlY2xhcmUgZnJlZS4gICovCi0jdW5kZWYgTkVFRF9ERUNMQVJBVElPTl9GUkVFCi0KLS8qIFNvbWV0aW1lcyB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBkb24ndCBkZWNsYXJlIHNicmsuICAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU0JSSwotCi0vKiBTb21ldGltZXMgZXJybm8uaCBkb2Vzbid0IGRlY2xhcmUgZXJybm8gaXRzZWxmLiAgKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VSUk5PCi0KLSN1bmRlZiBNQU5ZX1NFR01FTlRTCi0KLS8qIFRoZSBjb25maWd1cmUgc2NyaXB0IGRlZmluZXMgdGhpcyBmb3Igc29tZSB0YXJnZXRzIGJhc2VkIG9uIHRoZQotICAgdGFyZ2V0IG5hbWUgdXNlZC4gIEl0IGlzIG5vdCBhbHdheXMgZGVmaW5lZC4gICovCi0jdW5kZWYgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLQotLyogTmVlZGVkIG9ubHkgZm9yIHNvbWUgY29uZmlndXJhdGlvbnMgdGhhdCBjYW4gcHJvZHVjZSBtdWx0aXBsZSBvdXRwdXQKLSAgIGZvcm1hdHMuICAqLwotI3VuZGVmIERFRkFVTFRfRU1VTEFUSU9OCi0jdW5kZWYgRU1VTEFUSU9OUwotI3VuZGVmIFVTRV9FTVVMQVRJT05TCi0jdW5kZWYgT0JKX01BWUJFX0FPVVQKLSN1bmRlZiBPQkpfTUFZQkVfQk9VVAotI3VuZGVmIE9CSl9NQVlCRV9DT0ZGCi0jdW5kZWYgT0JKX01BWUJFX0VDT0ZGCi0jdW5kZWYgT0JKX01BWUJFX0VMRgotI3VuZGVmIE9CSl9NQVlCRV9HRU5FUklDCi0jdW5kZWYgT0JKX01BWUJFX0hQMzAwCi0jdW5kZWYgT0JKX01BWUJFX0lFRUUKLSN1bmRlZiBPQkpfTUFZQkVfU09NCi0jdW5kZWYgT0JKX01BWUJFX1ZNUwotCi0vKiBVc2VkIGZvciBzb21lIG9mIHRoZSBDT0ZGIGNvbmZpZ3VyYXRpb25zLCB3aGVuIHRoZSBDT0ZGIGNvZGUgbmVlZHMKLSAgIHRvIHNlbGVjdCBzb21ldGhpbmcgYmFzZWQgb24gdGhlIENQVSB0eXBlIGJlZm9yZSBpdCBrbm93cyBpdC4uLiAqLwotI3VuZGVmIEkzODZDT0ZGCi0jdW5kZWYgTTY4S0NPRkYKLSN1bmRlZiBNODhLQ09GRgotCi0vKiBVc2luZyBjZ2VuIGNvZGU/ICAqLwotI3VuZGVmIFVTSU5HX0NHRU4KLQotLyogTmVlZGVkIG9ubHkgZm9yIHNwYXJjIGNvbmZpZ3VyYXRpb24uICAqLwotI3VuZGVmIERFRkFVTFRfQVJDSAotCi0vKiBOZWVkZWQgb25seSBmb3IgUG93ZXJQQyBTb2xhcmlzLiAgKi8KLSN1bmRlZiBUQVJHRVRfU09MQVJJU19DT01NRU5UCi0KLS8qIE5lZWRlZCBvbmx5IGZvciBTQ08gNS4gICovCi0jdW5kZWYgU0NPX0VMRgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlbW92ZSBmdW5jdGlvbi4gICovCi0jZGVmaW5lIEhBVkVfUkVNT1ZFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2JyayBmdW5jdGlvbi4gICovCi0vKiBzYnJrKCkgaXMgYXZhaWxhYmxlLCBidXQgd2UgZG9uJ3Qgd2FudCBnYXMgdG8gdXNlIGl0LiAgKi8KLSN1bmRlZiBIQVZFX1NCUksKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB1bmxpbmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVU5MSU5LCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9FUlJOT19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NRU1PUllfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdGRhcmcuaD4gaGVhZGVyIGZpbGUuICAqLwotI2RlZmluZSBIQVZFX1NUREFSR19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAgKi8KLSNkZWZpbmUgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLwotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0gKLSNlbHNlCi0jdW5kZWYgSEFWRV9TWVNfVFlQRVNfSAotI2VuZGlmCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jZGVmaW5lIEhBVkVfVU5JU1REX0gJLyogY29uZmlnLWdhcy5jb20gd2lsbCBtYWtlIG9uZSBpZiBuZWNlc3NhcnkgKi8KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFyYXJncy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQVJBUkdTX0gKLQotLyogVk1TLXNwZWNpZmljOiAgd2UgbmVlZCB0byBzZXQgdXAgRVhJVF94eHggaGVyZSBiZWNhdXNlIHRoZSBkZWZhdWx0Ci0gICB2YWx1ZXMgaW4gYXMuaCBhcmUgaW5hcHByb3ByaWF0ZSBmb3IgVk1TLCBidXQgd2UgYWxzbyB3YW50IHRvIHByZXZlbnQKLSAgIGFzLmgncyBpbmNsdXNpb24gb2YgPHN0ZGxpYi5oPiBmcm9tIHRyaWdnZXJpbmcgcmVkZWZpbml0aW9uIHdhcm5pbmdzLgotICAgPHN0ZGxpYi5oPiBndWFyZHMgaXRzZWxmIGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLCBzbyBpbmNsdWRpbmcgaXQKLSAgIGhlcmUgdHVybnMgYXMuaCdzIGxhdGVyICNpbmNsdWRlIGludG8gYSBuby1vcC4gIChXZSBjYW4ndCBzaW1wbHkgdXNlCi0gICAjaWZuZGVmIEhBVkVfU1RETElCX0ggaGVyZSwgYmVjYXVzZSB0aGUgPHN0ZGxpYi5oPiBpbiBzZXZlcmFsIG9sZGVyCi0gICBnY2Mtdm1zIGRpc3RyaWJ1dGlvbnMgbmVnbGVjdHMgdG8gZGVmaW5lIHRoZXNlIHR3byByZXF1aXJlZCBtYWNyb3MuKSAgKi8KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jdW5kZWYgRVhJVF9TVUNDRVNTCi0jdW5kZWYgRVhJVF9GQUlMVVJFCi0jZW5kaWYKLSNkZWZpbmUgRVhJVF9TVUNDRVNTIDEJCQkvKiBTUyRfTk9STUFMLCBTVFMkS19TVUNDRVNTICovCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAweDEwMDAwMDAyCQkvKiAoU1RTJEtfRVJST1IgfCBTVFMkTV9JTkhJQl9NU0cpICovCmRpZmYgLS1naXQgYS9nYXMvY29uZmlndXJlIGIvZ2FzL2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmQ0NGM4MS4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNjExNyArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtZmFzdC1pbnN0YWxsWz1QS0dTXSAgb3B0aW1pemUgZm9yIGZhc3QgaW5zdGFsbGF0aW9uIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtZ251LWxkICAgICAgICAgICBhc3N1bWUgdGhlIEMgY29tcGlsZXIgdXNlcyBHTlUgbGQgW2RlZmF1bHQ9bm9dIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtYmZkLWFzc2VtYmxlciAgdXNlIEJGRCBiYWNrIGVuZCBmb3Igd3JpdGluZyBvYmplY3QgZmlsZXMiCi1hY19oZWxwPSIkYWNfaGVscAotICAgIHRhcmdldHMgICAgICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMgYmVzaWRlcyB0aGUgcHJpbWFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNpdGVmaWxlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXNpdGUtZmlsZT1GSUxFICAgICAgICB1c2UgRklMRSBhcyB0aGUgc2l0ZSBmaWxlCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUtZmlsZSB8IC0tc2l0ZS1maWxlIHwgLS1zaXRlLWZpbCB8IC0tc2l0ZS1maSB8IC0tc2l0ZS1mKQotICAgIGFjX3ByZXY9c2l0ZWZpbGUgOzsKLSAgLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbGU9KiB8IC0tc2l0ZS1maWw9KiB8IC0tc2l0ZS1maT0qIHwgLS1zaXRlLWY9KikKLSAgICBzaXRlZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9YXMuaAotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDc6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI4OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDY6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjgxOiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczNDogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3OTE6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWdhcwotCi1WRVJTSU9OPTIuOS40Ci0KLWlmIHRlc3QgImBjZCAkc3JjZGlyICYmIHB3ZGAiICE9ICJgcHdkYCIgJiYgdGVzdCAtZiAkc3JjZGlyL2NvbmZpZy5zdGF0dXM7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBzb3VyY2UgZGlyZWN0b3J5IGFscmVhZHkgY29uZmlndXJlZDsgcnVuICJtYWtlIGRpc3RjbGVhbiIgdGhlcmUgZmlyc3QiIDE+JjI7IGV4aXQgMTsgfQotZmkKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFBBQ0tBR0UgIiRQQUNLQUdFIgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFZFUlNJT04gIiRWRVJTSU9OIgotRU9GCi0KLQotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWNsb2NhbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODM3OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9jb25mIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT0NPTkY9YXV0b2NvbmYKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0NPTkY9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9jb25mIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NjM6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9tYWtlIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvbWFrZSAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9NQUtFPWF1dG9tYWtlCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9NQUtFPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvbWFrZSIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvaGVhZGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzY6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODg5OiBjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAobWFrZWluZm8gLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBNQUtFSU5GTz1tYWtlaW5mbwotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBNQUtFSU5GTz0iJG1pc3NpbmdfZGlyL21pc3NpbmcgbWFrZWluZm8iCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zdGF0aWMgb3IgLS1kaXNhYmxlLXN0YXRpYyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zdGF0aWMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3N0YXRpYyIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zdGF0aWM9eWVzIDs7Ci1ubykgZW5hYmxlX3N0YXRpYz1ubyA7OwotKikKLSAgZW5hYmxlX3N0YXRpYz1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zdGF0aWM9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3N0YXRpYz15ZXMKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1mYXN0LWluc3RhbGwgb3IgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9mYXN0X2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzIDs7Ci1ubykgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubyA7OwotKikKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTc1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDA1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDM1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTA4NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTExODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTEyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE2MDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNjU6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE5MzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC1nbnUtbGQgb3IgLS13aXRob3V0LWdudS1sZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfZ251X2xkK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2dudV9sZCIKLSAgdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotCi1hY19wcm9nPWxkCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgaWYgZ2NjIC1wcmludC1wcm9nLW5hbWU9bGQgZ2l2ZXMgYSBwYXRoLgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMzY6IGNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIgPiY1Ci0gIGFjX3Byb2c9YCgkQ0MgLXByaW50LXByb2ctbmFtZT1sZCkgMj4mNWAKLSAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI2MDogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci1lbHNlCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBub24tR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjYzOiBjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIgPiY1Ci1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTEQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC16ICIkTEQiOyB0aGVuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICIkYWNfZGlyLyRhY19wcm9nIjsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9MRD0iJGFjX2Rpci8kYWNfcHJvZyIKLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9ncmFtIGlzIEdOVSBsZC4gIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiwKLSAgICAgICMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLSAgICAgICMgQnJlYWsgb25seSBpZiBpdCB3YXMgdGhlIEdOVS9ub24tR05VIGxkIHRoYXQgd2UgcHJlZmVyLgotICAgICAgaWYgIiRhY19jdl9wYXRoX0xEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0gbm8gJiYgYnJlYWsKLSAgICAgIGVsc2UKLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IHllcyAmJiBicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZWxzZQotICBhY19jdl9wYXRoX0xEPSIkTEQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotZmkKLWZpCi0KLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi10ZXN0IC16ICIkTEQiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBsZCBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5OTogY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ251X2xkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ251X2xkPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2dudV9sZCIgMT4mNgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMxNTogY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX05NJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJE5NIjsgdGhlbgotICAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLSAgYWNfY3ZfcGF0aF9OTT0iJE5NIgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIIC91c3IvY2NzL2JpbiAvdXNyL3VjYiAvYmluOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyL25tOyB0aGVuCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLSAgICAgICMgQWRkaW5nIHRoZSBgc2VkIDFxJyBwcmV2ZW50cyBmYWxzZSBwb3NpdGl2ZXMgb24gSFAtVVgsIHdoaWNoIHNheXM6Ci0gICAgICAjICAgbm06IHVua25vd24gb3B0aW9uICJCIiBpZ25vcmVkCi0gICAgICBpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1CIgotCWJyZWFrCi0gICAgICBlbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLXAiCi0JYnJlYWsKLSAgICAgIGVsc2UKLQlhY19jdl9wYXRoX05NPSR7YWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSJ9ICMga2VlcCB0aGUgZmlyc3QgbWF0Y2gsIGJ1dAotCWNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX05NIiAmJiBhY19jdl9wYXRoX05NPW5tCi1maQotZmkKLQotTk09IiRhY19jdl9wYXRoX05NIgotZWNobyAiJGFjX3QiIiROTSIgMT4mNgotCi0KLSMgQ2hlY2sgZm9yIGNvbW1hbmQgdG8gZ3JhYiB0aGUgcmF3IHN5bWJvbCBuYW1lIGZvbGxvd2VkIGJ5IEMgc3ltYm9sIGZyb20gbm0uCi1lY2hvICRhY19uICJjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzNTM6IGNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1hY19zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1hY19zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1hY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopCi0gIGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eVCAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxKCk7L3AnIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotICA7OwotaXJpeCopCi0gIGFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0gIDs7Ci1zb2xhcmlzKikKLSAgYWNfc3ltY29kZT0nW0JEVF0nCi0gIDs7Ci1lc2FjCi0KLSMgSWYgd2UncmUgdXNpbmcgR05VIG5tLCB0aGVuIHVzZSBpdHMgc3RhbmRhcmQgc3ltYm9sIGNvZGVzLgotaWYgJE5NIC1WIDI+JjEgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0gIGFjX3N5bWNvZGU9J1tBQkNER0lTVFddJwotZmkKLQotIyBUcnkgd2l0aG91dCBhIHByZWZpeCB1bmRlcmNvcmUsIHRoZW4gd2l0aCBpdC4KLWZvciBhY19zeW1wcmZ4IGluICIiICJfIjsgZG8KLQotICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qIAlcKCRhY19zeW1jb2RlXCkgCSAJKlwoJGFjX3N5bXByZnhcKSRhY19zeW1wYXQkLyRhY19zeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBhY19waXBlX3dvcmtzPW5vCi0gIHJtIC1mIGNvbmZ0ZXN0LiRhY19leHQKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLWludCBtYWluKCl7bm1fdGVzdF92YXI9J2EnO25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MjA6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0KLSAgICAgICMgVHJ5IHNvcnRpbmcgYW5kIHVuaXF1aWZ5aW5nIHRoZSBvdXRwdXQuCi0gICAgICBpZiBzb3J0ICIkYWNfbmxpc3QiIHwgdW5pcSA+ICIkYWNfbmxpc3QiVDsgdGhlbgotCW12IC1mICIkYWNfbmxpc3QiVCAiJGFjX25saXN0IgotICAgICAgZWxzZQotCXJtIC1mICIkYWNfbmxpc3QiVAotICAgICAgZmkKLQotICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3ZSBzbmFnZ2VkIGFsbCB0aGUgc3ltYm9scyB3ZSBuZWVkLgotICAgICAgaWYgZWdyZXAgJyBubV90ZXN0X3ZhciQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQlpZiBlZ3JlcCAnIG5tX3Rlc3RfZnVuYyQnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQkgIGNhdCA8PEVPRiA+IGNvbmZ0ZXN0LmMKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotRU9GCi0JICAjIE5vdyBnZW5lcmF0ZSB0aGUgc3ltYm9sIGZpbGUuCi0JICBldmFsICIkYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbCInIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYycKLQotCSAgY2F0IDw8RU9GID4+IGNvbmZ0ZXN0LmMKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSMgZGVmaW5lIGx0X3B0cl90IHZvaWQgKgotI2Vsc2UKLSMgZGVmaW5lIGx0X3B0cl90IGNoYXIgKgotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKiBUaGUgbWFwcGluZyBiZXR3ZWVuIHN5bWJvbCBuYW1lcyBhbmQgc3ltYm9scy4gKi8KLWNvbnN0IHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGx0X3B0cl90IGFkZHJlc3M7Ci19Ci1sdF9wcmVsb2FkZWRfc3ltYm9sc1tdID0KLXsKLUVPRgotCXNlZCAncy9eLiBcKC4qXCkgXCguKlwpJC8gIHsiXDIiLCAobHRfcHRyX3QpIFwmXDJ9LC8nIDwgIiRhY19ubGlzdCIgPj4gY29uZnRlc3QuYwotCWNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3RtLiRhY19vYmpleHQKLQkgIGFjX3NhdmVfTElCUz0iJExJQlMiCi0JICBhY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kYWNfb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ3MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIGFjX3BpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLQlmaQotICAgICAgZWxzZQotCWVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfdmFyIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGVsc2UKLSAgICAgIGVjaG8gImNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkYWNfcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBpZiB0ZXN0IHgiJGFjX3N5bXByZngiID0geCJfIjsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotICAgIGZpCi0gICAgYnJlYWsKLSAgZWxzZQotICAgIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9Ci0gIGZpCi1kb25lCi0KLWZpCi0KLQotYWNfcmVzdWx0PXllcwotaWYgdGVzdCAteiAiJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0gICBhY19yZXN1bHQ9bm8KLWZpCi1lY2hvICIkYWNfdCIiJGFjX3Jlc3VsdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUxODogY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ubwotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci1pbnQgbWFpbigpe25tX3Rlc3RfZnVuYztyZXR1cm4gMDt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUyNzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTMwOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotICAgICMgU2VlIHdoZXRoZXIgdGhlIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4KLSAgICBpZiBlZ3JlcCAnXi4gX25tX3Rlc3RfZnVuYycgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPXllcwotICAgIGVsc2UKLSAgICAgIGlmIGVncmVwICdeLiBubV90ZXN0X2Z1bmMgJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JOgotICAgICAgZWxzZQotCWVjaG8gImNvbmZpZ3VyZTogY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0gICAgICBmaQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICJjb25maWd1cmU6IGNhbm5vdCBydW4gJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuYyA+JjUKLWZpCi1ybSAtcmYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlIiAxPiY2Ci1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1NTY6IGNoZWNraW5nIHdoZXRoZXIgbG4gLXMgd29ya3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTE5fUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGwKLXRoZW4KLSAgcm0gLWYgY29uZnRlc3RkYXRhCi0gIGFjX2N2X3Byb2dfTE5fUz0ibG4gLXMiCi1lbHNlCi0gIGFjX2N2X3Byb2dfTE5fUz1sbgotZmkKLWZpCi1MTl9TPSIkYWNfY3ZfcHJvZ19MTl9TIgotaWYgdGVzdCAiJGFjX2N2X3Byb2dfTE5fUyIgPSAibG4gLXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE1OTggImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1OTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYyMDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfY2NfbmVlZHNfYmVsZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE2MjUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2MzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjU1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4NzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIERMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzIyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3NTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgbmVlZF9sb2Nrcz0kZW5hYmxldmFsCi1lbHNlCi0gIG5lZWRfbG9ja3M9eWVzCi1maQotCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLXVzZXJfYmZkX2dhcz0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1iZmQtYXNzZW1ibGVyIG9yIC0tZGlzYWJsZS1iZmQtYXNzZW1ibGVyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2JmZF9hc3NlbWJsZXIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2JmZF9hc3NlbWJsZXIiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBuZWVkX2JmZD15ZXMgdXNlcl9iZmRfZ2FzPXllcyA7OwotICBubykgIHVzZXJfYmZkX2dhcz1ubyA7OwotICAqKSAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBnaXZlbiBmb3IgYmZkLWFzc2VtYmxlciBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotCSAgICA7OwotICBubykJICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKQkgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbiIgMT4mMjsgZXhpdCAxOyB9IDs7Ci1lc2FjCi1maQotCi11c2luZ19jZ2VuPW5vCi0KLSMgR2VuZXJhdGUgYSBoZWFkZXIgZmlsZQotCi0KLQotCi10ZV9maWxlPWdlbmVyaWMKLQotIyBNYWtlZmlsZSB0YXJnZXQgZm9yIGluc3RhbGxpbmcgZ2FzIGluICQodG9vbGRpcikvYmluLgotaW5zdGFsbF90b29sZGlyPWluc3RhbGwtZXhlYy10b29sZGlyCi0KLWNhbm9uX3RhcmdldHM9IiIKLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gIGZvciB0IGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgOyBkbwotICAgIHJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHQgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0gICAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotIyAgICBlbHNlCi0jICAgICAgIyBQZXJtaXQgImFsbCIsIGV0Yy4gIFdlIGRvbid0IHN1cHBvcnQgaXQgeWV0IHRob3VnaC4KLSMgICAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdCIKLSAgICBmaQotICBkb25lCi0gIF9nYXNfdW5pcV9saXN0PSIkY2Fub25fdGFyZ2V0cyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWNhbm9uX3RhcmdldHM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWZpCi0KLWVtdWxhdGlvbnM9IiIKLQotZm9yIHRoaXNfdGFyZ2V0IGluICR0YXJnZXQgJGNhbm9uX3RhcmdldHMgOyBkbwotCi0gICAgZXZhbCBgZWNobyAkdGhpc190YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9jcHU9XDEgdmVuZG9yPVwyIG9zPVwzLydgCi0KLSAgICAjIGNoZWNrIGZvciBhcmNoaXRlY3R1cmUgdmFyaWFudHMKLSAgICBhcmNoPQotICAgIGVuZGlhbj0KLSAgICBjYXNlICR7Y3B1fSBpbgotICAgICAgYWxwaGEqKQkJY3B1X3R5cGU9YWxwaGEgOzsKLSAgICAgIGFybWViKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKLSAgICAgIGFybSopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtdipsKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGFybXYqYikJCWNwdV90eXBlPWFybSBlbmRpYW49YmlnIDs7Ci0gICAgICBzdHJvbmdhcm0qKQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgdGh1bWIqKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIGhwcGEqKQkJY3B1X3R5cGU9aHBwYSA7OwotICAgICAgaVs0NTZdODYpCQljcHVfdHlwZT1pMzg2IDs7Ci0gICAgICBtNjgwWzAxMjM0Nl0wKQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNjgwMDgpCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNjgzPz8pCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNTIwMCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG04KikJCWNwdV90eXBlPW04OGsgOzsKLSAgICAgIG1pcHMqZWwpCQljcHVfdHlwZT1taXBzIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMqKQkJY3B1X3R5cGU9bWlwcyBlbmRpYW49YmlnIDs7Ci0gICAgICBwb3dlcnBjbGUqKQljcHVfdHlwZT1wcGMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgcG93ZXJwYyopCQljcHVfdHlwZT1wcGMgZW5kaWFuPWJpZyA7OwotICAgICAgcnM2MDAwKikJCWNwdV90eXBlPXBwYyA7OwotICAgICAgc3BhcmNsaXRlKikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsKLSAgICAgIHNwYXJjbGV0KikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xldCA7OwotICAgICAgc3BhcmM2NCopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXY5LTY0IDs7Ci0gICAgICBzcGFyYzg2eCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmM4NnggIDs7Ci0gICAgICBzcGFyYyopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGl0ZSA7OyAjID8/PyBTZWUgdGMtc3BhcmMuYy4KLSAgICAgIHY4NTAqKQkJY3B1X3R5cGU9djg1MCA7OwotICAgICAgKikJCWNwdV90eXBlPSR7Y3B1fSA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgdGFyZ2V0X2NwdV90eXBlPSR7Y3B1X3R5cGV9Ci0gICAgZWxpZiB0ZXN0ICR7dGFyZ2V0X2NwdV90eXBlfSAhPSAke2NwdV90eXBlfSA7IHRoZW4KLSAgICAgIGNvbnRpbnVlCi0gICAgZmkKLQotICAgIGdlbmVyaWNfdGFyZ2V0PSR7Y3B1X3R5cGV9LSR2ZW5kb3ItJG9zCi0gICAgZGV2PW5vCi0gICAgYmZkX2dhcz1ubwotICAgIGVtPWdlbmVyaWMKLQotICAgICMgYXNzaWduIG9iamVjdCBmb3JtYXQKLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9IGluCi0gICAgICBhMjlrLSotY29mZikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLXVkaSkgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1hbWQtZWJtb24pICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLW55dS1zeW0xKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstKi12eHdvcmtzKikgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBhbHBoYSotKi0qdm1zKikJICAgIGZtdD1ldmF4IDs7Ci0gICAgICBhbHBoYSotKi1uZXR3YXJlKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vcGVuYnNkKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vc2YqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eGVjb2ZmKikgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eC1nbnUqKSAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgYWxwaGEqLSotbmV0YnNkKikgICAgIGZtdD1lbGYgZW09bmJzZCA7OwotCi0gICAgICBhcmMtKi1lbGYqKSAgICAgICAgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBhcm0tKi1hb3V0KQkgICAgICAgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGFybS0qLWNvZmYgfCB0aHVtYi0qLWNvZmYpICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYXJtLSotZWxmIHwgdGh1bWItKi1lbGYpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybS0qLWxpbnV4KmFvdXQqKQkgICAgICAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBhcm0tKi1saW51eCogfCBhcm12Ki0qLWxpbnV4LWdudSkJZm10PWVsZiAgZW09bGludXggOzsKLSAgICAgIGFybS0qLW5ldGJzZCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKi1vYWJpIHwgdGh1bWItKi1vYWJpKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgYXJtLWVwb2MtcGUgfCB0aHVtYi1lcG9jLXBlKSAgICAgIGZtdD1jb2ZmIGVtPWVwb2MtcGUgOzsKLSAgICAgIGFybS0qLXBlIHwgdGh1bWItKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgYXJtLSotcmlzY2l4KikJICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPXJpc2NpeCA7OwotCi0gICAgICBkMTB2LSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBkMzB2LSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLQotICAgICAgZnIzMC0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBocHBhLSotKmVsZiopICAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbGl0ZXMqKSAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotb3NmKikgICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotcnRlbXMqKSAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotaHB1eCopICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbXBlaXgqKSAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotYnNkKikgICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotaGl1eCopICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0KLSAgICAgIGg4MzAwLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBpMzg2LWlibS1haXgqKSAgICAgICAgZm10PWNvZmYgZW09aTM4NmFpeCA7OwotICAgICAgaTM4Ni1zZXF1ZW50LWJzZCopICAgIGZtdD1hb3V0IGVtPWR5bml4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc3BlKikgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1iZW9zZWxmKiB8IGkzODYtKi1iZW9zKikgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJzZCopICAgICAgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLW5ldGJzZDAuOCkgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXM7OwotICAgICAgaTM4Ni0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXM7OwotICAgICAgaTM4Ni0qLWxpbnV4KmFvdXQqIHwgaTM4Ni0qLWxpbnV4b2xkbGQpICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eCpjb2ZmKikgICBmbXQ9Y29mZiBlbT1saW51eCA7OwotICAgICAgaTM4Ni0qLWxpbnV4LWdudSopICAgIGZtdD1lbGYgZW09bGludXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBpMzg2LSotc3lzdjQqIHwgaTM4Ni0qLXNvbGFyaXMqIHwgaTM4Ni0qLWVsZikKLQkJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotZnJlZWJzZGFvdXQqIHwgaTM4Ni0qLWZyZWVic2QxMi4qIHwgaTM4Ni0qLWZyZWVic2QxMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT0zODZic2QgOzsKLSAgICAgIGkzODYtKi1mcmVlYnNkKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1jb2ZmIHwgaTM4Ni0qLXN5c3YqIHwgaTM4Ni0qLXNjbzMuMnY1KmNvZmYgfCBpMzg2LSotaXNjKikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1zY28zLjJ2NSopICAgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNDT19FTEYgMQotRU9GCi0KLQkJCSAgICBmaQotCQkJICAgIDs7Ci0gICAgICBpMzg2LSotc2NvMy4yKikgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi12c3RhKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1zZG9zZGpncHAqIHwgaTM4Ni0qLWdvMzIqIHwgaTM4Ni1nbzMyLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiBlbT1nbzMyOzsKLSAgICAgIGkzODYtKi1ydGVtc2VsZiopICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGkzODYtKi1nbnUqKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotbWFjaCopCi0JCQkgICAgZm10PWFvdXQgZW09bWFjaCBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1zZG9zKikgICAgICAgIGZtdD1hb3V0IDs7Ci0gICAgICBpMzg2LSotbW9zcyopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBpMzg2LSotcGUpICAgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGkzODYtKi1jeWd3aW4qKSAgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLW1pbmd3MzIqKSAgICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotKm50KikgICAgICAgICAgZm10PWNvZmYgZW09cGUgOzsKLSAgICAgIGk5NjAtKi1ib3V0KSAgICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWNvZmYpICAgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotcnRlbXMqKSAgICAgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi1uaW5keSopICAgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M0KikgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuMCkgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNS4qKSAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3MqKSAgICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLQotICAgICAgbTMyci0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBtNjhrLSotdnh3b3JrcyogfCBtNjhrLWVyaWNzc29uLW9zZSB8IG02OGstKi1zdW5vcyopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgbTY4ay1tb3Rvcm9sYS1zeXN2KikgIGZtdD1jb2ZmIGVtPWRlbHRhIDs7Ci0gICAgICBtNjhrLWJ1bGwtc3lzdjMqKSAgICAgZm10PWNvZmYgZW09ZHB4MiA7OwotICAgICAgbTY4ay1hcG9sbG8tKikgICAgICAgIGZtdD1jb2ZmIGVtPWFwb2xsbyA7OwotICAgICAgbTY4ay0qLXN5c3Y0KikgIyBtdXN0IGJlIGJlZm9yZSAtc3lzdioKLQkJCSAgICBmbXQ9ZWxmIGVtPXN2cjQgOzsKLSAgICAgIG02OGstKi1lbGYqKQkgICAgZm10PWVsZiA7OwotICAgICAgbTY4ay0qLWNvZmYgfCBtNjhrLSotc3lzdiogfCBtNjhrLSotcnRlbXMqKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBtNjhrLSotaHB1eCopICAgICAgICAgZm10PWhwMzAwIGVtPWhwMzAwIDs7Ci0gICAgICBtNjhrLSotbGludXgqYW91dCopICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIG02OGstKi1saW51eC1nbnUqKSAgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotZ251KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBtNjhrLSotbmV0YnNkKikgICAgICAgZm10PWFvdXQgZW09bmJzZCBiZmRfZ2FzPXllcyA7OwotICAgICAgbTY4ay0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstYXBwbGUtYXV4KikgICAgICBmbXQ9Y29mZiBlbT1hdXggOzsKLSAgICAgIG02OGstKi1wc29zKikgICAgICAgICBmbXQ9ZWxmIGVtPXBzb3M7OwotCi0gICAgICBtODhrLW1vdG9yb2xhLXN5c3YzKikgZm10PWNvZmYgZW09ZGVsdDg4IDs7Ci0gICAgICBtODhrLSotY29mZiopICAgICAgICAgZm10PWNvZmYgOzsKLQotICAgICAgbWNvcmUtKi1lbGYpCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtY29yZS0qLXBlKQkgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgIyBkb24ndCBjaGFuZ2UgZW0gbGlrZSAqLSotYnNkIGRvZXMKLSAgICAgIG1pcHMtZGVjLW5ldGJzZCopCSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLW9wZW5ic2QqKSAgICBmbXQ9ZWxmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtZGVjLWJzZCopICAgICAgICBmbXQ9YW91dCBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLXNvbnktYnNkKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotYnNkKikgICAgICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbmtub3duIHZlbmRvciBmb3IgbWlwcy1ic2QgY29uZmlndXJhdGlvbi4iIDE+JjI7IGV4aXQgMTsgfSA7OwotICAgICAgbWlwcy0qLXVsdHJpeCopICAgICAgIGZtdD1lY29mZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLSotb3NmKikgICAgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1lY29mZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1lY29mZiopICAgICAgICBmbXQ9ZWNvZmYgOzsKLSAgICAgIG1pcHMtKi1pcml4NiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotaXJpeDUqKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgbWlwcy0qLWlyaXgqKSAgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWxuZXdzKikgICAgICAgIGZtdD1lY29mZiBlbT1sbmV3cyA7OwotICAgICAgbWlwcy0qLXJpc2NvcyopICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLXN5c3YqKSAgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVsZiogfCBtaXBzLSotcnRlbXMqIHwgbWlwcy0qLWxpbnV4LWdudSogfCBtaXBzLSotZ251KiB8IG1pcHMtKi1vcGVuYnNkKikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotdnh3b3JrcyopICAgICAgZm10PWVsZgotCQkJICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNSVBTX1NUQUJTX0VMRiAxCi1FT0YKLQotCQkJICAgIDs7Ci0gICAgICBtbjEwMjAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG1uMTAzMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgcHBjLSotcGUgfCBwcGMtKi1jeWd3aW4qIHwgcHBjLSotd2lubnQqKQotCQkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgcHBjLSotYWl4KikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBwcGMtKi1iZW9zKikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLSpic2QqIHwgcHBjLSotZWxmKiB8IHBwYy0qLWVhYmkqIHwgcHBjLSotc3lzdjQqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLWxpbnV4LWdudSopCSAgICBmbXQ9ZWxmCi0JCQkgICAgY2FzZSAiJGVuZGlhbiIgaW4KLQkJCSAgICBiaWcpICA7OwotCQkJICAgICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR05VL0xpbnV4IG11c3QgYmUgY29uZmlndXJlZCBiaWcgZW5kaWFuIiAxPiYyOyBleGl0IDE7IH0gOzsKLQkJCSAgICBlc2FjCi0JCQkgICAgOzsKLSAgICAgIHBwYy0qLXNvbGFyaXMqKQkgICAgZm10PWVsZgotCQkJICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0OyB0aGVuCi0JCQkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFRBUkdFVF9TT0xBUklTX0NPTU1FTlQgMQotRU9GCi0KLQkJCSAgICBmaQotCQkJICAgIGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhiaWc7IHRoZW4KLQkJCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFNvbGFyaXMgbXVzdCBiZSBjb25maWd1cmVkIGxpdHRsZSBlbmRpYW4iIDE+JjI7IGV4aXQgMTsgfQotCQkJICAgIGZpCi0JCQkgICAgOzsKLSAgICAgIHBwYy0qLXJ0ZW1zKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLW1hY29zKiB8IHBwYy0qLW1wdyopCi0JCQkgICAgZm10PWNvZmYgZW09bWFjb3MgOzsKLSAgICAgIHBwYy0qLW5ldHdhcmUqKSAgICAgICBmbXQ9ZWxmIGVtPXBwY253IDs7Ci0gICAgICBwcGMtKi12eHdvcmtzKikgICAgICAgZm10PWVsZiA7OwotCi0gICAgICBzaC0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLWNvZmYqKSAgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHNoLSotcnRlbXNlbGYqKSAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzaC0qLXJ0ZW1zKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG5zMzJrLXBjNTMyLW1hY2gqIHwgbnMzMmstcGM1MzItdXgqKSAgICBmbXQ9YW91dCBlbT1wYzUzMm1hY2ggOzsKLSAgICAgIG5zMzJrLXBjNTMyLW5ldGJzZCogfCBuczMyay1wYzUzMi1saXRlcyopICBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0gICAgICBuczMyay1wYzUzMi1vcGVuYnNkKikgZm10PWFvdXQgZW09bmJzZDUzMiA7OwotCi0gICAgICBzcGFyYy0qLXJ0ZW1zKikgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIHNwYXJjLSotc3Vub3M0KikgICAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICBzcGFyYy0qLWFvdXQgfCBzcGFyYyotKi12eHdvcmtzKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zcGFyY2FvdXQgOzsKLSAgICAgIHNwYXJjLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3BhcmMtKi1saW51eCphb3V0KikgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4LWdudSopICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgc3BhcmMtKi1seW54b3MqKSAgICAgIGZtdD1jb2ZmIGVtPWx5bnggOzsKLSAgICAgIHNwYXJjLWZ1aml0c3Utbm9uZSkgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1lbGYgfCBzcGFyYy0qLXN5c3Y0KiB8IHNwYXJjLSotc29sYXJpcyopCi0JCQkgICAgZm10PWVsZiA7OwotICAgICAgc3BhcmMtKi1uZXRic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLSAgICAgIHNwYXJjLSotb3BlbmJzZCopICAgICBmbXQ9YW91dCBlbT1uYnNkIDs7Ci0KLSAgICAgIHN0cm9uZ2FybS0qLWNvZmYpICAgICBmbXQ9Y29mZiA7OwotICAgICAgc3Ryb25nYXJtLSotZWxmKSAgICAgIGZtdD1lbGYgOzsKLQotICAgICAgdGljMzAtKi0qYW91dCopCSAgICBmbXQ9YW91dCBiZmRfZ2FzPXllcyA7OwotICAgICAgdGljMzAtKi0qY29mZiopICAgICAgIGZtdD1jb2ZmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWM4MC0qLSopCSAgICBmbXQ9Y29mZiA7OwotCi0gICAgICB2ODUwLSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICB2ODUwZWEtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICB2YXgtKi1ic2QqIHwgdmF4LSotdWx0cml4KikKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgdmF4LSotdm1zKSAgICAgICAgICAgIGZtdD12bXMgOzsKLQotCi0gICAgICB6OGstKi1jb2ZmIHwgejhrLSotc2ltKQotCQkJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHc2NS0qLSopICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICAqLSotYW91dCB8ICotKi1zY291dCkKLQkJCSAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5pbmR5KikKLQkJCSAgICBmbXQ9Ym91dCA7OwotICAgICAgKi0qLWJzZCopCi0JCQkgICAgZm10PWFvdXQgZW09c3VuMyA7OwotICAgICAgKi0qLWdlbmVyaWMpICAgICAgICAgIGZtdD1nZW5lcmljIDs7Ci0gICAgICAqLSoteHJheSB8ICotKi1obXMpICAgZm10PWNvZmYgOzsKLSAgICAgICotKi1zaW0pICAgICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLWVsZiB8ICotKi1zeXN2NCogfCAqLSotc29sYXJpcyopCi0JCQkgICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBHQVMgc3VwcG9ydCBmb3IgJHtnZW5lcmljX3RhcmdldH0gaXMgaW5jb21wbGV0ZS4iIDE+JjIKLQkJCSAgICBmbXQ9ZWxmIGRldj15ZXMgOzsKLSAgICAgICotKi12eHdvcmtzKSAgICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgKi0qLW5ldHdhcmUpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIGVuZGlhbl9kZWY9Ci0gICAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JZW5kaWFuX2RlZj0xCi0gICAgICBlbGlmIHRlc3QgeCR7ZW5kaWFufSA9IHhsaXR0bGU7IHRoZW4KLQllbmRpYW5fZGVmPTAKLSAgICAgIGZpCi0gICAgICBpZiB0ZXN0IHgke2VuZGlhbl9kZWZ9ICE9IHg7IHRoZW4KLQljYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQllURVNfQklHX0VORElBTiAkZW5kaWFuX2RlZgotRU9GCi0KLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGNhc2UgJHtjcHVfdHlwZX0tJHtmbXR9IGluCi0gICAgICBhbHBoYSotKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIGFybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICMgbm90IHlldAotICAgICMgaTM4Ni1hb3V0KQliZmRfZ2FzPXByZWZlcnJlZCA7OwotICAgICAgbWlwcy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgbnMzMmstKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHBwYy0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgc3BhcmMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHN0cm9uZ2FybS0qKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lbGYpCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqLWVjb2ZmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1zb20pCWJmZF9nYXM9eWVzIDs7Ci0gICAgICAqKQkJOzsKLSAgICBlc2FjCi0KLSMgT3RoZXIgcmFuZG9tIHN0dWZmLgotCi0gICAgIyBEbyB3ZSBuZWVkIHRoZSBvcGNvZGVzIGxpYnJhcnk/Ci0gICAgY2FzZSAke2NwdV90eXBlfSBpbgotICAgICAgdmF4IHwgaTM4NiB8IHRpYzMwKQotCTs7Ci0KLSAgICAgICopCi0JbmVlZF9vcGNvZGVzPXllcwotCi0JY2FzZSAiJHtlbmFibGVfc2hhcmVkfSIgaW4KLQl5ZXMpIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqb3Bjb2RlcyopIHNoYXJlZF9vcGNvZGVzPXRydWUgOzsKLQkqKSBzaGFyZWRfb3Bjb2Rlcz1mYWxzZSA7OwotCWVzYWMKLQlpZiB0ZXN0ICIke3NoYXJlZF9vcGNvZGVzfSIgPSAidHJ1ZSI7IHRoZW4KLQkgICMgQSBzaGFyZWQgbGlib3Bjb2RlcyBtdXN0IGJlIGxpbmtlZCBhZ2FpbnN0IGxpYmJmZC4KLQkgIG5lZWRfYmZkPXllcwotCWZpCi0JOzsKLSAgICBlc2FjCi0KLSAgICAjIEFueSBvdGhlciBzcGVjaWFsIG9iamVjdCBmaWxlcyBuZWVkZWQgPwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIGZyMzAgfCBtMzJyKQotCXVzaW5nX2NnZW49eWVzCi0JOzsKLQotICAgICAgbTY4aykKLQljYXNlICR7ZXh0cmFfb2JqZWN0c30gaW4KLQkqbTY4ay1wYXJzZS5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBtNjhrLXBhcnNlLm8iIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIG1pcHMpCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1wYXJzZS5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1wYXJzZS5vIgotCWZpCi0KLQllY2hvICR7ZXh0cmFfb2JqZWN0c30gfCBncmVwIC1zICJpdGJsLWxleC5vIiAKLQlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgotCSAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgaXRibC1sZXgubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1vcHMubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0Ymwtb3BzLm8iCi0JZmkKLQk7OwotCi0gICAgICBzcGFyYykKLQlpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0JICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBERUZBVUxUX0FSQ0ggIiR7YXJjaH0iCi1FT0YKLQotCWZpCi0JOzsKLSAgICAgICopCi0JOzsKLSAgICBlc2FjCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCWNhc2UgIngke2V4dHJhX29iamVjdHN9IiBpbgotCSpjZ2VuLm8qKSA7OwotCSopIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGNnZW4ubyIgOzsKLQllc2FjCi0gICAgZmkKLQotIyBTZWUgaWYgd2UgcmVhbGx5IGNhbiBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbiB3aXRoIHRoZSBlbXVsYXRpb24gY29kZS4KLQotICAgIGlmIHRlc3QgJHRoaXNfdGFyZ2V0ID0gJHRhcmdldCA7IHRoZW4KLSAgICAgIHByaW1hcnlfYmZkX2dhcz0kYmZkX2dhcwotICAgICAgb2JqX2Zvcm1hdD0kZm10Ci0gICAgICB0ZV9maWxlPSRlbQotCi0gICAgICBpZiB0ZXN0ICRiZmRfZ2FzID0gbm8gOyB0aGVuCi0JIyBDYW4ndCBzdXBwb3J0IG90aGVyIGNvbmZpZ3VyYXRpb25zIHRoaXMgd2F5LgotCWJyZWFrCi0gICAgICBmaQotICAgIGVsaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotICAgICAgIyBDYW4ndCBzdXBwb3J0IHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICAgIGJyZWFrCi0gICAgZmkKLQotIyBGcm9tIHRhcmdldCBuYW1lIGFuZCBmb3JtYXQsIHByb2R1Y2UgYSBsaXN0IG9mIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0gICAgY2FzZSAke2dlbmVyaWNfdGFyZ2V0fS0ke2ZtdH0gaW4KLSAgICAgIG1pcHMtKi1pcml4NSotKikJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0gICAgICBtaXBzLSotbGludXgtZ251Ki0qKSBjYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYgbWlwc2JlY29mZiBtaXBzbGVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiBtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLWxuZXdzKi1lY29mZikgOzsKLSAgICAgIG1pcHMtKi0qLWVjb2ZmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWNvZmYgbWlwc2JlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgICBtaXBzLSotKi1lbGYpCWNhc2UgIiRlbmRpYW4iIGluCi0JCQliaWcpCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiIgOzsKLQkJCSopCWVtdWxhdGlvbj0ibWlwc2xlbGYgbWlwc2JlbGYgbWlwc2VsZiIgOzsKLSAgICAgICMgVW5jb21tZW50aW5nIHRoZSBuZXh0IGxpbmUgd2lsbCB0dXJuIG9uIHN1cHBvcnQgZm9yIGkzODYgQ09GRgotICAgICAgIyBpbiBhbnkgaTM4NiBFTEYgY29uZmlndXJhdGlvbi4gIFRoaXMgcHJvYmFibHkgZG9lc24ndCB3b3JrCi0gICAgICAjIGNvcnJlY3RseS4KLSAgICAgICMgaTM4Ni0qLSotZWxmKQllbXVsYXRpb249ImkzODZjb2ZmIGkzODZlbGYiIDs7Ci0JCQllc2FjIDs7Ci0gICAgZXNhYwotCi0gICAgZW11bGF0aW9ucz0iJGVtdWxhdGlvbnMgJGVtdWxhdGlvbiIKLQotZG9uZQotCi0jIEFzc2lnbiBmbG9hdGluZyBwb2ludCB0eXBlLiAgTW9zdCBwcm9jZXNzb3JzIHdpdGggRlAgc3VwcG9ydAotIyBJRUVFIEZQLiAgT24gdGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IEZQIGF0IGFsbCwgdXN1YWxseSBJRUVFCi0jIGlzIGVtdWxhdGVkLgotY2FzZSAke3RhcmdldF9jcHV9IGluCi0gIHZheCB8IHRhaG9lICkJYXRvZj0ke3RhcmdldF9jcHV9IDs7Ci0gICopCQlhdG9mPWllZWUgOzsKLWVzYWMKLQotY2FzZSAiJHtvYmpfZm9ybWF0fSIgaW4KLSAgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IGtub3cgd2hhdCBmb3JtYXQgdG8gdXNlIGZvciB0YXJnZXQgJHt0YXJnZXR9IiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotIyBVbmZvcnR1bmF0ZWx5IHRoZSBjcHUgaW4gY3B1LW9wYy5oIGZpbGUgaXNuJ3QgYWx3YXlzICQoVEFSR0VUX0NQVSkuCi1jZ2VuX2NwdV9wcmVmaXg9IiIKLWlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0gIGNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICAgICopIGNnZW5fY3B1X3ByZWZpeD0ke3RhcmdldF9jcHV9IDs7Ci0gIGVzYWMKLSAgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBVU0lOR19DR0VOIDEKLUVPRgotCi1maQotCi0KLWlmIHRlc3QgISAtciAke3NyY2Rpcn0vY29uZmlnL3RjLSR7dGFyZ2V0X2NwdV90eXBlfS5jOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogR0FTIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0IENQVSAke3RhcmdldF9jcHVfdHlwZX0iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotaWYgdGVzdCAhIC1yICR7c3JjZGlyfS9jb25maWcvb2JqLSR7b2JqX2Zvcm1hdH0uYzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBoYXZlIHN1cHBvcnQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdCAke29ial9mb3JtYXR9IiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWNhc2UgJHt1c2VyX2JmZF9nYXN9LSR7cHJpbWFyeV9iZmRfZ2FzfSBpbgotICB5ZXMteWVzIHwgbm8tbm8pCi0gICAgIyBXZSBkaWRuJ3Qgb3ZlcnJpZGUgdXNlcidzIGNob2ljZS4KLSAgICA7OwotICBuby15ZXMpCi0gICAgZWNobyAiY29uZmlndXJlOiB3YXJuaW5nOiBVc2Ugb2YgQkZEIGlzIHJlcXVpcmVkIGZvciAke3RhcmdldH07IG92ZXJyaWRpbmcgY29uZmlnIG9wdGlvbnMuIiAxPiYyCi0gICAgOzsKLSAgbm8tcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz1ubwotICAgIDs7Ci0gICotcHJlZmVycmVkKQotICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKLSAgICA7OwotICB5ZXMtKikKLSAgICBwcmltYXJ5X2JmZF9nYXM9eWVzCi0gICAgOzsKLSAgLSopCi0gICAgIyBVc2VyIHNwZWNpZmllZCBub3RoaW5nLgotICAgIDs7Ci1lc2FjCi0KLSMgU29tZSBDT0ZGIGNvbmZpZ3VyYXRpb25zIHdhbnQgdGhlc2UgcmFuZG9tIG90aGVyIGZsYWdzIHNldC4KLWNhc2UgJHtvYmpfZm9ybWF0fSBpbgotICBjb2ZmKQotICAgIGNhc2UgJHt0YXJnZXRfY3B1X3R5cGV9IGluCi0gICAgICBpMzg2KSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSTM4NkNPRkYgMQotRU9GCi0gOzsKLSAgICAgIG02OGspIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNNjhLQ09GRiAxCi1FT0YKLSA7OwotICAgICAgbTg4aykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE04OEtDT0ZGIDEKLUVPRgotIDs7Ci0gICAgZXNhYwotICAgIDs7Ci1lc2FjCi0KLSMgR2V0dGluZyB0aGlzIGRvbmUgcmlnaHQgaXMgZ29pbmcgdG8gYmUgYSBiaXRjaC4gIEVhY2ggY29uZmlndXJhdGlvbiBzcGVjaWZpZWQKLSMgd2l0aCAtLWVuYWJsZS10YXJnZXRzPS4uLiBzaG91bGQgYmUgY2hlY2tlZCBmb3IgZW52aXJvbm1lbnQsIGZvcm1hdCwgY3B1LCBhbmQKLSMgYmZkX2dhcyBzZXR0aW5nLgotIwotIyBGb3IgZWFjaCBjb25maWd1cmF0aW9uLCB0aGUgbmVjZXNzYXJ5IG9iamVjdCBmaWxlIHN1cHBvcnQgY29kZSBtdXN0IGJlIGxpbmtlZAotIyBpbi4gIFRoaXMgbWlnaHQgYmUgb25seSBvbmUsIGl0IG1pZ2h0IGJlIHVwIHRvIGZvdXIuICBUaGUgbmVjZXNzYXJ5IGVtdWxhdGlvbgotIyBjb2RlIG5lZWRzIHRvIGJlIHByb3ZpZGVkLCB0b28uCi0jCi0jIEFuZCB0aGVuIHRoZXJlJ3MgIi0tZW5hYmxlLXRhcmdldHM9YWxsIi4uLi4KLSMKLSMgRm9yIG5vdywganVzdCBhbHdheXMgZG8gaXQgZm9yIE1JUFMgRUxGIG9yIEVDT0ZGIGNvbmZpZ3VyYXRpb25zLiAgU2lnaC4KLQotZm9ybWF0cz0iJHtvYmpfZm9ybWF0fSIKLWVtZmlsZXM9IiIKLUVNVUxBVElPTlM9IiIKLV9nYXNfdW5pcV9saXN0PSIkZW11bGF0aW9ucyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWVtdWxhdGlvbnM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWZvciBlbSBpbiAuICRlbXVsYXRpb25zIDsgZG8KLSAgY2FzZSAkZW0gaW4KLSAgICAuKQljb250aW51ZSA7OwotICAgIG1pcHNiZWxmIHwgbWlwc2xlbGYpCi0JZm10PWVsZiAgIGZpbGU9bWlwc2VsZiA7OwotICAgIG1pcHNiZWNvZmYgfCBtaXBzbGVjb2ZmKQotCWZtdD1lY29mZiBmaWxlPW1pcHNlY29mZiA7OwotICAgIGkzODZjb2ZmKQotCWZtdD1jb2ZmICBmaWxlPWkzODZjb2ZmIDs7Ci0gICAgaTM4NmVsZikKLQlmbXQ9ZWxmICAgZmlsZT1pMzg2ZWxmIDs7Ci0gIGVzYWMKLSAgZm9ybWF0cz0iJGZvcm1hdHMgJGZtdCIKLSAgZW1maWxlcz0iJGVtZmlsZXMgZS0kZmlsZS5vIgotICBFTVVMQVRJT05TPSIkRU1VTEFUSU9OUyAmJGVtLCIKLWRvbmUKLV9nYXNfdW5pcV9saXN0PSIkZm9ybWF0cyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWZvcm1hdHM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLV9nYXNfdW5pcV9saXN0PSIkZW1maWxlcyIKLV9nYXNfdW5pcV9uZXdsaXN0PSIiCi1mb3IgX2dhc191bmlxX2kgaW4gX2dhc191bmlxX2R1bW15ICRfZ2FzX3VuaXFfbGlzdCA7IGRvCi0gIGNhc2UgJF9nYXNfdW5pcV9pIGluCi0gIF9nYXNfdW5pcV9kdW1teSkgOzsKLSAgKikgY2FzZSAiICRfZ2FzX3VuaXFfbmV3bGlzdCAiIGluCi0gICAgICAgKiIgJF9nYXNfdW5pcV9pICIqKSA7OwotICAgICAgICopIF9nYXNfdW5pcV9uZXdsaXN0PSIkX2dhc191bmlxX25ld2xpc3QgJF9nYXNfdW5pcV9pIiA7OwotICAgICBlc2FjIDs7Ci0gIGVzYWMKLWRvbmUKLWVtZmlsZXM9JF9nYXNfdW5pcV9uZXdsaXN0Ci0KLWlmIHRlc3QgYHNldCAuICRmb3JtYXRzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMSA7IHRoZW4KLSAgZm9yIGZtdCBpbiAkZm9ybWF0cyA7IGRvCi0gICAgY2FzZSAkZm10IGluCi0gICAgICBhb3V0KQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0FPVVQgMQotRU9GCi0gICA7OwotICAgICAgYm91dCkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9CT1VUIDEKLUVPRgotICAgOzsKLSAgICAgIGNvZmYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfQ09GRiAxCi1FT0YKLSAgICA7OwotICAgICAgZWNvZmYpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfRUNPRkYgMQotRU9GCi0gICA7OwotICAgICAgZWxmKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX0VMRiAxCi1FT0YKLSAgICAgOzsKLSAgICAgIGdlbmVyaWMpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfR0VORVJJQyAxCi1FT0YKLSA7OwotICAgICAgaHAzMDApCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfSFAzMDAgMQotRU9GCi0gICA7OwotICAgICAgaWVlZSkJY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE9CSl9NQVlCRV9JRUVFIDEKLUVPRgotICAgIDs7Ci0gICAgICBzb20pCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBPQkpfTUFZQkVfU09NIDEKLUVPRgotICAgICA7OwotICAgICAgdm1zKQljYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgT0JKX01BWUJFX1ZNUyAxCi1FT0YKLSAgICAgOzsKLSAgICBlc2FjCi0gICAgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgb2JqLSRmbXQubyIKLSAgZG9uZQotICBvYmpfZm9ybWF0PW11bHRpCi1maQotaWYgdGVzdCBgc2V0IC4gJGVtZmlsZXMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAwIDsgdGhlbgotICB0ZV9maWxlPW11bHRpCi0gIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzICRlbWZpbGVzIgotICBERUZBVUxUX0VNVUxBVElPTj1gc2V0IC4gJGVtdWxhdGlvbnMgOyBlY2hvICQyYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNFX0VNVUxBVElPTlMgMQotRU9GCi0KLWZpCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIEVNVUxBVElPTlMgJEVNVUxBVElPTlMKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBERUZBVUxUX0VNVUxBVElPTiAiJERFRkFVTFRfRU1VTEFUSU9OIgotRU9GCi0KLQotY2FzZSAke3ByaW1hcnlfYmZkX2dhc30tJHt0YXJnZXRfY3B1X3R5cGV9LSR7b2JqX2Zvcm1hdH0gaW4KLSAgeWVzLSotY29mZikJbmVlZF9iZmQ9eWVzIDs7Ci0gIG5vLSotY29mZikJbmVlZF9iZmQ9eWVzCi0JCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBNQU5ZX1NFR01FTlRTIDEKLUVPRgotIDs7Ci1lc2FjCi0KLXJlamVjdF9kZXZfY29uZmlncz15ZXMKLQotY2FzZSAke3JlamVjdF9kZXZfY29uZmlnc30tJHtkZXZ9IGluCi0gIHllcy15ZXMpICMgT29wcy4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAke2dlbmVyaWNfdGFyZ2V0fSBjb25maWd1cmF0aW9uLiIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLWVzYWMKLQotCi0KLQotCi0KLQotY2FzZSAiJHtwcmltYXJ5X2JmZF9nYXN9IiBpbgotICB5ZXMpCWNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBCRkRfQVNTRU1CTEVSIDEKLUVPRgotCi0JbmVlZF9iZmQ9eWVzIDs7Ci1lc2FjCi0KLSMgZG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PwotY2FzZSAiJHtuZWVkX29wY29kZXN9IiBpbgoteWVzKQotICBPUENPREVTX0xJQj0uLi9vcGNvZGVzL2xpYm9wY29kZXMubGEKLSAgOzsKLWVzYWMKLQotY2FzZSAiJHtuZWVkX2JmZH0iIGluCi15ZXMpCi0gIEJGRExJQj0uLi9iZmQvbGliYmZkLmxhCi0gIEFMTF9PQkpfREVQUz0iJEFMTF9PQkpfREVQUyAuLi9iZmQvYmZkLmgiCi0gIDs7Ci1lc2FjCi0KLQotCi0KLQotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQUxJQVMgIiR7dGFyZ2V0X2FsaWFzfSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfQ0FOT05JQ0FMICIke3RhcmdldH0iCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVEFSR0VUX0NQVSAiJHt0YXJnZXRfY3B1fSIKLUVPRgotCi1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBUQVJHRVRfVkVORE9SICIke3RhcmdldF92ZW5kb3J9IgotRU9GCi0KLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFRBUkdFVF9PUyAiJHt0YXJnZXRfb3N9IgotRU9GCi0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzA1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc1NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjc4ODogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjc5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4MDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjgzMDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4MzU6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NDQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg2MzogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1mb3IgYWNfcHJvZyBpbiAnYmlzb24gLXknIGJ5YWNjCi1kbwotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkwMDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1lBQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ZQUNDPSIkWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfWUFDQz0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLVlBQ0M9IiRhY19jdl9wcm9nX1lBQ0MiCi1pZiB0ZXN0IC1uICIkWUFDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRZQUNDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotdGVzdCAtbiAiJFlBQ0MiICYmIGJyZWFrCi1kb25lCi10ZXN0IC1uICIkWUFDQyIgfHwgWUFDQz0ieWFjYyIKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5MzE6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk1MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk2MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk2OTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjk4MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjk4NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZm9yIGFjX3Byb2cgaW4gZmxleCBsZXgKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDE2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkTEVYIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJExFWCIgfHwgTEVYPSIiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZmxleCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZmxleDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDQ5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iZmxleCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfTEVYIiAmJiBhY19jdl9wcm9nX0xFWD0ibGV4IgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJExFWExJQiIKLXRoZW4KLSAgY2FzZSAiJExFWCIgaW4KLSAgZmxleCopIGFjX2xpYj1mbCA7OwotICAqKSBhY19saWI9bCA7OwotICBlc2FjCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDgzOiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1Ci1hY19saWJfdmFyPWBlY2hvICRhY19saWInXyd5eXdyYXAgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDkxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgeXl3cmFwKCk7Ci0KLWludCBtYWluKCkgewoteXl3cmFwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMRVhMSUI9Ii1sJGFjX2xpYiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEyNTogY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3Jvb3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZSBtaW5pbWFsIGxleCBwcm9ncmFtIGlzIGp1c3QgYSBzaW5nbGUgbGluZTogJSUuICBCdXQgc29tZSBicm9rZW4gbGV4ZXMKLSMgKFNvbGFyaXMsIEkgdGhpbmsgaXQgd2FzKSB3YW50IHR3byAlJSBsaW5lcywgc28gYWNjb21tb2RhdGUgdGhlbS4KLWVjaG8gJyUlCi0lJScgfCAkTEVYCi1pZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4Lnl5Ci1lbGlmIHRlc3QgLWYgbGV4eXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5Ci1lbHNlCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGZpbmQgb3V0cHV0IGZyb20gJExFWDsgZ2l2aW5nIHVwIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3Jvb3QiIDE+JjYKLUxFWF9PVVRQVVRfUk9PVD0kYWNfY3ZfcHJvZ19sZXhfcm9vdAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMxNDY6IGNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFBPU0lYIHNheXMgbGV4IGNhbiBkZWNsYXJlIHl5dGV4dCBlaXRoZXIgYXMgYSBwb2ludGVyIG9yIGFuIGFycmF5OyB0aGUKLSMgZGVmYXVsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIEZpZ3VyZSBvdXQgd2hpY2ggaXQgaXMsIHNpbmNlCi0jIG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgdGhlICVwb2ludGVyIGFuZCAlYXJyYXkgZGVjbGFyYXRpb25zLgotYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KLWVjaG8gJ2V4dGVybiBjaGFyICp5eXRleHQ7JyA+PiRMRVhfT1VUUFVUX1JPT1QuYwotYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9IiRMSUJTICRMRVhMSUIiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWBjYXQgJExFWF9PVVRQVVRfUk9PVC5jYAotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotcm0gLWYgIiR7TEVYX09VVFBVVF9ST09UfS5jIgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgWVlURVhUX1BPSU5URVIgMQotRU9GCi0KLWZpCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE4OTogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzIxMDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzIyMzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjQwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI3OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjkwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMTQ6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzMxOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzY4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzODk6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzM5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM0MDM6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDI5OiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNDM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NjI6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ2NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ5NzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MDIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUwOTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MzA6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUzNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTYzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU5NTogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjI1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjMwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2NTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY4MDogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM2ODggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzcwNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzMyOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzczNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mzc0MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzcxOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNzc2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3OTk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4MjQ6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM4MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5NzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDAwOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDAwNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDAxMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwNDA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwNDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDA2ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA5NzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDEwMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTI1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNTk6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDE2NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQxNzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTkyOiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyMTI6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDIzMTogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDIzNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjQxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI1ODogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjYzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyODY6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0Mjk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMwNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDMyMTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MzI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDMzMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzNjE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQzOTU6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ0MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDQyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQ1MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ0ODY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDUxOCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDUyNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1NTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTkyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDYyODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDcxODogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDc0NjogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDc1MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NzU2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ4MTk6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODQyOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0ODQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODU4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0ODc1OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ4ODAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0ODg3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5MDY6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ5MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLWZvciBhY19oZHIgaW4gc3RyaW5nLmggc3RkbGliLmggbWVtb3J5Lmggc3RyaW5ncy5oIHVuaXN0ZC5oIHN0ZGFyZy5oIHZhcmFyZ3MuaCBlcnJuby5oIHN5cy90eXBlcy5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDk0MTogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ5NDYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjQ5NTE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSMgUHV0IHRoaXMgaGVyZSBzbyB0aGF0IGF1dG9jb25mJ3MgImNyb3NzLWNvbXBpbGluZyIgbWVzc2FnZSBkb2Vzbid0IGNvbmZ1c2UKLSMgcGVvcGxlIHdobyBhcmUgbm90IGNyb3NzLWNvbXBpbGluZyBidXQgYXJlIGNvbXBpbGluZyBjcm9zcy1hc3NlbWJsZXJzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBjb21waWxpbmcgYSBjcm9zcy1hc3NlbWJsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ5ODE6IGNoZWNraW5nIHdoZXRoZXIgY29tcGlsaW5nIGEgY3Jvc3MtYXNzZW1ibGVyIiA+JjUKLWlmIHRlc3QgIiR7aG9zdH0iID0gIiR7dGFyZ2V0fSI7IHRoZW4KLSAgY3Jvc3NfZ2FzPW5vCi1lbHNlCi0gIGNyb3NzX2dhcz15ZXMKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENST1NTX0NPTVBJTEUgMQotRU9GCi0KLWZpCi1lY2hvICIkYWNfdCIiJGNyb3NzX2dhcyIgMT4mNgotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0OTk2OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTAwMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MDA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTAyOTogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MDM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUwNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MDk0OiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTA5OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUxMjQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUxMjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTE1MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MTc5OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTE4NyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1MjA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTIyODogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTI0MjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi0KLSMgVk1TIGRvZXNuJ3QgaGF2ZSB1bmxpbmsuCi1mb3IgYWNfZnVuYyBpbiB1bmxpbmsgcmVtb3ZlCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1MjcyOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1Mjc3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjUzMDA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0jIFNvbWUgc3lzdGVtcyBkb24ndCBoYXZlIHNicmsoKS4KLWZvciBhY19mdW5jIGluIHNicmsKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUzMjk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzMzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTM1NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0jIFNvbWUgbm9uLUFOU0kgcHJlcHJvY2Vzc29ycyBib3RjaCByZXF1b3RpbmcgaW5zaWRlIHN0cmluZ3MuICBUaGF0J3MgYmFkCi0jIGVub3VnaCwgYnV0IG9uIHNvbWUgb2YgdGhvc2Ugc3lzdGVtcywgdGhlIGFzc2VydCBtYWNybyByZWxpZXMgb24gcmVxdW90aW5nCi0jIHdvcmtpbmcgcHJvcGVybHkhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhc3NlcnQgbWFjcm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjUzODY6IGNoZWNraW5nIGZvciB3b3JraW5nIGFzc2VydCBtYWNybyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2Fzc2VydF9vaycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDUzOTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci1pbnQgbWFpbigpIHsKLQotLyogY2hlY2sgZm9yIHJlcXVvdGluZyBwcm9ibGVtcyAqLwotc3RhdGljIGludCBhLCBiLCBjLCBkOwotc3RhdGljIGNoYXIgKnM7Ci1hc3NlcnQgKCFzdHJjbXAocywgImZvbyBiYXIgYmF6IHF1dXgiKSk7Ci0vKiBjaGVjayBmb3IgbmV3bGluZSBoYW5kbGluZyAqLwotYXNzZXJ0IChhID09IGIKLSAgICAgICAgfHwgYyA9PSBkKTsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU0MDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9hc3NlcnRfb2s9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9hc3NlcnRfb2s9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9hc3NlcnRfb2siIDE+JjYKLXRlc3QgJGdhc19jdl9hc3NlcnRfb2sgPSB5ZXMgfHwgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEJST0tFTl9BU1NFUlQgMQotRU9GCi0KLQotCi0jIE9uIHNvbWUgc3lzdGVtcywgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMgbWF5IG5vdCBkZWNsYXJlIG1hbGxvYywgcmVhbGxvYywKLSMgYW5kIGZyZWUuICBUaGVyZSBhcmUgcGxhY2VzIHdoZXJlIGdhcyBuZWVkcyB0aGVzZSBmdW5jdGlvbnMgdG8gaGF2ZSBiZWVuCi0jIGRlY2xhcmVkIC0tIHN1Y2ggYXMgd2hlbiB0YWtpbmcgdGhlaXIgYWRkcmVzc2VzLgotZ2FzX3Rlc3RfaGVhZGVycz0iCi0jaWZkZWYgSEFWRV9NRU1PUllfSAotI2luY2x1ZGUgPG1lbW9yeS5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0iCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIHN0cnN0ciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQ0ODogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3Igc3Ryc3RyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTQ1MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0kZ2FzX3Rlc3RfaGVhZGVycwotaW50IG1haW4oKSB7Ci0KLXR5cGVkZWYgY2hhciAqKCpmKSgpOwotZiB4OwoteCA9IChmKSBzdHJzdHI7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NDY0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9zdHJzdHI9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fU1RSU1RSIDEKLUVPRgotCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIG1hbGxvYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTQ4NTogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgbWFsbG9jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTQ5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0kZ2FzX3Rlc3RfaGVhZGVycwotaW50IG1haW4oKSB7Ci0KLXR5cGVkZWYgY2hhciAqKCpmKSgpOwotZiB4OwoteCA9IChmKSBtYWxsb2M7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTAxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9tYWxsb2M9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotZWNobyAiJGFjX3QiIiRnYXNfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfbWFsbG9jID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fTUFMTE9DIDEKLUVPRgotCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGZyZWUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU1MjI6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGZyZWUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2dhc19jdl9kZWNsX25lZWRlZF9mcmVlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTUyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0kZ2FzX3Rlc3RfaGVhZGVycwotaW50IG1haW4oKSB7Ci0KLXR5cGVkZWYgdm9pZCAoKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIGZyZWU7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTM4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZnJlZT1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfZnJlZT15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9mcmVlIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfZnJlZSA9IHllczsgdGhlbgotIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3Igc2JyayIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTU1OTogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3Igc2JyayIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX3NicmsnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NTY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICooKmYpKCk7Ci1mIHg7Ci14ID0gKGYpIHNicms7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo1NTc1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfc2Jyaz1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBnYXNfY3ZfZGVjbF9uZWVkZWRfc2Jyaz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9zYnJrIiAxPiY2Ci1pZiB0ZXN0ICRnYXNfY3ZfZGVjbF9uZWVkZWRfc2JyayA9IHllczsgdGhlbgotIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NCUksgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZW52aXJvbiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTU5NjogY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZW52aXJvbiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NjAxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSRnYXNfdGVzdF9oZWFkZXJzCi1pbnQgbWFpbigpIHsKLQotdHlwZWRlZiBjaGFyICoqZjsKLWYgeDsKLXggPSAoZikgZW52aXJvbjsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjU2MTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9lbnZpcm9uPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9lbnZpcm9uPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWVjaG8gIiRhY190IiIkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24iIDE+JjYKLWlmIHRlc3QgJGdhc19jdl9kZWNsX25lZWRlZF9lbnZpcm9uID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRU5WSVJPTiAxCi1FT0YKLQotZmkKLQotCi0jIERvZXMgZXJybm8uaCBkZWNsYXJlIGVycm5vLCBvciBkbyB3ZSBoYXZlIHRvIGFkZCBhIHNlcGFyYXRlIGRlY2xhcmF0aW9uCi0jIGZvciBpdD8KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBkZWNsYXJhdGlvbiBpcyByZXF1aXJlZCBmb3IgZXJybm8iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2MzY6IGNoZWNraW5nIHdoZXRoZXIgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgZm9yIGVycm5vIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydnYXNfY3ZfZGVjbF9uZWVkZWRfZXJybm8nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1NjQxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIEhBVkVfRVJSTk9fSAotI2luY2x1ZGUgPGVycm5vLmg+Ci0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci0KLXR5cGVkZWYgaW50IGY7Ci1mIHg7Ci14ID0gKGYpIGVycm5vOwotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NTY1NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vPW5vCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGdhc19jdl9kZWNsX25lZWRlZF9lcnJubz15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1lY2hvICIkYWNfdCIiJGdhc19jdl9kZWNsX25lZWRlZF9lcnJubyIgMT4mNgotaWYgdGVzdCAkZ2FzX2N2X2RlY2xfbmVlZGVkX2Vycm5vID0geWVzOyB0aGVuCi0gY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIE5FRURfREVDTEFSQVRJT05fRVJSTk8gMQotRU9GCi0KLWZpCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBkb2MvTWFrZWZpbGUgLmdkYmluaXQ6Z2RiaW5pdC5pbiBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLXMlQFBBQ0tBR0VAJSRQQUNLQUdFJWcKLXMlQFZFUlNJT05AJSRWRVJTSU9OJWcKLXMlQEFDTE9DQUxAJSRBQ0xPQ0FMJWcKLXMlQEFVVE9DT05GQCUkQVVUT0NPTkYlZwotcyVAQVVUT01BS0VAJSRBVVRPTUFLRSVnCi1zJUBBVVRPSEVBREVSQCUkQVVUT0hFQURFUiVnCi1zJUBNQUtFSU5GT0AlJE1BS0VJTkZPJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVATERAJSRMRCVnCi1zJUBOTUAlJE5NJWcKLXMlQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAlJFVTRV9TWU1CT0xfVU5ERVJTQ09SRSVnCi1zJUBMTl9TQCUkTE5fUyVnCi1zJUBETExUT09MQCUkRExMVE9PTCVnCi1zJUBBU0AlJEFTJWcKLXMlQExJQlRPT0xAJSRMSUJUT09MJWcKLXMlQGNnZW5fY3B1X3ByZWZpeEAlJGNnZW5fY3B1X3ByZWZpeCVnCi1zJUBleHRyYV9vYmplY3RzQCUkZXh0cmFfb2JqZWN0cyVnCi1zJUB0YXJnZXRfY3B1X3R5cGVAJSR0YXJnZXRfY3B1X3R5cGUlZwotcyVAb2JqX2Zvcm1hdEAlJG9ial9mb3JtYXQlZwotcyVAdGVfZmlsZUAlJHRlX2ZpbGUlZwotcyVAaW5zdGFsbF90b29sZGlyQCUkaW5zdGFsbF90b29sZGlyJWcKLXMlQGF0b2ZAJSRhdG9mJWcKLXMlQEJGRExJQkAlJEJGRExJQiVnCi1zJUBPUENPREVTX0xJQkAlJE9QQ09ERVNfTElCJWcKLXMlQEFMTF9PQkpfREVQU0AlJEFMTF9PQkpfREVQUyVnCi1zJUBZQUNDQCUkWUFDQyVnCi1zJUBMRVhAJSRMRVglZwotcyVATEVYTElCQCUkTEVYTElCJWcKLXMlQENQUEAlJENQUCVnCi1zJUBMRVhfT1VUUFVUX1JPT1RAJSRMRVhfT1VUUFVUX1JPT1QlZwotcyVAQUxMT0NBQCUkQUxMT0NBJWcKLXMlQFVTRV9OTFNAJSRVU0VfTkxTJWcKLXMlQE1TR0ZNVEAlJE1TR0ZNVCVnCi1zJUBHTVNHRk1UQCUkR01TR0ZNVCVnCi1zJUBYR0VUVEVYVEAlJFhHRVRURVhUJWcKLXMlQFVTRV9JTkNMVURFRF9MSUJJTlRMQCUkVVNFX0lOQ0xVREVEX0xJQklOVEwlZwotcyVAQ0FUQUxPR1NAJSRDQVRBTE9HUyVnCi1zJUBDQVRPQkpFWFRAJSRDQVRPQkpFWFQlZwotcyVAREFUQURJUk5BTUVAJSREQVRBRElSTkFNRSVnCi1zJUBHTU9GSUxFU0AlJEdNT0ZJTEVTJWcKLXMlQElOU1RPQkpFWFRAJSRJTlNUT0JKRVhUJWcKLXMlQElOVExERVBTQCUkSU5UTERFUFMlZwotcyVASU5UTExJQlNAJSRJTlRMTElCUyVnCi1zJUBJTlRMT0JKU0AlJElOVExPQkpTJWcKLXMlQFBPRklMRVNAJSRQT0ZJTEVTJWcKLXMlQFBPU1VCQCUkUE9TVUIlZwotcyVASU5DTFVERV9MT0NBTEVfSEAlJElOQ0xVREVfTE9DQUxFX0glZwotcyVAR1RfTk9AJSRHVF9OTyVnCi1zJUBHVF9ZRVNAJSRHVF9ZRVMlZwotcyVATUtJTlNUQUxMRElSU0AlJE1LSU5TVEFMTERJUlMlZwotcyVAbEAlJGwlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotCi1DRU9GCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotCi0jIFNwbGl0IHRoZSBzdWJzdGl0dXRpb25zIGludG8gYml0ZS1zaXplZCBwaWVjZXMgZm9yIHNlZHMgd2l0aAotIyBzbWFsbCBjb21tYW5kIG51bWJlciBsaW1pdHMsIGxpa2Ugb24gRGlnaXRhbCBPU0YvMSBhbmQgSFAtVVguCi1hY19tYXhfc2VkX2NtZHM9OTAgIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzZWQgc2NyaXB0LgotYWNfZmlsZT0xICMgTnVtYmVyIG9mIGN1cnJlbnQgZmlsZS4KLWFjX2JlZz0xICMgRmlyc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfZW5kPSRhY19tYXhfc2VkX2NtZHMgIyBMaW5lIGFmdGVyIGxhc3QgbGluZSBmb3IgY3VycmVudCBmaWxlLgotYWNfbW9yZV9saW5lcz06Ci1hY19zZWRfY21kcz0iIgotd2hpbGUgJGFjX21vcmVfbGluZXM7IGRvCi0gIGlmIHRlc3QgJGFjX2JlZyAtZ3QgMTsgdGhlbgotICAgIHNlZCAiMSwke2FjX2JlZ31kOyAke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBzZWQgIiR7YWNfZW5kfXEiIGNvbmZ0ZXN0LnN1YnMgPiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZmkKLSAgaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0LnMkYWNfZmlsZTsgdGhlbgotICAgIGFjX21vcmVfbGluZXM9ZmFsc2UKLSAgICBybSAtZiBjb25mdGVzdC5zJGFjX2ZpbGUKLSAgZWxzZQotICAgIGlmIHRlc3QgLXogIiRhY19zZWRfY21kcyI7IHRoZW4KLSAgICAgIGFjX3NlZF9jbWRzPSJzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGVsc2UKLSAgICAgIGFjX3NlZF9jbWRzPSIkYWNfc2VkX2NtZHMgfCBzZWQgLWYgY29uZnRlc3QucyRhY19maWxlIgotICAgIGZpCi0gICAgYWNfZmlsZT1gZXhwciAkYWNfZmlsZSArIDFgCi0gICAgYWNfYmVnPSRhY19lbmQKLSAgICBhY19lbmQ9YGV4cHIgJGFjX2VuZCArICRhY19tYXhfc2VkX2NtZHNgCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gIGFjX3NlZF9jbWRzPWNhdAotZmkKLUVPRgotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotQ09ORklHX0ZJTEVTPVwke0NPTkZJR19GSUxFUy0iTWFrZWZpbGUgZG9jL01ha2VmaWxlIC5nZGJpbml0OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiJ9Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfRklMRVM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICAjIEFkanVzdCBhIHJlbGF0aXZlIHNyY2RpciwgdG9wX3NyY2RpciwgYW5kIElOU1RBTEwgZm9yIHN1YmRpcmVjdG9yaWVzLgotCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgYWNfZGlyX3N1ZmZpeD0iL2BlY2hvICRhY19kaXJ8c2VkICdzJV5cLi8lJSdgIgotICAgICMgQSAiLi4vIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGlyX3N1ZmZpeHxzZWQgJ3MlL1teL10qJS4uLyVnJ2AKLSAgZWxzZQotICAgIGFjX2Rpcl9zdWZmaXg9IGFjX2RvdHM9Ci0gIGZpCi0KLSAgY2FzZSAiJGFjX2dpdmVuX3NyY2RpciIgaW4KLSAgLikgIHNyY2Rpcj0uCi0gICAgICBpZiB0ZXN0IC16ICIkYWNfZG90cyI7IHRoZW4gdG9wX3NyY2Rpcj0uCi0gICAgICBlbHNlIHRvcF9zcmNkaXI9YGVjaG8gJGFjX2RvdHN8c2VkICdzJS8kJSUnYDsgZmkgOzsKLSAgLyopIHNyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IjsgdG9wX3NyY2Rpcj0iJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgKikgIyBSZWxhdGl2ZSBwYXRoLgotICAgIHNyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiCi0gICAgdG9wX3NyY2Rpcj0iJGFjX2RvdHMkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGFjX2dpdmVuX0lOU1RBTEwiIGluCi0gIFsvJF0qKSBJTlNUQUxMPSIkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgKikgSU5TVEFMTD0iJGFjX2RvdHMkYWNfZ2l2ZW5fSU5TVEFMTCIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgIiRhY19maWxlIgotICBybSAtZiAiJGFjX2ZpbGUiCi0gIGNvbmZpZ3VyZV9pbnB1dD0iR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBgZWNobyAkYWNfZmlsZV9pbnxzZWQgJ3MlLiovJSUnYCBieSBjb25maWd1cmUuIgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKk1ha2VmaWxlKikgYWNfY29tc3ViPSIxaVxcCi0jICRjb25maWd1cmVfaW5wdXQiIDs7Ci0gICopIGFjX2NvbXN1Yj0gOzsKLSAgZXNhYwotCi0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIHNlZCAtZSAiJGFjX2NvbXN1YgotcyVAY29uZmlndXJlX2lucHV0QCUkY29uZmlndXJlX2lucHV0JWcKLXMlQHNyY2RpckAlJHNyY2RpciVnCi1zJUB0b3Bfc3JjZGlyQCUkdG9wX3NyY2RpciVnCi1zJUBJTlNUQUxMQCUkSU5TVEFMTCVnCi0iICRhY19maWxlX2lucHV0cyB8IChldmFsICIkYWNfc2VkX2NtZHMiKSA+ICRhY19maWxlCi1maTsgZG9uZQotcm0gLWYgY29uZnRlc3QucyoKLQotIyBUaGVzZSBzZWQgY29tbWFuZHMgYXJlIHBhc3NlZCB0byBzZWQgYXMgIkEgTkFNRSBCIE5BTUUgQyBWQUxVRSBEIiwgd2hlcmUKLSMgTkFNRSBpcyB0aGUgY3BwIG1hY3JvIGJlaW5nIGRlZmluZWQgYW5kIFZBTFVFIGlzIHRoZSB2YWx1ZSBpdCBpcyBiZWluZyBnaXZlbi4KLSMKLSMgYWNfZCBzZXRzIHRoZSB2YWx1ZSBpbiAiI2RlZmluZSBOQU1FIFZBTFVFIiBsaW5lcy4KLWFjX2RBPSdzJV5cKFsgCV0qXCkjXChbIAldKmRlZmluZVsgCV1bIAldKlwpJwotYWNfZEI9J1woWyAJXVsgCV0qXClbXiAJXSolXDEjXDInCi1hY19kQz0nXDMnCi1hY19kRD0nJWcnCi0jIGFjX3UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRoIHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfdUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY191Qj0nXChbIAldXCklXDEjXDJkZWZpbmVcMycKLWFjX3VDPScgJwotYWNfdUQ9J1w0JWcnCi0jIGFjX2UgdHVybnMgIiN1bmRlZiBOQU1FIiB3aXRob3V0IHRyYWlsaW5nIGJsYW5rcyBpbnRvICIjZGVmaW5lIE5BTUUgVkFMVUUiLgotYWNfZUE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qXCl1bmRlZlwoWyAJXVsgCV0qXCknCi1hY19lQj0nJCVcMSNcMmRlZmluZVwzJwotYWNfZUM9JyAnCi1hY19lRD0nJWcnCi0KLWlmIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgIT0gc2V0OyB0aGVuCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotICBDT05GSUdfSEVBREVSUz0iY29uZmlnLmg6Y29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotdGFyZ2V0X2NwdV90eXBlPSR7dGFyZ2V0X2NwdV90eXBlfQotIGNnZW5fY3B1X3ByZWZpeD0ke2NnZW5fY3B1X3ByZWZpeH0KLSBvYmpfZm9ybWF0PSR7b2JqX2Zvcm1hdH0KLSB0ZV9maWxlPSR7dGVfZmlsZX0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLXJtIC1mIHRhcmctY3B1LmMgdGFyZy1jcHUuaCBvYmotZm9ybWF0Lmggb2JqLWZvcm1hdC5jIHRhcmctZW52LmggYXRvZi10YXJnLmMgaXRibC1jcHUuaAotIGVjaG8gJyNpbmNsdWRlICJ0Yy0nIiR7dGFyZ2V0X2NwdV90eXBlfSInLmgiJyA+IHRhcmctY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAib2JqLSciJHtvYmpfZm9ybWF0fSInLmgiJyA+IG9iai1mb3JtYXQuaAotIGVjaG8gJyNpbmNsdWRlICJ0ZS0nIiR7dGVfZmlsZX0iJy5oIicgPiB0YXJnLWVudi5oCi0gZWNobyAnI2luY2x1ZGUgIml0YmwtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiBpdGJsLWNwdS5oCi0gaWYgdGVzdCAieCRjZ2VuX2NwdV9wcmVmaXgiICE9IHggOyB0aGVuCi0gICBlY2hvICcjaW5jbHVkZSAib3Bjb2Rlcy8nIiR7Y2dlbl9jcHVfcHJlZml4fSInLWRlc2MuaCInID4gY2dlbi1kZXNjLmgKLSBmaQotCi0gc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvZ2FzL2NvbmZpZ3VyZS5iYXQgYi9nYXMvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkMjY5Zi4uMDAwMDAwMAotLS0gYS9nYXMvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLUBlY2hvIG9mZg0KLWlmICIlMSIgPT0gImg4LzMwMCIgZ290byBoODMwMA0KLQ0KLWVjaG8gQ29uZmlndXJpbmcgZ2FzIGZvciBnbzMyDQotdXBkYXRlIGNvbmZpZy90Yy1pMzg2LmMgdGFyZy1jcHUuYw0KLXVwZGF0ZSBjb25maWcvdGMtaTM4Ni5oIHRhcmctY3B1LmgNCi11cGRhdGUgY29uZmlnL3RlLWdvMzIuaCB0YXJnLWVudi5oDQotdXBkYXRlIGNvbmZpZy9vYmotY29mZi5oIG9iai1mb3JtYXQuaA0KLXVwZGF0ZSBjb25maWcvb2JqLWNvZmYuYyBvYmotZm9ybWF0LmMNCi11cGRhdGUgY29uZmlnL2F0b2YtaWVlZS5jIGF0b2YtdGFyZy5jDQotZ290byBjb21tb24NCi0NCi06aDgzMDANCi1lY2hvIENvbmZpZ3VyaW5nIGdhcyBmb3IgSDgvMzAwDQotY29weSBjb25maWdcaG8tZ28zMi5oIGhvc3QuaA0KLWNvcHkgY29uZmlnXHRjLWg4MzAwLmMgdGFyZy1jcHUuYw0KLWNvcHkgY29uZmlnXHRjLWg4MzAwLmggdGFyZy1jcHUuaA0KLWNvcHkgY29uZmlnXHRlLWdlbmVyaWMuaCB0YXJnLWVudi5oDQotY29weSBjb25maWdcb2JqY29mZmJmZC5oIG9iai1mb3JtYXQuaA0KLWNvcHkgY29uZmlnXG9iamNvZmZiZmQuYyBvYmotZm9ybWF0LmMNCi1jb3B5IGNvbmZpZ1xhdG9mLWllZWUuYyBhdG9mLXRhcmcuYw0KLQ0KLTpjb21tb24NCi0NCi1lY2hvICMgTWFrZWZpbGUgZ2VuZXJhdGVkIGJ5ICJjb25maWd1cmUuYmF0Ij4gTWFrZWZpbGUuMg0KLWVjaG8gYWxsLmRvcyA6IGFzLm5ldyBnYXNwLm5ldz4+IE1ha2VmaWxlLjINCi0NCi1pZiBleGlzdCBjb25maWcuc2VkIGRlbCBjb25maWcuc2VkDQotDQotZWNobyAicy9Ac3JjZGlyQC8uL2cJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AdGFyZ2V0X2FsaWFzQC9nbzMyLwkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQHByZWZpeEAvLwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BDQ0AvZ2NjL2cJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AT1BDT0RFU19MSUJALy4uXC9vcGNvZGVzXC9saWJvcGNvZGVzLmEvZwkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQEJGRExJQkAvLi5cL2JmZFwvbGliYmZkLmEvZwkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AQUxMX09CSl9ERVBTQC8uLlwvYmZkXC9iZmQuaC9nCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICIvXmFsbFsgCV0qOi8gYVwJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiZHVtbXk6CQkJCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL1wvdXNyW14gXSouaC8vZwkJCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICIvXmNvbmZpZy5oWyAJXSo6LyBkCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9eTWFrZWZpbGUvbm90LU1ha2VmaWxlLwkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLXNlZCAtZSAicy9eXCIvLyIgLWUgInMvXCIkLy8iIC1lICJzL1sgCV0qJC8vIiBjb25maWcuc2VkID4gY29uZmlnMi5zZWQNCi1zZWQgLWYgY29uZmlnMi5zZWQgTWFrZWZpbGUuaW4gPj4gTWFrZWZpbGUuMg0KLXVwZGF0ZSBNYWtlZmlsZS4yIE1ha2VmaWxlDQotZGVsIE1ha2VmaWxlLjINCi1kZWwgY29uZmlnLnNlZA0KLWRlbCBjb25maWcyLnNlZA0KLQ0KLWVjaG8gI2lmbmRlZiBHQVNfVkVSU0lPTj4gY29uZmlnLm5ldw0KLXNlZCAtbiAiL15WRVJTSU9OPS9wIiBNYWtlZmlsZS5pbiB8IHNlZCAtZSAicy9WRVJTSU9OPS8jZGVmaW5lIEdBU19WRVJTSU9OIFwiLyIgLWUgInMvJC9cIi8iPj4gY29uZmlnLm5ldw0KLXR5cGUgY29uZmlnXGdvMzIuY2ZnID4+IGNvbmZpZy5uZXcNCi1lY2hvICNlbmRpZj4+IGNvbmZpZy5uZXcNCi11cGRhdGUgY29uZmlnLm5ldyBjb25maWcuaA0KZGlmZiAtLWdpdCBhL2dhcy9jb25maWd1cmUuaW4gYi9nYXMvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NhYjA2Li4wMDAwMDAwCi0tLSBhL2dhcy9jb25maWd1cmUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3NzEgKzAsMCBAQAotZG5sIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b2NvbmYgdG8gcHJvZHVjZSBhIGNvbmZpZ3VyZSBzY3JpcHQuCi1kbmwKLWRubCBBbmQgYmUgY2FyZWZ1bCB3aGVuIGNoYW5naW5nIGl0ISAgSWYgeW91IG11c3QgYWRkIHRlc3RzIHdpdGggc3F1YXJlCi1kbmwgYnJhY2tldHMsIGJlIHN1cmUgY2hhbmdlcXVvdGUgaW52b2NhdGlvbnMgc3Vycm91bmQgaXQuCi1kbmwKLWRubAotZG5sIHYyLjUgbmVlZGVkIGZvciAtLWJpbmRpciBldCBhbAotQUNfUFJFUkVRKDIuMTMpCi1BQ19JTklUKGFzLmgpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLQotQU1fSU5JVF9BVVRPTUFLRShnYXMsIDIuOS40KQotCi1BTV9QUk9HX0xJQlRPT0wKLQotdXNlcl9iZmRfZ2FzPQotQUNfQVJHX0VOQUJMRShiZmQtYXNzZW1ibGVyLAotWyAgLS1lbmFibGUtYmZkLWFzc2VtYmxlciAgdXNlIEJGRCBiYWNrIGVuZCBmb3Igd3JpdGluZyBvYmplY3QgZmlsZXNdLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzKSBuZWVkX2JmZD15ZXMgdXNlcl9iZmRfZ2FzPXllcyA7OwotICBubykgIHVzZXJfYmZkX2dhcz1ubyA7OwotICAqKSAgIEFDX01TR19FUlJPUihiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGdpdmVuIGZvciBiZmQtYXNzZW1ibGVyIG9wdGlvbikgOzsKLWVzYWNdKWRubAotQUNfQVJHX0VOQUJMRSh0YXJnZXRzLAotWyAgICB0YXJnZXRzICAgICAgICAgICAgYWx0ZXJuYXRpdmUgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zIGJlc2lkZXMgdGhlIHByaW1hcnldLAotW2Nhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIEFDX0VSUk9SKGVuYWJsZS10YXJnZXRzIG9wdGlvbiBtdXN0IHNwZWNpZnkgdGFyZ2V0IG5hbWVzIG9yICdhbGwnKQotCSAgICA7OwotICBubykJICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKQkgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhY10pZG5sCi1BQ19BUkdfRU5BQkxFKGNvbW1vbmJmZGxpYiwKLVsgIC0tZW5hYmxlLWNvbW1vbmJmZGxpYiAgIGJ1aWxkIHNoYXJlZCBCRkQvb3Bjb2Rlcy9saWJpYmVydHkgbGlicmFyeV0sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgQUNfTVNHX0VSUk9SKFtiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBCRkQgY29tbW9uYmZkbGliIG9wdGlvbl0pIDs7Ci1lc2FjXSlkbmwKLQotdXNpbmdfY2dlbj1ubwotCi0jIEdlbmVyYXRlIGEgaGVhZGVyIGZpbGUKLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi10ZV9maWxlPWdlbmVyaWMKLQotIyBNYWtlZmlsZSB0YXJnZXQgZm9yIGluc3RhbGxpbmcgZ2FzIGluICQodG9vbGRpcikvYmluLgotaW5zdGFsbF90b29sZGlyPWluc3RhbGwtZXhlYy10b29sZGlyCi0KLWNhbm9uX3RhcmdldHM9IiIKLWlmIHRlc3QgLW4gIiRlbmFibGVfdGFyZ2V0cyIgOyB0aGVuCi0gIGZvciB0IGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgOyBkbwotICAgIHJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHQgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCIgOyB0aGVuCi0gICAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotIyAgICBlbHNlCi0jICAgICAgIyBQZXJtaXQgImFsbCIsIGV0Yy4gIFdlIGRvbid0IHN1cHBvcnQgaXQgeWV0IHRob3VnaC4KLSMgICAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkdCIKLSAgICBmaQotICBkb25lCi0gIEdBU19VTklRKGNhbm9uX3RhcmdldHMpCi1maQotCi1lbXVsYXRpb25zPSIiCi0KLWZvciB0aGlzX3RhcmdldCBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzIDsgZG8KLQotY2hhbmdlcXVvdGUoLClkbmwKLSAgICBldmFsIGBlY2hvICR0aGlzX3RhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL2NwdT1cMSB2ZW5kb3I9XDIgb3M9XDMvJ2AKLWNoYW5nZXF1b3RlKFssXSlkbmwKLQotICAgICMgY2hlY2sgZm9yIGFyY2hpdGVjdHVyZSB2YXJpYW50cwotICAgIGFyY2g9Ci0gICAgZW5kaWFuPQotICAgIGNhc2UgJHtjcHV9IGluCi0gICAgICBhbHBoYSopCQljcHVfdHlwZT1hbHBoYSA7OwotICAgICAgYXJtZWIpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWJpZyA7OwotICAgICAgYXJtKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm1iKikJCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBhcm12KmwpCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgYXJtdipiKQkJY3B1X3R5cGU9YXJtIGVuZGlhbj1iaWcgOzsKLSAgICAgIHN0cm9uZ2FybSopCWNwdV90eXBlPWFybSBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICB0aHVtYiopCQljcHVfdHlwZT1hcm0gZW5kaWFuPWxpdHRsZSA7OwotICAgICAgaHBwYSopCQljcHVfdHlwZT1ocHBhIDs7Ci1jaGFuZ2VxdW90ZSgsKWRubAotICAgICAgaVs0NTZdODYpCQljcHVfdHlwZT1pMzg2IDs7Ci0gICAgICBtNjgwWzAxMjM0Nl0wKQljcHVfdHlwZT1tNjhrIDs7Ci1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICBtNjgwMDgpCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNjgzPz8pCQljcHVfdHlwZT1tNjhrIDs7Ci0gICAgICBtNTIwMCkJCWNwdV90eXBlPW02OGsgOzsKLSAgICAgIG04KikJCWNwdV90eXBlPW04OGsgOzsKLSAgICAgIG1pcHMqZWwpCQljcHVfdHlwZT1taXBzIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMqKQkJY3B1X3R5cGU9bWlwcyBlbmRpYW49YmlnIDs7Ci0gICAgICBwb3dlcnBjbGUqKQljcHVfdHlwZT1wcGMgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgcG93ZXJwYyopCQljcHVfdHlwZT1wcGMgZW5kaWFuPWJpZyA7OwotICAgICAgcnM2MDAwKikJCWNwdV90eXBlPXBwYyA7OwotICAgICAgc3BhcmNsaXRlKikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xpdGUgOzsKLSAgICAgIHNwYXJjbGV0KikJY3B1X3R5cGU9c3BhcmMgYXJjaD1zcGFyY2xldCA7OwotICAgICAgc3BhcmM2NCopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXY5LTY0IDs7Ci0gICAgICBzcGFyYzg2eCopCWNwdV90eXBlPXNwYXJjIGFyY2g9c3BhcmM4NnggIDs7Ci0gICAgICBzcGFyYyopCQljcHVfdHlwZT1zcGFyYyBhcmNoPXNwYXJjbGl0ZSA7OyAjID8/PyBTZWUgdGMtc3BhcmMuYy4KLSAgICAgIHY4NTAqKQkJY3B1X3R5cGU9djg1MCA7OwotICAgICAgKikJCWNwdV90eXBlPSR7Y3B1fSA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgJHt0aGlzX3RhcmdldH0gPSAkdGFyZ2V0IDsgdGhlbgotICAgICAgdGFyZ2V0X2NwdV90eXBlPSR7Y3B1X3R5cGV9Ci0gICAgZWxpZiB0ZXN0ICR7dGFyZ2V0X2NwdV90eXBlfSAhPSAke2NwdV90eXBlfSA7IHRoZW4KLSAgICAgIGNvbnRpbnVlCi0gICAgZmkKLQotICAgIGdlbmVyaWNfdGFyZ2V0PSR7Y3B1X3R5cGV9LSR2ZW5kb3ItJG9zCi0gICAgZGV2PW5vCi0gICAgYmZkX2dhcz1ubwotICAgIGVtPWdlbmVyaWMKLQotICAgICMgYXNzaWduIG9iamVjdCBmb3JtYXQKLSAgICBjYXNlICR7Z2VuZXJpY190YXJnZXR9IGluCi0gICAgICBhMjlrLSotY29mZikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstYW1kLXVkaSkgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYTI5ay1hbWQtZWJtb24pICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBhMjlrLW55dS1zeW0xKSAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIGEyOWstKi12eHdvcmtzKikgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBhbHBoYSotKi0qdm1zKikJICAgIGZtdD1ldmF4IDs7Ci0gICAgICBhbHBoYSotKi1uZXR3YXJlKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vcGVuYnNkKikgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1vc2YqKSAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eGVjb2ZmKikgZm10PWVjb2ZmIDs7Ci0gICAgICBhbHBoYSotKi1saW51eC1nbnUqKSAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgYWxwaGEqLSotbmV0YnNkKikgICAgIGZtdD1lbGYgZW09bmJzZCA7OwotCi0gICAgICBhcmMtKi1lbGYqKSAgICAgICAgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBhcm0tKi1hb3V0KQkgICAgICAgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGFybS0qLWNvZmYgfCB0aHVtYi0qLWNvZmYpICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgYXJtLSotZWxmIHwgdGh1bWItKi1lbGYpICAgICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIGFybS0qLWxpbnV4KmFvdXQqKQkgICAgICAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBhcm0tKi1saW51eCogfCBhcm12Ki0qLWxpbnV4LWdudSkJZm10PWVsZiAgZW09bGludXggOzsKLSAgICAgIGFybS0qLW5ldGJzZCopCSAgICAgICAgICAgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKi1vYWJpIHwgdGh1bWItKi1vYWJpKSAgICAgICAgZm10PWVsZiA7OwotICAgICAgYXJtLWVwb2MtcGUgfCB0aHVtYi1lcG9jLXBlKSAgICAgIGZtdD1jb2ZmIGVtPWVwb2MtcGUgOzsKLSAgICAgIGFybS0qLXBlIHwgdGh1bWItKi1wZSkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgYXJtLSotcmlzY2l4KikJICAgICAgICAgICAgICAgIGZtdD1hb3V0IGVtPXJpc2NpeCA7OwotCi0gICAgICBkMTB2LSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBkMzB2LSotKikJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLQotICAgICAgZnIzMC0qLSopCQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotCi0gICAgICBocHBhLSotKmVsZiopICAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbGl0ZXMqKSAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotb3NmKikgICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotcnRlbXMqKSAgICAgICAgZm10PWVsZiBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotaHB1eCopICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotbXBlaXgqKSAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotYnNkKikgICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0gICAgICBocHBhLSotaGl1eCopICAgICAgICAgZm10PXNvbSBlbT1ocHBhIDs7Ci0KLSAgICAgIGg4MzAwLSotY29mZikgICAgICAgICBmbXQ9Y29mZiA7OwotCi0gICAgICBpMzg2LWlibS1haXgqKSAgICAgICAgZm10PWNvZmYgZW09aTM4NmFpeCA7OwotICAgICAgaTM4Ni1zZXF1ZW50LWJzZCopICAgIGZtdD1hb3V0IGVtPWR5bml4IGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotYmVvc3BlKikgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1iZW9zZWxmKiB8IGkzODYtKi1iZW9zKikgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLWJzZCopICAgICAgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLW5ldGJzZDAuOCkgICAgIGZtdD1hb3V0IGVtPTM4NmJzZCA7OwotICAgICAgaTM4Ni0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXM7OwotICAgICAgaTM4Ni0qLW9wZW5ic2QqKSAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXM7OwotICAgICAgaTM4Ni0qLWxpbnV4KmFvdXQqIHwgaTM4Ni0qLWxpbnV4b2xkbGQpICAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIGkzODYtKi1saW51eCpjb2ZmKikgICBmbXQ9Y29mZiBlbT1saW51eCA7OwotICAgICAgaTM4Ni0qLWxpbnV4LWdudSopICAgIGZtdD1lbGYgZW09bGludXggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1seW54b3MqKSAgICAgICBmbXQ9Y29mZiBlbT1seW54IDs7Ci0gICAgICBpMzg2LSotc3lzdjQqIHwgaTM4Ni0qLXNvbGFyaXMqIHwgaTM4Ni0qLWVsZikKLQkJCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotZnJlZWJzZGFvdXQqIHwgaTM4Ni0qLWZyZWVic2RbMTJdLiogfCBpMzg2LSotZnJlZWJzZFsxMl0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm10PWFvdXQgZW09Mzg2YnNkIDs7Ci0gICAgICBpMzg2LSotZnJlZWJzZCopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBpMzg2LSotY29mZiB8IGkzODYtKi1zeXN2KiB8IGkzODYtKi1zY28zLjJ2NSpjb2ZmIHwgaTM4Ni0qLWlzYyopCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotc2NvMy4ydjUqKSAgICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCUFDX0RFRklORShTQ09fRUxGLCAxLAotCQkJCSAgICBbRGVmaW5lIGlmIGRlZmF1bHRpbmcgdG8gRUxGIG9uIFNDTyA1Ll0pCi0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgaTM4Ni0qLXNjbzMuMiopICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotdnN0YSkgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgIGkzODYtKi1tc2Rvc2RqZ3BwKiB8IGkzODYtKi1nbzMyKiB8IGkzODYtZ28zMi1ydGVtcyopCi0JCQkgICAgZm10PWNvZmYgZW09Z28zMjs7Ci0gICAgICBpMzg2LSotcnRlbXNlbGYqKSAgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLXJ0ZW1zKikgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBpMzg2LSotZ251KikgICAgICAgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLW1hY2gqKQotCQkJICAgIGZtdD1hb3V0IGVtPW1hY2ggYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1tc2RvcyopICAgICAgICBmbXQ9YW91dCA7OwotICAgICAgaTM4Ni0qLW1vc3MqKQkgICAgZm10PWVsZiA7OwotICAgICAgaTM4Ni0qLXBlKSAgICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBpMzg2LSotY3lnd2luKikgICAgICAgZm10PWNvZmYgZW09cGUgYmZkX2dhcz15ZXMgOzsKLSAgICAgIGkzODYtKi1taW5ndzMyKikgICAgICBmbXQ9Y29mZiBlbT1wZSBiZmRfZ2FzPXllcyA7OwotICAgICAgaTM4Ni0qLSpudCopICAgICAgICAgIGZtdD1jb2ZmIGVtPXBlIDs7Ci0gICAgICBpOTYwLSotYm91dCkgICAgICAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi1jb2ZmKSAgICAgICAgICBmbXQ9Y29mZiBlbT1pYzk2MCA7OwotICAgICAgaTk2MC0qLXJ0ZW1zKikgICAgICAgIGZtdD1jb2ZmIGVtPWljOTYwIDs7Ci0gICAgICBpOTYwLSotbmluZHkqKSAgICAgICAgZm10PWJvdXQgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzNCopICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLXZ4d29ya3M1LjApICAgIGZtdD1ib3V0IDs7Ci0gICAgICBpOTYwLSotdnh3b3JrczUuKikgICAgZm10PWNvZmYgZW09aWM5NjAgOzsKLSAgICAgIGk5NjAtKi12eHdvcmtzKikgICAgICBmbXQ9Ym91dCA7OwotICAgICAgaTk2MC0qLWVsZiopCSAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIG0zMnItKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLQotICAgICAgbTY4ay0qLXZ4d29ya3MqIHwgbTY4ay1lcmljc3Nvbi1vc2UgfCBtNjhrLSotc3Vub3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIG02OGstbW90b3JvbGEtc3lzdiopICBmbXQ9Y29mZiBlbT1kZWx0YSA7OwotICAgICAgbTY4ay1idWxsLXN5c3YzKikgICAgIGZtdD1jb2ZmIGVtPWRweDIgOzsKLSAgICAgIG02OGstYXBvbGxvLSopICAgICAgICBmbXQ9Y29mZiBlbT1hcG9sbG8gOzsKLSAgICAgIG02OGstKi1zeXN2NCopICMgbXVzdCBiZSBiZWZvcmUgLXN5c3YqCi0JCQkgICAgZm10PWVsZiBlbT1zdnI0IDs7Ci0gICAgICBtNjhrLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG02OGstKi1jb2ZmIHwgbTY4ay0qLXN5c3YqIHwgbTY4ay0qLXJ0ZW1zKikKLQkJCSAgICBmbXQ9Y29mZiA7OwotICAgICAgbTY4ay0qLWhwdXgqKSAgICAgICAgIGZtdD1ocDMwMCBlbT1ocDMwMCA7OwotICAgICAgbTY4ay0qLWxpbnV4KmFvdXQqKSAgIGZtdD1hb3V0IGVtPWxpbnV4IDs7Ci0gICAgICBtNjhrLSotbGludXgtZ251KikgICAgZm10PWVsZiBlbT1saW51eCA7OwotICAgICAgbTY4ay0qLWdudSopCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtNjhrLSotbHlueG9zKikgICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgbTY4ay0qLW5ldGJzZCopICAgICAgIGZtdD1hb3V0IGVtPW5ic2QgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG02OGstKi1vcGVuYnNkKikgICAgICBmbXQ9YW91dCBlbT1uYnNkIGJmZF9nYXM9eWVzIDs7Ci0gICAgICBtNjhrLWFwcGxlLWF1eCopICAgICAgZm10PWNvZmYgZW09YXV4IDs7Ci0gICAgICBtNjhrLSotcHNvcyopICAgICAgICAgZm10PWVsZiBlbT1wc29zOzsKLQotICAgICAgbTg4ay1tb3Rvcm9sYS1zeXN2MyopIGZtdD1jb2ZmIGVtPWRlbHQ4OCA7OwotICAgICAgbTg4ay0qLWNvZmYqKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIG1jb3JlLSotZWxmKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgbWNvcmUtKi1wZSkJICAgIGZtdD1jb2ZmIGVtPXBlIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgICMgZG9uJ3QgY2hhbmdlIGVtIGxpa2UgKi0qLWJzZCBkb2VzCi0gICAgICBtaXBzLWRlYy1uZXRic2QqKQkgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1vcGVuYnNkKikgICAgZm10PWVsZiBlbmRpYW49bGl0dGxlIDs7Ci0gICAgICBtaXBzLWRlYy1ic2QqKSAgICAgICAgZm10PWFvdXQgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy1zb255LWJzZCopICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWJzZCopICAgICAgICAgIEFDX01TR19FUlJPUihVbmtub3duIHZlbmRvciBmb3IgbWlwcy1ic2QgY29uZmlndXJhdGlvbi4pIDs7Ci0gICAgICBtaXBzLSotdWx0cml4KikgICAgICAgZm10PWVjb2ZmIGVuZGlhbj1saXR0bGUgOzsKLSAgICAgIG1pcHMtKi1vc2YqKSAgICAgICAgICBmbXQ9ZWNvZmYgZW5kaWFuPWxpdHRsZSA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWVjb2ZmKikgICAgICAgIGZtdD1lY29mZiA7OwotICAgICAgbWlwcy0qLWlyaXg2KikJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi1pcml4NSopICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgICBtaXBzLSotaXJpeCopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotbG5ld3MqKSAgICAgICAgZm10PWVjb2ZmIGVtPWxuZXdzIDs7Ci0gICAgICBtaXBzLSotcmlzY29zKikgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotc3lzdiopICAgICAgICAgZm10PWVjb2ZmIDs7Ci0gICAgICBtaXBzLSotZWxmKiB8IG1pcHMtKi1ydGVtcyogfCBtaXBzLSotbGludXgtZ251KiB8IG1pcHMtKi1nbnUqIHwgbWlwcy0qLW9wZW5ic2QqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIG1pcHMtKi12eHdvcmtzKikgICAgICBmbXQ9ZWxmCi0JCQkgICAgQUNfREVGSU5FKE1JUFNfU1RBQlNfRUxGLCAxLAotCQkJCVtVc2UgRUxGIHN0YWJzIGZvciBNSVBTLCBub3QgRUNPRkYgc3RhYnNdKQotCQkJICAgIDs7Ci0gICAgICBtbjEwMjAwLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIG1uMTAzMDAtKi0qKQkgICAgZm10PWVsZiBiZmRfZ2FzPXllcyA7OwotICAgICAgcHBjLSotcGUgfCBwcGMtKi1jeWd3aW4qIHwgcHBjLSotd2lubnQqKQotCQkgICAgICAgICAgICBmbXQ9Y29mZiBlbT1wZSA7OwotICAgICAgcHBjLSotYWl4KikgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBwcGMtKi1iZW9zKikgICAgICAgICAgZm10PWNvZmYgOzsKLSAgICAgIHBwYy0qLSpic2QqIHwgcHBjLSotZWxmKiB8IHBwYy0qLWVhYmkqIHwgcHBjLSotc3lzdjQqKQotCQkJICAgIGZtdD1lbGYgOzsKLSAgICAgIHBwYy0qLWxpbnV4LWdudSopCSAgICBmbXQ9ZWxmCi0JCQkgICAgY2FzZSAiJGVuZGlhbiIgaW4KLQkJCSAgICBiaWcpICA7OwotCQkJICAgICopICAgIEFDX01TR19FUlJPUihHTlUvTGludXggbXVzdCBiZSBjb25maWd1cmVkIGJpZyBlbmRpYW4pIDs7Ci0JCQkgICAgZXNhYwotCQkJICAgIDs7Ci0gICAgICBwcGMtKi1zb2xhcmlzKikJICAgIGZtdD1lbGYKLQkJCSAgICBpZiB0ZXN0ICR7dGhpc190YXJnZXR9ID0gJHRhcmdldDsgdGhlbgotCQkJCUFDX0RFRklORShUQVJHRVRfU09MQVJJU19DT01NRU5ULCAxLAotCQkJCVtEZWZpbmUgaWYgZGVmYXVsdCB0YXJnZXQgaXMgUG93ZXJQQyBTb2xhcmlzLl0pCi0JCQkgICAgZmkKLQkJCSAgICBpZiB0ZXN0IHgke2VuZGlhbn0gPSB4YmlnOyB0aGVuCi0JCQkJQUNfTVNHX0VSUk9SKFNvbGFyaXMgbXVzdCBiZSBjb25maWd1cmVkIGxpdHRsZSBlbmRpYW4pCi0JCQkgICAgZmkKLQkJCSAgICA7OwotICAgICAgcHBjLSotcnRlbXMqKQkgICAgZm10PWVsZiA7OwotICAgICAgcHBjLSotbWFjb3MqIHwgcHBjLSotbXB3KikKLQkJCSAgICBmbXQ9Y29mZiBlbT1tYWNvcyA7OwotICAgICAgcHBjLSotbmV0d2FyZSopICAgICAgIGZtdD1lbGYgZW09cHBjbncgOzsKLSAgICAgIHBwYy0qLXZ4d29ya3MqKSAgICAgICBmbXQ9ZWxmIDs7Ci0KLSAgICAgIHNoLSotZWxmKikJICAgIGZtdD1lbGYgOzsKLSAgICAgIHNoLSotY29mZiopICAgICAgICAgICBmbXQ9Y29mZiA7OwotICAgICAgc2gtKi1ydGVtc2VsZiopICAgICAgIGZtdD1lbGYgOzsKLSAgICAgIHNoLSotcnRlbXMqKQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgbnMzMmstcGM1MzItbWFjaCogfCBuczMyay1wYzUzMi11eCopICAgIGZtdD1hb3V0IGVtPXBjNTMybWFjaCA7OwotICAgICAgbnMzMmstcGM1MzItbmV0YnNkKiB8IG5zMzJrLXBjNTMyLWxpdGVzKikgIGZtdD1hb3V0IGVtPW5ic2Q1MzIgOzsKLSAgICAgIG5zMzJrLXBjNTMyLW9wZW5ic2QqKSBmbXQ9YW91dCBlbT1uYnNkNTMyIDs7Ci0KLSAgICAgIHNwYXJjLSotcnRlbXMqKSAgICAgICBmbXQ9YW91dCA7OwotICAgICAgc3BhcmMtKi1zdW5vczQqKSAgICAgIGZtdD1hb3V0IGVtPXN1bjMgOzsKLSAgICAgIHNwYXJjLSotYW91dCB8IHNwYXJjKi0qLXZ4d29ya3MqKQotCQkJICAgIGZtdD1hb3V0IGVtPXNwYXJjYW91dCA7OwotICAgICAgc3BhcmMtKi1jb2ZmKSAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzcGFyYy0qLWxpbnV4KmFvdXQqKSAgZm10PWFvdXQgZW09bGludXggOzsKLSAgICAgIHNwYXJjLSotbGludXgtZ251KikgICBmbXQ9ZWxmIGVtPWxpbnV4IDs7Ci0gICAgICBzcGFyYy0qLWx5bnhvcyopICAgICAgZm10PWNvZmYgZW09bHlueCA7OwotICAgICAgc3BhcmMtZnVqaXRzdS1ub25lKSAgIGZtdD1hb3V0IDs7Ci0gICAgICBzcGFyYy0qLWVsZiB8IHNwYXJjLSotc3lzdjQqIHwgc3BhcmMtKi1zb2xhcmlzKikKLQkJCSAgICBmbXQ9ZWxmIDs7Ci0gICAgICBzcGFyYy0qLW5ldGJzZCopICAgICAgZm10PWFvdXQgZW09bmJzZCA7OwotICAgICAgc3BhcmMtKi1vcGVuYnNkKikgICAgIGZtdD1hb3V0IGVtPW5ic2QgOzsKLQotICAgICAgc3Ryb25nYXJtLSotY29mZikgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICBzdHJvbmdhcm0tKi1lbGYpICAgICAgZm10PWVsZiA7OwotCi0gICAgICB0aWMzMC0qLSphb3V0KikJICAgIGZtdD1hb3V0IGJmZF9nYXM9eWVzIDs7Ci0gICAgICB0aWMzMC0qLSpjb2ZmKikgICAgICAgZm10PWNvZmYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHRpYzgwLSotKikJICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgIHY4NTAtKi0qKQkJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHY4NTBlLSotKikJICAgIGZtdD1lbGYgYmZkX2dhcz15ZXMgOzsKLSAgICAgIHY4NTBlYS0qLSopCSAgICBmbXQ9ZWxmIGJmZF9nYXM9eWVzIDs7Ci0KLSAgICAgIHZheC0qLWJzZCogfCB2YXgtKi11bHRyaXgqKQotCQkJICAgIGZtdD1hb3V0IDs7Ci0gICAgICB2YXgtKi12bXMpICAgICAgICAgICAgZm10PXZtcyA7OwotCi0KLSAgICAgIHo4ay0qLWNvZmYgfCB6OGstKi1zaW0pCi0JCQkgICAgZm10PWNvZmYgOzsKLQotICAgICAgdzY1LSotKikgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0KLSAgICAgICotKi1hb3V0IHwgKi0qLXNjb3V0KQotCQkJICAgIGZtdD1hb3V0IDs7Ci0gICAgICAqLSotbmluZHkqKQotCQkJICAgIGZtdD1ib3V0IDs7Ci0gICAgICAqLSotYnNkKikKLQkJCSAgICBmbXQ9YW91dCBlbT1zdW4zIDs7Ci0gICAgICAqLSotZ2VuZXJpYykgICAgICAgICAgZm10PWdlbmVyaWMgOzsKLSAgICAgICotKi14cmF5IHwgKi0qLWhtcykgICBmbXQ9Y29mZiA7OwotICAgICAgKi0qLXNpbSkgICAgICAgICAgICAgIGZtdD1jb2ZmIDs7Ci0gICAgICAqLSotZWxmIHwgKi0qLXN5c3Y0KiB8ICotKi1zb2xhcmlzKikKLQkJCSAgICBBQ19NU0dfV0FSTihHQVMgc3VwcG9ydCBmb3IgJHtnZW5lcmljX3RhcmdldH0gaXMgaW5jb21wbGV0ZS4pCi0JCQkgICAgZm10PWVsZiBkZXY9eWVzIDs7Ci0gICAgICAqLSotdnh3b3JrcykgICAgICAgICAgZm10PWFvdXQgOzsKLSAgICAgICotKi1uZXR3YXJlKSAgICAgICAgICBmbXQ9ZWxmIDs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAke3RoaXNfdGFyZ2V0fSA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICBlbmRpYW5fZGVmPQotICAgICAgaWYgdGVzdCB4JHtlbmRpYW59ID0geGJpZzsgdGhlbgotCWVuZGlhbl9kZWY9MQotICAgICAgZWxpZiB0ZXN0IHgke2VuZGlhbn0gPSB4bGl0dGxlOyB0aGVuCi0JZW5kaWFuX2RlZj0wCi0gICAgICBmaQotICAgICAgaWYgdGVzdCB4JHtlbmRpYW5fZGVmfSAhPSB4OyB0aGVuCi0JQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOLCAkZW5kaWFuX2RlZiwKLQkJCSAgIFtEZWZpbmUgYXMgMSBpZiBiaWcgZW5kaWFuLl0pCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBjYXNlICR7Y3B1X3R5cGV9LSR7Zm10fSBpbgotICAgICAgYWxwaGEqLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBhcm0tKikJYmZkX2dhcz15ZXMgOzsKLSAgICAjIG5vdCB5ZXQKLSAgICAjIGkzODYtYW91dCkJYmZkX2dhcz1wcmVmZXJyZWQgOzsKLSAgICAgIG1pcHMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIG5zMzJrLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBwcGMtKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgIHNwYXJjLSopCWJmZF9nYXM9eWVzIDs7Ci0gICAgICBzdHJvbmdhcm0tKikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotZWxmKQliZmRfZ2FzPXllcyA7OwotICAgICAgKi1lY29mZikJYmZkX2dhcz15ZXMgOzsKLSAgICAgICotc29tKQliZmRfZ2FzPXllcyA7OwotICAgICAgKikJCTs7Ci0gICAgZXNhYwotCi0jIE90aGVyIHJhbmRvbSBzdHVmZi4KLQotICAgICMgRG8gd2UgbmVlZCB0aGUgb3Bjb2RlcyBsaWJyYXJ5PwotICAgIGNhc2UgJHtjcHVfdHlwZX0gaW4KLSAgICAgIHZheCB8IGkzODYgfCB0aWMzMCkKLQk7OwotCi0gICAgICAqKQotCW5lZWRfb3Bjb2Rlcz15ZXMKLQotCWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0JeWVzKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7Ci0JKm9wY29kZXMqKSBzaGFyZWRfb3Bjb2Rlcz10cnVlIDs7Ci0JKikgc2hhcmVkX29wY29kZXM9ZmFsc2UgOzsKLQllc2FjCi0JaWYgdGVzdCAiJHtzaGFyZWRfb3Bjb2Rlc30iID0gInRydWUiOyB0aGVuCi0JICAjIEEgc2hhcmVkIGxpYm9wY29kZXMgbXVzdCBiZSBsaW5rZWQgYWdhaW5zdCBsaWJiZmQuCi0JICBuZWVkX2JmZD15ZXMKLQlmaQotCTs7Ci0gICAgZXNhYwotCi0gICAgIyBBbnkgb3RoZXIgc3BlY2lhbCBvYmplY3QgZmlsZXMgbmVlZGVkID8KLSAgICBjYXNlICR7Y3B1X3R5cGV9IGluCi0gICAgICBmcjMwIHwgbTMycikKLQl1c2luZ19jZ2VuPXllcwotCTs7Ci0KLSAgICAgIG02OGspCi0JY2FzZSAke2V4dHJhX29iamVjdHN9IGluCi0JKm02OGstcGFyc2UubyopIDs7Ci0JKikgZXh0cmFfb2JqZWN0cz0iJGV4dHJhX29iamVjdHMgbTY4ay1wYXJzZS5vIiA7OwotCWVzYWMKLQk7OwotCi0gICAgICBtaXBzKQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0YmwtcGFyc2UubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtcGFyc2UubyIKLQlmaQotCi0JZWNobyAke2V4dHJhX29iamVjdHN9IHwgZ3JlcCAtcyAiaXRibC1sZXgubyIgCi0JaWYgdGVzdCAkPyAtbmUgMCA7IHRoZW4KLQkgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIGl0YmwtbGV4Lm8iCi0JZmkKLQotCWVjaG8gJHtleHRyYV9vYmplY3RzfSB8IGdyZXAgLXMgIml0Ymwtb3BzLm8iIAotCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCi0JICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBpdGJsLW9wcy5vIgotCWZpCi0JOzsKLQotICAgICAgc3BhcmMpCi0JaWYgdGVzdCAkdGhpc190YXJnZXQgPSAkdGFyZ2V0IDsgdGhlbgotCSAgQUNfREVGSU5FX1VOUVVPVEVEKERFRkFVTFRfQVJDSCwgIiR7YXJjaH0iLCBbRGVmYXVsdCBhcmNoaXRlY3R1cmUuXSkKLQlmaQotCTs7Ci0gICAgICAqKQotCTs7Ci0gICAgZXNhYwotCi0gICAgaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLQljYXNlICJ4JHtleHRyYV9vYmplY3RzfSIgaW4KLQkqY2dlbi5vKikgOzsKLQkqKSBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyBjZ2VuLm8iIDs7Ci0JZXNhYwotICAgIGZpCi0KLSMgU2VlIGlmIHdlIHJlYWxseSBjYW4gc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24gd2l0aCB0aGUgZW11bGF0aW9uIGNvZGUuCi0KLSAgICBpZiB0ZXN0ICR0aGlzX3RhcmdldCA9ICR0YXJnZXQgOyB0aGVuCi0gICAgICBwcmltYXJ5X2JmZF9nYXM9JGJmZF9nYXMKLSAgICAgIG9ial9mb3JtYXQ9JGZtdAotICAgICAgdGVfZmlsZT0kZW0KLQotICAgICAgaWYgdGVzdCAkYmZkX2dhcyA9IG5vIDsgdGhlbgotCSMgQ2FuJ3Qgc3VwcG9ydCBvdGhlciBjb25maWd1cmF0aW9ucyB0aGlzIHdheS4KLQlicmVhawotICAgICAgZmkKLSAgICBlbGlmIHRlc3QgJGJmZF9nYXMgPSBubyA7IHRoZW4KLSAgICAgICMgQ2FuJ3Qgc3VwcG9ydCB0aGlzIGNvbmZpZ3VyYXRpb24uCi0gICAgICBicmVhawotICAgIGZpCi0KLSMgRnJvbSB0YXJnZXQgbmFtZSBhbmQgZm9ybWF0LCBwcm9kdWNlIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZW11bGF0aW9ucy4KLQotICAgIGNhc2UgJHtnZW5lcmljX3RhcmdldH0tJHtmbXR9IGluCi0gICAgICBtaXBzLSotaXJpeDUqLSopCWVtdWxhdGlvbj0ibWlwc2JlbGYgbWlwc2xlbGYgbWlwc2VsZiBtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotICAgICAgbWlwcy0qLWxpbnV4LWdudSotKikgY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVsZiBtaXBzbGVsZiBtaXBzZWxmIG1pcHNiZWNvZmYgbWlwc2xlY29mZiBtaXBzZWNvZmYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYgbWlwc2xlY29mZiBtaXBzYmVjb2ZmIG1pcHNlY29mZiIgOzsKLQkJCWVzYWMgOzsKLSAgICAgIG1pcHMtKi1sbmV3cyotZWNvZmYpIDs7Ci0gICAgICBtaXBzLSotKi1lY29mZikJY2FzZSAiJGVuZGlhbiIgaW4KLQkJCWJpZykJZW11bGF0aW9uPSJtaXBzYmVjb2ZmIG1pcHNsZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJKikJZW11bGF0aW9uPSJtaXBzbGVjb2ZmIG1pcHNiZWNvZmYgbWlwc2Vjb2ZmIiA7OwotCQkJZXNhYyA7OwotICAgICAgbWlwcy0qLSotZWxmKQljYXNlICIkZW5kaWFuIiBpbgotCQkJYmlnKQllbXVsYXRpb249Im1pcHNiZWxmIG1pcHNsZWxmIG1pcHNlbGYiIDs7Ci0JCQkqKQllbXVsYXRpb249Im1pcHNsZWxmIG1pcHNiZWxmIG1pcHNlbGYiIDs7Ci0gICAgICAjIFVuY29tbWVudGluZyB0aGUgbmV4dCBsaW5lIHdpbGwgdHVybiBvbiBzdXBwb3J0IGZvciBpMzg2IENPRkYKLSAgICAgICMgaW4gYW55IGkzODYgRUxGIGNvbmZpZ3VyYXRpb24uICBUaGlzIHByb2JhYmx5IGRvZXNuJ3Qgd29yawotICAgICAgIyBjb3JyZWN0bHkuCi0gICAgICAjIGkzODYtKi0qLWVsZikJZW11bGF0aW9uPSJpMzg2Y29mZiBpMzg2ZWxmIiA7OwotCQkJZXNhYyA7OwotICAgIGVzYWMKLQotICAgIGVtdWxhdGlvbnM9IiRlbXVsYXRpb25zICRlbXVsYXRpb24iCi0KLWRvbmUKLQotIyBBc3NpZ24gZmxvYXRpbmcgcG9pbnQgdHlwZS4gIE1vc3QgcHJvY2Vzc29ycyB3aXRoIEZQIHN1cHBvcnQKLSMgSUVFRSBGUC4gIE9uIHRob3NlIHRoYXQgZG9uJ3Qgc3VwcG9ydCBGUCBhdCBhbGwsIHVzdWFsbHkgSUVFRQotIyBpcyBlbXVsYXRlZC4KLWNhc2UgJHt0YXJnZXRfY3B1fSBpbgotICB2YXggfCB0YWhvZSApCWF0b2Y9JHt0YXJnZXRfY3B1fSA7OwotICAqKQkJYXRvZj1pZWVlIDs7Ci1lc2FjCi0KLWNhc2UgIiR7b2JqX2Zvcm1hdH0iIGluCi0gICIiKSBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IGtub3cgd2hhdCBmb3JtYXQgdG8gdXNlIGZvciB0YXJnZXQgJHt0YXJnZXR9KSA7OwotZXNhYwotCi0jIFVuZm9ydHVuYXRlbHkgdGhlIGNwdSBpbiBjcHUtb3BjLmggZmlsZSBpc24ndCBhbHdheXMgJChUQVJHRVRfQ1BVKS4KLWNnZW5fY3B1X3ByZWZpeD0iIgotaWYgdGVzdCAkdXNpbmdfY2dlbiA9IHllcyA7IHRoZW4KLSAgY2FzZSAke3RhcmdldF9jcHV9IGluCi0gICAgKikgY2dlbl9jcHVfcHJlZml4PSR7dGFyZ2V0X2NwdX0gOzsKLSAgZXNhYwotICBBQ19TVUJTVChjZ2VuX2NwdV9wcmVmaXgpCi0gIEFDX0RFRklORShVU0lOR19DR0VOLCAxLCBbVXNpbmcgY2dlbiBjb2RlP10pCi1maQotCi1kbmwKLWRubCBNYWtlIHN1cmUgdGhlIGRlc2lyZWQgc3VwcG9ydCBmaWxlcyBleGlzdC4KLWRubAotCi1pZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy90Yy0ke3RhcmdldF9jcHVfdHlwZX0uYzsgdGhlbgotICBBQ19NU0dfRVJST1IoR0FTIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0IENQVSAke3RhcmdldF9jcHVfdHlwZX0pCi1maQotCi1pZiB0ZXN0ICEgLXIgJHtzcmNkaXJ9L2NvbmZpZy9vYmotJHtvYmpfZm9ybWF0fS5jOyB0aGVuCi0gIEFDX01TR19FUlJPUihHQVMgZG9lcyBub3QgaGF2ZSBzdXBwb3J0IGZvciBvYmplY3QgZmlsZSBmb3JtYXQgJHtvYmpfZm9ybWF0fSkKLWZpCi0KLWNhc2UgJHt1c2VyX2JmZF9nYXN9LSR7cHJpbWFyeV9iZmRfZ2FzfSBpbgotICB5ZXMteWVzIHwgbm8tbm8pCi0gICAgIyBXZSBkaWRuJ3Qgb3ZlcnJpZGUgdXNlcidzIGNob2ljZS4KLSAgICA7OwotICBuby15ZXMpCi0gICAgQUNfTVNHX1dBUk4oVXNlIG9mIEJGRCBpcyByZXF1aXJlZCBmb3IgJHt0YXJnZXR9OyBvdmVycmlkaW5nIGNvbmZpZyBvcHRpb25zLikKLSAgICA7OwotICBuby1wcmVmZXJyZWQpCi0gICAgcHJpbWFyeV9iZmRfZ2FzPW5vCi0gICAgOzsKLSAgKi1wcmVmZXJyZWQpCi0gICAgcHJpbWFyeV9iZmRfZ2FzPXllcwotICAgIDs7Ci0gIHllcy0qKQotICAgIHByaW1hcnlfYmZkX2dhcz15ZXMKLSAgICA7OwotICAtKikKLSAgICAjIFVzZXIgc3BlY2lmaWVkIG5vdGhpbmcuCi0gICAgOzsKLWVzYWMKLQotIyBTb21lIENPRkYgY29uZmlndXJhdGlvbnMgd2FudCB0aGVzZSByYW5kb20gb3RoZXIgZmxhZ3Mgc2V0LgotY2FzZSAke29ial9mb3JtYXR9IGluCi0gIGNvZmYpCi0gICAgY2FzZSAke3RhcmdldF9jcHVfdHlwZX0gaW4KLSAgICAgIGkzODYpIEFDX0RFRklORShJMzg2Q09GRiwgMSwgW1VzaW5nIGkzODYgQ09GRj9dKSA7OwotICAgICAgbTY4aykgQUNfREVGSU5FKE02OEtDT0ZGLCAxLCBbVXNpbmcgbTY4ayBDT0ZGP10pIDs7Ci0gICAgICBtODhrKSBBQ19ERUZJTkUoTTg4S0NPRkYsIDEsIFtVc2luZyBtODhrIENPRkY/XSkgOzsKLSAgICBlc2FjCi0gICAgOzsKLWVzYWMKLQotIyBHZXR0aW5nIHRoaXMgZG9uZSByaWdodCBpcyBnb2luZyB0byBiZSBhIGJpdGNoLiAgRWFjaCBjb25maWd1cmF0aW9uIHNwZWNpZmllZAotIyB3aXRoIC0tZW5hYmxlLXRhcmdldHM9Li4uIHNob3VsZCBiZSBjaGVja2VkIGZvciBlbnZpcm9ubWVudCwgZm9ybWF0LCBjcHUsIGFuZAotIyBiZmRfZ2FzIHNldHRpbmcuCi0jCi0jIEZvciBlYWNoIGNvbmZpZ3VyYXRpb24sIHRoZSBuZWNlc3Nhcnkgb2JqZWN0IGZpbGUgc3VwcG9ydCBjb2RlIG11c3QgYmUgbGlua2VkCi0jIGluLiAgVGhpcyBtaWdodCBiZSBvbmx5IG9uZSwgaXQgbWlnaHQgYmUgdXAgdG8gZm91ci4gIFRoZSBuZWNlc3NhcnkgZW11bGF0aW9uCi0jIGNvZGUgbmVlZHMgdG8gYmUgcHJvdmlkZWQsIHRvby4KLSMKLSMgQW5kIHRoZW4gdGhlcmUncyAiLS1lbmFibGUtdGFyZ2V0cz1hbGwiLi4uLgotIwotIyBGb3Igbm93LCBqdXN0IGFsd2F5cyBkbyBpdCBmb3IgTUlQUyBFTEYgb3IgRUNPRkYgY29uZmlndXJhdGlvbnMuICBTaWdoLgotCi1mb3JtYXRzPSIke29ial9mb3JtYXR9IgotZW1maWxlcz0iIgotRU1VTEFUSU9OUz0iIgotR0FTX1VOSVEoZW11bGF0aW9ucykKLWZvciBlbSBpbiAuICRlbXVsYXRpb25zIDsgZG8KLSAgY2FzZSAkZW0gaW4KLSAgICAuKQljb250aW51ZSA7OwotICAgIG1pcHNiZWxmIHwgbWlwc2xlbGYpCi0JZm10PWVsZiAgIGZpbGU9bWlwc2VsZiA7OwotICAgIG1pcHNiZWNvZmYgfCBtaXBzbGVjb2ZmKQotCWZtdD1lY29mZiBmaWxlPW1pcHNlY29mZiA7OwotICAgIGkzODZjb2ZmKQotCWZtdD1jb2ZmICBmaWxlPWkzODZjb2ZmIDs7Ci0gICAgaTM4NmVsZikKLQlmbXQ9ZWxmICAgZmlsZT1pMzg2ZWxmIDs7Ci0gIGVzYWMKLSAgZm9ybWF0cz0iJGZvcm1hdHMgJGZtdCIKLSAgZW1maWxlcz0iJGVtZmlsZXMgZS0kZmlsZS5vIgotICBFTVVMQVRJT05TPSIkRU1VTEFUSU9OUyAmJGVtLCIKLWRvbmUKLUdBU19VTklRKGZvcm1hdHMpCi1HQVNfVU5JUShlbWZpbGVzKQotaWYgdGVzdCBgc2V0IC4gJGZvcm1hdHMgOyBzaGlmdCA7IGVjaG8gJCNgIC1ndCAxIDsgdGhlbgotICBmb3IgZm10IGluICRmb3JtYXRzIDsgZG8KLSAgICBjYXNlICRmbXQgaW4KLSAgICAgIGFvdXQpCUFDX0RFRklORShPQkpfTUFZQkVfQU9VVCwgMSwgICAgW2Eub3V0IHN1cHBvcnQ/XSkgICA7OwotICAgICAgYm91dCkJQUNfREVGSU5FKE9CSl9NQVlCRV9CT1VULCAxLCAgICBbYi5vdXQgc3VwcG9ydD9dKSAgIDs7Ci0gICAgICBjb2ZmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0NPRkYsIDEsICAgIFtDT0ZGIHN1cHBvcnQ/XSkgICAgOzsKLSAgICAgIGVjb2ZmKQlBQ19ERUZJTkUoT0JKX01BWUJFX0VDT0ZGLCAxLCAgIFtFQ09GRiBzdXBwb3J0P10pICAgOzsKLSAgICAgIGVsZikJQUNfREVGSU5FKE9CSl9NQVlCRV9FTEYsIDEsICAgICBbRUxGIHN1cHBvcnQ/XSkgICAgIDs7Ci0gICAgICBnZW5lcmljKQlBQ19ERUZJTkUoT0JKX01BWUJFX0dFTkVSSUMsIDEsIFtnZW5lcmljIHN1cHBvcnQ/XSkgOzsKLSAgICAgIGhwMzAwKQlBQ19ERUZJTkUoT0JKX01BWUJFX0hQMzAwLCAxLCAgIFtIUDMwMCBzdXBwb3J0P10pICAgOzsKLSAgICAgIGllZWUpCUFDX0RFRklORShPQkpfTUFZQkVfSUVFRSwgMSwgICAgW0lFRUUgc3VwcG9ydD9dKSAgICA7OwotICAgICAgc29tKQlBQ19ERUZJTkUoT0JKX01BWUJFX1NPTSwgMSwgICAgIFtTT00gc3VwcG9ydD9dKSAgICAgOzsKLSAgICAgIHZtcykJQUNfREVGSU5FKE9CSl9NQVlCRV9WTVMsIDEsICAgICBbVk1TIHN1cHBvcnQ/XSkgICAgIDs7Ci0gICAgZXNhYwotICAgIGV4dHJhX29iamVjdHM9IiRleHRyYV9vYmplY3RzIG9iai0kZm10Lm8iCi0gIGRvbmUKLSAgb2JqX2Zvcm1hdD1tdWx0aQotZmkKLWlmIHRlc3QgYHNldCAuICRlbWZpbGVzIDsgc2hpZnQgOyBlY2hvICQjYCAtZ3QgMCA7IHRoZW4KLSAgdGVfZmlsZT1tdWx0aQotICBleHRyYV9vYmplY3RzPSIkZXh0cmFfb2JqZWN0cyAkZW1maWxlcyIKLSAgREVGQVVMVF9FTVVMQVRJT049YHNldCAuICRlbXVsYXRpb25zIDsgZWNobyAkMmAKLSAgQUNfREVGSU5FKFVTRV9FTVVMQVRJT05TLCAxLCBbVXNlIGVtdWxhdGlvbiBzdXBwb3J0P10pCi1maQotQUNfU1VCU1QoZXh0cmFfb2JqZWN0cykKLUFDX0RFRklORV9VTlFVT1RFRChFTVVMQVRJT05TLCAkRU1VTEFUSU9OUywgW1N1cHBvcnRlZCBlbXVsYXRpb25zLl0pCi1BQ19ERUZJTkVfVU5RVU9URUQoREVGQVVMVF9FTVVMQVRJT04sICIkREVGQVVMVF9FTVVMQVRJT04iLAotCQkgICBbRGVmYXVsdCBlbXVsYXRpb24uXSkKLQotY2FzZSAke3ByaW1hcnlfYmZkX2dhc30tJHt0YXJnZXRfY3B1X3R5cGV9LSR7b2JqX2Zvcm1hdH0gaW4KLSAgeWVzLSotY29mZikJbmVlZF9iZmQ9eWVzIDs7Ci0gIG5vLSotY29mZikJbmVlZF9iZmQ9eWVzCi0JCUFDX0RFRklORShNQU5ZX1NFR01FTlRTLCAxLCBbb2xkIENPRkYgc3VwcG9ydD9dKSA7OwotZXNhYwotCi1yZWplY3RfZGV2X2NvbmZpZ3M9eWVzCi0KLWNhc2UgJHtyZWplY3RfZGV2X2NvbmZpZ3N9LSR7ZGV2fSBpbgotICB5ZXMteWVzKSAjIE9vcHMuCi0gICAgQUNfTVNHX0VSUk9SKEdBUyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAke2dlbmVyaWNfdGFyZ2V0fSBjb25maWd1cmF0aW9uLikKLSAgICA7OwotZXNhYwotCi1BQ19TVUJTVCh0YXJnZXRfY3B1X3R5cGUpCi1BQ19TVUJTVChvYmpfZm9ybWF0KQotQUNfU1VCU1QodGVfZmlsZSkKLUFDX1NVQlNUKGluc3RhbGxfdG9vbGRpcikKLUFDX1NVQlNUKGF0b2YpCi1kbmwgQUNfU1VCU1QoZW11bGF0aW9uKQotCi1jYXNlICIke3ByaW1hcnlfYmZkX2dhc30iIGluCi0gIHllcykJQUNfREVGSU5FKEJGRF9BU1NFTUJMRVIsIDEsIFtVc2UgQkZEIGludGVyZmFjZT9dKQotCW5lZWRfYmZkPXllcyA7OwotZXNhYwotCi0jIGRvIHdlIG5lZWQgdGhlIG9wY29kZXMgbGlicmFyeT8KLWNhc2UgIiR7bmVlZF9vcGNvZGVzfSIgaW4KLXllcykKLSAgT1BDT0RFU19MSUI9Li4vb3Bjb2Rlcy9saWJvcGNvZGVzLmxhCi0gIDs7Ci1lc2FjCi0KLWNhc2UgIiR7bmVlZF9iZmR9IiBpbgoteWVzKQotICBCRkRMSUI9Li4vYmZkL2xpYmJmZC5sYQotICBBTExfT0JKX0RFUFM9IiRBTExfT0JKX0RFUFMgLi4vYmZkL2JmZC5oIgotICA7OwotZXNhYwotCi1BQ19TVUJTVChCRkRMSUIpCi1BQ19TVUJTVChPUENPREVTX0xJQikKLQotQUNfU1VCU1QoQUxMX09CSl9ERVBTKQotCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX0FMSUFTLAkiJHt0YXJnZXRfYWxpYXN9IiwgW1RhcmdldCBhbGlhcy5dKQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9DQU5PTklDQUwsCSIke3RhcmdldH0iLCAgICAgICBbQ2Fub25pY2FsIHRhcmdldC5dKQotQUNfREVGSU5FX1VOUVVPVEVEKFRBUkdFVF9DUFUsCQkiJHt0YXJnZXRfY3B1fSIsICAgW1RhcmdldCBDUFUuXSkKLUFDX0RFRklORV9VTlFVT1RFRChUQVJHRVRfVkVORE9SLAkiJHt0YXJnZXRfdmVuZG9yfSIsIFtUYXJnZXQgdmVuZG9yLl0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVEFSR0VUX09TLAkJIiR7dGFyZ2V0X29zfSIsICAgIFtUYXJnZXQgT1MuXSkKLQotQUNfUFJPR19DQwotCi1BQ19QUk9HX1lBQ0MKLUFNX1BST0dfTEVYCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotQU1fTUFJTlRBSU5FUl9NT0RFCi1BQ19FWEVFWFQKLQotQUNfQ0hFQ0tfSEVBREVSUyhzdHJpbmcuaCBzdGRsaWIuaCBtZW1vcnkuaCBzdHJpbmdzLmggdW5pc3RkLmggc3RkYXJnLmggdmFyYXJncy5oIGVycm5vLmggc3lzL3R5cGVzLmgpCi0KLSMgUHV0IHRoaXMgaGVyZSBzbyB0aGF0IGF1dG9jb25mJ3MgImNyb3NzLWNvbXBpbGluZyIgbWVzc2FnZSBkb2Vzbid0IGNvbmZ1c2UKLSMgcGVvcGxlIHdobyBhcmUgbm90IGNyb3NzLWNvbXBpbGluZyBidXQgYXJlIGNvbXBpbGluZyBjcm9zcy1hc3NlbWJsZXJzLgotQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgY29tcGlsaW5nIGEgY3Jvc3MtYXNzZW1ibGVyKQotaWYgdGVzdCAiJHtob3N0fSIgPSAiJHt0YXJnZXR9IjsgdGhlbgotICBjcm9zc19nYXM9bm8KLWVsc2UKLSAgY3Jvc3NfZ2FzPXllcwotICBBQ19ERUZJTkUoQ1JPU1NfQ09NUElMRSwgMSwgW0NvbXBpbGluZyBjcm9zcy1hc3NlbWJsZXI/XSkKLWZpCi1BQ19NU0dfUkVTVUxUKCRjcm9zc19nYXMpCi0KLWRubCBhbnNpZGVjbC5oIHdpbGwgZGVhbCB3aXRoIGNvbnN0Ci1kbmwgQUNfQ09OU1QKLUFDX0ZVTkNfQUxMT0NBCi1BQ19DX0lOTElORQotCi0jIFZNUyBkb2Vzbid0IGhhdmUgdW5saW5rLgotQUNfQ0hFQ0tfRlVOQ1ModW5saW5rIHJlbW92ZSwgYnJlYWspCi0KLSMgU29tZSBzeXN0ZW1zIGRvbid0IGhhdmUgc2JyaygpLgotQUNfQ0hFQ0tfRlVOQ1Moc2JyaykKLQotIyBTb21lIG5vbi1BTlNJIHByZXByb2Nlc3NvcnMgYm90Y2ggcmVxdW90aW5nIGluc2lkZSBzdHJpbmdzLiAgVGhhdCdzIGJhZAotIyBlbm91Z2gsIGJ1dCBvbiBzb21lIG9mIHRob3NlIHN5c3RlbXMsIHRoZSBhc3NlcnQgbWFjcm8gcmVsaWVzIG9uIHJlcXVvdGluZwotIyB3b3JraW5nIHByb3Blcmx5IQotR0FTX1dPUktJTkdfQVNTRVJUCi0KLSMgT24gc29tZSBzeXN0ZW1zLCB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcyBtYXkgbm90IGRlY2xhcmUgbWFsbG9jLCByZWFsbG9jLAotIyBhbmQgZnJlZS4gIFRoZXJlIGFyZSBwbGFjZXMgd2hlcmUgZ2FzIG5lZWRzIHRoZXNlIGZ1bmN0aW9ucyB0byBoYXZlIGJlZW4KLSMgZGVjbGFyZWQgLS0gc3VjaCBhcyB3aGVuIHRha2luZyB0aGVpciBhZGRyZXNzZXMuCi1nYXNfdGVzdF9oZWFkZXJzPSIKLSNpZmRlZiBIQVZFX01FTU9SWV9ICi0jaW5jbHVkZSA8bWVtb3J5Lmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSIKLUdBU19DSEVDS19ERUNMX05FRURFRChzdHJzdHIsIGYsIGNoYXIgKigqZikoKSwgJGdhc190ZXN0X2hlYWRlcnMpCi1HQVNfQ0hFQ0tfREVDTF9ORUVERUQobWFsbG9jLCBmLCBjaGFyICooKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKGZyZWUsIGYsIHZvaWQgKCpmKSgpLCAkZ2FzX3Rlc3RfaGVhZGVycykKLUdBU19DSEVDS19ERUNMX05FRURFRChzYnJrLCBmLCBjaGFyICooKmYpKCksICRnYXNfdGVzdF9oZWFkZXJzKQotR0FTX0NIRUNLX0RFQ0xfTkVFREVEKGVudmlyb24sIGYsIGNoYXIgKipmLCAkZ2FzX3Rlc3RfaGVhZGVycykKLQotIyBEb2VzIGVycm5vLmggZGVjbGFyZSBlcnJubywgb3IgZG8gd2UgaGF2ZSB0byBhZGQgYSBzZXBhcmF0ZSBkZWNsYXJhdGlvbgotIyBmb3IgaXQ/Ci1HQVNfQ0hFQ0tfREVDTF9ORUVERUQoZXJybm8sIGYsIGludCBmLCBbCi0jaWZkZWYgSEFWRV9FUlJOT19ICi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotXSkKLQotZG5sIFRoaXMgbXVzdCBjb21lIGxhc3QuCi0KLWRubCBXZSB1c2VkIHRvIG1ha2Ugc3ltbGlua3MgdG8gZmlsZXMgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnksIGJ1dCBub3cKLWRubCB3ZSBqdXN0IHVzZSB0aGUgcmlnaHQgbmFtZSBmb3IgLmMgZmlsZXMsIGFuZCBjcmVhdGUgLmggZmlsZXMgaW4KLWRubCB0aGUgYnVpbGQgZGlyZWN0b3J5IHdoaWNoIGluY2x1ZGUgdGhlIHJpZ2h0IC5oIGZpbGUuICBNYWtlIHN1cmUKLWRubCB0aGUgb2xkIHN5bWxpbmtzIGRvbid0IGV4aXN0LCBzbyB0aGF0IGEgcmVjb25maWd1cmUgaW4gYW4gZXhpc3RpbmcKLWRubCBkaXJlY3RvcnkgYmVoYXZlcyByZWFzb25hYmx5LgotCi1BQ19PVVRQVVQoTWFrZWZpbGUgZG9jL01ha2VmaWxlIC5nZGJpbml0OmdkYmluaXQuaW4gcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtybSAtZiB0YXJnLWNwdS5jIHRhcmctY3B1Lmggb2JqLWZvcm1hdC5oIG9iai1mb3JtYXQuYyB0YXJnLWVudi5oIGF0b2YtdGFyZy5jIGl0YmwtY3B1LmgKLSBlY2hvICcjaW5jbHVkZSAidGMtJyIke3RhcmdldF9jcHVfdHlwZX0iJy5oIicgPiB0YXJnLWNwdS5oCi0gZWNobyAnI2luY2x1ZGUgIm9iai0nIiR7b2JqX2Zvcm1hdH0iJy5oIicgPiBvYmotZm9ybWF0LmgKLSBlY2hvICcjaW5jbHVkZSAidGUtJyIke3RlX2ZpbGV9IicuaCInID4gdGFyZy1lbnYuaAotIGVjaG8gJyNpbmNsdWRlICJpdGJsLSciJHt0YXJnZXRfY3B1X3R5cGV9IicuaCInID4gaXRibC1jcHUuaAotIGlmIHRlc3QgIngkY2dlbl9jcHVfcHJlZml4IiAhPSB4IDsgdGhlbgotICAgZWNobyAnI2luY2x1ZGUgIm9wY29kZXMvJyIke2NnZW5fY3B1X3ByZWZpeH0iJy1kZXNjLmgiJyA+IGNnZW4tZGVzYy5oCi0gZmkKLQotIHNlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0sCi1bdGFyZ2V0X2NwdV90eXBlPSR7dGFyZ2V0X2NwdV90eXBlfQotIGNnZW5fY3B1X3ByZWZpeD0ke2NnZW5fY3B1X3ByZWZpeH0KLSBvYmpfZm9ybWF0PSR7b2JqX2Zvcm1hdH0KLSB0ZV9maWxlPSR7dGVfZmlsZX1dKQpkaWZmIC0tZ2l0IGEvZ2FzL2RlYnVnLmMgYi9nYXMvZGVidWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5ZjIzZi4uMDAwMDAwMAotLS0gYS9nYXMvZGVidWcuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgZGVidWcuYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFJvdXRpbmVzIGZvciBkZWJ1ZyB1c2Ugb25seS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotZG1wX2ZyYWdzICgpCi17Ci0gIGZyY2hhaW5TICpjaHA7Ci0gIGNoYXIgKnA7Ci0KLSAgZm9yIChjaHAgPSBmcmNoYWluX3Jvb3Q7IGNocDsgY2hwID0gY2hwLT5mcmNoX25leHQpCi0gICAgewotICAgICAgc3dpdGNoIChjaHAtPmZyY2hfc2VnKQotCXsKLQljYXNlIFNFR19EQVRBOgotCSAgcCA9ICJEYXRhIjsKLQkgIGJyZWFrOwotCWNhc2UgU0VHX1RFWFQ6Ci0JICBwID0gIlRleHQiOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHAgPSAiPz8/IjsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByaW50ZiAoIlxuU0VHTUVOVCAlcyAlZFxuIiwgcCwgY2hwLT5mcmNoX3N1YnNlZyk7Ci0gICAgICBkbXBfZnJhZyAoY2hwLT5mcmNoX3Jvb3QsICJcdCIpOwotICAgIH0KLX0KLQotZG1wX2ZyYWcgKGZwLCBpbmRlbnQpCi0gICAgIHN0cnVjdCBmcmFnICpmcDsKLSAgICAgY2hhciAqaW5kZW50OwotewotICBmb3IgKDsgZnA7IGZwID0gZnAtPmZyX25leHQpCi0gICAgewotICAgICAgcHJpbnRmICgiJXNGUkFHTUVOVCBAIDB4JXhcbiIsIGluZGVudCwgZnApOwotICAgICAgc3dpdGNoIChmcC0+ZnJfdHlwZSkKLQl7Ci0JY2FzZSByc19hbGlnbjoKLQkgIHByaW50ZiAoIiVzcnNfYWxpZ24oJWQpXG4iLCBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotCSAgYnJlYWs7Ci0JY2FzZSByc19maWxsOgotCSAgcHJpbnRmICgiJXNyc19maWxsKCVkKVxuIiwgaW5kZW50LCBmcC0+ZnJfb2Zmc2V0KTsKLQkgIHByaW50ZiAoIiVzIiwgaW5kZW50KTsKLQkgIHZhcl9jaGFycyAoZnAsIGZwLT5mcl92YXIgKyBmcC0+ZnJfZml4KTsKLQkgIHByaW50ZiAoIiVzXHQgcmVwZWF0ZWQgJWQgdGltZXMsIiwKLQkJICBpbmRlbnQsIGZwLT5mcl9vZmZzZXQpOwotCSAgcHJpbnRmICgiIGZpeGVkIGxlbmd0aCBpZiAjIGNoYXJzID09IDApXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfb3JnOgotCSAgcHJpbnRmICgiJXNyc19vcmcoJWQrc3ltIEAweCV4KVxuIiwgaW5kZW50LAotCQkgIGZwLT5mcl9vZmZzZXQsIGZwLT5mcl9zeW1ib2wpOwotCSAgcHJpbnRmICgiJXNmaWxsIHdpdGggIiwgaW5kZW50KTsKLQkgIHZhcl9jaGFycyAoZnAsIDEpOwotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICBwcmludGYgKCIlc21hY2hpbmVfZGVwXG4iLCBpbmRlbnQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIiVzdW5rbm93biB0eXBlXG4iLCBpbmRlbnQpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgcHJpbnRmICgiJXNhZGRyPSVkKDB4JXgpXG4iLCBpbmRlbnQsIGZwLT5mcl9hZGRyZXNzLCBmcC0+ZnJfYWRkcmVzcyk7Ci0gICAgICBwcmludGYgKCIlc2ZyX2ZpeD0lZFxuIiwgaW5kZW50LCBmcC0+ZnJfZml4KTsKLSAgICAgIHByaW50ZiAoIiVzZnJfdmFyPSVkXG4iLCBpbmRlbnQsIGZwLT5mcl92YXIpOwotICAgICAgcHJpbnRmICgiJXNmcl9vZmZzZXQ9JWRcbiIsIGluZGVudCwgZnAtPmZyX29mZnNldCk7Ci0gICAgICBwcmludGYgKCIlc2NoYXJzIEAgMHgleFxuIiwgaW5kZW50LCBmcC0+ZnJfbGl0ZXJhbCk7Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLX0KLQotdmFyX2NoYXJzIChmcCwgbikKLSAgICAgc3RydWN0IGZyYWcgKmZwOwotICAgICBpbnQgbjsKLXsKLSAgdW5zaWduZWQgY2hhciAqcDsKLQotICBmb3IgKHAgPSAodW5zaWduZWQgY2hhciAqKSBmcC0+ZnJfbGl0ZXJhbDsgbjsgbi0tLCBwKyspCi0gICAgewotICAgICAgcHJpbnRmICgiJTAyeCAiLCAqcCk7Ci0gICAgfQotfQotCi0vKiBlbmQgb2YgZGVidWcuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2RlcC1pbi5zZWQgYi9nYXMvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3MWYwZi4uMDAwMDAwMAotLS0gYS9nYXMvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTpsb29wCi0vXFwkL04KLS9cXCQvYiBsb29wCi0KLXMhIC4uL2NvbmZpZy5oISFnCi1zISAuLi8uLi9iZmQvYmZkLmghIWcKLXMhIC4uL2l0YmwtcGFyc2UuaCEhZwotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC9jb25maWchJChzcmNkaXIpL2NvbmZpZyFnCi1zIUBTUkNESVJALy4uL29wY29kZXMhJChzcmNkaXIpLy4uL29wY29kZXMhZwotcyFAU1JDRElSQC8hIWcKLXMhIGNvbmZpZy5oISFnCi1zISBhcy5oISFnCi1zISBhc2ludGwuaCEhZwotcyEgdGFyZy1lbnYuaCEhZwotcyEgb2JqLWZvcm1hdC5oISFnCi1zISB0YXJnLWNwdS5oISFnCi1zISBmbG9udW0uaCEhZwotcyEgZXhwci5oISFnCi1zISB3cml0ZS5oISFnCi1zISBmcmFncy5oISFnCi1zISBoYXNoLmghIWcKLXMhIHJlYWQuaCEhZwotcyEgc3ltYm9scy5oISFnCi1zISB0Yy5oISFnCi1zISBvYmouaCEhZwotcyEgbGlzdGluZy5oISFnCi1zISBiaWdudW0uaCEhZwotcyEgYml0X2ZpeC5oISFnCi1zISBpdGJsLWNwdS5oISFnCi1zISBcJChzcmNkaXIpL2NvbmZpZy90ZS1nZW5lcmljLmghIWcKLXMhIFwkKElOQ0RJUikvbGliaWJlcnR5LmghIWcKLXMhIFwkKElOQ0RJUikvYW5zaWRlY2wuaCEhZwotcyEgXCQoSU5DRElSKS9mb3Blbi1zYW1lLmghIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotLzokL2QKLQotcy9cKC5cezUwXH1bXiBdKlwpIC9cMSBcXFwKLSAgL2cKZGlmZiAtLWdpdCBhL2dhcy9kZXBlbmQuYyBiL2dhcy9kZXBlbmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3YzdjOC4uMDAwMDAwMAotLS0gYS9nYXMvZGVwZW5kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogZGVwZW5kLmMgLSBIYW5kbGUgZGVwZW5kZW5jeSB0cmFja2luZy4KLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFzLmgiCi0KLS8qIFRoZSBmaWxlIHRvIHdyaXRlIHRvLCBvciBOVUxMIGlmIG5vIGRlcGVuZGVuY2llcyBiZWluZyBrZXB0LiAgKi8KLXN0YXRpYyBjaGFyICpkZXBfZmlsZSA9IE5VTEw7Ci0KLXN0cnVjdCBkZXBlbmRlbmN5Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIHN0cnVjdCBkZXBlbmRlbmN5ICpuZXh0OwotfTsKLQotLyogQWxsIHRoZSBmaWxlcyB3ZSBkZXBlbmQgb24uICAqLwotc3RhdGljIHN0cnVjdCBkZXBlbmRlbmN5ICpkZXBfY2hhaW4gPSBOVUxMOwotCi0vKiBDdXJyZW50IGNvbHVtbiBpbiBvdXRwdXQgZmlsZS4gICovCi1zdGF0aWMgaW50IGNvbHVtbiA9IDA7Ci0KLXN0YXRpYyBpbnQgcXVvdGVfc3RyaW5nX2Zvcl9tYWtlIFBBUkFNUyAoKEZJTEUgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCB3cmFwX291dHB1dCBQQVJBTVMgKChGSUxFICosIGNoYXIgKiwgaW50KSk7Ci0KLS8qIE51bWJlciBvZiBjb2x1bW5zIGFsbG93YWJsZS4gICovCi0jZGVmaW5lIE1BWF9DT0xVTU5TIDcyCi0KLQwKLQotLyogU3RhcnQgc2F2aW5nIGRlcGVuZGVuY2llcywgdG8gYmUgd3JpdHRlbiB0byBGSUxFTkFNRS4gIElmIHRoaXMgaXMKLSAgIG5ldmVyIGNhbGxlZCwgdGhlbiBkZXBlbmRlbmN5IHRyYWNraW5nIGlzIHNpbXBseSBza2lwcGVkLiAgKi8KLQotdm9pZAotc3RhcnRfZGVwZW5kZW5jaWVzIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGRlcF9maWxlID0gZmlsZW5hbWU7Ci19Ci0KLS8qIE5vdGljZWQgYSBuZXcgZmlsZW5hbWUsIHNvIHRyeSB0byByZWdpc3RlciBpdC4gICovCi0KLXZvaWQKLXJlZ2lzdGVyX2RlcGVuZGVuY3kgKGZpbGVuYW1lKQotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKmRlcDsKLQotICBpZiAoZGVwX2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChkZXAgPSBkZXBfY2hhaW47IGRlcCAhPSBOVUxMOyBkZXAgPSBkZXAtPm5leHQpCi0gICAgewotICAgICAgaWYgKCEgc3RyY21wIChmaWxlbmFtZSwgZGVwLT5maWxlKSkKLQlyZXR1cm47Ci0gICAgfQotCi0gIGRlcCA9IChzdHJ1Y3QgZGVwZW5kZW5jeSAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBkZXBlbmRlbmN5KSk7Ci0gIGRlcC0+ZmlsZSA9IHhzdHJkdXAgKGZpbGVuYW1lKTsKLSAgZGVwLT5uZXh0ID0gZGVwX2NoYWluOwotICBkZXBfY2hhaW4gPSBkZXA7Ci19Ci0KLS8qIFF1b3RlIGEgZmlsZSBuYW1lIHRoZSB3YXkgYG1ha2UnIHdhbnRzIGl0LCBhbmQgcHJpbnQgaXQgdG8gRklMRS4KLSAgIElmIEZJTEUgaXMgTlVMTCwgZG8gbm8gcHJpbnRpbmcsIGJ1dCByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUKLSAgIHF1b3RlZCBzdHJpbmcuCi0KLSAgIFRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIGdjYyB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcy4gICovCi0KLXN0YXRpYyBpbnQKLXF1b3RlX3N0cmluZ19mb3JfbWFrZSAoZmlsZSwgc3JjKQotICAgICBGSUxFICpmaWxlOwotICAgICBjaGFyICpzcmM7Ci17Ci0gIGNoYXIgKnAgPSBzcmM7Ci0gIGludCBpID0gMDsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSAqcCsrOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdcMCc6Ci0JY2FzZSAnICc6Ci0JY2FzZSAnXHQnOgotCSAgewotCSAgICAvKiBHTlUgbWFrZSB1c2VzIGEgd2VpcmQgcXVvdGluZyBzY2hlbWUgZm9yIHdoaXRlIHNwYWNlLgotCSAgICAgICBBIHNwYWNlIG9yIHRhYiBwcmVjZWRlZCBieSAyTisxIGJhY2tzbGFzaGVzIHJlcHJlc2VudHMKLQkgICAgICAgTiBiYWNrc2xhc2hlcyBmb2xsb3dlZCBieSBzcGFjZTsgYSBzcGFjZSBvciB0YWIKLQkgICAgICAgcHJlY2VkZWQgYnkgMk4gYmFja3NsYXNoZXMgcmVwcmVzZW50cyBOIGJhY2tzbGFzaGVzIGF0Ci0JICAgICAgIHRoZSBlbmQgb2YgYSBmaWxlIG5hbWU7IGFuZCBiYWNrc2xhc2hlcyBpbiBvdGhlcgotCSAgICAgICBjb250ZXh0cyBzaG91bGQgbm90IGJlIGRvdWJsZWQuICAqLwotCSAgICBjaGFyICpxOwotCSAgICBmb3IgKHEgPSBwIC0gMTsgc3JjIDwgcSAmJiBxWy0xXSA9PSAnXFwnOyAgcS0tKQotCSAgICAgIHsKLQkJaWYgKGZpbGUpCi0JCSAgcHV0YyAoJ1xcJywgZmlsZSk7Ci0JCWkrKzsKLQkgICAgICB9Ci0JICB9Ci0JICBpZiAoIWMpCi0JICAgIHJldHVybiBpOwotCSAgaWYgKGZpbGUpCi0JICAgIHB1dGMgKCdcXCcsIGZpbGUpOwotCSAgaSsrOwotCSAgZ290byBvcmRpbmFyeV9jaGFyOwotCSAgCi0JY2FzZSAnJCc6Ci0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoYywgZmlsZSk7Ci0JICBpKys7Ci0JICAvKiBGYWxsIHRocm91Z2guICBUaGlzIGNhbiBtaXNoYW5kbGUgdGhpbmdzIGxpa2UgIiQoIiBidXQKLQkgICAgIHRoZXJlJ3Mgbm8gZWFzeSBmaXguICAqLwotCWRlZmF1bHQ6Ci0Jb3JkaW5hcnlfY2hhcjoKLQkgIC8qIFRoaXMgY2FuIG1pc2hhbmRsZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgIlwwXG4lKj9bXFx+IjsKLQkgICAgIGV4YWN0bHkgd2hpY2ggY2hhcnMgYXJlIG1pc2hhbmRsZWQgZGVwZW5kcyBvbiB0aGUgYG1ha2UnIHZlcnNpb24uCi0JICAgICBXZSBrbm93IG9mIG5vIHBvcnRhYmxlIHNvbHV0aW9uIGZvciB0aGlzOwotCSAgICAgZXZlbiBHTlUgbWFrZSAzLjc2LjEgZG9lc24ndCBzb2x2ZSB0aGUgcHJvYmxlbSBlbnRpcmVseS4KLQkgICAgIChBbHNvLCAnXDAnIGlzIG1pc2hhbmRsZWQgZHVlIHRvIG91ciBjYWxsaW5nIGNvbnZlbnRpb25zLikgICovCi0JICBpZiAoZmlsZSkKLQkgICAgcHV0YyAoYywgZmlsZSk7Ci0JICBpKys7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi0vKiBBcHBlbmQgc29tZSBvdXRwdXQgdG8gdGhlIGZpbGUsIGtlZXBpbmcgdHJhY2sgb2YgY29sdW1ucyBhbmQgZG9pbmcKLSAgIHdyYXBwaW5nIGFzIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyB2b2lkCi13cmFwX291dHB1dCAoZiwgc3RyaW5nLCBzcGFjZXIpCi0gICAgIEZJTEUgKmY7Ci0gICAgIGNoYXIgKnN0cmluZzsKLSAgICAgaW50IHNwYWNlcjsKLXsKLSAgaW50IGxlbiA9IHF1b3RlX3N0cmluZ19mb3JfbWFrZSAoTlVMTCwgc3RyaW5nKTsKLQotICBpZiAobGVuID09IDApCi0gICAgcmV0dXJuOwotCi0gIGlmIChjb2x1bW4gJiYgTUFYX0NPTFVNTlMgLSAxIC8qc3BhY2VyKi8gLSAyIC8qYCBcJyovIDwgY29sdW1uICsgbGVuKQotICAgIHsKLSAgICAgIGZwcmludGYgKGYsICIgXFxcbiAiKTsKLSAgICAgIGNvbHVtbiA9IDA7Ci0gICAgICBpZiAoc3BhY2VyID09ICcgJykKLQlzcGFjZXIgPSAnXDAnOwotICAgIH0KLQotICBpZiAoc3BhY2VyID09ICcgJykKLSAgICB7Ci0gICAgICBwdXRjIChzcGFjZXIsIGYpOwotICAgICAgKytjb2x1bW47Ci0gICAgfQotCi0gIHF1b3RlX3N0cmluZ19mb3JfbWFrZSAoZiwgc3RyaW5nKTsKLSAgY29sdW1uICs9IGxlbjsKLQotICBpZiAoc3BhY2VyID09ICc6JykKLSAgICB7Ci0gICAgICBwdXRjIChzcGFjZXIsIGYpOwotICAgICAgKytjb2x1bW47Ci0gICAgfQotfQotCi0vKiBQcmludCBkZXBlbmRlbmN5IGZpbGUuICAqLwotCi12b2lkCi1wcmludF9kZXBlbmRlbmNpZXMgKCkKLXsKLSAgRklMRSAqZjsKLSAgc3RydWN0IGRlcGVuZGVuY3kgKmRlcDsKLQotICBpZiAoZGVwX2ZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZiA9IGZvcGVuIChkZXBfZmlsZSwgInciKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJDYW4ndCBvcGVuIGAlcycgZm9yIHdyaXRpbmciKSwgZGVwX2ZpbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2x1bW4gPSAwOwotICB3cmFwX291dHB1dCAoZiwgb3V0X2ZpbGVfbmFtZSwgJzonKTsKLSAgZm9yIChkZXAgPSBkZXBfY2hhaW47IGRlcCAhPSBOVUxMOyBkZXAgPSBkZXAtPm5leHQpCi0gICAgd3JhcF9vdXRwdXQgKGYsIGRlcC0+ZmlsZSwgJyAnKTsKLQotICBwdXRjICgnXG4nLCBmKTsKLQotICBpZiAoZmNsb3NlIChmKSkKLSAgICBhc193YXJuIChfKCJDYW4ndCBjbG9zZSBgJXMnIiksIGRlcF9maWxlKTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvTWFrZWZpbGUuYW0gYi9nYXMvZG9jL01ha2VmaWxlLmFtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWY1YTRhLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotIyBXaGF0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCB5b3Ugd2FudDsgImFsbCIgaW5jbHVkZXMgZXZlcnl0aGluZwotQ09ORklHPWFsbAotCi1tYW5fTUFOUyA9IGFzLjEKLQotaW5mb19URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCi0KLWFzY29uZmlnLnRleGk6ICQoQ09ORklHKS50ZXhpCi0Jcm0gLWYgYXNjb25maWcudGV4aQotCWxuIC1zICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkKLQotQ1BVX0RPQ1MgPSBcCi0JYy1hMjlrLnRleGkgXAotCWMtYXJtLnRleGkgXAotCWMtZDEwdi50ZXhpIFwKLQljLWg4MzAwLnRleGkgXAotCWMtaDg1MDAudGV4aSBcCi0JYy1ocHBhLnRleGkgXAotCWMtaTM4Ni50ZXhpIFwKLQljLWk5NjAudGV4aSBcCi0JYy1tNjhrLnRleGkgXAotCWMtbWlwcy50ZXhpIFwKLQljLW5zMzJrLnRleGkgXAotCWMtc2gudGV4aSBcCi0JYy1zcGFyYy50ZXhpIFwKLQljLXZheC50ZXhpIFwKLQljLXY4NTAudGV4aSBcCi0JYy16OGsudGV4aQotCi1nYXN2ZXIudGV4aTogTWFrZWZpbGUKLQlybSAtZiAkQAotCWVjaG8gJ0BzZXQgVkVSU0lPTiAkKFZFUlNJT04pJyA+ICRACi0KLWFzLmluZm86ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLWFzLmR2aTogJChzcmNkaXIpL2FzLnRleGluZm8gYXNjb25maWcudGV4aSBnYXN2ZXIudGV4aSAkKENQVV9ET0NTKQotCi0jIFRoaXMgb25lIGlzbid0IHJlYWR5IGZvciBwcmltZSB0aW1lIHlldC4gIE5vdCBldmVuIGEgbGl0dGxlIGJpdC4KLQotbm9pbnN0X1RFWElORk9TID0gaW50ZXJuYWxzLnRleGkKLQotRElTVENMRUFORklMRVMgPSBhc2NvbmZpZy50ZXhpCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gZ2FzdmVyLnRleGkKZGlmZiAtLWdpdCBhL2dhcy9kb2MvTWFrZWZpbGUuaW4gYi9nYXMvZG9jL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTM5OWYyLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFMTF9PQkpfREVQUyA9IEBBTExfT0JKX0RFUFNACi1BUyA9IEBBU0AKLUJGRExJQiA9IEBCRkRMSUJACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MRVggPSBATEVYQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLU9QQ09ERVNfTElCID0gQE9QQ09ERVNfTElCQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotWUFDQyA9IEBZQUNDQAotYXRvZiA9IEBhdG9mQAotY2dlbl9jcHVfcHJlZml4ID0gQGNnZW5fY3B1X3ByZWZpeEAKLWV4dHJhX29iamVjdHMgPSBAZXh0cmFfb2JqZWN0c0AKLWluc3RhbGxfdG9vbGRpciA9IEBpbnN0YWxsX3Rvb2xkaXJACi1sID0gQGxACi1vYmpfZm9ybWF0ID0gQG9ial9mb3JtYXRACi10YXJnZXRfY3B1X3R5cGUgPSBAdGFyZ2V0X2NwdV90eXBlQAotdGVfZmlsZSA9IEB0ZV9maWxlQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLSMgV2hhdCB2ZXJzaW9uIG9mIHRoZSBtYW51YWwgeW91IHdhbnQ7ICJhbGwiIGluY2x1ZGVzIGV2ZXJ5dGhpbmcKLUNPTkZJRyA9IGFsbAotCi1tYW5fTUFOUyA9IGFzLjEKLQotaW5mb19URVhJTkZPUyA9IGFzLnRleGluZm8gZ2FzcC50ZXhpCi0KLUNQVV9ET0NTID0gXAotCWMtYTI5ay50ZXhpIFwKLQljLWFybS50ZXhpIFwKLQljLWQxMHYudGV4aSBcCi0JYy1oODMwMC50ZXhpIFwKLQljLWg4NTAwLnRleGkgXAotCWMtaHBwYS50ZXhpIFwKLQljLWkzODYudGV4aSBcCi0JYy1pOTYwLnRleGkgXAotCWMtbTY4ay50ZXhpIFwKLQljLW1pcHMudGV4aSBcCi0JYy1uczMyay50ZXhpIFwKLQljLXNoLnRleGkgXAotCWMtc3BhcmMudGV4aSBcCi0JYy12YXgudGV4aSBcCi0JYy12ODUwLnRleGkgXAotCWMtejhrLnRleGkKLQotCi0jIFRoaXMgb25lIGlzbid0IHJlYWR5IGZvciBwcmltZSB0aW1lIHlldC4gIE5vdCBldmVuIGEgbGl0dGxlIGJpdC4KLQotbm9pbnN0X1RFWElORk9TID0gaW50ZXJuYWxzLnRleGkKLQotRElTVENMRUFORklMRVMgPSBhc2NvbmZpZy50ZXhpCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gZ2FzdmVyLnRleGkKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSAuLi9jb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gYXMuaW5mbyBnYXNwLmluZm8KLURWSVMgPSBhcy5kdmkgZ2FzcC5kdmkKLVRFWElORk9TID0gYXMudGV4aW5mbyBnYXNwLnRleGkKLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotTUFOUyA9ICQobWFuX01BTlMpCi0KLU5ST0ZGID0gbnJvZmYKLURJU1RfQ09NTU9OID0gIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5kdmkgLmluZm8gLnBzIC50ZXhpIC50ZXhpbmZvIC50eGkKLSQoc3JjZGlyKS9NYWtlZmlsZS5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCBNYWtlZmlsZS5hbSAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPTUFLRSkgLS1jeWdudXMgZG9jL01ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0KLWFzLmluZm86IGFzLnRleGluZm8KLWFzLmR2aTogYXMudGV4aW5mbwotCi0KLWdhc3AuaW5mbzogZ2FzcC50ZXhpCi1nYXNwLmR2aTogZ2FzcC50ZXhpCi0KLQotRFZJUFMgPSBkdmlwcwotCi0udGV4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpLmR2aToKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4OiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSckKE1BS0VJTkZPKSAtSSAkKHNyY2RpciknICQoVEVYSTJEVkkpICQ8Ci0KLS50ZXhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50ZXhpbmZvLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aS5pbmZvOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0KLS50eGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnR4aToKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotLmR2aS5wczoKLQkkKERWSVBTKSAkPCAtbyAkQAotCi1pbnN0YWxsLWluZm8tYW06ICQoSU5GT19ERVBTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQoaW5mb2RpcikKLQlAbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJGZpbGU7IHRoZW4gZD0uOyBlbHNlIGQ9JChzcmNkaXIpOyBmaTsgXAotCSAgZm9yIGlmaWxlIGluIGBjZCAkJGQgJiYgZWNobyAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldYDsgZG8gXAotCSAgICBpZiB0ZXN0IC1mICQkZC8kJGlmaWxlOyB0aGVuIFwKLQkgICAgICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGUiOyBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQkZC8kJGlmaWxlICQoREVTVERJUikkKGluZm9kaXIpLyQkaWZpbGU7IFwKLQkgICAgZWxzZSA6IDsgZmk7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0JQCQoUE9TVF9JTlNUQUxMKQotCUBpZiAkKFNIRUxMKSAtYyAnaW5zdGFsbC1pbmZvIC0tdmVyc2lvbiB8IHNlZCAxcSB8IGZncmVwIC1zIC12IC1pIGRlYmlhbicgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgIGxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQkgIGZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgICBlY2hvICIgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIjtcCi0JICAgIGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpICQoREVTVERJUikkKGluZm9kaXIpLyQkZmlsZSB8fCA6O1wKLQkgIGRvbmU7IFwKLQllbHNlIDogOyBmaQotCi11bmluc3RhbGwtaW5mbzoKLQkkKFBSRV9VTklOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgaWk9eWVzOyBcCi0JZWxzZSBpaT07IGZpOyBcCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgdGVzdCAteiAiJGlpIiBcCi0JICAgIHx8IGluc3RhbGwtaW5mbyAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIC0tcmVtb3ZlICQkZmlsZTsgXAotCWRvbmUKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgZmlsZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIChjZCAkKERFU1RESVIpJChpbmZvZGlyKSAmJiBybSAtZiAkJGZpbGUgJCRmaWxlLVswLTldICQkZmlsZS1bMC05XVswLTldKTsgXAotCWRvbmUKLQotZGlzdC1pbmZvOiAkKElORk9fREVQUykKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGJhc2UgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkYmFzZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgZmlsZSBpbiBgY2QgJCRkICYmIGV2YWwgZWNobyAkJGJhc2UqYDsgZG8gXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBkb25lOyBcCi0JZG9uZQotCi1tb3N0bHljbGVhbi1hbWluZm86Ci0JLXJtIC1mIGFzLmF1eCBhcy5jcCBhcy5jcHMgYXMuZHZpIGFzLmZuIGFzLmZucyBhcy5reSBhcy5reXMgYXMucHMgXAotCSAgYXMubG9nIGFzLnBnIGFzLnRvYyBhcy50cCBhcy50cHMgYXMudnIgYXMudnJzIGFzLm9wIGFzLnRyIFwKLQkgIGFzLmN2IGFzLmNuIGdhc3AuYXV4IGdhc3AuY3AgZ2FzcC5jcHMgZ2FzcC5kdmkgZ2FzcC5mbiBcCi0JICBnYXNwLmZucyBnYXNwLmt5IGdhc3Aua3lzIGdhc3AucHMgZ2FzcC5sb2cgZ2FzcC5wZyBnYXNwLnRvYyBcCi0JICBnYXNwLnRwIGdhc3AudHBzIGdhc3AudnIgZ2FzcC52cnMgZ2FzcC5vcCBnYXNwLnRyIGdhc3AuY3YgXAotCSAgZ2FzcC5jbgotCi1jbGVhbi1hbWluZm86Ci0KLWRpc3RjbGVhbi1hbWluZm86Ci0KLW1haW50YWluZXItY2xlYW4tYW1pbmZvOgotCWZvciBpIGluICQoSU5GT19ERVBTKTsgZG8gXAotCSAgcm0gLWYgJCRpOyBcCi0JICBpZiB0ZXN0ICJgZWNobyAkJGktWzAtOV0qYCIgIT0gIiQkaS1bMC05XSoiOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRpLVswLTldKjsgXAotCSAgZmk7IFwKLQlkb25lCi1jbGVhbi1pbmZvOiBtb3N0bHljbGVhbi1hbWluZm8KLQotaW5zdGFsbC1tYW4xOgotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobWFuMWRpcikKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkKHNyY2RpcikvJCRpOyB0aGVuIGZpbGU9JChzcmNkaXIpLyQkaTsgXAotCSAgZWxzZSBmaWxlPSQkaTsgZmk7IFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGZpbGUgJChERVNURElSKSQobWFuMWRpcikvJCRpbnN0OyBcCi0JZG9uZQotCi11bmluc3RhbGwtbWFuMToKLQlAbGlzdD0nJChtYW4xX01BTlMpJzsgXAotCWwyPSckKG1hbl9NQU5TKSc7IGZvciBpIGluICQkbDI7IGRvIFwKLQkgIGNhc2UgIiQkaSIgaW4gXAotCSAgICAqLjEqKSBsaXN0PSIkJGxpc3QgJCRpIiA7OyBcCi0JICBlc2FjOyBcCi0JZG9uZTsgXAotCWZvciBpIGluICQkbGlzdDsgZG8gXAotCSAgZXh0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9eLipcXC4vLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaSB8IHNlZCAtZSAncy9cXC5bMC05YS16XSokJC8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpbnN0IHwgc2VkICckKHRyYW5zZm9ybSknYC4kJGV4dDsgXAotCSAgZWNobyAiIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdCI7IFwKLQkgIHJtIC1mICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLWluc3RhbGwtbWFuOiAkKE1BTlMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbC1tYW4xCi11bmluc3RhbGwtbWFuOgotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdW5pbnN0YWxsLW1hbjEKLXRhZ3M6IFRBR1MKLVRBR1M6Ci0KLQotZGlzdGRpciA9ICQodG9wX2J1aWxkZGlyKS8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi0KLXN1YmRpciA9IGRvYwotCi1kaXN0ZGlyOiAkKERJU1RGSUxFUykKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0b3BfZGlzdGRpcj0iJCh0b3BfZGlzdGRpcikiIGRpc3RkaXI9IiQoZGlzdGRpcikiIGRpc3QtaW5mbwotaW5mby1hbTogJChJTkZPX0RFUFMpCi1pbmZvOiBpbmZvLWFtCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLWFtCi1jaGVjay1hbToKLWNoZWNrOiBjaGVjay1hbQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stYW0KLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1hbQotaW5zdGFsbC1leGVjLWFtOgotaW5zdGFsbC1leGVjOiBpbnN0YWxsLWV4ZWMtYW0KLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtYW0KLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtYW0KLXVuaW5zdGFsbC1hbTogdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtYW0KLWFsbC1hbTogTWFrZWZpbGUgJChNQU5TKQotYWxsLXJlZGlyZWN0OiBhbGwtYW0KLWluc3RhbGwtc3RyaXA6Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTPS1zIGluc3RhbGwKLWluc3RhbGxkaXJzOgotCSQobWtpbnN0YWxsZGlycykgICQoREVTVERJUikkKG1hbmRpcikvbWFuMQotCi0KLW1vc3RseWNsZWFuLWdlbmVyaWM6Ci0KLWNsZWFuLWdlbmVyaWM6Ci0KLWRpc3RjbGVhbi1nZW5lcmljOgotCS1ybSAtZiBNYWtlZmlsZSAkKENPTkZJR19DTEVBTl9GSUxFUykKLQktcm0gLWYgY29uZmlnLmNhY2hlIGNvbmZpZy5sb2cgc3RhbXAtaCBzdGFtcC1oWzAtOV0qCi0JLXRlc3QgLXogIiQoRElTVENMRUFORklMRVMpIiB8fCBybSAtZiAkKERJU1RDTEVBTkZJTEVTKQotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoTUFJTlRBSU5FUkNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW4tYW06ICBjbGVhbi1hbWluZm8gY2xlYW4tZ2VuZXJpYyBtb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tYW0KLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLWFtCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgXAotCQlkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1hbQotCi0uUEhPTlk6IGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBtb3N0bHljbGVhbi1hbWluZm8gXAotZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIFwKLXVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIHVuaW5zdGFsbC1tYW4gdGFncyBkaXN0ZGlyIGluZm8tYW0gaW5mbyBcCi1kdmktYW0gZHZpIGNoZWNrIGNoZWNrLWFtIGluc3RhbGxjaGVjay1hbSBpbnN0YWxsY2hlY2sgaW5zdGFsbC1pbmZvLWFtIFwKLWluc3RhbGwtaW5mbyBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIGluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgXAotaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgXAotaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIFwKLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBtb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLWFzY29uZmlnLnRleGk6ICQoQ09ORklHKS50ZXhpCi0Jcm0gLWYgYXNjb25maWcudGV4aQotCWxuIC1zICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICQoc3JjZGlyKS8kKENPTkZJRykudGV4aSAuL2FzY29uZmlnLnRleGkKLQotZ2FzdmVyLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgJEAKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAotCi1hcy5pbmZvOiAkKHNyY2RpcikvYXMudGV4aW5mbyBhc2NvbmZpZy50ZXhpIGdhc3Zlci50ZXhpICQoQ1BVX0RPQ1MpCi1hcy5kdmk6ICQoc3JjZGlyKS9hcy50ZXhpbmZvIGFzY29uZmlnLnRleGkgZ2FzdmVyLnRleGkgJChDUFVfRE9DUykKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9hbGwudGV4aSBiL2dhcy9kb2MvYWxsLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOTBjNWIuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9hbGwudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLUBjIENvcHlyaWdodCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBHQVMgbWFudWFsCi0KLUBjIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGFsbC1pbmNsdXNpdmUgdmVyc2lvbiBvZiBtYW51YWwKLQotQGMgc3dpdGNoZXM6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AYyBQcm9wZXJ0aWVzIG9mIHRoZSBtYW51YWwKLUBjID09PT09PT09PT09PT09PT09PT09PT09PQotQGMgRGlzY3VzcyBhbGwgYXJjaGl0ZWN0dXJlcz8KLUBzZXQgQUxMLUFSQ0gKLUBjIEEgZ2VuZXJpYyBmb3JtIG9mIG1hbnVhbCAobm90IHRhaWxvcmVkIHRvIHNwZWNpZmljIHRhcmdldCk/Ci1Ac2V0IEdFTkVSSUMKLUBjIEluY2x1ZGUgdGV4dCBvbiBhc3NlbWJsZXIgaW50ZXJuYWxzPwotQGNsZWFyIElOVEVSTkFMUwotQGMgTWFueSBvYmplY3QgZm9ybWF0cyBzdXBwb3J0ZWQgaW4gdGhpcyBjb25maWc/Ci1Ac2V0IE1VTFRJLU9CSgotCi1AYyBPYmplY3QgZm9ybWF0cyBvZiBpbnRlcmVzdAotQGMgPT09PT09PT09PT09PT09PT09PT09PT09PT0KLUBzZXQgQU9VVAotQHNldCBCT1VUCi1Ac2V0IENPRkYKLUBzZXQgRUxGCi1Ac2V0IFNPTQotCi1AYyBDUFVzIG9mIGludGVyZXN0Ci1AYyA9PT09PT09PT09PT09PT09Ci1Ac2V0IEEyOUsKLUBzZXQgQVJDCi1Ac2V0IEFSTQotQHNldCBEMTBWCi1Ac2V0IEQzMFYKLUBzZXQgSDgvMzAwCi1Ac2V0IEg4LzUwMAotQHNldCBTSAotQHNldCBJODAzODYKLUBzZXQgSTk2MAotQHNldCBNQ09SRQotQHNldCBNSVBTCi1Ac2V0IE0zMlIKLUBzZXQgTTY4MFgwCi1Ac2V0IFo4MDAwCi1Ac2V0IFNQQVJDCi1Ac2V0IFZBWAotQHNldCBWWFdPUktTCi1Ac2V0IEhQUEEKLUBzZXQgVjg1MAotCi1AYyBEb2VzIHRoaXMgdmVyc2lvbiBvZiB0aGUgYXNzZW1ibGVyIHVzZSB0aGUgZGlmZmVyZW5jZS10YWJsZSBrbHVnZT8KLUBzZXQgRElGRi1UQkwtS0xVR0UKLQotQGMgRG8gYWxsIG1hY2hpbmVzIGRlc2NyaWJlZCB1c2UgSUVFRSBmbG9hdGluZyBwb2ludD8KLUBjbGVhciBJRUVFRkxPQVQKLQotQGMgSXMgYSB3b3JkIDMyIGJpdHMsIG9yIDE2PwotQGNsZWFyIFczMgotQHNldCBXMTYKLQotQGMgRG8gc3ltYm9scyBoYXZlIGRpZmZlcmVudCBjaGFyYWN0ZXJzIHRoYW4gdXN1YWw/Ci1AY2xlYXIgU1BFQ0lBTC1TWU1TCi0KLUBjIHN0cmluZ3M6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1AYyBOYW1lIG9mIHRoZSBhc3NlbWJsZXI6Ci1Ac2V0IEFTIGFzCi1AYyBOYW1lIG9mIEMgY29tcGlsZXI6Ci1Ac2V0IEdDQyBnY2MKLUBjIE5hbWUgb2YgbGlua2VyOgotQHNldCBMRCBsZAotQGMgVGV4dCBmb3IgdGFyZ2V0IG1hY2hpbmUgKGJlc3Qgbm90IHVzZWQgaW4gZ2VuZXJpYyBjYXNlOyBidXQganVzdCBpbiBjYXNlLi4uKQotQHNldCBUQVJHRVQgbWFjaGluZSBzcGVjaWZpYwotQGMgTmFtZSBvZiBvYmplY3QgZm9ybWF0IE5PVCBTRVQgaW4gZ2VuZXJpYyB2ZXJzaW9uCi1AY2xlYXIgT0JKLU5BTUUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYXMuMSBiL2dhcy9kb2MvYXMuMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRmMjg4Ni4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2FzLjEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLS5cIiBTZWUgc2VjdGlvbiBDT1BZSU5HIGZvciBjb25kaXRpb25zIGZvciByZWRpc3RyaWJ1dGlvbgotLlRIIGFzIDEgIjI5IE1hcmNoIDE5OTYiICJjeWdudXMgc3VwcG9ydCIgIkdOVSBEZXZlbG9wbWVudCBUb29scyIKLQotLlNIIE5BTUUKLUdOVSBhcyBcLSB0aGUgcG9ydGFibGUgR05VIGFzc2VtYmxlci4KLQotLlNIIFNZTk9QU0lTCi0ubmEKLS5CIGFzCi0uUkIgIltcfCIgXC1hICJbXHwiIGRobG5zICJcfF0iIFxjCi1cJlxbXHxcPVxjCi0uSSBmaWxlXGMKLVwmXHxdXHxdCi0uUkIgIltcfCIgXC1EICJcfF0iCi0uUkIgIltcfCIgXC1cLWRlZnN5bVwgU1lNPVZBTCAiXHxdIgotLlJCICJbXHwiIFwtZiAiXHxdIgotLlJCICJbXHwiIFwtXC1nc3RhYnMgIlx8XSIKLS5SQiAiW1x8IiBcLUkKLS5JIHBhdGhcYwotXCZcfF0KLS5SQiAiW1x8IiBcLUsgIlx8XSIKLS5SQiAiW1x8IiBcLUwgIlx8XSIKLS5SQiAiW1x8IiBcLU1cIHxcIFwtXC1tcmkgIlx8XSIKLS5SQiAiW1x8IiBcLW8gCi0uSSBvYmpmaWxlXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1SICJcfF0iCi0uUkIgIltcfCIgXC1cLXRyYWRpdGlvbmFsXC1mb3JtYXQgIlx8XSIKLS5SQiAiW1x8IiBcLXYgIlx8XSIKLS5SQiAiW1x8IiBcLXcgIlx8XSIKLS5SQiAiW1x8IiBcLVxeXC0gIlwgfFwgIiBcYwotLkkgZmlsZXNcYwotXCZcfC5cfC5cfC5cfF0KLQotLkkgaTk2MC1vbmx5IG9wdGlvbnM6Ci0uYnIKLS5SQiAiW1x8IiBcLUFDQSAiXHx8XHwiIFwtQUNBX0EgIlx8fFx8IiBcLUFDQlxjCi0uUkIgIlx8fFx8IiBcLUFDQyAiXHx8XHwiIFwtQUtBICJcfHxcfCIgXC1BS0JcYwotLlJCICJcfHxcfCIgXC1BS0MgIlx8fFx8IiBcLUFNQyAiXHxdIgotLlJCICJbXHwiIFwtYiAiXHxdIgotLlJCICJbXHwiIFwtbm8tcmVsYXggIlx8XSIKLQotLkkgbTY4MHgwLW9ubHkgb3B0aW9uczoKLS5icgotLlJCICJbXHwiIFwtbCAiXHxdIgotLlJCICJbXHwiIFwtbWM2ODAwMCAiXHx8XHwiIFwtbWM2ODAxMCAiXHx8XHwiIFwtbWM2ODAyMCAiXHxdIgotLmFkIGIKLQotLlNIIERFU0NSSVBUSU9OCi1HTlUgXGMKLS5CIGFzXGMKLVwmIGlzIHJlYWxseSBhIGZhbWlseSBvZiBhc3NlbWJsZXJzLiAgCi1JZiB5b3UgdXNlIChvciBoYXZlIHVzZWQpIHRoZSBHTlUgYXNzZW1ibGVyIG9uIG9uZSBhcmNoaXRlY3R1cmUsIHlvdQotc2hvdWxkIGZpbmQgYSBmYWlybHkgc2ltaWxhciBlbnZpcm9ubWVudCB3aGVuIHlvdSB1c2UgaXQgb24gYW5vdGhlcgotYXJjaGl0ZWN0dXJlLiAgRWFjaCB2ZXJzaW9uIGhhcyBtdWNoIGluIGNvbW1vbiB3aXRoIHRoZSBvdGhlcnMsCi1pbmNsdWRpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cywgbW9zdCBhc3NlbWJsZXIgZGlyZWN0aXZlcyAob2Z0ZW4gY2FsbGVkCi1cYwotLkkgcHNldWRvLW9wcylcYwotXCYgYW5kIGFzc2VtYmxlciBzeW50YXguICAKLQotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBzeW50YXggYW5kIHBzZXVkby1vcHMgdXNlZCBieSBHTlUgXGMKLS5CIGFzXGMKLVwmLCBzZWUgYFx8XGMKLS5CIGFzXGMKLVx8JyBlbnRyeSBpbiBcYwotLkIgaW5mbyBcYwotKG9yIHRoZSBtYW51YWwgXGMKLS5JCi0uSQotVXNpbmcgYXM6IFRoZSBHTlUgQXNzZW1ibGVyXGMKLVwmKS4KLQotXGMKLS5CIGFzXGMKLVwmIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBhc3NlbWJsZSB0aGUgb3V0cHV0IG9mIHRoZSBHTlUgQwotY29tcGlsZXIgXGMKLS5CIGdjY1xjCi1cJiBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIgXGMKLS5CIGxkXGMKLVwmLiAgTmV2ZXJ0aGVsZXNzLAotd2UndmUgdHJpZWQgdG8gbWFrZSBcYwotLkIgYXNcYwotXCYgYXNzZW1ibGUgY29ycmVjdGx5IGV2ZXJ5dGhpbmcgdGhhdCB0aGUgbmF0aXZlCi1hc3NlbWJsZXIgd291bGQuCi1UaGlzIGRvZXNuJ3QgbWVhbiBcYwotLkIgYXNcYwotXCYgYWx3YXlzIHVzZXMgdGhlIHNhbWUgc3ludGF4IGFzIGFub3RoZXIKLWFzc2VtYmxlciBmb3IgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlOyBmb3IgZXhhbXBsZSwgd2Uga25vdyBvZiBzZXZlcmFsCi1pbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgNjgweDAgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3ludGF4LgotCi1FYWNoIHRpbWUgeW91IHJ1biBcYwotLkIgYXNcYwotXCYgaXQgYXNzZW1ibGVzIGV4YWN0bHkgb25lIHNvdXJjZQotcHJvZ3JhbS4gIFRoZSBzb3VyY2UgcHJvZ3JhbSBpcyBtYWRlIHVwIG9mIG9uZSBvciBtb3JlIGZpbGVzLgotKFRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhbHNvIGEgZmlsZS4pCi0KLUlmIFxjCi0uQiBhc1xjCi1cJiBpcyBnaXZlbiBubyBmaWxlIG5hbWVzIGl0IGF0dGVtcHRzIHRvIHJlYWQgb25lIGlucHV0IGZpbGUKLWZyb20gdGhlIFxjCi0uQiBhc1xjCi1cJiBzdGFuZGFyZCBpbnB1dCwgd2hpY2ggaXMgbm9ybWFsbHkgeW91ciB0ZXJtaW5hbC4gIFlvdQotbWF5IGhhdmUgdG8gdHlwZSBcYwotLkIgY3RsLURcYwotXCYgdG8gdGVsbCBcYwotLkIgYXNcYwotXCYgdGhlcmUgaXMgbm8gbW9yZSBwcm9ncmFtCi10byBhc3NlbWJsZS4gIFVzZSBgXHxcYwotLkIgXC1cXlwtXGMKLVx8JyBpZiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IG5hbWUgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKLWluIHlvdXIgY29tbWFuZCBsaW5lLgotCi0uQiBhc1xjCi1cJiBtYXkgd3JpdGUgd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHRvIHRoZSBzdGFuZGFyZCBlcnJvcgotZmlsZSAodXN1YWxseSB5b3VyIHRlcm1pbmFsKS4gIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gd2hlbiBcYwotLkIgYXNcYwotXCYgaXMKLXJ1biBhdXRvbWF0aWNhbGx5IGJ5IGEgY29tcGlsZXIuICBXYXJuaW5ncyByZXBvcnQgYW4gYXNzdW1wdGlvbiBtYWRlIHNvCi10aGF0IFxjCi0uQiBhc1xjCi1cJiBjb3VsZCBrZWVwIGFzc2VtYmxpbmcgYSBmbGF3ZWQgcHJvZ3JhbTsgZXJyb3JzIHJlcG9ydCBhCi1ncmF2ZSBwcm9ibGVtIHRoYXQgc3RvcHMgdGhlIGFzc2VtYmx5LgotCi0uU0ggT1BUSU9OUwotLlRQCi0uQlIgXC1hCi1UdXJuIG9uIGFzc2VtYmx5IGxpc3RpbmdzLiAgVGhlcmUgYXJlIHZhcmlvdXMgc3Vib3B0aW9ucy4KLS5CIGQKLW9taXRzIGRlYnVnZ2luZyBkaXJlY3RpdmVzLgotLkIgaAotaW5jbHVkZXMgdGhlIGhpZ2ggbGV2ZWwgc291cmNlIGNvZGU7IHRoaXMgaXMgb25seSBhdmFpbGFibGUgaWYgdGhlCi1zb3VyY2UgZmlsZSBjYW4gYmUgZm91bmQsIGFuZCB0aGUgY29kZSB3YXMgY29tcGlsZWQgd2l0aAotLkIgXC1nLgotLkIgbAotaW5jbHVkZXMgYW4gYXNzZW1ibHkgbGlzdGluZy4KLS5CIG4KLW9taXRzIGZvcm1zIHByb2Nlc3NpbmcuCi0uQiBzCi1pbmNsdWRlcyBhIHN5bWJvbCBsaXN0aW5nLgotLkIgPQotLkkgZmlsZQotc2V0cyB0aGUgbGlzdGluZyBmaWxlIG5hbWU7IHRoaXMgbXVzdCBiZSB0aGUgbGFzdCBzdWJvcHRpb24uCi1UaGUgZGVmYXVsdCBzdWJvcHRpb25zIGFyZQotLkIgaGxzLgotLlRQCi0uQiBcLUQKLVRoaXMgb3B0aW9uIGlzIGFjY2VwdGVkIG9ubHkgZm9yIHNjcmlwdCBjb21wYXRpYmlsaXR5IHdpdGggY2FsbHMgdG8KLW90aGVyIGFzc2VtYmxlcnM7IGl0IGhhcyBubyBlZmZlY3Qgb24gXGMKLS5CIGFzXGMKLVwmLgotLlRQCi0uQiBcLVwtZGVmc3ltIFNZTT1WQUxVRQotRGVmaW5lIHRoZSBzeW1ib2wgU1lNIHRvIGJlIFZBTFVFIGJlZm9yZSBhc3NlbWJsaW5nIHRoZSBpbnB1dCBmaWxlLgotVkFMVUUgbXVzdCBiZSBhbiBpbnRlZ2VyIGNvbnN0YW50LiAgQXMgaW4gQywgYSBsZWFkaW5nIDB4IGluZGljYXRlcyBhCi1oZXhhZGVjaW1hbCB2YWx1ZSwgYW5kIGEgbGVhZGluZyAwIGluZGljYXRlcyBhbiBvY3RhbCB2YWx1ZS4KLS5UUAotLkIgXC1mCi1gYGZhc3QnJy0tc2tpcCBwcmVwcm9jZXNzaW5nIChhc3N1bWUgc291cmNlIGlzIGNvbXBpbGVyIG91dHB1dCkuCi0uVFAKLS5CSSAiXC1JXCAiIHBhdGgKLUFkZCAKLS5JIHBhdGgKLXRvIHRoZSBzZWFyY2ggbGlzdCBmb3IgCi0uQiAuaW5jbHVkZQotZGlyZWN0aXZlcy4KLS5UUAotLkIgXC1cLWdzdGFicwotR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGFzc2VtYmxlciBsaW5lLiAgVGhpcwotbWF5IGhlbHAgZGVidWdnaW5nIGFzc2VtYmxlciBjb2RlLCBpZiB0aGUgZGVidWdnZXIgY2FuIGhhbmRsZSBpdC4KLS5UUAotLkIgXC1LCi1Jc3N1ZSB3YXJuaW5ncyB3aGVuIGRpZmZlcmVuY2UgdGFibGVzIGFsdGVyZWQgZm9yIGxvbmcgZGlzcGxhY2VtZW50cy4KLS5UUAotLkIgXC1MCi1LZWVwIChpbiBzeW1ib2wgdGFibGUpIGxvY2FsIHN5bWJvbHMsIHN0YXJ0aW5nIHdpdGggYFx8XGMKLS5CIExcYwotXHwnCi0uVFAKLS5CIFwtTSwgXC1cLW1yaQotQXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZS4KLS5UUAotLkJJICJcLW9cICIgb2JqZmlsZQotTmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IGZyb20gXGMKLS5CIGFzCi0uVFAKLS5CIFwtUgotRm9sZCBkYXRhIHNlY3Rpb24gaW50byB0ZXh0IHNlY3Rpb24KLS5UUAotLkIgXC1cLXRyYWRpdGlvbmFsXC1mb3JtYXQKLVVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgYXNzZW1ibGVyLCB3aGVuIHBvc3NpYmxlLgotLlRQCi0uQiBcLXYKLUFubm91bmNlIFxjCi0uQiBhc1xjCi1cJiB2ZXJzaW9uCi0uVFAKLS5CIFwtVwotU3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlcwotLlRQCi0uSVIgIlwtXF5cLSIgIlwgfFwgIiAiZmlsZXNcfC5cfC5cfC4iCi1Tb3VyY2UgZmlsZXMgdG8gYXNzZW1ibGUsIG9yIHN0YW5kYXJkIGlucHV0IChcYwotLkJSICJcLVxeXC0iICIpIgotLlRQCi0uQkkgXC1BIHZhcgotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIEludGVsIDk2MC4pCi1TcGVjaWZ5IHdoaWNoIHZhcmlhbnQgb2YgdGhlIDk2MCBhcmNoaXRlY3R1cmUgaXMgdGhlIHRhcmdldC4KLS5UUAotLkIgXC1iCi0uSQotKFdoZW4gY29uZmlndXJlZCBmb3IgSW50ZWwgOTYwLikKLUFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlbi4KLS5UUAotLkIgXC1uby1yZWxheAotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIEludGVsIDk2MC4pCi1EbyBub3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3IgbG9uZyBkaXNwbGFjZW1lbnRzOwotZXJyb3IgaWYgbmVjZXNzYXJ5LgotLlRQCi0uQiBcLWwKLS5JCi0oV2hlbiBjb25maWd1cmVkIGZvciBNb3Rvcm9sYSA2ODAwMCkuICAKLS5icgotU2hvcnRlbiByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCBzeW1ib2xzLCB0byBvbmUgd29yZCBpbnN0ZWFkIG9mIHR3by4KLS5UUAotLkJSICJcLW1jNjgwMDAiICJcfHxcfCIgIlwtbWM2ODAxMCIgIlx8fFx8IiAiXC1tYzY4MDIwIgotLkkKLShXaGVuIGNvbmZpZ3VyZWQgZm9yIE1vdG9yb2xhIDY4MDAwKS4gIAotLmJyCi1TcGVjaWZ5IHdoYXQgcHJvY2Vzc29yIGluIHRoZSA2ODAwMCBmYW1pbHkgaXMgdGhlIHRhcmdldCAoZGVmYXVsdCA2ODAyMCkKLQotLlBQCi1PcHRpb25zIG1heSBiZSBpbiBhbnkgb3JkZXIsIGFuZCBtYXkgYmUKLWJlZm9yZSwgYWZ0ZXIsIG9yIGJldHdlZW4gZmlsZSBuYW1lcy4gIFRoZSBvcmRlciBvZiBmaWxlIG5hbWVzIGlzCi1zaWduaWZpY2FudC4KLQotYFx8XGMKLS5CIFwtXF5cLVxjCi1cfCcgKHR3byBoeXBoZW5zKSBieSBpdHNlbGYgbmFtZXMgdGhlIHN0YW5kYXJkIGlucHV0IGZpbGUKLWV4cGxpY2l0bHksIGFzIG9uZSBvZiB0aGUgZmlsZXMgZm9yIFxjCi0uQiBhc1xjCi1cJiB0byBhc3NlbWJsZS4KLQotRXhjZXB0IGZvciBgXHxcYwotLkIgXC1cXlwtXGMKLVx8JyBhbnkgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRoYXQgYmVnaW5zIHdpdGggYQotaHlwaGVuIChgXHxcYwotLkIgXC1cYwotXHwnKSBpcyBhbiBvcHRpb24uICBFYWNoIG9wdGlvbiBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgotXGMKLS5CIGFzXGMKLVwmLiAgTm8gb3B0aW9uIGNoYW5nZXMgdGhlIHdheSBhbm90aGVyIG9wdGlvbiB3b3Jrcy4gIEFuCi1vcHRpb24gaXMgYSBgXHxcYwotLkIgXC1cYwotXHwnIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIGxldHRlcnM7IHRoZSBjYXNlIG9mCi10aGUgbGV0dGVyIGlzIGltcG9ydGFudC4gICBBbGwgb3B0aW9ucyBhcmUgb3B0aW9uYWwuCi0KLVRoZSBgXHxcYwotLkIgXC1vXGMKLVx8JyBvcHRpb24gZXhwZWN0cyBleGFjdGx5IG9uZSBmaWxlIG5hbWUgdG8gZm9sbG93LiAgVGhlIGZpbGUKLW5hbWUgbWF5IGVpdGhlciBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG9wdGlvbidzIGxldHRlciAoY29tcGF0aWJsZQotd2l0aCBvbGRlciBhc3NlbWJsZXJzKSBvciBpdCBtYXkgYmUgdGhlIG5leHQgY29tbWFuZCBhcmd1bWVudCAoR05VCi1zdGFuZGFyZCkuICAKLQotVGhlc2UgdHdvIGNvbW1hbmQgbGluZXMgYXJlIGVxdWl2YWxlbnQ6Ci0uYnIKLS5CCi1hc1wgXCBcLW9cIFwgbXlcLW9iamVjdFwtZmlsZS5vXCBcIG11bWJsZS5zCi0uYnIKLS5CCi1hc1wgXCBcLW9teVwtb2JqZWN0XC1maWxlLm9cIFwgbXVtYmxlLnMKLQotLlNIICJTRUUgQUxTTyIKLS5SQiAiYFx8IiBhcyAiXHwnIgotZW50cnkgaW4gCi0uQgotaW5mb1xjCi1cJjsgCi0uSQotVXNpbmcgYXM6IFRoZSBHTlUgQXNzZW1ibGVyXGMKLVwmOwotLkJSIGdjYyAiKCIgMSAiKSwiCi0uQlIgbGQgIigiIDEgIikuIgotCi0uU0ggQ09QWUlORwotQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotLlBQCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIHRoaXMKLW1hbnVhbCB1bmRlciB0aGUgY29uZGl0aW9ucyBmb3IgdmVyYmF0aW0gY29weWluZywgcHJvdmlkZWQgdGhhdCB0aGUKLWVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzCi1tYW51YWwgaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQKLXZlcnNpb25zLCBleGNlcHQgdGhhdCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIG1heSBiZSBpbmNsdWRlZCBpbgotdHJhbnNsYXRpb25zIGFwcHJvdmVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gaW5zdGVhZCBvZiBpbgotdGhlIG9yaWdpbmFsIEVuZ2xpc2guCmRpZmYgLS1naXQgYS9nYXMvZG9jL2FzLnRleGluZm8gYi9nYXMvZG9jL2FzLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTM2MmEuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9hcy50ZXhpbmZvCisrKyAvZGV2L251bGwKQEAgLTEsNTMyMiArMCwwIEBACi1caW5wdXQgdGV4aW5mbyBAYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKi1UZXhpbmZvLSotCi1AYyAgQ29weXJpZ2h0IChjKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4Ci1AYyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBVUERBVEUhISAgT24gZnV0dXJlIHVwZGF0ZXMtLQotQGMgICAoMSkgICBjaGVjayBmb3IgbmV3IG1hY2hpbmUtZGVwIGNtZGxpbmUgb3B0aW9ucyBpbgotQGMgICAgICAgICBtZF9wYXJzZV9vcHRpb24gZGVmaW5pdGlvbnMgaW4gY29uZmlnL3RjLSouYwotQGMgICAoMikgICBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0aXZlcywgZXhhbWluZSBtZF9wc2V1ZG9fb3AKLUBjICAgICAgICAgaW4gY29uZmlnL3RjLSouYwotQGMgICAoMykgICBmb3Igb2JqZWN0LWZvcm1hdCBzcGVjaWZpYyBkaXJlY3RpdmVzLCBleGFtaW5lIG9ial9wc2V1ZG9fb3AKLUBjICAgICAgICAgaW4gY29uZmlnL29iai0qLmMgICAgICAgCi1AYyAgICg0KSAgIHBvcnRhYmxlIGRpcmVjdGl2ZXMgaW4gcG90YWJsZVtdIGluIHJlYWQuYwotQGMgJSoqc3RhcnQgb2YgaGVhZGVyCi1Ac2V0ZmlsZW5hbWUgYXMuaW5mbwotQGMgLS0tY29uZmlnLS0tCi1AYyBkZWZhdWx0cywgY29uZmlnIGZpbGUgbWF5IG92ZXJyaWRlOgotQHNldCBoYXZlLXN0YWJzCi1AYyAtLS0KLUBpbmNsdWRlIGFzY29uZmlnLnRleGkKLUBpbmNsdWRlIGdhc3Zlci50ZXhpCi1AYyAtLS0KLUBjIGNvbW1vbiBPUiBjb21iaW5hdGlvbnMgb2YgY29uZGl0aW9ucwotQGlmc2V0IEFPVVQKLUBzZXQgYW91dC1ib3V0Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJNL1RodW1iCi1Ac2V0IEFSTQotQGVuZCBpZnNldAotQGlmc2V0IEJPVVQKLUBzZXQgYW91dC1ib3V0Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvMzAwCi1Ac2V0IEg4Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvNTAwCi1Ac2V0IEg4Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgU0gKLUBzZXQgSDgKLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1Ac2V0IGFibm9ybWFsLXNlcGFyYXRvcgotQGVuZCBpZnNldAotQGMgLS0tLS0tLS0tLS0tCi1AaWZzZXQgR0VORVJJQwotQHNldHRpdGxlIFVzaW5nIEB2YWx1ZXtBU30KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBzZXR0aXRsZSBVc2luZyBAdmFsdWV7QVN9IChAdmFsdWV7VEFSR0VUfSkKLUBlbmQgaWZjbGVhcgotQHNldGNoYXB0ZXJuZXdwYWdlIG9kZAotQGMgJSoqZW5kIG9mIGhlYWRlcgotCi1AYyBAc21hbGxib29rCi1AYyBAc2V0IFNNQUxMCi1AYyBXQVJFISBTb21lIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBzZWN0aW9ucyBjb250YWluIHRhYmxlcyBvZiBtYWNoaW5lCi1AYyBpbnN0cnVjdGlvbnMuICBFeGNlcHQgaW4gbXVsdGktY29sdW1uIGZvcm1hdCwgdGhlc2UgdGFibGVzIGxvb2sgc2lsbHkuCi1AYyBVbmZvcnR1bmF0ZWx5LCBUZXhpbmZvIGRvZXNuJ3QgaGF2ZSBhIGdlbmVyYWwtcHVycG9zZSBtdWx0aS1jb2wgZm9ybWF0LCBzbwotQGMgdGhlIG11bHRpLWNvbCBmb3JtYXQgaXMgZmFrZWQgd2l0aGluIEBleGFtcGxlIHNlY3Rpb25zLgotQGMgCi1AYyBBZ2FpbiB1bmZvcnR1bmF0ZWx5LCB0aGUgbmF0dXJhbCBzaXplIHRoYXQgZml0cyBvbiBhIHBhZ2UsIGZvciB0aGVzZSB0YWJsZXMsCi1AYyBpcyBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90IHNtYWxsYm9vayBpcyB0dXJuZWQgb24uCi1AYyBUaGlzIG1hdHRlcnMsIGJlY2F1c2Ugb2Ygb3JkZXI6IHRleHQgZmxvdyBzd2l0Y2hlcyBjb2x1bW5zIGF0IGVhY2ggcGFnZQotQGMgYnJlYWsuCi1AYyAKLUBjIFRoZSBmb3JtYXQgZmFrZWQgaW4gdGhpcyBzb3VyY2Ugd29ya3MgcmVhc29uYWJseSB3ZWxsIGZvciBzbWFsbGJvb2ssCi1AYyBub3Qgd2VsbCBmb3IgdGhlIGRlZmF1bHQgbGFyZ2UtcGFnZSBmb3JtYXQuICBUaGlzIG1hbnVhbCBleHBlY3RzIHRoYXQgaWYgeW91Ci1AYyB0dXJuIG9uIEBzbWFsbGJvb2ssIHlvdSB3aWxsIGFsc28gdW5jb21tZW50IHRoZSAiQHNldCBTTUFMTCIgdG8gZW5hYmxlIHRoZQotQGMgdGFibGVzIGluIHF1ZXN0aW9uLiAgWW91IGNhbiB0dXJuIG9uIG9uZSB3aXRob3V0IHRoZSBvdGhlciBhdCB5b3VyCi1AYyBkaXNjcmV0aW9uLCBvZiBjb3Vyc2UuIAotQGlmaW5mbwotQHNldCBTTUFMTAotQGMgdGhlIGluc24gdGFibGVzIGxvb2sganVzdCBhcyBzaWxseSBpbiBpbmZvIGZpbGVzIHJlZ2FyZGxlc3Mgb2Ygc21hbGxib29rLAotQGMgbWlnaHQgYXMgd2VsbCBzaG93ICdlbSBhbnl3YXlzLgotQGVuZCBpZmluZm8KLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogQXM6IChhcykuICAgICAgICAgICAgICAgICAgICAgVGhlIEdOVSBhc3NlbWJsZXIuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AZmluYWxvdXQKLUBzeW5jb2RlaW5kZXgga3kgY3AKLQotQGlmaW5mbwotVGhpcyBmaWxlIGRvY3VtZW50cyB0aGUgR05VIEFzc2VtYmxlciAiQHZhbHVle0FTfSIuCi0KLUNvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZXggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcyBtYW51YWwKLXVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUgcmVzdWx0aW5nCi1kZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvCi10aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgaWZpbmZvCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBVc2luZyBAdmFsdWV7QVN9Ci1Ac3VidGl0bGUgVGhlIEBzY3tnbnV9IEFzc2VtYmxlcgotQGlmY2xlYXIgR0VORVJJQwotQHN1YnRpdGxlIGZvciB0aGUgQHZhbHVle1RBUkdFVH0gZmFtaWx5Ci1AZW5kIGlmY2xlYXIKLUBzcCAxCi1Ac3VidGl0bGUgVmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0KLUBzcCAxCi1Ac3AgMTMKLVRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gSW5jLiAgdGhhbmtzIFRoZSBOaWNlIENvbXB1dGVyCi1Db21wYW55IG9mIEF1c3RyYWxpYSBmb3IgbG9hbmluZyBEZWFuIEVsc25lciB0byB3cml0ZSB0aGUKLWZpcnN0IChWYXgpIHZlcnNpb24gb2YgQGNvZGV7YXN9IGZvciBQcm9qZWN0IEBzY3tnbnV9LgotVGhlIHByb3ByaWV0b3JzLCBtYW5hZ2VtZW50IGFuZCBzdGFmZiBvZiBUTkNDQSB0aGFuayBGU0YgZm9yCi1kaXN0cmFjdGluZyB0aGUgYm9zcyB3aGlsZSB0aGV5IGdvdCBzb21lIHdvcmsKLWRvbmUuCi1Ac3AgMwotQGF1dGhvciBEZWFuIEVsc25lciwgSmF5IEZlbmxhc29uICYgZnJpZW5kcwotQHBhZ2UKLUB0ZXgKLXtccGFyc2tpcD0wcHQKLVxoZmlsbCB7XGl0IFVzaW5nIHtcdHQgQHZhbHVle0FTfX19XHBhcgotXGhmaWxsIEVkaXRlZCBieSBDeWdudXMgU3VwcG9ydFxwYXIKLX0KLSUiYm94aXQiIG1hY3JvIGZvciBmaWd1cmVzOgotJU1vZGlmaWVkIGZyb20gS251dGgncyBgYGJveGl0JycgbWFjcm8gZnJvbSBUZVhib29rIChhbnN3ZXIgdG8gZXhlcmNpc2UgMjEuMykKLVxnZGVmXGJveGl0IzEjMntcdmJveHtcaHJ1bGVcaGJveHtcdnJ1bGVca2VybjNwdAotICAgICBcdmJveHtccGFyaW5kZW50PTBwdFxwYXJza2lwPTBwdFxoc2l6ZT0jMVxrZXJuM3B0XHN0cnV0XGhmaWwKLSMyXGhmaWxcc3RydXRca2VybjNwdH1ca2VybjNwdFx2cnVsZX1caHJ1bGV9fSVib3ggd2l0aCB2aXNpYmxlIG91dGxpbmUKLVxnZGVmXGlib3gjMSMye1xoYm94IHRvICMxeyMyXGhmaWx9XGtlcm44cHR9JSBpbnZpc2libGUgYm94Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcyBtYW51YWwKLXVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUgcmVzdWx0aW5nCi1kZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvCi10aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZCB2ZXJzaW9ucy4KLUBlbmQgdGl0bGVwYWdlCi0KLUBpZmluZm8KLUBub2RlIFRvcAotQHRvcCBVc2luZyBAdmFsdWV7QVN9Ci0KLVRoaXMgZmlsZSBpcyBhIHVzZXIgZ3VpZGUgdG8gdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBAY29kZXtAdmFsdWV7QVN9fSB2ZXJzaW9uCi1AdmFsdWV7VkVSU0lPTn0uCi1AaWZjbGVhciBHRU5FUklDCi1UaGlzIHZlcnNpb24gb2YgdGhlIGZpbGUgZGVzY3JpYmVzIEBjb2Rle0B2YWx1ZXtBU319IGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUKLWNvZGUgZm9yIEB2YWx1ZXtUQVJHRVR9IGFyY2hpdGVjdHVyZXMuCi1AZW5kIGlmY2xlYXIKLUBtZW51Ci0qIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3Ci0qIEludm9raW5nOjogICAgICAgICAgICAgICAgICAgIENvbW1hbmQtTGluZSBPcHRpb25zCi0qIFN5bnRheDo6ICAgICAgICAgICAgICAgICAgICAgIFN5bnRheAotKiBTZWN0aW9uczo6ICAgICAgICAgICAgICAgICAgICBTZWN0aW9ucyBhbmQgUmVsb2NhdGlvbgotKiBTeW1ib2xzOjogICAgICAgICAgICAgICAgICAgICBTeW1ib2xzCi0qIEV4cHJlc3Npb25zOjogICAgICAgICAgICAgICAgIEV4cHJlc3Npb25zCi0qIFBzZXVkbyBPcHM6OiAgICAgICAgICAgICAgICAgIEFzc2VtYmxlciBEaXJlY3RpdmVzCi0qIE1hY2hpbmUgRGVwZW5kZW5jaWVzOjogICAgICAgIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi0qIFJlcG9ydGluZyBCdWdzOjogICAgICAgICAgICAgIFJlcG9ydGluZyBCdWdzCi0qIEFja25vd2xlZGdlbWVudHM6OiAgICAgICAgICAgIFdobyBEaWQgV2hhdAotKiBJbmRleDo6ICAgICAgICAgICAgICAgICAgICAgICBJbmRleAotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1Abm9kZSBPdmVydmlldwotQGNoYXB0ZXIgT3ZlcnZpZXcKLUBpZnRleAotVGhpcyBtYW51YWwgaXMgYSB1c2VyIGd1aWRlIHRvIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgQGNvZGV7QHZhbHVle0FTfX0uCi1AaWZjbGVhciBHRU5FUklDCi1UaGlzIHZlcnNpb24gb2YgdGhlIG1hbnVhbCBkZXNjcmliZXMgQGNvZGV7QHZhbHVle0FTfX0gY29uZmlndXJlZCB0byBnZW5lcmF0ZQotY29kZSBmb3IgQHZhbHVle1RBUkdFVH0gYXJjaGl0ZWN0dXJlcy4KLUBlbmQgaWZjbGVhcgotQGVuZCBpZnRleAotCi1AY2luZGV4IGludm9jYXRpb24gc3VtbWFyeQotQGNpbmRleCBvcHRpb24gc3VtbWFyeQotQGNpbmRleCBzdW1tYXJ5IG9mIG9wdGlvbnMKLUhlcmUgaXMgYSBicmllZiBzdW1tYXJ5IG9mIGhvdyB0byBpbnZva2UgQGNvZGV7QHZhbHVle0FTfX0uICBGb3IgZGV0YWlscywKLUBweHJlZntJbnZva2luZywsQ29tYW5kLUxpbmUgT3B0aW9uc30uCi0KLUBjIFdlIGRvbid0IHVzZSBkZWZmbiBhbmQgZnJpZW5kcyBmb3IgdGhlIGZvbGxvd2luZyBiZWNhdXNlIHRoZXkgc2VlbQotQGMgdG8gYmUgbGltaXRlZCB0byBvbmUgbGluZSBmb3IgdGhlIGhlYWRlci4KLUBzbWFsbGV4YW1wbGUKLUB2YWx1ZXtBU30gWyAtYVtjZGhsbnNdWz1maWxlXSBdIFsgLUQgXSAgWyAtLWRlZnN5bSBAdmFye3N5bX09QHZhcnt2YWx9IF0KLSBbIC1mIF0gWyAtLWdzdGFicyBdIFsgLS1oZWxwIF0gWyAtSSBAdmFye2Rpcn0gXSBbIC1KIF0gWyAtSyBdIFsgLUwgXQotIFsgLS1rZWVwLWxvY2FscyBdIFsgLW8gQHZhcntvYmpmaWxlfSBdIFsgLVIgXSBbIC0tc3RhdGlzdGljcyBdIFsgLXYgXQotIFsgLXZlcnNpb24gXSBbIC0tdmVyc2lvbiBdIFsgLVcgXSBbIC13IF0gWyAteCBdIFsgLVogXQotQGlmc2V0IEEyOUsKLUBjIGFtMjlrIGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucwotQGVuZCBpZnNldAotQGlmc2V0IEFSQwotIFsgLW1iaWctZW5kaWFuIHwgLW1saXR0bGUtZW5kaWFuIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0KLSBbIC1tW2FybV0xIHwgLW1bYXJtXTIgfCAtbVthcm1dMjUwIHwgLW1bYXJtXTMgfCAtbVthcm1dNiB8IC1tW2FybV03W3RdW1tkXW1baV1dIF0KLSBbIC1tW2FybV12MiB8IC1tW2FybV12MmEgfCAtbVthcm1ddjMgfCAtbVthcm1ddjNtIHwgLW1bYXJtXXY0IHwgLW1bYXJtXXY0dCBdCi0gWyAtbXRodW1iIHwgLW1hbGwgXQotIFsgLW1mcGExMCB8IC1tZnBhMTEgfCAtbWZwZS1vbGQgfCAtbW5vLWZwdSBdCi0gWyAtRUIgfCAtRUwgXQotIFsgLW1hcGNzLTMyIHwgLW1hcGNzLTI2IF0KLUBlbmQgaWZzZXQKLUBpZnNldCBEMTBWCi0gWyAtTyBdCi1AZW5kIGlmc2V0Ci1AaWZzZXQgRDMwVgotIFsgLU8gfCAtbiB8IC1OIF0KLUBlbmQgaWZzZXQKLUBpZnNldCBIOAotQGMgSGl0YWNoaSBmYW1pbHkgY2hpcHMgaGF2ZSBubyBtYWNoaW5lLWRlcGVuZGVudCBhc3NlbWJsZXIgb3B0aW9ucwotQGVuZCBpZnNldAotQGlmc2V0IEhQUEEKLUBjIEhQUEEgaGFzIG5vIG1hY2hpbmUtZGVwZW5kZW50IGFzc2VtYmxlciBvcHRpb25zICh5ZXQpLgotQGVuZCBpZnNldAotQGlmc2V0IFNQQVJDCi1AYyBUaGUgb3JkZXIgaGVyZSBpcyBpbXBvcnRhbnQuICBTZWUgYy1zcGFyYy50ZXhpLgotIFsgLUF2NiB8IC1BdjcgfCAtQXY4IHwgLUFzcGFyY2xldCB8IC1Bc3BhcmNsaXRlCi0gICAtQXY4cGx1cyB8IC1BdjhwbHVzYSB8IC1BdjkgfCAtQXY5YSBdCi0gWyAteGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2EgXSBbIC1idW1wIF0gWyAtMzIgfCAtNjQgXQotQGVuZCBpZnNldAotQGlmc2V0IFo4MDAwCi1AYyBaODAwMCBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgYXNzZW1ibGVyIG9wdGlvbnMKLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1AYyBzZWUgbWRfcGFyc2Vfb3B0aW9uIGluIHRjLWk5NjAuYwotIFsgLUFDQSB8IC1BQ0FfQSB8IC1BQ0IgfCAtQUNDIHwgLUFLQSB8IC1BS0IgfCAtQUtDIHwgLUFNQyBdCi0gWyAtYiBdIFsgLW5vLXJlbGF4IF0KLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLSBbIC1sIF0gWyAtbTY4MDAwIHwgLW02ODAxMCB8IC1tNjgwMjAgfCAuLi4gXQotQGVuZCBpZnNldAotQGlmc2V0IE1DT1JFCi0gWyAtanNyaTJic3IgXSBbIC1zaWZpbHRlciBdIFsgLXJlbGF4IF0KLUBlbmQgaWZzZXQKLUBpZnNldCBNSVBTCi0gWyAtbm9jcHAgXSBbIC1FTCBdIFsgLUVCIF0gWyAtRyBAdmFye251bX0gXSBbIC1tY3B1PUB2YXJ7Q1BVfSBdCi0gWyAtbWlwczEgXSBbIC1taXBzMiBdIFsgLW1pcHMzIF0gWyAtbTQ2NTAgXSBbIC1uby1tNDY1MCBdCi0gWyAtLXRyYXAgXSBbIC0tYnJlYWsgXQotIFsgLS1lbXVsYXRpb249QHZhcntuYW1lfSBdCi1AZW5kIGlmc2V0Ci0gWyAtLSB8IEB2YXJ7ZmlsZXN9IEBkb3Rze30gXQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtYVtjZGhsbW5zXQotVHVybiBvbiBsaXN0aW5ncywgaW4gYW55IG9mIGEgdmFyaWV0eSBvZiB3YXlzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIC1hYwotb21pdCBmYWxzZSBjb25kaXRpb25hbHMKLQotQGl0ZW0gLWFkCi1vbWl0IGRlYnVnZ2luZyBkaXJlY3RpdmVzCi0KLUBpdGVtIC1haAotaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZQotCi1AaXRlbSAtYWwKLWluY2x1ZGUgYXNzZW1ibHkKLQotQGl0ZW0gLWFtCi1pbmNsdWRlIG1hY3JvIGV4cGFuc2lvbnMKLQotQGl0ZW0gLWFuCi1vbWl0IGZvcm1zIHByb2Nlc3NpbmcKLQotQGl0ZW0gLWFzCi1pbmNsdWRlIHN5bWJvbHMKLQotQGl0ZW0gPWZpbGUKLXNldCB0aGUgbmFtZSBvZiB0aGUgbGlzdGluZyBmaWxlCi1AZW5kIHRhYmxlCi0KLVlvdSBtYXkgY29tYmluZSB0aGVzZSBvcHRpb25zOyBmb3IgZXhhbXBsZSwgdXNlIEBzYW1wey1hbG59IGZvciBhc3NlbWJseQotbGlzdGluZyB3aXRob3V0IGZvcm1zIHByb2Nlc3NpbmcuICBUaGUgQHNhbXB7PWZpbGV9IG9wdGlvbiwgaWYgdXNlZCwgbXVzdCBiZQotdGhlIGxhc3Qgb25lLiAgQnkgaXRzZWxmLCBAc2FtcHstYX0gZGVmYXVsdHMgdG8gQHNhbXB7LWFobHN9LgotCi1AaXRlbSAtRAotSWdub3JlZC4gIFRoaXMgb3B0aW9uIGlzIGFjY2VwdGVkIGZvciBzY3JpcHQgY29tcGF0aWJpbGl0eSB3aXRoIGNhbGxzIHRvCi1vdGhlciBhc3NlbWJsZXJzLgotCi1AaXRlbSAtLWRlZnN5bSBAdmFye3N5bX09QHZhcnt2YWx1ZX0KLURlZmluZSB0aGUgc3ltYm9sIEB2YXJ7c3ltfSB0byBiZSBAdmFye3ZhbHVlfSBiZWZvcmUgYXNzZW1ibGluZyB0aGUgaW5wdXQgZmlsZS4KLUB2YXJ7dmFsdWV9IG11c3QgYmUgYW4gaW50ZWdlciBjb25zdGFudC4gIEFzIGluIEMsIGEgbGVhZGluZyBAc2FtcHsweH0KLWluZGljYXRlcyBhIGhleGFkZWNpbWFsIHZhbHVlLCBhbmQgYSBsZWFkaW5nIEBzYW1wezB9IGluZGljYXRlcyBhbiBvY3RhbCB2YWx1ZS4KLQotQGl0ZW0gLWYKLWBgZmFzdCcnLS0tc2tpcCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50IHByZXByb2Nlc3NpbmcgKGFzc3VtZSBzb3VyY2UgaXMKLWNvbXBpbGVyIG91dHB1dCkuCi0KLUBpdGVtIC0tZ3N0YWJzCi1HZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggYXNzZW1ibGVyIGxpbmUuICBUaGlzCi1tYXkgaGVscCBkZWJ1Z2dpbmcgYXNzZW1ibGVyIGNvZGUsIGlmIHRoZSBkZWJ1Z2dlciBjYW4gaGFuZGxlIGl0LgotCi1AaXRlbSAtLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIGV4aXQuCi0KLUBpdGVtIC1JIEB2YXJ7ZGlyfQotQWRkIGRpcmVjdG9yeSBAdmFye2Rpcn0gdG8gdGhlIHNlYXJjaCBsaXN0IGZvciBAY29kZXsuaW5jbHVkZX0gZGlyZWN0aXZlcy4KLQotQGl0ZW0gLUoKLURvbid0IHdhcm4gYWJvdXQgc2lnbmVkIG92ZXJmbG93LgotCi1AaXRlbSAtSwotQGlmY2xlYXIgRElGRi1UQkwtS0xVR0UKLVRoaXMgb3B0aW9uIGlzIGFjY2VwdGVkIGJ1dCBoYXMgbm8gZWZmZWN0IG9uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHkuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBESUZGLVRCTC1LTFVHRQotSXNzdWUgd2FybmluZ3Mgd2hlbiBkaWZmZXJlbmNlIHRhYmxlcyBhbHRlcmVkIGZvciBsb25nIGRpc3BsYWNlbWVudHMuCi1AZW5kIGlmc2V0Ci0KLUBpdGVtIC1MCi1AaXRlbXggLS1rZWVwLWxvY2FscwotS2VlcCAoaW4gdGhlIHN5bWJvbCB0YWJsZSkgbG9jYWwgc3ltYm9scy4gIE9uIHRyYWRpdGlvbmFsIGEub3V0IHN5c3RlbXMKLXRoZXNlIHN0YXJ0IHdpdGggQHNhbXB7TH0sIGJ1dCBkaWZmZXJlbnQgc3lzdGVtcyBoYXZlIGRpZmZlcmVudCBsb2NhbAotbGFiZWwgcHJlZml4ZXMuCi0KLUBpdGVtIC1vIEB2YXJ7b2JqZmlsZX0KLU5hbWUgdGhlIG9iamVjdC1maWxlIG91dHB1dCBmcm9tIEBjb2Rle0B2YWx1ZXtBU319IEB2YXJ7b2JqZmlsZX0uCi0KLUBpdGVtIC1SCi1Gb2xkIHRoZSBkYXRhIHNlY3Rpb24gaW50byB0aGUgdGV4dCBzZWN0aW9uLgotCi1AaXRlbSAtLXN0YXRpc3RpY3MKLVByaW50IHRoZSBtYXhpbXVtIHNwYWNlIChpbiBieXRlcykgYW5kIHRvdGFsIHRpbWUgKGluIHNlY29uZHMpIHVzZWQgYnkKLWFzc2VtYmx5LgotCi1AaXRlbSAtLXN0cmlwLWxvY2FsLWFic29sdXRlCi1SZW1vdmUgbG9jYWwgYWJzb2x1dGUgc3ltYm9scyBmcm9tIHRoZSBvdXRnb2luZyBzeW1ib2wgdGFibGUuCi0KLUBpdGVtIC12Ci1AaXRlbXggLXZlcnNpb24KLVByaW50IHRoZSBAY29kZXthc30gdmVyc2lvbi4KLQotQGl0ZW0gLS12ZXJzaW9uCi1QcmludCB0aGUgQGNvZGV7YXN9IHZlcnNpb24gYW5kIGV4aXQuCi0KLUBpdGVtIC1XCi1TdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2VzLgotCi1AaXRlbSAtdwotSWdub3JlZC4KLQotQGl0ZW0gLXgKLUlnbm9yZWQuCi0KLUBpdGVtIC1aCi1HZW5lcmF0ZSBhbiBvYmplY3QgZmlsZSBldmVuIGFmdGVyIGVycm9ycy4KLQotQGl0ZW0gLS0gfCBAdmFye2ZpbGVzfSBAZG90c3t9Ci1TdGFuZGFyZCBpbnB1dCwgb3Igc291cmNlIGZpbGVzIHRvIGFzc2VtYmxlLgotCi1AZW5kIHRhYmxlCi0KLUBpZnNldCBBUkMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYW4gQVJDIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQVJDIGVuZGlhbm5lc3MKLUBjaW5kZXggZW5kaWFubmVzcywgQVJDCi1AY2luZGV4IGJpZyBlbmRpYW4gb3V0cHV0LCBBUkMKLUBpdGVtIC1tYmlnLWVuZGlhbgotR2VuZXJhdGUgYGBiaWcgZW5kaWFuJycgZm9ybWF0IG91dHB1dC4KLQotQGNpbmRleCBsaXR0bGUgZW5kaWFuIG91dHB1dCwgQVJDCi1AaXRlbSAtbWxpdHRsZS1lbmRpYW4KLUdlbmVyYXRlIGBgbGl0dGxlIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEFSTQotVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBhdmFpbGFibGUgd2hlbiBAdmFsdWV7QVN9IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBBUk0KLXByb2Nlc3NvciBmYW1pbHkuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLW1bYXJtXTEgfCAtbVthcm1dMiB8IC1tW2FybV0yNTAgfCAtbVthcm1dMyB8IC1tW2FybV02IHwgLW1bYXJtXTdbdF1bW2RdbV0gfCAtbVthcm1ddjIgfCAtbVthcm1ddjJhIHwgLW1bYXJtXXYzIHwgLW1bYXJtXXYzbSB8IC1tW2FybV12NCB8IC1tW2FybV12NHQgCi1TcGVjaWZ5IHdoaWNoIHZhcmlhbnQgb2YgdGhlIEFSTSBhcmNoaXRlY3R1cmUgaXMgdGhlIHRhcmdldC4KLUBpdGVtIC1tdGh1bWIgfCAtbWFsbAotRW5hYmxlIG9yIGRpc2FibGUgVGh1bWIgb25seSBpbnN0cnVjdGlvbiBkZWNvZGluZy4KLUBpdGVtIC1tZnBhMTAgfCAtbWZwYTExIHwgLW1mcGUtb2xkIHwgLW1uby1mcHUKLVNlbGVjdCB3aGljaCBGbG9hdGluZyBQb2ludCBhcmNoaXRjdHVyZSBpcyB0aGUgdGFyZ2V0LgotQGl0ZW0gLW1hcGNzLTMyIHwgLW1hcGNzLTI2Ci1TZWxlY3Qgd2hpY2ggcHJvY2VkdXJlIGNhbGxpbmcgY29udmVudGlvbiBpcyBpbiB1c2UuCi1AaXRlbSAtRUIgfCAtRUwKLVNlbGVjdCBlaXRoZXIgYmlnLWVuZGlhbiAoLUVCKSBvciBsaXR0bGUtZW5kaWFuICgtRUwpIG91dHB1dC4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEQxMFYKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYSBEMTBWIHByb2Nlc3Nvci4KLUB0YWJsZSBAY29kZQotQGNpbmRleCBEMTBWIG9wdGltaXphdGlvbgotQGNpbmRleCBvcHRpbWl6YXRpb24sIEQxMFYKLUBpdGVtIC1PCi1PcHRpbWl6ZSBvdXRwdXQgYnkgcGFyYWxsZWxpemluZyBpbnN0cnVjdGlvbnMuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBEMzBWCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgYSBEMzBWCi1wcm9jZXNzb3IuCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggRDMwViBvcHRpbWl6YXRpb24KLUBjaW5kZXggb3B0aW1pemF0aW9uLCBEMzBWCi1AaXRlbSAtTwotT3B0aW1pemUgb3V0cHV0IGJ5IHBhcmFsbGVsaXppbmcgaW5zdHJ1Y3Rpb25zLgotCi1AY2luZGV4IEQzMFYgbm9wcwotQGl0ZW0gLW4KLVdhcm4gd2hlbiBub3BzIGFyZSBnZW5lcmF0ZWQuCi0KLUBjaW5kZXggRDMwViBub3BzIGFmdGVyIDMyLWJpdCBtdWx0aXBseQotQGl0ZW0gLU4KLVdhcm4gd2hlbiBhIG5vcCBhZnRlciBhIDMyLWJpdCBtdWx0aXBseSBpbnN0cnVjdGlvbiBpcyBnZW5lcmF0ZWQuCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBJOTYwCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IgdGhlCi1JbnRlbCA4MDk2MCBwcm9jZXNzb3IuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUFDQSB8IC1BQ0FfQSB8IC1BQ0IgfCAtQUNDIHwgLUFLQSB8IC1BS0IgfCAtQUtDIHwgLUFNQwotU3BlY2lmeSB3aGljaCB2YXJpYW50IG9mIHRoZSA5NjAgYXJjaGl0ZWN0dXJlIGlzIHRoZSB0YXJnZXQuCi0KLUBpdGVtIC1iCi1BZGQgY29kZSB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQgYnJhbmNoZXMgdGFrZW4uCi0KLUBpdGVtIC1uby1yZWxheAotRG8gbm90IGFsdGVyIGNvbXBhcmUtYW5kLWJyYW5jaCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50czsKLWVycm9yIGlmIG5lY2Vzc2FyeS4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi0KLUBpZnNldCBNNjgwWDAKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvciB0aGUKLU1vdG9yb2xhIDY4MDAwIHNlcmllcy4KLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1sCi1TaG9ydGVuIHJlZmVyZW5jZXMgdG8gdW5kZWZpbmVkIHN5bWJvbHMsIHRvIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvLgotCi1AaXRlbSAtbTY4MDAwIHwgLW02ODAwOCB8IC1tNjgwMTAgfCAtbTY4MDIwIHwgLW02ODAzMCB8IC1tNjgwNDAgfCAtbTY4MDYwCi1AaXRlbXggfCAtbTY4MzAyIHwgLW02ODMzMSB8IC1tNjgzMzIgfCAtbTY4MzMzIHwgLW02ODM0MCB8IC1tY3B1MzIgfCAtbTUyMDAKLVNwZWNpZnkgd2hhdCBwcm9jZXNzb3IgaW4gdGhlIDY4MDAwIGZhbWlseSBpcyB0aGUgdGFyZ2V0LiAgVGhlIGRlZmF1bHQKLWlzIG5vcm1hbGx5IHRoZSA2ODAyMCwgYnV0IHRoaXMgY2FuIGJlIGNoYW5nZWQgYXQgY29uZmlndXJhdGlvbiB0aW1lLgotCi1AaXRlbSAtbTY4ODgxIHwgLW02ODg4MiB8IC1tbm8tNjg4ODEgfCAtbW5vLTY4ODgyCi1UaGUgdGFyZ2V0IG1hY2hpbmUgZG9lcyAob3IgZG9lcyBub3QpIGhhdmUgYSBmbG9hdGluZy1wb2ludCBjb3Byb2Nlc3Nvci4KLVRoZSBkZWZhdWx0IGlzIHRvIGFzc3VtZSBhIGNvcHJvY2Vzc29yIGZvciA2ODAyMCwgNjgwMzAsIGFuZCBjcHUzMi4gIEFsdGhvdWdoCi10aGUgYmFzaWMgNjgwMDAgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgNjg4ODEsIGEgY29tYmluYXRpb24gb2YgdGhlCi10d28gY2FuIGJlIHNwZWNpZmllZCwgc2luY2UgaXQncyBwb3NzaWJsZSB0byBkbyBlbXVsYXRpb24gb2YgdGhlCi1jb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgbWFpbiBwcm9jZXNzb3IuCi0KLUBpdGVtIC1tNjg4NTEgfCAtbW5vLTY4ODUxCi1UaGUgdGFyZ2V0IG1hY2hpbmUgZG9lcyAob3IgZG9lcyBub3QpIGhhdmUgYSBtZW1vcnktbWFuYWdlbWVudAotdW5pdCBjb3Byb2Nlc3Nvci4gIFRoZSBkZWZhdWx0IGlzIHRvIGFzc3VtZSBhbiBNTVUgZm9yIDY4MDIwIGFuZCB1cC4KLQotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotCi1AaWZzZXQgU1BBUkMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZAotZm9yIHRoZSBTUEFSQyBhcmNoaXRlY3R1cmU6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLUF2NiB8IC1BdjcgfCAtQXY4IHwgLUFzcGFyY2xldCB8IC1Bc3BhcmNsaXRlCi1AaXRlbXggLUF2OHBsdXMgfCAtQXY4cGx1c2EgfCAtQXY5IHwgLUF2OWEKLUV4cGxpY2l0bHkgc2VsZWN0IGEgdmFyaWFudCBvZiB0aGUgU1BBUkMgYXJjaGl0ZWN0dXJlLgotCi1Ac2FtcHstQXY4cGx1c30gYW5kIEBzYW1wey1BdjhwbHVzYX0gc2VsZWN0IGEgMzIgYml0IGVudmlyb25tZW50LgotQHNhbXB7LUF2OX0gYW5kIEBzYW1wey1BdjlhfSBzZWxlY3QgYSA2NCBiaXQgZW52aXJvbm1lbnQuCi0KLUBzYW1wey1BdjhwbHVzYX0gYW5kIEBzYW1wey1BdjlhfSBlbmFibGUgdGhlIFNQQVJDIFY5IGluc3RydWN0aW9uIHNldCB3aXRoCi1VbHRyYVNQQVJDIGV4dGVuc2lvbnMuCi0KLUBpdGVtIC14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyB2OSBhc3NlbWJsZXIuICBUaGVzZSBvcHRpb25zIGFyZQotZXF1aXZhbGVudCB0byAtQXY4cGx1cyBhbmQgLUF2OHBsdXNhLCByZXNwZWN0aXZlbHkuCi0KLUBpdGVtIC1idW1wCi1XYXJuIHdoZW4gdGhlIGFzc2VtYmxlciBzd2l0Y2hlcyB0byBhbm90aGVyIGFyY2hpdGVjdHVyZS4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IE1JUFMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIHdoZW4gQHZhbHVle0FTfSBpcyBjb25maWd1cmVkIGZvcgotYSBNSVBTIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtRyBAdmFye251bX0KLVRoaXMgb3B0aW9uIHNldHMgdGhlIGxhcmdlc3Qgc2l6ZSBvZiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZAotaW1wbGljaXRseSB3aXRoIHRoZSBAY29kZXtncH0gcmVnaXN0ZXIuICBJdCBpcyBvbmx5IGFjY2VwdGVkIGZvciB0YXJnZXRzIHRoYXQKLXVzZSBFQ09GRiBmb3JtYXQsIHN1Y2ggYXMgYSBERUNzdGF0aW9uIHJ1bm5pbmcgVWx0cml4LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgOC4KLQotQGNpbmRleCBNSVBTIGVuZGlhbm5lc3MKLUBjaW5kZXggZW5kaWFubmVzcywgTUlQUwotQGNpbmRleCBiaWcgZW5kaWFuIG91dHB1dCwgTUlQUwotQGl0ZW0gLUVCCi1HZW5lcmF0ZSBgYGJpZyBlbmRpYW4nJyBmb3JtYXQgb3V0cHV0LgotCi1AY2luZGV4IGxpdHRsZSBlbmRpYW4gb3V0cHV0LCBNSVBTCi1AaXRlbSAtRUwKLUdlbmVyYXRlIGBgbGl0dGxlIGVuZGlhbicnIGZvcm1hdCBvdXRwdXQuCi0KLUBjaW5kZXggTUlQUyBJU0EKLUBpdGVtIC1taXBzMQotQGl0ZW14IC1taXBzMgotQGl0ZW14IC1taXBzMwotR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbC4KLUBzYW1wey1taXBzMX0gY29ycmVzcG9uZHMgdG8gdGhlIEBzY3tyMjAwMH0gYW5kIEBzY3tyMzAwMH0gcHJvY2Vzc29ycywKLUBzYW1wey1taXBzMn0gdG8gdGhlIEBzY3tyNjAwMH0gcHJvY2Vzc29yLCBhbmQgQHNhbXB7LW1pcHMzfSB0byB0aGUgQHNje3I0MDAwfQotcHJvY2Vzc29yLgotCi1AaXRlbSAtbTQ2NTAKLUBpdGVteCAtbm8tbTQ2NTAKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTIEBzY3tyNDY1MH0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQKLXRoZSBAc2FtcHttYWR9IGFuZCBAc2FtcHttYWR1fSBpbnN0cnVjdGlvbiwgYW5kIHRvIG5vdCBzY2hlZHVsZSBAc2FtcHtub3B9Ci1pbnN0cnVjdGlvbnMgYXJvdW5kIGFjY2Vzc2VzIHRvIHRoZSBAc2FtcHtISX0gYW5kIEBzYW1we0xPfSByZWdpc3RlcnMuCi1Ac2FtcHstbm8tbTQ2NTB9IHR1cm5zIG9mZiB0aGlzIG9wdGlvbi4KLQotQGl0ZW0gLW1jcHU9QHZhcntDUFV9Ci1HZW5lcmF0ZSBjb2RlIGZvciBhIHBhcnRpY3VsYXIgTUlQUyBjcHUuICBUaGlzIGhhcyBsaXR0bGUgZWZmZWN0IG9uIHRoZQotYXNzZW1ibGVyLCBidXQgaXQgaXMgcGFzc2VkIGJ5IEBjb2Rle0B2YWx1ZXtHQ0N9fS4KLQotQGNpbmRleCBlbXVsYXRpb24KLUBpdGVtIC0tZW11bGF0aW9uPUB2YXJ7bmFtZX0KLVRoaXMgb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byBlbXVsYXRlIEBjb2Rle0B2YWx1ZXtBU319IGNvbmZpZ3VyZWQKLWZvciBzb21lIG90aGVyIHRhcmdldCwgaW4gYWxsIHJlc3BlY3RzLCBpbmNsdWRpbmcgb3V0cHV0IGZvcm1hdCAoY2hvb3NpbmcKLWJldHdlZW4gRUxGIGFuZCBFQ09GRiBvbmx5KSwgaGFuZGxpbmcgb2YgcHNldWRvLW9wY29kZXMgd2hpY2ggbWF5IGdlbmVyYXRlCi1kZWJ1Z2dpbmcgaW5mb3JtYXRpb24gb3Igc3RvcmUgc3ltYm9sIHRhYmxlIGluZm9ybWF0aW9uLCBhbmQgZGVmYXVsdAotZW5kaWFubmVzcy4gIFRoZSBhdmFpbGFibGUgY29uZmlndXJhdGlvbiBuYW1lcyBhcmU6IEBzYW1we21pcHNlY29mZn0sCi1Ac2FtcHttaXBzZWxmfSwgQHNhbXB7bWlwc2xlY29mZn0sIEBzYW1we21pcHNiZWNvZmZ9LCBAc2FtcHttaXBzbGVsZn0sCi1Ac2FtcHttaXBzYmVsZn0uICBUaGUgZmlyc3QgdHdvIGRvIG5vdCBhbHRlciB0aGUgZGVmYXVsdCBlbmRpYW5uZXNzIGZyb20gdGhhdAotb2YgdGhlIHByaW1hcnkgdGFyZ2V0IGZvciB3aGljaCB0aGUgYXNzZW1ibGVyIHdhcyBjb25maWd1cmVkOyB0aGUgb3RoZXJzIGNoYW5nZQotdGhlIGRlZmF1bHQgdG8gbGl0dGxlLSBvciBiaWctZW5kaWFuIGFzIGluZGljYXRlZCBieSB0aGUgQHNhbXB7Yn0gb3IgQHNhbXB7bH0KLWluIHRoZSBuYW1lLiAgVXNpbmcgQHNhbXB7LUVCfSBvciBAc2FtcHstRUx9IHdpbGwgb3ZlcnJpZGUgdGhlIGVuZGlhbm5lc3MKLXNlbGVjdGlvbiBpbiBhbnkgY2FzZS4KLQotVGhpcyBvcHRpb24gaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IHdoZW4gdGhlIHByaW1hcnkgdGFyZ2V0Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciBpcyBhIE1JUFMgRUxGIG9yIEVDT0ZGIHRhcmdldC4KLUZ1cnRoZXJtb3JlLCB0aGUgcHJpbWFyeSB0YXJnZXQgb3Igb3RoZXJzIHNwZWNpZmllZCB3aXRoCi1Ac2FtcHstLWVuYWJsZS10YXJnZXRzPUBkb3Rze319IGF0IGNvbmZpZ3VyYXRpb24gdGltZSBtdXN0IGluY2x1ZGUgc3VwcG9ydCBmb3IKLXRoZSBvdGhlciBmb3JtYXQsIGlmIGJvdGggYXJlIHRvIGJlIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlLCB0aGUgSXJpeCA1Ci1jb25maWd1cmF0aW9uIGluY2x1ZGVzIHN1cHBvcnQgZm9yIGJvdGguCi0KLUV2ZW50dWFsbHksIHRoaXMgb3B0aW9uIHdpbGwgc3VwcG9ydCBtb3JlIGNvbmZpZ3VyYXRpb25zLCB3aXRoIG1vcmUKLWZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIGFzc2VtYmxlcidzIGJlaGF2aW9yLCBhbmQgd2lsbCBiZSBzdXBwb3J0ZWQgZm9yCi1tb3JlIHByb2Nlc3NvcnMuCi0KLUBpdGVtIC1ub2NwcAotQGNvZGV7QHZhbHVle0FTfX0gaWdub3JlcyB0aGlzIG9wdGlvbi4gIEl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLXRoZSBuYXRpdmUgdG9vbHMuCi0KLUBuZWVkIDkwMAotQGl0ZW0gLS10cmFwCi1AaXRlbXggLS1uby10cmFwCi1AaXRlbXggLS1icmVhawotQGl0ZW14IC0tbm8tYnJlYWsKLUNvbnRyb2wgaG93IHRvIGRlYWwgd2l0aCBtdWx0aXBsaWNhdGlvbiBvdmVyZmxvdyBhbmQgZGl2aXNpb24gYnkgemVyby4KLUBzYW1wey0tdHJhcH0gb3IgQHNhbXB7LS1uby1icmVha30gKHdoaWNoIGFyZSBzeW5vbnltcykgdGFrZSBhIHRyYXAgZXhjZXB0aW9uCi0oYW5kIG9ubHkgd29yayBmb3IgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbCAyIGFuZCBoaWdoZXIpOwotQHNhbXB7LS1icmVha30gb3IgQHNhbXB7LS1uby10cmFwfSAoYWxzbyBzeW5vbnltcywgYW5kIHRoZSBkZWZhdWx0KSB0YWtlIGEKLWJyZWFrIGV4Y2VwdGlvbi4KLUBlbmQgdGFibGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IE1DT1JFCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSB3aGVuIEB2YWx1ZXtBU30gaXMgY29uZmlndXJlZCBmb3IKLWFuIE1Db3JlIHByb2Nlc3Nvci4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtanNyaTJic3IKLUBpdGVteCAtbm9qc3JpMmJzcgotRW5hYmxlIG9yIGRpc2FibGUgdGhlIEpTUkkgdG8gQlNSIHRyYW5zZm9ybWF0aW9uLiAgQnkgZGVmYXVsdCB0aGlzIGlzIGVuYWJsZWQuCi1UaGUgY29tbWFuZCBsaW5lIG9wdGlvbiBAc2FtcHstbm9qc3JpMmJzcn0gY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBpdC4KLQotQGl0ZW0gLXNpZmlsdGVyCi1AaXRlbXggLW5vc2lmaWx0ZXIKLUVuYWJsZSBvciBkaXNhYmxlIHRoZSBzaWxpY29uIGZpbHRlciBiZWhhdmlvdXIuICBCeSBkZWZhdWx0IHRoaXMgaXMgZGlzYWJsZWQuCi1UaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcmlkZGVuIGJ5IHRoZSBAc2FtcHstc2lmaWx0ZXJ9IGNvbW1hbmQgbGluZSBvcHRpb24uCi0KLUBpdGVtIC1yZWxheAotQWx0ZXIganVtcCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50cy4KLQotCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBtZW51Ci0qIE1hbnVhbDo6ICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZSBvZiB0aGlzIE1hbnVhbAotKiBHTlUgQXNzZW1ibGVyOjogICAgICAgICAgICAgICBUaGUgR05VIEFzc2VtYmxlcgotKiBPYmplY3QgRm9ybWF0czo6ICAgICAgICAgICAgICBPYmplY3QgRmlsZSBGb3JtYXRzCi0qIENvbW1hbmQgTGluZTo6ICAgICAgICAgICAgICAgIENvbW1hbmQgTGluZQotKiBJbnB1dCBGaWxlczo6ICAgICAgICAgICAgICAgICBJbnB1dCBGaWxlcwotKiBPYmplY3Q6OiAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgKE9iamVjdCkgRmlsZQotKiBFcnJvcnM6OiAgICAgICAgICAgICAgICAgICAgICBFcnJvciBhbmQgV2FybmluZyBNZXNzYWdlcwotQGVuZCBtZW51Ci0KLUBub2RlIE1hbnVhbAotQHNlY3Rpb24gU3RydWN0dXJlIG9mIHRoaXMgTWFudWFsCi0KLUBjaW5kZXggbWFudWFsLCBzdHJ1Y3R1cmUgYW5kIHB1cnBvc2UKLVRoaXMgbWFudWFsIGlzIGludGVuZGVkIHRvIGRlc2NyaWJlIHdoYXQgeW91IG5lZWQgdG8ga25vdyB0byB1c2UKLUBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319LiAgV2UgY292ZXIgdGhlIHN5bnRheCBleHBlY3RlZCBpbiBzb3VyY2UgZmlsZXMsIGluY2x1ZGluZwotbm90YXRpb24gZm9yIHN5bWJvbHMsIGNvbnN0YW50cywgYW5kIGV4cHJlc3Npb25zOyB0aGUgZGlyZWN0aXZlcyB0aGF0Ci1AY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kczsgYW5kIG9mIGNvdXJzZSBob3cgdG8gaW52b2tlIEBjb2Rle0B2YWx1ZXtBU319LgotCi1AaWZjbGVhciBHRU5FUklDCi1XZSBhbHNvIGNvdmVyIHNwZWNpYWwgZmVhdHVyZXMgaW4gdGhlIEB2YWx1ZXtUQVJHRVR9Ci1jb25maWd1cmF0aW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319LCBpbmNsdWRpbmcgYXNzZW1ibGVyIGRpcmVjdGl2ZXMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi1UaGlzIG1hbnVhbCBhbHNvIGRlc2NyaWJlcyBzb21lIG9mIHRoZSBtYWNoaW5lLWRlcGVuZGVudCBmZWF0dXJlcyBvZgotdmFyaW91cyBmbGF2b3JzIG9mIHRoZSBhc3NlbWJsZXIuCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggbWFjaGluZSBpbnN0cnVjdGlvbnMgKG5vdCBjb3ZlcmVkKQotT24gdGhlIG90aGVyIGhhbmQsIHRoaXMgbWFudWFsIGlzIEBlbXBoe25vdH0gaW50ZW5kZWQgYXMgYW4gaW50cm9kdWN0aW9uCi10byBwcm9ncmFtbWluZyBpbiBhc3NlbWJseSBsYW5ndWFnZS0tLWxldCBhbG9uZSBwcm9ncmFtbWluZyBpbiBnZW5lcmFsIQotSW4gYSBzaW1pbGFyIHZlaW4sIHdlIG1ha2Ugbm8gYXR0ZW1wdCB0byBpbnRyb2R1Y2UgdGhlIG1hY2hpbmUKLWFyY2hpdGVjdHVyZTsgd2UgZG8gQGVtcGh7bm90fSBkZXNjcmliZSB0aGUgaW5zdHJ1Y3Rpb24gc2V0LCBzdGFuZGFyZAotbW5lbW9uaWNzLCByZWdpc3RlcnMgb3IgYWRkcmVzc2luZyBtb2RlcyB0aGF0IGFyZSBzdGFuZGFyZCB0byBhCi1wYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZS4KLUBpZnNldCBHRU5FUklDCi1Zb3UgbWF5IHdhbnQgdG8gY29uc3VsdCB0aGUgbWFudWZhY3R1cmVyJ3MKLW1hY2hpbmUgYXJjaGl0ZWN0dXJlIG1hbnVhbCBmb3IgdGhpcyBpbmZvcm1hdGlvbi4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOC8zMDAKLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgSDgvMzAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7SDgvMzAwCi1TZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSBBREUtLTYwMi0tMDI1KS4gIEZvciB0aGUgSDgvMzAwSCwKLXNlZSBAY2l0ZXtIOC8zMDBIIFNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBIOC81MDAKLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgSDgvNTAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7SDgvNTAwCi1TZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSBNMjFUMDAxKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBTSAotRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBIaXRhY2hpIFNIIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle1NILU1pY3JvY29tcHV0ZXIgVXNlcidzIE1hbnVhbH0gKEhpdGFjaGkgTWljcm8gU3lzdGVtcywgSW5jLikuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgWjgwMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtaODAwMCBDUFUgVGVjaG5pY2FsIE1hbnVhbH0KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1AYyBJIHRoaW5rIHRoaXMgaXMgcHJlbWF0dXJlLS0tZG9jQGN5Z251cy5jb20sIDE3amFuMTk5MQotQGlnbm9yZQotVGhyb3VnaG91dCB0aGlzIG1hbnVhbCwgd2UgYXNzdW1lIHRoYXQgeW91IGFyZSBydW5uaW5nIEBkZm57R05VfSwKLXRoZSBwb3J0YWJsZSBvcGVyYXRpbmcgc3lzdGVtIGZyb20gdGhlIEBkZm57RnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLn0uICBUaGlzIHJlc3RyaWN0cyBvdXIgYXR0ZW50aW9uIHRvIGNlcnRhaW4ga2luZHMgb2YKLWNvbXB1dGVyIChpbiBwYXJ0aWN1bGFyLCB0aGUga2luZHMgb2YgY29tcHV0ZXJzIHRoYXQgQHNje2dudX0gY2FuIHJ1biBvbik7Ci1vbmNlIHRoaXMgYXNzdW1wdGlvbiBpcyBncmFudGVkIGV4YW1wbGVzIGFuZCBkZWZpbml0aW9ucyBuZWVkIGxlc3MKLXF1YWxpZmljYXRpb24uCi0KLUBjb2Rle0B2YWx1ZXtBU319IGlzIHBhcnQgb2YgYSB0ZWFtIG9mIHByb2dyYW1zIHRoYXQgdHVybiBhIGhpZ2gtbGV2ZWwKLWh1bWFuLXJlYWRhYmxlIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMgaW50byBhIGxvdy1sZXZlbAotY29tcHV0ZXItcmVhZGFibGUgc2VyaWVzIG9mIGluc3RydWN0aW9ucy4gIERpZmZlcmVudCB2ZXJzaW9ucyBvZgotQGNvZGV7QHZhbHVle0FTfX0gYXJlIHVzZWQgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBjb21wdXRlci4KLUBlbmQgaWdub3JlCi0KLUBjIFRoZXJlIHVzZWQgdG8gYmUgYSBzZWN0aW9uICJUZXJtaW5vbG9neSIgaGVyZSwgd2hpY2ggZGVmaW5lZAotQGMgImNvbnRlbnRzIiwgImJ5dGUiLCAid29yZCIsIGFuZCAibG9uZyIuICBEZWZpbmluZyAid29yZCIgdG8gYW55Ci1AYyBwYXJ0aWN1bGFyIHNpemUgaXMgY29uZnVzaW5nIHdoZW4gdGhlIC53b3JkIGRpcmVjdGl2ZSBtYXkgZ2VuZXJhdGUgMTYKLUBjIGJpdHMgb24gb25lIG1hY2hpbmUgYW5kIDMyIGJpdHMgb24gYW5vdGhlcjsgaW4gZ2VuZXJhbCwgZm9yIHRoZSB1c2VyCi1AYyB2ZXJzaW9uIG9mIHRoaXMgbWFudWFsLCBub25lIG9mIHRoZXNlIHRlcm1zIHNlZW0gZXNzZW50aWFsIHRvIGRlZmluZS4KLUBjIFRoZXkgd2VyZSB1c2VkIHZlcnkgbGl0dGxlIGV2ZW4gaW4gdGhlIGZvcm1lciBkcmFmdCBvZiB0aGUgbWFudWFsOwotQGMgdGhpcyBkcmFmdCBtYWtlcyBhbiBlZmZvcnQgdG8gYXZvaWQgdGhlbSAoZXhjZXB0IGluIG5hbWVzIG9mCi1AYyBkaXJlY3RpdmVzKS4KLQotQG5vZGUgR05VIEFzc2VtYmxlcgotQHNlY3Rpb24gVGhlIEdOVSBBc3NlbWJsZXIKLQotQHNje2dudX0gQGNvZGV7YXN9IGlzIHJlYWxseSBhIGZhbWlseSBvZiBhc3NlbWJsZXJzLgotQGlmY2xlYXIgR0VORVJJQwotVGhpcyBtYW51YWwgZGVzY3JpYmVzIEBjb2Rle0B2YWx1ZXtBU319LCBhIG1lbWJlciBvZiB0aGF0IGZhbWlseSB3aGljaCBpcwotY29uZmlndXJlZCBmb3IgdGhlIEB2YWx1ZXtUQVJHRVR9IGFyY2hpdGVjdHVyZXMuCi1AZW5kIGlmY2xlYXIKLUlmIHlvdSB1c2UgKG9yIGhhdmUgdXNlZCkgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciBvbiBvbmUgYXJjaGl0ZWN0dXJlLCB5b3UKLXNob3VsZCBmaW5kIGEgZmFpcmx5IHNpbWlsYXIgZW52aXJvbm1lbnQgd2hlbiB5b3UgdXNlIGl0IG9uIGFub3RoZXIKLWFyY2hpdGVjdHVyZS4gIEVhY2ggdmVyc2lvbiBoYXMgbXVjaCBpbiBjb21tb24gd2l0aCB0aGUgb3RoZXJzLAotaW5jbHVkaW5nIG9iamVjdCBmaWxlIGZvcm1hdHMsIG1vc3QgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgKG9mdGVuIGNhbGxlZAotQGRmbntwc2V1ZG8tb3BzfSkgYW5kIGFzc2VtYmxlciBzeW50YXguQHJlZmlsbAotCi1AY2luZGV4IHB1cnBvc2Ugb2YgQHNje2dudX0gYXNzZW1ibGVyCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYXNzZW1ibGUgdGhlIG91dHB1dCBvZiB0aGUKLUBzY3tnbnV9IEMgY29tcGlsZXIgQGNvZGV7QHZhbHVle0dDQ319IGZvciB1c2UgYnkgdGhlIGxpbmtlcgotQGNvZGV7QHZhbHVle0xEfX0uICBOZXZlcnRoZWxlc3MsIHdlJ3ZlIHRyaWVkIHRvIG1ha2UgQGNvZGV7QHZhbHVle0FTfX0KLWFzc2VtYmxlIGNvcnJlY3RseSBldmVyeXRoaW5nIHRoYXQgb3RoZXIgYXNzZW1ibGVycyBmb3IgdGhlIHNhbWUKLW1hY2hpbmUgd291bGQgYXNzZW1ibGUuCi1AaWZzZXQgVkFYCi1BbnkgZXhjZXB0aW9ucyBhcmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5IChAcHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9KS4KLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLUBjIFRoaXMgcmVtYXJrIHNob3VsZCBhcHBlYXIgaW4gZ2VuZXJpYyB2ZXJzaW9uIG9mIG1hbnVhbDsgYXNzdW1wdGlvbgotQGMgaGVyZSBpcyB0aGF0IGdlbmVyaWMgdmVyc2lvbiBzZXRzIE02ODB4MC4KLVRoaXMgZG9lc24ndCBtZWFuIEBjb2Rle0B2YWx1ZXtBU319IGFsd2F5cyB1c2VzIHRoZSBzYW1lIHN5bnRheCBhcyBhbm90aGVyCi1hc3NlbWJsZXIgZm9yIHRoZSBzYW1lIGFyY2hpdGVjdHVyZTsgZm9yIGV4YW1wbGUsIHdlIGtub3cgb2Ygc2V2ZXJhbAotaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIDY4MHgwIGFzc2VtYmx5IGxhbmd1YWdlIHN5bnRheC4KLUBlbmQgaWZzZXQKLQotVW5saWtlIG9sZGVyIGFzc2VtYmxlcnMsIEBjb2Rle0B2YWx1ZXtBU319IGlzIGRlc2lnbmVkIHRvIGFzc2VtYmxlIGEgc291cmNlCi1wcm9ncmFtIGluIG9uZSBwYXNzIG9mIHRoZSBzb3VyY2UgZmlsZS4gIFRoaXMgaGFzIGEgc3VidGxlIGltcGFjdCBvbiB0aGUKLUBrYmR7Lm9yZ30gZGlyZWN0aXZlIChAcHhyZWZ7T3JnLCxAY29kZXsub3JnfX0pLgotCi1Abm9kZSBPYmplY3QgRm9ybWF0cwotQHNlY3Rpb24gT2JqZWN0IEZpbGUgRm9ybWF0cwotCi1AY2luZGV4IG9iamVjdCBmaWxlIGZvcm1hdAotVGhlIEBzY3tnbnV9IGFzc2VtYmxlciBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIHNldmVyYWwgYWx0ZXJuYXRpdmUKLW9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgdGhlIG1vc3QgcGFydCwgdGhpcyBkb2VzIG5vdCBhZmZlY3QgaG93IHlvdQotd3JpdGUgYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbXM7IGJ1dCBkaXJlY3RpdmVzIGZvciBkZWJ1Z2dpbmcgc3ltYm9scwotYXJlIHR5cGljYWxseSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGZpbGUgZm9ybWF0cy4gIEB4cmVme1N5bWJvbAotQXR0cmlidXRlcywsU3ltYm9sIEF0dHJpYnV0ZXN9LgotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgTVVMVEktT0JKCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZQotQHZhbHVle09CSi1OQU1FfSBmb3JtYXQgb2JqZWN0IGZpbGVzLgotQGVuZCBpZmNsZWFyCi1AYyBUaGUgZm9sbG93aW5nIHNob3VsZCBleGhhdXN0IGFsbCBjb25maWdzIHRoYXQgc2V0IE1VTFRJLU9CSiwgaWRlYWxseQotQGlmc2V0IEEyOUsKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSwgQGNvZGV7QHZhbHVle0FTfX0gY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBlaXRoZXIKLUBjb2Rle2Eub3V0fSBvciBDT0ZGIGZvcm1hdCBvYmplY3QgZmlsZXMuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9LCBAY29kZXtAdmFsdWV7QVN9fSBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGVpdGhlcgotQGNvZGV7Yi5vdXR9IG9yIENPRkYgZm9ybWF0IG9iamVjdCBmaWxlcy4KLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1PbiB0aGUgQHZhbHVle1RBUkdFVH0sIEBjb2Rle0B2YWx1ZXtBU319IGNhbiBiZSBjb25maWd1cmVkIHRvIHByb2R1Y2UgZWl0aGVyCi1TT00gb3IgRUxGIGZvcm1hdCBvYmplY3QgZmlsZXMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgQ29tbWFuZCBMaW5lCi1Ac2VjdGlvbiBDb21tYW5kIExpbmUKLQotQGNpbmRleCBjb21tYW5kIGxpbmUgY29udmVudGlvbnMKLUFmdGVyIHRoZSBwcm9ncmFtIG5hbWUgQGNvZGV7QHZhbHVle0FTfX0sIHRoZSBjb21tYW5kIGxpbmUgbWF5IGNvbnRhaW4KLW9wdGlvbnMgYW5kIGZpbGUgbmFtZXMuICBPcHRpb25zIG1heSBhcHBlYXIgaW4gYW55IG9yZGVyLCBhbmQgbWF5IGJlCi1iZWZvcmUsIGFmdGVyLCBvciBiZXR3ZWVuIGZpbGUgbmFtZXMuICBUaGUgb3JkZXIgb2YgZmlsZSBuYW1lcyBpcwotc2lnbmlmaWNhbnQuCi0KLUBjaW5kZXggc3RhbmRhcmQgaW5wdXQsIGFzIGlucHV0IGZpbGUKLUBraW5kZXggLS0KLUBmaWxley0tfSAodHdvIGh5cGhlbnMpIGJ5IGl0c2VsZiBuYW1lcyB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotZXhwbGljaXRseSwgYXMgb25lIG9mIHRoZSBmaWxlcyBmb3IgQGNvZGV7QHZhbHVle0FTfX0gdG8gYXNzZW1ibGUuCi0KLUBjaW5kZXggb3B0aW9ucywgY29tbWFuZCBsaW5lCi1FeGNlcHQgZm9yIEBzYW1wey0tfSBhbnkgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRoYXQgYmVnaW5zIHdpdGggYQotaHlwaGVuIChAc2FtcHstfSkgaXMgYW4gb3B0aW9uLiAgRWFjaCBvcHRpb24gY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YKLUBjb2Rle0B2YWx1ZXtBU319LiAgTm8gb3B0aW9uIGNoYW5nZXMgdGhlIHdheSBhbm90aGVyIG9wdGlvbiB3b3Jrcy4gIEFuCi1vcHRpb24gaXMgYSBAc2FtcHstfSBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBsZXR0ZXJzOyB0aGUgY2FzZSBvZgotdGhlIGxldHRlciBpcyBpbXBvcnRhbnQuICAgQWxsIG9wdGlvbnMgYXJlIG9wdGlvbmFsLgotCi1Tb21lIG9wdGlvbnMgZXhwZWN0IGV4YWN0bHkgb25lIGZpbGUgbmFtZSB0byBmb2xsb3cgdGhlbS4gIFRoZSBmaWxlCi1uYW1lIG1heSBlaXRoZXIgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBvcHRpb24ncyBsZXR0ZXIgKGNvbXBhdGlibGUKLXdpdGggb2xkZXIgYXNzZW1ibGVycykgb3IgaXQgbWF5IGJlIHRoZSBuZXh0IGNvbW1hbmQgYXJndW1lbnQgKEBzY3tnbnV9Ci1zdGFuZGFyZCkuICBUaGVzZSB0d28gY29tbWFuZCBsaW5lcyBhcmUgZXF1aXZhbGVudDoKLQotQHNtYWxsZXhhbXBsZQotQHZhbHVle0FTfSAtbyBteS1vYmplY3QtZmlsZS5vIG11bWJsZS5zCi1AdmFsdWV7QVN9IC1vbXktb2JqZWN0LWZpbGUubyBtdW1ibGUucwotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgSW5wdXQgRmlsZXMKLUBzZWN0aW9uIElucHV0IEZpbGVzCi0KLUBjaW5kZXggaW5wdXQKLUBjaW5kZXggc291cmNlIHByb2dyYW0KLUBjaW5kZXggZmlsZXMsIGlucHV0Ci1XZSB1c2UgdGhlIHBocmFzZSBAZGZue3NvdXJjZSBwcm9ncmFtfSwgYWJicmV2aWF0ZWQgQGRmbntzb3VyY2V9LCB0bwotZGVzY3JpYmUgdGhlIHByb2dyYW0gaW5wdXQgdG8gb25lIHJ1biBvZiBAY29kZXtAdmFsdWV7QVN9fS4gIFRoZSBwcm9ncmFtIG1heQotYmUgaW4gb25lIG9yIG1vcmUgZmlsZXM7IGhvdyB0aGUgc291cmNlIGlzIHBhcnRpdGlvbmVkIGludG8gZmlsZXMKLWRvZXNuJ3QgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBzb3VyY2UuCi0KLUBjIEkgYWRkZWQgImNvbiIgcHJlZml4IHRvICJjYXRlbmF0aW9uIiBqdXN0IHRvIHByb3ZlIEkgY2FuIG92ZXJjb21lIG15Ci1AYyBBUEwgdHJhaW5pbmcuLi4gICBkb2NAY3lnbnVzLmNvbQotVGhlIHNvdXJjZSBwcm9ncmFtIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgdGV4dCBpbiBhbGwgdGhlIGZpbGVzLCBpbiB0aGUKLW9yZGVyIHNwZWNpZmllZC4KLQotRWFjaCB0aW1lIHlvdSBydW4gQGNvZGV7QHZhbHVle0FTfX0gaXQgYXNzZW1ibGVzIGV4YWN0bHkgb25lIHNvdXJjZQotcHJvZ3JhbS4gIFRoZSBzb3VyY2UgcHJvZ3JhbSBpcyBtYWRlIHVwIG9mIG9uZSBvciBtb3JlIGZpbGVzLgotKFRoZSBzdGFuZGFyZCBpbnB1dCBpcyBhbHNvIGEgZmlsZS4pCi0KLVlvdSBnaXZlIEBjb2Rle0B2YWx1ZXtBU319IGEgY29tbWFuZCBsaW5lIHRoYXQgaGFzIHplcm8gb3IgbW9yZSBpbnB1dCBmaWxlCi1uYW1lcy4gIFRoZSBpbnB1dCBmaWxlcyBhcmUgcmVhZCAoZnJvbSBsZWZ0IGZpbGUgbmFtZSB0byByaWdodCkuICBBCi1jb21tYW5kIGxpbmUgYXJndW1lbnQgKGluIGFueSBwb3NpdGlvbikgdGhhdCBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nCi1pcyB0YWtlbiB0byBiZSBhbiBpbnB1dCBmaWxlIG5hbWUuCi0KLUlmIHlvdSBnaXZlIEBjb2Rle0B2YWx1ZXtBU319IG5vIGZpbGUgbmFtZXMgaXQgYXR0ZW1wdHMgdG8gcmVhZCBvbmUgaW5wdXQgZmlsZQotZnJvbSB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc3RhbmRhcmQgaW5wdXQsIHdoaWNoIGlzIG5vcm1hbGx5IHlvdXIgdGVybWluYWwuICBZb3UKLW1heSBoYXZlIHRvIHR5cGUgQGtleXtjdGwtRH0gdG8gdGVsbCBAY29kZXtAdmFsdWV7QVN9fSB0aGVyZSBpcyBubyBtb3JlIHByb2dyYW0KLXRvIGFzc2VtYmxlLgotCi1Vc2UgQHNhbXB7LS19IGlmIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgbmFtZSB0aGUgc3RhbmRhcmQgaW5wdXQgZmlsZQotaW4geW91ciBjb21tYW5kIGxpbmUuCi0KLUlmIHRoZSBzb3VyY2UgaXMgZW1wdHksIEBjb2Rle0B2YWx1ZXtBU319IHByb2R1Y2VzIGEgc21hbGwsIGVtcHR5IG9iamVjdAotZmlsZS4KLQotQHN1YmhlYWRpbmcgRmlsZW5hbWVzIGFuZCBMaW5lLW51bWJlcnMKLQotQGNpbmRleCBpbnB1dCBmaWxlIGxpbmVudW1iZXJzCi1AY2luZGV4IGxpbmUgbnVtYmVycywgaW4gaW5wdXQgZmlsZXMKLVRoZXJlIGFyZSB0d28gd2F5cyBvZiBsb2NhdGluZyBhIGxpbmUgaW4gdGhlIGlucHV0IGZpbGUgKG9yIGZpbGVzKSBhbmQKLWVpdGhlciBtYXkgYmUgdXNlZCBpbiByZXBvcnRpbmcgZXJyb3IgbWVzc2FnZXMuICBPbmUgd2F5IHJlZmVycyB0byBhIGxpbmUKLW51bWJlciBpbiBhIHBoeXNpY2FsIGZpbGU7IHRoZSBvdGhlciByZWZlcnMgdG8gYSBsaW5lIG51bWJlciBpbiBhCi1gYGxvZ2ljYWwnJyBmaWxlLiAgQHhyZWZ7RXJyb3JzLCAsRXJyb3IgYW5kIFdhcm5pbmcgTWVzc2FnZXN9LgotCi1AZGZue1BoeXNpY2FsIGZpbGVzfSBhcmUgdGhvc2UgZmlsZXMgbmFtZWQgaW4gdGhlIGNvbW1hbmQgbGluZSBnaXZlbgotdG8gQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBkZm57TG9naWNhbCBmaWxlc30gYXJlIHNpbXBseSBuYW1lcyBkZWNsYXJlZCBleHBsaWNpdGx5IGJ5IGFzc2VtYmxlcgotZGlyZWN0aXZlczsgdGhleSBiZWFyIG5vIHJlbGF0aW9uIHRvIHBoeXNpY2FsIGZpbGVzLiAgTG9naWNhbCBmaWxlIG5hbWVzIGhlbHAKLWVycm9yIG1lc3NhZ2VzIHJlZmxlY3QgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IHNvdXJjZQotaXMgaXRzZWxmIHN5bnRoZXNpemVkIGZyb20gb3RoZXIgZmlsZXMuICBAY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUKLUBzYW1weyN9IGRpcmVjdGl2ZXMgZW1pdHRlZCBieSB0aGUgQGNvZGV7QHZhbHVle0dDQ319IHByZXByb2Nlc3Nvci4gIFNlZSBhbHNvCi1AcmVme0ZpbGUsLEBjb2Rley5maWxlfX0uCi0KLUBub2RlIE9iamVjdAotQHNlY3Rpb24gT3V0cHV0IChPYmplY3QpIEZpbGUKLQotQGNpbmRleCBvYmplY3QgZmlsZQotQGNpbmRleCBvdXRwdXQgZmlsZQotQGtpbmRleCBhLm91dAotQGtpbmRleCAubwotRXZlcnkgdGltZSB5b3UgcnVuIEBjb2Rle0B2YWx1ZXtBU319IGl0IHByb2R1Y2VzIGFuIG91dHB1dCBmaWxlLCB3aGljaCBpcwoteW91ciBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtIHRyYW5zbGF0ZWQgaW50byBudW1iZXJzLiAgVGhpcyBmaWxlCi1pcyB0aGUgb2JqZWN0IGZpbGUuICBJdHMgZGVmYXVsdCBuYW1lIGlzCi1AaWZjbGVhciBCT1VUCi1AY29kZXthLm91dH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBCT1VUCi1AaWZzZXQgR0VORVJJQwotQGNvZGV7YS5vdXR9LCBvciAKLUBlbmQgaWZzZXQKLUBjb2Rle2Iub3V0fSB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBJbnRlbCA4MDk2MC4KLUBlbmQgaWZzZXQKLVlvdSBjYW4gZ2l2ZSBpdCBhbm90aGVyIG5hbWUgYnkgdXNpbmcgdGhlIEBjb2Rley1vfSBvcHRpb24uICBDb252ZW50aW9uYWxseSwKLW9iamVjdCBmaWxlIG5hbWVzIGVuZCB3aXRoIEBmaWxley5vfS4gIFRoZSBkZWZhdWx0IG5hbWUgaXMgdXNlZCBmb3IgaGlzdG9yaWNhbAotcmVhc29uczogb2xkZXIgYXNzZW1ibGVycyB3ZXJlIGNhcGFibGUgb2YgYXNzZW1ibGluZyBzZWxmLWNvbnRhaW5lZCBwcm9ncmFtcwotZGlyZWN0bHkgaW50byBhIHJ1bm5hYmxlIHByb2dyYW0uICAoRm9yIHNvbWUgZm9ybWF0cywgdGhpcyBpc24ndCBjdXJyZW50bHkKLXBvc3NpYmxlLCBidXQgaXQgY2FuIGJlIGRvbmUgZm9yIHRoZSBAY29kZXthLm91dH0gZm9ybWF0LikKLQotQGNpbmRleCBsaW5rZXIKLUBraW5kZXggbGQKLVRoZSBvYmplY3QgZmlsZSBpcyBtZWFudCBmb3IgaW5wdXQgdG8gdGhlIGxpbmtlciBAY29kZXtAdmFsdWV7TER9fS4gIEl0IGNvbnRhaW5zCi1hc3NlbWJsZWQgcHJvZ3JhbSBjb2RlLCBpbmZvcm1hdGlvbiB0byBoZWxwIEBjb2Rle0B2YWx1ZXtMRH19IGludGVncmF0ZQotdGhlIGFzc2VtYmxlZCBwcm9ncmFtIGludG8gYSBydW5uYWJsZSBmaWxlLCBhbmQgKG9wdGlvbmFsbHkpIHN5bWJvbGljCi1pbmZvcm1hdGlvbiBmb3IgdGhlIGRlYnVnZ2VyLgotCi1AYyBsaW5rIGFib3ZlIHRvIHNvbWUgaW5mbyBmaWxlKHMpIGxpa2UgdGhlIGRlc2NyaXB0aW9uIG9mIGEub3V0LgotQGMgZG9uJ3QgZm9yZ2V0IHRvIGRlc2NyaWJlIEBzY3tnbnV9IGluZm8gYXMgd2VsbCBhcyBVbml4IGxvc3NhZ2UuCi0KLUBub2RlIEVycm9ycwotQHNlY3Rpb24gRXJyb3IgYW5kIFdhcm5pbmcgTWVzc2FnZXMKLQotQGNpbmRleCBlcnJvciBtZXNzc2FnZXMKLUBjaW5kZXggd2FybmluZyBtZXNzYWdlcwotQGNpbmRleCBtZXNzYWdlcyBmcm9tIGFzc2VtYmxlcgotQGNvZGV7QHZhbHVle0FTfX0gbWF5IHdyaXRlIHdhcm5pbmdzIGFuZCBlcnJvciBtZXNzYWdlcyB0byB0aGUgc3RhbmRhcmQgZXJyb3IKLWZpbGUgKHVzdWFsbHkgeW91ciB0ZXJtaW5hbCkuICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdoZW4gIGEgY29tcGlsZXIKLXJ1bnMgQGNvZGV7QHZhbHVle0FTfX0gYXV0b21hdGljYWxseS4gIFdhcm5pbmdzIHJlcG9ydCBhbiBhc3N1bXB0aW9uIG1hZGUgc28KLXRoYXQgQGNvZGV7QHZhbHVle0FTfX0gY291bGQga2VlcCBhc3NlbWJsaW5nIGEgZmxhd2VkIHByb2dyYW07IGVycm9ycyByZXBvcnQgYQotZ3JhdmUgcHJvYmxlbSB0aGF0IHN0b3BzIHRoZSBhc3NlbWJseS4KLQotQGNpbmRleCBmb3JtYXQgb2Ygd2FybmluZyBtZXNzYWdlcwotV2FybmluZyBtZXNzYWdlcyBoYXZlIHRoZSBmb3JtYXQKLQotQHNtYWxsZXhhbXBsZQotZmlsZV9uYW1lOkBie05OTn06V2FybmluZyBNZXNzYWdlIFRleHQKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2luZGVudAotQGNpbmRleCBsaW5lIG51bWJlcnMsIGluIHdhcm5pbmdzL2Vycm9ycwotKHdoZXJlIEBie05OTn0gaXMgYSBsaW5lIG51bWJlcikuICBJZiBhIGxvZ2ljYWwgZmlsZSBuYW1lIGhhcyBiZWVuIGdpdmVuCi0oQHB4cmVme0ZpbGUsLEBjb2Rley5maWxlfX0pIGl0IGlzIHVzZWQgZm9yIHRoZSBmaWxlbmFtZSwgb3RoZXJ3aXNlIHRoZSBuYW1lIG9mCi10aGUgY3VycmVudCBpbnB1dCBmaWxlIGlzIHVzZWQuICBJZiBhIGxvZ2ljYWwgbGluZSBudW1iZXIgd2FzIGdpdmVuCi1AaWZzZXQgR0VORVJJQwotKEBweHJlZntMaW5lLCxAY29kZXsubGluZX19KQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgQTI5SwotKEBweHJlZntMaW5lLCxAY29kZXsubGluZX19KQotQGVuZCBpZmNsZWFyCi1AaWZzZXQgQTI5SwotKEBweHJlZntMbiwsQGNvZGV7LmxufX0pCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLXRoZW4gaXQgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG51bWJlciBwcmludGVkLAotb3RoZXJ3aXNlIHRoZSBhY3R1YWwgbGluZSBpbiB0aGUgY3VycmVudCBzb3VyY2UgZmlsZSBpcyBwcmludGVkLiAgVGhlCi1tZXNzYWdlIHRleHQgaXMgaW50ZW5kZWQgdG8gYmUgc2VsZiBleHBsYW5hdG9yeSAoaW4gdGhlIGdyYW5kIFVuaXgKLXRyYWRpdGlvbikuCi0KLUBjaW5kZXggZm9ybWF0IG9mIGVycm9yIG1lc3NhZ2VzCi1FcnJvciBtZXNzYWdlcyBoYXZlIHRoZSBmb3JtYXQKLUBzbWFsbGV4YW1wbGUKLWZpbGVfbmFtZTpAYntOTk59OkZBVEFMOkVycm9yIE1lc3NhZ2UgVGV4dAotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZSBkZXJpdmVkIGFzIGZvciB3YXJuaW5nCi1tZXNzYWdlcy4gIFRoZSBhY3R1YWwgbWVzc2FnZSB0ZXh0IG1heSBiZSByYXRoZXIgbGVzcyBleHBsYW5hdG9yeQotYmVjYXVzZSBtYW55IG9mIHRoZW0gYXJlbid0IHN1cHBvc2VkIHRvIGhhcHBlbi4KLQotQG5vZGUgSW52b2tpbmcKLUBjaGFwdGVyIENvbW1hbmQtTGluZSBPcHRpb25zCi0KLUBjaW5kZXggb3B0aW9ucywgYWxsIHZlcnNpb25zIG9mIGFzc2VtYmxlcgotVGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBjb21tYW5kLWxpbmUgb3B0aW9ucyBhdmFpbGFibGUgaW4gQGVtcGh7YWxsfQotdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlcjsgQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSwgZm9yIG9wdGlvbnMgc3BlY2lmaWMKLUBpZmNsZWFyIEdFTkVSSUMKLXRvIHRoZSBAdmFsdWV7VEFSR0VUfS4KLUBlbmQgaWZjbGVhcgotQGlmc2V0IEdFTkVSSUMKLXRvIHBhcnRpY3VsYXIgbWFjaGluZSBhcmNoaXRlY3R1cmVzLgotQGVuZCBpZnNldAotCi1JZiB5b3UgYXJlIGludm9raW5nIEBjb2Rle0B2YWx1ZXtBU319IHZpYSB0aGUgQHNje2dudX0gQyBjb21waWxlciAodmVyc2lvbiAyKSwKLXlvdSBjYW4gdXNlIHRoZSBAc2FtcHstV2F9IG9wdGlvbiB0byBwYXNzIGFyZ3VtZW50cyB0aHJvdWdoIHRvIHRoZSBhc3NlbWJsZXIuCi1UaGUgYXNzZW1ibGVyIGFyZ3VtZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIgKGFuZCB0aGUgQHNhbXB7LVdhfSkKLWJ5IGNvbW1hcy4gIEZvciBleGFtcGxlOgotCi1Ac21hbGxleGFtcGxlCi1nY2MgLWMgLWcgLU8gLVdhLC1hbGgsLUwgZmlsZS5jCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoaXMgcGFzc2VzIHR3byBvcHRpb25zIHRvIHRoZSBhc3NlbWJsZXI6IEBzYW1wey1hbGh9IChlbWl0IGEgbGlzdGluZyB0bwotc3RhbmRhcmQgb3V0cHV0IHdpdGggd2l0aCBoaWdoLWxldmVsIGFuZCBhc3NlbWJseSBzb3VyY2UpIGFuZCBAc2FtcHstTH0gKHJldGFpbgotbG9jYWwgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlKS4KLQotVXN1YWxseSB5b3UgZG8gbm90IG5lZWQgdG8gdXNlIHRoaXMgQHNhbXB7LVdhfSBtZWNoYW5pc20sIHNpbmNlIG1hbnkgY29tcGlsZXIKLWNvbW1hbmQtbGluZSBvcHRpb25zIGFyZSBhdXRvbWF0aWNhbGx5IHBhc3NlZCB0byB0aGUgYXNzZW1ibGVyIGJ5IHRoZSBjb21waWxlci4KLShZb3UgY2FuIGNhbGwgdGhlIEBzY3tnbnV9IGNvbXBpbGVyIGRyaXZlciB3aXRoIHRoZSBAc2FtcHstdn0gb3B0aW9uIHRvIHNlZQotcHJlY2lzZWx5IHdoYXQgb3B0aW9ucyBpdCBwYXNzZXMgdG8gZWFjaCBjb21waWxhdGlvbiBwYXNzLCBpbmNsdWRpbmcgdGhlCi1hc3NlbWJsZXIuKQotCi1AbWVudQotKiBhOjogICAgICAgICAgICAgLWFbY2RobG5zXSBlbmFibGUgbGlzdGluZ3MKLSogRDo6ICAgICAgICAgICAgIC1EIGZvciBjb21wYXRpYmlsaXR5Ci0qIGY6OiAgICAgICAgICAgICAtZiB0byB3b3JrIGZhc3RlcgotKiBJOjogICAgICAgICAgICAgLUkgZm9yIC5pbmNsdWRlIHNlYXJjaCBwYXRoCi1AaWZjbGVhciBESUZGLVRCTC1LTFVHRQotKiBLOjogICAgICAgICAgICAgLUsgZm9yIGNvbXBhdGliaWxpdHkKLUBlbmQgaWZjbGVhcgotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi0qIEs6OiAgICAgICAgICAgICAtSyBmb3IgZGlmZmVyZW5jZSB0YWJsZXMKLUBlbmQgaWZzZXQKLQotKiBMOjogICAgICAgICAgICAgLUwgdG8gcmV0YWluIGxvY2FsIGxhYmVscwotKiBNOjoJCSAgLU0gb3IgLS1tcmkgdG8gYXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZQotKiBNRDo6ICAgICAgICAgICAgLS1NRCBmb3IgZGVwZW5kZW5jeSB0cmFja2luZwotKiBvOjogICAgICAgICAgICAgLW8gdG8gbmFtZSB0aGUgb2JqZWN0IGZpbGUKLSogUjo6ICAgICAgICAgICAgIC1SIHRvIGpvaW4gZGF0YSBhbmQgdGV4dCBzZWN0aW9ucwotKiBzdGF0aXN0aWNzOjogICAgLS1zdGF0aXN0aWNzIHRvIHNlZSBzdGF0aXN0aWNzIGFib3V0IGFzc2VtYmx5Ci0qIHRyYWRpdGlvbmFsLWZvcm1hdDo6IC0tdHJhZGl0aW9uYWwtZm9ybWF0IGZvciBjb21wYXRpYmxlIG91dHB1dAotKiB2OjogICAgICAgICAgICAgLXYgdG8gYW5ub3VuY2UgdmVyc2lvbgotKiBXOjogICAgICAgICAgICAgLVcgdG8gc3VwcHJlc3Mgd2FybmluZ3MKLSogWjo6ICAgICAgICAgICAgIC1aIHRvIG1ha2Ugb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnMKLUBlbmQgbWVudQotCi1Abm9kZSBhCi1Ac2VjdGlvbiBFbmFibGUgTGlzdGluZ3M6IEBjb2Rley1hW2NkaGxuc119Ci0KLUBraW5kZXggLWEKLUBraW5kZXggLWFjCi1Aa2luZGV4IC1hZAotQGtpbmRleCAtYWgKLUBraW5kZXggLWFsCi1Aa2luZGV4IC1hbgotQGtpbmRleCAtYXMKLUBjaW5kZXggbGlzdGluZ3MsIGVuYWJsaW5nCi1AY2luZGV4IGFzc2VtYmx5IGxpc3RpbmdzLCBlbmFibGluZwotCi1UaGVzZSBvcHRpb25zIGVuYWJsZSBsaXN0aW5nIG91dHB1dCBmcm9tIHRoZSBhc3NlbWJsZXIuICBCeSBpdHNlbGYsCi1Ac2FtcHstYX0gcmVxdWVzdHMgaGlnaC1sZXZlbCwgYXNzZW1ibHksIGFuZCBzeW1ib2xzIGxpc3RpbmcuCi1Zb3UgY2FuIHVzZSBvdGhlciBsZXR0ZXJzIHRvIHNlbGVjdCBzcGVjaWZpYyBvcHRpb25zIGZvciB0aGUgbGlzdDoKLUBzYW1wey1haH0gcmVxdWVzdHMgYSBoaWdoLWxldmVsIGxhbmd1YWdlIGxpc3RpbmcsCi1Ac2FtcHstYWx9IHJlcXVlc3RzIGFuIG91dHB1dC1wcm9ncmFtIGFzc2VtYmx5IGxpc3RpbmcsIGFuZAotQHNhbXB7LWFzfSByZXF1ZXN0cyBhIHN5bWJvbCB0YWJsZSBsaXN0aW5nLgotSGlnaC1sZXZlbCBsaXN0aW5ncyByZXF1aXJlIHRoYXQgYSBjb21waWxlciBkZWJ1Z2dpbmcgb3B0aW9uIGxpa2UKLUBzYW1wey1nfSBiZSB1c2VkLCBhbmQgdGhhdCBhc3NlbWJseSBsaXN0aW5ncyAoQHNhbXB7LWFsfSkgYmUgcmVxdWVzdGVkCi1hbHNvLgotCi1Vc2UgdGhlIEBzYW1wey1hY30gb3B0aW9uIHRvIG9taXQgZmFsc2UgY29uZGl0aW9uYWxzIGZyb20gYSBsaXN0aW5nLiAgQW55IGxpbmVzCi13aGljaCBhcmUgbm90IGFzc2VtYmxlZCBiZWNhdXNlIG9mIGEgZmFsc2UgQGNvZGV7LmlmfSAob3IgQGNvZGV7LmlmZGVmfSwgb3IgYW55Ci1vdGhlciBjb25kaXRpb25hbCksIG9yIGEgdHJ1ZSBAY29kZXsuaWZ9IGZvbGxvd2VkIGJ5IGFuIEBjb2Rley5lbHNlfSwgd2lsbCBiZQotb21pdHRlZCBmcm9tIHRoZSBsaXN0aW5nLgotCi1Vc2UgdGhlIEBzYW1wey1hZH0gb3B0aW9uIHRvIG9taXQgZGVidWdnaW5nIGRpcmVjdGl2ZXMgZnJvbSB0aGUKLWxpc3RpbmcuCi0KLU9uY2UgeW91IGhhdmUgc3BlY2lmaWVkIG9uZSBvZiB0aGVzZSBvcHRpb25zLCB5b3UgY2FuIGZ1cnRoZXIgY29udHJvbAotbGlzdGluZyBvdXRwdXQgYW5kIGl0cyBhcHBlYXJhbmNlIHVzaW5nIHRoZSBkaXJlY3RpdmVzIEBjb2Rley5saXN0fSwKLUBjb2Rley5ub2xpc3R9LCBAY29kZXsucHNpemV9LCBAY29kZXsuZWplY3R9LCBAY29kZXsudGl0bGV9LCBhbmQKLUBjb2Rley5zYnR0bH0uCi1UaGUgQHNhbXB7LWFufSBvcHRpb24gdHVybnMgb2ZmIGFsbCBmb3JtcyBwcm9jZXNzaW5nLgotSWYgeW91IGRvIG5vdCByZXF1ZXN0IGxpc3Rpbmcgb3V0cHV0IHdpdGggb25lIG9mIHRoZSBAc2FtcHstYX0gb3B0aW9ucywgdGhlCi1saXN0aW5nLWNvbnRyb2wgZGlyZWN0aXZlcyBoYXZlIG5vIGVmZmVjdC4KLQotVGhlIGxldHRlcnMgYWZ0ZXIgQHNhbXB7LWF9IG1heSBiZSBjb21iaW5lZCBpbnRvIG9uZSBvcHRpb24sCi1AZW1waHtlLmcufSwgQHNhbXB7LWFsbn0uCi0KLUBub2RlIEQKLUBzZWN0aW9uIEBjb2Rley1EfQotCi1Aa2luZGV4IC1ECi1UaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IHdoYXRzb2V2ZXIsIGJ1dCBpdCBpcyBhY2NlcHRlZCB0byBtYWtlIGl0IG1vcmUKLWxpa2VseSB0aGF0IHNjcmlwdHMgd3JpdHRlbiBmb3Igb3RoZXIgYXNzZW1ibGVycyBhbHNvIHdvcmsgd2l0aAotQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBub2RlIGYKLUBzZWN0aW9uIFdvcmsgRmFzdGVyOiBAY29kZXstZn0KLQotQGtpbmRleCAtZgotQGNpbmRleCB0cnVzdGVkIGNvbXBpbGVyCi1AY2luZGV4IGZhc3RlciBwcm9jZXNzaW5nIChAY29kZXstZn0pCi1Ac2FtcHstZn0gc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGFzc2VtYmxpbmcgcHJvZ3JhbXMgd3JpdHRlbiBieSBhCi0odHJ1c3RlZCkgY29tcGlsZXIuICBAc2FtcHstZn0gc3RvcHMgdGhlIGFzc2VtYmxlciBmcm9tIGRvaW5nIHdoaXRlc3BhY2UKLWFuZCBjb21tZW50IHByZXByb2Nlc3Npbmcgb24KLXRoZSBpbnB1dCBmaWxlKHMpIGJlZm9yZSBhc3NlbWJsaW5nIHRoZW0uICBAeHJlZntQcmVwcm9jZXNzaW5nLAotLFByZXByb2Nlc3Npbmd9LgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gaWYgeW91IHVzZSBAc2FtcHstZn0gd2hlbiB0aGUgZmlsZXMgYWN0dWFsbHkgbmVlZCB0byBiZQotcHJlcHJvY2Vzc2VkIChpZiB0aGV5IGNvbnRhaW4gY29tbWVudHMsIGZvciBleGFtcGxlKSwgQGNvZGV7QHZhbHVle0FTfX0gZG9lcwotbm90IHdvcmsgY29ycmVjdGx5LgotQGVuZCBxdW90YXRpb24KLQotQG5vZGUgSQotQHNlY3Rpb24gQGNvZGV7LmluY2x1ZGV9IHNlYXJjaCBwYXRoOiBAY29kZXstSX0gQHZhcntwYXRofQotCi1Aa2luZGV4IC1JIEB2YXJ7cGF0aH0KLUBjaW5kZXggcGF0aHMgZm9yIEBjb2Rley5pbmNsdWRlfQotQGNpbmRleCBzZWFyY2ggcGF0aCBmb3IgQGNvZGV7LmluY2x1ZGV9Ci1AY2luZGV4IEBjb2Rle2luY2x1ZGV9IGRpcmVjdGl2ZSBzZWFyY2ggcGF0aAotVXNlIHRoaXMgb3B0aW9uIHRvIGFkZCBhIEB2YXJ7cGF0aH0gdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMKLUBjb2Rle0B2YWx1ZXtBU319IHNlYXJjaGVzIGZvciBmaWxlcyBzcGVjaWZpZWQgaW4gQGNvZGV7LmluY2x1ZGV9Ci1kaXJlY3RpdmVzIChAcHhyZWZ7SW5jbHVkZSwsQGNvZGV7LmluY2x1ZGV9fSkuICBZb3UgbWF5IHVzZSBAY29kZXstSX0gYXMKLW1hbnkgdGltZXMgYXMgbmVjZXNzYXJ5IHRvIGluY2x1ZGUgYSB2YXJpZXR5IG9mIHBhdGhzLiAgVGhlIGN1cnJlbnQKLXdvcmtpbmcgZGlyZWN0b3J5IGlzIGFsd2F5cyBzZWFyY2hlZCBmaXJzdDsgYWZ0ZXIgdGhhdCwgQGNvZGV7QHZhbHVle0FTfX0KLXNlYXJjaGVzIGFueSBAc2FtcHstSX0gZGlyZWN0b3JpZXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSB3ZXJlCi1zcGVjaWZpZWQgKGxlZnQgdG8gcmlnaHQpIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBub2RlIEsKLUBzZWN0aW9uIERpZmZlcmVuY2UgVGFibGVzOiBAY29kZXstS30KLQotQGtpbmRleCAtSwotQGlmY2xlYXIgRElGRi1UQkwtS0xVR0UKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHksIHRoaXMgb3B0aW9uIGlzIGFsbG93ZWQsIGJ1dCBoYXMgbm8gZWZmZWN0LiAgSXQgaXMKLXBlcm1pdHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgb24gb3RoZXIgcGxhdGZvcm1zLAotd2hlcmUgaXQgY2FuIGJlIHVzZWQgdG8gd2FybiB3aGVuIHRoZSBhc3NlbWJsZXIgYWx0ZXJzIHRoZSBtYWNoaW5lIGNvZGUKLWdlbmVyYXRlZCBmb3IgQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMgaW4gZGlmZmVyZW5jZSB0YWJsZXMuICBUaGUgQHZhbHVle1RBUkdFVH0KLWZhbWlseSBkb2VzIG5vdCBoYXZlIHRoZSBhZGRyZXNzaW5nIGxpbWl0YXRpb25zIHRoYXQgc29tZXRpbWVzIGxlYWQgdG8gdGhpcwotYWx0ZXJhdGlvbiBvbiBvdGhlciBwbGF0Zm9ybXMuCi1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IERJRkYtVEJMLUtMVUdFCi1AY2luZGV4IGRpZmZlcmVuY2UgdGFibGVzLCB3YXJuaW5nCi1AY2luZGV4IHdhcm5pbmcgZm9yIGFsdGVyZWQgZGlmZmVyZW5jZSB0YWJsZXMKLUBjb2Rle0B2YWx1ZXtBU319IHNvbWV0aW1lcyBhbHRlcnMgdGhlIGNvZGUgZW1pdHRlZCBmb3IgZGlyZWN0aXZlcyBvZiB0aGUgZm9ybQotQHNhbXB7LndvcmQgQHZhcntzeW0xfS1AdmFye3N5bTJ9fTsgQHB4cmVme1dvcmQsLEBjb2Rley53b3JkfX0uCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LUt9IG9wdGlvbiBpZiB5b3Ugd2FudCBhIHdhcm5pbmcgaXNzdWVkIHdoZW4gdGhpcwotaXMgZG9uZS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgTAotQHNlY3Rpb24gSW5jbHVkZSBMb2NhbCBMYWJlbHM6IEBjb2Rley1MfQotCi1Aa2luZGV4IC1MCi1AY2luZGV4IGxvY2FsIGxhYmVscywgcmV0YWluaW5nIGluIG91dHB1dAotTGFiZWxzIGJlZ2lubmluZyB3aXRoIEBzYW1we0x9ICh1cHBlciBjYXNlIG9ubHkpIGFyZSBjYWxsZWQgQGRmbntsb2NhbAotbGFiZWxzfS4gQHhyZWZ7U3ltYm9sIE5hbWVzfS4gIE5vcm1hbGx5IHlvdSBkbyBub3Qgc2VlIHN1Y2ggbGFiZWxzIHdoZW4KLWRlYnVnZ2luZywgYmVjYXVzZSB0aGV5IGFyZSBpbnRlbmRlZCBmb3IgdGhlIHVzZSBvZiBwcm9ncmFtcyAobGlrZQotY29tcGlsZXJzKSB0aGF0IGNvbXBvc2UgYXNzZW1ibGVyIHByb2dyYW1zLCBub3QgZm9yIHlvdXIgbm90aWNlLgotTm9ybWFsbHkgYm90aCBAY29kZXtAdmFsdWV7QVN9fSBhbmQgQGNvZGV7QHZhbHVle0xEfX0gZGlzY2FyZCBzdWNoIGxhYmVscywgc28geW91IGRvIG5vdAotbm9ybWFsbHkgZGVidWcgd2l0aCB0aGVtLgotCi1UaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byByZXRhaW4gdGhvc2UgQHNhbXB7TEBkb3Rze319IHN5bWJvbHMKLWluIHRoZSBvYmplY3QgZmlsZS4gIFVzdWFsbHkgaWYgeW91IGRvIHRoaXMgeW91IGFsc28gdGVsbCB0aGUgbGlua2VyCi1AY29kZXtAdmFsdWV7TER9fSB0byBwcmVzZXJ2ZSBzeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggQHNhbXB7TH0uCi0KLUJ5IGRlZmF1bHQsIGEgbG9jYWwgbGFiZWwgaXMgYW55IGxhYmVsIGJlZ2lubmluZyB3aXRoIEBzYW1we0x9LCBidXQgZWFjaAotdGFyZ2V0IGlzIGFsbG93ZWQgdG8gcmVkZWZpbmUgdGhlIGxvY2FsIGxhYmVsIHByZWZpeC4KLUBpZnNldCBIUFBBCi1PbiB0aGUgSFBQQSBsb2NhbCBsYWJlbHMgYmVnaW4gd2l0aCBAc2FtcHtMJH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJNCi1Ac2FtcHs7fSBmb3IgdGhlIEFSTSBmYW1pbHk7Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIE0KLUBzZWN0aW9uIEFzc2VtYmxlIGluIE1SSSBDb21wYXRpYmlsaXR5IE1vZGU6IEBjb2Rley1NfQotCi1Aa2luZGV4IC1NCi1AY2luZGV4IE1SSSBjb21wYXRpYmlsaXR5IG1vZGUKLVRoZSBAY29kZXstTX0gb3IgQGNvZGV7LS1tcml9IG9wdGlvbiBzZWxlY3RzIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuICBUaGlzCi1jaGFuZ2VzIHRoZSBzeW50YXggYW5kIHBzZXVkby1vcCBoYW5kbGluZyBvZiBAY29kZXtAdmFsdWV7QVN9fSB0byBtYWtlIGl0Ci1jb21wYXRpYmxlIHdpdGggdGhlIEBjb2Rle0FTTTY4S30gb3IgdGhlIEBjb2Rle0FTTTk2MH0gKGRlcGVuZGluZyB1cG9uIHRoZQotY29uZmlndXJlZCB0YXJnZXQpIGFzc2VtYmxlciBmcm9tIE1pY3JvdGVjIFJlc2VhcmNoLiAgVGhlIGV4YWN0IG5hdHVyZSBvZiB0aGUKLU1SSSBzeW50YXggd2lsbCBub3QgYmUgZG9jdW1lbnRlZCBoZXJlOyBzZWUgdGhlIE1SSSBtYW51YWxzIGZvciBtb3JlCi1pbmZvcm1hdGlvbi4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IHRoZSBoYW5kbGluZyBvZiBtYWNyb3MgYW5kIG1hY3JvCi1hcmd1bWVudHMgaXMgc29tZXdoYXQgZGlmZmVyZW50LiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBvcHRpb24gaXMgdG8gcGVybWl0Ci1hc3NlbWJsaW5nIGV4aXN0aW5nIE1SSSBhc3NlbWJsZXIgY29kZSB1c2luZyBAY29kZXtAdmFsdWV7QVN9fS4KLQotVGhlIE1SSSBjb21wYXRpYmlsaXR5IGlzIG5vdCBjb21wbGV0ZS4gIENlcnRhaW4gb3BlcmF0aW9ucyBvZiB0aGUgTVJJIGFzc2VtYmxlcgotZGVwZW5kIHVwb24gaXRzIG9iamVjdCBmaWxlIGZvcm1hdCwgYW5kIGNhbiBub3QgYmUgc3VwcG9ydGVkIHVzaW5nIG90aGVyIG9iamVjdAotZmlsZSBmb3JtYXRzLiAgU3VwcG9ydGluZyB0aGVzZSB3b3VsZCByZXF1aXJlIGVuaGFuY2luZyBlYWNoIG9iamVjdCBmaWxlIGZvcm1hdAotaW5kaXZpZHVhbGx5LiAgVGhlc2UgYXJlOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSBnbG9iYWwgc3ltYm9scyBpbiBjb21tb24gc2VjdGlvbgotCi1UaGUgbTY4ayBNUkkgYXNzZW1ibGVyIHN1cHBvcnRzIGNvbW1vbiBzZWN0aW9ucyB3aGljaCBhcmUgbWVyZ2VkIGJ5IHRoZSBsaW5rZXIuCi1PdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzIGRvIG5vdCBzdXBwb3J0IHRoaXMuICBAY29kZXtAdmFsdWV7QVN9fSBoYW5kbGVzCi1jb21tb24gc2VjdGlvbnMgYnkgdHJlYXRpbmcgdGhlbSBhcyBhIHNpbmdsZSBjb21tb24gc3ltYm9sLiAgSXQgcGVybWl0cyBsb2NhbAotc3ltYm9scyB0byBiZSBkZWZpbmVkIHdpdGhpbiBhIGNvbW1vbiBzZWN0aW9uLCBidXQgaXQgY2FuIG5vdCBzdXBwb3J0IGdsb2JhbAotc3ltYm9scywgc2luY2UgaXQgaGFzIG5vIHdheSB0byBkZXNjcmliZSB0aGVtLgotCi1AaXRlbSBjb21wbGV4IHJlbG9jYXRpb25zCi0KLVRoZSBNUkkgYXNzZW1ibGVycyBzdXBwb3J0IHJlbG9jYXRpb25zIGFnYWluc3QgYSBuZWdhdGVkIHNlY3Rpb24gYWRkcmVzcywgYW5kCi1yZWxvY2F0aW9ucyB3aGljaCBjb21iaW5lIHRoZSBzdGFydCBhZGRyZXNzZXMgb2YgdHdvIG9yIG1vcmUgc2VjdGlvbnMuICBUaGVzZQotYXJlIG5vdCBzdXBwb3J0IGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuCi0KLUBpdGVtIEBjb2Rle0VORH0gcHNldWRvLW9wIHNwZWNpZnlpbmcgc3RhcnQgYWRkcmVzcwotCi1UaGUgTVJJIEBjb2Rle0VORH0gcHNldWRvLW9wIHBlcm1pdHMgdGhlIHNwZWNpZmljYXRpb24gb2YgYSBzdGFydCBhZGRyZXNzLgotVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IG90aGVyIG9iamVjdCBmaWxlIGZvcm1hdHMuICBUaGUgc3RhcnQgYWRkcmVzcyBtYXkKLWluc3RlYWQgYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBAY29kZXstZX0gb3B0aW9uIHRvIHRoZSBsaW5rZXIsIG9yIGluIGEgbGlua2VyCi1zY3JpcHQuCi0KLUBpdGVtIEBjb2Rle0lETlR9LCBAY29kZXsuaWRlbnR9IGFuZCBAY29kZXtOQU1FfSBwc2V1ZG8tb3BzCi0KLVRoZSBNUkkgQGNvZGV7SUROVH0sIEBjb2Rley5pZGVudH0gYW5kIEBjb2Rle05BTUV9IHBzZXVkby1vcHMgYXNzaWduIGEgbW9kdWxlCi1uYW1lIHRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi1AaXRlbSBAY29kZXtPUkd9IHBzZXVkby1vcAotCi1UaGUgbTY4ayBNUkkgQGNvZGV7T1JHfSBwc2V1ZG8tb3AgYmVnaW5zIGFuIGFic29sdXRlIHNlY3Rpb24gYXQgYSBnaXZlbgotYWRkcmVzcy4gIFRoaXMgZGlmZmVycyBmcm9tIHRoZSB1c3VhbCBAY29kZXtAdmFsdWV7QVN9fSBAY29kZXsub3JnfSBwc2V1ZG8tb3AsCi13aGljaCBjaGFuZ2VzIHRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgc2VjdGlvbi4gIEFic29sdXRlIHNlY3Rpb25zIGFyZQotbm90IHN1cHBvcnRlZCBieSBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLiAgVGhlIGFkZHJlc3Mgb2YgYSBzZWN0aW9uIG1heSBiZQotYXNzaWduZWQgd2l0aGluIGEgbGlua2VyIHNjcmlwdC4KLUBlbmQgaXRlbWl6ZQotCi1UaGVyZSBhcmUgc29tZSBvdGhlciBmZWF0dXJlcyBvZiB0aGUgTVJJIGFzc2VtYmxlciB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieQotQGNvZGV7QHZhbHVle0FTfX0sIHR5cGljYWxseSBlaXRoZXIgYmVjYXVzZSB0aGV5IGFyZSBkaWZmaWN1bHQgb3IgYmVjYXVzZSB0aGV5Ci1zZWVtIG9mIGxpdHRsZSBjb25zZXF1ZW5jZS4gIFNvbWUgb2YgdGhlc2UgbWF5IGJlIHN1cHBvcnRlZCBpbiBmdXR1cmUgcmVsZWFzZXMuCi0KLUBpdGVtaXplIEBidWxsZXQKLQotQGl0ZW0gRUJDRElDIHN0cmluZ3MKLQotRUJDRElDIHN0cmluZ3MgYXJlIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIHBhY2tlZCBiaW5hcnkgY29kZWQgZGVjaW1hbAotCi1QYWNrZWQgYmluYXJ5IGNvZGVkIGRlY2ltYWwgaXMgbm90IHN1cHBvcnRlZC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgQGNvZGV7REMuUH0KLWFuZCBAY29kZXtEQ0IuUH0gcHNldWRvLW9wcyBhcmUgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7RkVRVX0gcHNldWRvLW9wCi0KLVRoZSBtNjhrIEBjb2Rle0ZFUVV9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXtOT09CSn0gcHNldWRvLW9wCi0KLVRoZSBtNjhrIEBjb2Rle05PT0JKfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7T1BUfSBicmFuY2ggY29udHJvbCBvcHRpb25zCi0KLVRoZSBtNjhrIEBjb2Rle09QVH0gYnJhbmNoIGNvbnRyb2wgb3B0aW9ucy0tLUBjb2Rle0J9LCBAY29kZXtCUlN9LCBAY29kZXtCUkJ9LAotQGNvZGV7QlJMfSwgYW5kIEBjb2Rle0JSV30tLS1hcmUgaWdub3JlZC4gIEBjb2Rle0B2YWx1ZXtBU319IGF1dG9tYXRpY2FsbHkKLXJlbGF4ZXMgYWxsIGJyYW5jaGVzLCB3aGV0aGVyIGZvcndhcmQgb3IgYmFja3dhcmQsIHRvIGFuIGFwcHJvcHJpYXRlIHNpemUsIHNvCi10aGVzZSBvcHRpb25zIHNlcnZlIG5vIHB1cnBvc2UuCi0KLUBpdGVtIEBjb2Rle09QVH0gbGlzdCBjb250cm9sIG9wdGlvbnMKLQotVGhlIGZvbGxvd2luZyBtNjhrIEBjb2Rle09QVH0gbGlzdCBjb250cm9sIG9wdGlvbnMgYXJlIGlnbm9yZWQ6IEBjb2Rle0N9LAotQGNvZGV7Q0VYfSwgQGNvZGV7Q0x9LCBAY29kZXtDUkV9LCBAY29kZXtFfSwgQGNvZGV7R30sIEBjb2Rle0l9LCBAY29kZXtNfSwKLUBjb2Rle01FWH0sIEBjb2Rle01DfSwgQGNvZGV7TUR9LCBAY29kZXtYfS4KLQotQGl0ZW0gb3RoZXIgQGNvZGV7T1BUfSBvcHRpb25zCi0KLVRoZSBmb2xsb3dpbmcgbTY4ayBAY29kZXtPUFR9IG9wdGlvbnMgYXJlIGlnbm9yZWQ6IEBjb2Rle05FU1R9LCBAY29kZXtPfSwKLUBjb2Rle09MRH0sIEBjb2Rle09QfSwgQGNvZGV7UH0sIEBjb2Rle1BDT30sIEBjb2Rle1BDUn0sIEBjb2Rle1BDU30sIEBjb2Rle1J9LgotCi1AaXRlbSBAY29kZXtPUFR9IEBjb2Rle0R9IG9wdGlvbiBpcyBkZWZhdWx0Ci0KLVRoZSBtNjhrIEBjb2Rle09QVH0gQGNvZGV7RH0gb3B0aW9uIGlzIHRoZSBkZWZhdWx0LCB1bmxpa2UgdGhlIE1SSSBhc3NlbWJsZXIuCi1AY29kZXtPUFQgTk9EfSBtYXkgYmUgdXNlZCB0byB0dXJuIGl0IG9mZi4KLQotQGl0ZW0gQGNvZGV7WFJFRn0gcHNldWRvLW9wLgotCi1UaGUgbTY4ayBAY29kZXtYUkVGfSBwc2V1ZG8tb3AgaXMgaWdub3JlZC4KLQotQGl0ZW0gQGNvZGV7LmRlYnVnfSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7LmRlYnVnfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7LmV4dGVuZGVkfSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7LmV4dGVuZGVkfSBwc2V1ZG8tb3AgaXMgbm90IHN1cHBvcnRlZC4KLQotQGl0ZW0gQGNvZGV7Lmxpc3R9IHBzZXVkby1vcC4KLQotVGhlIHZhcmlvdXMgb3B0aW9ucyBvZiB0aGUgaTk2MCBAY29kZXsubGlzdH0gcHNldWRvLW9wIGFyZSBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsub3B0aW1pemV9IHBzZXVkby1vcAotCi1UaGUgaTk2MCBAY29kZXsub3B0aW1pemV9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AaXRlbSBAY29kZXsub3V0cHV0fSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7Lm91dHB1dH0gcHNldWRvLW9wIGlzIG5vdCBzdXBwb3J0ZWQuCi0KLUBpdGVtIEBjb2Rley5zZXRyZWFsfSBwc2V1ZG8tb3AKLQotVGhlIGk5NjAgQGNvZGV7LnNldHJlYWx9IHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkLgotCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgTUQKLUBzZWN0aW9uIERlcGVuZGVuY3kgdHJhY2tpbmc6IEBjb2Rley0tTUR9Ci0KLUBraW5kZXggLS1NRAotQGNpbmRleCBkZXBlbmRlbmN5IHRyYWNraW5nCi1AY2luZGV4IG1ha2UgcnVsZXMKLQotQGNvZGV7QHZhbHVle0FTfX0gY2FuIGdlbmVyYXRlIGEgZGVwZW5kZW5jeSBmaWxlIGZvciB0aGUgZmlsZSBpdCBjcmVhdGVzLiAgVGhpcwotZmlsZSBjb25zaXN0cyBvZiBhIHNpbmdsZSBydWxlIHN1aXRhYmxlIGZvciBAY29kZXttYWtlfSBkZXNjcmliaW5nIHRoZQotZGVwZW5kZW5jaWVzIG9mIHRoZSBtYWluIHNvdXJjZSBmaWxlLgotCi1UaGUgcnVsZSBpcyB3cml0dGVuIHRvIHRoZSBmaWxlIG5hbWVkIGluIGl0cyBhcmd1bWVudC4KLQotVGhpcyBmZWF0dXJlIGlzIHVzZWQgaW4gdGhlIGF1dG9tYXRpYyB1cGRhdGluZyBvZiBtYWtlZmlsZXMuCi0KLUBub2RlIG8KLUBzZWN0aW9uIE5hbWUgdGhlIE9iamVjdCBGaWxlOiBAY29kZXstb30KLQotQGtpbmRleCAtbwotQGNpbmRleCBuYW1pbmcgb2JqZWN0IGZpbGUKLUBjaW5kZXggb2JqZWN0IGZpbGUgbmFtZQotVGhlcmUgaXMgYWx3YXlzIG9uZSBvYmplY3QgZmlsZSBvdXRwdXQgd2hlbiB5b3UgcnVuIEBjb2Rle0B2YWx1ZXtBU319LiAgQnkKLWRlZmF1bHQgaXQgaGFzIHRoZSBuYW1lCi1AaWZzZXQgR0VORVJJQwotQGlmc2V0IEk5NjAKLUBmaWxle2Eub3V0fSAob3IgQGZpbGV7Yi5vdXR9LCBmb3IgSW50ZWwgOTYwIHRhcmdldHMgb25seSkuCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBJOTYwCi1AZmlsZXthLm91dH0uCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJOTYwCi1AZmlsZXtiLm91dH0uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBJOTYwCi1AZmlsZXthLm91dH0uCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZjbGVhcgotWW91IHVzZSB0aGlzIG9wdGlvbiAod2hpY2ggdGFrZXMgZXhhY3RseSBvbmUgZmlsZW5hbWUpIHRvIGdpdmUgdGhlCi1vYmplY3QgZmlsZSBhIGRpZmZlcmVudCBuYW1lLgotCi1XaGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUgaXMgY2FsbGVkLCBAY29kZXtAdmFsdWV7QVN9fSBvdmVyd3JpdGVzIGFueQotZXhpc3RpbmcgZmlsZSBvZiB0aGUgc2FtZSBuYW1lLgotCi1Abm9kZSBSCi1Ac2VjdGlvbiBKb2luIERhdGEgYW5kIFRleHQgU2VjdGlvbnM6IEBjb2Rley1SfQotCi1Aa2luZGV4IC1SCi1AY2luZGV4IGRhdGEgYW5kIHRleHQgc2VjdGlvbnMsIGpvaW5pbmcKLUBjaW5kZXggdGV4dCBhbmQgZGF0YSBzZWN0aW9ucywgam9pbmluZwotQGNpbmRleCBqb2luaW5nIHRleHQgYW5kIGRhdGEgc2VjdGlvbnMKLUBjaW5kZXggbWVyZ2luZyB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zCi1AY29kZXstUn0gdGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gd3JpdGUgdGhlIG9iamVjdCBmaWxlIGFzIGlmIGFsbAotZGF0YS1zZWN0aW9uIGRhdGEgbGl2ZXMgaW4gdGhlIHRleHQgc2VjdGlvbi4gIFRoaXMgaXMgb25seSBkb25lIGF0Ci10aGUgdmVyeSBsYXN0IG1vbWVudDogIHlvdXIgYmluYXJ5IGRhdGEgYXJlIHRoZSBzYW1lLCBidXQgZGF0YQotc2VjdGlvbiBwYXJ0cyBhcmUgcmVsb2NhdGVkIGRpZmZlcmVudGx5LiAgVGhlIGRhdGEgc2VjdGlvbiBwYXJ0IG9mCi15b3VyIG9iamVjdCBmaWxlIGlzIHplcm8gYnl0ZXMgbG9uZyBiZWNhdXNlIGFsbCBpdHMgYnl0ZXMgYXJlCi1hcHBlbmRlZCB0byB0aGUgdGV4dCBzZWN0aW9uLiAgKEB4cmVme1NlY3Rpb25zLCxTZWN0aW9ucyBhbmQgUmVsb2NhdGlvbn0uKQotCi1XaGVuIHlvdSBzcGVjaWZ5IEBjb2Rley1SfSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBnZW5lcmF0ZSBzaG9ydGVyCi1hZGRyZXNzIGRpc3BsYWNlbWVudHMgKGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgdG8gY3Jvc3MgYmV0d2VlbiB0ZXh0IGFuZAotZGF0YSBzZWN0aW9uKS4gIFdlIHJlZnJhaW4gZnJvbSBkb2luZyB0aGlzIHNpbXBseSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi1vbGRlciB2ZXJzaW9ucyBvZiBAY29kZXtAdmFsdWV7QVN9fS4gIEluIGZ1dHVyZSwgQGNvZGV7LVJ9IG1heSB3b3JrIHRoaXMgd2F5LgotCi1AaWZzZXQgQ09GRgotV2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciBDT0ZGIG91dHB1dCwKLXRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSB1c2Ugc2VjdGlvbnMgbmFtZWQgQHNhbXB7LnRleHR9IGFuZAotQHNhbXB7LmRhdGF9LgotQGVuZCBpZnNldAotCi1AaWZzZXQgSFBQQQotQGNvZGV7LVJ9IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFueSBvZiB0aGUgSFBQQSB0YXJnZXRzLiAgVXNpbmcKLUBjb2Rley1SfSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGZyb20gQGNvZGV7QHZhbHVle0FTfX0uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIHN0YXRpc3RpY3MKLUBzZWN0aW9uIERpc3BsYXkgQXNzZW1ibHkgU3RhdGlzdGljczogQGNvZGV7LS1zdGF0aXN0aWNzfQotCi1Aa2luZGV4IC0tc3RhdGlzdGljcwotQGNpbmRleCBzdGF0aXN0aWNzLCBhYm91dCBhc3NlbWJseQotQGNpbmRleCB0aW1lLCB0b3RhbCBmb3IgYXNzZW1ibHkKLUBjaW5kZXggc3BhY2UgdXNlZCwgbWF4aW11bSBmb3IgYXNzZW1ibHkKLVVzZSBAc2FtcHstLXN0YXRpc3RpY3N9IHRvIGRpc3BsYXkgdHdvIHN0YXRpc3RpY3MgYWJvdXQgdGhlIHJlc291cmNlcyB1c2VkIGJ5Ci1AY29kZXtAdmFsdWV7QVN9fTogdGhlIG1heGltdW0gYW1vdW50IG9mIHNwYWNlIGFsbG9jYXRlZCBkdXJpbmcgdGhlIGFzc2VtYmx5Ci0oaW4gYnl0ZXMpLCBhbmQgdGhlIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIHRha2VuIGZvciB0aGUgYXNzZW1ibHkgKGluIEBzY3tjcHV9Ci1zZWNvbmRzKS4KLQotQG5vZGUgdHJhZGl0aW9uYWwtZm9ybWF0Ci1Ac2VjdGlvbiBDb21wYXRpYmxlIG91dHB1dDogQGNvZGV7LS10cmFkaXRpb25hbC1mb3JtYXR9Ci0KLUBraW5kZXggLS10cmFkaXRpb25hbC1mb3JtYXQKLUZvciBzb21lIHRhcmdldHMsIHRoZSBvdXRwdXQgb2YgQGNvZGV7QHZhbHVle0FTfX0gaXMgZGlmZmVyZW50IGluIHNvbWUgd2F5cwotZnJvbSB0aGUgb3V0cHV0IG9mIHNvbWUgZXhpc3RpbmcgYXNzZW1ibGVyLiAgVGhpcyBzd2l0Y2ggcmVxdWVzdHMKLUBjb2Rle0B2YWx1ZXtBU319IHRvIHVzZSB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0IGluc3RlYWQuCi0KLUZvciBleGFtcGxlLCBpdCBkaXNhYmxlcyB0aGUgZXhjZXB0aW9uIGZyYW1lIG9wdGltaXphdGlvbnMgd2hpY2gKLUBjb2Rle0B2YWx1ZXtBU319IG5vcm1hbGx5IGRvZXMgYnkgZGVmYXVsdCBvbiBAY29kZXtAdmFsdWV7R0NDfX0gb3V0cHV0LgotCi1Abm9kZSB2Ci1Ac2VjdGlvbiBBbm5vdW5jZSBWZXJzaW9uOiBAY29kZXstdn0KLQotQGtpbmRleCAtdgotQGtpbmRleCAtdmVyc2lvbgotQGNpbmRleCBhc3NlbWJsZXIgdmVyc2lvbgotQGNpbmRleCB2ZXJzaW9uIG9mIGFzc2VtYmxlcgotWW91IGNhbiBmaW5kIG91dCB3aGF0IHZlcnNpb24gb2YgYXMgaXMgcnVubmluZyBieSBpbmNsdWRpbmcgdGhlCi1vcHRpb24gQHNhbXB7LXZ9ICh3aGljaCB5b3UgY2FuIGFsc28gc3BlbGwgYXMgQHNhbXB7LXZlcnNpb259KSBvbiB0aGUKLWNvbW1hbmQgbGluZS4KLQotQG5vZGUgVwotQHNlY3Rpb24gU3VwcHJlc3MgV2FybmluZ3M6IEBjb2Rley1XfQotCi1Aa2luZGV4IC1XCi1AY2luZGV4IHN1cHByZXNzaW5nIHdhcm5pbmdzCi1AY2luZGV4IHdhcm5pbmdzLCBzdXBwcmVzc2luZwotQGNvZGV7QHZhbHVle0FTfX0gc2hvdWxkIG5ldmVyIGdpdmUgYSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2Ugd2hlbgotYXNzZW1ibGluZyBjb21waWxlciBvdXRwdXQuICBCdXQgcHJvZ3JhbXMgd3JpdHRlbiBieSBwZW9wbGUgb2Z0ZW4KLWNhdXNlIEBjb2Rle0B2YWx1ZXtBU319IHRvIGdpdmUgYSB3YXJuaW5nIHRoYXQgYSBwYXJ0aWN1bGFyIGFzc3VtcHRpb24gd2FzCi1tYWRlLiAgQWxsIHN1Y2ggd2FybmluZ3MgYXJlIGRpcmVjdGVkIHRvIHRoZSBzdGFuZGFyZCBlcnJvciBmaWxlLgotSWYgeW91IHVzZSB0aGlzIG9wdGlvbiwgbm8gd2FybmluZ3MgYXJlIGlzc3VlZC4gIFRoaXMgb3B0aW9uIG9ubHkKLWFmZmVjdHMgdGhlIHdhcm5pbmcgbWVzc2FnZXM6IGl0IGRvZXMgbm90IGNoYW5nZSBhbnkgcGFydGljdWxhciBvZiBob3cKLUBjb2Rle0B2YWx1ZXtBU319IGFzc2VtYmxlcyB5b3VyIGZpbGUuICBFcnJvcnMsIHdoaWNoIHN0b3AgdGhlIGFzc2VtYmx5LCBhcmUKLXN0aWxsIHJlcG9ydGVkLgotCi1Abm9kZSBaCi1Ac2VjdGlvbiBHZW5lcmF0ZSBPYmplY3QgRmlsZSBpbiBTcGl0ZSBvZiBFcnJvcnM6IEBjb2Rley1afQotQGNpbmRleCBvYmplY3QgZmlsZSwgYWZ0ZXIgZXJyb3JzCi1AY2luZGV4IGVycm9ycywgY29udGludWluZyBhZnRlcgotQWZ0ZXIgYW4gZXJyb3IgbWVzc2FnZSwgQGNvZGV7QHZhbHVle0FTfX0gbm9ybWFsbHkgcHJvZHVjZXMgbm8gb3V0cHV0LiAgSWYgZm9yCi1zb21lIHJlYXNvbiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gb2JqZWN0IGZpbGUgb3V0cHV0IGV2ZW4gYWZ0ZXIKLUBjb2Rle0B2YWx1ZXtBU319IGdpdmVzIGFuIGVycm9yIG1lc3NhZ2Ugb24geW91ciBwcm9ncmFtLCB1c2UgdGhlIEBzYW1wey1afQotb3B0aW9uLiAgSWYgdGhlcmUgYXJlIGFueSBlcnJvcnMsIEBjb2Rle0B2YWx1ZXtBU319IGNvbnRpbnVlcyBhbnl3YXlzLCBhbmQKLXdyaXRlcyBhbiBvYmplY3QgZmlsZSBhZnRlciBhIGZpbmFsIHdhcm5pbmcgbWVzc2FnZSBvZiB0aGUgZm9ybSBAc2FtcHtAdmFye259Ci1lcnJvcnMsIEB2YXJ7bX0gd2FybmluZ3MsIGdlbmVyYXRpbmcgYmFkIG9iamVjdCBmaWxlLn0KLQotQG5vZGUgU3ludGF4Ci1AY2hhcHRlciBTeW50YXgKLQotQGNpbmRleCBtYWNoaW5lLWluZGVwZW5kZW50IHN5bnRheAotQGNpbmRleCBzeW50YXgsIG1hY2hpbmUtaW5kZXBlbmRlbnQKLVRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIG1hY2hpbmUtaW5kZXBlbmRlbnQgc3ludGF4IGFsbG93ZWQgaW4gYQotc291cmNlIGZpbGUuICBAY29kZXtAdmFsdWV7QVN9fSBzeW50YXggaXMgc2ltaWxhciB0byB3aGF0IG1hbnkgb3RoZXIKLWFzc2VtYmxlcnMgdXNlOyBpdCBpcyBpbnNwaXJlZCBieSB0aGUgQlNEIDQuMgotQGlmY2xlYXIgVkFYCi1hc3NlbWJsZXIuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBWQVgKLWFzc2VtYmxlciwgZXhjZXB0IHRoYXQgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3QgYXNzZW1ibGUgVmF4IGJpdC1maWVsZHMuCi1AZW5kIGlmc2V0Ci0KLUBtZW51Ci0qIFByZXByb2Nlc3Npbmc6OiAgICAgICAgICAgICAgUHJlcHJvY2Vzc2luZwotKiBXaGl0ZXNwYWNlOjogICAgICAgICAgICAgICAgICBXaGl0ZXNwYWNlCi0qIENvbW1lbnRzOjogICAgICAgICAgICAgICAgICAgIENvbW1lbnRzCi0qIFN5bWJvbCBJbnRybzo6ICAgICAgICAgICAgICAgIFN5bWJvbHMKLSogU3RhdGVtZW50czo6ICAgICAgICAgICAgICAgICAgU3RhdGVtZW50cwotKiBDb25zdGFudHM6OiAgICAgICAgICAgICAgICAgICBDb25zdGFudHMKLUBlbmQgbWVudQotCi1Abm9kZSBQcmVwcm9jZXNzaW5nCi1Ac2VjdGlvbiBQcmVwcm9jZXNzaW5nCi0KLUBjaW5kZXggcHJlcHJvY2Vzc2luZwotVGhlIEBjb2Rle0B2YWx1ZXtBU319IGludGVybmFsIHByZXByb2Nlc3NvcjoKLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggd2hpdGVzcGFjZSwgcmVtb3ZlZCBieSBwcmVwcm9jZXNzb3IKLUBpdGVtCi1hZGp1c3RzIGFuZCByZW1vdmVzIGV4dHJhIHdoaXRlc3BhY2UuICBJdCBsZWF2ZXMgb25lIHNwYWNlIG9yIHRhYiBiZWZvcmUKLXRoZSBrZXl3b3JkcyBvbiBhIGxpbmUsIGFuZCB0dXJucyBhbnkgb3RoZXIgd2hpdGVzcGFjZSBvbiB0aGUgbGluZSBpbnRvCi1hIHNpbmdsZSBzcGFjZS4KLQotQGNpbmRleCBjb21tZW50cywgcmVtb3ZlZCBieSBwcmVwcm9jZXNzb3IKLUBpdGVtCi1yZW1vdmVzIGFsbCBjb21tZW50cywgcmVwbGFjaW5nIHRoZW0gd2l0aCBhIHNpbmdsZSBzcGFjZSwgb3IgYW4KLWFwcHJvcHJpYXRlIG51bWJlciBvZiBuZXdsaW5lcy4KLQotQGNpbmRleCBjb25zdGFudHMsIGNvbnZlcnRlZCBieSBwcmVwcm9jZXNzb3IKLUBpdGVtCi1jb252ZXJ0cyBjaGFyYWN0ZXIgY29uc3RhbnRzIGludG8gdGhlIGFwcHJvcHJpYXRlIG51bWVyaWMgdmFsdWVzLgotQGVuZCBpdGVtaXplCi0KLUl0IGRvZXMgbm90IGRvIG1hY3JvIHByb2Nlc3NpbmcsIGluY2x1ZGUgZmlsZSBoYW5kbGluZywgb3IKLWFueXRoaW5nIGVsc2UgeW91IG1heSBnZXQgZnJvbSB5b3VyIEMgY29tcGlsZXIncyBwcmVwcm9jZXNzb3IuICBZb3UgY2FuCi1kbyBpbmNsdWRlIGZpbGUgcHJvY2Vzc2luZyB3aXRoIHRoZSBAY29kZXsuaW5jbHVkZX0gZGlyZWN0aXZlCi0oQHB4cmVme0luY2x1ZGUsLEBjb2Rley5pbmNsdWRlfX0pLiAgWW91IGNhbiB1c2UgdGhlIEBzY3tnbnV9IEMgY29tcGlsZXIgZHJpdmVyCi10byBnZXQgb3RoZXIgYGBDUFAnJyBzdHlsZSBwcmVwcm9jZXNzaW5nLCBieSBnaXZpbmcgdGhlIGlucHV0IGZpbGUgYQotQHNhbXB7LlN9IHN1ZmZpeC4gIEB4cmVme092ZXJhbGwgT3B0aW9ucywsIE9wdGlvbnMgQ29udHJvbGxpbmcgdGhlIEtpbmQgb2YKLU91dHB1dCwgZ2NjLmluZm8sIFVzaW5nIEdOVSBDQ30uCi0KLUV4Y2VzcyB3aGl0ZXNwYWNlLCBjb21tZW50cywgYW5kIGNoYXJhY3RlciBjb25zdGFudHMKLWNhbm5vdCBiZSB1c2VkIGluIHRoZSBwb3J0aW9ucyBvZiB0aGUgaW5wdXQgdGV4dCB0aGF0IGFyZSBub3QKLXByZXByb2Nlc3NlZC4KLQotQGNpbmRleCB0dXJuaW5nIHByZXByb2Nlc3Npbmcgb24gYW5kIG9mZgotQGNpbmRleCBwcmVwcm9jZXNzaW5nLCB0dXJuaW5nIG9uIGFuZCBvZmYKLUBraW5kZXggI05PX0FQUAotQGtpbmRleCAjQVBQCi1JZiB0aGUgZmlyc3QgbGluZSBvZiBhbiBpbnB1dCBmaWxlIGlzIEBjb2RleyNOT19BUFB9IG9yIGlmIHlvdSB1c2UgdGhlCi1Ac2FtcHstZn0gb3B0aW9uLCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLVdpdGhpbiBhbiBpbnB1dCBmaWxlLCB5b3UgY2FuIGFzayBmb3Igd2hpdGVzcGFjZSBhbmQgY29tbWVudCByZW1vdmFsIGluCi1zcGVjaWZpYyBwb3J0aW9ucyBvZiB0aGUgYnkgcHV0dGluZyBhIGxpbmUgdGhhdCBzYXlzIEBjb2RleyNBUFB9IGJlZm9yZSB0aGUKLXRleHQgdGhhdCBtYXkgY29udGFpbiB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzLCBhbmQgcHV0dGluZyBhIGxpbmUgdGhhdCBzYXlzCi1AY29kZXsjTk9fQVBQfSBhZnRlciB0aGlzIHRleHQuICBUaGlzIGZlYXR1cmUgaXMgbWFpbmx5IGludGVuZCB0byBzdXBwb3J0Ci1AY29kZXthc219IHN0YXRlbWVudHMgaW4gY29tcGlsZXJzIHdob3NlIG91dHB1dCBpcyBvdGhlcndpc2UgZnJlZSBvZiBjb21tZW50cwotYW5kIHdoaXRlc3BhY2UuCi0KLUBub2RlIFdoaXRlc3BhY2UKLUBzZWN0aW9uIFdoaXRlc3BhY2UKLQotQGNpbmRleCB3aGl0ZXNwYWNlCi1AZGZue1doaXRlc3BhY2V9IGlzIG9uZSBvciBtb3JlIGJsYW5rcyBvciB0YWJzLCBpbiBhbnkgb3JkZXIuCi1XaGl0ZXNwYWNlIGlzIHVzZWQgdG8gc2VwYXJhdGUgc3ltYm9scywgYW5kIHRvIG1ha2UgcHJvZ3JhbXMgbmVhdGVyIGZvcgotcGVvcGxlIHRvIHJlYWQuICBVbmxlc3Mgd2l0aGluIGNoYXJhY3RlciBjb25zdGFudHMKLShAcHhyZWZ7Q2hhcmFjdGVycywsQ2hhcmFjdGVyIENvbnN0YW50c30pLCBhbnkgd2hpdGVzcGFjZSBtZWFucyB0aGUgc2FtZQotYXMgZXhhY3RseSBvbmUgc3BhY2UuCi0KLUBub2RlIENvbW1lbnRzCi1Ac2VjdGlvbiBDb21tZW50cwotCi1AY2luZGV4IGNvbW1lbnRzCi1UaGVyZSBhcmUgdHdvIHdheXMgb2YgcmVuZGVyaW5nIGNvbW1lbnRzIHRvIEBjb2Rle0B2YWx1ZXtBU319LiAgSW4gYm90aAotY2FzZXMgdGhlIGNvbW1lbnQgaXMgZXF1aXZhbGVudCB0byBvbmUgc3BhY2UuCi0KLUFueXRoaW5nIGZyb20gQHNhbXB7Lyp9IHRocm91Z2ggdGhlIG5leHQgQHNhbXB7Ki99IGlzIGEgY29tbWVudC4KLVRoaXMgbWVhbnMgeW91IG1heSBub3QgbmVzdCB0aGVzZSBjb21tZW50cy4KLQotQHNtYWxsZXhhbXBsZQotLyoKLSAgVGhlIG9ubHkgd2F5IHRvIGluY2x1ZGUgYSBuZXdsaW5lICgnXG4nKSBpbiBhIGNvbW1lbnQKLSAgaXMgdG8gdXNlIHRoaXMgc29ydCBvZiBjb21tZW50LgotKi8KLQotLyogVGhpcyBzb3J0IG9mIGNvbW1lbnQgZG9lcyBub3QgbmVzdC4gKi8KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlcgotQW55dGhpbmcgZnJvbSB0aGUgQGRmbntsaW5lIGNvbW1lbnR9IGNoYXJhY3RlciB0byB0aGUgbmV4dCBuZXdsaW5lCi1pcyBjb25zaWRlcmVkIGEgY29tbWVudCBhbmQgaXMgaWdub3JlZC4gIFRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyIGlzCi1AaWZzZXQgQTI5SwotQHNhbXB7O30gZm9yIHRoZSBBTUQgMjlLIGZhbWlseTsKLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLUBzYW1wezt9IG9uIHRoZSBBUkM7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvMzAwCi1Ac2FtcHs7fSBmb3IgdGhlIEg4LzMwMCBmYW1pbHk7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvNTAwCi1Ac2FtcHshfSBmb3IgdGhlIEg4LzUwMCBmYW1pbHk7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgSFBQQQotQHNhbXB7O30gZm9yIHRoZSBIUFBBOwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLUBzYW1weyN9IG9uIHRoZSBpOTYwOwotQGVuZCBpZnNldAotQGlmc2V0IFNICi1Ac2FtcHshfSBmb3IgdGhlIEhpdGFjaGkgU0g7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgU1BBUkMKLUBzYW1weyF9IG9uIHRoZSBTUEFSQzsKLUBlbmQgaWZzZXQKLUBpZnNldCBNMzJSCi1Ac2FtcHsjfSBvbiB0aGUgbTMycjsKLUBlbmQgaWZzZXQKLUBpZnNldCBNNjgwWDAKLUBzYW1we3x9IG9uIHRoZSA2ODB4MDsKLUBlbmQgaWZzZXQKLUBpZnNldCBWQVgKLUBzYW1weyN9IG9uIHRoZSBWYXg7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLUBzYW1weyF9IGZvciB0aGUgWjgwMDA7Ci1AZW5kIGlmc2V0Ci1AaWZzZXQgVjg1MAotQHNhbXB7I30gb24gdGhlIFY4NTA7Ci1AZW5kIGlmc2V0Ci1zZWUgQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uICBAcmVmaWxsCi1AYyBGSVhNRSBXaGF0IGFib3V0IGkzODYsIG04OGssIGk4NjA/Ci0KLUBpZnNldCBHRU5FUklDCi1PbiBzb21lIG1hY2hpbmVzIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGxpbmUgY29tbWVudCBjaGFyYWN0ZXJzLiAgT25lCi1jaGFyYWN0ZXIgb25seSBiZWdpbnMgYSBjb21tZW50IGlmIGl0IGlzIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb24KLWEgbGluZSwgd2hpbGUgdGhlIG90aGVyIGFsd2F5cyBiZWdpbnMgYSBjb21tZW50LgotQGVuZCBpZnNldAotCi1AaWZzZXQgVjg1MAotVGhlIFY4NTAgYXNzZW1ibGVyIGFsc28gc3VwcG9ydHMgYSBkb3VibGUgZGFzaCBhcyBzdGFydGluZyBhIGNvbW1lbnQgdGhhdAotZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgotCi1Ac2FtcHstLX07Ci1AZW5kIGlmc2V0Ci0KLUBraW5kZXggIwotQGNpbmRleCBsaW5lcyBzdGFydGluZyB3aXRoIEBjb2RleyN9Ci1AY2luZGV4IGxvZ2ljYWwgbGluZSBudW1iZXJzCi1UbyBiZSBjb21wYXRpYmxlIHdpdGggcGFzdCBhc3NlbWJsZXJzLCBsaW5lcyB0aGF0IGJlZ2luIHdpdGggQHNhbXB7I30gaGF2ZSBhCi1zcGVjaWFsIGludGVycHJldGF0aW9uLiAgRm9sbG93aW5nIHRoZSBAc2FtcHsjfSBzaG91bGQgYmUgYW4gYWJzb2x1dGUKLWV4cHJlc3Npb24gKEBweHJlZntFeHByZXNzaW9uc30pOiB0aGUgbG9naWNhbCBsaW5lIG51bWJlciBvZiB0aGUgQGVtcGh7bmV4dH0KLWxpbmUuICBUaGVuIGEgc3RyaW5nIChAcHhyZWZ7U3RyaW5ncywsIFN0cmluZ3N9KSBpcyBhbGxvd2VkOiBpZiBwcmVzZW50IGl0IGlzIGEKLW5ldyBsb2dpY2FsIGZpbGUgbmFtZS4gIFRoZSByZXN0IG9mIHRoZSBsaW5lLCBpZiBhbnksIHNob3VsZCBiZSB3aGl0ZXNwYWNlLgotCi1JZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBvbiB0aGUgbGluZSBhcmUgbm90IG51bWVyaWMsCi10aGUgbGluZSBpcyBpZ25vcmVkLiAgKEp1c3QgbGlrZSBhIGNvbW1lbnQuKQotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbiBvcmRpbmFyeSBjb21tZW50LgotIyA0Mi02ICJuZXdfZmlsZV9uYW1lIiAgICAjIE5ldyBsb2dpY2FsIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgbG9naWNhbCBsaW5lICMgMzYuCi1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyBmZWF0dXJlIGlzIGRlcHJlY2F0ZWQsIGFuZCBtYXkgZGlzYXBwZWFyIGZyb20gZnV0dXJlIHZlcnNpb25zCi1vZiBAY29kZXtAdmFsdWV7QVN9fS4KLQotQG5vZGUgU3ltYm9sIEludHJvCi1Ac2VjdGlvbiBTeW1ib2xzCi0KLUBjaW5kZXggY2hhcmFjdGVycyB1c2VkIGluIHN5bWJvbHMKLUBpZmNsZWFyIFNQRUNJQUwtU1lNUwotQSBAZGZue3N5bWJvbH0gaXMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBjaG9zZW4gZnJvbSB0aGUgc2V0IG9mIGFsbAotbGV0dGVycyAoYm90aCB1cHBlciBhbmQgbG93ZXIgY2FzZSksIGRpZ2l0cyBhbmQgdGhlIHRocmVlIGNoYXJhY3RlcnMKLUBzYW1we18uJH0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBTUEVDSUFMLVNZTVMKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBIOAotQSBAZGZue3N5bWJvbH0gaXMgb25lIG9yIG1vcmUgY2hhcmFjdGVycyBjaG9zZW4gZnJvbSB0aGUgc2V0IG9mIGFsbAotbGV0dGVycyAoYm90aCB1cHBlciBhbmQgbG93ZXIgY2FzZSksIGRpZ2l0cyBhbmQgdGhlIHRocmVlIGNoYXJhY3RlcnMKLUBzYW1wey5fJH0uICAoU2F2ZSB0aGF0LCBvbiB0aGUgSDgvMzAwIG9ubHksIHlvdSBtYXkgbm90IHVzZSBAc2FtcHskfSBpbgotc3ltYm9sIG5hbWVzLikKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotQGVuZCBpZnNldAotQGlmc2V0IEdFTkVSSUMKLU9uIG1vc3QgbWFjaGluZXMsIHlvdSBjYW4gYWxzbyB1c2UgQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzOyBleGNlcHRpb25zCi1hcmUgbm90ZWQgaW4gQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1ObyBzeW1ib2wgbWF5IGJlZ2luIHdpdGggYSBkaWdpdC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuCi1UaGVyZSBpcyBubyBsZW5ndGggbGltaXQ6IGFsbCBjaGFyYWN0ZXJzIGFyZSBzaWduaWZpY2FudC4gIFN5bWJvbHMgYXJlCi1kZWxpbWl0ZWQgYnkgY2hhcmFjdGVycyBub3QgaW4gdGhhdCBzZXQsIG9yIGJ5IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlCi0oc2luY2UgdGhlIHNvdXJjZSBwcm9ncmFtIG11c3QgZW5kIHdpdGggYSBuZXdsaW5lLCB0aGUgZW5kIG9mIGEgZmlsZSBpcwotbm90IGEgcG9zc2libGUgc3ltYm9sIGRlbGltaXRlcikuICBAeHJlZntTeW1ib2xzfS4KLUBjaW5kZXggbGVuZ3RoIG9mIHN5bWJvbHMKLQotQG5vZGUgU3RhdGVtZW50cwotQHNlY3Rpb24gU3RhdGVtZW50cwotCi1AY2luZGV4IHN0YXRlbWVudHMsIHN0cnVjdHVyZSBvZgotQGNpbmRleCBsaW5lIHNlcGFyYXRvciBjaGFyYWN0ZXIKLUBjaW5kZXggc3RhdGVtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFibm9ybWFsLXNlcGFyYXRvcgotQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pIG9yIGF0IGEKLXNlbWljb2xvbiAoQHNhbXB7O30pLiAgVGhlIG5ld2xpbmUgb3Igc2VtaWNvbG9uIGlzIGNvbnNpZGVyZWQgcGFydCBvZgotdGhlIHByZWNlZGluZyBzdGF0ZW1lbnQuICBOZXdsaW5lcyBhbmQgc2VtaWNvbG9ucyB3aXRoaW4gY2hhcmFjdGVyCi1jb25zdGFudHMgYXJlIGFuIGV4Y2VwdGlvbjogdGhleSBkbyBub3QgZW5kIHN0YXRlbWVudHMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBhYm5vcm1hbC1zZXBhcmF0b3IKLUBpZnNldCBBMjlLCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYW4gYGBhdCcnCi1zaWduIChAc2FtcHtAQH0pLiAgVGhlIG5ld2xpbmUgb3IgYXQgc2lnbiBpcyBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCi1wcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIGF0IHNpZ25zIHdpdGhpbiBjaGFyYWN0ZXIgY29uc3RhbnRzCi1hcmUgYW4gZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSkgb3IgYW4gZXhjbGFtYXRpb24gCi1wb2ludCAoQHNhbXB7IX0pLiAgVGhlIG5ld2xpbmUgb3IgZXhjbGFtYXRpb24gcG9pbnQgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZQotcHJlY2VkaW5nIHN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBleGNsYW1hdGlvbiBwb2ludHMgd2l0aGluIGNoYXJhY3RlcgotY29uc3RhbnRzIGFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGlmc2V0IEg4Ci1BIEBkZm57c3RhdGVtZW50fSBlbmRzIGF0IGEgbmV3bGluZSBjaGFyYWN0ZXIgKEBzYW1we1xufSk7IG9yIChmb3IgdGhlCi1IOC8zMDApIGEgZG9sbGFyIHNpZ24gKEBzYW1weyR9KTsgb3IgKGZvciB0aGUKLUhpdGFjaGktU0ggb3IgdGhlCi1IOC81MDApIGEgc2VtaWNvbG9uCi0oQHNhbXB7O30pLiAgVGhlIG5ld2xpbmUgb3Igc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBjb25zaWRlcmVkIHBhcnQgb2YKLXRoZSBwcmVjZWRpbmcgc3RhdGVtZW50LiAgTmV3bGluZXMgYW5kIHNlcGFyYXRvcnMgd2l0aGluIGNoYXJhY3RlcgotY29uc3RhbnRzIGFyZSBhbiBleGNlcHRpb246IHRoZXkgZG8gbm90IGVuZCBzdGF0ZW1lbnRzLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AaWZzZXQgR0VORVJJQwotQSBAZGZue3N0YXRlbWVudH0gZW5kcyBhdCBhIG5ld2xpbmUgY2hhcmFjdGVyIChAc2FtcHtcbn0pIG9yIGxpbmUKLXNlcGFyYXRvciBjaGFyYWN0ZXIuICAoVGhlIGxpbmUgc2VwYXJhdG9yIGlzIHVzdWFsbHkgQHNhbXB7O30sIHVubGVzcwotdGhpcyBjb25mbGljdHMgd2l0aCB0aGUgY29tbWVudCBjaGFyYWN0ZXI7IEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uKSAgVGhlCi1uZXdsaW5lIG9yIHNlcGFyYXRvciBjaGFyYWN0ZXIgaXMgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBwcmVjZWRpbmcKLXN0YXRlbWVudC4gIE5ld2xpbmVzIGFuZCBzZXBhcmF0b3JzIHdpdGhpbiBjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBhbgotZXhjZXB0aW9uOiB0aGV5IGRvIG5vdCBlbmQgc3RhdGVtZW50cy4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCBuZXdsaW5lLCByZXF1aXJlZCBhdCBmaWxlIGVuZAotQGNpbmRleCBFT0YsIG5ld2xpbmUgbXVzdCBwcmVjZWRlCi1JdCBpcyBhbiBlcnJvciB0byBlbmQgYW55IHN0YXRlbWVudCB3aXRoIGVuZC1vZi1maWxlOiAgdGhlIGxhc3QKLWNoYXJhY3RlciBvZiBhbnkgaW5wdXQgZmlsZSBzaG91bGQgYmUgYSBuZXdsaW5lLkByZWZpbGwKLQotQW4gZW1wdHkgc3RhdGVtZW50IGlzIGFsbG93ZWQsIGFuZCBtYXkgaW5jbHVkZSB3aGl0ZXNwYWNlLiAgSXQgaXMgaWdub3JlZC4KLQotQGNpbmRleCBpbnN0cnVjdGlvbnMgYW5kIGRpcmVjdGl2ZXMKLUBjaW5kZXggZGlyZWN0aXZlcyBhbmQgaW5zdHJ1Y3Rpb25zCi1AYyAia2V5IHN5bWJvbCIgaXMgbm90IHVzZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudDsgc2VlbXMgcGVkYW50aWMgdG8KLUBjIEBkZWZue30gaXQgaW4gdGhhdCBjYXNlLCBhcyB3YXMgZG9uZSBwcmV2aW91c2x5Li4uICBkb2NAY3lnbnVzLmNvbSwKLUBjIDEzZmViOTEuCi1BIHN0YXRlbWVudCBiZWdpbnMgd2l0aCB6ZXJvIG9yIG1vcmUgbGFiZWxzLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEKLWtleSBzeW1ib2wgd2hpY2ggZGV0ZXJtaW5lcyB3aGF0IGtpbmQgb2Ygc3RhdGVtZW50IGl0IGlzLiAgVGhlIGtleQotc3ltYm9sIGRldGVybWluZXMgdGhlIHN5bnRheCBvZiB0aGUgcmVzdCBvZiB0aGUgc3RhdGVtZW50LiAgSWYgdGhlCi1zeW1ib2wgYmVnaW5zIHdpdGggYSBkb3QgQHNhbXB7Ln0gdGhlbiB0aGUgc3RhdGVtZW50IGlzIGFuIGFzc2VtYmxlcgotZGlyZWN0aXZlOiB0eXBpY2FsbHkgdmFsaWQgZm9yIGFueSBjb21wdXRlci4gIElmIHRoZSBzeW1ib2wgYmVnaW5zIHdpdGgKLWEgbGV0dGVyIHRoZSBzdGF0ZW1lbnQgaXMgYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgQGRmbntpbnN0cnVjdGlvbn06IGl0Ci1hc3NlbWJsZXMgaW50byBhIG1hY2hpbmUgbGFuZ3VhZ2UgaW5zdHJ1Y3Rpb24uCi1AaWZzZXQgR0VORVJJQwotRGlmZmVyZW50IHZlcnNpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319IGZvciBkaWZmZXJlbnQgY29tcHV0ZXJzCi1yZWNvZ25pemUgZGlmZmVyZW50IGluc3RydWN0aW9ucy4gIEluIGZhY3QsIHRoZSBzYW1lIHN5bWJvbCBtYXkKLXJlcHJlc2VudCBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbiBpbiBhIGRpZmZlcmVudCBjb21wdXRlcidzIGFzc2VtYmx5Ci1sYW5ndWFnZS5AcmVmaWxsCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggQGNvZGV7On0gKGxhYmVsKQotQGNpbmRleCBsYWJlbCAoQGNvZGV7On0pCi1BIGxhYmVsIGlzIGEgc3ltYm9sIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24gKEBjb2Rlezp9KS4KLVdoaXRlc3BhY2UgYmVmb3JlIGEgbGFiZWwgb3IgYWZ0ZXIgYSBjb2xvbiBpcyBwZXJtaXR0ZWQsIGJ1dCB5b3UgbWF5IG5vdAotaGF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gYSBsYWJlbCdzIHN5bWJvbCBhbmQgaXRzIGNvbG9uLiBAeHJlZntMYWJlbHN9LgotCi1AaWZzZXQgSFBQQQotRm9yIEhQUEEgdGFyZ2V0cywgbGFiZWxzIG5lZWQgbm90IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgY29sb24sIGJ1dCAKLXRoZSBkZWZpbml0aW9uIG9mIGEgbGFiZWwgbXVzdCBiZWdpbiBpbiBjb2x1bW4gemVyby4gIFRoaXMgYWxzbyBpbXBsaWVzIHRoYXQKLW9ubHkgb25lIGxhYmVsIG1heSBiZSBkZWZpbmVkIG9uIGVhY2ggbGluZS4KLUBlbmQgaWZzZXQKLQotQHNtYWxsZXhhbXBsZQotbGFiZWw6ICAgICAuZGlyZWN0aXZlICAgIGZvbGxvd2VkIGJ5IHNvbWV0aGluZwotYW5vdGhlcl9sYWJlbDogICAgICAgICAgICMgVGhpcyBpcyBhbiBlbXB0eSBzdGF0ZW1lbnQuCi0gICAgICAgICAgIGluc3RydWN0aW9uICAgb3BlcmFuZF8xLCBvcGVyYW5kXzIsIEBkb3Rze30KLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIENvbnN0YW50cwotQHNlY3Rpb24gQ29uc3RhbnRzCi0KLUBjaW5kZXggY29uc3RhbnRzCi1BIGNvbnN0YW50IGlzIGEgbnVtYmVyLCB3cml0dGVuIHNvIHRoYXQgaXRzIHZhbHVlIGlzIGtub3duIGJ5Ci1pbnNwZWN0aW9uLCB3aXRob3V0IGtub3dpbmcgYW55IGNvbnRleHQuICBMaWtlIHRoaXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLS5ieXRlICA3NCwgMDExMiwgMDkyLCAweDRBLCAwWDRhLCAnSiwgJ1xKICMgQWxsIHRoZSBzYW1lIHZhbHVlLgotLmFzY2lpICJSaW5nIHRoZSBiZWxsXDciICAgICAgICAgICAgICAgICAgIyBBIHN0cmluZyBjb25zdGFudC4KLS5vY3RhICAweDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlBQkNERUYwICMgQSBiaWdudW0uCi0uZmxvYXQgMGYtMzE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3XAotOTUwMjg4NDE5NzEuNjkzOTkzNzUxRS00MCAgICAgICAgICAgICAgICAgIyAtIHBpLCBhIGZsb251bS4KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBtZW51Ci0qIENoYXJhY3RlcnM6OiAgICAgICAgICAgICAgICAgIENoYXJhY3RlciBDb25zdGFudHMKLSogTnVtYmVyczo6ICAgICAgICAgICAgICAgICAgICAgTnVtYmVyIENvbnN0YW50cwotQGVuZCBtZW51Ci0KLUBub2RlIENoYXJhY3RlcnMKLUBzdWJzZWN0aW9uIENoYXJhY3RlciBDb25zdGFudHMKLQotQGNpbmRleCBjaGFyYWN0ZXIgY29uc3RhbnRzCi1AY2luZGV4IGNvbnN0YW50cywgY2hhcmFjdGVyCi1UaGVyZSBhcmUgdHdvIGtpbmRzIG9mIGNoYXJhY3RlciBjb25zdGFudHMuICBBIEBkZm57Y2hhcmFjdGVyfSBzdGFuZHMKLWZvciBvbmUgY2hhcmFjdGVyIGluIG9uZSBieXRlIGFuZCBpdHMgdmFsdWUgbWF5IGJlIHVzZWQgaW4KLW51bWVyaWMgZXhwcmVzc2lvbnMuICBTdHJpbmcgY29uc3RhbnRzIChwcm9wZXJseSBjYWxsZWQgc3RyaW5nCi1AZW1waHtsaXRlcmFsc30pIGFyZSBwb3RlbnRpYWxseSBtYW55IGJ5dGVzIGFuZCB0aGVpciB2YWx1ZXMgbWF5IG5vdCBiZQotdXNlZCBpbiBhcml0aG1ldGljIGV4cHJlc3Npb25zLgotCi1AbWVudQotKiBTdHJpbmdzOjogICAgICAgICAgICAgICAgICAgICBTdHJpbmdzCi0qIENoYXJzOjogICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3RlcnMKLUBlbmQgbWVudQotCi1Abm9kZSBTdHJpbmdzCi1Ac3Vic3Vic2VjdGlvbiBTdHJpbmdzCi0KLUBjaW5kZXggc3RyaW5nIGNvbnN0YW50cwotQGNpbmRleCBjb25zdGFudHMsIHN0cmluZwotQSBAZGZue3N0cmluZ30gaXMgd3JpdHRlbiBiZXR3ZWVuIGRvdWJsZS1xdW90ZXMuICBJdCBtYXkgY29udGFpbgotZG91YmxlLXF1b3RlcyBvciBudWxsIGNoYXJhY3RlcnMuICBUaGUgd2F5IHRvIGdldCBzcGVjaWFsIGNoYXJhY3RlcnMKLWludG8gYSBzdHJpbmcgaXMgdG8gQGRmbntlc2NhcGV9IHRoZXNlIGNoYXJhY3RlcnM6IHByZWNlZGUgdGhlbSB3aXRoCi1hIGJhY2tzbGFzaCBAc2FtcHtcfSBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSBAc2FtcHtcXH0gcmVwcmVzZW50cwotb25lIGJhY2tzbGFzaDogIHRoZSBmaXJzdCBAY29kZXtcfSBpcyBhbiBlc2NhcGUgd2hpY2ggdGVsbHMKLUBjb2Rle0B2YWx1ZXtBU319IHRvIGludGVycHJldCB0aGUgc2Vjb25kIGNoYXJhY3RlciBsaXRlcmFsbHkgYXMgYSBiYWNrc2xhc2gKLSh3aGljaCBwcmV2ZW50cyBAY29kZXtAdmFsdWV7QVN9fSBmcm9tIHJlY29nbml6aW5nIHRoZSBzZWNvbmQgQGNvZGV7XH0gYXMgYW4KLWVzY2FwZSBjaGFyYWN0ZXIpLiAgVGhlIGNvbXBsZXRlIGxpc3Qgb2YgZXNjYXBlcyBmb2xsb3dzLgotCi1AY2luZGV4IGVzY2FwZSBjb2RlcywgY2hhcmFjdGVyCi1AY2luZGV4IGNoYXJhY3RlciBlc2NhcGUgY29kZXMKLUB0YWJsZSBAa2JkCi1AYyAgICAgIEBpdGVtIFxhCi1AYyAgICAgIE1uZW1vbmljIGZvciBBQ0tub3dsZWRnZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwMDcuCi1AYwotQGNpbmRleCBAY29kZXtcYn0gKGJhY2tzcGFjZSBjaGFyYWN0ZXIpCi1AY2luZGV4IGJhY2tzcGFjZSAoQGNvZGV7XGJ9KQotQGl0ZW0gXGIKLU1uZW1vbmljIGZvciBiYWNrc3BhY2U7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEwLgotCi1AYyAgICAgIEBpdGVtIFxlCi1AYyAgICAgIE1uZW1vbmljIGZvciBFT1RleHQ7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDA0LgotQGMKLUBjaW5kZXggQGNvZGV7XGZ9IChmb3JtZmVlZCBjaGFyYWN0ZXIpCi1AY2luZGV4IGZvcm1mZWVkIChAY29kZXtcZn0pCi1AaXRlbSBcZgotTW5lbW9uaWMgZm9yIEZvcm1GZWVkOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxNC4KLQotQGNpbmRleCBAY29kZXtcbn0gKG5ld2xpbmUgY2hhcmFjdGVyKQotQGNpbmRleCBuZXdsaW5lIChAY29kZXtcbn0pCi1AaXRlbSBcbgotTW5lbW9uaWMgZm9yIG5ld2xpbmU7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDEyLgotCi1AYyAgICAgIEBpdGVtIFxwCi1AYyAgICAgIE1uZW1vbmljIGZvciBwcmVmaXg7IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDMzLCB1c3VhbGx5IGtub3duIGFzIEBjb2Rle2VzY2FwZX0uCi1AYwotQGNpbmRleCBAY29kZXtccn0gKGNhcnJpYWdlIHJldHVybiBjaGFyYWN0ZXIpCi1AY2luZGV4IGNhcnJpYWdlIHJldHVybiAoQGNvZGV7XHJ9KQotQGl0ZW0gXHIKLU1uZW1vbmljIGZvciBjYXJyaWFnZS1SZXR1cm47IGZvciBBU0NJSSB0aGlzIGlzIG9jdGFsIGNvZGUgMDE1LgotCi1AYyAgICAgIEBpdGVtIFxzCi1AYyAgICAgIE1uZW1vbmljIGZvciBzcGFjZTsgZm9yIEFTQ0lJIHRoaXMgaXMgb2N0YWwgY29kZSAwNDAuICBJbmNsdWRlZCBmb3IgY29tcGxpYW5jZSB3aXRoCi1AYyAgICAgIG90aGVyIGFzc2VtYmxlcnMuCi1AYwotQGNpbmRleCBAY29kZXtcdH0gKHRhYikKLUBjaW5kZXggdGFiIChAY29kZXtcdH0pCi1AaXRlbSBcdAotTW5lbW9uaWMgZm9yIGhvcml6b250YWwgVGFiOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxMS4KLQotQGMgICAgICBAaXRlbSBcdgotQGMgICAgICBNbmVtb25pYyBmb3IgVmVydGljYWwgdGFiOyBmb3IgQVNDSUkgdGhpcyBpcyBvY3RhbCBjb2RlIDAxMy4KLUBjICAgICAgQGl0ZW0gXHggQHZhcntkaWdpdH0gQHZhcntkaWdpdH0gQHZhcntkaWdpdH0KLUBjICAgICAgQSBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIgY29kZS4gIFRoZSBudW1lcmljIGNvZGUgaXMgMyBoZXhhZGVjaW1hbCBkaWdpdHMuCi1AYwotQGNpbmRleCBAY29kZXtcQHZhcntkZGR9fSAob2N0YWwgY2hhcmFjdGVyIGNvZGUpCi1AY2luZGV4IG9jdGFsIGNoYXJhY3RlciBjb2RlIChAY29kZXtcQHZhcntkZGR9fSkKLUBpdGVtIFwgQHZhcntkaWdpdH0gQHZhcntkaWdpdH0gQHZhcntkaWdpdH0KLUFuIG9jdGFsIGNoYXJhY3RlciBjb2RlLiAgVGhlIG51bWVyaWMgY29kZSBpcyAzIG9jdGFsIGRpZ2l0cy4KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgVW5peCBzeXN0ZW1zLCA4IGFuZCA5IGFyZSBhY2NlcHRlZCBhcyBkaWdpdHM6Ci1mb3IgZXhhbXBsZSwgQGNvZGV7XDAwOH0gaGFzIHRoZSB2YWx1ZSAwMTAsIGFuZCBAY29kZXtcMDA5fSB0aGUgdmFsdWUgMDExLgotCi1AY2luZGV4IEBjb2Rle1xAdmFye3hkLi4ufX0gKGhleCBjaGFyYWN0ZXIgY29kZSkKLUBjaW5kZXggaGV4IGNoYXJhY3RlciBjb2RlIChAY29kZXtcQHZhcnt4ZC4uLn19KQotQGl0ZW0gXEBjb2Rle3h9IEB2YXJ7aGV4LWRpZ2l0cy4uLn0KLUEgaGV4IGNoYXJhY3RlciBjb2RlLiAgQWxsIHRyYWlsaW5nIGhleCBkaWdpdHMgYXJlIGNvbWJpbmVkLiAgRWl0aGVyIHVwcGVyIG9yCi1sb3dlciBjYXNlIEBjb2Rle3h9IHdvcmtzLgotCi1AY2luZGV4IEBjb2Rle1xcfSAoQHNhbXB7XH0gY2hhcmFjdGVyKQotQGNpbmRleCBiYWNrc2xhc2ggKEBjb2Rle1xcfSkKLUBpdGVtIFxcCi1SZXByZXNlbnRzIG9uZSBAc2FtcHtcfSBjaGFyYWN0ZXIuCi0KLUBjICAgICAgQGl0ZW0gXCcKLUBjICAgICAgUmVwcmVzZW50cyBvbmUgQHNhbXB7J30gKGFjY2VudCBhY3V0ZSkgY2hhcmFjdGVyLgotQGMgICAgICBUaGlzIGlzIG5lZWRlZCBpbiBzaW5nbGUgY2hhcmFjdGVyIGxpdGVyYWxzCi1AYyAgICAgIChAeHJlZntDaGFyYWN0ZXJzLCxDaGFyYWN0ZXIgQ29uc3RhbnRzfS4pIHRvIHJlcHJlc2VudAotQGMgICAgICBhIEBzYW1weyd9LgotQGMKLUBjaW5kZXggQGNvZGV7XCJ9IChkb3VibGVxdW90ZSBjaGFyYWN0ZXIpCi1AY2luZGV4IGRvdWJsZXF1b3RlIChAY29kZXtcIn0pCi1AaXRlbSBcIgotUmVwcmVzZW50cyBvbmUgQHNhbXB7In0gY2hhcmFjdGVyLiAgTmVlZGVkIGluIHN0cmluZ3MgdG8gcmVwcmVzZW50Ci10aGlzIGNoYXJhY3RlciwgYmVjYXVzZSBhbiB1bmVzY2FwZWQgQHNhbXB7In0gd291bGQgZW5kIHRoZSBzdHJpbmcuCi0KLUBpdGVtIFwgQHZhcnthbnl0aGluZy1lbHNlfQotQW55IG90aGVyIGNoYXJhY3RlciB3aGVuIGVzY2FwZWQgYnkgQGtiZHtcfSBnaXZlcyBhIHdhcm5pbmcsIGJ1dAotYXNzZW1ibGVzIGFzIGlmIHRoZSBAc2FtcHtcfSB3YXMgbm90IHByZXNlbnQuICBUaGUgaWRlYSBpcyB0aGF0IGlmCi15b3UgdXNlZCBhbiBlc2NhcGUgc2VxdWVuY2UgeW91IGNsZWFybHkgZGlkbid0IHdhbnQgdGhlIGxpdGVyYWwKLWludGVycHJldGF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyLiAgSG93ZXZlciBAY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8KLW90aGVyIGludGVycHJldGF0aW9uLCBzbyBAY29kZXtAdmFsdWV7QVN9fSBrbm93cyBpdCBpcyBnaXZpbmcgeW91IHRoZSB3cm9uZwotY29kZSBhbmQgd2FybnMgeW91IG9mIHRoZSBmYWN0LgotQGVuZCB0YWJsZQotCi1XaGljaCBjaGFyYWN0ZXJzIGFyZSBlc2NhcGFibGUsIGFuZCB3aGF0IHRob3NlIGVzY2FwZXMgcmVwcmVzZW50LAotdmFyaWVzIHdpZGVseSBhbW9uZyBhc3NlbWJsZXJzLiAgVGhlIGN1cnJlbnQgc2V0IGlzIHdoYXQgd2UgdGhpbmsKLXRoZSBCU0QgNC4yIGFzc2VtYmxlciByZWNvZ25pemVzLCBhbmQgaXMgYSBzdWJzZXQgb2Ygd2hhdCBtb3N0IEMKLWNvbXBpbGVycyByZWNvZ25pemUuICBJZiB5b3UgYXJlIGluIGRvdWJ0LCBkbyBub3QgdXNlIGFuIGVzY2FwZQotc2VxdWVuY2UuCi0KLUBub2RlIENoYXJzCi1Ac3Vic3Vic2VjdGlvbiBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggc2luZ2xlIGNoYXJhY3RlciBjb25zdGFudAotQGNpbmRleCBjaGFyYWN0ZXIsIHNpbmdsZQotQGNpbmRleCBjb25zdGFudCwgc2luZ2xlIGNoYXJhY3RlcgotQSBzaW5nbGUgY2hhcmFjdGVyIG1heSBiZSB3cml0dGVuIGFzIGEgc2luZ2xlIHF1b3RlIGltbWVkaWF0ZWx5Ci1mb2xsb3dlZCBieSB0aGF0IGNoYXJhY3Rlci4gIFRoZSBzYW1lIGVzY2FwZXMgYXBwbHkgdG8gY2hhcmFjdGVycyBhcwotdG8gc3RyaW5ncy4gIFNvIGlmIHlvdSB3YW50IHRvIHdyaXRlIHRoZSBjaGFyYWN0ZXIgYmFja3NsYXNoLCB5b3UKLW11c3Qgd3JpdGUgQGtiZHsnXFx9IHdoZXJlIHRoZSBmaXJzdCBAY29kZXtcfSBlc2NhcGVzIHRoZSBzZWNvbmQKLUBjb2Rle1x9LiAgQXMgeW91IGNhbiBzZWUsIHRoZSBxdW90ZSBpcyBhbiBhY3V0ZSBhY2NlbnQsIG5vdCBhCi1ncmF2ZSBhY2NlbnQuICBBIG5ld2xpbmUKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFibm9ybWFsLXNlcGFyYXRvcgotKG9yIHNlbWljb2xvbiBAc2FtcHs7fSkKLUBlbmQgaWZjbGVhcgotQGlmc2V0IGFibm9ybWFsLXNlcGFyYXRvcgotQGlmc2V0IEEyOUsKLShvciBhdCBzaWduIEBzYW1we0BAfSkKLUBlbmQgaWZzZXQKLUBpZnNldCBIOAotKG9yIGRvbGxhciBzaWduIEBzYW1weyR9LCBmb3IgdGhlIEg4LzMwMDsgb3Igc2VtaWNvbG9uIEBzYW1wezt9IGZvciB0aGUKLUhpdGFjaGkgU0ggb3IKLUg4LzUwMCkKLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFuIGFjdXRlIGFjY2VudCBpcyB0YWtlbiBhcyBhIGxpdGVyYWwgY2hhcmFjdGVyCi1hbmQgZG9lcyBub3QgY291bnQgYXMgdGhlIGVuZCBvZiBhIHN0YXRlbWVudC4gIFRoZSB2YWx1ZSBvZiBhIGNoYXJhY3RlcgotY29uc3RhbnQgaW4gYSBudW1lcmljIGV4cHJlc3Npb24gaXMgdGhlIG1hY2hpbmUncyBieXRlLXdpZGUgY29kZSBmb3IKLXRoYXQgY2hhcmFjdGVyLiAgQGNvZGV7QHZhbHVle0FTfX0gYXNzdW1lcyB5b3VyIGNoYXJhY3RlciBjb2RlIGlzIEFTQ0lJOgotQGtiZHsnQX0gbWVhbnMgNjUsIEBrYmR7J0J9IG1lYW5zIDY2LCBhbmQgc28gb24uIEByZWZpbGwKLQotQG5vZGUgTnVtYmVycwotQHN1YnNlY3Rpb24gTnVtYmVyIENvbnN0YW50cwotCi1AY2luZGV4IGNvbnN0YW50cywgbnVtYmVyCi1AY2luZGV4IG51bWJlciBjb25zdGFudHMKLUBjb2Rle0B2YWx1ZXtBU319IGRpc3Rpbmd1aXNoZXMgdGhyZWUga2luZHMgb2YgbnVtYmVycyBhY2NvcmRpbmcgdG8gaG93IHRoZXkKLWFyZSBzdG9yZWQgaW4gdGhlIHRhcmdldCBtYWNoaW5lLiAgQGVtcGh7SW50ZWdlcnN9IGFyZSBudW1iZXJzIHRoYXQKLXdvdWxkIGZpdCBpbnRvIGFuIEBjb2Rle2ludH0gaW4gdGhlIEMgbGFuZ3VhZ2UuICBAZW1waHtCaWdudW1zfSBhcmUKLWludGVnZXJzLCBidXQgdGhleSBhcmUgc3RvcmVkIGluIG1vcmUgdGhhbiAzMiBiaXRzLiAgQGVtcGh7RmxvbnVtc30KLWFyZSBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBkZXNjcmliZWQgYmVsb3cuCi0KLUBtZW51Ci0qIEludGVnZXJzOjogICAgICAgICAgICAgICAgICAgIEludGVnZXJzCi0qIEJpZ251bXM6OiAgICAgICAgICAgICAgICAgICAgIEJpZ251bXMKLSogRmxvbnVtczo6ICAgICAgICAgICAgICAgICAgICAgRmxvbnVtcwotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEk5NjAKLSogQml0IEZpZWxkczo6ICAgICAgICAgICAgICAgICAgQml0IEZpZWxkcwotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIG1lbnUKLQotQG5vZGUgSW50ZWdlcnMKLUBzdWJzdWJzZWN0aW9uIEludGVnZXJzCi1AY2luZGV4IGludGVnZXJzCi1AY2luZGV4IGNvbnN0YW50cywgaW50ZWdlcgotCi1AY2luZGV4IGJpbmFyeSBpbnRlZ2VycwotQGNpbmRleCBpbnRlZ2VycywgYmluYXJ5Ci1BIGJpbmFyeSBpbnRlZ2VyIGlzIEBzYW1wezBifSBvciBAc2FtcHswQn0gZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIG9mCi10aGUgYmluYXJ5IGRpZ2l0cyBAc2FtcHswMX0uCi0KLUBjaW5kZXggb2N0YWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIG9jdGFsCi1BbiBvY3RhbCBpbnRlZ2VyIGlzIEBzYW1wezB9IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBvZiB0aGUgb2N0YWwKLWRpZ2l0cyAoQHNhbXB7MDEyMzQ1Njd9KS4KLQotQGNpbmRleCBkZWNpbWFsIGludGVnZXJzCi1AY2luZGV4IGludGVnZXJzLCBkZWNpbWFsCi1BIGRlY2ltYWwgaW50ZWdlciBzdGFydHMgd2l0aCBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IKLW1vcmUgZGlnaXRzIChAc2FtcHswMTIzNDU2Nzg5fSkuCi0KLUBjaW5kZXggaGV4YWRlY2ltYWwgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlcnMsIGhleGFkZWNpbWFsCi1BIGhleGFkZWNpbWFsIGludGVnZXIgaXMgQHNhbXB7MHh9IG9yIEBzYW1wezBYfSBmb2xsb3dlZCBieSBvbmUgb3IKLW1vcmUgaGV4YWRlY2ltYWwgZGlnaXRzIGNob3NlbiBmcm9tIEBzYW1wezAxMjM0NTY3ODlhYmNkZWZBQkNERUZ9LgotCi1JbnRlZ2VycyBoYXZlIHRoZSB1c3VhbCB2YWx1ZXMuICBUbyBkZW5vdGUgYSBuZWdhdGl2ZSBpbnRlZ2VyLCB1c2UKLXRoZSBwcmVmaXggb3BlcmF0b3IgQHNhbXB7LX0gZGlzY3Vzc2VkIHVuZGVyIGV4cHJlc3Npb25zCi0oQHB4cmVme1ByZWZpeCBPcHMsLFByZWZpeCBPcGVyYXRvcnN9KS4KLQotQG5vZGUgQmlnbnVtcwotQHN1YnN1YnNlY3Rpb24gQmlnbnVtcwotCi1AY2luZGV4IGJpZ251bXMKLUBjaW5kZXggY29uc3RhbnRzLCBiaWdudW0KLUEgQGRmbntiaWdudW19IGhhcyB0aGUgc2FtZSBzeW50YXggYW5kIHNlbWFudGljcyBhcyBhbiBpbnRlZ2VyCi1leGNlcHQgdGhhdCB0aGUgbnVtYmVyIChvciBpdHMgbmVnYXRpdmUpIHRha2VzIG1vcmUgdGhhbiAzMiBiaXRzIHRvCi1yZXByZXNlbnQgaW4gYmluYXJ5LiAgVGhlIGRpc3RpbmN0aW9uIGlzIG1hZGUgYmVjYXVzZSBpbiBzb21lIHBsYWNlcwotaW50ZWdlcnMgYXJlIHBlcm1pdHRlZCB3aGlsZSBiaWdudW1zIGFyZSBub3QuCi0KLUBub2RlIEZsb251bXMKLUBzdWJzdWJzZWN0aW9uIEZsb251bXMKLUBjaW5kZXggZmxvbnVtcwotQGNpbmRleCBmbG9hdGluZyBwb2ludCBudW1iZXJzCi1AY2luZGV4IGNvbnN0YW50cywgZmxvYXRpbmcgcG9pbnQKLQotQGNpbmRleCBwcmVjaXNpb24sIGZsb2F0aW5nIHBvaW50Ci1BIEBkZm57ZmxvbnVtfSByZXByZXNlbnRzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgVGhlIHRyYW5zbGF0aW9uIGlzCi1pbmRpcmVjdDogYSBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IG51bWJlciBmcm9tIHRoZSB0ZXh0IGlzIGNvbnZlcnRlZCBieQotQGNvZGV7QHZhbHVle0FTfX0gdG8gYSBnZW5lcmljIGJpbmFyeSBmbG9hdGluZyBwb2ludCBudW1iZXIgb2YgbW9yZSB0aGFuCi1zdWZmaWNpZW50IHByZWNpc2lvbi4gIFRoaXMgZ2VuZXJpYyBmbG9hdGluZyBwb2ludCBudW1iZXIgaXMgY29udmVydGVkCi10byBhIHBhcnRpY3VsYXIgY29tcHV0ZXIncyBmbG9hdGluZyBwb2ludCBmb3JtYXQgKG9yIGZvcm1hdHMpIGJ5IGEKLXBvcnRpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gc3BlY2lhbGl6ZWQgdG8gdGhhdCBjb21wdXRlci4KLQotQSBmbG9udW0gaXMgd3JpdHRlbiBieSB3cml0aW5nIChpbiBvcmRlcikKLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgZGlnaXQgQHNhbXB7MH0uCi1AaWZzZXQgSFBQQQotKEBzYW1wezB9IGlzIG9wdGlvbmFsIG9uIHRoZSBIUFBBLikKLUBlbmQgaWZzZXQKLQotQGl0ZW0KLUEgbGV0dGVyLCB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319IHRoZSByZXN0IG9mIHRoZSBudW1iZXIgaXMgYSBmbG9udW0uCi1AaWZzZXQgR0VORVJJQwotQGtiZHtlfSBpcyByZWNvbW1lbmRlZC4gIENhc2UgaXMgbm90IGltcG9ydGFudC4KLUBpZ25vcmUKLUBjIEZJWE1FOiB2ZXJpZnkgaWYgZmxvbnVtIHN5bnRheCByZWFsbHkgdGhpcyB2YWd1ZSBmb3IgbW9zdCBjYXNlcwotKEFueSBvdGhlcndpc2UgaWxsZWdhbCBsZXR0ZXIgd29ya3MgaGVyZSwgYnV0IHRoYXQgbWlnaHQgYmUgY2hhbmdlZC4gIFZheCBCU0QKLTQuMiBhc3NlbWJsZXIgc2VlbXMgdG8gYWxsb3cgYW55IG9mIEBzYW1we2RlZmdoREVGR0h9LikKLUBlbmQgaWdub3JlCi0KLU9uIHRoZSBIOC8zMDAsIEg4LzUwMCwKLUhpdGFjaGkgU0gsCi1hbmQgQU1EIDI5SyBhcmNoaXRlY3R1cmVzLCB0aGUgbGV0dGVyIG11c3QgYmUKLW9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLQotT24gdGhlIEFSQywgdGhlIGxldHRlciBtdXN0IGJlIG9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlJTfQotKGluIHVwcGVyIG9yIGxvd2VyIGNhc2UpLgotCi1PbiB0aGUgSW50ZWwgOTYwIGFyY2hpdGVjdHVyZSwgdGhlIGxldHRlciBtdXN0IGJlCi1vbmUgb2YgdGhlIGxldHRlcnMgQHNhbXB7REZUfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi0KLU9uIHRoZSBIUFBBIGFyY2hpdGVjdHVyZSwgdGhlIGxldHRlciBtdXN0IGJlIEBzYW1we0V9ICh1cHBlciBjYXNlIG9ubHkpLgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEEyOUsKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBBUkMKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlJTfSAoaW4gdXBwZXIgb3IgbG93ZXIgY2FzZSkuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlBSU1h9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi1UaGUgbGV0dGVyIEBzYW1we0V9ICh1cHBlciBjYXNlIG9ubHkpLgotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLU9uZSBvZiB0aGUgbGV0dGVycyBAc2FtcHtERlR9IChpbiB1cHBlciBvciBsb3dlciBjYXNlKS4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1AaXRlbQotQW4gb3B0aW9uYWwgc2lnbjogZWl0aGVyIEBzYW1weyt9IG9yIEBzYW1wey19LgotCi1AaXRlbQotQW4gb3B0aW9uYWwgQGRmbntpbnRlZ2VyIHBhcnR9OiB6ZXJvIG9yIG1vcmUgZGVjaW1hbCBkaWdpdHMuCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBAZGZue2ZyYWN0aW9uYWwgcGFydH06IEBzYW1wey59IGZvbGxvd2VkIGJ5IHplcm8KLW9yIG1vcmUgZGVjaW1hbCBkaWdpdHMuCi0KLUBpdGVtCi1BbiBvcHRpb25hbCBleHBvbmVudCwgY29uc2lzdGluZyBvZjoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUFuIEBzYW1we0V9IG9yIEBzYW1we2V9LgotQGMgSSBjYW4ndCBmaW5kIGEgY29uZmlnIHdoZXJlICJFWFBfQ0hBUlMiIGlzIG90aGVyIHRoYW4gJ2VFJywgYnV0IGluCi1AYyBwcmluY2lwbGUgdGhpcyBjYW4gcGVyZmVjdGx5IHdlbGwgYmUgZGlmZmVyZW50IG9uIGRpZmZlcmVudCB0YXJnZXRzLgotQGl0ZW0KLU9wdGlvbmFsIHNpZ246IGVpdGhlciBAc2FtcHsrfSBvciBAc2FtcHstfS4KLUBpdGVtCi1PbmUgb3IgbW9yZSBkZWNpbWFsIGRpZ2l0cy4KLUBlbmQgaXRlbWl6ZQotCi1AZW5kIGl0ZW1pemUKLQotQXQgbGVhc3Qgb25lIG9mIHRoZSBpbnRlZ2VyIHBhcnQgb3IgdGhlIGZyYWN0aW9uYWwgcGFydCBtdXN0IGJlCi1wcmVzZW50LiAgVGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciBoYXMgdGhlIHVzdWFsIGJhc2UtMTAgdmFsdWUuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGRvZXMgYWxsIHByb2Nlc3NpbmcgdXNpbmcgaW50ZWdlcnMuICBGbG9udW1zIGFyZSBjb21wdXRlZAotaW5kZXBlbmRlbnRseSBvZiBhbnkgZmxvYXRpbmcgcG9pbnQgaGFyZHdhcmUgaW4gdGhlIGNvbXB1dGVyIHJ1bm5pbmcKLUBjb2Rle0B2YWx1ZXtBU319LgotCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSTk2MAotQGMgQml0IGZpZWxkcyBhcmUgd3JpdHRlbiBhcyBhIGdlbmVyYWwgZmFjaWxpdHkgYnV0IGFyZSBhbHNvIGNvbnRyb2xsZWQKLUBjIGJ5IGEgY29uZGl0aW9uYWwtY29tcGlsYXRpb24gZmxhZy0tLXdoaWNoIGlzIGFzIG9mIG5vdyAoMjFtYXI5MSkKLUBjIHR1cm5lZCBvbiBvbmx5IGJ5IHRoZSBpOTYwIGNvbmZpZyBvZiBHQVMuCi1Abm9kZSBCaXQgRmllbGRzCi1Ac3Vic3Vic2VjdGlvbiBCaXQgRmllbGRzCi0KLUBjaW5kZXggYml0IGZpZWxkcwotQGNpbmRleCBjb25zdGFudHMsIGJpdCBmaWVsZAotWW91IGNhbiBhbHNvIGRlZmluZSBudW1lcmljIGNvbnN0YW50cyBhcyBAZGZue2JpdCBmaWVsZHN9Lgotc3BlY2lmeSB0d28gbnVtYmVycyBzZXBhcmF0ZWQgYnkgYSBjb2xvbi0tLQotQGV4YW1wbGUKLUB2YXJ7bWFza306QHZhcnt2YWx1ZX0KLUBlbmQgZXhhbXBsZQotQG5vaW5kZW50Ci1AY29kZXtAdmFsdWV7QVN9fSBhcHBsaWVzIGEgYml0d2lzZSBAc2N7YW5kfSBiZXR3ZWVuIEB2YXJ7bWFza30gYW5kCi1AdmFye3ZhbHVlfS4KLQotVGhlIHJlc3VsdGluZyBudW1iZXIgaXMgdGhlbiBwYWNrZWQKLUBpZnNldCBHRU5FUklDCi1AYyB0aGlzIGNvbmRpdGlvbmFsIHBhcmVuIGluIGNhc2UgYml0IGZpZWxkcyB0dXJuZWQgb24gZWxzZXdoZXJlIHRoYW4gOTYwCi0oaW4gaG9zdC1kZXBlbmRlbnQgYnl0ZSBvcmRlcikKLUBlbmQgaWZzZXQKLWludG8gYSBmaWVsZCB3aG9zZSB3aWR0aCBkZXBlbmRzIG9uIHdoaWNoIGFzc2VtYmxlciBkaXJlY3RpdmUgaGFzIHRoZQotYml0LWZpZWxkIGFzIGl0cyBhcmd1bWVudC4gIE92ZXJmbG93IChhIHJlc3VsdCBmcm9tIHRoZSBiaXR3aXNlIGFuZAotcmVxdWlyaW5nIG1vcmUgYmluYXJ5IGRpZ2l0cyB0byByZXByZXNlbnQpIGlzIG5vdCBhbiBlcnJvcjsgaW5zdGVhZCwKLW1vcmUgY29uc3RhbnRzIGFyZSBnZW5lcmF0ZWQsIG9mIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGJlZ2lubmluZyB3aXRoIHRoZQotbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXRzLkByZWZpbGwKLQotVGhlIGRpcmVjdGl2ZXMgQGNvZGV7LmJ5dGV9LCBAY29kZXsuaHdvcmR9LCBAY29kZXsuaW50fSwgQGNvZGV7Lmxvbmd9LAotQGNvZGV7LnNob3J0fSwgYW5kIEBjb2Rley53b3JkfSBhY2NlcHQgYml0LWZpZWxkIGFyZ3VtZW50cy4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBTZWN0aW9ucwotQGNoYXB0ZXIgU2VjdGlvbnMgYW5kIFJlbG9jYXRpb24KLUBjaW5kZXggc2VjdGlvbnMKLUBjaW5kZXggcmVsb2NhdGlvbgotCi1AbWVudQotKiBTZWNzIEJhY2tncm91bmQ6OiAgICAgICAgICAgICBCYWNrZ3JvdW5kCi0qIExkIFNlY3Rpb25zOjogICAgICAgICAgICAgICAgIExpbmtlciBTZWN0aW9ucwotKiBBcyBTZWN0aW9uczo6ICAgICAgICAgICAgICAgICBBc3NlbWJsZXIgSW50ZXJuYWwgU2VjdGlvbnMKLSogU3ViLVNlY3Rpb25zOjogICAgICAgICAgICAgICAgU3ViLVNlY3Rpb25zCi0qIGJzczo6ICAgICAgICAgICAgICAgICAgICAgICAgIGJzcyBTZWN0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgU2VjcyBCYWNrZ3JvdW5kCi1Ac2VjdGlvbiBCYWNrZ3JvdW5kCi0KLVJvdWdobHksIGEgc2VjdGlvbiBpcyBhIHJhbmdlIG9mIGFkZHJlc3Nlcywgd2l0aCBubyBnYXBzOyBhbGwgZGF0YQotYGBpbicnIHRob3NlIGFkZHJlc3NlcyBpcyB0cmVhdGVkIHRoZSBzYW1lIGZvciBzb21lIHBhcnRpY3VsYXIgcHVycG9zZS4KLUZvciBleGFtcGxlIHRoZXJlIG1heSBiZSBhIGBgcmVhZCBvbmx5Jycgc2VjdGlvbi4KLQotQGNpbmRleCBsaW5rZXIsIGFuZCBhc3NlbWJsZXIKLUBjaW5kZXggYXNzZW1ibGVyLCBhbmQgbGlua2VyCi1UaGUgbGlua2VyIEBjb2Rle0B2YWx1ZXtMRH19IHJlYWRzIG1hbnkgb2JqZWN0IGZpbGVzIChwYXJ0aWFsIHByb2dyYW1zKSBhbmQKLWNvbWJpbmVzIHRoZWlyIGNvbnRlbnRzIHRvIGZvcm0gYSBydW5uYWJsZSBwcm9ncmFtLiAgV2hlbiBAY29kZXtAdmFsdWV7QVN9fQotZW1pdHMgYW4gb2JqZWN0IGZpbGUsIHRoZSBwYXJ0aWFsIHByb2dyYW0gaXMgYXNzdW1lZCB0byBzdGFydCBhdCBhZGRyZXNzIDAuCi1AY29kZXtAdmFsdWV7TER9fSBhc3NpZ25zIHRoZSBmaW5hbCBhZGRyZXNzZXMgZm9yIHRoZSBwYXJ0aWFsIHByb2dyYW0sIHNvIHRoYXQKLWRpZmZlcmVudCBwYXJ0aWFsIHByb2dyYW1zIGRvIG5vdCBvdmVybGFwLiAgVGhpcyBpcyBhY3R1YWxseSBhbgotb3ZlcnNpbXBsaWZpY2F0aW9uLCBidXQgaXQgc3VmZmljZXMgdG8gZXhwbGFpbiBob3cgQGNvZGV7QHZhbHVle0FTfX0gdXNlcwotc2VjdGlvbnMuCi0KLUBjb2Rle0B2YWx1ZXtMRH19IG1vdmVzIGJsb2NrcyBvZiBieXRlcyBvZiB5b3VyIHByb2dyYW0gdG8gdGhlaXIgcnVuLXRpbWUKLWFkZHJlc3Nlcy4gIFRoZXNlIGJsb2NrcyBzbGlkZSB0byB0aGVpciBydW4tdGltZSBhZGRyZXNzZXMgYXMgcmlnaWQKLXVuaXRzOyB0aGVpciBsZW5ndGggZG9lcyBub3QgY2hhbmdlIGFuZCBuZWl0aGVyIGRvZXMgdGhlIG9yZGVyIG9mIGJ5dGVzCi13aXRoaW4gdGhlbS4gIFN1Y2ggYSByaWdpZCB1bml0IGlzIGNhbGxlZCBhIEBlbXBoe3NlY3Rpb259LiAgQXNzaWduaW5nCi1ydW4tdGltZSBhZGRyZXNzZXMgdG8gc2VjdGlvbnMgaXMgY2FsbGVkIEBkZm57cmVsb2NhdGlvbn0uICBJdCBpbmNsdWRlcwotdGhlIHRhc2sgb2YgYWRqdXN0aW5nIG1lbnRpb25zIG9mIG9iamVjdC1maWxlIGFkZHJlc3NlcyBzbyB0aGV5IHJlZmVyIHRvCi10aGUgcHJvcGVyIHJ1bi10aW1lIGFkZHJlc3Nlcy4KLUBpZnNldCBIOAotRm9yIHRoZSBIOC8zMDAgYW5kIEg4LzUwMCwKLWFuZCBmb3IgdGhlIEhpdGFjaGkgU0gsCi1AY29kZXtAdmFsdWV7QVN9fSBwYWRzIHNlY3Rpb25zIGlmIG5lZWRlZCB0bwotZW5zdXJlIHRoZXkgZW5kIG9uIGEgd29yZCAoc2l4dGVlbiBiaXQpIGJvdW5kYXJ5LgotQGVuZCBpZnNldAotCi1AY2luZGV4IHN0YW5kYXJkIGFzc2VtYmxlciBzZWN0aW9ucwotQW4gb2JqZWN0IGZpbGUgd3JpdHRlbiBieSBAY29kZXtAdmFsdWV7QVN9fSBoYXMgYXQgbGVhc3QgdGhyZWUgc2VjdGlvbnMsIGFueQotb2Ygd2hpY2ggbWF5IGJlIGVtcHR5LiAgVGhlc2UgYXJlIG5hbWVkIEBkZm57dGV4dH0sIEBkZm57ZGF0YX0gYW5kCi1AZGZue2Jzc30gc2VjdGlvbnMuCi0KLUBpZnNldCBDT0ZGCi1AaWZzZXQgR0VORVJJQwotV2hlbiBpdCBnZW5lcmF0ZXMgQ09GRiBvdXRwdXQsCi1AZW5kIGlmc2V0Ci1AY29kZXtAdmFsdWV7QVN9fSBjYW4gYWxzbyBnZW5lcmF0ZSB3aGF0ZXZlciBvdGhlciBuYW1lZCBzZWN0aW9ucyB5b3Ugc3BlY2lmeQotdXNpbmcgdGhlIEBzYW1wey5zZWN0aW9ufSBkaXJlY3RpdmUgKEBweHJlZntTZWN0aW9uLCxAY29kZXsuc2VjdGlvbn19KS4KLUlmIHlvdSBkbyBub3QgdXNlIGFueSBkaXJlY3RpdmVzIHRoYXQgcGxhY2Ugb3V0cHV0IGluIHRoZSBAc2FtcHsudGV4dH0KLW9yIEBzYW1wey5kYXRhfSBzZWN0aW9ucywgdGhlc2Ugc2VjdGlvbnMgc3RpbGwgZXhpc3QsIGJ1dCBhcmUgZW1wdHkuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1AaWZzZXQgR0VORVJJQwotV2hlbiBAY29kZXtAdmFsdWV7QVN9fSBnZW5lcmF0ZXMgU09NIG9yIEVMRiBvdXRwdXQgZm9yIHRoZSBIUFBBLAotQGVuZCBpZnNldAotQGNvZGV7QHZhbHVle0FTfX0gY2FuIGFsc28gZ2VuZXJhdGUgd2hhdGV2ZXIgb3RoZXIgbmFtZWQgc2VjdGlvbnMgeW91Ci1zcGVjaWZ5IHVzaW5nIHRoZSBAc2FtcHsuc3BhY2V9IGFuZCBAc2FtcHsuc3Vic3BhY2V9IGRpcmVjdGl2ZXMuICBTZWUKLUBjaXRle0hQOTAwMCBTZXJpZXMgODAwIEFzc2VtYmx5IExhbmd1YWdlIFJlZmVyZW5jZSBNYW51YWx9Ci0oSFAgOTI0MzItOTAwMDEpIGZvciBkZXRhaWxzIG9uIHRoZSBAc2FtcHsuc3BhY2V9IGFuZCBAc2FtcHsuc3Vic3BhY2V9Ci1hc3NlbWJsZXIgZGlyZWN0aXZlcy4KLQotQGlmc2V0IFNPTQotQWRkaXRpb25hbGx5LCBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlIHN0YW5kYXJkCi10ZXh0LCBkYXRhLCBhbmQgYnNzIHNlY3Rpb25zIHdoZW4gZ2VuZXJhdGluZyBTT00gb3V0cHV0LiAgUHJvZ3JhbSB0ZXh0Ci1pcyBwbGFjZWQgaW50byB0aGUgQHNhbXB7JENPREUkfSBzZWN0aW9uLCBkYXRhIGludG8gQHNhbXB7JERBVEEkfSwgYW5kCi1CU1MgaW50byBAc2FtcHskQlNTJH0uCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLVdpdGhpbiB0aGUgb2JqZWN0IGZpbGUsIHRoZSB0ZXh0IHNlY3Rpb24gc3RhcnRzIGF0IGFkZHJlc3MgQGNvZGV7MH0sIHRoZQotZGF0YSBzZWN0aW9uIGZvbGxvd3MsIGFuZCB0aGUgYnNzIHNlY3Rpb24gZm9sbG93cyB0aGUgZGF0YSBzZWN0aW9uLgotCi1AaWZzZXQgSFBQQQotV2hlbiBnZW5lcmF0aW5nIGVpdGhlciBTT00gb3IgRUxGIG91dHB1dCBmaWxlcyBvbiB0aGUgSFBQQSwgdGhlIHRleHQKLXNlY3Rpb24gc3RhcnRzIGF0IGFkZHJlc3MgQGNvZGV7MH0sIHRoZSBkYXRhIHNlY3Rpb24gYXQgYWRkcmVzcwotQGNvZGV7MHg0MDAwMDAwfSwgYW5kIHRoZSBic3Mgc2VjdGlvbiBmb2xsb3dzIHRoZSBkYXRhIHNlY3Rpb24uCi1AZW5kIGlmc2V0Ci0KLVRvIGxldCBAY29kZXtAdmFsdWV7TER9fSBrbm93IHdoaWNoIGRhdGEgY2hhbmdlcyB3aGVuIHRoZSBzZWN0aW9ucyBhcmUKLXJlbG9jYXRlZCwgYW5kIGhvdyB0byBjaGFuZ2UgdGhhdCBkYXRhLCBAY29kZXtAdmFsdWV7QVN9fSBhbHNvIHdyaXRlcyB0byB0aGUKLW9iamVjdCBmaWxlIGRldGFpbHMgb2YgdGhlIHJlbG9jYXRpb24gbmVlZGVkLiAgVG8gcGVyZm9ybSByZWxvY2F0aW9uCi1AY29kZXtAdmFsdWV7TER9fSBtdXN0IGtub3csIGVhY2ggdGltZSBhbiBhZGRyZXNzIGluIHRoZSBvYmplY3QKLWZpbGUgaXMgbWVudGlvbmVkOgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVdoZXJlIGluIHRoZSBvYmplY3QgZmlsZSBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgcmVmZXJlbmNlIHRvCi1hbiBhZGRyZXNzPwotQGl0ZW0KLUhvdyBsb25nIChpbiBieXRlcykgaXMgdGhpcyByZWZlcmVuY2U/Ci1AaXRlbQotV2hpY2ggc2VjdGlvbiBkb2VzIHRoZSBhZGRyZXNzIHJlZmVyIHRvPyAgV2hhdCBpcyB0aGUgbnVtZXJpYyB2YWx1ZSBvZgotQGRpc3BsYXkKLShAdmFye2FkZHJlc3N9KSBAbWludXN7fSAoQHZhcntzdGFydC1hZGRyZXNzIG9mIHNlY3Rpb259KT8KLUBlbmQgZGlzcGxheQotQGl0ZW0KLUlzIHRoZSByZWZlcmVuY2UgdG8gYW4gYWRkcmVzcyBgYFByb2dyYW0tQ291bnRlciByZWxhdGl2ZScnPwotQGVuZCBpdGVtaXplCi0KLUBjaW5kZXggYWRkcmVzc2VzLCBmb3JtYXQgb2YKLUBjaW5kZXggc2VjdGlvbi1yZWxhdGl2ZSBhZGRyZXNzaW5nCi1JbiBmYWN0LCBldmVyeSBhZGRyZXNzIEBjb2Rle0B2YWx1ZXtBU319IGV2ZXIgdXNlcyBpcyBleHByZXNzZWQgYXMKLUBkaXNwbGF5Ci0oQHZhcntzZWN0aW9ufSkgKyAoQHZhcntvZmZzZXQgaW50byBzZWN0aW9ufSkKLUBlbmQgZGlzcGxheQotQG5vaW5kZW50Ci1GdXJ0aGVyLCBtb3N0IGV4cHJlc3Npb25zIEBjb2Rle0B2YWx1ZXtBU319IGNvbXB1dGVzIGhhdmUgdGhpcyBzZWN0aW9uLXJlbGF0aXZlCi1uYXR1cmUuCi1AaWZzZXQgU09NCi0oRm9yIHNvbWUgb2JqZWN0IGZvcm1hdHMsIHN1Y2ggYXMgU09NIGZvciB0aGUgSFBQQSwgc29tZSBleHByZXNzaW9ucyBhcmUKLXN5bWJvbC1yZWxhdGl2ZSBpbnN0ZWFkLikKLUBlbmQgaWZzZXQKLQotSW4gdGhpcyBtYW51YWwgd2UgdXNlIHRoZSBub3RhdGlvbiBAe0B2YXJ7c2VjbmFtZX0gQHZhcntOfUB9IHRvIG1lYW4gYGBvZmZzZXQKLUB2YXJ7Tn0gaW50byBzZWN0aW9uIEB2YXJ7c2VjbmFtZX0uJycKLQotQXBhcnQgZnJvbSB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgeW91IG5lZWQgdG8ga25vdyBhYm91dCB0aGUKLUBkZm57YWJzb2x1dGV9IHNlY3Rpb24uICBXaGVuIEBjb2Rle0B2YWx1ZXtMRH19IG1peGVzIHBhcnRpYWwgcHJvZ3JhbXMsCi1hZGRyZXNzZXMgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24gcmVtYWluIHVuY2hhbmdlZC4gIEZvciBleGFtcGxlLCBhZGRyZXNzCi1AY29kZXtAe2Fic29sdXRlIDBAfX0gaXMgYGByZWxvY2F0ZWQnJyB0byBydW4tdGltZSBhZGRyZXNzIDAgYnkKLUBjb2Rle0B2YWx1ZXtMRH19LiAgQWx0aG91Z2ggdGhlIGxpbmtlciBuZXZlciBhcnJhbmdlcyB0d28gcGFydGlhbCBwcm9ncmFtcycKLWRhdGEgc2VjdGlvbnMgd2l0aCBvdmVybGFwcGluZyBhZGRyZXNzZXMgYWZ0ZXIgbGlua2luZywgQGVtcGh7YnkgZGVmaW5pdGlvbn0KLXRoZWlyIGFic29sdXRlIHNlY3Rpb25zIG11c3Qgb3ZlcmxhcC4gIEFkZHJlc3MgQGNvZGV7QHthYnNvbHV0ZUAgMjM5QH19IGluIG9uZQotcGFydCBvZiBhIHByb2dyYW0gaXMgYWx3YXlzIHRoZSBzYW1lIGFkZHJlc3Mgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW5uaW5nIGFzCi1hZGRyZXNzIEBjb2Rle0B7YWJzb2x1dGVAIDIzOUB9fSBpbiBhbnkgb3RoZXIgcGFydCBvZiB0aGUgcHJvZ3JhbS4KLQotVGhlIGlkZWEgb2Ygc2VjdGlvbnMgaXMgZXh0ZW5kZWQgdG8gdGhlIEBkZm57dW5kZWZpbmVkfSBzZWN0aW9uLiAgQW55Ci1hZGRyZXNzIHdob3NlIHNlY3Rpb24gaXMgdW5rbm93biBhdCBhc3NlbWJseSB0aW1lIGlzIGJ5IGRlZmluaXRpb24KLXJlbmRlcmVkIEB7dW5kZWZpbmVkIEB2YXJ7VX1AfS0tLXdoZXJlIEB2YXJ7VX0gaXMgZmlsbGVkIGluIGxhdGVyLgotU2luY2UgbnVtYmVycyBhcmUgYWx3YXlzIGRlZmluZWQsIHRoZSBvbmx5IHdheSB0byBnZW5lcmF0ZSBhbiB1bmRlZmluZWQKLWFkZHJlc3MgaXMgdG8gbWVudGlvbiBhbiB1bmRlZmluZWQgc3ltYm9sLiAgQSByZWZlcmVuY2UgdG8gYSBuYW1lZAotY29tbW9uIGJsb2NrIHdvdWxkIGJlIHN1Y2ggYSBzeW1ib2w6IGl0cyB2YWx1ZSBpcyB1bmtub3duIGF0IGFzc2VtYmx5Ci10aW1lIHNvIGl0IGhhcyBzZWN0aW9uIEBlbXBoe3VuZGVmaW5lZH0uCi0KLUJ5IGFuYWxvZ3kgdGhlIHdvcmQgQGVtcGh7c2VjdGlvbn0gaXMgdXNlZCB0byBkZXNjcmliZSBncm91cHMgb2Ygc2VjdGlvbnMgaW4KLXRoZSBsaW5rZWQgcHJvZ3JhbS4gIEBjb2Rle0B2YWx1ZXtMRH19IHB1dHMgYWxsIHBhcnRpYWwgcHJvZ3JhbXMnIHRleHQKLXNlY3Rpb25zIGluIGNvbnRpZ3VvdXMgYWRkcmVzc2VzIGluIHRoZSBsaW5rZWQgcHJvZ3JhbS4gIEl0IGlzCi1jdXN0b21hcnkgdG8gcmVmZXIgdG8gdGhlIEBlbXBoe3RleHQgc2VjdGlvbn0gb2YgYSBwcm9ncmFtLCBtZWFuaW5nIGFsbAotdGhlIGFkZHJlc3NlcyBvZiBhbGwgcGFydGlhbCBwcm9ncmFtcycgdGV4dCBzZWN0aW9ucy4gIExpa2V3aXNlIGZvcgotZGF0YSBhbmQgYnNzIHNlY3Rpb25zLgotCi1Tb21lIHNlY3Rpb25zIGFyZSBtYW5pcHVsYXRlZCBieSBAY29kZXtAdmFsdWV7TER9fTsgb3RoZXJzIGFyZSBpbnZlbnRlZCBmb3IKLXVzZSBvZiBAY29kZXtAdmFsdWV7QVN9fSBhbmQgaGF2ZSBubyBtZWFuaW5nIGV4Y2VwdCBkdXJpbmcgYXNzZW1ibHkuCi0KLUBub2RlIExkIFNlY3Rpb25zCi1Ac2VjdGlvbiBMaW5rZXIgU2VjdGlvbnMKLUBjb2Rle0B2YWx1ZXtMRH19IGRlYWxzIHdpdGgganVzdCBmb3VyIGtpbmRzIG9mIHNlY3Rpb25zLCBzdW1tYXJpemVkIGJlbG93LgotCi1AdGFibGUgQHN0cm9uZwotCi1AaWZzZXQgQ09GRgotQGNpbmRleCBuYW1lZCBzZWN0aW9ucwotQGNpbmRleCBzZWN0aW9ucywgbmFtZWQKLUBpdGVtIG5hbWVkIHNlY3Rpb25zCi1AZW5kIGlmc2V0Ci1AaWZzZXQgYW91dC1ib3V0Ci1AY2luZGV4IHRleHQgc2VjdGlvbgotQGNpbmRleCBkYXRhIHNlY3Rpb24KLUBpdGVteCB0ZXh0IHNlY3Rpb24KLUBpdGVteCBkYXRhIHNlY3Rpb24KLUBlbmQgaWZzZXQKLVRoZXNlIHNlY3Rpb25zIGhvbGQgeW91ciBwcm9ncmFtLiAgQGNvZGV7QHZhbHVle0FTfX0gYW5kIEBjb2Rle0B2YWx1ZXtMRH19IHRyZWF0IHRoZW0gYXMKLXNlcGFyYXRlIGJ1dCBlcXVhbCBzZWN0aW9ucy4gIEFueXRoaW5nIHlvdSBjYW4gc2F5IG9mIG9uZSBzZWN0aW9uIGlzCi10cnVlIGFub3RoZXIuCi1AaWZzZXQgYW91dC1ib3V0Ci1XaGVuIHRoZSBwcm9ncmFtIGlzIHJ1bm5pbmcsIGhvd2V2ZXIsIGl0IGlzCi1jdXN0b21hcnkgZm9yIHRoZSB0ZXh0IHNlY3Rpb24gdG8gYmUgdW5hbHRlcmFibGUuICBUaGUKLXRleHQgc2VjdGlvbiBpcyBvZnRlbiBzaGFyZWQgYW1vbmcgcHJvY2Vzc2VzOiBpdCBjb250YWlucwotaW5zdHJ1Y3Rpb25zLCBjb25zdGFudHMgYW5kIHRoZSBsaWtlLiAgVGhlIGRhdGEgc2VjdGlvbiBvZiBhIHJ1bm5pbmcKLXByb2dyYW0gaXMgdXN1YWxseSBhbHRlcmFibGU6IGZvciBleGFtcGxlLCBDIHZhcmlhYmxlcyB3b3VsZCBiZSBzdG9yZWQKLWluIHRoZSBkYXRhIHNlY3Rpb24uCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggYnNzIHNlY3Rpb24KLUBpdGVtIGJzcyBzZWN0aW9uCi1UaGlzIHNlY3Rpb24gY29udGFpbnMgemVyb2VkIGJ5dGVzIHdoZW4geW91ciBwcm9ncmFtIGJlZ2lucyBydW5uaW5nLiAgSXQKLWlzIHVzZWQgdG8gaG9sZCB1bml0aWFsaXplZCB2YXJpYWJsZXMgb3IgY29tbW9uIHN0b3JhZ2UuICBUaGUgbGVuZ3RoIG9mCi1lYWNoIHBhcnRpYWwgcHJvZ3JhbSdzIGJzcyBzZWN0aW9uIGlzIGltcG9ydGFudCwgYnV0IGJlY2F1c2UgaXQgc3RhcnRzCi1vdXQgY29udGFpbmluZyB6ZXJvZWQgYnl0ZXMgdGhlcmUgaXMgbm8gbmVlZCB0byBzdG9yZSBleHBsaWNpdCB6ZXJvCi1ieXRlcyBpbiB0aGUgb2JqZWN0IGZpbGUuICBUaGUgYnNzIHNlY3Rpb24gd2FzIGludmVudGVkIHRvIGVsaW1pbmF0ZQotdGhvc2UgZXhwbGljaXQgemVyb3MgZnJvbSBvYmplY3QgZmlsZXMuCi0KLUBjaW5kZXggYWJzb2x1dGUgc2VjdGlvbgotQGl0ZW0gYWJzb2x1dGUgc2VjdGlvbgotQWRkcmVzcyAwIG9mIHRoaXMgc2VjdGlvbiBpcyBhbHdheXMgYGByZWxvY2F0ZWQnJyB0byBydW50aW1lIGFkZHJlc3MgMC4KLVRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFuIGFkZHJlc3MgdGhhdCBAY29kZXtAdmFsdWV7TER9fSBtdXN0Ci1ub3QgY2hhbmdlIHdoZW4gcmVsb2NhdGluZy4gIEluIHRoaXMgc2Vuc2Ugd2Ugc3BlYWsgb2YgYWJzb2x1dGUKLWFkZHJlc3NlcyBiZWluZyBgYHVucmVsb2NhdGFibGUnJzogdGhleSBkbyBub3QgY2hhbmdlIGR1cmluZyByZWxvY2F0aW9uLgotCi1AY2luZGV4IHVuZGVmaW5lZCBzZWN0aW9uCi1AaXRlbSB1bmRlZmluZWQgc2VjdGlvbgotVGhpcyBgYHNlY3Rpb24nJyBpcyBhIGNhdGNoLWFsbCBmb3IgYWRkcmVzcyByZWZlcmVuY2VzIHRvIG9iamVjdHMgbm90IGluCi10aGUgcHJlY2VkaW5nIHNlY3Rpb25zLgotQGMgRklYTUU6IHJlZiB0byBzb21lIG90aGVyIGRvYyBvbiBvYmotZmlsZSBmb3JtYXRzIGNvdWxkIGdvIGhlcmUuCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggcmVsb2NhdGlvbiBleGFtcGxlCi1BbiBpZGVhbGl6ZWQgZXhhbXBsZSBvZiB0aHJlZSByZWxvY2F0YWJsZSBzZWN0aW9ucyBmb2xsb3dzLgotQGlmc2V0IENPRkYKLVRoZSBleGFtcGxlIHVzZXMgdGhlIHRyYWRpdGlvbmFsIHNlY3Rpb24gbmFtZXMgQHNhbXB7LnRleHR9IGFuZCBAc2FtcHsuZGF0YX0uCi1AZW5kIGlmc2V0Ci1NZW1vcnkgYWRkcmVzc2VzIGFyZSBvbiB0aGUgaG9yaXpvbnRhbCBheGlzLgotCi1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgICAgICAgICAgICAgKy0tLS0tKy0tLS0rLS0rCi1wYXJ0aWFsIHByb2dyYW0gIyAxOiAgfHR0dHR0fGRkZGR8MDB8Ci0gICAgICAgICAgICAgICAgICAgICAgKy0tLS0tKy0tLS0rLS0rCi0KLSAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICAgZGF0YSBic3MKLSAgICAgICAgICAgICAgICAgICAgICBzZWcuICAgc2VnLiBzZWcuCi0KLSAgICAgICAgICAgICAgICAgICAgICArLS0tKy0tLSstLS0rCi1wYXJ0aWFsIHByb2dyYW0gIyAyOiAgfFRUVHxERER8MDAwfAotICAgICAgICAgICAgICAgICAgICAgICstLS0rLS0tKy0tLSsKLQotICAgICAgICAgICAgICAgICAgICAgICstLSstLS0rLS0tLS0rLS0rLS0tLSstLS0rLS0tLS0rfn4KLWxpbmtlZCBwcm9ncmFtOiAgICAgICB8ICB8VFRUfHR0dHR0fCAgfGRkZGR8REREfDAwMDAwfAotICAgICAgICAgICAgICAgICAgICAgICstLSstLS0rLS0tLS0rLS0rLS0tLSstLS0rLS0tLS0rfn4KLQotICAgIGFkZHJlc3NlczogICAgICAgIDAgQGRvdHN7fQotQGVuZCBzbWFsbGV4YW1wbGUKLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQG5lZWQgNTAwMAotQHRleAotCi1cbGluZXtcaXQgUGFydGlhbCBwcm9ncmFtIFwjMTogXGhmaWx9Ci1cbGluZXtcaWJveHsyLjVjbX17XHR0IHRleHR9XGlib3h7MmNtfXtcdHQgZGF0YX1caWJveHsxY219e1x0dCBic3N9XGhmaWx9Ci1cbGluZXtcYm94aXR7Mi41Y219e1x0dCB0dHR0dH1cYm94aXR7MmNtfXtcdHQgZGRkZH1cYm94aXR7MWNtfXtcdHQgMDB9XGhmaWx9Ci0KLVxsaW5le1xpdCBQYXJ0aWFsIHByb2dyYW0gXCMyOiBcaGZpbH0KLVxsaW5le1xpYm94ezFjbX17XHR0IHRleHR9XGlib3h7MS41Y219e1x0dCBkYXRhfVxpYm94ezFjbX17XHR0IGJzc31caGZpbH0KLVxsaW5le1xib3hpdHsxY219e1x0dCBUVFR9XGJveGl0ezEuNWNtfXtcdHQgRERERH1cYm94aXR7MWNtfXtcdHQgMDAwfVxoZmlsfQotCi1cbGluZXtcaXQgbGlua2VkIHByb2dyYW06IFxoZmlsfQotXGxpbmV7XGlib3h7LjVjbX17fVxpYm94ezFjbX17XHR0IHRleHR9XGlib3h7Mi41Y219e31caWJveHsuNzVjbX17fVxpYm94ezJjbX17XHR0IGRhdGF9XGlib3h7MS41Y219e31caWJveHsyY219e1x0dCBic3N9XGhmaWx9Ci1cbGluZXtcYm94aXR7LjVjbX17fVxib3hpdHsxY219e1x0dCBUVFR9XGJveGl0ezIuNWNtfXtcdHQKLXR0dHR0fVxib3hpdHsuNzVjbX17fVxib3hpdHsyY219e1x0dCBkZGRkfVxib3hpdHsxLjVjbX17XHR0Ci1EREREfVxib3hpdHsyY219e1x0dCAwMDAwMH1cIFxkb3RzXGhmaWx9Ci0KLVxsaW5le1xpdCBhZGRyZXNzZXM6IFxoZmlsfQotXGxpbmV7MFxkb3RzXGhmaWx9Ci0KLUBlbmQgdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotQG5vZGUgQXMgU2VjdGlvbnMKLUBzZWN0aW9uIEFzc2VtYmxlciBJbnRlcm5hbCBTZWN0aW9ucwotCi1AY2luZGV4IGludGVybmFsIGFzc2VtYmxlciBzZWN0aW9ucwotQGNpbmRleCBzZWN0aW9ucyBpbiBtZXNzYWdlcywgaW50ZXJuYWwKLVRoZXNlIHNlY3Rpb25zIGFyZSBtZWFudCBvbmx5IGZvciB0aGUgaW50ZXJuYWwgdXNlIG9mIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhleQotaGF2ZSBubyBtZWFuaW5nIGF0IHJ1bi10aW1lLiAgWW91IGRvIG5vdCByZWFsbHkgbmVlZCB0byBrbm93IGFib3V0IHRoZXNlCi1zZWN0aW9ucyBmb3IgbW9zdCBwdXJwb3NlczsgYnV0IHRoZXkgY2FuIGJlIG1lbnRpb25lZCBpbiBAY29kZXtAdmFsdWV7QVN9fQotd2FybmluZyBtZXNzYWdlcywgc28gaXQgbWlnaHQgYmUgaGVscGZ1bCB0byBoYXZlIGFuIGlkZWEgb2YgdGhlaXIKLW1lYW5pbmdzIHRvIEBjb2Rle0B2YWx1ZXtBU319LiAgVGhlc2Ugc2VjdGlvbnMgYXJlIHVzZWQgdG8gcGVybWl0IHRoZQotdmFsdWUgb2YgZXZlcnkgZXhwcmVzc2lvbiBpbiB5b3VyIGFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW0gdG8gYmUgYQotc2VjdGlvbi1yZWxhdGl2ZSBhZGRyZXNzLgotCi1AdGFibGUgQGIKLUBjaW5kZXggYXNzZW1ibGVyIGludGVybmFsIGxvZ2ljIGVycm9yCi1AaXRlbSBBU1NFTUJMRVItSU5URVJOQUwtTE9HSUMtRVJST1IhCi1BbiBpbnRlcm5hbCBhc3NlbWJsZXIgbG9naWMgZXJyb3IgaGFzIGJlZW4gZm91bmQuICBUaGlzIG1lYW5zIHRoZXJlIGlzIGEKLWJ1ZyBpbiB0aGUgYXNzZW1ibGVyLgotCi1AY2luZGV4IGV4cHIgKGludGVybmFsIHNlY3Rpb24pCi1AaXRlbSBleHByIHNlY3Rpb24KLVRoZSBhc3NlbWJsZXIgc3RvcmVzIGNvbXBsZXggZXhwcmVzc2lvbiBpbnRlcm5hbGx5IGFzIGNvbWJpbmF0aW9ucyBvZgotc3ltYm9scy4gIFdoZW4gaXQgbmVlZHMgdG8gcmVwcmVzZW50IGFuIGV4cHJlc3Npb24gYXMgYSBzeW1ib2wsIGl0IHB1dHMKLWl0IGluIHRoZSBleHByIHNlY3Rpb24uCi1AYyBGSVhNRSBpdGVtIGRlYnVnCi1AYyBGSVhNRSBpdGVtIHRyYW5zZmVyW3RdIHZlY3RvciBwcmVsb2FkCi1AYyBGSVhNRSBpdGVtIHRyYW5zZmVyW3RdIHZlY3RvciBwb3N0bG9hZAotQGMgRklYTUUgaXRlbSByZWdpc3RlcgotQGVuZCB0YWJsZQotCi1Abm9kZSBTdWItU2VjdGlvbnMKLUBzZWN0aW9uIFN1Yi1TZWN0aW9ucwotCi1AY2luZGV4IG51bWJlcmVkIHN1YnNlY3Rpb25zCi1AY2luZGV4IGdyb3VwaW5nIGRhdGEKLUBpZnNldCBhb3V0LWJvdXQKLUFzc2VtYmxlZCBieXRlcwotQGlmc2V0IENPRkYKLWNvbnZlbnRpb25hbGx5Ci1AZW5kIGlmc2V0Ci1mYWxsIGludG8gdHdvIHNlY3Rpb25zOiB0ZXh0IGFuZCBkYXRhLgotQGVuZCBpZnNldAotWW91IG1heSBoYXZlIHNlcGFyYXRlIGdyb3VwcyBvZgotQGlmc2V0IEdFTkVSSUMKLWRhdGEgaW4gbmFtZWQgc2VjdGlvbnMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZmNsZWFyIGFvdXQtYm91dAotZGF0YSBpbiBuYW1lZCBzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AaWZzZXQgYW91dC1ib3V0Ci10ZXh0IG9yIGRhdGEKLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotdGhhdCB5b3Ugd2FudCB0byBlbmQgdXAgbmVhciB0byBlYWNoIG90aGVyIGluIHRoZSBvYmplY3QgZmlsZSwgZXZlbiB0aG91Z2ggdGhleQotYXJlIG5vdCBjb250aWd1b3VzIGluIHRoZSBhc3NlbWJsZXIgc291cmNlLiAgQGNvZGV7QHZhbHVle0FTfX0gYWxsb3dzIHlvdSB0bwotdXNlIEBkZm57c3Vic2VjdGlvbnN9IGZvciB0aGlzIHB1cnBvc2UuICBXaXRoaW4gZWFjaCBzZWN0aW9uLCB0aGVyZSBjYW4gYmUKLW51bWJlcmVkIHN1YnNlY3Rpb25zIHdpdGggdmFsdWVzIGZyb20gMCB0byA4MTkyLiAgT2JqZWN0cyBhc3NlbWJsZWQgaW50byB0aGUKLXNhbWUgc3Vic2VjdGlvbiBnbyBpbnRvIHRoZSBvYmplY3QgZmlsZSB0b2dldGhlciB3aXRoIG90aGVyIG9iamVjdHMgaW4gdGhlIHNhbWUKLXN1YnNlY3Rpb24uICBGb3IgZXhhbXBsZSwgYSBjb21waWxlciBtaWdodCB3YW50IHRvIHN0b3JlIGNvbnN0YW50cyBpbiB0aGUgdGV4dAotc2VjdGlvbiwgYnV0IG1pZ2h0IG5vdCB3YW50IHRvIGhhdmUgdGhlbSBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgcHJvZ3JhbSBiZWluZwotYXNzZW1ibGVkLiAgSW4gdGhpcyBjYXNlLCB0aGUgY29tcGlsZXIgY291bGQgaXNzdWUgYSBAc2FtcHsudGV4dCAwfSBiZWZvcmUgZWFjaAotc2VjdGlvbiBvZiBjb2RlIGJlaW5nIG91dHB1dCwgYW5kIGEgQHNhbXB7LnRleHQgMX0gYmVmb3JlIGVhY2ggZ3JvdXAgb2YKLWNvbnN0YW50cyBiZWluZyBvdXRwdXQuCi0KLVN1YnNlY3Rpb25zIGFyZSBvcHRpb25hbC4gIElmIHlvdSBkbyBub3QgdXNlIHN1YnNlY3Rpb25zLCBldmVyeXRoaW5nCi1nb2VzIGluIHN1YnNlY3Rpb24gbnVtYmVyIHplcm8uCi0KLUBpZnNldCBHRU5FUklDCi1FYWNoIHN1YnNlY3Rpb24gaXMgemVyby1wYWRkZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiBmb3VyIGJ5dGVzLgotKFN1YnNlY3Rpb25zIG1heSBiZSBwYWRkZWQgYSBkaWZmZXJlbnQgYW1vdW50IG9uIGRpZmZlcmVudCBmbGF2b3JzCi1vZiBAY29kZXtAdmFsdWV7QVN9fS4pCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgKLU9uIHRoZSBIOC8zMDAgYW5kIEg4LzUwMCBwbGF0Zm9ybXMsIGVhY2ggc3Vic2VjdGlvbiBpcyB6ZXJvLXBhZGRlZCB0byBhIHdvcmQKLWJvdW5kYXJ5ICh0d28gYnl0ZXMpLgotVGhlIHNhbWUgaXMgdHJ1ZSBvbiB0aGUgSGl0YWNoaSBTSC4KLUBlbmQgaWZzZXQKLUBpZnNldCBJOTYwCi1AYyBGSVhNRSBzZWN0aW9uIHBhZGRpbmcgKGFsaWdubWVudCk/Ci1AYyBSaWNoIFBpeGxleSBzYXlzIHBhZGRpbmcgaGVyZSBkZXBlbmRzIG9uIHRhcmdldCBvYmogY29kZSBmb3JtYXQ7IHRoYXQKLUBjIGRvZXNuJ3Qgc2VlbSBwYXJ0aWN1bGFybHkgdXNlZnVsIHRvIHNheSB3aXRob3V0IGZ1cnRoZXIgZWxhYm9yYXRpb24sCi1AYyBzbyBmb3Igbm93IEkgc2F5IG5vdGhpbmcgYWJvdXQgaXQuICBJZiB0aGlzIGlzIGEgZ2VuZXJpYyBCRkQgaXNzdWUsCi1AYyB0aGVzZSBwYXJhZ3JhcGhzIG1pZ2h0IG5lZWQgdG8gdmFuaXNoIGZyb20gdGhpcyBtYW51YWwsIGFuZCBiZQotQGMgZGlzY3Vzc2VkIGluIEJGRCBjaGFwdGVyIG9mIGJpbnV0aWxzIChvciBzb21lIHN1Y2gpLgotQGVuZCBpZnNldAotQGlmc2V0IEEyOUsKLU9uIHRoZSBBTUQgMjlLIGZhbWlseSwgbm8gcGFydGljdWxhciBwYWRkaW5nIGlzIGFkZGVkIHRvIHNlY3Rpb24gb3IKLXN1YnNlY3Rpb24gc2l6ZXM7IEB2YWx1ZXtBU30gZm9yY2VzIG5vIGFsaWdubWVudCBvbiB0aGlzIHBsYXRmb3JtLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLVN1YnNlY3Rpb25zIGFwcGVhciBpbiB5b3VyIG9iamVjdCBmaWxlIGluIG51bWVyaWMgb3JkZXIsIGxvd2VzdCBudW1iZXJlZAotdG8gaGlnaGVzdC4gIChBbGwgdGhpcyB0byBiZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgcGVvcGxlJ3MgYXNzZW1ibGVycy4pCi1UaGUgb2JqZWN0IGZpbGUgY29udGFpbnMgbm8gcmVwcmVzZW50YXRpb24gb2Ygc3Vic2VjdGlvbnM7IEBjb2Rle0B2YWx1ZXtMRH19IGFuZAotb3RoZXIgcHJvZ3JhbXMgdGhhdCBtYW5pcHVsYXRlIG9iamVjdCBmaWxlcyBzZWUgbm8gdHJhY2Ugb2YgdGhlbS4KLVRoZXkganVzdCBzZWUgYWxsIHlvdXIgdGV4dCBzdWJzZWN0aW9ucyBhcyBhIHRleHQgc2VjdGlvbiwgYW5kIGFsbCB5b3VyCi1kYXRhIHN1YnNlY3Rpb25zIGFzIGEgZGF0YSBzZWN0aW9uLgotCi1UbyBzcGVjaWZ5IHdoaWNoIHN1YnNlY3Rpb24geW91IHdhbnQgc3Vic2VxdWVudCBzdGF0ZW1lbnRzIGFzc2VtYmxlZAotaW50bywgdXNlIGEgbnVtZXJpYyBhcmd1bWVudCB0byBzcGVjaWZ5IGl0LCBpbiBhIEBzYW1wey50ZXh0Ci1AdmFye2V4cHJlc3Npb259fSBvciBhIEBzYW1wey5kYXRhIEB2YXJ7ZXhwcmVzc2lvbn19IHN0YXRlbWVudC4KLUBpZnNldCBDT0ZGCi1AaWZzZXQgR0VORVJJQwotV2hlbiBnZW5lcmF0aW5nIENPRkYgb3V0cHV0LCB5b3UKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLVlvdQotQGVuZCBpZmNsZWFyCi1jYW4gYWxzbyB1c2UgYW4gZXh0cmEgc3Vic2VjdGlvbgotYXJndW1lbnQgd2l0aCBhcmJpdHJhcnkgbmFtZWQgc2VjdGlvbnM6IEBzYW1wey5zZWN0aW9uIEB2YXJ7bmFtZX0sCi1AdmFye2V4cHJlc3Npb259fS4KLUBlbmQgaWZzZXQKLUB2YXJ7RXhwcmVzc2lvbn0gc2hvdWxkIGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uCi0oQHhyZWZ7RXhwcmVzc2lvbnN9LikgIElmIHlvdSBqdXN0IHNheSBAc2FtcHsudGV4dH0gdGhlbiBAc2FtcHsudGV4dCAwfQotaXMgYXNzdW1lZC4gIExpa2V3aXNlIEBzYW1wey5kYXRhfSBtZWFucyBAc2FtcHsuZGF0YSAwfS4gIEFzc2VtYmx5Ci1iZWdpbnMgaW4gQGNvZGV7dGV4dCAwfS4gIEZvciBpbnN0YW5jZToKLUBzbWFsbGV4YW1wbGUKLS50ZXh0IDAgICAgICMgVGhlIGRlZmF1bHQgc3Vic2VjdGlvbiBpcyB0ZXh0IDAgYW55d2F5LgotLmFzY2lpICJUaGlzIGxpdmVzIGluIHRoZSBmaXJzdCB0ZXh0IHN1YnNlY3Rpb24uICoiCi0udGV4dCAxCi0uYXNjaWkgIkJ1dCB0aGlzIGxpdmVzIGluIHRoZSBzZWNvbmQgdGV4dCBzdWJzZWN0aW9uLiIKLS5kYXRhIDAKLS5hc2NpaSAiVGhpcyBsaXZlcyBpbiB0aGUgZGF0YSBzZWN0aW9uLCIKLS5hc2NpaSAiaW4gdGhlIGZpcnN0IGRhdGEgc3Vic2VjdGlvbi4iCi0udGV4dCAwCi0uYXNjaWkgIlRoaXMgbGl2ZXMgaW4gdGhlIGZpcnN0IHRleHQgc2VjdGlvbiwiCi0uYXNjaWkgImltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgYXN0ZXJpc2sgKCopLiIKLUBlbmQgc21hbGxleGFtcGxlCi0KLUVhY2ggc2VjdGlvbiBoYXMgYSBAZGZue2xvY2F0aW9uIGNvdW50ZXJ9IGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZXZlcnkgYnl0ZQotYXNzZW1ibGVkIGludG8gdGhhdCBzZWN0aW9uLiAgQmVjYXVzZSBzdWJzZWN0aW9ucyBhcmUgbWVyZWx5IGEgY29udmVuaWVuY2UKLXJlc3RyaWN0ZWQgdG8gQGNvZGV7QHZhbHVle0FTfX0gdGhlcmUgaXMgbm8gY29uY2VwdCBvZiBhIHN1YnNlY3Rpb24gbG9jYXRpb24KLWNvdW50ZXIuICBUaGVyZSBpcyBubyB3YXkgdG8gZGlyZWN0bHkgbWFuaXB1bGF0ZSBhIGxvY2F0aW9uIGNvdW50ZXItLS1idXQgdGhlCi1AY29kZXsuYWxpZ259IGRpcmVjdGl2ZSBjaGFuZ2VzIGl0LCBhbmQgYW55IGxhYmVsIGRlZmluaXRpb24gY2FwdHVyZXMgaXRzCi1jdXJyZW50IHZhbHVlLiAgVGhlIGxvY2F0aW9uIGNvdW50ZXIgb2YgdGhlIHNlY3Rpb24gd2hlcmUgc3RhdGVtZW50cyBhcmUgYmVpbmcKLWFzc2VtYmxlZCBpcyBzYWlkIHRvIGJlIHRoZSBAZGZue2FjdGl2ZX0gbG9jYXRpb24gY291bnRlci4KLQotQG5vZGUgYnNzCi1Ac2VjdGlvbiBic3MgU2VjdGlvbgotCi1AY2luZGV4IGJzcyBzZWN0aW9uCi1AY2luZGV4IGNvbW1vbiB2YXJpYWJsZSBzdG9yYWdlCi1UaGUgYnNzIHNlY3Rpb24gaXMgdXNlZCBmb3IgbG9jYWwgY29tbW9uIHZhcmlhYmxlIHN0b3JhZ2UuCi1Zb3UgbWF5IGFsbG9jYXRlIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIGJzcyBzZWN0aW9uLCBidXQgeW91IG1heQotbm90IGRpY3RhdGUgZGF0YSB0byBsb2FkIGludG8gaXQgYmVmb3JlIHlvdXIgcHJvZ3JhbSBleGVjdXRlcy4gIFdoZW4KLXlvdXIgcHJvZ3JhbSBzdGFydHMgcnVubmluZywgYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgYnNzCi1zZWN0aW9uIGFyZSB6ZXJvZWQgYnl0ZXMuCi0KLVRoZSBAY29kZXsubGNvbW19IHBzZXVkby1vcCBkZWZpbmVzIGEgc3ltYm9sIGluIHRoZSBic3Mgc2VjdGlvbjsgc2VlCi1AcmVme0xjb21tLCxAY29kZXsubGNvbW19fS4KLQotVGhlIEBjb2Rley5jb21tfSBwc2V1ZG8tb3AgbWF5IGJlIHVzZWQgdG8gZGVjbGFyZSBhIGNvbW1vbiBzeW1ib2wsIHdoaWNoIGlzCi1hbm90aGVyIGZvcm0gb2YgdW5pbml0aWFsaXplZCBzeW1ib2w7IHNlZSBAeHJlZntDb21tLCxAY29kZXsuY29tbX19LgotCi1AaWZzZXQgR0VORVJJQwotV2hlbiBhc3NlbWJsaW5nIGZvciBhIHRhcmdldCB3aGljaCBzdXBwb3J0cyBtdWx0aXBsZSBzZWN0aW9ucywgc3VjaCBhcyBFTEYgb3IKLUNPRkYsIHlvdSBtYXkgc3dpdGNoIGludG8gdGhlIEBjb2Rley5ic3N9IHNlY3Rpb24gYW5kIGRlZmluZSBzeW1ib2xzIGFzIHVzdWFsOwotc2VlIEByZWZ7U2VjdGlvbiwsQGNvZGV7LnNlY3Rpb259fS4gIFlvdSBtYXkgb25seSBhc3NlbWJsZSB6ZXJvIHZhbHVlcyBpbnRvIHRoZQotc2VjdGlvbi4gIFR5cGljYWxseSB0aGUgc2VjdGlvbiB3aWxsIG9ubHkgY29udGFpbiBzeW1ib2wgZGVmaW5pdGlvbnMgYW5kCi1AY29kZXsuc2tpcH0gZGlyZWN0aXZlcyAoQHB4cmVme1NraXAsLEBjb2Rley5za2lwfX0pLgotQGVuZCBpZnNldAotCi1Abm9kZSBTeW1ib2xzCi1AY2hhcHRlciBTeW1ib2xzCi0KLUBjaW5kZXggc3ltYm9scwotU3ltYm9scyBhcmUgYSBjZW50cmFsIGNvbmNlcHQ6IHRoZSBwcm9ncmFtbWVyIHVzZXMgc3ltYm9scyB0byBuYW1lCi10aGluZ3MsIHRoZSBsaW5rZXIgdXNlcyBzeW1ib2xzIHRvIGxpbmssIGFuZCB0aGUgZGVidWdnZXIgdXNlcyBzeW1ib2xzCi10byBkZWJ1Zy4KLQotQHF1b3RhdGlvbgotQGNpbmRleCBkZWJ1Z2dlcnMsIGFuZCBzeW1ib2wgb3JkZXIKLUBlbXBoe1dhcm5pbmc6fSBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBwbGFjZSBzeW1ib2xzIGluIHRoZSBvYmplY3QgZmlsZSBpbgotdGhlIHNhbWUgb3JkZXIgdGhleSB3ZXJlIGRlY2xhcmVkLiAgVGhpcyBtYXkgYnJlYWsgc29tZSBkZWJ1Z2dlcnMuCi1AZW5kIHF1b3RhdGlvbgotCi1AbWVudQotKiBMYWJlbHM6OiAgICAgICAgICAgICAgICAgICAgICBMYWJlbHMKLSogU2V0dGluZyBTeW1ib2xzOjogICAgICAgICAgICAgR2l2aW5nIFN5bWJvbHMgT3RoZXIgVmFsdWVzCi0qIFN5bWJvbCBOYW1lczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBOYW1lcwotKiBEb3Q6OiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgU3BlY2lhbCBEb3QgU3ltYm9sCi0qIFN5bWJvbCBBdHRyaWJ1dGVzOjogICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgTGFiZWxzCi1Ac2VjdGlvbiBMYWJlbHMKLQotQGNpbmRleCBsYWJlbHMKLUEgQGRmbntsYWJlbH0gaXMgd3JpdHRlbiBhcyBhIHN5bWJvbCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGNvbG9uCi1Ac2FtcHs6fS4gIFRoZSBzeW1ib2wgdGhlbiByZXByZXNlbnRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZQotYWN0aXZlIGxvY2F0aW9uIGNvdW50ZXIsIGFuZCBpcywgZm9yIGV4YW1wbGUsIGEgc3VpdGFibGUgaW5zdHJ1Y3Rpb24KLW9wZXJhbmQuICBZb3UgYXJlIHdhcm5lZCBpZiB5b3UgdXNlIHRoZSBzYW1lIHN5bWJvbCB0byByZXByZXNlbnQgdHdvCi1kaWZmZXJlbnQgbG9jYXRpb25zOiB0aGUgZmlyc3QgZGVmaW5pdGlvbiBvdmVycmlkZXMgYW55IG90aGVyCi1kZWZpbml0aW9ucy4KLQotQGlmc2V0IEhQUEEKLU9uIHRoZSBIUFBBLCB0aGUgdXN1YWwgZm9ybSBmb3IgYSBsYWJlbCBuZWVkIG5vdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhCi1jb2xvbiwgYnV0IGluc3RlYWQgbXVzdCBzdGFydCBpbiBjb2x1bW4gemVyby4gIE9ubHkgb25lIGxhYmVsIG1heSBiZSBkZWZpbmVkIG9uCi1hIHNpbmdsZSBsaW5lLiAgVG8gd29yayBhcm91bmQgdGhpcywgdGhlIEhQUEEgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhbHNvCi1wcm92aWRlcyBhIHNwZWNpYWwgZGlyZWN0aXZlIEBjb2Rley5sYWJlbH0gZm9yIGRlZmluaW5nIGxhYmVscyBtb3JlIGZsZXhpYmx5LgotQGVuZCBpZnNldAotCi1Abm9kZSBTZXR0aW5nIFN5bWJvbHMKLUBzZWN0aW9uIEdpdmluZyBTeW1ib2xzIE90aGVyIFZhbHVlcwotCi1AY2luZGV4IGFzc2lnbmluZyB2YWx1ZXMgdG8gc3ltYm9scwotQGNpbmRleCBzeW1ib2wgdmFsdWVzLCBhc3NpZ25pbmcKLUEgc3ltYm9sIGNhbiBiZSBnaXZlbiBhbiBhcmJpdHJhcnkgdmFsdWUgYnkgd3JpdGluZyBhIHN5bWJvbCwgZm9sbG93ZWQKLWJ5IGFuIGVxdWFscyBzaWduIEBzYW1wez19LCBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uCi0oQHB4cmVme0V4cHJlc3Npb25zfSkuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIEBjb2Rley5zZXR9Ci1kaXJlY3RpdmUuICBAeHJlZntTZXQsLEBjb2Rley5zZXR9fS4KLQotQG5vZGUgU3ltYm9sIE5hbWVzCi1Ac2VjdGlvbiBTeW1ib2wgTmFtZXMKLQotQGNpbmRleCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggbmFtZXMsIHN5bWJvbAotQGlmY2xlYXIgU1BFQ0lBTC1TWU1TCi1TeW1ib2wgbmFtZXMgYmVnaW4gd2l0aCBhIGxldHRlciBvciB3aXRoIG9uZSBvZiBAc2FtcHsuX30uICBPbiBtb3N0Ci1tYWNoaW5lcywgeW91IGNhbiBhbHNvIHVzZSBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXM7IGV4Y2VwdGlvbnMgYXJlCi1ub3RlZCBpbiBAcmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4gIFRoYXQgY2hhcmFjdGVyIG1heSBiZSBmb2xsb3dlZCBieSBhbnkKLXN0cmluZyBvZiBkaWdpdHMsIGxldHRlcnMsIGRvbGxhciBzaWducyAodW5sZXNzIG90aGVyd2lzZSBub3RlZCBpbgotQHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30pLCBhbmQgdW5kZXJzY29yZXMuCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBBMjlLCi1Gb3IgdGhlIEFNRCAyOUsgZmFtaWx5LCBAc2FtcHs/fSBpcyBhbHNvIGFsbG93ZWQgaW4gdGhlCi1ib2R5IG9mIGEgc3ltYm9sIG5hbWUsIHRob3VnaCBub3QgYXQgaXRzIGJlZ2lubmluZy4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IFNQRUNJQUwtU1lNUwotQGlmc2V0IEg4Ci1TeW1ib2wgbmFtZXMgYmVnaW4gd2l0aCBhIGxldHRlciBvciB3aXRoIG9uZSBvZiBAc2FtcHsuX30uICBPbiB0aGUKLUhpdGFjaGkgU0ggb3IgdGhlCi1IOC81MDAsIHlvdSBjYW4gYWxzbyB1c2UgQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzLiAgVGhhdCBjaGFyYWN0ZXIgbWF5Ci1iZSBmb2xsb3dlZCBieSBhbnkgc3RyaW5nIG9mIGRpZ2l0cywgbGV0dGVycywgZG9sbGFyIHNpZ25zIChzYXZlIG9uIHRoZQotSDgvMzAwKSwgYW5kIHVuZGVyc2NvcmVzLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1DYXNlIG9mIGxldHRlcnMgaXMgc2lnbmlmaWNhbnQ6IEBjb2Rle2Zvb30gaXMgYSBkaWZmZXJlbnQgc3ltYm9sIG5hbWUKLXRoYW4gQGNvZGV7Rm9vfS4KLQotRWFjaCBzeW1ib2wgaGFzIGV4YWN0bHkgb25lIG5hbWUuICBFYWNoIG5hbWUgaW4gYW4gYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbQotcmVmZXJzIHRvIGV4YWN0bHkgb25lIHN5bWJvbC4gIFlvdSBtYXkgdXNlIHRoYXQgc3ltYm9sIG5hbWUgYW55IG51bWJlciBvZiB0aW1lcwotaW4gYSBwcm9ncmFtLgotCi1Ac3ViaGVhZGluZyBMb2NhbCBTeW1ib2wgTmFtZXMKLQotQGNpbmRleCBsb2NhbCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBsb2NhbAotQGNpbmRleCB0ZW1wb3Jhcnkgc3ltYm9sIG5hbWVzCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgdGVtcG9yYXJ5Ci1Mb2NhbCBzeW1ib2xzIGhlbHAgY29tcGlsZXJzIGFuZCBwcm9ncmFtbWVycyB1c2UgbmFtZXMgdGVtcG9yYXJpbHkuCi1UaGVyZSBhcmUgdGVuIGxvY2FsIHN5bWJvbCBuYW1lcywgd2hpY2ggYXJlIHJlLXVzZWQgdGhyb3VnaG91dCB0aGUKLXByb2dyYW0uICBZb3UgbWF5IHJlZmVyIHRvIHRoZW0gdXNpbmcgdGhlIG5hbWVzIEBzYW1wezB9IEBzYW1wezF9Ci1AZG90c3t9IEBzYW1wezl9LiAgVG8gZGVmaW5lIGEgbG9jYWwgc3ltYm9sLCB3cml0ZSBhIGxhYmVsIG9mIHRoZSBmb3JtCi1Ac2FtcHtAYntOfTp9ICh3aGVyZSBAYntOfSByZXByZXNlbnRzIGFueSBkaWdpdCkuICBUbyByZWZlciB0byB0aGUgbW9zdAotcmVjZW50IHByZXZpb3VzIGRlZmluaXRpb24gb2YgdGhhdCBzeW1ib2wgd3JpdGUgQHNhbXB7QGJ7Tn1ifSwgdXNpbmcgdGhlCi1zYW1lIGRpZ2l0IGFzIHdoZW4geW91IGRlZmluZWQgdGhlIGxhYmVsLiAgVG8gcmVmZXIgdG8gdGhlIG5leHQKLWRlZmluaXRpb24gb2YgYSBsb2NhbCBsYWJlbCwgd3JpdGUgQHNhbXB7QGJ7Tn1mfS0tLXdoZXJlIEBie059IGdpdmVzIHlvdQotYSBjaG9pY2Ugb2YgMTAgZm9yd2FyZCByZWZlcmVuY2VzLiAgVGhlIEBzYW1we2J9IHN0YW5kcyBmb3IKLWBgYmFja3dhcmRzJycgYW5kIHRoZSBAc2FtcHtmfSBzdGFuZHMgZm9yIGBgZm9yd2FyZHMnJy4KLQotTG9jYWwgc3ltYm9scyBhcmUgbm90IGVtaXR0ZWQgYnkgdGhlIGN1cnJlbnQgQHNje2dudX0gQyBjb21waWxlci4KLQotVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gaG93IHlvdSBjYW4gdXNlIHRoZXNlIGxhYmVscywgYnV0Ci1yZW1lbWJlciB0aGF0IGF0IGFueSBwb2ludCBpbiB0aGUgYXNzZW1ibHkgeW91IGNhbiByZWZlciB0byBhdCBtb3N0Ci0xMCBwcmlvciBsb2NhbCBsYWJlbHMgYW5kIHRvIGF0IG1vc3QgMTAgZm9yd2FyZCBsb2NhbCBsYWJlbHMuCi0KLUxvY2FsIHN5bWJvbCBuYW1lcyBhcmUgb25seSBhIG5vdGF0aW9uIGRldmljZS4gIFRoZXkgYXJlIGltbWVkaWF0ZWx5Ci10cmFuc2Zvcm1lZCBpbnRvIG1vcmUgY29udmVudGlvbmFsIHN5bWJvbCBuYW1lcyBiZWZvcmUgdGhlIGFzc2VtYmxlcgotdXNlcyB0aGVtLiAgVGhlIHN5bWJvbCBuYW1lcyBzdG9yZWQgaW4gdGhlIHN5bWJvbCB0YWJsZSwgYXBwZWFyaW5nIGluCi1lcnJvciBtZXNzYWdlcyBhbmQgb3B0aW9uYWxseSBlbWl0dGVkIHRvIHRoZSBvYmplY3QgZmlsZSBoYXZlIHRoZXNlCi1wYXJ0czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBMCi1BbGwgbG9jYWwgbGFiZWxzIGJlZ2luIHdpdGggQHNhbXB7TH0uIE5vcm1hbGx5IGJvdGggQGNvZGV7QHZhbHVle0FTfX0gYW5kCi1AY29kZXtAdmFsdWV7TER9fSBmb3JnZXQgc3ltYm9scyB0aGF0IHN0YXJ0IHdpdGggQHNhbXB7TH0uIFRoZXNlIGxhYmVscyBhcmUKLXVzZWQgZm9yIHN5bWJvbHMgeW91IGFyZSBuZXZlciBpbnRlbmRlZCB0byBzZWUuICBJZiB5b3UgdXNlIHRoZQotQHNhbXB7LUx9IG9wdGlvbiB0aGVuIEBjb2Rle0B2YWx1ZXtBU319IHJldGFpbnMgdGhlc2Ugc3ltYm9scyBpbiB0aGUKLW9iamVjdCBmaWxlLiBJZiB5b3UgYWxzbyBpbnN0cnVjdCBAY29kZXtAdmFsdWV7TER9fSB0byByZXRhaW4gdGhlc2Ugc3ltYm9scywKLXlvdSBtYXkgdXNlIHRoZW0gaW4gZGVidWdnaW5nLgotCi1AaXRlbSBAdmFye2RpZ2l0fQotSWYgdGhlIGxhYmVsIGlzIHdyaXR0ZW4gQHNhbXB7MDp9IHRoZW4gdGhlIGRpZ2l0IGlzIEBzYW1wezB9LgotSWYgdGhlIGxhYmVsIGlzIHdyaXR0ZW4gQHNhbXB7MTp9IHRoZW4gdGhlIGRpZ2l0IGlzIEBzYW1wezF9LgotQW5kIHNvIG9uIHVwIHRocm91Z2ggQHNhbXB7OTp9LgotCi1AaXRlbSBAa2Jke0MtQX0KLVRoaXMgdW51c3VhbCBjaGFyYWN0ZXIgaXMgaW5jbHVkZWQgc28geW91IGRvIG5vdCBhY2NpZGVudGFsbHkgaW52ZW50Ci1hIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lLiAgVGhlIGNoYXJhY3RlciBoYXMgQVNDSUkgdmFsdWUKLUBzYW1we1wwMDF9LgotCi1AaXRlbSBAZW1waHtvcmRpbmFsIG51bWJlcn0KLVRoaXMgaXMgYSBzZXJpYWwgbnVtYmVyIHRvIGtlZXAgdGhlIGxhYmVscyBkaXN0aW5jdC4gIFRoZSBmaXJzdAotQHNhbXB7MDp9IGdldHMgdGhlIG51bWJlciBAc2FtcHsxfTsgVGhlIDE1dGggQHNhbXB7MDp9IGdldHMgdGhlCi1udW1iZXIgQHNhbXB7MTV9OyBAZW1waHtldGMufS4gIExpa2V3aXNlIGZvciB0aGUgb3RoZXIgbGFiZWxzIEBzYW1wezE6fQotdGhyb3VnaCBAc2FtcHs5On0uCi1AZW5kIHRhYmxlCi0KLUZvciBpbnN0YW5jZSwgdGhlIGZpcnN0IEBjb2RlezE6fSBpcyBuYW1lZCBAY29kZXtMMUBrYmR7Qy1BfTF9LCB0aGUgNDR0aAotQGNvZGV7Mzp9IGlzIG5hbWVkIEBjb2Rle0wzQGtiZHtDLUF9NDR9LgotCi1Abm9kZSBEb3QKLUBzZWN0aW9uIFRoZSBTcGVjaWFsIERvdCBTeW1ib2wKLQotQGNpbmRleCBkb3QgKHN5bWJvbCkKLUBjaW5kZXggQGNvZGV7Ln0gKHN5bWJvbCkKLUBjaW5kZXggY3VycmVudCBhZGRyZXNzCi1AY2luZGV4IGxvY2F0aW9uIGNvdW50ZXIKLVRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSByZWZlcnMgdG8gdGhlIGN1cnJlbnQgYWRkcmVzcyB0aGF0Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBhc3NlbWJsaW5nIGludG8uICBUaHVzLCB0aGUgZXhwcmVzc2lvbiBAc2FtcHttZWx2aW46Ci0ubG9uZyAufSBkZWZpbmVzIEBjb2Rle21lbHZpbn0gdG8gY29udGFpbiBpdHMgb3duIGFkZHJlc3MuCi1Bc3NpZ25pbmcgYSB2YWx1ZSB0byBAY29kZXsufSBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIGEgQGNvZGV7Lm9yZ30KLWRpcmVjdGl2ZS4gIFRodXMsIHRoZSBleHByZXNzaW9uIEBzYW1wey49Lis0fSBpcyB0aGUgc2FtZSBhcyBzYXlpbmcKLUBpZmNsZWFyIG5vLXNwYWNlLWRpcgotQHNhbXB7LnNwYWNlIDR9LgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgbm8tc3BhY2UtZGlyCi1AaWZzZXQgQTI5SwotQHNhbXB7LmJsb2NrIDR9LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBTeW1ib2wgQXR0cmlidXRlcwotQHNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXMKLQotQGNpbmRleCBzeW1ib2wgYXR0cmlidXRlcwotQGNpbmRleCBhdHRyaWJ1dGVzLCBzeW1ib2wKLUV2ZXJ5IHN5bWJvbCBoYXMsIGFzIHdlbGwgYXMgaXRzIG5hbWUsIHRoZSBhdHRyaWJ1dGVzIGBgVmFsdWUnJyBhbmQKLWBgVHlwZScnLiAgRGVwZW5kaW5nIG9uIG91dHB1dCBmb3JtYXQsIHN5bWJvbHMgY2FuIGFsc28gaGF2ZSBhdXhpbGlhcnkKLWF0dHJpYnV0ZXMuCi1AaWZzZXQgSU5URVJOQUxTCi1UaGUgZGV0YWlsZWQgZGVmaW5pdGlvbnMgYXJlIGluIEBmaWxle2Eub3V0Lmh9LgotQGVuZCBpZnNldAotCi1JZiB5b3UgdXNlIGEgc3ltYm9sIHdpdGhvdXQgZGVmaW5pbmcgaXQsIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgemVybyBmb3IKLWFsbCB0aGVzZSBhdHRyaWJ1dGVzLCBhbmQgcHJvYmFibHkgd29uJ3Qgd2FybiB5b3UuICBUaGlzIG1ha2VzIHRoZQotc3ltYm9sIGFuIGV4dGVybmFsbHkgZGVmaW5lZCBzeW1ib2wsIHdoaWNoIGlzIGdlbmVyYWxseSB3aGF0IHlvdQotd291bGQgd2FudC4KLQotQG1lbnUKLSogU3ltYm9sIFZhbHVlOjogICAgICAgICAgICAgICAgVmFsdWUKLSogU3ltYm9sIFR5cGU6OiAgICAgICAgICAgICAgICAgVHlwZQotQGlmc2V0IGFvdXQtYm91dAotQGlmc2V0IEdFTkVSSUMKLSogYS5vdXQgU3ltYm9sczo6ICAgICAgICAgICAgICAgU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmY2xlYXIgQk9VVAotKiBhLm91dCBTeW1ib2xzOjogICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci1AZW5kIGlmY2xlYXIKLUBpZnNldCBCT1VUCi0qIGEub3V0IFN5bWJvbHM6OiAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzOiBAY29kZXthLm91dH0sIEBjb2Rle2Iub3V0fQotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQ09GRgotKiBDT0ZGIFN5bWJvbHM6OiAgICAgICAgICAgICAgICBTeW1ib2wgQXR0cmlidXRlcyBmb3IgQ09GRgotQGVuZCBpZnNldAotQGlmc2V0IFNPTQotKiBTT00gU3ltYm9sczo6ICAgICAgICAgICAgICAgIFN5bWJvbCBBdHRyaWJ1dGVzIGZvciBTT00KLUBlbmQgaWZzZXQKLUBlbmQgbWVudQotCi1Abm9kZSBTeW1ib2wgVmFsdWUKLUBzdWJzZWN0aW9uIFZhbHVlCi0KLUBjaW5kZXggdmFsdWUgb2YgYSBzeW1ib2wKLUBjaW5kZXggc3ltYm9sIHZhbHVlCi1UaGUgdmFsdWUgb2YgYSBzeW1ib2wgaXMgKHVzdWFsbHkpIDMyIGJpdHMuICBGb3IgYSBzeW1ib2wgd2hpY2ggbGFiZWxzIGEKLWxvY2F0aW9uIGluIHRoZSB0ZXh0LCBkYXRhLCBic3Mgb3IgYWJzb2x1dGUgc2VjdGlvbnMgdGhlIHZhbHVlIGlzIHRoZQotbnVtYmVyIG9mIGFkZHJlc3NlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGF0IHNlY3Rpb24gdG8gdGhlIGxhYmVsLgotTmF0dXJhbGx5IGZvciB0ZXh0LCBkYXRhIGFuZCBic3Mgc2VjdGlvbnMgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGNoYW5nZXMKLWFzIEBjb2Rle0B2YWx1ZXtMRH19IGNoYW5nZXMgc2VjdGlvbiBiYXNlIGFkZHJlc3NlcyBkdXJpbmcgbGlua2luZy4gIEFic29sdXRlCi1zeW1ib2xzJyB2YWx1ZXMgZG8gbm90IGNoYW5nZSBkdXJpbmcgbGlua2luZzogdGhhdCBpcyB3aHkgdGhleSBhcmUKLWNhbGxlZCBhYnNvbHV0ZS4KLQotVGhlIHZhbHVlIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wgaXMgdHJlYXRlZCBpbiBhIHNwZWNpYWwgd2F5LiAgSWYgaXQgaXMKLTAgdGhlbiB0aGUgc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoaXMgYXNzZW1ibGVyIHNvdXJjZSBmaWxlLCBhbmQKLUBjb2Rle0B2YWx1ZXtMRH19IHRyaWVzIHRvIGRldGVybWluZSBpdHMgdmFsdWUgZnJvbSBvdGhlciBmaWxlcyBsaW5rZWQgaW50byB0aGUKLXNhbWUgcHJvZ3JhbS4gIFlvdSBtYWtlIHRoaXMga2luZCBvZiBzeW1ib2wgc2ltcGx5IGJ5IG1lbnRpb25pbmcgYSBzeW1ib2wKLW5hbWUgd2l0aG91dCBkZWZpbmluZyBpdC4gIEEgbm9uLXplcm8gdmFsdWUgcmVwcmVzZW50cyBhIEBjb2Rley5jb21tfQotY29tbW9uIGRlY2xhcmF0aW9uLiAgVGhlIHZhbHVlIGlzIGhvdyBtdWNoIGNvbW1vbiBzdG9yYWdlIHRvIHJlc2VydmUsIGluCi1ieXRlcyAoYWRkcmVzc2VzKS4gIFRoZSBzeW1ib2wgcmVmZXJzIHRvIHRoZSBmaXJzdCBhZGRyZXNzIG9mIHRoZQotYWxsb2NhdGVkIHN0b3JhZ2UuCi0KLUBub2RlIFN5bWJvbCBUeXBlCi1Ac3Vic2VjdGlvbiBUeXBlCi0KLUBjaW5kZXggdHlwZSBvZiBhIHN5bWJvbAotQGNpbmRleCBzeW1ib2wgdHlwZQotVGhlIHR5cGUgYXR0cmlidXRlIG9mIGEgc3ltYm9sIGNvbnRhaW5zIHJlbG9jYXRpb24gKHNlY3Rpb24pCi1pbmZvcm1hdGlvbiwgYW55IGZsYWcgc2V0dGluZ3MgaW5kaWNhdGluZyB0aGF0IGEgc3ltYm9sIGlzIGV4dGVybmFsLCBhbmQKLShvcHRpb25hbGx5KSwgb3RoZXIgaW5mb3JtYXRpb24gZm9yIGxpbmtlcnMgYW5kIGRlYnVnZ2Vycy4gIFRoZSBleGFjdAotZm9ybWF0IGRlcGVuZHMgb24gdGhlIG9iamVjdC1jb2RlIG91dHB1dCBmb3JtYXQgaW4gdXNlLgotCi1AaWZzZXQgYW91dC1ib3V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgQk9VVAotQGMgVGhlIGZvbGxvd2luZyBhdm9pZHMgYSAid2lkb3ciIHN1YnNlY3Rpb24gdGl0bGUuICBAZ3JvdXAgd291bGQgYmUKLUBjIGJldHRlciBpZiBpdCB3ZXJlIGF2YWlsYWJsZSBvdXRzaWRlIGV4YW1wbGVzLgotQG5lZWQgMTAwMAotQG5vZGUgYS5vdXQgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXM6IEBjb2Rle2Eub3V0fSwgQGNvZGV7Yi5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7Yi5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXtiLm91dH0KLVRoZXNlIHN5bWJvbCBhdHRyaWJ1dGVzIGFwcGVhciBvbmx5IHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZCBmb3IKLW9uZSBvZiB0aGUgQmVya2VsZXktZGVzY2VuZGVkIG9iamVjdCBvdXRwdXQgZm9ybWF0cy0tLUBjb2Rle2Eub3V0fSBvcgotQGNvZGV7Yi5vdXR9LgotCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBCT1VUCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7YS5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXthLm91dH0KLQotQGVuZCBpZmNsZWFyCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi1Abm9kZSBhLm91dCBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlczogQGNvZGV7YS5vdXR9Ci0KLUBjaW5kZXggQGNvZGV7YS5vdXR9IHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBAY29kZXthLm91dH0KLQotQGVuZCBpZnNldAotQG1lbnUKLSogU3ltYm9sIERlc2M6OiAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcgotKiBTeW1ib2wgT3RoZXI6OiAgICAgICAgICAgICAgICBPdGhlcgotQGVuZCBtZW51Ci0KLUBub2RlIFN5bWJvbCBEZXNjCi1Ac3Vic3Vic2VjdGlvbiBEZXNjcmlwdG9yCi0KLUBjaW5kZXggZGVzY3JpcHRvciwgb2YgQGNvZGV7YS5vdXR9IHN5bWJvbAotVGhpcyBpcyBhbiBhcmJpdHJhcnkgMTYtYml0IHZhbHVlLiAgWW91IG1heSBlc3RhYmxpc2ggYSBzeW1ib2wncwotZGVzY3JpcHRvciB2YWx1ZSBieSB1c2luZyBhIEBjb2Rley5kZXNjfSBzdGF0ZW1lbnQKLShAcHhyZWZ7RGVzYywsQGNvZGV7LmRlc2N9fSkuICBBIGRlc2NyaXB0b3IgdmFsdWUgbWVhbnMgbm90aGluZyB0bwotQGNvZGV7QHZhbHVle0FTfX0uCi0KLUBub2RlIFN5bWJvbCBPdGhlcgotQHN1YnN1YnNlY3Rpb24gT3RoZXIKLQotQGNpbmRleCBvdGhlciBhdHRyaWJ1dGUsIG9mIEBjb2Rle2Eub3V0fSBzeW1ib2wKLVRoaXMgaXMgYW4gYXJiaXRyYXJ5IDgtYml0IHZhbHVlLiAgSXQgbWVhbnMgbm90aGluZyB0byBAY29kZXtAdmFsdWV7QVN9fS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIENPRkYgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9sIEF0dHJpYnV0ZXMgZm9yIENPRkYKLQotQGNpbmRleCBDT0ZGIHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBDT0ZGCi0KLVRoZSBDT0ZGIGZvcm1hdCBzdXBwb3J0cyBhIG11bHRpdHVkZSBvZiBhdXhpbGlhcnkgc3ltYm9sIGF0dHJpYnV0ZXM7Ci1saWtlIHRoZSBwcmltYXJ5IHN5bWJvbCBhdHRyaWJ1dGVzLCB0aGV5IGFyZSBzZXQgYmV0d2VlbiBAY29kZXsuZGVmfSBhbmQKLUBjb2Rley5lbmRlZn0gZGlyZWN0aXZlcy4KLQotQHN1YnN1YnNlY3Rpb24gUHJpbWFyeSBBdHRyaWJ1dGVzCi0KLUBjaW5kZXggcHJpbWFyeSBhdHRyaWJ1dGVzLCBDT0ZGIHN5bWJvbHMKLVRoZSBzeW1ib2wgbmFtZSBpcyBzZXQgd2l0aCBAY29kZXsuZGVmfTsgdGhlIHZhbHVlIGFuZCB0eXBlLAotcmVzcGVjdGl2ZWx5LCB3aXRoIEBjb2Rley52YWx9IGFuZCBAY29kZXsudHlwZX0uCi0KLUBzdWJzdWJzZWN0aW9uIEF1eGlsaWFyeSBBdHRyaWJ1dGVzCi0KLUBjaW5kZXggYXV4aWxpYXJ5IGF0dHJpYnV0ZXMsIENPRkYgc3ltYm9scwotVGhlIEBjb2Rle0B2YWx1ZXtBU319IGRpcmVjdGl2ZXMgQGNvZGV7LmRpbX0sIEBjb2Rley5saW5lfSwgQGNvZGV7LnNjbH0sCi1AY29kZXsuc2l6ZX0sIGFuZCBAY29kZXsudGFnfSBjYW4gZ2VuZXJhdGUgYXV4aWxpYXJ5IHN5bWJvbCB0YWJsZQotaW5mb3JtYXRpb24gZm9yIENPRkYuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBTT00KLUBub2RlIFNPTSBTeW1ib2xzCi1Ac3Vic2VjdGlvbiBTeW1ib2wgQXR0cmlidXRlcyBmb3IgU09NCi0KLUBjaW5kZXggU09NIHN5bWJvbCBhdHRyaWJ1dGVzCi1AY2luZGV4IHN5bWJvbCBhdHRyaWJ1dGVzLCBTT00KLQotVGhlIFNPTSBmb3JtYXQgZm9yIHRoZSBIUFBBIHN1cHBvcnRzIGEgbXVsdGl0dWRlIG9mIHN5bWJvbCBhdHRyaWJ1dGVzIHNldCB3aXRoCi10aGUgQGNvZGV7LkVYUE9SVH0gYW5kIEBjb2Rley5JTVBPUlR9IGRpcmVjdGl2ZXMuCi0KLVRoZSBhdHRyaWJ1dGVzIGFyZSBkZXNjcmliZWQgaW4gQGNpdGV7SFA5MDAwIFNlcmllcyA4MDAgQXNzZW1ibHkgCi1MYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpIHVuZGVyIHRoZSBAY29kZXtJTVBPUlR9IGFuZAotQGNvZGV7RVhQT1JUfSBhc3NlbWJsZXIgZGlyZWN0aXZlIGRvY3VtZW50YXRpb24uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIEV4cHJlc3Npb25zCi1AY2hhcHRlciBFeHByZXNzaW9ucwotCi1AY2luZGV4IGV4cHJlc3Npb25zCi1AY2luZGV4IGFkZHJlc3NlcwotQGNpbmRleCBudW1lcmljIHZhbHVlcwotQW4gQGRmbntleHByZXNzaW9ufSBzcGVjaWZpZXMgYW4gYWRkcmVzcyBvciBudW1lcmljIHZhbHVlLgotV2hpdGVzcGFjZSBtYXkgcHJlY2VkZSBhbmQvb3IgZm9sbG93IGFuIGV4cHJlc3Npb24uCi0KLVRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBtdXN0IGJlIGFuIGFic29sdXRlIG51bWJlciwgb3IgZWxzZSBhbiBvZmZzZXQgaW50bwotYSBwYXJ0aWN1bGFyIHNlY3Rpb24uICBJZiBhbiBleHByZXNzaW9uIGlzIG5vdCBhYnNvbHV0ZSwgYW5kIHRoZXJlIGlzIG5vdAotZW5vdWdoIGluZm9ybWF0aW9uIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gc2VlcyB0aGUgZXhwcmVzc2lvbiB0byBrbm93IGl0cwotc2VjdGlvbiwgYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSBzb3VyY2UgcHJvZ3JhbSBtaWdodCBiZSBuZWNlc3NhcnkgdG8gaW50ZXJwcmV0Ci10aGUgZXhwcmVzc2lvbi0tLWJ1dCB0aGUgc2Vjb25kIHBhc3MgaXMgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC4KLUBjb2Rle0B2YWx1ZXtBU319IGFib3J0cyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhpcyBzaXR1YXRpb24uCi0KLUBtZW51Ci0qIEVtcHR5IEV4cHJzOjogICAgICAgICAgICAgICAgIEVtcHR5IEV4cHJlc3Npb25zCi0qIEludGVnZXIgRXhwcnM6OiAgICAgICAgICAgICAgIEludGVnZXIgRXhwcmVzc2lvbnMKLUBlbmQgbWVudQotCi1Abm9kZSBFbXB0eSBFeHBycwotQHNlY3Rpb24gRW1wdHkgRXhwcmVzc2lvbnMKLQotQGNpbmRleCBlbXB0eSBleHByZXNzaW9ucwotQGNpbmRleCBleHByZXNzaW9ucywgZW1wdHkKLUFuIGVtcHR5IGV4cHJlc3Npb24gaGFzIG5vIHZhbHVlOiBpdCBpcyBqdXN0IHdoaXRlc3BhY2Ugb3IgbnVsbC4KLVdoZXJldmVyIGFuIGFic29sdXRlIGV4cHJlc3Npb24gaXMgcmVxdWlyZWQsIHlvdSBtYXkgb21pdCB0aGUKLWV4cHJlc3Npb24sIGFuZCBAY29kZXtAdmFsdWV7QVN9fSBhc3N1bWVzIGEgdmFsdWUgb2YgKGFic29sdXRlKSAwLiAgVGhpcwotaXMgY29tcGF0aWJsZSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCi0KLUBub2RlIEludGVnZXIgRXhwcnMKLUBzZWN0aW9uIEludGVnZXIgRXhwcmVzc2lvbnMKLQotQGNpbmRleCBpbnRlZ2VyIGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBpbnRlZ2VyCi1BbiBAZGZue2ludGVnZXIgZXhwcmVzc2lvbn0gaXMgb25lIG9yIG1vcmUgQGVtcGh7YXJndW1lbnRzfSBkZWxpbWl0ZWQKLWJ5IEBlbXBoe29wZXJhdG9yc30uCi0KLUBtZW51Ci0qIEFyZ3VtZW50czo6ICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50cwotKiBPcGVyYXRvcnM6OiAgICAgICAgICAgICAgICAgICBPcGVyYXRvcnMKLSogUHJlZml4IE9wczo6ICAgICAgICAgICAgICAgICAgUHJlZml4IE9wZXJhdG9ycwotKiBJbmZpeCBPcHM6OiAgICAgICAgICAgICAgICAgICBJbmZpeCBPcGVyYXRvcnMKLUBlbmQgbWVudQotCi1Abm9kZSBBcmd1bWVudHMKLUBzdWJzZWN0aW9uIEFyZ3VtZW50cwotCi1AY2luZGV4IGV4cHJlc3Npb24gYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBpbiBleHByZXNzaW9ucwotQGNpbmRleCBvcGVyYW5kcyBpbiBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljIG9wZXJhbmRzCi1AZGZue0FyZ3VtZW50c30gYXJlIHN5bWJvbHMsIG51bWJlcnMgb3Igc3ViZXhwcmVzc2lvbnMuICBJbiBvdGhlcgotY29udGV4dHMgYXJndW1lbnRzIGFyZSBzb21ldGltZXMgY2FsbGVkIGBgYXJpdGhtZXRpYyBvcGVyYW5kcycnLiAgSW4KLXRoaXMgbWFudWFsLCB0byBhdm9pZCBjb25mdXNpbmcgdGhlbSB3aXRoIHRoZSBgYGluc3RydWN0aW9uIG9wZXJhbmRzJycgb2YKLXRoZSBtYWNoaW5lIGxhbmd1YWdlLCB3ZSB1c2UgdGhlIHRlcm0gYGBhcmd1bWVudCcnIHRvIHJlZmVyIHRvIHBhcnRzIG9mCi1leHByZXNzaW9ucyBvbmx5LCByZXNlcnZpbmcgdGhlIHdvcmQgYGBvcGVyYW5kJycgdG8gcmVmZXIgb25seSB0byBtYWNoaW5lCi1pbnN0cnVjdGlvbiBvcGVyYW5kcy4KLQotU3ltYm9scyBhcmUgZXZhbHVhdGVkIHRvIHlpZWxkIEB7QHZhcntzZWN0aW9ufSBAdmFye05OTn1AfSB3aGVyZQotQHZhcntzZWN0aW9ufSBpcyBvbmUgb2YgdGV4dCwgZGF0YSwgYnNzLCBhYnNvbHV0ZSwKLW9yIHVuZGVmaW5lZC4gIEB2YXJ7Tk5OfSBpcyBhIHNpZ25lZCwgMidzIGNvbXBsZW1lbnQgMzIgYml0Ci1pbnRlZ2VyLgotCi1OdW1iZXJzIGFyZSB1c3VhbGx5IGludGVnZXJzLgotCi1BIG51bWJlciBjYW4gYmUgYSBmbG9udW0gb3IgYmlnbnVtLiAgSW4gdGhpcyBjYXNlLCB5b3UgYXJlIHdhcm5lZAotdGhhdCBvbmx5IHRoZSBsb3cgb3JkZXIgMzIgYml0cyBhcmUgdXNlZCwgYW5kIEBjb2Rle0B2YWx1ZXtBU319IHByZXRlbmRzCi10aGVzZSAzMiBiaXRzIGFyZSBhbiBpbnRlZ2VyLiAgWW91IG1heSB3cml0ZSBpbnRlZ2VyLW1hbmlwdWxhdGluZwotaW5zdHJ1Y3Rpb25zIHRoYXQgYWN0IG9uIGV4b3RpYyBjb25zdGFudHMsIGNvbXBhdGlibGUgd2l0aCBvdGhlcgotYXNzZW1ibGVycy4KLQotQGNpbmRleCBzdWJleHByZXNzaW9ucwotU3ViZXhwcmVzc2lvbnMgYXJlIGEgbGVmdCBwYXJlbnRoZXNpcyBAc2FtcHsofSBmb2xsb3dlZCBieSBhbiBpbnRlZ2VyCi1leHByZXNzaW9uLCBmb2xsb3dlZCBieSBhIHJpZ2h0IHBhcmVudGhlc2lzIEBzYW1weyl9OyBvciBhIHByZWZpeAotb3BlcmF0b3IgZm9sbG93ZWQgYnkgYW4gYXJndW1lbnQuCi0KLUBub2RlIE9wZXJhdG9ycwotQHN1YnNlY3Rpb24gT3BlcmF0b3JzCi0KLUBjaW5kZXggb3BlcmF0b3JzLCBpbiBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljIGZ1bmN0aW9ucwotQGNpbmRleCBmdW5jdGlvbnMsIGluIGV4cHJlc3Npb25zCi1AZGZue09wZXJhdG9yc30gYXJlIGFyaXRobWV0aWMgZnVuY3Rpb25zLCBsaWtlIEBjb2Rleyt9IG9yIEBjb2RleyV9LiAgUHJlZml4Ci1vcGVyYXRvcnMgYXJlIGZvbGxvd2VkIGJ5IGFuIGFyZ3VtZW50LiAgSW5maXggb3BlcmF0b3JzIGFwcGVhcgotYmV0d2VlbiB0aGVpciBhcmd1bWVudHMuICBPcGVyYXRvcnMgbWF5IGJlIHByZWNlZGVkIGFuZC9vciBmb2xsb3dlZCBieQotd2hpdGVzcGFjZS4KLQotQG5vZGUgUHJlZml4IE9wcwotQHN1YnNlY3Rpb24gUHJlZml4IE9wZXJhdG9yCi0KLUBjaW5kZXggcHJlZml4IG9wZXJhdG9ycwotQGNvZGV7QHZhbHVle0FTfX0gaGFzIHRoZSBmb2xsb3dpbmcgQGRmbntwcmVmaXggb3BlcmF0b3JzfS4gIFRoZXkgZWFjaCB0YWtlCi1vbmUgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYWJzb2x1dGUuCi0KLUBjIHRoZSB0ZXgvZW5kIHRleCBzdHVmZiBzdXJyb3VuZGluZyB0aGlzIHNtYWxsIHRhYmxlIGlzIG1lYW50IHRvIG1ha2UKLUBjIGl0IGFsaWduLCBvbiB0aGUgcHJpbnRlZCBwYWdlLCB3aXRoIHRoZSBzaW1pbGFyIHRhYmxlIGluIHRoZSBuZXh0Ci1AYyBzZWN0aW9uICh3aGljaCBpcyBpbnNpZGUgYW4gZW51bWVyYXRlKS4KLUB0ZXgKLVxnbG9iYWxcYWR2YW5jZVxsZWZ0c2tpcCBieSBcaXRlbWluZGVudAotQGVuZCB0ZXgKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAtCi1AZGZue05lZ2F0aW9ufS4gIFR3bydzIGNvbXBsZW1lbnQgbmVnYXRpb24uCi1AaXRlbSB+Ci1AZGZue0NvbXBsZW1lbnRhdGlvbn0uICBCaXR3aXNlIG5vdC4KLUBlbmQgdGFibGUKLQotQHRleAotXGdsb2JhbFxhZHZhbmNlXGxlZnRza2lwIGJ5IC1caXRlbWluZGVudAotQGVuZCB0ZXgKLQotQG5vZGUgSW5maXggT3BzCi1Ac3Vic2VjdGlvbiBJbmZpeCBPcGVyYXRvcnMKLQotQGNpbmRleCBpbmZpeCBvcGVyYXRvcnMKLUBjaW5kZXggb3BlcmF0b3JzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AZGZue0luZml4IG9wZXJhdG9yc30gdGFrZSB0d28gYXJndW1lbnRzLCBvbmUgb24gZWl0aGVyIHNpZGUuICBPcGVyYXRvcnMKLWhhdmUgcHJlY2VkZW5jZSwgYnV0IG9wZXJhdGlvbnMgd2l0aCBlcXVhbCBwcmVjZWRlbmNlIGFyZSBwZXJmb3JtZWQgbGVmdAotdG8gcmlnaHQuICBBcGFydCBmcm9tIEBjb2Rleyt9IG9yIEBjb2Rley19LCBib3RoIGFyZ3VtZW50cyBtdXN0IGJlCi1hYnNvbHV0ZSwgYW5kIHRoZSByZXN1bHQgaXMgYWJzb2x1dGUuCi0KLUBlbnVtZXJhdGUKLUBjaW5kZXggb3BlcmF0b3IgcHJlY2VkZW5jZQotQGNpbmRleCBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycwotCi1AaXRlbQotSGlnaGVzdCBQcmVjZWRlbmNlCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gKgotQGRmbntNdWx0aXBsaWNhdGlvbn0uCi0KLUBpdGVtIC8KLUBkZm57RGl2aXNpb259LiAgVHJ1bmNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHsvfQotCi1AaXRlbSAlCi1AZGZue1JlbWFpbmRlcn0uCi0KLUBpdGVtIDwKLUBpdGVteCA8PAotQGRmbntTaGlmdCBMZWZ0fS4gIFNhbWUgYXMgdGhlIEMgb3BlcmF0b3IgQHNhbXB7PDx9LgotCi1AaXRlbSA+Ci1AaXRlbXggPj4KLUBkZm57U2hpZnQgUmlnaHR9LiAgU2FtZSBhcyB0aGUgQyBvcGVyYXRvciBAc2FtcHs+Pn0uCi1AZW5kIHRhYmxlCi0KLUBpdGVtCi1JbnRlcm1lZGlhdGUgcHJlY2VkZW5jZQotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHwKLQotQGRmbntCaXR3aXNlIEluY2x1c2l2ZSBPcn0uCi0KLUBpdGVtICYKLUBkZm57Qml0d2lzZSBBbmR9LgotCi1AaXRlbSBeCi1AZGZue0JpdHdpc2UgRXhjbHVzaXZlIE9yfS4KLQotQGl0ZW0gIQotQGRmbntCaXR3aXNlIE9yIE5vdH0uCi1AZW5kIHRhYmxlCi0KLUBpdGVtCi1Mb3dlc3QgUHJlY2VkZW5jZQotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggYWRkaXRpb24sIHBlcm1pdHRlZCBhcmd1bWVudHMKLUBjaW5kZXggcGx1cywgcGVybWl0dGVkIGFyZ3VtZW50cwotQGNpbmRleCBhcmd1bWVudHMgZm9yIGFkZGl0aW9uCi1AaXRlbSArCi1AZGZue0FkZGl0aW9ufS4gIElmIGVpdGhlciBhcmd1bWVudCBpcyBhYnNvbHV0ZSwgdGhlIHJlc3VsdCBoYXMgdGhlIHNlY3Rpb24gb2YKLXRoZSBvdGhlciBhcmd1bWVudC4gIFlvdSBtYXkgbm90IGFkZCB0b2dldGhlciBhcmd1bWVudHMgZnJvbSBkaWZmZXJlbnQKLXNlY3Rpb25zLgotCi1AY2luZGV4IHN1YnRyYWN0aW9uLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IG1pbnVzLCBwZXJtaXR0ZWQgYXJndW1lbnRzCi1AY2luZGV4IGFyZ3VtZW50cyBmb3Igc3VidHJhY3Rpb24KLUBpdGVtIC0KLUBkZm57U3VidHJhY3Rpb259LiAgSWYgdGhlIHJpZ2h0IGFyZ3VtZW50IGlzIGFic29sdXRlLCB0aGUKLXJlc3VsdCBoYXMgdGhlIHNlY3Rpb24gb2YgdGhlIGxlZnQgYXJndW1lbnQuCi1JZiBib3RoIGFyZ3VtZW50cyBhcmUgaW4gdGhlIHNhbWUgc2VjdGlvbiwgdGhlIHJlc3VsdCBpcyBhYnNvbHV0ZS4KLVlvdSBtYXkgbm90IHN1YnRyYWN0IGFyZ3VtZW50cyBmcm9tIGRpZmZlcmVudCBzZWN0aW9ucy4KLUBjIEZJWE1FIGlzIHRoZXJlIHN0aWxsIHNvbWV0aGluZyB1c2VmdWwgdG8gc2F5IGFib3V0IHVuZGVmaW5lZCAtIHVuZGVmaW5lZCA/Ci1AZW5kIHRhYmxlCi1AZW5kIGVudW1lcmF0ZQotCi1JbiBzaG9ydCwgaXQncyBvbmx5IG1lYW5pbmdmdWwgdG8gYWRkIG9yIHN1YnRyYWN0IHRoZSBAZW1waHtvZmZzZXRzfSBpbiBhbgotYWRkcmVzczsgeW91IGNhbiBvbmx5IGhhdmUgYSBkZWZpbmVkIHNlY3Rpb24gaW4gb25lIG9mIHRoZSB0d28gYXJndW1lbnRzLgotCi1Abm9kZSBQc2V1ZG8gT3BzCi1AY2hhcHRlciBBc3NlbWJsZXIgRGlyZWN0aXZlcwotCi1AY2luZGV4IGRpcmVjdGl2ZXMsIG1hY2hpbmUgaW5kZXBlbmRlbnQKLUBjaW5kZXggcHNldWRvLW9wcywgbWFjaGluZSBpbmRlcGVuZGVudAotQGNpbmRleCBtYWNoaW5lIGluZGVwZW5kZW50IGRpcmVjdGl2ZXMKLUFsbCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBoYXZlIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCBhIHBlcmlvZCAoQHNhbXB7Ln0pLgotVGhlIHJlc3Qgb2YgdGhlIG5hbWUgaXMgbGV0dGVycywgdXN1YWxseSBpbiBsb3dlciBjYXNlLgotCi1UaGlzIGNoYXB0ZXIgZGlzY3Vzc2VzIGRpcmVjdGl2ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHJlZ2FyZGxlc3Mgb2YgdGhlCi10YXJnZXQgbWFjaGluZSBjb25maWd1cmF0aW9uIGZvciB0aGUgQHNje2dudX0gYXNzZW1ibGVyLgotQGlmc2V0IEdFTkVSSUMKLVNvbWUgbWFjaGluZSBjb25maWd1cmF0aW9ucyBwcm92aWRlIGFkZGl0aW9uYWwgZGlyZWN0aXZlcy4KLUB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBtYWNoaW5lLWRpcmVjdGl2ZXMKLUB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSBmb3IgYWRkaXRpb25hbCBkaXJlY3RpdmVzLgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBtZW51Ci0qIEFib3J0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5hYm9ydH0KLUBpZnNldCBDT0ZGCi0qIEFCT1JUOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5BQk9SVH0KLUBlbmQgaWZzZXQKLQotKiBBbGlnbjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYWxpZ24gQHZhcnthYnMtZXhwcn0gLCBAdmFye2Ficy1leHByfX0KLSogQXNjaWk6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFzY2lpICJAdmFye3N0cmluZ30ifUBkb3Rze30KLSogQXNjaXo6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmFzY2l6ICJAdmFye3N0cmluZ30ifUBkb3Rze30KLSogQmFsaWduOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmJhbGlnbiBAdmFye2Ficy1leHByfSAsIEB2YXJ7YWJzLWV4cHJ9fQotKiBCeXRlOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuYnl0ZSBAdmFye2V4cHJlc3Npb25zfX0KLSogQ29tbTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9IH0KLSogRGF0YTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRhdGEgQHZhcntzdWJzZWN0aW9ufX0KLUBpZnNldCBDT0ZGCi0qIERlZjo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kZWYgQHZhcntuYW1lfX0KLUBlbmQgaWZzZXQKLUBpZnNldCBhb3V0LWJvdXQKLSogRGVzYzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRlc2MgQHZhcntzeW1ib2x9LCBAdmFye2Ficy1leHByZXNzaW9ufX0KLUBlbmQgaWZzZXQKLUBpZnNldCBDT0ZGCi0qIERpbTo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5kaW19Ci1AZW5kIGlmc2V0Ci0KLSogRG91YmxlOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmRvdWJsZSBAdmFye2Zsb251bXN9fQotKiBFamVjdDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZWplY3R9Ci0qIEVsc2U6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbHNlfQotKiBFbmQ6OgkJCQlAY29kZXsuZW5kfQotQGlmc2V0IENPRkYKLSogRW5kZWY6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmVuZGVmfQotQGVuZCBpZnNldAotCi0qIEVuZGZ1bmM6OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lbmRmdW5jfQotKiBFbmRpZjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZW5kaWZ9Ci0qIEVxdTo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5lcXUgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotKiBFcXVpdjo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZXF1aXYgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotKiBFcnI6OgkJCQlAY29kZXsuZXJyfQotKiBFeGl0bTo6CQkJQGNvZGV7LmV4aXRtfQotKiBFeHRlcm46OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuZXh0ZXJufQotKiBGYWlsOjoJCQlAY29kZXsuZmFpbH0KLUBpZmNsZWFyIG5vLWZpbGUtZGlyCi0qIEZpbGU6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5maWxlIEB2YXJ7c3RyaW5nfX0KLUBlbmQgaWZjbGVhcgotCi0qIEZpbGw6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5maWxsIEB2YXJ7cmVwZWF0fSAsIEB2YXJ7c2l6ZX0gLCBAdmFye3ZhbHVlfX0KLSogRmxvYXQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmZsb2F0IEB2YXJ7ZmxvbnVtc319Ci0qIEZ1bmM6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5mdW5jfSAgCi0qIEdsb2JhbDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5nbG9iYWwgQHZhcntzeW1ib2x9fSwgQGNvZGV7Lmdsb2JsIEB2YXJ7c3ltYm9sfX0KLSogaHdvcmQ6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7Lmh3b3JkIEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBJZGVudDo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuaWRlbnR9Ci0qIElmOjogICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pZiBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259fQotKiBJbmNsdWRlOjogICAgICAgICAgICAgICAgICAgICBAY29kZXsuaW5jbHVkZSAiQHZhcntmaWxlfSJ9Ci0qIEludDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5pbnQgQHZhcntleHByZXNzaW9uc319Ci0qIElycDo6CQkJCUBjb2Rley5pcnAgQHZhcntzeW1ib2x9LEB2YXJ7dmFsdWVzfX1AZG90c3t9Ci0qIElycGM6OgkJCUBjb2Rley5pcnBjIEB2YXJ7c3ltYm9sfSxAdmFye3ZhbHVlc319QGRvdHN7fQotKiBMY29tbTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGNvbW0gQHZhcntzeW1ib2x9ICwgQHZhcntsZW5ndGh9fQotKiBMZmxhZ3M6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGZsYWdzfQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLSogTGluZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxpbmUgQHZhcntsaW5lLW51bWJlcn19Ci1AZW5kIGlmY2xlYXIKLQotKiBMbjo6ICAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubG4gQHZhcntsaW5lLW51bWJlcn19Ci0qIExpbmtvbmNlOjoJCQlAY29kZXsubGlua29uY2UgW0B2YXJ7dHlwZX1dfQotKiBMaXN0OjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubGlzdH0KLSogTG9uZzo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LmxvbmcgQHZhcntleHByZXNzaW9uc319Ci1AaWdub3JlCi0qIExzeW06OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5sc3ltIEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufX0KLUBlbmQgaWdub3JlCi0KLSogTWFjcm86OgkJCUBjb2Rley5tYWNybyBAdmFye25hbWV9IEB2YXJ7YXJnc319QGRvdHN7fQotKiBNUkk6OgkJCQlAY29kZXsubXJpIEB2YXJ7dmFsfX0KLQotKiBOb2xpc3Q6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsubm9saXN0fQotKiBPY3RhOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsub2N0YSBAdmFye2JpZ251bXN9fQotKiBPcmc6OiAgICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsub3JnIEB2YXJ7bmV3LWxjfSAsIEB2YXJ7ZmlsbH19Ci0qIFAyYWxpZ246OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5wMmFsaWduIEB2YXJ7YWJzLWV4cHJ9ICwgQHZhcnthYnMtZXhwcn19Ci0qIFByaW50OjoJCQlAY29kZXsucHJpbnQgQHZhcntzdHJpbmd9fQotKiBQc2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsucHNpemUgQHZhcntsaW5lc30sIEB2YXJ7Y29sdW1uc319Ci0qIFB1cmdlbTo6CQkJQGNvZGV7LnB1cmdlbSBAdmFye25hbWV9fQotKiBRdWFkOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsucXVhZCBAdmFye2JpZ251bXN9fQotKiBSZXB0OjoJCQlAY29kZXsucmVwdCBAdmFye2NvdW50fX0KLSogU2J0dGw6OiAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNidHRsICJAdmFye3N1YmhlYWRpbmd9In0KLUBpZnNldCBDT0ZGCi0qIFNjbDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zY2wgQHZhcntjbGFzc319Ci0qIFNlY3Rpb246OiAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zZWN0aW9uIEB2YXJ7bmFtZX0sIEB2YXJ7c3Vic2VjdGlvbn19Ci1AZW5kIGlmc2V0Ci0KLSogU2V0OjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNldCBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0qIFNob3J0OjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zaG9ydCBAdmFye2V4cHJlc3Npb25zfX0KLSogU2luZ2xlOjogICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNpbmdsZSBAdmFye2Zsb251bXN9fQotQGlmc2V0IENPRkYKLSogU2l6ZTo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNpemV9Ci1AZW5kIGlmc2V0Ci0KLSogU2tpcDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnNraXAgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci0qIFNsZWIxMjg6OgkJCUBjb2Rley5zbGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotKiBTcGFjZTo6ICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3BhY2UgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci1AaWZzZXQgaGF2ZS1zdGFicwotKiBTdGFiOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3RhYmQsIC5zdGFibiwgLnN0YWJzfQotQGVuZCBpZnNldAotCi0qIFN0cmluZzo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley5zdHJpbmcgIkB2YXJ7c3RyfSJ9Ci0qIFN0cnVjdDo6CQkJQGNvZGV7LnN0cnVjdCBAdmFye2V4cHJlc3Npb259fQotQGlmc2V0IEVMRgotKiBTeW12ZXI6OiAgICAgICAgICAgICAgICAgICAgICBAY29kZXsuc3ltdmVyIEB2YXJ7bmFtZX0sQHZhcntuYW1lMkBAbm9kZW5hbWV9fQotQGVuZCBpZnNldAotQGlmc2V0IENPRkYKLSogVGFnOjogICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LnRhZyBAdmFye3N0cnVjdG5hbWV9fQotQGVuZCBpZnNldAotCi0qIFRleHQ6OiAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50ZXh0IEB2YXJ7c3Vic2VjdGlvbn19Ci0qIFRpdGxlOjogICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley50aXRsZSAiQHZhcntoZWFkaW5nfSJ9Ci1AaWZzZXQgQ09GRgotKiBUeXBlOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXsudHlwZSBAdmFye2ludH19Ci0qIFZhbDo6ICAgICAgICAgICAgICAgICAgICAgICAgIEBjb2Rley52YWwgQHZhcnthZGRyfX0KLUBlbmQgaWZzZXQKLQotKiBVbGViMTI4OjogICAgICAgICAgICAgICAgICAgICBAY29kZXsudWxlYjEyOCBAdmFye2V4cHJlc3Npb25zfX0KLSogV29yZDo6ICAgICAgICAgICAgICAgICAgICAgICAgQGNvZGV7LndvcmQgQHZhcntleHByZXNzaW9uc319Ci0qIERlcHJlY2F0ZWQ6OiAgICAgICAgICAgICAgICAgIERlcHJlY2F0ZWQgRGlyZWN0aXZlcwotQGVuZCBtZW51Ci0KLUBub2RlIEFib3J0Ci1Ac2VjdGlvbiBAY29kZXsuYWJvcnR9Ci0KLUBjaW5kZXggQGNvZGV7YWJvcnR9IGRpcmVjdGl2ZQotQGNpbmRleCBzdG9wcGluZyB0aGUgYXNzZW1ibHkKLVRoaXMgZGlyZWN0aXZlIHN0b3BzIHRoZSBhc3NlbWJseSBpbW1lZGlhdGVseS4gIEl0IGlzIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuICBUaGUgb3JpZ2luYWwgaWRlYSB3YXMgdGhhdCB0aGUKLWFzc2VtYmx5IGxhbmd1YWdlIHNvdXJjZSB3b3VsZCBiZSBwaXBlZCBpbnRvIHRoZSBhc3NlbWJsZXIuICBJZiB0aGUgc2VuZGVyCi1vZiB0aGUgc291cmNlIHF1aXQsIGl0IGNvdWxkIHVzZSB0aGlzIGRpcmVjdGl2ZSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0bwotcXVpdCBhbHNvLiAgT25lIGRheSBAY29kZXsuYWJvcnR9IHdpbGwgbm90IGJlIHN1cHBvcnRlZC4KLQotQGlmc2V0IENPRkYKLUBub2RlIEFCT1JUCi1Ac2VjdGlvbiBAY29kZXsuQUJPUlR9Ci0KLUBjaW5kZXggQGNvZGV7QUJPUlR9IGRpcmVjdGl2ZQotV2hlbiBwcm9kdWNpbmcgQ09GRiBvdXRwdXQsIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYXMgYQotc3lub255bSBmb3IgQHNhbXB7LmFib3J0fS4KLQotQGlmc2V0IEJPVVQKLVdoZW4gcHJvZHVjaW5nIEBjb2Rle2Iub3V0fSBvdXRwdXQsIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUsCi1idXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgQWxpZ24KLUBzZWN0aW9uIEBjb2Rley5hbGlnbiBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9fQotCi1AY2luZGV4IHBhZGRpbmcgdGhlIGxvY2F0aW9uIGNvdW50ZXIKLUBjaW5kZXggQGNvZGV7YWxpZ259IGRpcmVjdGl2ZQotUGFkIHRoZSBsb2NhdGlvbiBjb3VudGVyIChpbiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSB0byBhIHBhcnRpY3VsYXIgc3RvcmFnZQotYm91bmRhcnkuICBUaGUgZmlyc3QgZXhwcmVzc2lvbiAod2hpY2ggbXVzdCBiZSBhYnNvbHV0ZSkgaXMgdGhlIGFsaWdubWVudAotcmVxdWlyZWQsIGFzIGRlc2NyaWJlZCBiZWxvdy4KLQotVGhlIHNlY29uZCBleHByZXNzaW9uIChhbHNvIGFic29sdXRlKSBnaXZlcyB0aGUgZmlsbCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1wYWRkaW5nIGJ5dGVzLiAgSXQgKGFuZCB0aGUgY29tbWEpIG1heSBiZSBvbWl0dGVkLiAgSWYgaXQgaXMgb21pdHRlZCwgdGhlCi1wYWRkaW5nIGJ5dGVzIGFyZSBub3JtYWxseSB6ZXJvLiAgSG93ZXZlciwgb24gc29tZSBzeXN0ZW1zLCBpZiB0aGUgc2VjdGlvbiBpcwotbWFya2VkIGFzIGNvbnRhaW5pbmcgY29kZSBhbmQgdGhlIGZpbGwgdmFsdWUgaXMgb21pdHRlZCwgdGhlIHNwYWNlIGlzIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMuCi0KLVRoZSB0aGlyZCBleHByZXNzaW9uIGlzIGFsc28gYWJzb2x1dGUsIGFuZCBpcyBhbHNvIG9wdGlvbmFsLiAgSWYgaXQgaXMgcHJlc2VudCwKLWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoaXMgYWxpZ25tZW50Ci1kaXJlY3RpdmUuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIHRoZQotc3BlY2lmaWVkIG1heGltdW0sIHRoZW4gdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuICBZb3UgY2FuIG9taXQgdGhlCi1maWxsIHZhbHVlICh0aGUgc2Vjb25kIGFyZ3VtZW50KSBlbnRpcmVseSBieSBzaW1wbHkgdXNpbmcgdHdvIGNvbW1hcyBhZnRlciB0aGUKLXJlcXVpcmVkIGFsaWdubWVudDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBhbGlnbm1lbnQgdG8gYmUgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlLgotCi1UaGUgd2F5IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkIHZhcmllcyBmcm9tIHN5c3RlbSB0byBzeXN0ZW0uCi1Gb3IgdGhlIGEyOWssIGhwcGEsIG02OGssIG04OGssIHc2NSwgc3BhcmMsIGFuZCBIaXRhY2hpIFNILCBhbmQgaTM4NiB1c2luZyBFTEYKLWZvcm1hdCwKLXRoZSBmaXJzdCBleHByZXNzaW9uIGlzIHRoZQotYWxpZ25tZW50IHJlcXVlc3QgaW4gYnl0ZXMuICBGb3IgZXhhbXBsZSBAc2FtcHsuYWxpZ24gOH0gYWR2YW5jZXMKLXRoZSBsb2NhdGlvbiBjb3VudGVyIHVudGlsIGl0IGlzIGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyCi1pcyBhbHJlYWR5IGEgbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KLQotRm9yIG90aGVyIHN5c3RlbXMsIGluY2x1ZGluZyB0aGUgaTM4NiB1c2luZyBhLm91dCBmb3JtYXQsIGl0IGlzIHRoZQotbnVtYmVyIG9mIGxvdy1vcmRlciB6ZXJvIGJpdHMgdGhlIGxvY2F0aW9uIGNvdW50ZXIgbXVzdCBoYXZlIGFmdGVyCi1hZHZhbmNlbWVudC4gIEZvciBleGFtcGxlIEBzYW1wey5hbGlnbiAzfSBhZHZhbmNlcyB0aGUgbG9jYXRpb24KLWNvdW50ZXIgdW50aWwgaXQgYSBtdWx0aXBsZSBvZiA4LiAgSWYgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgYWxyZWFkeSBhCi1tdWx0aXBsZSBvZiA4LCBubyBjaGFuZ2UgaXMgbmVlZGVkLgotCi1UaGlzIGluY29uc2lzdGVuY3kgaXMgZHVlIHRvIHRoZSBkaWZmZXJlbnQgYmVoYXZpb3JzIG9mIHRoZSB2YXJpb3VzCi1uYXRpdmUgYXNzZW1ibGVycyBmb3IgdGhlc2Ugc3lzdGVtcyB3aGljaCBHQVMgbXVzdCBlbXVsYXRlLgotR0FTIGFsc28gcHJvdmlkZXMgQGNvZGV7LmJhbGlnbn0gYW5kIEBjb2Rley5wMmFsaWdufSBkaXJlY3RpdmVzLAotZGVzY3JpYmVkIGxhdGVyLCB3aGljaCBoYXZlIGEgY29uc2lzdGVudCBiZWhhdmlvciBhY3Jvc3MgYWxsCi1hcmNoaXRlY3R1cmVzIChidXQgYXJlIHNwZWNpZmljIHRvIEdBUykuCi0KLUBub2RlIEFzY2lpCi1Ac2VjdGlvbiBAY29kZXsuYXNjaWkgIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotCi1AY2luZGV4IEBjb2Rle2FzY2lpfSBkaXJlY3RpdmUKLUBjaW5kZXggc3RyaW5nIGxpdGVyYWxzCi1AY29kZXsuYXNjaWl9IGV4cGVjdHMgemVybyBvciBtb3JlIHN0cmluZyBsaXRlcmFscyAoQHB4cmVme1N0cmluZ3N9KQotc2VwYXJhdGVkIGJ5IGNvbW1hcy4gIEl0IGFzc2VtYmxlcyBlYWNoIHN0cmluZyAod2l0aCBubyBhdXRvbWF0aWMKLXRyYWlsaW5nIHplcm8gYnl0ZSkgaW50byBjb25zZWN1dGl2ZSBhZGRyZXNzZXMuCi0KLUBub2RlIEFzY2l6Ci1Ac2VjdGlvbiBAY29kZXsuYXNjaXogIkB2YXJ7c3RyaW5nfSJ9QGRvdHN7fQotCi1AY2luZGV4IEBjb2Rle2FzY2l6fSBkaXJlY3RpdmUKLUBjaW5kZXggemVyby10ZXJtaW5hdGVkIHN0cmluZ3MKLUBjaW5kZXggbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MKLUBjb2Rley5hc2Npen0gaXMganVzdCBsaWtlIEBjb2Rley5hc2NpaX0sIGJ1dCBlYWNoIHN0cmluZyBpcyBmb2xsb3dlZCBieQotYSB6ZXJvIGJ5dGUuICBUaGUgYGB6JycgaW4gQHNhbXB7LmFzY2l6fSBzdGFuZHMgZm9yIGBgemVybycnLgotCi1Abm9kZSBCYWxpZ24KLUBzZWN0aW9uIEBjb2Rley5iYWxpZ25bd2xdIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfSwgQHZhcnthYnMtZXhwcn19Ci0KLUBjaW5kZXggcGFkZGluZyB0aGUgbG9jYXRpb24gY291bnRlciBnaXZlbiBudW1iZXIgb2YgYnl0ZXMKLUBjaW5kZXggQGNvZGV7YmFsaWdufSBkaXJlY3RpdmUKLVBhZCB0aGUgbG9jYXRpb24gY291bnRlciAoaW4gdGhlIGN1cnJlbnQgc3Vic2VjdGlvbikgdG8gYSBwYXJ0aWN1bGFyCi1zdG9yYWdlIGJvdW5kYXJ5LiAgVGhlIGZpcnN0IGV4cHJlc3Npb24gKHdoaWNoIG11c3QgYmUgYWJzb2x1dGUpIGlzIHRoZQotYWxpZ25tZW50IHJlcXVlc3QgaW4gYnl0ZXMuICBGb3IgZXhhbXBsZSBAc2FtcHsuYmFsaWduIDh9IGFkdmFuY2VzCi10aGUgbG9jYXRpb24gY291bnRlciB1bnRpbCBpdCBpcyBhIG11bHRpcGxlIG9mIDguICBJZiB0aGUgbG9jYXRpb24gY291bnRlcgotaXMgYWxyZWFkeSBhIG11bHRpcGxlIG9mIDgsIG5vIGNoYW5nZSBpcyBuZWVkZWQuCi0KLVRoZSBzZWNvbmQgZXhwcmVzc2lvbiAoYWxzbyBhYnNvbHV0ZSkgZ2l2ZXMgdGhlIGZpbGwgdmFsdWUgdG8gYmUgc3RvcmVkIGluIHRoZQotcGFkZGluZyBieXRlcy4gIEl0IChhbmQgdGhlIGNvbW1hKSBtYXkgYmUgb21pdHRlZC4gIElmIGl0IGlzIG9taXR0ZWQsIHRoZQotcGFkZGluZyBieXRlcyBhcmUgbm9ybWFsbHkgemVyby4gIEhvd2V2ZXIsIG9uIHNvbWUgc3lzdGVtcywgaWYgdGhlIHNlY3Rpb24gaXMKLW1hcmtlZCBhcyBjb250YWluaW5nIGNvZGUgYW5kIHRoZSBmaWxsIHZhbHVlIGlzIG9taXR0ZWQsIHRoZSBzcGFjZSBpcyBmaWxsZWQKLXdpdGggbm8tb3AgaW5zdHJ1Y3Rpb25zLgotCi1UaGUgdGhpcmQgZXhwcmVzc2lvbiBpcyBhbHNvIGFic29sdXRlLCBhbmQgaXMgYWxzbyBvcHRpb25hbC4gIElmIGl0IGlzIHByZXNlbnQsCi1pdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBzaG91bGQgYmUgc2tpcHBlZCBieSB0aGlzIGFsaWdubWVudAotZGlyZWN0aXZlLiAgSWYgZG9pbmcgdGhlIGFsaWdubWVudCB3b3VsZCByZXF1aXJlIHNraXBwaW5nIG1vcmUgYnl0ZXMgdGhhbiB0aGUKLXNwZWNpZmllZCBtYXhpbXVtLCB0aGVuIHRoZSBhbGlnbm1lbnQgaXMgbm90IGRvbmUgYXQgYWxsLiAgWW91IGNhbiBvbWl0IHRoZQotZmlsbCB2YWx1ZSAodGhlIHNlY29uZCBhcmd1bWVudCkgZW50aXJlbHkgYnkgc2ltcGx5IHVzaW5nIHR3byBjb21tYXMgYWZ0ZXIgdGhlCi1yZXF1aXJlZCBhbGlnbm1lbnQ7IHRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0aGUgYWxpZ25tZW50IHRvIGJlIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMgd2hlbiBhcHByb3ByaWF0ZS4KLQotQGNpbmRleCBAY29kZXtiYWxpZ253fSBkaXJlY3RpdmUKLUBjaW5kZXggQGNvZGV7YmFsaWdubH0gZGlyZWN0aXZlCi1UaGUgQGNvZGV7LmJhbGlnbnd9IGFuZCBAY29kZXsuYmFsaWdubH0gZGlyZWN0aXZlcyBhcmUgdmFyaWFudHMgb2YgdGhlCi1AY29kZXsuYmFsaWdufSBkaXJlY3RpdmUuICBUaGUgQGNvZGV7LmJhbGlnbnd9IGRpcmVjdGl2ZSB0cmVhdHMgdGhlIGZpbGwKLXBhdHRlcm4gYXMgYSB0d28gYnl0ZSB3b3JkIHZhbHVlLiAgVGhlIEBjb2Rley5iYWxpZ25sfSBkaXJlY3RpdmVzIHRyZWF0cyB0aGUKLWZpbGwgcGF0dGVybiBhcyBhIGZvdXIgYnl0ZSBsb25nd29yZCB2YWx1ZS4gIEZvciBleGFtcGxlLCBAY29kZXsuYmFsaWdudwotNCwweDM2OGR9IHdpbGwgYWxpZ24gdG8gYSBtdWx0aXBsZSBvZiA0LiAgSWYgaXQgc2tpcHMgdHdvIGJ5dGVzLCB0aGV5IHdpbGwgYmUKLWZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZSAweDM2OGQgKHRoZSBleGFjdCBwbGFjZW1lbnQgb2YgdGhlIGJ5dGVzIGRlcGVuZHMgdXBvbgotdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIHByb2Nlc3NvcikuICBJZiBpdCBza2lwcyAxIG9yIDMgYnl0ZXMsIHRoZSBmaWxsIHZhbHVlIGlzCi11bmRlZmluZWQuCi0KLUBub2RlIEJ5dGUKLUBzZWN0aW9uIEBjb2Rley5ieXRlIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle2J5dGV9IGRpcmVjdGl2ZQotQGNpbmRleCBpbnRlZ2Vycywgb25lIGJ5dGUKLUBjb2Rley5ieXRlfSBleHBlY3RzIHplcm8gb3IgbW9yZSBleHByZXNzaW9ucywgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KLUVhY2ggZXhwcmVzc2lvbiBpcyBhc3NlbWJsZWQgaW50byB0aGUgbmV4dCBieXRlLgotCi1Abm9kZSBDb21tCi1Ac2VjdGlvbiBAY29kZXsuY29tbSBAdmFye3N5bWJvbH0gLCBAdmFye2xlbmd0aH0gfQotCi1AY2luZGV4IEBjb2Rle2NvbW19IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wsIGNvbW1vbgotQGNvZGV7LmNvbW19IGRlY2xhcmVzIGEgY29tbW9uIHN5bWJvbCBuYW1lZCBAdmFye3N5bWJvbH0uICBXaGVuIGxpbmtpbmcsIGEKLWNvbW1vbiBzeW1ib2wgaW4gb25lIG9iamVjdCBmaWxlIG1heSBiZSBtZXJnZWQgd2l0aCBhIGRlZmluZWQgb3IgY29tbW9uIHN5bWJvbAotb2YgdGhlIHNhbWUgbmFtZSBpbiBhbm90aGVyIG9iamVjdCBmaWxlLiAgSWYgQGNvZGV7QHZhbHVle0xEfX0gZG9lcyBub3Qgc2VlIGEKLWRlZmluaXRpb24gZm9yIHRoZSBzeW1ib2wtLWp1c3Qgb25lIG9yIG1vcmUgY29tbW9uIHN5bWJvbHMtLXRoZW4gaXQgd2lsbAotYWxsb2NhdGUgQHZhcntsZW5ndGh9IGJ5dGVzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LiAgQHZhcntsZW5ndGh9IG11c3QgYmUgYW4KLWFic29sdXRlIGV4cHJlc3Npb24uICBJZiBAY29kZXtAdmFsdWV7TER9fSBzZWVzIG11bHRpcGxlIGNvbW1vbiBzeW1ib2xzIHdpdGgKLXRoZSBzYW1lIG5hbWUsIGFuZCB0aGV5IGRvIG5vdCBhbGwgaGF2ZSB0aGUgc2FtZSBzaXplLCBpdCB3aWxsIGFsbG9jYXRlIHNwYWNlCi11c2luZyB0aGUgbGFyZ2VzdCBzaXplLgotCi1AaWZzZXQgRUxGCi1XaGVuIHVzaW5nIEVMRiwgdGhlIEBjb2Rley5jb21tfSBkaXJlY3RpdmUgdGFrZXMgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQuCi1UaGlzIGlzIHRoZSBkZXNpcmVkIGFsaWdubWVudCBvZiB0aGUgc3ltYm9sLCBzcGVjaWZpZWQgYXMgYSBieXRlIGJvdW5kYXJ5IChmb3IKLWV4YW1wbGUsIGFuIGFsaWdubWVudCBvZiAxNiBtZWFucyB0aGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCA0IGJpdHMgb2YgdGhlCi1hZGRyZXNzIHNob3VsZCBiZSB6ZXJvKS4gIFRoZSBhbGlnbm1lbnQgbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLCBhbmQgaXQKLW11c3QgYmUgYSBwb3dlciBvZiB0d28uICBJZiBAY29kZXtAdmFsdWV7TER9fSBhbGxvY2F0ZXMgdW5pbml0aWFsaXplZCBtZW1vcnkKLWZvciB0aGUgY29tbW9uIHN5bWJvbCwgaXQgd2lsbCB1c2UgdGhlIGFsaWdubWVudCB3aGVuIHBsYWNpbmcgdGhlIHN5bWJvbC4gIElmCi1ubyBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIHNldCB0aGUgYWxpZ25tZW50IHRvIHRoZQotbGFyZ2VzdCBwb3dlciBvZiB0d28gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wsIHVwIHRvIGEKLW1heGltdW0gb2YgMTYuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIUFBBCi1UaGUgc3ludGF4IGZvciBAY29kZXsuY29tbX0gZGlmZmVycyBzbGlnaHRseSBvbiB0aGUgSFBQQS4gIFRoZSBzeW50YXggaXMKLUBzYW1we0B2YXJ7c3ltYm9sfSAuY29tbSwgQHZhcntsZW5ndGh9fTsgQHZhcntzeW1ib2x9IGlzIG9wdGlvbmFsLgotQGVuZCBpZnNldAotCi1Abm9kZSBEYXRhCi1Ac2VjdGlvbiBAY29kZXsuZGF0YSBAdmFye3N1YnNlY3Rpb259fQotCi1AY2luZGV4IEBjb2Rle2RhdGF9IGRpcmVjdGl2ZQotQGNvZGV7LmRhdGF9IHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGFzc2VtYmxlIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBvbnRvIHRoZQotZW5kIG9mIHRoZSBkYXRhIHN1YnNlY3Rpb24gbnVtYmVyZWQgQHZhcntzdWJzZWN0aW9ufSAod2hpY2ggaXMgYW4KLWFic29sdXRlIGV4cHJlc3Npb24pLiAgSWYgQHZhcntzdWJzZWN0aW9ufSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cwotdG8gemVyby4KLQotQGlmc2V0IENPRkYKLUBub2RlIERlZgotQHNlY3Rpb24gQGNvZGV7LmRlZiBAdmFye25hbWV9fQotCi1AY2luZGV4IEBjb2Rle2RlZn0gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgc3ltYm9scywgZGVidWdnaW5nCi1AY2luZGV4IGRlYnVnZ2luZyBDT0ZGIHN5bWJvbHMKLUJlZ2luIGRlZmluaW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wgQHZhcntuYW1lfTsgdGhlCi1kZWZpbml0aW9uIGV4dGVuZHMgdW50aWwgdGhlIEBjb2Rley5lbmRlZn0gZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkLgotQGlmc2V0IEJPVVQKLQotVGhpcyBkaXJlY3RpdmUgaXMgb25seSBvYnNlcnZlZCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgZm9yIENPRkYKLWZvcm1hdCBvdXRwdXQ7IHdoZW4gcHJvZHVjaW5nIEBjb2Rle2Iub3V0fSwgQHNhbXB7LmRlZn0gaXMgcmVjb2duaXplZCwKLWJ1dCBpZ25vcmVkLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1AaWZzZXQgYW91dC1ib3V0Ci1Abm9kZSBEZXNjCi1Ac2VjdGlvbiBAY29kZXsuZGVzYyBAdmFye3N5bWJvbH0sIEB2YXJ7YWJzLWV4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle2Rlc2N9IGRpcmVjdGl2ZQotQGNpbmRleCBDT0ZGIHN5bWJvbCBkZXNjcmlwdG9yCi1AY2luZGV4IHN5bWJvbCBkZXNjcmlwdG9yLCBDT0ZGCi1UaGlzIGRpcmVjdGl2ZSBzZXRzIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBzeW1ib2wgKEBweHJlZntTeW1ib2wgQXR0cmlidXRlc30pCi10byB0aGUgbG93IDE2IGJpdHMgb2YgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4KLQotQGlmc2V0IENPRkYKLVRoZSBAc2FtcHsuZGVzY30gZGlyZWN0aXZlIGlzIG5vdCBhdmFpbGFibGUgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcwotY29uZmlndXJlZCBmb3IgQ09GRiBvdXRwdXQ7IGl0IGlzIG9ubHkgZm9yIEBjb2Rle2Eub3V0fSBvciBAY29kZXtiLm91dH0KLW9iamVjdCBmb3JtYXQuICBGb3IgdGhlIHNha2Ugb2YgY29tcGF0aWJpbGl0eSwgQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cwotaXQsIGJ1dCBwcm9kdWNlcyBubyBvdXRwdXQsIHdoZW4gY29uZmlndXJlZCBmb3IgQ09GRi4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIERpbQotQHNlY3Rpb24gQGNvZGV7LmRpbX0KLQotQGNpbmRleCBAY29kZXtkaW19IGRpcmVjdGl2ZQotQGNpbmRleCBDT0ZGIGF1eGlsaWFyeSBzeW1ib2wgaW5mb3JtYXRpb24KLUBjaW5kZXggYXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiwgQ09GRgotVGhpcyBkaXJlY3RpdmUgaXMgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVycyB0byBpbmNsdWRlIGF1eGlsaWFyeSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJdCBpcyBvbmx5IHBlcm1pdHRlZCBpbnNpZGUKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsuZGltfSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgd2hlbgotQGNvZGV7QHZhbHVle0FTfX0gaXMgZ2VuZXJhdGluZyBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0Ci1pZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBEb3VibGUKLUBzZWN0aW9uIEBjb2Rley5kb3VibGUgQHZhcntmbG9udW1zfX0KLQotQGNpbmRleCBAY29kZXtkb3VibGV9IGRpcmVjdGl2ZQotQGNpbmRleCBmbG9hdGluZyBwb2ludCBudW1iZXJzIChkb3VibGUpCi1AY29kZXsuZG91YmxlfSBleHBlY3RzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQKLWFzc2VtYmxlcyBmbG9hdGluZyBwb2ludCBudW1iZXJzLgotQGlmc2V0IEdFTkVSSUMKLVRoZSBleGFjdCBraW5kIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgZW1pdHRlZCBkZXBlbmRzIG9uIGhvdwotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZC4gIEB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJRUVFRkxPQVQKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHkgQHNhbXB7LmRvdWJsZX0gZW1pdHMgNjQtYml0IGZsb2F0aW5nLXBvaW50IG51bWJlcnMKLWluIEBzY3tpZWVlfSBmb3JtYXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgRWplY3QKLUBzZWN0aW9uIEBjb2Rley5lamVjdH0KLQotQGNpbmRleCBAY29kZXtlamVjdH0gZGlyZWN0aXZlCi1AY2luZGV4IG5ldyBwYWdlLCBpbiBsaXN0aW5ncwotQGNpbmRleCBwYWdlLCBpbiBsaXN0aW5ncwotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IG5ldyBwYWdlCi1Gb3JjZSBhIHBhZ2UgYnJlYWsgYXQgdGhpcyBwb2ludCwgd2hlbiBnZW5lcmF0aW5nIGFzc2VtYmx5IGxpc3RpbmdzLgotCi1Abm9kZSBFbHNlCi1Ac2VjdGlvbiBAY29kZXsuZWxzZX0KLQotQGNpbmRleCBAY29kZXtlbHNlfSBkaXJlY3RpdmUKLUBjb2Rley5lbHNlfSBpcyBwYXJ0IG9mIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IGZvciBjb25kaXRpb25hbAotYXNzZW1ibHk7IEBweHJlZntJZiwsQGNvZGV7LmlmfX0uICBJdCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIGEgc2VjdGlvbgotb2YgY29kZSB0byBiZSBhc3NlbWJsZWQgaWYgdGhlIGNvbmRpdGlvbiBmb3IgdGhlIHByZWNlZGluZyBAY29kZXsuaWZ9Ci13YXMgZmFsc2UuCi0KLUBub2RlIEVuZAotQHNlY3Rpb24gQGNvZGV7LmVuZH0KLQotQGNpbmRleCBAY29kZXtlbmR9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZH0gbWFya3MgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkgZmlsZS4gIEBjb2Rle0B2YWx1ZXtBU319IGRvZXMgbm90Ci1wcm9jZXNzIGFueXRoaW5nIGluIHRoZSBmaWxlIHBhc3QgdGhlIEBjb2Rley5lbmR9IGRpcmVjdGl2ZS4KLQotQGlmc2V0IENPRkYKLUBub2RlIEVuZGVmCi1Ac2VjdGlvbiBAY29kZXsuZW5kZWZ9Ci0KLUBjaW5kZXggQGNvZGV7ZW5kZWZ9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgZmxhZ3MgdGhlIGVuZCBvZiBhIHN5bWJvbCBkZWZpbml0aW9uIGJlZ3VuIHdpdGgKLUBjb2Rley5kZWZ9LgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LmVuZGVmfSBpcyBvbmx5IG1lYW5pbmdmdWwgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgaWYKLUBjb2Rle0B2YWx1ZXtBU319IGlzIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMKLWRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgRW5kZnVuYwotQHNlY3Rpb24gQGNvZGV7LmVuZGZ1bmN9Ci1AY2luZGV4IEBjb2Rle2VuZGZ1bmN9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZGZ1bmN9IG1hcmtzIHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBzcGVjaWZpZWQgd2l0aCBAY29kZXsuZnVuY30uCi0KLUBub2RlIEVuZGlmCi1Ac2VjdGlvbiBAY29kZXsuZW5kaWZ9Ci0KLUBjaW5kZXggQGNvZGV7ZW5kaWZ9IGRpcmVjdGl2ZQotQGNvZGV7LmVuZGlmfSBpcyBwYXJ0IG9mIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IGZvciBjb25kaXRpb25hbCBhc3NlbWJseTsKLWl0IG1hcmtzIHRoZSBlbmQgb2YgYSBibG9jayBvZiBjb2RlIHRoYXQgaXMgb25seSBhc3NlbWJsZWQKLWNvbmRpdGlvbmFsbHkuICBAeHJlZntJZiwsQGNvZGV7LmlmfX0uCi0KLUBub2RlIEVxdQotQHNlY3Rpb24gQGNvZGV7LmVxdSBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7ZXF1fSBkaXJlY3RpdmUKLUBjaW5kZXggYXNzaWduaW5nIHZhbHVlcyB0byBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGFzc2lnbmluZyB2YWx1ZXMgdG8KLVRoaXMgZGlyZWN0aXZlIHNldHMgdGhlIHZhbHVlIG9mIEB2YXJ7c3ltYm9sfSB0byBAdmFye2V4cHJlc3Npb259LgotSXQgaXMgc3lub255bW91cyB3aXRoIEBzYW1wey5zZXR9OyBAcHhyZWZ7U2V0LCxAY29kZXsuc2V0fX0uCi0KLUBpZnNldCBIUFBBCi1UaGUgc3ludGF4IGZvciBAY29kZXtlcXV9IG9uIHRoZSBIUFBBIGlzIAotQHNhbXB7QHZhcntzeW1ib2x9IC5lcXUgQHZhcntleHByZXNzaW9ufX0uCi1AZW5kIGlmc2V0Ci0KLUBub2RlIEVxdWl2Ci1Ac2VjdGlvbiBAY29kZXsuZXF1aXYgQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotQGNpbmRleCBAY29kZXtlcXVpdn0gZGlyZWN0aXZlCi1UaGUgQGNvZGV7LmVxdWl2fSBkaXJlY3RpdmUgaXMgbGlrZSBAY29kZXsuZXF1fSBhbmQgQGNvZGV7LnNldH0sIGV4Y2VwdCB0aGF0Ci10aGUgYXNzZW1ibGVyIHdpbGwgc2lnbmFsIGFuIGVycm9yIGlmIEB2YXJ7c3ltYm9sfSBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLUV4Y2VwdCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBlcnJvciBtZXNzYWdlLCB0aGlzIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byAKLUBzbWFsbGV4YW1wbGUKLS5pZmRlZiBTWU0KLS5lcnIKLS5lbmRpZgotLmVxdSBTWU0sVkFMCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBFcnIKLUBzZWN0aW9uIEBjb2Rley5lcnJ9Ci1AY2luZGV4IEBjb2Rle2Vycn0gZGlyZWN0aXZlCi1JZiBAY29kZXtAdmFsdWV7QVN9fSBhc3NlbWJsZXMgYSBAY29kZXsuZXJyfSBkaXJlY3RpdmUsIGl0IHdpbGwgcHJpbnQgYW4gZXJyb3IKLW1lc3NhZ2UgYW5kLCB1bmxlc3MgdGhlIEBjb2Rley1afSBvcHRpb24gd2FzIHVzZWQsIGl0IHdpbGwgbm90IGdlbmVyYXRlIGFuCi1vYmplY3QgZmlsZS4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2lnbmFsIGVycm9yIGFuIGNvbmRpdGlvbmFsbHkgY29tcGlsZWQgY29kZS4KLQotQG5vZGUgRXhpdG0KLUBzZWN0aW9uIEBjb2Rley5leGl0bX0KLUV4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLiAgQHhyZWZ7TWFjcm99LgotCi1Abm9kZSBFeHRlcm4KLUBzZWN0aW9uIEBjb2Rley5leHRlcm59Ci0KLUBjaW5kZXggQGNvZGV7ZXh0ZXJufSBkaXJlY3RpdmUKLUBjb2Rley5leHRlcm59IGlzIGFjY2VwdGVkIGluIHRoZSBzb3VyY2UgcHJvZ3JhbS0tLWZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGFzc2VtYmxlcnMtLS1idXQgaXQgaXMgaWdub3JlZC4gIEBjb2Rle0B2YWx1ZXtBU319IHRyZWF0cwotYWxsIHVuZGVmaW5lZCBzeW1ib2xzIGFzIGV4dGVybmFsLgotCi1Abm9kZSBGYWlsCi1Ac2VjdGlvbiBAY29kZXsuZmFpbCBAdmFye2V4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle2ZhaWx9IGRpcmVjdGl2ZQotR2VuZXJhdGVzIGFuIGVycm9yIG9yIGEgd2FybmluZy4gIElmIHRoZSB2YWx1ZSBvZiB0aGUgQHZhcntleHByZXNzaW9ufSBpcyA1MDAKLW9yIG1vcmUsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UuICBJZiB0aGUgdmFsdWUgaXMgbGVzcwotdGhhbiA1MDAsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZS4gIFRoZSBtZXNzYWdlIHdpbGwKLWluY2x1ZGUgdGhlIHZhbHVlIG9mIEB2YXJ7ZXhwcmVzc2lvbn0uICBUaGlzIGNhbiBvY2Nhc2lvbmFsbHkgYmUgdXNlZnVsIGluc2lkZQotY29tcGxleCBuZXN0ZWQgbWFjcm9zIG9yIGNvbmRpdGlvbmFsIGFzc2VtYmx5LgotCi1AaWZjbGVhciBuby1maWxlLWRpcgotQG5vZGUgRmlsZQotQHNlY3Rpb24gQGNvZGV7LmZpbGUgQHZhcntzdHJpbmd9fQotCi1AY2luZGV4IEBjb2Rle2ZpbGV9IGRpcmVjdGl2ZQotQGNpbmRleCBsb2dpY2FsIGZpbGUgbmFtZQotQGNpbmRleCBmaWxlIG5hbWUsIGxvZ2ljYWwKLUBjb2Rley5maWxlfSB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0aGF0IHdlIGFyZSBhYm91dCB0byBzdGFydCBhIG5ldyBsb2dpY2FsCi1maWxlLiAgQHZhcntzdHJpbmd9IGlzIHRoZSBuZXcgZmlsZSBuYW1lLiAgSW4gZ2VuZXJhbCwgdGhlIGZpbGVuYW1lIGlzCi1yZWNvZ25pemVkIHdoZXRoZXIgb3Igbm90IGl0IGlzIHN1cnJvdW5kZWQgYnkgcXVvdGVzIEBzYW1weyJ9OyBidXQgaWYgeW91IHdpc2gKLXRvIHNwZWNpZnkgYW4gZW1wdHkgZmlsZSBuYW1lLCB5b3UgbXVzdCBnaXZlIHRoZSBxdW90ZXMtLUBjb2RleyIifS4gIFRoaXMKLXN0YXRlbWVudCBtYXkgZ28gYXdheSBpbiBmdXR1cmU6IGl0IGlzIG9ubHkgcmVjb2duaXplZCB0byBiZSBjb21wYXRpYmxlIHdpdGgKLW9sZCBAY29kZXtAdmFsdWV7QVN9fSBwcm9ncmFtcy4KLUBpZnNldCBBMjlLCi1JbiBzb21lIGNvbmZpZ3VyYXRpb25zIG9mIEBjb2Rle0B2YWx1ZXtBU319LCBAY29kZXsuZmlsZX0gaGFzIGFscmVhZHkgYmVlbgotcmVtb3ZlZCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlciBhc3NlbWJsZXJzLiAgQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIEZpbGwKLUBzZWN0aW9uIEBjb2Rley5maWxsIEB2YXJ7cmVwZWF0fSAsIEB2YXJ7c2l6ZX0gLCBAdmFye3ZhbHVlfX0KLQotQGNpbmRleCBAY29kZXtmaWxsfSBkaXJlY3RpdmUKLUBjaW5kZXggd3JpdGluZyBwYXR0ZXJucyBpbiBtZW1vcnkKLUBjaW5kZXggcGF0dGVybnMsIHdyaXRpbmcgaW4gbWVtb3J5Ci1AdmFye3Jlc3VsdH0sIEB2YXJ7c2l6ZX0gYW5kIEB2YXJ7dmFsdWV9IGFyZSBhYnNvbHV0ZSBleHByZXNzaW9ucy4KLVRoaXMgZW1pdHMgQHZhcntyZXBlYXR9IGNvcGllcyBvZiBAdmFye3NpemV9IGJ5dGVzLiAgQHZhcntSZXBlYXR9Ci1tYXkgYmUgemVybyBvciBtb3JlLiAgQHZhcntTaXplfSBtYXkgYmUgemVybyBvciBtb3JlLCBidXQgaWYgaXQgaXMKLW1vcmUgdGhhbiA4LCB0aGVuIGl0IGlzIGRlZW1lZCB0byBoYXZlIHRoZSB2YWx1ZSA4LCBjb21wYXRpYmxlIHdpdGgKLW90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuICBUaGUgY29udGVudHMgb2YgZWFjaCBAdmFye3JlcGVhdH0gYnl0ZXMKLWlzIHRha2VuIGZyb20gYW4gOC1ieXRlIG51bWJlci4gIFRoZSBoaWdoZXN0IG9yZGVyIDQgYnl0ZXMgYXJlCi16ZXJvLiAgVGhlIGxvd2VzdCBvcmRlciA0IGJ5dGVzIGFyZSBAdmFye3ZhbHVlfSByZW5kZXJlZCBpbiB0aGUKLWJ5dGUtb3JkZXIgb2YgYW4gaW50ZWdlciBvbiB0aGUgY29tcHV0ZXIgQGNvZGV7QHZhbHVle0FTfX0gaXMgYXNzZW1ibGluZyBmb3IuCi1FYWNoIEB2YXJ7c2l6ZX0gYnl0ZXMgaW4gYSByZXBldGl0aW9uIGlzIHRha2VuIGZyb20gdGhlIGxvd2VzdCBvcmRlcgotQHZhcntzaXplfSBieXRlcyBvZiB0aGlzIG51bWJlci4gIEFnYWluLCB0aGlzIGJpemFycmUgYmVoYXZpb3IgaXMKLWNvbXBhdGlibGUgd2l0aCBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzLgotCi1AdmFye3NpemV9IGFuZCBAdmFye3ZhbHVlfSBhcmUgb3B0aW9uYWwuCi1JZiB0aGUgc2Vjb25kIGNvbW1hIGFuZCBAdmFye3ZhbHVlfSBhcmUgYWJzZW50LCBAdmFye3ZhbHVlfSBpcwotYXNzdW1lZCB6ZXJvLiAgSWYgdGhlIGZpcnN0IGNvbW1hIGFuZCBmb2xsb3dpbmcgdG9rZW5zIGFyZSBhYnNlbnQsCi1AdmFye3NpemV9IGlzIGFzc3VtZWQgdG8gYmUgMS4KLQotQG5vZGUgRmxvYXQKLUBzZWN0aW9uIEBjb2Rley5mbG9hdCBAdmFye2Zsb251bXN9fQotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgKHNpbmdsZSkKLUBjaW5kZXggQGNvZGV7ZmxvYXR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgYXNzZW1ibGVzIHplcm8gb3IgbW9yZSBmbG9udW1zLCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgSXQKLWhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQGNvZGV7LnNpbmdsZX0uCi1AaWZzZXQgR0VORVJJQwotVGhlIGV4YWN0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBlbWl0dGVkIGRlcGVuZHMgb24gaG93Ci1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkLgotQHhyZWZ7TWFjaGluZSBEZXBlbmRlbmNpZXN9LgotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IElFRUVGTE9BVAotT24gdGhlIEB2YWx1ZXtUQVJHRVR9IGZhbWlseSwgQGNvZGV7LmZsb2F0fSBlbWl0cyAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwotaW4gQHNje2llZWV9IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBGdW5jCi1Ac2VjdGlvbiBAY29kZXsuZnVuYyBAdmFye25hbWV9WyxAdmFye2xhYmVsfV19Ci1AY2luZGV4IEBjb2Rle2Z1bmN9IGRpcmVjdGl2ZQotQGNvZGV7LmZ1bmN9IGVtaXRzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0byBkZW5vdGUgZnVuY3Rpb24gQHZhcntuYW1lfSwgYW5kCi1pcyBpZ25vcmVkIHVubGVzcyB0aGUgZmlsZSBpcyBhc3NlbWJsZWQgd2l0aCBkZWJ1Z2dpbmcgZW5hYmxlZC4KLU9ubHkgQHNhbXB7LS1nc3RhYnN9IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuCi1AdmFye2xhYmVsfSBpcyB0aGUgZW50cnkgcG9pbnQgb2YgdGhlIGZ1bmN0aW9uIGFuZCBpZiBvbWl0dGVkIEB2YXJ7bmFtZX0KLXByZXBlbmRlZCB3aXRoIHRoZSBAc2FtcHtsZWFkaW5nIGNoYXJ9IGlzIHVzZWQuCi1Ac2FtcHtsZWFkaW5nIGNoYXJ9IGlzIHVzdWFsbHkgQGNvZGV7X30gb3Igbm90aGluZywgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCi1BbGwgZnVuY3Rpb25zIGFyZSBjdXJyZW50bHkgZGVmaW5lZCB0byBoYXZlIEBjb2Rle3ZvaWR9IHJldHVybiB0eXBlLgotVGhlIGZ1bmN0aW9uIG11c3QgYmUgdGVybWluYXRlZCB3aXRoIEBjb2Rley5lbmRmdW5jfS4KLQotQG5vZGUgR2xvYmFsCi1Ac2VjdGlvbiBAY29kZXsuZ2xvYmFsIEB2YXJ7c3ltYm9sfX0sIEBjb2Rley5nbG9ibCBAdmFye3N5bWJvbH19Ci0KLUBjaW5kZXggQGNvZGV7Z2xvYmFsfSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sLCBtYWtpbmcgdmlzaWJsZSB0byBsaW5rZXIKLUBjb2Rley5nbG9iYWx9IG1ha2VzIHRoZSBzeW1ib2wgdmlzaWJsZSB0byBAY29kZXtAdmFsdWV7TER9fS4gIElmIHlvdSBkZWZpbmUKLUB2YXJ7c3ltYm9sfSBpbiB5b3VyIHBhcnRpYWwgcHJvZ3JhbSwgaXRzIHZhbHVlIGlzIG1hZGUgYXZhaWxhYmxlIHRvCi1vdGhlciBwYXJ0aWFsIHByb2dyYW1zIHRoYXQgYXJlIGxpbmtlZCB3aXRoIGl0LiAgT3RoZXJ3aXNlLAotQHZhcntzeW1ib2x9IHRha2VzIGl0cyBhdHRyaWJ1dGVzIGZyb20gYSBzeW1ib2wgb2YgdGhlIHNhbWUgbmFtZQotZnJvbSBhbm90aGVyIGZpbGUgbGlua2VkIGludG8gdGhlIHNhbWUgcHJvZ3JhbS4KLQotQm90aCBzcGVsbGluZ3MgKEBzYW1wey5nbG9ibH0gYW5kIEBzYW1wey5nbG9iYWx9KSBhcmUgYWNjZXB0ZWQsIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGFzc2VtYmxlcnMuCi0KLUBpZnNldCBIUFBBCi1PbiB0aGUgSFBQQSwgQGNvZGV7Lmdsb2JhbH0gaXMgbm90IGFsd2F5cyBlbm91Z2ggdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIHRvIG90aGVyCi1wYXJ0aWFsIHByb2dyYW1zLiAgWW91IG1heSBuZWVkIHRoZSBIUFBBLW9ubHkgQGNvZGV7LkVYUE9SVH0gZGlyZWN0aXZlIGFzIHdlbGwuCi1AeHJlZntIUFBBIERpcmVjdGl2ZXMsLCBIUFBBIEFzc2VtYmxlciBEaXJlY3RpdmVzfS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgaHdvcmQKLUBzZWN0aW9uIEBjb2Rley5od29yZCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtod29yZH0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXJzLCAxNi1iaXQKLUBjaW5kZXggbnVtYmVycywgMTYtYml0Ci1AY2luZGV4IHNpeHRlZW4gYml0IGludGVnZXJzCi1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBhbmQgZW1pdHMKLWEgMTYgYml0IG51bWJlciBmb3IgZWFjaC4KLQotQGlmc2V0IEdFTkVSSUMKLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3lub255bSBmb3IgQHNhbXB7LnNob3J0fTsgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQKLWFyY2hpdGVjdHVyZSwgaXQgbWF5IGFsc28gYmUgYSBzeW5vbnltIGZvciBAc2FtcHsud29yZH0uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgVzMyCi1UaGlzIGRpcmVjdGl2ZSBpcyBhIHN5bm9ueW0gZm9yIEBzYW1wey5zaG9ydH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVzE2Ci1UaGlzIGRpcmVjdGl2ZSBpcyBhIHN5bm9ueW0gZm9yIGJvdGggQHNhbXB7LnNob3J0fSBhbmQgQHNhbXB7LndvcmR9LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBub2RlIElkZW50Ci1Ac2VjdGlvbiBAY29kZXsuaWRlbnR9Ci0KLUBjaW5kZXggQGNvZGV7aWRlbnR9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgaXMgdXNlZCBieSBzb21lIGFzc2VtYmxlcnMgdG8gcGxhY2UgdGFncyBpbiBvYmplY3QgZmlsZXMuCi1AY29kZXtAdmFsdWV7QVN9fSBzaW1wbHkgYWNjZXB0cyB0aGUgZGlyZWN0aXZlIGZvciBzb3VyY2UtZmlsZQotY29tcGF0aWJpbGl0eSB3aXRoIHN1Y2ggYXNzZW1ibGVycywgYnV0IGRvZXMgbm90IGFjdHVhbGx5IGVtaXQgYW55dGhpbmcKLWZvciBpdC4KLQotQG5vZGUgSWYKLUBzZWN0aW9uIEBjb2Rley5pZiBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259fQotCi1AY2luZGV4IGNvbmRpdGlvbmFsIGFzc2VtYmx5Ci1AY2luZGV4IEBjb2Rle2lmfSBkaXJlY3RpdmUKLUBjb2Rley5pZn0gbWFya3MgdGhlIGJlZ2lubmluZyBvZiBhIHNlY3Rpb24gb2YgY29kZSB3aGljaCBpcyBvbmx5Ci1jb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNvdXJjZSBwcm9ncmFtIGJlaW5nIGFzc2VtYmxlZCBpZiB0aGUgYXJndW1lbnQKLSh3aGljaCBtdXN0IGJlIGFuIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0pIGlzIG5vbi16ZXJvLiAgVGhlIGVuZCBvZgotdGhlIGNvbmRpdGlvbmFsIHNlY3Rpb24gb2YgY29kZSBtdXN0IGJlIG1hcmtlZCBieSBAY29kZXsuZW5kaWZ9Ci0oQHB4cmVme0VuZGlmLCxAY29kZXsuZW5kaWZ9fSk7IG9wdGlvbmFsbHksIHlvdSBtYXkgaW5jbHVkZSBjb2RlIGZvciB0aGUKLWFsdGVybmF0aXZlIGNvbmRpdGlvbiwgZmxhZ2dlZCBieSBAY29kZXsuZWxzZX0gKEBweHJlZntFbHNlLCxAY29kZXsuZWxzZX19KS4KLQotVGhlIGZvbGxvd2luZyB2YXJpYW50cyBvZiBAY29kZXsuaWZ9IGFyZSBhbHNvIHN1cHBvcnRlZDoKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtpZmRlZn0gZGlyZWN0aXZlCi1AaXRlbSAuaWZkZWYgQHZhcntzeW1ib2x9Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHNwZWNpZmllZCBAdmFye3N5bWJvbH0KLWhhcyBiZWVuIGRlZmluZWQuCi0KLUBjaW5kZXggQGNvZGV7aWZjfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmMgQHZhcntzdHJpbmcxfSxAdmFye3N0cmluZzJ9Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIHR3byBzdHJpbmdzIGFyZSB0aGUgc2FtZS4gIFRoZQotc3RyaW5ncyBtYXkgYmUgb3B0aW9uYWxseSBxdW90ZWQgd2l0aCBzaW5nbGUgcXVvdGVzLiAgSWYgdGhleSBhcmUgbm90IHF1b3RlZCwKLXRoZSBmaXJzdCBzdHJpbmcgc3RvcHMgYXQgdGhlIGZpcnN0IGNvbW1hLCBhbmQgdGhlIHNlY29uZCBzdHJpbmcgc3RvcHMgYXQgdGhlCi1lbmQgb2YgdGhlIGxpbmUuICBTdHJpbmdzIHdoaWNoIGNvbnRhaW4gd2hpdGVzcGFjZSBzaG91bGQgYmUgcXVvdGVkLiAgVGhlCi1zdHJpbmcgY29tcGFyaXNvbiBpcyBjYXNlIHNlbnNpdGl2ZS4KLQotQGNpbmRleCBAY29kZXtpZmVxfSBkaXJlY3RpdmUKLUBpdGVtIC5pZmVxIEB2YXJ7YWJzb2x1dGUgZXhwcmVzc2lvbn0KLUFzc2VtYmxlcyB0aGUgZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgYXJndW1lbnQgaXMgemVyby4KLQotQGNpbmRleCBAY29kZXtpZmVxc30gZGlyZWN0aXZlCi1AaXRlbSAuaWZlcXMgQHZhcntzdHJpbmcxfSxAdmFye3N0cmluZzJ9Ci1Bbm90aGVyIGZvcm0gb2YgQGNvZGV7LmlmY30uICBUaGUgc3RyaW5ncyBtdXN0IGJlIHF1b3RlZCB1c2luZyBkb3VibGUgcXVvdGVzLgotCi1AY2luZGV4IEBjb2Rle2lmZ2V9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmZ2UgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4gb3IKLWVxdWFsIHRvIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZndH0gZGlyZWN0aXZlCi1AaXRlbSAuaWZndCBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmbGV9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbGUgQHZhcnthYnNvbHV0ZSBleHByZXNzaW9ufQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBhcmd1bWVudCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwKLXRvIHplcm8uCi0KLUBjaW5kZXggQGNvZGV7aWZsdH0gZGlyZWN0aXZlCi1AaXRlbSAuaWZsdCBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB6ZXJvLgotCi1AY2luZGV4IEBjb2Rle2lmbmN9IGRpcmVjdGl2ZQotQGl0ZW0gLmlmbmMgQHZhcntzdHJpbmcxfSxAdmFye3N0cmluZzJ9LgotTGlrZSBAY29kZXsuaWZjfSwgYnV0IHRoZSBzZW5zZSBvZiB0aGUgdGVzdCBpcyByZXZlcnNlZDogdGhpcyBhc3NlbWJsZXMgdGhlCi1mb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSB0d28gc3RyaW5ncyBhcmUgbm90IHRoZSBzYW1lLgotCi1AY2luZGV4IEBjb2Rle2lmbmRlZn0gZGlyZWN0aXZlCi1AY2luZGV4IEBjb2Rle2lmbm90ZGVmfSBkaXJlY3RpdmUKLUBpdGVtIC5pZm5kZWYgQHZhcntzeW1ib2x9Ci1AaXRlbXggLmlmbm90ZGVmIEB2YXJ7c3ltYm9sfQotQXNzZW1ibGVzIHRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBjb2RlIGlmIHRoZSBzcGVjaWZpZWQgQHZhcntzeW1ib2x9Ci1oYXMgbm90IGJlZW4gZGVmaW5lZC4gIEJvdGggc3BlbGxpbmcgdmFyaWFudHMgYXJlIGVxdWl2YWxlbnQuCi0KLUBjaW5kZXggQGNvZGV7aWZuZX0gZGlyZWN0aXZlCi1AaXRlbSAuaWZuZSBAdmFye2Fic29sdXRlIGV4cHJlc3Npb259Ci1Bc3NlbWJsZXMgdGhlIGZvbGxvd2luZyBzZWN0aW9uIG9mIGNvZGUgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBlcXVhbCB0byB6ZXJvCi0oaW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBAY29kZXsuaWZ9KS4KLQotQGNpbmRleCBAY29kZXtpZm5lc30gZGlyZWN0aXZlCi1AaXRlbSAuaWZuZXMgQHZhcntzdHJpbmcxfSxAdmFye3N0cmluZzJ9Ci1MaWtlIEBjb2Rley5pZmVxc30sIGJ1dCB0aGUgc2Vuc2Ugb2YgdGhlIHRlc3QgaXMgcmV2ZXJzZWQ6IHRoaXMgYXNzZW1ibGVzIHRoZQotZm9sbG93aW5nIHNlY3Rpb24gb2YgY29kZSBpZiB0aGUgdHdvIHN0cmluZ3MgYXJlIG5vdCB0aGUgc2FtZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgSW5jbHVkZQotQHNlY3Rpb24gQGNvZGV7LmluY2x1ZGUgIkB2YXJ7ZmlsZX0ifQotCi1AY2luZGV4IEBjb2Rle2luY2x1ZGV9IGRpcmVjdGl2ZQotQGNpbmRleCBzdXBwb3J0aW5nIGZpbGVzLCBpbmNsdWRpbmcKLUBjaW5kZXggZmlsZXMsIGluY2x1ZGluZwotVGhpcyBkaXJlY3RpdmUgcHJvdmlkZXMgYSB3YXkgdG8gaW5jbHVkZSBzdXBwb3J0aW5nIGZpbGVzIGF0IHNwZWNpZmllZAotcG9pbnRzIGluIHlvdXIgc291cmNlIHByb2dyYW0uICBUaGUgY29kZSBmcm9tIEB2YXJ7ZmlsZX0gaXMgYXNzZW1ibGVkIGFzCi1pZiBpdCBmb2xsb3dlZCB0aGUgcG9pbnQgb2YgdGhlIEBjb2Rley5pbmNsdWRlfTsgd2hlbiB0aGUgZW5kIG9mIHRoZQotaW5jbHVkZWQgZmlsZSBpcyByZWFjaGVkLCBhc3NlbWJseSBvZiB0aGUgb3JpZ2luYWwgZmlsZSBjb250aW51ZXMuICBZb3UKLWNhbiBjb250cm9sIHRoZSBzZWFyY2ggcGF0aHMgdXNlZCB3aXRoIHRoZSBAc2FtcHstSX0gY29tbWFuZC1saW5lIG9wdGlvbgotKEBweHJlZntJbnZva2luZywsQ29tbWFuZC1MaW5lIE9wdGlvbnN9KS4gIFF1b3RhdGlvbiBtYXJrcyBhcmUgcmVxdWlyZWQKLWFyb3VuZCBAdmFye2ZpbGV9LgotCi1Abm9kZSBJbnQKLUBzZWN0aW9uIEBjb2Rley5pbnQgQHZhcntleHByZXNzaW9uc319Ci0KLUBjaW5kZXggQGNvZGV7aW50fSBkaXJlY3RpdmUKLUBjaW5kZXggaW50ZWdlcnMsIDMyLWJpdAotRXhwZWN0IHplcm8gb3IgbW9yZSBAdmFye2V4cHJlc3Npb25zfSwgb2YgYW55IHNlY3Rpb24sIHNlcGFyYXRlZCBieSBjb21tYXMuCi1Gb3IgZWFjaCBleHByZXNzaW9uLCBlbWl0IGEgbnVtYmVyIHRoYXQsIGF0IHJ1biB0aW1lLCBpcyB0aGUgdmFsdWUgb2YgdGhhdAotZXhwcmVzc2lvbi4gIFRoZSBieXRlIG9yZGVyIGFuZCBiaXQgc2l6ZSBvZiB0aGUgbnVtYmVyIGRlcGVuZHMgb24gd2hhdCBraW5kCi1vZiB0YXJnZXQgdGhlIGFzc2VtYmx5IGlzIGZvci4KLQotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEg4Ci1PbiB0aGUgSDgvNTAwIGFuZCBtb3N0IGZvcm1zIG9mIHRoZSBIOC8zMDAsIEBjb2Rley5pbnR9IGVtaXRzIDE2LWJpdAotaW50ZWdlcnMuICBPbiB0aGUgSDgvMzAwSCBhbmQgdGhlIEhpdGFjaGkgU0gsIGhvd2V2ZXIsIEBjb2Rley5pbnR9IGVtaXRzCi0zMi1iaXQgaW50ZWdlcnMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSXJwCi1Ac2VjdGlvbiBAY29kZXsuaXJwIEB2YXJ7c3ltYm9sfSxAdmFye3ZhbHVlc319QGRvdHN7fQotCi1AY2luZGV4IEBjb2Rle2lycH0gZGlyZWN0aXZlCi1FdmFsdWF0ZSBhIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgYXNzaWduaW5nIGRpZmZlcmVudCB2YWx1ZXMgdG8gQHZhcntzeW1ib2x9LgotVGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgc3RhcnRzIGF0IHRoZSBAY29kZXsuaXJwfSBkaXJlY3RpdmUsIGFuZCBpcwotdGVybWluYXRlZCBieSBhbiBAY29kZXsuZW5kcn0gZGlyZWN0aXZlLiAgRm9yIGVhY2ggQHZhcnt2YWx1ZX0sIEB2YXJ7c3ltYm9sfSBpcwotc2V0IHRvIEB2YXJ7dmFsdWV9LCBhbmQgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgaXMgYXNzZW1ibGVkLiAgSWYgbm8KLUB2YXJ7dmFsdWV9IGlzIGxpc3RlZCwgdGhlIHNlcXVlbmNlIG9mIHN0YXRlbWVudHMgaXMgYXNzZW1ibGVkIG9uY2UsIHdpdGgKLUB2YXJ7c3ltYm9sfSBzZXQgdG8gdGhlIG51bGwgc3RyaW5nLiAgVG8gcmVmZXIgdG8gQHZhcntzeW1ib2x9IHdpdGhpbiB0aGUKLXNlcXVlbmNlIG9mIHN0YXRlbWVudHMsIHVzZSBAdmFye1xzeW1ib2x9LgotCi1Gb3IgZXhhbXBsZSwgYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICAuaXJwICAgIHBhcmFtLDEsMiwzCi0gICAgICAgIG1vdmUgICAgZFxwYXJhbSxzcEBALQotICAgICAgICAuZW5kcgotQGVuZCBleGFtcGxlCi0KLWlzIGVxdWl2YWxlbnQgdG8gYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICBtb3ZlICAgIGQxLHNwQEAtCi0gICAgICAgIG1vdmUgICAgZDIsc3BAQC0KLSAgICAgICAgbW92ZSAgICBkMyxzcEBALQotQGVuZCBleGFtcGxlCi0KLUBub2RlIElycGMKLUBzZWN0aW9uIEBjb2Rley5pcnBjIEB2YXJ7c3ltYm9sfSxAdmFye3ZhbHVlc319QGRvdHN7fQotCi1AY2luZGV4IEBjb2Rle2lycGN9IGRpcmVjdGl2ZQotRXZhbHVhdGUgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIGFzc2lnbmluZyBkaWZmZXJlbnQgdmFsdWVzIHRvIEB2YXJ7c3ltYm9sfS4KLVRoZSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzIHN0YXJ0cyBhdCB0aGUgQGNvZGV7LmlycGN9IGRpcmVjdGl2ZSwgYW5kIGlzCi10ZXJtaW5hdGVkIGJ5IGFuIEBjb2Rley5lbmRyfSBkaXJlY3RpdmUuICBGb3IgZWFjaCBjaGFyYWN0ZXIgaW4gQHZhcnt2YWx1ZX0sCi1AdmFye3N5bWJvbH0gaXMgc2V0IHRvIHRoZSBjaGFyYWN0ZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcwotYXNzZW1ibGVkLiAgSWYgbm8gQHZhcnt2YWx1ZX0gaXMgbGlzdGVkLCB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cyBpcwotYXNzZW1ibGVkIG9uY2UsIHdpdGggQHZhcntzeW1ib2x9IHNldCB0byB0aGUgbnVsbCBzdHJpbmcuICBUbyByZWZlciB0bwotQHZhcntzeW1ib2x9IHdpdGhpbiB0aGUgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgdXNlIEB2YXJ7XHN5bWJvbH0uCi0KLUZvciBleGFtcGxlLCBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5pcnBjICAgIHBhcmFtLDEyMwotICAgICAgICBtb3ZlICAgIGRccGFyYW0sc3BAQC0KLSAgICAgICAgLmVuZHIKLUBlbmQgZXhhbXBsZQotCi1pcyBlcXVpdmFsZW50IHRvIGFzc2VtYmxpbmcKLQotQGV4YW1wbGUKLSAgICAgICAgbW92ZSAgICBkMSxzcEBALQotICAgICAgICBtb3ZlICAgIGQyLHNwQEAtCi0gICAgICAgIG1vdmUgICAgZDMsc3BAQC0KLUBlbmQgZXhhbXBsZQotCi1Abm9kZSBMY29tbQotQHNlY3Rpb24gQGNvZGV7Lmxjb21tIEB2YXJ7c3ltYm9sfSAsIEB2YXJ7bGVuZ3RofX0KLQotQGNpbmRleCBAY29kZXtsY29tbX0gZGlyZWN0aXZlCi1AY2luZGV4IGxvY2FsIGNvbW1vbiBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIGxvY2FsIGNvbW1vbgotUmVzZXJ2ZSBAdmFye2xlbmd0aH0gKGFuIGFic29sdXRlIGV4cHJlc3Npb24pIGJ5dGVzIGZvciBhIGxvY2FsIGNvbW1vbgotZGVub3RlZCBieSBAdmFye3N5bWJvbH0uICBUaGUgc2VjdGlvbiBhbmQgdmFsdWUgb2YgQHZhcntzeW1ib2x9IGFyZQotdGhvc2Ugb2YgdGhlIG5ldyBsb2NhbCBjb21tb24uICBUaGUgYWRkcmVzc2VzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlIGJzcwotc2VjdGlvbiwgc28gdGhhdCBhdCBydW4tdGltZSB0aGUgYnl0ZXMgc3RhcnQgb2ZmIHplcm9lZC4gIEB2YXJ7U3ltYm9sfQotaXMgbm90IGRlY2xhcmVkIGdsb2JhbCAoQHB4cmVme0dsb2JhbCwsQGNvZGV7Lmdsb2JhbH19KSwgc28gaXMgbm9ybWFsbHkKLW5vdCB2aXNpYmxlIHRvIEBjb2Rle0B2YWx1ZXtMRH19LgotCi1AaWZzZXQgR0VORVJJQwotU29tZSB0YXJnZXRzIHBlcm1pdCBhIHRoaXJkIGFyZ3VtZW50IHRvIGJlIHVzZWQgd2l0aCBAY29kZXsubGNvbW19LiAgVGhpcwotYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBkZXNpcmVkIGFsaWdubWVudCBvZiB0aGUgc3ltYm9sIGluIHRoZSBic3Mgc2VjdGlvbi4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhQUEEKLVRoZSBzeW50YXggZm9yIEBjb2Rley5sY29tbX0gZGlmZmVycyBzbGlnaHRseSBvbiB0aGUgSFBQQS4gIFRoZSBzeW50YXggaXMKLUBzYW1we0B2YXJ7c3ltYm9sfSAubGNvbW0sIEB2YXJ7bGVuZ3RofX07IEB2YXJ7c3ltYm9sfSBpcyBvcHRpb25hbC4KLUBlbmQgaWZzZXQKLQotQG5vZGUgTGZsYWdzCi1Ac2VjdGlvbiBAY29kZXsubGZsYWdzfQotCi1AY2luZGV4IEBjb2Rle2xmbGFnc30gZGlyZWN0aXZlIChpZ25vcmVkKQotQGNvZGV7QHZhbHVle0FTfX0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotYXNzZW1ibGVycywgYnV0IGlnbm9yZXMgaXQuCi0KLUBpZmNsZWFyIG5vLWxpbmUtZGlyCi1Abm9kZSBMaW5lCi1Ac2VjdGlvbiBAY29kZXsubGluZSBAdmFye2xpbmUtbnVtYmVyfX0KLQotQGNpbmRleCBAY29kZXtsaW5lfSBkaXJlY3RpdmUKLUBlbmQgaWZjbGVhcgotQGlmc2V0IG5vLWxpbmUtZGlyCi1Abm9kZSBMbgotQHNlY3Rpb24gQGNvZGV7LmxuIEB2YXJ7bGluZS1udW1iZXJ9fQotCi1AY2luZGV4IEBjb2Rle2xufSBkaXJlY3RpdmUKLUBlbmQgaWZzZXQKLUBjaW5kZXggbG9naWNhbCBsaW5lIG51bWJlcgotQGlmc2V0IGFvdXQtYm91dAotQ2hhbmdlIHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyLiAgQHZhcntsaW5lLW51bWJlcn0gbXVzdCBiZSBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi4gIFRoZSBuZXh0IGxpbmUgaGFzIHRoYXQgbG9naWNhbCBsaW5lIG51bWJlci4gIFRoZXJlZm9yZSBhbnkgb3RoZXIKLXN0YXRlbWVudHMgb24gdGhlIGN1cnJlbnQgbGluZSAoYWZ0ZXIgYSBzdGF0ZW1lbnQgc2VwYXJhdG9yIGNoYXJhY3RlcikgYXJlCi1yZXBvcnRlZCBhcyBvbiBsb2dpY2FsIGxpbmUgbnVtYmVyIEB2YXJ7bGluZS1udW1iZXJ9IEBtaW51c3t9IDEuICBPbmUgZGF5Ci1AY29kZXtAdmFsdWV7QVN9fSB3aWxsIG5vIGxvbmdlciBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlOiBpdCBpcyByZWNvZ25pemVkIG9ubHkKLWZvciBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgYXNzZW1ibGVyIHByb2dyYW1zLgotCi1AaWZzZXQgR0VORVJJQwotQGlmc2V0IEEyOUsKLUBlbXBoe1dhcm5pbmc6fSBJbiB0aGUgQU1EMjlLIGNvbmZpZ3VyYXRpb24gb2YgQHZhbHVle0FTfSwgdGhpcyBjb21tYW5kIGlzCi1ub3QgYXZhaWxhYmxlOyB1c2UgdGhlIHN5bm9ueW0gQGNvZGV7LmxufSBpbiB0aGF0IGNvbnRleHQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBpZmNsZWFyIG5vLWxpbmUtZGlyCi1FdmVuIHRob3VnaCB0aGlzIGlzIGEgZGlyZWN0aXZlIGFzc29jaWF0ZWQgd2l0aCB0aGUgQGNvZGV7YS5vdXR9IG9yCi1AY29kZXtiLm91dH0gb2JqZWN0LWNvZGUgZm9ybWF0cywgQGNvZGV7QHZhbHVle0FTfX0gc3RpbGwgcmVjb2duaXplcyBpdAotd2hlbiBwcm9kdWNpbmcgQ09GRiBvdXRwdXQsIGFuZCB0cmVhdHMgQHNhbXB7LmxpbmV9IGFzIHRob3VnaCBpdAotd2VyZSB0aGUgQ09GRiBAc2FtcHsubG59IEBlbXBoe2lmfSBpdCBpcyBmb3VuZCBvdXRzaWRlIGEKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpci4KLQotSW5zaWRlIGEgQGNvZGV7LmRlZn0sIEBzYW1wey5saW5lfSBpcywgaW5zdGVhZCwgb25lIG9mIHRoZSBkaXJlY3RpdmVzCi11c2VkIGJ5IGNvbXBpbGVycyB0byBnZW5lcmF0ZSBhdXhpbGlhcnkgc3ltYm9sIGluZm9ybWF0aW9uIGZvcgotZGVidWdnaW5nLgotQGVuZCBpZmNsZWFyCi0KLUBub2RlIExpbmtvbmNlCi1Ac2VjdGlvbiBAY29kZXsubGlua29uY2UgW0B2YXJ7dHlwZX1dfQotQGNpbmRleCBDT01EQVQKLUBjaW5kZXggQGNvZGV7bGlua29uY2V9IGRpcmVjdGl2ZQotQGNpbmRleCBjb21tb24gc2VjdGlvbnMKLU1hcmsgdGhlIGN1cnJlbnQgc2VjdGlvbiBzbyB0aGF0IHRoZSBsaW5rZXIgb25seSBpbmNsdWRlcyBhIHNpbmdsZSBjb3B5IG9mIGl0LgotVGhpcyBtYXkgYmUgdXNlZCB0byBpbmNsdWRlIHRoZSBzYW1lIHNlY3Rpb24gaW4gc2V2ZXJhbCBkaWZmZXJlbnQgb2JqZWN0IGZpbGVzLAotYnV0IGVuc3VyZSB0aGF0IHRoZSBsaW5rZXIgd2lsbCBvbmx5IGluY2x1ZGUgaXQgb25jZSBpbiB0aGUgZmluYWwgb3V0cHV0IGZpbGUuCi1UaGUgQGNvZGV7LmxpbmtvbmNlfSBwc2V1ZG8tb3AgbXVzdCBiZSB1c2VkIGZvciBlYWNoIGluc3RhbmNlIG9mIHRoZSBzZWN0aW9uLgotRHVwbGljYXRlIHNlY3Rpb25zIGFyZSBkZXRlY3RlZCBiYXNlZCBvbiB0aGUgc2VjdGlvbiBuYW1lLCBzbyBpdCBzaG91bGQgYmUKLXVuaXF1ZS4KLQotVGhpcyBkaXJlY3RpdmUgaXMgb25seSBzdXBwb3J0ZWQgYnkgYSBmZXcgb2JqZWN0IGZpbGUgZm9ybWF0czsgYXMgb2YgdGhpcwotd3JpdGluZywgdGhlIG9ubHkgb2JqZWN0IGZpbGUgZm9ybWF0IHdoaWNoIHN1cHBvcnRzIGl0IGlzIHRoZSBQb3J0YWJsZQotRXhlY3V0YWJsZSBmb3JtYXQgdXNlZCBvbiBXaW5kb3dzIE5ULgotCi1UaGUgQHZhcnt0eXBlfSBhcmd1bWVudCBpcyBvcHRpb25hbC4gIElmIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBvbmUgb2YgdGhlCi1mb2xsb3dpbmcgc3RyaW5ncy4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotLmxpbmtvbmNlIHNhbWVfc2l6ZQotQGVuZCBzbWFsbGV4YW1wbGUKLU5vdCBhbGwgdHlwZXMgbWF5IGJlIHN1cHBvcnRlZCBvbiBhbGwgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBkaXNjYXJkCi1TaWxlbnRseSBkaXNjYXJkIGR1cGxpY2F0ZSBzZWN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlZmF1bHQuCi0KLUBpdGVtIG9uZV9vbmx5Ci1XYXJuIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgc2VjdGlvbnMsIGJ1dCBzdGlsbCBrZWVwIG9ubHkgb25lIGNvcHkuCi0KLUBpdGVtIHNhbWVfc2l6ZQotV2FybiBpZiBhbnkgb2YgdGhlIGR1cGxpY2F0ZXMgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuCi0KLUBpdGVtIHNhbWVfY29udGVudHMKLVdhcm4gaWYgYW55IG9mIHRoZSBkdXBsaWNhdGVzIGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgY29udGVudHMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIExuCi1Ac2VjdGlvbiBAY29kZXsubG4gQHZhcntsaW5lLW51bWJlcn19Ci0KLUBjaW5kZXggQGNvZGV7bG59IGRpcmVjdGl2ZQotQGlmY2xlYXIgbm8tbGluZS1kaXIKLUBzYW1wey5sbn0gaXMgYSBzeW5vbnltIGZvciBAc2FtcHsubGluZX0uCi1AZW5kIGlmY2xlYXIKLUBpZnNldCBuby1saW5lLWRpcgotVGVsbCBAY29kZXtAdmFsdWV7QVN9fSB0byBjaGFuZ2UgdGhlIGxvZ2ljYWwgbGluZSBudW1iZXIuICBAdmFye2xpbmUtbnVtYmVyfQotbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgVGhlIG5leHQgbGluZSBoYXMgdGhhdCBsb2dpY2FsCi1saW5lIG51bWJlciwgc28gYW55IG90aGVyIHN0YXRlbWVudHMgb24gdGhlIGN1cnJlbnQgbGluZSAoYWZ0ZXIgYQotc3RhdGVtZW50IHNlcGFyYXRvciBjaGFyYWN0ZXIgQGNvZGV7O30pIGFyZSByZXBvcnRlZCBhcyBvbiBsb2dpY2FsCi1saW5lIG51bWJlciBAdmFye2xpbmUtbnVtYmVyfSBAbWludXN7fSAxLgotQGlmc2V0IEJPVVQKLQotVGhpcyBkaXJlY3RpdmUgaXMgYWNjZXB0ZWQsIGJ1dCBpZ25vcmVkLCB3aGVuIEBjb2Rle0B2YWx1ZXtBU319IGlzCi1jb25maWd1cmVkIGZvciBAY29kZXtiLm91dH07IGl0cyBlZmZlY3QgaXMgb25seSBhc3NvY2lhdGVkIHdpdGggQ09GRgotb3V0cHV0IGZvcm1hdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQG5vZGUgTVJJCi1Ac2VjdGlvbiBAY29kZXsubXJpIEB2YXJ7dmFsfX0KLQotQGNpbmRleCBAY29kZXttcml9IGRpcmVjdGl2ZQotQGNpbmRleCBNUkkgbW9kZSwgdGVtcG9yYXJpbHkKLUlmIEB2YXJ7dmFsfSBpcyBub24temVybywgdGhpcyB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byBlbnRlciBNUkkgbW9kZS4gIElmCi1AdmFye3ZhbH0gaXMgemVybywgdGhpcyB0ZWxscyBAY29kZXtAdmFsdWV7QVN9fSB0byBleGl0IE1SSSBtb2RlLiAgVGhpcyBjaGFuZ2UKLWFmZmVjdHMgY29kZSBhc3NlbWJsZWQgdW50aWwgdGhlIG5leHQgQGNvZGV7Lm1yaX0gZGlyZWN0aXZlLCBvciB1bnRpbCB0aGUgZW5kCi1vZiB0aGUgZmlsZS4gIEB4cmVme00sIE1SSSBtb2RlLCBNUkkgbW9kZX0uCi0KLUBub2RlIExpc3QKLUBzZWN0aW9uIEBjb2Rley5saXN0fQotCi1AY2luZGV4IEBjb2Rle2xpc3R9IGRpcmVjdGl2ZQotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2wsIHR1cm5pbmcgb24KLUNvbnRyb2wgKGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEBjb2Rley5ub2xpc3R9IGRpcmVjdGl2ZSkgd2hldGhlciBvcgotbm90IGFzc2VtYmx5IGxpc3RpbmdzIGFyZSBnZW5lcmF0ZWQuICBUaGVzZSB0d28gZGlyZWN0aXZlcyBtYWludGFpbiBhbgotaW50ZXJuYWwgY291bnRlciAod2hpY2ggaXMgemVybyBpbml0aWFsbHkpLiAgIEBjb2Rley5saXN0fSBpbmNyZW1lbnRzIHRoZQotY291bnRlciwgYW5kIEBjb2Rley5ub2xpc3R9IGRlY3JlbWVudHMgaXQuICBBc3NlbWJseSBsaXN0aW5ncyBhcmUKLWdlbmVyYXRlZCB3aGVuZXZlciB0aGUgY291bnRlciBpcyBncmVhdGVyIHRoYW4gemVyby4KLQotQnkgZGVmYXVsdCwgbGlzdGluZ3MgYXJlIGRpc2FibGVkLiAgV2hlbiB5b3UgZW5hYmxlIHRoZW0gKHdpdGggdGhlCi1Ac2FtcHstYX0gY29tbWFuZCBsaW5lIG9wdGlvbjsgQHB4cmVme0ludm9raW5nLCxDb21tYW5kLUxpbmUgT3B0aW9uc30pLAotdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGxpc3RpbmcgY291bnRlciBpcyBvbmUuCi0KLUBub2RlIExvbmcKLUBzZWN0aW9uIEBjb2Rley5sb25nIEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle2xvbmd9IGRpcmVjdGl2ZQotQGNvZGV7Lmxvbmd9IGlzIHRoZSBzYW1lIGFzIEBzYW1wey5pbnR9LCBAcHhyZWZ7SW50LCxAY29kZXsuaW50fX0uCi0KLUBpZ25vcmUKLUBjIG5vIG9uZSBzZWVtcyB0byBrbm93IHdoYXQgdGhpcyBpcyBmb3Igb3Igd2hldGhlciB0aGlzIGRlc2NyaXB0aW9uIGlzCi1AYyB3aGF0IGl0IHJlYWxseSBvdWdodCB0byBkbwotQG5vZGUgTHN5bQotQHNlY3Rpb24gQGNvZGV7LmxzeW0gQHZhcntzeW1ib2x9LCBAdmFye2V4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle2xzeW19IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wsIG5vdCByZWZlcmVuY2VkIGluIGFzc2VtYmx5Ci1AY29kZXsubHN5bX0gY3JlYXRlcyBhIG5ldyBzeW1ib2wgbmFtZWQgQHZhcntzeW1ib2x9LCBidXQgZG9lcyBub3QgcHV0IGl0IGluCi10aGUgaGFzaCB0YWJsZSwgZW5zdXJpbmcgaXQgY2Fubm90IGJlIHJlZmVyZW5jZWQgYnkgbmFtZSBkdXJpbmcgdGhlCi1yZXN0IG9mIHRoZSBhc3NlbWJseS4gIFRoaXMgc2V0cyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgc3ltYm9sIHRvIGJlCi10aGUgc2FtZSBhcyB0aGUgZXhwcmVzc2lvbiB2YWx1ZToKLUBzbWFsbGV4YW1wbGUKLUB2YXJ7b3RoZXJ9ID0gQHZhcntkZXNjcmlwdG9yfSA9IDAKLUB2YXJ7dHlwZX0gPSBAcnsoc2VjdGlvbiBvZiBAdmFye2V4cHJlc3Npb259KX0KLUB2YXJ7dmFsdWV9ID0gQHZhcntleHByZXNzaW9ufQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhlIG5ldyBzeW1ib2wgaXMgbm90IGZsYWdnZWQgYXMgZXh0ZXJuYWwuCi1AZW5kIGlnbm9yZQotCi1Abm9kZSBNYWNybwotQHNlY3Rpb24gQGNvZGV7Lm1hY3JvfQotCi1AY2luZGV4IG1hY3JvcwotVGhlIGNvbW1hbmRzIEBjb2Rley5tYWNyb30gYW5kIEBjb2Rley5lbmRtfSBhbGxvdyB5b3UgdG8gZGVmaW5lIG1hY3JvcyB0aGF0Ci1nZW5lcmF0ZSBhc3NlbWJseSBvdXRwdXQuICBGb3IgZXhhbXBsZSwgdGhpcyBkZWZpbml0aW9uIHNwZWNpZmllcyBhIG1hY3JvCi1AY29kZXtzdW19IHRoYXQgcHV0cyBhIHNlcXVlbmNlIG9mIG51bWJlcnMgaW50byBtZW1vcnk6Ci0KLUBleGFtcGxlCi0gICAgICAgIC5tYWNybyAgc3VtIGZyb209MCwgdG89NQotICAgICAgICAubG9uZyAgIFxmcm9tCi0gICAgICAgIC5pZiAgICAgXHRvLVxmcm9tCi0gICAgICAgIHN1bSAgICAgIihcZnJvbSsxKSIsXHRvCi0gICAgICAgIC5lbmRpZgotICAgICAgICAuZW5kbQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotV2l0aCB0aGF0IGRlZmluaXRpb24sIEBzYW1we1NVTSAwLDV9IGlzIGVxdWl2YWxlbnQgdG8gdGhpcyBhc3NlbWJseSBpbnB1dDoKLQotQGV4YW1wbGUKLSAgICAgICAgLmxvbmcgICAwCi0gICAgICAgIC5sb25nICAgMQotICAgICAgICAubG9uZyAgIDIKLSAgICAgICAgLmxvbmcgICAzCi0gICAgICAgIC5sb25nICAgNAotICAgICAgICAubG9uZyAgIDUKLUBlbmQgZXhhbXBsZQotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAubWFjcm8gQHZhcnttYWNuYW1lfQotQGl0ZW14IC5tYWNybyBAdmFye21hY25hbWV9IEB2YXJ7bWFjYXJnc30gQGRvdHN7fQotQGNpbmRleCBAY29kZXttYWNyb30gZGlyZWN0aXZlCi1CZWdpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAdmFye21hY25hbWV9LiAgSWYgeW91ciBtYWNybwotZGVmaW5pdGlvbiByZXF1aXJlcyBhcmd1bWVudHMsIHNwZWNpZnkgdGhlaXIgbmFtZXMgYWZ0ZXIgdGhlIG1hY3JvIG5hbWUsCi1zZXBhcmF0ZWQgYnkgY29tbWFzIG9yIHNwYWNlcy4gIFlvdSBjYW4gc3VwcGx5IGEgZGVmYXVsdCB2YWx1ZSBmb3IgYW55Ci1tYWNybyBhcmd1bWVudCBieSBmb2xsb3dpbmcgdGhlIG5hbWUgd2l0aCBAc2FtcHs9QHZhcntkZWZsdH19LiAgRm9yCi1leGFtcGxlLCB0aGVzZSBhcmUgYWxsIHZhbGlkIEBjb2Rley5tYWNyb30gc3RhdGVtZW50czoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAubWFjcm8gY29tbQotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7Y29tbX0sIHdoaWNoIHRha2VzIG5vCi1hcmd1bWVudHMuCi0KLUBpdGVtIC5tYWNybyBwbHVzMSBwLCBwMQotQGl0ZW14IC5tYWNybyBwbHVzMSBwIHAxCi1FaXRoZXIgc3RhdGVtZW50IGJlZ2lucyB0aGUgZGVmaW5pdGlvbiBvZiBhIG1hY3JvIGNhbGxlZCBAY29kZXtwbHVzMX0sCi13aGljaCB0YWtlcyB0d28gYXJndW1lbnRzOyB3aXRoaW4gdGhlIG1hY3JvIGRlZmluaXRpb24sIHdyaXRlCi1Ac2FtcHtccH0gb3IgQHNhbXB7XHAxfSB0byBldmFsdWF0ZSB0aGUgYXJndW1lbnRzLgotCi1AaXRlbSAubWFjcm8gcmVzZXJ2ZV9zdHIgcDE9MCBwMgotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7cmVzZXJ2ZV9zdHJ9LCB3aXRoIHR3bwotYXJndW1lbnRzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGhhcyBhIGRlZmF1bHQgdmFsdWUsIGJ1dCBub3QgdGhlIHNlY29uZC4KLUFmdGVyIHRoZSBkZWZpbml0aW9uIGlzIGNvbXBsZXRlLCB5b3UgY2FuIGNhbGwgdGhlIG1hY3JvIGVpdGhlciBhcwotQHNhbXB7cmVzZXJ2ZV9zdHIgQHZhcnthfSxAdmFye2J9fSAod2l0aCBAc2FtcHtccDF9IGV2YWx1YXRpbmcgdG8KLUB2YXJ7YX0gYW5kIEBzYW1we1xwMn0gZXZhbHVhdGluZyB0byBAdmFye2J9KSwgb3IgYXMgQHNhbXB7cmVzZXJ2ZV9zdHIKLSxAdmFye2J9fSAod2l0aCBAc2FtcHtccDF9IGV2YWx1YXRpbmcgYXMgdGhlIGRlZmF1bHQsIGluIHRoaXMgY2FzZQotQHNhbXB7MH0sIGFuZCBAc2FtcHtccDJ9IGV2YWx1YXRpbmcgdG8gQHZhcntifSkuCi1AZW5kIHRhYmxlCi0KLVdoZW4geW91IGNhbGwgYSBtYWNybywgeW91IGNhbiBzcGVjaWZ5IHRoZSBhcmd1bWVudCB2YWx1ZXMgZWl0aGVyIGJ5Ci1wb3NpdGlvbiwgb3IgYnkga2V5d29yZC4gIEZvciBleGFtcGxlLCBAc2FtcHtzdW0gOSwxN30gaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7c3VtIHRvPTE3LCBmcm9tPTl9LgotCi1AaXRlbSAuZW5kbQotQGNpbmRleCBAY29kZXtlbmRtfSBkaXJlY3RpdmUKLU1hcmsgdGhlIGVuZCBvZiBhIG1hY3JvIGRlZmluaXRpb24uCi0KLUBpdGVtIC5leGl0bQotQGNpbmRleCBAY29kZXtleGl0bX0gZGlyZWN0aXZlCi1FeGl0IGVhcmx5IGZyb20gdGhlIGN1cnJlbnQgbWFjcm8gZGVmaW5pdGlvbi4KLQotQGNpbmRleCBudW1iZXIgb2YgbWFjcm9zIGV4ZWN1dGVkCi1AY2luZGV4IG1hY3JvcywgY291bnQgZXhlY3V0ZWQKLUBpdGVtIFxAQAotQGNvZGV7QHZhbHVle0FTfX0gbWFpbnRhaW5zIGEgY291bnRlciBvZiBob3cgbWFueSBtYWNyb3MgaXQgaGFzCi1leGVjdXRlZCBpbiB0aGlzIHBzZXVkby12YXJpYWJsZTsgeW91IGNhbiBjb3B5IHRoYXQgbnVtYmVyIHRvIHlvdXIKLW91dHB1dCB3aXRoIEBzYW1we1xAQH0sIGJ1dCBAZW1waHtvbmx5IHdpdGhpbiBhIG1hY3JvIGRlZmluaXRpb259LgotCi1AaWdub3JlCi1AaXRlbSBMT0NBTCBAdmFye25hbWV9IFsgLCBAZG90c3t9IF0KLUBlbXBoe1dhcm5pbmc6IEBjb2Rle0xPQ0FMfSBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0IGBgYWx0ZXJuYXRlCi1tYWNybyBzeW50YXgnJyB3aXRoIEBzYW1wey1hfSBvciBAc2FtcHstLWFsdGVybmF0ZX0ufSAgQHhyZWZ7QWx0ZXJuYXRlLCwKLUFsdGVybmF0ZSBtYWNybyBzeW50YXh9LgotCi1HZW5lcmF0ZSBhIHN0cmluZyByZXBsYWNlbWVudCBmb3IgZWFjaCBvZiB0aGUgQHZhcntuYW1lfSBhcmd1bWVudHMsIGFuZAotcmVwbGFjZSBhbnkgaW5zdGFuY2VzIG9mIEB2YXJ7bmFtZX0gaW4gZWFjaCBtYWNybyBleHBhbnNpb24uICBUaGUKLXJlcGxhY2VtZW50IHN0cmluZyBpcyB1bmlxdWUgaW4gdGhlIGFzc2VtYmx5LCBhbmQgZGlmZmVyZW50IGZvciBlYWNoCi1zZXBhcmF0ZSBtYWNybyBleHBhbnNpb24uICBAY29kZXtMT0NBTH0gYWxsb3dzIHlvdSB0byB3cml0ZSBtYWNyb3MgdGhhdAotZGVmaW5lIHN5bWJvbHMsIHdpdGhvdXQgZmVhciBvZiBjb25mbGljdCBiZXR3ZWVuIHNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbnMuCi1AZW5kIGlnbm9yZQotQGVuZCBmdGFibGUKLQotQG5vZGUgTm9saXN0Ci1Ac2VjdGlvbiBAY29kZXsubm9saXN0fQotCi1AY2luZGV4IEBjb2Rle25vbGlzdH0gZGlyZWN0aXZlCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbCwgdHVybmluZyBvZmYKLUNvbnRyb2wgKGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEBjb2Rley5saXN0fSBkaXJlY3RpdmUpIHdoZXRoZXIgb3IKLW5vdCBhc3NlbWJseSBsaXN0aW5ncyBhcmUgZ2VuZXJhdGVkLiAgVGhlc2UgdHdvIGRpcmVjdGl2ZXMgbWFpbnRhaW4gYW4KLWludGVybmFsIGNvdW50ZXIgKHdoaWNoIGlzIHplcm8gaW5pdGlhbGx5KS4gICBAY29kZXsubGlzdH0gaW5jcmVtZW50cyB0aGUKLWNvdW50ZXIsIGFuZCBAY29kZXsubm9saXN0fSBkZWNyZW1lbnRzIGl0LiAgQXNzZW1ibHkgbGlzdGluZ3MgYXJlCi1nZW5lcmF0ZWQgd2hlbmV2ZXIgdGhlIGNvdW50ZXIgaXMgZ3JlYXRlciB0aGFuIHplcm8uCi0KLUBub2RlIE9jdGEKLUBzZWN0aW9uIEBjb2Rley5vY3RhIEB2YXJ7YmlnbnVtc319Ci0KLUBjIEZJWE1FOiBkb3VibGUgc2l6ZSBlbWl0dGVkIGZvciAib2N0YSIgb24gaTk2MCwgb3RoZXJzPyAgT3Igd2Fybj8KLUBjaW5kZXggQGNvZGV7b2N0YX0gZGlyZWN0aXZlCi1AY2luZGV4IGludGVnZXIsIDE2LWJ5dGUKLUBjaW5kZXggc2l4dGVlbiBieXRlIGludGVnZXIKLVRoaXMgZGlyZWN0aXZlIGV4cGVjdHMgemVybyBvciBtb3JlIGJpZ251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBGb3IgZWFjaAotYmlnbnVtLCBpdCBlbWl0cyBhIDE2LWJ5dGUgaW50ZWdlci4KLQotVGhlIHRlcm0gYGBvY3RhJycgY29tZXMgZnJvbSBjb250ZXh0cyBpbiB3aGljaCBhIGBgd29yZCcnIGlzIHR3byBieXRlczsKLWhlbmNlIEBlbXBoe29jdGF9LXdvcmQgZm9yIDE2IGJ5dGVzLgotCi1Abm9kZSBPcmcKLUBzZWN0aW9uIEBjb2Rley5vcmcgQHZhcntuZXctbGN9ICwgQHZhcntmaWxsfX0KLQotQGNpbmRleCBAY29kZXtvcmd9IGRpcmVjdGl2ZQotQGNpbmRleCBsb2NhdGlvbiBjb3VudGVyLCBhZHZhbmNpbmcKLUBjaW5kZXggYWR2YW5jaW5nIGxvY2F0aW9uIGNvdW50ZXIKLUBjaW5kZXggY3VycmVudCBhZGRyZXNzLCBhZHZhbmNpbmcKLUFkdmFuY2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbiB0bwotQHZhcntuZXctbGN9LiAgQHZhcntuZXctbGN9IGlzIGVpdGhlciBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIG9yIGFuCi1leHByZXNzaW9uIHdpdGggdGhlIHNhbWUgc2VjdGlvbiBhcyB0aGUgY3VycmVudCBzdWJzZWN0aW9uLiAgVGhhdCBpcywKLXlvdSBjYW4ndCB1c2UgQGNvZGV7Lm9yZ30gdG8gY3Jvc3Mgc2VjdGlvbnM6IGlmIEB2YXJ7bmV3LWxjfSBoYXMgdGhlCi13cm9uZyBzZWN0aW9uLCB0aGUgQGNvZGV7Lm9yZ30gZGlyZWN0aXZlIGlzIGlnbm9yZWQuICBUbyBiZSBjb21wYXRpYmxlCi13aXRoIGZvcm1lciBhc3NlbWJsZXJzLCBpZiB0aGUgc2VjdGlvbiBvZiBAdmFye25ldy1sY30gaXMgYWJzb2x1dGUsCi1AY29kZXtAdmFsdWV7QVN9fSBpc3N1ZXMgYSB3YXJuaW5nLCB0aGVuIHByZXRlbmRzIHRoZSBzZWN0aW9uIG9mIEB2YXJ7bmV3LWxjfQotaXMgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgc3Vic2VjdGlvbi4KLQotQGNvZGV7Lm9yZ30gbWF5IG9ubHkgaW5jcmVhc2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIsIG9yIGxlYXZlIGl0Ci11bmNoYW5nZWQ7IHlvdSBjYW5ub3QgdXNlIEBjb2Rley5vcmd9IHRvIG1vdmUgdGhlIGxvY2F0aW9uIGNvdW50ZXIKLWJhY2t3YXJkcy4KLQotQGMgZG91YmxlIG5lZ2F0aXZlIHVzZWQgYmVsb3cgIm5vdCB1bmRlZmluZWQiIGJlY2F1c2UgdGhpcyBpcyBhIHNwZWNpZmljCi1AYyByZWZlcmVuY2UgdG8gInVuZGVmaW5lZCIgKGFzIFNFR19VTktOT1dOIGlzIGNhbGxlZCBpbiB0aGlzIG1hbnVhbCkKLUBjIHNlY3Rpb24uIGRvY0BjeWdudXMuY29tIDE4ZmViOTEKLUJlY2F1c2UgQGNvZGV7QHZhbHVle0FTfX0gdHJpZXMgdG8gYXNzZW1ibGUgcHJvZ3JhbXMgaW4gb25lIHBhc3MsIEB2YXJ7bmV3LWxjfQotbWF5IG5vdCBiZSB1bmRlZmluZWQuICBJZiB5b3UgcmVhbGx5IGRldGVzdCB0aGlzIHJlc3RyaWN0aW9uIHdlIGVhZ2VybHkgYXdhaXQKLWEgY2hhbmNlIHRvIHNoYXJlIHlvdXIgaW1wcm92ZWQgYXNzZW1ibGVyLgotCi1CZXdhcmUgdGhhdCB0aGUgb3JpZ2luIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiwgbm90Ci10byB0aGUgc3RhcnQgb2YgdGhlIHN1YnNlY3Rpb24uICBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBvdGhlcgotcGVvcGxlJ3MgYXNzZW1ibGVycy4KLQotV2hlbiB0aGUgbG9jYXRpb24gY291bnRlciAob2YgdGhlIGN1cnJlbnQgc3Vic2VjdGlvbikgaXMgYWR2YW5jZWQsIHRoZQotaW50ZXJ2ZW5pbmcgYnl0ZXMgYXJlIGZpbGxlZCB3aXRoIEB2YXJ7ZmlsbH0gd2hpY2ggc2hvdWxkIGJlIGFuCi1hYnNvbHV0ZSBleHByZXNzaW9uLiAgSWYgdGhlIGNvbW1hIGFuZCBAdmFye2ZpbGx9IGFyZSBvbWl0dGVkLAotQHZhcntmaWxsfSBkZWZhdWx0cyB0byB6ZXJvLgotCi1Abm9kZSBQMmFsaWduCi1Ac2VjdGlvbiBAY29kZXsucDJhbGlnblt3bF0gQHZhcnthYnMtZXhwcn0sIEB2YXJ7YWJzLWV4cHJ9LCBAdmFye2Ficy1leHByfX0KLQotQGNpbmRleCBwYWRkaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGdpdmVuIGEgcG93ZXIgb2YgdHdvCi1AY2luZGV4IEBjb2Rle3AyYWxpZ259IGRpcmVjdGl2ZQotUGFkIHRoZSBsb2NhdGlvbiBjb3VudGVyIChpbiB0aGUgY3VycmVudCBzdWJzZWN0aW9uKSB0byBhIHBhcnRpY3VsYXIKLXN0b3JhZ2UgYm91bmRhcnkuICBUaGUgZmlyc3QgZXhwcmVzc2lvbiAod2hpY2ggbXVzdCBiZSBhYnNvbHV0ZSkgaXMgdGhlCi1udW1iZXIgb2YgbG93LW9yZGVyIHplcm8gYml0cyB0aGUgbG9jYXRpb24gY291bnRlciBtdXN0IGhhdmUgYWZ0ZXIKLWFkdmFuY2VtZW50LiAgRm9yIGV4YW1wbGUgQHNhbXB7LnAyYWxpZ24gM30gYWR2YW5jZXMgdGhlIGxvY2F0aW9uCi1jb3VudGVyIHVudGlsIGl0IGEgbXVsdGlwbGUgb2YgOC4gIElmIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlzIGFscmVhZHkgYQotbXVsdGlwbGUgb2YgOCwgbm8gY2hhbmdlIGlzIG5lZWRlZC4KLQotVGhlIHNlY29uZCBleHByZXNzaW9uIChhbHNvIGFic29sdXRlKSBnaXZlcyB0aGUgZmlsbCB2YWx1ZSB0byBiZSBzdG9yZWQgaW4gdGhlCi1wYWRkaW5nIGJ5dGVzLiAgSXQgKGFuZCB0aGUgY29tbWEpIG1heSBiZSBvbWl0dGVkLiAgSWYgaXQgaXMgb21pdHRlZCwgdGhlCi1wYWRkaW5nIGJ5dGVzIGFyZSBub3JtYWxseSB6ZXJvLiAgSG93ZXZlciwgb24gc29tZSBzeXN0ZW1zLCBpZiB0aGUgc2VjdGlvbiBpcwotbWFya2VkIGFzIGNvbnRhaW5pbmcgY29kZSBhbmQgdGhlIGZpbGwgdmFsdWUgaXMgb21pdHRlZCwgdGhlIHNwYWNlIGlzIGZpbGxlZAotd2l0aCBuby1vcCBpbnN0cnVjdGlvbnMuCi0KLVRoZSB0aGlyZCBleHByZXNzaW9uIGlzIGFsc28gYWJzb2x1dGUsIGFuZCBpcyBhbHNvIG9wdGlvbmFsLiAgSWYgaXQgaXMgcHJlc2VudCwKLWl0IGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoaXMgYWxpZ25tZW50Ci1kaXJlY3RpdmUuICBJZiBkb2luZyB0aGUgYWxpZ25tZW50IHdvdWxkIHJlcXVpcmUgc2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIHRoZQotc3BlY2lmaWVkIG1heGltdW0sIHRoZW4gdGhlIGFsaWdubWVudCBpcyBub3QgZG9uZSBhdCBhbGwuICBZb3UgY2FuIG9taXQgdGhlCi1maWxsIHZhbHVlICh0aGUgc2Vjb25kIGFyZ3VtZW50KSBlbnRpcmVseSBieSBzaW1wbHkgdXNpbmcgdHdvIGNvbW1hcyBhZnRlciB0aGUKLXJlcXVpcmVkIGFsaWdubWVudDsgdGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRoZSBhbGlnbm1lbnQgdG8gYmUgZmlsbGVkCi13aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVuIGFwcHJvcHJpYXRlLgotCi1AY2luZGV4IEBjb2Rle3AyYWxpZ253fSBkaXJlY3RpdmUKLUBjaW5kZXggQGNvZGV7cDJhbGlnbmx9IGRpcmVjdGl2ZQotVGhlIEBjb2Rley5wMmFsaWdud30gYW5kIEBjb2Rley5wMmFsaWdubH0gZGlyZWN0aXZlcyBhcmUgdmFyaWFudHMgb2YgdGhlCi1AY29kZXsucDJhbGlnbn0gZGlyZWN0aXZlLiAgVGhlIEBjb2Rley5wMmFsaWdud30gZGlyZWN0aXZlIHRyZWF0cyB0aGUgZmlsbAotcGF0dGVybiBhcyBhIHR3byBieXRlIHdvcmQgdmFsdWUuICBUaGUgQGNvZGV7LnAyYWxpZ25sfSBkaXJlY3RpdmVzIHRyZWF0cyB0aGUKLWZpbGwgcGF0dGVybiBhcyBhIGZvdXIgYnl0ZSBsb25nd29yZCB2YWx1ZS4gIEZvciBleGFtcGxlLCBAY29kZXsucDJhbGlnbncKLTIsMHgzNjhkfSB3aWxsIGFsaWduIHRvIGEgbXVsdGlwbGUgb2YgNC4gIElmIGl0IHNraXBzIHR3byBieXRlcywgdGhleSB3aWxsIGJlCi1maWxsZWQgaW4gd2l0aCB0aGUgdmFsdWUgMHgzNjhkICh0aGUgZXhhY3QgcGxhY2VtZW50IG9mIHRoZSBieXRlcyBkZXBlbmRzIHVwb24KLXRoZSBlbmRpYW5uZXNzIG9mIHRoZSBwcm9jZXNzb3IpLiAgSWYgaXQgc2tpcHMgMSBvciAzIGJ5dGVzLCB0aGUgZmlsbCB2YWx1ZSBpcwotdW5kZWZpbmVkLgotCi1Abm9kZSBQcmludAotQHNlY3Rpb24gQGNvZGV7LnByaW50IEB2YXJ7c3RyaW5nfX0KLQotQGNpbmRleCBAY29kZXtwcmludH0gZGlyZWN0aXZlCi1AY29kZXtAdmFsdWV7QVN9fSB3aWxsIHByaW50IEB2YXJ7c3RyaW5nfSBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGR1cmluZwotYXNzZW1ibHkuICBZb3UgbXVzdCBwdXQgQHZhcntzdHJpbmd9IGluIGRvdWJsZSBxdW90ZXMuCi0KLUBub2RlIFBzaXplCi1Ac2VjdGlvbiBAY29kZXsucHNpemUgQHZhcntsaW5lc30gLCBAdmFye2NvbHVtbnN9fQotCi1AY2luZGV4IEBjb2Rle3BzaXplfSBkaXJlY3RpdmUKLUBjaW5kZXggbGlzdGluZyBjb250cm9sOiBwYXBlciBzaXplCi1AY2luZGV4IHBhcGVyIHNpemUsIGZvciBsaXN0aW5ncwotVXNlIHRoaXMgZGlyZWN0aXZlIHRvIGRlY2xhcmUgdGhlIG51bWJlciBvZiBsaW5lcy0tLWFuZCwgb3B0aW9uYWxseSwgdGhlCi1udW1iZXIgb2YgY29sdW1ucy0tLXRvIHVzZSBmb3IgZWFjaCBwYWdlLCB3aGVuIGdlbmVyYXRpbmcgbGlzdGluZ3MuCi0KLUlmIHlvdSBkbyBub3QgdXNlIEBjb2Rley5wc2l6ZX0sIGxpc3RpbmdzIHVzZSBhIGRlZmF1bHQgbGluZS1jb3VudAotb2YgNjAuICBZb3UgbWF5IG9taXQgdGhlIGNvbW1hIGFuZCBAdmFye2NvbHVtbnN9IHNwZWNpZmljYXRpb247IHRoZQotZGVmYXVsdCB3aWR0aCBpcyAyMDAgY29sdW1ucy4KLQotQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIGZvcm1mZWVkcyB3aGVuZXZlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZgotbGluZXMgaXMgZXhjZWVkZWQgKG9yIHdoZW5ldmVyIHlvdSBleHBsaWNpdGx5IHJlcXVlc3Qgb25lLCB1c2luZwotQGNvZGV7LmVqZWN0fSkuCi0KLUlmIHlvdSBzcGVjaWZ5IEB2YXJ7bGluZXN9IGFzIEBjb2RlezB9LCBubyBmb3JtZmVlZHMgYXJlIGdlbmVyYXRlZCBzYXZlCi10aG9zZSBleHBsaWNpdGx5IHNwZWNpZmllZCB3aXRoIEBjb2Rley5lamVjdH0uCi0KLUBub2RlIFB1cmdlbQotQHNlY3Rpb24gQGNvZGV7LnB1cmdlbSBAdmFye25hbWV9fQotCi1AY2luZGV4IEBjb2Rle3B1cmdlbX0gZGlyZWN0aXZlCi1VbmRlZmluZSB0aGUgbWFjcm8gQHZhcntuYW1lfSwgc28gdGhhdCBsYXRlciB1c2VzIG9mIHRoZSBzdHJpbmcgd2lsbCBub3QgYmUKLWV4cGFuZGVkLiAgQHhyZWZ7TWFjcm99LgotCi1Abm9kZSBRdWFkCi1Ac2VjdGlvbiBAY29kZXsucXVhZCBAdmFye2JpZ251bXN9fQotCi1AY2luZGV4IEBjb2Rle3F1YWR9IGRpcmVjdGl2ZQotQGNvZGV7LnF1YWR9IGV4cGVjdHMgemVybyBvciBtb3JlIGJpZ251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBGb3IKLWVhY2ggYmlnbnVtLCBpdCBlbWl0cwotQGlmY2xlYXIgYmlnbnVtLTE2Ci1hbiA4LWJ5dGUgaW50ZWdlci4gIElmIHRoZSBiaWdudW0gd29uJ3QgZml0IGluIDggYnl0ZXMsIGl0IHByaW50cyBhCi13YXJuaW5nIG1lc3NhZ2U7IGFuZCBqdXN0IHRha2VzIHRoZSBsb3dlc3Qgb3JkZXIgOCBieXRlcyBvZiB0aGUgYmlnbnVtLgotQGNpbmRleCBlaWdodC1ieXRlIGludGVnZXIKLUBjaW5kZXggaW50ZWdlciwgOC1ieXRlCi0KLVRoZSB0ZXJtIGBgcXVhZCcnIGNvbWVzIGZyb20gY29udGV4dHMgaW4gd2hpY2ggYSBgYHdvcmQnJyBpcyB0d28gYnl0ZXM7Ci1oZW5jZSBAZW1waHtxdWFkfS13b3JkIGZvciA4IGJ5dGVzLgotQGVuZCBpZmNsZWFyCi1AaWZzZXQgYmlnbnVtLTE2Ci1hIDE2LWJ5dGUgaW50ZWdlci4gIElmIHRoZSBiaWdudW0gd29uJ3QgZml0IGluIDE2IGJ5dGVzLCBpdCBwcmludHMgYQotd2FybmluZyBtZXNzYWdlOyBhbmQganVzdCB0YWtlcyB0aGUgbG93ZXN0IG9yZGVyIDE2IGJ5dGVzIG9mIHRoZSBiaWdudW0uCi1AY2luZGV4IHNpeHRlZW4tYnl0ZSBpbnRlZ2VyCi1AY2luZGV4IGludGVnZXIsIDE2LWJ5dGUKLUBlbmQgaWZzZXQKLQotQG5vZGUgUmVwdAotQHNlY3Rpb24gQGNvZGV7LnJlcHQgQHZhcntjb3VudH19Ci0KLUBjaW5kZXggQGNvZGV7cmVwdH0gZGlyZWN0aXZlCi1SZXBlYXQgdGhlIHNlcXVlbmNlIG9mIGxpbmVzIGJldHdlZW4gdGhlIEBjb2Rley5yZXB0fSBkaXJlY3RpdmUgYW5kIHRoZSBuZXh0Ci1AY29kZXsuZW5kcn0gZGlyZWN0aXZlIEB2YXJ7Y291bnR9IHRpbWVzLgotCi1Gb3IgZXhhbXBsZSwgYXNzZW1ibGluZwotCi1AZXhhbXBsZQotICAgICAgICAucmVwdCAgIDMKLSAgICAgICAgLmxvbmcgICAwCi0gICAgICAgIC5lbmRyCi1AZW5kIGV4YW1wbGUKLQotaXMgZXF1aXZhbGVudCB0byBhc3NlbWJsaW5nCi0KLUBleGFtcGxlCi0gICAgICAgIC5sb25nICAgMAotICAgICAgICAubG9uZyAgIDAKLSAgICAgICAgLmxvbmcgICAwCi1AZW5kIGV4YW1wbGUKLQotQG5vZGUgU2J0dGwKLUBzZWN0aW9uIEBjb2Rley5zYnR0bCAiQHZhcntzdWJoZWFkaW5nfSJ9Ci0KLUBjaW5kZXggQGNvZGV7c2J0dGx9IGRpcmVjdGl2ZQotQGNpbmRleCBzdWJ0aXRsZXMgZm9yIGxpc3RpbmdzCi1AY2luZGV4IGxpc3RpbmcgY29udHJvbDogc3VidGl0bGUKLVVzZSBAdmFye3N1YmhlYWRpbmd9IGFzIHRoZSB0aXRsZSAodGhpcmQgbGluZSwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCi10aXRsZSBsaW5lKSB3aGVuIGdlbmVyYXRpbmcgYXNzZW1ibHkgbGlzdGluZ3MuCi0KLVRoaXMgZGlyZWN0aXZlIGFmZmVjdHMgc3Vic2VxdWVudCBwYWdlcywgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBwYWdlIGlmCi1pdCBhcHBlYXJzIHdpdGhpbiB0ZW4gbGluZXMgb2YgdGhlIHRvcCBvZiBhIHBhZ2UuCi0KLUBpZnNldCBDT0ZGCi1Abm9kZSBTY2wKLUBzZWN0aW9uIEBjb2Rley5zY2wgQHZhcntjbGFzc319Ci0KLUBjaW5kZXggQGNvZGV7c2NsfSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sIHN0b3JhZ2UgY2xhc3MgKENPRkYpCi1AY2luZGV4IENPRkYgc3ltYm9sIHN0b3JhZ2UgY2xhc3MKLVNldCB0aGUgc3RvcmFnZS1jbGFzcyB2YWx1ZSBmb3IgYSBzeW1ib2wuICBUaGlzIGRpcmVjdGl2ZSBtYXkgb25seSBiZQotdXNlZCBpbnNpZGUgYSBAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXIuICBTdG9yYWdlIGNsYXNzIG1heSBmbGFnCi13aGV0aGVyIGEgc3ltYm9sIGlzIHN0YXRpYyBvciBleHRlcm5hbCwgb3IgaXQgbWF5IHJlY29yZCBmdXJ0aGVyCi1zeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi1AaWZzZXQgQk9VVAotCi1UaGUgQHNhbXB7LnNjbH0gZGlyZWN0aXZlIGlzIHByaW1hcmlseSBhc3NvY2lhdGVkIHdpdGggQ09GRiBvdXRwdXQ7IHdoZW4KLWNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgQGNvZGV7Yi5vdXR9IG91dHB1dCBmb3JtYXQsIEBjb2Rle0B2YWx1ZXtBU319Ci1hY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBTZWN0aW9uCi1Ac2VjdGlvbiBAY29kZXsuc2VjdGlvbiBAdmFye25hbWV9fQotCi1AY2luZGV4IEBjb2Rle3NlY3Rpb259IGRpcmVjdGl2ZQotQGNpbmRleCBuYW1lZCBzZWN0aW9uCi1Vc2UgdGhlIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgdG8gYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBjb2RlIGludG8gYSBzZWN0aW9uCi1uYW1lZCBAdmFye25hbWV9LgotCi1UaGlzIGRpcmVjdGl2ZSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgdGFyZ2V0cyB0aGF0IGFjdHVhbGx5IHN1cHBvcnQgYXJiaXRyYXJpbHkKLW5hbWVkIHNlY3Rpb25zOyBvbiBAY29kZXthLm91dH0gdGFyZ2V0cywgZm9yIGV4YW1wbGUsIGl0IGlzIG5vdCBhY2NlcHRlZCwgZXZlbgotd2l0aCBhIHN0YW5kYXJkIEBjb2Rle2Eub3V0fSBzZWN0aW9uIG5hbWUuCi0KLUBpZnNldCBDT0ZGCi1Gb3IgQ09GRiB0YXJnZXRzLCB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBpcyB1c2VkIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nCi13YXlzOgotQHNtYWxsZXhhbXBsZQotLnNlY3Rpb24gQHZhcntuYW1lfVssICJAdmFye2ZsYWdzfSJdCi0uc2VjdGlvbiBAdmFye25hbWV9WywgQHZhcntzdWJzZWdtZW50fV0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBpcyBxdW90ZWQsIGl0IGlzIHRha2VuIGFzIGZsYWdzIHRvIHVzZSBmb3IgdGhlCi1zZWN0aW9uLiAgRWFjaCBmbGFnIGlzIGEgc2luZ2xlIGNoYXJhY3Rlci4gIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHJlY29nbml6ZWQ6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIGIKLWJzcyBzZWN0aW9uICh1bmluaXRpYWxpemVkIGRhdGEpCi1AaXRlbSBuCi1zZWN0aW9uIGlzIG5vdCBsb2FkZWQKLUBpdGVtIHcKLXdyaXRhYmxlIHNlY3Rpb24KLUBpdGVtIGQKLWRhdGEgc2VjdGlvbgotQGl0ZW0gcgotcmVhZC1vbmx5IHNlY3Rpb24KLUBpdGVtIHgKLWV4ZWN1dGFibGUgc2VjdGlvbgotQGVuZCB0YWJsZQotCi1JZiBubyBmbGFncyBhcmUgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBmbGFncyBkZXBlbmQgdXBvbiB0aGUgc2VjdGlvbiBuYW1lLiAgSWYKLXRoZSBzZWN0aW9uIG5hbWUgaXMgbm90IHJlY29nbml6ZWQsIHRoZSBkZWZhdWx0IHdpbGwgYmUgZm9yIHRoZSBzZWN0aW9uIHRvIGJlCi1sb2FkZWQgYW5kIHdyaXRhYmxlLgotCi1JZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgdG8gdGhlIEBjb2Rley5zZWN0aW9ufSBkaXJlY3RpdmUgaXMgbm90IHF1b3RlZCwgaXQgaXMKLXRha2VuIGFzIGEgc3Vic2VnbWVudCBudW1iZXIgKEBweHJlZntTdWItU2VjdGlvbnN9KS4KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEVMRgotRm9yIEVMRiB0YXJnZXRzLCB0aGUgQGNvZGV7LnNlY3Rpb259IGRpcmVjdGl2ZSBpcyB1c2VkIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLS5zZWN0aW9uIEB2YXJ7bmFtZX1bLCAiQHZhcntmbGFnc30iWywgQEBAdmFye3R5cGV9XV0KLUBlbmQgc21hbGxleGFtcGxlCi1UaGUgb3B0aW9uYWwgQHZhcntmbGFnc30gYXJndW1lbnQgaXMgYSBxdW90ZWQgc3RyaW5nIHdoaWNoIG1heSBjb250YWluIGFueQotY29tYmludGlvbiBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIGEKLXNlY3Rpb24gaXMgYWxsb2NhdGFibGUKLUBpdGVtIHcKLXNlY3Rpb24gaXMgd3JpdGFibGUKLUBpdGVtIHgKLXNlY3Rpb24gaXMgZXhlY3V0YWJsZQotQGVuZCB0YWJsZQotCi1UaGUgb3B0aW9uYWwgQHZhcnt0eXBlfSBhcmd1bWVudCBtYXkgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIEBAcHJvZ2JpdHMKLXNlY3Rpb24gY29udGFpbnMgZGF0YQotQGl0ZW0gQEBub2JpdHMKLXNlY3Rpb24gZG9lcyBub3QgY29udGFpbiBkYXRhIChpLmUuLCBzZWN0aW9uIG9ubHkgb2NjdXBpZXMgc3BhY2UpCi1AZW5kIHRhYmxlCi0KLUlmIG5vIGZsYWdzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGZsYWdzIGRlcGVuZCB1cG9uIHRoZSBzZWN0aW9uIG5hbWUuICBJZgotdGhlIHNlY3Rpb24gbmFtZSBpcyBub3QgcmVjb2duaXplZCwgdGhlIGRlZmF1bHQgd2lsbCBiZSBmb3IgdGhlIHNlY3Rpb24gdG8gaGF2ZQotbm9uZSBvZiB0aGUgYWJvdmUgZmxhZ3M6IGl0IHdpbGwgbm90IGJlIGFsbG9jYXRlZCBpbiBtZW1vcnksIG5vciB3cml0YWJsZSwgbm9yCi1leGVjdXRhYmxlLiAgVGhlIHNlY3Rpb24gd2lsbCBjb250YWluIGRhdGEuCi0KLUZvciBFTEYgdGFyZ2V0cywgdGhlIGFzc2VtYmxlciBzdXBwb3J0cyBhbm90aGVyIHR5cGUgb2YgQGNvZGV7LnNlY3Rpb259Ci1kaXJlY3RpdmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyBhc3NlbWJsZXI6Ci1Ac21hbGxleGFtcGxlCi0uc2VjdGlvbiAiQHZhcntuYW1lfSJbLCBAdmFye2ZsYWdzfS4uLl0KLUBlbmQgc21hbGxleGFtcGxlCi1Ob3RlIHRoYXQgdGhlIHNlY3Rpb24gbmFtZSBpcyBxdW90ZWQuICBUaGVyZSBtYXkgYmUgYSBzZXF1ZW5jZSBvZiBjb21tYQotc2VwYXJhdGVkIGZsYWdzOgotQHRhYmxlIEBjb2RlCi1AaXRlbSAjYWxsb2MKLXNlY3Rpb24gaXMgYWxsb2NhdGFibGUKLUBpdGVtICN3cml0ZQotc2VjdGlvbiBpcyB3cml0YWJsZQotQGl0ZW0gI2V4ZWNpbnN0cgotc2VjdGlvbiBpcyBleGVjdXRhYmxlCi1AZW5kIHRhYmxlCi1AZW5kIGlmc2V0Ci0KLUBub2RlIFNldAotQHNlY3Rpb24gQGNvZGV7LnNldCBAdmFye3N5bWJvbH0sIEB2YXJ7ZXhwcmVzc2lvbn19Ci0KLUBjaW5kZXggQGNvZGV7c2V0fSBkaXJlY3RpdmUKLUBjaW5kZXggc3ltYm9sIHZhbHVlLCBzZXR0aW5nCi1TZXQgdGhlIHZhbHVlIG9mIEB2YXJ7c3ltYm9sfSB0byBAdmFye2V4cHJlc3Npb259LiAgVGhpcwotY2hhbmdlcyBAdmFye3N5bWJvbH0ncyB2YWx1ZSBhbmQgdHlwZSB0byBjb25mb3JtIHRvCi1AdmFye2V4cHJlc3Npb259LiAgSWYgQHZhcntzeW1ib2x9IHdhcyBmbGFnZ2VkIGFzIGV4dGVybmFsLCBpdCByZW1haW5zCi1mbGFnZ2VkIChAcHhyZWZ7U3ltYm9sIEF0dHJpYnV0ZXN9KS4KLQotWW91IG1heSBAY29kZXsuc2V0fSBhIHN5bWJvbCBtYW55IHRpbWVzIGluIHRoZSBzYW1lIGFzc2VtYmx5LgotCi1JZiB5b3UgQGNvZGV7LnNldH0gYSBnbG9iYWwgc3ltYm9sLCB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBvYmplY3QKLWZpbGUgaXMgdGhlIGxhc3QgdmFsdWUgc3RvcmVkIGludG8gaXQuCi0KLUBpZnNldCBIUFBBCi1UaGUgc3ludGF4IGZvciBAY29kZXtzZXR9IG9uIHRoZSBIUFBBIGlzCi1Ac2FtcHtAdmFye3N5bWJvbH0gLnNldCBAdmFye2V4cHJlc3Npb259fS4KLUBlbmQgaWZzZXQKLQotQG5vZGUgU2hvcnQKLUBzZWN0aW9uIEBjb2Rley5zaG9ydCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXtzaG9ydH0gZGlyZWN0aXZlCi1AaWZzZXQgR0VORVJJQwotQGNvZGV7LnNob3J0fSBpcyBub3JtYWxseSB0aGUgc2FtZSBhcyBAc2FtcHsud29yZH0uCi1AeHJlZntXb3JkLCxAY29kZXsud29yZH19LgotCi1JbiBzb21lIGNvbmZpZ3VyYXRpb25zLCBob3dldmVyLCBAY29kZXsuc2hvcnR9IGFuZCBAY29kZXsud29yZH0gZ2VuZXJhdGUKLW51bWJlcnMgb2YgZGlmZmVyZW50IGxlbmd0aHM7IEBweHJlZntNYWNoaW5lIERlcGVuZGVuY2llc30uCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgVzE2Ci1AY29kZXsuc2hvcnR9IGlzIHRoZSBzYW1lIGFzIEBzYW1wey53b3JkfS4gIEB4cmVme1dvcmQsLEBjb2Rley53b3JkfX0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVzMyCi1UaGlzIGV4cGVjdHMgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBhbmQgZW1pdHMKLWEgMTYgYml0IG51bWJlciBmb3IgZWFjaC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBTaW5nbGUKLUBzZWN0aW9uIEBjb2Rley5zaW5nbGUgQHZhcntmbG9udW1zfX0KLQotQGNpbmRleCBAY29kZXtzaW5nbGV9IGRpcmVjdGl2ZQotQGNpbmRleCBmbG9hdGluZyBwb2ludCBudW1iZXJzIChzaW5nbGUpCi1UaGlzIGRpcmVjdGl2ZSBhc3NlbWJsZXMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXMuICBJdAotaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBAY29kZXsuZmxvYXR9LgotQGlmc2V0IEdFTkVSSUMKLVRoZSBleGFjdCBraW5kIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgZW1pdHRlZCBkZXBlbmRzIG9uIGhvdwotQGNvZGV7QHZhbHVle0FTfX0gaXMgY29uZmlndXJlZC4gIEB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBpZnNldCBJRUVFRkxPQVQKLU9uIHRoZSBAdmFsdWV7VEFSR0VUfSBmYW1pbHksIEBjb2Rley5zaW5nbGV9IGVtaXRzIDMyLWJpdCBmbG9hdGluZyBwb2ludAotbnVtYmVycyBpbiBAc2N7aWVlZX0gZm9ybWF0LgotQGVuZCBpZnNldAotQGVuZCBpZmNsZWFyCi0KLUBpZnNldCBDT0ZGCi1Abm9kZSBTaXplCi1Ac2VjdGlvbiBAY29kZXsuc2l6ZX0KLQotQGNpbmRleCBAY29kZXtzaXplfSBkaXJlY3RpdmUKLVRoaXMgZGlyZWN0aXZlIGlzIGdlbmVyYXRlZCBieSBjb21waWxlcnMgdG8gaW5jbHVkZSBhdXhpbGlhcnkgZGVidWdnaW5nCi1pbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgSXQgaXMgb25seSBwZXJtaXR0ZWQgaW5zaWRlCi1AY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LnNpemV9IGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGdlbmVyYXRpbmcgQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBnZW5lcmF0aW5nIEBjb2Rle2Iub3V0fSwgaXQgYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSBidXQKLWlnbm9yZXMgaXQuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBub2RlIFNsZWIxMjgKLUBzZWN0aW9uIEBjb2Rley5zbGViMTI4IEB2YXJ7ZXhwcmVzc2lvbnN9fQotCi1AY2luZGV4IEBjb2Rle3NsZWIxMjh9IGRpcmVjdGl2ZQotQHZhcntzbGViMTI4fSBzdGFuZHMgZm9yIGBgc2lnbmVkIGxpdHRsZSBlbmRpYW4gYmFzZSAxMjguJycgIFRoaXMgaXMgYSAKLWNvbXBhY3QsIHZhcmlhYmxlIGxlbmd0aCByZXByZXNlbnRhdGlvbiBvZiBudW1iZXJzIHVzZWQgYnkgdGhlIERXQVJGCi1zeW1ib2xpYyBkZWJ1Z2dpbmcgZm9ybWF0LiAgQHhyZWZ7VWxlYjEyOCxAY29kZXsudWxlYjEyOH19LgotCi1AaWZjbGVhciBuby1zcGFjZS1kaXIKLUBub2RlIFNraXAKLUBzZWN0aW9uIEBjb2Rley5za2lwIEB2YXJ7c2l6ZX0gLCBAdmFye2ZpbGx9fQotCi1AY2luZGV4IEBjb2Rle3NraXB9IGRpcmVjdGl2ZQotQGNpbmRleCBmaWxsaW5nIG1lbW9yeQotVGhpcyBkaXJlY3RpdmUgZW1pdHMgQHZhcntzaXplfSBieXRlcywgZWFjaCBvZiB2YWx1ZSBAdmFye2ZpbGx9LiAgQm90aAotQHZhcntzaXplfSBhbmQgQHZhcntmaWxsfSBhcmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuICBJZiB0aGUgY29tbWEgYW5kCi1AdmFye2ZpbGx9IGFyZSBvbWl0dGVkLCBAdmFye2ZpbGx9IGlzIGFzc3VtZWQgdG8gYmUgemVyby4gIFRoaXMgaXMgdGhlIHNhbWUgYXMKLUBzYW1wey5zcGFjZX0uCi0KLUBub2RlIFNwYWNlCi1Ac2VjdGlvbiBAY29kZXsuc3BhY2UgQHZhcntzaXplfSAsIEB2YXJ7ZmlsbH19Ci0KLUBjaW5kZXggQGNvZGV7c3BhY2V9IGRpcmVjdGl2ZQotQGNpbmRleCBmaWxsaW5nIG1lbW9yeQotVGhpcyBkaXJlY3RpdmUgZW1pdHMgQHZhcntzaXplfSBieXRlcywgZWFjaCBvZiB2YWx1ZSBAdmFye2ZpbGx9LiAgQm90aAotQHZhcntzaXplfSBhbmQgQHZhcntmaWxsfSBhcmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuICBJZiB0aGUgY29tbWEKLWFuZCBAdmFye2ZpbGx9IGFyZSBvbWl0dGVkLCBAdmFye2ZpbGx9IGlzIGFzc3VtZWQgdG8gYmUgemVyby4gIFRoaXMgaXMgdGhlIHNhbWUKLWFzIEBzYW1wey5za2lwfS4KLQotQGlmc2V0IEhQUEEKLUBxdW90YXRpb24KLUBlbXBoe1dhcm5pbmc6fSBAY29kZXsuc3BhY2V9IGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IG1lYW5pbmcgZm9yIEhQUEEKLXRhcmdldHM7IHVzZSBAY29kZXsuYmxvY2t9IGFzIGEgc3Vic3RpdHV0ZS4gIFNlZSBAY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMAotQXNzZW1ibHkgTGFuZ3VhZ2UgUmVmZXJlbmNlIE1hbnVhbH0gKEhQIDkyNDMyLTkwMDAxKSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlCi1AY29kZXsuc3BhY2V9IGRpcmVjdGl2ZS4gIEB4cmVme0hQUEEgRGlyZWN0aXZlcywsSFBQQSBBc3NlbWJsZXIgRGlyZWN0aXZlc30sCi1mb3IgYSBzdW1tYXJ5LgotQGVuZCBxdW90YXRpb24KLUBlbmQgaWZzZXQKLUBlbmQgaWZjbGVhcgotCi1AaWZzZXQgQTI5SwotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgU3BhY2UKLUBzZWN0aW9uIEBjb2Rley5zcGFjZX0KLUBjaW5kZXggQGNvZGV7c3BhY2V9IGRpcmVjdGl2ZQotQGVuZCBpZmNsZWFyCi1PbiB0aGUgQU1EIDI5SywgdGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yCi1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOn0gSW4gbW9zdCB2ZXJzaW9ucyBvZiB0aGUgQHNje2dudX0gYXNzZW1ibGVyLCB0aGUgZGlyZWN0aXZlCi1AY29kZXsuc3BhY2V9IGhhcyB0aGUgZWZmZWN0IG9mIEBjb2Rley5ibG9ja30gIEB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfS4KLUBlbmQgcXVvdGF0aW9uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBoYXZlLXN0YWJzCi1Abm9kZSBTdGFiCi1Ac2VjdGlvbiBAY29kZXsuc3RhYmQsIC5zdGFibiwgLnN0YWJzfQotCi1AY2luZGV4IHN5bWJvbGljIGRlYnVnZ2VycywgaW5mb3JtYXRpb24gZm9yCi1AY2luZGV4IEBjb2Rle3N0YWJAdmFye3h9fSBkaXJlY3RpdmVzCi1UaGVyZSBhcmUgdGhyZWUgZGlyZWN0aXZlcyB0aGF0IGJlZ2luIEBzYW1wey5zdGFifS4KLUFsbCBlbWl0IHN5bWJvbHMgKEBweHJlZntTeW1ib2xzfSksIGZvciB1c2UgYnkgc3ltYm9saWMgZGVidWdnZXJzLgotVGhlIHN5bWJvbHMgYXJlIG5vdCBlbnRlcmVkIGluIHRoZSBAY29kZXtAdmFsdWV7QVN9fSBoYXNoIHRhYmxlOiB0aGV5Ci1jYW5ub3QgYmUgcmVmZXJlbmNlZCBlbHNld2hlcmUgaW4gdGhlIHNvdXJjZSBmaWxlLgotVXAgdG8gZml2ZSBmaWVsZHMgYXJlIHJlcXVpcmVkOgotCi1AdGFibGUgQHZhcgotQGl0ZW0gc3RyaW5nCi1UaGlzIGlzIHRoZSBzeW1ib2wncyBuYW1lLiAgSXQgbWF5IGNvbnRhaW4gYW55IGNoYXJhY3RlciBleGNlcHQKLUBzYW1we1wwMDB9LCBzbyBpcyBtb3JlIGdlbmVyYWwgdGhhbiBvcmRpbmFyeSBzeW1ib2wgbmFtZXMuICBTb21lCi1kZWJ1Z2dlcnMgdXNlZCB0byBjb2RlIGFyYml0cmFyaWx5IGNvbXBsZXggc3RydWN0dXJlcyBpbnRvIHN5bWJvbCBuYW1lcwotdXNpbmcgdGhpcyBmaWVsZC4KLQotQGl0ZW0gdHlwZQotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBzeW1ib2wncyB0eXBlIGlzIHNldCB0byB0aGUgbG93IDggYml0cyBvZgotdGhpcyBleHByZXNzaW9uLiAgQW55IGJpdCBwYXR0ZXJuIGlzIHBlcm1pdHRlZCwgYnV0IEBjb2Rle0B2YWx1ZXtMRH19Ci1hbmQgZGVidWdnZXJzIGNob2tlIG9uIHNpbGx5IGJpdCBwYXR0ZXJucy4KLQotQGl0ZW0gb3RoZXIKLUFuIGFic29sdXRlIGV4cHJlc3Npb24uICBUaGUgc3ltYm9sJ3MgYGBvdGhlcicnIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdGhlCi1sb3cgOCBiaXRzIG9mIHRoaXMgZXhwcmVzc2lvbi4KLQotQGl0ZW0gZGVzYwotQW4gYWJzb2x1dGUgZXhwcmVzc2lvbi4gIFRoZSBzeW1ib2wncyBkZXNjcmlwdG9yIGlzIHNldCB0byB0aGUgbG93IDE2Ci1iaXRzIG9mIHRoaXMgZXhwcmVzc2lvbi4KLQotQGl0ZW0gdmFsdWUKLUFuIGFic29sdXRlIGV4cHJlc3Npb24gd2hpY2ggYmVjb21lcyB0aGUgc3ltYm9sJ3MgdmFsdWUuCi1AZW5kIHRhYmxlCi0KLUlmIGEgd2FybmluZyBpcyBkZXRlY3RlZCB3aGlsZSByZWFkaW5nIGEgQGNvZGV7LnN0YWJkfSwgQGNvZGV7LnN0YWJufSwKLW9yIEBjb2Rley5zdGFic30gc3RhdGVtZW50LCB0aGUgc3ltYm9sIGhhcyBwcm9iYWJseSBhbHJlYWR5IGJlZW4gY3JlYXRlZDsKLXlvdSBnZXQgYSBoYWxmLWZvcm1lZCBzeW1ib2wgaW4geW91ciBvYmplY3QgZmlsZS4gIFRoaXMgaXMKLWNvbXBhdGlibGUgd2l0aCBlYXJsaWVyIGFzc2VtYmxlcnMhCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXtzdGFiZH0gZGlyZWN0aXZlCi1AaXRlbSAuc3RhYmQgQHZhcnt0eXBlfSAsIEB2YXJ7b3RoZXJ9ICwgQHZhcntkZXNjfQotCi1UaGUgYGBuYW1lJycgb2YgdGhlIHN5bWJvbCBnZW5lcmF0ZWQgaXMgbm90IGV2ZW4gYW4gZW1wdHkgc3RyaW5nLgotSXQgaXMgYSBudWxsIHBvaW50ZXIsIGZvciBjb21wYXRpYmlsaXR5LiAgT2xkZXIgYXNzZW1ibGVycyB1c2VkIGEKLW51bGwgcG9pbnRlciBzbyB0aGV5IGRpZG4ndCB3YXN0ZSBzcGFjZSBpbiBvYmplY3QgZmlsZXMgd2l0aCBlbXB0eQotc3RyaW5ncy4KLQotVGhlIHN5bWJvbCdzIHZhbHVlIGlzIHNldCB0byB0aGUgbG9jYXRpb24gY291bnRlciwKLXJlbG9jYXRhYmx5LiAgV2hlbiB5b3VyIHByb2dyYW0gaXMgbGlua2VkLCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wKLWlzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyIHdoZW4gdGhlIEBjb2Rley5zdGFiZH0gd2FzCi1hc3NlbWJsZWQuCi0KLUBjaW5kZXggQGNvZGV7c3RhYm59IGRpcmVjdGl2ZQotQGl0ZW0gLnN0YWJuIEB2YXJ7dHlwZX0gLCBAdmFye290aGVyfSAsIEB2YXJ7ZGVzY30gLCBAdmFye3ZhbHVlfQotVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBpcyBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZyBAY29kZXsiIn0uCi0KLUBjaW5kZXggQGNvZGV7c3RhYnN9IGRpcmVjdGl2ZQotQGl0ZW0gLnN0YWJzIEB2YXJ7c3RyaW5nfSAsICBAdmFye3R5cGV9ICwgQHZhcntvdGhlcn0gLCBAdmFye2Rlc2N9ICwgQHZhcnt2YWx1ZX0KLUFsbCBmaXZlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLgotQGVuZCB0YWJsZQotQGVuZCBpZnNldAotQGMgZW5kICAgICBoYXZlLXN0YWJzCi0KLUBub2RlIFN0cmluZwotQHNlY3Rpb24gQGNvZGV7LnN0cmluZ30gIkB2YXJ7c3RyfSIKLQotQGNpbmRleCBzdHJpbmcsIGNvcHlpbmcgdG8gb2JqZWN0IGZpbGUKLUBjaW5kZXggQGNvZGV7c3RyaW5nfSBkaXJlY3RpdmUKLQotQ29weSB0aGUgY2hhcmFjdGVycyBpbiBAdmFye3N0cn0gdG8gdGhlIG9iamVjdCBmaWxlLiAgWW91IG1heSBzcGVjaWZ5IG1vcmUgdGhhbgotb25lIHN0cmluZyB0byBjb3B5LCBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQgZm9yIGEKLXBhcnRpY3VsYXIgbWFjaGluZSwgdGhlIGFzc2VtYmxlciBtYXJrcyB0aGUgZW5kIG9mIGVhY2ggc3RyaW5nIHdpdGggYSAwIGJ5dGUuCi1Zb3UgY2FuIHVzZSBhbnkgb2YgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgZGVzY3JpYmVkIGluIEByZWZ7U3RyaW5ncywsU3RyaW5nc30uCi0KLUBub2RlIFN0cnVjdAotQHNlY3Rpb24gQGNvZGV7LnN0cnVjdCBAdmFye2V4cHJlc3Npb259fQotCi1AY2luZGV4IEBjb2Rle3N0cnVjdH0gZGlyZWN0aXZlCi1Td2l0Y2ggdG8gdGhlIGFic29sdXRlIHNlY3Rpb24sIGFuZCBzZXQgdGhlIHNlY3Rpb24gb2Zmc2V0IHRvIEB2YXJ7ZXhwcmVzc2lvbn0sCi13aGljaCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24uICBZb3UgbWlnaHQgdXNlIHRoaXMgYXMgZm9sbG93czoKLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgLnN0cnVjdCAwCi1maWVsZDE6Ci0gICAgICAgIC5zdHJ1Y3QgZmllbGQxICsgNAotZmllbGQyOgotICAgICAgICAuc3RydWN0IGZpZWxkMiArIDQKLWZpZWxkMzoKLUBlbmQgc21hbGxleGFtcGxlCi1UaGlzIHdvdWxkIGRlZmluZSB0aGUgc3ltYm9sIEBjb2Rle2ZpZWxkMX0gdG8gaGF2ZSB0aGUgdmFsdWUgMCwgdGhlIHN5bWJvbAotQGNvZGV7ZmllbGQyfSB0byBoYXZlIHRoZSB2YWx1ZSA0LCBhbmQgdGhlIHN5bWJvbCBAY29kZXtmaWVsZDN9IHRvIGhhdmUgdGhlCi12YWx1ZSA4LiAgQXNzZW1ibHkgd291bGQgYmUgbGVmdCBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiwgYW5kIHlvdSB3b3VsZCBuZWVkIHRvCi11c2UgYSBAY29kZXsuc2VjdGlvbn0gZGlyZWN0aXZlIG9mIHNvbWUgc29ydCB0byBjaGFuZ2UgdG8gc29tZSBvdGhlciBzZWN0aW9uCi1iZWZvcmUgZnVydGhlciBhc3NlbWJseS4KLQotQGlmc2V0IEVMRgotQG5vZGUgU3ltdmVyCi1Ac2VjdGlvbiBAY29kZXsuc3ltdmVyfQotQGNpbmRleCBAY29kZXtzeW12ZXJ9IGRpcmVjdGl2ZQotQGNpbmRleCBzeW1ib2wgdmVyc2lvbmluZwotQGNpbmRleCB2ZXJzaW9ucyBvZiBzeW1ib2xzCi1Vc2UgdGhlIEBjb2Rley5zeW12ZXJ9IGRpcmVjdGl2ZSB0byBiaW5kIHN5bWJvbHMgdG8gc3BlY2lmaWMgdmVyc2lvbiBub2Rlcwotd2l0aGluIGEgc291cmNlIGZpbGUuICBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIG9uIEVMRiBwbGF0Zm9ybXMsIGFuZCBpcwotdHlwaWNhbGx5IHVzZWQgd2hlbiBhc3NlbWJsaW5nIGZpbGVzIHRvIGJlIGxpbmtlZCBpbnRvIGEgc2hhcmVkIGxpYnJhcnkuCi1UaGVyZSBhcmUgY2FzZXMgd2hlcmUgaXQgbWF5IG1ha2Ugc2Vuc2UgdG8gdXNlIHRoaXMgaW4gb2JqZWN0cyB0byBiZSBib3VuZAotaW50byBhbiBhcHBsaWNhdGlvbiBpdHNlbGYgc28gYXMgdG8gb3ZlcnJpZGUgYSB2ZXJzaW9uZWQgc3ltYm9sIGZyb20gYQotc2hhcmVkIGxpYnJhcnkuCi0KLUZvciBFTEYgdGFyZ2V0cywgdGhlIEBjb2Rley5zeW12ZXJ9IGRpcmVjdGl2ZSBpcyB1c2VkIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLS5zeW12ZXIgQHZhcntuYW1lfSwgQHZhcntuYW1lMkBAbm9kZW5hbWV9Ci1AZW5kIHNtYWxsZXhhbXBsZQotSW4gdGhpcyBjYXNlLCB0aGUgc3ltYm9sIEB2YXJ7bmFtZX0gbXVzdCBleGlzdCBhbmQgYmUgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbGUKLWJlaW5nIGFzc2VtYmxlZC4gIFRoZSBAY29kZXsudmVyc3ltfSBkaXJlY3RpdmUgZWZmZWN0aXZlbHkgY3JlYXRlcyBhIHN5bWJvbAotYWxpYXMgd2l0aCB0aGUgbmFtZSBAdmFye25hbWUyQEBub2RlbmFtZX0sIGFuZCBpbiBmYWN0IHRoZSBtYWluIHJlYXNvbiB0aGF0IHdlCi1qdXN0IGRvbid0IHRyeSBhbmQgY3JlYXRlIGEgcmVndWxhciBhbGlhcyBpcyB0aGF0IHRoZSBAdmFye0BAfSBjaGFyYWN0ZXIgaXNuJ3QKLXBlcm1pdHRlZCBpbiBzeW1ib2wgbmFtZXMuICBUaGUgQHZhcntuYW1lMn0gcGFydCBvZiB0aGUgbmFtZSBpcyB0aGUgYWN0dWFsIG5hbWUKLW9mIHRoZSBzeW1ib2wgYnkgd2hpY2ggaXQgd2lsbCBiZSBleHRlcm5hbGx5IHJlZmVyZW5jZWQuICBUaGUgbmFtZSBAdmFye25hbWV9Ci1pdHNlbGYgaXMgbWVyZWx5IGEgbmFtZSBvZiBjb252ZW5pZW5jZSB0aGF0IGlzIHVzZWQgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0bwotaGF2ZSBkZWZpbml0aW9ucyBmb3IgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYSBmdW5jdGlvbiB3aXRoaW4gYSBzaW5nbGUgc291cmNlCi1maWxlLCBhbmQgc28gdGhhdCB0aGUgY29tcGlsZXIgY2FuIHVuYW1iaWd1b3VzbHkga25vdyB3aGljaCB2ZXJzaW9uIG9mIGEKLWZ1bmN0aW9uIGlzIGJlaW5nIG1lbnRpb25lZC4gIFRoZSBAdmFye25vZGVuYW1lfSBwb3J0aW9uIG9mIHRoZSBhbGlhcyBzaG91bGQgYmUKLXRoZSBuYW1lIG9mIGEgbm9kZSBzcGVjaWZpZWQgaW4gdGhlIHZlcnNpb24gc2NyaXB0IHN1cHBsaWVkIHRvIHRoZSBsaW5rZXIgd2hlbgotYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeS4gIElmIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBvdmVycmlkZSBhIHZlcnNpb25lZAotc3ltYm9sIGZyb20gYSBzaGFyZWQgbGlicmFyeSwgdGhlbiBAdmFye25vZGVuYW1lfSBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUKLW5vZGVuYW1lIG9mIHRoZSBzeW1ib2wgeW91IGFyZSB0cnlpbmcgdG8gb3ZlcnJpZGUuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBDT0ZGCi1Abm9kZSBUYWcKLUBzZWN0aW9uIEBjb2Rley50YWcgQHZhcntzdHJ1Y3RuYW1lfX0KLQotQGNpbmRleCBDT0ZGIHN0cnVjdHVyZSBkZWJ1Z2dpbmcKLUBjaW5kZXggc3RydWN0dXJlIGRlYnVnZ2luZywgQ09GRgotQGNpbmRleCBAY29kZXt0YWd9IGRpcmVjdGl2ZQotVGhpcyBkaXJlY3RpdmUgaXMgZ2VuZXJhdGVkIGJ5IGNvbXBpbGVycyB0byBpbmNsdWRlIGF1eGlsaWFyeSBkZWJ1Z2dpbmcKLWluZm9ybWF0aW9uIGluIHRoZSBzeW1ib2wgdGFibGUuICBJdCBpcyBvbmx5IHBlcm1pdHRlZCBpbnNpZGUKLUBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMuICBUYWdzIGFyZSB1c2VkIHRvIGxpbmsgc3RydWN0dXJlCi1kZWZpbml0aW9ucyBpbiB0aGUgc3ltYm9sIHRhYmxlIHdpdGggaW5zdGFuY2VzIG9mIHRob3NlIHN0cnVjdHVyZXMuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsudGFnfSBpcyBvbmx5IHVzZWQgd2hlbiBnZW5lcmF0aW5nIENPRkYgZm9ybWF0IG91dHB1dDsgd2hlbgotQGNvZGV7QHZhbHVle0FTfX0gaXMgZ2VuZXJhdGluZyBAY29kZXtiLm91dH0sIGl0IGFjY2VwdHMgdGhpcyBkaXJlY3RpdmUgYnV0Ci1pZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBUZXh0Ci1Ac2VjdGlvbiBAY29kZXsudGV4dCBAdmFye3N1YnNlY3Rpb259fQotCi1AY2luZGV4IEBjb2Rle3RleHR9IGRpcmVjdGl2ZQotVGVsbHMgQGNvZGV7QHZhbHVle0FTfX0gdG8gYXNzZW1ibGUgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnRzIG9udG8gdGhlIGVuZCBvZgotdGhlIHRleHQgc3Vic2VjdGlvbiBudW1iZXJlZCBAdmFye3N1YnNlY3Rpb259LCB3aGljaCBpcyBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi4gIElmIEB2YXJ7c3Vic2VjdGlvbn0gaXMgb21pdHRlZCwgc3Vic2VjdGlvbiBudW1iZXIgemVybwotaXMgdXNlZC4KLQotQG5vZGUgVGl0bGUKLUBzZWN0aW9uIEBjb2Rley50aXRsZSAiQHZhcntoZWFkaW5nfSJ9Ci0KLUBjaW5kZXggQGNvZGV7dGl0bGV9IGRpcmVjdGl2ZQotQGNpbmRleCBsaXN0aW5nIGNvbnRyb2w6IHRpdGxlIGxpbmUKLVVzZSBAdmFye2hlYWRpbmd9IGFzIHRoZSB0aXRsZSAoc2Vjb25kIGxpbmUsIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQotc291cmNlIGZpbGUgbmFtZSBhbmQgcGFnZW51bWJlcikgd2hlbiBnZW5lcmF0aW5nIGFzc2VtYmx5IGxpc3RpbmdzLgotCi1UaGlzIGRpcmVjdGl2ZSBhZmZlY3RzIHN1YnNlcXVlbnQgcGFnZXMsIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgcGFnZSBpZgotaXQgYXBwZWFycyB3aXRoaW4gdGVuIGxpbmVzIG9mIHRoZSB0b3Agb2YgYSBwYWdlLgotCi1AaWZzZXQgQ09GRgotQG5vZGUgVHlwZQotQHNlY3Rpb24gQGNvZGV7LnR5cGUgQHZhcntpbnR9fQotCi1AY2luZGV4IENPRkYgc3ltYm9sIHR5cGUKLUBjaW5kZXggc3ltYm9sIHR5cGUsIENPRkYKLUBjaW5kZXggQGNvZGV7dHlwZX0gZGlyZWN0aXZlCi1UaGlzIGRpcmVjdGl2ZSwgcGVybWl0dGVkIG9ubHkgd2l0aGluIEBjb2Rley5kZWZ9L0Bjb2Rley5lbmRlZn0gcGFpcnMsCi1yZWNvcmRzIHRoZSBpbnRlZ2VyIEB2YXJ7aW50fSBhcyB0aGUgdHlwZSBhdHRyaWJ1dGUgb2YgYSBzeW1ib2wgdGFibGUgZW50cnkuCi1AaWZzZXQgQk9VVAotCi1Ac2FtcHsudHlwZX0gaXMgYXNzb2NpYXRlZCBvbmx5IHdpdGggQ09GRiBmb3JtYXQgb3V0cHV0OyB3aGVuCi1AY29kZXtAdmFsdWV7QVN9fSBpcyBjb25maWd1cmVkIGZvciBAY29kZXtiLm91dH0gb3V0cHV0LCBpdCBhY2NlcHRzIHRoaXMKLWRpcmVjdGl2ZSBidXQgaWdub3JlcyBpdC4KLUBlbmQgaWZzZXQKLUBlbmQgaWZzZXQKLQotQGlmc2V0IENPRkYKLUBub2RlIFZhbAotQHNlY3Rpb24gQGNvZGV7LnZhbCBAdmFye2FkZHJ9fQotCi1AY2luZGV4IEBjb2Rle3ZhbH0gZGlyZWN0aXZlCi1AY2luZGV4IENPRkYgdmFsdWUgYXR0cmlidXRlCi1AY2luZGV4IHZhbHVlIGF0dHJpYnV0ZSwgQ09GRgotVGhpcyBkaXJlY3RpdmUsIHBlcm1pdHRlZCBvbmx5IHdpdGhpbiBAY29kZXsuZGVmfS9AY29kZXsuZW5kZWZ9IHBhaXJzLAotcmVjb3JkcyB0aGUgYWRkcmVzcyBAdmFye2FkZHJ9IGFzIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgb2YgYSBzeW1ib2wgdGFibGUKLWVudHJ5LgotQGlmc2V0IEJPVVQKLQotQHNhbXB7LnZhbH0gaXMgdXNlZCBvbmx5IGZvciBDT0ZGIG91dHB1dDsgd2hlbiBAY29kZXtAdmFsdWV7QVN9fSBpcwotY29uZmlndXJlZCBmb3IgQGNvZGV7Yi5vdXR9LCBpdCBhY2NlcHRzIHRoaXMgZGlyZWN0aXZlIGJ1dCBpZ25vcmVzIGl0LgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotCi1Abm9kZSBVbGViMTI4Ci1Ac2VjdGlvbiBAY29kZXsudWxlYjEyOCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXt1bGViMTI4fSBkaXJlY3RpdmUKLUB2YXJ7dWxlYjEyOH0gc3RhbmRzIGZvciBgYHVuc2lnbmVkIGxpdHRsZSBlbmRpYW4gYmFzZSAxMjguJycgIFRoaXMgaXMgYSAKLWNvbXBhY3QsIHZhcmlhYmxlIGxlbmd0aCByZXByZXNlbnRhdGlvbiBvZiBudW1iZXJzIHVzZWQgYnkgdGhlIERXQVJGCi1zeW1ib2xpYyBkZWJ1Z2dpbmcgZm9ybWF0LiAgQHhyZWZ7U2xlYjEyOCxAY29kZXsuc2xlYjEyOH19LgotCi1Abm9kZSBXb3JkCi1Ac2VjdGlvbiBAY29kZXsud29yZCBAdmFye2V4cHJlc3Npb25zfX0KLQotQGNpbmRleCBAY29kZXt3b3JkfSBkaXJlY3RpdmUKLVRoaXMgZGlyZWN0aXZlIGV4cGVjdHMgemVybyBvciBtb3JlIEB2YXJ7ZXhwcmVzc2lvbnN9LCBvZiBhbnkgc2VjdGlvbiwKLXNlcGFyYXRlZCBieSBjb21tYXMuCi1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgVzMyCi1Gb3IgZWFjaCBleHByZXNzaW9uLCBAY29kZXtAdmFsdWV7QVN9fSBlbWl0cyBhIDMyLWJpdCBudW1iZXIuCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVzE2Ci1Gb3IgZWFjaCBleHByZXNzaW9uLCBAY29kZXtAdmFsdWV7QVN9fSBlbWl0cyBhIDE2LWJpdCBudW1iZXIuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBpZnNldCBHRU5FUklDCi0KLVRoZSBzaXplIG9mIHRoZSBudW1iZXIgZW1pdHRlZCwgYW5kIGl0cyBieXRlIG9yZGVyLAotZGVwZW5kIG9uIHdoYXQgdGFyZ2V0IGNvbXB1dGVyIHRoZSBhc3NlbWJseSBpcyBmb3IuCi1AZW5kIGlmc2V0Ci0KLUBjIG9uIGFtZDI5aywgaTk2MCwgc3BhcmMgdGhlICJzcGVjaWFsIHRyZWF0bWVudCB0byBzdXBwb3J0IGNvbXBpbGVycyIgZG9lc24ndAotQGMgaGFwcGVuLS0tMzItYml0IGFkZHJlc3NhYmlsaXR5LCBwZXJpb2Q7IG5vIGxvbmcvc2hvcnQganVtcHMuCi1AaWZzZXQgRElGRi1UQkwtS0xVR0UKLUBjaW5kZXggZGlmZmVyZW5jZSB0YWJsZXMgYWx0ZXJlZAotQGNpbmRleCBhbHRlcmVkIGRpZmZlcmVuY2UgdGFibGVzCi1AcXVvdGF0aW9uCi1AZW1waHtXYXJuaW5nOiBTcGVjaWFsIFRyZWF0bWVudCB0byBzdXBwb3J0IENvbXBpbGVyc30KLUBlbmQgcXVvdGF0aW9uCi0KLUBpZnNldCBHRU5FUklDCi1NYWNoaW5lcyB3aXRoIGEgMzItYml0IGFkZHJlc3Mgc3BhY2UsIGJ1dCB0aGF0IGRvIGxlc3MgdGhhbiAzMi1iaXQKLWFkZHJlc3NpbmcsIHJlcXVpcmUgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHRyZWF0bWVudC4gIElmIHRoZSBtYWNoaW5lIG9mCi1pbnRlcmVzdCB0byB5b3UgZG9lcyAzMi1iaXQgYWRkcmVzc2luZyAob3IgZG9lc24ndCByZXF1aXJlIGl0OwotQHB4cmVme01hY2hpbmUgRGVwZW5kZW5jaWVzfSksIHlvdSBjYW4gaWdub3JlIHRoaXMgaXNzdWUuCi0KLUBlbmQgaWZzZXQKLUluIG9yZGVyIHRvIGFzc2VtYmxlIGNvbXBpbGVyIG91dHB1dCBpbnRvIHNvbWV0aGluZyB0aGF0IHdvcmtzLAotQGNvZGV7QHZhbHVle0FTfX0gb2NjYXNpb25sbHkgZG9lcyBzdHJhbmdlIHRoaW5ncyB0byBAc2FtcHsud29yZH0gZGlyZWN0aXZlcy4KLURpcmVjdGl2ZXMgb2YgdGhlIGZvcm0gQHNhbXB7LndvcmQgc3ltMS1zeW0yfSBhcmUgb2Z0ZW4gZW1pdHRlZCBieQotY29tcGlsZXJzIGFzIHBhcnQgb2YganVtcCB0YWJsZXMuICBUaGVyZWZvcmUsIHdoZW4gQGNvZGV7QHZhbHVle0FTfX0gYXNzZW1ibGVzIGEKLWRpcmVjdGl2ZSBvZiB0aGUgZm9ybSBAc2FtcHsud29yZCBzeW0xLXN5bTJ9LCBhbmQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotQGNvZGV7c3ltMX0gYW5kIEBjb2Rle3N5bTJ9IGRvZXMgbm90IGZpdCBpbiAxNiBiaXRzLCBAY29kZXtAdmFsdWV7QVN9fQotY3JlYXRlcyBhIEBkZm57c2Vjb25kYXJ5IGp1bXAgdGFibGV9LCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIG5leHQgbGFiZWwuCi1UaGlzIHNlY29uZGFyeSBqdW1wIHRhYmxlIGlzIHByZWNlZGVkIGJ5IGEgc2hvcnQtanVtcCB0byB0aGUKLWZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIHNlY29uZGFyeSB0YWJsZS4gIFRoaXMgc2hvcnQtanVtcCBwcmV2ZW50cyB0aGUgZmxvdwotb2YgY29udHJvbCBmcm9tIGFjY2lkZW50YWxseSBmYWxsaW5nIGludG8gdGhlIG5ldyB0YWJsZS4gIEluc2lkZSB0aGUKLXRhYmxlIGlzIGEgbG9uZy1qdW1wIHRvIEBjb2Rle3N5bTJ9LiAgVGhlIG9yaWdpbmFsIEBzYW1wey53b3JkfQotY29udGFpbnMgQGNvZGV7c3ltMX0gbWludXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvbmctanVtcCB0bwotQGNvZGV7c3ltMn0uCi0KLUlmIHRoZXJlIHdlcmUgc2V2ZXJhbCBvY2N1cnJlbmNlcyBvZiBAc2FtcHsud29yZCBzeW0xLXN5bTJ9IGJlZm9yZSB0aGUKLXNlY29uZGFyeSBqdW1wIHRhYmxlLCBhbGwgb2YgdGhlbSBhcmUgYWRqdXN0ZWQuICBJZiB0aGVyZSB3YXMgYQotQHNhbXB7LndvcmQgc3ltMy1zeW00fSwgdGhhdCBhbHNvIGRpZCBub3QgZml0IGluIHNpeHRlZW4gYml0cywgYQotbG9uZy1qdW1wIHRvIEBjb2Rle3N5bTR9IGlzIGluY2x1ZGVkIGluIHRoZSBzZWNvbmRhcnkganVtcCB0YWJsZSwKLWFuZCB0aGUgQGNvZGV7LndvcmR9IGRpcmVjdGl2ZXMgYXJlIGFkanVzdGVkIHRvIGNvbnRhaW4gQGNvZGV7c3ltM30KLW1pbnVzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb25nLWp1bXAgdG8gQGNvZGV7c3ltNH07IGFuZCBzbyBvbiwgZm9yIGFzIG1hbnkKLWVudHJpZXMgaW4gdGhlIG9yaWdpbmFsIGp1bXAgdGFibGUgYXMgbmVjZXNzYXJ5LgotCi1AaWZzZXQgSU5URVJOQUxTCi1AZW1waHtUaGlzIGZlYXR1cmUgbWF5IGJlIGRpc2FibGVkIGJ5IGNvbXBpbGluZyBAY29kZXtAdmFsdWV7QVN9fSB3aXRoIHRoZQotQHNhbXB7LURXT1JLSU5HX0RPVF9XT1JEfSBvcHRpb24ufSBUaGlzIGZlYXR1cmUgaXMgbGlrZWx5IHRvIGNvbmZ1c2UKLWFzc2VtYmx5IGxhbmd1YWdlIHByb2dyYW1tZXJzLgotQGVuZCBpZnNldAotQGVuZCBpZnNldAotQGMgZW5kICAgICBESUZGLVRCTC1LTFVHRQotCi1Abm9kZSBEZXByZWNhdGVkCi1Ac2VjdGlvbiBEZXByZWNhdGVkIERpcmVjdGl2ZXMKLQotQGNpbmRleCBkZXByZWNhdGVkIGRpcmVjdGl2ZXMKLUBjaW5kZXggb2Jzb2xlc2NlbnQgZGlyZWN0aXZlcwotT25lIGRheSB0aGVzZSBkaXJlY3RpdmVzIHdvbid0IHdvcmsuCi1UaGV5IGFyZSBpbmNsdWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGFzc2VtYmxlcnMuCi1AdGFibGUgQHQKLUBpdGVtIC5hYm9ydAotQGl0ZW0gLmxpbmUKLUBlbmQgdGFibGUKLQotQGlmc2V0IEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IG1hY2hpbmUgZGVwZW5kZW5jaWVzCi1UaGUgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXRzIGFyZSAoYWxtb3N0IGJ5IGRlZmluaXRpb24pIGRpZmZlcmVudCBvbgotZWFjaCBtYWNoaW5lIHdoZXJlIEBjb2Rle0B2YWx1ZXtBU319IHJ1bnMuICBGbG9hdGluZyBwb2ludCByZXByZXNlbnRhdGlvbnMKLXZhcnkgYXMgd2VsbCwgYW5kIEBjb2Rle0B2YWx1ZXtBU319IG9mdGVuIHN1cHBvcnRzIGEgZmV3IGFkZGl0aW9uYWwKLWRpcmVjdGl2ZXMgb3IgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotYXNzZW1ibGVycyBvbiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0uICBGaW5hbGx5LCBzb21lIHZlcnNpb25zIG9mCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IHNwZWNpYWwgcHNldWRvLWluc3RydWN0aW9ucyBmb3IgYnJhbmNoCi1vcHRpbWl6YXRpb24uCi0KLVRoaXMgY2hhcHRlciBkaXNjdXNzZXMgbW9zdCBvZiB0aGVzZSBkaWZmZXJlbmNlcywgdGhvdWdoIGl0IGRvZXMgbm90Ci1pbmNsdWRlIGRldGFpbHMgb24gYW55IG1hY2hpbmUncyBpbnN0cnVjdGlvbiBzZXQuICBGb3IgZGV0YWlscyBvbiB0aGF0Ci1zdWJqZWN0LCBzZWUgdGhlIGhhcmR3YXJlIG1hbnVmYWN0dXJlcidzIG1hbnVhbC4KLQotQG1lbnUKLUBpZnNldCBBMjlLCi0qIEFNRDI5Sy1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEFNRCAyOUsgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgQVJDCi0qIEFSQy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgIEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBBUk0KLSogQVJNLURlcGVuZGVudDo6ICAgICAgICAgICAgICAgQVJNIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEQxMFYKLSogRDEwVi1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgRDEwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBEMzBWCi0qIEQzMFYtRGVwZW5kZW50OjogICAgICAgICAgICAgIEQzMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSDgvMzAwCi0qIEg4LzMwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEhpdGFjaGkgSDgvMzAwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEg4LzUwMAotKiBIOC81MDAtRGVwZW5kZW50OjogICAgICAgICAgICBIaXRhY2hpIEg4LzUwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBIUFBBCi0qIEhQUEEtRGVwZW5kZW50OjogICAgICAgICAgICAgIEhQUEEgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTgwMzg2Ci0qIGkzODYtRGVwZW5kZW50OjogICAgICAgICAgICAgIEludGVsIDgwMzg2IERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLSogaTk2MC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgSW50ZWwgODA5NjAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgTTY4MFgwCi0qIE02OEstRGVwZW5kZW50OjogICAgICAgICAgICAgIE02ODB4MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBNSVBTCi0qIE1JUFMtRGVwZW5kZW50OjogICAgICAgICAgICAgIE1JUFMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgU0gKLSogU0gtRGVwZW5kZW50OjogICAgICAgICAgICAgICAgSGl0YWNoaSBTSCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBTUEFSQwotKiBTcGFyYy1EZXBlbmRlbnQ6OiAgICAgICAgICAgICBTUEFSQyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZnNldCBWODUwCi0qIFY4NTAtRGVwZW5kZW50OjogICAgICAgICAgICAgIFY4NTAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgWjgwMDAKLSogWjgwMDAtRGVwZW5kZW50OjogICAgICAgICAgICAgWjgwMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZzZXQgVkFYCi0qIFZheC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgIFZBWCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBlbmQgbWVudQotCi1AbG93ZXJzZWN0aW9ucwotQGVuZCBpZnNldAotCi1AYyBUaGUgZm9sbG93aW5nIG1ham9yIG5vZGVzIGFyZSAqc2VjdGlvbnMqIGluIHRoZSBHRU5FUklDIHZlcnNpb24sICpjaGFwdGVycyoKLUBjIGluIHNpbmdsZS1jcHUgdmVyc2lvbnMuICBUaGlzIGlzIG1haW5seSBhY2hpZXZlZCBieSBAbG93ZXJzZWN0aW9ucy4gIFRoZXJlIGlzIGEKLUBjIHBlY3VsaWFyaXR5OiB0byBwcmVzZXJ2ZSBjcm9zcy1yZWZlcmVuY2VzLCB0aGVyZSBtdXN0IGJlIGEgbm9kZSBjYWxsZWQKLUBjICJNYWNoaW5lIERlcGVuZGVuY2llcyIuICBIZW5jZSB0aGUgY29uZGl0aW9uYWwgbm9kZW5hbWVzIGluIGVhY2gKLUBjIG1ham9yIG5vZGUgYmVsb3cuICBOb2RlIGRlZmF1bHRpbmcgaW4gbWFrZWluZm8gcmVxdWlyZXMgYWRqYWNlbmN5IG9mCi1AYyBub2RlIGFuZCBzZWN0aW9uaW5nIGNvbW1hbmRzOyBoZW5jZSB0aGUgcmVwZXRpdGlvbiBvZiBAY2hhcHRlciBCTEFICi1AYyBpbiBib3RoIGNvbmRpdGlvbmFsIGJsb2Nrcy4KLQotQGlmc2V0IEFSQwotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBBUkMtRGVwZW5kZW50Ci1AY2hhcHRlciBBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgQVJDIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggQVJDIHN1cHBvcnQKLUBtZW51Ci0qIEFSQy1PcHRzOjogICAgICAgICAgICAgICAgICAgIE9wdGlvbnMKLSogQVJDLUZsb2F0OjogICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogQVJDLURpcmVjdGl2ZXM6OiAgICAgICAgICAgICAgU3BhcmMgTWFjaGluZSBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQVJDLU9wdHMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zIGZvciBBUkMKLUBjaW5kZXggQVJDIG9wdGlvbnMKLUBjaW5kZXggYXJjaGl0ZWN0dXJlcywgQVJDCi1AY2luZGV4IEFSQyBhcmNoaXRlY3R1cmVzCi1UaGUgQVJDIGNoaXAgZmFtaWx5IGluY2x1ZGVzIHNldmVyYWwgc3VjY2Vzc2l2ZSBsZXZlbHMgKG9yIG90aGVyCi12YXJpYW50cykgb2YgY2hpcCwgdXNpbmcgdGhlIHNhbWUgY29yZSBpbnN0cnVjdGlvbiBzZXQsIGJ1dCBpbmNsdWRpbmcKLWEgZmV3IGFkZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zIGF0IGVhY2ggbGV2ZWwuCi0KLUJ5IGRlZmF1bHQsIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgdGhlIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0IChBUkMKLWJhc2UpLiAgVGhlIEBjb2Rley5jcHV9IHBzZXVkby1vcCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHNlbGVjdAotdGhlIHZhcmlhbnQuCi0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXstbWJpZy1lbmRpYW59IG9wdGlvbiAoQVJDKQotQGNpbmRleCBAY29kZXstbWxpdHRsZS1lbmRpYW59IG9wdGlvbiAoQVJDKQotQGNpbmRleCBBUkMgYmlnLWVuZGlhbiBvdXRwdXQKLUBjaW5kZXggQVJDIGxpdHRsZS1lbmRpYW4gb3V0cHV0Ci1AY2luZGV4IGJpZy1lbmRpYW4gb3V0cHV0LCBBUkMKLUBjaW5kZXggbGl0dGxlLWVuZGlhbiBvdXRwdXQsIEFSQwotQGl0ZW0gLW1iaWctZW5kaWFuCi1AaXRlbXggLW1saXR0bGUtZW5kaWFuCi1BbnkgQHNje2FyY30gY29uZmlndXJhdGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBjYW4gc2VsZWN0IGJpZy1lbmRpYW4gb3IKLWxpdHRsZS1lbmRpYW4gb3V0cHV0IGF0IHJ1biB0aW1lICh1bmxpa2UgbW9zdCBvdGhlciBAc2N7Z251fSBkZXZlbG9wbWVudAotdG9vbHMsIHdoaWNoIG11c3QgYmUgY29uZmlndXJlZCBmb3Igb25lIG9yIHRoZSBvdGhlcikuICBVc2UKLUBzYW1wey1tYmlnLWVuZGlhbn0gdG8gc2VsZWN0IGJpZy1lbmRpYW4gb3V0cHV0LCBhbmQgQHNhbXB7LW1saXR0bGUtZW5kaWFufQotZm9yIGxpdHRsZS1lbmRpYW4uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEFSQy1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgQVJDIChAc2N7aWVlZX0pCi1AY2luZGV4IEFSQyBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEFSQyBjcHUgZmFtaWx5IGN1cnJlbnRseSBkb2VzIG5vdCBoYXZlIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50Ci1zdXBwb3J0LiAgU29mdHdhcmUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBpcyBwcm92aWRlZCBieSBAY29kZXtHQ0N9Ci1hbmQgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgQVJDLURpcmVjdGl2ZXMKLUBzZWN0aW9uIEFSQyBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBBUkMgbWFjaGluZSBkaXJlY3RpdmVzCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgQVJDCi1UaGUgQVJDIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsCi1tYWNoaW5lIGRpcmVjdGl2ZXM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLmNwdQotQGNpbmRleCBAY29kZXtjcHV9IGRpcmVjdGl2ZSwgU1BBUkMKLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSB0aGUgZGVzaXJlZCBjcHUuCi1UaGUgQVJDIGlzIGludGVuZGVkIHRvIGJlIGN1c3RvbWl6YWJsZSwgQGNvZGV7LmNwdX0gaXMgdXNlZCB0bwotc2VsZWN0IHRoZSBkZXNpcmVkIHZhcmlhbnQgW3Rob3VnaCBjdXJyZW50bHkgdGhlcmUgYXJlIG5vbmVdLgotCi1AZW5kIHRhYmxlCi0KLUBlbmQgaWZzZXQKLQotQGlmc2V0IEEyOUsKLUBpbmNsdWRlIGMtYTI5ay50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBBUk0KLUBpbmNsdWRlIGMtYXJtLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhpdGFjaGktYWxsCi1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgTWFjaGluZSBEZXBlbmRlbnQgRmVhdHVyZXMKLQotVGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0cyBhcmUgZGlmZmVyZW50IG9uIGVhY2ggSGl0YWNoaSBjaGlwIGZhbWlseSwKLWFuZCB0aGVyZSBhcmUgYWxzbyBzb21lIHN5bnRheCBkaWZmZXJlbmNlcyBhbW9uZyB0aGUgZmFtaWxpZXMuICBUaGlzCi1jaGFwdGVyIGRlc2NyaWJlcyB0aGUgc3BlY2lmaWMgQGNvZGV7QHZhbHVle0FTfX0gZmVhdHVyZXMgZm9yIGVhY2gKLWZhbWlseS4KLQotQG1lbnUKLSogSDgvMzAwLURlcGVuZGVudDo6ICAgICAgICAgICAgSGl0YWNoaSBIOC8zMDAgRGVwZW5kZW50IEZlYXR1cmVzCi0qIEg4LzUwMC1EZXBlbmRlbnQ6OiAgICAgICAgICAgIEhpdGFjaGkgSDgvNTAwIERlcGVuZGVudCBGZWF0dXJlcwotKiBTSC1EZXBlbmRlbnQ6OiAgICAgICAgICAgICAgICBIaXRhY2hpIFNIIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBtZW51Ci1AbG93ZXJzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBEMTBWCi1AaW5jbHVkZSBjLWQxMHYudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgRDMwVgotQGluY2x1ZGUgYy1kMzB2LnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEg4LzMwMAotQGluY2x1ZGUgYy1oODMwMC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBIOC81MDAKLUBpbmNsdWRlIGMtaDg1MDAudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgSFBQQQotQGluY2x1ZGUgYy1ocHBhLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEk4MDM4NgotQGluY2x1ZGUgYy1pMzg2LnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEk5NjAKLUBpbmNsdWRlIGMtaTk2MC50ZXhpCi1AZW5kIGlmc2V0Ci0KLQotQGlmc2V0IE02ODBYMAotQGluY2x1ZGUgYy1tNjhrLnRleGkKLUBlbmQgaWZzZXQKLQotQGlmc2V0IE1JUFMKLUBpbmNsdWRlIGMtbWlwcy50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBOUzMySwotQGluY2x1ZGUgYy1uczMyay50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBTSAotQGluY2x1ZGUgYy1zaC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBTUEFSQwotQGluY2x1ZGUgYy1zcGFyYy50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBaODAwMAotQGluY2x1ZGUgYy16OGsudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgVkFYCi1AaW5jbHVkZSBjLXZheC50ZXhpCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBWODUwCi1AaW5jbHVkZSBjLXY4NTAudGV4aQotQGVuZCBpZnNldAotCi1AaWZzZXQgR0VORVJJQwotQGMgcmV2ZXJzZSBlZmZlY3Qgb2YgQGRvd24gYXQgdG9wIG9mIGdlbmVyaWMgTWFjaGluZS1EZXAgY2hhcHRlcgotQHJhaXNlc2VjdGlvbnMKLUBlbmQgaWZzZXQKLQotQG5vZGUgUmVwb3J0aW5nIEJ1Z3MKLUBjaGFwdGVyIFJlcG9ydGluZyBCdWdzCi1AY2luZGV4IGJ1Z3MgaW4gYXNzZW1ibGVyCi1AY2luZGV4IHJlcG9ydGluZyBidWdzIGluIGFzc2VtYmxlcgotCi1Zb3VyIGJ1ZyByZXBvcnRzIHBsYXkgYW4gZXNzZW50aWFsIHJvbGUgaW4gbWFraW5nIEBjb2Rle0B2YWx1ZXtBU319IHJlbGlhYmxlLgotCi1SZXBvcnRpbmcgYSBidWcgbWF5IGhlbHAgeW91IGJ5IGJyaW5naW5nIGEgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLCBvciBpdCBtYXkKLW5vdC4gIEJ1dCBpbiBhbnkgY2FzZSB0aGUgcHJpbmNpcGFsIGZ1bmN0aW9uIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBoZWxwIHRoZQotZW50aXJlIGNvbW11bml0eSBieSBtYWtpbmcgdGhlIG5leHQgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSB3b3JrIGJldHRlci4KLUJ1ZyByZXBvcnRzIGFyZSB5b3VyIGNvbnRyaWJ1dGlvbiB0byB0aGUgbWFpbnRlbmFuY2Ugb2YgQGNvZGV7QHZhbHVle0FTfX0uCi0KLUluIG9yZGVyIGZvciBhIGJ1ZyByZXBvcnQgdG8gc2VydmUgaXRzIHB1cnBvc2UsIHlvdSBtdXN0IGluY2x1ZGUgdGhlCi1pbmZvcm1hdGlvbiB0aGF0IGVuYWJsZXMgdXMgdG8gZml4IHRoZSBidWcuCi0KLUBtZW51Ci0qIEJ1ZyBDcml0ZXJpYTo6ICAgICAgICAgICAgICAgIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotKiBCdWcgUmVwb3J0aW5nOjogICAgICAgICAgICAgICBIb3cgdG8gcmVwb3J0IGJ1Z3MKLUBlbmQgbWVudQotCi1Abm9kZSBCdWcgQ3JpdGVyaWEKLUBzZWN0aW9uIEhhdmUgeW91IGZvdW5kIGEgYnVnPwotQGNpbmRleCBidWcgY3JpdGVyaWEKLQotSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHlvdSBoYXZlIGZvdW5kIGEgYnVnLCBoZXJlIGFyZSBzb21lIGd1aWRlbGluZXM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBjaW5kZXggZmF0YWwgc2lnbmFsCi1AY2luZGV4IGFzc2VtYmxlciBjcmFzaAotQGNpbmRleCBjcmFzaCBvZiBhc3NlbWJsZXIKLUBpdGVtCi1JZiB0aGUgYXNzZW1ibGVyIGdldHMgYSBmYXRhbCBzaWduYWwsIGZvciBhbnkgaW5wdXQgd2hhdGV2ZXIsIHRoYXQgaXMgYQotQGNvZGV7QHZhbHVle0FTfX0gYnVnLiAgUmVsaWFibGUgYXNzZW1ibGVycyBuZXZlciBjcmFzaC4KLQotQGNpbmRleCBlcnJvciBvbiB2YWxpZCBpbnB1dAotQGl0ZW0KLUlmIEBjb2Rle0B2YWx1ZXtBU319IHByb2R1Y2VzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHZhbGlkIGlucHV0LCB0aGF0IGlzIGEgYnVnLgotCi1AY2luZGV4IGludmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCBwcm9kdWNlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGludmFsaWQgaW5wdXQsIHRoYXQKLWlzIGEgYnVnLiAgSG93ZXZlciwgeW91IHNob3VsZCBub3RlIHRoYXQgeW91ciBpZGVhIG9mIGBgaW52YWxpZCBpbnB1dCcnIG1pZ2h0Ci1iZSBvdXIgaWRlYSBvZiBgYGFuIGV4dGVuc2lvbicnIG9yIGBgc3VwcG9ydCBmb3IgdHJhZGl0aW9uYWwgcHJhY3RpY2UnJy4KLQotQGl0ZW0KLUlmIHlvdSBhcmUgYW4gZXhwZXJpZW5jZWQgdXNlciBvZiBhc3NlbWJsZXJzLCB5b3VyIHN1Z2dlc3Rpb25zIGZvciBpbXByb3ZlbWVudAotb2YgQGNvZGV7QHZhbHVle0FTfX0gYXJlIHdlbGNvbWUgaW4gYW55IGNhc2UuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgQnVnIFJlcG9ydGluZwotQHNlY3Rpb24gSG93IHRvIHJlcG9ydCBidWdzCi1AY2luZGV4IGJ1ZyByZXBvcnRzCi1AY2luZGV4IGFzc2VtYmxlciBidWdzLCByZXBvcnRpbmcKLQotQSBudW1iZXIgb2YgY29tcGFuaWVzIGFuZCBpbmRpdmlkdWFscyBvZmZlciBzdXBwb3J0IGZvciBAc2N7Z251fSBwcm9kdWN0cy4gIElmCi15b3Ugb2J0YWluZWQgQGNvZGV7QHZhbHVle0FTfX0gZnJvbSBhIHN1cHBvcnQgb3JnYW5pemF0aW9uLCB3ZSByZWNvbW1lbmQgeW91Ci1jb250YWN0IHRoYXQgb3JnYW5pemF0aW9uIGZpcnN0LgotCi1Zb3UgY2FuIGZpbmQgY29udGFjdCBpbmZvcm1hdGlvbiBmb3IgbWFueSBzdXBwb3J0IGNvbXBhbmllcyBhbmQKLWluZGl2aWR1YWxzIGluIHRoZSBmaWxlIEBmaWxle2V0Yy9TRVJWSUNFfSBpbiB0aGUgQHNje2dudX0gRW1hY3MKLWRpc3RyaWJ1dGlvbi4KLQotSW4gYW55IGV2ZW50LCB3ZSBhbHNvIHJlY29tbWVuZCB0aGF0IHlvdSBzZW5kIGJ1ZyByZXBvcnRzIGZvciBAY29kZXtAdmFsdWV7QVN9fQotdG8gQHNhbXB7YnVnLWdudS11dGlsc0BAZ251Lm9yZ30uCi0KLVRoZSBmdW5kYW1lbnRhbCBwcmluY2lwbGUgb2YgcmVwb3J0aW5nIGJ1Z3MgdXNlZnVsbHkgaXMgdGhpczoKLUBzdHJvbmd7cmVwb3J0IGFsbCB0aGUgZmFjdHN9LiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHRvIHN0YXRlIGEKLWZhY3Qgb3IgbGVhdmUgaXQgb3V0LCBzdGF0ZSBpdCEKLQotT2Z0ZW4gcGVvcGxlIG9taXQgZmFjdHMgYmVjYXVzZSB0aGV5IHRoaW5rIHRoZXkga25vdyB3aGF0IGNhdXNlcyB0aGUgcHJvYmxlbQotYW5kIGFzc3VtZSB0aGF0IHNvbWUgZGV0YWlscyBkbyBub3QgbWF0dGVyLiAgVGh1cywgeW91IG1pZ2h0IGFzc3VtZSB0aGF0IHRoZQotbmFtZSBvZiBhIHN5bWJvbCB5b3UgdXNlIGluIGFuIGV4YW1wbGUgZG9lcyBub3QgbWF0dGVyLiAgV2VsbCwgcHJvYmFibHkgaXQgZG9lcwotbm90LCBidXQgb25lIGNhbm5vdCBiZSBzdXJlLiAgUGVyaGFwcyB0aGUgYnVnIGlzIGEgc3RyYXkgbWVtb3J5IHJlZmVyZW5jZSB3aGljaAotaGFwcGVucyB0byBmZXRjaCBmcm9tIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGF0IG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsKLXBlcmhhcHMsIGlmIHRoZSBuYW1lIHdlcmUgZGlmZmVyZW50LCB0aGUgY29udGVudHMgb2YgdGhhdCBsb2NhdGlvbiB3b3VsZCBmb29sCi10aGUgYXNzZW1ibGVyIGludG8gZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGRlc3BpdGUgdGhlIGJ1Zy4gIFBsYXkgaXQgc2FmZSBhbmQKLWdpdmUgYSBzcGVjaWZpYywgY29tcGxldGUgZXhhbXBsZS4gIFRoYXQgaXMgdGhlIGVhc2llc3QgdGhpbmcgZm9yIHlvdSB0byBkbywKLWFuZCB0aGUgbW9zdCBoZWxwZnVsLgotCi1LZWVwIGluIG1pbmQgdGhhdCB0aGUgcHVycG9zZSBvZiBhIGJ1ZyByZXBvcnQgaXMgdG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnIGlmCi1pdCBpcyBuZXcgdG8gdXMuICBUaGVyZWZvcmUsIGFsd2F5cyB3cml0ZSB5b3VyIGJ1ZyByZXBvcnRzIG9uIHRoZSBhc3N1bXB0aW9uCi10aGF0IHRoZSBidWcgaGFzIG5vdCBiZWVuIHJlcG9ydGVkIHByZXZpb3VzbHkuCi0KLVNvbWV0aW1lcyBwZW9wbGUgZ2l2ZSBhIGZldyBza2V0Y2h5IGZhY3RzIGFuZCBhc2ssIGBgRG9lcyB0aGlzIHJpbmcgYQotYmVsbD8nJyAgVGhvc2UgYnVnIHJlcG9ydHMgYXJlIHVzZWxlc3MsIGFuZCB3ZSB1cmdlIGV2ZXJ5b25lIHRvCi1AZW1waHtyZWZ1c2UgdG8gcmVzcG9uZCB0byB0aGVtfSBleGNlcHQgdG8gY2hpZGUgdGhlIHNlbmRlciB0byByZXBvcnQKLWJ1Z3MgcHJvcGVybHkuCi0KLVRvIGVuYWJsZSB1cyB0byBmaXggdGhlIGJ1ZywgeW91IHNob3VsZCBpbmNsdWRlIGFsbCB0aGVzZSB0aGluZ3M6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1UaGUgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fS4gIEBjb2Rle0B2YWx1ZXtBU319IGFubm91bmNlcyBpdCBpZiB5b3Ugc3RhcnQKLWl0IHdpdGggdGhlIEBzYW1wey0tdmVyc2lvbn0gYXJndW1lbnQuCi0KLVdpdGhvdXQgdGhpcywgd2Ugd2lsbCBub3Qga25vdyB3aGV0aGVyIHRoZXJlIGlzIGFueSBwb2ludCBpbiBsb29raW5nIGZvcgotdGhlIGJ1ZyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319LgotCi1AaXRlbQotQW55IHBhdGNoZXMgeW91IG1heSBoYXZlIGFwcGxpZWQgdG8gdGhlIEBjb2Rle0B2YWx1ZXtBU319IHNvdXJjZS4KLQotQGl0ZW0KLVRoZSB0eXBlIG9mIG1hY2hpbmUgeW91IGFyZSB1c2luZywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hbWUgYW5kCi12ZXJzaW9uIG51bWJlci4KLQotQGl0ZW0KLVdoYXQgY29tcGlsZXIgKGFuZCBpdHMgdmVyc2lvbikgd2FzIHVzZWQgdG8gY29tcGlsZSBAY29kZXtAdmFsdWV7QVN9fS0tLWUuZy4KLWBgQGNvZGV7Z2NjLTIuN30nJy4KLQotQGl0ZW0KLVRoZSBjb21tYW5kIGFyZ3VtZW50cyB5b3UgZ2F2ZSB0aGUgYXNzZW1ibGVyIHRvIGFzc2VtYmxlIHlvdXIgZXhhbXBsZSBhbmQKLW9ic2VydmUgdGhlIGJ1Zy4gIFRvIGd1YXJhbnRlZSB5b3Ugd2lsbCBub3Qgb21pdCBzb21ldGhpbmcgaW1wb3J0YW50LCBsaXN0IHRoZW0KLWFsbC4gIEEgY29weSBvZiB0aGUgTWFrZWZpbGUgKG9yIHRoZSBvdXRwdXQgZnJvbSBtYWtlKSBpcyBzdWZmaWNpZW50LgotCi1JZiB3ZSB3ZXJlIHRvIHRyeSB0byBndWVzcyB0aGUgYXJndW1lbnRzLCB3ZSB3b3VsZCBwcm9iYWJseSBndWVzcyB3cm9uZwotYW5kIHRoZW4gd2UgbWlnaHQgbm90IGVuY291bnRlciB0aGUgYnVnLgotCi1AaXRlbQotQSBjb21wbGV0ZSBpbnB1dCBmaWxlIHRoYXQgd2lsbCByZXByb2R1Y2UgdGhlIGJ1Zy4gIElmIHRoZSBidWcgaXMgb2JzZXJ2ZWQgd2hlbgotdGhlIGFzc2VtYmxlciBpcyBpbnZva2VkIHZpYSBhIGNvbXBpbGVyLCBzZW5kIHRoZSBhc3NlbWJsZXIgc291cmNlLCBub3QgdGhlCi1oaWdoIGxldmVsIGxhbmd1YWdlIHNvdXJjZS4gIE1vc3QgY29tcGlsZXJzIHdpbGwgcHJvZHVjZSB0aGUgYXNzZW1ibGVyIHNvdXJjZQotd2hlbiBydW4gd2l0aCB0aGUgQHNhbXB7LVN9IG9wdGlvbi4gIElmIHlvdSBhcmUgdXNpbmcgQGNvZGV7QHZhbHVle0dDQ319LCB1c2UKLXRoZSBvcHRpb25zIEBzYW1wey12IC0tc2F2ZS10ZW1wc307IHRoaXMgd2lsbCBzYXZlIHRoZSBhc3NlbWJsZXIgc291cmNlIGluIGEKLWZpbGUgd2l0aCBhbiBleHRlbnNpb24gb2YgQGZpbGV7LnN9LCBhbmQgYWxzbyBzaG93IHlvdSBleGFjdGx5IGhvdwotQGNvZGV7QHZhbHVle0FTfX0gaXMgYmVpbmcgcnVuLgotCi1AaXRlbQotQSBkZXNjcmlwdGlvbiBvZiB3aGF0IGJlaGF2aW9yIHlvdSBvYnNlcnZlIHRoYXQgeW91IGJlbGlldmUgaXMKLWluY29ycmVjdC4gIEZvciBleGFtcGxlLCBgYEl0IGdldHMgYSBmYXRhbCBzaWduYWwuJycKLQotT2YgY291cnNlLCBpZiB0aGUgYnVnIGlzIHRoYXQgQGNvZGV7QHZhbHVle0FTfX0gZ2V0cyBhIGZhdGFsIHNpZ25hbCwgdGhlbiB3ZQotd2lsbCBjZXJ0YWlubHkgbm90aWNlIGl0LiAgQnV0IGlmIHRoZSBidWcgaXMgaW5jb3JyZWN0IG91dHB1dCwgd2UgbWlnaHQgbm90Ci1ub3RpY2UgdW5sZXNzIGl0IGlzIGdsYXJpbmdseSB3cm9uZy4gIFlvdSBtaWdodCBhcyB3ZWxsIG5vdCBnaXZlIHVzIGEgY2hhbmNlIHRvCi1tYWtlIGEgbWlzdGFrZS4KLQotRXZlbiBpZiB0aGUgcHJvYmxlbSB5b3UgZXhwZXJpZW5jZSBpcyBhIGZhdGFsIHNpZ25hbCwgeW91IHNob3VsZCBzdGlsbCBzYXkgc28KLWV4cGxpY2l0bHkuICBTdXBwb3NlIHNvbWV0aGluZyBzdHJhbmdlIGlzIGdvaW5nIG9uLCBzdWNoIGFzLCB5b3VyIGNvcHkgb2YKLUBjb2Rle0B2YWx1ZXtBU319IGlzIG91dCBvZiBzeW5jaCwgb3IgeW91IGhhdmUgZW5jb3VudGVyZWQgYSBidWcgaW4gdGhlIEMKLWxpYnJhcnkgb24geW91ciBzeXN0ZW0uICAoVGhpcyBoYXMgaGFwcGVuZWQhKSAgWW91ciBjb3B5IG1pZ2h0IGNyYXNoIGFuZCBvdXJzCi13b3VsZCBub3QuICBJZiB5b3UgdG9sZCB1cyB0byBleHBlY3QgYSBjcmFzaCwgdGhlbiB3aGVuIG91cnMgZmFpbHMgdG8gY3Jhc2gsIHdlCi13b3VsZCBrbm93IHRoYXQgdGhlIGJ1ZyB3YXMgbm90IGhhcHBlbmluZyBmb3IgdXMuICBJZiB5b3UgaGFkIG5vdCB0b2xkIHVzIHRvCi1leHBlY3QgYSBjcmFzaCwgdGhlbiB3ZSB3b3VsZCBub3QgYmUgYWJsZSB0byBkcmF3IGFueSBjb25jbHVzaW9uIGZyb20gb3VyCi1vYnNlcnZhdGlvbnMuCi0KLUBpdGVtCi1JZiB5b3Ugd2lzaCB0byBzdWdnZXN0IGNoYW5nZXMgdG8gdGhlIEBjb2Rle0B2YWx1ZXtBU319IHNvdXJjZSwgc2VuZCB1cyBjb250ZXh0Ci1kaWZmcywgYXMgZ2VuZXJhdGVkIGJ5IEBjb2Rle2RpZmZ9IHdpdGggdGhlIEBzYW1wey11fSwgQHNhbXB7LWN9LCBvciBAc2FtcHstcH0KLW9wdGlvbi4gIEFsd2F5cyBzZW5kIGRpZmZzIGZyb20gdGhlIG9sZCBmaWxlIHRvIHRoZSBuZXcgZmlsZS4gIElmIHlvdSBldmVuCi1kaXNjdXNzIHNvbWV0aGluZyBpbiB0aGUgQGNvZGV7QHZhbHVle0FTfX0gc291cmNlLCByZWZlciB0byBpdCBieSBjb250ZXh0LCBub3QKLWJ5IGxpbmUgbnVtYmVyLgotCi1UaGUgbGluZSBudW1iZXJzIGluIG91ciBkZXZlbG9wbWVudCBzb3VyY2VzIHdpbGwgbm90IG1hdGNoIHRob3NlIGluIHlvdXIKLXNvdXJjZXMuICBZb3VyIGxpbmUgbnVtYmVycyB3b3VsZCBjb252ZXkgbm8gdXNlZnVsIGluZm9ybWF0aW9uIHRvIHVzLgotQGVuZCBpdGVtaXplCi0KLUhlcmUgYXJlIHNvbWUgdGhpbmdzIHRoYXQgYXJlIG5vdCBuZWNlc3Nhcnk6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHRoZSBlbnZlbG9wZSBvZiB0aGUgYnVnLgotCi1PZnRlbiBwZW9wbGUgd2hvIGVuY291bnRlciBhIGJ1ZyBzcGVuZCBhIGxvdCBvZiB0aW1lIGludmVzdGlnYXRpbmcKLXdoaWNoIGNoYW5nZXMgdG8gdGhlIGlucHV0IGZpbGUgd2lsbCBtYWtlIHRoZSBidWcgZ28gYXdheSBhbmQgd2hpY2gKLWNoYW5nZXMgd2lsbCBub3QgYWZmZWN0IGl0LgotCi1UaGlzIGlzIG9mdGVuIHRpbWUgY29uc3VtaW5nIGFuZCBub3QgdmVyeSB1c2VmdWwsIGJlY2F1c2UgdGhlIHdheSB3ZQotd2lsbCBmaW5kIHRoZSBidWcgaXMgYnkgcnVubmluZyBhIHNpbmdsZSBleGFtcGxlIHVuZGVyIHRoZSBkZWJ1Z2dlcgotd2l0aCBicmVha3BvaW50cywgbm90IGJ5IHB1cmUgZGVkdWN0aW9uIGZyb20gYSBzZXJpZXMgb2YgZXhhbXBsZXMuCi1XZSByZWNvbW1lbmQgdGhhdCB5b3Ugc2F2ZSB5b3VyIHRpbWUgZm9yIHNvbWV0aGluZyBlbHNlLgotCi1PZiBjb3Vyc2UsIGlmIHlvdSBjYW4gZmluZCBhIHNpbXBsZXIgZXhhbXBsZSB0byByZXBvcnQgQGVtcGh7aW5zdGVhZH0KLW9mIHRoZSBvcmlnaW5hbCBvbmUsIHRoYXQgaXMgYSBjb252ZW5pZW5jZSBmb3IgdXMuICBFcnJvcnMgaW4gdGhlCi1vdXRwdXQgd2lsbCBiZSBlYXNpZXIgdG8gc3BvdCwgcnVubmluZyB1bmRlciB0aGUgZGVidWdnZXIgd2lsbCB0YWtlCi1sZXNzIHRpbWUsIGFuZCBzbyBvbi4KLQotSG93ZXZlciwgc2ltcGxpZmljYXRpb24gaXMgbm90IHZpdGFsOyBpZiB5b3UgZG8gbm90IHdhbnQgdG8gZG8gdGhpcywKLXJlcG9ydCB0aGUgYnVnIGFueXdheSBhbmQgc2VuZCB1cyB0aGUgZW50aXJlIHRlc3QgY2FzZSB5b3UgdXNlZC4KLQotQGl0ZW0KLUEgcGF0Y2ggZm9yIHRoZSBidWcuCi0KLUEgcGF0Y2ggZm9yIHRoZSBidWcgZG9lcyBoZWxwIHVzIGlmIGl0IGlzIGEgZ29vZCBvbmUuICBCdXQgZG8gbm90IG9taXQKLXRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHRlc3QgY2FzZSwgb24gdGhlIGFzc3VtcHRpb24gdGhhdAotYSBwYXRjaCBpcyBhbGwgd2UgbmVlZC4gIFdlIG1pZ2h0IHNlZSBwcm9ibGVtcyB3aXRoIHlvdXIgcGF0Y2ggYW5kIGRlY2lkZQotdG8gZml4IHRoZSBwcm9ibGVtIGFub3RoZXIgd2F5LCBvciB3ZSBtaWdodCBub3QgdW5kZXJzdGFuZCBpdCBhdCBhbGwuCi0KLVNvbWV0aW1lcyB3aXRoIGEgcHJvZ3JhbSBhcyBjb21wbGljYXRlZCBhcyBAY29kZXtAdmFsdWV7QVN9fSBpdCBpcyB2ZXJ5IGhhcmQgdG8KLWNvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhIGNlcnRhaW4gcGF0aCB0aHJvdWdoCi10aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2Ugd2lsbCBub3QgYmUgYWJsZSB0byBjb25zdHJ1Y3QKLW9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdCB0aGUgYnVnIGlzIGZpeGVkLgotCi1BbmQgaWYgd2UgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCBidWcgeW91IGFyZSB0cnlpbmcgdG8gZml4LCBvciB3aHkgeW91cgotcGF0Y2ggc2hvdWxkIGJlIGFuIGltcHJvdmVtZW50LCB3ZSB3aWxsIG5vdCBpbnN0YWxsIGl0LiAgQSB0ZXN0IGNhc2Ugd2lsbAotaGVscCB1cyB0byB1bmRlcnN0YW5kLgotCi1AaXRlbQotQSBndWVzcyBhYm91dCB3aGF0IHRoZSBidWcgaXMgb3Igd2hhdCBpdCBkZXBlbmRzIG9uLgotCi1TdWNoIGd1ZXNzZXMgYXJlIHVzdWFsbHkgd3JvbmcuICBFdmVuIHdlIGNhbm5vdCBndWVzcyByaWdodCBhYm91dCBzdWNoCi10aGluZ3Mgd2l0aG91dCBmaXJzdCB1c2luZyB0aGUgZGVidWdnZXIgdG8gZmluZCB0aGUgZmFjdHMuCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgQWNrbm93bGVkZ2VtZW50cwotQGNoYXB0ZXIgQWNrbm93bGVkZ2VtZW50cwotCi1JZiB5b3UgaGF2ZSBjb250cmlidXRlZCB0byBAY29kZXtAdmFsdWV7QVN9fSBhbmQgeW91ciBuYW1lIGlzbid0IGxpc3RlZCBoZXJlLAotaXQgaXMgbm90IG1lYW50IGFzIGEgc2xpZ2h0LiAgV2UganVzdCBkb24ndCBrbm93IGFib3V0IGl0LiAgU2VuZCBtYWlsIHRvIHRoZQotbWFpbnRhaW5lciwgYW5kIHdlJ2xsIGNvcnJlY3QgdGhlIHNpdHVhdGlvbi4gIEN1cnJlbnRseSAKLUBjIChKYW51YXJ5IDE5OTQpLCAKLXRoZSBtYWludGFpbmVyIGlzIEtlbiBSYWVidXJuIChlbWFpbCBhZGRyZXNzIEBjb2Rle3JhZWJ1cm5AQGN5Z251cy5jb219KS4KLQotRGVhbiBFbHNuZXIgd3JvdGUgdGhlIG9yaWdpbmFsIEBzY3tnbnV9IGFzc2VtYmxlciBmb3IgdGhlIFZBWC5AZm9vdG5vdGV7QW55Ci1tb3JlIGRldGFpbHM/fQotCi1KYXkgRmVubGFzb24gbWFpbnRhaW5lZCBHQVMgZm9yIGEgd2hpbGUsIGFkZGluZyBzdXBwb3J0IGZvciBHREItc3BlY2lmaWMgZGVidWcKLWluZm9ybWF0aW9uIGFuZCB0aGUgNjhrIHNlcmllcyBtYWNoaW5lcywgbW9zdCBvZiB0aGUgcHJlcHJvY2Vzc2luZyBwYXNzLCBhbmQKLWV4dGVuc2l2ZSBjaGFuZ2VzIGluIEBmaWxle21lc3NhZ2VzLmN9LCBAZmlsZXtpbnB1dC1maWxlLmN9LCBAZmlsZXt3cml0ZS5jfS4KLQotSy4gUmljaGFyZCBQaXhsZXkgbWFpbnRhaW5lZCBHQVMgZm9yIGEgd2hpbGUsIGFkZGluZyB2YXJpb3VzIGVuaGFuY2VtZW50cyBhbmQKLW1hbnkgYnVnIGZpeGVzLCBpbmNsdWRpbmcgbWVyZ2luZyBzdXBwb3J0IGZvciBzZXZlcmFsIHByb2Nlc3NvcnMsIGJyZWFraW5nIEdBUwotdXAgdG8gaGFuZGxlIG11bHRpcGxlIG9iamVjdCBmaWxlIGZvcm1hdCBiYWNrIGVuZHMgKGluY2x1ZGluZyBoZWF2eSByZXdyaXRlLAotdGVzdGluZywgYW4gaW50ZWdyYXRpb24gb2YgdGhlIGNvZmYgYW5kIGIub3V0IGJhY2sgZW5kcyksIGFkZGluZyBjb25maWd1cmF0aW9uCi1pbmNsdWRpbmcgaGVhdnkgdGVzdGluZyBhbmQgdmVyaWZpY2F0aW9uIG9mIGNyb3NzIGFzc2VtYmxlcnMgYW5kIGZpbGUgc3BsaXRzCi1hbmQgcmVuYW1pbmcsIGNvbnZlcnRlZCBHQVMgdG8gc3RyaWN0bHkgQU5TSSBDIGluY2x1ZGluZyBmdWxsIHByb3RvdHlwZXMsIGFkZGVkCi1zdXBwb3J0IGZvciBtNjgwWzM0XTAgYW5kIGNwdTMyLCBkaWQgY29uc2lkZXJhYmxlIHdvcmsgb24gaTk2MCBpbmNsdWRpbmcgYSBDT0ZGCi1wb3J0IChpbmNsdWRpbmcgY29uc2lkZXJhYmxlIGFtb3VudHMgb2YgcmV2ZXJzZSBlbmdpbmVlcmluZyksIGEgU1BBUkMgb3Bjb2RlCi1maWxlIHJld3JpdGUsIERFQ3N0YXRpb24sIHJzNjAwMCwgYW5kIGhwMzAwaHB1eCBob3N0IHBvcnRzLCB1cGRhdGVkIGBga25vdycnCi1hc3NlcnRpb25zIGFuZCBtYWRlIHRoZW0gd29yaywgbXVjaCBvdGhlciByZW9yZ2FuaXphdGlvbiwgY2xlYW51cCwgYW5kIGxpbnQuCi0KLUtlbiBSYWVidXJuIHdyb3RlIHRoZSBoaWdoLWxldmVsIEJGRCBpbnRlcmZhY2UgY29kZSB0byByZXBsYWNlIG1vc3Qgb2YgdGhlIGNvZGUKLWluIGZvcm1hdC1zcGVjaWZpYyBJL08gbW9kdWxlcy4KLQotVGhlIG9yaWdpbmFsIFZNUyBzdXBwb3J0IHdhcyBjb250cmlidXRlZCBieSBEYXZpZCBMLiBLYXNodGFuLiAgRXJpYyBZb3VuZ2RhbGUKLWhhcyBkb25lIG11Y2ggd29yayB3aXRoIGl0IHNpbmNlLgotCi1UaGUgSW50ZWwgODAzODYgbWFjaGluZSBkZXNjcmlwdGlvbiB3YXMgd3JpdHRlbiBieSBFbGlvdCBEcmVzc2VsaGF1cy4KLQotTWluaCBUcmFuLUxlIGF0IEludGVsbGlDb3JwIGNvbnRyaWJ1dGVkIHNvbWUgQUlYIDM4NiBzdXBwb3J0LgotCi1UaGUgTW90b3JvbGEgODhrIG1hY2hpbmUgZGVzY3JpcHRpb24gd2FzIGNvbnRyaWJ1dGVkIGJ5IERldm9uIEJvd2VuIG9mIEJ1ZmZhbG8KLVVuaXZlcnNpdHkgYW5kIFRvcmJqb3JuIEdyYW5sdW5kIG9mIHRoZSBTd2VkaXNoIEluc3RpdHV0ZSBvZiBDb21wdXRlciBTY2llbmNlLgotCi1LZWl0aCBLbm93bGVzIGF0IHRoZSBPcGVuIFNvZnR3YXJlIEZvdW5kYXRpb24gd3JvdGUgdGhlIG9yaWdpbmFsIE1JUFMgYmFjayBlbmQKLShAZmlsZXt0Yy1taXBzLmN9LCBAZmlsZXt0Yy1taXBzLmh9KSwgYW5kIGNvbnRyaWJ1dGVkIFJvc2UgZm9ybWF0IHN1cHBvcnQKLSh3aGljaCBoYXNuJ3QgYmVlbiBtZXJnZWQgaW4geWV0KS4gIFJhbHBoIENhbXBiZWxsIHdvcmtlZCB3aXRoIHRoZSBNSVBTIGNvZGUgdG8KLXN1cHBvcnQgYS5vdXQgZm9ybWF0LgotCi1TdXBwb3J0IGZvciB0aGUgWmlsb2cgWjhrIGFuZCBIaXRhY2hpIEg4LzMwMCBhbmQgSDgvNTAwIHByb2Nlc3NvcnMgKHRjLXo4aywKLXRjLWg4MzAwLCB0Yy1oODUwMCksIGFuZCBJRUVFIDY5NSBvYmplY3QgZmlsZSBmb3JtYXQgKG9iai1pZWVlKSwgd2FzIHdyaXR0ZW4gYnkKLVN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LiAgU3RldmUgYWxzbyBtb2RpZmllZCB0aGUgQ09GRiBiYWNrIGVuZCB0bwotdXNlIEJGRCBmb3Igc29tZSBsb3ctbGV2ZWwgb3BlcmF0aW9ucywgZm9yIHVzZSB3aXRoIHRoZSBIOC8zMDAgYW5kIEFNRCAyOWsKLXRhcmdldHMuCi0KLUpvaG4gR2lsbW9yZSBidWlsdCB0aGUgQU1EIDI5MDAwIHN1cHBvcnQsIGFkZGVkIEBjb2Rley5pbmNsdWRlfSBzdXBwb3J0LCBhbmQKLXNpbXBsaWZpZWQgdGhlIGNvbmZpZ3VyYXRpb24gb2Ygd2hpY2ggdmVyc2lvbnMgYWNjZXB0IHdoaWNoIGRpcmVjdGl2ZXMuICBIZQotdXBkYXRlZCB0aGUgNjhrIG1hY2hpbmUgZGVzY3JpcHRpb24gc28gdGhhdCBNb3Rvcm9sYSdzIG9wY29kZXMgYWx3YXlzIHByb2R1Y2VkCi1maXhlZC1zaXplIGluc3RydWN0aW9ucyAoZS5nLiBAY29kZXtqc3J9KSwgd2hpbGUgc3ludGhldGljIGluc3RydWN0aW9ucwotcmVtYWluZWQgc2hyaW5rYWJsZSAoQGNvZGV7amJzcn0pLiAgSm9obiBmaXhlZCBtYW55IGJ1Z3MsIGluY2x1ZGluZyB0cnVlIHRlc3RlZAotY3Jvc3MtY29tcGlsYXRpb24gc3VwcG9ydCwgYW5kIG9uZSBidWcgaW4gcmVsYXhhdGlvbiB0aGF0IHRvb2sgYSB3ZWVrIGFuZAotcmVxdWlyZWQgdGhlIHByb3ZlcmJpYWwgb25lLWJpdCBmaXguCi0KLUlhbiBMYW5jZSBUYXlsb3Igb2YgQ3lnbnVzIFN1cHBvcnQgbWVyZ2VkIHRoZSBNb3Rvcm9sYSBhbmQgTUlUIHN5bnRheCBmb3IgdGhlCi02OGssIGNvbXBsZXRlZCBzdXBwb3J0IGZvciBzb21lIENPRkYgdGFyZ2V0cyAoNjhrLCBpMzg2IFNWUjMsIGFuZCBTQ08gVW5peCksCi1hZGRlZCBzdXBwb3J0IGZvciBNSVBTIEVDT0ZGIGFuZCBFTEYgdGFyZ2V0cywgd3JvdGUgdGhlIGluaXRpYWwgUlMvNjAwMCBhbmQKLVBvd2VyUEMgYXNzZW1ibGVyLCBhbmQgbWFkZSBhIGZldyBvdGhlciBtaW5vciBwYXRjaGVzLgotCi1TdGV2ZSBDaGFtYmVybGFpbiBtYWRlIEBjb2Rle0B2YWx1ZXtBU319IGFibGUgdG8gZ2VuZXJhdGUgbGlzdGluZ3MuCi0KLUhld2xldHQtUGFja2FyZCBjb250cmlidXRlZCBzdXBwb3J0IGZvciB0aGUgSFA5MDAwLzMwMC4KLQotSmVmZiBMYXcgd3JvdGUgR0FTIGFuZCBCRkQgc3VwcG9ydCBmb3IgdGhlIG5hdGl2ZSBIUFBBIG9iamVjdCBmb3JtYXQgKFNPTSkKLWFsb25nIHdpdGggYSBmYWlybHkgZXh0ZW5zaXZlIEhQUEEgdGVzdHN1aXRlIChmb3IgYm90aCBTT00gYW5kIEVMRiBvYmplY3QKLWZvcm1hdHMpLiAgVGhpcyB3b3JrIHdhcyBzdXBwb3J0ZWQgYnkgYm90aCB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0Ci10aGUgVW5pdmVyc2l0eSBvZiBVdGFoIGFuZCBDeWdudXMgU3VwcG9ydC4KLQotU3VwcG9ydCBmb3IgRUxGIGZvcm1hdCBmaWxlcyBoYXMgYmVlbiB3b3JrZWQgb24gYnkgTWFyayBFaWNoaW4gb2YgQ3lnbnVzCi1TdXBwb3J0IChvcmlnaW5hbCwgaW5jb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgU1BBUkMpLCBQZXRlIEhvb2dlbmJvb20gYW5kCi1KZWZmIExhdyBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoIChIUFBBIG1haW5seSksIE1pY2hhZWwgTWVpc3NuZXIgb2YgdGhlIE9wZW4KLVNvZnR3YXJlIEZvdW5kYXRpb24gKGkzODYgbWFpbmx5KSwgYW5kIEtlbiBSYWVidXJuIG9mIEN5Z251cyBTdXBwb3J0IChzcGFyYywKLWFuZCBzb21lIGluaXRpYWwgNjQtYml0IHN1cHBvcnQpLgotCi1SaWNoYXJkIEhlbmRlcnNvbiByZXdyb3RlIHRoZSBBbHBoYSBhc3NlbWJsZXIuIEtsYXVzIEthZW1wZiB3cm90ZSBHQVMgYW5kIEJGRAotc3VwcG9ydCBmb3Igb3BlblZNUy9BbHBoYS4KLQotU2V2ZXJhbCBlbmdpbmVlcnMgYXQgQ3lnbnVzIFN1cHBvcnQgaGF2ZSBhbHNvIHByb3ZpZGVkIG1hbnkgc21hbGwgYnVnIGZpeGVzIGFuZAotY29uZmlndXJhdGlvbiBlbmhhbmNlbWVudHMuCi0KLU1hbnkgb3RoZXJzIGhhdmUgY29udHJpYnV0ZWQgbGFyZ2Ugb3Igc21hbGwgYnVnZml4ZXMgYW5kIGVuaGFuY2VtZW50cy4gIElmCi15b3UgaGF2ZSBjb250cmlidXRlZCBzaWduaWZpY2FudCB3b3JrIGFuZCBhcmUgbm90IG1lbnRpb25lZCBvbiB0aGlzIGxpc3QsIGFuZAotd2FudCB0byBiZSwgbGV0IHVzIGtub3cuICBTb21lIG9mIHRoZSBoaXN0b3J5IGhhcyBiZWVuIGxvc3Q7IHdlIGFyZSBub3QKLWludGVudGlvbmFsbHkgbGVhdmluZyBhbnlvbmUgb3V0LgotCi1Abm9kZSBJbmRleAotQHVubnVtYmVyZWQgSW5kZXgKLQotQHByaW50aW5kZXggY3AKLQotQGNvbnRlbnRzCi1AYnllCi1AYyBMb2NhbCBWYXJpYWJsZXM6Ci1AYyBmaWxsLWNvbHVtbjogNzkKLUBjIEVuZDoKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1hMjlrLnRleGkgYi9nYXMvZG9jL2MtYTI5ay50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDExNWQ4Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1hMjlrLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEFNRDI5Sy1EZXBlbmRlbnQKLUBjaGFwdGVyIEFNRCAyOUsgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgQU1EIDI5SyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IEFNRCAyOUsgc3VwcG9ydAotQGNpbmRleCAyOUsgc3VwcG9ydAotQG1lbnUKLSogQU1EMjlLIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBBTUQyOUsgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogQU1EMjlLIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogQU1EMjlLIERpcmVjdGl2ZXM6OiAgICAgICAgICAgQU1EIDI5SyBNYWNoaW5lIERpcmVjdGl2ZXMKLSogQU1EMjlLIE9wY29kZXM6OiAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEFNRDI5SyBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY2luZGV4IEFNRCAyOUsgb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucyBmb3IgQU1EMjlLIChub25lKQotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBBTUQKLTI5SyBmYW1pbHkuCi0KLUBub2RlIEFNRDI5SyBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQG1lbnUKLSogQU1EMjlLLU1hY3Jvczo6CQlNYWNyb3MKLSogQU1EMjlLLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEFNRDI5Sy1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQU1EMjlLLU1hY3JvcwotQHN1YnNlY3Rpb24gTWFjcm9zCi0KLUBjaW5kZXggTWFjcm9zLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgbWFjcm9zCi1UaGUgbWFjcm8gc3ludGF4IHVzZWQgb24gdGhlIEFNRCAyOUsgaXMgbGlrZSB0aGF0IGRlc2NyaWJlZCBpbiB0aGUgQU1ECi0yOUsgRmFtaWx5IE1hY3JvIEFzc2VtYmxlciBTcGVjaWZpY2F0aW9uLiAgTm9ybWFsIEBjb2Rle0B2YWx1ZXtBU319Ci1tYWNyb3Mgc2hvdWxkIHN0aWxsIHdvcmsuCi0KLUBub2RlIEFNRDI5Sy1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgQU1EIDI5SwotQGNpbmRleCBBTUQgMjlLIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1wezt9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1AY2luZGV4IGlkZW50aWZpZXJzLCBBTUQgMjlLCi1AY2luZGV4IEFNRCAyOUsgaWRlbnRpZmllcnMKLVRoZSBjaGFyYWN0ZXIgQHNhbXB7P30gaXMgcGVybWl0dGVkIGluIGlkZW50aWZpZXJzIChidXQgbWF5IG5vdCBiZWdpbgotYW4gaWRlbnRpZmllcikuCi0KLUBub2RlIEFNRDI5Sy1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IEFNRCAyOUsgcmVnaXN0ZXIgbmFtZXMKLUBjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIEFNRCAyOUsKLUdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMgYXJlIHJlcHJlc2VudGVkIGJ5IHByZWRlZmluZWQgc3ltYm9scyBvZiB0aGUKLWZvcm0gQHNhbXB7R1JAdmFye25ubn19IChmb3IgZ2xvYmFsIHJlZ2lzdGVycykgb3IgQHNhbXB7TFJAdmFye25ubn19Ci0oZm9yIGxvY2FsIHJlZ2lzdGVycyksIHdoZXJlIEB2YXJ7bm5ufSByZXByZXNlbnRzIGEgbnVtYmVyIGJldHdlZW4KLUBjb2RlezB9IGFuZCBAY29kZXsxMjd9LCB3cml0dGVuIHdpdGggbm8gbGVhZGluZyB6ZXJvcy4gIFRoZSBsZWFkaW5nCi1sZXR0ZXJzIG1heSBiZSBpbiBlaXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZTsgZm9yIGV4YW1wbGUsIEBzYW1we2dyMTN9Ci1hbmQgQHNhbXB7TFI3fSBhcmUgYm90aCB2YWxpZCByZWdpc3RlciBuYW1lcy4KLQotWW91IG1heSBhbHNvIHJlZmVyIHRvIGdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMgYnkgc3BlY2lmeWluZyB0aGUKLXJlZ2lzdGVyIG51bWJlciBhcyB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gKHByZWZpeGVkIHdpdGggQHNhbXB7JSV9Ci10byBmbGFnIHRoZSBleHByZXNzaW9uIGFzIGEgcmVnaXN0ZXIgbnVtYmVyKToKLUBzbWFsbGV4YW1wbGUKLSUlQHZhcntleHByZXNzaW9ufQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotLS0td2hlcmUgQHZhcntleHByZXNzaW9ufSBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBhCi1udW1iZXIgYmV0d2VlbiBAY29kZXswfSBhbmQgQGNvZGV7MjU1fS4gIFRoZSByYW5nZSBbMCwgMTI3XSByZWZlcnMgdG8KLWdsb2JhbCByZWdpc3RlcnMsIGFuZCB0aGUgcmFuZ2UgWzEyOCwgMjU1XSB0byBsb2NhbCByZWdpc3RlcnMuCi0KLUBjaW5kZXggc3BlY2lhbCBwdXJwb3NlIHJlZ2lzdGVycywgQU1EIDI5SwotQGNpbmRleCBBTUQgMjlLIHNwZWNpYWwgcHVycG9zZSByZWdpc3RlcnMKLUBjaW5kZXggcHJvdGVjdGVkIHJlZ2lzdGVycywgQU1EIDI5SwotQGNpbmRleCBBTUQgMjlLIHByb3RlY3RlZCByZWdpc3RlcnMKLUluIGFkZGl0aW9uLCBAY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIHByb3RlY3RlZAotc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyIG5hbWVzIGZvciB0aGUgQU1EIDI5SyBmYW1pbHk6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgdmFiICAgIGNoZCAgICBwYzAKLSAgb3BzICAgIGNoYyAgICBwYzEKLSAgY3BzICAgIHJicCAgICBwYzIKLSAgY2ZnICAgIHRtYyAgICBtbXUKLSAgY2hhICAgIHRtciAgICBscnUKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZXNlIHVucHJvdGVjdGVkIHNwZWNpYWwtcHVycG9zZSByZWdpc3RlciBuYW1lcyBhcmUgYWxzbyByZWNvZ25pemVkOgotQHNtYWxsZXhhbXBsZQotICBpcGMgICAgYWx1ICAgIGZwZQotICBpcGEgICAgYnAgICAgIGludGUKLSAgaXBiICAgIGZjICAgICBmcHMKLSAgcSAgICAgIGNyICAgICBleG9wCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBBTUQyOUsgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEFNRCAyOUsgKEBzY3tpZWVlfSkKLUBjaW5kZXggQU1EIDI5SyBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEFNRCAyOUsgZmFtaWx5IHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0KLUBub2RlIEFNRDI5SyBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBBTUQgMjlLIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgQU1EIDI5SwotQGNpbmRleCBBTUQgMjlLIG1hY2hpbmUgZGlyZWN0aXZlcwotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2Jsb2NrfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5ibG9jayBAdmFye3NpemV9ICwgQHZhcntmaWxsfQotVGhpcyBkaXJlY3RpdmUgZW1pdHMgQHZhcntzaXplfSBieXRlcywgZWFjaCBvZiB2YWx1ZSBAdmFye2ZpbGx9LiAgQm90aAotQHZhcntzaXplfSBhbmQgQHZhcntmaWxsfSBhcmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuICBJZiB0aGUgY29tbWEKLWFuZCBAdmFye2ZpbGx9IGFyZSBvbWl0dGVkLCBAdmFye2ZpbGx9IGlzIGFzc3VtZWQgdG8gYmUgemVyby4KLQotSW4gb3RoZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IGFzc2VtYmxlciwgdGhpcyBkaXJlY3RpdmUgaXMgY2FsbGVkCi1Ac2FtcHsuc3BhY2V9LgotQGVuZCB0YWJsZQotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7Y3B1dHlwZX0gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAuY3B1dHlwZQotVGhpcyBkaXJlY3RpdmUgaXMgaWdub3JlZDsgaXQgaXMgYWNjZXB0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlcgotQU1EIDI5SyBhc3NlbWJsZXJzLgotCi1AY2luZGV4IEBjb2Rle2ZpbGV9IGRpcmVjdGl2ZSwgQU1EIDI5SwotQGl0ZW0gLmZpbGUKLVRoaXMgZGlyZWN0aXZlIGlzIGlnbm9yZWQ7IGl0IGlzIGFjY2VwdGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIKLUFNRCAyOUsgYXNzZW1ibGVycy4KLQotQHF1b3RhdGlvbgotQGVtcGh7V2FybmluZzp9IGluIG90aGVyIHZlcnNpb25zIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIsIEBjb2Rley5maWxlfSBpcwotdXNlZCBmb3IgdGhlIGRpcmVjdGl2ZSBjYWxsZWQgQGNvZGV7LmFwcC1maWxlfSBpbiB0aGUgQU1EIDI5SyBzdXBwb3J0LgotQGVuZCBxdW90YXRpb24KLQotQGNpbmRleCBAY29kZXtsaW5lfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5saW5lCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1BTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBpZ25vcmUKLUBjIHNpbmNlIHdlJ3JlIGlnbm9yaW5nIC5sc3ltLi4uCi1AY2luZGV4IEBjb2Rle3JlZ30gZGlyZWN0aXZlLCBBTUQgMjlLCi1AaXRlbSAucmVnIEB2YXJ7c3ltYm9sfSwgQHZhcntleHByZXNzaW9ufQotQGNvZGV7LnJlZ30gaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBAY29kZXsubHN5bX07IEBweHJlZntMc3ltLCxAY29kZXsubHN5bX19LgotQGVuZCBpZ25vcmUKLQotQGNpbmRleCBAY29kZXtzZWN0fSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC5zZWN0Ci1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkOyBpdCBpcyBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi1BTUQgMjlLIGFzc2VtYmxlcnMuCi0KLUBjaW5kZXggQGNvZGV7dXNlfSBkaXJlY3RpdmUsIEFNRCAyOUsKLUBpdGVtIC51c2UgQHZhcntzZWN0aW9uIG5hbWV9Ci1Fc3RhYmxpc2hlcyB0aGUgc2VjdGlvbiBhbmQgc3Vic2VjdGlvbiBmb3IgdGhlIGZvbGxvd2luZyBjb2RlOwotQHZhcntzZWN0aW9uIG5hbWV9IG1heSBiZSBvbmUgb2YgQGNvZGV7LnRleHR9LCBAY29kZXsuZGF0YX0sCi1AY29kZXsuZGF0YTF9LCBvciBAY29kZXsubGl0fS4gIFdpdGggb25lIG9mIHRoZSBmaXJzdCB0aHJlZSBAdmFye3NlY3Rpb24KLW5hbWV9IG9wdGlvbnMsIEBzYW1wey51c2V9IGlzIGVxdWl2YWxlbnQgdG8gdGhlIG1hY2hpbmUgZGlyZWN0aXZlCi1AdmFye3NlY3Rpb24gbmFtZX07IHRoZSByZW1haW5pbmcgY2FzZSwgQHNhbXB7LnVzZSAubGl0fSwgaXMgdGhlIHNhbWUgYXMKLUBzYW1wey5kYXRhIDIwMH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEFNRDI5SyBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggQU1EIDI5SyBvcGNvZGVzCi1AY2luZGV4IG9wY29kZXMgZm9yIEFNRCAyOUsKLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBBTUQgMjlLIG9wY29kZXMuICBObwotYWRkaXRpb25hbCBwc2V1ZG8taW5zdHJ1Y3Rpb25zIGFyZSBuZWVkZWQgb24gdGhpcyBmYW1pbHkuCi0KLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgMjlLIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUgQGNpdGV7QW0yOTAwMAotVXNlcidzIE1hbnVhbH0sIEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWFybS50ZXhpIGIvZ2FzL2RvYy9jLWFybS50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTRmYjJhLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1hcm0udGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLQotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBBUk0tRGVwZW5kZW50Ci1AY2hhcHRlciBBUk0gRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci0KLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBBUk0gRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBBUk0gc3VwcG9ydAotQGNpbmRleCBUaHVtYiBzdXBwb3J0Ci1AbWVudQotKiBBUk0gT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEFSTSBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBBUk0gRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBBUk0gRGlyZWN0aXZlczo6ICAgICAgICAgICBBUk0gTWFjaGluZSBEaXJlY3RpdmVzCi0qIEFSTSBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBBUk0gT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotQGNpbmRleCBBUk0gb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucyBmb3IgQVJNIChub25lKQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rley1tYXJtfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYXJtIEB2YXJ7WzJ8MjUwfDN8Nnw2MHw2MDB8NjEwfDYyMHw3fDdtfDdkfDdkbXw3ZGl8N2RtaXw3MHw3MDB8NzAwaXw3MTB8NzEwY3w3MTAwfDc1MDB8NzUwMGZlfDd0ZG1pfDh8ODEwfDl8OXRkbWlzdHJvbmdhcm18c3Ryb25nYXJtMTEwfHN0cm9uZ2FybTExMDBdfQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoZSB0YXJnZXQgcHJvY2Vzc29yLiAgVGhlIGFzc2VtYmxlciB3aWxsIGlzc3VlIGFuCi1lcnJvciBtZXNzYWdlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhc3NlbWJsZSBhbiBpbnN0cnVjdGlvbiB3aGljaAotd2lsbCBub3QgZXhlY3V0ZSBvbiB0aGUgdGFyZ2V0IHByb2Nlc3Nvci4KLUBjaW5kZXggQGNvZGV7LW1hcm12fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYXJtdiBAdmFye1syfDJhfDN8M218NHw0dF19Ci1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuICBUaGUgYXNzZW1ibGVyIHdpbGwgaXNzdWUKLWFuIGVycm9yIG1lc3NhZ2UgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGFzc2VtYmxlIGFuIGluc3RydWN0aW9uIHdoaWNoCi13aWxsIG5vdCBleGVjdXRlIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgotQGNpbmRleCBAY29kZXstbXRodW1ifSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tdGh1bWIKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IG9ubHkgVGh1bWIgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBhc3NlbWJsZWQuCi1AY2luZGV4IEBjb2Rley1tYWxsfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tYWxsCi1UaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhhdCBhbnkgQXJtIG9yIFRodW1iIGluc3RydWN0aW9uIHNob3VsZCBiZSBhc3NlbWJsZWQuCi1AY2luZGV4IEBjb2Rley1tZnBhfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1tZnBhIEB2YXJ7WzEwfDExXX0KLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGUgZmxvYXRpbmcgcG9pbnQgYXJjaGl0ZWN0dXJlIGluIHVzZSBvbiB0aGUKLXRhcmdldCBwcm9jZXNzb3IuIAotQGNpbmRleCBAY29kZXstbWZwZS1vbGR9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1mcGUtb2xkCi1EbyBub3QgYWxsb3cgdGhlIGFzc2VtYmxlIG9mIGZsb2F0aW5nIHBvaW50IG11bHRpcGxlIGluc3RydWN0aW9ucy4KLUBjaW5kZXggQGNvZGV7LW1uby1mcHV9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW1uby1mcHUKLURvIG5vdCBhbGxvdyB0aGUgYXNzZW1ibHkgb2YgYW55IGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4KLUBjaW5kZXggQGNvZGV7LW10aHVtYi1pbnRlcndvcmt9IGNvbW1hbmQgbGluZSBvcHRpb24sIEFSTQotQGl0ZW0gLW10aHVtYi1pbnRlcndvcmsKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgc2hvdWxkCi1iZSBtYXJrZWQgYXMgc3VwcG9ydGluZyBpbnRlcndvcmtpbmcuCi1AY2luZGV4IEBjb2Rley1tYXBjc30gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtbWFwY3MgQHZhcntbMjZ8MzJdfQotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBzdXBwb3J0aW5nIHRoZSBpbmRpY2F0ZWQgdmVyc2lvbiBvZiB0aGUgQXJtIFByb2NlZHVyZS4KLUNhbGxpbmcgU3RhbmRhcmQuCi1AaXRlbSAtbWFwY3MtZmxvYXQKLVRoaXMgaW5kaWNhdGVzIHRoZSB0aGUgZmxvYXRpbmcgcG9pbnQgdmFyaWFudCBvZiB0aGUgQVBDUyBzaG91bGQgYmUKLXVzZWQuICBJbiB0aGlzIHZhcmlhbnQgZmxvYXRpbmcgcG9pbnQgYXJndW1lbnRzIGFyZSBwYXNzZWQgaW4gRlAKLXJlZ2lzdGVycyByYXRlaHIgdGhhbiBpbnRlZ2VyIHJlZ2lzdGVycy4KLUBpdGVtIC1tYXBjcy1yZWVudHJhbnQKLVRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHJlZW50cmFudCB2YXJpYW50IG9mIHRoZSBBUENTIHNob3VsZCBiZSB1c2VkLgotVGhpcyB2YXJpYW50IHN1cHBvcnRzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUuCi1AY2luZGV4IEBjb2Rley1FQn0gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AaXRlbSAtRUIKLVRoaXMgb3B0aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoZSBhc3NlbWJsZXIgc2hvdWxkCi1iZSBtYXJrZWQgYXMgYmVpbmcgZW5jb2RlZCBmb3IgYSBiaWctZW5kaWFuIHByb2Nlc3Nvci4KLUBjaW5kZXggQGNvZGV7LUVMfSBjb21tYW5kIGxpbmUgb3B0aW9uLCBBUk0KLUBpdGVtIC1FTAotVGhpcyBvcHRpb24gc3BlY2lmaWVzIHRoYXQgdGhlIG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciBzaG91bGQKLWJlIG1hcmtlZCBhcyBiZWluZyBlbmNvZGVkIGZvciBhIGxpdHRsZS1lbmRpYW4gcHJvY2Vzc29yLgotQGNpbmRleCBAY29kZXsta30gY29tbWFuZCBsaW5lIG9wdGlvbiwgQVJNCi1AY2luZGV4IFBJQyBjb2RlIGdlbmVyYXRpb24gZm9yIEFSTQotQGl0ZW0gLWsKLVRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgUElDIChwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlKS4KLUBpdGVtIC1tb2FiaQotVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29kZSBzaG91bGQgYmUgYXNzZW1ibGVkIHVzaW5nIHRoZSBvbGQgQVJNIEVMRgotY29udmVudGlvbnMsIGJhc2VkIG9uIGEgYmV0YSByZWxlYXNlIHJlbGVhc2Ugb2YgdGhlIEFSTS1FTEYKLXNwZWNpZmljYXRpb25zLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBjb252ZW50aW9ucyB3aGljaCBhcmUgYmFzZWQgb24KLXRoZSBmaW5hbCByZWxlYXNlIG9mIHRoZSBBUk0tRUxGIHNwZWNpZmljYXRpb25zLgotQGVuZCB0YWJsZQotCi0KLUBub2RlIEFSTSBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQG1lbnUKLSogQVJNLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEFSTS1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi1AZW5kIG1lbnUKLQotQG5vZGUgQVJNLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLCBBUk0KLUBjaW5kZXggQVJNIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLVRoZSBwcmVzZW5jZSBvZiBhIEBzYW1weyN9IGFuZCBAc2FtcHtAQH0gb24gYSBsaW5lIGluZGljYXRlcyB0aGUgc3RhcnQgb2YKLWEgY29tbWVudCB0aGF0IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaW5lLgotCi1AY2luZGV4IGlkZW50aWZpZXJzLCBBUk0KLUBjaW5kZXggQVJNIGlkZW50aWZpZXJzCi0qVE9ETyogRXhwbGFpbiBhYm91dCAvZGF0YSBtb2RpZmllciBvbiBzeW1ib2xzLgotCi1Abm9kZSBBUk0tUmVncwotQHN1YnNlY3Rpb24gUmVnaXN0ZXIgTmFtZXMKLQotQGNpbmRleCBBUk0gcmVnaXN0ZXIgbmFtZXMKLUBjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIEFSTQotKlRPRE8qIEV4cGxhaW4gYWJvdXQgQVJNIHJlZ2lzdGVyIG5hbWluZywgYW5kIHRoZSBwcmVkZWZpbmVkIG5hbWVzLgotCi1Abm9kZSBBUk0gRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEFSTSAoQHNje2llZWV9KQotQGNpbmRleCBBUk0gZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBBUk0gZmFtaWx5IHVzZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMuCi0KLQotCi1Abm9kZSBBUk0gRGlyZWN0aXZlcwotQHNlY3Rpb24gQVJNIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgQVJNCi1AY2luZGV4IEFSTSBtYWNoaW5lIGRpcmVjdGl2ZXMKLUB0YWJsZSBAY29kZQotCi1AY2luZGV4IEBjb2Rle3JlcX0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIEB2YXJ7bmFtZX0gLnJlcSBAdmFye3JlZ2lzdGVyIG5hbWV9Ci1UaGlzIGNyZWF0ZXMgYW4gYWxpYXMgZm9yIEB2YXJ7cmVnaXN0ZXIgbmFtZX0gY2FsbGVkIEB2YXJ7bmFtZX0uICBGb3IKLWV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgZm9vIC5yZXEgcjAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjaW5kZXggQGNvZGV7Y29kZX0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5jb2RlIEB2YXJ7WzE2fDMyXX0KLVRoaXMgZGlyZWN0aXZlIHNlbGVjdHMgdGhlIGluc3RydWN0aW9uIHNldCBiZWluZyBnZW5lcmF0ZWQuIFRoZSB2YWx1ZSAxNgotc2VsZWN0cyBUaHVtYiwgd2l0aCB0aGUgdmFsdWUgMzIgc2VsZWN0aW5nIEFSTS4KLQotQGNpbmRleCBAY29kZXt0aHVtYn0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC50aHVtYgotVGhpcyBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgQHZhcnsuY29kZSAxNn0uCi0KLUBjaW5kZXggQGNvZGV7YXJtfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLmFybQotVGhpcyBwZXJmb3JtcyB0aGUgc2FtZSBhY3Rpb24gYXMgQHZhcnsuY29kZSAzMn0uCi0KLUBjaW5kZXggQGNvZGV7Zm9yY2VfdGh1bWJ9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAuZm9yY2VfdGh1bWIKLVRoaXMgZGlyZWN0aXZlIGZvcmNlcyB0aGUgc2VsZWN0aW9uIG9mIFRodW1iIGluc3RydWN0aW9ucywgZXZlbiBpZiB0aGUKLXRhcmdldCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aG9zZSBpbnN0cnVjdGlvbnMKLQotQGNpbmRleCBAY29kZXt0aHVtYl9mdW5jfSBkaXJlY3RpdmUsIEFSTQotQGl0ZW0gLnRodW1iX2Z1bmMKLVRoaXMgZGlyZWN0aXZlIHNwZWNpZmllcyB0aGF0IHRoZSBmb2xsb3dpbmcgc3ltYm9sIGlzIHRoZSBuYW1lIG9mIGEKLVRodW1iIGVuY29kZWQgZnVuY3Rpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhbGxvdwotdGhlIGFzc2VtYmxlciBhbmQgbGlua2VyIHRvIGdlbmVyYXRlIGNvcnJlY3QgY29kZSBmb3IgaW50ZXJ3b3JraW5nCi1iZXR3ZWVuIEFybSBhbmQgVGh1bWIgaW5zdHJ1Y3Rpb25zIGFuZCBzaG91bGQgYmUgdXNlZCBldmVuIGlmCi1pbnRlcndvcmtpbmcgaXMgbm90IGdvaW5nIHRvIGJlIHBlcmZvcm1lZC4KLQotQGNpbmRleCBAY29kZXsubHRvcmd9IGRpcmVjdGl2ZSwgQVJNCi1AaXRlbSAubHRvcmcKLVRoaXMgZGlyZWN0aXZlIGNhdXNlcyB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgbGl0ZXJhbCBwb29sIHRvIGJlCi1kdW1wZWQgaW50byB0aGUgY3VycmVudCBzZWN0aW9uICh3aGljaCBpcyBhc3N1bWVkIHRvIGJlIHRoZSAudGV4dAotc2VjdGlvbikgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24gKGFsaWduZWQgdG8gYSB3b3JkIGJvdW5kYXJ5KS4KLQotQGNpbmRleCBAY29kZXsucG9vbH0gZGlyZWN0aXZlLCBBUk0KLUBpdGVtIC5wb29sCi1UaGlzIGlzIGEgc3lub255bSBmb3IgLmx0b3JnLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIEFSTSBPcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi0KLUBjaW5kZXggQVJNIG9wY29kZXMKLUBjaW5kZXggb3Bjb2RlcyBmb3IgQVJNCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgQVJNIG9wY29kZXMuCi0KLSpUT0RPKiBEb2N1bWVudCB0aGUgcHNldWRvLW9wcyAoYWRyLCBub3ApCi0KLUdBUyBmb3IgdGhlIEFSTSBzdXBwb3J0cyBhIHN5bnRoZXRpYyByZWdpc3RlciBsb2FkIGluc3RydWN0aW9uIHdob2VzCi1zeW50YXggaXM6IAotCi1Ac21hbGxleGFtcGxlCi0gIGxkciA8cmVnaXN0ZXI+ICwgPSA8ZXhwcmVzc2lvbj4KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGEgbnVtZXJpYyBjb25zdGFudCB0aGVuIGEgTU9WIG9yIE1WTgotaW5zdHJ1Y3Rpb24gd2lsbCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBMRFIgaW5zdHJ1Y3Rpb24sIGlmIHRoZQotY29uc3RhbnQgY2FuIGJlIGdlbmVyYXRlZCBieSBlaXRoZXIgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zLiAgT3RoZXJ3aXNlCi10aGUgY29uc3RhbnQgd2lsbCBiZSBwbGFjZWQgaW50byB0aGUgbmVhcmVzdCBsaXRlcmFsIHBvb2wgKGlmIGl0IG5vdAotYWxyZWFkeSB0aGVyZSkgYW5kIGEgUEMgcmVsYXRpdmUgTERSIGluc3RydWN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkLgotCi1Gb3IgaW5mb3JtYXRpb24gb24gdGhlIEFSTSBvciBUaHVtYiBpbnN0cnVjdGlvbiBzZXRzLCBzZWUgQGNpdGV7QVJNCi1Tb2Z0d2FyZSBEZXZlbG9wbWVudCBUb29sa2l0IFJlZmVyZW5jZSBNYW51YWx9LCBBZHZhbmNlZCBSSVNDIE1hY2hpbmVzCi1MdGQuCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1kMTB2LnRleGkgYi9nYXMvZG9jL2MtZDEwdi50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDdiZjg4Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1kMTB2LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIEQxMFYtRGVwZW5kZW50Ci1AY2hhcHRlciBEMTBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIEQxMFYgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBEMTBWIHN1cHBvcnQKLUBtZW51Ci0qIEQxMFYtT3B0czo6ICAgICAgICAgICAgICAgICAgIEQxMFYgT3B0aW9ucwotKiBEMTBWLVN5bnRheDo6ICAgICAgICAgICAgICAgICBTeW50YXgKLSogRDEwVi1GbG9hdDo6ICAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogRDEwVi1PcGNvZGVzOjogICAgICAgICAgICAgICAgT3Bjb2RlcwotQGVuZCBtZW51Ci0KLUBub2RlIEQxMFYtT3B0cwotQHNlY3Rpb24gRDEwViBPcHRpb25zCi1AY2luZGV4IG9wdGlvbnMsIEQxMFYKLUBjaW5kZXggRDEwViBvcHRpb25zCi1UaGUgTWl0c3ViaXNoaSBEMTBWIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGEgZmV3IG1hY2hpbmUKLWRlcGVuZGVudCBvcHRpb25zLgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIC1PCi1UaGUgRDEwViBjYW4gb2Z0ZW4gZXhlY3V0ZSB0d28gc3ViLWluc3RydWN0aW9ucyBpbiBwYXJhbGxlbC4gV2hlbiB0aGlzIG9wdGlvbgotaXMgdXNlZCwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhdHRlbXB0IHRvIG9wdGltaXplIGl0cyBvdXRwdXQgYnkgZGV0ZWN0aW5nIHdoZW4KLWluc3RydWN0aW9ucyBjYW4gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuCi1AaXRlbSAtLW5vd2FybnN3YXAKLVRvIG9wdGltaXplIGV4ZWN1dGlvbiBwZXJmb3JtYW5jZSwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBzb21ldGltZXMgc3dhcCB0aGUKLW9yZGVyIG9mIGluc3RydWN0aW9ucy4gTm9ybWFsbHkgdGhpcyBnZW5lcmF0ZXMgYSB3YXJuaW5nLiBXaGVuIHRoaXMgb3B0aW9uIAotaXMgdXNlZCwgbm8gd2FybmluZyB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIGluc3RydWN0aW9ucyBhcmUgc3dhcHBlZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgRDEwVi1TeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQGNpbmRleCBEMTBWIHN5bnRheAotQGNpbmRleCBzeW50YXgsIEQxMFYKLQotVGhlIEQxMFYgc3ludGF4IGlzIGJhc2VkIG9uIHRoZSBzeW50YXggaW4gTWl0c3ViaXNoaSdzIEQxMFYgYXJjaGl0ZWN0dXJlIG1hbnVhbC4KLVRoZSBkaWZmZXJlbmNlcyBhcmUgZGV0YWlsZWQgYmVsb3cuCi0KLUBtZW51Ci0qIEQxMFYtU2l6ZTo6ICAgICAgICAgICAgICAgICBTaXplIE1vZGlmaWVycwotKiBEMTBWLVN1YnM6OiAgICAgICAgICAgICAgICAgU3ViLUluc3RydWN0aW9ucwotKiBEMTBWLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEQxMFYtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBEMTBWLUFkZHJlc3Npbmc6OiAgICAgICAgICAgQWRkcmVzc2luZyBNb2RlcwotKiBEMTBWLVdvcmQ6OiAgICAgICAgICAgICAgICAgQEBXT1JEIE1vZGlmaWVyCi1AZW5kIG1lbnUKLQotCi1Abm9kZSBEMTBWLVNpemUKLUBzdWJzZWN0aW9uIFNpemUgTW9kaWZpZXJzCi1AY2luZGV4IEQxMFYgc2l6ZSBtb2RpZmllcnMKLUBjaW5kZXggc2l6ZSBtb2RpZmllcnMsIEQxMFYKLVRoZSBEMTBWIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gdXNlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZXMgaW4gdGhlIEQxMFYKLUFyY2hpdGVjdHVyZSBNYW51YWwuICBIb3dldmVyLCB0aGUgbmFtZXMgaW4gdGhlIG1hbnVhbCBhcmUgc29tZXRpbWVzIGFtYmlndW91cy4KLVRoZXJlIGFyZSBpbnN0cnVjdGlvbiBuYW1lcyB0aGF0IGNhbiBhc3NlbWJsZSB0byBhIHNob3J0IG9yIGxvbmcgZm9ybSBvcGNvZGUuCi1Ib3cgZG9lcyB0aGUgYXNzZW1ibGVyIHBpY2sgdGhlIGNvcnJlY3QgZm9ybT8gIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYWx3YXlzIHBpY2sgdGhlCi1zbWFsbGVzdCBmb3JtIGlmIGl0IGNhbi4gIFdoZW4gZGVhbGluZyB3aXRoIGEgc3ltYm9sIHRoYXQgaXMgbm90IGRlZmluZWQgeWV0IHdoZW4gYQotbGluZSBpcyBiZWluZyBhc3NlbWJsZWQsIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgbG9uZyBmb3JtLiAgSWYgeW91IG5lZWQgdG8gZm9yY2UgdGhlIAotYXNzZW1ibGVyIHRvIHVzZSBlaXRoZXIgdGhlIHNob3J0IG9yIGxvbmcgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24sIHlvdSBjYW4gYXBwZW5kCi1laXRoZXIgQHNhbXB7LnN9IChzaG9ydCkgb3IgQHNhbXB7Lmx9IChsb25nKSB0byBpdC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIHdyaXRpbmcgCi1hbiBhc3NlbWJseSBwcm9ncmFtIGFuZCB5b3Ugd2FudCB0byBkbyBhIGJyYW5jaCB0byBhIHN5bWJvbCB0aGF0IGlzIGRlZmluZWQgbGF0ZXIKLWluIHlvdXIgcHJvZ3JhbSwgeW91IGNhbiB3cml0ZSBAc2FtcHticmEucyAgIGZvb30uICAKLU9iamR1bXAgYW5kIEdEQiB3aWxsIGFsd2F5cyBhcHBlbmQgQHNhbXB7LnN9IG9yIEBzYW1wey5sfSB0byBpbnN0cnVjdGlvbnMgd2hpY2gKLWhhdmUgYm90aCBzaG9ydCBhbmQgbG9uZyBmb3Jtcy4KLQotQG5vZGUgRDEwVi1TdWJzCi1Ac3Vic2VjdGlvbiBTdWItSW5zdHJ1Y3Rpb25zCi1AY2luZGV4IEQxMFYgc3ViLWluc3RydWN0aW9ucwotQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb25zLCBEMTBWCi1UaGUgRDEwViBhc3NlbWJsZXIgdGFrZXMgYXMgaW5wdXQgYSBzZXJpZXMgb2YgaW5zdHJ1Y3Rpb25zLCBlaXRoZXIgb25lLXBlci1saW5lLAotb3IgaW4gdGhlIHNwZWNpYWwgdHdvLXBlci1saW5lIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIFNvbWUgb2YgdGhlc2UKLWluc3RydWN0aW9ucyB3aWxsIGJlIHNob3J0LWZvcm0gb3Igc3ViLWluc3RydWN0aW9ucy4gIFRoZXNlIHN1Yi1pbnN0cnVjdGlvbnMgY2FuIGJlIHBhY2tlZAotaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbi4gIFRoZSBhc3NlbWJsZXIgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuICBJdCB3aWxsIGFsc28gZGV0ZWN0Ci13aGVuIGl0IHNob3VsZCBub3QgcGFjayBpbnN0cnVjdGlvbnMuICBGb3IgZXhhbXBsZSwgd2hlbiBhIGxhYmVsIGlzIGRlZmluZWQsIHRoZSBuZXh0Ci1pbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIHBhY2thZ2VkIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gIFdoZW5ldmVyIGEgYnJhbmNoIGFuZCBsaW5rCi1pbnN0cnVjdGlvbiBpcyBjYWxsZWQsIGl0IHdpbGwgbm90IGJlIHBhY2thZ2VkIHdpdGggdGhlIG5leHQgaW5zdHJ1Y3Rpb24gc28gdGhlIHJldHVybgotYWRkcmVzcyB3aWxsIGJlIHZhbGlkLiAgTm9wcyBhcmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCB3aGVuIG5lY2Vzc2FyeS4KLQotSWYgeW91IGRvIG5vdCB3YW50IHRoZSBhc3NlbWJsZXIgYXV0b21hdGljYWxseSBtYWtpbmcgdGhlc2UgZGVjaXNpb25zLCB5b3UgY2FuIGNvbnRyb2wKLXRoZSBwYWNrYWdpbmcgYW5kIGV4ZWN1dGlvbiB0eXBlIChwYXJhbGxlbCBvciBzZXF1ZW50aWFsKSB3aXRoIHRoZSBzcGVjaWFsIGV4ZWN1dGlvbiAKLXN5bWJvbHMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uICAKLQotQG5vZGUgRDEwVi1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEQxMFYKLUBjaW5kZXggRDEwViBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyCi1Ac2FtcHs7fSBhbmQgQHNhbXB7I30gYXJlIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVycy4KLUBjaW5kZXggc3ViLWluc3RydWN0aW9uIG9yZGVyaW5nLCBEMTBWCi1AY2luZGV4IEQxMFYgc3ViLWluc3RydWN0aW9uIG9yZGVyaW5nCi1TdWItaW5zdHJ1Y3Rpb25zIG1heSBiZSBleGVjdXRlZCBpbiBvcmRlciwgaW4gcmV2ZXJzZS1vcmRlciwgb3IgaW4gcGFyYWxsZWwuCi1JbnN0cnVjdGlvbnMgbGlzdGVkIGluIHRoZSBzdGFuZGFyZCBvbmUtcGVyLWxpbmUgZm9ybWF0IHdpbGwgYmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5LgotVG8gc3BlY2lmeSB0aGUgZXhlY3V0aW5nIG9yZGVyLCB1c2UgdGhlIGZvbGxvd2luZyBzeW1ib2xzOiAKLUB0YWJsZSBAc2FtcAotQGl0ZW0gLT4KLVNlcXVlbnRpYWwgd2l0aCBpbnN0cnVjdGlvbiBvbiB0aGUgbGVmdCBmaXJzdC4KLUBpdGVtIDwtCi1TZXF1ZW50aWFsIHdpdGggaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGZpcnN0LgotQGl0ZW0gfHwKLVBhcmFsbGVsCi1AZW5kIHRhYmxlCi1UaGUgRDEwViBzeW50YXggYWxsb3dzIGVpdGhlciBvbmUgaW5zdHJ1Y3Rpb24gcGVyIGxpbmUsIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSB3aXRoCi10aGUgZXhlY3V0aW9uIHN5bWJvbCwgb3IgdHdvIGluc3RydWN0aW9ucyBwZXIgbGluZS4gIEZvciBleGFtcGxlCi1AdGFibGUgQGNvZGUKLUBpdGVtIGFicyAgICAgICBhMSAgICAgIC0+ICAgICAgYWJzICAgICByMAotRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAotY29udGFpbmVyIGFuZCBpcyBleGVjdXRlZCBzZWNvbmQuCi1AaXRlbSBhYnMgICAgICAgcjAgICAgICA8LSAgICAgIGFicyAgICAgYTEKLUV4ZWN1dGUgdGhlc2UgcmV2ZXJzZS1zZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAotY29udGFpbmVyLCBhbmQgaXMgZXhlY3V0ZWQgZmlyc3QuCi1AaXRlbSBsZDJ3ICAgIHIyLEBAcjgrICAgICAgICAgfHwgICAgICBtYWMgICAgIGEwLHIwLHI3Ci1FeGVjdXRlIHRoZXNlIGluIHBhcmFsbGVsLgotQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIHx8ICAgICAgCi1AaXRlbXggbWFjICAgICBhMCxyMCxyNwotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIGluIHBhcmFsbGVsLgotQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIAotQGl0ZW14IG1hYyAgICAgYTAscjAscjcKLVR3by1saW5lIGZvcm1hdC4gRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBBc3NlbWJsZXIgd2lsbAotcHV0IHRoZW0gaW4gdGhlIHByb3BlciBjb250YWluZXJzLgotQGl0ZW0gbGQydyAgICByMixAQHI4KyAgICAgICAgIC0+Ci1AaXRlbXggbWFjICAgICBhMCxyMCxyNwotVHdvLWxpbmUgZm9ybWF0LiBFeGVjdXRlIHRoZXNlIHNlcXVlbnRpYWxseS4gIFNhbWUgYXMgYWJvdmUgYnV0Ci1zZWNvbmQgaW5zdHJ1Y3Rpb24gd2lsbCBhbHdheXMgZ28gaW50byByaWdodCBjb250YWluZXIuICAKLUBlbmQgdGFibGUKLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgotQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgRDEwVi1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotQGNpbmRleCBEMTBWIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIEQxMFYKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9IHRocm91Z2ggQHNhbXB7cjE1fSB0byByZWZlciB0byB0aGUgRDEwViAKLXJlZ2lzdGVycy4gIFlvdSBjYW4gYWxzbyB1c2UgQHNhbXB7c3B9IGFzIGFuIGFsaWFzIGZvciBAc2FtcHtyMTV9LiAgVGhlIGFjY3VtdWxhdG9ycwotYXJlIEBzYW1we2EwfSBhbmQgQHNhbXB7YTF9LiAgVGhlcmUgYXJlIHNwZWNpYWwgcmVnaXN0ZXItcGFpciBuYW1lcyB0aGF0IG1heSAKLW9wdGlvbmFsbHkgYmUgdXNlZCBpbiBvcGNvZGVzIHRoYXQgcmVxdWlyZSBldmVuLW51bWJlcmVkIHJlZ2lzdGVycy4gUmVnaXN0ZXIgbmFtZXMgYXJlIAotbm90IGNhc2Ugc2Vuc2l0aXZlLiAgCi0KLVJlZ2lzdGVyIFBhaXJzCi1AdGFibGUgQGNvZGUKLUBpdGVtIHIwLXIxCi1AaXRlbSByMi1yMwotQGl0ZW0gcjQtcjUKLUBpdGVtIHI2LXI3Ci1AaXRlbSByOC1yOQotQGl0ZW0gcjEwLXIxMQotQGl0ZW0gcjEyLXIxMwotQGl0ZW0gcjE0LXIxNQotQGVuZCB0YWJsZQotCi1UaGUgRDEwViBhbHNvIGhhcyBwcmVkZWZpbmVkIHN5bWJvbHMgZm9yIHRoZXNlIGNvbnRyb2wgcmVnaXN0ZXJzIGFuZCBzdGF0dXMgYml0czoKLUB0YWJsZSBAY29kZQotQGl0ZW0gcHN3Ci1Qcm9jZXNzb3IgU3RhdHVzIFdvcmQKLUBpdGVtIGJwc3cKLUJhY2t1cCBQcm9jZXNzb3IgU3RhdHVzIFdvcmQKLUBpdGVtIHBjCi1Qcm9ncmFtIENvdW50ZXIKLUBpdGVtIGJwYwotQmFja3VwIFByb2dyYW0gQ291bnRlcgotQGl0ZW0gcnB0X2MKLVJlcGVhdCBDb3VudAotQGl0ZW0gcnB0X3MKLVJlcGVhdCBTdGFydCBhZGRyZXNzCi1AaXRlbSBycHRfZQotUmVwZWF0IEVuZCBhZGRyZXNzCi1AaXRlbSBtb2RfcwotTW9kdWxvIFN0YXJ0IGFkZHJlc3MKLUBpdGVtIG1vZF9lCi1Nb2R1bG8gRW5kIGFkZHJlc3MKLUBpdGVtIGliYQotSW5zdHJ1Y3Rpb24gQnJlYWsgQWRkcmVzcwotQGl0ZW0gZjAKLUZsYWcgMAotQGl0ZW0gZjEKLUZsYWcgMQotQGl0ZW0gYwotQ2FycnkgZmxhZwotQGVuZCB0YWJsZQotICAgICAgICAKLUBub2RlIEQxMFYtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBEMTBWCi1AY2luZGV4IEQxMFYgYWRkcmVzc2luZyBtb2RlcwotQGNvZGV7QHZhbHVle0FTfX0gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgRDEwVi4KLUBjb2Rle1JAdmFye259fSBpbiB0aGUgZm9sbG93aW5nIHJlZmVycyB0byBhbnkgb2YgdGhlIG51bWJlcmVkCi1yZWdpc3RlcnMsIGJ1dCBAZW1waHtub3R9IHRoZSBjb250cm9sIHJlZ2lzdGVycy4KLUB0YWJsZSBAY29kZQotQGl0ZW0gUkB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLUBpdGVtIEBAUkB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci1AaXRlbSBAQFJAdmFye259LQotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWRlY3JlbWVudAotQGl0ZW0gQEAtU1AKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotQGl0ZW0gQEAoQHZhcntkaXNwfSwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotQGl0ZW0gQHZhcnthZGRyfQotUEMgcmVsYXRpdmUgYWRkcmVzcyAoZm9yIGJyYW5jaCBvciByZXApLiAKLUBpdGVtICNAdmFye2ltbX0KLUltbWVkaWF0ZSBkYXRhICh0aGUgQHNhbXB7I30gaXMgb3B0aW9uYWwgYW5kIGlnbm9yZWQpCi1AZW5kIHRhYmxlCi0KLUBub2RlIEQxMFYtV29yZAotQHN1YnNlY3Rpb24gQEBXT1JEIE1vZGlmaWVyCi1AY2luZGV4IEQxMFYgQEB3b3JkIG1vZGlmaWVyCi1AY2luZGV4IEBAd29yZCBtb2RpZmllciwgRDEwVgotQW55IHN5bWJvbCBmb2xsb3dlZCBieSBAY29kZXtAQHdvcmR9IHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHN5bWJvbCdzIHZhbHVlCi1zaGlmdGVkIHJpZ2h0IGJ5IDIuICBUaGlzIGlzIHVzZWQgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGxvYWRpbmcgYSByZWdpc3Rlcgotd2l0aCB0aGUgYWRkcmVzcyBvZiBhIGZ1bmN0aW9uIChvciBhbnkgb3RoZXIgY29kZSBmcmFnbWVudCkuICBGb3IgZXhhbXBsZSwgaWYKLXlvdSB3YW50IHRvIGxvYWQgYSByZWdpc3RlciB3aXRoIHRoZSBsb2NhdGlvbiBvZiB0aGUgZnVuY3Rpb24gQGNvZGV7bWFpbn0gdGhlbgotanVtcCB0byB0aGF0IGZ1bmN0aW9uLCB5b3UgY291bGQgZG8gaXQgYXMgZm9sbHdzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1sZGkgICAgIHIyLCBtYWluQEB3b3JkCi1qbXAgICAgIHIyCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBEMTBWLUZsb2F0Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgRDEwVgotQGNpbmRleCBEMTBWIGZsb2F0aW5nIHBvaW50Ci1UaGUgRDEwViBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fSBhbmQgQGNvZGV7LmRvdWJsZX0KLWRpcmVjdGl2ZXMgZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciBjb21wYXRpYmlsaXR5Ci13aXRoIG90aGVyIGRldmVsb3BtZW50IHRvb2xzLiAKLQotQG5vZGUgRDEwVi1PcGNvZGVzCi1Ac2VjdGlvbiBPcGNvZGVzCi1AY2luZGV4IEQxMFYgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIEQxMFYKLUBjaW5kZXggbW5lbW9uaWNzLCBEMTBWCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIEQxMFYKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgRDEwViBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtEMTBWIEFyY2hpdGVjdHVyZTogQSBWTElXIE1pY3JvcHJvY2Vzc29yIGZvciBNdWx0aW1lZGlhIEFwcGxpY2F0aW9uc30gCi0oTWl0c3ViaXNoaSBFbGVjdHJpYyBDb3JwLikuCi1AY29kZXtAdmFsdWV7QVN9fSBpbXBsZW1lbnRzIGFsbCB0aGUgc3RhbmRhcmQgRDEwViBvcGNvZGVzLiAgVGhlIG9ubHkgY2hhbmdlcyBhcmUgdGhvc2UKLWRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiBvbiBzaXplIG1vZGlmaWVycwotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtZDMwdi50ZXhpIGIvZ2FzL2RvYy9jLWQzMHYudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxYjM0NC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtZDMwdi50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBEMzBWLURlcGVuZGVudAotQGNoYXB0ZXIgRDMwViBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBEMzBWIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggRDMwViBzdXBwb3J0Ci1AbWVudQotKiBEMzBWLU9wdHM6OiAgICAgICAgICAgICAgICAgICBEMzBWIE9wdGlvbnMKLSogRDMwVi1TeW50YXg6OiAgICAgICAgICAgICAgICAgU3ludGF4Ci0qIEQzMFYtRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIEQzMFYtT3Bjb2Rlczo6ICAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBEMzBWLU9wdHMKLUBzZWN0aW9uIEQzMFYgT3B0aW9ucwotQGNpbmRleCBvcHRpb25zLCBEMzBWCi1AY2luZGV4IEQzMFYgb3B0aW9ucwotVGhlIE1pdHN1YmlzaGkgRDMwViB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGhhcyBhIGZldyBtYWNoaW5lCi1kZXBlbmRlbnQgb3B0aW9ucy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAtTwotVGhlIEQzMFYgY2FuIG9mdGVuIGV4ZWN1dGUgdHdvIHN1Yi1pbnN0cnVjdGlvbnMgaW4gcGFyYWxsZWwuIFdoZW4gdGhpcyBvcHRpb24KLWlzIHVzZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXR0ZW1wdCB0byBvcHRpbWl6ZSBpdHMgb3V0cHV0IGJ5IGRldGVjdGluZyB3aGVuCi1pbnN0cnVjdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgotCi1AaXRlbSAtbgotV2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGlzc3VlIGEgd2FybmluZyBldmVyeQotdGltZSBpdCBhZGRzIGEgbm9wIGluc3RydWN0aW9uLgotCi1AaXRlbSAtTgotV2hlbiB0aGlzIG9wdGlvbiBpcyB1c2VkLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIGlzc3VlIGEgd2FybmluZyBpZiBpdAotbmVlZHMgdG8gaW5zZXJ0IGEgbm9wIGFmdGVyIGEgMzItYml0IG11bHRpcGx5IGJlZm9yZSBhIGxvYWQgb3IgMTYtYml0Ci1tdWx0aXBseSBpbnN0cnVjdGlvbi4KLUBlbmQgdGFibGUKLQotQG5vZGUgRDMwVi1TeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQGNpbmRleCBEMzBWIHN5bnRheAotQGNpbmRleCBzeW50YXgsIEQzMFYKLQotVGhlIEQzMFYgc3ludGF4IGlzIGJhc2VkIG9uIHRoZSBzeW50YXggaW4gTWl0c3ViaXNoaSdzIEQzMFYgYXJjaGl0ZWN0dXJlIG1hbnVhbC4KLVRoZSBkaWZmZXJlbmNlcyBhcmUgZGV0YWlsZWQgYmVsb3cuCi0KLUBtZW51Ci0qIEQzMFYtU2l6ZTo6ICAgICAgICAgICAgICAgICBTaXplIE1vZGlmaWVycwotKiBEMzBWLVN1YnM6OiAgICAgICAgICAgICAgICAgU3ViLUluc3RydWN0aW9ucwotKiBEMzBWLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEQzMFYtR3VhcmRlZDo6ICAgICAgICAgICAgICBHdWFyZGVkIEV4ZWN1dGlvbgotKiBEMzBWLVJlZ3M6OiAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgTmFtZXMKLSogRDMwVi1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi0KLUBub2RlIEQzMFYtU2l6ZQotQHN1YnNlY3Rpb24gU2l6ZSBNb2RpZmllcnMKLUBjaW5kZXggRDMwViBzaXplIG1vZGlmaWVycwotQGNpbmRleCBzaXplIG1vZGlmaWVycywgRDMwVgotVGhlIEQzMFYgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSB1c2VzIHRoZSBpbnN0cnVjdGlvbiBuYW1lcyBpbiB0aGUgRDMwVgotQXJjaGl0ZWN0dXJlIE1hbnVhbC4gIEhvd2V2ZXIsIHRoZSBuYW1lcyBpbiB0aGUgbWFudWFsIGFyZSBzb21ldGltZXMgYW1iaWd1b3VzLgotVGhlcmUgYXJlIGluc3RydWN0aW9uIG5hbWVzIHRoYXQgY2FuIGFzc2VtYmxlIHRvIGEgc2hvcnQgb3IgbG9uZyBmb3JtIG9wY29kZS4KLUhvdyBkb2VzIHRoZSBhc3NlbWJsZXIgcGljayB0aGUgY29ycmVjdCBmb3JtPyAgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBhbHdheXMgcGljayB0aGUKLXNtYWxsZXN0IGZvcm0gaWYgaXQgY2FuLiAgV2hlbiBkZWFsaW5nIHdpdGggYSBzeW1ib2wgdGhhdCBpcyBub3QgZGVmaW5lZCB5ZXQgd2hlbiBhCi1saW5lIGlzIGJlaW5nIGFzc2VtYmxlZCwgaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBsb25nIGZvcm0uICBJZiB5b3UgbmVlZCB0byBmb3JjZSB0aGUgCi1hc3NlbWJsZXIgdG8gdXNlIGVpdGhlciB0aGUgc2hvcnQgb3IgbG9uZyBmb3JtIG9mIHRoZSBpbnN0cnVjdGlvbiwgeW91IGNhbiBhcHBlbmQKLWVpdGhlciBAc2FtcHsuc30gKHNob3J0KSBvciBAc2FtcHsubH0gKGxvbmcpIHRvIGl0LiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgd3JpdGluZyAKLWFuIGFzc2VtYmx5IHByb2dyYW0gYW5kIHlvdSB3YW50IHRvIGRvIGEgYnJhbmNoIHRvIGEgc3ltYm9sIHRoYXQgaXMgZGVmaW5lZCBsYXRlcgotaW4geW91ciBwcm9ncmFtLCB5b3UgY2FuIHdyaXRlIEBzYW1we2JyYS5zIGZvb30uIAotT2JqZHVtcCBhbmQgR0RCIHdpbGwgYWx3YXlzIGFwcGVuZCBAc2FtcHsuc30gb3IgQHNhbXB7Lmx9IHRvIGluc3RydWN0aW9ucyB3aGljaAotaGF2ZSBib3RoIHNob3J0IGFuZCBsb25nIGZvcm1zLgotCi1Abm9kZSBEMzBWLVN1YnMKLUBzdWJzZWN0aW9uIFN1Yi1JbnN0cnVjdGlvbnMKLUBjaW5kZXggRDMwViBzdWItaW5zdHJ1Y3Rpb25zCi1AY2luZGV4IHN1Yi1pbnN0cnVjdGlvbnMsIEQzMFYKLVRoZSBEMzBWIGFzc2VtYmxlciB0YWtlcyBhcyBpbnB1dCBhIHNlcmllcyBvZiBpbnN0cnVjdGlvbnMsIGVpdGhlciBvbmUtcGVyLWxpbmUsCi1vciBpbiB0aGUgc3BlY2lhbCB0d28tcGVyLWxpbmUgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLiAgU29tZSBvZiB0aGVzZQotaW5zdHJ1Y3Rpb25zIHdpbGwgYmUgc2hvcnQtZm9ybSBvciBzdWItaW5zdHJ1Y3Rpb25zLiAgVGhlc2Ugc3ViLWluc3RydWN0aW9ucyBjYW4gYmUgcGFja2VkCi1pbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uLiAgVGhlIGFzc2VtYmxlciB3aWxsIGRvIHRoaXMgYXV0b21hdGljYWxseS4gIEl0IHdpbGwgYWxzbyBkZXRlY3QKLXdoZW4gaXQgc2hvdWxkIG5vdCBwYWNrIGluc3RydWN0aW9ucy4gIEZvciBleGFtcGxlLCB3aGVuIGEgbGFiZWwgaXMgZGVmaW5lZCwgdGhlIG5leHQKLWluc3RydWN0aW9uIHdpbGwgbmV2ZXIgYmUgcGFja2FnZWQgd2l0aCB0aGUgcHJldmlvdXMgb25lLiAgV2hlbmV2ZXIgYSBicmFuY2ggYW5kIGxpbmsKLWluc3RydWN0aW9uIGlzIGNhbGxlZCwgaXQgd2lsbCBub3QgYmUgcGFja2FnZWQgd2l0aCB0aGUgbmV4dCBpbnN0cnVjdGlvbiBzbyB0aGUgcmV0dXJuCi1hZGRyZXNzIHdpbGwgYmUgdmFsaWQuICBOb3BzIGFyZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIHdoZW4gbmVjZXNzYXJ5LgotCi1JZiB5b3UgZG8gbm90IHdhbnQgdGhlIGFzc2VtYmxlciBhdXRvbWF0aWNhbGx5IG1ha2luZyB0aGVzZSBkZWNpc2lvbnMsIHlvdSBjYW4gY29udHJvbAotdGhlIHBhY2thZ2luZyBhbmQgZXhlY3V0aW9uIHR5cGUgKHBhcmFsbGVsIG9yIHNlcXVlbnRpYWwpIHdpdGggdGhlIHNwZWNpYWwgZXhlY3V0aW9uIAotc3ltYm9scyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gIAotCi1Abm9kZSBEMzBWLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgRDMwVgotQGNpbmRleCBEMzBWIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1wezt9IGFuZCBAc2FtcHsjfSBhcmUgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXJzLgotQGNpbmRleCBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcsIEQzMFYKLUBjaW5kZXggRDMwViBzdWItaW5zdHJ1Y3Rpb24gb3JkZXJpbmcKLVN1Yi1pbnN0cnVjdGlvbnMgbWF5IGJlIGV4ZWN1dGVkIGluIG9yZGVyLCBpbiByZXZlcnNlLW9yZGVyLCBvciBpbiBwYXJhbGxlbC4KLUluc3RydWN0aW9ucyBsaXN0ZWQgaW4gdGhlIHN0YW5kYXJkIG9uZS1wZXItbGluZSBmb3JtYXQgd2lsbCBiZSBleGVjdXRlZAotc2VxdWVudGlhbGx5IHVubGVzcyB5b3UgdXNlIHRoZSBAc2FtcHstT30gb3B0aW9uLgotCi1UbyBzcGVjaWZ5IHRoZSBleGVjdXRpbmcgb3JkZXIsIHVzZSB0aGUgZm9sbG93aW5nIHN5bWJvbHM6IAotQHRhYmxlIEBzYW1wCi1AaXRlbSAtPgotU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSBsZWZ0IGZpcnN0LgotCi1AaXRlbSA8LQotU2VxdWVudGlhbCB3aXRoIGluc3RydWN0aW9uIG9uIHRoZSByaWdodCBmaXJzdC4KLQotQGl0ZW0gfHwKLVBhcmFsbGVsCi1AZW5kIHRhYmxlCi0KLVRoZSBEMzBWIHN5bnRheCBhbGxvd3MgZWl0aGVyIG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZSwgb25lIGluc3RydWN0aW9uIHBlciBsaW5lIHdpdGgKLXRoZSBleGVjdXRpb24gc3ltYm9sLCBvciB0d28gaW5zdHJ1Y3Rpb25zIHBlciBsaW5lLiAgRm9yIGV4YW1wbGUKLUB0YWJsZSBAY29kZQotQGl0ZW0gYWJzIHIyLHIzIC0+IGFicyByNCxyNQotRXhlY3V0ZSB0aGVzZSBzZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAotY29udGFpbmVyIGFuZCBpcyBleGVjdXRlZCBzZWNvbmQuCi0KLUBpdGVtIGFicyByMixyMyA8LSBhYnMgcjQscjUKLUV4ZWN1dGUgdGhlc2UgcmV2ZXJzZS1zZXF1ZW50aWFsbHkuICBUaGUgaW5zdHJ1Y3Rpb24gb24gdGhlIHJpZ2h0IGlzIGluIHRoZSByaWdodAotY29udGFpbmVyLCBhbmQgaXMgZXhlY3V0ZWQgZmlyc3QuCi0KLUBpdGVtIGFicyByMixyMyB8fCBhYnMgcjQscjUKLUV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCi0KLUBpdGVtIGxkdyByMixAQChyMyxyNCkgfHwKLUBpdGVteCBtdWx4IHI2LHI4LHI5Ci1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2UgaW4gcGFyYWxsZWwuCi0KLUBpdGVtIG11bHggYTAscjgscjkKLUBpdGVteCBzdHcgcjIsQEAocjMscjQpCi1Ud28tbGluZSBmb3JtYXQuIEV4ZWN1dGUgdGhlc2Ugc2VxdWVudGlhbGx5IHVubGVzcyBAc2FtcHstT30gb3B0aW9uIGlzCi11c2VkLiAgSWYgdGhlIEBzYW1wey1PfSBvcHRpb24gaXMgdXNlZCwgdGhlIGFzc2VtYmxlciB3aWxsIGRldGVybWluZSBpZgotdGhlIGluc3RydWN0aW9ucyBjb3VsZCBiZSBkb25lIGluIHBhcmFsbGVsICh0aGUgYWJvdmUgdHdvIGluc3RydWN0aW9ucwotY2FuIGJlIGRvbmUgaW4gcGFyYWxsZWwpLCBhbmQgaWYgc28sIGVtaXQgdGhlbSBhcyBwYXJhbGxlbCBpbnN0cnVjdGlvbnMuCi1UaGUgYXNzZW1ibGVyIHdpbGwgcHV0IHRoZW0gaW4gdGhlIHByb3BlciBjb250YWluZXJzLiAgSW4gdGhlIGFib3ZlCi1leGFtcGxlLCB0aGUgYXNzZW1ibGVyIHdpbGwgcHV0IHRoZSBAc2FtcHtzdHd9IGluc3RydWN0aW9uIGluIGxlZnQKLWNvbnRhaW5lciBhbmQgdGhlIEBzYW1we211bHh9IGluc3RydWN0aW9uIGluIHRoZSByaWdodCBjb250YWluZXIuCi0KLUBpdGVtIHN0dyByMixAQChyMyxyNCkgLT4KLUBpdGVteCBtdWx4IGEwLHI4LHI5Ci1Ud28tbGluZSBmb3JtYXQuICBFeGVjdXRlIHRoZSBAc2FtcHtzdHd9IGluc3RydWN0aW9uIGZvbGxvd2VkIGJ5IHRoZQotQHNhbXB7bXVseH0gaW5zdHJ1Y3Rpb24gc2VxdWVudGlhbGx5LiAgVGhlIGZpcnN0IGluc3RydWN0aW9uIGdvZXMgaW4gdGhlCi1sZWZ0IGNvbnRhaW5lciBhbmQgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBnb2VzIGludG8gcmlnaHQgY29udGFpbmVyLgotVGhlIGFzc2VtYmxlciB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgdGhlIG1hY2hpbmUgb3JkZXJpbmcgY29uc3RyYWludHMgYXJlCi12aW9sYXRlZC4KLQotQGl0ZW0gc3R3IHIyLEBAKHIzLHI0KSA8LQotQGl0ZW14IG11bHggYTAscjgscjkKLVNhbWUgYXMgcHJldmlvdXMgZXhhbXBsZSwgZXhjZXB0IHRoYXQgdGhlIEBzYW1we211bHh9IGluc3RydWN0aW9uIGlzCi1leGVjdXRlZCBiZWZvcmUgdGhlIEBzYW1we3N0d30gaW5zdHJ1Y3Rpb24uCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggc3ltYm9sIG5hbWVzLCBAc2FtcHskfSBpbgotQGNpbmRleCBAY29kZXskfSBpbiBzeW1ib2wgbmFtZXMKLVNpbmNlIEBzYW1weyR9IGhhcyBubyBzcGVjaWFsIG1lYW5pbmcsIHlvdSBtYXkgdXNlIGl0IGluIHN5bWJvbCBuYW1lcy4KLQotQG5vZGUgRDMwVi1HdWFyZGVkCi1Ac3Vic2VjdGlvbiBHdWFyZGVkIEV4ZWN1dGlvbgotQGNpbmRleCBEMzBWIEd1YXJkZWQgRXhlY3V0aW9uCi1AY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyB0aGUgZnVsbCByYW5nZSBvZiBndWFyZGVkIGV4ZWN1dGlvbgotZGlyZWN0aXZlcyBmb3IgZWFjaCBpbnN0cnVjdGlvbi4gIEp1c3QgYXBwZW5kIHRoZSBkaXJlY3RpdmUgYWZ0ZXIgdGhlCi1pbnN0cnVjdGlvbiBwcm9wZXIuICBUaGUgZGlyZWN0aXZlcyBhcmU6Ci0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gL3R4Ci1FeGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpZiBmbGFnIGYwIGlzIHRydWUuCi1AaXRlbSAvZngKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjAgaXMgZmFsc2UuCi1AaXRlbSAveHQKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjEgaXMgdHJ1ZS4KLUBpdGVtIC94ZgotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgZmxhZyBmMSBpcyBmYWxzZS4KLUBpdGVtIC90dAotRXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb24gaWYgYm90aCBmbGFncyBmMCBhbmQgZjEgYXJlIHRydWUuCi1AaXRlbSAvdGYKLUV4ZWN1dGUgdGhlIGluc3RydWN0aW9uIGlmIGZsYWcgZjAgaXMgdHJ1ZSBhbmQgZmxhZyBmMSBpcyBmYWxzZS4KLUBlbmQgdGFibGUKLQotQG5vZGUgRDMwVi1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotQGNpbmRleCBEMzBWIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIEQzMFYKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9IHRocm91Z2ggQHNhbXB7cjYzfSB0byByZWZlcgotdG8gdGhlIEQzMFYgcmVnaXN0ZXJzLiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHtzcH0gYXMgYW4gYWxpYXMgZm9yCi1Ac2FtcHtyNjN9IGFuZCBAc2FtcHtsaW5rfSBhcyBhbiBhbGlhcyBmb3IgQHNhbXB7cjYyfS4gIFRoZSBhY2N1bXVsYXRvcnMKLWFyZSBAc2FtcHthMH0gYW5kIEBzYW1we2ExfS4KLQotVGhlIEQzMFYgYWxzbyBoYXMgcHJlZGVmaW5lZCBzeW1ib2xzIGZvciB0aGVzZSBjb250cm9sIHJlZ2lzdGVycyBhbmQgc3RhdHVzIGJpdHM6Ci1AdGFibGUgQGNvZGUKLUBpdGVtIHBzdwotUHJvY2Vzc29yIFN0YXR1cyBXb3JkCi1AaXRlbSBicHN3Ci1CYWNrdXAgUHJvY2Vzc29yIFN0YXR1cyBXb3JkCi1AaXRlbSBwYwotUHJvZ3JhbSBDb3VudGVyCi1AaXRlbSBicGMKLUJhY2t1cCBQcm9ncmFtIENvdW50ZXIKLUBpdGVtIHJwdF9jCi1SZXBlYXQgQ291bnQKLUBpdGVtIHJwdF9zCi1SZXBlYXQgU3RhcnQgYWRkcmVzcwotQGl0ZW0gcnB0X2UKLVJlcGVhdCBFbmQgYWRkcmVzcwotQGl0ZW0gbW9kX3MKLU1vZHVsbyBTdGFydCBhZGRyZXNzCi1AaXRlbSBtb2RfZQotTW9kdWxvIEVuZCBhZGRyZXNzCi1AaXRlbSBpYmEKLUluc3RydWN0aW9uIEJyZWFrIEFkZHJlc3MKLUBpdGVtIGYwCi1GbGFnIDAKLUBpdGVtIGYxCi1GbGFnIDEKLUBpdGVtIGYyCi1GbGFnIDIKLUBpdGVtIGYzCi1GbGFnIDMKLUBpdGVtIGY0Ci1GbGFnIDQKLUBpdGVtIGY1Ci1GbGFnIDUKLUBpdGVtIGY2Ci1GbGFnIDYKLUBpdGVtIGY3Ci1GbGFnIDcKLUBpdGVtIHMKLVNhbWUgYXMgZmxhZyA0IChzYXR1cmF0aW9uIGZsYWcpCi1AaXRlbSB2Ci1TYW1lIGFzIGZsYWcgNSAob3ZlcmZsb3cgZmxhZykKLUBpdGVtIHZhCi1TYW1lIGFzIGZsYWcgNiAoc3RpY2t5IG92ZXJmbG93IGZsYWcpCi1AaXRlbSBjCi1TYW1lIGFzIGZsYWcgNyAoY2FycnkvYm9ycm93IGZsYWcpCi1AaXRlbSBiCi1TYW1lIGFzIGZsYWcgNyAoY2FycnkvYm9ycm93IGZsYWcpCi1AZW5kIHRhYmxlCi0gICAgICAgIAotQG5vZGUgRDMwVi1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIEQzMFYKLUBjaW5kZXggRDMwViBhZGRyZXNzaW5nIG1vZGVzCi1AY29kZXtAdmFsdWV7QVN9fSB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIGFkZHJlc3NpbmcgbW9kZXMgZm9yIHRoZSBEMzBWLgotQGNvZGV7UkB2YXJ7bn19IGluIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGFueSBvZiB0aGUgbnVtYmVyZWQKLXJlZ2lzdGVycywgYnV0IEBlbXBoe25vdH0gdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgotQHRhYmxlIEBjb2RlCi1AaXRlbSBSQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci1AaXRlbSBAQFJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotQGl0ZW0gQEBSQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLUBpdGVtIEBAUkB2YXJ7bn0tCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtZGVjcmVtZW50Ci1AaXRlbSBAQC1TUAotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmUtZGVjcmVtZW50Ci1AaXRlbSBAQChAdmFye2Rpc3B9LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci1AaXRlbSBAdmFye2FkZHJ9Ci1QQyByZWxhdGl2ZSBhZGRyZXNzIChmb3IgYnJhbmNoIG9yIHJlcCkuIAotQGl0ZW0gI0B2YXJ7aW1tfQotSW1tZWRpYXRlIGRhdGEgKHRoZSBAc2FtcHsjfSBpcyBvcHRpb25hbCBhbmQgaWdub3JlZCkKLUBlbmQgdGFibGUKLQotQG5vZGUgRDMwVi1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIEQzMFYKLUBjaW5kZXggRDMwViBmbG9hdGluZyBwb2ludAotVGhlIEQzMFYgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0gYW5kIEBjb2Rley5kb3VibGV9Ci1kaXJlY3RpdmVzIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4gCi0KLUBub2RlIEQzMFYtT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotQGNpbmRleCBEMzBWIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBEMzBWCi1AY2luZGV4IG1uZW1vbmljcywgRDMwVgotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBEMzBWCi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIEQzMFYgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7RDMwViBBcmNoaXRlY3R1cmU6IEEgVkxJVyBNaWNyb3Byb2Nlc3NvciBmb3IgTXVsdGltZWRpYSBBcHBsaWNhdGlvbnN9IAotKE1pdHN1YmlzaGkgRWxlY3RyaWMgQ29ycC4pLgotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEQzMFYgb3Bjb2Rlcy4gIFRoZSBvbmx5IGNoYW5nZXMgYXJlIHRob3NlCi1kZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gb24gc2l6ZSBtb2RpZmllcnMKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLWg4MzAwLnRleGkgYi9nYXMvZG9jL2MtaDgzMDAudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3MDkxOC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaDgzMDAudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQGVuZCBpZnNldAotQG5vZGUgSDgvMzAwLURlcGVuZGVudAotQGNoYXB0ZXIgSDgvMzAwIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IEg4LzMwMCBzdXBwb3J0Ci1AbWVudQotKiBIOC8zMDAgT3B0aW9uczo6ICAgICAgICAgICAgICBPcHRpb25zCi0qIEg4LzMwMCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBIOC8zMDAgRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBIOC8zMDAgRGlyZWN0aXZlczo6ICAgICAgICAgICBIOC8zMDAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIEg4LzMwMCBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIOC8zMDAgT3B0aW9ucwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IEg4LzMwMCBvcHRpb25zIChub25lKQotQGNpbmRleCBvcHRpb25zLCBIOC8zMDAgKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhpdGFjaGkKLUg4LzMwMCBmYW1pbHkuCi0KLUBub2RlIEg4LzMwMCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQG1lbnUKLSogSDgvMzAwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEg4LzMwMC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIEg4LzMwMC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIOC8zMDAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEg4LzMwMAotQGNpbmRleCBIOC8zMDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7O30gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIEg4LzMwMAotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBIOC8zMDAKLUBjaW5kZXggSDgvMzAwIGxpbmUgc2VwYXJhdG9yCi1Ac2FtcHskfSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotVGhlcmVmb3JlIEBlbXBoe3lvdSBtYXkgbm90IHVzZSBAc2FtcHskfSBpbiBzeW1ib2wgbmFtZXN9IG9uIHRoZSBIOC8zMDAuCi0KLUBub2RlIEg4LzMwMC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IEg4LzMwMCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIEg4LzMwMAotWW91IGNhbiB1c2UgcHJlZGVmaW5lZCBzeW1ib2xzIG9mIHRoZSBmb3JtIEBzYW1we3JAdmFye259aH0gYW5kCi1Ac2FtcHtyQHZhcntufWx9IHRvIHJlZmVyIHRvIHRoZSBIOC8zMDAgcmVnaXN0ZXJzIGFzIHNpeHRlZW4gOC1iaXQKLWdlbmVyYWwtcHVycG9zZSByZWdpc3RlcnMuICBAdmFye259IGlzIGEgZGlnaXQgZnJvbSBAc2FtcHswfSB0bwotQHNhbXB7N30pOyBmb3IgaW5zdGFuY2UsIGJvdGggQHNhbXB7cjBofSBhbmQgQHNhbXB7cjdsfSBhcmUgdmFsaWQKLXJlZ2lzdGVyIG5hbWVzLgotCi1Zb3UgY2FuIGFsc28gdXNlIHRoZSBlaWdodCBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7ckB2YXJ7bn19IHRvIHJlZmVyCi10byB0aGUgSDgvMzAwIHJlZ2lzdGVycyBhcyAxNi1iaXQgcmVnaXN0ZXJzICh5b3UgbXVzdCB1c2UgdGhpcyBmb3JtIGZvcgotYWRkcmVzc2luZykuCi0KLU9uIHRoZSBIOC8zMDBILCB5b3UgY2FuIGFsc28gdXNlIHRoZSBlaWdodCBwcmVkZWZpbmVkIHN5bWJvbHMKLUBzYW1we2VyQHZhcntufX0gKEBzYW1we2VyMH0gQGRvdHN7fSBAc2FtcHtlcjd9KSB0byByZWZlciB0byB0aGUgMzItYml0Ci1nZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgotCi1UaGUgdHdvIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSBjYWxsZWQgQGNvZGV7cGN9IChwcm9ncmFtIGNvdW50ZXI7IGEKLTE2LWJpdCByZWdpc3RlciwgZXhjZXB0IG9uIHRoZSBIOC8zMDBIIHdoZXJlIGl0IGlzIDI0IGJpdHMpIGFuZAotQGNvZGV7Y2NyfSAoY29uZGl0aW9uIGNvZGUgcmVnaXN0ZXI7IGFuIDgtYml0IHJlZ2lzdGVyKS4gIEBjb2Rle3I3fSBpcwotdXNlZCBhcyB0aGUgc3RhY2sgcG9pbnRlciwgYW5kIGNhbiBhbHNvIGJlIGNhbGxlZCBAY29kZXtzcH0uCi0KLUBub2RlIEg4LzMwMC1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi0KLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgSDgvMzAwCi1AY2luZGV4IEg4LzMwMCBhZGRyZXNzaW5nIG1vZGVzCi1AdmFsdWV7QVN9IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIEg4LzMwMDoKLUB0YWJsZSBAY29kZQotQGl0ZW0gckB2YXJ7bn0KLVJlZ2lzdGVyIGRpcmVjdAotCi1AaXRlbSBAQHJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdAotCi1AbmVlZCAxMjAwCi1AaXRlbSBAQChAdmFye2R9LCByQHZhcntufSkKLUBpdGVteCBAQChAdmFye2R9OjE2LCByQHZhcntufSkKLUBpdGVteCBAQChAdmFye2R9OjI0LCByQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0OiAxNi1iaXQgb3IgMjQtYml0IGRpc3BsYWNlbWVudCBAdmFye2R9IGZyb20gcmVnaXN0ZXIKLUB2YXJ7bn0uICAoMjQtYml0IGRpc3BsYWNlbWVudHMgYXJlIG9ubHkgbWVhbmluZ2Z1bCBvbiB0aGUgSDgvMzAwSC4pCi0KLUBpdGVtIEBAckB2YXJ7bn0rCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHBvc3QtaW5jcmVtZW50Ci0KLUBpdGVtIEBALXJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLQotQGl0ZW0gQGNvZGV7QEB9QHZhcnthYX0KLUBpdGVteCBAY29kZXtAQH1AdmFye2FhfTo4Ci1AaXRlbXggQGNvZGV7QEB9QHZhcnthYX06MTYKLUBpdGVteCBAY29kZXtAQH1AdmFye2FhfToyNAotQWJzb2x1dGUgYWRkcmVzcyBAY29kZXthYX0uICAoVGhlIGFkZHJlc3Mgc2l6ZSBAc2FtcHs6MjR9IG9ubHkgbWFrZXMKLXNlbnNlIG9uIHRoZSBIOC8zMDBILikKLQotQGl0ZW0gI0B2YXJ7eHh9Ci1AaXRlbXggI0B2YXJ7eHh9OjgKLUBpdGVteCAjQHZhcnt4eH06MTYKLUBpdGVteCAjQHZhcnt4eH06MzIKLUltbWVkaWF0ZSBkYXRhIEB2YXJ7eHh9LiAgWW91IG1heSBzcGVjaWZ5IHRoZSBAc2FtcHs6OH0sIEBzYW1wezoxNn0sIG9yCi1Ac2FtcHs6MzJ9IGZvciBjbGFyaXR5LCBpZiB5b3Ugd2lzaDsgYnV0IEBjb2Rle0B2YWx1ZXtBU319IG5laXRoZXIKLXJlcXVpcmVzIHRoaXMgbm9yIHVzZXMgaXQtLS10aGUgZGF0YSBzaXplIHJlcXVpcmVkIGlzIHRha2VuIGZyb20KLWNvbnRleHQuCi0KLUBpdGVtIEBjb2Rle0BAfUBjb2Rle0BAfUB2YXJ7YWF9Ci1AaXRlbXggQGNvZGV7QEB9QGNvZGV7QEB9QHZhcnthYX06OAotTWVtb3J5IGluZGlyZWN0LiAgWW91IG1heSBzcGVjaWZ5IHRoZSBAc2FtcHs6OH0gZm9yIGNsYXJpdHksIGlmIHlvdQotd2lzaDsgYnV0IEBjb2Rle0B2YWx1ZXtBU319IG5laXRoZXIgcmVxdWlyZXMgdGhpcyBub3IgdXNlcyBpdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgSDgvMzAwIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBIOC8zMDAgKEBzY3tpZWVlfSkKLUBjaW5kZXggSDgvMzAwIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgSDgvMzAwIGZhbWlseSBoYXMgbm8gaGFyZHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCB0aGUgQGNvZGV7LmZsb2F0fQotZGlyZWN0aXZlIGdlbmVyYXRlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycyBmb3IgY29tcGF0aWJpbGl0eQotd2l0aCBvdGhlciBkZXZlbG9wbWVudCB0b29scy4KLQotQHBhZ2UKLUBub2RlIEg4LzMwMCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBIOC8zMDAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggSDgvMzAwIG1hY2hpbmUgZGlyZWN0aXZlcyAobm9uZSkKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBIOC8zMDAgKG5vbmUpCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZSwgSDgvMzAwCi1AY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlLCBIOC8zMDAKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBvbmx5IG9uZSBtYWNoaW5lLWRlcGVuZGVudCBkaXJlY3RpdmUgZm9yIHRoZQotSDgvMzAwOgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggSDgvMzAwSCwgYXNzZW1ibGluZyBmb3IKLUBpdGVtIC5oODMwMGgKLVJlY29nbml6ZSBhbmQgZW1pdCBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBmb3IgdGhlIEg4LzMwMEggdmFyaWFudCwgYW5kCi1hbHNvIG1ha2UgQGNvZGV7LmludH0gZW1pdCAzMi1iaXQgbnVtYmVycyByYXRoZXIgdGhhbiB0aGUgdXN1YWwgKDE2LWJpdCkKLWZvciB0aGUgSDgvMzAwIGZhbWlseS4KLUBlbmQgdGFibGUKLQotT24gdGhlIEg4LzMwMCBmYW1pbHkgKGluY2x1ZGluZyB0aGUgSDgvMzAwSCkgQHNhbXB7LndvcmR9IGRpcmVjdGl2ZXMKLWdlbmVyYXRlIDE2LWJpdCBudW1iZXJzLgotCi1Abm9kZSBIOC8zMDAgT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IEg4LzMwMCBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgSDgvMzAwCi1AY2luZGV4IG1uZW1vbmljcywgSDgvMzAwCi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIEg4LzMwMAotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBIOC8zMDAgbWFjaGluZSBpbnN0cnVjdGlvbiBzZXQsIHNlZQotQGNpdGV7SDgvMzAwIFNlcmllcyBQcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpIEFERS0tNjAyLS0wMjUpLiAgRm9yCi1pbmZvcm1hdGlvbiBzcGVjaWZpYyB0byB0aGUgSDgvMzAwSCwgc2VlIEBjaXRle0g4LzMwMEggU2VyaWVzCi1Qcm9ncmFtbWluZyBNYW51YWx9IChIaXRhY2hpKS4KLQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEg4LzMwMCBvcGNvZGVzLiAgTm8gYWRkaXRpb25hbAotcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LgotCi1AaWZzZXQgU01BTEwKLUBjIHRoaXMgdGFibGUsIGR1ZSB0byB0aGUgbXVsdGktY29sIGZha2luZyBhbmQgaGFyZGNvZGVkIG9yZGVyLCBsb29rcyBzaWxseQotQGMgZXhjZXB0IGluIHNtYWxsYm9vay4gIFNlZSBjb21tZW50cyBiZWxvdyAiQHNldCBTTUFMTCIgbmVhciB0b3Agb2YgdGhpcyBmaWxlLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIEg4LzMwMCBvcGNvZGVzLCBhbmQgdGhlaXIgYXJndW1lbnRzLgotRW50cmllcyBtYXJrZWQgQHNhbXB7Kn0gYXJlIG9wY29kZXMgdXNlZCBvbmx5IG9uIHRoZSBIOC8zMDBILgotCi1Ac21hbGxleGFtcGxlCi1AYyBVc2luZyBAZ3JvdXAgc2VlbXMgdG8gdXNlIHRoZSBub3JtYWwgYmFzZWxpbmVza2lwLCBub3QgdGhlIHNtYWxsZXhhbXBsZQotQGMgYmFzZWxpbmVza2lwOyBsb29rcyBhcHByb3ggZG91Ymxlc3BhY2VkLgotICAgICAgICAgQGl7TGVnZW5kOn0KLSAgICAgICAgICAgIFJzICAgQHJ7c291cmNlIHJlZ2lzdGVyfQotICAgICAgICAgICAgUmQgICBAcntkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIGFicyAgQHJ7YWJzb2x1dGUgYWRkcmVzc30KLSAgICAgICAgICAgIGltbSAgQHJ7aW1tZWRpYXRlIGRhdGF9Ci0gICAgICAgICBkaXNwOk4gIEBye04tYml0IGRpc3BsYWNlbWVudCBmcm9tIGEgcmVnaXN0ZXJ9Ci0gICAgICAgIHBjcmVsOk4gIEBye04tYml0IGRpc3BsYWNlbWVudCByZWxhdGl2ZSB0byBwcm9ncmFtIGNvdW50ZXJ9Ci0KLSAgIGFkZC5iICNpbW0scmQgICAgICAgICAgICAgICogIGFuZGMgI2ltbSxjY3IKLSAgIGFkZC5iIHJzLHJkICAgICAgICAgICAgICAgICAgIGJhbmQgI2ltbSxyZAotICAgYWRkLncgcnMscmQgICAgICAgICAgICAgICAgICAgYmFuZCAjaW1tLEBAcmQKLSogIGFkZC53ICNpbW0scmQgICAgICAgICAgICAgICAgIGJhbmQgI2ltbSxAQGFiczo4Ci0qICBhZGQubCBycyxyZCAgICAgICAgICAgICAgICAgICBicmEgIHBjcmVsOjgKLSogIGFkZC5sICNpbW0scmQgICAgICAgICAgICAgICogIGJyYSAgcGNyZWw6MTYKLSAgIGFkZHMgI2ltbSxyZCAgICAgICAgICAgICAgICAgIGJ0ICAgcGNyZWw6OAotICAgYWRkeCAjaW1tLHJkICAgICAgICAgICAgICAgKiAgYnQgICBwY3JlbDoxNgotICAgYWRkeCBycyxyZCAgICAgICAgICAgICAgICAgICAgYnJuICBwY3JlbDo4Ci0gICBhbmQuYiAjaW1tLHJkICAgICAgICAgICAgICAqICBicm4gIHBjcmVsOjE2Ci0gICBhbmQuYiBycyxyZCAgICAgICAgICAgICAgICAgICBiZiAgIHBjcmVsOjgKLSogIGFuZC53IHJzLHJkICAgICAgICAgICAgICAgICogIGJmICAgcGNyZWw6MTYKLSogIGFuZC53ICNpbW0scmQgICAgICAgICAgICAgICAgIGJoaSAgcGNyZWw6OAotKiAgYW5kLmwgI2ltbSxyZCAgICAgICAgICAgICAgKiAgYmhpICBwY3JlbDoxNgotKiAgYW5kLmwgcnMscmQgICAgICAgICAgICAgICAgICAgYmxzICBwY3JlbDo4Ci1AcGFnZQotKiAgYmxzICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYmxkICAjaW1tLHJkCi0gICBiY2MgIHBjcmVsOjggICAgICAgICAgICAgICAgICBibGQgICNpbW0sQEByZAotKiAgYmNjICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYmxkICAjaW1tLEBAYWJzOjgKLSAgIGJocyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJub3QgI2ltbSxyZAotKiAgYmhzICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYm5vdCAjaW1tLEBAcmQKLSAgIGJjcyAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJub3QgI2ltbSxAQGFiczo4Ci0qICBiY3MgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBibm90IHJzLHJkCi0gICBibG8gIHBjcmVsOjggICAgICAgICAgICAgICAgICBibm90IHJzLEBAcmQKLSogIGJsbyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJub3QgcnMsQEBhYnM6OAotICAgYm5lICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm9yICAjaW1tLHJkCi0qICBibmUgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBib3IgICNpbW0sQEByZAotICAgYmVxICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYm9yICAjaW1tLEBAYWJzOjgKLSogIGJlcSAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzZXQgI2ltbSxyZAotICAgYnZjICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnNldCAjaW1tLEBAcmQKLSogIGJ2YyAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJzZXQgI2ltbSxAQGFiczo4Ci0gICBidnMgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic2V0IHJzLHJkCi0qICBidnMgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic2V0IHJzLEBAcmQKLSAgIGJwbCAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzZXQgcnMsQEBhYnM6OAotKiAgYnBsICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnNyICBwY3JlbDo4Ci0gICBibWkgIHBjcmVsOjggICAgICAgICAgICAgICAgICBic3IgIHBjcmVsOjE2Ci0qICBibWkgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic3QgICNpbW0scmQKLSAgIGJnZSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJzdCAgI2ltbSxAQHJkCi0qICBiZ2UgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBic3QgICNpbW0sQEBhYnM6OAotICAgYmx0ICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnRzdCAjaW1tLHJkCi0qICBibHQgIHBjcmVsOjE2ICAgICAgICAgICAgICAgICBidHN0ICNpbW0sQEByZAotICAgYmd0ICBwY3JlbDo4ICAgICAgICAgICAgICAgICAgYnRzdCAjaW1tLEBAYWJzOjgKLSogIGJndCAgcGNyZWw6MTYgICAgICAgICAgICAgICAgIGJ0c3QgcnMscmQKLSAgIGJsZSAgcGNyZWw6OCAgICAgICAgICAgICAgICAgIGJ0c3QgcnMsQEByZAotKiAgYmxlICBwY3JlbDoxNiAgICAgICAgICAgICAgICAgYnRzdCBycyxAQGFiczo4Ci0gICBiY2xyICNpbW0scmQgICAgICAgICAgICAgICAgICBieG9yICNpbW0scmQKLSAgIGJjbHIgI2ltbSxAQHJkICAgICAgICAgICAgICAgICBieG9yICNpbW0sQEByZAotICAgYmNsciAjaW1tLEBAYWJzOjggICAgICAgICAgICAgIGJ4b3IgI2ltbSxAQGFiczo4Ci0gICBiY2xyIHJzLHJkICAgICAgICAgICAgICAgICAgICBjbXAuYiAjaW1tLHJkCi0gICBiY2xyIHJzLEBAcmQgICAgICAgICAgICAgICAgICAgY21wLmIgcnMscmQKLSAgIGJjbHIgcnMsQEBhYnM6OCAgICAgICAgICAgICAgICBjbXAudyBycyxyZAotICAgYmlhbmQgI2ltbSxyZCAgICAgICAgICAgICAgICAgY21wLncgcnMscmQKLSAgIGJpYW5kICNpbW0sQEByZCAgICAgICAgICAgICAqICBjbXAudyAjaW1tLHJkCi0gICBiaWFuZCAjaW1tLEBAYWJzOjggICAgICAgICAgKiAgY21wLmwgI2ltbSxyZAotICAgYmlsZCAjaW1tLHJkICAgICAgICAgICAgICAgKiAgY21wLmwgcnMscmQKLSAgIGJpbGQgI2ltbSxAQHJkICAgICAgICAgICAgICAgICBkYWEgIHJzCi0gICBiaWxkICNpbW0sQEBhYnM6OCAgICAgICAgICAgICAgZGFzICBycwotICAgYmlvciAjaW1tLHJkICAgICAgICAgICAgICAgICAgZGVjLmIgcnMKLSAgIGJpb3IgI2ltbSxAQHJkICAgICAgICAgICAgICAqICBkZWMudyAjaW1tLHJkCi0gICBiaW9yICNpbW0sQEBhYnM6OCAgICAgICAgICAgKiAgZGVjLmwgI2ltbSxyZAotICAgYmlzdCAjaW1tLHJkICAgICAgICAgICAgICAgICAgZGl2eHUuYiBycyxyZAotICAgYmlzdCAjaW1tLEBAcmQgICAgICAgICAgICAgICogIGRpdnh1LncgcnMscmQKLSAgIGJpc3QgI2ltbSxAQGFiczo4ICAgICAgICAgICAqICBkaXZ4cy5iIHJzLHJkCi0gICBiaXhvciAjaW1tLHJkICAgICAgICAgICAgICAqICBkaXZ4cy53IHJzLHJkCi0gICBiaXhvciAjaW1tLEBAcmQgICAgICAgICAgICAgICAgZWVwbW92Ci0gICBiaXhvciAjaW1tLEBAYWJzOjggICAgICAgICAgKiAgZWVwbW92dwotQHBhZ2UKLSogIGV4dHMudyByZCAgICAgICAgICAgICAgICAgICAgIG1vdi53IHJzLEBAYWJzOjE2Ci0qICBleHRzLmwgcmQgICAgICAgICAgICAgICAgICAqICBtb3YubCAjaW1tLHJkCi0qICBleHR1LncgcmQgICAgICAgICAgICAgICAgICAqICBtb3YubCBycyxyZAotKiAgZXh0dS5sIHJkICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEBycyxyZAotICAgaW5jICBycyAgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgQEAoZGlzcDoxNixycykscmQKLSogIGluYy53ICNpbW0scmQgICAgICAgICAgICAgICogIG1vdi5sIEBAKGRpc3A6MjQscnMpLHJkCi0qICBpbmMubCAjaW1tLHJkICAgICAgICAgICAgICAqICBtb3YubCBAQHJzKyxyZAotICAgam1wICBAQHJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIEBAYWJzOjE2LHJkCi0gICBqbXAgIGFicyAgICAgICAgICAgICAgICAgICAqICBtb3YubCBAQGFiczoyNCxyZAotICAgam1wICBAQEBAYWJzOjggICAgICAgICAgICAgICAqICBtb3YubCBycyxAQHJkCi0gICBqc3IgIEBAcnMgICAgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEAoZGlzcDoxNixyZCkKLSAgIGpzciAgYWJzICAgICAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBAKGRpc3A6MjQscmQpCi0gICBqc3IgIEBAQEBhYnM6OCAgICAgICAgICAgICAgICogIG1vdi5sIHJzLEBALXJkCi0gICBsZGMgICNpbW0sY2NyICAgICAgICAgICAgICAqICBtb3YubCBycyxAQGFiczoxNgotICAgbGRjICBycyxjY3IgICAgICAgICAgICAgICAgKiAgbW92LmwgcnMsQEBhYnM6MjQKLSogIGxkYyAgQEBhYnM6MTYsY2NyICAgICAgICAgICAgICBtb3ZmcGUgQEBhYnM6MTYscmQKLSogIGxkYyAgQEBhYnM6MjQsY2NyICAgICAgICAgICAgICBtb3Z0cGUgcnMsQEBhYnM6MTYKLSogIGxkYyAgQEAoZGlzcDoxNixycyksY2NyICAgICAgICBtdWx4dS5iIHJzLHJkCi0qICBsZGMgIEBAKGRpc3A6MjQscnMpLGNjciAgICAgKiAgbXVseHUudyBycyxyZAotKiAgbGRjICBAQHJzKyxjY3IgICAgICAgICAgICAgICogIG11bHhzLmIgcnMscmQKLSogIGxkYyAgQEBycyxjY3IgICAgICAgICAgICAgICAqICBtdWx4cy53IHJzLHJkCi0qICBtb3YuYiBAQChkaXNwOjI0LHJzKSxyZCAgICAgICAgbmVnLmIgcnMKLSogIG1vdi5iIHJzLEBAKGRpc3A6MjQscmQpICAgICAqICBuZWcudyBycwotICAgbW92LmIgQEBhYnM6MTYscmQgICAgICAgICAgICogIG5lZy5sIHJzCi0gICBtb3YuYiBycyxyZCAgICAgICAgICAgICAgICAgICBub3AKLSAgIG1vdi5iIEBAYWJzOjgscmQgICAgICAgICAgICAgICBub3QuYiBycwotICAgbW92LmIgcnMsQEBhYnM6OCAgICAgICAgICAgICogIG5vdC53IHJzCi0gICBtb3YuYiBycyxyZCAgICAgICAgICAgICAgICAqICBub3QubCBycwotICAgbW92LmIgI2ltbSxyZCAgICAgICAgICAgICAgICAgb3IuYiAjaW1tLHJkCi0gICBtb3YuYiBAQHJzLHJkICAgICAgICAgICAgICAgICAgb3IuYiBycyxyZAotICAgbW92LmIgQEAoZGlzcDoxNixycykscmQgICAgICogIG9yLncgI2ltbSxyZAotICAgbW92LmIgQEBycysscmQgICAgICAgICAgICAgICogIG9yLncgcnMscmQKLSAgIG1vdi5iIEBAYWJzOjgscmQgICAgICAgICAgICAqICBvci5sICNpbW0scmQKLSAgIG1vdi5iIHJzLEBAcmQgICAgICAgICAgICAgICAqICBvci5sIHJzLHJkCi0gICBtb3YuYiBycyxAQChkaXNwOjE2LHJkKSAgICAgICAgb3JjICAjaW1tLGNjcgotICAgbW92LmIgcnMsQEAtcmQgICAgICAgICAgICAgICAgIHBvcC53IHJzCi0gICBtb3YuYiBycyxAQGFiczo4ICAgICAgICAgICAgKiAgcG9wLmwgcnMKLSAgIG1vdi53IHJzLEBAcmQgICAgICAgICAgICAgICAgICBwdXNoLncgcnMKLSogIG1vdi53IEBAKGRpc3A6MjQscnMpLHJkICAgICAqICBwdXNoLmwgcnMKLSogIG1vdi53IHJzLEBAKGRpc3A6MjQscmQpICAgICAgICByb3RsLmIgcnMKLSogIG1vdi53IEBAYWJzOjI0LHJkICAgICAgICAgICAqICByb3RsLncgcnMKLSogIG1vdi53IHJzLEBAYWJzOjI0ICAgICAgICAgICAqICByb3RsLmwgcnMKLSAgIG1vdi53IHJzLHJkICAgICAgICAgICAgICAgICAgIHJvdHIuYiBycwotICAgbW92LncgI2ltbSxyZCAgICAgICAgICAgICAgKiAgcm90ci53IHJzCi0gICBtb3YudyBAQHJzLHJkICAgICAgICAgICAgICAgKiAgcm90ci5sIHJzCi0gICBtb3YudyBAQChkaXNwOjE2LHJzKSxyZCAgICAgICAgcm90eGwuYiBycwotICAgbW92LncgQEBycysscmQgICAgICAgICAgICAgICogIHJvdHhsLncgcnMKLSAgIG1vdi53IEBAYWJzOjE2LHJkICAgICAgICAgICAqICByb3R4bC5sIHJzCi0gICBtb3YudyBycyxAQChkaXNwOjE2LHJkKSAgICAgICAgcm90eHIuYiBycwotICAgbW92LncgcnMsQEAtcmQgICAgICAgICAgICAgICogIHJvdHhyLncgcnMKLUBwYWdlCi0qICByb3R4ci5sIHJzICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQChkaXNwOjI0LHJkKQotICAgYnB0ICAgICAgICAgICAgICAgICAgICAgICAgKiAgc3RjICBjY3IsQEAtcmQKLSAgIHJ0ZSAgICAgICAgICAgICAgICAgICAgICAgICogIHN0YyAgY2NyLEBAYWJzOjE2Ci0gICBydHMgICAgICAgICAgICAgICAgICAgICAgICAqICBzdGMgIGNjcixAQGFiczoyNAotICAgc2hhbC5iIHJzICAgICAgICAgICAgICAgICAgICAgc3ViLmIgcnMscmQKLSogIHNoYWwudyBycyAgICAgICAgICAgICAgICAgICAgIHN1Yi53IHJzLHJkCi0qICBzaGFsLmwgcnMgICAgICAgICAgICAgICAgICAqICBzdWIudyAjaW1tLHJkCi0gICBzaGFyLmIgcnMgICAgICAgICAgICAgICAgICAqICBzdWIubCBycyxyZAotKiAgc2hhci53IHJzICAgICAgICAgICAgICAgICAgKiAgc3ViLmwgI2ltbSxyZAotKiAgc2hhci5sIHJzICAgICAgICAgICAgICAgICAgICAgc3VicyAjaW1tLHJkCi0gICBzaGxsLmIgcnMgICAgICAgICAgICAgICAgICAgICBzdWJ4ICNpbW0scmQKLSogIHNobGwudyBycyAgICAgICAgICAgICAgICAgICAgIHN1YnggcnMscmQKLSogIHNobGwubCBycyAgICAgICAgICAgICAgICAgICogIHRyYXBhICNpbW0KLSAgIHNobHIuYiBycyAgICAgICAgICAgICAgICAgICAgIHhvciAgI2ltbSxyZAotKiAgc2hsci53IHJzICAgICAgICAgICAgICAgICAgICAgeG9yICBycyxyZAotKiAgc2hsci5sIHJzICAgICAgICAgICAgICAgICAgKiAgeG9yLncgI2ltbSxyZAotICAgc2xlZXAgICAgICAgICAgICAgICAgICAgICAgKiAgeG9yLncgcnMscmQKLSAgIHN0YyAgY2NyLHJkICAgICAgICAgICAgICAgICogIHhvci5sICNpbW0scmQKLSogIHN0YyAgY2NyLEBAcnMgICAgICAgICAgICAgICAqICB4b3IubCBycyxyZAotKiAgc3RjICBjY3IsQEAoZGlzcDoxNixyZCkgICAgICAgIHhvcmMgI2ltbSxjY3IKLUBlbmQgc21hbGxleGFtcGxlCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggc2l6ZSBzdWZmaXhlcywgSDgvMzAwCi1AY2luZGV4IEg4LzMwMCBzaXplIHN1ZmZpeGVzCi1Gb3VyIEg4LzMwMCBpbnN0cnVjdGlvbnMgKEBjb2Rle2FkZH0sIEBjb2Rle2NtcH0sIEBjb2Rle21vdn0sCi1AY29kZXtzdWJ9KSBhcmUgZGVmaW5lZCB3aXRoIHZhcmlhbnRzIHVzaW5nIHRoZSBzdWZmaXhlcyBAc2FtcHsuYn0sCi1Ac2FtcHsud30sIGFuZCBAc2FtcHsubH0gdG8gc3BlY2lmeSB0aGUgc2l6ZSBvZiBhIG1lbW9yeSBvcGVyYW5kLgotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgdGhlc2Ugc3VmZml4ZXMsIGJ1dCBkb2VzIG5vdCByZXF1aXJlIHRoZW07Ci1zaW5jZSBvbmUgb2YgdGhlIG9wZXJhbmRzIGlzIGFsd2F5cyBhIHJlZ2lzdGVyLCBAY29kZXtAdmFsdWV7QVN9fSBjYW4KLWRlZHVjZSB0aGUgY29ycmVjdCBzaXplLgotCi1Gb3IgZXhhbXBsZSwgc2luY2UgQGNvZGV7cjB9IHJlZmVycyB0byBhIDE2LWJpdCByZWdpc3RlciwKLUBleGFtcGxlCi1tb3YgICAgcjAsQEBmb28KLUBleGRlbnQgaXMgZXF1aXZhbGVudCB0bwotbW92LncgIHIwLEBAZm9vCi1AZW5kIGV4YW1wbGUKLQotSWYgeW91IHVzZSB0aGUgc2l6ZSBzdWZmaXhlcywgQGNvZGV7QHZhbHVle0FTfX0gaXNzdWVzIGEgd2FybmluZyB3aGVuCi10aGUgc3VmZml4IGFuZCB0aGUgcmVnaXN0ZXIgc2l6ZSBkbyBub3QgbWF0Y2guCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaDg1MDAudGV4aSBiL2dhcy9kb2MvYy1oODUwMC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYwZTY0Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1oODUwMC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQHBhZ2UKLUBub2RlIEg4LzUwMC1EZXBlbmRlbnQKLUBjaGFwdGVyIEg4LzUwMCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBIOC81MDAgc3VwcG9ydAotQG1lbnUKLSogSDgvNTAwIE9wdGlvbnM6OiAgICAgICAgICAgICAgT3B0aW9ucwotKiBIOC81MDAgU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogSDgvNTAwIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogSDgvNTAwIERpcmVjdGl2ZXM6OiAgICAgICAgICAgSDgvNTAwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBIOC81MDAgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSDgvNTAwIE9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBIOC81MDAgb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucywgSDgvNTAwIChub25lKQotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBIaXRhY2hpCi1IOC81MDAgZmFtaWx5LgotCi1Abm9kZSBIOC81MDAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLQotQG1lbnUKLSogSDgvNTAwLUNoYXJzOjogICAgICAgICAgICAgICAgU3BlY2lhbCBDaGFyYWN0ZXJzCi0qIEg4LzUwMC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi0qIEg4LzUwMC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBIOC81MDAtQ2hhcnMKLUBzdWJzZWN0aW9uIFNwZWNpYWwgQ2hhcmFjdGVycwotCi1AY2luZGV4IGxpbmUgY29tbWVudCBjaGFyYWN0ZXIsIEg4LzUwMAotQGNpbmRleCBIOC81MDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7IX0gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIEg4LzUwMAotQGNpbmRleCBzdGF0ZW1lbnQgc2VwYXJhdG9yLCBIOC81MDAKLUBjaW5kZXggSDgvNTAwIGxpbmUgc2VwYXJhdG9yCi1Ac2FtcHs7fSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIEg4LzUwMC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IEg4LzUwMCByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBIOC81MDAKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9LCBAc2FtcHtyMX0sIEBzYW1we3IyfSwKLUBzYW1we3IzfSwgQHNhbXB7cjR9LCBAc2FtcHtyNX0sIEBzYW1we3I2fSwgYW5kIEBzYW1we3I3fSB0byByZWZlciB0bwotdGhlIEg4LzUwMCByZWdpc3RlcnMuCi0KLVRoZSBIOC81MDAgYWxzbyBoYXMgdGhlc2UgY29udHJvbCByZWdpc3RlcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gY3AKLWNvZGUgcG9pbnRlcgotCi1AaXRlbSBkcAotZGF0YSBwb2ludGVyCi0KLUBpdGVtIGJwCi1iYXNlIHBvaW50ZXIKLQotQGl0ZW0gdHAKLXN0YWNrIHRvcCBwb2ludGVyCi0KLUBpdGVtIGVwCi1leHRyYSBwb2ludGVyCi0KLUBpdGVtIHNyCi1zdGF0dXMgcmVnaXN0ZXIKLQotQGl0ZW0gY2NyCi1jb25kaXRpb24gY29kZSByZWdpc3RlcgotQGVuZCB0YWJsZQotCi1BbGwgcmVnaXN0ZXJzIGFyZSAxNiBiaXRzIGxvbmcuICBUbyByZXByZXNlbnQgMzIgYml0IG51bWJlcnMsIHVzZSB0d28KLWFkamFjZW50IHJlZ2lzdGVyczsgZm9yIGRpc3RhbnQgbWVtb3J5IGFkZHJlc3NlcywgdXNlIG9uZSBvZiB0aGUgc2VnbWVudAotcG9pbnRlcnMgKEBjb2Rle2NwfSBmb3IgdGhlIHByb2dyYW0gY291bnRlcjsgQGNvZGV7ZHB9IGZvcgotQGNvZGV7cjB9LS1AY29kZXtyM307IEBjb2Rle2VwfSBmb3IgQGNvZGV7cjR9IGFuZCBAY29kZXtyNX07IGFuZAotQGNvZGV7dHB9IGZvciBAY29kZXtyNn0gYW5kIEBjb2Rle3I3fS4KLQotQG5vZGUgSDgvNTAwLUFkZHJlc3NpbmcKLUBzdWJzZWN0aW9uIEFkZHJlc3NpbmcgTW9kZXMKLQotQGNpbmRleCBhZGRyZXNzaW5nIG1vZGVzLCBIOC81MDAKLUBjaW5kZXggSDgvNTAwIGFkZHJlc3NpbmcgbW9kZXMKLUB2YWx1ZXtBU30gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGZvciB0aGUgSDgvNTAwOgotQHRhYmxlIEBjb2RlCi1AaXRlbSBSQHZhcntufQotUmVnaXN0ZXIgZGlyZWN0Ci0KLUBpdGVtIEBAUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0Ci0KLUBpdGVtIEBAKGQ6OCwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIDggYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQKLQotQGl0ZW0gQEAoZDoxNiwgUkB2YXJ7bn0pCi1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIDE2IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50Ci0KLUBpdGVtIEBALVJAdmFye259Ci1SZWdpc3RlciBpbmRpcmVjdCB3aXRoIHByZS1kZWNyZW1lbnQKLQotQGl0ZW0gQEBSQHZhcntufSsKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcG9zdC1pbmNyZW1lbnQKLQotQGl0ZW0gQEBAdmFye2FhfTo4Ci04IGJpdCBhYnNvbHV0ZSBhZGRyZXNzCi0KLUBpdGVtIEBAQHZhcnthYX06MTYKLTE2IGJpdCBhYnNvbHV0ZSBhZGRyZXNzCi0KLUBpdGVtICNAdmFye3h4fTo4Ci04IGJpdCBpbW1lZGlhdGUKLQotQGl0ZW0gI0B2YXJ7eHh9OjE2Ci0xNiBiaXQgaW1tZWRpYXRlCi1AZW5kIHRhYmxlCi0KLUBub2RlIEg4LzUwMCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgSDgvNTAwIChAc2N7aWVlZX0pCi1AY2luZGV4IEg4LzUwMCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotVGhlIEg4LzUwMCBmYW1pbHkgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0KLWRpcmVjdGl2ZSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuCi0KLUBub2RlIEg4LzUwMCBEaXJlY3RpdmVzCi1Ac2VjdGlvbiBIOC81MDAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggSDgvNTAwIG1hY2hpbmUgZGlyZWN0aXZlcyAobm9uZSkKLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBIOC81MDAgKG5vbmUpCi1AY2luZGV4IEBjb2Rle3dvcmR9IGRpcmVjdGl2ZSwgSDgvNTAwCi1AY2luZGV4IEBjb2Rle2ludH0gZGlyZWN0aXZlLCBIOC81MDAKLUBjb2Rle0B2YWx1ZXtBU319IGhhcyBubyBtYWNoaW5lLWRlcGVuZGVudCBkaXJlY3RpdmVzIGZvciB0aGUgSDgvNTAwLgotSG93ZXZlciwgb24gdGhpcyBwbGF0Zm9ybSB0aGUgQHNhbXB7LmludH0gYW5kIEBzYW1wey53b3JkfSBkaXJlY3RpdmVzCi1nZW5lcmF0ZSAxNi1iaXQgbnVtYmVycy4KLQotQG5vZGUgSDgvNTAwIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBIOC81MDAgb3Bjb2RlIHN1bW1hcnkKLUBjaW5kZXggb3Bjb2RlIHN1bW1hcnksIEg4LzUwMAotQGNpbmRleCBtbmVtb25pY3MsIEg4LzUwMAotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBIOC81MDAKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgSDgvNTAwIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle0g4LzUwMCBTZXJpZXMgUHJvZ3JhbW1pbmcgTWFudWFsfSAoSGl0YWNoaSBNMjFUMDAxKS4KLQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIEg4LzUwMCBvcGNvZGVzLiAgTm8gYWRkaXRpb25hbAotcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LgotCi1AaWZzZXQgU01BTEwKLUBjIHRoaXMgdGFibGUsIGR1ZSB0byB0aGUgbXVsdGktY29sIGZha2luZyBhbmQgaGFyZGNvZGVkIG9yZGVyLCBsb29rcyBzaWxseQotQGMgZXhjZXB0IGluIHNtYWxsYm9vay4gIFNlZSBjb21tZW50cyBiZWxvdyAiQHNldCBTTUFMTCIgbmVhciB0b3Agb2YgdGhpcyBmaWxlLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgSDgvNTAwIG9wY29kZXMgYW5kIHRoZWlyIG9wZXJhbmRzOgotCi1AYyBVc2UgQGdyb3VwIGlmIGl0IGV2ZXIgd29ya3MsIGluc3RlYWQgb2YgQHBhZ2UKLUBwYWdlCi1Ac21hbGxleGFtcGxlCi1AaXtMZWdlbmQ6fQotYWJzOCAgICAgIEByezgtYml0IGFic29sdXRlIGFkZHJlc3N9Ci1hYnMxNiAgICAgQHJ7MTYtYml0IGFic29sdXRlIGFkZHJlc3N9Ci1hYnMyNCAgICAgQHJ7MjQtYml0IGFic29sdXRlIGFkZHJlc3N9Ci1jcmIgICAgICAgQHJ7QGNvZGV7Y2NyfSwgQGNvZGV7YnJ9LCBAY29kZXtlcH0sIEBjb2Rle2RwfSwgQGNvZGV7dHB9LCBAY29kZXtkcH19Ci1kaXNwOCAgICAgQHJ7OC1iaXQgZGlzcGxhY2VtZW50fQotZWEgICAgICAgIEBye0Bjb2Rle3JufSwgQGNvZGV7QEBybn0sIEBjb2Rle0BAKGQ6OCwgcm4pfSwgQGNvZGV7QEAoZDoxNiwgcm4pfSx9Ci0gICAgICAgICAgQHJ7QGNvZGV7QEAtcm59LCBAY29kZXtAQHJuK30sIEBjb2Rle0BAYWE6OH0sIEBjb2Rle0BAYWE6MTZ9LH0KLSAgICAgICAgICBAcntAY29kZXsjeHg6OH0sIEBjb2RleyN4eDoxNn19Ci1lYV9tZW0gICAgQHJ7QGNvZGV7QEBybn0sIEBjb2Rle0BAKGQ6OCwgcm4pfSwgQGNvZGV7QEAoZDoxNiwgcm4pfSx9Ci0gICAgICAgICAgQHJ7QGNvZGV7QEAtcm59LCBAY29kZXtAQHJuK30sIEBjb2Rle0BAYWE6OH0sIEBjb2Rle0BAYWE6MTZ9fQotZWFfbm9pbW0gIEBye0Bjb2Rle3JufSwgQGNvZGV7QEBybn0sIEBjb2Rle0BAKGQ6OCwgcm4pfSwgQGNvZGV7QEAoZDoxNiwgcm4pfSx9Ci0gICAgICAgICAgQHJ7QGNvZGV7QEAtcm59LCBAY29kZXtAQHJuK30sIEBjb2Rle0BAYWE6OH0sIEBjb2Rle0BAYWE6MTZ9fQotZnAgICAgICAgIHI2Ci1pbW00ICAgICAgQHJ7NC1iaXQgaW1tZWRpYXRlIGRhdGF9Ci1pbW04ICAgICAgQHJ7OC1iaXQgaW1tZWRpYXRlIGRhdGF9Ci1pbW0xNiAgICAgQHJ7MTYtYml0IGltbWVkaWF0ZSBkYXRhfQotcGNyZWw4ICAgIEByezgtYml0IG9mZnNldCBmcm9tIHByb2dyYW0gY291bnRlcn0KLXBjcmVsMTYgICBAcnsxNi1iaXQgb2Zmc2V0IGZyb20gcHJvZ3JhbSBjb3VudGVyfQotcWltICAgICAgIEBye0Bjb2Rley0yfSwgQGNvZGV7LTF9LCBAY29kZXsxfSwgQGNvZGV7Mn19Ci1yZCAgICAgICAgQHJ7YW55IHJlZ2lzdGVyfQotcnMgICAgICAgIEBye2EgcmVnaXN0ZXIgZGlzdGluY3QgZnJvbSByZH0KLXJsaXN0ICAgICBAcntjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWdpc3RlcnMgaW4gcGFyZW50aGVzZXM7fQotICAgICAgICAgIEBye3JlZ2lzdGVyIHJhbmdlcyBAY29kZXtyZC1yc30gYXJlIGFsbG93ZWR9Ci1zcCAgICAgICAgQHJ7c3RhY2sgcG9pbnRlciAoQGNvZGV7cjd9KX0KLXNyICAgICAgICBAcntzdGF0dXMgcmVnaXN0ZXJ9Ci1zeiAgICAgICAgQHJ7c2l6ZTsgQHNhbXB7LmJ9IG9yIEBzYW1wey53fS4gIElmIG9taXR0ZWQsIGRlZmF1bHQgQHNhbXB7Lnd9fQotCi1sZGNbLmJdIGVhLGNyYiAgICAgICAgICAgICAgICAgYmNjWy53XSBwY3JlbDE2Ci1sZGNbLnddIGVhLHNyICAgICAgICAgICAgICAgICAgYmNjWy5iXSBwY3JlbDggCi1hZGRbOnFdIHN6IHFpbSxlYV9ub2ltbSAgICAgICAgYmhzWy53XSBwY3JlbDE2Ci1hZGRbOmddIHN6IGVhLHJkICAgICAgICAgICAgICAgYmhzWy5iXSBwY3JlbDggCi1hZGRzIHN6IGVhLHJkICAgICAgICAgICAgICAgICAgYmNzWy53XSBwY3JlbDE2Ci1hZGR4IHN6IGVhLHJkICAgICAgICAgICAgICAgICAgYmNzWy5iXSBwY3JlbDggCi1hbmQgc3ogZWEscmQgICAgICAgICAgICAgICAgICAgYmxvWy53XSBwY3JlbDE2Ci1hbmRjWy5iXSBpbW04LGNyYiAgICAgICAgICAgICAgYmxvWy5iXSBwY3JlbDggCi1hbmRjWy53XSBpbW0xNixzciAgICAgICAgICAgICAgYm5lWy53XSBwY3JlbDE2Ci1icHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm5lWy5iXSBwY3JlbDggCi1icmFbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgYmVxWy53XSBwY3JlbDE2Ci1icmFbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgYmVxWy5iXSBwY3JlbDggCi1idFsud10gcGNyZWwxNiAgICAgICAgICAgICAgICAgYnZjWy53XSBwY3JlbDE2Ci1idFsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICAgYnZjWy5iXSBwY3JlbDggCi1icm5bLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgYnZzWy53XSBwY3JlbDE2Ci1icm5bLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgYnZzWy5iXSBwY3JlbDggCi1iZlsud10gcGNyZWwxNiAgICAgICAgICAgICAgICAgYnBsWy53XSBwY3JlbDE2Ci1iZlsuYl0gcGNyZWw4ICAgICAgICAgICAgICAgICAgYnBsWy5iXSBwY3JlbDggCi1iaGlbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgYm1pWy53XSBwY3JlbDE2Ci1iaGlbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgYm1pWy5iXSBwY3JlbDggCi1ibHNbLnddIHBjcmVsMTYgICAgICAgICAgICAgICAgYmdlWy53XSBwY3JlbDE2Ci1ibHNbLmJdIHBjcmVsOCAgICAgICAgICAgICAgICAgYmdlWy5iXSBwY3JlbDggCi1AcGFnZQotYmx0Wy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIG1vdls6Z11bLmJdIGltbTgsZWFfbWVtICAgICAgIAotYmx0Wy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIG1vdls6Z11bLnddIGltbTE2LGVhX21lbSAgICAgIAotYmd0Wy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIG1vdmZwZVsuYl0gZWEscmQgICAgICAgICAgICAgIAotYmd0Wy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIG1vdnRwZVsuYl0gcnMsZWFfbm9pbW0gICAgICAgIAotYmxlWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIG11bHh1IHN6IGVhLHJkICAgICAgICAgICAgICAgIAotYmxlWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIG5lZyBzeiBlYSAgICAgICAgICAgICAgICAgICAgIAotYmNsciBzeiBpbW00LGVhX25vaW1tICAgICAgICAgIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgIAotYmNsciBzeiBycyxlYV9ub2ltbSAgICAgICAgICAgIG5vdCBzeiBlYSAgICAgICAgICAgICAgICAgICAgIAotYm5vdCBzeiBpbW00LGVhX25vaW1tICAgICAgICAgIG9yIHN6IGVhLHJkICAgICAgICAgICAgICAgICAgIAotYm5vdCBzeiBycyxlYV9ub2ltbSAgICAgICAgICAgIG9yY1suYl0gaW1tOCxjcmIgICAgICAgICAgICAgIAotYnNldCBzeiBpbW00LGVhX25vaW1tICAgICAgICAgIG9yY1sud10gaW1tMTYsc3IgICAgICAgICAgICAgIAotYnNldCBzeiBycyxlYV9ub2ltbSAgICAgICAgICAgIHBqbXAgYWJzMjQgICAgICAgICAgICAgICAgICAgIAotYnNyWy5iXSBwY3JlbDggICAgICAgICAgICAgICAgIHBqbXAgQEByZCAgICAgICAgICAgICAgICAgICAgIAotYnNyWy53XSBwY3JlbDE2ICAgICAgICAgICAgICAgIHBqc3IgYWJzMjQgICAgICAgICAgICAgICAgICAgIAotYnRzdCBzeiBpbW00LGVhX25vaW1tICAgICAgICAgIHBqc3IgQEByZCAgICAgICAgICAgICAgICAgICAgIAotYnRzdCBzeiBycyxlYV9ub2ltbSAgICAgICAgICAgIHBydGQgaW1tOCAgICAgICAgICAgICAgICAgICAgIAotY2xyIHN6IGVhICAgICAgICAgICAgICAgICAgICAgIHBydGQgaW1tMTYgICAgICAgICAgICAgICAgICAgIAotY21wWzplXVsuYl0gaW1tOCxyZCAgICAgICAgICAgIHBydHMgICAgICAgICAgICAgICAgICAgICAgICAgIAotY21wWzppXVsud10gaW1tMTYscmQgICAgICAgICAgIHJvdGwgc3ogZWEgICAgICAgICAgICAgICAgICAgIAotY21wWzpnXS5iIGltbTgsZWFfbm9pbW0gICAgICAgIHJvdHIgc3ogZWEgICAgICAgICAgICAgICAgICAgIAotY21wWzpnXVsud10gaW1tMTYsZWFfbm9pbW0gICAgIHJvdHhsIHN6IGVhICAgICAgICAgICAgICAgICAgIAotQ21wWzpnXSBzeiBlYSxyZCAgICAgICAgICAgICAgIHJvdHhyIHN6IGVhICAgICAgICAgICAgICAgICAgIAotZGFkZCBycyxyZCAgICAgICAgICAgICAgICAgICAgIHJ0ZCBpbW04ICAgICAgICAgICAgICAgICAgICAgCi1kaXZ4dSBzeiBlYSxyZCAgICAgICAgICAgICAgICAgcnRkIGltbTE2ICAgICAgICAgICAgICAgICAgICAKLWRzdWIgcnMscmQgICAgICAgICAgICAgICAgICAgICBydHMgICAgICAgICAgICAgICAgICAgICAgICAgIAotZXh0c1suYl0gcmQgICAgICAgICAgICAgICAgICAgIHNjYi9mIHJzLHBjcmVsOCAgICAgICAgICAgICAgIAotZXh0dVsuYl0gcmQgICAgICAgICAgICAgICAgICAgIHNjYi9uZSBycyxwY3JlbDggICAgICAgICAgICAgCi1qbXAgQEByZCAgICAgICAgICAgICAgICAgICAgICAgIHNjYi9lcSBycyxwY3JlbDggICAgICAgICAgICAgCi1qbXAgQEAoaW1tOCxyZCkgICAgICAgICAgICAgICAgIHNoYWwgc3ogZWEgICAgICAgICAgICAgICAgICAgCi1qbXAgQEAoaW1tMTYscmQpICAgICAgICAgICAgICAgIHNoYXIgc3ogZWEgICAgICAgICAgICAgICAgICAgIAotam1wIGFiczE2ICAgICAgICAgICAgICAgICAgICAgIHNobGwgc3ogZWEgICAgICAgICAgICAKLWpzciBAQHJkICAgICAgICAgICAgICAgICAgICAgICAgc2hsciBzeiBlYSAgICAgICAgICAgIAotanNyIEBAKGltbTgscmQpICAgICAgICAgICAgICAgICBzbGVlcCAgICAgICAgICAgICAgICAgCi1qc3IgQEAoaW1tMTYscmQpICAgICAgICAgICAgICAgIHN0Y1suYl0gY3JiLGVhX25vaW1tICAKLWpzciBhYnMxNiAgICAgICAgICAgICAgICAgICAgICBzdGNbLnddIHNyLGVhX25vaW1tICAgCi1sZG0gQEBzcCssKHJsaXN0KSAgICAgICAgICAgICAgIHN0bSAocmxpc3QpLEBALXNwICAgICAKLWxpbmsgZnAsaW1tOCAgICAgICAgICAgICAgICAgICBzdWIgc3ogZWEscmQgICAgICAgICAgCi1saW5rIGZwLGltbTE2ICAgICAgICAgICAgICAgICAgc3VicyBzeiBlYSxyZCAgICAgICAgIAotbW92WzplXVsuYl0gaW1tOCxyZCAgICAgICAgICAgIHN1Ynggc3ogZWEscmQgICAgICAgICAKLW1vdls6aV1bLnddIGltbTE2LHJkICAgICAgICAgICBzd2FwWy5iXSByZCAgICAgICAgICAgCi1tb3ZbOmxdWy53XSBhYnM4LHJkICAgICAgICAgICAgdGFzWy5iXSBlYSAgICAgCi1tb3ZbOmxdLmIgYWJzOCxyZCAgICAgICAgICAgICAgdHJhcGEgaW1tNCAgICAgCi1tb3ZbOnNdWy53XSBycyxhYnM4ICAgICAgICAgICAgdHJhcC92cyAgICAgICAgCi1tb3ZbOnNdLmIgcnMsYWJzOCAgICAgICAgICAgICAgdHN0IHN6IGVhICAgICAgCi1tb3ZbOmZdWy53XSBAQChkaXNwOCxmcCkscmQgICAgIHVubGsgZnAgICAgICAgIAotbW92WzpmXVsud10gcnMsQEAoZGlzcDgsZnApICAgICB4Y2hbLnddIHJzLHJkIAotbW92WzpmXS5iIEBAKGRpc3A4LGZwKSxyZCAgICAgICB4b3Igc3ogZWEscmQgICAKLW1vdls6Zl0uYiBycyxAQChkaXNwOCxmcCkgICAgICAgeG9yYy5iIGltbTgsY3JiCi1tb3ZbOmddIHN6IHJzLGVhX21lbSAgICAgICAgICAgeG9yYy53IGltbTE2LHNyCi1tb3ZbOmddIHN6IGVhLHJkICAgICAgICAgICAgICAKLUBlbmQgc21hbGxleGFtcGxlCi1AZW5kIGlmc2V0CmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtaHBwYS50ZXhpIGIvZ2FzL2RvYy9jLWhwcGEudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNTM1Zi4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtaHBwYS50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLUBjIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQHBhZ2UKLUBub2RlIEhQUEEtRGVwZW5kZW50Ci1AY2hhcHRlciBIUFBBIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4ICBzdXBwb3J0Ci1AbWVudQotKiBIUFBBIE5vdGVzOjogICAgICAgICAgICAgICAgTm90ZXMKLSogSFBQQSBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogSFBQQSBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBIUFBBIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogSFBQQSBEaXJlY3RpdmVzOjogICAgICAgICAgIEhQUEEgTWFjaGluZSBEaXJlY3RpdmVzCi0qIEhQUEEgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgSFBQQSBOb3RlcwotQHNlY3Rpb24gTm90ZXMKLUFzIGEgYmFjayBlbmQgZm9yIEBzY3tnbnV9IEBzY3tjY30gQGNvZGV7QHZhbHVle0FTfX0gaGFzIGJlZW4gdGhyb3VnaGx5IHRlc3RlZCBhbmQgc2hvdWxkCi13b3JrIGV4dHJlbWVseSB3ZWxsLiAgV2UgaGF2ZSB0ZXN0ZWQgaXQgb25seSBtaW5pbWFsbHkgb24gaGFuZCB3cml0dGVuIGFzc2VtYmx5Ci1jb2RlIGFuZCBubyBvbmUgaGFzIHRlc3RlZCBpdCBtdWNoIG9uIHRoZSBhc3NlbWJseSBvdXRwdXQgZnJvbSB0aGUgSFAKLWNvbXBpbGVycy4KLQotVGhlIGZvcm1hdCBvZiB0aGUgZGVidWdnaW5nIHNlY3Rpb25zIGhhcyBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbAotQGNvZGV7QHZhbHVle0FTfX0gcG9ydCAodmVyc2lvbiAxLjNYKSB3YXMgcmVsZWFzZWQ7IHRoZXJlZm9yZSwKLXlvdSBtdXN0IHJlYnVpbGQgYWxsIEhQUEEgb2JqZWN0cyBhbmQgbGlicmFyaWVzIHdpdGggdGhlIG5ldyAKLWFzc2VtYmxlciBzbyB0aGF0IHlvdSBjYW4gZGVidWcgdGhlIGZpbmFsIGV4ZWN1dGFibGUuCi0KLVRoZSBIUFBBIEBjb2Rle0B2YWx1ZXtBU319IHBvcnQgZ2VuZXJhdGVzIGEgc21hbGwgc3Vic2V0IG9mIHRoZSByZWxvY2F0aW9ucwotYXZhaWxhYmxlIGluIHRoZSBTT00gYW5kIEVMRiBvYmplY3QgZmlsZSBmb3JtYXRzLiAgQWRkaXRpb25hbCByZWxvY2F0aW9uCi1zdXBwb3J0IHdpbGwgYmUgYWRkZWQgYXMgaXQgYmVjb21lcyBuZWNlc3NhcnkuICAKLQotQG5vZGUgSFBQQSBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gbWFjaGluZS1kZXBlbmRlbnQgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBIUFBBLgotCi1AY2luZGV4IEhQUEEgU3ludGF4Ci1Abm9kZSBIUFBBIFN5bnRheAotQHNlY3Rpb24gU3ludGF4Ci1UaGUgYXNzZW1ibGVyIHN5bnRheCBjbG9zZWx5IGZvbGxvd3MgdGhlIEhQUEEgaW5zdHJ1Y3Rpb24gc2V0Ci1yZWZlcmVuY2UgbWFudWFsOyBhc3NlbWJsZXIgZGlyZWN0aXZlcyBhbmQgZ2VuZXJhbCBzeW50YXggY2xvc2VseSBmb2xsb3cgdGhlCi1IUFBBIGFzc2VtYmx5IGxhbmd1YWdlIHJlZmVyZW5jZSBtYW51YWwsIHdpdGggYSBmZXcgbm90ZXdvcnRoeSBkaWZmZXJlbmNlcy4KLQotRmlyc3QsIGEgY29sb24gbWF5IGltbWVkaWF0ZWx5IGZvbGxvdyBhIGxhYmVsIGRlZmluaXRpb24uICBUaGlzIGlzCi1zaW1wbHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBob3cgbW9zdCBhc3NlbWJseSBsYW5ndWFnZSBwcm9ncmFtbWVycwotd3JpdGUgY29kZS4KLQotU29tZSBvYnNjdXJlIGV4cHJlc3Npb24gcGFyc2luZyBwcm9ibGVtcyBtYXkgYWZmZWN0IGhhbmQgd3JpdHRlbiBjb2RlIHdoaWNoCi11c2VzIHRoZSBAY29kZXtzcG9wfSBpbnN0cnVjdGlvbnMsIG9yIGNvZGUgd2hpY2ggbWFrZXMgc2lnbmlmaWNhbnQKLXVzZSBvZiB0aGUgQGNvZGV7IX0gbGluZSBzZXBhcmF0b3IuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGlzIG11Y2ggbGVzcyBmb3JnaXZpbmcgYWJvdXQgbWlzc2luZyBhcmd1bWVudHMgYW5kIG90aGVyCi1zaW1pbGFyIG92ZXJzaWdodHMgdGhhbiB0aGUgSFAgYXNzZW1ibGVyLiAgQGNvZGV7QHZhbHVle0FTfX0gbm90aWZpZXMgeW91Ci1vZiBtaXNzaW5nIGFyZ3VtZW50cyBhcyBzeW50YXggZXJyb3JzOyB0aGlzIGlzIHJlZ2FyZGVkIGFzIGEgZmVhdHVyZSwgbm90IGEKLWJ1Zy4KLQotRmluYWxseSwgQGNvZGV7QHZhbHVle0FTfX0gYWxsb3dzIHlvdSB0byB1c2UgYW4gZXh0ZXJuYWwgc3ltYm9sIHdpdGhvdXQKLWV4cGxpY2l0bHkgaW1wb3J0aW5nIHRoZSBzeW1ib2wuICBAZW1waHtXYXJuaW5nOn0gaW4gdGhlIGZ1dHVyZSB0aGlzIHdpbGwgYmUKLWFuIGVycm9yIGZvciBIUFBBIHRhcmdldHMuCi0KLVNwZWNpYWwgY2hhcmFjdGVycyBmb3IgSFBQQSB0YXJnZXRzIGluY2x1ZGU6Ci0KLUBzYW1wezt9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotCi1Ac2FtcHshfSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIEhQUEEgRmxvYXRpbmcgUG9pbnQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBIUFBBIChAc2N7aWVlZX0pCi1AY2luZGV4IEhQUEEgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBIUFBBIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBIUFBBIERpcmVjdGl2ZXMKLUBzZWN0aW9uIEhQUEEgQXNzZW1ibGVyIERpcmVjdGl2ZXMKLQotQGNvZGV7QHZhbHVle0FTfX0gZm9yIHRoZSBIUFBBIHN1cHBvcnRzIG1hbnkgYWRkaXRpb25hbCBkaXJlY3RpdmVzIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBuYXRpdmUgYXNzZW1ibGVyLiAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGVtIG9ubHkKLWJyaWVmbHkuICBGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gSFBQQS1zcGVjaWZpYyBhc3NlbWJsZXIgZGlyZWN0aXZlcywgc2VlCi1AY2l0ZXtIUDkwMDAgU2VyaWVzIDgwMCBBc3NlbWJseSBMYW5ndWFnZSBSZWZlcmVuY2UgTWFudWFsfSAoSFAgOTI0MzItOTAwMDEpLgotCi1AY2luZGV4IEhQUEEgZGlyZWN0aXZlcyBub3Qgc3VwcG9ydGVkCi1AY29kZXtAdmFsdWV7QVN9fSBkb2VzIEBlbXBoe25vdH0gc3VwcG9ydCB0aGUgZm9sbG93aW5nIGFzc2VtYmxlciBkaXJlY3RpdmVzCi1kZXNjcmliZWQgaW4gdGhlIEhQIG1hbnVhbDoKLQotQGV4YW1wbGUKLS5lbmRtICAgICAgICAgICAubGlzdG9uCi0uZW50ZXIgICAgICAgICAgLmxvY2N0Ci0ubGVhdmUgICAgICAgICAgLm1hY3JvICAKLS5saXN0b2ZmCi1AZW5kIGV4YW1wbGUKLQotQGNpbmRleCBAY29kZXsucGFyYW19IG9uIEhQUEEKLUJleW9uZCB0aG9zZSBpbXBsZW1lbnRlZCBmb3IgY29tcGF0aWJpbGl0eSwgQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgb25lCi1hZGRpdGlvbmFsIGFzc2VtYmxlciBkaXJlY3RpdmUgZm9yIHRoZSBIUFBBOiBAY29kZXsucGFyYW19LiAgSXQgY29udmV5cwotcmVnaXN0ZXIgYXJndW1lbnQgbG9jYXRpb25zIGZvciBzdGF0aWMgZnVuY3Rpb25zLiAgSXRzIHN5bnRheCBjbG9zZWx5IGZvbGxvd3MKLXRoZSBAY29kZXsuZXhwb3J0fSBkaXJlY3RpdmUuCi0KLUBjaW5kZXggSFBQQS1vbmx5IGRpcmVjdGl2ZXMKLVRoZXNlIGFyZSB0aGUgYWRkaXRpb25hbCBkaXJlY3RpdmVzIGluIEBjb2Rle0B2YWx1ZXtBU319IGZvciB0aGUgSFBQQToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAuYmxvY2sgQHZhcntufQotQGl0ZW14IC5ibG9ja3ogQHZhcntufQotUmVzZXJ2ZSBAdmFye259IGJ5dGVzIG9mIHN0b3JhZ2UsIGFuZCBpbml0aWFsaXplIHRoZW0gdG8gemVyby4KLQotQGl0ZW0gLmNhbGwgCi1NYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSBwcm9jZWR1cmUgY2FsbC4gIE9ubHkgdGhlIHNwZWNpYWwgY2FzZSB3aXRoIEBlbXBoe25vCi1hcmd1bWVudHN9IGlzIGFsbG93ZWQuCi0KLUBpdGVtIC5jYWxsaW5mbyBbIEB2YXJ7cGFyYW19PUB2YXJ7dmFsdWV9LCBAZG90c3t9IF0gIFsgQHZhcntmbGFnfSwgQGRvdHN7fSBdCi1TcGVjaWZ5IGEgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIGZsYWdzIHRoYXQgZGVmaW5lIHRoZSBlbnZpcm9ubWVudCBmb3IgYQotcHJvY2VkdXJlLgotCi1AdmFye3BhcmFtfSBtYXkgYmUgYW55IG9mIEBzYW1we2ZyYW1lfSAoZnJhbWUgc2l6ZSksIEBzYW1we2VudHJ5X2dyfSAoZW5kIG9mCi1nZW5lcmFsIHJlZ2lzdGVyIHJhbmdlKSwgQHNhbXB7ZW50cnlfZnJ9IChlbmQgb2YgZmxvYXQgcmVnaXN0ZXIgcmFuZ2UpLAotQHNhbXB7ZW50cnlfc3J9IChlbmQgb2Ygc3BhY2UgcmVnaXN0ZXIgcmFuZ2UpLgotCi1UaGUgdmFsdWVzIGZvciBAdmFye2ZsYWd9IGFyZSBAc2FtcHtjYWxsc30gb3IgQHNhbXB7Y2FsbGVyfSAocHJvYyBoYXMKLXN1YnJvdXRpbmVzKSwgQHNhbXB7bm9fY2FsbHN9IChwcm9jIGRvZXMgbm90IGNhbGwgc3Vicm91dGluZXMpLCBAc2FtcHtzYXZlX3JwfQotKHByZXNlcnZlIHJldHVybiBwb2ludGVyKSwgQHNhbXB7c2F2ZV9zcH0gKHByb2MgcHJlc2VydmVzIHN0YWNrIHBvaW50ZXIpLAotQHNhbXB7bm9fdW53aW5kfSAoZG8gbm90IHVud2luZCB0aGlzIHByb2MpLCBAc2FtcHtocHV4X2ludH0gKHByb2MgaXMgaW50ZXJydXB0Ci1yb3V0aW5lKS4KLQotQGl0ZW0gLmNvZGUKLUFzc2VtYmxlIGludG8gdGhlIHN0YW5kYXJkIHNlY3Rpb24gY2FsbGVkIEBzYW1weyRURVhUJH0sIHN1YnNlY3Rpb24KLUBzYW1weyRDT0RFJH0uCi0KLUBpZnNldCBTT00KLUBpdGVtIC5jb3B5cmlnaHQgIkB2YXJ7c3RyaW5nfSIKLUluIHRoZSBTT00gb2JqZWN0IGZvcm1hdCwgaW5zZXJ0IEB2YXJ7c3RyaW5nfSBpbnRvIHRoZSBvYmplY3QgY29kZSwgbWFya2VkIGFzIGEKLWNvcHlyaWdodCBzdHJpbmcuCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBFTEYKLUBpdGVtIC5jb3B5cmlnaHQgIkB2YXJ7c3RyaW5nfSIKLUluIHRoZSBFTEYgb2JqZWN0IGZvcm1hdCwgaW5zZXJ0IEB2YXJ7c3RyaW5nfSBpbnRvIHRoZSBvYmplY3QgY29kZSwgbWFya2VkIGFzIGEKLXZlcnNpb24gc3RyaW5nLgotQGVuZCBpZnNldAotCi1AaXRlbSAuZW50ZXIKLU5vdCB5ZXQgc3VwcG9ydGVkOyB0aGUgYXNzZW1ibGVyIHJlamVjdHMgcHJvZ3JhbXMgY29udGFpbmluZyB0aGlzIGRpcmVjdGl2ZS4KLQotQGl0ZW0gLmVudHJ5Ci1NYXJrIHRoZSBiZWdpbm5pbmcgb2YgYSBwcm9jZWR1cmUuCi0KLUBpdGVtIC5leGl0Ci1NYXJrIHRoZSBlbmQgb2YgYSBwcm9jZWR1cmUuCi0KLUBpdGVtIC5leHBvcnQgQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXSAgWyAsQHZhcntwYXJhbX09QHZhcntyfSBdCi1NYWtlIGEgcHJvY2VkdXJlIEB2YXJ7bmFtZX0gYXZhaWxhYmxlIHRvIGNhbGxlcnMuICBAdmFye3R5cH0sIGlmIHByZXNlbnQsIG11c3QKLWJlIG9uZSBvZiBAc2FtcHthYnNvbHV0ZX0sIEBzYW1we2NvZGV9IChFTEYgb25seSwgbm90IFNPTSksIEBzYW1we2RhdGF9LAotQHNhbXB7ZW50cnl9LCBAc2FtcHtkYXRhfSwgQHNhbXB7ZW50cnl9LCBAc2FtcHttaWxsaWNvZGV9LCBAc2FtcHtwbGFiZWx9LAotQHNhbXB7cHJpX3Byb2d9LCBvciBAc2FtcHtzZWNfcHJvZ30uCi0KLUB2YXJ7cGFyYW19LCBpZiBwcmVzZW50LCBwcm92aWRlcyBlaXRoZXIgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlCi1wcm9jZWR1cmUgYXJndW1lbnRzIGFuZCByZXN1bHQsIG9yIGEgcHJpdmlsZWdlIGxldmVsLiAgQHZhcntwYXJhbX0gbWF5IGJlCi1Ac2FtcHthcmd3QHZhcntufX0gKHdoZXJlIEB2YXJ7bn0gcmFuZ2VzIGZyb20gQGNvZGV7MH0gdG8gQGNvZGV7M30sIGFuZAotaW5kaWNhdGVzIG9uZSBvZiBmb3VyIG9uZS13b3JkIGFyZ3VtZW50cyk7IEBzYW1we3J0bnZhbH0gKHRoZSBwcm9jZWR1cmUncwotcmVzdWx0KTsgb3IgQHNhbXB7cHJpdl9sZXZ9IChwcml2aWxlZ2UgbGV2ZWwpLiAgRm9yIGFyZ3VtZW50cyBvciB0aGUgcmVzdWx0LAotQHZhcntyfSBzcGVjaWZpZXMgaG93IHRvIHJlbG9jYXRlLCBhbmQgbXVzdCBiZSBvbmUgb2YgQHNhbXB7bm99IChub3QKLXJlbG9jYXRhYmxlKSwgQHNhbXB7Z3J9IChhcmd1bWVudCBpcyBpbiBnZW5lcmFsIHJlZ2lzdGVyKSwgQHNhbXB7ZnJ9IChpbgotZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIpLCBvciBAc2FtcHtmdX0gKHVwcGVyIGhhbGYgb2YgZmxvYXQgcmVnaXN0ZXIpLgotRm9yIEBzYW1we3ByaXZfbGV2fSwgQHZhcntyfSBpcyBhbiBpbnRlZ2VyLgotCi1AaXRlbSAuaGFsZiBAdmFye259Ci1EZWZpbmUgYSB0d28tYnl0ZSBpbnRlZ2VyIGNvbnN0YW50IEB2YXJ7bn07IHN5bm9ueW0gZm9yIHRoZSBwb3J0YWJsZQotQGNvZGV7QHZhbHVle0FTfX0gZGlyZWN0aXZlIEBjb2Rley5zaG9ydH0uCi0KLUBpdGVtIC5pbXBvcnQgQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXQotQ29udmVyc2Ugb2YgQGNvZGV7LmV4cG9ydH07IG1ha2UgYSBwcm9jZWR1cmUgYXZhaWxhYmxlIHRvIGNhbGwuICBUaGUgYXJndW1lbnRzCi11c2UgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgdGhlIGZpcnN0IHR3byBhcmd1bWVudHMgZm9yIEBjb2Rley5leHBvcnR9LgotCi1AaXRlbSAubGFiZWwgQHZhcntuYW1lfQotRGVmaW5lIEB2YXJ7bmFtZX0gYXMgYSBsYWJlbCBmb3IgdGhlIGN1cnJlbnQgYXNzZW1ibHkgbG9jYXRpb24uCi0KLUBpdGVtIC5sZWF2ZQotTm90IHlldCBzdXBwb3J0ZWQ7IHRoZSBhc3NlbWJsZXIgcmVqZWN0cyBwcm9ncmFtcyBjb250YWluaW5nIHRoaXMgZGlyZWN0aXZlLgotCi1AaXRlbSAub3JpZ2luIEB2YXJ7bGN9Ci1BZHZhbmNlIGxvY2F0aW9uIGNvdW50ZXIgdG8gQHZhcntsY30uIFN5bm9ueW0gZm9yIHRoZSBAY29kZXtAdmFsdWV7YXN9fQotcG9ydGFibGUgZGlyZWN0aXZlIEBjb2Rley5vcmd9LgotCi1AaXRlbSAucGFyYW0gQHZhcntuYW1lfSBbICxAdmFye3R5cH0gXSAgWyAsQHZhcntwYXJhbX09QHZhcntyfSBdCi1AYyBOb3QgaW4gSFAgbWFudWFsOyBAc2N7Z251fSBIUFBBIGV4dGVuc2lvbgotU2ltaWxhciB0byBAY29kZXsuZXhwb3J0fSwgYnV0IHVzZWQgZm9yIHN0YXRpYyBwcm9jZWR1cmVzLgotCi1AaXRlbSAucHJvYwotVXNlIHByZWNlZGluZyB0aGUgZmlyc3Qgc3RhdGVtZW50IG9mIGEgcHJvY2VkdXJlLgotCi1AaXRlbSAucHJvY2VuZAotVXNlIGZvbGxvd2luZyB0aGUgbGFzdCBzdGF0ZW1lbnQgb2YgYSBwcm9jZWR1cmUuCi0KLUBpdGVtIEB2YXJ7bGFiZWx9IC5yZWcgQHZhcntleHByfQotQGMgPz8gTm90IGluIEhQIG1hbnVhbCAoSmFuIDE5ODggdm4pCi1TeW5vbnltIGZvciBAY29kZXsuZXF1fTsgZGVmaW5lIEB2YXJ7bGFiZWx9IHdpdGggdGhlIGFic29sdXRlIGV4cHJlc3Npb24KLUB2YXJ7ZXhwcn0gYXMgaXRzIHZhbHVlLgotCi1AaXRlbSAuc3BhY2UgQHZhcntzZWNuYW1lfSBbICxAdmFye3BhcmFtc30gXQotU3dpdGNoIHRvIHNlY3Rpb24gQHZhcntzZWNuYW1lfSwgY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiBieSB0aGF0IG5hbWUgaWYKLW5lY2Vzc2FyeS4gIFlvdSBtYXkgb25seSB1c2UgQHZhcntwYXJhbXN9IHdoZW4gY3JlYXRpbmcgYSBuZXcgc2VjdGlvbiwgbm90Ci13aGVuIHN3aXRjaGluZyB0byBhbiBleGlzdGluZyBvbmUuICBAdmFye3NlY25hbWV9IG1heSBpZGVudGlmeSBhIHNlY3Rpb24gYnkKLW51bWJlciByYXRoZXIgdGhhbiBieSBuYW1lLgotCi1JZiBzcGVjaWZpZWQsIHRoZSBsaXN0IEB2YXJ7cGFyYW1zfSBkZWNsYXJlcyBhdHRyaWJ1dGVzIG9mIHRoZSBzZWN0aW9uLAotaWRlbnRpZmllZCBieSBrZXl3b3Jkcy4gIFRoZSBrZXl3b3JkcyByZWNvZ25pemVkIGFyZSBAc2FtcHtzcG51bT1AdmFye2V4cH19Ci0oaWRlbnRpZnkgdGhpcyBzZWN0aW9uIGJ5IHRoZSBudW1iZXIgQHZhcntleHB9LCBhbiBhYnNvbHV0ZSBleHByZXNzaW9uKSwKLUBzYW1we3NvcnQ9QHZhcntleHB9fSAob3JkZXIgc2VjdGlvbnMgYWNjb3JkaW5nIHRvIHRoaXMgc29ydCBrZXkgd2hlbiBsaW5raW5nOwotQHZhcntleHB9IGlzIGFuIGFic29sdXRlIGV4cHJlc3Npb24pLCBAc2FtcHt1bmxvYWRhYmxlfSAoc2VjdGlvbiBjb250YWlucyBubwotbG9hZGFibGUgZGF0YSksIEBzYW1we25vdGRlZmluZWR9ICh0aGlzIHNlY3Rpb24gZGVmaW5lZCBlbHNld2hlcmUpLCBhbmQKLUBzYW1we3ByaXZhdGV9IChkYXRhIGluIHRoaXMgc2VjdGlvbiBub3QgYXZhaWxhYmxlIHRvIG90aGVyIHByb2dyYW1zKS4KLQotQGl0ZW0gLnNwbnVtIEB2YXJ7c2VjbmFtfQotQGMgPz8gTm90IGluIEhQIG1hbnVhbCAoSmFuIDE5ODgpCi1BbGxvY2F0ZSBmb3VyIGJ5dGVzIG9mIHN0b3JhZ2UsIGFuZCBpbml0aWFsaXplIHRoZW0gd2l0aCB0aGUgc2VjdGlvbiBudW1iZXIgb2YKLXRoZSBzZWN0aW9uIG5hbWVkIEB2YXJ7c2VjbmFtfS4gIChZb3UgY2FuIGRlZmluZSB0aGUgc2VjdGlvbiBudW1iZXIgd2l0aCB0aGUKLUhQUEEgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuKQotCi1AY2luZGV4IEBjb2Rle3N0cmluZ30gZGlyZWN0aXZlIG9uIEhQUEEKLUBpdGVtIC5zdHJpbmcgIkB2YXJ7c3RyfSIKLUNvcHkgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBAdmFye3N0cn0gdG8gdGhlIG9iamVjdCBmaWxlLgotQHhyZWZ7U3RyaW5ncywsU3RyaW5nc30sIGZvciBpbmZvcm1hdGlvbiBvbiBlc2NhcGUgc2VxdWVuY2VzIHlvdSBjYW4gdXNlIGluCi1AY29kZXtAdmFsdWV7QVN9fSBzdHJpbmdzLgotCi1AZW1waHtXYXJuaW5nIX0gVGhlIEhQUEEgdmVyc2lvbiBvZiBAY29kZXsuc3RyaW5nfSBkaWZmZXJzIGZyb20gdGhlCi11c3VhbCBAY29kZXtAdmFsdWV7QVN9fSBkZWZpbml0aW9uOiBpdCBkb2VzIEBlbXBoe25vdH0gd3JpdGUgYSB6ZXJvIGJ5dGUKLWFmdGVyIGNvcHlpbmcgQHZhcntzdHJ9LgotCi1AaXRlbSAuc3RyaW5neiAiQHZhcntzdHJ9IgotTGlrZSBAY29kZXsuc3RyaW5nfSwgYnV0IGFwcGVuZHMgYSB6ZXJvIGJ5dGUgYWZ0ZXIgY29weWluZyBAdmFye3N0cn0gdG8gb2JqZWN0Ci1maWxlLgotCi1AaXRlbSAuc3Vic3BhIEB2YXJ7bmFtZX0gWyAsQHZhcntwYXJhbXN9IF0KLUBpdGVteCAubnN1YnNwYSBAdmFye25hbWV9IFsgLEB2YXJ7cGFyYW1zfSBdCi1TaW1pbGFyIHRvIEBjb2Rley5zcGFjZX0sIGJ1dCBzZWxlY3RzIGEgc3Vic2VjdGlvbiBAdmFye25hbWV9IHdpdGhpbiB0aGUKLWN1cnJlbnQgc2VjdGlvbi4gIFlvdSBtYXkgb25seSBzcGVjaWZ5IEB2YXJ7cGFyYW1zfSB3aGVuIHlvdSBjcmVhdGUgYQotc3Vic2VjdGlvbiAoaW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIEBjb2Rley5zdWJzcGF9IGZvciB0aGlzIEB2YXJ7bmFtZX0pLgotCi1JZiBzcGVjaWZpZWQsIHRoZSBsaXN0IEB2YXJ7cGFyYW1zfSBkZWNsYXJlcyBhdHRyaWJ1dGVzIG9mIHRoZSBzdWJzZWN0aW9uLAotaWRlbnRpZmllZCBieSBrZXl3b3Jkcy4gIFRoZSBrZXl3b3JkcyByZWNvZ25pemVkIGFyZSBAc2FtcHtxdWFkPUB2YXJ7ZXhwcn19Ci0oYGBxdWFkcmFudCcnIGZvciB0aGlzIHN1YnNlY3Rpb24pLCBAc2FtcHthbGlnbj1AdmFye2V4cHJ9fSAoYWxpZ25tZW50IGZvcgotYmVnaW5uaW5nIG9mIHRoaXMgc3Vic2VjdGlvbjsgYSBwb3dlciBvZiB0d28pLCBAc2FtcHthY2Nlc3M9QHZhcntleHByfX0gKHZhbHVlCi1mb3IgYGBhY2Nlc3MgcmlnaHRzJycgZmllbGQpLCBAc2FtcHtzb3J0PUB2YXJ7ZXhwcn19IChzb3J0aW5nIG9yZGVyIGZvciB0aGlzCi1zdWJzcGFjZSBpbiBsaW5rKSwgQHNhbXB7Y29kZV9vbmx5fSAoc3Vic2VjdGlvbiBjb250YWlucyBvbmx5IGNvZGUpLAotQHNhbXB7dW5sb2FkYWJsZX0gKHN1YnNlY3Rpb24gY2Fubm90IGJlIGxvYWRlZCBpbnRvIG1lbW9yeSksIEBzYW1we2NvbW1vbn0KLShzdWJzZWN0aW9uIGlzIGNvbW1vbiBibG9jayksIEBzYW1we2R1cF9jb21tfSAoaW5pdGlhbGl6ZWQgZGF0YSBtYXkgaGF2ZQotZHVwbGljYXRlIG5hbWVzKSwgb3IgQHNhbXB7emVyb30gKHN1YnNlY3Rpb24gaXMgYWxsIHplcm9zLCBkbyBub3Qgd3JpdGUgaW4KLW9iamVjdCBmaWxlKS4KLQotQGNvZGV7Lm5zdWJzcGF9IGFsd2F5cyBjcmVhdGVzIGEgbmV3IHN1YnNwYWNlIHdpdGggdGhlIGdpdmVuIG5hbWUsIGV2ZW4KLWlmIG9uZSB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0KLUBpdGVtIC52ZXJzaW9uICJAdmFye3N0cn0iCi1Xcml0ZSBAdmFye3N0cn0gYXMgdmVyc2lvbiBpZGVudGlmaWVyIGluIG9iamVjdCBjb2RlLgotQGVuZCB0YWJsZQotCi1Abm9kZSBIUFBBIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLUZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgSFBQQSBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtQQS1SSVNDIEFyY2hpdGVjdHVyZSBhbmQgSW5zdHJ1Y3Rpb24gU2V0IFJlZmVyZW5jZSBNYW51YWx9IAotKEhQIDA5NzQwLTkwMDM5KS4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1pMzg2LnRleGkgYi9nYXMvZG9jL2MtaTM4Ni50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjc4OTNiLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1pMzg2LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSw1MTggKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBpZnNldCBHRU5FUklDCi1AcGFnZQotQG5vZGUgaTM4Ni1EZXBlbmRlbnQKLUBjaGFwdGVyIDgwMzg2IERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIDgwMzg2IERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggaTM4NiBzdXBwb3J0Ci1AY2luZGV4IGk4MDMwNiBzdXBwb3J0Ci1AbWVudQotKiBpMzg2LU9wdGlvbnM6OiAgICAgICAgICAgICAgICBPcHRpb25zCi0qIGkzODYtU3ludGF4OjogICAgICAgICAgICAgICAgIEFUJlQgU3ludGF4IHZlcnN1cyBJbnRlbCBTeW50YXgKLSogaTM4Ni1NbmVtb25pY3M6OiAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gTmFtaW5nCi0qIGkzODYtUmVnczo6ICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWluZwotKiBpMzg2LVByZWZpeGVzOjogICAgICAgICAgICAgICBJbnN0cnVjdGlvbiBQcmVmaXhlcwotKiBpMzg2LU1lbW9yeTo6ICAgICAgICAgICAgICAgICBNZW1vcnkgUmVmZXJlbmNlcwotKiBpMzg2LWp1bXBzOjogICAgICAgICAgICAgICAgICBIYW5kbGluZyBvZiBKdW1wIEluc3RydWN0aW9ucwotKiBpMzg2LUZsb2F0OjogICAgICAgICAgICAgICAgICBGbG9hdGluZyBQb2ludAotKiBpMzg2LVNJTUQ6OiAgICAgICAgICAgICAgICAgICBJbnRlbCdzIE1NWCBhbmQgQU1EJ3MgM0ROb3chIFNJTUQgT3BlcmF0aW9ucwotKiBpMzg2LTE2Yml0OjogICAgICAgICAgICAgICAgICBXcml0aW5nIDE2LWJpdCBDb2RlCi0qIGkzODYtQnVnczo6ICAgICAgICAgICAgICAgICAgIEFUJlQgU3ludGF4IGJ1Z3MKLSogaTM4Ni1Ob3Rlczo6ICAgICAgICAgICAgICAgICAgTm90ZXMKLUBlbmQgbWVudQotCi1Abm9kZSBpMzg2LU9wdGlvbnMKLUBzZWN0aW9uIE9wdGlvbnMKLQotQGNpbmRleCBvcHRpb25zIGZvciBpMzg2IChub25lKQotQGNpbmRleCBpMzg2IG9wdGlvbnMgKG5vbmUpCi1UaGUgODAzODYgaGFzIG5vIG1hY2hpbmUgZGVwZW5kZW50IG9wdGlvbnMuCi0KLUBub2RlIGkzODYtU3ludGF4Ci1Ac2VjdGlvbiBBVCZUIFN5bnRheCB2ZXJzdXMgSW50ZWwgU3ludGF4Ci0KLUBjaW5kZXggaTM4NiBzeW50YXggY29tcGF0aWJpbGl0eQotQGNpbmRleCBzeW50YXggY29tcGF0aWJpbGl0eSwgaTM4NgotSW4gb3JkZXIgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvdXRwdXQgb2YgQGNvZGV7QHZhbHVle0dDQ319LAotQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgQVQmVCBTeXN0ZW0gVi8zODYgYXNzZW1ibGVyIHN5bnRheC4gIFRoaXMgaXMgcXVpdGUKLWRpZmZlcmVudCBmcm9tIEludGVsIHN5bnRheC4gIFdlIG1lbnRpb24gdGhlc2UgZGlmZmVyZW5jZXMgYmVjYXVzZQotYWxtb3N0IGFsbCA4MDM4NiBkb2N1bWVudHMgdXNlIEludGVsIHN5bnRheC4gIE5vdGFibGUgZGlmZmVyZW5jZXMKLWJldHdlZW4gdGhlIHR3byBzeW50YXhlcyBhcmU6Ci0KLUBjaW5kZXggaW1tZWRpYXRlIG9wZXJhbmRzLCBpMzg2Ci1AY2luZGV4IGkzODYgaW1tZWRpYXRlIG9wZXJhbmRzCi1AY2luZGV4IHJlZ2lzdGVyIG9wZXJhbmRzLCBpMzg2Ci1AY2luZGV4IGkzODYgcmVnaXN0ZXIgb3BlcmFuZHMKLUBjaW5kZXgganVtcC9jYWxsIG9wZXJhbmRzLCBpMzg2Ci1AY2luZGV4IGkzODYganVtcC9jYWxsIG9wZXJhbmRzCi1AY2luZGV4IG9wZXJhbmQgZGVsaW1pdGVycywgaTM4NgotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUFUJlQgaW1tZWRpYXRlIG9wZXJhbmRzIGFyZSBwcmVjZWRlZCBieSBAc2FtcHskfTsgSW50ZWwgaW1tZWRpYXRlCi1vcGVyYW5kcyBhcmUgdW5kZWxpbWl0ZWQgKEludGVsIEBzYW1we3B1c2ggNH0gaXMgQVQmVCBAc2FtcHtwdXNobCAkNH0pLgotQVQmVCByZWdpc3RlciBvcGVyYW5kcyBhcmUgcHJlY2VkZWQgYnkgQHNhbXB7JX07IEludGVsIHJlZ2lzdGVyIG9wZXJhbmRzCi1hcmUgdW5kZWxpbWl0ZWQuICBBVCZUIGFic29sdXRlIChhcyBvcHBvc2VkIHRvIFBDIHJlbGF0aXZlKSBqdW1wL2NhbGwKLW9wZXJhbmRzIGFyZSBwcmVmaXhlZCBieSBAc2FtcHsqfTsgdGhleSBhcmUgdW5kZWxpbWl0ZWQgaW4gSW50ZWwgc3ludGF4LgotCi1AY2luZGV4IGkzODYgc291cmNlLCBkZXN0aW5hdGlvbiBvcGVyYW5kcwotQGNpbmRleCBzb3VyY2UsIGRlc3RpbmF0aW9uIG9wZXJhbmRzOyBpMzg2Ci1AaXRlbQotQVQmVCBhbmQgSW50ZWwgc3ludGF4IHVzZSB0aGUgb3Bwb3NpdGUgb3JkZXIgZm9yIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLW9wZXJhbmRzLiAgSW50ZWwgQHNhbXB7YWRkIGVheCwgNH0gaXMgQHNhbXB7YWRkbCAkNCwgJWVheH0uICBUaGUKLUBzYW1we3NvdXJjZSwgZGVzdH0gY29udmVudGlvbiBpcyBtYWludGFpbmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLXByZXZpb3VzIFVuaXggYXNzZW1ibGVycy4gIE5vdGUgdGhhdCBpbnN0cnVjdGlvbnMgd2l0aCBtb3JlIHRoYW4gb25lCi1zb3VyY2Ugb3BlcmFuZCwgc3VjaCBhcyB0aGUgQHNhbXB7ZW50ZXJ9IGluc3RydWN0aW9uLCBkbyBAZW1waHtub3R9IGhhdmUKLXJldmVyc2VkIG9yZGVyLiAgQHJlZntpMzg2LUJ1Z3N9LgotCi1AY2luZGV4IG1uZW1vbmljIHN1ZmZpeGVzLCBpMzg2Ci1AY2luZGV4IHNpemVzIG9wZXJhbmRzLCBpMzg2Ci1AY2luZGV4IGkzODYgc2l6ZSBzdWZmaXhlcwotQGl0ZW0KLUluIEFUJlQgc3ludGF4IHRoZSBzaXplIG9mIG1lbW9yeSBvcGVyYW5kcyBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIGxhc3QKLWNoYXJhY3RlciBvZiB0aGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMuICBNbmVtb25pYyBzdWZmaXhlcyBvZiBAc2FtcHtifSwKLUBzYW1we3d9LCBhbmQgQHNhbXB7bH0gc3BlY2lmeSBieXRlICg4LWJpdCksIHdvcmQgKDE2LWJpdCksIGFuZCBsb25nCi0oMzItYml0KSBtZW1vcnkgcmVmZXJlbmNlcy4gIEludGVsIHN5bnRheCBhY2NvbXBsaXNoZXMgdGhpcyBieSBwcmVmaXhpbmcKLW1lbW9yeSBvcGVyYW5kcyAoQGVtcGh7bm90fSB0aGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzKSB3aXRoIEBzYW1we2J5dGUKLXB0cn0sIEBzYW1we3dvcmQgcHRyfSwgYW5kIEBzYW1we2R3b3JkIHB0cn0uICBUaHVzLCBJbnRlbCBAc2FtcHttb3YgYWwsCi1ieXRlIHB0ciBAdmFye2Zvb319IGlzIEBzYW1we21vdmIgQHZhcntmb299LCAlYWx9IGluIEFUJlQgc3ludGF4LgotCi1AY2luZGV4IHJldHVybiBpbnN0cnVjdGlvbnMsIGkzODYKLUBjaW5kZXggaTM4NiBqdW1wLCBjYWxsLCByZXR1cm4KLUBpdGVtCi1JbW1lZGlhdGUgZm9ybSBsb25nIGp1bXBzIGFuZCBjYWxscyBhcmUKLUBzYW1we2xjYWxsL2xqbXAgJEB2YXJ7c2VjdGlvbn0sICRAdmFye29mZnNldH19IGluIEFUJlQgc3ludGF4OyB0aGUKLUludGVsIHN5bnRheCBpcwotQHNhbXB7Y2FsbC9qbXAgZmFyIEB2YXJ7c2VjdGlvbn06QHZhcntvZmZzZXR9fS4gIEFsc28sIHRoZSBmYXIgcmV0dXJuCi1pbnN0cnVjdGlvbgotaXMgQHNhbXB7bHJldCAkQHZhcntzdGFjay1hZGp1c3R9fSBpbiBBVCZUIHN5bnRheDsgSW50ZWwgc3ludGF4IGlzCi1Ac2FtcHtyZXQgZmFyIEB2YXJ7c3RhY2stYWRqdXN0fX0uCi0KLUBjaW5kZXggc2VjdGlvbnMsIGkzODYKLUBjaW5kZXggaTM4NiBzZWN0aW9ucwotQGl0ZW0KLVRoZSBBVCZUIGFzc2VtYmxlciBkb2VzIG5vdCBwcm92aWRlIHN1cHBvcnQgZm9yIG11bHRpcGxlIHNlY3Rpb24KLXByb2dyYW1zLiAgVW5peCBzdHlsZSBzeXN0ZW1zIGV4cGVjdCBhbGwgcHJvZ3JhbXMgdG8gYmUgc2luZ2xlIHNlY3Rpb25zLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIGkzODYtTW5lbW9uaWNzCi1Ac2VjdGlvbiBJbnN0cnVjdGlvbiBOYW1pbmcKLQotQGNpbmRleCBpMzg2IGluc3RydWN0aW9uIG5hbWluZwotQGNpbmRleCBpbnN0cnVjdGlvbiBuYW1pbmcsIGkzODYKLUluc3RydWN0aW9uIG1uZW1vbmljcyBhcmUgc3VmZml4ZWQgd2l0aCBvbmUgY2hhcmFjdGVyIG1vZGlmaWVycyB3aGljaAotc3BlY2lmeSB0aGUgc2l6ZSBvZiBvcGVyYW5kcy4gIFRoZSBsZXR0ZXJzIEBzYW1we2J9LCBAc2FtcHt3fSwgYW5kCi1Ac2FtcHtsfSBzcGVjaWZ5IGJ5dGUsIHdvcmQsIGFuZCBsb25nIG9wZXJhbmRzLiAgSWYgbm8gc3VmZml4IGlzCi1zcGVjaWZpZWQgYnkgYW4gaW5zdHJ1Y3Rpb24gdGhlbiBAY29kZXtAdmFsdWV7QVN9fSB0cmllcyB0byBmaWxsIGluIHRoZQotbWlzc2luZyBzdWZmaXggYmFzZWQgb24gdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9wZXJhbmQgKHRoZSBsYXN0IG9uZQotYnkgY29udmVudGlvbikuICBUaHVzLCBAc2FtcHttb3YgJWF4LCAlYnh9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7bW92dwotJWF4LCAlYnh9OyBhbHNvLCBAc2FtcHttb3YgJDEsICVieH0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHttb3Z3ICQxLAotJWJ4fS4gIE5vdGUgdGhhdCB0aGlzIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBBVCZUIFVuaXggYXNzZW1ibGVyIHdoaWNoCi1hc3N1bWVzIHRoYXQgYSBtaXNzaW5nIG1uZW1vbmljIHN1ZmZpeCBpbXBsaWVzIGxvbmcgb3BlcmFuZCBzaXplLiAgKFRoaXMKLWluY29tcGF0aWJpbGl0eSBkb2VzIG5vdCBhZmZlY3QgY29tcGlsZXIgb3V0cHV0IHNpbmNlIGNvbXBpbGVycyBhbHdheXMKLWV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbW5lbW9uaWMgc3VmZml4LikKLQotQWxtb3N0IGFsbCBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBpbiBBVCZUIGFuZCBJbnRlbCBmb3JtYXQuCi1UaGVyZSBhcmUgYSBmZXcgZXhjZXB0aW9ucy4gIFRoZSBzaWduIGV4dGVuZCBhbmQgemVybyBleHRlbmQKLWluc3RydWN0aW9ucyBuZWVkIHR3byBzaXplcyB0byBzcGVjaWZ5IHRoZW0uICBUaGV5IG5lZWQgYSBzaXplIHRvCi1zaWduL3plcm8gZXh0ZW5kIEBlbXBoe2Zyb219IGFuZCBhIHNpemUgdG8gemVybyBleHRlbmQgQGVtcGh7dG99LiAgVGhpcwotaXMgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHR3byBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcyBpbiBBVCZUCi1zeW50YXguICBCYXNlIG5hbWVzIGZvciBzaWduIGV4dGVuZCBhbmQgemVybyBleHRlbmQgYXJlCi1Ac2FtcHttb3ZzQGRvdHN7fX0gYW5kIEBzYW1we21vdnpAZG90c3t9fSBpbiBBVCZUIHN5bnRheCAoQHNhbXB7bW92c3h9Ci1hbmQgQHNhbXB7bW92enh9IGluIEludGVsIHN5bnRheCkuICBUaGUgaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMKLWFyZSB0YWNrZWQgb24gdG8gdGhpcyBiYXNlIG5hbWUsIHRoZSBAZW1waHtmcm9tfSBzdWZmaXggYmVmb3JlIHRoZQotQGVtcGh7dG99IHN1ZmZpeC4gIFRodXMsIEBzYW1we21vdnNibCAlYWwsICVlZHh9IGlzIEFUJlQgc3ludGF4IGZvcgotYGBtb3ZlIHNpZ24gZXh0ZW5kIEBlbXBoe2Zyb219ICVhbCBAZW1waHt0b30gJWVkeC4nJyAgUG9zc2libGUgc3VmZml4ZXMsCi10aHVzLCBhcmUgQHNhbXB7Ymx9IChmcm9tIGJ5dGUgdG8gbG9uZyksIEBzYW1we2J3fSAoZnJvbSBieXRlIHRvIHdvcmQpLAotYW5kIEBzYW1we3dsfSAoZnJvbSB3b3JkIHRvIGxvbmcpLgotCi1AY2luZGV4IGNvbnZlcnNpb24gaW5zdHJ1Y3Rpb25zLCBpMzg2Ci1AY2luZGV4IGkzODYgY29udmVyc2lvbiBpbnN0cnVjdGlvbnMKLVRoZSBJbnRlbC1zeW50YXggY29udmVyc2lvbiBpbnN0cnVjdGlvbnMKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUBzYW1we2Nid30gLS0tIHNpZ24tZXh0ZW5kIGJ5dGUgaW4gQHNhbXB7JWFsfSB0byB3b3JkIGluIEBzYW1weyVheH0sCi0KLUBpdGVtCi1Ac2FtcHtjd2RlfSAtLS0gc2lnbi1leHRlbmQgd29yZCBpbiBAc2FtcHslYXh9IHRvIGxvbmcgaW4gQHNhbXB7JWVheH0sCi0KLUBpdGVtCi1Ac2FtcHtjd2R9IC0tLSBzaWduLWV4dGVuZCB3b3JkIGluIEBzYW1weyVheH0gdG8gbG9uZyBpbiBAc2FtcHslZHg6JWF4fSwKLQotQGl0ZW0KLUBzYW1we2NkcX0gLS0tIHNpZ24tZXh0ZW5kIGR3b3JkIGluIEBzYW1weyVlYXh9IHRvIHF1YWQgaW4gQHNhbXB7JWVkeDolZWF4fSwKLUBlbmQgaXRlbWl6ZQotCi1Abm9pbmRlbnQKLWFyZSBjYWxsZWQgQHNhbXB7Y2J0d30sIEBzYW1we2N3dGx9LCBAc2FtcHtjd3RkfSwgYW5kIEBzYW1we2NsdGR9IGluCi1BVCZUIG5hbWluZy4gIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgZWl0aGVyIG5hbWluZyBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zLgotCi1AY2luZGV4IGp1bXAgaW5zdHJ1Y3Rpb25zLCBpMzg2Ci1AY2luZGV4IGNhbGwgaW5zdHJ1Y3Rpb25zLCBpMzg2Ci1GYXIgY2FsbC9qdW1wIGluc3RydWN0aW9ucyBhcmUgQHNhbXB7bGNhbGx9IGFuZCBAc2FtcHtsam1wfSBpbgotQVQmVCBzeW50YXgsIGJ1dCBhcmUgQHNhbXB7Y2FsbCBmYXJ9IGFuZCBAc2FtcHtqdW1wIGZhcn0gaW4gSW50ZWwKLWNvbnZlbnRpb24uCi0KLUBub2RlIGkzODYtUmVncwotQHNlY3Rpb24gUmVnaXN0ZXIgTmFtaW5nCi0KLUBjaW5kZXggaTM4NiByZWdpc3RlcnMKLUBjaW5kZXggcmVnaXN0ZXJzLCBpMzg2Ci1SZWdpc3RlciBvcGVyYW5kcyBhcmUgYWx3YXlzIHByZWZpeGVkIHdpdGggQHNhbXB7JX0uICBUaGUgODAzODYgcmVnaXN0ZXJzCi1jb25zaXN0IG9mCi0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi10aGUgOCAzMi1iaXQgcmVnaXN0ZXJzIEBzYW1weyVlYXh9ICh0aGUgYWNjdW11bGF0b3IpLCBAc2FtcHslZWJ4fSwKLUBzYW1weyVlY3h9LCBAc2FtcHslZWR4fSwgQHNhbXB7JWVkaX0sIEBzYW1weyVlc2l9LCBAc2FtcHslZWJwfSAodGhlCi1mcmFtZSBwb2ludGVyKSwgYW5kIEBzYW1weyVlc3B9ICh0aGUgc3RhY2sgcG9pbnRlcikuCi0KLUBpdGVtCi10aGUgOCAxNi1iaXQgbG93LWVuZHMgb2YgdGhlc2U6IEBzYW1weyVheH0sIEBzYW1weyVieH0sIEBzYW1weyVjeH0sCi1Ac2FtcHslZHh9LCBAc2FtcHslZGl9LCBAc2FtcHslc2l9LCBAc2FtcHslYnB9LCBhbmQgQHNhbXB7JXNwfS4KLQotQGl0ZW0KLXRoZSA4IDgtYml0IHJlZ2lzdGVyczogQHNhbXB7JWFofSwgQHNhbXB7JWFsfSwgQHNhbXB7JWJofSwKLUBzYW1weyVibH0sIEBzYW1weyVjaH0sIEBzYW1weyVjbH0sIEBzYW1weyVkaH0sIGFuZCBAc2FtcHslZGx9IChUaGVzZQotYXJlIHRoZSBoaWdoLWJ5dGVzIGFuZCBsb3ctYnl0ZXMgb2YgQHNhbXB7JWF4fSwgQHNhbXB7JWJ4fSwKLUBzYW1weyVjeH0sIGFuZCBAc2FtcHslZHh9KQotCi1AaXRlbQotdGhlIDYgc2VjdGlvbiByZWdpc3RlcnMgQHNhbXB7JWNzfSAoY29kZSBzZWN0aW9uKSwgQHNhbXB7JWRzfQotKGRhdGEgc2VjdGlvbiksIEBzYW1weyVzc30gKHN0YWNrIHNlY3Rpb24pLCBAc2FtcHslZXN9LCBAc2FtcHslZnN9LAotYW5kIEBzYW1weyVnc30uCi0KLUBpdGVtCi10aGUgMyBwcm9jZXNzb3IgY29udHJvbCByZWdpc3RlcnMgQHNhbXB7JWNyMH0sIEBzYW1weyVjcjJ9LCBhbmQKLUBzYW1weyVjcjN9LgotCi1AaXRlbQotdGhlIDYgZGVidWcgcmVnaXN0ZXJzIEBzYW1weyVkYjB9LCBAc2FtcHslZGIxfSwgQHNhbXB7JWRiMn0sCi1Ac2FtcHslZGIzfSwgQHNhbXB7JWRiNn0sIGFuZCBAc2FtcHslZGI3fS4KLQotQGl0ZW0KLXRoZSAyIHRlc3QgcmVnaXN0ZXJzIEBzYW1weyV0cjZ9IGFuZCBAc2FtcHsldHI3fS4KLQotQGl0ZW0KLXRoZSA4IGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHN0YWNrIEBzYW1weyVzdH0gb3IgZXF1aXZhbGVudGx5Ci1Ac2FtcHslc3QoMCl9LCBAc2FtcHslc3QoMSl9LCBAc2FtcHslc3QoMil9LCBAc2FtcHslc3QoMyl9LAotQHNhbXB7JXN0KDQpfSwgQHNhbXB7JXN0KDUpfSwgQHNhbXB7JXN0KDYpfSwgYW5kIEBzYW1weyVzdCg3KX0uCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgaTM4Ni1QcmVmaXhlcwotQHNlY3Rpb24gSW5zdHJ1Y3Rpb24gUHJlZml4ZXMKLQotQGNpbmRleCBpMzg2IGluc3RydWN0aW9uIHByZWZpeGVzCi1AY2luZGV4IGluc3RydWN0aW9uIHByZWZpeGVzLCBpMzg2Ci1AY2luZGV4IHByZWZpeGVzLCBpMzg2Ci1JbnN0cnVjdGlvbiBwcmVmaXhlcyBhcmUgdXNlZCB0byBtb2RpZnkgdGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbi4gIFRoZXkKLWFyZSB1c2VkIHRvIHJlcGVhdCBzdHJpbmcgaW5zdHJ1Y3Rpb25zLCB0byBwcm92aWRlIHNlY3Rpb24gb3ZlcnJpZGVzLCB0bwotcGVyZm9ybSBidXMgbG9jayBvcGVyYXRpb25zLCBhbmQgdG8gY2hhbmdlIG9wZXJhbmQgYW5kIGFkZHJlc3Mgc2l6ZXMuCi0oTW9zdCBpbnN0cnVjdGlvbnMgdGhhdCBub3JtYWxseSBvcGVyYXRlIG9uIDMyLWJpdCBvcGVyYW5kcyB3aWxsIHVzZQotMTYtYml0IG9wZXJhbmRzIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgYW4gYGBvcGVyYW5kIHNpemUnJyBwcmVmaXguKQotSW5zdHJ1Y3Rpb24gcHJlZml4ZXMgYXJlIGJlc3Qgd3JpdHRlbiBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBpbnN0cnVjdGlvbgotdGhleSBhY3QgdXBvbi4gRm9yIGV4YW1wbGUsIHRoZSBAc2FtcHtzY2FzfSAoc2NhbiBzdHJpbmcpIGluc3RydWN0aW9uIGlzCi1yZXBlYXRlZCB3aXRoOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIHJlcG5lIHNjYXMgJWVzOiglZWRpKSwlYWwKLUBlbmQgc21hbGxleGFtcGxlCi0KLVlvdSBtYXkgYWxzbyBwbGFjZSBwcmVmaXhlcyBvbiB0aGUgbGluZXMgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZQotaW5zdHJ1Y3Rpb24sIGJ1dCB0aGlzIGNpcmN1bXZlbnRzIGNoZWNrcyB0aGF0IEBjb2Rle0B2YWx1ZXtBU319IGRvZXMKLXdpdGggcHJlZml4ZXMsIGFuZCB3aWxsIG5vdCB3b3JrIHdpdGggYWxsIHByZWZpeGVzLgotCi1IZXJlIGlzIGEgbGlzdCBvZiBpbnN0cnVjdGlvbiBwcmVmaXhlczoKLQotQGNpbmRleCBzZWN0aW9uIG92ZXJyaWRlIHByZWZpeGVzLCBpMzg2Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotU2VjdGlvbiBvdmVycmlkZSBwcmVmaXhlcyBAc2FtcHtjc30sIEBzYW1we2RzfSwgQHNhbXB7c3N9LCBAc2FtcHtlc30sCi1Ac2FtcHtmc30sIEBzYW1we2dzfS4gIFRoZXNlIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IHNwZWNpZnlpbmcKLXVzaW5nIHRoZSBAdmFye3NlY3Rpb259OkB2YXJ7bWVtb3J5LW9wZXJhbmR9IGZvcm0gZm9yIG1lbW9yeSByZWZlcmVuY2VzLgotCi1AY2luZGV4IHNpemUgcHJlZml4ZXMsIGkzODYKLUBpdGVtCi1PcGVyYW5kL0FkZHJlc3Mgc2l6ZSBwcmVmaXhlcyBAc2FtcHtkYXRhMTZ9IGFuZCBAc2FtcHthZGRyMTZ9Ci1jaGFuZ2UgMzItYml0IG9wZXJhbmRzL2FkZHJlc3NlcyBpbnRvIDE2LWJpdCBvcGVyYW5kcy9hZGRyZXNzZXMsCi13aGlsZSBAc2FtcHtkYXRhMzJ9IGFuZCBAc2FtcHthZGRyMzJ9IGNoYW5nZSAxNi1iaXQgb25lcyAoaW4gYQotQGNvZGV7LmNvZGUxNn0gc2VjdGlvbikgaW50byAzMi1iaXQgb3BlcmFuZHMvYWRkcmVzc2VzLiAgVGhlc2UgcHJlZml4ZXMKLUBlbXBoe211c3R9IGFwcGVhciBvbiB0aGUgc2FtZSBsaW5lIG9mIGNvZGUgYXMgdGhlIGluc3RydWN0aW9uIHRoZXkKLW1vZGlmeS4gRm9yIGV4YW1wbGUsIGluIGEgMTYtYml0IEBjb2Rley5jb2RlMTZ9IHNlY3Rpb24sIHlvdSBtaWdodAotd3JpdGU6Ci0KLUBzbWFsbGV4YW1wbGUKLSAgICAgICAgYWRkcjMyIGptcGwgKiglZWJ4KQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBidXMgbG9jayBwcmVmaXhlcywgaTM4NgotQGNpbmRleCBpbmhpYml0aW5nIGludGVycnVwdHMsIGkzODYKLUBpdGVtCi1UaGUgYnVzIGxvY2sgcHJlZml4IEBzYW1we2xvY2t9IGluaGliaXRzIGludGVycnVwdHMgZHVyaW5nIGV4ZWN1dGlvbiBvZgotdGhlIGluc3RydWN0aW9uIGl0IHByZWNlZGVzLiAgKFRoaXMgaXMgb25seSB2YWxpZCB3aXRoIGNlcnRhaW4KLWluc3RydWN0aW9uczsgc2VlIGEgODAzODYgbWFudWFsIGZvciBkZXRhaWxzKS4KLQotQGNpbmRleCBjb3Byb2Nlc3NvciB3YWl0LCBpMzg2Ci1AaXRlbQotVGhlIHdhaXQgZm9yIGNvcHJvY2Vzc29yIHByZWZpeCBAc2FtcHt3YWl0fSB3YWl0cyBmb3IgdGhlIGNvcHJvY2Vzc29yIHRvCi1jb21wbGV0ZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gIFRoaXMgc2hvdWxkIG5ldmVyIGJlIG5lZWRlZCBmb3IgdGhlCi04MDM4Ni84MDM4NyBjb21iaW5hdGlvbi4KLQotQGNpbmRleCByZXBlYXQgcHJlZml4ZXMsIGkzODYKLUBpdGVtCi1UaGUgQHNhbXB7cmVwfSwgQHNhbXB7cmVwZX0sIGFuZCBAc2FtcHtyZXBuZX0gcHJlZml4ZXMgYXJlIGFkZGVkCi10byBzdHJpbmcgaW5zdHJ1Y3Rpb25zIHRvIG1ha2UgdGhlbSByZXBlYXQgQHNhbXB7JWVjeH0gdGltZXMgKEBzYW1weyVjeH0KLXRpbWVzIGlmIHRoZSBjdXJyZW50IGFkZHJlc3Mgc2l6ZSBpcyAxNi1iaXRzKS4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBpMzg2LU1lbW9yeQotQHNlY3Rpb24gTWVtb3J5IFJlZmVyZW5jZXMKLQotQGNpbmRleCBpMzg2IG1lbW9yeSByZWZlcmVuY2VzCi1AY2luZGV4IG1lbW9yeSByZWZlcmVuY2VzLCBpMzg2Ci1BbiBJbnRlbCBzeW50YXggaW5kaXJlY3QgbWVtb3J5IHJlZmVyZW5jZSBvZiB0aGUgZm9ybQotCi1Ac21hbGxleGFtcGxlCi1AdmFye3NlY3Rpb259OltAdmFye2Jhc2V9ICsgQHZhcntpbmRleH0qQHZhcntzY2FsZX0gKyBAdmFye2Rpc3B9XQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1pcyB0cmFuc2xhdGVkIGludG8gdGhlIEFUJlQgc3ludGF4Ci0KLUBzbWFsbGV4YW1wbGUKLUB2YXJ7c2VjdGlvbn06QHZhcntkaXNwfShAdmFye2Jhc2V9LCBAdmFye2luZGV4fSwgQHZhcntzY2FsZX0pCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZXJlIEB2YXJ7YmFzZX0gYW5kIEB2YXJ7aW5kZXh9IGFyZSB0aGUgb3B0aW9uYWwgMzItYml0IGJhc2UgYW5kCi1pbmRleCByZWdpc3RlcnMsIEB2YXJ7ZGlzcH0gaXMgdGhlIG9wdGlvbmFsIGRpc3BsYWNlbWVudCwgYW5kCi1AdmFye3NjYWxlfSwgdGFraW5nIHRoZSB2YWx1ZXMgMSwgMiwgNCwgYW5kIDgsIG11bHRpcGxpZXMgQHZhcntpbmRleH0KLXRvIGNhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgb3BlcmFuZC4gIElmIG5vIEB2YXJ7c2NhbGV9IGlzCi1zcGVjaWZpZWQsIEB2YXJ7c2NhbGV9IGlzIHRha2VuIHRvIGJlIDEuICBAdmFye3NlY3Rpb259IHNwZWNpZmllcyB0aGUKLW9wdGlvbmFsIHNlY3Rpb24gcmVnaXN0ZXIgZm9yIHRoZSBtZW1vcnkgb3BlcmFuZCwgYW5kIG1heSBvdmVycmlkZSB0aGUKLWRlZmF1bHQgc2VjdGlvbiByZWdpc3RlciAoc2VlIGEgODAzODYgbWFudWFsIGZvciBzZWN0aW9uIHJlZ2lzdGVyCi1kZWZhdWx0cykuIE5vdGUgdGhhdCBzZWN0aW9uIG92ZXJyaWRlcyBpbiBBVCZUIHN5bnRheCBAZW1waHttdXN0fQotYmUgcHJlY2VkZWQgYnkgYSBAc2FtcHslfS4gIElmIHlvdSBzcGVjaWZ5IGEgc2VjdGlvbiBvdmVycmlkZSB3aGljaAotY29pbmNpZGVzIHdpdGggdGhlIGRlZmF1bHQgc2VjdGlvbiByZWdpc3RlciwgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBAZW1waHtub3R9Ci1vdXRwdXQgYW55IHNlY3Rpb24gcmVnaXN0ZXIgb3ZlcnJpZGUgcHJlZml4ZXMgdG8gYXNzZW1ibGUgdGhlIGdpdmVuCi1pbnN0cnVjdGlvbi4gIFRodXMsIHNlY3Rpb24gb3ZlcnJpZGVzIGNhbiBiZSBzcGVjaWZpZWQgdG8gZW1waGFzaXplIHdoaWNoCi1zZWN0aW9uIHJlZ2lzdGVyIGlzIHVzZWQgZm9yIGEgZ2l2ZW4gbWVtb3J5IG9wZXJhbmQuCi0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgSW50ZWwgYW5kIEFUJlQgc3R5bGUgbWVtb3J5IHJlZmVyZW5jZXM6Ci0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gQVQmVDogQHNhbXB7LTQoJWVicCl9LCBJbnRlbDogIEBzYW1we1tlYnAgLSA0XX0KLUB2YXJ7YmFzZX0gaXMgQHNhbXB7JWVicH07IEB2YXJ7ZGlzcH0gaXMgQHNhbXB7LTR9LiBAdmFye3NlY3Rpb259IGlzCi1taXNzaW5nLCBhbmQgdGhlIGRlZmF1bHQgc2VjdGlvbiBpcyB1c2VkIChAc2FtcHslc3N9IGZvciBhZGRyZXNzaW5nIHdpdGgKLUBzYW1weyVlYnB9IGFzIHRoZSBiYXNlIHJlZ2lzdGVyKS4gIEB2YXJ7aW5kZXh9LCBAdmFye3NjYWxlfSBhcmUgYm90aCBtaXNzaW5nLgotCi1AaXRlbSBBVCZUOiBAc2FtcHtmb28oLCVlYXgsNCl9LCBJbnRlbDogQHNhbXB7W2ZvbyArIGVheCo0XX0KLUB2YXJ7aW5kZXh9IGlzIEBzYW1weyVlYXh9IChzY2FsZWQgYnkgYSBAdmFye3NjYWxlfSA0KTsgQHZhcntkaXNwfSBpcwotQHNhbXB7Zm9vfS4gIEFsbCBvdGhlciBmaWVsZHMgYXJlIG1pc3NpbmcuICBUaGUgc2VjdGlvbiByZWdpc3RlciBoZXJlCi1kZWZhdWx0cyB0byBAc2FtcHslZHN9LgotCi1AaXRlbSBBVCZUOiBAc2FtcHtmb28oLDEpfTsgSW50ZWwgQHNhbXB7W2Zvb119Ci1UaGlzIHVzZXMgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgQHNhbXB7Zm9vfSBhcyBhIG1lbW9yeSBvcGVyYW5kLgotTm90ZSB0aGF0IEB2YXJ7YmFzZX0gYW5kIEB2YXJ7aW5kZXh9IGFyZSBib3RoIG1pc3NpbmcsIGJ1dCB0aGVyZSBpcyBvbmx5Ci1AZW1waHtvbmV9IEBzYW1weyx9LiAgVGhpcyBpcyBhIHN5bnRhY3RpYyBleGNlcHRpb24uCi0KLUBpdGVtIEFUJlQ6IEBzYW1weyVnczpmb299OyBJbnRlbCBAc2FtcHtnczpmb299Ci1UaGlzIHNlbGVjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSB2YXJpYWJsZSBAc2FtcHtmb299IHdpdGggc2VjdGlvbgotcmVnaXN0ZXIgQHZhcntzZWN0aW9ufSBiZWluZyBAc2FtcHslZ3N9LgotQGVuZCB0YWJsZQotCi1BYnNvbHV0ZSAoYXMgb3Bwb3NlZCB0byBQQyByZWxhdGl2ZSkgY2FsbCBhbmQganVtcCBvcGVyYW5kcyBtdXN0IGJlCi1wcmVmaXhlZCB3aXRoIEBzYW1weyp9LiAgSWYgbm8gQHNhbXB7Kn0gaXMgc3BlY2lmaWVkLCBAY29kZXtAdmFsdWV7QVN9fQotYWx3YXlzIGNob29zZXMgUEMgcmVsYXRpdmUgYWRkcmVzc2luZyBmb3IganVtcC9jYWxsIGxhYmVscy4KLQotQW55IGluc3RydWN0aW9uIHRoYXQgaGFzIGEgbWVtb3J5IG9wZXJhbmQsIGJ1dCBubyByZWdpc3RlciBvcGVyYW5kLAotQGVtcGh7bXVzdH0gc3BlY2lmeSBpdHMgc2l6ZSAoYnl0ZSwgd29yZCwgb3IgbG9uZykgd2l0aCBhbiBpbnN0cnVjdGlvbgotbW5lbW9uaWMgc3VmZml4IChAc2FtcHtifSwgQHNhbXB7d30sIG9yIEBzYW1we2x9LCByZXNwZWN0aXZlbHkpLgotCi1Abm9kZSBpMzg2LWp1bXBzCi1Ac2VjdGlvbiBIYW5kbGluZyBvZiBKdW1wIEluc3RydWN0aW9ucwotCi1AY2luZGV4IGp1bXAgb3B0aW1pemF0aW9uLCBpMzg2Ci1AY2luZGV4IGkzODYganVtcCBvcHRpbWl6YXRpb24KLUp1bXAgaW5zdHJ1Y3Rpb25zIGFyZSBhbHdheXMgb3B0aW1pemVkIHRvIHVzZSB0aGUgc21hbGxlc3QgcG9zc2libGUKLWRpc3BsYWNlbWVudHMuICBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSB1c2luZyBieXRlICg4LWJpdCkgZGlzcGxhY2VtZW50Ci1qdW1wcyB3aGVuZXZlciB0aGUgdGFyZ2V0IGlzIHN1ZmZpY2llbnRseSBjbG9zZS4gIElmIGEgYnl0ZSBkaXNwbGFjZW1lbnQKLWlzIGluc3VmZmljaWVudCBhIGxvbmcgKDMyLWJpdCkgZGlzcGxhY2VtZW50IGlzIHVzZWQuICBXZSBkbyBub3Qgc3VwcG9ydAotd29yZCAoMTYtYml0KSBkaXNwbGFjZW1lbnQganVtcHMgaW4gMzItYml0IG1vZGUgKGkuZS4gcHJlZml4aW5nIHRoZSBqdW1wCi1pbnN0cnVjdGlvbiB3aXRoIHRoZSBAc2FtcHtkYXRhMTZ9IGluc3RydWN0aW9uIHByZWZpeCksIHNpbmNlIHRoZSA4MDM4NgotaW5zaXN0cyB1cG9uIG1hc2tpbmcgQHNhbXB7JWVpcH0gdG8gMTYgYml0cyBhZnRlciB0aGUgd29yZCBkaXNwbGFjZW1lbnQKLWlzIGFkZGVkLgotCi1Ob3RlIHRoYXQgdGhlIEBzYW1we2pjeHp9LCBAc2FtcHtqZWN4en0sIEBzYW1we2xvb3B9LCBAc2FtcHtsb29wen0sCi1Ac2FtcHtsb29wZX0sIEBzYW1we2xvb3Buen0gYW5kIEBzYW1we2xvb3BuZX0gaW5zdHJ1Y3Rpb25zIG9ubHkgY29tZSBpbiBieXRlCi1kaXNwbGFjZW1lbnRzLCBzbyB0aGF0IGlmIHlvdSB1c2UgdGhlc2UgaW5zdHJ1Y3Rpb25zIChAY29kZXtAdmFsdWV7R0NDfX0gZG9lcwotbm90IHVzZSB0aGVtKSB5b3UgbWF5IGdldCBhbiBlcnJvciBtZXNzYWdlIChhbmQgaW5jb3JyZWN0IGNvZGUpLiAgVGhlIEFUJlQKLTgwMzg2IGFzc2VtYmxlciB0cmllcyB0byBnZXQgYXJvdW5kIHRoaXMgcHJvYmxlbSBieSBleHBhbmRpbmcgQHNhbXB7amN4eiBmb299Ci10bwotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICBqY3h6IGN4X3plcm8KLSAgICAgICAgIGptcCBjeF9ub256ZXJvCi1jeF96ZXJvOiBqbXAgZm9vCi1jeF9ub256ZXJvOgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgaTM4Ni1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBpMzg2IGZsb2F0aW5nIHBvaW50Ci1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBpMzg2Ci1BbGwgODAzODcgZmxvYXRpbmcgcG9pbnQgdHlwZXMgZXhjZXB0IHBhY2tlZCBCQ0QgYXJlIHN1cHBvcnRlZC4KLShCQ0Qgc3VwcG9ydCBtYXkgYmUgYWRkZWQgd2l0aG91dCBtdWNoIGRpZmZpY3VsdHkpLiAgVGhlc2UgZGF0YQotdHlwZXMgYXJlIDE2LSwgMzItLCBhbmQgNjQtIGJpdCBpbnRlZ2VycywgYW5kIHNpbmdsZSAoMzItYml0KSwKLWRvdWJsZSAoNjQtYml0KSwgYW5kIGV4dGVuZGVkICg4MC1iaXQpIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludC4KLUVhY2ggc3VwcG9ydGVkIHR5cGUgaGFzIGFuIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBhbmQgYSBjb25zdHJ1Y3RvcgotYXNzb2NpYXRlZCB3aXRoIGl0LiAgSW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgc3BlY2lmeSB0aGUgb3BlcmFuZCdzCi1kYXRhIHR5cGUuICBDb25zdHJ1Y3RvcnMgYnVpbGQgdGhlc2UgZGF0YSB0eXBlcyBpbnRvIG1lbW9yeS4KLQotQGNpbmRleCBAY29kZXtmbG9hdH0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle3NpbmdsZX0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2RvdWJsZX0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle3RmbG9hdH0gZGlyZWN0aXZlLCBpMzg2Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotRmxvYXRpbmcgcG9pbnQgY29uc3RydWN0b3JzIGFyZSBAc2FtcHsuZmxvYXR9IG9yIEBzYW1wey5zaW5nbGV9LAotQHNhbXB7LmRvdWJsZX0sIGFuZCBAc2FtcHsudGZsb2F0fSBmb3IgMzItLCA2NC0sIGFuZCA4MC1iaXQgZm9ybWF0cy4KLVRoZXNlIGNvcnJlc3BvbmQgdG8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4ZXMgQHNhbXB7c30sIEBzYW1we2x9LAotYW5kIEBzYW1we3R9LiBAc2FtcHt0fSBzdGFuZHMgZm9yIDgwLWJpdCAodGVuIGJ5dGUpIHJlYWwuICBUaGUgODAzODcKLW9ubHkgc3VwcG9ydHMgdGhpcyBmb3JtYXQgdmlhIHRoZSBAc2FtcHtmbGR0fSAobG9hZCA4MC1iaXQgcmVhbCB0byBzdGFjawotdG9wKSBhbmQgQHNhbXB7ZnN0cHR9IChzdG9yZSA4MC1iaXQgcmVhbCBhbmQgcG9wIHN0YWNrKSBpbnN0cnVjdGlvbnMuCi0KLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2xvbmd9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtpbnR9IGRpcmVjdGl2ZSwgaTM4NgotQGNpbmRleCBAY29kZXtxdWFkfSBkaXJlY3RpdmUsIGkzODYKLUBpdGVtCi1JbnRlZ2VyIGNvbnN0cnVjdG9ycyBhcmUgQHNhbXB7LndvcmR9LCBAc2FtcHsubG9uZ30gb3IgQHNhbXB7LmludH0sIGFuZAotQHNhbXB7LnF1YWR9IGZvciB0aGUgMTYtLCAzMi0sIGFuZCA2NC1iaXQgaW50ZWdlciBmb3JtYXRzLiAgVGhlCi1jb3JyZXNwb25kaW5nIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeGVzIGFyZSBAc2FtcHtzfSAoc2luZ2xlKSwKLUBzYW1we2x9IChsb25nKSwgYW5kIEBzYW1we3F9IChxdWFkKS4gIEFzIHdpdGggdGhlIDgwLWJpdCByZWFsIGZvcm1hdCwKLXRoZSA2NC1iaXQgQHNhbXB7cX0gZm9ybWF0IGlzIG9ubHkgcHJlc2VudCBpbiB0aGUgQHNhbXB7ZmlsZHF9IChsb2FkCi1xdWFkIGludGVnZXIgdG8gc3RhY2sgdG9wKSBhbmQgQHNhbXB7ZmlzdHBxfSAoc3RvcmUgcXVhZCBpbnRlZ2VyIGFuZCBwb3AKLXN0YWNrKSBpbnN0cnVjdGlvbnMuCi1AZW5kIGl0ZW1pemUKLQotUmVnaXN0ZXIgdG8gcmVnaXN0ZXIgb3BlcmF0aW9ucyBzaG91bGQgbm90IHVzZSBpbnN0cnVjdGlvbiBtbmVtb25pYyBzdWZmaXhlcy4KLUBzYW1we2ZzdGwgJXN0LCAlc3QoMSl9IHdpbGwgZ2l2ZSBhIHdhcm5pbmcsIGFuZCBiZSBhc3NlbWJsZWQgYXMgaWYgeW91Ci13cm90ZSBAc2FtcHtmc3QgJXN0LCAlc3QoMSl9LCBzaW5jZSBhbGwgcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgb3BlcmF0aW9ucwotdXNlIDgwLWJpdCBmbG9hdGluZyBwb2ludCBvcGVyYW5kcy4gKENvbnRyYXN0IHRoaXMgd2l0aCBAc2FtcHtmc3RsICVzdCwgbWVtfSwKLXdoaWNoIGNvbnZlcnRzIEBzYW1weyVzdH0gZnJvbSA4MC1iaXQgdG8gNjQtYml0IGZsb2F0aW5nIHBvaW50IGZvcm1hdCwKLXRoZW4gc3RvcmVzIHRoZSByZXN1bHQgaW4gdGhlIDQgYnl0ZSBsb2NhdGlvbiBAc2FtcHttZW19KQotCi1Abm9kZSBpMzg2LVNJTUQKLUBzZWN0aW9uIEludGVsJ3MgTU1YIGFuZCBBTUQncyAzRE5vdyEgU0lNRCBPcGVyYXRpb25zCi0KLUBjaW5kZXggTU1YLCBpMzg2Ci1AY2luZGV4IDNETm93ISwgaTM4NgotQGNpbmRleCBTSU1ELCBpMzg2Ci0KLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIEludGVsJ3MgTU1YIGluc3RydWN0aW9uIHNldCAoU0lNRAotaW5zdHJ1Y3Rpb25zIGZvciBpbnRlZ2VyIGRhdGEpLCBhdmFpbGFibGUgb24gSW50ZWwncyBQZW50aXVtIE1NWAotcHJvY2Vzc29ycyBhbmQgUGVudGl1bSBJSSBwcm9jZXNzb3JzLCBBTUQncyBLNiBhbmQgSzYtMiBwcm9jZXNzb3JzLAotQ3lyaXgnIE0yIHByb2Nlc3NvciwgYW5kIHByb2JhYmx5IG90aGVycy4gIEl0IGFsc28gc3VwcG9ydHMgQU1EJ3MgM0ROb3chCi1pbnN0cnVjdGlvbiBzZXQgKFNJTUQgaW5zdHJ1Y3Rpb25zIGZvciAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgZGF0YSkKLWF2YWlsYWJsZSBvbiBBTUQncyBLNi0yIHByb2Nlc3NvciBhbmQgcG9zc2libHkgb3RoZXJzIGluIHRoZSBmdXR1cmUuCi0KLUN1cnJlbnRseSwgQGNvZGV7QHZhbHVle0FTfX0gZG9lcyBub3Qgc3VwcG9ydCBJbnRlbCdzIGZsb2F0aW5nIHBvaW50Ci1TSU1ELCBLYXRtYWkgKEtOSSkuCi0KLVRoZSBlaWdodCA2NC1iaXQgTU1YIG9wZXJhbmRzLCBhbHNvIHVzZWQgYnkgM0ROb3chLCBhcmUgY2FsbGVkIEBzYW1weyVtbTB9LAotQHNhbXB7JW1tMX0sIC4uLiBAc2FtcHslbW03fS4gIFRoZXkgY29udGFpbiBlaWdodCA4LWJpdCBpbnRlZ2VycywgZm91cgotMTYtYml0IGludGVnZXJzLCB0d28gMzItYml0IGludGVnZXJzLCBvbmUgNjQtYml0IGludGVnZXIsIG9yIHR3byAzMi1iaXQKLWZsb2F0aW5nIHBvaW50IHZhbHVlcy4gIFRoZSBNTVggcmVnaXN0ZXJzIGNhbm5vdCBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUKLWFzIHRoZSBmbG9hdGluZyBwb2ludCBzdGFjay4KLQotU2VlIEludGVsIGFuZCBBTUQgZG9jdW1lbnRhdGlvbiwga2VlcGluZyBpbiBtaW5kIHRoYXQgdGhlIG9wZXJhbmQgb3JkZXIgaW4KLWluc3RydWN0aW9ucyBpcyByZXZlcnNlZCBmcm9tIHRoZSBJbnRlbCBzeW50YXguCi0KLUBub2RlIGkzODYtMTZiaXQKLUBzZWN0aW9uIFdyaXRpbmcgMTYtYml0IENvZGUKLQotQGNpbmRleCBpMzg2IDE2LWJpdCBjb2RlCi1AY2luZGV4IDE2LWJpdCBjb2RlLCBpMzg2Ci1AY2luZGV4IHJlYWwtbW9kZSBjb2RlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2NvZGUxNn0gZGlyZWN0aXZlLCBpMzg2Ci1AY2luZGV4IEBjb2Rle2NvZGUzMn0gZGlyZWN0aXZlLCBpMzg2Ci1XaGlsZSBAY29kZXtAdmFsdWV7QVN9fSBub3JtYWxseSB3cml0ZXMgb25seSBgYHB1cmUnJyAzMi1iaXQgaTM4NiBjb2RlLAotaXQgYWxzbyBzdXBwb3J0cyB3cml0aW5nIGNvZGUgdG8gcnVuIGluIHJlYWwgbW9kZSBvciBpbiAxNi1iaXQgcHJvdGVjdGVkCi1tb2RlIGNvZGUgc2VnbWVudHMuICBUbyBkbyB0aGlzLCBwdXQgYSBAc2FtcHsuY29kZTE2fSBkaXJlY3RpdmUgYmVmb3JlCi10aGUgYXNzZW1ibHkgbGFuZ3VhZ2UgaW5zdHJ1Y3Rpb25zIHRvIGJlIHJ1biBpbiAxNi1iaXQgbW9kZS4gIFlvdSBjYW4KLXN3aXRjaCBAY29kZXtAdmFsdWV7QVN9fSBiYWNrIHRvIHdyaXRpbmcgbm9ybWFsIDMyLWJpdCBjb2RlIHdpdGggdGhlCi1Ac2FtcHsuY29kZTMyfSBkaXJlY3RpdmUuCi0KLVRoZSBjb2RlIHdoaWNoIEBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBpbiAxNi1iaXQgbW9kZSB3aWxsIG5vdAotbmVjZXNzYXJpbHkgcnVuIG9uIGEgMTYtYml0IHByZS04MDM4NiBwcm9jZXNzb3IuICBUbyB3cml0ZSBjb2RlIHRoYXQKLXJ1bnMgb24gc3VjaCBhIHByb2Nlc3NvciwgeW91IG11c3QgcmVmcmFpbiBmcm9tIHVzaW5nIEBlbXBoe2FueX0gMzItYml0Ci1jb25zdHJ1Y3RzIHdoaWNoIHJlcXVpcmUgQGNvZGV7QHZhbHVle0FTfX0gdG8gb3V0cHV0IGFkZHJlc3Mgb3Igb3BlcmFuZAotc2l6ZSBwcmVmaXhlcy4KLQotTm90ZSB0aGF0IHdyaXRpbmcgMTYtYml0IGNvZGUgaW5zdHJ1Y3Rpb25zIGJ5IGV4cGxpY2l0bHkgc3BlY2lmeWluZyBhCi1wcmVmaXggb3IgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IHdpdGhpbiBhIDMyLWJpdCBjb2RlIHNlY3Rpb24KLWdlbmVyYXRlcyBkaWZmZXJlbnQgbWFjaGluZSBpbnN0cnVjdGlvbnMgdGhhbiB0aG9zZSBnZW5lcmF0ZWQgZm9yIGEKLTE2LWJpdCBjb2RlIHNlZ21lbnQuICBJbiBhIDMyLWJpdCBjb2RlIHNlY3Rpb24sIHRoZSBmb2xsb3dpbmcgY29kZQotZ2VuZXJhdGVzIHRoZSBtYWNoaW5lIG9wY29kZSBieXRlcyBAc2FtcHs2NiA2YSAwNH0sIHdoaWNoIHB1c2hlcyB0aGUKLXZhbHVlIEBzYW1wezR9IG9udG8gdGhlIHN0YWNrLCBkZWNyZW1lbnRpbmcgQHNhbXB7JWVzcH0gYnkgMi4KLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBwdXNodyAkNAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHNhbWUgY29kZSBpbiBhIDE2LWJpdCBjb2RlIHNlY3Rpb24gd291bGQgZ2VuZXJhdGUgdGhlIG1hY2hpbmUKLW9wY29kZSBieXRlcyBAc2FtcHs2YSAwNH0gKGllLiB3aXRob3V0IHRoZSBvcGVyYW5kIHNpemUgcHJlZml4KSwgd2hpY2gKLWlzIGNvcnJlY3Qgc2luY2UgdGhlIHByb2Nlc3NvciBkZWZhdWx0IG9wZXJhbmQgc2l6ZSBpcyBhc3N1bWVkIHRvIGJlIDE2Ci1iaXRzIGluIGEgMTYtYml0IGNvZGUgc2VjdGlvbi4KLQotQG5vZGUgaTM4Ni1CdWdzCi1Ac2VjdGlvbiBBVCZUIFN5bnRheCBidWdzCi0KLVRoZSBVbml4V2FyZSBhc3NlbWJsZXIsIGFuZCBwcm9iYWJseSBvdGhlciBBVCZUIGRlcml2ZWQgaXg4NiBVbml4Ci1hc3NlbWJsZXJzLCBnZW5lcmF0ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgd2l0aCByZXZlcnNlZCBzb3VyY2UKLWFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgaW4gY2VydGFpbiBjYXNlcy4gIFVuZm9ydHVuYXRlbHksIGdjYyBhbmQKLXBvc3NpYmx5IG1hbnkgb3RoZXIgcHJvZ3JhbXMgdXNlIHRoaXMgcmV2ZXJzZWQgc3ludGF4LCBzbyB3ZSdyZSBzdHVjawotd2l0aCBpdC4KLQotRm9yIGV4YW1wbGUKLQotQHNtYWxsZXhhbXBsZQotICAgICAgICBmc3ViICVzdCwlc3QoMykKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXJlc3VsdHMgaW4gQHNhbXB7JXN0KDMpfSBiZWluZyB1cGRhdGVkIHRvIEBzYW1weyVzdCAtICVzdCgzKX0gcmF0aGVyCi10aGFuIHRoZSBleHBlY3RlZCBAc2FtcHslc3QoMykgLSAlc3R9LiAgVGhpcyBoYXBwZW5zIHdpdGggYWxsIHRoZQotbm9uLWNvbW11dGF0aXZlIGFyaXRobWV0aWMgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyB3aXRoIHR3byByZWdpc3Rlcgotb3BlcmFuZHMgd2hlcmUgdGhlIHNvdXJjZSByZWdpc3RlciBpcyBAc2FtcHslc3R9IGFuZCB0aGUgZGVzdGluYXRpb24KLXJlZ2lzdGVyIGlzIEBzYW1weyVzdChpKX0uCi0KLUBub2RlIGkzODYtTm90ZXMKLUBzZWN0aW9uIE5vdGVzCi0KLUBjaW5kZXggaTM4NiBAY29kZXttdWx9LCBAY29kZXtpbXVsfSBpbnN0cnVjdGlvbnMKLUBjaW5kZXggQGNvZGV7bXVsfSBpbnN0cnVjdGlvbiwgaTM4NgotQGNpbmRleCBAY29kZXtpbXVsfSBpbnN0cnVjdGlvbiwgaTM4NgotVGhlcmUgaXMgc29tZSB0cmlja2VyeSBjb25jZXJuaW5nIHRoZSBAc2FtcHttdWx9IGFuZCBAc2FtcHtpbXVsfQotaW5zdHJ1Y3Rpb25zIHRoYXQgZGVzZXJ2ZXMgbWVudGlvbi4gIFRoZSAxNi0sIDMyLSwgYW5kIDY0LWJpdCBleHBhbmRpbmcKLW11bHRpcGxpZXMgKGJhc2Ugb3Bjb2RlIEBzYW1wezB4ZjZ9OyBleHRlbnNpb24gNCBmb3IgQHNhbXB7bXVsfSBhbmQgNQotZm9yIEBzYW1we2ltdWx9KSBjYW4gYmUgb3V0cHV0IG9ubHkgaW4gdGhlIG9uZSBvcGVyYW5kIGZvcm0uICBUaHVzLAotQHNhbXB7aW11bCAlZWJ4LCAlZWF4fSBkb2VzIEBlbXBoe25vdH0gc2VsZWN0IHRoZSBleHBhbmRpbmcgbXVsdGlwbHk7Ci10aGUgZXhwYW5kaW5nIG11bHRpcGx5IHdvdWxkIGNsb2JiZXIgdGhlIEBzYW1weyVlZHh9IHJlZ2lzdGVyLCBhbmQgdGhpcwotd291bGQgY29uZnVzZSBAY29kZXtAdmFsdWV7R0NDfX0gb3V0cHV0LiAgVXNlIEBzYW1we2ltdWwgJWVieH0gdG8gZ2V0IHRoZQotNjQtYml0IHByb2R1Y3QgaW4gQHNhbXB7JWVkeDolZWF4fS4KLQotV2UgaGF2ZSBhZGRlZCBhIHR3byBvcGVyYW5kIGZvcm0gb2YgQHNhbXB7aW11bH0gd2hlbiB0aGUgZmlyc3Qgb3BlcmFuZAotaXMgYW4gaW1tZWRpYXRlIG1vZGUgZXhwcmVzc2lvbiBhbmQgdGhlIHNlY29uZCBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIuCi1UaGlzIGlzIGp1c3QgYSBzaG9ydGhhbmQsIHNvIHRoYXQsIG11bHRpcGx5aW5nIEBzYW1weyVlYXh9IGJ5IDY5LCBmb3IKLWV4YW1wbGUsIGNhbiBiZSBkb25lIHdpdGggQHNhbXB7aW11bCAkNjksICVlYXh9IHJhdGhlciB0aGFuIEBzYW1we2ltdWwKLSQ2OSwgJWVheCwgJWVheH0uCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1pOTYwLnRleGkgYi9nYXMvZG9jL2MtaTk2MC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzcwMzBhLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1pOTYwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIGk5NjAtRGVwZW5kZW50Ci1AY2hhcHRlciBJbnRlbCA4MDk2MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBJbnRlbCA4MDk2MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IGk5NjAgc3VwcG9ydAotQG1lbnUKLSogT3B0aW9ucy1pOTYwOjogICAgICAgICAgICAgICAgaTk2MCBDb21tYW5kLWxpbmUgT3B0aW9ucwotKiBGbG9hdGluZyBQb2ludC1pOTYwOjogICAgICAgICBGbG9hdGluZyBQb2ludAotKiBEaXJlY3RpdmVzLWk5NjA6OiAgICAgICAgICAgICBpOTYwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBPcGNvZGVzIGZvciBpOTYwOjogICAgICAgICAgICBpOTYwIE9wY29kZXMKLUBlbmQgbWVudQotCi1AYyBGSVhNRSEgQWRkIFN5bnRheCBzZWMgd2l0aCBkaXNjdXNzaW9uIG9mIGJpdGZpZWxkcyBoZXJlLCBhdCBsZWFzdCBzbwotQGMgbG9uZyBhcyB0aGV5J3JlIG5vdCB0dXJuZWQgb24gZm9yIG90aGVyIG1hY2hpbmVzIHRoYW4gOTYwLgotCi1Abm9kZSBPcHRpb25zLWk5NjAKLQotQHNlY3Rpb24gaTk2MCBDb21tYW5kLWxpbmUgT3B0aW9ucwotCi1AY2luZGV4IGk5NjAgb3B0aW9ucwotQGNpbmRleCBvcHRpb25zLCBpOTYwCi1AdGFibGUgQGNvZGUKLQotQGNpbmRleCBpOTYwIGFyY2hpdGVjdHVyZSBvcHRpb25zCi1AY2luZGV4IGFyY2hpdGVjdHVyZSBvcHRpb25zLCBpOTYwCi1AY2luZGV4IEBjb2Rley1BfSBvcHRpb25zLCBpOTYwCi1AaXRlbSAtQUNBIHwgLUFDQV9BIHwgLUFDQiB8IC1BQ0MgfCAtQUtBIHwgLUFLQiB8IC1BS0MgfCAtQU1DCi1TZWxlY3QgdGhlIDgwOTYwIGFyY2hpdGVjdHVyZS4gIEluc3RydWN0aW9ucyBvciBmZWF0dXJlcyBub3Qgc3VwcG9ydGVkCi1ieSB0aGUgc2VsZWN0ZWQgYXJjaGl0ZWN0dXJlIGNhdXNlIGZhdGFsIGVycm9ycy4KLQotQHNhbXB7LUFDQX0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHstQUNBX0F9OyBAc2FtcHstQUtDfSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHstQU1DfS4gIFN5bm9ueW1zIGFyZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgotCi1JZiB5b3UgZG8gbm90IHNwZWNpZnkgYW55IG9mIHRoZXNlIG9wdGlvbnMsIEBjb2Rle0B2YWx1ZXtBU319IGdlbmVyYXRlcyBjb2RlCi1mb3IgYW55IGluc3RydWN0aW9uIG9yIGZlYXR1cmUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgQGVtcGh7c29tZX0gdmVyc2lvbiBvZiB0aGUKLTk2MCAoZXZlbiBpZiB0aGlzIG1lYW5zIG1peGluZyBhcmNoaXRlY3R1cmVzISkuICBJbiBwcmluY2lwbGUsCi1AY29kZXtAdmFsdWV7QVN9fSBhdHRlbXB0cyB0byBkZWR1Y2UgdGhlIG1pbmltYWwgc3VmZmljaWVudCBwcm9jZXNzb3IgdHlwZSBpZgotbm9uZSBpcyBzcGVjaWZpZWQ7IGRlcGVuZGluZyBvbiB0aGUgb2JqZWN0IGNvZGUgZm9ybWF0LCB0aGUgcHJvY2Vzc29yIHR5cGUgbWF5Ci1iZSByZWNvcmRlZCBpbiB0aGUgb2JqZWN0IGZpbGUuICBJZiBpdCBpcyBjcml0aWNhbCB0aGF0IHRoZSBAY29kZXtAdmFsdWV7QVN9fQotb3V0cHV0IG1hdGNoIGEgc3BlY2lmaWMgYXJjaGl0ZWN0dXJlLCBzcGVjaWZ5IHRoYXQgYXJjaGl0ZWN0dXJlIGV4cGxpY2l0bHkuCi0KLUBjaW5kZXggQGNvZGV7LWJ9IG9wdGlvbiwgaTk2MAotQGNpbmRleCBicmFuY2ggcmVjb3JkaW5nLCBpOTYwCi1AY2luZGV4IGk5NjAgYnJhbmNoIHJlY29yZGluZwotQGl0ZW0gLWIKLUFkZCBjb2RlIHRvIGNvbGxlY3QgaW5mb3JtYXRpb24gYWJvdXQgY29uZGl0aW9uYWwgYnJhbmNoZXMgdGFrZW4sIGZvcgotbGF0ZXIgb3B0aW1pemF0aW9uIHVzaW5nIGJyYW5jaCBwcmVkaWN0aW9uIGJpdHMuICAoVGhlIGNvbmRpdGlvbmFsIGJyYW5jaAotaW5zdHJ1Y3Rpb25zIGhhdmUgYnJhbmNoIHByZWRpY3Rpb24gYml0cyBpbiB0aGUgQ0EsIENCLCBhbmQgQ0MKLWFyY2hpdGVjdHVyZXMuKSAgSWYgQHZhcntCUn0gcmVwcmVzZW50cyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbiwKLXRoZSBmb2xsb3dpbmcgcmVwcmVzZW50cyB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuCi1Ac2FtcHstYn0gaXMgc3BlY2lmaWVkOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgIGNhbGwgICAgQHZhcntpbmNyZW1lbnQgcm91dGluZX0KLSAgICAgICAgLndvcmQgICAwICAgICAgICMgcHJlLWNvdW50ZXIKLUxhYmVsOiAgQHZhcntCUn0KLSAgICAgICAgY2FsbCAgICBAdmFye2luY3JlbWVudCByb3V0aW5lfQotICAgICAgICAud29yZCAgIDAgICAgICAgIyBwb3N0LWNvdW50ZXIKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBjb3VudGVyIGZvbGxvd2luZyBhIGJyYW5jaCByZWNvcmRzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBicmFuY2gKLXdhcyBAZW1waHtub3R9IHRha2VuOyB0aGUgZGlmZmVyZW5jIGJldHdlZW4gdGhlIHR3byBjb3VudGVycyBpcyB0aGUKLW51bWJlciBvZiB0aW1lcyB0aGUgYnJhbmNoIEBlbXBoe3dhc30gdGFrZW4uCi0KLUBjaW5kZXggQGNvZGV7Z2JyOTYwfSwgaTk2MCBwb3N0cHJvY2Vzc29yCi1AY2luZGV4IGJyYW5jaCBzdGF0aXN0aWNzIHRhYmxlLCBpOTYwCi1BIHRhYmxlIG9mIGV2ZXJ5IHN1Y2ggQGNvZGV7TGFiZWx9IGlzIGFsc28gZ2VuZXJhdGVkLCBzbyB0aGF0IHRoZQotZXh0ZXJuYWwgcG9zdHByb2Nlc3NvciBAY29kZXtnYnI5NjB9IChzdXBwbGllZCBieSBJbnRlbCkgY2FuIGxvY2F0ZSBhbGwKLXRoZSBjb3VudGVycy4gIFRoaXMgdGFibGUgaXMgYWx3YXlzIGxhYmVsbGVkIEBzYW1we19fQlJBTkNIX1RBQkxFX199OwotdGhpcyBpcyBhIGxvY2FsIHN5bWJvbCB0byBwZXJtaXQgY29sbGVjdGluZyBzdGF0aXN0aWNzIGZvciBtYW55IHNlcGFyYXRlCi1vYmplY3QgZmlsZXMuICBUaGUgdGFibGUgaXMgd29yZCBhbGlnbmVkLCBhbmQgYmVnaW5zIHdpdGggYSB0d28td29yZAotaGVhZGVyLiAgVGhlIGZpcnN0IHdvcmQsIGluaXRpYWxpemVkIHRvIDAsIGlzIHVzZWQgaW4gbWFpbnRhaW5pbmcgbGlua2VkCi1saXN0cyBvZiBicmFuY2ggdGFibGVzLiAgVGhlIHNlY29uZCB3b3JkIGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZgotZW50cmllcyBpbiB0aGUgdGFibGUsIHdoaWNoIGZvbGxvdyBpbW1lZGlhdGVseTogZWFjaCBpcyBhIHdvcmQsIHBvaW50aW5nCi10byBvbmUgb2YgdGhlIGxhYmVscyBpbGx1c3RyYXRlZCBhYm92ZS4KLQotQGMgVEVYSTJST0ZGLUtJTEwKLUBpZmluZm8KLUBjIEVORCBURVhJMlJPRkYtS0lMTAotQGV4YW1wbGUKLSArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rIC4uLiArLS0tLS0tLS0tLS0tKwotIHwgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICB8Ci0gfCAgKk5FWFQgICAgIHwgIENPVU5UOiBOICB8ICpCUkxBQiAxICAgfCAgICAgfCAqQlJMQUIgTiAgIHwKLSB8ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgfAotICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSsgLi4uICstLS0tLS0tLS0tLS0rCi0KLSAgICAgICAgICAgICAgIF9fQlJBTkNIX1RBQkxFX18gbGF5b3V0Ci1AZW5kIGV4YW1wbGUKLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQG5lZWQgMjAwMAotQHRleAotXHZza2lwIDFwYwotXGxpbmV7XGxlZnRza2lwPTBwdFxoc2tpcFx0YWJsZWluZGVudAotXGJveGl0ezJjbX17XHR0ICpORVhUfVxib3hpdHsyY219e1x0dCBDT1VOVDogXGl0IE59XGJveGl0ezJjbX17XHR0Ci0qQlJMQUIgMX1caWJveHsxY219e1xxdWFkXGRvdHN9XGJveGl0ezJjbX17XHR0ICpCUkxBQiBcaXQgTn1caGZpbH0KLVxjZW50ZXJsaW5le1xpdCB7XHR0IFxfXF9CUkFOQ0hcX1RBQkxFXF9cX30gbGF5b3V0fQotQGVuZCB0ZXgKLUBjIEVORCBURVhJMlJPRkYtS0lMTAotCi1UaGUgZmlyc3Qgd29yZCBvZiB0aGUgaGVhZGVyIGlzIHVzZWQgdG8gbG9jYXRlIG11bHRpcGxlIGJyYW5jaCB0YWJsZXMsCi1zaW5jZSBlYWNoIG9iamVjdCBmaWxlIG1heSBjb250YWluIG9uZS4gTm9ybWFsbHkgdGhlIGxpbmtzIGFyZQotbWFpbnRhaW5lZCB3aXRoIGEgY2FsbCB0byBhbiBpbml0aWFsaXphdGlvbiByb3V0aW5lLCBwbGFjZWQgYXQgdGhlCi1iZWdpbm5pbmcgb2YgZWFjaCBmdW5jdGlvbiBpbiB0aGUgZmlsZS4gIFRoZSBAc2N7Z251fSBDIGNvbXBpbGVyCi1nZW5lcmF0ZXMgdGhlc2UgY2FsbHMgYXV0b21hdGljYWxseSB3aGVuIHlvdSBnaXZlIGl0IGEgQHNhbXB7LWJ9IG9wdGlvbi4KLUZvciBmdXJ0aGVyIGRldGFpbHMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBAc2FtcHtnYnI5NjB9LgotCi1AY2luZGV4IEBjb2Rley1uby1yZWxheH0gb3B0aW9uLCBpOTYwCi1AaXRlbSAtbm8tcmVsYXgKLU5vcm1hbGx5LCBDb21wYXJlLWFuZC1CcmFuY2ggaW5zdHJ1Y3Rpb25zIHdpdGggdGFyZ2V0cyB0aGF0IHJlcXVpcmUKLWRpc3BsYWNlbWVudHMgZ3JlYXRlciB0aGFuIDEzIGJpdHMgKG9yIHRoYXQgaGF2ZSBleHRlcm5hbCB0YXJnZXRzKSBhcmUKLXJlcGxhY2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29tcGFyZSAob3IgQHNhbXB7Y2hrYml0fSkgYW5kIGJyYW5jaAotaW5zdHJ1Y3Rpb25zLiAgWW91IGNhbiB1c2UgdGhlIEBzYW1wey1uby1yZWxheH0gb3B0aW9uIHRvIHNwZWNpZnkgdGhhdAotQGNvZGV7QHZhbHVle0FTfX0gc2hvdWxkIGdlbmVyYXRlIGVycm9ycyBpbnN0ZWFkLCBpZiB0aGUgdGFyZ2V0IGRpc3BsYWNlbWVudAotaXMgbGFyZ2VyIHRoYW4gMTMgYml0cy4KLQotVGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBDb21wYXJlLWFuZC1KdW1wIGluc3RydWN0aW9uczsgdGhlIGNvZGUKLWVtaXR0ZWQgZm9yIHRoZW0gaXMgQGVtcGh7YWx3YXlzfSBhZGp1c3RlZCB3aGVuIG5lY2Vzc2FyeSAoZGVwZW5kaW5nIG9uCi1kaXNwbGFjZW1lbnQgc2l6ZSksIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB5b3UgdXNlIEBzYW1wey1uby1yZWxheH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIEZsb2F0aW5nIFBvaW50LWk5NjAKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIGk5NjAgKEBzY3tpZWVlfSkKLUBjaW5kZXggaTk2MCBmbG9hdGluZyBwb2ludCAoQHNje2llZWV9KQotQGNvZGV7QHZhbHVle0FTfX0gZ2VuZXJhdGVzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGZvciB0aGUgZGlyZWN0aXZlcwotQHNhbXB7LmZsb2F0fSwgQHNhbXB7LmRvdWJsZX0sIEBzYW1wey5leHRlbmRlZH0sIGFuZCBAc2FtcHsuc2luZ2xlfS4KLQotQG5vZGUgRGlyZWN0aXZlcy1pOTYwCi1Ac2VjdGlvbiBpOTYwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgaTk2MAotQGNpbmRleCBpOTYwIG1hY2hpbmUgZGlyZWN0aXZlcwotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7YnNzfSBkaXJlY3RpdmUsIGk5NjAKLUBpdGVtIC5ic3MgQHZhcntzeW1ib2x9LCBAdmFye2xlbmd0aH0sIEB2YXJ7YWxpZ259Ci1SZXNlcnZlIEB2YXJ7bGVuZ3RofSBieXRlcyBpbiB0aGUgYnNzIHNlY3Rpb24gZm9yIGEgbG9jYWwgQHZhcntzeW1ib2x9LAotYWxpZ25lZCB0byB0aGUgcG93ZXIgb2YgdHdvIHNwZWNpZmllZCBieSBAdmFye2FsaWdufS4gIEB2YXJ7bGVuZ3RofSBhbmQKLUB2YXJ7YWxpZ259IG11c3QgYmUgcG9zaXRpdmUgYWJzb2x1dGUgZXhwcmVzc2lvbnMuICBUaGlzIGRpcmVjdGl2ZQotZGlmZmVycyBmcm9tIEBzYW1wey5sY29tbX0gb25seSBpbiB0aGF0IGl0IHBlcm1pdHMgeW91IHRvIHNwZWNpZnkKLWFuIGFsaWdubWVudC4gIEB4cmVme0xjb21tLCxAY29kZXsubGNvbW19fS4KLUBlbmQgdGFibGUKLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2V4dGVuZGVkfSBkaXJlY3RpdmUsIGk5NjAKLUBpdGVtIC5leHRlbmRlZCBAdmFye2Zsb251bXN9Ci1AY29kZXsuZXh0ZW5kZWR9IGV4cGVjdHMgemVybyBvciBtb3JlIGZsb251bXMsIHNlcGFyYXRlZCBieSBjb21tYXM7IGZvcgotZWFjaCBmbG9udW0sIEBzYW1wey5leHRlbmRlZH0gZW1pdHMgYW4gQHNje2llZWV9IGV4dGVuZGVkLWZvcm1hdCAoODAtYml0KQotZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotCi1AY2luZGV4IEBjb2Rle2xlYWZwcm9jfSBkaXJlY3RpdmUsIGk5NjAKLUBpdGVtIC5sZWFmcHJvYyBAdmFye2NhbGwtbGFifSwgQHZhcntiYWwtbGFifQotWW91IGNhbiB1c2UgdGhlIEBzYW1wey5sZWFmcHJvY30gZGlyZWN0aXZlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi1vcHRpbWl6ZWQgQGNvZGV7Y2FsbGp9IGluc3RydWN0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgY2FsbHMgb2YgbGVhZgotcHJvY2VkdXJlcy4gIElmIGEgcHJvY2VkdXJlIGlzIGtub3duIHRvIGNhbGwgbm8gb3RoZXIgcHJvY2VkdXJlcywgeW91Ci1tYXkgZGVmaW5lIGFuIGVudHJ5IHBvaW50IHRoYXQgc2tpcHMgcHJvY2VkdXJlIHByb2xvZyBjb2RlIChhbmQgdGhhdCBkb2VzCi1ub3QgZGVwZW5kIG9uIHN5c3RlbS1zdXBwbGllZCBzYXZlZCBjb250ZXh0KSwgYW5kIGRlY2xhcmUgaXQgYXMgdGhlCi1AdmFye2JhbC1sYWJ9IHVzaW5nIEBzYW1wey5sZWFmcHJvY30uICBJZiB0aGUgcHJvY2VkdXJlIGFsc28gaGFzIGFuCi1lbnRyeSBwb2ludCB0aGF0IGdvZXMgdGhyb3VnaCB0aGUgbm9ybWFsIHByb2xvZywgeW91IGNhbiBzcGVjaWZ5IHRoYXQKLWVudHJ5IHBvaW50IGFzIEB2YXJ7Y2FsbC1sYWJ9LgotCi1BIEBzYW1wey5sZWFmcHJvY30gZGVjbGFyYXRpb24gaXMgbWVhbnQgZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotb3B0aW1pemVkIGNhbGwgaW5zdHJ1Y3Rpb24gQHNhbXB7Y2FsbGp9OyB0aGUgZGlyZWN0aXZlIHJlY29yZHMgdGhlIGRhdGEKLW5lZWRlZCBsYXRlciB0byBjaG9vc2UgYmV0d2VlbiBjb252ZXJ0aW5nIHRoZSBAc2FtcHtjYWxsan0gaW50byBhCi1AY29kZXtiYWx9IG9yIGEgQGNvZGV7Y2FsbH0uCi0KLUB2YXJ7Y2FsbC1sYWJ9IGlzIG9wdGlvbmFsOyBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwcmVzZW50LCBvciBpZiB0aGUKLXR3byBhcmd1bWVudHMgYXJlIGlkZW50aWNhbCwgdGhlIHNpbmdsZSBhcmd1bWVudCBpcyBhc3N1bWVkIHRvIGJlIHRoZQotQGNvZGV7YmFsfSBlbnRyeSBwb2ludC4KLQotQGNpbmRleCBAY29kZXtzeXNwcm9jfSBkaXJlY3RpdmUsIGk5NjAKLUBpdGVtIC5zeXNwcm9jIEB2YXJ7bmFtZX0sIEB2YXJ7aW5kZXh9Ci1UaGUgQHNhbXB7LnN5c3Byb2N9IGRpcmVjdGl2ZSBkZWZpbmVzIGEgbmFtZSBmb3IgYSBzeXN0ZW0gcHJvY2VkdXJlLgotQWZ0ZXIgeW91IGRlZmluZSBpdCB1c2luZyBAc2FtcHsuc3lzcHJvY30sIHlvdSBjYW4gdXNlIEB2YXJ7bmFtZX0gdG8KLXJlZmVyIHRvIHRoZSBzeXN0ZW0gcHJvY2VkdXJlIGlkZW50aWZpZWQgYnkgQHZhcntpbmRleH0gd2hlbiBjYWxsaW5nCi1wcm9jZWR1cmVzIHdpdGggdGhlIG9wdGltaXplZCBjYWxsIGluc3RydWN0aW9uIEBzYW1we2NhbGxqfS4KLQotQm90aCBhcmd1bWVudHMgYXJlIHJlcXVpcmVkOyBAdmFye2luZGV4fSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMzEKLShpbmNsdXNpdmUpLgotQGVuZCB0YWJsZQotCi1Abm9kZSBPcGNvZGVzIGZvciBpOTYwCi1Ac2VjdGlvbiBpOTYwIE9wY29kZXMKLQotQGNpbmRleCBvcGNvZGVzLCBpOTYwCi1AY2luZGV4IGk5NjAgb3Bjb2RlcwotQWxsIEludGVsIDk2MCBtYWNoaW5lIGluc3RydWN0aW9ucyBhcmUgc3VwcG9ydGVkOwotQHB4cmVme09wdGlvbnMtaTk2MCwsaTk2MCBDb21tYW5kLWxpbmUgT3B0aW9uc30gZm9yIGEgZGlzY3Vzc2lvbiBvZgotc2VsZWN0aW5nIHRoZSBpbnN0cnVjdGlvbiBzdWJzZXQgZm9yIGEgcGFydGljdWxhciA5NjAKLWFyY2hpdGVjdHVyZS5AcmVmaWxsCi0KLVNvbWUgb3Bjb2RlcyBhcmUgcHJvY2Vzc2VkIGJleW9uZCBzaW1wbHkgZW1pdHRpbmcgYSBzaW5nbGUgY29ycmVzcG9uZGluZwotaW5zdHJ1Y3Rpb246IEBzYW1we2NhbGxqfSwgYW5kIENvbXBhcmUtYW5kLUJyYW5jaCBvciBDb21wYXJlLWFuZC1KdW1wCi1pbnN0cnVjdGlvbnMgd2l0aCB0YXJnZXQgZGlzcGxhY2VtZW50cyBsYXJnZXIgdGhhbiAxMyBiaXRzLgotCi1AbWVudQotKiBjYWxsai1pOTYwOjogICAgICAgICAgICAgICAgICBAY29kZXtjYWxsan0KLSogQ29tcGFyZS1hbmQtYnJhbmNoLWk5NjA6OiAgICAgQ29tcGFyZS1hbmQtQnJhbmNoCi1AZW5kIG1lbnUKLQotQG5vZGUgY2FsbGotaTk2MAotQHN1YnNlY3Rpb24gQGNvZGV7Y2FsbGp9Ci0KLUBjaW5kZXggQGNvZGV7Y2FsbGp9LCBpOTYwIHBzZXVkby1vcGNvZGUKLUBjaW5kZXggaTk2MCBAY29kZXtjYWxsan0gcHNldWRvLW9wY29kZQotWW91IGNhbiB3cml0ZSBAY29kZXtjYWxsan0gdG8gaGF2ZSB0aGUgYXNzZW1ibGVyIG9yIHRoZSBsaW5rZXIgZGV0ZXJtaW5lCi10aGUgbW9zdCBhcHByb3ByaWF0ZSBmb3JtIG9mIHN1YnJvdXRpbmUgY2FsbDogQHNhbXB7Y2FsbH0sCi1Ac2FtcHtiYWx9LCBvciBAc2FtcHtjYWxsc30uICBJZiB0aGUgYXNzZW1ibHkgc291cmNlIGNvbnRhaW5zCi1lbm91Z2ggaW5mb3JtYXRpb24tLS1hIEBzYW1wey5sZWFmcHJvY30gb3IgQHNhbXB7LnN5c3Byb2N9IGRpcmVjdGl2ZQotZGVmaW5pbmcgdGhlIG9wZXJhbmQtLS10aGVuIEBjb2Rle0B2YWx1ZXtBU319IHRyYW5zbGF0ZXMgdGhlCi1AY29kZXtjYWxsan07IGlmIG5vdCwgaXQgc2ltcGx5IGVtaXRzIHRoZSBAY29kZXtjYWxsan0sIGxlYXZpbmcgaXQKLWZvciB0aGUgbGlua2VyIHRvIHJlc29sdmUuCi0KLUBub2RlIENvbXBhcmUtYW5kLWJyYW5jaC1pOTYwCi1Ac3Vic2VjdGlvbiBDb21wYXJlLWFuZC1CcmFuY2gKLQotQGNpbmRleCBpOTYwIGNvbXBhcmUvYnJhbmNoIGluc3RydWN0aW9ucwotQGNpbmRleCBjb21wYXJlL2JyYW5jaCBpbnN0cnVjdGlvbnMsIGk5NjAKLVRoZSA5NjAgYXJjaGl0ZWN0dXJlcyBwcm92aWRlIGNvbWJpbmVkIENvbXBhcmUtYW5kLUJyYW5jaCBpbnN0cnVjdGlvbnMKLXRoYXQgcGVybWl0IHlvdSB0byBzdG9yZSB0aGUgYnJhbmNoIHRhcmdldCBpbiB0aGUgbG93ZXIgMTMgYml0cyBvZiB0aGUKLWluc3RydWN0aW9uIHdvcmQgaXRzZWxmLiAgSG93ZXZlciwgaWYgeW91IHNwZWNpZnkgYSBicmFuY2ggdGFyZ2V0IGZhcgotZW5vdWdoIGF3YXkgdGhhdCBpdHMgYWRkcmVzcyB3b24ndCBmaXQgaW4gMTMgYml0cywgdGhlIGFzc2VtYmxlciBjYW4KLWVpdGhlciBpc3N1ZSBhbiBlcnJvciwgb3IgY29udmVydCB5b3VyIENvbXBhcmUtYW5kLUJyYW5jaCBpbnN0cnVjdGlvbgotaW50byBzZXBhcmF0ZSBpbnN0cnVjdGlvbnMgdG8gZG8gdGhlIGNvbXBhcmUgYW5kIHRoZSBicmFuY2guCi0KLUBjaW5kZXggY29tcGFyZSBhbmQganVtcCBleHBhbnNpb25zLCBpOTYwCi1AY2luZGV4IGk5NjAgY29tcGFyZSBhbmQganVtcCBleHBhbnNpb25zCi1XaGV0aGVyIEBjb2Rle0B2YWx1ZXtBU319IGdpdmVzIGFuIGVycm9yIG9yIGV4cGFuZHMgdGhlIGluc3RydWN0aW9uIGRlcGVuZHMKLW9uIHR3byBjaG9pY2VzIHlvdSBjYW4gbWFrZTogd2hldGhlciB5b3UgdXNlIHRoZSBAc2FtcHstbm8tcmVsYXh9IG9wdGlvbiwKLWFuZCB3aGV0aGVyIHlvdSB1c2UgYSBgYENvbXBhcmUgYW5kIEJyYW5jaCcnIGluc3RydWN0aW9uIG9yIGEgYGBDb21wYXJlCi1hbmQgSnVtcCcnIGluc3RydWN0aW9uLiAgVGhlIGBgSnVtcCcnIGluc3RydWN0aW9ucyBhcmUgQGVtcGh7YWx3YXlzfQotZXhwYW5kZWQgaWYgbmVjZXNzYXJ5OyB0aGUgYGBCcmFuY2gnJyBpbnN0cnVjdGlvbnMgYXJlIGV4cGFuZGVkIHdoZW4KLW5lY2Vzc2FyeSBAZW1waHt1bmxlc3N9IHlvdSBzcGVjaWZ5IEBjb2Rley1uby1yZWxheH0tLS1pbiB3aGljaCBjYXNlCi1AY29kZXtAdmFsdWV7QVN9fSBnaXZlcyBhbiBlcnJvciBpbnN0ZWFkLgotCi1UaGVzZSBhcmUgdGhlIENvbXBhcmUtYW5kLUJyYW5jaCBpbnN0cnVjdGlvbnMsIHRoZWlyIGBgSnVtcCcnIHZhcmlhbnRzLAotYW5kIHRoZSBpbnN0cnVjdGlvbiBwYWlycyB0aGV5IG1heSBleHBhbmQgaW50bzoKLQotQGMgVEVYSTJST0ZGLUtJTEwKLUBpZmluZm8KLUBjIEVORCBURVhJMlJPRkYtS0lMTAotQGV4YW1wbGUKLSAgICAgICAgQ29tcGFyZSBhbmQKLSAgICAgQnJhbmNoICAgICAgSnVtcCAgICAgICBFeHBhbmRlZCB0bwotICAgICAtLS0tLS0gICAgLS0tLS0tICAgICAgIC0tLS0tLS0tLS0tLQotICAgICAgICBiYmMgICAgICAgICAgICAgICAgIGNoa2JpdDsgYm5vCi0gICAgICAgIGJicyAgICAgICAgICAgICAgICAgY2hrYml0OyBibwotICAgICBjbXBpYmUgICAgY21waWplICAgICAgIGNtcGk7IGJlCi0gICAgIGNtcGliZyAgICBjbXBpamcgICAgICAgY21waTsgYmcKLSAgICBjbXBpYmdlICAgY21waWpnZSAgICAgICBjbXBpOyBiZ2UKLSAgICAgY21waWJsICAgIGNtcGlqbCAgICAgICBjbXBpOyBibAotICAgIGNtcGlibGUgICBjbXBpamxlICAgICAgIGNtcGk7IGJsZQotICAgIGNtcGlibm8gICBjbXBpam5vICAgICAgIGNtcGk7IGJubwotICAgIGNtcGlibmUgICBjbXBpam5lICAgICAgIGNtcGk7IGJuZQotICAgICBjbXBpYm8gICAgY21waWpvICAgICAgIGNtcGk7IGJvCi0gICAgIGNtcG9iZSAgICBjbXBvamUgICAgICAgY21wbzsgYmUKLSAgICAgY21wb2JnICAgIGNtcG9qZyAgICAgICBjbXBvOyBiZwotICAgIGNtcG9iZ2UgICBjbXBvamdlICAgICAgIGNtcG87IGJnZQotICAgICBjbXBvYmwgICAgY21wb2psICAgICAgIGNtcG87IGJsCi0gICAgY21wb2JsZSAgIGNtcG9qbGUgICAgICAgY21wbzsgYmxlCi0gICAgY21wb2JuZSAgIGNtcG9qbmUgICAgICAgY21wbzsgYm5lCi1AZW5kIGV4YW1wbGUKLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQHRleAotXGhza2lwXHRhYmxlaW5kZW50Ci1caGFsaWdue1xoZmlsIHtcdHQgI31ccXVhZCZcaGZpbCB7XHR0ICN9XHFxdWFkJntcdHQgI31caGZpbFxjcgotXG9taXR7XGhmaWxcaXQgQ29tcGFyZSBhbmRcaGZpbH1cc3BhblxvbWl0Jlxjcgote1xpdCBCcmFuY2h9JntcaXQgSnVtcH0me1xpdCBFeHBhbmRlZCB0b31cY3IKLSAgICAgICAgYmJjJiAgICAgICAgICAgICAgICAgJiBjaGtiaXQ7IGJub1xjcgotICAgICAgICBiYnMmICAgICAgICAgICAgICAgICAmIGNoa2JpdDsgYm9cY3IKLSAgICAgY21waWJlJiAgICBjbXBpamUmICAgICAgIGNtcGk7IGJlXGNyCi0gICAgIGNtcGliZyYgICAgY21waWpnJiAgICAgICBjbXBpOyBiZ1xjcgotICAgIGNtcGliZ2UmICAgY21waWpnZSYgICAgICAgY21waTsgYmdlXGNyCi0gICAgIGNtcGlibCYgICAgY21waWpsJiAgICAgICBjbXBpOyBibFxjcgotICAgIGNtcGlibGUmICAgY21waWpsZSYgICAgICAgY21waTsgYmxlXGNyCi0gICAgY21waWJubyYgICBjbXBpam5vJiAgICAgICBjbXBpOyBibm9cY3IKLSAgICBjbXBpYm5lJiAgIGNtcGlqbmUmICAgICAgIGNtcGk7IGJuZVxjcgotICAgICBjbXBpYm8mICAgIGNtcGlqbyYgICAgICAgY21waTsgYm9cY3IKLSAgICAgY21wb2JlJiAgICBjbXBvamUmICAgICAgIGNtcG87IGJlXGNyCi0gICAgIGNtcG9iZyYgICAgY21wb2pnJiAgICAgICBjbXBvOyBiZ1xjcgotICAgIGNtcG9iZ2UmICAgY21wb2pnZSYgICAgICAgY21wbzsgYmdlXGNyCi0gICAgIGNtcG9ibCYgICAgY21wb2psJiAgICAgICBjbXBvOyBibFxjcgotICAgIGNtcG9ibGUmICAgY21wb2psZSYgICAgICAgY21wbzsgYmxlXGNyCi0gICAgY21wb2JuZSYgICBjbXBvam5lJiAgICAgICBjbXBvOyBibmVcY3J9Ci1AZW5kIHRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCmRpZmYgLS1naXQgYS9nYXMvZG9jL2MtbTMyci50ZXhpIGIvZ2FzL2RvYy9jLW0zMnIudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMWVkZS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtbTMyci50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIE0zMlItRGVwZW5kZW50Ci1AY2hhcHRlciBNMzJSIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE0zMlIgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQpkaWZmIC0tZ2l0IGEvZ2FzL2RvYy9jLW02OGsudGV4aSBiL2dhcy9kb2MvYy1tNjhrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Zjg1N2YuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW02OGsudGV4aQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi1AYyBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBNNjhLLURlcGVuZGVudAotQGNoYXB0ZXIgTTY4MHgwIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIE02ODB4MCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZjbGVhcgotCi1AY2luZGV4IE02ODB4MCBzdXBwb3J0Ci1AbWVudQotKiBNNjhLLU9wdHM6OiAgICAgICAgICAgICAgICAgICBNNjgweDAgT3B0aW9ucwotKiBNNjhLLVN5bnRheDo6ICAgICAgICAgICAgICAgICBTeW50YXgKLSogTTY4Sy1Nb3RvLVN5bnRheDo6ICAgICAgICAgICAgTW90b3JvbGEgU3ludGF4Ci0qIE02OEstRmxvYXQ6OiAgICAgICAgICAgICAgICAgIEZsb2F0aW5nIFBvaW50Ci0qIE02OEstRGlyZWN0aXZlczo6ICAgICAgICAgICAgIDY4MHgwIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBNNjhLLW9wY29kZXM6OiAgICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgTTY4Sy1PcHRzCi1Ac2VjdGlvbiBNNjgweDAgT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMsIE02ODB4MAotQGNpbmRleCBNNjgweDAgb3B0aW9ucwotVGhlIE1vdG9yb2xhIDY4MHgwIHZlcnNpb24gb2YgQGNvZGV7QHZhbHVle0FTfX0gaGFzIGEgZmV3IG1hY2hpbmUKLWRlcGVuZGVudCBvcHRpb25zLgotCi1AY2luZGV4IEBzYW1wey1sfSBvcHRpb24sIE02ODB4MAotWW91IGNhbiB1c2UgdGhlIEBzYW1wey1sfSBvcHRpb24gdG8gc2hvcnRlbiB0aGUgc2l6ZSBvZiByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZAotc3ltYm9scy4gIElmIHlvdSBkbyBub3QgdXNlIHRoZSBAc2FtcHstbH0gb3B0aW9uLCByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZAotc3ltYm9scyBhcmUgd2lkZSBlbm91Z2ggZm9yIGEgZnVsbCBAY29kZXtsb25nfSAoMzIgYml0cykuICAoU2luY2UKLUBjb2Rle0B2YWx1ZXtBU319IGNhbm5vdCBrbm93IHdoZXJlIHRoZXNlIHN5bWJvbHMgZW5kIHVwLCBAY29kZXtAdmFsdWV7QVN9fSBjYW4KLW9ubHkgYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBsaW5rZXIgdG8gZmlsbCBpbiBsYXRlci4gIFNpbmNlIEBjb2Rle0B2YWx1ZXtBU319Ci1kb2VzIG5vdCBrbm93IGhvdyBmYXIgYXdheSB0aGVzZSBzeW1ib2xzIGFyZSwgaXQgYWxsb2NhdGVzIGFzIG11Y2ggc3BhY2UgYXMgaXQKLWNhbi4pICBJZiB5b3UgdXNlIHRoaXMgb3B0aW9uLCB0aGUgcmVmZXJlbmNlcyBhcmUgb25seSBvbmUgd29yZCB3aWRlICgxNiBiaXRzKS4KLVRoaXMgbWF5IGJlIHVzZWZ1bCBpZiB5b3Ugd2FudCB0aGUgb2JqZWN0IGZpbGUgdG8gYmUgYXMgc21hbGwgYXMgcG9zc2libGUsIGFuZAoteW91IGtub3cgdGhhdCB0aGUgcmVsZXZhbnQgc3ltYm9scyBhcmUgYWx3YXlzIGxlc3MgdGhhbiAxNyBiaXRzIGF3YXkuCi0KLUBjaW5kZXggQHNhbXB7LS1yZWdpc3Rlci1wcmVmaXgtb3B0aW9uYWx9IG9wdGlvbiwgTTY4MHgwCi1Gb3Igc29tZSBjb25maWd1cmF0aW9ucywgZXNwZWNpYWxseSB0aG9zZSB3aGVyZSB0aGUgY29tcGlsZXIgbm9ybWFsbHkKLWRvZXMgbm90IHByZXBlbmQgYW4gdW5kZXJzY29yZSB0byB0aGUgbmFtZXMgb2YgdXNlciB2YXJpYWJsZXMsIHRoZQotYXNzZW1ibGVyIHJlcXVpcmVzIGEgQHNhbXB7JX0gYmVmb3JlIGFueSB1c2Ugb2YgYSByZWdpc3RlciBuYW1lLiAgVGhpcwotaXMgaW50ZW5kZWQgdG8gbGV0IHRoZSBhc3NlbWJsZXIgZGlzdGluZ3Vpc2ggYmV0d2VlbiBDIHZhcmlhYmxlcyBhbmQKLWZ1bmN0aW9ucyBuYW1lZCBAc2FtcHthMH0gdGhyb3VnaCBAc2FtcHthN30sIGFuZCBzbyBvbi4gIFRoZSBAc2FtcHslfSBpcwotYWx3YXlzIGFjY2VwdGVkLCBidXQgaXMgbm90IHJlcXVpcmVkIGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zLCBub3RhYmx5Ci1Ac2FtcHtzdW4zfS4gIFRoZSBAc2FtcHstLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbH0gb3B0aW9uIG1heSBiZSB1c2VkCi10byBwZXJtaXQgb21pdHRpbmcgdGhlIEBzYW1weyV9IGV2ZW4gZm9yIGNvbmZpZ3VyYXRpb25zIGZvciB3aGljaCBpdCBpcwotbm9ybWFsbHkgcmVxdWlyZWQuICBJZiB0aGlzIGlzIGRvbmUsIGl0IHdpbGwgZ2VuZXJhbGx5IGJlIGltcG9zc2libGUgdG8KLXJlZmVyIHRvIEMgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lcyBhcyByZWdpc3RlcgotbmFtZXMuCi0KLUBjaW5kZXggQHNhbXB7LS1iaXR3aXNlLW9yfSBvcHRpb24sIE02ODB4MAotTm9ybWFsbHkgdGhlIGNoYXJhY3RlciBAc2FtcHt8fSBpcyB0cmVhdGVkIGFzIGEgY29tbWVudCBjaGFyYWN0ZXIsIHdoaWNoCi1tZWFucyB0aGF0IGl0IGNhbiBub3QgYmUgdXNlZCBpbiBleHByZXNzaW9ucy4gIFRoZSBAc2FtcHstLWJpdHdpc2Utb3J9Ci1vcHRpb24gdHVybnMgQHNhbXB7fH0gaW50byBhIG5vcm1hbCBjaGFyYWN0ZXIuICBJbiB0aGlzIG1vZGUsIHlvdSBtdXN0Ci1laXRoZXIgdXNlIEMgc3R5bGUgY29tbWVudHMsIG9yIHN0YXJ0IGNvbW1lbnRzIHdpdGggYSBAc2FtcHsjfSBjaGFyYWN0ZXIKLWF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgotCi1AY2luZGV4IEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMTZ9Ci1AY2luZGV4IEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMzJ9Ci1JZiB5b3UgdXNlIGFuIGFkZHJlc3NpbmcgbW9kZSB3aXRoIGEgYmFzZSByZWdpc3RlciB3aXRob3V0IHNwZWNpZnlpbmcKLXRoZSBzaXplLCBAY29kZXtAdmFsdWV7QVN9fSB3aWxsIG5vcm1hbGx5IHVzZSB0aGUgZnVsbCAzMiBiaXQgdmFsdWUuCi1Gb3IgZXhhbXBsZSwgdGhlIGFkZHJlc3NpbmcgbW9kZSBAc2FtcHslYTBAQCglZDApfSBpcyBlcXVpdmFsZW50IHRvCi1Ac2FtcHslYTBAQCglZDA6bCl9LiAgWW91IG1heSB1c2UgdGhlIEBzYW1wey0tYmFzZS1zaXplLWRlZmF1bHQtMTZ9Ci1vcHRpb24gdG8gdGVsbCBAY29kZXtAdmFsdWV7QVN9fSB0byBkZWZhdWx0IHRvIHVzaW5nIHRoZSAxNiBiaXQgdmFsdWUuCi1JbiB0aGlzIGNhc2UsIEBzYW1weyVhMEBAKCVkMCl9IGlzIGVxdWl2YWxlbnQgdG8gQHNhbXB7JWEwQEAoJWQwOncpfS4KLVlvdSBtYXkgdXNlIHRoZSBAc2FtcHstLWJhc2Utc2l6ZS1kZWZhdWx0LTMyfSBvcHRpb24gdG8gcmVzdG9yZSB0aGUKLWRlZmF1bHQgYmVoYXZpb3VyLgotCi1AY2luZGV4IEBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMTZ9Ci1AY2luZGV4IEBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMzJ9Ci1JZiB5b3UgdXNlIGFuIGFkZHJlc3NpbmcgbW9kZSB3aXRoIGEgZGlzcGxhY2VtZW50LCBhbmQgdGhlIHZhbHVlIG9mIHRoZQotZGlzcGxhY2VtZW50IGlzIG5vdCBrbm93biwgQGNvZGV7QHZhbHVle0FTfX0gd2lsbCBub3JtYWxseSBhc3N1bWUgdGhhdAotdGhlIHZhbHVlIGlzIDMyIGJpdHMuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHN5bWJvbCBAc2FtcHtkaXNwfSBoYXMgbm90Ci1iZWVuIGRlZmluZWQsIEBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXNzZW1ibGUgdGhlIGFkZHJlc3NpbmcgbW9kZQotQHNhbXB7JWEwQEAoZGlzcCwlZDApfSBhcyB0aG91Z2ggQHNhbXB7ZGlzcH0gaXMgYSAzMiBiaXQgdmFsdWUuICBZb3UgbWF5Ci11c2UgdGhlIEBzYW1wey0tZGlzcC1zaXplLWRlZmF1bHQtMTZ9IG9wdGlvbiB0byB0ZWxsIEBjb2Rle0B2YWx1ZXtBU319Ci10byBpbnN0ZWFkIGFzc3VtZSB0aGF0IHRoZSBkaXNwbGFjZW1lbnQgaXMgMTYgYml0cy4gIEluIHRoaXMgY2FzZSwKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgYXNzZW1ibGUgQHNhbXB7JWEwQEAoZGlzcCwlZDApfSBhcyB0aG91Z2gKLUBzYW1we2Rpc3B9IGlzIGEgMTYgYml0IHZhbHVlLiAgWW91IG1heSB1c2UgdGhlCi1Ac2FtcHstLWRpc3Atc2l6ZS1kZWZhdWx0LTMyfSBvcHRpb24gdG8gcmVzdG9yZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCi0KLUBjaW5kZXggQHNhbXB7LW02ODAwMH0gYW5kIHJlbGF0ZWQgb3B0aW9ucwotQGNpbmRleCBhcmNoaXRlY3R1cmUgb3B0aW9ucywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBhcmNoaXRlY3R1cmUgb3B0aW9ucwotQGNvZGV7QHZhbHVle0FTfX0gY2FuIGFzc2VtYmxlIGNvZGUgZm9yIHNldmVyYWwgZGlmZmVyZW50IG1lbWJlcnMgb2YgdGhlCi1Nb3Rvcm9sYSA2ODB4MCBmYW1pbHkuICBUaGUgZGVmYXVsdCBkZXBlbmRzIHVwb24gaG93IEBjb2Rle0B2YWx1ZXtBU319Ci13YXMgY29uZmlndXJlZCB3aGVuIGl0IHdhcyBidWlsdDsgbm9ybWFsbHksIHRoZSBkZWZhdWx0IGlzIHRvIGFzc2VtYmxlCi1jb2RlIGZvciB0aGUgNjgwMjAgbWljcm9wcm9jZXNzb3IuICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgbWF5IGJlIHVzZWQgdG8KLWNoYW5nZSB0aGUgZGVmYXVsdC4gIFRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGljaCBpbnN0cnVjdGlvbnMgYW5kCi1hZGRyZXNzaW5nIG1vZGVzIGFyZSBwZXJtaXR0ZWQuICBUaGUgbWVtYmVycyBvZiB0aGUgNjgweDAgZmFtaWx5IGFyZQotdmVyeSBzaW1pbGFyLiAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaWZmZXJlbmNlcywgc2VlIHRoZQotTW90b3JvbGEgbWFudWFscy4KLQotQHRhYmxlIEBzYW1wCi1AaXRlbSAtbTY4MDAwCi1AaXRlbXggLW02OGVjMDAwCi1AaXRlbXggLW02OGhjMDAwCi1AaXRlbXggLW02OGhjMDAxCi1AaXRlbXggLW02ODAwOAotQGl0ZW14IC1tNjgzMDIKLUBpdGVteCAtbTY4MzA2Ci1AaXRlbXggLW02ODMwNwotQGl0ZW14IC1tNjgzMjIKLUBpdGVteCAtbTY4MzU2Ci1Bc3NlbWJsZSBmb3IgdGhlIDY4MDAwLiBAc2FtcHstbTY4MDA4fSwgQHNhbXB7LW02ODMwMn0sIGFuZCBzbyBvbiBhcmUgc3lub255bXMKLWZvciBAc2FtcHstbTY4MDAwfSwgc2luY2UgdGhlIGNoaXBzIGFyZSB0aGUgc2FtZSBmcm9tIHRoZSBwb2ludCBvZiB2aWV3Ci1vZiB0aGUgYXNzZW1ibGVyLgotCi1AaXRlbSAtbTY4MDEwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDEwLgotCi1AaXRlbSAtbTY4MDIwCi1AaXRlbXggLW02OGVjMDIwCi1Bc3NlbWJsZSBmb3IgdGhlIDY4MDIwLiAgVGhpcyBpcyBub3JtYWxseSB0aGUgZGVmYXVsdC4KLQotQGl0ZW0gLW02ODAzMAotQGl0ZW14IC1tNjhlYzAzMAotQXNzZW1ibGUgZm9yIHRoZSA2ODAzMC4KLQotQGl0ZW0gLW02ODA0MAotQGl0ZW14IC1tNjhlYzA0MAotQXNzZW1ibGUgZm9yIHRoZSA2ODA0MC4KLQotQGl0ZW0gLW02ODA2MAotQGl0ZW14IC1tNjhlYzA2MAotQXNzZW1ibGUgZm9yIHRoZSA2ODA2MC4KLQotQGl0ZW0gLW1jcHUzMgotQGl0ZW14IC1tNjgzMzAKLUBpdGVteCAtbTY4MzMxCi1AaXRlbXggLW02ODMzMgotQGl0ZW14IC1tNjgzMzMKLUBpdGVteCAtbTY4MzM0Ci1AaXRlbXggLW02ODMzNgotQGl0ZW14IC1tNjgzNDAKLUBpdGVteCAtbTY4MzQxCi1AaXRlbXggLW02ODM0OQotQGl0ZW14IC1tNjgzNjAKLUFzc2VtYmxlIGZvciB0aGUgQ1BVMzIgZmFtaWx5IG9mIGNoaXBzLgotCi1AaXRlbSAtbTUyMDAKLUFzc2VtYmxlIGZvciB0aGUgQ29sZEZpcmUgZmFtaWx5IG9mIGNoaXBzLgotCi1AaXRlbSAtbTY4ODgxCi1AaXRlbXggLW02ODg4MgotQXNzZW1ibGUgNjg4ODEgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlCi02ODAyMCwgNjgwMzAsIGFuZCB0aGUgQ1BVMzIuICBUaGUgNjgwNDAgYW5kIDY4MDYwIGFsd2F5cyBzdXBwb3J0Ci1mbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuCi0KLUBpdGVtIC1tbm8tNjg4ODEKLURvIG5vdCBhc3NlbWJsZSA2ODg4MSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBkZWZhdWx0Ci1mb3IgNjgwMDAgYW5kIHRoZSA2ODAxMC4gIFRoZSA2ODA0MCBhbmQgNjgwNjAgYWx3YXlzIHN1cHBvcnQgZmxvYXRpbmcKLXBvaW50IGluc3RydWN0aW9ucywgZXZlbiBpZiB0aGlzIG9wdGlvbiBpcyB1c2VkLgotCi1AaXRlbSAtbTY4ODUxCi1Bc3NlbWJsZSA2ODg1MSBNTVUgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlIDY4MDIwLAotNjgwMzAsIGFuZCA2ODA2MC4gIFRoZSA2ODA0MCBhY2NlcHRzIGEgc29tZXdoYXQgZGlmZmVyZW50IHNldCBvZiBNTVUKLWluc3RydWN0aW9uczsgQHNhbXB7LW02ODg1MX0gYW5kIEBzYW1wey1tNjgwNDB9IHNob3VsZCBub3QgYmUgdXNlZAotdG9nZXRoZXIuCi0KLUBpdGVtIC1tbm8tNjg4NTEKLURvIG5vdCBhc3NlbWJsZSA2ODg1MSBNTVUgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgdGhlCi02ODAwMCwgNjgwMTAsIGFuZCB0aGUgQ1BVMzIuICBUaGUgNjgwNDAgYWNjZXB0cyBhIHNvbWV3aGF0IGRpZmZlcmVudCBzZXQKLW9mIE1NVSBpbnN0cnVjdGlvbnMuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLQotQGNpbmRleCBAc2N7bWl0fQotVGhpcyBzeW50YXggZm9yIHRoZSBNb3Rvcm9sYSA2ODB4MCB3YXMgZGV2ZWxvcGVkIGF0IEBzY3ttaXR9LgotCi1AY2luZGV4IE02ODB4MCBzeW50YXgKLUBjaW5kZXggc3ludGF4LCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIHNpemUgbW9kaWZpZXJzCi1AY2luZGV4IHNpemUgbW9kaWZpZXJzLCBNNjgweDAKLVRoZSA2ODB4MCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHVzZXMgaW5zdHJ1Y3Rpb25zIG5hbWVzIGFuZAotc3ludGF4IGNvbXBhdGlibGUgd2l0aCB0aGUgU3VuIGFzc2VtYmxlci4gIEludGVydmVuaW5nIHBlcmlvZHMgYXJlCi1pZ25vcmVkOyBmb3IgZXhhbXBsZSwgQHNhbXB7bW92bH0gaXMgZXF1aXZhbGVudCB0byBAc2FtcHttb3YubH0uCi0KLUluIHRoZSBmb2xsb3dpbmcgdGFibGUgQHZhcnthcGN9IHN0YW5kcyBmb3IgYW55IG9mIHRoZSBhZGRyZXNzIHJlZ2lzdGVycwotKEBzYW1weyVhMH0gdGhyb3VnaCBAc2FtcHslYTd9KSwgdGhlIHByb2dyYW0gY291bnRlciAoQHNhbXB7JXBjfSksIHRoZQotemVyby1hZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyV6cGN9KSwgYSBzdXBwcmVzc2VkCi1hZGRyZXNzIHJlZ2lzdGVyIChAc2FtcHslemEwfSB0aHJvdWdoIEBzYW1weyV6YTd9KSwgb3IgaXQgbWF5IGJlIG9taXR0ZWQKLWVudGlyZWx5LiAgVGhlIHVzZSBvZiBAdmFye3NpemV9IG1lYW5zIG9uZSBvZiBAc2FtcHt3fSBvciBAc2FtcHtsfSwgYW5kCi1pdCBtYXkgYmUgb21pdHRlZCwgYWxvbmcgd2l0aCB0aGUgbGVhZGluZyBjb2xvbiwgdW5sZXNzIGEgc2NhbGUgaXMgYWxzbwotc3BlY2lmaWVkLiAgVGhlIHVzZSBvZiBAdmFye3NjYWxlfSBtZWFucyBvbmUgb2YgQHNhbXB7MX0sIEBzYW1wezJ9LAotQHNhbXB7NH0sIG9yIEBzYW1wezh9LCBhbmQgaXQgbWF5IGFsd2F5cyBiZSBvbWl0dGVkIGFsb25nIHdpdGggdGhlCi1sZWFkaW5nIGNvbG9uLgotCi1AY2luZGV4IE02ODB4MCBhZGRyZXNzaW5nIG1vZGVzCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIE02ODB4MAotVGhlIGZvbGxvd2luZyBhZGRyZXNzaW5nIG1vZGVzIGFyZSB1bmRlcnN0b29kOgotQHRhYmxlIEBkZm4KLUBpdGVtIEltbWVkaWF0ZQotQHNhbXB7I0B2YXJ7bnVtYmVyfX0KLQotQGl0ZW0gRGF0YSBSZWdpc3RlcgotQHNhbXB7JWQwfSB0aHJvdWdoIEBzYW1weyVkN30KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlcgotQHNhbXB7JWEwfSB0aHJvdWdoIEBzYW1weyVhN31AKgotQHNhbXB7JWE3fSBpcyBhbHNvIGtub3duIGFzIEBzYW1weyVzcH0sIGkuZS4gdGhlIFN0YWNrIFBvaW50ZXIuICBAY29kZXslYTZ9Ci1pcyBhbHNvIGtub3duIGFzIEBzYW1weyVmcH0sIHRoZSBGcmFtZSBQb2ludGVyLgotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIEluZGlyZWN0Ci1Ac2FtcHslYTBAQH0gdGhyb3VnaCBAc2FtcHslYTdAQH0KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQb3N0aW5jcmVtZW50Ci1Ac2FtcHslYTBAQCt9IHRocm91Z2ggQHNhbXB7JWE3QEArfQotCi1AaXRlbSBBZGRyZXNzIFJlZ2lzdGVyIFByZWRlY3JlbWVudAotQHNhbXB7JWEwQEAtfSB0aHJvdWdoIEBzYW1weyVhN0BALX0KLQotQGl0ZW0gSW5kaXJlY3QgUGx1cyBPZmZzZXQKLUBzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSl9Ci0KLUBpdGVtIEluZGV4Ci1Ac2FtcHtAdmFye2FwY31AQChAdmFye251bWJlcn0sQHZhcntyZWdpc3Rlcn06QHZhcntzaXplfTpAdmFye3NjYWxlfSl9Ci0KLVRoZSBAdmFye251bWJlcn0gbWF5IGJlIG9taXR0ZWQuCi0KLUBpdGVtIFBvc3RpbmRleAotQHNhbXB7QHZhcnthcGN9QEAoQHZhcntudW1iZXJ9KUBAKEB2YXJ7b251bWJlcn0sQHZhcntyZWdpc3Rlcn06QHZhcntzaXplfTpAdmFye3NjYWxlfSl9Ci0KLVRoZSBAdmFye29udW1iZXJ9IG9yIHRoZSBAdmFye3JlZ2lzdGVyfSwgYnV0IG5vdCBib3RoLCBtYXkgYmUgb21pdHRlZC4KLQotQGl0ZW0gUHJlaW5kZXgKLUBzYW1we0B2YXJ7YXBjfUBAKEB2YXJ7bnVtYmVyfSxAdmFye3JlZ2lzdGVyfTpAdmFye3NpemV9OkB2YXJ7c2NhbGV9KUBAKEB2YXJ7b251bWJlcn0pfQotCi1UaGUgQHZhcntudW1iZXJ9IG1heSBiZSBvbWl0dGVkLiAgT21pdHRpbmcgdGhlIEB2YXJ7cmVnaXN0ZXJ9IHByb2R1Y2VzCi10aGUgUG9zdGluZGV4IGFkZHJlc3NpbmcgbW9kZS4KLQotQGl0ZW0gQWJzb2x1dGUKLUBzYW1we0B2YXJ7c3ltYm9sfX0sIG9yIEBzYW1we0B2YXJ7ZGlnaXRzfX0sIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkKLUBzYW1wezpifSwgQHNhbXB7Ond9LCBvciBAc2FtcHs6bH0uCi1AZW5kIHRhYmxlCi0KLUBub2RlIE02OEstTW90by1TeW50YXgKLUBzZWN0aW9uIE1vdG9yb2xhIFN5bnRheAotCi1AY2luZGV4IE1vdG9yb2xhIHN5bnRheCBmb3IgdGhlIDY4MHgwCi1AY2luZGV4IGFsdGVybmF0ZSBzeW50YXggZm9yIHRoZSA2ODB4MAotCi1UaGUgc3RhbmRhcmQgTW90b3JvbGEgc3ludGF4IGZvciB0aGlzIGNoaXAgZGlmZmVycyBmcm9tIHRoZSBzeW50YXgKLWFscmVhZHkgZGlzY3Vzc2VkIChAcHhyZWZ7TTY4Sy1TeW50YXgsLFN5bnRheH0pLiAgQGNvZGV7QHZhbHVle0FTfX0gY2FuCi1hY2NlcHQgTW90b3JvbGEgc3ludGF4IGZvciBvcGVyYW5kcywgZXZlbiBpZiBAc2N7bWl0fSBzeW50YXggaXMgdXNlZCBmb3IKLW90aGVyIG9wZXJhbmRzIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhlIHR3byBraW5kcyBvZiBzeW50YXggYXJlCi1mdWxseSBjb21wYXRpYmxlLgotCi1JbiB0aGUgZm9sbG93aW5nIHRhYmxlIEB2YXJ7YXBjfSBzdGFuZHMgZm9yIGFueSBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcnMKLShAc2FtcHslYTB9IHRocm91Z2ggQHNhbXB7JWE3fSksIHRoZSBwcm9ncmFtIGNvdW50ZXIgKEBzYW1weyVwY30pLCB0aGUKLXplcm8tYWRkcmVzcyByZWxhdGl2ZSB0byB0aGUgcHJvZ3JhbSBjb3VudGVyIChAc2FtcHslenBjfSksIG9yIGEKLXN1cHByZXNzZWQgYWRkcmVzcyByZWdpc3RlciAoQHNhbXB7JXphMH0gdGhyb3VnaCBAc2FtcHslemE3fSkuICBUaGUgdXNlCi1vZiBAdmFye3NpemV9IG1lYW5zIG9uZSBvZiBAc2FtcHt3fSBvciBAc2FtcHtsfSwgYW5kIGl0IG1heSBhbHdheXMgYmUKLW9taXR0ZWQgYWxvbmcgd2l0aCB0aGUgbGVhZGluZyBkb3QuICBUaGUgdXNlIG9mIEB2YXJ7c2NhbGV9IG1lYW5zIG9uZSBvZgotQHNhbXB7MX0sIEBzYW1wezJ9LCBAc2FtcHs0fSwgb3IgQHNhbXB7OH0sIGFuZCBpdCBtYXkgYWx3YXlzIGJlIG9taXR0ZWQKLWFsb25nIHdpdGggdGhlIGxlYWRpbmcgYXN0ZXJpc2suCi0KLVRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBhZGRyZXNzaW5nIG1vZGVzIGFyZSB1bmRlcnN0b29kOgotCi1AdGFibGUgQGRmbgotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBJbmRpcmVjdAotQHNhbXB7KCVhMCl9IHRocm91Z2ggQHNhbXB7KCVhNyl9QCogCi1Ac2FtcHslYTd9IGlzIGFsc28ga25vd24gYXMgQHNhbXB7JXNwfSwgaS5lLiB0aGUgU3RhY2sgUG9pbnRlci4gIEBjb2RleyVhNn0KLWlzIGFsc28ga25vd24gYXMgQHNhbXB7JWZwfSwgdGhlIEZyYW1lIFBvaW50ZXIuCi0KLUBpdGVtIEFkZHJlc3MgUmVnaXN0ZXIgUG9zdGluY3JlbWVudAotQHNhbXB7KCVhMCkrfSB0aHJvdWdoIEBzYW1weyglYTcpK30KLQotQGl0ZW0gQWRkcmVzcyBSZWdpc3RlciBQcmVkZWNyZW1lbnQKLUBzYW1wey0oJWEwKX0gdGhyb3VnaCBAc2FtcHstKCVhNyl9Ci0KLUBpdGVtIEluZGlyZWN0IFBsdXMgT2Zmc2V0Ci1Ac2FtcHtAdmFye251bWJlcn0oQHZhcnslYTB9KX0gdGhyb3VnaCBAc2FtcHtAdmFye251bWJlcn0oQHZhcnslYTd9KX0sCi1vciBAc2FtcHtAdmFye251bWJlcn0oQHZhcnslcGN9KX0uCi0KLVRoZSBAdmFye251bWJlcn0gbWF5IGFsc28gYXBwZWFyIHdpdGhpbiB0aGUgcGFyZW50aGVzZXMsIGFzIGluCi1Ac2FtcHsoQHZhcntudW1iZXJ9LEB2YXJ7JWEwfSl9LiAgV2hlbiB1c2VkIHdpdGggdGhlIEB2YXJ7cGN9LCB0aGUKLUB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZCAod2l0aCBhbiBhZGRyZXNzIHJlZ2lzdGVyLCBvbWl0dGluZyB0aGUKLUB2YXJ7bnVtYmVyfSBwcm9kdWNlcyBBZGRyZXNzIFJlZ2lzdGVyIEluZGlyZWN0IG1vZGUpLgotCi1AaXRlbSBJbmRleAotQHNhbXB7QHZhcntudW1iZXJ9KEB2YXJ7YXBjfSxAdmFye3JlZ2lzdGVyfS5AdmFye3NpemV9KkB2YXJ7c2NhbGV9KX0KLQotVGhlIEB2YXJ7bnVtYmVyfSBtYXkgYmUgb21pdHRlZCwgb3IgaXQgbWF5IGFwcGVhciB3aXRoaW4gdGhlCi1wYXJlbnRoZXNlcy4gIFRoZSBAdmFye2FwY30gbWF5IGJlIG9taXR0ZWQuICBUaGUgQHZhcntyZWdpc3Rlcn0gYW5kIHRoZQotQHZhcnthcGN9IG1heSBhcHBlYXIgaW4gZWl0aGVyIG9yZGVyLiAgSWYgYm90aCBAdmFye2FwY30gYW5kCi1AdmFye3JlZ2lzdGVyfSBhcmUgYWRkcmVzcyByZWdpc3RlcnMsIGFuZCB0aGUgQHZhcntzaXplfSBhbmQgQHZhcntzY2FsZX0KLWFyZSBvbWl0dGVkLCB0aGVuIHRoZSBmaXJzdCByZWdpc3RlciBpcyB0YWtlbiBhcyB0aGUgYmFzZSByZWdpc3RlciwgYW5kCi10aGUgc2Vjb25kIGFzIHRoZSBpbmRleCByZWdpc3Rlci4KLQotQGl0ZW0gUG9zdGluZGV4Ci1Ac2FtcHsoW0B2YXJ7bnVtYmVyfSxAdmFye2FwY31dLEB2YXJ7cmVnaXN0ZXJ9LkB2YXJ7c2l6ZX0qQHZhcntzY2FsZX0sQHZhcntvbnVtYmVyfSl9Ci0KLVRoZSBAdmFye29udW1iZXJ9LCBvciB0aGUgQHZhcntyZWdpc3Rlcn0sIG9yIGJvdGgsIG1heSBiZSBvbWl0dGVkLgotRWl0aGVyIHRoZSBAdmFye251bWJlcn0gb3IgdGhlIEB2YXJ7YXBjfSBtYXkgYmUgb21pdHRlZCwgYnV0IG5vdCBib3RoLgotCi1AaXRlbSBQcmVpbmRleAotQHNhbXB7KFtAdmFye251bWJlcn0sQHZhcnthcGN9LEB2YXJ7cmVnaXN0ZXJ9LkB2YXJ7c2l6ZX0qQHZhcntzY2FsZX1dLEB2YXJ7b251bWJlcn0pfQotCi1UaGUgQHZhcntudW1iZXJ9LCBvciB0aGUgQHZhcnthcGN9LCBvciB0aGUgQHZhcntyZWdpc3Rlcn0sIG9yIGFueSB0d28gb2YKLXRoZW0sIG1heSBiZSBvbWl0dGVkLiAgVGhlIEB2YXJ7b251bWJlcn0gbWF5IGJlIG9taXR0ZWQuICBUaGUKLUB2YXJ7cmVnaXN0ZXJ9IGFuZCB0aGUgQHZhcnthcGN9IG1heSBhcHBlYXIgaW4gZWl0aGVyIG9yZGVyLiAgSWYgYm90aAotQHZhcnthcGN9IGFuZCBAdmFye3JlZ2lzdGVyfSBhcmUgYWRkcmVzcyByZWdpc3RlcnMsIGFuZCB0aGUgQHZhcntzaXplfQotYW5kIEB2YXJ7c2NhbGV9IGFyZSBvbWl0dGVkLCB0aGVuIHRoZSBmaXJzdCByZWdpc3RlciBpcyB0YWtlbiBhcyB0aGUKLWJhc2UgcmVnaXN0ZXIsIGFuZCB0aGUgc2Vjb25kIGFzIHRoZSBpbmRleCByZWdpc3Rlci4KLUBlbmQgdGFibGUKLQotQG5vZGUgTTY4Sy1GbG9hdAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBmbG9hdGluZyBwb2ludAotUGFja2VkIGRlY2ltYWwgKFApIGZvcm1hdCBmbG9hdGluZyBsaXRlcmFscyBhcmUgbm90IHN1cHBvcnRlZC4KLUZlZWwgZnJlZSB0byBhZGQgdGhlIGNvZGUhCi0KLVRoZSBmbG9hdGluZyBwb2ludCBmb3JtYXRzIGdlbmVyYXRlZCBieSBkaXJlY3RpdmVzIGFyZSB0aGVzZS4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2Zsb2F0fSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmZsb2F0Ci1AY29kZXtTaW5nbGV9IHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0KLUBjaW5kZXggQGNvZGV7ZG91YmxlfSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmRvdWJsZQotQGNvZGV7RG91YmxlfSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2V4dGVuZH0gZGlyZWN0aXZlIE02ODB4MAotQGNpbmRleCBAY29kZXtsZG91YmxlfSBkaXJlY3RpdmUgTTY4MHgwCi1AaXRlbSAuZXh0ZW5kCi1AaXRlbXggLmxkb3VibGUKLUBjb2Rle0V4dGVuZGVkfSBwcmVjaXNpb24gKEBjb2Rle2xvbmcgZG91YmxlfSkgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLURpcmVjdGl2ZXMKLUBzZWN0aW9uIDY4MHgwIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IE02ODB4MCBkaXJlY3RpdmVzCi1AY2luZGV4IGRpcmVjdGl2ZXMsIE02ODB4MAotSW4gb3JkZXIgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBTdW4gYXNzZW1ibGVyIHRoZSA2ODB4MCBhc3NlbWJsZXIKLXVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcy4KLQotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2RhdGExfSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmRhdGExCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZGVudGljYWwgdG8gYSBAY29kZXsuZGF0YSAxfSBkaXJlY3RpdmUuCi0KLUBjaW5kZXggQGNvZGV7ZGF0YTJ9IGRpcmVjdGl2ZSwgTTY4MHgwCi1AaXRlbSAuZGF0YTIKLVRoaXMgZGlyZWN0aXZlIGlzIGlkZW50aWNhbCB0byBhIEBjb2Rley5kYXRhIDJ9IGRpcmVjdGl2ZS4KLQotQGNpbmRleCBAY29kZXtldmVufSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLmV2ZW4KLVRoaXMgZGlyZWN0aXZlIGlzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSBAY29kZXsuYWxpZ259IGRpcmVjdGl2ZTsgaXQKLWFsaWducyB0aGUgb3V0cHV0IHRvIGFuIGV2ZW4gYnl0ZSBib3VuZGFyeS4KLQotQGNpbmRleCBAY29kZXtza2lwfSBkaXJlY3RpdmUsIE02ODB4MAotQGl0ZW0gLnNraXAKLVRoaXMgZGlyZWN0aXZlIGlzIGlkZW50aWNhbCB0byBhIEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLgotQGVuZCB0YWJsZQotCi1AbmVlZCAyMDAwCi1Abm9kZSBNNjhLLW9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBNNjgweDAgb3Bjb2RlcwotQGNpbmRleCBvcGNvZGVzLCBNNjgweDAKLUBjaW5kZXggaW5zdHJ1Y3Rpb24gc2V0LCBNNjgweDAKLUBjIGRvY0BjeWdudXMuY29tOiBJIGRvbid0IHNlZSBhbnkgcG9pbnQgaW4gdGhlIGZvbGxvd2luZwotQGMgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoLiAgQnVncyBhcmUgYnVnczsgaG93IGRvZXMgc2F5aW5nIHRoaXMKLUBjICAgICAgICAgICAgICAgICAgIGhlbHAgYW55b25lPwotQGlnbm9yZQotRGFuZ2VyOiAgU2V2ZXJhbCBidWdzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgb3Bjb2RlIHRhYmxlIChhbmQKLWZpeGVkKS4gIE1vcmUgYnVncyBtYXkgZXhpc3QuICBCZSBjYXJlZnVsIHdoZW4gdXNpbmcgb2JzY3VyZQotaW5zdHJ1Y3Rpb25zLgotQGVuZCBpZ25vcmUKLQotQG1lbnUKLSogTTY4Sy1CcmFuY2g6OiAgICAgICAgICAgICAgICAgQnJhbmNoIEltcHJvdmVtZW50Ci0qIE02OEstQ2hhcnM6OiAgICAgICAgICAgICAgICAgIFNwZWNpYWwgQ2hhcmFjdGVycwotQGVuZCBtZW51Ci0KLUBub2RlIE02OEstQnJhbmNoCi1Ac3Vic2VjdGlvbiBCcmFuY2ggSW1wcm92ZW1lbnQKLQotQGNpbmRleCBwc2V1ZG8tb3Bjb2RlcywgTTY4MHgwCi1AY2luZGV4IE02ODB4MCBwc2V1ZG8tb3Bjb2RlcwotQGNpbmRleCBicmFuY2ggaW1wcm92ZW1lbnQsIE02ODB4MAotQGNpbmRleCBNNjgweDAgYnJhbmNoIGltcHJvdmVtZW50Ci1DZXJ0YWluIHBzZXVkbyBvcGNvZGVzIGFyZSBwZXJtaXR0ZWQgZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi1UaGV5IGV4cGFuZCB0byB0aGUgc2hvcnRlc3QgYnJhbmNoIGluc3RydWN0aW9uIHRoYXQgcmVhY2ggdGhlCi10YXJnZXQuICBHZW5lcmFsbHkgdGhlc2UgbW5lbW9uaWNzIGFyZSBtYWRlIGJ5IHN1YnN0aXR1dGluZyBAc2FtcHtqfSBmb3IKLUBzYW1we2J9IGF0IHRoZSBzdGFydCBvZiBhIE1vdG9yb2xhIG1uZW1vbmljLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIHBzZXVkby1vcGVyYXRpb25zLiAgQSBAY29kZXsqfSBmbGFncwotY2FzZXMgdGhhdCBhcmUgbW9yZSBmdWxseSBkZXNjcmliZWQgYWZ0ZXIgdGhlIHRhYmxlOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgRGlzcGxhY2VtZW50Ci0gICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICB8ICAgICAgICAgICAgICAgIDY4MDIwICAgNjgwMDAvMTAKLVBzZXVkby1PcCB8QllURSAgICBXT1JEICAgIExPTkcgICAgTE9ORyAgICAgIG5vbi1QQyByZWxhdGl2ZQotICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgIGpic3IgfGJzcnMgICAgYnNyICAgICBic3JsICAgIGpzciAgICAgICBqc3IKLSAgICAgIGpyYSB8YnJhcyAgICBicmEgICAgIGJyYWwgICAgam1wICAgICAgIGptcAotKiAgICAgalhYIHxiWFhzICAgIGJYWCAgICAgYlhYbCAgICBiTlhzO2ptcGwgYk5YcztqbXAKLSogICAgZGJYWCB8ZGJYWCAgICBkYlhYICAgICAgICBkYlhYOyBicmE7IGptcGwKLSogICAgZmpYWCB8ZmJYWHcgICBmYlhYdyAgIGZiWFhsICAgICAgICAgICAgIGZiTlh3O2ptcAotCi1YWDogY29uZGl0aW9uCi1OWDogbmVnYXRpdmUgb2YgY29uZGl0aW9uIFhYCi0KLUBlbmQgc21hbGxleGFtcGxlCi1AY2VudGVyIEBjb2Rleyp9LS0tc2VlIGZ1bGwgZGVzY3JpcHRpb24gYmVsb3cKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBqYnNyCi1AaXRlbXgganJhCi1UaGVzZSBhcmUgdGhlIHNpbXBsZXN0IGp1bXAgcHNldWRvLW9wZXJhdGlvbnM7IHRoZXkgYWx3YXlzIG1hcCB0byBvbmUKLXBhcnRpY3VsYXIgbWFjaGluZSBpbnN0cnVjdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBkaXNwbGFjZW1lbnQgdG8gdGhlCi1icmFuY2ggdGFyZ2V0LgotCi1AaXRlbSBqQHZhcntYWH0KLUhlcmUsIEBzYW1we2pAdmFye1hYfX0gc3RhbmRzIGZvciBhbiBlbnRpcmUgZmFtaWx5IG9mIHBzZXVkby1vcGVyYXRpb25zLAotd2hlcmUgQHZhcntYWH0gaXMgYSBjb25kaXRpb25hbCBicmFuY2ggb3IgY29uZGl0aW9uLWNvZGUgdGVzdC4gIFRoZSBmdWxsCi1saXN0IG9mIHBzZXVkby1vcHMgaW4gdGhpcyBmYW1pbHkgaXM6Ci1Ac21hbGxleGFtcGxlCi0gamhpICAgamxzICAgamNjICAgamNzICAgam5lICAgamVxICAganZjCi0ganZzICAganBsICAgam1pICAgamdlICAgamx0ICAgamd0ICAgamxlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Gb3IgdGhlIGNhc2VzIG9mIG5vbi1QQyByZWxhdGl2ZSBkaXNwbGFjZW1lbnRzIGFuZCBsb25nIGRpc3BsYWNlbWVudHMgb24KLXRoZSA2ODAwMCBvciA2ODAxMCwgQGNvZGV7QHZhbHVle0FTfX0gaXNzdWVzIGEgbG9uZ2VyIGNvZGUgZnJhZ21lbnQgaW4gdGVybXMgb2YKLUB2YXJ7Tlh9LCB0aGUgb3Bwb3NpdGUgY29uZGl0aW9uIHRvIEB2YXJ7WFh9LiAgRm9yIGV4YW1wbGUsIGZvciB0aGUKLW5vbi1QQyByZWxhdGl2ZSBjYXNlOgotQHNtYWxsZXhhbXBsZQotICAgIGpAdmFye1hYfSBmb28KLUBlbmQgc21hbGxleGFtcGxlCi1naXZlcwotQHNtYWxsZXhhbXBsZQotICAgICBiQHZhcntOWH1zIG9vZgotICAgICBqbXAgZm9vCi0gb29mOgotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gZGJAdmFye1hYfQotVGhlIGZ1bGwgZmFtaWx5IG9mIHBzZXVkby1vcGVyYXRpb25zIGNvdmVyZWQgaGVyZSBpcwotQHNtYWxsZXhhbXBsZQotIGRiaGkgICBkYmxzICAgZGJjYyAgIGRiY3MgICBkYm5lICAgZGJlcSAgIGRidmMKLSBkYnZzICAgZGJwbCAgIGRibWkgICBkYmdlICAgZGJsdCAgIGRiZ3QgICBkYmxlCi0gZGJmICAgIGRicmEgICBkYnQKLUBlbmQgc21hbGxleGFtcGxlCi0KLU90aGVyIHRoYW4gZm9yIHdvcmQgYW5kIGJ5dGUgZGlzcGxhY2VtZW50cywgd2hlbiB0aGUgc291cmNlIHJlYWRzCi1Ac2FtcHtkYkB2YXJ7WFh9IGZvb30sIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzCi1Ac21hbGxleGFtcGxlCi0gICAgIGRiQHZhcntYWH0gb28xCi0gICAgIGJyYSBvbzIKLSBvbzE6am1wbCBmb28KLSBvbzI6Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBmakB2YXJ7WFh9Ci1UaGlzIGZhbWlseSBpbmNsdWRlcwotQHNtYWxsZXhhbXBsZQotIGZqbmUgICBmamVxICAgZmpnZSAgIGZqbHQgICBmamd0ICAgZmpsZSAgIGZqZgotIGZqdCAgICBmamdsICAgZmpnbGUgIGZqbmdlICBmam5nbCAgZmpuZ2xlIGZqbmd0Ci0gZmpubGUgIGZqbmx0ICBmam9nZSAgZmpvZ2wgIGZqb2d0ICBmam9sZSAgZmpvbHQKLSBmam9yICAgZmpzZXEgIGZqc2YgICBmanNuZSAgZmpzdCAgIGZqdWVxICBmanVnZQotIGZqdWd0ICBmanVsZSAgZmp1bHQgIGZqdW4KLUBlbmQgc21hbGxleGFtcGxlCi0KLUZvciBicmFuY2ggdGFyZ2V0cyB0aGF0IGFyZSBub3QgUEMgcmVsYXRpdmUsIEBjb2Rle0B2YWx1ZXtBU319IGVtaXRzCi1Ac21hbGxleGFtcGxlCi0gICAgIGZiQHZhcntOWH0gb29mCi0gICAgIGptcCBmb28KLSBvb2Y6Ci1AZW5kIHNtYWxsZXhhbXBsZQotd2hlbiBpdCBlbmNvdW50ZXJzIEBzYW1we2ZqQHZhcntYWH0gZm9vfS4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBNNjhLLUNoYXJzCi1Ac3Vic2VjdGlvbiBTcGVjaWFsIENoYXJhY3RlcnMKLQotQGNpbmRleCBzcGVjaWFsIGNoYXJhY3RlcnMsIE02ODB4MAotQGNpbmRleCBNNjgweDAgaW1tZWRpYXRlIGNoYXJhY3RlcgotQGNpbmRleCBpbW1lZGlhdGUgY2hhcmFjdGVyLCBNNjgweDAKLUBjaW5kZXggTTY4MHgwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgTTY4MHgwCi1AY2luZGV4IGNvbW1lbnRzLCBNNjgweDAKLVRoZSBpbW1lZGlhdGUgY2hhcmFjdGVyIGlzIEBzYW1weyN9IGZvciBTdW4gY29tcGF0aWJpbGl0eS4gIFRoZQotbGluZS1jb21tZW50IGNoYXJhY3RlciBpcyBAc2FtcHt8fSAodW5sZXNzIHRoZSBAc2FtcHstLWJpdHdpc2Utb3J9Ci1vcHRpb24gaXMgdXNlZCkuICBJZiBhIEBzYW1weyN9IGFwcGVhcnMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUsIGl0Ci1pcyB0cmVhdGVkIGFzIGEgY29tbWVudCB1bmxlc3MgaXQgbG9va3MgbGlrZSBAc2FtcHsjIGxpbmUgZmlsZX0sIGluCi13aGljaCBjYXNlIGl0IGlzIHRyZWF0ZWQgbm9ybWFsbHkuCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1taXBzLnRleGkgYi9nYXMvZG9jL2MtbWlwcy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjNkZGEzLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy1taXBzLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQGlmc2V0IEdFTkVSSUMKLUBwYWdlCi1Abm9kZSBNSVBTLURlcGVuZGVudAotQGNoYXB0ZXIgTUlQUyBEZXBlbmRlbnQgRmVhdHVyZXMKLUBlbmQgaWZzZXQKLUBpZmNsZWFyIEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW5jaWVzCi1AY2hhcHRlciBNSVBTIERlcGVuZGVudCBGZWF0dXJlcwotQGVuZCBpZmNsZWFyCi0KLUBjaW5kZXggTUlQUyBwcm9jZXNzb3IKLUBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319IGZvciBAc2N7bWlwc30gYXJjaGl0ZWN0dXJlcyBzdXBwb3J0cyBzZXZlcmFsCi1kaWZmZXJlbnQgQHNje21pcHN9IHByb2Nlc3NvcnMsIGFuZCBNSVBTIElTQSBsZXZlbHMgSSB0aHJvdWdoIElWLiAgRm9yCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgQHNje21pcHN9IGluc3RydWN0aW9uIHNldCwgc2VlIEBjaXRle01JUFMgUklTQwotQXJjaGl0ZWN0dXJlfSwgYnkgS2FuZSBhbmQgSGVpbmRyaWNoIChQcmVudGljZS1IYWxsKS4gIEZvciBhbiBvdmVydmlldwotb2YgQHNje21pcHN9IGFzc2VtYmx5IGNvbnZlbnRpb25zLCBzZWUgYGBBcHBlbmRpeCBEOiBBc3NlbWJseSBMYW5ndWFnZQotUHJvZ3JhbW1pbmcnJyBpbiB0aGUgc2FtZSB3b3JrLgotCi1AbWVudQotKiBNSVBTIE9wdHM6OiAgIAlBc3NlbWJsZXIgb3B0aW9ucwotKiBNSVBTIE9iamVjdDo6IAlFQ09GRiBvYmplY3QgY29kZQotKiBNSVBTIFN0YWJzOjogIAlEaXJlY3RpdmVzIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLSogTUlQUyBJU0E6OiAgICAJRGlyZWN0aXZlcyB0byBvdmVycmlkZSB0aGUgSVNBIGxldmVsCi0qIE1JUFMgYXV0b2V4dGVuZDo6CURpcmVjdGl2ZXMgZm9yIGV4dGVuZGluZyBNSVBTIDE2IGJpdCBpbnN0cnVjdGlvbnMKLSogTUlQUyBpbnNuOjoJCURpcmVjdGl2ZSB0byBtYXJrIGRhdGEgYXMgYW4gaW5zdHJ1Y3Rpb24KLSogTUlQUyBvcHRpb24gc3RhY2s6OglEaXJlY3RpdmVzIHRvIHNhdmUgYW5kIHJlc3RvcmUgb3B0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIE1JUFMgT3B0cwotQHNlY3Rpb24gQXNzZW1ibGVyIG9wdGlvbnMKLQotVGhlIEBzY3ttaXBzfSBjb25maWd1cmF0aW9ucyBvZiBAc2N7Z251fSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0IHRoZXNlCi1zcGVjaWFsIG9wdGlvbnM6Ci0KLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXstR30gb3B0aW9uIChNSVBTKQotQGl0ZW0gLUcgQHZhcntudW19Ci1UaGlzIG9wdGlvbiBzZXRzIHRoZSBsYXJnZXN0IHNpemUgb2YgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQKLWltcGxpY2l0bHkgd2l0aCB0aGUgQGNvZGV7Z3B9IHJlZ2lzdGVyLiAgSXQgaXMgb25seSBhY2NlcHRlZCBmb3IgdGFyZ2V0cwotdGhhdCB1c2UgQHNje2Vjb2ZmfSBmb3JtYXQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LgotCi1AY2luZGV4IEBjb2Rley1FQn0gb3B0aW9uIChNSVBTKQotQGNpbmRleCBAY29kZXstRUx9IG9wdGlvbiAoTUlQUykKLUBjaW5kZXggTUlQUyBiaWctZW5kaWFuIG91dHB1dAotQGNpbmRleCBNSVBTIGxpdHRsZS1lbmRpYW4gb3V0cHV0Ci1AY2luZGV4IGJpZy1lbmRpYW4gb3V0cHV0LCBNSVBTCi1AY2luZGV4IGxpdHRsZS1lbmRpYW4gb3V0cHV0LCBNSVBTCi1AaXRlbSAtRUIKLUBpdGVteCAtRUwKLUFueSBAc2N7bWlwc30gY29uZmlndXJhdGlvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBjYW4gc2VsZWN0IGJpZy1lbmRpYW4gb3IKLWxpdHRsZS1lbmRpYW4gb3V0cHV0IGF0IHJ1biB0aW1lICh1bmxpa2UgdGhlIG90aGVyIEBzY3tnbnV9IGRldmVsb3BtZW50Ci10b29scywgd2hpY2ggbXVzdCBiZSBjb25maWd1cmVkIGZvciBvbmUgb3IgdGhlIG90aGVyKS4gIFVzZSBAc2FtcHstRUJ9Ci10byBzZWxlY3QgYmlnLWVuZGlhbiBvdXRwdXQsIGFuZCBAc2FtcHstRUx9IGZvciBsaXR0bGUtZW5kaWFuLgotCi1AY2luZGV4IE1JUFMgYXJjaGl0ZWN0dXJlIG9wdGlvbnMKLUBpdGVtIC1taXBzMQotQGl0ZW14IC1taXBzMgotQGl0ZW14IC1taXBzMwotQGl0ZW14IC1taXBzNAotR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbC4KLUBzYW1wey1taXBzMX0gY29ycmVzcG9uZHMgdG8gdGhlIEBzY3tyMjAwMH0gYW5kIEBzY3tyMzAwMH0gcHJvY2Vzc29ycywKLUBzYW1wey1taXBzMn0gdG8gdGhlIEBzY3tyNjAwMH0gcHJvY2Vzc29yLCBAc2FtcHstbWlwczN9IHRvIHRoZQotQHNje3I0MDAwfSBwcm9jZXNzb3IsIGFuZCBAc2FtcHstbWlwczR9IHRvIHRoZSBAc2N7cjgwMDB9IGFuZAotQHNje3IxMDAwMH0gcHJvY2Vzc29ycy4gIFlvdSBjYW4gYWxzbyBzd2l0Y2ggaW5zdHJ1Y3Rpb24gc2V0cyBkdXJpbmcgdGhlCi1hc3NlbWJseTsgc2VlIEByZWZ7TUlQUyBJU0EsLCBEaXJlY3RpdmVzIHRvIG92ZXJyaWRlIHRoZSBJU0EgbGV2ZWx9LgotCi1AaXRlbSAtbWlwczE2Ci1AaXRlbXggLW5vLW1pcHMxNgotR2VuZXJhdGUgY29kZSBmb3IgdGhlIE1JUFMgMTYgcHJvY2Vzc29yLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHB1dHRpbmcKLUBzYW1wey5zZXQgbWlwczE2fSBhdCB0aGUgc3RhcnQgb2YgdGhlIGFzc2VtYmx5IGZpbGUuICBAc2FtcHstbm8tbWlwczE2fQotdHVybnMgb2ZmIHRoaXMgb3B0aW9uLgotCi1AaXRlbSAtbTQwMTAKLUBpdGVteCAtbm8tbTQwMTAKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBMU0kgQHNje3I0MDEwfSBjaGlwLiAgVGhpcyB0ZWxscyB0aGUgYXNzZW1ibGVyIHRvCi1hY2NlcHQgdGhlIEBzY3tyNDAxMH0gc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIChAc2FtcHthZGRjaXV9LCBAc2FtcHtmZmN9LAotZXRjLiksIGFuZCB0byBub3Qgc2NoZWR1bGUgQHNhbXB7bm9wfSBpbnN0cnVjdGlvbnMgYXJvdW5kIGFjY2Vzc2VzIHRvCi10aGUgQHNhbXB7SEl9IGFuZCBAc2FtcHtMT30gcmVnaXN0ZXJzLiAgQHNhbXB7LW5vLW00MDEwfSB0dXJucyBvZmYgdGhpcwotb3B0aW9uLgotCi1AaXRlbSAtbTQ2NTAKLUBpdGVteCAtbm8tbTQ2NTAKLUdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTIEBzY3tyNDY1MH0gY2hpcC4gIFRoaXMgdGVsbHMgdGhlIGFzc2VtYmxlciB0byBhY2NlcHQKLXRoZSBAc2FtcHttYWR9IGFuZCBAc2FtcHttYWR1fSBpbnN0cnVjdGlvbiwgYW5kIHRvIG5vdCBzY2hlZHVsZSBAc2FtcHtub3B9Ci1pbnN0cnVjdGlvbnMgYXJvdW5kIGFjY2Vzc2VzIHRvIHRoZSBAc2FtcHtISX0gYW5kIEBzYW1we0xPfSByZWdpc3RlcnMuCi1Ac2FtcHstbm8tbTQ2NTB9IHR1cm5zIG9mZiB0aGlzIG9wdGlvbi4KLQotQGl0ZW14IC1tMzkwMAotQGl0ZW14IC1uby1tMzkwMAotQGl0ZW14IC1tNDEwMAotQGl0ZW14IC1uby1tNDEwMAotRm9yIGVhY2ggb3B0aW9uIEBzYW1wey1tQHZhcntubm5ufX0sIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBNSVBTCi1Ac2N7ckB2YXJ7bm5ubn19IGNoaXAuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IGluc3RydWN0aW9ucwotc3BlY2lmaWMgdG8gdGhhdCBjaGlwLCBhbmQgdG8gc2NoZWR1bGUgZm9yIHRoYXQgY2hpcCdzIGhhemFyZHMuCi0KLUBpdGVtIC1tY3B1PUB2YXJ7Y3B1fQotR2VuZXJhdGUgY29kZSBmb3IgYSBwYXJ0aWN1bGFyIE1JUFMgY3B1LiAgSXQgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvCi1Ac2FtcHstbUB2YXJ7Y3B1fX0sIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBtb3JlIHZhbHVlIG9mIEB2YXJ7Y3B1fQotdW5kZXJzdG9vZC4gIFZhbGlkIEB2YXJ7Y3B1fSB2YWx1ZSBhcmU6Ci0KLUBxdW90YXRpb24KLTIwMDAsCi0zMDAwLAotMzkwMCwKLTQwMDAsCi00MDEwLAotNDEwMCwKLTQxMTEsCi00MzAwLAotNDQwMCwKLTQ2MDAsCi00NjUwLAotNTAwMCwKLTYwMDAsCi04MDAwLAotMTAwMDAKLUBlbmQgcXVvdGF0aW9uCi0KLQotQGNpbmRleCBAY29kZXstbm9jcHB9IGlnbm9yZWQgKE1JUFMpCi1AaXRlbSAtbm9jcHAKLVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuICBJdCBpcyBhY2NlcHRlZCBmb3IgY29tbWFuZC1saW5lIGNvbXBhdGliaWxpdHkgd2l0aAotb3RoZXIgYXNzZW1ibGVycywgd2hpY2ggdXNlIGl0IHRvIHR1cm4gb2ZmIEMgc3R5bGUgcHJlcHJvY2Vzc2luZy4gIFdpdGgKLUBzY3tnbnV9IEBjb2Rle0B2YWx1ZXtBU319LCB0aGVyZSBpcyBubyBuZWVkIGZvciBAc2FtcHstbm9jcHB9LCBiZWNhdXNlIHRoZQotQHNje2dudX0gYXNzZW1ibGVyIGl0c2VsZiBuZXZlciBydW5zIHRoZSBDIHByZXByb2Nlc3Nvci4KLQotQGl0ZW0gLS10cmFwCi1AaXRlbXggLS1uby1icmVhawotQGMgRklYTUUhICAoMSkgcmVmbGVjdCB0aGVzZSBvcHRpb25zIChuZXh0IGl0ZW0gdG9vKSBpbiBvcHRpb24gc3VtbWFyaWVzOwotQGMgICAgICAgICAoMikgc3RvcCB0ZWFzaW5nLCBzYXkgX3doaWNoXyBpbnN0cnVjdGlvbnMgZXhwYW5kZWQgX2hvd18uCi1AY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5IG1hY3JvIGV4cGFuZHMgY2VydGFpbiBkaXZpc2lvbiBhbmQKLW11bHRpcGxpY2F0aW9uIGluc3RydWN0aW9ucyB0byBjaGVjayBmb3Igb3ZlcmZsb3cgYW5kIGRpdmlzaW9uIGJ5IHplcm8uICBUaGlzCi1vcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIGdlbmVyYXRlIGNvZGUgdG8gdGFrZSBhIHRyYXAgZXhjZXB0aW9uCi1yYXRoZXIgdGhhbiBhIGJyZWFrIGV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIGlzIGRldGVjdGVkLiAgVGhlIHRyYXAgaW5zdHJ1Y3Rpb25zCi1hcmUgb25seSBzdXBwb3J0ZWQgYXQgSW5zdHJ1Y3Rpb24gU2V0IEFyY2hpdGVjdHVyZSBsZXZlbCAyIGFuZCBoaWdoZXIuCi0KLUBpdGVtIC0tYnJlYWsKLUBpdGVteCAtLW5vLXRyYXAKLUdlbmVyYXRlIGNvZGUgdG8gdGFrZSBhIGJyZWFrIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiBhIHRyYXAgZXhjZXB0aW9uIHdoZW4gYW4KLWVycm9yIGlzIGRldGVjdGVkLiAgVGhpcyBpcyB0aGUgZGVmYXVsdC4KLUBlbmQgdGFibGUKLQotQG5vZGUgTUlQUyBPYmplY3QKLUBzZWN0aW9uIE1JUFMgRUNPRkYgb2JqZWN0IGNvZGUKLQotQGNpbmRleCBFQ09GRiBzZWN0aW9ucwotQGNpbmRleCBNSVBTIEVDT0ZGIHNlY3Rpb25zCi1Bc3NlbWJsaW5nIGZvciBhIEBzY3ttaXBzfSBAc2N7ZWNvZmZ9IHRhcmdldCBzdXBwb3J0cyBzb21lIGFkZGl0aW9uYWwgc2VjdGlvbnMKLWJlc2lkZXMgdGhlIHVzdWFsIEBjb2Rley50ZXh0fSwgQGNvZGV7LmRhdGF9IGFuZCBAY29kZXsuYnNzfS4gIFRoZQotYWRkaXRpb25hbCBzZWN0aW9ucyBhcmUgQGNvZGV7LnJkYXRhfSwgdXNlZCBmb3IgcmVhZC1vbmx5IGRhdGEsCi1AY29kZXsuc2RhdGF9LCB1c2VkIGZvciBzbWFsbCBkYXRhLCBhbmQgQGNvZGV7LnNic3N9LCB1c2VkIGZvciBzbWFsbAotY29tbW9uIG9iamVjdHMuCi0KLUBjaW5kZXggc21hbGwgb2JqZWN0cywgTUlQUyBFQ09GRgotQGNpbmRleCBAY29kZXtncH0gcmVnaXN0ZXIsIE1JUFMKLVdoZW4gYXNzZW1ibGluZyBmb3IgQHNje2Vjb2ZmfSwgdGhlIGFzc2VtYmxlciB1c2VzIHRoZSBAY29kZXskZ3B9IChAY29kZXskMjh9KQotcmVnaXN0ZXIgdG8gZm9ybSB0aGUgYWRkcmVzcyBvZiBhIGBgc21hbGwgb2JqZWN0JycuICBBbnkgb2JqZWN0IGluIHRoZQotQGNvZGV7LnNkYXRhfSBvciBAY29kZXsuc2Jzc30gc2VjdGlvbnMgaXMgY29uc2lkZXJlZCBgYHNtYWxsJycgaW4gdGhpcyBzZW5zZS4KLUZvciBleHRlcm5hbCBvYmplY3RzLCBvciBmb3Igb2JqZWN0cyBpbiB0aGUgQGNvZGV7LmJzc30gc2VjdGlvbiwgeW91IGNhbiB1c2UKLXRoZSBAY29kZXtAdmFsdWV7R0NDfX0gQHNhbXB7LUd9IG9wdGlvbiB0byBjb250cm9sIHRoZSBzaXplIG9mIG9iamVjdHMgYWRkcmVzc2VkIHZpYQotQGNvZGV7JGdwfTsgdGhlIGRlZmF1bHQgdmFsdWUgaXMgOCwgbWVhbmluZyB0aGF0IGEgcmVmZXJlbmNlIHRvIGFueSBvYmplY3QKLWVpZ2h0IGJ5dGVzIG9yIHNtYWxsZXIgdXNlcyBAY29kZXskZ3B9LiAgUGFzc2luZyBAc2FtcHstRyAwfSB0bwotQGNvZGV7QHZhbHVle0FTfX0gcHJldmVudHMgaXQgZnJvbSB1c2luZyB0aGUgQGNvZGV7JGdwfSByZWdpc3RlciBvbiB0aGUgYmFzaXMKLW9mIG9iamVjdCBzaXplIChidXQgdGhlIGFzc2VtYmxlciB1c2VzIEBjb2RleyRncH0gZm9yIG9iamVjdHMgaW4gQGNvZGV7LnNkYXRhfQotb3IgQGNvZGV7c2Jzc30gaW4gYW55IGNhc2UpLiAgVGhlIHNpemUgb2YgYW4gb2JqZWN0IGluIHRoZSBAY29kZXsuYnNzfSBzZWN0aW9uCi1pcyBzZXQgYnkgdGhlIEBjb2Rley5jb21tfSBvciBAY29kZXsubGNvbW19IGRpcmVjdGl2ZSB0aGF0IGRlZmluZXMgaXQuICBUaGUKLXNpemUgb2YgYW4gZXh0ZXJuYWwgb2JqZWN0IG1heSBiZSBzZXQgd2l0aCB0aGUgQGNvZGV7LmV4dGVybn0gZGlyZWN0aXZlLiAgRm9yCi1leGFtcGxlLCBAc2FtcHsuZXh0ZXJuIHN5bSw0fSBkZWNsYXJlcyB0aGF0IHRoZSBvYmplY3QgYXQgQGNvZGV7c3ltfSBpcyA0IGJ5dGVzCi1pbiBsZW5ndGgsIHdoaWUgbGVhdmluZyBAY29kZXtzeW19IG90aGVyd2lzZSB1bmRlZmluZWQuCi0KLVVzaW5nIHNtYWxsIEBzY3tlY29mZn0gb2JqZWN0cyByZXF1aXJlcyBsaW5rZXIgc3VwcG9ydCwgYW5kIGFzc3VtZXMgdGhhdCB0aGUKLUBjb2RleyRncH0gcmVnaXN0ZXIgaXMgY29ycmVjdGx5IGluaXRpYWxpemVkIChub3JtYWxseSBkb25lIGF1dG9tYXRpY2FsbHkgYnkKLXRoZSBzdGFydHVwIGNvZGUpLiAgQHNje21pcHN9IEBzY3tlY29mZn0gYXNzZW1ibHkgY29kZSBtdXN0IG5vdCBtb2RpZnkgdGhlCi1AY29kZXskZ3B9IHJlZ2lzdGVyLgotCi1Abm9kZSBNSVBTIFN0YWJzCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIGZvciBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KLQotQGNpbmRleCBNSVBTIGRlYnVnZ2luZyBkaXJlY3RpdmVzCi1Ac2N7bWlwc30gQHNje2Vjb2ZmfSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBzZXZlcmFsIGRpcmVjdGl2ZXMgdXNlZCBmb3IKLWdlbmVyYXRpbmcgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWNoIGFyZSBub3Qgc3VwcG9ydCBieSB0cmFkaXRpb25hbCBAc2N7bWlwc30KLWFzc2VtYmxlcnMuICBUaGVzZSBhcmUgQGNvZGV7LmRlZn0sIEBjb2Rley5lbmRlZn0sIEBjb2Rley5kaW19LCBAY29kZXsuZmlsZX0sCi1AY29kZXsuc2NsfSwgQGNvZGV7LnNpemV9LCBAY29kZXsudGFnfSwgQGNvZGV7LnR5cGV9LCBAY29kZXsudmFsfSwKLUBjb2Rley5zdGFiZH0sIEBjb2Rley5zdGFibn0sIGFuZCBAY29kZXsuc3RhYnN9LiAgVGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotZ2VuZXJhdGVkIGJ5IHRoZSB0aHJlZSBAY29kZXsuc3RhYn0gZGlyZWN0aXZlcyBjYW4gb25seSBiZSByZWFkIGJ5IEBzY3tnZGJ9LAotbm90IGJ5IHRyYWRpdGlvbmFsIEBzY3ttaXBzfSBkZWJ1Z2dlcnMgKHRoaXMgZW5oYW5jZW1lbnQgaXMgcmVxdWlyZWQgdG8gZnVsbHkKLXN1cHBvcnQgQysrIGRlYnVnZ2luZykuICBUaGVzZSBkaXJlY3RpdmVzIGFyZSBwcmltYXJpbHkgdXNlZCBieSBjb21waWxlcnMsIG5vdAotYXNzZW1ibHkgbGFuZ3VhZ2UgcHJvZ3JhbW1lcnMhCi0KLUBub2RlIE1JUFMgSVNBCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIHRvIG92ZXJyaWRlIHRoZSBJU0EgbGV2ZWwKLQotQGNpbmRleCBNSVBTIElTQSBvdmVycmlkZQotQGtpbmRleCBAY29kZXsuc2V0IG1pcHNAdmFye259fQotQHNje2dudX0gQGNvZGV7QHZhbHVle0FTfX0gc3VwcG9ydHMgYW4gYWRkaXRpb25hbCBkaXJlY3RpdmUgdG8gY2hhbmdlCi10aGUgQHNje21pcHN9IEluc3RydWN0aW9uIFNldCBBcmNoaXRlY3R1cmUgbGV2ZWwgb24gdGhlIGZseTogQGNvZGV7LnNldAotbWlwc0B2YXJ7bn19LiAgQHZhcntufSBzaG91bGQgYmUgYSBudW1iZXIgZnJvbSAwIHRvIDQuICBBIHZhbHVlIGZyb20gMQotdG8gNCBtYWtlcyB0aGUgYXNzZW1ibGVyIGFjY2VwdCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nCi1Ac2N7aXNhfSBsZXZlbCwgZnJvbSB0aGF0IHBvaW50IG9uIGluIHRoZSBhc3NlbWJseS4gIEBjb2Rley5zZXQKLW1pcHNAdmFye259fSBhZmZlY3RzIG5vdCBvbmx5IHdoaWNoIGluc3RydWN0aW9ucyBhcmUgcGVybWl0dGVkLCBidXQgYWxzbwotaG93IGNlcnRhaW4gbWFjcm9zIGFyZSBleHBhbmRlZC4gIEBjb2Rley5zZXQgbWlwczB9IHJlc3RvcmVzIHRoZQotQHNje2lzYX0gbGV2ZWwgdG8gaXRzIG9yaWdpbmFsIGxldmVsOiBlaXRoZXIgdGhlIGxldmVsIHlvdSBzZWxlY3RlZCB3aXRoCi1jb21tYW5kIGxpbmUgb3B0aW9ucywgb3IgdGhlIGRlZmF1bHQgZm9yIHlvdXIgY29uZmlndXJhdGlvbi4gIFlvdSBjYW4KLXVzZSB0aGlzIGZlYXR1cmUgdG8gcGVybWl0IHNwZWNpZmljIEBzY3tyNDAwMH0gaW5zdHJ1Y3Rpb25zIHdoaWxlCi1hc3NlbWJsaW5nIGluIDMyIGJpdCBtb2RlLiAgVXNlIHRoaXMgZGlyZWN0aXZlIHdpdGggY2FyZSEKLQotVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IG1pcHMxNn0gcHV0cyB0aGUgYXNzZW1ibGVyIGludG8gTUlQUyAxNiBtb2RlLAotaW4gd2hpY2ggaXQgd2lsbCBhc3NlbWJsZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBNSVBTIDE2IHByb2Nlc3Nvci4gIFVzZQotQHNhbXB7LnNldCBub21pcHMxNn0gdG8gcmV0dXJuIHRvIG5vcm1hbCAzMiBiaXQgbW9kZS4KLQotVHJhZGl0aW9uYWwgQHNje21pcHN9IGFzc2VtYmxlcnMgZG8gbm90IHN1cHBvcnQgdGhpcyBkaXJlY3RpdmUuICAKLQotQG5vZGUgTUlQUyBhdXRvZXh0ZW5kCi1Ac2VjdGlvbiBEaXJlY3RpdmVzIGZvciBleHRlbmRpbmcgTUlQUyAxNiBiaXQgaW5zdHJ1Y3Rpb25zCi0KLUBraW5kZXggQGNvZGV7LnNldCBhdXRvZXh0ZW5kfQotQGtpbmRleCBAY29kZXsuc2V0IG5vYXV0b2V4dGVuZH0KLUJ5IGRlZmF1bHQsIE1JUFMgMTYgaW5zdHJ1Y3Rpb25zIGFyZSBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIDMyIGJpdHMKLXdoZW4gbmVjZXNzYXJ5LiAgVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IG5vYXV0b2V4dGVuZH0gd2lsbCB0dXJuIHRoaXMKLW9mZi4gIFdoZW4gQHNhbXB7LnNldCBub2F1dG9leHRlbmR9IGlzIGluIGVmZmVjdCwgYW55IDMyIGJpdCBpbnN0cnVjdGlvbgotbXVzdCBiZSBleHBsaWNpdGx5IGV4dGVuZGVkIHdpdGggdGhlIEBzYW1wey5lfSBtb2RpZmllciAoZS5nLiwKLUBzYW1we2xpLmUgJDQsMTAwMH0pLiAgVGhlIGRpcmVjdGl2ZSBAc2FtcHsuc2V0IGF1dG9leHRlbmR9IG1heSBiZSB1c2VkCi10byBvbmNlIGFnYWluIGF1dG9tYXRpY2FsbHkgZXh0ZW5kIGluc3RydWN0aW9ucyB3aGVuIG5lY2Vzc2FyeS4KLQotVGhpcyBkaXJlY3RpdmUgaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gaW4gTUlQUyAxNiBtb2RlLiAgVHJhZGl0aW9uYWwKLUBzY3ttaXBzfSBhc3NlbWJsZXJzIGRvIG5vdCBzdXBwb3J0IHRoaXMgZGlyZWN0aXZlLgotCi1Abm9kZSBNSVBTIGluc24KLUBzZWN0aW9uIERpcmVjdGl2ZSB0byBtYXJrIGRhdGEgYXMgYW4gaW5zdHJ1Y3Rpb24KLQotQGtpbmRleCBAY29kZXsuaW5zbn0KLVRoZSBAY29kZXsuaW5zbn0gZGlyZWN0aXZlIHRlbGxzIEBjb2Rle0B2YWx1ZXtBU319IHRoYXQgdGhlIGZvbGxvd2luZwotZGF0YSBpcyBhY3R1YWxseSBpbnN0cnVjdGlvbnMuICBUaGlzIG1ha2VzIGEgZGlmZmVyZW5jZSBpbiBNSVBTIDE2IG1vZGU6Ci13aGVuIGxvYWRpbmcgdGhlIGFkZHJlc3Mgb2YgYSBsYWJlbCB3aGljaCBwcmVjZWRlcyBpbnN0cnVjdGlvbnMsCi1AY29kZXtAdmFsdWV7QVN9fSBhdXRvbWF0aWNhbGx5IGFkZHMgMSB0byB0aGUgdmFsdWUsIHNvIHRoYXQganVtcGluZyB0bwotdGhlIGxvYWRlZCBhZGRyZXNzIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLgotCi1Abm9kZSBNSVBTIG9wdGlvbiBzdGFjawotQHNlY3Rpb24gRGlyZWN0aXZlcyB0byBzYXZlIGFuZCByZXN0b3JlIG9wdGlvbnMKLQotQGNpbmRleCBNSVBTIG9wdGlvbiBzdGFjawotQGtpbmRleCBAY29kZXsuc2V0IHB1c2h9Ci1Aa2luZGV4IEBjb2Rley5zZXQgcG9wfQotVGhlIGRpcmVjdGl2ZXMgQGNvZGV7LnNldCBwdXNofSBhbmQgQGNvZGV7LnNldCBwb3B9IG1heSBiZSB1c2VkIHRvIHNhdmUKLWFuZCByZXN0b3JlIHRoZSBjdXJyZW50IHNldHRpbmdzIGZvciBhbGwgdGhlIG9wdGlvbnMgd2hpY2ggYXJlCi1jb250cm9sbGVkIGJ5IEBjb2Rley5zZXR9LiAgVGhlIEBjb2Rley5zZXQgcHVzaH0gZGlyZWN0aXZlIHNhdmVzIHRoZQotY3VycmVudCBzZXR0aW5ncyBvbiBhIHN0YWNrLiAgVGhlIEBjb2Rley5zZXQgcG9wfSBkaXJlY3RpdmUgcG9wcyB0aGUKLXN0YWNrIGFuZCByZXN0b3JlcyB0aGUgc2V0dGluZ3MuCi0KLVRoZXNlIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWZ1bCBpbnNpZGUgYW4gbWFjcm8gd2hpY2ggbXVzdCBjaGFuZ2UgYW4KLW9wdGlvbiBzdWNoIGFzIHRoZSBJU0EgbGV2ZWwgb3IgaW5zdHJ1Y3Rpb24gcmVvcmRlcmluZyBidXQgZG9lcyBub3Qgd2FudAotdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgY29kZSB3aGljaCBpbnZva2VkIHRoZSBtYWNyby4KLQotVHJhZGl0aW9uYWwgQHNje21pcHN9IGFzc2VtYmxlcnMgZG8gbm90IHN1cHBvcnQgdGhlc2UgZGlyZWN0aXZlcy4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1uczMyay50ZXhpIGIvZ2FzL2RvYy9jLW5zMzJrLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YzYxZDkuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLW5zMzJrLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1AYyAgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi0KLUBpZ25vcmUKLUBjIEZJWE1FISAgU3RvcCBpZ25vcmluZyB3aGVuIGZpbGxlZCBpbi4KLUBub2RlIDMyeDMyCi1AY2hhcHRlciAzMngzMgotCi1Ac2VjdGlvbiBPcHRpb25zCi1UaGUgMzJ4MzIgdmVyc2lvbiBvZiBAY29kZXtAdmFsdWV7QVN9fSBhY2NlcHRzIGEgQHNhbXB7LW0zMjAzMn0gb3B0aW9uIHRvCi1zcGVjaWZ5IHRoaWF0IGl0IGlzIGNvbXBpbGluZyBmb3IgYSAzMjAzMiBwcm9jZXNzb3IsIG9yIGEKLUBzYW1wey1tMzI1MzJ9IHRvIHNwZWNpZnkgdGhhdCBpdCBpcyBjb21waWxpbmcgZm9yIGEgMzI1MzIgb3B0aW9uLgotVGhlIGRlZmF1bHQgKGlmIG5laXRoZXIgaXMgc3BlY2lmaWVkKSBpcyBjaG9zZW4gd2hlbiB0aGUgYXNzZW1ibGVyCi1pcyBjb21waWxlZC4KLQotQHNlY3Rpb24gU3ludGF4Ci1JIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIDMyeDMyIHN5bnRheCBhc3NlbWJsZWQgYnkKLUBjb2Rle0B2YWx1ZXtBU319LiAgU29tZW9uZSB3aG8gdW5kZXJzYW5kcyB0aGUgcHJvY2Vzc29yIChJJ3ZlIG5ldmVyIHNlZW4KLW9uZSkgYW5kIHRoZSBwb3NzaWJsZSBzeW50YXhlcyBzaG91bGQgd3JpdGUgdGhpcyBzZWN0aW9uLgotCi1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotVGhlIDMyeDMyIHVzZXMgQHNje2llZWV9IGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGJ1dCBAY29kZXtAdmFsdWV7QVN9fQotb25seSBjcmVhdGVzIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIHZhbHVlcy4gIEkgZG9uJ3Qga25vdyBpZiB0aGUKLTMyeDMyIHVuZGVyc3RhbmRzIGV4dGVuZGVkIHByZWNpc2lvbiBudW1iZXJzLgotCi1Ac2VjdGlvbiAzMngzMiBNYWNoaW5lIERpcmVjdGl2ZXMKLVRoZSAzMngzMiBoYXMgbm8gbWFjaGluZSBkZXBlbmRlbnQgZGlyZWN0aXZlcy4KLQotQGVuZCBpZ25vcmUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1zaC50ZXhpIGIvZ2FzL2RvYy9jLXNoLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMGY1NTQuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXNoLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLUBjIFRoaXMgaXMgcGFydCBvZiB0aGUgR0FTIG1hbnVhbC4KLUBjIEZvciBjb3B5aW5nIGNvbmRpdGlvbnMsIHNlZSB0aGUgZmlsZSBhcy50ZXhpbmZvLgotQHBhZ2UKLUBub2RlIFNILURlcGVuZGVudAotQGNoYXB0ZXIgSGl0YWNoaSBTSCBEZXBlbmRlbnQgRmVhdHVyZXMKLQotQGNpbmRleCBTSCBzdXBwb3J0Ci1AbWVudQotKiBTSCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogU0ggU3ludGF4OjogICAgICAgICAgICAgICBTeW50YXgKLSogU0ggRmxvYXRpbmcgUG9pbnQ6OiAgICAgICBGbG9hdGluZyBQb2ludAotKiBTSCBEaXJlY3RpdmVzOjogICAgICAgICAgIFNIIE1hY2hpbmUgRGlyZWN0aXZlcwotKiBTSCBPcGNvZGVzOjogICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTSCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggU0ggb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucywgU0ggKG5vbmUpCi1AY29kZXtAdmFsdWV7QVN9fSBoYXMgbm8gYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgdGhlIEhpdGFjaGkKLVNIIGZhbWlseS4KLQotQG5vZGUgU0ggU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLQotQG1lbnUKLSogU0gtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogU0gtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBTSC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTSC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgU0gKLUBjaW5kZXggU0ggbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7IX0gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIFNICi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIFNICi1AY2luZGV4IFNIIGxpbmUgc2VwYXJhdG9yCi1Zb3UgY2FuIHVzZSBAc2FtcHs7fSBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1AY2luZGV4IHN5bWJvbCBuYW1lcywgQHNhbXB7JH0gaW4KLUBjaW5kZXggQGNvZGV7JH0gaW4gc3ltYm9sIG5hbWVzCi1TaW5jZSBAc2FtcHskfSBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nLCB5b3UgbWF5IHVzZSBpdCBpbiBzeW1ib2wgbmFtZXMuCi0KLUBub2RlIFNILVJlZ3MKLUBzdWJzZWN0aW9uIFJlZ2lzdGVyIE5hbWVzCi0KLUBjaW5kZXggU0ggcmVnaXN0ZXJzCi1AY2luZGV4IHJlZ2lzdGVycywgU0gKLVlvdSBjYW4gdXNlIHRoZSBwcmVkZWZpbmVkIHN5bWJvbHMgQHNhbXB7cjB9LCBAc2FtcHtyMX0sIEBzYW1we3IyfSwKLUBzYW1we3IzfSwgQHNhbXB7cjR9LCBAc2FtcHtyNX0sIEBzYW1we3I2fSwgQHNhbXB7cjd9LCBAc2FtcHtyOH0sCi1Ac2FtcHtyOX0sIEBzYW1we3IxMH0sIEBzYW1we3IxMX0sIEBzYW1we3IxMn0sIEBzYW1we3IxM30sIEBzYW1we3IxNH0sCi1hbmQgQHNhbXB7cjE1fSB0byByZWZlciB0byB0aGUgU0ggcmVnaXN0ZXJzLgotCi1UaGUgU0ggYWxzbyBoYXMgdGhlc2UgY29udHJvbCByZWdpc3RlcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gcHIKLXByb2NlZHVyZSByZWdpc3RlciAoaG9sZHMgcmV0dXJuIGFkZHJlc3MpCi0KLUBpdGVtIHBjCi1wcm9ncmFtIGNvdW50ZXIKLQotQGl0ZW0gbWFjaAotQGl0ZW14IG1hY2wKLWhpZ2ggYW5kIGxvdyBtdWx0aXBseSBhY2N1bXVsYXRvciByZWdpc3RlcnMKLQotQGl0ZW0gc3IKLXN0YXR1cyByZWdpc3RlcgotCi1AaXRlbSBnYnIKLWdsb2JhbCBiYXNlIHJlZ2lzdGVyCi0KLUBpdGVtIHZicgotdmVjdG9yIGJhc2UgcmVnaXN0ZXIgKGZvciBpbnRlcnJ1cHQgdmVjdG9ycykKLUBlbmQgdGFibGUKLQotQG5vZGUgU0gtQWRkcmVzc2luZwotQHN1YnNlY3Rpb24gQWRkcmVzc2luZyBNb2RlcwotCi1AY2luZGV4IGFkZHJlc3NpbmcgbW9kZXMsIFNICi1AY2luZGV4IFNIIGFkZHJlc3NpbmcgbW9kZXMKLUBjb2Rle0B2YWx1ZXtBU319IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIFNILgotQGNvZGV7UkB2YXJ7bn19IGluIHRoZSBmb2xsb3dpbmcgcmVmZXJzIHRvIGFueSBvZiB0aGUgbnVtYmVyZWQKLXJlZ2lzdGVycywgYnV0IEBlbXBoe25vdH0gdGhlIGNvbnRyb2wgcmVnaXN0ZXJzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEBSQHZhcntufQotUmVnaXN0ZXIgaW5kaXJlY3QKLQotQGl0ZW0gQEAtUkB2YXJ7bn0KLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggcHJlLWRlY3JlbWVudAotCi1AaXRlbSBAQFJAdmFye259KwotUmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0LWluY3JlbWVudAotCi1AaXRlbSBAQChAdmFye2Rpc3B9LCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGlyZWN0IHdpdGggZGlzcGxhY2VtZW50Ci0KLUBpdGVtIEBAKFIwLCBSQHZhcntufSkKLVJlZ2lzdGVyIGluZGV4ZWQKLQotQGl0ZW0gQEAoQHZhcntkaXNwfSwgR0JSKQotQGNvZGV7R0JSfSBvZmZzZXQKLQotQGl0ZW0gQEAoUjAsIEdCUikKLUdCUiBpbmRleGVkCi0KLUBpdGVtIEB2YXJ7YWRkcn0KLUBpdGVteCBAQChAdmFye2Rpc3B9LCBQQykKLVBDIHJlbGF0aXZlIGFkZHJlc3MgKGZvciBicmFuY2ggb3IgZm9yIGFkZHJlc3NpbmcgbWVtb3J5KS4gIFRoZQotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50YXRpb24gYWxsb3dzIHlvdSB0byB1c2UgdGhlIHNpbXBsZXIgZm9ybQotQHZhcnthZGRyfSBhbnl3aGVyZSBhIFBDIHJlbGF0aXZlIGFkZHJlc3MgaXMgY2FsbGVkIGZvcjsgdGhlIGFsdGVybmF0ZQotZm9ybSBpcyBzdXBwb3J0ZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBhc3NlbWJsZXJzLgotCi1AaXRlbSAjQHZhcntpbW19Ci1JbW1lZGlhdGUgZGF0YQotQGVuZCB0YWJsZQotCi1Abm9kZSBTSCBGbG9hdGluZyBQb2ludAotQHNlY3Rpb24gRmxvYXRpbmcgUG9pbnQKLQotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgU0ggKEBzY3tpZWVlfSkKLUBjaW5kZXggU0ggZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBTSCBmYW1pbHkgaGFzIG5vIGhhcmR3YXJlIGZsb2F0aW5nIHBvaW50LCBidXQgdGhlIEBjb2Rley5mbG9hdH0KLWRpcmVjdGl2ZSBnZW5lcmF0ZXMgQHNje2llZWV9IGZsb2F0aW5nLXBvaW50IG51bWJlcnMgZm9yIGNvbXBhdGliaWxpdHkKLXdpdGggb3RoZXIgZGV2ZWxvcG1lbnQgdG9vbHMuCi0KLUBub2RlIFNIIERpcmVjdGl2ZXMKLUBzZWN0aW9uIFNIIE1hY2hpbmUgRGlyZWN0aXZlcwotCi1AY2luZGV4IFNIIG1hY2hpbmUgZGlyZWN0aXZlcwotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIFNICi1AY2luZGV4IEBjb2Rle3Vhd29yZH0gZGlyZWN0aXZlLCBTSAotQGNpbmRleCBAY29kZXt1YWxvbmd9IGRpcmVjdGl2ZSwgU0gKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSB1YXdvcmQKLUBpdGVteCB1YWxvbmcKLUBjb2Rle0B2YWx1ZXtBU319IHdpbGwgaXNzdWUgYSB3YXJuaW5nIHdoZW4gYSBtaXNhbGlnbmVkIEBjb2Rley53b3JkfSBvcgotQGNvZGV7Lmxvbmd9IGRpcmVjdGl2ZSBpcyB1c2VkLiAgWW91IG1heSB1c2UgQGNvZGV7LnVhd29yZH0gb3IKLUBjb2Rley51YWxvbmd9IHRvIGluZGljYXRlIHRoYXQgdGhlIHZhbHVlIGlzIGludGVudGlvbmFsbHkgbWlzYWxpZ25lZC4KLUBlbmQgdGFibGUKLQotQG5vZGUgU0ggT3Bjb2RlcwotQHNlY3Rpb24gT3Bjb2RlcwotCi1AY2luZGV4IFNIIG9wY29kZSBzdW1tYXJ5Ci1AY2luZGV4IG9wY29kZSBzdW1tYXJ5LCBTSAotQGNpbmRleCBtbmVtb25pY3MsIFNICi1AY2luZGV4IGluc3RydWN0aW9uIHN1bW1hcnksIFNICi1Gb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIFNIIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LCBzZWUKLUBjaXRle1NILU1pY3JvY29tcHV0ZXIgVXNlcidzIE1hbnVhbH0gKEhpdGFjaGkgTWljcm8gU3lzdGVtcywgSW5jLikuCi0KLUBjb2Rle0B2YWx1ZXtBU319IGltcGxlbWVudHMgYWxsIHRoZSBzdGFuZGFyZCBTSCBvcGNvZGVzLiAgTm8gYWRkaXRpb25hbAotcHNldWRvLWluc3RydWN0aW9ucyBhcmUgbmVlZGVkIG9uIHRoaXMgZmFtaWx5LiAgTm90ZSwgaG93ZXZlciwgdGhhdAotYmVjYXVzZSBAY29kZXtAdmFsdWV7QVN9fSBzdXBwb3J0cyBhIHNpbXBsZXIgZm9ybSBvZiBQQy1yZWxhdGl2ZQotYWRkcmVzc2luZywgeW91IG1heSBzaW1wbHkgd3JpdGUgKGZvciBleGFtcGxlKQotCi1AZXhhbXBsZQotbW92LmwgIGJhcixyMAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotd2hlcmUgb3RoZXIgYXNzZW1ibGVycyBtaWdodCByZXF1aXJlIGFuIGV4cGxpY2l0IGRpc3BsYWNlbWVudCB0bwotQGNvZGV7YmFyfSBmcm9tIHRoZSBwcm9ncmFtIGNvdW50ZXI6Ci0KLUBleGFtcGxlCi1tb3YubCAgQEAoQHZhcntkaXNwfSwgUEMpCi1AZW5kIGV4YW1wbGUKLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotSGVyZSBpcyBhIHN1bW1hcnkgb2YgU0ggb3Bjb2RlczoKLQotQHBhZ2UKLUBzbWFsbGV4YW1wbGUKLUBpe0xlZ2VuZDp9Ci1SbiAgICAgICAgQHJ7YSBudW1iZXJlZCByZWdpc3Rlcn0KLVJtICAgICAgICBAcnthbm90aGVyIG51bWJlcmVkIHJlZ2lzdGVyfQotI2ltbSAgICAgIEBye2ltbWVkaWF0ZSBkYXRhfQotZGlzcCAgICAgIEBye2Rpc3BsYWNlbWVudH0KLWRpc3A4ICAgICBAcns4LWJpdCBkaXNwbGFjZW1lbnR9Ci1kaXNwMTIgICAgQHJ7MTItYml0IGRpc3BsYWNlbWVudH0KLQotYWRkICNpbW0sUm4gICAgICAgICAgICAgICAgICAgIGxkcy5sIEBAUm4rLFBSICAgICAgICAgICAgICAKLWFkZCBSbSxSbiAgICAgICAgICAgICAgICAgICAgICBtYWMudyBAQFJtKyxAQFJuKyAgICAgICAgICAgCi1hZGRjIFJtLFJuICAgICAgICAgICAgICAgICAgICAgbW92ICNpbW0sUm4gICAgICAgICAgICAgICAgIAotYWRkdiBSbSxSbiAgICAgICAgICAgICAgICAgICAgIG1vdiBSbSxSbiAgICAgICAgICAgICAgICAgICAKLWFuZCAjaW1tLFIwICAgICAgICAgICAgICAgICAgICBtb3YuYiBSbSxAQChSMCxSbikgICAgICAgICAgCi1hbmQgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmIgUm0sQEAtUm4gICAgICAgICAgICAgIAotYW5kLmIgI2ltbSxAQChSMCxHQlIpICAgICAgICAgICBtb3YuYiBSbSxAQFJuICAgICAgICAgICAgICAgCi1iZiBkaXNwOCAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEAoZGlzcCxSbSksUjAgICAgICAgIAotYnJhIGRpc3AxMiAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAKGRpc3AsR0JSKSxSMCAgICAgICAKLWJzciBkaXNwMTIgICAgICAgICAgICAgICAgICAgICBtb3YuYiBAQChSMCxSbSksUm4gICAgICAgICAgCi1idCBkaXNwOCAgICAgICAgICAgICAgICAgICAgICAgbW92LmIgQEBSbSssUm4gICAgICAgICAgICAgIAotY2xybWFjICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5iIEBAUm0sUm4gICAgICAgICAgICAgICAKLWNscnQgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YuYiBSMCxAQChkaXNwLFJtKSAgICAgICAgCi1jbXAvZXEgI2ltbSxSMCAgICAgICAgICAgICAgICAgbW92LmIgUjAsQEAoZGlzcCxHQlIpICAgICAgIAotY21wL2VxIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAKGRpc3AsUm4pICAgICAgICAKLWNtcC9nZSBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBSbSxAQChSMCxSbikgICAgICAgICAgCi1jbXAvZ3QgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LmwgUm0sQEAtUm4gICAgICAgICAgICAgIAotY21wL2hpIFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi5sIFJtLEBAUm4gICAgICAgICAgICAgICAKLWNtcC9ocyBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YubCBAQChkaXNwLFJuKSxSbSAgICAgICAgCi1jbXAvcGwgUm4gICAgICAgICAgICAgICAgICAgICAgbW92LmwgQEAoZGlzcCxHQlIpLFIwICAgICAgIAotY21wL3B6IFJuICAgICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAKGRpc3AsUEMpLFJuICAgICAgICAKLWNtcC9zdHIgUm0sUm4gICAgICAgICAgICAgICAgICBtb3YubCBAQChSMCxSbSksUm4gICAgICAgICAgCi1kaXYwcyBSbSxSbiAgICAgICAgICAgICAgICAgICAgbW92LmwgQEBSbSssUm4gICAgICAgICAgICAgIAotZGl2MHUgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdi5sIEBAUm0sUm4gICAgICAgICAgICAgICAKLWRpdjEgUm0sUm4gICAgICAgICAgICAgICAgICAgICBtb3YubCBSMCxAQChkaXNwLEdCUikgICAgICAgCi1leHRzLmIgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgUm0sQEAoUjAsUm4pICAgICAgICAgIAotZXh0cy53IFJtLFJuICAgICAgICAgICAgICAgICAgIG1vdi53IFJtLEBALVJuICAgICAgICAgICAgICAKLWV4dHUuYiBSbSxSbiAgICAgICAgICAgICAgICAgICBtb3YudyBSbSxAQFJuICAgICAgICAgICAgICAgCi1leHR1LncgUm0sUm4gICAgICAgICAgICAgICAgICAgbW92LncgQEAoZGlzcCxSbSksUjAgICAgICAgIAotam1wIEBAUm4gICAgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQChkaXNwLEdCUiksUjAgICAgICAgCi1qc3IgQEBSbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAKGRpc3AsUEMpLFJuICAgICAgICAKLWxkYyBSbixHQlIgICAgICAgICAgICAgICAgICAgICBtb3YudyBAQChSMCxSbSksUm4gICAgICAgICAgCi1sZGMgUm4sU1IgICAgICAgICAgICAgICAgICAgICAgbW92LncgQEBSbSssUm4gICAgICAgICAgICAgIAotbGRjIFJuLFZCUiAgICAgICAgICAgICAgICAgICAgIG1vdi53IEBAUm0sUm4gICAgICAgICAgICAgICAKLWxkYy5sIEBAUm4rLEdCUiAgICAgICAgICAgICAgICAgbW92LncgUjAsQEAoZGlzcCxSbSkgICAgICAgIAotbGRjLmwgQEBSbissU1IgICAgICAgICAgICAgICAgICBtb3YudyBSMCxAQChkaXNwLEdCUikgICAgICAgCi1sZGMubCBAQFJuKyxWQlIgICAgICAgICAgICAgICAgIG1vdmEgQEAoZGlzcCxQQyksUjAgICAgICAgICAKLWxkcyBSbixNQUNIICAgICAgICAgICAgICAgICAgICBtb3Z0IFJuICAgICAgICAgICAgICAgICAgICAgCi1sZHMgUm4sTUFDTCAgICAgICAgICAgICAgICAgICAgbXVscyBSbSxSbiAgICAgICAgICAgICAgICAgIAotbGRzIFJuLFBSICAgICAgICAgICAgICAgICAgICAgIG11bHUgUm0sUm4gICAgICAgICAgICAgICAgICAKLWxkcy5sIEBAUm4rLE1BQ0ggICAgICAgICAgICAgICAgbmVnIFJtLFJuICAgICAgICAgICAgICAgICAgIAotbGRzLmwgQEBSbissTUFDTCAgICAgICAgICAgICAgICBuZWdjIFJtLFJuICAgICAgICAgICAgICAgICAgCi1AcGFnZQotbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YyBWQlIsUm4gICAgICAgICAgICAgICAgCi1ub3QgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgc3RjLmwgR0JSLEBALVJuICAgICAgICAgICAKLW9yICNpbW0sUjAgICAgICAgICAgICAgICAgICAgICBzdGMubCBTUixAQC1SbiAgICAgICAgICAgIAotb3IgUm0sUm4gICAgICAgICAgICAgICAgICAgICAgIHN0Yy5sIFZCUixAQC1SbiAgICAgICAgICAgCi1vci5iICNpbW0sQEAoUjAsR0JSKSAgICAgICAgICAgIHN0cyBNQUNILFJuICAgICAgICAgICAgICAgCi1yb3RjbCBSbiAgICAgICAgICAgICAgICAgICAgICAgc3RzIE1BQ0wsUm4gICAgICAgICAgICAgICAKLXJvdGNyIFJuICAgICAgICAgICAgICAgICAgICAgICBzdHMgUFIsUm4gICAgICAgICAgICAgICAgIAotcm90bCBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cy5sIE1BQ0gsQEAtUm4gICAgICAgICAgCi1yb3RyIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3RzLmwgTUFDTCxAQC1SbiAgICAgICAgICAKLXJ0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHMubCBQUixAQC1SbiAgICAgICAgICAgIAotcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiBSbSxSbiAgICAgICAgICAgICAgICAgCi1zZXR0ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYyBSbSxSbiAgICAgICAgICAgICAgICAKLXNoYWwgUm4gICAgICAgICAgICAgICAgICAgICAgICBzdWJ2IFJtLFJuICAgICAgICAgICAgICAgIAotc2hhciBSbiAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAuYiBSbSxSbiAgICAgICAgICAgICAgCi1zaGxsIFJuICAgICAgICAgICAgICAgICAgICAgICAgc3dhcC53IFJtLFJuICAgICAgICAgICAgICAKLXNobGwxNiBSbiAgICAgICAgICAgICAgICAgICAgICB0YXMuYiBAQFJuICAgICAgICAgICAgICAgIAotc2hsbDIgUm4gICAgICAgICAgICAgICAgICAgICAgIHRyYXBhICNpbW0gICAgICAgICAgICAgICAgCi1zaGxsOCBSbiAgICAgICAgICAgICAgICAgICAgICAgdHN0ICNpbW0sUjAgICAgICAgICAgICAgICAKLXNobHIgUm4gICAgICAgICAgICAgICAgICAgICAgICB0c3QgUm0sUm4gICAgICAgICAgICAgICAgIAotc2hscjE2IFJuICAgICAgICAgICAgICAgICAgICAgIHRzdC5iICNpbW0sQEAoUjAsR0JSKSAgICAgCi1zaGxyMiBSbiAgICAgICAgICAgICAgICAgICAgICAgeG9yICNpbW0sUjAgICAgICAgICAgICAgICAKLXNobHI4IFJuICAgICAgICAgICAgICAgICAgICAgICB4b3IgUm0sUm4gICAgICAgICAgICAgICAgIAotc2xlZXAgICAgICAgICAgICAgICAgICAgICAgICAgIHhvci5iICNpbW0sQEAoUjAsR0JSKSAgICAgCi1zdGMgR0JSLFJuICAgICAgICAgICAgICAgICAgICAgeHRyY3QgUm0sUm4gICAgICAgICAgICAgICAKLXN0YyBTUixSbgotQGVuZCBzbWFsbGV4YW1wbGUKLUBlbmQgaWZzZXQKLQotQGlmc2V0IEhpdGFjaGktYWxsCi1AaWZjbGVhciBHRU5FUklDCi1AcmFpc2VzZWN0aW9ucwotQGVuZCBpZmNsZWFyCi1AZW5kIGlmc2V0Ci0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy1zcGFyYy50ZXhpIGIvZ2FzL2RvYy9jLXNwYXJjLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzFjODIuLjAwMDAwMDAKLS0tIGEvZ2FzL2RvYy9jLXNwYXJjLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIFNwYXJjLURlcGVuZGVudAotQGNoYXB0ZXIgU1BBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgU1BBUkMgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBTUEFSQyBzdXBwb3J0Ci1AbWVudQotKiBTcGFyYy1PcHRzOjogICAgICAgICAgICAgICAgICBPcHRpb25zCi0qIFNwYXJjLUFsaWduZWQtRGF0YTo6CQlPcHRpb24gdG8gZW5mb3JjZSBhbGlnbmVkIGRhdGEKLSogU3BhcmMtRmxvYXQ6OiAgICAgICAgICAgICAgICAgRmxvYXRpbmcgUG9pbnQKLSogU3BhcmMtRGlyZWN0aXZlczo6ICAgICAgICAgICAgU3BhcmMgTWFjaGluZSBEaXJlY3RpdmVzCi1AZW5kIG1lbnUKLQotQG5vZGUgU3BhcmMtT3B0cwotQHNlY3Rpb24gT3B0aW9ucwotCi1AY2luZGV4IG9wdGlvbnMgZm9yIFNQQVJDCi1AY2luZGV4IFNQQVJDIG9wdGlvbnMKLUBjaW5kZXggYXJjaGl0ZWN0dXJlcywgU1BBUkMKLUBjaW5kZXggU1BBUkMgYXJjaGl0ZWN0dXJlcwotVGhlIFNQQVJDIGNoaXAgZmFtaWx5IGluY2x1ZGVzIHNldmVyYWwgc3VjY2Vzc2l2ZSBsZXZlbHMsIHVzaW5nIHRoZSBzYW1lCi1jb3JlIGluc3RydWN0aW9uIHNldCwgYnV0IGluY2x1ZGluZyBhIGZldyBhZGRpdGlvbmFsIGluc3RydWN0aW9ucyBhdAotZWFjaCBsZXZlbC4gIFRoZXJlIGFyZSBleGNlcHRpb25zIHRvIHRoaXMgaG93ZXZlci4gIEZvciBkZXRhaWxzIG9uIHdoYXQKLWluc3RydWN0aW9ucyBlYWNoIHZhcmlhbnQgc3VwcG9ydHMsIHBsZWFzZSBzZWUgdGhlIGNoaXAncyBhcmNoaXRlY3R1cmUKLXJlZmVyZW5jZSBtYW51YWwuCi0KLUJ5IGRlZmF1bHQsIEBjb2Rle0B2YWx1ZXtBU319IGFzc3VtZXMgdGhlIGNvcmUgaW5zdHJ1Y3Rpb24gc2V0IChTUEFSQwotdjYpLCBidXQgYGBidW1wcycnIHRoZSBhcmNoaXRlY3R1cmUgbGV2ZWwgYXMgbmVlZGVkOiBpdCBzd2l0Y2hlcyB0bwotc3VjY2Vzc2l2ZWx5IGhpZ2hlciBhcmNoaXRlY3R1cmVzIGFzIGl0IGVuY291bnRlcnMgaW5zdHJ1Y3Rpb25zIHRoYXQKLW9ubHkgZXhpc3QgaW4gdGhlIGhpZ2hlciBsZXZlbHMuCi0KLUlmIG5vdCBjb25maWd1cmVkIGZvciBTUEFSQyB2OSAoQGNvZGV7c3BhcmM2NC0qLSp9KSBHQVMgd2lsbCBub3QgYnVtcAotcGFzc2VkIHNwYXJjbGl0ZSBieSBkZWZhdWx0LCBhbiBvcHRpb24gbXVzdCBiZSBwYXNzZWQgdG8gZW5hYmxlIHRoZQotdjkgaW5zdHJ1Y3Rpb25zLgotCi1HQVMgdHJlYXRzIHNwYXJjbGl0ZSBhcyBiZWluZyBjb21wYXRpYmxlIHdpdGggdjgsIHVubGVzcyBhbiBhcmNoaXRlY3R1cmUKLWlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgU1BBUkMgdjkgaXMgYWx3YXlzIGluY29tcGF0aWJsZSB3aXRoIHNwYXJjbGl0ZS4KLQotQGMgVGhlIG9yZGVyIGhlcmUgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIG9mIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsCi1AYyB0byBnaXZlIHRoZSB1c2VyIGEgc2Vuc2Ugb2YgdGhlIG9yZGVyIG9mIHRoZSAiYnVtcGluZyIuCi0KLUB0YWJsZSBAY29kZQotQGtpbmRleCAtQXY2Ci1Aa2luZGV4IEF2NwotQGtpbmRleCAtQXY4Ci1Aa2luZGV4IC1Bc3BhcmNsZXQKLUBraW5kZXggLUFzcGFyY2xpdGUKLUBraW5kZXggLUF2OQotQGtpbmRleCAtQXY5YQotQGl0ZW0gLUF2NiB8IC1BdjcgfCAtQXY4IHwgLUFzcGFyY2xldCB8IC1Bc3BhcmNsaXRlCi1AaXRlbXggLUF2OHBsdXMgfCAtQXY4cGx1c2EgfCAtQXY5IHwgLUF2OWEKLVVzZSBvbmUgb2YgdGhlIEBzYW1wey1BfSBvcHRpb25zIHRvIHNlbGVjdCBvbmUgb2YgdGhlIFNQQVJDCi1hcmNoaXRlY3R1cmVzIGV4cGxpY2l0bHkuICBJZiB5b3Ugc2VsZWN0IGFuIGFyY2hpdGVjdHVyZSBleHBsaWNpdGx5LAotQGNvZGV7QHZhbHVle0FTfX0gcmVwb3J0cyBhIGZhdGFsIGVycm9yIGlmIGl0IGVuY291bnRlcnMgYW4gaW5zdHJ1Y3Rpb24KLW9yIGZlYXR1cmUgcmVxdWlyaW5nIGFuIGluY29tcGF0aWJsZSBvciBoaWdoZXIgbGV2ZWwuCi0KLUBzYW1wey1BdjhwbHVzfSBhbmQgQHNhbXB7LUF2OHBsdXNhfSBzZWxlY3QgYSAzMiBiaXQgZW52aXJvbm1lbnQuCi0KLUBzYW1wey1Bdjl9IGFuZCBAc2FtcHstQXY5YX0gc2VsZWN0IGEgNjQgYml0IGVudmlyb25tZW50IGFuZCBhcmUgbm90Ci1hdmFpbGFibGUgdW5sZXNzIEdBUyBpcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgd2l0aCA2NCBiaXQgZW52aXJvbm1lbnQKLXN1cHBvcnQuCi0KLUBzYW1wey1BdjhwbHVzYX0gYW5kIEBzYW1wey1BdjlhfSBlbmFibGUgdGhlIFNQQVJDIFY5IGluc3RydWN0aW9uIHNldCB3aXRoCi1VbHRyYVNQQVJDIGV4dGVuc2lvbnMuCi0KLUBpdGVtIC14YXJjaD12OHBsdXMgfCAteGFyY2g9djhwbHVzYQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgU29sYXJpcyB2OSBhc3NlbWJsZXIuICBUaGVzZSBvcHRpb25zIGFyZQotZXF1aXZhbGVudCB0byAtQXY4cGx1cyBhbmQgLUF2OHBsdXNhLCByZXNwZWN0aXZlbHkuCi0KLUBpdGVtIC1idW1wCi1XYXJuIHdoZW5ldmVyIGl0IGlzIG5lY2Vzc2FyeSB0byBzd2l0Y2ggdG8gYW5vdGhlciBsZXZlbC4KLUlmIGFuIGFyY2hpdGVjdHVyZSBsZXZlbCBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZCwgR0FTIHdpbGwgbm90IGlzc3VlCi13YXJuaW5ncyB1bnRpbCB0aGF0IGxldmVsIGlzIHJlYWNoZWQsIGFuZCB3aWxsIHRoZW4gYnVtcCB0aGUgbGV2ZWwKLWFzIHJlcXVpcmVkIChleGNlcHQgYmV0d2VlbiBpbmNvbXBhdGlibGUgbGV2ZWxzKS4KLQotQGl0ZW0gLTMyIHwgLTY0Ci1TZWxlY3QgdGhlIHdvcmQgc2l6ZSwgZWl0aGVyIDMyIGJpdHMgb3IgNjQgYml0cy4KLVRoZXNlIG9wdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIHdpdGggdGhlIEVMRiBvYmplY3QgZmlsZSBmb3JtYXQsCi1hbmQgcmVxdWlyZSB0aGF0IHRoZSBuZWNlc3NhcnkgQkZEIHN1cHBvcnQgaGFzIGJlZW4gaW5jbHVkZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIFNwYXJjLUFsaWduZWQtRGF0YQotQHNlY3Rpb24gRW5mb3JjaW5nIGFsaWduZWQgZGF0YQotCi1AY2luZGV4IGRhdGEgYWxpZ25tZW50IG9uIFNQQVJDCi1AY2luZGV4IFNQQVJDIGRhdGEgYWxpZ25tZW50Ci1TUEFSQyBHQVMgbm9ybWFsbHkgcGVybWl0cyBkYXRhIHRvIGJlIG1pc2FsaWduZWQuICBGb3IgZXhhbXBsZSwgaXQKLXBlcm1pdHMgdGhlIEBjb2Rley5sb25nfSBwc2V1ZG8tb3AgdG8gYmUgdXNlZCBvbiBhIGJ5dGUgYm91bmRhcnkuCi1Ib3dldmVyLCB0aGUgbmF0aXZlIFN1bk9TIGFuZCBTb2xhcmlzIGFzc2VtYmxlcnMgaXNzdWUgYW4gZXJyb3Igd2hlbgotdGhleSBzZWUgbWlzYWxpZ25lZCBkYXRhLgotCi1Aa2luZGV4IC0tZW5mb3JjZS1hbGlnbmVkLWRhdGEKLVlvdSBjYW4gdXNlIHRoZSBAY29kZXstLWVuZm9yY2UtYWxpZ25lZC1kYXRhfSBvcHRpb24gdG8gbWFrZSBTUEFSQyBHQVMKLWFsc28gaXNzdWUgYW4gZXJyb3IgYWJvdXQgbWlzYWxpZ25lZCBkYXRhLCBqdXN0IGFzIHRoZSBTdW5PUyBhbmQgU29sYXJpcwotYXNzZW1ibGVycyBkby4KLQotVGhlIEBjb2Rley0tZW5mb3JjZS1hbGlnbmVkLWRhdGF9IG9wdGlvbiBpcyBub3QgdGhlIGRlZmF1bHQgYmVjYXVzZSBnY2MKLWlzc3VlcyBtaXNhbGlnbmVkIGRhdGEgcHNldWRvLW9wcyB3aGVuIGl0IGluaXRpYWxpemVzIGNlcnRhaW4gcGFja2VkCi1kYXRhIHN0cnVjdHVyZXMgKHN0cnVjdHVyZXMgZGVmaW5lZCB1c2luZyB0aGUgQGNvZGV7cGFja2VkfSBhdHRyaWJ1dGUpLgotWW91IG1heSBoYXZlIHRvIGFzc2VtYmxlIHdpdGggR0FTIGluIG9yZGVyIHRvIGluaXRpYWxpemUgcGFja2VkIGRhdGEKLXN0cnVjdHVyZXMgaW4geW91ciBvd24gY29kZS4KLQotQGlnbm9yZQotQGMgRklYTUU6IChzcGFyYykgRmlsbCBpbiAic3ludGF4IiBzZWN0aW9uIQotQGMgc3Vic2VjdGlvbiBzeW50YXgKLUkgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCBTcGFyYyBzeW50YXguICBTb21lb25lIHdobyBkb2VzCi13aWxsIGhhdmUgdG8gd3JpdGUgdGhpcyBzZWN0aW9uLgotQGVuZCBpZ25vcmUKLQotQG5vZGUgU3BhcmMtRmxvYXQKLUBzZWN0aW9uIEZsb2F0aW5nIFBvaW50Ci0KLUBjaW5kZXggZmxvYXRpbmcgcG9pbnQsIFNQQVJDIChAc2N7aWVlZX0pCi1AY2luZGV4IFNQQVJDIGZsb2F0aW5nIHBvaW50IChAc2N7aWVlZX0pCi1UaGUgU3BhcmMgdXNlcyBAc2N7aWVlZX0gZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KLQotQG5vZGUgU3BhcmMtRGlyZWN0aXZlcwotQHNlY3Rpb24gU3BhcmMgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggU1BBUkMgbWFjaGluZSBkaXJlY3RpdmVzCi1AY2luZGV4IG1hY2hpbmUgZGlyZWN0aXZlcywgU1BBUkMKLVRoZSBTcGFyYyB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbAotbWFjaGluZSBkaXJlY3RpdmVzOgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7YWxpZ259IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5hbGlnbgotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IHRoZSBkZXNpcmVkIGFsaWdubWVudCBpbiBieXRlcy4KLQotQGNpbmRleCBAY29kZXtjb21tb259IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5jb21tb24KLVRoaXMgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHN5bWJvbCBuYW1lLCBhIHBvc2l0aXZlIG51bWJlciwgYW5kCi1AY29kZXsiYnNzIn0uICBUaGlzIGJlaGF2ZXMgc29tZXdoYXQgbGlrZSBAY29kZXsuY29tbX0sIGJ1dCB0aGUKLXN5bnRheCBpcyBkaWZmZXJlbnQuCi0KLUBjaW5kZXggQGNvZGV7aGFsZn0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLmhhbGYKLVRoaXMgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBAY29kZXsuc2hvcnR9LgotCi1AY2luZGV4IEBjb2Rle3Byb2N9IGRpcmVjdGl2ZSwgU1BBUkMKLUBpdGVtIC5wcm9jCi1UaGlzIGRpcmVjdGl2ZSBpcyBpZ25vcmVkLiAgQW55IHRleHQgZm9sbG93aW5nIGl0IG9uIHRoZSBzYW1lCi1saW5lIGlzIGFsc28gaWdub3JlZC4KLQotQGNpbmRleCBAY29kZXtyZXNlcnZlfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAucmVzZXJ2ZQotVGhpcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3ltYm9sIG5hbWUsIGEgcG9zaXRpdmUgbnVtYmVyLCBhbmQKLUBjb2RleyJic3MifS4gIFRoaXMgYmVoYXZlcyBzb21ld2hhdCBsaWtlIEBjb2Rley5sY29tbX0sIGJ1dCB0aGUKLXN5bnRheCBpcyBkaWZmZXJlbnQuCi0KLUBjaW5kZXggQGNvZGV7c2VnfSBkaXJlY3RpdmUsIFNQQVJDCi1AaXRlbSAuc2VnCi1UaGlzIG11c3QgYmUgZm9sbG93ZWQgYnkgQGNvZGV7InRleHQifSwgQGNvZGV7ImRhdGEifSwgb3IKLUBjb2RleyJkYXRhMSJ9LiAgSXQgYmVoYXZlcyBsaWtlIEBjb2Rley50ZXh0fSwgQGNvZGV7LmRhdGF9LCBvcgotQGNvZGV7LmRhdGEgMX0uCi0KLUBjaW5kZXggQGNvZGV7c2tpcH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnNraXAKLVRoaXMgaXMgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgQGNvZGV7LnNwYWNlfSBkaXJlY3RpdmUuCi0KLUBjaW5kZXggQGNvZGV7d29yZH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLndvcmQKLU9uIHRoZSBTcGFyYywgdGhlIEBjb2Rley53b3JkfSBkaXJlY3RpdmUgcHJvZHVjZXMgMzIgYml0IHZhbHVlcywKLWluc3RlYWQgb2YgdGhlIDE2IGJpdCB2YWx1ZXMgaXQgcHJvZHVjZXMgb24gbWFueSBvdGhlciBtYWNoaW5lcy4KLQotQGNpbmRleCBAY29kZXt4d29yZH0gZGlyZWN0aXZlLCBTUEFSQwotQGl0ZW0gLnh3b3JkCi1PbiB0aGUgU3BhcmMgVjkgcHJvY2Vzc29yLCB0aGUgQGNvZGV7Lnh3b3JkfSBkaXJlY3RpdmUgcHJvZHVjZXMKLTY0IGJpdCB2YWx1ZXMuCi1AZW5kIHRhYmxlCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy12ODUwLnRleGkgYi9nYXMvZG9jL2Mtdjg1MC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE2ZTBmLi4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvYy12ODUwLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi0KLUBub2RlIFY4NTAtRGVwZW5kZW50Ci1AY2hhcHRlciB2ODUwIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IFY4NTAgc3VwcG9ydAotQG1lbnUKLSogVjg1MCBPcHRpb25zOjogICAgICAgICAgICAgIE9wdGlvbnMKLSogVjg1MCBTeW50YXg6OiAgICAgICAgICAgICAgIFN5bnRheAotKiBWODUwIEZsb2F0aW5nIFBvaW50OjogICAgICAgRmxvYXRpbmcgUG9pbnQKLSogVjg1MCBEaXJlY3RpdmVzOjogICAgICAgICAgIFY4NTAgTWFjaGluZSBEaXJlY3RpdmVzCi0qIFY4NTAgT3Bjb2Rlczo6ICAgICAgICAgICAgICBPcGNvZGVzCi1AZW5kIG1lbnUKLQotQG5vZGUgVjg1MCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi1AY2luZGV4IFY4NTAgb3B0aW9ucyAobm9uZSkKLUBjaW5kZXggb3B0aW9ucyBmb3IgVjg1MCAobm9uZSkKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb21tYW5kLWxpbmUgb3B0aW9ucwotZm9yIHRoZSBWODUwIHByb2Nlc3NvciBmYW1pbHk6Ci0KLUBjaW5kZXggY29tbWFuZCBsaW5lIG9wdGlvbnMsIFY4NTAKLUBjaW5kZXggVjg1MCBjb21tYW5kIGxpbmUgb3B0aW9ucwotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQGNvZGV7LXdzaWduZWRfb3ZlcmZsb3d9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC13c2lnbmVkX292ZXJmbG93Ci1DYXVzZXMgd2FybmluZ3MgdG8gYmUgcHJvZHVjZWQgd2hlbiBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBvdmVyZmxvdyB0aGUKLXNwYWNlIGF2YWlsYWJsZSBmb3IgdGhlbiB3aXRoaW4gdGhlaXIgb3Bjb2Rlcy4gIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24KLWlzIGRpc2FibGVkIGFzIGl0IGlzIHBvc3NpYmxlIHRvIHJlY2VpdmUgc3B1cmlvdXMgd2FybmluZ3MgZHVlIHRvIHVzaW5nCi1leGFjdCBiaXQgcGF0dGVybnMgYXMgaW1tZWRpYXRlIGNvbnN0YW50cy4KLQotQGNpbmRleCBAY29kZXstd3Vuc2lnbmVkX292ZXJmbG93fSBjb21tYW5kIGxpbmUgb3B0aW9uLCBWODUwCi1AaXRlbSAtd3Vuc2lnbmVkX292ZXJmbG93Ci1DYXVzZXMgd2FybmluZ3MgdG8gYmUgcHJvZHVjZWQgd2hlbiB1bnNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93Ci10aGUgc3BhY2UgYXZhaWxhYmxlIGZvciB0aGVuIHdpdGhpbiB0aGVpciBvcGNvZGVzLiAgQnkgZGVmYXVsdCB0aGlzCi1vcHRpb24gaXMgZGlzYWJsZWQgYXMgaXQgaXMgcG9zc2libGUgdG8gcmVjZWl2ZSBzcHVyaW91cyB3YXJuaW5ncyBkdWUgdG8KLXVzaW5nIGV4YWN0IGJpdCBwYXR0ZXJucyBhcyBpbW1lZGlhdGUgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rley1tdjg1MH0gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLW12ODUwCi1TcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAotdGhlIFY4NTAgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBjaW5kZXggQGNvZGV7LW12ODUwZX0gY29tbWFuZCBsaW5lIG9wdGlvbiwgVjg1MAotQGl0ZW0gLW12ODUwZQotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwRSBwcm9jZXNzb3IuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIHRvIGRldGVjdCBhdHRlbXB0cyB0byBsaW5rCi1zdWNoIGNvZGUgd2l0aCBjb2RlIGFzc2VtYmxlZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KLQotQGNpbmRleCBAY29kZXstbXY4NTBhbnl9IGNvbW1hbmQgbGluZSBvcHRpb24sIFY4NTAKLUBpdGVtIC1tdjg1MGFueQotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwIHByb2Nlc3NvciBidXQgc3VwcG9ydCBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gdGhlCi1leHRlbmRlZCB2YXJpYW50cyBvZiB0aGUgcHJvY2Vzcy4gIFRoaXMgYWxsb3dzIHRoZSBwcm9kdWN0aW9uIG9mCi1iaW5hcmllcyB0aGF0IGNvbnRhaW4gdGFyZ2V0IHNwZWNpZmljIGNvZGUsIGJ1dCB3aGljaCBhcmUgYWxzbyBpbnRlbmRlZAotdG8gYmUgdXNlZCBpbiBhIGdlbmVyaWMgZmFzaGlvbi4gIEZvciBleGFtcGxlIGxpYmdjYy5hIGNvbnRhaW5zIGdlbmVyaWMKLXJvdXRpbmVzIHVzZWQgYnkgdGhlIGNvZGUgcHJvZHVjZWQgYnkgR0NDIGZvciBhbGwgdmVyc2lvbnMgb2YgdGhlIHY4NTAKLWFyY2hpdGVjdHVyZSwgdG9nZXRoZXIgd2l0aCBzdXBwb3J0IHJvdXRpbmVzIG9ubHkgdXNlZCBieSB0aGUgVjg1MEUKLWFyY2hpdGVjdHVyZS4KLQotQGVuZCB0YWJsZQotCi0KLUBub2RlIFY4NTAgU3ludGF4Ci1Ac2VjdGlvbiBTeW50YXgKLUBtZW51Ci0qIFY4NTAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogVjg1MC1SZWdzOjogICAgICAgICAgICAgICAgIFJlZ2lzdGVyIE5hbWVzCi1AZW5kIG1lbnUKLQotQG5vZGUgVjg1MC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgVjg1MAotQGNpbmRleCBWODUwIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIKLUBzYW1weyN9IGlzIHRoZSBsaW5lIGNvbW1lbnQgY2hhcmFjdGVyLgotQG5vZGUgVjg1MC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IFY4NTAgcmVnaXN0ZXIgbmFtZXMKLUBjaW5kZXggcmVnaXN0ZXIgbmFtZXMsIFY4NTAKLUBjb2Rle0B2YWx1ZXtBU319IHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgbmFtZXMgZm9yIHJlZ2lzdGVyczoKLUB0YWJsZSBAY29kZQotQGNpbmRleCBAY29kZXt6ZXJvfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAwCi1yMCwgemVybwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxCi1yMQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyCi1yMiwgaHAKLUBjaW5kZXggQGNvZGV7c3B9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDMKLXIzLCBzcAotQGNpbmRleCBAY29kZXtncH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNAotcjQsIGdwCi1AY2luZGV4IEBjb2Rle3RwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciA1Ci1yNSwgdHAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNgotcjYKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgNwotcjcKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgOAotcjgKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgOQotcjkKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTAKLXIxMAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxMQotcjExCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDEyCi1yMTIKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTMKLXIxMwotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNAotcjE0Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE1Ci1yMTUKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTYKLXIxNgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAxNwotcjE3Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDE4Ci1yMTgKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMTkKLXIxOQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMAotcjIwCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDIxCi1yMjEKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjIKLXIyMgotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyMwotcjIzCi1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI0Ci1yMjQKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjUKLXIyNQotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyNgotcjI2Ci1AaXRlbSBnZW5lcmFsIHJlZ2lzdGVyIDI3Ci1yMjcKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMjgKLXIyOAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAyOQotcjI5Ci1AY2luZGV4IEBjb2Rle2VwfSByZWdpc3RlciwgVjg1MAotQGl0ZW0gZ2VuZXJhbCByZWdpc3RlciAzMAotcjMwLCBlcAotQGNpbmRleCBAY29kZXtscH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIGdlbmVyYWwgcmVnaXN0ZXIgMzEKLXIzMSwgbHAKLUBjaW5kZXggQGNvZGV7ZWlwY30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAwCi1laXBjCi1AY2luZGV4IEBjb2Rle2VpcHN3fSByZWdpc3RlciwgVjg1MAotQGl0ZW0gc3lzdGVtIHJlZ2lzdGVyIDEKLWVpcHN3Ci1AY2luZGV4IEBjb2Rle2ZlcGN9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgMgotZmVwYwotQGNpbmRleCBAY29kZXtmZXBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAzCi1mZXBzdwotQGNpbmRleCBAY29kZXtlY3J9IHJlZ2lzdGVyLCBWODUwCi1AaXRlbSBzeXN0ZW0gcmVnaXN0ZXIgNAotZWNyCi1AY2luZGV4IEBjb2Rle3Bzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciA1Ci1wc3cKLUBjaW5kZXggQGNvZGV7Y3RwY30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxNgotY3RwYwotQGNpbmRleCBAY29kZXtjdHBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxNwotY3Rwc3cKLUBjaW5kZXggQGNvZGV7ZGJwY30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxOAotZGJwYwotQGNpbmRleCBAY29kZXtkYnBzd30gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAxOQotZGJwc3cKLUBjaW5kZXggQGNvZGV7Y3RicH0gcmVnaXN0ZXIsIFY4NTAKLUBpdGVtIHN5c3RlbSByZWdpc3RlciAyMAotY3RicAotQGVuZCB0YWJsZQotCi1Abm9kZSBWODUwIEZsb2F0aW5nIFBvaW50Ci1Ac2VjdGlvbiBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IGZsb2F0aW5nIHBvaW50LCBWODUwIChAc2N7aWVlZX0pCi1AY2luZGV4IFY4NTAgZmxvYXRpbmcgcG9pbnQgKEBzY3tpZWVlfSkKLVRoZSBWODUwIGZhbWlseSB1c2VzIEBzY3tpZWVlfSBmbG9hdGluZy1wb2ludCBudW1iZXJzLgotCi1Abm9kZSBWODUwIERpcmVjdGl2ZXMKLUBzZWN0aW9uIFY4NTAgTWFjaGluZSBEaXJlY3RpdmVzCi0KLUBjaW5kZXggbWFjaGluZSBkaXJlY3RpdmVzLCBWODUwCi1AY2luZGV4IFY4NTAgbWFjaGluZSBkaXJlY3RpdmVzCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7b2Zmc2V0fSBkaXJlY3RpdmUsIFY4NTAKLUBpdGVtIC5vZmZzZXQgQHZhcns8ZXhwcmVzc2lvbj59Ci1Nb3ZlcyB0aGUgb2Zmc2V0IGludG8gdGhlIGN1cnJlbnQgc2VjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGFtb3VudC4gCi0KLUBjaW5kZXggQGNvZGV7c2VjdGlvbn0gZGlyZWN0aXZlLCBWODUwCi1AaXRlbSAuc2VjdGlvbiAibmFtZSIsIDx0eXBlPgotVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIHN0YW5kYXJkIC5zZWN0aW9uIGRpcmVjdGl2ZS4gIEl0IHNldHMgdGhlCi1jdXJyZW50IHNlY3Rpb24gdG8gYmUgPHR5cGU+IGFuZCBjcmVhdGVzIGFuIGFsaWFzIGZvciB0aGlzIHNlY3Rpb24KLWNhbGxlZCAibmFtZSIuIAotCi1AY2luZGV4IEBjb2Rley52ODUwfSBkaXJlY3RpdmUsIFY4NTAKLUBpdGVtIC52ODUwCi1TcGVjaWZpZXMgdGhhdCB0aGUgYXNzZW1ibGVkIGNvZGUgc2hvdWxkIGJlIG1hcmtlZCBhcyBiZWluZyB0YXJnZXRlZCBhdAotdGhlIFY4NTAgcHJvY2Vzc29yLiAgVGhpcyBhbGxvd3MgdGhlIGxpbmtlciB0byBkZXRlY3QgYXR0ZW1wdHMgdG8gbGluawotc3VjaCBjb2RlIHdpdGggY29kZSBhc3NlbWJsZWQgZm9yIG90aGVyIHByb2Nlc3NvcnMuCi0KLUBjaW5kZXggQGNvZGV7LnY4NTBlfSBkaXJlY3RpdmUsIFY4NTAKLUBpdGVtIC52ODUwZQotU3BlY2lmaWVzIHRoYXQgdGhlIGFzc2VtYmxlZCBjb2RlIHNob3VsZCBiZSBtYXJrZWQgYXMgYmVpbmcgdGFyZ2V0ZWQgYXQKLXRoZSBWODUwRSBwcm9jZXNzb3IuICBUaGlzIGFsbG93cyB0aGUgbGlua2VyIHRvIGRldGVjdCBhdHRlbXB0cyB0byBsaW5rCi1zdWNoIGNvZGUgd2l0aCBjb2RlIGFzc2VtYmxlZCBmb3Igb3RoZXIgcHJvY2Vzc29ycy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBWODUwIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBWODUwIG9wY29kZXMKLUBjaW5kZXggb3Bjb2RlcyBmb3IgVjg1MAotQGNvZGV7QHZhbHVle0FTfX0gaW1wbGVtZW50cyBhbGwgdGhlIHN0YW5kYXJkIFY4NTAgb3Bjb2Rlcy4KLQotQGNvZGV7QHZhbHVle0FTfX0gYWxzbyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgcHNldWRvIG9wczoKLQotQHRhYmxlIEBjb2RlCi0KLUBjaW5kZXggQGNvZGV7aGkwfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGhpMCgpCi1Db21wdXRlcyB0aGUgaGlnaGVyIDE2IGJpdHMgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHN0b3JlcyBpdCBpbnRvCi10aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICBAc2FtcHttdWxoaSBoaTAoaGVyZSAtIHRoZXJlKSwgcjUsIHI2fQotCi1jb21wdXRlcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGxhYmVscyAnaGVyZScgYW5kCi0ndGhlcmUnLCB0YWtlcyB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGlzIGRpZmZlcmVuY2UsIHNoaWZ0cyBpdCBkb3duIDE2Ci1iaXRzIGFuZCB0aGVuIG11dGxpcGxpZXMgaXQgYnkgdGhlIGxvd2VyIDE2IGJpdHMgaW4gcmVnaXN0ZXIgNSwgcHV0dGluZwotdGhlIHJlc3VsdCBpbnRvIHJlZ2lzdGVyIDYuIAotCi1AY2luZGV4IEBjb2Rle2xvfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGxvKCkKLUNvbXB1dGVzIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uIGFuZCBzdG9yZXMgaXQgaW50bwotdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgQHNhbXB7YWRkaSBsbyhoZXJlIC0gdGhlcmUpLCByNSwgcjZ9Ci0KLWNvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGFkZHJlc3Mgb2YgbGFiZWxzICdoZXJlJyBhbmQKLSd0aGVyZScsIHRha2VzIHRoZSBsb3dlciAxNiBiaXRzIG9mIHRoaXMgZGlmZmVyZW5jZSBhbmQgYWRkcyBpdCB0bwotcmVnaXN0ZXIgNSwgcHV0dGluZyB0aGUgcmVzdWx0IGludG8gcmVnaXN0ZXIgNi4KLQotQGNpbmRleCBAY29kZXtoaX0gcHNldWRvLW9wLCBWODUwCi1AaXRlbSBoaSgpCi1Db21wdXRlcyB0aGUgaGlnaGVyIDE2IGJpdHMgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24gYW5kIHRoZW4gYWRkcyB0aGUKLXZhbHVlIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgZXhwcmVzc2lvbgotYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGludG8gdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGZpZWxkIG9mIHRoZSBnaXZlbgotaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGNvZGUgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUKLWFkZHJlc3Mgb2YgdGhlIGxhYmVsICdoZXJlJyBhbmQgc3RvcmUgaXQgaW50byByZWdpc3RlciA2OgotCi0gICAgQHNhbXB7bW92aGkgaGkoaGVyZSksIHIwLCByNn0KLSAgICBAc2FtcHttb3ZlYSBsbyhoZXJlKSwgcjYsIHI2fQotCi1UaGUgcmVhc29uIGZvciB0aGlzIHNwZWNpYWwgYmVoYXZpb3VyIGlzIHRoYXQgbW92ZWEgcGVyZm9ybXMgYSBzaWduCi1leHRlbnRpb24gb24gaXRzIGltbWVkaWF0ZSBvcGVyYW5kLiAgU28gZm9yIGV4YW1wbGUgaWYgdGhlIGFkZHJlc3Mgb2YKLSdoZXJlJyB3YXMgMHhGRkZGRkZGRiB0aGVuIHdpdGhvdXQgdGhlIHNwZWNpYWwgYmVoYXZpb3VyIG9mIHRoZSBoaSgpCi1wc2V1ZG8tb3AgdGhlIG1vdmhpIGluc3RydWN0aW9uIHdvdWxkIHB1dCAweEZGRkYwMDAwIGludG8gcjYsIHRoZW4gdGhlCi1tb3ZlYSBpbnN0cnVjdGlvbiB3b3VsZCB0YWtlcyBpdHMgaW1tZWRpYXRlIG9wZXJhbmQsIDB4RkZGRiwgc2lnbiBleHRlbmQKLWl0IHRvIDMyIGJpdHMsIDB4RkZGRkZGRkYsIGFuZCB0aGVuIGFkZCBpdCBpbnRvIHI2IGdpdmluZyAweEZGRkVGRkZGCi13aGljaCBpcyB3cm9uZyAodGhlIGZpZnRoIG5pYmJsZSBpcyBFKS4gIFdpdGggdGhlIGhpKCkgcHNldWRvIG9wIGFkZGluZwotaW4gdGhlIHRvcCBiaXQgb2YgdGhlIGxvKCkgcHNldWRvIG9wLCB0aGUgbW92aGkgaW5zdHJ1Y3Rpb24gYWN0dWFsbHkKLXN0b3JlcyAwIGludG8gcjYgKDB4RkZGRiArIDEgPSAweDAwMDApLCBzbyB0aGF0IHRoZSBtb3ZlYSBpbnN0cnVjdGlvbgotc3RvcmVzIDB4RkZGRkZGRkYgaW50byByNiAtIHRoZSByaWdodCB2YWx1ZS4KLQotQGNpbmRleCBAY29kZXtoaWxvfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIGhpbG8oKQotQ29tcHV0ZXMgdGhlIDMyIGJpdCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBhbmQgc3RvcmVzIGl0IGludG8KLXRoZSBpbW1lZGlhdGUgb3BlcmFuZCBmaWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gKHdoaWNoIG11c3QgYmUgYQotbW92IGluc3RydWN0aW9uKS4gIEZvciBleGFtcGxlOgotCi0gICAgQHNhbXB7bW92IGhpbG8oaGVyZSksIHI2fQotCi1jb21wdXRlcyB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiBsYWJlbCAnaGVyZScgYW5kIHB1dHMgdGhlIHJlc3VsdCBpbnRvCi1yZWdpc3RlciA2LiAgCi0KLUBjaW5kZXggQGNvZGV7c2Rhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIHNkYW9mZigpCi1Db21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgU21hbGwKLURhdGEgQXJlYSAod2hvZXMgYWRkcmVzcyBpcyBoZWxkIGluIHJlZ2lzdGVyIDQsIHRoZSBHUCByZWdpc3RlcikgYW5kCi1zdG9yZXMgdGhlIHJlc3VsdCBhcyBhIDE2IGJpdCBzaWduZWQgdmFsdWUgaW4gdGhlIGltbWVkaWF0ZSBvcGVyYW5kCi1maWVsZCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZTogCi0KLSAgICAgIEBzYW1we2xkLncgc2Rhb2ZmKF9hX3ZhcmlhYmxlKVtncF0scjZ9Ci0KLWxvYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSB0aGUgbGFiZWwgJ19hX3ZhcmlhYmxlJwotaW50byByZWdpc3RlciA2LCBwcm92aWRlZCB0aGF0IHRoZSBsYWJlbCBpcyBsb2NhdGVkIHNvbWV3aGVyZSB3aXRoaW4gKy8tCi0zMksgb2YgdGhlIGFkZHJlc3MgaGVsZCBpbiB0aGUgR1AgcmVnaXN0ZXIuICBbTm90ZSB0aGUgbGlua2VyIGFzc3VtZXMKLXRoYXQgdGhlIEdQIHJlZ2lzdGVyIGNvbnRhaW5zIGEgZml4ZWQgYWRkcmVzcyBzZXQgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCi1sYWJlbCBjYWxsZWQgJ19fZ3AnLiAgVGhpcyBjYW4gZWl0aGVyIGJlIHNldCB1cCBhdXRvbWF0aWNhbGx5IGJ5IHRoZQotbGlua2VyLCBvciBzcGVjaWZpY2FsbHkgc2V0IGJ5IHVzaW5nIHRoZSBAc2FtcHstLWRlZnN5bSBfX2dwPTx2YWx1ZT59Ci1jb21tYW5kIGxpbmUgb3B0aW9uXS4KLQotQGNpbmRleCBAY29kZXt0ZGFvZmZ9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gdGRhb2ZmKCkKLUNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgdGhlIG5hbWVkIHZhcmlhYmxlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBUaW55Ci1EYXRhIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiByZWdpc3RlciAzMCwgdGhlIEVQIHJlZ2lzdGVyKSBhbmQKLXN0b3JlcyB0aGUgcmVzdWx0IGFzIGEgNCw1LCA3IG9yIDggYml0IHVuc2lnbmVkIHZhbHVlIGluIHRoZSBpbW1lZGlhdGUKLW9wZXJhbmQgZmllbGQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgIEBzYW1we3NsZC53IHRkYW9mZihfYV92YXJpYWJsZSlbZXBdLHI2fQotCi1sb2FkcyB0aGUgY29udGVudHMgb2YgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgdGhlIGxhYmVsICdfYV92YXJpYWJsZScKLWludG8gcmVnaXN0ZXIgNiwgcHJvdmlkZWQgdGhhdCB0aGUgbGFiZWwgaXMgbG9jYXRlZCBzb21ld2hlcmUgd2l0aGluICsyNTYKLWJ5dGVzIG9mIHRoZSBhZGRyZXNzIGhlbGQgaW4gdGhlIEVQIHJlZ2lzdGVyLiAgW05vdGUgdGhlIGxpbmtlciBhc3N1bWVzCi10aGF0IHRoZSBFUCByZWdpc3RlciBjb250YWlucyBhIGZpeGVkIGFkZHJlc3Mgc2V0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZQotbGFiZWwgY2FsbGVkICdfX2VwJy4gIFRoaXMgY2FuIGVpdGhlciBiZSBzZXQgdXAgYXV0b21hdGljYWxseSBieSB0aGUKLWxpbmtlciwgb3Igc3BlY2lmaWNhbGx5IHNldCBieSB1c2luZyB0aGUgQHNhbXB7LS1kZWZzeW0gX19lcD08dmFsdWU+fQotY29tbWFuZCBsaW5lIG9wdGlvbl0uCi0KLUBjaW5kZXggQGNvZGV7emRhb2ZmfSBwc2V1ZG8tb3AsIFY4NTAKLUBpdGVtIHpkYW9mZigpCi1Db21wdXRlcyB0aGUgb2Zmc2V0IG9mIHRoZSBuYW1lZCB2YXJpYWJsZSBmcm9tIGFkZHJlc3MgMCBhbmQgc3RvcmVzIHRoZQotcmVzdWx0IGFzIGEgMTYgYml0IHNpZ25lZCB2YWx1ZSBpbiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgZmllbGQgb2YgdGhlCi1naXZlbiBpbnN0cnVjdGlvbi4gIEZvciBleGFtcGxlOgotCi0gICAgICBAc2FtcHttb3ZlYSB6ZGFvZmYoX2FfdmFyaWFibGUpLHplcm8scjZ9Ci0KLXB1dHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhYmVsICdfYV92YXJpYWJsZScgaW50byByZWdpc3RlciA2LCBhc3N1bWluZwotdGhhdCB0aGUgbGFiZWwgaXMgc29tZXdoZXJlIHdpdGhpbiB0aGUgZmlyc3QgMzJLIG9mIG1lbW9yeS4gIChTdHJpY3RseQotc3BlYWtpbmcgaXQgYWxzbyBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGxhc3QgMzJLIG9mIG1lbW9yeSBhcyB3ZWxsLCBhcwotdGhlIG9mZnNldHMgYXJlIHNpZ25lZCkuCi0KLUBjaW5kZXggQGNvZGV7Y3RvZmZ9IHBzZXVkby1vcCwgVjg1MAotQGl0ZW0gY3RvZmYoKQotQ29tcHV0ZXMgdGhlIG9mZnNldCBvZiB0aGUgbmFtZWQgdmFyaWFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIENhbGwKLVRhYmxlIEFyZWEgKHdob2VzIGFkZHJlc3MgaXMgaGVsZyBpbiBzeXN0ZW0gcmVnaXN0ZXIgMjAsIHRoZSBDVEJQCi1yZWdpc3RlcikgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGEgNiBvciAxNiBiaXQgdW5zaWduZWQgdmFsdWUgaW4gdGhlCi1pbW1lZGlhdGUgZmllbGQgb2YgdGhlbiBnaXZlbiBpbnN0cnVjdGlvbiBvciBwaWVjZSBvZiBkYXRhLiAgRm9yCi1leGFtcGxlOgotCi0gICAgIEBzYW1we2NhbGx0IGN0b2ZmKHRhYmxlX2Z1bmMxKX0KLQotd2lsbCBwdXQgdGhlIGNhbGwgdGhlIGZ1bmN0aW9uIHdob2VzIGFkZHJlc3MgaXMgaGVsZCBpbiB0aGUgY2FsbCB0YWJsZQotYXQgdGhlIGxvY2F0aW9uIGxhYmVsZWQgJ3RhYmxlX2Z1bmMxJy4KLQotQGVuZCB0YWJsZQotCi0KLUZvciBpbmZvcm1hdGlvbiBvbiB0aGUgVjg1MCBpbnN0cnVjdGlvbiBzZXQsIHNlZSBAY2l0ZXtWODUwCi1GYW1pbHkgMzItLzE2LUJpdCBzaW5nbGUtQ2hpcCBNaWNyb2NvbnRyb2xsZXIgQXJjaGl0ZWN0dXJlIE1hbnVhbH0gZnJvbSBORUMuCi1MdGQuCi0KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy12YXgudGV4aSBiL2dhcy9kb2MvYy12YXgudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzZDdlNS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtdmF4LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYyBUaGlzIGlzIHBhcnQgb2YgdGhlIEdBUyBtYW51YWwuCi1AYyBGb3IgY29weWluZyBjb25kaXRpb25zLCBzZWUgdGhlIGZpbGUgYXMudGV4aW5mby4KLUBjIFZBWC9WTVMgZGVzY3JpcHRpb24gZXhoYW5jZWQgYW5kIGNvcnJlY3RlZCBieSBLbGF1cyBLImFlbXBmLCBra2FlbXBmQHByb2dpcy5kZQotQGlmc2V0IEdFTkVSSUMKLUBub2RlIFZheC1EZXBlbmRlbnQKLUBjaGFwdGVyIFZBWCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBjaW5kZXggVkFYIHN1cHBvcnQKLQotQGVuZCBpZnNldAotQGlmY2xlYXIgR0VORVJJQwotQG5vZGUgTWFjaGluZSBEZXBlbmRlbmNpZXMKLUBjaGFwdGVyIFZBWCBEZXBlbmRlbnQgRmVhdHVyZXMKLUBjaW5kZXggVkFYIHN1cHBvcnQKLQotQGVuZCBpZmNsZWFyCi0KLUBtZW51Ci0qIFZBWC1PcHRzOjogICAgICAgICAgICAgICAgICAgIFZBWCBDb21tYW5kLUxpbmUgT3B0aW9ucwotKiBWQVgtZmxvYXQ6OiAgICAgICAgICAgICAgICAgICBWQVggRmxvYXRpbmcgUG9pbnQKLSogVkFYLWRpcmVjdGl2ZXM6OiAgICAgICAgICAgICAgVmF4IE1hY2hpbmUgRGlyZWN0aXZlcwotKiBWQVgtb3Bjb2Rlczo6ICAgICAgICAgICAgICAgICBWQVggT3Bjb2RlcwotKiBWQVgtYnJhbmNoOjogICAgICAgICAgICAgICAgICBWQVggQnJhbmNoIEltcHJvdmVtZW50Ci0qIFZBWC1vcGVyYW5kczo6ICAgICAgICAgICAgICAgIFZBWCBPcGVyYW5kcwotKiBWQVgtbm86OiAgICAgICAgICAgICAgICAgICAgICBOb3QgU3VwcG9ydGVkIG9uIFZBWAotQGVuZCBtZW51Ci0KLQotQG5vZGUgVkFYLU9wdHMKLUBzZWN0aW9uIFZBWCBDb21tYW5kLUxpbmUgT3B0aW9ucwotCi1AY2luZGV4IGNvbW1hbmQtbGluZSBvcHRpb25zIGlnbm9yZWQsIFZBWAotQGNpbmRleCBWQVggY29tbWFuZC1saW5lIG9wdGlvbnMgaWdub3JlZAotVGhlIFZheCB2ZXJzaW9uIG9mIEBjb2Rle0B2YWx1ZXtBU319IGFjY2VwdHMgYW55IG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucywKLWdpdmVzIGEgd2FybmluZyBtZXNzYWdlIHRoYXQgdGhlIG9wdGlvbiB3YXMgaWdub3JlZCBhbmQgcHJvY2VlZHMuCi1UaGVzZSBvcHRpb25zIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNjcmlwdHMgZGVzaWduZWQgZm9yIG90aGVyCi1wZW9wbGUncyBhc3NlbWJsZXJzLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7LUR9LCBpZ25vcmVkIG9uIFZBWAotQGNpbmRleCBAY29kZXstU30sIGlnbm9yZWQgb24gVkFYCi1AY2luZGV4IEBjb2Rley1UfSwgaWdub3JlZCBvbiBWQVgKLUBpdGVtIEBjb2Rley1EfSAoRGVidWcpCi1AaXRlbXggQGNvZGV7LVN9IChTeW1ib2wgVGFibGUpCi1AaXRlbXggQGNvZGV7LVR9IChUb2tlbiBUcmFjZSkKLVRoZXNlIGFyZSBvYnNvbGV0ZSBvcHRpb25zIHVzZWQgdG8gZGVidWcgb2xkIGFzc2VtYmxlcnMuCi0KLUBjaW5kZXggQGNvZGV7LWR9LCBWQVggb3B0aW9uCi1AaXRlbSBAY29kZXstZH0gKERpc3BsYWNlbWVudCBzaXplIGZvciBKVU1QcykKLVRoaXMgb3B0aW9uIGV4cGVjdHMgYSBudW1iZXIgZm9sbG93aW5nIHRoZSBAc2FtcHstZH0uICBMaWtlIG9wdGlvbnMKLXRoYXQgZXhwZWN0IGZpbGVuYW1lcywgdGhlIG51bWJlciBtYXkgaW1tZWRpYXRlbHkgZm9sbG93IHRoZQotQHNhbXB7LWR9IChvbGQgc3RhbmRhcmQpIG9yIGNvbnN0aXR1dGUgdGhlIHdob2xlIG9mIHRoZSBjb21tYW5kIGxpbmUKLWFyZ3VtZW50IHRoYXQgZm9sbG93cyBAc2FtcHstZH0gKEBzY3tnbnV9IHN0YW5kYXJkKS4KLQotQGNpbmRleCBAY29kZXstVn0sIHJlZHVuZGFudCBvbiBWQVgKLUBpdGVtIEBjb2Rley1WfSAoVmlydHVhbGl6ZSBJbnRlcnBhc3MgVGVtcG9yYXJ5IEZpbGUpCi1Tb21lIG90aGVyIGFzc2VtYmxlcnMgdXNlIGEgdGVtcG9yYXJ5IGZpbGUuICBUaGlzIG9wdGlvbgotY29tbWFuZGVkIHRoZW0gdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gaW4gYWN0aXZlIG1lbW9yeSByYXRoZXIKLXRoYW4gaW4gYSBkaXNrIGZpbGUuICBAY29kZXtAdmFsdWV7QVN9fSBhbHdheXMgZG9lcyB0aGlzLCBzbyB0aGlzCi1vcHRpb24gaXMgcmVkdW5kYW50LgotCi1AY2luZGV4IEBjb2Rley1KfSwgaWdub3JlZCBvbiBWQVgKLUBpdGVtIEBjb2Rley1KfSAoSlVNUGlmeSBMb25nZXIgQnJhbmNoZXMpCi1NYW55IDMyLWJpdCBjb21wdXRlcnMgcGVybWl0IGEgdmFyaWV0eSBvZiBicmFuY2ggaW5zdHJ1Y3Rpb25zCi10byBkbyB0aGUgc2FtZSBqb2IuICBTb21lIG9mIHRoZXNlIGluc3RydWN0aW9ucyBhcmUgc2hvcnQgKGFuZAotZmFzdCkgYnV0IGhhdmUgYSBsaW1pdGVkIHJhbmdlOyBvdGhlcnMgYXJlIGxvbmcgKGFuZCBzbG93KSBidXQKLWNhbiBicmFuY2ggYW55d2hlcmUgaW4gdmlydHVhbCBtZW1vcnkuICBPZnRlbiB0aGVyZSBhcmUgMwotZmxhdm9ycyBvZiBicmFuY2g6IHNob3J0LCBtZWRpdW0gYW5kIGxvbmcuICBTb21lIG90aGVyCi1hc3NlbWJsZXJzIHdvdWxkIGVtaXQgc2hvcnQgYW5kIG1lZGl1bSBicmFuY2hlcywgdW5sZXNzIHRvbGQgYnkKLXRoaXMgb3B0aW9uIHRvIGVtaXQgc2hvcnQgYW5kIGxvbmcgYnJhbmNoZXMuCi0KLUBjaW5kZXggQGNvZGV7LXR9LCBpZ25vcmVkIG9uIFZBWAotQGl0ZW0gQGNvZGV7LXR9IChUZW1wb3JhcnkgRmlsZSBEaXJlY3RvcnkpCi1Tb21lIG90aGVyIGFzc2VtYmxlcnMgbWF5IHVzZSBhIHRlbXBvcmFyeSBmaWxlLCBhbmQgdGhpcyBvcHRpb24KLXRha2VzIGEgZmlsZW5hbWUgYmVpbmcgdGhlIGRpcmVjdG9yeSB0byBzaXRlIHRoZSB0ZW1wb3JhcnkKLWZpbGUuICBTaW5jZSBAY29kZXtAdmFsdWV7QVN9fSBkb2VzIG5vdCB1c2UgYSB0ZW1wb3JhcnkgZGlzayBmaWxlLCB0aGlzCi1vcHRpb24gbWFrZXMgbm8gZGlmZmVyZW5jZS4gIEBzYW1wey10fSBuZWVkcyBleGFjdGx5IG9uZQotZmlsZW5hbWUuCi1AZW5kIHRhYmxlCi0KLUBjaW5kZXggVk1TIChWQVgpIG9wdGlvbnMKLUBjaW5kZXggb3B0aW9ucyBmb3IgVkFYL1ZNUwotQGNpbmRleCBWQVgvVk1TIG9wdGlvbnMKLUBjaW5kZXggVmF4LTExIEMgY29tcGF0aWJpbGl0eQotQGNpbmRleCBzeW1ib2xzIHdpdGggdXBwZXJjYXNlLCBWQVgvVk1TCi1UaGUgVmF4IHZlcnNpb24gb2YgdGhlIGFzc2VtYmxlciBhY2NlcHRzIGFkZGl0aW9uYWwgb3B0aW9ucyB3aGVuCi1jb21waWxlZCBmb3IgVk1TOgotCi1AdGFibGUgQHNhbXAKLUBjaW5kZXggQHNhbXB7LWh9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLWggQHZhcntufQotRXh0ZXJuYWwgc3ltYm9sIG9yIHNlY3Rpb24gKHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXMpIG5hbWVzIGFyZSBub3QKLWNhc2Ugc2Vuc2l0aXZlIG9uIFZBWC9WTVMgYW5kIGFsd2F5cyBtYXBwZWQgdG8gdXBwZXIgY2FzZS4gIFRoaXMgaXMKLWNvbnRyYXJ5IHRvIHRoZSBDIGxhbmd1YWdlIGRlZmluaXRpb24gd2hpY2ggZXhwbGljaXRseSBkaXN0aW5ndWlzaGVzCi11cHBlciBhbmQgbG93ZXIgY2FzZS4gIFRvIGltcGxlbWVudCBhIHN0YW5kYXJkIGNvbmZvcm1pbmcgQyBjb21waWxlciwKLW5hbWVzIG11c3QgYmUgY2hhbmdlZCAobWFwcGVkKSB0byBwcmVzZXJ2ZSB0aGUgY2FzZSBpbmZvcm1hdGlvbi4gIFRoZQotZGVmYXVsdCBtYXBwaW5nIGlzIHRvIGNvbnZlcnQgYWxsIGxvd2VyIGNhc2UgY2hhcmFjdGVycyB0byB1cHBlcmNhc2UgYW5kCi1hZGRpbmcgYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhIDYgZGlnaXQgaGV4IHZhbHVlLCByZXByZXNlbnRpbmcgYSAyNAotZGlnaXQgYmluYXJ5IHZhbHVlLiAgVGhlIG9uZSBkaWdpdHMgaW4gdGhlIGJpbmFyeSB2YWx1ZSByZXByZXNlbnQgd2hpY2gKLWNoYXJhY3RlcnMgYXJlIHVwcGVyY2FzZSBpbiB0aGUgb3JpZ2luYWwgc3ltYm9sIG5hbWUuCi0KLVRoZSBAc2FtcHstaCBAdmFye259fSBvcHRpb24gZGV0ZXJtaW5lcyBob3cgd2UgbWFwIG5hbWVzLiAgVGhpcyB0YWtlcwotc2V2ZXJhbCB2YWx1ZXMuICBObyBAc2FtcHstaH0gc3dpdGNoIGF0IGFsbCBhbGxvd3MgY2FzZSBoYWNraW5nIGFzCi1kZXNjcmliZWQgYWJvdmUuICBBIHZhbHVlIG9mIHplcm8gKEBzYW1wey1oMH0pIGltcGxpZXMgbmFtZXMgc2hvdWxkIGJlCi11cHBlciBjYXNlLCBhbmQgaW5oaWJpdHMgdGhlIGNhc2UgaGFjay4gIEEgdmFsdWUgb2YgMiAoQHNhbXB7LWgyfSkKLWltcGxpZXMgbmFtZXMgc2hvdWxkIGJlIGFsbCBsb3dlciBjYXNlLCB3aXRoIG5vIGNhc2UgaGFjay4gIEEgdmFsdWUgb2YgMwotKEBzYW1wey1oM30pIGltcGxpZXMgdGhhdCBjYXNlIHNob3VsZCBiZSBwcmVzZXJ2ZWQuICBUaGUgdmFsdWUgMSBpcwotdW51c2VkLiAgVGhlIEBjb2Rley1IfSBvcHRpb24gZGlyZWN0cyBAY29kZXtAdmFsdWV7QVN9fSB0byBkaXNwbGF5Ci1ldmVyeSBtYXBwZWQgc3ltYm9sIGR1cmluZyBhc3NlbWJseS4KLQotU3ltYm9scyB3aG9zZSBuYW1lcyBpbmNsdWRlIGEgZG9sbGFyIHNpZ24gQHNhbXB7JH0gYXJlIGV4Y2VwdGlvbnMgdG8gdGhlCi1nZW5lcmFsIG5hbWUgbWFwcGluZy4gIFRoZXNlIHN5bWJvbHMgYXJlIG5vcm1hbGx5IG9ubHkgdXNlZCB0byByZWZlcmVuY2UKLVZNUyBsaWJyYXJ5IG5hbWVzLiAgU3VjaCBzeW1ib2xzIGFyZSBhbHdheXMgbWFwcGVkIHRvIHVwcGVyIGNhc2UuCi0KLUBjaW5kZXggQHNhbXB7LSt9IG9wdGlvbiwgVkFYL1ZNUwotQGl0ZW0gLSsKLVRoZSBAc2FtcHstK30gb3B0aW9uIGNhdXNlcyBAY29kZXtAdmFsdWV7QVN9fSB0byB0cnVuY2F0ZSBhbnkgc3ltYm9sCi1uYW1lIGxhcmdlciB0aGFuIDMxIGNoYXJhY3RlcnMuICBUaGUgQHNhbXB7LSt9IG9wdGlvbiBhbHNvIHByZXZlbnRzIHNvbWUKLWNvZGUgZm9sbG93aW5nIHRoZSBAc2FtcHtfbWFpbn0gc3ltYm9sIG5vcm1hbGx5IGFkZGVkIHRvIG1ha2UgdGhlIG9iamVjdAotZmlsZSBjb21wYXRpYmxlIHdpdGggVmF4LTExICJDIi4KLQotQGNpbmRleCBAc2FtcHstMX0gb3B0aW9uLCBWQVgvVk1TCi1AaXRlbSAtMQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIEBjb2Rle0B2YWx1ZXtBU319Ci12ZXJzaW9uIDEueC4KLQotQGNpbmRleCBAc2FtcHstSH0gb3B0aW9uLCBWQVgvVk1TCi1AaXRlbSAtSAotVGhlIEBzYW1wey1IfSBvcHRpb24gY2F1c2VzIEBjb2Rle0B2YWx1ZXtBU319IHRvIHByaW50IGV2ZXJ5IHN5bWJvbAotd2hpY2ggd2FzIGNoYW5nZWQgYnkgY2FzZSBtYXBwaW5nLgotQGVuZCB0YWJsZQotCi1Abm9kZSBWQVgtZmxvYXQKLUBzZWN0aW9uIFZBWCBGbG9hdGluZyBQb2ludAotCi1AY2luZGV4IFZBWCBmbG9hdGluZyBwb2ludAotQGNpbmRleCBmbG9hdGluZyBwb2ludCwgVkFYCi1Db252ZXJzaW9uIG9mIGZsb251bXMgdG8gZmxvYXRpbmcgcG9pbnQgaXMgY29ycmVjdCwgYW5kCi1jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgYXNzZW1ibGVycy4gIFJvdW5kaW5nIGlzCi10b3dhcmRzIHplcm8gaWYgdGhlIHJlbWFpbmRlciBpcyBleGFjdGx5IGhhbGYgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KLQotQGNvZGV7RH0sIEBjb2Rle0Z9LCBAY29kZXtHfSBhbmQgQGNvZGV7SH0gZmxvYXRpbmcgcG9pbnQgZm9ybWF0cwotYXJlIHVuZGVyc3Rvb2QuCi0KLUltbWVkaWF0ZSBmbG9hdGluZyBsaXRlcmFscyAoQGVtcGh7ZS5nLn0gQHNhbXB7U2AkNi45fSkKLWFyZSByZW5kZXJlZCBjb3JyZWN0bHkuICBBZ2Fpbiwgcm91bmRpbmcgaXMgdG93YXJkcyB6ZXJvIGluIHRoZQotYm91bmRhcnkgY2FzZS4KLQotQGNpbmRleCBAY29kZXtmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBjaW5kZXggQGNvZGV7ZG91YmxlfSBkaXJlY3RpdmUsIFZBWAotVGhlIEBjb2Rley5mbG9hdH0gZGlyZWN0aXZlIHByb2R1Y2VzIEBjb2Rle2Z9IGZvcm1hdCBudW1iZXJzLgotVGhlIEBjb2Rley5kb3VibGV9IGRpcmVjdGl2ZSBwcm9kdWNlcyBAY29kZXtkfSBmb3JtYXQgbnVtYmVycy4KLQotQG5vZGUgVkFYLWRpcmVjdGl2ZXMKLUBzZWN0aW9uIFZheCBNYWNoaW5lIERpcmVjdGl2ZXMKLQotQGNpbmRleCBtYWNoaW5lIGRpcmVjdGl2ZXMsIFZBWAotQGNpbmRleCBWQVggbWFjaGluZSBkaXJlY3RpdmVzCi1UaGUgVmF4IHZlcnNpb24gb2YgdGhlIGFzc2VtYmxlciBzdXBwb3J0cyBmb3VyIGRpcmVjdGl2ZXMgZm9yCi1nZW5lcmF0aW5nIFZheCBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuICBUaGV5IGFyZSBkZXNjcmliZWQgaW4gdGhlCi10YWJsZSBiZWxvdy4KLQotQGNpbmRleCB3aWRlIGZsb2F0aW5nIHBvaW50IGRpcmVjdGl2ZXMsIFZBWAotQHRhYmxlIEBjb2RlCi1AY2luZGV4IEBjb2Rle2RmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBpdGVtIC5kZmxvYXQKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kCi1hc3NlbWJsZXMgVmF4IEBjb2Rle2R9IGZvcm1hdCA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2ZmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBpdGVtIC5mZmxvYXQKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kCi1hc3NlbWJsZXMgVmF4IEBjb2Rle2Z9IGZvcm1hdCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2dmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBpdGVtIC5nZmxvYXQKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kCi1hc3NlbWJsZXMgVmF4IEBjb2Rle2d9IGZvcm1hdCA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzLgotCi1AY2luZGV4IEBjb2Rle2hmbG9hdH0gZGlyZWN0aXZlLCBWQVgKLUBpdGVtIC5oZmxvYXQKLVRoaXMgZXhwZWN0cyB6ZXJvIG9yIG1vcmUgZmxvbnVtcywgc2VwYXJhdGVkIGJ5IGNvbW1hcywgYW5kCi1hc3NlbWJsZXMgVmF4IEBjb2Rle2h9IGZvcm1hdCAxMjgtYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50cy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBWQVgtb3Bjb2RlcwotQHNlY3Rpb24gVkFYIE9wY29kZXMKLQotQGNpbmRleCBWQVggb3Bjb2RlIG1uZW1vbmljcwotQGNpbmRleCBvcGNvZGUgbW5lbW9uaWNzLCBWQVgKLUBjaW5kZXggbW5lbW9uaWNzIGZvciBvcGNvZGVzLCBWQVgKLUFsbCBERUMgbW5lbW9uaWNzIGFyZSBzdXBwb3J0ZWQuICBCZXdhcmUgdGhhdCBAY29kZXtjYXNlQGRvdHN7fX0KLWluc3RydWN0aW9ucyBoYXZlIGV4YWN0bHkgMyBvcGVyYW5kcy4gIFRoZSBkaXNwYXRjaCB0YWJsZSB0aGF0Ci1mb2xsb3dzIHRoZSBAY29kZXtjYXNlQGRvdHN7fX0gaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIG1hZGUgd2l0aAotQGNvZGV7LndvcmR9IHN0YXRlbWVudHMuICBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgdW5peAotYXNzZW1ibGVycyB3ZSBrbm93IG9mLgotCi1Abm9kZSBWQVgtYnJhbmNoCi1Ac2VjdGlvbiBWQVggQnJhbmNoIEltcHJvdmVtZW50Ci0KLUBjaW5kZXggVkFYIGJyYW5jaCBpbXByb3ZlbWVudAotQGNpbmRleCBicmFuY2ggaW1wcm92ZW1lbnQsIFZBWAotQGNpbmRleCBwc2V1ZG8tb3BzIGZvciBicmFuY2gsIFZBWAotQ2VydGFpbiBwc2V1ZG8gb3Bjb2RlcyBhcmUgcGVybWl0dGVkLiAgVGhleSBhcmUgZm9yIGJyYW5jaAotaW5zdHJ1Y3Rpb25zLiAgVGhleSBleHBhbmQgdG8gdGhlIHNob3J0ZXN0IGJyYW5jaCBpbnN0cnVjdGlvbiB0aGF0Ci1yZWFjaGVzIHRoZSB0YXJnZXQuICBHZW5lcmFsbHkgdGhlc2UgbW5lbW9uaWNzIGFyZSBtYWRlIGJ5Ci1zdWJzdGl0dXRpbmcgQHNhbXB7an0gZm9yIEBzYW1we2J9IGF0IHRoZSBzdGFydCBvZiBhIERFQyBtbmVtb25pYy4KLVRoaXMgZmVhdHVyZSBpcyBpbmNsdWRlZCBib3RoIGZvciBjb21wYXRpYmlsaXR5IGFuZCB0byBoZWxwCi1jb21waWxlcnMuICBJZiB5b3UgZG8gbm90IG5lZWQgdGhpcyBmZWF0dXJlLCBhdm9pZCB0aGVzZQotb3Bjb2Rlcy4gIEhlcmUgYXJlIHRoZSBtbmVtb25pY3MsIGFuZCB0aGUgY29kZSB0aGV5IGNhbiBleHBhbmQgaW50by4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBqYnNiCi1Ac2FtcHtKc2J9IGlzIGFscmVhZHkgYW4gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMsIHNvIHdlIGNob3NlIEBzYW1we2pic2J9LgotQHRhYmxlIEBhc2lzCi1AaXRlbSAoYnl0ZSBkaXNwbGFjZW1lbnQpCi1Aa2Jke2JzYmIgQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBrYmR7YnNidyBAZG90c3t9fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGtiZHtqc2IgQGRvdHN7fX0KLUBlbmQgdGFibGUKLUBpdGVtIGpicgotQGl0ZW14IGpyCi1VbmNvbmRpdGlvbmFsIGJyYW5jaC4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHticmIgQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBrYmR7YnJ3IEBkb3Rze319Ci1AaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCi1Aa2Jke2ptcCBAZG90c3t9fQotQGVuZCB0YWJsZQotQGl0ZW0gakB2YXJ7Q09ORH0KLUB2YXJ7Q09ORH0gbWF5IGJlIGFueSBvbmUgb2YgdGhlIGNvbmRpdGlvbmFsIGJyYW5jaGVzCi1AY29kZXtuZXF9LCBAY29kZXtuZXF1fSwgQGNvZGV7ZXFsfSwgQGNvZGV7ZXFsdX0sIEBjb2Rle2d0cn0sCi1AY29kZXtnZXF9LCBAY29kZXtsc3N9LCBAY29kZXtndHJ1fSwgQGNvZGV7bGVxdX0sIEBjb2Rle3ZjfSwgQGNvZGV7dnN9LAotQGNvZGV7Z2VxdX0sIEBjb2Rle2NjfSwgQGNvZGV7bHNzdX0sIEBjb2Rle2NzfS4KLUB2YXJ7Q09ORH0gbWF5IGFsc28gYmUgb25lIG9mIHRoZSBiaXQgdGVzdHMKLUBjb2Rle2JzfSwgQGNvZGV7YmN9LCBAY29kZXtic3N9LCBAY29kZXtiY3N9LCBAY29kZXtic2N9LCBAY29kZXtiY2N9LAotQGNvZGV7YnNzaX0sIEBjb2Rle2JjY2l9LCBAY29kZXtsYnN9LCBAY29kZXtsYmN9LgotQHZhcntOT1RDT05EfSBpcyB0aGUgb3Bwb3NpdGUgY29uZGl0aW9uIHRvIEB2YXJ7Q09ORH0uCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7YkB2YXJ7Q09ORH0gQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBrYmR7YkB2YXJ7Tk9UQ09ORH0gZm9vIDsgYnJ3IEBkb3Rze30gOyBmb286fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGtiZHtiQHZhcntOT1RDT05EfSBmb28gOyBqbXAgQGRvdHN7fSA7IGZvbzp9Ci1AZW5kIHRhYmxlCi1AaXRlbSBqYWNiQHZhcntYfQotQHZhcntYfSBtYXkgYmUgb25lIG9mIEBjb2Rle2IgZCBmIGcgaCBsIHd9LgotQHRhYmxlIEBhc2lzCi1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1Aa2Jke0B2YXJ7T1BDT0RFfSBAZG90c3t9fQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGptcCBAZG90c3t9IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQotQGl0ZW0gamFvYkB2YXJ7WVlZfQotQHZhcntZWVl9IG1heSBiZSBvbmUgb2YgQGNvZGV7bHNzIGxlcX0uCi1AaXRlbSBqc29iQHZhcntaWlp9Ci1AdmFye1paWn0gbWF5IGJlIG9uZSBvZiBAY29kZXtnZXEgZ3RyfS4KLUB0YWJsZSBAYXNpcwotQGl0ZW0gKGJ5dGUgZGlzcGxhY2VtZW50KQotQGtiZHtAdmFye09QQ09ERX0gQGRvdHN7fX0KLUBpdGVtICh3b3JkIGRpc3BsYWNlbWVudCkKLUBleGFtcGxlCi1AdmFye09QQ09ERX0gQGRvdHN7fSwgZm9vIDsKLWJyYiBiYXIgOwotZm9vOiBicncgQHZhcntkZXN0aW5hdGlvbn0gOwotYmFyOgotQGVuZCBleGFtcGxlCi1AaXRlbSAobG9uZyBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogam1wIEB2YXJ7ZGVzdGluYXRpb259IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQotQGl0ZW0gYW9ibGVxCi1AaXRlbXggYW9ibHNzCi1AaXRlbXggc29iZ2VxCi1AaXRlbXggc29iZ3RyCi1AdGFibGUgQGFzaXMKLUBpdGVtIChieXRlIGRpc3BsYWNlbWVudCkKLUBrYmR7QHZhcntPUENPREV9IEBkb3Rze319Ci1AaXRlbSAod29yZCBkaXNwbGFjZW1lbnQpCi1AZXhhbXBsZQotQHZhcntPUENPREV9IEBkb3Rze30sIGZvbyA7Ci1icmIgYmFyIDsKLWZvbzogYnJ3IEB2YXJ7ZGVzdGluYXRpb259IDsKLWJhcjoKLUBlbmQgZXhhbXBsZQotQGl0ZW0gKGxvbmcgZGlzcGxhY2VtZW50KQotQGV4YW1wbGUKLUB2YXJ7T1BDT0RFfSBAZG90c3t9LCBmb28gOwotYnJiIGJhciA7Ci1mb286IGptcCBAdmFye2Rlc3RpbmF0aW9ufSA7Ci1iYXI6Ci1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLUBlbmQgdGFibGUKLQotQG5vZGUgVkFYLW9wZXJhbmRzCi1Ac2VjdGlvbiBWQVggT3BlcmFuZHMKLQotQGNpbmRleCBWQVggb3BlcmFuZCBub3RhdGlvbgotQGNpbmRleCBvcGVyYW5kIG5vdGF0aW9uLCBWQVgKLUBjaW5kZXggaW1tZWRpYXRlIGNoYXJhY3RlciwgVkFYCi1AY2luZGV4IFZBWCBpbW1lZGlhdGUgY2hhcmFjdGVyCi1UaGUgaW1tZWRpYXRlIGNoYXJhY3RlciBpcyBAc2FtcHskfSBmb3IgVW5peCBjb21wYXRpYmlsaXR5LCBub3QKLUBzYW1weyN9IGFzIERFQyB3cml0ZXMgaXQuCi0KLUBjaW5kZXggaW5kaXJlY3QgY2hhcmFjdGVyLCBWQVgKLUBjaW5kZXggVkFYIGluZGlyZWN0IGNoYXJhY3RlcgotVGhlIGluZGlyZWN0IGNoYXJhY3RlciBpcyBAc2FtcHsqfSBmb3IgVW5peCBjb21wYXRpYmlsaXR5LCBub3QKLUBzYW1we0BAfSBhcyBERUMgd3JpdGVzIGl0LgotCi1AY2luZGV4IGRpc3BsYWNlbWVudCBzaXppbmcgY2hhcmFjdGVyLCBWQVgKLUBjaW5kZXggVkFYIGRpc3BsYWNlbWVudCBzaXppbmcgY2hhcmFjdGVyCi1UaGUgZGlzcGxhY2VtZW50IHNpemluZyBjaGFyYWN0ZXIgaXMgQHNhbXB7YH0gKGFuIGFjY2VudCBncmF2ZSkgZm9yCi1Vbml4IGNvbXBhdGliaWxpdHksIG5vdCBAc2FtcHtefSBhcyBERUMgd3JpdGVzIGl0LiAgVGhlIGxldHRlcgotcHJlY2VkaW5nIEBzYW1we2B9IG1heSBoYXZlIGVpdGhlciBjYXNlLiAgQHNhbXB7R30gaXMgbm90Ci11bmRlcnN0b29kLCBidXQgYWxsIG90aGVyIGxldHRlcnMgKEBjb2Rle2IgaSBsIHMgd30pIGFyZSB1bmRlcnN0b29kLgotCi1AY2luZGV4IHJlZ2lzdGVyIG5hbWVzLCBWQVgKLUBjaW5kZXggVkFYIHJlZ2lzdGVyIG5hbWVzCi1SZWdpc3RlciBuYW1lcyB1bmRlcnN0b29kIGFyZSBAY29kZXtyMCByMSByMiBAZG90c3t9IHIxNSBhcCBmcCBzcAotcGN9LiAgVXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycyBhcmUgZXF1aXZhbGVudC4KLQotRm9yIGluc3RhbmNlCi1Ac21hbGxleGFtcGxlCi10c3RiICp3YCQ0KHI1KQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQW55IGV4cHJlc3Npb24gaXMgcGVybWl0dGVkIGluIGFuIG9wZXJhbmQuICBPcGVyYW5kcyBhcmUgY29tbWEKLXNlcGFyYXRlZC4KLQotQGMgVGhlcmUgaXMgc29tZSBidWcgdG8gZG8gd2l0aCByZWNvZ25pemluZyBleHByZXNzaW9ucwotQGMgaW4gb3BlcmFuZHMsIGJ1dCBJIGZvcmdldCB3aGF0IGl0IGlzLiAgSXQgaXMKLUBjIGEgc3ludGF4IGNsYXNoIGJlY2F1c2UgKCkgaXMgdXNlZCBhcyBhbiBhZGRyZXNzIG1vZGUKLUBjIGFuZCB0byBlbmNhcHN1bGF0ZSBzdWItZXhwcmVzc2lvbnMuCi0KLUBub2RlIFZBWC1ubwotQHNlY3Rpb24gTm90IFN1cHBvcnRlZCBvbiBWQVgKLQotQGNpbmRleCBWQVggYml0ZmllbGRzIG5vdCBzdXBwb3J0ZWQKLUBjaW5kZXggYml0ZmllbGRzLCBub3Qgc3VwcG9ydGVkIG9uIFZBWAotVmF4IGJpdCBmaWVsZHMgY2FuIG5vdCBiZSBhc3NlbWJsZWQgd2l0aCBAY29kZXtAdmFsdWV7QVN9fS4gIFNvbWVvbmUKLWNhbiBhZGQgdGhlIHJlcXVpcmVkIGNvZGUgaWYgdGhleSByZWFsbHkgbmVlZCBpdC4KZGlmZiAtLWdpdCBhL2dhcy9kb2MvYy16OGsudGV4aSBiL2dhcy9kb2MvYy16OGsudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiMTBlMy4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2MtejhrLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotQGMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQGMgVGhpcyBpcyBwYXJ0IG9mIHRoZSBHQVMgbWFudWFsLgotQGMgRm9yIGNvcHlpbmcgY29uZGl0aW9ucywgc2VlIHRoZSBmaWxlIGFzLnRleGluZm8uCi1AaWZzZXQgR0VORVJJQwotQHBhZ2UKLUBub2RlIFo4MDAwLURlcGVuZGVudAotQGNoYXB0ZXIgWjgwMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1Abm9kZSBNYWNoaW5lIERlcGVuZGVuY2llcwotQGNoYXB0ZXIgWjgwMDAgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmY2xlYXIKLQotQGNpbmRleCBaODAwMCBzdXBwb3J0Ci1UaGUgWjgwMDAgQHZhbHVle0FTfSBzdXBwb3J0cyBib3RoIG1lbWJlcnMgb2YgdGhlIFo4MDAwIGZhbWlseTogdGhlCi11bnNlZ21lbnRlZCBaODAwMiwgd2l0aCAxNiBiaXQgYWRkcmVzc2VzLCBhbmQgdGhlIHNlZ21lbnRlZCBaODAwMSB3aXRoCi0yNCBiaXQgYWRkcmVzc2VzLgotCi1XaGVuIHRoZSBhc3NlbWJsZXIgaXMgaW4gdW5zZWdtZW50ZWQgbW9kZSAoc3BlY2lmaWVkIHdpdGggdGhlCi1AY29kZXt1bnNlZ219IGRpcmVjdGl2ZSksIGFuIGFkZHJlc3MgdGFrZXMgdXAgb25lIHdvcmQgKDE2IGJpdCkKLXNpemVkIHJlZ2lzdGVyLiAgV2hlbiB0aGUgYXNzZW1ibGVyIGlzIGluIHNlZ21lbnRlZCBtb2RlIChzcGVjaWZpZWQgd2l0aAotdGhlIEBjb2Rle3NlZ219IGRpcmVjdGl2ZSksIGEgMjQtYml0IGFkZHJlc3MgdGFrZXMgdXAgYSBsb25nICgzMiBiaXQpCi1yZWdpc3Rlci4gIEB4cmVme1o4MDAwIERpcmVjdGl2ZXMsLEFzc2VtYmxlciBEaXJlY3RpdmVzIGZvciB0aGUgWjgwMDB9LAotZm9yIGEgbGlzdCBvZiBvdGhlciBaODAwMCBzcGVjaWZpYyBhc3NlbWJsZXIgZGlyZWN0aXZlcy4KLQotQG1lbnUKLSogWjgwMDAgT3B0aW9uczo6ICAgICAgICAgICAgICAgTm8gc3BlY2lhbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgWjgwMDAKLSogWjgwMDAgU3ludGF4OjogICAgICAgICAgICAgICAgQXNzZW1ibGVyIHN5bnRheCBmb3IgdGhlIFo4MDAwCi0qIFo4MDAwIERpcmVjdGl2ZXM6OiAgICAgICAgICAgIFNwZWNpYWwgZGlyZWN0aXZlcyBmb3IgdGhlIFo4MDAwCi0qIFo4MDAwIE9wY29kZXM6OiAgICAgICAgICAgICAgIE9wY29kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBaODAwMCBPcHRpb25zCi1Ac2VjdGlvbiBPcHRpb25zCi0KLUBjaW5kZXggWjgwMDAgb3B0aW9ucwotQGNpbmRleCBvcHRpb25zLCBaODAwMAotQGNvZGV7QHZhbHVle0FTfX0gaGFzIG5vIGFkZGl0aW9uYWwgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIHRoZSBaaWxvZwotWjgwMDAgZmFtaWx5LgotCi1Abm9kZSBaODAwMCBTeW50YXgKLUBzZWN0aW9uIFN5bnRheAotQG1lbnUKLSogWjgwMDAtQ2hhcnM6OiAgICAgICAgICAgICAgICBTcGVjaWFsIENoYXJhY3RlcnMKLSogWjgwMDAtUmVnczo6ICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcwotKiBaODAwMC1BZGRyZXNzaW5nOjogICAgICAgICAgIEFkZHJlc3NpbmcgTW9kZXMKLUBlbmQgbWVudQotCi1Abm9kZSBaODAwMC1DaGFycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBDaGFyYWN0ZXJzCi0KLUBjaW5kZXggbGluZSBjb21tZW50IGNoYXJhY3RlciwgWjgwMDAKLUBjaW5kZXggWjgwMDAgbGluZSBjb21tZW50IGNoYXJhY3RlcgotQHNhbXB7IX0gaXMgdGhlIGxpbmUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLUBjaW5kZXggbGluZSBzZXBhcmF0b3IsIFo4MDAwCi1AY2luZGV4IHN0YXRlbWVudCBzZXBhcmF0b3IsIFo4MDAwCi1AY2luZGV4IFo4MDAwIGxpbmUgc2VwYXJhdG9yCi1Zb3UgY2FuIHVzZSBAc2FtcHs7fSBpbnN0ZWFkIG9mIGEgbmV3bGluZSB0byBzZXBhcmF0ZSBzdGF0ZW1lbnRzLgotCi1Abm9kZSBaODAwMC1SZWdzCi1Ac3Vic2VjdGlvbiBSZWdpc3RlciBOYW1lcwotCi1AY2luZGV4IFo4MDAwIHJlZ2lzdGVycwotQGNpbmRleCByZWdpc3RlcnMsIFo4MDAwCi1UaGUgWjgwMDAgaGFzIHNpeHRlZW4gMTYgYml0IHJlZ2lzdGVycywgbnVtYmVyZWQgMCB0byAxNS4gIFlvdSBjYW4gcmVmZXIKLXRvIGRpZmZlcmVudCBzaXplZCBncm91cHMgb2YgcmVnaXN0ZXJzIGJ5IHJlZ2lzdGVyIG51bWJlciwgd2l0aCB0aGUKLXByZWZpeCBAc2FtcHtyfSBmb3IgMTYgYml0IHJlZ2lzdGVycywgQHNhbXB7cnJ9IGZvciAzMiBiaXQgcmVnaXN0ZXJzIGFuZAotQHNhbXB7cnF9IGZvciA2NCBiaXQgcmVnaXN0ZXJzLiAgWW91IGNhbiBhbHNvIHJlZmVyIHRvIHRoZSBjb250ZW50cyBvZgotdGhlIGZpcnN0IGVpZ2h0IChvZiB0aGUgc2l4dGVlbiAxNiBiaXQgcmVnaXN0ZXJzKSBieSBieXRlcy4gIFRoZXkgYXJlCi1uYW1lZCBAc2FtcHtyQHZhcntufWh9IGFuZCBAc2FtcHtyQHZhcntufWx9LgotCi1Ac21hbGxleGFtcGxlCi1AZXhkZW50IEBlbXBoe2J5dGUgcmVnaXN0ZXJzfQotcjBsIHIwaCByMWggcjFsIHIyaCByMmwgcjNoIHIzbAotcjRoIHI0bCByNWggcjVsIHI2aCByNmwgcjdoIHI3bAotCi1AZXhkZW50IEBlbXBoe3dvcmQgcmVnaXN0ZXJzfQotcjAgcjEgcjIgcjMgcjQgcjUgcjYgcjcgcjggcjkgcjEwIHIxMSByMTIgcjEzIHIxNCByMTUKLQotQGV4ZGVudCBAZW1waHtsb25nIHdvcmQgcmVnaXN0ZXJzfQotcnIwIHJyMiBycjQgcnI2IHJyOCBycjEwIHJyMTIgcnIxNAotCi1AZXhkZW50IEBlbXBoe3F1YWQgd29yZCByZWdpc3RlcnN9Ci1ycTAgcnE0IHJxOCBycTEyCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBaODAwMC1BZGRyZXNzaW5nCi1Ac3Vic2VjdGlvbiBBZGRyZXNzaW5nIE1vZGVzCi0KLUBjaW5kZXggYWRkcmVzc2luZyBtb2RlcywgWjgwMDAKLUBjaW5kZXggWjgwMCBhZGRyZXNzaW5nIG1vZGVzCi1AdmFsdWV7QVN9IHVuZGVyc3RhbmRzIHRoZSBmb2xsb3dpbmcgYWRkcmVzc2luZyBtb2RlcyBmb3IgdGhlIFo4MDAwOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHJAdmFye259Ci1SZWdpc3RlciBkaXJlY3QKLQotQGl0ZW0gQEByQHZhcntufQotSW5kaXJlY3QgcmVnaXN0ZXIKLQotQGl0ZW0gQHZhcnthZGRyfQotRGlyZWN0OiB0aGUgMTYgYml0IG9yIDI0IGJpdCBhZGRyZXNzIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYXNzZW1ibGVyCi1pcyBpbiBzZWdtZW50ZWQgb3IgdW5zZWdtZW50ZWQgbW9kZSkgb2YgdGhlIG9wZXJhbmQgaXMgaW4gdGhlIGluc3RydWN0aW9uLgotCi1AaXRlbSBhZGRyZXNzKHJAdmFye259KQotSW5kZXhlZDogdGhlIDE2IG9yIDI0IGJpdCBhZGRyZXNzIGlzIGFkZGVkIHRvIHRoZSAxNiBiaXQgcmVnaXN0ZXIgdG8gcHJvZHVjZQotdGhlIGZpbmFsIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSBvcGVyYW5kLgotCi1AaXRlbSByQHZhcntufSgjQHZhcntpbW19KQotQmFzZSBBZGRyZXNzOiB0aGUgMTYgb3IgMjQgYml0IHJlZ2lzdGVyIGlzIGFkZGVkIHRvIHRoZSAxNiBiaXQgc2lnbgotZXh0ZW5kZWQgaW1tZWRpYXRlIGRpc3BsYWNlbWVudCB0byBwcm9kdWNlIHRoZSBmaW5hbCBhZGRyZXNzIGluIG1lbW9yeQotb2YgdGhlIG9wZXJhbmQuCi0KLUBpdGVtIHJAdmFye259KHJAdmFye219KQotQmFzZSBJbmRleDogdGhlIDE2IG9yIDI0IGJpdCByZWdpc3RlciByQHZhcntufSBpcyBhZGRlZCB0byB0aGUgc2lnbgotZXh0ZW5kZWQgMTYgYml0IGluZGV4IHJlZ2lzdGVyIHJAdmFye219IHRvIHByb2R1Y2UgdGhlIGZpbmFsIGFkZHJlc3MgaW4KLW1lbW9yeSBvZiB0aGUgb3BlcmFuZC4KLQotQGl0ZW0gI0B2YXJ7eHh9Ci1JbW1lZGlhdGUgZGF0YSBAdmFye3h4fS4KLUBlbmQgdGFibGUKLQotQG5vZGUgWjgwMDAgRGlyZWN0aXZlcwotQHNlY3Rpb24gQXNzZW1ibGVyIERpcmVjdGl2ZXMgZm9yIHRoZSBaODAwMAotCi1AY2luZGV4IFo4MDAwIGRpcmVjdGl2ZXMKLUBjaW5kZXggZGlyZWN0aXZlcywgWjgwMDAKLVRoZSBaODAwMCBwb3J0IG9mIEB2YWx1ZXtBU30gaW5jbHVkZXMgdGhlc2UgYWRkaXRpb25hbCBhc3NlbWJsZXIgZGlyZWN0aXZlcywKLWZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgWjgwMDAgYXNzZW1ibGVycy4gIEFzIHNob3duLCB0aGVzZSBkbyBub3QKLWJlZ2luIHdpdGggQHNhbXB7Ln0gKHVubGlrZSB0aGUgb3JkaW5hcnkgQHZhbHVle0FTfSBkaXJlY3RpdmVzKS4KLQotQHRhYmxlIEBjb2RlCi1Aa2luZGV4IHNlZ20KLUBpdGVtIHNlZ20KLUdlbmVyYXRlcyBjb2RlIGZvciB0aGUgc2VnbWVudGVkIFo4MDAxLgotCi1Aa2luZGV4IHVuc2VnbQotQGl0ZW0gdW5zZWdtCi1HZW5lcmF0ZXMgY29kZSBmb3IgdGhlIHVuc2VnbWVudGVkIFo4MDAyLgotCi1Aa2luZGV4IG5hbWUKLUBpdGVtIG5hbWUKLVN5bm9ueW0gZm9yIEBjb2Rley5maWxlfQotCi1Aa2luZGV4IGdsb2JhbAotQGl0ZW0gZ2xvYmFsCi1TeW5vbnltIGZvciBAY29kZXsuZ2xvYmFsfQotCi1Aa2luZGV4IHd2YWwKLUBpdGVtIHd2YWwKLVN5bm9ueW0gZm9yIEBjb2Rley53b3JkfQotCi1Aa2luZGV4IGx2YWwKLUBpdGVtIGx2YWwKLVN5bm9ueW0gZm9yIEBjb2Rley5sb25nfQotCi1Aa2luZGV4IGJ2YWwKLUBpdGVtIGJ2YWwKLVN5bm9ueW0gZm9yIEBjb2Rley5ieXRlfQotCi1Aa2luZGV4IHN2YWwKLUBpdGVtIHN2YWwKLUFzc2VtYmxlIGEgc3RyaW5nLiAgQGNvZGV7c3ZhbH0gZXhwZWN0cyBvbmUgc3RyaW5nIGxpdGVyYWwsIGRlbGltaXRlZCBieQotc2luZ2xlIHF1b3Rlcy4gIEl0IGFzc2VtYmxlcyBlYWNoIGJ5dGUgb2YgdGhlIHN0cmluZyBpbnRvIGNvbnNlY3V0aXZlCi1hZGRyZXNzZXMuICBZb3UgY2FuIHVzZSB0aGUgZXNjYXBlIHNlcXVlbmNlIEBzYW1weyVAdmFye3h4fX0gKHdoZXJlCi1AdmFye3h4fSByZXByZXNlbnRzIGEgdHdvLWRpZ2l0IGhleGFkZWNpbWFsIG51bWJlcikgdG8gcmVwcmVzZW50IHRoZQotY2hhcmFjdGVyIHdob3NlIEBzY3thc2NpaX0gdmFsdWUgaXMgQHZhcnt4eH0uICBVc2UgdGhpcyBmZWF0dXJlIHRvCi1kZXNjcmliZSBzaW5nbGUgcXVvdGUgYW5kIG90aGVyIGNoYXJhY3RlcnMgdGhhdCBtYXkgbm90IGFwcGVhciBpbiBzdHJpbmcKLWxpdGVyYWxzIGFzIHRoZW1zZWx2ZXMuICBGb3IgZXhhbXBsZSwgdGhlIEMgc3RhdGVtZW50IEB3e0BzYW1we2NoYXIgKmEgPQotImhlIHNhaWQgXCJpdCdzIDUwJSBvZmZcIiI7fX0gaXMgcmVwcmVzZW50ZWQgaW4gWjgwMDAgYXNzZW1ibHkgbGFuZ3VhZ2UKLShzaG93biB3aXRoIHRoZSBhc3NlbWJsZXIgb3V0cHV0IGluIGhleCBhdCB0aGUgbGVmdCkgYXMKLQotQGlmdGV4Ci1AYmVnaW5ncm91cAotQGxldEBub25hcnJvd2luZz1AY29tbWVudAotQGVuZCBpZnRleAotQHNtYWxsZXhhbXBsZQotNjg2NTIwNzMgICAgc3ZhbCAgICAnaGUgc2FpZCAlMjJpdCUyN3MgNTAlMjUgb2ZmJTIyJTAwJwotNjE2OTY0MjAKLTIyNjk3NDI3Ci03MzIwMzUzMAotMjUyMDZGNjYKLTY2MjIwMAotQGVuZCBzbWFsbGV4YW1wbGUKLUBpZnRleAotQGVuZGdyb3VwCi1AZW5kIGlmdGV4Ci0KLUBraW5kZXggcnNlY3QKLUBpdGVtIHJzZWN0Ci1zeW5vbnltIGZvciBAY29kZXsuc2VjdGlvbn0KLQotQGtpbmRleCBibG9jawotQGl0ZW0gYmxvY2sKLXN5bm9ueW0gZm9yIEBjb2Rley5zcGFjZX0KLQotQGtpbmRleCBldmVuCi1AaXRlbSBldmVuCi1zcGVjaWFsIGNhc2Ugb2YgQGNvZGV7LmFsaWdufTsgYWxpZ25zIG91dHB1dCB0byBldmVuIGJ5dGUgYm91bmRhcnkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIFo4MDAwIE9wY29kZXMKLUBzZWN0aW9uIE9wY29kZXMKLQotQGNpbmRleCBaODAwMCBvcGNvZGUgc3VtbWFyeQotQGNpbmRleCBvcGNvZGUgc3VtbWFyeSwgWjgwMDAKLUBjaW5kZXggbW5lbW9uaWNzLCBaODAwMAotQGNpbmRleCBpbnN0cnVjdGlvbiBzdW1tYXJ5LCBaODAwMAotRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBaODAwMCBtYWNoaW5lIGluc3RydWN0aW9uIHNldCwgc2VlCi1AY2l0ZXtaODAwMCBUZWNobmljYWwgTWFudWFsfS4KLQotQGlmc2V0IFNNQUxMCi1AYyB0aGlzIHRhYmxlLCBkdWUgdG8gdGhlIG11bHRpLWNvbCBmYWtpbmcgYW5kIGhhcmRjb2RlZCBvcmRlciwgbG9va3Mgc2lsbHkKLUBjIGV4Y2VwdCBpbiBzbWFsbGJvb2suICBTZWUgY29tbWVudHMgYmVsb3cgIkBzZXQgU01BTEwiIG5lYXIgdG9wIG9mIHRoaXMgZmlsZS4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGNvZGVzIGFuZCB0aGVpciBhcmd1bWVudHM6Ci1AaWZ0ZXgKLUBiZWdpbmdyb3VwCi1AbGV0QG5vbmFycm93aW5nPUBjb21tZW50Ci1AZW5kIGlmdGV4Ci1Ac21hbGxleGFtcGxlCi0KLSAgICAgICAgICAgIHJzICAgQHJ7MTYgYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJkICAgQHJ7MTYgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgcmJzICAgQHJ7OCBiaXQgc291cmNlIHJlZ2lzdGVyfQotICAgICAgICAgICAgcmJkICAgQHJ7OCBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXJ9Ci0gICAgICAgICAgICBycnMgICBAcnszMiBiaXQgc291cmNlIHJlZ2lzdGVyfQotICAgICAgICAgICAgcnJkICAgQHJ7MzIgYml0IGRlc3RpbmF0aW9uIHJlZ2lzdGVyfQotICAgICAgICAgICAgcnFzICAgQHJ7NjQgYml0IHNvdXJjZSByZWdpc3Rlcn0KLSAgICAgICAgICAgIHJxZCAgIEByezY0IGJpdCBkZXN0aW5hdGlvbiByZWdpc3Rlcn0KLSAgICAgICAgICAgIGFkZHIgQHJ7MTYvMjQgYml0IGFkZHJlc3N9Ci0gICAgICAgICAgICBpbW0gIEBye2ltbWVkaWF0ZSBkYXRhfQotCi1hZGMgcmQscnMgICAgICAgICAgICAgICBjbHJiIGFkZHIgICAgICAgICAgICAgICBjcHNpciBAQHJkLEBAcnMscnIsY2MKLWFkY2IgcmJkLHJicyAgICAgICAgICAgIGNscmIgYWRkcihyZCkgICAgICAgICAgIGNwc2lyYiBAQHJkLEBAcnMscnIsY2MKLWFkZCByZCxAQHJzICAgICAgICAgICAgICBjbHJiIHJiZCAgICAgICAgICAgICAgICBkYWIgcmJkCi1hZGQgcmQsYWRkciAgICAgICAgICAgICBjb20gQEByZCAgICAgICAgICAgICAgICAgZGJqbnogcmJkLGRpc3A3Ci1hZGQgcmQsYWRkcihycykgICAgICAgICBjb20gYWRkciAgICAgICAgICAgICAgICBkZWMgQEByZCxpbW00bTEKLWFkZCByZCxpbW0xNiAgICAgICAgICAgIGNvbSBhZGRyKHJkKSAgICAgICAgICAgIGRlYyBhZGRyKHJkKSxpbW00bTEKLWFkZCByZCxycyAgICAgICAgICAgICAgIGNvbSByZCAgICAgICAgICAgICAgICAgIGRlYyBhZGRyLGltbTRtMQotYWRkYiByYmQsQEBycyAgICAgICAgICAgIGNvbWIgQEByZCAgICAgICAgICAgICAgICBkZWMgcmQsaW1tNG0xCi1hZGRiIHJiZCxhZGRyICAgICAgICAgICBjb21iIGFkZHIgICAgICAgICAgICAgICBkZWNiIEBAcmQsaW1tNG0xCi1hZGRiIHJiZCxhZGRyKHJzKSAgICAgICBjb21iIGFkZHIocmQpICAgICAgICAgICBkZWNiIGFkZHIocmQpLGltbTRtMQotYWRkYiByYmQsaW1tOCAgICAgICAgICAgY29tYiByYmQgICAgICAgICAgICAgICAgZGVjYiBhZGRyLGltbTRtMQotYWRkYiByYmQscmJzICAgICAgICAgICAgY29tZmxnIGZsYWdzICAgICAgICAgICAgZGVjYiByYmQsaW1tNG0xCi1hZGRsIHJyZCxAQHJzICAgICAgICAgICAgY3AgQEByZCxpbW0xNiAgICAgICAgICAgIGRpIGkyCi1hZGRsIHJyZCxhZGRyICAgICAgICAgICBjcCBhZGRyKHJkKSxpbW0xNiAgICAgICBkaXYgcnJkLEBAcnMKLWFkZGwgcnJkLGFkZHIocnMpICAgICAgIGNwIGFkZHIsaW1tMTYgICAgICAgICAgIGRpdiBycmQsYWRkcgotYWRkbCBycmQsaW1tMzIgICAgICAgICAgY3AgcmQsQEBycyAgICAgICAgICAgICAgIGRpdiBycmQsYWRkcihycykKLWFkZGwgcnJkLHJycyAgICAgICAgICAgIGNwIHJkLGFkZHIgICAgICAgICAgICAgIGRpdiBycmQsaW1tMTYKLWFuZCByZCxAQHJzICAgICAgICAgICAgICBjcCByZCxhZGRyKHJzKSAgICAgICAgICBkaXYgcnJkLHJzCi1hbmQgcmQsYWRkciAgICAgICAgICAgICBjcCByZCxpbW0xNiAgICAgICAgICAgICBkaXZsIHJxZCxAQHJzCi1hbmQgcmQsYWRkcihycykgICAgICAgICBjcCByZCxycyAgICAgICAgICAgICAgICBkaXZsIHJxZCxhZGRyCi1hbmQgcmQsaW1tMTYgICAgICAgICAgICBjcGIgQEByZCxpbW04ICAgICAgICAgICAgZGl2bCBycWQsYWRkcihycykKLWFuZCByZCxycyAgICAgICAgICAgICAgIGNwYiBhZGRyKHJkKSxpbW04ICAgICAgIGRpdmwgcnFkLGltbTMyCi1hbmRiIHJiZCxAQHJzICAgICAgICAgICAgY3BiIGFkZHIsaW1tOCAgICAgICAgICAgZGl2bCBycWQscnJzCi1hbmRiIHJiZCxhZGRyICAgICAgICAgICBjcGIgcmJkLEBAcnMgICAgICAgICAgICAgZGpueiByZCxkaXNwNwotYW5kYiByYmQsYWRkcihycykgICAgICAgY3BiIHJiZCxhZGRyICAgICAgICAgICAgZWkgaTIKLWFuZGIgcmJkLGltbTggICAgICAgICAgIGNwYiByYmQsYWRkcihycykgICAgICAgIGV4IHJkLEBAcnMKLWFuZGIgcmJkLHJicyAgICAgICAgICAgIGNwYiByYmQsaW1tOCAgICAgICAgICAgIGV4IHJkLGFkZHIKLWJpdCBAQHJkLGltbTQgICAgICAgICAgICBjcGIgcmJkLHJicyAgICAgICAgICAgICBleCByZCxhZGRyKHJzKQotYml0IGFkZHIocmQpLGltbTQgICAgICAgY3BkIHJkLEBAcnMscnIsY2MgICAgICAgIGV4IHJkLHJzCi1iaXQgYWRkcixpbW00ICAgICAgICAgICBjcGRiIHJiZCxAQHJzLHJyLGNjICAgICAgZXhiIHJiZCxAQHJzCi1iaXQgcmQsaW1tNCAgICAgICAgICAgICBjcGRyIHJkLEBAcnMscnIsY2MgICAgICAgZXhiIHJiZCxhZGRyCi1iaXQgcmQscnMgICAgICAgICAgICAgICBjcGRyYiByYmQsQEBycyxycixjYyAgICAgZXhiIHJiZCxhZGRyKHJzKQotYml0YiBAQHJkLGltbTQgICAgICAgICAgIGNwaSByZCxAQHJzLHJyLGNjICAgICAgICBleGIgcmJkLHJicwotYml0YiBhZGRyKHJkKSxpbW00ICAgICAgY3BpYiByYmQsQEBycyxycixjYyAgICAgIGV4dDBlIGltbTgKLWJpdGIgYWRkcixpbW00ICAgICAgICAgIGNwaXIgcmQsQEBycyxycixjYyAgICAgICBleHQwZiBpbW04Ci1iaXRiIHJiZCxpbW00ICAgICAgICAgICBjcGlyYiByYmQsQEBycyxycixjYyAgICAgZXh0OGUgaW1tOAotYml0YiByYmQscnMgICAgICAgICAgICAgY3BsIHJyZCxAQHJzICAgICAgICAgICAgIGV4dDhmIGltbTgKLWJwdCAgICAgICAgICAgICAgICAgICAgIGNwbCBycmQsYWRkciAgICAgICAgICAgIGV4dHMgcnJkCi1jYWxsIEBAcmQgICAgICAgICAgICAgICAgY3BsIHJyZCxhZGRyKHJzKSAgICAgICAgZXh0c2IgcmQKLWNhbGwgYWRkciAgICAgICAgICAgICAgIGNwbCBycmQsaW1tMzIgICAgICAgICAgIGV4dHNsIHJxZAotY2FsbCBhZGRyKHJkKSAgICAgICAgICAgY3BsIHJyZCxycnMgICAgICAgICAgICAgaGFsdAotY2FsciBkaXNwMTIgICAgICAgICAgICAgY3BzZCBAQHJkLEBAcnMscnIsY2MgICAgICBpbiByZCxAQHJzCi1jbHIgQEByZCAgICAgICAgICAgICAgICAgY3BzZGIgQEByZCxAQHJzLHJyLGNjICAgICBpbiByZCxpbW0xNgotY2xyIGFkZHIgICAgICAgICAgICAgICAgY3BzZHIgQEByZCxAQHJzLHJyLGNjICAgICBpbmIgcmJkLEBAcnMKLWNsciBhZGRyKHJkKSAgICAgICAgICAgIGNwc2RyYiBAQHJkLEBAcnMscnIsY2MgICAgaW5iIHJiZCxpbW0xNgotY2xyIHJkICAgICAgICAgICAgICAgICAgY3BzaSBAQHJkLEBAcnMscnIsY2MgICAgICBpbmMgQEByZCxpbW00bTEKLWNscmIgQEByZCAgICAgICAgICAgICAgICBjcHNpYiBAQHJkLEBAcnMscnIsY2MgICAgIGluYyBhZGRyKHJkKSxpbW00bTEKLWluYyBhZGRyLGltbTRtMSAgICAgICAgIGxkYiByYmQscnMocngpICAgICAgICAgIG11bHQgcnJkLGFkZHIocnMpCi1pbmMgcmQsaW1tNG0xICAgICAgICAgICBsZGIgcmQoaW1tMTYpLHJicyAgICAgICBtdWx0IHJyZCxpbW0xNgotaW5jYiBAQHJkLGltbTRtMSAgICAgICAgIGxkYiByZChyeCkscmJzICAgICAgICAgIG11bHQgcnJkLHJzCi1pbmNiIGFkZHIocmQpLGltbTRtMSAgICBsZGN0bCBjdHJsLHJzICAgICAgICAgICBtdWx0bCBycWQsQEBycwotaW5jYiBhZGRyLGltbTRtMSAgICAgICAgbGRjdGwgcmQsY3RybCAgICAgICAgICAgbXVsdGwgcnFkLGFkZHIKLWluY2IgcmJkLGltbTRtMSAgICAgICAgIGxkZCBAQHJzLEBAcmQscnIgICAgICAgICAgbXVsdGwgcnFkLGFkZHIocnMpCi1pbmQgQEByZCxAQHJzLHJhICAgICAgICAgIGxkZGIgQEBycyxAQHJkLHJyICAgICAgICAgbXVsdGwgcnFkLGltbTMyCi1pbmRiIEBAcmQsQEBycyxyYmEgICAgICAgIGxkZHIgQEBycyxAQHJkLHJyICAgICAgICAgbXVsdGwgcnFkLHJycwotaW5pYiBAQHJkLEBAcnMscmEgICAgICAgICBsZGRyYiBAQHJzLEBAcmQscnIgICAgICAgIG5lZyBAQHJkCi1pbmliciBAQHJkLEBAcnMscmEgICAgICAgIGxkaSBAQHJkLEBAcnMscnIgICAgICAgICAgbmVnIGFkZHIKLWlyZXQgICAgICAgICAgICAgICAgICAgIGxkaWIgQEByZCxAQHJzLHJyICAgICAgICAgbmVnIGFkZHIocmQpCi1qcCBjYyxAQHJkICAgICAgICAgICAgICAgbGRpciBAQHJkLEBAcnMscnIgICAgICAgICBuZWcgcmQKLWpwIGNjLGFkZHIgICAgICAgICAgICAgIGxkaXJiIEBAcmQsQEBycyxyciAgICAgICAgbmVnYiBAQHJkCi1qcCBjYyxhZGRyKHJkKSAgICAgICAgICBsZGsgcmQsaW1tNCAgICAgICAgICAgICBuZWdiIGFkZHIKLWpyIGNjLGRpc3A4ICAgICAgICAgICAgIGxkbCBAQHJkLHJycyAgICAgICAgICAgICBuZWdiIGFkZHIocmQpCi1sZCBAQHJkLGltbTE2ICAgICAgICAgICAgbGRsIGFkZHIocmQpLHJycyAgICAgICAgbmVnYiByYmQKLWxkIEBAcmQscnMgICAgICAgICAgICAgICBsZGwgYWRkcixycnMgICAgICAgICAgICBub3AKLWxkIGFkZHIocmQpLGltbTE2ICAgICAgIGxkbCByZChpbW0xNikscnJzICAgICAgIG9yIHJkLEBAcnMKLWxkIGFkZHIocmQpLHJzICAgICAgICAgIGxkbCByZChyeCkscnJzICAgICAgICAgIG9yIHJkLGFkZHIKLWxkIGFkZHIsaW1tMTYgICAgICAgICAgIGxkbCBycmQsQEBycyAgICAgICAgICAgICBvciByZCxhZGRyKHJzKQotbGQgYWRkcixycyAgICAgICAgICAgICAgbGRsIHJyZCxhZGRyICAgICAgICAgICAgb3IgcmQsaW1tMTYKLWxkIHJkKGltbTE2KSxycyAgICAgICAgIGxkbCBycmQsYWRkcihycykgICAgICAgIG9yIHJkLHJzCi1sZCByZChyeCkscnMgICAgICAgICAgICBsZGwgcnJkLGltbTMyICAgICAgICAgICBvcmIgcmJkLEBAcnMKLWxkIHJkLEBAcnMgICAgICAgICAgICAgICBsZGwgcnJkLHJycyAgICAgICAgICAgICBvcmIgcmJkLGFkZHIKLWxkIHJkLGFkZHIgICAgICAgICAgICAgIGxkbCBycmQscnMoaW1tMTYpICAgICAgIG9yYiByYmQsYWRkcihycykKLWxkIHJkLGFkZHIocnMpICAgICAgICAgIGxkbCBycmQscnMocngpICAgICAgICAgIG9yYiByYmQsaW1tOAotbGQgcmQsaW1tMTYgICAgICAgICAgICAgbGRtIEBAcmQscnMsbiAgICAgICAgICAgIG9yYiByYmQscmJzCi1sZCByZCxycyAgICAgICAgICAgICAgICBsZG0gYWRkcihyZCkscnMsbiAgICAgICBvdXQgQEByZCxycwotbGQgcmQscnMoaW1tMTYpICAgICAgICAgbGRtIGFkZHIscnMsbiAgICAgICAgICAgb3V0IGltbTE2LHJzCi1sZCByZCxycyhyeCkgICAgICAgICAgICBsZG0gcmQsQEBycyxuICAgICAgICAgICAgb3V0YiBAQHJkLHJicwotbGRhIHJkLGFkZHIgICAgICAgICAgICAgbGRtIHJkLGFkZHIocnMpLG4gICAgICAgb3V0YiBpbW0xNixyYnMKLWxkYSByZCxhZGRyKHJzKSAgICAgICAgIGxkbSByZCxhZGRyLG4gICAgICAgICAgIG91dGQgQEByZCxAQHJzLHJhCi1sZGEgcmQscnMoaW1tMTYpICAgICAgICBsZHBzIEBAcnMgICAgICAgICAgICAgICAgb3V0ZGIgQEByZCxAQHJzLHJiYQotbGRhIHJkLHJzKHJ4KSAgICAgICAgICAgbGRwcyBhZGRyICAgICAgICAgICAgICAgb3V0aWIgQEByZCxAQHJzLHJhCi1sZGFyIHJkLGRpc3AxNiAgICAgICAgICBsZHBzIGFkZHIocnMpICAgICAgICAgICBvdXRpYnIgQEByZCxAQHJzLHJhCi1sZGIgQEByZCxpbW04ICAgICAgICAgICAgbGRyIGRpc3AxNixycyAgICAgICAgICAgcG9wIEBAcmQsQEBycwotbGRiIEBAcmQscmJzICAgICAgICAgICAgIGxkciByZCxkaXNwMTYgICAgICAgICAgIHBvcCBhZGRyKHJkKSxAQHJzCi1sZGIgYWRkcihyZCksaW1tOCAgICAgICBsZHJiIGRpc3AxNixyYnMgICAgICAgICBwb3AgYWRkcixAQHJzCi1sZGIgYWRkcihyZCkscmJzICAgICAgICBsZHJiIHJiZCxkaXNwMTYgICAgICAgICBwb3AgcmQsQEBycwotbGRiIGFkZHIsaW1tOCAgICAgICAgICAgbGRybCBkaXNwMTYscnJzICAgICAgICAgcG9wbCBAQHJkLEBAcnMKLWxkYiBhZGRyLHJicyAgICAgICAgICAgIGxkcmwgcnJkLGRpc3AxNiAgICAgICAgIHBvcGwgYWRkcihyZCksQEBycwotbGRiIHJiZCxAQHJzICAgICAgICAgICAgIG1iaXQgICAgICAgICAgICAgICAgICAgIHBvcGwgYWRkcixAQHJzCi1sZGIgcmJkLGFkZHIgICAgICAgICAgICBtcmVxIHJkICAgICAgICAgICAgICAgICBwb3BsIHJyZCxAQHJzCi1sZGIgcmJkLGFkZHIocnMpICAgICAgICBtcmVzICAgICAgICAgICAgICAgICAgICBwdXNoIEBAcmQsQEBycwotbGRiIHJiZCxpbW04ICAgICAgICAgICAgbXNldCAgICAgICAgICAgICAgICAgICAgcHVzaCBAQHJkLGFkZHIKLWxkYiByYmQscmJzICAgICAgICAgICAgIG11bHQgcnJkLEBAcnMgICAgICAgICAgICBwdXNoIEBAcmQsYWRkcihycykKLWxkYiByYmQscnMoaW1tMTYpICAgICAgIG11bHQgcnJkLGFkZHIgICAgICAgICAgIHB1c2ggQEByZCxpbW0xNgotcHVzaCBAQHJkLHJzICAgICAgICAgICAgIHNldCBhZGRyLGltbTQgICAgICAgICAgIHN1YmwgcnJkLGltbTMyCi1wdXNobCBAQHJkLEBAcnMgICAgICAgICAgIHNldCByZCxpbW00ICAgICAgICAgICAgIHN1YmwgcnJkLHJycwotcHVzaGwgQEByZCxhZGRyICAgICAgICAgIHNldCByZCxycyAgICAgICAgICAgICAgIHRjYyBjYyxyZAotcHVzaGwgQEByZCxhZGRyKHJzKSAgICAgIHNldGIgQEByZCxpbW00ICAgICAgICAgICB0Y2NiIGNjLHJiZAotcHVzaGwgQEByZCxycnMgICAgICAgICAgIHNldGIgYWRkcihyZCksaW1tNCAgICAgIHRlc3QgQEByZAotcmVzIEBAcmQsaW1tNCAgICAgICAgICAgIHNldGIgYWRkcixpbW00ICAgICAgICAgIHRlc3QgYWRkcgotcmVzIGFkZHIocmQpLGltbTQgICAgICAgc2V0YiByYmQsaW1tNCAgICAgICAgICAgdGVzdCBhZGRyKHJkKQotcmVzIGFkZHIsaW1tNCAgICAgICAgICAgc2V0YiByYmQscnMgICAgICAgICAgICAgdGVzdCByZAotcmVzIHJkLGltbTQgICAgICAgICAgICAgc2V0ZmxnIGltbTQgICAgICAgICAgICAgdGVzdGIgQEByZAotcmVzIHJkLHJzICAgICAgICAgICAgICAgc2luYiByYmQsaW1tMTYgICAgICAgICAgdGVzdGIgYWRkcgotcmVzYiBAQHJkLGltbTQgICAgICAgICAgIHNpbmIgcmQsaW1tMTYgICAgICAgICAgIHRlc3RiIGFkZHIocmQpCi1yZXNiIGFkZHIocmQpLGltbTQgICAgICBzaW5kIEBAcmQsQEBycyxyYSAgICAgICAgIHRlc3RiIHJiZAotcmVzYiBhZGRyLGltbTQgICAgICAgICAgc2luZGIgQEByZCxAQHJzLHJiYSAgICAgICB0ZXN0bCBAQHJkCi1yZXNiIHJiZCxpbW00ICAgICAgICAgICBzaW5pYiBAQHJkLEBAcnMscmEgICAgICAgIHRlc3RsIGFkZHIKLXJlc2IgcmJkLHJzICAgICAgICAgICAgIHNpbmliciBAQHJkLEBAcnMscmEgICAgICAgdGVzdGwgYWRkcihyZCkKLXJlc2ZsZyBpbW00ICAgICAgICAgICAgIHNsYSByZCxpbW04ICAgICAgICAgICAgIHRlc3RsIHJyZAotcmV0IGNjICAgICAgICAgICAgICAgICAgc2xhYiByYmQsaW1tOCAgICAgICAgICAgdHJkYiBAQHJkLEBAcnMscmJhCi1ybCByZCxpbW0xb3IyICAgICAgICAgICBzbGFsIHJyZCxpbW04ICAgICAgICAgICB0cmRyYiBAQHJkLEBAcnMscmJhCi1ybGIgcmJkLGltbTFvcjIgICAgICAgICBzbGwgcmQsaW1tOCAgICAgICAgICAgICB0cmliIEBAcmQsQEBycyxyYnIKLXJsYyByZCxpbW0xb3IyICAgICAgICAgIHNsbGIgcmJkLGltbTggICAgICAgICAgIHRyaXJiIEBAcmQsQEBycyxyYnIKLXJsY2IgcmJkLGltbTFvcjIgICAgICAgIHNsbGwgcnJkLGltbTggICAgICAgICAgIHRydGRyYiBAQHJhLEBAcmIscmJyCi1ybGRiIHJiYixyYmEgICAgICAgICAgICBzb3V0IGltbTE2LHJzICAgICAgICAgICB0cnRpYiBAQHJhLEBAcmIscnIKLXJyIHJkLGltbTFvcjIgICAgICAgICAgIHNvdXRiIGltbTE2LHJicyAgICAgICAgIHRydGlyYiBAQHJhLEBAcmIscmJyCi1ycmIgcmJkLGltbTFvcjIgICAgICAgICBzb3V0ZCBAQHJkLEBAcnMscmEgICAgICAgIHRydHJiIEBAcmEsQEByYixyYnIKLXJyYyByZCxpbW0xb3IyICAgICAgICAgIHNvdXRkYiBAQHJkLEBAcnMscmJhICAgICAgdHNldCBAQHJkCi1ycmNiIHJiZCxpbW0xb3IyICAgICAgICBzb3V0aWIgQEByZCxAQHJzLHJhICAgICAgIHRzZXQgYWRkcgotcnJkYiByYmIscmJhICAgICAgICAgICAgc291dGliciBAQHJkLEBAcnMscmEgICAgICB0c2V0IGFkZHIocmQpCi1yc3ZkMzYgICAgICAgICAgICAgICAgICBzcmEgcmQsaW1tOCAgICAgICAgICAgICB0c2V0IHJkCi1yc3ZkMzggICAgICAgICAgICAgICAgICBzcmFiIHJiZCxpbW04ICAgICAgICAgICB0c2V0YiBAQHJkCi1yc3ZkNzggICAgICAgICAgICAgICAgICBzcmFsIHJyZCxpbW04ICAgICAgICAgICB0c2V0YiBhZGRyCi1yc3ZkN2UgICAgICAgICAgICAgICAgICBzcmwgcmQsaW1tOCAgICAgICAgICAgICB0c2V0YiBhZGRyKHJkKQotcnN2ZDlkICAgICAgICAgICAgICAgICAgc3JsYiByYmQsaW1tOCAgICAgICAgICAgdHNldGIgcmJkCi1yc3ZkOWYgICAgICAgICAgICAgICAgICBzcmxsIHJyZCxpbW04ICAgICAgICAgICB4b3IgcmQsQEBycwotcnN2ZGI5ICAgICAgICAgICAgICAgICAgc3ViIHJkLEBAcnMgICAgICAgICAgICAgIHhvciByZCxhZGRyCi1yc3ZkYmYgICAgICAgICAgICAgICAgICBzdWIgcmQsYWRkciAgICAgICAgICAgICB4b3IgcmQsYWRkcihycykKLXNiYyByZCxycyAgICAgICAgICAgICAgIHN1YiByZCxhZGRyKHJzKSAgICAgICAgIHhvciByZCxpbW0xNgotc2JjYiByYmQscmJzICAgICAgICAgICAgc3ViIHJkLGltbTE2ICAgICAgICAgICAgeG9yIHJkLHJzCi1zYyBpbW04ICAgICAgICAgICAgICAgICBzdWIgcmQscnMgICAgICAgICAgICAgICB4b3JiIHJiZCxAQHJzCi1zZGEgcmQscnMgICAgICAgICAgICAgICBzdWJiIHJiZCxAQHJzICAgICAgICAgICAgeG9yYiByYmQsYWRkcgotc2RhYiByYmQscnMgICAgICAgICAgICAgc3ViYiByYmQsYWRkciAgICAgICAgICAgeG9yYiByYmQsYWRkcihycykKLXNkYWwgcnJkLHJzICAgICAgICAgICAgIHN1YmIgcmJkLGFkZHIocnMpICAgICAgIHhvcmIgcmJkLGltbTgKLXNkbCByZCxycyAgICAgICAgICAgICAgIHN1YmIgcmJkLGltbTggICAgICAgICAgIHhvcmIgcmJkLHJicwotc2RsYiByYmQscnMgICAgICAgICAgICAgc3ViYiByYmQscmJzICAgICAgICAgICAgeG9yYiByYmQscmJzCi1zZGxsIHJyZCxycyAgICAgICAgICAgICBzdWJsIHJyZCxAQHJzCi1zZXQgQEByZCxpbW00ICAgICAgICAgICAgc3VibCBycmQsYWRkcgotc2V0IGFkZHIocmQpLGltbTQgICAgICAgc3VibCBycmQsYWRkcihycykKLUBlbmQgc21hbGxleGFtcGxlCi1AaWZ0ZXgKLUBlbmRncm91cAotQGVuZCBpZnRleAotQGVuZCBpZnNldAotCmRpZmYgLS1naXQgYS9nYXMvZG9jL2dhc3AudGV4aSBiL2dhcy9kb2MvZ2FzcC50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGNkNmY0Li4wMDAwMDAwCi0tLSBhL2dhcy9kb2MvZ2FzcC50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTA4NiArMCwwIEBACi1caW5wdXQgdGV4aW5mbyAgICAgICAgICAgICAgIEBjICAgICAgICAgICAgIC0qLSBUZXhpbmZvIC0qLQotQHNldGZpbGVuYW1lIGdhc3AuaW5mbwotQGMKLUBjIFRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGFzc2VtYmx5IHByZXByb2Nlc3NvciAiR0FTUCIKLUBjCi1AYyBDb3B5cmlnaHQgKGMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1AYwotQGMgVGhpcyB0ZXh0IG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKLUBjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi0KLUBpZmluZm8KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIGdhc3A6IChnYXNwKS4gICAgICAgICAgICAgICAgICAgICBUaGUgR05VIEFzc2VtYmxlciBQcmVwcm9jZXNzb3IKLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBzeW5jb2RlaW5kZXgga3kgY3AKLUBzeW5jb2RlaW5kZXggZm4gY3AKLQotQGZpbmFsb3V0Ci1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi1Ac2V0dGl0bGUgR0FTUAotQHRpdGxlcGFnZQotQGMgRklYTUUgYm9yaW5nIHRpdGxlCi1AdGl0bGUgR0FTUCwgYW4gYXNzZW1ibHkgcHJlcHJvY2Vzc29yCi1Ac3VidGl0bGUgZm9yIEdBU1AgdmVyc2lvbiAxCi1Ac3AgMQotQHN1YnRpdGxlIE1hcmNoIDE5OTQKLUBhdXRob3IgUm9sYW5kIFBlc2NoCi1AcGFnZQotCi1AdGV4Ci17XHBhcnNraXA9MHB0IFxoZmlsbCBDeWdudXMgU3VwcG9ydFxwYXIKLX0KLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGVYIGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgYSBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotQGVuZCBpZ25vcmUKLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotCi1Abm9kZSBUb3AKLUB0b3AgR0FTUAotCi1HQVNQIGlzIGEgcHJlcHJvY2Vzc29yIGZvciBhc3NlbWJseSBwcm9ncmFtcy4KLQotVGhpcyBmaWxlIGRlc2NyaWJlcyB2ZXJzaW9uIDEgb2YgR0FTUC4KLQotU3RldmUgQ2hhbWJlcmxhaW4gd3JvdGUgR0FTUDsgUm9sYW5kIFBlc2NoIHdyb3RlIHRoaXMgbWFudWFsLgotCi1AbWVudQotKiBPdmVydmlldzo6ICAgICAgICAgICAgICAgICAgICBXaGF0IGlzIEdBU1A/Ci0qIEludm9raW5nIEdBU1A6OiAgICAgICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb25zLgotKiBDb21tYW5kczo6ICAgICAgICAgICAgICAgICAgICBQcmVwcm9jZXNzb3IgY29tbWFuZHMuCi0qIEluZGV4OjogICAgICAgICAgICAgICAgICAgICAgIEluZGV4LgotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1Abm9kZSBPdmVydmlldwotQGNoYXB0ZXIgV2hhdCBpcyBHQVNQPwotCi1UaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoZSBAc2N7Z251fSBhc3NlbWJsZXIgaXMgdG8gYXNzZW1ibGUgdGhlIG91dHB1dCBvZgotb3RoZXIgcHJvZ3JhbXMtLS1ub3RhYmx5IGNvbXBpbGVycy4gIFdoZW4geW91IGhhdmUgdG8gaGFuZC1jb2RlCi1zcGVjaWFsaXplZCByb3V0aW5lcyBpbiBhc3NlbWJseSwgdGhhdCBtZWFucyB0aGUgQHNje2dudX0gYXNzZW1ibGVyIGlzCi1hbiB1bmZyaWVuZGx5IHByb2Nlc3NvcjogaXQgaGFzIG5vIGRpcmVjdGl2ZXMgZm9yIG1hY3JvcywgY29uZGl0aW9uYWxzLAotb3IgbWFueSBvdGhlciBjb252ZW5pZW5jZXMgdGhhdCB5b3UgbWlnaHQgZXhwZWN0LgotCi1JbiBzb21lIGNhc2VzIHlvdSBjYW4gc2ltcGx5IHVzZSB0aGUgQyBwcmVwcm9jZXNzb3IsIG9yIGEgZ2VuZXJhbGl6ZWQKLXByZXByb2Nlc3NvciBsaWtlIEBzY3ttNH07IGJ1dCB0aGlzIGNhbiBiZSBhd2t3YXJkLCBzaW5jZSBub25lIG9mIHRoZXNlCi10aGluZ3MgYXJlIGRlc2lnbmVkIHdpdGggYXNzZW1ibHkgaW4gbWluZC4KLQotQHNje2dhc3B9IGZpbGxzIHRoaXMgbmVlZC4gIEl0IGlzIGV4cHJlc3NseSBkZXNpZ25lZCB0byBwcm92aWRlIHRoZQotZmFjaWxpdGllcyB5b3UgbmVlZCB3aXRoIGhhbmQtY29kZWQgYXNzZW1ibHkgY29kZS4gIEltcGxlbWVudGluZyBpdCBhcyBhCi1wcmVwcm9jZXNzb3IsIHJhdGhlciB0aGFuIHBhcnQgb2YgdGhlIGFzc2VtYmxlciwgYWxsb3dzIHRoZSBtYXhpbXVtCi1mbGV4aWJpbGl0eTogeW91IGNhbiB1c2UgaXQgd2l0aCBoYW5kLWNvZGVkIGFzc2VtYmx5LCB3aXRob3V0IHBheWluZyBhCi1wZW5hbHR5IG9mIGFkZGVkIGNvbXBsZXhpdHkgaW4gdGhlIGFzc2VtYmxlciB5b3UgdXNlIGZvciBjb21waWxlcgotb3V0cHV0LgotCi1IZXJlIGlzIGEgc21hbGwgZXhhbXBsZSB0byBnaXZlIHRoZSBmbGF2b3Igb2YgQHNje2dhc3B9LiAgVGhpcyBpbnB1dCB0bwotQHNje2dhc3B9Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi0gICAgICAgIC5NQUNSTyAgc2F2ZXJlZ3MgZnJvbT04IHRvPTE0Ci1jb3VudCAgIC5BU1NJR05BIFxmcm9tCi0gICAgICAgICEgc2F2ZSByXGZyb20uLnJcdG8KLSAgICAgICAgLkFXSElMRSAgXCZjb3VudCBMRSBcdG8KLSAgICAgICAgbW92ICAgICByXCZjb3VudCxAQC1zcAotY291bnQgICAuQVNTSUdOQSAgXCZjb3VudCArIDEKLSAgICAgICAgLkFFTkRXCi0gICAgICAgIC5FTkRNCi0KLSAgICAgICAgc2F2ZXJlZ3MgZnJvbT0xMgotCi1iYXI6ICAgIG1vdiAgICAgI0gnZGVhZCsxMCxyMAotZm9vICAgICAuU0RBVEFDICJoZWxsbyI8MTA+Ci0gICAgICAgIC5FTkQKLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQG5vaW5kZW50Ci1nZW5lcmF0ZXMgdGhpcyBhc3NlbWJseSBwcm9ncmFtOgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAhIHNhdmUgcjEyLi5yMTQKLSAgICAgICAgbW92ICAgICByMTIsQEAtc3AKLSAgICAgICAgbW92ICAgICByMTMsQEAtc3AKLSAgICAgICAgbW92ICAgICByMTQsQEAtc3AKLQotYmFyOiAgICBtb3YgICAgICM1NzAwNSsxMCxyMAotZm9vOiAgICAuYnl0ZSAgIDYsMTA0LDEwMSwxMDgsMTA4LDExMSwxMAotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1Abm9kZSBJbnZva2luZyBHQVNQCi1AY2hhcHRlciBDb21tYW5kIExpbmUgT3B0aW9ucwotCi1AYyBGSVhNRSEgIE9yIGlzIHRoZXJlIGEgc2ltcGxlciB3YXksIGNhbGxpbmcgZnJvbSBHQVMgb3B0aW9uPwotVGhlIHNpbXBsZXN0IHdheSB0byB1c2UgQHNje2dhc3B9IGlzIHRvIHJ1biBpdCBhcyBhIGZpbHRlciBhbmQgYXNzZW1ibGUKLWl0cyBvdXRwdXQuICBJbiBVbml4IGFuZCBpdHMgaWxrLCB5b3UgY2FuIGRvIHRoaXMsIGZvciBleGFtcGxlOgotCi1AYyBGSVhNRSEgR0FTUCBmaWxlbmFtZSBzdWZmaXggY29udmVudGlvbj8KLUBleGFtcGxlCi0kIGdhc3AgcHJvZy5hc20gfCBhcyAtbyBwcm9nLm8KLUBlbmQgZXhhbXBsZQotCi1OYXR1cmFsbHksIHRoZXJlIGFyZSBhbHNvIGEgZmV3IGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGFsbG93IHlvdSB0bwotcmVxdWVzdCB2YXJpYXRpb25zIG9uIHRoaXMgYmFzaWMgdGhlbWUuICBIZXJlIGlzIHRoZSBmdWxsIHNldCBvZgotcG9zc2liaWxpdGllcyBmb3IgdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUuCi0KLUBleGFtcGxlCi1nYXNwICBbIC1hIHwgLS1hbHRlcm5hdGUgXQotICAgICAgWyAtYyBAdmFye2NoYXJ9IHwgLS1jb21tZW50Y2hhciBAdmFye2NoYXJ9IF0KLSAgICAgIFsgLWQgfCAtLWRlYnVnIF0gIFsgLWggfCAtLWhlbHAgXSBbIC1NIHwgLS1tcmkgXQotICAgICAgWyAtbyBAdmFye291dGZpbGV9IHwgLS1vdXRwdXQgQHZhcntvdXRmaWxlfSBdCi0gICAgICBbIC1wIHwgLS1wcmludCBdICBbIC1zIHwgLS1jb3B5c291cmNlIF0KLSAgICAgIFsgLXUgfCAtLXVucmVhc29uYWJsZSBdICBbIC12IHwgLS12ZXJzaW9uIF0KLSAgICAgIEB2YXJ7aW5maWxlfSBAZG90c3t9Ci1AZW5kIGV4YW1wbGUKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntpbmZpbGV9IEBkb3Rze30KLUBjIEZJWE1FISBXaHkgbm90IHN0ZGluIGFzIGRlZmF1bHQgaW5maWxlPwotVGhlIGlucHV0IGZpbGUgbmFtZXMuICBZb3UgbXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlOyBpZiB5b3UKLXNwZWNpZnkgbW9yZSwgQHNje2dhc3B9IHByZXByb2Nlc3NlcyB0aGVtIGFsbCwgY29uY2F0ZW5hdGluZyB0aGUgb3V0cHV0Ci1pbiB0aGUgb3JkZXIgeW91IGxpc3QgdGhlIEB2YXJ7aW5maWxlfSBhcmd1bWVudHMuCi0KLU1hcmsgdGhlIGVuZCBvZiBlYWNoIGlucHV0IGZpbGUgd2l0aCB0aGUgcHJlcHJvY2Vzc29yIGNvbW1hbmQKLUBjb2Rley5FTkR9LiAgQHhyZWZ7T3RoZXIgQ29tbWFuZHMsLCBNaXNjZWxsYW5lb3VzIGNvbW1hbmRzfS4KLQotQGl0ZW0gLWEKLUBpdGVteCAtLWFsdGVybmF0ZQotVXNlIGFsdGVybmF0aXZlIG1hY3JvIHN5bnRheC4gIEB4cmVme0FsdGVybmF0ZSwsIEFsdGVybmF0ZSBtYWNybwotc3ludGF4fSwgZm9yIGEgZGlzY3Vzc2lvbiBvZiBob3cgdGhpcyBzeW50YXggZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0Ci1Ac2N7Z2FzcH0gc3ludGF4LgotCi1AY2luZGV4IGNvbW1lbnQgY2hhcmFjdGVyLCBjaGFuZ2luZwotQGNpbmRleCBzZW1pY29sb24sIGFzIGNvbW1lbnQKLUBjaW5kZXggZXhjbGFtYXRpb24gbWFyaywgYXMgY29tbWVudAotQGNpbmRleCBzaHJpZWssIGFzIGNvbW1lbnQKLUBjaW5kZXggYmFuZywgYXMgY29tbWVudAotQGNpbmRleCBAY29kZXshfSBkZWZhdWx0IGNvbW1lbnQgY2hhcgotQGNpbmRleCBAY29kZXs7fSBhcyBjb21tZW50IGNoYXIKLUBpdGVtIC1jICdAdmFye2NoYXJ9JwotQGl0ZW14IC0tY29tbWVudGNoYXIgJ0B2YXJ7Y2hhcn0nCi1Vc2UgQHZhcntjaGFyfSBhcyB0aGUgY29tbWVudCBjaGFyYWN0ZXIuICBUaGUgZGVmYXVsdCBjb21tZW50IGNoYXJhY3RlcgotaXMgQHNhbXB7IX0uICBGb3IgZXhhbXBsZSwgdG8gdXNlIGEgc2VtaWNvbG9uIGFzIHRoZSBjb21tZW50IGNoYXJhY3RlciwKLXNwZWNpZnkgQHd7QHNhbXB7LWMgJzsnfX0gb24gdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUuICBTaW5jZQotYXNzZW1ibGVyIGNvbW1hbmQgY2hhcmFjdGVycyBvZnRlbiBoYXZlIHNwZWNpYWwgc2lnbmlmaWNhbmNlIHRvIGNvbW1hbmQKLXNoZWxscywgaXQgaXMgYSBnb29kIGlkZWEgdG8gcXVvdGUgb3IgZXNjYXBlIEB2YXJ7Y2hhcn0gd2hlbiB5b3Ugc3BlY2lmeQotYSBjb21tZW50IGNoYXJhY3Rlci4KLQotRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIGFsbCBleGFtcGxlcyBpbiB0aGlzIG1hbnVhbCB1c2UgdGhlIGRlZmF1bHQKLWNvbW1lbnQgY2hhcmFjdGVyIEBzYW1weyF9LgotCi1AaXRlbSAtZAotQGl0ZW14IC0tZGVidWcKLVNob3cgZGVidWdnaW5nIHN0YXRpc3RpY3MuICBJbiB0aGlzIHZlcnNpb24gb2YgQHNje2dhc3B9LCB0aGlzIG9wdGlvbgotcHJvZHVjZXMgc3RhdGlzdGljcyBhYm91dCB0aGUgc3RyaW5nIGJ1ZmZlcnMgdGhhdCBAc2N7Z2FzcH0gYWxsb2NhdGVzCi1pbnRlcm5hbGx5LiAgRm9yIGVhY2ggZGVmaW5lZCBidWZmZXJzaXplIEB2YXJ7c30sIEBzY3tnYXNwfSBzaG93cyB0aGUKLW51bWJlciBvZiBzdHJpbmdzIEB2YXJ7bn0gdGhhdCBpdCBhbGxvY2F0ZWQsIHdpdGggYSBsaW5lIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLXN0cmluZ3Mgc2l6ZSBAdmFye3N9IDogQHZhcntufQotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotQHNje2dhc3B9IGRpc3BsYXlzIHRoZXNlIHN0YXRpc3RpY3Mgb24gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbSwgd2hlbgotZG9uZSBwcmVwcm9jZXNzaW5nLgotCi1AaXRlbSAtaAotQGl0ZW14IC0taGVscAotRGlzcGxheSBhIHN1bW1hcnkgb2YgdGhlIEBzY3tnYXNwfSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQotQGl0ZW0gLU0KLUBpdGVteCAtLW1yaQotVXNlIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuICBVc2luZyB0aGlzIG9wdGlvbiBjYXVzZXMgQHNje2dhc3B9IHRvCi1hY2NlcHQgdGhlIHN5bnRheCBhbmQgcHNldWRvLW9wcyB1c2VkIGJ5IHRoZSBNaWNyb3RlYyBSZXNlYXJjaAotQGNvZGV7QVNNNjhLfSBhc3NlbWJsZXIuCi0KLUBpdGVtIC1vIEB2YXJ7b3V0ZmlsZX0KLUBpdGVteCAtLW91dHB1dCBAdmFye291dGZpbGV9Ci1Xcml0ZSB0aGUgb3V0cHV0IGluIGEgZmlsZSBjYWxsZWQgQHZhcntvdXRmaWxlfS4gIElmIHlvdSBkbyBub3QgdXNlIHRoZQotQHNhbXB7LW99IG9wdGlvbiwgQHNje2dhc3B9IHdyaXRlcyBpdHMgb3V0cHV0IG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQKLXN0cmVhbS4KLQotQGl0ZW0gLXAKLUBpdGVteCAtLXByaW50Ci1QcmludCBsaW5lIG51bWJlcnMuICBAc2N7Z2FzcH0gb2JleXMgdGhpcyBvcHRpb24gQGVtcGh7b25seX0gaWYgeW91IGFsc28KLXNwZWNpZnkgQHNhbXB7LXN9IHRvIGNvcHkgc291cmNlIGxpbmVzIHRvIGl0cyBvdXRwdXQuICBXaXRoIEBzYW1wey1zCi0tcH0sIEBzY3tnYXNwfSBkaXNwbGF5cyB0aGUgbGluZSBudW1iZXIgb2YgZWFjaCBzb3VyY2UgbGluZSBjb3BpZWQKLShpbW1lZGlhdGVseSBhZnRlciB0aGUgY29tbWVudCBjaGFyYWN0ZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSkuCi0KLUBpdGVtIC1zCi1AaXRlbXggLS1jb3B5c291cmNlCi1Db3B5IHRoZSBzb3VyY2UgbGluZXMgdG8gdGhlIG91dHB1dCBmaWxlLiAgVXNlIHRoaXMgb3B0aW9uCi10byBzZWUgdGhlIGVmZmVjdCBvZiBlYWNoIHByZXByb2Nlc3NvciBsaW5lIG9uIHRoZSBAc2N7Z2FzcH0gb3V0cHV0LgotQHNje2dhc3B9IHBsYWNlcyBhIGNvbW1lbnQgY2hhcmFjdGVyIChAc2FtcHshfSBieSBkZWZhdWx0KSBhdAotdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNvdXJjZSBsaW5lIGl0IGNvcGllcywgc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzCi1vcHRpb24gYW5kIHN0aWxsIGFzc2VtYmxlIHRoZSByZXN1bHQuCi0KLUBpdGVtIC11Ci1AaXRlbXggLS11bnJlYXNvbmFibGUKLUJ5cGFzcyBgYHVucmVhc29uYWJsZSBleHBhbnNpb24nJyBsaW1pdC4gIFNpbmNlIHlvdSBjYW4gZGVmaW5lIEBzY3tnYXNwfQotbWFjcm9zIGluc2lkZSBvdGhlciBtYWNybyBkZWZpbml0aW9ucywgdGhlIHByZXByb2Nlc3NvciBub3JtYWxseQotaW5jbHVkZXMgYSBzYW5pdHkgY2hlY2suICBJZiB5b3VyIHByb2dyYW0gcmVxdWlyZXMgbW9yZSB0aGFuIDEsMDAwCi1uZXN0ZWQgZXhwYW5zaW9ucywgQHNje2dhc3B9IG5vcm1hbGx5IGV4aXRzIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4gIFVzZQotdGhpcyBvcHRpb24gdG8gdHVybiBvZmYgdGhpcyBjaGVjaywgYWxsb3dpbmcgdW5saW1pdGVkIG5lc3RlZAotZXhwYW5zaW9ucy4KLQotQGl0ZW0gLXYKLUBpdGVteCAtLXZlcnNpb24KLURpc3BsYXkgdGhlIEBzY3tnYXNwfSB2ZXJzaW9uIG51bWJlci4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIENvbW1hbmRzCi1AY2hhcHRlciBQcmVwcm9jZXNzb3IgQ29tbWFuZHMKLQotQHNje2dhc3B9IGNvbW1hbmRzIGhhdmUgYSBzdHJhaWdodGZvcndhcmQgc3ludGF4IHRoYXQgZml0cyBpbiB3ZWxsIHdpdGgKLWFzc2VtYmx5IGNvbnZlbnRpb25zLiAgSW4gZ2VuZXJhbCwgYSBjb21tYW5kIGV4dGVuZHMgZm9yIGEgbGluZSwgYW5kIG1heQotaGF2ZSB1cCB0byB0aHJlZSBmaWVsZHM6IGFuIG9wdGlvbmFsIGxhYmVsLCB0aGUgY29tbWFuZCBpdHNlbGYsIGFuZAotb3B0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBjb21tYW5kLiAgWW91IGNhbiB3cml0ZSBjb21tYW5kcyBpbiB1cHBlciBvcgotbG93ZXIgY2FzZSwgdGhvdWdoIHRoaXMgbWFudWFsIHNob3dzIHRoZW0gaW4gdXBwZXIgY2FzZS4gIEB4cmVme1N5bnRheAotRGV0YWlscywsIERldGFpbHMgb2YgdGhlIEdBU1Agc3ludGF4fSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLUBtZW51Ci0qIENvbmRpdGlvbmFsczo6Ci0qIExvb3BzOjoKLSogVmFyaWFibGVzOjoKLSogTWFjcm9zOjoKLSogRGF0YTo6Ci0qIExpc3RpbmdzOjoKLSogT3RoZXIgQ29tbWFuZHM6OgotKiBTeW50YXggRGV0YWlsczo6Ci0qIEFsdGVybmF0ZTo6Ci1AZW5kIG1lbnUKLQotQG5vZGUgQ29uZGl0aW9uYWxzCi1Ac2VjdGlvbiBDb25kaXRpb25hbCBhc3NlbWJseQotCi1UaGUgY29uZGl0aW9uYWwtYXNzZW1ibHkgZGlyZWN0aXZlcyBhbGxvdyB5b3UgdG8gaW5jbHVkZSBvciBleGNsdWRlCi1wb3J0aW9ucyBvZiBhbiBhc3NlbWJseSBkZXBlbmRpbmcgb24gaG93IGEgcGFpciBvZiBleHByZXNzaW9ucywgb3IgYQotcGFpciBvZiBzdHJpbmdzLCBjb21wYXJlLgotCi1UaGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgb2YgY29uZGl0aW9uYWxzIGlzIGZhbWlsaWFyIGZyb20gbWFueSBvdGhlcgotY29udGV4dHMuICBAY29kZXsuQUlGfSBtYXJrcyB0aGUgc3RhcnQgb2YgYSBjb25kaXRpb25hbCwgYW5kIHByZWNlZGVzCi1hc3NlbWJseSBmb3IgdGhlIGNhc2Ugd2hlbiB0aGUgY29uZGl0aW9uIGlzIHRydWUuICAgQW4gb3B0aW9uYWwKLUBjb2Rley5BRUxTRX0gcHJlY2VkZXMgYXNzZW1ibHkgZm9yIHRoZSBjb252ZXJzZSBjYXNlLCBhbmQgYW4KLUBjb2Rley5BRU5ESX0gbWFya3MgdGhlIGVuZCBvZiB0aGUgY29uZGl0aW9uLgotCi1AYyBGSVhNRSEgV2h5IGRvZXNuJ3QgLXUgdHVybiBvZmYgdGhpcyBjaGVjaz8KLVlvdSBtYXkgbmVzdCBjb25kaXRpb25hbHMgdXAgdG8gYSBkZXB0aCBvZiAxMDA7IEBzY3tnYXNwfSByZWplY3RzCi1uZXN0aW5nIGJleW9uZCB0aGF0LCBiZWNhdXNlIGl0IG1heSBpbmRpY2F0ZSBhIGJ1ZyBpbiB5b3VyIG1hY3JvCi1zdHJ1Y3R1cmUuCi0KLUBjIEZJWE1FISBXaHkgaXNuJ3QgdGhlcmUgc29tZXRoaW5nIGxpa2UgY3BwJ3MgLUQgb3B0aW9uPyAgQ29uZGl0aW9uYWxzCi1AYyAgICAgICAgd291bGQgYmUgbXVjaCBtb3JlIHVzZWZ1bCBpZiB0aGVyZSB3ZXJlLgotQ29uZGl0aW9uYWxzIGFyZSBwcmltYXJpbHkgdXNlZnVsIGluc2lkZSBtYWNybyBkZWZpbml0aW9ucywgd2hlcmUgeW91Ci1vZnRlbiBuZWVkIGRpZmZlcmVudCBlZmZlY3RzIGRlcGVuZGluZyBvbiBhcmd1bWVudCB2YWx1ZXMuCi1AeHJlZntNYWNyb3MsLCBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzfSwgZm9yIGRldGFpbHMgYWJvdXQgZGVmaW5pbmcKLW1hY3Jvcy4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLkFJRiBAdmFye2V4cHJhfSBAdmFye2NtcH0gQHZhcntleHByYn0KLUBpdGVteCAuQUlGICJAdmFye3N0cmF9IiBAdmFye2NtcH0gIkB2YXJ7c3RyYn0iCi0KLVRoZSBnb3Zlcm5pbmcgY29uZGl0aW9uIGdvZXMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgQGNvZGV7LkFJRn0KLXByZXByb2Nlc3NvciBjb21tYW5kLiAgWW91IG1heSBjb21wYXJlIGVpdGhlciB0d28gc3RyaW5ncywgb3IgdHdvCi1leHByZXNzaW9ucy4KLQotV2hlbiB5b3UgY29tcGFyZSBzdHJpbmdzLCBvbmx5IHR3byBjb25kaXRpb25hbCBAdmFye2NtcH0gY29tcGFyaXNvbgotb3BlcmF0b3JzIGFyZSBhdmFpbGFibGU6IEBzYW1we0VRfSAodHJ1ZSBpZiBAdmFye3N0cmF9IGFuZCBAdmFye3N0cmJ9Ci1hcmUgaWRlbnRpY2FsKSwgYW5kIEBzYW1we05FfSAodGhlIG9wcG9zaXRlKS4KLQotV2hlbiB5b3UgY29tcGFyZSB0d28gZXhwcmVzc2lvbnMsIEBlbXBoe2JvdGggZXhwcmVzc2lvbnMgbXVzdCBiZQotYWJzb2x1dGV9IChAcHhyZWZ7RXhwcmVzc2lvbnMsLCBBcml0aG1ldGljIGV4cHJlc3Npb25zIGluIEdBU1B9KS4gIFlvdQotY2FuIHVzZSB0aGVzZSBAdmFye2NtcH0gY29tcGFyaXNvbiBvcGVyYXRvcnMgd2l0aCBleHByZXNzaW9uczoKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gRVEKLUFyZSBAdmFye2V4cHJhfSBhbmQgQHZhcntleHByYn0gZXF1YWw/ICAoRm9yIHN0cmluZ3MsIGFyZSBAdmFye3N0cmF9IGFuZAotQHZhcntzdHJifSBpZGVudGljYWw/KQotCi1AaXRlbSBORQotQXJlIEB2YXJ7ZXhwcmF9IGFuZCBAdmFye2V4cHJifSBkaWZmZXJlbnQ/ICAoRm9yIHN0cmluZ3MsIGFyZSBAdmFye3N0cmF9Ci1hbmQgQHZhcntzdHJifSBkaWZmZXJlbnQ/Ci0KLUBpdGVtIExUCi1JcyBAdmFye2V4cHJhfSBsZXNzIHRoYW4gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yIHN0cmluZ3MuKQotCi1AaXRlbSBMRQotSXMgQHZhcntleHByYX0gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIEB2YXJ7ZXhwcmJ9PyAgKE5vdCBhbGxvd2VkIGZvciBzdHJpbmdzLikKLQotQGl0ZW0gR1QKLUlzIEB2YXJ7ZXhwcmF9IGdyZWF0ZXIgdGhhbiBAdmFye2V4cHJifT8gIChOb3QgYWxsb3dlZCBmb3Igc3RyaW5ncy4pCi0KLUBpdGVtIEdFCi1JcyBAdmFye2V4cHJhfSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQHZhcntleHByYn0/ICAoTm90IGFsbG93ZWQgZm9yCi1zdHJpbmdzLikKLUBlbmQgZnRhYmxlCi0KLUBpdGVtIC5BRUxTRQotTWFya3MgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5IGNvZGUgdG8gYmUgaW5jbHVkZWQgaWYgdGhlIGNvbmRpdGlvbiBmYWlscy4KLU9wdGlvbmFsLCBhbmQgb25seSBhbGxvd2VkIHdpdGhpbiBhIGNvbmRpdGlvbmFsIChiZXR3ZWVuIEBjb2Rley5BSUZ9IGFuZAotQGNvZGV7LkFFTkRJfSkuCi0KLUBpdGVtIC5BRU5ESQotTWFya3MgdGhlIGVuZCBvZiBhIGNvbmRpdGlvbmFsIGFzc2VtYmx5LgotQGVuZCBmdGFibGUKLQotQG5vZGUgTG9vcHMKLUBzZWN0aW9uIFJlcGV0aXRpdmUgc2VjdGlvbnMgb2YgYXNzZW1ibHkKLQotVHdvIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGFsbG93IHlvdSB0byByZXBlYXRlZGx5IGlzc3VlIGNvcGllcyBvZiB0aGUKLXNhbWUgYmxvY2sgb2YgYXNzZW1ibHkgY29kZS4KLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gLkFSRVBFQVQgQHZhcnthZXhwfQotQGl0ZW14IC5BRU5EUgotSWYgeW91IHNpbXBseSBuZWVkIHRvIHJlcGVhdCB0aGUgc2FtZSBibG9jayBvZiBhc3NlbWJseSBvdmVyIGFuZCBvdmVyIGEKLWZpeGVkIG51bWJlciBvZiB0aW1lcywgc2FuZHdpY2ggb25lIGluc3RhbmNlIG9mIHRoZSByZXBlYXRlZCBibG9jawotYmV0d2VlbiBAY29kZXsuQVJFUEVBVH0gYW5kIEBjb2Rley5BRU5EUn0uICBTcGVjaWZ5IHRoZSBudW1iZXIgb2YKLWNvcGllcyBhcyBAdmFye2FleHB9ICh3aGljaCBtdXN0IGJlIGFuIGFic29sdXRlIGV4cHJlc3Npb24pLiAgRm9yCi1leGFtcGxlLCB0aGlzIHJlcGVhdHMgdHdvIGFzc2VtYmx5IHN0YXRlbWVudHMgdGhyZWUgdGltZXMgaW4gc3VjY2Vzc2lvbjoKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLSAgICAgICAgLkFSRVBFQVQgICAgICAgIDMKLSAgICAgICAgcm90Y2wgICByMgotICAgICAgICBkaXYxICAgIHIwLHIxCi0gICAgICAgIC5BRU5EUgotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1AaXRlbSAuQVdISUxFIEB2YXJ7ZXhwcmF9IEB2YXJ7Y21wfSBAdmFye2V4cHJifQotQGl0ZW14IC5BRU5EVwotQGl0ZW14IC5BV0hJTEUgQHZhcntzdHJhfSBAdmFye2NtcH0gQHZhcntzdHJifQotQGl0ZW14IC5BRU5EVwotVG8gcmVwZWF0IGEgYmxvY2sgb2YgYXNzZW1ibHkgZGVwZW5kaW5nIG9uIGEgY29uZGl0aW9uYWwgdGVzdCwgcmF0aGVyCi10aGFuIHJlcGVhdGluZyBpdCBmb3IgYSBzcGVjaWZpYyBudW1iZXIgb2YgdGltZXMsIHVzZSBAY29kZXsuQVdISUxFfS4KLUBjb2Rley5BRU5EV30gbWFya3MgdGhlIGVuZCBvZiB0aGUgcmVwZWF0ZWQgYmxvY2suICBUaGUgY29uZGl0aW9uYWwKLWNvbXBhcmlzb24gd29ya3MgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgZm9yIEBjb2Rley5BSUZ9LCB3aXRoIHRoZSBzYW1lCi1jb21wYXJpc29uIG9wZXJhdG9ycyAoQHB4cmVme0NvbmRpdGlvbmFscywsIENvbmRpdGlvbmFsIGFzc2VtYmx5fSkuCi0KLVNpbmNlIHRoZSB0ZXJtcyBvZiB0aGUgY29tcGFyaXNvbiBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24sCi1AY29kZXsuQVdISUxFfSBpcyBwcmltYXJpbHkgdXNlZnVsIHdpdGhpbiBtYWNyb3MuICBAeHJlZntNYWNyb3MsLAotRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uCi1AZW5kIGZ0YWJsZQotCi1AY2luZGV4IGxvb3BzLCBicmVha2luZyBvdXQgb2YKLUBjaW5kZXggYnJlYWtpbmcgb3V0IG9mIGxvb3BzCi1Zb3UgY2FuIHVzZSB0aGUgQGNvZGV7LkVYSVRNfSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIHRvIGJyZWFrIG91dCBvZgotbG9vcHMgZWFybHkgKGFzIHdlbGwgYXMgdG8gYnJlYWsgb3V0IG9mIG1hY3JvcykuICBAeHJlZntNYWNyb3MsLAotRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uCi0KLUBub2RlIFZhcmlhYmxlcwotQHNlY3Rpb24gUHJlcHJvY2Vzc29yIHZhcmlhYmxlcwotCi1Zb3UgY2FuIHVzZSB2YXJpYWJsZXMgaW4gQHNje2dhc3B9IHRvIHJlcHJlc2VudCBzdHJpbmdzLCByZWdpc3RlcnMsIG9yCi10aGUgcmVzdWx0cyBvZiBleHByZXNzaW9ucy4KLQotWW91IG11c3QgZGlzdGluZ3Vpc2ggdHdvIGtpbmRzIG9mIHZhcmlhYmxlczogCi1AZW51bWVyYXRlCi1AaXRlbQotVmFyaWFibGVzIGRlZmluZWQgd2l0aCBAY29kZXsuRVFVfSBvciBAY29kZXsuQVNTSUdOfS4gIFRvIGV2YWx1YXRlIHRoaXMKLWtpbmQgb2YgdmFyaWFibGUgaW4geW91ciBhc3NlbWJseSBvdXRwdXQsIHNpbXBseSBtZW50aW9uIGl0cyBuYW1lLiAgRm9yCi1leGFtcGxlLCB0aGVzZSB0d28gbGluZXMgZGVmaW5lIGFuZCB1c2UgYSB2YXJpYWJsZSBAc2FtcHtlZ306Ci0KLUBjYXJ0b3VjaGUKLUBleGFtcGxlCi1lZyAgICAgLkVRVSAgIEZMSVAtNjQKLSAgICAgICBAZG90c3t9Ci0gICAgICAgbW92LmwgIGVnLHIwCi1AZW5kIGV4YW1wbGUKLUBlbmQgY2FydG91Y2hlCi0KLUBlbXBoe0RvIG5vdCB1c2V9IHRoaXMga2luZCBvZiB2YXJpYWJsZSBpbiBjb25kaXRpb25hbCBleHByZXNzaW9ucyBvcgotd2hpbGUgbG9vcHM7IEBzY3tnYXNwfSBvbmx5IGV2YWx1YXRlcyB0aGVzZSB2YXJpYWJsZXMgd2hlbiB3cml0aW5nCi1hc3NlbWJseSBvdXRwdXQuCi0KLUBpdGVtCi1WYXJpYWJsZXMgZm9yIHVzZSBkdXJpbmcgcHJlcHJvY2Vzc2luZy4gIFlvdSBjYW4gZGVmaW5lIHRoZXNlCi13aXRoIEBjb2Rley5BU1NJR05DfSBvciBAY29kZXsuQVNTSUdOQX0uICBUbyBldmFsdWF0ZSB0aGlzCi1raW5kIG9mIHZhcmlhYmxlLCB3cml0ZSBAc2FtcHtcJn0gYmVmb3JlIHRoZSB2YXJpYWJsZSBuYW1lOyBmb3IgZXhhbXBsZSwKLQotQGNhcnRvdWNoZQotQGV4YW1wbGUKLW9wY2l0ICAuQVNTSUdOQSAgNDcKLSAgICAgICBAZG90c3t9Ci0gICAgICAgLkFXSElMRSAgXCZvcGNpdCBHVCAwCi0gICAgICAgQGRvdHN7fQotICAgICAgIC5BRU5EVwotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1Ac2N7Z2FzcH0gdHJlYXRzIG1hY3JvIGFyZ3VtZW50cyBhbG1vc3QgdGhlIHNhbWUgd2F5LCBidXQgdG8gZXZhbHVhdGUKLXRoZW0geW91IHVzZSB0aGUgcHJlZml4IEBzYW1we1x9IHJhdGhlciB0aGFuIEBzYW1we1wmfS4KLUB4cmVme01hY3JvcywsIERlZmluaW5nIHlvdXIgb3duIGRpcmVjdGl2ZXN9LgotQGVuZCBlbnVtZXJhdGUKLQotQGZ0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntwdmFyfSAuRVFVIEB2YXJ7ZXhwcn0KLUBjIEZJWE1FISAgQW55dGhpbmcgdG8gYmV3YXJlIG9mIHJlIEdBUyBkaXJlY3RpdmUgb2Ygc2FtZSBuYW1lPwotQXNzaWduIHByZXByb2Nlc3NvciB2YXJpYWJsZSBAdmFye3B2YXJ9IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbgotQHZhcntleHByfS4gIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gcmVkZWZpbml0aW9uOyB1c2UgQHNhbXB7LkVRVX0KLXdpdGggdGhlIHNhbWUgQHZhcntwdmFyfSBhcyBvZnRlbiBhcyB5b3UgZmluZCBpdCBjb252ZW5pZW50LgotCi1AaXRlbSBAdmFye3B2YXJ9IC5BU1NJR04gQHZhcntleHByfQotQWxtb3N0IHRoZSBzYW1lIGFzIEBjb2Rley5FUVV9LCBzYXZlIHRoYXQgeW91IG1heSBub3QgcmVkZWZpbmUKLUB2YXJ7cHZhcn0gdXNpbmcgQGNvZGV7LkFTU0lHTn0gb25jZSBpdCBoYXMgYSB2YWx1ZS4KLUBjIEZJWE1FISEgIFN1cHBvc2VkIHRvIHdvcmsgdGhpcyB3YXksIGFwcGFyZW50bHksIGJ1dCBvbiA5ZmViOTQgd29ya3MKLUBjICAgICAgICAgIGp1c3QgbGlrZSAuRVFVCi0KLUBpdGVtIEB2YXJ7cHZhcn0gLkFTU0lHTkEgQHZhcnthZXhwcn0KLURlZmluZSBhIHZhcmlhYmxlIHdpdGggYSBudW1lcmljIHZhbHVlLCBmb3IgdXNlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgotQHZhcnthZXhwcn0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uLiAgWW91IGNhbiByZWRlZmluZSB2YXJpYWJsZXMKLXdpdGggQGNvZGV7LkFTU0lHTkF9IGF0IGFueSB0aW1lLgotCi1AaXRlbSBAdmFye3B2YXJ9IC5BU1NJR05DICJAdmFye3N0cn0iCi1EZWZpbmUgYSB2YXJpYWJsZSB3aXRoIGEgc3RyaW5nIHZhbHVlLCBmb3IgdXNlIGR1cmluZyBwcmVwcm9jZXNzaW5nLgotWW91IGNhbiByZWRlZmluZSB2YXJpYWJsZXMgd2l0aCBAY29kZXsuQVNTSUdOQ30gYXQgYW55IHRpbWUuCi0KLUBpdGVtIEB2YXJ7cHZhcn0gLlJFRyAoQHZhcntyZWdpc3Rlcn0pCi1Vc2UgQGNvZGV7LlJFR30gdG8gZGVmaW5lIGEgdmFyaWFibGUgdGhhdCByZXByZXNlbnRzIGEgcmVnaXN0ZXIuICBJbgotcGFydGljdWxhciwgQHZhcntyZWdpc3Rlcn0gaXMgQGVtcGh7bm90IGV2YWx1YXRlZH0gYXMgYW4gZXhwcmVzc2lvbi4KLVlvdSBtYXkgdXNlIEBjb2Rley5SRUd9IGF0IHdpbGwgdG8gcmVkZWZpbmUgcmVnaXN0ZXIgdmFyaWFibGVzLgotQGVuZCBmdGFibGUKLQotQWxsIHRoZXNlIGRpcmVjdGl2ZXMgYWNjZXB0IHRoZSB2YXJpYWJsZSBuYW1lIGluIHRoZSBgYGxhYmVsJycgcG9zaXRpb24sCi10aGF0IGlzIGF0IHRoZSBsZWZ0IG1hcmdpbi4gIFlvdSBtYXkgc3BlY2lmeSBhIGNvbG9uIGFmdGVyIHRoZSB2YXJpYWJsZQotbmFtZSBpZiB5b3Ugd2lzaDsgdGhlIGZpcnN0IGV4YW1wbGUgYWJvdmUgY291bGQgaGF2ZSBzdGFydGVkIEBzYW1we2VnOn0KLXdpdGggdGhlIHNhbWUgZWZmZWN0LgotCi1AYyBwYWdlYnJlYWsgbWFrZXMgZm9yIGJldHRlciBhZXN0aGV0aWNzLS0tZW5zdXJlcyBtYWNybyBhbmQgZXhwYW5zaW9uIHRvZ2V0aGVyCi1AcGFnZQotQG5vZGUgTWFjcm9zCi1Ac2VjdGlvbiBEZWZpbmluZyB5b3VyIG93biBkaXJlY3RpdmVzCi0KLVRoZSBjb21tYW5kcyBAY29kZXsuTUFDUk99IGFuZCBAY29kZXsuRU5ETX0gYWxsb3cgeW91IHRvIGRlZmluZSBtYWNyb3MKLXRoYXQgZ2VuZXJhdGUgYXNzZW1ibHkgb3V0cHV0LiAgWW91IGNhbiB1c2UgdGhlc2UgbWFjcm9zIHdpdGggYSBzeW50YXgKLXNpbWlsYXIgdG8gYnVpbHQtaW4gQHNje2dhc3B9IG9yIGFzc2VtYmxlciBkaXJlY3RpdmVzLiAgRm9yIGV4YW1wbGUsCi10aGlzIGRlZmluaXRpb24gc3BlY2lmaWVzIGEgbWFjcm8gQGNvZGV7U1VNfSB0aGF0IGFkZHMgdG9nZXRoZXIgYSByYW5nZSBvZgotY29uc2VjdXRpdmUgcmVnaXN0ZXJzOgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAuTUFDUk8gIFNVTSBGUk9NPTAsIFRPPTkKLSAgICAgICAgISBcRlJPTSBcVE8KLSAgICAgICAgbW92ICAgICByXEZST00scjEwCi1DT1VOVCAgIC5BU1NJR05BICAgICAgICBcRlJPTSsxCi0gICAgICAgIC5BV0hJTEUgXCZDT1VOVCBMRSBcVE8KLSAgICAgICAgYWRkICAgICByXCZDT1VOVCxyMTAKLUNPVU5UICAgLkFTU0lHTkEgICAgICAgIFwmQ09VTlQrMQotICAgICAgICAuQUVORFcKLSAgICAgICAgLkVORE0KLUBlbmQgZXhhbXBsZQotQGVuZCBjYXJ0b3VjaGUKLQotQG5vaW5kZW50Ci1XaXRoIHRoYXQgZGVmaW5pdGlvbiwgQHNhbXB7U1VNIDAsNX0gZ2VuZXJhdGVzIHRoaXMgYXNzZW1ibHkgb3V0cHV0OgotCi1AY2FydG91Y2hlCi1AZXhhbXBsZQotICAgICAgICAhIDAgNQotICAgICAgICBtb3YgICAgIHIwLHIxMAotICAgICAgICBhZGQgICAgIHIxLHIxMAotICAgICAgICBhZGQgICAgIHIyLHIxMAotICAgICAgICBhZGQgICAgIHIzLHIxMAotICAgICAgICBhZGQgICAgIHI0LHIxMAotICAgICAgICBhZGQgICAgIHI1LHIxMAotQGVuZCBleGFtcGxlCi1AZW5kIGNhcnRvdWNoZQotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuTUFDUk8gQHZhcnttYWNuYW1lfQotQGl0ZW14IC5NQUNSTyBAdmFye21hY25hbWV9IEB2YXJ7bWFjYXJnc30gQGRvdHN7fQotQmVnaW4gdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQHZhcnttYWNuYW1lfS4gIElmIHlvdXIgbWFjcm8KLWRlZmluaXRpb24gcmVxdWlyZXMgYXJndW1lbnRzLCBzcGVjaWZ5IHRoZWlyIG5hbWVzIGFmdGVyIHRoZSBtYWNybyBuYW1lLAotc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciBzcGFjZXMuICBZb3UgY2FuIHN1cHBseSBhIGRlZmF1bHQgdmFsdWUgZm9yIGFueQotbWFjcm8gYXJndW1lbnQgYnkgZm9sbG93aW5nIHRoZSBuYW1lIHdpdGggQHNhbXB7PUB2YXJ7ZGVmbHR9fS4gIEZvcgotZXhhbXBsZSwgdGhlc2UgYXJlIGFsbCB2YWxpZCBAY29kZXsuTUFDUk99IHN0YXRlbWVudHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLk1BQ1JPIENPTU0KLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle0NPTU19LCB3aGljaCB0YWtlcyBubwotYXJndW1lbnRzLgotCi1AaXRlbSAuTUFDUk8gUExVUzEgUCwgUDEKLUBpdGVteCAuTUFDUk8gUExVUzEgUCBQMQotRWl0aGVyIHN0YXRlbWVudCBiZWdpbnMgdGhlIGRlZmluaXRpb24gb2YgYSBtYWNybyBjYWxsZWQgQGNvZGV7UExVUzF9LAotd2hpY2ggdGFrZXMgdHdvIGFyZ3VtZW50czsgd2l0aGluIHRoZSBtYWNybyBkZWZpbml0aW9uLCB3cml0ZQotQHNhbXB7XFB9IG9yIEBzYW1we1xQMX0gdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cy4KLQotQGl0ZW0gLk1BQ1JPIFJFU0VSVkVfU1RSIFAxPTAgUDIKLUJlZ2luIHRoZSBkZWZpbml0aW9uIG9mIGEgbWFjcm8gY2FsbGVkIEBjb2Rle1JFU0VSVkVfU1RSfSwgd2l0aCB0d28KLWFyZ3VtZW50cy4gIFRoZSBmaXJzdCBhcmd1bWVudCBoYXMgYSBkZWZhdWx0IHZhbHVlLCBidXQgbm90IHRoZSBzZWNvbmQuCi1BZnRlciB0aGUgZGVmaW5pdGlvbiBpcyBjb21wbGV0ZSwgeW91IGNhbiBjYWxsIHRoZSBtYWNybyBlaXRoZXIgYXMKLUBzYW1we1JFU0VSVkVfU1RSIEB2YXJ7YX0sQHZhcntifX0gKHdpdGggQHNhbXB7XFAxfSBldmFsdWF0aW5nIHRvCi1AdmFye2F9IGFuZCBAc2FtcHtcUDJ9IGV2YWx1YXRpbmcgdG8gQHZhcntifSksIG9yIGFzIEBzYW1we1JFU0VSVkVfU1RSCi0sQHZhcntifX0gKHdpdGggQHNhbXB7XFAxfSBldmFsdWF0aW5nIGFzIHRoZSBkZWZhdWx0LCBpbiB0aGlzIGNhc2UKLUBzYW1wezB9LCBhbmQgQHNhbXB7XFAyfSBldmFsdWF0aW5nIHRvIEB2YXJ7Yn0pLgotQGVuZCB0YWJsZQotCi1XaGVuIHlvdSBjYWxsIGEgbWFjcm8sIHlvdSBjYW4gc3BlY2lmeSB0aGUgYXJndW1lbnQgdmFsdWVzIGVpdGhlciBieQotcG9zaXRpb24sIG9yIGJ5IGtleXdvcmQuICBGb3IgZXhhbXBsZSwgQHNhbXB7U1VNIDksMTd9IGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1we1NVTSBUTz0xNywgRlJPTT05fS4gIE1hY3JvIGFyZ3VtZW50cyBhcmUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcwotc2ltaWxhciB0byB0aGUgdmFyaWFibGVzIHlvdSBkZWZpbmUgd2l0aCBAc2FtcHsuQVNTSUdOQX0gb3IKLUBzYW1wey5BU1NJR05DfTsgaW4gcGFydGljdWxhciwgeW91IGNhbiB1c2UgdGhlbSBpbiBjb25kaXRpb25hbHMgb3IgZm9yCi1sb29wIGNvbnRyb2wuICAoVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGUgcHJlZml4IHlvdSB3cml0ZSB0byBldmFsdWF0ZQotdGhlIHZhcmlhYmxlOiBmb3IgYSBtYWNybyBhcmd1bWVudCwgd3JpdGUgQHNhbXB7XEB2YXJ7YXJnbmFtZX19LCBidXQgZm9yCi1hIHByZXByb2Nlc3NvciB2YXJpYWJsZSwgd3JpdGUgQHNhbXB7XCZAdmFye3Zhcm5hbWV9fS4pCi0KLUBpdGVtIEB2YXJ7bmFtZX0gLk1BQ1JPCi1AaXRlbXggQHZhcntuYW1lfSAuTUFDUk8gKCBAdmFye21hY2FyZ3N9IEBkb3Rze30gKQotQGMgRklYTUUgY2hlY2s6IEkgdGhpbmsgbm8gZXJyb3IgX2FuZF8gbm8gYXJncyByZWNvZ25pemVkIGlmIEkgdXNlIGZvcm0KLUBjICAgICAgIE5BTUUgIC5NQUNSTyAgIEFSRyBBUkcKLUFuIGFsdGVybmF0aXZlIGZvcm0gb2YgaW50cm9kdWNpbmcgYSBtYWNybyBkZWZpbml0aW9uOiBzcGVjaWZ5IHRoZSBtYWNybwotbmFtZSBpbiB0aGUgbGFiZWwgcG9zaXRpb24sIGFuZCB0aGUgYXJndW1lbnRzIChpZiBhbnkpIGJldHdlZW4KLXBhcmVudGhlc2VzIGFmdGVyIHRoZSBuYW1lLiAgRGVmYXVsdGluZyBydWxlcyBhbmQgdXNhZ2Ugd29yayB0aGUgc2FtZQotd2F5IGFzIGZvciB0aGUgb3RoZXIgbWFjcm8gZGVmaW5pdGlvbiBzeW50YXguCi0KLUBpdGVtIC5FTkRNCi1NYXJrIHRoZSBlbmQgb2YgYSBtYWNybyBkZWZpbml0aW9uLgotCi1AaXRlbSAuRVhJVE0KLUV4aXQgZWFybHkgZnJvbSB0aGUgY3VycmVudCBtYWNybyBkZWZpbml0aW9uLCBAY29kZXsuQVJFUEVBVH0gbG9vcCwgb3IKLUBjb2Rley5BV0hJTEV9IGxvb3AuCi0KLUBjaW5kZXggbnVtYmVyIG9mIG1hY3JvcyBleGVjdXRlZAotQGNpbmRleCBtYWNyb3MsIGNvdW50IGV4ZWN1dGVkCi1AaXRlbSBcQEAKLUBzY3tnYXNwfSBtYWludGFpbnMgYSBjb3VudGVyIG9mIGhvdyBtYW55IG1hY3JvcyBpdCBoYXMKLWV4ZWN1dGVkIGluIHRoaXMgcHNldWRvLXZhcmlhYmxlOyB5b3UgY2FuIGNvcHkgdGhhdCBudW1iZXIgdG8geW91cgotb3V0cHV0IHdpdGggQHNhbXB7XEBAfSwgYnV0IEBlbXBoe29ubHkgd2l0aGluIGEgbWFjcm8gZGVmaW5pdGlvbn0uCi0KLUBpdGVtIExPQ0FMIEB2YXJ7bmFtZX0gWyAsIEBkb3Rze30gXQotQGVtcGh7V2FybmluZzogQGNvZGV7TE9DQUx9IGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3QgYGBhbHRlcm5hdGUKLW1hY3JvIHN5bnRheCcnIHdpdGggQHNhbXB7LWF9IG9yIEBzYW1wey0tYWx0ZXJuYXRlfS59ICBAeHJlZntBbHRlcm5hdGUsLAotQWx0ZXJuYXRlIG1hY3JvIHN5bnRheH0uCi0KLUdlbmVyYXRlIGEgc3RyaW5nIHJlcGxhY2VtZW50IGZvciBlYWNoIG9mIHRoZSBAdmFye25hbWV9IGFyZ3VtZW50cywgYW5kCi1yZXBsYWNlIGFueSBpbnN0YW5jZXMgb2YgQHZhcntuYW1lfSBpbiBlYWNoIG1hY3JvIGV4cGFuc2lvbi4gIFRoZQotcmVwbGFjZW1lbnQgc3RyaW5nIGlzIHVuaXF1ZSBpbiB0aGUgYXNzZW1ibHksIGFuZCBkaWZmZXJlbnQgZm9yIGVhY2gKLXNlcGFyYXRlIG1hY3JvIGV4cGFuc2lvbi4gIEBjb2Rle0xPQ0FMfSBhbGxvd3MgeW91IHRvIHdyaXRlIG1hY3JvcyB0aGF0Ci1kZWZpbmUgc3ltYm9scywgd2l0aG91dCBmZWFyIG9mIGNvbmZsaWN0IGJldHdlZW4gc2VwYXJhdGUgbWFjcm8gZXhwYW5zaW9ucy4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIERhdGEKLUBzZWN0aW9uIERhdGEgb3V0cHV0Ci0KLUluIGFzc2VtYmx5IGNvZGUsIHlvdSBvZnRlbiBuZWVkIHRvIHNwZWNpZnkgd29ya2luZyBhcmVhcyBvZiBtZW1vcnk7Ci1kZXBlbmRpbmcgb24gdGhlIGFwcGxpY2F0aW9uLCB5b3UgbWF5IHdhbnQgdG8gaW5pdGlhbGl6ZSBzdWNoIG1lbW9yeSBvcgotbm90LiAgQHNje2dhc3B9IHByb3ZpZGVzIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRvIGhlbHAgeW91IGF2b2lkCi1yZXBldGl0aXZlIGNvZGluZyBmb3IgYm90aCBwdXJwb3Nlcy4KLQotWW91IGNhbiB1c2UgbGFiZWxzIGFzIHVzdWFsIHRvIG1hcmsgdGhlIGRhdGEgYXJlYXMuCi0KLUBtZW51Ci0qIEluaXRpYWxpemVkOjoKLSogVW5pbml0aWFsaXplZDo6Ci1AZW5kIG1lbnUKLQotQG5vZGUgSW5pdGlhbGl6ZWQKLUBzdWJzZWN0aW9uIEluaXRpYWxpemVkIGRhdGEKLQotVGhlc2UgYXJlIHRoZSBAc2N7Z2FzcH0gZGlyZWN0aXZlcyBmb3IgaW5pdGlhbGl6ZWQgZGF0YSwgYW5kIHRoZSBzdGFuZGFyZAotQHNje2dudX0gYXNzZW1ibGVyIGRpcmVjdGl2ZXMgdGhleSBleHBhbmQgdG86Ci0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5EQVRBIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KLUBpdGVteCAuREFUQS5CIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KLUBpdGVteCAuREFUQS5XIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KLUBpdGVteCAuREFUQS5MIEB2YXJ7ZXhwcn0sIEB2YXJ7ZXhwcn0sIEBkb3Rze30KLUV2YWx1YXRlIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMgQHZhcntleHByfSwgYW5kIGVtaXQgdGhlIGNvcnJlc3BvbmRpbmcKLUBjb2Rle2FzfSBkaXJlY3RpdmUgKGxhYmVsbGVkIHdpdGggQHZhcntsYWJ9KS4gIFRoZSB1bnF1YWxpZmllZAotQGNvZGV7LkRBVEF9IGVtaXRzIEBzYW1wey5sb25nfTsgQGNvZGV7LkRBVEEuQn0gZW1pdHMgQHNhbXB7LmJ5dGV9OwotQGNvZGV7LkRBVEEuV30gZW1pdHMgQHNhbXB7LnNob3J0fTsgYW5kIEBjb2Rley5EQVRBLkx9IGVtaXRzCi1Ac2FtcHsubG9uZ30uCi0KLUZvciBleGFtcGxlLCBAc2FtcHtmb28gLkRBVEEgMSwyLDN9IGVtaXRzIEBzYW1we2ZvbzogLmxvbmcgMSwyLDN9LgotCi1AaXRlbSAuREFUQUIgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9Ci1AaXRlbXggLkRBVEFCLkIgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9Ci1AaXRlbXggLkRBVEFCLlcgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9Ci1AaXRlbXggLkRBVEFCLkwgQHZhcntyZXBlYXR9LCBAdmFye2V4cHJ9Ci1AYyBGSVhNRSEgTG9va3MgbGlrZSBnYXNwIGFjY2VwdHMgYW5kIGlnbm9yZXMgYXJncyBhZnRlciAybmQuCi1NYWtlIEBjb2Rle2FzfSBlbWl0IEB2YXJ7cmVwZWF0fSBjb3BpZXMgb2YgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uCi1AdmFye2V4cHJ9ICh1c2luZyB0aGUgQGNvZGV7YXN9IGRpcmVjdGl2ZSBAY29kZXsuZmlsbH0pLgotQHNhbXB7LkRBVEFCLkJ9IHJlcGVhdHMgb25lLWJ5dGUgdmFsdWVzOyBAc2FtcHsuREFUQUIuV30gcmVwZWF0cwotdHdvLWJ5dGUgdmFsdWVzOyBhbmQgQHNhbXB7LkRBVEFCLkx9IHJlcGVhdHMgZm91ci1ieXRlIHZhbHVlcy4KLUBzYW1wey5EQVRBQn0gd2l0aG91dCBhIHN1ZmZpeCByZXBlYXRzIGZvdXItYnl0ZSB2YWx1ZXMsIGp1c3QgbGlrZQotQHNhbXB7LkRBVEFCLkx9LgotCi1AYyBGSVhNRSEgQWxsb3dpbmcgemVybyBtaWdodCBiZSB1c2VmdWwgZm9yIGVkZ2UgY29uZGl0aW9ucyBpbiBtYWNyb3MuCi1AdmFye3JlcGVhdH0gbXVzdCBiZSBhbiBhYnNvbHV0ZSBleHByZXNzaW9uIHdpdGggYSBwb3NpdGl2ZSB2YWx1ZS4KLQotQGl0ZW0gLlNEQVRBICJAdmFye3N0cn0iIEBkb3Rze30KLVN0cmluZyBkYXRhLiAgRW1pdHMgYSBjb25jYXRlbmF0aW9uIG9mIGJ5dGVzLCBwcmVjaXNlbHkgYXMgeW91IHNwZWNpZnkKLXRoZW0gKGluIHBhcnRpY3VsYXIsIEBlbXBoe25vdGhpbmcgaXMgYWRkZWQgdG8gbWFyayB0aGUgZW5kfSBvZiB0aGUKLXN0cmluZykuICBAeHJlZntDb25zdGFudHMsLCBTdHJpbmcgYW5kIG51bWVyaWMgY29uc3RhbnRzfSwgZm9yIGRldGFpbHMKLWFib3V0IGhvdyB0byB3cml0ZSBzdHJpbmdzLiAgQGNvZGV7LlNEQVRBfSBjb25jYXRlbmF0ZXMgbXVsdGlwbGUKLWFyZ3VtZW50cywgbWFraW5nIGl0IGVhc3kgdG8gc3dpdGNoIGJldHdlZW4gc3RyaW5nIHJlcHJlc2VudGF0aW9ucy4gIFlvdQotY2FuIHVzZSBjb21tYXMgdG8gc2VwYXJhdGUgdGhlIGluZGl2aWR1YWwgYXJndW1lbnRzIGZvciBjbGFyaXR5LCBpZiB5b3UKLWNob29zZS4KLQotQGl0ZW0gLlNEQVRBQiBAdmFye3JlcGVhdH0sICJAdmFye3N0cn0iIEBkb3Rze30KLVJlcGVhdGVkIHN0cmluZyBkYXRhLiAgVGhlIGZpcnN0IGFyZ3VtZW50IHNwZWNpZmllcyBob3cgbWFueSBjb3BpZXMgb2YKLXRoZSBzdHJpbmcgdG8gZW1pdDsgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmeSB0aGUgc3RyaW5nLCBpbiB0aGUKLXNhbWUgd2F5IGFzIHRoZSBhcmd1bWVudHMgdG8gQGNvZGV7LlNEQVRBfS4KLQotQGl0ZW0gLlNEQVRBWiAiQHZhcntzdHJ9IiBAZG90c3t9Ci1aZXJvLXRlcm1pbmF0ZWQgc3RyaW5nIGRhdGEuICBKdXN0IGxpa2UgQGNvZGV7LlNEQVRBfSwgZXhjZXB0IHRoYXQKLUBjb2Rley5TREFUQVp9IHdyaXRlcyBhIHplcm8gYnl0ZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0KLUBpdGVtIC5TREFUQUMgIkB2YXJ7c3RyfSIgQGRvdHN7fQotQ291bnQtcHJlZml4ZWQgc3RyaW5nIGRhdGEuICBKdXN0IGxpa2UgQGNvZGV7LlNEQVRBfSwgZXhjZXB0IHRoYXQKLUBzY3tnYXNwfSBwcmVjZWRlcyB0aGUgc3RyaW5nIHdpdGggYSBsZWFkaW5nIG9uZS1ieXRlIGNvdW50LiAgRm9yCi1leGFtcGxlLCBAc2FtcHsuU0RBVEFDICJISSJ9IGdlbmVyYXRlcyBAc2FtcHsuYnl0ZSAyLDcyLDczfS4gIFNpbmNlIHRoZQotY291bnQgZmllbGQgaXMgb25seSBvbmUgYnl0ZSwgeW91IGNhbiBvbmx5IHVzZSBAY29kZXsuU0RBVEFDfSBmb3IKLXN0cmluZ3MgbGVzcyB0aGFuIDI1NiBieXRlcyBpbiBsZW5ndGguCi1AZW5kIGZ0YWJsZQotCi1Abm9kZSBVbmluaXRpYWxpemVkCi1Ac3Vic2VjdGlvbiBVbmluaXRpYWxpemVkIGRhdGEKLQotQGMgRklYTUUhICAuc3BhY2UgZGlmZmVyZW50IG9uIHNvbWUgcGxhdGZvcm1zLCBub3RhYmx5IEhQUEEuICBDb25maWc/Ci1Vc2UgdGhlIEBjb2Rley5SRVN9LCBAY29kZXsuU1JFU30sIEBjb2Rley5TUkVTQ30sIGFuZCBAY29kZXsuU1JFU1p9Ci1kaXJlY3RpdmVzIHRvIHJlc2VydmUgbWVtb3J5IGFuZCBsZWF2ZSBpdCB1bmluaXRpYWxpemVkLiAgQHNje2dhc3B9Ci1yZXNvbHZlcyB0aGVzZSBkaXJlY3RpdmVzIHRvIGFwcHJvcHJpYXRlIGNhbGxzIG9mIHRoZSBAc2N7Z251fQotQGNvZGV7YXN9IEBjb2Rley5zcGFjZX0gZGlyZWN0aXZlLgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuUkVTIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlJFUy5CIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlJFUy5XIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlJFUy5MIEB2YXJ7Y291bnR9Ci1SZXNlcnZlIHJvb20gZm9yIEB2YXJ7Y291bnR9IHVuaW5pdGlhbGl6ZWQgZWxlbWVudHMgb2YgZGF0YS4gIFRoZQotc3VmZml4IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQ6IEBjb2Rley5SRVMuQn0gcmVzZXJ2ZXMKLUB2YXJ7Y291bnR9IGJ5dGVzLCBAY29kZXsuUkVTLld9IHJlc2VydmVzIEB2YXJ7Y291bnR9IHBhaXJzIG9mIGJ5dGVzLAotYW5kIEBjb2Rley5SRVMuTH0gcmVzZXJ2ZXMgQHZhcntjb3VudH0gcXVhcnRldHMuICBAY29kZXsuUkVTfSB3aXRob3V0IGEKLXN1ZmZpeCBpcyBlcXVpdmFsZW50IHRvIEBjb2Rley5SRVMuTH0uCi0KLUBpdGVtIC5TUkVTIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVMuQiBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTLlcgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFUy5MIEB2YXJ7Y291bnR9Ci1AYyBGSVhNRSEgIFRoaXMgaXMgYm9yaW5nLiAgU2hvdWxkbid0IGl0IGF0IGxlYXN0IGhhdmUgYSBkaWZmZXJlbnQKLUBjICAgICAgICAgZGVmYXVsdCBzaXplPyAgKGUuZy4gdGhlICJTIiBzdWdnZXN0cyAic3RyaW5nIiwgZm9yIHdoaWNoIC5CCi1AYyAgICAgICAgIHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUpCi1AY29kZXsuU1JFU30gaXMgYSBzeW5vbnltIGZvciBAc2FtcHsuUkVTfS4KLQotQGl0ZW0gLlNSRVNDIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNDLkIgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU0MuVyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTQy5MIEB2YXJ7Y291bnR9Ci1MaWtlIEBjb2Rley5TUkVTfSwgYnV0IHJlc2VydmVzIHNwYWNlIGZvciBAY29kZXtAdmFye2NvdW50fSsxfSBlbGVtZW50cy4KLQotQGl0ZW0gLlNSRVNaIEB2YXJ7Y291bnR9Ci1AaXRlbXggLlNSRVNaLkIgQHZhcntjb3VudH0KLUBpdGVteCAuU1JFU1ouVyBAdmFye2NvdW50fQotQGl0ZW14IC5TUkVTWi5MIEB2YXJ7Y291bnR9Ci1MaWtlIEBjb2Rley5TUkVTfSwgYnV0IHJlc2VydmVzIHNwYWNlIGZvciBAY29kZXtAdmFye2NvdW50fSsxfSBlbGVtZW50cy4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIExpc3RpbmdzCi1Ac2VjdGlvbiBBc3NlbWJseSBsaXN0aW5nIGNvbnRyb2wKLQotVGhlIEBzY3tnYXNwfSBsaXN0aW5nLWNvbnRyb2wgZGlyZWN0aXZlcyBjb3JyZXNwb25kIHRvCi1yZWxhdGVkIEBzY3tnbnV9IEBjb2Rle2FzfSBkaXJlY3RpdmVzLgotCi1AZnRhYmxlIEBjb2RlCi1AaXRlbSAuUFJJTlQgTElTVAotQGl0ZW14IC5QUklOVCBOT0xJU1QKLVByaW50IGNvbnRyb2wuICBUaGlzIGRpcmVjdGl2ZSBlbWl0cyB0aGUgQHNje2dudX0gQGNvZGV7YXN9IGRpcmVjdGl2ZQotQGNvZGV7Lmxpc3R9IG9yIEBjb2Rley5ub2xpc3R9LCBhY2NvcmRpbmcgdG8gaXRzIGFyZ3VtZW50LiAgQHhyZWZ7TGlzdCwsCi1AY29kZXsubGlzdH0sIGFzLmluZm8sIFVzaW5nIGFzfSwgZm9yIGRldGFpbHMgb24gaG93IHRoZXNlIGRpcmVjdGl2ZXMKLWludGVyYWN0LgotCi1AaXRlbSAuRk9STSBMSU49QHZhcntsbn0KLUBpdGVteCAuRk9STSBDT0w9QHZhcntjb2xzfQotQGl0ZW14IC5GT1JNIExJTj1AdmFye2xufSBDT0w9QHZhcntjb2xzfQotU3BlY2lmeSB0aGUgcGFnZSBzaXplIGZvciBhc3NlbWJseSBsaXN0aW5nczogQHZhcntsbn0gcmVwcmVzZW50cyB0aGUKLW51bWJlciBvZiBsaW5lcywgYW5kIEB2YXJ7Y29sc30gdGhlIG51bWJlciBvZiBjb2x1bW5zLiAgWW91IG1heSBzcGVjaWZ5Ci1laXRoZXIgcGFnZSBkaW1lbnNpb24gaW5kZXBlbmRlbnRseSwgb3IgYm90aCB0b2dldGhlci4gIElmIHlvdSBkbyBub3QKLXNwZWNpZnkgdGhlIG51bWJlciBvZiBsaW5lcywgQHNje2dhc3B9IGFzc3VtZXMgNjAgbGluZXM7IGlmIHlvdSBkbyBub3QKLXNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zLCBAc2N7Z2FzcH0gYXNzdW1lcyAxMzIgY29sdW1ucy4KLShBbnkgdmFsdWVzIHlvdSBtYXkgaGF2ZSBzcGVjaWZpZWQgaW4gcHJldmlvdXMgaW5zdGFuY2VzIG9mIEBjb2Rley5GT1JNfQotZG8gQGVtcGh7bm90fSBjYXJyeSBvdmVyIGFzIGRlZmF1bHRzLikgIEVtaXRzIHRoZSBAY29kZXsucHNpemV9Ci1hc3NlbWJsZXIgZGlyZWN0aXZlLgotCi1AaXRlbSAuSEVBRElORyBAdmFye3N0cmluZ30KLVNwZWNpZnkgQHZhcntzdHJpbmd9IGFzIHRoZSB0aXRsZSBvZiB5b3VyIGFzc2VtYmx5IGxpc3RpbmdzLiAgRW1pdHMKLUBzYW1wey50aXRsZSAiQHZhcntzdHJpbmd9In0uCi0KLUBpdGVtIC5QQUdFCi1Gb3JjZSBhIG5ldyBwYWdlIGluIGFzc2VtYmx5IGxpc3RpbmdzLiAgRW1pdHMgQHNhbXB7LmVqZWN0fS4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIE90aGVyIENvbW1hbmRzCi1Ac2VjdGlvbiBNaXNjZWxsYW5lb3VzIGNvbW1hbmRzCi0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5BTFRFUk5BVEUKLVVzZSB0aGUgYWx0ZXJuYXRlIG1hY3JvIHN5bnRheCBoZW5jZWZvcnRoIGluIHRoZSBhc3NlbWJseS4KLUB4cmVme0FsdGVybmF0ZSwsIEFsdGVybmF0ZSBtYWNybyBzeW50YXh9LgotCi1AaXRlbSAuT1JHCi1AYyBGSVhNRSEgIFRoaXMgaXMgdmVyeSBzdHJhbmdlLCBzaW5jZSBfR0FTXyB1bmRlcnN0YW5kcyAub3JnCi1UaGlzIGNvbW1hbmQgaXMgcmVjb2duaXplZCwgYnV0IG5vdCB5ZXQgaW1wbGVtZW50ZWQuICBAc2N7Z2FzcH0KLWdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGZvciBwcm9ncmFtcyB0aGF0IHVzZSBAY29kZXsuT1JHfS4KLQotQGl0ZW0gLlJBRElYIEB2YXJ7c30KLUBjIEZJWE1FIG5vIHRlc3QgY2FzZXMgaW4gdGVzdHN1aXRlL2dhc3AKLUBzY3tnYXNwfSB1bmRlcnN0YW5kcyBudW1iZXJzIGluIGFueSBvZiBiYXNlIHR3bywgZWlnaHQsIHRlbiwgb3IKLXNpeHRlZW4uICBZb3UgY2FuIGVuY29kZSB0aGUgYmFzZSBleHBsaWNpdGx5IGluIGFueSBudW1lcmljIGNvbnN0YW50Ci0oQHB4cmVme0NvbnN0YW50cywsIFN0cmluZyBhbmQgbnVtZXJpYyBjb25zdGFudHN9KS4gIElmIHlvdSB3cml0ZQotbnVtYmVycyB3aXRob3V0IGFuIGV4cGxpY2l0IGluZGljYXRpb24gb2YgdGhlIGJhc2UsIHRoZSBtb3N0IHJlY2VudAotQHNhbXB7LlJBRElYIEB2YXJ7c319IGNvbW1hbmQgZGV0ZXJtaW5lcyBob3cgdGhleSBhcmUgaW50ZXJwcmV0ZWQuCi1AdmFye3N9IGlzIGEgc2luZ2xlIGxldHRlciwgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gLlJBRElYIEIKLUJhc2UgMi4KLQotQGl0ZW0gLlJBRElYIFEKLUJhc2UgOC4KLQotQGl0ZW0gLlJBRElYIEQKLUJhc2UgMTAuICBUaGlzIGlzIHRoZSBvcmlnaW5hbCBkZWZhdWx0IHJhZGl4LgotCi1AaXRlbSAuUkFESVggSAotQmFzZSAxNi4KLUBlbmQgdGFibGUKLQotWW91IG1heSBzcGVjaWZ5IHRoZSBhcmd1bWVudCBAdmFye3N9IGluIGxvd2VyIGNhc2UgKGFueSBvZiBAc2FtcHticWRofSkKLXdpdGggdGhlIHNhbWUgZWZmZWN0cy4KLQotQGl0ZW0gLkVYUE9SVCBAdmFye25hbWV9Ci1AaXRlbXggLkdMT0JBTCBAdmFye25hbWV9Ci1AYyBGSVhNRSEgTm8gdGVzdCBjYXNlcyBpbiB0ZXN0c3VpdGUvZ2FzcAotRGVjbGFyZSBAdmFye25hbWV9IGdsb2JhbCAoZW1pdHMgQHNhbXB7Lmdsb2JhbCBAdmFye25hbWV9fSkuICBUaGUgdHdvCi1kaXJlY3RpdmVzIGFyZSBzeW5vbnltb3VzLgotCi1AaXRlbSAuUFJPR1JBTQotTm8gZWZmZWN0OiBAc2N7Z2FzcH0gYWNjZXB0cyB0aGlzIGRpcmVjdGl2ZSwgYW5kIHNpbGVudGx5IGlnbm9yZXMgaXQuCi0KLUBpdGVtIC5FTkQKLU1hcmsgZW5kIG9mIGVhY2ggcHJlcHJvY2Vzc29yIGZpbGUuICBAc2N7Z2FzcH0gaXNzdWVzIGEgd2FybmluZyBpZiBpdAotcmVhY2hlcyBlbmQgb2YgZmlsZSB3aXRob3V0IHNlZWluZyB0aGlzIGNvbW1hbmQuCi0KLUBpdGVtIC5JTkNMVURFICJAdmFye3N0cn0iCi1QcmVwcm9jZXNzIHRoZSBmaWxlIG5hbWVkIGJ5IEB2YXJ7c3RyfSwgYXMgaWYgaXRzIGNvbnRlbnRzIGFwcGVhcmVkCi13aGVyZSB0aGUgQGNvZGV7LklOQ0xVREV9IGRpcmVjdGl2ZSBkb2VzLiAgQHNje2dhc3B9IGltcG9zZXMgYSBtYXhpbXVtCi1saW1pdCBvZiAzMCBzdGFja2VkIGluY2x1ZGUgZmlsZXMsIGFzIGEgc2FuaXR5IGNoZWNrLgotQGMgRklYTUUhICBXaHkgaXMgaW5jbHVkZSBkZXB0aCBub3QgYWZmZWN0ZWQgYnkgLXU/Ci0KLUBpdGVtIC5BTElHTiBAdmFye3NpemV9Ci1AYyBGSVhNRSEgV2h5IGlzIHRoaXMgbm90IHV0dGVybHkgcG9pbnRsZXNzPwotRXZhbHVhdGUgdGhlIGFic29sdXRlIGV4cHJlc3Npb24gQHZhcntzaXplfSwgYW5kIGVtaXQgdGhlIGFzc2VtYmx5Ci1pbnN0cnVjdGlvbiBAc2FtcHsuYWxpZ24gQHZhcntzaXplfX0gdXNpbmcgdGhlIHJlc3VsdC4KLUBlbmQgZnRhYmxlCi0KLUBub2RlIFN5bnRheCBEZXRhaWxzCi1Ac2VjdGlvbiBEZXRhaWxzIG9mIHRoZSBHQVNQIHN5bnRheAotCi1TaW5jZSBAc2N7Z2FzcH0gaXMgbWVhbnQgdG8gd29yayB3aXRoIGFzc2VtYmx5IGNvZGUsIGl0cyBzdGF0ZW1lbnQKLXN5bnRheCBoYXMgbm8gc3VycHJpc2VzIGZvciB0aGUgYXNzZW1ibHkgcHJvZ3JhbW1lci4KLQotQGNpbmRleCB3aGl0ZXNwYWNlCi1AZW1waHtXaGl0ZXNwYWNlfSAoYmxhbmtzIG9yIHRhYnM7IEBlbXBoe25vdH0gbmV3bGluZSkgaXMgcGFydGlhbGx5Ci1zaWduaWZpY2FudCwgaW4gdGhhdCBpdCBkZWxpbWl0cyB1cCB0byB0aHJlZSBmaWVsZHMgaW4gYSBsaW5lLiAgVGhlCi1hbW91bnQgb2Ygd2hpdGVzcGFjZSBkb2VzIG5vdCBtYXR0ZXI7IHlvdSBtYXkgbGluZSB1cCBmaWVsZHMgaW4gc2VwYXJhdGUKLWxpbmVzIGlmIHlvdSB3aXNoLCBidXQgQHNje2dhc3B9IGRvZXMgbm90IHJlcXVpcmUgdGhhdC4KLQotQGNpbmRleCBmaWVsZHMgb2YgQHNje2dhc3B9IHNvdXJjZSBsaW5lCi1AY2luZGV4IGxhYmVsIGZpZWxkCi1UaGUgQGVtcGh7Zmlyc3QgZmllbGR9LCBhbiBvcHRpb25hbCBAZGZue2xhYmVsfSwgbXVzdCBiZSBmbHVzaCBsZWZ0IGluIGEKLWxpbmUgKHdpdGggbm8gbGVhZGluZyB3aGl0ZXNwYWNlKSBpZiBpdCBhcHBlYXJzIGF0IGFsbC4gIFlvdSBtYXkgdXNlIGEKLWNvbG9uIGFmdGVyIHRoZSBsYWJlbCBpZiB5b3Ugd2lzaDsgQHNje2dhc3B9IG5laXRoZXIgcmVxdWlyZXMgdGhlIGNvbG9uCi1ub3Igb2JqZWN0cyB0byBpdCAoYnV0IHdpbGwgbm90IGluY2x1ZGUgaXQgYXMgcGFydCBvZiB0aGUgbGFiZWwgbmFtZSkuCi0KLUBjaW5kZXggZGlyZWN0aXZlIGZpZWxkCi1UaGUgQGVtcGh7c2Vjb25kIGZpZWxkfSwgd2hpY2ggbXVzdCBhcHBlYXIgYWZ0ZXIgc29tZSB3aGl0ZXNwYWNlLAotY29udGFpbnMgYSBAc2N7Z2FzcH0gb3IgYXNzZW1ibHkgQGRmbntkaXJlY3RpdmV9LgotCi1AY2luZGV4IGFyZ3VtZW50IGZpZWxkcwotQW55IEBlbXBoe2Z1cnRoZXIgZmllbGRzfSBvbiBhIGxpbmUgYXJlIEBkZm57YXJndW1lbnRzfSB0byB0aGUKLWRpcmVjdGl2ZTsgeW91IGNhbiBzZXBhcmF0ZSB0aGVtIGZyb20gb25lIGFub3RoZXIgdXNpbmcgZWl0aGVyIGNvbW1hcyBvcgotd2hpdGVzcGFjZS4KLQotQG1lbnUKLSogTWFya2Vyczo6Ci0qIENvbnN0YW50czo6Ci0qIFN5bWJvbHM6OgotKiBFeHByZXNzaW9uczo6Ci0qIFN0cmluZyBCdWlsdGluczo6Ci1AZW5kIG1lbnUKLQotQG5vZGUgTWFya2VycwotQHN1YnNlY3Rpb24gU3BlY2lhbCBzeW50YWN0aWMgbWFya2VycwotCi1Ac2N7Z2FzcH0gcmVjb2duaXplcyBhIGZldyBzcGVjaWFsIG1hcmtlcnM6IHRvIGRlbGltaXQgY29tbWVudHMsIHRvCi1jb250aW51ZSBhIHN0YXRlbWVudCBvbiB0aGUgbmV4dCBsaW5lLCB0byBzZXBhcmF0ZSBzeW1ib2xzIGZyb20gb3RoZXIKLWNoYXJhY3RlcnMsIGFuZCB0byBjb3B5IHRleHQgdG8gdGhlIG91dHB1dCBsaXRlcmFsbHkuICAoT25lIG90aGVyCi1zcGVjaWFsIG1hcmtlciwgQHNhbXB7XEBAfSwgd29ya3Mgb25seSB3aXRoaW4gbWFjcm8gZGVmaW5pdGlvbnM7Ci1AcHhyZWZ7TWFjcm9zLCwgRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30uKQotCi1AY2luZGV4IGNvbW1lbnRzCi1UaGUgdHJhaWxpbmcgcGFydCBvZiBhbnkgQHNje2dhc3B9IHNvdXJjZSBsaW5lIG1heSBiZSBhIEBkZm57Y29tbWVudH0uCi1BIGNvbW1lbnQgYmVnaW5zIHdpdGggdGhlIGZpcnN0IHVucXVvdGVkIGNvbW1lbnQgY2hhcmFjdGVyIChAc2FtcHshfSBieQotZGVmYXVsdCksIG9yIGFuIGVzY2FwZWQgb3IgZG91YmxlZCBjb21tZW50IGNoYXJhY3RlciAoQHNhbXB7XCF9IG9yCi1Ac2FtcHshIX0gYnkgZGVmYXVsdCksIGFuZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgYSBsaW5lLiAgWW91IGNhbgotc3BlY2lmeSB3aGF0IGNvbW1lbnQgY2hhcmFjdGVyIHRvIHVzZSB3aXRoIHRoZSBAc2FtcHstY30gb3B0aW9uCi0oQHB4cmVme0ludm9raW5nIEdBU1AsLCBDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgVGhlIHR3byBraW5kcyBvZgotY29tbWVudCBtYXJrZXJzIGxlYWQgdG8gc2xpZ2h0bHkgZGlmZmVyZW50IHRyZWF0bWVudDoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSAhCi1BIHNpbmdsZSwgdW4tZXNjYXBlZCBjb21tZW50IGNoYXJhY3RlciBnZW5lcmF0ZXMgYW4gYXNzZW1ibHkgY29tbWVudCBpbgotdGhlIEBzY3tnYXNwfSBvdXRwdXQuICBAc2N7Z2FzcH0gZXZhbHVhdGVzIGFueSBwcmVwcm9jZXNzb3IgdmFyaWFibGVzCi0obWFjcm8gYXJndW1lbnRzLCBvciB2YXJpYWJsZXMgZGVmaW5lZCB3aXRoIEBjb2Rley5BU1NJR05BfSBvcgotQGNvZGV7LkFTU0lHTkN9KSBwcmVzZW50LiAgRm9yIGV4YW1wbGUsIGEgbWFjcm8gdGhhdCBiZWdpbnMgbGlrZSB0aGlzCi0KLUBleGFtcGxlCi0gICAgICAgIC5NQUNSTyAgU1VNIEZST009MCwgVE89OQotICAgICAgICAhIFxGUk9NIFxUTwotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotaXNzdWVzIGFzIHRoZSBmaXJzdCBsaW5lIG9mIG91dHB1dCBhIGNvbW1lbnQgdGhhdCByZWNvcmRzIHRoZQotdmFsdWVzIHlvdSB1c2VkIHRvIGNhbGwgdGhlIG1hY3JvLgotCi1AYyBjb21tZW50cywgcHJlcHJvY2Vzc29yLW9ubHkKLUBjIHByZXByb2Nlc3Nvci1vbmx5IGNvbW1lbnRzCi1AYyBHQVNQLW9ubHkgY29tbWVudHMKLUBpdGVtIFwhCi1AaXRlbXggISEKLUVpdGhlciBhbiBlc2NhcGVkIGNvbW1lbnQgY2hhcmFjdGVyLCBvciBhIGRvdWJsZSBjb21tZW50IGNoYXJhY3RlciwKLW1hcmtzIGEgQHNje2dhc3B9IHNvdXJjZSBjb21tZW50LiAgQHNje2dhc3B9IGRvZXMgbm90IGNvcHkgc3VjaCBjb21tZW50cwotdG8gdGhlIGFzc2VtYmx5IG91dHB1dC4KLUBlbmQgdGFibGUKLQotQGNpbmRleCBjb250aW51YXRpb24gY2hhcmFjdGVyCi1Aa2luZGV4ICsKLVRvIEBlbXBoe2NvbnRpbnVlIGEgc3RhdGVtZW50fSBvbiB0aGUgbmV4dCBsaW5lIG9mIHRoZSBmaWxlLCBiZWdpbiB0aGUKLXNlY29uZCBsaW5lIHdpdGggdGhlIGNoYXJhY3RlciBAc2FtcHsrfS4KLQotQGNpbmRleCBsaXRlcmFsIGNvcHkgdG8gb3V0cHV0Ci1AY2luZGV4IGNvcHlpbmcgbGl0ZXJhbGx5IHRvIG91dHB1dAotQGNpbmRleCBwcmVwcm9jZXNzaW5nLCBhdm9pZGluZwotQGNpbmRleCBhdm9pZGluZyBwcmVwcm9jZXNzaW5nCi1PY2Nhc2lvbmFsbHkgeW91IG1heSB3YW50IHRvIHByZXZlbnQgQHNje2dhc3B9IGZyb20gcHJlcHJvY2Vzc2luZyBzb21lCi1wYXJ0aWN1bGFyIGJpdCBvZiB0ZXh0LiAgVG8gQGVtcGh7Y29weSBsaXRlcmFsbHl9IGZyb20gdGhlIEBzY3tnYXNwfQotc291cmNlIHRvIGl0cyBvdXRwdXQsIHBsYWNlIEBzYW1we1wofSBiZWZvcmUgdGhlIHN0cmluZyB0byBjb3B5LCBhbmQKLUBzYW1weyl9IGF0IHRoZSBlbmQuICBGb3IgZXhhbXBsZSwgd3JpdGUgQHNhbXB7XChcISl9IGlmIHlvdSBuZWVkIHRoZQotY2hhcmFjdGVycyBAc2FtcHtcIX0gaW4geW91ciBhc3NlbWJseSBvdXRwdXQuCi0KLUBjaW5kZXggc3ltYm9sIHNlcGFyYXRvcgotQGNpbmRleCB0ZXh0LCBzZXBhcmF0aW5nIGZyb20gc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCBzZXBhcmF0aW5nIGZyb20gdGV4dAotVG8gQGVtcGh7c2VwYXJhdGUgYSBwcmVwcm9jZXNzb3IgdmFyaWFibGV9IGZyb20gdGV4dCB0byBhcHBlYXIKLWltbWVkaWF0ZWx5IGFmdGVyIGl0cyB2YWx1ZSwgd3JpdGUgYSBzaW5nbGUgcXVvdGUgKEBjb2Rleyd9KS4gIEZvcgotZXhhbXBsZSwgQHNhbXB7LlNEQVRBICJcUCcxIn0gd3JpdGVzIGEgc3RyaW5nIGJ1aWx0IGJ5IGNvbmNhdGVuYXRpbmcgdGhlCi12YWx1ZSBvZiBAY29kZXtQfSBhbmQgdGhlIGRpZ2l0IEBzYW1wezF9LiAgKFlvdSBjYW5ub3QgYWNoaWV2ZSB0aGlzIGJ5Ci13cml0aW5nIGp1c3QgQHNhbXB7XFAxfSwgc2luY2UgQHNhbXB7UDF9IGlzIGl0c2VsZiBhIHZhbGlkIG5hbWUgZm9yIGEKLXByZXByb2Nlc3NvciB2YXJpYWJsZS4pCi0KLUBub2RlIENvbnN0YW50cwotQHN1YnNlY3Rpb24gU3RyaW5nIGFuZCBudW1lcmljIGNvbnN0YW50cwotCi1UaGVyZSBhcmUgdHdvIHdheXMgb2Ygd3JpdGluZyBAZGZue3N0cmluZyBjb25zdGFudHN9IGluIEBzY3tnYXNwfTogYXMKLWxpdGVyYWwgdGV4dCwgYW5kIGJ5IG51bWVyaWMgYnl0ZSB2YWx1ZS4gIFNwZWNpZnkgYSBzdHJpbmcgbGl0ZXJhbAotYmV0d2VlbiBkb3VibGUgcXVvdGVzIChAY29kZXsiQHZhcntzdHJ9In0pLiAgU3BlY2lmeSBhbiBpbmRpdmlkdWFsCi1udW1lcmljIGJ5dGUgdmFsdWUgYXMgYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiBiZXR3ZWVuIGFuZ2xlIGJyYWNrZXRzCi0oQGNvZGV7PEB2YXJ7ZXhwcn0+fS4gIERpcmVjdGl2ZXMgdGhhdCBvdXRwdXQgc3RyaW5ncyBhbGxvdyB5b3UgdG8KLXNwZWNpZnkgYW55IG51bWJlciBvZiBlaXRoZXIga2luZCBvZiB2YWx1ZSwgaW4gd2hhdGV2ZXIgb3JkZXIgaXMKLWNvbnZlbmllbnQsIGFuZCBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0LiAgKEFsdGVybmF0ZSBzeW50YXggbW9kZQotaW50cm9kdWNlcyBhIG51bWJlciBvZiBhbHRlcm5hdGl2ZSBzdHJpbmcgbm90YXRpb25zOyBAcHhyZWZ7QWx0ZXJuYXRlLCwKLUFsdGVybmF0ZSBtYWNybyBzeW50YXh9LikKLQotQGMgRGV0YWlscyBvZiBudW1lcmljIG5vdGF0aW9uLCBlLmcuIGJhc2UgcHJlZml4ZXMKLVlvdSBjYW4gd3JpdGUgQGRmbntudW1lcmljIGNvbnN0YW50c30gZWl0aGVyIGluIGEgc3BlY2lmaWMgYmFzZSwgb3IgaW4KLXdoYXRldmVyIGJhc2UgaXMgY3VycmVudGx5IHNlbGVjdGVkIChlaXRoZXIgMTAsIG9yIHNlbGVjdGVkIGJ5IHRoZSBtb3N0Ci1yZWNlbnQgQGNvZGV7LlJBRElYfSkuCi0KLVRvIHdyaXRlIGEgbnVtYmVyIGluIGEgQGVtcGh7c3BlY2lmaWMgYmFzZX0sIHVzZSB0aGUgcGF0dGVybgotQGNvZGV7QHZhcntzfSdAdmFye2RkZH19OiBhIGJhc2Ugc3BlY2lmaWVyIGNoYXJhY3RlciBAdmFye3N9LCBmb2xsb3dlZAotYnkgYSBzaW5nbGUgcXVvdGUgZm9sbG93ZWQgYnkgZGlnaXRzIEB2YXJ7ZGRkfS4gIFRoZSBiYXNlIHNwZWNpZmllcgotY2hhcmFjdGVyIG1hdGNoZXMgdGhvc2UgeW91IGNhbiBzcGVjaWZ5IHdpdGggQGNvZGV7LlJBRElYfTogQHNhbXB7Qn0gZm9yCi1iYXNlIDIsIEBzYW1we1F9IGZvciBiYXNlIDgsIEBzYW1we0R9IGZvciBiYXNlIDEwLCBhbmQgQHNhbXB7SH0gZm9yIGJhc2UKLTE2LiAgKFlvdSBjYW4gd3JpdGUgdGhpcyBjaGFyYWN0ZXIgaW4gbG93ZXIgY2FzZSBpZiB5b3UgcHJlZmVyLikKLQotQGMgRklYTUUhIFdoYXQgYXJlIHJ1bGVzIGZvciByZWNvZ25pemluZyBudW1iZXIgaW4gZGVmbHQgYmFzZT8gIFdoYXRldmVyCi1AYyAgICAgICAgaXMgbGVmdCBvdmVyIGFmdGVyIHBhcnNpbmcgb3RoZXIgdGhpbmdzPz8KLQotQG5vZGUgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9scwotCi1Ac2N7Z2FzcH0gcmVjb2duaXplcyBzeW1ib2wgbmFtZXMgdGhhdCBzdGFydCB3aXRoIGFueSBhbHBoYWJldGljIGNoYXJhY3RlciwKLUBzYW1we199LCBvciBAc2FtcHskfSwgYW5kIGNvbnRpbnVlIHdpdGggYW55IG9mIHRoZSBzYW1lIGNoYXJhY3RlcnMgb3IKLXdpdGggZGlnaXRzLiAgTGFiZWwgbmFtZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzLgotCi1Abm9kZSBFeHByZXNzaW9ucwotQHN1YnNlY3Rpb24gQXJpdGhtZXRpYyBleHByZXNzaW9ucyBpbiBHQVNQCi0KLUBjaW5kZXggYWJzb2x1dGUgZXhwcmVzc2lvbnMKLUBjaW5kZXggcmVsb2NhdGFibGUgZXhwcmVzc2lvbnMKLVRoZXJlIGFyZSB0d28ga2luZHMgb2YgZXhwcmVzc2lvbnMsIGRlcGVuZGluZyBvbiB0aGVpciByZXN1bHQ6Ci1AZGZue2Fic29sdXRlfSBleHByZXNzaW9ucywgd2hpY2ggcmVzb2x2ZSB0byBhIGNvbnN0YW50ICh0aGF0IGlzLCB0aGV5Ci1kbyBub3QgaW52b2x2ZSBhbnkgdmFsdWVzIHVua25vd24gdG8gQHNje2dhc3B9KSwgYW5kIEBkZm57cmVsb2NhdGFibGV9Ci1leHByZXNzaW9ucywgd2hpY2ggbXVzdCByZWR1Y2UgdG8gdGhlIGZvcm0KLQotQGV4YW1wbGUKLUB2YXJ7YWRkc3ltfStAdmFye2NvbnN0fS1AdmFye3N1YnN5bX0KLUBlbmQgZXhhbXBsZQotCi1Abm9pbmRlbnQKLXdoZXJlIEB2YXJ7YWRkc3ltfSBhbmQgQHZhcntzdWJzeW19IGFyZSBhc3NlbWJseSBzeW1ib2xzIG9mIHVua25vd24KLXZhbHVlLCBhbmQgQHZhcntjb25zdH0gaXMgYSBjb25zdGFudC4KLQotQXJpdGhtZXRpYyBmb3IgQHNje2dhc3B9IGV4cHJlc3Npb25zIGZvbGxvd3MgdmVyeSBzaW1pbGFyIHJ1bGVzIHRvIEMuCi1Zb3UgY2FuIHVzZSBwYXJlbnRoZXNlcyB0byBjaGFuZ2UgcHJlY2VkZW5jZTsgb3RoZXJ3aXNlLCBhcml0aG1ldGljCi1wcmltaXRpdmVzIGhhdmUgZGVjcmVhc2luZyBwcmVjZWRlbmNlIGluIHRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nCi1saXN0LgotCi1AZW51bWVyYXRlCi1AaXRlbQotU2luZ2xlLWFyZ3VtZW50IEBjb2Rleyt9IChpZGVudGl0eSksIEBjb2Rley19IChhcml0aG1ldGljIG9wcG9zaXRlKSwgb3IKLUBjb2Rle359IChiaXR3aXNlIG5lZ2F0aW9uKS4gIEBlbXBoe1RoZSBhcmd1bWVudCBtdXN0IGJlIGFuIGFic29sdXRlCi1leHByZXNzaW9uLn0KLQotQGl0ZW0KLUBjb2Rleyp9IChtdWx0aXBsaWNhdGlvbikgYW5kIEBjb2Rley99IChkaXZpc2lvbikuICBAZW1waHtCb3RoIGFyZ3VtZW50cwotbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9ucy59Ci0KLUBpdGVtCi1AY29kZXsrfSAoYWRkaXRpb24pIGFuZCBAY29kZXstfSAoc3VidHJhY3Rpb24pLiAgQGVtcGh7QXQgbGVhc3Qgb25lIGFyZ3VtZW50Ci1tdXN0IGJlIGFic29sdXRlLn0KLUBjIEZJWE1FISAgQWN0dWFsbHksIHN1YnRyYWN0aW9uIGRvZXNuJ3QgY2hlY2sgZm9yIHRoaXMuCi0KLUBpdGVtCi1AY29kZXsmfSAoYml0d2lzZSBhbmQpLiAgQGVtcGh7Qm90aCBhcmd1bWVudHMgbXVzdCBiZSBhYnNvbHV0ZS59Ci0KLUBpdGVtCi1AYyBGSVhNRSEgIEkgYWdyZWUgfiBpcyBhIGJldHRlciBub3RhdGlvbiB0aGFuIF4gZm9yIHhvciwgYnV0IGlzIHRoZQotQGMgICAgICAgICBpbXByb3ZlbWVudCB3b3J0aCBkaWZmZXJpbmcgZnJvbSBDPwotQGNvZGV7fH0gKGJpdHdpc2Ugb3IpIGFuZCBAY29kZXt+fSAoYml0d2lzZSBleGNsdXNpdmUgb3I7IEBjb2Rle159IGluCi1DKS4gIEBlbXBoe0JvdGggYXJndW1lbnRzIG11c3QgYmUgYWJzb2x1dGUufQotQGVuZCBlbnVtZXJhdGUKLQotQG5vZGUgU3RyaW5nIEJ1aWx0aW5zCi1Ac3Vic2VjdGlvbiBTdHJpbmcgcHJpbWl0aXZlcwotCi1Zb3UgY2FuIHVzZSB0aGVzZSBwcmltaXRpdmVzIHRvIG1hbmlwdWxhdGUgc3RyaW5ncyAoaW4gdGhlIGFyZ3VtZW50Ci1maWVsZCBvZiBAc2N7Z2FzcH0gc3RhdGVtZW50cyk6Ci0KLUBmdGFibGUgQGNvZGUKLUBpdGVtIC5MRU4oIkB2YXJ7c3RyfSIpCi1DYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBzdHJpbmcgQGNvZGV7IkB2YXJ7c3RyfSJ9LCBhcyBhbiBhYnNvbHV0ZQotZXhwcmVzc2lvbi4gIEZvciBleGFtcGxlLCBAc2FtcHsuUkVTLkIgLkxFTigic2FtcGxlIil9IHJlc2VydmVzIHNpeAotYnl0ZXMgb2YgbWVtb3J5LgotCi1AaXRlbSAuSU5TVFIoIkB2YXJ7c3RyaW5nfSIsICJAdmFye3NlZ30iLCBAdmFye2l4fSkKLVNlYXJjaCBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgQHZhcntzZWd9IGFmdGVyIHBvc2l0aW9uIEB2YXJ7aXh9IG9mCi1AdmFye3N0cmluZ30uICBGb3IgZXhhbXBsZSwgQHNhbXB7LklOU1RSKCJBQkNERUZHIiwgIkNERSIsIDApfSBldmFsdWF0ZXMKLXRvIHRoZSBhYnNvbHV0ZSByZXN1bHQgQGNvZGV7Mn0uCi0KLVRoZSByZXN1bHQgaXMgQGNvZGV7LTF9IGlmIEB2YXJ7c2VnfSBkb2VzIG5vdCBvY2N1ciBpbiBAdmFye3N0cmluZ30KLWFmdGVyIHBvc2l0aW9uIEB2YXJ7aXh9LgotCi1AaXRlbSAuU1VCU1RSKCJAdmFye3N0cmluZ30iLEB2YXJ7c3RhcnR9LEB2YXJ7bGVufSkKLVRoZSBzdWJzdHJpbmcgb2YgQHZhcntzdHJpbmd9IGJlZ2lubmluZyBhdCBieXRlIG51bWJlciBAdmFye3N0YXJ0fSBhbmQKLWV4dGVuZGluZyBmb3IgQHZhcntsZW59IGJ5dGVzLgotQGVuZCBmdGFibGUKLQotQG5vZGUgQWx0ZXJuYXRlCi1Ac2VjdGlvbiBBbHRlcm5hdGUgbWFjcm8gc3ludGF4Ci0KLUlmIHlvdSBzcGVjaWZ5IEBzYW1wey1hfSBvciBAc2FtcHstLWFsdGVybmF0ZX0gb24gdGhlIEBzY3tnYXNwfSBjb21tYW5kCi1saW5lLCB0aGUgcHJlcHJvY2Vzc29yIHVzZXMgc29tZXdoYXQgZGlmZmVyZW50IHN5bnRheC4gIFRoaXMgc3ludGF4IGlzCi1yZW1pbmlzY2VudCBvZiB0aGUgc3ludGF4IG9mIFBoYXIgTGFwIG1hY3JvIGFzc2VtYmxlciwgYnV0IGl0Ci1pcyBAZW1waHtub3R9IG1lYW50IHRvIGJlIGEgZnVsbCBlbXVsYXRpb24gb2YgUGhhciBMYXAgb3Igc2ltaWxhcgotYXNzZW1ibGVycy4gIEluIHBhcnRpY3VsYXIsIEBzY3tnYXNwfSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdGl2ZXMgc3VjaAotYXMgQGNvZGV7REJ9IGFuZCBAY29kZXtJUlB9LCBldmVuIGluIGFsdGVybmF0ZSBzeW50YXggbW9kZS4KLQotSW4gcGFydGljdWxhciwgQHNhbXB7LWF9IChvciBAc2FtcHstLWFsdGVybmF0ZX0pIGVsaWNpdHMgdGhlc2UKLWRpZmZlcmVuY2VzOgotCi1AdGFibGUgQGVtcGgKLUBpdGVtIFByZXByb2Nlc3NvciBkaXJlY3RpdmVzCi1Zb3UgY2FuIHVzZSBAc2N7Z2FzcH0gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgd2l0aG91dCBhIGxlYWRpbmcgQHNhbXB7Ln0KLWRvdC4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHdyaXRlIEBzYW1we1NEQVRBfSB3aXRoIHRoZSBzYW1lIGVmZmVjdCBhcwotQHNhbXB7LlNEQVRBfS4KLQotQGl0ZW0gTE9DQUwKLU9uZSBhZGRpdGlvbmFsIGRpcmVjdGl2ZSwgQGNvZGV7TE9DQUx9LCBpcyBhdmFpbGFibGUuICBAeHJlZntNYWNyb3MsLAotRGVmaW5pbmcgeW91ciBvd24gZGlyZWN0aXZlc30sIGZvciBhbiBleHBsYW5hdGlvbiBvZiBob3cgdG8gdXNlCi1AY29kZXtMT0NBTH0uCi0KLUBuZWVkIDIwMDAKLUBpdGVtIFN0cmluZyBkZWxpbWl0ZXJzCi1Zb3UgY2FuIHdyaXRlIHN0cmluZ3MgZGVsaW1pdGVkIGluIHRoZXNlIG90aGVyIHdheXMgYmVzaWRlcwotQGNvZGV7IkB2YXJ7c3RyaW5nfSJ9OgotCi1AdGFibGUgQGNvZGUKLUBpdGVtICdAdmFye3N0cmluZ30nCi1Zb3UgY2FuIGRlbGltaXQgc3RyaW5ncyB3aXRoIHNpbmdsZS1xdW90ZSBjaGFyYXRlcnMuCi0KLUBpdGVtIDxAdmFye3N0cmluZ30+Ci1Zb3UgY2FuIGRlbGltaXQgc3RyaW5ncyB3aXRoIG1hdGNoaW5nIGFuZ2xlIGJyYWNrZXRzLgotQGVuZCB0YWJsZQotCi1AaXRlbSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyBlc2NhcGUKLVRvIGluY2x1ZGUgYW55IHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbGx5IGluIGEgc3RyaW5nIChldmVuIGlmIHRoZQotY2hhcmFjdGVyIHdvdWxkIG90aGVyd2lzZSBoYXZlIHNvbWUgc3BlY2lhbCBtZWFuaW5nKSwgeW91IGNhbiBwcmVmaXggdGhlCi1jaGFyYWN0ZXIgd2l0aCBAc2FtcHshfSAoYW4gZXhjbGFtYXRpb24gbWFyaykuICBGb3IgZXhhbXBsZSwgeW91IGNhbgotd3JpdGUgQHNhbXB7PDQuMyAhPiA1LjQhIT59IHRvIGdldCB0aGUgbGl0ZXJhbCB0ZXh0IEBzYW1wezQuMyA+IDUuNCF9LgotCi1AaXRlbSBFeHByZXNzaW9uIHJlc3VsdHMgYXMgc3RyaW5ncwotWW91IGNhbiB3cml0ZSBAc2FtcHslQHZhcntleHByfX0gdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gQHZhcntleHByfQotYW5kIHVzZSB0aGUgcmVzdWx0IGFzIGEgc3RyaW5nLiAgCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AY29udGVudHMKLUBieWUKZGlmZiAtLWdpdCBhL2dhcy9kb2MvaDgudGV4aSBiL2dhcy9kb2MvaDgudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMTcxNC4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2g4LnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1AY2xlYXIgQUxMLUFSQ0gKLUBjbGVhciBHRU5FUklDCi1AY2xlYXIgSU5URVJOQUxTCi1AY2xlYXIgTVVMVEktT0JKCi1AY2xlYXIgQU9VVAotQGNsZWFyIEJPVVQKLUBzZXQgQ09GRgotQGNsZWFyIEVMRgotQHNldCBIaXRhY2hpLWFsbAotQHNldCBIOC8zMDAKLUBzZXQgSDgvNTAwCi1Ac2V0IFNICi1AY2xlYXIgRElGRi1UQkwtS0xVR0UKLUBzZXQgSUVFRUZMT0FUCi1AY2xlYXIgVzMyCi1Ac2V0IFcxNgotQHNldCBTUEVDSUFMLVNZTVMKLUBzZXQgQVMgYXMKLUBzZXQgR0NDIGdjYwotQHNldCBMRCBsZAotQHNldCBUQVJHRVQgSDgvMzAwIGFuZCBIOC81MDAKLUBzZXQgVEFSR0VUIEg4LzMwMCwgSDgvNTAwLCBhbmQgSGl0YWNoaSBTSAotQHNldCBPQkotTkFNRSBDT0ZGCi1AYwotQGNsZWFyIGhhdmUtc3RhYnMKLUBzZXQgYWJub3JtYWwtc2VwYXJhdG9yCmRpZmYgLS1naXQgYS9nYXMvZG9jL2ludGVybmFscy50ZXhpIGIvZ2FzL2RvYy9pbnRlcm5hbHMudGV4aQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5MjEwNS4uMDAwMDAwMAotLS0gYS9nYXMvZG9jL2ludGVybmFscy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTY4NyArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGludGVybmFscy5pbmZvCi1Abm9kZSBUb3AKLUB0b3AgQXNzZW1ibGVyIEludGVybmFscwotQHJhaXNlc2VjdGlvbnMKLUBjaW5kZXggaW50ZXJuYWxzCi0KLVRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIGludGVybmFscyBvZiB0aGUgYXNzZW1ibGVyLiAgSXQgaXMgaW5jb21wbGV0ZSwgYnV0Ci1pdCBtYXkgaGVscCBhIGJpdC4KLQotVGhpcyBjaGFwdGVyIHdhcyBsYXN0IG1vZGlmaWVkIG9uICREYXRlJC4gIEl0IGlzIG5vdCB1cGRhdGVkIHJlZ3VsYXJseSwgYW5kIGl0Ci1tYXkgYmUgb3V0IG9mIGRhdGUuCi0KLUBtZW51Ci0qIEdBUyB2ZXJzaW9uczo6ICAgICAgICBHQVMgdmVyc2lvbnMKLSogRGF0YSB0eXBlczo6CQlEYXRhIHR5cGVzCi0qIEdBUyBwcm9jZXNzaW5nOjogICAgICBXaGF0IEdBUyBkb2VzIHdoZW4gaXQgcnVucwotKiBQb3J0aW5nIEdBUzo6ICAgICAgICAgUG9ydGluZyBHQVMKLSogUmVsYXhhdGlvbjo6ICAgICAgICAgIFJlbGF4YXRpb24KLSogQnJva2VuIHdvcmRzOjogICAgICAgIEJyb2tlbiB3b3JkcwotKiBJbnRlcm5hbCBmdW5jdGlvbnM6OiAgSW50ZXJuYWwgZnVuY3Rpb25zCi0qIFRlc3Qgc3VpdGU6OiAgICAgICAgICBUZXN0IHN1aXRlCi1AZW5kIG1lbnUKLQotQG5vZGUgR0FTIHZlcnNpb25zCi1Ac2VjdGlvbiBHQVMgdmVyc2lvbnMKLQotR0FTIGhhcyBhY3F1aXJlZCBsYXllcnMgb2YgY29kZSBvdmVyIHRpbWUuICBUaGUgb3JpZ2luYWwgR0FTIG9ubHkgc3VwcG9ydGVkIHRoZQotYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LCB3aXRoIHRocmVlIHNlY3Rpb25zLiAgU3VwcG9ydCBmb3IgbXVsdGlwbGUgc2VjdGlvbnMKLWhhcyBiZWVuIGFkZGVkIGluIHR3byBkaWZmZXJlbnQgd2F5cy4KLQotVGhlIHByZWZlcnJlZCBhcHByb2FjaCBpcyB0byB1c2UgdGhlIHZlcnNpb24gb2YgR0FTIGNyZWF0ZWQgd2hlbiB0aGUgc3ltYm9sCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBkZWZpbmVkLiAgVGhlIG90aGVyIHZlcnNpb25zIG9mIEdBUyBhcmUgZG9jdW1lbnRlZCBmb3IKLWhpc3RvcmljYWwgcHVycG9zZXMsIGFuZCB0byBoZWxwIGFueWJvZHkgd2hvIGhhcyB0byBkZWJ1ZyBjb2RlIHdyaXR0ZW4gZm9yCi10aGVtLgotCi1UaGUgdHlwZSBAY29kZXtzZWdUfSBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHNlY3Rpb24gaW4gY29kZSB3aGljaCBtdXN0IHdvcmsKLXdpdGggYWxsIHZlcnNpb25zIG9mIEdBUy4KLQotQG1lbnUKLSogT3JpZ2luYWwgR0FTOjogICAgICAgIE9yaWdpbmFsIEdBUyB2ZXJzaW9uCi0qIE1BTllfU0VHTUVOVFM6OiAgICAgICBNQU5ZX1NFR01FTlRTIGdhcyB2ZXJzaW9uCi0qIEJGRF9BU1NFTUJMRVI6OiAgICAgICBCRkRfQVNTRU1CTEVSIGdhcyB2ZXJzaW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgT3JpZ2luYWwgR0FTCi1Ac3Vic2VjdGlvbiBPcmlnaW5hbCBHQVMKLQotVGhlIG9yaWdpbmFsIEdBUyBvbmx5IHN1cHBvcnRlZCB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0IHdpdGggdGhyZWUKLXNlY3Rpb25zOiBAc2FtcHsudGV4dH0sIEBzYW1wey5kYXRhfSwgYW5kIEBzYW1wey5ic3N9LiAgVGhpcyBpcyB0aGUgdmVyc2lvbiBvZgotR0FTIHRoYXQgaXMgY29tcGlsZWQgaWYgbmVpdGhlciBAY29kZXtCRkRfQVNTRU1CTEVSfSBub3IgQGNvZGV7TUFOWV9TRUdNRU5UU30KLWlzIGRlZmluZWQuICBUaGlzIHZlcnNpb24gb2YgR0FTIGlzIHN0aWxsIHVzZWQgZm9yIHRoZSBtNjhrLWFvdXQgdGFyZ2V0LCBhbmQKLXBlcmhhcHMgb3RoZXJzLgotCi1UaGlzIHZlcnNpb24gb2YgR0FTIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYW55IG5ldyBkZXZlbG9wbWVudC4KLQotVGhlcmUgaXMgc3RpbGwgY29kZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoaXMgdmVyc2lvbiBvZiBHQVMsIG5vdGFibHkgaW4KLUBmaWxle3dyaXRlLmN9LiAgVGhlcmUgaXMgbm8gd2F5IGZvciB0aGlzIGNvZGUgdG8gbG9vcCB0aHJvdWdoIGFsbCB0aGUKLXNlY3Rpb25zOyBpdCBzaW1wbHkgbG9va3MgYXQgZ2xvYmFsIHZhcmlhYmxlcyBsaWtlIEBjb2Rle3RleHRfZnJhZ19yb290fSBhbmQKLUBjb2Rle2RhdGFfZnJhZ19yb290fS4KLQotVGhlIHR5cGUgQGNvZGV7c2VnVH0gaXMgYW4gZW51bS4KLQotQG5vZGUgTUFOWV9TRUdNRU5UUwotQHN1YnNlY3Rpb24gTUFOWV9TRUdNRU5UUyBnYXMgdmVyc2lvbgotQGNpbmRleCBNQU5ZX1NFR01FTlRTCi0KLVRoZSBAY29kZXtNQU5ZX1NFR01FTlRTfSB2ZXJzaW9uIG9mIGdhcyBpcyBvbmx5IHVzZWQgZm9yIENPRkYuICBJdCB1c2VzIHRoZSBCRkQKLWxpYnJhcnksIGJ1dCBpdCB3cml0ZXMgb3V0IGFsbCB0aGUgZGF0YSBpdHNlbGYgdXNpbmcgQGNvZGV7YmZkX3dyaXRlfS4gIFRoaXMKLXZlcnNpb24gb2YgZ2FzIHN1cHBvcnRzIHVwIHRvIDQwIG5vcm1hbCBzZWN0aW9ucy4gIFRoZSBzZWN0aW9uIG5hbWVzIGFyZSBzdG9yZWQKLWluIHRoZSBAY29kZXtzZWdfbmFtZX0gYXJyYXkuICBPdGhlciBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlCi1AY29kZXtzZWdtZW50X2luZm99IGFycmF5LgotCi1UaGUgdHlwZSBAY29kZXtzZWdUfSBpcyBhbiBlbnVtLiAgQ29kZSB0aGF0IHdhbnRzIHRvIGV4YW1pbmUgYWxsIHRoZSBzZWN0aW9ucwotY2FuIHVzZSBhIEBjb2Rle3NlZ1R9IHZhcmlhYmxlIGFzIGxvb3AgaW5kZXggZnJvbSBAY29kZXtTRUdfRTB9IHVwIHRvIGJ1dCBub3QKLWluY2x1ZGluZyBAY29kZXtTRUdfVU5LTk9XTn0uCi0KLU1vc3Qgb2YgdGhlIGNvZGUgc3BlY2lmaWMgdG8gdGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBpbiB0aGUgZmlsZQotQGZpbGV7Y29uZmlnL29iai1jb2ZmLmN9LCBpbiB0aGUgcG9ydGlvbiBvZiB0aGF0IGZpbGUgdGhhdCBpcyBjb21waWxlZCB3aGVuCi1AY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4KLQotVGhpcyB2ZXJzaW9uIG9mIEdBUyBpcyBzdGlsbCB1c2VkIGZvciBzZXZlcmFsIENPRkYgdGFyZ2V0cy4KLQotQG5vZGUgQkZEX0FTU0VNQkxFUgotQHN1YnNlY3Rpb24gQkZEX0FTU0VNQkxFUiBnYXMgdmVyc2lvbgotQGNpbmRleCBCRkRfQVNTRU1CTEVSCi0KLVRoZSBwcmVmZXJyZWQgdmVyc2lvbiBvZiBHQVMgaXMgdGhlIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IHZlcnNpb24uICBJbiB0aGlzCi12ZXJzaW9uIG9mIEdBUywgdGhlIG91dHB1dCBmaWxlIGlzIGEgbm9ybWFsIEJGRCwgYW5kIHRoZSBCRkQgcm91dGluZXMgYXJlIHVzZWQKLXRvIGdlbmVyYXRlIHRoZSBvdXRwdXQuCi0KLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IHdpbGwgYXV0b21hdGljYWxseSBiZSB1c2VkIGZvciBjZXJ0YWluIHRhcmdldHMsIGluY2x1ZGluZwotdGhvc2UgdGhhdCB1c2UgdGhlIEVMRiwgRUNPRkYsIGFuZCBTT00gb2JqZWN0IGZpbGUgZm9ybWF0cywgYW5kIGFsc28gYWxsIEFscGhhLAotTUlQUywgUG93ZXJQQywgYW5kIFNQQVJDIHRhcmdldHMuICBZb3UgY2FuIGZvcmNlIHRoZSB1c2Ugb2YKLUBjb2Rle0JGRF9BU1NFTUJMRVJ9IGZvciBvdGhlciB0YXJnZXRzIHdpdGggdGhlIGNvbmZpZ3VyZSBvcHRpb24KLUBzYW1wey0tZW5hYmxlLWJmZC1hc3NlbWJsZXJ9OyBob3dldmVyLCBpdCBoYXMgbm90IGJlZW4gdGVzdGVkIGZvciBtYW55Ci10YXJnZXRzLCBhbmQgY2FuIG5vdCBiZSBhc3N1bWVkIHRvIHdvcmsuCi0KLUBub2RlIERhdGEgdHlwZXMKLUBzZWN0aW9uIERhdGEgdHlwZXMKLUBjaW5kZXggaW50ZXJuYWxzLCBkYXRhIHR5cGVzCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgc29tZSBmdW5kYW1lbnRhbCBHQVMgZGF0YSB0eXBlcy4KLQotQG1lbnUKLSogU3ltYm9sczo6ICAgICAgICAgICAgIFRoZSBzeW1ib2xTIHN0cnVjdHVyZQotKiBFeHByZXNzaW9uczo6ICAgICAgICAgVGhlIGV4cHJlc3Npb25TIHN0cnVjdHVyZQotKiBGaXh1cHM6OgkJVGhlIGZpeFMgc3RydWN0dXJlCi0qIEZyYWdzOjogICAgICAgICAgICAgICBUaGUgZnJhZ1Mgc3RydWN0dXJlCi1AZW5kIG1lbnUKLQotQG5vZGUgU3ltYm9scwotQHN1YnNlY3Rpb24gU3ltYm9scwotQGNpbmRleCBpbnRlcm5hbHMsIHN5bWJvbHMKLUBjaW5kZXggc3ltYm9scywgaW50ZXJuYWwKLUBjaW5kZXggc3ltYm9sUyBzdHJ1Y3R1cmUKLQotVGhlIGRlZmluaXRpb24gZm9yIHRoZSBzeW1ib2wgc3RydWN0dXJlLCBAY29kZXtzeW1ib2xTfSwgaXMgbG9jYXRlZCBpbgotQGZpbGV7c3RydWMtc3ltYm9sLmh9LgotCi1JbiBnZW5lcmFsLCB0aGUgZmllbGRzIG9mIHRoaXMgc3RydWN0dXJlIG1heSBub3QgYmUgcmVmZXJyZWQgdG8gZGlyZWN0bHkuCi1JbnN0ZWFkLCB5b3UgbXVzdCB1c2Ugb25lIG9mIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgZGVmaW5lZCBpbiBAZmlsZXtzeW1ib2wuaH0uCi1UaGVzZSBhY2Nlc3NvciBmdW5jdGlvbnMgc2hvdWxkIHdvcmsgZm9yIGFueSBHQVMgdmVyc2lvbi4KLQotU3ltYm9sIHN0cnVjdHVyZXMgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBzeV92YWx1ZQotVGhpcyBpcyBhbiBAY29kZXtleHByZXNzaW9uU30gdGhhdCBkZXNjcmliZXMgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuICBJdCBtaWdodAotcmVmZXIgdG8gb25lIG9yIG1vcmUgb3RoZXIgc3ltYm9sczsgaWYgc28sIGl0cyB0cnVlIHZhbHVlIG1heSBub3QgYmUga25vd24KLXVudGlsIEBjb2Rle3Jlc29sdmVfc3ltYm9sX3ZhbHVlfSBpcyBjYWxsZWQgaW4gQGNvZGV7d3JpdGVfb2JqZWN0X2ZpbGV9LgotCi1UaGUgZXhwcmVzc2lvbiBpcyBvZnRlbiBzaW1wbHkgYSBjb25zdGFudC4gIEJlZm9yZSBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0KLWlzIGNhbGxlZCwgdGhlIHZhbHVlIGlzIHRoZSBvZmZzZXQgZnJvbSB0aGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkuICBBZnRlcndhcmQsCi10aGUgZnJhZyBhZGRyZXNzIGhhcyBiZWVuIGFkZGVkIGluLgotCi1AaXRlbSBzeV9yZXNvbHZlZAotVGhpcyBmaWVsZCBpcyBub24temVybyBpZiB0aGUgc3ltYm9sJ3MgdmFsdWUgaGFzIGJlZW4gY29tcGxldGVseSByZXNvbHZlZC4gIEl0Ci1pcyB1c2VkIGR1cmluZyB0aGUgZmluYWwgcGFzcyBvdmVyIHRoZSBzeW1ib2wgdGFibGUuCi0KLUBpdGVtIHN5X3Jlc29sdmluZwotVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRldGVjdCBsb29wcyB3aGlsZSByZXNvbHZpbmcgdGhlIHN5bWJvbCdzIHZhbHVlLgotCi1AaXRlbSBzeV91c2VkX2luX3JlbG9jCi1UaGlzIGZpZWxkIGlzIG5vbi16ZXJvIGlmIHRoZSBzeW1ib2wgaXMgdXNlZCBieSBhIHJlbG9jYXRpb24gZW50cnkuICBJZiBhIGxvY2FsCi1zeW1ib2wgaXMgdXNlZCBpbiBhIHJlbG9jYXRpb24gZW50cnksIGl0IG11c3QgYmUgcG9zc2libGUgdG8gcmVkaXJlY3QgdGhvc2UKLXJlbG9jYXRpb25zIHRvIG90aGVyIHN5bWJvbHMsIG9yIHRoaXMgc3ltYm9sIGNhbm5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGZpbmFsCi1zeW1ib2wgbGlzdC4KLQotQGl0ZW0gc3lfbmV4dAotQGl0ZW14IHN5X3ByZXZpb3VzCi1UaGVzZSBwb2ludGVycyB0byBvdGhlciBAY29kZXtzeW1ib2xTfSBzdHJ1Y3R1cmVzIGRlc2NyaWJlIGEgc2luZ2x5IG9yIGRvdWJseQotbGlua2VkIGxpc3QuICAoSWYgQGNvZGV7U1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSU30gaXMgbm90IGRlZmluZWQsIHRoZQotQGNvZGV7c3lfcHJldmlvdXN9IGZpZWxkIHdpbGwgYmUgb21pdHRlZDsgQGNvZGV7U1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSU30gaXMKLWFsd2F5cyBkZWZpbmVkIGlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9LikgIFRoZXNlIGZpZWxkcyBzaG91bGQgYmUgYWNjZXNzZWQgd2l0aAotdGhlIEBjb2Rle3N5bWJvbF9uZXh0fSBhbmQgQGNvZGV7c3ltYm9sX3ByZXZpb3VzfSBtYWNyb3MuCi0KLUBpdGVtIHN5X2ZyYWcKLVRoaXMgcG9pbnRzIHRvIHRoZSBmcmFnIChAcHhyZWZ7RnJhZ3N9KSB0aGF0IHRoaXMgc3ltYm9sIGlzIGF0dGFjaGVkIHRvLgotCi1AaXRlbSBzeV91c2VkCi1XaGV0aGVyIHRoZSBzeW1ib2wgaXMgdXNlZCBhcyBhbiBvcGVyYW5kIG9yIGluIGFuIGV4cHJlc3Npb24uICBOb3RlOiBOb3QgYWxsIG9mCi10aGUgYmFja2VuZHMga2VlcCB0aGlzIGluZm9ybWF0aW9uIGFjY3VyYXRlOyBiYWNrZW5kcyB3aGljaCB1c2UgdGhpcyBiaXQgYXJlCi1yZXNwb25zaWJsZSBmb3Igc2V0dGluZyBpdCB3aGVuIGEgc3ltYm9sIGlzIHVzZWQgaW4gYmFja2VuZCByb3V0aW5lcy4KLQotQGl0ZW0gc3lfbXJpX2NvbW1vbgotV2hldGhlciB0aGUgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sIGNyZWF0ZWQgYnkgdGhlIEBjb2Rle0NPTU1PTn0KLXBzZXVkby1vcCB3aGVuIGFzc2VtYmxpbmcgaW4gTVJJIG1vZGUuCi0KLUBpdGVtIGJzeW0KLUlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQsIHRoaXMgcG9pbnRzIHRvIHRoZSBCRkQgQGNvZGV7YXN5bWJvbH0gdGhhdAotd2lsbCBiZSB1c2VkIGluIHdyaXRpbmcgdGhlIG9iamVjdCBmaWxlLgotCi1AaXRlbSBzeV9uYW1lX29mZnNldAotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIHRoZSBwb3NpdGlvbiBvZgotdGhlIHN5bWJvbCdzIG5hbWUgaW4gdGhlIHN0cmluZyB0YWJsZSBvZiB0aGUgb2JqZWN0IGZpbGUuICBPbiBzb21lIGZvcm1hdHMsCi10aGlzIHdpbGwgc3RhcnQgYXQgcG9zaXRpb24gNCwgd2l0aCBwb3NpdGlvbiAwIHJlc2VydmVkIGZvciB1bm5hbWVkIHN5bWJvbHMuCi1UaGlzIGZpZWxkIGlzIG5vdCB1c2VkIHVudGlsIEBjb2Rle3dyaXRlX29iamVjdF9maWxlfSBpcyBjYWxsZWQuCi0KLUBpdGVtIHN5X3N5bWJvbAotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIHRoZQotZm9ybWF0LXNwZWNpZmljIHN5bWJvbCBzdHJ1Y3R1cmUsIGFzIGl0IHdvdWxkIGJlIHdyaXR0ZW4gaW50byB0aGUgb2JqZWN0IGZpbGUuCi0KLUBpdGVtIHN5X251bWJlcgotKE9ubHkgdXNlZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSBpcyBub3QgZGVmaW5lZC4pICBUaGlzIGlzIGEgMjQtYml0IHN5bWJvbAotbnVtYmVyLCBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyByZWxvY2F0aW9uIHRhYmxlIGVudHJpZXMuCi0KLUBpdGVtIHN5X29iagotVGhpcyBmb3JtYXQtc3BlY2lmaWMgZGF0YSBpcyBvZiB0eXBlIEBjb2Rle09CSl9TWU1GSUVMRF9UWVBFfS4gIElmIG5vIG1hY3JvIGJ5Ci10aGF0IG5hbWUgaXMgZGVmaW5lZCBpbiBAZmlsZXtvYmotZm9ybWF0Lmh9LCB0aGlzIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCi1AaXRlbSBzeV90YwotVGhpcyBwcm9jZXNzb3Itc3BlY2lmaWMgZGF0YSBpcyBvZiB0eXBlIEBjb2Rle1RDX1NZTUZJRUxEX1RZUEV9LiAgSWYgbm8gbWFjcm8KLWJ5IHRoYXQgbmFtZSBpcyBkZWZpbmVkIGluIEBmaWxle3RhcmctY3B1Lmh9LCB0aGlzIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCi1AZW5kIHRhYmxlCi0KLUhlcmUgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zLiAgVGhlc2Ugc2hvdWxkIGJlIHVzZWQgcmF0aGVyCi10aGFuIHJlZmVycmluZyB0byB0aGUgZmllbGRzIG9mIEBjb2Rle3N5bWJvbFN9IGRpcmVjdGx5LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFNfU0VUX1ZBTFVFCi1AY2luZGV4IFNfU0VUX1ZBTFVFCi1TZXQgdGhlIHN5bWJvbCdzIHZhbHVlLgotCi1AaXRlbSBTX0dFVF9WQUxVRQotQGNpbmRleCBTX0dFVF9WQUxVRQotR2V0IHRoZSBzeW1ib2wncyB2YWx1ZS4gIFRoaXMgd2lsbCBjYXVzZSBAY29kZXtyZXNvbHZlX3N5bWJvbF92YWx1ZX0gdG8gYmUKLWNhbGxlZCBpZiBuZWNlc3NhcnksIHNvIEBjb2Rle1NfR0VUX1ZBTFVFfSBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBpdCBpcwotc2FmZSB0byByZXNvbHZlIHN5bWJvbHMgKGkuZS4sIGFmdGVyIHRoZSBlbnRpcmUgaW5wdXQgZmlsZSBoYXMgYmVlbiByZWFkIGFuZAotYWxsIHN5bWJvbHMgaGF2ZSBiZWVuIGRlZmluZWQpLgotCi1AaXRlbSBTX1NFVF9TRUdNRU5UCi1AY2luZGV4IFNfU0VUX1NFR01FTlQKLVNldCB0aGUgc2VjdGlvbiBvZiB0aGUgc3ltYm9sLgotCi1AaXRlbSBTX0dFVF9TRUdNRU5UCi1AY2luZGV4IFNfR0VUX1NFR01FTlQKLUdldCB0aGUgc3ltYm9sJ3Mgc2VjdGlvbi4KLQotQGl0ZW0gU19HRVRfTkFNRQotQGNpbmRleCBTX0dFVF9OQU1FCi1HZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19TRVRfTkFNRQotQGNpbmRleCBTX1NFVF9OQU1FCi1TZXQgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbC4KLQotQGl0ZW0gU19JU19FWFRFUk5BTAotQGNpbmRleCBTX0lTX0VYVEVSTkFMCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIHN5bWJvbCBpcyBleHRlcm5hbGx5IHZpc2libGUuCi0KLUBpdGVtIFNfSVNfRVhURVJOCi1AY2luZGV4IFNfSVNfRVhURVJOCi1BIHN5bm9ueW0gZm9yIEBjb2Rle1NfSVNfRVhURVJOQUx9LiAgRG9uJ3QgdXNlIGl0LgotCi1AaXRlbSBTX0lTX1dFQUsKLUBjaW5kZXggU19JU19XRUFLCi1SZXR1cm4gbm9uLXplcm8gaWYgdGhlIHN5bWJvbCBpcyB3ZWFrLgotCi1AaXRlbSBTX0lTX0NPTU1PTgotQGNpbmRleCBTX0lTX0NPTU1PTgotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgaXMgYSBjb21tb24gc3ltYm9sLiAgQ29tbW9uIHN5bWJvbHMgYXJlIHNvbWV0aW1lcwotcmVwcmVzZW50ZWQgYXMgdW5kZWZpbmVkIHN5bWJvbHMgd2l0aCBhIHZhbHVlLCBpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbAotbm90IGJlIHJlbGlhYmxlLgotCi1AaXRlbSBTX0lTX0RFRklORUQKLUBjaW5kZXggU19JU19ERUZJTkVECi1SZXR1cm4gbm9uLXplcm8gaWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZC4gIFRoaXMgZnVuY3Rpb24gaXMgbm90IHJlbGlhYmxlIHdoZW4KLWNhbGxlZCBvbiBhIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIFNfSVNfREVCVUcKLUBjaW5kZXggU19JU19ERUJVRwotUmV0dXJuIG5vbi16ZXJvIGlmIHRoaXMgaXMgYSBkZWJ1Z2dpbmcgc3ltYm9sLgotCi1AaXRlbSBTX0lTX0xPQ0FMCi1AY2luZGV4IFNfSVNfTE9DQUwKLVJldHVybiBub24temVybyBpZiB0aGlzIGlzIGEgbG9jYWwgYXNzZW1ibGVyIHN5bWJvbCB3aGljaCBzaG91bGQgbm90IGJlCi1pbmNsdWRlZCBpbiB0aGUgZmluYWwgc3ltYm9sIHRhYmxlLiAgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBvcHBvc2l0ZSBvZgotQGNvZGV7U19JU19FWFRFUk5BTH0uICBUaGUgQHNhbXB7LUx9IGFzc2VtYmxlciBvcHRpb24gYWZmZWN0cyB0aGUgcmV0dXJuIHZhbHVlCi1vZiB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSBTX1NFVF9FWFRFUk5BTAotQGNpbmRleCBTX1NFVF9FWFRFUk5BTAotTWFyayB0aGUgc3ltYm9sIGFzIGV4dGVybmFsbHkgdmlzaWJsZS4KLQotQGl0ZW0gU19DTEVBUl9FWFRFUk5BTAotQGNpbmRleCBTX0NMRUFSX0VYVEVSTkFMCi1NYXJrIHRoZSBzeW1ib2wgYXMgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4KLQotQGl0ZW0gU19TRVRfV0VBSwotQGNpbmRleCBTX1NFVF9XRUFLCi1NYXJrIHRoZSBzeW1ib2wgYXMgd2Vhay4KLQotQGl0ZW0gU19HRVRfVFlQRQotQGl0ZW0gU19HRVRfREVTQwotQGl0ZW0gU19HRVRfT1RIRVIKLUBjaW5kZXggU19HRVRfVFlQRQotQGNpbmRleCBTX0dFVF9ERVNDCi1AY2luZGV4IFNfR0VUX09USEVSCi1HZXQgdGhlIEBjb2Rle3R5cGV9LCBAY29kZXtkZXNjfSwgYW5kIEBjb2Rle290aGVyfSBmaWVsZHMgb2YgdGhlIHN5bWJvbC4gIFRoZXNlCi1hcmUgb25seSBkZWZpbmVkIGZvciBvYmplY3QgZmlsZSBmb3JtYXRzIGZvciB3aGljaCB0aGV5IG1ha2Ugc2Vuc2UgKHByaW1hcmlseQotYS5vdXQpLgotCi1AaXRlbSBTX1NFVF9UWVBFCi1AaXRlbSBTX1NFVF9ERVNDCi1AaXRlbSBTX1NFVF9PVEhFUgotQGNpbmRleCBTX1NFVF9UWVBFCi1AY2luZGV4IFNfU0VUX0RFU0MKLUBjaW5kZXggU19TRVRfT1RIRVIKLVNldCB0aGUgQGNvZGV7dHlwZX0sIEBjb2Rle2Rlc2N9LCBhbmQgQGNvZGV7b3RoZXJ9IGZpZWxkcyBvZiB0aGUgc3ltYm9sLiAgVGhlc2UKLWFyZSBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yIHdoaWNoIHRoZXkgbWFrZSBzZW5zZSAocHJpbWFyaWx5Ci1hLm91dCkuCi0KLUBpdGVtIFNfR0VUX1NJWkUKLUBjaW5kZXggU19HRVRfU0laRQotR2V0IHRoZSBzaXplIG9mIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yCi13aGljaCBpdCBtYWtlcyBzZW5zZSAocHJpbWFyaWx5IEVMRikuCi0KLUBpdGVtIFNfU0VUX1NJWkUKLUBjaW5kZXggU19TRVRfU0laRQotU2V0IHRoZSBzaXplIG9mIGEgc3ltYm9sLiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgZm9yCi13aGljaCBpdCBtYWtlcyBzZW5zZSAocHJpbWFyaWx5IEVMRikuCi0KLUBpdGVtIHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbgotQGNpbmRleCBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24KLUdldCBhIHBvaW50ZXIgdG8gYW4gQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSB3aGljaCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZgotdGhlIHN5bWJvbCBhcyBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24KLUBjaW5kZXggc3ltYm9sX3NldF92YWx1ZV9leHByZXNzaW9uCi1TZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIHRvIGFuIGV4cHJlc3Npb24uCi0KLUBpdGVtIHN5bWJvbF9zZXRfZnJhZwotQGNpbmRleCBzeW1ib2xfc2V0X2ZyYWcKLVNldCB0aGUgZnJhZyB3aGVyZSBhIHN5bWJvbCBpcyBkZWZpbmVkLgotCi1AaXRlbSBzeW1ib2xfZ2V0X2ZyYWcKLUBjaW5kZXggc3ltYm9sX2dldF9mcmFnCi1HZXQgdGhlIGZyYWcgd2hlcmUgYSBzeW1ib2wgaXMgZGVmaW5lZC4KLQotQGl0ZW0gc3ltYm9sX21hcmtfdXNlZAotQGNpbmRleCBzeW1ib2xfbWFya191c2VkCi1NYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHVzZWQgaW4gYW4gZXhwcmVzc2lvbi4KLQotQGl0ZW0gc3ltYm9sX2NsZWFyX3VzZWQKLUBjaW5kZXggc3ltYm9sX2NsZWFyX3VzZWQKLUNsZWFyIHRoZSBtYXJrIGluZGljYXRpbmcgdGhhdCBhIHN5bWJvbCB3YXMgdXNlZCBpbiBhbiBleHByZXNzaW9uLgotCi1AaXRlbSBzeW1ib2xfdXNlZF9wCi1AY2luZGV4IHN5bWJvbF91c2VkX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIHdhcyB1c2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBpdGVtIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MKLUBjaW5kZXggc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYwotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB1c2VkIGJ5IGEgcmVsb2NhdGlvbi4KLQotQGl0ZW0gc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MKLUBjaW5kZXggc3ltYm9sX2NsZWFyX3VzZWRfaW5fcmVsb2MKLUNsZWFyIHRoZSBtYXJrIGluZGljYXRpbmcgdGhhdCBhIHN5bWJvbCB3YXMgdXNlZCBpbiBhIHJlbG9jYXRpb24uCi0KLUBpdGVtIHN5bWJvbF91c2VkX2luX3JlbG9jX3AKLUBjaW5kZXggc3ltYm9sX3VzZWRfaW5fcmVsb2NfcAotUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgd2FzIHVzZWQgaW4gYSByZWxvY2F0aW9uLgotCi1AaXRlbSBzeW1ib2xfbWFya19tcmlfY29tbW9uCi1AY2luZGV4IHN5bWJvbF9tYXJrX21yaV9jb21tb24KLU1hcmsgYSBzeW1ib2wgYXMgYW4gTVJJIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9jbGVhcl9tcmlfY29tbW9uCi1AY2luZGV4IHN5bWJvbF9jbGVhcl9tcmlfY29tbW9uCi1DbGVhciB0aGUgbWFyayBpbmRpY2F0aW5nIHRoYXQgYSBzeW1ib2wgaXMgYW4gTVJJIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9tcmlfY29tbW9uX3AKLUBjaW5kZXggc3ltYm9sX21yaV9jb21tb25fcAotUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaXMgYW4gTVJJIGNvbW1vbiBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9tYXJrX3dyaXR0ZW4KLUBjaW5kZXggc3ltYm9sX21hcmtfd3JpdHRlbgotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiB3cml0dGVuLgotCi1AaXRlbSBzeW1ib2xfY2xlYXJfd3JpdHRlbgotQGNpbmRleCBzeW1ib2xfY2xlYXJfd3JpdHRlbgotQ2xlYXIgdGhlIG1hcmsgaW5kaWNhdGluZyB0aGF0IGEgc3ltYm9sIHdhcyB3cml0dGVuLgotCi1AaXRlbSBzeW1ib2xfd3JpdHRlbl9wCi1AY2luZGV4IHN5bWJvbF93cml0dGVuX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIHdhcyB3cml0dGVuLgotCi1AaXRlbSBzeW1ib2xfbWFya19yZXNvbHZlZAotQGNpbmRleCBzeW1ib2xfbWFya19yZXNvbHZlZAotTWFyayBhIHN5bWJvbCBhcyBoYXZpbmcgYmVlbiByZXNvbHZlZC4KLQotQGl0ZW0gc3ltYm9sX3Jlc29sdmVkX3AKLUBjaW5kZXggc3ltYm9sX3Jlc29sdmVkX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHJlc29sdmVkLgotCi1AaXRlbSBzeW1ib2xfc2VjdGlvbl9wCi1AY2luZGV4IHN5bWJvbF9zZWN0aW9uX3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9lcXVhdGVkX3AKLUBjaW5kZXggc3ltYm9sX2VxdWF0ZWRfcAotUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaXMgZXF1YXRlZCB0byBhbm90aGVyIHN5bWJvbC4KLQotQGl0ZW0gc3ltYm9sX2NvbnN0YW50X3AKLUBjaW5kZXggc3ltYm9sX2NvbnN0YW50X3AKLVJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBhIGNvbnN0YW50IHZhbHVlLCBpbmNsdWRpbmcgYmVpbmcgYW4gb2Zmc2V0IHdpdGhpbgotc29tZSBmcmFnLgotCi1AaXRlbSBzeW1ib2xfZ2V0X2JmZHN5bQotQGNpbmRleCBzeW1ib2xfZ2V0X2JmZHN5bQotUmV0dXJuIHRoZSBCRkQgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIHN5bWJvbC4KLQotQGl0ZW0gc3ltYm9sX3NldF9iZmRzeW0KLUBjaW5kZXggc3ltYm9sX3NldF9iZmRzeW0KLVNldCB0aGUgQkZEIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9nZXRfb2JqCi1AY2luZGV4IHN5bWJvbF9nZXRfb2JqCi1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBAY29kZXtPQkpfU1lNRklFTERfVFlQRX0gZmllbGQgb2YgYSBzeW1ib2wuCi0KLUBpdGVtIHN5bWJvbF9zZXRfb2JqCi1AY2luZGV4IHN5bWJvbF9zZXRfb2JqCi1TZXQgdGhlIEBjb2Rle09CSl9TWU1GSUVMRF9UWVBFfSBmaWVsZCBvZiBhIHN5bWJvbC4KLQotQGl0ZW0gc3ltYm9sX2dldF90YwotQGNpbmRleCBzeW1ib2xfZ2V0X3RjCi1SZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBAY29kZXtUQ19TWU1GSUVMRF9UWVBFfSBmaWVsZCBvZiBhIHN5bWJvbC4KLQotQGl0ZW0gc3ltYm9sX3NldF90YwotQGNpbmRleCBzeW1ib2xfc2V0X3RjCi1TZXQgdGhlIEBjb2Rle1RDX1NZTUZJRUxEX1RZUEV9IGZpZWxkIG9mIGEgc3ltYm9sLgotCi1AZW5kIHRhYmxlCi0KLVdoZW4gQGNvZGV7QkZEX0FTU0VNQkxFUn0gaXMgZGVmaW5lZCwgR0FTIGF0dGVtcHRzIHRvIHN0b3JlIGxvY2FsCi1zeW1ib2xzLS1zeW1ib2xzIHdoaWNoIHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBmaWxlLS11c2luZyBhCi1kaWZmZXJlbnQgc3RydWN0dXJlLCBAY29kZXtzdHJ1Y3QgbG9jYWxfc3ltYm9sfS4gIFRoaXMgc3RydWN0dXJlIGNhbiBvbmx5Ci1yZXByZXNlbnQgc3ltYm9scyB3aG9zZSB2YWx1ZSBpcyBhbiBvZmZzZXQgd2l0aGluIGEgZnJhZy4KLQotQ29kZSBvdXRzaWRlIG9mIHRoZSBzeW1ib2wgaGFuZGxlciB3aWxsIGFsd2F5cyBkZWFsIHdpdGggQGNvZGV7c3ltYm9sU30KLXN0cnVjdHVyZXMgYW5kIHVzZSB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zLiAgVGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBjb3JyZWN0bHkKLWRlYWwgd2l0aCBsb2NhbCBzeW1ib2xzLiAgQGNvZGV7c3RydWN0IGxvY2FsX3N5bWJvbH0gaXMgbXVjaCBzbWFsbGVyIHRoYW4KLUBjb2Rle3N5bWJvbFN9ICh3aGljaCBhbHNvIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGJmZCBAY29kZXthc3ltYm9sfQotc3RydWN0dXJlKSwgc28gdGhpcyBzYXZlcyBzcGFjZSB3aGVuIGFzc2VtYmxpbmcgbGFyZ2UgZmlsZXMuCi0KLVRoZSBmaXJzdCBmaWVsZCBvZiBAY29kZXtzeW1ib2xTfSBpcyBAY29kZXtic3ltfSwgdGhlIHBvaW50ZXIgdG8gdGhlIEJGRAotc3ltYm9sLiAgVGhlIGZpcnN0IGZpZWxkIG9mIEBjb2Rle3N0cnVjdCBsb2NhbF9zeW1ib2x9IGlzIGEgcG9pbnRlciB3aGljaCBpcwotYWx3YXlzIHNldCB0byBOVUxMLiAgVGhpcyBpcyBob3cgdGhlIHN5bWJvbCBhY2Nlc3NvciBmdW5jdGlvbnMgY2FuIGRpc3Rpbmd1aXNoCi1sb2NhbCBzeW1ib2xzIGZyb20gb3JkaW5hcnkgc3ltYm9scy4gIFRoZSBzeW1ib2wgYWNjZXNzb3IgZnVuY3Rpb25zCi1hdXRvbWF0aWNhbGx5IGNvbnZlcnQgYSBsb2NhbCBzeW1ib2wgaW50byBhbiBvcmRpbmFyeSBzeW1ib2wgd2hlbiBuZWNlc3NhcnkuCi0KLUBub2RlIEV4cHJlc3Npb25zCi1Ac3Vic2VjdGlvbiBFeHByZXNzaW9ucwotQGNpbmRleCBpbnRlcm5hbHMsIGV4cHJlc3Npb25zCi1AY2luZGV4IGV4cHJlc3Npb25zLCBpbnRlcm5hbAotQGNpbmRleCBleHByZXNzaW9uUyBzdHJ1Y3R1cmUKLQotRXhwcmVzc2lvbnMgYXJlIHN0b3JlZCBpbiBhbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlLiAgVGhlIHN0cnVjdHVyZSBpcwotZGVmaW5lZCBpbiBAZmlsZXtleHByLmh9LgotCi1AY2luZGV4IGV4cHJlc3Npb24KLVRoZSBtYWNybyBAY29kZXtleHByZXNzaW9ufSB3aWxsIGNyZWF0ZSBhbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlIGJhc2VkCi1vbiB0aGUgdGV4dCBmb3VuZCBhdCB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0uCi0KLUBjaW5kZXggbWFrZV9leHByX3N5bWJvbAotQGNpbmRleCBleHByX3N5bWJvbF93aGVyZQotQSBzaW5nbGUgQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBjYW4gcmVwcmVzZW50IGEgc2luZ2xlIG9wZXJhdGlvbi4KLUNvbXBsZXggZXhwcmVzc2lvbnMgYXJlIGZvcm1lZCBieSBjcmVhdGluZyBAZGZue2V4cHJlc3Npb24gc3ltYm9sc30gYW5kCi1jb21iaW5pbmcgdGhlbSBpbiBAY29kZXtleHByZXNzaW9uU30gc3RydWN0dXJlcy4gIEFuIGV4cHJlc3Npb24gc3ltYm9sIGlzCi1jcmVhdGVkIGJ5IGNhbGxpbmcgQGNvZGV7bWFrZV9leHByX3N5bWJvbH0uICBBbiBleHByZXNzaW9uIHN5bWJvbCBzaG91bGQKLW5hdHVyYWxseSBuZXZlciBhcHBlYXIgaW4gYSBzeW1ib2wgdGFibGUsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YKLUBjb2Rle1NfSVNfTE9DQUx9IChAcHhyZWZ7U3ltYm9sc30pIHJlZmxlY3RzIHRoYXQuICBUaGUgZnVuY3Rpb24KLUBjb2Rle2V4cHJfc3ltYm9sX3doZXJlfSByZXR1cm5zIG5vbi16ZXJvIGlmIGEgc3ltYm9sIGlzIGFuIGV4cHJlc3Npb24gc3ltYm9sLAotYW5kIGFsc28gcmV0dXJucyB0aGUgZmlsZSBhbmQgbGluZSBmb3IgdGhlIGV4cHJlc3Npb24gd2hpY2ggY2F1c2VkIGl0IHRvIGJlCi1jcmVhdGVkLgotCi1UaGUgQGNvZGV7ZXhwcmVzc2lvblN9IHN0cnVjdHVyZSBoYXMgdHdvIHN5bWJvbCBmaWVsZHMsIGEgbnVtYmVyIGZpZWxkLCBhbgotb3BlcmF0b3IgZmllbGQsIGFuZCBhIGZpZWxkIGluZGljYXRpbmcgd2hldGhlciB0aGUgbnVtYmVyIGlzIHVuc2lnbmVkLgotCi1UaGUgb3BlcmF0b3IgZmllbGQgaXMgb2YgdHlwZSBAY29kZXtvcGVyYXRvclR9LCBhbmQgZGVzY3JpYmVzIGhvdyB0byBpbnRlcnByZXQKLXRoZSBvdGhlciBmaWVsZHM7IHNlZSB0aGUgZGVmaW5pdGlvbiBpbiBAZmlsZXtleHByLmh9IGZvciB0aGUgcG9zc2liaWxpdGllcy4KLQotQW4gQGNvZGV7b3BlcmF0b3JUfSB2YWx1ZSBvZiBAY29kZXtPX2JpZ30gaW5kaWNhdGVzIGVpdGhlciBhIGZsb2F0aW5nIHBvaW50Ci1udW1iZXIsIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyfSwgb3IKLWFuIGludGVnZXIgdG8gbGFyZ2UgdG8gc3RvcmUgaW4gYW4gQGNvZGV7b2Zmc2V0VH0gdHlwZSwgc3RvcmVkIGluIHRoZSBnbG9iYWwKLWFycmF5IEBjb2Rle2dlbmVyaWNfYmlnbnVtfS4gIFRoaXMgcmF0aGVyIGluZmxleGlibGUgYXBwcm9hY2ggbWFrZXMgaXQKLWltcG9zc2libGUgdG8gdXNlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgb3IgbGFyZ2UgZXhwcmVzc2lvbnMgaW4gY29tcGxleAotZXhwcmVzc2lvbnMuCi0KLUBub2RlIEZpeHVwcwotQHN1YnNlY3Rpb24gRml4dXBzCi1AY2luZGV4IGludGVybmFscywgZml4dXBzCi1AY2luZGV4IGZpeHVwcwotQGNpbmRleCBmaXhTIHN0cnVjdHVyZQotCi1BIEBkZm57Zml4dXB9IGlzIGJhc2ljYWxseSBhbnl0aGluZyB3aGljaCBjYW4gbm90IGJlIHJlc29sdmVkIGluIHRoZSBmaXJzdAotcGFzcy4gIFNvbWV0aW1lcyBhIGZpeHVwIGNhbiBiZSByZXNvbHZlZCBieSB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseTsgaWYgbm90LAotdGhlIGZpeHVwIGJlY29tZXMgYSByZWxvY2F0aW9uIGVudHJ5IGluIHRoZSBvYmplY3QgZmlsZS4KLQotQGNpbmRleCBmaXhfbmV3Ci1AY2luZGV4IGZpeF9uZXdfZXhwCi1BIGZpeHVwIGlzIGNyZWF0ZWQgYnkgYSBjYWxsIHRvIEBjb2Rle2ZpeF9uZXd9IG9yIEBjb2Rle2ZpeF9uZXdfZXhwfS4gIEJvdGgKLXRha2UgYSBmcmFnIChAcHhyZWZ7RnJhZ3N9KSwgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGZyYWcsIGEgc2l6ZSwgYW4gaW5kaWNhdGlvbgotb2Ygd2hldGhlciB0aGUgZml4dXAgaXMgUEMgcmVsYXRpdmUsIGFuZCBhIHR5cGUuICBJbiBhIEBjb2Rle0JGRF9BU1NFTUJMRVJ9Ci1HQVMsIHRoZSB0eXBlIGlzIG5vbWluYWxseSBhIEBjb2Rle2JmZF9yZWxvY19jb2RlX3JlYWxfdHlwZX0sIGJ1dCBzZXZlcmFsCi10YXJnZXRzIHVzZSBvdGhlciB0eXBlIGNvZGVzIHRvIHJlcHJlc2VudCBmaXh1cHMgdGhhdCBjYW4gbm90IGJlIGRlc2NyaWJlZCBhcwotcmVsb2NhdGlvbnMuCi0KLVRoZSBAY29kZXtmaXhTfSBzdHJ1Y3R1cmUgaGFzIGEgbnVtYmVyIG9mIGZpZWxkcywgc2V2ZXJhbCBvZiB3aGljaCBhcmUgb2Jzb2xldGUKLW9yIGFyZSBvbmx5IHVzZWQgYnkgYSBwYXJ0aWN1bGFyIHRhcmdldC4gIFRoZSBpbXBvcnRhbnQgZmllbGRzIGFyZToKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmeF9mcmFnCi1UaGUgZnJhZyAoQHB4cmVme0ZyYWdzfSkgdGhpcyBmaXh1cCBpcyBpbi4KLQotQGl0ZW0gZnhfd2hlcmUKLVRoZSBsb2NhdGlvbiB3aXRoaW4gdGhlIGZyYWcgd2hlcmUgdGhlIGZpeHVwIG9jY3Vycy4KLQotQGl0ZW0gZnhfYWRkc3kKLVRoZSBzeW1ib2wgdGhpcyBmaXh1cCBpcyBhZ2FpbnN0LiAgVHlwaWNhbGx5LCB0aGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgaXMgYWRkZWQKLWludG8gdGhlIG9iamVjdCBjb250ZW50cy4gIFRoaXMgbWF5IGJlIE5VTEwuCi0KLUBpdGVtIGZ4X3N1YnN5Ci1UaGUgdmFsdWUgb2YgdGhpcyBzeW1ib2wgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBvYmplY3QgY29udGVudHMuICBUaGlzIGlzCi1ub3JtYWxseSBOVUxMLgotCi1AaXRlbSBmeF9vZmZzZXQKLUEgbnVtYmVyIHdoaWNoIGlzIGFkZGVkIGludG8gdGhlIGZpeHVwLgotCi1AaXRlbSBmeF9hZGRudW1iZXIKLVNvbWUgQ1BVIGJhY2tlbmRzIHVzZSB0aGlzIGZpZWxkIHRvIGNvbnZleSBpbmZvcm1hdGlvbiBiZXR3ZWVuCi1AY29kZXttZF9hcHBseV9maXh9IGFuZCBAY29kZXt0Y19nZW5fcmVsb2N9LiAgVGhlIG1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBkb2VzCi1ub3QgdXNlIGl0LgotCi1AaXRlbSBmeF9uZXh0Ci1UaGUgbmV4dCBmaXh1cCBpbiB0aGUgc2VjdGlvbi4KLQotQGl0ZW0gZnhfcl90eXBlCi1UaGUgdHlwZSBvZiB0aGUgZml4dXAuICBUaGlzIGZpZWxkIGlzIG9ubHkgZGVmaW5lZCBpZiBAY29kZXtCRkRfQVNTRU1CTEVSfSwgb3IKLWlmIHRoZSB0YXJnZXQgZGVmaW5lcyBAY29kZXtORUVEX0ZYX1JfVFlQRX0uCi0KLUBpdGVtIGZ4X3NpemUKLVRoZSBzaXplIG9mIHRoZSBmaXh1cC4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGVycm9yIGNoZWNraW5nLgotCi1AaXRlbSBmeF9wY3JlbAotV2hldGhlciB0aGUgZml4dXAgaXMgUEMgcmVsYXRpdmUuCi0KLUBpdGVtIGZ4X2RvbmUKLU5vbi16ZXJvIGlmIHRoZSBmaXh1cCBoYXMgYmVlbiBhcHBsaWVkLCBhbmQgbm8gcmVsb2NhdGlvbiBlbnRyeSBuZWVkcyB0byBiZQotZ2VuZXJhdGVkLgotCi1AaXRlbSBmeF9maWxlCi1AaXRlbXggZnhfbGluZQotVGhlIGZpbGUgYW5kIGxpbmUgd2hlcmUgdGhlIGZpeHVwIHdhcyBjcmVhdGVkLgotCi1AaXRlbSB0Y19maXhfZGF0YQotVGhpcyBoYXMgdGhlIHR5cGUgQGNvZGV7VENfRklYX1RZUEV9LCBhbmQgaXMgb25seSBkZWZpbmVkIGlmIHRoZSB0YXJnZXQgZGVmaW5lcwotdGhhdCBtYWNyby4KLUBlbmQgdGFibGUKLQotQG5vZGUgRnJhZ3MKLUBzdWJzZWN0aW9uIEZyYWdzCi1AY2luZGV4IGludGVybmFscywgZnJhZ3MKLUBjaW5kZXggZnJhZ3MKLUBjaW5kZXggZnJhZ1Mgc3RydWN0dXJlLgotCi1UaGUgQGNvZGV7ZnJhZ1N9IHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIEBmaWxle2FzLmh9LiAgRWFjaCBmcmFnIHJlcHJlc2VudHMgYQotcG9ydGlvbiBvZiB0aGUgZmluYWwgb2JqZWN0IGZpbGUuICBBcyBHQVMgcmVhZHMgdGhlIHNvdXJjZSBmaWxlLCBpdCBjcmVhdGVzCi1mcmFncyB0byBob2xkIHRoZSBkYXRhIHRoYXQgaXQgcmVhZHMuICBBdCB0aGUgZW5kIG9mIHRoZSBhc3NlbWJseSB0aGUgZnJhZ3MgYW5kCi1maXh1cHMgYXJlIHByb2Nlc3NlZCB0byBwcm9kdWNlIHRoZSBmaW5hbCBjb250ZW50cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBmcl9hZGRyZXNzCi1UaGUgYWRkcmVzcyBvZiB0aGUgZnJhZy4gIFRoaXMgaXMgbm90IHNldCB1bnRpbCB0aGUgYXNzZW1ibGVyIHJlc2NhbnMgdGhlIGxpc3QKLW9mIGFsbCBmcmFncyBhZnRlciB0aGUgZW50aXJlIGlucHV0IGZpbGUgaXMgcGFyc2VkLiAgVGhlIGZ1bmN0aW9uCi1AY29kZXtyZWxheF9zZWdtZW50fSBmaWxscyBpbiB0aGlzIGZpZWxkLgotCi1AaXRlbSBmcl9uZXh0Ci1Qb2ludGVyIHRvIHRoZSBuZXh0IGZyYWcgaW4gdGhpcyAoc3ViKXNlY3Rpb24uCi0KLUBpdGVtIGZyX2ZpeAotRml4ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2Uga25vdyB3ZSdyZSBnb2luZyB0byBlbWl0IHRvIHRoZSBvdXRwdXQgZmlsZS4gIE1heQotYmUgemVyby4KLQotQGl0ZW0gZnJfdmFyCi1WYXJpYWJsZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3ZSBtYXkgb3V0cHV0LCBhZnRlciB0aGUgaW5pdGlhbCBAY29kZXtmcl9maXh9Ci1jaGFyYWN0ZXJzLiAgTWF5IGJlIHplcm8uCi0KLUBpdGVtIGZyX29mZnNldAotVGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgZmllbGQgaXMgY29udHJvbGxlZCBieSBAY29kZXtmcl90eXBlfS4gIEdlbmVyYWxseSwKLWlmIEBjb2Rle2ZyX3Zhcn0gaXMgbm9uLXplcm8sIHRoaXMgaXMgYSByZXBlYXQgY291bnQ6IHRoZSBAY29kZXtmcl92YXJ9Ci1jaGFyYWN0ZXJzIGFyZSBvdXRwdXQgQGNvZGV7ZnJfb2Zmc2V0fSB0aW1lcy4KLQotQGl0ZW0gbGluZQotSG9sZHMgbGluZSBudW1iZXIgaW5mbyB3aGVuIGFuIGFzc2VtYmxlciBsaXN0aW5nIHdhcyByZXF1ZXN0ZWQuCi0KLUBpdGVtIGZyX3R5cGUKLVJlbGF4YXRpb24gc3RhdGUuICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2YgQGNvZGV7ZnJfb2Zmc2V0fSwKLUBjb2Rle2ZyX3N5bWJvbH0gYW5kIHRoZSB2YXJpYWJsZS1sZW5ndGggdGFpbCBvZiB0aGUgZnJhZywgYXMgd2VsbCBhcyB0aGUKLXRyZWF0bWVudCBpdCBnZXRzIGluIHZhcmlvdXMgcGhhc2VzIG9mIHByb2Nlc3NpbmcuICBJdCBkb2VzIG5vdCBhZmZlY3QgdGhlCi1pbml0aWFsIEBjb2Rle2ZyX2ZpeH0gY2hhcmFjdGVyczsgdGhleSBhcmUgYWx3YXlzIHN1cHBvc2VkIHRvIGJlIG91dHB1dAotdmVyYmF0aW0gKGZpeHVwcyBhc2lkZSkuICBTZWUgYmVsb3cgZm9yIHNwZWNpZmljIHZhbHVlcyB0aGlzIGZpZWxkIGNhbiBoYXZlLgotCi1AaXRlbSBmcl9zdWJ0eXBlCi1SZWxheGF0aW9uIHN1YnN0YXRlLiAgSWYgdGhlIG1hY3JvIEBjb2Rle21kX3JlbGF4X2ZyYWd9IGlzbid0IGRlZmluZWQsIHRoaXMgaXMKLWFzc3VtZWQgdG8gYmUgYW4gaW5kZXggaW50byBAY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSBmb3IgdGhlIGdlbmVyaWMKLXJlbGF4YXRpb24gY29kZSB0byBwcm9jZXNzIChAcHhyZWZ7UmVsYXhhdGlvbn0pLiAgSWYgQGNvZGV7bWRfcmVsYXhfZnJhZ30gaXMKLWRlZmluZWQsIHRoaXMgZmllbGQgaXMgYXZhaWxhYmxlIGZvciBhbnkgdXNlIGJ5IHRoZSBDUFUtc3BlY2lmaWMgY29kZS4KLQotQGl0ZW0gZnJfc3ltYm9sCi1UaGlzIG5vcm1hbGx5IGluZGljYXRlcyB0aGUgc3ltYm9sIHRvIHVzZSB3aGVuIHJlbGF4aW5nIHRoZSBmcmFnIGFjY29yZGluZyB0bwotQGNvZGV7ZnJfdHlwZX0uCi0KLUBpdGVtIGZyX29wY29kZQotUG9pbnRzIHRvIHRoZSBsb3dlc3QtYWRkcmVzc2VkIGJ5dGUgb2YgdGhlIG9wY29kZSwgZm9yIHVzZSBpbiByZWxheGF0aW9uLgotCi1AaXRlbSB0Y19mcmFnX2RhdGEKLVRhcmdldCBzcGVjaWZpYyBmcmFnbWVudCBkYXRhIG9mIHR5cGUgVENfRlJBR19UWVBFLgotT25seSBwcmVzZW50IGlmIEBjb2Rle1RDX0ZSQUdfVFlQRX0gaXMgZGVmaW5lZC4KLQotQGl0ZW0gZnJfZmlsZQotQGl0ZW14IGZyX2xpbmUKLVRoZSBmaWxlIGFuZCBsaW5lIHdoZXJlIHRoaXMgZnJhZyB3YXMgbGFzdCBtb2RpZmllZC4KLQotQGl0ZW0gZnJfbGl0ZXJhbAotRGVjbGFyZWQgYXMgYSBvbmUtY2hhcmFjdGVyIGFycmF5LCB0aGlzIGxhc3QgZmllbGQgZ3Jvd3MgYXJiaXRyYXJpbHkgbGFyZ2UgdG8KLWhvbGQgdGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgZnJhZy4KLUBlbmQgdGFibGUKLQotVGhlc2UgYXJlIHRoZSBwb3NzaWJsZSByZWxheGF0aW9uIHN0YXRlcywgcHJvdmlkZWQgaW4gdGhlIGVudW1lcmF0aW9uIHR5cGUKLUBjb2Rle3JlbGF4X3N0YXRlVH0sIGFuZCB0aGUgaW50ZXJwcmV0YXRpb25zIHRoZXkgcmVwcmVzZW50IGZvciB0aGUgb3RoZXIKLWZpZWxkczoKLQotQHRhYmxlIEBjb2RlCi1AaXRlbSByc19hbGlnbgotQGl0ZW14IHJzX2FsaWduX2NvZGUKLVRoZSBzdGFydCBvZiB0aGUgZm9sbG93aW5nIGZyYWcgc2hvdWxkIGJlIGFsaWduZWQgb24gc29tZSBib3VuZGFyeS4gIEluIHRoaXMKLWZyYWcsIEBjb2Rle2ZyX29mZnNldH0gaXMgdGhlIGxvZ2FyaXRobSAoYmFzZSAyKSBvZiB0aGUgYWxpZ25tZW50IGluIGJ5dGVzLgotKEZvciBleGFtcGxlLCBpZiBhbGlnbm1lbnQgb24gYW4gOC1ieXRlIGJvdW5kYXJ5IHdlcmUgZGVzaXJlZCwgQGNvZGV7ZnJfb2Zmc2V0fQotd291bGQgaGF2ZSBhIHZhbHVlIG9mIDMuKSAgVGhlIHZhcmlhYmxlIGNoYXJhY3RlcnMgaW5kaWNhdGUgdGhlIGZpbGwgcGF0dGVybiB0bwotYmUgdXNlZC4gIFRoZSBAY29kZXtmcl9zdWJ0eXBlfSBmaWVsZCBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcAotd2hlbiBkb2luZyB0aGlzIGFsaWdubWVudC4gIElmIG1vcmUgYnl0ZXMgYXJlIG5lZWRlZCwgdGhlIGFsaWdubWVudCBpcyBub3QKLWRvbmUuICBBbiBAY29kZXtmcl9zdWJ0eXBlfSB2YWx1ZSBvZiAwIG1lYW5zIG5vIG1heGltdW0sIHdoaWNoIGlzIHRoZSBub3JtYWwKLWNhc2UuICBUYXJnZXQgYmFja2VuZHMgY2FuIHVzZSBAY29kZXtyc19hbGlnbl9jb2RlfSB0byBoYW5kbGUgY2VydGFpbiB0eXBlcyBvZgotYWxpZ25tZW50IGRpZmZlcmVudGx5LgotCi1AaXRlbSByc19icm9rZW5fd29yZAotVGhpcyBpbmRpY2F0ZXMgdGhhdCBgYGJyb2tlbiB3b3JkJycgcHJvY2Vzc2luZyBzaG91bGQgYmUgZG9uZSAoQHB4cmVme0Jyb2tlbgotd29yZHN9KS4gIElmIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcgaXMgbm90IG5lY2Vzc2FyeSBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUsCi10aGlzIGVudW1lcmF0b3IgdmFsdWUgd2lsbCBub3QgYmUgZGVmaW5lZC4KLQotQGl0ZW0gcnNfY2ZhCi1UaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW1wbGVtZW50IGV4Y2VwdGlvbiBmcmFtZSBvcHRpbWl6YXRpb25zLiAgVGhlCi1AY29kZXtmcl9zeW1ib2x9IGlzIGFuIGV4cHJlc3Npb24gc3ltYm9sIGZvciB0aGUgc3VidHJhY3Rpb24gd2hpY2ggbWF5IGJlCi1yZWxheGVkLiAgVGhlIEBjb2Rle2ZyX29wY29kZX0gZmllbGQgaG9sZHMgdGhlIGZyYWcgZm9yIHRoZSBwcmVjZWRpbmcgY29tbWFuZAotYnl0ZS4gIFRoZSBAY29kZXtmcl9vZmZzZXR9IGZpZWxkIGhvbGRzIHRoZSBvZmZzZXQgd2l0aGluIHRoYXQgZnJhZy4gIFRoZQotQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgaXMgdXNlZCBkdXJpbmcgcmVsYXhhdGlvbiB0byBob2xkIHRoZSBjdXJyZW50IHNpemUgb2YKLXRoZSBmcmFnLgotCi1AaXRlbSByc19maWxsCi1UaGUgdmFyaWFibGUgY2hhcmFjdGVycyBhcmUgdG8gYmUgcmVwZWF0ZWQgQGNvZGV7ZnJfb2Zmc2V0fSB0aW1lcy4gIElmCi1AY29kZXtmcl9vZmZzZXR9IGlzIDAsIHRoaXMgZnJhZyBoYXMgYSBsZW5ndGggb2YgQGNvZGV7ZnJfZml4fS4gIE1vc3QgZnJhZ3MKLWhhdmUgdGhpcyB0eXBlLgotCi1AaXRlbSByc19sZWIxMjgKLVRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIERXQVJGIGBgbGl0dGxlIGVuZGlhbiBiYXNlIDEyOCcnIAotdmFyaWFibGUgbGVuZ3RoIG51bWJlciBmb3JtYXQuICBUaGUgQGNvZGV7ZnJfc3ltYm9sfSBpcyBhbHdheXMgYW4gZXhwcmVzc2lvbgotc3ltYm9sLCBhcyBjb25zdGFudCBleHByZXNzaW9ucyBhcmUgZW1pdHRlZCBkaXJlY3RseS4gIFRoZSBAY29kZXtmcl9vZmZzZXR9Ci1maWVsZCBpcyB1c2VkIGR1cmluZyByZWxheGF0aW9uIHRvIGhvbGQgdGhlIHByZXZpb3VzIHNpemUgb2YgdGhlIG51bWJlciBzbwotdGhhdCB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHRoZSBmcmFnbWVudCBjaGFuZ2VkIHNpemUuCi0KLUBpdGVtIHJzX21hY2hpbmVfZGVwZW5kZW50Ci1EaXNwbGFjZW1lbnQgcmVsYXhhdGlvbiBpcyB0byBiZSBkb25lIG9uIHRoaXMgZnJhZy4gIFRoZSB0YXJnZXQgaXMgaW5kaWNhdGVkIGJ5Ci1AY29kZXtmcl9zeW1ib2x9IGFuZCBAY29kZXtmcl9vZmZzZXR9LCBhbmQgQGNvZGV7ZnJfc3VidHlwZX0gaW5kaWNhdGVzIHRoZQotcGFydGljdWxhciBtYWNoaW5lLXNwZWNpZmljIGFkZHJlc3NpbmcgbW9kZSBkZXNpcmVkLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIHJzX29yZwotVGhlIHN0YXJ0IG9mIHRoZSBmb2xsb3dpbmcgZnJhZyBzaG91bGQgYmUgcHVzaGVkIGJhY2sgdG8gc29tZSBzcGVjaWZpYyBvZmZzZXQKLXdpdGhpbiB0aGUgc2VjdGlvbi4gIChTb21lIGFzc2VtYmxlcnMgdXNlIHRoZSB2YWx1ZSBhcyBhbiBhYnNvbHV0ZSBhZGRyZXNzOyBHQVMKLWRvZXMgbm90IGhhbmRsZSBmaW5hbCBhYnNvbHV0ZSBhZGRyZXNzZXMsIGJ1dCByYXRoZXIgcmVxdWlyZXMgdGhhdCB0aGUgbGlua2VyCi1zZXQgdGhlbS4pICBUaGUgb2Zmc2V0IGlzIGdpdmVuIGJ5IEBjb2Rle2ZyX3N5bWJvbH0gYW5kIEBjb2Rle2ZyX29mZnNldH07IG9uZQotY2hhcmFjdGVyIGZyb20gdGhlIHZhcmlhYmxlLWxlbmd0aCB0YWlsIGlzIHVzZWQgYXMgdGhlIGZpbGwgY2hhcmFjdGVyLgotQGVuZCB0YWJsZQotCi1AY2luZGV4IGZyY2hhaW5TIHN0cnVjdHVyZQotQSBjaGFpbiBvZiBmcmFncyBpcyBidWlsdCB1cCBmb3IgZWFjaCBzdWJzZWN0aW9uLiAgVGhlIGRhdGEgc3RydWN0dXJlCi1kZXNjcmliaW5nIGEgY2hhaW4gaXMgY2FsbGVkIGEgQGNvZGV7ZnJjaGFpblN9LCBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZwotZmllbGRzOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIGZyY2hfcm9vdAotUG9pbnRzIHRvIHRoZSBmaXJzdCBmcmFnIGluIHRoZSBjaGFpbi4gIE1heSBiZSBOVUxMIGlmIHRoZXJlIGFyZSBubyBmcmFncyBpbgotdGhpcyBjaGFpbi4KLUBpdGVtIGZyY2hfbGFzdAotUG9pbnRzIHRvIHRoZSBsYXN0IGZyYWcgaW4gdGhlIGNoYWluLCBvciBOVUxMIGlmIHRoZXJlIGFyZSBub25lLgotQGl0ZW0gZnJjaF9uZXh0Ci1OZXh0IGluIHRoZSBsaXN0IG9mIEBjb2Rle2ZyY2hhaW5TfSBzdHJ1Y3R1cmVzLgotQGl0ZW0gZnJjaF9zZWcKLUluZGljYXRlcyB0aGUgc2VjdGlvbiB0aGlzIGZyYWcgY2hhaW4gYmVsb25ncyB0by4KLUBpdGVtIGZyY2hfc3Vic2VnCi1TdWJzZWN0aW9uIChzdWJzZWdtZW50KSBudW1iZXIgb2YgdGhpcyBmcmFnIGNoYWluLgotQGl0ZW0gZml4X3Jvb3QsIGZpeF90YWlsCi0oRGVmaW5lZCBvbmx5IGlmIEBjb2Rle0JGRF9BU1NFTUJMRVJ9IGlzIGRlZmluZWQpLiAgUG9pbnQgdG8gZmlyc3QgYW5kIGxhc3QKLUBjb2Rle2ZpeFN9IHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3Vic2VjdGlvbi4KLUBpdGVtIGZyY2hfb2JzdGFjawotTm90IGN1cnJlbnRseSB1c2VkLiAgSW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgZnJhZyBhbGxvY2F0aW9uIGZvciB0aGlzCi1zdWJzZWN0aW9uLiAgVGhpcyBzaG91bGQgcmVkdWNlIGZyYWcgZ2VuZXJhdGlvbiBjYXVzZWQgYnkgc3dpdGNoaW5nIHNlY3Rpb25zLgotQGl0ZW0gZnJjaF9mcmFnX25vdwotVGhlIGN1cnJlbnQgZnJhZyBmb3IgdGhpcyBzdWJzZWdtZW50LgotQGVuZCB0YWJsZQotCi1BIEBjb2Rle2ZyY2hhaW5TfSBjb3JyZXNwb25kcyB0byBhIHN1YnNlY3Rpb247IGVhY2ggc2VjdGlvbiBoYXMgYSBsaXN0IG9mCi1AY29kZXtmcmNoYWluU30gcmVjb3JkcyBhc3NvY2lhdGVkIHdpdGggaXQuICBJbiBtb3N0IGNhc2VzLCBvbmx5IG9uZSBzdWJzZWN0aW9uCi1vZiBlYWNoIHNlY3Rpb24gaXMgdXNlZCwgc28gdGhlIGxpc3Qgd2lsbCBvbmx5IGJlIG9uZSBlbGVtZW50IGxvbmcsIGJ1dCBhbnkKLXByb2Nlc3Npbmcgb2YgZnJhZyBjaGFpbnMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSBjaGFpbnMgcGVyCi1zZWN0aW9uLgotCi1BZnRlciB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIGNvbXBsZXRlbHkgcHJvY2Vzc2VkLCBhbmQgbm8gbW9yZSBmcmFncyBhcmUgdG8KLWJlIGdlbmVyYXRlZCwgdGhlIGZyYWcgY2hhaW5zIGFyZSBqb2luZWQgaW50byBvbmUgcGVyIHNlY3Rpb24gZm9yIGZ1cnRoZXIKLXByb2Nlc3NpbmcuICBBZnRlciB0aGlzIHBvaW50LCBpdCBpcyBzYWZlIHRvIG9wZXJhdGUgb24gb25lIGNoYWluIHBlciBzZWN0aW9uLgotCi1UaGUgYXNzZW1ibGVyIGFsd2F5cyBoYXMgYSBjdXJyZW50IGZyYWcsIG5hbWVkIEBjb2Rle2ZyYWdfbm93fS4gIE1vcmUgc3BhY2UgaXMKLWFsbG9jYXRlZCBmb3IgdGhlIGN1cnJlbnQgZnJhZyB1c2luZyB0aGUgQGNvZGV7ZnJhZ19tb3JlfSBmdW5jdGlvbjsgdGhpcwotcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFtb3VudCBvZiByZXF1ZXN0ZWQgc3BhY2UuICBSZWxheGluZyBpcyBkb25lIHVzaW5nCi12YXJpYW50IGZyYWdzIGFsbG9jYXRlZCBieSBAY29kZXtmcmFnX3Zhcn0gb3IgQGNvZGV7ZnJhZ192YXJpYW50fQotKEBweHJlZntSZWxheGF0aW9ufSkuCi0KLUBub2RlIEdBUyBwcm9jZXNzaW5nCi1Ac2VjdGlvbiBXaGF0IEdBUyBkb2VzIHdoZW4gaXQgcnVucwotQGNpbmRleCBpbnRlcm5hbHMsIG92ZXJ2aWV3Ci0KLVRoaXMgaXMgYSBxdWljayBsb29rIGF0IHdoYXQgYW4gYXNzZW1ibGVyIHJ1biBsb29rcyBsaWtlLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotVGhlIGFzc2VtYmxlciBpbml0aWFsaXplcyBpdHNlbGYgYnkgY2FsbGluZyB2YXJpb3VzIGluaXQgcm91dGluZXMuCi0KLUBpdGVtCi1Gb3IgZWFjaCBzb3VyY2UgZmlsZSwgdGhlIEBjb2Rle3JlYWRfYV9zb3VyY2VfZmlsZX0gZnVuY3Rpb24gcmVhZHMgaW4gdGhlIGZpbGUKLWFuZCBwYXJzZXMgaXQuICBUaGUgZ2xvYmFsIHZhcmlhYmxlIEBjb2Rle2lucHV0X2xpbmVfcG9pbnRlcn0gcG9pbnRzIHRvIHRoZQotY3VycmVudCB0ZXh0OyBpdCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvcnJlY3QgdXAgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSwgYnV0IG5vdAotZmFydGhlci4KLQotQGl0ZW0KLUZvciBlYWNoIGxpbmUsIHRoZSBhc3NlbWJsZXIgcGFzc2VzIGxhYmVscyB0byB0aGUgQGNvZGV7Y29sb259IGZ1bmN0aW9uLCBhbmQKLWlzb2xhdGVzIHRoZSBmaXJzdCB3b3JkLiAgSWYgaXQgbG9va3MgbGlrZSBhIHBzZXVkby1vcCwgdGhlIHdvcmQgaXMgbG9va2VkIHVwCi1pbiB0aGUgcHNldWRvLW9wIGhhc2ggdGFibGUgQGNvZGV7cG9faGFzaH0gYW5kIGRpc3BhdGNoZWQgdG8gYSBwc2V1ZG8tb3AKLXJvdXRpbmUuICBPdGhlcndpc2UsIHRoZSB0YXJnZXQgZGVwZW5kZW50IEBjb2Rle21kX2Fzc2VtYmxlfSByb3V0aW5lIGlzIGNhbGxlZAotdG8gcGFyc2UgdGhlIGluc3RydWN0aW9uLgotCi1AaXRlbQotV2hlbiBwc2V1ZG8tb3BzIG9yIGluc3RydWN0aW9ucyBvdXRwdXQgZGF0YSwgdGhleSBhZGQgaXQgdG8gYSBmcmFnLCBjYWxsaW5nCi1AY29kZXtmcmFnX21vcmV9IHRvIGdldCBzcGFjZSB0byBzdG9yZSBpdCBpbi4KLQotQGl0ZW0KLVBzZXVkby1vcHMgYW5kIGluc3RydWN0aW9ucyBjYW4gYWxzbyBvdXRwdXQgZml4dXBzIGNyZWF0ZWQgYnkgQGNvZGV7Zml4X25ld30gb3IKLUBjb2Rle2ZpeF9uZXdfZXhwfS4KLQotQGl0ZW0KLUZvciBjZXJ0YWluIHRhcmdldHMsIGluc3RydWN0aW9ucyBjYW4gY3JlYXRlIHZhcmlhbnQgZnJhZ3Mgd2hpY2ggYXJlIHVzZWQgdG8KLXN0b3JlIHJlbGF4YXRpb24gaW5mb3JtYXRpb24gKEBweHJlZntSZWxheGF0aW9ufSkuCi0KLUBpdGVtCi1XaGVuIHRoZSBpbnB1dCBmaWxlIGlzIGZpbmlzaGVkLCB0aGUgQGNvZGV7d3JpdGVfb2JqZWN0X2ZpbGV9IHJvdXRpbmUgaXMKLWNhbGxlZC4gIEl0IGFzc2lnbnMgYWRkcmVzc2VzIHRvIGFsbCB0aGUgZnJhZ3MgKEBjb2Rle3JlbGF4X3NlZ21lbnR9KSwgcmVzb2x2ZXMKLWFsbCB0aGUgZml4dXBzIChAY29kZXtmaXh1cF9zZWdtZW50fSksIHJlc29sdmVzIGFsbCB0aGUgc3ltYm9sIHZhbHVlcyAodXNpbmcKLUBjb2Rle3Jlc29sdmVfc3ltYm9sX3ZhbHVlfSksIGFuZCBmaW5hbGx5IHdyaXRlcyBvdXQgdGhlIGZpbGUgKGluIHRoZQotQGNvZGV7QkZEX0FTU0VNQkxFUn0gY2FzZSwgdGhpcyBpcyBkb25lIGJ5IHNpbXBseSBjYWxsaW5nIEBjb2Rle2JmZF9jbG9zZX0pLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIFBvcnRpbmcgR0FTCi1Ac2VjdGlvbiBQb3J0aW5nIEdBUwotQGNpbmRleCBwb3J0aW5nCi0KLUVhY2ggR0FTIHRhcmdldCBzcGVjaWZpZXMgdHdvIG1haW4gdGhpbmdzOiB0aGUgQ1BVIGZpbGUgYW5kIHRoZSBvYmplY3QgZm9ybWF0Ci1maWxlLiAgVHdvIG1haW4gc3dpdGNoZXMgaW4gdGhlIEBmaWxle2NvbmZpZ3VyZS5pbn0gZmlsZSBoYW5kbGUgdGhpcy4gIFRoZQotZmlyc3Qgc3dpdGNoZXMgb24gQ1BVIHR5cGUgdG8gc2V0IHRoZSBzaGVsbCB2YXJpYWJsZSBAY29kZXtjcHVfdHlwZX0uICBUaGUKLXNlY29uZCBzd2l0Y2hlcyBvbiB0aGUgZW50aXJlIHRhcmdldCB0byBzZXQgdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle2ZtdH0uCi0KLVRoZSBjb25maWd1cmUgc2NyaXB0IHVzZXMgdGhlIHZhbHVlIG9mIEBjb2Rle2NwdV90eXBlfSB0byBzZWxlY3QgdHdvIGZpbGVzIGluCi10aGUgQGZpbGV7Y29uZmlnfSBkaXJlY3Rvcnk6IEBmaWxle3RjLUB2YXJ7Q1BVfS5jfSBhbmQgQGZpbGV7dGMtQHZhcntDUFV9Lmh9LgotVGhlIGNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7dGFyZy1jcHUuaH0gaW4gdGhlCi1idWlsZCBkaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMgQGZpbGV7dGMtQHZhcntDUFV9Lmh9LgotCi1UaGUgY29uZmlndXJlIHNjcmlwdCBhbHNvIHVzZXMgdGhlIHZhbHVlIG9mIEBjb2Rle2ZtdH0gdG8gc2VsZWN0IHR3byBmaWxlczoKLUBmaWxle29iai1AdmFye2ZtdH0uY30gYW5kIEBmaWxle29iai1AdmFye2ZtdH0uaH0uICBUaGUgY29uZmlndXJhdGlvbiBwcm9jZXNzCi13aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7b2JqLWZvcm1hdC5ofSBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5IHdoaWNoCi1pbmNsdWRlcyBAZmlsZXtvYmotQHZhcntmbXR9Lmh9LgotCi1Zb3UgY2FuIGFsc28gc2V0IHRoZSBlbXVsYXRpb24gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYnkgc2V0dGluZyB0aGUgQGNvZGV7ZW19Ci12YXJpYWJsZS4gIE5vcm1hbGx5IHRoZSBkZWZhdWx0IHZhbHVlIG9mIEBzYW1we2dlbmVyaWN9IGlzIGZpbmUuICBUaGUKLWNvbmZpZ3VyYXRpb24gcHJvY2VzcyB3aWxsIGNyZWF0ZSBhIGZpbGUgbmFtZWQgQGZpbGV7dGFyZy1lbnYuaH0gaW4gdGhlIGJ1aWxkCi1kaXJlY3Rvcnkgd2hpY2ggaW5jbHVkZXMgQGZpbGV7dGUtQHZhcntlbX0uaH0uCi0KLVBvcnRpbmcgR0FTIHRvIGEgbmV3IENQVSByZXF1aXJlcyB3cml0aW5nIHRoZSBAZmlsZXt0Yy1AdmFye0NQVX19IGZpbGVzLgotUG9ydGluZyBHQVMgdG8gYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IHJlcXVpcmVzIHdyaXRpbmcgdGhlCi1AZmlsZXtvYmotQHZhcntmbXR9fSBmaWxlcy4gIFRoZXJlIGlzIHNvbWV0aW1lcyBzb21lIGludGVyYWN0aW9uIGJldHdlZW4gdGhlc2UKLXR3byBmaWxlcywgYnV0IGl0IGlzIG5vcm1hbGx5IG1pbmltYWwuCi0KLVRoZSBiZXN0IGFwcHJvYWNoIGlzLCBvZiBjb3Vyc2UsIHRvIGNvcHkgZXhpc3RpbmcgZmlsZXMuICBUaGUgZG9jdW1lbnRhdGlvbgotYmVsb3cgYXNzdW1lcyB0aGF0IHlvdSBhcmUgbG9va2luZyBhdCBleGlzdGluZyBmaWxlcyB0byBzZWUgdXNhZ2UgZGV0YWlscy4KLQotVGhlc2UgaW50ZXJmYWNlcyBoYXZlIGdyb3duIG92ZXIgdGltZSwgYW5kIGhhdmUgbmV2ZXIgYmVlbiBjYXJlZnVsbHkgdGhvdWdodAotb3V0IG9yIGRlc2lnbmVkLiAgTm90aGluZyBhYm91dCB0aGUgaW50ZXJmYWNlcyBkZXNjcmliZWQgaGVyZSBpcyBjYXN0IGluIHN0b25lLgotSXQgaXMgcG9zc2libGUgdGhhdCB0aGV5IHdpbGwgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgdGhlIGFzc2VtYmxlciB0byB0aGUKLW5leHQuICBBbHNvLCBuZXcgbWFjcm9zIGFyZSBhZGRlZCBhbGwgdGhlIHRpbWUgYXMgdGhleSBhcmUgbmVlZGVkLgotCi1AbWVudQotKiBDUFUgYmFja2VuZDo6ICAgICAgICAgICAgICAgICBXcml0aW5nIGEgQ1BVIGJhY2tlbmQKLSogT2JqZWN0IGZvcm1hdCBiYWNrZW5kOjogICAgICAgV3JpdGluZyBhbiBvYmplY3QgZm9ybWF0IGJhY2tlbmQKLSogRW11bGF0aW9uczo6ICAgICAgICAgICAgICAgICAgV3JpdGluZyBlbXVsYXRpb24gZmlsZXMKLUBlbmQgbWVudQotCi1Abm9kZSBDUFUgYmFja2VuZAotQHN1YnNlY3Rpb24gV3JpdGluZyBhIENQVSBiYWNrZW5kCi1AY2luZGV4IENQVSBiYWNrZW5kCi1AY2luZGV4IEBmaWxle3RjLUB2YXJ7Q1BVfX0KLQotVGhlIENQVSBiYWNrZW5kIGZpbGVzIGFyZSB0aGUgaGVhcnQgb2YgdGhlIGFzc2VtYmxlci4gIFRoZXkgYXJlIHRoZSBvbmx5IHBhcnRzCi1vZiB0aGUgYXNzZW1ibGVyIHdoaWNoIGFjdHVhbGx5IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGluc3RydWN0aW9uIHNldCBvZiB0aGUKLXByb2Nlc3Nvci4KLQotWW91IG11c3QgZGVmaW5lIGEgcmVhc29uYWJseSBzbWFsbCBsaXN0IG9mIG1hY3JvcyBhbmQgZnVuY3Rpb25zIGluIHRoZSBDUFUKLWJhY2tlbmQgZmlsZXMuICBZb3UgbWF5IGRlZmluZSBhIGxhcmdlIG51bWJlciBvZiBhZGRpdGlvbmFsIG1hY3JvcyBpbiB0aGUgQ1BVCi1iYWNrZW5kIGZpbGVzLCBub3QgYWxsIG9mIHdoaWNoIGFyZSBkb2N1bWVudGVkIGhlcmUuICBZb3UgbXVzdCwgb2YgY291cnNlLAotZGVmaW5lIG1hY3JvcyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUsIHdoaWNoIGlzIGluY2x1ZGVkIGJ5IGV2ZXJ5IGFzc2VtYmxlcgotc291cmNlIGZpbGUuICBZb3UgbWF5IGRlZmluZSB0aGUgZnVuY3Rpb25zIGFzIG1hY3JvcyBpbiB0aGUgQGZpbGV7Lmh9IGZpbGUsIG9yCi1hcyBmdW5jdGlvbnMgaW4gdGhlIEBmaWxley5jfSBmaWxlLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFRDX0B2YXJ7Q1BVfQotQGNpbmRleCBUQ19AdmFye0NQVX0KLUJ5IGNvbnZlbnRpb24sIHlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gaW4gdGhlIEBmaWxley5ofSBmaWxlLiAgRm9yCi1leGFtcGxlLCBAZmlsZXt0Yy1tNjhrLmh9IGRlZmluZXMgQGNvZGV7VENfTTY4S30uICBZb3UgbWlnaHQgaGF2ZSB0byB1c2UgdGhpcwotaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGFkZCBDUFUgc3BlY2lmaWMgY29kZSB0byB0aGUgb2JqZWN0IGZvcm1hdCBmaWxlLgotCi1AaXRlbSBUQVJHRVRfRk9STUFUCi1UaGlzIG1hY3JvIGlzIHRoZSBCRkQgdGFyZ2V0IG5hbWUgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdGhlIG91dHB1dCBmaWxlLiAgVGhpcwotd2lsbCBub3JtYWxseSBkZXBlbmQgdXBvbiB0aGUgQGNvZGV7T0JKX0B2YXJ7Rk1UfX0gbWFjcm8uCi0KLUBpdGVtIFRBUkdFVF9BUkNICi1UaGlzIG1hY3JvIGlzIHRoZSBCRkQgYXJjaGl0ZWN0dXJlIHRvIHBhc3MgdG8gQGNvZGV7YmZkX3NldF9hcmNoX21hY2h9LgotCi1AaXRlbSBUQVJHRVRfTUFDSAotVGhpcyBtYWNybyBpcyB0aGUgQkZEIG1hY2hpbmUgbnVtYmVyIHRvIHBhc3MgdG8gQGNvZGV7YmZkX3NldF9hcmNoX21hY2h9LiAgSWYKLWl0IGlzIG5vdCBkZWZpbmVkLCBHQVMgd2lsbCB1c2UgMC4KLQotQGl0ZW0gVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4KLVlvdSBzaG91bGQgZGVmaW5lIHRoaXMgbWFjcm8gdG8gYmUgbm9uLXplcm8gaWYgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuLCBhbmQKLXplcm8gaWYgdGhlIHRhcmdldCBpcyBsaXR0bGUgZW5kaWFuLgotCi1AaXRlbSBtZF9zaG9ydG9wdHMKLUBpdGVteCBtZF9sb25nb3B0cwotQGl0ZW14IG1kX2xvbmdvcHRzX3NpemUKLUBpdGVteCBtZF9wYXJzZV9vcHRpb24KLUBpdGVteCBtZF9zaG93X3VzYWdlCi1AY2luZGV4IG1kX3Nob3J0b3B0cwotQGNpbmRleCBtZF9sb25nb3B0cwotQGNpbmRleCBtZF9sb25nb3B0c19zaXplCi1AY2luZGV4IG1kX3BhcnNlX29wdGlvbgotQGNpbmRleCBtZF9zaG93X3VzYWdlCi1HQVMgdXNlcyB0aGVzZSB2YXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBkdXJpbmcgb3B0aW9uIHByb2Nlc3NpbmcuCi1AY29kZXttZF9zaG9ydG9wdHN9IGlzIGEgQGNvZGV7Y29uc3QgY2hhciAqfSB3aGljaCBHQVMgYWRkcyB0byB0aGUgbWFjaGluZQotaW5kZXBlbmRlbnQgc3RyaW5nIHBhc3NlZCB0byBAY29kZXtnZXRvcHR9LiAgQGNvZGV7bWRfbG9uZ29wdHN9IGlzIGEKLUBjb2Rle3N0cnVjdCBvcHRpb24gW119IHdoaWNoIEdBUyBhZGRzIHRvIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50IGxvbmcgb3B0aW9ucwotcGFzc2VkIHRvIEBjb2Rle2dldG9wdH07IHlvdSBtYXkgdXNlIEBjb2Rle09QVElPTl9NRF9CQVNFfSwgZGVmaW5lZCBpbgotQGZpbGV7YXMuaH0sIGFzIHRoZSBzdGFydCBvZiBhIHNldCBvZiBsb25nIG9wdGlvbiBpbmRpY2VzLCBpZiBuZWNlc3NhcnkuCi1AY29kZXttZF9sb25nb3B0c19zaXplfSBpcyBhIEBjb2Rle3NpemVfdH0gaG9sZGluZyB0aGUgc2l6ZSBAY29kZXttZF9sb25nb3B0c30uCi1HQVMgd2lsbCBjYWxsIEBjb2Rle21kX3BhcnNlX29wdGlvbn0gd2hlbmV2ZXIgQGNvZGV7Z2V0b3B0fSByZXR1cm5zIGFuCi11bnJlY29nbml6ZWQgY29kZSwgcHJlc3VtYWJseSBpbmRpY2F0aW5nIGEgc3BlY2lhbCBjb2RlIHZhbHVlIHdoaWNoIGFwcGVhcnMgaW4KLUBjb2Rle21kX2xvbmdvcHRzfS4gIEdBUyB3aWxsIGNhbGwgQGNvZGV7bWRfc2hvd191c2FnZX0gd2hlbiBhIHVzYWdlIG1lc3NhZ2UgaXMKLXByaW50ZWQ7IGl0IHNob3VsZCBwcmludCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtYWNoaW5lIHNwZWNpZmljIG9wdGlvbnMuCi0KLUBpdGVtIG1kX2JlZ2luCi1AY2luZGV4IG1kX2JlZ2luCi1HQVMgd2lsbCBjYWxsIHRoaXMgZnVuY3Rpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBhc3NlbWJseSwgYWZ0ZXIgdGhlIGNvbW1hbmQKLWxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQgYW5kIGFsbCB0aGUgbWFjaGluZSBpbmRlcGVuZGVudCBpbml0aWFsaXphdGlvbnMKLWhhdmUgYmVlbiBjb21wbGV0ZWQuCi0KLUBpdGVtIG1kX2NsZWFudXAKLUBjaW5kZXggbWRfY2xlYW51cAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBlbmQgb2YgZWFjaCBpbnB1dCBmaWxlLgotCi1AaXRlbSBtZF9hc3NlbWJsZQotQGNpbmRleCBtZF9hc3NlbWJsZQotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBlYWNoIGlucHV0IGxpbmUgd2hpY2ggZG9lcyBub3QgY29udGFpbiBhCi1wc2V1ZG8tb3AuICBUaGUgYXJndW1lbnQgaXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlIGZ1bmN0aW9uIHNob3VsZAotYXNzZW1ibGUgdGhlIHN0cmluZyBhcyBhbiBpbnN0cnVjdGlvbiB3aXRoIG9wZXJhbmRzLiAgTm9ybWFsbHkKLUBjb2Rle21kX2Fzc2VtYmxlfSB3aWxsIGRvIHRoaXMgYnkgY2FsbGluZyBAY29kZXtmcmFnX21vcmV9IGFuZCB3cml0aW5nIG91dAotc29tZSBieXRlcyAoQHB4cmVme0ZyYWdzfSkuICBAY29kZXttZF9hc3NlbWJsZX0gd2lsbCBjYWxsIEBjb2Rle2ZpeF9uZXd9IHRvCi1jcmVhdGUgZml4dXBzIGFzIG5lZWRlZCAoQHB4cmVme0ZpeHVwc30pLiAgVGFyZ2V0cyB3aGljaCBuZWVkIHRvIGRvIHNwZWNpYWwKLXB1cnBvc2UgcmVsYXhhdGlvbiB3aWxsIGNhbGwgQGNvZGV7ZnJhZ192YXJ9LgotCi1AaXRlbSBtZF9wc2V1ZG9fdGFibGUKLUBjaW5kZXggbWRfcHNldWRvX3RhYmxlCi1UaGlzIGlzIGEgY29uc3QgYXJyYXkgb2YgdHlwZSBAY29kZXtwc2V1ZG9fdHlwZVN9LiAgSXQgaXMgYSBtYXBwaW5nIGZyb20KLXBzZXVkby1vcCBuYW1lcyB0byBmdW5jdGlvbnMuICBZb3Ugc2hvdWxkIHVzZSB0aGlzIHRhYmxlIHRvIGltcGxlbWVudAotcHNldWRvLW9wcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8gdGhlIENQVS4KLQotQGl0ZW0gdGNfY29uZGl0aW9uYWxfcHNldWRvb3AKLUBjaW5kZXggdGNfY29uZGl0aW9uYWxfcHNldWRvb3AKLUlmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgR0FTIHdpbGwgY2FsbCBpdCB3aXRoIGEgQGNvZGV7cHNldWRvX3R5cGVTfSBhcmd1bWVudC4KLUl0IHNob3VsZCByZXR1cm4gbm9uLXplcm8gaWYgdGhlIHBzZXVkby1vcCBpcyBhIGNvbmRpdGlvbmFsIHdoaWNoIGNvbnRyb2xzCi13aGV0aGVyIGNvZGUgaXMgYXNzZW1ibGVkLCBzdWNoIGFzIEBzYW1wey5pZn0uICBHQVMga25vd3MgYWJvdXQgdGhlIG5vcm1hbAotY29uZGl0aW9uYWwgcHNldWRvLW9wcyxhbmQgeW91IHNob3VsZCBub3JtYWxseSBub3QgaGF2ZSB0byBkZWZpbmUgdGhpcyBtYWNyby4KLQotQGl0ZW0gY29tbWVudF9jaGFycwotQGNpbmRleCBjb21tZW50X2NoYXJzCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggc3RhcnQgYQotY29tbWVudC4KLQotQGl0ZW0gdGNfY29tbWVudF9jaGFycwotQGNpbmRleCB0Y19jb21tZW50X2NoYXJzCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIEdBUyB3aWxsIHVzZSBpdCBpbnN0ZWFkIG9mIEBjb2Rle2NvbW1lbnRfY2hhcnN9LgotCi1AaXRlbSB0Y19zeW1ib2xfY2hhcnMKLUBjaW5kZXggdGNfc3ltYm9sX2NoYXJzCi1JZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIGl0IGlzIGEgcG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBsaXN0IG9mCi1jaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXIgaW4gYW4gb3BlcmFuZC4gIEdBUyBhbHJlYWR5IGFzc3VtZXMgdGhhdCBhbGwKLWFscGhhbnVtYmVyaWMgY2hhcmFjdGVycywgYW5kIEBzYW1weyR9LCBAc2FtcHsufSwgYW5kIEBzYW1we199IG1heSBhcHBlYXIgaW4gYW4KLW9wZXJhbmQgKHNlZSBAc2FtcHtzeW1ib2xfY2hhcnN9IGluIEBmaWxle2FwcC5jfSkuICBUaGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkCi10byB0cmVhdCBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgYXMgYXBwZWFyaW5nIGluIGFuIG9wZXJhbmQuICBUaGlzIGFmZmVjdHMgdGhlCi13YXkgaW4gd2hpY2ggR0FTIHJlbW92ZXMgd2hpdGVzcGFjZSBiZWZvcmUgcGFzc2luZyB0aGUgc3RyaW5nIHRvCi1Ac2FtcHttZF9hc3NlbWJsZX0uCi0KLUBpdGVtIGxpbmVfY29tbWVudF9jaGFycwotQGNpbmRleCBsaW5lX2NvbW1lbnRfY2hhcnMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBzdGFydCBhCi1jb21tZW50IHdoZW4gdGhleSBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZS4KLQotQGl0ZW0gbGluZV9zZXBhcmF0b3JfY2hhcnMKLUBjaW5kZXggbGluZV9zZXBhcmF0b3JfY2hhcnMKLVRoaXMgaXMgYSBudWxsIHRlcm1pbmF0ZWQgQGNvZGV7Y29uc3QgY2hhcn0gYXJyYXkgb2YgY2hhcmFjdGVycyB3aGljaCBzZXBhcmF0ZQotbGluZXMgKHNlbWljb2xvbiBhbmQgbmV3bGluZSBhcmUgc3VjaCBjaGFyYWN0ZXJzIGJ5IGRlZmF1bHQsIGFuZCBuZWVkIG5vdCBiZQotbGlzdGVkIGluIHRoaXMgYXJyYXkpLgotCi1AaXRlbSBFWFBfQ0hBUlMKLUBjaW5kZXggRVhQX0NIQVJTCi1UaGlzIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIEBjb2Rle2NvbnN0IGNoYXJ9IGFycmF5IG9mIGNoYXJhY3RlcnMgd2hpY2ggbWF5IGJlCi11c2VkIGFzIHRoZSBleHBvbmVudCBjaGFyYWN0ZXIgaW4gYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICBUaGlzIGlzIG5vcm1hbGx5Ci1AY29kZXsiZUUifS4KLQotQGl0ZW0gRkxUX0NIQVJTCi1AY2luZGV4IEZMVF9DSEFSUwotVGhpcyBpcyBhIG51bGwgdGVybWluYXRlZCBAY29kZXtjb25zdCBjaGFyfSBhcnJheSBvZiBjaGFyYWN0ZXJzIHdoaWNoIG1heSBiZQotdXNlZCB0byBpbmRpY2F0ZSBhIGZsb2F0aW5nIHBvaW50IGNvbnN0YW50LiAgQSB6ZXJvIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGVzZQotY2hhcmFjdGVycyBpcyBhc3N1bWVkIHRvIGJlIGZvbGxvd2VkIGJ5IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOyB0aHVzIHRoZXkKLW9wZXJhdGUgdGhlIHdheSB0aGF0IEBjb2RlezB4fSBpcyB1c2VkIHRvIGluZGljYXRlIGEgaGV4YWRlY2ltYWwgY29uc3RhbnQuCi1Vc3VhbGx5IHRoaXMgaW5jbHVkZXMgQHNhbXB7cn0gYW5kIEBzYW1we2Z9LgotCi1AaXRlbSBMRVhfQVQKLUBjaW5kZXggTEVYX0FUCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIEBrYmR7QH19IGNoYXJhY3Rlci4gIFRoZQotZGVmYXVsdCBpcyB6ZXJvLgotCi1MZXhpY2FsIHR5cGVzIGFyZSBhIGNvbWJpbmF0aW9uIG9mIEBjb2Rle0xFWF9OQU1FfSBhbmQgQGNvZGV7TEVYX0JFR0lOX05BTUV9LAotYm90aCBkZWZpbmVkIGluIEBmaWxle3JlYWQuaH0uICBAY29kZXtMRVhfTkFNRX0gaW5kaWNhdGVzIHRoYXQgdGhlIGNoYXJhY3RlcgotbWF5IGFwcGVhciBpbiBhIG5hbWUuICBAY29kZXtMRVhfQkVHSU5fTkFNRX0gaW5kaWNhdGVzIHRoYXQgdGhlIGNoYXJhY3RlciBtYXkKLWFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbmVtLgotCi1AaXRlbSBMRVhfQlIKLUBjaW5kZXggTEVYX0JSCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHRoZSBsZXhpY2FsIHR5cGUgb2YgdGhlIGJyYWNlIGNoYXJhY3RlcnMgQGtiZHtAe30sCi1Aa2Jke0B9fSwgQGtiZHtbfSwgYW5kIEBrYmR7XX0uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB6ZXJvLgotCi1AaXRlbSBMRVhfUENUCi1AY2luZGV4IExFWF9QQ1QKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHslfSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgemVyby4KLQotQGl0ZW0gTEVYX1FNCi1AY2luZGV4IExFWF9RTQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byB0aGUgbGV4aWNhbCB0eXBlIG9mIHRoZSBAa2Jkez99IGNoYXJhY3Rlci4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpdCB6ZXJvLgotCi1AaXRlbSBMRVhfRE9MTEFSCi1AY2luZGV4IExFWF9ET0xMQVIKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gdGhlIGxleGljYWwgdHlwZSBvZiB0aGUgQGtiZHskfSBjaGFyYWN0ZXIuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7TEVYX05BTUUgfCBMRVhfQkVHSU5fTkFNRX0uCi0KLUBpdGVtIFNJTkdMRV9RVU9URV9TVFJJTkdTCi1AY2luZGV4IFNJTkdMRV9RVU9URV9TVFJJTkdTCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHRyZWF0IHNpbmdsZSBxdW90ZXMgYXMgc3RyaW5nIGRlbGltaXRlcnMuCi1Ob3JtYWxseSBvbmx5IGRvdWJsZSBxdW90ZXMgYXJlIGFjY2VwdGVkIGFzIHN0cmluZyBkZWxpbWl0ZXJzLgotCi1AaXRlbSBOT19TVFJJTkdfRVNDQVBFUwotQGNpbmRleCBOT19TVFJJTkdfRVNDQVBFUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBub3QgcGVybWl0IGVzY2FwZSBzZXF1ZW5jZXMgaW4gYSBzdHJpbmcuCi0KLUBpdGVtIE9OTFlfU1RBTkRBUkRfRVNDQVBFUwotQGNpbmRleCBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgd2FybiBhYm91dCB0aGUgdXNlIG9mIG5vbnN0YW5kYXJkIGVzY2FwZQotc2VxdWVuY2VzIGluIGEgc3RyaW5nLgotCi1AaXRlbSBtZF9zdGFydF9saW5lX2hvb2sKLUBjaW5kZXggbWRfc3RhcnRfbGluZV9ob29rCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbGluZS4KLQotQGl0ZW0gTEFCRUxTX1dJVEhPVVRfQ09MT05TCi1AY2luZGV4IExBQkVMU19XSVRIT1VUX0NPTE9OUwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBhc3N1bWUgdGhhdCBhbnkgdGV4dCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lCi1pcyBhIGxhYmVsLCBldmVuIGlmIGl0IGRvZXMgbm90IGhhdmUgYSBjb2xvbi4KLQotQGl0ZW0gVENfU1RBUlRfTEFCRUwKLUBjaW5kZXggVENfU1RBUlRfTEFCRUwKLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gY29udHJvbCB3aGF0IEdBUyBjb25zaWRlcnMgdG8gYmUgYSBsYWJlbC4gIFRoZQotZGVmYXVsdCBkZWZpbml0aW9uIGlzIHRvIGFjY2VwdCBhbnkgbmFtZSBmb2xsb3dlZCBieSBhIGNvbG9uIGNoYXJhY3Rlci4KLQotQGl0ZW0gTk9fUFNFVURPX0RPVAotQGNpbmRleCBOT19QU0VVRE9fRE9UCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIG5vdCByZXF1aXJlIHBzZXVkby1vcHMgdG8gc3RhcnQgd2l0aCBhCi1Aa2Jkey59IGNoYXJhY3Rlci4KLQotQGl0ZW0gVENfRVFVQUxfSU5fSU5TTgotQGNpbmRleCBUQ19FUVVBTF9JTl9JTlNOCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gbm9uemVybyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMKLXBlcm1pdHRlZCB0byBjb250YWluIGFuIEBrYmR7PX0gY2hhcmFjdGVyLiAgR0FTIHdpbGwgdXNlIHRoaXMgdG8gZGVjaWRlIGlmIGEKLUBrYmR7PX0gaXMgYW4gYXNzaWdubWVudCBvciBhbiBpbnN0cnVjdGlvbi4KLQotQGl0ZW0gVENfRU9MX0lOX0lOU04KLUBjaW5kZXggVENfRU9MX0lOX0lOU04KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgaXQgc2hvdWxkIHJldHVybiBub256ZXJvIGlmIHRoZSBjdXJyZW50IGlucHV0IGxpbmUKLXBvaW50ZXIgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgdGhlIGVuZCBvZiBhIGxpbmUuCi0KLUBpdGVtIG1kX3BhcnNlX25hbWUKLUBjaW5kZXggbWRfcGFyc2VfbmFtZQotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBhbnkgc3ltYm9sIGZvdW5kIGluIGFuCi1leHByZXNzaW9uLiAgWW91IGNhbiBkZWZpbmUgdGhpcyB0byBoYW5kbGUgc3BlY2lhbCBzeW1ib2xzIGluIGEgc3BlY2lhbCB3YXkuCi1JZiBhIHN5bWJvbCBhbHdheXMgaGFzIGEgY2VydGFpbiB2YWx1ZSwgeW91IHNob3VsZCBub3JtYWxseSBlbnRlciBpdCBpbiB0aGUKLXN5bWJvbCB0YWJsZSwgcGVyaGFwcyB1c2luZyBAY29kZXtyZWdfc2VjdGlvbn0uCi0KLUBpdGVtIG1kX3VuZGVmaW5lZF9zeW1ib2wKLUBjaW5kZXggbWRfdW5kZWZpbmVkX3N5bWJvbAotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gYSBzeW1ib2wgdGFibGUgbG9va3VwIGZhaWxzLCBiZWZvcmUgaXQKLWNyZWF0ZXMgYSBuZXcgc3ltYm9sLiAgVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgdXNlZCB0byBzdXBwbHkgc3ltYm9scyB3aG9zZQotbmFtZSBvciB2YWx1ZSBjaGFuZ2VzIGR5bmFtaWNhbGx5LCBwb3NzaWJseSBpbiBhIGNvbnRleHQgc2Vuc2l0aXZlIHdheS4KLVByZWRlZmluZWQgc3ltYm9scyB3aXRoIGZpeGVkIHZhbHVlcywgc3VjaCBhcyByZWdpc3RlciBuYW1lcyBvciBjb25kaXRpb24KLWNvZGVzLCBhcmUgdHlwaWNhbGx5IGVudGVyZWQgZGlyZWN0bHkgaW50byB0aGUgc3ltYm9sIHRhYmxlIHdoZW4gQGNvZGV7bWRfYmVnaW59Ci1pcyBjYWxsZWQuCi0KLUBpdGVtIG1kX29wZXJhbmQKLUBjaW5kZXggbWRfb3BlcmFuZAotR0FTIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uIGZvciBhbnkgZXhwcmVzc2lvbiB0aGF0IGNhbiBub3QgYmUgcmVjb2duaXplZC4KLVdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCwgQGNvZGV7aW5wdXRfbGluZV9wb2ludGVyfSB3aWxsIHBvaW50IHRvIHRoZSBzdGFydAotb2YgdGhlIGV4cHJlc3Npb24uCi0KLUBpdGVtIHRjX3VucmVjb2duaXplZF9saW5lCi1AY2luZGV4IHRjX3VucmVjb2duaXplZF9saW5lCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgd2hlbiBpdCBmaW5kcyBhIGxpbmUgdGhhdCBpdCBjYW4gbm90Ci1wYXJzZS4KLQotQGl0ZW0gbWRfZG9fYWxpZ24KLUBjaW5kZXggbWRfZG9fYWxpZ24KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaGFuZGxlIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuICBHQVMgd2lsbCBjYWxsIGl0Ci13aGVuIHRoZSBkaXJlY3RpdmUgaXMgc2VlbiBpbiB0aGUgaW5wdXQgZmlsZS4gIEZvciBleGFtcGxlLCB0aGUgaTM4NiBiYWNrZW5kCi11c2VzIHRoaXMgdG8gZ2VuZXJhdGUgZWZmaWNpZW50IG5vcCBpbnN0cnVjdGlvbnMgb2YgdmFyeWluZyBsZW5ndGhzLCBkZXBlbmRpbmcKLXVwb24gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHRoZSBhbGlnbm1lbnQgd2lsbCBza2lwLgotCi1AaXRlbSBIQU5ETEVfQUxJR04KLUBjaW5kZXggSEFORExFX0FMSUdOCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGRvIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGFuIGFsaWdubWVudCBkaXJlY3RpdmUuCi1HQVMgd2lsbCBjYWxsIGl0IGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LgotCi1AaXRlbSBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotQGNpbmRleCBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGVhY2ggdGltZSBpdCBza2lwcyBhbnkgc3BhY2UgYmVjYXVzZSBvZiBhCi1zcGFjZSBmaWxsaW5nIG9yIGFsaWdubWVudCBvciBkYXRhIGFsbG9jYXRpb24gcHNldWRvLW9wLgotCi1AaXRlbSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLUBjaW5kZXggVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIHBhcnNlIGFuIGV4cHJlc3Npb24gdXNlZCBpbiBhIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wIHN1Y2ggYXMgQGNvZGV7LndvcmR9LiAgWW91IGNhbiB1c2UgdGhpcyB0byByZWNvZ25pemUgcmVsb2NhdGlvbgotZGlyZWN0aXZlcyB0aGF0IG1heSBhcHBlYXIgaW4gc3VjaCBkaXJlY3RpdmVzLgotCi1AaXRlbSBCSVRGSUVMRF9DT05TX0VYUFJFU1NJT04KLUBjaW5kZXggQklURklFTERfQ09OU19FWFBSRVNTSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIHJlY29nbml6ZSBiaXRmaWVsZCBpbnN0cnVjdGlvbnMgaW4gZGF0YQotYWxsb2NhdGlvbiBwc2V1ZG8tb3BzLCBhcyB1c2VkIG9uIHRoZSBpOTYwLgotCi1AaXRlbSBSRVBFQVRfQ09OU19FWFBSRVNTSU9OCi1AY2luZGV4IFJFUEVBVF9DT05TX0VYUFJFU1NJT04KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgcmVjb2duaXplIHJlcGVhdCBjb3VudHMgaW4gZGF0YSBhbGxvY2F0aW9uCi1wc2V1ZG8tb3BzLCBhcyB1c2VkIG9uIHRoZSBNSVBTLgotCi1AaXRlbSBtZF9jb25zX2FsaWduCi1AY2luZGV4IG1kX2NvbnNfYWxpZ24KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gZG8gYW55IHNwZWNpYWwgYWxpZ25tZW50IGJlZm9yZSBhIGRhdGEgYWxsb2NhdGlvbgotcHNldWRvLW9wLgotCi1AaXRlbSBUQ19DT05TX0ZJWF9ORVcKLUBjaW5kZXggVENfQ09OU19GSVhfTkVXCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGdlbmVyYXRlIGEgZml4dXAgZm9yIGEgZGF0YSBhbGxvY2F0aW9uIHBzZXVkby1vcC4KLQotQGl0ZW0gVENfSU5JVF9GSVhfREFUQSAoQHZhcntmaXhwfSkKLUBjaW5kZXggVENfSU5JVF9GSVhfREFUQQotQSBDIHN0YXRlbWVudCB0byBpbml0aWFsaXplIHRoZSB0YXJnZXQgc3BlY2lmaWMgZmllbGRzIG9mIGZpeHVwIEB2YXJ7Zml4cH0uCi1UaGVzZSBmaWVsZHMgYXJlIGRlZmluZWQgd2l0aCB0aGUgQGNvZGV7VENfRklYX1RZUEV9IG1hY3JvLgotCi1AaXRlbSBUQ19GSVhfREFUQV9QUklOVCAoQHZhcntzdHJlYW19LCBAdmFye2ZpeHB9KQotQGNpbmRleCBUQ19GSVhfREFUQV9QUklOVAotQSBDIHN0YXRlbWVudCB0byBvdXRwdXQgdGFyZ2V0IHNwZWNpZmljIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IKLWZpeHVwIEB2YXJ7Zml4cH0gdG8gQHZhcntzdHJlYW19LiAgVGhpcyBtYWNybyBpcyBjYWxsZWQgYnkgQGNvZGV7cHJpbnRfZml4dXB9LgotCi1AaXRlbSBUQ19GUkFHX0lOSVQgKEB2YXJ7ZnJhZ3B9KQotQGNpbmRleCBUQ19GUkFHX0lOSVQKLUEgQyBzdGF0ZW1lbnQgdG8gaW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IHNwZWNpZmljIGZpZWxkcyBvZiBmcmFnIEB2YXJ7ZnJhZ3B9LgotVGhlc2UgZmllbGRzIGFyZSBkZWZpbmVkIHdpdGggdGhlIEBjb2Rle1RDX0ZSQUdfVFlQRX0gbWFjcm8uCi0KLUBpdGVtIG1kX251bWJlcl90b19jaGFycwotQGNpbmRleCBtZF9udW1iZXJfdG9fY2hhcnMKLVRoaXMgc2hvdWxkIGp1c3QgY2FsbCBlaXRoZXIgQGNvZGV7bnVtYmVyX3RvX2NoYXJzX2JpZ2VuZGlhbn0gb3IKLUBjb2Rle251bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW59LCB3aGljaGV2ZXIgaXMgYXBwcm9wcmlhdGUuICBPbiB0YXJnZXRzIGxpa2UKLXRoZSBNSVBTIHdoaWNoIHN1cHBvcnQgb3B0aW9ucyB0byBjaGFuZ2UgdGhlIGVuZGlhbm5lc3MsIHdoaWNoIGZ1bmN0aW9uIHRvIGNhbGwKLWlzIGEgcnVudGltZSBkZWNpc2lvbi4gIE9uIG90aGVyIHRhcmdldHMsIEBjb2Rle21kX251bWJlcl90b19jaGFyc30gY2FuIGJlIGEKLXNpbXBsZSBtYWNyby4KLQotQGl0ZW0gbWRfcmVsb2Nfc2l6ZQotQGNpbmRleCBtZF9yZWxvY19zaXplCi1UaGlzIHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiBnYXMgKG5vdAotQGNvZGV7QkZEX0FTU0VNQkxFUn0gYW5kIG5vdCBAY29kZXtNQU5ZX1NFR01FTlRTfSkuICBJdCBob2xkcyB0aGUgc2l6ZSBvZiBhCi1yZWxvY2F0aW9uIGVudHJ5LgotCi1AaXRlbSBXT1JLSU5HX0RPVF9XT1JECi1AaXRlbXggbWRfc2hvcnRfanVtcF9zaXplCi1AaXRlbXggbWRfbG9uZ19qdW1wX3NpemUKLUBpdGVteCBtZF9jcmVhdGVfc2hvcnRfanVtcAotQGl0ZW14IG1kX2NyZWF0ZV9sb25nX2p1bXAKLUBjaW5kZXggV09SS0lOR19ET1RfV09SRAotQGNpbmRleCBtZF9zaG9ydF9qdW1wX3NpemUKLUBjaW5kZXggbWRfbG9uZ19qdW1wX3NpemUKLUBjaW5kZXggbWRfY3JlYXRlX3Nob3J0X2p1bXAKLUBjaW5kZXggbWRfY3JlYXRlX2xvbmdfanVtcAotSWYgQGNvZGV7V09SS0lOR19ET1RfV09SRH0gaXMgZGVmaW5lZCwgR0FTIHdpbGwgbm90IGRvIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcKLShAcHhyZWZ7QnJva2VuIHdvcmRzfSkuICBPdGhlcndpc2UsIHlvdSBzaG91bGQgc2V0IEBjb2Rle21kX3Nob3J0X2p1bXBfc2l6ZX0gdG8KLXRoZSBzaXplIG9mIGEgc2hvcnQganVtcCAoYSBqdW1wIHRoYXQgaXMganVzdCBsb25nIGVub3VnaCB0byBqdW1wIGFyb3VuZCBhIGxvbmcKLWptcCkgYW5kIEBjb2Rle21kX2xvbmdfanVtcF9zaXplfSB0byB0aGUgc2l6ZSBvZiBhIGxvbmcganVtcCAoYSBqdW1wIHRoYXQgY2FuCi1nbyBhbnl3aGVyZSBpbiB0aGUgZnVuY3Rpb24pLCBZb3Ugc2hvdWxkIGRlZmluZSBAY29kZXttZF9jcmVhdGVfc2hvcnRfanVtcH0gdG8KLWNyZWF0ZSBhIHNob3J0IGp1bXAgYXJvdW5kIGEgbG9uZyBqdW1wLCBhbmQgZGVmaW5lIEBjb2Rle21kX2NyZWF0ZV9sb25nX2p1bXB9Ci10byBjcmVhdGUgYSBsb25nIGp1bXAuCi0KLUBpdGVtIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1AY2luZGV4IG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIHNpemUgb2YgYSBAY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0KLWZyYWcgYmVmb3JlIGFueSByZWxheGluZyBpcyBkb25lLiAgSXQgbWF5IGFsc28gY3JlYXRlIGFueSBuZWNlc3NhcnkKLXJlbG9jYXRpb25zLgotCi1AaXRlbSBtZF9yZWxheF9mcmFnCi1AY2luZGV4IG1kX3JlbGF4X2ZyYWcKLVRoaXMgbWFjcm8gbWF5IGJlIGRlZmluZWQgdG8gcmVsYXggYSBmcmFnLiAgR0FTIHdpbGwgY2FsbCB0aGlzIHdpdGggdGhlIGZyYWcKLWFuZCB0aGUgY2hhbmdlIGluIHNpemUgb2YgYWxsIHByZXZpb3VzIGZyYWdzOyBAY29kZXttZF9yZWxheF9mcmFnfSBzaG91bGQKLXJldHVybiB0aGUgY2hhbmdlIGluIHNpemUgb2YgdGhlIGZyYWcuICBAeHJlZntSZWxheGF0aW9ufS4KLQotQGl0ZW0gVENfR0VORVJJQ19SRUxBWF9UQUJMRQotQGNpbmRleCBUQ19HRU5FUklDX1JFTEFYX1RBQkxFCi1JZiB5b3UgZG8gbm90IGRlZmluZSBAY29kZXttZF9yZWxheF9mcmFnfSwgeW91IG1heSBkZWZpbmUKLUBjb2Rle1RDX0dFTkVSSUNfUkVMQVhfVEFCTEV9IGFzIGEgdGFibGUgb2YgQGNvZGV7cmVsYXhfdHlwZVN9IHN0cnVjdHVyZXMuICBUaGUKLW1hY2hpbmUgaW5kZXBlbmRlbnQgY29kZSBrbm93cyBob3cgdG8gdXNlIHN1Y2ggYSB0YWJsZSB0byByZWxheCBQQyByZWxhdGl2ZQotcmVmZXJlbmNlcy4gIFNlZSBAZmlsZXt0Yy1tNjhrLmN9IGZvciBhbiBleGFtcGxlLiAgQHhyZWZ7UmVsYXhhdGlvbn0uCi0KLUBpdGVtIG1kX3ByZXBhcmVfcmVsYXhfc2NhbgotQGNpbmRleCBtZF9wcmVwYXJlX3JlbGF4X3NjYW4KLUlmIGRlZmluZWQsIGl0IGlzIGEgQyBzdGF0ZW1lbnQgdGhhdCBpcyBpbnZva2VkIHByaW9yIHRvIHNjYW5uaW5nCi10aGUgcmVsYXggdGFibGUuCi0KLUBpdGVtIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLUBjaW5kZXggTElOS0VSX1JFTEFYSU5HX1NIUklOS1NfT05MWQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBhbmQgdGhlIGdsb2JhbCB2YXJpYWJsZSBAc2FtcHtsaW5rcmVsYXh9IGlzIHNldAotKGJlY2F1c2Ugb2YgYSBjb21tYW5kIGxpbmUgb3B0aW9uLCBvciB1bmNvbmRpdGlvbmFsbHkgaW4gQGNvZGV7bWRfYmVnaW59KSwgYQotQHNhbXB7LmFsaWdufSBkaXJlY3RpdmUgd2lsbCBjYXVzZSBleHRyYSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQuICBUaGUgbGlua2VyIGNhbgotdGhlbiBkaXNjYXJkIHRoaXMgc3BhY2Ugd2hlbiByZWxheGluZyB0aGUgc2VjdGlvbi4KLQotQGl0ZW0gbWRfY29udmVydF9mcmFnCi1AY2luZGV4IG1kX2NvbnZlcnRfZnJhZwotR0FTIHdpbGwgY2FsbCB0aGlzIGZvciBlYWNoIHJzX21hY2hpbmVfZGVwZW5kZW50IGZyYWdtZW50LgotVGhlIGluc3RydWN0aW9uIGlzIGNvbXBsZXRlZCB1c2luZyB0aGUgZGF0YSBmcm9tIHRoZSByZWxheGF0aW9uIHBhc3MuCi1JdCBtYXkgYWxzbyBjcmVhdGUgYW55IG5lY2Vzc2FyeSByZWxvY2F0aW9ucy4KLUB4cmVme1JlbGF4YXRpb259LgotCi1AaXRlbSBtZF9hcHBseV9maXgKLUBjaW5kZXggbWRfYXBwbHlfZml4Ci1HQVMgd2lsbCBjYWxsIHRoaXMgZm9yIGVhY2ggZml4dXAuICBJdCBzaG91bGQgc3RvcmUgdGhlIGNvcnJlY3QgdmFsdWUgaW4gdGhlCi1vYmplY3QgZmlsZS4gIEBjb2Rle2ZpeHVwX3NlZ21lbnR9IHBlcmZvcm1zIGEgZ2VuZXJpYyBvdmVyZmxvdyBjaGVjayBvbiB0aGUKLUBjb2Rle3ZhbHVlVCAqdmFsfSBhcmd1bWVudCBhZnRlciBAY29kZXttZF9hcHBseV9maXh9IHJldHVybnMuICBJZiB0aGUgb3ZlcmZsb3cKLWNoZWNrIGlzIHJlbGV2YW50IGZvciB0aGUgdGFyZ2V0IG1hY2hpbmUsIHRoZW4gQGNvZGV7bWRfYXBwbHlfZml4fSBzaG91bGQKLW1vZGlmeSBAY29kZXt2YWx1ZVQgKnZhbH0sIHR5cGljYWxseSB0byB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBvYmplY3QgZmlsZS4KLQotQGl0ZW0gVENfSEFORExFU19GWF9ET05FCi1AY2luZGV4IFRDX0hBTkRMRVNfRlhfRE9ORQotSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBpdCBtZWFucyB0aGF0IEBjb2Rle21kX2FwcGx5X2ZpeH0gY29ycmVjdGx5IHNldHMgdGhlCi1AY29kZXtmeF9kb25lfSBmaWVsZCBpbiB0aGUgZml4dXAuCi0KLUBpdGVtIHRjX2dlbl9yZWxvYwotQGNpbmRleCB0Y19nZW5fcmVsb2MKLUEgQGNvZGV7QkZEX0FTU0VNQkxFUn0gR0FTIHdpbGwgY2FsbCB0aGlzIHRvIGdlbmVyYXRlIGEgcmVsb2MuICBHQVMgd2lsbCBwYXNzCi10aGUgcmVzdWx0aW5nIHJlbG9jIHRvIEBjb2Rle2JmZF9pbnN0YWxsX3JlbG9jYXRpb259LiAgVGhpcyBjdXJyZW50bHkgd29ya3MKLXBvb3JseSwgYXMgQGNvZGV7YmZkX2luc3RhbGxfcmVsb2NhdGlvbn0gb2Z0ZW4gZG9lcyB0aGUgd3JvbmcgdGhpbmcsIGFuZAotaW5zdGFuY2VzIG9mIEBjb2Rle3RjX2dlbl9yZWxvY30gaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW1zLAotd2hpY2ggaW4gdHVybnMgbWFrZXMgaXQgZGlmZmljdWx0IHRvIGZpeCBAY29kZXtiZmRfaW5zdGFsbF9yZWxvY2F0aW9ufS4KLQotQGl0ZW0gUkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFCi1AY2luZGV4IFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBpdCBtZWFucyB0aGF0IEBjb2Rle3RjX2dlbl9yZWxvY30gbWF5IHJldHVybiBtdWx0aXBsZQotcmVsb2NhdGlvbiBlbnRyaWVzIGZvciBhIHNpbmdsZSBmaXh1cC4gIEluIHRoaXMgY2FzZSwgdGhlIHJldHVybiB2YWx1ZSBvZgotQGNvZGV7dGNfZ2VuX3JlbG9jfSBpcyBhIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgYXJyYXkuCi0KLUBpdGVtIE1BWF9SRUxPQ19FWFBBTlNJT04KLUBjaW5kZXggTUFYX1JFTE9DX0VYUEFOU0lPTgotWW91IG11c3QgZGVmaW5lIHRoaXMgaWYgQGNvZGV7UkVMT0NfRVhQQU5TSU9OX1BPU1NJQkxFfSBpcyBkZWZpbmVkOyBpdAotaW5kaWNhdGVzIHRoZSBsYXJnZXN0IG51bWJlciBvZiByZWxvY3Mgd2hpY2ggQGNvZGV7dGNfZ2VuX3JlbG9jfSBtYXkgcmV0dXJuIGZvcgotYSBzaW5nbGUgZml4dXAuCi0KLUBpdGVtIHRjX2ZpeF9hZGp1c3RhYmxlCi1AY2luZGV4IHRjX2ZpeF9hZGp1c3RhYmxlCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHdoZXRoZXIgYSBmaXh1cCBhZ2FpbnN0IGEgbG9jYWxseSBkZWZpbmVkCi1zeW1ib2wgc2hvdWxkIGJlIGFkanVzdGVkIHRvIGJlIGFnYWluc3QgdGhlIHNlY3Rpb24gc3ltYm9sLiAgSXQgc2hvdWxkIHJldHVybiBhCi1ub24temVybyB2YWx1ZSBpZiB0aGUgYWRqdXN0bWVudCBpcyBhY2NlcHRhYmxlLgotCi1AaXRlbSBNRF9QQ1JFTF9GUk9NX1NFQ1RJT04KLUBjaW5kZXggTURfUENSRUxfRlJPTV9TRUNUSU9OCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIGl0IHNob3VsZCByZXR1cm4gdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBhZGRyZXNzIG9mIGEKLVBDIHJlbGF0aXZlIGZpeHVwIGFuZCB0aGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgUEMgcmVsYXRpdmUgYWRqdXN0bWVudCBzaG91bGQKLWJlIG1hZGUuICBPbiBtYW55IHByb2Nlc3NvcnMsIHRoZSBiYXNlIG9mIGEgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gaXMgdGhlIG5leHQKLWluc3RydWN0aW9uLCBzbyB0aGlzIG1hY3JvIHdvdWxkIHJldHVybiB0aGUgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLgotCi1AaXRlbSBtZF9wY3JlbF9mcm9tCi1AY2luZGV4IG1kX3BjcmVsX2Zyb20KLVRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgQGNvZGV7TURfUENSRUxfRlJPTV9TRUNUSU9OfS4gIFRoZSBkaWZmZXJlbmNlIGlzCi10aGF0IEBjb2Rle21kX3BjcmVsX2Zyb219IGRvZXMgbm90IHRha2UgYSBzZWN0aW9uIGFyZ3VtZW50LgotCi1AaXRlbSB0Y19mcm9iX2xhYmVsCi1AY2luZGV4IHRjX2Zyb2JfbGFiZWwKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBlYWNoIHRpbWUgYSBsYWJlbCBpcyBkZWZpbmVkLgotCi1AaXRlbSBtZF9zZWN0aW9uX2FsaWduCi1AY2luZGV4IG1kX3NlY3Rpb25fYWxpZ24KLUdBUyB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbiBmb3IgZWFjaCBzZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LCB0bwotcGVybWl0IHRoZSBDUFUgYmFja2VuZCB0byBhZGp1c3QgdGhlIGFsaWdubWVudCBvZiBhIHNlY3Rpb24uCi0KLUBpdGVtIHRjX2Zyb2Jfc2VjdGlvbgotQGNpbmRleCB0Y19mcm9iX3NlY3Rpb24KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgYSBAY29kZXtCRkRfQVNTRU1CTEVSfSBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoCi1zZWN0aW9uIGF0IHRoZSBlbmQgb2YgdGhlIGFzc2VtYmx5LgotCi1AaXRlbSB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotQGNpbmRleCB0Y19mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdAotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSBzeW1ib2wgdmFsdWVzIGFyZQotcmVzb2x2ZWQsIGJ1dCBiZWZvcmUgdGhlIGZpeHVwcyBoYXZlIGJlZW4gY2hhbmdlZCBmcm9tIGxvY2FsIHN5bWJvbHMgdG8gc2VjdGlvbgotc3ltYm9scy4KLQotQGl0ZW0gdGNfZnJvYl9zeW1ib2wKLUBjaW5kZXggdGNfZnJvYl9zeW1ib2wKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBmb3IgZWFjaCBzeW1ib2wuICBZb3UgY2FuIGluZGljYXRlCi10aGF0IHRoZSBzeW1ib2wgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb2JqZWN0IGZpbGUgYnkgZGVmaW5pbmluZyB0aGlzCi1tYWNybyB0byBzZXQgaXRzIHNlY29uZCBhcmd1bWVudCB0byBhIG5vbi16ZXJvIHZhbHVlLgotCi1AaXRlbSB0Y19mcm9iX2ZpbGUKLUBjaW5kZXggdGNfZnJvYl9maWxlCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbgotY29tcGxldGVkLCBidXQgYmVmb3JlIHRoZSByZWxvY2F0aW9ucyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotCi1AaXRlbSB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHJlbG9jcyBoYXZlIGJlZW4KLWdlbmVyYXRlZC4KLQotQGl0ZW0gTElTVElOR19IRUFERVIKLUEgc3RyaW5nIHRvIHVzZSBvbiB0aGUgaGVhZGVyIGxpbmUgb2YgYSBsaXN0aW5nLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgc2ltcGx5Ci1AY29kZXsiR0FTIExJU1RJTkcifS4KLQotQGl0ZW0gTElTVElOR19XT1JEX1NJWkUKLVRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHV0IGludG8gYSB3b3JkIGluIGEgbGlzdGluZy4gIFRoaXMgYWZmZWN0cyB0aGUgd2F5IHRoZQotYnl0ZXMgYXJlIGNsdW1wZWQgdG9nZXRoZXIgaW4gdGhlIGxpc3RpbmcuICBGb3IgZXhhbXBsZSwgYSB2YWx1ZSBvZiAyIG1pZ2h0Ci1wcmludCBAc2FtcHsxMjM0IDU2Nzh9IHdoZXJlIGEgdmFsdWUgb2YgMSB3b3VsZCBwcmludCBAc2FtcHsxMiAzNCA1NiA3OH0uICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgNC4KLQotQGl0ZW0gTElTVElOR19MSFNfV0lEVEgKLVRoZSBudW1iZXIgb2Ygd29yZHMgb2YgZGF0YSB0byBwcmludCBvbiB0aGUgZmlyc3QgbGluZSBvZiBhIGxpc3RpbmcgZm9yIGEKLXBhcnRpY3VsYXIgc291cmNlIGxpbmUsIHdoZXJlIGVhY2ggd29yZCBpcyBAY29kZXtMSVNUSU5HX1dPUkRfU0laRX0gYnl0ZXMuICBUaGUKLWRlZmF1bHQgdmFsdWUgaXMgMS4KLQotQGl0ZW0gTElTVElOR19MSFNfV0lEVEhfU0VDT05ECi1MaWtlIEBjb2Rle0xJU1RJTkdfTEhTX1dJRFRIfSwgYnV0IGFwcGx5aW5nIHRvIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgbGluZQotb2YgdGhlIGRhdGEgcHJpbnRlZCBmb3IgYSBwYXJ0aWN1bGFyIHNvdXJjZSBsaW5lLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4KLQotQGl0ZW0gTElTVElOR19MSFNfQ09OVF9MSU5FUwotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbnRpbnVhdGlvbiBsaW5lcyB0byBwcmludCBpbiBhIGxpc3RpbmcgZm9yIGEgcGFydGljdWxhcgotc291cmNlIGxpbmUuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0LgotCi1AaXRlbSBMSVNUSU5HX1JIU19XSURUSAotVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcHJpbnQgZnJvbSBvbmUgbGluZSBvZiB0aGUgaW5wdXQgZmlsZS4gIFRoZQotZGVmYXVsdCB2YWx1ZSBpcyAxMDAuCi1AZW5kIHRhYmxlCi0KLUBub2RlIE9iamVjdCBmb3JtYXQgYmFja2VuZAotQHN1YnNlY3Rpb24gV3JpdGluZyBhbiBvYmplY3QgZm9ybWF0IGJhY2tlbmQKLUBjaW5kZXggb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1AY2luZGV4IEBmaWxle29iai1AdmFye2ZtdH19Ci0KLUFzIHdpdGggdGhlIENQVSBiYWNrZW5kLCB0aGUgb2JqZWN0IGZvcm1hdCBiYWNrZW5kIG11c3QgZGVmaW5lIGEgZmV3IHRoaW5ncywKLWFuZCBtYXkgZGVmaW5lIHNvbWUgb3RoZXIgdGhpbmdzLiAgVGhlIGludGVyZmFjZSB0byB0aGUgb2JqZWN0IGZvcm1hdCBiYWNrZW5kCi1pcyBnZW5lcmFsbHkgc2ltcGxlcjsgbW9zdCBvZiB0aGUgc3VwcG9ydCBmb3IgYW4gb2JqZWN0IGZpbGUgZm9ybWF0IGNvbnNpc3RzIG9mCi1kZWZpbmluZyBhIG51bWJlciBvZiBwc2V1ZG8tb3BzLgotCi1UaGUgb2JqZWN0IGZvcm1hdCBAZmlsZXsuaH0gZmlsZSBtdXN0IGluY2x1ZGUgQGZpbGV7dGFyZy1jcHUuaH0uCi0KLVRoaXMgc2VjdGlvbiB3aWxsIG9ubHkgZGVmaW5lIHRoZSBAY29kZXtCRkRfQVNTRU1CTEVSfSB2ZXJzaW9uIG9mIEdBUy4gIEl0IGlzCi1pbXBvc3NpYmxlIHRvIHN1cHBvcnQgYSBuZXcgb2JqZWN0IGZpbGUgZm9ybWF0IHVzaW5nIGFueSBvdGhlciB2ZXJzaW9uIGFueWhvdywKLWFzIHRoZSBvcmlnaW5hbCBHQVMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIGEub3V0LCBhbmQgdGhlIEBjb2Rle01BTllfU0VHTUVOVFN9Ci1HQVMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIENPRkYuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gT0JKX0B2YXJ7Zm9ybWF0fQotQGNpbmRleCBPQkpfQHZhcntmb3JtYXR9Ci1CeSBjb252ZW50aW9uLCB5b3Ugc2hvdWxkIGRlZmluZSB0aGlzIG1hY3JvIGluIHRoZSBAZmlsZXsuaH0gZmlsZS4gIEZvcgotZXhhbXBsZSwgQGZpbGV7b2JqLWVsZi5ofSBkZWZpbmVzIEBjb2Rle09CSl9FTEZ9LiAgWW91IG1pZ2h0IGhhdmUgdG8gdXNlIHRoaXMKLWlmIGl0IGlzIG5lY2Vzc2FyeSB0byBhZGQgb2JqZWN0IGZpbGUgZm9ybWF0IHNwZWNpZmljIGNvZGUgdG8gdGhlIENQVSBmaWxlLgotCi1AaXRlbSBvYmpfYmVnaW4KLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgY2FsbCBpdCBhdCB0aGUgc3RhcnQgb2YgdGhlIGFzc2VtYmx5LCBhZnRlcgotdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaGF2ZSBiZWVuIHBhcnNlZCBhbmQgYWxsIHRoZSBtYWNoaW5lIGluZGVwZW5kZW50Ci1pbml0aWFsaXphdGlvbnMgaGF2ZSBiZWVuIGNvbXBsZXRlZC4KLQotQGl0ZW0gb2JqX2FwcF9maWxlCi1AY2luZGV4IG9ial9hcHBfZmlsZQotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBpbnZva2UgaXQgd2hlbiBpdCBzZWVzIGEgQGNvZGV7LmZpbGV9Ci1wc2V1ZG8tb3Agb3IgYSBAc2FtcHsjfSBsaW5lIGFzIHVzZWQgYnkgdGhlIEMgcHJlcHJvY2Vzc29yLgotCi1AaXRlbSBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotQGNpbmRleCBPQkpfQ09QWV9TWU1CT0xfQVRUUklCVVRFUwotWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyB0byBjb3B5IG9iamVjdCBmb3JtYXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gZnJvbQotb25lIHN5bWJvbCB0byBhbm90aGVyLiAgR0FTIHdpbGwgY2FsbCBpdCB3aGVuIG9uZSBzeW1ib2wgaXMgZXF1YXRlZCB0bwotYW5vdGhlci4KLQotQGl0ZW0gb2JqX2ZpeF9hZGp1c3RhYmxlCi1AY2luZGV4IG9ial9maXhfYWRqdXN0YWJsZQotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgZml4dXAgYWdhaW5zdCBhIGxvY2FsbHkgZGVmaW5lZAotc3ltYm9sIHNob3VsZCBiZSBhZGp1c3RlZCB0byBiZSBhZ2FpbnN0IHRoZSBzZWN0aW9uIHN5bWJvbC4gIEl0IHNob3VsZCByZXR1cm4gYQotbm9uLXplcm8gdmFsdWUgaWYgdGhlIGFkanVzdG1lbnQgaXMgYWNjZXB0YWJsZS4KLQotQGl0ZW0gb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jCi1AY2luZGV4IG9ial9zZWNfc3ltX29rX2Zvcl9yZWxvYwotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIE9LIHRvIHVzZSBhIHNlY3Rpb24gc3ltYm9sIGluCi1hIHJlbG9jYXRlaW9uIGVudHJ5LiAgSWYgaXQgaXMgbm90LCBHQVMgd2lsbCBkZWZpbmUgYSBuZXcgc3ltYm9sIGF0IHRoZSBzdGFydAotb2YgYSBzZWN0aW9uLgotCi1AaXRlbSBFTUlUX1NFQ1RJT05fU1lNQk9MUwotQGNpbmRleCBFTUlUX1NFQ1RJT05fU1lNQk9MUwotWW91IHNob3VsZCBkZWZpbmUgdGhpcyBtYWNybyB3aXRoIGEgemVybyB2YWx1ZSBpZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZQotc2VjdGlvbiBzeW1ib2xzIGluIHRoZSBvdXRwdXQgc3ltYm9sIHRhYmxlLiAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgbWFjcm8KLWlzIG9uZS4KLQotQGl0ZW0gb2JqX2FkanVzdF9zeW10YWIKLUBjaW5kZXggb2JqX2FkanVzdF9zeW10YWIKLUlmIHlvdSBkZWZpbmUgdGhpcyBtYWNybywgR0FTIHdpbGwgaW52b2tlIGl0IGp1c3QgYmVmb3JlIHNldHRpbmcgdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIG91dHB1dCBCRkQuICBGb3IgZXhhbXBsZSwgdGhlIENPRkYgc3VwcG9ydCB1c2VzIHRoaXMgbWFjcm8gdG8KLWdlbmVyYXRlIGEgQGNvZGV7LmZpbGV9IHN5bWJvbCBpZiBub25lIHdhcyBnZW5lcmF0ZWQgcHJldmlvdXNseS4KLQotQGl0ZW0gU0VQQVJBVEVfU1RBQl9TRUNUSU9OUwotQGNpbmRleCBTRVBBUkFURV9TVEFCX1NFQ1RJT05TCi1Zb3UgbWF5IGRlZmluZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoYXQgc3RhYnMgc2hvdWxkIGJlIHBsYWNlZCBpbiBzZXBhcmF0ZQotc2VjdGlvbnMsIGFzIGluIEVMRi4KLQotQGl0ZW0gSU5JVF9TVEFCX1NFQ1RJT04KLUBjaW5kZXggSU5JVF9TVEFCX1NFQ1RJT04KLVlvdSBtYXkgZGVmaW5lIHRoaXMgbWFjcm8gdG8gaW5pdGlhbGl6ZSB0aGUgc3RhYnMgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBpdGVtIE9CSl9QUk9DRVNTX1NUQUIKLUBjaW5kZXggT0JKX1BST0NFU1NfU1RBQgotWW91IG1heSBkZWZpbmUgdGhpcyBtYWNybyB0byBkbyBzcGVjaWZpYyBwcm9jZXNzaW5nIG9uIGEgc3RhYnMgZW50cnkuCi0KLUBpdGVtIG9ial9mcm9iX3NlY3Rpb24KLUBjaW5kZXggb2JqX2Zyb2Jfc2VjdGlvbgotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGZvciBlYWNoIHNlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUKLWFzc2VtYmx5LgotCi1AaXRlbSBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLUBjaW5kZXggb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0Ci1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB2YWx1ZXMgYXJlCi1yZXNvbHZlZCwgYnV0IGJlZm9yZSB0aGUgZml4dXBzIGhhdmUgYmVlbiBjaGFuZ2VkIGZyb20gbG9jYWwgc3ltYm9scyB0byBzZWN0aW9uCi1zeW1ib2xzLgotCi1AaXRlbSBvYmpfZnJvYl9zeW1ib2wKLUBjaW5kZXggb2JqX2Zyb2Jfc3ltYm9sCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgZm9yIGVhY2ggc3ltYm9sLiAgWW91IGNhbiBpbmRpY2F0ZQotdGhhdCB0aGUgc3ltYm9sIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9iamVjdCBmaWxlIGJ5IGRlZmluaW5pbmcgdGhpcwotbWFjcm8gdG8gc2V0IGl0cyBzZWNvbmQgYXJndW1lbnQgdG8gYSBub24temVybyB2YWx1ZS4KLQotQGl0ZW0gb2JqX2Zyb2JfZmlsZQotQGNpbmRleCBvYmpfZnJvYl9maWxlCi1JZiB5b3UgZGVmaW5lIHRoaXMgbWFjcm8sIEdBUyB3aWxsIGNhbGwgaXQgYWZ0ZXIgdGhlIHN5bWJvbCB0YWJsZSBoYXMgYmVlbgotY29tcGxldGVkLCBidXQgYmVmb3JlIHRoZSByZWxvY2F0aW9ucyBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotCi1AaXRlbSBvYmpfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotSWYgeW91IGRlZmluZSB0aGlzIG1hY3JvLCBHQVMgd2lsbCBjYWxsIGl0IGFmdGVyIHRoZSByZWxvY3MgaGF2ZSBiZWVuCi1nZW5lcmF0ZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEVtdWxhdGlvbnMKLUBzdWJzZWN0aW9uIFdyaXRpbmcgZW11bGF0aW9uIGZpbGVzCi0KLU5vcm1hbGx5IHlvdSBkbyBub3QgaGF2ZSB0byB3cml0ZSBhbiBlbXVsYXRpb24gZmlsZS4gIFlvdSBjYW4ganVzdCB1c2UKLUBmaWxle3RlLWdlbmVyaWMuaH0uCi0KLUlmIHlvdSBkbyB3cml0ZSB5b3VyIG93biBlbXVsYXRpb24gZmlsZSwgaXQgbXVzdCBpbmNsdWRlIEBmaWxle29iai1mb3JtYXQuaH0uCi0KLUFuIGVtdWxhdGlvbiBmaWxlIHdpbGwgb2Z0ZW4gZGVmaW5lIEBjb2Rle1RFX0B2YXJ7RU19fTsgdGhpcyBtYXkgdGhlbiBiZSB1c2VkCi1pbiBvdGhlciBmaWxlcyB0byBjaGFuZ2UgdGhlIG91dHB1dC4KLQotQG5vZGUgUmVsYXhhdGlvbgotQHNlY3Rpb24gUmVsYXhhdGlvbgotQGNpbmRleCByZWxheGF0aW9uCi0KLUBkZm57UmVsYXhhdGlvbn0gaXMgYSBnZW5lcmljIHRlcm0gdXNlZCB3aGVuIHRoZSBzaXplIG9mIHNvbWUgaW5zdHJ1Y3Rpb24gb3IKLWRhdGEgZGVwZW5kcyB1cG9uIHRoZSB2YWx1ZSBvZiBzb21lIHN5bWJvbCBvciBvdGhlciBkYXRhLgotCi1HQVMga25vd3MgdG8gcmVsYXggYSBwYXJ0aWN1bGFyIHR5cGUgb2YgUEMgcmVsYXRpdmUgcmVsb2NhdGlvbiB1c2luZyBhIHRhYmxlLgotWW91IGNhbiBhbHNvIGRlZmluZSBhcmJpdHJhcmlseSBjb21wbGV4IGZvcm1zIG9mIHJlbGF4YXRpb24geW91cnNlbGYuCi0KLUBtZW51Ci0qIFJlbGF4aW5nIHdpdGggYSB0YWJsZTo6ICAgICAgIFJlbGF4aW5nIHdpdGggYSB0YWJsZQotKiBHZW5lcmFsIHJlbGF4aW5nOjogICAgICAgICAgICBHZW5lcmFsIHJlbGF4aW5nCi1AZW5kIG1lbnUKLQotQG5vZGUgUmVsYXhpbmcgd2l0aCBhIHRhYmxlCi1Ac3Vic2VjdGlvbiBSZWxheGluZyB3aXRoIGEgdGFibGUKLQotSWYgeW91IGRvIG5vdCBkZWZpbmUgQGNvZGV7bWRfcmVsYXhfZnJhZ30sIGFuZCB5b3UgZG8gZGVmaW5lCi1AY29kZXtUQ19HRU5FUklDX1JFTEFYX1RBQkxFfSwgR0FTIHdpbGwgcmVsYXggQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWdzCi1iYXNlZCBvbiB0aGUgZnJhZyBzdWJ0eXBlIGFuZCB0aGUgZGlzcGxhY2VtZW50IHRvIHNvbWUgc3BlY2lmaWVkIHRhcmdldAotYWRkcmVzcy4gIFRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgc2V2ZXJhbCBtYWNoaW5lcyBoYXZlIGRpZmZlcmVudCBhZGRyZXNzaW5nCi1tb2RlcyBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIHNwZWNpZnkgZGlmZmVyZW50IHJhbmdlcyBvZiB2YWx1ZXMsIHdpdGgKLXN1Y2Nlc3NpdmUgbW9kZXMgYWJsZSB0byBhY2Nlc3Mgd2lkZXIgcmFuZ2VzLCBpbmNsdWRpbmcgdGhlIGVudGlyZXR5IG9mIHRoZQotcHJldmlvdXMgcmFuZ2UuICBTbWFsbGVyIHJhbmdlcyBhcmUgYXNzdW1lZCB0byBiZSBtb3JlIGRlc2lyYWJsZSAocGVyaGFwcyB0aGUKLWluc3RydWN0aW9uIHJlcXVpcmVzIG9uZSB3b3JkIGluc3RlYWQgb2YgdHdvIG9yIHRocmVlKTsgaWYgdGhpcyBpcyBub3QgdGhlCi1jYXNlLCBkb24ndCBkZXNjcmliZSB0aGUgc21hbGxlci1yYW5nZSwgaW5mZXJpb3IgbW9kZS4KLQotVGhlIEBjb2Rle2ZyX3N1YnR5cGV9IGZpZWxkIG9mIGEgZnJhZyBpcyBhbiBpbmRleCBpbnRvIGEgQ1BVLXNwZWNpZmljCi1yZWxheGF0aW9uIHRhYmxlLiAgVGhhdCB0YWJsZSBlbnRyeSBpbmRpY2F0ZXMgdGhlIHJhbmdlIG9mIHZhbHVlcyB0aGF0IGNhbiBiZQotc3RvcmVkLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSBmcmFnIHRvCi1hY2NvbW9kYXRlIHRoZSBhZGRyZXNzaW5nIG1vZGUsIGFuZCB0aGUgaW5kZXggb2YgdGhlIG5leHQgZW50cnkgdG8gZXhhbWluZSBpZgotdGhlIHZhbHVlIHRvIGJlIHN0b3JlZCBpcyBvdXRzaWRlIHRoZSByYW5nZSBhY2Nlc3NpYmxlIGJ5IHRoZSBjdXJyZW50Ci1hZGRyZXNzaW5nIG1vZGUuICBUaGUgQGNvZGV7ZnJfc3ltYm9sfSBmaWVsZCBvZiB0aGUgZnJhZyBpbmRpY2F0ZXMgd2hhdCBzeW1ib2wKLWlzIHRvIGJlIGFjY2Vzc2VkOyB0aGUgQGNvZGV7ZnJfb2Zmc2V0fSBmaWVsZCBpcyBhZGRlZCBpbi4KLQotSWYgdGhlIEBjb2Rle1RDX1BDUkVMX0FESlVTVH0gbWFjcm8gaXMgZGVmaW5lZCwgd2hpY2ggY3VycmVudGx5IHNob3VsZCBvbmx5IGhhcHBlbgotZm9yIHRoZSBOUzMyayBmYW1pbHksIHRoZSBAY29kZXtUQ19QQ1JFTF9BREpVU1R9IG1hY3JvIGlzIGNhbGxlZCBvbiB0aGUgZnJhZyB0bwotY29tcHV0ZSBhbiBhZGp1c3RtZW50IHRvIGJlIG1hZGUgdG8gdGhlIGRpc3BsYWNlbWVudC4KLQotVGhlIHZhbHVlIGZpdHRlZCBieSB0aGUgcmVsYXhhdGlvbiBjb2RlIGlzIGFsd2F5cyBhc3N1bWVkIHRvIGJlIGEgZGlzcGxhY2VtZW50Ci1mcm9tIHRoZSBjdXJyZW50IGZyYWcuICAoTW9yZSBzcGVjaWZpY2FsbHksIGZyb20gQGNvZGV7ZnJfZml4fSBieXRlcyBpbnRvIHRoZQotZnJhZy4pCi1AaWdub3JlCi1UaGlzIHNlZW1zIGtpbmRhIHNpbGx5LiAgV2hhdCBhYm91dCBmaXR0aW5nIHNtYWxsIGFic29sdXRlIHZhbHVlcz8gIEkgc3VwcG9zZQotQGNvZGV7bWRfYXNzZW1ibGV9IGlzIHN1cHBvc2VkIHRvIHRha2UgY2FyZSBvZiB0aGF0LCBidXQgaWYgdGhlIG9wZXJhbmQgaXMgYQotZGlmZmVyZW5jZSBiZXR3ZWVuIHN5bWJvbHMsIGl0IG1pZ2h0IG5vdCBiZSBhYmxlIHRvLCBpZiB0aGUgZGlmZmVyZW5jZSB3YXMgbm90Ci1jb21wdXRhYmxlIHlldC4KLUBlbmQgaWdub3JlCi0KLVRoZSBlbmQgb2YgdGhlIHJlbGF4YXRpb24gc2VxdWVuY2UgaXMgaW5kaWNhdGVkIGJ5IGEgYGBuZXh0JycgdmFsdWUgb2YgMC4gIFRoaXMKLW1lYW5zIHRoYXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSB0YWJsZSBjYW4ndCBiZSB1c2VkLgotCi1Gb3Igc29tZSBjb25maWd1cmF0aW9ucywgdGhlIGxpbmtlciBjYW4gZG8gcmVsYXhpbmcgd2l0aGluIGEgc2VjdGlvbiBvZiBhbgotb2JqZWN0IGZpbGUuICBJZiBjYWxsIGluc3RydWN0aW9ucyBvZiB2YXJpb3VzIHNpemVzIGV4aXN0LCB0aGUgbGlua2VyIGNhbgotZGV0ZXJtaW5lIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluIGVhY2ggaW5zdGFuY2UsIHdoZW4gYSBzeW1ib2wncyB2YWx1ZSBpcwotcmVzb2x2ZWQuICBJbiBvcmRlciBmb3IgdGhlIGxpbmtlciB0byBhdm9pZCB3YXN0aW5nIHNwYWNlIGFuZCBoYXZpbmcgdG8gaW5zZXJ0Ci1uby1vcCBpbnN0cnVjdGlvbnMsIGl0IG11c3QgYmUgYWJsZSB0byBleHBhbmQgb3Igc2hyaW5rIHRoZSBzZWN0aW9uIGNvbnRlbnRzCi13aGlsZSBzdGlsbCBwcmVzZXJ2aW5nIGludHJhLXNlY3Rpb24gcmVmZXJlbmNlcyBhbmQgbWVldGluZyBhbGlnbm1lbnQKLXJlcXVpcmVtZW50cy4KLQotRm9yIHRoZSBpOTYwIHVzaW5nIGIub3V0IGZvcm1hdCwgbm8gZXhwYW5zaW9uIGlzIGRvbmU7IGluc3RlYWQsIGVhY2gKLUBzYW1wey5hbGlnbn0gZGlyZWN0aXZlIGNhdXNlcyBleHRyYSBzcGFjZSB0byBiZSBhbGxvY2F0ZWQsIGVub3VnaCB0aGF0IHdoZW4KLXRoZSBsaW5rZXIgaXMgcmVsYXhpbmcgYSBzZWN0aW9uIGFuZCByZW1vdmluZyB1bm5lZWRlZCBzcGFjZSwgaXQgY2FuIGRpc2NhcmQKLXNvbWUgb3IgYWxsIG9mIHRoaXMgZXh0cmEgcGFkZGluZyBhbmQgY2F1c2UgdGhlIGZvbGxvd2luZyBkYXRhIHRvIGJlIGNvcnJlY3RseQotYWxpZ25lZC4KLQotRm9yIHRoZSBIOC8zMDAsIEkgdGhpbmsgdGhlIGxpbmtlciBleHBhbmRzIGNhbGxzIHRoYXQgY2FuJ3QgcmVhY2gsIGFuZCBkb2Vzbid0Ci13b3JyeSBhYm91dCBhbGlnbm1lbnQgaXNzdWVzOyB0aGUgY3B1IHByb2JhYmx5IG5ldmVyIG5lZWRzIGFueSBzaWduaWZpY2FudAotYWxpZ25tZW50IGJleW9uZCB0aGUgaW5zdHJ1Y3Rpb24gc2l6ZS4KLQotVGhlIHJlbGF4YXRpb24gdGFibGUgdHlwZSBjb250YWlucyB0aGVzZSBmaWVsZHM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gbG9uZyBybHhfZm9yd2FyZAotRm9yd2FyZCByZWFjaCwgbXVzdCBiZSBub24tbmVnYXRpdmUuCi1AaXRlbSBsb25nIHJseF9iYWNrd2FyZAotQmFja3dhcmQgcmVhY2gsIG11c3QgYmUgemVybyBvciBuZWdhdGl2ZS4KLUBpdGVtIHJseF9sZW5ndGgKLUxlbmd0aCBpbiBieXRlcyBvZiB0aGlzIGFkZHJlc3NpbmcgbW9kZS4KLUBpdGVtIHJseF9tb3JlCi1JbmRleCBvZiB0aGUgbmV4dC1sb25nZXIgcmVsYXggc3RhdGUsIG9yIHplcm8gaWYgdGhlcmUgaXMgbm8gbmV4dCByZWxheCBzdGF0ZS4KLUBlbmQgdGFibGUKLQotVGhlIHJlbGF4YXRpb24gaXMgZG9uZSBpbiBAY29kZXtyZWxheF9zZWdtZW50fSBpbiBAZmlsZXt3cml0ZS5jfS4gIFRoZQotZGlmZmVyZW5jZSBpbiB0aGUgbGVuZ3RoIGZpZWxkcyBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBtb2RlIGFuZCB0aGUgb25lIGZpbmFsbHkKLWNob3NlbiBieSB0aGUgcmVsYXhpbmcgY29kZSBpcyB0YWtlbiBhcyB0aGUgc2l6ZSBieSB3aGljaCB0aGUgY3VycmVudCBmcmFnIHdpbGwKLWJlIGluY3JlYXNlZCBpbiBzaXplLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBpbml0aWFsIHJlbGF4aW5nIG1vZGUgaGFzIGEgbGVuZ3RoCi1vZiAyIGJ5dGVzLCBhbmQgYmVjYXVzZSBvZiB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxhY2VtZW50LCBpdCBnZXRzIHVwZ3JhZGVkIHRvIGEKLW1vZGUgd2l0aCBhIHNpemUgb2YgNiBieXRlcywgaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFnIHdpbGwgZ3JvdyBieSA0IGJ5dGVzLgotKFRoZSBpbml0aWFsIHR3byBieXRlcyBzaG91bGQgaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIGZpeGVkIHBvcnRpb24gb2YgdGhlIGZyYWcsCi1zaW5jZSBpdCBpcyBhbHJlYWR5IGtub3duIHRoYXQgdGhleSB3aWxsIGJlIG91dHB1dC4pICBUaGlzIGdyb3d0aCBtdXN0IGJlCi1lZmZlY3RlZCBieSBAY29kZXttZF9jb252ZXJ0X2ZyYWd9OyBpdCBzaG91bGQgaW5jcmVhc2UgdGhlIEBjb2Rle2ZyX2ZpeH0gZmllbGQKLWJ5IHRoZSBhcHByb3ByaWF0ZSBzaXplLCBhbmQgZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgYnl0ZXMgb2YgdGhlIGZyYWcuCi0oRW5vdWdoIHNwYWNlIGZvciB0aGUgbWF4aW11bSBncm93dGggc2hvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQgaW4gdGhlIGNhbGwgdG8KLWZyYWdfdmFyIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuKQotCi1JZiByZWxvY2F0aW9uIHJlY29yZHMgYXJlIG5lZWRlZCwgdGhleSBzaG91bGQgYmUgZW1pdHRlZCBieQotQGNvZGV7bWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXh9LiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgZXhhbWluZSB0aGUgdGFyZ2V0Ci1zeW1ib2wgb2YgdGhlIHN1cHBsaWVkIGZyYWcgYW5kIGNvcnJlY3QgdGhlIEBjb2Rle2ZyX3N1YnR5cGV9IG9mIHRoZSBmcmFnIGlmCi1uZWVkZWQuICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBpZiB0aGUgc3ltYm9sIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZCwKLWl0IHdpbGwgbm90IGJlY29tZSBkZWZpbmVkIGxhdGVyOyBob3dldmVyLCBpdHMgdmFsdWUgbWF5IHN0aWxsIGNoYW5nZSBpZiB0aGUKLXNlY3Rpb24gaXQgaXMgaW4gZ2V0cyByZWxheGVkLgotCi1Vc3VhbGx5LCBpZiB0aGUgc3ltYm9sIGlzIGluIHRoZSBzYW1lIHNlY3Rpb24gYXMgdGhlIGZyYWcgKGdpdmVuIGJ5IHRoZQotQHZhcntzZWN9IGFyZ3VtZW50KSwgdGhlIG5hcnJvd2VzdCBsaWtlbHkgcmVsYXhhdGlvbiBtb2RlIGlzIHN0b3JlZCBpbgotQGNvZGV7ZnJfc3VidHlwZX0sIGFuZCB0aGF0J3MgdGhhdC4KLQotSWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQsIG9yIGluIGEgZGlmZmVyZW50IHNlY3Rpb24gKGFuZCB0aGVyZWZvcmUgbW92ZWFibGUKLXRvIGFuIGFyYml0cmFyaWx5IGxhcmdlIGRpc3RhbmNlKSwgdGhlIGxhcmdlc3QgYXZhaWxhYmxlIHJlbGF4YXRpb24gbW9kZSBpcwotc3BlY2lmaWVkLCBAY29kZXtmaXhfbmV3fSBpcyBjYWxsZWQgdG8gcHJvZHVjZSB0aGUgcmVsb2NhdGlvbiByZWNvcmQsCi1AY29kZXtmcl9maXh9IGlzIGluY3JlYXNlZCB0byBpbmNsdWRlIHRoZSByZWxvY2F0ZWQgZmllbGQgKHJlbWVtYmVyLCB0aGlzCi1zdG9yYWdlIHdhcyBhbGxvY2F0ZWQgd2hlbiBAY29kZXtmcmFnX3Zhcn0gd2FzIGNhbGxlZCksIGFuZCBAY29kZXtmcmFnX3dhbmV9IGlzCi1jYWxsZWQgdG8gY29udmVydCB0aGUgZnJhZyB0byBhbiBAY29kZXtyc19maWxsfSBmcmFnIHdpdGggbm8gdmFyaWFudCBwYXJ0LgotU29tZXRpbWVzIGNoYW5naW5nIGFkZHJlc3NpbmcgbW9kZXMgbWF5IGFsc28gcmVxdWlyZSByZXdyaXRpbmcgdGhlIGluc3RydWN0aW9uLgotSXQgY2FuIGJlIGFjY2Vzc2VkIHZpYSBAY29kZXtmcl9vcGNvZGV9IG9yIEBjb2Rle2ZyX2ZpeH0uCi0KLVNvbWV0aW1lcyBAY29kZXtmcl92YXJ9IGlzIGluY3JlYXNlZCBpbnN0ZWFkLCBhbmQgQGNvZGV7ZnJhZ193YW5lfSBpcyBub3QKLWNhbGxlZC4gIEknbSBub3Qgc3VyZSwgYnV0IEkgdGhpbmsgdGhpcyBpcyB0byBrZWVwIEBjb2Rle2ZyX2ZpeH0gcmVmZXJyaW5nIHRvCi1hbiBlYXJsaWVyIGJ5dGUsIGFuZCBAY29kZXtmcl9zdWJ0eXBlfSBzZXQgdG8gQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IHNvCi10aGF0IEBjb2Rle21kX2NvbnZlcnRfZnJhZ30gd2lsbCBnZXQgY2FsbGVkLgotCi1Abm9kZSBHZW5lcmFsIHJlbGF4aW5nCi1Ac3Vic2VjdGlvbiBHZW5lcmFsIHJlbGF4aW5nCi0KLUlmIHVzaW5nIGEgc2ltcGxlIHRhYmxlIGlzIG5vdCBzdWl0YWJsZSwgeW91IG1heSBpbXBsZW1lbnQgYXJiaXRyYXJpbHkgY29tcGxleAotcmVsYXhhdGlvbiBzZW1hbnRpY3MgeW91cnNlbGYuICBGb3IgZXhhbXBsZSwgdGhlIE1JUFMgYmFja2VuZCB1c2VzIHRoaXMgdG8gZW1pdAotZGlmZmVyZW50IGluc3RydWN0aW9uIHNlcXVlbmNlcyBkZXBlbmRpbmcgdXBvbiB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGJlaW5nCi1hY2Nlc3NlZC4KLQotV2hlbiB5b3UgYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBtYXkgbmVlZCByZWxheGF0aW9uLCB5b3Ugc2hvdWxkIGFsbG9jYXRlCi1hIGZyYWcgdXNpbmcgQGNvZGV7ZnJhZ192YXJ9IG9yIEBjb2Rle2ZyYWdfdmFyaWFudH0gd2l0aCBhIHR5cGUgb2YKLUBjb2Rle3JzX21hY2hpbmVfZGVwZW5kZW50fS4gIFlvdSBzaG91bGQgc3RvcmUgc29tZSBzb3J0IG9mIGluZm9ybWF0aW9uIGluIHRoZQotQGNvZGV7ZnJfc3VidHlwZX0gZmllbGQgc28gdGhhdCB5b3UgY2FuIGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoZSBmcmFnCi1sYXRlci4KLQotV2hlbiBHQVMgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLCBpdCB3aWxsIGxvb2sgdGhyb3VnaCB0aGUgZnJhZ3MgYW5kCi13b3JrIG91dCB0aGVpciBmaW5hbCBzaXplcy4KLQotR0FTIHdpbGwgZmlyc3QgY2FsbCBAY29kZXttZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheH0gb24gZWFjaAotQGNvZGV7cnNfbWFjaGluZV9kZXBlbmRlbnR9IGZyYWcuICBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGFuIGVzdGltYXRlZCBzaXplCi1mb3IgdGhlIGZyYWcuCi0KLUdBUyB3aWxsIHRoZW4gbG9vcCBvdmVyIHRoZSBmcmFncywgY2FsbGluZyBAY29kZXttZF9yZWxheF9mcmFnfSBvbiBlYWNoCi1AY29kZXtyc19tYWNoaW5lX2RlcGVuZGVudH0gZnJhZy4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgY2hhbmdlIGluCi1zaXplIG9mIHRoZSBmcmFnLiAgR0FTIHdpbGwga2VlcCBsb29waW5nIG92ZXIgdGhlIGZyYWdzIHVudGlsIG5vbmUgb2YgdGhlIGZyYWdzCi1jaGFuZ2VzIHNpemUuCi0KLUBub2RlIEJyb2tlbiB3b3JkcwotQHNlY3Rpb24gQnJva2VuIHdvcmRzCi1AY2luZGV4IGludGVybmFscywgYnJva2VuIHdvcmRzCi1AY2luZGV4IGJyb2tlbiB3b3JkcwotCi1Tb21lIGNvbXBpbGVycywgaW5jbHVkaW5nIEdDQywgd2lsbCBzb21ldGltZXMgZW1pdCBzd2l0Y2ggdGFibGVzIHNwZWNpZnlpbmcKLTE2LWJpdCBAY29kZXsud29yZH0gZGlzcGxhY2VtZW50cyB0byBicmFuY2ggdGFyZ2V0cywgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMKLXRoYXQgbG9hZCBlbnRyaWVzIGZyb20gdGhhdCB0YWJsZSB0byBjb21wdXRlIHRoZSB0YXJnZXQgYWRkcmVzcy4gIElmIHRoaXMgaXMKLWRvbmUgb24gYSAzMi1iaXQgbWFjaGluZSwgdGhlcmUgaXMgYSBjaGFuY2UgKGF0IGxlYXN0IHdpdGggcmVhbGx5IGxhcmdlCi1mdW5jdGlvbnMpIHRoYXQgdGhlIGRpc3BsYWNlbWVudCB3aWxsIG5vdCBmaXQgaW4gMTYgYml0cy4gIFRoZSBhc3NlbWJsZXIKLWhhbmRsZXMgdGhpcyB1c2luZyBhIGNvbmNlcHQgY2FsbGVkIEBkZm57YnJva2VuIHdvcmRzfS4gIFRoaXMgaWRlYSBpcyB3ZWxsCi1uYW1lZCwgc2luY2UgdGhlcmUgaXMgYW4gaW1wbGllZCBwcm9taXNlIHRoYXQgdGhlIDE2LWJpdCBmaWVsZCB3aWxsIGluIGZhY3QKLWhvbGQgdGhlIHNwZWNpZmllZCBkaXNwbGFjZW1lbnQuCi0KLUlmIGJyb2tlbiB3b3JkIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCwgYW5kIGEgc2l0dWF0aW9uIGxpa2UgdGhpcyBpcyBlbmNvdW50ZXJlZCwKLXRoZSBhc3NlbWJsZXIgd2lsbCBpbnNlcnQgYSBqdW1wIGluc3RydWN0aW9uIGludG8gdGhlIGluc3RydWN0aW9uIHN0cmVhbSwgY2xvc2UKLWVub3VnaCB0byBiZSByZWFjaGVkIHdpdGggdGhlIDE2LWJpdCBkaXNwbGFjZW1lbnQuICBUaGlzIGp1bXAgaW5zdHJ1Y3Rpb24gd2lsbAotdHJhbnNmZXIgdG8gdGhlIHJlYWwgZGVzaXJlZCB0YXJnZXQgYWRkcmVzcy4gIFRodXMsIGFzIGxvbmcgYXMgdGhlIEBjb2Rley53b3JkfQotdmFsdWUgcmVhbGx5IGlzIHVzZWQgYXMgYSBkaXNwbGFjZW1lbnQgdG8gY29tcHV0ZSBhbiBhZGRyZXNzIHRvIGp1bXAgdG8sIHRoZQotbmV0IGVmZmVjdCB3aWxsIGJlIGNvcnJlY3QgKG1pbnVzIGEgdmVyeSBzbWFsbCBlZmZpY2llbmN5IGNvc3QpLiAgSWYKLUBjb2Rley53b3JkfSBkaXJlY3RpdmVzIHdpdGggbGFiZWwgZGlmZmVyZW5jZXMgZm9yIHZhbHVlcyBhcmUgdXNlZCBmb3Igb3RoZXIKLXB1cnBvc2VzLCBob3dldmVyLCB0aGluZ3MgbWF5IG5vdCB3b3JrIHByb3Blcmx5LiAgRm9yIHRhcmdldHMgd2hpY2ggdXNlIGJyb2tlbgotd29yZHMsIHRoZSBAc2FtcHstS30gb3B0aW9uIHdpbGwgd2FybiB3aGVuIGEgYnJva2VuIHdvcmQgaXMgZGlzY292ZXJlZC4KLQotVGhlIGJyb2tlbiB3b3JkIGNvZGUgaXMgdHVybmVkIG9mZiBieSB0aGUgQGNvZGV7V09SS0lOR19ET1RfV09SRH0gbWFjcm8uICBJdAotaXNuJ3QgbmVlZGVkIGlmIEBjb2Rley53b3JkfSBlbWl0cyBhIHZhbHVlIGxhcmdlIGVub3VnaCB0byBjb250YWluIGFuIGFkZHJlc3MKLShvciwgbW9yZSBjb3JyZWN0bHksIGFueSBwb3NzaWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGFkZHJlc3NlcykuCi0KLUBub2RlIEludGVybmFsIGZ1bmN0aW9ucwotQHNlY3Rpb24gSW50ZXJuYWwgZnVuY3Rpb25zCi0KLVRoaXMgc2VjdGlvbiBkZXNjcmliZXMgYmFzaWMgaW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgYnkgR0FTLgotCi1AbWVudQotKiBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlczo6ICBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotKiBIYXNoIHRhYmxlczo6ICAgICAgICAgICAgICAgICBIYXNoIHRhYmxlcwotQGVuZCBtZW51Ci0KLUBub2RlIFdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzCi1Ac3Vic2VjdGlvbiBXYXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcwotCi1AZGVmdHlwZWZ1biAgQHtAfSBpbnQgaGFkX3dhcm5pbmdzICh2b2lkKQotQGRlZnR5cGVmdW54IEB7QH0gaW50IGhhZF9lcnJvcnMgKHZvaWQpCi1SZXR1cm5zIG5vbi16ZXJvIGlmIGFueSB3YXJuaW5ncyBvciBlcnJvcnMsIHJlc3BlY3RpdmVseSwgaGF2ZSBiZWVuIHByaW50ZWQKLWR1cmluZyB0aGlzIGludm9jYXRpb24uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGFzX3BlcnJvciAoY29uc3QgY2hhciAqQHZhcntncmlwZX0sIGNvbnN0IGNoYXIgKkB2YXJ7ZmlsZW5hbWV9KQotRGlzcGxheXMgYSBCRkQgb3Igc3lzdGVtIGVycm9yLCB0aGVuIGNsZWFycyB0aGUgZXJyb3Igc3RhdHVzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuICBAe0B9IHZvaWQgYXNfdHNrdHNrIChjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgYXNfd2FybiAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2JhZCAoY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1AZGVmdHlwZWZ1bnggQHtAfSB2b2lkIGFzX2ZhdGFsIChjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLVRoZXNlIGZ1bmN0aW9ucyBkaXNwbGF5IG1lc3NhZ2VzIGFib3V0IHNvbWV0aGluZyBhbWlzcyB3aXRoIHRoZSBpbnB1dCBmaWxlLCBvcgotaW50ZXJuYWwgcHJvYmxlbXMgaW4gdGhlIGFzc2VtYmxlciBpdHNlbGYuICBUaGUgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUKLW51bWJlciBhcmUgcHJpbnRlZCwgZm9sbG93ZWQgYnkgdGhlIHN1cHBsaWVkIG1lc3NhZ2UsIGZvcm1hdHRlZCB1c2luZwotQGNvZGV7dmZwcmludGZ9LCBhbmQgYSBmaW5hbCBuZXdsaW5lLgotCi1BbiBlcnJvciBpbmRpY2F0ZWQgYnkgQGNvZGV7YXNfYmFkfSB3aWxsIHJlc3VsdCBpbiBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzIHdoZW4KLXRoZSBhc3NlbWJsZXIgaGFzIGZpbmlzaGVkLiAgQ2FsbGluZyBAY29kZXthc19mYXRhbH0gd2lsbCByZXN1bHQgaW4gaW1tZWRpYXRlCi10ZXJtaW5hdGlvbiBvZiB0aGUgYXNzZW1ibGVyIHByb2Nlc3MuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGFzX3dhcm5fd2hlcmUgKGNoYXIgKkB2YXJ7ZmlsZX0sIHVuc2lnbmVkIGludCBAdmFye2xpbmV9LCBjb25zdCBjaGFyICpAdmFye2Zvcm1hdH0sIC4uLikKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgYXNfYmFkX3doZXJlIChjaGFyICpAdmFye2ZpbGV9LCB1bnNpZ25lZCBpbnQgQHZhcntsaW5lfSwgY29uc3QgY2hhciAqQHZhcntmb3JtYXR9LCAuLi4pCi1UaGVzZSB2YXJpYW50cyBwZXJtaXQgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciwgYW5kIGFyZQotdXNlZCB3aGVuIHByb2JsZW1zIGFyZSBkZXRlY3RlZCB3aGVuIHJlcHJvY2Vzc2luZyBpbmZvcm1hdGlvbiBzYXZlZCBhd2F5IHdoZW4KLXByb2Nlc3Npbmcgc29tZSBlYXJsaWVyIHBhcnQgb2YgdGhlIGZpbGUuICBGb3IgZXhhbXBsZSwgZml4dXBzIGFyZSBwcm9jZXNzZWQKLWFmdGVyIGFsbCBpbnB1dCBoYXMgYmVlbiByZWFkLCBidXQgbWVzc2FnZXMgYWJvdXQgZml4dXBzIHNob3VsZCByZWZlciB0byB0aGUKLW9yaWdpbmFsIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciB0aGF0IHRoZXkgYXJlIGFwcGxpY2FibGUgdG8uCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSB2b2lkIGZwcmludF92YWx1ZSAoRklMRSAqQHZhcntmaWxlfSwgdmFsdWVUIEB2YXJ7dmFsfSkKLUBkZWZ0eXBlZnVueCBAe0B9IHZvaWQgc3ByaW50X3ZhbHVlIChjaGFyICpAdmFye2J1Zn0sIHZhbHVlVCBAdmFye3ZhbH0pCi1UaGVzZSBmdW5jdGlvbnMgYXJlIGhlbHBmdWwgZm9yIGNvbnZlcnRpbmcgYSBAY29kZXt2YWx1ZVR9IHZhbHVlIGludG8gcHJpbnRhYmxlCi1mb3JtYXQsIGluIGNhc2UgaXQncyB3aWRlciB0aGFuIG1vZGVzIHRoYXQgQGNvZGV7KnByaW50Zn0gY2FuIGhhbmRsZS4gIElmIHRoZQotdHlwZSBpcyBuYXJyb3cgZW5vdWdoLCBhIGRlY2ltYWwgbnVtYmVyIHdpbGwgYmUgcHJvZHVjZWQ7IG90aGVyd2lzZSwgaXQgd2lsbCBiZQotaW4gaGV4YWRlY2ltYWwuICBUaGUgdmFsdWUgaXRzZWxmIGlzIG5vdCBleGFtaW5lZCB0byBtYWtlIHRoaXMgZGV0ZXJtaW5hdGlvbi4KLUBlbmQgZGVmdHlwZWZ1bgotCi1Abm9kZSBIYXNoIHRhYmxlcwotQHN1YnNlY3Rpb24gSGFzaCB0YWJsZXMKLUBjaW5kZXggaGFzaCB0YWJsZXMKLQotQGRlZnR5cGVmdW4gQHtAfSBAe3N0cnVjdCBoYXNoX2NvbnRyb2wgKkB9IGhhc2hfbmV3ICh2b2lkKQotQ3JlYXRlcyB0aGUgaGFzaCB0YWJsZSBjb250cm9sIHN0cnVjdHVyZS4KLUBlbmQgZGVmdHlwZWZ1bgotCi1AZGVmdHlwZWZ1biBAe0B9IHZvaWQgaGFzaF9kaWUgKHN0cnVjdCBoYXNoX2NvbnRyb2wgKikKLURlc3Ryb3kgYSBoYXNoIHRhYmxlLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gUFRSIGhhc2hfZGVsZXRlIChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKikKLURlbGV0ZXMgZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZSwgcmV0dXJucyB0aGUgdmFsdWUgaXQgaGFkLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gUFRSIGhhc2hfcmVwbGFjZSAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKLVVwZGF0ZXMgdGhlIHZhbHVlIGZvciBhbiBlbnRyeSBhbHJlYWR5IGluIHRoZSB0YWJsZSwgcmV0dXJuaW5nIHRoZSBvbGQgdmFsdWUuCi1JZiBubyBlbnRyeSB3YXMgZm91bmQsIGp1c3QgcmV0dXJucyBOVUxMLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBkZWZ0eXBlZnVuIEB7QH0gQHtjb25zdCBjaGFyICpAfSBoYXNoX2luc2VydCAoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICosIFBUUikKLUluc2VydGluZyBhIHZhbHVlIGFscmVhZHkgaW4gdGhlIHRhYmxlIGlzIGFuIGVycm9yLgotUmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwuCi1AZW5kIGRlZnR5cGVmdW4KLQotQGRlZnR5cGVmdW4gQHtAfSBAe2NvbnN0IGNoYXIgKkB9IGhhc2hfamFtIChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKiwgUFRSKQotSW5zZXJ0cyBpZiB0aGUgdmFsdWUgaXNuJ3QgYWxyZWFkeSBwcmVzZW50LCB1cGRhdGVzIGl0IGlmIGl0IGlzLgotQGVuZCBkZWZ0eXBlZnVuCi0KLUBub2RlIFRlc3Qgc3VpdGUKLUBzZWN0aW9uIFRlc3Qgc3VpdGUKLUBjaW5kZXggdGVzdCBzdWl0ZQotCi1UaGUgdGVzdCBzdWl0ZSBpcyBraW5kIG9mIGxhbWUgZm9yIG1vc3QgcHJvY2Vzc29ycy4gIE9mdGVuIGl0IG9ubHkgY2hlY2tzIHRvCi1zZWUgaWYgYSBjb3VwbGUgb2YgZmlsZXMgY2FuIGJlIGFzc2VtYmxlZCB3aXRob3V0IHRoZSBhc3NlbWJsZXIgcmVwb3J0aW5nIGFueQotZXJyb3JzLiAgRm9yIG1vcmUgY29tcGxldGUgdGVzdGluZywgd3JpdGUgYSB0ZXN0IHdoaWNoIGVpdGhlciBleGFtaW5lcyB0aGUKLWFzc2VtYmxlciBsaXN0aW5nLCBvciBydW5zIEBjb2Rle29iamR1bXB9IGFuZCBleGFtaW5lcyBpdHMgb3V0cHV0LiAgRm9yIHRoZQotbGF0dGVyLCB0aGUgVENMIHByb2NlZHVyZSBAY29kZXtydW5fZHVtcF90ZXN0fSBtYXkgY29tZSBpbiBoYW5keS4gIEl0IHRha2VzIHRoZQotYmFzZSBuYW1lIG9mIGEgZmlsZSwgYW5kIGxvb2tzIGZvciBAZmlsZXtAdmFye2ZpbGV9LmR9LiAgVGhpcyBmaWxlIHNob3VsZAotY29udGFpbiBhcyBpdHMgaW5pdGlhbCBsaW5lcyBhIHNldCBvZiB2YXJpYWJsZSBzZXR0aW5ncyBpbiBAc2FtcHsjfSBjb21tZW50cywKLWluIHRoZSBmb3JtOgotCi1AZXhhbXBsZQotICAgICAgICAjQHZhcnt2YXJuYW1lfTogQHZhcnt2YWx1ZX0KLUBlbmQgZXhhbXBsZQotCi1UaGUgQHZhcnt2YXJuYW1lfSBtYXkgYmUgQGNvZGV7b2JqZHVtcH0sIEBjb2Rle25tfSwgb3IgQGNvZGV7YXN9LCBpbiB3aGljaCBjYXNlCi1pdCBzcGVjaWZpZXMgdGhlIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBzcGVjaWZpZWQgcHJvZ3JhbXMuICBFeGFjdGx5IG9uZQotb2YgQGNvZGV7b2JqZHVtcH0gb3IgQGNvZGV7bm19IG11c3QgYmUgc3BlY2lmaWVkLCBhcyB0aGF0IGFsc28gc3BlY2lmaWVzIHdoaWNoCi1wcm9ncmFtIHRvIHJ1biBhZnRlciB0aGUgYXNzZW1ibGVyIGhhcyBmaW5pc2hlZC4gIElmIEB2YXJ7dmFybmFtZX0gaXMKLUBjb2Rle3NvdXJjZX0sIGl0IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGU7IG90aGVyd2lzZSwKLUBmaWxle0B2YXJ7ZmlsZX0uc30gaXMgdXNlZC4gIElmIEB2YXJ7dmFybmFtZX0gaXMgQGNvZGV7bmFtZX0sIGl0IHNwZWNpZmllcyB0aGUKLW5hbWUgb2YgdGhlIHRlc3QgdG8gYmUgdXNlZCBpbiB0aGUgQGNvZGV7cGFzc30gb3IgQGNvZGV7ZmFpbH0gbWVzc2FnZXMuCi0KLVRoZSBub24tY29tbWVudGVkIHBhcnRzIG9mIHRoZSBmaWxlIGFyZSBpbnRlcnByZXRlZCBhcyByZWd1bGFyIGV4cHJlc3Npb25zLCBvbmUKLXBlciBsaW5lLiAgQmxhbmsgbGluZXMgaW4gdGhlIEBjb2Rle29iamR1bXB9IG9yIEBjb2Rle25tfSBvdXRwdXQgYXJlIHNraXBwZWQsCi1hcyBhcmUgYmxhbmsgbGluZXMgaW4gdGhlIEBjb2Rley5kfSBmaWxlOyB0aGUgb3RoZXIgbGluZXMgYXJlIHRlc3RlZCB0byBzZWUgaWYKLXRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyB0aGUgcHJvZ3JhbSBvdXRwdXQuICBJZiBpdCBkb2VzIG5vdCwgdGhlIHRlc3QKLWZhaWxzLgotCi1Ob3RlIHRoYXQgdGhpcyBtZWFucyB0aGUgdGVzdHMgbXVzdCBiZSBtb2RpZmllZCBpZiB0aGUgQGNvZGV7b2JqZHVtcH0gb3V0cHV0Ci1zdHlsZSBpcyBjaGFuZ2VkLgotCi1AYnllCi1AYyBMb2NhbCBWYXJpYWJsZXM6Ci1AYyBmaWxsLWNvbHVtbjogNzkKLUBjIEVuZDoKZGlmZiAtLWdpdCBhL2dhcy9kd2FyZjJkYmcuYyBiL2dhcy9kd2FyZjJkYmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlOTY0Ni4uMDAwMDAwMAotLS0gYS9nYXMvZHdhcmYyZGJnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjAgKzAsMCBAQAotLyogZHdhcmYyZGJnLmMgLSBEV0FSRjIgZGVidWcgc3VwcG9ydAotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBMb2dpY2FsIGxpbmUgbnVtYmVycyBjYW4gYmUgY29udHJvbGxlZCBieSB0aGUgY29tcGlsZXIgdmlhIHRoZQotICAgZm9sbG93aW5nIHR3byBkaXJlY3RpdmVzOgotCi0JLmZpbGUgRklMRU5PICJmaWxlLmMiCi0JLmxvYyAgRklMRU5PIExJTkVOTyBbQ09MVU1OXQotCi0gICBGSUxFTk8gaXMgdGhlIGZpbGVudW1iZXIuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiZHdhcmYyZGJnLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgotCi0vKiBTaW5jZSB3ZSBjYW4ndCBnZW5lcmF0ZSB0aGUgcHJvbG9nIHVudGlsIHRoZSBib2R5IGlzIGNvbXBsZXRlLCB3ZQotICAgdXNlIHRocmVlIGRpZmZlcmVudCBzdWJzZWdtZW50cyBmb3IgLmRlYnVnX2xpbmU6IG9uZSBob2xkaW5nIHRoZQotICAgcHJvbG9nLCBvbmUgZm9yIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lIGluZm8sIGFuZCBvbmUgZm9yIHRoZQotICAgYm9keSAoInN0YXRlbWVudCBwcm9ncmFtIikuICAqLwotI2RlZmluZSBETF9QUk9MT0cJMAotI2RlZmluZSBETF9GSUxFUwkxCi0jZGVmaW5lIERMX0JPRFkJCTIKLQotLyogRmlyc3Qgc3BlY2lhbCBsaW5lIG9wY2RlIC0gbGVhdmUgcm9vbSBmb3IgdGhlIHN0YW5kYXJkIG9wY29kZXMuCi0gICBOb3RlOiBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhpcywgeW91J2xsIGhhdmUgdG8gdXBkYXRlIHRoZQotICAgInN0YW5kYXJkX29wY29kZV9sZW5ndGhzIiB0YWJsZSB0aGF0IGlzIGVtaXR0ZWQgYmVsb3cgaW4KLSAgIGR3YXJmMl9maW5pc2goKS4gICovCi0jZGVmaW5lIERXQVJGMl9MSU5FX09QQ09ERV9CQVNFCQkxMAotCi0jaWZuZGVmIERXQVJGMl9MSU5FX0JBU0UKLSAgLyogTWluaW11bSBsaW5lIG9mZnNldCBpbiBhIHNwZWNpYWwgbGluZSBpbmZvLiBvcGNvZGUuICBUaGlzIHZhbHVlCi0gICAgIHdhcyBjaG9zZW4gdG8gZ2l2ZSBhIHJlYXNvbmFibGUgcmFuZ2Ugb2YgdmFsdWVzLiAgKi8KLSMgZGVmaW5lIERXQVJGMl9MSU5FX0JBU0UJCS01Ci0jZW5kaWYKLQotLyogUmFuZ2Ugb2YgbGluZSBvZmZzZXRzIGluIGEgc3BlY2lhbCBsaW5lIGluZm8uIG9wY29kZS4gICovCi0jaWZuZGVmIERXQVJGMl9MSU5FX1JBTkdFCi0jIGRlZmluZSBEV0FSRjJfTElORV9SQU5HRQkJMTQKLSNlbmRpZgotCi0jaWZuZGVmIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSAotICAvKiBEZWZpbmUgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgbWluaW11bSBpbnN0cnVjdGlvbiBsZW5ndGggKGluCi0gICAgIGJ5dGVzKS4gIFRoaXMgdmFsdWUgc2hvdWxkIGJlIHJhdGhlciB0b28gc21hbGwgdGhhbiB0b28gYmlnLiAgKi8KLSMgZGVmaW5lIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSAk0Ci0jZW5kaWYKLQotLyogRmxhZyB0aGF0IGluZGljYXRlcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgaXNfc3RtdF9zdGFydCBmbGFnLgotICAgSW4gdGhlIHByZXNlbnQgaW1wbGVtZW50YXRpb24sIHdlIGRvIG5vdCBtYXJrIGFueSBsaW5lcyBhcwotICAgdGhlIGJlZ2lubmluZyBvZiBhIHNvdXJjZSBzdGF0ZW1lbnQsIGJlY2F1c2UgdGhhdCBpbmZvcm1hdGlvbgotICAgaXMgbm90IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBHQ0MgZnJvbnQtZW5kLiAgKi8KLSNkZWZpbmUJRFdBUkYyX0xJTkVfREVGQVVMVF9JU19TVE1UCTEKLQotLyogRmxhZyB0aGF0IGluZGljYXRlcyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgaXNfc3RtdF9zdGFydCBmbGFnLgotICAgSW4gdGhlIHByZXNlbnQgaW1wbGVtZW50YXRpb24sIHdlIGRvIG5vdCBtYXJrIGFueSBsaW5lcyBhcwotICAgdGhlIGJlZ2lubmluZyBvZiBhIHNvdXJjZSBzdGF0ZW1lbnQsIGJlY2F1c2UgdGhhdCBpbmZvcm1hdGlvbgotICAgaXMgbm90IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBHQ0MgZnJvbnQtZW5kLiAgKi8KLSNkZWZpbmUJRFdBUkYyX0xJTkVfREVGQVVMVF9JU19TVE1UCTEKLQotLyogR2l2ZW4gYSBzcGVjaWFsIG9wLCByZXR1cm4gdGhlIGxpbmUgc2tpcCBhbW91bnQ6ICovCi0jZGVmaW5lIFNQRUNJQUxfTElORShvcCkgXAotCSgoKG9wKSAtIERXQVJGMl9MSU5FX09QQ09ERV9CQVNFKSVEV0FSRjJfTElORV9SQU5HRSArIERXQVJGMl9MSU5FX0JBU0UpCi0KLS8qIEdpdmVuIGEgc3BlY2lhbCBvcCwgcmV0dXJuIHRoZSBhZGRyZXNzIHNraXAgYW1vdW50IChpbiB1bml0cyBvZgotICAgRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RILiAgKi8KLSNkZWZpbmUgU1BFQ0lBTF9BRERSKG9wKSAoKChvcCkgLSBEV0FSRjJfTElORV9PUENPREVfQkFTRSkvRFdBUkYyX0xJTkVfUkFOR0UpCi0KLS8qIFRoZSBtYXhpbXVtIGFkZHJlc3Mgc2tpcCBhbW9udCB0aGF0IGNhbiBiZSBlbmNvZGVkIHdpdGggYSBzcGVjaWFsIG9wOiAqLwotI2RlZmluZSBNQVhfU1BFQ0lBTF9BRERSX0RFTFRBCQlTUEVDSUFMX0FERFIoMjU1KQotCi0jZGVmaW5lIElOSVRJQUxfU1RBVEUJCQkJCQlcCi0gIC8qIGluaXRpYWxpemUgYXMgcGVyIERXQVJGMi4wIHN0YW5kYXJkOiAqLwkJCVwKLSAgMCwJCQkJCS8qIGFkZHJlc3MgKi8JCVwKLSAgMSwJCQkJCS8qIGZpbGUgKi8JCVwKLSAgMSwJCQkJCS8qIGxpbmUgKi8JCVwKLSAgMCwJCQkJCS8qIGNvbHVtbiAqLwkJXAotICBEV0FSRjJfTElORV9ERUZBVUxUX0lTX1NUTVQsCQkvKiBpc19zdG10ICovCQlcCi0gIDAsCQkJCQkvKiBiYXNpY19ibG9jayAqLwlcCi0gIDEJCQkJCS8qIGVtcHR5X3NlcXVlbmNlICovCi0KLXN0YXRpYyBzdHJ1Y3QKLSAgewotICAgIC8qIHN0YXRlIG1hY2hpbmUgc3RhdGUgYXMgcGVyIERXQVJGMiBtYW51YWw6ICovCi0gICAgc3RydWN0IGR3YXJmMl9zbQotICAgICAgewotCWFkZHJlc3NUIGFkZHI7Ci0JdW5zaWduZWQgaW50IGZpbGVudW07Ci0JdW5zaWduZWQgaW50IGxpbmU7Ci0JdW5zaWduZWQgaW50IGNvbHVtbjsKLQl1bnNpZ25lZCBpbnQKLQkgIGlzX3N0bXQgOiAxLAotCSAgYmFzaWNfYmxvY2sgOiAxLAotCSAgZW1wdHlfc2VxdWVuY2UgOiAxOwkJLyogY3VycmVudCBjb2RlIHNlcXVlbmNlIGhhcyBubyBEV0FSRjIgZGlyZWN0aXZlcz8gKi8KLSAgICAgIH0KLSAgICBzbTsKLQotICAgIHVuc2lnbmVkIGludAotICAgICAgYW55X2R3YXJmMl9kaXJlY3RpdmVzIDogMTsJLyogZGlkIHdlIGVtaXQgYW55IERXQVJGMiBsaW5lIGRlYnVnIGRpcmVjdGl2ZXM/ICovCi0KLSAgICBzZWdUIHRleHRfc2VnOwkvKiB0ZXh0IHNlZ21lbnQgImFkZHIiIGlzIHJlbGF0aXZlIHRvICovCi0gICAgc3Vic2VnVCB0ZXh0X3N1YnNlZzsKLSAgICBzZWdUIGxpbmVfc2VnOwkvKiAiLmRlYnVnX2xpbmUiIHNlZ21lbnQgKi8KLSAgICBpbnQgbGFzdF9maWxlbmFtZTsJLyogaW5kZXggb2YgbGFzdCBmaWxlbmFtZSB0aGF0IHdhcyB1c2VkICovCi0gICAgaW50IG51bV9maWxlbmFtZXM7CS8qIGluZGV4IG9mIGxhc3QgZmlsZW5hbWUgaW4gdXNlICovCi0gICAgaW50IGZpbGVuYW1lX2xlbjsJLyogbGVuZ3RoIG9mIHRoZSBmaWxlbmFtZSBhcnJheSAqLwotICAgIHN0cnVjdAotICAgICAgewotCWludCBkaXI7CS8qIHZhbGlkIGFmdGVyIGdlbl9kaXJfbGlzdCgpIG9ubHkgKi8KLQljaGFyICpuYW1lOyAvKiBmdWxsIHBhdGggYmVmb3JlIGdlbl9kaXJfbGlzdCgpLCBmaWxlbmFtZSBhZnRlcndhcmRzICovCi0gICAgICB9Ci0gICAgKmZpbGU7Ci0KLSAgICBzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyBjdXJyZW50OwkvKiBjdXJyZW50IHNvdXJjZSBpbmZvOiAqLwotCi0gICAgLyogY291bnRlcnMgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzOiAqLwotICAgIHVuc2lnbmVkIGludCBudW1fbGluZV9lbnRyaWVzOwotICAgIHVuc2lnbmVkIGludCBvcGNvZGVfaGlzdFsyNTZdOwkvKiBoaXN0b2dyYW0gb2Ygb3Bjb2RlIGZyZXF1ZW5jaWVzICovCi0gIH0KLWxzID0KLSAgewotICAgIHsKLSAgICAgIElOSVRJQUxfU1RBVEUKLSAgICB9LAotICB9OwotCi0KLS8qIEZ1bmN0aW9uIHByb3RvdHlwZXM6ICovCi1zdGF0aWMgdm9pZCBvdXRfdWxlYjEyOCBQQVJBTVMgKChhZGRyZXNzVCkpOwotc3RhdGljIHZvaWQgb3V0X3NsZWIxMjggUEFSQU1TICgob2Zmc2V0VCkpOwotc3RhdGljIHZvaWQgZ2VuX2FkZHJfbGluZSBQQVJBTVMgKChpbnQsIGFkZHJlc3NUKSk7Ci1zdGF0aWMgdm9pZCByZXNldF9zdGF0ZV9tYWNoaW5lIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIG91dF9zZXRfYWRkciBQQVJBTVMgKChhZGRyZXNzVCkpOwotc3RhdGljIHZvaWQgb3V0X2VuZF9zZXF1ZW5jZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldF9maWxlbnVtIFBBUkFNUyAoKGludCwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBnZW5fZGlyX2xpc3QgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2VuX2ZpbGVfbGlzdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0cyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci0KLQotI2RlZmluZSBvdXRfYnl0ZShieXRlKQlGUkFHX0FQUEVORF8xX0NIQVIoYnl0ZSkKLSNkZWZpbmUgb3V0X29wY29kZShvcGMpCShvdXRfYnl0ZSAoKG9wYykpLCArK2xzLm9wY29kZV9oaXN0WyhvcGMpICYgMHhmZl0pCi0KLS8qIE91dHB1dCBhbiB1bnNpZ25lZCAibGl0dGxlLWVuZGlhbiBiYXNlIDEyOCIgbnVtYmVyLiAgKi8KLXN0YXRpYyB2b2lkCi1vdXRfdWxlYjEyOCAodmFsdWUpCi0gICAgIGFkZHJlc3NUIHZhbHVlOwotewotICB1bnNpZ25lZCBjaGFyIGJ5dGUsIG1vcmUgPSAweDgwOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IHZhbHVlICYgMHg3ZjsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgICAgaWYgKHZhbHVlID09IDApCi0JbW9yZSA9IDA7Ci0gICAgICBvdXRfYnl0ZSAobW9yZSB8IGJ5dGUpOwotICAgIH0KLSAgd2hpbGUgKG1vcmUpOwotfQotCi0vKiBPdXRwdXQgYSBzaWduZWQgImxpdHRsZS1lbmRpYW4gYmFzZSAxMjgiIG51bWJlci4gICovCi1zdGF0aWMgdm9pZAotb3V0X3NsZWIxMjggKHZhbHVlKQotICAgICBvZmZzZXRUIHZhbHVlOwotewotICB1bnNpZ25lZCBjaGFyIGJ5dGUsIG1vcmUgPSAweDgwOwotCi0gIGRvCi0gICAgewotICAgICAgYnl0ZSA9IHZhbHVlICYgMHg3ZjsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgICAgaWYgKCgodmFsdWUgPT0gMCkgJiYgKChieXRlICYgMHg0MCkgPT0gMCkpCi0JICB8fCAoKHZhbHVlID09IC0xKSAmJiAoKGJ5dGUgJiAweDQwKSAhPSAwKSkpCi0JbW9yZSA9IDA7Ci0gICAgICBvdXRfYnl0ZSAobW9yZSB8IGJ5dGUpOwotICAgIH0KLSAgd2hpbGUgKG1vcmUpOwotfQotCi0vKiBFbmNvZGUgYSBwYWlyIG9mIGxpbmUgYW5kIGFkZHJlc3Mgc2tpcHMgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuCi0gICBOb3RlIHRoYXQgdGhlIGxpbmUgc2tpcCBpcyBzaWduZWQsIHdoZXJlYXMgdGhlIGFkZHJlc3Mgc2tpcCBpcwotICAgdW5zaWduZWQuICAqLwotc3RhdGljIHZvaWQKLWdlbl9hZGRyX2xpbmUgKGxpbmVfZGVsdGEsIGFkZHJfZGVsdGEpCi0gICAgIGludCBsaW5lX2RlbHRhOwotICAgICBhZGRyZXNzVCBhZGRyX2RlbHRhOwotewotICB1bnNpZ25lZCBpbnQgdG1wLCBvcGNvZGU7Ci0KLSAgdG1wID0gbGluZV9kZWx0YSAtIERXQVJGMl9MSU5FX0JBU0U7Ci0KLSAgaWYgKHRtcCA+PSBEV0FSRjJfTElORV9SQU5HRSkKLSAgICB7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfYWR2YW5jZV9saW5lKTsKLSAgICAgIG91dF9zbGViMTI4IChsaW5lX2RlbHRhKTsKLSAgICAgIHRtcCA9IDAgLSBEV0FSRjJfTElORV9CQVNFOwotICAgICAgbGluZV9kZWx0YSA9IDA7Ci0gICAgfQotCi0gIHRtcCArPSBEV0FSRjJfTElORV9PUENPREVfQkFTRTsKLQotICAvKiB0cnkgdXNpbmcgYSBzcGVjaWFsIG9wY29kZTogKi8KLSAgb3Bjb2RlID0gdG1wICsgYWRkcl9kZWx0YSpEV0FSRjJfTElORV9SQU5HRTsKLSAgaWYgKG9wY29kZSA8PSAyNTUpCi0gICAgewotICAgICAgb3V0X29wY29kZSAob3Bjb2RlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogdHJ5IHVzaW5nIERXX0xOU19jb25zdF9hZGRfcGMgZm9sbG93ZWQgYnkgc3BlY2lhbCBvcDogKi8KLSAgb3Bjb2RlID0gdG1wICsgKGFkZHJfZGVsdGEgLSBNQVhfU1BFQ0lBTF9BRERSX0RFTFRBKSpEV0FSRjJfTElORV9SQU5HRTsKLSAgaWYgKG9wY29kZSA8PSAyNTUpCi0gICAgewotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX2NvbnN0X2FkZF9wYyk7Ci0gICAgICBvdXRfb3Bjb2RlIChvcGNvZGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBvdXRfb3Bjb2RlIChEV19MTlNfYWR2YW5jZV9wYyk7Ci0gIG91dF91bGViMTI4IChhZGRyX2RlbHRhKTsKLQotICBpZiAobGluZV9kZWx0YSkKLSAgICBvdXRfb3Bjb2RlICh0bXApOwkJLyogb3V0cHV0IGxpbmUtZGVsdGEgKi8KLSAgZWxzZQotICAgIG91dF9vcGNvZGUgKERXX0xOU19jb3B5KTsJLyogYXBwZW5kIG5ldyByb3cgd2l0aCBjdXJyZW50IGluZm8gKi8KLX0KLQotc3RhdGljIHZvaWQKLXJlc2V0X3N0YXRlX21hY2hpbmUgKCkKLXsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBkd2FyZjJfc20gaW5pdGlhbF9zdGF0ZSA9IHsgSU5JVElBTF9TVEFURSB9OwotCi0gIGxzLnNtID0gaW5pdGlhbF9zdGF0ZTsKLX0KLQotLyogU2V0IGFuIGFic29sdXRlIGFkZHJlc3MgKG1heSByZXN1bHRzIGluIGEgcmVsb2NhdGlvbiBlbnRyeSk6ICovCi1zdGF0aWMgdm9pZAotb3V0X3NldF9hZGRyIChhZGRyKQotICAgICBhZGRyZXNzVCBhZGRyOwotewotICBzdWJzZWdUIHNhdmVkX3N1YnNlZzsKLSAgc2VnVCBzYXZlZF9zZWc7Ci0gIGV4cHJlc3Npb25TIGV4cHI7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgaW50IGJ5dGVzX3Blcl9hZGRyZXNzOwotCi0gIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0KLSAgc3Vic2VnX3NldCAobHMudGV4dF9zZWcsIGxzLnRleHRfc3Vic2VnKTsKLSAgc3ltID0gc3ltYm9sX25ldyAoIi5MMFwwMDEiLCBub3dfc2VnLCBhZGRyLCBmcmFnX25vdyk7Ci0KLSAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBieXRlc19wZXJfYWRkcmVzcyA9IGJmZF9hcmNoX2JpdHNfcGVyX2FkZHJlc3MgKHN0ZG91dHB1dCkgLyA4OwotI2Vsc2UKLSAgLyogRklYTUUuICAqLwotICBieXRlc19wZXJfYWRkcmVzcyA9IDQ7Ci0jZW5kaWYKLQotICBvdXRfb3Bjb2RlIChEV19MTlNfZXh0ZW5kZWRfb3ApOwotICBvdXRfdWxlYjEyOCAoYnl0ZXNfcGVyX2FkZHJlc3MgKyAxKTsKLQotICBvdXRfb3Bjb2RlIChEV19MTkVfc2V0X2FkZHJlc3MpOwotICBleHByLlhfb3AgPSBPX3N5bWJvbDsKLSAgZXhwci5YX2FkZF9zeW1ib2wgPSBzeW07Ci0gIGV4cHIuWF9hZGRfbnVtYmVyID0gMDsKLSAgZW1pdF9leHByICgmZXhwciwgYnl0ZXNfcGVyX2FkZHJlc3MpOwotfQotCi0vKiBFbWl0IERXX0xOU19lbmRfc2VxdWVuY2UgYW5kIHJlc2V0IHN0YXRlIG1hY2hpbmUuICBEb2VzIG5vdAotICAgcHJlc2VydmUgdGhlIGN1cnJlbnQgc2VnbWVudC9zdWItc2VnbWVudCEgICovCi1zdGF0aWMgdm9pZAotb3V0X2VuZF9zZXF1ZW5jZSAoKQotewotICBhZGRyZXNzVCBhZGRyLCBkZWx0YTsKLQotICBpZiAobHMudGV4dF9zZWcpCi0gICAgewotICAgICAgc3Vic2VnX3NldCAobHMudGV4dF9zZWcsIGxzLnRleHRfc3Vic2VnKTsKLSNpZmRlZiBtZF9jdXJyZW50X3RleHRfYWRkcgotICAgICAgYWRkciA9IG1kX2N1cnJlbnRfdGV4dF9hZGRyICgpOwotI2Vsc2UKLSAgICAgIGFkZHIgPSBmcmFnX25vd19maXggKCk7Ci0jZW5kaWYKLSAgICAgIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9CT0RZKTsKLSAgICAgIGlmIChhZGRyIDwgbHMuc20uYWRkcikKLQl7Ci0JICBvdXRfc2V0X2FkZHIgKGFkZHIpOwotCSAgbHMuc20uYWRkciA9IGFkZHI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRlbHRhID0gYWRkciAtIGxzLnNtLmFkZHI7Ci0JICBpZiAoZGVsdGEgPiAwKQotCSAgICBnZW5fYWRkcl9saW5lICgwLCBkZWx0YSAvIERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9CT0RZKTsKLQotICBvdXRfb3Bjb2RlIChEV19MTlNfZXh0ZW5kZWRfb3ApOwotICBvdXRfdWxlYjEyOCAoMSk7Ci0gIG91dF9ieXRlIChEV19MTkVfZW5kX3NlcXVlbmNlKTsKLQotICByZXNldF9zdGF0ZV9tYWNoaW5lICgpOwotfQotCi0vKiBMb29rIHVwIGEgZmlsZW51bWJlciBlaXRoZXIgYnkgZmlsZW5hbWUgb3IgYnkgZmlsZW51bWJlci4gIElmIGJvdGgKLSAgIGEgZmlsZW51bWJlciBhbmQgYSBmaWxlbmFtZSBhcmUgc3BlY2lmaWVkLCBsb29rdXAgYnkgZmlsZW5hbWUgdGFrZXMKLSAgIHByZWNlZGVuY2UuICBJZiB0aGUgZmlsZW5hbWUgY2Fubm90IGJlIGZvdW5kLCBpdCBpcyBhZGRlZCB0byB0aGUKLSAgIGZpbGV0YWJsZSB0aGUgZmlsZW51bWJlciBmb3IgdGhlIG5ldyBlbnRyeSBpcyByZXR1cm5lZC4gICovCi1zdGF0aWMgaW50Ci1nZXRfZmlsZW51bSAoZmlsZW51bSwgZmlsZSkKLSAgICAgaW50IGZpbGVudW07Ci0gICAgIGNoYXIgKmZpbGU7Ci17Ci0gIGludCBpLCBsYXN0ID0gZmlsZW51bSAtIDE7Ci0gIGNoYXIgY2hhcjAgPSBmaWxlWzBdOwotCi0gIGlmICgodW5zaWduZWQpIGxhc3QgPj0gbHMubnVtX2ZpbGVuYW1lcykKLSAgICBsYXN0ID0gbHMubGFzdF9maWxlbmFtZTsKLQotICAvKiBkbyBhIHF1aWNrIGNoZWNrIGFnYWluc3QgdGhlIHByZXZpb3VzbHkgdXNlZCBmaWxlbmFtZTogKi8KLSAgaWYgKGxzLm51bV9maWxlbmFtZXMgPiAwICYmIGxzLmZpbGVbbGFzdF0ubmFtZVswXSA9PSBjaGFyMAotICAgICAgJiYgc3RyY21wIChscy5maWxlW2xhc3RdLm5hbWUgKyAxLCBmaWxlICsgMSkgPT0gMCkKLSAgICByZXR1cm4gbGFzdCArIDE7Ci0KLSAgLyogbm8gbWF0Y2gsIGZhbGwgYmFjayB0byBzaW1wbGUgbGluZWFyIHNjYW46ICovCi0gIGZvciAoaSA9IDA7IGkgPCBscy5udW1fZmlsZW5hbWVzOyArK2kpCi0gICAgewotICAgICAgaWYgKGxzLmZpbGVbaV0ubmFtZVswXSA9PSBjaGFyMAotCSAgJiYgc3RyY21wIChscy5maWxlW2ldLm5hbWUgKyAxLCBmaWxlICsgMSkgPT0gMCkKLQl7Ci0JICBscy5sYXN0X2ZpbGVuYW1lID0gaTsKLQkgIHJldHVybiBpICsgMTsKLQl9Ci0gICAgfQotCi0gIC8qIG5vIG1hdGNoOiBlbnRlciBuZXcgZmlsZW5hbWUgKi8KLSAgaWYgKGxzLm51bV9maWxlbmFtZXMgPj0gbHMuZmlsZW5hbWVfbGVuKQotICAgIHsKLSAgICAgIGxzLmZpbGVuYW1lX2xlbiArPSAxMzsKLSAgICAgIGxzLmZpbGUgPSB4cmVhbGxvYyAobHMuZmlsZSwgbHMuZmlsZW5hbWVfbGVuICogc2l6ZW9mIChscy5maWxlWzBdKSk7Ci0gICAgfQotICBscy5maWxlW2xzLm51bV9maWxlbmFtZXNdLmRpciA9IDA7Ci0gIGxzLmZpbGVbbHMubnVtX2ZpbGVuYW1lc10ubmFtZSA9IGZpbGU7Ci0gIHJldHVybiArK2xzLm51bV9maWxlbmFtZXM7Ci19Ci0KLXZvaWQKLWR3YXJmMl9nZW5fbGluZV9pbmZvIChhZGRyLCBsKQotICAgICBhZGRyZXNzVCBhZGRyOwotICAgICBzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyAqbDsKLXsKLSAgdW5zaWduZWQgaW50IGZpbGVudW0gPSBsLT5maWxlbnVtOwotICB1bnNpZ25lZCBpbnQgYW55X291dHB1dCA9IDA7Ci0gIHN1YnNlZ1Qgc2F2ZWRfc3Vic2VnOwotICBzZWdUIHNhdmVkX3NlZzsKLQotICBpZiAoZmxhZ19kZWJ1ZykKLSAgICBmcHJpbnRmIChzdGRlcnIsICJsaW5lOiBhZGRyICVsbHggZmlsZSBgJXMnIGxpbmUgJXUgY29sICV1IGZsYWdzICV4XG4iLAotCSAgICAgKGxvbmcgbG9uZykgYWRkciwgbC0+ZmlsZW5hbWUsIGwtPmxpbmUsIGwtPmNvbHVtbiwgbC0+ZmxhZ3MpOwotCi0gIGlmIChmaWxlbnVtID4gMCAmJiAhbC0+ZmlsZW5hbWUpCi0gICAgewotICAgICAgaWYgKGZpbGVudW0gPj0gbHMubnVtX2ZpbGVuYW1lcykKLQl7Ci0JICBhc193YXJuICgiRW5jb3VudGVyZWQgYmFkIGZpbGUgbnVtYmVyIGluIGxpbmUgbnVtYmVyIGRlYnVnIGluZm8hIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAobC0+ZmlsZW5hbWUpCi0gICAgZmlsZW51bSA9IGdldF9maWxlbnVtIChmaWxlbnVtLCBsLT5maWxlbmFtZSk7Ci0gIGVsc2UKLSAgICByZXR1cm47CS8qIG5vIGZpbGVuYW1lLCBubyBmaWxudW0gPT4gbm8gcGxheSAqLwotCi0gIGlmICghbHMubGluZV9zZWcpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHN5bWJvbFMgKnNlY3N5bTsKLSNlbmRpZgotCi0gICAgICBscy5saW5lX3NlZyA9IHN1YnNlZ19uZXcgKCIuZGVidWdfbGluZSIsIDApOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChzdGRvdXRwdXQsIGxzLmxpbmVfc2VnLCBTRUNfUkVBRE9OTFkpOwotCi0gICAgICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIHRoaXMgc3ltYm9sLiAgKi8KLSAgICAgIHNlY3N5bSA9IHN5bWJvbF9maW5kICgiLmRlYnVnX2xpbmUiKTsKLSAgICAgIGlmIChzZWNzeW0gIT0gTlVMTCkKLSAgICAgICAgc3ltYm9sX3NldF9iZmRzeW0gKHNlY3N5bSwgbHMubGluZV9zZWctPnN5bWJvbCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHN5bWJvbF90YWJsZV9pbnNlcnQgKHNlY3Rpb25fc3ltYm9sIChscy5saW5lX3NlZykpOwotI2VuZGlmCi0gICAgfQotCi0gIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9CT0RZKTsKLQotICBpZiAobHMudGV4dF9zZWcgIT0gc2F2ZWRfc2VnIHx8IGxzLnRleHRfc3Vic2VnICE9IHNhdmVkX3N1YnNlZykKLSAgICB7Ci0gICAgICBpZiAoIWxzLnNtLmVtcHR5X3NlcXVlbmNlKQotCXsKLQkgIG91dF9lbmRfc2VxdWVuY2UgKCk7CQkvKiB0ZXJtaW5hdGUgcHJldmlvdXMgc2VxdWVuY2UgKi8KLQkgIGxzLnNtLmVtcHR5X3NlcXVlbmNlID0gMTsKLQl9Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIGxzLnRleHRfc2VnID0gc2F2ZWRfc2VnOwotICAgICAgbHMudGV4dF9zdWJzZWcgPSBzYXZlZF9zdWJzZWc7Ci0gICAgICBvdXRfc2V0X2FkZHIgKGFkZHIpOwotICAgICAgbHMuc20uYWRkciA9IGFkZHI7Ci0gICAgfQotCi0gIGlmIChscy5zbS5maWxlbnVtICE9IGZpbGVudW0pCi0gICAgewotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBvdXRfb3Bjb2RlIChEV19MTlNfc2V0X2ZpbGUpOwotICAgICAgb3V0X3VsZWIxMjggKGZpbGVudW0pOwotICAgICAgbHMuc20uZmlsZW51bSA9IGZpbGVudW07Ci0gICAgfQotCi0gIGlmIChscy5zbS5jb2x1bW4gIT0gbC0+Y29sdW1uKQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX3NldF9jb2x1bW4pOwotICAgICAgb3V0X3VsZWIxMjggKGwtPmNvbHVtbik7Ci0gICAgICBscy5zbS5jb2x1bW4gPSBsLT5jb2x1bW47Ci0gICAgfQotCi0gIGlmICgoKGwtPmZsYWdzICYgRFdBUkYyX0ZMQUdfQkVHSU5fU1RNVCkgIT0gMCkgIT0gbHMuc20uaXNfc3RtdCkKLSAgICB7Ci0gICAgICBhbnlfb3V0cHV0ID0gMTsKLSAgICAgIG91dF9vcGNvZGUgKERXX0xOU19uZWdhdGVfc3RtdCk7Ci0gICAgfQotCi0gIGlmIChsLT5mbGFncyAmIERXQVJGMl9GTEFHX0JFR0lOX0JMT0NLKQotICAgIHsKLSAgICAgIGFueV9vdXRwdXQgPSAxOwotICAgICAgb3V0X29wY29kZSAoRFdfTE5TX3NldF9iYXNpY19ibG9jayk7Ci0gICAgfQotCi0gIGlmIChscy5zbS5saW5lICE9IGwtPmxpbmUpCi0gICAgewotICAgICAgYW55X291dHB1dCA9IDE7Ci0gICAgICBpZiAoYWRkciA8IGxzLnNtLmFkZHIpCi0JewotCSAgLyogVGhpcyBoYXBwZW5zIHdoZW4gYSBuZXcgZnJhZyBnb3QgYWxsb2NhdGVkIChmb3Igd2hhdGV2ZXIKLQkgICAgIHJlYXNvbikuICBEZWFsIHdpdGggaXQgYnkgZ2VuZXJhdGluZyBhIHJlZmVyZW5jZSBzeW1ib2wuCi0JICAgICBOb3RlOiBubyBlbmRfc2VxdWVuY2UgbmVlZHMgdG8gYmUgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlCi0JICAgICBhZGRyZXNzIGRpZCBub3QgcmVhbGx5IGRlY3JlYXNlIChvbmx5IHRoZSByZWZlcmVuY2UgcG9pbnQKLQkgICAgIGNoYW5nZWQpLgotCi0JICAgICA/Pz8gUGVyaGFwcyB3ZSBzaG91bGQgZGlyZWN0bHkgY2hlY2sgZm9yIGEgY2hhbmdlIG9mCi0JICAgICBmcmFnX25vdyBpbnN0ZWFkPyAgKi8KLQkgIG91dF9zZXRfYWRkciAoYWRkcik7Ci0JICBscy5zbS5hZGRyID0gYWRkcjsKLQl9Ci0gICAgICBnZW5fYWRkcl9saW5lIChsLT5saW5lIC0gbHMuc20ubGluZSwKLQkJICAgICAoYWRkciAtIGxzLnNtLmFkZHIpIC8gRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RIKTsKLSAgICAgIGxzLnNtLmJhc2ljX2Jsb2NrID0gMDsKLSAgICAgIGxzLnNtLmxpbmUgPSBsLT5saW5lOwotICAgICAgbHMuc20uYWRkciA9IGFkZHI7Ci0gICAgfQotCi0gIHN1YnNlZ19zZXQgKHNhdmVkX3NlZywgc2F2ZWRfc3Vic2VnKTsKLQotICBscy5udW1fbGluZV9lbnRyaWVzICs9IGFueV9vdXRwdXQ7Ci0gIGlmIChhbnlfb3V0cHV0KQotICAgIGxzLnNtLmVtcHR5X3NlcXVlbmNlID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLWdlbl9kaXJfbGlzdCAoKQotewotICBjaGFyICpzdHIsICpzbGFzaCwgKmRpcl9saXN0LCAqZHAsICpjcDsKLSAgaW50IGksIGosIG51bV9kaXJzOwotCi0gIGRpcl9saXN0ID0gZnJhZ19tb3JlICgwKTsKLSAgbnVtX2RpcnMgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBscy5udW1fZmlsZW5hbWVzOyArK2kpCi0gICAgewotICAgICAgc3RyID0gbHMuZmlsZVtpXS5uYW1lOwotICAgICAgc2xhc2ggPSBzdHJyY2hyIChzdHIsICcvJyk7Ci0gICAgICBpZiAoc2xhc2gpCi0JewotCSAgKnNsYXNoID0gJ1wwJzsKLQkgIGZvciAoaiA9IDAsIGRwID0gZGlyX2xpc3Q7IGogPCBudW1fZGlyczsgKytqKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNtcCAoc3RyLCBkcCkgPT0gMCkKLQkJewotCQkgIGxzLmZpbGVbaV0uZGlyID0gaiArIDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBkcCArPSBzdHJsZW4gKGRwKTsKLQkgICAgfQotCSAgaWYgKGogPj0gbnVtX2RpcnMpCi0JICAgIHsKLQkgICAgICAvKiBkaWRuJ3QgZmluZCB0aGlzIGRpcmVjdG9yeTogYXBwZW5kIGl0IHRvIHRoZSBsaXN0ICovCi0JICAgICAgc2l6ZV90IHNpemUgPSBzdHJsZW4gKHN0cikgKyAxOwotCSAgICAgIGNwID0gZnJhZ19tb3JlIChzaXplKTsKLQkgICAgICBtZW1jcHkgKGNwLCBzdHIsIHNpemUpOwotCSAgICAgIGxzLmZpbGVbaV0uZGlyID0gKytudW1fZGlyczsKLQkgICAgfQotCSAgKnNsYXNoID0gJy8nOwotCSAgbHMuZmlsZVtpXS5uYW1lID0gc2xhc2ggKyAxOwotCX0KLSAgICB9Ci0gIG91dF9ieXRlICgnXDAnKTsJLyogdGVybWluYXRlIGRpcmVjdG9yeSBsaXN0ICovCi19Ci0KLXN0YXRpYyB2b2lkCi1nZW5fZmlsZV9saXN0ICgpCi17Ci0gIHNpemVfdCBzaXplOwotICBjaGFyICpjcDsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGxzLm51bV9maWxlbmFtZXM7ICsraSkKLSAgICB7Ci0gICAgICBzaXplID0gc3RybGVuIChscy5maWxlW2ldLm5hbWUpICsgMTsKLSAgICAgIGNwID0gZnJhZ19tb3JlIChzaXplKTsKLSAgICAgIG1lbWNweSAoY3AsIGxzLmZpbGVbaV0ubmFtZSwgc2l6ZSk7Ci0KLSAgICAgIG91dF91bGViMTI4IChscy5maWxlW2ldLmRpcik7CS8qIGRpcmVjdG9yeSBudW1iZXIgKi8KLSAgICAgIG91dF91bGViMTI4ICgwKTsJCQkvKiBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgKi8KLSAgICAgIG91dF91bGViMTI4ICgwKTsJCQkvKiBmaWxlc2l6ZSAqLwotICAgIH0KLSAgb3V0X2J5dGUgKDApOwkJLyogdGVybWluYXRlIGZpbGVuYW1lIGxpc3QgKi8KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3N0YXRzICh0b3RhbF9zaXplKQotICAgICB1bnNpZ25lZCBsb25nIHRvdGFsX3NpemU7Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpvcGNfbmFtZVtdID0KLSAgICB7Ci0gICAgICAiZXh0ZW5kZWQiLCAiY29weSIsICJhZHZhbmNlX3BjIiwgImFkdmFuY2VfbGluZSIsICJzZXRfZmlsZSIsCi0gICAgICAic2V0X2NvbHVtbiIsICJuZWdhdGVfc3RtdCIsICJzZXRfYmFzaWNfYmxvY2siLCAiY29uc3RfYWRkX3BjIiwKLSAgICAgICJmaXhlZF9hZHZhbmNlX3BjIgotICAgIH07Ci0gIGludCBpLCBqOwotCi0gIGZwcmludGYgKHN0ZGVyciwgIkF2ZXJhZ2Ugc2l6ZTogJWcgYnl0ZXMvbGluZVxuIiwKLQkgICB0b3RhbF9zaXplIC8gKGRvdWJsZSkgbHMubnVtX2xpbmVfZW50cmllcyk7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAiXG5TdGFuZGFyZCBvcGNvZGUgaGlzdG9ncmFtOlxuIik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3BjX25hbWUpL3NpemVvZiAob3BjX25hbWVbMF0pOyArK2kpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXMiLCBvcGNfbmFtZVtpXSk7Ci0gICAgICBmb3IgKGogPSBzdHJsZW4gKG9wY19uYW1lW2ldKTsgaiA8IDE2OyArK2opCi0JZnByaW50ZiAoc3RkZXJyLCAiICIpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiOiAldVxuIiwgbHMub3Bjb2RlX2hpc3RbaV0pOwotICAgIH0KLQotICBmcHJpbnRmIChzdGRlcnIsICJcblNwZWNpYWwgb3Bjb2RlczpcbmFkZHJcdFx0XHRcdGxpbmUgc2tpcFxuIik7Ci0KLSAgZnByaW50ZiAoc3RkZXJyLCAic2tpcDogIik7Ci0gIGZvciAoaiA9IERXQVJGMl9MSU5FX0JBU0U7IGogPCBEV0FSRjJfTElORV9CQVNFICsgRFdBUkYyX0xJTkVfUkFOR0U7ICsraikKLSAgICBmcHJpbnRmIChzdGRlcnIsICIlM2QiLCBqKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4tLS0tLSIpOwotCi0gIGZvciAoOyBpIDwgMjU2OyArK2kpCi0gICAgewotICAgICAgaiA9IFNQRUNJQUxfTElORSAoaSk7Ci0gICAgICBpZiAoaiA9PSBEV0FSRjJfTElORV9CQVNFKQotCWZwcmludGYgKHN0ZGVyciwgIlxuJTR1OiAiLAotCQkgRFdBUkYyX0xJTkVfTUlOX0lOU05fTEVOR1RIKlNQRUNJQUxfQUREUiAoaSkpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiICUydSIsIGxzLm9wY29kZV9oaXN0W2ldKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXZvaWQKLWR3YXJmMl9maW5pc2ggKCkKLXsKLSAgYWRkcmVzc1QgYm9keV9zaXplLCB0b3RhbF9zaXplLCBwcm9sb2dfc2l6ZTsKLSAgc3Vic2VnVCBzYXZlZF9zdWJzZWc7Ci0gIHNlZ1Qgc2F2ZWRfc2VnOwotICBjaGFyICpjcDsKLQotICBpZiAoIWxzLmxpbmVfc2VnKQotICAgIC8qIG5vIC5kZWJ1Z19saW5lIHNlZ21lbnQsIG5vIHdvcmsgdG8gZG8uLi4gKi8KLSAgICByZXR1cm47Ci0KLSAgc2F2ZWRfc2VnID0gbm93X3NlZzsKLSAgc2F2ZWRfc3Vic2VnID0gbm93X3N1YnNlZzsKLQotICBpZiAoIWxzLnNtLmVtcHR5X3NlcXVlbmNlKQotICAgIG91dF9lbmRfc2VxdWVuY2UgKCk7Ci0gIHRvdGFsX3NpemUgPSBib2R5X3NpemUgPSBmcmFnX25vd19maXggKCk7Ci0KLSAgLyogbm93IGdlbmVyYXRlIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGUgbGlzdHM6ICovCi0gIHN1YnNlZ19zZXQgKGxzLmxpbmVfc2VnLCBETF9GSUxFUyk7Ci0gIGdlbl9kaXJfbGlzdCAoKTsKLSAgZ2VuX2ZpbGVfbGlzdCAoKTsKLSAgdG90YWxfc2l6ZSArPSBmcmFnX25vd19maXggKCk7Ci0KLSAgLyogYW5kIG5vdyB0aGUgaGVhZGVyICgic3RhdGVtZW50IHByb2dyYW0gcHJvbG9nIiwgaW4gRFdBUkYyIGxpbmdvLi4uKSAqLwotICBzdWJzZWdfc2V0IChscy5saW5lX3NlZywgRExfUFJPTE9HKTsKLQotICBjcCA9IGZyYWdfbW9yZSAoMTUgKyBEV0FSRjJfTElORV9PUENPREVfQkFTRSAtIDEpOwotCi0gIHRvdGFsX3NpemUgKz0gZnJhZ19ub3dfZml4ICgpOwotICBwcm9sb2dfc2l6ZSA9IHRvdGFsX3NpemUgLSBib2R5X3NpemUgLSAxMDsKLQotIyBkZWZpbmUgU1RVRkYodmFsLHNpemUpCW1kX251bWJlcl90b19jaGFycyAoY3AsIHZhbCwgc2l6ZSk7IGNwICs9IHNpemU7Ci0gIFNUVUZGICh0b3RhbF9zaXplIC0gNCwgNCk7CS8qIGxlbmd0aCAqLwotICBTVFVGRiAoMiwgMik7CQkJLyogdmVyc2lvbiAqLwotICBTVFVGRiAocHJvbG9nX3NpemUsIDQpOwkvKiBwcm9sb2d1ZV9sZW5ndGggKi8KLSAgU1RVRkYgKERXQVJGMl9MSU5FX01JTl9JTlNOX0xFTkdUSCwgMSk7Ci0gIFNUVUZGIChEV0FSRjJfTElORV9ERUZBVUxUX0lTX1NUTVQsIDEpOwotICBTVFVGRiAoRFdBUkYyX0xJTkVfQkFTRSwgMSk7Ci0gIFNUVUZGIChEV0FSRjJfTElORV9SQU5HRSwgMSk7Ci0gIFNUVUZGIChEV0FSRjJfTElORV9PUENPREVfQkFTRSwgMSk7Ci0KLSAgLyogc3RhbmRhcmRfb3Bjb2RlX2xlbmd0aHM6ICovCi0gIFNUVUZGICgwLCAxKTsJCQkvKiBEV19MTlNfY29weSAqLwotICBTVFVGRiAoMSwgMSk7CQkJLyogRFdfTE5TX2FkdmFuY2VfcGMgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19hZHZhbmNlX2xpbmUgKi8KLSAgU1RVRkYgKDEsIDEpOwkJCS8qIERXX0xOU19zZXRfZmlsZSAqLwotICBTVFVGRiAoMSwgMSk7CQkJLyogRFdfTE5TX3NldF9jb2x1bW4gKi8KLSAgU1RVRkYgKDAsIDEpOwkJCS8qIERXX0xOU19uZWdhdGVfc3RtdCAqLwotICBTVFVGRiAoMCwgMSk7CQkJLyogRFdfTE5TX3NldF9iYXNpY19ibG9jayAqLwotICBTVFVGRiAoMCwgMSk7CQkJLyogRFdfTE5TX2NvbnN0X2FkZF9wYyAqLwotICBTVFVGRiAoMSwgMSk7CQkJLyogRFdfTE5TX2ZpeGVkX2FkdmFuY2VfcGMgKi8KLQotICBzdWJzZWdfc2V0IChzYXZlZF9zZWcsIHNhdmVkX3N1YnNlZyk7Ci0KLSAgaWYgKGZsYWdfZGVidWcpCi0gICAgcHJpbnRfc3RhdHMgKHRvdGFsX3NpemUpOwotfQotCi12b2lkCi1kd2FyZjJfZGlyZWN0aXZlX2ZpbGUgKGR1bW15KQotICAgICBpbnQgZHVtbXk7Ci17Ci0gIGludCBsZW47Ci0KLSAgLyogQ29udGludWUgdG8gYWNjZXB0IGEgYmFyZSBzdHJpbmcgYW5kIHBhc3MgaXQgb2ZmLiAgKi8KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0gICAgewotICAgICAgc19hcHBfZmlsZSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxzLmFueV9kd2FyZjJfZGlyZWN0aXZlcyA9IDE7Ci0KLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfTk9ORSkKLSAgICAvKiBBdXRvbWF0aWNhbGx5IHR1cm4gb24gRFdBUkYyIGRlYnVnIGluZm8gdW5sZXNzIHNvbWV0aGluZyBlbHNlCi0gICAgICAgaGFzIGJlZW4gc2VsZWN0ZWQuICAqLwotICAgIGRlYnVnX3R5cGUgPSBERUJVR19EV0FSRjI7Ci0KLSAgbHMuY3VycmVudC5maWxlbnVtID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGxzLmN1cnJlbnQuZmlsZW5hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbik7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotdm9pZAotZHdhcmYyX2RpcmVjdGl2ZV9sb2MgKGR1bW15KQotICAgICBpbnQgZHVtbXk7Ci17Ci0gIGxzLmFueV9kd2FyZjJfZGlyZWN0aXZlcyA9IDE7Ci0KLSAgbHMuY3VycmVudC5maWxlbnVtID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbHMuY3VycmVudC5saW5lID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgbHMuY3VycmVudC5jb2x1bW4gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBscy5jdXJyZW50LmZsYWdzID0gRFdBUkYyX0ZMQUdfQkVHSU5fU1RNVDsKLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGlmIChsaXN0aW5nKQotICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKGxzLmN1cnJlbnQubGluZSk7Ci0jZW5kaWYKLX0KLQotdm9pZAotZHdhcmYyX3doZXJlIChsaW5lKQotICAgICBzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyAqbGluZTsKLXsKLSAgaWYgKGxzLmFueV9kd2FyZjJfZGlyZWN0aXZlcykKLSAgICAqbGluZSA9IGxzLmN1cnJlbnQ7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193aGVyZSAoJmxpbmUtPmZpbGVuYW1lLCAmbGluZS0+bGluZSk7Ci0gICAgICBsaW5lLT5maWxlbnVtID0gMDsKLSAgICAgIGxpbmUtPmNvbHVtbiA9IDA7Ci0gICAgICBsaW5lLT5mbGFncyA9IERXQVJGMl9GTEFHX0JFR0lOX1NUTVQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL2R3YXJmMmRiZy5oIGIvZ2FzL2R3YXJmMmRiZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2VlYzFjLi4wMDAwMDAwCi0tLSBhL2dhcy9kd2FyZjJkYmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qIGR3YXJmMmRiZy5oIC0gRFdBUkYyIGRlYnVnIHN1cHBvcnQKLSAgIENvcHlyaWdodCAoQykgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBBU19EV0FSRjJEQkdfSAotI2RlZmluZSBBU19EV0FSRjJEQkdfSAotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2RlZmluZSBEV0FSRjJfRkxBR19CRUdJTl9TVE1UCSgxIDw8IDApCS8qIGJlZ2lubmluZyBvZiBzdGF0ZW1lbnQgKi8KLSNkZWZpbmUgRFdBUkYyX0ZMQUdfQkVHSU5fQkxPQ0sJKDEgPDwgMSkJLyogYmVnaW5uaW5nIG9mIGJhc2ljIGJsb2NrICovCi0KLXN0cnVjdCBkd2FyZjJfbGluZV9pbmZvCi0gIHsKLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICB1bnNpZ25lZCBpbnQgZmlsZW51bTsKLSAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICB1bnNpZ25lZCBpbnQgY29sdW1uOwotICAgIHVuc2lnbmVkIGludCBmbGFnczsKLSAgfTsKLQotLyogSW1wbGVtZW50cyB0aGUgLmZpbGUgRklMRU5PICJGSUxFTkFNRSIgZGlyZWN0aXZlLiAgRklMRU5PIGNhbiBiZSAwCi0gICB0byBpbmRpY2F0ZSB0aGF0IG5vIGZpbGUgbnVtYmVyIGhhcyBiZWVuIGFzc2lnbmVkLiAgQWxsIHJlYWwgZmlsZQotICAgbnVtYmVyIG11c3QgYmUgPjAuICAqLwotZXh0ZXJuIHZvaWQgZHdhcmYyX2RpcmVjdGl2ZV9maWxlIFBBUkFNUyAoKGludCBkdW1teSkpOwotCi0vKiBJbXBsZW1lbnRzIHRoZSAubG9jIEZJTEVOTyBMSU5FTk8gW0NPTFVNTl0gZGlyZWN0aXZlLiAgRklMRU5PIGlzCi0gICB0aGUgZmlsZSBudW1iZXIsIExJTkVOTyB0aGUgbGluZSBudW1iZXIgYW5kIHRoZSAob3B0aW9uYWwpIENPTFVNTgotICAgdGhlIGNvbHVtbiBvZiB0aGUgc291cmNlIGNvZGUgdGhhdCB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uCi0gICBjb3JyZXNwb25kcyB0by4gIEZJTEVOTyBjYW4gYmUgMCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlbmFtZQotICAgc3BlY2lmaWVkIGJ5IHRoZSB0ZXh0dWFsbHkgbW9zdCByZWNlbnQgLmZpbGUgZGlyZWN0aXZlIHNob3VsZCBiZQotICAgdXNlZC4gICovCi1leHRlcm4gdm9pZCBkd2FyZjJfZGlyZWN0aXZlX2xvYyBQQVJBTVMgKChpbnQgZHVtbXkpKTsKLQotLyogUmV0dXJucyB0aGUgY3VycmVudCBzb3VyY2UgaW5mb3JtYXRpb24uICBJZiAuZmlsZSBkaXJlY3RpdmVzIGhhdmUKLSAgIGJlZW4gZW5jb3VudGVyZWQsIHRoZSBpbmZvIGZvciB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgZmlsZSBpcwotICAgcmV0dXJuZWQuICBPdGhlcndpc2UsIHRoZSBpbmZvIGZvciB0aGUgYXNzZW1ibHkgc291cmNlIGZpbGUgaXMKLSAgIHJldHVybmVkLiAgKi8KLWV4dGVybiB2b2lkIGR3YXJmMl93aGVyZSBQQVJBTVMgKChzdHJ1Y3QgZHdhcmYyX2xpbmVfaW5mbyAqbCkpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyAuZGVidWdfbGluZSBpbmZvIGJhc2VkIG9uIHRoZSBhZGRyZXNzIGFuZAotICAgc291cmNlIGluZm9ybWF0aW9uIHBhc3NlZCBpbiB0aGUgYXJndW1lbnRzLiAgQUREUiBzaG91bGQgYmUgdGhlCi0gICBmcmFnLXJlbGF0aXZlIG9mZnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdGhlIGluZm9ybWF0aW9uIGlzIGZvciBhbmQKLSAgIEwgaXMgdGhlIHNvdXJjZSBpbmZvcm1hdGlvbiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhhdAotICAgYWRkcmVzcy4gKi8KLWV4dGVybiB2b2lkIGR3YXJmMl9nZW5fbGluZV9pbmZvIFBBUkFNUyAoKGFkZHJlc3NUIGFkZHIsCi0JCQkJCSAgc3RydWN0IGR3YXJmMl9saW5lX2luZm8gKmwpKTsKLQotLyogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIG90aGVyIGlucHV0IGlzIHByb2Nlc3NlZCB0byBmaW5pc2ggdXAgdGhlCi0gICAuZGVidWdfbGluZSBzZWN0aW9uLiAgKi8KLWV4dGVybiB2b2lkIGR3YXJmMl9maW5pc2ggUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogQVNfRFdBUkYyREJHX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9lY29mZi5jIGIvZ2FzL2Vjb2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNmM4YzQuLjAwMDAwMDAKLS0tIGEvZ2FzL2Vjb2ZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzE4ICswLDAgQEAKLS8qIEVDT0ZGIGRlYnVnZ2luZyBzdXBwb3J0LgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSB3YXMgcHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4gIEEKLSAgIGdvb2QgZGVhbCBvZiBpdCBjb21lcyBkaXJlY3RseSBmcm9tIG1pcHMtdGZpbGUuYywgYnkgTWljaGFlbAotICAgTWVpc3NuZXIgPG1laXNzbmVyQG9zZi5vcmc+LgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi0vKiBUaGlzIGZpbGUgaXMgY29tcGlsZWQgY29uZGl0aW9uYWxseSBmb3IgdGhvc2UgdGFyZ2V0cyB3aGljaCB1c2UKLSAgIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAoZS5nLiwgTUlQUyBFQ09GRiwgTUlQUyBFTEYsIEFscGhhCi0gICBFQ09GRikuICAqLwotCi0jaW5jbHVkZSAiZWNvZmYuaCIKLQotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImNvZmYvc3ltY29uc3QuaCIKLSNpbmNsdWRlICJhb3V0L3N0YWJfZ251LmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0vKiBXaHkgaXNuJ3QgdGhpcyBpbiBjb2ZmL3N5bS5oPyAgKi8KLSNkZWZpbmUgU1RfUkZERVNDQVBFIDB4ZmZmCi0KLS8qIFRoaXMgZmlsZSBjb25zdHJ1Y3RzIHRoZSBpbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBFQ09GRiBkZWJ1Z2dpbmcKLSAgIGZvcm1hdC4gIEl0IGp1c3QgYnVpbGRzIGEgbGFyZ2UgYmxvY2sgb2YgZGF0YS4KLQotICAgV2Ugc3VwcG9ydCBib3RoIEVDT0ZGIHN0eWxlIGRlYnVnZ2luZyBhbmQgc3RhYnMgZGVidWdnaW5nICh0aGUKLSAgIHN0YWJzIHN5bWJvbHMgYXJlIGVuY2Fwc3VsYXRlZCBpbiBFQ09GRiBzeW1ib2xzKS4gIFRoaXMgc2hvdWxkIGxldAotICAgdXMgaGFuZGxlIGFueXRoaW5nIHRoZSBjb21waWxlciBtaWdodCB0aHJvdyBhdCB1cy4gICovCi0KLS8qIEhlcmUgaXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgTUlQUyBFQ09GRiBzeW1ib2wgdGFibGUsIGJ5Ci0gICBNaWNoYWVsIE1laXNzbmVyLiAgVGhlIE1JUFMgc3ltYm9sIHRhYmxlIGhhcyB0aGUgZm9sbG93aW5nIHBpZWNlczoKLQotCVN5bWJvbGljIEhlYWRlcgotCSAgICB8Ci0JICAgICstLQlBdXhpbGlhcnkgU3ltYm9scwotCSAgICB8Ci0JICAgICstLQlEZW5zZSBudW1iZXIgdGFibGUKLQkgICAgfAotCSAgICArLS0JT3B0aW1pemVyIFN5bWJvbHMKLQkgICAgfAotCSAgICArLS0JRXh0ZXJuYWwgU3RyaW5ncwotCSAgICB8Ci0JICAgICstLQlFeHRlcm5hbCBTeW1ib2xzCi0JICAgIHwKLQkgICAgKy0tCVJlbGF0aXZlIGZpbGUgZGVzY3JpcHRvcnMKLQkgICAgfAotCSAgICArLS0JRmlsZSB0YWJsZQotCQkgICAgfAotCQkgICAgKy0tCVByb2NlZHVyZSB0YWJsZQotCQkgICAgfAotCQkgICAgKy0tCUxpbmUgbnVtYmVyIHRhYmxlCi0JCSAgICB8Ci0JCSAgICArLS0JTG9jYWwgU3RyaW5ncwotCQkgICAgfAotCQkgICAgKy0tCUxvY2FsIFN5bWJvbHMKLQotICAgVGhlIHN5bWJvbGljIGhlYWRlciBwb2ludHMgdG8gZWFjaCBvZiB0aGUgb3RoZXIgdGFibGVzLCBhbmQgYWxzbwotICAgY29udGFpbnMgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgSXQgYWxzbyBjb250YWlucyBhIG1hZ2ljIG51bWJlcgotICAgYW5kIE1JUFMgY29tcGlsZXIgdmVyc2lvbiBudW1iZXIsIHN1Y2ggYXMgMi4wLgotCi0gICBUaGUgYXV4aWxpYXJ5IHRhYmxlIGlzIGEgc2VyaWVzIG9mIDMyIGJpdCBpbnRlZ2VycywgdGhhdCBhcmUKLSAgIHJlZmVyZW5jZWQgYXMgbmVlZGVkIGZyb20gdGhlIGxvY2FsIHN5bWJvbCB0YWJsZS4gIFVubGlrZSBzdGFuZGFyZAotICAgQ09GRiwgdGhlIGF1eC4gIGluZm9ybWF0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgc3ltYm9sIHRoYXQgdXNlcwotICAgaXQsIGJ1dCByYXRoZXIgaXMgYSBzZXBhcmF0ZSB0YWJsZS4gIEluIHRoZW9yeSwgdGhpcyB3b3VsZCBhbGxvdwotICAgdGhlIE1JUFMgY29tcGlsZXJzIHRvIGNvbGxhcHNlIGR1cGxpY2F0ZSBhdXguIGVudHJpZXMsIGJ1dCBJJ3ZlIG5vdAotICAgbm90aWNlZCB0aGlzIGhhcHBlbmluZyB3aXRoIHRoZSAxLjMxIGNvbXBpbGVyIHN1aXRlLiAgVGhlIGRpZmZlcmVudAotICAgdHlwZXMgb2YgYXV4LiBlbnRyaWVzIGFyZToKLQotICAgIDEpCWRuTG93OiBMb3cgYm91bmQgb24gYXJyYXkgZGltZW5zaW9uLgotCi0gICAgMikJZG5IaWdoOiBIaWdoIGJvdW5kIG9uIGFycmF5IGRpbWVuc2lvbi4KLQotICAgIDMpCWlzeW06IEluZGV4IHRvIHRoZSBsb2NhbCBzeW1ib2wgd2hpY2ggaXMgdGhlIHN0YXJ0IG9mIHRoZQotCWZ1bmN0aW9uIGZvciB0aGUgZW5kIG9mIGZ1bmN0aW9uIGZpcnN0IGF1eC4gZW50cnkuCi0KLSAgICA0KQl3aWR0aDogV2lkdGggb2Ygc3RydWN0dXJlcyBhbmQgYml0ZmllbGRzLgotCi0gICAgNSkJY291bnQ6IENvdW50IG9mIHJhbmdlcyBmb3IgdmFyaWFudCBwYXJ0LgotCi0gICAgNikJcm5keDogQSByZWxhdGl2ZSBpbmRleCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICBUaGUgcmVsYXRpdmUKLQlpbmRleCBmaWVsZCBoYXMgdHdvIHBhcnRzOiByZmQgd2hpY2ggaXMgYSBwb2ludGVyIGludG8gdGhlCi0JcmVsYXRpdmUgZmlsZSBpbmRleCB0YWJsZSBvciBTVF9SRkRFU0NBUEUgd2hpY2ggc2F5cyB0aGUgbmV4dAotCWF1eC4gZW50cnkgaXMgdGhlIGZpbGUgbnVtYmVyLCBhbmQgaW5kZXg6IHdoaWNoIGlzIHRoZSBwb2ludGVyCi0JaW50byB0aGUgbG9jYWwgc3ltYm9sIHdpdGhpbiBhIGdpdmVuIGZpbGUgdGFibGUuICBUaGlzIGlzIGZvcgotCXRoaW5ncyBsaWtlIHJlZmVyZW5jZXMgdG8gdHlwZXMgZGVmaW5lZCBpbiBhbm90aGVyIGZpbGUuCi0KLSAgICA3KQlUeXBlIGluZm9ybWF0aW9uOiBUaGlzIGlzIGxpa2UgdGhlIENPRkYgdHlwZSBiaXRzLCBleGNlcHQgaXQKLQlpcyAzMiBiaXRzIGluc3RlYWQgb2YgMTY7IHRoZXkgc3RpbGwgaGF2ZSByb29tIHRvIGFkZCBuZXcKLQliYXNpYyB0eXBlczsgYW5kIHRoZXkgY2FuIGhhbmRsZSBtb3JlIHRoYW4gNiBsZXZlbHMgb2YgYXJyYXksCi0JcG9pbnRlciwgZnVuY3Rpb24sIGV0Yy4gIEVhY2ggdHlwZSBpbmZvcm1hdGlvbiBmaWVsZCBjb250YWlucwotCXRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIG1lbWJlcnM6Ci0KLQkgICAgYSkJZkJpdGZpZWxkOiBhIGJpdCB0aGF0IHNheXMgdGhpcyBpcyBhIGJpdGZpZWxkLCBhbmQgdGhlCi0JCXNpemUgaW4gYml0cyBmb2xsb3dzIGFzIHRoZSBuZXh0IGF1eC4gZW50cnkuCi0KLQkgICAgYikJY29udGludWVkOiBhIGJpdCB0aGF0IHNheXMgdGhlIG5leHQgYXV4LiBlbnRyeSBpcyBhCi0JCWNvbnRpbnVhdGlvbiBvZiB0aGUgY3VycmVudCB0eXBlIGluZm9ybWF0aW9uIChpbiBjYXNlCi0JCXRoZXJlIGFyZSBtb3JlIHRoYW4gNiBsZXZlbHMgb2YgYXJyYXkvcHRyL2Z1bmN0aW9uKS4KLQotCSAgICBjKQlidDogYW4gaW50ZWdlciBjb250YWluaW5nIHRoZSBiYXNlIHR5cGUgYmVmb3JlIGFkZGluZwotCQlhcnJheSwgcG9pbnRlciwgZnVuY3Rpb24sIGV0Yy4gcXVhbGlmaWVycy4gIFRoZQotCQljdXJyZW50IGJhc2UgdHlwZXMgdGhhdCBJIGhhdmUgZG9jdW1lbnRhdGlvbiBmb3IgYXJlOgotCi0JCQlidE5pbAkJLS0gdW5kZWZpbmVkCi0JCQlidEFkcgkJLS0gYWRkcmVzcyAtIGludGVnZXIgc2FtZSBzaXplIGFzIHB0cgotCQkJYnRDaGFyCQktLSBjaGFyYWN0ZXIKLQkJCWJ0VUNoYXIJCS0tIHVuc2lnbmVkIGNoYXJhY3RlcgotCQkJYnRTaG9ydAkJLS0gc2hvcnQKLQkJCWJ0VVNob3J0CS0tIHVuc2lnbmVkIHNob3J0Ci0JCQlidEludAkJLS0gaW50Ci0JCQlidFVJbnQJCS0tIHVuc2lnbmVkIGludAotCQkJYnRMb25nCQktLSBsb25nCi0JCQlidFVMb25nCQktLSB1bnNpZ25lZCBsb25nCi0JCQlidEZsb2F0CQktLSBmbG9hdCAocmVhbCkKLQkJCWJ0RG91YmxlCS0tIERvdWJsZSAocmVhbCkKLQkJCWJ0U3RydWN0CS0tIFN0cnVjdHVyZSAoUmVjb3JkKQotCQkJYnRVbmlvbgkJLS0gVW5pb24gKHZhcmlhbnQpCi0JCQlidEVudW0JCS0tIEVudW1lcmF0ZWQKLQkJCWJ0VHlwZWRlZgktLSBkZWZpbmVkIHZpYSBhIHR5cGVkZWYgaXN5bVJlZgotCQkJYnRSYW5nZQkJLS0gc3VicmFuZ2Ugb2YgaW50Ci0JCQlidFNldAkJLS0gcGFzY2FsIHNldHMKLQkJCWJ0Q29tcGxleAktLSBmb3J0cmFuIGNvbXBsZXgKLQkJCWJ0RENvbXBsZXgJLS0gZm9ydHJhbiBkb3VibGUgY29tcGxleAotCQkJYnRJbmRpcmVjdAktLSBmb3J3YXJkIG9yIHVubmFtZWQgdHlwZWRlZgotCQkJYnRGaXhlZERlYwktLSBGaXhlZCBEZWNpbWFsCi0JCQlidEZsb2F0RGVjCS0tIEZsb2F0IERlY2ltYWwKLQkJCWJ0U3RyaW5nCS0tIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcKLQkJCWJ0Qml0CQktLSBBbGlnbmVkIEJpdCBTdHJpbmcKLQkJCWJ0UGljdHVyZQktLSBQaWN0dXJlCi0JCQlidFZvaWQJCS0tIFZvaWQgKE1JUFMgY2MgcmV2aXNpb24gPj0gMi4wMCkKLQotCSAgICBkKQl0cTAgLSB0cTU6IHR5cGUgcXVhbGlmaWVyIGZpZWxkcyBhcyBuZWVkZWQuICBUaGUKLQkJY3VycmVudCB0eXBlIHF1YWxpZmllciBmaWVsZHMgSSBoYXZlIGRvY3VtZW50YXRpb24gZm9yCi0JCWFyZToKLQotCQkJdHFOaWwJCS0tIG5vIG1vcmUgcXVhbGlmaWVycwotCQkJdHFQdHIJCS0tIHBvaW50ZXIKLQkJCXRxUHJvYwkJLS0gcHJvY2VkdXJlCi0JCQl0cUFycmF5CQktLSBhcnJheQotCQkJdHFGYXIJCS0tIDgwODYgZmFyIHBvaW50ZXJzCi0JCQl0cVZvbAkJLS0gdm9sYXRpbGUKLQotCi0gICBUaGUgZGVuc2UgbnVtYmVyIHRhYmxlIGlzIHVzZWQgaW4gdGhlIGZyb250IGVuZHMsIGFuZCBkaXNhcHBlYXJzIGJ5Ci0gICB0aGUgdGltZSB0aGUgLm8gaXMgY3JlYXRlZC4KLQotICAgV2l0aCB0aGUgMS4zMSBjb21waWxlciBzdWl0ZSwgdGhlIG9wdGltaXphdGlvbiBzeW1ib2xzIGRvbid0IHNlZW0KLSAgIHRvIGJlIHVzZWQgYXMgZmFyIGFzIEkgY2FuIHRlbGwuCi0KLSAgIFRoZSBsaW5rZXIgaXMgdGhlIGZpcnN0IGVudGl0eSB0aGF0IGNyZWF0ZXMgdGhlIHJlbGF0aXZlIGZpbGUKLSAgIGRlc2NyaXB0b3IgdGFibGUsIGFuZCBJIGJlbGlldmUgaXQgaXMgdXNlZCBzbyB0aGF0IHRoZSBpbmRpdmlkdWFsCi0gICBmaWxlIHRhYmxlIHBvaW50ZXJzIGRvbid0IGhhdmUgdG8gYmUgcmV3cml0dGVuIHdoZW4gdGhlIG9iamVjdHMgYXJlCi0gICBtZXJnZWQgdG9nZXRoZXIgaW50byB0aGUgcHJvZ3JhbSBmaWxlLgotCi0gICBVbmxpa2UgQ09GRiwgdGhlIGJhc2ljIHN5bWJvbCAmIHN0cmluZyB0YWJsZXMgYXJlIHNwbGl0IGludG8KLSAgIGV4dGVybmFsIGFuZCBsb2NhbCBzeW1ib2xzL3N0cmluZ3MuICBUaGUgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbgotICAgb25seSBnb2VzIG9mZiBvZiB0aGUgZXh0ZXJuYWwgc3ltYm9sIHRhYmxlLCBhbmQgdGhlIGRlYnVnCi0gICBpbmZvcm1hdGlvbiBvbmx5IGdvZXMgb2ZmIG9mIHRoZSBpbnRlcm5hbCBzeW1ib2wgdGFibGUuICBUaGUKLSAgIGV4dGVybmFsIHN5bWJvbHMgY2FuIGhhdmUgbGlua3MgdG8gYW4gYXBwcm9wcmlhdGUgZmlsZSBpbmRleCBhbmQKLSAgIHN5bWJvbCB3aXRoaW4gdGhlIGZpbGUgdG8gZ2l2ZSBpdCB0aGUgYXBwcm9wcmlhdGUgdHlwZSBpbmZvcm1hdGlvbi4KLSAgIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGV4dGVybmFsIHN5bWJvbHMgYXJlIGFjdHVhbGx5IGxhcmdlciB0aGFuIHRoZQotICAgaW50ZXJuYWwgc3ltYm9scyAodG8gY29udGFpbiB0aGUgbGluayBpbmZvcm1hdGlvbiksIGFuZCBjb250YWluIHRoZQotICAgbG9jYWwgc3ltYm9sIHN0cnVjdHVyZSBhcyBhIG1lbWJlciwgdGhvdWdoIHRoaXMgbWVtYmVyIGlzIG5vdCB0aGUKLSAgIGZpcnN0IG1lbWJlciBvZiB0aGUgZXh0ZXJuYWwgc3ltYm9sIHN0cnVjdHVyZSAoISkuICBJIHN1c3BlY3QgdGhpcwotICAgc3BsaXQgaXMgdG8gbWFrZSBzdHJpcCBlYXNpZXIgdG8gZGVhbCB3aXRoLgotCi0gICBFYWNoIGZpbGUgdGFibGUgaGFzIG9mZnNldHMgZm9yIHdoZXJlIHRoZSBsaW5lIG51bWJlcnMsIGxvY2FsCi0gICBzdHJpbmdzLCBsb2NhbCBzeW1ib2xzLCBhbmQgcHJvY2VkdXJlIHRhYmxlIHN0YXJ0cyBmcm9tIHdpdGhpbiB0aGUKLSAgIGdsb2JhbCB0YWJsZXMsIGFuZCB0aGUgaW5kZXhzIGFyZSByZXNldCB0byAwIGZvciBlYWNoIG9mIHRob3NlCi0gICB0YWJsZXMgZm9yIHRoZSBmaWxlLgotCi0gICBUaGUgcHJvY2VkdXJlIHRhYmxlIGNvbnRhaW5zIHRoZSBiaW5hcnkgZXF1aXZhbGVudHMgb2YgdGhlIC5lbnQKLSAgIChzdGFydCBvZiB0aGUgZnVuY3Rpb24gYWRkcmVzcyksIC5mcmFtZSAod2hhdCByZWdpc3RlciBpcyB0aGUKLSAgIHZpcnR1YWwgZnJhbWUgcG9pbnRlciwgY29uc3RhbnQgb2Zmc2V0IGZyb20gdGhlIHJlZ2lzdGVyIHRvIG9idGFpbgotICAgdGhlIFZGUCwgYW5kIHdoYXQgcmVnaXN0ZXIgaG9sZHMgdGhlIHJldHVybiBhZGRyZXNzKSwgLm1hc2svLmZtYXNrCi0gICAoYml0bWFzayBvZiBzYXZlZCByZWdpc3RlcnMsIGFuZCB3aGVyZSB0aGUgZmlyc3QgcmVnaXN0ZXIgaXMgc3RvcmVkCi0gICByZWxhdGl2ZSB0byB0aGUgVkZQKSBhc3NlbWJsZXIgZGlyZWN0aXZlcy4gIEl0IGFsc28gY29udGFpbnMgdGhlCi0gICBsb3cgYW5kIGhpZ2ggYm91bmRzIG9mIHRoZSBsaW5lIG51bWJlcnMgaWYgZGVidWdnaW5nIGlzIHR1cm5lZCBvbi4KLQotICAgVGhlIGxpbmUgbnVtYmVyIHRhYmxlIGlzIGEgY29tcHJlc3NlZCBmb3JtIG9mIHRoZSBub3JtYWwgQ09GRiBsaW5lCi0gICB0YWJsZS4gIEVhY2ggbGluZSBudW1iZXIgZW50cnkgaXMgZWl0aGVyIDEgb3IgMyBieXRlcyBsb25nLCBhbmQKLSAgIGNvbnRhaW5zIGEgc2lnbmVkIGRlbHRhIGZyb20gdGhlIHByZXZpb3VzIGxpbmUsIGFuZCBhbiB1bnNpZ25lZAotICAgY291bnQgb2YgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhpcyBzdGF0ZW1lbnQgdGFrZXMuCi0KLSAgIFRoZSBsb2NhbCBzeW1ib2wgdGFibGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci0KLSAgICAxKQlpc3M6IGluZGV4IHRvIHRoZSBsb2NhbCBzdHJpbmcgdGFibGUgZ2l2aW5nIHRoZSBuYW1lIG9mIHRoZQotCXN5bWJvbC4KLQotICAgIDIpCXZhbHVlOiB2YWx1ZSBvZiB0aGUgc3ltYm9sIChhZGRyZXNzLCByZWdpc3RlciBudW1iZXIsIGV0Yy4pLgotCi0gICAgMykJc3Q6IHN5bWJvbCB0eXBlLiAgVGhlIGN1cnJlbnQgc3ltYm9sIHR5cGVzIGFyZToKLQotCSAgICBzdE5pbAkgIC0tIE51dGhpbicgc3BlY2lhbAotCSAgICBzdEdsb2JhbAkgIC0tIGV4dGVybmFsIHN5bWJvbAotCSAgICBzdFN0YXRpYwkgIC0tIHN0YXRpYwotCSAgICBzdFBhcmFtCSAgLS0gcHJvY2VkdXJlIGFyZ3VtZW50Ci0JICAgIHN0TG9jYWwJICAtLSBsb2NhbCB2YXJpYWJsZQotCSAgICBzdExhYmVsCSAgLS0gbGFiZWwKLQkgICAgc3RQcm9jCSAgLS0gRXh0ZXJuYWwgUHJvY2VkdXJlCi0JICAgIHN0QmxvY2sJICAtLSBiZWdpbm5pbmcgb2YgYmxvY2sKLQkgICAgc3RFbmQJICAtLSBlbmQgKG9mIGFueXRoaW5nKQotCSAgICBzdE1lbWJlcgkgIC0tIG1lbWJlciAob2YgYW55dGhpbmcpCi0JICAgIHN0VHlwZWRlZgkgIC0tIHR5cGUgZGVmaW5pdGlvbgotCSAgICBzdEZpbGUJICAtLSBmaWxlIG5hbWUKLQkgICAgc3RSZWdSZWxvYwkgIC0tIHJlZ2lzdGVyIHJlbG9jYXRpb24KLQkgICAgc3RGb3J3YXJkCSAgLS0gZm9yd2FyZGluZyBhZGRyZXNzCi0JICAgIHN0U3RhdGljUHJvYyAgLS0gU3RhdGljIHByb2NlZHVyZQotCSAgICBzdENvbnN0YW50CSAgLS0gY29uc3QKLQotICAgIDQpCXNjOiBzdG9yYWdlIGNsYXNzLiAgVGhlIGN1cnJlbnQgc3RvcmFnZSBjbGFzc2VzIGFyZToKLQotCSAgICBzY1RleHQJICAtLSB0ZXh0IHN5bWJvbAotCSAgICBzY0RhdGEJICAtLSBpbml0aWFsaXplZCBkYXRhIHN5bWJvbAotCSAgICBzY0JzcwkgIC0tIHVuLWluaXRpYWxpemVkIGRhdGEgc3ltYm9sCi0JICAgIHNjUmVnaXN0ZXIJICAtLSB2YWx1ZSBvZiBzeW1ib2wgaXMgcmVnaXN0ZXIgbnVtYmVyCi0JICAgIHNjQWJzCSAgLS0gdmFsdWUgb2Ygc3ltYm9sIGlzIGFic29sdXRlCi0JICAgIHNjVW5kZWZpbmVkICAgLS0gd2hvIGtub3dzPwotCSAgICBzY0NkYkxvY2FsCSAgLS0gdmFyaWFibGUncyB2YWx1ZSBpcyBJTiBzZS0+dmEuPz8KLQkgICAgc2NCaXRzCSAgLS0gdGhpcyBpcyBhIGJpdCBmaWVsZAotCSAgICBzY0NkYlN5c3RlbQkgIC0tIHZhbHVlIGlzIElOIGRlYnVnZ2VyJ3MgYWRkcmVzcyBzcGFjZQotCSAgICBzY1JlZ0ltYWdlCSAgLS0gcmVnaXN0ZXIgdmFsdWUgc2F2ZWQgb24gc3RhY2sKLQkgICAgc2NJbmZvCSAgLS0gc3ltYm9sIGNvbnRhaW5zIGRlYnVnZ2VyIGluZm9ybWF0aW9uCi0JICAgIHNjVXNlclN0cnVjdCAgLS0gYWRkciBpbiBzdHJ1Y3QgdXNlciBmb3IgY3VycmVudCBwcm9jZXNzCi0JICAgIHNjU0RhdGEJICAtLSBsb2FkIHRpbWUgb25seSBzbWFsbCBkYXRhCi0JICAgIHNjU0JzcwkgIC0tIGxvYWQgdGltZSBvbmx5IHNtYWxsIGNvbW1vbgotCSAgICBzY1JEYXRhCSAgLS0gbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEKLQkgICAgc2NWYXIJICAtLSBWYXIgcGFyYW1ldGVyIChmb3J0cmFucGFzY2FsKQotCSAgICBzY0NvbW1vbgkgIC0tIGNvbW1vbiB2YXJpYWJsZQotCSAgICBzY1NDb21tb24JICAtLSBzbWFsbCBjb21tb24KLQkgICAgc2NWYXJSZWdpc3RlciAtLSBWYXIgcGFyYW1ldGVyIGluIGEgcmVnaXN0ZXIKLQkgICAgc2NWYXJpYW50CSAgLS0gVmFyaWFudCByZWNvcmQKLQkgICAgc2NTVW5kZWZpbmVkICAtLSBzbWFsbCB1bmRlZmluZWQoZXh0ZXJuYWwpIGRhdGEKLQkgICAgc2NJbml0CSAgLS0gLmluaXQgc2VjdGlvbiBzeW1ib2wKLQotICAgIDUpCWluZGV4OiBwb2ludGVyIHRvIGEgbG9jYWwgc3ltYm9sIG9yIGF1eC4gZW50cnkuCi0KLQotCi0gICBGb3IgdGhlIGZvbGxvd2luZyBwcm9ncmFtOgotCi0JI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLQltYWluKCl7Ci0JCXByaW50ZigiSGVsbG8gV29ybGQhXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0gICBNaXBzLXRkdW1wIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246Ci0KLSAgIEdsb2JhbCBmaWxlIGhlYWRlcjoKLSAgICAgICBtYWdpYyBudW1iZXIgICAgICAgICAgICAgMHgxNjIKLSAgICAgICAjIHNlY3Rpb25zICAgICAgICAgICAgICAgMgotICAgICAgIHRpbWVzdGFtcCAgICAgICAgICAgICAgICA2NDUzMTE3OTksIFdlZCBKdW4gMTMgMTc6MTY6MzkgMTk5MAotICAgICAgIHN5bWJvbGljIGhlYWRlciBvZmZzZXQgICAyODQKLSAgICAgICBzeW1ib2xpYyBoZWFkZXIgc2l6ZSAgICAgOTYKLSAgICAgICBvcHRpb25hbCBoZWFkZXIgICAgICAgICAgNTYKLSAgICAgICBmbGFncyAgICAgICAgICAgICAgICAgICAgMHgwCi0KLSAgIFN5bWJvbGljIGhlYWRlciwgbWFnaWMgbnVtYmVyID0gMHg3MDA5LCB2c3RhbXAgPSAxLjMxOgotCi0gICAgICAgSW5mbyAgICAgICAgICAgICAgICAgICAgICBPZmZzZXQgICAgICBOdW1iZXIgICAgICAgQnl0ZXMKLSAgICAgICA9PT09ICAgICAgICAgICAgICAgICAgICAgID09PT09PSAgICAgID09PT09PSAgICAgID09PT09Ci0KLSAgICAgICBMaW5lIG51bWJlcnMgICAgICAgICAgICAgICAgIDM4MCAgICAgICAgICAgNCAgICAgICAgICAgNCBbMTNdCi0gICAgICAgRGVuc2UgbnVtYmVycyAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICAgICBQcm9jZWR1cmVzIFRhYmxlcyAgICAgICAgICAgIDM4NCAgICAgICAgICAgMSAgICAgICAgICA1MgotICAgICAgIExvY2FsIFN5bWJvbHMgICAgICAgICAgICAgICAgNDM2ICAgICAgICAgIDE2ICAgICAgICAgMTkyCi0gICAgICAgT3B0aW1pemF0aW9uIFN5bWJvbHMgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICAgICBBdXhpbGlhcnkgU3ltYm9scyAgICAgICAgICAgIDYyOCAgICAgICAgICAzOSAgICAgICAgIDE1NgotICAgICAgIExvY2FsIFN0cmluZ3MgICAgICAgICAgICAgICAgNzg0ICAgICAgICAgIDgwICAgICAgICAgIDgwCi0gICAgICAgRXh0ZXJuYWwgU3RyaW5ncyAgICAgICAgICAgICA4NjQgICAgICAgICAxNDQgICAgICAgICAxNDQKLSAgICAgICBGaWxlIFRhYmxlcyAgICAgICAgICAgICAgICAgMTAwOCAgICAgICAgICAgMiAgICAgICAgIDE0NAotICAgICAgIFJlbGF0aXZlIEZpbGVzICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwCi0gICAgICAgRXh0ZXJuYWwgU3ltYm9scyAgICAgICAgICAgIDExNTIgICAgICAgICAgMjAgICAgICAgICAzMjAKLQotICAgRmlsZSAjMCwgImhlbGxvMi5jIgotCi0gICAgICAgTmFtZSBpbmRleCAgPSAxICAgICAgICAgIFJlYWRpbiAgICAgID0gTm8KLSAgICAgICBNZXJnZSAgICAgICA9IE5vICAgICAgICAgRW5kaWFuICAgICAgPSBMSVRUTEUKLSAgICAgICBEZWJ1ZyBsZXZlbCA9IEcyICAgICAgICAgTGFuZ3VhZ2UgICAgPSBDCi0gICAgICAgQWRyICAgICAgICAgPSAweDAwMDAwMDAwCi0KLSAgICAgICBJbmZvICAgICAgICAgICAgICAgICAgICAgICBTdGFydCAgICAgIE51bWJlciAgICAgICAgU2l6ZSAgICAgIE9mZnNldAotICAgICAgID09PT0gICAgICAgICAgICAgICAgICAgICAgID09PT09ICAgICAgPT09PT09ICAgICAgICA9PT09ICAgICAgPT09PT09Ci0gICAgICAgTG9jYWwgc3RyaW5ncyAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgMTUgICAgICAgICAgMTUgICAgICAgICA3ODQKLSAgICAgICBMb2NhbCBzeW1ib2xzICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgNiAgICAgICAgICA3MiAgICAgICAgIDQzNgotICAgICAgIExpbmUgbnVtYmVycyAgICAgICAgICAgICAgICAgICAwICAgICAgICAgIDEzICAgICAgICAgIDEzICAgICAgICAgMzgwCi0gICAgICAgT3B0aW1pemF0aW9uIHN5bWJvbHMgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICAgICBQcm9jZWR1cmVzICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMSAgICAgICAgICA1MiAgICAgICAgIDM4NAotICAgICAgIEF1eGlsaWFyeSBzeW1ib2xzICAgICAgICAgICAgICAwICAgICAgICAgIDE0ICAgICAgICAgIDU2ICAgICAgICAgNjI4Ci0gICAgICAgUmVsYXRpdmUgRmlsZXMgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLQotICAgIFRoZXJlIGFyZSA2IGxvY2FsIHN5bWJvbHMsIHN0YXJ0aW5nIGF0IDQzNgotCi0JU3ltYm9sIyAwOiAiaGVsbG8yLmMiCi0JICAgIEVuZCsxIHN5bWJvbCAgPSA2Ci0JICAgIFN0cmluZyBpbmRleCAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSA2Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBGaWxlICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE6ICJtYWluIgotCSAgICBFbmQrMSBzeW1ib2wgID0gNQotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSAxMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVGV4dCAgICAgICAgSW5kZXggID0gMTIKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMjogIiIKLQkgICAgRW5kKzEgc3ltYm9sICA9IDQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDQKLQkgICAgU3ltYm9sIHR5cGUgICA9IEJsb2NrICAgICAgIFZhbHVlICA9IDgKLQotCVN5bWJvbCMgMzogIiIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDIKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDI4Ci0KLQlTeW1ib2wjIDQ6ICJtYWluIgotCSAgICBGaXJzdCBzeW1ib2wgID0gMQotCSAgICBTdHJpbmcgaW5kZXggID0gMTAKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDUyCi0KLQlTeW1ib2wjIDU6ICJoZWxsbzIuYyIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDAKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDAKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDAKLQotICAgIFRoZXJlIGFyZSAxNCBhdXhpbGlhcnkgdGFibGUgZW50cmllcywgc3RhcnRpbmcgYXQgNjI4LgotCi0JKiAjMCAgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzEgICAgICAgICAgICAgIDI0LCBbICAyNC8gICAgICAwXSwgWyA2IDA6MCAwOjA6MDowOjA6MF0KLQkqICMyICAgICAgICAgICAgICAgOCwgWyAgIDgvICAgICAgMF0sIFsgMiAwOjAgMDowOjA6MDowOjBdCi0JKiAjMyAgICAgICAgICAgICAgMTYsIFsgIDE2LyAgICAgIDBdLCBbIDQgMDowIDA6MDowOjA6MDowXQotCSogIzQgICAgICAgICAgICAgIDI0LCBbICAyNC8gICAgICAwXSwgWyA2IDA6MCAwOjA6MDowOjA6MF0KLQkqICM1ICAgICAgICAgICAgICAzMiwgWyAgMzIvICAgICAgMF0sIFsgOCAwOjAgMDowOjA6MDowOjBdCi0JKiAjNiAgICAgICAgICAgICAgNDAsIFsgIDQwLyAgICAgIDBdLCBbMTAgMDowIDA6MDowOjA6MDowXQotCSogIzcgICAgICAgICAgICAgIDQ0LCBbICA0NC8gICAgICAwXSwgWzExIDA6MCAwOjA6MDowOjA6MF0KLQkqICM4ICAgICAgICAgICAgICAxMiwgWyAgMTIvICAgICAgMF0sIFsgMyAwOjAgMDowOjA6MDowOjBdCi0JKiAjOSAgICAgICAgICAgICAgMjAsIFsgIDIwLyAgICAgIDBdLCBbIDUgMDowIDA6MDowOjA6MDowXQotCSogIzEwICAgICAgICAgICAgIDI4LCBbICAyOC8gICAgICAwXSwgWyA3IDA6MCAwOjA6MDowOjA6MF0KLQkqICMxMSAgICAgICAgICAgICAzNiwgWyAgMzYvICAgICAgMF0sIFsgOSAwOjAgMDowOjA6MDowOjBdCi0JICAjMTIgICAgICAgICAgICAgIDUsIFsgICA1LyAgICAgIDBdLCBbIDEgMTowIDA6MDowOjA6MDowXQotCSAgIzEzICAgICAgICAgICAgIDI0LCBbICAyNC8gICAgICAwXSwgWyA2IDA6MCAwOjA6MDowOjA6MF0KLQotICAgIFRoZXJlIGFyZSAxIHByb2NlZHVyZSBkZXNjcmlwdG9yIGVudHJpZXMsIHN0YXJ0aW5nIGF0IDAuCi0KLQlQcm9jZWR1cmUgZGVzY3JpcHRvciAwOgotCSAgICBOYW1lIGluZGV4ICAgPSAxMCAgICAgICAgICBOYW1lICAgICAgICAgID0gIm1haW4iCi0JICAgIC5tYXNrIDB4ODAwMDAwMDAsLTQgICAgICAgIC5mbWFzayAweDAwMDAwMDAwLDAKLQkgICAgLmZyYW1lICQyOSwyNCwkMzEKLQkgICAgT3B0LiBzdGFydCAgID0gLTEgICAgICAgICAgU3ltYm9scyBzdGFydCA9IDEKLQkgICAgRmlyc3QgbGluZSAjID0gMyAgICAgICAgICAgTGFzdCBsaW5lICMgICA9IDYKLQkgICAgTGluZSBPZmZzZXQgID0gMCAgICAgICAgICAgQWRkcmVzcyAgICAgICA9IDB4MDAwMDAwMDAKLQotCVRoZXJlIGFyZSA0IGJ5dGVzIGhvbGRpbmcgbGluZSBudW1iZXJzLCBzdGFydGluZyBhdCAzODAuCi0JICAgIExpbmUgICAgICAgICAgIDMsICAgZGVsdGEgICAgIDAsICAgY291bnQgIDIKLQkgICAgTGluZSAgICAgICAgICAgNCwgICBkZWx0YSAgICAgMSwgICBjb3VudCAgMwotCSAgICBMaW5lICAgICAgICAgICA1LCAgIGRlbHRhICAgICAxLCAgIGNvdW50ICAyCi0JICAgIExpbmUgICAgICAgICAgIDYsICAgZGVsdGEgICAgIDEsICAgY291bnQgIDYKLQotICAgRmlsZSAjMSwgIi91c3IvaW5jbHVkZS9zdGRpby5oIgotCi0gICAgTmFtZSBpbmRleCAgPSAxICAgICAgICAgIFJlYWRpbiAgICAgID0gTm8KLSAgICBNZXJnZSAgICAgICA9IFllcyAgICAgICAgRW5kaWFuICAgICAgPSBMSVRUTEUKLSAgICBEZWJ1ZyBsZXZlbCA9IEcyICAgICAgICAgTGFuZ3VhZ2UgICAgPSBDCi0gICAgQWRyICAgICAgICAgPSAweDAwMDAwMDAwCi0KLSAgICBJbmZvICAgICAgICAgICAgICAgICAgICAgICBTdGFydCAgICAgIE51bWJlciAgICAgICAgU2l6ZSAgICAgIE9mZnNldAotICAgID09PT0gICAgICAgICAgICAgICAgICAgICAgID09PT09ICAgICAgPT09PT09ICAgICAgICA9PT09ICAgICAgPT09PT09Ci0gICAgTG9jYWwgc3RyaW5ncyAgICAgICAgICAgICAgICAgMTUgICAgICAgICAgNjUgICAgICAgICAgNjUgICAgICAgICA3OTkKLSAgICBMb2NhbCBzeW1ib2xzICAgICAgICAgICAgICAgICAgNiAgICAgICAgICAxMCAgICAgICAgIDEyMCAgICAgICAgIDUwOAotICAgIExpbmUgbnVtYmVycyAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgICAwICAgICAgICAgMzgwCi0gICAgT3B0aW1pemF0aW9uIHN5bWJvbHMgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLSAgICBQcm9jZWR1cmVzICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgMCAgICAgICAgICAgMCAgICAgICAgIDQzNgotICAgIEF1eGlsaWFyeSBzeW1ib2xzICAgICAgICAgICAgIDE0ICAgICAgICAgIDI1ICAgICAgICAgMTAwICAgICAgICAgNjg0Ci0gICAgUmVsYXRpdmUgRmlsZXMgICAgICAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAgICAgICAgICAgIDAKLQotICAgIFRoZXJlIGFyZSAxMCBsb2NhbCBzeW1ib2xzLCBzdGFydGluZyBhdCA0NDIKLQotCVN5bWJvbCMgMDogIi91c3IvaW5jbHVkZS9zdGRpby5oIgotCSAgICBFbmQrMSBzeW1ib2wgID0gMTAKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDEwCi0JICAgIFN5bWJvbCB0eXBlICAgPSBGaWxlICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE6ICJfaW9idWYiCi0JICAgIEVuZCsxIHN5bWJvbCAgPSA5Ci0JICAgIFN0cmluZyBpbmRleCAgPSAyMgotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gOQotCSAgICBTeW1ib2wgdHlwZSAgID0gQmxvY2sgICAgICAgVmFsdWUgID0gMjAKLQotCVN5bWJvbCMgMjogIl9jbnQiCi0JICAgIFR5cGUgICAgICAgICAgPSBpbnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDI5Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSA0Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDM6ICJfcHRyIgotCSAgICBUeXBlICAgICAgICAgID0gcHRyIHRvIGNoYXIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDM0Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAxNQotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMzIKLQotCVN5bWJvbCMgNDogIl9iYXNlIgotCSAgICBUeXBlICAgICAgICAgID0gcHRyIHRvIGNoYXIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDM5Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAxNgotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gNjQKLQotCVN5bWJvbCMgNTogIl9idWZzaXoiCi0JICAgIFR5cGUgICAgICAgICAgPSBpbnQKLQkgICAgU3RyaW5nIGluZGV4ICA9IDQ1Ci0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSA0Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBNZW1iZXIgICAgICBWYWx1ZSAgPSA5NgotCi0JU3ltYm9sIyA2OiAiX2ZsYWciCi0JICAgIFR5cGUgICAgICAgICAgPSBzaG9ydAotCSAgICBTdHJpbmcgaW5kZXggID0gNTMKLQkgICAgU3RvcmFnZSBjbGFzcyA9IEluZm8gICAgICAgIEluZGV4ICA9IDMKLQkgICAgU3ltYm9sIHR5cGUgICA9IE1lbWJlciAgICAgIFZhbHVlICA9IDEyOAotCi0JU3ltYm9sIyA3OiAiX2ZpbGUiCi0JICAgIFR5cGUgICAgICAgICAgPSBjaGFyCi0JICAgIFN0cmluZyBpbmRleCAgPSA1OQotCSAgICBTdG9yYWdlIGNsYXNzID0gSW5mbyAgICAgICAgSW5kZXggID0gMgotCSAgICBTeW1ib2wgdHlwZSAgID0gTWVtYmVyICAgICAgVmFsdWUgID0gMTQ0Ci0KLQlTeW1ib2wjIDg6ICIiCi0JICAgIEZpcnN0IHN5bWJvbCAgPSAxCi0JICAgIFN0cmluZyBpbmRleCAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBJbmZvICAgICAgICBJbmRleCAgPSAxCi0JICAgIFN5bWJvbCB0eXBlICAgPSBFbmQgICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDk6ICIvdXNyL2luY2x1ZGUvc3RkaW8uaCIKLQkgICAgRmlyc3Qgc3ltYm9sICA9IDAKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IFRleHQgICAgICAgIEluZGV4ICA9IDAKLQkgICAgU3ltYm9sIHR5cGUgICA9IEVuZCAgICAgICAgIFZhbHVlICA9IDAKLQotICAgIFRoZXJlIGFyZSAyNSBhdXhpbGlhcnkgdGFibGUgZW50cmllcywgc3RhcnRpbmcgYXQgNjQyLgotCi0JKiAjMTQgICAgICAgICAgICAgLTEsIFs0MDk1LzEwNDg1NzVdLCBbNjMgMToxIGY6ZjpmOmY6ZjpmXQotCSAgIzE1ICAgICAgICAgIDY1NTQ0LCBbICAgOC8gICAgIDE2XSwgWyAyIDA6MCAxOjA6MDowOjA6MF0KLQkgICMxNiAgICAgICAgICA2NTU0NCwgWyAgIDgvICAgICAxNl0sIFsgMiAwOjAgMTowOjA6MDowOjBdCi0JKiAjMTcgICAgICAgICAxOTY2NTYsIFsgIDQ4LyAgICAgNDhdLCBbMTIgMDowIDM6MDowOjA6MDowXQotCSogIzE4ICAgICAgICAgICA4MTkxLCBbNDA5NS8gICAgICAxXSwgWzYzIDE6MSAwOjA6MDowOmY6MV0KLQkqICMxOSAgICAgICAgICAgICAgMSwgWyAgIDEvICAgICAgMF0sIFsgMCAxOjAgMDowOjA6MDowOjBdCi0JKiAjMjAgICAgICAgICAgMjA0NzksIFs0MDk1LyAgICAgIDRdLCBbNjMgMToxIDA6MDowOjA6Zjo0XQotCSogIzIxICAgICAgICAgICAgICAxLCBbICAgMS8gICAgICAwXSwgWyAwIDE6MCAwOjA6MDowOjA6MF0KLQkqICMyMiAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjMgICAgICAgICAgICAgIDIsIFsgICAyLyAgICAgIDBdLCBbIDAgMDoxIDA6MDowOjA6MDowXQotCSogIzI0ICAgICAgICAgICAgMTYwLCBbIDE2MC8gICAgICAwXSwgWzQwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyNSAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjYgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzI3ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMyOCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMjkgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzMwICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzMSAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzIgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzMzICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzNCAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzUgICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCSogIzM2ICAgICAgICAgICAgICAwLCBbICAgMC8gICAgICAwXSwgWyAwIDA6MCAwOjA6MDowOjA6MF0KLQkqICMzNyAgICAgICAgICAgICAgMCwgWyAgIDAvICAgICAgMF0sIFsgMCAwOjAgMDowOjA6MDowOjBdCi0JKiAjMzggICAgICAgICAgICAgIDAsIFsgICAwLyAgICAgIDBdLCBbIDAgMDowIDA6MDowOjA6MDowXQotCi0gICAgVGhlcmUgYXJlIDAgcHJvY2VkdXJlIGRlc2NyaXB0b3IgZW50cmllcywgc3RhcnRpbmcgYXQgMS4KLQotICAgVGhlcmUgYXJlIDIwIGV4dGVybmFsIHN5bWJvbHMsIHN0YXJ0aW5nIGF0IDExNTIKLQotCVN5bWJvbCMgMDogIl9pb2IiCi0JICAgIFR5cGUgICAgICAgICAgPSBhcnJheSBbMyB7MTYwfV0gb2Ygc3RydWN0IF9pb2J1ZiB7IGlmZCA9IDEsIGluZGV4ID0gMSB9Ci0JICAgIFN0cmluZyBpbmRleCAgPSAwICAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxNwotCSAgICBTeW1ib2wgdHlwZSAgID0gR2xvYmFsICAgICAgVmFsdWUgID0gNjAKLQotCVN5bWJvbCMgMTogImZvcGVuIgotCSAgICBTdHJpbmcgaW5kZXggID0gNSAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAyOiAiZmRvcGVuIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTEgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAzOiAiZnJlb3BlbiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDE4ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNDogInBvcGVuIgotCSAgICBTdHJpbmcgaW5kZXggID0gMjYgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA1OiAidG1wZmlsZSIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDMyICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgNjogImZ0ZWxsIgotCSAgICBTdHJpbmcgaW5kZXggID0gNDAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA3OiAicmV3aW5kIgotCSAgICBTdHJpbmcgaW5kZXggID0gNDYgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA4OiAic2V0YnVmIgotCSAgICBTdHJpbmcgaW5kZXggID0gNTMgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyA5OiAic2V0YnVmZmVyIgotCSAgICBTdHJpbmcgaW5kZXggID0gNjAgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxMDogInNldGxpbmVidWYiCi0JICAgIFN0cmluZyBpbmRleCAgPSA3MCAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDExOiAiZmdldHMiCi0JICAgIFN0cmluZyBpbmRleCAgPSA4MSAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDEyOiAiZ2V0cyIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDg3ICAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTM6ICJjdGVybWlkIgotCSAgICBTdHJpbmcgaW5kZXggID0gOTIgICAgICAgICAgSWZkICAgID0gMQotCSAgICBTdG9yYWdlIGNsYXNzID0gTmlsICAgICAgICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0JU3ltYm9sIyAxNDogImN1c2VyaWQiCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMDAgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE1OiAidGVtcG5hbSIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEwOCAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTY6ICJ0bXBuYW0iCi0JICAgIFN0cmluZyBpbmRleCAgPSAxMTYgICAgICAgICBJZmQgICAgPSAxCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBOaWwgICAgICAgICBJbmRleCAgPSAxMDQ4NTc1Ci0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE3OiAic3ByaW50ZiIKLQkgICAgU3RyaW5nIGluZGV4ICA9IDEyMyAgICAgICAgIElmZCAgICA9IDEKLQkgICAgU3RvcmFnZSBjbGFzcyA9IE5pbCAgICAgICAgIEluZGV4ICA9IDEwNDg1NzUKLQkgICAgU3ltYm9sIHR5cGUgICA9IFByb2MgICAgICAgIFZhbHVlICA9IDAKLQotCVN5bWJvbCMgMTg6ICJtYWluIgotCSAgICBUeXBlICAgICAgICAgID0gaW50Ci0JICAgIFN0cmluZyBpbmRleCAgPSAxMzEgICAgICAgICBJZmQgICAgPSAwCi0JICAgIFN0b3JhZ2UgY2xhc3MgPSBUZXh0ICAgICAgICBJbmRleCAgPSAxCi0JICAgIFN5bWJvbCB0eXBlICAgPSBQcm9jICAgICAgICBWYWx1ZSAgPSAwCi0KLQlTeW1ib2wjIDE5OiAicHJpbnRmIgotCSAgICBTdHJpbmcgaW5kZXggID0gMTM2ICAgICAgICAgSWZkICAgID0gMAotCSAgICBTdG9yYWdlIGNsYXNzID0gVW5kZWZpbmVkICAgSW5kZXggID0gMTA0ODU3NQotCSAgICBTeW1ib2wgdHlwZSAgID0gUHJvYyAgICAgICAgVmFsdWUgID0gMAotCi0gICBUaGUgZm9sbG93aW5nIGF1eGlsaWFyeSB0YWJsZSBlbnRyaWVzIHdlcmUgdW51c2VkOgotCi0gICAgIzAgICAgICAgICAgICAgICAwICAweDAwMDAwMDAwICB2b2lkCi0gICAgIzIgICAgICAgICAgICAgICA4ICAweDAwMDAwMDA4ICBjaGFyCi0gICAgIzMgICAgICAgICAgICAgIDE2ICAweDAwMDAwMDEwICBzaG9ydAotICAgICM0ICAgICAgICAgICAgICAyNCAgMHgwMDAwMDAxOCAgaW50Ci0gICAgIzUgICAgICAgICAgICAgIDMyICAweDAwMDAwMDIwICBsb25nCi0gICAgIzYgICAgICAgICAgICAgIDQwICAweDAwMDAwMDI4ICBmbG9hdAotICAgICM3ICAgICAgICAgICAgICA0NCAgMHgwMDAwMDAyYyAgZG91YmxlCi0gICAgIzggICAgICAgICAgICAgIDEyICAweDAwMDAwMDBjICB1bnNpZ25lZCBjaGFyCi0gICAgIzkgICAgICAgICAgICAgIDIwICAweDAwMDAwMDE0ICB1bnNpZ25lZCBzaG9ydAotICAgICMxMCAgICAgICAgICAgICAyOCAgMHgwMDAwMDAxYyAgdW5zaWduZWQgaW50Ci0gICAgIzExICAgICAgICAgICAgIDM2ICAweDAwMDAwMDI0ICB1bnNpZ25lZCBsb25nCi0gICAgIzE0ICAgICAgICAgICAgICAwICAweDAwMDAwMDAwICB2b2lkCi0gICAgIzE1ICAgICAgICAgICAgIDI0ICAweDAwMDAwMDE4ICBpbnQKLSAgICAjMTkgICAgICAgICAgICAgMzIgIDB4MDAwMDAwMjAgIGxvbmcKLSAgICAjMjAgICAgICAgICAgICAgNDAgIDB4MDAwMDAwMjggIGZsb2F0Ci0gICAgIzIxICAgICAgICAgICAgIDQ0ICAweDAwMDAwMDJjICBkb3VibGUKLSAgICAjMjIgICAgICAgICAgICAgMTIgIDB4MDAwMDAwMGMgIHVuc2lnbmVkIGNoYXIKLSAgICAjMjMgICAgICAgICAgICAgMjAgIDB4MDAwMDAwMTQgIHVuc2lnbmVkIHNob3J0Ci0gICAgIzI0ICAgICAgICAgICAgIDI4ICAweDAwMDAwMDFjICB1bnNpZ25lZCBpbnQKLSAgICAjMjUgICAgICAgICAgICAgMzYgIDB4MDAwMDAwMjQgIHVuc2lnbmVkIGxvbmcKLSAgICAjMjYgICAgICAgICAgICAgNDggIDB4MDAwMDAwMzAgIHN0cnVjdCBubyBuYW1lIHsgaWZkID0gLTEsIGluZGV4ID0gMTA0ODU3NSB9Ci0qLwotDAotLyogUmVkZWZpbml0aW9uIG9mIG9mIHN0b3JhZ2UgY2xhc3NlcyBhcyBhbiBlbnVtZXJhdGlvbiBmb3IgYmV0dGVyCi0gICBkZWJ1Z2dpbmcuICAqLwotCi10eXBlZGVmIGVudW0gc2MgewotICBzY19OaWwJID0gc2NOaWwsCSAgLyogbm8gc3RvcmFnZSBjbGFzcyAqLwotICBzY19UZXh0CSA9IHNjVGV4dCwJICAvKiB0ZXh0IHN5bWJvbCAqLwotICBzY19EYXRhCSA9IHNjRGF0YSwJICAvKiBpbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLwotICBzY19Cc3MJID0gc2NCc3MsCSAgLyogdW4taW5pdGlhbGl6ZWQgZGF0YSBzeW1ib2wgKi8KLSAgc2NfUmVnaXN0ZXIJID0gc2NSZWdpc3RlciwJICAvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgcmVnaXN0ZXIgbnVtYmVyICovCi0gIHNjX0FicwkgPSBzY0FicywJICAvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KLSAgc2NfVW5kZWZpbmVkCSA9IHNjVW5kZWZpbmVkLAkgIC8qIHdobyBrbm93cz8gKi8KLSAgc2NfQ2RiTG9jYWwJID0gc2NDZGJMb2NhbCwJICAvKiB2YXJpYWJsZSdzIHZhbHVlIGlzIElOIHNlLT52YS4/PyAqLwotICBzY19CaXRzCSA9IHNjQml0cywJICAvKiB0aGlzIGlzIGEgYml0IGZpZWxkICovCi0gIHNjX0NkYlN5c3RlbQkgPSBzY0NkYlN5c3RlbSwJICAvKiB2YWx1ZSBpcyBJTiBDREIncyBhZGRyZXNzIHNwYWNlICovCi0gIHNjX1JlZ0ltYWdlCSA9IHNjUmVnSW1hZ2UsCSAgLyogcmVnaXN0ZXIgdmFsdWUgc2F2ZWQgb24gc3RhY2sgKi8KLSAgc2NfSW5mbwkgPSBzY0luZm8sCSAgLyogc3ltYm9sIGNvbnRhaW5zIGRlYnVnZ2VyIGluZm9ybWF0aW9uICovCi0gIHNjX1VzZXJTdHJ1Y3QJID0gc2NVc2VyU3RydWN0LCAgLyogYWRkciBpbiBzdHJ1Y3QgdXNlciBmb3IgY3VycmVudCBwcm9jZXNzICovCi0gIHNjX1NEYXRhCSA9IHNjU0RhdGEsCSAgLyogbG9hZCB0aW1lIG9ubHkgc21hbGwgZGF0YSAqLwotICBzY19TQnNzCSA9IHNjU0JzcywJICAvKiBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24gKi8KLSAgc2NfUkRhdGEJID0gc2NSRGF0YSwJICAvKiBsb2FkIHRpbWUgb25seSByZWFkIG9ubHkgZGF0YSAqLwotICBzY19WYXIJID0gc2NWYXIsCSAgLyogVmFyIHBhcmFtZXRlciAoZm9ydHJhbixwYXNjYWwpICovCi0gIHNjX0NvbW1vbgkgPSBzY0NvbW1vbiwJICAvKiBjb21tb24gdmFyaWFibGUgKi8KLSAgc2NfU0NvbW1vbgkgPSBzY1NDb21tb24sCSAgLyogc21hbGwgY29tbW9uICovCi0gIHNjX1ZhclJlZ2lzdGVyID0gc2NWYXJSZWdpc3RlciwgLyogVmFyIHBhcmFtZXRlciBpbiBhIHJlZ2lzdGVyICovCi0gIHNjX1ZhcmlhbnQJID0gc2NWYXJpYW50LAkgIC8qIFZhcmlhbnQgcmVjb3JkICovCi0gIHNjX1NVbmRlZmluZWQJID0gc2NTVW5kZWZpbmVkLCAgLyogc21hbGwgdW5kZWZpbmVkKGV4dGVybmFsKSBkYXRhICovCi0gIHNjX0luaXQJID0gc2NJbml0LAkgIC8qIC5pbml0IHNlY3Rpb24gc3ltYm9sICovCi0gIHNjX01heAkgPSBzY01heAkgIC8qIE1heCBzdG9yYWdlIGNsYXNzKzEgKi8KLX0gc2NfdDsKLQotLyogUmVkZWZpbml0aW9uIG9mIHN5bWJvbCB0eXBlLiAgKi8KLQotdHlwZWRlZiBlbnVtIHN0IHsKLSAgc3RfTmlsCT0gc3ROaWwsCS8qIE51dGhpbicgc3BlY2lhbCAqLwotICBzdF9HbG9iYWwJPSBzdEdsb2JhbCwJLyogZXh0ZXJuYWwgc3ltYm9sICovCi0gIHN0X1N0YXRpYwk9IHN0U3RhdGljLAkvKiBzdGF0aWMgKi8KLSAgc3RfUGFyYW0JPSBzdFBhcmFtLAkvKiBwcm9jZWR1cmUgYXJndW1lbnQgKi8KLSAgc3RfTG9jYWwJPSBzdExvY2FsLAkvKiBsb2NhbCB2YXJpYWJsZSAqLwotICBzdF9MYWJlbAk9IHN0TGFiZWwsCS8qIGxhYmVsICovCi0gIHN0X1Byb2MJPSBzdFByb2MsCS8qICAgICAiICAgICAgIgkgUHJvY2VkdXJlICovCi0gIHN0X0Jsb2NrCT0gc3RCbG9jaywJLyogYmVnaW5uaW5nIG9mIGJsb2NrICovCi0gIHN0X0VuZAk9IHN0RW5kLAkvKiBlbmQgKG9mIGFueXRoaW5nKSAqLwotICBzdF9NZW1iZXIJPSBzdE1lbWJlciwJLyogbWVtYmVyIChvZiBhbnl0aGluZwktIHN0cnVjdC91bmlvbi9lbnVtICovCi0gIHN0X1R5cGVkZWYJPSBzdFR5cGVkZWYsCS8qIHR5cGUgZGVmaW5pdGlvbiAqLwotICBzdF9GaWxlCT0gc3RGaWxlLAkvKiBmaWxlIG5hbWUgKi8KLSAgc3RfUmVnUmVsb2MJPSBzdFJlZ1JlbG9jLAkvKiByZWdpc3RlciByZWxvY2F0aW9uICovCi0gIHN0X0ZvcndhcmQJPSBzdEZvcndhcmQsCS8qIGZvcndhcmRpbmcgYWRkcmVzcyAqLwotICBzdF9TdGF0aWNQcm9jCT0gc3RTdGF0aWNQcm9jLAkvKiBsb2FkIHRpbWUgb25seSBzdGF0aWMgcHJvY3MgKi8KLSAgc3RfQ29uc3RhbnQJPSBzdENvbnN0YW50LAkvKiBjb25zdCAqLwotICBzdF9TdHIJPSBzdFN0ciwJLyogc3RyaW5nICovCi0gIHN0X051bWJlcgk9IHN0TnVtYmVyLAkvKiBwdXJlIG51bWJlciAoaWUuIDQgTk9SIDIrMikgKi8KLSAgc3RfRXhwcgk9IHN0RXhwciwJLyogMisyIHZzLiA0ICovCi0gIHN0X1R5cGUJPSBzdFR5cGUsCS8qIHBvc3QtY29lcmNpb24gU0VSICovCi0gIHN0X01heAk9IHN0TWF4CQkvKiBtYXggdHlwZSsxICovCi19IHN0X3Q7Ci0KLS8qIFJlZGVmaW5pdGlvbiBvZiB0eXBlIHF1YWxpZmllcnMuICAqLwotCi10eXBlZGVmIGVudW0gdHEgewotICB0cV9OaWwJPSB0cU5pbCwJLyogYnQgaXMgd2hhdCB5b3Ugc2VlICovCi0gIHRxX1B0cgk9IHRxUHRyLAkvKiBwb2ludGVyICovCi0gIHRxX1Byb2MJPSB0cVByb2MsCS8qIHByb2NlZHVyZSAqLwotICB0cV9BcnJheQk9IHRxQXJyYXksCS8qIGR1aCAqLwotICB0cV9GYXIJPSB0cUZhciwJLyogbG9uZ2VyIGFkZHJlc3NpbmcgLSA4MDg2LzggbGFuZCAqLwotICB0cV9Wb2wJPSB0cVZvbCwJLyogdm9sYXRpbGUgKi8KLSAgdHFfTWF4CT0gdHFNYXgJCS8qIE1heCB0eXBlIHF1YWxpZmllcisxICovCi19IHRxX3Q7Ci0KLS8qIFJlZGVmaW5pdGlvbiBvZiBiYXNpYyB0eXBlcy4gICovCi0KLXR5cGVkZWYgZW51bSBidCB7Ci0gIGJ0X05pbAk9IGJ0TmlsLAkvKiB1bmRlZmluZWQgKi8KLSAgYnRfQWRyCT0gYnRBZHIsCS8qIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwb2ludGVyICovCi0gIGJ0X0NoYXIJPSBidENoYXIsCS8qIGNoYXJhY3RlciAqLwotICBidF9VQ2hhcgk9IGJ0VUNoYXIsCS8qIHVuc2lnbmVkIGNoYXJhY3RlciAqLwotICBidF9TaG9ydAk9IGJ0U2hvcnQsCS8qIHNob3J0ICovCi0gIGJ0X1VTaG9ydAk9IGJ0VVNob3J0LAkvKiB1bnNpZ25lZCBzaG9ydCAqLwotICBidF9JbnQJPSBidEludCwJLyogaW50ICovCi0gIGJ0X1VJbnQJPSBidFVJbnQsCS8qIHVuc2lnbmVkIGludCAqLwotICBidF9Mb25nCT0gYnRMb25nLAkvKiBsb25nICovCi0gIGJ0X1VMb25nCT0gYnRVTG9uZywJLyogdW5zaWduZWQgbG9uZyAqLwotICBidF9GbG9hdAk9IGJ0RmxvYXQsCS8qIGZsb2F0IChyZWFsKSAqLwotICBidF9Eb3VibGUJPSBidERvdWJsZSwJLyogRG91YmxlIChyZWFsKSAqLwotICBidF9TdHJ1Y3QJPSBidFN0cnVjdCwJLyogU3RydWN0dXJlIChSZWNvcmQpICovCi0gIGJ0X1VuaW9uCT0gYnRVbmlvbiwJLyogVW5pb24gKHZhcmlhbnQpICovCi0gIGJ0X0VudW0JPSBidEVudW0sCS8qIEVudW1lcmF0ZWQgKi8KLSAgYnRfVHlwZWRlZgk9IGJ0VHlwZWRlZiwJLyogZGVmaW5lZCB2aWEgYSB0eXBlZGVmLCBpc3ltUmVmIHBvaW50cyAqLwotICBidF9SYW5nZQk9IGJ0UmFuZ2UsCS8qIHN1YnJhbmdlIG9mIGludCAqLwotICBidF9TZXQJPSBidFNldCwJLyogcGFzY2FsIHNldHMgKi8KLSAgYnRfQ29tcGxleAk9IGJ0Q29tcGxleCwJLyogZm9ydHJhbiBjb21wbGV4ICovCi0gIGJ0X0RDb21wbGV4CT0gYnREQ29tcGxleCwJLyogZm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotICBidF9JbmRpcmVjdAk9IGJ0SW5kaXJlY3QsCS8qIGZvcndhcmQgb3IgdW5uYW1lZCB0eXBlZGVmICovCi0gIGJ0X0ZpeGVkRGVjCT0gYnRGaXhlZERlYywJLyogRml4ZWQgRGVjaW1hbCAqLwotICBidF9GbG9hdERlYwk9IGJ0RmxvYXREZWMsCS8qIEZsb2F0IERlY2ltYWwgKi8KLSAgYnRfU3RyaW5nCT0gYnRTdHJpbmcsCS8qIFZhcnlpbmcgTGVuZ3RoIENoYXJhY3RlciBTdHJpbmcgKi8KLSAgYnRfQml0CT0gYnRCaXQsCS8qIEFsaWduZWQgQml0IFN0cmluZyAqLwotICBidF9QaWN0dXJlCT0gYnRQaWN0dXJlLAkvKiBQaWN0dXJlICovCi0gIGJ0X1ZvaWQJPSBidFZvaWQsCS8qIFZvaWQgKi8KLSAgYnRfTWF4CT0gYnRNYXgJCS8qIE1heCBiYXNpYyB0eXBlKzEgKi8KLX0gYnRfdDsKLQotI2RlZmluZSBOX1RRIGl0cU1heAotCi0vKiBTdGF0ZXMgZm9yIHdoZXRoZXIgdG8gaGFzaCB0eXBlIG9yIG5vdC4gICovCi10eXBlZGVmIGVudW0gaGFzaF9zdGF0ZSB7Ci0gIGhhc2hfbm8JPSAwLAkJLyogZG9uJ3QgaGFzaCB0eXBlICovCi0gIGhhc2hfeWVzCT0gMSwJCS8qIG9rIHRvIGhhc2ggdHlwZSwgb3IgdXNlIHByZXZpb3VzIGhhc2ggKi8KLSAgaGFzaF9yZWNvcmQJPSAyCQkvKiBvayB0byByZWNvcmQgaGFzaCwgYnV0IGRvbid0IHVzZSBwcmV2LiAqLwotfSBoYXNoX3N0YXRlX3Q7Ci0KLS8qIFR5cGVzIG9mIGRpZmZlcmVudCBzaXplZCBhbGxvY2F0aW9uIHJlcXVlc3RzLiAgKi8KLWVudW0gYWxsb2NfdHlwZSB7Ci0gIGFsbG9jX3R5cGVfbm9uZSwJCS8qIGR1bW15IHZhbHVlICovCi0gIGFsbG9jX3R5cGVfc2NvcGUsCQkvKiBuZXN0ZWQgc2NvcGVzIGxpbmtlZCBsaXN0ICovCi0gIGFsbG9jX3R5cGVfdmxpbmtzLAkJLyogZ2x1ZSBsaW5raW5nIHBhZ2VzIGluIHZhcnJheSAqLwotICBhbGxvY190eXBlX3NoYXNoLAkJLyogc3RyaW5nIGhhc2ggZWxlbWVudCAqLwotICBhbGxvY190eXBlX3RoYXNoLAkJLyogdHlwZSBoYXNoIGVsZW1lbnQgKi8KLSAgYWxsb2NfdHlwZV90YWcsCQkvKiBzdHJ1Y3QvdW5pb24vdGFnIGVsZW1lbnQgKi8KLSAgYWxsb2NfdHlwZV9mb3J3YXJkLAkJLyogZWxlbWVudCB0byBob2xkIHVua25vd24gdGFnICovCi0gIGFsbG9jX3R5cGVfdGhlYWQsCQkvKiBoZWFkIG9mIHR5cGUgaGFzaCBsaXN0ICovCi0gIGFsbG9jX3R5cGVfdmFycmF5LAkJLyogZ2VuZXJhbCB2YXJyYXkgYWxsb2NhdGlvbiAqLwotICBhbGxvY190eXBlX2xpbmVubywJCS8qIGxpbmUgbnVtYmVyIGxpc3QgKi8KLSAgYWxsb2NfdHlwZV9sYXN0CQkvKiBsYXN0KzEgZWxlbWVudCBmb3IgYXJyYXkgYm91bmRzICovCi19OwotCi0vKiBUeXBlcyBvZiBhdXhpbGlhcnkgdHlwZSBpbmZvcm1hdGlvbi4gICovCi1lbnVtIGF1eF90eXBlIHsKLSAgYXV4X3RpciwJCQkvKiBUSVIgdHlwZSBpbmZvcm1hdGlvbiAqLwotICBhdXhfcm5keCwJCQkvKiByZWxhdGl2ZSBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLwotICBhdXhfZG5Mb3csCQkJLyogbG93IGRpbWVuc2lvbiAqLwotICBhdXhfZG5IaWdoLAkJCS8qIGhpZ2ggZGltZW5zaW9uICovCi0gIGF1eF9pc3ltLAkJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCAoZW5kIG9mIHByb2MpICovCi0gIGF1eF9pc3MsCQkJLyogaW5kZXggaW50byBzdHJpbmcgc3BhY2UgKG5vdCB1c2VkKSAqLwotICBhdXhfd2lkdGgsCQkJLyogd2lkdGggZm9yIG5vbi1kZWZhdWx0IHNpemVkIHN0cnVjIGZpZWxkcyAqLwotICBhdXhfY291bnQJCQkvKiBjb3VudCBvZiByYW5nZXMgZm9yIHZhcmlhbnQgYXJtICovCi19OwotDAotLyogU3RydWN0dXJlcyB0byBwcm92aWRlIG4tbnVtYmVyIG9mIHZpcnR1YWwgYXJyYXlzLCBlYWNoIG9mIHdoaWNoIGNhbgotICAgZ3JvdyBsaW5lYXJseSwgYW5kIHdoaWNoIGFyZSB3cml0dGVuIGluIHRoZSBvYmplY3QgZmlsZSBhcwotICAgc2VxdWVudGlhbCBwYWdlcy4gIE9uIHN5c3RlbXMgd2l0aCBhIEJTRCBtYWxsb2MsIHRoZQotICAgTUFYX0NMVVNURVJfUEFHRVMgc2hvdWxkIGJlIDEgbGVzcyB0aGFuIGEgcG93ZXIgb2YgdHdvLCBzaW5jZQotICAgbWFsbG9jIGFkZHMgaXQncyBvdmVyaGVhZCwgYW5kIHJvdW5kcyB1cCB0byB0aGUgbmV4dCBwb3dlciBvZiAyLgotICAgUGFnZXMgYXJlIGxpbmtlZCB0b2dldGhlciB2aWEgYSBsaW5rZWQgbGlzdC4KLQotICAgSWYgUEFHRV9TSVpFIGlzID4gNDA5NiwgdGhlIHN0cmluZyBsZW5ndGggaW4gdGhlIHNoYXNoX3Qgc3RydWN0dXJlCi0gICBjYW4ndCBiZSByZXByZXNlbnRlZCAoYXNzdW1pbmcgdGhlcmUgYXJlIHN0cmluZ3MgPiA0MDk2IGJ5dGVzKS4gICovCi0KLS8qIEZJWE1FOiBZZXMsIHRoZXJlIGNhbiBiZSBzdWNoIHN0cmluZ3Mgd2hpbGUgZW1pdHRpbmcgQysrIGNsYXNzIGRlYnVnCi0gICBpbmZvLiAgVGVtcGxhdGVzIGFyZSB0aGUgb2ZmZW5kZXIgaGVyZSwgdGhlIHRlc3QgY2FzZSBpbiBxdWVzdGlvbiAKLSAgIGhhdmluZyBhIG1hbmdsZWQgY2xhc3MgbmFtZSBvZgotCi0gICAgIHQ3cmJfdHJlZTRaNHhrZXladDRwYWlyMlpDNHhrZXladDd4c29ja2V0MVo0VXNlclp0OXNlbGVjdDFzdDJadDRwYWlyXAotICAgICAyWkM0eGtleVp0N3hzb2NrZXQxWjRVc2VyWjR4a2V5WnQ0bGVzczFaNHhrZXkKLQotICAgUmVwZWF0IHRoYXQgYSBjb3VwbGUgZG96ZW4gdGltZXMgd2hpbGUgbGlzdGluZyB0aGUgY2xhc3MgbWVtYmVycyBhbmQKLSAgIHlvdSd2ZSBnb3Qgc3RyaW5ncyBvdmVyIDRrLiAgSGFjayBhcm91bmQgdGhpcyBmb3Igbm93IGJ5IGluY3JlYXNpbmcKLSAgIHRoZSBwYWdlIHNpemUuICBBIHByb3BlciBzb2x1dGlvbiB3b3VsZCBhYmFuZG9uIHRoaXMgc3RydWN0dXJlIHNjaGVtZQotICAgY2VydGFpbmx5IGZvciB2ZXJ5IGxhcmdlIHN0cmluZ3MsIGFuZCBwb3NzaWJseSBlbnRpcmVseS4gICovCi0KLSNpZm5kZWYgUEFHRV9TSVpFCi0jZGVmaW5lIFBBR0VfU0laRSAoOCoxMDI0KQkvKiBzaXplIG9mIHZhcnJheSBwYWdlcyAqLwotI2VuZGlmCi0KLSNkZWZpbmUgUEFHRV9VU0laRSAoKHVuc2lnbmVkIGxvbmcpIFBBR0VfU0laRSkKLQotI2lmbmRlZiBNQVhfQ0xVU1RFUl9QQUdFUwkvKiAjIHBhZ2VzIHRvIGdldCBmcm9tIHN5c3RlbSAqLwotI2RlZmluZSBNQVhfQ0xVU1RFUl9QQUdFUyA2MwotI2VuZGlmCi0KLS8qIExpbmtlZCBsaXN0IGNvbm5lY3Rpbmcgc2VwYXJhdGUgcGFnZSBhbGxvY2F0aW9ucy4gICovCi10eXBlZGVmIHN0cnVjdCB2bGlua3MgewotICBzdHJ1Y3QgdmxpbmtzCSpwcmV2OwkJLyogcHJldmlvdXMgc2V0IG9mIHBhZ2VzICovCi0gIHN0cnVjdCB2bGlua3MgKm5leHQ7CQkvKiBuZXh0IHNldCBvZiBwYWdlcyAqLwotICB1bmlvbiAgcGFnZSAgICpkYXR1bTsJCS8qIHN0YXJ0IG9mIHBhZ2UgKi8KLSAgdW5zaWduZWQgbG9uZwkgc3RhcnRfaW5kZXg7CS8qIHN0YXJ0aW5nIGluZGV4ICMgb2YgcGFnZSAqLwotfSB2bGlua3NfdDsKLQotCi0vKiBWaXJ0dWFsIGFycmF5IGhlYWRlci4gICovCi10eXBlZGVmIHN0cnVjdCB2YXJyYXkgewotICB2bGlua3NfdAkqZmlyc3Q7CQkJLyogZmlyc3QgcGFnZSBsaW5rICovCi0gIHZsaW5rc190CSpsYXN0OwkJCS8qIGxhc3QgcGFnZSBsaW5rICovCi0gIHVuc2lnbmVkIGxvbmcJIG51bV9hbGxvY2F0ZWQ7CQkvKiAjIG9iamVjdHMgYWxsb2NhdGVkICovCi0gIHVuc2lnbmVkIHNob3J0IG9iamVjdF9zaXplOwkJLyogc2l6ZSBpbiBieXRlcyBvZiBlYWNoIG9iamVjdCAqLwotICB1bnNpZ25lZCBzaG9ydCBvYmplY3RzX3Blcl9wYWdlOwkvKiAjIG9iamVjdHMgdGhhdCBjYW4gZml0IG9uIGEgcGFnZSAqLwotICB1bnNpZ25lZCBzaG9ydCBvYmplY3RzX2xhc3RfcGFnZTsJLyogIyBvYmplY3RzIGFsbG9jYXRlZCBvbiBsYXN0IHBhZ2UgKi8KLX0gdmFycmF5X3Q7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0jZGVmaW5lIE9CSkVDVFNfUEVSX1BBR0UodHlwZSkgKFBBR0VfU0laRSAvIHNpemVvZiAodHlwZSkpCi0jZWxzZQotI2RlZmluZSBPQkpFQ1RTX1BFUl9QQUdFKHR5cGUpICgoc2l6ZW9mICh0eXBlKSA+IDEpID8gMSA6IFBBR0VfU0laRSkKLSNlbmRpZgotCi0jZGVmaW5lIElOSVRfVkFSUkFZKHR5cGUpIHsJLyogbWFjcm8gdG8gaW5pdGlhbGl6ZSBhIHZhcnJheSAqLwlcCi0gICh2bGlua3NfdCAqKTAsCQkvKiBmaXJzdCAqLwkJCQlcCi0gICh2bGlua3NfdCAqKTAsCQkvKiBsYXN0ICovCQkJCVwKLSAgMCwJCQkJLyogbnVtX2FsbG9jYXRlZCAqLwkJCVwKLSAgc2l6ZW9mICh0eXBlKSwJCS8qIG9iamVjdF9zaXplICovCQkJXAotICBPQkpFQ1RTX1BFUl9QQUdFICh0eXBlKSwJLyogb2JqZWN0c19wZXJfcGFnZSAqLwkJCVwKLSAgT0JKRUNUU19QRVJfUEFHRSAodHlwZSksCS8qIG9iamVjdHNfbGFzdF9wYWdlICovCQkJXAotfQotCi0KLS8qIE1hc3RlciB0eXBlIGZvciBpbmRleGVzIHdpdGhpbiB0aGUgc3ltYm9sIHRhYmxlLiAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIHN5bWludF90OwotCi0KLS8qIExpbmtlZCBsaXN0IHN1cHBvcnQgZm9yIG5lc3RlZCBzY29wZXMgKGZpbGUsIGJsb2NrLCBzdHJ1Y3R1cmUsIGV0Yy4pLiAgKi8KLXR5cGVkZWYgc3RydWN0IHNjb3BlIHsKLSAgc3RydWN0IHNjb3BlCSpwcmV2OwkJLyogcHJldmlvdXMgc2NvcGUgbGV2ZWwgKi8KLSAgc3RydWN0IHNjb3BlCSpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgc3RydWN0IGxvY2Fsc3ltICpsc3ltOwkvKiBwb2ludGVyIHRvIGxvY2FsIHN5bWJvbCBub2RlICovCi0gIHN0X3QJCSB0eXBlOwkJLyogdHlwZSBvZiB0aGUgbm9kZSAqLwotfSBzY29wZV90OwotCi0KLS8qIEZvciBhIGxvY2FsIHN5bWJvbCB3ZSBzdG9yZSBhIGdhcyBzeW1ib2wgYXMgd2VsbCBhcyB0aGUgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbiB3ZSBnZW5lcmF0ZS4gIFRoZSBnYXMgc3ltYm9sIHdpbGwgYmUgTlVMTCBpZiB0aGlzIGlzCi0gICBvbmx5IGEgZGVidWdnaW5nIHN5bWJvbC4gICovCi10eXBlZGVmIHN0cnVjdCBsb2NhbHN5bSB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBzeW1ib2wgbmFtZSAqLwotICBzeW1ib2xTICphc19zeW07CQkvKiBzeW1ib2wgYXMgc2VlbiBieSBnYXMgKi8KLSAgYmZkX3ZtYSBhZGRlbmQ7CQkvKiBhZGRlbmQgdG8gYXNfc3ltIHZhbHVlICovCi0gIHN0cnVjdCBlZmRyICpmaWxlX3B0cjsJLyogZmlsZSBwb2ludGVyICovCi0gIHN0cnVjdCBlY29mZl9wcm9jICpwcm9jX3B0cjsJLyogcHJvYyBwb2ludGVyICovCi0gIHN0cnVjdCBsb2NhbHN5bSAqYmVnaW5fcHRyOwkvKiBzeW1ib2wgYXQgc3RhcnQgb2YgYmxvY2sgKi8KLSAgc3RydWN0IGVjb2ZmX2F1eCAqaW5kZXhfcHRyOwkvKiBpbmRleCB2YWx1ZSB0byBiZSBmaWxsZWQgaW4gKi8KLSAgc3RydWN0IGZvcndhcmQgKmZvcndhcmRfcmVmOwkvKiBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gdGhpcyBzeW1ib2wgKi8KLSAgbG9uZyBzeW1faW5kZXg7CQkvKiBmaW5hbCBzeW1ib2wgaW5kZXggKi8KLSAgRVhUUiBlY29mZl9zeW07CQkvKiBFQ09GRiBkZWJ1Z2dpbmcgc3ltYm9sICovCi19IGxvY2Fsc3ltX3Q7Ci0KLQotLyogRm9yIGF1eCBpbmZvcm1hdGlvbiB3ZSBrZWVwIHRoZSB0eXBlIGFuZCB0aGUgZGF0YS4gICovCi10eXBlZGVmIHN0cnVjdCBlY29mZl9hdXggewotICBlbnVtIGF1eF90eXBlIHR5cGU7CQkvKiBhdXggdHlwZSAqLwotICBBVVhVIGRhdGE7CQkJLyogYXV4IGRhdGEgKi8KLX0gYXV4X3Q7Ci0KLS8qIEZvciBhIHByb2NlZHVyZSB3ZSBzdG9yZSB0aGUgZ2FzIHN5bWJvbCBhcyB3ZWxsIGFzIHRoZSBQRFIKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdCBlY29mZl9wcm9jIHsKLSAgbG9jYWxzeW1fdCAqc3ltOwkJLyogYXNzb2NpYXRlZCBzeW1ib2wgKi8KLSAgUERSIHBkcjsJCQkvKiBFQ09GRiBkZWJ1Z2dpbmcgaW5mbyAqLwotfSBwcm9jX3Q7Ci0KLS8qIE51bWJlciBvZiBwcm9jX3Qgc3RydWN0dXJlcyBhbGxvY2F0ZWQuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJvY19jbnQ7Ci0KLQotLyogRm9yd2FyZCByZWZlcmVuY2UgbGlzdCBmb3IgdGFncyByZWZlcmVuY2VkLCBidXQgbm90IHlldCBkZWZpbmVkLiAgKi8KLXR5cGVkZWYgc3RydWN0IGZvcndhcmQgewotICBzdHJ1Y3QgZm9yd2FyZCAqbmV4dDsJCS8qIG5leHQgZm9yd2FyZCByZWZlcmVuY2UgKi8KLSAgc3RydWN0IGZvcndhcmQgKmZyZWU7CQkvKiBmcmVlIGxpc3QgcG9pbnRlciAqLwotICBhdXhfdAkJICppZmRfcHRyOwkvKiBwb2ludGVyIHRvIHN0b3JlIGZpbGUgaW5kZXggKi8KLSAgYXV4X3QJCSAqaW5kZXhfcHRyOwkvKiBwb2ludGVyIHRvIHN0b3JlIHN5bWJvbCBpbmRleCAqLwotfSBmb3J3YXJkX3Q7Ci0KLQotLyogTGlua2VkIGxpc3Qgc3VwcG9ydCBmb3IgdGFncy4gIFRoZSBmaXJzdCB0YWcgaW4gdGhlIGxpc3QgaXMgYWx3YXlzCi0gICB0aGUgY3VycmVudCB0YWcgZm9yIHRoYXQgYmxvY2suICAqLwotdHlwZWRlZiBzdHJ1Y3QgdGFnIHsKLSAgc3RydWN0IHRhZwkgKmZyZWU7CQkvKiBmcmVlIGxpc3QgcG9pbnRlciAqLwotICBzdHJ1Y3Qgc2hhc2gJICpoYXNoX3B0cjsJLyogcG9pbnRlciB0byB0aGUgaGFzaCB0YWJsZSBoZWFkICovCi0gIHN0cnVjdCB0YWcJICpzYW1lX25hbWU7CS8qIHRhZyB3aXRoIHNhbWUgbmFtZSBpbiBvdXRlciBzY29wZSAqLwotICBzdHJ1Y3QgdGFnCSAqc2FtZV9ibG9jazsJLyogbmV4dCB0YWcgZGVmaW5lZCBpbiB0aGUgc2FtZSBibG9jay4gICovCi0gIHN0cnVjdCBmb3J3YXJkICpmb3J3YXJkX3JlZjsJLyogbGlzdCBvZiBmb3J3YXJkIHJlZmVyZW5jZXMgKi8KLSAgYnRfdAkJICBiYXNpY190eXBlOwkvKiBidF9TdHJ1Y3QsIGJ0X1VuaW9uLCBvciBidF9FbnVtICovCi0gIHN5bWludF90CSAgaWZkOwkJLyogZmlsZSAjIHRhZyBkZWZpbmVkIGluICovCi0gIGxvY2Fsc3ltX3QJICpzeW07CQkvKiBmaWxlJ3MgbG9jYWwgc3ltYm9scyAqLwotfSB0YWdfdDsKLQotCi0vKiBIZWFkIG9mIGEgYmxvY2sncyBsaW5rZWQgbGlzdCBvZiB0YWdzLiAgKi8KLXR5cGVkZWYgc3RydWN0IHRoZWFkIHsKLSAgc3RydWN0IHRoZWFkCSpwcmV2OwkJLyogcHJldmlvdXMgYmxvY2sgKi8KLSAgc3RydWN0IHRoZWFkCSpmcmVlOwkJLyogZnJlZSBsaXN0IHBvaW50ZXIgKi8KLSAgc3RydWN0IHRhZwkqZmlyc3RfdGFnOwkvKiBmaXJzdCB0YWcgaW4gYmxvY2sgZGVmaW5lZCAqLwotfSB0aGVhZF90OwotCi0KLS8qIFVuaW9uIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gZWFjaCB0aGUgc21hbGwgc3RydWN0dXJlcyB3aGljaCBhcmUgZnJlZWQgdXAuICAqLwotdHlwZWRlZiB1bmlvbiBzbWFsbF9mcmVlIHsKLSAgc2NvcGVfdAkqZl9zY29wZTsJLyogc2NvcGUgc3RydWN0dXJlICovCi0gIHRoZWFkX3QJKmZfdGhlYWQ7CS8qIHRhZyBoZWFkIHN0cnVjdHVyZSAqLwotICB0YWdfdAkJKmZfdGFnOwkJLyogdGFnIGVsZW1lbnQgc3RydWN0dXJlICovCi0gIGZvcndhcmRfdAkqZl9mb3J3YXJkOwkvKiBmb3J3YXJkIHRhZyByZWZlcmVuY2UgKi8KLX0gc21hbGxfZnJlZV90OwotCi0KLS8qIFN0cmluZyBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc2hhc2ggewotICBjaGFyCQkqc3RyaW5nOwkvKiBzdHJpbmcgd2UgYXJlIGhhc2hpbmcgKi8KLSAgc3ltaW50X3QJIGluZHg7CQkvKiBpbmRleCB3aXRoaW4gc3RyaW5nIHRhYmxlICovCi0gIEVYVFIJCSplc3ltX3B0cjsJLyogZ2xvYmFsIHN5bWJvbCBwb2ludGVyICovCi0gIGxvY2Fsc3ltX3QJKnN5bV9wdHI7CS8qIGxvY2FsIHN5bWJvbCBwb2ludGVyICovCi0gIGxvY2Fsc3ltX3QJKmVuZF9wdHI7CS8qIHN5bWJvbCBwb2ludGVyIHRvIGVuZCBibG9jayAqLwotICB0YWdfdAkJKnRhZ19wdHI7CS8qIHRhZyBwb2ludGVyICovCi0gIHByb2NfdAkqcHJvY19wdHI7CS8qIHByb2NlZHVyZSBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KLX0gc2hhc2hfdDsKLQotCi0vKiBUeXBlIGhhc2ggdGFibGUgc3VwcG9ydC4gIFRoZSBzaXplIG9mIHRoZSBoYXNoIHRhYmxlIG11c3QgZml0Ci0gICB3aXRoaW4gYSBwYWdlIHdpdGggdGhlIG90aGVyIGV4dGVuZGVkIGZpbGUgZGVzY3JpcHRvciBpbmZvcm1hdGlvbi4KLSAgIEJlY2F1c2UgdW5pcXVlIHR5cGVzIHdoaWNoIGFyZSBoYXNoZWQgYXJlIGZld2VyIGluIG51bWJlciB0aGFuCi0gICBzdHJpbmdzLCB3ZSB1c2UgYSBzbWFsbGVyIGhhc2ggdmFsdWUuICAqLwotCi0jZGVmaW5lIEhBU0hCSVRTIDMwCi0KLSNpZm5kZWYgVEhBU0hfU0laRQotI2RlZmluZSBUSEFTSF9TSVpFIDExMwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHRoYXNoIHsKLSAgc3RydWN0IHRoYXNoCSpuZXh0OwkJLyogbmV4dCBoYXNoIHZhbHVlICovCi0gIEFVWFUJCSB0eXBlOwkJLyogdHlwZSB3ZSBhcmUgaGFzaGluZyAqLwotICBzeW1pbnRfdAkgaW5keDsJCS8qIGluZGV4IHdpdGhpbiBzdHJpbmcgdGFibGUgKi8KLX0gdGhhc2hfdDsKLQotCi0vKiBFeHRlbmRlZCBmaWxlIGRlc2NyaXB0b3IgdGhhdCBjb250YWlucyBhbGwgb2YgdGhlIHN1cHBvcnQgbmVjZXNzYXJ5Ci0gICB0byBhZGQgdGhpbmdzIHRvIGVhY2ggZmlsZSBzZXBhcmF0ZWx5LiAgKi8KLXR5cGVkZWYgc3RydWN0IGVmZHIgewotICBGRFIJCSBmZHI7CQkvKiBGaWxlIGhlYWRlciB0byBiZSB3cml0dGVuIG91dCAqLwotICBGRFIJCSpvcmlnX2ZkcjsJLyogb3JpZ2luYWwgZmlsZSBoZWFkZXIgKi8KLSAgY2hhcgkJKm5hbWU7CQkvKiBmaWxlbmFtZSAqLwotICBpbnQJCSBmYWtlOwkJLyogd2hldGhlciB0aGlzIGlzIGZha2VkIC5maWxlICovCi0gIHN5bWludF90CSB2b2lkX3R5cGU7CS8qIGF1eC4gcG9pbnRlciB0byAndm9pZCcgdHlwZSAqLwotICBzeW1pbnRfdAkgaW50X3R5cGU7CS8qIGF1eC4gcG9pbnRlciB0byAnaW50JyB0eXBlICovCi0gIHNjb3BlX3QJKmN1cl9zY29wZTsJLyogY3VycmVudCBuZXN0ZWQgc2NvcGVzICovCi0gIHN5bWludF90CSBmaWxlX2luZGV4OwkvKiBjdXJyZW50IGZpbGUgbnVtYmVyICovCi0gIGludAkJIG5lc3RlZF9zY29wZXM7CS8qICMgbmVzdGVkIHNjb3BlcyAqLwotICB2YXJyYXlfdAkgc3RyaW5nczsJLyogbG9jYWwgc3RyaW5ncyAqLwotICB2YXJyYXlfdAkgc3ltYm9sczsJLyogbG9jYWwgc3ltYm9scyAqLwotICB2YXJyYXlfdAkgcHJvY3M7CQkvKiBwcm9jZWR1cmVzICovCi0gIHZhcnJheV90CSBhdXhfc3ltczsJLyogYXV4aWxpYXJ5IHN5bWJvbHMgKi8KLSAgc3RydWN0IGVmZHIJKm5leHRfZmlsZTsJLyogbmV4dCBmaWxlIGRlc2NyaXB0b3IgKi8KLQkJCQkvKiBzdHJpbmcvdHlwZSBoYXNoIHRhYmxlcyAqLwotICBzdHJ1Y3QgaGFzaF9jb250cm9sICpzdHJfaGFzaDsJLyogc3RyaW5nIGhhc2ggdGFibGUgKi8KLSAgdGhhc2hfdAkqdGhhc2hfaGVhZFtUSEFTSF9TSVpFXTsKLX0gZWZkcl90OwotCi0vKiBQcmUtaW5pdGlhbGl6ZWQgZXh0ZW5kZWQgZmlsZSBzdHJ1Y3R1cmUuICAqLwotc3RhdGljIGNvbnN0IGVmZHJfdCBpbml0X2ZpbGUgPQotewotICB7CQkJLyogRkRSIHN0cnVjdHVyZSAqLwotICAgIDAsCQkJLyogYWRyOgkJbWVtb3J5IGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIGZpbGUgKi8KLSAgICAwLAkJCS8qIHJzczoJCWZpbGUgbmFtZSAob2Ygc291cmNlLCBpZiBrbm93bikgKi8KLSAgICAwLAkJCS8qIGlzc0Jhc2U6CWZpbGUncyBzdHJpbmcgc3BhY2UgKi8KLSAgICAwLAkJCS8qIGNiU3M6CW51bWJlciBvZiBieXRlcyBpbiB0aGUgc3MgKi8KLSAgICAwLAkJCS8qIGlzeW1CYXNlOgliZWdpbm5pbmcgb2Ygc3ltYm9scyAqLwotICAgIDAsCQkJLyogY3N5bToJY291bnQgZmlsZSdzIG9mIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGlsaW5lQmFzZToJZmlsZSdzIGxpbmUgc3ltYm9scyAqLwotICAgIDAsCQkJLyogY2xpbmU6CWNvdW50IG9mIGZpbGUncyBsaW5lIHN5bWJvbHMgKi8KLSAgICAwLAkJCS8qIGlvcHRCYXNlOglmaWxlJ3Mgb3B0aW1pemF0aW9uIGVudHJpZXMgKi8KLSAgICAwLAkJCS8qIGNvcHQ6CWNvdW50IG9mIGZpbGUncyBvcHRpbWl6YXRpb24gZW50cmllcyAqLwotICAgIDAsCQkJLyogaXBkRmlyc3Q6CXN0YXJ0IG9mIHByb2NlZHVyZXMgZm9yIHRoaXMgZmlsZSAqLwotICAgIDAsCQkJLyogY3BkOgkJY291bnQgb2YgcHJvY2VkdXJlcyBmb3IgdGhpcyBmaWxlICovCi0gICAgMCwJCQkvKiBpYXV4QmFzZToJZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0gICAgMCwJCQkvKiBjYXV4Ogljb3VudCBvZiBmaWxlJ3MgYXV4aWxpYXJ5IGVudHJpZXMgKi8KLSAgICAwLAkJCS8qIHJmZEJhc2U6CWluZGV4IGludG8gdGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgKi8KLSAgICAwLAkJCS8qIGNyZmQ6CWNvdW50IGZpbGUgaW5kaXJlY3QgZW50cmllcyAqLwotICAgIGxhbmdDLAkJLyogbGFuZzoJbGFuZ3VhZ2UgZm9yIHRoaXMgZmlsZSAqLwotICAgIDEsCQkJLyogZk1lcmdlOgl3aGV0aGVyIHRoaXMgZmlsZSBjYW4gYmUgbWVyZ2VkICovCi0gICAgMCwJCQkvKiBmUmVhZGluOgl0cnVlIGlmIHJlYWQgaW4gKG5vdCBqdXN0IGNyZWF0ZWQpICovCi0gICAgVEFSR0VUX0JZVEVTX0JJR19FTkRJQU4sICAvKiBmQmlnZW5kaWFuOglpZiAxLCBjb21waWxlZCBvbiBiaWcgZW5kaWFuIG1hY2hpbmUgKi8KLSAgICBHTEVWRUxfMiwJCS8qIGdsZXZlbDoJbGV2ZWwgdGhpcyBmaWxlIHdhcyBjb21waWxlZCB3aXRoICovCi0gICAgMCwJCQkvKiByZXNlcnZlZDoJcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLSAgICAwLAkJCS8qIGNiTGluZU9mZnNldDogYnl0ZSBvZmZzZXQgZnJvbSBoZWFkZXIgZm9yIHRoaXMgZmlsZSBsbidzICovCi0gICAgMCwJCQkvKiBjYkxpbmU6CXNpemUgb2YgbGluZXMgZm9yIHRoaXMgZmlsZSAqLwotICB9LAotCi0gIChGRFIgKikwLAkJLyogb3JpZ19mZHI6CW9yaWdpbmFsIGZpbGUgaGVhZGVyIHBvaW50ZXIgKi8KLSAgKGNoYXIgKikwLAkJLyogbmFtZToJcG9pbnRlciB0byBmaWxlbmFtZSAqLwotICAwLAkJCS8qIGZha2U6CXdoZXRoZXIgdGhpcyBpcyBhIGZha2VkIC5maWxlICovCi0gIDAsCQkJLyogdm9pZF90eXBlOglwdHIgdG8gYXV4IG5vZGUgZm9yIHZvaWQgdHlwZSAqLwotICAwLAkJCS8qIGludF90eXBlOglwdHIgdG8gYXV4IG5vZGUgZm9yIGludCB0eXBlICovCi0gIChzY29wZV90ICopMCwJCS8qIGN1cl9zY29wZToJY3VycmVudCBzY29wZSBiZWluZyBwcm9jZXNzZWQgKi8KLSAgMCwJCQkvKiBmaWxlX2luZGV4OgljdXJyZW50IGZpbGUgIyAqLwotICAwLAkJCS8qIG5lc3RlZF9zY29wZXM6ICMgbmVzdGVkIHNjb3BlcyAqLwotICBJTklUX1ZBUlJBWSAoY2hhciksCS8qIHN0cmluZ3M6CWxvY2FsIHN0cmluZyB2YXJyYXkgKi8KLSAgSU5JVF9WQVJSQVkgKGxvY2Fsc3ltX3QpLAkvKiBzeW1ib2xzOglsb2NhbCBzeW1ib2xzIHZhcnJheSAqLwotICBJTklUX1ZBUlJBWSAocHJvY190KSwJLyogcHJvY3M6CXByb2NlZHVyZSB2YXJyYXkgKi8KLSAgSU5JVF9WQVJSQVkgKGF1eF90KSwJLyogYXV4X3N5bXM6CWF1eGlsaWFyeSBzeW1ib2xzIHZhcnJheSAqLwotCi0gIChzdHJ1Y3QgZWZkciAqKTAsCS8qIG5leHRfZmlsZToJbmV4dCBmaWxlIHN0cnVjdHVyZSAqLwotCi0gIChzdHJ1Y3QgaGFzaF9jb250cm9sICopMCwJLyogc3RyX2hhc2g6CXN0cmluZyBoYXNoIHRhYmxlICovCi0gIHsgMCB9LAkJLyogdGhhc2hfaGVhZDoJdHlwZSBoYXNoIHRhYmxlICovCi19OwotCi0KLXN0YXRpYyBlZmRyX3QgKmZpcnN0X2ZpbGU7CQkJLyogZmlyc3QgZmlsZSBkZXNjcmlwdG9yICovCi1zdGF0aWMgZWZkcl90ICoqbGFzdF9maWxlX3B0ciA9ICZmaXJzdF9maWxlOwkvKiBmaWxlIGRlc2NyaXB0b3IgdGFpbCAqLwotCi0KLS8qIExpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGlzIGtlcHQgaW4gYSBsaXN0IHVudGlsIHRoZSBhc3NlbWJseSBpcwotICAgZmluaXNoZWQuICAqLwotdHlwZWRlZiBzdHJ1Y3QgbGluZW5vX2xpc3QgewotICBzdHJ1Y3QgbGluZW5vX2xpc3QgKm5leHQ7CS8qIG5leHQgZWxlbWVudCBpbiBsaXN0ICovCi0gIGVmZHJfdCAqZmlsZTsJCQkvKiBmaWxlIHRoaXMgbGluZSBpcyBpbiAqLwotICBwcm9jX3QgKnByb2M7CQkJLyogcHJvY2VkdXJlIHRoaXMgbGluZSBpcyBpbiAqLwotICBmcmFnUyAqZnJhZzsJCQkvKiBmcmFnbWVudCB0aGlzIGxpbmUgbnVtYmVyIGlzIGluICovCi0gIHVuc2lnbmVkIGxvbmcgcGFkZHI7CQkvKiBvZmZzZXQgd2l0aGluIGZyYWdtZW50ICovCi0gIGxvbmcgbGluZW5vOwkJCS8qIGFjdHVhbCBsaW5lIG51bWJlciAqLwotfSBsaW5lbm9fbGlzdF90OwotCi1zdGF0aWMgbGluZW5vX2xpc3RfdCAqZmlyc3RfbGluZW5vOwotc3RhdGljIGxpbmVub19saXN0X3QgKmxhc3RfbGluZW5vOwotc3RhdGljIGxpbmVub19saXN0X3QgKipsYXN0X2xpbmVub19wdHIgPSAmZmlyc3RfbGluZW5vOwotCi0vKiBTb21ldGltZXMgdGhlcmUgd2lsbCBiZSBzb21lIC5sb2Mgc3RhdGVtZW50cyBiZWZvcmUgYSAuZW50LiAgV2UKLSAgIGtlZXAgdGhlbSBpbiB0aGlzIGxpc3Qgc28gdGhhdCB3ZSBjYW4gZmlsbCBpbiB0aGUgcHJvY2VkdXJlIHBvaW50ZXIKLSAgIGFmdGVyIHdlIHNlZSB0aGUgLmVudC4gICovCi1zdGF0aWMgbGluZW5vX2xpc3RfdCAqbm9wcm9jX2xpbmVubzsKLQotLyogVW5pb24gb2YgdmFyaW91cyB0aGluZ3MgdGhhdCBhcmUgaGVsZCBpbiBwYWdlcy4gICovCi10eXBlZGVmIHVuaW9uIHBhZ2UgewotICBjaGFyCQlieXRlCVsgUEFHRV9TSVpFIF07Ci0gIHVuc2lnbmVkIGNoYXIJdWJ5dGUJWyBQQUdFX1NJWkUgXTsKLSAgZWZkcl90CWZpbGUJWyBQQUdFX1NJWkUgLyBzaXplb2YgKGVmZHJfdCkJICAgICBdOwotICBGRFIJCW9maWxlCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChGRFIpCSAgICAgXTsKLSAgcHJvY190CXByb2MJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHByb2NfdCkJICAgICBdOwotICBsb2NhbHN5bV90CXN5bQlbIFBBR0VfU0laRSAvIHNpemVvZiAobG9jYWxzeW1fdCkgICAgXTsKLSAgYXV4X3QJCWF1eAlbIFBBR0VfU0laRSAvIHNpemVvZiAoYXV4X3QpCSAgICAgXTsKLSAgRE5SCQlkZW5zZQlbIFBBR0VfU0laRSAvIHNpemVvZiAoRE5SKQkgICAgIF07Ci0gIHNjb3BlX3QJc2NvcGUJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHNjb3BlX3QpCSAgICAgXTsKLSAgdmxpbmtzX3QJdmxpbmtzCVsgUEFHRV9TSVpFIC8gc2l6ZW9mICh2bGlua3NfdCkJICAgICBdOwotICBzaGFzaF90CXNoYXNoCVsgUEFHRV9TSVpFIC8gc2l6ZW9mIChzaGFzaF90KQkgICAgIF07Ci0gIHRoYXNoX3QJdGhhc2gJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHRoYXNoX3QpCSAgICAgXTsKLSAgdGFnX3QJCXRhZwlbIFBBR0VfU0laRSAvIHNpemVvZiAodGFnX3QpCSAgICAgXTsKLSAgZm9yd2FyZF90CWZvcndhcmQJWyBQQUdFX1NJWkUgLyBzaXplb2YgKGZvcndhcmRfdCkgICAgIF07Ci0gIHRoZWFkX3QJdGhlYWQJWyBQQUdFX1NJWkUgLyBzaXplb2YgKHRoZWFkX3QpCSAgICAgXTsKLSAgbGluZW5vX2xpc3RfdAlsaW5lbm8JWyBQQUdFX1NJWkUgLyBzaXplb2YgKGxpbmVub19saXN0X3QpIF07Ci19IHBhZ2VfdHlwZTsKLQotCi0vKiBTdHJ1Y3R1cmUgaG9sZGluZyBhbGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBzbWFsbCBzaXplZCBzdHJ1Y3R1cmVzLiAgKi8KLXR5cGVkZWYgc3RydWN0IGFsbG9jX2luZm8gewotICBjaGFyCQkqYWxsb2NfbmFtZTsJLyogbmFtZSBvZiB0aGlzIGFsbG9jYXRpb24gdHlwZSAobXVzdCBiZSBmaXJzdCkgKi8KLSAgcGFnZV90eXBlCSpjdXJfcGFnZTsJLyogY3VycmVudCBwYWdlIGJlaW5nIGFsbG9jYXRlZCBmcm9tICovCi0gIHNtYWxsX2ZyZWVfdAkgZnJlZV9saXN0OwkvKiBjdXJyZW50IGZyZWUgbGlzdCBpZiBhbnkgKi8KLSAgaW50CQkgdW5hbGxvY2F0ZWQ7CS8qIG51bWJlciBvZiBlbGVtZW50cyB1bmFsbG9jYXRlZCBvbiBwYWdlICovCi0gIGludAkJIHRvdGFsX2FsbG9jOwkvKiB0b3RhbCBudW1iZXIgb2YgYWxsb2NhdGlvbnMgKi8KLSAgaW50CQkgdG90YWxfZnJlZTsJLyogdG90YWwgbnVtYmVyIG9mIGZyZWVzICovCi0gIGludAkJIHRvdGFsX3BhZ2VzOwkvKiB0b3RhbCBudW1iZXIgb2YgcGFnZXMgYWxsb2NhdGVkICovCi19IGFsbG9jX2luZm9fdDsKLQotCi0vKiBUeXBlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCB0b2dldGhlci4gICovCi10eXBlZGVmIHN0cnVjdCB0eXBlX2luZm8gewotICBidF90CSAgICAgIGJhc2ljX3R5cGU7CQkvKiBiYXNpYyB0eXBlICovCi0gIGludAkgICAgICBvcmlnX3R5cGU7CQkvKiBvcmlnaW5hbCBDT0ZGLWJhc2VkIHR5cGUgKi8KLSAgaW50CSAgICAgIG51bV90cTsJCQkvKiAjIHR5cGUgcXVhbGlmaWVycyAqLwotICBpbnQJICAgICAgbnVtX2RpbXM7CQkJLyogIyBkaW1lbnNpb25zICovCi0gIGludAkgICAgICBudW1fc2l6ZXM7CQkvKiAjIHNpemVzICovCi0gIGludAkgICAgICBleHRyYV9zaXplczsJCS8qICMgZXh0cmEgc2l6ZXMgbm90IHRpZWQgd2l0aCBkaW1zICovCi0gIHRhZ190ICogICAgIHRhZ19wdHI7CQkJLyogdGFnIHBvaW50ZXIgKi8KLSAgaW50CSAgICAgIGJpdGZpZWxkOwkJCS8qIHN5bWJvbCBpcyBhIGJpdGZpZWxkICovCi0gIHRxX3QJICAgICAgdHlwZV9xdWFsaWZpZXJzW05fVFFdOwkvKiB0eXBlIHF1YWxpZmllcnMgKHB0ciwgZnVuYywgYXJyYXkpKi8KLSAgc3ltaW50X3QgICAgZGltZW5zaW9ucyAgICAgW05fVFFdOwkvKiBkaW1lbnNpb25zIGZvciBlYWNoIGFycmF5ICovCi0gIHN5bWludF90ICAgIHNpemVzCSAgICAgW05fVFErMl07CS8qIHNpemVzIG9mIGVhY2ggYXJyYXkgc2xpY2UgKyBzaXplIG9mCi0JCQkJCSAgIHN0cnVjdC91bmlvbi9lbnVtICsgYml0ZmllbGQgc2l6ZSAqLwotfSB0eXBlX2luZm9fdDsKLQotLyogUHJlLWluaXRpYWxpemVkIHR5cGVfaW5mbyBzdHJ1Y3QuICAqLwotc3RhdGljIGNvbnN0IHR5cGVfaW5mb190IHR5cGVfaW5mb19pbml0ID0gewotICBidF9OaWwsCQkJCS8qIGJhc2ljIHR5cGUgKi8KLSAgVF9OVUxMLAkJCQkvKiBvcmlnaW5hbCBDT0ZGLWJhc2VkIHR5cGUgKi8KLSAgMCwJCQkJCS8qICMgdHlwZSBxdWFsaWZpZXJzICovCi0gIDAsCQkJCQkvKiAjIGRpbWVuc2lvbnMgKi8KLSAgMCwJCQkJCS8qICMgc2l6ZXMgKi8KLSAgMCwJCQkJCS8qIHNpemVzIG5vdCB0aWVkIHdpdGggZGltcyAqLwotICBOVUxMLAkJCQkJLyogcHRyIHRvIHRhZyAqLwotICAwLAkJCQkJLyogYml0ZmllbGQgKi8KLSAgewkJCQkJLyogdHlwZSBxdWFsaWZpZXJzICovCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gICAgdHFfTmlsLAotICAgIHRxX05pbCwKLSAgICB0cV9OaWwsCi0gIH0sCi0gIHsJCQkJCS8qIGRpbWVuc2lvbnMgKi8KLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMAotICB9LAotICB7CQkJCQkvKiBzaXplcyAqLwotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDAsCi0gICAgMCwKLSAgfSwKLX07Ci0KLS8qIEdsb2JhbCBoYXNoIHRhYmxlIGZvciB0aGUgdGFncyB0YWJsZSBhbmQgZ2xvYmFsIHRhYmxlIGZvciBmaWxlCi0gICBkZXNjcmlwdG9ycy4gICovCi0KLXN0YXRpYyB2YXJyYXlfdCBmaWxlX2Rlc2MJPSBJTklUX1ZBUlJBWSAoZWZkcl90KTsKLQotc3RhdGljIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhZ19oYXNoOwotCi0vKiBTdGF0aWMgdHlwZXMgZm9yIGludCBhbmQgdm9pZC4gIEFsc28sIHJlbWVtYmVyIHRoZSBsYXN0IGZ1bmN0aW9uJ3MKLSAgIHR5cGUgKHdoaWNoIGlzIHNldCB1cCB3aGVuIHdlIGVuY291bnRlciB0aGUgZGVjbGFyYXRpb24gZm9yIHRoZQotICAgZnVuY3Rpb24sIGFuZCB1c2VkIHdoZW4gdGhlIGVuZCBibG9jayBmb3IgdGhlIGZ1bmN0aW9uIGlzIGVtaXR0ZWQuICAqLwotCi1zdGF0aWMgdHlwZV9pbmZvX3QgaW50X3R5cGVfaW5mbzsKLXN0YXRpYyB0eXBlX2luZm9fdCB2b2lkX3R5cGVfaW5mbzsKLXN0YXRpYyB0eXBlX2luZm9fdCBsYXN0X2Z1bmNfdHlwZV9pbmZvOwotc3RhdGljIHN5bWJvbFMgKmxhc3RfZnVuY19zeW1fdmFsdWU7Ci0KLQotLyogQ29udmVydCBDT0ZGIGJhc2ljIHR5cGUgdG8gRUNPRkYgYmFzaWMgdHlwZS4gIFRoZSBUX05VTEwgdHlwZQotICAgcmVhbGx5IHNob3VsZCB1c2UgYnRfVm9pZCwgYnV0IHRoaXMgY2F1c2VzIHRoZSBjdXJyZW50IGVjb2ZmIEdEQiB0bwotICAgaXNzdWUgdW5zdXBwb3J0ZWQgdHlwZSBtZXNzYWdlcywgYW5kIHRoZSBVbHRyaXggNC4wMCBkYnggKGFrYSBNSVBTCi0gICAyLjApIGRvZXNuJ3QgdW5kZXJzdGFuZCBpdCwgZXZlbiB0aG91Z2ggdGhlIGNvbXBpbGVyIGdlbmVyYXRlcyBpdC4KLSAgIE1heWJlIHRoaXMgd2lsbCBiZSBmaXhlZCBpbiAyLjEwIG9yIDIuMjAgb2YgdGhlIE1JUFMgY29tcGlsZXIKLSAgIHN1aXRlLCBidXQgZm9yIG5vdyBnbyB3aXRoIHdoYXQgd29ya3MuCi0KLSAgIEl0IHdvdWxkIG1ha2Ugc2Vuc2UgZm9yIHRoZSAudHlwZSBhbmQgLnNjbCBkaXJlY3RpdmVzIHRvIHVzZSB0aGUKLSAgIEVDT0ZGIG51bWJlcnMgZGlyZWN0bHksIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBDT0ZGIG51bWJlcnMgYW5kCi0gICBtYXBwaW5nIHRoZW0uICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIGhpc3RvcmljYWxseSB3aGF0IG1pcHMtdGZpbGUKLSAgIGV4cGVjdHMsIGFuZCBjaGFuZ2luZyBnY2Mgbm93IHdvdWxkIGJlIGEgY29uc2lkZXJhYmxlIHBhaW4gKHRoZQotICAgbmF0aXZlIGNvbXBpbGVyIGdlbmVyYXRlcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW50ZXJuYWxseSwgcmF0aGVyCi0gICB0aGFuIHZpYSB0aGUgYXNzZW1ibGVyLCBzbyBpdCB3aWxsIG5ldmVyIHVzZSAudHlwZSBvciAuc2NsKS4gICovCi0KLXN0YXRpYyBjb25zdCBidF90IG1hcF9jb2ZmX3R5cGVzW10gPSB7Ci0gIGJ0X05pbCwJCQkvKiBUX05VTEwgKi8KLSAgYnRfTmlsLAkJCS8qIFRfQVJHICovCi0gIGJ0X0NoYXIsCQkJLyogVF9DSEFSICovCi0gIGJ0X1Nob3J0LAkJCS8qIFRfU0hPUlQgKi8KLSAgYnRfSW50LAkJCS8qIFRfSU5UICovCi0gIGJ0X0xvbmcsCQkJLyogVF9MT05HICovCi0gIGJ0X0Zsb2F0LAkJCS8qIFRfRkxPQVQgKi8KLSAgYnRfRG91YmxlLAkJCS8qIFRfRE9VQkxFICovCi0gIGJ0X1N0cnVjdCwJCQkvKiBUX1NUUlVDVCAqLwotICBidF9VbmlvbiwJCQkvKiBUX1VOSU9OICovCi0gIGJ0X0VudW0sCQkJLyogVF9FTlVNICovCi0gIGJ0X0VudW0sCQkJLyogVF9NT0UgKi8KLSAgYnRfVUNoYXIsCQkJLyogVF9VQ0hBUiAqLwotICBidF9VU2hvcnQsCQkJLyogVF9VU0hPUlQgKi8KLSAgYnRfVUludCwJCQkvKiBUX1VJTlQgKi8KLSAgYnRfVUxvbmcJCQkvKiBUX1VMT05HICovCi19OwotCi0vKiBDb252ZXJ0IENPRkYgc3RvcmFnZSBjbGFzcyB0byBFQ09GRiBzdG9yYWdlIGNsYXNzLiAgKi8KLXN0YXRpYyBjb25zdCBzY190IG1hcF9jb2ZmX3N0b3JhZ2VbXSA9IHsKLSAgc2NfTmlsLAkJCS8qICAgMDogQ19OVUxMICovCi0gIHNjX0FicywJCQkvKiAgIDE6IENfQVVUTwkgIGF1dG8gdmFyICovCi0gIHNjX1VuZGVmaW5lZCwJCQkvKiAgIDI6IENfRVhUCSAgZXh0ZXJuYWwgKi8KLSAgc2NfRGF0YSwJCQkvKiAgIDM6IENfU1RBVAkgIHN0YXRpYyAqLwotICBzY19SZWdpc3RlciwJCQkvKiAgIDQ6IENfUkVHCSAgcmVnaXN0ZXIgKi8KLSAgc2NfVW5kZWZpbmVkLAkJCS8qICAgNTogQ19FWFRERUYgID8/PyAqLwotICBzY19UZXh0LAkJCS8qICAgNjogQ19MQUJFTAkgIGxhYmVsICovCi0gIHNjX1RleHQsCQkJLyogICA3OiBDX1VMQUJFTCAgdXNlciBsYWJlbCAqLwotICBzY19JbmZvLAkJCS8qICAgODogQ19NT1MJICBtZW1iZXIgb2Ygc3RydWN0ICovCi0gIHNjX0FicywJCQkvKiAgIDk6IENfQVJHCSAgYXJndW1lbnQgKi8KLSAgc2NfSW5mbywJCQkvKiAgMTA6IENfU1RSVEFHICBzdHJ1Y3QgdGFnICovCi0gIHNjX0luZm8sCQkJLyogIDExOiBDX01PVQkgIG1lbWJlciBvZiB1bmlvbiAqLwotICBzY19JbmZvLAkJCS8qICAxMjogQ19VTlRBRyAgIHVuaW9uIHRhZyAqLwotICBzY19JbmZvLAkJCS8qICAxMzogQ19UUERFRgkgIHR5cGVkZWYgKi8KLSAgc2NfRGF0YSwJCQkvKiAgMTQ6IENfVVNUQVRJQyA/Pz8gKi8KLSAgc2NfSW5mbywJCQkvKiAgMTU6IENfRU5UQUcJICBlbnVtIHRhZyAqLwotICBzY19JbmZvLAkJCS8qICAxNjogQ19NT0UJICBtZW1iZXIgb2YgZW51bSAqLwotICBzY19SZWdpc3RlciwJCQkvKiAgMTc6IENfUkVHUEFSTSByZWdpc3RlciBwYXJhbWV0ZXIgKi8KLSAgc2NfQml0cywJCQkvKiAgMTg7IENfRklFTEQJICBiaXRmaWVsZCAqLwotICBzY19OaWwsCQkJLyogIDE5ICovCi0gIHNjX05pbCwJCQkvKiAgMjAgKi8KLSAgc2NfTmlsLAkJCS8qICAyMSAqLwotICBzY19OaWwsCQkJLyogIDIyICovCi0gIHNjX05pbCwJCQkvKiAgMjMgKi8KLSAgc2NfTmlsLAkJCS8qICAyNCAqLwotICBzY19OaWwsCQkJLyogIDI1ICovCi0gIHNjX05pbCwJCQkvKiAgMjYgKi8KLSAgc2NfTmlsLAkJCS8qICAyNyAqLwotICBzY19OaWwsCQkJLyogIDI4ICovCi0gIHNjX05pbCwJCQkvKiAgMjkgKi8KLSAgc2NfTmlsLAkJCS8qICAzMCAqLwotICBzY19OaWwsCQkJLyogIDMxICovCi0gIHNjX05pbCwJCQkvKiAgMzIgKi8KLSAgc2NfTmlsLAkJCS8qICAzMyAqLwotICBzY19OaWwsCQkJLyogIDM0ICovCi0gIHNjX05pbCwJCQkvKiAgMzUgKi8KLSAgc2NfTmlsLAkJCS8qICAzNiAqLwotICBzY19OaWwsCQkJLyogIDM3ICovCi0gIHNjX05pbCwJCQkvKiAgMzggKi8KLSAgc2NfTmlsLAkJCS8qICAzOSAqLwotICBzY19OaWwsCQkJLyogIDQwICovCi0gIHNjX05pbCwJCQkvKiAgNDEgKi8KLSAgc2NfTmlsLAkJCS8qICA0MiAqLwotICBzY19OaWwsCQkJLyogIDQzICovCi0gIHNjX05pbCwJCQkvKiAgNDQgKi8KLSAgc2NfTmlsLAkJCS8qICA0NSAqLwotICBzY19OaWwsCQkJLyogIDQ2ICovCi0gIHNjX05pbCwJCQkvKiAgNDcgKi8KLSAgc2NfTmlsLAkJCS8qICA0OCAqLwotICBzY19OaWwsCQkJLyogIDQ5ICovCi0gIHNjX05pbCwJCQkvKiAgNTAgKi8KLSAgc2NfTmlsLAkJCS8qICA1MSAqLwotICBzY19OaWwsCQkJLyogIDUyICovCi0gIHNjX05pbCwJCQkvKiAgNTMgKi8KLSAgc2NfTmlsLAkJCS8qICA1NCAqLwotICBzY19OaWwsCQkJLyogIDU1ICovCi0gIHNjX05pbCwJCQkvKiAgNTYgKi8KLSAgc2NfTmlsLAkJCS8qICA1NyAqLwotICBzY19OaWwsCQkJLyogIDU4ICovCi0gIHNjX05pbCwJCQkvKiAgNTkgKi8KLSAgc2NfTmlsLAkJCS8qICA2MCAqLwotICBzY19OaWwsCQkJLyogIDYxICovCi0gIHNjX05pbCwJCQkvKiAgNjIgKi8KLSAgc2NfTmlsLAkJCS8qICA2MyAqLwotICBzY19OaWwsCQkJLyogIDY0ICovCi0gIHNjX05pbCwJCQkvKiAgNjUgKi8KLSAgc2NfTmlsLAkJCS8qICA2NiAqLwotICBzY19OaWwsCQkJLyogIDY3ICovCi0gIHNjX05pbCwJCQkvKiAgNjggKi8KLSAgc2NfTmlsLAkJCS8qICA2OSAqLwotICBzY19OaWwsCQkJLyogIDcwICovCi0gIHNjX05pbCwJCQkvKiAgNzEgKi8KLSAgc2NfTmlsLAkJCS8qICA3MiAqLwotICBzY19OaWwsCQkJLyogIDczICovCi0gIHNjX05pbCwJCQkvKiAgNzQgKi8KLSAgc2NfTmlsLAkJCS8qICA3NSAqLwotICBzY19OaWwsCQkJLyogIDc2ICovCi0gIHNjX05pbCwJCQkvKiAgNzcgKi8KLSAgc2NfTmlsLAkJCS8qICA3OCAqLwotICBzY19OaWwsCQkJLyogIDc5ICovCi0gIHNjX05pbCwJCQkvKiAgODAgKi8KLSAgc2NfTmlsLAkJCS8qICA4MSAqLwotICBzY19OaWwsCQkJLyogIDgyICovCi0gIHNjX05pbCwJCQkvKiAgODMgKi8KLSAgc2NfTmlsLAkJCS8qICA4NCAqLwotICBzY19OaWwsCQkJLyogIDg1ICovCi0gIHNjX05pbCwJCQkvKiAgODYgKi8KLSAgc2NfTmlsLAkJCS8qICA4NyAqLwotICBzY19OaWwsCQkJLyogIDg4ICovCi0gIHNjX05pbCwJCQkvKiAgODkgKi8KLSAgc2NfTmlsLAkJCS8qICA5MCAqLwotICBzY19OaWwsCQkJLyogIDkxICovCi0gIHNjX05pbCwJCQkvKiAgOTIgKi8KLSAgc2NfTmlsLAkJCS8qICA5MyAqLwotICBzY19OaWwsCQkJLyogIDk0ICovCi0gIHNjX05pbCwJCQkvKiAgOTUgKi8KLSAgc2NfTmlsLAkJCS8qICA5NiAqLwotICBzY19OaWwsCQkJLyogIDk3ICovCi0gIHNjX05pbCwJCQkvKiAgOTggKi8KLSAgc2NfTmlsLAkJCS8qICA5OSAqLwotICBzY19UZXh0LAkJCS8qIDEwMDogQ19CTE9DSyAgYmxvY2sgc3RhcnQvZW5kICovCi0gIHNjX1RleHQsCQkJLyogMTAxOiBDX0ZDTgkgZnVuY3Rpb24gc3RhcnQvZW5kICovCi0gIHNjX0luZm8sCQkJLyogMTAyOiBDX0VPUwkgZW5kIG9mIHN0cnVjdC91bmlvbi9lbnVtICovCi0gIHNjX05pbCwJCQkvKiAxMDM6IENfRklMRQkgZmlsZSBzdGFydCAqLwotICBzY19OaWwsCQkJLyogMTA0OiBDX0xJTkUJIGxpbmUgbnVtYmVyICovCi0gIHNjX05pbCwJCQkvKiAxMDU6IENfQUxJQVMJIGNvbWJpbmVkIHR5cGUgaW5mbyAqLwotICBzY19OaWwsCQkJLyogMTA2OiBDX0hJRERFTiA/Pz8gKi8KLX07Ci0KLS8qIENvbnZlcnQgQ09GRiBzdG9yYWdlIGNsYXNzIHRvIEVDT0ZGIHN5bWJvbCB0eXBlLiAgKi8KLXN0YXRpYyBjb25zdCBzdF90IG1hcF9jb2ZmX3N5bV90eXBlW10gPSB7Ci0gIHN0X05pbCwJCQkvKiAgIDA6IENfTlVMTCAqLwotICBzdF9Mb2NhbCwJCQkvKiAgIDE6IENfQVVUTwkgIGF1dG8gdmFyICovCi0gIHN0X0dsb2JhbCwJCQkvKiAgIDI6IENfRVhUCSAgZXh0ZXJuYWwgKi8KLSAgc3RfU3RhdGljLAkJCS8qICAgMzogQ19TVEFUCSAgc3RhdGljICovCi0gIHN0X0xvY2FsLAkJCS8qICAgNDogQ19SRUcJICByZWdpc3RlciAqLwotICBzdF9HbG9iYWwsCQkJLyogICA1OiBDX0VYVERFRiAgPz8/ICovCi0gIHN0X0xhYmVsLAkJCS8qICAgNjogQ19MQUJFTAkgIGxhYmVsICovCi0gIHN0X0xhYmVsLAkJCS8qICAgNzogQ19VTEFCRUwgIHVzZXIgbGFiZWwgKi8KLSAgc3RfTWVtYmVyLAkJCS8qICAgODogQ19NT1MJICBtZW1iZXIgb2Ygc3RydWN0ICovCi0gIHN0X1BhcmFtLAkJCS8qICAgOTogQ19BUkcJICBhcmd1bWVudCAqLwotICBzdF9CbG9jaywJCQkvKiAgMTA6IENfU1RSVEFHICBzdHJ1Y3QgdGFnICovCi0gIHN0X01lbWJlciwJCQkvKiAgMTE6IENfTU9VCSAgbWVtYmVyIG9mIHVuaW9uICovCi0gIHN0X0Jsb2NrLAkJCS8qICAxMjogQ19VTlRBRyAgIHVuaW9uIHRhZyAqLwotICBzdF9UeXBlZGVmLAkJCS8qICAxMzogQ19UUERFRgkgIHR5cGVkZWYgKi8KLSAgc3RfU3RhdGljLAkJCS8qICAxNDogQ19VU1RBVElDID8/PyAqLwotICBzdF9CbG9jaywJCQkvKiAgMTU6IENfRU5UQUcJICBlbnVtIHRhZyAqLwotICBzdF9NZW1iZXIsCQkJLyogIDE2OiBDX01PRQkgIG1lbWJlciBvZiBlbnVtICovCi0gIHN0X1BhcmFtLAkJCS8qICAxNzogQ19SRUdQQVJNIHJlZ2lzdGVyIHBhcmFtZXRlciAqLwotICBzdF9NZW1iZXIsCQkJLyogIDE4OyBDX0ZJRUxECSAgYml0ZmllbGQgKi8KLSAgc3RfTmlsLAkJCS8qICAxOSAqLwotICBzdF9OaWwsCQkJLyogIDIwICovCi0gIHN0X05pbCwJCQkvKiAgMjEgKi8KLSAgc3RfTmlsLAkJCS8qICAyMiAqLwotICBzdF9OaWwsCQkJLyogIDIzICovCi0gIHN0X05pbCwJCQkvKiAgMjQgKi8KLSAgc3RfTmlsLAkJCS8qICAyNSAqLwotICBzdF9OaWwsCQkJLyogIDI2ICovCi0gIHN0X05pbCwJCQkvKiAgMjcgKi8KLSAgc3RfTmlsLAkJCS8qICAyOCAqLwotICBzdF9OaWwsCQkJLyogIDI5ICovCi0gIHN0X05pbCwJCQkvKiAgMzAgKi8KLSAgc3RfTmlsLAkJCS8qICAzMSAqLwotICBzdF9OaWwsCQkJLyogIDMyICovCi0gIHN0X05pbCwJCQkvKiAgMzMgKi8KLSAgc3RfTmlsLAkJCS8qICAzNCAqLwotICBzdF9OaWwsCQkJLyogIDM1ICovCi0gIHN0X05pbCwJCQkvKiAgMzYgKi8KLSAgc3RfTmlsLAkJCS8qICAzNyAqLwotICBzdF9OaWwsCQkJLyogIDM4ICovCi0gIHN0X05pbCwJCQkvKiAgMzkgKi8KLSAgc3RfTmlsLAkJCS8qICA0MCAqLwotICBzdF9OaWwsCQkJLyogIDQxICovCi0gIHN0X05pbCwJCQkvKiAgNDIgKi8KLSAgc3RfTmlsLAkJCS8qICA0MyAqLwotICBzdF9OaWwsCQkJLyogIDQ0ICovCi0gIHN0X05pbCwJCQkvKiAgNDUgKi8KLSAgc3RfTmlsLAkJCS8qICA0NiAqLwotICBzdF9OaWwsCQkJLyogIDQ3ICovCi0gIHN0X05pbCwJCQkvKiAgNDggKi8KLSAgc3RfTmlsLAkJCS8qICA0OSAqLwotICBzdF9OaWwsCQkJLyogIDUwICovCi0gIHN0X05pbCwJCQkvKiAgNTEgKi8KLSAgc3RfTmlsLAkJCS8qICA1MiAqLwotICBzdF9OaWwsCQkJLyogIDUzICovCi0gIHN0X05pbCwJCQkvKiAgNTQgKi8KLSAgc3RfTmlsLAkJCS8qICA1NSAqLwotICBzdF9OaWwsCQkJLyogIDU2ICovCi0gIHN0X05pbCwJCQkvKiAgNTcgKi8KLSAgc3RfTmlsLAkJCS8qICA1OCAqLwotICBzdF9OaWwsCQkJLyogIDU5ICovCi0gIHN0X05pbCwJCQkvKiAgNjAgKi8KLSAgc3RfTmlsLAkJCS8qICA2MSAqLwotICBzdF9OaWwsCQkJLyogIDYyICovCi0gIHN0X05pbCwJCQkvKiAgNjMgKi8KLSAgc3RfTmlsLAkJCS8qICA2NCAqLwotICBzdF9OaWwsCQkJLyogIDY1ICovCi0gIHN0X05pbCwJCQkvKiAgNjYgKi8KLSAgc3RfTmlsLAkJCS8qICA2NyAqLwotICBzdF9OaWwsCQkJLyogIDY4ICovCi0gIHN0X05pbCwJCQkvKiAgNjkgKi8KLSAgc3RfTmlsLAkJCS8qICA3MCAqLwotICBzdF9OaWwsCQkJLyogIDcxICovCi0gIHN0X05pbCwJCQkvKiAgNzIgKi8KLSAgc3RfTmlsLAkJCS8qICA3MyAqLwotICBzdF9OaWwsCQkJLyogIDc0ICovCi0gIHN0X05pbCwJCQkvKiAgNzUgKi8KLSAgc3RfTmlsLAkJCS8qICA3NiAqLwotICBzdF9OaWwsCQkJLyogIDc3ICovCi0gIHN0X05pbCwJCQkvKiAgNzggKi8KLSAgc3RfTmlsLAkJCS8qICA3OSAqLwotICBzdF9OaWwsCQkJLyogIDgwICovCi0gIHN0X05pbCwJCQkvKiAgODEgKi8KLSAgc3RfTmlsLAkJCS8qICA4MiAqLwotICBzdF9OaWwsCQkJLyogIDgzICovCi0gIHN0X05pbCwJCQkvKiAgODQgKi8KLSAgc3RfTmlsLAkJCS8qICA4NSAqLwotICBzdF9OaWwsCQkJLyogIDg2ICovCi0gIHN0X05pbCwJCQkvKiAgODcgKi8KLSAgc3RfTmlsLAkJCS8qICA4OCAqLwotICBzdF9OaWwsCQkJLyogIDg5ICovCi0gIHN0X05pbCwJCQkvKiAgOTAgKi8KLSAgc3RfTmlsLAkJCS8qICA5MSAqLwotICBzdF9OaWwsCQkJLyogIDkyICovCi0gIHN0X05pbCwJCQkvKiAgOTMgKi8KLSAgc3RfTmlsLAkJCS8qICA5NCAqLwotICBzdF9OaWwsCQkJLyogIDk1ICovCi0gIHN0X05pbCwJCQkvKiAgOTYgKi8KLSAgc3RfTmlsLAkJCS8qICA5NyAqLwotICBzdF9OaWwsCQkJLyogIDk4ICovCi0gIHN0X05pbCwJCQkvKiAgOTkgKi8KLSAgc3RfQmxvY2ssCQkJLyogMTAwOiBDX0JMT0NLICBibG9jayBzdGFydC9lbmQgKi8KLSAgc3RfUHJvYywJCQkvKiAxMDE6IENfRkNOCSBmdW5jdGlvbiBzdGFydC9lbmQgKi8KLSAgc3RfRW5kLAkJCS8qIDEwMjogQ19FT1MJIGVuZCBvZiBzdHJ1Y3QvdW5pb24vZW51bSAqLwotICBzdF9GaWxlLAkJCS8qIDEwMzogQ19GSUxFCSBmaWxlIHN0YXJ0ICovCi0gIHN0X05pbCwJCQkvKiAxMDQ6IENfTElORQkgbGluZSBudW1iZXIgKi8KLSAgc3RfTmlsLAkJCS8qIDEwNTogQ19BTElBUwkgY29tYmluZWQgdHlwZSBpbmZvICovCi0gIHN0X05pbCwJCQkvKiAxMDY6IENfSElEREVOID8/PyAqLwotfTsKLQotCi0vKiBLZWVwIHRyYWNrIG9mIGRpZmZlcmVudCBzaXplZCBhbGxvY2F0aW9uIHJlcXVlc3RzLiAgKi8KLXN0YXRpYyBhbGxvY19pbmZvX3QgYWxsb2NfY291bnRzWyAoaW50KWFsbG9jX3R5cGVfbGFzdCBdOwotDAotLyogUmVjb3JkIHdoZXRoZXIgd2UgaGF2ZSBzZWVuIGFueSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICAqLwotaW50IGVjb2ZmX2RlYnVnZ2luZ19zZWVuID0gMDsKLQotLyogVmFyaW91cyBzdGF0aWNzLiAgKi8KLXN0YXRpYyBlZmRyX3QgICpjdXJfZmlsZV9wdHIJPSAoZWZkcl90ICopIDA7CS8qIGN1cnJlbnQgZmlsZSBkZXNjLiBoZWFkZXIgKi8KLXN0YXRpYyBwcm9jX3QgICpjdXJfcHJvY19wdHIJPSAocHJvY190ICopIDA7CS8qIGN1cnJlbnQgcHJvY2VkdXJlIGhlYWRlciAqLwotc3RhdGljIHByb2NfdCAgKmZpcnN0X3Byb2NfcHRyICA9IChwcm9jX3QgKikgMDsgLyogZmlyc3QgcHJvY2VkdXJlIGhlYWRlciAqLwotc3RhdGljIHRoZWFkX3QgKnRvcF90YWdfaGVhZAk9ICh0aGVhZF90ICopIDA7IC8qIHRvcCBsZXZlbCB0YWcgaGVhZCAqLwotc3RhdGljIHRoZWFkX3QgKmN1cl90YWdfaGVhZAk9ICh0aGVhZF90ICopIDA7IC8qIGN1cnJlbnQgdGFnIGhlYWQgKi8KLSNpZmRlZiBFQ09GRl9ERUJVRwotc3RhdGljIGludAlkZWJ1ZwkJPSAwOyAJCS8qIHRyYWNlIGZ1bmN0aW9ucyAqLwotI2VuZGlmCi1zdGF0aWMgaW50CXN0YWJzX3NlZW4JPSAwOwkJLyogIT0gMCBpZiBzdGFicyBoYXZlIGJlZW4gc2VlbiAqLwotCi1zdGF0aWMgaW50IGN1cnJlbnRfZmlsZV9pZHg7Ci1zdGF0aWMgY29uc3QgY2hhciAqY3VycmVudF9zdGFic19maWxlbmFtZTsKLQotLyogUHNldWRvIHN5bWJvbCB0byB1c2Ugd2hlbiBwdXR0aW5nIHN0YWJzIGludG8gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0jaWZuZGVmIFNUQUJTX1NZTUJPTAotI2RlZmluZSBTVEFCU19TWU1CT0wgIkBzdGFicyIKLSNlbmRpZgotCi1zdGF0aWMgY2hhciBzdGFic19zeW1ib2xbXSA9IFNUQUJTX1NZTUJPTDsKLQwKLS8qIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkIGFkZF92YXJyYXlfcGFnZSBQQVJBTVMgKCh2YXJyYXlfdCAqdnApKTsKLXN0YXRpYyBzeW1pbnRfdCBhZGRfc3RyaW5nIFBBUkFNUyAoKHZhcnJheV90ICp2cCwKLQkJCQkgICAgc3RydWN0IGhhc2hfY29udHJvbCAqaGFzaF90YmwsCi0JCQkJICAgIGNvbnN0IGNoYXIgKnN0ciwKLQkJCQkgICAgc2hhc2hfdCAqKnJldF9oYXNoKSk7Ci1zdGF0aWMgbG9jYWxzeW1fdCAqYWRkX2Vjb2ZmX3N5bWJvbCBQQVJBTVMgKChjb25zdCBjaGFyICpzdHIsIHN0X3QgdHlwZSwKLQkJCQkJICAgICBzY190IHN0b3JhZ2UsIHN5bWJvbFMgKnN5bSwKLQkJCQkJICAgICBiZmRfdm1hIGFkZGVuZCwgc3ltaW50X3QgdmFsdWUsCi0JCQkJCSAgICAgc3ltaW50X3QgaW5keCkpOwotc3RhdGljIHN5bWludF90IGFkZF9hdXhfc3ltX3N5bWludCBQQVJBTVMgKChzeW1pbnRfdCBhdXhfd29yZCkpOwotc3RhdGljIHN5bWludF90IGFkZF9hdXhfc3ltX3JuZHggUEFSQU1TICgoaW50IGZpbGVfaW5kZXgsCi0JCQkJCSAgc3ltaW50X3Qgc3ltX2luZGV4KSk7Ci1zdGF0aWMgc3ltaW50X3QgYWRkX2F1eF9zeW1fdGlyIFBBUkFNUyAoKHR5cGVfaW5mb190ICp0LAotCQkJCQkgaGFzaF9zdGF0ZV90IHN0YXRlLAotCQkJCQkgdGhhc2hfdCAqKmhhc2hfdGJsKSk7Ci1zdGF0aWMgdGFnX3QgKmdldF90YWcgUEFSQU1TICgoY29uc3QgY2hhciAqdGFnLCBsb2NhbHN5bV90ICpzeW0sCi0JCQkgICAgICAgYnRfdCBiYXNpY190eXBlKSk7Ci1zdGF0aWMgdm9pZCBhZGRfdW5rbm93bl90YWcgUEFSQU1TICgodGFnX3QgKnB0YWcpKTsKLXN0YXRpYyB2b2lkIGFkZF9wcm9jZWR1cmUgUEFSQU1TICgoY2hhciAqZnVuYykpOwotc3RhdGljIHZvaWQgYWRkX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZV9uYW1lLCBpbnQgaW5keCwgaW50IGZha2UpKTsKLSNpZmRlZiBFQ09GRl9ERUJVRwotc3RhdGljIGNoYXIgKnNjX3RvX3N0cmluZyBQQVJBTVMgKChzY190IHN0b3JhZ2VfY2xhc3MpKTsKLXN0YXRpYyBjaGFyICpzdF90b19zdHJpbmcgUEFSQU1TICgoc3RfdCBzeW1ib2xfdHlwZSkpOwotI2VuZGlmCi1zdGF0aWMgdm9pZCBtYXJrX3N0YWJzIFBBUkFNUyAoKGludCkpOwotc3RhdGljIGNoYXIgKmVjb2ZmX2FkZF9ieXRlcyBQQVJBTVMgKChjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCQkJCSAgICAgIGNoYXIgKmJ1ZnB0ciwgdW5zaWduZWQgbG9uZyBuZWVkKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9wYWRkaW5nX2FkanVzdAotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgY2hhciAqKmJ1ZnB0cnB0cikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfbGluZW5vCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsb25nICpsaW5lY250cHRyKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9zeW1ib2xzCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9wcm9jcwotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZCwgY2hhciAqKmJ1ZiwgY2hhciAqKmJ1ZmVuZCwKLQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZWNvZmZfYnVpbGRfYXV4Ci0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9zdHJpbmdzIFBBUkFNUyAoKGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JCQkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJCQkJICB2YXJyYXlfdCAqdnApKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX3NzCi0gIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kLCBjaGFyICoqYnVmLCBjaGFyICoqYnVmZW5kLAotCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlY29mZl9idWlsZF9mZHIKLSAgUEFSQU1TICgoY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQsIGNoYXIgKipidWYsIGNoYXIgKipidWZlbmQsCi0JICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKLXN0YXRpYyB2b2lkIGVjb2ZmX3NldHVwX2V4dCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgcGFnZV90eXBlICphbGxvY2F0ZV9jbHVzdGVyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgbnBhZ2VzKSk7Ci1zdGF0aWMgcGFnZV90eXBlICphbGxvY2F0ZV9wYWdlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBzY29wZV90ICphbGxvY2F0ZV9zY29wZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3Njb3BlIFBBUkFNUyAoKHNjb3BlX3QgKnB0cikpOwotc3RhdGljIHZsaW5rc190ICphbGxvY2F0ZV92bGlua3MgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHNoYXNoX3QgKmFsbG9jYXRlX3NoYXNoIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB0aGFzaF90ICphbGxvY2F0ZV90aGFzaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdGFnX3QgKmFsbG9jYXRlX3RhZyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3RhZyBQQVJBTVMgKCh0YWdfdCAqcHRyKSk7Ci1zdGF0aWMgZm9yd2FyZF90ICphbGxvY2F0ZV9mb3J3YXJkIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB0aGVhZF90ICphbGxvY2F0ZV90aGVhZCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBmcmVlX3RoZWFkIFBBUkFNUyAoKHRoZWFkX3QgKnB0cikpOwotc3RhdGljIGxpbmVub19saXN0X3QgKmFsbG9jYXRlX2xpbmVub19saXN0IFBBUkFNUyAoKHZvaWQpKTsKLQwKLS8qIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBhc3NlbWJsZXIgc3RhcnRzIHVwLiAgKi8KLQotdm9pZAotZWNvZmZfcmVhZF9iZWdpbl9ob29rICgpCi17Ci0gIHRhZ19oYXNoID0gaGFzaF9uZXcgKCk7Ci0gIHRvcF90YWdfaGVhZCA9IGFsbG9jYXRlX3RoZWFkICgpOwotICB0b3BfdGFnX2hlYWQtPmZpcnN0X3RhZyA9ICh0YWdfdCAqKSBOVUxMOwotICB0b3BfdGFnX2hlYWQtPmZyZWUgPSAodGhlYWRfdCAqKSBOVUxMOwotICB0b3BfdGFnX2hlYWQtPnByZXYgPSBjdXJfdGFnX2hlYWQ7Ci0gIGN1cl90YWdfaGVhZCA9IHRvcF90YWdfaGVhZDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBzeW1ib2wgaXMgY3JlYXRlZC4gICovCi0KLXZvaWQKLWVjb2ZmX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgT0JKX1NZTUZJRUxEX1RZUEUgKm9iajsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgZmlsZSBwb2ludGVyLCBidXQgb25seSBpZiB3ZSBoYXZlIHNlZW4gYQotICAgICBmaWxlLiAgSWYgd2UgaGF2ZW4ndCBzZWVuIGEgZmlsZSwgdGhlbiB0aGlzIGlzIGEgcHJvYmFibHkgc3BlY2lhbAotICAgICBzeW1ib2wgY3JlYXRlZCBieSBtZF9iZWdpbiB3aGljaCBtYXkgcmVxdWlyZWQgc3BlY2lhbCBoYW5kbGluZyBhdAotICAgICBzb21lIHBvaW50LiAgQ3JlYXRpbmcgYSBkdW1teSBmaWxlIHdpdGggYSBkdW1teSBuYW1lIGlzIGNlcnRhaW5seQotICAgICB3cm9uZy4gICovCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMCi0gICAgICAmJiBzZWVuX2F0X2xlYXN0XzFfZmlsZSAoKSkKLSAgICBhZGRfZmlsZSAoKGNvbnN0IGNoYXIgKikgTlVMTCwgMCwgMSk7Ci0gIG9iaiA9IHN5bWJvbF9nZXRfb2JqIChzeW1ib2xQKTsKLSAgb2JqLT5lY29mZl9maWxlID0gY3VyX2ZpbGVfcHRyOwotICBvYmotPmVjb2ZmX3N5bWJvbCA9IE5VTEw7Ci0gIG9iai0+ZWNvZmZfZXh0ZXJuX3NpemUgPSAwOwotfQotDAotLyogQWRkIGEgcGFnZSB0byBhIHZhcnJheSBvYmplY3QuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX3ZhcnJheV9wYWdlICh2cCkKLSAgICAgdmFycmF5X3QgKnZwOwkJCQkvKiB2YXJyYXkgdG8gYWRkIHBhZ2UgdG8gKi8KLXsKLSAgdmxpbmtzX3QgKm5ld19saW5rcyA9IGFsbG9jYXRlX3ZsaW5rcyAoKTsKLQotI2lmZGVmIE1BTExPQ19DSEVDSwotICBpZiAodnAtPm9iamVjdF9zaXplID4gMSkKLSAgICBuZXdfbGlua3MtPmRhdHVtID0gKHBhZ2VfdHlwZSAqKSB4Y2FsbG9jICgxLCB2cC0+b2JqZWN0X3NpemUpOwotICBlbHNlCi0jZW5kaWYKLSAgICBuZXdfbGlua3MtPmRhdHVtID0gYWxsb2NhdGVfcGFnZSAoKTsKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZhcnJheV0udG90YWxfYWxsb2MrKzsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92YXJyYXldLnRvdGFsX3BhZ2VzKys7Ci0KLSAgbmV3X2xpbmtzLT5zdGFydF9pbmRleCA9IHZwLT5udW1fYWxsb2NhdGVkOwotICB2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPSAwOwotCi0gIGlmICh2cC0+Zmlyc3QgPT0gKHZsaW5rc190ICopIE5VTEwpCQkvKiBmaXJzdCBhbGxvY2F0aW9uPyAqLwotICAgIHZwLT5maXJzdCA9IHZwLT5sYXN0ID0gbmV3X2xpbmtzOwotICBlbHNlCi0gICAgewkJCQkJCS8qIDJuZCBvciBncmVhdGVyIGFsbG9jYXRpb24gKi8KLSAgICAgIG5ld19saW5rcy0+cHJldiA9IHZwLT5sYXN0OwotICAgICAgdnAtPmxhc3QtPm5leHQgPSBuZXdfbGlua3M7Ci0gICAgICB2cC0+bGFzdCA9IG5ld19saW5rczsKLSAgICB9Ci19Ci0MCi0vKiBBZGQgYSBzdHJpbmcgKGFuZCBudWxsIHBhZCkgdG8gb25lIG9mIHRoZSBzdHJpbmcgdGFibGVzLiAgKi8KLQotc3RhdGljIHN5bWludF90Ci1hZGRfc3RyaW5nICh2cCwgaGFzaF90YmwsIHN0ciwgcmV0X2hhc2gpCi0gICAgIHZhcnJheV90ICp2cDsJCQkvKiBzdHJpbmcgb2JzdGFjayAqLwotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoYXNoX3RibDsJLyogcHRyIHRvIGhhc2ggdGFibGUgKi8KLSAgICAgY29uc3QgY2hhciAqc3RyOwkJCS8qIHN0cmluZyAqLwotICAgICBzaGFzaF90ICoqcmV0X2hhc2g7CQkvKiByZXR1cm4gaGFzaCBwb2ludGVyICovCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgbGVuID0gc3RybGVuIChzdHIpOwotICByZWdpc3RlciBzaGFzaF90ICpoYXNoX3B0cjsKLQotICBpZiAobGVuID49IFBBR0VfVVNJWkUpCi0gICAgYXNfZmF0YWwgKF8oIlN0cmluZyB0b28gYmlnICglbHUgYnl0ZXMpIiksIGxlbik7Ci0KLSAgaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBoYXNoX2ZpbmQgKGhhc2hfdGJsLCBzdHIpOwotICBpZiAoaGFzaF9wdHIgPT0gKHNoYXNoX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBjb25zdCBjaGFyICplcnI7Ci0KLSAgICAgIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgKyBsZW4gPj0gUEFHRV9VU0laRSkKLSAgICAgICAgewotICAgICAgICAgIHZwLT5udW1fYWxsb2NhdGVkID0KLSAgICAgICAgICAgICgodnAtPm51bV9hbGxvY2F0ZWQgKyBQQUdFX1VTSVpFIC0gMSkgLyBQQUdFX1VTSVpFKSAqIFBBR0VfVVNJWkU7Ci0gICAgICAgICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0gICAgICAgIH0KLQotICAgICAgaGFzaF9wdHIgPSBhbGxvY2F0ZV9zaGFzaCAoKTsKLSAgICAgIGhhc2hfcHRyLT5pbmR4ID0gdnAtPm51bV9hbGxvY2F0ZWQ7Ci0KLSAgICAgIGhhc2hfcHRyLT5zdHJpbmcgPSAmdnAtPmxhc3QtPmRhdHVtLT5ieXRlW3ZwLT5vYmplY3RzX2xhc3RfcGFnZV07Ci0KLSAgICAgIHZwLT5vYmplY3RzX2xhc3RfcGFnZSArPSBsZW4gKyAxOwotICAgICAgdnAtPm51bV9hbGxvY2F0ZWQgKz0gbGVuICsgMTsKLQotICAgICAgc3RyY3B5IChoYXNoX3B0ci0+c3RyaW5nLCBzdHIpOwotCi0gICAgICBlcnIgPSBoYXNoX2luc2VydCAoaGFzaF90YmwsIHN0ciwgKGNoYXIgKikgaGFzaF9wdHIpOwotICAgICAgaWYgKGVycikKLQlhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN0cmluZyBoYXNoIHRhYmxlOiAlcyIpLAotCQkgIHN0ciwgZXJyKTsKLSAgICB9Ci0KLSAgaWYgKHJldF9oYXNoICE9IChzaGFzaF90ICoqKSBOVUxMKQotICAgICpyZXRfaGFzaCA9IGhhc2hfcHRyOwotCi0gIHJldHVybiBoYXNoX3B0ci0+aW5keDsKLX0KLQwKLS8qIEFkZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotc3RhdGljIGxvY2Fsc3ltX3QgKgotYWRkX2Vjb2ZmX3N5bWJvbCAoc3RyLCB0eXBlLCBzdG9yYWdlLCBzeW1fdmFsdWUsIGFkZGVuZCwgdmFsdWUsIGluZHgpCi0gICAgIGNvbnN0IGNoYXIgKnN0cjsJCQkvKiBzeW1ib2wgbmFtZSAqLwotICAgICBzdF90IHR5cGU7CQkJCS8qIHN5bWJvbCB0eXBlICovCi0gICAgIHNjX3Qgc3RvcmFnZTsJCQkvKiBzdG9yYWdlIGNsYXNzICovCi0gICAgIHN5bWJvbFMgKnN5bV92YWx1ZTsJCS8qIGFzc29jaWF0ZWQgc3ltYm9sLiAgKi8KLSAgICAgYmZkX3ZtYSBhZGRlbmQ7CQkJLyogYWRkZW5kIHRvIHN5bV92YWx1ZS4gICovCi0gICAgIHN5bWludF90IHZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotICAgICBzeW1pbnRfdCBpbmR4OwkJCS8qIGluZGV4IHRvIGxvY2FsL2F1eC4gc3ltcyAqLwotewotICBsb2NhbHN5bV90ICpwc3ltOwotICByZWdpc3RlciBzY29wZV90ICpwc2NvcGU7Ci0gIHJlZ2lzdGVyIHRoZWFkX3QgKnB0YWdfaGVhZDsKLSAgcmVnaXN0ZXIgdGFnX3QgKnB0YWc7Ci0gIHJlZ2lzdGVyIHRhZ190ICpwdGFnX25leHQ7Ci0gIHJlZ2lzdGVyIHZhcnJheV90ICp2cDsKLSAgcmVnaXN0ZXIgaW50IHNjb3BlX2RlbHRhID0gMDsKLSAgc2hhc2hfdCAqaGFzaF9wdHIgPSAoc2hhc2hfdCAqKSBOVUxMOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPnN5bWJvbHM7Ci0KLSBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIHBzeW0gPSAmdnAtPmxhc3QtPmRhdHVtLT5zeW1bIHZwLT5vYmplY3RzX2xhc3RfcGFnZSsrIF07Ci0KLSAgaWYgKHN0ciA9PSAoY29uc3QgY2hhciAqKSBOVUxMICYmIHN5bV92YWx1ZSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHBzeW0tPm5hbWUgPSBTX0dFVF9OQU1FIChzeW1fdmFsdWUpOwotICBlbHNlCi0gICAgcHN5bS0+bmFtZSA9IHN0cjsKLSAgcHN5bS0+YXNfc3ltID0gc3ltX3ZhbHVlOwotICBpZiAoc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgc3ltYm9sX2dldF9vYmogKHN5bV92YWx1ZSktPmVjb2ZmX3N5bWJvbCA9IHBzeW07Ci0gIHBzeW0tPmFkZGVuZCA9IGFkZGVuZDsKLSAgcHN5bS0+ZmlsZV9wdHIgPSBjdXJfZmlsZV9wdHI7Ci0gIHBzeW0tPnByb2NfcHRyID0gY3VyX3Byb2NfcHRyOwotICBwc3ltLT5iZWdpbl9wdHIgPSAobG9jYWxzeW1fdCAqKSBOVUxMOwotICBwc3ltLT5pbmRleF9wdHIgPSAoYXV4X3QgKikgTlVMTDsKLSAgcHN5bS0+Zm9yd2FyZF9yZWYgPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0gIHBzeW0tPnN5bV9pbmRleCA9IC0xOwotICBtZW1zZXQgKCZwc3ltLT5lY29mZl9zeW0sIDAsIHNpemVvZiAoRVhUUikpOwotICBwc3ltLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9IHZhbHVlOwotICBwc3ltLT5lY29mZl9zeW0uYXN5bS5zdCA9ICh1bnNpZ25lZCkgdHlwZTsKLSAgcHN5bS0+ZWNvZmZfc3ltLmFzeW0uc2MgPSAodW5zaWduZWQpIHN0b3JhZ2U7Ci0gIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0gaW5keDsKLQotICAvKiBJZiB0aGVyZSBpcyBhbiBhc3NvY2lhdGVkIHN5bWJvbCwgd2Ugd2FpdCB1bnRpbCB0aGUgZW5kIG9mIHRoZQotICAgICBhc3NlbWJseSBiZWZvcmUgZGVjaWRpbmcgd2hlcmUgdG8gcHV0IHRoZSBuYW1lIChpdCBtYXkgYmUganVzdCBhbgotICAgICBleHRlcm5hbCBzeW1ib2wpLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIGp1c3QgYSBkZWJ1Z2dpbmcgc3ltYm9sIGFuZAotICAgICB0aGUgbmFtZSBzaG91bGQgZ28gd2l0aCB0aGUgY3VycmVudCBmaWxlLiAgKi8KLSAgaWYgKHN5bV92YWx1ZSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIHBzeW0tPmVjb2ZmX3N5bS5hc3ltLmlzcyA9ICgoc3RyID09IChjb25zdCBjaGFyICopIE5VTEwpCi0JCQkJPyAwCi0JCQkJOiBhZGRfc3RyaW5nICgmY3VyX2ZpbGVfcHRyLT5zdHJpbmdzLAotCQkJCQkgICAgICBjdXJfZmlsZV9wdHItPnN0cl9oYXNoLAotCQkJCQkgICAgICBzdHIsCi0JCQkJCSAgICAgICZoYXNoX3B0cikpOwotCi0gICsrdnAtPm51bV9hbGxvY2F0ZWQ7Ci0KLSAgaWYgKEVDT0ZGX0lTX1NUQUIgKCZwc3ltLT5lY29mZl9zeW0uYXN5bSkpCi0gICAgcmV0dXJuIHBzeW07Ci0KLSAgLyogU2F2ZSB0aGUgc3ltYm9sIHdpdGhpbiB0aGUgaGFzaCB0YWJsZSBpZiB0aGlzIGlzIGEgc3RhdGljCi0gICAgIGl0ZW0sIGFuZCBpdCBoYXMgYSBuYW1lLiAgKi8KLSAgaWYgKGhhc2hfcHRyICE9IChzaGFzaF90ICopIE5VTEwKLSAgICAgICYmICh0eXBlID09IHN0X0dsb2JhbCB8fCB0eXBlID09IHN0X1N0YXRpYyB8fCB0eXBlID09IHN0X0xhYmVsCi0JICB8fCB0eXBlID09IHN0X1Byb2MgfHwgdHlwZSA9PSBzdF9TdGF0aWNQcm9jKSkKLSAgICBoYXNoX3B0ci0+c3ltX3B0ciA9IHBzeW07Ci0KLSAgLyogcHVzaCBvciBwb3AgYSBzY29wZSBpZiBhcHByb3ByaWF0ZS4gICovCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBzdF9GaWxlOgkJCS8qIGJlZ2lubmluZyBvZiBmaWxlICovCi0gICAgY2FzZSBzdF9Qcm9jOgkJCS8qIHByb2NlZHVyZSAqLwotICAgIGNhc2Ugc3RfU3RhdGljUHJvYzoJCQkvKiBzdGF0aWMgcHJvY2VkdXJlICovCi0gICAgY2FzZSBzdF9CbG9jazoJCQkvKiBiZWdpbiBzY29wZSAqLwotICAgICAgcHNjb3BlID0gYWxsb2NhdGVfc2NvcGUgKCk7Ci0gICAgICBwc2NvcGUtPnByZXYgPSBjdXJfZmlsZV9wdHItPmN1cl9zY29wZTsKLSAgICAgIHBzY29wZS0+bHN5bSA9IHBzeW07Ci0gICAgICBwc2NvcGUtPnR5cGUgPSB0eXBlOwotICAgICAgY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgPSBwc2NvcGU7Ci0KLSAgICAgIGlmICh0eXBlICE9IHN0X0ZpbGUpCi0Jc2NvcGVfZGVsdGEgPSAxOwotCi0gICAgICAvKiBGb3IgZXZlcnkgYmxvY2sgdHlwZSBleGNlcHQgZmlsZSwgc3RydWN0LCB1bmlvbiwgb3IKLQkgZW51bWVyYXRpb24gYmxvY2tzLCBwdXNoIGEgbGV2ZWwgb24gdGhlIHRhZyBzdGFjay4gIFdlIG9taXQKLQkgZmlsZSB0eXBlcywgc28gdGhhdCB0YWdzIGNhbiBzcGFuIGZpbGUgYm91bmRhcmllcy4gICovCi0gICAgICBpZiAodHlwZSAhPSBzdF9GaWxlICYmIHN0b3JhZ2UgIT0gc2NfSW5mbykKLQl7Ci0JICBwdGFnX2hlYWQgPSBhbGxvY2F0ZV90aGVhZCAoKTsKLQkgIHB0YWdfaGVhZC0+Zmlyc3RfdGFnID0gMDsKLQkgIHB0YWdfaGVhZC0+cHJldiA9IGN1cl90YWdfaGVhZDsKLQkgIGN1cl90YWdfaGVhZCA9IHB0YWdfaGVhZDsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2Ugc3RfRW5kOgotICAgICAgcHNjb3BlID0gY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGU7Ci0gICAgICBpZiAocHNjb3BlID09IChzY29wZV90ICopIE5VTEwpCi0JYXNfZmF0YWwgKF8oInRvbyBtYW55IHN0X0VuZCdzIikpOwotICAgICAgZWxzZQotCXsKLQkgIHN0X3QgYmVnaW5fdHlwZSA9IChzdF90KSBwc2NvcGUtPmxzeW0tPmVjb2ZmX3N5bS5hc3ltLnN0OwotCi0JICBwc3ltLT5iZWdpbl9wdHIgPSBwc2NvcGUtPmxzeW07Ci0KLQkgIGlmIChiZWdpbl90eXBlICE9IHN0X0ZpbGUpCi0JICAgIHNjb3BlX2RlbHRhID0gLTE7Ci0KLQkgIC8qIEV4Y2VwdCBmb3IgZmlsZSwgc3RydWN0dXJlLCB1bmlvbiwgb3IgZW51bWVyYXRpb24gZW5kCi0JICAgICBibG9ja3MgcmVtb3ZlIGFsbCB0YWdzIGNyZWF0ZWQgd2l0aGluIHRoaXMgc2NvcGUuICAqLwotCSAgaWYgKGJlZ2luX3R5cGUgIT0gc3RfRmlsZSAmJiBzdG9yYWdlICE9IHNjX0luZm8pCi0JICAgIHsKLQkgICAgICBwdGFnX2hlYWQgPSBjdXJfdGFnX2hlYWQ7Ci0JICAgICAgY3VyX3RhZ19oZWFkID0gcHRhZ19oZWFkLT5wcmV2OwotCi0JICAgICAgZm9yIChwdGFnID0gcHRhZ19oZWFkLT5maXJzdF90YWc7Ci0JCSAgIHB0YWcgIT0gKHRhZ190ICopIE5VTEw7Ci0JCSAgIHB0YWcgPSBwdGFnX25leHQpCi0JCXsKLQkJICBpZiAocHRhZy0+Zm9yd2FyZF9yZWYgIT0gKGZvcndhcmRfdCAqKSBOVUxMKQotCQkgICAgYWRkX3Vua25vd25fdGFnIChwdGFnKTsKLQotCQkgIHB0YWdfbmV4dCA9IHB0YWctPnNhbWVfYmxvY2s7Ci0JCSAgcHRhZy0+aGFzaF9wdHItPnRhZ19wdHIgPSBwdGFnLT5zYW1lX25hbWU7Ci0JCSAgZnJlZV90YWcgKHB0YWcpOwotCQl9Ci0KLQkgICAgICBmcmVlX3RoZWFkIChwdGFnX2hlYWQpOwotCSAgICB9Ci0KLQkgIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlID0gcHNjb3BlLT5wcmV2OwotCi0JICAvKiBibG9jayBiZWdpbiBnZXRzIG5leHQgc3ltICMuICBUaGlzIGlzIHNldCB3aGVuIHdlIGtub3cKLQkgICAgIHRoZSBzeW1ib2wgaW5kZXggdmFsdWUuICAqLwotCi0JICAvKiBGdW5jdGlvbnMgcHVzaCB0d28gb3IgbW9yZSBhdXggd29yZHMgYXMgZm9sbG93czoKLQkgICAgIDFzdCB3b3JkOiBpbmRleCsxIG9mIHRoZSBlbmQgc3ltYm9sIChmaWxsZWQgaW4gbGF0ZXIpLgotCSAgICAgMm5kIHdvcmQ6IHR5cGUgb2YgdGhlIGZ1bmN0aW9uIChwbHVzIGFueSBhdXggd29yZHMgbmVlZGVkKS4KLQkgICAgIEFsc28sIHRpZSB0aGUgZXh0ZXJuYWwgcG9pbnRlciBiYWNrIHRvIHRoZSBmdW5jdGlvbiBiZWdpbiBzeW1ib2wuICAqLwotCSAgaWYgKGJlZ2luX3R5cGUgIT0gc3RfRmlsZSAmJiBiZWdpbl90eXBlICE9IHN0X0Jsb2NrKQotCSAgICB7Ci0JICAgICAgc3ltaW50X3QgdHk7Ci0JICAgICAgdmFycmF5X3QgKnN2cCA9ICZjdXJfZmlsZV9wdHItPmF1eF9zeW1zOwotCi0JICAgICAgcHNjb3BlLT5sc3ltLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGFkZF9hdXhfc3ltX3N5bWludCAoMCk7Ci0JICAgICAgcHNjb3BlLT5sc3ltLT5pbmRleF9wdHIgPQotCQkmc3ZwLT5sYXN0LT5kYXR1bS0+YXV4W3N2cC0+b2JqZWN0c19sYXN0X3BhZ2UgLSAxXTsKLQkgICAgICB0eSA9IGFkZF9hdXhfc3ltX3RpciAoJmxhc3RfZnVuY190eXBlX2luZm8sCi0JCQkJICAgIGhhc2hfbm8sCi0JCQkJICAgICZjdXJfZmlsZV9wdHItPnRoYXNoX2hlYWRbMF0pOwotCi0vKiBUaGlzIHNlZW1zIHRvIGJlIHVubmVjZXNzYXJ5LiAgSSdtIG5vdCBldmVuIHN1cmUgd2hhdCBpdCBpcwotICogaW50ZW5kZWQgdG8gZG8uICBJdCdzIGZyb20gbWlwcy10ZmlsZS4KLSAqCSAgICAgIGlmIChsYXN0X2Z1bmNfc3ltX3ZhbHVlICE9IChzeW1ib2xTICopIE5VTEwpCi0gKgkJewotICoJCSAgbGFzdF9mdW5jX3N5bV92YWx1ZS0+aWZkID0gY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4OwotICoJCSAgbGFzdF9mdW5jX3N5bV92YWx1ZS0+aW5kZXggPSB0eTsKLSAqCQl9Ci0gKi8KLQkgICAgfQotCi0JICBmcmVlX3Njb3BlIChwc2NvcGUpOwotCX0KLSAgICB9Ci0KLSAgY3VyX2ZpbGVfcHRyLT5uZXN0ZWRfc2NvcGVzICs9IHNjb3BlX2RlbHRhOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnICYmIHR5cGUgIT0gc3RfRmlsZQotICAgICAgJiYgKGRlYnVnID4gMiB8fCB0eXBlID09IHN0X0Jsb2NrIHx8IHR5cGUgPT0gc3RfRW5kCi0JICB8fCB0eXBlID09IHN0X1Byb2MgfHwgdHlwZSA9PSBzdF9TdGF0aWNQcm9jKSkKLSAgICB7Ci0gICAgICBjaGFyICpzY19zdHIgPSBzY190b19zdHJpbmcgKHN0b3JhZ2UpOwotICAgICAgY2hhciAqc3Rfc3RyID0gc3RfdG9fc3RyaW5nICh0eXBlKTsKLSAgICAgIGludCBkZXB0aCA9IGN1cl9maWxlX3B0ci0+bmVzdGVkX3Njb3BlcyArIChzY29wZV9kZWx0YSA8IDApOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcdGxzeW1cdHY9ICUxMGxkLCBkZXB0aD0gJTJkLCBzYz0gJS0xMnMiLAotCSAgICAgICB2YWx1ZSwgZGVwdGgsIHNjX3N0cik7Ci0KLSAgICAgIGlmIChzdHJfc3RhcnQgJiYgc3RyX2VuZF9wMSAtIHN0cl9zdGFydCA+IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIHN0PSAlLTExcyBuYW1lPSAlLipzXG4iLCBzdF9zdHIsIHN0cl9lbmRfcDEgLSBzdHJfc3RhcnQsIHN0cl9zdGFydCk7Ci0gICAgICBlbHNlCi0JewotCSAgdW5zaWduZWQgbG9uZyBsZW4gPSBzdHJsZW4gKHN0X3N0cik7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIgc3Q9ICUuKnNcbiIsIGxlbi0xLCBzdF9zdHIpOwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICByZXR1cm4gcHN5bTsKLX0KLQwKLS8qIEFkZCBhbiBhdXhpbGlhcnkgc3ltYm9sIChwYXNzaW5nIGEgc3ltaW50KS4gIFRoaXMgaXMgYWN0dWFsbHkgdXNlZAotICAgZm9yIGludGVncmFsIGF1eCB0eXBlcywgbm90IGp1c3Qgc3ltaW50cy4gICovCi0KLXN0YXRpYyBzeW1pbnRfdAotYWRkX2F1eF9zeW1fc3ltaW50IChhdXhfd29yZCkKLSAgICAgc3ltaW50X3QgYXV4X3dvcmQ7CQkvKiBhdXhpbGlhcnkgaW5mb3JtYXRpb24gd29yZCAqLwotewotICByZWdpc3RlciB2YXJyYXlfdCAqdnA7Ci0gIHJlZ2lzdGVyIGF1eF90ICphdXhfcHRyOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFzX2ZhdGFsIChfKCJubyBjdXJyZW50IGZpbGUgcG9pbnRlciIpKTsKLQotICB2cCA9ICZjdXJfZmlsZV9wdHItPmF1eF9zeW1zOwotCi0gIGlmICh2cC0+b2JqZWN0c19sYXN0X3BhZ2UgPT0gdnAtPm9iamVjdHNfcGVyX3BhZ2UpCi0gICAgYWRkX3ZhcnJheV9wYWdlICh2cCk7Ci0KLSAgYXV4X3B0ciA9ICZ2cC0+bGFzdC0+ZGF0dW0tPmF1eFt2cC0+b2JqZWN0c19sYXN0X3BhZ2UrK107Ci0gIGF1eF9wdHItPnR5cGUgPSBhdXhfaXN5bTsKLSAgYXV4X3B0ci0+ZGF0YS5pc3ltID0gYXV4X3dvcmQ7Ci0KLSAgcmV0dXJuIHZwLT5udW1fYWxsb2NhdGVkKys7Ci19Ci0KLQotLyogQWRkIGFuIGF1eGlsaWFyeSBzeW1ib2wgKHBhc3NpbmcgYSBmaWxlL3N5bWJvbCBpbmRleCBjb21ibykuICAqLwotCi1zdGF0aWMgc3ltaW50X3QKLWFkZF9hdXhfc3ltX3JuZHggKGZpbGVfaW5kZXgsIHN5bV9pbmRleCkKLSAgICAgaW50IGZpbGVfaW5kZXg7Ci0gICAgIHN5bWludF90IHN5bV9pbmRleDsKLXsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBhdXhfdCAqYXV4X3B0cjsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICBhc19mYXRhbCAoXygibm8gY3VycmVudCBmaWxlIHBvaW50ZXIiKSk7Ci0KLSAgdnAgPSAmY3VyX2ZpbGVfcHRyLT5hdXhfc3ltczsKLQotICBpZiAodnAtPm9iamVjdHNfbGFzdF9wYWdlID09IHZwLT5vYmplY3RzX3Blcl9wYWdlKQotICAgIGFkZF92YXJyYXlfcGFnZSAodnApOwotCi0gIGF1eF9wdHIgPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbdnAtPm9iamVjdHNfbGFzdF9wYWdlKytdOwotICBhdXhfcHRyLT50eXBlID0gYXV4X3JuZHg7Ci0gIGF1eF9wdHItPmRhdGEucm5keC5yZmQgICA9IGZpbGVfaW5kZXg7Ci0gIGF1eF9wdHItPmRhdGEucm5keC5pbmRleCA9IHN5bV9pbmRleDsKLQotICByZXR1cm4gdnAtPm51bV9hbGxvY2F0ZWQrKzsKLX0KLQwKLS8qIEFkZCBhbiBhdXhpbGlhcnkgc3ltYm9sIChwYXNzaW5nIHRoZSBiYXNpYyB0eXBlIGFuZCBwb3NzaWJseQotICAgdHlwZSBxdWFsaWZpZXJzKS4gICovCi0KLXN0YXRpYyBzeW1pbnRfdAotYWRkX2F1eF9zeW1fdGlyICh0LCBzdGF0ZSwgaGFzaF90YmwpCi0gICAgIHR5cGVfaW5mb190ICp0OwkJLyogY3VycmVudCB0eXBlIGluZm9ybWF0aW9uICovCi0gICAgIGhhc2hfc3RhdGVfdCBzdGF0ZTsJLyogd2hldGhlciB0byBoYXNoIHR5cGUgb3Igbm90ICovCi0gICAgIHRoYXNoX3QgKipoYXNoX3RibDsJLyogcG9pbnRlciB0byBoYXNoIHRhYmxlIHRvIHVzZSAqLwotewotICByZWdpc3RlciB2YXJyYXlfdCAqdnA7Ci0gIHJlZ2lzdGVyIGF1eF90ICphdXhfcHRyOwotICBzdGF0aWMgQVVYVSBpbml0X2F1eDsKLSAgc3ltaW50X3QgcmV0OwotICBpbnQgaTsKLSAgQVVYVSBhdXg7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIHZwID0gJmN1cl9maWxlX3B0ci0+YXV4X3N5bXM7Ci0KLSAgYXV4ID0gaW5pdF9hdXg7Ci0gIGF1eC50aS5idCA9IChpbnQpIHQtPmJhc2ljX3R5cGU7Ci0gIGF1eC50aS5jb250aW51ZWQgPSAwOwotICBhdXgudGkuZkJpdGZpZWxkID0gdC0+Yml0ZmllbGQ7Ci0KLSAgYXV4LnRpLnRxMCA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1swXTsKLSAgYXV4LnRpLnRxMSA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1sxXTsKLSAgYXV4LnRpLnRxMiA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1syXTsKLSAgYXV4LnRpLnRxMyA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1szXTsKLSAgYXV4LnRpLnRxNCA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1s0XTsKLSAgYXV4LnRpLnRxNSA9IChpbnQpIHQtPnR5cGVfcXVhbGlmaWVyc1s1XTsKLQotCi0gIC8qIEZvciBhbnl0aGluZyB0aGF0IGFkZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgd2UgbXVzdCBub3QgaGFzaCwKLSAgICAgc28gY2hlY2sgaGVyZSwgYW5kIHJlc2V0IG91ciBzdGF0ZS4gKi8KLQotICBpZiAoc3RhdGUgIT0gaGFzaF9ubwotICAgICAgJiYgKHQtPnR5cGVfcXVhbGlmaWVyc1swXSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzFdID09IHRxX0FycmF5Ci0JICB8fCB0LT50eXBlX3F1YWxpZmllcnNbMl0gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPnR5cGVfcXVhbGlmaWVyc1szXSA9PSB0cV9BcnJheQotCSAgfHwgdC0+dHlwZV9xdWFsaWZpZXJzWzRdID09IHRxX0FycmF5Ci0JICB8fCB0LT50eXBlX3F1YWxpZmllcnNbNV0gPT0gdHFfQXJyYXkKLQkgIHx8IHQtPmJhc2ljX3R5cGUgPT0gYnRfU3RydWN0Ci0JICB8fCB0LT5iYXNpY190eXBlID09IGJ0X1VuaW9uCi0JICB8fCB0LT5iYXNpY190eXBlID09IGJ0X0VudW0KLQkgIHx8IHQtPmJpdGZpZWxkCi0JICB8fCB0LT5udW1fZGltcyA+IDApKQotICAgIHN0YXRlID0gaGFzaF9ubzsKLQotICAvKiBTZWUgaWYgd2UgY2FuIGhhc2ggdGhpcyB0eXBlLCBhbmQgc2F2ZSBzb21lIHNwYWNlLCBidXQgc29tZSB0eXBlcwotICAgICBjYW4ndCBiZSBoYXNoZWQgKGJlY2F1c2UgdGhleSBjb250YWluIGFycmF5cyBvciBjb250aW51YXRpb25zKSwKLSAgICAgYW5kIG90aGVycyBjYW4gYmUgcHV0IGludG8gdGhlIGhhc2ggbGlzdCwgYnV0IGNhbm5vdCB1c2UgZXhpc3RpbmcKLSAgICAgdHlwZXMgYmVjYXVzZSBvdGhlciBhdXggZW50cmllcyBwcmVjZWRlIHRoaXMgb25lLiAgKi8KLQotICBpZiAoc3RhdGUgIT0gaGFzaF9ubykKLSAgICB7Ci0gICAgICByZWdpc3RlciB0aGFzaF90ICpoYXNoX3B0cjsKLSAgICAgIHJlZ2lzdGVyIHN5bWludF90IGhpOwotCi0gICAgICBoaSA9IGF1eC5pc3ltICYgKCgxIDw8IEhBU0hCSVRTKSAtIDEpOwotICAgICAgaGkgJT0gVEhBU0hfU0laRTsKLQotICAgICAgZm9yIChoYXNoX3B0ciA9IGhhc2hfdGJsW2hpXTsKLQkgICBoYXNoX3B0ciAhPSAodGhhc2hfdCAqKTA7Ci0JICAgaGFzaF9wdHIgPSBoYXNoX3B0ci0+bmV4dCkKLQl7Ci0JICBpZiAoYXV4LmlzeW0gPT0gaGFzaF9wdHItPnR5cGUuaXN5bSkKLQkgICAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoaGFzaF9wdHIgIT0gKHRoYXNoX3QgKikgTlVMTCAmJiBzdGF0ZSA9PSBoYXNoX3llcykKLQlyZXR1cm4gaGFzaF9wdHItPmluZHg7Ci0KLSAgICAgIGlmIChoYXNoX3B0ciA9PSAodGhhc2hfdCAqKSBOVUxMKQotCXsKLQkgIGhhc2hfcHRyID0gYWxsb2NhdGVfdGhhc2ggKCk7Ci0JICBoYXNoX3B0ci0+bmV4dCA9IGhhc2hfdGJsW2hpXTsKLQkgIGhhc2hfcHRyLT50eXBlID0gYXV4OwotCSAgaGFzaF9wdHItPmluZHggPSB2cC0+bnVtX2FsbG9jYXRlZDsKLQkgIGhhc2hfdGJsW2hpXSA9IGhhc2hfcHRyOwotCX0KLSAgICB9Ci0KLSAgLyogRXZlcnl0aGluZyBpcyBzZXQgdXAsIGFkZCB0aGUgYXV4IHN5bWJvbC4gKi8KLSAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBhdXhfcHRyID0gJnZwLT5sYXN0LT5kYXR1bS0+YXV4WyB2cC0+b2JqZWN0c19sYXN0X3BhZ2UrKyBdOwotICBhdXhfcHRyLT50eXBlID0gYXV4X3RpcjsKLSAgYXV4X3B0ci0+ZGF0YSA9IGF1eDsKLQotICByZXQgPSB2cC0+bnVtX2FsbG9jYXRlZCsrOwotCi0gIC8qIEFkZCBiaXRmaWVsZCBsZW5ndGggaWYgaXQgZXhpc3RzLgotCi0gICAgIE5PVEU6ICBNaXBzIGRvY3VtZW50YXRpb24gY2xhaW1zIGJpdGZpZWxkIGdvZXMgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgQVVYIHJlY29yZCwgYnV0IHRoZSBERUNzdGF0aW9uIGNvbXBpbGVyIGVtaXRzIGl0IGhlcmUuCi0gICAgIChUaGlzIHdvdWxkIG9ubHkgbWFrZSBhIGRpZmZlcmVuY2UgZm9yIGVudW0gYml0ZmllbGRzLikKLQotICAgICBBbHNvIG5vdGU6ICBXZSB1c2UgdGhlIGxhc3Qgc2l6ZSBnaXZlbiBzaW5jZSBnY2MgbWF5IGVtaXQgMgotICAgICBmb3IgYW4gZW51bSBiaXRmaWVsZC4gICovCi0KLSAgaWYgKHQtPmJpdGZpZWxkKQotICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKChzeW1pbnRfdCl0LT5zaXplc1t0LT5udW1fc2l6ZXMtMV0pOwotCi0KLSAgLyogQWRkIHRhZyBpbmZvcm1hdGlvbiBpZiBuZWVkZWQuICBTdHJ1Y3R1cmUsIHVuaW9uLCBhbmQgZW51bQotICAgICByZWZlcmVuY2VzIGFkZCAyIGF1eCBzeW1ib2xzOiBhIFtmaWxlIGluZGV4LCBzeW1ib2wgaW5kZXhdCi0gICAgIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB0eXBlLCBhbmQgdGhlIGN1cnJlbnQgZmlsZSBpbmRleC4gICovCi0KLSAgaWYgKHQtPmJhc2ljX3R5cGUgPT0gYnRfU3RydWN0Ci0gICAgICB8fCB0LT5iYXNpY190eXBlID09IGJ0X1VuaW9uCi0gICAgICB8fCB0LT5iYXNpY190eXBlID09IGJ0X0VudW0pCi0gICAgewotICAgICAgcmVnaXN0ZXIgc3ltaW50X3QgZmlsZV9pbmRleCA9IHQtPnRhZ19wdHItPmlmZDsKLSAgICAgIHJlZ2lzdGVyIGxvY2Fsc3ltX3QgKnN5bSAgPSB0LT50YWdfcHRyLT5zeW07Ci0gICAgICByZWdpc3RlciBmb3J3YXJkX3QgKmZvcndhcmRfcmVmID0gYWxsb2NhdGVfZm9yd2FyZCAoKTsKLQotICAgICAgaWYgKHN5bSAhPSAobG9jYWxzeW1fdCAqKSBOVUxMKQotCXsKLQkgIGZvcndhcmRfcmVmLT5uZXh0ID0gc3ltLT5mb3J3YXJkX3JlZjsKLQkgIHN5bS0+Zm9yd2FyZF9yZWYgPSBmb3J3YXJkX3JlZjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yd2FyZF9yZWYtPm5leHQgPSB0LT50YWdfcHRyLT5mb3J3YXJkX3JlZjsKLQkgIHQtPnRhZ19wdHItPmZvcndhcmRfcmVmID0gZm9yd2FyZF9yZWY7Ci0JfQotCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fcm5keCAoU1RfUkZERVNDQVBFLCBpbmRleE5pbCk7Ci0gICAgICBmb3J3YXJkX3JlZi0+aW5kZXhfcHRyCi0JPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbIHZwLT5vYmplY3RzX2xhc3RfcGFnZSAtIDFdOwotCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50IChmaWxlX2luZGV4KTsKLSAgICAgIGZvcndhcmRfcmVmLT5pZmRfcHRyCi0JPSAmdnAtPmxhc3QtPmRhdHVtLT5hdXhbIHZwLT5vYmplY3RzX2xhc3RfcGFnZSAtIDFdOwotICAgIH0KLQotICAvKiBBZGQgaW5mb3JtYXRpb24gYWJvdXQgYXJyYXkgYm91bmRzIGlmIHRoZXkgZXhpc3QuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgdC0+bnVtX2RpbXM7IGkrKykKLSAgICB7Ci0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fcm5keCAoU1RfUkZERVNDQVBFLAotCQkJICAgICAgIGN1cl9maWxlX3B0ci0+aW50X3R5cGUpOwotCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50IChjdXJfZmlsZV9wdHItPmZpbGVfaW5kZXgpOwkvKiBmaWxlIGluZGV4Ki8KLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKChzeW1pbnRfdCkgMCk7CQkJLyogbG93IGJvdW5kICovCi0gICAgICAodm9pZCkgYWRkX2F1eF9zeW1fc3ltaW50ICh0LT5kaW1lbnNpb25zW2ldIC0gMSk7CQkvKiBoaWdoIGJvdW5kKi8KLSAgICAgICh2b2lkKSBhZGRfYXV4X3N5bV9zeW1pbnQgKCh0LT5kaW1lbnNpb25zW2ldID09IDApCS8qIHN0cmlkZSAqLwotCQkJCSA/IDAKLQkJCQkgOiAodC0+c2l6ZXNbaV0gKiA4KSAvIHQtPmRpbWVuc2lvbnNbaV0pOwotICAgIH07Ci0KLSAgLyogTk9URTogIE1pcHMgZG9jdW1lbnRhdGlvbiBjbGFpbXMgdGhhdCB0aGUgYml0ZmllbGQgd2lkdGggZ29lcyBoZXJlLgotICAgICBCdXQgaXQgbmVlZHMgdG8gYmUgZW1pdHRlZCBlYXJsaWVyLiAqLwotCi0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBBZGQgYSB0YWcgdG8gdGhlIHRhZyB0YWJsZSAodW5sZXNzIGl0IGFscmVhZHkgZXhpc3RzKS4gICovCi0KLXN0YXRpYyB0YWdfdCAqCi1nZXRfdGFnICh0YWcsIHN5bSwgYmFzaWNfdHlwZSkKLSAgICAgY29uc3QgY2hhciAqdGFnOwkJCS8qIHRhZyBuYW1lICovCi0gICAgIGxvY2Fsc3ltX3QgKnN5bTsJCQkvKiB0YWcgc3RhcnQgYmxvY2sgKi8KLSAgICAgYnRfdCBiYXNpY190eXBlOwkJCS8qIGJ0X1N0cnVjdCwgYnRfVW5pb24sIG9yIGJ0X0VudW0gKi8KLXsKLSAgc2hhc2hfdCAqaGFzaF9wdHI7Ci0gIGNvbnN0IGNoYXIgKmVycjsKLSAgdGFnX3QgKnRhZ19wdHI7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIGhhc2hfcHRyID0gKHNoYXNoX3QgKikgaGFzaF9maW5kICh0YWdfaGFzaCwgdGFnKTsKLQotICBpZiAoaGFzaF9wdHIgIT0gKHNoYXNoX3QgKikgTlVMTAotICAgICAgJiYgaGFzaF9wdHItPnRhZ19wdHIgIT0gKHRhZ190ICopIE5VTEwpCi0gIHsKLSAgICB0YWdfcHRyID0gaGFzaF9wdHItPnRhZ19wdHI7Ci0gICAgaWYgKHN5bSAhPSAobG9jYWxzeW1fdCAqKSBOVUxMKQotICAgICAgewotCXRhZ19wdHItPmJhc2ljX3R5cGUgPSBiYXNpY190eXBlOwotCXRhZ19wdHItPmlmZAkgICAgPSBjdXJfZmlsZV9wdHItPmZpbGVfaW5kZXg7Ci0JdGFnX3B0ci0+c3ltCSAgICA9IHN5bTsKLSAgICAgIH0KLSAgICByZXR1cm4gdGFnX3B0cjsKLSAgfQotCi0gIGlmIChoYXNoX3B0ciA9PSAoc2hhc2hfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKnBlcm07Ci0KLSAgICAgIHBlcm0gPSB4bWFsbG9jICgodW5zaWduZWQgbG9uZykgKHN0cmxlbiAodGFnKSArIDEpKTsKLSAgICAgIHN0cmNweSAocGVybSwgdGFnKTsKLSAgICAgIGhhc2hfcHRyID0gYWxsb2NhdGVfc2hhc2ggKCk7Ci0gICAgICBlcnIgPSBoYXNoX2luc2VydCAodGFnX2hhc2gsIHBlcm0sIChjaGFyICopIGhhc2hfcHRyKTsKLSAgICAgIGlmIChlcnIpCi0JYXNfZmF0YWwgKF8oIkluc2VydGluZyBcIiVzXCIgaW50byB0YWcgaGFzaCB0YWJsZTogJXMiKSwKLQkJICB0YWcsIGVycik7Ci0gICAgICBoYXNoX3B0ci0+c3RyaW5nID0gcGVybTsKLSAgICB9Ci0KLSAgdGFnX3B0ciA9IGFsbG9jYXRlX3RhZyAoKTsKLSAgdGFnX3B0ci0+Zm9yd2FyZF9yZWYJPSAoZm9yd2FyZF90ICopIE5VTEw7Ci0gIHRhZ19wdHItPmhhc2hfcHRyCT0gaGFzaF9wdHI7Ci0gIHRhZ19wdHItPnNhbWVfbmFtZQk9IGhhc2hfcHRyLT50YWdfcHRyOwotICB0YWdfcHRyLT5iYXNpY190eXBlCT0gYmFzaWNfdHlwZTsKLSAgdGFnX3B0ci0+c3ltCQk9IHN5bTsKLSAgdGFnX3B0ci0+aWZkCQk9ICgoc3ltID09IChsb2NhbHN5bV90ICopIE5VTEwpCi0JCQkgICA/IChzeW1pbnRfdCkgLTEKLQkJCSAgIDogY3VyX2ZpbGVfcHRyLT5maWxlX2luZGV4KTsKLSAgdGFnX3B0ci0+c2FtZV9ibG9jawk9IGN1cl90YWdfaGVhZC0+Zmlyc3RfdGFnOwotCi0gIGN1cl90YWdfaGVhZC0+Zmlyc3RfdGFnID0gdGFnX3B0cjsKLSAgaGFzaF9wdHItPnRhZ19wdHIJICA9IHRhZ19wdHI7Ci0KLSAgcmV0dXJuIHRhZ19wdHI7Ci19Ci0MCi0vKiBBZGQgYW4gdW5rbm93biB7c3RydWN0LCB1bmlvbiwgZW51bX0gdGFnLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF91bmtub3duX3RhZyAocHRhZykKLSAgICAgdGFnX3QJKnB0YWc7CQkvKiBwb2ludGVyIHRvIHRhZyBpbmZvcm1hdGlvbiAqLwotewotICBzaGFzaF90ICpoYXNoX3B0cgk9IHB0YWctPmhhc2hfcHRyOwotICBjaGFyICpuYW1lCQk9IGhhc2hfcHRyLT5zdHJpbmc7Ci0gIGxvY2Fsc3ltX3QgKnN5bTsKLSAgZm9yd2FyZF90ICoqcGY7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVRwotICBpZiAoZGVidWcgPiAxKQotICAgIHsKLSAgICAgIGNoYXIgKmFnZ190eXBlCT0gInt1bmtub3duIGFnZ3JlZ2F0ZSB0eXBlfSI7Ci0gICAgICBzd2l0Y2ggKHB0YWctPmJhc2ljX3R5cGUpCi0JewotCWNhc2UgYnRfU3RydWN0OglhZ2dfdHlwZSA9ICJzdHJ1Y3QiOwlicmVhazsKLQljYXNlIGJ0X1VuaW9uOglhZ2dfdHlwZSA9ICJ1bmlvbiI7CWJyZWFrOwotCWNhc2UgYnRfRW51bToJYWdnX3R5cGUgPSAiZW51bSI7CWJyZWFrOwotCWRlZmF1bHQ6CQkJCWJyZWFrOwotCX0KLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAidW5rbm93biAlcyAlLipzIGZvdW5kXG4iLCBhZ2dfdHlwZSwKLQkgICAgICAgaGFzaF9wdHItPmxlbiwgbmFtZV9zdGFydCk7Ci0gICAgfQotI2VuZGlmCi0KLSAgc3ltID0gYWRkX2Vjb2ZmX3N5bWJvbCAobmFtZSwKLQkJCSAgc3RfQmxvY2ssCi0JCQkgIHNjX0luZm8sCi0JCQkgIChzeW1ib2xTICopIE5VTEwsCi0JCQkgIChiZmRfdm1hKSAwLAotCQkJICAoc3ltaW50X3QpIDAsCi0JCQkgIChzeW1pbnRfdCkgMCk7Ci0KLSAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKG5hbWUsCi0JCQkgICBzdF9FbmQsCi0JCQkgICBzY19JbmZvLAotCQkJICAgKHN5bWJvbFMgKikgTlVMTCwKLQkJCSAgIChiZmRfdm1hKSAwLAotCQkJICAgKHN5bWludF90KSAwLAotCQkJICAgKHN5bWludF90KSAwKTsKLQotICBmb3IgKHBmID0gJnN5bS0+Zm9yd2FyZF9yZWY7ICpwZiAhPSAoZm9yd2FyZF90ICopIE5VTEw7IHBmID0gJigqcGYpLT5uZXh0KQotICAgIDsKLSAgKnBmID0gcHRhZy0+Zm9yd2FyZF9yZWY7Ci19Ci0MCi0vKiBBZGQgYSBwcm9jZWR1cmUgdG8gdGhlIGN1cnJlbnQgZmlsZSdzIGxpc3Qgb2YgcHJvY2VkdXJlcywgYW5kIHJlY29yZAotICAgdGhpcyBpcyB0aGUgY3VycmVudCBwcm9jZWR1cmUuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX3Byb2NlZHVyZSAoZnVuYykKLSAgICAgY2hhciAqZnVuYzsJCQkvKiBmdW5jIG5hbWUgKi8KLXsKLSAgcmVnaXN0ZXIgdmFycmF5X3QgKnZwOwotICByZWdpc3RlciBwcm9jX3QgKm5ld19wcm9jX3B0cjsKLSAgc3ltYm9sUyAqc3ltOwotCi0jaWZkZWYgRUNPRkZfREVCVUcKLSAgaWYgKGRlYnVnKQotICAgIGZwdXRjICgnXG4nLCBzdGRlcnIpOwotI2VuZGlmCi0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYXNfZmF0YWwgKF8oIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIikpOwotCi0gIHZwID0gJmN1cl9maWxlX3B0ci0+cHJvY3M7Ci0KLSAgaWYgKHZwLT5vYmplY3RzX2xhc3RfcGFnZSA9PSB2cC0+b2JqZWN0c19wZXJfcGFnZSkKLSAgICBhZGRfdmFycmF5X3BhZ2UgKHZwKTsKLQotICBjdXJfcHJvY19wdHIgPSBuZXdfcHJvY19wdHIgPSAmdnAtPmxhc3QtPmRhdHVtLT5wcm9jW3ZwLT5vYmplY3RzX2xhc3RfcGFnZSsrXTsKLQotICBpZiAoZmlyc3RfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIGZpcnN0X3Byb2NfcHRyID0gbmV3X3Byb2NfcHRyOwotCi0gIHZwLT5udW1fYWxsb2NhdGVkKys7Ci0KLSAgbmV3X3Byb2NfcHRyLT5wZHIuaXN5bSA9IC0xOwotICBuZXdfcHJvY19wdHItPnBkci5pbGluZSA9IC0xOwotICBuZXdfcHJvY19wdHItPnBkci5sbkxvdyA9IC0xOwotICBuZXdfcHJvY19wdHItPnBkci5sbkhpZ2ggPSAtMTsKLQotICAvKiBTZXQgdGhlIEJTRl9GVU5DVElPTiBmbGFnIGZvciB0aGUgc3ltYm9sLiAgKi8KLSAgc3ltID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoZnVuYyk7Ci0gIHN5bWJvbF9nZXRfYmZkc3ltIChzeW0pLT5mbGFncyB8PSBCU0ZfRlVOQ1RJT047Ci0KLSAgLyogUHVzaCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLiAgKi8KLSAgbmV3X3Byb2NfcHRyLT5zeW0gPSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9Qcm9jLCBzY19UZXh0LAotCQkJCQlzeW0sIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIDAsCi0JCQkJCShzeW1pbnRfdCkgMCk7Ci0KLSAgKytwcm9jX2NudDsKLQotICAvKiBGaWxsIGluIHRoZSBsaW5lbm9zIHByZWNlZGluZyB0aGUgLmVudCwgaWYgYW55LiAgKi8KLSAgaWYgKG5vcHJvY19saW5lbm8gIT0gKGxpbmVub19saXN0X3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lbm9fbGlzdF90ICpsOwotCi0gICAgICBmb3IgKGwgPSBub3Byb2NfbGluZW5vOyBsICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7IGwgPSBsLT5uZXh0KQotCWwtPnByb2MgPSBuZXdfcHJvY19wdHI7Ci0gICAgICAqbGFzdF9saW5lbm9fcHRyID0gbm9wcm9jX2xpbmVubzsKLSAgICAgIHdoaWxlICgqbGFzdF9saW5lbm9fcHRyICE9IE5VTEwpCi0JewotCSAgbGFzdF9saW5lbm8gPSAqbGFzdF9saW5lbm9fcHRyOwotCSAgbGFzdF9saW5lbm9fcHRyID0gJmxhc3RfbGluZW5vLT5uZXh0OwotCX0KLSAgICAgIG5vcHJvY19saW5lbm8gPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICAgIH0KLX0KLQotc3ltYm9sUyAqCi1lY29mZl9nZXRfY3VyX3Byb2Nfc3ltICgpCi17Ci0gIHJldHVybiAoY3VyX3Byb2NfcHRyID8gY3VyX3Byb2NfcHRyLT5zeW0tPmFzX3N5bSA6IE5VTEwpOwotfQotDAotLyogQWRkIGEgbmV3IGZpbGVuYW1lLCBhbmQgc2V0IHVwIGFsbCBvZiB0aGUgZmlsZSByZWxhdGl2ZQotICAgdmlydHVhbCBhcnJheXMgKHN0cmluZ3MsIHN5bWJvbHMsIGF1eCBzeW1zLCBldGMuKS4gIFJlY29yZAotICAgd2hlcmUgdGhlIGN1cnJlbnQgZmlsZSBzdHJ1Y3R1cmUgbGl2ZXMuICAqLwotCi1zdGF0aWMgdm9pZAotYWRkX2ZpbGUgKGZpbGVfbmFtZSwgaW5keCwgZmFrZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOwkJLyogZmlsZSBuYW1lICovCi0gICAgIGludCBpbmR4OwotICAgICBpbnQgZmFrZTsKLXsKLSAgcmVnaXN0ZXIgaW50IGZpcnN0X2NoOwotICByZWdpc3RlciBlZmRyX3QgKmZpbF9wdHI7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVRwotICBpZiAoZGVidWcpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiXHRmaWxlXHQlLipzXG4iLCBsZW4sIGZpbGVfc3RhcnQpOwotI2VuZGlmCi0KLSAgLyogSWYgdGhlIGZpbGUgbmFtZSBpcyBOVUxMLCB0aGVuIG5vIC5maWxlIHN5bWJvbCBhcHBlYXJlZCwgYW5kIHdlCi0gICAgIHdhbnQgdG8gdXNlIHRoZSBhY3R1YWwgZmlsZSBuYW1lLiAgKi8KLSAgaWYgKGZpbGVfbmFtZSA9PSAoY29uc3QgY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGU7Ci0KLSAgICAgIGlmIChmaXJzdF9maWxlICE9IChlZmRyX3QgKikgTlVMTCkKLQlhc19mYXRhbCAoXygiZmFrZSAuZmlsZSBhZnRlciByZWFsIG9uZSIpKTsKLSAgICAgIGFzX3doZXJlICgmZmlsZSwgKHVuc2lnbmVkIGludCAqKSBOVUxMKTsKLSAgICAgIGZpbGVfbmFtZSA9IChjb25zdCBjaGFyICopIGZpbGU7Ci0KLSAgICAgIC8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLCBzaW5jZSBJCi0gICAgICAgICB0aGluayB0aGF0J3Mgd2hhdCBvdGhlciBFQ09GRiBhc3NlbWJsZXJzIGRvLiAgV2UgZG9uJ3QgZG8KLSAgICAgICAgIHRoaXMgaWYgd2Ugc2VlIGEgLmZpbGUgZGlyZWN0aXZlIHdpdGggYSBzdHJpbmcsIHNpbmNlIHRoYXQKLSAgICAgICAgIGltcGxpZXMgdGhhdCBzb21lIHNvcnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGJlaW5nCi0gICAgICAgICBwcm92aWRlZC4gICovCi0gICAgICBpZiAoISBzeW1ib2xfdGFibGVfZnJvemVuICYmIGRlYnVnX3R5cGUgPT0gREVCVUdfTk9ORSkKLQlkZWJ1Z190eXBlID0gREVCVUdfRUNPRkY7Ci0gICAgfQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZV9uYW1lKTsKLSNlbmRpZgotCi0gIGN1cnJlbnRfc3RhYnNfZmlsZW5hbWUgPSBmaWxlX25hbWU7Ci0KLSAgLyogSWYgd2UncmUgY3JlYXRpbmcgc3RhYnMsIHRoZW4gd2UgZG9uJ3QgYWN0dWFsbHkgbWFrZSBhIG5ldyBGRFIuCi0gICAgIEluc3RlYWQsIHdlIGp1c3QgY3JlYXRlIGEgc3RhYnMgc3ltYm9sLiAgKi8KLSAgaWYgKHN0YWJzX3NlZW4pCi0gICAgewotICAgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKGZpbGVfbmFtZSwgc3RfTmlsLCBzY19OaWwsCi0JCQkgICAgICAgc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsCi0JCQkJCSAgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJCQkJICAgZnJhZ19ub3cpLAotCQkJICAgICAgIChiZmRfdm1hKSAwLCAwLCBFQ09GRl9NQVJLX1NUQUIgKE5fU09MKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZpcnN0X2NoID0gKmZpbGVfbmFtZTsKLQotICAvKiBGSVhNRTogV2UgY2FuJ3Qgc2FmZWx5IG1lcmdlIGZpbGVzIHdoaWNoIGhhdmUgbGluZSBudW1iZXIKLSAgICAgaW5mb3JtYXRpb24gKGZNZXJnZSB3aWxsIGJlIHplcm8gaW4gdGhpcyBjYXNlKS4gIE90aGVyd2lzZSwgd2UKLSAgICAgZ2V0IGluY29ycmVjdCBsaW5lIG51bWJlciBkZWJ1Z2dpbmcgaW5mby4gIFNlZSBmb3IgaW5zdGFuY2UKLSAgICAgZWNvZmZfYnVpbGRfbGluZW5vLCB3aGljaCB3aWxsIGVuZCB1cCBzZXR0aW5nIGFsbCBmaWxlLT5mZHIuKgotICAgICBmaWVsZHMgbXVsdGlwbGUgdGltZXMsIHJlc3VsdGluZyBpbiBpbmNvcnJlY3QgZGVidWcgaW5mby4gIEluCi0gICAgIG9yZGVyIHRvIG1ha2UgdGhpcyB3b3JrIHJpZ2h0LCBhbGwgbGluZSBudW1iZXIgYW5kIHN5bWJvbCBpbmZvCi0gICAgIGZvciB0aGUgc2FtZSBzb3VyY2UgZmlsZSBoYXMgdG8gYmUgYWRqYWNlbnQgaW4gdGhlIG9iamVjdCBmaWxlLAotICAgICBzbyB0aGF0IGEgc2luZ2xlIGZpbGUgZGVzY3JpcHRvciBjYW4gYmUgdXNlZCB0byBwb2ludCB0byB0aGVtLgotICAgICBUaGlzIHdvdWxkIHJlcXVpcmUgbWFpbnRhaW5pbmcgZmlsZSBzcGVjaWZpYyBsaXN0cyBvZiBsaW5lCi0gICAgIG51bWJlcnMgYW5kIHN5bWJvbHMgZm9yIGVhY2ggZmlsZSwgc28gdGhhdCB0aGV5IGNhbiBiZSBtZXJnZWQKLSAgICAgdG9nZXRoZXIgKG9yIG91dHB1dCB0b2dldGhlcikgd2hlbiB0d28gLmZpbGUgcHNldWRvLW9wcyBhcmUKLSAgICAgbWVyZ2VkIGludG8gb25lIGZpbGUgZGVzY3JpcHRvci4gICovCi0KLSAgLyogU2VlIGlmIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZC4gICovCi0gIGZvciAoZmlsX3B0ciA9IGZpcnN0X2ZpbGU7Ci0gICAgICAgZmlsX3B0ciAhPSAoZWZkcl90ICopIE5VTEw7Ci0gICAgICAgZmlsX3B0ciA9IGZpbF9wdHItPm5leHRfZmlsZSkKLSAgICB7Ci0gICAgICBpZiAoZmlyc3RfY2ggPT0gZmlsX3B0ci0+bmFtZVswXQotCSAgJiYgc3RyY21wIChmaWxlX25hbWUsIGZpbF9wdHItPm5hbWUpID09IDAKLQkgICYmIGZpbF9wdHItPmZkci5mTWVyZ2UpCi0JewotCSAgY3VyX2ZpbGVfcHRyID0gZmlsX3B0cjsKLQkgIGlmICghIGZha2UpCi0JICAgIGN1cl9maWxlX3B0ci0+ZmFrZSA9IDA7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBuZXcgZmlsZSwgY3JlYXRlIGl0LiAqLwotICBpZiAoZmlsX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZSA9PSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZSkKLQlhZGRfdmFycmF5X3BhZ2UgKCZmaWxlX2Rlc2MpOwotCi0gICAgICBmaWxfcHRyID0gY3VyX2ZpbGVfcHRyID0KLQkmZmlsZV9kZXNjLmxhc3QtPmRhdHVtLT5maWxlW2ZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZSsrXTsKLSAgICAgICpmaWxfcHRyID0gaW5pdF9maWxlOwotCi0gICAgICBmaWxfcHRyLT5maWxlX2luZGV4ID0gY3VycmVudF9maWxlX2lkeCsrOwotICAgICAgKytmaWxlX2Rlc2MubnVtX2FsbG9jYXRlZDsKLQotICAgICAgZmlsX3B0ci0+ZmFrZSA9IGZha2U7Ci0KLSAgICAgIC8qIEFsbG9jYXRlIHRoZSBzdHJpbmcgaGFzaCB0YWJsZS4gICovCi0gICAgICBmaWxfcHRyLT5zdHJfaGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gICAgICAvKiBNYWtlIHN1cmUgMCBieXRlIGluIHN0cmluZyB0YWJsZSBpcyBudWxsICAqLwotICAgICAgYWRkX3N0cmluZyAoJmZpbF9wdHItPnN0cmluZ3MsCi0JCSAgZmlsX3B0ci0+c3RyX2hhc2gsCi0JCSAgIiIsCi0JCSAgKHNoYXNoX3QgKiopMCk7Ci0KLSAgICAgIGlmIChzdHJsZW4gKGZpbGVfbmFtZSkgPiBQQUdFX1VTSVpFIC0gMikKLQlhc19mYXRhbCAoXygiRmlsZW5hbWUgZ29lcyBvdmVyIG9uZSBwYWdlIGJvdW5kYXJ5LiIpKTsKLQotICAgICAgLyogUHVzaCB0aGUgc3RhcnQgb2YgdGhlIGZpbGVuYW1lLiBXZSBhc3N1bWUgdGhhdCB0aGUgZmlsZW5hbWUKLSAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGF0IHN0cmluZyBvZmZzZXQgMS4gICovCi0gICAgICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoZmlsZV9uYW1lLCBzdF9GaWxlLCBzY19UZXh0LAotCQkJICAgICAgIChzeW1ib2xTICopIE5VTEwsIChiZmRfdm1hKSAwLAotCQkJICAgICAgIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKLSAgICAgIGZpbF9wdHItPmZkci5yc3MgPSAxOwotICAgICAgZmlsX3B0ci0+bmFtZSA9ICZmaWxfcHRyLT5zdHJpbmdzLmxhc3QtPmRhdHVtLT5ieXRlWzFdOwotCi0gICAgICAvKiBVcGRhdGUgdGhlIGxpbmtlZCBsaXN0IG9mIGZpbGUgZGVzY3JpcHRvcnMuICAqLwotICAgICAgKmxhc3RfZmlsZV9wdHIgPSBmaWxfcHRyOwotICAgICAgbGFzdF9maWxlX3B0ciA9ICZmaWxfcHRyLT5uZXh0X2ZpbGU7Ci0KLSAgICAgIC8qIEFkZCB2b2lkICYgaW50IHR5cGVzIHRvIHRoZSBmaWxlICh2b2lkIHNob3VsZCBiZSBmaXJzdCB0byBjYXRjaAotCSBlcnJhbnQgMCdzIHdpdGhpbiB0aGUgaW5kZXggZmllbGRzKS4gICovCi0gICAgICBmaWxfcHRyLT52b2lkX3R5cGUgPSBhZGRfYXV4X3N5bV90aXIgKCZ2b2lkX3R5cGVfaW5mbywKLQkJCQkJICAgIGhhc2hfeWVzLAotCQkJCQkgICAgJmN1cl9maWxlX3B0ci0+dGhhc2hfaGVhZFswXSk7Ci0KLSAgICAgIGZpbF9wdHItPmludF90eXBlID0gYWRkX2F1eF9zeW1fdGlyICgmaW50X3R5cGVfaW5mbywKLQkJCQkJICAgaGFzaF95ZXMsCi0JCQkJCSAgICZjdXJfZmlsZV9wdHItPnRoYXNoX2hlYWRbMF0pOwotICAgIH0KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIG5vdGljZXMgYSBwcmVwcm9jZXNzb3IKLSAgIGRpcmVjdGl2ZSBzd2l0Y2hpbmcgdG8gYSBuZXcgZmlsZS4gIFRoaXMgd2lsbCBub3QgaGFwcGVuIGluCi0gICBjb21waWxlciBvdXRwdXQsIG9ubHkgaW4gaGFuZCBjb2RlZCBhc3NlbWJsZXIuICAqLwotCi12b2lkCi1lY29mZl9uZXdfZmlsZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGN1cl9maWxlX3B0ciAhPSBOVUxMICYmIHN0cmNtcCAoY3VyX2ZpbGVfcHRyLT5uYW1lLCBuYW1lKSA9PSAwKQotICAgIHJldHVybjsKLSAgYWRkX2ZpbGUgKG5hbWUsIDAsIDApOwotCi0gIC8qIFRoaXMgaXMgYSBoYW5kIGNvZGVkIGFzc2VtYmxlciBmaWxlLCBzbyBhdXRvbWF0aWNhbGx5IHR1cm4gb24KLSAgICAgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfTk9ORSkKLSAgICBkZWJ1Z190eXBlID0gREVCVUdfRUNPRkY7Ci19Ci0MCi0jaWZkZWYgRUNPRkZfREVCVUcKLQotLyogQ29udmVydCBzdG9yYWdlIGNsYXNzIHRvIHN0cmluZy4gICovCi0KLXN0YXRpYyBjaGFyICoKLXNjX3RvX3N0cmluZyhzdG9yYWdlX2NsYXNzKQotICAgICBzY190IHN0b3JhZ2VfY2xhc3M7Ci17Ci0gIHN3aXRjaChzdG9yYWdlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIHNjX05pbDoJIHJldHVybiAiTmlsLCI7Ci0gICAgY2FzZSBzY19UZXh0OgkgcmV0dXJuICJUZXh0LCI7Ci0gICAgY2FzZSBzY19EYXRhOgkgcmV0dXJuICJEYXRhLCI7Ci0gICAgY2FzZSBzY19Cc3M6CSByZXR1cm4gIkJzcywiOwotICAgIGNhc2Ugc2NfUmVnaXN0ZXI6CSByZXR1cm4gIlJlZ2lzdGVyLCI7Ci0gICAgY2FzZSBzY19BYnM6CSByZXR1cm4gIkFicywiOwotICAgIGNhc2Ugc2NfVW5kZWZpbmVkOgkgcmV0dXJuICJVbmRlZmluZWQsIjsKLSAgICBjYXNlIHNjX0NkYkxvY2FsOgkgcmV0dXJuICJDZGJMb2NhbCwiOwotICAgIGNhc2Ugc2NfQml0czoJIHJldHVybiAiQml0cywiOwotICAgIGNhc2Ugc2NfQ2RiU3lzdGVtOgkgcmV0dXJuICJDZGJTeXN0ZW0sIjsKLSAgICBjYXNlIHNjX1JlZ0ltYWdlOgkgcmV0dXJuICJSZWdJbWFnZSwiOwotICAgIGNhc2Ugc2NfSW5mbzoJIHJldHVybiAiSW5mbywiOwotICAgIGNhc2Ugc2NfVXNlclN0cnVjdDoJIHJldHVybiAiVXNlclN0cnVjdCwiOwotICAgIGNhc2Ugc2NfU0RhdGE6CSByZXR1cm4gIlNEYXRhLCI7Ci0gICAgY2FzZSBzY19TQnNzOgkgcmV0dXJuICJTQnNzLCI7Ci0gICAgY2FzZSBzY19SRGF0YToJIHJldHVybiAiUkRhdGEsIjsKLSAgICBjYXNlIHNjX1ZhcjoJIHJldHVybiAiVmFyLCI7Ci0gICAgY2FzZSBzY19Db21tb246CSByZXR1cm4gIkNvbW1vbiwiOwotICAgIGNhc2Ugc2NfU0NvbW1vbjoJIHJldHVybiAiU0NvbW1vbiwiOwotICAgIGNhc2Ugc2NfVmFyUmVnaXN0ZXI6IHJldHVybiAiVmFyUmVnaXN0ZXIsIjsKLSAgICBjYXNlIHNjX1ZhcmlhbnQ6CSByZXR1cm4gIlZhcmlhbnQsIjsKLSAgICBjYXNlIHNjX1NVbmRlZmluZWQ6CSByZXR1cm4gIlNVbmRlZmluZWQsIjsKLSAgICBjYXNlIHNjX0luaXQ6CSByZXR1cm4gIkluaXQsIjsKLSAgICBjYXNlIHNjX01heDoJIHJldHVybiAiTWF4LCI7Ci0gICAgfQotCi0gIHJldHVybiAiPz8/LCI7Ci19Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotDAotI2lmZGVmIEVDT0ZGX0RFQlVHCi0KLS8qIENvbnZlcnQgc3ltYm9sIHR5cGUgdG8gc3RyaW5nLiAgKi8KLQotc3RhdGljIGNoYXIgKgotc3RfdG9fc3RyaW5nKHN5bWJvbF90eXBlKQotICAgICBzdF90IHN5bWJvbF90eXBlOwotewotICBzd2l0Y2goc3ltYm9sX3R5cGUpCi0gICAgewotICAgIGNhc2Ugc3RfTmlsOglyZXR1cm4gIk5pbCwiOwotICAgIGNhc2Ugc3RfR2xvYmFsOglyZXR1cm4gIkdsb2JhbCwiOwotICAgIGNhc2Ugc3RfU3RhdGljOglyZXR1cm4gIlN0YXRpYywiOwotICAgIGNhc2Ugc3RfUGFyYW06CXJldHVybiAiUGFyYW0sIjsKLSAgICBjYXNlIHN0X0xvY2FsOglyZXR1cm4gIkxvY2FsLCI7Ci0gICAgY2FzZSBzdF9MYWJlbDoJcmV0dXJuICJMYWJlbCwiOwotICAgIGNhc2Ugc3RfUHJvYzoJcmV0dXJuICJQcm9jLCI7Ci0gICAgY2FzZSBzdF9CbG9jazoJcmV0dXJuICJCbG9jaywiOwotICAgIGNhc2Ugc3RfRW5kOglyZXR1cm4gIkVuZCwiOwotICAgIGNhc2Ugc3RfTWVtYmVyOglyZXR1cm4gIk1lbWJlciwiOwotICAgIGNhc2Ugc3RfVHlwZWRlZjoJcmV0dXJuICJUeXBlZGVmLCI7Ci0gICAgY2FzZSBzdF9GaWxlOglyZXR1cm4gIkZpbGUsIjsKLSAgICBjYXNlIHN0X1JlZ1JlbG9jOglyZXR1cm4gIlJlZ1JlbG9jLCI7Ci0gICAgY2FzZSBzdF9Gb3J3YXJkOglyZXR1cm4gIkZvcndhcmQsIjsKLSAgICBjYXNlIHN0X1N0YXRpY1Byb2M6CXJldHVybiAiU3RhdGljUHJvYywiOwotICAgIGNhc2Ugc3RfQ29uc3RhbnQ6CXJldHVybiAiQ29uc3RhbnQsIjsKLSAgICBjYXNlIHN0X1N0cjoJcmV0dXJuICJTdHJpbmcsIjsKLSAgICBjYXNlIHN0X051bWJlcjoJcmV0dXJuICJOdW1iZXIsIjsKLSAgICBjYXNlIHN0X0V4cHI6CXJldHVybiAiRXhwciwiOwotICAgIGNhc2Ugc3RfVHlwZToJcmV0dXJuICJUeXBlLCI7Ci0gICAgY2FzZSBzdF9NYXg6CXJldHVybiAiTWF4LCI7Ci0gICAgfQotCi0gIHJldHVybiAiPz8/LCI7Ci19Ci0KLSNlbmRpZiAvKiBERUJVRyAqLwotDAotLyogUGFyc2UgLmJlZ2luIGRpcmVjdGl2ZXMgd2hpY2ggaGF2ZSBhIGxhYmVsIGFzIHRoZSBmaXJzdCBhcmd1bWVudAotICAgd2hpY2ggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYmxvY2suICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfYmVnaW4gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLQotICBpZiAoY3VyX2ZpbGVfcHRyID09IChlZmRyX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmJlZ2luIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICAodm9pZCkgYWRkX2Vjb2ZmX3N5bWJvbCAoKGNvbnN0IGNoYXIgKikgTlVMTCwgc3RfQmxvY2ssIHNjX1RleHQsCi0JCQkgICBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKSwKLQkJCSAgIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIDAsIChzeW1pbnRfdCkgMCk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIC8qIFRoZSBsaW5lIG51bWJlciBmb2xsb3dzLCBidXQgd2UgZG9uJ3QgdXNlIGl0LiAgKi8KLSAgKHZvaWQpIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmJlbmQgZGlyZWN0aXZlcyB3aGljaCBoYXZlIGEgbGFiZWwgYXMgdGhlIGZpcnN0IGFyZ3VtZW50Ci0gICB3aGljaCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgYmxvY2suICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfYmVuZCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotICBzeW1ib2xTICplbmRzeW07Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmJlbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmJlbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgLmJlbmQgZGlyZWN0aXZlIGFuZCB0aGUKLSAgICAgY29ycmVzcG9uZGluZyBzeW1ib2wuICBXZSBmaWxsIGluIHRoZSBvZmZzZXQgd2hlbiB3ZSB3cml0ZSBvdXQKLSAgICAgdGhlIHN5bWJvbC4gICovCi0gIGVuZHN5bSA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgaWYgKGVuZHN5bSA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIGFzX3dhcm4gKF8oIi5iZW5kIGRpcmVjdGl2ZSBuYW1lcyB1bmtub3duIHN5bWJvbCIpKTsKLSAgZWxzZQotICAgICh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLCBzdF9FbmQsIHNjX1RleHQsIGVuZHN5bSwKLQkJCSAgICAgKGJmZF92bWEpIDAsIChzeW1pbnRfdCkgMCwgKHN5bWludF90KSAwKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgLyogVGhlIGxpbmUgbnVtYmVyIGZvbGxvd3MsIGJ1dCB3ZSBkb24ndCB1c2UgaXQuICAqLwotICAodm9pZCkgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0MCi0vKiBDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBhcyBhIHNlcmllcyBvZiBkaXJlY3RpdmVzCi0gICAoLmRlZiwgLnNjbCwgZXRjLikuICBXZSBidWlsZCB1cCBpbmZvcm1hdGlvbiBhcyB3ZSByZWFkIHRoZQotICAgZGlyZWN0aXZlcyBpbiB0aGUgZm9sbG93aW5nIHN0YXRpYyB2YXJpYWJsZXMsIGFuZCBmaWxlIGl0IGF3YXkgd2hlbgotICAgd2UgcmVhY2ggdGhlIC5lbmRlZiBkaXJlY3RpdmUuICAqLwotc3RhdGljIGNoYXIgKmNvZmZfc3ltX25hbWU7Ci1zdGF0aWMgdHlwZV9pbmZvX3QgY29mZl90eXBlOwotc3RhdGljIHNjX3QgY29mZl9zdG9yYWdlX2NsYXNzOwotc3RhdGljIHN0X3QgY29mZl9zeW1ib2xfdHlwOwotc3RhdGljIGludCBjb2ZmX2lzX2Z1bmN0aW9uOwotc3RhdGljIGNoYXIgKmNvZmZfdGFnOwotc3RhdGljIHZhbHVlVCBjb2ZmX3ZhbHVlOwotc3RhdGljIHN5bWJvbFMgKmNvZmZfc3ltX3ZhbHVlOwotc3RhdGljIGJmZF92bWEgY29mZl9zeW1fYWRkZW5kOwotc3RhdGljIGludCBjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbjsKLQotLyogSGFuZGxlIGEgLmRlZiBkaXJlY3RpdmU6IHN0YXJ0IGRlZmluaW5nIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2RlZiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGVjb2ZmX2RlYnVnZ2luZ19zZWVuID0gMTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBpZiAoY29mZl9zeW1fbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotICAgIGFzX3dhcm4gKF8oIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICBlbHNlIGlmICgqbmFtZSA9PSAnXDAnKQotICAgIGFzX3dhcm4gKF8oIkVtcHR5IHN5bWJvbCBuYW1lIGluIC5kZWY7IGlnbm9yZWQiKSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoY29mZl9zeW1fbmFtZSAhPSAoY2hhciAqKSBOVUxMKQotCWZyZWUgKGNvZmZfc3ltX25hbWUpOwotICAgICAgaWYgKGNvZmZfdGFnICE9IChjaGFyICopIE5VTEwpCi0JZnJlZSAoY29mZl90YWcpOwotICAgICAgY29mZl9zeW1fbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSAoc3RybGVuIChuYW1lKSArIDEpKTsKLSAgICAgIHN0cmNweSAoY29mZl9zeW1fbmFtZSwgbmFtZSk7Ci0gICAgICBjb2ZmX3R5cGUgPSB0eXBlX2luZm9faW5pdDsKLSAgICAgIGNvZmZfc3RvcmFnZV9jbGFzcyA9IHNjX05pbDsKLSAgICAgIGNvZmZfc3ltYm9sX3R5cCA9IHN0X05pbDsKLSAgICAgIGNvZmZfaXNfZnVuY3Rpb24gPSAwOwotICAgICAgY29mZl90YWcgPSAoY2hhciAqKSBOVUxMOwotICAgICAgY29mZl92YWx1ZSA9IDA7Ci0gICAgICBjb2ZmX3N5bV92YWx1ZSA9IChzeW1ib2xTICopIE5VTEw7Ci0gICAgICBjb2ZmX3N5bV9hZGRlbmQgPSAwOwotICAgIH0KLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIGEgLmRpbSBkaXJlY3RpdmUsIHVzZWQgdG8gZ2l2ZSBkaW1lbnNpb25zIGZvciBhbiBhcnJheS4gIFRoZQotICAgYXJndW1lbnRzIGFyZSBjb21tYSBzZXBhcmF0ZWQgbnVtYmVycy4gIG1pcHMtdGZpbGUgYXNzdW1lcyB0aGF0Ci0gICB0aGVyZSB3aWxsIG5vdCBiZSBtb3JlIHRoYW4gNiBkaW1lbnNpb25zLCBhbmQgZ2RiIHdvbid0IHJlYWQgYW55Ci0gICBtb3JlIHRoYW4gdGhhdCBhbnlob3csIHNvIEkgd2lsbCBhbHNvIG1ha2UgdGhhdCBhc3N1bXB0aW9uLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2RpbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgZGltZW5zW05fVFFdOwotICBpbnQgaTsKLQotICBpZiAoY29mZl9zeW1fbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5kaW0gcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBOX1RROyBpKyspCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgZGltZW5zW2ldID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1xuJwotCSAgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzsnKQotCSAgICBhc193YXJuIChfKCJCYWRseSBmb3JtZWQgLmRpbSBkaXJlY3RpdmUiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpID09IE5fVFEpCi0gICAgLS1pOwotCi0gIC8qIFRoZSBkaW1lbnNpb25zIGFyZSBzdG9yZWQgYXdheSBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgZm9yICg7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3R5cGUubnVtX2RpbXMgPj0gTl9UUSkKLQl7Ci0JICBhc193YXJuIChfKCJUb28gbWFueSAuZGltIGVudHJpZXMiKSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBjb2ZmX3R5cGUuZGltZW5zaW9uc1tjb2ZmX3R5cGUubnVtX2RpbXNdID0gZGltZW5zW2ldOwotICAgICAgKytjb2ZmX3R5cGUubnVtX2RpbXM7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5zY2wgZGlyZWN0aXZlLCB3aGljaCBzZXRzIHRoZSBDT0ZGIHN0b3JhZ2UgY2xhc3Mgb2YgdGhlCi0gICBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfc2NsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgY29mZl9zeW1ib2xfdHlwID0gbWFwX2NvZmZfc3ltX3R5cGVbdmFsXTsKLSAgY29mZl9zdG9yYWdlX2NsYXNzID0gbWFwX2NvZmZfc3RvcmFnZVt2YWxdOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBhIC5zaXplIGRpcmVjdGl2ZS4gIEZvciBzb21lIHJlYXNvbiBtaXBzLXRmaWxlLmMgdGhpbmtzIHRoYXQKLSAgIC5zaXplIGNhbiBoYXZlIG11bHRpcGxlIGFyZ3VtZW50cy4gIFdlIGh1bW9yIGl0LCBhbHRob3VnaCBnY2Mgd2lsbAotICAgbmV2ZXIgZ2VuZXJhdGUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9zaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBzaXplc1tOX1RRXTsKLSAgaW50IGk7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuc2l6ZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5fVFE7IGkrKykKLSAgICB7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBzaXplc1tpXSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZWxzZQotCXsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicKLQkgICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICc7JykKLQkgICAgYXNfd2FybiAoXygiQmFkbHkgZm9ybWVkIC5zaXplIGRpcmVjdGl2ZSIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKGkgPT0gTl9UUSkKLSAgICAtLWk7Ci0KLSAgLyogVGhlIHNpemVzIGFyZSBzdG9yZWQgYXdheSBpbiByZXZlcnNlIG9yZGVyLiAgKi8KLSAgZm9yICg7IGkgPj0gMDsgaS0tKQotICAgIHsKLSAgICAgIGlmIChjb2ZmX3R5cGUubnVtX3NpemVzID49IE5fVFEpCi0JewotCSAgYXNfd2FybiAoXygiVG9vIG1hbnkgLnNpemUgZW50cmllcyIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGNvZmZfdHlwZS5zaXplc1tjb2ZmX3R5cGUubnVtX3NpemVzXSA9IHNpemVzW2ldOwotICAgICAgKytjb2ZmX3R5cGUubnVtX3NpemVzOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBIYW5kbGUgdGhlIC50eXBlIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIENPRkYgdHlwZSBvZiB0aGUKLSAgIHN5bWJvbC4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV90eXBlIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotICB0cV90ICp0cV9wdHI7Ci0gIHRxX3QgKnRxX3NoZnQ7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudHlwZSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgdmFsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgY29mZl90eXBlLm9yaWdfdHlwZSA9IEJUWVBFICh2YWwpOwotICBjb2ZmX3R5cGUuYmFzaWNfdHlwZSA9IG1hcF9jb2ZmX3R5cGVzW2NvZmZfdHlwZS5vcmlnX3R5cGVdOwotCi0gIHRxX3B0ciA9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzW05fVFFdOwotICB3aGlsZSAodmFsICZ+IE5fQlRNQVNLKQotICAgIHsKLSAgICAgIGlmICh0cV9wdHIgPT0gJmNvZmZfdHlwZS50eXBlX3F1YWxpZmllcnNbMF0pCi0JewotCSAgLyogRklYTUU6IFdlIGNvdWxkIGhhbmRsZSB0aGlzIGJ5IHNldHRpbmcgdGhlIGNvbnRpbnVlZCBiaXQuCi0gICAgICAgICAgICAgVGhlcmUgd291bGQgc3RpbGwgYmUgYSBsaW1pdDogdGhlIC50eXBlIGFyZ3VtZW50IGNhbiBub3QKLSAgICAgICAgICAgICBiZSBpbmZpbml0ZS4gICovCi0JICBhc193YXJuIChfKCJUaGUgdHlwZSBvZiAlcyBpcyB0b28gY29tcGxleDsgaXQgd2lsbCBiZSBzaW1wbGlmaWVkIiksCi0JCSAgIGNvZmZfc3ltX25hbWUpOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKElTUFRSICh2YWwpKQotCSotLXRxX3B0ciA9IHRxX1B0cjsKLSAgICAgIGVsc2UgaWYgKElTRkNOICh2YWwpKQotCSotLXRxX3B0ciA9IHRxX1Byb2M7Ci0gICAgICBlbHNlIGlmIChJU0FSWSAodmFsKSkKLQkqLS10cV9wdHIgPSB0cV9BcnJheTsKLSAgICAgIGVsc2UKLQlhc19mYXRhbCAoXygiVW5yZWNvZ25pemVkIC50eXBlIGFyZ3VtZW50IikpOwotCi0gICAgICB2YWwgPSBERUNSRUYgKHZhbCk7Ci0gICAgfQotCi0gIHRxX3NoZnQgPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1swXTsKLSAgd2hpbGUgKHRxX3B0ciAhPSAmY29mZl90eXBlLnR5cGVfcXVhbGlmaWVyc1tOX1RRXSkKLSAgICAqdHFfc2hmdCsrID0gKnRxX3B0cisrOwotCi0gIGlmICh0cV9zaGZ0ICE9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzWzBdICYmIHRxX3NoZnRbLTFdID09IHRxX1Byb2MpCi0gICAgewotICAgICAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uLCBpZ25vcmUgaXQsIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IHR3bwotCSBlbnRyaWVzIChvbmUgZnJvbSB0aGUgLmVudCwgYW5kIG9uZSBmb3IgdGhlIC5kZWYgdGhhdAotCSBwcmVjZWRlcyBpdCkuICBTYXZlIHRoZSB0eXBlIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGVuZAotCSBibG9jayBjYW4gcHJvcGVybHkgYWRkIGl0IGFmdGVyIHRoZSBiZWdpbiBibG9jayBpbmRleC4gIEZvcgotCSBNSVBTIGtub3dzIHdoYXQgcmVhc29uLCB3ZSBtdXN0IHN0cmlwIG9mZiB0aGUgZnVuY3Rpb24gdHlwZQotCSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgICAgIGNvZmZfaXNfZnVuY3Rpb24gPSAxOwotICAgICAgdHFfc2hmdFstMV0gPSB0cV9OaWw7Ci0gICAgfQotCi0gIHdoaWxlICh0cV9zaGZ0ICE9ICZjb2ZmX3R5cGUudHlwZV9xdWFsaWZpZXJzW05fVFFdKQotICAgICp0cV9zaGZ0KysgPSB0cV9OaWw7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAudGFnIGRpcmVjdGl2ZSwgd2hpY2ggZ2l2ZXMgdGhlIG5hbWUgb2YgYSBzdHJ1Y3R1cmUsCi0gICB1bmlvbiBvciBlbnVtLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3RhZyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBjaGFyIG5hbWVfZW5kOwotCi0gIGlmIChjb2ZmX3N5bV9uYW1lID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBjb2ZmX3RhZyA9IChjaGFyICopIHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSAoc3RybGVuIChuYW1lKSArIDEpKTsKLSAgc3RyY3B5IChjb2ZmX3RhZywgbmFtZSk7Ci0KLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IG5hbWVfZW5kOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnZhbCBkaXJlY3RpdmUsIHdoaWNoIGdpdmVzIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgSXQKLSAgIG1heSBiZSB0aGUgbmFtZSBvZiBhIHN0YXRpYyBvciBnbG9iYWwgc3ltYm9sLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3ZhbCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBleHByZXNzaW9uUyBleHA7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIudmFsIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQgJiYgZXhwLlhfb3AgIT0gT19zeW1ib2wpCi0gICAgewotICAgICAgYXNfYmFkIChfKCIudmFsIGV4cHJlc3Npb24gaXMgdG9vIGNvcG1sZXgiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLSAgICBjb2ZmX3ZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNvZmZfc3ltX3ZhbHVlID0gZXhwLlhfYWRkX3N5bWJvbDsKLSAgICAgIGNvZmZfc3ltX2FkZGVuZCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVuZGVmIGRpcmVjdGl2ZSwgd2hpY2ggdGVybWluYXRlcyBwcm9jZXNzaW5nIG9mIENPRkYKLSAgIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZW5kZWYgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgc3ltaW50X3QgaW5keDsKLSAgbG9jYWxzeW1fdCAqc3ltOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGNvZmZfc3ltX25hbWUgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kZWYgcHNldWRvLW9wIHVzZWQgYmVmb3JlIC5kZWY7IGlnbm9yZWQiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIG5hbWUgPSBjb2ZmX3N5bV9uYW1lOwotICBjb2ZmX3N5bV9uYW1lID0gKGNoYXIgKikgTlVMTDsKLQotICAvKiBJZiB0aGUgc3ltYm9sIGlzIGEgc3RhdGljIG9yIGV4dGVybmFsLCB3ZSBoYXZlIGFscmVhZHkgZ290dGVuIHRoZQotICAgICBhcHByb3ByaWF0ZSB0eXBlIGFuZCBjbGFzcywgc28gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJyaWRlIHRob3NlCi0gICAgIHZhbHVlcy4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgdHlwZSBhbmQgY2xhc3NlcwotICAgICB0aGF0IGFyZSBub3QgaW4gQ09GRiwgc3VjaCBhcyBzaG9ydCBkYXRhLCBldGMuICAqLwotICBpZiAoY29mZl9zeW1fdmFsdWUgIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICB7Ci0gICAgICBjb2ZmX3N5bWJvbF90eXAgPSBzdF9OaWw7Ci0gICAgICBjb2ZmX3N0b3JhZ2VfY2xhc3MgPSBzY19OaWw7Ci0gICAgfQotCi0gIGNvZmZfdHlwZS5leHRyYV9zaXplcyA9IGNvZmZfdGFnICE9IChjaGFyICopIE5VTEw7Ci0gIGlmIChjb2ZmX3R5cGUubnVtX2RpbXMgPiAwKQotICAgIHsKLSAgICAgIGludCBkaWZmID0gY29mZl90eXBlLm51bV9kaW1zIC0gY29mZl90eXBlLm51bV9zaXplczsKLSAgICAgIGludCBpID0gY29mZl90eXBlLm51bV9kaW1zIC0gMTsKLSAgICAgIGludCBqOwotCi0gICAgICBpZiAoY29mZl90eXBlLm51bV9zaXplcyAhPSAxIHx8IGRpZmYgPCAwKQotCXsKLQkgIGFzX3dhcm4gKF8oIkJhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvIikpOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgLyogSWYgdGhpcyBpcyBhbiBhcnJheSwgbWFrZSBzdXJlIHRoZSBzYW1lIG51bWJlciBvZiBkaW1lbnNpb25zCi0JIGFuZCBzaXplcyB3ZXJlIHBhc3NlZCwgY3JlYXRpbmcgZXh0cmEgc2l6ZXMgZm9yIG11bHRpcGx5Ci0JIGRpbWVuc2lvbmVkIGFycmF5cyBpZiBub3QgcGFzc2VkLiAgKi8KLSAgICAgIGNvZmZfdHlwZS5leHRyYV9zaXplcyA9IDA7Ci0gICAgICBpZiAoZGlmZikKLQl7Ci0JICBqID0gKHNpemVvZiAoY29mZl90eXBlLnNpemVzKSAvIHNpemVvZiAoY29mZl90eXBlLnNpemVzWzBdKSkgLSAxOwotCSAgd2hpbGUgKGogPj0gMCkKLQkgICAgewotCSAgICAgIGNvZmZfdHlwZS5zaXplc1tqXSA9ICgoKGogLSBkaWZmKSA+PSAwKQotCQkJCSAgICA/IGNvZmZfdHlwZS5zaXplc1tqIC0gZGlmZl0KLQkJCQkgICAgOiAwKTsKLQkgICAgICBqLS07Ci0JICAgIH0KLQotCSAgY29mZl90eXBlLm51bV9zaXplcyA9IGkgKyAxOwotCSAgZm9yIChpLS07IGkgPj0gMDsgaS0tKQotCSAgICBjb2ZmX3R5cGUuc2l6ZXNbaV0gPSAoY29mZl90eXBlLmRpbWVuc2lvbnNbaSArIDFdID09IDAKLQkJCQkgID8gMAotCQkJCSAgOiAoY29mZl90eXBlLnNpemVzW2kgKyAxXQotCQkJCSAgICAgLyBjb2ZmX3R5cGUuZGltZW5zaW9uc1tpICsgMV0pKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChjb2ZmX3N5bWJvbF90eXAgPT0gc3RfTWVtYmVyCi0JICAgJiYgY29mZl90eXBlLm51bV9zaXplcyAtIGNvZmZfdHlwZS5leHRyYV9zaXplcyA9PSAxKQotICAgIHsKLSAgICAgIC8qIElzIHRoaXMgYSBiaXRmaWVsZD8gIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IGEgc3RydWN0dXJlIG1lbWViZXIKLQkgaGF2aW5nIGEgc2l6ZSBmaWVsZCB0aGF0IGlzbid0IGFuIGFycmF5LiAgKi8KLSAgICAgIGNvZmZfdHlwZS5iaXRmaWVsZCA9IDE7Ci0gICAgfQotCi0gIC8qIEV4Y2VwdCBmb3IgZW51bWVyYXRpb24gbWVtYmVycyAmIGJlZ2luL2VuZGluZyBvZiBzY29wZXMsIHB1dCB0aGUKLSAgICAgdHlwZSB3b3JkIGluIHRoZSBhdXguIHN5bWJvbCB0YWJsZS4gICovCi0gIGlmIChjb2ZmX3N5bWJvbF90eXAgPT0gc3RfQmxvY2sgfHwgY29mZl9zeW1ib2xfdHlwID09IHN0X0VuZCkKLSAgICBpbmR4ID0gMDsKLSAgZWxzZSBpZiAoY29mZl9pbnNpZGVfZW51bWVyYXRpb24pCi0gICAgaW5keCA9IGN1cl9maWxlX3B0ci0+dm9pZF90eXBlOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGNvZmZfdHlwZS5iYXNpY190eXBlID09IGJ0X1N0cnVjdAotCSAgfHwgY29mZl90eXBlLmJhc2ljX3R5cGUgPT0gYnRfVW5pb24KLQkgIHx8IGNvZmZfdHlwZS5iYXNpY190eXBlID09IGJ0X0VudW0pCi0JewotCSAgaWYgKGNvZmZfdGFnID09IChjaGFyICopIE5VTEwpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJObyB0YWcgc3BlY2lmaWVkIGZvciAlcyIpLCBuYW1lKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQotCSAgY29mZl90eXBlLnRhZ19wdHIgPSBnZXRfdGFnIChjb2ZmX3RhZywgKGxvY2Fsc3ltX3QgKikgTlVMTCwKLQkJCQkgICAgICAgY29mZl90eXBlLmJhc2ljX3R5cGUpOwotCX0KLQotICAgICAgaWYgKGNvZmZfaXNfZnVuY3Rpb24pCi0JewotCSAgbGFzdF9mdW5jX3R5cGVfaW5mbyA9IGNvZmZfdHlwZTsKLQkgIGxhc3RfZnVuY19zeW1fdmFsdWUgPSBjb2ZmX3N5bV92YWx1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGluZHggPSBhZGRfYXV4X3N5bV90aXIgKCZjb2ZmX3R5cGUsCi0JCQkgICAgICBoYXNoX3llcywKLQkJCSAgICAgICZjdXJfZmlsZV9wdHItPnRoYXNoX2hlYWRbMF0pOwotICAgIH0KLQotICAvKiBEbyBhbnkgbGFzdCBtaW51dGUgYWRqdXN0bWVudHMgdGhhdCBhcmUgbmVjZXNzYXJ5LiAgKi8KLSAgc3dpdGNoIChjb2ZmX3N5bWJvbF90eXApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLQotICAgICAgLyogRm9yIHRoZSBiZWdpbm5pbmcgb2Ygc3RydWN0cywgdW5pb25zLCBhbmQgZW51bWVyYXRpb25zLCB0aGUKLQkgc2l6ZSBpbmZvIG5lZWRzIHRvIGJlIHBhc3NlZCBpbiB0aGUgdmFsdWUgZmllbGQuICAqLwotICAgIGNhc2Ugc3RfQmxvY2s6Ci0gICAgICBpZiAoY29mZl90eXBlLm51bV9zaXplcyAtIGNvZmZfdHlwZS5udW1fZGltcyAtIGNvZmZfdHlwZS5leHRyYV9zaXplcwotCSAgIT0gMSkKLQl7Ci0JICBhc193YXJuIChfKCJCYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCWNvZmZfdmFsdWUgPSBjb2ZmX3R5cGUuc2l6ZXNbMF07Ci0KLSAgICAgIGNvZmZfaW5zaWRlX2VudW1lcmF0aW9uID0gKGNvZmZfdHlwZS5vcmlnX3R5cGUgPT0gVF9FTlVNKTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBGb3IgdGhlIGVuZCBvZiBzdHJ1Y3RzLCB1bmlvbnMsIGFuZCBlbnVtZXJhdGlvbnMsIG9taXQgdGhlCi0JIG5hbWUgd2hpY2ggaXMgYWx3YXlzICIuZW9zIi4gIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBsYXN0LCBzbwotCSB0aGF0IGFueSBlcnJvciByZXBvcnRpbmcgYWJvdmUgZ2l2ZXMgdGhlIGNvcnJlY3QgbmFtZS4gICovCi0gICAgY2FzZSBzdF9FbmQ6Ci0gICAgICBmcmVlIChuYW1lKTsKLSAgICAgIG5hbWUgPSAoY2hhciAqKSBOVUxMOwotICAgICAgY29mZl92YWx1ZSA9IDA7Ci0gICAgICBjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbiA9IDA7Ci0gICAgICBicmVhazsKLQotICAgICAgLyogTWVtYmVycyBvZiBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgdGhhdCBhcmVuJ3QgYml0ZmllbGRzLCBuZWVkCi0JIHRvIGFkanVzdCB0aGUgdmFsdWUgZnJvbSBhIGJ5dGUgb2Zmc2V0IHRvIGEgYml0IG9mZnNldC4KLQkgTWVtYmVycyBvZiBlbnVtZXJhdGlvbnMgZG8gbm90IGhhdmUgdGhlIHZhbHVlIGFkanVzdGVkLCBhbmQKLQkgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgYnkgaW5keCA9PSBpbmRleE5pbC4gIEZvciBlbnVtZXJhdGlvbnMsCi0JIHVwZGF0ZSB0aGUgbWF4aW11bSBlbnVtZXJhdGlvbiB2YWx1ZS4gICovCi0gICAgY2FzZSBzdF9NZW1iZXI6Ci0gICAgICBpZiAoISBjb2ZmX3R5cGUuYml0ZmllbGQgJiYgISBjb2ZmX2luc2lkZV9lbnVtZXJhdGlvbikKLQljb2ZmX3ZhbHVlICo9IDg7Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBBZGQgdGhlIHN5bWJvbC4gICovCi0gIHN5bSA9IGFkZF9lY29mZl9zeW1ib2wgKG5hbWUsCi0JCQkgIGNvZmZfc3ltYm9sX3R5cCwKLQkJCSAgY29mZl9zdG9yYWdlX2NsYXNzLAotCQkJICBjb2ZmX3N5bV92YWx1ZSwKLQkJCSAgY29mZl9zeW1fYWRkZW5kLAotCQkJICAoc3ltaW50X3QpIGNvZmZfdmFsdWUsCi0JCQkgIGluZHgpOwotCi0gIC8qIGRlYWwgd2l0aCBzdHJ1Y3QsIHVuaW9uLCBhbmQgZW51bSB0YWdzLiAgKi8KLSAgaWYgKGNvZmZfc3ltYm9sX3R5cCA9PSBzdF9CbG9jaykKLSAgICB7Ci0gICAgICAvKiBDcmVhdGUgb3IgdXBkYXRlIHRoZSB0YWcgaW5mb3JtYXRpb24uICAqLwotICAgICAgdGFnX3QgKnRhZ19wdHIgPSBnZXRfdGFnIChuYW1lLAotCQkJCXN5bSwKLQkJCQljb2ZmX3R5cGUuYmFzaWNfdHlwZSk7Ci0gICAgICBmb3J3YXJkX3QgKipwZjsKLQotICAgICAgLyogUmVtZW1iZXIgYW55IGZvcndhcmQgcmVmZXJlbmNlcy4gICovCi0gICAgICBmb3IgKHBmID0gJnN5bS0+Zm9yd2FyZF9yZWY7Ci0JICAgKnBmICE9IChmb3J3YXJkX3QgKikgTlVMTDsKLQkgICBwZiA9ICYoKnBmKS0+bmV4dCkKLQk7Ci0gICAgICAqcGYgPSB0YWdfcHRyLT5mb3J3YXJkX3JlZjsKLSAgICAgIHRhZ19wdHItPmZvcndhcmRfcmVmID0gKGZvcndhcmRfdCAqKSBOVUxMOwotICAgIH0KLX0KLQwKLS8qIFBhcnNlIC5lbmQgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9lbmQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLSAgcmVnaXN0ZXIgaW50IGNoOwotICBzeW1ib2xTICplbnQ7Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBjaCA9ICpuYW1lOwotICBpZiAoISBpc19uYW1lX2JlZ2lubmVyIChjaCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgdmFsdWUgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIC5lbmQgZGlyZWN0aXZlIGFuZCB0aGUKLSAgICAgY29ycmVzcG9uZGluZyBzeW1ib2wuICBXZSBjcmVhdGUgYSBmYWtlIHN5bWJvbCB0byBob2xkIHRoZQotICAgICBjdXJyZW50IGxvY2F0aW9uLCBhbmQgcHV0IGluIHRoZSBvZmZzZXQgd2hlbiB3ZSB3cml0ZSBvdXQgdGhlCi0gICAgIHN5bWJvbC4gICovCi0gIGVudCA9IHN5bWJvbF9maW5kIChuYW1lKTsKLSAgaWYgKGVudCA9PSAoc3ltYm9sUyAqKSBOVUxMKQotICAgIGFzX3dhcm4gKF8oIi5lbmQgZGlyZWN0aXZlIG5hbWVzIHVua25vd24gc3ltYm9sIikpOwotICBlbHNlCi0gICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X0VuZCwgc2NfVGV4dCwKLQkJCSAgICAgc3ltYm9sX25ldyAoIkwwXDAwMSIsIG5vd19zZWcsCi0JCQkJCSAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSBmcmFnX25vdyksCi0JCQkgICAgIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIDAsIChzeW1pbnRfdCkgMCk7Ci0KLSAgY3VyX3Byb2NfcHRyID0gKHByb2NfdCAqKSBOVUxMOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5lbnQgZGlyZWN0aXZlcy4gICovCi0KLXZvaWQKLWVjb2ZmX2RpcmVjdGl2ZV9lbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBuYW1lX2VuZDsKLSAgcmVnaXN0ZXIgaW50IGNoOwotCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLQotICBpZiAoY3VyX3Byb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJzZWNvbmQgLmVudCBkaXJlY3RpdmUgZm91bmQgYmVmb3JlIC5lbmQgZGlyZWN0aXZlIikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgbmFtZV9lbmQgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLQotICBjaCA9ICpuYW1lOwotICBpZiAoISBpc19uYW1lX2JlZ2lubmVyIChjaCkpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmVudCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiKSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhZGRfcHJvY2VkdXJlIChuYW1lKTsKLQotICAqaW5wdXRfbGluZV9wb2ludGVyID0gbmFtZV9lbmQ7Ci0KLSAgLyogVGhlIC5lbnQgZGlyZWN0aXZlIGlzIHNvbWV0aW1lcyBmb2xsb3dlZCBieSBhIG51bWJlci4gIEknbSBub3QKLSAgICAgcmVhbGx5IHN1cmUgd2hhdCB0aGUgbnVtYmVyIG1lYW5zLiAgSSBkb24ndCBzZWUgYW55IHdheSB0byBzdG9yZQotICAgICB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIFBEUi4gIFRoZSBJcml4IDQgYXNzZW1ibGVyIHNlZW1zIHRvIGlnbm9yZQotICAgICB0aGUgaW5mb3JtYXRpb24uICAqLwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICB9Ci0gIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICAgIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJy0nKQotICAgICh2b2lkKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmV4dGVybiBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2V4dGVybiAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBjaGFyICpuYW1lOwotICBpbnQgYzsKLSAgc3ltYm9sUyAqc3ltYm9scDsKLSAgdmFsdWVUIHNpemU7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBzeW1ib2xwID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xwKTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIHNpemUgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBzeW1ib2xfZ2V0X29iaiAoc3ltYm9scCktPmVjb2ZmX2V4dGVybl9zaXplID0gc2l6ZTsKLX0KLQwKLS8qIFBhcnNlIC5maWxlIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZmlsZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpbnQgaW5keDsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGxlbjsKLQotICBpZiAoY3VyX3Byb2NfcHRyICE9IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJObyB3YXkgdG8gaGFuZGxlIC5maWxlIHdpdGhpbiAuZW50Ly5lbmQgc2VjdGlvbiIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGluZHggPSAoaW50KSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAvKiBGSVhNRTogd2UgZG9uJ3QgaGF2ZSB0byBzYXZlIHRoZSBuYW1lIGhlcmUuICAqLwotICBuYW1lID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotCi0gIGFkZF9maWxlIChuYW1lLCBpbmR4IC0gMSwgMCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQwKLS8qIFBhcnNlIC5mbWFzayBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2ZtYXNrIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGxvbmcgdmFsOwotCi0gIGlmIChjdXJfcHJvY19wdHIgPT0gKHByb2NfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5mbWFzayBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIpKTsKLSAgICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY3VyX3Byb2NfcHRyLT5wZHIuZnJlZ21hc2sgPSB2YWw7Ci0gIGN1cl9wcm9jX3B0ci0+cGRyLmZyZWdvZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmZyYW1lIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfZnJhbWUgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgbG9uZyB2YWw7Ci0KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmZyYW1lIG91dHNpZGUgb2YgLmVudCIpKTsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmZyYW1lcmVnID0gdGNfZ2V0X3JlZ2lzdGVyICgxKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyKysgIT0gJywnCi0gICAgICB8fCBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbl9hbmRfdGVybWluYXRvciAoJnZhbCkgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIkJhZCAuZnJhbWUgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5mcmFtZW9mZnNldCA9IHZhbDsKLQotICBjdXJfcHJvY19wdHItPnBkci5wY3JlZyA9IHRjX2dldF9yZWdpc3RlciAoMCk7Ci0KLSNpZiAwIC8qIEFscGhhLU9TRjEgYWRkcyAidGhlIG9mZnNldCBvZiBzYXZlZCAkYTAgZnJvbSAkc3AiLCBhY2NvcmRpbmcKLQkgdG8gU2FuZHJvLiAgSSBkb24ndCB5ZXQga25vdyB3aGVyZSB0aGlzIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQsIGlmCi0JIGFueXdoZXJlLiAgKi8KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSNlbHNlCi0gIHNfaWdub3JlICg0Mik7Ci0jZW5kaWYKLX0KLQwKLS8qIFBhcnNlIC5tYXNrIGRpcmVjdGl2ZXMuICAqLwotCi12b2lkCi1lY29mZl9kaXJlY3RpdmVfbWFzayAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsb25nIHZhbDsKLQotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIubWFzayBvdXRzaWRlIG9mIC5lbnQiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZ2YWwpICE9ICcsJykKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCYWQgLm1hc2sgZGlyZWN0aXZlIikpOwotICAgICAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5yZWdtYXNrID0gdmFsOwotICBjdXJfcHJvY19wdHItPnBkci5yZWdvZmZzZXQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyogUGFyc2UgLmxvYyBkaXJlY3RpdmVzLiAgKi8KLQotdm9pZAotZWNvZmZfZGlyZWN0aXZlX2xvYyAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBsaW5lbm9fbGlzdF90ICpsaXN0OwotICBzeW1pbnRfdCBsaW5lbm87Ci0KLSAgaWYgKGN1cl9maWxlX3B0ciA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxvYyBiZWZvcmUgLmZpbGUiKSk7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAobm93X3NlZyAhPSB0ZXh0X3NlY3Rpb24pCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLmxvYyBvdXRzaWRlIG9mIC50ZXh0IikpOwotICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogU2tpcCB0aGUgZmlsZSBudW1iZXIuICAqLwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbGluZW5vID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3NvdXJjZV9saW5lIChsaW5lbm8pOwotI2VuZGlmCi0KLSAgLyogSWYgd2UncmUgYnVpbGRpbmcgc3RhYnMsIHRoZW4gb3V0cHV0IGEgc3BlY2lhbCBsYWJlbCByYXRoZXIgdGhhbgotICAgICBFQ09GRiBsaW5lIG51bWJlciBpbmZvLiAgKi8KLSAgaWYgKHN0YWJzX3NlZW4pCi0gICAgewotICAgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKChjaGFyICopIE5VTEwsIHN0X0xhYmVsLCBzY19UZXh0LAotCQkJICAgICAgIHN5bWJvbF9uZXcgKCJMMFwwMDEiLCBub3dfc2VnLAotCQkJCQkgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSAgIGZyYWdfbm93KSwKLQkJCSAgICAgICAoYmZkX3ZtYSkgMCwgMCwgbGluZW5vKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgbGlzdCA9IGFsbG9jYXRlX2xpbmVub19saXN0ICgpOwotCi0gIGxpc3QtPm5leHQgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICBsaXN0LT5maWxlID0gY3VyX2ZpbGVfcHRyOwotICBsaXN0LT5wcm9jID0gY3VyX3Byb2NfcHRyOwotICBsaXN0LT5mcmFnID0gZnJhZ19ub3c7Ci0gIGxpc3QtPnBhZGRyID0gZnJhZ19ub3dfZml4ICgpOwotICBsaXN0LT5saW5lbm8gPSBsaW5lbm87Ci0KLSAgLyogV2UgZG9uJ3Qgd2FudCB0byBtZXJnZSBmaWxlcyB3aGljaCBoYXZlIGxpbmUgbnVtYmVycy4gICovCi0gIGN1cl9maWxlX3B0ci0+ZmRyLmZNZXJnZSA9IDA7Ci0KLSAgLyogQSAubG9jIGRpcmVjdGl2ZSB3aWxsIHNvbWV0aW1lcyBhcHBlYXIgYmVmb3JlIGEgLmVudCBkaXJlY3RpdmUsCi0gICAgIHdoaWNoIG1lYW5zIHRoYXQgY3VyX3Byb2NfcHRyIHdpbGwgYmUgTlVMTCBoZXJlLiAgQXJyYW5nZSB0bwotICAgICBwYXRjaCB0aGlzIHVwLiAgKi8KLSAgaWYgKGN1cl9wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwpCi0gICAgewotICAgICAgbGluZW5vX2xpc3RfdCAqKnBsOwotCi0gICAgICBwbCA9ICZub3Byb2NfbGluZW5vOwotICAgICAgd2hpbGUgKCpwbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotCXBsID0gJigqcGwpLT5uZXh0OwotICAgICAgKnBsID0gbGlzdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0X2xpbmVubyA9IGxpc3Q7Ci0gICAgICAqbGFzdF9saW5lbm9fcHRyID0gbGlzdDsKLSAgICAgIGxhc3RfbGluZW5vX3B0ciA9ICZsaXN0LT5uZXh0OwotICAgIH0KLX0KLQotLyogVGhlIE1JUFMgYXNzZW1ibGVyIHNvbWV0aW1lcyBpbnNlcnRzIG5vcCBpbnN0cnVjdGlvbnMgaW4gdGhlCi0gICBpbnN0cnVjdGlvbiBzdHJlYW0uICBXaGVuIHRoaXMgaGFwcGVucywgd2UgbXVzdCBwYXRjaCB1cCB0aGUgLmxvYwotICAgaW5mb3JtYXRpb24gc28gdGhhdCBpdCBwb2ludHMgdG8gdGhlIGluc3RydWN0aW9uIGFmdGVyIHRoZSBub3AuICAqLwotCi12b2lkCi1lY29mZl9maXhfbG9jIChvbGRfZnJhZywgb2xkX2ZyYWdfb2Zmc2V0KQotICAgICBmcmFnUyAqb2xkX2ZyYWc7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2xkX2ZyYWdfb2Zmc2V0OwotewotICBpZiAobGFzdF9saW5lbm8gIT0gTlVMTAotICAgICAgJiYgbGFzdF9saW5lbm8tPmZyYWcgPT0gb2xkX2ZyYWcKLSAgICAgICYmIGxhc3RfbGluZW5vLT5wYWRkciA9PSBvbGRfZnJhZ19vZmZzZXQpCi0gICAgewotICAgICAgbGFzdF9saW5lbm8tPmZyYWcgPSBmcmFnX25vdzsKLSAgICAgIGxhc3RfbGluZW5vLT5wYWRkciA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgICB9Ci19Ci0MCi0vKiBNYWtlIHN1cmUgdGhlIEBzdGFicyBzeW1ib2wgaXMgZW1pdHRlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1tYXJrX3N0YWJzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmICghIHN0YWJzX3NlZW4pCi0gICAgewotICAgICAgLyogQWRkIGEgZHVtbXkgQHN0YWJzIGR5bWJvbC4gKi8KLSAgICAgIHN0YWJzX3NlZW4gPSAxOwotICAgICAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKHN0YWJzX3N5bWJvbCwgc3ROaWwsIHNjSW5mbywKLQkJCSAgICAgICAoc3ltYm9sUyAqKSBOVUxMLAotCQkJICAgICAgIChiZmRfdm1hKSAwLCAoc3ltaW50X3QpIC0xLAotCQkJICAgICAgIEVDT0ZGX01BUktfU1RBQiAoMCkpOwotICAgIH0KLX0KLQwKLS8qIFBhcnNlIC53ZWFrZXh0IGRpcmVjdGl2ZXMuICAqLwotI2lmbmRlZiBUQ19NSVBTCi0vKiBGb3IgVENfTUlQUyB1c2UgdGhlIHZlcnNpb24gaW4gdGMtbWlwcy5jLiAqLwotdm9pZAotZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSkKLQl7Ci0JICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JCSAgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCXsKLQkgIGV4cHJlc3Npb24gKCZleHApOwotCSAgaWYgKGV4cC5YX29wICE9IE9fc3ltYm9sKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJiYWQgLndlYWtleHQgZGlyZWN0aXZlIikpOwotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltYm9sUCwgJmV4cCk7Ci0JfQotICAgIH0KLQotICBTX1NFVF9XRUFLIChzeW1ib2xQKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotI2VuZGlmIC8qIG5vdCBUQ19NSVBTICovCi0MCi0vKiBIYW5kbGUgLnN0YWJzIGRpcmVjdGl2ZXMuICBUaGUgYWN0dWFsIHBhcnNpbmcgcm91dGluZSBpcyBkb25lIGJ5IGEKLSAgIGdlbmVyaWMgcm91dGluZS4gIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdmlhIE9CSl9QUk9DRVNTX1NUQUIuCi0gICBXaGVuIHRoaXMgaXMgY2FsbGVkLCBpbnB1dF9saW5lX3BvaW50ZXIgd2lsbCBiZSBwb2ludGluZyBhdCB0aGUKLSAgIHZhbHVlIGZpZWxkIG9mIHRoZSBzdGFiLgotCi0gICAuc3RhYnMgZGlyZWN0aXZlcyBoYXZlIGZpdmUgZmllbGRzOgotCSJzdHJpbmciCWEgc3RyaW5nLCBlbmNvZGluZyB0aGUgdHlwZSBpbmZvcm1hdGlvbi4KLQljb2RlCQlhIG51bWVyaWMgY29kZSwgZGVmaW5lZCBpbiA8c3RhYi5oPgotCTAJCWEgemVybwotCWRlc2MJCWEgemVybyBvciBsaW5lIG51bWJlcgotCXZhbHVlCQlhIG51bWVyaWMgdmFsdWUgb3IgYW4gYWRkcmVzcy4KLQotICAgIElmIHRoZSB2YWx1ZSBpcyByZWxvY2F0YWJsZSwgd2UgdHJhbnNmb3JtIHRoaXMgaW50bzoKLQlpc3MJCXBvaW50cyBhcyBhbiBpbmRleCBpbnRvIHN0cmluZyBzcGFjZQotCXZhbHVlCQl2YWx1ZSBmcm9tIGxvb2t1cCBvZiB0aGUgbmFtZQotCXN0CQlzdCBmcm9tIGxvb2t1cCBvZiB0aGUgbmFtZQotCXNjCQlzYyBmcm9tIGxvb2t1cCBvZiB0aGUgbmFtZQotCWluZGV4CQljb2RlfENPREVfTUFTSwotCi0gICAgSWYgdGhlIHZhbHVlIGlzIG5vdCByZWxvY2F0YWJsZSwgd2UgdHJhbnNmb3JtIHRoaXMgaW50bzoKLQlpc3MJCXBvaW50cyBhcyBhbiBpbmRleCBpbnRvIHN0cmluZyBzcGFjZQotCXZhbHVlCQl2YWx1ZQotCXN0CQlzdF9OaWwKLQlzYwkJc2NfTmlsCi0JaW5kZXgJCWNvZGV8Q09ERV9NQVNLCi0KLSAgICAuc3RhYm4gZGlyZWN0aXZlcyBoYXZlIGZvdXIgZmllbGRzIChzdHJpbmcgaXMgbnVsbCk6Ci0JY29kZQkJYSBudW1lcmljIGNvZGUsIGRlZmluZWQgaW4gPHN0YWIuaD4KLQkwCQlhIHplcm8KLQlkZXNjCQlhIHplcm8gb3IgYSBsaW5lIG51bWJlcgotCXZhbHVlCQlhIG51bWVyaWMgdmFsdWUgb3IgYW4gYWRkcmVzcy4gICovCi0KLXZvaWQKLWVjb2ZmX3N0YWIgKHNlYywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYykKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGludCB3aGF0OwotICAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgIGludCB0eXBlOwotICAgICBpbnQgb3RoZXI7Ci0gICAgIGludCBkZXNjOwotewotICBlZmRyX3QgKnNhdmVfZmlsZV9wdHIgPSBjdXJfZmlsZV9wdHI7Ci0gIHN5bWJvbFMgKnN5bTsKLSAgc3ltaW50X3QgdmFsdWU7Ci0gIGJmZF92bWEgYWRkZW5kOwotICBzdF90IHN0OwotICBzY190IHNjOwotICBzeW1pbnRfdCBpbmR4OwotICBsb2NhbHN5bV90ICpob2xkID0gTlVMTDsKLQotICBlY29mZl9kZWJ1Z2dpbmdfc2VlbiA9IDE7Ci0KLSAgLyogV2UgZG9uJ3QgaGFuZGxlIC5zdGFiZC4gICovCi0gIGlmICh3aGF0ICE9ICdzJyAmJiB3aGF0ICE9ICduJykKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIi5zdGFiJWMgaXMgbm90IHN1cHBvcnRlZCIpLCB3aGF0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogQSAuc3RhYm4gdXNlcyBhIG51bGwgbmFtZSwgbm90IGFuIGVtcHR5IHN0cmluZy4gICovCi0gIGlmICh3aGF0ID09ICduJykKLSAgICBzdHJpbmcgPSBOVUxMOwotCi0gIC8qIFdlIGlnbm9yZSB0aGUgb3RoZXIgZmllbGQuICAqLwotICBpZiAob3RoZXIgIT0gMCkKLSAgICBhc193YXJuIChfKCIuc3RhYiVjOiBpZ25vcmluZyBub24temVybyBvdGhlciBmaWVsZCIpLCB3aGF0KTsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGN1cnJlbnQgZmlsZS4gICovCi0gIGlmIChjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMKQotICAgIHsKLSAgICAgIGFkZF9maWxlICgoY29uc3QgY2hhciAqKSBOVUxMLCAwLCAxKTsKLSAgICAgIHNhdmVfZmlsZV9wdHIgPSBjdXJfZmlsZV9wdHI7Ci0gICAgfQotCi0gIC8qIEZvciBzdGFicyBpbiBFQ09GRiwgdGhlIGZpcnN0IHN5bWJvbCBtdXN0IGJlIEBzdGFicy4gIFRoaXMgaXMgYQotICAgICBzaWduYWwgdG8gZ2RiLiAgKi8KLSAgaWYgKHN0YWJzX3NlZW4gPT0gMCkKLSAgICBtYXJrX3N0YWJzICgwKTsKLQotICAvKiBMaW5lIG51bWJlciBzdGFicyBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgc2luY2UgdGhleSBoYXZlIHR3bwotICAgICB2YWx1ZXMsIHRoZSBsaW5lIG51bWJlciBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlIGxhYmVsLiAgV2UgdXNlIHRoZQotICAgICBpbmRleCBmaWVsZCAoYWthIGRlc2MpIHRvIGhvbGQgdGhlIGxpbmUgbnVtYmVyLCBhbmQgdGhlIHZhbHVlCi0gICAgIGZpZWxkIHRvIGhvbGQgdGhlIGFkZHJlc3MuICBUaGUgc3ltYm9sIHR5cGUgaXMgc3RfTGFiZWwsIHdoaWNoCi0gICAgIHNob3VsZCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXIgc3RhYnMsIHNvIHRoYXQgZ2RiIGNhbgotICAgICByZWNvZ25pemUgaXQuICAqLwotICBpZiAodHlwZSA9PSBOX1NMSU5FKQotICAgIHsKLSAgICAgIFNZTVIgZHVtbXlfc3ltcjsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIG5hbWVfZW5kOwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIGlmIChsaXN0aW5nKQotCWxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGRlc2MpOwotI2VuZGlmCi0KLSAgICAgIGR1bW15X3N5bXIuaW5kZXggPSBkZXNjOwotICAgICAgaWYgKGR1bW15X3N5bXIuaW5kZXggIT0gZGVzYykKLQl7Ci0JICBhc193YXJuIChfKCJMaW5lIG51bWJlciAoJWQpIGZvciAuc3RhYiVjIGRpcmVjdGl2ZSBjYW5ub3QgZml0IGluIGluZGV4IGZpZWxkICgyMCBiaXRzKSIpLAotCQkgICBkZXNjLCB3aGF0KTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBuYW1lX2VuZCA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0gICAgICBzeW0gPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBuYW1lX2VuZDsKLQotICAgICAgdmFsdWUgPSAwOwotICAgICAgYWRkZW5kID0gMDsKLSAgICAgIHN0ID0gc3RfTGFiZWw7Ci0gICAgICBzYyA9IHNjX1RleHQ7Ci0gICAgICBpbmR4ID0gZGVzYzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIGlmIChsaXN0aW5nICYmICh0eXBlID09IE5fU08gfHwgdHlwZSA9PSBOX1NPTCkpCi0JbGlzdGluZ19zb3VyY2VfZmlsZSAoc3RyaW5nKTsKLSNlbmRpZgotCi0gICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpCi0JICB8fCAqaW5wdXRfbGluZV9wb2ludGVyID09ICctJwotCSAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnKycpCi0JewotCSAgc3QgPSBzdF9OaWw7Ci0JICBzYyA9IHNjX05pbDsKLQkgIHN5bSA9IChzeW1ib2xTICopIE5VTEw7Ci0JICB2YWx1ZSA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCSAgYWRkZW5kID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmICghIGlzX25hbWVfYmVnaW5uZXIgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICBhc193YXJuIChfKCJJbGxlZ2FsIC5zdGFiJWMgZGlyZWN0aXZlLCBiYWQgY2hhcmFjdGVyIiksIHdoYXQpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBleHByZXNzaW9uUyBleHA7Ci0KLQkgIHNjID0gc2NfTmlsOwotCSAgc3QgPSBzdF9OaWw7Ci0KLQkgIGV4cHJlc3Npb24gKCZleHApOwotCSAgaWYgKGV4cC5YX29wID09IE9fY29uc3RhbnQpCi0JICAgIHsKLQkgICAgICBzeW0gPSBOVUxMOwotCSAgICAgIHZhbHVlID0gZXhwLlhfYWRkX251bWJlcjsKLQkgICAgICBhZGRlbmQgPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbCkKLQkgICAgewotCSAgICAgIHN5bSA9IGV4cC5YX2FkZF9zeW1ib2w7Ci0JICAgICAgdmFsdWUgPSAwOwotCSAgICAgIGFkZGVuZCA9IGV4cC5YX2FkZF9udW1iZXI7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bSA9IG1ha2VfZXhwcl9zeW1ib2wgKCZleHApOwotCSAgICAgIHZhbHVlID0gMDsKLQkgICAgICBhZGRlbmQgPSAwOwotCSAgICB9Ci0JfQotCi0gICAgICBpbmR4ID0gRUNPRkZfTUFSS19TVEFCICh0eXBlKTsKLSAgICB9Ci0KLSAgLyogRG9uJ3Qgc3RvcmUgdGhlIHN0YWJzIHN5bWJvbCB3ZSBhcmUgY3JlYXRpbmcgYXMgdGhlIHR5cGUgb2YgdGhlCi0gICAgIEVDT0ZGIHN5bWJvbC4gIFdlIHdhbnQgdG8gY29tcHV0ZSB0aGUgdHlwZSBvZiB0aGUgRUNPRkYgc3ltYm9sCi0gICAgIGluZGVwZW5kZW50bHkuICAqLwotICBpZiAoc3ltICE9IChzeW1ib2xTICopIE5VTEwpCi0gICAgaG9sZCA9IHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2w7Ci0KLSAgKHZvaWQpIGFkZF9lY29mZl9zeW1ib2wgKHN0cmluZywgc3QsIHNjLCBzeW0sIGFkZGVuZCwgdmFsdWUsIGluZHgpOwotCi0gIGlmIChzeW0gIT0gKHN5bWJvbFMgKikgTlVMTCkKLSAgICBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sID0gaG9sZDsKLQotICAvKiBSZXN0b3JlIG5vcm1hbCBmaWxlIHR5cGUuICAqLwotICBjdXJfZmlsZV9wdHIgPSBzYXZlX2ZpbGVfcHRyOwotfQotDAotLyogRnJvYiBhbiBFQ09GRiBzeW1ib2wuICBTbWFsbCBjb21tb24gc3ltYm9scyBnbyBpbnRvIGEgc3BlY2lhbAotICAgLnNjb21tb24gc2VjdGlvbiByYXRoZXIgdGhhbiBiZmRfY29tX3NlY3Rpb24uICAqLwotCi12b2lkCi1lY29mZl9mcm9iX3N5bWJvbCAoc3ltKQotICAgICBzeW1ib2xTICpzeW07Ci17Ci0gIGlmIChTX0lTX0NPTU1PTiAoc3ltKQotICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bSkgPiAwCi0gICAgICAmJiBTX0dFVF9WQUxVRSAoc3ltKSA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCi0gICAgewotICAgICAgc3RhdGljIGFzZWN0aW9uIHNjb21fc2VjdGlvbjsKLSAgICAgIHN0YXRpYyBhc3ltYm9sIHNjb21fc3ltYm9sOwotCi0gICAgICAvKiBXZSBtdXN0IGNvbnN0cnVjdCBhIGZha2Ugc2VjdGlvbiBzaW1pbGFyIHRvIGJmZF9jb21fc2VjdGlvbgotCSBidXQgd2l0aCB0aGUgbmFtZSAuc2NvbW1vbi4gICovCi0gICAgICBpZiAoc2NvbV9zZWN0aW9uLm5hbWUgPT0gTlVMTCkKLQl7Ci0JICBzY29tX3NlY3Rpb24gPSBiZmRfY29tX3NlY3Rpb247Ci0JICBzY29tX3NlY3Rpb24ubmFtZSA9ICIuc2NvbW1vbiI7Ci0JICBzY29tX3NlY3Rpb24ub3V0cHV0X3NlY3Rpb24gPSAmc2NvbV9zZWN0aW9uOwotCSAgc2NvbV9zZWN0aW9uLnN5bWJvbCA9ICZzY29tX3N5bWJvbDsKLQkgIHNjb21fc2VjdGlvbi5zeW1ib2xfcHRyX3B0ciA9ICZzY29tX3NlY3Rpb24uc3ltYm9sOwotCSAgc2NvbV9zeW1ib2wgPSAqYmZkX2NvbV9zZWN0aW9uLnN5bWJvbDsKLQkgIHNjb21fc3ltYm9sLm5hbWUgPSAiLnNjb21tb24iOwotCSAgc2NvbV9zeW1ib2wuc2VjdGlvbiA9ICZzY29tX3NlY3Rpb247Ci0JfQotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltLCAmc2NvbV9zZWN0aW9uKTsKLSAgICB9Ci0KLSAgLyogRG91YmxlIGNoZWNrIHdlYWsgc3ltYm9scy4gICovCi0gIGlmIChTX0lTX1dFQUsgKHN5bSkpCi0gICAgewotICAgICAgaWYgKFNfSVNfQ09NTU9OIChzeW0pKQotCWFzX2JhZCAoXygiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIpLAotCQlTX0dFVF9OQU1FIChzeW0pKTsKLSAgICB9Ci19Ci0MCi0vKiBBZGQgYnl0ZXMgdG8gdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGJ1ZmZlci4gICovCi0KLXN0YXRpYyBjaGFyICoKLWVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIGJ1ZnB0ciwgbmVlZCkKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgY2hhciAqYnVmcHRyOwotICAgICB1bnNpZ25lZCBsb25nIG5lZWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgYXQ7Ci0gIHVuc2lnbmVkIGxvbmcgd2FudDsKLQotICBhdCA9IGJ1ZnB0ciAtICpidWY7Ci0gIG5lZWQgLT0gKmJ1ZmVuZCAtIGJ1ZnB0cjsKLSAgaWYgKG5lZWQgPCBQQUdFX1NJWkUpCi0gICAgbmVlZCA9IFBBR0VfU0laRTsKLSAgd2FudCA9ICgqYnVmZW5kIC0gKmJ1ZikgKyBuZWVkOwotICAqYnVmID0geHJlYWxsb2MgKCpidWYsIHdhbnQpOwotICAqYnVmZW5kID0gKmJ1ZiArIHdhbnQ7Ci0gIHJldHVybiAqYnVmICsgYXQ7Ci19Ci0KLS8qIEFkanVzdCB0aGUgc3ltYm9saWMgaW5mb3JtYXRpb24gYnVmZmVyIHRvIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQKLSAgIGZvciB0aGUgRUNPRkYgdGFyZ2V0IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCwgYnVmcHRycHRyKQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0gICAgIGNoYXIgKipidWZwdHJwdHI7Ci17Ci0gIGJmZF9zaXplX3R5cGUgYWxpZ247Ci0KLSAgYWxpZ24gPSBiYWNrZW5kLT5kZWJ1Z19hbGlnbjsKLSAgaWYgKChvZmZzZXQgJiAoYWxpZ24gLSAxKSkgIT0gMCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGFkZDsKLQotICAgICAgYWRkID0gYWxpZ24gLSAob2Zmc2V0ICYgKGFsaWduIC0gMSkpOwotICAgICAgaWYgKCpidWZlbmQgLSAoKmJ1ZiArIG9mZnNldCkgPCBhZGQpCi0JKHZvaWQpIGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsICpidWYgKyBvZmZzZXQsIGFkZCk7Ci0gICAgICBtZW1zZXQgKCpidWYgKyBvZmZzZXQsIDAsIGFkZCk7Ci0gICAgICBvZmZzZXQgKz0gYWRkOwotICAgICAgaWYgKGJ1ZnB0cnB0ciAhPSAoY2hhciAqKikgTlVMTCkKLQkqYnVmcHRycHRyID0gKmJ1ZiArIG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIG9mZnNldDsKLX0KLQotLyogQnVpbGQgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2xpbmVubyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCwgbGluZWNudHB0cikKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotICAgICBsb25nICpsaW5lY250cHRyOwotewotICBjaGFyICpidWZwdHI7Ci0gIHJlZ2lzdGVyIGxpbmVub19saXN0X3QgKmw7Ci0gIGxpbmVub19saXN0X3QgKmxhc3Q7Ci0gIGVmZHJfdCAqZmlsZTsKLSAgcHJvY190ICpwcm9jOwotICB1bnNpZ25lZCBsb25nIGM7Ci0gIGxvbmcgaWxpbmU7Ci0gIGxvbmcgdG90Y291bnQ7Ci0gIGxpbmVub19saXN0X3QgZmlyc3Q7Ci0gIGxpbmVub19saXN0X3QgKmxvY2FsX2ZpcnN0X2xpbmVubyA9IGZpcnN0X2xpbmVubzsKLQotICBpZiAobGluZWNudHB0ciAhPSAobG9uZyAqKSBOVUxMKQotICAgICpsaW5lY250cHRyID0gMDsKLQotICBidWZwdHIgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGZpbGUgPSAoZWZkcl90ICopIE5VTEw7Ci0gIHByb2MgPSAocHJvY190ICopIE5VTEw7Ci0gIGxhc3QgPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOwotICBjID0gb2Zmc2V0OwotICBpbGluZSA9IDA7Ci0gIHRvdGNvdW50ID0gMDsKLQotICAvKiBGb3Igc29tZSByZWFzb24gdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHByb2NlZHVyZSBpcyBpZ25vcmVkCi0gICAgIHdoZW4gcmVhZGluZyBsaW5lIG51bWJlcnMuICBUaGlzIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSBhZGRyZXNzIG9mCi0gICAgIHRoZSBmaXJzdCBwcm9jZWR1cmUgaXMgMCwgYnV0IHdoZW4gZ2NjIGlzIGdlbmVyYXRpbmcgTUlQUwotICAgICBlbWJlZGRlZCBQSUMgY29kZSwgaXQgd2lsbCBwdXQgc3RyaW5ncyBpbiB0aGUgLnRleHQgc2VjdGlvbgotICAgICBiZWZvcmUgdGhlIGZpcnN0IHByb2NlZHVyZS4gIFdlIGNvcGUgYnkgaW5zZXJ0aW5nIGEgZHVtbXkgbGluZSBpZgotICAgICB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgcHJvY2VkdXJlIGlzIG5vdCAwLiAgSG9wZWZ1bGx5IHRoaXMKLSAgICAgd29uJ3Qgc2NyZXcgdGhpbmdzIHVwIHRvbyBiYWRseS4gIAotCi0gICAgIERvbid0IGRvIHRoaXMgZm9yIEVDT0ZGIGFzc2VtYmx5IHNvdXJjZSBsaW5lIG51bWJlcnMuICBUaGV5IHdvcmsKLSAgICAgd2l0aG91dCB0aGlzIGV4dHJhIGF0dGVudGlvbi4gICovCi0gIGlmIChkZWJ1Z190eXBlICE9IERFQlVHX0VDT0ZGCi0gICAgICAmJiBmaXJzdF9wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwKLSAgICAgICYmIGxvY2FsX2ZpcnN0X2xpbmVubyAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMCi0gICAgICAmJiAoKFNfR0VUX1ZBTFVFIChmaXJzdF9wcm9jX3B0ci0+c3ltLT5hc19zeW0pCi0JICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChzdGRvdXRwdXQsCi0JCQkJICBTX0dFVF9TRUdNRU5UIChmaXJzdF9wcm9jX3B0ci0+c3ltLT5hc19zeW0pKSkKLQkgICE9IDApKQotICAgIHsKLSAgICAgIGZpcnN0LmZpbGUgPSBsb2NhbF9maXJzdF9saW5lbm8tPmZpbGU7Ci0gICAgICBmaXJzdC5wcm9jID0gbG9jYWxfZmlyc3RfbGluZW5vLT5wcm9jOwotICAgICAgZmlyc3QuZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgICAgIGZpcnN0LnBhZGRyID0gMDsKLSAgICAgIGZpcnN0LmxpbmVubyA9IDA7Ci0KLSAgICAgIGZpcnN0Lm5leHQgPSBsb2NhbF9maXJzdF9saW5lbm87Ci0gICAgICBsb2NhbF9maXJzdF9saW5lbm8gPSAmZmlyc3Q7Ci0gICAgfQotCi0gIGZvciAobCA9IGxvY2FsX2ZpcnN0X2xpbmVubzsgbCAhPSAobGluZW5vX2xpc3RfdCAqKSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBsb25nIGNvdW50OwotICAgICAgbG9uZyBkZWx0YTsKLQotICAgICAgLyogR2V0IHRoZSBvZmZzZXQgdG8gdGhlIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSBuZXh0IGxpbmUgbnVtYmVyCi0JIChpbiB3b3JkcykuICBEbyB0aGlzIGZpcnN0LCBzbyB0aGF0IHdlIGNhbiBza2lwIGFoZWFkIHRvIHRoZQotCSBuZXh0IHVzZWZ1bCBsaW5lIG51bWJlciBlbnRyeS4gICovCi0gICAgICBpZiAobC0+bmV4dCA9PSAobGluZW5vX2xpc3RfdCAqKSBOVUxMKQotCXsKLQkgIC8qIFdlIHdhbnQgYSBjb3VudCBvZiB6ZXJvLCBidXQgaXQgd2lsbCBiZSBkZWNyZW1lbnRlZAotCSAgICAgYmVmb3JlIGl0IGlzIHVzZWQuICAqLwotCSAgY291bnQgPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGwtPm5leHQtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5uZXh0LT5wYWRkcgotCSAgICAgICA+IGwtPmZyYWctPmZyX2FkZHJlc3MgKyBsLT5wYWRkcikKLQl7Ci0JICBjb3VudCA9ICgobC0+bmV4dC0+ZnJhZy0+ZnJfYWRkcmVzcyArIGwtPm5leHQtPnBhZGRyCi0JCSAgICAtIChsLT5mcmFnLT5mcl9hZGRyZXNzICsgbC0+cGFkZHIpKQotCQkgICA+PiAyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogRG9uJ3QgY2hhbmdlIGxhc3QsIHNvIHdlIHN0aWxsIGdldCB0aGUgcmlnaHQgZGVsdGEuICAqLwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBpZiAobC0+ZmlsZSAhPSBmaWxlIHx8IGwtPnByb2MgIT0gcHJvYykKLQl7Ci0JICBpZiAobC0+cHJvYyAhPSBwcm9jICYmIHByb2MgIT0gKHByb2NfdCAqKSBOVUxMKQotCSAgICBwcm9jLT5wZHIubG5IaWdoID0gbGFzdC0+bGluZW5vOwotCSAgaWYgKGwtPmZpbGUgIT0gZmlsZSAmJiBmaWxlICE9IChlZmRyX3QgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGZpbGUtPmZkci5jYkxpbmUgPSBjIC0gZmlsZS0+ZmRyLmNiTGluZU9mZnNldDsKLQkgICAgICBmaWxlLT5mZHIuY2xpbmUgPSB0b3Rjb3VudCArIGNvdW50OwotCSAgICAgIGlmIChsaW5lY250cHRyICE9IChsb25nICopIE5VTEwpCi0JCSpsaW5lY250cHRyICs9IHRvdGNvdW50ICsgY291bnQ7Ci0JICAgICAgdG90Y291bnQgPSAwOwotCSAgICB9Ci0KLQkgIGlmIChsLT5maWxlICE9IGZpbGUpCi0JICAgIHsKLQkgICAgICBlZmRyX3QgKmxhc3RfZmlsZSA9IGZpbGU7Ci0KLQkgICAgICBmaWxlID0gbC0+ZmlsZTsKLQkgICAgICBpZiAobGFzdF9maWxlICE9IChlZmRyX3QgKikgTlVMTCkKLQkJZmlsZS0+ZmRyLmlsaW5lQmFzZQotCQkgID0gbGFzdF9maWxlLT5mZHIuaWxpbmVCYXNlICsgbGFzdF9maWxlLT5mZHIuY2xpbmU7Ci0JICAgICAgZWxzZQotCQlmaWxlLT5mZHIuaWxpbmVCYXNlID0gMDsKLQkgICAgICBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0ID0gYzsKLQkgICAgfQotCSAgaWYgKGwtPnByb2MgIT0gcHJvYykKLQkgICAgewotCSAgICAgIHByb2MgPSBsLT5wcm9jOwotCSAgICAgIGlmIChwcm9jICE9IChwcm9jX3QgKikgTlVMTCkKLQkJewotCQkgIHByb2MtPnBkci5sbkxvdyA9IGwtPmxpbmVubzsKLQkJICBwcm9jLT5wZHIuY2JMaW5lT2Zmc2V0ID0gYyAtIGZpbGUtPmZkci5jYkxpbmVPZmZzZXQ7Ci0JCSAgcHJvYy0+cGRyLmlsaW5lID0gdG90Y291bnQ7Ci0JCX0KLQkgICAgfQotCi0JICBsYXN0ID0gKGxpbmVub19saXN0X3QgKikgTlVMTDsKLQl9Ci0KLSAgICAgIHRvdGNvdW50ICs9IGNvdW50OwotCi0gICAgICAvKiBHZXQgdGhlIG9mZnNldCB0byB0aGlzIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChsYXN0ID09IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCi0JZGVsdGEgPSAwOwotICAgICAgZWxzZQotCWRlbHRhID0gbC0+bGluZW5vIC0gbGFzdC0+bGluZW5vOwotCi0gICAgICAvKiBQdXQgaW4gdGhlIG9mZnNldCB0byB0aGlzIGxpbmUgbnVtYmVyLiAgKi8KLSAgICAgIHdoaWxlIChkZWx0YSAhPSAwKQotCXsKLQkgIGludCBzZXRjb3VudDsKLQotCSAgLyogMSBpcyBhZGRlZCB0byBlYWNoIGNvdW50IHJlYWQuICAqLwotCSAgLS1jb3VudDsKLQkgIC8qIFdlIGNhbiBvbmx5IGFkanVzdCB0aGUgd29yZCBjb3VudCBieSB1cCB0byAxNSB3b3JkcyBhdCBhCi0JICAgICB0aW1lLiAgKi8KLQkgIGlmIChjb3VudCA8PSAweDBmKQotCSAgICB7Ci0JICAgICAgc2V0Y291bnQgPSBjb3VudDsKLQkgICAgICBjb3VudCA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNldGNvdW50ID0gMHgwZjsKLQkgICAgICBjb3VudCAtPSAweDBmOwotCSAgICB9Ci0JICBpZiAoZGVsdGEgPj0gLTcgJiYgZGVsdGEgPD0gNykKLQkgICAgewotCSAgICAgIGlmIChidWZwdHIgPj0gKmJ1ZmVuZCkKLQkJYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMSk7Ci0JICAgICAgKmJ1ZnB0cisrID0gc2V0Y291bnQgKyAoZGVsdGEgPDwgNCk7Ci0JICAgICAgZGVsdGEgPSAwOwotCSAgICAgICsrYzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaW50IHNldDsKLQotCSAgICAgIGlmICgqYnVmZW5kIC0gYnVmcHRyIDwgMykKLQkJYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMyk7Ci0JICAgICAgKmJ1ZnB0cisrID0gc2V0Y291bnQgKyAoOCA8PCA0KTsKLQkgICAgICBpZiAoZGVsdGEgPCAtMHg4MDAwKQotCQl7Ci0JCSAgc2V0ID0gLTB4ODAwMDsKLQkJICBkZWx0YSArPSAweDgwMDA7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChkZWx0YSA+IDB4N2ZmZikKLQkJewotCQkgIHNldCA9IDB4N2ZmZjsKLQkJICBkZWx0YSAtPSAweDdmZmY7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzZXQgPSBkZWx0YTsKLQkJICBkZWx0YSA9IDA7Ci0JCX0KLQkgICAgICAqYnVmcHRyKysgPSBzZXQgPj4gODsKLQkgICAgICAqYnVmcHRyKysgPSBzZXQgJiAweGZmZmY7Ci0JICAgICAgYyArPSAzOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBGaW5pc2ggYWRqdXN0aW5nIHRoZSBjb3VudC4gICovCi0gICAgICB3aGlsZSAoY291bnQgPiAwKQotCXsKLQkgIGlmIChidWZwdHIgPj0gKmJ1ZmVuZCkKLQkgICAgYnVmcHRyID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgYnVmcHRyLCAobG9uZykgMSk7Ci0JICAvKiAxIGlzIGFkZGVkIHRvIGVhY2ggY291bnQgcmVhZC4gICovCi0JICAtLWNvdW50OwotCSAgaWYgKGNvdW50ID4gMHgwZikKLQkgICAgewotCSAgICAgICpidWZwdHIrKyA9IDB4MGY7Ci0JICAgICAgY291bnQgLT0gMHgwZjsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKmJ1ZnB0cisrID0gY291bnQ7Ci0JICAgICAgY291bnQgPSAwOwotCSAgICB9Ci0JICArK2M7Ci0JfQotCi0gICAgICArK2lsaW5lOwotICAgICAgbGFzdCA9IGw7Ci0gICAgfQotCi0gIGlmIChwcm9jICE9IChwcm9jX3QgKikgTlVMTCkKLSAgICBwcm9jLT5wZHIubG5IaWdoID0gbGFzdC0+bGluZW5vOwotICBpZiAoZmlsZSAhPSAoZWZkcl90ICopIE5VTEwpCi0gICAgewotICAgICAgZmlsZS0+ZmRyLmNiTGluZSA9IGMgLSBmaWxlLT5mZHIuY2JMaW5lT2Zmc2V0OwotICAgICAgZmlsZS0+ZmRyLmNsaW5lID0gdG90Y291bnQ7Ci0gICAgfQotCi0gIGlmIChsaW5lY250cHRyICE9IChsb25nICopIE5VTEwpCi0gICAgKmxpbmVjbnRwdHIgKz0gdG90Y291bnQ7Ci0KLSAgYyA9IGVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgYywgJmJ1ZnB0cik7Ci0KLSAgcmV0dXJuIGM7Ci19Ci0KLS8qIEJ1aWxkIGFuZCBzd2FwIG91dCB0aGUgc3ltYm9scy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9zeW1ib2xzIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfc3ltX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9zeW1fc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX3N5bV9vdXQ7Ci0gIGNoYXIgKnN5bV9vdXQ7Ci0gIGxvbmcgaXN5bTsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBzeW1fb3V0ID0gKmJ1ZiArIG9mZnNldDsKLQotICBpc3ltID0gMDsKLQotICAvKiBUaGUgc3ltYm9scyBhcmUgc3RvcmVkIGJ5IGZpbGUuICAqLwotICBmb3IgKGZpbGVfbGluayA9IGZpbGVfZGVzYy5maXJzdDsKLSAgICAgICBmaWxlX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0gICAgICAgZmlsZV9saW5rID0gZmlsZV9saW5rLT5uZXh0KQotICAgIHsKLSAgICAgIGludCBpZmlsZXN5bTsKLSAgICAgIGludCBmaWxfY250OwotICAgICAgZWZkcl90ICpmaWxfcHRyOwotICAgICAgZWZkcl90ICpmaWxfZW5kOwotCi0gICAgICBpZiAoZmlsZV9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19sYXN0X3BhZ2U7Ci0gICAgICBlbHNlCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX3Blcl9wYWdlOwotICAgICAgZmlsX3B0ciA9IGZpbGVfbGluay0+ZGF0dW0tPmZpbGU7Ci0gICAgICBmaWxfZW5kID0gZmlsX3B0ciArIGZpbF9jbnQ7Ci0gICAgICBmb3IgKDsgZmlsX3B0ciA8IGZpbF9lbmQ7IGZpbF9wdHIrKykKLQl7Ci0JICB2bGlua3NfdCAqc3ltX2xpbms7Ci0KLQkgIGZpbF9wdHItPmZkci5pc3ltQmFzZSA9IGlzeW07Ci0JICBpZmlsZXN5bSA9IGlzeW07Ci0JICBmb3IgKHN5bV9saW5rID0gZmlsX3B0ci0+c3ltYm9scy5maXJzdDsKLQkgICAgICAgc3ltX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0JICAgICAgIHN5bV9saW5rID0gc3ltX2xpbmstPm5leHQpCi0JICAgIHsKLQkgICAgICBpbnQgc3ltX2NudDsKLQkgICAgICBsb2NhbHN5bV90ICpzeW1fcHRyOwotCSAgICAgIGxvY2Fsc3ltX3QgKnN5bV9lbmQ7Ci0KLQkgICAgICBpZiAoc3ltX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JCXN5bV9jbnQgPSBmaWxfcHRyLT5zeW1ib2xzLm9iamVjdHNfbGFzdF9wYWdlOwotCSAgICAgIGVsc2UKLQkJc3ltX2NudCA9IGZpbF9wdHItPnN5bWJvbHMub2JqZWN0c19wZXJfcGFnZTsKLQkgICAgICBzeW1fcHRyID0gc3ltX2xpbmstPmRhdHVtLT5zeW07Ci0JICAgICAgc3ltX2VuZCA9IHN5bV9wdHIgKyBzeW1fY250OwotCSAgICAgIGZvciAoOyBzeW1fcHRyIDwgc3ltX2VuZDsgc3ltX3B0cisrKQotCQl7Ci0JCSAgaW50IGxvY2FsOwotCQkgIHN5bWJvbFMgKmFzX3N5bTsKLQkJICBmb3J3YXJkX3QgKmY7Ci0KLQkJICBrbm93IChzeW1fcHRyLT5maWxlX3B0ciA9PSBmaWxfcHRyKTsKLQotCQkgIC8qIElmIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgZ2FzIHN5bWJvbCwgdGhlbiB0aGlzCi0JCSAgICAgaXMgYSBwdXJlIGRlYnVnZ2luZyBzeW1ib2wuICBXZSBoYXZlIGFscmVhZHkKLQkJICAgICBhZGRlZCB0aGUgbmFtZSAoaWYgYW55KSB0byBmaWxfcHRyLT5zdHJpbmdzLgotCQkgICAgIE90aGVyd2lzZSB3ZSBtdXN0IGRlY2lkZSB3aGV0aGVyIHRoaXMgaXMgYW4KLQkJICAgICBleHRlcm5hbCBvciBhIGxvY2FsIHN5bWJvbCAoYWN0dWFsbHksIGl0IG1heSBiZQotCQkgICAgIGJvdGggaWYgdGhlIGxvY2FsIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGVidWdnaW5nCi0JCSAgICAgaW5mb3JtYXRpb24gZm9yIHRoZSBleHRlcm5hbCkuICAqLwotCQkgIGxvY2FsID0gMTsKLQkJICBhc19zeW0gPSBzeW1fcHRyLT5hc19zeW07Ci0JCSAgaWYgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKQotCQkgICAgewotCQkgICAgICBzeW1pbnRfdCBpbmR4OwotCi0JCSAgICAgIC8qIFRoZSB2YWx1ZSBvZiBhIGJsb2NrIHN0YXJ0IHN5bWJvbCBpcyB0aGUKLQkJCSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHByb2NlZHVyZS4gIEZvcgotCQkJIG90aGVyIHN5bWJvbHMgd2UganVzdCB1c2UgdGhlIGdhcyB2YWx1ZSAoYnV0Ci0JCQkgd2UgbXVzdCBvZmZzZXQgaXQgYnkgdGhlIHZtYSBvZiB0aGUgc2VjdGlvbiwKLQkJCSBqdXN0IGFzIEJGRCBkb2VzLCBiZWNhdXNlIEJGRCB3aWxsIG5vdCBzZWUKLQkJCSB0aGlzIHZhbHVlKS4gICovCi0JCSAgICAgIGlmIChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSAoaW50KSBzdF9CbG9jawotCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyA9PSAoaW50KSBzY19UZXh0KQotCQkJewotCQkJICBzeW1ib2xTICpiZWdpbl9zeW07Ci0KLQkJCSAga25vdyAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMKTsKLQkJCSAgYmVnaW5fc3ltID0gc3ltX3B0ci0+cHJvY19wdHItPnN5bS0+YXNfc3ltOwotCQkJICBpZiAoU19HRVRfU0VHTUVOVCAoYXNfc3ltKQotCQkJICAgICAgIT0gU19HRVRfU0VHTUVOVCAoYmVnaW5fc3ltKSkKLQkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkgICAgU19HRVRfVkFMVUUgKGFzX3N5bSkgLSBTX0dFVF9WQUxVRSAoYmVnaW5fc3ltKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUgPQotCQkJICAoU19HRVRfVkFMVUUgKGFzX3N5bSkKLQkJCSAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAoc3Rkb3V0cHV0LAotCQkJCQkJICBTX0dFVF9TRUdNRU5UIChhc19zeW0pKQotCQkJICAgKyBzeW1fcHRyLT5hZGRlbmQpOwotCi0JCSAgICAgIHN5bV9wdHItPmVjb2ZmX3N5bS53ZWFrZXh0ID0gU19JU19XRUFLIChhc19zeW0pOwotCi0JCSAgICAgIC8qIFNldCBzdF9Qcm9jIHRvIHN0X1N0YXRpY1Byb2MgZm9yIGxvY2FsCi0JCQkgZnVuY3Rpb25zLiAgKi8KLQkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X1Byb2MKLQkJCSAgJiYgU19JU19ERUZJTkVEIChhc19zeW0pCi0JCQkgICYmICEgU19JU19FWFRFUk5BTCAoYXNfc3ltKQotCQkJICAmJiAhIFNfSVNfV0VBSyAoYXNfc3ltKSkKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID0gc3RfU3RhdGljUHJvYzsKLQotCQkgICAgICAvKiBHZXQgdGhlIHR5cGUgYW5kIHN0b3JhZ2UgY2xhc3MgYmFzZWQgb24gd2hlcmUKLQkJCSB0aGUgc3ltYm9sIGFjdHVhbGx5IHdvdW5kIHVwLiAgVHJhZGl0aW9uYWxseSwKLQkJCSBOX0xCUkFDIGFuZCBOX1JCUkFDIGFyZSAqbm90KiByZWxvY2F0ZWQuICovCi0JCSAgICAgIGluZHggPSBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pbmRleDsKLQkJICAgICAgaWYgKHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ID09IHN0X05pbAotCQkJICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyA9PSBzY19OaWwKLQkJCSAgJiYgKCEgRUNPRkZfSVNfU1RBQiAoJnN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltKQotCQkJICAgICAgfHwgKChFQ09GRl9VTk1BUktfU1RBQiAoaW5keCkgIT0gTl9MQlJBQykKLQkJCQkgICYmIChFQ09GRl9VTk1BUktfU1RBQiAoaW5keCkgIT0gTl9SQlJBQykpKSkKLQkJCXsKLQkJCSAgc2VnVCBzZWc7Ci0JCQkgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0JCQkgIHN0X3Qgc3Q7Ci0JCQkgIHNjX3Qgc2M7Ci0KLQkJCSAgc2VnID0gU19HRVRfU0VHTUVOVCAoYXNfc3ltKTsKLQkJCSAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAoc2VnKTsKLQotCQkJICBpZiAoISBFQ09GRl9JU19TVEFCICgmc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0pCi0JCQkgICAgICAmJiAoU19JU19FWFRFUk5BTCAoYXNfc3ltKQotCQkJCSAgfHwgU19JU19XRUFLIChhc19zeW0pCi0JCQkJICB8fCAhIFNfSVNfREVGSU5FRCAoYXNfc3ltKSkpCi0JCQkgICAgewotCQkJICAgICAgaWYgKChzeW1ib2xfZ2V0X2JmZHN5bSAoYXNfc3ltKS0+ZmxhZ3MKLQkJCQkgICAmIEJTRl9GVU5DVElPTikgIT0gMCkKLQkJCQlzdCA9IHN0X1Byb2M7Ci0JCQkgICAgICBlbHNlCi0JCQkJc3QgPSBzdF9HbG9iYWw7Ci0JCQkgICAgfQotCQkJICBlbHNlIGlmIChzZWcgPT0gdGV4dF9zZWN0aW9uKQotCQkJICAgIHN0ID0gc3RfTGFiZWw7Ci0JCQkgIGVsc2UKLQkJCSAgICBzdCA9IHN0X1N0YXRpYzsKLQotCQkJICBpZiAoISBTX0lTX0RFRklORUQgKGFzX3N5bSkpCi0JCQkgICAgewotCQkJICAgICAgdmFsdWVUIHM7Ci0KLQkJCSAgICAgIHMgPSBzeW1ib2xfZ2V0X29iaiAoYXNfc3ltKS0+ZWNvZmZfZXh0ZXJuX3NpemU7Ci0JCQkgICAgICBpZiAocyA9PSAwCi0JCQkJICB8fCBzID4gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKQotCQkJCXNjID0gc2NfVW5kZWZpbmVkOwotCQkJICAgICAgZWxzZQotCQkJCXsKLQkJCQkgIHNjID0gc2NfU1VuZGVmaW5lZDsKLQkJCQkgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0gczsKLQkJCQl9Ci0jaWZkZWYgU19TRVRfU0laRQotCQkJICAgICAgU19TRVRfU0laRSAoYXNfc3ltLCBzKTsKLSNlbmRpZgotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoU19JU19DT01NT04gKGFzX3N5bSkpCi0JCQkgICAgewotCQkJICAgICAgaWYgKFNfR0VUX1ZBTFVFIChhc19zeW0pID4gMAotCQkJCSAgJiYgKFNfR0VUX1ZBTFVFIChhc19zeW0pCi0JCQkJICAgICAgPD0gYmZkX2dldF9ncF9zaXplIChzdGRvdXRwdXQpKSkKLQkJCQlzYyA9IHNjX1NDb21tb247Ci0JCQkgICAgICBlbHNlCi0JCQkJc2MgPSBzY19Db21tb247Ci0JCQkgICAgfQotCQkJICBlbHNlIGlmIChzZWcgPT0gdGV4dF9zZWN0aW9uKQotCQkJICAgIHNjID0gc2NfVGV4dDsKLQkJCSAgZWxzZSBpZiAoc2VnID09IGRhdGFfc2VjdGlvbikKLQkJCSAgICBzYyA9IHNjX0RhdGE7Ci0JCQkgIGVsc2UgaWYgKHN0cmNtcCAoc2VnbmFtZSwgIi5yZGF0YSIpID09IDAKLQkJCQkgICB8fCBzdHJjbXAgKHNlZ25hbWUsICIucm9kYXRhIikgPT0gMCkKLQkJCSAgICBzYyA9IHNjX1JEYXRhOwotCQkJICBlbHNlIGlmIChzdHJjbXAgKHNlZ25hbWUsICIuc2RhdGEiKSA9PSAwKQotCQkJICAgIHNjID0gc2NfU0RhdGE7Ci0JCQkgIGVsc2UgaWYgKHNlZyA9PSBic3Nfc2VjdGlvbikKLQkJCSAgICBzYyA9IHNjX0JzczsKLQkJCSAgZWxzZSBpZiAoc3RyY21wIChzZWduYW1lLCAiLnNic3MiKSA9PSAwKQotCQkJICAgIHNjID0gc2NfU0JzczsKLQkJCSAgZWxzZSBpZiAoc2VnID09ICZiZmRfYWJzX3NlY3Rpb24pCi0JCQkgICAgc2MgPSBzY19BYnM7Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICAvKiBUaGlzIG11c3QgYmUgYSB1c2VyIG5hbWVkIHNlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIG5vdCBwb3NzaWJsZSBpbiBFQ09GRiwgYnV0IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbiBFTEYuICAqLwotCQkJICAgICAgc2MgPSBzY19EYXRhOwotCQkJICAgIH0KLQotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9IChpbnQpIHN0OwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyA9IChpbnQpIHNjOwotCQkJfQotCi0JCSAgICAgIC8qIFRoaXMgaXMganVzdCBhbiBleHRlcm5hbCBzeW1ib2wgaWYgaXQgaXMKLQkJCSBvdXRzaWRlIGEgcHJvY2VkdXJlIGFuZCBpdCBoYXMgYSB0eXBlLgotCQkJIEZJWE1FOiBnKysgd2lsbCBnZW5lcmF0ZSBzeW1ib2xzIHdoaWNoIGhhdmUKLQkJCSBkaWZmZXJlbnQgbmFtZXMgaW4gdGhlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgotCQkJIHRoYW4gdGhlIGFjdHVhbCBzeW1ib2wuICBTaG91bGQgd2UgaGFuZGxlCi0JCQkgdGhlbSBoZXJlPyAgKi8KLQkJICAgICAgaWYgKChTX0lTX0VYVEVSTkFMIChhc19zeW0pCi0JCQkgICB8fCBTX0lTX1dFQUsgKGFzX3N5bSkKLQkJCSAgIHx8ICEgU19JU19ERUZJTkVEIChhc19zeW0pKQotCQkJICAmJiBzeW1fcHRyLT5wcm9jX3B0ciA9PSAocHJvY190ICopIE5VTEwKLQkJCSAgJiYgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc3QgIT0gKGludCkgc3RfTmlsCi0JCQkgICYmICEgRUNPRkZfSVNfU1RBQiAoJnN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltKSkKLQkJCWxvY2FsID0gMDsKLQotCQkgICAgICAvKiBUaGlzIGlzIGp1c3QgYW4gZXh0ZXJuYWwgc3ltYm9sIGlmIGl0IGlzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb24gc3ltYm9sLiAgKi8KLQkJICAgICAgaWYgKFNfSVNfQ09NTU9OIChhc19zeW0pKQotCQkJbG9jYWwgPSAwOwotCi0JCSAgICAgIC8qIElmIGFuIHN0X2VuZCBzeW1ib2wgaGFzIGFuIGFzc29jaWF0ZWQgZ2FzCi0JCQkgc3ltYm9sLCB0aGVuIGl0IGlzIGEgbG9jYWwgbGFiZWwgY3JlYXRlZCBmb3IKLQkJCSBhIC5iZW5kIG9yIC5lbmQgZGlyZWN0aXZlLiAgU3RhYnMgbGluZQotCQkJIG51bWJlcnMgd2lsbCBoYXZlIFwwMDEgaW4gdGhlIG5hbWVzLiAgKi8KLQkJICAgICAgaWYgKGxvY2FsCi0JCQkgICYmIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0ICE9IHN0X0VuZAotCQkJICAmJiBzdHJjaHIgKHN5bV9wdHItPm5hbWUsICdcMDAxJykgPT0gMCkKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLmlzcyA9Ci0JCQkgIGFkZF9zdHJpbmcgKCZmaWxfcHRyLT5zdHJpbmdzLAotCQkJCSAgICAgIGZpbF9wdHItPnN0cl9oYXNoLAotCQkJCSAgICAgIHN5bV9wdHItPm5hbWUsCi0JCQkJICAgICAgKHNoYXNoX3QgKiopIE5VTEwpOwotCQkgICAgfQotCi0JCSAgLyogV2Ugbm93IGtub3cgdGhlIGluZGV4IG9mIHRoaXMgc3ltYm9sOyBmaWxsIGluCi0JCSAgICAgbG9jYXRpb25zIHRoYXQgaGF2ZSBiZWVuIHdhaXRpbmcgZm9yIHRoYXQKLQkJICAgICBpbmZvcm1hdGlvbi4gICovCi0JCSAgaWYgKHN5bV9wdHItPmJlZ2luX3B0ciAhPSAobG9jYWxzeW1fdCAqKSBOVUxMKQotCQkgICAgewotCQkgICAgICBsb2NhbHN5bV90ICpiZWdpbl9wdHI7Ci0JCSAgICAgIHN0X3QgYmVnaW5fdHlwZTsKLQotCQkgICAgICBrbm93IChsb2NhbCk7Ci0JCSAgICAgIGJlZ2luX3B0ciA9IHN5bV9wdHItPmJlZ2luX3B0cjsKLQkJICAgICAga25vdyAoYmVnaW5fcHRyLT5zeW1faW5kZXggIT0gLTEpOwotCQkgICAgICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5pbmRleCA9IGJlZ2luX3B0ci0+c3ltX2luZGV4OwotCQkgICAgICBpZiAoc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0uc2MgIT0gKGludCkgc2NfSW5mbykKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLmlzcyA9Ci0JCQkgIGJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaXNzOwotCi0JCSAgICAgIGJlZ2luX3R5cGUgPSBiZWdpbl9wdHItPmVjb2ZmX3N5bS5hc3ltLnN0OwotCQkgICAgICBpZiAoYmVnaW5fdHlwZSA9PSBzdF9GaWxlCi0JCQkgIHx8IGJlZ2luX3R5cGUgPT0gc3RfQmxvY2spCi0JCQl7Ci0JCQkgIGJlZ2luX3B0ci0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPQotCQkJICAgIGlzeW0gLSBpZmlsZXN5bSArIDE7Ci0JCQkgICgqc3dhcF9zeW1fb3V0KSAoc3Rkb3V0cHV0LAotCQkJCQkgICAmYmVnaW5fcHRyLT5lY29mZl9zeW0uYXN5bSwKLQkJCQkJICAgKCpidWYKLQkJCQkJICAgICsgb2Zmc2V0Ci0JCQkJCSAgICArIChiZWdpbl9wdHItPnN5bV9pbmRleAotCQkJCQkgICAgICAgKiBleHRlcm5hbF9zeW1fc2l6ZSkpKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBrbm93IChiZWdpbl9wdHItPmluZGV4X3B0ciAhPSAoYXV4X3QgKikgTlVMTCk7Ci0JCQkgIGJlZ2luX3B0ci0+aW5kZXhfcHRyLT5kYXRhLmlzeW0gPQotCQkJICAgIGlzeW0gLSBpZmlsZXN5bSArIDE7Ci0JCQl9Ci0KLQkJICAgICAgLyogVGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgbWFya2luZyB0aGUgZW5kIG9mIGEKLQkJCSBwcm9jZWR1cmUgaXMgdGhlIHNpemUgb2YgdGhlIHByb2NlZHVyZS4gIFRoZQotCQkJIHZhbHVlIG9mIHRoZSBzeW1ib2wgbWFya2luZyB0aGUgZW5kIG9mIGEKLQkJCSBibG9jayBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZQotCQkJIHByb2NlZHVyZSB0byB0aGUgYmxvY2suICAqLwotCQkgICAgICBpZiAoYmVnaW5fdHlwZSA9PSBzdF9Qcm9jCi0JCQkgIHx8IGJlZ2luX3R5cGUgPT0gc3RfU3RhdGljUHJvYykKLQkJCXsKLQkJCSAga25vdyAoYXNfc3ltICE9IChzeW1ib2xTICopIE5VTEwpOwotCQkJICBrbm93IChiZWdpbl9wdHItPmFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMKTsKLQkJCSAgaWYgKFNfR0VUX1NFR01FTlQgKGFzX3N5bSkKLQkJCSAgICAgICE9IFNfR0VUX1NFR01FTlQgKGJlZ2luX3B0ci0+YXNfc3ltKSkKLQkJCSAgICBhc193YXJuIChfKCIuYmVnaW4vLmJlbmQgaW4gZGlmZmVyZW50IHNlZ21lbnRzIikpOwotCQkJICBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9Ci0JCQkgICAgKFNfR0VUX1ZBTFVFIChhc19zeW0pCi0JCQkgICAgIC0gU19HRVRfVkFMVUUgKGJlZ2luX3B0ci0+YXNfc3ltKSk7Ci0KLQkJCSAgLyogSWYgdGhlIHNpemUgaXMgb2RkLCB0aGlzIGlzIHByb2JhYmx5IGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwczE2IGZ1bmN0aW9uOyBmb3JjZSBpdCB0byBiZSBldmVuLiAgKi8KLQkJCSAgaWYgKChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZSAmIDEpICE9IDApCi0JCQkgICAgKytzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS52YWx1ZTsKLQotI2lmZGVmIFNfU0VUX1NJWkUKLQkJCSAgU19TRVRfU0laRSAoYmVnaW5fcHRyLT5hc19zeW0sCi0JCQkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLmFzeW0udmFsdWUpOwotI2VuZGlmCi0JCQl9Ci0JCSAgICAgIGVsc2UgaWYgKGJlZ2luX3R5cGUgPT0gc3RfQmxvY2sKLQkJCSAgICAgICAmJiBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zYyAhPSAoaW50KSBzY19JbmZvKQotCQkJewotCQkJICBzeW1ib2xTICpiZWdpbl9zeW07Ci0KLQkJCSAga25vdyAoYXNfc3ltICE9IChzeW1ib2xTICopIE5VTEwpOwotCQkJICBrbm93IChzeW1fcHRyLT5wcm9jX3B0ciAhPSAocHJvY190ICopIE5VTEwpOwotCQkJICBiZWdpbl9zeW0gPSBzeW1fcHRyLT5wcm9jX3B0ci0+c3ltLT5hc19zeW07Ci0JCQkgIGlmIChTX0dFVF9TRUdNRU5UIChhc19zeW0pCi0JCQkgICAgICAhPSBTX0dFVF9TRUdNRU5UIChiZWdpbl9zeW0pKQotCQkJICAgIGFzX3dhcm4gKF8oIi5iZWdpbi8uYmVuZCBpbiBkaWZmZXJlbnQgc2VnbWVudHMiKSk7Ci0JCQkgIHN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLnZhbHVlID0KLQkJCSAgICBTX0dFVF9WQUxVRSAoYXNfc3ltKSAtIFNfR0VUX1ZBTFVFIChiZWdpbl9zeW0pOwotCQkJfQotCQkgICAgfQotCi0JCSAgZm9yIChmID0gc3ltX3B0ci0+Zm9yd2FyZF9yZWY7Ci0JCSAgICAgICBmICE9IChmb3J3YXJkX3QgKikgTlVMTDsKLQkJICAgICAgIGYgPSBmLT5uZXh0KQotCQkgICAgewotCQkgICAgICBrbm93IChsb2NhbCk7Ci0JCSAgICAgIGYtPmlmZF9wdHItPmRhdGEuaXN5bSA9IGZpbF9wdHItPmZpbGVfaW5kZXg7Ci0JCSAgICAgIGYtPmluZGV4X3B0ci0+ZGF0YS5ybmR4LmluZGV4ID0gaXN5bSAtIGlmaWxlc3ltOwotCQkgICAgfQotCi0JCSAgaWYgKGxvY2FsKQotCQkgICAgewotCQkgICAgICBpZiAoKmJ1ZmVuZCAtIHN5bV9vdXQgPCBleHRlcm5hbF9zeW1fc2l6ZSkKLQkJCXN5bV9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLAotCQkJCQkJICAgc3ltX291dCwKLQkJCQkJCSAgIGV4dGVybmFsX3N5bV9zaXplKTsKLQkJICAgICAgKCpzd2FwX3N5bV9vdXQpIChzdGRvdXRwdXQsICZzeW1fcHRyLT5lY29mZl9zeW0uYXN5bSwKLQkJCQkgICAgICAgc3ltX291dCk7Ci0JCSAgICAgIHN5bV9vdXQgKz0gZXh0ZXJuYWxfc3ltX3NpemU7Ci0KLQkJICAgICAgc3ltX3B0ci0+c3ltX2luZGV4ID0gaXN5bTsKLQotCQkgICAgICBpZiAoc3ltX3B0ci0+cHJvY19wdHIgIT0gKHByb2NfdCAqKSBOVUxMCi0JCQkgICYmIHN5bV9wdHItPnByb2NfcHRyLT5zeW0gPT0gc3ltX3B0cikKLQkJCXN5bV9wdHItPnByb2NfcHRyLT5wZHIuaXN5bSA9IGlzeW0gLSBpZmlsZXN5bTsKLQotCQkgICAgICArK2lzeW07Ci0JCSAgICB9Ci0KLQkJICAvKiBSZWNvcmQgdGhlIGxvY2FsIHN5bWJvbCBpbmRleCBhbmQgZmlsZSBudW1iZXIgaW4KLQkJICAgICBjYXNlIHRoaXMgaXMgYW4gZXh0ZXJuYWwgc3ltYm9sLiAgTm90ZSB0aGF0IHRoaXMKLQkJICAgICBkZXN0cm95cyB0aGUgYXN5bS5pbmRleCBmaWVsZC4gICovCi0JCSAgaWYgKGFzX3N5bSAhPSAoc3ltYm9sUyAqKSBOVUxMCi0JCSAgICAgICYmIHN5bWJvbF9nZXRfb2JqIChhc19zeW0pLT5lY29mZl9zeW1ib2wgPT0gc3ltX3B0cikKLQkJICAgIHsKLQkJICAgICAgaWYgKChzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSBzdF9Qcm9jCi0JCQkgICB8fCBzeW1fcHRyLT5lY29mZl9zeW0uYXN5bS5zdCA9PSBzdF9TdGF0aWNQcm9jKQotCQkJICAmJiBsb2NhbCkKLQkJCXN5bV9wdHItPmVjb2ZmX3N5bS5hc3ltLmluZGV4ID0gaXN5bSAtIGlmaWxlc3ltIC0gMTsKLQkJICAgICAgc3ltX3B0ci0+ZWNvZmZfc3ltLmlmZCA9IGZpbF9wdHItPmZpbGVfaW5kZXg7Ci0KLQkJICAgICAgLyogRG9uJ3QgdHJ5IHRvIG1lcmdlIGFuIEZEUiB3aGljaCBoYXMgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBzeW1ib2wgYXR0YWNoZWQgdG8gaXQuICAqLwotCQkgICAgICBpZiAoU19JU19FWFRFUk5BTCAoYXNfc3ltKSB8fCBTX0lTX1dFQUsgKGFzX3N5bSkpCi0JCQlmaWxfcHRyLT5mZHIuZk1lcmdlID0gMDsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBmaWxfcHRyLT5mZHIuY3N5bSA9IGlzeW0gLSBmaWxfcHRyLT5mZHIuaXN5bUJhc2U7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0ICsgaXN5bSAqIGV4dGVybmFsX3N5bV9zaXplOwotfQotCi0vKiBTd2FwIG91dCB0aGUgcHJvY2VkdXJlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX3Byb2NzIChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwgb2Zmc2V0KQotICAgICBjb25zdCBzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCAqYmFja2VuZDsKLSAgICAgY2hhciAqKmJ1ZjsKLSAgICAgY2hhciAqKmJ1ZmVuZDsKLSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci17Ci0gIGNvbnN0IGJmZF9zaXplX3R5cGUgZXh0ZXJuYWxfcGRyX3NpemUgPSBiYWNrZW5kLT5leHRlcm5hbF9wZHJfc2l6ZTsKLSAgdm9pZCAoKiBjb25zdCBzd2FwX3Bkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSkKLSAgICA9IGJhY2tlbmQtPnN3YXBfcGRyX291dDsKLSAgY2hhciAqcGRyX291dDsKLSAgbG9uZyBpcHJvYzsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBwZHJfb3V0ID0gKmJ1ZiArIG9mZnNldDsKLQotICBpcHJvYyA9IDA7Ci0KLSAgLyogVGhlIHByb2NlZHVyZXMgYXJlIHN0b3JlZCBieSBmaWxlLiAgKi8KLSAgZm9yIChmaWxlX2xpbmsgPSBmaWxlX2Rlc2MuZmlyc3Q7Ci0gICAgICAgZmlsZV9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIGZpbGVfbGluayA9IGZpbGVfbGluay0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgZmlsX2NudDsKLSAgICAgIGVmZHJfdCAqZmlsX3B0cjsKLSAgICAgIGVmZHJfdCAqZmlsX2VuZDsKLQotICAgICAgaWYgKGZpbGVfbGluay0+bmV4dCA9PSAodmxpbmtzX3QgKikgTlVMTCkKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfbGFzdF9wYWdlOwotICAgICAgZWxzZQotCWZpbF9jbnQgPSBmaWxlX2Rlc2Mub2JqZWN0c19wZXJfcGFnZTsKLSAgICAgIGZpbF9wdHIgPSBmaWxlX2xpbmstPmRhdHVtLT5maWxlOwotICAgICAgZmlsX2VuZCA9IGZpbF9wdHIgKyBmaWxfY250OwotICAgICAgZm9yICg7IGZpbF9wdHIgPCBmaWxfZW5kOyBmaWxfcHRyKyspCi0JewotCSAgdmxpbmtzX3QgKnByb2NfbGluazsKLQkgIGludCBmaXJzdDsKLQotCSAgZmlsX3B0ci0+ZmRyLmlwZEZpcnN0ID0gaXByb2M7Ci0JICBmaXJzdCA9IDE7Ci0JICBmb3IgKHByb2NfbGluayA9IGZpbF9wdHItPnByb2NzLmZpcnN0OwotCSAgICAgICBwcm9jX2xpbmsgIT0gKHZsaW5rc190ICopIE5VTEw7Ci0JICAgICAgIHByb2NfbGluayA9IHByb2NfbGluay0+bmV4dCkKLQkgICAgewotCSAgICAgIGludCBwcmNfY250OwotCSAgICAgIHByb2NfdCAqcHJvY19wdHI7Ci0JICAgICAgcHJvY190ICpwcm9jX2VuZDsKLQotCSAgICAgIGlmIChwcm9jX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JCXByY19jbnQgPSBmaWxfcHRyLT5wcm9jcy5vYmplY3RzX2xhc3RfcGFnZTsKLQkgICAgICBlbHNlCi0JCXByY19jbnQgPSBmaWxfcHRyLT5wcm9jcy5vYmplY3RzX3Blcl9wYWdlOwotCSAgICAgIHByb2NfcHRyID0gcHJvY19saW5rLT5kYXR1bS0+cHJvYzsKLQkgICAgICBwcm9jX2VuZCA9IHByb2NfcHRyICsgcHJjX2NudDsKLQkgICAgICBmb3IgKDsgcHJvY19wdHIgPCBwcm9jX2VuZDsgcHJvY19wdHIrKykKLQkJewotCQkgIHN5bWJvbFMgKmFkcl9zeW07Ci0JCSAgdW5zaWduZWQgbG9uZyBhZHI7Ci0KLQkJICBhZHJfc3ltID0gcHJvY19wdHItPnN5bS0+YXNfc3ltOwotCQkgIGFkciA9IChTX0dFVF9WQUxVRSAoYWRyX3N5bSkKLQkJCSArIGJmZF9nZXRfc2VjdGlvbl92bWEgKHN0ZG91dHB1dCwKLQkJCQkJCVNfR0VUX1NFR01FTlQgKGFkcl9zeW0pKSk7Ci0JCSAgaWYgKGZpcnN0KQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBmb3JjZSB0aGUgYWRyIG9mIHRoZSB2ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgZmRyIHRvIGJlIDAuICBIb3dldmVyLCB0aGUgbmF0aXZlIHRvb2xzCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgZG8gdGhhdCwgYW5kIEkgY2FuJ3QgcmVtZW1iZXIgd2h5IGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byB3b3JrIHRoYXQgd2F5LCBzbyBJIHRvb2sgaXQgb3V0LiAgKi8KLQkJICAgICAgZmlsX3B0ci0+ZmRyLmFkciA9IGFkcjsKLQkJICAgICAgZmlyc3QgPSAwOwotCQkgICAgfQotCQkgIHByb2NfcHRyLT5wZHIuYWRyID0gYWRyIC0gZmlsX3B0ci0+ZmRyLmFkcjsKLQkJICBpZiAoKmJ1ZmVuZCAtIHBkcl9vdXQgPCBleHRlcm5hbF9wZHJfc2l6ZSkKLQkJICAgIHBkcl9vdXQgPSBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLAotCQkJCQkgICAgICAgcGRyX291dCwKLQkJCQkJICAgICAgIGV4dGVybmFsX3Bkcl9zaXplKTsKLQkJICAoKnN3YXBfcGRyX291dCkgKHN0ZG91dHB1dCwgJnByb2NfcHRyLT5wZHIsIHBkcl9vdXQpOwotCQkgIHBkcl9vdXQgKz0gZXh0ZXJuYWxfcGRyX3NpemU7Ci0JCSAgKytpcHJvYzsKLQkJfQotCSAgICB9Ci0JICBmaWxfcHRyLT5mZHIuY3BkID0gaXByb2MgLSBmaWxfcHRyLT5mZHIuaXBkRmlyc3Q7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0ICsgaXByb2MgKiBleHRlcm5hbF9wZHJfc2l6ZTsKLX0KLQotLyogU3dhcCBvdXQgdGhlIGF1eCBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9hdXggKGJhY2tlbmQsIGJ1ZiwgYnVmZW5kLCBvZmZzZXQpCi0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLXsKLSAgaW50IGJpZ2VuZGlhbjsKLSAgdW5pb24gYXV4X2V4dCAqYXV4X291dDsKLSAgbG9uZyBpYXV4OwotICB2bGlua3NfdCAqZmlsZV9saW5rOwotCi0gIGJpZ2VuZGlhbiA9IGJmZF9iaWdfZW5kaWFuIChzdGRvdXRwdXQpOwotCi0gIGF1eF9vdXQgPSAodW5pb24gYXV4X2V4dCAqKSAoKmJ1ZiArIG9mZnNldCk7Ci0KLSAgaWF1eCA9IDA7Ci0KLSAgLyogVGhlIGF1eCBlbnRyaWVzIGFyZSBzdG9yZWQgYnkgZmlsZS4gICovCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIHZsaW5rc190ICphdXhfbGluazsKLQotCSAgZmlsX3B0ci0+ZmRyLmZCaWdlbmRpYW4gPSBiaWdlbmRpYW47Ci0JICBmaWxfcHRyLT5mZHIuaWF1eEJhc2UgPSBpYXV4OwotCSAgZm9yIChhdXhfbGluayA9IGZpbF9wdHItPmF1eF9zeW1zLmZpcnN0OwotCSAgICAgICBhdXhfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLQkgICAgICAgYXV4X2xpbmsgPSBhdXhfbGluay0+bmV4dCkKLQkgICAgewotCSAgICAgIGludCBhdXhfY250OwotCSAgICAgIGF1eF90ICphdXhfcHRyOwotCSAgICAgIGF1eF90ICphdXhfZW5kOwotCi0JICAgICAgaWYgKGF1eF9saW5rLT5uZXh0ID09ICh2bGlua3NfdCAqKSBOVUxMKQotCQlhdXhfY250ID0gZmlsX3B0ci0+YXV4X3N5bXMub2JqZWN0c19sYXN0X3BhZ2U7Ci0JICAgICAgZWxzZQotCQlhdXhfY250ID0gZmlsX3B0ci0+YXV4X3N5bXMub2JqZWN0c19wZXJfcGFnZTsKLQkgICAgICBhdXhfcHRyID0gYXV4X2xpbmstPmRhdHVtLT5hdXg7Ci0JICAgICAgYXV4X2VuZCA9IGF1eF9wdHIgKyBhdXhfY250OwotCSAgICAgIGZvciAoOyBhdXhfcHRyIDwgYXV4X2VuZDsgYXV4X3B0cisrKQotCQl7Ci0JCSAgaWYgKCpidWZlbmQgLSAoY2hhciAqKSBhdXhfb3V0IDwgc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSkKLQkJICAgIGF1eF9vdXQgPSAoKHVuaW9uIGF1eF9leHQgKikKLQkJCSAgICAgICBlY29mZl9hZGRfYnl0ZXMgKGJ1ZiwgYnVmZW5kLAotCQkJCQkJKGNoYXIgKikgYXV4X291dCwKLQkJCQkJCXNpemVvZiAodW5pb24gYXV4X2V4dCkpKTsKLQkJICBzd2l0Y2ggKGF1eF9wdHItPnR5cGUpCi0JCSAgICB7Ci0JCSAgICBjYXNlIGF1eF90aXI6Ci0JCSAgICAgICgqYmFja2VuZC0+c3dhcF90aXJfb3V0KSAoYmlnZW5kaWFuLAotCQkJCQkJJmF1eF9wdHItPmRhdGEudGksCi0JCQkJCQkmYXV4X291dC0+YV90aSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfcm5keDoKLQkJICAgICAgKCpiYWNrZW5kLT5zd2FwX3JuZHhfb3V0KSAoYmlnZW5kaWFuLAotCQkJCQkJICZhdXhfcHRyLT5kYXRhLnJuZHgsCi0JCQkJCQkgJmF1eF9vdXQtPmFfcm5keCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfZG5Mb3c6Ci0JCSAgICAgIEFVWF9QVVRfRE5MT1cgKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5kbkxvdywKLQkJCQkgICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgYXV4X2RuSGlnaDoKLQkJICAgICAgQVVYX1BVVF9ETkhJR0ggKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5kbkhpZ2gsCi0JCQkJICAgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfaXN5bToKLQkJICAgICAgQVVYX1BVVF9JU1lNIChiaWdlbmRpYW4sIGF1eF9wdHItPmRhdGEuaXN5bSwKLQkJCQkgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfaXNzOgotCQkgICAgICBBVVhfUFVUX0lTUyAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLmlzcywKLQkJCQkgICBhdXhfb3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIGF1eF93aWR0aDoKLQkJICAgICAgQVVYX1BVVF9XSURUSCAoYmlnZW5kaWFuLCBhdXhfcHRyLT5kYXRhLndpZHRoLAotCQkJCSAgICAgYXV4X291dCk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSBhdXhfY291bnQ6Ci0JCSAgICAgIEFVWF9QVVRfQ09VTlQgKGJpZ2VuZGlhbiwgYXV4X3B0ci0+ZGF0YS5jb3VudCwKLQkJCQkgICAgIGF1eF9vdXQpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQotCQkgICsrYXV4X291dDsKLQkJICArK2lhdXg7Ci0JCX0KLQkgICAgfQotCSAgZmlsX3B0ci0+ZmRyLmNhdXggPSBpYXV4IC0gZmlsX3B0ci0+ZmRyLmlhdXhCYXNlOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGVjb2ZmX3BhZGRpbmdfYWRqdXN0IChiYWNrZW5kLCBidWYsIGJ1ZmVuZCwKLQkJCSAgICAgICBvZmZzZXQgKyBpYXV4ICogc2l6ZW9mICh1bmlvbiBhdXhfZXh0KSwKLQkJCSAgICAgICAoY2hhciAqKikgTlVMTCk7Ci19Ci0KLS8qIENvcHkgb3V0IHRoZSBzdHJpbmdzIGZyb20gYSB2YXJyYXlfdC4gIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gICBieXRlcyBjb3BpZWQsIHJhdGhlciB0aGFuIHRoZSBuZXcgb2Zmc2V0LiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX3N0cmluZ3MgKGJ1ZiwgYnVmZW5kLCBvZmZzZXQsIHZwKQotICAgICBjaGFyICoqYnVmOwotICAgICBjaGFyICoqYnVmZW5kOwotICAgICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLSAgICAgdmFycmF5X3QgKnZwOwotewotICB1bnNpZ25lZCBsb25nIGlzdHI7Ci0gIGNoYXIgKnN0cl9vdXQ7Ci0gIHZsaW5rc190ICpzdHJfbGluazsKLQotICBzdHJfb3V0ID0gKmJ1ZiArIG9mZnNldDsKLQotICBpc3RyID0gMDsKLQotICBmb3IgKHN0cl9saW5rID0gdnAtPmZpcnN0OwotICAgICAgIHN0cl9saW5rICE9ICh2bGlua3NfdCAqKSBOVUxMOwotICAgICAgIHN0cl9saW5rID0gc3RyX2xpbmstPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBzdHJfY250OwotCi0gICAgICBpZiAoc3RyX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0Jc3RyX2NudCA9IHZwLT5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlzdHJfY250ID0gdnAtPm9iamVjdHNfcGVyX3BhZ2U7Ci0KLSAgICAgIGlmICgqYnVmZW5kIC0gc3RyX291dCA8IHN0cl9jbnQpCi0Jc3RyX291dCA9IGVjb2ZmX2FkZF9ieXRlcyAoYnVmLCBidWZlbmQsIHN0cl9vdXQsIHN0cl9jbnQpOwotCi0gICAgICBtZW1jcHkgKHN0cl9vdXQsIHN0cl9saW5rLT5kYXR1bS0+Ynl0ZSwgc3RyX2NudCk7Ci0gICAgICBzdHJfb3V0ICs9IHN0cl9jbnQ7Ci0gICAgICBpc3RyICs9IHN0cl9jbnQ7Ci0gICAgfQotCi0gIHJldHVybiBpc3RyOwotfQotCi0vKiBEdW1wIG91dCB0aGUgbG9jYWwgc3RyaW5ncy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1lY29mZl9idWlsZF9zcyAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBsb25nIGlzczsKLSAgdmxpbmtzX3QgKmZpbGVfbGluazsKLQotICBpc3MgPSAwOwotCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIGxvbmcgc3NfY250OwotCi0JICBmaWxfcHRyLT5mZHIuaXNzQmFzZSA9IGlzczsKLQkgIHNzX2NudCA9IGVjb2ZmX2J1aWxkX3N0cmluZ3MgKGJ1ZiwgYnVmZW5kLCBvZmZzZXQgKyBpc3MsCi0JCQkJCSZmaWxfcHRyLT5zdHJpbmdzKTsKLQkgIGZpbF9wdHItPmZkci5jYlNzID0gc3NfY250OwotCSAgaXNzICs9IHNzX2NudDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBlY29mZl9wYWRkaW5nX2FkanVzdCAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCArIGlzcywKLQkJCSAgICAgICAoY2hhciAqKikgTlVMTCk7Ci19Ci0KLS8qIFN3YXAgb3V0IHRoZSBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2ZkciAoYmFja2VuZCwgYnVmLCBidWZlbmQsIG9mZnNldCkKLSAgICAgY29uc3Qgc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXAgKmJhY2tlbmQ7Ci0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNoYXIgKipidWZlbmQ7Ci0gICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX2Zkcl9zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfZmRyX3NpemU7Ci0gIHZvaWQgKCogY29uc3Qgc3dhcF9mZHJfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgRkRSICosIFBUUikpCi0gICAgPSBiYWNrZW5kLT5zd2FwX2Zkcl9vdXQ7Ci0gIGxvbmcgaWZpbGU7Ci0gIGNoYXIgKmZkcl9vdXQ7Ci0gIHZsaW5rc190ICpmaWxlX2xpbms7Ci0KLSAgaWZpbGUgPSAwOwotCi0gIGZkcl9vdXQgPSAqYnVmICsgb2Zmc2V0OwotCi0gIGZvciAoZmlsZV9saW5rID0gZmlsZV9kZXNjLmZpcnN0OwotICAgICAgIGZpbGVfbGluayAhPSAodmxpbmtzX3QgKikgTlVMTDsKLSAgICAgICBmaWxlX2xpbmsgPSBmaWxlX2xpbmstPm5leHQpCi0gICAgewotICAgICAgaW50IGZpbF9jbnQ7Ci0gICAgICBlZmRyX3QgKmZpbF9wdHI7Ci0gICAgICBlZmRyX3QgKmZpbF9lbmQ7Ci0KLSAgICAgIGlmIChmaWxlX2xpbmstPm5leHQgPT0gKHZsaW5rc190ICopIE5VTEwpCi0JZmlsX2NudCA9IGZpbGVfZGVzYy5vYmplY3RzX2xhc3RfcGFnZTsKLSAgICAgIGVsc2UKLQlmaWxfY250ID0gZmlsZV9kZXNjLm9iamVjdHNfcGVyX3BhZ2U7Ci0gICAgICBmaWxfcHRyID0gZmlsZV9saW5rLT5kYXR1bS0+ZmlsZTsKLSAgICAgIGZpbF9lbmQgPSBmaWxfcHRyICsgZmlsX2NudDsKLSAgICAgIGZvciAoOyBmaWxfcHRyIDwgZmlsX2VuZDsgZmlsX3B0cisrKQotCXsKLQkgIGlmICgqYnVmZW5kIC0gZmRyX291dCA8IGV4dGVybmFsX2Zkcl9zaXplKQotCSAgICBmZHJfb3V0ID0gZWNvZmZfYWRkX2J5dGVzIChidWYsIGJ1ZmVuZCwgZmRyX291dCwKLQkJCQkgICAgICAgZXh0ZXJuYWxfZmRyX3NpemUpOwotCSAgKCpzd2FwX2Zkcl9vdXQpIChzdGRvdXRwdXQsICZmaWxfcHRyLT5mZHIsIGZkcl9vdXQpOwotCSAgZmRyX291dCArPSBleHRlcm5hbF9mZHJfc2l6ZTsKLQkgICsraWZpbGU7Ci0JfQotICAgIH0KLQotICByZXR1cm4gb2Zmc2V0ICsgaWZpbGUgKiBleHRlcm5hbF9mZHJfc2l6ZTsKLX0KLQotLyogU2V0IHVwIHRoZSBleHRlcm5hbCBzeW1ib2xzLiAgVGhlc2UgYXJlIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgYnkKLSAgIHRoZSBiYWNrZW5kLiAgVGhpcyByb3V0aW5lIGp1c3QgZ2V0cyB0aGUgcmlnaHQgaW5mb3JtYXRpb24gYW5kCi0gICBjYWxscyBhIGJhY2tlbmQgZnVuY3Rpb24gdG8gZGVhbCB3aXRoIGl0LiAgKi8KLQotc3RhdGljIHZvaWQKLWVjb2ZmX3NldHVwX2V4dCAoKQotewotICByZWdpc3RlciBzeW1ib2xTICpzeW07Ci0KLSAgZm9yIChzeW0gPSBzeW1ib2xfcm9vdFA7IHN5bSAhPSAoc3ltYm9sUyAqKSBOVUxMOyBzeW0gPSBzeW1ib2xfbmV4dCAoc3ltKSkKLSAgICB7Ci0gICAgICBpZiAoc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX3N5bWJvbCA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIGEgbG9jYWwgc3ltYm9sLCB0aGVuIGZvcmNlIHRoZSBmaWVsZHMgdG8gemVyby4gICovCi0gICAgICBpZiAoISBTX0lTX0VYVEVSTkFMIChzeW0pCi0JICAmJiAhIFNfSVNfV0VBSyAoc3ltKQotCSAgJiYgU19JU19ERUZJTkVEIChzeW0pKQotCXsKLQkgIHN0cnVjdCBsb2NhbHN5bSAqbHN5bTsKLQotCSAgbHN5bSA9IHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2w7Ci0JICBsc3ltLT5lY29mZl9zeW0uYXN5bS52YWx1ZSA9IDA7Ci0JICBsc3ltLT5lY29mZl9zeW0uYXN5bS5zdCA9IChpbnQpIHN0X05pbDsKLQkgIGxzeW0tPmVjb2ZmX3N5bS5hc3ltLnNjID0gKGludCkgc2NfTmlsOwotCSAgbHN5bS0+ZWNvZmZfc3ltLmFzeW0uaW5kZXggPSBpbmRleE5pbDsKLQl9Ci0KLSAgICAgIG9ial9lY29mZl9zZXRfZXh0IChzeW0sICZzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfc3ltYm9sLT5lY29mZl9zeW0pOwotICAgIH0KLX0KLQotLyogQnVpbGQgdGhlIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi0KLXVuc2lnbmVkIGxvbmcKLWVjb2ZmX2J1aWxkX2RlYnVnIChoZHIsIGJ1ZnAsIGJhY2tlbmQpCi0gICAgIEhEUlIgKmhkcjsKLSAgICAgY2hhciAqKmJ1ZnA7Ci0gICAgIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICpiYWNrZW5kOwotewotICBjb25zdCBiZmRfc2l6ZV90eXBlIGV4dGVybmFsX3Bkcl9zaXplID0gYmFja2VuZC0+ZXh0ZXJuYWxfcGRyX3NpemU7Ci0gIHRhZ190ICpwdGFnOwotICB0YWdfdCAqcHRhZ19uZXh0OwotICBlZmRyX3QgKmZpbF9wdHI7Ci0gIGludCBlbmRfd2FybmluZzsKLSAgZWZkcl90ICpob2xkX2ZpbGVfcHRyOwotICBwcm9jX3QgKiBob2xkX3Byb2NfcHRyOwotICBzeW1ib2xTICpzeW07Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqYnVmZW5kOwotICB1bnNpZ25lZCBsb25nIG9mZnNldDsKLQotICAvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGZpbGUuICAqLwotICBpZiAoZmlyc3RfZmlsZSA9PSAoZWZkcl90ICopIE5VTEwpCi0gICAgYWRkX2ZpbGUgKChjb25zdCBjaGFyICopIE5VTEwsIDAsIDEpOwotCi0gIC8qIEhhbmRsZSBhbnkgdG9wIGxldmVsIHRhZ3MuICAqLwotICBmb3IgKHB0YWcgPSB0b3BfdGFnX2hlYWQtPmZpcnN0X3RhZzsKLSAgICAgICBwdGFnICE9ICh0YWdfdCAqKSBOVUxMOwotICAgICAgIHB0YWcgPSBwdGFnX25leHQpCi0gICAgewotICAgICAgaWYgKHB0YWctPmZvcndhcmRfcmVmICE9IChmb3J3YXJkX3QgKikgTlVMTCkKLQlhZGRfdW5rbm93bl90YWcgKHB0YWcpOwotCi0gICAgICBwdGFnX25leHQgPSBwdGFnLT5zYW1lX2Jsb2NrOwotICAgICAgcHRhZy0+aGFzaF9wdHItPnRhZ19wdHIgPSBwdGFnLT5zYW1lX25hbWU7Ci0gICAgICBmcmVlX3RhZyAocHRhZyk7Ci0gICAgfQotCi0gIGZyZWVfdGhlYWQgKHRvcF90YWdfaGVhZCk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzeW1ib2xzLiAgQWRkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgZWFjaAotICAgICBzeW1ib2wgdGhhdCBoYXMgbm90IGFscmVhZHkgcmVjZWl2ZWQgaXQuICAqLwotICBob2xkX2ZpbGVfcHRyID0gY3VyX2ZpbGVfcHRyOwotICBob2xkX3Byb2NfcHRyID0gY3VyX3Byb2NfcHRyOwotICBjdXJfcHJvY19wdHIgPSAocHJvY190ICopIE5VTEw7Ci0gIGZvciAoc3ltID0gc3ltYm9sX3Jvb3RQOyBzeW0gIT0gKHN5bWJvbFMgKikgTlVMTDsgc3ltID0gc3ltYm9sX25leHQgKHN5bSkpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF9nZXRfb2JqIChzeW0pLT5lY29mZl9zeW1ib2wgIT0gTlVMTAotCSAgfHwgc3ltYm9sX2dldF9vYmogKHN5bSktPmVjb2ZmX2ZpbGUgPT0gKGVmZHJfdCAqKSBOVUxMCi0JICB8fCAoc3ltYm9sX2dldF9iZmRzeW0gKHN5bSktPmZsYWdzICYgQlNGX1NFQ1RJT05fU1lNKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBjdXJfZmlsZV9wdHIgPSBzeW1ib2xfZ2V0X29iaiAoc3ltKS0+ZWNvZmZfZmlsZTsKLSAgICAgIGFkZF9lY29mZl9zeW1ib2wgKChjb25zdCBjaGFyICopIE5VTEwsIHN0X05pbCwgc2NfTmlsLCBzeW0sCi0JCQkoYmZkX3ZtYSkgMCwgU19HRVRfVkFMVUUgKHN5bSksIGluZGV4TmlsKTsKLSAgICB9Ci0gIGN1cl9wcm9jX3B0ciA9IGhvbGRfcHJvY19wdHI7Ci0gIGN1cl9maWxlX3B0ciA9IGhvbGRfZmlsZV9wdHI7Ci0KLSAgLyogT3V0cHV0IGFuIGVuZGluZyBzeW1ib2wgZm9yIGFsbCB0aGUgZmlsZXMuICBXZSBoYXZlIHRvIGRvIHRoaXMKLSAgICAgaGVyZSBmb3IgdGhlIGxhc3QgZmlsZSwgc28gd2UgbWF5IGFzIHdlbGwgZG8gaXQgZm9yIGFsbCBvZiB0aGUKLSAgICAgZmlsZXMuICAqLwotICBlbmRfd2FybmluZyA9IDA7Ci0gIGZvciAoZmlsX3B0ciA9IGZpcnN0X2ZpbGU7Ci0gICAgICAgZmlsX3B0ciAhPSAoZWZkcl90ICopIE5VTEw7Ci0gICAgICAgZmlsX3B0ciA9IGZpbF9wdHItPm5leHRfZmlsZSkKLSAgICB7Ci0gICAgICBjdXJfZmlsZV9wdHIgPSBmaWxfcHRyOwotICAgICAgd2hpbGUgKGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlICE9IChzY29wZV90ICopIE5VTEwKLQkgICAgICYmIGN1cl9maWxlX3B0ci0+Y3VyX3Njb3BlLT5wcmV2ICE9IChzY29wZV90ICopIE5VTEwpCi0JewotCSAgY3VyX2ZpbGVfcHRyLT5jdXJfc2NvcGUgPSBjdXJfZmlsZV9wdHItPmN1cl9zY29wZS0+cHJldjsKLQkgIGlmICghIGVuZF93YXJuaW5nICYmICEgY3VyX2ZpbGVfcHRyLT5mYWtlKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiTWlzc2luZyAuZW5kIG9yIC5iZW5kIGF0IGVuZCBvZiBmaWxlIikpOwotCSAgICAgIGVuZF93YXJuaW5nID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChjdXJfZmlsZV9wdHItPmN1cl9zY29wZSAhPSAoc2NvcGVfdCAqKSBOVUxMKQotCSh2b2lkKSBhZGRfZWNvZmZfc3ltYm9sICgoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCSBzdF9FbmQsIHNjX1RleHQsCi0JCQkJIChzeW1ib2xTICopIE5VTEwsCi0JCQkJIChiZmRfdm1hKSAwLAotCQkJCSAoc3ltaW50X3QpIDAsCi0JCQkJIChzeW1pbnRfdCkgMCk7Ci0gICAgfQotCi0gIC8qIEJ1aWxkIHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gICovCi0gIG9mZnNldCA9IDA7Ci0gIGJ1ZiA9IHhtYWxsb2MgKFBBR0VfU0laRSk7Ci0gIGJ1ZmVuZCA9IGJ1ZiArIFBBR0VfU0laRTsKLQotICAvKiBCdWlsZCB0aGUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24uICAqLwotICBoZHItPmNiTGluZU9mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfbGluZW5vIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBvZmZzZXQsCi0JCQkgICAgICAgJmhkci0+aWxpbmVNYXgpOwotICBoZHItPmNiTGluZSA9IG9mZnNldCAtIGhkci0+Y2JMaW5lT2Zmc2V0OwotCi0gIC8qIFdlIGRvbid0IHVzZSBkZW5zZSBudW1iZXJzIGF0IGFsbC4gICovCi0gIGhkci0+aWRuTWF4ID0gMDsKLSAgaGRyLT5jYkRuT2Zmc2V0ID0gMDsKLQotICAvKiBXZSBjYW4ndCBidWlsZCB0aGUgUERSIHRhYmxlIHVudGlsIHdlIGhhdmUgYnVpbHQgdGhlIHN5bWJvbHMsCi0gICAgIGJlY2F1c2UgYSBQRFIgY29udGFpbnMgYSBzeW1ib2wgaW5kZXguICBIb3dldmVyLCB3ZSBzZXQgYXNpZGUKLSAgICAgc3BhY2UgYXQgdGhpcyBwb2ludC4gICovCi0gIGhkci0+aXBkTWF4ID0gcHJvY19jbnQ7Ci0gIGhkci0+Y2JQZE9mZnNldCA9IG9mZnNldDsKLSAgaWYgKGJ1ZmVuZCAtIChidWYgKyBvZmZzZXQpIDwgcHJvY19jbnQgKiBleHRlcm5hbF9wZHJfc2l6ZSkKLSAgICAodm9pZCkgZWNvZmZfYWRkX2J5dGVzICgmYnVmLCAmYnVmZW5kLCBidWYgKyBvZmZzZXQsCi0JCQkgICAgcHJvY19jbnQgKiBleHRlcm5hbF9wZHJfc2l6ZSk7Ci0gIG9mZnNldCArPSBwcm9jX2NudCAqIGV4dGVybmFsX3Bkcl9zaXplOwotCi0gIC8qIEJ1aWxkIHRoZSBsb2NhbCBzeW1ib2xzLiAgKi8KLSAgaGRyLT5jYlN5bU9mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfc3ltYm9scyAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKLSAgaGRyLT5pc3ltTWF4ID0gKG9mZnNldCAtIGhkci0+Y2JTeW1PZmZzZXQpIC8gYmFja2VuZC0+ZXh0ZXJuYWxfc3ltX3NpemU7Ci0KLSAgLyogQnVpbGRpbmcgdGhlIHN5bWJvbHMgaW5pdGlhbGl6ZXMgdGhlIHN5bWJvbCBpbmRleCBpbiB0aGUgUERSJ3MuCi0gICAgIE5vdyB3ZSBjYW4gc3dhcCBvdXQgdGhlIFBEUidzLiAgKi8KLSAgKHZvaWQpIGVjb2ZmX2J1aWxkX3Byb2NzIChiYWNrZW5kLCAmYnVmLCAmYnVmZW5kLCBoZHItPmNiUGRPZmZzZXQpOwotCi0gIC8qIFdlIGRvbid0IHVzZSBvcHRpbWl6YXRpb24gc3ltYm9scy4gICovCi0gIGhkci0+aW9wdE1heCA9IDA7Ci0gIGhkci0+Y2JPcHRPZmZzZXQgPSAwOwotCi0gIC8qIFN3YXAgb3V0IHRoZSBhdXhpbGlhcnkgdHlwZSBpbmZvcm1hdGlvbi4gICovCi0gIGhkci0+Y2JBdXhPZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX2F1eCAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKLSAgaGRyLT5pYXV4TWF4ID0gKG9mZnNldCAtIGhkci0+Y2JBdXhPZmZzZXQpIC8gc2l6ZW9mICh1bmlvbiBhdXhfZXh0KTsKLQotICAvKiBDb3B5IG91dCB0aGUgbG9jYWwgc3RyaW5ncy4gICovCi0gIGhkci0+Y2JTc09mZnNldCA9IG9mZnNldDsKLSAgb2Zmc2V0ID0gZWNvZmZfYnVpbGRfc3MgKGJhY2tlbmQsICZidWYsICZidWZlbmQsIG9mZnNldCk7Ci0gIGhkci0+aXNzTWF4ID0gb2Zmc2V0IC0gaGRyLT5jYlNzT2Zmc2V0OwotCi0gIC8qIFdlIGRvbid0IHVzZSByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3JzLiAgKi8KLSAgaGRyLT5jcmZkID0gMDsKLSAgaGRyLT5jYlJmZE9mZnNldCA9IDA7Ci0KLSAgLyogU3dhcCBvdXQgdGhlIGZpbGUgZGVzY3JpcHRvcnMuICAqLwotICBoZHItPmNiRmRPZmZzZXQgPSBvZmZzZXQ7Ci0gIG9mZnNldCA9IGVjb2ZmX2J1aWxkX2ZkciAoYmFja2VuZCwgJmJ1ZiwgJmJ1ZmVuZCwgb2Zmc2V0KTsKLSAgaGRyLT5pZmRNYXggPSAob2Zmc2V0IC0gaGRyLT5jYkZkT2Zmc2V0KSAvIGJhY2tlbmQtPmV4dGVybmFsX2Zkcl9zaXplOwotCi0gIC8qIFNldCB1cCB0aGUgZXh0ZXJuYWwgc3ltYm9scywgd2hpY2ggYXJlIGhhbmRsZWQgYnkgdGhlIEJGRCBiYWNrCi0gICAgIGVuZC4gICovCi0gIGhkci0+aXNzRXh0TWF4ID0gMDsKLSAgaGRyLT5jYlNzRXh0T2Zmc2V0ID0gMDsKLSAgaGRyLT5pZXh0TWF4ID0gMDsKLSAgaGRyLT5jYkV4dE9mZnNldCA9IDA7Ci0gIGVjb2ZmX3NldHVwX2V4dCAoKTsKLQotICBrbm93ICgob2Zmc2V0ICYgKGJhY2tlbmQtPmRlYnVnX2FsaWduIC0gMSkpID09IDApOwotCi0gIC8qIEZJWE1FOiBUaGlzIHZhbHVlIHNob3VsZCBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIC52ZXJzdGFtcCBkaXJlY3RpdmUsCi0gICAgIHdpdGggcmVhc29uYWJsZSBkZWZhdWx0cyBpbiBjb25maWcgZmlsZXMuICAqLwotI2lmZGVmIFRDX0FMUEhBCi0gIGhkci0+dnN0YW1wID0gMHgwMzBiOwotI2Vsc2UKLSAgaGRyLT52c3RhbXAgPSAweDAyMGI7Ci0jZW5kaWYKLQotICAqYnVmcCA9IGJ1ZjsKLSAgcmV0dXJuIG9mZnNldDsKLX0KLQwKLS8qIEFsbG9jYXRlIGEgY2x1c3RlciBvZiBwYWdlcy4gICovCi0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLXN0YXRpYyBwYWdlX3R5cGUgKgotYWxsb2NhdGVfY2x1c3RlciAobnBhZ2VzKQotICAgICB1bnNpZ25lZCBsb25nIG5wYWdlczsKLXsKLSAgcmVnaXN0ZXIgcGFnZV90eXBlICp2YWx1ZSA9IChwYWdlX3R5cGUgKikgeG1hbGxvYyAobnBhZ2VzICogUEFHRV9VU0laRSk7Ci0KLSNpZmRlZiBFQ09GRl9ERUJVRwotICBpZiAoZGVidWcgPiAzKQotICAgIGZwcmludGYgKHN0ZGVyciwgIlx0YWxsb2NcdG5wYWdlcyA9ICVkLCB2YWx1ZSA9IDB4JS44eFxuIiwgbnBhZ2VzLCB2YWx1ZSk7Ci0jZW5kaWYKLQotICBtZW1zZXQgKHZhbHVlLCAwLCBucGFnZXMgKiBQQUdFX1VTSVpFKTsKLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLQotc3RhdGljIHBhZ2VfdHlwZSAqY2x1c3Rlcl9wdHIgPSBOVUxMOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFnZXNfbGVmdCA9IDA7Ci0KLSNlbmRpZiAvKiBNQUxMT0NfQ0hFQ0sgKi8KLQotLyogQWxsb2NhdGUgb25lIHBhZ2UgKHdoaWNoIGlzIGluaXRpYWxpemVkIHRvIDApLiAgKi8KLQotc3RhdGljIHBhZ2VfdHlwZSAqCi1hbGxvY2F0ZV9wYWdlICgpCi17Ci0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIGlmIChwYWdlc19sZWZ0ID09IDApCi0gICAgewotICAgICAgcGFnZXNfbGVmdCA9IE1BWF9DTFVTVEVSX1BBR0VTOwotICAgICAgY2x1c3Rlcl9wdHIgPSBhbGxvY2F0ZV9jbHVzdGVyIChwYWdlc19sZWZ0KTsKLSAgICB9Ci0KLSAgcGFnZXNfbGVmdC0tOwotICByZXR1cm4gY2x1c3Rlcl9wdHIrKzsKLQotI2Vsc2UJLyogTUFMTE9DX0NIRUNLICovCi0KLSAgcGFnZV90eXBlICpwdHI7Ci0KLSAgcHRyID0geG1hbGxvYyAoUEFHRV9VU0laRSk7Ci0gIG1lbXNldCAocHRyLCAwLCBQQUdFX1VTSVpFKTsKLSAgcmV0dXJuIHB0cjsKLQotI2VuZGlmCS8qIE1BTExPQ19DSEVDSyAqLwotfQotDAotLyogQWxsb2NhdGUgc2NvcGluZyBpbmZvcm1hdGlvbi4gICovCi0KLXN0YXRpYyBzY29wZV90ICoKLWFsbG9jYXRlX3Njb3BlICgpCi17Ci0gIHJlZ2lzdGVyIHNjb3BlX3QgKnB0cjsKLSAgc3RhdGljIHNjb3BlX3QgaW5pdGlhbF9zY29wZTsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICBwdHIgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5mcmVlX2xpc3QuZl9zY29wZTsKLSAgaWYgKHB0ciAhPSAoc2NvcGVfdCAqKSBOVUxMKQotICAgIGFsbG9jX2NvdW50c1sgKGludClhbGxvY190eXBlX3Njb3BlIF0uZnJlZV9saXN0LmZfc2NvcGUgPSBwdHItPmZyZWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQJPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS51bmFsbG9jYXRlZDsKLSAgICAgIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UJPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5jdXJfcGFnZTsKLQotICAgICAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0JewotCSAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHNjb3BlX3QpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zY29wZV0uY3VyX3BhZ2UgPSBjdXJfcGFnZSA9IGFsbG9jYXRlX3BhZ2UgKCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS50b3RhbF9wYWdlcysrOwotCX0KLQotICAgICAgcHRyID0gJmN1cl9wYWdlLT5zY29wZVstLXVuYWxsb2NhdGVkXTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0gICAgfQotCi0jZWxzZQotCi0gIHB0ciA9IChzY29wZV90ICopIHhtYWxsb2MgKHNpemVvZiAoc2NvcGVfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF9zY29wZTsKLSAgcmV0dXJuIHB0cjsKLX0KLQotLyogRnJlZSBzY29waW5nIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyZWVfc2NvcGUgKHB0cikKLSAgICAgc2NvcGVfdCAqcHRyOwotewotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS50b3RhbF9mcmVlKys7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0gIHB0ci0+ZnJlZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2NvcGVdLmZyZWVfbGlzdC5mX3Njb3BlOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3Njb3BlXS5mcmVlX2xpc3QuZl9zY29wZSA9IHB0cjsKLSNlbHNlCi0gIGZyZWUgKChQVFIpIHB0cik7Ci0jZW5kaWYKLX0KLQwKLS8qIEFsbG9jYXRlIGxpbmtzIGZvciBwYWdlcyBpbiBhIHZpcnR1YWwgYXJyYXkuICAqLwotCi1zdGF0aWMgdmxpbmtzX3QgKgotYWxsb2NhdGVfdmxpbmtzICgpCi17Ci0gIHJlZ2lzdGVyIHZsaW5rc190ICpwdHI7Ci0gIHN0YXRpYyB2bGlua3NfdCBpbml0aWFsX3ZsaW5rczsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3ZsaW5rc10uY3VyX3BhZ2U7Ci0KLSAgaWYgKHVuYWxsb2NhdGVkID09IDApCi0gICAgewotICAgICAgdW5hbGxvY2F0ZWQgPSBQQUdFX1NJWkUgLyBzaXplb2YgKHZsaW5rc190KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdmxpbmtzXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPnZsaW5rc1stLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHZsaW5rc190ICopIHhtYWxsb2MgKHNpemVvZiAodmxpbmtzX3QpKTsKLQotI2VuZGlmCi0KLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV92bGlua3NdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3ZsaW5rczsKLSAgcmV0dXJuIHB0cjsKLX0KLQwKLS8qIEFsbG9jYXRlIHN0cmluZyBoYXNoIGJ1Y2tldHMuICAqLwotCi1zdGF0aWMgc2hhc2hfdCAqCi1hbGxvY2F0ZV9zaGFzaCAoKQotewotICByZWdpc3RlciBzaGFzaF90ICpwdHI7Ci0gIHN0YXRpYyBzaGFzaF90IGluaXRpYWxfc2hhc2g7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9zaGFzaF0udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAoc2hhc2hfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3NoYXNoXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+c2hhc2hbLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHNoYXNoX3QgKikgeG1hbGxvYyAoc2l6ZW9mIChzaGFzaF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfc2hhc2hdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3NoYXNoOwotICByZXR1cm4gcHRyOwotfQotDAotLyogQWxsb2NhdGUgdHlwZSBoYXNoIGJ1Y2tldHMuICAqLwotCi1zdGF0aWMgdGhhc2hfdCAqCi1hbGxvY2F0ZV90aGFzaCAoKQotewotICByZWdpc3RlciB0aGFzaF90ICpwdHI7Ci0gIHN0YXRpYyB0aGFzaF90IGluaXRpYWxfdGhhc2g7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGFzaF0udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS5jdXJfcGFnZTsKLQotICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLSAgICB7Ci0gICAgICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodGhhc2hfdCk7Ci0gICAgICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoYXNoXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLnRvdGFsX3BhZ2VzKys7Ci0gICAgfQotCi0gIHB0ciA9ICZjdXJfcGFnZS0+dGhhc2hbLS11bmFsbG9jYXRlZF07Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHRoYXNoX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh0aGFzaF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhhc2hdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3RoYXNoOwotICByZXR1cm4gcHRyOwotfQotDAotLyogQWxsb2NhdGUgc3RydWN0dXJlLCB1bmlvbiwgb3IgZW51bSB0YWcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdGFnX3QgKgotYWxsb2NhdGVfdGFnICgpCi17Ci0gIHJlZ2lzdGVyIHRhZ190ICpwdHI7Ci0gIHN0YXRpYyB0YWdfdCBpbml0aWFsX3RhZzsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLQotICBwdHIgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10uZnJlZV9saXN0LmZfdGFnOwotICBpZiAocHRyICE9ICh0YWdfdCAqKSBOVUxMKQotICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS5mcmVlX2xpc3QuZl90YWcgPSBwdHItPmZyZWU7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZWdpc3RlciBpbnQgdW5hbGxvY2F0ZWQgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udW5hbGxvY2F0ZWQ7Ci0gICAgICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmN1cl9wYWdlOwotCi0gICAgICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLQl7Ci0JICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodGFnX3QpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmN1cl9wYWdlID0gY3VyX3BhZ2UgPSBhbGxvY2F0ZV9wYWdlICgpOwotCSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnRvdGFsX3BhZ2VzKys7Ci0JfQotCi0gICAgICBwdHIgPSAmY3VyX3BhZ2UtPnRhZ1stLXVuYWxsb2NhdGVkXTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGFnXS51bmFsbG9jYXRlZCA9IHVuYWxsb2NhdGVkOwotICAgIH0KLQotI2Vsc2UKLQotICBwdHIgPSAodGFnX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh0YWdfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RhZ10udG90YWxfYWxsb2MrKzsKLSAgKnB0ciA9IGluaXRpYWxfdGFnOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBGcmVlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV90YWcgKHB0cikKLSAgICAgdGFnX3QgKnB0cjsKLXsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLnRvdGFsX2ZyZWUrKzsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLSAgcHRyLT5mcmVlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZzsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90YWddLmZyZWVfbGlzdC5mX3RhZyA9IHB0cjsKLSNlbHNlCi0gIGZyZWUgKChQVFJfVCkgcHRyKTsKLSNlbmRpZgotfQotDAotLyogQWxsb2NhdGUgZm9yd2FyZCByZWZlcmVuY2UgdG8gYSB5ZXQgdW5rbm93biB0YWcuICAqLwotCi1zdGF0aWMgZm9yd2FyZF90ICoKLWFsbG9jYXRlX2ZvcndhcmQgKCkKLXsKLSAgcmVnaXN0ZXIgZm9yd2FyZF90ICpwdHI7Ci0gIHN0YXRpYyBmb3J3YXJkX3QgaW5pdGlhbF9mb3J3YXJkOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udW5hbGxvY2F0ZWQ7Ci0gIHJlZ2lzdGVyIHBhZ2VfdHlwZSAqY3VyX3BhZ2UgPSBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChmb3J3YXJkX3QpOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9mb3J3YXJkXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfZm9yd2FyZF0udG90YWxfcGFnZXMrKzsKLSAgICB9Ci0KLSAgcHRyID0gJmN1cl9wYWdlLT5mb3J3YXJkWy0tdW5hbGxvY2F0ZWRdOwotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKGZvcndhcmRfdCAqKSB4bWFsbG9jIChzaXplb2YgKGZvcndhcmRfdCkpOwotCi0jZW5kaWYKLQotICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX2ZvcndhcmRdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX2ZvcndhcmQ7Ci0gIHJldHVybiBwdHI7Ci19Ci0MCi0vKiBBbGxvY2F0ZSBoZWFkIG9mIHR5cGUgaGFzaCBsaXN0LiAgKi8KLQotc3RhdGljIHRoZWFkX3QgKgotYWxsb2NhdGVfdGhlYWQgKCkKLXsKLSAgcmVnaXN0ZXIgdGhlYWRfdCAqcHRyOwotICBzdGF0aWMgdGhlYWRfdCBpbml0aWFsX3RoZWFkOwotCi0jaWZuZGVmIE1BTExPQ19DSEVDSwotCi0gIHB0ciA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmZyZWVfbGlzdC5mX3RoZWFkOwotICBpZiAocHRyICE9ICh0aGVhZF90ICopIE5VTEwpCi0gICAgYWxsb2NfY291bnRzWyAoaW50KWFsbG9jX3R5cGVfdGhlYWQgXS5mcmVlX2xpc3QuZl90aGVhZCA9IHB0ci0+ZnJlZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCB1bmFsbG9jYXRlZCA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnVuYWxsb2NhdGVkOwotICAgICAgcmVnaXN0ZXIgcGFnZV90eXBlICpjdXJfcGFnZSA9IGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmN1cl9wYWdlOwotCi0gICAgICBpZiAodW5hbGxvY2F0ZWQgPT0gMCkKLQl7Ci0JICB1bmFsbG9jYXRlZCA9IFBBR0VfU0laRSAvIHNpemVvZiAodGhlYWRfdCk7Ci0JICBhbGxvY19jb3VudHNbKGludClhbGxvY190eXBlX3RoZWFkXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLQkgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnRvdGFsX3BhZ2VzKys7Ci0JfQotCi0gICAgICBwdHIgPSAmY3VyX3BhZ2UtPnRoZWFkWy0tdW5hbGxvY2F0ZWRdOwotICAgICAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0udW5hbGxvY2F0ZWQgPSB1bmFsbG9jYXRlZDsKLSAgICB9Ci0KLSNlbHNlCi0KLSAgcHRyID0gKHRoZWFkX3QgKikgeG1hbGxvYyAoc2l6ZW9mICh0aGVhZF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnRvdGFsX2FsbG9jKys7Ci0gICpwdHIgPSBpbml0aWFsX3RoZWFkOwotICByZXR1cm4gcHRyOwotfQotCi0vKiBGcmVlIHNjb3BpbmcgaW5mb3JtYXRpb24uICAqLwotCi1zdGF0aWMgdm9pZAotZnJlZV90aGVhZCAocHRyKQotICAgICB0aGVhZF90ICpwdHI7Ci17Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLnRvdGFsX2ZyZWUrKzsKLQotI2lmbmRlZiBNQUxMT0NfQ0hFQ0sKLSAgcHRyLT5mcmVlID0gKHRoZWFkX3QgKikgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV90aGVhZF0uZnJlZV9saXN0LmZfdGhlYWQ7Ci0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfdGhlYWRdLmZyZWVfbGlzdC5mX3RoZWFkID0gcHRyOwotI2Vsc2UKLSAgZnJlZSAoKFBUUl9UKSBwdHIpOwotI2VuZGlmCi19Ci0MCi1zdGF0aWMgbGluZW5vX2xpc3RfdCAqCi1hbGxvY2F0ZV9saW5lbm9fbGlzdCAoKQotewotICByZWdpc3RlciBsaW5lbm9fbGlzdF90ICpwdHI7Ci0gIHN0YXRpYyBsaW5lbm9fbGlzdF90IGluaXRpYWxfbGluZW5vX2xpc3Q7Ci0KLSNpZm5kZWYgTUFMTE9DX0NIRUNLCi0KLSAgcmVnaXN0ZXIgaW50IHVuYWxsb2NhdGVkID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnVuYWxsb2NhdGVkOwotICByZWdpc3RlciBwYWdlX3R5cGUgKmN1cl9wYWdlID0gYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLmN1cl9wYWdlOwotCi0gIGlmICh1bmFsbG9jYXRlZCA9PSAwKQotICAgIHsKLSAgICAgIHVuYWxsb2NhdGVkID0gUEFHRV9TSVpFIC8gc2l6ZW9mIChsaW5lbm9fbGlzdF90KTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS5jdXJfcGFnZSA9IGN1cl9wYWdlID0gYWxsb2NhdGVfcGFnZSAoKTsKLSAgICAgIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS50b3RhbF9wYWdlcysrOwotICAgIH0KLQotICBwdHIgPSAmY3VyX3BhZ2UtPmxpbmVub1stLXVuYWxsb2NhdGVkXTsKLSAgYWxsb2NfY291bnRzWyhpbnQpYWxsb2NfdHlwZV9saW5lbm9dLnVuYWxsb2NhdGVkID0gdW5hbGxvY2F0ZWQ7Ci0KLSNlbHNlCi0KLSAgcHRyID0gKGxpbmVub19saXN0X3QgKikgeG1hbGxvYyAoc2l6ZW9mIChsaW5lbm9fbGlzdF90KSk7Ci0KLSNlbmRpZgotCi0gIGFsbG9jX2NvdW50c1soaW50KWFsbG9jX3R5cGVfbGluZW5vXS50b3RhbF9hbGxvYysrOwotICAqcHRyID0gaW5pdGlhbF9saW5lbm9fbGlzdDsKLSAgcmV0dXJuIHB0cjsKLX0KLQotdm9pZAotZWNvZmZfc2V0X2dwX3Byb2xvZ19zaXplIChzeikKLSAgICAgaW50IHN6OwotewotICBpZiAoY3VyX3Byb2NfcHRyID09IDApCi0gICAgcmV0dXJuOwotCi0gIGN1cl9wcm9jX3B0ci0+cGRyLmdwX3Byb2xvZ3VlID0gc3o7Ci0gIGlmIChjdXJfcHJvY19wdHItPnBkci5ncF9wcm9sb2d1ZSAhPSBzeikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJHUCBwcm9sb2d1ZSBzaXplIGV4Y2VlZHMgZmllbGQgc2l6ZSwgdXNpbmcgMCBpbnN0ZWFkIikpOwotICAgICAgY3VyX3Byb2NfcHRyLT5wZHIuZ3BfcHJvbG9ndWUgPSAwOwotICAgIH0KLQotICBjdXJfcHJvY19wdHItPnBkci5ncF91c2VkID0gMTsKLX0KLQotaW50IAotZWNvZmZfbm9fY3VycmVudF9maWxlICgpCi17Ci0gIHJldHVybiBjdXJfZmlsZV9wdHIgPT0gKGVmZHJfdCAqKSBOVUxMOwotfQotCi12b2lkCi1lY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vICgpCi17Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBsaW5lbm9fbGlzdF90ICpsaXN0OwotCi0gIGFzX3doZXJlICgmZmlsZW5hbWUsICZsaW5lbm8pOwotCi0gIGlmIChjdXJyZW50X3N0YWJzX2ZpbGVuYW1lID09IChjaGFyICopTlVMTAotICAgICAgfHwgc3RyY21wIChjdXJyZW50X3N0YWJzX2ZpbGVuYW1lLCBmaWxlbmFtZSkpCi0gICAgYWRkX2ZpbGUgKGZpbGVuYW1lLCAwLCAxKTsKLQotICBsaXN0ID0gYWxsb2NhdGVfbGluZW5vX2xpc3QgKCk7Ci0KLSAgbGlzdC0+bmV4dCA9IChsaW5lbm9fbGlzdF90ICopIE5VTEw7Ci0gIGxpc3QtPmZpbGUgPSBjdXJfZmlsZV9wdHI7Ci0gIGxpc3QtPnByb2MgPSBjdXJfcHJvY19wdHI7Ci0gIGxpc3QtPmZyYWcgPSBmcmFnX25vdzsKLSAgbGlzdC0+cGFkZHIgPSBmcmFnX25vd19maXggKCk7Ci0gIGxpc3QtPmxpbmVubyA9IGxpbmVubzsKLQotICAvKiBXZSBkb24ndCB3YW50IHRvIG1lcmdlIGZpbGVzIHdoaWNoIGhhdmUgbGluZSBudW1iZXJzLiAgKi8KLSAgY3VyX2ZpbGVfcHRyLT5mZHIuZk1lcmdlID0gMDsKLQotICAvKiBBIC5sb2MgZGlyZWN0aXZlIHdpbGwgc29tZXRpbWVzIGFwcGVhciBiZWZvcmUgYSAuZW50IGRpcmVjdGl2ZSwKLSAgICAgd2hpY2ggbWVhbnMgdGhhdCBjdXJfcHJvY19wdHIgd2lsbCBiZSBOVUxMIGhlcmUuICBBcnJhbmdlIHRvCi0gICAgIHBhdGNoIHRoaXMgdXAuICAqLwotICBpZiAoY3VyX3Byb2NfcHRyID09IChwcm9jX3QgKikgTlVMTCkKLSAgICB7Ci0gICAgICBsaW5lbm9fbGlzdF90ICoqcGw7Ci0KLSAgICAgIHBsID0gJm5vcHJvY19saW5lbm87Ci0gICAgICB3aGlsZSAoKnBsICE9IChsaW5lbm9fbGlzdF90ICopIE5VTEwpCi0gICAgICAgIHBsID0gJigqcGwpLT5uZXh0OwotICAgICAgKnBsID0gbGlzdDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYXN0X2xpbmVubyA9IGxpc3Q7Ci0gICAgICAqbGFzdF9saW5lbm9fcHRyID0gbGlzdDsKLSAgICAgIGxhc3RfbGluZW5vX3B0ciA9ICZsaXN0LT5uZXh0OwotICAgIH0KLX0KLQotI2Vsc2UKLQotdm9pZAotZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKQotewotfQotCi0jZW5kaWYgLyogRUNPRkZfREVCVUdHSU5HICovCmRpZmYgLS1naXQgYS9nYXMvZWNvZmYuaCBiL2dhcy9lY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWM2NWY4Li4wMDAwMDAwCi0tLSBhL2dhcy9lY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qIGVjb2ZmLmggLS0gaGVhZGVyIGZpbGUgZm9yIEVDT0ZGIGRlYnVnZ2luZyBzdXBwb3J0Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IEN5Z251cyBTdXBwb3J0LgotICAgUHV0IHRvZ2V0aGVyIGJ5IElhbiBMYW5jZSBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBHQVNfRUNPRkZfSAotI2RlZmluZSBHQVNfRUNPRkZfSAotCi0jaWZkZWYgRUNPRkZfREVCVUdHSU5HCi0KLSNpbmNsdWRlICJjb2ZmL3N5bS5oIgotI2luY2x1ZGUgImNvZmYvZWNvZmYuaCIKLQotLyogV2hldGhlciB3ZSBoYXZlIHNlZW4gYW55IEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gICovCi1leHRlcm4gaW50IGVjb2ZmX2RlYnVnZ2luZ19zZWVuOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGFzc2VtYmx5LCBieQotICAgb2JqX3JlYWRfYmVnaW5faG9vay4gICovCi1leHRlcm4gdm9pZCBlY29mZl9yZWFkX2JlZ2luX2hvb2sgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXNzZW1ibGVyIHN3aXRjaGVzIHRvIGEgbmV3Ci0gICBmaWxlLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX25ld19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIG5ldyBzeW1ib2wgaXMgY3JlYXRlZCwgYnkKLSAgIG9ial9zeW1ib2xfbmV3X2hvb2suICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfc3ltYm9sX25ld19ob29rIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIG9ial9mcm9iX3N5bWJvbCBob29rLiAgKi8KLWV4dGVybiB2b2lkIGVjb2ZmX2Zyb2Jfc3ltYm9sIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotCi0vKiBCdWlsZCB0aGUgRUNPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5Ci0gICBvYmpfZnJvYl9maWxlLiAgVGhpcyBmaWxscyBpbiB0aGUgY291bnRzIGluICpIRFI7IHRoZSBvZmZzZXRzIGFyZQotICAgZmlsbGVkIGluIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgKkJVRlAuICBJdCBzZXRzICpCVUZQIHRvIGEKLSAgIGJsb2NrIG9mIG1lbW9yeSBob2xkaW5nIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBJdCByZXR1cm5zIHRoZQotICAgbGVuZ3RoIG9mICpCVUZQLiAgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIGVjb2ZmX2J1aWxkX2RlYnVnCi0gIFBBUkFNUyAoKEhEUlIgKmhkciwgY2hhciAqKmJ1ZnAsIGNvbnN0IHN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwICopKTsKLQotLyogRnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgRUNPRkYgZGVidWdnaW5nIGRpcmVjdGl2ZXMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2JlZ2luIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2JlbmQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZW5kIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2VudCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9mbWFzayBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9mcmFtZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9sb2MgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfbWFzayBQQVJBTVMgKChpbnQpKTsKLQotLyogT3RoZXIgRUNPRkYgZGlyZWN0aXZlcy4gICovCi1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZXh0ZXJuIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX3dlYWtleHQgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEZ1bmN0aW9ucyB0byBoYW5kbGUgdGhlIENPRkYgZGVidWdnaW5nIGRpcmVjdGl2ZXMuICAqLwotZXh0ZXJuIHZvaWQgZWNvZmZfZGlyZWN0aXZlX2RlZiBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9kaW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZW5kZWYgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfZmlsZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV9zY2wgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfc2l6ZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV90YWcgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBlY29mZl9kaXJlY3RpdmVfdHlwZSBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIGVjb2ZmX2RpcmVjdGl2ZV92YWwgUEFSQU1TICgoaW50KSk7Ci0KLS8qIEhhbmRsZSBzdGFicy4gICovCi1leHRlcm4gdm9pZCBlY29mZl9zdGFiIFBBUkFNUyAoKHNlZ1Qgc2VjLCBpbnQgd2hhdCwgY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCWludCB0eXBlLCBpbnQgb3RoZXIsIGludCBkZXNjKSk7Ci0KLS8qIFNldCB0aGUgR1AgcHJvbG9ndWUgc2l6ZS4gICovCi1leHRlcm4gdm9pZCBlY29mZl9zZXRfZ3BfcHJvbG9nX3NpemUgUEFSQU1TICgoaW50IHN6KSk7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSB0aGUgRUNPRkYgY29kZSB0byBzZXQgdGhlIGV4dGVybmFsCi0gICBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotI2lmbmRlZiBvYmpfZWNvZmZfc2V0X2V4dAotZXh0ZXJuIHZvaWQgb2JqX2Vjb2ZmX3NldF9leHQgUEFSQU1TICgoc3ltYm9sUyAqLCBFWFRSICopKTsKLSNlbmRpZgotCi0vKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwYXRjaCB1cCBhIGxpbmUgbnVtYmVyIGRpcmVjdGl2ZSB3aGVuCi0gICBpbnN0cnVjdGlvbnMgYXJlIG1vdmVkIGFyb3VuZC4gICovCi1leHRlcm4gdm9pZCBlY29mZl9maXhfbG9jIFBBUkFNUyAoKGZyYWdTICosIHVuc2lnbmVkIGxvbmcpKTsKLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSByZWFkLmMgdG8gcGVlayBhdCBjdXJfZmlsZV9wdHIuICAqLwotZXh0ZXJuIGludCBlY29mZl9ub19jdXJyZW50X2ZpbGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN5bWJvbCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgcHJvYy4gICovCi1leHRlcm4gc3ltYm9sUyAqZWNvZmZfZ2V0X2N1cl9wcm9jX3N5bSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBFQ09GRl9ERUJVR0dJTkcgKi8KLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHJlYWQuYyB0byBnZW5lcmF0ZSBsaW5lIG51bWJlciBmb3IgLnMgZmlsZS4gICovCi1leHRlcm4gdm9pZCBlY29mZl9nZW5lcmF0ZV9hc21fbGluZW5vIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmIC8qICEgR0FTX0VDT0ZGX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9laG9wdC5jIGIvZ2FzL2Vob3B0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYTVmNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL2Vob3B0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjkgKzAsMCBAQAotLyogZWhvcHQuYy0tb3B0aW1pemUgZ2NjIGV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotLyogV2UgaW5jbHVkZSB0aGlzIEVMRiBmaWxlLCBldmVuIHRob3VnaCB3ZSBtYXkgbm90IGJlIGFzc2VtYmxpbmcgZm9yCi0gICBFTEYsIHNpbmNlIHRoZSBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24gaXMgYWx3YXlzIGluIGEgZm9ybWF0Ci0gICBkZXJpdmVkIGZyb20gRFdBUkYuICAqLwotCi0jaW5jbHVkZSAiZWxmL2R3YXJmMi5oIgotCi0vKiBUcnkgdG8gb3B0aW1pemUgZ2NjIDIuOCBleGNlcHRpb24gZnJhbWUgaW5mb3JtYXRpb24uCi0KLSAgIEV4Y2VwdGlvbiBmcmFtZSBpbmZvcm1hdGlvbiBpcyBlbWl0dGVkIGZvciBldmVyeSBmdW5jdGlvbiBpbiB0aGUKLSAgIC5laF9mcmFtZSBzZWN0aW9uLiAgU2ltcGxlIGluZm9ybWF0aW9uIGZvciBhIGZ1bmN0aW9uIHdpdGggbm8KLSAgIGV4Y2VwdGlvbnMgbG9va3MgbGlrZSB0aGlzOgotCi1fX0ZSQU1FX0JFR0lOX186Ci0JLjRieXRlCS5MTENJRTEJLyBMZW5ndGggb2YgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5Ci0uTFNDSUUxOgotCS40Ynl0ZQkweDAJLyBDSUUgSWRlbnRpZmllciBUYWcKLQkuYnl0ZQkweDEJLyBDSUUgVmVyc2lvbgotCS5ieXRlCTB4MAkvIENJRSBBdWdtZW50YXRpb24gKG5vbmUpCi0JLmJ5dGUJMHgxCS8gVUxFQjEyOCAweDEgKENJRSBDb2RlIEFsaWdubWVudCBGYWN0b3IpCi0JLmJ5dGUJMHg3YwkvIFNMRUIxMjggLTQgKENJRSBEYXRhIEFsaWdubWVudCBGYWN0b3IpCi0JLmJ5dGUJMHg4CS8gQ0lFIFJBIENvbHVtbgotCS5ieXRlCTB4YwkvIERXX0NGQV9kZWZfY2ZhCi0JLmJ5dGUJMHg0CS8gVUxFQjEyOCAweDQKLQkuYnl0ZQkweDQJLyBVTEVCMTI4IDB4NAotCS5ieXRlCTB4ODgJLyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg4Ci0JLmJ5dGUJMHgxCS8gVUxFQjEyOCAweDEKLQkuYWxpZ24gNAotLkxFQ0lFMToKLQkuc2V0CS5MTENJRTEsLkxFQ0lFMS0uTFNDSUUxCS8gQ0lFIExlbmd0aCBTeW1ib2wKLQkuNGJ5dGUJLkxMRkRFMQkvIEZERSBMZW5ndGgKLS5MU0ZERTE6Ci0JLjRieXRlCS5MU0ZERTEtX19GUkFNRV9CRUdJTl9fCS8gRkRFIENJRSBvZmZzZXQKLQkuNGJ5dGUJLkxGQjEJLyBGREUgaW5pdGlhbCBsb2NhdGlvbgotCS40Ynl0ZQkuTEZFMS0uTEZCMQkvIEZERSBhZGRyZXNzIHJhbmdlCi0JLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkuTENGSTAtLkxGQjEKLQkuYnl0ZQkweGUJLyBEV19DRkFfZGVmX2NmYV9vZmZzZXQKLQkuYnl0ZQkweDgJLyBVTEVCMTI4IDB4OAotCS5ieXRlCTB4ODUJLyBEV19DRkFfb2Zmc2V0LCBjb2x1bW4gMHg1Ci0JLmJ5dGUJMHgyCS8gVUxFQjEyOCAweDIKLQkuYnl0ZQkweDQJLyBEV19DRkFfYWR2YW5jZV9sb2M0Ci0JLjRieXRlCS5MQ0ZJMS0uTENGSTAKLQkuYnl0ZQkweGQJLyBEV19DRkFfZGVmX2NmYV9yZWdpc3RlcgotCS5ieXRlCTB4NQkvIFVMRUIxMjggMHg1Ci0JLmJ5dGUJMHg0CS8gRFdfQ0ZBX2FkdmFuY2VfbG9jNAotCS40Ynl0ZQkuTENGSTItLkxDRkkxCi0JLmJ5dGUJMHgyZQkvIERXX0NGQV9HTlVfYXJnc19zaXplCi0JLmJ5dGUJMHg0CS8gVUxFQjEyOCAweDQKLQkuYnl0ZQkweDQJLyBEV19DRkFfYWR2YW5jZV9sb2M0Ci0JLjRieXRlCS5MQ0ZJMy0uTENGSTIKLQkuYnl0ZQkweDJlCS8gRFdfQ0ZBX0dOVV9hcmdzX3NpemUKLQkuYnl0ZQkweDAJLyBVTEVCMTI4IDB4MAotCS5hbGlnbiA0Ci0uTEVGREUxOgotCS5zZXQJLkxMRkRFMSwuTEVGREUxLS5MU0ZERTEJLyBGREUgTGVuZ3RoIFN5bWJvbAotCi0gICBUaGUgaW1tZWRpYXRlIGlzc3VlIHdlIGNhbiBhZGRyZXNzIGluIHRoZSBhc3NlbWJsZXIgaXMgdGhlCi0gICBEV19DRkFfYWR2YW5jZV9sb2M0IGZvbGxvd2VkIGJ5IGEgZm91ciBieXRlIHZhbHVlLiAgVGhlIHZhbHVlIGlzCi0gICB0aGUgZGlmZmVyZW5jZSBvZiB0d28gYWRkcmVzc2VzIGluIHRoZSBmdW5jdGlvbi4gIFNpbmNlIGdjYyBkb2VzCi0gICBub3Qga25vdyB0aGlzIHZhbHVlLCBpdCBhbHdheXMgdXNlcyBmb3VyIGJ5dGVzLiAgV2Ugd2lsbCBrbm93IHRoZQotICAgdmFsdWUgYXQgdGhlIGVuZCBvZiBhc3NlbWJseSwgc28gd2UgY2FuIGRvIGJldHRlci4gICovCi0KLXN0YXRpYyBpbnQgZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgUEFSQU1TICgodm9pZCkpOwotCi0vKiBHZXQgdGhlIGNvZGUgYWxpZ25tZW50IGZhY3RvciBmcm9tIHRoZSBDSUUuICAqLwotCi1zdGF0aWMgaW50Ci1laF9mcmFtZV9jb2RlX2FsaWdubWVudCAoKQotewotICBzdGF0aWMgaW50IGNvZGVfYWxpZ25tZW50OwotICBzZWdUIGN1cnJlbnRfc2VnOwotICBzdWJzZWdUIGN1cnJlbnRfc3Vic2VnOwotICBmcmFnUyAqZjsKLSAgZml4UyAqZml4OwotICBpbnQgb2Zmc2V0OwotICBjaGFyIGF1Z21lbnRhdGlvblsxMF07Ci0gIGludCBpYXVnOwotCi0gIGlmIChjb2RlX2FsaWdubWVudCAhPSAwKQotICAgIHJldHVybiBjb2RlX2FsaWdubWVudDsKLQotICAvKiBXZSBzaG91bGQgZmluZCB0aGUgQ0lFIGF0IHRoZSBzdGFydCBvZiB0aGUgLmVoX2ZyYW1lIHNlY3Rpb24uICAqLwotCi0gIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLSAgY3VycmVudF9zdWJzZWcgPSBub3dfc3Vic2VnOwotICBzdWJzZWdfbmV3ICgiLmVoX2ZyYW1lIiwgMCk7Ci0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykKLSAgZiA9IHNlZ19pbmZvIChub3dfc2VnKS0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSNlbHNlCi0gIGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OwotI2VuZGlmCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmaXggPSBzZWdfaW5mbyAobm93X3NlZyktPmZyY2hhaW5QLT5maXhfcm9vdDsKLSNlbHNlCi0gIGZpeCA9ICpzZWdfZml4X3Jvb3RQOwotI2VuZGlmCi0gIHN1YnNlZ19zZXQgKGN1cnJlbnRfc2VnLCBjdXJyZW50X3N1YnNlZyk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBmcmFncyBvZiB0aGUgc2VjdGlvbiB0byBmaW5kIHRoZSBjb2RlIGFsaWdubWVudC4gICovCi0KLSAgLyogRmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIENJRSBJZGVudGlmaWVyIFRhZyBpcyAwLiAgKi8KLQotICBvZmZzZXQgPSA0OwotICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCi0gICAgewotICAgICAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKLSAgICAgIGYgPSBmLT5mcl9uZXh0OwotICAgIH0KLSAgaWYgKGYgPT0gTlVMTAotICAgICAgfHwgZi0+ZnJfZml4IC0gb2Zmc2V0IDwgNAotICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXRdICE9IDAKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0ICsgMV0gIT0gMAotICAgICAgfHwgZi0+ZnJfbGl0ZXJhbFtvZmZzZXQgKyAyXSAhPSAwCi0gICAgICB8fCBmLT5mcl9saXRlcmFsW29mZnNldCArIDNdICE9IDApCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgLyogTmV4dCBtYWtlIHN1cmUgdGhlIENJRSB2ZXJzaW9uIG51bWJlciBpcyAxLiAgKi8KLQotICBvZmZzZXQgKz0gNDsKLSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotICAgIHsKLSAgICAgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0gICAgICBmID0gZi0+ZnJfbmV4dDsKLSAgICB9Ci0gIGlmIChmID09IE5VTEwKLSAgICAgIHx8IGYtPmZyX2ZpeCAtIG9mZnNldCA8IDEKLSAgICAgIHx8IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAhPSAxKQotICAgIHsKLSAgICAgIGNvZGVfYWxpZ25tZW50ID0gLTE7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIFNraXAgdGhlIGF1Z21lbnRhdGlvbiAoYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nKS4gICovCi0KLSAgaWF1ZyA9IDA7Ci0gICsrb2Zmc2V0OwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICB3aGlsZSAoZiAhPSBOVUxMICYmIG9mZnNldCA+PSBmLT5mcl9maXgpCi0JewotCSAgb2Zmc2V0IC09IGYtPmZyX2ZpeDsKLQkgIGYgPSBmLT5mcl9uZXh0OwotCX0KLSAgICAgIGlmIChmID09IE5VTEwpCi0JewotCSAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICB3aGlsZSAob2Zmc2V0IDwgZi0+ZnJfZml4ICYmIGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAhPSAnXDAnKQotCXsKLQkgIGlmICgoc2l6ZV90KSBpYXVnIDwgKHNpemVvZiBhdWdtZW50YXRpb24pIC0gMSkKLQkgICAgewotCSAgICAgIGF1Z21lbnRhdGlvbltpYXVnXSA9IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XTsKLQkgICAgICArK2lhdWc7Ci0JICAgIH0KLQkgICsrb2Zmc2V0OwotCX0KLSAgICAgIGlmIChvZmZzZXQgPCBmLT5mcl9maXgpCi0JYnJlYWs7Ci0gICAgfQotICArK29mZnNldDsKLSAgd2hpbGUgKGYgIT0gTlVMTCAmJiBvZmZzZXQgPj0gZi0+ZnJfZml4KQotICAgIHsKLSAgICAgIG9mZnNldCAtPSBmLT5mcl9maXg7Ci0gICAgICBmID0gZi0+ZnJfbmV4dDsKLSAgICB9Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgYXVnbWVudGF0aW9uW2lhdWddID0gJ1wwJzsKLSAgaWYgKGF1Z21lbnRhdGlvblswXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIE5vIGF1Z21lbnRhdGlvbi4gICovCi0gICAgfQotICBlbHNlIGlmIChzdHJjbXAgKGF1Z21lbnRhdGlvbiwgImVoIikgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIHNraXAgYSBwb2ludGVyLiAgVW5mb3J0dW5hdGVseSwgd2UgZG9uJ3Qga25vdyBob3cKLQkgbGFyZ2UgaXQgaXMuICBXZSBmaW5kIG91dCBieSBsb29raW5nIGZvciBhIG1hdGNoaW5nIGZpeHVwLiAgKi8KLSAgICAgIHdoaWxlIChmaXggIT0gTlVMTAotCSAgICAgJiYgKGZpeC0+ZnhfZnJhZyAhPSBmIHx8IGZpeC0+Znhfd2hlcmUgIT0gb2Zmc2V0KSkKLQlmaXggPSBmaXgtPmZ4X25leHQ7Ci0gICAgICBpZiAoZml4ID09IE5VTEwpCi0Jb2Zmc2V0ICs9IDQ7Ci0gICAgICBlbHNlCi0Jb2Zmc2V0ICs9IGZpeC0+Znhfc2l6ZTsKLSAgICAgIHdoaWxlIChmICE9IE5VTEwgJiYgb2Zmc2V0ID49IGYtPmZyX2ZpeCkKLQl7Ci0JICBvZmZzZXQgLT0gZi0+ZnJfZml4OwotCSAgZiA9IGYtPmZyX25leHQ7Ci0JfQotICAgICAgaWYgKGYgPT0gTlVMTCkKLQl7Ci0JICBjb2RlX2FsaWdubWVudCA9IC0xOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb2RlX2FsaWdubWVudCA9IC0xOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBXZSdyZSBub3cgYXQgdGhlIGNvZGUgYWxpZ25tZW50IGZhY3Rvciwgd2hpY2ggaXMgYSBVTEVCMTI4LiAgSWYKLSAgICAgaXQgaXNuJ3QgYSBzaW5nbGUgYnl0ZSwgZm9yZ2V0IGl0LiAgKi8KLQotICBjb2RlX2FsaWdubWVudCA9IGYtPmZyX2xpdGVyYWxbb2Zmc2V0XSAmIDB4ZmY7Ci0gIGlmICgoY29kZV9hbGlnbm1lbnQgJiAweDgwKSAhPSAwIHx8IGNvZGVfYWxpZ25tZW50ID09IDApCi0gICAgewotICAgICAgY29kZV9hbGlnbm1lbnQgPSAtMTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGNvZGVfYWxpZ25tZW50OwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGVtaXRfZXhwci4gIEl0IGxvb2tzIGZvciBjYXNlcyB3aGljaAotICAgd2UgY2FuIG9wdGltaXplLgotCi0gICBSYXRoZXIgdGhhbiB0cnkgdG8gcGFyc2UgYWxsIHRoaXMgaW5mb3JtYXRpb24gYXMgd2UgcmVhZCBpdCwgd2UKLSAgIGxvb2sgZm9yIGEgc2luZ2xlIGJ5dGUgRFdfQ0ZBX2FkdmFuY2VfbG9jNCBmb2xsb3dlZCBieSBhIDQgYnl0ZQotICAgZGlmZmVyZW5jZS4gIFdlIHR1cm4gdGhhdCBpbnRvIGEgcnNfY2ZhX2FkdmFuY2UgZnJhZywgYW5kIGhhbmRsZQotICAgdGhvc2UgZnJhZ3MgYXQgdGhlIGVuZCBvZiB0aGUgYXNzZW1ibHkuICBJZiB0aGUgZ2NjIG91dHB1dCBjaGFuZ2VzCi0gICBzb21ld2hhdCwgdGhpcyBvcHRpbWl6YXRpb24gbWF5IHN0b3Agd29ya2luZy4KLQotICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5vbi16ZXJvIGlmIGl0IGhhbmRsZWQgdGhlIGV4cHJlc3Npb24gYW5kCi0gICBlbWl0X2V4cHIgc2hvdWxkIG5vdCBkbyBhbnl0aGluZywgb3IgemVybyBvdGhlcndpc2UuICBJdCBjYW4gYWxzbwotICAgY2hhbmdlICpFWFAgYW5kICpQTkJZVEVTLiAgKi8KLQotaW50Ci1jaGVja19laF9mcmFtZSAoZXhwLCBwbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgKnBuYnl0ZXM7Ci17Ci0gIHN0YXRpYyBpbnQgc2F3X3NpemU7Ci0gIHN0YXRpYyBzeW1ib2xTICpzaXplX2VuZF9zeW07Ci0gIHN0YXRpYyBpbnQgc2F3X2FkdmFuY2VfbG9jNDsKLSAgc3RhdGljIGZyYWdTICpsb2M0X2ZyYWc7Ci0gIHN0YXRpYyBpbnQgbG9jNF9maXg7Ci0KLSAgaWYgKHNhd19zaXplCi0gICAgICAmJiBTX0lTX0RFRklORUQgKHNpemVfZW5kX3N5bSkpCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBjb21lIHRvIHRoZSBlbmQgb2YgdGhlIENJRSBvciBGREUuICBTZWUgYmVsb3cgd2hlcmUKLSAgICAgICAgIHdlIHNldCBzYXdfc2l6ZS4gIFdlIG11c3QgY2hlY2sgdGhpcyBmaXJzdCBiZWNhdXNlIHdlIG1heSBub3cKLSAgICAgICAgIGJlIGxvb2tpbmcgYXQgdGhlIG5leHQgc2l6ZS4gICovCi0gICAgICBzYXdfc2l6ZSA9IDA7Ci0gICAgICBzYXdfYWR2YW5jZV9sb2M0ID0gMDsKLSAgICB9Ci0KLSAgaWYgKGZsYWdfdHJhZGl0aW9uYWxfZm9ybWF0KQotICAgIHsKLSAgICAgIC8qIERvbid0IG9wdGltaXplLiAgKi8KLSAgICB9Ci0gIGVsc2UgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5laF9mcmFtZSIpICE9IDApCi0gICAgewotICAgICAgc2F3X3NpemUgPSAwOwotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0gICAgfQotICBlbHNlIGlmICghIHNhd19zaXplCi0JICAgJiYgKnBuYnl0ZXMgPT0gNCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIG1pZ2h0IGJlIHRoZSBzaXplIG9mIHRoZSBDSUUgb3IgRkRFLiAgV2Ugd2FudCB0byBrbm93Ci0gICAgICAgICB0aGUgc2l6ZSBzbyB0aGF0IHdlIGRvbid0IGFjY2lkZW50YWxseSBvcHRpbWl6ZSBhY3Jvc3MgYW4gRkRFCi0gICAgICAgICBib3VuZGFyeS4gIFdlIHJlY29nbml6ZSB0aGUgc2l6ZSBpbiBvbmUgb2YgdHdvIGZvcm1zOiBhCi0gICAgICAgICBzeW1ib2wgd2hpY2ggd2lsbCBsYXRlciBiZSBkZWZpbmVkIGFzIGEgZGlmZmVyZW5jZSwgb3IgYQotICAgICAgICAgc3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMuICBFaXRoZXIgd2F5LCB3ZSBjYW4gdGVsbCB3aGVuIHdlCi0gICAgICAgICBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgRkRFIGJlY2F1c2UgdGhlIHN5bWJvbCBiZWNvbWVzIGRlZmluZWQKLSAgICAgICAgIChpbiB0aGUgY2FzZSBvZiBhIHN1YnRyYWN0aW9uLCB0aGUgZW5kIHN5bWJvbCwgZnJvbSB3aGljaCB0aGUKLSAgICAgICAgIHN0YXJ0IHN5bWJvbCBpcyBiZWluZyBzdWJ0cmFjdGVkKS4gIE90aGVyIHdheXMgb2YgZGVzY3JpYmluZwotICAgICAgICAgdGhlIHNpemUgd2lsbCBub3QgYmUgb3B0aW1pemVkLiAgKi8KLSAgICAgIGlmICgoZXhwLT5YX29wID09IE9fc3ltYm9sIHx8IGV4cC0+WF9vcCA9PSBPX3N1YnRyYWN0KQotCSAgJiYgISBTX0lTX0RFRklORUQgKGV4cC0+WF9hZGRfc3ltYm9sKSkKLQl7Ci0JICBzYXdfc2l6ZSA9IDE7Ci0JICBzaXplX2VuZF9zeW0gPSBleHAtPlhfYWRkX3N5bWJvbDsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzYXdfc2l6ZQotCSAgICYmICpwbmJ5dGVzID09IDEKLQkgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IERXX0NGQV9hZHZhbmNlX2xvYzQpCi0gICAgewotICAgICAgLyogVGhpcyBtaWdodCBiZSBhIERXX0NGQV9hZHZhbmNlX2xvYzQuICBSZWNvcmQgdGhlIGZyYWcgYW5kIHRoZQotICAgICAgICAgcG9zaXRpb24gd2l0aGluIHRoZSBmcmFnLCBzbyB0aGF0IHdlIGNhbiBjaGFuZ2UgaXQgbGF0ZXIuICAqLwotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDE7Ci0gICAgICBmcmFnX2dyb3cgKDEpOwotICAgICAgbG9jNF9mcmFnID0gZnJhZ19ub3c7Ci0gICAgICBsb2M0X2ZpeCA9IGZyYWdfbm93X2ZpeCAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHNhd19hZHZhbmNlX2xvYzQKLQkgICAmJiAqcG5ieXRlcyA9PSA0Ci0JICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaW50IGNhOwotCi0gICAgICAvKiBUaGlzIGlzIGEgY2FzZSB3aGljaCB3ZSBjYW4gb3B0aW1pemUuICBUaGUgdHdvIHN5bWJvbHMgYmVpbmcKLSAgICAgICAgIHN1YnRyYWN0ZWQgd2VyZSBpbiB0aGUgc2FtZSBmcmFnIGFuZCB0aGUgZXhwcmVzc2lvbiB3YXMKLSAgICAgICAgIHJlZHVjZWQgdG8gYSBjb25zdGFudC4gIFdlIGNhbiBkbyB0aGUgb3B0aW1pemF0aW9uIGVudGlyZWx5Ci0gICAgICAgICBpbiB0aGlzIGZ1bmN0aW9uLiAgKi8KLQotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0KLSAgICAgIGNhID0gZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCk7Ci0gICAgICBpZiAoY2EgPCAwKQotCXsKLQkgIC8qIERvbid0IG9wdGltaXplLiAgKi8KLQl9Ci0gICAgICBlbHNlIGlmIChleHAtPlhfYWRkX251bWJlciAlIGNhID09IDAKLQkgICAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgLyBjYSA8IDB4NDApCi0JewotCSAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XQotCSAgICA9IERXX0NGQV9hZHZhbmNlX2xvYyB8IChleHAtPlhfYWRkX251bWJlciAvIGNhKTsKLQkgIC8qIE5vIG1vcmUgYnl0ZXMgbmVlZGVkLiAgKi8KLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UgaWYgKGV4cC0+WF9hZGRfbnVtYmVyIDwgMHgxMDApCi0JewotCSAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XSA9IERXX0NGQV9hZHZhbmNlX2xvYzE7Ci0JICAqcG5ieXRlcyA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoZXhwLT5YX2FkZF9udW1iZXIgPCAweDEwMDAwKQotCXsKLQkgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MyOwotCSAgKnBuYnl0ZXMgPSAyOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKHNhd19hZHZhbmNlX2xvYzQKLQkgICAmJiAqcG5ieXRlcyA9PSA0Ci0JICAgJiYgZXhwLT5YX29wID09IE9fc3VidHJhY3QpCi0gICAgewotCi0gICAgICAvKiBUaGlzIGlzIGEgY2FzZSB3ZSBjYW4gb3B0aW1pemUuICBUaGUgZXhwcmVzc2lvbiB3YXMgbm90Ci0gICAgICAgICByZWR1Y2VkLCBzbyB3ZSBjYW4gbm90IGZpbmlzaCB0aGUgb3B0aW1pemF0aW9uIHVudGlsIHRoZSBlbmQKLSAgICAgICAgIG9mIHRoZSBhc3NlbWJseS4gIFdlIHNldCB1cCBhIHZhcmlhbnQgZnJhZyB3aGljaCB3ZSBoYW5kbGUKLSAgICAgICAgIGxhdGVyLiAgKi8KLQotICAgICAgc2F3X2FkdmFuY2VfbG9jNCA9IDA7Ci0KLSAgICAgIGZyYWdfdmFyIChyc19jZmEsIDQsIDAsIDAsIG1ha2VfZXhwcl9zeW1ib2wgKGV4cCksCi0JCWxvYzRfZml4LCAoY2hhciAqKSBsb2M0X2ZyYWcpOwotCi0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzYXdfYWR2YW5jZV9sb2M0ID0gMDsKLQotICByZXR1cm4gMDsKLX0KLQotLyogVGhlIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgc2l6ZSBvZiBhIHJzX2NmYSB2YXJpYW50IGZyYWcgYmFzZWQgb24KLSAgIHRoZSBjdXJyZW50IHZhbHVlcyBvZiB0aGUgc3ltYm9scy4gIEl0IGlzIGNhbGxlZCBiZWZvcmUgdGhlCi0gICByZWxheGF0aW9uIGxvb3AuICBXZSBzZXQgZnJfc3VidHlwZSB0byB0aGUgZXhwZWN0ZWQgbGVuZ3RoLiAgKi8KLQotaW50Ci1laF9mcmFtZV9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGludCBjYTsKLSAgb2Zmc2V0VCBkaWZmOwotICBpbnQgcmV0OwotCi0gIGNhID0gZWhfZnJhbWVfY29kZV9hbGlnbm1lbnQgKCk7Ci0gIGRpZmYgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZy0+ZnJfc3ltYm9sLCAwKTsKLQotICBpZiAoY2EgPCAwKQotICAgIHJldCA9IDQ7Ci0gIGVsc2UgaWYgKGRpZmYgJSBjYSA9PSAwICYmIGRpZmYgLyBjYSA8IDB4NDApCi0gICAgcmV0ID0gMDsKLSAgZWxzZSBpZiAoZGlmZiA8IDB4MTAwKQotICAgIHJldCA9IDE7Ci0gIGVsc2UgaWYgKGRpZmYgPCAweDEwMDAwKQotICAgIHJldCA9IDI7Ci0gIGVsc2UKLSAgICByZXQgPSA0OwotCi0gIGZyYWctPmZyX3N1YnR5cGUgPSByZXQ7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZWxheGVzIGEgcnNfY2ZhIHZhcmlhbnQgZnJhZyBiYXNlZCBvbiB0aGUgY3VycmVudAotICAgdmFsdWVzIG9mIHRoZSBzeW1ib2xzLiAgZnJfc3VidHlwZSBpcyB0aGUgY3VycmVudCBsZW5ndGggb2YgdGhlCi0gICBmcmFnLiAgVGhpcyByZXR1cm5zIHRoZSBjaGFuZ2UgaW4gZnJhZyBsZW5ndGguICAqLwotCi1pbnQKLWVoX2ZyYW1lX3JlbGF4X2ZyYWcgKGZyYWcpCi0gICAgIGZyYWdTICpmcmFnOwotewotICBpbnQgb2xkc2l6ZSwgbmV3c2l6ZTsKLQotICBvbGRzaXplID0gZnJhZy0+ZnJfc3VidHlwZTsKLSAgbmV3c2l6ZSA9IGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnKTsKLSAgcmV0dXJuIG5ld3NpemUgLSBvbGRzaXplOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgcnNfY2ZhIHZhcmlhbnQgZnJhZyBpbnRvIGEgbm9ybWFsIGZpbGwKLSAgIGZyYWcuICBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbGwgcmVsYXhhdGlvbiBoYXMgYmVlbiBkb25lLgotICAgZnJfc3VidHlwZSB3aWxsIGJlIHRoZSBkZXNpcmVkIGxlbmd0aCBvZiB0aGUgZnJhZy4gICovCi0KLXZvaWQKLWVoX2ZyYW1lX2NvbnZlcnRfZnJhZyAoZnJhZykKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIG9mZnNldFQgZGlmZjsKLSAgZnJhZ1MgKmxvYzRfZnJhZzsKLSAgaW50IGxvYzRfZml4OwotCi0gIGxvYzRfZnJhZyA9IChmcmFnUyAqKSBmcmFnLT5mcl9vcGNvZGU7Ci0gIGxvYzRfZml4ID0gKGludCkgZnJhZy0+ZnJfb2Zmc2V0OwotCi0gIGRpZmYgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZnJhZy0+ZnJfc3ltYm9sLCAxKTsKLQotICBpZiAoZnJhZy0+ZnJfc3VidHlwZSA9PSAwKQotICAgIHsKLSAgICAgIGludCBjYTsKLQotICAgICAgY2EgPSBlaF9mcmFtZV9jb2RlX2FsaWdubWVudCAoKTsKLSAgICAgIGFzc2VydCAoY2EgPiAwICYmIGRpZmYgJSBjYSA9PSAwICYmIGRpZmYgLyBjYSA8IDB4NDApOwotICAgICAgbG9jNF9mcmFnLT5mcl9saXRlcmFsW2xvYzRfZml4XSA9IERXX0NGQV9hZHZhbmNlX2xvYyB8IChkaWZmIC8gY2EpOwotICAgIH0KLSAgZWxzZSBpZiAoZnJhZy0+ZnJfc3VidHlwZSA9PSAxKQotICAgIHsKLSAgICAgIGFzc2VydCAoZGlmZiA8IDB4MTAwKTsKLSAgICAgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MxOwotICAgICAgZnJhZy0+ZnJfbGl0ZXJhbFtmcmFnLT5mcl9maXhdID0gZGlmZjsKLSAgICB9Ci0gIGVsc2UgaWYgKGZyYWctPmZyX3N1YnR5cGUgPT0gMikKLSAgICB7Ci0gICAgICBhc3NlcnQgKGRpZmYgPCAweDEwMDAwKTsKLSAgICAgIGxvYzRfZnJhZy0+ZnJfbGl0ZXJhbFtsb2M0X2ZpeF0gPSBEV19DRkFfYWR2YW5jZV9sb2MyOwotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChmcmFnLT5mcl9saXRlcmFsICsgZnJhZy0+ZnJfZml4LCBkaWZmLCAyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBtZF9udW1iZXJfdG9fY2hhcnMgKGZyYWctPmZyX2xpdGVyYWwgKyBmcmFnLT5mcl9maXgsIGRpZmYsIDQpOwotCi0gIGZyYWctPmZyX2ZpeCArPSBmcmFnLT5mcl9zdWJ0eXBlOwotICBmcmFnLT5mcl90eXBlID0gcnNfZmlsbDsKLSAgZnJhZy0+ZnJfb2Zmc2V0ID0gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9lbXVsLXRhcmdldC5oIGIvZ2FzL2VtdWwtdGFyZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDQwNTAuLjAwMDAwMDAKLS0tIGEvZ2FzL2VtdWwtdGFyZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jaWZuZGVmIGVtdWxfaW5pdAotI2RlZmluZSBlbXVsX2luaXQJCQljb21tb25fZW11bF9pbml0Ci0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2JmZF9uYW1lCi0jZGVmaW5lIGVtdWxfYmZkX25hbWUJCQlkZWZhdWx0X2VtdWxfYmZkX25hbWUKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfbG9jYWxfbGFiZWxzX2ZiCi0jZGVmaW5lIGVtdWxfbG9jYWxfbGFiZWxzX2ZiCQkwCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2xvY2FsX2xhYmVsc19kb2xsYXIKLSNkZWZpbmUgZW11bF9sb2NhbF9sYWJlbHNfZG9sbGFyCTAKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlCi0jZGVmaW5lIGVtdWxfbGVhZGluZ191bmRlcnNjb3JlCQkyCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX3N0cmlwX3VuZGVyc2NvcmUKLSNkZWZpbmUgZW11bF9zdHJpcF91bmRlcnNjb3JlCQkwCi0jZW5kaWYKLQotI2lmbmRlZiBlbXVsX2RlZmF1bHRfZW5kaWFuCi0jZGVmaW5lIGVtdWxfZGVmYXVsdF9lbmRpYW4JCTIKLSNlbmRpZgotCi0jaWZuZGVmIGVtdWxfZmFrZV9sYWJlbF9uYW1lCi0jZGVmaW5lIGVtdWxfZmFrZV9sYWJlbF9uYW1lCQkwCi0jZW5kaWYKLQotc3RydWN0IGVtdWxhdGlvbiBlbXVsX3N0cnVjdF9uYW1lID0gewotICAwLAotICBlbXVsX25hbWUsCi0gIGVtdWxfaW5pdCwKLSAgZW11bF9iZmRfbmFtZSwKLSAgZW11bF9sb2NhbF9sYWJlbHNfZmIsIGVtdWxfbG9jYWxfbGFiZWxzX2RvbGxhciwKLSAgZW11bF9sZWFkaW5nX3VuZGVyc2NvcmUsIGVtdWxfc3RyaXBfdW5kZXJzY29yZSwKLSAgZW11bF9kZWZhdWx0X2VuZGlhbiwKLSAgZW11bF9mYWtlX2xhYmVsX25hbWUsCi0gIGVtdWxfZm9ybWF0LAotfTsKZGlmZiAtLWdpdCBhL2dhcy9lbXVsLmggYi9nYXMvZW11bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2M0NmQ4Li4wMDAwMDAwCi0tLSBhL2dhcy9lbXVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jaWZuZGVmIEVNVUxfREVGUwotI2RlZmluZSBFTVVMX0RFRlMKLQotc3RydWN0IGVtdWxhdGlvbiB7Ci0gIHZvaWQgKCptYXRjaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHZvaWQgKCppbml0KSBQQVJBTVMgKCh2b2lkKSk7Ci0gIGNvbnN0IGNoYXIgKigqYmZkX25hbWUpIFBBUkFNUyAoKHZvaWQpKTsKLSAgdW5zaWduZWQgbG9jYWxfbGFiZWxzX2ZiIDogMTsKLSAgdW5zaWduZWQgbG9jYWxfbGFiZWxzX2RvbGxhciA6IDE7Ci0gIHVuc2lnbmVkIGxlYWRpbmdfdW5kZXJzY29yZSA6IDI7Ci0gIHVuc2lnbmVkIHN0cmlwX3VuZGVyc2NvcmUgOiAxOwotICB1bnNpZ25lZCBkZWZhdWx0X2VuZGlhbiA6IDI7Ci0gIGNvbnN0IGNoYXIgKmZha2VfbGFiZWxfbmFtZTsKLSAgY29uc3Qgc3RydWN0IGZvcm1hdF9vcHMgKmZvcm1hdDsKLX07Ci0KLUNPTU1PTiBzdHJ1Y3QgZW11bGF0aW9uICp0aGlzX2VtdWxhdGlvbjsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlZmF1bHRfZW11bF9iZmRfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBjb21tb25fZW11bF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvZXhwci5jIGIvZ2FzL2V4cHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwZTJjMi4uMDAwMDAwMAotLS0gYS9nYXMvZXhwci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg4NyArMCwwIEBACi0vKiBleHByLmMgLW9wZXJhbmRzLCBleHByZXNzaW9ucy0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotLyoKLSAqIFRoaXMgaXMgcmVhbGx5IGEgYnJhbmNoIG9mZmljZSBvZiBhcy1yZWFkLmMuIEkgc3BsaXQgaXQgb3V0IHRvIGNsZWFybHkKLSAqIGRpc3Rpbmd1aXNoIHRoZSB3b3JsZCBvZiBleHByZXNzaW9ucyBmcm9tIHRoZSB3b3JsZCBvZiBzdGF0ZW1lbnRzLgotICogKEl0IGFsc28gZ2l2ZXMgc21hbGxlciBmaWxlcyB0byByZS1jb21waWxlLikKLSAqIEhlcmUsICJvcGVyYW5kInMgYXJlIG9mIGV4cHJlc3Npb25zLCBub3QgaW5zdHJ1Y3Rpb25zLgotICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBtaW4oYSwgYikgICAgICAgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi1zdGF0aWMgdm9pZCBmbG9hdGluZ19jb25zdGFudCBQQVJBTVMgKChleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgdmFsdWVUIGdlbmVyaWNfYmlnbnVtX3RvX2ludDMyIFBBUkFNUyAoKHZvaWQpKTsKLSNpZmRlZiBCRkQ2NAotc3RhdGljIHZhbHVlVCBnZW5lcmljX2JpZ251bV90b19pbnQ2NCBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIGludGVnZXJfY29uc3RhbnQgUEFSQU1TICgoaW50IHJhZGl4LCBleHByZXNzaW9uUyAqIGV4cHJlc3Npb25QKSk7Ci1zdGF0aWMgdm9pZCBtcmlfY2hhcl9jb25zdGFudCBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgdm9pZCBjdXJyZW50X2xvY2F0aW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXN0YXRpYyB2b2lkIGNsZWFuX3VwX2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotc3RhdGljIHNlZ1Qgb3BlcmFuZCBQQVJBTVMgKChleHByZXNzaW9uUyAqKSk7Ci1zdGF0aWMgb3BlcmF0b3JUIG9wZXJhdG9yIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgRVhQX0NIQVJTW10sIEZMVF9DSEFSU1tdOwotCi0vKiBXZSBrZWVwIGEgbWFwcGluZyBvZiBleHByZXNzaW9uIHN5bWJvbHMgdG8gZmlsZSBwb3NpdGlvbnMsIHNvIHRoYXQKLSAgIHdlIGNhbiBwcm92aWRlIGJldHRlciBlcnJvciBtZXNzYWdlcy4gICovCi0KLXN0cnVjdCBleHByX3N5bWJvbF9saW5lCi17Ci0gIHN0cnVjdCBleHByX3N5bWJvbF9saW5lICpuZXh0OwotICBzeW1ib2xTICpzeW07Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lOwotfTsKLQotc3RhdGljIHN0cnVjdCBleHByX3N5bWJvbF9saW5lICpleHByX3N5bWJvbF9saW5lczsKLQwKLS8qIEJ1aWxkIGEgZHVtbXkgc3ltYm9sIHRvIGhvbGQgYSBjb21wbGV4IGV4cHJlc3Npb24uICBUaGlzIGlzIGhvdyB3ZQotICAgYnVpbGQgZXhwcmVzc2lvbnMgdXAgb3V0IG9mIG90aGVyIGV4cHJlc3Npb25zLiAgVGhlIHN5bWJvbCBpcyBwdXQKLSAgIGludG8gdGhlIGZha2Ugc2VjdGlvbiBleHByX3NlY3Rpb24uICAqLwotCi1zeW1ib2xTICoKLW1ha2VfZXhwcl9zeW1ib2wgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIGV4cHJlc3Npb25TIHplcm87Ci0gIGNvbnN0IGNoYXIgKmZha2U7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7Ci0gIHN0cnVjdCBleHByX3N5bWJvbF9saW5lICpuOwotCi0gIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX3N5bWJvbAotICAgICAgJiYgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9PSAwKQotICAgIHJldHVybiBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sOwotCi0gIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICAvKiBUaGlzIHdvbid0IHdvcmssIGJlY2F1c2UgdGhlIGFjdHVhbCB2YWx1ZSBpcyBzdG9yZWQgaW4KLSAgICAgICAgIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyIG9yIGdlbmVyaWNfYmlnbnVtLCBhbmQgd2UgYXJlCi0gICAgICAgICBnb2luZyB0byBsb3NlIGl0IGlmIHdlIGhhdmVuJ3QgYWxyZWFkeS4gICovCi0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA+IDApCi0JYXNfYmFkIChfKCJiaWdudW0gaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIHplcm8uWF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICB6ZXJvLlhfYWRkX251bWJlciA9IDA7Ci0gICAgICB6ZXJvLlhfdW5zaWduZWQgPSAwOwotICAgICAgY2xlYW5fdXBfZXhwcmVzc2lvbiAoJnplcm8pOwotICAgICAgZXhwcmVzc2lvblAgPSAmemVybzsKLSAgICB9Ci0KLSAgZmFrZSA9IEZBS0VfTEFCRUxfTkFNRTsKLQotICAvKiBQdXR0aW5nIGNvbnN0YW50IHN5bWJvbHMgaW4gYWJzb2x1dGVfc2VjdGlvbiByYXRoZXIgdGhhbgotICAgICBleHByX3NlY3Rpb24gaXMgY29udmVuaWVudCBmb3IgdGhlIG9sZCBhLm91dCBjb2RlLCBmb3Igd2hpY2gKLSAgICAgU19HRVRfU0VHTUVOVCBkb2VzIG5vdCBhbHdheXMgcmV0cmlldmUgdGhlIHZhbHVlIHB1dCBpbiBieQotICAgICBTX1NFVF9TRUdNRU5ULiAgKi8KLSAgc3ltYm9sUCA9IHN5bWJvbF9jcmVhdGUgKGZha2UsCi0JCQkgICAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19jb25zdGFudAotCQkJICAgID8gYWJzb2x1dGVfc2VjdGlvbgotCQkJICAgIDogZXhwcl9zZWN0aW9uKSwKLQkJCSAgIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltYm9sUCwgZXhwcmVzc2lvblApOwotCi0gIGlmIChleHByZXNzaW9uUC0+WF9vcCA9PSBPX2NvbnN0YW50KQotICAgIHJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1ib2xQLCAxKTsKLQotICBuID0gKHN0cnVjdCBleHByX3N5bWJvbF9saW5lICopIHhtYWxsb2MgKHNpemVvZiAqbik7Ci0gIG4tPnN5bSA9IHN5bWJvbFA7Ci0gIGFzX3doZXJlICgmbi0+ZmlsZSwgJm4tPmxpbmUpOwotICBuLT5uZXh0ID0gZXhwcl9zeW1ib2xfbGluZXM7Ci0gIGV4cHJfc3ltYm9sX2xpbmVzID0gbjsKLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQotLyogUmV0dXJuIHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmb3IgYW4gZXhwciBzeW1ib2wuICBSZXR1cm4KLSAgIG5vbi16ZXJvIGlmIHNvbWV0aGluZyB3YXMgZm91bmQsIDAgaWYgbm8gaW5mb3JtYXRpb24gaXMga25vd24gZm9yCi0gICB0aGUgc3ltYm9sLiAgKi8KLQotaW50Ci1leHByX3N5bWJvbF93aGVyZSAoc3ltLCBwZmlsZSwgcGxpbmUpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgY2hhciAqKnBmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgKnBsaW5lOwotewotICByZWdpc3RlciBzdHJ1Y3QgZXhwcl9zeW1ib2xfbGluZSAqbDsKLQotICBmb3IgKGwgPSBleHByX3N5bWJvbF9saW5lczsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAobC0+c3ltID09IHN5bSkKLQl7Ci0JICAqcGZpbGUgPSBsLT5maWxlOwotCSAgKnBsaW5lID0gbC0+bGluZTsKLQkgIHJldHVybiAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0MCi0vKiBVdGlsaXRpZXMgZm9yIGJ1aWxkaW5nIGV4cHJlc3Npb25zLgotICAgU2luY2UgY29tcGxleCBleHByZXNzaW9ucyBhcmUgcmVjb3JkZWQgYXMgc3ltYm9scyBmb3IgdXNlIGluIG90aGVyCi0gICBleHByZXNzaW9ucyB0aGVzZSByZXR1cm4gYSBzeW1ib2xTICogYW5kIG5vdCBhbiBleHByZXNzaW9uUyAqLgotICAgVGhlc2UgZXhwbGljaXRseSBkbyBub3QgdGFrZSBhbiAiYWRkX251bWJlciIgYXJndW1lbnQuICAqLwotLyogPz8/IEZvciBjb21wbGV0ZW5lc3MnIHNha2Ugb25lIG1pZ2h0IHdhbnQgZXhwcl9idWlsZF9zeW1ib2wuCi0gICBJdCB3b3VsZCBqdXN0IHJldHVybiBpdHMgYXJndW1lbnQuICAqLwotCi0vKiBCdWlsZCBhbiBleHByZXNzaW9uIGZvciBhbiB1bnNpZ25lZCBjb25zdGFudC4KLSAgIFRoZSBjb3JyZXNwb25kaW5nIG9uZSBmb3Igc2lnbmVkIGNvbnN0YW50cyBpcyBtaXNzaW5nIGJlY2F1c2UKLSAgIHRoZXJlJ3MgY3VycmVudGx5IG5vIG5lZWQgZm9yIGl0LiAgT25lIGNvdWxkIGFkZCBhbiB1bnNpZ25lZF9wIGZsYWcKLSAgIGJ1dCB0aGF0IHNlZW1zIG1vcmUgY2x1bXN5LiAgKi8KLQotc3ltYm9sUyAqCi1leHByX2J1aWxkX3Vjb25zdGFudCAodmFsdWUpCi0gICAgIG9mZnNldFQgdmFsdWU7Ci17Ci0gIGV4cHJlc3Npb25TIGU7Ci0KLSAgZS5YX29wID0gT19jb25zdGFudDsKLSAgZS5YX2FkZF9udW1iZXIgPSB2YWx1ZTsKLSAgZS5YX3Vuc2lnbmVkID0gMTsKLSAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKLX0KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgT1AgczEuICAqLwotCi1zeW1ib2xTICoKLWV4cHJfYnVpbGRfdW5hcnkgKG9wLCBzMSkKLSAgICAgb3BlcmF0b3JUIG9wOwotICAgICBzeW1ib2xTICpzMTsKLXsKLSAgZXhwcmVzc2lvblMgZTsKLQotICBlLlhfb3AgPSBvcDsKLSAgZS5YX2FkZF9zeW1ib2wgPSBzMTsKLSAgZS5YX2FkZF9udW1iZXIgPSAwOwotICByZXR1cm4gbWFrZV9leHByX3N5bWJvbCAoJmUpOwotfQotCi0vKiBCdWlsZCBhbiBleHByZXNzaW9uIGZvciBzMSBPUCBzMi4gICovCi0KLXN5bWJvbFMgKgotZXhwcl9idWlsZF9iaW5hcnkgKG9wLCBzMSwgczIpCi0gICAgIG9wZXJhdG9yVCBvcDsKLSAgICAgc3ltYm9sUyAqczE7Ci0gICAgIHN5bWJvbFMgKnMyOwotewotICBleHByZXNzaW9uUyBlOwotCi0gIGUuWF9vcCA9IG9wOwotICBlLlhfYWRkX3N5bWJvbCA9IHMxOwotICBlLlhfb3Bfc3ltYm9sID0gczI7Ci0gIGUuWF9hZGRfbnVtYmVyID0gMDsKLSAgcmV0dXJuIG1ha2VfZXhwcl9zeW1ib2wgKCZlKTsKLX0KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIGN1cnJlbnQgbG9jYXRpb24gKCcuJykuICAqLwotCi1zeW1ib2xTICoKLWV4cHJfYnVpbGRfZG90ICgpCi17Ci0gIGV4cHJlc3Npb25TIGU7Ci0KLSAgY3VycmVudF9sb2NhdGlvbiAoJmUpOwotICByZXR1cm4gbWFrZV9leHByX3N5bWJvbCAoJmUpOwotfQotDAotLyoKLSAqIEJ1aWxkIGFueSBmbG9hdGluZy1wb2ludCBsaXRlcmFsIGhlcmUuCi0gKiBBbHNvIGJ1aWxkIGFueSBiaWdudW0gbGl0ZXJhbCBoZXJlLgotICovCi0KLS8qIFNlZW1zIGF0b2ZfbWFjaGluZSBjYW4gYmFja3NjYW4gdGhyb3VnaCBnZW5lcmljX2JpZ251bSBhbmQgaGl0IHdoYXRldmVyCi0gICBoYXBwZW5zIHRvIGJlIGxvYWRlZCBiZWZvcmUgaXQgaW4gbWVtb3J5LiAgQW5kIGl0cyB3YXkgdG9vIGNvbXBsaWNhdGVkCi0gICBmb3IgbWUgdG8gZml4IHJpZ2h0LiAgVGh1cyBhIGhhY2suICBKRjogIEp1c3QgbWFrZSBnZW5lcmljX2JpZ251bSBiaWdnZXIsCi0gICBhbmQgbmV2ZXIgd3JpdGUgaW50byB0aGUgZWFybHkgd29yZHMsIHRodXMgdGhleSdsbCBhbHdheXMgYmUgemVyby4KLSAgIEkgaGF0ZSBEZWFuJ3MgZmxvYXRpbmctcG9pbnQgY29kZS4gIEJsZWguICAqLwotTElUVExFTlVNX1RZUEUgZ2VuZXJpY19iaWdudW1bU0laRV9PRl9MQVJHRV9OVU1CRVIgKyA2XTsKLUZMT05VTV9UWVBFIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyID0KLXsKLSAgJmdlbmVyaWNfYmlnbnVtWzZdLAkJLyogbG93IChKRjogV2FzIDApICovCi0gICZnZW5lcmljX2JpZ251bVtTSVpFX09GX0xBUkdFX05VTUJFUiArIDYgLSAxXSwgLyogaGlnaCBKRjogKGFkZGVkICs2KSAqLwotICAwLAkJCQkvKiBsZWFkZXIgKi8KLSAgMCwJCQkJLyogZXhwb25lbnQgKi8KLSAgMAkJCQkvKiBzaWduICovCi19OwotLyogSWYgbm9uemVybywgd2UndmUgYmVlbiBhc2tlZCB0byBhc3NlbWJsZSBuYW4sICtpbmYgb3IgLWluZiAqLwotaW50IGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbWFnaWM7Ci0MCi1zdGF0aWMgdm9pZAotZmxvYXRpbmdfY29uc3RhbnQgKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+Ki8KLSAgLyogZmxvYXRpbmctcG9pbnQgY29uc3RhbnQuICovCi0gIGludCBlcnJvcl9jb2RlOwotCi0gIGVycm9yX2NvZGUgPSBhdG9mX2dlbmVyaWMgKCZpbnB1dF9saW5lX3BvaW50ZXIsICIuIiwgRVhQX0NIQVJTLAotCQkJICAgICAmZ2VuZXJpY19mbG9hdGluZ19wb2ludF9udW1iZXIpOwotCi0gIGlmIChlcnJvcl9jb2RlKQotICAgIHsKLSAgICAgIGlmIChlcnJvcl9jb2RlID09IEVSUk9SX0VYUE9ORU5UX09WRVJGTE9XKQotCXsKLQkgIGFzX2JhZCAoXygiYmFkIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50OiBleHBvbmVudCBvdmVyZmxvdywgcHJvYmFibHkgYXNzZW1ibGluZyBqdW5rIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc19iYWQgKF8oImJhZCBmbG9hdGluZy1wb2ludCBjb25zdGFudDogdW5rbm93biBlcnJvciBjb2RlPSVkLiIpLCBlcnJvcl9jb2RlKTsKLQl9Ci0gICAgfQotICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYmlnOwotICAvKiBpbnB1dF9saW5lX3BvaW50ZXItPmp1c3QgYWZ0ZXIgY29uc3RhbnQsICovCi0gIC8qIHdoaWNoIG1heSBwb2ludCB0byB3aGl0ZXNwYWNlLiAqLwotICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gLTE7Ci19Ci0KLXN0YXRpYyB2YWx1ZVQgCi1nZW5lcmljX2JpZ251bV90b19pbnQzMiAoKSAKLXsKLSAgdmFsdWVUIG51bWJlciA9Ci0JICAgKChnZW5lcmljX2JpZ251bVsxXSAmIExJVFRMRU5VTV9NQVNLKSA8PCBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFMpCi0JICAgfCAoZ2VuZXJpY19iaWdudW1bMF0gJiBMSVRUTEVOVU1fTUFTSyk7Ci0gIG51bWJlciAmPSAweGZmZmZmZmZmOwotICByZXR1cm4gbnVtYmVyOwotfQotCi0jaWZkZWYgQkZENjQKLXN0YXRpYyB2YWx1ZVQgCi1nZW5lcmljX2JpZ251bV90b19pbnQ2NCAoKSAKLXsKLSAgdmFsdWVUIG51bWJlciA9IAotCSAgICgoKCgoKCgodmFsdWVUKSBnZW5lcmljX2JpZ251bVszXSAmIExJVFRMRU5VTV9NQVNLKQotCQkgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgICAgICAgfCAoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bMl0gJiBMSVRUTEVOVU1fTUFTSykpCi0JICAgICAgIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgICB8ICgodmFsdWVUKSBnZW5lcmljX2JpZ251bVsxXSAmIExJVFRMRU5VTV9NQVNLKSkKLQkgICAgIDw8IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUykKLQkgICAgfCAoKHZhbHVlVCkgZ2VuZXJpY19iaWdudW1bMF0gJiBMSVRUTEVOVU1fTUFTSykpOwotICByZXR1cm4gbnVtYmVyOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1pbnRlZ2VyX2NvbnN0YW50IChyYWRpeCwgZXhwcmVzc2lvblApCi0gICAgIGludCByYWRpeDsKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBjaGFyICpzdGFydDsJCS8qIHN0YXJ0IG9mIG51bWJlci4gKi8KLSAgY2hhciAqc3VmZml4ID0gTlVMTDsKLSAgY2hhciBjOwotICB2YWx1ZVQgbnVtYmVyOwkvKiBvZmZzZXQgb3IgKGFic29sdXRlKSB2YWx1ZSAqLwotICBzaG9ydCBpbnQgZGlnaXQ7CS8qIHZhbHVlIG9mIG5leHQgZGlnaXQgaW4gY3VycmVudCByYWRpeCAqLwotICBzaG9ydCBpbnQgbWF4ZGlnID0gMDsvKiBoaWdoZXN0IHBlcm1pdHRlZCBkaWdpdCB2YWx1ZS4gKi8KLSAgaW50IHRvb19tYW55X2RpZ2l0cyA9IDA7CS8qIGlmIHdlIHNlZSA+PSB0aGlzIG51bWJlciBvZiAqLwotICBjaGFyICpuYW1lOwkJLyogcG9pbnRzIHRvIG5hbWUgb2Ygc3ltYm9sICovCi0gIHN5bWJvbFMgKnN5bWJvbFA7CS8qIHBvaW50cyB0byBzeW1ib2wgKi8KLQotICBpbnQgc21hbGw7CQkJLyogdHJ1ZSBpZiBmaXRzIGluIDMyIGJpdHMuICovCi0KLSAgLyogTWF5IGJlIGJpZ251bSwgb3IgbWF5IGZpdCBpbiAzMiBiaXRzLiAqLwotICAvKiBNb3N0IG51bWJlcnMgZml0IGludG8gMzIgYml0cywgYW5kIHdlIHdhbnQgdGhpcyBjYXNlIHRvIGJlIGZhc3QuCi0gICAgIHNvIHdlIHByZXRlbmQgaXQgd2lsbCBmaXQgaW50byAzMiBiaXRzLiAgSWYsIGFmdGVyIG1ha2luZyB1cCBhIDMyCi0gICAgIGJpdCBudW1iZXIsIHdlIHJlYWxpc2UgdGhhdCB3ZSBoYXZlIHNjYW5uZWQgbW9yZSBkaWdpdHMgdGhhbgotICAgICBjb21mb3J0YWJseSBmaXQgaW50byAzMiBiaXRzLCB3ZSByZS1zY2FuIHRoZSBkaWdpdHMgY29kaW5nIHRoZW0KLSAgICAgaW50byBhIGJpZ251bS4gIEZvciBkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzIHdlIGFyZQotICAgICBjb25zZXJ2YXRpdmU6IFNvbWUgbnVtYmVycyBtYXkgYmUgYXNzdW1lZCBiaWdudW1zIHdoZW4gaW4gZmFjdAotICAgICB0aGV5IGRvIGZpdCBpbnRvIDMyIGJpdHMuICBOdW1iZXJzIG9mIGFueSByYWRpeCBjYW4gaGF2ZSBleGNlc3MKLSAgICAgbGVhZGluZyB6ZXJvczogV2Ugc3RyaXZlIHRvIHJlY29nbmlzZSB0aGlzIGFuZCBjYXN0IHRoZW0gYmFjawotICAgICBpbnRvIDMyIGJpdHMuICBXZSBtdXN0IGNoZWNrIHRoYXQgdGhlIGJpZ251bSByZWFsbHkgaXMgbW9yZSB0aGFuCi0gICAgIDMyIGJpdHMsIGFuZCBjaGFuZ2UgaXQgYmFjayB0byBhIDMyLWJpdCBudW1iZXIgaWYgaXQgZml0cy4gIFRoZQotICAgICBudW1iZXIgd2UgYXJlIGxvb2tpbmcgZm9yIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlLCBidXQgaWYgaXQKLSAgICAgZml0cyBpbnRvIDMyIGJpdHMgYXMgYW4gdW5zaWduZWQgbnVtYmVyLCB3ZSBsZXQgaXQgYmUgYSAzMi1iaXQKLSAgICAgbnVtYmVyLiAgVGhlIGNhdmFsaWVyIGFwcHJvYWNoIGlzIGZvciBzcGVlZCBpbiBvcmRpbmFyeSBjYXNlcy4gKi8KLSAgLyogVGhpcyBoYXMgYmVlbiBleHRlbmRlZCBmb3IgNjQgYml0cy4gIFdlIGJsaW5kbHkgYXNzdW1lIHRoYXQgaWYKLSAgICAgeW91J3JlIGNvbXBpbGluZyBpbiA2NC1iaXQgbW9kZSwgdGhlIHRhcmdldCBpcyBhIDY0LWJpdCBtYWNoaW5lLgotICAgICBUaGlzIHNob3VsZCBiZSBjbGVhbmVkIHVwLiAgKi8KLQotI2lmZGVmIEJGRDY0Ci0jZGVmaW5lIHZhbHVlc2l6ZSA2NAotI2Vsc2UgLyogaW5jbHVkZXMgbm9uLWJmZCBjYXNlLCBtb3N0bHkgKi8KLSNkZWZpbmUgdmFsdWVzaXplIDMyCi0jZW5kaWYKLQotICBpZiAoZmxhZ19tNjhrX21yaSAmJiByYWRpeCA9PSAwKQotICAgIHsKLSAgICAgIGludCBmbHQgPSAwOwotCi0gICAgICAvKiBJbiBNUkkgbW9kZSwgdGhlIG51bWJlciBtYXkgaGF2ZSBhIHN1ZmZpeCBpbmRpY2F0aW5nIHRoZQotICAgICAgICAgcmFkaXguICBGb3IgdGhhdCBtYXR0ZXIsIGl0IG1pZ2h0IGFjdHVhbGx5IGJlIGEgZmxvYXRpbmcKLSAgICAgICAgIHBvaW50IGNvbnN0YW50LiAgKi8KLSAgICAgIGZvciAoc3VmZml4ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgIGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqc3VmZml4KTsKLQkgICBzdWZmaXgrKykKLQl7Ci0JICBpZiAoKnN1ZmZpeCA9PSAnZScgfHwgKnN1ZmZpeCA9PSAnRScpCi0JICAgIGZsdCA9IDE7Ci0JfQotCi0gICAgICBpZiAoc3VmZml4ID09IGlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JICByYWRpeCA9IDEwOwotCSAgc3VmZml4ID0gTlVMTDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYyA9ICotLXN1ZmZpeDsKLQkgIGlmIChpc2xvd2VyICgodW5zaWduZWQgY2hhcikgYykpCi0JICAgIGMgPSB0b3VwcGVyIChjKTsKLQkgIGlmIChjID09ICdCJykKLQkgICAgcmFkaXggPSAyOwotCSAgZWxzZSBpZiAoYyA9PSAnRCcpCi0JICAgIHJhZGl4ID0gMTA7Ci0JICBlbHNlIGlmIChjID09ICdPJyB8fCBjID09ICdRJykKLQkgICAgcmFkaXggPSA4OwotCSAgZWxzZSBpZiAoYyA9PSAnSCcpCi0JICAgIHJhZGl4ID0gMTY7Ci0JICBlbHNlIGlmIChzdWZmaXhbMV0gPT0gJy4nIHx8IGMgPT0gJ0UnIHx8IGZsdCkKLQkgICAgewotCSAgICAgIGZsb2F0aW5nX2NvbnN0YW50IChleHByZXNzaW9uUCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByYWRpeCA9IDEwOwotCSAgICAgIHN1ZmZpeCA9IE5VTEw7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHN3aXRjaCAocmFkaXgpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIG1heGRpZyA9IDI7Ci0gICAgICB0b29fbWFueV9kaWdpdHMgPSB2YWx1ZXNpemUgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgbWF4ZGlnID0gcmFkaXggPSA4OwotICAgICAgdG9vX21hbnlfZGlnaXRzID0gKHZhbHVlc2l6ZSArIDIpIC8gMyArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgbWF4ZGlnID0gcmFkaXggPSAxNjsKLSAgICAgIHRvb19tYW55X2RpZ2l0cyA9ICh2YWx1ZXNpemUgKyAzKSAvIDQgKyAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMDoKLSAgICAgIG1heGRpZyA9IHJhZGl4ID0gMTA7Ci0gICAgICB0b29fbWFueV9kaWdpdHMgPSAodmFsdWVzaXplICsgMTIpIC8gNDsgLyogdmVyeSByb3VnaCAqLwotICAgIH0KLSN1bmRlZiB2YWx1ZXNpemUKLSAgc3RhcnQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGZvciAobnVtYmVyID0gMDsKLSAgICAgICAoZGlnaXQgPSBoZXhfdmFsdWUgKGMpKSA8IG1heGRpZzsKLSAgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrKQotICAgIHsKLSAgICAgIG51bWJlciA9IG51bWJlciAqIHJhZGl4ICsgZGlnaXQ7Ci0gICAgfQotICAvKiBjIGNvbnRhaW5zIGNoYXJhY3RlciBhZnRlciBudW1iZXIuICovCi0gIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+Y2hhciBhZnRlciBjLiAqLwotICBzbWFsbCA9IChpbnB1dF9saW5lX3BvaW50ZXIgLSBzdGFydCAtIDEpIDwgdG9vX21hbnlfZGlnaXRzOwotCi0gIGlmIChyYWRpeCA9PSAxNiAmJiBjID09ICdfJykgCi0gICAgewotICAgICAgLyogVGhpcyBpcyBsaXRlcmFsIG9mIHRoZSBmb3JtIDB4MzMzXzBfMTIzNDU2NzhfMS4KLSAgICAgICAgIFRoaXMgZXhhbXBsZSBpcyBlcXVpdmFsZW50IHRvIDB4MDAwMDAzMzMwMDAwMDAwMDEyMzQ1Njc4MDAwMDAwMDEuICAqLwotCi0gICAgICBpbnQgbnVtX2xpdHRsZV9kaWdpdHMgPSAwOwotICAgICAgaW50IGk7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBzdGFydDsJLyotPjFzdCBkaWdpdC4gKi8KLQotICAgICAga25vdyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTID09IDE2KTsKLQotICAgICAgZm9yIChjID0gJ18nOyBjID09ICdfJzsgbnVtX2xpdHRsZV9kaWdpdHMrPTIpCi0JewotCi0JICAvKiBDb252ZXJ0IG9uZSA2NC1iaXQgd29yZC4gKi8KLQkgIGludCBuZGlnaXQgPSAwOyAKLQkgIG51bWJlciA9IDA7Ci0JICBmb3IgKGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgIChkaWdpdCA9IGhleF92YWx1ZSAoYykpIDwgbWF4ZGlnOwotCSAgICAgICBjID0gKihpbnB1dF9saW5lX3BvaW50ZXIrKykpCi0JICAgIHsKLQkgICAgICBudW1iZXIgPSBudW1iZXIgKiByYWRpeCArIGRpZ2l0OwotCSAgICAgIG5kaWdpdCsrOwotCSAgICB9Ci0KLQkgIC8qIENoZWNrIGZvciA4IGRpZ2l0IHBlciB3b3JkIG1heC4gICovCi0JICBpZiAobmRpZ2l0ID4gOCkgCi0JICAgIGFzX2JhZCAoXygiQSBiaWdudW0gd2l0aCB1bmRlcnNjb3JlcyBtYXkgbm90IGhhdmUgbW9yZSB0aGFuIDggaGV4IGRpZ2l0cyBpbiBhbnkgd29yZC4iKSk7Ci0KLQkgIC8qIEFkZCB0aGlzIGNodW5rIHRvIHRoZSBiaWdudW0uICBTaGlmdCB0aGluZ3MgZG93biAyIGxpdHRsZSBkaWdpdHMuKi8KLQkgIGtub3cgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyA9PSAxNik7Ci0JICBmb3IgKGkgPSBtaW4gKG51bV9saXR0bGVfZGlnaXRzICsgMSwgU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxKTsgaSA+PSAyOyBpLS0pCi0JICAgIGdlbmVyaWNfYmlnbnVtW2ldID0gZ2VuZXJpY19iaWdudW1baS0yXTsKLQotCSAgLyogQWRkIHRoZSBuZXcgZGlnaXRzIGFzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBuZXcgb25lcy4gKi8KLQkgIGdlbmVyaWNfYmlnbnVtWzBdID0gbnVtYmVyICYgMHhmZmZmZmZmZjsKLQkgIGdlbmVyaWNfYmlnbnVtWzFdID0gbnVtYmVyID4+IDE2OwotCX0KLQotICAgICAgLyogQWdhaW4sIGMgaXMgY2hhciBhZnRlciBudW1iZXIsIGlucHV0X2xpbmVfcG9pbnRlci0+YWZ0ZXIgYy4gKi8KLQotICAgICAgaWYgKG51bV9saXR0bGVfZGlnaXRzID4gU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxKQotCW51bV9saXR0bGVfZGlnaXRzID0gU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxOwotCi0gICAgICBhc3NlcnQgKG51bV9saXR0bGVfZGlnaXRzID49IDQpOwotCi0gICAgICBpZiAobnVtX2xpdHRsZV9kaWdpdHMgIT0gOCkKLQlhc19iYWQgKF8oIkEgYmlnbnVtIHdpdGggdW5kZXJzY29yZXMgbXVzdCBoYXZlIGV4YWN0bHkgNCB3b3Jkcy4iKSk7Ci0KLSAgICAgIC8qIFdlIG1pZ2h0IGhhdmUgc29tZSBsZWFkaW5nIHplcm9zLiAgVGhlc2UgY2FuIGJlIHRyaW1tZWQgdG8gZ2l2ZQotICAgICAgICogdXMgYSBjaGFuZ2UgdG8gZml0IHRoaXMgY29uc3RhbnQgaW50byBhIHNtYWxsIG51bWJlci4KLSAgICAgICAqLwotICAgICAgd2hpbGUgKGdlbmVyaWNfYmlnbnVtW251bV9saXR0bGVfZGlnaXRzLTFdID09IDAgJiYgbnVtX2xpdHRsZV9kaWdpdHMgPiAxKQotCW51bV9saXR0bGVfZGlnaXRzLS07Ci0JCi0gICAgICBpZiAobnVtX2xpdHRsZV9kaWdpdHMgPD0gMikKLQl7Ci0JICAvKiB3aWxsIGZpdCBpbnRvIDMyIGJpdHMuICovCi0JICBudW1iZXIgPSBnZW5lcmljX2JpZ251bV90b19pbnQzMiAoKTsKLQkgIHNtYWxsID0gMTsKLQl9Ci0jaWZkZWYgQkZENjQKLSAgICAgIGVsc2UgaWYgKG51bV9saXR0bGVfZGlnaXRzIDw9IDQpCi0JewotCSAgLyogV2lsbCBmaXQgaW50byA2NCBiaXRzLiAgKi8KLQkgIG51bWJlciA9IGdlbmVyaWNfYmlnbnVtX3RvX2ludDY0ICgpOwotCSAgc21hbGwgPSAxOwotCX0KLSNlbmRpZgotICAgICAgZWxzZQotCXsKLQkgIHNtYWxsID0gMDsKLQkgIG51bWJlciA9IG51bV9saXR0bGVfZGlnaXRzOyAvKiBudW1iZXIgb2YgbGl0dGxlbnVtcyBpbiB0aGUgYmlnbnVtLiAqLwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKCFzbWFsbCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogd2Ugc2F3IGEgbG90IG9mIGRpZ2l0cy4gbWFudWZhY3R1cmUgYSBiaWdudW0gdGhlIGhhcmQgd2F5LgotICAgICAgICovCi0gICAgICBMSVRUTEVOVU1fVFlQRSAqbGVhZGVyOwkvKi0+aGlnaCBvcmRlciBsaXR0bGVudW0gb2YgdGhlIGJpZ251bS4gKi8KLSAgICAgIExJVFRMRU5VTV9UWVBFICpwb2ludGVyOwkvKi0+bGl0dGxlbnVtIHdlIGFyZSBmcm9iYmluZyBub3cuICovCi0gICAgICBsb25nIGNhcnJ5OwotCi0gICAgICBsZWFkZXIgPSBnZW5lcmljX2JpZ251bTsKLSAgICAgIGdlbmVyaWNfYmlnbnVtWzBdID0gMDsKLSAgICAgIGdlbmVyaWNfYmlnbnVtWzFdID0gMDsKLSAgICAgIGdlbmVyaWNfYmlnbnVtWzJdID0gMDsKLSAgICAgIGdlbmVyaWNfYmlnbnVtWzNdID0gMDsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0YXJ0OwkvKi0+MXN0IGRpZ2l0LiAqLwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIGZvciAoOwotCSAgIChjYXJyeSA9IGhleF92YWx1ZSAoYykpIDwgbWF4ZGlnOwotCSAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyspCi0JewotCSAgZm9yIChwb2ludGVyID0gZ2VuZXJpY19iaWdudW07Ci0JICAgICAgIHBvaW50ZXIgPD0gbGVhZGVyOwotCSAgICAgICBwb2ludGVyKyspCi0JICAgIHsKLQkgICAgICBsb25nIHdvcms7Ci0KLQkgICAgICB3b3JrID0gY2FycnkgKyByYWRpeCAqICpwb2ludGVyOwotCSAgICAgICpwb2ludGVyID0gd29yayAmIExJVFRMRU5VTV9NQVNLOwotCSAgICAgIGNhcnJ5ID0gd29yayA+PiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICAgIH0KLQkgIGlmIChjYXJyeSkKLQkgICAgewotCSAgICAgIGlmIChsZWFkZXIgPCBnZW5lcmljX2JpZ251bSArIFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMSkKLQkJewotCQkgIC8qIHJvb20gdG8gZ3JvdyBhIGxvbmdlciBiaWdudW0uICovCi0JCSAgKisrbGVhZGVyID0gY2Fycnk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIC8qIGFnYWluLCBjIGlzIGNoYXIgYWZ0ZXIgbnVtYmVyLCAqLwotICAgICAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciBjLiAqLwotICAgICAga25vdyAoTElUVExFTlVNX05VTUJFUl9PRl9CSVRTID09IDE2KTsKLSAgICAgIGlmIChsZWFkZXIgPCBnZW5lcmljX2JpZ251bSArIDIpCi0JewotCSAgLyogd2lsbCBmaXQgaW50byAzMiBiaXRzLiAqLwotCSAgbnVtYmVyID0gZ2VuZXJpY19iaWdudW1fdG9faW50MzIgKCk7Ci0JICBzbWFsbCA9IDE7Ci0JfQotI2lmZGVmIEJGRDY0Ci0gICAgICBlbHNlIGlmIChsZWFkZXIgPCBnZW5lcmljX2JpZ251bSArIDQpCi0JewotCSAgLyogV2lsbCBmaXQgaW50byA2NCBiaXRzLiAgKi8KLQkgIG51bWJlciA9IGdlbmVyaWNfYmlnbnVtX3RvX2ludDY0ICgpOwotCSAgc21hbGwgPSAxOwotCX0KLSNlbmRpZgotICAgICAgZWxzZQotCXsKLQkgIG51bWJlciA9IGxlYWRlciAtIGdlbmVyaWNfYmlnbnVtICsgMTsJLyogbnVtYmVyIG9mIGxpdHRsZW51bXMgaW4gdGhlIGJpZ251bS4gKi8KLQl9Ci0gICAgfQotCi0gIGlmIChmbGFnX202OGtfbXJpICYmIHN1ZmZpeCAhPSBOVUxMICYmIGlucHV0X2xpbmVfcG9pbnRlciAtIDEgPT0gc3VmZml4KQotICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0KLSAgaWYgKHNtYWxsKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBoZXJlIHdpdGggbnVtYmVyLCBpbiBjb3JyZWN0IHJhZGl4LiBjIGlzIHRoZSBuZXh0IGNoYXIuCi0gICAgICAgKiBub3RlIHRoYXQgdW5saWtlIHVuKngsIHdlIGFsbG93ICIwMTFmIiAiMHg5ZiIgdG8KLSAgICAgICAqIGJvdGggbWVhbiB0aGUgc2FtZSBhcyB0aGUgKGNvbnZlbnRpb25hbCkgIjlmIi4gdGhpcyBpcyBzaW1wbHkgZWFzaWVyCi0gICAgICAgKiB0aGFuIGNoZWNraW5nIGZvciBzdHJpY3QgY2Fub25pY2FsIGZvcm0uIHN5bnRheCBzdXghCi0gICAgICAgKi8KLQotICAgICAgaWYgKExPQ0FMX0xBQkVMU19GQiAmJiBjID09ICdiJykKLQl7Ci0JICAvKgotCSAgICogYmFja3dhcmQgcmVmIHRvIGxvY2FsIGxhYmVsLgotCSAgICogYmVjYXVzZSBpdCBpcyBiYWNrd2FyZCwgZXhwZWN0IGl0IHRvIGJlIGRlZmluZWQuCi0JICAgKi8KLQkgIC8qIENvbnN0cnVjdCBhIGxvY2FsIGxhYmVsLiAgKi8KLQkgIG5hbWUgPSBmYl9sYWJlbF9uYW1lICgoaW50KSBudW1iZXIsIDApOwotCi0JICAvKiBzZWVuIGJlZm9yZSwgb3Igc3ltYm9sIGlzIGRlZmluZWQ6IG9rICovCi0JICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCSAgaWYgKChzeW1ib2xQICE9IE5VTEwpICYmIChTX0lTX0RFRklORUQgKHN5bWJvbFApKSkKLQkgICAgewotCSAgICAgIC8qIGxvY2FsIGxhYmVscyBhcmUgbmV2ZXIgYWJzb2x1dGUuIGRvbid0IHdhc3RlIHRpbWUKLQkJIGNoZWNraW5nIGFic29sdXRlbmVzcy4gKi8KLQkgICAgICBrbm93IChTRUdfTk9STUFMIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSkpOwotCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogZWl0aGVyIG5vdCBzZWVuIG9yIG5vdCBkZWZpbmVkLiAqLwotCSAgICAgIC8qIEBAIFNob3VsZCBwcmludCBvdXQgdGhlIG9yaWdpbmFsIHN0cmluZyBpbnN0ZWFkIG9mCi0JCSB0aGUgcGFyc2VkIG51bWJlci4gICovCi0JICAgICAgYXNfYmFkIChfKCJiYWNrdy4gcmVmIHRvIHVua25vd24gbGFiZWwgXCIlZDpcIiwgMCBhc3N1bWVkLiIpLAotCQkgICAgICAoaW50KSBudW1iZXIpOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19jb25zdGFudDsKLQkgICAgfQotCi0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLQl9CQkJLyogY2FzZSAnYicgKi8KLSAgICAgIGVsc2UgaWYgKExPQ0FMX0xBQkVMU19GQiAmJiBjID09ICdmJykKLQl7Ci0JICAvKgotCSAgICogZm9yd2FyZCByZWZlcmVuY2UuIGV4cGVjdCBzeW1ib2wgdG8gYmUgdW5kZWZpbmVkIG9yCi0JICAgKiB1bmtub3duLiB1bmRlZmluZWQ6IHNlZW4gaXQgYmVmb3JlLiB1bmtub3duOiBuZXZlciBzZWVuCi0JICAgKiBpdCBiZWZvcmUuCi0JICAgKiBjb25zdHJ1Y3QgYSBsb2NhbCBsYWJlbCBuYW1lLCB0aGVuIGFuIHVuZGVmaW5lZCBzeW1ib2wuCi0JICAgKiBkb24ndCBjcmVhdGUgYSB4c2VnIGZyYWcgZm9yIGl0OiBjYWxsZXIgbWF5IGRvIHRoYXQuCi0JICAgKiBqdXN0IHJldHVybiBpdCBhcyBuZXZlciBzZWVuIGJlZm9yZS4KLQkgICAqLwotCSAgbmFtZSA9IGZiX2xhYmVsX25hbWUgKChpbnQpIG51bWJlciwgMSk7Ci0JICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0JICAvKiB3ZSBoYXZlIG5vIG5lZWQgdG8gY2hlY2sgc3ltYm9sIHByb3BlcnRpZXMuICovCi0jaWZuZGVmIG1hbnlfc2VnbWVudHMKLQkgIC8qIHNpbmNlICJrbm93IiBwdXRzIGl0cyBhcmcgaW50byBhICJzdHJpbmciLCB3ZQotCSAgICAgY2FuJ3QgaGF2ZSBuZXdsaW5lcyBpbiB0aGUgYXJndW1lbnQuICAqLwotCSAga25vdyAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24gfHwgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gdGV4dF9zZWN0aW9uIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGRhdGFfc2VjdGlvbik7Ci0jZW5kaWYKLQkgIGV4cHJlc3Npb25QLT5YX29wID0gT19zeW1ib2w7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gc3ltYm9sUDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCX0JCQkvKiBjYXNlICdmJyAqLwotICAgICAgZWxzZSBpZiAoTE9DQUxfTEFCRUxTX0RPTExBUiAmJiBjID09ICckJykKLQl7Ci0JICAvKiBJZiB0aGUgZG9sbGFyIGxhYmVsIGlzICpjdXJyZW50bHkqIGRlZmluZWQsIHRoZW4gdGhpcyBpcyBqdXN0Ci0JICAgICBhbm90aGVyIHJlZmVyZW5jZSB0byBpdC4gIElmIGl0IGlzIG5vdCAqY3VycmVudGx5KiBkZWZpbmVkLAotCSAgICAgdGhlbiB0aGlzIGlzIGEgZnJlc2ggaW5zdGFudGlhdGlvbiBvZiB0aGF0IG51bWJlciwgc28gY3JlYXRlCi0JICAgICBpdC4gICovCi0KLQkgIGlmIChkb2xsYXJfbGFiZWxfZGVmaW5lZCAoKGxvbmcpIG51bWJlcikpCi0JICAgIHsKLQkgICAgICBuYW1lID0gZG9sbGFyX2xhYmVsX25hbWUgKChsb25nKSBudW1iZXIsIDApOwotCSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZCAobmFtZSk7Ci0JICAgICAga25vdyAoc3ltYm9sUCAhPSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgbmFtZSA9IGRvbGxhcl9sYWJlbF9uYW1lICgobG9uZykgbnVtYmVyLCAxKTsKLQkgICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSk7Ci0JICAgIH0KLQotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3N5bWJvbDsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JfQkJCS8qIGNhc2UgJyQnICovCi0gICAgICBlbHNlCi0JewotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotI2lmZGVmIFRBUkdFVF9XT1JEX1NJWkUKLQkgIC8qIFNpZ24gZXh0ZW5kIE5VTUJFUi4gICovCi0JICBudW1iZXIgfD0gKC0obnVtYmVyID4+IChUQVJHRVRfV09SRF9TSVpFIC0gMSkpKSA8PCAoVEFSR0VUX1dPUkRfU0laRSAtIDEpOwotI2VuZGlmCi0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gbnVtYmVyOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07CS8qIHJlc3RvcmUgZm9sbG93aW5nIGNoYXJhY3Rlci4gKi8KLQl9CQkJLyogcmVhbGx5IGp1c3QgYSBudW1iZXIgKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBub3QgYSBzbWFsbCBudW1iZXIgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19iaWc7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gbnVtYmVyOwkvKiBudW1iZXIgb2YgbGl0dGxlbnVtcyAqLwotICAgICAgaW5wdXRfbGluZV9wb2ludGVyLS07CS8qLT5jaGFyIGZvbGxvd2luZyBudW1iZXIuICovCi0gICAgfQotfQotCi0vKiBQYXJzZSBhbiBNUkkgbXVsdGkgY2hhcmFjdGVyIGNvbnN0YW50LiAgKi8KLQotc3RhdGljIHZvaWQKLW1yaV9jaGFyX2NvbnN0YW50IChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBpbnQgaTsKLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnCi0gICAgICAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJ1wnJykKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSW4gb3JkZXIgdG8gZ2V0IHRoZSBjb3JyZWN0IGJ5dGUgb3JkZXJpbmcsIHdlIG11c3QgYnVpbGQgdGhlCi0gICAgIG51bWJlciBpbiByZXZlcnNlLiAgKi8KLSAgZm9yIChpID0gU0laRV9PRl9MQVJHRV9OVU1CRVIgLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBpbnQgajsKLQotICAgICAgZ2VuZXJpY19iaWdudW1baV0gPSAwOwotICAgICAgZm9yIChqID0gMDsgaiA8IENIQVJTX1BFUl9MSVRUTEVOVU07IGorKykKLQl7Ci0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQotCSAgICB7Ci0JICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnXCcnKQotCQlicmVhazsKLQkgICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgfQotCSAgZ2VuZXJpY19iaWdudW1baV0gPDw9IDg7Ci0JICBnZW5lcmljX2JpZ251bVtpXSArPSAqaW5wdXRfbGluZV9wb2ludGVyOwotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JfQotCi0gICAgICBpZiAoaSA8IFNJWkVfT0ZfTEFSR0VfTlVNQkVSIC0gMSkKLQl7Ci0JICAvKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGxpdHRsZW51bSwgbGVmdCBqdXN0aWZ5IHRoZQotICAgICAgICAgICAgIGxhc3Qgb25lIHRvIG1ha2UgaXQgbWF0Y2ggdGhlIGVhcmxpZXIgb25lcy4gIElmIHRoZXJlIGlzCi0gICAgICAgICAgICAgb25seSBvbmUsIHdlIGNhbiBqdXN0IHVzZSB0aGUgdmFsdWUgZGlyZWN0bHkuICAqLwotCSAgZm9yICg7IGogPCBDSEFSU19QRVJfTElUVExFTlVNOyBqKyspCi0JICAgIGdlbmVyaWNfYmlnbnVtW2ldIDw8PSA4OwotCX0KLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJwotCSAgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycpCi0JYnJlYWs7Ci0gICAgfQotCi0gIGlmIChpIDwgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNoYXJhY3RlciBjb25zdGFudCB0b28gbGFyZ2UiKSk7Ci0gICAgICBpID0gMDsKLSAgICB9Ci0KLSAgaWYgKGkgPiAwKQotICAgIHsKLSAgICAgIGludCBjOwotICAgICAgaW50IGo7Ci0KLSAgICAgIGMgPSBTSVpFX09GX0xBUkdFX05VTUJFUiAtIGk7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgYzsgaisrKQotCWdlbmVyaWNfYmlnbnVtW2pdID0gZ2VuZXJpY19iaWdudW1baSArIGpdOwotICAgICAgaSA9IGM7Ci0gICAgfQotCi0gIGtub3cgKExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUyA9PSAxNik7Ci0gIGlmIChpID4gMikKLSAgICB7Ci0gICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fYmlnOwotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IGk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgaWYgKGkgPCAyKQotCWV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSBnZW5lcmljX2JpZ251bVswXSAmIExJVFRMRU5VTV9NQVNLOwotICAgICAgZWxzZQotCWV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPQotCSAgKCgoZ2VuZXJpY19iaWdudW1bMV0gJiBMSVRUTEVOVU1fTUFTSykKLQkgICAgPDwgTElUVExFTlVNX05VTUJFUl9PRl9CSVRTKQotCSAgIHwgKGdlbmVyaWNfYmlnbnVtWzBdICYgTElUVExFTlVNX01BU0spKTsKLSAgICB9Ci0KLSAgLyogU2tpcCB0aGUgZmluYWwgY2xvc2luZyBxdW90ZS4gICovCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotfQotCi0vKiBSZXR1cm4gYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbG9jYXRpb24uICBUaGlzCi0gICBoYW5kbGVzIHRoZSBtYWdpYyBzeW1ib2wgYC4nLiAgKi8KLQotc3RhdGljIHZvaWQKLWN1cnJlbnRfbG9jYXRpb24gKGV4cHJlc3Npb25wKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvbnA7Ci17Ci0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgZXhwcmVzc2lvbnAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwcmVzc2lvbnAtPlhfYWRkX251bWJlciA9IGFic19zZWN0aW9uX29mZnNldDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xTICpzeW1ib2xwOwotCi0gICAgICBzeW1ib2xwID0gc3ltYm9sX25ldyAoRkFLRV9MQUJFTF9OQU1FLCBub3dfc2VnLAotCQkJICAgICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSwKLQkJCSAgICBmcmFnX25vdyk7Ci0gICAgICBleHByZXNzaW9ucC0+WF9vcCA9IE9fc3ltYm9sOwotICAgICAgZXhwcmVzc2lvbnAtPlhfYWRkX3N5bWJvbCA9IHN5bWJvbHA7Ci0gICAgICBleHByZXNzaW9ucC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci19Ci0KLS8qCi0gKiBTdW1tYXJ5IG9mIG9wZXJhbmQoKS4KLSAqCi0gKiBpbjoJSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyB0byAxc3QgY2hhciBvZiBvcGVyYW5kLCB3aGljaCBtYXkKLSAqCWJlIGEgc3BhY2UuCi0gKgotICogb3V0OglBIGV4cHJlc3Npb25TLgotICoJVGhlIG9wZXJhbmQgbWF5IGhhdmUgYmVlbiBlbXB0eTogaW4gdGhpcyBjYXNlIFhfb3AgPT0gT19hYnNlbnQuCi0gKglJbnB1dF9saW5lX3BvaW50ZXItPihuZXh0IG5vbi1ibGFuaykgY2hhciBhZnRlciBvcGVyYW5kLgotICovCi0KLXN0YXRpYyBzZWdUCi1vcGVyYW5kIChleHByZXNzaW9uUCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cHJlc3Npb25QOwotewotICBjaGFyIGM7Ci0gIHN5bWJvbFMgKnN5bWJvbFA7CS8qIHBvaW50cyB0byBzeW1ib2wgKi8KLSAgY2hhciAqbmFtZTsJCS8qIHBvaW50cyB0byBuYW1lIG9mIHN5bWJvbCAqLwotICBzZWdUIHNlZ21lbnQ7Ci0KLSAgLyogQWxsIGludGVnZXJzIGFyZSByZWdhcmRlZCBhcyB1bnNpZ25lZCB1bmxlc3MgdGhleSBhcmUgbmVnYXRlZC4KLSAgICAgVGhpcyBpcyBiZWNhdXNlIHRoZSBvbmx5IHRoaW5nIHdoaWNoIGNhcmVzIHdoZXRoZXIgYSBudW1iZXIgaXMKLSAgICAgdW5zaWduZWQgaXMgdGhlIGNvZGUgaW4gZW1pdF9leHByIHdoaWNoIGV4dGVuZHMgY29uc3RhbnRzIGludG8KLSAgICAgYmlnbnVtcy4gIEl0IHNob3VsZCBvbmx5IHNpZ24gZXh0ZW5kIG5lZ2F0aXZlIG51bWJlcnMsIHNvIHRoYXQKLSAgICAgc29tZXRoaW5nIGxpa2UgYGAucXVhZCAweDgwMDAwMDAwJycgaXMgbm90IHNpZ24gZXh0ZW5kZWQgZXZlbgotICAgICB0aG91Z2ggaXQgYXBwZWFycyBuZWdhdGl2ZSBpZiB2YWx1ZVQgaXMgMzIgYml0cy4gICovCi0gIGV4cHJlc3Npb25QLT5YX3Vuc2lnbmVkID0gMTsKLQotICAvKiBkaWdpdHMsIGFzc3VtZSBpdCBpcyBhIGJpZ251bS4gKi8KLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7CQkvKiBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgcGFydCBvZiBvcGVyYW5kLiAqLwotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwkvKiBpbnB1dF9saW5lX3BvaW50ZXItPnBhc3QgY2hhciBpbiBjLiAqLwotCi0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQotICAgICAgaW50ZWdlcl9jb25zdGFudCAoZmxhZ19tNjhrX21yaSA/IDAgOiAxMCwgZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcwJzoKLSAgICAgIC8qIG5vbi1kZWNpbWFsIHJhZGl4ICovCi0KLSAgICAgIGlmIChmbGFnX202OGtfbXJpKQotCXsKLQkgIGNoYXIgKnM7Ci0KLQkgIC8qIENoZWNrIGZvciBhIGhleCBjb25zdGFudC4gICovCi0JICBmb3IgKHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7IGhleF9wICgqcyk7IHMrKykKLQkgICAgOwotCSAgaWYgKCpzID09ICdoJyB8fCAqcyA9PSAnSCcpCi0JICAgIHsKLQkgICAgICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgwLCBleHByZXNzaW9uUCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICdvJzoKLQljYXNlICdPJzoKLQljYXNlICdxJzoKLQljYXNlICdRJzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICB7Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCWRlZmF1bHQ6Ci0JZGVmYXVsdF9jYXNlOgotCSAgaWYgKGMgJiYgc3RyY2hyIChGTFRfQ0hBUlMsIGMpKQotCSAgICB7Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgICAgZmxvYXRpbmdfY29uc3RhbnQgKGV4cHJlc3Npb25QKTsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0KLQkJLSAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpID8gdG9sb3dlciAoYykgOiBjKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogVGhlIHN0cmluZyB3YXMgb25seSB6ZXJvICovCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICB9Ci0KLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6Ci0JY2FzZSAnWCc6Ci0JICBpZiAoZmxhZ19tNjhrX21yaSkKLQkgICAgZ290byBkZWZhdWx0X2Nhc2U7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIGludGVnZXJfY29uc3RhbnQgKDE2LCBleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2InOgotCSAgaWYgKExPQ0FMX0xBQkVMU19GQiAmJiAhIGZsYWdfbTY4a19tcmkpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGNvZGUgdXNlZCB0byBjaGVjayBmb3IgJysnIGFuZCAnLScgaGVyZSwgYW5kLCBpbgotCQkgc29tZSBjb25kaXRpb25zLCBmYWxsIHRocm91Z2ggdG8gY2FsbAotCQkgaW50ZWdlcl9jb25zdGFudC4gIEhvd2V2ZXIsIHRoYXQgZGlkbid0IG1ha2Ugc2Vuc2UsCi0JCSBhcyBpbnRlZ2VyX2NvbnN0YW50IG9ubHkgYWNjZXB0cyBkaWdpdHMuICAqLwotCSAgICAgIC8qIFNvbWUgb2Ygb3VyIGNvZGUgZWxzZXdoZXJlIGRvZXMgcGVybWl0IGRpZ2l0cyBncmVhdGVyCi0JCSB0aGFuIHRoZSBleHBlY3RlZCBiYXNlOyBmb3IgY29uc2lzdGVuY3ksIGRvIHRoZSBzYW1lCi0JCSBoZXJlLiAgKi8KLQkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzFdIDwgJzAnCi0JCSAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID4gJzknKQotCQl7Ci0JCSAgLyogUGFyc2UgdGhpcyBhcyBhIGJhY2sgcmVmZXJlbmNlIHRvIGxhYmVsIDAuICAqLwotCQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCQkgIGludGVnZXJfY29uc3RhbnQgKDEwLCBleHByZXNzaW9uUCk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICAvKiBPdGhlcndpc2UsIHBhcnNlIHRoaXMgYXMgYSBiaW5hcnkgbnVtYmVyLiAgKi8KLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlICdCJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgaWYgKGZsYWdfbTY4a19tcmkpCi0JICAgIGdvdG8gZGVmYXVsdF9jYXNlOwotCSAgaW50ZWdlcl9jb25zdGFudCAoMiwgZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0KLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQkgIGludGVnZXJfY29uc3RhbnQgKGZsYWdfbTY4a19tcmkgPyAwIDogOCwgZXhwcmVzc2lvblApOwotCSAgYnJlYWs7Ci0KLQljYXNlICdmJzoKLQkgIGlmIChMT0NBTF9MQUJFTFNfRkIpCi0JICAgIHsKLQkgICAgICAvKiBJZiBpdCBzYXlzICIwZiIgYW5kIGl0IGNvdWxkIHBvc3NpYmx5IGJlIGEgZmxvYXRpbmcgcG9pbnQKLQkJIG51bWJlciwgbWFrZSBpdCBvbmUuICBPdGhlcndpc2UsIG1ha2UgaXQgYSBsb2NhbCBsYWJlbCwKLQkJIGFuZCB0cnkgdG8gZGVhbCB3aXRoIHBhcnNpbmcgdGhlIHJlc3QgbGF0ZXIuICAqLwotCSAgICAgIGlmICghaW5wdXRfbGluZV9wb2ludGVyWzFdCi0JCSAgfHwgKGlzX2VuZF9vZl9saW5lWzB4ZmYgJiBpbnB1dF9saW5lX3BvaW50ZXJbMV1dKSkKLQkJZ290byBpc18wZl9sYWJlbDsKLQkgICAgICB7Ci0JCWNoYXIgKmNwID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQkJaW50IHIgPSBhdG9mX2dlbmVyaWMgKCZjcCwgIi4iLCBFWFBfQ0hBUlMsCi0JCQkJICAgICAgJmdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKTsKLQkJc3dpdGNoIChyKQotCQkgIHsKLQkJICBjYXNlIDA6Ci0JCSAgY2FzZSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVzoKLQkJICAgIGlmICgqY3AgPT0gJ2YnIHx8ICpjcCA9PSAnYicpCi0JCSAgICAgIC8qIGxvb2tzIGxpa2UgYSBkaWZmZXJlbmNlIGV4cHJlc3Npb24gKi8KLQkJICAgICAgZ290byBpc18wZl9sYWJlbDsKLQkJICAgIGVsc2UgaWYgKGNwID09IGlucHV0X2xpbmVfcG9pbnRlciArIDEpCi0JCSAgICAgIC8qIE5vIGNoYXJhY3RlcnMgaGFzIGJlZW4gYWNjZXB0ZWQgLS0gbG9va3MgbGlrZQotICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCBvZiBvcGVyYW5kLiAqLwotCQkgICAgICBnb3RvIGlzXzBmX2xhYmVsOwotCQkgICAgZWxzZQotCQkgICAgICBnb3RvIGlzXzBmX2Zsb2F0OwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhc19mYXRhbCAoXygiZXhwci5jKG9wZXJhbmQpOiBiYWQgYXRvZl9nZW5lcmljIHJldHVybiB2YWwgJWQiKSwKLQkJCSAgICAgIHIpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgICAvKiBPa2F5LCBub3cgd2UndmUgc29ydGVkIGl0IG91dC4gIFdlIHJlc3VtZSBhdCBvbmUgb2YgdGhlc2UKLQkJIHR3byBsYWJlbHMsIGRlcGVuZGluZyBvbiB3aGF0IHdlJ3ZlIGRlY2lkZWQgd2UncmUgcHJvYmFibHkKLQkJIGxvb2tpbmcgYXQuICAqLwotCSAgICBpc18wZl9sYWJlbDoKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLQkgICAgICBpbnRlZ2VyX2NvbnN0YW50ICgxMCwgZXhwcmVzc2lvblApOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGlzXzBmX2Zsb2F0OgotCSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCSAgICAgIDsKLQkgICAgfQotCi0JY2FzZSAnZCc6Ci0JY2FzZSAnRCc6Ci0JICBpZiAoZmxhZ19tNjhrX21yaSkKLQkgICAgewotCSAgICAgIGludGVnZXJfY29uc3RhbnQgKDAsIGV4cHJlc3Npb25QKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlICdGJzoKLQljYXNlICdyJzoKLQljYXNlICdlJzoKLQljYXNlICdFJzoKLQljYXNlICdnJzoKLQljYXNlICdHJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgZmxvYXRpbmdfY29uc3RhbnQgKGV4cHJlc3Npb25QKTsKLQkgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPQotCSAgICAtIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgYykgPyB0b2xvd2VyIChjKSA6IGMpOwotCSAgYnJlYWs7Ci0KLQljYXNlICckJzoKLQkgIGlmIChMT0NBTF9MQUJFTFNfRE9MTEFSKQotCSAgICB7Ci0JICAgICAgaW50ZWdlcl9jb25zdGFudCAoMTAsIGV4cHJlc3Npb25QKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICBnb3RvIGRlZmF1bHRfY2FzZTsKLQl9Ci0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnKCc6Ci0jaWZuZGVmIE5FRURfSU5ERVhfT1BFUkFUT1IKLSAgICBjYXNlICdbJzoKLSNlbmRpZgotICAgICAgLyogZGlkbid0IGJlZ2luIHdpdGggZGlnaXQgJiBub3QgYSBuYW1lICovCi0gICAgICBzZWdtZW50ID0gZXhwcmVzc2lvbiAoZXhwcmVzc2lvblApOwotICAgICAgLyogRXhwcmVzc2lvbigpIHdpbGwgcGFzcyB0cmFpbGluZyB3aGl0ZXNwYWNlICovCi0gICAgICBpZiAoKGMgPT0gJygnICYmICppbnB1dF9saW5lX3BvaW50ZXIrKyAhPSAnKScpCi0JICB8fCAoYyA9PSAnWycgJiYgKmlucHV0X2xpbmVfcG9pbnRlcisrICE9ICddJykpCi0JewotCSAgYXNfYmFkIChfKCJNaXNzaW5nICcpJyBhc3N1bWVkIikpOwotCSAgaW5wdXRfbGluZV9wb2ludGVyLS07Ci0JfQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgLyogaGVyZSB3aXRoIGlucHV0X2xpbmVfcG9pbnRlci0+Y2hhciBhZnRlciAiKC4uLikiICovCi0gICAgICByZXR1cm4gc2VnbWVudDsKLQotICAgIGNhc2UgJ0UnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSB8fCAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcJycpCi0JZ290byBkZV9mYXVsdDsKLSAgICAgIGFzX2JhZCAoXygiRUJDRElDIGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSAnQSc6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpIHx8ICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wnJykKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJ1wnJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JewotCSAgLyogV2FybmluZzogdG8gY29uZm9ybSB0byBvdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzIE5PCi0JICAgICBFU0NBUEVNRU5UIGlzIHBlcm1pdHRlZCBmb3IgYSBzaW5nbGUgcXVvdGUuIFRoZSBuZXh0Ci0JICAgICBjaGFyYWN0ZXIsIHBhcml0eSBlcnJvcnMgYW5kIGFsbCwgaXMgdGFrZW4gYXMgdGhlIHZhbHVlCi0JICAgICBvZiB0aGUgb3BlcmFuZC4gVkVSWSBLSU5LWS4gICovCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBtcmlfY2hhcl9jb25zdGFudCAoZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcrJzoKLSAgICAgICh2b2lkKSBvcGVyYW5kIChleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJyInOgotICAgICAgLyogRG91YmxlIHF1b3RlIGlzIHRoZSBiaXR3aXNlIG5vdCBvcGVyYXRvciBpbiBNUkkgbW9kZS4gICovCi0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgJ34nOgotICAgICAgLyogfiBpcyBwZXJtaXR0ZWQgdG8gc3RhcnQgYSBsYWJlbCBvbiB0aGUgRGVsdGEuICAqLwotICAgICAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMpKQotCWdvdG8gaXNuYW1lOwotICAgIGNhc2UgJyEnOgotICAgIGNhc2UgJy0nOgotICAgICAgewotCW9wZXJhbmQgKGV4cHJlc3Npb25QKTsKLQlpZiAoZXhwcmVzc2lvblAtPlhfb3AgPT0gT19jb25zdGFudCkKLQkgIHsKLQkgICAgLyogaW5wdXRfbGluZV9wb2ludGVyIC0+IGNoYXIgYWZ0ZXIgb3BlcmFuZCAqLwotCSAgICBpZiAoYyA9PSAnLScpCi0JICAgICAgewotCQlleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gLSBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyOwotCQkvKiBOb3RpY2U6ICctJyBtYXkgb3ZlcmZsb3c6IG5vIHdhcm5pbmcgaXMgZ2l2ZW4uIFRoaXMgaXMKLQkJICAgY29tcGF0aWJsZSB3aXRoIG90aGVyIHBlb3BsZSdzIGFzc2VtYmxlcnMuIFNpZ2guICAqLwotCQlleHByZXNzaW9uUC0+WF91bnNpZ25lZCA9IDA7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmIChjID09ICd+JyB8fCBjID09ICciJykKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gfiBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyOwotCSAgICBlbHNlCi0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9ICEgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlcjsKLQkgIH0KLQllbHNlIGlmIChleHByZXNzaW9uUC0+WF9vcCAhPSBPX2lsbGVnYWwKLQkJICYmIGV4cHJlc3Npb25QLT5YX29wICE9IE9fYWJzZW50KQotCSAgewotCSAgICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAoZXhwcmVzc2lvblApOwotCSAgICBpZiAoYyA9PSAnLScpCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX3VtaW51czsKLQkgICAgZWxzZSBpZiAoYyA9PSAnficgfHwgYyA9PSAnIicpCi0JICAgICAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2JpdF9ub3Q7Ci0JICAgIGVsc2UKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fbG9naWNhbF9ub3Q7Ci0JICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgfQotCWVsc2UKLQkgIGFzX3dhcm4gKF8oIlVuYXJ5IG9wZXJhdG9yICVjIGlnbm9yZWQgYmVjYXVzZSBiYWQgb3BlcmFuZCBmb2xsb3dzIiksCi0JCSAgIGMpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICckJzoKLSAgICAgIC8qICQgaXMgdGhlIHByb2dyYW0gY291bnRlciB3aGVuIGluIE1SSSBtb2RlLCBvciB3aGVuIERPTExBUl9ET1QKLSAgICAgICAgIGlzIGRlZmluZWQuICAqLwotI2lmbmRlZiBET0xMQVJfRE9UCi0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0jZW5kaWYKLSAgICAgIGlmIChmbGFnX202OGtfbXJpICYmIGhleF9wICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICAvKiBJbiBNUkkgbW9kZSwgJCBpcyBhbHNvIHVzZWQgYXMgdGhlIHByZWZpeCBmb3IgYQotICAgICAgICAgICAgIGhleGFkZWNpbWFsIGNvbnN0YW50LiAgKi8KLQkgIGludGVnZXJfY29uc3RhbnQgKDE2LCBleHByZXNzaW9uUCk7Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGlmIChpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotCWdvdG8gaXNuYW1lOwotCi0gICAgICBjdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJy4nOgotICAgICAgaWYgKCFpc19wYXJ0X29mX25hbWUgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotCXsKLQkgIGN1cnJlbnRfbG9jYXRpb24gKGV4cHJlc3Npb25QKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKChzdHJuY2FzZWNtcCAoaW5wdXRfbGluZV9wb2ludGVyLCAic3RhcnRvZi4iLCA4KSA9PSAwCi0JCSYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbOF0pKQotCSAgICAgICB8fCAoc3RybmNhc2VjbXAgKGlucHV0X2xpbmVfcG9pbnRlciwgInNpemVvZi4iLCA3KSA9PSAwCi0JCSAgICYmICEgaXNfcGFydF9vZl9uYW1lIChpbnB1dF9saW5lX3BvaW50ZXJbN10pKSkKLQl7Ci0JICBpbnQgc3RhcnQ7Ci0KLQkgIHN0YXJ0ID0gKGlucHV0X2xpbmVfcG9pbnRlclsxXSA9PSAndCcKLQkJICAgfHwgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICdUJyk7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gc3RhcnQgPyA4IDogNzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcoJykKLQkgICAgYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gLnN0YXJ0b2YuIG9yIC5zaXplb2YuIikpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY2hhciAqYnVmOwotCi0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEwKTsKLQkgICAgICBpZiAoc3RhcnQpCi0JCXNwcmludGYgKGJ1ZiwgIi5zdGFydG9mLiVzIiwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQlzcHJpbnRmIChidWYsICIuc2l6ZW9mLiVzIiwgbmFtZSk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChidWYpOwotCSAgICAgIGZyZWUgKGJ1Zik7Ci0KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcpJykKLQkJYXNfYmFkIChfKCJzeW50YXggZXJyb3IgaW4gLnN0YXJ0b2YuIG9yIC5zaXplb2YuIikpOwotCSAgICAgIGVsc2UKLQkJKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgIH0KLQkgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBnb3RvIGlzbmFtZTsKLQl9Ci0gICAgY2FzZSAnLCc6Ci0gICAgY2FzZSAnXG4nOgotICAgIGNhc2UgJ1wwJzoKLSAgICBlb2w6Ci0gICAgICAvKiBjYW4ndCBpbWFnaW5lIGFueSBvdGhlciBraW5kIG9mIG9wZXJhbmQgKi8KLSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19hYnNlbnQ7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXItLTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnJSc6Ci0gICAgICBpZiAoISBmbGFnX202OGtfbXJpKQotCWdvdG8gZGVfZmF1bHQ7Ci0gICAgICBpbnRlZ2VyX2NvbnN0YW50ICgyLCBleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0AnOgotICAgICAgaWYgKCEgZmxhZ19tNjhrX21yaSkKLQlnb3RvIGRlX2ZhdWx0OwotICAgICAgaW50ZWdlcl9jb25zdGFudCAoOCwgZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc6JzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkpCi0JZ290byBkZV9mYXVsdDsKLQotICAgICAgLyogSW4gTVJJIG1vZGUsIHRoaXMgaXMgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCByZXByZXNlbnRlZAotICAgICAgICAgdXNpbmcgaGV4YWRlY2ltYWwgZGlnaXRzLiAgKi8KLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpbnRlZ2VyX2NvbnN0YW50ICgxNiwgZXhwcmVzc2lvblApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcqJzoKLSAgICAgIGlmICghIGZsYWdfbTY4a19tcmkgfHwgaXNfcGFydF9vZl9uYW1lICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQlnb3RvIGRlX2ZhdWx0OwotCi0gICAgICBjdXJyZW50X2xvY2F0aW9uIChleHByZXNzaW9uUCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgZGVfZmF1bHQ6Ci0gICAgICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGNdKQotCWdvdG8gZW9sOwotICAgICAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMpKQkvKiBoZXJlIGlmIGRpZCBub3QgYmVnaW4gd2l0aCBhIGRpZ2l0ICovCi0JewotCSAgLyoKLQkgICAqIElkZW50aWZpZXIgYmVnaW5zIGhlcmUuCi0JICAgKiBUaGlzIGlzIGtsdWRnZWQgZm9yIHNwZWVkLCBzbyBjb2RlIGlzIHJlcGVhdGVkLgotCSAgICovCi0JaXNuYW1lOgotCSAgbmFtZSA9IC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0jaWZkZWYgbWRfcGFyc2VfbmFtZQotCSAgLyogVGhpcyBpcyBhIGhvb2sgZm9yIHRoZSBiYWNrZW5kIHRvIHBhcnNlIGNlcnRhaW4gbmFtZXMKLSAgICAgICAgICAgICBzcGVjaWFsbHkgaW4gY2VydGFpbiBjb250ZXh0cy4gIElmIGEgbmFtZSBhbHdheXMgaGFzIGEKLSAgICAgICAgICAgICBzcGVjaWZpYyB2YWx1ZSwgaXQgY2FuIG9mdGVuIGJlIGhhbmRsZWQgYnkgc2ltcGx5Ci0gICAgICAgICAgICAgZW50ZXJpbmcgaXQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gICovCi0JICBpZiAobWRfcGFyc2VfbmFtZSAobmFtZSwgZXhwcmVzc2lvblApKQotCSAgICB7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgVENfSTk2MAotCSAgLyogVGhlIE1SSSBpOTYwIGFzc2VtYmxlciBwZXJtaXRzCi0JICAgICAgICAgbGRhIHNpemVvZiBjb2RlLGcxMwotCSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIHVzZSBtZF9wYXJzZV9uYW1lLiAgKi8KLQkgIGlmIChmbGFnX21yaQotCSAgICAgICYmIChzdHJjYXNlY21wIChuYW1lLCAic2l6ZW9mIikgPT0gMAotCQkgIHx8IHN0cmNhc2VjbXAgKG5hbWUsICJzdGFydG9mIikgPT0gMCkpCi0JICAgIHsKLQkgICAgICBpbnQgc3RhcnQ7Ci0JICAgICAgY2hhciAqYnVmOwotCi0JICAgICAgc3RhcnQgPSAobmFtZVsxXSA9PSAndCcKLQkJICAgICAgIHx8IG5hbWVbMV0gPT0gJ1QnKTsKLQotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotCSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotCi0JICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChuYW1lKSArIDEwKTsKLQkgICAgICBpZiAoc3RhcnQpCi0JCXNwcmludGYgKGJ1ZiwgIi5zdGFydG9mLiVzIiwgbmFtZSk7Ci0JICAgICAgZWxzZQotCQlzcHJpbnRmIChidWYsICIuc2l6ZW9mLiVzIiwgbmFtZSk7Ci0JICAgICAgc3ltYm9sUCA9IHN5bWJvbF9tYWtlIChidWYpOwotCSAgICAgIGZyZWUgKGJ1Zik7Ci0KLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotCi0JICAgICAgYnJlYWs7Ci0JICAgIH0JICAgICAgCi0jZW5kaWYKLQotCSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0JICAvKiBJZiB3ZSBoYXZlIGFuIGFic29sdXRlIHN5bWJvbCBvciBhIHJlZywgdGhlbiB3ZSBrbm93IGl0cwotCSAgICAgdmFsdWUgbm93LiAgKi8KLQkgIHNlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKTsKLQkgIGlmIChzZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChzeW1ib2xQKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2VnbWVudCA9PSByZWdfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25QLT5YX29wID0gT19yZWdpc3RlcjsKLQkgICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gU19HRVRfVkFMVUUgKHN5bWJvbFApOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fc3ltYm9sOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wgPSBzeW1ib2xQOwotCSAgICAgIGV4cHJlc3Npb25QLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgICB9Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogTGV0IHRoZSB0YXJnZXQgdHJ5IHRvIHBhcnNlIGl0LiAgU3VjY2VzcyBpcyBpbmRpY2F0ZWQgYnkgY2hhbmdpbmcKLQkgICAgIHRoZSBYX29wIGZpZWxkIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIE9fYWJzZW50IGFuZCBwb2ludGluZwotCSAgICAgaW5wdXRfbGluZV9wb2ludGVyIHBhc3NlZCB0aGUgZXhwcmVzc2lvbi4gIElmIGl0IGNhbid0IHBhcnNlIHRoZQotCSAgICAgZXhwcmVzc2lvbiwgWF9vcCBhbmQgaW5wdXRfbGluZV9wb2ludGVyIHNob3VsZCBiZSB1bmNoYW5nZWQuICAqLwotCSAgZXhwcmVzc2lvblAtPlhfb3AgPSBPX2Fic2VudDsKLQkgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgbWRfb3BlcmFuZCAoZXhwcmVzc2lvblApOwotCSAgaWYgKGV4cHJlc3Npb25QLT5YX29wID09IE9fYWJzZW50KQotCSAgICB7Ci0JICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgYXNfYmFkIChfKCJCYWQgZXhwcmVzc2lvbiIpKTsKLQkgICAgICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX251bWJlciA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgLyoKLSAgICogSXQgaXMgbW9yZSAnZWZmaWNpZW50JyB0byBjbGVhbiB1cCB0aGUgZXhwcmVzc2lvblMgd2hlbiB0aGV5IGFyZSBjcmVhdGVkLgotICAgKiBEb2luZyBpdCBoZXJlIHNhdmVzIGxpbmVzIG9mIGNvZGUuCi0gICAqLwotICBjbGVhbl91cF9leHByZXNzaW9uIChleHByZXNzaW9uUCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsJCS8qLT4xc3QgY2hhciBhZnRlciBvcGVyYW5kLiAqLwotICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyk7Ci0KLSAgLyogVGhlIFBBIHBvcnQgbmVlZHMgdGhpcyBpbmZvcm1hdGlvbi4gICovCi0gIGlmIChleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sKQotICAgIHN5bWJvbF9tYXJrX3VzZWQgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpOwotCi0gIHN3aXRjaCAoZXhwcmVzc2lvblAtPlhfb3ApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gYWJzb2x1dGVfc2VjdGlvbjsKLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgcmV0dXJuIFNfR0VUX1NFR01FTlQgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpOwotICAgIGNhc2UgT19yZWdpc3RlcjoKLSAgICAgIHJldHVybiByZWdfc2VjdGlvbjsKLSAgICB9Ci19CQkJCS8qIG9wZXJhbmQoKSAqLwotDAotLyogSW50ZXJuYWwuIFNpbXBsaWZ5IGEgc3RydWN0IGV4cHJlc3Npb24gZm9yIHVzZSBieSBleHByKCkgKi8KLQotLyoKLSAqIEluOglhZGRyZXNzIG9mIGEgZXhwcmVzc2lvblMuCi0gKglUaGUgWF9vcCBmaWVsZCBvZiB0aGUgZXhwcmVzc2lvblMgbWF5IG9ubHkgdGFrZSBjZXJ0YWluIHZhbHVlcy4KLSAqCUVsc2V3aXNlIHdlIHdhc3RlIHRpbWUgc3BlY2lhbC1jYXNlIHRlc3RpbmcuIFNpZ2guIERpdHRvIFNFR19BQlNFTlQuCi0gKiBPdXQ6CWV4cHJlc3Npb25TIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQ6Ci0gKgknZm9vLWZvbycgc3ltYm9sIHJlZmVyZW5jZXMgY2FuY2VsbGVkIHRvIDAsCi0gKgkJd2hpY2ggY2hhbmdlcyBYX29wIGZyb20gT19zdWJ0cmFjdCB0byBPX2NvbnN0YW50LgotICoJVW51c2VkIGZpZWxkcyB6ZXJvZWQgdG8gaGVscCBleHByKCkuCi0gKi8KLQotc3RhdGljIHZvaWQKLWNsZWFuX3VwX2V4cHJlc3Npb24gKGV4cHJlc3Npb25QKQotICAgICBleHByZXNzaW9uUyAqZXhwcmVzc2lvblA7Ci17Ci0gIHN3aXRjaCAoZXhwcmVzc2lvblAtPlhfb3ApCi0gICAgewotICAgIGNhc2UgT19pbGxlZ2FsOgotICAgIGNhc2UgT19hYnNlbnQ6Ci0gICAgICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX2JpZzoKLSAgICBjYXNlIE9fY29uc3RhbnQ6Ci0gICAgY2FzZSBPX3JlZ2lzdGVyOgotICAgICAgZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgY2FzZSBPX3VtaW51czoKLSAgICBjYXNlIE9fYml0X25vdDoKLSAgICAgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0gICAgICBpZiAoZXhwcmVzc2lvblAtPlhfb3Bfc3ltYm9sID09IGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wKLQkgIHx8ICgoc3ltYm9sX2dldF9mcmFnIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wpCi0JICAgICAgID09IHN5bWJvbF9nZXRfZnJhZyAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkpCi0JICAgICAgJiYgU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkpCi0JICAgICAgJiYgKFNfR0VUX1ZBTFVFIChleHByZXNzaW9uUC0+WF9vcF9zeW1ib2wpCi0JCSAgPT0gU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX2FkZF9zeW1ib2wpKSkpCi0JewotCSAgYWRkcmVzc1QgZGlmZiA9IChTX0dFVF9WQUxVRSAoZXhwcmVzc2lvblAtPlhfYWRkX3N5bWJvbCkKLQkJCSAgIC0gU19HRVRfVkFMVUUgKGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCkpOwotCi0JICBleHByZXNzaW9uUC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIGV4cHJlc3Npb25QLT5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JICBleHByZXNzaW9uUC0+WF9hZGRfbnVtYmVyICs9IGRpZmY7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLS8qIEV4cHJlc3Npb24gcGFyc2VyLiAqLwotCi0vKgotICogV2UgYWxsb3cgYW4gZW1wdHkgZXhwcmVzc2lvbiwgYW5kIGp1c3QgYXNzdW1lIChhYnNvbHV0ZSwwKSBzaWxlbnRseS4KLSAqIFVuYXJ5IG9wZXJhdG9ycyBhbmQgcGFyZW50aGV0aWNhbCBleHByZXNzaW9ucyBhcmUgdHJlYXRlZCBhcyBvcGVyYW5kcy4KLSAqIEFzIHVzdWFsLCBRPT1xdWFudGl0eT09b3BlcmFuZCwgTz09b3BlcmF0b3IsIFg9PWV4cHJlc3Npb24gbW5lbW9uaWNzLgotICoKLSAqIFdlIHVzZWQgdG8gZG8gYSBhaG8vdWxsbWFuIHNoaWZ0LXJlZHVjZSBwYXJzZXIsIGJ1dCB0aGUgbG9naWMgZ290IHNvCi0gKiB3YXJwZWQgdGhhdCBJIGZsdXNoZWQgaXQgYW5kIHdyb3RlIGEgcmVjdXJzaXZlLWRlc2NlbnQgcGFyc2VyIGluc3RlYWQuCi0gKiBOb3cgdGhpbmdzIGFyZSBzdGFibGUsIHdvdWxkIGFueWJvZHkgbGlrZSB0byB3cml0ZSBhIGZhc3QgcGFyc2VyPwotICogTW9zdCBleHByZXNzaW9ucyBhcmUgZWl0aGVyIHJlZ2lzdGVyICh3aGljaCBkb2VzIG5vdCBldmVuIHJlYWNoIGhlcmUpCi0gKiBvciAxIHN5bWJvbC4gVGhlbiAic3ltYm9sK2NvbnN0YW50IiBhbmQgInN5bWJvbC1zeW1ib2wiIGFyZSBjb21tb24uCi0gKiBTbyBJIGd1ZXNzIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBob3cgaW5lZmZpY2llbnQgbW9yZSBjb21wbGV4IGV4cHJlc3Npb25zCi0gKiBhcmUgcGFyc2VkLgotICoKLSAqIEFmdGVyIGV4cHIoUkFOSyxyZXN1bHRQKSBpbnB1dF9saW5lX3BvaW50ZXItPm9wZXJhdG9yIG9mIHJhbmsgPD0gUkFOSy4KLSAqIEFsc28sIHdlIGhhdmUgY29uc3VtZWQgYW55IGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIChvcGVyYW5kIGRvZXMgdGhhdCkKLSAqIGFuZCBkb25lIGFsbCBpbnRlcnZlbmluZyBvcGVyYXRvcnMuCi0gKgotICogVGhpcyByZXR1cm5zIHRoZSBzZWdtZW50IG9mIHRoZSByZXN1bHQsIHdoaWNoIHdpbGwgYmUKLSAqIGFic29sdXRlX3NlY3Rpb24gb3IgdGhlIHNlZ21lbnQgb2YgYSBzeW1ib2wuCi0gKi8KLQotI3VuZGVmIF9fCi0jZGVmaW5lIF9fIE9faWxsZWdhbAotCi1zdGF0aWMgY29uc3Qgb3BlcmF0b3JUIG9wX2VuY29kaW5nWzI1Nl0gPQotewkJCQkvKiBtYXBzIEFTQ0lJLT5vcGVyYXRvcnMgKi8KLQotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0KLSAgX18sIE9fYml0X29yX25vdCwgX18sIF9fLCBfXywgT19tb2R1bHVzLCBPX2JpdF9hbmQsIF9fLAotICBfXywgX18sIE9fbXVsdGlwbHksIE9fYWRkLCBfXywgT19zdWJ0cmFjdCwgX18sIE9fZGl2aWRlLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBPX2x0LCBfXywgT19ndCwgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sCi0jaWZkZWYgTkVFRF9JTkRFWF9PUEVSQVRPUgotICBPX2luZGV4LAotI2Vsc2UKLSAgX18sCi0jZW5kaWYKLSAgX18sIF9fLCBPX2JpdF9leGNsdXNpdmVfb3IsIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgT19iaXRfaW5jbHVzaXZlX29yLCBfXywgX18sIF9fLAotCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywKLSAgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sCi0gIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLAotICBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXywgX18sIF9fLCBfXwotfTsKLQotCi0vKgotICoJUmFuawlFeGFtcGxlcwotICoJMAlvcGVyYW5kLCAoZXhwcmVzc2lvbikKLSAqCTEJfHwKLSAqCTIJJiYKLSAqCTMJPSA8PiA8IDw9ID49ID4KLSAqCTQJKyAtCi0gKgk1CXVzZWQgZm9yICogLyAlIGluIE1SSSBtb2RlCi0gKgk2CSYgXiAhIHwKLSAqCTcJKiAvICUgPDwgPj4KLSAqCTgJdW5hcnkgLSB1bmFyeSB+Ci0gKi8KLXN0YXRpYyBvcGVyYXRvcl9yYW5rVCBvcF9yYW5rW10gPQotewotICAwLAkvKiBPX2lsbGVnYWwgKi8KLSAgMCwJLyogT19hYnNlbnQgKi8KLSAgMCwJLyogT19jb25zdGFudCAqLwotICAwLAkvKiBPX3N5bWJvbCAqLwotICAwLAkvKiBPX3N5bWJvbF9ydmEgKi8KLSAgMCwJLyogT19yZWdpc3RlciAqLwotICAwLAkvKiBPX2JpdCAqLwotICA5LAkvKiBPX3VtaW51cyAqLwotICA5LAkvKiBPX2JpdF9ub3QgKi8KLSAgOSwJLyogT19sb2dpY2FsX25vdCAqLwotICA4LAkvKiBPX211bHRpcGx5ICovCi0gIDgsCS8qIE9fZGl2aWRlICovCi0gIDgsCS8qIE9fbW9kdWx1cyAqLwotICA4LAkvKiBPX2xlZnRfc2hpZnQgKi8KLSAgOCwJLyogT19yaWdodF9zaGlmdCAqLwotICA3LAkvKiBPX2JpdF9pbmNsdXNpdmVfb3IgKi8KLSAgNywJLyogT19iaXRfb3Jfbm90ICovCi0gIDcsCS8qIE9fYml0X2V4Y2x1c2l2ZV9vciAqLwotICA3LAkvKiBPX2JpdF9hbmQgKi8KLSAgNSwJLyogT19hZGQgKi8KLSAgNSwJLyogT19zdWJ0cmFjdCAqLwotICA0LAkvKiBPX2VxICovCi0gIDQsCS8qIE9fbmUgKi8KLSAgNCwJLyogT19sdCAqLwotICA0LAkvKiBPX2xlICovCi0gIDQsCS8qIE9fZ2UgKi8KLSAgNCwJLyogT19ndCAqLwotICAzLAkvKiBPX2xvZ2ljYWxfYW5kICovCi0gIDIsCS8qIE9fbG9naWNhbF9vciAqLwotICAxLAkvKiBPX2luZGV4ICovCi19OwotCi0vKiBVbmZvcnR1bmF0ZWx5LCBpbiBNUkkgbW9kZSBmb3IgdGhlIG02OGssIG11bHRpcGxpY2F0aW9uIGFuZAotICAgZGl2aXNpb24gaGF2ZSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gdGhlIGJpdCB3aXNlIG9wZXJhdG9ycy4gIFRoaXMKLSAgIGZ1bmN0aW9uIHNldHMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2VzIGNvcnJlY3RseSBmb3IgdGhlIGN1cnJlbnQKLSAgIG1vZGUuICBBbHNvLCBNUkkgdXNlcyBhIGRpZmZlcmVudCBiaXRfbm90IG9wZXJhdG9yLCBhbmQgdGhpcyBmaXhlcwotICAgdGhhdCBhcyB3ZWxsLiAgKi8KLQotI2RlZmluZSBTVEFOREFSRF9NVUxfUFJFQ0VERU5DRSAoNykKLSNkZWZpbmUgTVJJX01VTF9QUkVDRURFTkNFICg1KQotCi12b2lkCi1leHByX3NldF9wcmVjZWRlbmNlICgpCi17Ci0gIGlmIChmbGFnX202OGtfbXJpKQotICAgIHsKLSAgICAgIG9wX3JhbmtbT19tdWx0aXBseV0gPSBNUklfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fZGl2aWRlXSA9IE1SSV9NVUxfUFJFQ0VERU5DRTsKLSAgICAgIG9wX3JhbmtbT19tb2R1bHVzXSA9IE1SSV9NVUxfUFJFQ0VERU5DRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBvcF9yYW5rW09fbXVsdGlwbHldID0gU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0U7Ci0gICAgICBvcF9yYW5rW09fZGl2aWRlXSA9IFNUQU5EQVJEX01VTF9QUkVDRURFTkNFOwotICAgICAgb3BfcmFua1tPX21vZHVsdXNdID0gU1RBTkRBUkRfTVVMX1BSRUNFREVOQ0U7Ci0gICAgfQotfQotCi0vKiBJbml0aWFsaXplIHRoZSBleHByZXNzaW9uIHBhcnNlci4gICovCi0KLXZvaWQKLWV4cHJfYmVnaW4gKCkKLXsKLSAgZXhwcl9zZXRfcHJlY2VkZW5jZSAoKTsKLQotICAvKiBWZXJpZnkgdGhhdCBYX29wIGZpZWxkIGlzIHdpZGUgZW5vdWdoLiAgKi8KLSAgewotICAgIGV4cHJlc3Npb25TIGU7Ci0gICAgZS5YX29wID0gT19tYXg7Ci0gICAgYXNzZXJ0IChlLlhfb3AgPT0gT19tYXgpOwotICB9Ci19Ci0MCi0vKiBSZXR1cm4gdGhlIGVuY29kaW5nIGZvciB0aGUgb3BlcmF0b3IgYXQgSU5QVVRfTElORV9QT0lOVEVSLgotICAgQWR2YW5jZSBJTlBVVF9MSU5FX1BPSU5URVIgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBvcGVyYXRvcgotICAgKGkuZS4sIGRvbid0IGNoYW5nZSBpdCBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyIG9wZXJhdG9yKS4gICovCi0KLXN0YXRpYyBpbmxpbmUgb3BlcmF0b3JUCi1vcGVyYXRvciAoKQotewotICBpbnQgYzsKLSAgb3BlcmF0b3JUIHJldDsKLQotICBjID0gKmlucHV0X2xpbmVfcG9pbnRlciAmIDB4ZmY7Ci0KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgY2FzZSAnPCc6Ci0gICAgICBzd2l0Y2ggKGlucHV0X2xpbmVfcG9pbnRlclsxXSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQljYXNlICc8JzoKLQkgIHJldCA9IE9fbGVmdF9zaGlmdDsKLQkgIGJyZWFrOwotCWNhc2UgJz4nOgotCSAgcmV0ID0gT19uZTsKLQkgIGJyZWFrOwotCWNhc2UgJz0nOgotCSAgcmV0ID0gT19sZTsKLQkgIGJyZWFrOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIHJldDsKLQotICAgIGNhc2UgJz0nOgotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnPScpCi0JcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2VxOwotCi0gICAgY2FzZSAnPic6Ci0gICAgICBzd2l0Y2ggKGlucHV0X2xpbmVfcG9pbnRlclsxXSkKLQl7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQljYXNlICc+JzoKLQkgIHJldCA9IE9fcmlnaHRfc2hpZnQ7Ci0JICBicmVhazsKLQljYXNlICc9JzoKLQkgIHJldCA9IE9fZ2U7Ci0JICBicmVhazsKLQl9Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBjYXNlICchJzoKLSAgICAgIC8qIFdlIGFjY2VwdCAhISBhcyBlcXVpdmFsZW50IHRvIF4gZm9yIE1SSSBjb21wYXRpYmlsaXR5LiAgKi8KLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJyEnKQotCXsKLQkgIGlmIChmbGFnX202OGtfbXJpKQotCSAgICByZXR1cm4gT19iaXRfaW5jbHVzaXZlX29yOwotCSAgcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCX0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgcmV0dXJuIE9fYml0X2V4Y2x1c2l2ZV9vcjsKLQotICAgIGNhc2UgJ3wnOgotICAgICAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclsxXSAhPSAnfCcpCi0JcmV0dXJuIG9wX2VuY29kaW5nW2NdOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIHJldHVybiBPX2xvZ2ljYWxfb3I7Ci0KLSAgICBjYXNlICcmJzoKLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gIT0gJyYnKQotCXJldHVybiBvcF9lbmNvZGluZ1tjXTsKLQotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICByZXR1cm4gT19sb2dpY2FsX2FuZDsKLSAgICB9Ci0KLSAgLypOT1RSRUFDSEVEKi8KLX0KLQotLyogUGFyc2UgYW4gZXhwcmVzc2lvbi4gICovCi0KLXNlZ1QKLWV4cHIgKHJhbmssIHJlc3VsdFApCi0gICAgIG9wZXJhdG9yX3JhbmtUIHJhbms7CS8qIExhcmdlciAjIGlzIGhpZ2hlciByYW5rLiAqLwotICAgICBleHByZXNzaW9uUyAqcmVzdWx0UDsJLyogRGVsaXZlciByZXN1bHQgaGVyZS4gKi8KLXsKLSAgc2VnVCByZXR2YWw7Ci0gIGV4cHJlc3Npb25TIHJpZ2h0OwotICBvcGVyYXRvclQgb3BfbGVmdDsKLSAgb3BlcmF0b3JUIG9wX3JpZ2h0OwotCi0gIGtub3cgKHJhbmsgPj0gMCk7Ci0KLSAgcmV0dmFsID0gb3BlcmFuZCAocmVzdWx0UCk7Ci0KLSAga25vdyAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcpOwkvKiBPcGVyYW5kKCkgZ29iYmxlcyBzcGFjZXMuICovCi0KLSAgb3BfbGVmdCA9IG9wZXJhdG9yICgpOwotICB3aGlsZSAob3BfbGVmdCAhPSBPX2lsbGVnYWwgJiYgb3BfcmFua1soaW50KSBvcF9sZWZ0XSA+IHJhbmspCi0gICAgewotICAgICAgc2VnVCByaWdodHNlZzsKLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7CS8qLT5hZnRlciAxc3QgY2hhcmFjdGVyIG9mIG9wZXJhdG9yLiAqLwotCi0gICAgICByaWdodHNlZyA9IGV4cHIgKG9wX3JhbmtbKGludCkgb3BfbGVmdF0sICZyaWdodCk7Ci0gICAgICBpZiAocmlnaHQuWF9vcCA9PSBPX2Fic2VudCkKLQl7Ci0JICBhc193YXJuIChfKCJtaXNzaW5nIG9wZXJhbmQ7IHplcm8gYXNzdW1lZCIpKTsKLQkgIHJpZ2h0Llhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmlnaHQuWF9hZGRfbnVtYmVyID0gMDsKLQkgIHJpZ2h0LlhfYWRkX3N5bWJvbCA9IE5VTEw7Ci0JICByaWdodC5YX29wX3N5bWJvbCA9IE5VTEw7Ci0JfQotCi0gICAgICBrbm93ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcgJyk7Ci0KLSAgICAgIGlmIChvcF9sZWZ0ID09IE9faW5kZXgpCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ10nKQotCSAgICBhc19iYWQgKCJtaXNzaW5nIHJpZ2h0IGJyYWNrZXQiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHJldHZhbCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQl7Ci0JICBpZiAoU0VHX05PUk1BTCAocmlnaHRzZWcpKQotCSAgICByZXR2YWwgPSByaWdodHNlZzsKLQl9Ci0gICAgICBlbHNlIGlmICghIFNFR19OT1JNQUwgKHJldHZhbCkpCi0JcmV0dmFsID0gcmlnaHRzZWc7Ci0gICAgICBlbHNlIGlmIChTRUdfTk9STUFMIChyaWdodHNlZykKLQkgICAgICAgJiYgcmV0dmFsICE9IHJpZ2h0c2VnCi0jaWZkZWYgRElGRl9FWFBSX09LCi0JICAgICAgICYmIG9wX2xlZnQgIT0gT19zdWJ0cmFjdAotI2VuZGlmCi0JICAgICAgICkKLQlhc19iYWQgKF8oIm9wZXJhdGlvbiBjb21iaW5lcyBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWdtZW50cyIpKTsKLQotICAgICAgb3BfcmlnaHQgPSBvcGVyYXRvciAoKTsKLQotICAgICAga25vdyAob3BfcmlnaHQgPT0gT19pbGxlZ2FsIHx8IG9wX3JhbmtbKGludCkgb3BfcmlnaHRdIDw9IG9wX3JhbmtbKGludCkgb3BfbGVmdF0pOwotICAgICAga25vdyAoKGludCkgb3BfbGVmdCA+PSAoaW50KSBPX211bHRpcGx5Ci0JICAgICYmIChpbnQpIG9wX2xlZnQgPD0gKGludCkgT19sb2dpY2FsX29yKTsKLQotICAgICAgLyogaW5wdXRfbGluZV9wb2ludGVyLT5hZnRlciByaWdodC1oYW5kIHF1YW50aXR5LiAqLwotICAgICAgLyogbGVmdC1oYW5kIHF1YW50aXR5IGluIHJlc3VsdFAgKi8KLSAgICAgIC8qIHJpZ2h0LWhhbmQgcXVhbnRpdHkgaW4gcmlnaHQuICovCi0gICAgICAvKiBvcGVyYXRvciBpbiBvcF9sZWZ0LiAqLwotCi0gICAgICBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX2JpZykKLQl7Ci0JICBpZiAocmVzdWx0UC0+WF9hZGRfbnVtYmVyID4gMCkKLQkgICAgYXNfd2FybiAoXygibGVmdCBvcGVyYW5kIGlzIGEgYmlnbnVtOyBpbnRlZ2VyIDAgYXNzdW1lZCIpKTsKLQkgIGVsc2UKLQkgICAgYXNfd2FybiAoXygibGVmdCBvcGVyYW5kIGlzIGEgZmxvYXQ7IGludGVnZXIgMCBhc3N1bWVkIikpOwotCSAgcmVzdWx0UC0+WF9vcCA9IE9fY29uc3RhbnQ7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPSAwOwotCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gTlVMTDsKLQkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gTlVMTDsKLQl9Ci0gICAgICBpZiAocmlnaHQuWF9vcCA9PSBPX2JpZykKLQl7Ci0JICBpZiAocmlnaHQuWF9hZGRfbnVtYmVyID4gMCkKLQkgICAgYXNfd2FybiAoXygicmlnaHQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiKSk7Ci0JICBlbHNlCi0JICAgIGFzX3dhcm4gKF8oInJpZ2h0IG9wZXJhbmQgaXMgYSBmbG9hdDsgaW50ZWdlciAwIGFzc3VtZWQiKSk7Ci0JICByaWdodC5YX29wID0gT19jb25zdGFudDsKLQkgIHJpZ2h0LlhfYWRkX251bWJlciA9IDA7Ci0JICByaWdodC5YX2FkZF9zeW1ib2wgPSBOVUxMOwotCSAgcmlnaHQuWF9vcF9zeW1ib2wgPSBOVUxMOwotCX0KLQotICAgICAgLyogT3B0aW1pemUgY29tbW9uIGNhc2VzLiAgKi8KLSAgICAgIGlmIChvcF9sZWZ0ID09IE9fYWRkICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBYICsgY29uc3RhbnQuICAqLwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IHJpZ2h0LlhfYWRkX251bWJlcjsKLQl9Ci0gICAgICAvKiBUaGlzIGNhc2UgY29tZXMgdXAgaW4gUElDIGNvZGUuICAqLwotICAgICAgZWxzZSBpZiAob3BfbGVmdCA9PSBPX3N1YnRyYWN0Ci0JICAgICAgICYmIHJpZ2h0Llhfb3AgPT0gT19zeW1ib2wKLQkgICAgICAgJiYgcmVzdWx0UC0+WF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiAoc3ltYm9sX2dldF9mcmFnIChyaWdodC5YX2FkZF9zeW1ib2wpCi0JCSAgID09IHN5bWJvbF9nZXRfZnJhZyAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKSkKLQkgICAgICAgJiYgU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAocmlnaHQuWF9hZGRfc3ltYm9sKSkpCi0KLQl7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyICs9IChTX0dFVF9WQUxVRSAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKQotCQkJCSAgICAtIFNfR0VUX1ZBTFVFIChyaWdodC5YX2FkZF9zeW1ib2wpKTsKLQkgIHJlc3VsdFAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gMDsKLQl9Ci0gICAgICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fc3VidHJhY3QgJiYgcmlnaHQuWF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIFggLSBjb25zdGFudC4gICovCi0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgLT0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wX2xlZnQgPT0gT19hZGQgJiYgcmVzdWx0UC0+WF9vcCA9PSBPX2NvbnN0YW50KQotCXsKLQkgIC8qIENvbnN0YW50ICsgWC4gICovCi0JICByZXN1bHRQLT5YX29wID0gcmlnaHQuWF9vcDsKLQkgIHJlc3VsdFAtPlhfYWRkX3N5bWJvbCA9IHJpZ2h0LlhfYWRkX3N5bWJvbDsKLQkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gcmlnaHQuWF9vcF9zeW1ib2w7Ci0JICByZXN1bHRQLT5YX2FkZF9udW1iZXIgKz0gcmlnaHQuWF9hZGRfbnVtYmVyOwotCSAgcmV0dmFsID0gcmlnaHRzZWc7Ci0JfQotICAgICAgZWxzZSBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX2NvbnN0YW50ICYmIHJpZ2h0Llhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICAvKiBDb25zdGFudCBPUCBjb25zdGFudC4gICovCi0JICBvZmZzZXRUIHYgPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JICBpZiAodiA9PSAwICYmIChvcF9sZWZ0ID09IE9fZGl2aWRlIHx8IG9wX2xlZnQgPT0gT19tb2R1bHVzKSkKLQkgICAgewotCSAgICAgIGFzX3dhcm4gKF8oImRpdmlzaW9uIGJ5IHplcm8iKSk7Ci0JICAgICAgdiA9IDE7Ci0JICAgIH0KLQkgIHN3aXRjaCAob3BfbGVmdCkKLQkgICAgewotCSAgICBkZWZhdWx0OgkJCWFib3J0ICgpOwotCSAgICBjYXNlIE9fbXVsdGlwbHk6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgKj0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19kaXZpZGU6CQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgLz0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19tb2R1bHVzOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICU9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fbGVmdF9zaGlmdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciA8PD0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19yaWdodF9zaGlmdDoKLQkgICAgICAvKiBXZSBhbHdheXMgdXNlIHVuc2lnbmVkIHNoaWZ0cywgdG8gYXZvaWQgcmVseWluZyBvbgotICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGNvbXBpbGVyIHVzZWQgdG8gY29tcGlsZSBnYXMuICAqLwotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCShvZmZzZXRUKSAoKHZhbHVlVCkgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID4+ICh2YWx1ZVQpIHYpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIHw9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X29yX25vdDoJCXJlc3VsdFAtPlhfYWRkX251bWJlciB8PSB+djsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfZXhjbHVzaXZlX29yOglyZXN1bHRQLT5YX2FkZF9udW1iZXIgXj0gdjsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfYW5kOgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyICY9IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fYWRkOgkJCXJlc3VsdFAtPlhfYWRkX251bWJlciArPSB2OyBicmVhazsKLQkgICAgY2FzZSBPX3N1YnRyYWN0OgkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIC09IHY7IGJyZWFrOwotCSAgICBjYXNlIE9fZXE6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyID09IHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX25lOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciAhPSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19sdDoKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPCAgdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbGU6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0KLQkJcmVzdWx0UC0+WF9hZGRfbnVtYmVyIDw9IHYgPyB+IChvZmZzZXRUKSAwIDogMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBPX2dlOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9Ci0JCXJlc3VsdFAtPlhfYWRkX251bWJlciA+PSB2ID8gfiAob2Zmc2V0VCkgMCA6IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19ndDoKLQkgICAgICByZXN1bHRQLT5YX2FkZF9udW1iZXIgPQotCQlyZXN1bHRQLT5YX2FkZF9udW1iZXIgPiAgdiA/IH4gKG9mZnNldFQpIDAgOiAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6Ci0JICAgICAgcmVzdWx0UC0+WF9hZGRfbnVtYmVyID0gcmVzdWx0UC0+WF9hZGRfbnVtYmVyICYmIHY7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgT19sb2dpY2FsX29yOgotCSAgICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IHJlc3VsdFAtPlhfYWRkX251bWJlciB8fCB2OwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAocmVzdWx0UC0+WF9vcCA9PSBPX3N5bWJvbAotCSAgICAgICAmJiByaWdodC5YX29wID09IE9fc3ltYm9sCi0JICAgICAgICYmIChvcF9sZWZ0ID09IE9fYWRkCi0JCSAgIHx8IG9wX2xlZnQgPT0gT19zdWJ0cmFjdAotCQkgICB8fCAocmVzdWx0UC0+WF9hZGRfbnVtYmVyID09IDAKLQkJICAgICAgICYmIHJpZ2h0LlhfYWRkX251bWJlciA9PSAwKSkpCi0JewotCSAgLyogU3ltYm9sIE9QIHN5bWJvbC4gICovCi0JICByZXN1bHRQLT5YX29wID0gb3BfbGVmdDsKLQkgIHJlc3VsdFAtPlhfb3Bfc3ltYm9sID0gcmlnaHQuWF9hZGRfc3ltYm9sOwotCSAgaWYgKG9wX2xlZnQgPT0gT19hZGQpCi0JICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciArPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JICBlbHNlIGlmIChvcF9sZWZ0ID09IE9fc3VidHJhY3QpCi0JICAgIHJlc3VsdFAtPlhfYWRkX251bWJlciAtPSByaWdodC5YX2FkZF9udW1iZXI7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRoZSBnZW5lcmFsIGNhc2UuICAqLwotCSAgcmVzdWx0UC0+WF9hZGRfc3ltYm9sID0gbWFrZV9leHByX3N5bWJvbCAocmVzdWx0UCk7Ci0JICByZXN1bHRQLT5YX29wX3N5bWJvbCA9IG1ha2VfZXhwcl9zeW1ib2wgKCZyaWdodCk7Ci0JICByZXN1bHRQLT5YX29wID0gb3BfbGVmdDsKLQkgIHJlc3VsdFAtPlhfYWRkX251bWJlciA9IDA7Ci0JICByZXN1bHRQLT5YX3Vuc2lnbmVkID0gMTsKLQl9Ci0KLSAgICAgIG9wX2xlZnQgPSBvcF9yaWdodDsKLSAgICB9CQkJCS8qIFdoaWxlIG5leHQgb3BlcmF0b3IgaXMgPj0gdGhpcyByYW5rLiAqLwotCi0gIC8qIFRoZSBQQSBwb3J0IG5lZWRzIHRoaXMgaW5mb3JtYXRpb24uICAqLwotICBpZiAocmVzdWx0UC0+WF9hZGRfc3ltYm9sKQotICAgIHN5bWJvbF9tYXJrX3VzZWQgKHJlc3VsdFAtPlhfYWRkX3N5bWJvbCk7Ci0KLSAgcmV0dXJuIHJlc3VsdFAtPlhfb3AgPT0gT19jb25zdGFudCA/IGFic29sdXRlX3NlY3Rpb24gOiByZXR2YWw7Ci19Ci0MCi0vKgotICoJCQlnZXRfc3ltYm9sX2VuZCgpCi0gKgotICogVGhpcyBsaXZlcyBoZXJlIGJlY2F1c2UgaXQgYmVsb25ncyBlcXVhbGx5IGluIGV4cHIuYyAmIHJlYWQuYy4KLSAqIEV4cHIuYyBpcyBqdXN0IGEgYnJhbmNoIG9mZmljZSByZWFkLmMgYW55d2F5LCBhbmQgcHV0dGluZyBpdAotICogaGVyZSBsZXNzZW5zIHRoZSBjcm93ZCBhdCByZWFkLmMuCi0gKgotICogQXNzdW1lIGlucHV0X2xpbmVfcG9pbnRlciBpcyBhdCBzdGFydCBvZiBzeW1ib2wgbmFtZS4KLSAqIEFkdmFuY2UgaW5wdXRfbGluZV9wb2ludGVyIHBhc3Qgc3ltYm9sIG5hbWUuCi0gKiBUdXJuIHRoYXQgY2hhcmFjdGVyIGludG8gYSAnXDAnLCByZXR1cm5pbmcgaXRzIGZvcm1lciB2YWx1ZS4KLSAqIFRoaXMgYWxsb3dzIGEgc3RyaW5nIGNvbXBhcmUgKFJNUyB3YW50cyBzeW1ib2wgbmFtZXMgdG8gYmUgc3RyaW5ncykKLSAqIG9mIHRoZSBzeW1ib2wgbmFtZS4KLSAqIFRoZXJlIHdpbGwgYWx3YXlzIGJlIGEgY2hhciBmb2xsb3dpbmcgc3ltYm9sIG5hbWUsIGJlY2F1c2UgYWxsIGdvb2QKLSAqIGxpbmVzIGVuZCBpbiBlbmQtb2YtbGluZS4KLSAqLwotY2hhcgotZ2V0X3N5bWJvbF9lbmQgKCkKLXsKLSAgY2hhciBjOwotCi0gIC8qIFdlIGFjY2VwdCBcMDAxIGluIGEgbmFtZSBpbiBjYXNlIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHdpdGggYQotICAgICBjb25zdHJ1Y3RlZCBzdHJpbmcuICAqLwotICBpZiAoaXNfbmFtZV9iZWdpbm5lciAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykgfHwgYyA9PSAnXDAwMScpCi0gICAgewotICAgICAgd2hpbGUgKGlzX3BhcnRfb2ZfbmFtZSAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLQkgICAgIHx8IGMgPT0gJ1wwMDEnKQotCTsKLSAgICAgIGlmIChpc19uYW1lX2VuZGVyIChjKSkKLQljID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgIH0KLSAgKi0taW5wdXRfbGluZV9wb2ludGVyID0gMDsKLSAgcmV0dXJuIChjKTsKLX0KLQotCi11bnNpZ25lZCBpbnQKLWdldF9zaW5nbGVfbnVtYmVyICgpCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSAgb3BlcmFuZCAoJmV4cCk7Ci0gIHJldHVybiBleHAuWF9hZGRfbnVtYmVyOwotCi19Ci0KLS8qIGVuZCBvZiBleHByLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9leHByLmggYi9nYXMvZXhwci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzc2NDA5Li4wMDAwMDAwCi0tLSBhL2dhcy9leHByLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogZXhwci5oIC0+IGhlYWRlciBmaWxlIGZvciBleHByLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTItOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBCeSBwb3B1bGFyIGRlbWFuZCwgd2UgZGVmaW5lIGEgc3RydWN0IHRvIHJlcHJlc2VudCBhbiBleHByZXNzaW9uLgotICogVGhpcyB3aWxsIG5vIGRvdWJ0IG11dGF0ZSBhcyBleHByZXNzaW9ucyBiZWNvbWUgYmFyb3F1ZS4KLSAqCi0gKiBDdXJyZW50bHksIHdlIHN1cHBvcnQgZXhwcmVzc2lvbnMgbGlrZSAiZm9vIE9QIGJhciArIDQyIi4gIEluIG90aGVyCi0gKiB3b3JkcyB3ZSBwZXJtaXQgYSAocG9zc2libHkgdW5kZWZpbmVkKSBzeW1ib2wsIGEgKHBvc3NpYmx5Ci0gKiB1bmRlZmluZWQpIHN5bWJvbCBhbmQgdGhlIG9wZXJhdGlvbiB1c2VkIHRvIGNvbWJpbmUgdGhlIHN5bWJvbHMsCi0gKiBhbmQgYW4gKGFic29sdXRlKSBhdWdlbmQuICBSTVMgc2F5cyB0aGlzIGlzIHNvIHdlIGNhbiBoYXZlIDEtcGFzcwotICogYXNzZW1ibHkgZm9yIGFueSBjb21waWxlciBlbWlzc2lvbnMsIGFuZCBhICdjYXNlJyBzdGF0ZW1lbnQgbWlnaHQKLSAqIGVtaXQgJ3VuZGVmaW5lZDEgLSB1bmRlZmluZWQyJy4KLSAqCi0gKiBUaGUgdHlwZSBvZiBhbiBleHByZXNzaW9uIHVzZWQgdG8gYmUgc3RvcmVkIGFzIGEgc2VnbWVudC4gIFRoYXQgZ290Ci0gKiBjb25mdXNpbmcgYmVjYXVzZSBpdCBvdmVybG9hZGVkIHRoZSBjb25jZXB0IG9mIGEgc2VnbWVudC4gIEkgYWRkZWQKLSAqIGFuIG9wZXJhdG9yIGZpZWxkLCBpbnN0ZWFkLgotICovCi0KLS8qIFRoaXMgaXMgdGhlIHR5cGUgb2YgYW4gZXhwcmVzc2lvbi4gIFRoZSBvcGVyYXRvciB0eXBlcyBhcmUgYWxzbwotICAgdXNlZCB3aGlsZSBwYXJzaW5nIGFuIGV4cHJlc3Npb24uCi0KLSAgIE5PVEU6IFRoaXMgZW51bWVyYXRpb24gbXVzdCBtYXRjaCB0aGUgb3BfcmFuayBhcnJheSBpbiBleHByLmMuICAqLwotCi10eXBlZGVmIGVudW0KLXsKLSAgLyogQW4gaWxsZWdhbCBleHByZXNzaW9uLiAgKi8KLSAgT19pbGxlZ2FsLAotICAvKiBBIG5vbmV4aXN0ZW50IGV4cHJlc3Npb24uICAqLwotICBPX2Fic2VudCwKLSAgLyogWF9hZGRfbnVtYmVyIChhIGNvbnN0YW50IGV4cHJlc3Npb24pLiAgKi8KLSAgT19jb25zdGFudCwKLSAgLyogWF9hZGRfc3ltYm9sICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19zeW1ib2wsCi0gIC8qIFhfYWRkX3N5bWJvbCArIFhfYWRkX251bWJlciAtIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGltYWdlLiAgKi8KLSAgT19zeW1ib2xfcnZhLAotICAvKiBBIHJlZ2lzdGVyIChYX2FkZF9udW1iZXIgaXMgcmVnaXN0ZXIgbnVtYmVyKS4gICovCi0gIE9fcmVnaXN0ZXIsCi0gIC8qIEEgYmlnIHZhbHVlLiAgSWYgWF9hZGRfbnVtYmVyIGlzIG5lZ2F0aXZlIG9yIDAsIHRoZSB2YWx1ZSBpcyBpbgotICAgICBnZW5lcmljX2Zsb2F0aW5nX3BvaW50X251bWJlci4gIE90aGVyd2lzZSB0aGUgdmFsdWUgaXMgaW4KLSAgICAgZ2VuZXJpY19iaWdudW0sIGFuZCBYX2FkZF9udW1iZXIgaXMgdGhlIG51bWJlciBvZiBMSVRUTEVOVU1zIGluCi0gICAgIHRoZSB2YWx1ZS4gICovCi0gIE9fYmlnLAotICAvKiAoLSBYX2FkZF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT191bWludXMsCi0gIC8qICh+IFhfYWRkX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9ub3QsCi0gIC8qICghIFhfYWRkX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xvZ2ljYWxfbm90LAotICAvKiAoWF9hZGRfc3ltYm9sICogWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19tdWx0aXBseSwKLSAgLyogKFhfYWRkX3N5bWJvbCAvIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fZGl2aWRlLAotICAvKiBYX2FkZF9zeW1ib2wgJSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX21vZHVsdXMsCi0gIC8qIFhfYWRkX3N5bWJvbCA8PCBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xlZnRfc2hpZnQsCi0gIC8qIFhfYWRkX3N5bWJvbCA+PiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX3JpZ2h0X3NoaWZ0LAotICAvKiBYX2FkZF9zeW1ib2wgfCBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9pbmNsdXNpdmVfb3IsCi0gIC8qIFhfYWRkX3N5bWJvbCB8fiBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2JpdF9vcl9ub3QsCi0gIC8qIFhfYWRkX3N5bWJvbCBeIFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fYml0X2V4Y2x1c2l2ZV9vciwKLSAgLyogWF9hZGRfc3ltYm9sICYgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19iaXRfYW5kLAotICAvKiBYX2FkZF9zeW1ib2wgKyBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2FkZCwKLSAgLyogWF9hZGRfc3ltYm9sIC0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19zdWJ0cmFjdCwKLSAgLyogKFhfYWRkX3N5bWJvbCA9PSBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2VxLAotICAvKiAoWF9hZGRfc3ltYm9sICE9IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbmUsCi0gIC8qIChYX2FkZF9zeW1ib2wgPCBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2x0LAotICAvKiAoWF9hZGRfc3ltYm9sIDw9IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fbGUsCi0gIC8qIChYX2FkZF9zeW1ib2wgPj0gWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19nZSwKLSAgLyogKFhfYWRkX3N5bWJvbCA+IFhfb3Bfc3ltYm9sKSArIFhfYWRkX251bWJlci4gICovCi0gIE9fZ3QsCi0gIC8qIChYX2FkZF9zeW1ib2wgJiYgWF9vcF9zeW1ib2wpICsgWF9hZGRfbnVtYmVyLiAgKi8KLSAgT19sb2dpY2FsX2FuZCwKLSAgLyogKFhfYWRkX3N5bWJvbCB8fCBYX29wX3N5bWJvbCkgKyBYX2FkZF9udW1iZXIuICAqLwotICBPX2xvZ2ljYWxfb3IsCi0gIC8qIFhfb3Bfc3ltYm9sIFsgWF9hZGRfc3ltYm9sIF0gKi8KLSAgT19pbmRleCwKLSAgLyogdGhpcyBtdXN0IGJlIHRoZSBsYXJnZXN0IHZhbHVlICovCi0gIE9fbWF4Ci19IG9wZXJhdG9yVDsKLQotdHlwZWRlZiBzdHJ1Y3QgZXhwcmVzc2lvblMKLXsKLSAgLyogVGhlIG1haW4gc3ltYm9sLiAgKi8KLSAgc3ltYm9sUyAqWF9hZGRfc3ltYm9sOwotICAvKiBUaGUgc2Vjb25kIHN5bWJvbCwgaWYgbmVlZGVkLiAgKi8KLSAgc3ltYm9sUyAqWF9vcF9zeW1ib2w7Ci0gIC8qIEEgbnVtYmVyIHRvIGFkZC4gICovCi0gIG9mZnNldFQgWF9hZGRfbnVtYmVyOwotICAvKiBUaGUgdHlwZSBvZiB0aGUgZXhwcmVzc2lvbi4gIFdlIGNhbid0IGFzc3VtZSB0aGF0IGFuIGFyYml0cmFyeQotICAgICBjb21waWxlciBjYW4gaGFuZGxlIGEgYml0ZmllbGQgb2YgZW51bSB0eXBlLiAgRklYTUU6IFdlIGNvdWxkCi0gICAgIGNoZWNrIHRoaXMgdXNpbmcgYXV0b2NvbmYuICAqLwotI2lmZGVmIF9fR05VQ19fCi0gIG9wZXJhdG9yVCBYX29wIDogNzsKLSNlbHNlCi0gIHVuc2lnbmVkIFhfb3AgOiA3OwotI2VuZGlmCi0gIC8qIE5vbi16ZXJvIGlmIFhfYWRkX251bWJlciBzaG91bGQgYmUgcmVnYXJkZWQgYXMgdW5zaWduZWQuICBUaGlzIGlzCi0gICAgIG9ubHkgdmFsaWQgZm9yIE9fY29uc3RhbnQgZXhwcmVzc2lvbnMuICBJdCBpcyBvbmx5IHVzZWQgd2hlbiBhbgotICAgICBPX2NvbnN0YW50IG11c3QgYmUgZXh0ZW5kZWQgaW50byBhIGJpZ251bSAoaS5lLiwgaXQgaXMgbm90IHVzZWQKLSAgICAgd2hlbiBwZXJmb3JtaW5nIGFyaXRobWV0aWMgb24gdGhlc2UgdmFsdWVzKS4KLSAgICAgRklYTUU6IFRoaXMgZmllbGQgaXMgbm90IHNldCB2ZXJ5IHJlbGlhYmx5LiAgKi8KLSAgdW5zaWduZWQgaW50IFhfdW5zaWduZWQgOiAxOwotfSBleHByZXNzaW9uUzsKLQotLyogInJlc3VsdCIgc2hvdWxkIGJlIHR5cGUgKGV4cHJlc3Npb25TICopLiAqLwotI2RlZmluZSBleHByZXNzaW9uKHJlc3VsdCkgZXhwciAoMCwgcmVzdWx0KQotCi0vKiBJZiBhbiBleHByZXNzaW9uIGlzIE9fYmlnLCBsb29rIGhlcmUgZm9yIGl0cyB2YWx1ZS4gVGhlc2UgY29tbW9uCi0gICBkYXRhIG1heSBiZSBjbG9iYmVyZWQgd2hlbmV2ZXIgZXhwcigpIGlzIGNhbGxlZC4gKi8KLS8qIEZsb251bXMgcmV0dXJuZWQgaGVyZS4gIEJpZyBlbm91Z2ggdG8gaG9sZCBtb3N0IHByZWNpc2UgZmxvbnVtLiAqLwotZXh0ZXJuIEZMT05VTV9UWVBFIGdlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyOwotLyogQmlnbnVtcyByZXR1cm5lZCBoZXJlLiAqLwotZXh0ZXJuIExJVFRMRU5VTV9UWVBFIGdlbmVyaWNfYmlnbnVtW107Ci0vKiBOdW1iZXIgb2YgbGl0dGxlbnVtcyBpbiBhYm92ZS4gKi8KLSNkZWZpbmUgU0laRV9PRl9MQVJHRV9OVU1CRVIgKDIwKQotCi10eXBlZGVmIGNoYXIgb3BlcmF0b3JfcmFua1Q7Ci0KLWV4dGVybiBjaGFyIGdldF9zeW1ib2xfZW5kIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGV4cHJfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZXhwcl9zZXRfcHJlY2VkZW5jZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gc2VnVCBleHByIFBBUkFNUyAoKGludCByYW5rLCBleHByZXNzaW9uUyAqIHJlc3VsdFApKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgZ2V0X3NpbmdsZV9udW1iZXIgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHN5bWJvbFMgKm1ha2VfZXhwcl9zeW1ib2wgUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHByZXNzaW9uUCkpOwotZXh0ZXJuIGludCBleHByX3N5bWJvbF93aGVyZQotICBQQVJBTVMgKChzeW1ib2xTICosIGNoYXIgKiosIHVuc2lnbmVkIGludCAqKSk7Ci0KLWV4dGVybiBzeW1ib2xTICpleHByX2J1aWxkX3Vjb25zdGFudCBQQVJBTVMgKChvZmZzZXRUKSk7Ci1leHRlcm4gc3ltYm9sUyAqZXhwcl9idWlsZF91bmFyeSBQQVJBTVMgKChvcGVyYXRvclQsIHN5bWJvbFMgKikpOwotZXh0ZXJuIHN5bWJvbFMgKmV4cHJfYnVpbGRfYmluYXJ5IFBBUkFNUyAoKG9wZXJhdG9yVCwgc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLWV4dGVybiBzeW1ib2xTICpleHByX2J1aWxkX2RvdCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIGVuZCBvZiBleHByLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0tY29weS5jIGIvZ2FzL2Zsb251bS1jb3B5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2M1Y2MuLjAwMDAwMDAKLS0tIGEvZ2FzL2Zsb251bS1jb3B5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBmbG9udW1fY29weS5jIC0gY29weSBhIGZsb251bQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotCi12b2lkCi1mbG9udW1fY29weSAoaW4sIG91dCkKLSAgICAgRkxPTlVNX1RZUEUgKmluOwotICAgICBGTE9OVU1fVFlQRSAqb3V0OwotewotICB1bnNpZ25lZCBpbnQgaW5fbGVuZ3RoOwkJLyogMCBvcmlnaW4gKi8KLSAgdW5zaWduZWQgaW50IG91dF9sZW5ndGg7CQkvKiAwIG9yaWdpbiAqLwotCi0gIG91dC0+c2lnbiA9IGluLT5zaWduOwotICBpbl9sZW5ndGggPSBpbi0+bGVhZGVyIC0gaW4tPmxvdzsKLQotICBpZiAoaW4tPmxlYWRlciA8IGluLT5sb3cpCi0gICAgewotICAgICAgb3V0LT5sZWFkZXIgPSBvdXQtPmxvdyAtIDE7CS8qIDAuMCBjYXNlICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb3V0X2xlbmd0aCA9IG91dC0+aGlnaCAtIG91dC0+bG93OwotICAgICAgLyoKLSAgICAgICAqIEFzc3VtZSBubyBHQVBTIGluIHBhY2tpbmcgb2YgbGl0dGxlbnVtcy4KLSAgICAgICAqIEkuZS4gc2l6ZW9mKGFycmF5KSA9PSBzaXplb2YoZWxlbWVudCkgKiBudW1iZXJfb2ZfZWxlbWVudHMuCi0gICAgICAgKi8KLSAgICAgIGlmIChpbl9sZW5ndGggPD0gb3V0X2xlbmd0aCkKLQl7Ci0JICB7Ci0JICAgIC8qCi0JICAgICAqIEZvciBkZWZlbnNpdmUgcHJvZ3JhbW1pbmcsIHplcm8gYW55IGhpZ2gtb3JkZXIgbGl0dGxlbnVtcyB3ZSBkb24ndCBuZWVkLgotCSAgICAgKiBUaGlzIGlzIGRlc3Ryb3lpbmcgZXZpZGVuY2UgYW5kIHdhc3RpbmcgdGltZSwgc28gd2h5IGJvdGhlcj8/PwotCSAgICAgKi8KLQkgICAgaWYgKGluX2xlbmd0aCA8IG91dF9sZW5ndGgpCi0JICAgICAgewotCQltZW1zZXQgKChjaGFyICopIChvdXQtPmxvdyArIGluX2xlbmd0aCArIDEpLCAnXDAnLCBvdXRfbGVuZ3RoIC0gaW5fbGVuZ3RoKTsKLQkgICAgICB9Ci0JICB9Ci0JICBtZW1jcHkgKCh2b2lkICopIChvdXQtPmxvdyksICh2b2lkICopIChpbi0+bG93KSwgKChpbl9sZW5ndGggKyAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSk7Ci0JICBvdXQtPmV4cG9uZW50ID0gaW4tPmV4cG9uZW50OwotCSAgb3V0LT5sZWFkZXIgPSBpbi0+bGVhZGVyIC0gaW4tPmxvdyArIG91dC0+bG93OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgc2hvcnRlbjsJCS8qIDEtb3JpZ2luLiBOdW1iZXIgb2YgbGl0dGxlbnVtcyB3ZSBkcm9wLiAqLwotCi0JICBzaG9ydGVuID0gaW5fbGVuZ3RoIC0gb3V0X2xlbmd0aDsKLQkgIC8qIEFzc3VtZSBvdXRfbGVuZ3RoID49IDAgISAqLwotCSAgbWVtY3B5ICgodm9pZCAqKSAob3V0LT5sb3cpLCAodm9pZCAqKSAoaW4tPmxvdyArIHNob3J0ZW4pLCAoKG91dF9sZW5ndGggKyAxKSAqIHNpemVvZiAoTElUVExFTlVNX1RZUEUpKSk7Ci0JICBvdXQtPmxlYWRlciA9IG91dC0+aGlnaDsKLQkgIG91dC0+ZXhwb25lbnQgPSBpbi0+ZXhwb25lbnQgKyBzaG9ydGVuOwotCX0KLSAgICB9CQkJCS8qIGlmIGFueSBzaWduaWZpY2FudCBiaXRzICovCi19CQkJCS8qIGZsb251bV9jb3B5KCkgKi8KLQotLyogZW5kIG9mIGZsb251bV9jb3B5LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0ta29uc3QuYyBiL2dhcy9mbG9udW0ta29uc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiYmEwNS4uMDAwMDAwMAotLS0gYS9nYXMvZmxvbnVtLWtvbnN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyogZmxvbnVtX2NvbnN0LmMgLSBVc2VmdWwgRmxvbnVtIGNvbnN0YW50cwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAiZmxvbnVtLmgiCi0vKiBKRjogIEkgYWRkZWQgdGhlIGxhc3QgZW50cnkgdG8gdGhpcyB0YWJsZSwgYW5kIEknbSBub3QKLSAgIHN1cmUgaWYgaXRzIHJpZ2h0IG9yIG5vdC4gIENvdWxkIGdvIGVpdGhlciB3YXkuICBJIHdpc2gKLSAgIEkgcmVhbGx5IHVuZGVyc3Rvb2QgdGhpcyBzdHVmZi4gKi8KLQotCi1jb25zdCBpbnQgdGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbiA9IDEzOwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgemVyb1tdID0KLXsxfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglXYXJuaW5nOiB0aGUgbG93IG9yZGVyIGJpdHMgbWF5IGJlIFdST05HIGhlcmUuCQkJKgotICoJSSB0b29rIHRoaXMgZnJvbSBhIHN1c3BlY3QgYmMoMSkgc2NyaXB0LgkJCSoKLSAqCSJtaW51c19YIltdIGlzIHN1cHBvc2VkIHRvIGJlIDEwXigyXi1YKSBleHByZXNzZWQgaW4gYmFzZSAyXjE2LgkqCi0gKglUaGUgcmFkaXggcG9pbnQgaXMganVzdCBBRlRFUiB0aGUgaGlnaGVzdCBlbGVtZW50IG9mIHRoZSBbXQkqCi0gKgkJCQkJCQkJCSoKLSAqCUJlY2F1c2UgYmMgcm91bmRzIERPV04gZm9yIHByaW50aW5nIChJIHRoaW5rKSwgdGhlIGxvd2VzdAkqCi0gKglzaWduaWZpY2FuY2UgbGl0dGxlbnVtcyBzaG91bGQgcHJvYmFibHkgaGF2ZSAxIGFkZGVkIHRvIHRoZW0uCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSkY6ICBJZiB0aGlzIGVxdWFscyA2NTUzLygyXjE2KSszOTMyMS8oMl4zMikrLi4uICBpdCBhcHByb2FjaGVzIC4xICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMVtdID0KLXsKLSAgMzkzMjIsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsCi0gIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDM5MzIxLCAzOTMyMSwgMzkzMjEsIDY1NTN9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMVtdID0KLXsxMH07Ci0KLS8qIEpGOiAgSWYgdGhpcyBlcXVhbHMgNjU1LygyXjE2KSArIDIzNTkyLygyXjMyKSArIC4uLiBpdCBhcHByb2FjaGVzIC4wMSAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzJbXSA9Ci17Ci0gIDEwNDg2LCAzNjcwMCwgNjI5MTQsIDIzNTkyLCA0OTgwNywgMTA0ODUsIDM2NzAwLCA2MjkxNCwgMjM1OTIsIDQ5ODA3LAotICAxMDQ4NSwgMzY3MDAsIDYyOTE0LCAyMzU5MiwgNDk4MDcsIDEwNDg1LCAzNjcwMCwgNjI5MTQsIDIzNTkyLCA2NTV9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMltdID0KLXsxMDB9OwotCi0vKiBUaGlzIGFwcHJvYWNoZXMgLjAwMDEgKi8KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18zW10gPQotewotICA1MjUzNCwgMjAwMjcsIDM3MzI5LCA2NTExNiwgNjQwNjcsIDYwMzk3LCAxNDc4NCwgMTg5NzksIDMzNjU5LCAxOTUwMywKLSAgMjcyNiwgOTU0MiwgNjI5LCAyMjAyLCA0MDQ3NSwgMTA1OTAsIDQyOTksIDQ3ODE1LCAzNjI4MCwgNn07Ci1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgcGx1c18zW10gPQotezEwMDAwfTsKLQotLyogSkY6IHRoaXMgYXBwcm9hY2hlcyAxZS04ICovCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfNFtdID0KLXsKLSAgMjI1MTcsIDQ5NTAxLCA1NDI5MywgMTk0MjQsIDYwNjk5LCA2NzE2LCAyNDM0OCwgMjI2MTgsIDIzOTA0LCAyMTMyNywKLSAgMzkxOSwgNDQ3MDMsIDE5MTQ5LCAyODgwMywgNDg5NTksIDYyNTksIDUwMjczLCA2MjIzNywgNDJ9OwotLyogVGhpcyBlcXVhbHMgMTUyNSAqIDJeMTYgKyA1NzYwMCAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfNFtdID0KLXs1NzYwMCwgMTUyNX07Ci0KLS8qIFRoaXMgYXBwcm9hY2hlcyAxZS0xNiAqLwotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIG1pbnVzXzVbXSA9Ci17Ci0gIDIyMTk5LCA0NTk1NywgMTcwMDUsIDI2MjY2LCAxMDUyNiwgMTYyNjAsIDU1MDE3LCAzNTY4MCwgNDA0NDMsIDE5Nzg5LAotICAxNzM1NiwgMzAxOTUsIDU1OTA1LCAyODQyNiwgNjMwMTAsIDQ0MTk3LCAxODQ0fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzVbXSA9Ci17Mjg2MDksIDM0NTQ2LCAzNX07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c182W10gPQotewotICAzMDkyNiwgMjY1MTgsIDEzMTEwLCA0MzAxOCwgNTQ5ODIsIDQ4MjU4LCAyNDY1OCwgMTUyMDksIDYzMzY2LCAxMTkyOSwKLSAgMjAwNjksIDQzODU3LCA2MDQ4NywgNTF9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfNltdID0KLXs2MTMxMywgMzQyMjAsIDE2NzMxLCAxMTYyOSwgMTI2Mn07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c183W10gPQotewotICAyOTgxOSwgMTQ3MzMsIDIxNDkwLCA0MDYwMiwgMzEzMTUsIDY1MTg2LCAyNjk1fTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzdbXSA9Ci17Ci0gIDc5MzcsIDQ5MDAyLCA2MDc3MiwgMjgyMTYsIDM4ODkzLCA1NTk3NSwgNjM5ODgsIDU5NzExLCAyMDIyNywgMjR9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfOFtdID0KLXsKLSAgMjc1NzksIDY0ODA3LCAxMjU0MywgNzk0LCAxMzkwNywgNjEyOTcsIDEyMDEzLCA2NDM2MCwgMTU5NjEsIDIwNTY2LAotICAyNDE3OCwgMTU5MjIsIDU5NDI3LCAxMTB9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfOFtdID0KLXsKLSAgMTU4NzMsIDExOTI1LCAzOTE3NywgOTkxLCAxNDU4OSwgMzg2MSwgNTg0MTUsIDkwNzYsIDYyOTU2LCA1NDIyMywKLSAgNTYzMjgsIDUwMTgwLCA0NTI3NCwgNDgzMzMsIDMyNTM3LCA0MjU0NywgOTczMSwgNTk2NzksIDU5MH07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c185W10gPQotewotICAxMTA0MiwgODQ2NCwgNTg5NzEsIDYzNDI5LCA2MDIyLCA2MzQ4NSwgNTUwMCwgNTM0NjQsIDQ3NTQ1LCA1MDA2OCwKLSAgNTY5ODgsIDIyODE5LCA0OTcwOCwgNTQ0OTMsIDk5MjAsIDQ3NjY3LCA0MDQwOSwgMzU3NjQsIDEwMzgzLCA1NDQ2NiwKLSAgMzI3MDIsIDE3NDkzLCAzMjQyMCwgMzQzODIsIDIyNzUwLCAyMDY4MSwgMTIzMDB9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfOVtdID0KLXsKLSAgMjA2NzgsIDI3NjE0LCAyODI3MiwgNTMwNjYsIDU1MzExLCA1NDY3NywgMjkwMzgsIDk5MDYsIDI2Mjg4LCA0NDQ4NiwKLSAgMTM4NjAsIDc0NDUsIDU0MTA2LCAxNTQyNiwgMjE1MTgsIDI1NTk5LCAyOTYzMiwgNTIzMDksIDYxMjA3LCAyNjEwNSwKLSAgMTA0ODIsIDIxOTQ4LCA1MTE5MSwgMzI5ODgsIDYwODkyLCA2MjU3NCwgNjEzOTAsIDI0NTQwLCAyMTQ5NSwgNX07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xMFtdID0KLXsKLSAgNjIxNCwgNDg3NzEsIDIzNDcxLCAzMDE2MywgMzE3NjMsIDM4MDEzLCA1NzAwMSwgMTE3NzAsIDE4MjYzLCAzNjM2NiwKLSAgMjA3NDIsIDQ1MDg2LCA1Njk2OSwgNTMyMzEsIDM3ODU2LCA1NTgxNCwgMzgwNTcsIDE1NjkyLCA0Njc2MSwgODcxMywKLSAgNjEwMiwgMjAwODMsIDgyNjksIDExODM5LCAxMTU3MSwgNTA5NjMsIDE1NjQ5LCAxMTY5OCwgNDA2NzUsIDIzMDh9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMTBbXSA9Ci17Ci0gIDYzODM5LCAzNjU3NiwgNDU3MTIsIDQ0NTE2LCAzNzgwMywgMjk0ODIsIDQ5NjYsIDMwNTU2LCAzNzk2MSwgMjMzMTAsCi0gIDI3MDcwLCA0NDk3MiwgMjk1MDcsIDQ4MjU3LCA0NTIwOSwgNzQ5NCwgMTc4MzEsIDM4NzI4LCA0MTU3NywgMjk0NDMsCi0gIDM2MDE2LCA3OTU1LCAzNTMzOSwgMzU0NzksIDM2MDExLCAxNDU1MywgNDk2MTgsIDU1ODgsIDI1Mzk2LCAyOH07Ci0KLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBtaW51c18xMVtdID0KLXsKLSAgMTY2NjMsIDU2ODgyLCA2MTk4MywgNzgwNCwgMzY1NTUsIDMyMDYwLCAzNDUwMiwgMTAwMCwgMTQzNTYsIDIxNjgxLAotICA2NjA1LCAzNDc2NywgNTE0MTEsIDU5MDQ4LCA1MzYxNCwgMzk4NTAsIDMwMDc5LCA2NDk2LCA2ODQ2LCAyNjg0MSwKLSAgNDA3NzgsIDE5NTc4LCA1OTg5OSwgNDQwODUsIDU0MDE2LCAyNDI1OSwgMTEyMzIsIDIxMjI5LCAyMTMxMywgODF9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMTFbXSA9Ci17Ci0gIDkyLCA5MDU0LCA2MjcwNywgMTc5OTMsIDc4MjEsIDU2ODM4LCAxMzk5MiwgMjEzMjEsIDI5NjM3LCA0ODQyNiwKLSAgNDI5ODIsIDM4NjY4LCA0OTU3NCwgMjg4MjAsIDE4MjAwLCAxODkyNywgNTM5NzksIDE2MjE5LCAzNzQ4NCwgMjUxNiwKLSAgNDQ2NDIsIDE0NjY1LCAxMTU4NywgNDE5MjYsIDEzNTU2LCAyMzk1NiwgNTQzMjAsIDY2NjEsIDU1NzY2LCA4MDV9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMTJbXSA9Ci17Ci0gIDMzMjAyLCA0NTk2OSwgNTg4MDQsIDU2NzM0LCAxNjQ4MiwgMjYwMDcsIDQ0OTg0LCA0OTMzNCwgMzEwMDcsIDMyOTQ0LAotICA0NDUxNywgNjMzMjksIDQ3MTMxLCAxNTI5MSwgNTk0NjUsIDIyNjQsIDIzMjE4LCAxMTgyOSwgNTk3NzEsIDM4Nzk4LAotICAzMTA1MSwgMjg3NDgsIDIzMTI5LCA0MDU0MSwgNDE1NjIsIDM1MTA4LCA1MDYyMCwgNTkwMTQsIDUxODE3LCA2NjEzfTsKLXN0YXRpYyBjb25zdCBMSVRUTEVOVU1fVFlQRSBwbHVzXzEyW10gPQotewotICAxMDA5OCwgMzc5MjIsIDU4MDcwLCA3NDMyLCAxMDQ3MCwgNjM0NjUsIDIzNzE4LCA2MjE5MCwgNDc0MjAsIDcwMDksCi0gIDM4NDQzLCA0NTg3LCA0NTU5NiwgMzg0NzIsIDUyMTI5LCA1Mjc3OSwgMjkwMTIsIDEzNTU5LCA0ODY4OCwgMzE2NzgsCi0gIDQxNzUzLCA1ODY2MiwgMTA2NjgsIDM2MDY3LCAyOTkwNiwgNTY5MDYsIDIxNDYxLCA0NjU1NiwgNTk1NzEsIDl9OwotCi1zdGF0aWMgY29uc3QgTElUVExFTlVNX1RZUEUgbWludXNfMTNbXSA9Ci17Ci0gIDQ1MzA5LCAyNzU5MiwgMzcxNDQsIDM0NjM3LCAzNDMyOCwgNDE2NzEsIDM0NjIwLCAyNDEzNSwgNTM0MDEsIDIyMTEyLAotICAyMTU3NiwgNDUxNDcsIDM5MzEwLCA0NDA1MSwgNDg1NzIsIDM2NzYsIDQ2NTQ0LCA1OTc2OCwgMzMzNTAsIDIzMjMsCi0gIDQ5NTI0LCA2MTU2OCwgMzkwMywgMzY0ODcsIDM2MzU2LCAzMDkwMywgMTQ5NzUsIDkwMzUsIDI5NzE1LCA2Njd9Owotc3RhdGljIGNvbnN0IExJVFRMRU5VTV9UWVBFIHBsdXNfMTNbXSA9Ci17Ci0gIDE4Nzg4LCAxNjk2MCwgNjMxOCwgNDU2ODUsIDU1NDAwLCA0NjIzMCwgMzU3OTQsIDI1NTg4LCA3MjUzLCA1NTU0MSwKLSAgNDk3MTYsIDU5NzYwLCA2MzU5MiwgODE5MSwgNjM3NjUsIDU4NTMwLCA0NDY2NywgMTMyOTQsIDEwMDAxLCA1NTU4NiwKLSAgNDc4ODcsIDE4NzM4LCA5NTA5LCA0MDg5NiwgNDI1MDYsIDUyNTgwLCA0MTcxLCAzMjUsIDEyMzI5LCA5OH07Ci0KLS8qIFNodXQgdXAgY29tcGxhaW50cyBhYm91dCBkaWZmZXJpbmcgcG9pbnRlciB0eXBlcy4gIFRoZXkgb25seSBkaWZmZXIKLSAgIGluIHRoZSBjb25zdCBhdHRyaWJ1dGUsIGJ1dCB0aGVyZSBpc24ndCBhbnkgZWFzeSB3YXkgdG8gZG8gdGhpcwotICAgKi8KLSNkZWZpbmUgWCAoTElUVExFTlVNX1RZUEUgKikKLQotY29uc3QgRkxPTlVNX1RZUEUgZmxvbnVtX25lZ2F0aXZlX3Bvd2Vyc19vZl90ZW5bXSA9Ci17Ci0gIHtYIHplcm8sIFggemVybywgWCB6ZXJvLCAwLCAnKyd9LAotICB7WCBtaW51c18xLCBYIG1pbnVzXzEgKyAxOSwgWCBtaW51c18xICsgMTksIC0yMCwgJysnfSwKLSAge1ggbWludXNfMiwgWCBtaW51c18yICsgMTksIFggbWludXNfMiArIDE5LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzMsIFggbWludXNfMyArIDE5LCBYIG1pbnVzXzMgKyAxOSwgLTIwLCAnKyd9LAotICB7WCBtaW51c180LCBYIG1pbnVzXzQgKyAxOCwgWCBtaW51c180ICsgMTgsIC0yMCwgJysnfSwKLSAge1ggbWludXNfNSwgWCBtaW51c181ICsgMTYsIFggbWludXNfNSArIDE2LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzYsIFggbWludXNfNiArIDEzLCBYIG1pbnVzXzYgKyAxMywgLTIwLCAnKyd9LAotICB7WCBtaW51c183LCBYIG1pbnVzXzcgKyA2LCBYIG1pbnVzXzcgKyA2LCAtMjAsICcrJ30sCi0gIHtYIG1pbnVzXzgsIFggbWludXNfOCArIDEzLCBYIG1pbnVzXzggKyAxMywgLTQwLCAnKyd9LAotICB7WCBtaW51c185LCBYIG1pbnVzXzkgKyAyNiwgWCBtaW51c185ICsgMjYsIC04MCwgJysnfSwKLSAge1ggbWludXNfMTAsIFggbWludXNfMTAgKyAyOSwgWCBtaW51c18xMCArIDI5LCAtMTM2LCAnKyd9LAotICB7WCBtaW51c18xMSwgWCBtaW51c18xMSArIDI5LCBYIG1pbnVzXzExICsgMjksIC0yNDIsICcrJ30sCi0gIHtYIG1pbnVzXzEyLCBYIG1pbnVzXzEyICsgMjksIFggbWludXNfMTIgKyAyOSwgLTQ1NSwgJysnfSwKLSAge1ggbWludXNfMTMsIFggbWludXNfMTMgKyAyOSwgWCBtaW51c18xMyArIDI5LCAtODgwLCAnKyd9LAotfTsKLQotY29uc3QgRkxPTlVNX1RZUEUgZmxvbnVtX3Bvc2l0aXZlX3Bvd2Vyc19vZl90ZW5bXSA9Ci17Ci0gIHtYIHplcm8sIFggemVybywgWCB6ZXJvLCAwLCAnKyd9LAotICB7WCBwbHVzXzEsIFggcGx1c18xICsgMCwgWCBwbHVzXzEgKyAwLCAwLCAnKyd9LAotICB7WCBwbHVzXzIsIFggcGx1c18yICsgMCwgWCBwbHVzXzIgKyAwLCAwLCAnKyd9LAotICB7WCBwbHVzXzMsIFggcGx1c18zICsgMCwgWCBwbHVzXzMgKyAwLCAwLCAnKyd9LAotICB7WCBwbHVzXzQsIFggcGx1c180ICsgMSwgWCBwbHVzXzQgKyAxLCAwLCAnKyd9LAotICB7WCBwbHVzXzUsIFggcGx1c181ICsgMiwgWCBwbHVzXzUgKyAyLCAxLCAnKyd9LAotICB7WCBwbHVzXzYsIFggcGx1c182ICsgNCwgWCBwbHVzXzYgKyA0LCAyLCAnKyd9LAotICB7WCBwbHVzXzcsIFggcGx1c183ICsgOSwgWCBwbHVzXzcgKyA5LCA0LCAnKyd9LAotICB7WCBwbHVzXzgsIFggcGx1c184ICsgMTgsIFggcGx1c184ICsgMTgsIDgsICcrJ30sCi0gIHtYIHBsdXNfOSwgWCBwbHVzXzkgKyAyOSwgWCBwbHVzXzkgKyAyOSwgMjQsICcrJ30sCi0gIHtYIHBsdXNfMTAsIFggcGx1c18xMCArIDI5LCBYIHBsdXNfMTAgKyAyOSwgNzcsICcrJ30sCi0gIHtYIHBsdXNfMTEsIFggcGx1c18xMSArIDI5LCBYIHBsdXNfMTEgKyAyOSwgMTgzLCAnKyd9LAotICB7WCBwbHVzXzEyLCBYIHBsdXNfMTIgKyAyOSwgWCBwbHVzXzEyICsgMjksIDM5NiwgJysnfSwKLSAge1ggcGx1c18xMywgWCBwbHVzXzEzICsgMjksIFggcGx1c18xMyArIDI5LCA4MjEsICcrJ30sCi19OwotCi0jaWZkZWYgVk1TCi12b2lkIGR1bW15MSAoKSB7IH0KLSNlbmRpZgotLyogZW5kIG9mIGZsb251bV9jb25zdC5jICovCmRpZmYgLS1naXQgYS9nYXMvZmxvbnVtLW11bHQuYyBiL2dhcy9mbG9udW0tbXVsdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzRhNzNiLi4wMDAwMDAwCi0tLSBhL2dhcy9mbG9udW0tbXVsdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qIGZsb251bV9tdWx0LmMgLSBtdWx0aXBseSB0d28gZmxvbnVtcwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHYXMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBUaGUgR05VIGFzc2VtYmxlciBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKLSAgIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLiAgTm8gYXV0aG9yIG9yIGRpc3RyaWJ1dG9yCi0gICBhY2NlcHRzIHJlc3BvbnNpYmlsaXR5IHRvIGFueW9uZSBmb3IgdGhlIGNvbnNlcXVlbmNlcyBvZiB1c2luZyBpdAotICAgb3IgZm9yIHdoZXRoZXIgaXQgc2VydmVzIGFueSBwYXJ0aWN1bGFyIHB1cnBvc2Ugb3Igd29ya3MgYXQgYWxsLAotICAgdW5sZXNzIGhlIHNheXMgc28gaW4gd3JpdGluZy4gIFJlZmVyIHRvIHRoZSBHTlUgQXNzZW1ibGVyIEdlbmVyYWwKLSAgIFB1YmxpYyBMaWNlbnNlIGZvciBmdWxsIGRldGFpbHMuCi0KLSAgIEV2ZXJ5b25lIGlzIGdyYW50ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBtb2RpZnkgYW5kIHJlZGlzdHJpYnV0ZQotICAgdGhlIEdOVSBBc3NlbWJsZXIsIGJ1dCBvbmx5IHVuZGVyIHRoZSBjb25kaXRpb25zIGRlc2NyaWJlZCBpbiB0aGUKLSAgIEdOVSBBc3NlbWJsZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIEEgY29weSBvZiB0aGlzIGxpY2Vuc2UgaXMKLSAgIHN1cHBvc2VkIHRvIGhhdmUgYmVlbiBnaXZlbiB0byB5b3UgYWxvbmcgd2l0aCB0aGUgR05VIEFzc2VtYmxlcgotICAgc28geW91IGNhbiBrbm93IHlvdXIgcmlnaHRzIGFuZCByZXNwb25zaWJpbGl0aWVzLiAgSXQgc2hvdWxkIGJlCi0gICBpbiBhIGZpbGUgbmFtZWQgQ09QWUlORy4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIGNvcHlyaWdodAotICAgbm90aWNlIGFuZCB0aGlzIG5vdGljZSBtdXN0IGJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAiZmxvbnVtLmgiCi0KLS8qCXBsYW4gZm9yIGEgLiBiID0+IHAocm9kdWN0KQotCQotCQotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JfCBhCXwgYQl8ICAuLi4JfCBhCXwgYQl8Ci0JfCAgQQl8ICBBLTEJfAl8ICAxCXwgIDAJfAotCSstLS0tLS0tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JCi0JCi0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQl8IGIJfCBiCXwgIC4uLgl8IGIJfCBiCXwKLQl8ICBCCXwgIEItMQl8CXwgIDEJfCAgMAl8Ci0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQkKLQkKLQkrLS0tLS0tLSstLS0tLS0tKy0vICAgLy0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS0tLS0tLSsKLQl8IHAJfCBwCXwgIC4uLgl8IHAJfCAgLi4uCXwgcAl8IHAJfAotCXwgIEErQisxfCAgQStCCXwJfCAgTgl8CXwgIDEJfCAgMAl8Ci0JKy0tLS0tLS0rLS0tLS0tLSstLyAgIC8tKy0tLS0tLS0rLS8gICAvLSstLS0tLS0tKy0tLS0tLS0rCi0JCi0JL15cCi0JKGNhcnJ5KSBhIC5iCSAgIC4uLgkgICAgfAkgICAuLi4JIGEgLmIJIGEgLmIKLQlBICBCIAkJICAgIHwJCSAgMCAgMQkgIDAgIDAKLQl8Ci0JLi4uCSAgICB8CSAgIC4uLgkgYSAuYgotCXwJCSAgMSAgMAotCXwKLQl8CSAgIC4uLgotCXwKLQl8Ci0JfAotCXwJCSAgX19fCi0JfAkJICBcCi0JKy0tLS0tICBQICA9ICAgPiAgYSAuYgotCU4JICAvX18gIGkgIGoKLQkKLQlOID0gMCAuLi4gQStCCi0JCi0JZm9yIGFsbCBpLGogd2hlcmUgaStqPU4KLQlbaSxqIGludGVnZXJzID4gMF0KLQkKLQlhW10sIGJbXSwgcFtdIG1heSBub3QgaW50ZXJzZWN0LgotCVplcm8gbGVuZ3RoIGZhY3RvcnMgc2lnbmlmeSAwIHNpZ25pZmljYW50IGJpdHM6IHRyZWF0IGFzIDAuMC4KLQkwLjAgZmFjdG9ycyBkbyB0aGUgcmlnaHQgdGhpbmcuCi0JWmVybyBsZW5ndGggcHJvZHVjdCBPSy4KLQkKLQlJIGNob3NlIHRoZSBGb3JUcmFuIGFjY2VudCAiZm9vW2Jhcl0iIGluc3RlYWQgb2YgdGhlIEMgYWNjZW50ICIqZ2FycGx5IgotCWJlY2F1c2UgSSBmZWx0IHRoZSBGb3JUcmFuIHdheSB3YXMgbW9yZSBpbnR1aXRpdmUuIFRoZSBDIHdheSB3b3VsZAotCXByb2JhYmx5IHlpZWxkIGJldHRlciBjb2RlIG9uIG1vc3QgQyBjb21waWxlcnMuIERlYW4gRWxzbmVyLgotCShDIHN0eWxlIGFsc28gZ2l2ZXMgZGVlcGVyIGluc2lnaHQgW3RvIG1lXSAuLi4gb2ggd2VsbCAuLi4pCi0JKi8KLQwKLXZvaWQgCi1mbG9udW1fbXVsdGlwIChhLCBiLCBwcm9kdWN0KQotICAgICBjb25zdCBGTE9OVU1fVFlQRSAqYTsKLSAgICAgY29uc3QgRkxPTlVNX1RZUEUgKmI7Ci0gICAgIEZMT05VTV9UWVBFICpwcm9kdWN0OwotewotICBpbnQgc2l6ZV9vZl9hOwkJLyogMCBvcmlnaW4gKi8KLSAgaW50IHNpemVfb2ZfYjsJCS8qIDAgb3JpZ2luICovCi0gIGludCBzaXplX29mX3Byb2R1Y3Q7CQkvKiAwIG9yaWdpbiAqLwotICBpbnQgc2l6ZV9vZl9zdW07CQkvKiAwIG9yaWdpbiAqLwotICBpbnQgZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnM7CS8qIDEgb3JpZ2luICovCi0gIHVuc2lnbmVkIGxvbmcgd29yazsKLSAgdW5zaWduZWQgbG9uZyBjYXJyeTsKLSAgbG9uZyBleHBvbmVudDsKLSAgTElUVExFTlVNX1RZUEUgKnE7Ci0gIGxvbmcgc2lnbmlmaWNhbnQ7CQkvKiBUUlVFIHdoZW4gd2UgZW1pdCBhIG5vbi0wIGxpdHRsZW51bSAgKi8KLSAgLyogRm9yVHJhbiBhY2NlbnQgZm9sbG93cy4gKi8KLSAgaW50IFA7CQkJLyogU2NhbiBwcm9kdWN0IGxvdy1vcmRlciAtPiBoaWdoLiAqLwotICBpbnQgTjsJCQkvKiBBcyBpbiBzdW0gYWJvdmUuICAqLwotICBpbnQgQTsJCQkvKiBXaGljaCBbXSBvZiBhPyAqLwotICBpbnQgQjsJCQkvKiBXaGljaCBbXSBvZiBiPyAqLwotCi0gIGlmICgoYS0+c2lnbiAhPSAnLScgJiYgYS0+c2lnbiAhPSAnKycpIHx8IChiLT5zaWduICE9ICctJyAmJiBiLT5zaWduICE9ICcrJykpCi0gICAgewotICAgICAgLyogLi4uCi0JCSAgIEdvdCB0byBmYWlsIHNvbWVob3cuICBBbnkgc3VnZ2VzdGlvbnM/ICovCi0gICAgICBwcm9kdWN0LT5zaWduID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHByb2R1Y3QtPnNpZ24gPSAoYS0+c2lnbiA9PSBiLT5zaWduKSA/ICcrJyA6ICctJzsKLSAgc2l6ZV9vZl9hID0gYS0+bGVhZGVyIC0gYS0+bG93OwotICBzaXplX29mX2IgPSBiLT5sZWFkZXIgLSBiLT5sb3c7Ci0gIGV4cG9uZW50ID0gYS0+ZXhwb25lbnQgKyBiLT5leHBvbmVudDsKLSAgc2l6ZV9vZl9wcm9kdWN0ID0gcHJvZHVjdC0+aGlnaCAtIHByb2R1Y3QtPmxvdzsKLSAgc2l6ZV9vZl9zdW0gPSBzaXplX29mX2EgKyBzaXplX29mX2I7Ci0gIGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zID0gc2l6ZV9vZl9wcm9kdWN0IC0gc2l6ZV9vZl9zdW07Ci0gIGlmIChleHRyYV9wcm9kdWN0X3Bvc2l0aW9ucyA8IDApCi0gICAgewotICAgICAgUCA9IGV4dHJhX3Byb2R1Y3RfcG9zaXRpb25zOwkvKiBQIDwgMCAqLwotICAgICAgZXhwb25lbnQgLT0gZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnM7CS8qIEluY3JlYXNlcyBleHBvbmVudC4gKi8KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBQID0gMDsKLSAgICB9Ci0gIGNhcnJ5ID0gMDsKLSAgc2lnbmlmaWNhbnQgPSAwOwotICBmb3IgKE4gPSAwOyBOIDw9IHNpemVfb2Zfc3VtOyBOKyspCi0gICAgewotICAgICAgd29yayA9IGNhcnJ5OwotICAgICAgY2FycnkgPSAwOwotICAgICAgZm9yIChBID0gMDsgQSA8PSBOOyBBKyspCi0JewotCSAgQiA9IE4gLSBBOwotCSAgaWYgKEEgPD0gc2l6ZV9vZl9hICYmIEIgPD0gc2l6ZV9vZl9iICYmIEIgPj0gMCkKLQkgICAgewotI2lmZGVmIFRSQUNFCi0JICAgICAgcHJpbnRmICgiYTpsb3dbJWQuXT0lMDR4IGI6bG93WyVkLl09JTA0eCB3b3JrX2JlZm9yZT0lMDh4XG4iLCBBLCBhLT5sb3dbQV0sIEIsIGItPmxvd1tCXSwgd29yayk7Ci0jZW5kaWYKLQkgICAgICAvKiBXYXRjaCBvdXQgZm9yIHNpZ24gZXh0ZW5zaW9uISAgV2l0aG91dCB0aGUgY2FzdHMsIG9uCi0JCSB0aGUgREVDIEFscGhhLCB0aGUgbXVsdGlwbGljYXRpb24gcmVzdWx0IGlzICpzaWduZWQqCi0JCSBpbnQsIHdoaWNoIGdldHMgc2lnbi1leHRlbmRlZCB0byBjb252ZXJ0IHRvIHRoZQotCQkgdW5zaWduZWQgbG9uZyEgICovCi0JICAgICAgd29yayArPSAodW5zaWduZWQgbG9uZykgYS0+bG93W0FdICogKHVuc2lnbmVkIGxvbmcpIGItPmxvd1tCXTsKLQkgICAgICBjYXJyeSArPSB3b3JrID4+IExJVFRMRU5VTV9OVU1CRVJfT0ZfQklUUzsKLQkgICAgICB3b3JrICY9IExJVFRMRU5VTV9NQVNLOwotI2lmZGVmIFRSQUNFCi0JICAgICAgcHJpbnRmICgid29yaz0lMDh4IGNhcnJ5PSUwNHhcbiIsIHdvcmssIGNhcnJ5KTsKLSNlbmRpZgotCSAgICB9Ci0JfQotICAgICAgc2lnbmlmaWNhbnQgfD0gd29yazsKLSAgICAgIGlmIChzaWduaWZpY2FudCB8fCBQIDwgMCkKLQl7Ci0JICBpZiAoUCA+PSAwKQotCSAgICB7Ci0JICAgICAgcHJvZHVjdC0+bG93W1BdID0gd29yazsKLSNpZmRlZiBUUkFDRQotCSAgICAgIHByaW50ZiAoIlA9JWQuIHdvcmtbcF06PSUwNHhcbiIsIFAsIHdvcmspOwotI2VuZGlmCi0JICAgIH0KLQkgIFArKzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZXh0cmFfcHJvZHVjdF9wb3NpdGlvbnMrKzsKLQkgIGV4cG9uZW50Kys7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogW1BdLT4gcG9zaXRpb24gIyBzaXplX29mX3N1bSArIDEuCi0gICAqIFRoaXMgaXMgd2hlcmUgJ2NhcnJ5JyBzaG91bGQgZ28uCi0gICAqLwotI2lmZGVmIFRSQUNFCi0gIHByaW50ZiAoImZpbmFsIGNhcnJ5ID0lMDR4XG4iLCBjYXJyeSk7Ci0jZW5kaWYKLSAgaWYgKGNhcnJ5KQotICAgIHsKLSAgICAgIGlmIChleHRyYV9wcm9kdWN0X3Bvc2l0aW9ucyA+IDApCi0JewotCSAgcHJvZHVjdC0+bG93W1BdID0gY2Fycnk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIE5vIHJvb20gYXQgaGlnaCBvcmRlciBmb3IgY2FycnkgbGl0dGxlbnVtLiAqLwotCSAgLyogU2hpZnQgcmlnaHQgMSB0byBtYWtlIHJvb20gZm9yIG1vc3Qgc2lnbmlmaWNhbnQgbGl0dGxlbnVtLiAqLwotCSAgZXhwb25lbnQrKzsKLQkgIFAtLTsKLQkgIGZvciAocSA9IHByb2R1Y3QtPmxvdyArIFA7IHEgPj0gcHJvZHVjdC0+bG93OyBxLS0pCi0JICAgIHsKLQkgICAgICB3b3JrID0gKnE7Ci0JICAgICAgKnEgPSBjYXJyeTsKLQkgICAgICBjYXJyeSA9IHdvcms7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgUC0tOwotICAgIH0KLSAgcHJvZHVjdC0+bGVhZGVyID0gcHJvZHVjdC0+bG93ICsgUDsKLSAgcHJvZHVjdC0+ZXhwb25lbnQgPSBleHBvbmVudDsKLX0KLQotLyogZW5kIG9mIGZsb251bV9tdWx0LmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9mbG9udW0uaCBiL2dhcy9mbG9udW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY4NGY0OS4uMDAwMDAwMAotLS0gYS9nYXMvZmxvbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyogZmxvbnVtLmggLSBGbG9hdGluZyBwb2ludCBwYWNrYWdlCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTQsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCi0gKgkJCQkJCQkJCSoKLSAqCUFyYml0cmFyeS1wcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYy4JCQkqCi0gKgkJCQkJCQkJCSoKLSAqCQkJCQkJCQkJKgotICoJTm90YXRpb246IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGlzIGV4cHJlc3NlZCBhcwkJKgotICoJTUFOVElTU0EgKiAoMiAqKiBFWFBPTkVOVCkuCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSAqCUlmIHRoaXMgb2ZmZW5kcyBtb3JlIHRyYWRpdGlvbmFsIG1hdGhlbWF0aWNpYW5zLCB0aGVuCQkqCi0gKglwbGVhc2UgdGVsbCBtZSB5b3VyIG5vbWVuY2xhdHVyZSBmb3IgZmxvbnVtcyEJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJiaWdudW0uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglWYXJpYWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4JCQkqCi0gKgkJCQkJCQkJCSoKLSAqCUV4cG9uZW50IGlzIHRoZSBwbGFjZSB2YWx1ZSBvZiB0aGUgbG93IGxpdHRsZW51bS4gRS5nLjoJCSoKLSAqCUlmICAwOiAgbG93IHBvaW50cyB0byB0aGUgdW5pdHMgICAgICAgICAgICAgbGl0dGxlbnVtLgkJKgotICoJSWYgIDE6ICBsb3cgcG9pbnRzIHRvIHRoZSBMSVRUTEVOVU1fUkFESVggICBsaXR0bGVudW0uCQkqCi0gKglJZiAtMTogIGxvdyBwb2ludHMgdG8gdGhlIDEvTElUVExFTlVNX1JBRElYIGxpdHRsZW51bS4JCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSkY6ICBBIHNpZ24gdmFsdWUgb2YgMCBtZWFucyB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgTmFOCi0gICBBIHNpZ24gdmFsdWUgb2YgJ1AnIG1lYW5zIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gYXNzZW1ibGUgK0luZgotICAgQSBzaWduIHZhbHVlIG9mICdOJyBtZWFucyB3ZSd2ZSBiZWVuIGFza2VkIHRvIGFzc2VtYmxlIC1JbmYKLSAgICovCi1zdHJ1Y3QgRkxPTlVNX1NUUlVDVAotewotICBMSVRUTEVOVU1fVFlQRSAqbG93OwkJLyogbG93IG9yZGVyIGxpdHRsZW51bSBvZiBhIGJpZ251bSAqLwotICBMSVRUTEVOVU1fVFlQRSAqaGlnaDsJCS8qIGhpZ2ggb3JkZXIgbGl0dGxlbnVtIG9mIGEgYmlnbnVtICovCi0gIExJVFRMRU5VTV9UWVBFICpsZWFkZXI7CS8qIC0+IDFzdCBub24temVybyBsaXR0bGVudW0gKi8KLSAgLyogSWYgZmxvbnVtIGlzIDAuMCwgbGVhZGVyPT1sb3ctMSAqLwotICBsb25nIGV4cG9uZW50OwkJLyogYmFzZSBMSVRUTEVOVU1fUkFESVggKi8KLSAgY2hhciBzaWduOwkJCS8qICcrJyBvciAnLScgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IEZMT05VTV9TVFJVQ1QgRkxPTlVNX1RZUEU7Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglTaW5jZSB3ZSBjYW4gKCYgZG8pIG1lZXQgd2l0aCBleHBvbmVudHMgbGlrZSAxMF41MDAwLCBpdAkqCi0gKglpcyBzaWxseSB0byBtYWtlIGEgdGFibGUgb2YgfiAxMCwwMDAgZW50cmllcywgb25lIGZvciBlYWNoCSoKLSAqCXBvd2VyIG9mIDEwLiBXZSBrZWVwIGEgdGFibGUgd2hlcmUgaXRlbSBbbl0gaXMgYSBzdHJ1Y3QJCSoKLSAqCUZMT05VTV9GTE9BVElOR19QT0lOVCByZXByZXNlbnRpbmcgMTBeKDJebikuIFdlIHRoZW4JCSoKLSAqCW11bHRpcGx5IGFwcHJvcHJpYXRlIGVudHJpZXMgZnJvbSB0aGlzIHRhYmxlIHRvIGdldCBhbnkJCSoKLSAqCXBhcnRpY3VsYXIgcG93ZXIgb2YgMTAuIEZvciB0aGUgZXhhbXBsZSBvZiAxMF41MDAwLCBhIHRhYmxlCSoKLSAqCW9mIGp1c3QgMjUgZW50cmllcyBzdWZmaWNlczogMTBeKDJeLTEyKS4uLjEwXigyXisxMikuCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotZXh0ZXJuIGNvbnN0IEZMT05VTV9UWVBFIGZsb251bV9wb3NpdGl2ZV9wb3dlcnNfb2ZfdGVuW107Ci1leHRlcm4gY29uc3QgRkxPTlVNX1RZUEUgZmxvbnVtX25lZ2F0aXZlX3Bvd2Vyc19vZl90ZW5bXTsKLWV4dGVybiBjb25zdCBpbnQgdGFibGVfc2l6ZV9vZl9mbG9udW1fcG93ZXJzX29mX3RlbjsKLS8qIEZsb251bV9YWFhfcG93ZXJzX29mX3RlbltdIHRhYmxlIGhhcyAqLwotLyogbGVnYWwgaW5kaWNlcyBmcm9tIDAgdG8gKi8KLS8qICsgdGhpcyBudW1iZXIgaW5jbHVzaXZlLiAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglEZWNsYXJlIHdvcmtlciBmdW5jdGlvbnMuCQkJCQkqCi0gKgkJCQkJCQkJCSoKLSBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBhdG9mX2dlbmVyaWMgUEFSQU1TICgoY2hhciAqKmFkZHJlc3Nfb2Zfc3RyaW5nX3BvaW50ZXIsCi0JCQkgIGNvbnN0IGNoYXIgKnN0cmluZ19vZl9kZWNpbWFsX21hcmtzLAotCQkJICBjb25zdCBjaGFyICpzdHJpbmdfb2ZfZGVjaW1hbF9leHBvbmVudF9tYXJrcywKLQkJCSAgRkxPTlVNX1RZUEUgKiBhZGRyZXNzX29mX2dlbmVyaWNfZmxvYXRpbmdfcG9pbnRfbnVtYmVyKSk7Ci0KLXZvaWQgZmxvbnVtX2NvcHkgUEFSQU1TICgoRkxPTlVNX1RZUEUgKiBpbiwgRkxPTlVNX1RZUEUgKiBvdXQpKTsKLXZvaWQgZmxvbnVtX211bHRpcCBQQVJBTVMgKChjb25zdCBGTE9OVU1fVFlQRSAqIGEsIGNvbnN0IEZMT05VTV9UWVBFICogYiwKLQkJCSAgICBGTE9OVU1fVFlQRSAqIHByb2R1Y3QpKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICoJCQkJCQkJCQkqCi0gKglEZWNsYXJlIGVycm9yIGNvZGVzLgkJCQkJCSoKLSAqCQkJCQkJCQkJKgotIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFUlJPUl9FWFBPTkVOVF9PVkVSRkxPVyAoMikKLQotLyogZW5kIG9mIGZsb251bS5oICovCmRpZmYgLS1naXQgYS9nYXMvZnJhZ3MuYyBiL2dhcy9mcmFncy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBiMmVlLi4wMDAwMDAwCi0tLSBhL2dhcy9mcmFncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qIGZyYWdzLmMgLSBtYW5hZ2UgZnJhZ3MgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJzdWJzZWdzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotCi1leHRlcm4gZnJhZ1MgemVyb19hZGRyZXNzX2ZyYWc7Ci1leHRlcm4gZnJhZ1MgYnNzX2FkZHJlc3NfZnJhZzsKLQwKLS8qIEluaXRpYWxpemF0aW9uIGZvciBmcmFnIHJvdXRpbmVzLiAgKi8KLXZvaWQKLWZyYWdfaW5pdCAoKQotewotICB6ZXJvX2FkZHJlc3NfZnJhZy5mcl90eXBlID0gcnNfZmlsbDsKLSAgYnNzX2FkZHJlc3NfZnJhZy5mcl90eXBlID0gcnNfZmlsbDsKLX0KLQwKLS8qIEFsbG9jYXRlIGEgZnJhZyBvbiB0aGUgc3BlY2lmaWVkIG9ic3RhY2suCi0gICBDYWxsIHRoaXMgcm91dGluZSBmcm9tIGV2ZXJ5d2hlcmUgZWxzZSwgc28gdGhhdCBhbGwgdGhlIHdlaXJkIGFsaWdubWVudAotICAgaGFja2VyeSBjYW4gYmUgZG9uZSBpbiBqdXN0IG9uZSBwbGFjZS4gICovCi1mcmFnUyAqCi1mcmFnX2FsbG9jIChvYikKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9iOwotewotICBmcmFnUyAqcHRyOwotICBpbnQgb2FsaWduOwotCi0gICh2b2lkKSBvYnN0YWNrX2FsbG9jIChvYiwgMCk7Ci0gIG9hbGlnbiA9IG9ic3RhY2tfYWxpZ25tZW50X21hc2sgKG9iKTsKLSAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAob2IpID0gMDsKLSAgcHRyID0gKGZyYWdTICopIG9ic3RhY2tfYWxsb2MgKG9iLCBTSVpFT0ZfU1RSVUNUX0ZSQUcpOwotICBvYnN0YWNrX2FsaWdubWVudF9tYXNrIChvYikgPSBvYWxpZ247Ci0gIG1lbXNldCAocHRyLCAwLCBTSVpFT0ZfU1RSVUNUX0ZSQUcpOwotICByZXR1cm4gcHRyOwotfQotDAotLyoKLSAqCQkJZnJhZ19ncm93KCkKLSAqCi0gKiBUcnkgdG8gYXVnbWVudCBjdXJyZW50IGZyYWcgYnkgbmNoYXJzIGNoYXJzLgotICogSWYgdGhlcmUgaXMgbm8gcm9vbSwgY2xvc2Ugb2YgdGhlIGN1cnJlbnQgZnJhZyB3aXRoIGEgIi5maWxsIDAiCi0gKiBhbmQgYmVnaW4gYSBuZXcgZnJhZy4gVW5sZXNzIHRoZSBuZXcgZnJhZyBoYXMgbmNoYXJzIGNoYXJzIGF2YWlsYWJsZQotICogZG8gbm90IHJldHVybi4gRG8gbm90IHNldCB1cCBhbnkgZmllbGRzIG9mICpub3dfZnJhZy4KLSAqLwotdm9pZCAKLWZyYWdfZ3JvdyAobmNoYXJzKQotICAgICB1bnNpZ25lZCBpbnQgbmNoYXJzOwotewotICBpZiAob2JzdGFja19yb29tICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaykgPCBuY2hhcnMpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IG47Ci0gICAgICBsb25nIG9sZGM7Ci0KLSAgICAgIGZyYWdfd2FuZSAoZnJhZ19ub3cpOwotICAgICAgZnJhZ19uZXcgKDApOwotICAgICAgb2xkYyA9IGZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2suY2h1bmtfc2l6ZTsKLSAgICAgIGZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2suY2h1bmtfc2l6ZSA9IDIgKiBuY2hhcnMgKyBTSVpFT0ZfU1RSVUNUX0ZSQUc7Ci0gICAgICB3aGlsZSAoKG4gPSBvYnN0YWNrX3Jvb20gKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKSkgPCBuY2hhcnMpCi0JewotCSAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0JICBmcmFnX25ldyAoMCk7Ci0JfQotICAgICAgZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjay5jaHVua19zaXplID0gb2xkYzsKLSAgICB9Ci0gIGlmIChvYnN0YWNrX3Jvb20gKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKSA8IG5jaGFycykKLSAgICBhc19mYXRhbCAoXygiQ2FuJ3QgZXh0ZW5kIGZyYWcgJWQuIGNoYXJzIiksIG5jaGFycyk7Ci19Ci0MCi0vKgotICoJCQlmcmFnX25ldygpCi0gKgotICogQ2FsbCB0aGlzIHRvIGNsb3NlIG9mZiBhIGNvbXBsZXRlZCBmcmFnLCBhbmQgc3RhcnQgdXAgYSBuZXcgKGVtcHR5KQotICogZnJhZywgaW4gdGhlIHNhbWUgc3Vic2VnbWVudCBhcyB0aGUgb2xkIGZyYWcuCi0gKiBbZnJjaGFpbl9ub3cgcmVtYWlucyB0aGUgc2FtZSBidXQgZnJhZ19ub3cgaXMgdXBkYXRlZC5dCi0gKiBCZWNhdXNlIHRoaXMgY2FsY3VsYXRlcyB0aGUgY29ycmVjdCB2YWx1ZSBvZiBmcl9maXggYnkKLSAqIGxvb2tpbmcgYXQgdGhlIG9ic3RhY2sgJ2ZyYWdzJywgaXQgbmVlZHMgdG8ga25vdyBob3cgbWFueQotICogY2hhcmFjdGVycyBhdCB0aGUgZW5kIG9mIHRoZSBvbGQgZnJhZyBiZWxvbmcgdG8gKHRoZSBtYXhpbWFsKQotICogZnJfdmFyOiB0aGUgcmVzdCBtdXN0IGJlbG9uZyB0byBmcl9maXguCi0gKiBJdCBkb2Vzbid0IGFjdHVhbGx5IHNldCB1cCB0aGUgb2xkIGZyYWcncyBmcl92YXI6IHlvdSBtYXkgaGF2ZQotICogc2V0IGZyX3ZhciA9PSAxLCBidXQgYWxsb2NhdGVkIDEwIGNoYXJzIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWc6Ci0gKiBpbiB0aGlzIGNhc2UgeW91IHBhc3Mgb2xkX2ZyYWdzX3Zhcl9tYXhfc2l6ZSA9PSAxMC4KLSAqCi0gKiBNYWtlIGEgbmV3IGZyYWcsIGluaXRpYWxpc2luZyBzb21lIGNvbXBvbmVudHMuIExpbmsgbmV3IGZyYWcgYXQgZW5kCi0gKiBvZiBmcmNoYWluX25vdy4KLSAqLwotdm9pZCAKLWZyYWdfbmV3IChvbGRfZnJhZ3NfdmFyX21heF9zaXplKQotICAgICAvKiBOdW1iZXIgb2YgY2hhcnMgKGFscmVhZHkgYWxsb2NhdGVkIG9uIG9ic3RhY2sgZnJhZ3MpIGluCi0JdmFyaWFibGVfbGVuZ3RoIHBhcnQgb2YgZnJhZy4gKi8KLSAgICAgaW50IG9sZF9mcmFnc192YXJfbWF4X3NpemU7Ci17Ci0gIGZyYWdTICpmb3JtZXJfbGFzdF9mcmFnUDsKLSAgZnJjaGFpblMgKmZyY2hQOwotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci0KLSAgLyogRml4IHVwIG9sZCBmcmFnJ3MgZnJfZml4LiAgKi8KLSAgZnJhZ19ub3ctPmZyX2ZpeCA9IGZyYWdfbm93X2ZpeCAoKSAtIG9sZF9mcmFnc192YXJfbWF4X3NpemU7Ci0gIC8qIE1ha2Ugc3VyZSBpdHMgdHlwZSBpcyB2YWxpZC4gICovCi0gIGFzc2VydCAoZnJhZ19ub3ctPmZyX3R5cGUgIT0gMCk7Ci0KLSAgLyogVGhpcyB3aWxsIGFsaWduIHRoZSBvYnN0YWNrIHNvIHRoZSBuZXh0IHN0cnVjdCB3ZSBhbGxvY2F0ZSBvbiBpdAotICAgICB3aWxsIGJlZ2luIGF0IGEgY29ycmVjdCBib3VuZGFyeS4gKi8KLSAgb2JzdGFja19maW5pc2ggKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKTsKLSAgZnJjaFAgPSBmcmNoYWluX25vdzsKLSAga25vdyAoZnJjaFApOwotICBmb3JtZXJfbGFzdF9mcmFnUCA9IGZyY2hQLT5mcmNoX2xhc3Q7Ci0gIGFzc2VydCAoZm9ybWVyX2xhc3RfZnJhZ1AgIT0gMCk7Ci0gIGFzc2VydCAoZm9ybWVyX2xhc3RfZnJhZ1AgPT0gZnJhZ19ub3cpOwotICBmcmFnX25vdyA9IGZyYWdfYWxsb2MgKCZmcmNoUC0+ZnJjaF9vYnN0YWNrKTsKLQotICBhc193aGVyZSAoJmZyYWdfbm93LT5mcl9maWxlLCAmZnJhZ19ub3ctPmZyX2xpbmUpOwotCi0gIC8qIEdlbmVyYWxseSwgZnJhZ19ub3ctPnBvaW50cyB0byBhbiBhZGRyZXNzIHJvdW5kZWQgdXAgdG8gbmV4dAotICAgICBhbGlnbm1lbnQuICBIb3dldmVyLCBjaGFyYWN0ZXJzIHdpbGwgYWRkIHRvIG9ic3RhY2sgZnJhZ3MKLSAgICAgSU1NRURJQVRFTFkgYWZ0ZXIgdGhlIHN0cnVjdCBmcmFnLCBldmVuIGlmIHRoZXkgYXJlIG5vdCBzdGFydGluZwotICAgICBhdCBhbiBhbGlnbm1lbnQgYWRkcmVzcy4gKi8KLSAgZm9ybWVyX2xhc3RfZnJhZ1AtPmZyX25leHQgPSBmcmFnX25vdzsKLSAgZnJjaFAtPmZyY2hfbGFzdCA9IGZyYWdfbm93OwotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgewotICAgIGV4dGVybiBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqbGlzdGluZ190YWlsOwotICAgIGZyYWdfbm93LT5saW5lID0gbGlzdGluZ190YWlsOwotICB9Ci0jZW5kaWYKLQotICBhc3NlcnQgKGZyY2hhaW5fbm93LT5mcmNoX2xhc3QgPT0gZnJhZ19ub3cpOwotCi0gIGZyYWdfbm93LT5mcl9uZXh0ID0gTlVMTDsKLX0JCQkJLyogZnJhZ19uZXcoKSAqLwotDAotLyoKLSAqCQkJZnJhZ19tb3JlKCkKLSAqCi0gKiBTdGFydCBhIG5ldyBmcmFnIHVubGVzcyB3ZSBoYXZlIG4gbW9yZSBjaGFycyBvZiByb29tIGluIHRoZSBjdXJyZW50IGZyYWcuCi0gKiBDbG9zZSBvZmYgdGhlIG9sZCBmcmFnIHdpdGggYSAuZmlsbCAwLgotICoKLSAqIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgMXN0IGNoYXIgdG8gd3JpdGUgaW50by4gQWR2YW5jZQotICogZnJhZ19ub3dfZ3Jvd3RoIHBhc3QgdGhlIG5ldyBjaGFycy4KLSAqLwotCi1jaGFyICoKLWZyYWdfbW9yZSAobmNoYXJzKQotICAgICBpbnQgbmNoYXJzOwotewotICByZWdpc3RlciBjaGFyICpyZXR2YWw7Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImF0dGVtcHQgdG8gYWxsb2NhdGUgZGF0YSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotICAgICAgc3Vic2VnX3NldCAodGV4dF9zZWN0aW9uLCAwKTsKLSAgICB9Ci0KLSAgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJhdHRlbXB0IHRvIGFsbG9jYXRlIGRhdGEgaW4gY29tbW9uIHNlY3Rpb24iKSk7Ci0gICAgICBtcmlfY29tbW9uX3N5bWJvbCA9IE5VTEw7Ci0gICAgfQotCi0gIGZyYWdfZ3JvdyAobmNoYXJzKTsKLSAgcmV0dmFsID0gb2JzdGFja19uZXh0X2ZyZWUgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKTsKLSAgb2JzdGFja19ibGFua19mYXN0ICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaywgbmNoYXJzKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQkJCQkvKiBmcmFnX21vcmUoKSAqLwotDAotLyoKLSAqCQkJZnJhZ192YXIoKQotICoKLSAqIFN0YXJ0IGEgbmV3IGZyYWcgdW5sZXNzIHdlIGhhdmUgbWF4X2NoYXJzIG1vcmUgY2hhcnMgb2Ygcm9vbSBpbiB0aGUgY3VycmVudCBmcmFnLgotICogQ2xvc2Ugb2ZmIHRoZSBvbGQgZnJhZyB3aXRoIGEgLmZpbGwgMC4KLSAqCi0gKiBTZXQgdXAgYSBtYWNoaW5lX2RlcGVuZGVudCByZWxheGFibGUgZnJhZywgdGhlbiBzdGFydCBhIG5ldyBmcmFnLgotICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSAxc3QgY2hhciBvZiB0aGUgdmFyIHBhcnQgb2YgdGhlIG9sZCBmcmFnCi0gKiB0byB3cml0ZSBpbnRvLgotICovCi0KLWNoYXIgKgotZnJhZ192YXIgKHR5cGUsIG1heF9jaGFycywgdmFyLCBzdWJ0eXBlLCBzeW1ib2wsIG9mZnNldCwgb3Bjb2RlKQotICAgICByZWxheF9zdGF0ZVQgdHlwZTsKLSAgICAgaW50IG1heF9jaGFyczsKLSAgICAgaW50IHZhcjsKLSAgICAgcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGU7Ci0gICAgIHN5bWJvbFMgKnN5bWJvbDsKLSAgICAgb2Zmc2V0VCBvZmZzZXQ7Ci0gICAgIGNoYXIgKm9wY29kZTsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcmV0dmFsOwotCi0gIGZyYWdfZ3JvdyAobWF4X2NoYXJzKTsKLSAgcmV0dmFsID0gb2JzdGFja19uZXh0X2ZyZWUgKCZmcmNoYWluX25vdy0+ZnJjaF9vYnN0YWNrKTsKLSAgb2JzdGFja19ibGFua19mYXN0ICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaywgbWF4X2NoYXJzKTsKLSAgZnJhZ19ub3ctPmZyX3ZhciA9IHZhcjsKLSAgZnJhZ19ub3ctPmZyX3R5cGUgPSB0eXBlOwotICBmcmFnX25vdy0+ZnJfc3VidHlwZSA9IHN1YnR5cGU7Ci0gIGZyYWdfbm93LT5mcl9zeW1ib2wgPSBzeW1ib2w7Ci0gIGZyYWdfbm93LT5mcl9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGZyYWdfbm93LT5mcl9vcGNvZGUgPSBvcGNvZGU7Ci0jaWZkZWYgVVNJTkdfQ0dFTgotICBmcmFnX25vdy0+ZnJfY2dlbi5pbnNuID0gMDsKLSAgZnJhZ19ub3ctPmZyX2NnZW4ub3BpbmRleCA9IDA7Ci0gIGZyYWdfbm93LT5mcl9jZ2VuLm9waW5mbyA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBUQ19GUkFHX0lOSVQKLSAgVENfRlJBR19JTklUIChmcmFnX25vdyk7Ci0jZW5kaWYKLSAgYXNfd2hlcmUgKCZmcmFnX25vdy0+ZnJfZmlsZSwgJmZyYWdfbm93LT5mcl9saW5lKTsKLSAgZnJhZ19uZXcgKG1heF9jaGFycyk7Ci0gIHJldHVybiAocmV0dmFsKTsKLX0KLQwKLS8qCi0gKgkJCWZyYWdfdmFyaWFudCgpCi0gKgotICogT1ZFOiBUaGlzIHZhcmlhbnQgb2YgZnJhZ192YXIgYXNzdW1lcyB0aGF0IHNwYWNlIGZvciB0aGUgdGFpbCBoYXMgYmVlbgotICogICAgICBhbGxvY2F0ZWQgYnkgY2FsbGVyLgotICogICAgICBObyBjYWxsIHRvIGZyYWdfZ3JvdyBpcyBkb25lLgotICovCi0KLWNoYXIgKgotZnJhZ192YXJpYW50ICh0eXBlLCBtYXhfY2hhcnMsIHZhciwgc3VidHlwZSwgc3ltYm9sLCBvZmZzZXQsIG9wY29kZSkKLSAgICAgcmVsYXhfc3RhdGVUIHR5cGU7Ci0gICAgIGludCBtYXhfY2hhcnM7Ci0gICAgIGludCB2YXI7Ci0gICAgIHJlbGF4X3N1YnN0YXRlVCBzdWJ0eXBlOwotICAgICBzeW1ib2xTICpzeW1ib2w7Ci0gICAgIG9mZnNldFQgb2Zmc2V0OwotICAgICBjaGFyICpvcGNvZGU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnJldHZhbDsKLQotICByZXR2YWwgPSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spOwotICBmcmFnX25vdy0+ZnJfdmFyID0gdmFyOwotICBmcmFnX25vdy0+ZnJfdHlwZSA9IHR5cGU7Ci0gIGZyYWdfbm93LT5mcl9zdWJ0eXBlID0gc3VidHlwZTsKLSAgZnJhZ19ub3ctPmZyX3N5bWJvbCA9IHN5bWJvbDsKLSAgZnJhZ19ub3ctPmZyX29mZnNldCA9IG9mZnNldDsKLSAgZnJhZ19ub3ctPmZyX29wY29kZSA9IG9wY29kZTsKLSNpZmRlZiBVU0lOR19DR0VOCi0gIGZyYWdfbm93LT5mcl9jZ2VuLmluc24gPSAwOwotICBmcmFnX25vdy0+ZnJfY2dlbi5vcGluZGV4ID0gMDsKLSAgZnJhZ19ub3ctPmZyX2NnZW4ub3BpbmZvID0gMDsKLSNlbmRpZgotI2lmZGVmIFRDX0ZSQUdfSU5JVAotICBUQ19GUkFHX0lOSVQgKGZyYWdfbm93KTsKLSNlbmRpZgotICBhc193aGVyZSAoJmZyYWdfbm93LT5mcl9maWxlLCAmZnJhZ19ub3ctPmZyX2xpbmUpOwotICBmcmFnX25ldyAobWF4X2NoYXJzKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQkJCQkvKiBmcmFnX3ZhcmlhbnQoKSAqLwotDAotLyoKLSAqCQkJZnJhZ193YW5lKCkKLSAqCi0gKiBSZWR1Y2UgdGhlIHZhcmlhYmxlIGVuZCBvZiBhIGZyYWcgdG8gYSBoYXJtbGVzcyBzdGF0ZS4KLSAqLwotdm9pZCAKLWZyYWdfd2FuZSAoZnJhZ1ApCi0gICAgIHJlZ2lzdGVyIGZyYWdTICpmcmFnUDsKLXsKLSAgZnJhZ1AtPmZyX3R5cGUgPSByc19maWxsOwotICBmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKLSAgZnJhZ1AtPmZyX3ZhciA9IDA7Ci19Ci0MCi0vKiBNYWtlIGFuIGFsaWdubWVudCBmcmFnLiAgVGhlIHNpemUgb2YgdGhpcyBmcmFnIHdpbGwgYmUgYWRqdXN0ZWQgdG8KLSAgIGZvcmNlIHRoZSBuZXh0IGZyYWcgdG8gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYWxpZ25tZW50LiAgQUxJR05NRU5UCi0gICBpcyB0aGUgcG93ZXIgb2YgdHdvIHRvIHdoaWNoIHRvIGFsaWduLiAgRklMTF9DSEFSQUNURVIgaXMgdGhlCi0gICBjaGFyYWN0ZXIgdG8gdXNlIHRvIGZpbGwgaW4gYW55IGJ5dGVzIHdoaWNoIGFyZSBza2lwcGVkLiAgTUFYIGlzCi0gICB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBza2lwIHdoZW4gZG9pbmcgdGhlIGFsaWdubWVudCwKLSAgIG9yIDAgaWYgdGhlcmUgaXMgbm8gbWF4aW11bS4gICovCi0KLXZvaWQgCi1mcmFnX2FsaWduIChhbGlnbm1lbnQsIGZpbGxfY2hhcmFjdGVyLCBtYXgpCi0gICAgIGludCBhbGlnbm1lbnQ7Ci0gICAgIGludCBmaWxsX2NoYXJhY3RlcjsKLSAgICAgaW50IG1heDsKLXsKLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBhZGRyZXNzVCBuZXdfb2ZmOwotCi0gICAgICBuZXdfb2ZmID0gKChhYnNfc2VjdGlvbl9vZmZzZXQgKyBhbGlnbm1lbnQgLSAxKQotCQkgJn4gKCgxIDw8IGFsaWdubWVudCkgLSAxKSk7Ci0gICAgICBpZiAobWF4ID09IDAgfHwgbmV3X29mZiAtIGFic19zZWN0aW9uX29mZnNldCA8PSAoYWRkcmVzc1QpIG1heCkKLQlhYnNfc2VjdGlvbl9vZmZzZXQgPSBuZXdfb2ZmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHAgPSBmcmFnX3ZhciAocnNfYWxpZ24sIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIG1heCwKLQkJICAgIChzeW1ib2xTICopIDAsIChvZmZzZXRUKSBhbGlnbm1lbnQsIChjaGFyICopIDApOwotICAgICAgKnAgPSBmaWxsX2NoYXJhY3RlcjsKLSAgICB9Ci19Ci0KLS8qIE1ha2UgYW4gYWxpZ25tZW50IGZyYWcgbGlrZSBmcmFnX2FsaWduLCBidXQgZmlsbCB3aXRoIGEgcmVwZWF0aW5nCi0gICBwYXR0ZXJuIHJhdGhlciB0aGFuIGEgc2luZ2xlIGJ5dGUuICBBTElHTk1FTlQgaXMgdGhlIHBvd2VyIG9mIHR3bwotICAgdG8gd2hpY2ggdG8gYWxpZ24uICBGSUxMX1BBVFRFUk4gaXMgdGhlIGZpbGwgcGF0dGVybiB0byByZXBlYXQgaW4KLSAgIHRoZSBieXRlcyB3aGljaCBhcmUgc2tpcHBlZC4gIE5fRklMTCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluCi0gICBGSUxMX1BBVFRFUk4uICBNQVggaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuCi0gICBkb2luZyB0aGUgYWxpZ25tZW50LCBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotCi12b2lkIAotZnJhZ19hbGlnbl9wYXR0ZXJuIChhbGlnbm1lbnQsIGZpbGxfcGF0dGVybiwgbl9maWxsLCBtYXgpCi0gICAgIGludCBhbGlnbm1lbnQ7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGxfcGF0dGVybjsKLSAgICAgaW50IG5fZmlsbDsKLSAgICAgaW50IG1heDsKLXsKLSAgY2hhciAqcDsKLQotICBwID0gZnJhZ192YXIgKHJzX2FsaWduLCBuX2ZpbGwsIG5fZmlsbCwgKHJlbGF4X3N1YnN0YXRlVCkgbWF4LAotCQkoc3ltYm9sUyAqKSAwLCAob2Zmc2V0VCkgYWxpZ25tZW50LCAoY2hhciAqKSAwKTsKLSAgbWVtY3B5IChwLCBmaWxsX3BhdHRlcm4sIG5fZmlsbCk7Ci19Ci0KLWFkZHJlc3NUCi1mcmFnX25vd19maXggKCkKLXsKLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm4gYWJzX3NlY3Rpb25fb2Zmc2V0OwotICByZXR1cm4gKGFkZHJlc3NUKSAoKGNoYXIqKSBvYnN0YWNrX25leHRfZnJlZSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spCi0JCSAgICAgLSBmcmFnX25vdy0+ZnJfbGl0ZXJhbCk7Ci19Ci0KLXZvaWQKLWZyYWdfYXBwZW5kXzFfY2hhciAoZGF0dW0pCi0gICAgIGludCBkYXR1bTsKLXsKLSAgaWYgKG9ic3RhY2tfcm9vbSAoJmZyY2hhaW5fbm93LT5mcmNoX29ic3RhY2spIDw9IDEpCi0gICAgewotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25ldyAoMCk7Ci0gICAgfQotICBvYnN0YWNrXzFncm93ICgmZnJjaGFpbl9ub3ctPmZyY2hfb2JzdGFjaywgZGF0dW0pOwotfQotCi0vKiBlbmQgb2YgZnJhZ3MuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2ZyYWdzLmggYi9nYXMvZnJhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4OGUzMy4uMDAwMDAwMAotLS0gYS9nYXMvZnJhZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKiBmcmFncy5oIC0gSGVhZGVyIGZpbGUgZm9yIHRoZSBmcmFnIGNvbmNlcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkyLCA5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEZSQUdTX0gKLSNkZWZpbmUgRlJBR1NfSAotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3Qgb2JzdGFjazsKLSNlbmRpZgotCi0vKgotICogQSBjb2RlIGZyYWdtZW50IChmcmFnKSBpcyBzb21lIGtub3duIG51bWJlciBvZiBjaGFycywgZm9sbG93ZWQgYnkgc29tZQotICogdW5rbm93biBudW1iZXIgb2YgY2hhcnMuIFR5cGljYWxseSB0aGUgdW5rbm93biBudW1iZXIgb2YgY2hhcnMgaXMgYW4KLSAqIGluc3RydWN0aW9uIGFkZHJlc3Mgd2hvc2Ugc2l6ZSBpcyB5ZXQgdW5rbm93bi4gV2UgYWx3YXlzIGtub3cgdGhlIGdyZWF0ZXN0Ci0gKiBwb3NzaWJsZSBzaXplIHRoZSB1bmtub3duIG51bWJlciBvZiBjaGFycyBtYXkgYmVjb21lLCBhbmQgcmVzZXJ2ZSB0aGF0Ci0gKiBtdWNoIHJvb20gYXQgdGhlIGVuZCBvZiB0aGUgZnJhZy4KLSAqIE9uY2UgY3JlYXRlZCwgZnJhZ3MgZG8gbm90IGNoYW5nZSBhZGRyZXNzIGR1cmluZyBhc3NlbWJseS4KLSAqIFdlIGNoYWluIHRoZSBmcmFncyBpbiAoYSkgZm9yd2FyZC1saW5rZWQgbGlzdChzKS4gVGhlIG9iamVjdC1maWxlIGFkZHJlc3MKLSAqIG9mIHRoZSAxc3QgY2hhciBvZiBhIGZyYWcgaXMgZ2VuZXJhbGx5IG5vdCBrbm93biB1bnRpbCBhZnRlciByZWxheCgpLgotICogTWFueSB0aGluZ3MgYXQgYXNzZW1ibHkgdGltZSBkZXNjcmliZSBhbiBhZGRyZXNzIGJ5IHtvYmplY3QtZmlsZS1hZGRyZXNzCi0gKiBvZiBhIHBhcnRpY3VsYXIgZnJhZ30rb2Zmc2V0LgotCi0gQlVHOiBpdCBtYXkgYmUgc21hcnRlciB0byBoYXZlIGEgc2luZ2xlIHBvaW50ZXIgb2ZmIHRvIHZhcmlvdXMgZGlmZmVyZW50Ci0gbm90ZXMgZm9yIGRpZmZlcmVudCBmcmFnIGtpbmRzLiBTZWUgaG93IGNvZGUgcGFucwotICovCi0KLXN0cnVjdCBmcmFnCi17Ci0gIC8qIE9iamVjdCBmaWxlIGFkZHJlc3MuICovCi0gIGFkZHJlc3NUIGZyX2FkZHJlc3M7Ci0gIC8qIENoYWluIGZvcndhcmQ7IGFzY2VuZGluZyBhZGRyZXNzIG9yZGVyLiAgUm9vdGVkIGluIGZyY2hfcm9vdC4gKi8KLSAgc3RydWN0IGZyYWcgKmZyX25leHQ7Ci0KLSAgLyogKEZpeGVkKSBudW1iZXIgb2YgY2hhcnMgd2Uga25vdyB3ZSBoYXZlLiAgTWF5IGJlIDAuICovCi0gIG9mZnNldFQgZnJfZml4OwotICAvKiAoVmFyaWFibGUpIG51bWJlciBvZiBjaGFycyBhZnRlciBhYm92ZS4gIE1heSBiZSAwLiAqLwotICBvZmZzZXRUIGZyX3ZhcjsKLSAgLyogRm9yIHZhcmlhYmxlLWxlbmd0aCB0YWlsLiAqLwotICBzeW1ib2xTICpmcl9zeW1ib2w7Ci0gIC8qIEZvciB2YXJpYWJsZS1sZW5ndGggdGFpbC4gKi8KLSAgb2Zmc2V0VCBmcl9vZmZzZXQ7Ci0gIC8qIFBvaW50cyB0byBvcGNvZGUgbG93IGFkZHIgYnl0ZSwgZm9yIHJlbGF4YXRpb24uICAqLwotICBjaGFyICpmcl9vcGNvZGU7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotICBzdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqbGluZTsKLSNlbmRpZgotCi0gIC8qIFdoYXQgc3RhdGUgaXMgbXkgdGFpbCBpbj8gKi8KLSAgcmVsYXhfc3RhdGVUIGZyX3R5cGU7Ci0gIHJlbGF4X3N1YnN0YXRlVCBmcl9zdWJ0eXBlOwotCi0jaWZkZWYgVVNJTkdfQ0dFTgotICAvKiBEb24ndCBpbmNsdWRlIHRoaXMgdW5sZXNzIHVzaW5nIENHRU4gdG8ga2VlcCBmcmFnIHNpemUgZG93bi4gICovCi0gIHN0cnVjdCB7Ci0gICAgLyogQ0dFTl9JTlNOIGVudHJ5IGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICBjb25zdCBzdHJ1Y3QgY2dlbl9pbnNuICppbnNuOwotICAgIC8qIEluZGV4IGludG8gb3BlcmFuZCB0YWJsZS4gICovCi0gICAgaW50IG9waW5kZXg7Ci0gICAgLyogVGFyZ2V0IHNwZWNpZmljIGRhdGEsIHVzdWFsbHkgcmVsb2MgbnVtYmVyLiAgKi8KLSAgICBpbnQgb3BpbmZvOwotICB9IGZyX2NnZW47Ci0jZW5kaWYKLQotI2lmZGVmIFRDX0ZSQUdfVFlQRQotICBUQ19GUkFHX1RZUEUgdGNfZnJhZ19kYXRhOwotI2VuZGlmCi0KLSAgLyogV2hlcmUgdGhlIGZyYWcgd2FzIGNyZWF0ZWQsIG9yIHdoZXJlIGl0IGJlY2FtZSBhIHZhcmlhbnQgZnJhZy4gICovCi0gIGNoYXIgKmZyX2ZpbGU7Ci0gIHVuc2lnbmVkIGludCBmcl9saW5lOwotCi0gIC8qIERhdGEgYmVnaW5zIGhlcmUuICAqLwotICBjaGFyIGZyX2xpdGVyYWxbMV07Ci19OwotCi0jZGVmaW5lIFNJWkVPRl9TVFJVQ1RfRlJBRyBcCi0oKGNoYXIgKil6ZXJvX2FkZHJlc3NfZnJhZy5mcl9saXRlcmFsLShjaGFyICopJnplcm9fYWRkcmVzc19mcmFnKQotLyogV2Ugd2FudCB0byBzYXkgZnJfbGl0ZXJhbFswXSBhYm92ZS4gKi8KLQotLyogQ3VycmVudCBmcmFnIHdlIGFyZSBidWlsZGluZy4gIFRoaXMgZnJhZyBpcyBpbmNvbXBsZXRlLiAgSXQgaXMsCi0gICBob3dldmVyLCBpbmNsdWRlZCBpbiBmcmNoYWluX25vdy4gIFRoZSBmcl9maXggZmllbGQgaXMgYm9ndXM7Ci0gICBpbnN0ZWFkLCB1c2UgZnJhZ19ub3dfZml4ICgpLiAgKi8KLUNPTU1PTiBmcmFnUyAqZnJhZ19ub3c7Ci1leHRlcm4gYWRkcmVzc1QgZnJhZ19ub3dfZml4IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogRm9yIGZvcmVpZ24tc2VnbWVudCBzeW1ib2wgZml4dXBzLiAqLwotQ09NTU9OIGZyYWdTIHplcm9fYWRkcmVzc19mcmFnOwotLyogRm9yIGxvY2FsIGNvbW1vbiAoTl9CU1Mgc2VnbWVudCkgZml4dXBzLiAqLwotQ09NTU9OIGZyYWdTIGJzc19hZGRyZXNzX2ZyYWc7Ci0KLSNpZiAwCi0vKgotICogQSBtYWNybyB0byBzcGVlZCB1cCBhcHBlbmRpbmcgZXhhY3RseSAxIGNoYXIKLSAqIHRvIGN1cnJlbnQgZnJhZy4KLSAqLwotLyogSkYgY2hhbmdlZCA8IDEgdG8gPD0gMSB0byBhdm9pZCBhIHJhY2UgY29uZGl0b24gKi8KLSNkZWZpbmUgRlJBR19BUFBFTkRfMV9DSEFSKGRhdHVtKQlcCi17CQkJCQlcCi0gIGlmIChvYnN0YWNrX3Jvb20oICZmcmFncyApIDw9IDEpIHtcCi0gICAgZnJhZ193YW5lIChmcmFnX25vdyk7CVwKLSAgICBmcmFnX25ldyAoMCk7CQlcCi0gIH0JCQkJXAotICBvYnN0YWNrXzFncm93KCAmZnJhZ3MsIGRhdHVtICk7CVwKLX0KLSNlbHNlCi1leHRlcm4gdm9pZCBmcmFnX2FwcGVuZF8xX2NoYXIgUEFSQU1TICgoaW50KSk7Ci0jZGVmaW5lIEZSQUdfQVBQRU5EXzFfQ0hBUihYKSBmcmFnX2FwcGVuZF8xX2NoYXIgKFgpCi0jZW5kaWYKLQotCi12b2lkIGZyYWdfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1mcmFnUyAqZnJhZ19hbGxvYyBQQVJBTVMgKChzdHJ1Y3Qgb2JzdGFjayAqKSk7Ci12b2lkIGZyYWdfZ3JvdyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQgbmNoYXJzKSk7Ci1jaGFyICpmcmFnX21vcmUgUEFSQU1TICgoaW50IG5jaGFycykpOwotdm9pZCBmcmFnX2FsaWduIFBBUkFNUyAoKGludCBhbGlnbm1lbnQsIGludCBmaWxsX2NoYXJhY3RlciwgaW50IG1heCkpOwotdm9pZCBmcmFnX2FsaWduX3BhdHRlcm4gUEFSQU1TICgoaW50IGFsaWdubWVudCwKLQkJCQkgY29uc3QgY2hhciAqZmlsbF9wYXR0ZXJuLAotCQkJCSBpbnQgbl9maWxsLAotCQkJCSBpbnQgbWF4KSk7Ci12b2lkIGZyYWdfbmV3IFBBUkFNUyAoKGludCBvbGRfZnJhZ3NfdmFyX21heF9zaXplKSk7Ci12b2lkIGZyYWdfd2FuZSBQQVJBTVMgKChmcmFnUyAqIGZyYWdQKSk7Ci0KLWNoYXIgKmZyYWdfdmFyaWFudCBQQVJBTVMgKChyZWxheF9zdGF0ZVQgdHlwZSwKLQkJCSAgICBpbnQgbWF4X2NoYXJzLAotCQkJICAgIGludCB2YXIsCi0JCQkgICAgcmVsYXhfc3Vic3RhdGVUIHN1YnR5cGUsCi0JCQkgICAgc3ltYm9sUyAqIHN5bWJvbCwKLQkJCSAgICBvZmZzZXRUIG9mZnNldCwKLQkJCSAgICBjaGFyICpvcGNvZGUpKTsKLQotY2hhciAqZnJhZ192YXIgUEFSQU1TICgocmVsYXhfc3RhdGVUIHR5cGUsCi0JCQlpbnQgbWF4X2NoYXJzLAotCQkJaW50IHZhciwKLQkJCXJlbGF4X3N1YnN0YXRlVCBzdWJ0eXBlLAotCQkJc3ltYm9sUyAqIHN5bWJvbCwKLQkJCW9mZnNldFQgb2Zmc2V0LAotCQkJY2hhciAqb3Bjb2RlKSk7Ci0KLSNlbmRpZiAvKiBGUkFHU19IICovCmRpZmYgLS1naXQgYS9nYXMvZ2FzcC5jIGIvZ2FzL2dhc3AuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiOThiMy4uMDAwMDAwMAotLS0gYS9nYXMvZ2FzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc1MCArMCwwIEBACi0vKiBnYXNwLmMgLSBHbnUgYXNzZW1ibGVyIHByZXByb2Nlc3NvciBtYWluIHByb2dyYW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTUCwgdGhlIEdOVSBBc3NlbWJsZXIgUHJlcHJvY2Vzc29yLgotCi0gICBHQVNQIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTUCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBU1A7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0KLVRoaXMgcHJvZ3JhbSB0cmFuc2xhdGVzIHRoZSBpbnB1dCBtYWNyb3MgYW5kIHN0dWZmIGludG8gYSBmb3JtCi1zdWl0YWJsZSBmb3IgZ2FzIHRvIGNvbnN1bWUuCi0KLQotICBnYXNwIFstc2RoYXVdIFstYyBjaGFyXSBbLW8gPG91dGZpbGU+XSA8aW5maWxlPioKLQotICAtcyBjb3B5IHNvdXJjZSB0byBvdXRwdXQKLSAgLWMgPGNoYXI+IGNvbW1lbnRzIGFyZSBzdGFydGVkIHdpdGggPGNoYXI+IGluc3RlYWQgb2YgIQotICAtdSBhbGxvdyB1bnJlYXNvbmFibGUgc3R1ZmYKLSAgLXAgcHJpbnQgbGluZSBudW1iZXJzCi0gIC1kIHByaW50IGRlYnVnZ2luZyBzdGF0cwotICAtcyBzZW1pIGNvbG9ucyBzdGFydCBjb21tZW50cwotICAtYSB1c2UgYWx0ZXJuYXRlIHN5bnRheAotICAgICBQc2V1ZG8gb3BzIGNhbiBzdGFydCB3aXRoIG9yIHdpdGhvdXQgYSAuCi0gICAgIExhYmVscyBoYXZlIHRvIGJlIGluIGZpcnN0IGNvbHVtbi4KLSAgLUkgc3BlY2lmeSBpbmNsdWRlIGRpcgotICAgIE1hY3JvIGFyZyBwYXJhbWV0ZXJzIHN1YnNpdHV0ZWQgYnkgbmFtZSwgZG9uJ3QgbmVlZCB0aGUgJi4KLSAgICAgU3RyaW5nIGNhbiBzdGFydCB3aXRoICcgdG9vLgotICAgICBTdHJpbmdzIGNhbiBiZSBzdXJyb3VuZGVkIGJ5IDwuLj4KLSAgICAgQSAlPGV4cD4gaW4gYSBzdHJpbmcgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIAotICAgICBMaXRlcmFsIGNoYXIgaW4gYSBzdHJpbmcgd2l0aCAhCi0KLQotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxnZXRvcHQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX01BTExPQ19ERUNMQVJBVElPTgotZXh0ZXJuIGNoYXIgKm1hbGxvYyAoKTsKLSNlbmRpZgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0jaW5jbHVkZSAiYXNpbnRsLmgiCi0KLWNoYXIgKnByb2dyYW1fdmVyc2lvbiA9ICIxLjIiOwotCi0vKiBUaGlzIGlzIG5vcm1hbGx5IGRlY2xhcmVkIGluIGFzLmgsIGJ1dCB3ZSBkb24ndCBpbmNsdWRlIHRoYXQuICBXZQotICAgbmVlZCB0aGUgZnVuY3Rpb24gYmVjYXVzZSBvdGhlciBmaWxlcyBsaW5rZWQgd2l0aCBnYXNwLmMgbWlnaHQgY2FsbAotICAgaXQuICAqLwotZXh0ZXJuIHZvaWQgYXNfYWJvcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotCi0vKiBUaGUgZGVmYXVsdCBvYnN0YWNrIGNodW5rIHNpemUuICBJZiB3ZSBzZXQgdGhpcyB0byB6ZXJvLCB0aGUKLSAgIG9ic3RhY2sgY29kZSB3aWxsIHVzZSB3aGF0ZXZlciB3aWxsIGZpdCBpbiBhIDQwOTYgYnl0ZSBibG9jay4gIFRoaXMKLSAgIGlzIHVzZWQgYnkgdGhlIGhhc2ggdGFibGUgY29kZSB1c2VkIGJ5IG1hY3JvLmMuICAqLwotaW50IGNodW5rc2l6ZSA9IDA7Ci0KLSNkZWZpbmUgTUFYX0lOQ0xVREVTIDMwCQkvKiBNYXhpbXVtIGluY2x1ZGUgZGVwdGggKi8KLSNkZWZpbmUgTUFYX1JFQVNPTkFCTEUgMTAwMAkvKiBNYXhpbXVtIG51bWJlciBvZiBleHBhbnNpb25zICovCi0KLWludCB1bnJlYXNvbmFibGU7CQkvKiAtdSBvbiBjb21tYW5kIGxpbmUgKi8KLWludCBzdGF0czsJCQkvKiAtZCBvbiBjb21tYW5kIGxpbmUgKi8KLWludCBwcmludF9saW5lX251bWJlcjsJCS8qIC1wIGZsYWcgb24gY29tbWFuZCBsaW5lICovCi1pbnQgY29weXNvdXJjZTsJCQkvKiAtYyBmbGFnIG9uIGNvbW1hbmQgbGluZSAqLwotaW50IHdhcm5pbmdzOwkJCS8qIE51bWJlciBvZiBXQVJOSU5HcyBnZW5lcmF0ZWQgc28gZmFyLiAqLwotaW50IGVycm9yczsJCQkvKiBOdW1iZXIgb2YgRVJST1JzIGdlbmVyYXRlZCBzbyBmYXIuICovCi1pbnQgZmF0YWxzOwkJCS8qIE51bWJlciBvZiBmYXRhbCBFUlJPUnMgZ2VuZXJhdGVkIHNvIGZhciAoZWl0aGVyIDAgb3IgMSkuICovCi1pbnQgYWx0ZXJuYXRlID0gMDsgICAgICAgICAgICAgIC8qIC1hIG9uIGNvbW1hbmQgbGluZSAqLwotaW50IG1yaSA9IDA7CQkJLyogLU0gb24gY29tbWFuZCBsaW5lICovCi1jaGFyIGNvbW1lbnRfY2hhciA9ICchJzsKLWludCByYWRpeCA9IDEwOwkJCS8qIERlZmF1bHQgcmFkaXggKi8KLQotaW50IGhhZF9lbmQ7IC8qIFNlZW4gLkVORCAqLwotCi0vKiBUaGUgb3V0cHV0IHN0cmVhbSAqLwotRklMRSAqb3V0ZmlsZTsKLQotLyogdGhlIGF0dHJpYnV0ZXMgb2YgZWFjaCBjaGFyYWN0ZXIgYXJlIHN0b3JlZCBhcyBhIGJpdCBwYXR0ZXJuCi0gICBjaGFydHlwZSwgd2hpY2ggZ2l2ZXMgdXMgcXVpY2sgdGVzdHMuICovCi0KLQotI2RlZmluZSBGSVJTVEJJVCAxCi0jZGVmaW5lIE5FWFRCSVQgIDIKLSNkZWZpbmUgU0VQQklUICAgNAotI2RlZmluZSBXSElURUJJVCA4Ci0jZGVmaW5lIENPTU1FTlRCSVQgMTYKLSNkZWZpbmUgQkFTRUJJVCAgMzIKLSNkZWZpbmUgSVNDT01NRU5UQ0hBUih4KSAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIENPTU1FTlRCSVQpCi0jZGVmaW5lIElTRklSU1RDSEFSKHgpICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIEZJUlNUQklUKQotI2RlZmluZSBJU05FWFRDSEFSKHgpICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBORVhUQklUKQotI2RlZmluZSBJU1NFUCh4KSAgICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBTRVBCSVQpCi0jZGVmaW5lIElTV0hJVEUoeCkgICAgICAoY2hhcnR5cGVbKHVuc2lnbmVkIGNoYXIpKHgpXSAmIFdISVRFQklUKQotI2RlZmluZSBJU0JBU0UoeCkgICAgICAgKGNoYXJ0eXBlWyh1bnNpZ25lZCBjaGFyKSh4KV0gJiBCQVNFQklUKQotc3RhdGljIGNoYXIgY2hhcnR5cGVbMjU2XTsKLQotCi0vKiBDb25kaXRpb25hbCBhc3NlbWJseSB1c2VzIHRoZSBgaWZzdGFjaycuICBFYWNoIGFpZiBwdXNoZXMgYW5vdGhlcgotICAgZW50cnkgb250byB0aGUgc3RhY2ssIGFuZCBzZXRzIHRoZSBvbiBmbGFnIGlmIGl0IHNob3VsZC4gIFRoZSBhZWxzZQotICAgc2V0cyBoYWRlbHNlLCBhbmQgdG9nZ2xlcyBvbi4gIEFuIGFlbmQgcG9wcyBhIGxldmVsLiAgV2UgbGltaXQgdG8KLSAgIDEwMCBsZXZlbHMgb2YgbmVzdGluZywgbm90IGJlY2F1c2Ugd2UncmUgZmFjaXN0cyBwaWdzIHdpdGggcmVhZAotICAgb25seSBtaW5kcywgYnV0IGJlY2F1c2UgbW9yZSB0aGFuIDEwMCBsZXZlbHMgb2YgbmVzdGluZyBpcyBwcm9iYWJseQotICAgYSBidWcgaW4gdGhlIHVzZXIncyBtYWNybyBzdHJ1Y3R1cmUuICAqLwotCi0jZGVmaW5lIElGTkVTVElORyAxMDAKLXN0cnVjdAotICB7Ci0gICAgaW50IG9uOwkJCS8qIGlzIHRoZSBsZXZlbCBiZWluZyBvdXRwdXQgKi8KLSAgICBpbnQgaGFkZWxzZTsJCS8qIGhhcyBhbiBhZWxzZSBiZWVuIHNlZW4gKi8KLSAgfQotaWZzdGFja1tJRk5FU1RJTkddOwotaW50IGlmaTsKLQotLyogVGhlIGZpbmFsIGFuZCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvZiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXJlIGtlcHQgaW4KLSAgIGV4cF90J3MuICBOb3RlIHRoYXQgYSBzeW1ib2wgaXMgbm90IGFuIHNiLCBidXQgYSBwb2ludGVyIGludG8gdGhlIGlucHV0Ci0gICBsaW5lLiAgSXQgbXVzdCBiZSBjb3BlZCBzb21ld2hlcmUgc2FmZSBiZWZvcmUgdGhlIG5leHQgbGluZSBpcyByZWFkIGluLiAqLwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgbGVuOwotICB9Ci1zeW1ib2w7Ci0KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBpbnQgdmFsdWU7CQkJLyogY29uc3RhbnQgcGFydCAqLwotICAgIHN5bWJvbCBhZGRfc3ltYm9sOwkJLyogbmFtZSBwYXJ0ICovCi0gICAgc3ltYm9sIHN1Yl9zeW1ib2w7CQkvKiBuYW1lIHBhcnQgKi8KLSAgfQotZXhwX3Q7Ci0KLQotLyogSGFzaGluZyBpcyBkb25lIGluIGEgcHJldHR5IHN0YW5kYXJkIHdheS4gIEEgaGFzaF90YWJsZSBoYXMgYQotICAgcG9pbnRlciB0byBhIHZlY3RvciBvZiBwb2ludGVycyB0byBoYXNoX2VudHJ5cywgYW5kIHRoZSBzaXplIG9mIHRoZQotICAgdmVjdG9yLiAgQSBoYXNoX2VudHJ5IGNvbnRhaW5zIGEgdW5pb24gb2YgYWxsIHRoZSBpbmZvIHdlIGxpa2UgdG8KLSAgIHN0b3JlIGluIGhhc2ggdGFibGUuICBJZiB0aGVyZSBpcyBhIGhhc2ggY29sbGlzaW9uLCBoYXNoX2VudHJpZXMKLSAgIHdpdGggdGhlIHNhbWUgaGFzaCBhcmUga2VwdCBpbiBhIGNoYWluLiAqLwotCi0vKiBXaGF0IHRoZSBkYXRhIGluIGEgaGFzaF9lbnRyeSBtZWFucyAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBoYXNoX2ludGVnZXIsCQkvKiBuYW1lLT5pbnRlZ2VyIG1hcHBpbmcgKi8KLSAgICBoYXNoX3N0cmluZywJCS8qIG5hbWUtPnN0cmluZyBtYXBwaW5nICovCi0gICAgaGFzaF9tYWNybywJCQkvKiBuYW1lIGlzIGEgbWFjcm8gKi8KLSAgICBoYXNoX2Zvcm1hbAkJCS8qIG5hbWUgaXMgYSBmb3JtYWwgYXJndW1lbnQgKi8KLSAgfSBoYXNoX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IGhzCi0gIHsKLSAgICBzYiBrZXk7CQkJLyogc3ltYm9sIG5hbWUgKi8KLSAgICBoYXNoX3R5cGUgdHlwZTsJCS8qIHN5bWJvbCBtZWFuaW5nICovCi0gICAgdW5pb24KLSAgICAgIHsKLQlzYiBzOwotCWludCBpOwotCXN0cnVjdCBtYWNyb19zdHJ1Y3QgKm07Ci0Jc3RydWN0IGZvcm1hbF9zdHJ1Y3QgKmY7Ci0gICAgICB9IHZhbHVlOwotICAgIHN0cnVjdCBocyAqbmV4dDsJCS8qIG5leHQgaGFzaF9lbnRyeSB3aXRoIHNhbWUgaGFzaCBrZXkgKi8KLSAgfSBoYXNoX2VudHJ5OwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgaGFzaF9lbnRyeSAqKnRhYmxlOwotICAgIGludCBzaXplOwotICB9IGhhc2hfdGFibGU7Ci0KLQotLyogU3RydWN0dXJlcyB1c2VkIHRvIHN0b3JlIG1hY3Jvcy4gCi0KLSAgIEVhY2ggbWFjcm8ga25vd3MgaXRzIG5hbWUgYW5kIGluY2x1ZGVkIHRleHQuICBJdCBnZXRzIGJ1aWx0IHdpdGggYQotICAgbGlzdCBvZiBmb3JtYWwgYXJndW1lbnRzLCBhbmQgYWxzbyBrZWVwcyBhIGhhc2ggdGFibGUgd2hpY2ggcG9pbnRzCi0gICBpbnRvIHRoZSBsaXN0IHRvIHNwZWVkIHVwIGZvcm1hbCBzZWFyY2guICBFYWNoIGZvcm1hbCBrbm93cyBpdHMKLSAgIG5hbWUgYW5kIGl0cyBkZWZhdWx0IHZhbHVlLiAgRWFjaCB0aW1lIHRoZSBtYWNybyBpcyBleHBhbmRlZCwgdGhlCi0gICBmb3JtYWxzIGdldCB0aGUgYWN0dWFsIHZhbHVlcyBhdHRhdGNoZWQgdG8gdGhlbS4gKi8KLQotLyogZGVzY3JpYmUgdGhlIGZvcm1hbCBhcmd1bWVudHMgdG8gYSBtYWNybyAqLwotCi10eXBlZGVmIHN0cnVjdCBmb3JtYWxfc3RydWN0Ci0gIHsKLSAgICBzdHJ1Y3QgZm9ybWFsX3N0cnVjdCAqbmV4dDsJLyogbmV4dCBmb3JtYWwgaW4gbGlzdCAqLwotICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiB0aGUgZm9ybWFsICovCi0gICAgc2IgZGVmOwkJCS8qIHRoZSBkZWZhdWx0IHZhbHVlICovCi0gICAgc2IgYWN0dWFsOwkJCS8qIHRoZSBhY3R1YWwgYXJndW1lbnQgKGNoYW5nZWQgb24gZWFjaCBleHBhbnNpb24pICovCi0gICAgaW50IGluZGV4OwkJCS8qIHRoZSBpbmRleCBvZiB0aGUgZm9ybWFsIDAuLmZvcm1hbF9jb3VudC0xICovCi0gIH0KLWZvcm1hbF9lbnRyeTsKLQotLyogZGVzY3JpYmUgdGhlIG1hY3JvLiAqLwotCi10eXBlZGVmIHN0cnVjdCBtYWNyb19zdHJ1Y3QKLSAgewotICAgIHNiIHN1YjsJCQkvKiBzdWJzdGl0dXRpb24gdGV4dC4gKi8KLSAgICBpbnQgZm9ybWFsX2NvdW50OwkJLyogbnVtYmVyIG9mIGZvcm1hbCBhcmdzLiAqLwotICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsczsJLyogcG9pbnRlciB0byBsaXN0IG9mIGZvcm1hbF9zdHJ1Y3RzICovCi0gICAgaGFzaF90YWJsZSBmb3JtYWxfaGFzaDsJLyogaGFzaCB0YWJsZSBvZiBmb3JtYWxzLiAqLwotICB9Ci1tYWNyb19lbnRyeTsKLQotLyogaG93IHdlIG5lc3QgZmlsZXMgYW5kIGV4cGFuZCBtYWNyb3MgZXRjLgotCi0gICB3ZSBrZWVwIGEgc3RhY2sgb2Ygb2YgaW5jbHVkZV9zdGFjayBzdHJ1Y3RzLiAgZWFjaCBpbmNsdWRlIGZpbGUKLSAgIHB1c2hlcyBhIG5ldyBsZXZlbCBvbnRvIHRoZSBzdGFjay4gIHdlIGtlZXAgYW4gc2Igd2l0aCBhIHB1c2hiYWNrCi0gICB0b28uICB1bmdldCBjaGFycyBhcmUgcHVzaGVkIG9udG8gdGhlIHB1c2hiYWNrIHNiLCBnZXRjaGFycyBmaXJzdAotICAgY2hlY2tzIHRoZSBwdXNoYmFjayBzYiBiZWZvcmUgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0KLSAgIHNtYWxsIHRoaW5ncyBhcmUgZXhwYW5kZWQgYnkgYWRkaW5nIHRoZSB0ZXh0IG9mIHRoZSBpdGVtIG9udG8gdGhlCi0gICBwdXNoYmFjayBzYi4gIGxhcmdlciBpdGVtcyBhcmUgZ3Jvd24gYnkgcHVzaGluZyBhIG5ldyBsZXZlbCBhbmQKLSAgIGFsbG9jYXRpbmcgdGhlIGVudGlyZSBwdXNoYmFjayBidWYgZm9yIHRoZSBpdGVtLiAgZWFjaCB0aW1lCi0gICBzb21ldGhpbmcgbGlrZSBhIG1hY3JvIGlzIGV4cGFuZGVkLCB0aGUgc3RhY2sgaW5kZXggaXMgY2hhbmdlZC4gd2UKLSAgIGNhbiB0aGVuIHBlcmZvcm0gYW4gZXhpdG0gYnkgcG9wcGluZyBhbGwgZW50cmllcyBvZmYgdGhlIHN0YWNrIHdpdGgKLSAgIHRoZSBzYW1lIHN0YWNrIGluZGV4LiAgaWYgd2UncmUgYmVpbmcgcmVhc29uYWJsZSwgd2UgY2FuIGRldGVjdAotICAgcmVjdXNpdmUgZXhwYW5zaW9uIGJ5IGNoZWNraW5nIHRoZSBpbmRleCBpcyByZWFzb25hYmx5IHNtYWxsLgotICovCi0KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgaW5jbHVkZV9maWxlLCBpbmNsdWRlX3JlcGVhdCwgaW5jbHVkZV93aGlsZSwgaW5jbHVkZV9tYWNybwotICB9IGluY2x1ZGVfdHlwZTsKLQotc3RydWN0IGluY2x1ZGVfc3RhY2sKLSAgewotICAgIHNiIHB1c2hiYWNrOwkJLyogY3VycmVudCBwdXNoYmFjayBzdHJlYW0gKi8KLSAgICBpbnQgcHVzaGJhY2tfaW5kZXg7CQkvKiBuZXh0IGNoYXIgdG8gcmVhZCBmcm9tIHN0cmVhbSAqLwotICAgIEZJTEUgKmhhbmRsZTsJCS8qIG9wZW4gZmlsZSAqLwotICAgIHNiIG5hbWU7CQkJLyogbmFtZSBvZiBmaWxlICovCi0gICAgaW50IGxpbmVjb3VudDsJCS8qIG51bWJlciBvZiBsaW5lcyByZWFkIHNvIGZhciAqLwotICAgIGluY2x1ZGVfdHlwZSB0eXBlOwotICAgIGludCBpbmRleDsJCQkvKiBpbmRleCBvZiB0aGlzIGxheWVyICovCi0gIH0KLWluY2x1ZGVfc3RhY2tbTUFYX0lOQ0xVREVTXTsKLQotc3RydWN0IGluY2x1ZGVfc3RhY2sgKnNwOwotI2RlZmluZSBpc3AgKHNwIC0gaW5jbHVkZV9zdGFjaykKLQotLyogSW5jbHVkZSBmaWxlIGxpc3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaW5jbHVkZV9wYXRoIAotewotICBzdHJ1Y3QgaW5jbHVkZV9wYXRoICpuZXh0OwotICBzYiBwYXRoOwotfSAgaW5jbHVkZV9wYXRoOwotCi1pbmNsdWRlX3BhdGggKnBhdGhzX2hlYWQ7Ci1pbmNsdWRlX3BhdGggKnBhdGhzX3RhaWw7Ci0KLQotc3RhdGljIHZvaWQgcXVpdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBoYXNoX25ld190YWJsZSBQQVJBTVMgKChpbnQsIGhhc2hfdGFibGUgKikpOwotc3RhdGljIGludCBoYXNoIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyBoYXNoX2VudHJ5ICpoYXNoX2NyZWF0ZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSBQQVJBTVMgKChoYXNoX3RhYmxlICosIHNiICosIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgaGFzaF9hZGRfdG9faW50X3RhYmxlIFBBUkFNUyAoKGhhc2hfdGFibGUgKiwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgaGFzaF9lbnRyeSAqaGFzaF9sb29rdXAgUEFSQU1TICgoaGFzaF90YWJsZSAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBjaGVja2NvbnN0IFBBUkFNUyAoKGludCwgZXhwX3QgKikpOwotc3RhdGljIGludCBzYl9zdHJ0b2wgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzAgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzEgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzIgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzMgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzQgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGxldmVsXzUgUEFSQU1TICgoaW50LCBzYiAqLCBleHBfdCAqKSk7Ci1zdGF0aWMgaW50IGV4cF9wYXJzZSBQQVJBTVMgKChpbnQsIHNiICosIGV4cF90ICopKTsKLXN0YXRpYyB2b2lkIGV4cF9zdHJpbmcgUEFSQU1TICgoZXhwX3QgKiwgc2IgKikpOwotc3RhdGljIGludCBleHBfZ2V0X2FicyBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLSNpZiAwCi1zdGF0aWMgdm9pZCBzdHJpcF9jb21tZW50cyBQQVJBTVMgKChzYiAqKSk7Ci0jZW5kaWYKLXN0YXRpYyB2b2lkIHVuZ2V0IFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgaW5jbHVkZV9idWYgUEFSQU1TICgoc2IgKiwgc2IgKiwgaW5jbHVkZV90eXBlLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGluY2x1ZGVfcHJpbnRfbGluZSBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyBpbnQgZ2V0X2xpbmUgUEFSQU1TICgoc2IgKikpOwotc3RhdGljIGludCBncmFiX2xhYmVsIFBBUkFNUyAoKHNiICosIHNiICopKTsKLXN0YXRpYyB2b2lkIGNoYW5nZV9iYXNlIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZW5kIFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2Fzc2lnbiBQQVJBTVMgKChpbnQsIGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fcmFkaXggUEFSQU1TICgoc2IgKikpOwotc3RhdGljIGludCBnZXRfb3BzaXplIFBBUkFNUyAoKGludCwgc2IgKiwgaW50ICopKTsKLXN0YXRpYyBpbnQgZW9sIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZGF0YSBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fZGF0YWIgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hbGlnbiBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3JlcyBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fZXhwb3J0IFBBUkFNUyAoKHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3ByaW50IFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9faGVhZGluZyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3BhZ2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZG9fZm9ybSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0X2FueV9zdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqLCBpbnQsIGludCkpOwotc3RhdGljIGludCBza2lwX29wZW5wIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBza2lwX2Nsb3NlcCBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgZG9sZW4gUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGRvaW5zdHIgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgaW50IGRvc3Vic3RyIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19hc3NpZ25zIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBnZXRfYW5kX3Byb2Nlc3MgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZnJlZV9vbGRfZW50cnkgUEFSQU1TICgoaGFzaF9lbnRyeSAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hc3NpZ25hIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fYXNzaWduYyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX3JlZyBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyBpbnQgY29uZGFzc19sb29rdXBfbmFtZSBQQVJBTVMgKChzYiAqLCBpbnQsIHNiICosIGludCkpOwotc3RhdGljIGludCB3aGF0Y29uZCBQQVJBTVMgKChpbnQsIHNiICosIGludCAqKSk7Ci1zdGF0aWMgaW50IGlzdHJ1ZSBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2FpZiBQQVJBTVMgKChpbnQsIHNiICopKTsKLXN0YXRpYyB2b2lkIGRvX2FlbHNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2FlbmRpIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgY29uZGFzc19vbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19pZiBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIGludCBnZXRfbXJpX3N0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9faWZjIFBBUkFNUyAoKGludCwgc2IgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkb19hZW5kciBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19hd2hpbGUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19hZW5kdyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19leGl0bSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19hcmVwZWF0IFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fZW5kbSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBkb19pcnAgUEFSQU1TICgoaW50LCBzYiAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2xvY2FsIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIHZvaWQgZG9fbWFjcm8gUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IG1hY3JvX29wIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBnZXRzdHJpbmcgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBkb19zZGF0YSBQQVJBTVMgKChpbnQsIHNiICosIGludCkpOwotc3RhdGljIHZvaWQgZG9fc2RhdGFiIFBBUkFNUyAoKGludCwgc2IgKikpOwotc3RhdGljIGludCBuZXdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIGRvX2luY2x1ZGUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBpbmNsdWRlX3BvcCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGxpbmVjb3VudCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGluY2x1ZGVfbmV4dF9pbmRleCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjaGFydHlwZV9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgcHJvY2Vzc19wc2V1ZG9fb3AgUEFSQU1TICgoaW50LCBzYiAqLCBzYiAqKSk7Ci1zdGF0aWMgdm9pZCBhZGRfa2V5d29yZCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgcHJvY2Vzc19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGRvX2RlZmluZSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyB2b2lkIHNob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIHNob3dfaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNkZWZpbmUgRkFUQUwoeCkgXAotICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4IDsgZmF0YWxzKys7IHF1aXQoKTsgfSB3aGlsZSgwKSAKLSNkZWZpbmUgRVJST1IoeCkgXAotICBkbyB7IGluY2x1ZGVfcHJpbnRfd2hlcmVfbGluZSAoc3RkZXJyKTsgZnByaW50ZiB4OyBlcnJvcnMrKzsgfSB3aGlsZSgwKQotI2RlZmluZSBXQVJOSU5HKHgpIFwKLSAgZG8geyBpbmNsdWRlX3ByaW50X3doZXJlX2xpbmUgKHN0ZGVycik7IGZwcmludGYgeDsgd2FybmluZ3MrKzt9IHdoaWxlKDApIAotCi0KLQotLyogZXhpdCB0aGUgcHJvZ3JhbSBhbmQgcmV0dXJuIHRoZSByaWdodCBFUlJPUiBjb2RlLiAqLwotc3RhdGljIHZvaWQKLXF1aXQgKCkKLXsKLSAgaW50IGV4aXRjb2RlOwotICBpZiAoZmF0YWxzICsgZXJyb3JzKQotICAgIGV4aXRjb2RlID0gMTsKLSAgZWxzZQotICAgIGV4aXRjb2RlID0gMDsKLQotICBpZiAoc3RhdHMpIAotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNiX21heF9wb3dlcl90d287IGkrKykgCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAic3RyaW5ncyBzaXplICU4ZCA6ICVkXG4iLCAxPDxpLCBzdHJpbmdfY291bnRbaV0pOwotCX0KLSAgICB9Ci0gIGV4aXQgKGV4aXRjb2RlKTsKLX0KLQotLyogaGFzaCB0YWJsZSBtYWludGVuYW5jZS4gKi8KLQotLyogYnVpbGQgYSBuZXcgaGFzaCB0YWJsZSB3aXRoIHNpemUgYnVja2V0cywgYW5kIGZpbGwgaW4gdGhlIGluZm8gYXQgcHRyLiAqLwotCi1zdGF0aWMgdm9pZAotaGFzaF9uZXdfdGFibGUgKHNpemUsIHB0cikKLSAgICAgaW50IHNpemU7Ci0gICAgIGhhc2hfdGFibGUgKnB0cjsKLXsKLSAgaW50IGk7Ci0gIHB0ci0+c2l6ZSA9IHNpemU7Ci0gIHB0ci0+dGFibGUgPSAoaGFzaF9lbnRyeSAqKikgeG1hbGxvYyAoc2l6ZSAqIChzaXplb2YgKGhhc2hfZW50cnkgKikpKTsKLSAgLyogRmlsbCB3aXRoIG51bGwtcG9pbnRlciwgbm90IHplcm8tYml0LXBhdHRlcm4uICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHB0ci0+dGFibGVbaV0gPSAwOwotfQotCi0vKiBjYWxjdWxhdGUgYW5kIHJldHVybiB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgc2IgYXQga2V5LiAqLwotCi1zdGF0aWMgaW50Ci1oYXNoIChrZXkpCi0gICAgIHNiICprZXk7Ci17Ci0gIGludCBrID0gMHgxMjM0OwotICBpbnQgaTsKLSAgY2hhciAqcCA9IGtleS0+cHRyOwotICBmb3IgKGkgPSAwOyBpIDwga2V5LT5sZW47IGkrKykKLSAgICB7Ci0gICAgICBrIF49IChrIDw8IDIpIF4gKnA7Ci0gICAgICBwKys7Ci0gICAgfQotICByZXR1cm4gayAmIDB4ZjBmZmY7Ci19Ci0KLS8qIGxvb2t1cCBrZXkgaW4gaGFzaF90YWJsZSB0YWIsIGlmIHByZXNlbnQsIHRoZW4gcmV0dXJuIGl0LCBvdGhlcndpc2UKLSAgIGJ1aWxkIGEgbmV3IG9uZSBhbmQgZmlsbCBpdCB3aXRoIGhhc2hfaW50ZWdlci4gKi8KLQotc3RhdGljCi1oYXNoX2VudHJ5ICoKLWhhc2hfY3JlYXRlICh0YWIsIGtleSkKLSAgICAgaGFzaF90YWJsZSAqdGFiOwotICAgICBzYiAqa2V5OwotewotICBpbnQgayA9IGhhc2ggKGtleSkgJSB0YWItPnNpemU7Ci0gIGhhc2hfZW50cnkgKnA7Ci0gIGhhc2hfZW50cnkgKip0YWJsZSA9IHRhYi0+dGFibGU7Ci0KLSAgcCA9IHRhYmxlW2tdOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGlmICghcCkKLQl7Ci0JICBoYXNoX2VudHJ5ICpuID0gKGhhc2hfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChoYXNoX2VudHJ5KSk7Ci0JICBuLT5uZXh0ID0gdGFibGVba107Ci0JICBzYl9uZXcgKCZuLT5rZXkpOwotCSAgc2JfYWRkX3NiICgmbi0+a2V5LCBrZXkpOwotCSAgdGFibGVba10gPSBuOwotCSAgbi0+dHlwZSA9IGhhc2hfaW50ZWdlcjsKLQkgIHJldHVybiBuOwotCX0KLSAgICAgIGlmIChzdHJuY21wICh0YWJsZVtrXS0+a2V5LnB0ciwga2V5LT5wdHIsIGtleS0+bGVuKSA9PSAwKQotCXsKLQkgIHJldHVybiBwOwotCX0KLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLX0KLQotLyogYWRkIHNiIG5hbWUgd2l0aCBrZXkgaW50byBoYXNoX3RhYmxlIHRhYi4gIGlmIHJlcGxhY2luZyBvbGQgdmFsdWUKLSAgIGFuZCBhZ2FpbiwgdGhlbiBFUlJPUi4gKi8KLQotc3RhdGljCi12b2lkCi1oYXNoX2FkZF90b19zdHJpbmdfdGFibGUgKHRhYiwga2V5LCBuYW1lLCBhZ2FpbikKLSAgICAgaGFzaF90YWJsZSAqdGFiOwotICAgICBzYiAqa2V5OwotICAgICBzYiAqbmFtZTsKLSAgICAgaW50IGFnYWluOwotewotICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAodGFiLCBrZXkpOwotICBpZiAocHRyLT50eXBlID09IGhhc2hfaW50ZWdlcikKLSAgICB7Ci0gICAgICBzYl9uZXcgKCZwdHItPnZhbHVlLnMpOwotICAgIH0KLSAgaWYgKHB0ci0+dmFsdWUucy5sZW4pCi0gICAgewotICAgICAgaWYgKCFhZ2FpbikKLQlFUlJPUiAoKHN0ZGVyciwgXygicmVkZWZpbml0aW9uIG5vdCBhbGxvd2VkXG4iKSkpOwotICAgIH0KLQotICBwdHItPnR5cGUgPSBoYXNoX3N0cmluZzsKLSAgc2JfcmVzZXQgKCZwdHItPnZhbHVlLnMpOwotICAKLSAgc2JfYWRkX3NiICgmcHRyLT52YWx1ZS5zLCBuYW1lKTsKLX0KLQotLyogYWRkIGludGVnZXIgbmFtZSB0byBoYXNoX3RhYmxlIHRhYiB3aXRoIHNiIGtleS4gKi8KLQotc3RhdGljCi12b2lkCi1oYXNoX2FkZF90b19pbnRfdGFibGUgKHRhYiwga2V5LCBuYW1lKQotICAgICBoYXNoX3RhYmxlICp0YWI7Ci0gICAgIHNiICprZXk7Ci0gICAgIGludCBuYW1lOwotewotICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAodGFiLCBrZXkpOwotICBwdHItPnZhbHVlLmkgPSBuYW1lOwotfQotCi0vKiBsb29rdXAgc2Iga2V5IGluIGhhc2hfdGFibGUgdGFiLiAgaWYgZm91bmQgcmV0dXJuIGhhc2hfZW50cnkgcmVzdWx0LAotICAgZWxzZSAwLiAqLwotICAgCi1zdGF0aWMKLWhhc2hfZW50cnkgKgotaGFzaF9sb29rdXAgKHRhYiwga2V5KQotICAgICBoYXNoX3RhYmxlICp0YWI7Ci0gICAgIHNiICprZXk7Ci17Ci0gIGludCBrID0gaGFzaCAoa2V5KSAlIHRhYi0+c2l6ZTsKLSAgaGFzaF9lbnRyeSAqKnRhYmxlID0gdGFiLT50YWJsZTsKLSAgaGFzaF9lbnRyeSAqcCA9IHRhYmxlW2tdOwotICB3aGlsZSAocCkKLSAgICB7Ci0gICAgICBpZiAocC0+a2V5LmxlbiA9PSBrZXktPmxlbgotCSAgJiYgc3RybmNtcCAocC0+a2V5LnB0ciwga2V5LT5wdHIsIGtleS0+bGVuKSA9PSAwKQotCXJldHVybiBwOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotCi0vKiBleHByZXNzaW9ucwotCi0gICBhcmUgaGFuZGxlZCBpbiBhIHJlYWxseSBzaW1wbGUgcmVjdXJzaXZlIGRlY2VudCB3YXkuIGVhY2ggYml0IG9mCi0gICB0aGUgbWFjaGluZSB0YWtlcyBhbiBpbmRleCBpbnRvIGFuIHNiIGFuZCBhIHBvaW50ZXIgdG8gYW4gZXhwX3QsCi0gICBtb2RpZmllcyB0aGUgKmV4cF90IGFuZCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICBwYXN0IHRoZSBwYXJ0IG9mIHRoZSBleHByZXNzaW9uIHBhcnNlZC4KLQotIGV4cHJlc3Npb24gcHJlY2VkZW5jZToKLSAgKCApCi0gdW5hcnkgKyAtIH4KLSAgKiAvCi0gICsgLQotICAmCi0gIHwgfgotCi0qLwotCi0KLS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBleHBfdCBhdCB0ZXJtIGlzIGNvbnN0YW50LCBpZiBub3QgdGhlIGdpdmUgdGhlIG9wIEVSUk9SLiAqLwotCi1zdGF0aWMKLXZvaWQKLWNoZWNrY29uc3QgKG9wLCB0ZXJtKQotICAgICBpbnQgb3A7Ci0gICAgIGV4cF90ICp0ZXJtOwotewotICBpZiAodGVybS0+YWRkX3N5bWJvbC5sZW4KLSAgICAgIHx8IHRlcm0tPnN1Yl9zeW1ib2wubGVuKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJ0aGUgJWMgb3BlcmF0b3IgY2Fubm90IHRha2Ugbm9uLWFic29sdXRlIGFyZ3VtZW50cy5cbiIpLCBvcCkpOwotICAgIH0KLX0KLQotLyogdHVybiB0aGUgbnVtYmVyIGluIHN0cmluZyBhdCBpZHggaW50byBhIG51bWJlciBvZiBiYXNlLAotICAgZmlsbCBpbiBwdHIgYW5kIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBub3QgaW4gdGhlCi0gICBudW1iZXIuICovCi0KLXN0YXRpYwotaW50Ci1zYl9zdHJ0b2wgKGlkeCwgc3RyaW5nLCBiYXNlLCBwdHIpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGludCBiYXNlOwotICAgICBpbnQgKnB0cjsKLXsKLSAgaW50IHZhbHVlID0gMDsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotCi0gIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbikKLSAgICB7Ci0gICAgICBpbnQgY2ggPSBzdHJpbmctPnB0cltpZHhdOwotICAgICAgaW50IGRpZyA9IDA7Ci0gICAgICBpZiAoaXNkaWdpdCAoY2gpKQotCWRpZyA9IGNoIC0gJzAnOwotICAgICAgZWxzZSBpZiAoY2ggPj0gJ2EnICYmIGNoIDw9ICdmJykKLQlkaWcgPSBjaCAtICdhJyArIDEwOwotICAgICAgZWxzZSBpZiAoY2ggPj0gJ0EnICYmIGNoIDw9ICdGJykKLQlkaWcgPSBjaCAtICdBJyArIDEwOwotICAgICAgZWxzZQotCWJyZWFrOwotCi0gICAgICBpZiAoZGlnID49IGJhc2UpCi0JYnJlYWs7Ci0KLSAgICAgIHZhbHVlID0gdmFsdWUgKiBiYXNlICsgZGlnOwotICAgICAgaWR4Kys7Ci0gICAgfQotICAqcHRyID0gdmFsdWU7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbnQKLWxldmVsXzAgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGxocy0+YWRkX3N5bWJvbC5sZW4gPSAwOwotICBsaHMtPmFkZF9zeW1ib2wubmFtZSA9IDA7Ci0KLSAgbGhzLT5zdWJfc3ltYm9sLmxlbiA9IDA7Ci0gIGxocy0+c3ViX3N5bWJvbC5uYW1lID0gMDsKLQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci0KLSAgbGhzLT52YWx1ZSA9IDA7Ci0KLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBzdHJpbmctPnB0cltpZHhdKSkKLSAgICB7Ci0gICAgICBpZHggPSBzYl9zdHJ0b2wgKGlkeCwgc3RyaW5nLCAxMCwgJmxocy0+dmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKHN0cmluZy0+cHRyW2lkeF0pKQotICAgIHsKLSAgICAgIGludCBsZW4gPSAwOwotICAgICAgbGhzLT5hZGRfc3ltYm9sLm5hbWUgPSBzdHJpbmctPnB0ciArIGlkeDsKLSAgICAgIHdoaWxlIChpZHggPCBzdHJpbmctPmxlbiAmJiBJU05FWFRDSEFSIChzdHJpbmctPnB0cltpZHhdKSkKLQl7Ci0JICBpZHgrKzsKLQkgIGxlbisrOwotCX0KLSAgICAgIGxocy0+YWRkX3N5bWJvbC5sZW4gPSBsZW47Ci0gICAgfQotICBlbHNlIGlmIChzdHJpbmctPnB0cltpZHhdID09ICciJykKLSAgICB7Ci0gICAgICBzYiBhY2M7Ci0gICAgICBzYl9uZXcgKCZhY2MpOwotICAgICAgRVJST1IgKChzdGRlcnIsIF8oInN0cmluZyB3aGVyZSBleHByZXNzaW9uIGV4cGVjdGVkLlxuIikpKTsKLSAgICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBzdHJpbmcsICZhY2MpOwotICAgICAgc2Jfa2lsbCAoJmFjYyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oImNhbid0IGZpbmQgcHJpbWFyeSBpbiBleHByZXNzaW9uLlxuIikpKTsKLSAgICAgIGlkeCsrOwotICAgIH0KLSAgcmV0dXJuIHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQKLWxldmVsXzEgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKTsKLQotICBzd2l0Y2ggKHN0cmluZy0+cHRyW2lkeF0pCi0gICAgewotICAgIGNhc2UgJysnOgotICAgICAgaWR4ID0gbGV2ZWxfMSAoaWR4ICsgMSwgc3RyaW5nLCBsaHMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnfic6Ci0gICAgICBpZHggPSBsZXZlbF8xIChpZHggKyAxLCBzdHJpbmcsIGxocyk7Ci0gICAgICBjaGVja2NvbnN0ICgnficsIGxocyk7Ci0gICAgICBsaHMtPnZhbHVlID0gfmxocy0+dmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICctJzoKLSAgICAgIHsKLQlzeW1ib2wgdDsKLQlpZHggPSBsZXZlbF8xIChpZHggKyAxLCBzdHJpbmcsIGxocyk7Ci0JbGhzLT52YWx1ZSA9IC1saHMtPnZhbHVlOwotCXQgPSBsaHMtPmFkZF9zeW1ib2w7Ci0JbGhzLT5hZGRfc3ltYm9sID0gbGhzLT5zdWJfc3ltYm9sOwotCWxocy0+c3ViX3N5bWJvbCA9IHQ7Ci0JYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSAnKCc6Ci0gICAgICBpZHgrKzsKLSAgICAgIGlkeCA9IGxldmVsXzUgKHNiX3NraXBfd2hpdGUgKGlkeCwgc3RyaW5nKSwgc3RyaW5nLCBsaHMpOwotICAgICAgaWYgKHN0cmluZy0+cHRyW2lkeF0gIT0gJyknKQotCUVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgY2xvc2luZyBwYXJlbnMuXG4iKSkpOwotICAgICAgZWxzZQotCWlkeCsrOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlkeCA9IGxldmVsXzAgKGlkeCwgc3RyaW5nLCBsaHMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi1zdGF0aWMgaW50Ci1sZXZlbF8yIChpZHgsIHN0cmluZywgbGhzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqbGhzOwotewotICBleHBfdCByaHM7Ci0KLSAgaWR4ID0gbGV2ZWxfMSAoaWR4LCBzdHJpbmcsIGxocyk7Ci0KLSAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuICYmIChzdHJpbmctPnB0cltpZHhdID09ICcqJwotCQkJICAgICAgIHx8IHN0cmluZy0+cHRyW2lkeF0gPT0gJy8nKSkKLSAgICB7Ci0gICAgICBjaGFyIG9wID0gc3RyaW5nLT5wdHJbaWR4KytdOwotICAgICAgaWR4ID0gbGV2ZWxfMSAoaWR4LCBzdHJpbmcsICZyaHMpOwotICAgICAgc3dpdGNoIChvcCkKLQl7Ci0JY2FzZSAnKic6Ci0JICBjaGVja2NvbnN0ICgnKicsIGxocyk7Ci0JICBjaGVja2NvbnN0ICgnKicsICZyaHMpOwotCSAgbGhzLT52YWx1ZSAqPSByaHMudmFsdWU7Ci0JICBicmVhazsKLQljYXNlICcvJzoKLQkgIGNoZWNrY29uc3QgKCcvJywgbGhzKTsKLQkgIGNoZWNrY29uc3QgKCcvJywgJnJocyk7Ci0JICBpZiAocmhzLnZhbHVlID09IDApCi0JICAgIEVSUk9SICgoc3RkZXJyLCBfKCJhdHRlbXB0IHRvIGRpdmlkZSBieSB6ZXJvLlxuIikpKTsKLQkgIGVsc2UKLQkgICAgbGhzLT52YWx1ZSAvPSByaHMudmFsdWU7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi0KLXN0YXRpYyBpbnQKLWxldmVsXzMgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGV4cF90IHJoczsKLQotICBpZHggPSBsZXZlbF8yIChpZHgsIHN0cmluZywgbGhzKTsKLQotICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4KLQkgJiYgKHN0cmluZy0+cHRyW2lkeF0gPT0gJysnCi0JICAgICB8fCBzdHJpbmctPnB0cltpZHhdID09ICctJykpCi0gICAgewotICAgICAgY2hhciBvcCA9IHN0cmluZy0+cHRyW2lkeCsrXTsKLSAgICAgIGlkeCA9IGxldmVsXzIgKGlkeCwgc3RyaW5nLCAmcmhzKTsKLSAgICAgIHN3aXRjaCAob3ApCi0JewotCWNhc2UgJysnOgotCSAgbGhzLT52YWx1ZSArPSByaHMudmFsdWU7Ci0JICBpZiAobGhzLT5hZGRfc3ltYm9sLm5hbWUgJiYgcmhzLmFkZF9zeW1ib2wubmFtZSkKLQkgICAgewotCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJjYW4ndCBhZGQgdHdvIHJlbG9jYXRhYmxlIGV4cHJlc3Npb25zXG4iKSkpOwotCSAgICB9Ci0JICAvKiBjaGFuZ2Ugbm4rc3ltYm9sIHRvIHN5bWJvbCArIG5uICovCi0JICBpZiAocmhzLmFkZF9zeW1ib2wubmFtZSkKLQkgICAgewotCSAgICAgIGxocy0+YWRkX3N5bWJvbCA9IHJocy5hZGRfc3ltYm9sOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICctJzoKLQkgIGxocy0+dmFsdWUgLT0gcmhzLnZhbHVlOwotCSAgbGhzLT5zdWJfc3ltYm9sID0gcmhzLmFkZF9zeW1ib2w7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICByZXR1cm4gc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpOwotfQotCi1zdGF0aWMgaW50Ci1sZXZlbF80IChpZHgsIHN0cmluZywgbGhzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqbGhzOwotewotICBleHBfdCByaHM7Ci0KLSAgaWR4ID0gbGV2ZWxfMyAoaWR4LCBzdHJpbmcsIGxocyk7Ci0KLSAgd2hpbGUgKGlkeCA8IHN0cmluZy0+bGVuICYmCi0JIHN0cmluZy0+cHRyW2lkeF0gPT0gJyYnKQotICAgIHsKLSAgICAgIGNoYXIgb3AgPSBzdHJpbmctPnB0cltpZHgrK107Ci0gICAgICBpZHggPSBsZXZlbF8zIChpZHgsIHN0cmluZywgJnJocyk7Ci0gICAgICBzd2l0Y2ggKG9wKQotCXsKLQljYXNlICcmJzoKLQkgIGNoZWNrY29uc3QgKCcmJywgbGhzKTsKLQkgIGNoZWNrY29uc3QgKCcmJywgJnJocyk7Ci0JICBsaHMtPnZhbHVlICY9IHJocy52YWx1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWxldmVsXzUgKGlkeCwgc3RyaW5nLCBsaHMpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpzdHJpbmc7Ci0gICAgIGV4cF90ICpsaHM7Ci17Ci0gIGV4cF90IHJoczsKLQotICBpZHggPSBsZXZlbF80IChpZHgsIHN0cmluZywgbGhzKTsKLQotICB3aGlsZSAoaWR4IDwgc3RyaW5nLT5sZW4KLQkgJiYgKHN0cmluZy0+cHRyW2lkeF0gPT0gJ3wnIHx8IHN0cmluZy0+cHRyW2lkeF0gPT0gJ34nKSkKLSAgICB7Ci0gICAgICBjaGFyIG9wID0gc3RyaW5nLT5wdHJbaWR4KytdOwotICAgICAgaWR4ID0gbGV2ZWxfNCAoaWR4LCBzdHJpbmcsICZyaHMpOwotICAgICAgc3dpdGNoIChvcCkKLQl7Ci0JY2FzZSAnfCc6Ci0JICBjaGVja2NvbnN0ICgnfCcsIGxocyk7Ci0JICBjaGVja2NvbnN0ICgnfCcsICZyaHMpOwotCSAgbGhzLT52YWx1ZSB8PSByaHMudmFsdWU7Ci0JICBicmVhazsKLQljYXNlICd+JzoKLQkgIGNoZWNrY29uc3QgKCd+JywgbGhzKTsKLQkgIGNoZWNrY29uc3QgKCd+JywgJnJocyk7Ci0JICBsaHMtPnZhbHVlIF49IHJocy52YWx1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzYl9za2lwX3doaXRlIChpZHgsIHN0cmluZyk7Ci19Ci0KLQotLyogcGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgb2Zmc2V0IGlkeCBpbnRvIHN0cmluZywgZmlsbCB1cCByZXMgd2l0aAotICAgdGhlIHJlc3VsdC4gcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhciBwYXN0IHRoZSBleHByZXNzaW9uLgotICAgKi8KLQotc3RhdGljIGludAotZXhwX3BhcnNlIChpZHgsIHN0cmluZywgcmVzKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqc3RyaW5nOwotICAgICBleHBfdCAqcmVzOwotewotICByZXR1cm4gbGV2ZWxfNSAoc2Jfc2tpcF93aGl0ZSAoaWR4LCBzdHJpbmcpLCBzdHJpbmcsIHJlcyk7Ci19Ci0KLQotLyogdHVybiB0aGUgZXhwcmVzc2lvbiBhdCBleHAgaW50byB0ZXh0IGFuZCBnbHVlIGl0IG9udG8gdGhlIGVuZCBvZgotICAgc3RyaW5nLiAqLwotCi1zdGF0aWMgdm9pZAotZXhwX3N0cmluZyAoZXhwLCBzdHJpbmcpCi0gICAgIGV4cF90ICpleHA7Ci0gICAgIHNiICpzdHJpbmc7Ci17Ci0gIGludCBucCA9IDA7Ci0gIGludCBhZCA9IDA7Ci0gIHNiX3Jlc2V0IChzdHJpbmcpOwotCi0gIGlmIChleHAtPmFkZF9zeW1ib2wubGVuKQotICAgIHsKLSAgICAgIHNiX2FkZF9idWZmZXIgKHN0cmluZywgZXhwLT5hZGRfc3ltYm9sLm5hbWUsIGV4cC0+YWRkX3N5bWJvbC5sZW4pOwotICAgICAgbnAgPSAxOwotICAgICAgYWQgPSAxOwotICAgIH0KLSAgaWYgKGV4cC0+dmFsdWUpCi0gICAgewotICAgICAgY2hhciBidWZbMjBdOwotICAgICAgaWYgKG5wKQotCXNiX2FkZF9jaGFyIChzdHJpbmcsICcrJyk7Ci0gICAgICBzcHJpbnRmIChidWYsICIlZCIsIGV4cC0+dmFsdWUpOwotICAgICAgc2JfYWRkX3N0cmluZyAoc3RyaW5nLCBidWYpOwotICAgICAgbnAgPSAxOwotICAgICAgYWQgPSAxOwotICAgIH0KLSAgaWYgKGV4cC0+c3ViX3N5bWJvbC5sZW4pCi0gICAgewotICAgICAgc2JfYWRkX2NoYXIgKHN0cmluZywgJy0nKTsKLSAgICAgIHNiX2FkZF9idWZmZXIgKHN0cmluZywgZXhwLT5hZGRfc3ltYm9sLm5hbWUsIGV4cC0+YWRkX3N5bWJvbC5sZW4pOwotICAgICAgbnAgPSAwOwotICAgICAgYWQgPSAxOwotICAgIH0KLQotICBpZiAoIWFkKQotICAgIHNiX2FkZF9jaGFyIChzdHJpbmcsICcwJyk7Ci19Ci0KLQotLyogcGFyc2UgdGhlIGV4cHJlc3Npb24gYXQgb2Zmc2V0IGlkeCBpbnRvIHNiIGluLCByZXR1cm4gdGhlIHZhbHVlIGluIHZhbC4gIAotICAgaWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGNvbnN0YW50LCBnaXZlIEVSUk9SIGVtc2cuICByZXR1cm5zIHRoZSBpbmRleAotICAgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBwYXN0IHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb24uICovCi0KLXN0YXRpYyBpbnQKLWV4cF9nZXRfYWJzIChlbXNnLCBpZHgsIGluLCB2YWwpCi0gICAgIGNvbnN0IGNoYXIgKmVtc2c7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICp2YWw7Ci17Ci0gIGV4cF90IHJlczsKLSAgaWR4ID0gZXhwX3BhcnNlIChpZHgsIGluLCAmcmVzKTsKLSAgaWYgKHJlcy5hZGRfc3ltYm9sLmxlbiB8fCByZXMuc3ViX3N5bWJvbC5sZW4pCi0gICAgRVJST1IgKChzdGRlcnIsIGVtc2cpKTsKLSAgKnZhbCA9IHJlcy52YWx1ZTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotCi1zYiBsYWJlbDsgLyogY3VycmVudCBsYWJlbCBwYXJzZWQgZnJvbSBsaW5lICovCi1oYXNoX3RhYmxlIGFzc2lnbl9oYXNoX3RhYmxlOyAgIC8qIGhhc2ggdGFibGUgZm9yIGFsbCBhc3NpZ25lZCB2YXJpYWJsZXMgKi8KLWhhc2hfdGFibGUga2V5d29yZF9oYXNoX3RhYmxlOyAgLyogaGFzaCB0YWJsZSBmb3Iga2V5d29yZCAqLwotaGFzaF90YWJsZSB2YXJzOyAgLyogaGFzaCB0YWJsZSBmb3IgIGVxIHZhcmlhYmxlcyAqLwotCi0jZGVmaW5lIGluX2NvbW1lbnQgJzsnCi0KLSNpZiAwCi1zdGF0aWMgdm9pZAotc3RyaXBfY29tbWVudHMgKG91dCkKLSAgICAgc2IgKm91dDsKLXsKLSAgY2hhciAqcyA9IG91dC0+cHRyOwotICBpbnQgaSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBvdXQtPmxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChJU0NPTU1FTlRDSEFSKHNbaV0pKQotCXsKLQkgIG91dC0+bGVuID0gaTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotI2VuZGlmCi0KLS8qIHB1c2ggYmFjayBjaGFyYWN0ZXIgY2ggc28gdGhhdCBpdCBjYW4gYmUgcmVhZCBhZ2Fpbi4gKi8KLQotc3RhdGljIHZvaWQKLXVuZ2V0IChjaCkKLSAgICAgaW50IGNoOwotewotICBpZiAoY2ggPT0gJ1xuJykKLSAgICB7Ci0gICAgICBzcC0+bGluZWNvdW50LS07Ci0gICAgfQotICBpZiAoc3AtPnB1c2hiYWNrX2luZGV4KQotICAgIHNwLT5wdXNoYmFja19pbmRleC0tOwotICBlbHNlCi0gICAgc2JfYWRkX2NoYXIgKCZzcC0+cHVzaGJhY2ssIGNoKTsKLX0KLQotLyogcHVzaCB0aGUgc2IgcHRyIG9udG8gdGhlIGluY2x1ZGUgc3RhY2ssIHdpdGggdGhlIGdpdmVuIG5hbWUsIHR5cGUgYW5kIGluZGV4LiAqLwotCi1zdGF0aWMKLXZvaWQKLWluY2x1ZGVfYnVmIChuYW1lLCBwdHIsIHR5cGUsIGluZGV4KQotICAgICBzYiAqbmFtZTsKLSAgICAgc2IgKnB0cjsKLSAgICAgaW5jbHVkZV90eXBlIHR5cGU7Ci0gICAgIGludCBpbmRleDsKLXsKLSAgc3ArKzsKLSAgaWYgKHNwIC0gaW5jbHVkZV9zdGFjayA+PSBNQVhfSU5DTFVERVMpCi0gICAgRkFUQUwgKChzdGRlcnIsIF8oInVucmVhc29uYWJsZSBuZXN0aW5nLlxuIikpKTsKLSAgc2JfbmV3ICgmc3AtPm5hbWUpOwotICBzYl9hZGRfc2IgKCZzcC0+bmFtZSwgbmFtZSk7Ci0gIHNwLT5oYW5kbGUgPSAwOwotICBzcC0+bGluZWNvdW50ID0gMTsKLSAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKLSAgc3AtPnR5cGUgPSB0eXBlOwotICBzcC0+aW5kZXggPSBpbmRleDsKLSAgc2JfbmV3ICgmc3AtPnB1c2hiYWNrKTsKLSAgc2JfYWRkX3NiICgmc3AtPnB1c2hiYWNrLCBwdHIpOwotfQotCi0KLS8qIHVzZWQgaW4gRVJST1IgbWVzc2FnZXMsIHByaW50IGluZm8gb24gd2hlcmUgdGhlIGluY2x1ZGUgc3RhY2sgaXMgb250byBmaWxlLiAqLwotc3RhdGljIAotdm9pZAotaW5jbHVkZV9wcmludF93aGVyZV9saW5lIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBzdHJ1Y3QgaW5jbHVkZV9zdGFjayAqcCA9IGluY2x1ZGVfc3RhY2sgKyAxOwotCi0gIHdoaWxlIChwIDw9IHNwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICIlczolZCAiLCBzYl9uYW1lICgmcC0+bmFtZSksIHAtPmxpbmVjb3VudCAtIDEpOwotICAgICAgcCsrOwotICAgIH0KLX0KLQotLyogdXNlZCBpbiBsaXN0aW5ncywgcHJpbnQgdGhlIGxpbmUgbnVtYmVyIG9udG8gZmlsZS4gKi8KLXN0YXRpYyB2b2lkCi1pbmNsdWRlX3ByaW50X2xpbmUgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGludCBuOwotICBzdHJ1Y3QgaW5jbHVkZV9zdGFjayAqcCA9IGluY2x1ZGVfc3RhY2sgKyAxOwotCi0gIG4gPSBmcHJpbnRmIChmaWxlLCAiJTRkIiwgcC0+bGluZWNvdW50KTsKLSAgcCsrOwotICB3aGlsZSAocCA8PSBzcCkKLSAgICB7Ci0gICAgICBuICs9IGZwcmludGYgKGZpbGUsICIuJWQiLCBwLT5saW5lY291bnQpOwotICAgICAgcCsrOwotICAgIH0KLSAgd2hpbGUgKG4gPCA4ICogMykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICIpOwotICAgICAgbisrOwotICAgIH0KLX0KLQotCi0vKiByZWFkIGEgbGluZSBmcm9tIHRoZSB0b3Agb2YgdGhlIGluY2x1ZGUgc3RhY2sgaW50byBzYiBpbi4gKi8KLQotc3RhdGljIGludAotZ2V0X2xpbmUgKGluKQotICAgICBzYiAqaW47Ci17Ci0gIGludCBvbmxpbmUgPSAwOwotICBpbnQgbW9yZSA9IDE7Ci0KLSAgaWYgKGNvcHlzb3VyY2UpCi0gICAgewotICAgICAgcHV0YyAoY29tbWVudF9jaGFyLCBvdXRmaWxlKTsKLSAgICAgIGlmIChwcmludF9saW5lX251bWJlcikKLQlpbmNsdWRlX3ByaW50X2xpbmUgKG91dGZpbGUpOwotICAgIH0KLQotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgY2ggPSBnZXQgKCk7Ci0KLSAgICAgIHdoaWxlIChjaCA9PSAnXHInKQotCWNoID0gZ2V0ICgpOwotCi0gICAgICBpZiAoY2ggPT0gRU9GKQotCXsKLQkgIGlmIChvbmxpbmUpCi0JICAgIHsKLQkgICAgICBXQVJOSU5HICgoc3RkZXJyLCBfKCJFbmQgb2YgZmlsZSBub3QgYXQgc3RhcnQgb2YgbGluZS5cbiIpKSk7Ci0JICAgICAgaWYgKGNvcHlzb3VyY2UpCi0JCXB1dGMgKCdcbicsIG91dGZpbGUpOwotCSAgICAgIGNoID0gJ1xuJzsKLQkgICAgfQotCSAgZWxzZQotCSAgICBtb3JlID0gMDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKGNvcHlzb3VyY2UpCi0JewotCSAgcHV0YyAoY2gsIG91dGZpbGUpOwotCX0KLQotICAgICAgaWYgKGNoID09ICdcbicpCi0JewotCSAgY2ggPSBnZXQgKCk7Ci0JICBvbmxpbmUgPSAwOwotCSAgaWYgKGNoID09ICcrJykKLQkgICAgewotCSAgICAgIC8qIGNvbnRpbnVlZCBsaW5lICovCi0JICAgICAgaWYgKGNvcHlzb3VyY2UpCi0JCXsKLQkJICBwdXRjIChjb21tZW50X2NoYXIsIG91dGZpbGUpOwotCQkgIHB1dGMgKCcrJywgb3V0ZmlsZSk7Ci0JCX0KLQkgICAgICBjaCA9IGdldCAoKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGNoICE9IEVPRikKLQkJdW5nZXQgKGNoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfY2hhciAoaW4sIGNoKTsKLQl9Ci0gICAgICBvbmxpbmUrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIG1vcmU7Ci19Ci0KLS8qIGZpbmQgYSBsYWJlbCBmcm9tIHNiIGluIGFuZCBwdXQgaXQgaW4gb3V0LiAqLwotCi1zdGF0aWMgaW50Ci1ncmFiX2xhYmVsIChpbiwgb3V0KQotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIGludCBpID0gMDsKLSAgc2JfcmVzZXQgKG91dCk7Ci0gIGlmIChJU0ZJUlNUQ0hBUiAoaW4tPnB0cltpXSkgfHwgaW4tPnB0cltpXSA9PSAnXFwnKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaV0pOwotICAgICAgaSsrOwotICAgICAgd2hpbGUgKChJU05FWFRDSEFSIChpbi0+cHRyW2ldKSAKLQkgICAgICB8fCBpbi0+cHRyW2ldID09ICdcXCcKLQkgICAgICB8fCBpbi0+cHRyW2ldID09ICcmJykgCi0JICAgICAmJiBpIDwgaW4tPmxlbikKLQl7Ci0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2ldKTsKLQkgIGkrKzsKLQl9Ci0gICAgfQotICByZXR1cm4gaTsKLX0KLQotLyogZmluZCBhbGwgc3RyYW5nZSBiYXNlIHN0dWZmIGFuZCB0dXJuIGludG8gZGVjaW1hbC4gYWxzbwotICAgZmluZCBhbGwgdGhlIG90aGVyIG51bWJlcnMgYW5kIGNvbnZlcnQgdGhlbSBmcm9tIHRoZSBkZWZhdWx0IHJhZGl4ICovCi0KLXN0YXRpYyB2b2lkCi1jaGFuZ2VfYmFzZSAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIGNoYXIgYnVmZmVyWzIwXTsKLQotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICYmIGlkeCArIDEgPCBpbi0+bGVuCi0JICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICcoJykKLQl7Ci0JICBpZHggKz0gMjsKLQkgIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JCSAmJiBpbi0+cHRyW2lkeF0gIT0gJyknKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCSAgaWYgKGlkeCA8IGluLT5sZW4pCi0JICAgIGlkeCsrOwotCX0KLSAgICAgIGVsc2UgaWYgKGlkeCA8IGluLT5sZW4gLSAxICYmIGluLT5wdHJbaWR4ICsgMV0gPT0gJ1wnJyAmJiAhIG1yaSkKLQl7Ci0JICBpbnQgYmFzZTsKLQkgIGludCB2YWx1ZTsKLQkgIHN3aXRjaCAoaW4tPnB0cltpZHhdKQotCSAgICB7Ci0JICAgIGNhc2UgJ2InOgotCSAgICBjYXNlICdCJzoKLQkgICAgICBiYXNlID0gMjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncSc6Ci0JICAgIGNhc2UgJ1EnOgotCSAgICAgIGJhc2UgPSA4OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdoJzoKLQkgICAgY2FzZSAnSCc6Ci0JICAgICAgYmFzZSA9IDE2OwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdkJzoKLQkgICAgY2FzZSAnRCc6Ci0JICAgICAgYmFzZSA9IDEwOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJJbGxlZ2FsIGJhc2UgY2hhcmFjdGVyICVjLlxuIiksIGluLT5wdHJbaWR4XSkpOwotCSAgICAgIGJhc2UgPSAxMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICBpZHggPSBzYl9zdHJ0b2wgKGlkeCArIDIsIGluLCBiYXNlLCAmdmFsdWUpOwotCSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCB2YWx1ZSk7Ci0JICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1ZmZlcik7Ci0JfQotICAgICAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgLyogY29weSBlbnRpcmUgbmFtZXMgdGhyb3VnaCBxdWlja2x5ICovCi0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgaWR4Kys7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBJU05FWFRDSEFSIChpbi0+cHRyW2lkeF0pKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pKQotCXsKLQkgIGludCB2YWx1ZTsKLQkgIC8qIGFsbCBudW1iZXJzIG11c3Qgc3RhcnQgd2l0aCBhIGRpZ2l0LCBsZXQncyBjaGV3IGl0IGFuZAotCSAgICAgc3BpdCBvdXQgZGVjaW1hbCAqLwotCSAgaWR4ID0gc2Jfc3RydG9sIChpZHgsIGluLCByYWRpeCwgJnZhbHVlKTsKLQkgIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgdmFsdWUpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCi0JICAvKiBza2lwIGFsbCB1bmRpZ3Nlc3RlZCBsZXR0ZXJzICovCi0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBJU05FWFRDSEFSIChpbi0+cHRyW2lkeF0pKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JewotCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkgIC8qIGNvcHkgZW50aXJlIG5hbWVzIHRocm91Z2ggcXVpY2tseSAqLwotCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdICE9IHRjaGFyKQotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBub3RoaW5nIHNwZWNpYWwsIGp1c3QgcGFzcyBpdCB0aHJvdWdoICovCi0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW2lkeF0pOwotCSAgaWR4Kys7Ci0JfQotICAgIH0KLQotfQotCi0vKiAuZW5kICovCi1zdGF0aWMgdm9pZAotZG9fZW5kIChpbikKLSAgICAgc2IgKmluOwotewotICBoYWRfZW5kID0gMTsKLSAgaWYgKG1yaSkKLSAgICBmcHJpbnRmIChvdXRmaWxlLCAiJXNcbiIsIHNiX25hbWUgKGluKSk7Ci19Ci0KLS8qIC5hc3NpZ24gKi8KLQotc3RhdGljIHZvaWQKLWRvX2Fzc2lnbiAoYWdhaW4sIGlkeCwgaW4pCi0gICAgIGludCBhZ2FpbjsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICAvKiBzdGljayBsYWJlbCBpbiBzeW1ib2wgdGFibGUgd2l0aCBmb2xsb3dpbmcgdmFsdWUgKi8KLSAgZXhwX3QgZTsKLSAgc2IgYWNjOwotCi0gIHNiX25ldyAoJmFjYyk7Ci0gIGlkeCA9IGV4cF9wYXJzZSAoaWR4LCBpbiwgJmUpOwotICBleHBfc3RyaW5nICgmZSwgJmFjYyk7Ci0gIGhhc2hfYWRkX3RvX3N0cmluZ190YWJsZSAoJmFzc2lnbl9oYXNoX3RhYmxlLCAmbGFiZWwsICZhY2MsIGFnYWluKTsKLSAgc2Jfa2lsbCAoJmFjYyk7Ci19Ci0KLQotLyogLnJhZGl4IFtifHF8ZHxoXSAqLwotCi1zdGF0aWMKLXZvaWQKLWRvX3JhZGl4IChwdHIpCi0gICAgIHNiICpwdHI7Ci17Ci0gIGludCBpZHggPSBzYl9za2lwX3doaXRlICgwLCBwdHIpOwotICBzd2l0Y2ggKHB0ci0+cHRyW2lkeF0pCi0gICAgewotICAgIGNhc2UgJ0InOgotICAgIGNhc2UgJ2InOgotICAgICAgcmFkaXggPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAncSc6Ci0gICAgY2FzZSAnUSc6Ci0gICAgICByYWRpeCA9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICAgIHJhZGl4ID0gMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdoJzoKLSAgICBjYXNlICdIJzoKLSAgICAgIHJhZGl4ID0gMTY7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgRVJST1IgKChzdGRlcnIsIF8oInJhZGl4IGlzICVjIG11c3QgYmUgb25lIG9mIGIsIHEsIGQgb3IgaCIpLCByYWRpeCkpOwotICAgIH0KLX0KLQotCi0vKiBQYXJzZSBvZmYgYSAuYiwgLncgb3IgLmwgKi8KLQotc3RhdGljIGludAotZ2V0X29wc2l6ZSAoaWR4LCBpbiwgc2l6ZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgKnNpemU7Ci17Ci0gICpzaXplID0gNDsKLSAgaWYgKGluLT5wdHJbaWR4XSA9PSAnLicpCi0gICAgewotICAgICAgaWR4Kys7Ci0gICAgfQotICBzd2l0Y2ggKGluLT5wdHJbaWR4XSkKLSAgICB7Ci0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAnQic6Ci0gICAgICAqc2l6ZSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd3JzoKLSAgICBjYXNlICdXJzoKLSAgICAgICpzaXplID0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2wnOgotICAgIGNhc2UgJ0wnOgotICAgICAgKnNpemUgPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnICc6Ci0gICAgY2FzZSAnXHQnOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJzaXplIG11c3QgYmUgb25lIG9mIGIsIHcgb3IgbCwgaXMgJWMuXG4iKSwgaW4tPnB0cltpZHhdKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIGlkeCsrOwotCi0gIHJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyAKLWludCBlb2woaWR4LCBsaW5lKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqbGluZTsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBsaW5lKTsKLSAgaWYgKGlkeCA8IGxpbmUtPmxlbiAKLSAgICAgICYmIElTQ09NTUVOVENIQVIobGluZS0+cHRyW2lkeF0pKQotICAgIHJldHVybiAxOwotICBpZiAoaWR4ID49IGxpbmUtPmxlbikKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIC5kYXRhIFsuYnwud3wubF0gPGRhdGE+KiAKLSAgICBvciBkW2J3bF0gPGRhdGE+KiAqLwotCi1zdGF0aWMgdm9pZAotZG9fZGF0YSAoaWR4LCBpbiwgc2l6ZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgaW50IG9wc2l6ZSA9IDQ7Ci0gIGNoYXIgKm9wbmFtZSA9ICIueWlrZXMhIjsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotCi0gIGlmICghc2l6ZSkgCi0gICAgewotICAgICAgaWR4ID0gZ2V0X29wc2l6ZSAoaWR4LCBpbiwgJm9wc2l6ZSk7Ci0gICAgfQotICBlbHNlIHsKLSAgICBvcHNpemUgPSBzaXplOwotICB9Ci0gIHN3aXRjaCAob3BzaXplKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBvcG5hbWUgPSAiLmxvbmciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgb3BuYW1lID0gIi5zaG9ydCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBvcG5hbWUgPSAiLmJ5dGUiOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIiVzXHQiLCBvcG5hbWUpOwotCi0gIGlkeCA9ICAgc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgaWYgKGFsdGVybmF0ZSAKLSAgICAgICYmIGlkeCA8IGluLT5sZW4gCi0gICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJyInKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhY2MubGVuOyBpKyspCi0JewotCSAgaWYgKGkpCi0JICAgIGZwcmludGYob3V0ZmlsZSwiLCIpOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLnB0cltpXSk7Ci0JfQotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICB3aGlsZSAoIWVvbCAoaWR4LCBpbikpCi0JewotCSAgZXhwX3QgZTsKLQkgIGlkeCA9IGV4cF9wYXJzZSAoaWR4LCBpbiwgJmUpOwotCSAgZXhwX3N0cmluZyAoJmUsICZhY2MpOwotCSAgc2JfYWRkX2NoYXIgKCZhY2MsIDApOwotCSAgZnByaW50ZiAob3V0ZmlsZSwgYWNjLnB0cik7Ci0JICBpZiAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJywnKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHNiX2tpbGwgKCZhY2MpOwotICBzYl9wcmludF9hdCAob3V0ZmlsZSwgaWR4LCBpbik7Ci0gIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotfQotCi0vKiAuZGF0YWIgWy5ifC53fC5sXSA8cmVwZWF0Piw8ZmlsbD4gKi8KLQotc3RhdGljIHZvaWQKLWRvX2RhdGFiIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBvcHNpemU7Ci0gIGludCByZXBlYXQ7Ci0gIGludCBmaWxsOwotCi0gIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZvcHNpemUpOwotCi0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJkYXRhYiByZXBlYXQgbXVzdCBiZSBjb25zdGFudC5cbiIpLCBpZHgsIGluLCAmcmVwZWF0KTsKLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJkYXRhYiBkYXRhIG11c3QgYmUgYWJzb2x1dGUuXG4iKSwgaWR4LCBpbiwgJmZpbGwpOwotCi0gIGZwcmludGYgKG91dGZpbGUsICIuZmlsbFx0JWQsJWQsJWRcbiIsIHJlcGVhdCwgb3BzaXplLCBmaWxsKTsKLX0KLQotLyogLmFsaWduIDxzaXplPiAqLwotCi1zdGF0aWMgdm9pZAotZG9fYWxpZ24gKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IGFsLCBoYXZlX2ZpbGwsIGZpbGw7Ci0KLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oImFsaWduIG5lZWRzIGFic29sdXRlIGV4cHJlc3Npb24uXG4iKSwgaWR4LCBpbiwgJmFsKTsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGhhdmVfZmlsbCA9IDA7Ci0gIGZpbGwgPSAwOwotICBpZiAoISBlb2wgKGlkeCwgaW4pKQotICAgIHsKLSAgICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICAgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIi5hbGlnbiBuZWVkcyBhYnNvbHV0ZSBmaWxsIHZhbHVlLlxuIiksIGlkeCwgaW4sCi0JCQkgJmZpbGwpOwotICAgICAgaGF2ZV9maWxsID0gMTsKLSAgICB9Ci0KLSAgaWYgKGFsICE9IDEKLSAgICAgICYmIGFsICE9IDIKLSAgICAgICYmIGFsICE9IDQpCi0gICAgV0FSTklORyAoKHN0ZGVyciwgXygiYWxpZ25tZW50IG11c3QgYmUgb25lIG9mIDEsIDIgb3IgNC5cbiIpKSk7Ci0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIi5hbGlnbgklZCIsIGFsKTsKLSAgaWYgKGhhdmVfZmlsbCkKLSAgICBmcHJpbnRmIChvdXRmaWxlLCAiLCVkIiwgZmlsbCk7Ci0gIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotfQotCi0vKiAucmVzWy5ifC53fC5sXSA8c2l6ZT4gKi8KLQotc3RhdGljIHZvaWQKLWRvX3JlcyAoaWR4LCBpbiwgdHlwZSkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgdHlwZTsKLXsKLSAgaW50IHNpemUgPSA0OwotICBpbnQgY291bnQgPSAwOwotCi0gIGlkeCA9IGdldF9vcHNpemUgKGlkeCwgaW4sICZzaXplKTsKLSAgd2hpbGUgKCFlb2woaWR4LCBpbikpCi0gICAgewotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICcsJykKLQlpZHgrKzsKLSAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJyZXMgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiBmb3IgZmlsbCBjb3VudC5cbiIpLCBpZHgsIGluLCAmY291bnQpOwotCi0gICAgICBpZiAodHlwZSA9PSAnYycgfHwgdHlwZSA9PSAneicpCi0JY291bnQrKzsKLQotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIi5zcGFjZQklZFxuIiwgY291bnQgKiBzaXplKTsKLSAgICB9Ci19Ci0KLQotLyogLmV4cG9ydCAqLwotCi1zdGF0aWMgdm9pZAotZG9fZXhwb3J0IChpbikKLSAgICAgc2IgKmluOwotewotICBmcHJpbnRmIChvdXRmaWxlLCAiLmdsb2JhbAklc1xuIiwgc2JfbmFtZSAoaW4pKTsKLX0KLQotLyogLnByaW50IFtsaXN0XSBbbm9saXN0XSAqLwotCi1zdGF0aWMgdm9pZAotZG9fcHJpbnQgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIkxJU1QiLCA0KSA9PSAwKQotCXsKLQkgIGZwcmludGYgKG91dGZpbGUsICIubGlzdFxuIik7Ci0JICBpZHggKz0gNDsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoaW4tPnB0ciArIGlkeCwgIk5PTElTVCIsIDYpID09IDApCi0JewotCSAgZnByaW50ZiAob3V0ZmlsZSwgIi5ub2xpc3RcbiIpOwotCSAgaWR4ICs9IDY7Ci0JfQotICAgICAgaWR4Kys7Ci0gICAgfQotfQotCi0vKiAuaGVhZCAqLwotc3RhdGljIHZvaWQKLWRvX2hlYWRpbmcgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgc2IgaGVhZDsKLSAgc2JfbmV3ICgmaGVhZCk7Ci0gIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmhlYWQpOwotICBmcHJpbnRmIChvdXRmaWxlLCAiLnRpdGxlCVwiJXNcIlxuIiwgc2JfbmFtZSAoJmhlYWQpKTsKLSAgc2Jfa2lsbCAoJmhlYWQpOwotfQotCi0vKiAucGFnZSAqLwotCi1zdGF0aWMgdm9pZAotZG9fcGFnZSAoKQotewotICBmcHJpbnRmIChvdXRmaWxlLCAiLmVqZWN0XG4iKTsKLX0KLQotLyogLmZvcm0gW2xpbj08dmFsdWU+XSBbY29sPTx2YWx1ZT5dICovCi1zdGF0aWMgdm9pZAotZG9fZm9ybSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgbGluZXMgPSA2MDsKLSAgaW50IGNvbHVtbnMgPSAxMzI7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIHdoaWxlIChpZHggPCBpbi0+bGVuKQotICAgIHsKLQotICAgICAgaWYgKHN0cm5jYXNlY21wIChpbi0+cHRyICsgaWR4LCAiTElOPSIsIDQpID09IDApCi0JewotCSAgaWR4ICs9IDQ7Ci0JICBpZHggPSBleHBfZ2V0X2FicyAoXygiZm9ybSBMSU49IG5lZWRzIGFic29sdXRlIGV4cHJlc3NzaW9uLlxuIiksIGlkeCwgaW4sICZsaW5lcyk7Ci0JfQotCi0gICAgICBpZiAoc3RybmNhc2VjbXAgKGluLT5wdHIgKyBpZHgsIF8oIkNPTD0iKSwgNCkgPT0gMCkKLQl7Ci0JICBpZHggKz0gNDsKLQkgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJmb3JtIENPTD0gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc3Npb24uXG4iKSwgaWR4LCBpbiwgJmNvbHVtbnMpOwotCX0KLQotICAgICAgaWR4Kys7Ci0gICAgfQotICBmcHJpbnRmIChvdXRmaWxlLCAiLnBzaXplICVkLCVkXG4iLCBsaW5lcywgY29sdW1ucyk7Ci0KLX0KLQotCi0vKiBGZXRjaCBzdHJpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAotICAgcnVsZXM6Ci0gICAgJ0J4eXg8d2hpdGVzcGFjZT4gIAktPiByZXR1cm4gJ0J4eXphCi0gICAgJTxjaGFyPgkJLT4gcmV0dXJuIHN0cmluZyBvZiBkZWNpbWFsIHZhbHVlIG9mIHgKLSAgICAiPHN0cmluZz4iCQktPiByZXR1cm4gc3RyaW5nCi0gICAgeHl4PHdoaXRlc3BhY2U+ICAgICAtPiByZXR1cm4geHl6Ci0qLwotc3RhdGljIGludAotZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sIG91dCwgZXhwYW5kLCBwcmV0ZW5kX3F1b3RlZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotICAgICBpbnQgZXhwYW5kOwotICAgICBpbnQgcHJldGVuZF9xdW90ZWQ7Ci17Ci0gIHNiX3Jlc2V0IChvdXQpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICBpZiAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBpZiAoaW4tPmxlbiA+IDIgJiYgaW4tPnB0cltpZHgrMV0gPT0gJ1wnJyAmJiBJU0JBU0UgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgd2hpbGUgKCFJU1NFUCAoaW4tPnB0cltpZHhdKSkKLQkgICAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltpZHgrK10pOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnJScKLQkgICAgICAgJiYgYWx0ZXJuYXRlCi0JICAgICAgICYmIGV4cGFuZCkKLQl7Ci0JICBpbnQgdmFsOwotCSAgY2hhciBidWZbMjBdOwotCSAgLyogVHVybnMgdGhlIG5leHQgZXhwcmVzc2lvbiBpbnRvIGEgc3RyaW5nICovCi0JICBpZHggPSBleHBfZ2V0X2FicyAoXygiJSBvcGVyYXRvciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIiksCi0JCQkgICAgIGlkeCArIDEsCi0JCQkgICAgIGluLAotCQkJICAgICAmdmFsKTsKLQkgIHNwcmludGYoYnVmLCAiJWQiLCB2YWwpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWYpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicKLQkgICAgICAgfHwgaW4tPnB0cltpZHhdID09ICc8JwotCSAgICAgICB8fCAoYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKSkKLQl7Ci0JICBpZiAoYWx0ZXJuYXRlICYmIGV4cGFuZCkKLQkgICAgewotCSAgICAgIC8qIEtlZXAgdGhlIHF1b3RlcyAqLwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICAnXCInKTsKLQkJICAgIAotCSAgICAgIGlkeCA9ICBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICAgICAgc2JfYWRkX2NoYXIgKG91dCwgICdcIicpOwotCi0JICAgIH0KLQkgIGVsc2UgewotCSAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sIG91dCk7Ci0JICB9Ci0JfQotICAgICAgZWxzZSAKLQl7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAKLQkJICYmIChpbi0+cHRyW2lkeF0gPT0gJyInCi0JCSAgICAgfHwgaW4tPnB0cltpZHhdID09ICdcJycKLQkJICAgICB8fCBwcmV0ZW5kX3F1b3RlZCAKLQkJICAgICB8fCAhSVNTRVAgKGluLT5wdHJbaWR4XSkpKQotCSAgICB7Ci0JICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgCi0JCSAgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JCXsKLQkJICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQkJICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCQkJICYmIGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsJCSAgICAKLQkJICBpZiAoaWR4ID09IGluLT5sZW4pCi0JCSAgICByZXR1cm4gaWR4OwkgICAgICAKLQkJfQotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotCi0vKiBza2lwIGFsb25nIHNiIGluIHN0YXJ0aW5nIGF0IGlkeCwgc3VjayBvZmYgd2hpdGVzcGFjZSBhICggYW5kIG1vcmUKLSAgIHdoaXRlc3BhY2UuICByZXR1cm4gdGhlIGlkeCBvZiB0aGUgbmV4dCBjaGFyICovCi0KLXN0YXRpYyBpbnQKLXNraXBfb3BlbnAgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGlmIChpbi0+cHRyW2lkeF0gIT0gJygnKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgKCAuXG4iKSkpOwotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAxLCBpbik7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIHNraXAgYWxvbmcgc2IgaW4gc3RhcnRpbmcgYXQgaWR4LCBzdWNrIG9mZiB3aGl0ZXNwYWNlIGEgKSBhbmQgbW9yZQotICAgd2hpdGVzcGFjZS4gIHJldHVybiB0aGUgaWR4IG9mIHRoZSBuZXh0IGNoYXIgKi8KLQotc3RhdGljIGludAotc2tpcF9jbG9zZXAgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGlmIChpbi0+cHRyW2lkeF0gIT0gJyknKQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJtaXNwbGFjZWQgKS5cbiIpKSk7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCArIDEsIGluKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogLmxlbiAqLwotCi1zdGF0aWMgaW50Ci1kb2xlbiAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0KLSAgc2Igc3RyaW5nb3V0OwotICBjaGFyIGJ1ZmZlclsxMF07Ci0KLSAgc2JfbmV3ICgmc3RyaW5nb3V0KTsKLSAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZ291dCk7Ci0gIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKLSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBzdHJpbmdvdXQubGVuKTsKLSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCi0gIHNiX2tpbGwgKCZzdHJpbmdvdXQpOwotICByZXR1cm4gaWR4OwotfQotCi0KLS8qIC5pbnN0ciAqLwotCi1zdGF0aWMKLWludAotZG9pbnN0ciAoaWR4LCBpbiwgb3V0KQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci17Ci0gIHNiIHN0cmluZzsKLSAgc2Igc2VhcmNoOwotICBpbnQgaTsKLSAgaW50IHN0YXJ0OwotICBpbnQgcmVzOwotICBjaGFyIGJ1ZmZlclsxMF07Ci0KLSAgc2JfbmV3ICgmc3RyaW5nKTsKLSAgc2JfbmV3ICgmc2VhcmNoKTsKLSAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldF9hbmRfcHJvY2VzcyAoaWR4LCBpbiwgJnN0cmluZyk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzZWFyY2gpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWYgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pKQotICAgIHsKLSAgICAgIGlkeCA9IGV4cF9nZXRfYWJzIChfKCIuaW5zdHIgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc29uLlxuIiksIGlkeCwgaW4sICZzdGFydCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RhcnQgPSAwOwotICAgIH0KLSAgaWR4ID0gc2tpcF9jbG9zZXAgKGlkeCwgaW4pOwotICByZXMgPSAtMTsKLSAgZm9yIChpID0gc3RhcnQ7IGkgPCBzdHJpbmcubGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cm5jbXAgKHN0cmluZy5wdHIgKyBpLCBzZWFyY2gucHRyLCBzZWFyY2gubGVuKSA9PSAwKQotCXsKLQkgIHJlcyA9IGk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICBzcHJpbnRmIChidWZmZXIsICIlZCIsIHJlcyk7Ci0gIHNiX2FkZF9zdHJpbmcgKG91dCwgYnVmZmVyKTsKLSAgc2Jfa2lsbCAoJnN0cmluZyk7Ci0gIHNiX2tpbGwgKCZzZWFyY2gpOwotICByZXR1cm4gaWR4OwotfQotCi0KLXN0YXRpYyBpbnQKLWRvc3Vic3RyIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgc2Igc3RyaW5nOwotICBpbnQgcG9zOwotICBpbnQgbGVuOwotICBzYl9uZXcgKCZzdHJpbmcpOwotCi0gIGlkeCA9IHNraXBfb3BlbnAgKGlkeCwgaW4pOwotICBpZHggPSBnZXRfYW5kX3Byb2Nlc3MgKGlkeCwgaW4sICZzdHJpbmcpOwotICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIm5lZWQgYWJzb2x1dGUgcG9zaXRpb24uXG4iKSwgaWR4LCBpbiwgJnBvcyk7Ci0gIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygibmVlZCBhYnNvbHV0ZSBsZW5ndGguXG4iKSwgaWR4LCBpbiwgJmxlbik7Ci0gIGlkeCA9IHNraXBfY2xvc2VwIChpZHgsIGluKTsKLQotCi0gIGlmIChsZW4gPCAwIHx8IHBvcyA8IDAgfHwKLSAgICAgIHBvcyA+IHN0cmluZy5sZW4KLSAgICAgIHx8IHBvcyArIGxlbiA+IHN0cmluZy5sZW4pCi0gICAgewotICAgICAgc2JfYWRkX3N0cmluZyAob3V0LCAiICIpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAob3V0LCAnIicpOwotICAgICAgd2hpbGUgKGxlbiA+IDApCi0JewotCSAgc2JfYWRkX2NoYXIgKG91dCwgc3RyaW5nLnB0cltwb3MrK10pOwotCSAgbGVuLS07Ci0JfQotICAgICAgc2JfYWRkX2NoYXIgKG91dCwgJyInKTsKLSAgICB9Ci0gIHNiX2tpbGwoJnN0cmluZyk7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIHNjYW4gbGluZSwgY2hhbmdlIHRva2VucyBpbiB0aGUgaGFzaCB0YWJsZSB0byB0aGVpciByZXBsYWNlbWVudHMgKi8KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sIGJ1ZikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqYnVmOwotewotICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBoYXNoX2VudHJ5ICpwdHI7Ci0gICAgICBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICYmIGlkeCArIDEgPCBpbi0+bGVuCi0JICAmJiBpbi0+cHRyW2lkeCArIDFdID09ICcoJykKLQl7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgc2JfYWRkX2NoYXIgKGJ1ZiwgaW4tPnB0cltpZHhdKTsKLQkgICAgICBpZHgrKzsKLQkgICAgfQotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHggLSAxXSAhPSAnKScpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnXFwnCi0JICAmJiBpZHggKyAxIDwgaW4tPmxlbgotCSAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnJicpCi0JewotCSAgaWR4ID0gY29uZGFzc19sb29rdXBfbmFtZSAoaW4sIGlkeCArIDIsIGJ1ZiwgMSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICdcXCcKLQkgICAgICAgJiYgaWR4ICsgMSA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltpZHggKyAxXSA9PSAnJCcpCi0JewotCSAgaWR4ID0gY29uZGFzc19sb29rdXBfbmFtZSAoaW4sIGlkeCArIDIsIGJ1ZiwgMCk7Ci0JfQotICAgICAgZWxzZSBpZiAoaWR4ICsgMyA8IGluLT5sZW4KLQkgICAgICAgJiYgaW4tPnB0cltpZHhdID09ICcuJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAxXSkgPT0gJ0wnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDJdKSA9PSAnRScKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgM10pID09ICdOJykKLQlpZHggPSBkb2xlbiAoaWR4ICsgNCwgaW4sIGJ1Zik7Ci0gICAgICBlbHNlIGlmIChpZHggKyA2IDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW2lkeF0gPT0gJy4nCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDFdKSA9PSAnSScKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMl0pID09ICdOJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAzXSkgPT0gJ1MnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDRdKSA9PSAnVCcKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNV0pID09ICdSJykKLQlpZHggPSBkb2luc3RyIChpZHggKyA2LCBpbiwgYnVmKTsKLSAgICAgIGVsc2UgaWYgKGlkeCArIDcgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnLicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgMV0pID09ICdTJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyAyXSkgPT0gJ1UnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDNdKSA9PSAnQicKLQkgICAgICAgJiYgdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4ICsgNF0pID09ICdTJwotCSAgICAgICAmJiB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltpZHggKyA1XSkgPT0gJ1QnCi0JICAgICAgICYmIHRvdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeCArIDZdKSA9PSAnUicpCi0JaWR4ID0gZG9zdWJzdHIgKGlkeCArIDcsIGluLCBidWYpOwotICAgICAgZWxzZSBpZiAoSVNGSVJTVENIQVIgKGluLT5wdHJbaWR4XSkpCi0JewotCSAgLyogbWF5IGJlIGEgc2ltcGxlIG5hbWUgc3Vic2l0dXRpb24sIHNlZSBpZiB3ZSBoYXZlIGEgd29yZCAqLwotCSAgc2IgYWNjOwotCSAgaW50IGN1ciA9IGlkeCArIDE7Ci0JICB3aGlsZSAoY3VyIDwgaW4tPmxlbgotCQkgJiYgKElTTkVYVENIQVIgKGluLT5wdHJbY3VyXSkpKQotCSAgICBjdXIrKzsKLQotCSAgc2JfbmV3ICgmYWNjKTsKLQkgIHNiX2FkZF9idWZmZXIgKCZhY2MsIGluLT5wdHIgKyBpZHgsIGN1ciAtIGlkeCk7Ci0JICBwdHIgPSBoYXNoX2xvb2t1cCAoJmFzc2lnbl9oYXNoX3RhYmxlLCAmYWNjKTsKLQkgIGlmIChwdHIpCi0JICAgIHsKLQkgICAgICAvKiBGb3VuZCBhIGRlZmluaXRpb24gZm9yIGl0ICovCi0JICAgICAgc2JfYWRkX3NiIChidWYsICZwdHItPnZhbHVlLnMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBObyBkZWZpbml0aW9uLCBqdXN0IGNvcHkgdGhlIHdvcmQgKi8KLQkgICAgICBzYl9hZGRfc2IgKGJ1ZiwgJmFjYyk7Ci0JICAgIH0KLQkgIHNiX2tpbGwgKCZhY2MpOwotCSAgaWR4ID0gY3VyOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfY2hhciAoYnVmLCBpbi0+cHRyW2lkeCsrXSk7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIGludAotZ2V0X2FuZF9wcm9jZXNzIChpZHgsIGluLCBvdXQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLXsKLSAgc2IgdDsKLSAgc2JfbmV3ICgmdCk7Ci0gIGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmdCwgMSwgMCk7Ci0gIHByb2Nlc3NfYXNzaWducyAoMCwgJnQsIG91dCk7Ci0gIHNiX2tpbGwgKCZ0KTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotc3RhdGljCi12b2lkCi1wcm9jZXNzX2ZpbGUgKCkKLXsKLSAgc2IgbGluZTsKLSAgc2IgdDEsIHQyOwotICBzYiBhY2M7Ci0gIHNiIGxhYmVsX2luOwotICBpbnQgbW9yZTsKLQotICBzYl9uZXcgKCZsaW5lKTsKLSAgc2JfbmV3ICgmdDEpOwotICBzYl9uZXcgKCZ0Mik7Ci0gIHNiX25ldygmYWNjKTsKLSAgc2JfbmV3ICgmbGFiZWxfaW4pOwotICBzYl9yZXNldCAoJmxpbmUpOwotICBtb3JlID0gZ2V0X2xpbmUgKCZsaW5lKTsKLSAgd2hpbGUgKG1vcmUpCi0gICAgewotICAgICAgLyogRmluZCBhbnkgbGFiZWwgYW5kIHBzZXVkbyBvcCB0aGF0IHdlJ3JlIGludGVzdGVkIGluICovCi0gICAgICBpbnQgbDsKLSAgICAgIGlmIChsaW5lLmxlbiA9PSAwKQotCXsKLQkgIGlmIChjb25kYXNzX29uICgpKQotCSAgICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLQl9Ci0gICAgICBlbHNlIGlmIChtcmkKLQkgICAgICAgJiYgKGxpbmUucHRyWzBdID09ICcqJwotCQkgICB8fCBsaW5lLnB0clswXSA9PSAnIScpKQotCXsKLQkgIC8qIE1SSSBsaW5lIGNvbW1lbnQuICAqLwotCSAgZnByaW50ZiAob3V0ZmlsZSwgc2JfbmFtZSAoJmxpbmUpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbCA9IGdyYWJfbGFiZWwgKCZsaW5lLCAmbGFiZWxfaW4pOwotCSAgc2JfcmVzZXQgKCZsYWJlbCk7CSAgCSAgCi0KLQkgIGlmIChsaW5lLnB0cltsXSA9PSAnOicpCi0JICAgIGwrKzsKLQkgIHdoaWxlIChJU1dISVRFIChsaW5lLnB0cltsXSkgJiYgbCA8IGxpbmUubGVuKQotCSAgICBsKys7Ci0KLQkgIGlmIChsYWJlbF9pbi5sZW4pCi0JICAgIHsKLQkgICAgICBpbnQgZG9fYXNzaWduczsKLQotCSAgICAgIC8qIE11bmdlIHRoZSBsYWJlbCwgdW5sZXNzIHRoaXMgaXMgRVFVIG9yIEFTU0lHTi4gICovCi0JICAgICAgZG9fYXNzaWducyA9IDE7Ci0JICAgICAgaWYgKGwgPCBsaW5lLmxlbgotCQkgICYmIChsaW5lLnB0cltsXSA9PSAnLicgfHwgYWx0ZXJuYXRlIHx8IG1yaSkpCi0JCXsKLQkJICBpbnQgbHggPSBsOwotCi0JCSAgaWYgKGxpbmUucHRyW2x4XSA9PSAnLicpCi0JCSAgICArK2x4OwotCQkgIGlmIChseCArIDMgPD0gbGluZS5sZW4KLQkJICAgICAgJiYgc3RybmNhc2VjbXAgKCJFUVUiLCBsaW5lLnB0ciArIGx4LCAzKSA9PSAwCi0JCSAgICAgICYmIChseCArIDMgPT0gbGluZS5sZW4KLQkJCSAgfHwgISBJU0ZJUlNUQ0hBUiAobGluZS5wdHJbbHggKyAzXSkpKQotCQkgICAgZG9fYXNzaWducyA9IDA7Ci0JCSAgZWxzZSBpZiAobHggKyA2IDw9IGxpbmUubGVuCi0JCQkgICAmJiBzdHJuY2FzZWNtcCAoIkFTU0lHTiIsIGxpbmUucHRyICsgbHgsIDYpID09IDAKLQkJCSAgICYmIChseCArIDYgPT0gbGluZS5sZW4KLQkJCSAgICAgICB8fCAhIElTRklSU1RDSEFSIChsaW5lLnB0cltseCArIDZdKSkpCi0JCSAgICBkb19hc3NpZ25zID0gMDsKLQkJfQotCi0JICAgICAgaWYgKGRvX2Fzc2lnbnMpCi0JCXByb2Nlc3NfYXNzaWducyAoMCwgJmxhYmVsX2luLCAmbGFiZWwpOwotCSAgICAgIGVsc2UKLQkJc2JfYWRkX3NiICgmbGFiZWwsICZsYWJlbF9pbik7Ci0JICAgIH0KLQotCSAgaWYgKGwgPCBsaW5lLmxlbikKLQkgICAgewotCSAgICAgIGlmIChwcm9jZXNzX3BzZXVkb19vcCAobCwgJmxpbmUsICZhY2MpKQotCQl7Ci0KLQotCi0JCX0KLQkgICAgICBlbHNlIGlmIChjb25kYXNzX29uICgpKQotCQl7Ci0JCSAgaWYgKG1hY3JvX29wIChsLCAmbGluZSkpCi0JCSAgICB7Ci0KLQotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgewotCQkJaWYgKGxhYmVsLmxlbikKLQkJCSAgewotCQkJICAgIGZwcmludGYgKG91dGZpbGUsICIlczpcdCIsIHNiX25hbWUgKCZsYWJlbCkpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIGZwcmludGYgKG91dGZpbGUsICJcdCIpOwotCQkJc2JfcmVzZXQoJnQxKTsKLQkJCXByb2Nlc3NfYXNzaWducyAobCwgJmxpbmUsICZ0MSk7Ci0JCQlzYl9yZXNldCAoJnQyKTsKLQkJCWNoYW5nZV9iYXNlICgwLCAmdDEsICZ0Mik7Ci0JCQlmcHJpbnRmIChvdXRmaWxlLCAiJXNcbiIsIHNiX25hbWUgKCZ0MikpOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZWxzZSB7Ci0JICAgIC8qIE9ubHkgYSBsYWJlbCBvbiB0aGlzIGxpbmUgKi8KLQkgICAgaWYgKGxhYmVsLmxlbiAmJiBjb25kYXNzX29uKCkpCi0JICAgICAgewotCQlmcHJpbnRmIChvdXRmaWxlLCAiJXM6XG4iLCBzYl9uYW1lICgmbGFiZWwpKTsKLQkgICAgICB9Ci0JICB9Ci0JfQotCi0gICAgICBpZiAoaGFkX2VuZCkKLQlicmVhazsKLSAgICAgIHNiX3Jlc2V0ICgmbGluZSk7Ci0gICAgICBtb3JlID0gZ2V0X2xpbmUgKCZsaW5lKTsKLSAgICB9Ci0KLSAgaWYgKCFoYWRfZW5kICYmICFtcmkpCi0gICAgV0FSTklORyAoKHN0ZGVyciwgXygiRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS5cbiIpKSk7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQKLWZyZWVfb2xkX2VudHJ5IChwdHIpCi0gICAgIGhhc2hfZW50cnkgKnB0cjsKLXsKLSAgaWYgKHB0cikKLSAgICB7Ci0gICAgICBpZiAocHRyLT50eXBlID09IGhhc2hfc3RyaW5nKQotCXNiX2tpbGwoJnB0ci0+dmFsdWUucyk7Ci0gICAgfQotfQotCi0vKiBuYW1lOiAuQVNTSUdOQSA8dmFsdWU+ICovCi0KLXN0YXRpYyB2b2lkCi1kb19hc3NpZ25hIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIHNiIHRtcDsKLSAgaW50IHZhbDsKLSAgc2JfbmV3ICgmdG1wKTsKLQotICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgaW4sICZ0bXApOwotICBpZHggPSBleHBfZ2V0X2FicyAoXygiLkFTU0lHTkEgbmVlZHMgY29uc3RhbnQgZXhwcmVzc2lvbiBhcmd1bWVudC5cbiIpLCAwLCAmdG1wLCAmdmFsKTsKLQotICBpZiAoIWxhYmVsLmxlbikKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiLkFTU0lHTkEgd2l0aG91dCBsYWJlbC5cbiIpKSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaGFzaF9lbnRyeSAqcHRyID0gaGFzaF9jcmVhdGUgKCZ2YXJzLCAmbGFiZWwpOwotICAgICAgZnJlZV9vbGRfZW50cnkgKHB0cik7Ci0gICAgICBwdHItPnR5cGUgPSBoYXNoX2ludGVnZXI7Ci0gICAgICBwdHItPnZhbHVlLmkgPSB2YWw7Ci0gICAgfQotICBzYl9raWxsICgmdG1wKTsKLX0KLQotLyogbmFtZTogLkFTU0lHTkMgPHN0cmluZz4gKi8KLQotc3RhdGljIHZvaWQKLWRvX2Fzc2lnbmMgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2MpOwotCi0gIGlmICghbGFiZWwubGVuKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCIuQVNTSUdOUyB3aXRob3V0IGxhYmVsLlxuIikpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBoYXNoX2VudHJ5ICpwdHIgPSBoYXNoX2NyZWF0ZSAoJnZhcnMsICZsYWJlbCk7Ci0gICAgICBmcmVlX29sZF9lbnRyeSAocHRyKTsKLSAgICAgIHB0ci0+dHlwZSA9IGhhc2hfc3RyaW5nOwotICAgICAgc2JfbmV3ICgmcHRyLT52YWx1ZS5zKTsKLSAgICAgIHNiX2FkZF9zYiAoJnB0ci0+dmFsdWUucywgJmFjYyk7Ci0gICAgfQotICBzYl9raWxsICgmYWNjKTsKLX0KLQotCi0vKiBuYW1lOiAuUkVHIChyZWcpICovCi0KLXN0YXRpYyB2b2lkCi1kb19yZWcgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgLyogcmVtb3ZlIHJlZyBzdHVmZiBmcm9tIGluc2lkZSBwYXJlbnMgKi8KLSAgc2Igd2hhdDsKLSAgaWYgKCFtcmkpCi0gICAgaWR4ID0gc2tpcF9vcGVucCAoaWR4LCBpbik7Ci0gIGVsc2UKLSAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgc2JfbmV3ICgmd2hhdCk7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuCi0JICYmIChtcmkKLQkgICAgID8gISBlb2wgKGlkeCwgaW4pCi0JICAgICA6IGluLT5wdHJbaWR4XSAhPSAnKScpKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyICgmd2hhdCwgaW4tPnB0cltpZHhdKTsKLSAgICAgIGlkeCsrOwotICAgIH0KLSAgaGFzaF9hZGRfdG9fc3RyaW5nX3RhYmxlICgmYXNzaWduX2hhc2hfdGFibGUsICZsYWJlbCwgJndoYXQsIDEpOwotICBzYl9raWxsICgmd2hhdCk7Ci19Ci0KLQotc3RhdGljIGludAotY29uZGFzc19sb29rdXBfbmFtZSAoaW5idWYsIGlkeCwgb3V0LCB3YXJuKQotICAgICBzYiAqaW5idWY7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCB3YXJuOwotewotICBoYXNoX2VudHJ5ICpwdHI7Ci0gIHNiIGNvbmRhc3NfYWNjOwotICBzYl9uZXcgKCZjb25kYXNzX2FjYyk7Ci0KLSAgd2hpbGUgKGlkeCA8IGluYnVmLT5sZW4KLQkgJiYgSVNORVhUQ0hBUiAoaW5idWYtPnB0cltpZHhdKSkKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAoJmNvbmRhc3NfYWNjLCBpbmJ1Zi0+cHRyW2lkeCsrXSk7Ci0gICAgfQotCi0gIGlmIChpbmJ1Zi0+cHRyW2lkeF0gPT0gJ1wnJykKLSAgICBpZHgrKzsKLSAgcHRyID0gaGFzaF9sb29rdXAgKCZ2YXJzLCAmY29uZGFzc19hY2MpOwotCi0KLSAgaWYgKCFwdHIpCi0gICAgewotICAgICAgaWYgKHdhcm4pIAotCXsKLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIkNhbid0IGZpbmQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlICVzLlxuIiksIHNiX25hbWUgKCZjb25kYXNzX2FjYykpKTsKLQl9Ci0gICAgICBlbHNlIAotCXsKLQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgIjAiKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKHB0ci0+dHlwZSA9PSBoYXNoX2ludGVnZXIpCi0JewotCSAgY2hhciBidWZmZXJbMzBdOwotCSAgc3ByaW50ZiAoYnVmZmVyLCAiJWQiLCBwdHItPnZhbHVlLmkpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWZmZXIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfc2IgKG91dCwgJnB0ci0+dmFsdWUucyk7Ci0JfQotICAgIH0KLSAgc2Jfa2lsbCAoJmNvbmRhc3NfYWNjKTsKLSAgcmV0dXJuIGlkeDsKLX0KLQotI2RlZmluZSBFUSAxCi0jZGVmaW5lIE5FIDIKLSNkZWZpbmUgR0UgMwotI2RlZmluZSBMVCA0Ci0jZGVmaW5lIExFIDUKLSNkZWZpbmUgR1QgNgotI2RlZmluZSBORVZFUiA3Ci0KLXN0YXRpYyBpbnQKLXdoYXRjb25kIChpZHgsIGluLCB2YWwpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgaW50ICp2YWw7Ci17Ci0gIGludCBjb25kOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICBjb25kID0gTkVWRVI7Ci0gIGlmIChpZHggKyAxIDwgaW4tPmxlbikKLSAgICB7Ci0gICAgICBjaGFyICpwOwotICAgICAgY2hhciBhLCBiOwotCi0gICAgICBwID0gaW4tPnB0ciArIGlkeDsKLSAgICAgIGEgPSB0b3VwcGVyICgodW5zaWduZWQgY2hhcikgcFswXSk7Ci0gICAgICBiID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIHBbMV0pOwotICAgICAgaWYgKGEgPT0gJ0UnICYmIGIgPT0gJ1EnKQotCWNvbmQgPSBFUTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ04nICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBORTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0wnICYmIGIgPT0gJ1QnKQotCWNvbmQgPSBMVDsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0wnICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBMRTsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0cnICYmIGIgPT0gJ1QnKQotCWNvbmQgPSBHVDsKLSAgICAgIGVsc2UgaWYgKGEgPT0gJ0cnICYmIGIgPT0gJ0UnKQotCWNvbmQgPSBHRTsKLSAgICB9Ci0gIGlmIChjb25kID09IE5FVkVSKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJDb21wYXJpc29uIG9wZXJhdG9yIG11c3QgYmUgb25lIG9mIEVRLCBORSwgTFQsIExFLCBHVCBvciBHRS5cbiIpKSk7Ci0gICAgICBjb25kID0gTkVWRVI7Ci0gICAgfQotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHggKyAyLCBpbik7Ci0gICp2YWwgPSBjb25kOwotICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgaW50Ci1pc3RydWUgKGlkeCwgaW4pCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLXsKLSAgaW50IHJlczsKLSAgc2IgYWNjX2E7Ci0gIHNiIGNvbmQ7Ci0gIHNiIGFjY19iOwotICBzYl9uZXcgKCZhY2NfYSk7Ci0gIHNiX25ldyAoJmNvbmQpOwotICBzYl9uZXcgKCZhY2NfYik7Ci0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQotICAgIHsKLSAgICAgIGludCBjb25kOwotICAgICAgaW50IHNhbWU7Ci0gICAgICAvKiBUaGlzIGlzIGEgc3RyaW5nIGNvbXBhcmlzaW9uICovCi0gICAgICBpZHggPSBnZXRzdHJpbmcgKGlkeCwgaW4sICZhY2NfYSk7Ci0gICAgICBpZHggPSB3aGF0Y29uZCAoaWR4LCBpbiwgJmNvbmQpOwotICAgICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmYWNjX2IpOwotICAgICAgc2FtZSA9IGFjY19hLmxlbiA9PSBhY2NfYi5sZW4gJiYgKHN0cm5jbXAgKGFjY19hLnB0ciwgYWNjX2IucHRyLCBhY2NfYS5sZW4pID09IDApOwotCi0gICAgICBpZiAoY29uZCAhPSBFUSAmJiBjb25kICE9IE5FKQotCXsKLQkgIEVSUk9SICgoc3RkZXJyLCBfKCJDb21wYXJpc29uIG9wZXJhdG9yIGZvciBzdHJpbmdzIG11c3QgYmUgRVEgb3IgTkVcbiIpKSk7Ci0JICByZXMgPSAwOwotCX0KLSAgICAgIGVsc2UKLQlyZXMgPSAoY29uZCAhPSBFUSkgXiBzYW1lOwotICAgIH0KLSAgZWxzZQotICAgIC8qIFRoaXMgaXMgYSBudW1lcmljIGV4cHJlc3Npb24gKi8KLSAgICB7Ci0gICAgICBpbnQgdmFsYTsKLSAgICAgIGludCB2YWxiOwotICAgICAgaW50IGNvbmQ7Ci0gICAgICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksIGlkeCwgaW4sICZ2YWxhKTsKLSAgICAgIGlkeCA9IHdoYXRjb25kIChpZHgsIGluLCAmY29uZCk7Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyInKQotCXsKLQkgIFdBUk5JTkcgKChzdGRlcnIsIF8oIlN0cmluZyBjb21wYXJlZCBhZ2FpbnN0IGV4cHJlc3Npb24uXG4iKSkpOwotCSAgcmVzID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNvbmRpdGlvbmFsIG9wZXJhdG9yIG11c3QgaGF2ZSBhYnNvbHV0ZSBvcGVyYW5kcy5cbiIpLCBpZHgsIGluLCAmdmFsYik7Ci0JICBzd2l0Y2ggKGNvbmQpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICByZXMgPSA0MjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBFUToKLQkgICAgICByZXMgPSB2YWxhID09IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTkU6Ci0JICAgICAgcmVzID0gdmFsYSAhPSB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIExUOgotCSAgICAgIHJlcyA9IHZhbGEgPCB2YWxiOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIExFOgotCSAgICAgIHJlcyA9IHZhbGEgPD0gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBHVDoKLQkgICAgICByZXMgPSB2YWxhID4gdmFsYjsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBHRToKLQkgICAgICByZXMgPSB2YWxhID49IHZhbGI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTkVWRVI6Ci0JICAgICAgcmVzID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJmFjY19hKTsKLSAgc2Jfa2lsbCAoJmNvbmQpOwotICBzYl9raWxsICgmYWNjX2IpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiAuQUlGICovCi1zdGF0aWMgdm9pZAotZG9fYWlmIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGlmIChpZmkgPj0gSUZORVNUSU5HKQotICAgIHsKLSAgICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLSAgaWZpKys7Ci0gIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gaXN0cnVlIChpZHgsIGluKSA6IDA7Ci0gIGlmc3RhY2tbaWZpXS5oYWRlbHNlID0gMDsKLX0KLQotCi0vKiAuQUVMU0UgKi8KLXN0YXRpYyB2b2lkCi1kb19hZWxzZSAoKQotewotICBpZnN0YWNrW2lmaV0ub24gPSBpZnN0YWNrW2lmaS0xXS5vbiA/ICFpZnN0YWNrW2lmaV0ub24gOiAwOwotICBpZiAoaWZzdGFja1tpZmldLmhhZGVsc2UpCi0gICAgewotICAgICAgRVJST1IgKChzdGRlcnIsIF8oIk11bHRpcGxlIEFFTFNFcyBpbiBBSUYuXG4iKSkpOwotICAgIH0KLSAgaWZzdGFja1tpZmldLmhhZGVsc2UgPSAxOwotfQotCi0KLS8qIC5BRU5ESSAqLwotc3RhdGljIHZvaWQKLWRvX2FlbmRpICgpCi17Ci0gIGlmIChpZmkgIT0gMCkKLSAgICB7Ci0gICAgICBpZmktLTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQUVOREkgd2l0aG91dCBBSUYuXG4iKSkpOwotICAgIH0KLX0KLQotc3RhdGljIGludAotY29uZGFzc19vbiAoKQotewotICByZXR1cm4gaWZzdGFja1tpZmldLm9uOwotfQotCi0vKiBNUkkgSUZFUSwgSUZORSwgSUZMVCwgSUZMRSwgSUZHRSwgSUZHVC4gICovCi0KLXN0YXRpYyB2b2lkCi1kb19pZiAoaWR4LCBpbiwgY29uZCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgY29uZDsKLXsKLSAgaW50IHZhbDsKLSAgaW50IHJlczsKLQotICBpZiAoaWZpID49IElGTkVTVElORykKLSAgICB7Ci0gICAgICBGQVRBTCAoKHN0ZGVyciwgXygiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLQotICBpZHggPSBleHBfZ2V0X2FicyAoXygiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIiksCi0JCSAgICAgaWR4LCBpbiwgJnZhbCk7Ci0gIHN3aXRjaCAoY29uZCkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIEVROiByZXMgPSB2YWwgPT0gMDsgYnJlYWs7Ci0gICAgY2FzZSBORTogcmVzID0gdmFsICE9IDA7IGJyZWFrOwotICAgIGNhc2UgTFQ6IHJlcyA9IHZhbCA8ICAwOyBicmVhazsKLSAgICBjYXNlIExFOiByZXMgPSB2YWwgPD0gMDsgYnJlYWs7Ci0gICAgY2FzZSBHRTogcmVzID0gdmFsID49IDA7IGJyZWFrOwotICAgIGNhc2UgR1Q6IHJlcyA9IHZhbCA+ICAwOyBicmVhazsKLSAgICB9Ci0KLSAgaWZpKys7Ci0gIGlmc3RhY2tbaWZpXS5vbiA9IGlmc3RhY2tbaWZpLTFdLm9uID8gcmVzOiAwOwotICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Ci19Ci0KLS8qIEdldCBhIHN0cmluZyBmb3IgdGhlIE1SSSBJRkMgb3IgSUZOQyBwc2V1ZG8tb3BzLiAgKi8KLQotc3RhdGljIGludAotZ2V0X21yaV9zdHJpbmcgKGlkeCwgaW4sIHZhbCwgdGVybWluYXRvcikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqdmFsOwotICAgICBpbnQgdGVybWluYXRvcjsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgaWYgKGlkeCA8IGluLT5sZW4KLSAgICAgICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyICh2YWwsICdcJycpOwotICAgICAgZm9yICgrK2lkeDsgaWR4IDwgaW4tPmxlbjsgKytpZHgpCi0JewotCSAgc2JfYWRkX2NoYXIgKHZhbCwgaW4tPnB0cltpZHhdKTsKLQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQkgICAgewotCSAgICAgICsraWR4OwotCSAgICAgIGlmIChpZHggPj0gaW4tPmxlbgotCQkgIHx8IGluLT5wdHJbaWR4XSAhPSAnXCcnKQotCQlicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAgICAgJiYgaW4tPnB0cltpZHhdICE9IHRlcm1pbmF0b3IpCi0JewotCSAgc2JfYWRkX2NoYXIgKHZhbCwgaW4tPnB0cltpZHhdKTsKLQkgICsraWR4OwotCX0KLSAgICAgIGkgPSB2YWwtPmxlbiAtIDE7Ci0gICAgICB3aGlsZSAoaSA+PSAwICYmIElTV0hJVEUgKHZhbC0+cHRyW2ldKSkKLQktLWk7Ci0gICAgICB2YWwtPmxlbiA9IGkgKyAxOwotICAgIH0KLQotICByZXR1cm4gaWR4OwotfQotCi0vKiBNUkkgSUZDLCBJRk5DLiAgKi8KLQotc3RhdGljIHZvaWQKLWRvX2lmYyAoaWR4LCBpbiwgaWZuYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBpbnQgaWZuYzsKLXsKLSAgc2IgZmlyc3Q7Ci0gIHNiIHNlY29uZDsKLSAgaW50IHJlczsKLQotICBpZiAoaWZpID49IElGTkVTVElORykKLSAgICB7Ci0gICAgICBGQVRBTCAoKHN0ZGVyciwgXygiSUYgbmVzdGluZyB1bnJlYXNvbmFibGUuXG4iKSkpOwotICAgIH0KLQotICBzYl9uZXcgKCZmaXJzdCk7Ci0gIHNiX25ldyAoJnNlY29uZCk7Ci0KLSAgaWR4ID0gZ2V0X21yaV9zdHJpbmcgKGlkeCwgaW4sICZmaXJzdCwgJywnKTsKLQotICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdICE9ICcsJykKLSAgICB7Ci0gICAgICBFUlJPUiAoKHN0ZGVyciwgXygiQmFkIGZvcm1hdCBmb3IgSUYgb3IgSUZOQy5cbiIpKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlkeCA9IGdldF9tcmlfc3RyaW5nIChpZHggKyAxLCBpbiwgJnNlY29uZCwgJzsnKTsKLQotICByZXMgPSAoZmlyc3QubGVuID09IHNlY29uZC5sZW4KLQkgJiYgc3RybmNtcCAoZmlyc3QucHRyLCBzZWNvbmQucHRyLCBmaXJzdC5sZW4pID09IDApOwotICByZXMgXj0gaWZuYzsKLQotICBpZmkrKzsKLSAgaWZzdGFja1tpZmldLm9uID0gaWZzdGFja1tpZmktMV0ub24gPyByZXMgOiAwOwotICBpZnN0YWNrW2lmaV0uaGFkZWxzZSA9IDA7Ci19Ci0KLS8qIC5FTkRSICovCi1zdGF0aWMgdm9pZAotZG9fYWVuZHIgKCkKLXsKLSAgaWYgKCFtcmkpCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULlxuIikpKTsKLSAgZWxzZQotICAgIEVSUk9SICgoc3RkZXJyLCBfKCJFTkRSIHdpdGhvdXQgYSBSRVBULlxuIikpKTsKLX0KLQotLyogLkFXSElMRSAqLwotCi1zdGF0aWMKLXZvaWQKLWRvX2F3aGlsZSAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgbGluZSA9IGxpbmVjb3VudCAoKTsKLSAgc2IgZXhwOwotICBzYiBzdWI7Ci0gIGludCBkb2l0OwotCi0gIHNiX25ldyAoJnN1Yik7Ci0gIHNiX25ldyAoJmV4cCk7Ci0KLSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKLSAgZG9pdCA9IGlzdHJ1ZSAoMCwgJmV4cCk7Ci0KLSAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0ICgiQVdISUxFIiwgIkFFTkRXIiwgJnN1YiwgZ2V0X2xpbmUpKQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBV0hJTEUgd2l0aG91dCBhIEFFTkRXIGF0ICVkLlxuIiksIGxpbmUgLSAxKSk7Ci0KLSAgLyogVHVybgotICAgICAJLkFXSElMRSBleHAKLQkgICAgIGZvbwotCS5BRU5EVwotICAgICBpbnRvCi0gICAgICAgIGZvbwotCS5BV0hJTEUgZXhwCi0JZm9vCi0JLkVORFcKLSAgICovCi0KLSAgaWYgKGRvaXQpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOwotCi0gICAgICBzYiBjb3B5OwotICAgICAgc2JfbmV3ICgmY29weSk7Ci0gICAgICBzYl9hZGRfc2IgKCZjb3B5LCAmc3ViKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNvcHksIGluKTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiXG4iKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotICAgICAgc2JfYWRkX3N0cmluZyAoJmNvcHksICJcdC5BRU5EV1xuIik7Ci0gICAgICAvKiBQdXNoIGFub3RoZXIgV0hJTEUgKi8KLSAgICAgIGluY2x1ZGVfYnVmICgmZXhwLCAmY29weSwgaW5jbHVkZV93aGlsZSwgaW5kZXgpOwotICAgICAgc2Jfa2lsbCAoJmNvcHkpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmV4cCk7Ci0gIHNiX2tpbGwgKCZzdWIpOwotfQotCi0KLS8qIC5BRU5EVyAqLwotCi1zdGF0aWMgdm9pZAotZG9fYWVuZHcgKCkKLXsKLSAgRVJST1IgKChzdGRlcnIsIF8oIkFFTkRXIHdpdGhvdXQgYSBBRU5EVy5cbiIpKSk7Ci19Ci0KLQotLyogLkVYSVRNCi0gICAKLSAgIFBvcCB0aGluZ3Mgb2ZmIHRoZSBpbmNsdWRlIHN0YWNrIHVudGlsIHRoZSB0eXBlIGFuZCBpbmRleCBjaGFuZ2VzICovCi0KLXN0YXRpYyB2b2lkCi1kb19leGl0bSAoKQotewotICBpbmNsdWRlX3R5cGUgdHlwZSA9IHNwLT50eXBlOwotICBpZiAodHlwZSA9PSBpbmNsdWRlX3JlcGVhdAotICAgICAgfHwgdHlwZSA9PSBpbmNsdWRlX3doaWxlCi0gICAgICB8fCB0eXBlID09IGluY2x1ZGVfbWFjcm8pCi0gICAgewotICAgICAgaW50IGluZGV4ID0gc3AtPmluZGV4OwotICAgICAgaW5jbHVkZV9wb3AgKCk7Ci0gICAgICB3aGlsZSAoc3AtPmluZGV4ID09IGluZGV4Ci0JICAgICAmJiBzcC0+dHlwZSA9PSB0eXBlKQotCXsKLQkgIGluY2x1ZGVfcG9wICgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIC5BUkVQRUFUICovCi0KLXN0YXRpYyB2b2lkCi1kb19hcmVwZWF0IChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIGludCBsaW5lID0gbGluZWNvdW50ICgpOwotICBzYiBleHA7CQkJLyogYnVmZmVyIHdpdGggZXhwcmVzc2lvbiBpbiBpdCAqLwotICBzYiBjb3B5OwkJCS8qIGV4cGFuZGVkIHJlcGVhdCBibG9jayAqLwotICBzYiBzdWI7CQkJLyogY29udGVudHMgb2YgQVJFUEVBVCAqLwotICBpbnQgcmM7Ci0gIGludCByZXQ7Ci0gIGNoYXIgYnVmZmVyWzMwXTsKLQotICBzYl9uZXcgKCZleHApOwotICBzYl9uZXcgKCZjb3B5KTsKLSAgc2JfbmV3ICgmc3ViKTsKLSAgcHJvY2Vzc19hc3NpZ25zIChpZHgsIGluLCAmZXhwKTsKLSAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkFSRVBFQVQgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmQuXG4iKSwgMCwgJmV4cCwgJnJjKTsKLSAgaWYgKCFtcmkpCi0gICAgcmV0ID0gYnVmZmVyX2FuZF9uZXN0ICgiQVJFUEVBVCIsICJBRU5EUiIsICZzdWIsIGdldF9saW5lKTsKLSAgZWxzZQotICAgIHJldCA9IGJ1ZmZlcl9hbmRfbmVzdCAoIlJFUFQiLCAiRU5EUiIsICZzdWIsIGdldF9saW5lKTsKLSAgaWYgKCEgcmV0KQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJBUkVQRUFUIHdpdGhvdXQgYSBBRU5EUiBhdCAlZC5cbiIpLCBsaW5lIC0gMSkpOwotICBpZiAocmMgPiAwKQotICAgIHsKLSAgICAgIC8qIFB1c2ggYmFjayB0aGUgdGV4dCBmb2xsb3dpbmcgdGhlIHJlcGVhdCwgYW5kIGFub3RoZXIgcmVwZWF0IGJsb2NrCi0JIHNvCi0JIC5BUkVQRUFUIDIwCi0JIGZvbwotCSAuQUVORFIKLQkgZ2V0cyB0dXJuZWQgaW50bwotCSBmb28KLQkgLkFSRVBFQVQgMTkKLQkgZm9vCi0JIC5BRU5EUgotCSAqLwotICAgICAgaW50IGluZGV4ID0gaW5jbHVkZV9uZXh0X2luZGV4ICgpOwotICAgICAgc2JfYWRkX3NiICgmY29weSwgJnN1Yik7Ci0gICAgICBpZiAocmMgPiAxKQotCXsKLQkgIGlmICghbXJpKQotCSAgICBzcHJpbnRmIChidWZmZXIsICJcdC5BUkVQRUFUCSVkXG4iLCByYyAtIDEpOwotCSAgZWxzZQotCSAgICBzcHJpbnRmIChidWZmZXIsICJcdFJFUFQJJWRcbiIsIHJjIC0gMSk7Ci0JICBzYl9hZGRfc3RyaW5nICgmY29weSwgYnVmZmVyKTsKLQkgIHNiX2FkZF9zYiAoJmNvcHksICZzdWIpOwotCSAgaWYgKCFtcmkpCi0JICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCS5BRU5EUlxuIik7Ci0JICBlbHNlCi0JICAgIHNiX2FkZF9zdHJpbmcgKCZjb3B5LCAiCUVORFJcbiIpOwotCX0KLQotICAgICAgaW5jbHVkZV9idWYgKCZleHAsICZjb3B5LCBpbmNsdWRlX3JlcGVhdCwgaW5kZXgpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmV4cCk7Ci0gIHNiX2tpbGwgKCZzdWIpOwotICBzYl9raWxsICgmY29weSk7Ci19Ci0KLS8qIC5FTkRNICovCi0KLXN0YXRpYyB2b2lkCi1kb19lbmRtICgpCi17Ci0gIEVSUk9SICgoc3RkZXJyLCBfKCIuRU5ETSB3aXRob3V0IGEgbWF0Y2hpbmcgLk1BQ1JPLlxuIikpKTsKLX0KLQotLyogTVJJIElSUCBwc2V1ZG8tb3AuICAqLwotCi1zdGF0aWMgdm9pZAotZG9faXJwIChpZHgsIGluLCBpcnBjKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCBpcnBjOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIHNiIG91dDsKLQotICBzYl9uZXcgKCZvdXQpOwotCi0gIGVyciA9IGV4cGFuZF9pcnAgKGlycGMsIGlkeCwgaW4sICZvdXQsIGdldF9saW5lLCBjb21tZW50X2NoYXIpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7Ci0KLSAgZnByaW50ZiAob3V0ZmlsZSwgIiVzIiwgc2JfdGVybWluYXRlICgmb3V0KSk7Ci0KLSAgc2Jfa2lsbCAoJm91dCk7Ci19Ci0KLS8qIE1BQ1JPIFBST0NFU1NJTkcgKi8KLQotLyogUGFyc2Ugb2ZmIExPQ0FMIG4xLCBuMiwuLi4gSW52ZW50IGEgbGFiZWwgbmFtZSBmb3IgaXQgKi8KLXN0YXRpYwotdm9pZCAKLWRvX2xvY2FsIChpZHgsIGxpbmUpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpsaW5lOwotewotICBFUlJPUiAoKHN0ZGVyciwgXygiTE9DQUwgb3V0c2lkZSBvZiBNQUNSTyIpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19tYWNybyAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIGludCBsaW5lID0gbGluZWNvdW50ICgpOwotCi0gIGVyciA9IGRlZmluZV9tYWNybyAoaWR4LCBpbiwgJmxhYmVsLCBnZXRfbGluZSwgKGNvbnN0IGNoYXIgKiopIE5VTEwpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsIF8oIm1hY3JvIGF0IGxpbmUgJWQ6ICVzXG4iKSwgbGluZSAtIDEsIGVycikpOwotfQotCi1zdGF0aWMgaW50Ci1tYWNyb19vcCAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBjb25zdCBjaGFyICplcnI7Ci0gIHNiIG91dDsKLSAgc2IgbmFtZTsKLQotICBpZiAoISBtYWNyb19kZWZpbmVkKQotICAgIHJldHVybiAwOwotCi0gIHNiX3Rlcm1pbmF0ZSAoaW4pOwotICBpZiAoISBjaGVja19tYWNybyAoaW4tPnB0ciArIGlkeCwgJm91dCwgY29tbWVudF9jaGFyLCAmZXJyKSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgRVJST1IgKChzdGRlcnIsICIlc1xuIiwgZXJyKSk7Ci0KLSAgc2JfbmV3ICgmbmFtZSk7Ci0gIHNiX2FkZF9zdHJpbmcgKCZuYW1lLCBfKCJtYWNybyBleHBhbnNpb24iKSk7Ci0KLSAgaW5jbHVkZV9idWYgKCZuYW1lLCAmb3V0LCBpbmNsdWRlX21hY3JvLCBpbmNsdWRlX25leHRfaW5kZXggKCkpOwotCi0gIHNiX2tpbGwgKCZuYW1lKTsKLSAgc2Jfa2lsbCAoJm91dCk7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFNUUklORyBIQU5ETElORyAqLwotCi1zdGF0aWMgaW50Ci1nZXRzdHJpbmcgKGlkeCwgaW4sIGFjYykKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqYWNjOwotewotICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLQotICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAmJiAoaW4tPnB0cltpZHhdID09ICciJyAKLQkgICAgIHx8IGluLT5wdHJbaWR4XSA9PSAnPCcgCi0JICAgICB8fCAoaW4tPnB0cltpZHhdID09ICdcJycgJiYgYWx0ZXJuYXRlKSkpCi0gICAgewotICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCi0JewotCSAgaWYgKGFsdGVybmF0ZSB8fCBtcmkpCi0JICAgIHsKLQkgICAgICBpbnQgbmVzdCA9IDA7Ci0JICAgICAgaWR4Kys7Ci0JICAgICAgd2hpbGUgKChpbi0+cHRyW2lkeF0gIT0gJz4nIHx8IG5lc3QpCi0JCSAgICAgJiYgaWR4IDwgaW4tPmxlbikKLQkJewotCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gJyEnKQotCQkgICAgewotCQkgICAgICBpZHgrKyAgOwotCQkgICAgICBzYl9hZGRfY2hhciAoYWNjLCBpbi0+cHRyW2lkeCsrXSk7Ci0JCSAgICB9Ci0JCSAgZWxzZSB7Ci0JCSAgICBpZiAoaW4tPnB0cltpZHhdID09ICc+JykKLQkJICAgICAgbmVzdC0tOwotCQkgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCi0JCSAgICAgIG5lc3QrKzsKLQkJICAgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJICB9Ci0JCX0KLQkgICAgICBpZHgrKzsKLQkgICAgfQotCSAgZWxzZSB7Ci0JICAgIGludCBjb2RlOwotCSAgICBpZHgrKzsKLQkgICAgaWR4ID0gZXhwX2dldF9hYnMgKF8oIkNoYXJhY3RlciBjb2RlIGluIHN0cmluZyBtdXN0IGJlIGFic29sdXRlIGV4cHJlc3Npb24uXG4iKSwKLQkJCSAgICAgICBpZHgsIGluLCAmY29kZSk7Ci0JICAgIHNiX2FkZF9jaGFyIChhY2MsIGNvZGUpOwotCi0JICAgIGlmIChpbi0+cHRyW2lkeF0gIT0gJz4nKQotCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJNaXNzaW5nID4gZm9yIGNoYXJhY3RlciBjb2RlLlxuIikpKTsKLQkgICAgaWR4Kys7Ci0JICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltpZHhdID09ICciJyB8fCBpbi0+cHRyW2lkeF0gPT0gJ1wnJykKLQl7Ci0JICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCSAgaWR4Kys7Ci0JICB3aGlsZSAoaWR4IDwgaW4tPmxlbikKLQkgICAgewotCSAgICAgIGlmIChhbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdID09ICchJykKLQkJewotCQkgIGlkeCsrICA7Ci0JCSAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQl9Ci0JICAgICAgZWxzZSB7Ci0JCWlmIChpbi0+cHRyW2lkeF0gPT0gdGNoYXIpCi0JCSAgewotCQkgICAgaWR4Kys7Ci0JCSAgICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdICE9IHRjaGFyKQotCQkgICAgICBicmVhazsKLQkJICB9Ci0JCXNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4XSk7Ci0JCWlkeCsrOwotCSAgICAgIH0KLQkgICAgfQotCX0KLSAgICB9Ci0gIAotICByZXR1cm4gaWR4OwotfQotCi0vKiAuU0RBVEFbQ3xaXSA8c3RyaW5nPiAqLwotCi1zdGF0aWMKLXZvaWQKLWRvX3NkYXRhIChpZHgsIGluLCB0eXBlKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIGludCB0eXBlOwotewotICBpbnQgbmMgPSAwOwotICBpbnQgcGlkeCA9IC0xOwotICBzYiBhY2M7Ci0gIHNiX25ldyAoJmFjYyk7Ci0gIGZwcmludGYgKG91dGZpbGUsICIuYnl0ZVx0Iik7Ci0KLSAgd2hpbGUgKCFlb2wgKGlkeCwgaW4pKQotICAgIHsKLSAgICAgIGludCBpOwotICAgICAgc2JfcmVzZXQgKCZhY2MpOwotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICB3aGlsZSAoIWVvbCAoaWR4LCBpbikpCi0JewotCSAgcGlkeCA9IGlkeCA9IGdldF9hbnlfc3RyaW5nIChpZHgsIGluLCAmYWNjLCAwLCAxKTsKLQkgIGlmICh0eXBlID09ICdjJykKLQkgICAgewotCSAgICAgIGlmIChhY2MubGVuID4gMjU1KQotCQl7Ci0JCSAgRVJST1IgKChzdGRlcnIsIF8oInN0cmluZyBmb3IgU0RBVEFDIGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzICglZCkuXG4iKSwgYWNjLmxlbikpOwotCQl9Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLmxlbik7Ci0JICAgICAgbmMgPSAxOwotCSAgICB9Ci0KLQkgIGZvciAoaSA9IDA7IGkgPCBhY2MubGVuOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAobmMpCi0JCXsKLQkJICBmcHJpbnRmIChvdXRmaWxlLCAiLCIpOwotCQl9Ci0JICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIiVkIiwgYWNjLnB0cltpXSk7Ci0JICAgICAgbmMgPSAxOwotCSAgICB9Ci0KLQkgIGlmICh0eXBlID09ICd6JykKLQkgICAgewotCSAgICAgIGlmIChuYykKLQkJZnByaW50ZiAob3V0ZmlsZSwgIiwiKTsKLQkgICAgICBmcHJpbnRmIChvdXRmaWxlLCAiMCIpOwotCSAgICB9Ci0JICBpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLQkgIGlmIChpZHggPT0gcGlkeCkgYnJlYWs7Ci0JfQotICAgICAgaWYgKCFhbHRlcm5hdGUgJiYgaW4tPnB0cltpZHhdICE9ICcsJyAmJiBpZHggIT0gaW4tPmxlbikKLQl7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiXG4iKTsKLQkgIEVSUk9SICgoc3RkZXJyLCBfKCJpbGxlZ2FsIGNoYXJhY3RlciBpbiBTREFUQSBsaW5lICgweCV4KS5cbiIpLCBpbi0+cHRyW2lkeF0pKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGlkeCsrOwotICAgIH0KLSAgc2Jfa2lsbCAoJmFjYyk7Ci0gIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotfQotCi0vKiAuU0RBVEFCIDxjb3VudD4gPHN0cmluZz4gKi8KLQotc3RhdGljIHZvaWQKLWRvX3NkYXRhYiAoaWR4LCBpbikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBpbnQgcmVwZWF0OwotICBpbnQgaTsKLSAgc2IgYWNjOwotICBzYl9uZXcgKCZhY2MpOwotCi0gIGlkeCA9IGV4cF9nZXRfYWJzIChfKCJNdXN0IGhhdmUgYWJzb2x1dGUgU0RBVEFCIHJlcGVhdCBjb3VudC5cbiIpLCBpZHgsIGluLCAmcmVwZWF0KTsKLSAgaWYgKHJlcGVhdCA8PSAwKQotICAgIHsKLSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJNdXN0IGhhdmUgcG9zaXRpdmUgU0RBVEFCIHJlcGVhdCBjb3VudCAoJWQpLlxuIiksIHJlcGVhdCkpOwotICAgICAgcmVwZWF0ID0gMTsKLSAgICB9Ci0KLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgJmFjYyk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJlcGVhdDsgaSsrKQotICAgIHsKLSAgICAgIGlmIChpKQotCWZwcmludGYgKG91dGZpbGUsICJcdCIpOwotICAgICAgZnByaW50ZiAob3V0ZmlsZSwgIi5ieXRlXHQiKTsKLSAgICAgIHNiX3ByaW50IChvdXRmaWxlLCAmYWNjKTsKLSAgICAgIGZwcmludGYgKG91dGZpbGUsICJcbiIpOwotICAgIH0KLSAgc2Jfa2lsbCAoJmFjYyk7Ci0KLX0KLQotc3RhdGljIGludAotbmV3X2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIEZJTEUgKm5ld29uZSA9IGZvcGVuIChuYW1lLCAiciIpOwotICBpZiAoIW5ld29uZSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoaXNwID09IE1BWF9JTkNMVURFUykKLSAgICBGQVRBTCAoKHN0ZGVyciwgXygiVW5yZWFzb25hYmxlIGluY2x1ZGUgZGVwdGggKCVsZCkuXG4iKSwgKGxvbmcpIGlzcCkpOwotCi0gIHNwKys7Ci0gIHNwLT5oYW5kbGUgPSBuZXdvbmU7Ci0KLSAgc2JfbmV3ICgmc3AtPm5hbWUpOwotICBzYl9hZGRfc3RyaW5nICgmc3AtPm5hbWUsIG5hbWUpOwotCi0gIHNwLT5saW5lY291bnQgPSAxOwotICBzcC0+cHVzaGJhY2tfaW5kZXggPSAwOwotICBzcC0+dHlwZSA9IGluY2x1ZGVfZmlsZTsKLSAgc3AtPmluZGV4ID0gMDsKLSAgc2JfbmV3ICgmc3AtPnB1c2hiYWNrKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kb19pbmNsdWRlIChpZHgsIGluKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci17Ci0gIHNiIHQ7Ci0gIHNiIGNhdDsKLSAgaW5jbHVkZV9wYXRoICppbmNsdWRlczsKLQotICBzYl9uZXcgKCZ0KTsKLSAgc2JfbmV3ICgmY2F0KTsKLQotICBpZiAoISBtcmkpCi0gICAgaWR4ID0gZ2V0c3RyaW5nIChpZHgsIGluLCAmdCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZHggPSBzYl9za2lwX3doaXRlIChpZHgsIGluKTsKLSAgICAgIHdoaWxlIChpZHggPCBpbi0+bGVuICYmICEgSVNXSElURSAoaW4tPnB0cltpZHhdKSkKLQl7Ci0JICBzYl9hZGRfY2hhciAoJnQsIGluLT5wdHJbaWR4XSk7Ci0JICArK2lkeDsKLQl9Ci0gICAgfQotCi0gIGZvciAoaW5jbHVkZXMgPSBwYXRoc19oZWFkOyBpbmNsdWRlczsgaW5jbHVkZXMgPSBpbmNsdWRlcy0+bmV4dCkKLSAgICB7Ci0gICAgICBzYl9yZXNldCAoJmNhdCk7Ci0gICAgICBzYl9hZGRfc2IgKCZjYXQsICZpbmNsdWRlcy0+cGF0aCk7Ci0gICAgICBzYl9hZGRfY2hhciAoJmNhdCwgJy8nKTsKLSAgICAgIHNiX2FkZF9zYiAoJmNhdCwgJnQpOwotICAgICAgaWYgKG5ld19maWxlIChzYl9uYW1lICgmY2F0KSkpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKCFpbmNsdWRlcykKLSAgICB7Ci0gICAgICBpZiAoISBuZXdfZmlsZSAoc2JfbmFtZSAoJnQpKSkKLQlGQVRBTCAoKHN0ZGVyciwgXygiQ2FuJ3Qgb3BlbiBpbmNsdWRlIGZpbGUgYCVzJy5cbiIpLCBzYl9uYW1lICgmdCkpKTsKLSAgICB9Ci0gIHNiX2tpbGwgKCZjYXQpOwotICBzYl9raWxsICgmdCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pbmNsdWRlX3BvcCAoKQotewotICBpZiAoc3AgIT0gaW5jbHVkZV9zdGFjaykKLSAgICB7Ci0gICAgICBpZiAoc3AtPmhhbmRsZSkKLQlmY2xvc2UgKHNwLT5oYW5kbGUpOwotICAgICAgc3AtLTsKLSAgICB9Ci19Ci0KLS8qIEdldCB0aGUgbmV4dCBjaGFyYWN0ZXIgZnJvbSB0aGUgaW5jbHVkZSBzdGFjay4gIElmIHRoZXJlJ3MgYW55dGhpbmcKLSAgIGluIHRoZSBwdXNoYmFjayBidWZmZXIsIHRha2UgdGhhdCBmaXJzdC4gIElmIHdlJ3JlIGF0IGVvZiwgcG9wIGZyb20KLSAgIHRoZSBzdGFjayBhbmQgdHJ5IGFnYWluLiAgS2VlcCB0aGUgbGluZWNvdW50IHVwIHRvIGRhdGUuICovCi0KLXN0YXRpYyBpbnQKLWdldCAoKQotewotICBpbnQgcjsKLQotICBpZiAoc3AtPnB1c2hiYWNrLmxlbiAhPSBzcC0+cHVzaGJhY2tfaW5kZXgpCi0gICAgewotICAgICAgciA9IChjaGFyKSAoc3AtPnB1c2hiYWNrLnB0cltzcC0+cHVzaGJhY2tfaW5kZXgrK10pOwotICAgICAgLyogV2hlbiB0aGV5J3ZlIGFsbCBnb25lLCByZXNldCB0aGUgcG9pbnRlciAqLwotICAgICAgaWYgKHNwLT5wdXNoYmFja19pbmRleCA9PSBzcC0+cHVzaGJhY2subGVuKQotCXsKLQkgIHNwLT5wdXNoYmFjay5sZW4gPSAwOwotCSAgc3AtPnB1c2hiYWNrX2luZGV4ID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzcC0+aGFuZGxlKQotICAgIHsKLSAgICAgIHIgPSBnZXRjIChzcC0+aGFuZGxlKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByID0gRU9GOwotCi0gIGlmIChyID09IEVPRiAmJiBpc3ApCi0gICAgewotICAgICAgaW5jbHVkZV9wb3AgKCk7Ci0gICAgICByID0gZ2V0ICgpOwotICAgICAgd2hpbGUgKHIgPT0gRU9GICYmIGlzcCkKLQl7Ci0JICBpbmNsdWRlX3BvcCAoKTsKLQkgIHIgPSBnZXQgKCk7Ci0JfQotICAgICAgcmV0dXJuIHI7Ci0gICAgfQotICBpZiAociA9PSAnXG4nKQotICAgIHsKLSAgICAgIHNwLT5saW5lY291bnQrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyBpbnQKLWxpbmVjb3VudCAoKQotewotICByZXR1cm4gc3AtPmxpbmVjb3VudDsKLX0KLQotc3RhdGljIGludAotaW5jbHVkZV9uZXh0X2luZGV4ICgpCi17Ci0gIHN0YXRpYyBpbnQgaW5kZXg7Ci0gIGlmICghdW5yZWFzb25hYmxlCi0gICAgICAmJiBpbmRleCA+IE1BWF9SRUFTT05BQkxFKQotICAgIEZBVEFMICgoc3RkZXJyLCBfKCJVbnJlYXNvbmFibGUgZXhwYW5zaW9uICgtdSB0dXJucyBvZmYgY2hlY2spLlxuIikpKTsKLSAgcmV0dXJuICsraW5kZXg7Ci19Ci0KLQotLyogSW5pdGlhbGl6ZSB0aGUgY2hhcnR5cGUgdmVjdG9yLiAqLwotCi1zdGF0aWMgdm9pZAotY2hhcnR5cGVfaW5pdCAoKQotewotICBpbnQgeDsKLSAgZm9yICh4ID0gMDsgeCA8IDI1NjsgeCsrKQotICAgIHsKLSAgICAgIGlmIChpc2FscGhhICh4KSB8fCB4ID09ICdfJyB8fCB4ID09ICckJykKLQljaGFydHlwZVt4XSB8PSBGSVJTVEJJVDsKLQotICAgICAgaWYgKG1yaSAmJiB4ID09ICcuJykKLQljaGFydHlwZVt4XSB8PSBGSVJTVEJJVDsKLQotICAgICAgaWYgKGlzZGlnaXQgKHgpIHx8IGlzYWxwaGEgKHgpIHx8IHggPT0gJ18nIHx8IHggPT0gJyQnKQotCWNoYXJ0eXBlW3hdIHw9IE5FWFRCSVQ7Ci0KLSAgICAgIGlmICh4ID09ICcgJyB8fCB4ID09ICdcdCcgfHwgeCA9PSAnLCcgfHwgeCA9PSAnIicgfHwgeCA9PSAnOycKLQkgIHx8IHggPT0gJyInIHx8IHggPT0gJzwnIHx8IHggPT0gJz4nIHx8IHggPT0gJyknIHx8IHggPT0gJygnKQotCWNoYXJ0eXBlW3hdIHw9IFNFUEJJVDsKLQotICAgICAgaWYgKHggPT0gJ2InIHx8IHggPT0gJ0InCi0JICB8fCB4ID09ICdxJyB8fCB4ID09ICdRJwotCSAgfHwgeCA9PSAnaCcgfHwgeCA9PSAnSCcKLQkgIHx8IHggPT0gJ2QnIHx8IHggPT0gJ0QnKQotCWNoYXJ0eXBlIFt4XSB8PSBCQVNFQklUOwotCSAgCi0gICAgICBpZiAoeCA9PSAnICcgfHwgeCA9PSAnXHQnKQotCWNoYXJ0eXBlW3hdIHw9IFdISVRFQklUOwotCi0gICAgICBpZiAoeCA9PSBjb21tZW50X2NoYXIpCi0JY2hhcnR5cGVbeF0gfD0gQ09NTUVOVEJJVDsKLSAgICB9Ci19Ci0KLQotCi0vKiBXaGF0IHRvIGRvIHdpdGggYWxsIHRoZSBrZXl3b3JkcyAqLwotI2RlZmluZSBQUk9DRVNTIAkweDEwMDAgIC8qIFJ1biBzdWJzdGl0dXRpb24gb3ZlciB0aGUgbGluZSAqLwotI2RlZmluZSBMQUIJCTB4MjAwMCAgLyogU3BpdCBvdXQgdGhlIGxhYmVsICovCi0KLSNkZWZpbmUgS19FUVUgCQkoUFJPQ0VTU3wxKQotI2RlZmluZSBLX0FTU0lHTiAJKFBST0NFU1N8MikKLSNkZWZpbmUgS19SRUcgCQkoUFJPQ0VTU3wzKQotI2RlZmluZSBLX09SRyAJCShQUk9DRVNTfDQpCi0jZGVmaW5lIEtfUkFESVggCShQUk9DRVNTfDUpCi0jZGVmaW5lIEtfREFUQSAJCShMQUJ8UFJPQ0VTU3w2KQotI2RlZmluZSBLX0RBVEFCIAkoTEFCfFBST0NFU1N8NykKLSNkZWZpbmUgS19TREFUQSAJKExBQnxQUk9DRVNTfDgpCi0jZGVmaW5lIEtfU0RBVEFCIAkoTEFCfFBST0NFU1N8OSkKLSNkZWZpbmUgS19TREFUQUMgCShMQUJ8UFJPQ0VTU3wxMCkKLSNkZWZpbmUgS19TREFUQVoJKExBQnxQUk9DRVNTfDExKQotI2RlZmluZSBLX1JFUyAJCShMQUJ8UFJPQ0VTU3wxMikKLSNkZWZpbmUgS19TUkVTIAkJKExBQnxQUk9DRVNTfDEzKQotI2RlZmluZSBLX1NSRVNDIAkoTEFCfFBST0NFU1N8MTQpCi0jZGVmaW5lIEtfU1JFU1ogCShMQUJ8UFJPQ0VTU3wxNSkKLSNkZWZpbmUgS19FWFBPUlQgCShMQUJ8UFJPQ0VTU3wxNikKLSNkZWZpbmUgS19HTE9CQUwgCShMQUJ8UFJPQ0VTU3wxNykKLSNkZWZpbmUgS19QUklOVCAJKExBQnxQUk9DRVNTfDE5KQotI2RlZmluZSBLX0ZPUk0gCQkoTEFCfFBST0NFU1N8MjApCi0jZGVmaW5lIEtfSEVBRElORwkoTEFCfFBST0NFU1N8MjEpCi0jZGVmaW5lIEtfUEFHRQkJKExBQnxQUk9DRVNTfDIyKQotI2RlZmluZSBLX0lNUE9SVAkoTEFCfFBST0NFU1N8MjMpCi0jZGVmaW5lIEtfUFJPR1JBTQkoTEFCfFBST0NFU1N8MjQpCi0jZGVmaW5lIEtfRU5ECQkoUFJPQ0VTU3wyNSkKLSNkZWZpbmUgS19JTkNMVURFCShQUk9DRVNTfDI2KQotI2RlZmluZSBLX0lHTk9SRUQJKFBST0NFU1N8MjcpCi0jZGVmaW5lIEtfQVNTSUdOQQkoUFJPQ0VTU3wyOCkKLSNkZWZpbmUgS19BU1NJR05DCSgyOSkKLSNkZWZpbmUgS19BSUYJCShQUk9DRVNTfDMwKQotI2RlZmluZSBLX0FFTFNFCQkoUFJPQ0VTU3wzMSkKLSNkZWZpbmUgS19BRU5ESQkJKFBST0NFU1N8MzIpCi0jZGVmaW5lIEtfQVJFUEVBVAkoUFJPQ0VTU3wzMykKLSNkZWZpbmUgS19BRU5EUgkJKFBST0NFU1N8MzQpCi0jZGVmaW5lIEtfQVdISUxFCSgzNSkKLSNkZWZpbmUgS19BRU5EVwkJKFBST0NFU1N8MzYpCi0jZGVmaW5lIEtfRVhJVE0JCSgzNykKLSNkZWZpbmUgS19NQUNSTwkJKFBST0NFU1N8MzgpCi0jZGVmaW5lIEtfRU5ETQkJKDM5KQotI2RlZmluZSBLX0FMSUdOCQkoUFJPQ0VTU3xMQUJ8NDApCi0jZGVmaW5lIEtfQUxURVJOQVRFICAgICAoNDEpCi0jZGVmaW5lIEtfREIJCShMQUJ8UFJPQ0VTU3w0MikKLSNkZWZpbmUgS19EVwkJKExBQnxQUk9DRVNTfDQzKQotI2RlZmluZSBLX0RMCQkoTEFCfFBST0NFU1N8NDQpCi0jZGVmaW5lIEtfTE9DQUwJCSg0NSkKLSNkZWZpbmUgS19JRkVRCQkoUFJPQ0VTU3w0NikKLSNkZWZpbmUgS19JRk5FCQkoUFJPQ0VTU3w0NykKLSNkZWZpbmUgS19JRkxUCQkoUFJPQ0VTU3w0OCkKLSNkZWZpbmUgS19JRkxFCQkoUFJPQ0VTU3w0OSkKLSNkZWZpbmUgS19JRkdFCQkoUFJPQ0VTU3w1MCkKLSNkZWZpbmUgS19JRkdUCQkoUFJPQ0VTU3w1MSkKLSNkZWZpbmUgS19JRkMJCShQUk9DRVNTfDUyKQotI2RlZmluZSBLX0lGTkMJCShQUk9DRVNTfDUzKQotI2RlZmluZSBLX0lSUAkJKFBST0NFU1N8NTQpCi0jZGVmaW5lIEtfSVJQQwkJKFBST0NFU1N8NTUpCi0KLQotc3RydWN0IGtleXdvcmQKLXsKLSAgY2hhciAqbmFtZTsKLSAgaW50IGNvZGU7Ci0gIGludCBleHRyYTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga2V5d29yZCBraW5mb1tdID0KLXsKLSAgeyAiRVFVIiwgS19FUVUsIDAgfSwKLSAgeyAiQUxURVJOQVRFIiwgS19BTFRFUk5BVEUsIDAgfSwKLSAgeyAiQVNTSUdOIiwgS19BU1NJR04sIDAgfSwKLSAgeyAiUkVHIiwgS19SRUcsIDAgfSwKLSAgeyAiT1JHIiwgS19PUkcsIDAgfSwKLSAgeyAiUkFESVgiLCBLX1JBRElYLCAwIH0sCi0gIHsgIkRBVEEiLCBLX0RBVEEsIDAgfSwKLSAgeyAiREIiLCBLX0RCLCAwIH0sCi0gIHsgIkRXIiwgS19EVywgMCB9LAotICB7ICJETCIsIEtfREwsIDAgfSwKLSAgeyAiREFUQUIiLCBLX0RBVEFCLCAwIH0sCi0gIHsgIlNEQVRBIiwgS19TREFUQSwgMCB9LAotICB7ICJTREFUQUIiLCBLX1NEQVRBQiwgMCB9LAotICB7ICJTREFUQVoiLCBLX1NEQVRBWiwgMCB9LAotICB7ICJTREFUQUMiLCBLX1NEQVRBQywgMCB9LAotICB7ICJSRVMiLCBLX1JFUywgMCB9LAotICB7ICJTUkVTIiwgS19TUkVTLCAwIH0sCi0gIHsgIlNSRVNDIiwgS19TUkVTQywgMCB9LAotICB7ICJTUkVTWiIsIEtfU1JFU1osIDAgfSwKLSAgeyAiRVhQT1JUIiwgS19FWFBPUlQsIDAgfSwKLSAgeyAiR0xPQkFMIiwgS19HTE9CQUwsIDAgfSwKLSAgeyAiUFJJTlQiLCBLX1BSSU5ULCAwIH0sCi0gIHsgIkZPUk0iLCBLX0ZPUk0sIDAgfSwKLSAgeyAiSEVBRElORyIsIEtfSEVBRElORywgMCB9LAotICB7ICJQQUdFIiwgS19QQUdFLCAwIH0sCi0gIHsgIlBST0dSQU0iLCBLX0lHTk9SRUQsIDAgfSwKLSAgeyAiRU5EIiwgS19FTkQsIDAgfSwKLSAgeyAiSU5DTFVERSIsIEtfSU5DTFVERSwgMCB9LAotICB7ICJBU1NJR05BIiwgS19BU1NJR05BLCAwIH0sCi0gIHsgIkFTU0lHTkMiLCBLX0FTU0lHTkMsIDAgfSwKLSAgeyAiQUlGIiwgS19BSUYsIDAgfSwKLSAgeyAiQUVMU0UiLCBLX0FFTFNFLCAwIH0sCi0gIHsgIkFFTkRJIiwgS19BRU5ESSwgMCB9LAotICB7ICJBUkVQRUFUIiwgS19BUkVQRUFULCAwIH0sCi0gIHsgIkFFTkRSIiwgS19BRU5EUiwgMCB9LAotICB7ICJFWElUTSIsIEtfRVhJVE0sIDAgfSwKLSAgeyAiTUFDUk8iLCBLX01BQ1JPLCAwIH0sCi0gIHsgIkVORE0iLCBLX0VORE0sIDAgfSwKLSAgeyAiQVdISUxFIiwgS19BV0hJTEUsIDAgfSwKLSAgeyAiQUxJR04iLCBLX0FMSUdOLCAwIH0sCi0gIHsgIkFFTkRXIiwgS19BRU5EVywgMCB9LAotICB7ICJBTFRFUk5BVEUiLCBLX0FMVEVSTkFURSwgMCB9LAotICB7ICJMT0NBTCIsIEtfTE9DQUwsIDAgfSwKLSAgeyBOVUxMLCAwLCAwIH0KLX07Ci0KLS8qIEFsdGhvdWdoIHRoZSBjb25kaXRpb25hbCBvcGVyYXRvcnMgYXJlIGhhbmRsZWQgYnkgZ2FzLCB3ZSBuZWVkIHRvCi0gICBoYW5kbGUgdGhlbSBoZXJlIGFzIHdlbGwsIGluIGNhc2UgdGhleSBhcmUgdXNlZCBpbiBhIHJlY3Vyc2l2ZQotICAgbWFjcm8gdG8gZW5kIHRoZSByZWN1cnNpb24uICAqLwotCi1zdGF0aWMgc3RydWN0IGtleXdvcmQgbXJpa2luZm9bXSA9Ci17Ci0gIHsgIklGRVEiLCBLX0lGRVEsIDAgfSwKLSAgeyAiSUZORSIsIEtfSUZORSwgMCB9LAotICB7ICJJRkxUIiwgS19JRkxULCAwIH0sCi0gIHsgIklGTEUiLCBLX0lGTEUsIDAgfSwKLSAgeyAiSUZHRSIsIEtfSUZHRSwgMCB9LAotICB7ICJJRkdUIiwgS19JRkdULCAwIH0sCi0gIHsgIklGQyIsIEtfSUZDLCAwIH0sCi0gIHsgIklGTkMiLCBLX0lGTkMsIDAgfSwKLSAgeyAiRUxTRUMiLCBLX0FFTFNFLCAwIH0sCi0gIHsgIkVOREMiLCBLX0FFTkRJLCAwIH0sCi0gIHsgIk1FWElUIiwgS19FWElUTSwgMCB9LAotICB7ICJSRVBUIiwgS19BUkVQRUFULCAwIH0sCi0gIHsgIklSUCIsIEtfSVJQLCAwIH0sCi0gIHsgIklSUEMiLCBLX0lSUEMsIDAgfSwKLSAgeyAiRU5EUiIsIEtfQUVORFIsIDAgfSwKLSAgeyBOVUxMLCAwLCAwIH0KLX07Ci0KLS8qIExvb2sgZm9yIGEgcHNldWRvIG9wIG9uIHRoZSBsaW5lLiBJZiBvbmUncyB0aGVyZSB0aGVuIGNhbGwKLSAgIGl0cyBoYW5kbGVyLiAqLwotCi1zdGF0aWMgaW50Ci1wcm9jZXNzX3BzZXVkb19vcCAoaWR4LCBsaW5lLCBhY2MpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpsaW5lOwotICAgICBzYiAqYWNjOwotewotICBpbnQgb2lkeCA9IGlkeDsKLQotICBpZiAobGluZS0+cHRyW2lkeF0gPT0gJy4nIHx8IGFsdGVybmF0ZSB8fCBtcmkpCi0gICAgewotICAgICAgLyogU2NhbiBmb3J3YXJkIGFuZCBmaW5kIHBzZXVkbyBuYW1lICovCi0gICAgICBjaGFyICppbjsKLSAgICAgIGhhc2hfZW50cnkgKnB0cjsKLQotICAgICAgY2hhciAqczsKLSAgICAgIGNoYXIgKmU7Ci0gICAgICBpZiAobGluZS0+cHRyW2lkeF0gPT0gJy4nKQotCWlkeCsrOwotICAgICAgaW4gPSBsaW5lLT5wdHIgKyBpZHg7Ci0gICAgICBzID0gaW47Ci0gICAgICBlID0gczsKLSAgICAgIHNiX3Jlc2V0IChhY2MpOwotCi0gICAgICB3aGlsZSAoaWR4IDwgbGluZS0+bGVuICYmICplICYmIElTRklSU1RDSEFSICgqZSkpCi0JewotCSAgc2JfYWRkX2NoYXIgKGFjYywgKmUpOwotCSAgZSsrOwotCSAgaWR4Kys7Ci0JfQotCi0gICAgICBwdHIgPSBoYXNoX2xvb2t1cCAoJmtleXdvcmRfaGFzaF90YWJsZSwgYWNjKTsKLQotICAgICAgaWYgKCFwdHIpCi0JewotI2lmIDAKLQkgIC8qIFRoaXMgb25lIGNhdXNlcyBsb3RzIG9mIHBhaW4gd2hlbiB0cnlpbmcgdG8gcHJlcHJvY2VzcwotCSAgICAgb3JkaW5hcnkgY29kZSAqLwotCSAgV0FSTklORyAoKHN0ZGVyciwgXygiVW5yZWNvZ25pc2VkIHBzZXVkbyBvcCBgJXMnLlxuIiksIHNiX25hbWUgKGFjYykpKTsKLSNlbmRpZgotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgaWYgKHB0ci0+dmFsdWUuaSAmIExBQikKLQl7CQkJLyogb3V0cHV0IHRoZSBsYWJlbCAqLwotCSAgaWYgKGxhYmVsLmxlbikKLQkgICAgewotCSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlczpcdCIsIHNiX25hbWUgKCZsYWJlbCkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKG91dGZpbGUsICJcdCIpOwotCX0KLQotICAgICAgaWYgKG1yaSAmJiBwdHItPnZhbHVlLmkgPT0gS19FTkQpCi0JewotCSAgc2IgdDsKLQotCSAgc2JfbmV3ICgmdCk7Ci0JICBzYl9hZGRfYnVmZmVyICgmdCwgbGluZS0+cHRyICsgb2lkeCwgaWR4IC0gb2lkeCk7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiXHQlcyIsIHNiX25hbWUgKCZ0KSk7Ci0JICBzYl9raWxsICgmdCk7Ci0JfQotCi0gICAgICBpZiAocHRyLT52YWx1ZS5pICYgUFJPQ0VTUykKLQl7Ci0JICAvKiBQb2xpc2ggdGhlIHJlc3Qgb2YgdGhlIGxpbmUgYmVmb3JlIGhhbmRsaW5nIHRoZSBwc2V1ZG8gb3AgKi8KLSNpZiAwCi0JICBzdHJpcF9jb21tZW50cyhsaW5lKTsKLSNlbmRpZgotCSAgc2JfcmVzZXQgKGFjYyk7Ci0JICBwcm9jZXNzX2Fzc2lnbnMgKGlkeCwgbGluZSwgYWNjKTsKLQkgIHNiX3Jlc2V0KGxpbmUpOwotCSAgY2hhbmdlX2Jhc2UgKDAsIGFjYywgbGluZSk7Ci0JICBpZHggPSAwOwotCX0KLSAgICAgIGlmICghY29uZGFzc19vbiAoKSkKLQl7Ci0JICBzd2l0Y2ggKHB0ci0+dmFsdWUuaSkKLQkgICAgewotCSAgICBjYXNlIEtfQUlGOgotCSAgICAgIGRvX2FpZiAoaWR4LCBsaW5lKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBLX0FFTFNFOgotCSAgICAgIGRvX2FlbHNlICgpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEtfQUVOREk6Ci0JICAgICAgZG9fYWVuZGkgKCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIHJldHVybiAxOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKHB0ci0+dmFsdWUuaSkKLQkgICAgewotCSAgICBjYXNlIEtfQUxURVJOQVRFOgotCSAgICAgIGFsdGVybmF0ZSA9IDE7Ci0JICAgICAgbWFjcm9faW5pdCAoMSwgbXJpLCAwLCBleHBfZ2V0X2Ficyk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRUxTRToKLQkgICAgICBkb19hZWxzZSAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FFTkRJOgotCSAgICAgIGRvX2FlbmRpICgpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfT1JHOgotCSAgICAgIEVSUk9SICgoc3RkZXJyLCBfKCJPUkcgY29tbWFuZCBub3QgYWxsb3dlZC5cbiIpKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgS19SQURJWDoKLQkgICAgICBkb19yYWRpeCAobGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19EQjoKLQkgICAgICBkb19kYXRhIChpZHgsIGxpbmUsIDEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfRFc6Ci0JICAgICAgZG9fZGF0YSAoaWR4LCBsaW5lLCAyKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0RMOgotCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgNCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19EQVRBOgotCSAgICAgIGRvX2RhdGEgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19EQVRBQjoKLQkgICAgICBkb19kYXRhYiAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBOgotCSAgICAgIGRvX3NkYXRhIChpZHgsIGxpbmUsIDApOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfU0RBVEFCOgotCSAgICAgIGRvX3NkYXRhYiAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NEQVRBQzoKLQkgICAgICBkb19zZGF0YSAoaWR4LCBsaW5lLCAnYycpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfU0RBVEFaOgotCSAgICAgIGRvX3NkYXRhIChpZHgsIGxpbmUsICd6Jyk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BU1NJR046Ci0JICAgICAgZG9fYXNzaWduICgwLCAwLCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FJRjoKLQkgICAgICBkb19haWYgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BUkVQRUFUOgotCSAgICAgIGRvX2FyZXBlYXQgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRU5EVzoKLQkgICAgICBkb19hZW5kdyAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0FXSElMRToKLQkgICAgICBkb19hd2hpbGUgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BRU5EUjoKLQkgICAgICBkb19hZW5kciAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VRVToKLQkgICAgICBkb19hc3NpZ24gKDEsIGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19BTElHTjoKLQkgICAgICBkb19hbGlnbiAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1JFUzoKLQkgICAgICBkb19yZXMgKGlkeCwgbGluZSwgMCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19TUkVTOgotCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAncycpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSU5DTFVERToKLQkgICAgICBkb19pbmNsdWRlIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfTE9DQUw6Ci0JICAgICAgZG9fbG9jYWwgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19NQUNSTzoKLQkgICAgICBkb19tYWNybyAoaWR4LCBsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VORE06Ci0JICAgICAgZG9fZW5kbSAoKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NSRVNDOgotCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAnYycpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfUFJJTlQ6Ci0JICAgICAgZG9fcHJpbnQgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19GT1JNOgotCSAgICAgIGRvX2Zvcm0gKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19IRUFESU5HOgotCSAgICAgIGRvX2hlYWRpbmcgKGlkeCwgbGluZSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19QQUdFOgotCSAgICAgIGRvX3BhZ2UgKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19HTE9CQUw6Ci0JICAgIGNhc2UgS19FWFBPUlQ6Ci0JICAgICAgZG9fZXhwb3J0IChsaW5lKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lNUE9SVDoKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX1NSRVNaOgotCSAgICAgIGRvX3JlcyAoaWR4LCBsaW5lLCAneicpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUdOT1JFRDoKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0VORDoKLQkgICAgICBkb19lbmQgKGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVNTSUdOQToKLQkgICAgICBkb19hc3NpZ25hIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfQVNTSUdOQzoKLQkgICAgICBkb19hc3NpZ25jIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfRVhJVE06Ci0JICAgICAgZG9fZXhpdG0gKCk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19SRUc6Ci0JICAgICAgZG9fcmVnIChpZHgsIGxpbmUpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZFUToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBFUSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRk5FOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIE5FKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGTFQ6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgTFQpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZMRToKLQkgICAgICBkb19pZiAoaWR4LCBsaW5lLCBMRSk7Ci0JICAgICAgcmV0dXJuIDE7Ci0JICAgIGNhc2UgS19JRkdFOgotCSAgICAgIGRvX2lmIChpZHgsIGxpbmUsIEdFKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGR1Q6Ci0JICAgICAgZG9faWYgKGlkeCwgbGluZSwgR1QpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSUZDOgotCSAgICAgIGRvX2lmYyAoaWR4LCBsaW5lLCAwKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lGTkM6Ci0JICAgICAgZG9faWZjIChpZHgsIGxpbmUsIDEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICBjYXNlIEtfSVJQOgotCSAgICAgIGRvX2lycCAoaWR4LCBsaW5lLCAwKTsKLQkgICAgICByZXR1cm4gMTsKLQkgICAgY2FzZSBLX0lSUEM6Ci0JICAgICAgZG9faXJwIChpZHgsIGxpbmUsIDEpOwotCSAgICAgIHJldHVybiAxOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotCi0vKiBBZGQgYSBrZXl3b3JkIHRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9rZXl3b3JkIChuYW1lLCBjb2RlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgY29kZTsKLXsKLSAgc2IgbGFiZWw7Ci0gIGludCBqOwotCi0gIHNiX25ldyAoJmxhYmVsKTsKLSAgc2JfYWRkX3N0cmluZyAoJmxhYmVsLCBuYW1lKTsKLQotICBoYXNoX2FkZF90b19pbnRfdGFibGUgKCZrZXl3b3JkX2hhc2hfdGFibGUsICZsYWJlbCwgY29kZSk7Ci0KLSAgc2JfcmVzZXQgKCZsYWJlbCk7Ci0gIGZvciAoaiA9IDA7IG5hbWVbal07IGorKykKLSAgICBzYl9hZGRfY2hhciAoJmxhYmVsLCBuYW1lW2pdIC0gJ0EnICsgJ2EnKTsKLSAgaGFzaF9hZGRfdG9faW50X3RhYmxlICgma2V5d29yZF9oYXNoX3RhYmxlLCAmbGFiZWwsIGNvZGUpOwotCi0gIHNiX2tpbGwgKCZsYWJlbCk7Ci19ICAKLQotLyogQnVpbGQgdGhlIGtleXdvcmQgaGFzaCB0YWJsZSAtIHB1dCBlYWNoIGtleXdvcmQgaW4gdGhlIHRhYmxlIHR3aWNlLAotICAgb25jZSB1cHBlciBhbmQgb25jZSBsb3dlciBjYXNlLiovCi0KLXN0YXRpYyB2b2lkCi1wcm9jZXNzX2luaXQgKCkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsga2luZm9baV0ubmFtZTsgaSsrKQotICAgIGFkZF9rZXl3b3JkIChraW5mb1tpXS5uYW1lLCBraW5mb1tpXS5jb2RlKTsKLQotICBpZiAobXJpKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IG1yaWtpbmZvW2ldLm5hbWU7IGkrKykKLQlhZGRfa2V5d29yZCAobXJpa2luZm9baV0ubmFtZSwgbXJpa2luZm9baV0uY29kZSk7Ci0gICAgfQotfQotCi0KLXN0YXRpYyB2b2lkCi1kb19kZWZpbmUgKHN0cmluZykKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzYiBsYWJlbDsKLSAgaW50IHJlcyA9IDE7Ci0gIGhhc2hfZW50cnkgKnB0cjsKLSAgc2JfbmV3ICgmbGFiZWwpOwotCi0KLSAgd2hpbGUgKCpzdHJpbmcpCi0gICAgewotICAgICAgaWYgKCpzdHJpbmcgPT0gJz0nKSAKLQl7Ci0JICBzYiB2YWx1ZTsKLQkgIHNiX25ldyAoJnZhbHVlKTsKLQkgIHN0cmluZysrOwotCSAgd2hpbGUgKCpzdHJpbmcpCi0JICAgIHsKLQkgICAgICBzYl9hZGRfY2hhciAoJnZhbHVlLCAqc3RyaW5nKTsKLQkgICAgICBzdHJpbmcrKzsKLQkgICAgfQotCSAgZXhwX2dldF9hYnMgKF8oIkludmFsaWQgZXhwcmVzc2lvbiBvbiBjb21tYW5kIGxpbmUuXG4iKSwgMCwgJnZhbHVlLCAmcmVzKTsKLQkgIHNiX2tpbGwgKCZ2YWx1ZSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBzYl9hZGRfY2hhciAoJmxhYmVsLCAqc3RyaW5nKTsKLQotICAgICAgc3RyaW5nICsrOwotICAgIH0KLQotICBwdHIgPSBoYXNoX2NyZWF0ZSAoJnZhcnMsICZsYWJlbCk7Ci0gIGZyZWVfb2xkX2VudHJ5IChwdHIpOwotICBwdHItPnR5cGUgPSBoYXNoX2ludGVnZXI7Ci0gIHB0ci0+dmFsdWUuaSA9IHJlczsKLSAgc2Jfa2lsbCAoJmxhYmVsKTsKLX0KLWNoYXIgKnByb2dyYW1fbmFtZTsKLQotLyogVGhlIGxpc3Qgb2YgbG9uZyBvcHRpb25zLiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyAiYWx0ZXJuYXRlIiwgbm9fYXJndW1lbnQsIDAsICdhJyB9LAotICB7ICJpbmNsdWRlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdJJyB9LAotICB7ICJjb21tZW50Y2hhciIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYycgfSwKLSAgeyAiY29weXNvdXJjZSIsIG5vX2FyZ3VtZW50LCAwLCAncycgfSwKLSAgeyAiZGVidWciLCBub19hcmd1bWVudCwgMCwgJ2QnIH0sCi0gIHsgImhlbHAiLCBub19hcmd1bWVudCwgMCwgJ2gnIH0sCi0gIHsgIm1yaSIsIG5vX2FyZ3VtZW50LCAwLCAnTScgfSwKLSAgeyAib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdvJyB9LAotICB7ICJwcmludCIsIG5vX2FyZ3VtZW50LCAwLCAncCcgfSwKLSAgeyAidW5yZWFzb25hYmxlIiwgbm9fYXJndW1lbnQsIDAsICd1JyB9LAotICB7ICJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIDAsICd2JyB9LAotICB7ICJkZWZpbmUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2QnIH0sCi0gIHsgTlVMTCwgbm9fYXJndW1lbnQsIDAsIDAgfQotfTsKLQotLyogU2hvdyBhIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQuICAqLwotc3RhdGljIHZvaWQKLXNob3dfdXNhZ2UgKGZpbGUsIHN0YXR1cykKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgaW50IHN0YXR1czsKLXsKLSAgZnByaW50ZiAoZmlsZSwgXygiXAotVXNhZ2U6ICVzIFxuXAotICBbLWFdICAgICAgWy0tYWx0ZXJuYXRlXSAgICAgICAgIGVudGVyIGFsdGVybmF0ZSBtYWNybyBtb2RlXG5cCi0gIFstYyBjaGFyXSBbLS1jb21tZW50Y2hhciBjaGFyXSAgY2hhbmdlIHRoZSBjb21tZW50IGNoYXJhY3RlciBmcm9tICFcblwKLSAgWy1kXSAgICAgIFstLWRlYnVnXSAgICAgICAgICAgICBwcmludCBzb21lIGRlYnVnZ2luZyBpbmZvXG5cCi0gIFstaF0gICAgICBbLS1oZWxwXSAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlXG5cCi0gIFstTV0gICAgICBbLS1tcmldICAgICAgICAgICAgICAgZW50ZXIgTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuXAotICBbLW8gb3V0XSAgWy0tb3V0cHV0IG91dF0gICAgICAgIHNldCB0aGUgb3V0cHV0IGZpbGVcblwKLSAgWy1wXSAgICAgIFstLXByaW50XSAgICAgICAgICAgICBwcmludCBsaW5lIG51bWJlcnNcbiIpLCBwcm9ncmFtX25hbWUpOwotICBmcHJpbnRmIChmaWxlLCBfKCJcCi0gIFstc10gICAgICBbLS1jb3B5c291cmNlXSAgICAgICAgY29weSBzb3VyY2UgdGhyb3VnaCBhcyBjb21tZW50cyBcblwKLSAgWy11XSAgICAgIFstLXVucmVhc29uYWJsZV0gICAgICBhbGxvdyB1bnJlYXNvbmFibGUgbmVzdGluZ1xuXAotICBbLXZdICAgICAgWy0tdmVyc2lvbl0gICAgICAgICAgIHByaW50IHRoZSBwcm9ncmFtIHZlcnNpb25cblwKLSAgWy1EbmFtZT12YWx1ZV0gICAgICAgICAgICAgICAgICBjcmVhdGUgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIGNhbGxlZCBuYW1lLCB3aXRoIHZhbHVlXG5cCi0gIFstSXBhdGhdICAgICAgICAgICAgICAgICAgICAgICAgYWRkIHRvIGluY2x1ZGUgcGF0aCBsaXN0XG5cCi0gIFtpbi1maWxlXVxuIikpOwotICBpZiAoc3RhdHVzID09IDApCi0gICAgcHJpbnRmIChfKCJcblJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0vKiBEaXNwbGF5IGEgaGVscCBtZXNzYWdlIGFuZCBleGl0LiAgKi8KLXN0YXRpYyB2b2lkCi1zaG93X2hlbHAgKCkKLXsKLSAgcHJpbnRmIChfKCIlczogR251IEFzc2VtYmxlciBNYWNybyBQcmVwcm9jZXNzb3JcbiIpLAotCSAgcHJvZ3JhbV9uYW1lKTsKLSAgc2hvd191c2FnZSAoc3Rkb3V0LCAwKTsKLX0KLQotaW50Ci1tYWluIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBvcHQ7Ci0gIGNoYXIgKm91dF9uYW1lID0gMDsKLSAgc3AgPSBpbmNsdWRlX3N0YWNrOwotCi0gIGlmc3RhY2tbMF0ub24gPSAxOwotICBpZmkgPSAwOwotCi0jaWYgZGVmaW5lZCAoSEFWRV9TRVRMT0NBTEUpICYmIGRlZmluZWQgKEhBVkVfTENfTUVTU0FHRVMpCi0gIHNldGxvY2FsZSAoTENfTUVTU0FHRVMsICIiKTsKLSNlbmRpZgotICBiaW5kdGV4dGRvbWFpbiAoUEFDS0FHRSwgTE9DQUxFRElSKTsKLSAgdGV4dGRvbWFpbiAoUEFDS0FHRSk7Ci0KLSAgcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKLSAgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIChwcm9ncmFtX25hbWUpOwotCi0gIGhhc2hfbmV3X3RhYmxlICgxMDEsICZrZXl3b3JkX2hhc2hfdGFibGUpOwotICBoYXNoX25ld190YWJsZSAoMTAxLCAmYXNzaWduX2hhc2hfdGFibGUpOwotICBoYXNoX25ld190YWJsZSAoMTAxLCAmdmFycyk7Ci0KLSAgc2JfbmV3ICgmbGFiZWwpOwotCi0gIHdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJJOnNkaGF2Yzp1cG86RDpNIiwgbG9uZ19vcHRpb25zLAotCQkJICAgICAoaW50ICopIE5VTEwpKQotCSAhPSBFT0YpCi0gICAgewotICAgICAgc3dpdGNoIChvcHQpCi0JewotCWNhc2UgJ28nOgotCSAgb3V0X25hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIHVucmVhc29uYWJsZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdJJzoKLQkgIHsKLQkgICAgaW5jbHVkZV9wYXRoICpwID0gKGluY2x1ZGVfcGF0aCAqKSB4bWFsbG9jIChzaXplb2YgKGluY2x1ZGVfcGF0aCkpOwotCSAgICBwLT5uZXh0ID0gTlVMTDsKLQkgICAgc2JfbmV3ICgmcC0+cGF0aCk7Ci0JICAgIHNiX2FkZF9zdHJpbmcgKCZwLT5wYXRoLCBvcHRhcmcpOwotCSAgICBpZiAocGF0aHNfdGFpbCkKLQkgICAgICBwYXRoc190YWlsLT5uZXh0ID0gcDsKLQkgICAgZWxzZQotCSAgICAgIHBhdGhzX2hlYWQgPSBwOwotCSAgICBwYXRoc190YWlsID0gcDsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ3AnOgotCSAgcHJpbnRfbGluZV9udW1iZXIgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnYyc6Ci0JICBjb21tZW50X2NoYXIgPSBvcHRhcmdbMF07Ci0JICBicmVhazsKLQljYXNlICdhJzoKLQkgIGFsdGVybmF0ZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIGNvcHlzb3VyY2UgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnZCc6Ci0JICBzdGF0cyA9IDE7Ci0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGRvX2RlZmluZSAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgbXJpID0gMTsKLQkgIGNvbW1lbnRfY2hhciA9ICc7JzsKLQkgIGJyZWFrOwotCWNhc2UgJ2gnOgotCSAgc2hvd19oZWxwICgpOwotCSAgLypOT1RSRUFDSEVEKi8KLQljYXNlICd2JzoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBhc3NlbWJsZXIgcHJlLXByb2Nlc3NvciAlc1xuIiksIHByb2dyYW1fdmVyc2lvbik7Ci0JICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOwotCSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICBleGl0ICgwKTsKLQkgIC8qTk9UUkVBQ0hFRCovCi0JY2FzZSAwOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHNob3dfdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICAvKk5PVFJFQUNIRUQqLwotCX0KLSAgICB9Ci0KLSAgcHJvY2Vzc19pbml0ICgpOwotCi0gIG1hY3JvX2luaXQgKGFsdGVybmF0ZSwgbXJpLCAwLCBleHBfZ2V0X2Ficyk7Ci0KLSAgaWYgKG91dF9uYW1lKSB7Ci0gICAgb3V0ZmlsZSA9IGZvcGVuIChvdXRfbmFtZSwgInciKTsKLSAgICBpZiAoIW91dGZpbGUpCi0gICAgICB7Ci0JZnByaW50ZiAoc3RkZXJyLCBfKCIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZmlsZSBgJXMnLlxuIiksCi0JCSBwcm9ncmFtX25hbWUsIG91dF9uYW1lKTsKLQlleGl0ICgxKTsKLSAgICAgIH0KLSAgfQotICBlbHNlICB7Ci0gICAgb3V0ZmlsZSA9IHN0ZG91dDsKLSAgfQotCi0gIGNoYXJ0eXBlX2luaXQgKCk7Ci0gIGlmICghb3V0ZmlsZSkKLSAgICBvdXRmaWxlID0gc3Rkb3V0OwotCi0gIC8qIFByb2Nlc3MgYWxsIHRoZSBpbnB1dCBmaWxlcyAqLwotCi0gIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGlmIChuZXdfZmlsZSAoYXJndltvcHRpbmRdKSkKLQl7Ci0JICBwcm9jZXNzX2ZpbGUgKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IENhbid0IG9wZW4gaW5wdXQgZmlsZSBgJXMnLlxuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgYXJndltvcHRpbmRdKTsKLQkgIGV4aXQgKDEpOwotCX0KLSAgICAgIG9wdGluZCsrOwotICAgIH0KLQotICBxdWl0ICgpOwotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJlY2F1c2UgYW4gYWJvcnQgaW4gc29tZSBvZiB0aGUgb3RoZXIgZmlsZXMKLSAgIG1heSBiZSBjb21waWxlZCBpbnRvIGFzX2Fib3J0IGJlY2F1c2UgdGhleSBpbmNsdWRlIGFzLmguICAqLwotCi12b2lkCi1hc19hYm9ydCAoZmlsZSwgbGluZSwgZm4pCi0gICAgIGNvbnN0IGNoYXIgKmZpbGUsICpmbjsKLSAgICAgaW50IGxpbmU7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQiKSwgZmlsZSwgbGluZSk7Ci0gIGlmIChmbikKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgaW4gJXMiLCBmbik7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiXG5QbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICBleGl0ICgxKTsKLX0KZGlmZiAtLWdpdCBhL2dhcy9nZGJpbml0LmluIGIvZ2FzL2dkYmluaXQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDY3MjYuLjAwMDAwMDAKLS0tIGEvZ2FzL2dkYmluaXQuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1kaXIgQHNyY2RpckAKLWRpciAuCi0KLWJyZWFrIGFzX3dhcm4KLWJyZWFrIGFzX3dhcm5fd2hlcmUKLWJyZWFrIGFzX2JhZAotYnJlYWsgYXNfYmFkX3doZXJlCi1icmVhayBhc19mYXRhbAotYnJlYWsgYXNfcGVycm9yCi1icmVhayBhc19hc3NlcnQKLWJyZWFrIGFzX2Fib3J0Ci0KLWRlZmluZSBwZQotY2FsbCBwcmludF9leHByICgkKQotZW5kCi0KLWRvY3VtZW50IHBlCi1QcmludCAqJCBhcyBhbiBleHByZXNzaW9uUywgZXhwYW5kaW5nIHBhcmFtZXRlcnMuCi1lbmQKLQotZGVmaW5lIHBzCi1jYWxsIHByaW50X3N5bWJvbF92YWx1ZSAoJCkKLWVuZAotCi1kb2N1bWVudCBwcwotUHJpbnQgKiQgYXMgYSBzeW1ib2xTLCBpbmNsdWRpbmcgZXhwcmVzc2lvbiB2YWx1ZS4KLWVuZAotCi1kZWZpbmUgcGYKLWNhbGwgcHJpbnRfZml4dXAgKCQpCi1lbmQKLQotZG9jdW1lbnQgcGYKLVByaW50ICokIGFzIGEgZml4UywgaW5jbHVkaW5nIHN5bWJvbCB2YWx1ZS4KLWVuZAotCi0jIFB1dCB0aGlzIGxhc3QsIGluIGNhc2UgaXQgZmFpbHMuCi0KLWJyZWFrIGFib3J0CmRpZmYgLS1naXQgYS9nYXMvaGFzaC5jIGIvZ2FzL2hhc2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwNjYzMy4uMDAwMDAwMAotLS0gYS9nYXMvaGFzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAxICswLDAgQEAKLS8qIGhhc2guYyAtLSBnYXMgaGFzaCB0YWJsZSBjb2RlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgdmVyc2lvbiBvZiB0aGUgaGFzaCB0YWJsZSBjb2RlIGlzIGEgd2hvbGVzY2FsZSByZXBsYWNlbWVudCBvZgotICAgdGhlIG9sZCBoYXNoIHRhYmxlIGNvZGUsIHdoaWNoIHdhcyBmYWlybHkgYmFkLiAgVGhpcyBpcyBiYXNlZCBvbgotICAgdGhlIGhhc2ggdGFibGUgY29kZSBpbiBCRkQsIGJ1dCBvcHRpbWl6ZWQgc2xpZ2h0bHkgZm9yIHRoZQotICAgYXNzc2VtYmxlci4gIFRoZSBhc3NlbWJsZXIgZG9lcyBub3QgbmVlZCB0byBkZXJpdmUgc3RydWN0dXJlcyB0aGF0Ci0gICBhcmUgc3RvcmVkIGluIHRoZSBoYXNoIHRhYmxlLiAgSW5zdGVhZCwgaXQgYWx3YXlzIHN0b3JlcyBhIHBvaW50ZXIuCi0gICBUaGUgYXNzZW1ibGVyIHVzZXMgdGhlIGhhc2ggdGFibGUgbW9zdGx5IHRvIHN0b3JlIHN5bWJvbHMsIGFuZCB3ZQotICAgZG9uJ3QgbmVlZCB0byBjb25mdXNlIHRoZSBzeW1ib2wgc3RydWN0dXJlIHdpdGggYSBoYXNoIHRhYmxlCi0gICBzdHJ1Y3R1cmUuICAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLS8qIFRoZSBkZWZhdWx0IG51bWJlciBvZiBlbnRyaWVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGEgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgREVGQVVMVF9TSVpFICg0MDUxKQotCi0vKiBBbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUuICAqLwotCi1zdHJ1Y3QgaGFzaF9lbnRyeQotewotICAvKiBOZXh0IGVudHJ5IGZvciB0aGlzIGhhc2ggY29kZS4gICovCi0gIHN0cnVjdCBoYXNoX2VudHJ5ICpuZXh0OwotICAvKiBTdHJpbmcgYmVpbmcgaGFzaGVkLiAgKi8KLSAgY29uc3QgY2hhciAqc3RyaW5nOwotICAvKiBIYXNoIGNvZGUuICBUaGlzIGlzIHRoZSBmdWxsIGhhc2ggY29kZSwgbm90IHRoZSBpbmRleCBpbnRvIHRoZQotICAgICB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgLyogUG9pbnRlciBiZWluZyBzdG9yZWQgaW4gdGhlIGhhc2ggdGFibGUuICAqLwotICBQVFIgZGF0YTsKLX07Ci0KLS8qIEEgaGFzaCB0YWJsZS4gICovCi0KLXN0cnVjdCBoYXNoX2NvbnRyb2wKLXsKLSAgLyogVGhlIGhhc2ggYXJyYXkuICAqLwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqKnRhYmxlOwotICAvKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemU7Ci0gIC8qIEFuIG9ic3RhY2sgZm9yIHRoaXMgaGFzaCB0YWJsZS4gICovCi0gIHN0cnVjdCBvYnN0YWNrIG1lbW9yeTsKLQotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAvKiBTdGF0aXN0aWNzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsb29rdXBzOwotICB1bnNpZ25lZCBsb25nIGhhc2hfY29tcGFyZXM7Ci0gIHVuc2lnbmVkIGxvbmcgc3RyaW5nX2NvbXBhcmVzOwotICB1bnNpZ25lZCBsb25nIGluc2VydGlvbnM7Ci0gIHVuc2lnbmVkIGxvbmcgcmVwbGFjZW1lbnRzOwotICB1bnNpZ25lZCBsb25nIGRlbGV0aW9uczsKLSNlbmRpZiAvKiBIQVNIX1NUQVRJU1RJQ1MgKi8KLX07Ci0KLS8qIENyZWF0ZSBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybiBhIGNvbnRyb2wgYmxvY2suICAqLwotCi1zdHJ1Y3QgaGFzaF9jb250cm9sICoKLWhhc2hfbmV3ICgpCi17Ci0gIHVuc2lnbmVkIGludCBzaXplOwotICBzdHJ1Y3QgaGFzaF9jb250cm9sICpyZXQ7Ci0gIHVuc2lnbmVkIGludCBhbGxvYzsKLQotICBzaXplID0gREVGQVVMVF9TSVpFOwotCi0gIHJldCA9IChzdHJ1Y3QgaGFzaF9jb250cm9sICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgb2JzdGFja19iZWdpbiAoJnJldC0+bWVtb3J5LCBjaHVua3NpemUpOwotICBhbGxvYyA9IHNpemUgKiBzaXplb2YgKHN0cnVjdCBoYXNoX2VudHJ5ICopOwotICByZXQtPnRhYmxlID0gKHN0cnVjdCBoYXNoX2VudHJ5ICoqKSBvYnN0YWNrX2FsbG9jICgmcmV0LT5tZW1vcnksIGFsbG9jKTsKLSAgbWVtc2V0IChyZXQtPnRhYmxlLCAwLCBhbGxvYyk7Ci0gIHJldC0+c2l6ZSA9IHNpemU7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgcmV0LT5sb29rdXBzID0gMDsKLSAgcmV0LT5oYXNoX2NvbXBhcmVzID0gMDsKLSAgcmV0LT5zdHJpbmdfY29tcGFyZXMgPSAwOwotICByZXQtPmluc2VydGlvbnMgPSAwOwotICByZXQtPnJlcGxhY2VtZW50cyA9IDA7Ci0gIHJldC0+ZGVsZXRpb25zID0gMDsKLSNlbmRpZgotCi0gIHJldHVybiByZXQ7ICAKLX0KLQotLyogRGVsZXRlIGEgaGFzaCB0YWJsZSwgZnJlZWluZyBhbGwgYWxsb2NhdGVkIG1lbW9yeS4gICovCi0KLXZvaWQKLWhhc2hfZGllICh0YWJsZSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci17Ci0gIG9ic3RhY2tfZnJlZSAoJnRhYmxlLT5tZW1vcnksIDApOwotICBmcmVlICh0YWJsZSk7Ci19Ci0KLS8qIExvb2sgdXAgYSBzdHJpbmcgaW4gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUKLSAgIGhhc2hfZW50cnksIG9yIE5VTEwgaWYgdGhlIHN0cmluZyBpcyBub3QgaW4gdGhlIHRhYmxlLiAgSWYgUExJU1QgaXMKLSAgIG5vdCBOVUxMLCB0aGlzIHNldHMgKlBMSVNUIHRvIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgbGlzdCB3aGljaAotICAgd291bGQgaG9sZCB0aGlzIGhhc2ggZW50cnkuICBJZiBQSEFTSCBpcyBub3QgTlVMTCwgdGhpcyBzZXRzICpQSEFTSAotICAgdG8gdGhlIGhhc2ggY29kZSBmb3IgS0VZLgotCi0gICBFYWNoIHRpbWUgd2UgbG9vayB1cCBhIHN0cmluZywgd2UgbW92ZSBpdCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpc3QKLSAgIGZvciBpdHMgaGFzaCBjb2RlLCB0byB0YWtlIGFkdmFudGFnZSBvZiByZWZlcmVudGlhbCBsb2NhbGl0eS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9lbnRyeSAqaGFzaF9sb29rdXAgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqLAotCQkJCQkgICAgICAgc3RydWN0IGhhc2hfZW50cnkgKioqLAotCQkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9lbnRyeSAqCi1oYXNoX2xvb2t1cCAodGFibGUsIGtleSwgcGxpc3QsIHBoYXNoKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqKipwbGlzdDsKLSAgICAgdW5zaWduZWQgbG9uZyAqcGhhc2g7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgaGFzaDsKLSAgdW5zaWduZWQgaW50IGxlbjsKLSAgcmVnaXN0ZXIgY29uc3QgdW5zaWduZWQgY2hhciAqczsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnByZXY7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgKyt0YWJsZS0+bG9va3VwczsKLSNlbmRpZgotCi0gIGhhc2ggPSAwOwotICBsZW4gPSAwOwotICBzID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikga2V5OwotICB3aGlsZSAoKGMgPSAqcysrKSAhPSAnXDAnKQotICAgIHsKLSAgICAgIGhhc2ggKz0gYyArIChjIDw8IDE3KTsKLSAgICAgIGhhc2ggXj0gaGFzaCA+PiAyOwotICAgICAgKytsZW47Ci0gICAgfQotICBoYXNoICs9IGxlbiArIChsZW4gPDwgMTcpOwotICBoYXNoIF49IGhhc2ggPj4gMjsKLQotICBpZiAocGhhc2ggIT0gTlVMTCkKLSAgICAqcGhhc2ggPSBoYXNoOwotCi0gIGluZGV4ID0gaGFzaCAlIHRhYmxlLT5zaXplOwotICBsaXN0ID0gdGFibGUtPnRhYmxlICsgaW5kZXg7Ci0KLSAgaWYgKHBsaXN0ICE9IE5VTEwpCi0gICAgKnBsaXN0ID0gbGlzdDsKLQotICBwcmV2ID0gTlVMTDsKLSAgZm9yIChwID0gKmxpc3Q7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAgICAgKyt0YWJsZS0+aGFzaF9jb21wYXJlczsKLSNlbmRpZgotCi0gICAgICBpZiAocC0+aGFzaCA9PSBoYXNoKQotCXsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLQkgICsrdGFibGUtPnN0cmluZ19jb21wYXJlczsKLSNlbmRpZgotCi0JICBpZiAoc3RyY21wIChwLT5zdHJpbmcsIGtleSkgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChwcmV2ICE9IE5VTEwpCi0JCXsKLQkJICBwcmV2LT5uZXh0ID0gcC0+bmV4dDsKLQkJICBwLT5uZXh0ID0gKmxpc3Q7Ci0JCSAgKmxpc3QgPSBwOwotCQl9Ci0KLQkgICAgICByZXR1cm4gcDsKLQkgICAgfQotCX0KLQotICAgICAgcHJldiA9IHA7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBJbnNlcnQgYW4gZW50cnkgaW50byBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybnMgTlVMTCBvbiBzdWNjZXNzLgotICAgT24gZXJyb3IsIGl0IHJldHVybnMgYSBwcmludGFibGUgc3RyaW5nIGluZGljYXRpbmcgdGhlIGVycm9yLiAgSXQKLSAgIGlzIGNvbnNpZGVyZWQgdG8gYmUgYW4gZXJyb3IgaWYgdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzIGluIHRoZQotICAgaGFzaCB0YWJsZS4gICovCi0KLWNvbnN0IGNoYXIgKgotaGFzaF9pbnNlcnQgKHRhYmxlLCBrZXksIHZhbHVlKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBQVFIgdmFsdWU7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqKmxpc3Q7Ci0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksICZsaXN0LCAmaGFzaCk7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgcmV0dXJuICJleGlzdHMiOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPmluc2VydGlvbnM7Ci0jZW5kaWYKLQotICBwID0gb2JzdGFja19hbGxvYyAoJnRhYmxlLT5tZW1vcnksIHNpemVvZiAqcCk7Ci0gIHAtPnN0cmluZyA9IGtleTsKLSAgcC0+aGFzaCA9IGhhc2g7Ci0gIHAtPmRhdGEgPSB2YWx1ZTsKLQotICBwLT5uZXh0ID0gKmxpc3Q7Ci0gICpsaXN0ID0gcDsKLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogSW5zZXJ0IG9yIHJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIE5VTEwgb24KLSAgIHN1Y2Nlc3MuICBPbiBlcnJvciwgaXQgcmV0dXJucyBhIHByaW50YWJsZSBzdHJpbmcgaW5kaWNhdGluZyB0aGUKLSAgIGVycm9yLiAgSWYgYW4gZW50cnkgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyByZXBsYWNlZC4gICovCi0KLWNvbnN0IGNoYXIgKgotaGFzaF9qYW0gKHRhYmxlLCBrZXksIHZhbHVlKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBQVFIgdmFsdWU7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqKmxpc3Q7Ci0gIHVuc2lnbmVkIGxvbmcgaGFzaDsKLQotICBwID0gaGFzaF9sb29rdXAgKHRhYmxlLCBrZXksICZsaXN0LCAmaGFzaCk7Ci0gIGlmIChwICE9IE5VTEwpCi0gICAgewotI2lmZGVmIEhBU0hfU1RBVElTVElDUwotICAgICAgKyt0YWJsZS0+cmVwbGFjZW1lbnRzOwotI2VuZGlmCi0KLSAgICAgIHAtPmRhdGEgPSB2YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICAgICArK3RhYmxlLT5pbnNlcnRpb25zOwotI2VuZGlmCi0KLSAgICAgIHAgPSBvYnN0YWNrX2FsbG9jICgmdGFibGUtPm1lbW9yeSwgc2l6ZW9mICpwKTsKLSAgICAgIHAtPnN0cmluZyA9IGtleTsKLSAgICAgIHAtPmhhc2ggPSBoYXNoOwotICAgICAgcC0+ZGF0YSA9IHZhbHVlOwotCi0gICAgICBwLT5uZXh0ID0gKmxpc3Q7Ci0gICAgICAqbGlzdCA9IHA7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgb2xkCi0gICB2YWx1ZSBzdG9yZWQgZm9yIHRoZSBlbnRyeS4gIElmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQgaW4gdGhlIGhhc2gKLSAgIHRhYmxlLCB0aGlzIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBOVUxMLiAgKi8KLQotUFRSCi1oYXNoX3JlcGxhY2UgKHRhYmxlLCBrZXksIHZhbHVlKQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICBQVFIgdmFsdWU7Ci17Ci0gIHN0cnVjdCBoYXNoX2VudHJ5ICpwOwotICBQVFIgcmV0OwotCi0gIHAgPSBoYXNoX2xvb2t1cCAodGFibGUsIGtleSwgTlVMTCwgTlVMTCk7Ci0gIGlmIChwID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgKyt0YWJsZS0+cmVwbGFjZW1lbnRzOwotI2VuZGlmCi0KLSAgcmV0ID0gcC0+ZGF0YTsKLQotICBwLT5kYXRhID0gdmFsdWU7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRmluZCBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUsIHJldHVybmluZyBpdHMgdmFsdWUuICBSZXR1cm5zIE5VTEwKLSAgIGlmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQuICAqLwotCi1QVFIKLWhhc2hfZmluZCAodGFibGUsIGtleSkKLSAgICAgc3RydWN0IGhhc2hfY29udHJvbCAqdGFibGU7Ci0gICAgIGNvbnN0IGNoYXIgKmtleTsKLXsKLSAgc3RydWN0IGhhc2hfZW50cnkgKnA7Ci0KLSAgcCA9IGhhc2hfbG9va3VwICh0YWJsZSwga2V5LCBOVUxMLCBOVUxMKTsKLSAgaWYgKHAgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR1cm4gcC0+ZGF0YTsKLX0KLQotLyogRGVsZXRlIGFuIGVudHJ5IGZyb20gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIHRoZSB2YWx1ZSBzdG9yZWQKLSAgIGZvciB0aGF0IGVudHJ5LCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZW50cnkuICAqLwotCi1QVFIKLWhhc2hfZGVsZXRlICh0YWJsZSwga2V5KQotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqa2V5OwotewotICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLSAgc3RydWN0IGhhc2hfZW50cnkgKipsaXN0OwotCi0gIHAgPSBoYXNoX2xvb2t1cCAodGFibGUsIGtleSwgJmxpc3QsIE5VTEwpOwotICBpZiAocCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChwICE9ICpsaXN0KQotICAgIGFib3J0ICgpOwotCi0jaWZkZWYgSEFTSF9TVEFUSVNUSUNTCi0gICsrdGFibGUtPmRlbGV0aW9uczsKLSNlbmRpZgotCi0gICpsaXN0ID0gcC0+bmV4dDsKLQotICAvKiBOb3RlIHRoYXQgd2UgbmV2ZXIgcmVjbGFpbSB0aGUgbWVtb3J5IGZvciB0aGlzIGVudHJ5LiAgSWYgZ2FzCi0gICAgIGV2ZXIgc3RhcnRzIGRlbGV0aW5nIGhhc2ggdGFibGUgZW50cmllcyBpbiBhIGJpZyB3YXksIHRoaXMgd2lsbAotICAgICBoYXZlIHRvIGNoYW5nZS4gICovCi0KLSAgcmV0dXJuIHAtPmRhdGE7Ci19Ci0KLS8qIFRyYXZlcnNlIGEgaGFzaCB0YWJsZS4gIENhbGwgdGhlIGZ1bmN0aW9uIG9uIGV2ZXJ5IGVudHJ5IGluIHRoZQotICAgaGFzaCB0YWJsZS4gICovCi0KLXZvaWQKLWhhc2hfdHJhdmVyc2UgKHRhYmxlLCBwZm4pCi0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKnRhYmxlOwotICAgICB2b2lkICgqcGZuKSBQQVJBTVMgKChjb25zdCBjaGFyICprZXksIFBUUiB2YWx1ZSkpOwotewotICB1bnNpZ25lZCBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7ICsraSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLQotICAgICAgZm9yIChwID0gdGFibGUtPnRhYmxlW2ldOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCSgqcGZuKSAocC0+c3RyaW5nLCBwLT5kYXRhKTsKLSAgICB9Ci19Ci0KLS8qIFByaW50IGhhc2ggdGFibGUgc3RhdGlzdGljcyBvbiB0aGUgc3BlY2lmaWVkIGZpbGUuICBOQU1FIGlzIHRoZQotICAgbmFtZSBvZiB0aGUgaGFzaCB0YWJsZSwgdXNlZCBmb3IgcHJpbnRpbmcgYSBoZWFkZXIuICAqLwotCi12b2lkCi1oYXNoX3ByaW50X3N0YXRpc3RpY3MgKGYsIG5hbWUsIHRhYmxlKQotICAgICBGSUxFICpmOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICp0YWJsZTsKLXsKLSNpZmRlZiBIQVNIX1NUQVRJU1RJQ1MKLSAgdW5zaWduZWQgaW50IGk7Ci0gIHVuc2lnbmVkIGxvbmcgdG90YWw7Ci0gIHVuc2lnbmVkIGxvbmcgZW1wdHk7Ci0KLSAgZnByaW50ZiAoZiwgIiVzIGhhc2ggc3RhdGlzdGljczpcbiIsIG5hbWUpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgbG9va3Vwc1xuIiwgdGFibGUtPmxvb2t1cHMpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgaGFzaCBjb21wYXJpc29uc1xuIiwgdGFibGUtPmhhc2hfY29tcGFyZXMpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgc3RyaW5nIGNvbXBhcmlzb25zXG4iLCB0YWJsZS0+c3RyaW5nX2NvbXBhcmVzKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IGluc2VydGlvbnNcbiIsIHRhYmxlLT5pbnNlcnRpb25zKTsKLSAgZnByaW50ZiAoZiwgIlx0JWx1IHJlcGxhY2VtZW50c1xuIiwgdGFibGUtPnJlcGxhY2VtZW50cyk7Ci0gIGZwcmludGYgKGYsICJcdCVsdSBkZWxldGlvbnNcbiIsIHRhYmxlLT5kZWxldGlvbnMpOwotCi0gIHRvdGFsID0gMDsKLSAgZW1wdHkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgdGFibGUtPnNpemU7ICsraSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgaGFzaF9lbnRyeSAqcDsKLQotICAgICAgaWYgKHRhYmxlLT50YWJsZVtpXSA9PSBOVUxMKQotCSsrZW1wdHk7Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChwID0gdGFibGUtPnRhYmxlW2ldOyBwICE9IE5VTEw7IHAgPSBwLT5uZXh0KQotCSAgICArK3RvdGFsOwotCX0KLSAgICB9Ci0KLSAgZnByaW50ZiAoZiwgIlx0JWcgYXZlcmFnZSBjaGFpbiBsZW5ndGhcbiIsIChkb3VibGUpIHRvdGFsIC8gdGFibGUtPnNpemUpOwotICBmcHJpbnRmIChmLCAiXHQlbHUgZW1wdHkgc2xvdHNcbiIsIGVtcHR5KTsKLSNlbmRpZgotfQotDAotI2lmZGVmIFRFU1QKLQotLyogVGhpcyB0ZXN0IHByb2dyYW0gaXMgbGVmdCBvdmVyIGZyb20gdGhlIG9sZCBoYXNoIHRhYmxlIGNvZGUuICAqLwotCi0jZGVmaW5lIFRBQkxFUyAoNikJCS8qIG51bWJlciBvZiBoYXNoIHRhYmxlcyB0byBtYWludGFpbiAqLwotCQkJCS8qIChhdCBvbmNlKSBpbiBhbnkgdGVzdGluZyAqLwotI2RlZmluZSBTVEFUQlVGU0laRSAoMTIpCS8qIHdlIGNhbiBoYXZlIDEyIHN0YXRpc3RpY3MgKi8KLQotaW50IHN0YXRidWZbU1RBVEJVRlNJWkVdOwkvKiBkaXNwbGF5IHN0YXRpc3RpY3MgaGVyZSAqLwotY2hhciBhbnN3ZXJbMTAwXTsJCS8qIGh1bWFuIGZhcnRzIGhlcmUgKi8KLWNoYXIgKmhhc2h0YWJsZVtUQUJMRVNdOwkvKiB3ZSB0ZXN0IG1hbnkgaGFzaCB0YWJsZXMgYXQgb25jZSAqLwotY2hhciAqaDsJCQkvKiBwb2ludHMgdG8gY3VyZW50IGhhc2hfY29udHJvbCAqLwotY2hhciAqKnBwOwotY2hhciAqcDsKLWNoYXIgKm5hbWU7Ci1jaGFyICp2YWx1ZTsKLWludCBzaXplOwotaW50IHVzZWQ7Ci1jaGFyIGNvbW1hbmQ7Ci1pbnQgbnVtYmVyOwkJCS8qIG51bWJlciAwOlRBQkxFUy0xIG9mIGN1cnJlbnQgaGFzaGVkICovCi0JCQkJLyogc3ltYm9sIHRhYmxlICovCi0KLWludAotbWFpbiAoKQotewotICB2b2lkIGFwcGxpY2F0ZWUgKCk7Ci0gIHZvaWQgZGVzdHJveSAoKTsKLSAgY2hhciAqd2hhdCAoKTsKLSAgaW50ICppcDsKLQotICBudW1iZXIgPSAwOwotICBoID0gMDsKLSAgcHJpbnRmICgidHlwZSBoIDxSRVRVUk4+IGZvciBoZWxwXG4iKTsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICBwcmludGYgKCJoYXNoX3Rlc3QgY29tbWFuZDogIik7Ci0gICAgICBnZXRzIChhbnN3ZXIpOwotICAgICAgY29tbWFuZCA9IGFuc3dlclswXTsKLSAgICAgIGlmIChpc3VwcGVyIChjb21tYW5kKSkKLQljb21tYW5kID0gdG9sb3dlciAoY29tbWFuZCk7CS8qIGVjY2ghICovCi0gICAgICBzd2l0Y2ggKGNvbW1hbmQpCi0JewotCWNhc2UgJyMnOgotCSAgcHJpbnRmICgib2xkIGhhc2ggdGFibGUgIz0lZC5cbiIsIG51bWJlcik7Ci0JICB3aGF0dGFibGUgKCk7Ci0JICBicmVhazsKLQljYXNlICc/JzoKLQkgIGZvciAocHAgPSBoYXNodGFibGU7IHBwIDwgaGFzaHRhYmxlICsgVEFCTEVTOyBwcCsrKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiYWRkcmVzcyBvZiBoYXNoIHRhYmxlICMlZCBjb250cm9sIGJsb2NrIGlzICV4eFxuIgotCQkgICAgICAscHAgLSBoYXNodGFibGUsICpwcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ2EnOgotCSAgaGFzaF90cmF2ZXJzZSAoaCwgYXBwbGljYXRlZSk7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGhhc2hfdHJhdmVyc2UgKGgsIGRlc3Ryb3kpOwotCSAgaGFzaF9kaWUgKGgpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBwID0gaGFzaF9maW5kIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpKTsKLQkgIHByaW50ZiAoInZhbHVlIG9mIFwiJXNcIiBpcyBcIiVzXCJcbiIsIG5hbWUsIHAgPyBwIDogIk5PVC1QUkVTRU5UIik7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHByaW50ZiAoIiMgc2hvdyBvbGQsIHNlbGVjdCBuZXcgZGVmYXVsdCBoYXNoIHRhYmxlIG51bWJlclxuIik7Ci0JICBwcmludGYgKCI/IGRpc3BsYXkgYWxsIGhhc2h0YWJsZSBjb250cm9sIGJsb2NrIGFkZHJlc3Nlc1xuIik7Ci0JICBwcmludGYgKCJhIGFwcGx5IGEgc2ltcGxlIGRpc3BsYXktZXIgdG8gZWFjaCBzeW1ib2wgaW4gdGFibGVcbiIpOwotCSAgcHJpbnRmICgiZCBkaWU6IGRlc3Ryb3kgaGFzaHRhYmxlXG4iKTsKLQkgIHByaW50ZiAoImYgZmluZCB2YWx1ZSBvZiBub21pbmF0ZWQgc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoImggdGhpcyBoZWxwXG4iKTsKLQkgIHByaW50ZiAoImkgaW5zZXJ0IHZhbHVlIGludG8gc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoImogamFtIHZhbHVlIGludG8gc3ltYm9sXG4iKTsKLQkgIHByaW50ZiAoIm4gbmV3IGhhc2h0YWJsZVxuIik7Ci0JICBwcmludGYgKCJyIHJlcGxhY2UgYSB2YWx1ZSB3aXRoIGFub3RoZXJcbiIpOwotCSAgcHJpbnRmICgicyBzYXkgd2hhdCAlJSBvZiB0YWJsZSBpcyB1c2VkXG4iKTsKLQkgIHByaW50ZiAoInEgZXhpdCB0aGlzIHByb2dyYW1cbiIpOwotCSAgcHJpbnRmICgieCBkZWxldGUgYSBzeW1ib2wgZnJvbSB0YWJsZSwgcmVwb3J0IGl0cyB2YWx1ZVxuIik7Ci0JICBicmVhazsKLQljYXNlICdpJzoKLQkgIHAgPSBoYXNoX2luc2VydCAoaCwgbmFtZSA9IHdoYXQgKCJzeW1ib2wiKSwgdmFsdWUgPSB3aGF0ICgidmFsdWUiKSk7Ci0JICBpZiAocCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoInN5bWJvbD1cIiVzXCIgIHZhbHVlPVwiJXNcIiAgZXJyb3I9JXNcbiIsIG5hbWUsIHZhbHVlLAotCQkgICAgICBwKTsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSAnaic6Ci0JICBwID0gaGFzaF9qYW0gKGgsIG5hbWUgPSB3aGF0ICgic3ltYm9sIiksIHZhbHVlID0gd2hhdCAoInZhbHVlIikpOwotCSAgaWYgKHApCi0JICAgIHsKLQkgICAgICBwcmludGYgKCJzeW1ib2w9XCIlc1wiICB2YWx1ZT1cIiVzXCIgIGVycm9yPSVzXG4iLCBuYW1lLCB2YWx1ZSwgcCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ24nOgotCSAgaCA9IGhhc2h0YWJsZVtudW1iZXJdID0gKGNoYXIgKikgaGFzaF9uZXcgKCk7Ci0JICBicmVhazsKLQljYXNlICdxJzoKLQkgIGV4aXQgKEVYSVRfU1VDQ0VTUyk7Ci0JY2FzZSAncic6Ci0JICBwID0gaGFzaF9yZXBsYWNlIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpLCB2YWx1ZSA9IHdoYXQgKCJ2YWx1ZSIpKTsKLQkgIHByaW50ZiAoIm9sZCB2YWx1ZSB3YXMgXCIlc1wiXG4iLCBwID8gcCA6ICJ7fSIpOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBoYXNoX3NheSAoaCwgc3RhdGJ1ZiwgU1RBVEJVRlNJWkUpOwotCSAgZm9yIChpcCA9IHN0YXRidWY7IGlwIDwgc3RhdGJ1ZiArIFNUQVRCVUZTSVpFOyBpcCsrKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiJWQgIiwgKmlwKTsKLQkgICAgfQotCSAgcHJpbnRmICgiXG4iKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgcCA9IGhhc2hfZGVsZXRlIChoLCBuYW1lID0gd2hhdCAoInN5bWJvbCIpKTsKLQkgIHByaW50ZiAoIm9sZCB2YWx1ZSB3YXMgXCIlc1wiXG4iLCBwID8gcCA6ICJ7fSIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIkkgY2FuJ3QgdW5kZXJzdGFuZCBjb21tYW5kIFwiJWNcIlxuIiwgY29tbWFuZCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1jaGFyICoKLXdoYXQgKGRlc2NyaXB0aW9uKQotICAgICBjaGFyICpkZXNjcmlwdGlvbjsKLXsKLSAgY2hhciAqcmV0dmFsOwotICBjaGFyICptYWxsb2MgKCk7Ci0KLSAgcHJpbnRmICgiICAgJXMgOiAiLCBkZXNjcmlwdGlvbik7Ci0gIGdldHMgKGFuc3dlcik7Ci0gIC8qIHdpbGwgb25lIGRheSBjbGVhbiB1cCBhbnN3ZXIgaGVyZSAqLwotICByZXR2YWwgPSBtYWxsb2MgKHN0cmxlbiAoYW5zd2VyKSArIDEpOwotICBpZiAoIXJldHZhbCkKLSAgICB7Ci0gICAgICBlcnJvciAoInJvb20iKTsKLSAgICB9Ci0gICh2b2lkKSBzdHJjcHkgKHJldHZhbCwgYW5zd2VyKTsKLSAgcmV0dXJuIChyZXR2YWwpOwotfQotCi12b2lkCi1kZXN0cm95IChzdHJpbmcsIHZhbHVlKQotICAgICBjaGFyICpzdHJpbmc7Ci0gICAgIGNoYXIgKnZhbHVlOwotewotICBmcmVlIChzdHJpbmcpOwotICBmcmVlICh2YWx1ZSk7Ci19Ci0KLQotdm9pZAotYXBwbGljYXRlZSAoc3RyaW5nLCB2YWx1ZSkKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICBjaGFyICp2YWx1ZTsKLXsKLSAgcHJpbnRmICgiJS4yMHMtJS4yMHNcbiIsIHN0cmluZywgdmFsdWUpOwotfQotCi12b2lkCi13aGF0dGFibGUgKCkJCQkvKiBkZXRlcm1pbmUgbnVtYmVyOiB3aGF0IGhhc2ggdGFibGUgdG8gdXNlICovCi0JCQkgICAgICAgIC8qIGFsc28gZGV0ZXJtaW5lIGg6IHBvaW50cyB0byBoYXNoX2NvbnRyb2wgKi8KLXsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAgIHdoYXQgaGFzaCB0YWJsZSAoJWQ6JWQpID8gICIsIDAsIFRBQkxFUyAtIDEpOwotICAgICAgZ2V0cyAoYW5zd2VyKTsKLSAgICAgIHNzY2FuZiAoYW5zd2VyLCAiJWQiLCAmbnVtYmVyKTsKLSAgICAgIGlmIChudW1iZXIgPj0gMCAmJiBudW1iZXIgPCBUQUJMRVMpCi0JewotCSAgaCA9IGhhc2h0YWJsZVtudW1iZXJdOwotCSAgaWYgKCFoKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgid2FybmluZzogY3VycmVudCBoYXNoLXRhYmxlLSMlZC4gaGFzIG5vIGhhc2gtY29udHJvbFxuIiwgbnVtYmVyKTsKLQkgICAgfQotCSAgcmV0dXJuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCJpbnZhbGlkIGhhc2ggdGFibGUgbnVtYmVyOiAlZFxuIiwgbnVtYmVyKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYgLyogI2lmZGVmIFRFU1QgKi8KLQotLyogZW5kIG9mIGhhc2guYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2hhc2guaCBiL2dhcy9oYXNoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTlkOWYuLjAwMDAwMDAKLS0tIGEvZ2FzL2hhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIGhhc2guaCAtLSBoZWFkZXIgZmlsZSBmb3IgZ2FzIGhhc2ggdGFibGUgcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTIsIDkzLCA5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBIQVNIX0gKLSNkZWZpbmUgSEFTSF9ICi0KLXN0cnVjdCBoYXNoX2NvbnRyb2w7Ci0KLS8qIENyZWF0ZSBhIGhhc2ggdGFibGUuICBUaGlzIHJldHVybiBhIGNvbnRyb2wgYmxvY2suICAqLwotCi1leHRlcm4gc3RydWN0IGhhc2hfY29udHJvbCAqaGFzaF9uZXcgUEFSQU1TICgodm9pZCkpOwotCi0vKiBEZWxldGUgYSBoYXNoIHRhYmxlLCBmcmVlaW5nIGFsbCBhbGxvY2F0ZWQgbWVtb3J5LiAgKi8KLQotZXh0ZXJuIHZvaWQgaGFzaF9kaWUgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqKSk7Ci0KLS8qIEluc2VydCBhbiBlbnRyeSBpbnRvIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyBOVUxMIG9uIHN1Y2Nlc3MuCi0gICBPbiBlcnJvciwgaXQgcmV0dXJucyBhIHByaW50YWJsZSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgZXJyb3IuICBJdAotICAgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBlcnJvciBpZiB0aGUgZW50cnkgYWxyZWFkeSBleGlzdHMgaW4gdGhlCi0gICBoYXNoIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmhhc2hfaW5zZXJ0IFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwKLQkJCQkJY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKTsKLQotLyogSW5zZXJ0IG9yIHJlcGxhY2UgYW4gZW50cnkgaW4gYSBoYXNoIHRhYmxlLiAgVGhpcyByZXR1cm5zIE5VTEwgb24KLSAgIHN1Y2Nlc3MuICBPbiBlcnJvciwgaXQgcmV0dXJucyBhIHByaW50YWJsZSBzdHJpbmcgaW5kaWNhdGluZyB0aGUKLSAgIGVycm9yLiAgSWYgYW4gZW50cnkgYWxyZWFkeSBleGlzdHMsIGl0cyB2YWx1ZSBpcyByZXBsYWNlZC4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpoYXNoX2phbSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosCi0JCQkJICAgICBjb25zdCBjaGFyICprZXksIFBUUiB2YWx1ZSkpOwotCi0vKiBSZXBsYWNlIGFuIGV4aXN0aW5nIGVudHJ5IGluIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgb2xkCi0gICB2YWx1ZSBzdG9yZWQgZm9yIHRoZSBlbnRyeS4gIElmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQgaW4gdGhlIGhhc2gKLSAgIHRhYmxlLCB0aGlzIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyBOVUxMLiAgKi8KLQotZXh0ZXJuIFBUUiBoYXNoX3JlcGxhY2UgUEFSQU1TICgoc3RydWN0IGhhc2hfY29udHJvbCAqLCBjb25zdCBjaGFyICprZXksCi0JCQkJIFBUUiB2YWx1ZSkpOwotCi0vKiBGaW5kIGFuIGVudHJ5IGluIGEgaGFzaCB0YWJsZSwgcmV0dXJuaW5nIGl0cyB2YWx1ZS4gIFJldHVybnMgTlVMTAotICAgaWYgdGhlIGVudHJ5IGlzIG5vdCBmb3VuZC4gICovCi0KLWV4dGVybiBQVFIgaGFzaF9maW5kIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwgY29uc3QgY2hhciAqa2V5KSk7Ci0KLS8qIERlbGV0ZSBhbiBlbnRyeSBmcm9tIGEgaGFzaCB0YWJsZS4gIFRoaXMgcmV0dXJucyB0aGUgdmFsdWUgc3RvcmVkCi0gICBmb3IgdGhhdCBlbnRyeSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBubyBzdWNoIGVudHJ5LiAgKi8KLQotZXh0ZXJuIFBUUiBoYXNoX2RlbGV0ZSBQQVJBTVMgKChzdHJ1Y3QgaGFzaF9jb250cm9sICosIGNvbnN0IGNoYXIgKmtleSkpOwotCi0vKiBUcmF2ZXJzZSBhIGhhc2ggdGFibGUuICBDYWxsIHRoZSBmdW5jdGlvbiBvbiBldmVyeSBlbnRyeSBpbiB0aGUKLSAgIGhhc2ggdGFibGUuICAqLwotCi1leHRlcm4gdm9pZCBoYXNoX3RyYXZlcnNlIFBBUkFNUyAoKHN0cnVjdCBoYXNoX2NvbnRyb2wgKiwKLQkJCQkgICB2b2lkICgqcGZuKSAoY29uc3QgY2hhciAqa2V5LCBQVFIgdmFsdWUpKSk7Ci0KLS8qIFByaW50IGhhc2ggdGFibGUgc3RhdGlzdGljcyBvbiB0aGUgc3BlY2lmaWVkIGZpbGUuICBOQU1FIGlzIHRoZQotICAgbmFtZSBvZiB0aGUgaGFzaCB0YWJsZSwgdXNlZCBmb3IgcHJpbnRpbmcgYSBoZWFkZXIuICAqLwotCi1leHRlcm4gdm9pZCBoYXNoX3ByaW50X3N0YXRpc3RpY3MgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICBzdHJ1Y3QgaGFzaF9jb250cm9sICopKTsKLQotI2VuZGlmIC8qIEhBU0hfSCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2lucHV0LWZpbGUuYyBiL2dhcy9pbnB1dC1maWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNGY2ZjcuLjAwMDAwMDAKLS0tIGEvZ2FzL2lucHV0LWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKiBpbnB1dF9maWxlLmMgLSBEZWFsIHdpdGggSW5wdXQgRmlsZXMgLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBDb25maW5lcyBhbGwgZGV0YWlscyBvZiByZWFkaW5nIHNvdXJjZSBieXRlcyB0byB0aGlzIG1vZHVsZS4KLSAqIEFsbCBPL1Mgc3BlY2lmaWMgY3JvY2tzIHNob3VsZCBsaXZlIGhlcmUuCi0gKiBXaGF0IHdlIGxvc2UgaW4gImVmZmljaWVuY3kiIHdlIGdhaW4gaW4gbW9kdWxhcml0eS4KLSAqIE5vdGUgd2UgZG9uJ3QgbmVlZCB0byAjaW5jbHVkZSB0aGUgImFzLmgiIGZpbGUuIE5vIGNvbW1vbiBjb3VwbGluZyEKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiaW5wdXQtZmlsZS5oIgotCi1zdGF0aWMgaW50IGlucHV0X2ZpbGVfZ2V0IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLS8qIFRoaXMgdmFyaWFibGUgaXMgbm9uLXplcm8gaWYgdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIHJlYWQgc2hvdWxkIGJlCi0gICBwcmVwcm9jZXNzZWQgYnkgYXBwLiAgSXQgaXMgemVybyBpZiB0aGUgZmlsZSBjYW4gYmUgcmVhZCBzdHJhaWdodCBpbi4KLSAgICovCi1pbnQgcHJlcHJvY2VzcyA9IDA7Ci0KLS8qCi0gKiBUaGlzIGNvZGUgb3BlbnMgYSBmaWxlLCB0aGVuIGRlbGl2ZXJzIEJVRkZFUl9TSVpFIGNoYXJhY3RlcgotICogY2h1bmtzIG9mIHRoZSBmaWxlIG9uIGRlbWFuZC4KLSAqIEJVRkZFUl9TSVpFIGlzIHN1cHBvc2VkIHRvIGJlIGEgbnVtYmVyIGNob3NlbiBmb3Igc3BlZWQuCi0gKiBUaGUgY2FsbGVyIG9ubHkgYXNrcyBvbmNlIHdoYXQgQlVGRkVSX1NJWkUgaXMsIGFuZCBhc2tzIGJlZm9yZQotICogdGhlIG5hdHVyZSBvZiB0aGUgaW5wdXQgZmlsZXMgKGlmIGFueSkgaXMga25vd24uCi0gKi8KLQotI2RlZmluZSBCVUZGRVJfU0laRSAoMzIgKiAxMDI0KQotCi0vKgotICogV2UgdXNlIHN0YXRpYyBkYXRhOiB0aGUgZGF0YSBhcmVhIGlzIG5vdCBzaGFyYWJsZS4KLSAqLwotCi1zdGF0aWMgRklMRSAqZl9pbjsKLXN0YXRpYyBjaGFyICpmaWxlX25hbWU7Ci0KLS8qIFN0cnVjdCBmb3Igc2F2aW5nIHRoZSBzdGF0ZSBvZiB0aGlzIG1vZHVsZSBmb3IgZmlsZSBpbmNsdWRlcy4gICovCi1zdHJ1Y3Qgc2F2ZWRfZmlsZQotICB7Ci0gICAgRklMRSAqZl9pbjsKLSAgICBjaGFyICpmaWxlX25hbWU7Ci0gICAgaW50IHByZXByb2Nlc3M7Ci0gICAgY2hhciAqYXBwX3NhdmU7Ci0gIH07Ci0MCi0vKiBUaGVzZSBob29rcyBhY2NvbW9kYXRlIG1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMuICovCi0KLXZvaWQgCi1pbnB1dF9maWxlX2JlZ2luICgpCi17Ci0gIGZfaW4gPSAoRklMRSAqKSAwOwotfQotCi12b2lkIAotaW5wdXRfZmlsZV9lbmQgKCkKLXsKLX0KLQotLyogUmV0dXJuIEJVRkZFUl9TSVpFLiAqLwotdW5zaWduZWQgaW50IAotaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKQotewotICByZXR1cm4gKEJVRkZFUl9TSVpFKTsKLX0KLQotaW50IAotaW5wdXRfZmlsZV9pc19vcGVuICgpCi17Ci0gIHJldHVybiBmX2luICE9IChGSUxFICopIDA7Ci19Ci0KLS8qIFB1c2ggdGhlIHN0YXRlIG9mIG91ciBpbnB1dCwgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBzYXZlZCBpbmZvIHRoYXQKLSAgIGNhbiBiZSByZXN0b3JlZCB3aXRoIGlucHV0X2ZpbGVfcG9wICgpLiAgKi8KLWNoYXIgKgotaW5wdXRfZmlsZV9wdXNoICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzYXZlZF9maWxlICpzYXZlZDsKLQotICBzYXZlZCA9IChzdHJ1Y3Qgc2F2ZWRfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKnNhdmVkKTsKLQotICBzYXZlZC0+Zl9pbiA9IGZfaW47Ci0gIHNhdmVkLT5maWxlX25hbWUgPSBmaWxlX25hbWU7Ci0gIHNhdmVkLT5wcmVwcm9jZXNzID0gcHJlcHJvY2VzczsKLSAgaWYgKHByZXByb2Nlc3MpCi0gICAgc2F2ZWQtPmFwcF9zYXZlID0gYXBwX3B1c2ggKCk7Ci0KLSAgaW5wdXRfZmlsZV9iZWdpbiAoKTsJCS8qIEluaXRpYWxpemUgZm9yIG5ldyBmaWxlICovCi0KLSAgcmV0dXJuIChjaGFyICopIHNhdmVkOwotfQotCi12b2lkCi1pbnB1dF9maWxlX3BvcCAoYXJnKQotICAgICBjaGFyICphcmc7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBzYXZlZF9maWxlICpzYXZlZCA9IChzdHJ1Y3Qgc2F2ZWRfZmlsZSAqKSBhcmc7Ci0KLSAgaW5wdXRfZmlsZV9lbmQgKCk7CQkvKiBDbG9zZSBvdXQgb2xkIGZpbGUgKi8KLQotICBmX2luID0gc2F2ZWQtPmZfaW47Ci0gIGZpbGVfbmFtZSA9IHNhdmVkLT5maWxlX25hbWU7Ci0gIHByZXByb2Nlc3MgPSBzYXZlZC0+cHJlcHJvY2VzczsKLSAgaWYgKHByZXByb2Nlc3MpCi0gICAgYXBwX3BvcCAoc2F2ZWQtPmFwcF9zYXZlKTsKLQotICBmcmVlIChhcmcpOwotfQotDAotdm9pZAotaW5wdXRfZmlsZV9vcGVuIChmaWxlbmFtZSwgcHJlKQotICAgICBjaGFyICpmaWxlbmFtZTsJCS8qICIiIG1lYW5zIHVzZSBzdGRpbi4gTXVzdCBub3QgYmUgMC4gKi8KLSAgICAgaW50IHByZTsKLXsKLSAgaW50IGM7Ci0gIGNoYXIgYnVmWzgwXTsKLQotICBwcmVwcm9jZXNzID0gcHJlOwotCi0gIGFzc2VydCAoZmlsZW5hbWUgIT0gMCk7CS8qIEZpbGVuYW1lIG1heSBub3QgYmUgTlVMTC4gKi8KLSAgaWYgKGZpbGVuYW1lWzBdKQotICAgIHsJCQkJLyogV2UgaGF2ZSBhIGZpbGUgbmFtZS4gU3VjayBpdCBhbmQgc2VlLiAqLwotICAgICAgZl9pbiA9IGZvcGVuIChmaWxlbmFtZSwgInIiKTsKLSAgICAgIGZpbGVfbmFtZSA9IGZpbGVuYW1lOwotICAgIH0KLSAgZWxzZQotICAgIHsJCQkJLyogdXNlIHN0ZGluIGZvciB0aGUgaW5wdXQgZmlsZS4gKi8KLSAgICAgIGZfaW4gPSBzdGRpbjsKLSAgICAgIGZpbGVfbmFtZSA9IF8oIntzdGFuZGFyZCBpbnB1dH0iKTsJLyogRm9yIGVycm9yIG1lc3NhZ2VzLiAqLwotICAgIH0KLSAgaWYgKGZfaW4gPT0gKEZJTEUgKikgMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIkNhbid0IG9wZW4gJXMgZm9yIHJlYWRpbmcuIiksIGZpbGVfbmFtZSk7Ci0gICAgICBhc19wZXJyb3IgKCIlcyIsIGZpbGVfbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGMgPSBnZXRjIChmX2luKTsKLSAgaWYgKGMgPT0gJyMnKQotICAgIHsJCQkJLyogQmVnaW5zIHdpdGggY29tbWVudCwgbWF5IG5vdCB3YW50IHRvIHByZXByb2Nlc3MgKi8KLSAgICAgIGMgPSBnZXRjIChmX2luKTsKLSAgICAgIGlmIChjID09ICdOJykKLQl7Ci0JICBmZ2V0cyAoYnVmLCA4MCwgZl9pbik7Ci0JICBpZiAoIXN0cmNtcCAoYnVmLCAiT19BUFBcbiIpKQotCSAgICBwcmVwcm9jZXNzID0gMDsKLQkgIGlmICghc3RyY2hyIChidWYsICdcbicpKQotCSAgICB1bmdldGMgKCcjJywgZl9pbik7CS8qIEl0IHdhcyBsb25nZXIgKi8KLQkgIGVsc2UKLQkgICAgdW5nZXRjICgnXG4nLCBmX2luKTsKLQl9Ci0gICAgICBlbHNlIGlmIChjID09ICdcbicpCi0JdW5nZXRjICgnXG4nLCBmX2luKTsKLSAgICAgIGVsc2UKLQl1bmdldGMgKCcjJywgZl9pbik7Ci0gICAgfQotICBlbHNlCi0gICAgdW5nZXRjIChjLCBmX2luKTsKLX0KLQotLyogQ2xvc2UgaW5wdXQgZmlsZS4gICovCi12b2lkIAotaW5wdXRfZmlsZV9jbG9zZSAoKQotewotICBpZiAoZl9pbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZjbG9zZSAoZl9pbik7Ci0gICAgfQkJCQkvKiBkb24ndCBjbG9zZSBhIG51bGwgZmlsZSBwb2ludGVyICovCi0gIGZfaW4gPSAwOwotfQkJCQkvKiBpbnB1dF9maWxlX2Nsb3NlKCkgKi8KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgdG8gZG9fc2NydWJfY2hhcnMuICAqLwotCi1zdGF0aWMgaW50Ci1pbnB1dF9maWxlX2dldCAoYnVmLCBidWZsZW4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGJ1ZmxlbjsKLXsKLSAgaW50IHNpemU7Ci0KLSAgc2l6ZSA9IGZyZWFkIChidWYsIHNpemVvZiAoY2hhciksIGJ1ZmxlbiwgZl9pbik7Ci0gIGlmIChzaXplIDwgMCkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkNhbid0IHJlYWQgZnJvbSAlcyIpLCBmaWxlX25hbWUpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotLyogUmVhZCBhIGJ1ZmZlciBmcm9tIHRoZSBpbnB1dCBmaWxlLiAgKi8KLQotY2hhciAqCi1pbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIgKHdoZXJlKQotICAgICBjaGFyICp3aGVyZTsJCS8qIFdoZXJlIHRvIHBsYWNlIDFzdCBjaGFyYWN0ZXIgb2YgbmV3IGJ1ZmZlci4gKi8KLXsKLSAgY2hhciAqcmV0dXJuX3ZhbHVlOwkJLyogLT4gTGFzdCBjaGFyIG9mIHdoYXQgd2UgcmVhZCwgKyAxLiAqLwotICByZWdpc3RlciBpbnQgc2l6ZTsKLQotICBpZiAoZl9pbiA9PSAoRklMRSAqKSAwKQotICAgIHJldHVybiAwOwotICAvKgotICAgKiBmZmx1c2ggKHN0ZGluKTsgY291bGQgYmUgZG9uZSBoZXJlIGlmIHlvdSB3YW50IHRvIHN5bmNocm9uaXNlCi0gICAqIHN0ZGluIGFuZCBzdGRvdXQsIGZvciB0aGUgY2FzZSB3aGVyZSBvdXIgaW5wdXQgZmlsZSBpcyBzdGRpbi4KLSAgICogU2luY2UgdGhlIGFzc2VtYmxlciBzaG91bGRuJ3QgZG8gYW55IG91dHB1dCB0byBzdGRvdXQsIHdlCi0gICAqIGRvbid0IGJvdGhlciB0byBzeW5jaCBvdXRwdXQgYW5kIGlucHV0LgotICAgKi8KLSAgaWYgKHByZXByb2Nlc3MpCi0gICAgc2l6ZSA9IGRvX3NjcnViX2NoYXJzIChpbnB1dF9maWxlX2dldCwgd2hlcmUsIEJVRkZFUl9TSVpFKTsKLSAgZWxzZQotICAgIHNpemUgPSBmcmVhZCAod2hlcmUsIHNpemVvZiAoY2hhciksIEJVRkZFUl9TSVpFLCBmX2luKTsKLSAgaWYgKHNpemUgPCAwKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiQ2FuJ3QgcmVhZCBmcm9tICVzIiksIGZpbGVfbmFtZSk7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0gIGlmIChzaXplKQotICAgIHJldHVybl92YWx1ZSA9IHdoZXJlICsgc2l6ZTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChmY2xvc2UgKGZfaW4pKQotCWFzX3BlcnJvciAoXygiQ2FuJ3QgY2xvc2UgJXMiKSwgZmlsZV9uYW1lKTsKLSAgICAgIGZfaW4gPSAoRklMRSAqKSAwOwotICAgICAgcmV0dXJuX3ZhbHVlID0gMDsKLSAgICB9Ci0gIHJldHVybiAocmV0dXJuX3ZhbHVlKTsKLX0KLQotLyogZW5kIG9mIGlucHV0LWZpbGUuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL2lucHV0LWZpbGUuaCBiL2dhcy9pbnB1dC1maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOWJmMjguLjAwMDAwMDAKLS0tIGEvZ2FzL2lucHV0LWZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qIGlucHV0X2ZpbGUuaCBoZWFkZXIgZm9yIGlucHV0LWZpbGUuYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qImlucHV0X2ZpbGUuYyI6T3BlcmF0aW5nLXN5c3RlbSBkZXBlbmRhbnQgZnVuY3Rpb25zIHRvIHJlYWQgc291cmNlIGZpbGVzLiovCi0KLQotLyoKLSAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCB0aGlzIG1vZHVsZSBtdXN0IHByb3ZpZGUgdGhlCi0gKiBmb2xsb3dpbmcgc2VydmljZXMgdG8gaXRzIGNhbGxlcnMuCi0gKgotICogaW5wdXRfZmlsZV9iZWdpbigpCQkJQ2FsbCBvbmNlIGJlZm9yZSBhbnl0aGluZyBlbHNlLgotICoKLSAqIGlucHV0X2ZpbGVfZW5kKCkJCQlDYWxsIG9uY2UgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlLgotICoKLSAqIGlucHV0X2ZpbGVfYnVmZmVyX3NpemUoKQkJQ2FsbCBhbnl0aW1lLiBSZXR1cm5zIGxhcmdlc3QgcG9zc2libGUKLSAqCQkJCQlkZWxpdmVyeSBmcm9tCi0gKgkJCQkJaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyKCkuCi0gKgotICogaW5wdXRfZmlsZV9vcGVuKG5hbWUpCQlDYWxsIG9uY2UgZm9yIGVhY2ggaW5wdXQgZmlsZS4KLSAqCi0gKiBpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIod2hlcmUpCUNhbGwgb25jZSB0byBnZXQgZWFjaCBuZXcgYnVmZmVyLgotICoJCQkJCVJldHVybiAwOiBubyBtb3JlIGNoYXJzIGxlZnQgaW4gZmlsZSwKLSAqCQkJCQkgICB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KLSAqCQkJCQlPdGhlcndpc2U6IHJldHVybiBhIHBvaW50ZXIgdG8ganVzdAotICoJCQkJCSAgIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciB3ZSByZWFkCi0gKgkJCQkJICAgaW50byB0aGUgYnVmZmVyLgotICoJCQkJCUlmIHdlIGNhbiBvbmx5IHJlYWQgMCBjaGFyYWN0ZXJzLCB0aGVuCi0gKgkJCQkJZW5kLW9mLWZpbGUgaXMgZmFrZWQuCi0gKgotICogaW5wdXRfZmlsZV9wdXNoKCkJCQlQdXNoIHN0YXRlLCB3aGljaCBjYW4gYmUgcmVzdG9yZWQKLSAqCQkJCQlsYXRlci4gIERvZXMgaW1wbGljaXQgaW5wdXRfZmlsZV9iZWdpbi4KLSAqCQkJCQlSZXR1cm5zIGNoYXIgKiB0byBzYXZlZCBzdGF0ZS4KLSAqCi0gKiBpbnB1dF9maWxlX3BvcCAoYXJnKQkJCVBvcHMgcHJldmlvdXNseSBzYXZlZCBzdGF0ZS4KLSAqCi0gKiBpbnB1dF9maWxlX2Nsb3NlICgpCQkJQ2xvc2VzIG9wZW5lZCBmaWxlLgotICoKLSAqIEFsbCBlcnJvcnMgYXJlIHJlcG9ydGVkICh1c2luZyBhc19wZXJyb3IpIHNvIGNhbGxlciBkb2Vzbid0IGhhdmUgdG8gdGhpbmsKLSAqIGFib3V0IEkvTyBlcnJvcnMuIE5vIEkvTyBlcnJvcnMgYXJlIGZhdGFsOiBhbiBlbmQtb2YtZmlsZSBtYXkgYmUgZmFrZWQuCi0gKi8KLQotY2hhciAqaW5wdXRfZmlsZV9naXZlX25leHRfYnVmZmVyIFBBUkFNUyAoKGNoYXIgKndoZXJlKSk7Ci1jaGFyICppbnB1dF9maWxlX3B1c2ggUEFSQU1TICgodm9pZCkpOwotdW5zaWduZWQgaW50IGlucHV0X2ZpbGVfYnVmZmVyX3NpemUgUEFSQU1TICgodm9pZCkpOwotaW50IGlucHV0X2ZpbGVfaXNfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGlucHV0X2ZpbGVfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9maWxlX2Nsb3NlIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgaW5wdXRfZmlsZV9lbmQgUEFSQU1TICgodm9pZCkpOwotdm9pZCBpbnB1dF9maWxlX29wZW4gUEFSQU1TICgoY2hhciAqZmlsZW5hbWUsIGludCBwcmUpKTsKLXZvaWQgaW5wdXRfZmlsZV9wb3AgUEFSQU1TICgoY2hhciAqYXJnKSk7Ci0KLS8qIGVuZCBvZiBpbnB1dF9maWxlLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9pbnB1dC1zY3J1Yi5jIGIvZ2FzL2lucHV0LXNjcnViLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTNiYjMuLjAwMDAwMDAKLS0tIGEvZ2FzL2lucHV0LXNjcnViLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotLyogaW5wdXRfc2NydWIuYyAtIEJyZWFrIHVwIGlucHV0IGJ1ZmZlcnMgaW50byB3aG9sZSBudW1iZXJzIG9mIGxpbmVzLgotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+CQkvKiBOZWVkIHRoaXMgdG8gbWFrZSBlcnJubyBkZWNsYXJhdGlvbiByaWdodCAqLwotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAiaW5wdXQtZmlsZS5oIgotI2luY2x1ZGUgInNiLmgiCi0jaW5jbHVkZSAibGlzdGluZy5oIgotCi0vKgotICogTy9TIGluZGVwZW5kZW50IG1vZHVsZSB0byBzdXBwbHkgYnVmZmVycyBvZiBzYW5pdGlzZWQgc291cmNlIGNvZGUKLSAqIHRvIHJlc3Qgb2YgYXNzZW1ibGVyLiAgV2UgZ2V0IHNhbml0aXNlZCBpbnB1dCBkYXRhIG9mIGFyYml0cmFyeSBsZW5ndGguCi0gKiBXZSBicmVhayB0aGVzZSBidWZmZXJzIG9uIGxpbmUgYm91bmRhcmllcywgcmVjb21iaW5lIHBpZWNlcyB0aGF0Ci0gKiB3ZXJlIGJyb2tlbiBhY3Jvc3MgYnVmZmVycywgYW5kIHJldHVybiBhIGJ1ZmZlciBvZiBmdWxsIGxpbmVzIHRvCi0gKiB0aGUgY2FsbGVyLgotICogVGhlIGxhc3QgcGFydGlhbCBsaW5lIGJlZ2lucyB0aGUgbmV4dCBidWZmZXIgd2UgYnVpbGQgYW5kIHJldHVybiB0byBjYWxsZXIuCi0gKiBUaGUgYnVmZmVyIHJldHVybmVkIHRvIGNhbGxlciBpcyBwcmVjZWVkZWQgYnkgQkVGT1JFX1NUUklORyBhbmQgZm9sbG93ZWQKLSAqIGJ5IEFGVEVSX1NUUklORywgYXMgc2VudGluZWxzLiBUaGUgbGFzdCBjaGFyYWN0ZXIgYmVmb3JlIEFGVEVSX1NUUklORwotICogaXMgYSBuZXdsaW5lLgotICogQWxzbyBsb29rcyBhZnRlciBsaW5lIG51bWJlcnMsIGZvciBlLmcuIGVycm9yIG1lc3NhZ2VzLgotICovCi0KLS8qCi0gKiBXZSBkb24ndCBjYXJlIGhvdyBmaWx0aHkgb3VyIGJ1ZmZlcnMgYXJlLCBidXQgb3VyIGNhbGxlcnMgYXNzdW1lCi0gKiB0aGF0IHRoZSBmb2xsb3dpbmcgc2FuaXRhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuCi0gKgotICogTm8gY29tbWVudHMsIHJlZHVjZSBhIGNvbW1lbnQgdG8gYSBzcGFjZS4KLSAqIFJlZHVjZSBhIHRhYiB0byBhIHNwYWNlIHVubGVzcyBpdCBpcyAxc3QgY2hhciBvZiBsaW5lLgotICogQWxsIG11bHRpcGxlIHRhYnMgYW5kIHNwYWNlcyBjb2xsYXBzZWQgaW50byAxIGNoYXIuIFRhYiBvbmx5Ci0gKiAgIGxlZ2FsIGlmIDFzdCBjaGFyIG9mIGxpbmUuCi0gKiAjIGxpbmUgZmlsZSBzdGF0ZW1lbnRzIGNvbnZlcnRlZCB0byAubGluZSB4Oy5maWxlIHk7IHN0YXRlbWVudHMuCi0gKiBFc2NhcGVkIG5ld2xpbmVzIGF0IGVuZCBvZiBsaW5lOiByZW1vdmUgdGhlbSBidXQgYWRkIGFzIG1hbnkgbmV3bGluZXMKLSAqICAgdG8gZW5kIG9mIHN0YXRlbWVudCBhcyB5b3UgcmVtb3ZlZCBpbiB0aGUgbWlkZGxlLCB0byBzeW5jaCBsaW5lIG51bWJlcnMuCi0gKi8KLQwKLSNkZWZpbmUgQkVGT1JFX1NUUklORyAoIlxuIikKLSNkZWZpbmUgQUZURVJfU1RSSU5HICgiXDAiKQkvKiBtZW1jcHkgb2YgMCBjaGFycyBtaWdodCBjaG9rZS4gKi8KLSNkZWZpbmUgQkVGT1JFX1NJWkUgKDEpCi0jZGVmaW5lIEFGVEVSX1NJWkUgICgxKQotCi1zdGF0aWMgY2hhciAqYnVmZmVyX3N0YXJ0OwkvKi0+MXN0IGNoYXIgb2YgZnVsbCBidWZmZXIgYXJlYS4gKi8KLXN0YXRpYyBjaGFyICpwYXJ0aWFsX3doZXJlOwkvKi0+YWZ0ZXIgbGFzdCBmdWxsIGxpbmUgaW4gYnVmZmVyLiAqLwotc3RhdGljIGludCBwYXJ0aWFsX3NpemU7CS8qID49MC4gTnVtYmVyIG9mIGNoYXJzIGluIHBhcnRpYWwgbGluZSBpbiBidWZmZXIuICovCi1zdGF0aWMgY2hhciBzYXZlX3NvdXJjZVtBRlRFUl9TSVpFXTsKLS8qIEJlY2F1c2Ugd2UgbmVlZCBBRlRFUl9TVFJJTkcganVzdCBhZnRlciBsYXN0ICovCi0vKiBmdWxsIGxpbmUsIGl0IGNsb2JiZXJzIDFzdCBwYXJ0IG9mIHBhcnRpYWwgKi8KLS8qIGxpbmUuIFNvIHdlIHByZXNlcnZlIDFzdCBwYXJ0IG9mIHBhcnRpYWwgKi8KLS8qIGxpbmUgaGVyZS4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYnVmZmVyX2xlbmd0aDsJLyogV2hhdCBpcyB0aGUgbGFyZ2VzdCBzaXplIGJ1ZmZlciB0aGF0ICovCi0vKiBpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIoKSBjb3VsZCAqLwotLyogcmV0dXJuIHRvIHVzPyAqLwotCi0vKiBUaGUgaW5kZXggaW50byBhbiBzYiBzdHJ1Y3R1cmUgd2UgYXJlIHJlYWRpbmcgZnJvbS4gIC0xIGlmIG5vbmUuICAqLwotc3RhdGljIGludCBzYl9pbmRleCA9IC0xOwotCi0vKiBJZiB3ZSBhcmUgcmVhZGluZyBmcm9tIGFuIHNiIHN0cnVjdHVyZSwgdGhpcyBpcyBpdC4gICovCi1zdGF0aWMgc2IgZnJvbV9zYjsKLQotLyogVGhlIG51bWJlciBvZiBuZXN0ZWQgc2Igc3RydWN0dXJlcyB3ZSBoYXZlIGluY2x1ZGVkLiAgKi8KLWludCBtYWNyb19uZXN0OwotCi0vKiBXZSBjYW4gaGF2ZSBtb3JlIHRoYW4gb25lIHNvdXJjZSBmaWxlIG9wZW4gYXQgb25jZSwgdGhvdWdoIHRoZSBpbmZvIGZvciBhbGwKLSAgIGJ1dCB0aGUgbGF0ZXN0IG9uZSBhcmUgc2F2ZWQgb2ZmIGluIGEgc3RydWN0IGlucHV0X3NhdmUuICBUaGVzZSBmaWxlcyByZW1haW4KLSAgIG9wZW4sIHNvIHdlIGFyZSBsaW1pdGVkIGJ5IHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlcyBhbGxvd2VkIGJ5IHRoZQotICAgdW5kZXJseWluZyBPUy4gV2UgbWF5IGFsc28gc2VxdWVudGlhbGx5IHJlYWQgbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZSBpbiBhbgotICAgYXNzZW1ibHkuICovCi0KLS8qIFdlIG11c3QgdHJhY2sgdGhlIHBoeXNpY2FsIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZvciBlcnJvciBtZXNzYWdlcy4gV2UgYWxzbwotICAgdHJhY2sgYSAibG9naWNhbCIgZmlsZSBhbmQgbGluZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byAoQz8pICBjb21waWxlcgotICAgc291cmNlIGxpbmUgbnVtYmVycy4gIFdoZW5ldmVyIHdlIG9wZW4gYSBmaWxlIHdlIG11c3QgZmlsbCBpbgotICAgcGh5c2ljYWxfaW5wdXRfZmlsZS4gU28gaWYgaXQgaXMgTlVMTCB3ZSBoYXZlIG5vdCBvcGVuZWQgYW55IGZpbGVzIHlldC4gKi8KLQotc3RhdGljIGNoYXIgKnBoeXNpY2FsX2lucHV0X2ZpbGU7Ci1zdGF0aWMgY2hhciAqbG9naWNhbF9pbnB1dF9maWxlOwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBsaW5lX251bWJlclQ7CS8qIDEtb3JpZ2luIGxpbmUgbnVtYmVyIGluIGEgc291cmNlIGZpbGUuICovCi0vKiBBIGxpbmUgZW5kcyBpbiAnXG4nIG9yIGVvZi4gKi8KLQotc3RhdGljIGxpbmVfbnVtYmVyVCBwaHlzaWNhbF9pbnB1dF9saW5lOwotc3RhdGljIGludCBsb2dpY2FsX2lucHV0X2xpbmU7Ci0KLS8qIFN0cnVjdCB1c2VkIHRvIHNhdmUgdGhlIHN0YXRlIG9mIHRoZSBpbnB1dCBoYW5kbGVyIGR1cmluZyBpbmNsdWRlIGZpbGVzICovCi1zdHJ1Y3QgaW5wdXRfc2F2ZQotICB7Ci0gICAgY2hhciAqYnVmZmVyX3N0YXJ0OwotICAgIGNoYXIgKnBhcnRpYWxfd2hlcmU7Ci0gICAgaW50IHBhcnRpYWxfc2l6ZTsKLSAgICBjaGFyIHNhdmVfc291cmNlW0FGVEVSX1NJWkVdOwotICAgIHVuc2lnbmVkIGludCBidWZmZXJfbGVuZ3RoOwotICAgIGNoYXIgKnBoeXNpY2FsX2lucHV0X2ZpbGU7Ci0gICAgY2hhciAqbG9naWNhbF9pbnB1dF9maWxlOwotICAgIGxpbmVfbnVtYmVyVCBwaHlzaWNhbF9pbnB1dF9saW5lOwotICAgIGludCBsb2dpY2FsX2lucHV0X2xpbmU7Ci0gICAgaW50IHNiX2luZGV4OwotICAgIHNiIGZyb21fc2I7Ci0gICAgc3RydWN0IGlucHV0X3NhdmUgKm5leHRfc2F2ZWRfZmlsZTsJLyogQ2hhaW4gb2YgaW5wdXRfc2F2ZXMgKi8KLSAgICBjaGFyICppbnB1dF9maWxlX3NhdmU7CS8qIFNhdmVkIHN0YXRlIG9mIGlucHV0IHJvdXRpbmVzICovCi0gICAgY2hhciAqc2F2ZWRfcG9zaXRpb247CS8qIENhbGxlcidzIHNhdmVkIHBvc2l0aW9uIGluIGJ1ZiAqLwotICB9OwotCi1zdGF0aWMgc3RydWN0IGlucHV0X3NhdmUgKmlucHV0X3NjcnViX3B1c2ggUEFSQU1TICgoY2hhciAqc2F2ZWRfcG9zaXRpb24pKTsKLXN0YXRpYyBjaGFyICppbnB1dF9zY3J1Yl9wb3AgUEFSQU1TICgoc3RydWN0IGlucHV0X3NhdmUgKmFyZykpOwotc3RhdGljIHZvaWQgYXNfMV9jaGFyIFBBUkFNUyAoKHVuc2lnbmVkIGludCBjLCBGSUxFICogc3RyZWFtKSk7Ci0KLS8qIFNhdmVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlIHRoYXQgLmluY2x1ZGUnZCB0aGlzIG9uZS4gIFdoZW4gd2UgaGl0IEVPRiwKLSAgIHdlIGF1dG9tYXRpY2FsbHkgcG9wIHRvIHRoYXQgZmlsZS4gKi8KLQotc3RhdGljIHN0cnVjdCBpbnB1dF9zYXZlICpuZXh0X3NhdmVkX2ZpbGU7Ci0KLS8qIFB1c2ggdGhlIHN0YXRlIG9mIGlucHV0IHJlYWRpbmcgYW5kIHNjcnViYmluZyBzbyB0aGF0IHdlIGNhbiAjaW5jbHVkZS4KLSAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSAndm9pZCAqJyAoZnVkZ2VkIGZvciBvbGQgY29tcGlsZXJzKSB0byBhIHNhdmUKLSAgIGFyZWEsIHdoaWNoIGNhbiBiZSByZXN0b3JlZCBieSBwYXNzaW5nIGl0IHRvIGlucHV0X3NjcnViX3BvcCgpLiAqLwotc3RhdGljIHN0cnVjdCBpbnB1dF9zYXZlICoKLWlucHV0X3NjcnViX3B1c2ggKHNhdmVkX3Bvc2l0aW9uKQotICAgICBjaGFyICpzYXZlZF9wb3NpdGlvbjsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGlucHV0X3NhdmUgKnNhdmVkOwotCi0gIHNhdmVkID0gKHN0cnVjdCBpbnB1dF9zYXZlICopIHhtYWxsb2MgKHNpemVvZiAqc2F2ZWQpOwotCi0gIHNhdmVkLT5zYXZlZF9wb3NpdGlvbiA9IHNhdmVkX3Bvc2l0aW9uOwotICBzYXZlZC0+YnVmZmVyX3N0YXJ0ID0gYnVmZmVyX3N0YXJ0OwotICBzYXZlZC0+cGFydGlhbF93aGVyZSA9IHBhcnRpYWxfd2hlcmU7Ci0gIHNhdmVkLT5wYXJ0aWFsX3NpemUgPSBwYXJ0aWFsX3NpemU7Ci0gIHNhdmVkLT5idWZmZXJfbGVuZ3RoID0gYnVmZmVyX2xlbmd0aDsKLSAgc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2ZpbGUgPSBwaHlzaWNhbF9pbnB1dF9maWxlOwotICBzYXZlZC0+bG9naWNhbF9pbnB1dF9maWxlID0gbG9naWNhbF9pbnB1dF9maWxlOwotICBzYXZlZC0+cGh5c2ljYWxfaW5wdXRfbGluZSA9IHBoeXNpY2FsX2lucHV0X2xpbmU7Ci0gIHNhdmVkLT5sb2dpY2FsX2lucHV0X2xpbmUgPSBsb2dpY2FsX2lucHV0X2xpbmU7Ci0gIHNhdmVkLT5zYl9pbmRleCA9IHNiX2luZGV4OwotICBzYXZlZC0+ZnJvbV9zYiA9IGZyb21fc2I7Ci0gIG1lbWNweSAoc2F2ZWQtPnNhdmVfc291cmNlLCBzYXZlX3NvdXJjZSwgc2l6ZW9mIChzYXZlX3NvdXJjZSkpOwotICBzYXZlZC0+bmV4dF9zYXZlZF9maWxlID0gbmV4dF9zYXZlZF9maWxlOwotICBzYXZlZC0+aW5wdXRfZmlsZV9zYXZlID0gaW5wdXRfZmlsZV9wdXNoICgpOwotCi0gIGlucHV0X2ZpbGVfYmVnaW4gKCk7CQkvKiBSZWluaXRpYWxpemUhICovCi0gIGxvZ2ljYWxfaW5wdXRfbGluZSA9IC0xOwotICBsb2dpY2FsX2lucHV0X2ZpbGUgPSAoY2hhciAqKSBOVUxMOwotICBidWZmZXJfbGVuZ3RoID0gaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKTsKLSAgc2JfaW5kZXggPSAtMTsKLQotICBidWZmZXJfc3RhcnQgPSB4bWFsbG9jICgoQkVGT1JFX1NJWkUgKyBidWZmZXJfbGVuZ3RoICsgYnVmZmVyX2xlbmd0aCArIEFGVEVSX1NJWkUpKTsKLSAgbWVtY3B5IChidWZmZXJfc3RhcnQsIEJFRk9SRV9TVFJJTkcsIChpbnQpIEJFRk9SRV9TSVpFKTsKLQotICByZXR1cm4gc2F2ZWQ7Ci19CQkJCS8qIGlucHV0X3NjcnViX3B1c2goKSAqLwotCi1zdGF0aWMgY2hhciAqCi1pbnB1dF9zY3J1Yl9wb3AgKHNhdmVkKQotICAgICBzdHJ1Y3QgaW5wdXRfc2F2ZSAqc2F2ZWQ7Ci17Ci0gIGNoYXIgKnNhdmVkX3Bvc2l0aW9uOwotCi0gIGlucHV0X3NjcnViX2VuZCAoKTsJCS8qIEZpbmlzaCBvZmYgb2xkIGJ1ZmZlciAqLwotCi0gIGlucHV0X2ZpbGVfcG9wIChzYXZlZC0+aW5wdXRfZmlsZV9zYXZlKTsKLSAgc2F2ZWRfcG9zaXRpb24gPSBzYXZlZC0+c2F2ZWRfcG9zaXRpb247Ci0gIGJ1ZmZlcl9zdGFydCA9IHNhdmVkLT5idWZmZXJfc3RhcnQ7Ci0gIGJ1ZmZlcl9sZW5ndGggPSBzYXZlZC0+YnVmZmVyX2xlbmd0aDsKLSAgcGh5c2ljYWxfaW5wdXRfZmlsZSA9IHNhdmVkLT5waHlzaWNhbF9pbnB1dF9maWxlOwotICBsb2dpY2FsX2lucHV0X2ZpbGUgPSBzYXZlZC0+bG9naWNhbF9pbnB1dF9maWxlOwotICBwaHlzaWNhbF9pbnB1dF9saW5lID0gc2F2ZWQtPnBoeXNpY2FsX2lucHV0X2xpbmU7Ci0gIGxvZ2ljYWxfaW5wdXRfbGluZSA9IHNhdmVkLT5sb2dpY2FsX2lucHV0X2xpbmU7Ci0gIHNiX2luZGV4ID0gc2F2ZWQtPnNiX2luZGV4OwotICBmcm9tX3NiID0gc2F2ZWQtPmZyb21fc2I7Ci0gIHBhcnRpYWxfd2hlcmUgPSBzYXZlZC0+cGFydGlhbF93aGVyZTsKLSAgcGFydGlhbF9zaXplID0gc2F2ZWQtPnBhcnRpYWxfc2l6ZTsKLSAgbmV4dF9zYXZlZF9maWxlID0gc2F2ZWQtPm5leHRfc2F2ZWRfZmlsZTsKLSAgbWVtY3B5IChzYXZlX3NvdXJjZSwgc2F2ZWQtPnNhdmVfc291cmNlLCBzaXplb2YgKHNhdmVfc291cmNlKSk7Ci0KLSAgZnJlZSAoc2F2ZWQpOwotICByZXR1cm4gc2F2ZWRfcG9zaXRpb247Ci19Ci0MCi0KLXZvaWQKLWlucHV0X3NjcnViX2JlZ2luICgpCi17Ci0gIGtub3cgKHN0cmxlbiAoQkVGT1JFX1NUUklORykgPT0gQkVGT1JFX1NJWkUpOwotICBrbm93IChzdHJsZW4gKEFGVEVSX1NUUklORykgPT0gQUZURVJfU0laRSB8fCAoQUZURVJfU1RSSU5HWzBdID09ICdcMCcgJiYgQUZURVJfU0laRSA9PSAxKSk7Ci0KLSAgaW5wdXRfZmlsZV9iZWdpbiAoKTsKLQotICBidWZmZXJfbGVuZ3RoID0gaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKTsKLQotICBidWZmZXJfc3RhcnQgPSB4bWFsbG9jICgoQkVGT1JFX1NJWkUgKyBidWZmZXJfbGVuZ3RoICsgYnVmZmVyX2xlbmd0aCArIEFGVEVSX1NJWkUpKTsKLSAgbWVtY3B5IChidWZmZXJfc3RhcnQsIEJFRk9SRV9TVFJJTkcsIChpbnQpIEJFRk9SRV9TSVpFKTsKLQotICAvKiBMaW5lIG51bWJlciB0aGluZ3MuICovCi0gIGxvZ2ljYWxfaW5wdXRfbGluZSA9IC0xOwotICBsb2dpY2FsX2lucHV0X2ZpbGUgPSAoY2hhciAqKSBOVUxMOwotICBwaHlzaWNhbF9pbnB1dF9maWxlID0gTlVMTDsJLyogTm8gZmlsZSByZWFkIHlldC4gKi8KLSAgbmV4dF9zYXZlZF9maWxlID0gTlVMTDsJLyogQXQgRU9GLCBkb24ndCBwb3AgdG8gYW55IG90aGVyIGZpbGUgKi8KLSAgZG9fc2NydWJfYmVnaW4gKGZsYWdfbTY4a19tcmkpOwotfQotCi12b2lkCi1pbnB1dF9zY3J1Yl9lbmQgKCkKLXsKLSAgaWYgKGJ1ZmZlcl9zdGFydCkKLSAgICB7Ci0gICAgICBmcmVlIChidWZmZXJfc3RhcnQpOwotICAgICAgYnVmZmVyX3N0YXJ0ID0gMDsKLSAgICAgIGlucHV0X2ZpbGVfZW5kICgpOwotICAgIH0KLX0KLQotLyogU3RhcnQgcmVhZGluZyBpbnB1dCBmcm9tIGEgbmV3IGZpbGUuICovCi0KLWNoYXIgKgkJCQkvKiBSZXR1cm4gc3RhcnQgb2YgY2FsbGVyJ3MgcGFydCBvZiBidWZmZXIuICovCi1pbnB1dF9zY3J1Yl9uZXdfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpbnB1dF9maWxlX29wZW4gKGZpbGVuYW1lLCAhZmxhZ19ub19jb21tZW50cyk7Ci0gIHBoeXNpY2FsX2lucHV0X2ZpbGUgPSBmaWxlbmFtZVswXSA/IGZpbGVuYW1lIDogXygie3N0YW5kYXJkIGlucHV0fSIpOwotICBwaHlzaWNhbF9pbnB1dF9saW5lID0gMDsKLQotICBwYXJ0aWFsX3NpemUgPSAwOwotICByZXR1cm4gKGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFKTsKLX0KLQotCi0vKiBJbmNsdWRlIGEgZmlsZSBmcm9tIHRoZSBjdXJyZW50IGZpbGUuICBTYXZlIG91ciBzdGF0ZSwgY2F1c2UgaXQgdG8KLSAgIGJlIHJlc3RvcmVkIG9uIEVPRiwgYW5kIGJlZ2luIGhhbmRsaW5nIGEgbmV3IGZpbGUuICBTYW1lIHJlc3VsdCBhcwotICAgaW5wdXRfc2NydWJfbmV3X2ZpbGUuICovCi0KLWNoYXIgKgotaW5wdXRfc2NydWJfaW5jbHVkZV9maWxlIChmaWxlbmFtZSwgcG9zaXRpb24pCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotICAgICBjaGFyICpwb3NpdGlvbjsKLXsKLSAgbmV4dF9zYXZlZF9maWxlID0gaW5wdXRfc2NydWJfcHVzaCAocG9zaXRpb24pOwotICByZXR1cm4gaW5wdXRfc2NydWJfbmV3X2ZpbGUgKGZpbGVuYW1lKTsKLX0KLQotLyogU3RhcnQgZ2V0dGluZyBpbnB1dCBmcm9tIGFuIHNiIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB3aGVuCi0gICBleHBhbmRpbmcgYSBtYWNyby4gICovCi0KLXZvaWQKLWlucHV0X3NjcnViX2luY2x1ZGVfc2IgKGZyb20sIHBvc2l0aW9uKQotICAgICBzYiAqZnJvbTsKLSAgICAgY2hhciAqcG9zaXRpb247Ci17Ci0gIGlmIChtYWNyb19uZXN0ID4gbWF4X21hY3JvX25lc3QpCi0gICAgYXNfZmF0YWwgKF8oIm1hY3JvcyBuZXN0ZWQgdG9vIGRlZXBseSIpKTsKLSAgKyttYWNyb19uZXN0OwotCi0gIG5leHRfc2F2ZWRfZmlsZSA9IGlucHV0X3NjcnViX3B1c2ggKHBvc2l0aW9uKTsKLQotICBzYl9uZXcgKCZmcm9tX3NiKTsKLSAgaWYgKGZyb20tPmxlbiA+PSAxICYmIGZyb20tPnB0clswXSAhPSAnXG4nKQotICAgIHsKLSAgICAgIC8qIEFkZCB0aGUgc2VudGluZWwgcmVxdWlyZWQgYnkgcmVhZC5jLiAgKi8KLSAgICAgIHNiX2FkZF9jaGFyICgmZnJvbV9zYiwgJ1xuJyk7Ci0gICAgfQotICBzYl9hZGRfc2IgKCZmcm9tX3NiLCBmcm9tKTsKLSAgc2JfaW5kZXggPSAxOwotCi0gIC8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVzZXQgYnkgaW5wdXRfc2NydWJfcHVzaC4gIFJlc3RvcmUgdGhlbQotICAgICBzaW5jZSB3ZSBhcmUsIGFmdGVyIGFsbCwgc3RpbGwgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGhlIGZpbGUuICAqLwotICBsb2dpY2FsX2lucHV0X2xpbmUgPSBuZXh0X3NhdmVkX2ZpbGUtPmxvZ2ljYWxfaW5wdXRfbGluZTsKLSAgbG9naWNhbF9pbnB1dF9maWxlID0gbmV4dF9zYXZlZF9maWxlLT5sb2dpY2FsX2lucHV0X2ZpbGU7Ci19Ci0KLXZvaWQKLWlucHV0X3NjcnViX2Nsb3NlICgpCi17Ci0gIGlucHV0X2ZpbGVfY2xvc2UgKCk7Ci19Ci0KLWNoYXIgKgotaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKGJ1ZnApCi0gICAgIGNoYXIgKipidWZwOwotewotICByZWdpc3RlciBjaGFyICpsaW1pdDsJCS8qLT5qdXN0IGFmdGVyIGxhc3QgY2hhciBvZiBidWZmZXIuICovCi0KLSAgaWYgKHNiX2luZGV4ID49IDApCi0gICAgewotICAgICAgaWYgKHNiX2luZGV4ID49IGZyb21fc2IubGVuKQotCXsKLQkgIHNiX2tpbGwgKCZmcm9tX3NiKTsKLQkgIGNvbmRfZmluaXNoX2NoZWNrIChtYWNyb19uZXN0KTsKLQkgIC0tbWFjcm9fbmVzdDsKLQkgIHBhcnRpYWxfd2hlcmUgPSBOVUxMOwotCSAgaWYgKG5leHRfc2F2ZWRfZmlsZSAhPSBOVUxMKQotCSAgICAqYnVmcCA9IGlucHV0X3NjcnViX3BvcCAobmV4dF9zYXZlZF9maWxlKTsKLQkgIHJldHVybiBwYXJ0aWFsX3doZXJlOwotCX0KLQotICAgICAgcGFydGlhbF93aGVyZSA9IGZyb21fc2IucHRyICsgZnJvbV9zYi5sZW47Ci0gICAgICBwYXJ0aWFsX3NpemUgPSAwOwotICAgICAgKmJ1ZnAgPSBmcm9tX3NiLnB0ciArIHNiX2luZGV4OwotICAgICAgc2JfaW5kZXggPSBmcm9tX3NiLmxlbjsKLSAgICAgIHJldHVybiBwYXJ0aWFsX3doZXJlOwotICAgIH0KLQotICAqYnVmcCA9IGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFOwotCi0gIGlmIChwYXJ0aWFsX3NpemUpCi0gICAgewotICAgICAgbWVtY3B5IChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSwgcGFydGlhbF93aGVyZSwKLQkgICAgICAodW5zaWduZWQgaW50KSBwYXJ0aWFsX3NpemUpOwotICAgICAgbWVtY3B5IChidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSwgc2F2ZV9zb3VyY2UsIEFGVEVSX1NJWkUpOwotICAgIH0KLSAgbGltaXQgPSBpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIgKGJ1ZmZlcl9zdGFydAotCQkJCSAgICAgICArIEJFRk9SRV9TSVpFCi0JCQkJICAgICAgICsgcGFydGlhbF9zaXplKTsKLSAgaWYgKGxpbWl0KQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGNoYXIgKnA7CQkvKiBGaW5kIGxhc3QgbmV3bGluZS4gKi8KLQotICAgICAgZm9yIChwID0gbGltaXQgLSAxOyAqcCAhPSAnXG4nOyAtLXApCi0JOwotICAgICAgKytwOwotCi0gICAgICB3aGlsZSAocCA8PSBidWZmZXJfc3RhcnQgKyBCRUZPUkVfU0laRSkKLQl7Ci0JICBpbnQgbGltb2ZmOwotCi0JICBsaW1vZmYgPSBsaW1pdCAtIGJ1ZmZlcl9zdGFydDsKLQkgIGJ1ZmZlcl9sZW5ndGggKz0gaW5wdXRfZmlsZV9idWZmZXJfc2l6ZSAoKTsKLQkgIGJ1ZmZlcl9zdGFydCA9IHhyZWFsbG9jIChidWZmZXJfc3RhcnQsCi0JCQkJICAgKEJFRk9SRV9TSVpFCi0JCQkJICAgICsgMiAqIGJ1ZmZlcl9sZW5ndGgKLQkJCQkgICAgKyBBRlRFUl9TSVpFKSk7Ci0JICAqYnVmcCA9IGJ1ZmZlcl9zdGFydCArIEJFRk9SRV9TSVpFOwotCSAgbGltaXQgPSBpbnB1dF9maWxlX2dpdmVfbmV4dF9idWZmZXIgKGJ1ZmZlcl9zdGFydCArIGxpbW9mZik7Ci0KLQkgIGlmIChsaW1pdCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygicGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiKSk7Ci0JICAgICAgcGFydGlhbF93aGVyZSA9IE5VTEw7Ci0JICAgICAgaWYgKG5leHRfc2F2ZWRfZmlsZSkKLQkJKmJ1ZnAgPSBpbnB1dF9zY3J1Yl9wb3AgKG5leHRfc2F2ZWRfZmlsZSk7Ci0JICAgICAgcmV0dXJuIE5VTEw7Ci0JICAgIH0KLQotCSAgZm9yIChwID0gbGltaXQgLSAxOyAqcCAhPSAnXG4nOyAtLXApCi0JICAgIDsKLQkgICsrcDsKLQl9Ci0KLSAgICAgIHBhcnRpYWxfd2hlcmUgPSBwOwotICAgICAgcGFydGlhbF9zaXplID0gbGltaXQgLSBwOwotICAgICAgbWVtY3B5IChzYXZlX3NvdXJjZSwgcGFydGlhbF93aGVyZSwgKGludCkgQUZURVJfU0laRSk7Ci0gICAgICBtZW1jcHkgKHBhcnRpYWxfd2hlcmUsIEFGVEVSX1NUUklORywgKGludCkgQUZURVJfU0laRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcGFydGlhbF93aGVyZSA9IDA7Ci0gICAgICBpZiAocGFydGlhbF9zaXplID4gMCkKLQl7Ci0JICBhc193YXJuIChfKCJQYXJ0aWFsIGxpbmUgYXQgZW5kIG9mIGZpbGUgaWdub3JlZCIpKTsKLQl9Ci0KLSAgICAgIC8qIFRlbGwgdGhlIGxpc3Rpbmcgd2UndmUgZmluaXNoZWQgdGhlIGZpbGUuICAqLwotICAgICAgTElTVElOR19FT0YgKCk7Ci0KLSAgICAgIC8qIElmIHdlIHNob3VsZCBwb3AgdG8gYW5vdGhlciBmaWxlIGF0IEVPRiwgZG8gaXQuICovCi0gICAgICBpZiAobmV4dF9zYXZlZF9maWxlKQotCXsKLQkgICpidWZwID0gaW5wdXRfc2NydWJfcG9wIChuZXh0X3NhdmVkX2ZpbGUpOwkvKiBQb3Agc3RhdGUgKi8KLQkgIC8qIHBhcnRpYWxfd2hlcmUgaXMgbm93IGNvcnJlY3QgdG8gcmV0dXJuLCBzaW5jZSB3ZSBwb3BwZWQgaXQuICovCi0JfQotICAgIH0KLSAgcmV0dXJuIChwYXJ0aWFsX3doZXJlKTsKLX0JCQkJLyogaW5wdXRfc2NydWJfbmV4dF9idWZmZXIoKSAqLwotDAotLyoKLSAqIFRoZSByZW1haW5pbmcgcGFydCBvZiB0aGlzIGZpbGUgZGVhbHMgd2l0aCBsaW5lIG51bWJlcnMsIGVycm9yCi0gKiBtZXNzYWdlcyBhbmQgc28gb24uCi0gKi8KLQotCi1pbnQKLXNlZW5fYXRfbGVhc3RfMV9maWxlICgpCQkvKiBUUlVFIGlmIHdlIG9wZW5lZCBhbnkgZmlsZS4gKi8KLXsKLSAgcmV0dXJuIChwaHlzaWNhbF9pbnB1dF9maWxlICE9IE5VTEwpOwotfQotCi12b2lkCi1idW1wX2xpbmVfY291bnRlcnMgKCkKLXsKLSAgaWYgKHNiX2luZGV4IDwgMCkKLSAgICB7Ci0gICAgICArK3BoeXNpY2FsX2lucHV0X2xpbmU7Ci0gICAgICBpZiAobG9naWNhbF9pbnB1dF9saW5lID49IDApCi0JKytsb2dpY2FsX2lucHV0X2xpbmU7Ci0gICAgfQotfQotDAotLyoKLSAqCQkJbmV3X2xvZ2ljYWxfbGluZSgpCi0gKgotICogVGVsbHMgdXMgd2hhdCB0aGUgbmV3IGxvZ2ljYWwgbGluZSBudW1iZXIgYW5kIGZpbGUgYXJlLgotICogSWYgdGhlIGxpbmVfbnVtYmVyIGlzIC0xLCB3ZSBkb24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgbG9naWNhbCBsaW5lCi0gKiBudW1iZXIuICBJZiBpdCBpcyAtMiwgd2UgZGVjcmVtZW50IHRoZSBsb2dpY2FsIGxpbmUgbnVtYmVyICh0aGlzIGlzCi0gKiB0byBzdXBwb3J0IHRoZSAuYXBwZmlsZSBwc2V1ZG8tb3AgaW5zZXJ0ZWQgaW50byB0aGUgc3RyZWFtIGJ5Ci0gKiBkb19zY3J1Yl9jaGFycykuCi0gKiBJZiB0aGUgZm5hbWUgaXMgTlVMTCwgd2UgZG9uJ3QgY2hhbmdlIHRoZSBjdXJyZW50IGxvZ2ljYWwgZmlsZSBuYW1lLgotICogUmV0dXJucyBub256ZXJvIGlmIHRoZSBmaWxlbmFtZSBhY3R1YWxseSBjaGFuZ2VzLgotICovCi1pbnQKLW5ld19sb2dpY2FsX2xpbmUgKGZuYW1lLCBsaW5lX251bWJlcikKLSAgICAgY2hhciAqZm5hbWU7CQkvKiBET04nVCBkZXN0cm95IGl0ISBXZSBwb2ludCB0byBpdCEgKi8KLSAgICAgaW50IGxpbmVfbnVtYmVyOwotewotICBpZiAobGluZV9udW1iZXIgPj0gMCkKLSAgICBsb2dpY2FsX2lucHV0X2xpbmUgPSBsaW5lX251bWJlcjsKLSAgZWxzZSBpZiAobGluZV9udW1iZXIgPT0gLTIgJiYgbG9naWNhbF9pbnB1dF9saW5lID4gMCkKLSAgICAtLWxvZ2ljYWxfaW5wdXRfbGluZTsKLQotICBpZiAoZm5hbWUKLSAgICAgICYmIChsb2dpY2FsX2lucHV0X2ZpbGUgPT0gTlVMTAotCSAgfHwgc3RyY21wIChsb2dpY2FsX2lucHV0X2ZpbGUsIGZuYW1lKSkpCi0gICAgewotICAgICAgbG9naWNhbF9pbnB1dF9maWxlID0gZm5hbWU7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0JCQkJLyogbmV3X2xvZ2ljYWxfbGluZSgpICovCi0MCi0vKgotICoJCQlhIHMgXyB3IGggZSByIGUgKCkKLSAqCi0gKiBSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlci4KLSAqIG5hbWVwIHNob3VsZCBiZSBjaGFyICogY29uc3QgKiwgYnV0IHRoZXJlIGFyZSBjb21waWxlcnMgd2hpY2ggc2NyZXcKLSAqIHVwIGRlY2xhcmF0aW9ucyBsaWtlIHRoYXQsIGFuZCBpdCdzIGVhc2llciB0byBhdm9pZCBpdC4KLSAqLwotdm9pZCAKLWFzX3doZXJlIChuYW1lcCwgbGluZXApCi0gICAgIGNoYXIgKipuYW1lcDsKLSAgICAgdW5zaWduZWQgaW50ICpsaW5lcDsKLXsKLSAgaWYgKGxvZ2ljYWxfaW5wdXRfZmlsZSAhPSBOVUxMCi0gICAgICAmJiAobGluZXAgPT0gTlVMTCB8fCBsb2dpY2FsX2lucHV0X2xpbmUgPj0gMCkpCi0gICAgewotICAgICAgKm5hbWVwID0gbG9naWNhbF9pbnB1dF9maWxlOwotICAgICAgaWYgKGxpbmVwICE9IE5VTEwpCi0JKmxpbmVwID0gbG9naWNhbF9pbnB1dF9saW5lOwotICAgIH0KLSAgZWxzZSBpZiAocGh5c2ljYWxfaW5wdXRfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgICpuYW1lcCA9IHBoeXNpY2FsX2lucHV0X2ZpbGU7Ci0gICAgICBpZiAobGluZXAgIT0gTlVMTCkKLQkqbGluZXAgPSBwaHlzaWNhbF9pbnB1dF9saW5lOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICpuYW1lcCA9IDA7Ci0gICAgICBpZiAobGluZXAgIT0gTlVMTCkKLQkqbGluZXAgPSAwOwotICAgIH0KLX0JCQkJLyogYXNfd2hlcmUoKSAqLwotDAotCi0KLQotLyoKLSAqCQkJYSBzIF8gaCBvIHcgbSB1IGMgaCAoKQotICoKLSAqIE91dHB1dCB0byBnaXZlbiBzdHJlYW0gaG93IG11Y2ggb2YgbGluZSB3ZSBoYXZlIHNjYW5uZWQgc28gZmFyLgotICogQXNzdW1lcyB3ZSBoYXZlIHNjYW5uZWQgdXAgdG8gYW5kIGluY2x1ZGluZyBpbnB1dF9saW5lX3BvaW50ZXIuCi0gKiBObyBmcmVlICdcbicgYXQgZW5kIG9mIGxpbmUuCi0gKi8KLXZvaWQKLWFzX2hvd211Y2ggKHN0cmVhbSkKLSAgICAgRklMRSAqc3RyZWFtOwkJLyogT3BlbmVkIGZvciB3cml0ZSBwbGVhc2UuICovCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7CQkvKiBTY2FuIGlucHV0IGxpbmUuICovCi0gIC8qIHJlZ2lzdGVyIGNoYXIgYzsgSkYgdW51c2VkICovCi0KLSAgZm9yIChwID0gaW5wdXRfbGluZV9wb2ludGVyIC0gMTsgKnAgIT0gJ1xuJzsgLS1wKQotICAgIHsKLSAgICB9Ci0gICsrcDsJCQkJLyogcC0+MXN0IGNoYXIgb2YgbGluZS4gKi8KLSAgZm9yICg7IHAgPD0gaW5wdXRfbGluZV9wb2ludGVyOyBwKyspCi0gICAgewotICAgICAgLyogQXNzdW1lIEFTQ0lJLiBFQkNESUMgJiBvdGhlciBtaWNyby1jb21wdXRlciBjaGFyIHNldHMgaWdub3JlZC4gKi8KLSAgICAgIGFzXzFfY2hhciAoKHVuc2lnbmVkIGNoYXIpICpwLCBzdHJlYW0pOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgCi1hc18xX2NoYXIgKGMsIHN0cmVhbSkKLSAgICAgdW5zaWduZWQgaW50IGM7Ci0gICAgIEZJTEUgKnN0cmVhbTsKLXsKLSAgaWYgKGMgPiAxMjcpCi0gICAgewotICAgICAgKHZvaWQpIHB1dGMgKCclJywgc3RyZWFtKTsKLSAgICAgIGMgLT0gMTI4OwotICAgIH0KLSAgaWYgKGMgPCAzMikKLSAgICB7Ci0gICAgICAodm9pZCkgcHV0YyAoJ14nLCBzdHJlYW0pOwotICAgICAgYyArPSAnQCc7Ci0gICAgfQotICAodm9pZCkgcHV0YyAoYywgc3RyZWFtKTsKLX0KLQotLyogZW5kIG9mIGlucHV0X3NjcnViLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9pdGJsLWxleC5sIGIvZ2FzL2l0YmwtbGV4LmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MDVkZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL2l0YmwtbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyogaXRibC1sZXgubAotICAgQ29weXJpZ2h0IChDKSAxOTk3ICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSV7Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgIml0YmwtcGFyc2UuaCIKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2RlZmluZSBNREJHKHgpIHByaW50ZiB4Ci0jZWxzZQotI2RlZmluZSBEQkcoeCkKLSNkZWZpbmUgTURCRyh4KQotI2VuZGlmCi0KLWludCBpbnNudGJsX2xpbmUgPSAxOwotJX0KLQotQUxOVU0JW0EtWmEtejAtOV9dCi1ESUdJVAlbMC05XQotQUxQSEEJW0EtWmEtel9dCi1IRVgJWzAtOUEtRmEtZl0KLQotJSUKLQotImNyZWcifCJDUkVHIiB7Ci0gICAgcmV0dXJuIENSRUc7Ci0gIH0KLSJkcmVnInwiRFJFRyIgewotICAgIHJldHVybiBEUkVHOwotICB9Ci0iZ3JlZyJ8IkdSRUciIHsKLSAgICByZXR1cm4gR1JFRzsKLSAgfQotImltbWVkInwiSU1NRUQiIHsKLSAgICByZXR1cm4gSU1NRUQ7Ci0gIH0KLSJhZGRyInwiQUREUiIgewotICAgIHJldHVybiBBRERSOwotICB9Ci0iaW5zbiJ8IklOU04iIHsKLSAgICByZXR1cm4gSU5TTjsKLSAgfQotInAie0RJR0lUfSB7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5wcm9jZXNzb3IgPSBzdHJ0b3VsICh5eXRleHQrMSwgMCwgMCk7Ci0gICAgcmV0dXJuIFBOVU07Ci0gIH0KLXtESUdJVH0rIHsKLSAgICB5eXRleHRbeXlsZW5nXSA9IDA7Ci0gICAgeXlsdmFsLm51bSA9IHN0cnRvdWwgKHl5dGV4dCwgMCwgMCk7Ci0gICAgcmV0dXJuIE5VTTsKLSAgfQotIjB4IntIRVh9KyB7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5udW0gPSBzdHJ0b3VsICh5eXRleHQsIDAsIDApOwotICAgIHJldHVybiBOVU07Ci0gIH0KLXtBTFBIQX17QUxOVU19Kgl7Ci0gICAgeXl0ZXh0W3l5bGVuZ10gPSAwOwotICAgIHl5bHZhbC5zdHIgPSBzdHJkdXAgKHl5dGV4dCk7Ci0gICAgcmV0dXJuIElEOwotICB9Ci0iOyJ8IiMiCXsKLSAgICBpbnQgYzsKLSAgICB3aGlsZSAoKGMgPSBpbnB1dCAoKSkgIT0gIEVPRikgCi0gICAgICB7Ci0gICAgICAgIGlmIChjID09ICAnXG4nKSAKLSAgICAJewotICAgIAkJdW5wdXQgKGMpOwotICAgIAkJYnJlYWs7Ci0gICAgCX0KLSAgICAgIH0KLSAgfQotIlxuIgl7IAotICAgIGluc250YmxfbGluZSsrOyAKLSAgICBNREJHICgoImluIGxleCwgTkwgPSAlZCAoeCV4KVxuIiwgTkwsIE5MKSk7Ci0gICAgcmV0dXJuIE5MOyAKLSAgfQotIiAifCJcdCIgeyAKLSAgfQotLiB7Ci0gICAgTURCRyAoKCJjaGFyID0gJXgsICVkXG4iLCB5eXRleHRbMF0sIHl5dGV4dFswXSkpOwotICAgIHJldHVybiB5eXRleHRbMF07Ci0gIH0KLSUlCi0KLSNpZm5kZWYgeXl3cmFwCi1pbnQgCi15eXdyYXAgKCkgCi0gIHsgCi0gICAgcmV0dXJuIDE7IAotICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy9pdGJsLW9wcy5jIGIvZ2FzL2l0Ymwtb3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Y2NhNjAuLjAwMDAwMDAKLS0tIGEvZ2FzL2l0Ymwtb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTYgKzAsMCBAQAotLyogaXRibC1vcHMuYwotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyoKLSAqIEhlcmVpbiBsaWVzIHRoZSBzdXBwb3J0IGZvciBkeW5hbWljIHNwZWNpZmljYXRpb24gb2YgcHJvY2Vzc29yCi0gKiBpbnN0cnVjdGlvbnMgYW5kIHJlZ2lzdGVycy4gIE1uZW1vbmljcywgdmFsdWVzLCBhbmQgZm9ybWF0cyBmb3IgZWFjaAotICogaW5zdHJ1Y3Rpb24gYW5kIHJlZ2lzdGVyIGFyZSBzcGVjaWZpZWQgaW4gYW4gYXNjaWkgZmlsZSBjb25zaXN0aW5nIG9mCi0gKiB0YWJsZSBlbnRyaWVzLiAgVGhlIGdyYW1tYXIgZm9yIHRoZSB0YWJsZSBpcyBkZWZpbmVkIGluIHRoZSBkb2N1bWVudAotICogIlByb2Nlc3NvciBpbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIi4KLSAqCi0gKiBJbnN0cnVjdGlvbnMgdXNlIHRoZSBnbnUgYXNzZW1ibGVyIHN5bnRheCwgd2l0aCB0aGUgYWRkaXRpb24gb2YKLSAqIGFsbG93aW5nIG1uZW1vbmljcyBmb3IgcmVnaXN0ZXIuCi0gKiBFZy4gImZ1bmMgJDIscmVnMywweDEwMCxzeW1ib2wgOyBjb21tZW50IgotICogCWZ1bmMgLSBvcGNvZGUgbmFtZQotICogCSRuIC0gcmVnaXN0ZXIgbgotICogCXJlZzMgLSBtbmVtb25pYyBmb3IgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgZGVmaW5lZCBpbiB0YWJsZQotICogCTB4ZGRkLi5kIC0gaW1tZWRpYXRlIHZhbHVlCi0gKiAJc3ltYm9sIC0gYWRkcmVzcyBvZiBsYWJlbCBvciBleHRlcm5hbCBzeW1ib2wKLSAqCi0gKiBGaXJzdCwgaXRibF9wYXJzZSByZWFkcyBpbiB0aGUgdGFibGUgb2YgcmVnaXN0ZXIgYW5kIGluc3RydWN0aW9uCi0gKiBuYW1lcyBhbmQgZm9ybWF0cywgYW5kIGJ1aWxkcyBhIGxpc3Qgb2YgZW50cmllcyBmb3IgZWFjaAotICogcHJvY2Vzc29yL3R5cGUgY29tYmluYXRpb24uICBsZXggYW5kIHlhY2MgYXJlIHVzZWQgdG8gcGFyc2UKLSAqIHRoZSBlbnRyaWVzIGluIHRoZSB0YWJsZSBhbmQgY2FsbCBmdW5jdGlvbnMgZGVmaW5lZCBoZXJlIHRvCi0gKiBhZGQgZWFjaCBlbnRyeSB0byBvdXIgbGlzdC4KLSAqCi0gKiBUaGVuLCB3aGVuIGFzc2VtYmxpbmcgb3IgZGlzYXNzZW1ibGluZywgdGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgdG8KLSAqIDEpIGdldCBpbmZvcm1hdGlvbiBvbiBhIHByb2Nlc3NvcidzIHJlZ2lzdGVycyBhbmQKLSAqIDIpIGFzc2VtYmxlL2Rpc2Fzc2VtYmxlIGFuIGluc3RydWN0aW9uLgotICogVG8gYXNzZW1ibGUoZGlzYXNzZW1ibGUpIGFuIGluc3RydWN0aW9uLCB0aGUgZnVuY3Rpb24KLSAqIGl0YmxfYXNzZW1ibGUoaXRibF9kaXNhc3NlbWJsZSkgaXMgY2FsbGVkIHRvIHNlYXJjaCB0aGUgbGlzdCBvZgotICogaW5zdHJ1Y3Rpb24gZW50cmllcywgYW5kIGlmIGEgbWF0Y2ggaXMgZm91bmQsIHVzZXMgdGhlIGZvcm1hdAotICogZGVzY3JpYmVkIGluIHRoZSBpbnN0cnVjdGlvbiBlbnRyeSBzdHJ1Y3R1cmUgdG8gY29tcGxldGUgdGhlIGFjdGlvbi4KLSAqCi0gKiBFZy4gU3VwcG9zZSB3ZSBoYXZlIGEgTWlwcyBjb3Byb2Nlc3NvciAiY29wMyIgd2l0aCBkYXRhIHJlZ2lzdGVyICJkMiIKLSAqIGFuZCB3ZSB3YW50IHRvIGRlZmluZSBmdW5jdGlvbiAicGlnIiB3aGljaCB0YWtlcyB0d28gb3BlcmFuZHMuCi0gKgotICogR2l2ZW4gdGhlIHRhYmxlIGVudHJpZXM6Ci0gKiAJInAzIGluc24gcGlnIDB4MToyNC0yMSBkcmVnOjIwLTE2IGltbWVkOjE1LTAiCi0gKiAJInAzIGRyZWcgZDIgMHgyIgotICogYW5kIHRoYXQgdGhlIGluc3RydWN0aW9uIGVuY29kaW5nIGZvciBjb3Byb2Nlc3NvciBweiBoYXMgZW5jb2Rpbmc6Ci0gKiAJI2RlZmluZSBNSVBTX0VOQ09ERV9DT1BfTlVNKHopICgoMHgyMXwoejw8MSkpPDwyNSkKLSAqIAkjZGVmaW5lIElUQkxfRU5DT0RFX1BOVU0ocG51bSkgTUlQU19FTkNPREVfQ09QX05VTShwbnVtKQotICoKLSAqIGEgc3RydWN0dXJlIHRvIGRlc2NyaWJlIHRoZSBpbnN0cnVjdGlvbiBtaWdodCBsb29rIHNvbWV0aGluZyBsaWtlOgotICogICAgICBzdHJ1Y3QgaXRibF9lbnRyeSA9IHsKLSAqICAgICAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yID0gZV9wMwotICogICAgICBlX3R5cGUgdHlwZSA9IGVfaW5zbgotICogICAgICBjaGFyICpuYW1lID0gInBpZyIKLSAqICAgICAgdWludCB2YWx1ZSA9IDB4MQotICogICAgICB1aW50IGZsYWdzID0gMAotICogICAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZSA9IDI0LTIxCi0gKiAgICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpmaWVsZCA9IHsKLSAqICAgICAgICAgICAgICBlX3R5cGUgdHlwZSA9IGVfZHJlZwotICogICAgICAgICAgICAgIHN0cnVjdCBpdGJsX3JhbmdlIHJhbmdlID0gMjAtMTYKLSAqICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9maWVsZCAqbmV4dCA9IHsKLSAqICAgICAgICAgICAgICAgICAgICAgIGVfdHlwZSB0eXBlID0gZV9pbW1lZAotICogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2UgPSAxNS0wCi0gKiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXRibF9maWVsZCAqbmV4dCA9IDAKLSAqICAgICAgICAgICAgICAgICAgICAgIH07Ci0gKiAgICAgICAgICAgICAgfTsKLSAqICAgICAgc3RydWN0IGl0YmxfZW50cnkgKm5leHQgPSAwCi0gKiAgICAgIH07Ci0gKgotICogQW5kIHRoZSBhc3NlbWJsZXIgaW5zdHJ1Y3Rpb25zOgotICogCSJwaWcgZDIsMHgxMDAiCi0gKiAJInBpZyAkMiwweDEwMCIKLSAqCi0gKiB3b3VsZCBib3RoIGFzc2VtYmxlIHRvIHRoZSBoZXggdmFsdWU6Ci0gKiAJIjB4NGUyMjAxMDAiCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgIml0Ymwtb3BzLmgiCi0jaW5jbHVkZSAiaXRibC1wYXJzZS5oIgotCi0vKiAjZGVmaW5lIERFQlVHICovCi0KLSNpZmRlZiBERUJVRwotI2luY2x1ZGUgPGFzc2VydC5oPgotI2RlZmluZSBBU1NFUlQoeCkgYXNzZXJ0KHgpCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgQVNTRVJUKHgpCi0jZGVmaW5lIERCRyh4KQotI2VuZGlmCi0KLSNpZm5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpIChhPGI/YTpiKQotI2VuZGlmCi0KLWludCBpdGJsX2hhdmVfZW50cmllcyA9IDA7Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBzdHJ1Y3R1cmVzIGZvciBrZWVwaW5nIGl0YmwgZm9ybWF0IGVudHJpZXMgKi8KLQotc3RydWN0IGl0YmxfcmFuZ2UKLSAgewotICAgIGludCBzYml0OwkJCS8qIG1hc2sgc3RhcnRpbmcgYml0IHBvc2l0aW9uICovCi0gICAgaW50IGViaXQ7CQkJLyogbWFzayBlbmRpbmcgYml0IHBvc2l0aW9uICovCi0gIH07Ci0KLXN0cnVjdCBpdGJsX2ZpZWxkCi0gIHsKLSAgICBlX3R5cGUgdHlwZTsJCS8qIGRyZWcvY3JlZy9ncmVnL2ltbWVkL3N5bWIgKi8KLSAgICBzdHJ1Y3QgaXRibF9yYW5nZSByYW5nZTsJLyogZmllbGQncyBiaXRmaWVsZCByYW5nZSB3aXRoaW4gaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwkvKiBmaWVsZCBmbGFncyAqLwotICAgIHN0cnVjdCBpdGJsX2ZpZWxkICpuZXh0OwkvKiBuZXh0IGZpZWxkIGluIGxpc3QgKi8KLSAgfTsKLQotCi0vKiBUaGVzZSBzdHJ1Y3R1cmVzIGRlZmluZSB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMgZm9yIGEgcHJvY2Vzc29yLgotICogSWYgdGhlIHR5cGUgaXMgYW4gaW5zdHJ1Y3Rpb24sIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgZm9ybWF0IG9mIGFuCi0gKiBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgZmllbGRzIGFyZSB0aGUgbGlzdCBvZiBvcGVyYW5kcy4KLSAqIFRoZSBmbGFncyBmaWVsZCBiZWxvdyB1c2VzIHRoZSBzYW1lIHZhbHVlcyBhcyB0aG9zZSBkZWZpbmVkIGluIHRoZQotICogZ251IGFzc2VtYmxlciBhbmQgYXJlIG1hY2hpbmUgc3BlY2lmaWMuICovCi1zdHJ1Y3QgaXRibF9lbnRyeQotICB7Ci0gICAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yOwkvKiBwcm9jZXNzb3IgbnVtYmVyICovCi0gICAgZV90eXBlIHR5cGU7CQkvKiBkcmVnL2NyZWcvZ3JlZy9pbnNuICovCi0gICAgY2hhciAqbmFtZTsJCQkvKiBtbmVtaW9uaWMgbmFtZSBmb3IgaW5zbi9yZWdpc3RlciAqLwotICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7CS8qIG9wY29kZS9pbnN0cnVjdGlvbiBtYXNrL3JlZ2lzdGVyIG51bWJlciAqLwotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGVmZmVjdHMgb2YgdGhlIGluc3RydWN0aW9uICovCi0gICAgc3RydWN0IGl0YmxfcmFuZ2UgcmFuZ2U7CS8qIGJpdCByYW5nZSB3aXRoaW4gaW5zdHJ1Y3Rpb24gZm9yIHZhbHVlICovCi0gICAgc3RydWN0IGl0YmxfZmllbGQgKmZpZWxkczsJLyogbGlzdCBvZiBvcGVyYW5kIGRlZmluaXRpb25zIChpZiBhbnkpICovCi0gICAgc3RydWN0IGl0YmxfZW50cnkgKm5leHQ7CS8qIG5leHQgZW50cnkgKi8KLSAgfTsKLQotCi0vKiBsb2NhbCBkYXRhIGFuZCBzdHJ1Y3R1cmVzICovCi0KLXN0YXRpYyBpbnQgaXRibF9udW1fb3Bjb2RlcyA9IDA7Ci0vKiBBcnJheSBvZiBlbnRyaWVzIGZvciBlYWNoIHByb2Nlc3NvciBhbmQgZW50cnkgdHlwZSAqLwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICplbnRyaWVzW2VfbnByb2NzXVtlX250eXBlc10gPQotewotICB7MCwgMCwgMCwgMCwgMCwgMH0sCi0gIHswLCAwLCAwLCAwLCAwLCAwfSwKLSAgezAsIDAsIDAsIDAsIDAsIDB9LAotICB7MCwgMCwgMCwgMCwgMCwgMH0KLX07Ci0KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJ1aWxkX29wY29kZSBQQVJBTVMgKChzdHJ1Y3QgaXRibF9lbnRyeSAqZSkpOwotc3RhdGljIGVfdHlwZSBnZXRfdHlwZSBQQVJBTVMgKChpbnQgeXl0eXBlKSk7Ci1zdGF0aWMgZV9wcm9jZXNzb3IgZ2V0X3Byb2Nlc3NvciBQQVJBTVMgKChpbnQgeXlwcm9jKSk7Ci1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKipnZXRfZW50cmllcyBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAotCQkJCQkJZV90eXBlIHR5cGUpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqZmluZF9lbnRyeV9ieW5hbWUgUEFSQU1TICgoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCAKLQkJCQkJZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUpKTsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqZmluZF9lbnRyeV9ieXZhbCBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAotCQkJZV90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsLCBzdHJ1Y3QgaXRibF9yYW5nZSAqcikpOwotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICphbGxvY19lbnRyeSBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIAotCQllX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYXBwbHlfcmFuZ2UgUEFSQU1TICgodW5zaWduZWQgbG9uZyB2YWx1ZSwgCi0JCQkJCQlzdHJ1Y3QgaXRibF9yYW5nZSByKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHRyYWN0X3JhbmdlIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgdmFsdWUsIAotCQkJCQkJc3RydWN0IGl0YmxfcmFuZ2UgcikpOwotc3RhdGljIHN0cnVjdCBpdGJsX2ZpZWxkICphbGxvY19maWVsZCBQQVJBTVMgKChlX3R5cGUgdHlwZSwgaW50IHNiaXQsIAotCQkJCQlpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykpOwotCi0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKiBJbnRlcmZhY2VzIHRvIHRoZSBwYXJzZXIgKi8KLQotCi0vKiBPcGVuIHRoZSB0YWJsZSBhbmQgdXNlIGxleCBhbmQgeWFjYyB0byBwYXJzZSB0aGUgZW50cmllcy4KLSAqIFJldHVybiAxIGZvciBmYWlsdXJlOyAwIGZvciBzdWNjZXNzLiAgKi8KLQotaW50IAotaXRibF9wYXJzZSAoY2hhciAqaW5zbnRibCkKLXsKLSAgZXh0ZXJuIEZJTEUgKnl5aW47Ci0gIGV4dGVybiBpbnQgeXlwYXJzZSAodm9pZCk7Ci0gIHl5aW4gPSBmb3BlbiAoaW5zbnRibCwgInIiKTsKLSAgaWYgKHl5aW4gPT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCJDYW4ndCBvcGVuIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBzcGVjaWZpY2F0aW9uIGZpbGUgXCIlc1wiXG4iLAotCSAgICAgIGluc250YmwpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKHl5cGFyc2UgKCkpOwotICAgIH0KLSAgZmNsb3NlICh5eWluKTsKLSAgaXRibF9oYXZlX2VudHJpZXMgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLyogQWRkIGEgcmVnaXN0ZXIgZW50cnkgKi8KLQotc3RydWN0IGl0YmxfZW50cnkgKgotaXRibF9hZGRfcmVnIChpbnQgeXlwcm9jZXNzb3IsIGludCB5eXR5cGUsIGNoYXIgKnJlZ25hbWUsCi0JICAgICAgaW50IHJlZ251bSkKLXsKLSNpZiAwCQkJCQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotICAvKiBTaW5jZSByZWdpc3RlciBuYW1lcyBkb24ndCBoYXZlIGEgcHJlZml4LCB3ZSBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCi0gICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBhbHNvIHNpbXBsaWZpZXMgYXJndW1lbnQgcGFyc2luZyBhcwotICAgICB3ZSBjYW4gbGV0IGdhcyBwYXJzZSByZWdpc3RlcnMgZm9yIHVzLiAgVGhlIHJlY29yZGVkIHJlZ2lzdGVyIG51bWJlciBpcwotICAgICByZWdudW0uICAqLwotICAvKiBVc2Ugc3ltYm9sX2NyZWF0ZSBoZXJlIGluc3RlYWQgb2Ygc3ltYm9sX25ldyBzbyB3ZSBkb24ndCB0cnkgdG8KLSAgICAgb3V0cHV0IHJlZ2lzdGVycyBpbnRvIHRoZSBvYmplY3QgZmlsZSdzIHN5bWJvbCB0YWJsZS4gICovCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbF9jcmVhdGUgKHJlZ25hbWUsIHJlZ19zZWN0aW9uLAotCQkJCSAgICAgIHJlZ251bSwgJnplcm9fYWRkcmVzc19mcmFnKSk7Ci0jZW5kaWYKLSAgcmV0dXJuIGFsbG9jX2VudHJ5IChnZXRfcHJvY2Vzc29yICh5eXByb2Nlc3NvciksIGdldF90eXBlICh5eXR5cGUpLCByZWduYW1lLAotCQkgICAgICAodW5zaWduZWQgbG9uZykgcmVnbnVtKTsKLX0KLQotLyogQWRkIGFuIGluc3RydWN0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCBpdGJsX2VudHJ5ICoKLWl0YmxfYWRkX2luc24gKGludCB5eXByb2Nlc3NvciwgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSwKLQkgICAgICAgaW50IHNiaXQsIGludCBlYml0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKLSAgZSA9IGFsbG9jX2VudHJ5IChnZXRfcHJvY2Vzc29yICh5eXByb2Nlc3NvciksIGVfaW5zbiwgbmFtZSwgdmFsdWUpOwotICBpZiAoZSkKLSAgICB7Ci0gICAgICBlLT5yYW5nZS5zYml0ID0gc2JpdDsKLSAgICAgIGUtPnJhbmdlLmViaXQgPSBlYml0OwotICAgICAgZS0+ZmxhZ3MgPSBmbGFnczsKLSAgICAgIGl0YmxfbnVtX29wY29kZXMrKzsKLSAgICB9Ci0gIHJldHVybiBlOwotfQotCi0vKiBBZGQgYW4gb3BlcmFuZCB0byBhbiBpbnN0cnVjdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgaXRibF9maWVsZCAqCi1pdGJsX2FkZF9vcGVyYW5kIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgaW50IHl5dHlwZSwgaW50IHNiaXQsCi0JCSAgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmLCAqKmxhc3RfZjsKLSAgaWYgKCFlKQotICAgIHJldHVybiAwOwotICAvKiBBZGQgdG8gZW5kIG9mIGZpZWxkcycgbGlzdC4gKi8KLSAgZiA9IGFsbG9jX2ZpZWxkIChnZXRfdHlwZSAoeXl0eXBlKSwgc2JpdCwgZWJpdCwgZmxhZ3MpOwotICBpZiAoZikKLSAgICB7Ci0gICAgICBsYXN0X2YgPSAmZS0+ZmllbGRzOwotICAgICAgd2hpbGUgKCpsYXN0X2YpCi0JbGFzdF9mID0gJigqbGFzdF9mKS0+bmV4dDsKLSAgICAgICpsYXN0X2YgPSBmOwotICAgICAgZi0+bmV4dCA9IDA7Ci0gICAgfQotICByZXR1cm4gZjsKLX0KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyogSW50ZXJmYWNlcyBmb3IgYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgKi8KLQotI2lmbmRlZiBTVEFORF9BTE9ORQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3ltYm9scy5oIgotc3RhdGljIHZvaWQgYXBwZW5kX2luc25zX2FzX21hY3JvcyAodm9pZCk7Ci0KLS8qIGluaXRpYWxpemUgZm9yIGdhcyAqLwotdm9pZCAKLWl0YmxfaW5pdCAodm9pZCkKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIGVfcHJvY2Vzc29yIHByb2NuOwotICBlX3R5cGUgdHlwZTsKLQotICBpZiAoIWl0YmxfaGF2ZV9lbnRyaWVzKQotCXJldHVybjsKLQotICAvKiBTaW5jZSByZWdpc3RlciBuYW1lcyBkb24ndCBoYXZlIGEgcHJlZml4LCBwdXQgdGhlbSBpbiB0aGUgc3ltYm9sIHRhYmxlIHNvCi0gICAgIHRoZXkgY2FuJ3QgYmUgdXNlZCBhcyBzeW1ib2xzLiAgVGhpcyBzaW1wbGlmaWVzIGFyZ3VtZW50IHBhcnNpbmcgYXMKLSAgICAgd2UgY2FuIGxldCBnYXMgcGFyc2UgcmVnaXN0ZXJzIGZvciB1cy4gKi8KLSAgLyogVXNlIHN5bWJvbF9jcmVhdGUgaW5zdGVhZCBvZiBzeW1ib2xfbmV3IHNvIHdlIGRvbid0IHRyeSB0bwotICAgICBvdXRwdXQgcmVnaXN0ZXJzIGludG8gdGhlIG9iamVjdCBmaWxlJ3Mgc3ltYm9sIHRhYmxlLiAgKi8KLQotICBmb3IgKHR5cGUgPSBlX3JlZ3R5cGUwOyB0eXBlIDwgZV9ucmVndHlwZXM7IHR5cGUrKykKLSAgICBmb3IgKHByb2NuID0gZV9wMDsgcHJvY24gPCBlX25wcm9jczsgcHJvY24rKykKLSAgICAgIHsKLQllcyA9IGdldF9lbnRyaWVzIChwcm9jbiwgdHlwZSk7Ci0JZm9yIChlID0gKmVzOyBlOyBlID0gZS0+bmV4dCkKLQkgIHsKLQkgICAgc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sX2NyZWF0ZSAoZS0+bmFtZSwgcmVnX3NlY3Rpb24sCi0JCQkJCSAgICAgZS0+dmFsdWUsICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotCSAgfQotICAgICAgfQotICBhcHBlbmRfaW5zbnNfYXNfbWFjcm9zICgpOwotfQotCi0KLS8qIEFwcGVuZCBpbnNucyB0byBvcGNvZGVzIHRhYmxlIGFuZCBpbmNyZWFzZSBudW1iZXIgb2Ygb3Bjb2RlcyAKLSAqIFN0cnVjdHVyZSBvZiBvcGNvZGVzIHRhYmxlOiAKLSAqIHN0cnVjdCBpdGJsX29wY29kZQotICogewotICogICBjb25zdCBjaGFyICpuYW1lOwotICogICBjb25zdCBjaGFyICphcmdzOyAJCS0gc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFyZ3VtZW50cy4gIAotICogICB1bnNpZ25lZCBsb25nIG1hdGNoOyAJLSBvcGNvZGUsIG9yIElTQSBsZXZlbCBpZiBwaW5mbz1JTlNOX01BQ1JPIAotICogICB1bnNpZ25lZCBsb25nIG1hc2s7IAktIG9wY29kZSBtYXNrLCBvciBtYWNybyBpZCBpZiBwaW5mbz1JTlNOX01BQ1JPIAotICogICB1bnNpZ25lZCBsb25nIHBpbmZvOyAJLSBpbnNuIGZsYWdzLCBvciBJTlNOX01BQ1JPIAotICogfTsKLSAqIGV4YW1wbGVzOgotICoJeyJsaSIsICAgICAgInQsaSIsICAweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90ICAgIH0sCi0gKgl7ImxpIiwgICAgICAidCxJIiwgIDAsICAgIChpbnQpIE1fTEksICAgSU5TTl9NQUNSTyAgfSwKLSAqLwotCi1zdGF0aWMgY2hhciAqZm9ybV9hcmdzIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSk7Ci1zdGF0aWMgdm9pZCAKLWFwcGVuZF9pbnNuc19hc19tYWNyb3MgKHZvaWQpCi17Ci0gIHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QgKm5ld19vcGNvZGVzLCAqbzsKLSAgc3RydWN0IGl0YmxfZW50cnkgKmUsICoqZXM7Ci0gIGludCBuLCBpZCwgc2l6ZSwgbmV3X3NpemUsIG5ld19udW1fb3Bjb2RlczsKLQotICBpZiAoIWl0YmxfaGF2ZV9lbnRyaWVzKQotCXJldHVybjsKLQotICBpZiAoIWl0YmxfbnVtX29wY29kZXMpCS8qIG5vIG5ldyBpbnN0cnVjdGlvbnMgdG8gYWRkISAqLwotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIERCRyAoKCJwcmV2aW91cyBudW1fb3Bjb2Rlcz0lZFxuIiwgSVRCTF9OVU1fT1BDT0RFUykpOwotCi0gIG5ld19udW1fb3Bjb2RlcyA9IElUQkxfTlVNX09QQ09ERVMgKyBpdGJsX251bV9vcGNvZGVzOwotICBBU1NFUlQgKG5ld19udW1fb3Bjb2RlcyA+PSBpdGJsX251bV9vcGNvZGVzKTsKLQotICBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUKSAqIElUQkxfTlVNX09QQ09ERVM7Ci0gIEFTU0VSVCAoc2l6ZSA+PSAwKTsKLSAgREJHICgoIkkgZ2V0PSVkXG4iLCBzaXplIC8gc2l6ZW9mIChJVEJMX09QQ09ERVNbMF0pKSk7Ci0KLSAgbmV3X3NpemUgPSBzaXplb2YgKHN0cnVjdCBJVEJMX09QQ09ERV9TVFJVQ1QpICogbmV3X251bV9vcGNvZGVzOwotICBBU1NFUlQgKG5ld19zaXplID4gc2l6ZSk7Ci0KLSAgLyogRklYTUUgc2luY2UgSVRCTF9PUENPREVTIGN1bGQgYmUgYSBzdGF0aWMgdGFibGUsCi0JCXdlIGNhbid0IHJlYWxsb2Mgb3IgZGVsZXRlIHRoZSBvbGQgbWVtb3J5LiAqLwotICBuZXdfb3Bjb2RlcyA9IChzdHJ1Y3QgSVRCTF9PUENPREVfU1RSVUNUICopIG1hbGxvYyAobmV3X3NpemUpOwotICBpZiAoIW5ld19vcGNvZGVzKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGluc3RydWN0aW9uc1xuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHNpemUpCQkJLyogY29weSBwcmV4aXN0aW5nIG9wY29kZXMgdGFibGUgKi8KLSAgICBtZW1jcHkgKG5ld19vcGNvZGVzLCBJVEJMX09QQ09ERVMsIHNpemUpOwotCi0gIC8qIEZJWE1FISBzb21lIE5VTU9QQ09ERVMgYXJlIGNhbGN1bGF0ZWQgZXhwcmVzc2lvbnMuCi0JCVRoZXNlIG5lZWQgdG8gYmUgY2hhbmdlZCBiZWZvcmUgaXRibHMgY2FuIGJlIHN1cHBvcnRlZC4gKi8KLQotICBpZCA9IElUQkxfTlVNX01BQ1JPUzsJCS8qIGJlZ2luIHRoZSBuZXh0IG1hY3JvIGlkIGFmdGVyIHRoZSBsYXN0ICovCi0gIG8gPSAmbmV3X29wY29kZXNbSVRCTF9OVU1fT1BDT0RFU107CS8qIGFwcGVuZCBtYWNybyB0byBvcGNvZGVzIGxpc3QgKi8KLSAgZm9yIChuID0gZV9wMDsgbiA8IGVfbnByb2NzOyBuKyspCi0gICAgewotICAgICAgZXMgPSBnZXRfZW50cmllcyAobiwgZV9pbnNuKTsKLSAgICAgIGZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCi0JewotCSAgLyogbmFtZSwgICAgYXJncywgICBtYXNrLCAgICAgICBtYXRjaCwgIHBpbmZvCi0JCSAqIHsibGkiLCAgICAgICJ0LGkiLCAgMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCAgICB9LAotCQkgKiB7ImxpIiwgICAgICAidCxJIiwgIDAsICAgIChpbnQpIE1fTEksICAgSU5TTl9NQUNSTyAgfSwKLQkJICogQ29uc3RydWN0IGFyZ3MgZnJvbSBpdGJsX2ZpZWxkcy4KLQkJKi8KLQkgIG8tPm5hbWUgPSBlLT5uYW1lOwotCSAgby0+YXJncyA9IHN0cmR1cCAoZm9ybV9hcmdzIChlKSk7Ci0JICBvLT5tYXNrID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7Ci0JICAvKiBGSVhNRSBob3cgdG8gY2F0Y2ggZHVycmluZyBhc3NlbWJseT8gKi8KLQkgIC8qIG1hc2sgdG8gaWRlbnRpZnkgdGhpcyBpbnNuICovCi0JICBvLT5tYXRjaCA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOwotCSAgby0+cGluZm8gPSAwOwotCi0jaWZkZWYgVVNFX01BQ1JPUwotCSAgby0+bWFzayA9IGlkKys7CS8qIEZJWE1FIGhvdyB0byBjYXRjaCBkdXJyaW5nIGFzc2VtYmx5PyAqLwotCSAgby0+bWF0Y2ggPSAwOwkJLyogZm9yIG1hY3JvcywgdGhlIGluc25faXNhIG51bWJlciAqLwotCSAgby0+cGluZm8gPSBJTlNOX01BQ1JPOwotI2VuZGlmCi0KLQkgIC8qIERvbid0IGFkZCBpbnN0cnVjdGlvbnMgd2hpY2ggY2F1c2VkIGFuIGVycm9yICovCi0JICBpZiAoby0+YXJncykKLQkgICAgbysrOwotCSAgZWxzZQotCSAgICBuZXdfbnVtX29wY29kZXMtLTsKLQl9Ci0gICAgfQotICBJVEJMX09QQ09ERVMgPSBuZXdfb3Bjb2RlczsKLSAgSVRCTF9OVU1fT1BDT0RFUyA9IG5ld19udW1fb3Bjb2RlczsKLQotICAvKiBGSVhNRQotCQlBdCB0aGlzIHBvaW50LCB3ZSBjYW4gZnJlZSB0aGUgZW50cmllcywgYXMgdGhleSBzaG91bGQgaGF2ZQotCQliZWVuIGFkZGVkIHRvIHRoZSBhc3NlbWJsZXIncyB0YWJsZXMuCi0JCURvbid0IGZyZWUgbmFtZSB0aG91Z2gsIHNpbmNlIG5hbWUgaXMgYmVpbmcgdXNlZCBieSB0aGUgbmV3Ci0JCW9wY29kZXMgdGFibGUuCi0KLQkJRXZlbnR1YWxseSwgd2Ugc2hvdWxkIGFsc28gZnJlZSB0aGUgbmV3IG9wY29kZXMgdGFibGUgaXRzZWxmIAotCQlvbiBleGl0LgotCSovCi19Ci0KLXN0YXRpYyBjaGFyICoKLWZvcm1fYXJncyAoc3RydWN0IGl0YmxfZW50cnkgKmUpCi17Ci0gIHN0YXRpYyBjaGFyIHNbMzFdOwotICBjaGFyIGMgPSAwLCAqcCA9IHM7Ci0gIHN0cnVjdCBpdGJsX2ZpZWxkICpmOwotCi0gIEFTU0VSVCAoZSk7Ci0gIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChmLT50eXBlKQotCXsKLQljYXNlIGVfZHJlZzoKLQkgIGMgPSAnZCc7Ci0JICBicmVhazsKLQljYXNlIGVfY3JlZzoKLQkgIGMgPSAndCc7Ci0JICBicmVhazsKLQljYXNlIGVfZ3JlZzoKLQkgIGMgPSAncyc7Ci0JICBicmVhazsKLQljYXNlIGVfaW1tZWQ6Ci0JICBjID0gJ2knOwotCSAgYnJlYWs7Ci0JY2FzZSBlX2FkZHI6Ci0JICBjID0gJ2EnOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGMgPSAwOwkJLyogaWdub3JlOyB1bmtub3duIGZpZWxkIHR5cGUgKi8KLQl9Ci0gICAgICBpZiAoYykKLQl7Ci0JICBpZiAocCAhPSBzKQotCSAgICAqcCsrID0gJywnOwotCSAgKnArKyA9IGM7Ci0JfQotICAgIH0KLSAgKnAgPSAwOwotICByZXR1cm4gczsKLX0KLSNlbmRpZiAvKiAhU1RBTkRfQUxPTkUgKi8KLQotCi0vKiBHZXQgcHJvY2Vzc29yJ3MgcmVnaXN0ZXIgbmFtZSBmcm9tIHZhbCAqLwotCi1pbnQKLWl0YmxfZ2V0X3JlZ192YWwgKGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKnB2YWwpCi17Ci0gIGVfdHlwZSB0OwotICBlX3Byb2Nlc3NvciBwOwotCi0gIGZvciAocCA9IGVfcDA7IHAgPCBlX25wcm9jczsgcCsrKQotICAgIHsKLSAgICAgIGZvciAodCA9IGVfcmVndHlwZTA7IHQgPCBlX25yZWd0eXBlczsgdCsrKQotCXsKLQkgIGlmIChpdGJsX2dldF92YWwgKHAsIHQsIG5hbWUsIHB2YWwpKQotCSAgICByZXR1cm4gMTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotY2hhciAqCi1pdGJsX2dldF9uYW1lIChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKnI7Ci0gIC8qIHR5cGUgZGVwZW5kcyBvbiBpbnN0cnVjdGlvbiBwYXNzZWQgKi8KLSAgciA9IGZpbmRfZW50cnlfYnl2YWwgKHByb2Nlc3NvciwgdHlwZSwgdmFsLCAwKTsKLSAgaWYgKHIpCi0gICAgcmV0dXJuIHItPm5hbWU7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsJCQkvKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICovCi19Ci0KLS8qIEdldCBwcm9jZXNzb3IncyByZWdpc3RlciB2YWx1ZSBmcm9tIG5hbWUgKi8KLQotaW50Ci1pdGJsX2dldF92YWwgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsIGNoYXIgKm5hbWUsCi0JICAgICAgdW5zaWduZWQgbG9uZyAqcHZhbCkKLXsKLSAgc3RydWN0IGl0YmxfZW50cnkgKnI7Ci0gIC8qIHR5cGUgZGVwZW5kcyBvbiBpbnN0cnVjdGlvbiBwYXNzZWQgKi8KLSAgciA9IGZpbmRfZW50cnlfYnluYW1lIChwcm9jZXNzb3IsIHR5cGUsIG5hbWUpOwotICBpZiAociA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAqcHZhbCA9IHItPnZhbHVlOwotICByZXR1cm4gMTsKLX0KLQotCi0vKiBBc3NlbWJsZSBpbnN0cnVjdGlvbiAibmFtZSIgd2l0aCBvcGVyYW5kcyAicyIuCi0gKiBuYW1lIC0gbmFtZSBvZiBpbnN0cnVjdGlvbgotICogcyAtIG9wZXJhbmRzCi0gKiByZXR1cm5zIC0gbG9uZyB3b3JkIGZvciBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gKi8KLQotdW5zaWduZWQgbG9uZyAKLWl0YmxfYXNzZW1ibGUgKGNoYXIgKm5hbWUsIGNoYXIgKnMpCi17Ci0gIHVuc2lnbmVkIGxvbmcgb3Bjb2RlOwotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmY7Ci0gIGNoYXIgKm47Ci0gIGludCBwcm9jZXNzb3I7Ci0KLSAgaWYgKCFuYW1lIHx8ICEqbmFtZSkKLSAgICByZXR1cm4gMDsJCQkvKiBlcnJvciEgIG11c3QgaGF2ZSBhIG9wY29kZSBuYW1lL2V4cHIgKi8KLQotICAvKiBmaW5kIGVudHJ5IGluIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIGZvciBhbGwgcHJvY2Vzc29ycyAqLwotICBmb3IgKHByb2Nlc3NvciA9IDA7IHByb2Nlc3NvciA8IGVfbnByb2NzOyBwcm9jZXNzb3IrKykKLSAgICB7Ci0gICAgICBlID0gZmluZF9lbnRyeV9ieW5hbWUgKHByb2Nlc3NvciwgZV9pbnNuLCBuYW1lKTsKLSAgICAgIGlmIChlKQotCWJyZWFrOwotICAgIH0KLSAgaWYgKCFlKQotICAgIHJldHVybiAwOwkJCS8qIG9wY29kZSBub3QgaW4gdGFibGU7IGludmFsaWQgaW5zdHJ1c3Rpb24gKi8KLSAgb3Bjb2RlID0gYnVpbGRfb3Bjb2RlIChlKTsKLQotICAvKiBwYXJzZSBvcGNvZGUncyBhcmdzIChpZiBhbnkpICovCi0gIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCS8qIGZvciBlYWNoIGFyZywgLi4uICovCi0gICAgewotICAgICAgc3RydWN0IGl0YmxfZW50cnkgKnI7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICAgaWYgKCFzIHx8ICEqcykKLQlyZXR1cm4gMDsJCS8qIGVycm9yIC0gbm90IGVub3VnaCBvcGVyYW5kcyAqLwotICAgICAgbiA9IGl0YmxfZ2V0X2ZpZWxkICgmcyk7Ci0gICAgICAvKiBuIHNob3VsZCBiZSBpbiBmb3JtICRuIG9yIDB4aGhoIChhcmUgc3ltYm9sIG5hbWVzIHZhbGlkPz8gKi8KLSAgICAgIHN3aXRjaCAoZi0+dHlwZSkKLQl7Ci0JY2FzZSBlX2RyZWc6Ci0JY2FzZSBlX2NyZWc6Ci0JY2FzZSBlX2dyZWc6Ci0JICAvKiBBY2NlcHQgZWl0aGVyIGEgc3RyaW5nIG5hbWUKLQkJCSAqIG9yICckJyBmb2xsb3dlZCBieSB0aGUgcmVnaXN0ZXIgbnVtYmVyICovCi0JICBpZiAoKm4gPT0gJyQnKQotCSAgICB7Ci0JICAgICAgbisrOwotCSAgICAgIHZhbHVlID0gc3RydG9sIChuLCAwLCAxMCk7Ci0JICAgICAgLyogRklYTUUhIGNvdWxkIGhhdmUgIjBsIi4uLiB0aGVuIHdoYXQ/PyAqLwotCSAgICAgIGlmICh2YWx1ZSA9PSAwICYmICpuICE9ICcwJykKLQkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgciA9IGZpbmRfZW50cnlfYnluYW1lIChlLT5wcm9jZXNzb3IsIGYtPnR5cGUsIG4pOwotCSAgICAgIGlmIChyKQotCQl2YWx1ZSA9IHItPnZhbHVlOwotCSAgICAgIGVsc2UKLQkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBlX2FkZHI6Ci0JICAvKiB1c2UgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlIHRvIGZpbmQgc3ltYm9sICovCi0JICAvKiBGSVhNRSEhIERvIHdlIG5lZWQgdGhpcz8KLQkJCQlpZiBzbywgd2hhdCBhYm91dCByZWxvY3M/PwotCQkJCW15X2dldEV4cHJlc3Npb24gKCZpbW1fZXhwciwgcyk7Ci0JCQkJcmV0dXJuIDA7CS8tKiBlcnJvcjsgaW52YWxpZCBvcGVyYW5kICotLwotCQkJCWJyZWFrOwotCQkJKi8KLQkgIC8qIElmIG5vdCBhIHN5bWJvbCwgZmFsbCB0aHJ1IHRvIElNTUVEICovCi0JY2FzZSBlX2ltbWVkOgotCSAgaWYgKCpuID09ICcwJyAmJiAqKG4gKyAxKSA9PSAneCcpCS8qIGhleCBiZWdpbnMgMHguLi4gKi8KLQkgICAgewotCSAgICAgIG4gKz0gMjsKLQkgICAgICB2YWx1ZSA9IHN0cnRvbCAobiwgMCwgMTYpOwotCSAgICAgIC8qIEZJWE1FISBjb3VsZCBoYXZlICIweGwiLi4uIHRoZW4gd2hhdD8/ICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHZhbHVlID0gc3RydG9sIChuLCAwLCAxMCk7Ci0JICAgICAgLyogRklYTUUhIGNvdWxkIGhhdmUgIjBsIi4uLiB0aGVuIHdoYXQ/PyAqLwotCSAgICAgIGlmICh2YWx1ZSA9PSAwICYmICpuICE9ICcwJykKLQkJcmV0dXJuIDA7CS8qIGVycm9yOyBpbnZhbGlkIG9wZXJhbmQgKi8KLQkgICAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIHJldHVybiAwOwkJLyogZXJyb3I7IGludmFsaWQgZmllbGQgc3BlYyAqLwotCX0KLSAgICAgIG9wY29kZSB8PSBhcHBseV9yYW5nZSAodmFsdWUsIGYtPnJhbmdlKTsKLSAgICB9Ci0gIGlmIChzICYmICpzKQotICAgIHJldHVybiAwOwkJCS8qIGVycm9yIC0gdG9vIG1hbnkgb3BlcmFuZHMgKi8KLSAgcmV0dXJuIG9wY29kZTsJCS8qIGRvbmUhICovCi19Ci0KLS8qIERpc2Fzc2VtYmxlIGluc3RydWN0aW9uICJpbnNuIi4KLSAqIGluc24gLSBpbnN0cnVjdGlvbgotICogcyAtIGJ1ZmZlciB0byBob2xkIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbgotICogcmV0dXJucyAtIDEgaWYgc3VjY2VlZGVkOyAwIGlmIGZhaWxlZAotICovCi0KLWludCAKLWl0YmxfZGlzYXNzZW1ibGUgKGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgaW5zbikKLXsKLSAgZV9wcm9jZXNzb3IgcHJvY2Vzc29yOwotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZTsKLSAgc3RydWN0IGl0YmxfZmllbGQgKmY7Ci0KLSAgaWYgKCFJVEJMX0lTX0lOU04gKGluc24pKQotICAgIHJldHVybiAwOwkJCS8qIGVycm9yKi8KLSAgcHJvY2Vzc29yID0gZ2V0X3Byb2Nlc3NvciAoSVRCTF9ERUNPREVfUE5VTSAoaW5zbikpOwotCi0gIC8qIGZpbmQgZW50cnkgaW4gbGlzdCAqLwotICBlID0gZmluZF9lbnRyeV9ieXZhbCAocHJvY2Vzc29yLCBlX2luc24sIGluc24sIDApOwotICBpZiAoIWUpCi0gICAgcmV0dXJuIDA7CQkJLyogb3Bjb2RlIG5vdCBpbiB0YWJsZTsgaW52YWxpZCBpbnN0cnVzdGlvbiAqLwotICBzdHJjcHkgKHMsIGUtPm5hbWUpOwotCi0gIC8qIHBhcnNlIGluc24ncyBhcmdzIChpZiBhbnkpICovCi0gIGZvciAoZiA9IGUtPmZpZWxkczsgZjsgZiA9IGYtPm5leHQpCS8qIGZvciBlYWNoIGFyZywgLi4uICovCi0gICAgewotICAgICAgc3RydWN0IGl0YmxfZW50cnkgKnI7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0gICAgICBpZiAoZiA9PSBlLT5maWVsZHMpCS8qIGZpcnN0IG9wZXJhbmQgaXMgcHJlY2VlZGVkIGJ5IHRhYiAqLwotCXN0cmNhdCAocywgIlx0Iik7Ci0gICAgICBlbHNlCQkJLyogJywncyBzZXBhcmF0ZSBmb2xsb3dpbmcgb3BlcmFuZHMgKi8KLQlzdHJjYXQgKHMsICIsIik7Ci0gICAgICB2YWx1ZSA9IGV4dHJhY3RfcmFuZ2UgKGluc24sIGYtPnJhbmdlKTsKLSAgICAgIC8qIG4gc2hvdWxkIGJlIGluIGZvcm0gJG4gb3IgMHhoaGggKGFyZSBzeW1ib2wgbmFtZXMgdmFsaWQ/PyAqLwotICAgICAgc3dpdGNoIChmLT50eXBlKQotCXsKLQljYXNlIGVfZHJlZzoKLQljYXNlIGVfY3JlZzoKLQljYXNlIGVfZ3JlZzoKLQkgIC8qIEFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgbmFtZQotCQkJICogb3IgJyQnIGZvbGxvd2VkIGJ5IHRoZSByZWdpc3RlciBudW1iZXIgKi8KLQkgIHIgPSBmaW5kX2VudHJ5X2J5dmFsIChlLT5wcm9jZXNzb3IsIGYtPnR5cGUsIHZhbHVlLCAmZi0+cmFuZ2UpOwotCSAgaWYgKHIpCi0JICAgIHN0cmNhdCAocywgci0+bmFtZSk7Ci0JICBlbHNlCi0JICAgIHNwcmludGYgKHMsICIlcyQlbHUiLCBzLCB2YWx1ZSk7Ci0JICBicmVhazsKLQljYXNlIGVfYWRkcjoKLQkgIC8qIHVzZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUgdG8gZmluZCBzeW1ib2wgKi8KLQkgIC8qIEZJWE1FISEgRG8gd2UgbmVlZCB0aGlzPwotCQkJICogICBpZiBzbywgd2hhdCBhYm91dCByZWxvY3M/PwotCQkJKi8KLQkgIC8qIElmIG5vdCBhIHN5bWJvbCwgZmFsbCB0aHJ1IHRvIElNTUVEICovCi0JY2FzZSBlX2ltbWVkOgotCSAgc3ByaW50ZiAocywgIiVzMHglbHgiLCBzLCB2YWx1ZSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuIDA7CQkvKiBlcnJvcjsgaW52YWxpZCBmaWVsZCBzcGVjICovCi0JfQotICAgIH0KLSAgcmV0dXJuIDE7CQkJLyogZG9uZSEgKi8KLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8qCi0gKiBMb2NhbCBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBwcml2YXRlIHN0cnVjdHVyZXMgY29udGFpbmluZwotICogdGhlIG5hbWVzIGFuZCBmb3JtYXQgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMKLSAqIGZvciBlYWNoIHByb2Nlc3Nvci4KLSAqLwotCi0vKiBDYWxjdWxhdGUgaW5zdHJ1Y3Rpb24ncyBvcGNvZGUgYW5kIGZ1bmN0aW9uIHZhbHVlcyBmcm9tIGVudHJ5ICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIAotYnVpbGRfb3Bjb2RlIChzdHJ1Y3QgaXRibF9lbnRyeSAqZSkKLXsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgb3Bjb2RlID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCBlLT5yYW5nZSk7Ci0gIG9wY29kZSB8PSBJVEJMX0VOQ09ERV9QTlVNIChlLT5wcm9jZXNzb3IpOwotICByZXR1cm4gb3Bjb2RlOwotfQotCi0vKiBDYWxjdWxhdGUgYWJzb2x1dGUgdmFsdWUgZ2l2ZW4gdGhlIHJlbGF0aXZlIHZhbHVlIGFuZCBiaXQgcG9zaXRpb24gcmFuZ2UKLSAqIHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0gKiBUaGUgcmFuZ2UgaXMgaW5jbHVzaXZlIHdoZXJlIDAgaXMgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LgotICogQSByYW5nZSBvZiB7IDI0LCAyMCB9IHdpbGwgaGF2ZSBhIG1hc2sgb2YKLSAqIGJpdCAgIDMgICAgICAgICAgIDIgICAgICAgICAgICAxCi0gKiBwb3M6IDEwOTggNzY1NCAzMjEwIDk4NzYgNTQzMiAxMDk4IDc2NTQgMzIxMAotICogYmluOiAwMDAwIDAwMDEgMTExMSAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAKLSAqIGhleDogICAgMCAgICAxICAgIGYgICAgMCAgICAwICAgIDAgICAgMCAgICAwCi0gKiBtYXNrOiAweDAxZjAwMDAwLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIAotYXBwbHlfcmFuZ2UgKHVuc2lnbmVkIGxvbmcgcnZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgcikKLXsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICB1bnNpZ25lZCBsb25nIGF2YWw7Ci0gIGludCBsZW4gPSBNQVhfQklUUE9TIC0gci5zYml0OwotCi0gIEFTU0VSVCAoci5zYml0ID49IHIuZWJpdCk7Ci0gIEFTU0VSVCAoTUFYX0JJVFBPUyA+PSByLnNiaXQpOwotICBBU1NFUlQgKHIuZWJpdCA+PSAwKTsKLQotICAvKiBjcmVhdGUgbWFzayBieSB0cnVuY2F0aW5nIDFzIGJ5IHNoaWZ0aW5nICovCi0gIG1hc2sgPSAweGZmZmZmZmZmIDw8IGxlbjsKLSAgbWFzayA9IG1hc2sgPj4gbGVuOwotICBtYXNrID0gbWFzayA+PiByLmViaXQ7Ci0gIG1hc2sgPSBtYXNrIDw8IHIuZWJpdDsKLQotICBhdmFsID0gKHJ2YWwgPDwgci5lYml0KSAmIG1hc2s7Ci0gIHJldHVybiBhdmFsOwotfQotCi0vKiBDYWxjdWxhdGUgcmVsYXRpdmUgdmFsdWUgZ2l2ZW4gdGhlIGFic29sdXRlIHZhbHVlIGFuZCBiaXQgcG9zaXRpb24gcmFuZ2UKLSAqIHdpdGhpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAKLWV4dHJhY3RfcmFuZ2UgKHVuc2lnbmVkIGxvbmcgYXZhbCwgc3RydWN0IGl0YmxfcmFuZ2UgcikKLXsKLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotICB1bnNpZ25lZCBsb25nIHJ2YWw7Ci0gIGludCBsZW4gPSBNQVhfQklUUE9TIC0gci5zYml0OwotCi0gIC8qIGNyZWF0ZSBtYXNrIGJ5IHRydW5jYXRpbmcgMXMgYnkgc2hpZnRpbmcgKi8KLSAgbWFzayA9IDB4ZmZmZmZmZmYgPDwgbGVuOwotICBtYXNrID0gbWFzayA+PiBsZW47Ci0gIG1hc2sgPSBtYXNrID4+IHIuZWJpdDsKLSAgbWFzayA9IG1hc2sgPDwgci5lYml0OwotCi0gIHJ2YWwgPSAoYXZhbCAmIG1hc2spID4+IHIuZWJpdDsKLSAgcmV0dXJuIHJ2YWw7Ci19Ci0KLS8qIEV4dHJhY3QgcHJvY2Vzc29yJ3MgYXNzZW1ibHkgaW5zdHJ1Y3Rpb24gZmllbGQgbmFtZSBmcm9tIHM7Ci0gKiBmb3JtcyBhcmUgIm4gYXJncyIgIm4sYXJncyIgb3IgIm4iICovCi0vKiBSZXR1cm4gbmV4dCBhcmd1bWVudCBmcm9tIHN0cmluZyBwb2ludGVyICJzIiBhbmQgYWR2YW5jZSBzLgotICogZGVsaW1pdGVycyBhcmUgIiAsKCkiICovCi0KLWNoYXIgKgotaXRibF9nZXRfZmllbGQgKGNoYXIgKipTKQotewotICBzdGF0aWMgY2hhciBuWzEyOF07Ci0gIGNoYXIgKnM7Ci0gIGludCBsZW47Ci0KLSAgcyA9ICpTOwotICBpZiAoIXMgfHwgISpzKQotICAgIHJldHVybiAwOwotICAvKiBGSVhNRTogVGhpcyBpcyBhIHdlaXJkIHNldCBvZiBkZWxpbWl0ZXJzLiAgKi8KLSAgbGVuID0gc3RyY3NwbiAocywgIiBcdCwoKSIpOwotICBBU1NFUlQgKDEyOCA+IGxlbiArIDEpOwotICBzdHJuY3B5IChuLCBzLCBsZW4pOwotICBuW2xlbl0gPSAwOwotICBpZiAoc1tsZW5dID09ICdcMCcpCi0gICAgcyA9IDA7CQkJLyogbm8gbW9yZSBhcmdzICovCi0gIGVsc2UKLSAgICBzICs9IGxlbiArIDE7CQkvKiBhZHZhbmNlIHRvIG5leHQgYXJnICovCi0KLSAgKlMgPSBzOwotICByZXR1cm4gbjsKLX0KLQotLyogU2VhcmNoIGVudHJpZXMgZm9yIGEgZ2l2ZW4gcHJvY2Vzc29yIGFuZCB0eXBlCi0gKiB0byBmaW5kIG9uZSBtYXRjaGluZyB0aGUgbmFtZSAibiIuCi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeSAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKgotZmluZF9lbnRyeV9ieW5hbWUgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwKLQkJICAgZV90eXBlIHR5cGUsIGNoYXIgKm4pCi17Ci0gIHN0cnVjdCBpdGJsX2VudHJ5ICplLCAqKmVzOwotCi0gIGVzID0gZ2V0X2VudHJpZXMgKHByb2Nlc3NvciwgdHlwZSk7Ci0gIGZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCS8qIGZvciBlYWNoIGVudHJ5LCAuLi4gKi8KLSAgICB7Ci0gICAgICBpZiAoIXN0cmNtcCAoZS0+bmFtZSwgbikpCi0JcmV0dXJuIGU7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogU2VhcmNoIGVudHJpZXMgZm9yIGEgZ2l2ZW4gcHJvY2Vzc29yIGFuZCB0eXBlCi0gKiB0byBmaW5kIG9uZSBtYXRjaGluZyB0aGUgdmFsdWUgInZhbCIgZm9yIHRoZSByYW5nZSAiciIuCi0gKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbnRyeS4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgZGlzYXNzZW1ibGluZyBmaWVsZHMgb2YgYW4gaW5zdHJ1Y3Rpb24uCi0gKi8KLQotc3RhdGljIHN0cnVjdCBpdGJsX2VudHJ5ICoKLWZpbmRfZW50cnlfYnl2YWwgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCi0JCSAgdW5zaWduZWQgbG9uZyB2YWwsIHN0cnVjdCBpdGJsX3JhbmdlICpyKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgdW5zaWduZWQgbG9uZyBldmFsOwotCi0gIGVzID0gZ2V0X2VudHJpZXMgKHByb2Nlc3NvciwgdHlwZSk7Ci0gIGZvciAoZSA9ICplczsgZTsgZSA9IGUtPm5leHQpCS8qIGZvciBlYWNoIGVudHJ5LCAuLi4gKi8KLSAgICB7Ci0gICAgICBpZiAocHJvY2Vzc29yICE9IGUtPnByb2Nlc3NvcikKLQljb250aW51ZTsKLSAgICAgIC8qIEZvciBpbnNucywgd2UgbWlnaHQgbm90IGtub3cgdGhlIHJhbmdlIG9mIHRoZSBvcGNvZGUsCi0JICogc28gYSByYW5nZSBvZiAwIHdpbGwgYWxsb3cgdGhpcyByb3V0aW5lIHRvIG1hdGNoIGFnYWluc3QKLQkgKiB0aGUgcmFuZ2Ugb2YgdGhlIGVudHJ5IHRvIGJlIGNvbXBhcmVkIHdpdGguCi0JICogVGhpcyBjb3VsZCBjYXVzZSBhbWJpZ3VpdGllcy4KLQkgKiBGb3Igb3BlcmFuZHMsIHdlIGdldCBhbiBleHRyYWN0ZWQgdmFsdWUgYW5kIGEgcmFuZ2UuCi0JICovCi0gICAgICAvKiBpZiByYW5nZSBpcyAwLCBtYXNrIHZhbCBhZ2FpbnN0IHRoZSByYW5nZSBvZiB0aGUgY29tcGFyZWQgZW50cnkuICovCi0gICAgICBpZiAociA9PSAwKQkJLyogaWYgbm8gcmFuZ2UgcGFzc2VkLCBtdXN0IGJlIHdob2xlIDMyLWJpdHMKLQkJCSAqIHNvIGNyZWF0ZSAzMi1iaXQgdmFsdWUgZnJvbSBlbnRyeSdzIHJhbmdlICovCi0JewotCSAgZXZhbCA9IGFwcGx5X3JhbmdlIChlLT52YWx1ZSwgZS0+cmFuZ2UpOwotCSAgdmFsICY9IGFwcGx5X3JhbmdlICgweGZmZmZmZmZmLCBlLT5yYW5nZSk7Ci0JfQotICAgICAgZWxzZSBpZiAoKHItPnNiaXQgPT0gZS0+cmFuZ2Uuc2JpdCAmJiByLT5lYml0ID09IGUtPnJhbmdlLmViaXQpCi0JICAgICAgIHx8IChlLT5yYW5nZS5zYml0ID09IDAgJiYgZS0+cmFuZ2UuZWJpdCA9PSAwKSkKLQl7Ci0JICBldmFsID0gYXBwbHlfcmFuZ2UgKGUtPnZhbHVlLCAqcik7Ci0JICB2YWwgPSBhcHBseV9yYW5nZSAodmFsLCAqcik7Ci0JfQotICAgICAgZWxzZQotCWNvbnRpbnVlOwotICAgICAgaWYgKHZhbCA9PSBldmFsKQotCXJldHVybiBlOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGxpc3Qgb2YgZW50cmllcyBmb3IgYSBnaXZlbiBwcm9jZXNzb3IgYW5kIHR5cGUuICovCi0KLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqKgotZ2V0X2VudHJpZXMgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUpCi17Ci0gIHJldHVybiAmZW50cmllc1twcm9jZXNzb3JdW3R5cGVdOwotfQotCi0vKiBSZXR1cm4gYW4gaW50ZWdyYWwgdmFsdWUgZm9yIHRoZSBwcm9jZXNzb3IgcGFzc2VkIGZyb20geXlwYXJzZS4gKi8KLQotc3RhdGljIGVfcHJvY2Vzc29yIAotZ2V0X3Byb2Nlc3NvciAoaW50IHl5cHJvYykKLXsKLSAgLyogdHJhbnNsYXRlIGZyb20geWFjYydzIHByb2Nlc3NvciB0byBlbnVtICovCi0gIGlmICh5eXByb2MgPj0gZV9wMCAmJiB5eXByb2MgPCBlX25wcm9jcykKLSAgICByZXR1cm4gKGVfcHJvY2Vzc29yKSB5eXByb2M7Ci0gIHJldHVybiBlX2ludnByb2M7CQkvKiBlcnJvcjsgaW52YWxpZCBwcm9jZXNzb3IgKi8KLX0KLQotLyogUmV0dXJuIGFuIGludGVncmFsIHZhbHVlIGZvciB0aGUgZW50cnkgdHlwZSBwYXNzZWQgZnJvbSB5eXBhcnNlLiAqLwotCi1zdGF0aWMgZV90eXBlIAotZ2V0X3R5cGUgKGludCB5eXR5cGUpCi17Ci0gIHN3aXRjaCAoeXl0eXBlKQotICAgIHsKLSAgICAgIC8qIHRyYW5zbGF0ZSBmcm9tIHlhY2MncyB0eXBlIHRvIGVudW0gKi8KLSAgICBjYXNlIElOU046Ci0gICAgICByZXR1cm4gZV9pbnNuOwotICAgIGNhc2UgRFJFRzoKLSAgICAgIHJldHVybiBlX2RyZWc7Ci0gICAgY2FzZSBDUkVHOgotICAgICAgcmV0dXJuIGVfY3JlZzsKLSAgICBjYXNlIEdSRUc6Ci0gICAgICByZXR1cm4gZV9ncmVnOwotICAgIGNhc2UgQUREUjoKLSAgICAgIHJldHVybiBlX2FkZHI7Ci0gICAgY2FzZSBJTU1FRDoKLSAgICAgIHJldHVybiBlX2ltbWVkOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZV9pbnZ0eXBlOwkJLyogZXJyb3I7IGludmFsaWQgdHlwZSAqLwotICAgIH0KLX0KLQotCi0vKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlbnRyeSAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZW50cnkgKgotYWxsb2NfZW50cnkgKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCi0JICAgICBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotICBzdHJ1Y3QgaXRibF9lbnRyeSAqZSwgKiplczsKLSAgaWYgKCFuYW1lKQotICAgIHJldHVybiAwOwotICBlID0gKHN0cnVjdCBpdGJsX2VudHJ5ICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgaXRibF9lbnRyeSkpOwotICBpZiAoZSkKLSAgICB7Ci0gICAgICBtZW1zZXQgKGUsIDAsIHNpemVvZiAoc3RydWN0IGl0YmxfZW50cnkpKTsKLSAgICAgIGUtPm5hbWUgPSAoY2hhciAqKSBtYWxsb2MgKHNpemVvZiAoc3RybGVuIChuYW1lKSkgKyAxKTsKLSAgICAgIGlmIChlLT5uYW1lKQotCXN0cmNweSAoZS0+bmFtZSwgbmFtZSk7Ci0gICAgICBlLT5wcm9jZXNzb3IgPSBwcm9jZXNzb3I7Ci0gICAgICBlLT50eXBlID0gdHlwZTsKLSAgICAgIGUtPnZhbHVlID0gdmFsdWU7Ci0gICAgICBlcyA9IGdldF9lbnRyaWVzIChlLT5wcm9jZXNzb3IsIGUtPnR5cGUpOwotICAgICAgZS0+bmV4dCA9ICplczsKLSAgICAgICplcyA9IGU7Ci0gICAgfQotICByZXR1cm4gZTsKLX0KLQotLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gZW50cnkncyBmaWVsZCAqLwotCi1zdGF0aWMgc3RydWN0IGl0YmxfZmllbGQgKgotYWxsb2NfZmllbGQgKGVfdHlwZSB0eXBlLCBpbnQgc2JpdCwgaW50IGViaXQsCi0JICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotICBzdHJ1Y3QgaXRibF9maWVsZCAqZjsKLSAgZiA9IChzdHJ1Y3QgaXRibF9maWVsZCAqKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IGl0YmxfZmllbGQpKTsKLSAgaWYgKGYpCi0gICAgewotICAgICAgbWVtc2V0IChmLCAwLCBzaXplb2YgKHN0cnVjdCBpdGJsX2ZpZWxkKSk7Ci0gICAgICBmLT50eXBlID0gdHlwZTsKLSAgICAgIGYtPnJhbmdlLnNiaXQgPSBzYml0OwotICAgICAgZi0+cmFuZ2UuZWJpdCA9IGViaXQ7Ci0gICAgICBmLT5mbGFncyA9IGZsYWdzOwotICAgIH0KLSAgcmV0dXJuIGY7Ci19CmRpZmYgLS1naXQgYS9nYXMvaXRibC1vcHMuaCBiL2dhcy9pdGJsLW9wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjllYTdmLi4wMDAwMDAwCi0tLSBhL2dhcy9pdGJsLW9wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qIGl0Ymwtb3BzLmgKLSAgIENvcHlyaWdodCAoQykgMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRXh0ZXJuYWwgZnVuY3Rpb25zLCBjb25zdGFudHMgYW5kIGRlZmluZXMgZm9yIGl0Ymwgc3VwcG9ydCAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogSW5jbHVkZSBmaWxlIG5vdGVzOiAiZXhwci5oIiBuZWVkZWQgYmVmb3JlIHRhcmctKi5oLAotICogInRhcmctZW52LmgiIGluY2x1ZGVzIHRoZSBjaGFpbiBvZiB0YXJnZXQgZGVwZW5kYW50IGhlYWRlcnMsCi0gKiAidGFyZy1jcHUuaCIgaGFzIHRoZSBIQVZFX0lUQkxfQ1BVIGRlZmluZSwgYW5kCi0gKiBhcy5oIGluY2x1ZGVzIHRoZW0gYWxsICovCi0jaW5jbHVkZSAiYXMuaCIKLQotI2lmZGVmIEhBVkVfSVRCTF9DUFUKLSNpbmNsdWRlICJpdGJsLWNwdS5oIgotI2VuZGlmCi0KLS8qIERlZmF1bHRzIGZvciBkZWZpbml0aW9ucyByZXF1aXJlZCBieSBnZW5lcmljIGNvZGUgKi8KLSNpZm5kZWYgSVRCTF9OVU1CRVJfT0ZfUFJPQ0VTU09SUwotI2RlZmluZSBJVEJMX05VTUJFUl9PRl9QUk9DRVNTT1JTIDEKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfTUFYX0JJVFBPUwotI2RlZmluZSBJVEJMX01BWF9CSVRQT1MgMzEKLSNlbmRpZgotCi0jaWZuZGVmIElUQkxfVFlQRQotI2RlZmluZSBJVEJMX1RZUEUgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9JU19JTlNOCi0jZGVmaW5lIElUQkxfSVNfSU5TTihpbnNuKSAxCi0jZW5kaWYKLQotI2lmbmRlZiBJVEJMX0RFQ09ERV9QTlVNCi0jZGVmaW5lIElUQkxfREVDT0RFX1BOVU0oaW5zbikgMAotI2VuZGlmCi0KLSNpZm5kZWYgSVRCTF9FTkNPREVfUE5VTQotI2RlZmluZSBJVEJMX0VOQ09ERV9QTlVNKHBudW0pIDAKLSNlbmRpZgotCi10eXBlZGVmIElUQkxfVFlQRSB0X2luc247Ci0KLS8qIHR5cGVzIG9mIGVudHJpZXMgKi8KLXR5cGVkZWYgZW51bQotICB7Ci0gICAgZV9pbnNuLAotICAgIGVfZHJlZywKLSAgICBlX3JlZ3R5cGUwID0gZV9kcmVnLAotICAgIGVfY3JlZywKLSAgICBlX2dyZWcsCi0gICAgZV9hZGRyLAotICAgIGVfbnJlZ3R5cGVzID0gZV9ncmVnICsgMSwKLSAgICBlX2ltbWVkLAotICAgIGVfbnR5cGVzLAotICAgIGVfaW52dHlwZQkJCS8qIGludmFsaWQgdHlwZSAqLwotICB9IGVfdHlwZTsKLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBlX3AwLAotICAgIGVfbnByb2NzID0gTlVNQkVSX09GX1BST0NFU1NPUlMsCi0gICAgZV9pbnZwcm9jCQkJLyogaW52YWxpZCBwcm9jZXNzb3IgKi8KLSAgfSBlX3Byb2Nlc3NvcjsKLQotLyogMCBtZWFucyBhbiBpbnN0cnVjdGlvbiB0YWJsZSB3YXMgbm90IHNwZWNpZmllZC4gKi8KLWV4dGVybiBpbnQgaXRibF9oYXZlX2VudHJpZXM7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSB2aXNpYmxlIHRvIHRoZSBtYWluIHBhcnQgb2YgdGhlIGFzc2VtYmxlciAqLwotCi1pbnQgaXRibF9wYXJzZSBQQVJBTVMgKChjaGFyICppbnNudGJsKSk7Ci12b2lkIGl0YmxfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1jaGFyICppdGJsX2dldF9maWVsZCBQQVJBTVMgKChjaGFyICoqcykpOwotdW5zaWduZWQgbG9uZyBpdGJsX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKm5hbWUsIGNoYXIgKm9wZXJhbmRzKSk7Ci1pbnQgaXRibF9kaXNhc3NlbWJsZSBQQVJBTVMgKChjaGFyICpzdHIsIHVuc2lnbmVkIGxvbmcgaW5zbikpOwotaW50IGl0YmxfcGFyc2UgUEFSQU1TICgoY2hhciAqdGJsKSk7CS8qIHBhcnNlcyBpbnNuIHRibCAqLwotaW50IGl0YmxfZ2V0X3JlZ192YWwgUEFSQU1TICgoY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqcHZhbCkpOwotaW50IGl0YmxfZ2V0X3ZhbCBQQVJBTVMgKChlX3Byb2Nlc3NvciBwcm9jZXNzb3IsIGVfdHlwZSB0eXBlLCBjaGFyICpuYW1lLAotCQkJICB1bnNpZ25lZCBsb25nICpwdmFsKSk7Ci1jaGFyICppdGJsX2dldF9uYW1lIFBBUkFNUyAoKGVfcHJvY2Vzc29yIHByb2Nlc3NvciwgZV90eXBlIHR5cGUsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsKSk7Ci0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgYnkgdGhlIHRhYmxlIHBhcnNlciB1c2VkIHRvIGJ1aWxkIHRoZQotICAgZHluYW1pYyBsaXN0IG9mIG5ldyBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMuICovCi0KLXN0cnVjdCBpdGJsX2VudHJ5ICppdGJsX2FkZF9yZWcgUEFSQU1TICgoaW50IHl5cHJvYywgaW50IHl5dHlwZSwKLQkJCQkJIGNoYXIgKnJlZ25hbWUsIGludCByZWdudW0pKTsKLXN0cnVjdCBpdGJsX2VudHJ5ICppdGJsX2FkZF9pbnNuIFBBUkFNUyAoKGludCB5eXByb2MsIGNoYXIgKm5hbWUsCi0JICAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgc2JpdCwgaW50IGViaXQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpKTsKLXN0cnVjdCBpdGJsX2ZpZWxkICppdGJsX2FkZF9vcGVyYW5kIFBBUkFNUyAoKHN0cnVjdCBpdGJsX2VudHJ5ICogZSwgaW50IHl5dHlwZSwKLQkJCQkgIGludCBzYml0LCBpbnQgZWJpdCwgdW5zaWduZWQgbG9uZyBmbGFncykpOwpkaWZmIC0tZ2l0IGEvZ2FzL2l0YmwtcGFyc2UueSBiL2dhcy9pdGJsLXBhcnNlLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjZlZTguLjAwMDAwMDAKLS0tIGEvZ2FzL2l0YmwtcGFyc2UueQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKiBpdGJsLXBhcnNlLnkKLSAgIENvcHlyaWdodCAoQykgMTk5NyAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSV7Ci0KLS8qIAotCi1ZYWNjIGdyYW1tYXIgZm9yIGluc3RydWN0aW9uIHRhYmxlIGVudHJpZXMuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1PcmlnaW5hbCBJbnN0cnVjdGlvbiB0YWJsZSBzcGVjaWZpY2F0aW9uIGRvY3VtZW50OgotCi0JICAgIE1JUFMgQ29wcm9jZXNzb3IgVGFibGUgU3BlY2lmaWNhdGlvbgotCSAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGZvcm1hdCBvZiB0aGUgTUlQUyBjb3Byb2Nlc3NvciB0YWJsZS4gIFRoZQotdGFibGUgc3BlY2lmaWVzIGEgbGlzdCBvZiB2YWxpZCBmdW5jdGlvbnMsIGRhdGEgcmVnaXN0ZXJzIGFuZCBjb250cm9sCi1yZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCBpbiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMuICBUaGlzIGxpc3QsCi10b2dldGhlciB3aXRoIHRoZSBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjbGFzc2VzIGxpc3RlZCBiZWxvdywKLXNwZWNpZmllcyB0aGUgY29tcGxldGUgbGlzdCBvZiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsCi1iZSByZWNvZ25pemVkIGFuZCBhc3NlbWJsZWQgYnkgdGhlIEdOVSBhc3NlbWJsZXIuICBJbiBlZmZlY3QsCi10aGlzIG1ha2VzIHRoZSBHTlUgYXNzZW1ibGVyIHRhYmxlLWRyaXZlbiwgd2hlcmUgdGhlIHRhYmxlIGlzCi1zcGVjaWZpZWQgYnkgdGhlIHByb2dyYW1tZXIuCi0KLVRoZSB0YWJsZSBpcyBhbiBvcmRpbmFyeSB0ZXh0IGZpbGUgdGhhdCB0aGUgR05VIGFzc2VtYmxlciByZWFkcyB3aGVuCi1pdCBzdGFydHMuICBVc2luZyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHRhYmxlLCB0aGUgYXNzZW1ibGVyCi1nZW5lcmF0ZXMgYW4gaW50ZXJuYWwgbGlzdCBvZiB2YWxpZCBjb3Byb2Nlc3NvciByZWdpc3RlcnMgYW5kCi1mdW5jdGlvbnMuICBUaGUgYXNzZW1ibGVyIHVzZXMgdGhpcyBpbnRlcm5hbCBsaXN0IGluIGFkZGl0aW9uIHRvIHRoZQotc3RhbmRhcmQgTUlQUyByZWdpc3RlcnMgYW5kIGluc3RydWN0aW9ucyB3aGljaCBhcmUgYnVpbHQtaW4gdG8gdGhlIAotYXNzZW1ibGVyIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0KLVRvIHNwZWNpZnkgdGhlIGNvcHJvY2Vzc29yIHRhYmxlIHdoZW4gaW52b2tpbmcgdGhlIEdOVSBhc3NlbWJsZXIsIHVzZQotdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gIi0taXRibCBmaWxlIiwgd2hlcmUgZmlsZSBpcyB0aGUKLWNvbXBsZXRlIG5hbWUgb2YgdGhlIHRhYmxlLCBpbmNsdWRpbmcgcGF0aCBhbmQgZXh0ZW5zaW9uLgotCi1FeGFtcGxlczoKLQotCSAgICBnYXMgLXQgY29wLnRibCB0ZXN0LnMgLW8gdGVzdC5vCi0JICAgIGdhcyAtdCAvdXNyL2xvY2FsL2xpYi9jb3AudGJsIHRlc3QucyAtbyB0ZXN0Lm8KLQkgICAgZ2FzIC0taXRibCBkOlxnbnVcZGF0YVxjb3AudGJsIHRlc3QucyAtbyB0ZXN0Lm8KLQotT25seSBvbmUgdGFibGUgbWF5IGJlIHN1cHBsaWVkIGR1cmluZyBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mCi10aGUgYXNzZW1ibGVyLgotCi0KLUluc3RydWN0aW9uIGNsYXNzZXMKLT09PT09PT09PT09PT09PT09PT0KLQotQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB2YWxpZCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbiBjbGFzc2VzIGZvcgotYW55IGdpdmVuIGNvcHJvY2Vzc29yICJ6Ii4gIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgYWxyZWFkeSByZWNvZ25pemVkCi1ieSB0aGUgYXNzZW1ibGVyLCBhbmQgYXJlIGxpc3RlZCBoZXJlIG9ubHkgZm9yIHJlZmVyZW5jZS4KLQotQ2xhc3MgICBmb3JtYXQJICAgIAkgICAgCSAgICAgIGluc3RydWN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ2xhc3MxOgotCW9wIGJhc2UgcnQgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIExXQ3ogcnQsb2Zmc2V0IChiYXNlKQotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBTV0N6IHJ0LG9mZnNldCAoYmFzZSkKLUNsYXNzMjoKLQlDT1B6IHN1YiBydCByZCAwCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIE1UQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgTUZDeiBydCxyZAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBDVEN6IHJ0LHJkCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIENGQ3ogcnQscmQKLUNsYXNzMzoKLQlDT1B6IENPIGNvZnVuCi0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIENPUHogY29mdW4KLUNsYXNzNDoKLQlDT1B6IEJDIGJyIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pUIG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBCQ3pGIG9mZnNldAotQ2xhc3M1OgotCUNPUHogc3ViIHJ0IHJkIDAKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgRE1GQ3ogcnQscmQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgRE1UQ3ogcnQscmQKLUNsYXNzNjoKLQlvcCBiYXNlIHJ0IG9mZnNldAotCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICBMREN6IHJ0LG9mZnNldCAoYmFzZSkKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgU0RDeiBydCxvZmZzZXQgKGJhc2UpCi1DbGFzczc6Ci0JQ09QeiBCQyBiciBvZmZzZXQKLQkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIAkgICAgQkN6VEwgb2Zmc2V0Ci0JICAgIAkgICAgCSAgICAJICAgIAkgICAgCSAgICAJICAgIEJDekZMIG9mZnNldAotCi1UaGUgY29wcm9jZXNzb3IgdGFibGUgZGVmaW5lcyBjb3Byb2Nlc3Nvci1zcGVjaWZpYyByZWdpc3RlcnMgdGhhdCBjYW4KLWJlIHVzZWQgd2l0aCBhbGwgb2YgdGhlIGFib3ZlIGNsYXNzZXMgb2YgaW5zdHJ1Y3Rpb25zLCB3aGVyZQotYXBwcm9wcmlhdGUuICBJdCBhbHNvIGRlZmluZXMgYWRkaXRpb25hbCBjb3Byb2Nlc3Nvci1zcGVjaWZpYwotZnVuY3Rpb25zIGZvciBDbGFzczMgKENPUHogY29mdW4pIGluc3RydWN0aW9ucywgVGh1cywgdGhlIHRhYmxlIGFsbG93cwotdGhlIHByb2dyYW1tZXIgdG8gdXNlIGNvbnZlbmllbnQgbW5lbW9uaWNzIGFuZCBvcGVyYW5kcyBmb3IgdGhlc2UKLWZ1bmN0aW9ucywgaW5zdGVhZCBvZiB0aGUgQ09QeiBtbWVubW9uaWMgYW5kIGNvZnVuIG9wZXJhbmQuCi0KLVRoZSBuYW1lcyBvZiB0aGUgTUlQUyBnZW5lcmFsIHJlZ2lzdGVycyBhbmQgdGhlaXIgYWxpYXNlcyBhcmUgZGVmaW5lZAotYnkgdGhlIGFzc2VtYmxlciBhbmQgd2lsbCBiZSByZWNvZ25pemVkIGFzIHZhbGlkIHJlZ2lzdGVyIG5hbWVzIGJ5IHRoZQotYXNzZW1ibGVyIHdoZW4gdXNlZCAod2hlcmUgYWxsb3dlZCkgaW4gY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zLgotSG93ZXZlciwgdGhlIG5hbWVzIGFuZCB2YWx1ZXMgb2YgYWxsIGNvcHJvY2Vzc29yIGRhdGEgYW5kIGNvbnRyb2wKLXJlZ2lzdGVyIG1uZW1vbmljcyBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgY29wcm9jZXNzb3IgdGFibGUuCi0KLQotVGFibGUgR3JhbW1hcgotPT09PT09PT09PT09PQotCi1IZXJlIGlzIHRoZSBncmFtbWFyIGZvciB0aGUgY29wcm9jZXNzb3IgdGFibGU6Ci0KLQkgICAgdGFibGUgLT4gZW50cnkqCi0KLQkgICAgZW50cnkgLT4gW3ogZW50cnlkZWZdIFtjb21tZW50XSAnXG4nCi0KLQkgICAgZW50cnlkZWYgLT4gdHlwZSBuYW1lIHZhbAotCSAgICBlbnRyeWRlZiAtPiAnaW5zbicgbmFtZSB2YWwgZnVuY2RlZiA7IHR5cGUgb2YgZW50cnkgKGluc3RydWN0aW9uKQotCi0JICAgIHogLT4gJ3AnWycwJy4uJzMnXQkgICAgCSAgICAgOyBwcm9jZXNzb3IgbnVtYmVyIAotCSAgICB0eXBlIC0+IFsnZHJlZycgfCAnY3JlZycgfCAnZ3JlZycgXQkgICAgIDsgdHlwZSBvZiBlbnRyeSAocmVnaXN0ZXIpCi0JOyAnZHJlZycsICdjcmVnJyBvciAnZ3JlZycgc3BlY2lmaWVzIGEgZGF0YSwgY29udHJvbCwgb3IgZ2VuZXJhbAotCTsJICAgIHJlZ2lzdGVyIG1uZW1vbmljLCByZXNwZWN0aXZlbHkKLQkgICAgbmFtZSAtPiBbbHRyfGRlY10qCSAgICAJICAgICA7IG1uZW1vbmljIG9mIHJlZ2lzdGVyL2Z1bmN0aW9uCi0JICAgIHZhbCAtPiBbZGVjfGhleF0JICAgIAkgICAgIDsgcmVnaXN0ZXIvZnVuY3Rpb24gbnVtYmVyIChpbnRlZ2VyIGNvbnN0YW50KQotCi0JICAgIGZ1bmNkZWYgLT4gZnJhbmdlIGZsYWdzIGZpZWxkcwotCSAgICAJICAgIAkgICAgCTsgYml0ZmllbGQgcmFuZ2UgZm9yIG9wY29kZQotCSAgICAJICAgIAkgICAgCTsgbGlzdCBvZiBmaWVsZHMnIGZvcm1hdHMKLQkgICAgZmllbGRzIC0+IGZpZWxkKgotCSAgICBmaWVsZCAtPiBbJywnXSBmdHlwZSBmcmFuZ2UgZmxhZ3MKLQkgICAgZmxhZ3MgLT4gWycqJyBmbGFnZXhwcl0KLQkgICAgZmxhZ2V4cHIgLT4gJ1snIGZsYWdleHByICddJwotCSAgICBmbGFnZXhwciAtPiB2YWwgJ3wnIGZsYWdleHByIAotCSAgICBmdHlwZSAtPiBbIHR5cGUgfCAnaW1tZWQnIHwgJ2FkZHInIF0KLQk7ICdpbW1lZCcgc3BlY2lmaWVzIGFuIGltbWVkaWF0ZSB2YWx1ZTsgc2VlIGdyYW1tYXIgZm9yICJ2YWwiIGFib3ZlCi0JICAgIAk7ICdhZGRyJyBzcGVjaWZpZXMgYSBDIGlkZW50aWZpZXI7IG5hbWUgb2Ygc3ltYm9sIHRvIGJlIHJlc29sdmVkIGF0IAotCTsJICAgIGxpbmsgdGltZQotCSAgICBmcmFuZ2UgLT4gJzonIHZhbCAnLScgdmFsCTsgc3RhcnRpbmcgdG8gZW5kaW5nIGJpdCBwb3NpdGlvbnMsIHdoZXJlCi0JICAgIAkgICAgCSAgICAJOyB3aGVyZSAwIGlzIGxlYXN0IHNpZ25pZmljYW50IGJpdAotCSAgICBmcmFuZ2UgLT4gKG51bGwpCSAgICAJOyBkZWZhdWx0IHJhbmdlIG9mIDMxLTAgd2lsbCBiZSBhc3N1bWVkCi0KLQkgICAgY29tbWVudCAtPiBbJzsnfCcjJ10gW2NoYXJdKgotCSAgICBjaGFyIC0+IGFueSBwcmludGFibGUgY2hhcmFjdGVyCi0JICAgIGx0ciAtPiBbJ2EnLi4neid8J0EnLi4nWiddIAotCSAgICBkZWMgLT4gWycwJy4uJzknXSoJICAgIAkgICAgCSAgICAJICAgIAkgICAgIDsgdmFsdWUgaW4gZGVjaW1hbAotCSAgICBoZXggLT4gJzB4J1snMCcuLic5JyB8ICdhJy4uJ2YnIHwgJ0EnLi4nRiddKgk7IHZhbHVlIGluIGhleGlkZWNpbWFsIAotCi0KLUV4YW1wbGVzCi09PT09PT09PQotCi1FeGFtcGxlIDE6Ci0KLVRoZSB0YWJsZToKLQotCSAgICBwMSBkcmVnIGQxIDEJICAgICA7IGRhdGEgcmVnaXN0ZXIgImQxIiBmb3IgQ09QMSBoYXMgdmFsdWUgMQotCSAgICBwMSBjcmVnIGMzIDMJICAgICA7IGN0cmwgcmVnaXN0ZXIgImMzIiBmb3IgQ09QMSBoYXMgdmFsdWUgMwotCSAgICBwMyBmdW5jIGZpbGwgMHgxZjoyNC0yMAkgICAgICA7IGZ1bmN0aW9uICJmaWxsIiBmb3IgQ09QMyBoYXMgdmFsdWUgMzEgYW5kIAotCSAgICAJICAgIAk7IG5vIGZpZWxkcwotCi13aWxsIGFsbG93IHRoZSBhc3NlbWJsZXIgdG8gYWNjZXB0IHRoZSBmb2xsb3dpbmcgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zOgotCi0JICAgIExXQzEgZDEsMHgxMDAgKCQyKQotCSAgICBmaWxsCi0KLUhlcmUsIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgIiQyIiwgYW5kIGluc3RydWN0aW9uICJMV0MxIiwgYXJlIHN0YW5kYXJkIAotbW5lbW9uaWNzIGJ1aWx0LWluIHRvIHRoZSBNSVBTIGFzc2VtYmxlci4gIAotCi0KLUV4YW1wbGUgMjoKLQotVGhlIHRhYmxlOgotCi0JICAgIHAzIGRyZWcgZDMgMwkgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0JICAgIHAzIGNyZWcgYzIgMjIJICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLQkgICAgcDMgZnVuYyBmZWUgMHgxZjoyNC0yMCBkcmVnOjE3LTEzIGNyZWc6MTItOCBpbW1lZDo3LTAgCi0JICAgIAk7IGZ1bmN0aW9uICJmZWUiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMSwgYW5kIDMgZmllbGRzIAotCSAgICAJOyBjb25zaXN0aW5nIG9mIGEgZGF0YSByZWdpc3RlciwgYSBjb250cm9sIHJlZ2lzdGVyLCAKLQkgICAgCTsgYW5kIGFuIGltbWVkaWF0ZSB2YWx1ZS4KLQotd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCB0aGUgZm9sbG93aW5nIGNvcHJvY2Vzc29yIGluc3RydWN0aW9uOgotCi0JICAgIGZlZSBkMyxjMiwweDEKLQotYW5kIHdpbGwgZW1pdCB0aGUgb2JqZWN0IGNvZGU6Ci0KLQkgICAgMzEtMjYgIDI1IDI0LTIwIDE5LTE4ICAxNy0xMyAxMi04ICA3LTAKLQkgICAgQ09QeiAgIENPIGZ1bgkgICAgCSAgICAgIGRyZWcgIGNyZWcgIGltbWVkCi0JICAgIDAxMDAxMSAxICAxMTExMSAwMAkgICAgIDAwMDExIDEwMTEwIDAwMDAwMDAxIAotCi0JICAgIDB4NGZmMDc2MDEKLQotCi1FeGFtcGxlIDM6Ci0KLVRoZSB0YWJsZToKLQotCSAgICBwMyBkcmVnIGQzIDMJICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotCSAgICBwMyBjcmVnIGMyIDIyCSAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0JICAgIHAzIGZ1bmMgZnV1IDB4MDFmMDAwMDEgZHJlZzoxNy0xMyBjcmVnOjEyLTgKLQotd2lsbCBhbGxvdyB0aGUgYXNzZW1ibGVyIHRvIGFjY2VwdCB0aGUgZm9sbG93aW5nIGNvcHJvY2Vzc29yCi1pbnN0cnVjdGlvbjoKLQotCSAgICBmdXUgZDMsYzIKLQotYW5kIHdpbGwgZW1pdCB0aGUgb2JqZWN0IGNvZGU6Ci0KLQkgICAgMzEtMjYgIDI1IDI0LTIwIDE5LTE4ICAxNy0xMyAxMi04ICA3LTAKLQkgICAgQ09QeiAgIENPIGZ1bgkgICAgCSAgICAgIGRyZWcgIGNyZWcgIAotCSAgICAwMTAwMTEgMSAgMTExMTEgMDAJICAgICAwMDAxMSAxMDExMCAwMDAwMDAwMSAKLQotCSAgICAweDRmZjA3NjAxCi0KLUluIHRoaXMgd2F5LCB0aGUgcHJvZ3JhbW1lciBjYW4gZm9yY2UgYXJiaXRyYXJ5IGJpdHMgb2YgYW4gaW5zdHJ1Y3Rpb24KLXRvIGhhdmUgcHJlZGVmaW5lZCB2YWx1ZXMuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1BZGRpdGlvbmFsIG5vdGVzOgotCi1FbmNvZGluZyBvZiByYW5nZXM6Ci1UbyBoYW5kbGUgbW9yZSB0aGFuIG9uZSBiaXQgcG9zaXRpb24gcmFuZ2Ugd2l0aGluIGFuIGluc3RydWN0aW9uLAotdXNlIDBzIHRvIG1hc2sgb3V0IHRoZSByYW5nZXMgd2hpY2ggZG9uJ3QgYXBwbHkuCi1NYXkgZGVjaWRlIHRvIG1vZGlmeSB0aGUgc3ludGF4IHRvIGFsbG93IGNvbW1hcyBzZXBhcmF0ZSBtdWx0aXBsZSAKLXJhbmdlcyB3aXRoaW4gYW4gaW5zdHJ1Y3Rpb24gKHJhbmdlJywncmFuZ2UpLgotCi1DaGFuZ2VzIGluIGdyYW1tYXI6Ci0JVGhlIG51bWJlciBvZiBwYXJtcyBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24gZW50cnkKLXdhcyBkZWxldGVkIGZyb20gdGhlIG9yaWdpbmFsIGZvcm1hdCBzdWNoIHRoYXQgd2Ugbm93IGNvdW50IHRoZSBmaWVsZHMuCi0KLS0tLS0KLUZJWE1FISBzaG91bGQgcmVhbGx5IGNoYW5nZSBsZXhpY2FsIGFuYWx5emVyIAotdG8gcmVjb2duaXplICdkcmVnJyBldGMuIGluIGNvbnRleHQgc2Vuc2F0aXZlIHdheS4KLUN1cnJlbnRseSBmdW5jdGlvbiBuYW1lcyBvciBtbmVtb25pY3MgbWF5IGJlIGluY29ycmVjdGx5IHBhcnNlZCBhcyBrZXl3b3JkcwotCi1GSVhNRSEgaGV4IGlzIGFtYmlndW91cyB3aXRoIGFueSBkaWdpdAotCi0qLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJpdGJsLW9wcy5oIgotCi0vKiAjZGVmaW5lIERFQlVHICovCi0KLSNpZmRlZiBERUJVRwotI2lmbmRlZiBEQkdfTFZMCi0jZGVmaW5lIERCR19MVkwgMQotI2VuZGlmCi0jZWxzZQotI2RlZmluZSBEQkdfTFZMIDAKLSNlbmRpZgotCi0jaWYgREJHX0xWTCA+PSAxCi0jZGVmaW5lIERCRyh4KSBwcmludGYgeAotI2Vsc2UKLSNkZWZpbmUgREJHKHgpIAotI2VuZGlmCi0KLSNpZiBEQkdfTFZMID49IDIKLSNkZWZpbmUgREJHTDIoeCkgcHJpbnRmIHgKLSNlbHNlCi0jZGVmaW5lIERCR0wyKHgpIAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc2JpdCwgZWJpdDsKLXN0YXRpYyBzdHJ1Y3QgaXRibF9lbnRyeSAqaW5zbj0wOwotZXh0ZXJuIGludCBpbnNudGJsX2xpbmU7Ci1pbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1pbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB5eWVycm9yIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0lfQotCi0ldW5pb24gCi0gIHsKLSAgICBjaGFyICpzdHI7Ci0gICAgaW50IG51bTsKLSAgICBpbnQgcHJvY2Vzc29yOwotICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotICB9Ci0KLSV0b2tlbgkgICAgRFJFRyBDUkVHIEdSRUcgSU1NRUQgQUREUiBJTlNOIE5VTSBJRCBOTCBQTlVNCi0ldHlwZQkgICAgPHZhbD4gdmFsdWUgZmxhZ3MgZmxhZ2V4cHIKLSV0eXBlCSAgICA8bnVtPiBudW1iZXIgTlVNIGZ0eXBlIHJlZ3R5cGUgcG51bSBQTlVNCi0ldHlwZQkgICAgPHN0cj4gSUQgbmFtZQotCi0lc3RhcnQgaW5zbnRibAotCi0lJQotCi1pbnNudGJsOgotCWVudHJ5cwotCTsKLQotZW50cnlzOgotCWVudHJ5IGVudHJ5cwotCXwKLQk7Ci0KLWVudHJ5OgotCXBudW0gcmVndHlwZSBuYW1lIHZhbHVlIE5MCi0JICB7Ci0JICAgIERCRyAoKCJsaW5lICVkOiBlbnRyeSBwbnVtPSVkIHR5cGU9JWQgbmFtZT0lcyB2YWx1ZT14JXhcbiIsIAotCSAgICAJICAgIGluc250YmxfbGluZSwgJDEsICQyLCAkMywgJDQpKTsKLQkgICAgaXRibF9hZGRfcmVnICgkMSwgJDIsICQzLCAkNCk7Ci0JICB9Ci0JfCBwbnVtIElOU04gbmFtZSB2YWx1ZSByYW5nZSBmbGFncwotCSAgewotCSAgICBEQkcgKCgibGluZSAlZDogZW50cnkgcG51bT0lZCB0eXBlPUlOU04gbmFtZT0lcyB2YWx1ZT14JXgiLAotCSAgICAJICAgIGluc250YmxfbGluZSwgJDEsICQzLCAkNCkpOwotCSAgICBEQkcgKCgiIHNiaXQ9JWQgZWJpdD0lZCBmbGFncz0weCV4XG4iLCBzYml0LCBlYml0LCAkNikpOwotCSAgICBpbnNuPWl0YmxfYWRkX2luc24gKCQxLCAkMywgJDQsIHNiaXQsIGViaXQsICQ2KTsKLQkgIH0KLQlmaWVsZHNwZWNzIE5MCi0JfCBOTAotCXwgZXJyb3IgTkwKLQk7Ci0KLWZpZWxkc3BlY3M6Ci0JJywnIGZpZWxkc3BlYyBmaWVsZHNwZWNzCi0JfCBmaWVsZHNwZWMgZmllbGRzcGVjcwotCXwKLQk7Ci0KLWZ0eXBlOgotCXJlZ3R5cGUgCi0JICB7Ci0JICAgIERCR0wyICgoImZ0eXBlXG4iKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JfCBBRERSIAotCSAgewotCSAgICBEQkdMMiAoKCJhZGRyXG4iKSk7Ci0JICAgICQkID0gQUREUjsKLQkgIH0KLQl8IElNTUVECi0JICB7Ci0JICAgIERCR0wyICgoImltbWVkXG4iKSk7Ci0JICAgICQkID0gSU1NRUQ7Ci0JICB9Ci0JOwotCi1maWVsZHNwZWM6Ci0JZnR5cGUgcmFuZ2UgZmxhZ3MKLQkgIHsKLQkgICAgREJHICgoImxpbmUgJWQ6IGZpZWxkIHR5cGU9JWQgc2JpdD0lZCBlYml0PSVkLCBmbGFncz0weCV4XG4iLCAKLQkgICAgCSAgICBpbnNudGJsX2xpbmUsICQxLCBzYml0LCBlYml0LCAkMykpOwotCSAgICBpdGJsX2FkZF9vcGVyYW5kIChpbnNuLCAkMSwgc2JpdCwgZWJpdCwgJDMpOwotCSAgfQotCTsKLQotZmxhZ2V4cHI6Ci0JTlVNICd8JyBmbGFnZXhwcgotCSAgewotCSAgICAkJCA9ICQxIHwgJDM7Ci0JICB9Ci0JfCAnWycgZmxhZ2V4cHIgJ10nCi0JICB7Ci0JICAgICQkID0gJDI7Ci0JICB9Ci0JfCBOVU0KLQkgIHsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLWZsYWdzOgotCScqJyBmbGFnZXhwcgotCSAgewotCSAgICBEQkdMMiAoKCJmbGFncz0lZFxuIiwgJDIpKTsKLQkgICAgJCQgPSAkMjsKLQkgIH0KLQl8IAotCSAgewotCSAgICAkJCA9IDA7Ci0JICB9Ci0JOwotCi1yYW5nZToKLQknOicgTlVNICctJyBOVU0KLQkgIHsKLQkgICAgREJHTDIgKCgicmFuZ2UgJWQgJWRcbiIsICQyLCAkNCkpOwotCSAgICBzYml0ID0gJDI7Ci0JICAgIGViaXQgPSAkNDsKLQkgIH0KLQl8Ci0JICB7Ci0JICAgIHNiaXQgPSAzMTsKLQkgICAgZWJpdCA9IDA7Ci0JICB9Ci0JOwotCSAgICAKLXBudW06Ci0JUE5VTQotCSAgewotCSAgICBEQkdMMiAoKCJwbnVtPSVkXG4iLCQxKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotCi1yZWd0eXBlOgotCSAgICAgRFJFRwotCSAgewotCSAgICBEQkdMMiAoKCJkcmVnXG4iKSk7Ci0JICAgICQkID0gRFJFRzsKLQkgIH0KLQl8IENSRUcKLQkgIHsKLQkgICAgREJHTDIgKCgiY3JlZ1xuIikpOwotCSAgICAkJCA9IENSRUc7Ci0JICB9Ci0JfCBHUkVHCi0JICB7Ci0JICAgIERCR0wyICgoImdyZWdcbiIpKTsKLQkgICAgJCQgPSBHUkVHOwotCSAgfQotCTsKLQotbmFtZToKLQlJRAotCSAgewotCSAgICBEQkdMMiAoKCJuYW1lPSVzXG4iLCQxKSk7Ci0JICAgICQkID0gJDE7IAotCSAgfQotCTsKLQotbnVtYmVyOgotCU5VTQotCSAgewotCSAgICBEQkdMMiAoKCJudW09JWRcbiIsJDEpKTsKLQkgICAgJCQgPSAkMTsKLQkgIH0KLQk7Ci0KLXZhbHVlOgotCU5VTQotCSAgewotCSAgICBEQkdMMiAoKCJ2YWw9eCV4XG4iLCQxKSk7Ci0JICAgICQkID0gJDE7Ci0JICB9Ci0JOwotJSUKLQotc3RhdGljIGludAoteXllcnJvciAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIHByaW50ZiAoImxpbmUgJWQ6ICVzXG4iLCBpbnNudGJsX2xpbmUsIG1zZyk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZ2FzL2xpbmsuY21kIGIvZ2FzL2xpbmsuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM1Y2E4Li4wMDAwMDAwCi0tLSBhL2dhcy9saW5rLmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUFMSUdOPTEwMjQKLVJFU05VTSAweDAwMDAsIDB4ODAwMAotOyBQdXR0aW5nIGluIC5saXQxIGdpdmVzIGVycm9ycy4KLU9SREVSIC5kYXRhPTB4ODAwMDIwMDAsIC5kYXRhMSwgLmxpdCwgLmJzcwotOyBMZXQncyBwdXQgdGhpcyBvbiB0aGUgY29tbWFuZCBsaW5lIHNvIGl0IGdvZXMgZmlyc3QsIHdoaWNoIGlzIHdoYXQKLTsgR0RCIGV4cGVjdHMuCi07IExPQUQgL3MyL2FtZC8yOWsvbGliL2NydDAubwotTE9BRCAvczIvYW1kLzI5ay9saWIvbGlicWNiMGgubGliCi1MT0FEIC9zMi9hbWQvMjlrL2xpYi9saWJzY2IwaC5saWIKLUxPQUQgL3MyL2FtZC8yOWsvbGliL2xpYmFjYjBoLmxpYgpkaWZmIC0tZ2l0IGEvZ2FzL2xpc3RpbmcuYyBiL2dhcy9saXN0aW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZGE5MTYuLjAwMDAwMDAKLS0tIGEvZ2FzL2xpc3RpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MjAgKzAsMCBAQAotLyogbGlzdGluZy5jIC0gbWFpbnRpbmcgYXNzZW1ibHkgbGlzdGluZ3MKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi1HQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICovCi0KLS8qCi0gQ29udHJpYnV0ZWQgYnkgU3RldmUgQ2hhbWJlcmxhaW4KLSAJCXNhY0BjeWdudXMuY29tCi0KLQotIEEgbGlzdGluZyBwYWdlIGxvb2tzIGxpa2U6Ci0KLSBMSVNUSU5HX0hFQURFUiAgc291cmNlZmlsZW5hbWUgcGFnZW51bWJlcgotIFRJVExFIExJTkUKLSBTVUJUSVRMRSBMSU5FCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotIGxpbmVudW1iZXIgYWRkcmVzcyBkYXRhICBzb3VyY2UKLSBsaW5lbnVtYmVyIGFkZHJlc3MgZGF0YSAgc291cmNlCi0gbGluZW51bWJlciBhZGRyZXNzIGRhdGEgIHNvdXJjZQotCi0gSWYgbm90IG92ZXJyaWRkZW4sIHRoZSBsaXN0aW5nIGNvbW1hbmRzIGFyZToKLQotIC50aXRsZSAgInN0dWZmIgotIAlQdXQgInN0dWZmIiBvbnRvIHRoZSB0aXRsZSBsaW5lCi0gLnNidHRsICAic3R1ZmYiCi0gICAgICAgIFB1dCBzdHVmZiBvbnRvIHRoZSBzdWJ0aXRsZSBsaW5lCi0KLSAgSWYgdGhlc2UgY29tbWFuZHMgY29tZSB3aXRoaW4gMTAgbGluZXMgb2YgdGhlIHRvcCBvZiB0aGUgcGFnZSwgdGhleQotICB3aWxsIGFmZmVjdCB0aGUgcGFnZSB0aGV5IGFyZSBvbiwgYXMgd2VsbCBhcyBhbnkgc3Vic2VxdWVudCBwYWdlCi0KLSAuZWplY3QKLSAJVGhvdyBhIHBhZ2UKLSAubGlzdAotIAlJbmNyZW1lbnQgdGhlIGVuYWJsZSBsaXN0aW5nIGNvdW50ZXIKLSAubm9saXN0Ci0gCURlY3JlbWVudCB0aGUgZW5hYmxlIGxpc3RpbmcgY291bnRlcgotCi0gLnBzaXplIFlbLFhdCi0gCVNldCB0aGUgcGFwZXIgc2l6ZSB0byBYIHdpZGUgYW5kIFkgaGlnaC4gU2V0dGluZyBhIHBzaXplIFkgb2YKLQl6ZXJvIHdpbGwgc3VwcHJlc3MgZm9ybSBmZWVkcyBleGNlcHQgd2hlcmUgZGVtYW5kZWQgYnkgLmVqZWN0Ci0KLSBJZiB0aGUgY291bnRlciBnb2VzIGJlbG93IHplcm8sIGxpc3RpbmcgaXMgc3VwcHJlc3NlZC4KLQotCi0gTGlzdGluZ3MgYXJlIGEgbWFpbnRhaW5lZCBieSByZWFkIGNhbGxpbmcgdmFyaW91cyBsaXN0aW5nXzxmb28+Ci0gZnVuY3Rpb25zLiAgV2hhdCBoYXBwZW5zIG1vc3QgaXMgdGhhdCB0aGUgbWFjcm8gTk9fTElTVElORyBpcyBub3QKLSBkZWZpbmVkIChmcm9tIHRoZSBNYWtlZmlsZSksIHRoZW4gdGhlIG1hY3JvIExJU1RJTkdfTkVXTElORSBleHBhbmRzCi0gaW50byBhIGNhbGwgdG8gbGlzdGluZ19uZXdsaW5lLiAgVGhlIGNhbGwgaXMgZG9uZSBmcm9tIHJlYWQuYywgZXZlcnkKLSB0aW1lIGl0IHNlZXMgYSBuZXdsaW5lLCBhbmQgLWwgaXMgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotIFRoZSBmdW5jdGlvbiBsaXN0aW5nX25ld2xpbmUgcmVtZW1iZXJzIHRoZSBmcmFnIGFzc29jaWF0ZWQgd2l0aCB0aGUKLSBuZXdsaW5lLCBhbmQgY3JlYXRlcyBhIG5ldyBmcmFnIC0gbm90ZSB0aGF0IHRoaXMgaXMgd2FzdGVmdWwsIGJ1dCBub3QKLSBhIGJpZyBkZWFsLCBzaW5jZSBsaXN0aW5nIHNsb3dzIHRoaW5ncyBkb3duIGEgbG90IGFueXdheS4gIFRoZQotIGZ1bmN0aW9uIGFsc28gcmVtZW1lYmVycyB3aGVuIHRoZSBmaWxlbmFtZSBjaGFuZ2VzLgotCi0gV2hlbiBhbGwgdGhlIGlucHV0IGhhcyBmaW5pc2hlZCwgYW5kIGdhcyBoYXMgaGFkIGEgY2hhbmNlIHRvIHNldHRsZQotIGRvd24sIHRoZSBsaXN0aW5nIGlzIG91dHB1dC4gVGhpcyBpcyBkb25lIGJ5IHJ1bm5pbmcgZG93biB0aGUgbGlzdCBvZgotIGZyYWcvc291cmNlIGZpbGUgcmVjb3JkcywgYW5kIG9wZW5pbmcgdGhlIGZpbGVzIGFzIG5lZWRlZCBhbmQgcHJpbnRpbmcKLSBvdXQgdGhlIGJ5dGVzIGFuZCBjaGFycyBhc3NvY2lhdGVkIHdpdGggdGhlbS4KLQotIFRoZSBvbmx5IHRoaW5ncyB3aGljaCB0aGUgYXJjaGl0ZWN0dXJlIGNhbiBjaGFuZ2UgYWJvdXQgdGhlIGxpc3RpbmcKLSBhcmUgZGVmaW5lZCBpbiB0aGVzZSBtYWNyb3M6Ci0KLSBMSVNUSU5HX0hFQURFUgkJVGhlIG5hbWUgb2YgdGhlIGFyY2hpdGVjdHVyZQotIExJU1RJTkdfV09SRF9TSVpFICAgICAgVGhlIG1ha2Ugb2YgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHdvcmQsIHRoaXMgZGV0ZXJtaW5lcwotIAkJCXRoZSBjbHVtcGluZyBvZiB0aGUgb3V0cHV0IGRhdGEuIGVnIGEgdmFsdWUgb2YKLQkJCTIgbWFrZXMgd29yZHMgbG9vayBsaWtlIDEyMzQgNTY3OCwgd2hpbHN0IDEKLQkJCXdvdWxkIG1ha2UgdGhlIHNhbWUgdmFsdWUgbG9vayBsaWtlIDEyIDM0IDU2Ci0JCQk3OAotIExJU1RJTkdfTEhTX1dJRFRIICAgICAgTnVtYmVyIG9mIHdvcmRzIG9mIGFib3ZlIHNpemUgZm9yIHRoZSBsaHMKLQotIExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORCAgIE51bWJlciBvZiB3b3JkcyBmb3IgdGhlIGRhdGEgb24gdGhlIGxocwotIAkJCWZvciB0aGUgc2Vjb25kIGxpbmUKLQotIExJU1RJTkdfTEhTX0NPTlRfTElORVMJTWF4IG51bWJlciBvZiBsaW5lcyB0byB1c2UgdXAgZm9yIGEgY29udGludXRhdGlvbgotIExJU1RJTkdfUkhTX1dJRFRIICAgICAgTnVtYmVyIG9mIGNoYXJzIGZyb20gdGhlIGlucHV0IGZpbGUgdG8gcHJpbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgbGluZQotKi8KLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgPG9ic3RhY2suaD4KLSNpbmNsdWRlICJpbnB1dC1maWxlLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLQotI2lmbmRlZiBMSVNUSU5HX0hFQURFUgotI2RlZmluZSBMSVNUSU5HX0hFQURFUiAiR0FTIExJU1RJTkciCi0jZW5kaWYKLSNpZm5kZWYgTElTVElOR19XT1JEX1NJWkUKLSNkZWZpbmUgTElTVElOR19XT1JEX1NJWkUgNAotI2VuZGlmCi0jaWZuZGVmIExJU1RJTkdfTEhTX1dJRFRICi0jZGVmaW5lIExJU1RJTkdfTEhTX1dJRFRIIDEKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19XSURUSF9TRUNPTkQKLSNkZWZpbmUgTElTVElOR19MSFNfV0lEVEhfU0VDT05EIDEKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX1JIU19XSURUSAotI2RlZmluZSBMSVNUSU5HX1JIU19XSURUSCAxMDAKLSNlbmRpZgotI2lmbmRlZiBMSVNUSU5HX0xIU19DT05UX0xJTkVTCi0jZGVmaW5lIExJU1RJTkdfTEhTX0NPTlRfTElORVMgNAotI2VuZGlmCi0KLS8qIFRoaXMgc3RydWN0dXJlIHJlbWVtYmVycyB3aGljaCAucyB3ZXJlIHVzZWQgKi8KLXR5cGVkZWYgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QKLXsKLSAgc3RydWN0IGZpbGVfaW5mb19zdHJ1Y3QgKiBuZXh0OwotICBjaGFyICogICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOwotICBsb25nICAgICAgICAgICAgICAgICAgICAgIHBvczsKLSAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBsaW5lbnVtOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGF0X2VuZDsKLX0KLWZpbGVfaW5mb190eXBlOwotCi0vKiBUaGlzIHN0cnVjdHVyZSByZW1lbWVicnMgd2hpY2ggbGluZSBmcm9tIHdoaWNoIGZpbGUgZ29lcyBpbnRvIHdoaWNoCi0gICBmcmFnICovCi1zdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdAotewotICAvKiBGcmFnIHdoaWNoIHRoaXMgbGluZSBvZiBzb3VyY2UgaXMgbmVhcmVzdCB0byAqLwotICBmcmFnUyAqIGZyYWc7Ci0KLSAgLyogVGhlIGFjdHVhbCBsaW5lIGluIHRoZSBzb3VyY2UgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgLyogUG9pbnRlciB0byB0aGUgZmlsZSBpbmZvIHN0cnVjdCBmb3IgdGhlIGZpbGUgd2hpY2ggdGhpcyBsaW5lCi0gICAgIGJlbG9uZ3MgdG8gKi8KLSAgZmlsZV9pbmZvX3R5cGUgKiBmaWxlOwotCi0gIC8qIFRoZSBleHBhbmRlZCB0ZXh0IG9mIGFueSBtYWNybyB0aGF0IG1heSBoYXZlIGJlZW4gZXhlY3V0aW5nLiAgKi8KLSAgY2hhciAqIGxpbmVfY29udGVudHM7Ci0KLSAgLyogTmV4dCBpbiBsaXN0ICovCi0gIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogbmV4dDsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBmaWxlIGluZm8gc3RydWN0IGZvciB0aGUgaGlnaCBsZXZlbCBsYW5ndWFnZQotICAgICBzb3VyY2UgbGluZSB0aGF0IGJlbG9uZ3MgaGVyZSAqLwotICBmaWxlX2luZm9fdHlwZSAqIGhsbF9maWxlOwotICAvKiBIaWdoIGxldmVsIGxhbmd1YWdlIHNvdXJjZSBsaW5lICovCi0gIHVuc2lnbmVkIGludCBobGxfbGluZTsKLQotICAvKiBQb2ludGVyIHRvIGFueSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxpbmUgKi8KLSAgY2hhciAqIG1lc3NhZ2U7Ci0KLSAgZW51bQotICAgIHsKLSAgICAgIEVESUNUX05PTkUsCi0gICAgICBFRElDVF9TQlRUTCwKLSAgICAgIEVESUNUX1RJVExFLAotICAgICAgRURJQ1RfTk9MSVNULAotICAgICAgRURJQ1RfTElTVCwKLSAgICAgIEVESUNUX05PTElTVF9ORVhULAotICAgICAgRURJQ1RfRUpFQ1QKLSAgICB9IGVkaWN0OwotICBjaGFyICogZWRpY3RfYXJnOwotCi0gIC8qIE5vbnplcm8gaWYgdGhpcyBsaW5lIGlzIHRvIGJlIG9taXR0ZWQgYmVjYXVzZSBpdCBjb250YWlucwotICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGlzIGNhbiBiZWNvbWUgYSBmbGFncyBmaWVsZCBpZiB3ZSBjb21lCi0gICAgIHVwIHdpdGggbW9yZSBpbmZvcm1hdGlvbiB0byBzdG9yZSBoZXJlLiAgKi8KLSAgaW50IGRlYnVnZ2luZzsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgbGlzdF9pbmZvX3R5cGU7Ci0KLQotaW50IGxpc3RpbmdfbGhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfTEhTX1dJRFRIOwotaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCA9IExJU1RJTkdfTEhTX1dJRFRIX1NFQ09ORDsKLWludCBsaXN0aW5nX2xoc19jb250X2xpbmVzICAgPSBMSVNUSU5HX0xIU19DT05UX0xJTkVTOwotaW50IGxpc3RpbmdfcmhzX3dpZHRoICAgICAgICA9IExJU1RJTkdfUkhTX1dJRFRIOwotCi1zdHJ1Y3QgbGlzdF9pbmZvX3N0cnVjdCAqICAgICAgICBsaXN0aW5nX3RhaWw7Ci0KLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqICAgICAgICAgIGZpbGVfaW5mb19oZWFkOwotc3RhdGljIGZpbGVfaW5mb190eXBlICogICAgICAgICAgbGFzdF9vcGVuX2ZpbGVfaW5mbzsKLXN0YXRpYyBGSUxFICogICAgICAgICAgICAgICAgICAgIGxhc3Rfb3Blbl9maWxlOwotc3RhdGljIHN0cnVjdCBsaXN0X2luZm9fc3RydWN0ICogaGVhZDsKLXN0YXRpYyBpbnQgICAgICAgICAgICAgICAgICAgICAgIHBhcGVyX3dpZHRoID0gMjAwOwotc3RhdGljIGludCAgICAgICAgICAgICAgICAgICAgICAgcGFwZXJfaGVpZ2h0ID0gNjA7Ci0KLWV4dGVybiBpbnQgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rpbmc7Ci0KLS8qIEZpbGUgdG8gb3V0cHV0IGxpc3RpbmdzIHRvLiAgKi8KLXN0YXRpYyBGSUxFICogbGlzdF9maWxlOwotCi0vKiBUaGlzIHN0YXRpYyBhcnJheSBpcyB1c2VkIHRvIGtlZXAgdGhlIHRleHQgb2YgZGF0YSB0byBiZSBwcmludGVkCi0gICBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAgKi8KLQotI2RlZmluZSBNQVhfQllURVMJCQkJCQkJXAotICAoKChMSVNUSU5HX1dPUkRfU0laRSAqIDIpICsgMSkgKiBsaXN0aW5nX2xoc193aWR0aAkJCVwKLSAgICsgKCgoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZCkJXAotICAgICAgKiBsaXN0aW5nX2xoc19jb250X2xpbmVzKQkJCQkJCVwKLSAgICsgMjApCi0KLXN0YXRpYyBjaGFyICogZGF0YV9idWZmZXI7Ci0KLS8qIFByb3RvdHlwZXMuICAqLwotc3RhdGljIHZvaWQgbGlzdGluZ19tZXNzYWdlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpKTsKLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqIGZpbGVfaW5mbyBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlX25hbWUpKTsKLXN0YXRpYyB2b2lkIG5ld19mcmFnIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICogYnVmZmVyX2xpbmUgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmZpbGUsCi0JCQkJICBjaGFyICpsaW5lLCB1bnNpZ25lZCBpbnQgc2l6ZSkpOwotc3RhdGljIHZvaWQgbGlzdGluZ19wYWdlIFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNhbGNfaGV4IFBBUkFNUyAoKGxpc3RfaW5mb190eXBlICpsaXN0KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9saW5lcyBQQVJBTVMgKChsaXN0X2luZm9fdHlwZSAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJIGNoYXIgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBsaXN0X3N5bWJvbF90YWJsZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zb3VyY2UgUEFSQU1TICgoZmlsZV9pbmZvX3R5cGUgKmN1cnJlbnRfZmlsZSwKLQkJCQkgIGxpc3RfaW5mb190eXBlICpsaXN0LAotCQkJCSAgY2hhciAqYnVmZmVyLAotCQkJCSAgdW5zaWduZWQgaW50IHdpZHRoKSk7Ci1zdGF0aWMgaW50IGRlYnVnZ2luZ19wc2V1ZG8gUEFSQU1TICgobGlzdF9pbmZvX3R5cGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBsaXN0aW5nX2xpc3RpbmcgUEFSQU1TICgoY2hhciAqbmFtZSkpOwotCi0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX21lc3NhZ2UgKG5hbWUsIG1lc3NhZ2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2U7Ci17Ci0gIHVuc2lnbmVkIGludCBsID0gc3RybGVuIChuYW1lKSArIHN0cmxlbiAobWVzc2FnZSkgKyAxOwotICBjaGFyICpuID0gKGNoYXIgKikgeG1hbGxvYyAobCk7Ci0gIHN0cmNweSAobiwgbmFtZSk7Ci0gIHN0cmNhdCAobiwgbWVzc2FnZSk7Ci0gIGlmIChsaXN0aW5nX3RhaWwgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwpCi0gICAgewotICAgICAgbGlzdGluZ190YWlsLT5tZXNzYWdlID0gbjsKLSAgICB9Ci19Ci0KLXZvaWQKLWxpc3Rpbmdfd2FybmluZyAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgbGlzdGluZ19tZXNzYWdlIChfKCJXYXJuaW5nOiIpLCBtZXNzYWdlKTsKLX0KLQotdm9pZAotbGlzdGluZ19lcnJvciAobWVzc2FnZSkKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLXsKLSAgbGlzdGluZ19tZXNzYWdlIChfKCJFcnJvcjoiKSwgbWVzc2FnZSk7Ci19Ci0KLXN0YXRpYyBmaWxlX2luZm9fdHlwZSAqCi1maWxlX2luZm8gKGZpbGVfbmFtZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZV9uYW1lOwotewotICAvKiBGaW5kIGFuIGVudHJ5IHdpdGggdGhpcyBmaWxlIG5hbWUgKi8KLSAgZmlsZV9pbmZvX3R5cGUgKnAgPSBmaWxlX2luZm9faGVhZDsKLQotICB3aGlsZSAocCAhPSAoZmlsZV9pbmZvX3R5cGUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKSA9PSAwKQotCXJldHVybiBwOwotICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotCi0gIC8qIE1ha2UgbmV3IGVudHJ5ICovCi0KLSAgcCA9IChmaWxlX2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGZpbGVfaW5mb190eXBlKSk7Ci0gIHAtPm5leHQgPSBmaWxlX2luZm9faGVhZDsKLSAgZmlsZV9pbmZvX2hlYWQgPSBwOwotICBwLT5maWxlbmFtZSA9IHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSBzdHJsZW4gKGZpbGVfbmFtZSkgKyAxKTsKLSAgc3RyY3B5IChwLT5maWxlbmFtZSwgZmlsZV9uYW1lKTsKLSAgcC0+cG9zID0gMDsKLSAgcC0+bGluZW51bSA9IDA7Ci0gIHAtPmF0X2VuZCA9IDA7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLQotc3RhdGljIHZvaWQKLW5ld19mcmFnICgpCi17Ci0KLSAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gIGZyYWdfbmV3ICgwKTsKLQotfQotCi12b2lkCi1saXN0aW5nX25ld2xpbmUgKHBzKQotICAgICBjaGFyICpwczsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHN0YXRpYyB1bnNpZ25lZCBpbnQgbGFzdF9saW5lID0gMHhmZmZmOwotICBzdGF0aWMgY2hhciAqbGFzdF9maWxlID0gTlVMTDsKLSAgbGlzdF9pbmZvX3R5cGUgKm5ldyA9IE5VTEw7Ci0KLSAgaWYgKGxpc3RpbmcgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICByZXR1cm47Ci0KLSNpZmRlZiBPQkpfRUxGCi0gIC8qIEluIEVMRiwgYW55dGhpbmcgaW4gYSBzZWN0aW9uIGJlZ2lubmluZyB3aXRoIC5kZWJ1ZyBvciAubGluZSBpcwotICAgICBjb25zaWRlcmVkIHRvIGJlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgaW5jbHVkZXMgdGhlCi0gICAgIHN0YXRlbWVudCB3aGljaCBzd2l0Y2hlcyB1cyBpbnRvIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbiwgd2hpY2ggd2UKLSAgICAgY2FuIG9ubHkgc2V0IGFmdGVyIHdlIGFyZSBhbHJlYWR5IGluIHRoZSBkZWJ1Z2dpbmcgc2VjdGlvbi4gICovCi0gIGlmICgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykgIT0gMAotICAgICAgJiYgbGlzdGluZ190YWlsICE9IE5VTEwKLSAgICAgICYmICEgbGlzdGluZ190YWlsLT5kZWJ1Z2dpbmcpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc2VnbmFtZTsKLQotICAgICAgc2VnbmFtZSA9IHNlZ21lbnRfbmFtZSAobm93X3NlZyk7Ci0gICAgICBpZiAoc3RybmNtcCAoc2VnbmFtZSwgIi5kZWJ1ZyIsIHNpemVvZiAiLmRlYnVnIiAtIDEpID09IDAKLQkgIHx8IHN0cm5jbXAgKHNlZ25hbWUsICIubGluZSIsIHNpemVvZiAiLmxpbmUiIC0gMSkgPT0gMCkKLQlsaXN0aW5nX3RhaWwtPmRlYnVnZ2luZyA9IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0gIGlmIChwcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChsaW5lID09IGxhc3RfbGluZSAmJiAhKGxhc3RfZmlsZSAmJiBmaWxlICYmIHN0cmNtcCAoZmlsZSwgbGFzdF9maWxlKSkpCi0JcmV0dXJuOwotCi0gICAgICBuZXcgPSAobGlzdF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mIChsaXN0X2luZm9fdHlwZSkpOwotCi0gICAgICAvKiBEZXRlY3QgaWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiBieSBleGFtaW5pbmcgdGhlIGZpbGUKLQkgbmFtZSByZXR1cm5lZCBieSBhc193aGVyZSgpLgotCi0JIFtGSVhNRTogV2UgcmVseSB1cG9uIHRoZSBuYW1lIGluIHRoZSBzdHJjbXAgYmVsb3cgYmVpbmcgdGhlCi0JIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGJ5IGlucHV0X3NjcnViX25ld19maWxlKCksIGlmIHRoYXQgaXMKLQkgbm90IHRydWUsIHRoZW4gdGhpcyBjb2RlIHdpbGwgZmFpbF0uCi0KLQkgSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSBzdGRpbiwgdGhlbiB3ZSBuZWVkIHRvIHNhdmUgZWFjaCBpbnB1dCBsaW5lCi0JIGhlcmUgKGFzc3VtaW5nIG9mIGNvdXJzZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgYSBsaW5lIG9mIGlucHV0IHRvIHJlYWQpLAotCSBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3RpbmcgdGhhdCBpcyBwcm9kdWNlZCBhdCB0aGUgZW5kCi0JIG9mIHRoZSBhc3NlbWJseS4gICovCi0gICAgICBpZiAoc3RyY21wIChmaWxlLCBfKCJ7c3RhbmRhcmQgaW5wdXR9IikpID09IDAKLQkgICYmIGlucHV0X2xpbmVfcG9pbnRlciAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKiBjb3B5OwotCSAgaW50IGxlbjsKLQkgIGludCBzZWVuX3F1b3RlID0gMDsKLQotCSAgZm9yIChjb3B5ID0gaW5wdXRfbGluZV9wb2ludGVyIC0gMTsKLQkgICAgICAgKiBjb3B5ICYmIChzZWVuX3F1b3RlCi0JCQkgIHx8ICghIGlzX2VuZF9vZl9saW5lIFsodW5zaWduZWQgY2hhcikgKiBjb3B5XSkpOwotCSAgICAgICBjb3B5ICsrKQotCSAgICBpZiAoKiBjb3B5ID09ICciJyAmJiBjb3B5Wy0xXSAhPSAnXFwnKQotCSAgICAgIHNlZW5fcXVvdGUgPSAhIHNlZW5fcXVvdGU7Ci0KLQkgIGxlbiA9IChjb3B5IC0gaW5wdXRfbGluZV9wb2ludGVyKSArIDI7Ci0KLQkgIGNvcHkgPSB4bWFsbG9jIChsZW4pOwotCi0JICBpZiAoY29weSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqIHNyYyA9IGlucHV0X2xpbmVfcG9pbnRlciAtIDE7Ci0JICAgICAgY2hhciAqIGRlc3QgPSBjb3B5OwotCSAgICAgIAotCSAgICAgIHdoaWxlICgtLWxlbikKLQkJewotCQkgIHVuc2lnbmVkIGNoYXIgYyA9ICogc3JjICsrOwotCi0JCSAgLyogT21pdCBjb250cm9sIGNoYXJhY3RlcnMgaW4gdGhlIGxpc3RpbmcuICAqLwotCQkgIGlmIChpc2FzY2lpIChjKSAmJiAhIGlzY250cmwgKGMpKQotCQkgICAgKiBkZXN0ICsrID0gYzsKLQkJfQotCSAgICAgIAotCSAgICAgICpkZXN0ID0gMDsKLQkgICAgfQotCSAgCi0JICBuZXctPmxpbmVfY29udGVudHMgPSBjb3B5OwotCX0KLSAgICAgIGVsc2UKLQluZXctPmxpbmVfY29udGVudHMgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIG5ldyA9IChsaXN0X2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKGxpc3RfaW5mb190eXBlKSk7Ci0gICAgICBuZXctPmxpbmVfY29udGVudHMgPSBwczsKLSAgICB9Ci0KLSAgbGFzdF9saW5lID0gbGluZTsKLSAgbGFzdF9maWxlID0gZmlsZTsKLSAgCi0gIG5ld19mcmFnICgpOwotCi0gIGlmIChsaXN0aW5nX3RhaWwpCi0gICAgbGlzdGluZ190YWlsLT5uZXh0ID0gbmV3OwotICBlbHNlCi0gICAgaGVhZCA9IG5ldzsKLSAgCi0gIGxpc3RpbmdfdGFpbCA9IG5ldzsKLQotICBuZXctPmZyYWcgPSBmcmFnX25vdzsKLSAgbmV3LT5saW5lID0gbGluZTsKLSAgbmV3LT5maWxlID0gZmlsZV9pbmZvIChmaWxlKTsKLSAgbmV3LT5uZXh0ID0gKGxpc3RfaW5mb190eXBlICopIE5VTEw7Ci0gIG5ldy0+bWVzc2FnZSA9IChjaGFyICopIE5VTEw7Ci0gIG5ldy0+ZWRpY3QgPSBFRElDVF9OT05FOwotICBuZXctPmhsbF9maWxlID0gKGZpbGVfaW5mb190eXBlICopIE5VTEw7Ci0gIG5ldy0+aGxsX2xpbmUgPSAwOwotICBuZXctPmRlYnVnZ2luZyA9IDA7Ci0gIAotICBuZXdfZnJhZyAoKTsKLQotI2lmZGVmIE9CSl9FTEYKLSAgLyogSW4gRUxGLCBhbnl0aGluZyBpbiBhIHNlY3Rpb24gYmVnaW5uaW5nIHdpdGggLmRlYnVnIG9yIC5saW5lIGlzCi0gICAgIGNvbnNpZGVyZWQgdG8gYmUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgaWYgKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKSAhPSAwKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0KLSAgICAgIHNlZ25hbWUgPSBzZWdtZW50X25hbWUgKG5vd19zZWcpOwotICAgICAgaWYgKHN0cm5jbXAgKHNlZ25hbWUsICIuZGVidWciLCBzaXplb2YgIi5kZWJ1ZyIgLSAxKSA9PSAwCi0JICB8fCBzdHJuY21wIChzZWduYW1lLCAiLmxpbmUiLCBzaXplb2YgIi5saW5lIiAtIDEpID09IDApCi0JbmV3LT5kZWJ1Z2dpbmcgPSAxOwotICAgIH0KLSNlbmRpZgotfQotCi0vKiBBdHRhY2ggYWxsIGN1cnJlbnQgZnJhZ3MgdG8gdGhlIHByZXZpb3VzIGxpbmUgaW5zdGVhZCBvZiB0aGUKLSAgIGN1cnJlbnQgbGluZS4gIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBNSVBTIGJhY2tlbmQgd2hlbiBpdCBkaXNjb3ZlcnMKLSAgIHRoYXQgaXQgbmVlZHMgdG8gYWRkIHNvbWUgTk9QIGluc3RydWN0aW9uczsgdGhlIGFkZGVkIE5PUAotICAgaW5zdHJ1Y3Rpb25zIHNob3VsZCBnbyB3aXRoIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGhhcyB0aGUgZGVsYXksIG5vdAotICAgd2l0aCB0aGUgbmV3IGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotbGlzdGluZ19wcmV2X2xpbmUgKCkKLXsKLSAgbGlzdF9pbmZvX3R5cGUgKmw7Ci0gIGZyYWdTICpmOwotCi0gIGlmIChoZWFkID09IChsaXN0X2luZm9fdHlwZSAqKSBOVUxMCi0gICAgICB8fCBoZWFkID09IGxpc3RpbmdfdGFpbCkKLSAgICByZXR1cm47Ci0KLSAgbmV3X2ZyYWcgKCk7Ci0KLSAgZm9yIChsID0gaGVhZDsgbC0+bmV4dCAhPSBsaXN0aW5nX3RhaWw7IGwgPSBsLT5uZXh0KQotICAgIDsKLQotICBmb3IgKGYgPSBmcmNoYWluX25vdy0+ZnJjaF9yb290OyBmICE9IChmcmFnUyAqKSBOVUxMOyBmID0gZi0+ZnJfbmV4dCkKLSAgICBpZiAoZi0+bGluZSA9PSBsaXN0aW5nX3RhaWwpCi0gICAgICBmLT5saW5lID0gbDsKLQotICBsaXN0aW5nX3RhaWwtPmZyYWcgPSBmcmFnX25vdzsKLSAgbmV3X2ZyYWcgKCk7Ci19Ci0KLS8qCi0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBuZXh0IHNvdXJjZSBsaW5lIGZyb20gdGhlIGZpbGUgc3VwcGxpZWQsCi0gdHJ1bmNhdGVkIHRvIHNpemUuICBJdCBhcHBlbmRzIGEgZmFrZSBsaW5lIHRvIHRoZSBlbmQgb2YgZWFjaCBpbnB1dAotIGZpbGUgdG8gbWFrZQotKi8KLQotc3RhdGljIGNoYXIgKgotYnVmZmVyX2xpbmUgKGZpbGUsIGxpbmUsIHNpemUpCi0gICAgIGZpbGVfaW5mb190eXBlICogZmlsZTsKLSAgICAgY2hhciAqbGluZTsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0gIGludCBjOwotCi0gIGNoYXIgKnAgPSBsaW5lOwotCi0gIC8qIElmIHdlIGNvdWxkbid0IG9wZW4gdGhlIGZpbGUsIHJldHVybiBhbiBlbXB0eSBsaW5lICovCi0gIGlmIChmaWxlLT5hdF9lbmQpCi0gICAgcmV0dXJuICIiOwotCi0gIC8qIENoZWNrIHRoZSBjYWNoZSBhbmQgc2VlIGlmIHdlIGxhc3QgdXNlZCB0aGlzIGZpbGUuICAqLwotICBpZiAoIWxhc3Rfb3Blbl9maWxlX2luZm8gfHwgZmlsZSAhPSBsYXN0X29wZW5fZmlsZV9pbmZvKQotICAgIHsKLSAgICAgIGlmIChsYXN0X29wZW5fZmlsZSkKLQl7Ci0JICBsYXN0X29wZW5fZmlsZV9pbmZvLT5wb3MgPSBmdGVsbCAobGFzdF9vcGVuX2ZpbGUpOwotCSAgZmNsb3NlIChsYXN0X29wZW5fZmlsZSk7Ci0JfQotCi0gICAgICBsYXN0X29wZW5fZmlsZV9pbmZvID0gZmlsZTsKLSAgICAgIGxhc3Rfb3Blbl9maWxlID0gZm9wZW4gKGZpbGUtPmZpbGVuYW1lLCAiciIpOwotICAgICAgaWYgKGxhc3Rfb3Blbl9maWxlID09IE5VTEwpCi0JewotCSAgZmlsZS0+YXRfZW5kID0gMTsKLQkgIHJldHVybiAiIjsKLQl9Ci0gICAgICAKLSAgICAgIC8qIFNlZWsgdG8gd2hlcmUgd2Ugd2VyZSBsYXN0IHRpbWUgdGhpcyBmaWxlIHdhcyBvcGVuLiAgKi8KLSAgICAgIGlmIChmaWxlLT5wb3MpCi0JZnNlZWsobGFzdF9vcGVuX2ZpbGUsIGZpbGUtPnBvcywgU0VFS19TRVQpOwotICAgIH0KLQotICBjID0gZmdldGMgKGxhc3Rfb3Blbl9maWxlKTsKLQotICBzaXplIC09IDE7CQkJLyogbGVhdmUgcm9vbSBmb3IgbnVsbCAqLwotCi0gIHdoaWxlIChjICE9IEVPRiAmJiBjICE9ICdcbicpCi0gICAgewotICAgICAgaWYgKGNvdW50IDwgc2l6ZSkKLQkqcCsrID0gYzsKLSAgICAgIGNvdW50Kys7Ci0KLSAgICAgIGMgPSBmZ2V0YyAobGFzdF9vcGVuX2ZpbGUpOwotCi0gICAgfQotICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgZmlsZS0+YXRfZW5kID0gMTsKLSAgICAgICpwKysgPSAnLic7Ci0gICAgICAqcCsrID0gJy4nOwotICAgICAgKnArKyA9ICcuJzsKLSAgICB9Ci0gIGZpbGUtPmxpbmVudW0rKzsKLSAgKnArKyA9IDA7Ci0gIHJldHVybiBsaW5lOwotfQotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmbjsKLQotc3RhdGljIHVuc2lnbmVkIGludCBlamVjdDsJLyogRWplY3QgcGVuZGluZyAqLwotc3RhdGljIHVuc2lnbmVkIGludCBwYWdlOwkvKiBDdXJyZW50IHBhZ2UgbnVtYmVyICovCi1zdGF0aWMgY2hhciAqdGl0bGU7CQkvKiBjdXJyZW50IHRpdGxlICovCi1zdGF0aWMgY2hhciAqc3VidGl0bGU7CQkvKiBjdXJyZW50IHN1YnRpdGxlICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG9uX3BhZ2U7CS8qIG51bWJlciBvZiBsaW5lcyBwcmludGVkIG9uIGN1cnJlbnQgcGFnZSAqLwotCi0KLXN0YXRpYyB2b2lkCi1saXN0aW5nX3BhZ2UgKGxpc3QpCi0gICAgIGxpc3RfaW5mb190eXBlICpsaXN0OwotewotICAvKiBHcm9wZSBhcm91bmQsIHNlZSBpZiB3ZSBjYW4gc2VlIGEgdGl0bGUgb3Igc3VidGl0bGUgZWRpY3QgY29taW5nIHVwCi0gICAgIHNvb24gICh3ZSBsb29rIGRvd24gMTAgbGluZXMgb2YgdGhlIHBhZ2UgYW5kIHNlZSBpZiBpdCdzIHRoZXJlKSovCi0gIGlmICgoZWplY3QgfHwgKG9uX3BhZ2UgPj0gKHVuc2lnbmVkIGludCkgcGFwZXJfaGVpZ2h0KSkgJiYgcGFwZXJfaGVpZ2h0ICE9IDApCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGMgPSAxMDsKLSAgICAgIGludCBoYWRfdGl0bGUgPSAwOwotICAgICAgaW50IGhhZF9zdWJ0aXRsZSA9IDA7Ci0KLSAgICAgIHBhZ2UrKzsKLQotICAgICAgd2hpbGUgKGMgIT0gMCAmJiBsaXN0KQotCXsKLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9TQlRUTCAmJiAhaGFkX3N1YnRpdGxlKQotCSAgICB7Ci0JICAgICAgaGFkX3N1YnRpdGxlID0gMTsKLQkgICAgICBzdWJ0aXRsZSA9IGxpc3QtPmVkaWN0X2FyZzsKLQkgICAgfQotCSAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX1RJVExFICYmICFoYWRfdGl0bGUpCi0JICAgIHsKLQkgICAgICBoYWRfdGl0bGUgPSAxOwotCSAgICAgIHRpdGxlID0gbGlzdC0+ZWRpY3RfYXJnOwotCSAgICB9Ci0JICBsaXN0ID0gbGlzdC0+bmV4dDsKLQkgIGMtLTsKLQl9Ci0KLQotICAgICAgaWYgKHBhZ2UgPiAxKQotCXsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxmIik7Ci0JfQotCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlcyAlcyBcdFx0XHRwYWdlICVkXG4iLCBMSVNUSU5HX0hFQURFUiwgZm4sIHBhZ2UpOwotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIHRpdGxlKTsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVzXG4iLCBzdWJ0aXRsZSk7Ci0gICAgICBvbl9wYWdlID0gMzsKLSAgICAgIGVqZWN0ID0gMDsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHVuc2lnbmVkIGludAotY2FsY19oZXggKGxpc3QpCi0gICAgIGxpc3RfaW5mb190eXBlICogbGlzdDsKLXsKLSAgaW50IGRhdGFfYnVmZmVyX3NpemU7Ci0gIGxpc3RfaW5mb190eXBlICpmaXJzdCA9IGxpc3Q7Ci0gIHVuc2lnbmVkIGludCBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOwotICBmcmFnUyAqZnJhZzsKLSAgZnJhZ1MgKmZyYWdfcHRyOwotICB1bnNpZ25lZCBpbnQgYnl0ZV9pbl9mcmFnOwotCi0gIC8qIEZpbmQgZmlyc3QgZnJhZyB3aGljaCBzYXlzIGl0IGJlbG9uZ3MgdG8gdGhpcyBsaW5lICovCi0gIGZyYWcgPSBsaXN0LT5mcmFnOwotICB3aGlsZSAoZnJhZyAmJiBmcmFnLT5saW5lICE9IGxpc3QpCi0gICAgZnJhZyA9IGZyYWctPmZyX25leHQ7Ci0KLSAgZnJhZ19wdHIgPSBmcmFnOwotCi0gIGRhdGFfYnVmZmVyX3NpemUgPSAwOwotCi0gIC8qIER1bXAgYWxsIHRoZSBmcmFncyB3aGljaCBiZWxvbmcgdG8gdGhpcyBsaW5lICovCi0gIHdoaWxlIChmcmFnX3B0ciAhPSAoZnJhZ1MgKikgTlVMTCAmJiBmcmFnX3B0ci0+bGluZSA9PSBmaXJzdCkKLSAgICB7Ci0gICAgICAvKiBQcmludCBhcyBtYW55IGJ5dGVzIGZyb20gdGhlIGZpeGVkIHBhcnQgYXMgaXMgc2Vuc2libGUgKi8KLSAgICAgIGJ5dGVfaW5fZnJhZyA9IDA7Ci0gICAgICB3aGlsZSAoKG9mZnNldFQpIGJ5dGVfaW5fZnJhZyA8IGZyYWdfcHRyLT5mcl9maXgKLQkgICAgICYmIGRhdGFfYnVmZmVyX3NpemUgPCBNQVhfQllURVMgLSAzKQotCXsKLQkgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLQkgICAgewotCSAgICAgIGFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzczsKLQkgICAgfQotCi0JICBzcHJpbnRmIChkYXRhX2J1ZmZlciArIGRhdGFfYnVmZmVyX3NpemUsCi0JCSAgICIlMDJYIiwKLQkJICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW2J5dGVfaW5fZnJhZ10pICYgMHhmZik7Ci0JICBkYXRhX2J1ZmZlcl9zaXplICs9IDI7Ci0JICBieXRlX2luX2ZyYWcrKzsKLQl9Ci0gICAgICB7Ci0JdW5zaWduZWQgaW50IHZhcl9yZXBfbWF4ID0gYnl0ZV9pbl9mcmFnOwotCXVuc2lnbmVkIGludCB2YXJfcmVwX2lkeCA9IGJ5dGVfaW5fZnJhZzsKLQotCS8qIFByaW50IGFzIG1hbnkgYnl0ZXMgZnJvbSB0aGUgdmFyaWFibGUgcGFydCBhcyBpcyBzZW5zaWJsZSAqLwotCXdoaWxlICgoKG9mZnNldFQpIGJ5dGVfaW5fZnJhZwotCQk8IGZyYWdfcHRyLT5mcl9maXggKyBmcmFnX3B0ci0+ZnJfdmFyICogZnJhZ19wdHItPmZyX29mZnNldCkKLQkgICAgICAgJiYgZGF0YV9idWZmZXJfc2l6ZSA8IE1BWF9CWVRFUyAtIDMpCi0JICB7Ci0JICAgIGlmIChhZGRyZXNzID09IH4gKHVuc2lnbmVkIGludCkgMCkKLQkgICAgICB7Ci0JCWFkZHJlc3MgPSBmcmFnX3B0ci0+ZnJfYWRkcmVzczsKLQkgICAgICB9Ci0JICAgIHNwcmludGYgKGRhdGFfYnVmZmVyICsgZGF0YV9idWZmZXJfc2l6ZSwKLQkJICAgICAiJTAyWCIsCi0JCSAgICAgKGZyYWdfcHRyLT5mcl9saXRlcmFsW3Zhcl9yZXBfaWR4XSkgJiAweGZmKTsKLSNpZiAwCi0JICAgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemUrK10gPSAnKic7Ci0JICAgIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemUrK10gPSAnKic7Ci0jZW5kaWYKLQkgICAgZGF0YV9idWZmZXJfc2l6ZSArPSAyOwotCi0JICAgIHZhcl9yZXBfaWR4Kys7Ci0JICAgIGJ5dGVfaW5fZnJhZysrOwotCi0JICAgIGlmICgob2Zmc2V0VCkgdmFyX3JlcF9pZHggPj0gZnJhZ19wdHItPmZyX2ZpeCArIGZyYWdfcHRyLT5mcl92YXIpCi0JICAgICAgdmFyX3JlcF9pZHggPSB2YXJfcmVwX21heDsKLQkgIH0KLSAgICAgIH0KLQotICAgICAgZnJhZ19wdHIgPSBmcmFnX3B0ci0+ZnJfbmV4dDsKLSAgICB9Ci0gIGRhdGFfYnVmZmVyW2RhdGFfYnVmZmVyX3NpemVdID0gJ1wwJzsKLSAgcmV0dXJuIGFkZHJlc3M7Ci19Ci0KLQotCi0KLQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbGluZXMgKGxpc3QsIGxpbmVubywgc3RyaW5nLCBhZGRyZXNzKQotICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKLSAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgICAgY2hhciAqc3RyaW5nOwotICAgICB1bnNpZ25lZCBpbnQgYWRkcmVzczsKLXsKLSAgdW5zaWduZWQgaW50IGlkeDsKLSAgdW5zaWduZWQgaW50IG5jaGFyczsKLSAgdW5zaWduZWQgaW50IGxpbmVzOwotICB1bnNpZ25lZCBpbnQgYnl0ZV9pbl93b3JkID0gMDsKLSAgY2hhciAqc3JjID0gZGF0YV9idWZmZXI7Ci0KLSAgLyogUHJpbnQgdGhlIHN0dWZmIG9uIHRoZSBmaXJzdCBsaW5lICovCi0gIGxpc3RpbmdfcGFnZSAobGlzdCk7Ci0gIG5jaGFycyA9IChMSVNUSU5HX1dPUkRfU0laRSAqIDIgKyAxKSAqIGxpc3RpbmdfbGhzX3dpZHRoOwotICAKLSAgLyogUHJpbnQgdGhlIGhleCBmb3IgdGhlIGZpcnN0IGxpbmUgKi8KLSAgaWYgKGFkZHJlc3MgPT0gfiAodW5zaWduZWQgaW50KSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUgNGQgICAgICIsIGxpbmVubyk7Ci0gICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IG5jaGFyczsgaWR4KyspCi0JZnByaW50ZiAobGlzdF9maWxlLCAiICIpOwotCi0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJcdCVzXG4iLCBzdHJpbmcgPyBzdHJpbmcgOiAiIik7Ci0gICAgICAKLSAgICAgIG9uX3BhZ2UgKys7Ci0gICAgICAKLSAgICAgIGxpc3RpbmdfcGFnZSAoMCk7Ci0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGhhZF9lcnJvcnMgKCkpCi0gICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCA/Pz8/ICIsIGxpbmVubyk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlIDRkICUwNHggIiwgbGluZW5vLCBhZGRyZXNzKTsKLQotICAvKiBBbmQgdGhlIGRhdGEgdG8gZ28gYWxvbmcgd2l0aCBpdCAqLwotICBpZHggPSAwOwotICAKLSAgd2hpbGUgKCpzcmMgJiYgaWR4IDwgbmNoYXJzKQotICAgIHsKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiVjJWMiLCBzcmNbMF0sIHNyY1sxXSk7Ci0gICAgICBzcmMgKz0gMjsKLSAgICAgIGJ5dGVfaW5fd29yZCsrOwotICAgICAgCi0gICAgICBpZiAoYnl0ZV9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQotCXsKLQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLQkgIGlkeCsrOwotCSAgYnl0ZV9pbl93b3JkID0gMDsKLQl9Ci0gICAgICAKLSAgICAgIGlkeCArPSAyOwotICAgIH0KLSAgCi0gIGZvciAoOyBpZHggPCBuY2hhcnM7IGlkeCsrKQotICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIiAiKTsKLSAgCi0gIGZwcmludGYgKGxpc3RfZmlsZSwgIlx0JXNcbiIsIHN0cmluZyA/IHN0cmluZyA6ICIiKTsKLSAgb25fcGFnZSsrOwotICBsaXN0aW5nX3BhZ2UgKGxpc3QpOwotICAKLSAgaWYgKGxpc3QtPm1lc3NhZ2UpCi0gICAgewotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiKioqKiAgJXNcbiIsIGxpc3QtPm1lc3NhZ2UpOwotICAgICAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgICAgIG9uX3BhZ2UrKzsKLSAgICB9Ci0gIAotICBmb3IgKGxpbmVzID0gMDsKLSAgICAgICBsaW5lcyA8ICh1bnNpZ25lZCBpbnQpIGxpc3RpbmdfbGhzX2NvbnRfbGluZXMKLQkgJiYgKnNyYzsKLSAgICAgICBsaW5lcyArKykKLSAgICB7Ci0gICAgICBuY2hhcnMgPSAoKExJU1RJTkdfV09SRF9TSVpFICogMikgKyAxKQotCSogbGlzdGluZ19saHNfd2lkdGhfc2Vjb25kIC0gMTsKLSAgICAgIGlkeCA9IDA7Ci0gICAgICAKLSAgICAgIC8qIFByaW50IGFueSBtb3JlIGxpbmVzIG9mIGRhdGEsIGJ1dCBtb3JlIGNvbXBhY3RseSAqLwotICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJSA0ZCAgICAgICIsIGxpbmVubyk7Ci0gICAgICAKLSAgICAgIHdoaWxlICgqc3JjICYmIGlkeCA8IG5jaGFycykKLQl7Ci0JICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlYyVjIiwgc3JjWzBdLCBzcmNbMV0pOwotCSAgc3JjICs9IDI7Ci0JICBpZHggKz0gMjsKLQkgIGJ5dGVfaW5fd29yZCsrOwotCSAgCi0JICBpZiAoYnl0ZV9pbl93b3JkID09IExJU1RJTkdfV09SRF9TSVpFKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiICIpOwotCSAgICAgIGlkeCsrOwotCSAgICAgIGJ5dGVfaW5fd29yZCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICAKLSAgICAgIGZwcmludGYgKGxpc3RfZmlsZSwgIlxuIik7Ci0gICAgICBvbl9wYWdlICsrOwotICAgICAgbGlzdGluZ19wYWdlIChsaXN0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWxpc3Rfc3ltYm9sX3RhYmxlICgpCi17Ci0gIGV4dGVybiBzeW1ib2xTICpzeW1ib2xfcm9vdFA7Ci0gIGludCBnb3Rfc29tZSA9IDA7Ci0KLSAgc3ltYm9sUyAqcHRyOwotICBlamVjdCA9IDE7Ci0gIGxpc3RpbmdfcGFnZSAoMCk7Ci0KLSAgZm9yIChwdHIgPSBzeW1ib2xfcm9vdFA7IHB0ciAhPSAoc3ltYm9sUyAqKSBOVUxMOyBwdHIgPSBzeW1ib2xfbmV4dCAocHRyKSkKLSAgICB7Ci0gICAgICBpZiAoU0VHX05PUk1BTCAoU19HRVRfU0VHTUVOVCAocHRyKSkKLQkgIHx8IFNfR0VUX1NFR01FTlQgKHB0cikgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQl7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgLyogRG9uJ3QgcmVwb3J0IHNlY3Rpb24gc3ltYm9scy4gIFRoZXkgYXJlIG5vdCBpbnRlcmVzdGluZy4gICovCi0JICBpZiAoc3ltYm9sX3NlY3Rpb25fcCAocHRyKSkKLQkgICAgY29udGludWU7Ci0jZW5kaWYKLQkgIGlmIChTX0dFVF9OQU1FIChwdHIpKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbMzBdLCBmbXRbOF07Ci0JICAgICAgdmFsdWVUIHZhbCA9IFNfR0VUX1ZBTFVFIChwdHIpOwotCi0JICAgICAgLyogQEAgTm90ZSB0aGF0IHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSBjb21waWxhdGlvbiBvcHRpb25zLAotCQkgbm90IHNvbGVseSBvbiB0aGUgdGFyZ2V0IGNoYXJhY3RlcmlzdGljcy4gICovCi0JICAgICAgaWYgKHNpemVvZiAodmFsKSA9PSA0ICYmIHNpemVvZiAoaW50KSA9PSA0KQotCQlzcHJpbnRmIChidWYsICIlMDhseCIsICh1bnNpZ25lZCBsb25nKSB2YWwpOwotCSAgICAgIGVsc2UgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKHVuc2lnbmVkIGxvbmcpKQotCQl7Ci0JCSAgc3ByaW50ZiAoZm10LCAiJSUwJWx1bHgiLAotCQkJICAgKHVuc2lnbmVkIGxvbmcpIChzaXplb2YgKHZhbCkgKiAyKSk7Ci0JCSAgc3ByaW50ZiAoYnVmLCBmbXQsICh1bnNpZ25lZCBsb25nKSB2YWwpOwotCQl9Ci0jaWYgZGVmaW5lZCAoQkZENjQpCi0JICAgICAgZWxzZSBpZiAoc2l6ZW9mICh2YWwpID4gNCkKLQkJc3ByaW50Zl92bWEgKGJ1ZiwgdmFsKTsKLSNlbmRpZgotCSAgICAgIGVsc2UKLQkJYWJvcnQgKCk7Ci0KLQkgICAgICBpZiAoIWdvdF9zb21lKQotCQl7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiREVGSU5FRCBTWU1CT0xTXG4iKTsKLQkJICBvbl9wYWdlKys7Ci0JCSAgZ290X3NvbWUgPSAxOwotCQl9Ci0KLQkgICAgICBpZiAoc3ltYm9sX2dldF9mcmFnIChwdHIpICYmIHN5bWJvbF9nZXRfZnJhZyAocHRyKS0+bGluZSkKLQkJewotCQkgIGZwcmludGYgKGxpc3RfZmlsZSwgIiUyMHM6JS01ZCAgJXM6JXMgJXNcbiIsCi0JCQkgICBzeW1ib2xfZ2V0X2ZyYWcgKHB0ciktPmxpbmUtPmZpbGUtPmZpbGVuYW1lLAotCQkJICAgc3ltYm9sX2dldF9mcmFnIChwdHIpLT5saW5lLT5saW5lLAotCQkJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChwdHIpKSwKLQkJCSAgIGJ1ZiwgU19HRVRfTkFNRSAocHRyKSk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBmcHJpbnRmIChsaXN0X2ZpbGUsICIlMzNzOiVzICVzXG4iLAotCQkJICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChwdHIpKSwKLQkJCSAgIGJ1ZiwgU19HRVRfTkFNRSAocHRyKSk7Ci0JCX0KLQotCSAgICAgIG9uX3BhZ2UgKys7Ci0JICAgICAgbGlzdGluZ19wYWdlICgwKTsKLQkgICAgfQotCX0KLQotICAgIH0KLSAgaWYgKCFnb3Rfc29tZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJOTyBERUZJTkVEIFNZTUJPTFNcbiIpOwotICAgICAgb25fcGFnZSsrOwotICAgIH0KLSAgZnByaW50ZiAobGlzdF9maWxlLCAiXG4iKTsKLSAgb25fcGFnZSsrOwotICBsaXN0aW5nX3BhZ2UgKDApOwotCi0gIGdvdF9zb21lID0gMDsKLQotICBmb3IgKHB0ciA9IHN5bWJvbF9yb290UDsgcHRyICE9IChzeW1ib2xTICopIE5VTEw7IHB0ciA9IHN5bWJvbF9uZXh0IChwdHIpKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9OQU1FIChwdHIpICYmIHN0cmxlbiAoU19HRVRfTkFNRSAocHRyKSkgIT0gMCkKLQl7Ci0JICBpZiAoU19HRVRfU0VHTUVOVCAocHRyKSA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGlmICghZ290X3NvbWUpCi0JCXsKLQkJICBnb3Rfc29tZSA9IDE7Ci0JCSAgZnByaW50ZiAobGlzdF9maWxlLCAiVU5ERUZJTkVEIFNZTUJPTFNcbiIpOwotCQkgIG9uX3BhZ2UrKzsKLQkJICBsaXN0aW5nX3BhZ2UgKDApOwotCQl9Ci0JICAgICAgZnByaW50ZiAobGlzdF9maWxlLCAiJXNcbiIsIFNfR0VUX05BTUUgKHB0cikpOwotCSAgICAgIG9uX3BhZ2UrKzsKLQkgICAgICBsaXN0aW5nX3BhZ2UgKDApOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKCFnb3Rfc29tZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChsaXN0X2ZpbGUsICJOTyBVTkRFRklORUQgU1lNQk9MU1xuIik7Ci0gICAgICBvbl9wYWdlKys7Ci0gICAgICBsaXN0aW5nX3BhZ2UgKDApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X3NvdXJjZSAoY3VycmVudF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKQotICAgICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9maWxlOwotICAgICBsaXN0X2luZm9fdHlwZSAqbGlzdDsKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci17Ci0gIGlmICghY3VycmVudF9maWxlLT5hdF9lbmQpCi0gICAgewotICAgICAgd2hpbGUgKGN1cnJlbnRfZmlsZS0+bGluZW51bSA8IGxpc3QtPmhsbF9saW5lCi0JICAgICAmJiAhY3VycmVudF9maWxlLT5hdF9lbmQpCi0JewotCSAgY2hhciAqcCA9IGJ1ZmZlcl9saW5lIChjdXJyZW50X2ZpbGUsIGJ1ZmZlciwgd2lkdGgpOwotCSAgZnByaW50ZiAobGlzdF9maWxlLCAiJTR1OiUtMTNzICoqKiogJXNcbiIsIGN1cnJlbnRfZmlsZS0+bGluZW51bSwKLQkJICAgY3VycmVudF9maWxlLT5maWxlbmFtZSwgcCk7Ci0JICBvbl9wYWdlKys7Ci0JICBsaXN0aW5nX3BhZ2UgKGxpc3QpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFNvbWV0aW1lcyB0aGUgdXNlciBkb2Vzbid0IHdhbnQgdG8gYmUgYm90aGVyZWQgYnkgdGhlIGRlYnVnZ2luZwotICAgcmVjb3JkcyBpbnNlcnRlZCBieSB0aGUgY29tcGlsZXIsIHNlZSBpZiB0aGUgbGluZSBpcyBzdXNwaWNpb3VzLiAgKi8KLQotc3RhdGljIGludAotZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGluZSkKLSAgICAgbGlzdF9pbmZvX3R5cGUgKmxpc3Q7Ci0gICAgIGNvbnN0IGNoYXIgKmxpbmU7Ci17Ci0gIHN0YXRpYyBpbnQgaW5fZGVidWc7Ci0gIGludCB3YXNfZGVidWc7Ci0KLSAgaWYgKGxpc3QtPmRlYnVnZ2luZykKLSAgICB7Ci0gICAgICBpbl9kZWJ1ZyA9IDE7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgd2FzX2RlYnVnID0gaW5fZGVidWc7Ci0gIGluX2RlYnVnID0gMDsKLQotICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpsaW5lKSkKLSAgICBsaW5lKys7Ci0KLSAgaWYgKCpsaW5lICE9ICcuJykKLSAgICB7Ci0jaWZkZWYgT0JKX0VMRgotICAgICAgLyogVGhlIEVMRiBjb21waWxlciBzb21ldGltZXMgZW1pdHMgYmxhbmsgbGluZXMgYWZ0ZXIgc3dpdGNoaW5nCi0gICAgICAgICBvdXQgb2YgYSBkZWJ1Z2dpbmcgc2VjdGlvbi4gIElmIHRoZSBuZXh0IGxpbmUgZHJvcHMgdXMgYmFjawotICAgICAgICAgaW50byBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24sIHRoZW4gZG9uJ3QgcHJpbnQgdGhlIGJsYW5rIGxpbmUuCi0gICAgICAgICBUaGlzIGlzIGEgaGFjayBmb3IgYSBwYXJ0aWN1bGFyIGNvbXBpbGVyIGJlaGF2aW91ciwgbm90IGEKLSAgICAgICAgIGdlbmVyYWwgY2FzZS4gICovCi0gICAgICBpZiAod2FzX2RlYnVnCi0JICAmJiAqbGluZSA9PSAnXDAnCi0JICAmJiBsaXN0LT5uZXh0ICE9IE5VTEwKLQkgICYmIGxpc3QtPm5leHQtPmRlYnVnZ2luZykKLQl7Ci0JICBpbl9kZWJ1ZyA9IDE7Ci0JICByZXR1cm4gMTsKLQl9Ci0jZW5kaWYKLQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGxpbmUrKzsKLQotICBpZiAoc3RybmNtcCAobGluZSwgImRlZiIsIDMpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidmFsIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJzY2wiLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImxpbmUiLCA0KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgImVuZGVmIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJsbiIsIDIpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAidHlwZSIsIDQpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAic2l6ZSIsIDQpID09IDApCi0gICAgcmV0dXJuIDE7Ci0gIGlmIChzdHJuY21wIChsaW5lLCAiZGltIiwgMykgPT0gMCkKLSAgICByZXR1cm4gMTsKLSAgaWYgKHN0cm5jbXAgKGxpbmUsICJ0YWciLCAzKSA9PSAwKQotICAgIHJldHVybiAxOwotCi0gIGlmIChzdHJuY21wIChsaW5lLCAic3RhYnMiLCA1KSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoc3RybmNtcCAobGluZSwgInN0YWJuIiwgNSkgPT0gMCkKLSAgICByZXR1cm4gMTsKLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWxpc3RpbmdfbGlzdGluZyAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgbGlzdF9pbmZvX3R5cGUgKmxpc3QgPSBoZWFkOwotICBmaWxlX2luZm9fdHlwZSAqY3VycmVudF9obGxfZmlsZSA9IChmaWxlX2luZm9fdHlwZSAqKSBOVUxMOwotICBjaGFyICptZXNzYWdlOwotICBjaGFyICpidWZmZXI7Ci0gIGNoYXIgKnA7Ci0gIGludCBzaG93X2xpc3RpbmcgPSAxOwotICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0KLSAgYnVmZmVyID0geG1hbGxvYyAobGlzdGluZ19yaHNfd2lkdGgpOwotICBkYXRhX2J1ZmZlciA9IHhtYWxsb2MgKE1BWF9CWVRFUyk7Ci0gIGVqZWN0ID0gMTsKLSAgbGlzdCA9IGhlYWQ7Ci0KLSAgd2hpbGUgKGxpc3QgIT0gKGxpc3RfaW5mb190eXBlICopIE5VTEwgJiYgMCkKLSAgICB7Ci0gICAgICBpZiAobGlzdC0+bmV4dCkKLQlsaXN0LT5mcmFnID0gbGlzdC0+bmV4dC0+ZnJhZzsKLSAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OwotCi0gICAgfQotCi0gIGxpc3QgPSBoZWFkLT5uZXh0OwotCi0KLSAgd2hpbGUgKGxpc3QpCi0gICAgewotICAgICAgaW50IGxpc3RfbGluZTsKLQotICAgICAgd2lkdGggPSBsaXN0aW5nX3Joc193aWR0aCA+IHBhcGVyX3dpZHRoID8gcGFwZXJfd2lkdGggOgotCWxpc3RpbmdfcmhzX3dpZHRoOwotCi0gICAgICBsaXN0X2xpbmUgPSBsaXN0LT5saW5lOwotICAgICAgc3dpdGNoIChsaXN0LT5lZGljdCkKLQl7Ci0JY2FzZSBFRElDVF9MSVNUOgotCSAgLyogU2tpcCBhbGwgbGluZXMgdXAgdG8gdGhlIGN1cnJlbnQuICAqLwotCSAgbGlzdF9saW5lLS07Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTElTVDoKLQkgIHNob3dfbGlzdGluZy0tOwotCSAgYnJlYWs7Ci0JY2FzZSBFRElDVF9OT0xJU1RfTkVYVDoKLQkgIGJyZWFrOwotCWNhc2UgRURJQ1RfRUpFQ1Q6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX05PTkU6Ci0JICBicmVhazsKLQljYXNlIEVESUNUX1RJVExFOgotCSAgdGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICBicmVhazsKLQljYXNlIEVESUNUX1NCVFRMOgotCSAgc3VidGl0bGUgPSBsaXN0LT5lZGljdF9hcmc7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotCi0gICAgICBpZiAoc2hvd19saXN0aW5nIDw9IDApCi0JewotCSAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKLQkJICYmICFsaXN0LT5maWxlLT5hdF9lbmQpCi0JICAgIHAgPSBidWZmZXJfbGluZSAobGlzdC0+ZmlsZSwgYnVmZmVyLCB3aWR0aCk7Ci0JfQotCi0gICAgICBpZiAobGlzdC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKLQl7Ci0JICAvKiBFbmFibGUgbGlzdGluZyBmb3IgdGhlIHNpbmdsZSBsaW5lIHRoYXQgY2F1c2VkIHRoZSBlbmFibGUuICAqLwotCSAgbGlzdF9saW5lKys7Ci0JICBzaG93X2xpc3RpbmcrKzsKLQl9Ci0KLSAgICAgIGlmIChzaG93X2xpc3RpbmcgPiAwKQotCXsKLQkgIC8qIFNjYW4gZG93biB0aGUgbGlzdCBhbmQgcHJpbnQgYWxsIHRoZSBzdHVmZiB3aGljaCBjYW4gYmUgZG9uZQotCSAgICAgd2l0aCB0aGlzIGxpbmUgKG9yIGxpbmVzKS4gICovCi0JICBtZXNzYWdlID0gMDsKLQotCSAgaWYgKGxpc3QtPmhsbF9maWxlKQotCSAgICB7Ci0JICAgICAgY3VycmVudF9obGxfZmlsZSA9IGxpc3QtPmhsbF9maWxlOwotCSAgICB9Ci0KLQkgIGlmIChjdXJyZW50X2hsbF9maWxlICYmIGxpc3QtPmhsbF9saW5lICYmIChsaXN0aW5nICYgTElTVElOR19ITEwpKQotCSAgICB7Ci0JICAgICAgcHJpbnRfc291cmNlIChjdXJyZW50X2hsbF9maWxlLCBsaXN0LCBidWZmZXIsIHdpZHRoKTsKLQkgICAgfQotCi0JICBpZiAobGlzdC0+bGluZV9jb250ZW50cykKLQkgICAgewotCSAgICAgIGlmICghKChsaXN0aW5nICYgTElTVElOR19OT0RFQlVHKQotCQkgICAgJiYgZGVidWdnaW5nX3BzZXVkbyAobGlzdCwgbGlzdC0+bGluZV9jb250ZW50cykpKQotCQl7Ci0gCQkgIHByaW50X2xpbmVzIChsaXN0LAotCQkJICAgICAgIGxpc3QtPmZpbGUtPmxpbmVudW0gPT0gMCA/IGxpc3QtPmxpbmUgOiBsaXN0LT5maWxlLT5saW5lbnVtLAotCQkJICAgICAgIGxpc3QtPmxpbmVfY29udGVudHMsIGNhbGNfaGV4IChsaXN0KSk7Ci0JCX0KLQkgICAgICBmcmVlIChsaXN0LT5saW5lX2NvbnRlbnRzKTsKLQkgICAgICBsaXN0LT5saW5lX2NvbnRlbnRzID0gTlVMTDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd2hpbGUgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUKLQkJICAgICAmJiAhbGlzdC0+ZmlsZS0+YXRfZW5kKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IGFkZHJlc3M7Ci0KLQkJICBwID0gYnVmZmVyX2xpbmUgKGxpc3QtPmZpbGUsIGJ1ZmZlciwgd2lkdGgpOwotCi0JCSAgaWYgKGxpc3QtPmZpbGUtPmxpbmVudW0gPCBsaXN0X2xpbmUpCi0JCSAgICBhZGRyZXNzID0gfiAodW5zaWduZWQgaW50KSAwOwotCQkgIGVsc2UKLQkJICAgIGFkZHJlc3MgPSBjYWxjX2hleCAobGlzdCk7Ci0KLQkJICBpZiAoISgobGlzdGluZyAmIExJU1RJTkdfTk9ERUJVRykKLQkJCSYmIGRlYnVnZ2luZ19wc2V1ZG8gKGxpc3QsIHApKSkKLQkJICAgIHByaW50X2xpbmVzIChsaXN0LCBsaXN0LT5maWxlLT5saW5lbnVtLCBwLCBhZGRyZXNzKTsKLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsaXN0LT5lZGljdCA9PSBFRElDVF9FSkVDVCkKLQkgICAgewotCSAgICAgIGVqZWN0ID0gMTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKGxpc3QtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQotCS0tc2hvd19saXN0aW5nOwotCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKLSAgICB9Ci0KLSAgZnJlZSAoYnVmZmVyKTsKLSAgZnJlZSAoZGF0YV9idWZmZXIpOwotICBkYXRhX2J1ZmZlciA9IE5VTEw7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfcHJpbnQgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGludCB1c2luZ19zdGRvdXQ7Ci0gIAotICB0aXRsZSA9ICIiOwotICBzdWJ0aXRsZSA9ICIiOwotCi0gIGlmIChuYW1lID09IE5VTEwpCi0gICAgewotICAgICAgbGlzdF9maWxlID0gc3Rkb3V0OwotICAgICAgdXNpbmdfc3Rkb3V0ID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsaXN0X2ZpbGUgPSBmb3BlbiAobmFtZSwgInciKTsKLSAgICAgIGlmIChsaXN0X2ZpbGUgIT0gTlVMTCkKLQl1c2luZ19zdGRvdXQgPSAwOwotICAgICAgZWxzZQotCXsKLQkgIGFzX3BlcnJvciAoXygiY2FuJ3Qgb3BlbiBsaXN0IGZpbGU6ICVzIiksIG5hbWUpOwotCSAgbGlzdF9maWxlID0gc3Rkb3V0OwotCSAgdXNpbmdfc3Rkb3V0ID0gMTsKLQl9Ci0gICAgfQotCi0gIGlmIChsaXN0aW5nICYgTElTVElOR19OT0ZPUk0pCi0gICAgewotICAgICAgcGFwZXJfaGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX0xJU1RJTkcpCi0gICAgewotICAgICAgbGlzdGluZ19saXN0aW5nIChuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxpc3RpbmcgJiBMSVNUSU5HX1NZTUJPTFMpCi0gICAgewotICAgICAgbGlzdF9zeW1ib2xfdGFibGUgKCk7Ci0gICAgfQotCi0gIGlmICghIHVzaW5nX3N0ZG91dCkKLSAgICB7Ci0gICAgICBpZiAoZmNsb3NlIChsaXN0X2ZpbGUpID09IEVPRikKLQlhc19wZXJyb3IgKF8oImVycm9yIGNsb3NpbmcgbGlzdCBmaWxlOiAlcyIpLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKGxhc3Rfb3Blbl9maWxlKQotICAgIHsKLSAgICAgIGZjbG9zZSAobGFzdF9vcGVuX2ZpbGUpOwotICAgIH0KLX0KLQotCi12b2lkCi1saXN0aW5nX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGZuID0gbmFtZTsKLX0KLQotdm9pZAotbGlzdGluZ19lamVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAobGlzdGluZykKLSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfRUpFQ1Q7Ci19Ci0KLXZvaWQKLWxpc3RpbmdfZmxhZ3MgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgd2hpbGUgKCgqaW5wdXRfbGluZV9wb2ludGVyKyspICYmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicpKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi19Ci0KLS8qIFR1cm4gbGlzdGluZyBvbiBvciBvZmYuICBBbiBhcmd1bWVudCBvZiAwIG1lYW5zIHRvIHR1cm4gb2ZmCi0gICBsaXN0aW5nLiAgQW4gYXJndW1lbnQgb2YgMSBtZWFucyB0byB0dXJuIG9uIGxpc3RpbmcuICBBbiBhcmd1bWVudAotICAgb2YgMiBtZWFucyB0byB0dXJuIG9mZiBsaXN0aW5nLCBidXQgYXMgb2YgdGhlIG5leHQgbGluZTsgdGhhdCBpcywKLSAgIHRoZSBjdXJyZW50IGxpbmUgc2hvdWxkIGJlIGxpc3RlZCwgYnV0IHRoZSBuZXh0IGxpbmUgc2hvdWxkIG5vdC4gICovCi0KLXZvaWQKLWxpc3RpbmdfbGlzdCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgc3dpdGNoIChvbikKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGxpc3RpbmdfdGFpbC0+ZWRpY3QgPT0gRURJQ1RfTElTVCkKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX05PTkU7Ci0JICBlbHNlCi0JICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBFRElDVF9OT0xJU1Q7Ci0JICBicmVhazsKLQljYXNlIDE6Ci0JICBpZiAobGlzdGluZ190YWlsLT5lZGljdCA9PSBFRElDVF9OT0xJU1QKLQkgICAgICB8fCBsaXN0aW5nX3RhaWwtPmVkaWN0ID09IEVESUNUX05PTElTVF9ORVhUKQotCSAgICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9ORTsKLQkgIGVsc2UKLQkgICAgbGlzdGluZ190YWlsLT5lZGljdCA9IEVESUNUX0xJU1Q7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBsaXN0aW5nX3RhaWwtPmVkaWN0ID0gRURJQ1RfTk9MSVNUX05FWFQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYWJvcnQgKCk7Ci0JfQotICAgIH0KLX0KLQotCi12b2lkCi1saXN0aW5nX3BzaXplICh3aWR0aF9vbmx5KQotICAgICBpbnQgd2lkdGhfb25seTsKLXsKLSAgaWYgKCEgd2lkdGhfb25seSkKLSAgICB7Ci0gICAgICBwYXBlcl9oZWlnaHQgPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICAgICAgaWYgKHBhcGVyX2hlaWdodCA8IDAgfHwgcGFwZXJfaGVpZ2h0ID4gMTAwMCkKLQl7Ci0JICBwYXBlcl9oZWlnaHQgPSAwOwotCSAgYXNfd2FybiAoXygic3RyYW5nZSBwYXBlciBoZWlnaHQsIHNldCB0byBubyBmb3JtIikpOwotCX0KLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICB9Ci0KLSAgcGFwZXJfd2lkdGggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi12b2lkCi1saXN0aW5nX25vcGFnZSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBwYXBlcl9oZWlnaHQgPSAwOwotfQotCi12b2lkCi1saXN0aW5nX3RpdGxlIChkZXB0aCkKLSAgICAgaW50IGRlcHRoOwotewotICBpbnQgcXVvdGVkOwotICBjaGFyICpzdGFydDsKLSAgY2hhciAqdHRsOwotICB1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ1wiJykKLSAgICBxdW90ZWQgPSAwOwotICBlbHNlCi0gICAgewotICAgICAgcXVvdGVkID0gMTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLQotICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcikKLSAgICB7Ci0gICAgICBpZiAocXVvdGVkCi0JICA/ICppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJwotCSAgOiBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaWYgKGxpc3RpbmcpCi0JICAgIHsKLQkgICAgICBsZW5ndGggPSBpbnB1dF9saW5lX3BvaW50ZXIgLSBzdGFydDsKLQkgICAgICB0dGwgPSB4bWFsbG9jIChsZW5ndGggKyAxKTsKLQkgICAgICBtZW1jcHkgKHR0bCwgc3RhcnQsIGxlbmd0aCk7Ci0JICAgICAgdHRsW2xlbmd0aF0gPSAwOwotCSAgICAgIGxpc3RpbmdfdGFpbC0+ZWRpY3QgPSBkZXB0aCA/IEVESUNUX1NCVFRMIDogRURJQ1RfVElUTEU7Ci0JICAgICAgbGlzdGluZ190YWlsLT5lZGljdF9hcmcgPSB0dGw7Ci0JICAgIH0KLQkgIGlmIChxdW90ZWQpCi0JICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JewotCSAgYXNfYmFkIChfKCJOZXcgbGluZSBpbiB0aXRsZSIpKTsKLQkgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCX0KLSAgICB9Ci19Ci0KLQotCi12b2lkCi1saXN0aW5nX3NvdXJjZV9saW5lIChsaW5lKQotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgewotICAgICAgbmV3X2ZyYWcgKCk7Ci0gICAgICBsaXN0aW5nX3RhaWwtPmhsbF9saW5lID0gbGluZTsKLSAgICAgIG5ld19mcmFnICgpOwotICAgIH0KLX0KLQotdm9pZAotbGlzdGluZ19zb3VyY2VfZmlsZSAoZmlsZSkKLSAgICAgY29uc3QgY2hhciAqZmlsZTsKLXsKLSAgaWYgKGxpc3RpbmcpCi0gICAgbGlzdGluZ190YWlsLT5obGxfZmlsZSA9IGZpbGVfaW5mbyAoZmlsZSk7Ci19Ci0KLQotCi0jZWxzZQotCi0KLS8qIER1bW15IGZ1bmN0aW9ucyBmb3Igd2hlbiBjb21waWxlZCB3aXRob3V0IGxpc3RpbmcgZW5hYmxlZCAqLwotCi12b2lkCi1saXN0aW5nX2ZsYWdzIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZCAKLWxpc3RpbmdfbGlzdCAob24pCi0gICAgIGludCBvbjsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ19lamVjdCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBzX2lnbm9yZSAoMCk7Ci19Ci0KLXZvaWQgCi1saXN0aW5nX3BzaXplIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNfaWdub3JlICgwKTsKLX0KLQotdm9pZAotbGlzdGluZ19ub3BhZ2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkIAotbGlzdGluZ190aXRsZSAoZGVwdGgpCi0gICAgIGludCBkZXB0aDsKLXsKLSAgc19pZ25vcmUgKDApOwotfQotCi12b2lkCi1saXN0aW5nX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0KLX0KLQotdm9pZCAKLWxpc3RpbmdfbmV3bGluZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLQotfQotCi12b2lkIAotbGlzdGluZ19zb3VyY2VfbGluZSAobikKLSAgICAgdW5zaWduZWQgaW50IG47Ci17Ci0KLX0KLXZvaWQgCi1saXN0aW5nX3NvdXJjZV9maWxlIChuKQotICAgICBjb25zdCBjaGFyICpuOwotewotCi19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL2xpc3RpbmcuaCBiL2dhcy9saXN0aW5nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwZDVjMzcuLjAwMDAwMDAKLS0tIGEvZ2FzL2xpc3RpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBsaXN0aW5nLmgKLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfX2xpc3RpbmdfaF9fCi0jZGVmaW5lIF9fbGlzdGluZ19oX18KLQotI2RlZmluZSBMSVNUSU5HX0xJU1RJTkcgICAgMQotI2RlZmluZSBMSVNUSU5HX1NZTUJPTFMgICAgMgotI2RlZmluZSBMSVNUSU5HX05PRk9STSAgICAgNAotI2RlZmluZSBMSVNUSU5HX0hMTCAgICAgICAgOAotI2RlZmluZSBMSVNUSU5HX05PREVCVUcgICAxNgotI2RlZmluZSBMSVNUSU5HX05PQ09ORAkgIDMyCi0jZGVmaW5lIExJU1RJTkdfTUFDRVhQCSAgNjQKLQotI2RlZmluZSBMSVNUSU5HX0RFRkFVTFQgICAgKExJU1RJTkdfTElTVElORyB8IExJU1RJTkdfSExMIHwgTElTVElOR19TWU1CT0xTKQotCi0jaWZuZGVmIE5PX0xJU1RJTkcKLSNkZWZpbmUgTElTVElOR19ORVdMSU5FKCkgeyBpZiAobGlzdGluZykgbGlzdGluZ19uZXdsaW5lKE5VTEwpOyB9Ci0jZWxzZQotI2RlZmluZSBMSVNUSU5HX05FV0xJTkUoKSB7O30KLSNlbmRpZgotI2RlZmluZSBMSVNUSU5HX0VPRigpICAgICBMSVNUSU5HX05FV0xJTkUoKQotCi0jZGVmaW5lIExJU1RJTkdfU0tJUF9DT05EKCkgKChsaXN0aW5nICYgTElTVElOR19OT0NPTkQpICE9IDApCi0KLXZvaWQgbGlzdGluZ19lamVjdCBQQVJBTVMgKChpbnQpKTsKLXZvaWQgbGlzdGluZ19lcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICptZXNzYWdlKSk7Ci12b2lkIGxpc3RpbmdfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci12b2lkIGxpc3RpbmdfZmxhZ3MgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3RpbmdfbGlzdCBQQVJBTVMgKChpbnQgb24pKTsKLXZvaWQgbGlzdGluZ19uZXdsaW5lIFBBUkFNUyAoKGNoYXIgKnBzKSk7Ci12b2lkIGxpc3RpbmdfcHJldl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLXZvaWQgbGlzdGluZ19wcmludCBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci12b2lkIGxpc3RpbmdfcHNpemUgUEFSQU1TICgoaW50KSk7Ci12b2lkIGxpc3Rpbmdfbm9wYWdlIFBBUkFNUyAoKGludCkpOwotdm9pZCBsaXN0aW5nX3NvdXJjZV9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotdm9pZCBsaXN0aW5nX3NvdXJjZV9saW5lIFBBUkFNUyAoKHVuc2lnbmVkIGludCkpOwotdm9pZCBsaXN0aW5nX3RpdGxlIFBBUkFNUyAoKGludCBkZXB0aCkpOwotdm9pZCBsaXN0aW5nX3dhcm5pbmcgUEFSQU1TICgoY29uc3QgY2hhciAqbWVzc2FnZSkpOwotdm9pZCBsaXN0aW5nX3dpZHRoIFBBUkFNUyAoKHVuc2lnbmVkIGludCB4KSk7Ci0KLWV4dGVybiBpbnQgbGlzdGluZ19saHNfd2lkdGg7Ci1leHRlcm4gaW50IGxpc3RpbmdfbGhzX3dpZHRoX3NlY29uZDsKLWV4dGVybiBpbnQgbGlzdGluZ19saHNfY29udF9saW5lczsKLWV4dGVybiBpbnQgbGlzdGluZ19yaHNfd2lkdGg7Ci0KLSNlbmRpZiAvKiBfX2xpc3RpbmdfaF9fICovCi0KLS8qIGVuZCBvZiBsaXN0aW5nLmggKi8KZGlmZiAtLWdpdCBhL2dhcy9saXRlcmFsLmMgYi9nYXMvbGl0ZXJhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2Y4ZmM0Li4wMDAwMDAwCi0tLSBhL2dhcy9saXRlcmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKiBhcy5jIC0gR0FTIGxpdGVyYWwgcG9vbCBtYW5hZ2VtZW50LgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBLZW4gUmFlYnVybiAocmFlYnVybkBjeWdudXMuY29tKS4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICovCi0KLS8qIFRoaXMgaXNuJ3QgcXVpdGUgYSAiY29uc3RhbnQiIHBvb2wuICBTb21lIG9mIHRoZSB2YWx1ZXMgbWF5IGdldAotICAgYWRqdXN0ZWQgYXQgcnVuIHRpbWUsIGUuZy4sIGZvciBzeW1ib2xpYyByZWxvY2F0aW9ucyB3aGVuIHNoYXJlZAotICAgbGlicmFyaWVzIGFyZSBpbiB1c2UuICBJdCdzIG1vcmUgb2YgYSAibGl0ZXJhbCIgcG9vbC4KLQotICAgT24gdGhlIEFscGhhLCB0aGlzIHNob3VsZCBiZSB1c2VkIGZvciAubGl0YSBhbmQgLmxpdDguICAoSXMgdGhlcmUKLSAgIGV2ZXIgYSAubGl0ND8pICBPbiB0aGUgTUlQUywgaXQgY291bGQgYmUgdXNlZCBmb3IgLmxpdDQgYXMgd2VsbC4KLQotICAgVGhlIGV4cHJlc3Npb25zIHBhc3NlZCBoZXJlIHNob3VsZCBjb250YWluIGVpdGhlciBjb25zdGFudHMgb3Igc3ltYm9scywKLSAgIG5vdCBhIGNvbWJpbmF0aW9uIG9mIGJvdGguICBUeXBpY2FsbHksIHRoZSBjb25zdGFudCBwb29sIGlzIGFjY2Vzc2VkCi0gICB3aXRoIHNvbWUgc29ydCBvZiBHUCByZWdpc3Rlciwgc28gdGhlIHNpemUgb2YgdGhlIHBvb2wgbXVzdCBiZSBrZXB0IGRvd24KLSAgIGlmIHBvc3NpYmxlLiAgVGhlIGV4Y2VwdGlvbiBpcyBzZWN0aW9uIG9mZnNldHMgLS0gaWYgeW91J3JlIHN0b3JpbmcgYQotICAgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgLmRhdGEsIGZvciBleGFtcGxlLCBhbmQgeW91ciBtYWNoaW5lIHByb3ZpZGVzCi0gICBmb3IgMTYtYml0IHNpZ25lZCBhZGRlbmRzLCB5b3UgbWlnaHQgd2FudCB0byBzdG9yZSAuZGF0YSszMkssIHNvIHRoYXQKLSAgIHlvdSBjYW4gYWNjZXNzIGFsbCBvZiB0aGUgZmlyc3QgNjRLIG9mIC5kYXRhIHdpdGggdGhlIG9uZSBwb2ludGVyLgotCi0gICBUaGlzIGlzbid0IGEgcmVxdWlyZW1lbnQsIGp1c3QgYSBndWlkZWxpbmUgdGhhdCBjYW4gaGVscCBrZWVwIC5vIGZpbGUKLSAgIHNpemUgZG93bi4gICovCi0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2lmIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICYmIGRlZmluZWQgKE5FRURfTElURVJBTF9QT09MKQotCi12YWx1ZVQKLWFkZF90b19saXRlcmFsX3Bvb2wgKHN5bSwgYWRkZW5kLCBzZWMsIHNpemUpCi0gICAgIHN5bWJvbFMgKnN5bTsKLSAgICAgdmFsdWVUIGFkZGVuZDsKLSAgICAgc2VnVCBzZWM7Ci0gICAgIGludCBzaXplOwotewotICBzZWdUIGN1cnJlbnRfc2VjdGlvbiA9IG5vd19zZWc7Ci0gIGludCBjdXJyZW50X3N1YnNlYyA9IG5vd19zdWJzZWc7Ci0gIHZhbHVlVCBvZmZzZXQ7Ci0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvY190eXBlOwotICBjaGFyICpwOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBmaXhTICpmaXhwOwotCi0gIG9mZnNldCA9IDA7Ci0gIC8qIEBAIFRoaXMgYXNzdW1lcyBhbGwgZW50cmllcyBpbiBhIGdpdmVuIHNlY3Rpb24gd2lsbCBiZSBvZiB0aGUgc2FtZQotICAgICBzaXplLi4uICBQcm9iYWJseSBjb3JyZWN0LCBidXQgdW53aXNlIHRvIHJlbHkgb24uICAqLwotICAvKiBUaGlzIG11c3QgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBzYW1lIHN1YnNlZ21lbnQuICAqLwotICBpZiAoc2VnaW5mby0+ZnJjaGFpblApCi0gICAgZm9yIChmaXhwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZpeF9yb290OwotCSBmaXhwICE9IChmaXhTICopIE5VTEw7Ci0JIGZpeHAgPSBmaXhwLT5meF9uZXh0LCBvZmZzZXQgKz0gc2l6ZSkKLSAgICAgIHsKLQlpZiAoZml4cC0+ZnhfYWRkc3kgPT0gc3ltICYmIGZpeHAtPmZ4X29mZnNldCA9PSBhZGRlbmQpCi0JICByZXR1cm4gb2Zmc2V0OwotICAgICAgfQotCi0gIHN1YnNlZ19zZXQgKHNlYywgMCk7Ci0gIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICBtZW1zZXQgKHAsIDAsIHNpemUpOwotCi0gIHN3aXRjaCAoc2l6ZSkKLSAgICB7Ci0gICAgY2FzZSA0OgotICAgICAgcmVsb2NfdHlwZSA9IEJGRF9SRUxPQ18zMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgIHJlbG9jX3R5cGUgPSBCRkRfUkVMT0NfNjQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICBmaXhfbmV3IChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBzaXplLCBzeW0sIGFkZGVuZCwgMCwKLQkgICByZWxvY190eXBlKTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfc3Vic2VjKTsKLSAgb2Zmc2V0ID0gc2VnaW5mby0+bGl0ZXJhbF9wb29sX3NpemU7Ci0gIHNlZ2luZm8tPmxpdGVyYWxfcG9vbF9zaXplICs9IHNpemU7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwpkaWZmIC0tZ2l0IGEvZ2FzL21hYy1hcy5yIGIvZ2FzL21hYy1hcy5yCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZjMDMzLi4wMDAwMDAwCi0tLSBhL2dhcy9tYWMtYXMucgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJlc291cmNlcyBmb3IgR05VIEFTLiAqLwotCi0jaW5jbHVkZSAiU3lzVHlwZXMuciIKLQotLyogVmVyc2lvbiByZXNvdXJjZXMuICovCi0KLXJlc291cmNlICd2ZXJzJyAoMSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKLX07Ci0KLXJlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JIkdBUyAiIFZFUlNJT05fU1RSSU5HICIgZm9yIE1QVyIKLX07Ci0KLSNpZmRlZiBXQU5UX0NGUkcKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotCXsKLQkJa1Bvd2VyUEMsCi0JCWtGdWxsTGliLAotCQlrTm9WZXJzaW9uTnVtLCBrTm9WZXJzaW9uTnVtLAotCQkwLDAsCi0JCWtJc0FwcCwga09uRGlza0ZsYXQsIGtaZXJvT2Zmc2V0LCBrV2hvbGVGb3JrLAotCQlQUk9HX05BTUUKLQl9Ci19OwotCi0jZW5kaWYgLyogV0FOVF9DRlJHICovCmRpZmYgLS1naXQgYS9nYXMvbWFjcm8uYyBiL2dhcy9tYWNyby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWViMTU3Li4wMDAwMDAwCi0tLSBhL2dhcy9tYWNyby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI2MSArMCwwIEBACi0vKiBtYWNyby5jIC0gbWFjcm8gc3VwcG9ydCBmb3IgZ2FzIGFuZCBnYXNwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLS8qIEFJWCByZXF1aXJlcyB0aGlzIHRvIGJlIHRoZSBmaXJzdCB0aGluZyBpbiB0aGUgZmlsZS4gICovCi0jaWZkZWYgX19HTlVDX18KLSMgaWZuZGVmIGFsbG9jYQotIyAgaWZkZWYgX19TVERDX18KLWV4dGVybiB2b2lkICphbGxvY2EgKCk7Ci0jICBlbHNlCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbHNlCi0jIGlmIEhBVkVfQUxMT0NBX0gKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotIyAgICBpZiAhZGVmaW5lZCAoX19TVERDX18pICYmICFkZWZpbmVkIChfX2hwdXgpCi1leHRlcm4gY2hhciAqYWxsb2NhICgpOwotIyAgICBlbHNlCi1leHRlcm4gdm9pZCAqYWxsb2NhICgpOwotIyAgICBlbmRpZiAvKiBfX1NURENfXywgX19ocHV4ICovCi0jICAgZW5kaWYgLyogYWxsb2NhICovCi0jICBlbmRpZiAvKiBfQUlYICovCi0jIGVuZGlmIC8qIEhBVkVfQUxMT0NBX0ggKi8KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAic2IuaCIKLSNpbmNsdWRlICJoYXNoLmgiCi0jaW5jbHVkZSAibWFjcm8uaCIKLQotI2luY2x1ZGUgImFzaW50bC5oIgotCi0vKiBUaGUgcm91dGluZXMgaW4gdGhpcyBmaWxlIGhhbmRsZSBtYWNybyBkZWZpbml0aW9uIGFuZCBleHBhbnNpb24uCi0gICBUaGV5IGFyZSBjYWxsZWQgYnkgYm90aCBnYXNwIGFuZCBnYXMuICAqLwotCi0vKiBTdHJ1Y3R1cmVzIHVzZWQgdG8gc3RvcmUgbWFjcm9zLiAKLQotICAgRWFjaCBtYWNybyBrbm93cyBpdHMgbmFtZSBhbmQgaW5jbHVkZWQgdGV4dC4gIEl0IGdldHMgYnVpbHQgd2l0aCBhCi0gICBsaXN0IG9mIGZvcm1hbCBhcmd1bWVudHMsIGFuZCBhbHNvIGtlZXBzIGEgaGFzaCB0YWJsZSB3aGljaCBwb2ludHMKLSAgIGludG8gdGhlIGxpc3QgdG8gc3BlZWQgdXAgZm9ybWFsIHNlYXJjaC4gIEVhY2ggZm9ybWFsIGtub3dzIGl0cwotICAgbmFtZSBhbmQgaXRzIGRlZmF1bHQgdmFsdWUuICBFYWNoIHRpbWUgdGhlIG1hY3JvIGlzIGV4cGFuZGVkLCB0aGUKLSAgIGZvcm1hbHMgZ2V0IHRoZSBhY3R1YWwgdmFsdWVzIGF0dGF0Y2hlZCB0byB0aGVtLiAqLwotCi0vKiBkZXNjcmliZSB0aGUgZm9ybWFsIGFyZ3VtZW50cyB0byBhIG1hY3JvICovCi0KLXR5cGVkZWYgc3RydWN0IGZvcm1hbF9zdHJ1Y3QKLSAgewotICAgIHN0cnVjdCBmb3JtYWxfc3RydWN0ICpuZXh0OwkvKiBuZXh0IGZvcm1hbCBpbiBsaXN0ICovCi0gICAgc2IgbmFtZTsJCQkvKiBuYW1lIG9mIHRoZSBmb3JtYWwgKi8KLSAgICBzYiBkZWY7CQkJLyogdGhlIGRlZmF1bHQgdmFsdWUgKi8KLSAgICBzYiBhY3R1YWw7CQkJLyogdGhlIGFjdHVhbCBhcmd1bWVudCAoY2hhbmdlZCBvbiBlYWNoIGV4cGFuc2lvbikgKi8KLSAgICBpbnQgaW5kZXg7CQkJLyogdGhlIGluZGV4IG9mIHRoZSBmb3JtYWwgMC4uZm9ybWFsX2NvdW50LTEgKi8KLSAgfQotZm9ybWFsX2VudHJ5OwotCi0vKiBPdGhlciB2YWx1ZXMgZm91bmQgaW4gdGhlIGluZGV4IGZpZWxkIG9mIGEgZm9ybWFsX2VudHJ5LiAgKi8KLSNkZWZpbmUgUVVBTF9JTkRFWCAoLTEpCi0jZGVmaW5lIE5BUkdfSU5ERVggKC0yKQotI2RlZmluZSBMT0NBTF9JTkRFWCAoLTMpCi0KLS8qIGRlc2NyaWJlIHRoZSBtYWNyby4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbWFjcm9fc3RydWN0Ci0gIHsKLSAgICBzYiBzdWI7CQkJLyogc3Vic3RpdHV0aW9uIHRleHQuICovCi0gICAgaW50IGZvcm1hbF9jb3VudDsJCS8qIG51bWJlciBvZiBmb3JtYWwgYXJncy4gKi8KLSAgICBmb3JtYWxfZW50cnkgKmZvcm1hbHM7CS8qIHBvaW50ZXIgdG8gbGlzdCBvZiBmb3JtYWxfc3RydWN0cyAqLwotICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmZvcm1hbF9oYXNoOyAvKiBoYXNoIHRhYmxlIG9mIGZvcm1hbHMuICovCi0gIH0KLW1hY3JvX2VudHJ5OwotCi0vKiBJbnRlcm5hbCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgaW50IGdldF90b2tlbiBQQVJBTVMgKChpbnQsIHNiICosIHNiICopKTsKLXN0YXRpYyBpbnQgZ2V0c3RyaW5nIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKikpOwotc3RhdGljIGludCBnZXRfYW55X3N0cmluZyBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCwgaW50KSk7Ci1zdGF0aWMgaW50IGRvX2Zvcm1hbHMgUEFSQU1TICgobWFjcm9fZW50cnkgKiwgaW50LCBzYiAqKSk7Ci1zdGF0aWMgaW50IGdldF9hcG9zdF90b2tlbiBQQVJBTVMgKChpbnQsIHNiICosIHNiICosIGludCkpOwotc3RhdGljIGludCBzdWJfYWN0dWFsCi0gIFBBUkFNUyAoKGludCwgc2IgKiwgc2IgKiwgc3RydWN0IGhhc2hfY29udHJvbCAqLCBpbnQsIHNiICosIGludCkpOwotc3RhdGljIGNvbnN0IGNoYXIgKm1hY3JvX2V4cGFuZF9ib2R5Ci0gIFBBUkFNUyAoKHNiICosIHNiICosIGZvcm1hbF9lbnRyeSAqLCBzdHJ1Y3QgaGFzaF9jb250cm9sICosIGludCwgaW50KSk7Ci1zdGF0aWMgY29uc3QgY2hhciAqbWFjcm9fZXhwYW5kIFBBUkFNUyAoKGludCwgc2IgKiwgbWFjcm9fZW50cnkgKiwgc2IgKiwgaW50KSk7Ci0KLSNkZWZpbmUgSVNXSElURSh4KSAoKHgpID09ICcgJyB8fCAoeCkgPT0gJ1x0JykKLQotI2RlZmluZSBJU1NFUCh4KSBcCi0gKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcgfHwgKHgpID09ICcsJyB8fCAoeCkgPT0gJyInIHx8ICh4KSA9PSAnOycgXAotICB8fCAoeCkgPT0gJyknIHx8ICh4KSA9PSAnKCcgXAotICB8fCAoKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpICYmICgoeCkgPT0gJzwnIHx8ICh4KSA9PSAnPicpKSkKLQotI2RlZmluZSBJU0JBU0UoeCkgXAotICAoKHgpID09ICdiJyB8fCAoeCkgPT0gJ0InIFwKLSAgIHx8ICh4KSA9PSAncScgfHwgKHgpID09ICdRJyBcCi0gICB8fCAoeCkgPT0gJ2gnIHx8ICh4KSA9PSAnSCcgXAotICAgfHwgKHgpID09ICdkJyB8fCAoeCkgPT0gJ0QnKQotCi0vKiBUaGUgbWFjcm8gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICptYWNyb19oYXNoOwotCi0vKiBXaGV0aGVyIGFueSBtYWNyb3MgaGF2ZSBiZWVuIGRlZmluZWQuICAqLwotCi1pbnQgbWFjcm9fZGVmaW5lZDsKLQotLyogV2hldGhlciB3ZSBhcmUgaW4gR0FTUCBhbHRlcm5hdGUgbW9kZS4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fYWx0ZXJuYXRlOwotCi0vKiBXaGV0aGVyIHdlIGFyZSBpbiBNUkkgbW9kZS4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fbXJpOwotCi0vKiBXaGV0aGVyIHdlIHNob3VsZCBzdHJpcCAnQCcgY2hhcmFjdGVycy4gICovCi0KLXN0YXRpYyBpbnQgbWFjcm9fc3RyaXBfYXQ7Ci0KLS8qIEZ1bmN0aW9uIHRvIHVzZSB0byBwYXJzZSBhbiBleHByZXNzaW9uLiAgKi8KLQotc3RhdGljIGludCAoKm1hY3JvX2V4cHIpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50LCBzYiAqLCBpbnQgKikpOwotCi0vKiBOdW1iZXIgb2YgbWFjcm8gZXhwYW5zaW9ucyB0aGF0IGhhdmUgYmVlbiBkb25lLiAgKi8KLQotc3RhdGljIGludCBtYWNyb19udW1iZXI7Ci0KLS8qIEluaXRpYWxpemUgbWFjcm8gcHJvY2Vzc2luZy4gICovCi0KLXZvaWQKLW1hY3JvX2luaXQgKGFsdGVybmF0ZSwgbXJpLCBzdHJpcF9hdCwgZXhwcikKLSAgICAgaW50IGFsdGVybmF0ZTsKLSAgICAgaW50IG1yaTsKLSAgICAgaW50IHN0cmlwX2F0OwotICAgICBpbnQgKCpleHByKSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKTsKLXsKLSAgbWFjcm9faGFzaCA9IGhhc2hfbmV3ICgpOwotICBtYWNyb19kZWZpbmVkID0gMDsKLSAgbWFjcm9fYWx0ZXJuYXRlID0gYWx0ZXJuYXRlOwotICBtYWNyb19tcmkgPSBtcmk7Ci0gIG1hY3JvX3N0cmlwX2F0ID0gc3RyaXBfYXQ7Ci0gIG1hY3JvX2V4cHIgPSBleHByOwotfQotCi0vKiBTd2l0Y2ggaW4gYW5kIG91dCBvZiBNUkkgbW9kZSBvbiB0aGUgZmx5LiAgKi8KLQotdm9pZAotbWFjcm9fbXJpX21vZGUgKG1yaSkKLSAgICAgaW50IG1yaTsKLXsKLSAgbWFjcm9fbXJpID0gbXJpOwotfQotCi0vKiBSZWFkIGlucHV0IGxpbmVzIHRpbGwgd2UgZ2V0IHRvIGEgVE8gc3RyaW5nLgotICAgSW5jcmVhc2UgbmVzdGluZyBkZXB0aCBpZiB3ZSBnZXQgYSBGUk9NIHN0cmluZy4KLSAgIFB1dCB0aGUgcmVzdWx0cyBpbnRvIHNiIGF0IFBUUi4KLSAgIEFkZCBhIG5ldyBpbnB1dCBsaW5lIHRvIGFuIHNiIHVzaW5nIEdFVF9MSU5FLgotICAgUmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiB1bmV4cGVjdGVkIEVPRi4gICovCi0KLWludAotYnVmZmVyX2FuZF9uZXN0IChmcm9tLCB0bywgcHRyLCBnZXRfbGluZSkKLSAgICAgY29uc3QgY2hhciAqZnJvbTsKLSAgICAgY29uc3QgY2hhciAqdG87Ci0gICAgIHNiICpwdHI7Ci0gICAgIGludCAoKmdldF9saW5lKSBQQVJBTVMgKChzYiAqKSk7Ci17Ci0gIGludCBmcm9tX2xlbiA9IHN0cmxlbiAoZnJvbSk7Ci0gIGludCB0b19sZW4gPSBzdHJsZW4gKHRvKTsKLSAgaW50IGRlcHRoID0gMTsKLSAgaW50IGxpbmVfc3RhcnQgPSBwdHItPmxlbjsKLQotICBpbnQgbW9yZSA9IGdldF9saW5lIChwdHIpOwotCi0gIHdoaWxlIChtb3JlKQotICAgIHsKLSAgICAgIC8qIFRyeSBhbmQgZmluZCB0aGUgZmlyc3QgcHNldWRvIG9wIG9uIHRoZSBsaW5lICovCi0gICAgICBpbnQgaSA9IGxpbmVfc3RhcnQ7Ci0KLSAgICAgIGlmICghIG1hY3JvX2FsdGVybmF0ZSAmJiAhIG1hY3JvX21yaSkKLQl7Ci0JICAvKiBXaXRoIG5vcm1hbCBzeW50YXggd2UgY2FuIHN1Y2sgd2hhdCB3ZSB3YW50IHRpbGwgd2UgZ2V0Ci0JICAgICB0byB0aGUgZG90LiAgV2l0aCB0aGUgYWx0ZXJuYXRlLCBsYWJlbHMgaGF2ZSB0byBzdGFydCBpbgotCSAgICAgdGhlIGZpcnN0IGNvbHVtbiwgc2luY2Ugd2UgY2FudCB0ZWxsIHdoYXQncyBhIGxhYmVsIGFuZAotCSAgICAgd2hhdHMgYSBwc2V1ZG9vcCAqLwotCi0JICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotCSAgd2hpbGUgKGkgPCBwdHItPmxlbiAmJiBJU1dISVRFIChwdHItPnB0cltpXSkpCi0JICAgIGkrKzsKLQotCSAgLyogU2tpcCBvdmVyIGEgbGFiZWwgKi8KLQkgIHdoaWxlIChpIDwgcHRyLT5sZW4KLQkJICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgcHRyLT5wdHJbaV0pCi0JCSAgICAgfHwgcHRyLT5wdHJbaV0gPT0gJ18nCi0JCSAgICAgfHwgcHRyLT5wdHJbaV0gPT0gJyQnKSkKLQkgICAgaSsrOwotCi0JICAvKiBBbmQgYSBjb2xvbiAqLwotCSAgaWYgKGkgPCBwdHItPmxlbgotCSAgICAgICYmIHB0ci0+cHRyW2ldID09ICc6JykKLQkgICAgaSsrOwotCi0JfQotICAgICAgLyogU2tpcCB0cmFpbGluZyB3aGl0ZXNwYWNlICovCi0gICAgICB3aGlsZSAoaSA8IHB0ci0+bGVuICYmIElTV0hJVEUgKHB0ci0+cHRyW2ldKSkKLQlpKys7Ci0KLSAgICAgIGlmIChpIDwgcHRyLT5sZW4gJiYgKHB0ci0+cHRyW2ldID09ICcuJwotCQkJICAgfHwgbWFjcm9fYWx0ZXJuYXRlCi0JCQkgICB8fCBtYWNyb19tcmkpKQotCXsKLQkgIGlmIChwdHItPnB0cltpXSA9PSAnLicpCi0JICAgICAgaSsrOwotCSAgaWYgKHN0cm5jYXNlY21wIChwdHItPnB0ciArIGksIGZyb20sIGZyb21fbGVuKSA9PSAwKQotCSAgICBkZXB0aCsrOwotCSAgaWYgKHN0cm5jYXNlY21wIChwdHItPnB0ciArIGksIHRvLCB0b19sZW4pID09IDApCi0JICAgIHsKLQkgICAgICBkZXB0aC0tOwotCSAgICAgIGlmIChkZXB0aCA9PSAwKQotCQl7Ci0JCSAgLyogUmVzZXQgdGhlIHN0cmluZyB0byBub3QgaW5jbHVkZSB0aGUgZW5kaW5nIHJ1bmUgKi8KLQkJICBwdHItPmxlbiA9IGxpbmVfc3RhcnQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgLyogQWRkIGEgQ1IgdG8gdGhlIGVuZCBhbmQga2VlcCBydW5uaW5nICovCi0gICAgICBzYl9hZGRfY2hhciAocHRyLCAnXG4nKTsKLSAgICAgIGxpbmVfc3RhcnQgPSBwdHItPmxlbjsKLSAgICAgIG1vcmUgPSBnZXRfbGluZSAocHRyKTsKLSAgICB9Ci0KLSAgLyogUmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiB1bmV4cGVjdGVkIEVPRi4gICovCi0gIHJldHVybiBkZXB0aCA9PSAwOwotfQotCi0vKiBQaWNrIHVwIGEgdG9rZW4uICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfdG9rZW4gKGlkeCwgaW4sIG5hbWUpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm5hbWU7Ci17Ci0gIGlmIChpZHggPCBpbi0+bGVuCi0gICAgICAmJiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbaWR4XSkKLQkgIHx8IGluLT5wdHJbaWR4XSA9PSAnXycKLQkgIHx8IGluLT5wdHJbaWR4XSA9PSAnJCcpKQotICAgIHsKLSAgICAgIHNiX2FkZF9jaGFyIChuYW1lLCBpbi0+cHRyW2lkeCsrXSk7Ci0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCSAgICAgJiYgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW2lkeF0pCi0JCSB8fCBpbi0+cHRyW2lkeF0gPT0gJ18nCi0JCSB8fCBpbi0+cHRyW2lkeF0gPT0gJyQnKSkKLQl7Ci0JICBzYl9hZGRfY2hhciAobmFtZSwgaW4tPnB0cltpZHgrK10pOwotCX0KLSAgICB9Ci0gIC8qIElnbm9yZSB0cmFpbGluZyAmICovCi0gIGlmIChtYWNyb19hbHRlcm5hdGUgJiYgaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gPT0gJyYnKQotICAgIGlkeCsrOwotICByZXR1cm4gaWR4OwotfQotCi0vKiBQaWNrIHVwIGEgc3RyaW5nLiAgKi8KLQotc3RhdGljIGludAotZ2V0c3RyaW5nIChpZHgsIGluLCBhY2MpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKmFjYzsKLXsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4KLQkgJiYgKGluLT5wdHJbaWR4XSA9PSAnIicgCi0JICAgICB8fCAoaW4tPnB0cltpZHhdID09ICc8JyAmJiAobWFjcm9fYWx0ZXJuYXRlIHx8IG1hY3JvX21yaSkpCi0JICAgICB8fCAoaW4tPnB0cltpZHhdID09ICdcJycgJiYgbWFjcm9fYWx0ZXJuYXRlKSkpCi0gICAgewotICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCi0JewotCSAgaW50IG5lc3QgPSAwOwotCSAgaWR4Kys7Ci0JICB3aGlsZSAoKGluLT5wdHJbaWR4XSAhPSAnPicgfHwgbmVzdCkKLQkJICYmIGlkeCA8IGluLT5sZW4pCi0JICAgIHsKLQkgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICchJykKLQkJewotCQkgIGlkeCsrICA7Ci0JCSAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPicpCi0JCSAgICBuZXN0LS07Ci0JCSAgaWYgKGluLT5wdHJbaWR4XSA9PSAnPCcpCi0JCSAgICBuZXN0Kys7Ci0JCSAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHgrK10pOwotCQl9Ci0JICAgIH0KLQkgIGlkeCsrOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JewotCSAgY2hhciB0Y2hhciA9IGluLT5wdHJbaWR4XTsKLQkgIGlkeCsrOwotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0JICAgIHsKLQkgICAgICBpZiAobWFjcm9fYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnIScpCi0JCXsKLQkJICBpZHgrKyAgOwotCQkgIHNiX2FkZF9jaGFyIChhY2MsIGluLT5wdHJbaWR4KytdKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChpbi0+cHRyW2lkeF0gPT0gdGNoYXIpCi0JCSAgICB7Ci0JCSAgICAgIGlkeCsrOwotCQkgICAgICBpZiAoaWR4ID49IGluLT5sZW4gfHwgaW4tPnB0cltpZHhdICE9IHRjaGFyKQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgc2JfYWRkX2NoYXIgKGFjYywgaW4tPnB0cltpZHhdKTsKLQkJICBpZHgrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLSAgCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIEZldGNoIHN0cmluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sCi0gICBydWxlczoKLSAgICAnQnh5eDx3aGl0ZXNwYWNlPiAgCS0+IHJldHVybiAnQnh5emEKLSAgICAlPGNoYXI+CQktPiByZXR1cm4gc3RyaW5nIG9mIGRlY2ltYWwgdmFsdWUgb2YgeAotICAgICI8c3RyaW5nPiIJCS0+IHJldHVybiBzdHJpbmcKLSAgICB4eXg8d2hpdGVzcGFjZT4gICAgIC0+IHJldHVybiB4eXoKLSovCi0KLXN0YXRpYyBpbnQKLWdldF9hbnlfc3RyaW5nIChpZHgsIGluLCBvdXQsIGV4cGFuZCwgcHJldGVuZF9xdW90ZWQpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICppbjsKLSAgICAgc2IgKm91dDsKLSAgICAgaW50IGV4cGFuZDsKLSAgICAgaW50IHByZXRlbmRfcXVvdGVkOwotewotICBzYl9yZXNldCAob3V0KTsKLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0KLSAgaWYgKGlkeCA8IGluLT5sZW4pCi0gICAgewotICAgICAgaWYgKGluLT5sZW4gPiAyICYmIGluLT5wdHJbaWR4KzFdID09ICdcJycgJiYgSVNCQVNFIChpbi0+cHRyW2lkeF0pKQotCXsKLQkgIHdoaWxlICghSVNTRVAgKGluLT5wdHJbaWR4XSkpCi0JICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpbi0+cHRyW2lkeF0gPT0gJyUnCi0JICAgICAgICYmIG1hY3JvX2FsdGVybmF0ZQotCSAgICAgICAmJiBleHBhbmQpCi0JewotCSAgaW50IHZhbDsKLQkgIGNoYXIgYnVmWzIwXTsKLQkgIC8qIFR1cm5zIHRoZSBuZXh0IGV4cHJlc3Npb24gaW50byBhIHN0cmluZyAqLwotCSAgaWR4ID0gKCptYWNyb19leHByKSAoXygiJSBvcGVyYXRvciBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIiksCi0JCQkgICAgICAgaWR4ICsgMSwKLQkJCSAgICAgICBpbiwKLQkJCSAgICAgICAmdmFsKTsKLQkgIHNwcmludGYoYnVmLCAiJWQiLCB2YWwpOwotCSAgc2JfYWRkX3N0cmluZyAob3V0LCBidWYpOwotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicKLQkgICAgICAgfHwgKGluLT5wdHJbaWR4XSA9PSAnPCcgJiYgKG1hY3JvX2FsdGVybmF0ZSB8fCBtYWNyb19tcmkpKQotCSAgICAgICB8fCAobWFjcm9fYWx0ZXJuYXRlICYmIGluLT5wdHJbaWR4XSA9PSAnXCcnKSkKLQl7Ci0JICBpZiAobWFjcm9fYWx0ZXJuYXRlCi0JICAgICAgJiYgISBtYWNyb19zdHJpcF9hdAotCSAgICAgICYmIGV4cGFuZCkKLQkgICAgewotCSAgICAgIC8qIEtlZXAgdGhlIHF1b3RlcyAqLwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICAnXCInKTsKLQotCSAgICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgb3V0KTsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAgJ1wiJyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlkeCA9IGdldHN0cmluZyAoaWR4LCBpbiwgb3V0KTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgd2hpbGUgKGlkeCA8IGluLT5sZW4gCi0JCSAmJiAoaW4tPnB0cltpZHhdID09ICciJwotCQkgICAgIHx8IGluLT5wdHJbaWR4XSA9PSAnXCcnCi0JCSAgICAgfHwgcHJldGVuZF9xdW90ZWQgCi0JCSAgICAgfHwgKGluLT5wdHJbaWR4XSAhPSAnICcKLQkJCSAmJiBpbi0+cHRyW2lkeF0gIT0gJ1x0JwotCQkJICYmIGluLT5wdHJbaWR4XSAhPSAnLCcKLQkJCSAmJiAoaW4tPnB0cltpZHhdICE9ICc8JwotCQkJICAgICB8fCAoISBtYWNyb19hbHRlcm5hdGUgJiYgISBtYWNyb19tcmkpKSkpKQotCSAgICB7Ci0JICAgICAgaWYgKGluLT5wdHJbaWR4XSA9PSAnIicgCi0JCSAgfHwgaW4tPnB0cltpZHhdID09ICdcJycpCi0JCXsKLQkJICBjaGFyIHRjaGFyID0gaW4tPnB0cltpZHhdOwotCQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQkJICB3aGlsZSAoaWR4IDwgaW4tPmxlbgotCQkJICYmIGluLT5wdHJbaWR4XSAhPSB0Y2hhcikKLQkJICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsJCSAgICAKLQkJICBpZiAoaWR4ID09IGluLT5sZW4pCi0JCSAgICByZXR1cm4gaWR4OwkgICAgICAKLQkJfQotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbaWR4KytdKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGlkeDsKLX0KLQotLyogUGljayB1cCB0aGUgZm9ybWFsIHBhcmFtZXRlcnMgb2YgYSBtYWNybyBkZWZpbml0aW9uLiAgKi8KLQotc3RhdGljIGludAotZG9fZm9ybWFscyAobWFjcm8sIGlkeCwgaW4pCi0gICAgIG1hY3JvX2VudHJ5ICptYWNybzsKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotewotICBmb3JtYWxfZW50cnkgKipwID0gJm1hY3JvLT5mb3JtYWxzOwotCi0gIG1hY3JvLT5mb3JtYWxfY291bnQgPSAwOwotICBtYWNyby0+Zm9ybWFsX2hhc2ggPSBoYXNoX25ldyAoKTsKLSAgd2hpbGUgKGlkeCA8IGluLT5sZW4pCi0gICAgewotICAgICAgZm9ybWFsX2VudHJ5ICpmb3JtYWw7Ci0KLSAgICAgIGZvcm1hbCA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQotICAgICAgc2JfbmV3ICgmZm9ybWFsLT5uYW1lKTsKLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+ZGVmKTsKLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+YWN0dWFsKTsKLQotICAgICAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gICAgICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sICZmb3JtYWwtPm5hbWUpOwotICAgICAgaWYgKGZvcm1hbC0+bmFtZS5sZW4gPT0gMCkKLQlicmVhazsKLSAgICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotICAgICAgaWYgKGZvcm1hbC0+bmFtZS5sZW4pCi0JewotCSAgLyogVGhpcyBpcyBhIGZvcm1hbCAqLwotCSAgaWYgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICc9JykKLQkgICAgewotCSAgICAgIC8qIEdvdCBhIGRlZmF1bHQgKi8KLQkgICAgICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4ICsgMSwgaW4sICZmb3JtYWwtPmRlZiwgMSwgMCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIEFkZCB0byBtYWNybydzIGhhc2ggdGFibGUgKi8KLSAgICAgIGhhc2hfamFtIChtYWNyby0+Zm9ybWFsX2hhc2gsIHNiX3Rlcm1pbmF0ZSAoJmZvcm1hbC0+bmFtZSksIGZvcm1hbCk7Ci0KLSAgICAgIGZvcm1hbC0+aW5kZXggPSBtYWNyby0+Zm9ybWFsX2NvdW50OwotICAgICAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gICAgICBtYWNyby0+Zm9ybWFsX2NvdW50Kys7Ci0gICAgICAqcCA9IGZvcm1hbDsKLSAgICAgIHAgPSAmZm9ybWFsLT5uZXh0OwotICAgICAgKnAgPSBOVUxMOwotICAgIH0KLQotICBpZiAobWFjcm9fbXJpKQotICAgIHsKLSAgICAgIGZvcm1hbF9lbnRyeSAqZm9ybWFsOwotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgLyogQWRkIGEgc3BlY2lhbCBOQVJHIGZvcm1hbCwgd2hpY2ggbWFjcm9fZXhwYW5kIHdpbGwgc2V0IHRvIHRoZQotICAgICAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4gICovCi0gICAgICBmb3JtYWwgPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0KLSAgICAgIHNiX25ldyAoJmZvcm1hbC0+bmFtZSk7Ci0gICAgICBzYl9uZXcgKCZmb3JtYWwtPmRlZik7Ci0gICAgICBzYl9uZXcgKCZmb3JtYWwtPmFjdHVhbCk7Ci0KLSAgICAgIC8qIFRoZSBzYW1lIE1SSSBhc3NlbWJsZXJzIHdoaWNoIHRyZWF0ICdAJyBjaGFyYWN0ZXJzIGFsc28gdXNlCi0gICAgICAgICB0aGUgbmFtZSAkTkFSRy4gIEF0IGxlYXN0IHVudGlsIHdlIGZpbmQgYW4gZXhjZXB0aW9uLiAgKi8KLSAgICAgIGlmIChtYWNyb19zdHJpcF9hdCkKLQluYW1lID0gIiROQVJHIjsKLSAgICAgIGVsc2UKLQluYW1lID0gIk5BUkciOwotCi0gICAgICBzYl9hZGRfc3RyaW5nICgmZm9ybWFsLT5uYW1lLCBuYW1lKTsKLQotICAgICAgLyogQWRkIHRvIG1hY3JvJ3MgaGFzaCB0YWJsZSAqLwotICAgICAgaGFzaF9qYW0gKG1hY3JvLT5mb3JtYWxfaGFzaCwgbmFtZSwgZm9ybWFsKTsKLQotICAgICAgZm9ybWFsLT5pbmRleCA9IE5BUkdfSU5ERVg7Ci0gICAgICAqcCA9IGZvcm1hbDsKLSAgICAgIGZvcm1hbC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIERlZmluZSBhIG5ldyBtYWNyby4gIFJldHVybnMgTlVMTCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgcmV0dXJucyBhbgotICAgZXJyb3IgbWVzc2FnZS4gIElmIE5BTUVQIGlzIG5vdCBOVUxMLCAqTkFNRVAgaXMgc2V0IHRvIHRoZSBuYW1lIG9mCi0gICB0aGUgbWFjcm8gd2hpY2ggd2FzIGRlZmluZWQuICAqLwotCi1jb25zdCBjaGFyICoKLWRlZmluZV9tYWNybyAoaWR4LCBpbiwgbGFiZWwsIGdldF9saW5lLCBuYW1lcCkKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBzYiAqbGFiZWw7Ci0gICAgIGludCAoKmdldF9saW5lKSBQQVJBTVMgKChzYiAqKSk7Ci0gICAgIGNvbnN0IGNoYXIgKipuYW1lcDsKLXsKLSAgbWFjcm9fZW50cnkgKm1hY3JvOwotICBzYiBuYW1lOwotICBjb25zdCBjaGFyICpuYW1lc3RyOwotCi0gIG1hY3JvID0gKG1hY3JvX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAobWFjcm9fZW50cnkpKTsKLSAgc2JfbmV3ICgmbWFjcm8tPnN1Yik7Ci0gIHNiX25ldyAoJm5hbWUpOwotCi0gIG1hY3JvLT5mb3JtYWxfY291bnQgPSAwOwotICBtYWNyby0+Zm9ybWFscyA9IDA7Ci0KLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIGlmICghIGJ1ZmZlcl9hbmRfbmVzdCAoIk1BQ1JPIiwgIkVORE0iLCAmbWFjcm8tPnN1YiwgZ2V0X2xpbmUpKQotICAgIHJldHVybiBfKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIG1hY3JvIGRlZmluaXRpb24iKTsKLSAgaWYgKGxhYmVsICE9IE5VTEwgJiYgbGFiZWwtPmxlbiAhPSAwKQotICAgIHsKLSAgICAgIHNiX2FkZF9zYiAoJm5hbWUsIGxhYmVsKTsKLSAgICAgIGlmIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSA9PSAnKCcpCi0JewotCSAgLyogSXQncyB0aGUgbGFiZWw6IE1BQ1JPIChmb3JtYWxzLC4uLikgIHNvcnQgKi8KLQkgIGlkeCA9IGRvX2Zvcm1hbHMgKG1hY3JvLCBpZHggKyAxLCBpbik7Ci0JICBpZiAoaW4tPnB0cltpZHhdICE9ICcpJykKLQkgICAgcmV0dXJuIF8oIm1pc3NpbmcgKSBhZnRlciBmb3JtYWxzIik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEl0J3MgdGhlIGxhYmVsOiBNQUNSTyBmb3JtYWxzLC4uLiAgc29ydCAqLwotCSAgaWR4ID0gZG9fZm9ybWFscyAobWFjcm8sIGlkeCwgaW4pOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sICZuYW1lKTsKLSAgICAgIGlkeCA9IHNiX3NraXBfY29tbWEgKGlkeCwgaW4pOwotICAgICAgaWR4ID0gZG9fZm9ybWFscyAobWFjcm8sIGlkeCwgaW4pOwotICAgIH0KLQotICAvKiBhbmQgc3RpY2sgaXQgaW4gdGhlIG1hY3JvIGhhc2ggdGFibGUgKi8KLSAgZm9yIChpZHggPSAwOyBpZHggPCBuYW1lLmxlbjsgaWR4KyspCi0gICAgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBuYW1lLnB0cltpZHhdKSkKLSAgICAgIG5hbWUucHRyW2lkeF0gPSB0b2xvd2VyIChuYW1lLnB0cltpZHhdKTsKLSAgbmFtZXN0ciA9IHNiX3Rlcm1pbmF0ZSAoJm5hbWUpOwotICBoYXNoX2phbSAobWFjcm9faGFzaCwgbmFtZXN0ciwgKFBUUikgbWFjcm8pOwotCi0gIG1hY3JvX2RlZmluZWQgPSAxOwotCi0gIGlmIChuYW1lcCAhPSBOVUxMKQotICAgICpuYW1lcCA9IG5hbWVzdHI7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFNjYW4gYSB0b2tlbiwgYW5kIHRoZW4gc2tpcCBLSU5ELiAgKi8KLQotc3RhdGljIGludAotZ2V0X2Fwb3N0X3Rva2VuIChpZHgsIGluLCBuYW1lLCBraW5kKQotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpuYW1lOwotICAgICBpbnQga2luZDsKLXsKLSAgaWR4ID0gZ2V0X3Rva2VuIChpZHgsIGluLCBuYW1lKTsKLSAgaWYgKGlkeCA8IGluLT5sZW4KLSAgICAgICYmIGluLT5wdHJbaWR4XSA9PSBraW5kCi0gICAgICAmJiAoISBtYWNyb19tcmkgfHwgbWFjcm9fc3RyaXBfYXQpCi0gICAgICAmJiAoISBtYWNyb19zdHJpcF9hdCB8fCBraW5kID09ICdAJykpCi0gICAgaWR4Kys7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIFN1YnN0aXR1dGUgdGhlIGFjdHVhbCB2YWx1ZSBmb3IgYSBmb3JtYWwgcGFyYW1ldGVyLiAgKi8KLQotc3RhdGljIGludAotc3ViX2FjdHVhbCAoc3RhcnQsIGluLCB0LCBmb3JtYWxfaGFzaCwga2luZCwgb3V0LCBjb3B5aWZub3R0aGVyZSkKLSAgICAgaW50IHN0YXJ0OwotICAgICBzYiAqaW47Ci0gICAgIHNiICp0OwotICAgICBzdHJ1Y3QgaGFzaF9jb250cm9sICpmb3JtYWxfaGFzaDsKLSAgICAgaW50IGtpbmQ7Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCBjb3B5aWZub3R0aGVyZTsKLXsKLSAgaW50IHNyYzsKLSAgZm9ybWFsX2VudHJ5ICpwdHI7Ci0KLSAgc3JjID0gZ2V0X2Fwb3N0X3Rva2VuIChzdGFydCwgaW4sIHQsIGtpbmQpOwotICAvKiBTZWUgaWYgaXQncyBpbiB0aGUgbWFjcm8ncyBoYXNoIHRhYmxlLCB1bmxlc3MgdGhpcyBpcwotICAgICBtYWNyb19zdHJpcF9hdCBhbmQga2luZCBpcyAnQCcgYW5kIHRoZSB0b2tlbiBkaWQgbm90IGVuZCBpbiAnQCcuICAqLwotICBpZiAobWFjcm9fc3RyaXBfYXQKLSAgICAgICYmIGtpbmQgPT0gJ0AnCi0gICAgICAmJiAoc3JjID09IHN0YXJ0IHx8IGluLT5wdHJbc3JjIC0gMV0gIT0gJ0AnKSkKLSAgICBwdHIgPSBOVUxMOwotICBlbHNlCi0gICAgcHRyID0gKGZvcm1hbF9lbnRyeSAqKSBoYXNoX2ZpbmQgKGZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKHQpKTsKLSAgaWYgKHB0cikKLSAgICB7Ci0gICAgICBpZiAocHRyLT5hY3R1YWwubGVuKQotCXsKLQkgIHNiX2FkZF9zYiAob3V0LCAmcHRyLT5hY3R1YWwpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzYl9hZGRfc2IgKG91dCwgJnB0ci0+ZGVmKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChraW5kID09ICcmJykKLSAgICB7Ci0gICAgICAvKiBEb2luZyB0aGlzIHBlcm1pdHMgcGVvcGxlIHRvIHVzZSAmIGluIG1hY3JvIGJvZGllcy4gICovCi0gICAgICBzYl9hZGRfY2hhciAob3V0LCAnJicpOwotICAgIH0KLSAgZWxzZSBpZiAoY29weWlmbm90dGhlcmUpCi0gICAgewotICAgICAgc2JfYWRkX3NiIChvdXQsIHQpOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBzYl9hZGRfY2hhciAob3V0LCAnXFwnKTsKLSAgICAgIHNiX2FkZF9zYiAob3V0LCB0KTsKLSAgICB9Ci0gIHJldHVybiBzcmM7Ci19Ci0KLS8qIEV4cGFuZCB0aGUgYm9keSBvZiBhIG1hY3JvLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbWFjcm9fZXhwYW5kX2JvZHkgKGluLCBvdXQsIGZvcm1hbHMsIGZvcm1hbF9oYXNoLCBjb21tZW50X2NoYXIsIGxvY2FscykKLSAgICAgc2IgKmluOwotICAgICBzYiAqb3V0OwotICAgICBmb3JtYWxfZW50cnkgKmZvcm1hbHM7Ci0gICAgIHN0cnVjdCBoYXNoX2NvbnRyb2wgKmZvcm1hbF9oYXNoOwotICAgICBpbnQgY29tbWVudF9jaGFyOwotICAgICBpbnQgbG9jYWxzOwotewotICBzYiB0OwotICBpbnQgc3JjID0gMDsKLSAgaW50IGlucXVvdGUgPSAwOwotICBmb3JtYWxfZW50cnkgKmxvY2xpc3QgPSBOVUxMOwotCi0gIHNiX25ldyAoJnQpOwotCi0gIHdoaWxlIChzcmMgPCBpbi0+bGVuKQotICAgIHsKLSAgICAgIGlmIChpbi0+cHRyW3NyY10gPT0gJyYnKQotCXsKLQkgIHNiX3Jlc2V0ICgmdCk7Ci0JICBpZiAobWFjcm9fbXJpKQotCSAgICB7Ci0JICAgICAgaWYgKHNyYyArIDEgPCBpbi0+bGVuICYmIGluLT5wdHJbc3JjICsgMV0gPT0gJyYnKQotCQlzcmMgPSBzdWJfYWN0dWFsIChzcmMgKyAyLCBpbiwgJnQsIGZvcm1hbF9oYXNoLCAnXCcnLCBvdXQsIDEpOwotCSAgICAgIGVsc2UKLQkJc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltzcmMrK10pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBGSVhNRTogV2h5IGRvIHdlIGRvIHRoaXM/ICAqLwotCSAgICAgIHNyYyA9IHN1Yl9hY3R1YWwgKHNyYyArIDEsIGluLCAmdCwgZm9ybWFsX2hhc2gsICcmJywgb3V0LCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnXFwnKQotCXsKLQkgIHNyYysrOwotCSAgaWYgKGluLT5wdHJbc3JjXSA9PSBjb21tZW50X2NoYXIgJiYgY29tbWVudF9jaGFyICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgY29tbWVudCwganVzdCBkcm9wIHRoZSByZXN0IG9mIHRoZSBsaW5lICovCi0JICAgICAgd2hpbGUgKHNyYyA8IGluLT5sZW4KLQkJICAgICAmJiBpbi0+cHRyW3NyY10gIT0gJ1xuJykKLQkJc3JjKys7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnKCcpCi0JICAgIHsKLQkgICAgICAvKiBTdWIgaW4gdGlsbCB0aGUgbmV4dCAnKScgbGl0ZXJhbGx5ICovCi0JICAgICAgc3JjKys7Ci0JICAgICAgd2hpbGUgKHNyYyA8IGluLT5sZW4gJiYgaW4tPnB0cltzcmNdICE9ICcpJykKLQkJewotCQkgIHNiX2FkZF9jaGFyIChvdXQsIGluLT5wdHJbc3JjKytdKTsKLQkJfQotCSAgICAgIGlmIChpbi0+cHRyW3NyY10gPT0gJyknKQotCQlzcmMrKzsKLQkgICAgICBlbHNlCi0JCXJldHVybiBfKCJtaXNzcGxhY2VkICkiKTsKLQkgICAgfQotCSAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICdAJykKLQkgICAgewotCSAgICAgIC8qIFN1YiBpbiB0aGUgbWFjcm8gaW52b2NhdGlvbiBudW1iZXIgKi8KLQotCSAgICAgIGNoYXIgYnVmZmVyWzEwXTsKLQkgICAgICBzcmMrKzsKLQkgICAgICBzcHJpbnRmIChidWZmZXIsICIlMDVkIiwgbWFjcm9fbnVtYmVyKTsKLQkgICAgICBzYl9hZGRfc3RyaW5nIChvdXQsIGJ1ZmZlcik7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGluLT5wdHJbc3JjXSA9PSAnJicpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgcHJlcHJvY2Vzc29yIHZhcmlhYmxlIG5hbWUsIHdlIGRvbid0IGRvIHRoZW0KLQkJIGhlcmUgKi8KLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnXFwnKTsKLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnJicpOwotCSAgICAgIHNyYysrOwotCSAgICB9Ci0JICBlbHNlIGlmIChtYWNyb19tcmkKLQkJICAgJiYgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbc3JjXSkpCi0JICAgIHsKLQkgICAgICBpbnQgaW5kOwotCSAgICAgIGZvcm1hbF9lbnRyeSAqZjsKLQotCSAgICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgaW4tPnB0cltzcmNdKSkKLQkJaW5kID0gaW4tPnB0cltzcmNdIC0gJzAnOwotCSAgICAgIGVsc2UgaWYgKGlzdXBwZXIgKCh1bnNpZ25lZCBjaGFyKSBpbi0+cHRyW3NyY10pKQotCQlpbmQgPSBpbi0+cHRyW3NyY10gLSAnQScgKyAxMDsKLQkgICAgICBlbHNlCi0JCWluZCA9IGluLT5wdHJbc3JjXSAtICdhJyArIDEwOwotCSAgICAgICsrc3JjOwotCSAgICAgIGZvciAoZiA9IGZvcm1hbHM7IGYgIT0gTlVMTDsgZiA9IGYtPm5leHQpCi0JCXsKLQkJICBpZiAoZi0+aW5kZXggPT0gaW5kIC0gMSkKLQkJICAgIHsKLQkJICAgICAgaWYgKGYtPmFjdHVhbC5sZW4gIT0gMCkKLQkJCXNiX2FkZF9zYiAob3V0LCAmZi0+YWN0dWFsKTsKLQkJICAgICAgZWxzZQotCQkJc2JfYWRkX3NiIChvdXQsICZmLT5kZWYpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzYl9yZXNldCAoJnQpOwotCSAgICAgIHNyYyA9IHN1Yl9hY3R1YWwgKHNyYywgaW4sICZ0LCBmb3JtYWxfaGFzaCwgJ1wnJywgb3V0LCAwKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKChtYWNyb19hbHRlcm5hdGUgfHwgbWFjcm9fbXJpKQotCSAgICAgICAmJiAoaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpIGluLT5wdHJbc3JjXSkKLQkJICAgfHwgaW4tPnB0cltzcmNdID09ICdfJwotCQkgICB8fCBpbi0+cHRyW3NyY10gPT0gJyQnKQotCSAgICAgICAmJiAoISBpbnF1b3RlCi0JCSAgIHx8ICEgbWFjcm9fc3RyaXBfYXQKLQkJICAgfHwgKHNyYyA+IDAgJiYgaW4tPnB0cltzcmMgLSAxXSA9PSAnQCcpKSkKLQl7Ci0JICBpZiAoISBsb2NhbHMKLQkgICAgICB8fCBzcmMgKyA1ID49IGluLT5sZW4KLQkgICAgICB8fCBzdHJuY2FzZWNtcCAoaW4tPnB0ciArIHNyYywgIkxPQ0FMIiwgNSkgIT0gMAotCSAgICAgIHx8ICEgSVNXSElURSAoaW4tPnB0cltzcmMgKyA1XSkpCi0JICAgIHsKLQkgICAgICBzYl9yZXNldCAoJnQpOwotCSAgICAgIHNyYyA9IHN1Yl9hY3R1YWwgKHNyYywgaW4sICZ0LCBmb3JtYWxfaGFzaCwKLQkJCQkobWFjcm9fc3RyaXBfYXQgJiYgaW5xdW90ZSkgPyAnQCcgOiAnXCcnLAotCQkJCW91dCwgMSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZvcm1hbF9lbnRyeSAqZjsKLQotCSAgICAgIHNyYyA9IHNiX3NraXBfd2hpdGUgKHNyYyArIDUsIGluKTsKLQkgICAgICB3aGlsZSAoaW4tPnB0cltzcmNdICE9ICdcbicgJiYgaW4tPnB0cltzcmNdICE9IGNvbW1lbnRfY2hhcikKLQkJewotCQkgIHN0YXRpYyBpbnQgbG9jY250OwotCQkgIGNoYXIgYnVmWzIwXTsKLQkJICBjb25zdCBjaGFyICplcnI7Ci0KLQkJICBmID0gKGZvcm1hbF9lbnRyeSAqKSB4bWFsbG9jIChzaXplb2YgKGZvcm1hbF9lbnRyeSkpOwotCQkgIHNiX25ldyAoJmYtPm5hbWUpOwotCQkgIHNiX25ldyAoJmYtPmRlZik7Ci0JCSAgc2JfbmV3ICgmZi0+YWN0dWFsKTsKLQkJICBmLT5pbmRleCA9IExPQ0FMX0lOREVYOwotCQkgIGYtPm5leHQgPSBsb2NsaXN0OwotCQkgIGxvY2xpc3QgPSBmOwotCi0JCSAgc3JjID0gZ2V0X3Rva2VuIChzcmMsIGluLCAmZi0+bmFtZSk7Ci0JCSAgKytsb2NjbnQ7Ci0JCSAgc3ByaW50ZiAoYnVmLCAiTEwlMDR4IiwgbG9jY250KTsKLQkJICBzYl9hZGRfc3RyaW5nICgmZi0+YWN0dWFsLCBidWYpOwotCi0JCSAgZXJyID0gaGFzaF9qYW0gKGZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZmLT5uYW1lKSwgZik7Ci0JCSAgaWYgKGVyciAhPSBOVUxMKQotCQkgICAgcmV0dXJuIGVycjsKLQotCQkgIHNyYyA9IHNiX3NraXBfY29tbWEgKHNyYywgaW4pOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChjb21tZW50X2NoYXIgIT0gJ1wwJwotCSAgICAgICAmJiBpbi0+cHRyW3NyY10gPT0gY29tbWVudF9jaGFyCi0JICAgICAgICYmIHNyYyArIDEgPCBpbi0+bGVuCi0JICAgICAgICYmIGluLT5wdHJbc3JjICsgMV0gPT0gY29tbWVudF9jaGFyCi0JICAgICAgICYmICFpbnF1b3RlKQotCXsKLQkgIC8qIFR3byBjb21tZW50IGNoYXJzIGluIGEgcm93IGNhdXNlIHRoZSByZXN0IG9mIHRoZSBsaW5lIHRvCi0gICAgICAgICAgICAgYmUgZHJvcHBlZC4gICovCi0JICB3aGlsZSAoc3JjIDwgaW4tPmxlbiAmJiBpbi0+cHRyW3NyY10gIT0gJ1xuJykKLQkgICAgc3JjKys7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICciJwotCSAgICAgICB8fCAobWFjcm9fbXJpICYmIGluLT5wdHJbc3JjXSA9PSAnXCcnKSkKLQl7Ci0JICBpbnF1b3RlID0gIWlucXVvdGU7Ci0JICBzYl9hZGRfY2hhciAob3V0LCBpbi0+cHRyW3NyYysrXSk7Ci0JfQotICAgICAgZWxzZSBpZiAoaW4tPnB0cltzcmNdID09ICdAJyAmJiBtYWNyb19zdHJpcF9hdCkKLQl7Ci0JICArK3NyYzsKLQkgIGlmIChzcmMgPCBpbi0+bGVuCi0JICAgICAgJiYgaW4tPnB0cltzcmNdID09ICdAJykKLQkgICAgewotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICdAJyk7Ci0JICAgICAgKytzcmM7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChtYWNyb19tcmkKLQkgICAgICAgJiYgaW4tPnB0cltzcmNdID09ICc9JwotCSAgICAgICAmJiBzcmMgKyAxIDwgaW4tPmxlbgotCSAgICAgICAmJiBpbi0+cHRyW3NyYyArIDFdID09ICc9JykKLQl7Ci0JICBmb3JtYWxfZW50cnkgKnB0cjsKLQotCSAgc2JfcmVzZXQgKCZ0KTsKLQkgIHNyYyA9IGdldF90b2tlbiAoc3JjICsgMiwgaW4sICZ0KTsKLQkgIHB0ciA9IChmb3JtYWxfZW50cnkgKikgaGFzaF9maW5kIChmb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmdCkpOwotCSAgaWYgKHB0ciA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCByZWFsbHkgcmV0dXJuIGEgd2FybmluZyBzdHJpbmcgaGVyZSwKLSAgICAgICAgICAgICAgICAgYnV0IHdlIGNhbid0LCBiZWNhdXNlIHRoZSA9PSBtaWdodCBiZSBpbiB0aGUgTVJJCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgZmllbGQsIGFuZCwgc2luY2UgdGhlIG5hdHVyZSBvZiB0aGUgTVJJCi0gICAgICAgICAgICAgICAgIGNvbW1lbnQgZmllbGQgZGVwZW5kcyB1cG9uIHRoZSBleGFjdCBpbnN0cnVjdGlvbgotICAgICAgICAgICAgICAgICBiZWluZyB1c2VkLCB3ZSBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiBoZXJlIHRvCi0gICAgICAgICAgICAgICAgIGZpZ3VyZSBvdXQgd2hldGhlciBpdCBpcyBvciBub3QuICBJbnN0ZWFkLCB3ZSBsZWF2ZQotICAgICAgICAgICAgICAgICB0aGUgPT0gaW4gcGxhY2UsIHdoaWNoIHNob3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvciBpZgotICAgICAgICAgICAgICAgICBpdCBpcyBub3QgaW4gYSBjb21tZW50LiAgKi8KLQkgICAgICBzYl9hZGRfY2hhciAob3V0LCAnPScpOwotCSAgICAgIHNiX2FkZF9jaGFyIChvdXQsICc9Jyk7Ci0JICAgICAgc2JfYWRkX3NiIChvdXQsICZ0KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKHB0ci0+YWN0dWFsLmxlbikKLQkJewotCQkgIHNiX2FkZF9zdHJpbmcgKG91dCwgIi0xIik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBzYl9hZGRfY2hhciAob3V0LCAnMCcpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2JfYWRkX2NoYXIgKG91dCwgaW4tPnB0cltzcmMrK10pOwotCX0KLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJnQpOwotCi0gIHdoaWxlIChsb2NsaXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgZm9ybWFsX2VudHJ5ICpmOwotCi0gICAgICBmID0gbG9jbGlzdC0+bmV4dDsKLSAgICAgIC8qIFNldHRpbmcgdGhlIHZhbHVlIHRvIE5VTEwgZWZmZWN0aXZlbHkgZGVsZXRlcyB0aGUgZW50cnkuICBXZQotICAgICAgICAgYXZvaWQgY2FsbGluZyBoYXNoX2RlbGV0ZSBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVjbGFpbSBtZW1vcnkuICAqLwotICAgICAgaGFzaF9qYW0gKGZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZsb2NsaXN0LT5uYW1lKSwgTlVMTCk7Ci0gICAgICBzYl9raWxsICgmbG9jbGlzdC0+bmFtZSk7Ci0gICAgICBzYl9raWxsICgmbG9jbGlzdC0+ZGVmKTsKLSAgICAgIHNiX2tpbGwgKCZsb2NsaXN0LT5hY3R1YWwpOwotICAgICAgZnJlZSAobG9jbGlzdCk7Ci0gICAgICBsb2NsaXN0ID0gZjsKLSAgICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEFzc2lnbiB2YWx1ZXMgdG8gdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIG9mIGEgbWFjcm8sIGFuZCBleHBhbmQgdGhlCi0gICBib2R5LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotbWFjcm9fZXhwYW5kIChpZHgsIGluLCBtLCBvdXQsIGNvbW1lbnRfY2hhcikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKmluOwotICAgICBtYWNyb19lbnRyeSAqbTsKLSAgICAgc2IgKm91dDsKLSAgICAgaW50IGNvbW1lbnRfY2hhcjsKLXsKLSAgc2IgdDsKLSAgZm9ybWFsX2VudHJ5ICpwdHI7Ci0gIGZvcm1hbF9lbnRyeSAqZjsKLSAgaW50IGlzX3Bvc2l0aW9uYWwgPSAwOwotICBpbnQgaXNfa2V5d29yZCA9IDA7Ci0gIGludCBuYXJnID0gMDsKLSAgY29uc3QgY2hhciAqZXJyOwotCi0gIHNiX25ldyAoJnQpOwotICAKLSAgLyogUmVzZXQgYW55IG9sZCB2YWx1ZSB0aGUgYWN0dWFscyBtYXkgaGF2ZSAqLwotICBmb3IgKGYgPSBtLT5mb3JtYWxzOyBmOyBmID0gZi0+bmV4dCkKLSAgICAgIHNiX3Jlc2V0ICgmZi0+YWN0dWFsKTsKLSAgZiA9IG0tPmZvcm1hbHM7Ci0gIHdoaWxlIChmICE9IE5VTEwgJiYgZi0+aW5kZXggPCAwKQotICAgIGYgPSBmLT5uZXh0OwotCi0gIGlmIChtYWNyb19tcmkpCi0gICAgewotICAgICAgLyogVGhlIG1hY3JvIG1heSBiZSBjYWxsZWQgd2l0aCBhbiBvcHRpb25hbCBxdWFsaWZpZXIsIHdoaWNoIG1heQotICAgICAgICAgYmUgcmVmZXJyZWQgdG8gaW4gdGhlIG1hY3JvIGJvZHkgYXMgXDAuICAqLwotICAgICAgaWYgKGlkeCA8IGluLT5sZW4gJiYgaW4tPnB0cltpZHhdID09ICcuJykKLQl7Ci0JICBmb3JtYWxfZW50cnkgKm47Ci0KLQkgIG4gPSAoZm9ybWFsX2VudHJ5ICopIHhtYWxsb2MgKHNpemVvZiAoZm9ybWFsX2VudHJ5KSk7Ci0JICBzYl9uZXcgKCZuLT5uYW1lKTsKLQkgIHNiX25ldyAoJm4tPmRlZik7Ci0JICBzYl9uZXcgKCZuLT5hY3R1YWwpOwotCSAgbi0+aW5kZXggPSBRVUFMX0lOREVYOwotCi0JICBuLT5uZXh0ID0gbS0+Zm9ybWFsczsKLQkgIG0tPmZvcm1hbHMgPSBuOwotCi0JICBpZHggPSBnZXRfYW55X3N0cmluZyAoaWR4ICsgMSwgaW4sICZuLT5hY3R1YWwsIDEsIDApOwotCX0KLSAgICB9Ci0KLSAgLyogUGVlbCBvZmYgdGhlIGFjdHVhbHMgYW5kIHN0b3JlIHRoZW0gYXdheSBpbiB0aGUgaGFzaCB0YWJsZXMnIGFjdHVhbHMgKi8KLSAgaWR4ID0gc2Jfc2tpcF93aGl0ZSAoaWR4LCBpbik7Ci0gIHdoaWxlIChpZHggPCBpbi0+bGVuICYmIGluLT5wdHJbaWR4XSAhPSBjb21tZW50X2NoYXIpCi0gICAgewotICAgICAgaW50IHNjYW47Ci0KLSAgICAgIC8qIExvb2sgYW5kIHNlZSBpZiBpdCdzIGEgcG9zaXRpb25hbCBvciBrZXl3b3JkIGFyZyAqLwotICAgICAgc2NhbiA9IGlkeDsKLSAgICAgIHdoaWxlIChzY2FuIDwgaW4tPmxlbgotCSAgICAgJiYgIUlTU0VQIChpbi0+cHRyW3NjYW5dKQotCSAgICAgJiYgIShtYWNyb19tcmkgJiYgaW4tPnB0cltzY2FuXSA9PSAnXCcnKQotCSAgICAgJiYgKCFtYWNyb19hbHRlcm5hdGUgJiYgaW4tPnB0cltzY2FuXSAhPSAnPScpKQotCXNjYW4rKzsKLSAgICAgIGlmIChzY2FuIDwgaW4tPmxlbiAmJiAhbWFjcm9fYWx0ZXJuYXRlICYmIGluLT5wdHJbc2Nhbl0gPT0gJz0nKQotCXsKLQkgIGlzX2tleXdvcmQgPSAxOwotCi0JICAvKiBJdCdzIE9LIHRvIGdvIGZyb20gcG9zaXRpb25hbCB0byBrZXl3b3JkLiAgKi8KLQotCSAgLyogVGhpcyBpcyBhIGtleXdvcmQgYXJnLCBmZXRjaCB0aGUgZm9ybWFsIG5hbWUgYW5kCi0JICAgICB0aGVuIHRoZSBhY3R1YWwgc3R1ZmYgKi8KLQkgIHNiX3Jlc2V0ICgmdCk7Ci0JICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sICZ0KTsKLQkgIGlmIChpbi0+cHRyW2lkeF0gIT0gJz0nKQotCSAgICByZXR1cm4gXygiY29uZnVzaW9uIGluIGZvcm1hbCBwYXJhbWV0ZXJzIik7Ci0KLQkgIC8qIExvb2t1cCB0aGUgZm9ybWFsIGluIHRoZSBtYWNybydzIGxpc3QgKi8KLQkgIHB0ciA9IChmb3JtYWxfZW50cnkgKikgaGFzaF9maW5kIChtLT5mb3JtYWxfaGFzaCwgc2JfdGVybWluYXRlICgmdCkpOwotCSAgaWYgKCFwdHIpCi0JICAgIHJldHVybiBfKCJtYWNybyBmb3JtYWwgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIEluc2VydCB0aGlzIHZhbHVlIGludG8gdGhlIHJpZ2h0IHBsYWNlICovCi0JICAgICAgc2JfcmVzZXQgKCZwdHItPmFjdHVhbCk7Ci0JICAgICAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCArIDEsIGluLCAmcHRyLT5hY3R1YWwsIDAsIDApOwotCSAgICAgIGlmIChwdHItPmFjdHVhbC5sZW4gPiAwKQotCQkrK25hcmc7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogVGhpcyBpcyBhIHBvc2l0aW9uYWwgYXJnICovCi0JICBpc19wb3NpdGlvbmFsID0gMTsKLQkgIGlmIChpc19rZXl3b3JkKQotCSAgICByZXR1cm4gXygiY2FuJ3QgbWl4IHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIik7Ci0KLQkgIGlmICghZikKLQkgICAgewotCSAgICAgIGZvcm1hbF9lbnRyeSAqKnBmOwotCSAgICAgIGludCBjOwotCi0JICAgICAgaWYgKCFtYWNyb19tcmkpCi0JCXJldHVybiBfKCJ0b28gbWFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyIpOwotCi0JICAgICAgZiA9IChmb3JtYWxfZW50cnkgKikgeG1hbGxvYyAoc2l6ZW9mIChmb3JtYWxfZW50cnkpKTsKLQkgICAgICBzYl9uZXcgKCZmLT5uYW1lKTsKLQkgICAgICBzYl9uZXcgKCZmLT5kZWYpOwotCSAgICAgIHNiX25ldyAoJmYtPmFjdHVhbCk7Ci0JICAgICAgZi0+bmV4dCA9IE5VTEw7Ci0KLQkgICAgICBjID0gLTE7Ci0JICAgICAgZm9yIChwZiA9ICZtLT5mb3JtYWxzOyAqcGYgIT0gTlVMTDsgcGYgPSAmKCpwZiktPm5leHQpCi0JCWlmICgoKnBmKS0+aW5kZXggPj0gYykKLQkJICBjID0gKCpwZiktPmluZGV4ICsgMTsKLQkgICAgICBpZiAoYyA9PSAtMSkKLQkJYyA9IDA7Ci0JICAgICAgKnBmID0gZjsKLQkgICAgICBmLT5pbmRleCA9IGM7Ci0JICAgIH0KLQotCSAgc2JfcmVzZXQgKCZmLT5hY3R1YWwpOwotCSAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sICZmLT5hY3R1YWwsIDEsIDApOwotCSAgaWYgKGYtPmFjdHVhbC5sZW4gPiAwKQotCSAgICArK25hcmc7Ci0JICBkbwotCSAgICB7Ci0JICAgICAgZiA9IGYtPm5leHQ7Ci0JICAgIH0KLQkgIHdoaWxlIChmICE9IE5VTEwgJiYgZi0+aW5kZXggPCAwKTsKLQl9Ci0KLSAgICAgIGlmICghIG1hY3JvX21yaSkKLQlpZHggPSBzYl9za2lwX2NvbW1hIChpZHgsIGluKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoaW4tPnB0cltpZHhdID09ICcsJykKLQkgICAgKytpZHg7Ci0JICBpZiAoSVNXSElURSAoaW4tPnB0cltpZHhdKSkKLQkgICAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAobWFjcm9fbXJpKQotICAgIHsKLSAgICAgIGNoYXIgYnVmZmVyWzIwXTsKLQotICAgICAgc2JfcmVzZXQgKCZ0KTsKLSAgICAgIHNiX2FkZF9zdHJpbmcgKCZ0LCBtYWNyb19zdHJpcF9hdCA/ICIkTkFSRyIgOiAiTkFSRyIpOwotICAgICAgcHRyID0gKGZvcm1hbF9lbnRyeSAqKSBoYXNoX2ZpbmQgKG0tPmZvcm1hbF9oYXNoLCBzYl90ZXJtaW5hdGUgKCZ0KSk7Ci0gICAgICBzYl9yZXNldCAoJnB0ci0+YWN0dWFsKTsKLSAgICAgIHNwcmludGYgKGJ1ZmZlciwgIiVkIiwgbmFyZyk7Ci0gICAgICBzYl9hZGRfc3RyaW5nICgmcHRyLT5hY3R1YWwsIGJ1ZmZlcik7Ci0gICAgfQotCi0gIGVyciA9IG1hY3JvX2V4cGFuZF9ib2R5ICgmbS0+c3ViLCBvdXQsIG0tPmZvcm1hbHMsIG0tPmZvcm1hbF9oYXNoLAotCQkJICAgY29tbWVudF9jaGFyLCAxKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIHJldHVybiBlcnI7Ci0KLSAgLyogRGlzY2FyZCBhbnkgdW5uYW1lZCBmb3JtYWwgYXJndW1lbnRzLiAgKi8KLSAgaWYgKG1hY3JvX21yaSkKLSAgICB7Ci0gICAgICBmb3JtYWxfZW50cnkgKipwZjsKLQotICAgICAgcGYgPSAmbS0+Zm9ybWFsczsKLSAgICAgIHdoaWxlICgqcGYgIT0gTlVMTCkKLQl7Ci0JICBpZiAoKCpwZiktPm5hbWUubGVuICE9IDApCi0JICAgIHBmID0gJigqcGYpLT5uZXh0OwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2Jfa2lsbCAoJigqcGYpLT5uYW1lKTsKLQkgICAgICBzYl9raWxsICgmKCpwZiktPmRlZik7Ci0JICAgICAgc2Jfa2lsbCAoJigqcGYpLT5hY3R1YWwpOwotCSAgICAgIGYgPSAoKnBmKS0+bmV4dDsKLQkgICAgICBmcmVlICgqcGYpOwotCSAgICAgICpwZiA9IGY7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIHNiX2tpbGwgKCZ0KTsKLSAgbWFjcm9fbnVtYmVyKys7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIENoZWNrIGZvciBhIG1hY3JvLiAgSWYgb25lIGlzIGZvdW5kLCBwdXQgdGhlIGV4cGFuc2lvbiBpbnRvCi0gICAqRVhQQU5ELiAgQ09NTUVOVF9DSEFSIGlzIHRoZSBjb21tZW50IGNoYXJhY3Rlci0tdGhpcyBpcyB1c2VkIGJ5Ci0gICBnYXNwLiAgUmV0dXJuIDEgaWYgYSBtYWNybyBpcyBmb3VuZCwgMCBvdGhlcndpc2UuICAqLwotCi1pbnQKLWNoZWNrX21hY3JvIChsaW5lLCBleHBhbmQsIGNvbW1lbnRfY2hhciwgZXJyb3IpCi0gICAgIGNvbnN0IGNoYXIgKmxpbmU7Ci0gICAgIHNiICpleHBhbmQ7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJvcjsKLXsKLSAgY29uc3QgY2hhciAqczsKLSAgY2hhciAqY29weSwgKmNzOwotICBtYWNyb19lbnRyeSAqbWFjcm87Ci0gIHNiIGxpbmVfc2I7Ci0KLSAgaWYgKCEgaXNhbHBoYSAoKHVuc2lnbmVkIGNoYXIpICpsaW5lKQotICAgICAgJiYgKmxpbmUgIT0gJ18nCi0gICAgICAmJiAqbGluZSAhPSAnJCcKLSAgICAgICYmICghIG1hY3JvX21yaSB8fCAqbGluZSAhPSAnLicpKQotICAgIHJldHVybiAwOwotCi0gIHMgPSBsaW5lICsgMTsKLSAgd2hpbGUgKGlzYWxudW0gKCh1bnNpZ25lZCBjaGFyKSAqcykKLQkgfHwgKnMgPT0gJ18nCi0JIHx8ICpzID09ICckJykKLSAgICArK3M7Ci0KLSAgY29weSA9IChjaGFyICopIGFsbG9jYSAocyAtIGxpbmUgKyAxKTsKLSAgbWVtY3B5IChjb3B5LCBsaW5lLCBzIC0gbGluZSk7Ci0gIGNvcHlbcyAtIGxpbmVdID0gJ1wwJzsKLSAgZm9yIChjcyA9IGNvcHk7ICpjcyAhPSAnXDAnOyBjcysrKQotICAgIGlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKmNzKSkKLSAgICAgICpjcyA9IHRvbG93ZXIgKCpjcyk7Ci0KLSAgbWFjcm8gPSAobWFjcm9fZW50cnkgKikgaGFzaF9maW5kIChtYWNyb19oYXNoLCBjb3B5KTsKLQotICBpZiAobWFjcm8gPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBXcmFwIHRoZSBsaW5lIHVwIGluIGFuIHNiLiAgKi8KLSAgc2JfbmV3ICgmbGluZV9zYik7Ci0gIHdoaWxlICgqcyAhPSAnXDAnICYmICpzICE9ICdcbicgJiYgKnMgIT0gJ1xyJykKLSAgICBzYl9hZGRfY2hhciAoJmxpbmVfc2IsICpzKyspOwotCi0gIHNiX25ldyAoZXhwYW5kKTsKLSAgKmVycm9yID0gbWFjcm9fZXhwYW5kICgwLCAmbGluZV9zYiwgbWFjcm8sIGV4cGFuZCwgY29tbWVudF9jaGFyKTsKLQotICBzYl9raWxsICgmbGluZV9zYik7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlbGV0ZSBhIG1hY3JvLiAgKi8KLQotdm9pZAotZGVsZXRlX21hY3JvIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBoYXNoX2RlbGV0ZSAobWFjcm9faGFzaCwgbmFtZSk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIElSUCBhbmQgSVJQQyBwc2V1ZG8tb3BzLiAgVGhlc2UgYXJlIGhhbmRsZWQgYXMgYQotICAgY29tYmluZWQgbWFjcm8gZGVmaW5pdGlvbiBhbmQgZXhlY3V0aW9uLiAgVGhpcyByZXR1cm5zIE5VTEwgb24KLSAgIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLiAgKi8KLQotY29uc3QgY2hhciAqCi1leHBhbmRfaXJwIChpcnBjLCBpZHgsIGluLCBvdXQsIGdldF9saW5lLCBjb21tZW50X2NoYXIpCi0gICAgIGludCBpcnBjOwotICAgICBpbnQgaWR4OwotICAgICBzYiAqaW47Ci0gICAgIHNiICpvdXQ7Ci0gICAgIGludCAoKmdldF9saW5lKSBQQVJBTVMgKChzYiAqKSk7Ci0gICAgIGludCBjb21tZW50X2NoYXI7Ci17Ci0gIGNvbnN0IGNoYXIgKm1uOwotICBzYiBzdWI7Ci0gIGZvcm1hbF9lbnRyeSBmOwotICBzdHJ1Y3QgaGFzaF9jb250cm9sICpoOwotICBjb25zdCBjaGFyICplcnI7Ci0KLSAgaWYgKGlycGMpCi0gICAgbW4gPSAiSVJQQyI7Ci0gIGVsc2UKLSAgICBtbiA9ICJJUlAiOwotCi0gIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCi0gIHNiX25ldyAoJnN1Yik7Ci0gIGlmICghIGJ1ZmZlcl9hbmRfbmVzdCAobW4sICJFTkRSIiwgJnN1YiwgZ2V0X2xpbmUpKQotICAgIHJldHVybiBfKCJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGlycCBvciBpcnBjIik7Ci0gIAotICBzYl9uZXcgKCZmLm5hbWUpOwotICBzYl9uZXcgKCZmLmRlZik7Ci0gIHNiX25ldyAoJmYuYWN0dWFsKTsKLQotICBpZHggPSBnZXRfdG9rZW4gKGlkeCwgaW4sICZmLm5hbWUpOwotICBpZiAoZi5uYW1lLmxlbiA9PSAwKQotICAgIHJldHVybiBfKCJtaXNzaW5nIG1vZGVsIHBhcmFtZXRlciIpOwotCi0gIGggPSBoYXNoX25ldyAoKTsKLSAgZXJyID0gaGFzaF9qYW0gKGgsIHNiX3Rlcm1pbmF0ZSAoJmYubmFtZSksICZmKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIHJldHVybiBlcnI7Ci0KLSAgZi5pbmRleCA9IDE7Ci0gIGYubmV4dCA9IE5VTEw7Ci0KLSAgc2JfcmVzZXQgKG91dCk7Ci0KLSAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0gIGlmIChpZHggPj0gaW4tPmxlbiB8fCBpbi0+cHRyW2lkeF0gPT0gY29tbWVudF9jaGFyKQotICAgIHsKLSAgICAgIC8qIEV4cGFuZCBvbmNlIHdpdGggYSBudWxsIHN0cmluZy4gICovCi0gICAgICBlcnIgPSBtYWNyb19leHBhbmRfYm9keSAoJnN1Yiwgb3V0LCAmZiwgaCwgY29tbWVudF9jaGFyLCAwKTsKLSAgICAgIGlmIChlcnIgIT0gTlVMTCkKLQlyZXR1cm4gZXJyOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChpcnBjICYmIGluLT5wdHJbaWR4XSA9PSAnIicpCi0JKytpZHg7Ci0gICAgICB3aGlsZSAoaWR4IDwgaW4tPmxlbiAmJiBpbi0+cHRyW2lkeF0gIT0gY29tbWVudF9jaGFyKQotCXsKLQkgIGlmICghaXJwYykKLQkgICAgaWR4ID0gZ2V0X2FueV9zdHJpbmcgKGlkeCwgaW4sICZmLmFjdHVhbCwgMSwgMCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaW4tPnB0cltpZHhdID09ICciJykKLQkJewotCQkgIGludCBueHQ7Ci0KLQkJICBueHQgPSBzYl9za2lwX3doaXRlIChpZHggKyAxLCBpbik7Ci0JCSAgaWYgKG54dCA+PSBpbi0+bGVuIHx8IGluLT5wdHJbbnh0XSA9PSBjb21tZW50X2NoYXIpCi0JCSAgICB7Ci0JCSAgICAgIGlkeCA9IG54dDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBzYl9yZXNldCAoJmYuYWN0dWFsKTsKLQkgICAgICBzYl9hZGRfY2hhciAoJmYuYWN0dWFsLCBpbi0+cHRyW2lkeF0pOwotCSAgICAgICsraWR4OwotCSAgICB9Ci0JICBlcnIgPSBtYWNyb19leHBhbmRfYm9keSAoJnN1Yiwgb3V0LCAmZiwgaCwgY29tbWVudF9jaGFyLCAwKTsKLQkgIGlmIChlcnIgIT0gTlVMTCkKLQkgICAgcmV0dXJuIGVycjsKLQkgIGlmICghaXJwYykKLQkgICAgaWR4ID0gc2Jfc2tpcF9jb21tYSAoaWR4LCBpbik7Ci0JICBlbHNlCi0JICAgIGlkeCA9IHNiX3NraXBfd2hpdGUgKGlkeCwgaW4pOwotCX0KLSAgICB9Ci0KLSAgaGFzaF9kaWUgKGgpOwotICBzYl9raWxsICgmc3ViKTsKLQotICByZXR1cm4gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9tYWNyby5oIGIvZ2FzL21hY3JvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZWVhNGEuLjAwMDAwMDAKLS0tIGEvZ2FzL21hY3JvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBtYWNyby5oIC0gaGVhZGVyIGZpbGUgZm9yIG1hY3JvIHN1cHBvcnQgZm9yIGdhcyBhbmQgZ2FzcAotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaWZuZGVmIE1BQ1JPX0gKLQotI2RlZmluZSBNQUNST19ICi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgInNiLmgiCi0KLS8qIFdoZXRoZXIgYW55IG1hY3JvcyBoYXZlIGJlZW4gZGVmaW5lZC4gICovCi0KLWV4dGVybiBpbnQgbWFjcm9fZGVmaW5lZDsKLQotLyogVGhlIG1hY3JvIG5lc3RpbmcgbGV2ZWwuICAqLwotCi1leHRlcm4gaW50IG1hY3JvX25lc3Q7Ci0KLWV4dGVybiBpbnQgYnVmZmVyX2FuZF9uZXN0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBzYiAqLCBpbnQgKCopIFBBUkFNUyAoKHNiICopKSkpOwotZXh0ZXJuIHZvaWQgbWFjcm9faW5pdAotICBQQVJBTVMgKChpbnQgYWx0ZXJuYXRlLCBpbnQgbXJpLCBpbnQgc3RyaXBfYXQsCi0JICAgaW50ICgqKSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCwgc2IgKiwgaW50ICopKSkpOwotZXh0ZXJuIHZvaWQgbWFjcm9fbXJpX21vZGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gY29uc3QgY2hhciAqZGVmaW5lX21hY3JvCi0gIFBBUkFNUyAoKGludCBpZHgsIHNiICppbiwgc2IgKmxhYmVsLCBpbnQgKCpnZXRfbGluZSkgUEFSQU1TICgoc2IgKikpLAotCSAgIGNvbnN0IGNoYXIgKipuYW1lcCkpOwotZXh0ZXJuIGludCBjaGVja19tYWNybyBQQVJBTVMgKChjb25zdCBjaGFyICosIHNiICosIGludCwgY29uc3QgY2hhciAqKikpOwotZXh0ZXJuIHZvaWQgZGVsZXRlX21hY3JvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmV4cGFuZF9pcnAKLSAgUEFSQU1TICgoaW50LCBpbnQsIHNiICosIHNiICosIGludCAoKikgUEFSQU1TICgoc2IgKikpLCBpbnQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9nYXMvbWFrZWZpbGUudm1zIGIvZ2FzL21ha2VmaWxlLnZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRjMzBkNC4uMDAwMDAwMAotLS0gYS9nYXMvbWFrZWZpbGUudm1zCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSMKLSMgbWFrZWZpbGUgZm9yIGdhcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBwcm9naXMuZGUKLSMKLUNDPWdjYwotaWZlcSAoJChBUkNIKSxBTFBIQSkKLWlmZXEgKCQoQ0MpLGdjYykKLURFRlM9Ci1DRkxBR1M9L2luY2x1ZGU9KFtdLFstLmJmZF0sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpCi1MRkxBR1M9Ci1MSUJTPSxHTlVfQ0NfTElCUkFSWTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsR05VX0NDX0xJQlJBUlk6Y3J0MC5vYmoKLWVsc2UKLURFRlM9L2RlZmluZT0oInRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iPSJ0YWJzaXpfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iLFwKLSJfYmZkX2dlbmVyaWNfZ2V0X3NlY3Rpb25fY29udGVudHNfaW5fd2luZG93Ij0iX2JmZF9nZW5lcmljX2dldF93aW5fc2VjdGlvbl9jb250IixcCi0iX2VsZl9zZWN0aW9uX2Zyb21fYmZkX3NlY3Rpb24iPSJfYmZkX2VsZl9zZWNfZnJvbV9iZmRfc2VjIiwiY29uc3Q9IikKLUNGTEFHUz0vbm9vcHQvbm9kZWJ1Zy9pbmNsdWRlPShbXSxbLS5iZmRdLFsuY29uZmlnXSxbLS5pbmNsdWRlXSxbLV0pJChERUZTKVwKLS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYyxwdHJtaXNtYXRjaCx1bmRlZmVzY2FwLGxvbmdleHRlcm4sZHVwdHlwZXNwZWMpCi1MRkxBR1M9Ci1MSUJTPSxzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbmRpZgotCi1lbHNlCSMgQVJDSCBub3QgQUxQSEEKLQotaWZlcSAoJChDQyksZ2NjKQotREVGUz0KLUNGTEFHUz0vaW5jbHVkZT0oW10sWy5jb25maWddLFstLmluY2x1ZGVdLFstXSkkKERFRlMpCi1MRkxBR1M9Ci1MSUJTPSxHTlVfQ0NfTElCUkFSWTpsaWJnY2MvbGliLHN5cyQkbGlicmFyeTp2YXhjcnRsLm9sYi9saWIsR05VX0NDX0xJQlJBUlk6Y3J0YmVnaW4ub2JqLEdOVV9DQ19MSUJSQVJZOmNydGVuZC5vYmoKLSNMSUJTPSxnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL2xpYixzeXMkJGxpYnJhcnk6dmF4Y3J0bC5vbGIvbGliCi1lbHNlCi1lcnJvciBERUNDIGlzIGJyb2tlbiBvbiBWQVgKLURFRlM9L2RlZmluZT0oInRhYmxlX3NpemVfb2ZfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iPSJ0YWJzaXpfZmxvbnVtX3Bvd2Vyc19vZl90ZW4iLCJjb25zdD0iKQotQ0ZMQUdTPS9ub29wdC9kZWJ1Zy9pbmNsdWRlPShbXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy1dKSQoREVGUylcCi0vd2FybmluZ3M9ZGlzYWJsZT0obWlzc2luZ3JldHVybixpbXBsaWNpdGZ1bmMscHRybWlzbWF0Y2gsdW5kZWZlc2NhcCxsb25nZXh0ZXJuLGR1cHR5cGVzcGVjKQotTEZMQUdTPQotTElCUz0sc3lzJCRsaWJyYXJ5OnZheGNydGwub2xiL2xpYgotZW5kaWYKLWVuZGlmCi0KLQotT0JKUz10YXJnLWNwdS5vYmosb2JqLWZvcm1hdC5vYmosYXRvZi10YXJnLm9iaixhcHAub2JqLGFzLm9iaixhdG9mLWdlbmVyaWMub2JqLFwKLSAgYmlnbnVtLWNvcHkub2JqLGNvbmQub2JqLGRlcGVuZC5vYmosZXhwci5vYmosZmxvbnVtLWtvbnN0Lm9iaixmbG9udW0tY29weS5vYmosXAotICBmbG9udW0tbXVsdC5vYmosZnJhZ3Mub2JqLGhhc2gub2JqLGlucHV0LWZpbGUub2JqLGlucHV0LXNjcnViLm9iaixcCi0gIGxpdGVyYWwub2JqLG1lc3NhZ2VzLm9iaixvdXRwdXQtZmlsZS5vYmoscmVhZC5vYmosc3Vic2Vncy5vYmosc3ltYm9scy5vYmosXAotICB3cml0ZS5vYmosbGlzdGluZy5vYmosZWNvZmYub2JqLHN0YWJzLm9iaixzYi5vYmosbWFjcm8ub2JqLGVob3B0Lm9iagotCi1HQVNQT0JKUyA9IGdhc3Aub2JqLG1hY3JvLm9iaixzYi5vYmosaGFzaC5vYmoKLQotTElCSUJFUlRZID0gWy0ubGliaWJlcnR5XWxpYmliZXJ0eS5vbGIKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLUxJQkJGRCA9IFstLmJmZF1saWJiZmQub2xiCi1MSUJPUENPREVTID0gWy0ub3Bjb2Rlc11saWJvcGNvZGVzLm9sYgotQkZEREVQID0gWy0uYmZkXWJmZC5oCi1lbHNlCi1MSUJCRkQgPQotTElCT1BDT0RFUyA9Ci1CRkRERVAgPQotZW5kaWYKLQotYWxsOiBjb25maWcuc3RhdHVzICQoQkZEREVQKSBhcy5leGUgZ2FzcC5leGUKLQotYXMuZXhlOiAkKE9CSlMpICQoTElCT1BDT0RFUykgJChMSUJCRkQpICQoTElCSUJFUlRZKQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLQlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKE9CSlMpLCQoTElCT1BDT0RFUykvbGliLCQoTElCQkZEKS9saWIsJChMSUJJQkVSVFkpL2xpYiQoTElCUykKLWVsc2UKLQlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKE9CSlMpLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCi1lbmRpZgotCi1nYXNwLmV4ZTogJChHQVNQT0JKUykgJChMSUJCRkQpICQoTElCSUJFUlRZKQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLQlsaW5rJChMRkxBR1MpL2V4ZT0kQCAkKEdBU1BPQkpTKSwkKExJQkJGRCkvbGliLCQoTElCSUJFUlRZKS9saWIkKExJQlMpCi1lbHNlCi0JbGluayQoTEZMQUdTKS9leGU9JEAgJChHQVNQT0JKUyksJChMSUJJQkVSVFkpL2xpYiQoTElCUykKLWVuZGlmCi0KLWNvbmZpZy5zdGF0dXM6Ci0JJCQgQGNvbmZpZy1nYXMKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLUNQVT1hbHBoYQotT0JKRk9STUFUPWV2YXgKLUZMVEZPUk1BVD1pZWVlCi1lbHNlCi1DUFU9dmF4Ci1PQkpGT1JNQVQ9dm1zCi1GTFRGT1JNQVQ9dmF4Ci1lbmRpZgotCi10YXJnLWNwdS5jOiBbLmNvbmZpZ110Yy0kKENQVSkuYwotCWNvcHkgJDwgJEAKLXRhcmctY3B1Lmg6IFsuY29uZmlnXXRjLSQoQ1BVKS5oCi0JY29weSAkPCAkQAotdGFyZy1lbnYuaDogWy5jb25maWdddGUtZ2VuZXJpYy5oCi0JY29weSAkPCAkQAotb2JqLWZvcm1hdC5oOiBbLmNvbmZpZ11vYmotJChPQkpGT1JNQVQpLmgKLQljb3B5ICQ8ICRACi1vYmotZm9ybWF0LmM6IFsuY29uZmlnXW9iai0kKE9CSkZPUk1BVCkuYwotCWNvcHkgJDwgJEAKLWF0b2YtdGFyZy5jOiBbLmNvbmZpZ11hdG9mLSQoRkxURk9STUFUKS5jCi0JY29weSAkPCAkQAotCi10YXJnLWNwdS5vYmo6IHRhcmctY3B1LmMgdGFyZy1jcHUuaCBbLmNvbmZpZ11hdG9mLXZheC5jCi0KLVstLmJmZF1iZmQuaDoKLQkkKENEKSBbLS5iZmRdCi0JZ21ha2UgLWYgbWFrZWZpbGUudm1zICJDQz0kKENDKSIKLQkkKENEKSBbLS5nYXNdCi0KLWluc3RhbGw6IGFzLmV4ZSBnYXNwLmV4ZQotCSQoQ1ApICReIEdOVV9ST09UXDpbQklOXQotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pICoub2JqOwotCSQoUk0pICouZXhlOwotCSQoUk0pIGF0b2YtdGFyZy5jOwotCSQoUk0pIG9iai1mb3JtYXQuYzsKLQkkKFJNKSBvYmotZm9ybWF0Lmg7Ci0JJChSTSkgdGFyZy1lbnYuaDsKLQkkKFJNKSB0YXJnLWNwdS5oOwotCSQoUk0pIHRhcmctY3B1LmM7Ci0JJChSTSkgY29uZmlnLnN0YXR1czsKZGlmZiAtLWdpdCBhL2dhcy9tZXNzYWdlcy5jIGIvZ2FzL21lc3NhZ2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YjdhZDAuLjAwMDAwMDAKLS0tIGEvZ2FzL21lc3NhZ2VzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDEgKzAsMCBAQAotLyogbWVzc2FnZXMuYyAtIGVycm9yIHJlcG9ydGVyIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9FUlJOT19ICi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX1NUREFSRwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBVU0VfVkFSQVJHUwotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgKFVTRV9TVERBUkcpICYmICFkZWZpbmVkIChVU0VfVkFSQVJHUykKLS8qIFJvbGwgb3VyIG93bi4gICovCi0jZGVmaW5lIHZhX2FsaXN0IFJFU1QKLSNkZWZpbmUgdmFfZGNsCi10eXBlZGVmIGludCAqIHZhX2xpc3Q7Ci0jZGVmaW5lIHZhX3N0YXJ0KEFSR1MpCUFSR1MgPSAmUkVTVAotI2RlZmluZSB2YV9lbmQoQVJHUykKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBpZGVudGlmeSBQQVJBTVMgKChjaGFyICopKTsKLXN0YXRpYyB2b2lkIGFzX3Nob3dfd2hlcmUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgYXNfd2Fybl9pbnRlcm5hbCBQQVJBTVMgKChjaGFyICosIHVuc2lnbmVkIGludCwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBhc19iYWRfaW50ZXJuYWwgUEFSQU1TICgoY2hhciAqLCB1bnNpZ25lZCBpbnQsIGNoYXIgKikpOwotCi0vKgotICogRGVzcGl0ZSB0aGUgcmVzdCBvZiB0aGUgY29tbWVudHMgaW4gdGhpcyBmaWxlLCAoRklYTUUtU09PTiksCi0gKiBoZXJlIGlzIHRoZSBjdXJyZW50IHNjaGVtZSBmb3IgZXJyb3IgbWVzc2FnZXMgZXRjOgotICoKLSAqIGFzX2ZhdGFsKCkgaXMgdXNlZCB3aGVuIGdhcyBpcyBxdWl0ZSBjb25mdXNlZCBhbmQKLSAqIGNvbnRpbnVpbmcgdGhlIGFzc2VtYmx5IGlzIHBvaW50bGVzcy4gIEluIHRoaXMgY2FzZSB3ZQotICogZXhpdCBpbW1lZGlhdGVseSB3aXRoIGVycm9yIHN0YXR1cy4KLSAqCi0gKiBhc19iYWQoKSBpcyB1c2VkIHRvIG1hcmsgZXJyb3JzIHRoYXQgcmVzdWx0IGluIHdoYXQgd2UKLSAqIHByZXN1bWUgdG8gYmUgYSB1c2VsZXNzIG9iamVjdCBmaWxlLiAgU2F5LCB3ZSBpZ25vcmVkCi0gKiBzb21ldGhpbmcgdGhhdCBtaWdodCBoYXZlIGJlZW4gdml0YWwuICBJZiB3ZSBzZWUgYW55IG9mCi0gKiB0aGVzZSwgYXNzZW1ibHkgd2lsbCBjb250aW51ZSB0byB0aGUgZW5kIG9mIHRoZSBzb3VyY2UsCi0gKiBubyBvYmplY3QgZmlsZSB3aWxsIGJlIHByb2R1Y2VkLCBhbmQgd2Ugd2lsbCB0ZXJtaW5hdGUKLSAqIHdpdGggZXJyb3Igc3RhdHVzLiAgVGhlIG5ldyBvcHRpb24sIC1aLCB0ZWxscyB1cyB0bwotICogcHJvZHVjZSBhbiBvYmplY3QgZmlsZSBhbnl3YXkgYnV0IHdlIHN0aWxsIGV4aXQgd2l0aAotICogZXJyb3Igc3RhdHVzLiAgVGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHlvdSBkb24ndCB3YW50Ci0gKiB0aGlzIG9iamVjdCBmaWxlIGJ1dCB3ZSBjb3VsZCBiZSB3cm9uZy4KLSAqCi0gKiBhc193YXJuKCkgaXMgdXNlZCB3aGVuIHdlIGhhdmUgYW4gZXJyb3IgZnJvbSB3aGljaCB3ZQotICogaGF2ZSBhIHBsYXVzaWJsZSBlcnJvciByZWNvdmVyeS4gIGVnLCBtYXNraW5nIHRoZSB0b3AKLSAqIGJpdHMgb2YgYSBjb25zdGFudCB0aGF0IGlzIGxvbmdlciB0aGFuIHdpbGwgZml0IGluIHRoZQotICogZGVzdGluYXRpb24uICBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCBjb250aW51ZSB0byBhc3NlbWJsZQotICogdGhlIHNvdXJjZSwgYWx0aG91Z2ggd2UgbWF5IGhhdmUgbWFkZSBhIGJhZCBhc3N1bXB0aW9uLAotICogYW5kIHdlIHdpbGwgcHJvZHVjZSBhbiBvYmplY3QgZmlsZSBhbmQgcmV0dXJuIG5vcm1hbCBleGl0Ci0gKiBzdGF0dXMgKGllLCBubyBlcnJvcikuICBUaGUgbmV3IG9wdGlvbiAtWCB0ZWxscyB1cyB0bwotICogdHJlYXQgYWxsIGFzX3dhcm4oKSBlcnJvcnMgYXMgYXNfYmFkKCkgZXJyb3JzLiAgVGhhdCBpcywKLSAqIG5vIG9iamVjdCBmaWxlIHdpbGwgYmUgcHJvZHVjZWQgYW5kIHdlIHdpbGwgZXhpdCB3aXRoCi0gKiBlcnJvciBzdGF0dXMuICBUaGUgaWRlYSBoZXJlIGlzIHRoYXQgd2UgZG9uJ3Qga2lsbCBhbgotICogZW50aXJlIG1ha2UgYmVjYXVzZSBvZiBhbiBlcnJvciB0aGF0IHdlIGtuZXcgaG93IHRvCi0gKiBjb3JyZWN0LiAgT24gdGhlIG90aGVyIGhhbmQsIHNvbWV0aW1lcyB5b3UgbWlnaHQgd2FudCB0bwotICogc3RvcCB0aGUgbWFrZSBhdCB0aGVzZSBwb2ludHMuCi0gKgotICogYXNfdHNrdHNrKCkgaXMgdXNlZCB3aGVuIHdlIHNlZSBhIG1pbm9yIGVycm9yIGZvciB3aGljaAotICogb3VyIGVycm9yIHJlY292ZXJ5IGFjdGlvbiBpcyBhbG1vc3QgY2VydGFpbmx5IGNvcnJlY3QuCi0gKiBJbiB0aGlzIGNhc2UsIHdlIHByaW50IGEgbWVzc2FnZSBhbmQgdGhlbiBhc3NlbWJseQotICogY29udGludWVzIGFzIHRob3VnaCBubyBlcnJvciBvY2N1cnJlZC4KLSAqLwotCi1zdGF0aWMgdm9pZAotaWRlbnRpZnkgKGZpbGUpCi0gICAgIGNoYXIgKmZpbGU7Ci17Ci0gIHN0YXRpYyBpbnQgaWRlbnRpZmllZDsKLSAgaWYgKGlkZW50aWZpZWQpCi0gICAgcmV0dXJuOwotICBpZGVudGlmaWVkKys7Ci0KLSAgaWYgKCFmaWxlKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCB4OwotICAgICAgYXNfd2hlcmUgKCZmaWxlLCAmeCk7Ci0gICAgfQotCi0gIGlmIChmaWxlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAiLCBmaWxlKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJBc3NlbWJsZXIgbWVzc2FnZXM6XG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQgd2FybmluZ19jb3VudDsJLyogQ291bnQgb2YgbnVtYmVyIG9mIHdhcm5pbmdzIGlzc3VlZCAqLwotCi1pbnQgCi1oYWRfd2FybmluZ3MgKCkKLXsKLSAgcmV0dXJuICh3YXJuaW5nX2NvdW50KTsKLX0KLQotLyogTm9uemVybyBpZiB3ZSd2ZSBoaXQgYSAnYmFkIGVycm9yJywgYW5kIHNob3VsZCBub3Qgd3JpdGUgYW4gb2JqIGZpbGUsCi0gICBhbmQgZXhpdCB3aXRoIGEgbm9uemVybyBlcnJvciBjb2RlICovCi0KLXN0YXRpYyBpbnQgZXJyb3JfY291bnQ7Ci0KLWludCAKLWhhZF9lcnJvcnMgKCkKLXsKLSAgcmV0dXJuIChlcnJvcl9jb3VudCk7Ci19Ci0KLQotLyogUHJpbnQgdGhlIGN1cnJlbnQgbG9jYXRpb24gdG8gc3RkZXJyLiAgKi8KLQotc3RhdGljIHZvaWQKLWFzX3Nob3dfd2hlcmUgKCkKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0gIGlkZW50aWZ5IChmaWxlKTsKLSAgaWYgKGZpbGUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXU6ICIsIGZpbGUsIGxpbmUpOwotfQotCi0vKgotICoJCQlhIHMgXyBwIGUgciByIG8gcgotICoKLSAqIExpa2UgcGVycm9yKDMpLCBidXQgd2l0aCBtb3JlIGluZm8uCi0gKi8KLQotdm9pZCAKLWFzX3BlcnJvciAoZ3JpcGUsIGZpbGVuYW1lKQotICAgICBjb25zdCBjaGFyICpncmlwZTsJCS8qIFVucHVuY3R1YXRlZCBlcnJvciB0aGVtZS4gKi8KLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycnR4dDsKLQotICBhc19zaG93X3doZXJlICgpOwotICBmcHJpbnRmIChzdGRlcnIsIGdyaXBlLCBmaWxlbmFtZSk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBlcnJ0eHQgPSBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKTsKLSNlbHNlCi0gIGVycnR4dCA9IHhzdHJlcnJvciAoZXJybm8pOwotI2VuZGlmCi0gIGZwcmludGYgKHN0ZGVyciwgIjogJXNcbiIsIGVycnR4dCk7Ci0gIGVycm5vID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0jZW5kaWYKLX0KLQotLyoKLSAqCQkJYSBzIF8gdCBzIGsgdCBzIGsgKCkKLSAqCi0gKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIHdhcm5pbmcsIGFuZCBsb2NhdGUgd2FybmluZwotICogaW4gaW5wdXQgZmlsZShzKS4KLSAqIFBsZWFzZSBvbmx5IHVzZSB0aGlzIGZvciB3aGVuIHdlIGhhdmUgc29tZSByZWNvdmVyeSBhY3Rpb24uCi0gKiBQbGVhc2UgZXhwbGFpbiBpbiBzdHJpbmcgKHdoaWNoIG1heSBoYXZlICdcbidzKSB3aGF0IHJlY292ZXJ5IHdhcyBkb25lLgotICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfdHNrdHNrIChjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotfQkJCQkvKiBhc190c2t0c2soKSAqLwotI2Vsc2UKLXZvaWQgCi1hc190c2t0c2sgKGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLQotICBhc19zaG93X3doZXJlICgpOwotICB2YV9zdGFydCAoYXJncyk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotfQkJCQkvKiBhc190c2t0c2soKSAqLwotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyogVGhlIGNvbW1vbiBwb3J0aW9uIG9mIGFzX3dhcm4gYW5kIGFzX3dhcm5fd2hlcmUuICAqLwotCi1zdGF0aWMgdm9pZAotYXNfd2Fybl9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKQotICAgICBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgICAgY2hhciAqYnVmZmVyOwotewotICArK3dhcm5pbmdfY291bnQ7Ci0KLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICBhc193aGVyZSAoJmZpbGUsICZsaW5lKTsKLQotICBpZGVudGlmeSAoZmlsZSk7Ci0gIGlmIChmaWxlKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiV1OiAiLCBmaWxlLCBsaW5lKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJXYXJuaW5nOiAiKSk7Ci0gIGZwdXRzIChidWZmZXIsIHN0ZGVycik7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGxpc3Rpbmdfd2FybmluZyAoYnVmZmVyKTsKLSNlbmRpZgotfQotCi0vKgotICoJCQlhIHMgXyB3IGEgciBuICgpCi0gKgotICogU2VuZCB0byBzdGRlcnIgYSBzdHJpbmcgYXMgYSB3YXJuaW5nLCBhbmQgbG9jYXRlIHdhcm5pbmcKLSAqIGluIGlucHV0IGZpbGUocykuCi0gKiBQbGVhc2Ugb25seSB1c2UgdGhpcyBmb3Igd2hlbiB3ZSBoYXZlIHNvbWUgcmVjb3ZlcnkgYWN0aW9uLgotICogUGxlYXNlIGV4cGxhaW4gaW4gc3RyaW5nICh3aGljaCBtYXkgaGF2ZSAnXG4ncykgd2hhdCByZWNvdmVyeSB3YXMgZG9uZS4KLSAqLwotCi0jaWZkZWYgVVNFX1NUREFSRwotdm9pZCAKLWFzX3dhcm4gKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICBhc193YXJuX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOwotICAgIH0KLX0JCQkJLyogYXNfd2FybigpICovCi0jZWxzZQotLypWQVJBUkdTMSAqLwotdm9pZCAKLWFzX3dhcm4gKGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgdmFfZGNsCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcmdzKTsKLSAgICAgIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gICAgICB2YV9lbmQgKGFyZ3MpOwotICAgICAgYXNfd2Fybl9pbnRlcm5hbCAoKGNoYXIgKikgTlVMTCwgMCwgYnVmZmVyKTsKLSAgICB9Ci19CQkJCS8qIGFzX3dhcm4oKSAqLwotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyogYXNfd2Fybl93aGVyZSwgbGlrZSBhc19iYWQgYnV0IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGFyZQotICAgcGFzc2VkIGluLiAgVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byByZXBlYXQgdGhlIGZ1bmN0aW9uIGluIG9yZGVyCi0gICB0byBoYW5kbGUgdGhlIHZhcmFyZ3MgY29ycmVjdGx5IGFuZCBwb3J0YWJseS4gICovCi0KLSNpZmRlZiBVU0VfU1REQVJHCi12b2lkIAotYXNfd2Fybl93aGVyZSAoY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgaWYgKCFmbGFnX25vX3dhcm5pbmdzKQotICAgIHsKLSAgICAgIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICAgICAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgICBhc193YXJuX2ludGVybmFsIChmaWxlLCBsaW5lLCBidWZmZXIpOwotICAgIH0KLX0JCQkJLyogYXNfd2FybigpICovCi0jZWxzZQotLypWQVJBUkdTMSAqLwotdm9pZCAKLWFzX3dhcm5fd2hlcmUgKGZpbGUsIGxpbmUsIGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIGlmICghZmxhZ19ub193YXJuaW5ncykKLSAgICB7Ci0gICAgICB2YV9zdGFydCAoYXJncyk7Ci0gICAgICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICAgICAgdmFfZW5kIChhcmdzKTsKLSAgICAgIGFzX3dhcm5faW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7Ci0gICAgfQotfQkJCQkvKiBhc193YXJuKCkgKi8KLSNlbmRpZiAvKiBub3QgTk9fU1REQVJHICovCi0KLS8qIFRoZSBjb21tb24gcG9ydGlvbiBvZiBhc19iYWQgYW5kIGFzX2JhZF93aGVyZS4gICovCi0KLXN0YXRpYyB2b2lkCi1hc19iYWRfaW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcikKLSAgICAgY2hhciAqZmlsZTsKLSAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLXsKLSAgKytlcnJvcl9jb3VudDsKLQotICBpZiAoZmlsZSA9PSBOVUxMKQotICAgIGFzX3doZXJlICgmZmlsZSwgJmxpbmUpOwotCi0gIGlkZW50aWZ5IChmaWxlKTsKLSAgaWYgKGZpbGUpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6JXU6ICIsIGZpbGUsIGxpbmUpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkVycm9yOiAiKSk7Ci0gIGZwdXRzIChidWZmZXIsIHN0ZGVycik7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGxpc3RpbmdfZXJyb3IgKGJ1ZmZlcik7Ci0jZW5kaWYKLX0KLQotLyoKLSAqCQkJYSBzIF8gYiBhIGQgKCkKLSAqCi0gKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIHdhcm5pbmcsIGFuZCBsb2NhdGUgd2FybmluZyBpbiBpbnB1dCBmaWxlKHMpLgotICogUGxlYXNlIHVzIHdoZW4gdGhlcmUgaXMgbm8gcmVjb3ZlcnksIGJ1dCB3ZSB3YW50IHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcKLSAqIGJ1dCBub3QgcHJvZHVjZSBhbiBvYmplY3QgZmlsZS4KLSAqIFBsZWFzZSBleHBsYWluIGluIHN0cmluZyAod2hpY2ggbWF5IGhhdmUgJ1xuJ3MpIHdoYXQgcmVjb3Zlcnkgd2FzIGRvbmUuCi0gKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc19iYWQgKGNvbnN0IGNoYXIgKmZvcm1hdCwuLi4pCi17Ci0gIHZhX2xpc3QgYXJnczsKLSAgY2hhciBidWZmZXJbMjAwMF07Ci0KLSAgdmFfc3RhcnQgKGFyZ3MsIGZvcm1hdCk7Ci0gIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgYXNfYmFkX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOwotfQotCi0jZWxzZQotLypWQVJBUkdTMSAqLwotdm9pZCAKLWFzX2JhZCAoZm9ybWF0LCB2YV9hbGlzdCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9kY2wKLXsKLSAgdmFfbGlzdCBhcmdzOwotICBjaGFyIGJ1ZmZlclsyMDAwXTsKLQotICB2YV9zdGFydCAoYXJncyk7Ci0gIHZzcHJpbnRmIChidWZmZXIsIGZvcm1hdCwgYXJncyk7Ci0gIHZhX2VuZCAoYXJncyk7Ci0KLSAgYXNfYmFkX2ludGVybmFsICgoY2hhciAqKSBOVUxMLCAwLCBidWZmZXIpOwotfQotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyogYXNfYmFkX3doZXJlLCBsaWtlIGFzX2JhZCBidXQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgYXJlCi0gICBwYXNzZWQgaW4uICBVbmZvcnR1bmF0ZWx5LCB3ZSBoYXZlIHRvIHJlcGVhdCB0aGUgZnVuY3Rpb24gaW4gb3JkZXIKLSAgIHRvIGhhbmRsZSB0aGUgdmFyYXJncyBjb3JyZWN0bHkgYW5kIHBvcnRhYmx5LiAgKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc19iYWRfd2hlcmUgKGNoYXIgKmZpbGUsIHVuc2lnbmVkIGludCBsaW5lLCBjb25zdCBjaGFyICpmb3JtYXQsLi4uKQotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICB2c3ByaW50ZiAoYnVmZmVyLCBmb3JtYXQsIGFyZ3MpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIGFzX2JhZF9pbnRlcm5hbCAoZmlsZSwgbGluZSwgYnVmZmVyKTsKLX0KLQotI2Vsc2UKLS8qVkFSQVJHUzEgKi8KLXZvaWQgCi1hc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIGZvcm1hdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKmZpbGU7Ci0gICAgIHVuc2lnbmVkIGludCBsaW5lOwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgYnVmZmVyWzIwMDBdOwotCi0gIHZhX3N0YXJ0IChhcmdzKTsKLSAgdnNwcmludGYgKGJ1ZmZlciwgZm9ybWF0LCBhcmdzKTsKLSAgdmFfZW5kIChhcmdzKTsKLQotICBhc19iYWRfaW50ZXJuYWwgKGZpbGUsIGxpbmUsIGJ1ZmZlcik7Ci19Ci0jZW5kaWYgLyogbm90IE5PX1NUREFSRyAqLwotCi0vKgotICoJCQlhIHMgXyBmIGEgdCBhIGwgKCkKLSAqCi0gKiBTZW5kIHRvIHN0ZGVyciBhIHN0cmluZyBhcyBhIGZhdGFsIG1lc3NhZ2UsIGFuZCBwcmludCBsb2NhdGlvbiBvZiBlcnJvciBpbgotICogaW5wdXQgZmlsZShzKS4KLSAqIFBsZWFzZSBvbmx5IHVzZSB0aGlzIGZvciB3aGVuIHdlIERPTidUIGhhdmUgc29tZSByZWNvdmVyeSBhY3Rpb24uCi0gKiBJdCB4ZXhpdCgpcyB3aXRoIGEgd2FybmluZyBzdGF0dXMuCi0gKi8KLQotI2lmZGVmIFVTRV9TVERBUkcKLXZvaWQgCi1hc19mYXRhbCAoY29uc3QgY2hhciAqZm9ybWF0LC4uLikKLXsKLSAgdmFfbGlzdCBhcmdzOwotCi0gIGFzX3Nob3dfd2hlcmUgKCk7Ci0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkZhdGFsIGVycm9yOiAiKSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0JCQkJLyogYXNfZmF0YWwoKSAqLwotI2Vsc2UKLS8qVkFSQVJHUzEqLwotdm9pZCAKLWFzX2ZhdGFsIChmb3JtYXQsIHZhX2FsaXN0KQotICAgICBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2RjbAotewotICB2YV9saXN0IGFyZ3M7Ci0KLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgdmFfc3RhcnQgKGFyZ3MpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkZhdGFsIGVycm9yOiAiKSk7Ci0gIHZmcHJpbnRmIChzdGRlcnIsIGZvcm1hdCwgYXJncyk7Ci0gICh2b2lkKSBwdXRjICgnXG4nLCBzdGRlcnIpOwotICB2YV9lbmQgKGFyZ3MpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0JCQkJLyogYXNfZmF0YWwoKSAqLwotI2VuZGlmIC8qIG5vdCBOT19TVERBUkcgKi8KLQotLyoKLSAqIGFzX2Fzc2VydDogSW5kaWNhdGUgYXNzZXJ0aW9uIGZhaWx1cmUuCi0gKiBBcmd1bWVudHM6IEZpbGVuYW1lLCBsaW5lIG51bWJlciwgb3B0aW9uYWwgZnVuY3Rpb24gbmFtZS4KLSAqLwotCi12b2lkCi1hc19hc3NlcnQgKGZpbGUsIGxpbmUsIGZuKQotICAgICBjb25zdCBjaGFyICpmaWxlLCAqZm47Ci0gICAgIGludCBsaW5lOwotewotICBhc19zaG93X3doZXJlICgpOwotICBmcHJpbnRmIChzdGRlcnIsIF8oIkludGVybmFsIGVycm9yIVxuIikpOwotICBpZiAoZm4pCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJBc3NlcnRpb24gZmFpbHVyZSBpbiAlcyBhdCAlcyBsaW5lICVkLlxuIiksCi0JICAgICBmbiwgZmlsZSwgbGluZSk7Ci0gIGVsc2UKLSAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkFzc2VydGlvbiBmYWlsdXJlIGF0ICVzIGxpbmUgJWQuXG4iKSwgZmlsZSwgbGluZSk7Ci0gIGZwcmludGYgKHN0ZGVyciwgXygiUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIpKTsKLSAgeGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci19Ci0KLS8qIGFzX2Fib3J0OiBQcmludCBhIGZyaWVuZGx5IG1lc3NhZ2Ugc2F5aW5nIGhvdyB0b3RhbGx5IGhvc2VkIHdlIGFyZSwKLSAgIGFuZCBleGl0IHdpdGhvdXQgcHJvZHVjaW5nIGEgY29yZSBmaWxlLiAgKi8KLXZvaWQKLWFzX2Fib3J0IChmaWxlLCBsaW5lLCBmbikKLSAgICAgY29uc3QgY2hhciAqZmlsZSwgKmZuOwotICAgICBpbnQgbGluZTsKLXsKLSAgYXNfc2hvd193aGVyZSAoKTsKLSAgaWYgKGZuKQotICAgIGZwcmludGYgKHN0ZGVyciwgXygiSW50ZXJuYWwgZXJyb3IsIGFib3J0aW5nIGF0ICVzIGxpbmUgJWQgaW4gJXNcbiIpLAotCSAgICAgZmlsZSwgbGluZSwgZm4pOwotICBlbHNlCi0gICAgZnByaW50ZiAoc3RkZXJyLCBfKCJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZFxuIiksCi0JICAgICBmaWxlLCBsaW5lKTsKLSAgZnByaW50ZiAoc3RkZXJyLCBfKCJQbGVhc2UgcmVwb3J0IHRoaXMgYnVnLlxuIikpOwotICB4ZXhpdCAoRVhJVF9GQUlMVVJFKTsKLX0KLQotLyogU3VwcG9ydCByb3V0aW5lcy4gICovCi0KLXZvaWQKLWZwcmludF92YWx1ZSAoZmlsZSwgdmFsKQotICAgICBGSUxFICpmaWxlOwotICAgICB2YWx1ZVQgdmFsOwotewotICBpZiAoc2l6ZW9mICh2YWwpIDw9IHNpemVvZiAobG9uZykpCi0gICAgewotICAgICAgZnByaW50ZiAoZmlsZSwgIiVsZCIsIChsb25nKSB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChiZmRfdm1hKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmX3ZtYSAoZmlsZSwgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgYWJvcnQgKCk7Ci19Ci0KLXZvaWQKLXNwcmludF92YWx1ZSAoYnVmLCB2YWwpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgdmFsdWVUIHZhbDsKLXsKLSAgaWYgKHNpemVvZiAodmFsKSA8PSBzaXplb2YgKGxvbmcpKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVsZCIsIChsb25nKSB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChzaXplb2YgKHZhbCkgPD0gc2l6ZW9mIChiZmRfdm1hKSkKLSAgICB7Ci0gICAgICBzcHJpbnRmX3ZtYSAoYnVmLCB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBhYm9ydCAoKTsKLX0KLQotLyogZW5kIG9mIG1lc3NhZ2VzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9tcHctY29uZmlnLmluIGIvZ2FzL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjliMWQuLjAwMDAwMDAKLS0tIGEvZ2FzL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBHQVMuCi0KLVNldCB0YXJnZXRfYXJjaCBgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgLWUgJ3MvLS4qLS4qLy8nYAotCi1JZiAie3RhcmdldF9hcmNofSIgPX4gL3Bvd2VycGMvCi0JU2V0IHNob3J0X2FyY2hfbmFtZSAicHBjIgotCVNldCB0YXJnZXRfY3B1ICJwb3dlcnBjIgotRWxzZQotCVNldCBzaG9ydF9hcmNoX25hbWUgInt0YXJnZXRfYXJjaH0iCi1FbmQgSWYKLQotIyBUaGUgZm9sbG93aW5nIHdvcmtzIGZvciBtYW55IGNvbmZpZ3VyYXRpb25zLCB0aG91Z2ggbm90IGFsbC4KLQotU2V0IG9ial9mb3JtYXQgYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy4qLS4qLS8vJ2AKLVNldCB0YXJnZXRfb3MgYGVjaG8ge3RhcmdldF9jYW5vbmljYWx9IHwgc2VkIC1lICdzLy4qLS4qLS8vJ2AKLQotU2V0IGJmZF9nYXMgbm8KLQotU2V0IFRERUZJTkVTICIiCi0KLVNldCBFWFRSQV9PQkpFQ1RTICIiCi0KLSMgRGVmYXVsdCBlbXVsYXRpb24uCi0KLVNldCBlbSBnZW5lcmljCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLwotCVNldCBvYmpfZm9ybWF0ICJjb2ZmIgotCVNldCBUREVGSU5FUyAnLWQgTTY4S0NPRkYnCi0JU2V0IEVYVFJBX09CSkVDVFMgJyJ7b30ibTY4ay1wYXJzZS5jLm8nCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3Bvd2VycGMtYXBwbGUtbWFjb3MvCi0JU2V0IG9ial9mb3JtYXQgImNvZmYiCi0JU2V0IGJmZF9nYXMgeWVzCi0JU2V0IGVtIG1hY29zCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL2kzODYtXE9wdGlvbi14LWdvMzIvCi0JU2V0IG9ial9mb3JtYXQgImNvZmYiCi0JU2V0IFRERUZJTkVTICctZCBJMzg2Q09GRicKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbTY4ay1cT3B0aW9uLXgtY29mZi8KLQlTZXQgVERFRklORVMgJy1kIE02OEtDT0ZGJwotCi1FbHNlIElmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9taXBzLWlkdC1lY29mZi8KLQlTZXQgYmZkX2dhcyB5ZXMKLQlTZXQgVERFRklORVMgJy1kIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOPTEnCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL21pcHMtXE9wdGlvbi14LVxPcHRpb24teC8KLQkjIEFzc3VtZSBvdGhlciBPU2VzIGV0YyB1c2UgRUxGCi0JU2V0IG9ial9mb3JtYXQgImVsZiIKLQlTZXQgYmZkX2dhcyB5ZXMKLQlTZXQgVERFRklORVMgJy1kIFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOPTEnCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iYmZkOmVsZi1iZmQuaCAnYmZkL2VsZi1iZmQuaCcKLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtXE9wdGlvbi14LWhtcy8KLQlTZXQgb2JqX2Zvcm1hdCAiY29mZiIKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJvcGNvZGVzOnNoLW9wYy5oICdvcGNvZGVzL3NoLW9wYy5oJwotRW5kIElmCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOnRjLXtzaG9ydF9hcmNoX25hbWV9LmMgdGFyZy1jcHUuYwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6dGMte3Nob3J0X2FyY2hfbmFtZX0uaCB0YXJnLWNwdS5oCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOm9iai17b2JqX2Zvcm1hdH0uYyBvYmotZm9ybWF0LmMKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iY29uZmlnOm9iai17b2JqX2Zvcm1hdH0uaCBvYmotZm9ybWF0LmgKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6dGUte2VtfS5oIHRhcmctZW52LmgKLQotIyBTcGVjaWFsIGNhc2VzIGZvciBmbG9hdCBoYW5kbGluZy4KLQotSWYgInt0YXJnZXRfYXJjaH0iID1+IC9uczMyay8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzphdG9mLW5zMzJrLmMgYXRvZi10YXJnLmMKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC90YWhvZS8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzphdG9mLXRhaG9lLmMgYXRvZi10YXJnLmMKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC92YXgvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJjb25maWc6YXRvZi12YXguYyBhdG9mLXRhcmcuYwotRWxzZQotCSMgVXNlIElFRUUgYnkgZGVmYXVsdC4KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImNvbmZpZzphdG9mLWllZWUuYyBhdG9mLXRhcmcuYwotRW5kIElmCi0KLUVjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJyAgICAgCQkgPiAie299Im1rLnRtcAotRWNobyAiVERFRklORVMgPSAiIHtUREVGSU5FU30JCQk+PiAie299Im1rLnRtcAotRWNobyAiRVhUUkFfT0JKRUNUUyA9ICIge0VYVFJBX09CSkVDVFN9CQk+PiAie299Im1rLnRtcAotIyAoV2UgdXNlIHRoZSAtbiBvcHRpb24gaGVyZSBzbyBhcyBub3QgdG8gZ2V0IGV4dHJhIHNwYWNlcyBpbnNlcnRlZCkKLUVjaG8gLW4gJ1RBUkdfQ1BVX0RFUCA9IHtUQVJHX0NQVV9ERVBfJwkJPj4gIntvfSJtay50bXAKLUVjaG8gLW4ge3Nob3J0X2FyY2hfbmFtZX0JCQk+PiAie299Im1rLnRtcAotRWNobyAtbiAnfScJCQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZi4gIEdlbmVyYXRlZCBieSBtcHctY29uZmlndXJlLiAgKi8nID4gIntvfSJjb25mLm5ldwotRWNobyAtbiAnI2RlZmluZSBUQVJHRVRfQ1BVICAgICAgICInICAgICAgIAk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICJ7dGFyZ2V0X2NwdX0iICAgICAgIAkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICcjZGVmaW5lIFRBUkdFVF9PUyAgICAgICAiJyAgICAgICAJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAie3RhcmdldF9vc30iICAgICAgIAkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICcjZGVmaW5lIFRBUkdFVF9BTElBUyAgICAgICAiJyAgICAgICAJPj4gIntvfSJjb25mLm5ldwotRWNobyAtbiAie3RhcmdldF9hbGlhc30iICAgICAgIAkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gICAgJyInICAgICAgIAkJCQk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICcjZGVmaW5lIFRBUkdFVF9DQU5PTklDQUwgICAgICAgIicgICAgIAk+PiAie299ImNvbmYubmV3Ci1FY2hvIC1uICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iCQkJPj4gIntvfSJjb25mLm5ldwotRWNobyAgICAnIicgICAgICAgCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCT4+ICJ7b30iY29uZi5uZXcKLUlmICJ7YmZkX2dhc30iID1+IC95ZXMvCi0JRWNobyAiI2RlZmluZSBCRkRfQVNTRU1CTEVSIgkJPj4gIntvfSJjb25mLm5ldwotRWxzZQotCUVjaG8gIiNkZWZpbmUgTUFOWV9TRUdNRU5UUyIJCT4+ICJ7b30iY29uZi5uZXcKLUVuZCBJZgotRWNobyAnI2RlZmluZSBDUl9FT0wnCQkJCT4+ICJ7b30iY29uZi5uZXcKLUVjaG8gJyNkZWZpbmUgT0JKX0NPRkZfT01JVF9USU1FU1RBTVAnCQk+PiAie299ImNvbmYubmV3Ci1FY2hvICcjZGVmaW5lIExPU0lOR19DT01QSUxFUicJCQk+PiAie299ImNvbmYubmV3Ci0KLU1vdmVJZkNoYW5nZSAie299ImNvbmYubmV3ICJ7b30iY29uZgotCi1zZWQgLWUgInMvQHNyY2RpckAve3NyY2Rpcn0vIiAie3NyY2Rpcn0iZ2RiaW5pdC5pbiA+ICJ7b30iX2dkYmluaXQKZGlmZiAtLWdpdCBhL2dhcy9tcHctbWFrZS5zZWQgYi9nYXMvbXB3LW1ha2Uuc2VkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmYxMmE1Li4wMDAwMDAwCi0tLSBhL2dhcy9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdGhhdCBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIEdBUyBVbml4IE1ha2VmaWxlIHRvIE1QVyBzeW50YXguCi0KLS9eIyBAdGFyZ2V0X2ZyYWdAL2FcCi1cCi1IREVGSU5FUyA9IFwKLUxPQ0FMX0xPQURMSUJFUyA9IFwKLQotL15zcmNyb290ID0gL3MvXi8jLwotL150YXJnZXRfYWxpYXMgPSAvcy9eLyMvCi0KLS9JTkNMVURFUy9zLy1pICJ7c3JjZGlyfSI6XChbYS16XSpcKS8taSAie3RvcHNyY2Rpcn0iXDEvCi0vSU5DTFVERVMvcy8taSAie3NyY2Rpcn0iXC5cLi8taSAie3RvcHNyY2Rpcn0iLwotCi0vXklOQ0xVREVTID0gLiokL3MvJC8gLWkgInt0b3BzcmNkaXJ9ImluY2x1ZGU6bXB3OiAtaSA6OmV4dHJhLWluY2x1ZGU6LwotCi0vJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApL3MvJChUQVJHX0NQVV9ERVBfQHRhcmdldF9jcHVfdHlwZUApL3tUQVJHX0NQVV9ERVB9LwotCi0vQE9QQ09ERVNfTElCQC9zL0BPUENPREVTX0xJQkAvOjpvcGNvZGVzOmxpYm9wY29kZXMuby8KLS9AQkZETElCQC9zL0BCRkRMSUJALzo6YmZkOmxpYmJmZC5vLwotCi0jIFBvaW50IGF0IHRoZSBsaWJyYXJpZXMgZGlyZWN0bHkuCi0vQE9QQ09ERVNfREVQQC9zL0BPUENPREVTX0RFUEAvOjpvcGNvZGVzOmxpYm9wY29kZXMuby8KLS9AQkZEREVQQC9zL0BCRkRERVBALzo6YmZkOmxpYmJmZC5vLwotCi0jIERvbid0IG5lZWQgdGhpcy4KLS9ASExERkxBR1NAL3MvQEhMREZMQUdTQC8vCi0KLS9leHRyYV9vYmplY3RzQC9zL2V4dHJhX29iamVjdHNAL3tFWFRSQV9PQkpFQ1RTfS8KLQotL0xPQURMSUJFUy9zL3tMT0FETElCRVN9L3tFWFRSQUxJQlN9LwotCi0vQEFMTF9PQkpfREVQU0Avcy9AQUxMX09CSl9ERVBTQC86OmJmZDpiZmQuaC8KLQotIyBUaGlzIGNhdXNlcyBwcm9ibGVtcyAtIG5vdCBzdXJlIHdoeS4KLS9edGFncyBUQUdTLywvZXRhZ3MgL2QKLQotL15tYWtlLWdhcy5jb20vcy9eLyMvCi0KLS90cnVlL3MvIDsgQHRydWUkLy8KLQotIyBSZW1vdmUgcmVmZXJlbmNlcyB0byBjb25mLmluLCB3ZSBkb24ndCBuZWVkIHRoZW0uCi0vY29uZlwuaW4vcy9jb25mXC5pbi8vZwotCi0jIFVzZSBfZ2RiaW5pdCBldmVyeXdoZXJlIGluc3RlYWQgb2YgLmdkYmluaXQuCi0vZ2RiaW5pdC9zL1wuZ2RiaW5pdC9fZ2RiaW5pdC9nCi0KLS9hdG9mLXRhcmcvcy8ie3N9ImF0b2YtdGFyZ1wuYy8ie299ImF0b2YtdGFyZy5jL2cKLS9jb25maWcvcy8ie3N9ImNvbmZpZ1wuaC8ie299ImNvbmZpZy5oL2cKLS9jb25maWcvcy9eY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvCi0vb2JqLWZvcm1hdC9zLyJ7c30ib2JqLWZvcm1hdFwuYy8ie299Im9iai1mb3JtYXQuYy9nCi0vb2JqLWZvcm1hdC9zLyJ7c30ib2JqLWZvcm1hdFwuaC8ie299Im9iai1mb3JtYXQuaC9nCi0vdGFyZy1jcHUvcy8ie3N9InRhcmctY3B1XC5jLyJ7b30idGFyZy1jcHUuYy9nCi0vdGFyZy1jcHUvcy8ie3N9InRhcmctY3B1XC5oLyJ7b30idGFyZy1jcHUuaC9nCi0vdGFyZy1lbnYvcy8ie3N9InRhcmctZW52XC5oLyJ7b30idGFyZy1lbnYuaC9nCi0KLS9tNjhrLXBhcnNlLmMvcy8ie3N9Im02OGstcGFyc2VcLmMvIntvfSJtNjhrLXBhcnNlLmMvZwotL202OGstcGFyc2UuYy9zL15tNjhrLXBhcnNlXC5jLyJ7b30ibTY4ay1wYXJzZS5jLwotCi0jIFdoYWNrIG91dCB0aGUgY29uZmlnLmggZGVwZW5kZW5jeSwgaXQgb25seSBjYXVzZXMgZXhjZXNzIHJlYnVpbGRzLgotL3tPQkpTfS9zL3tPQkpTfSBcXE9wdGlvbi1mICJ7b30iY29uZmlnLmgve09CSlN9IFxcT3B0aW9uLWYvCi0vZ2FzcC5jL3MvZ2FzcFwuYyAie299ImNvbmZpZy5oL2dhc3AuYy8KLQotIyBBTExfQ0ZMQUdTIGluY2x1ZGVzIFRERUZJTkVTLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlIGF0IGxpbmsgdGltZS4KLS9DQ19MRC9zL0FMTF9DRkxBR1MvQ0ZMQUdTL2cKLQotIyBUaGUgcmVzb3VyY2UgZmlsZSBpcyBjYWxsZWQgbWFjLWFzLnIuCi0vYXMubmV3LnIvcy9hc1wubmV3XC5yL21hYy1hcy5yLwotL2dhc3AubmV3LnIvcy9nYXNwXC5uZXdcLnIvbWFjLWFzLnIvCi0KLSMgLi4uYW5kIHRoZSBQUk9HX05BTUUgZG9lc24ndCBoYXZlIGEgLm5ldyBpbiBpdC4KLS9QUk9HX05BTUUvcy9QUk9HX05BTUU9JyInYXMubmV3JyInL1BST0dfTkFNRT0nIidhcyciJy8KLS9QUk9HX05BTUUvcy9QUk9HX05BTUU9JyInZ2FzcC5uZXcnIicvUFJPR19OQU1FPSciJ2dhc3AnIicvCi0KLSMgV2hhY2sgb3V0IHJlY3Vyc2l2ZSBtYWtlcywgdGhleSB3b24ndCB3b3JrLgotL15bIAldWyAJXSpzcmNyb290PS8sL15bIAldWyAJXSooY2QgL2QKLQotIyBXb3JrIGFyb3VuZCBxdW90aW5nIHByb2JsZW1zIGJ5IHVzaW5nIG11bHRpcGxlIGVjaG8gY29tbWFuZHMuCi0vJyNkZWZpbmUgR0FTX1ZFUlNJT04gIntWRVJTSU9OfSInL2NcCi0JRWNobyAtbiAnI2RlZmluZSBHQVNfVkVSU0lPTiAiJyA+PiAie299ImNvbmZpZy5uZXdcCi0JRWNobyAtbiAie1ZFUlNJT059IiA+PiAie299ImNvbmZpZy5uZXdcCi0JRWNobyAtbiAnIicgPj4gIntvfSJjb25maWcubmV3Ci0KLSMgQWRkIGEgInN0YW1wcyIgdGFyZ2V0LgotJGFcCi1zdGFtcHMgXFxPcHRpb24tZiBjb25maWctc3RhbXBcCi0KLS9eaW5zdGFsbCBcXE9wdGlvbi1mLywvXiQvY1wKLWluc3RhbGwgXFxPcHRpb24tZiBhbGwgaW5zdGFsbC1vbmx5XAotXAotaW5zdGFsbC1vbmx5IFxcT3B0aW9uLWZcCi0JTmV3Rm9sZGVyUmVjdXJzaXZlICJ7YmluZGlyfSJcCi0JRHVwbGljYXRlIC15IDphcy5uZXcgIntiaW5kaXJ9ImFzXAotCUR1cGxpY2F0ZSAteSA6Z2FzcC5uZXcgIntiaW5kaXJ9Imdhc3BcCi0KLQotIyBXaGFjayBvdXQgY29uZmlnLXJlYnVpbGRpbmcgdGFyZ2V0cywgdGhleSB3b24ndCB3b3JrLgotL15NYWtlZmlsZSBcXE9wdGlvbi1mLywvXiQvZAotL15jb25maWcuc3RhdHVzIFxcT3B0aW9uLWYvLC9eJC9kCi0KLS9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mL3MvXi8jLwpkaWZmIC0tZ2l0IGEvZ2FzL29iai5oIGIvZ2FzL29iai5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTVlNzVjLi4wMDAwMDAwCi0tLSBhL2dhcy9vYmouaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qIG9iai5oIC0gZGVmaW5lcyB0aGUgb2JqZWN0IGRlcGVuZGVudCBob29rcyBmb3IgYWxsIG9iamVjdAotICAgZm9ybWF0IGJhY2tlbmRzLgotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NSwgOTYsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotY2hhciAqb2JqX2RlZmF1bHRfb3V0cHV0X2ZpbGVfbmFtZSBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIG9ial9lbWl0X3JlbG9jYXRpb25zIFBBUkFNUyAoKGNoYXIgKip3aGVyZSwgZml4UyAqIGZpeFAsCi0JCQkJICAgcmVsYXhfYWRkcmVzc1Qgc2VnbWVudF9hZGRyZXNzX2luX2ZpbGUpKTsKLXZvaWQgb2JqX2VtaXRfc3RyaW5ncyBQQVJBTVMgKChjaGFyICoqd2hlcmUpKTsKLXZvaWQgb2JqX2VtaXRfc3ltYm9scyBQQVJBTVMgKChjaGFyICoqd2hlcmUsIHN5bWJvbFMgKiBzeW1ib2xzKSk7Ci0jaWZuZGVmIG9ial9yZWFkX2JlZ2luX2hvb2sKLXZvaWQgb2JqX3JlYWRfYmVnaW5faG9vayBQQVJBTVMgKCh2b2lkKSk7Ci0jZW5kaWYKLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotdm9pZCBvYmpfY3Jhd2xfc3ltYm9sX2NoYWluIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotdm9pZCBvYmpfaGVhZGVyX2FwcGVuZCBQQVJBTVMgKChjaGFyICoqd2hlcmUsIG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2lmbmRlZiBvYmpfcHJlX3dyaXRlX2hvb2sKLXZvaWQgb2JqX3ByZV93cml0ZV9ob29rIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICogaGVhZGVycykpOwotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBvYmpfc3ltYm9sX25ld19ob29rCi12b2lkIG9ial9zeW1ib2xfbmV3X2hvb2sgUEFSQU1TICgoc3ltYm9sUyAqIHN5bWJvbFApKTsKLSNlbmRpZgotCi12b2lkIG9ial9zeW1ib2xfdG9fY2hhcnMgUEFSQU1TICgoY2hhciAqKndoZXJlLCBzeW1ib2xTICogc3ltYm9sUCkpOwotCi1leHRlcm4gY29uc3QgcHNldWRvX3R5cGVTIG9ial9wc2V1ZG9fdGFibGVbXTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0cnVjdCBmb3JtYXRfb3BzIHsKLSAgaW50IGZsYXZvcjsKLSAgdW5zaWduZWQgZGZsX2xlYWRpbmdfdW5kZXJzY29yZSA6IDE7Ci0gIHVuc2lnbmVkIGVtaXRfc2VjdGlvbl9zeW1ib2xzIDogMTsKLSAgdm9pZCAoKmZyb2Jfc3ltYm9sKSBQQVJBTVMgKChzeW1ib2xTICosIGludCAqKSk7Ci0gIHZvaWQgKCpmcm9iX2ZpbGUpIFBBUkFNUyAoKHZvaWQpKTsKLSAgdm9pZCAoKmZyb2JfZmlsZV9hZnRlcl9yZWxvY3MpIFBBUkFNUyAoKHZvaWQpKTsKLSAgYmZkX3ZtYSAoKnNfZ2V0X3NpemUpIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotICB2b2lkICgqc19zZXRfc2l6ZSkgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci0gIGJmZF92bWEgKCpzX2dldF9hbGlnbikgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0gIHZvaWQgKCpzX3NldF9hbGlnbikgUEFSQU1TICgoc3ltYm9sUyAqLCBiZmRfdm1hKSk7Ci0gIHZvaWQgKCpjb3B5X3N5bWJvbF9hdHRyaWJ1dGVzKSBQQVJBTVMgKChzeW1ib2xTICosIHN5bWJvbFMgKikpOwotICB2b2lkICgqZ2VuZXJhdGVfYXNtX2xpbmVubykgUEFSQU1TICgodm9pZCkpOwotICB2b2lkICgqcHJvY2Vzc19zdGFiKSBQQVJBTVMgKChzZWdULCBpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCkpOwotICBpbnQgKCpzZWNfc3ltX29rX2Zvcl9yZWxvYykgUEFSQU1TICgoYXNlY3Rpb24gKikpOwotICB2b2lkICgqcG9wX2luc2VydCkgUEFSQU1TICgodm9pZCkpOwotICAvKiBGb3IgY29uZmlndXJhdGlvbnMgdXNpbmcgRUNPRkZfREVCVUdHSU5HLCB0aGlzIGNhbGxiYWNrIGlzIHVzZWQuICAqLwotICB2b2lkICgqZWNvZmZfc2V0X2V4dCkgUEFSQU1TICgoc3ltYm9sUyAqLCBzdHJ1Y3QgZWNvZmZfZXh0ciAqKSk7Ci0KLSAgdm9pZCAoKnJlYWRfYmVnaW5faG9vaykgUEFSQU1TICgodm9pZCkpOwotICB2b2lkICgqc3ltYm9sX25ld19ob29rKSBQQVJBTVMgKChzeW1ib2xTICopKTsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlbGZfZm9ybWF0X29wczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZm9ybWF0X29wcyBlY29mZl9mb3JtYXRfb3BzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzIGNvZmZfZm9ybWF0X29wczsKLQotI2lmbmRlZiB0aGlzX2Zvcm1hdAotQ09NTU9OIGNvbnN0IHN0cnVjdCBmb3JtYXRfb3BzICp0aGlzX2Zvcm1hdDsKLSNlbmRpZgotI2VuZGlmCi0KLS8qIGVuZCBvZiBvYmouaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL291dHB1dC1maWxlLmMgYi9nYXMvb3V0cHV0LWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1YWY0OC4uMDAwMDAwMAotLS0gYS9nYXMvb3V0cHV0LWZpbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKiBvdXRwdXQtZmlsZS5jIC0gIERlYWwgd2l0aCB0aGUgb3V0cHV0IGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MywgOTIsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgIm91dHB1dC1maWxlLmgiCi0KLSNpZmRlZiBCRkRfSEVBREVSUwotI2RlZmluZSBVU0VfQkZECi0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSNkZWZpbmUgVVNFX0JGRAotI2lmbmRlZiBUQVJHRVRfTUFDSAotI2RlZmluZSBUQVJHRVRfTUFDSCAwCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVVNFX0JGRAotI2luY2x1ZGUgImJmZC5oIgotYmZkICpzdGRvdXRwdXQ7Ci0KLXZvaWQKLW91dHB1dF9maWxlX2NyZWF0ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJy0nICYmIG5hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiQ2FuJ3Qgb3BlbiBhIGJmZCBvbiBzdGRvdXQgJXMgIiksIG5hbWUpOwotICAgIH0KLSAgZWxzZSBpZiAoIShzdGRvdXRwdXQgPSBiZmRfb3BlbncgKG5hbWUsIFRBUkdFVF9GT1JNQVQpKSkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiKSwgbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgYmZkX3NldF9mb3JtYXQgKHN0ZG91dHB1dCwgYmZkX29iamVjdCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfc2V0X2FyY2hfbWFjaCAoc3Rkb3V0cHV0LCBUQVJHRVRfQVJDSCwgVEFSR0VUX01BQ0gpOwotI2VuZGlmCi0gIGlmIChmbGFnX3RyYWRpdGlvbmFsX2Zvcm1hdCkKLSAgICBzdGRvdXRwdXQtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci19Ci0KLXZvaWQKLW91dHB1dF9maWxlX2Nsb3NlIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBDbG9zZSB0aGUgYmZkLiAgKi8KLSAgaWYgKGJmZF9jbG9zZSAoc3Rkb3V0cHV0KSA9PSAwKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNsb3NlICVzXG4iKSwgZmlsZW5hbWUpOwotICAgICAgZXhpdCAoRVhJVF9GQUlMVVJFKTsKLSAgICB9Ci0jZWxzZQotICAvKiBDbG9zZSB0aGUgYmZkIHdpdGhvdXQgZ2V0dGluZyBiZmQgdG8gd3JpdGUgb3V0IGFueXRoaW5nIGJ5IGl0c2VsZiAqLwotICBpZiAoYmZkX2Nsb3NlX2FsbF9kb25lIChzdGRvdXRwdXQpID09IDApCi0gICAgewotICAgICAgYXNfcGVycm9yIChfKCJGQVRBTDogQ2FuJ3QgY2xvc2UgJXNcbiIpLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSNlbmRpZgotICBzdGRvdXRwdXQgPSBOVUxMOwkJLyogVHJ1c3Qgbm9ib2R5ISAqLwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLXZvaWQKLW91dHB1dF9maWxlX2FwcGVuZCAod2hlcmUsIGxlbmd0aCwgZmlsZW5hbWUpCi0gICAgIGNoYXIgKndoZXJlOwotICAgICBsb25nIGxlbmd0aDsKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGFib3J0ICgpOwotfQotI2VuZGlmCi0KLSNlbHNlCi0KLXN0YXRpYyBGSUxFICpzdGRvdXRwdXQ7Ci0KLXZvaWQKLW91dHB1dF9maWxlX2NyZWF0ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKG5hbWVbMF0gPT0gJy0nICYmIG5hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICBzdGRvdXRwdXQgPSBzdGRvdXQ7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0ZG91dHB1dCA9IGZvcGVuIChuYW1lLCAid2IiKTsKLQotICAvKiBTb21lIHN5c3RlbXMgZG9uJ3QgZ3JvayAiYiIgaW4gZm9wZW4gbW9kZXMuICAqLwotICBpZiAoc3Rkb3V0cHV0ID09IE5VTEwpCi0gICAgc3Rkb3V0cHV0ID0gZm9wZW4gKG5hbWUsICJ3Iik7Ci0KLSAgaWYgKHN0ZG91dHB1dCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IGNyZWF0ZSAlcyIpLCBuYW1lKTsKLSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0gICAgfQotfQotCi12b2lkCi1vdXRwdXRfZmlsZV9jbG9zZSAoZmlsZW5hbWUpCi0gICAgIGNoYXIgKmZpbGVuYW1lOwotewotICBpZiAoRU9GID09IGZjbG9zZSAoc3Rkb3V0cHV0KSkKLSAgICB7Ci0gICAgICBhc19wZXJyb3IgKF8oIkZBVEFMOiBDYW4ndCBjbG9zZSAlcyIpLCBmaWxlbmFtZSk7Ci0gICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotICAgIH0KLSAgc3Rkb3V0cHV0ID0gTlVMTDsJCS8qIFRydXN0IG5vYm9keSEgKi8KLX0KLQotdm9pZAotb3V0cHV0X2ZpbGVfYXBwZW5kICh3aGVyZSwgbGVuZ3RoLCBmaWxlbmFtZSkKLSAgICAgY2hhciAqd2hlcmU7Ci0gICAgIGxvbmcgbGVuZ3RoOwotICAgICBjaGFyICpmaWxlbmFtZTsKLXsKLSAgZm9yICg7IGxlbmd0aDsgbGVuZ3RoLS0sIHdoZXJlKyspCi0gICAgewotICAgICAgKHZvaWQpIHB1dGMgKCp3aGVyZSwgc3Rkb3V0cHV0KTsKLSAgICAgIGlmIChmZXJyb3IgKHN0ZG91dHB1dCkpCi0JLyogaWYgKCBFT0YgPT0gKHB1dGMoICp3aGVyZSwgc3Rkb3V0cHV0ICkpICkgKi8KLQl7Ci0JICBhc19wZXJyb3IgKF8oIkZhaWxlZCB0byBlbWl0IGFuIG9iamVjdCBieXRlIiksIGZpbGVuYW1lKTsKLQkgIGFzX2ZhdGFsIChfKCJDYW4ndCBjb250aW51ZSIpKTsKLQl9Ci0gICAgfQotfQotCi0jZW5kaWYKLQotLyogZW5kIG9mIG91dHB1dC1maWxlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9vdXRwdXQtZmlsZS5oIGIvZ2FzL291dHB1dC1maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MmYxZWYuLjAwMDAwMDAKLS0tIGEvZ2FzL291dHB1dC1maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgb3V0cHV0LWZpbGUuaAotCi0gICBDb3B5cmlnaHQgKEMpIDE5ODctMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi12b2lkIG91dHB1dF9maWxlX2FwcGVuZCBQQVJBTVMgKChjaGFyICp3aGVyZSwgbG9uZyBsZW5ndGgsIGNoYXIgKmZpbGVuYW1lKSk7Ci12b2lkIG91dHB1dF9maWxlX2Nsb3NlIFBBUkFNUyAoKGNoYXIgKmZpbGVuYW1lKSk7Ci12b2lkIG91dHB1dF9maWxlX2NyZWF0ZSBQQVJBTVMgKChjaGFyICpuYW1lKSk7Ci0KLS8qIGVuZCBvZiBvdXRwdXQtZmlsZS5oICovCmRpZmYgLS1naXQgYS9nYXMvcG8vTWFrZS1pbiBiL2dhcy9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTUyZGIxLi4wMDAwMDAwCi0tLSBhL2dhcy9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dhcy9wby9QT1RGSUxFUy5pbiBiL2dhcy9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2N2YyNy4uMDAwMDAwMAotLS0gYS9nYXMvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotYXBwLmMKLWFwcC5jCi1hcy5jCi1hcy5jCi1hcy5oCi1hc2ludGwuaAotYXRvZi1nZW5lcmljLmMKLWF0b2YtZ2VuZXJpYy5jCi1iaWdudW0tY29weS5jCi1iaWdudW0tY29weS5jCi1iaWdudW0uaAotYml0X2ZpeC5oCi1jZ2VuLmgKLWNvbmQuYwotY29uZC5jCi1jb25maWcvZS1pMzg2Y29mZi5jCi1jb25maWcvZS1pMzg2ZWxmLmMKLWNvbmZpZy9lLW1pcHNlY29mZi5jCi1jb25maWcvZS1taXBzZWxmLmMKLWNvbmZpZy9vYmotYW91dC5jCi1jb25maWcvb2JqLWFvdXQuaAotY29uZmlnL29iai1ib3V0LmMKLWNvbmZpZy9vYmotYm91dC5oCi1jb25maWcvb2JqLWNvZmYuYwotY29uZmlnL29iai1jb2ZmLmgKLWNvbmZpZy9vYmotZWNvZmYuYwotY29uZmlnL29iai1lY29mZi5oCi1jb25maWcvb2JqLWVsZi5jCi1jb25maWcvb2JqLWVsZi5oCi1jb25maWcvb2JqLWV2YXguYwotY29uZmlnL29iai1ldmF4LmgKLWNvbmZpZy9vYmotaHAzMDAuYwotY29uZmlnL29iai1ocDMwMC5oCi1jb25maWcvb2JqLWllZWUuYwotY29uZmlnL29iai1pZWVlLmgKLWNvbmZpZy9vYmotc29tLmMKLWNvbmZpZy9vYmotc29tLmgKLWNvbmZpZy9vYmotdm1zLmMKLWNvbmZpZy9vYmotdm1zLmgKLWNvbmZpZy90Yy1hMjlrLmMKLWNvbmZpZy90Yy1hMjlrLmgKLWNvbmZpZy90Yy1hbHBoYS5jCi1jb25maWcvdGMtYWxwaGEuaAotY29uZmlnL3RjLWFyYy5jCi1jb25maWcvdGMtYXJjLmgKLWNvbmZpZy90Yy1hcm0uYwotY29uZmlnL3RjLWFybS5oCi1jb25maWcvdGMtZDEwdi5jCi1jb25maWcvdGMtZDEwdi5oCi1jb25maWcvdGMtZDMwdi5jCi1jb25maWcvdGMtZDMwdi5oCi1jb25maWcvdGMtaDgzMDAuYwotY29uZmlnL3RjLWg4MzAwLmgKLWNvbmZpZy90Yy1oODUwMC5jCi1jb25maWcvdGMtaDg1MDAuaAotY29uZmlnL3RjLWhwcGEuYwotY29uZmlnL3RjLWhwcGEuaAotY29uZmlnL3RjLWkzODYuYwotY29uZmlnL3RjLWkzODYuaAotY29uZmlnL3RjLWk4NjAuYwotY29uZmlnL3RjLWk4NjAuaAotY29uZmlnL3RjLWk5NjAuYwotY29uZmlnL3RjLWk5NjAuaAotY29uZmlnL3RjLW0zMnIuYwotY29uZmlnL3RjLW0zMnIuaAotY29uZmlnL3RjLW02OGsuYwotY29uZmlnL3RjLW02OGsuaAotY29uZmlnL3RjLW04OGsuYwotY29uZmlnL3RjLW04OGsuaAotY29uZmlnL3RjLW1jb3JlLmMKLWNvbmZpZy90Yy1tY29yZS5oCi1jb25maWcvdGMtbWlwcy5jCi1jb25maWcvdGMtbWlwcy5oCi1jb25maWcvdGMtbW4xMDIwMC5jCi1jb25maWcvdGMtbW4xMDIwMC5oCi1jb25maWcvdGMtbW4xMDMwMC5jCi1jb25maWcvdGMtbW4xMDMwMC5oCi1jb25maWcvdGMtbnMzMmsuYwotY29uZmlnL3RjLW5zMzJrLmgKLWNvbmZpZy90Yy1wcGMuYwotY29uZmlnL3RjLXBwYy5oCi1jb25maWcvdGMtc2guYwotY29uZmlnL3RjLXNoLmgKLWNvbmZpZy90Yy1zcGFyYy5jCi1jb25maWcvdGMtc3BhcmMuaAotY29uZmlnL3RjLXRhaG9lLmMKLWNvbmZpZy90Yy10YWhvZS5oCi1jb25maWcvdGMtdGljMzAuYwotY29uZmlnL3RjLXRpYzMwLmgKLWNvbmZpZy90Yy10aWM4MC5jCi1jb25maWcvdGMtdGljODAuaAotY29uZmlnL3RjLXY4NTAuYwotY29uZmlnL3RjLXY4NTAuaAotY29uZmlnL3RjLXZheC5jCi1jb25maWcvdGMtdmF4LmgKLWNvbmZpZy90Yy13NjUuYwotY29uZmlnL3RjLXc2NS5oCi1jb25maWcvdGMtejhrLmMKLWNvbmZpZy90Yy16OGsuaAotZGVwZW5kLmMKLWRlcGVuZC5jCi1kd2FyZjJkYmcuYwotZHdhcmYyZGJnLmMKLWR3YXJmMmRiZy5oCi1lY29mZi5jCi1lY29mZi5jCi1lY29mZi5oCi1laG9wdC5jCi1laG9wdC5jCi1lbXVsLXRhcmdldC5oCi1lbXVsLmgKLWV4cHIuYwotZXhwci5jCi1leHByLmgKLWZsb251bS1jb3B5LmMKLWZsb251bS1jb3B5LmMKLWZsb251bS1rb25zdC5jCi1mbG9udW0ta29uc3QuYwotZmxvbnVtLW11bHQuYwotZmxvbnVtLW11bHQuYwotZmxvbnVtLmgKLWZyYWdzLmMKLWZyYWdzLmMKLWZyYWdzLmgKLWdhc3AuYwotaGFzaC5jCi1oYXNoLmMKLWhhc2guaAotaW5wdXQtZmlsZS5jCi1pbnB1dC1maWxlLmMKLWlucHV0LWZpbGUuaAotaW5wdXQtc2NydWIuYwotaW5wdXQtc2NydWIuYwotaXRibC1vcHMuYwotaXRibC1vcHMuaAotbGlzdGluZy5jCi1saXN0aW5nLmMKLWxpc3RpbmcuaAotbGl0ZXJhbC5jCi1saXRlcmFsLmMKLW1hY3JvLmMKLW1hY3JvLmMKLW1hY3JvLmgKLW1lc3NhZ2VzLmMKLW1lc3NhZ2VzLmMKLW9iai5oCi1vdXRwdXQtZmlsZS5jCi1vdXRwdXQtZmlsZS5jCi1vdXRwdXQtZmlsZS5oCi1yZWFkLmMKLXJlYWQuYwotcmVhZC5oCi1zYi5jCi1zYi5jCi1zYi5oCi1zdGFicy5jCi1zdGFicy5jCi1zdHJ1Yy1zeW1ib2wuaAotc3Vic2Vncy5jCi1zdWJzZWdzLmMKLXN1YnNlZ3MuaAotc3ltYm9scy5jCi1zeW1ib2xzLmMKLXN5bWJvbHMuaAotdGMuaAotd3JpdGUuYwotd3JpdGUuYwotd3JpdGUuaApkaWZmIC0tZ2l0IGEvZ2FzL3BvL2dhcy5wb3QgYi9nYXMvcG8vZ2FzLnBvdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0MGVlMS4uMDAwMDAwMAotLS0gYS9nYXMvcG8vZ2FzLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDcxNjYgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDYtMDMgMDM6MDAtMDcwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFwcC5jOjQ0OCBhcHAuYzo0NjIKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBjb21tZW50IgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjU0MQotbXNnaWQgImVuZCBvZiBmaWxlIGluIHN0cmluZzogaW5zZXJ0ZWQgJ1wiJyIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo2MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBlc2NhcGUgJ1xcJWMnIGluIHN0cmluZzogSWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo2MTYKLW1zZ2lkICJFbmQgb2YgZmlsZSBpbiBzdHJpbmc6ICdcIicgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6NzM2Ci1tc2dpZCAiZW5kIG9mIGZpbGUgbm90IGF0IGVuZCBvZiBhIGxpbmU7IG5ld2xpbmUgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6ODgyCi1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gbXVsdGlsaW5lIGNvbW1lbnQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6OTMxCi1tc2dpZCAiZW5kIG9mIGZpbGUgYWZ0ZXIgYSBvbmUtY2hhcmFjdGVyIHF1b3RlOyBcXDAgaW5zZXJ0ZWQiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6OTM5Ci1tc2dpZCAiZW5kIG9mIGZpbGUgaW4gZXNjYXBlIGNoYXJhY3RlciIKLW1zZ3N0ciAiIgotCi0jOiBhcHAuYzo5NTEKLW1zZ2lkICJNaXNzaW5nIGNsb3NlIHF1b3RlOiAoYXNzdW1lZCkiCi1tc2dzdHIgIiIKLQotIzogYXBwLmM6MTAxMCBhcHAuYzoxMDY0IGFwcC5jOjExMzMKLW1zZ2lkICJlbmQgb2YgZmlsZSBpbiBjb21tZW50OyBuZXdsaW5lIGluc2VydGVkIgotbXNnc3RyICIiCi0KLSM6IGFwcC5jOjEwNzQKLW1zZ2lkICJFT0YgaW4gQ29tbWVudDogTmV3bGluZSBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjEyMQotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSB1c2luZyBCRkQgdmVyc2lvbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjEyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyIHZlcnNpb24gJXMgKCVzKSIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjEzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgW29wdGlvbi4uLl0gW2FzbWZpbGUuLi5dXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxMzUKLW1zZ2lkICIiCi0iT3B0aW9uczpcbiIKLSIgIC1hW3N1Yi1vcHRpb24uLi5dXHR0dXJuIG9uIGxpc3RpbmdzXG4iCi0iICAgIFN1Yi1vcHRpb25zIFtkZWZhdWx0IGhsc106XG4iCi0iICAgIGMgICBvbWl0IGZhbHNlIGNvbmRpdGlvbmFsc1xuIgotIiAgICBkICAgb21pdCBkZWJ1Z2dpbmcgZGlyZWN0aXZlc1xuIgotIiAgICBoICAgaW5jbHVkZSBoaWdoLWxldmVsIHNvdXJjZVxuIgotIiAgICBsICAgaW5jbHVkZSBhc3NlbWJseVxuIgotIiAgICBtICAgaW5jbHVkZSBtYWNybyBleHBhbnNpb25zXG4iCi0iICAgIG4gICBvbWl0IGZvcm1zIHByb2Nlc3NpbmdcbiIKLSIgICAgcyAgIGluY2x1ZGUgc3ltYm9sc1xuIgotIiAgICBMICAgaW5jbHVkZSBsaW5lIGRlYnVnIHN0YXRpc3RpY3MgKGlmIGFwcGxpY2FibGUpXG4iCi0iICAgID1maWxlIHNldCBsaXN0aW5nIGZpbGUgbmFtZSAobXVzdCBiZSBsYXN0IHN1Yi1vcHRpb24pXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxNDkKLW1zZ2lkICIiCi0iICAtRFx0XHQgICAgICAgICAgcHJvZHVjZSBhc3NlbWJsZXIgZGVidWdnaW5nIG1lc3NhZ2VzXG4iCi0iICAtLWRlZnN5bSBTWU09VkFMICAgICAgICBkZWZpbmUgc3ltYm9sIFNZTSB0byBnaXZlbiB2YWx1ZVxuIgotIiAgLWZcdFx0ICAgICAgICAgIHNraXAgd2hpdGVzcGFjZSBhbmQgY29tbWVudCBwcmVwcm9jZXNzaW5nXG4iCi0iICAtLWdzdGFic1x0ICAgICAgICAgIGdlbmVyYXRlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvblxuIgotIiAgLS1oZWxwXHRcdCAgc2hvdyB0aGlzIG1lc3NhZ2UgYW5kIGV4aXRcbiIKLSIgIC1JIERJUlx0XHQgIGFkZCBESVIgdG8gc2VhcmNoIGxpc3QgZm9yIC5pbmNsdWRlIGRpcmVjdGl2ZXNcbiIKLSIgIC1KXHRcdCAgICAgICAgICBkb24ndCB3YXJuIGFib3V0IHNpZ25lZCBvdmVyZmxvd1xuIgotIiAgLUtcdFx0ICAgICAgICAgIHdhcm4gd2hlbiBkaWZmZXJlbmNlcyBhbHRlcmVkIGZvciBsb25nIGRpc3BsYWNlbWVudHNcbiIKLSIgIC1MLC0ta2VlcC1sb2NhbHMgICAgICAgIGtlZXAgbG9jYWwgc3ltYm9scyAoZS5nLiBzdGFydGluZyB3aXRoIGBMJylcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjE2MAotbXNnaWQgIiIKLSIgIC1NLC0tbXJpXHQgICAgICAgICAgYXNzZW1ibGUgaW4gTVJJIGNvbXBhdGliaWxpdHkgbW9kZVxuIgotIiAgLS1NRCBGSUxFXHQgICAgICAgICAgd3JpdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBpbiBGSUxFIChkZWZhdWx0IG5vbmUpXG4iCi0iICAtbm9jcHBcdFx0ICBpZ25vcmVkXG4iCi0iICAtbyBPQkpGSUxFXHQgICAgICAgICAgbmFtZSB0aGUgb2JqZWN0LWZpbGUgb3V0cHV0IE9CSkZJTEUgKGRlZmF1bHQgYS5vdXQpXG4iCi0iICAtUlx0XHQgICAgICAgICAgZm9sZCBkYXRhIHNlY3Rpb24gaW50byB0ZXh0IHNlY3Rpb25cbiIKLSIgIC0tc3RhdGlzdGljc1x0ICAgICAgICAgIHByaW50IHZhcmlvdXMgbWVhc3VyZWQgc3RhdGlzdGljcyBmcm9tIGV4ZWN1dGlvblxuIgotIiAgLS1zdHJpcC1sb2NhbC1hYnNvbHV0ZSAgc3RyaXAgbG9jYWwgYWJzb2x1dGUgc3ltYm9sc1xuIgotIiAgLS10cmFkaXRpb25hbC1mb3JtYXRcdCAgVXNlIHNhbWUgZm9ybWF0IGFzIG5hdGl2ZSBhc3NlbWJsZXIgd2hlbiBwb3NzaWJsZVxuIgotIiAgLS12ZXJzaW9uXHRcdCAgcHJpbnQgYXNzZW1ibGVyIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iCi0iICAtV1x0XHRcdCAgc3VwcHJlc3Mgd2FybmluZ3NcbiIKLSIgIC0taXRibCBJTlNUVEJMXHQgIGV4dGVuZCBpbnN0cnVjdGlvbiBzZXQgdG8gaW5jbHVkZSBpbnN0cnVjdGlvbnNcbiIKLSJcdFx0XHQgIG1hdGNoaW5nIHRoZSBzcGVjaWZpY2F0aW9ucyBkZWZpbmVkIGluIGZpbGUgSU5TVFRCTFxuIgotIiAgLXdcdFx0XHQgIGlnbm9yZWRcbiIKLSIgIC1YXHRcdFx0ICBpZ25vcmVkXG4iCi0iICAtWlx0XHRcdCAgZ2VuZXJhdGUgb2JqZWN0IGZpbGUgZXZlbiBhZnRlciBlcnJvcnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjE3NwotbXNnaWQgIiIKLSIgIC0tbGlzdGluZy1saHMtd2lkdGhcdCAgc2V0IHRoZSB3aWR0aCBpbiB3b3JkcyBvZiB0aGUgb3V0cHV0IGRhdGEgY29sdW1uICIKLSJvZlxuIgotIlx0XHRcdCAgdGhlIGxpc3RpbmdcbiIKLSIgIC0tbGlzdGluZy1saHMtd2lkdGgyXHQgIHNldCB0aGUgd2lkdGggaW4gd29yZHMgb2YgdGhlIGNvbnRpbnVhdGlvbiBsaW5lc1xuIgotIlx0XHRcdCAgb2YgdGhlIG91dHB1dCBkYXRhIGNvbHVtbjsgaWdub3JlZCBpZiBzbWFsbGVyIHRoYW5cbiIKLSJcdFx0XHQgIHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgbGluZVxuIgotIiAgLS1saXN0aW5nLXJocy13aWR0aFx0ICBzZXQgdGhlIG1heCB3aWR0aCBpbiBjaGFyYWN0ZXJzIG9mIHRoZSBsaW5lcyBmcm9tXG4iCi0iXHRcdFx0ICB0aGUgc291cmNlIGZpbGVcbiIKLSIgIC0tbGlzdGluZy1jb250LWxpbmVzXHQgIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29udGludWF0aW9uIGxpbmVzIHVzZWRcbiIKLSJcdFx0XHQgIGZvciB0aGUgb3V0cHV0IGRhdGEgY29sdW1uIG9mIHRoZSBsaXN0aW5nXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoxOTAgZ2FzcC5jOjM1ODgKLW1zZ2lkICIiCi0iXG4iCi0iUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyMjcKLW1zZ2lkICJtaXNzaW5nIGVtdWxhdGlvbiBtb2RlIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogYXMuYzoyNDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIGVtdWxhdGlvbiBuYW1lIGAlcyciCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LgotIzogYXMuYzo0NjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGFzc2VtYmxlciAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NDYzCi1tc2dpZCAiQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NjQgZ2FzcC5jOjM2ODIKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuIgotInRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJUaGlzIGFzc2VtYmxlciB3YXMgY29uZmlndXJlZCBmb3IgYSB0YXJnZXQgb2YgYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ3NAotbXNnaWQgIm11bHRpcGxlIGVtdWxhdGlvbiBuYW1lcyBzcGVjaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0NzYKLW1zZ2lkICJlbXVsYXRpb25zIG5vdCBoYW5kbGVkIGluIHRoaXMgY29uZmlndXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJhbGlhcyA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY2Fub25pY2FsID0gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ4MwotIywgYy1mb3JtYXQKLW1zZ2lkICJjcHUtdHlwZSA9ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo0ODUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZm9ybWF0ID0gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjQ4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJiZmQtdGFyZ2V0ID0gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUwMQotbXNnaWQgImJhZCBkZWZzeW07IGZvcm1hdCBpcyAtLWRlZnN5bSBuYW1lPXZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NTIxCi1tc2dpZCAiTm8gZmlsZSBuYW1lIGZvbGxvd2luZyAtdCBvcHRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjUzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJGYWlsZWQgdG8gcmVhZCBpbnN0cnVjdGlvbiB0YWJsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGFzLmM6NjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgbGlzdGluZyBvcHRpb24gYCVjJyIKLW1zZ3N0ciAiIgotCi0jOiBhcy5jOjg2MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdG90YWwgdGltZSBpbiBhc3NlbWJseTogJWxkLiUwNmxkXG4iCi1tc2dzdHIgIiIKLQotIzogYXMuYzo4NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGRhdGEgc2l6ZSAlbGRcbiIKLW1zZ3N0ciAiIgotCi0jLgotIy4gKiBXZSBoYXZlIGEgR1JPU1MgaW50ZXJuYWwgZXJyb3IuCi0jLiAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KLSMuCi0jOiBhdG9mLWdlbmVyaWMuYzo0MzggY29uZmlnL3RjLWEyOWsuYzo1NDQgY29uZmlnL3RjLWk4NjAuYzozMzUKLSM6IGNvbmZpZy90Yy1pODYwLmM6NzA4IGNvbmZpZy90Yy1tNjhrLmM6MzEyNCBjb25maWcvdGMtbTY4ay5jOjMxNTMKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIxNTcKLW1zZ2lkICJmYWlsZWQgc2FuaXR5IGNoZWNrLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NzUKLW1zZ2lkICJpbnZhbGlkIGlkZW50aWZpZXIgZm9yIFwiLmlmZGVmXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjEyOAotbXNnaWQgIm5vbi1jb25zdGFudCBleHByZXNzaW9uIGluIFwiLmlmXCIgc3RhdGVtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzoyMjQKLW1zZ2lkICJiYWQgZm9ybWF0IGZvciBpZmMgb3IgaWZuYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6MjU3Ci1tc2dpZCAiXCIuZW5kaWZcIiB3aXRob3V0IFwiLmlmXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI4NwotbXNnaWQgIi5lbHNlIHdpdGhvdXQgbWF0Y2hpbmcgLmlmIC0gaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6MjkyCi1tc2dpZCAiZHVwbGljYXRlIFwiZWxzZVwiIC0gaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6Mjk1Ci1tc2dpZCAiaGVyZSBpcyB0aGUgcHJldmlvdXMgXCJlbHNlXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZC5jOjI5OAotbXNnaWQgImhlcmUgaXMgdGhlIHByZXZpb3VzIFwiaWZcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6MzQzCi1tc2dpZCAiLmlmZXFzIHN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NDMwCi1tc2dpZCAiZW5kIG9mIG1hY3JvIGluc2lkZSBjb25kaXRpb25hbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25kLmM6NDMyCi1tc2dpZCAiZW5kIG9mIGZpbGUgaW5zaWRlIGNvbmRpdGlvbmFsIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzo0MzUKLW1zZ2lkICJoZXJlIGlzIHRoZSBzdGFydCBvZiB0aGUgdW50ZXJtaW5hdGVkIGNvbmRpdGlvbmFsIgotbXNnc3RyICIiCi0KLSM6IGNvbmQuYzo0MzkKLW1zZ2lkICJoZXJlIGlzIHRoZSBcImVsc2VcIiBvZiB0aGUgdW50ZXJtaW5hdGVkIGNvbmRpdGlvbmFsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjE2MQotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIHB1dCBhIGNvbW1vbiBzeW1ib2wgaW50byBzZXQgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkF0dGVtcHQgdG8gcHV0IGFuIHVuZGVmaW5lZCBzeW1ib2wgaW50byBzZXQgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6MTk2IGNvbmZpZy9vYmotZWxmLmM6MTU0MCBlY29mZi5jOjM2NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sIGAlcycgY2FuIG5vdCBiZSBib3RoIHdlYWsgYW5kIGNvbW1vbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzoyNTQgY29uZmlnL29iai1jb2ZmLmM6MTc3MAotbXNnaWQgInVucmVzb2x2ZWQgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzoyNTYgY29uZmlnL29iai1jb2ZmLmM6MTc3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgcmVsb2NhdGlvbjogc3ltYm9sIGAlcycgbm90IGluIHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzozNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJhZCB0eXBlIGZvciB3ZWFrIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWFvdXQuYzo0NTcgY29uZmlnL29iai1jb2ZmLmM6MjcwNCB3cml0ZS5jOjE4MDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGdsb2JhbCBzeW1ib2xzIG5vdCBzdXBwb3J0ZWQgaW4gY29tbW9uIHNlY3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotYW91dC5jOjUyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJMb2NhbCBzeW1ib2wgJXMgbmV2ZXIgZGVmaW5lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1hb3V0LmM6NjEyCi1tc2dpZCAic3Vic2VnbWVudCBpbmRleCB0b28gaGlnaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWJvdXQuYzozMTIgY29uZmlnL29iai12bXMuYzo1NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTG9jYWwgc3ltYm9sICVzIG5ldmVyIGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkluc2VydGluZyBcIiVzXCIgaW50byBzdHJ1Y3R1cmUgdGFibGUgZmFpbGVkOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0NTMgY29uZmlnL29iai1jb2ZmLmM6MjExNwotbXNnaWQgIi5sbiBwc2V1ZG8tb3AgaW5zaWRlIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo1MTMgY29uZmlnL29iai1jb2ZmLmM6MjE3NAotbXNnaWQgIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo1NTkgY29uZmlnL29iai1jb2ZmLmM6MjIyNwotbXNnaWQgIi5lbmRlZiBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo1OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYCVzJyBzeW1ib2wgd2l0aG91dCBwcmVjZWRpbmcgZnVuY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NjM1IGNvbmZpZy9vYmotY29mZi5jOjIzMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5leHBlY3RlZCBzdG9yYWdlIGNsYXNzICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjczNyBjb25maWcvb2JqLWNvZmYuYzoyNDA5Ci1tc2dpZCAiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo3NTcgY29uZmlnL29iai1jb2ZmLmM6MjQyOQotbXNnaWQgImJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjgwOCBjb25maWcvb2JqLWNvZmYuYzoyNDkyCi1tc2dpZCAiLnNpemUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4MjQgY29uZmlnL29iai1jb2ZmLmM6MjUwOAotbXNnaWQgIi5zY2wgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4NDIgY29uZmlnL29iai1jb2ZmLmM6MjUyNgotbXNnaWQgIi50YWcgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4NjEgY29uZmlnL29iai1jb2ZmLmM6MjU0NAotIywgYy1mb3JtYXQKLW1zZ2lkICJ0YWcgbm90IGZvdW5kIGZvciAudGFnICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjg3NiBjb25maWcvb2JqLWNvZmYuYzoyNTU5Ci1tc2dpZCAiLnR5cGUgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo4OTggY29uZmlnL29iai1jb2ZmLmM6MjU4MQotbXNnaWQgIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZiBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMDI5IGNvbmZpZy9vYmotY29mZi5jOjI3NzcKLW1zZ2lkICJtaXNtYXRjaGVkIC5lYiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMDQ4IGNvbmZpZy9vYmotY29mZi5jOjI4MTcKLW1zZ2lkICJDX0VGQ04gc3ltYm9sIG91dCBvZiBzY29wZSIKLW1zZ3N0ciAiIgotCi0jLiBTVFlQX0lORk8KLSMuIFNUWVBfTElCCi0jLiBTVFlQX09WRVIKLSM6IGNvbmZpZy9vYmotY29mZi5jOjEyNTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgc2VjdGlvbiBhdHRyaWJ1dGUgJyVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxMjYyIGNvbmZpZy9vYmotY29mZi5jOjM1MjAgY29uZmlnL3RjLXBwYy5jOjM3ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBzZWN0aW9uIGF0dHJpYnV0ZSAnJWMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjEyODQgY29uZmlnL3RjLXBwYy5jOjM4MDIgcmVhZC5jOjI0OTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3Igc2V0dGluZyBmbGFncyBmb3IgXCIlc1wiOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzoxNDAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIjB4JWx4OiBcIiVzXCIgdHlwZSA9ICVsZCwgY2xhc3MgPSAlZCwgc2VnbWVudCA9ICVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MTU5NyBjb25maWcvb2JqLWllZWUuYzo2OQotbXNnaWQgIk91dCBvZiBzdGVwXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MjAzMgotbXNnaWQgImJmZF9jb2ZmX3N3YXBfc2NuaGRyX291dCBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MjI1OQotbXNnaWQgImAuYmYnIHN5bWJvbCB3aXRob3V0IHByZWNlZGluZyBmdW5jdGlvblxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjMyMjAgY29uZmlnL29iai1pZWVlLmM6NTIyIG91dHB1dC1maWxlLmM6NTIKLSM6IG91dHB1dC1maWxlLmM6MTE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZBVEFMOiBDYW4ndCBjcmVhdGUgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MzM5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBjbG9zZSAlczogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MzQyOAotIywgYy1mb3JtYXQKLW1zZ2lkICJUb28gbWFueSBuZXcgc2VjdGlvbnM7IGNhbid0IGFkZCBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6MzgzOCBjb25maWcvdGMtbTg4ay5jOjEyNjAgY29uZmlnL3RjLXNwYXJjLmM6MzAxNgotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6Mzg0NCByZWFkLmM6MTk1NQotbXNnaWQgIk1pc3Npbmcgc2l6ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjM4NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGNvbW0gbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzozODc4IHJlYWQuYzoyMTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6Mzk3MiBjb25maWcvdGMtaTk2MC5jOjMyNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gJ2JhbCcgZW50cnkgcG9pbnQgZm9yIGxlYWZwcm9jICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQwNTEgd3JpdGUuYzoyNDk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5lZ2F0aXZlIG9mIG5vbi1hYnNvbHV0ZSBzeW1ib2wgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1jb2ZmLmM6NDA3MiB3cml0ZS5jOjI1MDkKLW1zZ2lkICJjYWxsaiB0byBkaWZmZXJlbmNlIG9mIDIgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MTE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGVtaXQgcmVsb2Mgey0gJXMtc2VnIHN5bWJvbCBcIiVzXCJ9IEAgZmlsZSBhZGRyZXNzICVsZC4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBpcyBhIENPQlIgaW5zdHJ1Y3Rpb24uICBUaGV5IGhhdmUgb25seSBhIDEzLWJpdAotIy4gZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkIGZvciBsb2NhbCBicmFuY2hlczoKLSMuIGZsYWcgYXMgZXJyb3IsIGRvbid0IGdlbmVyYXRlIHJlbG9jYXRpb24uCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0MjA4IGNvbmZpZy90Yy1pOTYwLmM6MzI5NCB3cml0ZS5jOjI2NTMKLW1zZ2lkICJjYW4ndCB1c2UgQ09CUiBmb3JtYXQgd2l0aCBleHRlcm5hbCBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWNvZmYuYzo0Mjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlZhbHVlIG9mICVsZCB0b28gbGFyZ2UgZm9yIGZpZWxkIG9mICVkIGJ5dGVzIGF0IDB4JWx4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotY29mZi5jOjQzMDIgd3JpdGUuYzoyNzYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNpZ25lZCAud29yZCBvdmVyZmxvdzsgc3dpdGNoIG1heSBiZSB0b28gbGFyZ2U7ICVsZCBhdCAweCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVjb2ZmLmM6MjM5Ci1tc2dpZCAiQ2FuJ3Qgc2V0IEdQIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWNvZmYuYzoyNDYKLW1zZ2lkICJDYW4ndCBzZXQgcmVnaXN0ZXIgbWFza3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoyNzYgY29uZmlnL3RjLXNwYXJjLmM6MzE1NyBjb25maWcvdGMtdjg1MC5jOjI2MwotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIHN5bWJvbC1uYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MjgzIGNvbmZpZy90Yy1hcmMuYzo3NzggY29uZmlnL3RjLXNwYXJjLmM6MzE2NAotIywgYy1mb3JtYXQKLW1zZ2lkICIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8MCEgSWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoyOTMgY29uZmlnL3RjLWFscGhhLmM6MzQzMCBjb25maWcvdGMtc3BhcmMuYzozMTc0Ci0jOiBjb25maWcvdGMtdjg1MC5jOjI4NQotbXNnaWQgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjMwMSBjb25maWcvdGMtYXJjLmM6Nzk2IGNvbmZpZy90Yy1zcGFyYy5jOjMxODIKLSM6IGNvbmZpZy90Yy12ODUwLmM6Mjk1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjMyNCBjb25maWcvdGMtYXJjLmM6ODE1IGNvbmZpZy90Yy12ODUwLmM6MzIyCi1tc2dpZCAiQ29tbW9uIGFsaWdubWVudCBuZWdhdGl2ZTsgMCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MzQzIGNvbmZpZy90Yy1tMzJyLmM6NjY0IGNvbmZpZy90Yy1wcGMuYzoxMzk1Ci0jOiBjb25maWcvdGMtdjg1MC5jOjM4NQotbXNnaWQgIkNvbW1vbiBhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjQwNiBjb25maWcvdGMtYXJjLmM6ODc1IGNvbmZpZy90Yy1zcGFyYy5jOjMzMDYKLSM6IGNvbmZpZy90Yy12ODUwLmM6NTYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCAuY29tbW9uIHNlZ21lbnQgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo1OTEKLW1zZ2lkICJNaXNzaW5nIHNlY3Rpb24gbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjY1NgotbXNnaWQgIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmU6IHdhbnQgYSx3LHggaW4gc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzA1Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjcxOQotbXNnaWQgIkJhZCAuc2VjdGlvbiBkaXJlY3RpdmUgLSBjaGFyYWN0ZXIgZm9sbG93aW5nIG5hbWUgaXMgbm90ICcjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjc1MQotbXNnaWQgIlVucmVjb2duaXplZCBzZWN0aW9uIGF0dHJpYnV0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjc3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJTZXR0aW5nIGluY29ycmVjdCBzZWN0aW9uIHR5cGUgZm9yICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6NzgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlNldHRpbmcgaW5jb3JyZWN0IHNlY3Rpb24gYXR0cmlidXRlcyBmb3IgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo5MDcKLW1zZ2lkICIucHJldmlvdXMgd2l0aG91dCBjb3JyZXNwb25kaW5nIC5zZWN0aW9uOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6OTU2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm11bHRpcGxlIC5zeW12ZXIgZGlyZWN0aXZlcyBmb3Igc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo5NjUKLW1zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIGluIC5zeW12ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzo5ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWlzc2luZyB2ZXJzaW9uIG5hbWUgaW4gYCVzJyBmb3Igc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxMTkzIGNvbmZpZy9vYmotc29tLmM6MTQ4IGNvbmZpZy9vYmotc29tLmM6MTkzCi1tc2dpZCAiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjEyMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBgJXMnIGluIC5zaXplIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjEyMjMKLW1zZ2lkICJtaXNzaW5nIGV4cHJlc3Npb24gaW4gLnNpemUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTI5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyB1bnJlY29nbml6ZWQgc3ltYm9sIHR5cGUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTQ2NAotbXNnaWQgIi5zaXplIGV4cHJlc3Npb24gdG9vIGNvbXBsaWNhdGVkIHRvIGZpeCB1cCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE0OTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImludmFsaWQgYXR0ZW1wdCB0byBkZWNsYXJlIGV4dGVybmFsIHZlcnNpb24gbmFtZSBhcyBkZWZhdWx0IGluIHN5bWJvbCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotZWxmLmM6MTYyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJGYWlsZWQgdG8gc2V0IHVwIGRlYnVnZ2luZyBpbmZvcm1hdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1lbGYuYzoxNjQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IHN0YXJ0IHdyaXRpbmcgLm1kZWJ1ZyBzZWN0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLWVsZi5jOjE2NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ291bGQgbm90IHdyaXRlIC5tZGVidWcgc2VjdGlvbjogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1pZWVlLmM6NDYwCi1tc2dpZCAidG9vIG1hbnkgc2VjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1zb20uYzoxMzEKLW1zZ2lkICJPbmx5IG9uZSAudmVyc2lvbiBwc2V1ZG8tb3AgcGVyIGZpbGUhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotc29tLmM6MTU3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZBVEFMOiBBdHRhY2hpbmcgdmVyc2lvbiBoZWFkZXIgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1zb20uYzoxNzYKLW1zZ2lkICJPbmx5IG9uZSAuY29weXJpZ2h0IHBzZXVkby1vcCBwZXIgZmlsZSEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai1zb20uYzoyMDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRkFUQUw6IEF0dGFjaGluZyBjb3B5cmlnaHQgaGVhZGVyICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvbXBpbGVyIGVtaXR0ZWQgemVyby1zaXplIGNvbW1vbiBzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiY29tcGlsZXIgcmVkZWZpbmVkIHplcm8tc2l6ZSBjb21tb24gc3ltYm9sIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo1OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ291bGRuJ3QgY3JlYXRlIFZNUyBvYmplY3QgZmlsZSBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo2MjMKLW1zZ2lkICJJL08gZXJyb3Igd3JpdGluZyBWTVMgb2JqZWN0IGZpbGUgKGxlbmd0aCBwcmVmaXgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NjM3Ci1tc2dpZCAiSS9PIGVycm9yIHdyaXRpbmcgVk1TIG9iamVjdCBmaWxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MTI0MAotbXNnaWQgIkNvdWxkbid0IGZpbmQgc291cmNlIGZpbGUgXCIlc1wiLCBzdGF0dXM9JSVYJXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoxNzQ5IGNvbmZpZy9vYmotdm1zLmM6MjkzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWJ1Z2dlciBmb3J3YXJkIHJlZmVyZW5jZSBlcnJvciwgZGJ4IHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoxODI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlZhcmlhYmxlIGRlc2NyaXB0b3IgJWQgdG9vIGNvbXBsaWNhdGVkLiAgRGVmaW5lZCBhcyBgdm9pZCAqJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyMTQ0Ci1tc2dpZCAiIgotIioqKldhcm5pbmcgLSB0aGUgYXNzZW1ibHkgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGhhcyBwbGFjZWQgXG4iCi0iIGdsb2JhbCBjb25zdGFudChzKSBpbiB0aGUgdGV4dCBwc2VjdC4gIFRoZXNlIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB0byBcbiIKLSIgb3RoZXIgbW9kdWxlcywgc2luY2UgdGhpcyBpcyBub3QgdGhlIGNvcnJlY3Qgd2F5IHRvIGhhbmRsZSB0aGlzLiBZb3UgXG4iCi0iIGhhdmUgdHdvIG9wdGlvbnM6IDEpIGdldCBhIHBhdGNoZWQgY29tcGlsZXIgdGhhdCBkb2VzIG5vdCBwdXQgZ2xvYmFsIFxuIgotIiBjb25zdGFudHMgaW4gdGhlIHRleHQgcHNlY3QsIG9yIDIpIHJlbW92ZSB0aGUgJ2NvbnN0JyBrZXl3b3JkIGZyb20gXG4iCi0iIGRlZmluaXRpb25zIG9mIGdsb2JhbCB2YXJpYWJsZXMgaW4geW91ciBzb3VyY2UgbW9kdWxlKHMpLiAgRG9uJ3Qgc2F5IFxuIgotIiBJIGRpZG4ndCB3YXJuIHlvdSEgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyNDYzCi0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2luZXIgb3V0cHV0OiAlZCBpcyBhbiB1bmtub3duIHVudHlwZWQgdmFyaWFibGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6MjY4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWJ1Z2dlciBvdXRwdXQ6IHN0cnVjdHVyZSBlbGVtZW50IGAlcycgaGFzIHVuZGVmaW5lZCB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6Mjc5MgotIywgYy1mb3JtYXQKLW1zZ2lkICJkZWJ1Z2dlciBvdXRwdXQ6ICVkIGlzIGFuIHVua25vd24gdHlwZSBvZiB2YXJpYWJsZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzoyOTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRlYnVnZ2VyIG91dHB1dDogVW5hYmxlIHRvIHJlc29sdmUgJWQgY2lyY3VsYXIgcmVmZXJlbmNlcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzozMTMxCi0jLCBjLWZvcm1hdAotbXNnaWQgIk1vZHVsZSBuYW1lIHRydW5jYXRlZDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjM0MTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sICVzIHJlcGxhY2VkIGJ5ICVzXG4iCi1tc2dzdHIgIiIKLQotIy4gaW1wb3NzaWJsZQotIzogY29uZmlnL29iai12bXMuYzozNjk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gVk1TIHBzZWN0IHR5cGUgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzozNzM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdsb2JhbHN5bWJvbCBhdHRyaWJ1dGUgZm9yIHN5bWJvbCAlcyB3YXMgdW5leHBlY3RlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzozODg1Ci1tc2dpZCAiSW52YWxpZCBkYXRhIHR5cGUgZm9yIGdsb2JhbHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6Mzg5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIGdsb2JhbHZhbHVlIG9mICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDI0NwotbXNnaWQgIkNvdWxkbid0IGZpbmQgZml4dXAgZnJhZ21lbnQgd2hlbiBjaGVja2luZyBmb3IgaW5kaXJlY3QgcmVmZXJlbmNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDU5MSBjb25maWcvb2JqLXZtcy5jOjQ3MzMKLW1zZ2lkICJGaXh1cCBkYXRhIGFkZHN5IGFuZCBzdWJzeSBkb24ndCBoYXZlIHRoZSBzYW1lIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NTk1IGNvbmZpZy9vYmotdm1zLmM6NDczNwotbXNnaWQgIkZpeHVwIGRhdGEgYWRkc3kgYW5kIHN1YnN5IGRvbid0IGhhdmUgYW4gYXBwcm9wcmlhdGUgdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvb2JqLXZtcy5jOjQ1OTggY29uZmlnL29iai12bXMuYzo0NzQwCi1tc2dpZCAiRml4dXAgZGF0YSBpcyBlcnJvbmVvdXNseSBcInBjcmVsXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL29iai12bXMuYzo0NjE0IGNvbmZpZy9vYmotdm1zLmM6NDc1OQotbXNnaWQgIkZpeHVwIGRhdHVtIGlzIG5vdCBhIGxvbmd3b3JkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDYxOCBjb25maWcvb2JqLXZtcy5jOjQ3NjMKLW1zZ2lkICJGaXh1cCBkYXR1bSBpcyBub3QgXCJmaXhQLT5meF9hZGRzeVwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDgzNAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iZysrIHdyb3RlIGFuIGV4dGVybiByZWZlcmVuY2UgdG8gYCVzJyBhcyBhIHJvdXRpbmUuXG4iCi0iSSB3aWxsIGZpeCBpdCwgYnV0IEkgaG9wZSB0aGF0IGl0IHdhcyBub3RlIHJlYWxseSBhIHJvdXRpbmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDk2NgotbXNnaWQgIkNhbid0IGhhbmRsZSBnbG9iYWwgeHRvcnMgc3ltYm9scyB5ZXQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy9vYmotdm1zLmM6NDk2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duICVzIgotbXNnc3RyICIiCi0KLSMuCi0jLiAqCUVycm9yIG90aGVyd2lzZS4KLSMuCi0jOiBjb25maWcvb2JqLXZtcy5jOjUwNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5oYW5kbGVkIHN0YWIgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjE2MCBjb25maWcvdGMtc3BhcmMuYzozMzU4Ci1tc2dpZCAiVW5rbm93biBzZWdtZW50IHR5cGUiCi1tc2dzdHIgIiIKLQotIy4gUHJvYmFibHkgYSBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtPyAgR2l2ZSB1cCBub3cuCi0jOiBjb25maWcvdGMtYTI5ay5jOjMzMCBjb25maWcvdGMtaHBwYS5jOjEzMzYgY29uZmlnL3RjLWk4NjAuYzoyMDIKLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAxNiBjb25maWcvdGMtbWlwcy5jOjEwNTggY29uZmlnL3RjLXNwYXJjLmM6NzE1Ci1tc2dpZCAiQnJva2VuIGFzc2VtYmxlci4gIE5vIGFzc2VtYmx5IGF0dGVtcHRlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzozNzUgY29uZmlnL3RjLWFyYy5jOjUzNCBjb25maWcvdGMtZDEwdi5jOjQ4MQotIzogY29uZmlnL3RjLWQzMHYuYzo1NDAgY29uZmlnL3RjLWg4MzAwLmM6MzA1IGNvbmZpZy90Yy1oODUwMC5jOjI5NwotIzogY29uZmlnL3RjLW1jb3JlLmM6NTA5IGNvbmZpZy90Yy1tbjEwMjAwLmM6OTM2IGNvbmZpZy90Yy1tbjEwMzAwLmM6OTkyCi0jOiBjb25maWcvdGMtcHBjLmM6MTg1MCBjb25maWcvdGMtc2guYzo0NzggY29uZmlnL3RjLXRpYzgwLmM6MjkxCi0jOiBjb25maWcvdGMtdjg1MC5jOjIwMzMgY29uZmlnL3RjLXc2NS5jOjI1NyBjb25maWcvdGMtejhrLmM6MzQxCi1tc2dpZCAibWlzc2luZyBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDE1IGNvbmZpZy90Yy1ocHBhLmM6MTQ1MCBjb25maWcvdGMtaTg2MC5jOjQwNwotIzogY29uZmlnL3RjLWk4NjAuYzo0MjMgY29uZmlnL3RjLXNwYXJjLmM6MTE5MSBjb25maWcvdGMtc3BhcmMuYzoxMTk3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gb3Bjb2RlOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gb3Bjb2RlIGAlcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6NDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlRvbyBtYW55IG9wZXJhbmRzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjQ3NCBjb25maWcvdGMtYTI5ay5jOjUwNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbW1lZGlhdGUgdmFsdWUgb2YgJWxkIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjg5MiBjb25maWcvdGMtaTg2MC5jOjk0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgcmVsb2NhdGlvbiB0eXBlOiAweCUwMngiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo5MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibmVlZCAlbzNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYTI5ay5jOjkzMgotbXNnaWQgImEyOWtfY29udmVydF9mcmFnXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzo5NDEKLW1zZ2lkICJhMjlrX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxMDkyCi0jLCBjLWZvcm1hdAotbXNnaWQgImxhYmVsIFwiJCVkXCIgcmVkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hMjlrLmM6MTE2NQotbXNnaWQgIkludmFsaWQgZXhwcmVzc2lvbiBhZnRlciAlJSUlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWEyOWsuYzoxMTc2Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBpbiAmIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yOiBjYW4ndCBoYXNoIG9wY29kZSBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo3NTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGhhc2ggbWFjcm8gYCVzJzogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6ODMyIGNvbmZpZy90Yy1pOTYwLmM6MjczNgotbXNnaWQgInN5bnRheCBlcnJvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo5MDUgY29uZmlnL3RjLWFybS5jOjQ5ODIgY29uZmlnL3RjLWg4MzAwLmM6MTQxMwotIzogY29uZmlnL3RjLWg4NTAwLmM6MTIyMiBjb25maWcvdGMtaHBwYS5jOjI2ODQgY29uZmlnL3RjLWk4NjAuYzo4MTMKLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDEyNSBjb25maWcvdGMtbTg4ay5jOjExMDYgY29uZmlnL3RjLW5zMzJrLmM6MTU4OAotIzogY29uZmlnL3RjLXNwYXJjLmM6MjQzMyBjb25maWcvdGMtejhrLmM6MTM1NQotbXNnaWQgIkJhZCBjYWxsIHRvIE1EX0FUT0YoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo5NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5rbm93biBDUFUgaWRlbnRpZmllciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjk5OQotbXNnaWQgIiIKLSJBbHBoYSBvcHRpb25zOlxuIgotIi0zMmFkZHJcdFx0XHR0cmVhdCBhZGRyZXNzZXMgYXMgMzItYml0IHZhbHVlc1xuIgotIi1GXHRcdFx0bGFjayBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgc3VwcG9ydFxuIgotIi1tZXY0IHwgLW1ldjQ1IHwgLW1ldjUgfCAtbWV2NTYgfCAtbXBjYTU2IHwgLW1ldjYgfCAtbWFsbFxuIgotIlx0XHRcdHNwZWNpZnkgdmFyaWFudCBvZiBBbHBoYSBhcmNoaXRlY3R1cmVcbiIKLSItbTIxMDY0IHwgLW0yMTA2NiB8IC1tMjExNjQgfCAtbTIxMTY0YSB8IC1tMjExNjRwYyB8IC1tMjEyNjRcbiIKLSJcdFx0XHR0aGVzZSB2YXJpYW50cyBpbmNsdWRlIFBBTGNvZGUgb3Bjb2Rlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjEwMDkKLW1zZ2lkICIiCi0iVk1TIG9wdGlvbnM6XG4iCi0iLStcdFx0XHRoYXNoIGVuY29kZSAoZG9uJ3QgdHJ1bmNhdGUpIG5hbWVzIGxvbmdlciB0aGFuIDY0IGNoYXJhY3RlcnNcbiIKLSItSFx0XHRcdHNob3cgbmV3IHN5bWJvbCBhZnRlciBoYXNoIHRydW5jYXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxMTY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaGFuZGxlZCByZWxvY2F0aW9uIHR5cGUgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTE3OAotbXNnaWQgIm5vbi1hYnNvbHV0ZSBleHByZXNzaW9uIGluIGNvbnN0YW50IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjExOTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidHlwZSAlZCByZWxvYyBkb25lP1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjEyNDMgY29uZmlnL3RjLWFscGhhLmM6MTI1MCBjb25maWcvdGMtbWlwcy5jOjczMjkKLW1zZ2lkICJVc2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTQwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgcmVwcmVzZW50IGAlcycgcmVsb2NhdGlvbiBpbiBvYmplY3QgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoxNDE1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsIGVycm9yPyBjYW5ub3QgZ2VuZXJhdGUgYCVzJyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE0NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZnJhbWUgcmVnIGV4cGVjdGVkLCB1c2luZyAkJWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjE3OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVzIG5vdCBiZXR3ZWVuICVkIGFuZCAlZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MTg5MSBjb25maWcvdGMtYXJjLmM6NTQ3IGNvbmZpZy90Yy1kMTB2LmM6NTcwCi0jOiBjb25maWcvdGMtZDMwdi5jOjYyMyBjb25maWcvdGMtbW4xMDIwMC5jOjk5MSBjb25maWcvdGMtbW4xMDMwMC5jOjEwNTgKLSM6IGNvbmZpZy90Yy1wcGMuYzoxODE2IGNvbmZpZy90Yy1wcGMuYzoxOTIzIGNvbmZpZy90Yy1wcGMuYzoxOTM1Ci0jOiBjb25maWcvdGMtdjg1MC5jOjE4MTkgY29uZmlnL3RjLXY4NTAuYzoxODQyIGNvbmZpZy90Yy12ODUwLmM6MjA1NQotbXNnaWQgInRvbyBtYW55IGZpeHVwcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMDE2IGNvbmZpZy90Yy1hbHBoYS5jOjIwNzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW5hcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIG9wY29kZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIwMTggY29uZmlnL3RjLWFscGhhLmM6MjA3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGNvZGUgYCVzJyBub3Qgc3VwcG9ydGVkIGZvciB0YXJnZXQgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjAyMiBjb25maWcvdGMtYWxwaGEuYzoyMDc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3Bjb2RlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjEzMQotbXNnaWQgImNhbiBub3QgcmVzb2x2ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIyNjkgY29uZmlnL3RjLWFscGhhLmM6MjQ0NgotbXNnaWQgIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXRhKSB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyMjc2IGNvbmZpZy90Yy1hbHBoYS5jOjIyOTggY29uZmlnL3RjLWFscGhhLmM6MjQ1OQotIzogY29uZmlnL3RjLWFscGhhLmM6MjY4MSBjb25maWcvdGMtYWxwaGEuYzoyNzI4IGNvbmZpZy90Yy1hbHBoYS5jOjI3NzYKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI4NjUgY29uZmlnL3RjLWFscGhhLmM6MzA2NiBjb25maWcvdGMtYWxwaGEuYzozMTY3Ci1tc2dpZCAibWFjcm8gcmVxdWlyZXMgJGF0IHJlZ2lzdGVyIHdoaWxlIG5vYXQgaW4gZWZmZWN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjIyNzggY29uZmlnL3RjLWFscGhhLmM6MjMwMCBjb25maWcvdGMtYWxwaGEuYzoyNDYxCi1tc2dpZCAibWFjcm8gcmVxdWlyZXMgJGF0IHdoaWxlICRhdCBpbiB1c2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjQwOCBleHByLmM6ODYgcmVhZC5jOjMxMjUKLW1zZ2lkICJiaWdudW0gaW52YWxpZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjI0MTAgZXhwci5jOjg4IHJlYWQuYzozMTI3IHJlYWQuYzozNDU3IHJlYWQuYzo0MzUzCi1tc2dpZCAiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzoyNDE1Ci1tc2dpZCAiY2FuJ3QgaGFuZGxlIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MjQ1MgotbXNnaWQgIm92ZXJmbG93IGluIGxpdGVyYWwgKC5saXQ4KSB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNDAxIGNvbmZpZy90Yy1wcGMuYzoxMzQ0IGNvbmZpZy90Yy1wcGMuYzozNTQ4Ci0jOiByZWFkLmM6MTM3NwotIywgYy1mb3JtYXQKLW1zZ2lkICIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM0MzkgY29uZmlnL3RjLWFscGhhLmM6MzQ0OCBjb25maWcvdGMtcHBjLmM6MzU4NQotIzogcmVhZC5jOjEzOTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGVuZ3RoIG9mIC5jb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozNTUwIGVjb2ZmLmM6MzEwOAotbXNnaWQgIi5lbnQgZGlyZWN0aXZlIGhhcyBubyBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM1NTgKLW1zZ2lkICJuZXN0ZWQgLmVudCBkaXJlY3RpdmVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM1OTQgZWNvZmYuYzozMDU2Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgaGFzIG5vIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzYwMwotbXNnaWQgIi5lbmQgZGlyZWN0aXZlIG5hbWVzIGRpZmZlcmVudCBzeW1ib2wgdGhhbiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM2NzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBhcmd1bWVudCAlZCB0byAucHJvbG9ndWUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3MDYKLW1zZ2lkICJFQ09GRiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3MjcKLW1zZ2lkICJVbmtub3duIHNlY3Rpb24gZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3NjQKLW1zZ2lkICIuZW50IGRpcmVjdGl2ZSBoYXMgbm8gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM3OTIKLW1zZ2lkICJCYWQgLmZyYW1lIGRpcmVjdGl2ZSAxLi8yLiBwYXJhbSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODA0Ci1tc2dpZCAiQmFkIC5mcmFtZSBkaXJlY3RpdmUgMy4vNC4gcGFyYW0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6MzgyOQotbXNnaWQgIi5wZGVzYyBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4MzcKLW1zZ2lkICIucGRlc2MgaGFzIG5vIG1hdGNoaW5nIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6Mzg0NwotbXNnaWQgIi5wZGVzYyBkaXJlY3RpdmUgaGFzIG5vIGVudHJ5IHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzozODU5Ci1tc2dpZCAiTm8gY29tbWEgYWZ0ZXIgLnBkZXNjIDxlbnRyeW5hbWU+IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM4ODIKLW1zZ2lkICJ1bmtub3duIHByb2NlZHVyZSBraW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM5NzcKLW1zZ2lkICIubmFtZSBkaXJlY3RpdmUgbm90IGluIGxpbmsgKC5saW5rKSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjM5ODUKLW1zZ2lkICIubmFtZSBkaXJlY3RpdmUgaGFzIG5vIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MDIwCi1tc2dpZCAiTm8gc3ltYm9sIGFmdGVyIC5saW5rYWdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQwNDkKLW1zZ2lkICJObyBzeW1ib2wgYWZ0ZXIgLmNvZGVfYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0MDg0IGVjb2ZmLmM6MzI3MwotbXNnaWQgIkJhZCAubWFzayBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDEwNiBlY29mZi5jOjMyMDQKLW1zZ2lkICJCYWQgLmZtYXNrIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0Mjc3IHJlYWQuYzoyMTQ0IHJlYWQuYzoyNjk2IHN0YWJzLmM6NDYwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkV4cGVjdGVkIGNvbW1hIGFmdGVyIG5hbWUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSMuIHN5bWJvbFAtPnN5X290aGVyID0gKHNpZ25lZCBjaGFyKSB0ZW1wOwotIzogY29uZmlnL3RjLWFscGhhLmM6NDI4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmhhbmRsZWQ6IC5wcm9jICVzLCVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHJpZWQgdG8gLnNldCB1bnJlY29nbml6ZWQgbW9kZSBgJXMnIgotbXNnc3RyICIiCi0KLSMuIG5vdCBmYXRhbCwgYnV0IGl0IG1pZ2h0IG5vdCB3b3JrIGluIHRoZSBlbmQKLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzNDAKLW1zZ2lkICJGaWxlIG92ZXJyaWRlcyBuby1iYXNlLXJlZ2lzdGVyIG9wdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDM1NwotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgYmFzZSByZWdpc3RlciwgdXNpbmcgJCVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYWxwaGEuYzo0Mzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkLiBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hbHBoYS5jOjQzODMgY29uZmlnL3RjLWQzMHYuYzoyMTYzCi1tc2dpZCAiQWxpZ25tZW50IG5lZ2F0aXZlOiAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFscGhhLmM6NDY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJDaG9zZSBHUCB2YWx1ZSBvZiAlbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTM2Ci1tc2dpZCAiIgotIkFSQyBvcHRpb25zOlxuIgotIi1FQlx0XHRcdGdlbmVyYXRlIGJpZyBlbmRpYW4gb3V0cHV0XG4iCi0iLUVMXHRcdFx0Z2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBvdXRwdXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTU0IGNvbmZpZy90Yy1hcmMuYzoxNzcgY29uZmlnL3RjLWFyYy5jOjkyMQotIzogY29uZmlnL3RjLWhwcGEuYzoxMjk4IGNvbmZpZy90Yy1ocHBhLmM6NTA1NCBjb25maWcvdGMtaHBwYS5jOjUwNjAKLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTA2NiBjb25maWcvdGMtbW4xMDMwMC5jOjcyMSBjb25maWcvdGMtbW4xMDMwMC5jOjE2NDYKLW1zZ2lkICJjb3VsZCBub3Qgc2V0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTc0Ci1tc2dpZCAidmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoyNTMgY29uZmlnL3RjLW1uMTAyMDAuYzoxMzU0IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTU2NQotIzogY29uZmlnL3RjLXBwYy5jOjExMDEgY29uZmlnL3RjLXY4NTAuYzoxNjE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglcyBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjM4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIHN5bnRheCBmb3JtYXQgY2hhcmFjdGVyIGAlYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjQ4NwotbXNnaWQgInRvbyBtYW55IHN1ZmZpeGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo1MzIgY29uZmlnL3RjLWQxMHYuYzo0NzkgY29uZmlnL3RjLWQzMHYuYzo1MzgKLSM6IGNvbmZpZy90Yy1tbjEwMjAwLmM6OTMzIGNvbmZpZy90Yy1tbjEwMzAwLmM6OTg5IGNvbmZpZy90Yy1wcGMuYzoxODQ4Ci0jOiBjb25maWcvdGMtdGljODAuYzoyODcgY29uZmlnL3RjLXY4NTAuYzoyMDMwCi1tc2dpZCAiaWxsZWdhbCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2MTkgY29uZmlnL3RjLW1uMTAyMDAuYzoxMDMyIGNvbmZpZy90Yy1tbjEwMzAwLmM6MTEyOAotIzogY29uZmlnL3RjLXBwYy5jOjE5NzIgY29uZmlnL3RjLXY4NTAuYzoyMTA4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImp1bmsgYXQgZW5kIG9mIGxpbmU6IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjY1OQotbXNnaWQgIjggYnl0ZSBpbnN0cnVjdGlvbiBpbiBkZWxheSBzbG90IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo2NjEKLW1zZ2lkICI4IGJ5dGUganVtcCBpbnN0cnVjdGlvbiB3aXRoIGRlbGF5IHNsb3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjY2OQotbXNnaWQgImNvbmRpdGlvbmFsIGJyYW5jaCBmb2xsb3dzIHNldCBvZiBmbGFncyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6NzQ4IGNvbmZpZy90Yy1hcm0uYzo2MDM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBpbnN0cnVjdGlvbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo3NzEKLW1zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6Nzg4Ci1tc2dpZCAiaWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo4MDMKLW1zZ2lkICJleHBlY3RlZCBjb21tYSBhZnRlciBjb21tb24gbGVuZ3RoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo4OTYKLW1zZ2lkICIuY3B1IGNvbW1hbmQgbXVzdCBhcHBlYXIgYmVmb3JlIGFueSBpbnN0cnVjdGlvbnMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjkxNQotbXNnaWQgIi5jcHUgY29uZmxpY3RzIHdpdGggcHJldmlvdXMgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjkyNgotbXNnaWQgImJhZCAuY3B1IG9wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzo5NTAgY29uZmlnL3RjLXBwYy5jOjI2MjEKLW1zZ2lkICJtaXNzaW5nIHJlbmFtZSBzdHJpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjk2MgotbXNnaWQgImludmFsaWQgc3ltYm9sIHRvIHJlbmFtZSB0byIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTAwOSBjb25maWcvdGMtZDEwdi5jOjI3NCBjb25maWcvdGMtZDMwdi5jOjM1MwotIzogY29uZmlnL3RjLW1pcHMuYzo4NzM2IGNvbmZpZy90Yy1tbjEwMjAwLmM6MzU2IGNvbmZpZy90Yy1wcGMuYzo0MzY5Ci0jOiBjb25maWcvdGMtc2guYzoxMTg3IGNvbmZpZy90Yy12ODUwLmM6MTI3NgotbXNnaWQgImJhZCBjYWxsIHRvIG1kX2F0b2YiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEwOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibWlzc2luZyAnKScgaW4gJS1vcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTEzMAotbXNnaWQgImV4cHJlc3Npb24gdG9vIGNvbXBsZXggZm9yICUlc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFyYy5jOjEzMjQgY29uZmlnL3RjLWFybS5jOjI5MzcgY29uZmlnL3RjLWQxMHYuYzoxNDQ4Ci0jOiBjb25maWcvdGMtZDMwdi5jOjE4MTAgY29uZmlnL3RjLW1pcHMuYzozMTk2IGNvbmZpZy90Yy1taXBzLmM6NDEyOAotIzogY29uZmlnL3RjLW1pcHMuYzo0OTEzIGNvbmZpZy90Yy1taXBzLmM6NTQ1OSBjb25maWcvdGMtcHBjLmM6NDcwNAotIzogY29uZmlnL3RjLXY4NTAuYzoyMzM5Ci1tc2dpZCAiZXhwcmVzc2lvbiB0b28gY29tcGxleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJjLmM6MTM5MCBjb25maWcvdGMtcHBjLmM6NDgwNyBjb25maWcvdGMtdjg1MC5jOjIzODMKLW1zZ2lkICJ1bnJlc29sdmVkIGV4cHJlc3Npb24gdGhhdCBtdXN0IGJlIHJlc29sdmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcmMuYzoxNDU0IGNvbmZpZy90Yy1zcGFyYy5jOjI4ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGNhbid0IGV4cG9ydCByZWxvYyB0eXBlICVkIChgJXMnKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6OTgzCi1tc2dpZCAiTGl0ZXJhbCBQb29sIE92ZXJmbG93IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMTAzCi1tc2dpZCAiSW52YWxpZCBzeW50YXggZm9yIC5yZXEgZGlyZWN0aXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTEzOQotbXNnaWQgIk5vdGhpbmcgdG8gcHV0IGluIHRoZSBwb29sXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjExNTEKLW1zZ2lkICJJbnNlcnRpbmcgaW1wbGljaXQgcG9vbCBhdCBjaGFuZ2Ugb2Ygc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTE4MyBjb25maWcvdGMtbWlwcy5jOjk4NTEgcmVhZC5jOjIwMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWxpZ25tZW50IHRvbyBsYXJnZTogJWQuIGFzc3VtZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMTg2IHJlYWQuYzoyMDQzCi1tc2dpZCAiQWxpZ25tZW50IG5lZ2F0aXZlLiAwIGFzc3VtZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMjUxCi1tc2dpZCAic2VsZWN0ZWQgcHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgVEhVTUIgb3Bjb2RlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTI2MwotbXNnaWQgInNlbGVjdGVkIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IEFSTSBvcGNvZGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMjcyCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgaW5zdHJ1Y3Rpb24gc2l6ZSBzZWxlY3RlZCAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMzA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgb3BlcmFuZCB0byAuY29kZSBkaXJlY3RpdmUgKCVkKSAoZXhwZWN0aW5nIDE2IG9yIDMyKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTMxOQotbXNnaWQgIkdhcmJhZ2UgZm9sbG93aW5nIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSMuIEluIHRoZSBmZXcgY2FzZXMgd2hlcmUgd2UgbWlnaHQgYmUgYWJsZSB0byBhY2NlcHQgc29tZXRoaW5nIGVsc2UKLSMuIHRoaXMgZXJyb3IgY2FuIGJlIG92ZXJyaWRkZW4KLSM6IGNvbmZpZy90Yy1hcm0uYzoxMzY3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlZ2lzdGVyIGV4cGVjdGVkLCBub3QgJyUuMTAwcyciCi1tc2dzdHIgIiIKLQotIy4gSW4gdGhlIGZldyBjYXNlcyB3aGVyZSB3ZSBtaWdodCBiZSBhYmxlIHRvIGFjY2VwdCBzb21ldGhpbmcgZWxzZQotIy4gdGhpcyBlcnJvciBjYW4gYmUgb3ZlcnJpZGRlbgotIzogY29uZmlnL3RjLWFybS5jOjEzOTMKLW1zZ2lkICI8cHNyKGYpPiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTQyNAotbXNnaWQgIklsbGVnYWwgY28tcHJvY2Vzc29yIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTQzMQotbXNnaWQgIkJhZCBvciBtaXNzaW5nIGNvLXByb2Nlc3NvciBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE0NTYKLW1zZ2lkICJiYWQgb3IgbWlzc2luZyBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNDYyCi1tc2dpZCAiaW1tZWRpYXRlIGNvLXByb2Nlc3NvciBleHByZXNzaW9uIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jLiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0jLiB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuCi0jOiBjb25maWcvdGMtYXJtLmM6MTQ4NwotbXNnaWQgIkNvLXByb2Nlc3NvciByZWdpc3RlciBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jLiBJbiB0aGUgZmV3IGNhc2VzIHdoZXJlIHdlIG1pZ2h0IGJlIGFibGUgdG8gYWNjZXB0IHNvbWV0aGluZyBlbHNlCi0jLiB0aGlzIGVycm9yIGNhbiBiZSBvdmVycmlkZGVuCi0jOiBjb25maWcvdGMtYXJtLmM6MTUxMQotbXNnaWQgIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNTI5Ci1tc2dpZCAiaW1tZWRpYXRlIGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE1NDQKLW1zZ2lkICJjby1wcm9jZXNzb3IgYWRkcmVzcyBtdXN0IGJlIHdvcmQgYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTU1MAotbXNnaWQgIm9mZnNldCB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2MDAKLW1zZ2lkICJwYyBtYXkgbm90IGJlIHVzZWQgaW4gcG9zdC1pbmNyZW1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE2MTYgY29uZmlnL3RjLWFybS5jOjI3MjcKLW1zZ2lkICJwcmUtaW5kZXhlZCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjMwIGNvbmZpZy90Yy1hcm0uYzoyNzQwIGNvbmZpZy90Yy1hcm0uYzozMDg5Ci1tc2dpZCAibWlzc2luZyBdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNjQxCi1tc2dpZCAicGMgbWF5IG5vdCBiZSB1c2VkIHdpdGggd3JpdGUtYmFjayIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTY5NgotbXNnaWQgIjxwc3I+IGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNzU4IGNvbmZpZy90Yy1hcm0uYzoyMzc4Ci1tc2dpZCAiUmVnaXN0ZXIgb3Igc2hpZnQgZXhwcmVzc2lvbiBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MTc3MiBjb25maWcvdGMtYXJtLmM6MjA5MCBjb25maWcvdGMtYXJtLmM6MjM0NQotIzogY29uZmlnL3RjLWFybS5jOjIzNjUKLW1zZ2lkICJJbnZhbGlkIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoxNzgzCi1tc2dpZCAiRXJyb3I6IHVucmVjb2duaXNlZCBzeW50YXggZm9yIHNlY29uZCBhcmd1bWVudCB0byBtc3IgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE4MzMKLW1zZ2lkICJyZGhpLCByZGxvIGFuZCBybSBtdXN0IGFsbCBiZSBkaWZmZXJlbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE4OTAKLW1zZ2lkICJyZCBhbmQgcm0gc2hvdWxkIGJlIGRpZmZlcmVudCBpbiBtdWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjE5NDcKLW1zZ2lkICJyZCBhbmQgcm0gc2hvdWxkIGJlIGRpZmZlcmVudCBpbiBtbGEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIwNzQKLW1zZ2lkICJiYWRfc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjEyMSBjb25maWcvdGMtYXJtLmM6MjE5OQotbXNnaWQgIlNoaWZ0IGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIxNjMKLW1zZ2lkICJJbnZhbGlkIGltbWVkaWF0ZSBzaGlmdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjE5MgotbXNnaWQgInNoaWZ0IHJlcXVpcmVzIHJlZ2lzdGVyIG9yICNleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyMTkzCi1tc2dpZCAic2hpZnQgcmVxdWlyZXMgI2V4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjIzMzYgY29uZmlnL3RjLWFybS5jOjI3NzAKLW1zZ2lkICJDb25zdGFudCBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNDMyCi1tc2dpZCAiSW52YWxpZCBmbG9hdGluZyBwb2ludCBpbW1lZGlhdGUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjQzNQotbXNnaWQgIkZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG9yIGltbWVkaWF0ZSBleHByZXNzaW9uIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNTc0Ci1tc2dpZCAiYWRkcmVzcyBvZmZzZXQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNjQ1Ci1tc2dpZCAiUHJvY2Vzc29yIGRvZXMgbm90IHN1cHBvcnQgaGFsZndvcmRzIG9yIHNpZ25lZCBieXRlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjY2NwotbXNnaWQgIkFkZHJlc3MgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI2OTggY29uZmlnL3RjLWFybS5jOjI3MTIgY29uZmlnL3RjLWFybS5jOjI3NTAKLW1zZ2lkICJkZXN0aW5hdGlvbiByZWdpc3RlciBzYW1lIGFzIHdyaXRlLWJhY2sgYmFzZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyNzkwCi1tc2dpZCAibGl0ZXJhbCBwb29sIGluc2VydGlvbiBmYWlsZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI4MjYKLW1zZ2lkICJQcmUtaW5jcmVtZW50IGluc3RydWN0aW9uIHdpdGggdHJhbnNsYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyODY4Ci1tc2dpZCAiQmFkIHJhbmdlIGluIHJlZ2lzdGVyIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjI4NzYgY29uZmlnL3RjLWFybS5jOjI4ODUgY29uZmlnL3RjLWFybS5jOjI5MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZzogRHVwbGljYXRlZCByZWdpc3RlciAociVkKSBpbiByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyODg4Ci1tc2dpZCAiV2FybmluZzogUmVnaXN0ZXIgcmFuZ2Ugbm90IGluIGFzY2VuZGluZyBvcmRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MjkwMAotbXNnaWQgIk1pc3NpbmcgYH0nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyOTE2Ci1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBtYXNrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzoyOTc3Ci1tc2dpZCAicjE1IG5vdCBhbGxvd2VkIGFzIGJhc2UgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjMwNDcgY29uZmlnL3RjLWFybS5jOjMwNjEKLW1zZ2lkICJyMTUgbm90IGFsbG93ZWQgaW4gc3dhcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzE1OAotbXNnaWQgIlVzZSBvZiByMTUgaW4gYnggaGFzIHVuZGVmaW5lZCBiZWhhdmlvdXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM0MTcgY29uZmlnL3RjLXY4NTAuYzoxOTIxIGNvbmZpZy90Yy12ODUwLmM6MTk0MgotbXNnaWQgImNvbnN0YW50IGV4cHJlc3Npb24gZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM0MjMKLW1zZ2lkICJDb25zdGFudCB2YWx1ZSByZXF1aXJlZCBmb3IgbnVtYmVyIG9mIHJlZ2lzdGVycyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6MzQzMQotbXNnaWQgIm51bWJlciBvZiByZWdpc3RlcnMgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzE6NF0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM0OTMKLW1zZ2lkICJSMTUgbm90IGFsbG93ZWQgYXMgYmFzZSByZWdpc3RlciB3aXRoIHdyaXRlLWJhY2siCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM3NDUKLW1zZ2lkICJsbyByZWdpc3RlciByZXF1aXJlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzc1MwotbXNnaWQgImhpIHJlZ2lzdGVyIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozODIzCi1tc2dpZCAiZGVzdCBhbmQgc291cmNlMSBtdXN0IGJlIHRoZSBzYW1lIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozODMwCi1tc2dpZCAic3VidHJhY3QgdmFsaWQgb25seSBvbiBsbyByZWdzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozODU0Ci1tc2dpZCAiaW52YWxpZCBIaSByZWdpc3RlciB3aXRoIGltbWVkaWF0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6Mzg4MSBjb25maWcvdGMtYXJtLmM6MzkxNCBjb25maWcvdGMtYXJtLmM6MzkyNAotbXNnaWQgImltbWVkaWF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM4OTIKLW1zZ2lkICJpbnZhbGlkIGltbWVkaWF0ZSB2YWx1ZSBmb3Igc3RhY2sgYWRqdXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzozOTAzCi1tc2dpZCAiaW52YWxpZCBpbW1lZGlhdGUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjM5OTAKLW1zZ2lkICJzb3VyY2UxIGFuZCBkZXN0IG11c3QgYmUgc2FtZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDAyNQotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIGZvciBzaGlmdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDEwNAotbXNnaWQgIm9ubHkgbG8gcmVncyBhbGxvd2VkIHdpdGggaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MTIzCi1tc2dpZCAiaW52YWxpZCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQxNzgKLW1zZ2lkICJleHBlY3RlZCAnXSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyNDUKLW1zZ2lkICJieXRlIG9yIGhhbGZ3b3JkIG5vdCB2YWxpZCBmb3IgYmFzZSByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDI1MAotbXNnaWQgIlIxNSBiYXNlZCBzdG9yZSBub3QgYWxsb3dlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDI1NQotbXNnaWQgIkludmFsaWQgYmFzZSByZWdpc3RlciBmb3IgcmVnaXN0ZXIgb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0MjczCi1tc2dpZCAiaW52YWxpZCBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQyODQKLW1zZ2lkICJpbnZhbGlkIGJhc2UgcmVnaXN0ZXIgaW4gbG9hZC9zdG9yZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDMwOCBjb25maWcvdGMtYXJtLmM6NTQ2OSBjb25maWcvdGMtYXJtLmM6NTQ3OAotIzogY29uZmlnL3RjLWFybS5jOjU0ODUgY29uZmlnL3RjLWFybS5jOjU0OTIgY29uZmlnL3RjLWFybS5jOjU0OTkKLW1zZ2lkICJJbnZhbGlkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDM4NgotbXNnaWQgImRlc3QgYW5kIHNvdXJjZTEgb25lIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjQzOTQKLW1zZ2lkICJScyBhbmQgUmQgbXVzdCBiZSBkaWZmZXJlbnQgaW4gTVVMIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NTM5Ci1tc2dpZCAiIgotIkluc2VydGVkIG1pc3NpbmcgJyEnOiBsb2FkL3N0b3JlIG11bHRpcGxlIGFsd2F5cyB3cml0ZXMgYmFjayBiYXNlIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NTU1IGNvbmZpZy90Yy1hcm0uYzo0NjU3Ci1tc2dpZCAiRXhwcmVzc2lvbiB0b28gY29tcGxleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDU2MQotbXNnaWQgIm9ubHkgbG8tcmVncyB2YWxpZCBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo0NjA4Ci1tc2dpZCAiU3ludGF4OiBsZHJzW2JdIFJkLCBbUmIsIFJvXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDY3MwotbXNnaWQgImludmFsaWQgcmVnaXN0ZXIgbGlzdCB0byBwdXNoL3BvcCBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NDgxMQotbXNnaWQgIlZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTIwMwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNvbnN0YW50ICgleCkgYWZ0ZXIgZml4dXBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTIxNSBjb25maWcvdGMtYXJtLmM6NTIzNgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW1tZWRpYXRlIHZhbHVlIGZvciBvZmZzZXQgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTIzNCBjb25maWcvdGMtYXJtLmM6NTI1NwotbXNnaWQgImludmFsaWQgbGl0ZXJhbCBjb25zdGFudDogcG9vbCBuZWVkcyB0byBiZSBjbG9zZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTI3NAotbXNnaWQgInNoaWZ0IGV4cHJlc3Npb24gaXMgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MjkyIGNvbmZpZy90Yy1hcm0uYzo1MzAxCi1tc2dpZCAiSW52YWxpZCBzd2kgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTMxMQotbXNnaWQgIkludmFsaWQgZXhwcmVzc2lvbiBpbiBsb2FkL3N0b3JlIG11bHRpcGxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1MzM5IGNvbmZpZy90Yy1hcm0uYzo1MzU1IGNvbmZpZy90Yy1taXBzLmM6OTY3OAotbXNnaWQgIkJyYW5jaCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjUzNzQKLW1zZ2lkICJCcmFuY2ggd2l0aCBsaW5rIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTQ0MQotbXNnaWQgIklsbGVnYWwgdmFsdWUgZm9yIGNvLXByb2Nlc3NvciBvZmZzZXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU0NjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBvZmZzZXQsIHRhcmdldCBub3Qgd29yZCBhbGlnbmVkICgweCUwOFgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTM1Ci1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIHN0YWNrIGFkZHJlc3MgY2FsY3VsYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBpbW1lZGlhdGUgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24gKHZhbHVlID0gMHglMDhYKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTU1MwotbXNnaWQgIkludmFsaWQgOGJpdCBpbW1lZGlhdGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1NjEKLW1zZ2lkICJJbnZhbGlkIDNiaXQgaW1tZWRpYXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NTc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlOiAlZCBpcyB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU1OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBUaHVtYiBzaGlmdCB2YWx1ZTogJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU2MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFkIHJlbG9jYXRpb24gZml4dXAgdHlwZSAoJWQpXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU2NzQKLW1zZ2lkICJMaXRlcmFsIHJlZmVyZW5jZWQgYWNyb3NzIHNlY3Rpb24gYm91bmRyeSAoSW1wbGljaXQgZHVtcD8pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsX3JlbG9jYXRpb24gKHR5cGUgJWQpIG5vdCBmaXhlZCB1cCAoSU1NRURJQVRFKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTY5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbF9yZWxvY2F0aW9uICh0eXBlICVkKSBub3QgZml4ZWQgdXAgKE9GRlNFVF9JTU0pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1NzIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgcmVwcmVzZW50ICVzIHJlbG9jYXRpb24gaW4gdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTc0MCBjb25maWcvdGMtbWlwcy5jOjExMTY2IGNvbmZpZy90Yy1zaC5jOjIyODIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCByZXByZXNlbnQgJXMgcmVsb2NhdGlvbiBpbiB0aGlzIG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTc1MwotbXNnaWQgIm1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjU4MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gb3BlcmF0b3IgLS0gc3RhdGVtZW50IGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NTg3MyBjb25maWcvdGMtYXJtLmM6NTkyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGNvZGUgYCVzJyBtdXN0IGhhdmUgc3VmZml4IGZyb20gPCVzPlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo1ODk4Ci1tc2dpZCAiV2FybmluZzogVXNlIG9mIHRoZSAnbnYnIGNvbmRpdGlvbmFsIGlzIGRlcHJlY2F0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjAxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciAnJXMnIGRvZXMgbm90IGV4aXN0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYwMjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgcmVkZWZpbml0aW9uIG9mIHJlZ2lzdGVyIGFsaWFzICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjYwMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotImlnbm9yaW5nIHJlZGVmaW5pdGlvbiBvZiByZWdpc3RlciBhbGlhcyAnJXMnIHRvIG5vbi1leGlzdGFudCByZWdpc3RlciAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MDMyCi1tc2dpZCAiaWdub3JpbmcgaW5jb21wbGV0ZSAucmVxIHBzZXVzbyBvcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjIwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbmlzZWQgQVBDUyBzd2l0Y2ggLW0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjMzNCBjb25maWcvdGMtYXJtLmM6NjM0NSBjb25maWcvdGMtYXJtLmM6NjM1NgotIzogY29uZmlnL3RjLWFybS5jOjYzNjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBhcmNoaXRlY3R1cmUgdmFyaWFudCAtbSVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2MzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgcHJvY2Vzc29yIHZhcmlhbnQgLW0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjM5MAotbXNnaWQgIiIKLSIgQVJNIFNwZWNpZmljIEFzc2VtYmxlciBPcHRpb25zOlxuIgotIiAgLW1bYXJtXVs8cHJvY2Vzc29yIG5hbWU+XSBzZWxlY3QgcHJvY2Vzc29yIHZhcmlhbnRcbiIKLSIgIC1tW2FybV12WzJ8MmF8M3wzbXw0fDR0XSAgc2VsZWN0IGFyY2hpdGVjdHVyZSB2YXJpYW50XG4iCi0iICAtbXRodW1iICAgICAgICAgICAgICAgICAgIG9ubHkgYWxsb3cgVGh1bWIgaW5zdHJ1Y3Rpb25zXG4iCi0iICAtbXRodW1iLWludGVyd29yayAgICAgICAgIG1hcmsgdGhlIGFzc2VtYmxlZCBjb2RlIGFzIHN1cHBvcnRpbmcgIgotImludGVyd29ya2luZ1xuIgotIiAgLW1hbGwgICAgICAgICAgICAgICAgICAgICBhbGxvdyBhbnkgaW5zdHJ1Y3Rpb25cbiIKLSIgIC1tZnBhMTAsIC1tZnBhMTEgICAgICAgICAgc2VsZWN0IGZsb2F0aW5nIHBvaW50IGFyY2hpdGVjdHVyZVxuIgotIiAgLW1mcGUtb2xkICAgICAgICAgICAgICAgICBkb24ndCBhbGxvdyBmbG9hdGluZy1wb2ludCBtdWx0aXBsZSAiCi0iaW5zdHJ1Y3Rpb25zXG4iCi0iICAtbW5vLWZwdSAgICAgICAgICAgICAgICAgIGRvbid0IGFsbG93IGFueSBmbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MDEKLW1zZ2lkICIgIC1rICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGUgUElDIGNvZGUuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWFybS5jOjY0MDUKLW1zZ2lkICIiCi0iICAtbWFwY3MtMzIsIC1tYXBjcy0yNiAgICAgIHNwZWNpZnkgd2hpY2ggQVJNIFByb2NlZHVyZSBDYWxsaW5nIFN0YW5kYXJkIHRvICIKLSJ1c2VcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQwOAotbXNnaWQgIiAgLW1hcGNzLWZsb2F0ICAgICAgICAgICAgICBmbG9hdGluZyBwb2ludCBhcmdzIGFyZSBwYXNzZWQgaW4gRlAgcmVnc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDExCi1tc2dpZCAiIgotIiAgLW1hcGNzLXJlZW50cmFudCAgICAgICAgICB0aGUgY29kZSBpcyBwb3NpdGlvbiBpbmRlcGVuZGVudC9yZWVudHJhbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjQxNgotbXNnaWQgIiAgLW1vYWJpICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHRoZSBvbGQgRUxGIEFCSVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1hcm0uYzo2NDIxCi1tc2dpZCAiIgotIiAgLUVCICAgICAgICAgICAgICAgICAgICAgICBhc3NlbWJsZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gY3B1XG4iCi0iICAtRUwgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmxlIGNvZGUgZm9yIGEgbGl0dGxlIGVuZGlhbiBjcHVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtYXJtLmM6NjU5NAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBmdW5jdGlvbiB0eXBlOiAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjIxOAotbXNnaWQgIiIKLSJEMTBWIG9wdGlvbnM6XG4iCi0iLU8gICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemUuICBXaWxsIGRvIHNvbWUgb3BlcmF0aW9ucyBpbiBwYXJhbGxlbC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjUyMSBjb25maWcvdGMtZDEwdi5jOjYwMyBjb25maWcvdGMtZDMwdi5jOjYzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZTogJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo2NjQKLW1zZ2lkICJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIHdpdGggYW5vdGhlciBpbnN0cnVjdGlvbi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3MTYKLW1zZ2lkICJJbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzE5Ci1tc2dpZCAiTG9uZyBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBjb21iaW5lZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo3NTkKLW1zZ2lkICJPbmUgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zIG1heSBub3QgYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzY0IGNvbmZpZy90Yy1kMzB2LmM6ODQzCi1tc2dpZCAiVHdvIElVIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzY2IGNvbmZpZy90Yy1kMTB2LmM6Nzc0IGNvbmZpZy90Yy1kMTB2LmM6Nzg5Ci0jOiBjb25maWcvdGMtZDEwdi5jOjgwMiBjb25maWcvdGMtZDMwdi5jOjg0NCBjb25maWcvdGMtZDMwdi5jOjg1MwotbXNnaWQgIlN3YXBwaW5nIGluc3RydWN0aW9uIG9yZGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzcyIGNvbmZpZy90Yy1kMzB2LmM6ODUwCi1tc2dpZCAiVHdvIE1VIGluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMTB2LmM6NzkzIGNvbmZpZy90Yy1kMzB2LmM6ODY5Ci1tc2dpZCAiSVUgaW5zdHJ1Y3Rpb24gbWF5IG5vdCBiZSBpbiB0aGUgbGVmdCBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo4MDYgY29uZmlnL3RjLWQzMHYuYzo4ODIKLW1zZ2lkICJNVSBpbnN0cnVjdGlvbiBtYXkgbm90IGJlIGluIHRoZSByaWdodCBjb250YWluZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzo4MTAgY29uZmlnL3RjLWQzMHYuYzo4OTAKLW1zZ2lkICJ1bmtub3duIGV4ZWN1dGlvbiB0eXBlIHBhc3NlZCB0byB3cml0ZV8yX3Nob3J0KCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMDIzIGNvbmZpZy90Yy1kMTB2LmM6MTAzNyBjb25maWcvdGMtaDgzMDAuYzoxMjc5Ci0jOiBjb25maWcvdGMtaDg1MDAuYzoxMTIyIGNvbmZpZy90Yy1tY29yZS5jOjg0MiBjb25maWcvdGMtc2guYzoxMDQwCi0jOiBjb25maWcvdGMtejhrLmM6MTIyMwotbXNnaWQgImNhbid0IGZpbmQgb3Bjb2RlICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjEwNTAgY29uZmlnL3RjLWQxMHYuYzoxMDY4IGNvbmZpZy90Yy1kMzB2LmM6MTM2OAotbXNnaWQgIlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjExMTYgY29uZmlnL3RjLWQzMHYuYzoxNTAzCi0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd24gb3Bjb2RlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjExOTcgY29uZmlnL3RjLWQxMHYuYzoxMzQzIGNvbmZpZy90Yy10aWM4MC5jOjUzNwotbXNnaWQgImJhZCBvcGNvZGUgb3Igb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMjQ2IGNvbmZpZy90Yy1tNjhrLmM6NDIzMgotbXNnaWQgInZhbHVlIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjEzMTgKLW1zZ2lkICJpbGxlZ2FsIG9wZXJhbmQgLSByZWdpc3RlciBuYW1lIGZvdW5kIHdoZXJlIG5vbmUgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMzU0IGNvbmZpZy90Yy10aWM4MC5jOjU0OAotbXNnaWQgIlJlZ2lzdGVyIG51bWJlciBtdXN0IGJlIEVWRU4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxMzg1IGNvbmZpZy90Yy1kMzB2LmM6MTc1NCBjb25maWcvdGMtbW4xMDIwMC5jOjEyMzQKLSM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6MTQyNSBjb25maWcvdGMtcHBjLmM6NTAwNCBjb25maWcvdGMtdjg1MC5jOjIyNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVsb2MgJWQgbm90IHN1cHBvcnRlZCBieSBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQxMHYuYzoxNDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHJlcCBvciByZXBpIG11c3QgaW5jbHVkZSBhdCBsZWFzdCA0IGluc3RydWN0aW9ucyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDEwdi5jOjE1MTcgY29uZmlnL3RjLWQzMHYuYzoxOTM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVua25vd24gcmVsb2NhdGlvbiB0eXBlOiAweCV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlZ2lzdGVyIG5hbWUgJXMgY29uZmxpY3RzIHdpdGggc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoyNzYKLW1zZ2lkICIiCi0iXG4iCi0iRDMwViBvcHRpb25zOlxuIgotIi1PICAgICAgICAgICAgICAgICAgICAgIE1ha2UgYWRqYWNlbnQgc2hvcnQgaW5zdHJ1Y3Rpb25zIHBhcmFsbGVsIGlmICIKLSJwb3NzaWJsZS5cbiIKLSItbiAgICAgICAgICAgICAgICAgICAgICBXYXJuIGFib3V0IGFsbCBOT1BzIGluc2VydGVkIGJ5IHRoZSBhc3NlbWJsZXIuXG4iCi0iLU5cdFx0XHRXYXJuIGFib3V0IE5PUHMgaW5zZXJ0ZWQgYWZ0ZXIgd29yZCBtdWx0aXBsaWVzLlxuIgotIi1jICAgICAgICAgICAgICAgICAgICAgIFdhcm4gYWJvdXQgc3ltYm9scyB3aG9lcyBuYW1lcyBtYXRjaCByZWdpc3RlciAiCi0ibmFtZXMuXG4iCi0iLUMgICAgICAgICAgICAgICAgICAgICAgT3Bwb3NpdGUgb2YgLUMuICAtYyBpcyB0aGUgZGVmYXVsdC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjQ1MAotbXNnaWQgInVuZXhwZWN0ZWQgMTItYml0IHJlbG9jIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo0NTcKLW1zZ2lkICJ1bmV4cGVjdGVkIDE4LWJpdCByZWxvYyB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6NzAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzIE5PUCBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjcwMgotbXNnaWQgInNlcXVlbnRpYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzo3MDIKLW1zZ2lkICJwYXJhbGxlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjgzOQotbXNnaWQgIkluc3RydWN0aW9ucyBtYXkgbm90IGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6ODUyIGNvbmZpZy90Yy1kMzB2LmM6ODU5IGNvbmZpZy90Yy1kMzB2LmM6ODc1Ci0jOiBjb25maWcvdGMtZDMwdi5jOjg4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJFeGVjdXRpbmcgJXMgaW4gSVUgbWF5IG5vdCB3b3JrIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6ODcxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNwZWNpYWwgbGVmdCBpbnN0cnVjdGlvbiBgJXMnIGtpbGxzIGluc3RydWN0aW9uIGAlcycgaW4gcmlnaHQgY29udGFpbmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTI1MCBjb25maWcvdGMtZDMwdi5jOjEyNjcKLW1zZ2lkICJDYW5ub3QgYXNzZW1ibGUgaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxMjUyCi1tc2dpZCAiRmlyc3Qgb3Bjb2RlIGlzIGxvbmcuICBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTMyMAotbXNnaWQgIndvcmQgb2YgTk9QcyBhZGRlZCBiZXR3ZWVuIHdvcmQgbXVsdGlwbHkgYW5kIGxvYWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxMzIyCi1tc2dpZCAid29yZCBvZiBOT1BzIGFkZGVkIGJldHdlZW4gd29yZCBtdWx0aXBseSBhbmQgMTYtYml0IG11bHRpcGx5IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTM1MgotbXNnaWQgIkluc3RydWN0aW9uIHVzZXMgbG9uZyB2ZXJzaW9uLCBzbyBpdCBjYW5ub3QgYmUgbWl4ZWQgYXMgc3BlY2lmaWVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTQzNiBjb25maWcvdGMtZDMwdi5jOjE0NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBjb25kaXRpb24gY29kZTogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxNDY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNtcHUgZG9lc24ndCBzdXBwb3J0IGNvbmRpdGlvbiBjb2RlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTUxNAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kcyBmb3Igb3Bjb2RlIGAlcycgZG8gbm90IG1hdGNoIGFueSB2YWxpZCBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxNzI3Ci1tc2dpZCAiT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTgyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtZDMwdi5jOjE4MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibGluZSAlZDogdW5hYmxlIHRvIHBsYWNlIHZhbHVlICV4IGludG8gYSBieXRlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MTgzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJsaW5lICVkOiB1bmFibGUgdG8gcGxhY2UgYWRkcmVzcyBvZiBzeW1ib2wgJyVzJyBpbnRvIGEgc2hvcnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODM4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSB2YWx1ZSAleCBpbnRvIGEgc2hvcnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoxODQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxpbmUgJWQ6IHVuYWJsZSB0byBwbGFjZSBhZGRyZXNzIG9mIHN5bWJvbCAnJXMnIGludG8gYSBxdWFkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1kMzB2LmM6MjAxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ2YWx1ZSB0b28gbGFyZ2UgdG8gZml0IGluICVkIGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWQzMHYuYzoyMTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICVkIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MjU0IGNvbmZpZy90Yy1oODMwMC5jOjI2MgotbXNnaWQgIlJlZyBub3QgdmFsaWQgZm9yIEg4LzMwMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo0MjMgY29uZmlnL3RjLWg4MzAwLmM6NDI2IGNvbmZpZy90Yy1oODMwMC5jOjQyOQotIzogY29uZmlnL3RjLWg4MzAwLmM6NDMzCi1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBsaXN0IGZvciBsZG0vc3RtXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6NDkwIGNvbmZpZy90Yy1oODMwMC5jOjU1MyBjb25maWcvdGMtaDgzMDAuYzo1NjAKLW1zZ2lkICJXcm9uZyBzaXplIHBvaW50ZXIgcmVnaXN0ZXIgZm9yIGFyY2hpdGVjdHVyZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6NTE4IGNvbmZpZy90Yy1oODMwMC5jOjUyNyBjb25maWcvdGMtaDgzMDAuYzo1MzcKLW1zZ2lkICJleHBlY3RlZCBAKGV4cCwgcmVnMTYpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjYxNwotbXNnaWQgImV4cGVjdCA6OCBvciA6MTYgaGVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzo4MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCAlczB4JWx4IG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6OTEwCi1tc2dpZCAiQ2FuJ3Qgd29yayBvdXQgc2l6ZSBvZiBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjk2NAotIywgYy1mb3JtYXQKLW1zZ2lkICJPcGNvZGUgYCVzJyB3aXRoIHRoZXNlIG9wZXJhbmQgdHlwZXMgbm90IGF2YWlsYWJsZSBpbiBIOC8zMDAgbW9kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMDE2IGNvbmZpZy90Yy1oODMwMC5jOjEwMzYKLW1zZ2lkICJOZWVkICMxIG9yICMyIGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTAzMQotbXNnaWQgIiM0IG5vdCB2YWxpZCBvbiBIOC8zMDAuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjExMTIgY29uZmlnL3RjLWg4MzAwLmM6MTE1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJicmFuY2ggb3BlcmFuZCBoYXMgb2RkIG9mZnNldCAoJWx4KVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjExOTEKLW1zZ2lkICJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTYgYml0IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMDEKLW1zZ2lkICJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMDkKLW1zZ2lkICJkZXN0aW5hdGlvbiBvcGVyYW5kIG11c3QgYmUgMTZiaXQgYWJzb2x1dGUgYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMjE2Ci1tc2dpZCAiZGVzdGluYXRpb24gb3BlcmFuZCBtdXN0IGJlIDggYml0IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEyMjUKLW1zZ2lkICJzb3VyY2Ugb3BlcmFuZCBtdXN0IGJlIDE2Yml0IGFic29sdXRlIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTIzMwotbXNnaWQgImludmFsaWQgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTI5MCBjb25maWcvdGMtaDg1MDAuYzoxMTI5IGNvbmZpZy90Yy1taXBzLmM6NzkzMgotIzogY29uZmlnL3RjLXNoLmM6MTA0NyBjb25maWcvdGMtdzY1LmM6NzU5IGNvbmZpZy90Yy16OGsuYzoxMjM1Ci1tc2dpZCAidW5rbm93biBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTMzNgotbXNnaWQgIm1pc21hdGNoIGJldHdlZW4gb3Bjb2RlIHNpemUgYW5kIG9wZXJhbmQgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxMzQ4IGNvbmZpZy90Yy1oODUwMC5jOjExNTcgY29uZmlnL3RjLXNoLmM6MTE0NAotIzogY29uZmlnL3RjLXc2NS5jOjc5MSBjb25maWcvdGMtejhrLmM6MTI5MAotbXNnaWQgImNhbGwgdG8gdGNfY3Jhd2xfc3ltYm9sX2NoYWluIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODMwMC5jOjEzNjIgY29uZmlnL3RjLWg4NTAwLmM6MTE3MSBjb25maWcvdGMtc2guYzoxMTUxCi0jOiBjb25maWcvdGMtdzY1LmM6ODA1IGNvbmZpZy90Yy16OGsuYzoxMzA0Ci1tc2dpZCAiY2FsbCB0byB0Y19oZWFkZXJzX2hvb2sgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTQ1MSBjb25maWcvdGMtaDg1MDAuYzoxMjYwIGNvbmZpZy90Yy16OGsuYzoxNDE1Ci1tc2dpZCAiY2FsbCB0byB0Y19hb3V0X2ZpeF90b19jaGFycyBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDgzMDAuYzoxNDYxIGNvbmZpZy90Yy16OGsuYzoxNDI1Ci1tc2dpZCAiY2FsbCB0byBtZF9jb252ZXJ0X2ZyYWcgXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4MzAwLmM6MTUwNiBjb25maWcvdGMtejhrLmM6MTUwMAotbXNnaWQgImNhbGwgdG9tZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzozMzcKLW1zZ2lkICI6MjQgbm90IHZhbGlkIGZvciB0aGlzIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzozNDQKLW1zZ2lkICJleHBlY3QgOjgsOjE2IG9yIDoyNCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo0MDEKLW1zZ2lkICJzeW50YXggZXJyb3IgaW4gcmVnIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NDE5Ci1tc2dpZCAibWlzc2luZyBmaW5hbCByZWdpc3RlciBpbiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaDg1MDAuYzo1MDYgY29uZmlnL3RjLWg4NTAwLmM6NTEzIGNvbmZpZy90Yy1oODUwMC5jOjUxOQotbXNnaWQgImV4cGVjdGVkIEAoZXhwLCBSbikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6NTM1Ci1tc2dpZCAiQFJuKyBuZWVkcyB3b3JkIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjU0NQotbXNnaWQgIkBSbiBuZWVkcyB3b3JkIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjg0NSBjb25maWcvdGMtc2guYzo4NDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5oYW5kbGVkICVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWg4NTAwLmM6ODczIGNvbmZpZy90Yy1zaC5jOjg2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYWJzb2x1dGUgaW4gcmFuZ2UgJWQuLiVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjk2MyBjb25maWcvdGMtc2guYzo5ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmFpbGVkIGZvciAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1oODUwMC5jOjExNDUgY29uZmlnL3RjLXNoLmM6MTA4MiBjb25maWcvdGMtdzY1LmM6Nzc5Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kcyBmb3Igb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTA5NgotbXNnaWQgIk1pc3NpbmcgLmV4aXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjEwOTkKLW1zZ2lkICJNaXNzaW5nIC5wcm9jZW5kXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMTA4Ci1tc2dpZCAiTm90IGluIGEgc3BhY2UuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMTExCi1tc2dpZCAiTm90IGluIGEgc3Vic3BhY2UuXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMjczCi1tc2dpZCAiSW52YWxpZCBmaWVsZCBzZWxlY3Rvci4gIEFzc3VtaW5nIEYlJS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMzA0Ci1tc2dpZCAiLVIgb3B0aW9uIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyB0YXJnZXQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTMxOAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTMyNiBjb25maWcvdGMtaTg2MC5jOjE5MSBjb25maWcvdGMtc3BhcmMuYzo3MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGxvc2luZyBvcGNvZGU6IGAlcycgXCIlc1wiXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxMzg4IGNvbmZpZy90Yy1ocHBhLmM6NTE4MyBjb25maWcvdGMtaHBwYS5jOjUyMzUKLW1zZ2lkICJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIChjb3JydXB0ZWQgbGFiZWwgY2hhaW4pIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTM5MSBjb25maWcvdGMtaHBwYS5jOjUyMzgKLW1zZ2lkICJNaXNzaW5nIGZ1bmN0aW9uIG5hbWUgZm9yIC5QUk9DIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTQ5NCBjb25maWcvdGMtaHBwYS5jOjM0NjMKLW1zZ2lkICJjb3VsZCBub3QgdXBkYXRlIGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE2MjUKLW1zZ2lkICJJbnZhbGlkIEluZGV4ZWQgTG9hZCBDb21wbGV0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTYzMAotbXNnaWQgIkludmFsaWQgSW5kZXhlZCBMb2FkIENvbXBsZXRlciBTeW50YXguIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTY1NAotbXNnaWQgIkludmFsaWQgU2hvcnQgTG9hZC9TdG9yZSBDb21wbGV0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTY4MSBjb25maWcvdGMtaHBwYS5jOjE2ODYKLW1zZ2lkICJJbnZhbGlkIFN0b3JlIEJ5dGVzIFNob3J0IENvbXBsZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjE2OTYgY29uZmlnL3RjLWhwcGEuYzoxNzI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgQ29tcGFyZS9TdWJ0cmFjdCBDb25kaXRpb246ICVjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTcxMQotbXNnaWQgIkludmFsaWQgQ29tcGFyZS9TdWJ0cmFjdCBDb25kaXRpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTc0MwotbXNnaWQgIkludmFsaWQgQ29tcGFyZS9TdWJ0cmFjdCBDb25kaXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoxODIxIGNvbmZpZy90Yy1ocHBhLmM6MTg5NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIEFkZCBDb25kaXRpb246ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MTk0OCBjb25maWcvdGMtaHBwYS5jOjIwMjUKLW1zZ2lkICJJbnZhbGlkIExvZ2ljYWwgSW5zdHJ1Y3Rpb24gQ29uZGl0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIwNjcKLW1zZ2lkICJJbnZhbGlkIFNoaWZ0L0V4dHJhY3QvRGVwb3NpdCBDb25kaXRpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjA4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIEJpdCBCcmFuY2ggQ29uZGl0aW9uOiAlYyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIyMDIgY29uZmlnL3RjLWhwcGEuYzoyMjM1IGNvbmZpZy90Yy1ocHBhLmM6MjI3MgotbXNnaWQgIkJyYW5jaCB0byB1bmFsaWduZWQgYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjIzMzUKLW1zZ2lkICJJbnZhbGlkIFNGVSBpZGVudGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjM3NQotbXNnaWQgIkludmFsaWQgQ09QUiBpZGVudGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MjUwMCBjb25maWcvdGMtaHBwYS5jOjI1MjEgY29uZmlnL3RjLWhwcGEuYzoyNTQxCi0jOiBjb25maWcvdGMtaHBwYS5jOjI1NjEgY29uZmlnL3RjLWhwcGEuYzoyNTgxCi1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBmb3Igc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkIG9yIGZtcHlzdWIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyNjA1Ci1tc2dpZCAiSW52YWxpZCBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzoyNjI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgb3BlcmFuZHMgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozMTYzCi1tc2dpZCAiVW5rbm93biByZWxvY2F0aW9uIGVuY291bnRlcmVkIGluIG1kX2FwcGx5X2ZpeC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozMTczCi0jLCBjLWZvcm1hdAotbXNnaWQgIm5vIGhwcGFfZml4dXAgZW50cnkgZm9yIHRoaXMgZml4dXAgKGZpeFAgPSAweCV4LCB0eXBlID0gMHgleClcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjMzMTUgY29uZmlnL3RjLWhwcGEuYzozMzQwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuZGVmaW5lZCByZWdpc3RlcjogJyVzJy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozMzc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIk5vbi1hYnNvbHV0ZSBzeW1ib2w6ICclcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzM5MwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmRlZmluZWQgYWJzb2x1dGUgY29uc3RhbnQ6ICclcycuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzUwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIEZQIENvbXBhcmUgQ29uZGl0aW9uOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM1NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBGUCBPcGVyYW5kIEZvcm1hdDogJTNzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzYyNAotbXNnaWQgIkJhZCBzZWdtZW50IGluIGV4cHJlc3Npb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6MzY3NQotbXNnaWQgIkJhZCBzZWdtZW50IChzaG91bGQgYmUgYWJzb2x1dGUpLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM3NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBhcmd1bWVudCBsb2NhdGlvbjogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjM4MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCBhcmd1bWVudCBkZXNjcmlwdGlvbjogJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzozODI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgTnVsbGlmaWNhdGlvbjogKCVjKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQzMDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW52YWxpZCAuQ0FMTCBhcmd1bWVudDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NDIwCi1tc2dpZCAiLmNhbGxpbmZvIGlzIG5vdCB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRlJBTUUgcGFyYW1ldGVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA4OiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDQ1OQotbXNnaWQgIlZhbHVlIGZvciBFTlRSWV9HUiBtdXN0IGJlIGluIHRoZSByYW5nZSAzLi4xOFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDQ3MQotbXNnaWQgIlZhbHVlIGZvciBFTlRSWV9GUiBtdXN0IGJlIGluIHRoZSByYW5nZSAxMi4uMjFcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ0ODEKLW1zZ2lkICJWYWx1ZSBmb3IgRU5UUllfU1IgbXVzdCBiZSAzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NTM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgLkNBTExJTkZPIGFyZ3VtZW50OiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ2MjcKLW1zZ2lkICJUaGUgLkVOVEVSIHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDY0MQotbXNnaWQgIk1pc3BsYWNlZCAuZW50cnkuIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDY0NQotbXNnaWQgIk1pc3NpbmcgLmNhbGxpbmZvLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ2OTMKLW1zZ2lkICIuUkVHIG11c3QgdXNlIGEgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0Njk1Ci1tc2dpZCAiLkVRVSBtdXN0IHVzZSBhIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NDc0NgotbXNnaWQgIi5FWElUIG11c3QgYXBwZWFyIHdpdGhpbiBhIHByb2NlZHVyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ3NTAKLW1zZ2lkICJNaXNzaW5nIC5jYWxsaW5mbyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ3NTQKLW1zZ2lkICJObyAuRU5UUlkgZm9yIHRoaXMgLkVYSVQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo0NzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBkZWZpbmUgZXhwb3J0IHN5bWJvbDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ4MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVXNpbmcgRU5UUlkgcmF0aGVyIHRoYW4gQ09ERSBpbiBleHBvcnQgZGlyZWN0aXZlIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjQ5MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5kZWZpbmVkIC5FWFBPUlQvLklNUE9SVCBhcmd1bWVudCAoaWdub3JlZCk6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTAxNwotbXNnaWQgIk1pc3NpbmcgbGFiZWwgbmFtZSBvbiAuTEFCRUwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MDIyCi1tc2dpZCAiZXh0cmEgLkxBQkVMIGFyZ3VtZW50cyBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUwMzcKLW1zZ2lkICJUaGUgLkxFQVZFIHBzZXVkby1vcCBpcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTA3MAotbXNnaWQgIlVucmVjb2duaXplZCAuTEVWRUwgYXJndW1lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUxMDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IGRlZmluZSBzdGF0aWMgc3ltYm9sOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTEzNwotbXNnaWQgIk5lc3RlZCBwcm9jZWR1cmVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTE0NwotbXNnaWQgIkNhbm5vdCBhbGxvY2F0ZSB1bndpbmQgZGVzY3JpcHRvclxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTI0MgotbXNnaWQgIm1pc3BsYWNlZCAucHJvY2VuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjUyNDUKLW1zZ2lkICJNaXNzaW5nIC5jYWxsaW5mbyBmb3IgdGhpcyBwcm9jZWR1cmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MjQ4Ci1tc2dpZCAiTWlzc2luZyAuRVhJVCBmb3IgYSAuRU5UUlkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1MzQ4Ci1tc2dpZCAiSW52YWxpZCAuU1BBQ0UgYXJndW1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1Mzk2Ci1tc2dpZCAiQ2FuJ3QgY2hhbmdlIHNwYWNlcyB3aXRoaW4gYSBwcm9jZWR1cmUgZGVmaW5pdGlvbi4gSWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU1MjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5kZWZpbmVkIHNwYWNlOiAnJXMnIEFzc3VtaW5nIHNwYWNlIG51bWJlciA9IDAuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTU2NQotbXNnaWQgIk11c3QgYmUgaW4gYSBzcGFjZSBiZWZvcmUgY2hhbmdpbmcgb3IgZGVjbGFyaW5nIHN1YnNwYWNlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU1NjkKLW1zZ2lkICJDYW4ndCBjaGFuZ2Ugc3Vic3BhY2VzIHdpdGhpbiBhIHByb2NlZHVyZSBkZWZpbml0aW9uLiBJZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTYwNQotbXNnaWQgIlBhcmFtZXRlcnMgb2YgYW4gZXhpc3Rpbmcgc3Vic3BhY2UgY2FuJ3QgYmUgbW9kaWZpZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NjU4Ci1tc2dpZCAiQWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiAyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NTcwMAotbXNnaWQgIkZJUlNUIG5vdCBzdXBwb3J0ZWQgYXMgYSAuU1VCU1BBQ0UgYXJndW1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NzAyCi1tc2dpZCAiSW52YWxpZCAuU1VCU1BBQ0UgYXJndW1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWhwcGEuYzo1NzQyCi1tc2dpZCAiSWdub3Jpbmcgc3Vic3BhY2UgZGVjbCBkdWUgdG8gRUxGIEJGRCBidWdzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU5MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IFVuYWJsZSB0byBmaW5kIGNvbnRhaW5pbmcgc3BhY2UgZm9yICVzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjU5NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjYwMzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3V0IG9mIG1lbW9yeTogY291bGQgbm90IGFsbG9jYXRlIG5ldyBzdWJzcGFjZSBjaGFpbiBlbnRyeTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaHBwYS5jOjY2ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sICclcycgY291bGQgbm90IGJlIGNyZWF0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1ocHBhLmM6NjY5MgotbXNnaWQgIk5vIG1lbW9yeSBmb3Igc3ltYm9sIG5hbWUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NTAyCi1tc2dpZCAic2FtZSB0eXBlIG9mIHByZWZpeCB1c2VkIHR3aWNlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NTM2Ci1tc2dpZCAiQmFkIGFyZ3VtZW50IHRvIHN5bnRheCBkaXJlY3RpdmUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NjE5IGNvbmZpZy90Yy1tNjhrLmM6Mzc1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBFcnJvcjogIENhbid0IGhhc2ggJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6ODUxCi1tc2dpZCAiVW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjg5OSBjb25maWcvdGMtaTM4Ni5jOjQzNjAgY29uZmlnL3RjLW02OGsuYzo3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo5MDkgY29uZmlnL3RjLWkzODYuYzo0Mzc0IGNvbmZpZy90Yy1tNjhrLmM6Nzc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTAxMCBjb25maWcvdGMtaTM4Ni5jOjEwOTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAibm8gc3VjaCAzODYgaW5zdHJ1Y3Rpb246IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMDE5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY2hhcmFjdGVyICVzIGluIG1uZW1vbmljIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTAyNgotbXNnaWQgImV4cGVjdGluZyBwcmVmaXg7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTAyOAotbXNnaWQgImV4cGVjdGluZyBtbmVtb25pYzsgZ290IG5vdGhpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMDQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZHVuZGFudCAlcyBwcmVmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBzdHJpbmcgaW5zdHJ1Y3Rpb24gYWZ0ZXIgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjExMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBjaGFyYWN0ZXIgJXMgYmVmb3JlIG9wZXJhbmQgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgInVuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gb3BlcmFuZCAlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuYmFsYW5jZWQgYnJhY2tldHMgaW4gb3BlcmFuZCAlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY2hhcmFjdGVyICVzIGluIG9wZXJhbmQgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxMTgxCi0jLCBjLWZvcm1hdAotbXNnaWQgInNwdXJpb3VzIG9wZXJhbmRzOyAoJWQgb3BlcmFuZHMvaW5zdHJ1Y3Rpb24gbWF4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjEyMDIKLW1zZ2lkICJleHBlY3Rpbmcgb3BlcmFuZCBhZnRlciAnLCc7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTIwNwotbXNnaWQgImV4cGVjdGluZyBvcGVyYW5kIGJlZm9yZSAnLCc7IGdvdCBub3RoaW5nIgotbXNnc3RyICIiCi0KLSMuIHdlIGZvdW5kIG5vIG1hdGNoCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE0MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3VmZml4IG9yIG9wZXJhbmRzIGludmFsaWQgZm9yIGAlcyciCi1tc2dzdHIgIiIKLQotIy4gV2FybiB0aGVtIHRoYXQgYSBkYXRhIG9yIGFkZHJlc3Mgc2l6ZSBwcmVmaXggZG9lc24ndCBhZmZlY3QKLSMuIGFzc2VtYmx5IG9mIHRoZSBuZXh0IGxpbmUgb2YgY29kZS4KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTQ0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJzdGFuZC1hbG9uZSBgJXMnIHByZWZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE0NjcgY29uZmlnL3RjLWkzODYuYzoxNDgyCi1tc2dpZCAiYCVzJyBvcGVyYW5kICVkIG11c3QgdXNlIGAlJWVzJyBzZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTU0OCBjb25maWcvdGMtaTM4Ni5jOjE1ODkgY29uZmlnL3RjLWkzODYuYzoxNjE2Ci1tc2dpZCAidXNpbmcgYCUlJXMnIGluc3RlYWQgb2YgYCUlJXMnIGR1ZSB0byBgJWMnIHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE1NjEgY29uZmlnL3RjLWkzODYuYzoxNTc4IGNvbmZpZy90Yy1pMzg2LmM6MTYwNQotbXNnaWQgImAlJSVzJyBub3QgYWxsb3dlZCB3aXRoIGAlcyVjJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE2NDUgY29uZmlnL3RjLWkzODYuYzoxNjY1Ci1tc2dpZCAibm8gaW5zdHJ1Y3Rpb24gbW5lbW9uaWMgc3VmZml4IGdpdmVuOyBjYW4ndCBkZXRlcm1pbmUgaW1tZWRpYXRlIHNpemUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoxNjkwCi1tc2dpZCAiIgotIm5vIGluc3RydWN0aW9uIG1uZW1vbmljIHN1ZmZpeCBnaXZlbiBhbmQgbm8gcmVnaXN0ZXIgb3BlcmFuZHM7IGNhbid0IHNpemUgIgotImluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSMuIHJldmVyc2VkIGFyZ3VtZW50cyBvbiBmYWRkcCwgZnN1YnAsIGV0Yy4KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MTgwMwotbXNnaWQgInRyYW5zbGF0aW5nIHRvIGAlcyAlJSVzLCUlJXMnIgotbXNnc3RyICIiCi0KLSMuIGV4dHJhbmVvdXMgYGwnIHN1ZmZpeCBvbiBmcCBpbnNuCi0jOiBjb25maWcvdGMtaTM4Ni5jOjE4MTAKLW1zZ2lkICJ0cmFuc2xhdGluZyB0byBgJXMgJSUlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyMDIyCi1tc2dpZCAieW91IGNhbid0IGBwb3AgJSVjcyciCi1tc2dzdHIgIiIKLQotIy4gVW5peFdhcmUgZnN1YiBubyBhcmdzIGlzIGFsaWFzIGZvciBmc3VicCwgZmFkZCAtPiBmYWRkcCwgZXRjCi0jOiBjb25maWcvdGMtaTM4Ni5jOjIwNTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidHJhbnNsYXRpbmcgdG8gYCVzcCciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyMDg0IGNvbmZpZy90Yy1pMzg2LmM6MjE4NyBjb25maWcvdGMtaTM4Ni5jOjIyNDcKLW1zZ2lkICJza2lwcGluZyBwcmVmaXhlcyBvbiB0aGlzIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjEwNCBjb25maWcvdGMtaTM4Ni5jOjIyMTEgY29uZmlnL3RjLWkzODYuYzoyMjYwCi1tc2dpZCAiMTYtYml0IGp1bXAgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjIwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJgJXMnIG9ubHkgdGFrZXMgYnl0ZSBkaXNwbGFjZW1lbnQ7ICVsZCBzaG9ydGVuZWQgdG8gJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyMjY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbid0IGhhbmRsZSBub24gYWJzb2x1dGUgc2VnbWVudCBpbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MjUyNwotbXNnaWQgIk9ubHkgMSBvciAyIGltbWVkaWF0ZSBvcGVyYW5kcyBhcmUgYWxsb3dlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1NTggY29uZmlnL3RjLWkzODYuYzoyNzg4Ci1tc2dpZCAiR09UIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgaW4gMTYgYml0IG1vZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNTc5IGNvbmZpZy90Yy1pMzg2LmM6MjgwOQotbXNnaWQgIkJhZCByZWxvYyBzcGVjaWZpZXIgaW4gZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI1OTcgY29uZmlnL3RjLWkzODYuYzoyODQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIGp1bmsgYCVzJyBhZnRlciBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSMuIG1pc3Npbmcgb3IgYmFkIGV4cHIgYmVjb21lcyBhYnNvbHV0ZSAwCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI2MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTWlzc2luZyBvciBpbnZhbGlkIGltbWVkaWF0ZSBleHByZXNzaW9uIGAlcycgdGFrZW4gYXMgMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjI2MzkgY29uZmlnL3RjLWkzODYuYzoyODYyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuaW1wbGVtZW50ZWQgc2VnbWVudCB0eXBlICVkIGluIG9wZXJhbmQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBzY2FsZSBmYWN0b3Igb2YgMSwgMiwgNCwgb3IgODogZ290IGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzoyNjg4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNjYWxlIGZhY3RvciBvZiAlZCB3aXRob3V0IGFuIGluZGV4IHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzAzNyBjb25maWcvdGMtaTM4Ni5jOjMwNDMgY29uZmlnL3RjLWkzODYuYzozMDUyCi0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBzZWdtZW50IG5hbWUgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjMyMTggY29uZmlnL3RjLWkzODYuYzozNDczCi0jLCBjLWZvcm1hdAotbXNnaWQgInRvbyBtYW55IG1lbW9yeSByZWZlcmVuY2VzIGZvciBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzMyOSBjb25maWcvdGMtaTM4Ni5jOjMzNDIgY29uZmlnL3RjLWkzODYuYzozNjU0Ci0jOiBjb25maWcvdGMtaTM4Ni5jOjM2NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYCVzJyBpcyBub3QgYSB2YWxpZCAlcyBiaXQgYmFzZS9pbmRleCBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzQyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgbWVtb3J5IG9wZXJhbmQgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTM4Ni5jOjM0NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSnVuayBgJXMnIGFmdGVyIHJlZ2lzdGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzU4MgotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RpbmcgYCwnIG9yIGApJyBhZnRlciBpbmRleCByZWdpc3RlciBpbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzU5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RpbmcgYCknIGFmdGVyIHNjYWxlIGZhY3RvciBpbiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6MzYwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJleHBlY3RpbmcgaW5kZXggcmVnaXN0ZXIgb3Igc2NhbGUgZmFjdG9yIGFmdGVyIGAsJzsgZ290ICclYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzozNjEzCi0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGluZyBgLCcgb3IgYCknIGFmdGVyIGJhc2UgcmVnaXN0ZXIgaW4gYCVzJyIKLW1zZ3N0ciAiIgotCi0jLiBpdCdzIG5vdCBhIG1lbW9yeSBvcGVyYW5kOyBhcmdoIQotIzogY29uZmlnL3RjLWkzODYuYzozNjc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgY2hhciAlcyBiZWdpbm5pbmcgb3BlcmFuZCAlZCBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDA5NQotbXNnaWQgIkJhZCBjYWxsIHRvIG1kX2F0b2YgKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo0MTU2IGNvbmZpZy90Yy1pMzg2LmM6NDE2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgcmVnaXN0ZXIgbmFtZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDIyMwotbXNnaWQgIi1tXHRcdFx0ZG8gbG9uZyBqdW1wXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWkzODYuYzo0MjYzCi1tc2dpZCAiR09UIGFscmVhZHkgaW4gc3ltYm9sIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pMzg2LmM6NDQwOSBjb25maWcvdGMtbWNvcmUuYzoyMTMwIGNvbmZpZy90Yy1zaC5jOjI0MjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2Fubm90IHJlcHJlc2VudCByZWxvY2F0aW9uIHR5cGUgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzoxNTcgY29uZmlnL3RjLWk4NjAuYzoxNjEKLW1zZ2lkICJVbmtub3duIHRlbXBvcmFyeSBwc2V1ZG8gcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzoxODMgY29uZmlnL3RjLW1pcHMuYzoxMDEzIGNvbmZpZy90Yy1zcGFyYy5jOjY5NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbCBlcnJvcjogY2FuJ3QgaGFzaCBgJXMnOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MzQxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkV4cGFuZGVkIG9wY29kZSBhZnRlciBkZWxheWVkIGJyYW5jaDogYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjM0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJFeHBhbmRlZCBvcGNvZGUgaW4gZHVhbCBtb2RlOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6NTgwCi1tc2dpZCAiRnNyMSBlcXVhbHMgZmRlc3Qgd2l0aCBQaXBlbGluaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6NjMxCi1tc2dpZCAiNS1iaXQgaW1tZWRpYXRlIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjcyNQotbXNnaWQgIklsbGVnYWwgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo3NDkgY29uZmlnL3RjLXNwYXJjLmM6MjMzOAotbXNnaWQgImJhZCBzZWdtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6ODc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjI2LWJpdCBicmFuY2ggdy9vIHBjIHJlbGF0aXZlIHNldDogMHglMDh4IgotbXNnc3RyICIiCi0KLSMuIGFsaWduIHBjcmVsIG9mZnNldCwgc2VlIG1hbnVhbAotIy4gY2hlY2sgZm9yIG92ZXJmbG93Ci0jOiBjb25maWcvdGMtaTg2MC5jOjg4MgotIywgYy1mb3JtYXQKLW1zZ2lkICIyNi1iaXQgYnJhbmNoIG9mZnNldCBvdmVyZmxvdzogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6ODkxIGNvbmZpZy90Yy1pODYwLmM6OTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgNC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6ODk2IGNvbmZpZy90Yy1pODYwLmM6OTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgMi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBicmFuY2ggb2Zmc2V0IG92ZXJmbG93OiAweCUwOHgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiMTYtYml0IGltbWVkaWF0ZSAxNi1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgOC1ieXRlIGFsaWdubWVudCBlcnJvcjogMHglMDh4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6OTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIjE2LWJpdCBpbW1lZGlhdGUgb3ZlcmZsb3c6IDB4JTA4eCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTg2MC5jOjk1MQotbXNnaWQgIm1kX251bWJlcl90b19kaXNwXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzo5NjEKLW1zZ2lkICJpODYwX251bWJlcl90b19maWVsZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pODYwLmM6MTAwMQotbXNnaWQgImk4NjBfY29udmVydF9mcmFnXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk4NjAuYzoxMDEwCi1tc2dpZCAiaTg2MF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6NTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkhhc2hpbmcgcmV0dXJuZWQgXCIlc1wiLiIKLW1zZ3N0ciAiIgotCi0jLiBPZmZzZXQgb2YgbGFzdCBjaGFyYWN0ZXIgaW4gb3Bjb2RlIG1uZW1vbmljCi0jOiBjb25maWcvdGMtaTk2MC5jOjU5MwotbXNnaWQgImJyYW5jaCBwcmVkaWN0aW9uIGludmFsaWQgb24gdGhpcyBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo2MzYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBvcGNvZGUsIFwiJXNcIi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo2NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW1wcm9wZXIgbnVtYmVyIG9mIG9wZXJhbmRzLiAgZXhwZWN0aW5nICVkLCBnb3QgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzo3ODYgY29uZmlnL3RjLW0zMnIuYzoxMjM5Ci1tc2dpZCAiQmFkIGNhbGwgdG8gbWRfYXRvZigpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6ODc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZpeHVwIG9mICVsZCB0b28gbGFyZ2UgZm9yIGZpZWxkIHdpZHRoIG9mICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6OTk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTAxNAotbXNnaWQgIkk5NjAgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjEwMTcKLW1zZ2lkICIiCi0iXG4iCi0iXHRcdFx0c3BlY2lmeSB2YXJpYW50IG9mIDk2MCBhcmNoaXRlY3R1cmVcbiIKLSItYlx0XHRcdGFkZCBjb2RlIHRvIGNvbGxlY3Qgc3RhdGlzdGljcyBhYm91dCBicmFuY2hlcyB0YWtlblxuIgotIi1saW5rLXJlbGF4XHRcdHByZXNlcnZlIGluZGl2aWR1YWwgYWxpZ25tZW50IGRpcmVjdGl2ZXMgc28gbGlua2VyXG4iCi0iXHRcdFx0Y2FuIGRvIHJlbGF4aW5nIChiLm91dCBmb3JtYXQgb25seSlcbiIKLSItbm8tcmVsYXhcdFx0ZG9uJ3QgYWx0ZXIgY29tcGFyZS1hbmQtYnJhbmNoIGluc3RydWN0aW9ucyBmb3JcbiIKLSJcdFx0XHRsb25nIGRpc3BsYWNlbWVudHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE0MjUKLW1zZ2lkICJ0b28gbWFueSBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE0ODUgY29uZmlnL3RjLWk5NjAuYzoxNzE1Ci1tc2dpZCAiZXhwcmVzc2lvbiBzeW50YXggZXJyb3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoxNTIzCi1tc2dpZCAiYXR0ZW1wdCB0byBicmFuY2ggaW50byBkaWZmZXJlbnQgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE1MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidGFyZ2V0IG9mICVzIGluc3RydWN0aW9uIG11c3QgYmUgYSBsYWJlbCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjE1NjcKLW1zZ2lkICJ1bm1hdGNoZWQgJ1snIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTU3OAotbXNnaWQgImdhcmJhZ2UgYWZ0ZXIgaW5kZXggc3BlYyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSMuIFdlIG5ldmVyIG1vdmVkOiB0aGVyZSB3YXMgbm8gb3Bjb2RlIGVpdGhlciEKLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTY0NQotbXNnaWQgIm1pc3Npbmcgb3Bjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MTk1MwotbXNnaWQgImludmFsaWQgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMDY2Ci1tc2dpZCAiaW52YWxpZCBpbmRleCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIwODkKLW1zZ2lkICJpbnZhbGlkIHNjYWxlIGZhY3RvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjIyNzIKLW1zZ2lkICJ1bmFsaWduZWQgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMjk1Ci1tc2dpZCAibm8gc3VjaCBzZnIgaW4gdGhpcyBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyMzMzCi1tc2dpZCAiaWxsZWdhbCBsaXRlcmFsIgotbXNnc3RyICIiCi0KLSMuIFNob3VsZCBub3QgaGFwcGVuOiBzZWUgYmxvY2sgY29tbWVudCBhYm92ZQotIzogY29uZmlnL3RjLWk5NjAuYzoyNTY2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlRyeWluZyB0byAnYmFsJyB0byAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI1NzcKLW1zZ2lkICJMb29rcyBsaWtlIGEgcHJvYywgYnV0IGNhbid0IHRlbGwgd2hhdCBraW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjYwOQotbXNnaWQgInNob3VsZCBoYXZlIDEgb3IgMiBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2MTggY29uZmlnL3RjLWk5NjAuYzoyNjM3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlJlZGVmaW5pbmcgbGVhZnByb2MgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzoyNjY3Ci1tc2dpZCAic2hvdWxkIGhhdmUgdHdvIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MjY3NwotbXNnaWQgIidlbnRyeV9udW0nIG11c3QgYmUgYWJzb2x1dGUgbnVtYmVyIGluIFswLDMxXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI2ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVkZWZpbmluZyBlbnRyeW51bSBmb3Igc3lzcHJvYyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI3OTcKLW1zZ2lkICJhcmNoaXRlY3R1cmUgb2Ygb3Bjb2RlIGNvbmZsaWN0cyB3aXRoIHRoYXQgb2YgZWFybGllciBpbnN0cnVjdGlvbihzKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI4MTgKLW1zZ2lkICJiaWcgZW5kaWFuIG1vZGUgaXMgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtaTk2MC5jOjI4MjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaWdub3JpbmcgdW5yZWNvZ25pemVkIC5lbmRpYW4gdHlwZSBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MzEyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJsZWFmcHJvYyBzeW1ib2wgJyVzJyB1bmRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLWk5NjAuYzozMTMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IG1ha2luZyBsZWFmcHJvYyBlbnRyaWVzICVzIGFuZCAlcyBib3RoIGdsb2JhbFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MzI0MgotbXNnaWQgIm9wdGlvbiAtLWxpbmstcmVsYXggaXMgb25seSBzdXBwb3J0ZWQgaW4gYi5vdXQgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1pOTYwLmM6MzI4NQotbXNnaWQgImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoxOTEKLW1zZ2lkICIgTTMyUiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjE5NAotbXNnaWQgIiIKLSIgIC13YXJuLXVubWF0Y2hlZC1oaWdoICAgIHdhcm4gd2hlbiBhbiAocyloaWdoIHJlbG9jIGhhcyBubyBtYXRjaGluZyBsb3cgIgotInJlbG9jXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoxOTYKLW1zZ2lkICIgIC1uby13YXJuLXVubWF0Y2hlZC1oaWdoIGRvIG5vdCB3YXJuIGFib3V0IG1pc3NpbmcgbG93IHJlbG9jc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MTk4Ci1tc2dpZCAiICAtV3VoICAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtd2Fybi11bm1hdGNoZWQtaGlnaFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjAwCi1tc2dpZCAiICAtV251aCAgICAgICAgICAgICAgICAgICBzeW5vbnltIGZvciAtbm8td2Fybi11bm1hdGNoZWQtaGlnaFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6MjA0Ci1tc2dpZCAiICAtcmVsYXggICAgICAgICAgICAgICAgIGNyZWF0ZSBsaW5rZXIgcmVsYXhhYmxlIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjIwNgotbXNnaWQgIiAgLWNwdS1kZXNjICAgICAgICAgICAgICBwcm92aWRlIHJ1bnRpbWUgY3B1IGRlc2NyaXB0aW9uIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjMzMSByZWFkLmM6Mjc1NSByZWFkLmM6NDgyNAotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo2MzAgY29uZmlnL3RjLXBwYy5jOjEzMzYgY29uZmlnL3RjLXBwYy5jOjM1NDAgcmVhZC5jOjEzNjgKLW1zZ2lkICJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6NjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5TQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tMzJyLmM6NjUzIGNvbmZpZy90Yy1wcGMuYzoxMzU4IGNvbmZpZy90Yy1wcGMuYzoyMjY3Ci0jOiBjb25maWcvdGMtcHBjLmM6MzU2NAotbXNnaWQgImlnbm9yaW5nIGJhZCBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzo2NzkgY29uZmlnL3RjLXBwYy5jOjEzNjkgY29uZmlnL3RjLXBwYy5jOjM1NzYgcmVhZC5jOjEzODgKLSM6IHJlYWQuYzoyMTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjY4OAotIywgYy1mb3JtYXQKLW1zZ2lkICJMZW5ndGggb2YgLnNjb21tIFwiJXNcIiBpcyBhbHJlYWR5ICVsZC4gTm90IGNoYW5nZWQgdG8gJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTMyci5jOjkzMgotbXNnaWQgIkFkZGVuZCB0byB1bnJlc29sdmVkIHN5bWJvbCBub3Qgb24gd29yZCBib3VuZGFyeS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW0zMnIuYzoxMTYxCi1tc2dpZCAiVW5tYXRjaGVkIGhpZ2gvc2hpZ2ggcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NDYKLW1zZ2lkICJVbmtub3duIFBDIHJlbGF0aXZlIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Nzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSBwYy1yZWxhdGl2ZSBwaWMgcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjc4MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4gbm90IGRvICVkIGJ5dGUgcGljIHJlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo4ODUgY29uZmlnL3RjLW1pcHMuYzoxMTE0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW5ub3QgbWFrZSAlcyByZWxvY2F0aW9uIFBDIHJlbGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6OTk4IGNvbmZpZy90Yy10YWhvZS5jOjE1MDUgY29uZmlnL3RjLXZheC5jOjE3NzQKLW1zZ2lkICJObyBvcGVyYXRvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjEwMjggY29uZmlnL3RjLXRhaG9lLmM6MTUyMiBjb25maWcvdGMtdmF4LmM6MTc5MQotbXNnaWQgIlVua25vd24gb3BlcmF0b3IiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODAzCi1tc2dpZCAiaW52YWxpZCBpbnN0cnVjdGlvbiBmb3IgdGhpcyBhcmNoaXRlY3R1cmU7IG5lZWRzICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MDgKLW1zZ2lkICJmcHUgKDY4MDQwLCA2ODA2MCBvciA2ODg4MS82ODg4MikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODExCi1tc2dpZCAibW11ICg2ODAzMCBvciA2ODg1MSkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODE0Ci1tc2dpZCAiNjgwMjAgb3IgaGlnaGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MTgxNwotbXNnaWQgIjY4MDAwIG9yIGhpZ2hlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE4MjAKLW1zZ2lkICI2ODAxMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxODQ4Ci1tc2dpZCAib3BlcmFuZHMgbWlzbWF0Y2giCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoxOTA1IGNvbmZpZy90Yy1tNjhrLmM6MTkxMSBjb25maWcvdGMtbTY4ay5jOjE5MTcKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjE5NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmlnbnVtIHRvbyBiaWcgZm9yICVjIGZvcm1hdDsgdHJ1bmNhdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjA0MgotbXNnaWQgImRpc3BsYWNlbWVudCB0b28gbGFyZ2UgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMTUyCi1tc2dpZCAiIgotInNjYWxlIGZhY3RvciBpbnZhbGlkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyBjcHUzMiBvciA2ODAyMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMTU3Ci1tc2dpZCAiaW52YWxpZCBpbmRleCBzaXplIGZvciBjb2xkZmlyZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIyMTAKLW1zZ2lkICJGb3JjaW5nIGJ5dGUgZGlzcGxhY2VtZW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjIxMgotbXNnaWQgImJ5dGUgZGlzcGxhY2VtZW50IG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjIyNTkgY29uZmlnL3RjLW02OGsuYzoyMjk3Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIG1vZGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlOyBuZWVkcyA2ODAyMCBvciBoaWdoZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMjgzIGNvbmZpZy90Yy1tNjhrLmM6MjMxNwotbXNnaWQgIjpiIG5vdCBwZXJtaXR0ZWQ7IGRlZmF1bHRpbmcgdG8gOnciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyMzk5Ci1tc2dpZCAidW5zdXBwb3J0ZWQgYnl0ZSB2YWx1ZTsgdXNlIGEgZGlmZmVyZW50IHN1ZmZpeCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI0MTMKLW1zZ2lkICJ1bmtub3duL2luY29ycmVjdCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MjQ0NiBjb25maWcvdGMtbTY4ay5jOjI0NTQgY29uZmlnL3RjLW02OGsuYzoyNDYxCi0jOiBjb25maWcvdGMtbTY4ay5jOjI0NjgKLW1zZ2lkICJvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyNTE4Ci1tc2dpZCAiQ2FuJ3QgdXNlIGxvbmcgYnJhbmNoZXMgb24gNjgwMDAvNjgwMTAvNTIwMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI2MDYKLW1zZ2lkICJFeHByZXNzaW9uIG91dCBvZiByYW5nZSwgdXNpbmcgMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3MTggY29uZmlnL3RjLW02OGsuYzoyNzM0Ci1tc2dpZCAiRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjI3MjQKLW1zZ2lkICJXcm9uZyByZWdpc3RlciBpbiBmbG9hdGluZy1wb2ludCByZWdsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mjc0MAotbXNnaWQgImluY29ycmVjdCByZWdpc3RlciBpbiByZWdsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mjc0NgotbXNnaWQgIndyb25nIHJlZ2lzdGVyIGluIGZsb2F0aW5nLXBvaW50IHJlZ2xpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzoyODIyCi1tc2dpZCAiZmFpbGVkIHNhbml0eSBjaGVjayIKLW1zZ3N0ciAiIgotCi0jLiBFUlJPUgotIzogY29uZmlnL3RjLW02OGsuYzozMTg3Ci1tc2dpZCAiRXh0cmEgKSIKLW1zZ3N0ciAiIgotCi0jLiBFUlJPUgotIzogY29uZmlnL3RjLW02OGsuYzozMTk4Ci1tc2dpZCAiTWlzc2luZyApIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzIxNQotbXNnaWQgIk1pc3Npbmcgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM1NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgLS0gc3RhdGVtZW50IGAlcycgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjM1OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRG9uJ3Qga25vdyBob3cgdG8gZmlndXJlIHdpZHRoIG9mICVjIGluIG1kX2Fzc2VtYmxlKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozNzU5IGNvbmZpZy90Yy1tNjhrLmM6Mzc5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBFcnJvcjogQ2FuJ3QgZmluZCAlcyBpbiBoYXNoIHRhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6Mzc2MiBjb25maWcvdGMtbTY4ay5jOjM3OTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgRXJyb3I6IENhbid0IGhhc2ggJXM6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6MzkyNgotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgZGVmYXVsdCBjcHUgYCVzJyA/Pz8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozOTM4Ci1tc2dpZCAiNjgwNDAgYW5kIDY4ODUxIHNwZWNpZmllZDsgbW11IGluc3RydWN0aW9ucyBtYXkgYXNzZW1ibGUgaW5jb3JyZWN0bHkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozOTU4Ci1tc2dpZCAib3B0aW9ucyBmb3IgNjg4ODEgYW5kIG5vLTY4ODgxIGJvdGggZ2l2ZW4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzozOTYwCi1tc2dpZCAib3B0aW9ucyBmb3IgNjg4NTEgYW5kIG5vLTY4ODUxIGJvdGggZ2l2ZW4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo0MDMxCi0jLCBjLWZvcm1hdAotbXNnaWQgInRleHQgbGFiZWwgYCVzJyBhbGlnbmVkIHRvIG9kZCBib3VuZGFyeSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQyNDgKLW1zZ2lkICJpbnZhbGlkIGJ5dGUgYnJhbmNoIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQzMDUKLW1zZ2lkICJzaG9ydCBicmFuY2ggd2l0aCB6ZXJvIG9mZnNldDogdXNlIDp3IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDM1MQotbXNnaWQgIkxvbmcgYnJhbmNoIG9mZnNldCBub3Qgc3VwcG9ydGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ0MTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3IgKGxvbmcgUEMtcmVsYXRpdmUgb3BlcmFuZCkgZm9yIGluc24gMHglMDR4IGF0IDB4JWx4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDQ0MwotbXNnaWQgImRpc3BsYWNlbWVudCBkb2Vzbid0IGZpdCBpbiBvbmUgYnl0ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ1NTYKLW1zZ2lkICJMb25nIGJyYW5jaCBvZmZzZXQgdG8gZXh0ZXJuIHN5bWJvbCBub3Qgc3VwcG9ydGVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ5MDUgY29uZmlnL3RjLW02OGsuYzo0OTE2Ci1tc2dpZCAiZXhwcmVzc2lvbiBvdXQgb2YgcmFuZ2U6IGRlZmF1bHRpbmcgdG8gMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjQ5NDgKLW1zZ2lkICJleHByZXNzaW9uIG91dCBvZiByYW5nZTogZGVmYXVsdGluZyB0byAwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NDk4MSBjb25maWcvdGMtbTY4ay5jOjQ5OTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgZGVhbCB3aXRoIGV4cHJlc3Npb247IGRlZmF1bHRpbmcgdG8gJWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTAwNwotbXNnaWQgImV4cHJlc3Npb24gZG9lc24ndCBmaXQgaW4gQllURSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUwMTEKLW1zZ2lkICJleHByZXNzaW9uIGRvZXNuJ3QgZml0IGluIFdPUkQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MTA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bnJlY29nbml6ZWQgcHJvY2Vzc29yIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1MTY5Ci1tc2dpZCAiYmFkIGNvcHJvY2Vzc29yIGlkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTE3NQotbXNnaWQgInVucmVjb2duaXplZCBmb3B0IG9wdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUzMDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3B0aW9uIGAlcycgbWF5IG5vdCBiZSBuZWdhdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTMyMAotIywgYy1mb3JtYXQKLW1zZ2lkICJvcHRpb24gYCVzJyBub3QgcmVjb2duaXplZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjUzNTMKLW1zZ2lkICJiYWQgZm9ybWF0IG9mIE9QVCBORVNUPWRlcHRoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTQxNgotbXNnaWQgIm1pc3NpbmcgbGFiZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NDQwIGNvbmZpZy90Yy1tNjhrLmM6NTQ2OQotbXNnaWQgImJhZCByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTQ0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgcmVnaXN0ZXIgbGlzdDogJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NTQwCi1tc2dpZCAicmVzdG9yZSB3aXRob3V0IHNhdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo1NzE3IGNvbmZpZy90Yy1tNjhrLmM6NjA2NgotbXNnaWQgInN5bnRheCBlcnJvciBpbiBzdHJ1Y3R1cmVkIGNvbnRyb2wgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NTc2OAotbXNnaWQgIm1pc3NpbmcgY29uZGl0aW9uIGNvZGUgaW4gc3RydWN0dXJlZCBjb250cm9sIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYxMDAKLW1zZ2lkICJtaXNzaW5nIHRoZW4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2MTgyCi1tc2dpZCAiZWxzZSB3aXRob3V0IG1hdGNoaW5nIGlmIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjIxNgotbXNnaWQgImVuZGkgd2l0aG91dCBtYXRjaGluZyBpZiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYyNTcKLW1zZ2lkICJicmVhayBvdXRzaWRlIG9mIHN0cnVjdHVyZWQgbG9vcCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYyOTYKLW1zZ2lkICJuZXh0IG91dHNpZGUgb2Ygc3RydWN0dXJlZCBsb29wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tNjhrLmM6NjM0OAotbXNnaWQgIm1pc3NpbmcgPSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjYzODYKLW1zZ2lkICJtaXNzaW5nIHRvIG9yIGRvd250byIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY0MjIgY29uZmlnL3RjLW02OGsuYzo2NDU2IGNvbmZpZy90Yy1tNjhrLmM6NjY2NgotbXNnaWQgIm1pc3NpbmcgZG8iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2NTU5Ci1tc2dpZCAiZW5kZiB3aXRob3V0IGZvciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY2MTUKLW1zZ2lkICJ1bnRpbCB3aXRob3V0IHJlcGVhdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY3MDIKLW1zZ2lkICJlbmR3IHdpdGhvdXQgd2hpbGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2ODE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVucmVjb2duaXplZCBvcHRpb24gYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY4NjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGAlcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTMzCi1tc2dpZCAiIgotIjY4MFgwIG9wdGlvbnM6XG4iCi0iLWxcdFx0XHR1c2UgMSB3b3JkIGZvciByZWZzIHRvIHVuZGVmaW5lZCBzeW1ib2xzIFtkZWZhdWx0IDJdXG4iCi0iLW02ODAwMCB8IC1tNjgwMDggfCAtbTY4MDEwIHwgLW02ODAyMCB8IC1tNjgwMzAgfCAtbTY4MDQwIHwgLW02ODA2MFxuIgotIiB8IC1tNjgzMDIgfCAtbTY4MzMxIHwgLW02ODMzMiB8IC1tNjgzMzMgfCAtbTY4MzQwIHwgLW02ODM2MFxuIgotIiB8IC1tY3B1MzIgfCAtbTUyMDBcbiIKLSJcdFx0XHRzcGVjaWZ5IHZhcmlhbnQgb2YgNjgwWDAgYXJjaGl0ZWN0dXJlIFtkZWZhdWx0IDY4MDIwXVxuIgotIi1tNjg4ODEgfCAtbTY4ODgyIHwgLW1uby02ODg4MSB8IC1tbm8tNjg4ODJcbiIKLSJcdFx0XHR0YXJnZXQgaGFzL2xhY2tzIGZsb2F0aW5nLXBvaW50IGNvcHJvY2Vzc29yXG4iCi0iXHRcdFx0W2RlZmF1bHQgeWVzIGZvciA2ODAyMCwgNjgwMzAsIGFuZCBjcHUzMl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY5NDMKLW1zZ2lkICIiCi0iLW02ODg1MSB8IC1tbm8tNjg4NTFcbiIKLSJcdFx0XHR0YXJnZXQgaGFzL2xhY2tzIG1lbW9yeS1tYW5hZ2VtZW50IHVuaXQgY29wcm9jZXNzb3JcbiIKLSJcdFx0XHRbZGVmYXVsdCB5ZXMgZm9yIDY4MDIwIGFuZCB1cF1cbiIKLSItcGljLCAta1x0XHRnZW5lcmF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG4iCi0iLVNcdFx0XHR0dXJuIGpic3IgaW50byBqc3JcbiIKLSItLXJlZ2lzdGVyLXByZWZpeC1vcHRpb25hbFxuIgotIlx0XHRcdHJlY29nbml6ZSByZWdpc3RlciBuYW1lcyB3aXRob3V0IHByZWZpeCBjaGFyYWN0ZXJcbiIKLSItLWJpdHdpc2Utb3JcdFx0ZG8gbm90IHRyZWF0IGB8JyBhcyBhIGNvbW1lbnQgY2hhcmFjdGVyXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW02OGsuYzo2OTUyCi1tc2dpZCAiIgotIi0tYmFzZS1zaXplLWRlZmF1bHQtMTZcdGJhc2UgcmVnIHdpdGhvdXQgc2l6ZSBpcyAxNiBiaXRzXG4iCi0iLS1iYXNlLXNpemUtZGVmYXVsdC0zMlx0YmFzZSByZWcgd2l0aG91dCBzaXplIGlzIDMyIGJpdHMgKGRlZmF1bHQpXG4iCi0iLS1kaXNwLXNpemUtZGVmYXVsdC0xNlx0ZGlzcGxhY2VtZW50IHdpdGggdW5rbm93biBzaXplIGlzIDE2IGJpdHNcbiIKLSItLWRpc3Atc2l6ZS1kZWZhdWx0LTMyXHRkaXNwbGFjZW1lbnQgd2l0aCB1bmtub3duIHNpemUgaXMgMzIgYml0cyAoZGVmYXVsdClcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY5ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3IgJXMgaW4gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTY4ay5jOjY5OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiT3Bjb2RlKCVkLiVzKTogIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MjA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGhhc2ggaW5zdHJ1Y3Rpb24gJyVzJzolcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjI1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG1uZW1vbmljICclcyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoyNzgKLW1zZ2lkICJQYXJhbWV0ZXIgc3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MzMzCi1tc2dpZCAiVW5rbm93biByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIy4gSGF2aW5nIHRoaXMgaGVyZSByZXBlYXRzIHRoZSB3YXJuaW5nIHNvbXRpbWVzLgotIy4gQnV0IGNhbid0IHdlIHN0YW5kIHRoYXQ/Ci0jOiBjb25maWcvdGMtbTg4ay5jOjQ0NgotbXNnaWQgIlVzZSBvZiBvYnNvbGV0ZSBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbTg4ay5jOjU2MwotbXNnaWQgIkV4cHJlc3Npb24gdHJ1bmNhdGVkIHRvIDE2IGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzo2MjkgY29uZmlnL3RjLW04OGsuYzo2NTEKLW1zZ2lkICJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA1IGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzo4NzMKLW1zZ2lkICJFeHByZXNzaW9uIHRydW5jYXRlZCB0byA5IGJpdHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzo4OTUKLW1zZ2lkICJSZW1vdmVkIGxvd2VyIDIgYml0cyBvZiBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTAzNAotbXNnaWQgIkJhZCByZWxvY2F0aW9uIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMDQ3Ci1tc2dpZCAibWRfbnVtYmVyX3RvX2Rpc3Agbm90IGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW04OGsuYzoxMDU3Ci1tc2dpZCAibWRfbnVtYmVyX3RvX2ZpZWxkIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTE3MAotbXNnaWQgIlJlbGF4YXRpb24gc2hvdWxkIG5ldmVyIG9jY3VyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTI2NyBjb25maWcvdGMtc3BhcmMuYzozMDI1IHJlYWQuYzoxOTYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJTUyBsZW5ndGggKCVkLikgPDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tODhrLmM6MTMxMQotIywgYy1mb3JtYXQKLW1zZ2lkICJJZ25vcmluZyBhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgJXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjQwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciBleHBlY3RlZCwgYnV0IHNhdyAnJS42cyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6NDg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNvbnRyb2wgcmVnaXN0ZXIgZXhwZWN0ZWQsIGJ1dCBzYXcgJyUuNnMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjY0NQotbXNnaWQgIm1vcmUgdGhhbiA2NUsgbGl0ZXJhbCBwb29scyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo2OTkKLW1zZ2lkICJtaXNzaW5nICddJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo3MzkKLW1zZ2lkICJvcGVyYW5kIG11c3QgYmUgYSBjb25zdGFudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo3NDEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGFic29sdXRlIGluIHJhbmdlICVkLi4lZCwgbm90ICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjc3OQotbXNnaWQgIm9wZXJhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6Nzg2Ci1tc2dpZCAib3BlcmFuZCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo4MDAgY29uZmlnL3RjLW1jb3JlLmM6MTMwMSBjb25maWcvdGMtbWNvcmUuYzoxMzU1Ci1tc2dpZCAiYmFzZSByZWdpc3RlciBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo4NDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93biBvcGNvZGUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjg5MgotbXNnaWQgImludmFsaWQgcmVnaXN0ZXI6IHIxNSBpbGxlZ2FsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjk1MSBjb25maWcvdGMtbWNvcmUuYzo5OTAgY29uZmlnL3RjLW1jb3JlLmM6MTAwOQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTAyOCBjb25maWcvdGMtbWNvcmUuYzoxMDU1IGNvbmZpZy90Yy1tY29yZS5jOjEwODQKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjExMjEgY29uZmlnL3RjLW1jb3JlLmM6MTE1NiBjb25maWcvdGMtbWNvcmUuYzoxMTc1Ci0jOiBjb25maWcvdGMtbWNvcmUuYzoxMTk0IGNvbmZpZy90Yy1tY29yZS5jOjEyMjYgY29uZmlnL3RjLW1jb3JlLmM6MTI0OAotIzogY29uZmlnL3RjLW1jb3JlLmM6MTMwNCBjb25maWcvdGMtbWNvcmUuYzoxMzU4IGNvbmZpZy90Yy1tY29yZS5jOjEzOTMKLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE0NDcgY29uZmlnL3RjLW1jb3JlLmM6MTQ2OSBjb25maWcvdGMtbWNvcmUuYzoxNDkyCi1tc2dpZCAic2Vjb25kIG9wZXJhbmQgbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzo5NjYKLW1zZ2lkICJkZXN0aW5hdGlvbiByZWdpc3RlciBtdXN0IGJlIHIxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjk4NwotbXNnaWQgInNvdXJjZSByZWdpc3RlciBtdXN0IGJlIHIxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEwNTAgY29uZmlnL3RjLW1jb3JlLmM6MTEwNwotbXNnaWQgImltbWVkaWF0ZSBpcyBub3QgYSBwb3dlciBvZiB0d28iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTA3OAotbXNnaWQgInRyYW5zbGF0aW5nIGJnZW5pIHRvIG1vdmkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTExNQotbXNnaWQgInRyYW5zbGF0aW5nIG1nZW5pIHRvIG1vdmkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTE0NwotbXNnaWQgInRyYW5zbGF0aW5nIGJtYXNraSB0byBtb3ZpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyMjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZGlzcGxhY2VtZW50IHRvbyBsYXJnZSAoJWQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyMzUKLW1zZ2lkICJJbnZhbGlkIHJlZ2lzdGVyOiByMCBhbmQgcjE1IGlsbGVnYWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTI2MgotbXNnaWQgImJhZCBzdGFydGluZyByZWdpc3RlcjogcjAgYW5kIHIxNSBpbnZhbGlkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEyNzUKLW1zZ2lkICJlbmRpbmcgcmVnaXN0ZXIgbXVzdCBiZSByMTUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTI5NQotbXNnaWQgImJhZCBiYXNlIHJlZ2lzdGVyOiBtdXN0IGJlIHIwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzMTMKLW1zZ2lkICJmaXJzdCByZWdpc3RlciBtdXN0IGJlIHI0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjEzMjQKLW1zZ2lkICJsYXN0IHJlZ2lzdGVyIG11c3QgYmUgcjciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTM2MQotbXNnaWQgInJlZy1yZWcgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTQ2NgotbXNnaWQgInNlY29uZCBvcGVyYW5kIG11c3QgYmUgMSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDg3Ci1tc2dpZCAiemVybyB1c2VkIGFzIGltbWVkaWF0ZSB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNDk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuaW1wbGVtZW50ZWQgb3Bjb2RlIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxNTY4IGNvbmZpZy90Yy13NjUuYzo4NTYKLW1zZ2lkICJCYWQgY2FsbCB0byBNRF9OVE9GKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTYzMQotbXNnaWQgIiIKLSJNQ09SRSBzcGVjaWZpYyBvcHRpb25zOlxuIgotIiAgLXtuby19anNyaTJic3JcdCAge2Rpc31hYmxlIGpzcmkgdG8gYnNyIHRyYW5zZm9ybWF0aW9uIChkZWY6IGRpcylcbiIKLSIgIC17bm8tfXNpZmlsdGVyXHQgIHtkaXN9YWJsZSBzaWxpY29uIGZpbHRlciBiZWhhdmlvciAoZGVmOiBkaXMpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE2NDcKLW1zZ2lkICJmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG9ydF9qdW1wIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE2NTgKLW1zZ2lkICJmYWlsZWQgc2FuaXR5IGNoZWNrOiBsb25nX2p1bXAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1jb3JlLmM6MTY4NQotIywgYy1mb3JtYXQKLW1zZ2lkICJvZGQgZGlzcGxhY2VtZW50IGF0ICV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE4MzkKLW1zZ2lkICJ1bmtub3duIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE4NDQgY29uZmlnL3RjLW5zMzJrLmM6MjI4MQotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9kZCBkaXN0YW5jZSBicmFuY2ggKDB4JXggYnl0ZXMpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE4NzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGNyZWwgZm9yIGJyYW5jaCB0byAlcyB0b28gZmFyICgweCV4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoxODg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInBjcmVsIGZvciBscncvam1waS9qc3JpIHRvICVzIHRvbyBmYXIgKDB4JXgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjE4OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicGNyZWwgZm9yIGxvb3B0IHRvbyBmYXIgKDB4JXgpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tY29yZS5jOjIxMTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlICVzcmVsb2NhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWNvcmUuYzoyMTE0Ci1tc2dpZCAicGMtcmVsYXRpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5NjAKLW1zZ2lkICJ0cmFwIGV4Y2VwdGlvbiBub3Qgc3VwcG9ydGVkIGF0IElTQSAxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAwMAotbXNnaWQgIkNvdWxkIG5vdCBzZXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbDogY2FuJ3QgaGFzaCBgJXMnOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWwgZXJyb3I6IGJhZCBtaXBzMTYgb3Bjb2RlOiAlcyAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTIxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJyZXR1cm5lZCBmcm9tIG1pcHNfaXAoJXMpIGluc25fb3Bjb2RlID0gMHgleFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTczOSBjb25maWcvdGMtbWlwcy5jOjExMjc5Ci1tc2dpZCAiZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gaW4gZGVsYXkgc2xvdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjE3NjEgY29uZmlnL3RjLW1pcHMuYzoxNzY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImp1bXAgdG8gbWlzYWxpZ25lZCBhZGRyZXNzICgweCVseCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoyNDE5IGNvbmZpZy90Yy1taXBzLmM6Mjc4MgotbXNnaWQgIk1hY3JvIGluc3RydWN0aW9uIGV4cGFuZGVkIGludG8gbXVsdGlwbGUgaW5zdHJ1Y3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MjgzNQotbXNnaWQgInVuc3VwcG9ydGVkIGxhcmdlIGNvbnN0YW50IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MjgzNwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnN0cnVjdGlvbiAlcyByZXF1aXJlcyBhYnNvbHV0ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Mjk4MwotbXNnaWQgIk51bWJlciBsYXJnZXIgdGhhbiAzMiBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzAwNAotbXNnaWQgIk51bWJlciBsYXJnZXIgdGhhbiA2NCBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzI3MCBjb25maWcvdGMtbWlwcy5jOjMzNDIgY29uZmlnL3RjLW1pcHMuYzo1MDIxCi0jOiBjb25maWcvdGMtbWlwcy5jOjUwNzIgY29uZmlnL3RjLW1pcHMuYzo1NjA4IGNvbmZpZy90Yy1taXBzLmM6NTY3MQotbXNnaWQgIlBJQyBjb2RlIG9mZnNldCBvdmVyZmxvdyAobWF4IDE2IHNpZ25lZCBiaXRzKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjM1ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQnJhbmNoICVzIGlzIGFsd2F5cyBmYWxzZSAobm9wKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjM1ODYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQnJhbmNoIGxpa2VseSAlcyBpcyBhbHdheXMgZmFsc2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzozNTkzIGNvbmZpZy90Yy1taXBzLmM6MzY2NyBjb25maWcvdGMtbWlwcy5jOjM3NzAKLSM6IGNvbmZpZy90Yy1taXBzLmM6MzgyNSBjb25maWcvdGMtbWlwcy5jOjY3MDcgY29uZmlnL3RjLW1pcHMuYzo2NzE2Ci0jOiBjb25maWcvdGMtbWlwcy5jOjY3MjQgY29uZmlnL3RjLW1pcHMuYzo2ODMzCi1tc2dpZCAiVW5zdXBwb3J0ZWQgbGFyZ2UgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIy4gcmVzdWx0IGlzIGFsd2F5cyB0cnVlCi0jOiBjb25maWcvdGMtbWlwcy5jOjM2MjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQnJhbmNoICVzIGlzIGFsd2F5cyB0cnVlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MzkwMSBjb25maWcvdGMtbWlwcy5jOjQwMDgKLW1zZ2lkICJEaXZpZGUgYnkgemVyby4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo0NTkyCi1tc2dpZCAiTUlQUyBQSUMgY2FsbCB0byByZWdpc3RlciBvdGhlciB0aGFuICQyNSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjQ1OTcgY29uZmlnL3RjLW1pcHMuYzo0NzA5Ci1tc2dpZCAiTm8gLmNwcmVzdG9yZSBwc2V1ZG8tb3AgdXNlZCBpbiBQSUMgY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjQ3ODIgY29uZmlnL3RjLW1pcHMuYzo0ODcxIGNvbmZpZy90Yy1taXBzLmM6NTM1OQotIzogY29uZmlnL3RjLW1pcHMuYzo1NDAwIGNvbmZpZy90Yy1taXBzLmM6NTQxOCBjb25maWcvdGMtbWlwcy5jOjYwNDYKLSM6IGNvbmZpZy90Yy1taXBzLmM6NzA1NAotbXNnaWQgIm9wY29kZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcHJvY2Vzc29yIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NTg3NyBjb25maWcvdGMtbWlwcy5jOjY2MDEKLW1zZ2lkICJNYWNybyB1c2VkICRhdCBhZnRlciBcIi5zZXQgbm9hdFwiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjAxNyBjb25maWcvdGMtbWlwcy5jOjYwMzUKLW1zZ2lkICJyb3RhdGUgY291bnQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjA4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnN0cnVjdGlvbiAlczogcmVzdWx0IGlzIGFsd2F5cyBmYWxzZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjYyNTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW5zdHJ1Y3Rpb24gJXM6IHJlc3VsdCBpcyBhbHdheXMgdHJ1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjYzOTQgY29uZmlnL3RjLW1pcHMuYzo2NDIxIGNvbmZpZy90Yy1taXBzLmM6NjQ5MwotIzogY29uZmlnL3RjLW1pcHMuYzo2NTE4Ci1tc2dpZCAib3BlcmFuZCBvdmVyZmxvdyIKLW1zZ3N0ciAiIgotCi0jLiBGSVhNRTogQ2hlY2sgaWYgdGhpcyBpcyBvbmUgb2YgdGhlIGl0YmwgbWFjcm9zLCBzaW5jZSB0aGV5Ci0jLiBhcmUgYWRkZWQgZHluYW1pY2FsbHkuCi0jOiBjb25maWcvdGMtbWlwcy5jOjY1OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTWFjcm8gJXMgbm90IGltcGxlbWVudGVkIHlldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjY4NjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW50ZXJuYWw6IGJhZCBtaXBzIG9wY29kZSAobWFzayBlcnJvcik6ICVzICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NjkxOQotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnRlcm5hbDogYmFkIG1pcHMgb3Bjb2RlICh1bmtub3duIG9wZXJhbmQgdHlwZSBgJWMnKTogJXMgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo2OTI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludGVybmFsOiBiYWQgbWlwcyBvcGNvZGUgKGJpdHMgMHglbHggdW5kZWZpbmVkKTogJXMgJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MDU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wY29kZSByZXF1aXJlcyAtbWlwcyVkIG9yIGdyZWF0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MTI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkltcHJvcGVyIHNoaWZ0IGFtb3VudCAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcxNTQgY29uZmlnL3RjLW1pcHMuYzo4MjcyIGNvbmZpZy90Yy1taXBzLmM6ODM4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIHZhbHVlIGZvciBgJXMnICglbHUpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzE3MgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIGJyZWFrIGNvZGUgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MTg2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgbG93ZXIgYnJlYWsgY29kZSAoJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjcxOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBzeXNjYWxsIGNvZGUgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNvcHJvY2Nlc29yIGNvZGUgPiAyNSBiaXRzICglbGQpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzIyNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkYXRlIHBlcmZvcm1hbmNlIHJlZ3N0ZXIgKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3MjYxCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgcmVnaXN0ZXIgbnVtYmVyICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NDIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludmFsaWQgZmxvYXQgcmVnaXN0ZXIgbnVtYmVyICglZCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NDMyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZsb2F0IHJlZ2lzdGVyIHNob3VsZCBiZSBldmVuLCB3YXMgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NDg0IGNvbmZpZy90Yy1taXBzLmM6NzcxNiBjb25maWcvdGMtbWlwcy5jOjc3NTUKLW1zZ2lkICJhYnNvbHV0ZSBleHByZXNzaW9uIHJlcXVpcmVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzU0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJCYWQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQ6ICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6NzY2MgotbXNnaWQgIkNhbid0IHVzZSBmbG9hdGluZyBwb2ludCBpbnNuIGluIHRoaXMgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc3MTgKLW1zZ2lkICIxNiBiaXQgZXhwcmVzc2lvbiBub3QgaW4gcmFuZ2UgMC4uNjU1MzUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3NzU3Ci1tc2dpZCAiMTYgYml0IGV4cHJlc3Npb24gbm90IGluIHJhbmdlIC0zMjc2OC4uMzI3NjciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3ODI5Ci1tc2dpZCAibHVpIGV4cHJlc3Npb24gbm90IGluIHJhbmdlIDAuLjY1NTM1IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6Nzg1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyICRmY2MlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjc4NjEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFkIGNoYXIgPSAnJWMnXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3ODc0IGNvbmZpZy90Yy1taXBzLmM6ODQxMgotbXNnaWQgImlsbGVnYWwgb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo3OTQxCi1tc2dpZCAidW5yZWNvZ25pemVkIG9wY29kZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjgwNTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBudW1iZXIgKCVkKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjgxMzEKLW1zZ2lkICJ1c2VkICRhdCB3aXRob3V0IFwiLnNldCBub2F0XCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4MzA2Ci1tc2dpZCAiY2FuJ3QgcGFyc2UgcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjgzNDAgY29uZmlnL3RjLW1pcHMuYzo4MzcwCi1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6ODUzNwotbXNnaWQgImV4dGVuZGVkIG9wZXJhbmQgcmVxdWVzdGVkIGJ1dCBub3QgcmVxdWlyZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4NTM5Ci1tc2dpZCAiaW52YWxpZCB1bmV4dGVuZGVkIG9wZXJhbmQgdmFsdWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo4NTY3Ci1tc2dpZCAib3BlcmFuZCB2YWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTAwOAotIywgYy1mb3JtYXQKLW1zZ2lkICJpZ25vcmluZyBpbnZhbGlkIGxlYWRpbmcgJ3YnIGluIC1tY3B1PSVzIHN3aXRjaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkwMTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXRlY3R1cmUgLW1jcHU9JXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MDY0Ci1tc2dpZCAiLUcgbWF5IG5vdCBiZSB1c2VkIHdpdGggZW1iZWRkZWQgUElDIGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MDc2Ci1tc2dpZCAiLWNhbGxfc2hhcmVkIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBFTEYgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTA4MiBjb25maWcvdGMtbWlwcy5jOjEwMDkzIGNvbmZpZy90Yy1taXBzLmM6MTAyNjEKLW1zZ2lkICItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBTVlI0IFBJQyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTA5MQotbXNnaWQgIi1ub25fc2hhcmVkIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBFTEYgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTEwNwotbXNnaWQgIi1HIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgY29uZmlndXJhdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkxMTIKLW1zZ2lkICItRyBtYXkgbm90IGJlIHVzZWQgd2l0aCBTVlI0IG9yIGVtYmVkZGVkIFBJQyBjb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTEzNgotbXNnaWQgIk5vIGNvbXBpbGVkIGluIHN1cHBvcnQgZm9yIDY0IGJpdCBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MTk3Ci1tc2dpZCAiIgotIk1JUFMgb3B0aW9uczpcbiIKLSItbWVtYmVkZGVkLXBpY1x0XHRnZW5lcmF0ZSBlbWJlZGRlZCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlXG4iCi0iLUVCXHRcdFx0Z2VuZXJhdGUgYmlnIGVuZGlhbiBvdXRwdXRcbiIKLSItRUxcdFx0XHRnZW5lcmF0ZSBsaXR0bGUgZW5kaWFuIG91dHB1dFxuIgotIi1nLCAtZzJcdFx0XHRkbyBub3QgcmVtb3ZlIHVuZWVkZWQgTk9QcyBvciBzd2FwIGJyYW5jaGVzXG4iCi0iLUcgTlVNXHRcdFx0YWxsb3cgcmVmZXJlbmNpbmcgb2JqZWN0cyB1cCB0byBOVU0gYnl0ZXNcbiIKLSJcdFx0XHRpbXBsaWNpdGx5IHdpdGggdGhlIGdwIHJlZ2lzdGVyIFtkZWZhdWx0IDhdXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MjA1Ci1tc2dpZCAiIgotIi1taXBzMVx0XHRcdGdlbmVyYXRlIE1JUFMgSVNBIEkgaW5zdHJ1Y3Rpb25zXG4iCi0iLW1pcHMyXHRcdFx0Z2VuZXJhdGUgTUlQUyBJU0EgSUkgaW5zdHJ1Y3Rpb25zXG4iCi0iLW1pcHMzXHRcdFx0Z2VuZXJhdGUgTUlQUyBJU0EgSUlJIGluc3RydWN0aW9uc1xuIgotIi1taXBzNFx0XHRcdGdlbmVyYXRlIE1JUFMgSVNBIElWIGluc3RydWN0aW9uc1xuIgotIi1tY3B1PUNQVVx0XHRnZW5lcmF0ZSBjb2RlIGZvciBDUFUsIHdoZXJlIENQVSBpcyBvbmUgb2Y6XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5MjMxCi1tc2dpZCAiIgotIi1tQ1BVXHRcdFx0ZXF1aXZhbGVudCB0byAtbWNwdT1DUFUuXG4iCi0iLW5vLW1DUFVcdFx0ZG9uJ3QgZ2VuZXJhdGUgY29kZSBzcGVjaWZpYyB0byBDUFUuXG4iCi0iXHRcdFx0Rm9yIC1tQ1BVIGFuZCAtbm8tbUNQVSwgQ1BVIG11c3QgYmUgb25lIG9mOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTI0NAotbXNnaWQgIiIKLSItbWlwczE2XHRcdFx0Z2VuZXJhdGUgbWlwczE2IGluc3RydWN0aW9uc1xuIgotIi1uby1taXBzMTZcdFx0ZG8gbm90IGdlbmVyYXRlIG1pcHMxNiBpbnN0cnVjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjkyNDcKLW1zZ2lkICIiCi0iLU8wXHRcdFx0cmVtb3ZlIHVubmVlZGVkIE5PUHMsIGRvIG5vdCBzd2FwIGJyYW5jaGVzXG4iCi0iLU9cdFx0XHRyZW1vdmUgdW5uZWVkZWQgTk9QcyBhbmQgc3dhcCBicmFuY2hlc1xuIgotIi0tdHJhcCwgLS1uby1icmVha1x0dHJhcCBleGNlcHRpb24gb24gZGl2IGJ5IDAgYW5kIG11bHQgb3ZlcmZsb3dcbiIKLSItLWJyZWFrLCAtLW5vLXRyYXBcdGJyZWFrIGV4Y2VwdGlvbiBvbiBkaXYgYnkgMCBhbmQgbXVsdCBvdmVyZmxvd1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTI1MwotbXNnaWQgIiIKLSItS1BJQywgLWNhbGxfc2hhcmVkXHRnZW5lcmF0ZSBTVlI0IHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGVcbiIKLSItbm9uX3NoYXJlZFx0XHRkbyBub3QgZ2VuZXJhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZVxuIgotIi14Z290XHRcdFx0YXNzdW1lIGEgMzIgYml0IEdPVFxuIgotIi0zMlx0XHRcdGNyZWF0ZSAzMiBiaXQgb2JqZWN0IGZpbGUgKGRlZmF1bHQpXG4iCi0iLTY0XHRcdFx0Y3JlYXRlIDY0IGJpdCBvYmplY3QgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTMxMAotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnN1cHBvcnRlZCByZWxvYyBzaXplICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTQxMwotbXNnaWQgIlVubWF0Y2hlZCAlJWhpIHJlbG9jIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTUxOAotbXNnaWQgIkludmFsaWQgUEMgcmVsYXRpdmUgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5NjE3IGNvbmZpZy90Yy1zcGFyYy5jOjI2MTcgY29uZmlnL3RjLXNwYXJjLmM6MjYyNAotIzogY29uZmlnL3RjLXNwYXJjLmM6MjYzMSBjb25maWcvdGMtc3BhcmMuYzoyNjM4IGNvbmZpZy90Yy1zcGFyYy5jOjI2NDUKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjI2NTQgY29uZmlnL3RjLXNwYXJjLmM6MjY2NSBjb25maWcvdGMtc3BhcmMuYzoyNjkxCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyNzE0IHdyaXRlLmM6OTcyIHdyaXRlLmM6MTAzNgotbXNnaWQgInJlbG9jYXRpb24gb3ZlcmZsb3ciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzo5NjMzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJyYW5jaCB0byBvZGQgYWRkcmVzcyAoJWx4KSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk3ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTA4bHggIFVOREVGSU5FRFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTg1NAotbXNnaWQgIkFsaWdubWVudCBuZWdhdGl2ZTogMCBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjk5NDIKLW1zZ2lkICJObyByZWFkIG9ubHkgZGF0YSBzZWN0aW9uIGluIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6OTk2NQotbXNnaWQgIkdsb2JhbCBwb2ludGVycyBub3Qgc3VwcG9ydGVkOyByZWNvbXBpbGUgLUcgMCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMDUxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBubyBzdWNoIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDA4OAotIywgYy1mb3JtYXQKLW1zZ2lkICIub3B0aW9uIHBpYyVkIG5vdCBzdXBwb3J0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDA5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgb3B0aW9uIFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMTYyCi1tc2dpZCAiYG5vcmVvcmRlcicgbXVzdCBiZSBzZXQgYmVmb3JlIGBub21hY3JvJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwMTk3Ci1tc2dpZCAidW5rbm93biBJU0EgbGV2ZWwiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDIyMAotbXNnaWQgIi5zZXQgcG9wIHdpdGggbm8gLnNldCBwdXNoIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAyNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVHJpZWQgdG8gc2V0IHVucmVjb2duaXplZCBzeW1ib2w6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMDI5NAotbXNnaWQgIi5jcGxvYWQgbm90IGluIG5vcmVvcmRlciBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTAzNzYKLW1zZ2lkICJVbnN1cHBvcnRlZCB1c2Ugb2YgLmdwd29yZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNTEzCi1tc2dpZCAiZXhwZWN0ZWQgYCQnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA1MjEKLW1zZ2lkICJCYWQgcmVnaXN0ZXIgbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA1MzcKLW1zZ2lkICJVbnJlY29nbml6ZWQgcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjEwNzM0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgUEMgcmVsYXRpdmUgcmVmZXJlbmNlIHRvIGRpZmZlcmVudCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA4NDMKLW1zZ2lkICJ1bnN1cHBvcnRlZCByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA5MjYKLW1zZ2lkICJBVCB1c2VkIGFmdGVyIFwiLnNldCBub2F0XCIgb3IgbWFjcm8gdXNlZCBhZnRlciBcIi5zZXQgbm9tYWNyb1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTA5ODkKLW1zZ2lkICJEb3VibGUgY2hlY2sgZnhfcl90eXBlIGluIHRjLW1pcHMuYzp0Y19nZW5fcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTQ3MAotbXNnaWQgIm1pc3NpbmcgYC5lbmQnIGF0IGVuZCBvZiBhc3NlbWJseSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNDg1Ci1tc2dpZCAiRXhwZWN0ZWQgc2ltcGxlIG51bWJlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTUxMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnJWMnIDB4JTAyeFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE1MTMKLW1zZ2lkICJJbnZhbGlkIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTY4Ci1tc2dpZCAiLmVuZCBub3QgaW4gdGV4dCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE1NzIKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSB3aXRob3V0IGEgcHJlY2VkaW5nIC5lbnQgZGlyZWN0aXZlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNTgxCi1tc2dpZCAiLmVuZCBzeW1ib2wgZG9lcyBub3QgbWF0Y2ggLmVudCBzeW1ib2wuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE1ODQKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSBtaXNzaW5nIG9yIHVua25vd24gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE2NTkKLW1zZ2lkICIuZW50IG9yIC5hZW50IG5vdCBpbiB0ZXh0IHNlY3Rpb24uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1taXBzLmM6MTE2NjIKLW1zZ2lkICJtaXNzaW5nIGAuZW5kJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNjk1IGVjb2ZmLmM6MzIyNgotbXNnaWQgIi5mcmFtZSBvdXRzaWRlIG9mIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1pcHMuYzoxMTcwNiBlY29mZi5jOjMyMzcKLW1zZ2lkICJCYWQgLmZyYW1lIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNzM2Ci1tc2dpZCAiLm1hc2svLmZtYXNrIG91dHNpZGUgb2YgLmVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbWlwcy5jOjExNzQzCi1tc2dpZCAiQmFkIC5tYXNrLy5mbWFzayBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1uMTAyMDAuYzozMTQKLW1zZ2lkICIiCi0iTU4xMDIwMCBvcHRpb25zOlxuIgotIm5vbmUgeWV0XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1uMTAyMDAuYzo3ODkgY29uZmlnL3RjLW1uMTAzMDAuYzo3NTAgY29uZmlnL3RjLXBwYy5jOjE2MTMKLSM6IGNvbmZpZy90Yy12ODUwLmM6MTY5MQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgb3Bjb2RlOiBgJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6MzMzCi1tc2dpZCAiIgotIk1OMTAzMDAgb3B0aW9uczpcbiIKLSJub25lIHlldFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1tbjEwMzAwLmM6NzY4Ci1tc2dpZCAiSW52YWxpZCBvcGNvZGUvb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW1uMTAzMDAuYzoxMDk5Ci1tc2dpZCAiSW52YWxpZCByZWdpc3RlciBzcGVjaWZpY2F0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo0NDMKLW1zZ2lkICJJbnZhbGlkIHN5bnRheCBpbiBQQy1yZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NDY3Ci1tc2dpZCAiSW52YWxpZCBzeW50YXggaW4gRXh0ZXJuYWwgYWRkcmVzc2luZyBtb2RlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjUzNgotbXNnaWQgIkludmFsaWQgc3ludGF4IGluIE1lbW9yeSBSZWxhdGl2ZSBhZGRyZXNzaW5nIG1vZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6NjAzCi1tc2dpZCAiSW52YWxpZCBzY2FsZWQtaW5kZXhlZCBtb2RlLCB1c2UgKGIsdyxkLHEpIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjYwOAotbXNnaWQgIlN5bnRheCBpbiBzY2FsZWQtaW5kZXhlZCBtb2RlLCB1c2UgW1JuOm1dIHdoZXJlIG49WzAuLjddIG09e2IsdyxkLHF9IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjYxNAotbXNnaWQgIlNjYWxlZC1pbmRleGVkIGFkZHJlc3NpbmcgbW9kZSBjb21iaW5lZCB3aXRoIHNjYWxlZC1pbmRleCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo2MjMKLW1zZ2lkICJJbnZhbGlkIG9yIGlsbGVnYWwgYWRkcmVzc2luZyBtb2RlIGNvbWJpbmVkIHdpdGggc2NhbGVkLWluZGV4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjczMAotbXNnaWQgIlByZW1hdHVyZSBlbmQgb2Ygc3VmZml4IC0tIERlZmF1bHRpbmcgdG8gZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo3NDMKLW1zZ2lkICJCYWQgc3VmZml4IGFmdGVyICc6JyB1c2Uge2J8d3xkfSBEZWZhdWx0aW5nIHRvIGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6Nzg0Ci1tc2dpZCAiVmVyeSBzaG9ydCBpbnN0ciB0byBvcHRpb24sIGllIHlvdSBjYW4ndCBkbyBpdCBvbiBhIE5VTExzdHIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6ODI4Ci1tc2dpZCAiTm8gc3VjaCBlbnRyeSBpbiBsaXN0LiAoY3B1L21tdSByZWdpc3RlcikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6ODY5Ci1tc2dpZCAiSW50ZXJuYWwgY29uc2lzdGVuY3kgZXJyb3IuICBjaGVjayBuczMyay1vcGNvZGUuaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzo4OTAKLW1zZ2lkICJBZGRyZXNzIG9mIGltbWVkaWF0ZSBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjg5MQotbXNnaWQgIkludmFsaWQgaW1tZWRpYXRlIHdyaXRlIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjEwMTgKLW1zZ2lkICJCYWQgb3Bjb2RlLXRhYmxlLW9wdGlvbiwgY2hlY2sgaW4gZmlsZSBuczMyay1vcGNvZGUuaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMDQ3Ci1tc2dpZCAiTm8gc3VjaCBvcGNvZGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTExNQotbXNnaWQgIkJhZCBzdWZmaXgsIGRlZmF1bHRpbmcgdG8gZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMTM3Ci1tc2dpZCAiVG9vIG1hbnkgb3BlcmFuZHMgcGFzc2VkIHRvIGluc3RydWN0aW9uIgotbXNnc3RyICIiCi0KLSMuIGNoZWNrIGVycm9yIGluIGRlZmF1bHQKLSM6IGNvbmZpZy90Yy1uczMyay5jOjExNDgKLW1zZ2lkICJXcm9uZyBudW1iZXJzIG9mIG9wZXJhbmRzIGluIGRlZmF1bHQsIGNoZWNrIG5zMzJrLW9wY29kZXMuaCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxMTUzCi1tc2dpZCAiV3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjEyNzIKLW1zZ2lkICJpaWYgY29udmVydCBpbnRlcm5hbCBwY3JlbC9iaW5hcnkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTI4OAotbXNnaWQgIkJpZ251bSB0b28gYmlnIGZvciBsb25nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjEzNjMKLW1zZ2lkICJpaWYgY29udmVydCBpbnRlcm5hbCBwY3JlbC9wb2ludGVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjEzNjgKLW1zZ2lkICJJbnRlcm5hbCBsb2dpYyBlcnJvciBpbiBpaWYuaWlmUFtuXS50eXBlIgotbXNnc3RyICIiCi0KLSMuIFdlIGNhbnQgcmVsYXggdGhpcyBjYXNlCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNDAyCi1tc2dpZCAiQ2FuJ3QgcmVsYXggZGlmZmVyZW5jZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNDUxCi1tc2dpZCAiRGlzcGxhY2VtZW50IHRvIGxhcmdlIGZvciA6ZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNDYyCi1tc2dpZCAiSW50ZXJuYWwgbG9naWMgZXJyb3IgaW4gaWlmLmlpZlBbXS50eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE1MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuIG5vdCBkbyAlZCBieXRlIHBjLXJlbGF0aXZlIHJlbG9jYXRpb24gZm9yIHN0b3JhZ2UgdHlwZSAlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNTIwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbiBub3QgZG8gJWQgYnl0ZSByZWxvY2F0aW9uIGZvciBzdG9yYWdlIHR5cGUgJWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTU1MgotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBoYXNoICVzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoxNjM2Ci1tc2dpZCAiQnl0ZSBkaXNwbGFjZW1lbnQgb3V0IG9mIHJhbmdlLiAgbGluZSBudW1iZXIgbm90IHZhbGlkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE2NDUKLW1zZ2lkICJXb3JkIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UuICBsaW5lIG51bWJlciBub3QgdmFsaWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTY1OQotbXNnaWQgIkRvdWJsZSB3b3JkIGRpc3BsYWNlbWVudCBvdXQgb2YgcmFuZ2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MTY3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBsb2dpYyBlcnJvci4gIGxpbmUgJXMsIGZpbGUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE3MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgbG9naWMgZXJyb3IuIGxpbmUgJXMsIGZpbGUgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjE4MzgKLW1zZ2lkICJCaXQgZmllbGQgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1uczMyay5jOjIwODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXRlY3R1cmUgb3B0aW9uIC1tJXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLW5zMzJrLmM6MjEwMwotbXNnaWQgIiIKLSJOUzMySyBvcHRpb25zOlxuIgotIi1tMzIwMzIgfCAtbTMyNTMyXHRzZWxlY3QgdmFyaWFudCBvZiBOUzMySyBhcmNoaXRlY3R1cmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtbnMzMmsuYzoyMjgyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbm5vdCBmaW5kIHJlbG9jYXRpb24gdHlwZSBmb3Igc3ltYm9sICVzLCBjb2RlICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo4MzQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBzd2l0Y2ggLW0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6ODcxCi1tc2dpZCAiIgotIlBvd2VyUEMgb3B0aW9uczpcbiIKLSItdVx0XHRcdGlnbm9yZWRcbiIKLSItbXB3cngsIC1tcHdyMlx0XHRnZW5lcmF0ZSBjb2RlIGZvciBJQk0gUE9XRVIvMiAoUklPUzIpXG4iCi0iLW1wd3JcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBJQk0gUE9XRVIgKFJJT1MxKVxuIgotIi1tNjAxXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgTW90b3JvbGEgUG93ZXJQQyA2MDFcbiIKLSItbXBwYywgLW1wcGMzMiwgLW00MDMsIC1tNjAzLCAtbTYwNFxuIgotIlx0XHRcdGdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjAzLzYwNFxuIgotIi1tcHBjNjQsIC1tNjIwXHRcdGdlbmVyYXRlIGNvZGUgZm9yIE1vdG9yb2xhIFBvd2VyUEMgNjIwXG4iCi0iLW1wcGM2NGJyaWRnZVx0XHRnZW5lcmF0ZSBjb2RlIGZvciBQb3dlclBDIDY0LCBpbmNsdWRpbmcgYnJpZGdlIGluc25zXG4iCi0iLW1jb21cdFx0XHRnZW5lcmF0ZSBjb2RlIFBvd2VyL1Bvd2VyUEMgY29tbW9uIGluc3RydWN0aW9uc1xuIgotIi1tYW55XHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgYW55IGFyY2hpdGVjdHVyZSAoUFdSL1BXUlgvUFBDKVxuIgotIi1tcmVnbmFtZXNcdFx0QWxsb3cgc3ltYm9saWMgbmFtZXMgZm9yIHJlZ2lzdGVyc1xuIgotIi1tbm8tcmVnbmFtZXNcdFx0RG8gbm90IGFsbG93IHN5bWJvbGljIG5hbWVzIGZvciByZWdpc3RlcnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6ODg2Ci1tc2dpZCAiIgotIi1tcmVsb2NhdGFibGVcdFx0c3VwcG9ydCBmb3IgR0NDJ3MgLW1yZWxvY2F0YmxlIG9wdGlvblxuIgotIi1tcmVsb2NhdGFibGUtbGliXHRzdXBwb3J0IGZvciBHQ0MncyAtbXJlbG9jYXRibGUtbGliIG9wdGlvblxuIgotIi1tZW1iXHRcdFx0c2V0IFBQQ19FTUIgYml0IGluIEVMRiBmbGFnc1xuIgotIi1tbGl0dGxlLCAtbWxpdHRsZS1lbmRpYW5cbiIKLSJcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBhIGxpdHRsZSBlbmRpYW4gbWFjaGluZVxuIgotIi1tYmlnLCAtbWJpZy1lbmRpYW5cdGdlbmVyYXRlIGNvZGUgZm9yIGEgYmlnIGVuZGlhbiBtYWNoaW5lXG4iCi0iLW1zb2xhcmlzXHRcdGdlbmVyYXRlIGNvZGUgZm9yIFNvbGFyaXNcbiIKLSItbW5vLXNvbGFyaXNcdFx0ZG8gbm90IGdlbmVyYXRlIGNvZGUgZm9yIFNvbGFyaXNcbiIKLSItVlx0XHRcdHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlclxuIgotIi1ReSwgLVFuXHRcdGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6OTIxCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZGVmYXVsdCBjcHUgPSAlcywgb3MgPSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6OTQ2Ci1tc2dpZCAiTmVpdGhlciBQb3dlciBub3IgUG93ZXJQQyBvcGNvZGVzIHdlcmUgc2VsZWN0ZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo5OTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgYXNzZW1ibGVyIGVycm9yIGZvciBpbnN0cnVjdGlvbiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTAxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBhc3NlbWJsZXIgZXJyb3IgZm9yIG1hY3JvICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxMjIzCi1tc2dpZCAiaWRlbnRpZmllcitjb25zdGFudEBnb3QgbWVhbnMgaWRlbnRpZmllckBnb3QrY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjEyNzcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXMgcmVsb2NhdGlvbnMgZG8gbm90IGZpdCBpbiAlZCBieXRlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxMzc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkxlbmd0aCBvZiAubGNvbW0gXCIlc1wiIGlzIGFscmVhZHkgJWxkLiBOb3QgY2hhbmdlZCB0byAlbGQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoxNDU5Ci1tc2dpZCAiUmVsb2NhdGlvbiBjYW5ub3QgYmUgZG9uZSB3aGVuIHVzaW5nIC1tcmVsb2NhdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE1NDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ludGF4IGVycm9yOiBpbnZhbGlkIHRvYyBzcGVjaWZpZXIgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTU1NAotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW50YXggZXJyb3I6IGV4cGVjdGVkIGBdJywgZm91bmQgIGAlYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE3ODgKLW1zZ2lkICJbdG9jdl0gc3ltYm9sIGlzIG5vdCBhIHRvYyBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE3OTkKLW1zZ2lkICJVbmltcGxlbWVudGVkIHRvYzMyIGV4cHJlc3Npb24gbW9kaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE4MDQKLW1zZ2lkICJVbmltcGxlbWVudGVkIHRvYzY0IGV4cHJlc3Npb24gbW9kaWZpZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjE4MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgWyVkXSBmcm9tIHBhcnNlX3RvY19lbnRyeSFcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MTk2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJzeW50YXggZXJyb3I7IGZvdW5kIGAlYycgYnV0IGV4cGVjdGVkIGAlYyciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIwNjgKLW1zZ2lkICJ3cm9uZyBudW1iZXIgb2Ygb3BlcmFuZHMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjIxMjQKLW1zZ2lkICJCYWQgLnNlY3Rpb24gZGlyZWN0aXZlOiB3YW50IGEsdyx4LGUgaW4gc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMjQyCi1tc2dpZCAibWlzc2luZyBzaXplIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyMjUxCi1tc2dpZCAibmVnYXRpdmUgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjI5MgotbXNnaWQgIm1pc3NpbmcgcmVhbCBzeW1ib2wgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjMxMwotbXNnaWQgImF0dGVtcHQgdG8gcmVkZWZpbmUgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNTQ0Ci1tc2dpZCAiVGhlIFhDT0ZGIGZpbGUgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgYXJiaXRyYXJ5IHNlY3Rpb25zIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyNjUyIGNvbmZpZy90Yy1wcGMuYzozMTY0IHJlYWQuYzoyOTUwCi1tc2dpZCAibWlzc2luZyB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjY3MAotbXNnaWQgImlsbGVnYWwgLnN0YWJ4IGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MjcwMgotbXNnaWQgIm1pc3NpbmcgY2xhc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI3MTEKLW1zZ2lkICJtaXNzaW5nIHR5cGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI3NzIKLW1zZ2lkICJtaXNzaW5nIHN5bWJvbCBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzoyOTQ0Ci1tc2dpZCAibmVzdGVkIC5icyBibG9ja3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjI5NzcKLW1zZ2lkICIuZXMgd2l0aG91dCBwcmVjZWRpbmcgLmJzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozMTU2Ci1tc2dpZCAibm9uLWNvbnN0YW50IGJ5dGUgY291bnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjMyMDEKLW1zZ2lkICIudGMgbm90IGluIC50b2Mgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MzIyMAotbXNnaWQgIi50YyB3aXRoIG5vIGxhYmVsIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozMjk1Ci1tc2dpZCAiTm8gcHJldmlvdXMgc2VjdGlvbiB0byByZXR1cm4gdG8uIERpcmVjdGl2ZSBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jLiBTZWN0aW9uIENvbnRlbnRzCi0jLiB1bmtub3duCi0jOiBjb25maWcvdGMtcHBjLmM6MzcxNAotbXNnaWQgIlVuc3VwcG9ydGVkIHNlY3Rpb24gYXR0cmlidXRlIC0tICdhJyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6MzkwNAotbXNnaWQgImJhZCBzeW1ib2wgc3VmZml4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzozOTk1Ci1tc2dpZCAiVW5yZWNvZ25pemVkIHN5bWJvbCBzdWZmaXgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQwNzcKLW1zZ2lkICJ0d28gLmZ1bmN0aW9uIHBzZXVkby1vcHMgd2l0aCBubyBpbnRlcnZlbmluZyAuZWYiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQwODkKLW1zZ2lkICIuZWYgd2l0aCBubyBwcmVjZWRpbmcgLmZ1bmN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0MjE3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIndhcm5pbmc6IHN5bWJvbCAlcyBoYXMgbm8gY3NlY3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ1MTMKLW1zZ2lkICJzeW1ib2wgaW4gLnRvYyBkb2VzIG5vdCBtYXRjaCBhbnkgLnRjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0ODEwCi1tc2dpZCAidW5zdXBwb3J0ZWQgcmVsb2NhdGlvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0ODY0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImNhbm5vdCBlbWl0IFBDIHJlbGF0aXZlICVzIHJlbG9jYXRpb24gYWdhaW5zdCAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtcHBjLmM6NDg2OQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZW1pdCBQQyByZWxhdGl2ZSAlcyByZWxvY2F0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0OTMxCi1tc2dpZCAibXVzdCBicmFuY2ggdG8gYW4gYWRkcmVzcyBhIG11bHRpcGxlIG9mIDQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXBwYy5jOjQ5MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQGxvY2FsIG9yIEBwbHQgYnJhbmNoIGRlc3RpbmF0aW9uIGlzIHRvbyBmYXIgYXdheSwgJWxkIGJ5dGVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1wcGMuYzo0OTU5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkdhcyBmYWlsdXJlLCByZWxvYyB2YWx1ZSAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjUyMQotbXNnaWQgImlsbGVnYWwgcmVnaXN0ZXIgYWZ0ZXIgQC0iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NTM3Ci1tc2dpZCAibXVzdCBiZSBAKHIwLC4uLikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6NTUzCi1tc2dpZCAic3ludGF4IGVycm9yIGluIEAocjAsLi4uKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo1ODUgY29uZmlnL3RjLXNoLmM6NTkwCi1tc2dpZCAic3ludGF4IGVycm9yIGluIEAoZGlzcCxbUm4sIGdiciwgcGNdKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo1OTUKLW1zZ2lkICJleHBlY3RpbmcgKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzo2MDQKLW1zZ2lkICJpbGxlZ2FsIHJlZ2lzdGVyIGFmdGVyIEAiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTIyOAotbXNnaWQgIi51c2VzIHBzZXVkby1vcCBzZWVuIHdoZW4gbm90IHJlbGF4aW5nIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjEyMzQKLW1zZ2lkICJiYWQgLnVzZXMgZm9ybWF0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjEyODkKLW1zZ2lkICIiCi0iU0ggb3B0aW9uczpcbiIKLSItbGl0dGxlXHRcdFx0Z2VuZXJhdGUgbGl0dGxlIGVuZGlhbiBjb2RlXG4iCi0iLXJlbGF4XHRcdFx0YWx0ZXIganVtcCBpbnN0cnVjdGlvbnMgZm9yIGxvbmcgZGlzcGxhY2VtZW50c1xuIgotIi1zbWFsbFx0XHRcdGFsaWduIHNlY3Rpb25zIHRvIDQgYnl0ZSBib3VuZGFyaWVzLCBub3QgMTZcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxMjk5IGNvbmZpZy90Yy13NjUuYzo4ODMKLW1zZ2lkICJjYWxsIHRvIHRjX05vdXRfZml4X3RvX2NoYXJzIFxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjEzODUKLW1zZ2lkICIudXNlcyBkb2VzIG5vdCByZWZlciB0byBhIGxvY2FsIHN5bWJvbCBpbiB0aGUgc2FtZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE0MDQKLW1zZ2lkICJjYW4ndCBmaW5kIGZpeHVwIHBvaW50ZWQgdG8gYnkgLnVzZXMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTQyNwotbXNnaWQgIi51c2VzIHRhcmdldCBkb2VzIG5vdCByZWZlciB0byBhIGxvY2FsIHN5bWJvbCBpbiB0aGUgc2FtZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE1MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCBvdmVyZmxvd3MgMTItYml0IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE1MjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byBkZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgMTItYml0IGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE1MzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXQgMHglbHgsIGRpc3BsYWNlbWVudCB0byB1bmRlZmluZWQgc3ltYm9sICVzIG92ZXJmbG93cyAxMi1iaXQgZmllbGQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTY0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJhdCAweCVseCwgZGlzcGxhY2VtZW50IG92ZXJmbG93cyA4LWJpdCBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gZGVmaW5lZCBzeW1ib2wgJXMgb3ZlcmZsb3dzIDgtYml0IGZpZWxkICIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoxNjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0IDB4JWx4LCBkaXNwbGFjZW1lbnQgdG8gdW5kZWZpbmVkIHN5bWJvbCAlcyBvdmVyZmxvd3MgOC1iaXQgZmllbGQgIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjE3MDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3ZlcmZsb3cgaW4gYnJhbmNoIHRvICVzOyBjb252ZXJ0ZWQgaW50byBsb25nZXIgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTc4MiBjb25maWcvdGMtc2guYzoxODEwIGNvbmZpZy90Yy1zcGFyYy5jOjM0MzYKLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjM0NTUKLW1zZ2lkICJtaXNhbGlnbmVkIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNoLmM6MTk4OCBjb25maWcvdGMtc2guYzoxOTk1IGNvbmZpZy90Yy1zaC5jOjIwMDIKLSM6IGNvbmZpZy90Yy1zaC5jOjIwMDkKLW1zZ2lkICJwY3JlbCB0b28gZmFyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zaC5jOjIwNzMKLW1zZ2lkICJtaXNhbGlnbmVkIG9mZnNldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc2guYzoyMDgxCi1tc2dpZCAib2Zmc2V0IG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyNTcKLW1zZ2lkICJJbnZhbGlkIGRlZmF1bHQgYXJjaGl0ZWN0dXJlLCBicm9rZW4gYXNzZW1ibGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyNjEgY29uZmlnL3RjLXNwYXJjLmM6NDQ4Ci1tc2dpZCAiQmFkIG9wY29kZSB0YWJsZSwgYnJva2VuIGFzc2VtYmxlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NDI3Ci0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgYXJjaGl0ZWN0dXJlIC14YXJjaD0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo0NDIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiaW52YWxpZCBhcmNoaXRlY3R1cmUgLUElcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTm8gY29tcGlsZWQgaW4gc3VwcG9ydCBmb3IgJWQgYml0IG9iamVjdCBmaWxlIGZvcm1hdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1NDYKLW1zZ2lkICJVbnJlY29nbml6ZWQgb3B0aW9uIGZvbGxvd2luZyAtSyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1NzAKLW1zZ2lkICJTUEFSQyBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU3OAotbXNnaWQgIiIKLSJcbiIKLSIteGFyY2g9djhwbHVzIHwgLXhhcmNoPXY4cGx1c2FcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo1NzkKLW1zZ2lkICIiCi0iXHRcdFx0c3BlY2lmeSB2YXJpYW50IG9mIFNQQVJDIGFyY2hpdGVjdHVyZVxuIgotIi1idW1wXHRcdFx0d2FybiB3aGVuIGFzc2VtYmxlciBzd2l0Y2hlcyBhcmNoaXRlY3R1cmVzXG4iCi0iLXNwYXJjXHRcdFx0aWdub3JlZFxuIgotIi0tZW5mb3JjZS1hbGlnbmVkLWRhdGFcdGZvcmNlIC5sb25nLCBldGMuLCB0byBiZSBhbGlnbmVkIGNvcnJlY3RseVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU4NQotbXNnaWQgIi1rXHRcdFx0Z2VuZXJhdGUgUElDXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTg5Ci1tc2dpZCAiIgotIi0zMlx0XHRcdGNyZWF0ZSAzMiBiaXQgb2JqZWN0IGZpbGVcbiIKLSItNjRcdFx0XHRjcmVhdGUgNjQgYml0IG9iamVjdCBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6NTkyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlx0XHRcdFtkZWZhdWx0IGlzICVkXVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU5NAotbXNnaWQgIiIKLSItVFNPXHRcdFx0dXNlIFRvdGFsIFN0b3JlIE9yZGVyaW5nXG4iCi0iLVBTT1x0XHRcdHVzZSBQYXJ0aWFsIFN0b3JlIE9yZGVyaW5nXG4iCi0iLVJNT1x0XHRcdHVzZSBSZWxheGVkIE1lbW9yeSBPcmRlcmluZ1xuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjU5OAotIywgYy1mb3JtYXQKLW1zZ2lkICJcdFx0XHRbZGVmYXVsdCBpcyAlc11cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo2MDAKLW1zZ2lkICIiCi0iLUtQSUNcdFx0XHRnZW5lcmF0ZSBQSUNcbiIKLSItVlx0XHRcdHByaW50IGFzc2VtYmxlciB2ZXJzaW9uIG51bWJlclxuIgotIi1xXHRcdFx0aWdub3JlZFxuIgotIi1ReSwgLVFuXHRcdGlnbm9yZWRcbiIKLSItc1x0XHRcdGlnbm9yZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo2MDgKLW1zZ2lkICIiCi0iLUVMXHRcdFx0Z2VuZXJhdGUgY29kZSBmb3IgYSBsaXR0bGUgZW5kaWFuIG1hY2hpbmVcbiIKLSItRUJcdFx0XHRnZW5lcmF0ZSBjb2RlIGZvciBhIGJpZyBlbmRpYW4gbWFjaGluZVxuIgotIi0tbGl0dGxlLWVuZGlhbi1kYXRhXHRnZW5lcmF0ZSBjb2RlIGZvciBhIG1hY2hpbmUgaGF2aW5nIGJpZyBlbmRpYW5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMgYW5kIGxpdHRsZSBlbmRpYW4gZGF0YS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6ODU2Ci1tc2dpZCAiU3VwcG9ydCBmb3IgNjQtYml0IGFyaXRobWV0aWMgbm90IGNvbXBpbGVkIGluLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo5MTEKLW1zZ2lkICJGUCBicmFuY2ggaW4gZGVsYXkgc2xvdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo5MjcKLW1zZ2lkICJGUCBicmFuY2ggcHJlY2VkZWQgYnkgRlAgaW5zdHJ1Y3Rpb247IE5PUCBpbnNlcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzo5NDcKLW1zZ2lkICJzZXQ6IHVzZWQgd2l0aCBuZWdhdGl2ZSBudW1iZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6OTQ5Ci1tc2dpZCAic2V0OiBudW1iZXIgbGFyZ2VyIHRoYW4gNDI5NDk2NzI5NSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMDAwCi1tc2dpZCAic2V0eDogdGVtcG9yYXJ5IHJlZ2lzdGVyIHNhbWUgYXMgZGVzdGluYXRpb24gcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTE0NQotbXNnaWQgImZhaWxlZCBzcGVjaWFsIGNhc2UgaW5zbiBzYW5pdHkgY2hlY2siCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTIzNQotbXNnaWQgIjogaW52YWxpZCBtZW1iYXIgbWFzayBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyNDkKLW1zZ2lkICI6IGludmFsaWQgbWVtYmFyIG1hc2sgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjU0Ci1tc2dpZCAiOiBpbnZhbGlkIG1lbWJhciBtYXNrIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMjcyCi1tc2dpZCAiOiBpbnZhbGlkIHByZWZldGNoIGZ1bmN0aW9uIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTI4MAotbXNnaWQgIjogaW52YWxpZCBwcmVmZXRjaCBmdW5jdGlvbiBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEyODUKLW1zZ2lkICI6IGludmFsaWQgcHJlZmV0Y2ggZnVuY3Rpb24gbnVtYmVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEzMTMgY29uZmlnL3RjLXNwYXJjLmM6MTMyNQotbXNnaWQgIjogdW5yZWNvZ25pemFibGUgcHJpdmlsZWdlZCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxMzQ5IGNvbmZpZy90Yy1zcGFyYy5jOjEzNjYKLW1zZ2lkICI6IHVucmVjb2duaXphYmxlIHY5YSBhbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTM1NAotbXNnaWQgIjogcmQgb24gd3JpdGUgb25seSBhbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MTM5MAotbXNnaWQgIjogYXNyIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMTYgYW5kIDMxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjEzOTgKLW1zZ2lkICI6IGFzciBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDMxIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjE0MDgKLW1zZ2lkICI6IGV4cGVjdGluZyAlYXNyTiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxNzk5Ci1tc2dpZCAiOiBUaGVyZSBhcmUgb25seSA2NCBmIHJlZ2lzdGVyczsgWzAtNjNdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjE4MDEgY29uZmlnL3RjLXNwYXJjLmM6MTgxMwotbXNnaWQgIjogVGhlcmUgYXJlIG9ubHkgMzIgZiByZWdpc3RlcnM7IFswLTMxXSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoxOTgyCi1tc2dpZCAiOiBQQy1yZWxhdGl2ZSBvcGVyYW5kIGNhbid0IGJlIGEgY29uc3RhbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjAxNQotbXNnaWQgIjogaW52YWxpZCBBU0kgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMDIzCi1tc2dpZCAiOiBpbnZhbGlkIEFTSSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIwMjgKLW1zZ2lkICI6IGludmFsaWQgQVNJIG51bWJlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzoyMTI1Ci1tc2dpZCAiT1BGIGltbWVkaWF0ZSBvcGVyYW5kIG91dCBvZiByYW5nZSAoMC0weDFmZikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjEzMAotbXNnaWQgIm5vbi1pbW1lZGlhdGUgT1BGIG9wZXJhbmQsIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjE0OQotbXNnaWQgIjogaW52YWxpZCBjcHJlZyBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIxNzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWxsZWdhbCBvcGVyYW5kcyVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIyMDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXJjaGl0ZWN0dXJlIGJ1bXBlZCBmcm9tIFwiJXNcIiB0byBcIiVzXCIgb24gXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjIyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXJjaGl0ZWN0dXJlIG1pc21hdGNoIG9uIFwiJXNcIi4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MjI0NAotIywgYy1mb3JtYXQKLW1zZ2lkICIgKFJlcXVpcmVzICVzOyByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlIGlzICVzLikiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6Mjc2MAotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgb3IgdW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZTogMHglMDJ4IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMwMzcKLW1zZ2lkICJiYWQgLnJlc2VydmUgc2VnbWVudCAtLSBleHBlY3RlZCBCU1Mgc2VnbWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMDU0Ci1tc2dpZCAibWlzc2luZyBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXNwYXJjLmM6MzA2NSBjb25maWcvdGMtc3BhcmMuYzozMjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgImFsaWdubWVudCB0b28gbGFyZ2U7IGFzc3VtaW5nICVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy1zcGFyYy5jOjMwNzEgY29uZmlnL3RjLXNwYXJjLmM6MzIxNgotbXNnaWQgIm5lZ2F0aXZlIGFsaWdubWVudCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMDgxIGNvbmZpZy90Yy1zcGFyYy5jOjMyMzkKLW1zZ2lkICJhbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtc3BhcmMuYzozMTk2Ci1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgY29tbW9uIGxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzozODcKLW1zZ2lkICJUaGUgLWEgb3B0aW9uIGRvZXNuJ3QgZXhpc3QuIChEZXNwaXRlIHdoYXQgdGhlIG1hbiBwYWdlIHNheXMhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjM5MSBjb25maWcvdGMtdmF4LmM6MzE0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJEaXNwbGFjZW1lbnQgbGVuZ3RoICVzIGlnbm9yZWQhIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjM5NSBjb25maWcvdGMtdmF4LmM6MzEzMwotbXNnaWQgIlNZTUJPTCBUQUJMRSBub3QgaW1wbGVtZW50ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6Mzk5IGNvbmZpZy90Yy12YXguYzozMTM3Ci1tc2dpZCAiVE9LRU4gVFJBQ0Ugbm90IGltcGxlbWVudGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjQwMyBjb25maWcvdGMtdmF4LmM6MzE0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJJIGRvbid0IG5lZWQgb3IgdXNlIHRlbXAuIGZpbGUgXCIlc1wiLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzo0MDcgY29uZmlnL3RjLXZheC5jOjMxNDkKLW1zZ2lkICJJIGRvbid0IHVzZSBhbiBpbnRlcnBhc3MgZmlsZSEgLVYgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzo0MjEKLW1zZ2lkICIiCi0iVGFob2Ugb3B0aW9uczpcbiIKLSItYVx0XHRcdGlnbm9yZWRcbiIKLSItZCBMRU5HVEhcdFx0aWdub3JlZFxuIgotIi1KXHRcdFx0aWdub3JlZFxuIgotIi1TXHRcdFx0aWdub3JlZFxuIgotIi10IEZJTEVcdFx0XHRpZ25vcmVkXG4iCi0iLVRcdFx0XHRpZ25vcmVkXG4iCi0iLVZcdFx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTA3NQotbXNnaWQgIkNhc3RpbmcgYSBicmFuY2ggZGlzcGxhY2VtZW50IGlzIGJhZCBmb3JtLCBhbmQgaXMgaWdub3JlZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTEzMQotbXNnaWQgIkNvdWxkbid0IHBhcnNlIHRoZSBbaW5kZXhdIGluIHRoaXMgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTEzNwotbXNnaWQgIkNvdWxkbid0IGZpbmQgdGhlIG9wZW5pbmcgJ1snIGZvciB0aGUgaW5kZXggb2YgdGhpcyBvcGVyYW5kLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMTc3Ci1tc2dpZCAiQ291bGRuJ3QgZmluZCB0aGUgb3BlbmluZyAnKCcgZm9yIHRoZSBkZXJlZiBvZiB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjExODcKLW1zZ2lkICJPcGVyYW5kIGNhbid0IGJlIGJvdGggcHJlLWluYyBhbmQgcG9zdC1kZWMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEyMTcKLW1zZ2lkICJJIHBhcnNlZCAyIHJlZ2lzdGVycyBpbiB0aGlzIG9wZXJhbmQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEyNjcKLW1zZ2lkICJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIGVycm9yLiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIGlzIGFuIGVycm9yLiBUYWhvZSBkb2Vzbid0IGFsbG93IGFueSBleHByZXNzaW9ucwotIy4gYmlnZ2VyIHRoYXQgYSAzMiBiaXQgbG9uZyB3b3JkLiBBbnkgYmlnZ2VyIGhhcyB0byBiZSByZWZlcmVuY2VkCi0jLiBieSBhZGRyZXNzLgotIzogY29uZmlnL3RjLXRhaG9lLmM6MTI3NAotbXNnaWQgIkV4cHJlc3Npb24gaXMgdG9vIGxhcmdlIGZvciBhIDMyIGJpdHMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEyNzkKLW1zZ2lkICJKdW5rIGF0IGVuZCBvZiBleHByZXNzaW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzE5Ci1tc2dpZCAiU3ludGF4IGVycm9yIGluIGRpcmVjdCByZWdpc3RlciBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzIxCi1tc2dpZCAiWW91IGNhbid0IGluZGV4IGEgcmVnaXN0ZXIgaW4gZGlyZWN0IHJlZ2lzdGVyIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMjQKLW1zZ2lkICJTUCBjYW4ndCBiZSB0aGUgc291cmNlIG9wZXJhbmQgd2l0aCBkaXJlY3QgcmVnaXN0ZXIgYWRkcmVzc2luZy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMyNgotbXNnaWQgIkNhbid0IHRha2UgdGhlIGFkZHJlc3Mgb2YgYSByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTMyOAotbXNnaWQgIkRpcmVjdCBSZWdpc3RlciBjYW4ndCBiZSB1c2VkIGluIGEgYnJhbmNoLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzMwCi1tc2dpZCAiRm9yIHF1YWQgYWNjZXNzLCB0aGUgcmVnaXN0ZXIgbXVzdCBiZSBldmVuIGFuZCA8IDE0LiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzMyCi1tc2dpZCAiWW91IGNhbid0IGNhc3QgYSBkaXJlY3QgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzMzgKLW1zZ2lkICJVc2luZyByZWcgMTQgZm9yIHF1YWR3b3JkcyBjYW4gdHJvbXAgdGhlIEZQIHJlZ2lzdGVyLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzUwCi1tc2dpZCAiU3ludGF4IGVycm9yIGluIGF1dG8tZGVjIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNTIKLW1zZ2lkICJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBhdXRvIGRlYyBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzU0Ci1tc2dpZCAiQXV0byBkZWMgbW9kZSBjYW50IGJlIHVzZWQgZm9yIHJlYWRpbmcuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNTYKLW1zZ2lkICJBdXRvIGRlYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM1OAotbXNnaWQgIkF1dG8gZGVjIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNjAKLW1zZ2lkICJBdXRvIGRlYyB3b24ndCB3b3JrIHdpdGggcXVhZHdvcmRzLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxMzY3Ci1tc2dpZCAiU3ludGF4IGVycm9yIGluIG9uZSBvZiB0aGUgYXV0by1pbmMgbW9kZXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNzMKLW1zZ2lkICJBdXRvIGluYyBkZWZlcnJlZCBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM3NQotbXNnaWQgIllvdSBjYW4ndCBoYXZlIGFuIGluZGV4IGF1dG8gaW5jIGRlZmVycmVkIG1vZGUuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzNzcgY29uZmlnL3RjLXRhaG9lLmM6MTM4OAotbXNnaWQgIkF1dG8gaW5jIGNhbid0IGJlIHVzZWQgaW4gYSBicmFuY2guIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzODQKLW1zZ2lkICJZb3UgY2FuJ3Qgd3JpdGUgdG8gYW4gYXV0byBpbmMgcmVnaXN0ZXIuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzODYKLW1zZ2lkICJBdXRvIGluYyBvbmx5IHdvcmtzIG9mIHRoZSBTUCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTM5MAotbXNnaWQgIkF1dG8gaW5jIHdvbid0IHdvcmsgd2l0aCBxdWFkd29yZHMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjEzOTIKLW1zZ2lkICJZb3UgY2FuJ3QgaGF2ZSBhbiBpbmRleCBpbiBhdXRvIGluYyBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNDAwCi1tc2dpZCAiWW91IGNhbid0IGluZGV4IHRoZSBzcCByZWdpc3Rlci4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQwNgotbXNnaWQgIlN5bnRheCBlcnJvciBpbiByZWdpc3RlciBkaXNwbGFjZWQgbW9kZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQyNQotbXNnaWQgIkFuIG9mZmVzdCBpcyBuZWVkZWQgZm9yIHRoaXMgb3BlcmFuZC4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTQzNwotbXNnaWQgIllvdSBjYW4ndCBpbmRleCBhIHJlZ2lzdGVyIGluIGltbWVkaWF0ZSBtb2RlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNDM5Ci1tc2dpZCAiSW1tZWRpYXRlIGFjY2VzcyBjYW4ndCBiZSB1c2VkIGFzIGFuIGFkZHJlc3MuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE1NTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ29tcGlsZXIgYnVnOiBPREQgbnVtYmVyIG9mIGJ5dGVzIGluIGFyZyBzdHJ1Y3R1cmUgJXMuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE1NzcgY29uZmlnL3RjLXZheC5jOjE4NDcKLW1zZ2lkICJOb3QgZW5vdWdoIG9wZXJhbmRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE1ODcgY29uZmlnL3RjLXZheC5jOjE4NTQKLW1zZ2lkICJUb28gbWFueSBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxNjM4IGNvbmZpZy90Yy12YXguYzozNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3Jpbmcgc3RhdGVtZW50IGR1ZSB0byBcIiVzXCIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRhaG9lLmM6MTczMwotIywgYy1mb3JtYXQKLW1zZ2lkICJDb21wbGlsZXIgYnVnOiBHb3QgYSBjYXNlICglZCkgSSB3YXNuJ3QgZXhwZWN0aW5nLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxODI3Ci1tc2dpZCAiUmVhbCBicmFuY2ggZGlzcGxhY2VtZW50cyBtdXN0IGJlIGV4cHJlc3Npb25zLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGFob2UuYzoxODMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNvbXBsaWVyIGVycm9yOiBJIGdvdCBhbiB1bmtub3duIHN5bnRoZXRpYyBicmFuY2ggOiVjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10YWhvZS5jOjE5NzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQmFyZiwgYmFkIG1vZGUgJXhcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo5MAotbXNnaWQgIlJlbGF4YXRpb24gaXMgYSBsdXh1cnkgd2UgY2FuJ3QgYWZmb3JkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjE0MQotbXNnaWQgImJhZCBjYWxsIHRvIG1kX2F0b2YgKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6MjQ1Ci1tc2dpZCAiJzonIG5vdCBmb2xsb3dlZCBieSAnbScgb3IgJ3MnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjI1OQotbXNnaWQgInBhcmVuIG5lc3RpbmciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXRpYzgwLmM6Mjc0Ci1tc2dpZCAibWlzbWF0Y2hlZCBwYXJlbnRoZXNpcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzo0NjcKLW1zZ2lkICJ1bmhhbmRsZWQgZXhwcmVzc2lvbiB0eXBlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjY4MgotbXNnaWQgInN5bWJvbCByZWxvYyB0aGF0IGlzIG5vdCBQQyByZWxhdGl2ZSBvciAzMiBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjcwNQotbXNnaWQgInVuaGFuZGxlZCBvcGVyYW5kIG1vZGlmaWVyIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjc0NgotbXNnaWQgInVuaGFuZGxlZCBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjc5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG1uZW1vbmljOiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjgxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnZhbGlkIG9wZXJhbmRzOiAnJXMnIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjg5MAotbXNnaWQgInVuaGFuZGxlZCBwcmVkZWZpbmVkIHN5bWJvbCBiaXRzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy10aWM4MC5jOjk4NgotIywgYy1mb3JtYXQKLW1zZ2lkICJQQyBvZmZzZXQgMHglbHggb3V0c2lkZSByYW5nZSAweCVseC0weCVseCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoxMDAxCi1tc2dpZCAidW5oYW5kbGVkIHJlbG9jYXRpb24gdHlwZSBpbiBmaXh1cCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdGljODAuYzoxMDM4Ci1tc2dpZCAibWRfY29udmVydF9mcmFnKCkgbm90IGltcGxlbWVudGVkIHlldCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjI3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIuQ09NTW9uIGxlbmd0aCAoJWQuKSA8IDAhIElnbm9yZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTAwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIG9wZXJhbmQgc2hpZnQ6ICV4XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMDAxCi1tc2dpZCAiaW50ZXJuYWwgZmFpbHVyZSBpbiBwYXJzZV9yZWdpc3Rlcl9saXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTAxOQotbXNnaWQgImNvbnN0YW50IGV4cHJlc3Npb24gb3IgcmVnaXN0ZXIgbGlzdCBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjEwMjQgY29uZmlnL3RjLXY4NTAuYzoxMDM3IGNvbmZpZy90Yy12ODUwLmM6MTA1NgotbXNnaWQgImhpZ2ggYml0cyBzZXQgaW4gcmVnaXN0ZXIgbGlzdCBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTA5NiBjb25maWcvdGMtdjg1MC5jOjExNjAKLW1zZ2lkICJpbGxlZ2FsIHJlZ2lzdGVyIGluY2x1ZGVkIGluIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTAzCi1tc2dpZCAic3lzdGVtIHJlZ2lzdGVycyBjYW5ub3QgYmUgaW5jbHVkZWQgaW4gbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExMDgKLW1zZ2lkICJQU1cgY2Fubm90IGJlIGluY2x1ZGVkIGluIGxpc3QiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTE1Ci1tc2dpZCAiSGlnaCB2YWx1ZSBzeXN0ZW0gcmVnaXN0ZXJzIGNhbm5vdCBiZSBpbmNsdWRlZCBpbiBsaXN0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTEzOQotbXNnaWQgInNlY29uZCByZWdpc3RlciBzaG91bGQgZm9sbG93IGRhc2ggaW4gcmVnaXN0ZXIgbGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExODcKLW1zZ2lkICIgVjg1MCBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTE4OAotbXNnaWQgIiAgLW13YXJuLXNpZ25lZC1vdmVyZmxvdyAgICBXYXJuIGlmIHNpZ25lZCBpbW1lZGlhdGUgdmFsdWVzIG92ZXJmbG93XG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTg5Ci1tc2dpZCAiIgotIiAgLW13YXJuLXVuc2lnbmVkLW92ZXJmbG93ICBXYXJuIGlmIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZXMgb3ZlcmZsb3dcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExOTAKLW1zZ2lkICIgIC1tdjg1MCAgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExOTEKLW1zZ2lkICIgIC1tdjg1MGUgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgaXMgdGFyZ2V0ZWQgYXQgdGhlIHY4NTBlXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMTkyCi1tc2dpZCAiICAtbXY4NTBlYSAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIHRhcmdldGVkIGF0IHRoZSB2ODUwZWFcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjExOTMKLW1zZ2lkICIiCi0iICAtbXY4NTBhbnkgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGlzIGdlbmVyaWMsIGRlc3BpdGUgYW55IHByb2Nlc3NvciAiCi0ic3BlY2lmaWMgaW5zdHJ1Y3Rpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMjA0IGNvbmZpZy90Yy12ODUwLmM6MTIzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bmtub3duIGNvbW1hbmQgbGluZSBvcHRpb246IC0lYyVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxMzkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYWJsZSB0byBkZXRlcm1pbmUgZGVmYXVsdCB0YXJnZXQgcHJvY2Vzc29yIGZyb20gc3RyaW5nOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE0NDIKLW1zZ2lkICJjdG9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTQ1OQotbXNnaWQgInNkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTQ3NgotbXNnaWQgInpkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTQ5NAotbXNnaWQgInRkYW9mZigpIHJlbG9jYXRpb24gdXNlZCBvbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IGl0IgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTcxMgotbXNnaWQgIlRhcmdldCBwcm9jZXNzb3IgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGluc3RydWN0aW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4MDIgY29uZmlnL3RjLXY4NTAuYzoxODMyIGNvbmZpZy90Yy12ODUwLmM6MjAxOAotbXNnaWQgImltbWVkaWF0ZSBvcGVyYW5kIGlzIHRvbyBsYXJnZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4MTQKLW1zZ2lkICJBQUFSRyAtPiB1bmhhbmRsZWQgY29uc3RhbnQgcmVsb2MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODU4Ci1tc2dpZCAiaW52YWxpZCByZWdpc3RlciBuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12ODUwLmM6MTg2MwotbXNnaWQgInJlZ2lzdGVyIHIwIGNhbm5vdCBiZSB1c2VkIGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxODc1Ci1tc2dpZCAiaW52YWxpZCBzeXN0ZW0gcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE4ODgKLW1zZ2lkICJleHBlY3RlZCBFUCByZWdpc3RlciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE5MDQKLW1zZ2lkICJpbnZhbGlkIGNvbmRpdGlvbiBjb2RlIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTI1IGNvbmZpZy90Yy12ODUwLmM6MTkyOQotbXNnaWQgImNvbnN0YW50IHRvbyBiaWcgdG8gZml0IGludG8gaW5zdHJ1Y3Rpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoxOTgxCi1tc2dpZCAic3ludGF4IGVycm9yOiB2YWx1ZSBpcyBtaXNzaW5nIGJlZm9yZSB0aGUgcmVnaXN0ZXIgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE5ODMKLW1zZ2lkICJzeW50YXggZXJyb3I6IHJlZ2lzdGVyIG5vdCBleHBlY3RlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdjg1MC5jOjE5OTcKLW1zZ2lkICJzeW50YXggZXJyb3I6IHN5c3RlbSByZWdpc3RlciBub3QgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoyMDAyCi1tc2dpZCAic3ludGF4IGVycm9yOiBjb25kaXRpb24gY29kZSBub3QgZXhwZWN0ZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXY4NTAuYzoyMDM4Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVklQX0JFR0lOIGVycm9yOiVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzozODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3Jpbmcgc3RhdGVtZW50IGJlY2F1c2UgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo0MzQKLW1zZ2lkICJDYW4ndCByZWxvY2F0ZSBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo1MzcKLW1zZ2lkICJCaWdudW0gbm90IHBlcm1pdHRlZCBpbiBzaG9ydCBsaXRlcmFsLiBJbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6NTQ2Ci1tc2dpZCAiQ2FuJ3QgZG8gZmxvbnVtIHNob3J0IGxpdGVyYWw6IGltbWVkaWF0ZSBtb2RlIHVzZWQuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzo1OTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQSBiaWdudW0vZmxvbnVtIG1heSBub3QgYmUgYSBkaXNwbGFjZW1lbnQ6IDB4JWx4IHVzZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjkxMwotIywgYy1mb3JtYXQKLW1zZ2lkICJTaG9ydCBsaXRlcmFsIG92ZXJmbG93KCVsZC4pLCBpbW1lZGlhdGUgbW9kZSBhc3N1bWVkLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6OTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZvcmNlZCBzaG9ydCBsaXRlcmFsIHRvIGltbWVkaWF0ZSBtb2RlLiBub3dfc2VnPSVzIHRvX3NlZz0lcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6OTgxCi1tc2dpZCAiTGVuZ3RoIHNwZWNpZmljYXRpb24gaWdub3JlZC4gQWRkcmVzcyBtb2RlIDlGIHVzZWQiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjEwMzAKLW1zZ2lkICJJbnZhbGlkIG9wZXJhbmQ6ICBpbW1lZGlhdGUgdmFsdWUgdXNlZCBhcyBiYXNlIGFkZHJlc3MuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoxMDMyCi1tc2dpZCAiSW52YWxpZCBvcGVyYW5kOiAgaW1tZWRpYXRlIHZhbHVlIHVzZWQgYXMgYWRkcmVzcy4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjE4MjYKLW1zZ2lkICJvZGQgbnVtYmVyIG9mIGJ5dGVzIGluIG9wZXJhbmQgZGVzY3JpcHRpb24iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjE4NDIKLW1zZ2lkICJCYWQgb3BlcmFuZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjM5OQotbXNnaWQgIm5vICdbJyB0byBtYXRjaCAnXSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI0MTcKLW1zZ2lkICJiYWQgcmVnaXN0ZXIgaW4gW10iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI0MTkKLW1zZ2lkICJbUENdIGluZGV4IGJhbm5lZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjQ1NAotbXNnaWQgIm5vICcoJyB0byBtYXRjaCAnKSciCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI1ODkKLW1zZ2lkICJpbnZhbGlkIGJyYW5jaCBvcGVyYW5kIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjE4Ci1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgQCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYyMAotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzICMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MjQKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyAtKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MjYKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyAoKSsiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MjkKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyAoKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjYzMQotbXNnaWQgImFkZHJlc3MgcHJvaGliaXRzIFtdIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNjMzCi1tc2dpZCAiYWRkcmVzcyBwcm9oaWJpdHMgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2MzUKLW1zZ2lkICJhZGRyZXNzIHByb2hpYml0cyBkaXNwbGFjZW1lbnQgbGVuZ3RoIHNwZWNpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjY2NQotbXNnaWQgImludmFsaWQgb3BlcmFuZCBvZiBTXiMiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI2ODIKLW1zZ2lkICJTXiMgbmVlZHMgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjY4OQotbXNnaWQgIlNeIyBtYXkgb25seSByZWFkLWFjY2VzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MjcxNAotbXNnaWQgImludmFsaWQgb3BlcmFuZCBvZiAtKCkiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3MjAKLW1zZ2lkICItKFBDKSB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzIyCi1tc2dpZCAiW11pbmRleCBzYW1lIGFzIC0oKXJlZ2lzdGVyOiB1bnByZWRpY3RhYmxlIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy12YXguYzoyNzU4Ci1tc2dpZCAiaW52YWxpZCBvcGVyYW5kIG9mICgpKyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjc2NAotbXNnaWQgIihQQykrIHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3NjYKLW1zZ2lkICJbXWluZGV4IHNhbWUgYXMgKCkrcmVnaXN0ZXI6IHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3OTEKLW1zZ2lkICIjIGNvbmZsaWN0cyBsZW5ndGgiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI3OTMKLW1zZ2lkICIjIGJhcnMgcmVnaXN0ZXIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4MTUKLW1zZ2lkICJ3cml0aW5nIG9yIG1vZGlmeWluZyAjIGlzIHVucHJlZGljdGFibGUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4NDUKLW1zZ2lkICJsZW5ndGggbm90IG5lZWRlZCIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjg1MgotbXNnaWQgImNhbid0IFtdaW5kZXggYSByZWdpc3RlciwgYmVjYXVzZSBpdCBoYXMgbm8gYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6Mjg1NAotbXNnaWQgImEgcmVnaXN0ZXIgaGFzIG5vIGFkZHJlc3MiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjI4NjUKLW1zZ2lkICJQQyBwYXJ0IG9mIG9wZXJhbmQgdW5wcmVkaWN0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdmF4LmM6MzE5NAotbXNnaWQgIiIKLSJWQVggb3B0aW9uczpcbiIKLSItZCBMRU5HVEhcdFx0aWdub3JlZFxuIgotIi1KXHRcdFx0aWdub3JlZFxuIgotIi1TXHRcdFx0aWdub3JlZFxuIgotIi10IEZJTEVcdFx0XHRpZ25vcmVkXG4iCi0iLVRcdFx0XHRpZ25vcmVkXG4iCi0iLVZcdFx0XHRpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXZheC5jOjMyMDMKLW1zZ2lkICIiCi0iVk1TIG9wdGlvbnM6XG4iCi0iLStcdFx0XHRoYXNoIGVuY29kZSBuYW1lcyBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzXG4iCi0iLTFcdFx0XHRgY29uc3QnIGhhbmRsaW5nIGNvbXBhdGlibGUgd2l0aCBnY2MgMS54XG4iCi0iLUhcdFx0XHRzaG93IG5ldyBzeW1ib2wgYWZ0ZXIgaGFzaCB0cnVuY2F0aW9uXG4iCi0iLWggTlVNXHRcdFx0ZG9uJ3QgaGFzaCBtaXhlZC1jYXNlIG5hbWVzLCBhbmQgYWRqdXN0IGNhc2U6XG4iCi0iXHRcdFx0MCA9IHVwcGVyLCAyID0gbG93ZXIsIDMgPSBwcmVzZXJ2ZSBjYXNlXG4iCi0iLXZcIlZFUlNJT05cIlx0XHRjb2RlIGJlaW5nIGFzc2VtYmxlZCB3YXMgcHJvZHVjZWQgYnkgY29tcGlsZXIgXCJWRVJTSU9OXCJcbiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtdzY1LmM6MTM2Ci1tc2dpZCAibmVlZCBvbiBvciBvZmYuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy13NjUuYzozMjEgY29uZmlnL3RjLXc2NS5jOjM2NAotbXNnaWQgInN5bnRheCBlcnJvciBhZnRlciA8ZXhwIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoyOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgcnIlZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6Mjk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHJoJWQsIG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjMwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJyZWdpc3RlciBybCVkLCBvdXQgb2YgcmFuZ2UuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzozMTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgcnElZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MzIzCi0jLCBjLWZvcm1hdAotbXNnaWQgInJlZ2lzdGVyIHIlZCwgb3V0IG9mIHJhbmdlLiIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6Mzc0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImV4cGVjdGVkICVjIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzozOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgaXMgd3Jvbmcgc2l6ZSBmb3IgYSB3b3JkICVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzo0MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmVnaXN0ZXIgaXMgd3Jvbmcgc2l6ZSBmb3IgYWRkcmVzcyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6NjgwCi1tc2dpZCAiTWlzc2luZyApIGluIHJhKHJiKSIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6OTQ3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgJXMweCV4IG91dCBvZiByYW5nZS4iCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjEwODYKLW1zZ2lkICJpbW1lZGlhdGUgbXVzdCBiZSAxIG9yIDIiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjEwOTEKLW1zZ2lkICJpbW1lZGlhdGUgMSBvciAyIGV4cGVjdGVkIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxMTE5Ci1tc2dpZCAiY2FuJ3QgdXNlIFIwIGhlcmUiCi1tc2dzdHIgIiIKLQotIzogY29uZmlnL3RjLXo4ay5jOjEyNzgKLW1zZ2lkICJDYW4ndCBmaW5kIG9wY29kZSB0byBtYXRjaCBvcGVyYW5kcyIKLW1zZ3N0ciAiIgotCi0jOiBjb25maWcvdGMtejhrLmM6MTM5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIGFyY2hpdGVjdHVyZSAteiVzIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxNDA2Ci1tc2dpZCAiIgotIlo4SyBvcHRpb25zOlxuIgotIi16ODAwMVx0XHRcdGdlbmVyYXRlIHNlZ21lbnRlZCBjb2RlXG4iCi0iLXo4MDAyXHRcdFx0Z2VuZXJhdGUgdW5zZWdtZW50ZWQgY29kZVxuIgotbXNnc3RyICIiCi0KLSM6IGNvbmZpZy90Yy16OGsuYzoxNTQzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IHN1YnRyYWN0IHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zICVzICVzIgotbXNnc3RyICIiCi0KLSM6IGRlcGVuZC5jOjE5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGAlcycgZm9yIHdyaXRpbmciCi1tc2dzdHIgIiIKLQotIzogZGVwZW5kLmM6MjA3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGNsb3NlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoxNTc2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN0cmluZyB0b28gYmlnICglbHUgYnl0ZXMpIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYwMgotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3RyaW5nIGhhc2ggdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTYzNCBlY29mZi5jOjE4MjcgZWNvZmYuYzoxODUzIGVjb2ZmLmM6MTg4NSBlY29mZi5jOjIwNDEKLSM6IGVjb2ZmLmM6MjE1NQotbXNnaWQgIm5vIGN1cnJlbnQgZmlsZSBwb2ludGVyIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MTcyMQotbXNnaWQgInRvbyBtYW55IHN0X0VuZCdzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjA2NwotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gdGFnIGhhc2ggdGFibGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjIzMwotbXNnaWQgImZha2UgLmZpbGUgYWZ0ZXIgcmVhbCBvbmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyMzIxCi1tc2dpZCAiRmlsZW5hbWUgZ29lcyBvdmVyIG9uZSBwYWdlIGJvdW5kYXJ5LiIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI0NTYKLW1zZ2lkICIuYmVnaW4gZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmZpbGUgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjQ2MwotbXNnaWQgIi5iZWdpbiBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI0OTUKLW1zZ2lkICIuYmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNTAyCi1tc2dpZCAiLmJlbmQgZGlyZWN0aXZlIHdpdGhvdXQgYSBwcmVjZWRpbmcgLmVudCBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNTE1Ci1tc2dpZCAiLmJlbmQgZGlyZWN0aXZlIG5hbWVzIHVua25vd24gc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjU1OQotbXNnaWQgIi5kZWYgcHNldWRvLW9wIHVzZWQgaW5zaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjU2MQotbXNnaWQgIkVtcHR5IHN5bWJvbCBuYW1lIGluIC5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNTk5Ci1tc2dpZCAiLmRpbSBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjYxNAotbXNnaWQgIkJhZGx5IGZvcm1lZCAuZGltIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI2MjcKLW1zZ2lkICJUb28gbWFueSAuZGltIGVudHJpZXMiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjQ4Ci1tc2dpZCAiLnNjbCBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjY3NAotbXNnaWQgIi5zaXplIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNjg5Ci1tc2dpZCAiQmFkbHkgZm9ybWVkIC5zaXplIGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI3MDIKLW1zZ2lkICJUb28gbWFueSAuc2l6ZSBlbnRyaWVzIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjcyNQotbXNnaWQgIi50eXBlIHBzZXVkby1vcCB1c2VkIG91dHNpZGUgb2YgLmRlZi8uZW5kZWY7IGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIy4gRklYTUU6IFdlIGNvdWxkIGhhbmRsZSB0aGlzIGJ5IHNldHRpbmcgdGhlIGNvbnRpbnVlZCBiaXQuCi0jLiBUaGVyZSB3b3VsZCBzdGlsbCBiZSBhIGxpbWl0OiB0aGUgLnR5cGUgYXJndW1lbnQgY2FuIG5vdAotIy4gYmUgaW5maW5pdGUuCi0jOiBlY29mZi5jOjI3NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVGhlIHR5cGUgb2YgJXMgaXMgdG9vIGNvbXBsZXg7IGl0IHdpbGwgYmUgc2ltcGxpZmllZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI3NTQKLW1zZ2lkICJVbnJlY29nbml6ZWQgLnR5cGUgYXJndW1lbnQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyNzkzCi1tc2dpZCAiLnRhZyBwc2V1ZG8tb3AgdXNlZCBvdXRzaWRlIG9mIC5kZWYvLmVuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjgyMAotbXNnaWQgIi52YWwgcHNldWRvLW9wIHVzZWQgb3V0c2lkZSBvZiAuZGVmLy5lbmRlZjsgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI4MjgKLW1zZ2lkICIudmFsIGV4cHJlc3Npb24gaXMgdG9vIGNvcG1sZXgiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzoyODU5Ci1tc2dpZCAiLmVuZGVmIHBzZXVkby1vcCB1c2VkIGJlZm9yZSAuZGVmOyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6Mjg4NQotbXNnaWQgIkJhZCBDT0ZGIGRlYnVnZ2luZyBpbmZvIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MjkzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJObyB0YWcgc3BlY2lmaWVkIGZvciAlcyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjI5NjYKLW1zZ2lkICJCYWQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMDM4Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZmlsZSBkaXJlY3RpdmUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMDQ1Ci1tc2dpZCAiLmVuZCBkaXJlY3RpdmUgd2l0aG91dCBhIHByZWNlZGluZyAuZW50IGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMwNjgKLW1zZ2lkICIuZW5kIGRpcmVjdGl2ZSBuYW1lcyB1bmtub3duIHN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjMwOTcKLW1zZ2lkICJzZWNvbmQgLmVudCBkaXJlY3RpdmUgZm91bmQgYmVmb3JlIC5lbmQgZGlyZWN0aXZlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzE3MgotbXNnaWQgIk5vIHdheSB0byBoYW5kbGUgLmZpbGUgd2l0aGluIC5lbnQvLmVuZCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzE5NwotbXNnaWQgIi5mbWFzayBvdXRzaWRlIG9mIC5lbnQiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozMjY2Ci1tc2dpZCAiLm1hc2sgb3V0c2lkZSBvZiAuZW50IgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzI5NgotbXNnaWQgIi5sb2MgYmVmb3JlIC5maWxlIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzMwMwotbXNnaWQgIi5sb2Mgb3V0c2lkZSBvZiAudGV4dCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM0MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSWdub3JpbmcgYXR0ZW1wdCB0byByZWRlZmluZSBzeW1ib2wgYCVzJy4iCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzozNDM1Ci1tc2dpZCAiYmFkIC53ZWFrZXh0IGRpcmVjdGl2ZSIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM1MDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLnN0YWIlYyBpcyBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzUxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIuc3RhYiVjOiBpZ25vcmluZyBub24temVybyBvdGhlciBmaWVsZCIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjM1NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIkxpbmUgbnVtYmVyICglZCkgZm9yIC5zdGFiJWMgZGlyZWN0aXZlIGNhbm5vdCBmaXQgaW4gaW5kZXggZmllbGQgKDIwIGJpdHMpIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6MzU4NAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbGxlZ2FsIC5zdGFiJWMgZGlyZWN0aXZlLCBiYWQgY2hhcmFjdGVyIgotbXNnc3RyICIiCi0KLSM6IGVjb2ZmLmM6NDA0NiBlY29mZi5jOjQyMzUgZWNvZmYuYzo0MjYwCi1tc2dpZCAiLmJlZ2luLy5iZW5kIGluIGRpZmZlcmVudCBzZWdtZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBlY29mZi5jOjQ3NjEKLW1zZ2lkICJNaXNzaW5nIC5lbmQgb3IgLmJlbmQgYXQgZW5kIG9mIGZpbGUiCi1tc2dzdHIgIiIKLQotIzogZWNvZmYuYzo1MjUyCi1tc2dpZCAiR1AgcHJvbG9ndWUgc2l6ZSBleGNlZWRzIGZpZWxkIHNpemUsIHVzaW5nIDAgaW5zdGVhZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MjUwCi1tc2dpZCAiIgotImJhZCBmbG9hdGluZy1wb2ludCBjb25zdGFudDogZXhwb25lbnQgb3ZlcmZsb3csIHByb2JhYmx5IGFzc2VtYmxpbmcganVuayIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MjU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImJhZCBmbG9hdGluZy1wb2ludCBjb25zdGFudDogdW5rbm93biBlcnJvciBjb2RlPSVkLiIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6NDM0Ci1tc2dpZCAiIgotIkEgYmlnbnVtIHdpdGggdW5kZXJzY29yZXMgbWF5IG5vdCBoYXZlIG1vcmUgdGhhbiA4IGhleCBkaWdpdHMgaW4gYW55IHdvcmQuIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzo0NTQKLW1zZ2lkICJBIGJpZ251bSB3aXRoIHVuZGVyc2NvcmVzIG11c3QgaGF2ZSBleGFjdGx5IDQgd29yZHMuIgotbXNnc3RyICIiCi0KLSMuIGVpdGhlciBub3Qgc2VlbiBvciBub3QgZGVmaW5lZC4KLSMuIEBAIFNob3VsZCBwcmludCBvdXQgdGhlIG9yaWdpbmFsIHN0cmluZyBpbnN0ZWFkIG9mCi0jLiB0aGUgcGFyc2VkIG51bWJlci4KLSM6IGV4cHIuYzo1ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmFja3cuIHJlZiB0byB1bmtub3duIGxhYmVsIFwiJWQ6XCIsIDAgYXNzdW1lZC4iCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjcwNQotbXNnaWQgIkNoYXJhY3RlciBjb25zdGFudCB0b28gbGFyZ2UiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjk0MQotIywgYy1mb3JtYXQKLW1zZ2lkICJleHByLmMob3BlcmFuZCk6IGJhZCBhdG9mX2dlbmVyaWMgcmV0dXJuIHZhbCAlZCIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTAwMQotbXNnaWQgIk1pc3NpbmcgJyknIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjEwMTEgcmVhZC5jOjM4MjQKLW1zZ2lkICJFQkNESUMgY29uc3RhbnRzIGFyZSBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxMDc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVuYXJ5IG9wZXJhdG9yICVjIGlnbm9yZWQgYmVjYXVzZSBiYWQgb3BlcmFuZCBmb2xsb3dzIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxMTIyIGV4cHIuYzoxMTQ3Ci1tc2dpZCAic3ludGF4IGVycm9yIGluIC5zdGFydG9mLiBvciAuc2l6ZW9mLiIKLW1zZ3N0ciAiIgotCi0jOiBleHByLmM6MTI5NgotbXNnaWQgIkJhZCBleHByZXNzaW9uIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNjQ0Ci1tc2dpZCAibWlzc2luZyBvcGVyYW5kOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE2NzcKLW1zZ2lkICJvcGVyYXRpb24gY29tYmluZXMgc3ltYm9scyBpbiBkaWZmZXJlbnQgc2VnbWVudHMiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE2OTMKLW1zZ2lkICJsZWZ0IG9wZXJhbmQgaXMgYSBiaWdudW07IGludGVnZXIgMCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNjk1Ci1tc2dpZCAibGVmdCBvcGVyYW5kIGlzIGEgZmxvYXQ7IGludGVnZXIgMCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNzA0Ci1tc2dpZCAicmlnaHQgb3BlcmFuZCBpcyBhIGJpZ251bTsgaW50ZWdlciAwIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogZXhwci5jOjE3MDYKLW1zZ2lkICJyaWdodCBvcGVyYW5kIGlzIGEgZmxvYXQ7IGludGVnZXIgMCBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IGV4cHIuYzoxNzU0IHN5bWJvbHMuYzoxMDkyCi1tc2dpZCAiZGl2aXNpb24gYnkgemVybyIKLW1zZ3N0ciAiIgotCi0jOiBmcmFncy5jOjg1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGV4dGVuZCBmcmFnICVkLiBjaGFycyIKLW1zZ3N0ciAiIgotCi0jOiBmcmFncy5jOjE3MAotbXNnaWQgImF0dGVtcHQgdG8gYWxsb2NhdGUgZGF0YSBpbiBhYnNvbHV0ZSBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGZyYWdzLmM6MTc2Ci1tc2dpZCAiYXR0ZW1wdCB0byBhbGxvY2F0ZSBkYXRhIGluIGNvbW1vbiBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo0ODQKLW1zZ2lkICJyZWRlZmluaXRpb24gbm90IGFsbG93ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NTU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInRoZSAlYyBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo2MzUKLW1zZ2lkICJzdHJpbmcgd2hlcmUgZXhwcmVzc2lvbiBleHBlY3RlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NjQxCi1tc2dpZCAiY2FuJ3QgZmluZCBwcmltYXJ5IGluIGV4cHJlc3Npb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjY4MQotbXNnaWQgIm1pc3BsYWNlZCBjbG9zaW5nIHBhcmVucy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NzE4Ci1tc2dpZCAiYXR0ZW1wdCB0byBkaXZpZGUgYnkgemVyby5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6NzUwCi1tc2dpZCAiY2FuJ3QgYWRkIHR3byByZWxvY2F0YWJsZSBleHByZXNzaW9uc1xuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzo5NTUKLW1zZ2lkICJ1bnJlYXNvbmFibGUgbmVzdGluZy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTAzMwotbXNnaWQgIkVuZCBvZiBmaWxlIG5vdCBhdCBzdGFydCBvZiBsaW5lLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxMTU0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIklsbGVnYWwgYmFzZSBjaGFyYWN0ZXIgJWMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjEyNjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAicmFkaXggaXMgJWMgbXVzdCBiZSBvbmUgb2YgYiwgcSwgZCBvciBoIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxMzA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgInNpemUgbXVzdCBiZSBvbmUgb2YgYiwgdyBvciBsLCBpcyAlYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQxMwotbXNnaWQgImRhdGFiIHJlcGVhdCBtdXN0IGJlIGNvbnN0YW50LlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDE1Ci1tc2dpZCAiZGF0YWIgZGF0YSBtdXN0IGJlIGFic29sdXRlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDI5Ci1tc2dpZCAiYWxpZ24gbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQzNgotbXNnaWQgIi5hbGlnbiBuZWVkcyBhYnNvbHV0ZSBmaWxsIHZhbHVlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNDQ0Ci1tc2dpZCAiYWxpZ25tZW50IG11c3QgYmUgb25lIG9mIDEsIDIgb3IgNC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTQ2OQotbXNnaWQgInJlcyBuZWVkcyBhYnNvbHV0ZSBleHByZXNzaW9uIGZvciBmaWxsIGNvdW50LlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNTQ5Ci1tc2dpZCAiZm9ybSBMSU49IG5lZWRzIGFic29sdXRlIGV4cHJlc3NzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNTUyCi1tc2dpZCAiQ09MPSIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTU1NQotbXNnaWQgImZvcm0gQ09MPSBuZWVkcyBhYnNvbHV0ZSBleHByZXNzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jLiBUdXJucyB0aGUgbmV4dCBleHByZXNzaW9uIGludG8gYSBzdHJpbmcKLSM6IGdhc3AuYzoxNTk3IG1hY3JvLmM6NDAwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiUgb3BlcmF0b3IgbmVlZHMgYWJzb2x1dGUgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTY1OQotbXNnaWQgIm1pc3BsYWNlZCAoIC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTY3NAotbXNnaWQgIm1pc3BsYWNlZCApLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoxNzI4Ci1tc2dpZCAiLmluc3RyIG5lZWRzIGFic29sdXRlIGV4cHJlc3Nvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MTc2NgotbXNnaWQgIm5lZWQgYWJzb2x1dGUgcG9zaXRpb24uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjE3NjgKLW1zZ2lkICJuZWVkIGFic29sdXRlIGxlbmd0aC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjAxNwotbXNnaWQgIkVORCBtaXNzaW5nIGZyb20gZW5kIG9mIGZpbGUuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIwNDcKLW1zZ2lkICIuQVNTSUdOQSBuZWVkcyBjb25zdGFudCBleHByZXNzaW9uIGFyZ3VtZW50LlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMDUxCi1tc2dpZCAiLkFTU0lHTkEgd2l0aG91dCBsYWJlbC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjA3NgotbXNnaWQgIi5BU1NJR05TIHdpdGhvdXQgbGFiZWwuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIxNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3QgZmluZCBwcmVwcm9jZXNzb3IgdmFyaWFibGUgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIyMDgKLW1zZ2lkICJDb21wYXJpc29uIG9wZXJhdG9yIG11c3QgYmUgb25lIG9mIEVRLCBORSwgTFQsIExFLCBHVCBvciBHRS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjI0MgotbXNnaWQgIkNvbXBhcmlzb24gb3BlcmF0b3IgZm9yIHN0cmluZ3MgbXVzdCBiZSBFUSBvciBORVxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMjU0IGdhc3AuYzoyMjY0IGdhc3AuYzoyMzY2Ci1tc2dpZCAiQ29uZGl0aW9uYWwgb3BlcmF0b3IgbXVzdCBoYXZlIGFic29sdXRlIG9wZXJhbmRzLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyMjU5Ci1tc2dpZCAiU3RyaW5nIGNvbXBhcmVkIGFnYWluc3QgZXhwcmVzc2lvbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjMwOQotbXNnaWQgIkFJRiBuZXN0aW5nIHVucmVhc29uYWJsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjMyNAotbXNnaWQgIk11bHRpcGxlIEFFTFNFcyBpbiBBSUYuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjIzNDAKLW1zZ2lkICJBRU5ESSB3aXRob3V0IEFJRi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjM2MyBnYXNwLmM6MjQ0NQotbXNnaWQgIklGIG5lc3RpbmcgdW5yZWFzb25hYmxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNDU1Ci1tc2dpZCAiQmFkIGZvcm1hdCBmb3IgSUYgb3IgSUZOQy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjQ3NQotbXNnaWQgIkFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNDc3Ci1tc2dpZCAiRU5EUiB3aXRob3V0IGEgUkVQVC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjUwMAotIywgYy1mb3JtYXQKLW1zZ2lkICJBV0hJTEUgd2l0aG91dCBhIEFFTkRXIGF0ICVkLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNTM4Ci1tc2dpZCAiQUVORFcgd2l0aG91dCBhIEFFTkRXLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNTgzCi1tc2dpZCAiQVJFUEVBVCBtdXN0IGhhdmUgYWJzb2x1dGUgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjU4OQotIywgYy1mb3JtYXQKLW1zZ2lkICJBUkVQRUFUIHdpdGhvdXQgYSBBRU5EUiBhdCAlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjYzMQotbXNnaWQgIi5FTkRNIHdpdGhvdXQgYSBtYXRjaGluZyAuTUFDUk8uXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI2NjUKLW1zZ2lkICJMT0NBTCBvdXRzaWRlIG9mIE1BQ1JPIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNjc4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIm1hY3JvIGF0IGxpbmUgJWQ6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI3MDEKLW1zZ2lkICJtYWNybyBleHBhbnNpb24iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI3NTMKLW1zZ2lkICJDaGFyYWN0ZXIgY29kZSBpbiBzdHJpbmcgbXVzdCBiZSBhYnNvbHV0ZSBleHByZXNzaW9uLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyNzU4Ci1tc2dpZCAiTWlzc2luZyA+IGZvciBjaGFyYWN0ZXIgY29kZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MjgxNwotIywgYy1mb3JtYXQKLW1zZ2lkICJzdHJpbmcgZm9yIFNEQVRBQyBsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyAoJWQpLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyODQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgImlsbGVnYWwgY2hhcmFjdGVyIGluIFNEQVRBIGxpbmUgKDB4JXgpLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzoyODY2Ci1tc2dpZCAiTXVzdCBoYXZlIGFic29sdXRlIFNEQVRBQiByZXBlYXQgY291bnQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjI4NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTXVzdCBoYXZlIHBvc2l0aXZlIFNEQVRBQiByZXBlYXQgY291bnQgKCVkKS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjg5NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlYXNvbmFibGUgaW5jbHVkZSBkZXB0aCAoJWxkKS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6Mjk1MQotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGluY2x1ZGUgZmlsZSBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozMDI1Ci1tc2dpZCAiVW5yZWFzb25hYmxlIGV4cGFuc2lvbiAoLXUgdHVybnMgb2ZmIGNoZWNrKS5cbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIG9uZSBjYXVzZXMgbG90cyBvZiBwYWluIHdoZW4gdHJ5aW5nIHRvIHByZXByb2Nlc3MKLSMuIG9yZGluYXJ5IGNvZGUKLSM6IGdhc3AuYzozMjQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXNlZCBwc2V1ZG8gb3AgYCVzJy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzMxMwotbXNnaWQgIk9SRyBjb21tYW5kIG5vdCBhbGxvd2VkLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNTMwCi1tc2dpZCAiSW52YWxpZCBleHByZXNzaW9uIG9uIGNvbW1hbmQgbGluZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzU3MQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iVXNhZ2U6ICVzIFxuIgotIiAgWy1hXSAgICAgIFstLWFsdGVybmF0ZV0gICAgICAgICBlbnRlciBhbHRlcm5hdGUgbWFjcm8gbW9kZVxuIgotIiAgWy1jIGNoYXJdIFstLWNvbW1lbnRjaGFyIGNoYXJdICBjaGFuZ2UgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIGZyb20gIVxuIgotIiAgWy1kXSAgICAgIFstLWRlYnVnXSAgICAgICAgICAgICBwcmludCBzb21lIGRlYnVnZ2luZyBpbmZvXG4iCi0iICBbLWhdICAgICAgWy0taGVscF0gICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZVxuIgotIiAgWy1NXSAgICAgIFstLW1yaV0gICAgICAgICAgICAgICBlbnRlciBNUkkgY29tcGF0aWJpbGl0eSBtb2RlXG4iCi0iICBbLW8gb3V0XSAgWy0tb3V0cHV0IG91dF0gICAgICAgIHNldCB0aGUgb3V0cHV0IGZpbGVcbiIKLSIgIFstcF0gICAgICBbLS1wcmludF0gICAgICAgICAgICAgcHJpbnQgbGluZSBudW1iZXJzXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM1ODAKLW1zZ2lkICIiCi0iICBbLXNdICAgICAgWy0tY29weXNvdXJjZV0gICAgICAgIGNvcHkgc291cmNlIHRocm91Z2ggYXMgY29tbWVudHMgXG4iCi0iICBbLXVdICAgICAgWy0tdW5yZWFzb25hYmxlXSAgICAgIGFsbG93IHVucmVhc29uYWJsZSBuZXN0aW5nXG4iCi0iICBbLXZdICAgICAgWy0tdmVyc2lvbl0gICAgICAgICAgIHByaW50IHRoZSBwcm9ncmFtIHZlcnNpb25cbiIKLSIgIFstRG5hbWU9dmFsdWVdICAgICAgICAgICAgICAgICAgY3JlYXRlIHByZXByb2Nlc3NvciB2YXJpYWJsZSBjYWxsZWQgbmFtZSwgIgotIndpdGggdmFsdWVcbiIKLSIgIFstSXBhdGhdICAgICAgICAgICAgICAgICAgICAgICAgYWRkIHRvIGluY2x1ZGUgcGF0aCBsaXN0XG4iCi0iICBbaW4tZmlsZV1cbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzU5NgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogR251IEFzc2VtYmxlciBNYWNybyBQcmVwcm9jZXNzb3JcbiIKLW1zZ3N0ciAiIgotCi0jLiBUaGlzIG91dHB1dCBpcyBpbnRlbmRlZCB0byBmb2xsb3cgdGhlIEdOVSBzdGFuZGFyZHMgZG9jdW1lbnQuCi0jOiBnYXNwLmM6MzY4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJHTlUgYXNzZW1ibGVyIHByZS1wcm9jZXNzb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnYXNwLmM6MzY4MQotbXNnaWQgIkNvcHlyaWdodCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNzAzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBDYW4ndCBvcGVuIG91dHB1dCBmaWxlIGAlcycuXG4iCi1tc2dzdHIgIiIKLQotIzogZ2FzcC5jOjM3MjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gaW5wdXQgZmlsZSBgJXMnLlxuIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNzQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkIgotbXNnc3RyICIiCi0KLSM6IGdhc3AuYzozNzQ4Ci1tc2dpZCAiIgotIlxuIgotIlBsZWFzZSByZXBvcnQgdGhpcyBidWcuXG4iCi1tc2dzdHIgIiIKLQotIy4gRGV0ZWN0IGlmIHdlIGFyZSByZWFkaW5nIGZyb20gc3RkaW4gYnkgZXhhbWluaW5nIHRoZSBmaWxlCi0jLiBuYW1lIHJldHVybmVkIGJ5IGFzX3doZXJlKCkuCi0jLgotIy4gW0ZJWE1FOiBXZSByZWx5IHVwb24gdGhlIG5hbWUgaW4gdGhlIHN0cmNtcCBiZWxvdyBiZWluZyB0aGUKLSMuIHNhbWUgYXMgdGhlIG9uZSB1c2VkIGJ5IGlucHV0X3NjcnViX25ld19maWxlKCksIGlmIHRoYXQgaXMKLSMuIG5vdCB0cnVlLCB0aGVuIHRoaXMgY29kZSB3aWxsIGZhaWxdLgotIy4KLSMuIElmIHdlIGFyZSByZWFkaW5nIGZyb20gc3RkaW4sIHRoZW4gd2UgbmVlZCB0byBzYXZlIGVhY2ggaW5wdXQgbGluZQotIy4gaGVyZSAoYXNzdW1pbmcgb2YgY291cnNlIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBhIGxpbmUgb2YgaW5wdXQgdG8gcmVhZCksCi0jLiBzbyB0aGF0IGl0IGNhbiBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3RpbmcgdGhhdCBpcyBwcm9kdWNlZCBhdCB0aGUgZW5kCi0jLiBvZiB0aGUgYXNzZW1ibHkuCi0jOiBpbnB1dC1maWxlLmM6MTUwIGlucHV0LXNjcnViLmM6MjMzIGxpc3RpbmcuYzozNTMKLW1zZ2lkICJ7c3RhbmRhcmQgaW5wdXR9IgotbXNnc3RyICIiCi0KLSM6IGlucHV0LWZpbGUuYzoxNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQ2FuJ3Qgb3BlbiAlcyBmb3IgcmVhZGluZy4iCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtZmlsZS5jOjIwNSBpbnB1dC1maWxlLmM6MjM0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IHJlYWQgZnJvbSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBpbnB1dC1maWxlLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIkNhbid0IGNsb3NlICVzIgotbXNnc3RyICIiCi0KLSM6IGlucHV0LXNjcnViLmM6MjYzCi1tc2dpZCAibWFjcm9zIG5lc3RlZCB0b28gZGVlcGx5IgotbXNnc3RyICIiCi0KLSM6IGlucHV0LXNjcnViLmM6MzQ5Ci1tc2dpZCAicGFydGlhbCBsaW5lIGF0IGVuZCBvZiBmaWxlIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogaW5wdXQtc2NydWIuYzozNzEKLW1zZ2lkICJQYXJ0aWFsIGxpbmUgYXQgZW5kIG9mIGZpbGUgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiBpdGJsLW9wcy5jOjM1OQotbXNnaWQgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBpbnN0cnVjdGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MjUyCi1tc2dpZCAiV2FybmluZzoiCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjI1OQotbXNnaWQgIkVycm9yOiIKLW1zZ3N0ciAiIgotCi0jOiBsaXN0aW5nLmM6MTE0MAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBvcGVuIGxpc3QgZmlsZTogJXMiCi1tc2dzdHIgIiIKLQotIzogbGlzdGluZy5jOjExNjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZXJyb3IgY2xvc2luZyBsaXN0IGZpbGU6ICVzIgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoxMjQ1Ci1tc2dpZCAic3RyYW5nZSBwYXBlciBoZWlnaHQsIHNldCB0byBubyBmb3JtIgotbXNnc3RyICIiCi0KLSM6IGxpc3RpbmcuYzoxMzExCi1tc2dpZCAiTmV3IGxpbmUgaW4gdGl0bGUiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzo1NjMKLW1zZ2lkICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIG1hY3JvIGRlZmluaXRpb24iCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzo1NzIKLW1zZ2lkICJtaXNzaW5nICkgYWZ0ZXIgZm9ybWFscyIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjcyOQotbXNnaWQgIm1pc3NwbGFjZWQgKSIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjk5MQotbXNnaWQgImNvbmZ1c2lvbiBpbiBmb3JtYWwgcGFyYW1ldGVycyIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjk5NgotbXNnaWQgIm1hY3JvIGZvcm1hbCBhcmd1bWVudCBkb2VzIG5vdCBleGlzdCIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjEwMTEKLW1zZ2lkICJjYW4ndCBtaXggcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzoxMDE5Ci1tc2dpZCAidG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMiCi1tc2dzdHIgIiIKLQotIzogbWFjcm8uYzoxMTk0Ci1tc2dpZCAidW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBpcnAgb3IgaXJwYyIKLW1zZ3N0ciAiIgotCi0jOiBtYWNyby5jOjEyMDIKLW1zZ2lkICJtaXNzaW5nIG1vZGVsIHBhcmFtZXRlciIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjEwNQotbXNnaWQgIkFzc2VtYmxlciBtZXNzYWdlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjIyMgotbXNnaWQgIldhcm5pbmc6ICIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjMzMQotbXNnaWQgIkVycm9yOiAiCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0MzUgbWVzc2FnZXMuYzo0NTIKLW1zZ2lkICJGYXRhbCBlcnJvcjogIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDcxCi1tc2dpZCAiSW50ZXJuYWwgZXJyb3IhXG4iCi1tc2dzdHIgIiIKLQotIzogbWVzc2FnZXMuYzo0NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQXNzZXJ0aW9uIGZhaWx1cmUgaW4gJXMgYXQgJXMgbGluZSAlZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJBc3NlcnRpb24gZmFpbHVyZSBhdCAlcyBsaW5lICVkLlxuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDc3IG1lc3NhZ2VzLmM6NDk1Ci1tc2dpZCAiUGxlYXNlIHJlcG9ydCB0aGlzIGJ1Zy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBtZXNzYWdlcy5jOjQ5MAotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvciwgYWJvcnRpbmcgYXQgJXMgbGluZSAlZCBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG1lc3NhZ2VzLmM6NDkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkludGVybmFsIGVycm9yLCBhYm9ydGluZyBhdCAlcyBsaW5lICVkXG4iCi1tc2dzdHIgIiIKLQotIzogb3V0cHV0LWZpbGUuYzo0OAotIywgYy1mb3JtYXQKLW1zZ2lkICJDYW4ndCBvcGVuIGEgYmZkIG9uIHN0ZG91dCAlcyAiCi1tc2dzdHIgIiIKLQotIzogb3V0cHV0LWZpbGUuYzo3MiBvdXRwdXQtZmlsZS5jOjc5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkZBVEFMOiBDYW4ndCBjbG9zZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IG91dHB1dC1maWxlLmM6MTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZBVEFMOiBDYW4ndCBjbG9zZSAlcyIKLW1zZ3N0ciAiIgotCi0jOiBvdXRwdXQtZmlsZS5jOjE0OAotbXNnaWQgIkZhaWxlZCB0byBlbWl0IGFuIG9iamVjdCBieXRlIgotbXNnc3RyICIiCi0KLSM6IG91dHB1dC1maWxlLmM6MTQ5Ci1tc2dpZCAiQ2FuJ3QgY29udGludWUiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQzNAotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciBjb25zdHJ1Y3RpbmcgJXMgcHNldWRvLW9wIHRhYmxlOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6ODAyCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gcHNldWRvLW9wOiAgYCVzJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6OTI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxhYmVsIFwiJWQkXCIgcmVkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxMTQ1Ci1tc2dpZCAiLmFib3J0IGRldGVjdGVkLiAgQWJhbmRvbmluZyBzaGlwLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTI1MCByZWFkLmM6MjAzMQotbXNnaWQgIkFsaWdubWVudCBub3QgYSBwb3dlciBvZiAyIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxMjU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkFsaWdubWVudCB0b28gbGFyZ2U6ICV1IGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjEyOTAKLW1zZ2lkICJleHBlY3RlZCBmaWxsIHBhdHRlcm4gbWlzc2luZyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTQ4NwotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIHJlLWRlZmluZSBzeW1ib2wgYCVzJyIKLW1zZ3N0ciAiIgotCi0jLiBTb21lIG9mIHRoZSBiYWNrIGVuZHMgY2FuJ3QgZGVhbCB3aXRoIG5vbi1wb3NpdGl2ZSBsaW5lIG51bWJlcnMuCi0jLiBCZXNpZGVzLCBpdCdzIHNpbGx5LgotIzogcmVhZC5jOjE2MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiTGluZSBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmU7IGxpbmUgbnVtYmVyICVkIHJlamVjdGVkLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTYzOAotbXNnaWQgInN0YXJ0IGFkZHJlc3Mgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTY0OAotbXNnaWQgIi5lcnIgZW5jb3VudGVyZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE2NjcgcmVhZC5jOjE2NjkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiLmZhaWwgJWxkIGVuY291bnRlcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoxNzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5maWxsIHNpemUgY2xhbXBlZCB0byAlZC4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE3MTEKLW1zZ2lkICJTaXplIG5lZ2F0aXZlOiAuZmlsbCBpZ25vcmVkLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTcxNwotbXNnaWQgIlJlcGVhdCA8IDAsIC5maWxsIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE4NzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5yZWNvZ25pemVkIC5saW5rb25jZSB0eXBlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE4ODYgcmVhZC5jOjE5MTIKLW1zZ2lkICIubGlua29uY2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjE5MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYmZkX3NldF9zZWN0aW9uX2ZsYWdzOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MTk3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIi5zYnNzXCI6ICVzIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMDA5Ci1tc2dpZCAiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjAxNwotbXNnaWQgIk1pc3NpbmcgYWxpZ25tZW50IgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMTU0Ci1tc2dpZCAiYmFkIGV4cHJlc3Npb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIyODkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byByZWRlZmluZSBwc2V1ZG8tb3AgYCVzJyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyMzUzCi0jLCBjLWZvcm1hdAotbXNnaWQgImludmFsaWQgc2VnbWVudCBcIiVzXCI7IHNlZ21lbnQgXCIlc1wiIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIzNTkKLW1zZ2lkICJpZ25vcmluZyBmaWxsIHZhbHVlIGluIGFic29sdXRlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIzNjIKLW1zZ2lkICJvbmx5IGNvbnN0YW50IG9mZnNldHMgc3VwcG9ydGVkIGluIGFic29sdXRlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjIzOTQKLW1zZ2lkICJNUkkgc3R5bGUgT1JHIHBzZXVkby1vcCBub3Qgc3VwcG9ydGVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyNDgyCi1tc2dpZCAidW5yZWNvZ25pemVkIHNlY3Rpb24gdHlwZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjU1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgc2VjdGlvbiB0eXBlIGAlcyciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI1NjQKLW1zZ2lkICJhYnNvbHV0ZSBzZWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MjU3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJ1bnJlY29nbml6ZWQgc2VjdGlvbiBjb21tYW5kIGAlcyciCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI2NTQKLW1zZ2lkICJyZXB0IHdpdGhvdXQgZW5kciIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mjg0MQotbXNnaWQgIlVuc3VwcG9ydGVkIHZhcmlhYmxlIHNpemUgb3IgZmlsbCB2YWx1ZSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mjg2NgotbXNnaWQgIi5zcGFjZSByZXBlYXQgY291bnQgaXMgemVybywgaWdub3JlZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mjg2OAotbXNnaWQgIi5zcGFjZSByZXBlYXQgY291bnQgaXMgbmVnYXRpdmUsIGlnbm9yZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI4OTcKLW1zZ2lkICJzcGFjZSBhbGxvY2F0aW9uIHRvbyBjb21wbGV4IGluIGFic29sdXRlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjI5MDIKLW1zZ2lkICJzcGFjZSBhbGxvY2F0aW9uIHRvbyBjb21wbGV4IGluIGNvbW1vbiBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzoyOTg5IHJlYWQuYzo0MDcwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkJhZCBmbG9hdGluZyBsaXRlcmFsOiAlcyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzA2NQotIywgYy1mb3JtYXQKLW1zZ2lkICJSZXN0IG9mIGxpbmUgaWdub3JlZC4gRmlyc3QgaWdub3JlZCBjaGFyYWN0ZXIgaXMgYCVjJy4iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMwNjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIHZhbHVlZCAweCV4LiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzExOQotbXNnaWQgImlsbGVnYWwgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozMTIxCi1tc2dpZCAibWlzc2luZyBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjMyODgKLW1zZ2lkICJydmEgd2l0aG91dCBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM0MTMKLW1zZ2lkICJhdHRlbXB0IHRvIHN0b3JlIHZhbHVlIGluIGFic29sdXRlIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM0NTEgcmVhZC5jOjQzNDcKLW1zZ2lkICJ6ZXJvIGFzc3VtZWQgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzQ2MyByZWFkLmM6NDM1OQotbXNnaWQgInJlZ2lzdGVyIHZhbHVlIHVzZWQgYXMgZXhwcmVzc2lvbiIKLW1zZ3N0ciAiIgotCi0jLiBMZWFkaW5nIGJpdHMgY29udGFpbiBib3RoIDBzICYgMXMuCi0jOiByZWFkLmM6MzU1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJWYWx1ZSAweCVseCB0cnVuY2F0ZWQgdG8gMHglbHguIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkJpZ251bSB0cnVuY2F0ZWQgdG8gJWQgYnl0ZXMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM2NDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5zdXBwb3J0ZWQgQkZEIHJlbG9jYXRpb24gc2l6ZSAldSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6MzczNQotbXNnaWQgInVzaW5nIGEgYml0IGZpZWxkIHdpZHRoIG9mIHplcm8iCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM3NDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmllbGQgd2lkdGggXCIlc1wiIHRvbyBjb21wbGV4IGZvciBhIGJpdGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozNzUxCi0jLCBjLWZvcm1hdAotbXNnaWQgImZpZWxkIHdpZHRoICVsdSB0b28gYmlnIHRvIGZpdCBpbiAlZCBieXRlczogdHJ1bmNhdGVkIHRvICVkIGJpdHMiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjM3NzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiZmllbGQgdmFsdWUgXCIlc1wiIHRvbyBjb21wbGV4IGZvciBhIGJpdGZpZWxkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozODk0Ci1tc2dpZCAiVW5yZXNvbHZhYmxlIG9yIG5vbnBvc2l0aXZlIHJlcGVhdCBjb3VudDsgdXNpbmcgMSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6Mzk0NQotIywgYy1mb3JtYXQKLW1zZ2lkICJVbmtub3duIGZsb2F0aW5nIHR5cGUgdHlwZSAnJWMnIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzozOTY3Ci1tc2dpZCAiRmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgdG9vIGxhcmdlIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0MDkyCi1tc2dpZCAidW5yZXNvbHZhYmxlIG9yIG5vbnBvc2l0aXZlIHJlcGVhdCBjb3VudDsgdXNpbmcgMSIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDQ5NgotbXNnaWQgIkV4cGVjdGVkIDxubj4iCi1tc2dzdHIgIiIKLQotIy4gVG8gYmUgY29tcGF0aWJsZSB3aXRoIEJTRCA0LjIgYXM6IGdpdmUgdGhlIGx1c2VyIGEgbGluZWZlZWQhIQotIzogcmVhZC5jOjQ1MjkgcmVhZC5jOjQ2MTIKLW1zZ2lkICJVbnRlcm1pbmF0ZWQgc3RyaW5nOiBOZXdsaW5lIGluc2VydGVkLiIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDYyMAotbXNnaWQgIkJhZCBlc2NhcGVkIGNoYXJhY3RlciBpbiBzdHJpbmcsICc/JyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0NjQ2Ci1tc2dpZCAiZXhwZWN0ZWQgYWRkcmVzcyBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiCi1tc2dzdHIgIiIKLQotIzogcmVhZC5jOjQ2NjYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAic3ltYm9sIFwiJXNcIiB1bmRlZmluZWQ7IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDY2OQotbXNnaWQgInNvbWUgc3ltYm9sIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0Njg3Ci1tc2dpZCAiYmFkIG9yIGlycmVkdWNpYmxlIGFic29sdXRlIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDcyNQotbXNnaWQgIlRoaXMgc3RyaW5nIG1heSBub3QgY29udGFpbiAnXFwwJyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NDc2NAotbXNnaWQgIk1pc3Npbmcgc3RyaW5nIgotbXNnc3RyICIiCi0KLSM6IHJlYWQuYzo0OTk1Ci1tc2dpZCAibWlzc2luZyAuZnVuYyIKLW1zZ3N0ciAiIgotCi0jOiByZWFkLmM6NTAxMgotbXNnaWQgIi5lbmRmdW5jIG1pc3NpbmcgZm9yIHByZXZpb3VzIC5mdW5jIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjA5Ci1tc2dpZCAiLnN0YWJzOiBNaXNzaW5nIGNvbW1hIgotbXNnc3RyICIiCi0KLSM6IHN0YWJzLmM6MjE3IHN0YWJzLmM6MjI1IHN0YWJzLmM6MjM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiCi1tc2dzdHIgIiIKLQotIzogc3RhYnMuYzo0MTUKLW1zZ2lkICJjb21tYSBtaXNzaW5nIGluIC54c3RhYnMiCi1tc2dzdHIgIiIKLQotIzogc3Vic2Vncy5jOjM3OQotIywgYy1mb3JtYXQKLW1zZ2lkICJBdHRlbXB0IHRvIHN3aXRjaCB0byBub25leGlzdGVudCBzZWdtZW50IFwiJXNcIiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MzY0IHN5bWJvbHMuYzo0NTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZC4iCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjQzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgXCIlc1wiIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBcIiVzXCIvJWQuJWQuJWxkLiIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6NDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lbGQuIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzo1Mjggc3ltYm9scy5jOjUzNQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3ltYm9sIHRhYmxlIGZhaWxlZDogJXMiCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjg4MAotIywgYy1mb3JtYXQKLW1zZ2lkICJTeW1ib2wgZGVmaW5pdGlvbiBsb29wIGVuY291bnRlcmVkIGF0ICVzIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxMDU0IHN5bWJvbHMuYzoxMDU4Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxMDYyCi1tc2dpZCAiaW52YWxpZCBzZWN0aW9uIGZvciBvcGVyYXRpb24iCi1tc2dzdHIgIiIKLQotIzogc3ltYm9scy5jOjEwNjcgc3ltYm9scy5jOjEwNzEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24gc2V0dGluZyAlcyIKLW1zZ3N0ciAiIgotCi0jOiBzeW1ib2xzLmM6MTA3NgotIywgYy1mb3JtYXQKLW1zZ2lkICJpbnZhbGlkIHNlY3Rpb24gZm9yIG9wZXJhdGlvbiBzZXR0aW5nICVzIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxMDk0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImRpdmlzaW9uIGJ5IHplcm8gd2hlbiBzZXR0aW5nICVzIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxMTY2IHdyaXRlLmM6MTg3NwotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCByZXNvbHZlIHZhbHVlIGZvciBzeW1ib2wgXCIlc1wiIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxNTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIlwiJWRcIiAoaW5zdGFuY2UgbnVtYmVyICVkIG9mIGEgJXMgbGFiZWwpIgotbXNnc3RyICIiCi0KLSM6IHN5bWJvbHMuYzoxNTg0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkF0dGVtcHQgdG8gZ2V0IHZhbHVlIG9mIHVucmVzb2x2ZWQgc3ltYm9sICVzIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTY5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImZpZWxkIGZ4X3NpemUgdG9vIHNtYWxsIHRvIGhvbGQgJWQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzozMDYKLW1zZ2lkICJydmEgbm90IHN1cHBvcnRlZCIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjUwMQotIywgYy1mb3JtYXQKLW1zZ2lkICJhdHRlbXB0IHRvIC5vcmcvLnNwYWNlIGJhY2t3YXJkcz8gKCVsZCkiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzo5NzUKLW1zZ2lkICJyZWxvY2F0aW9uIG91dCBvZiByYW5nZSIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjk3OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczoldTogYmFkIHJldHVybiBmcm9tIGJmZF9pbnN0YWxsX3JlbG9jYXRpb246ICV4IgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTAyMwotbXNnaWQgImludGVybmFsIGVycm9yOiBmaXh1cCBub3QgY29udGFpbmVkIHdpdGhpbiBmcmFnIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MTAzOQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczoldTogYmFkIHJldHVybiBmcm9tIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24iCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxMTIyIHdyaXRlLmM6MTE0NgotIywgYy1mb3JtYXQKLW1zZ2lkICJGQVRBTDogQ2FuJ3Qgd3JpdGUgJXMiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxMTc3Ci1tc2dpZCAiQ2Fubm90IHdyaXRlIHRvIG91dHB1dCBmaWxlLiIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjE0MDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJWQgZXJyb3IlcywgJWQgd2FybmluZyVzLCBnZW5lcmF0aW5nIGJhZCBvYmplY3QgZmlsZS5cbiIKLW1zZ3N0ciAiIgotCi0jOiB3cml0ZS5jOjE0MTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJWQgZXJyb3IlcywgJWQgd2FybmluZyVzLCBubyBvYmplY3QgZmlsZSBnZW5lcmF0ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoxODE0Ci0jLCBjLWZvcm1hdAotbXNnaWQgImxvY2FsIGxhYmVsICVzIGlzIG5vdCBkZWZpbmVkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MjExOQotIywgYy1mb3JtYXQKLW1zZ2lkICJhbGlnbm1lbnQgcGFkZGluZyAoJWx1IGJ5dGVzKSBub3QgYSBtdWx0aXBsZSBvZiAlbGQiCi1tc2dzdHIgIiIKLQotIzogd3JpdGUuYzoyMjI1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIi53b3JkICVzLSVzKyVzIGRpZG4ndCBmaXQiCi1tc2dzdHIgIiIKLQotIy4gR3Jvd3RoIG1heSBiZSBuZWdhdGl2ZSwgYnV0IHZhcmlhYmxlIHBhcnQgb2YgZnJhZwotIy4gY2Fubm90IGhhdmUgZmV3ZXIgdGhhbiAwIGNoYXJzLiAgVGhhdCBpcywgd2UgY2FuJ3QKLSMuIC5vcmcgYmFja3dhcmRzLgotIzogd3JpdGUuYzoyMzA0Ci1tc2dpZCAiYXR0ZW1wdCB0byAub3JnIGJhY2t3YXJkcyBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MjMyMAotbXNnaWQgIi5zcGFjZSBzcGVjaWZpZXMgbm9uLWFic29sdXRlIHZhbHVlIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MjMyNAotbXNnaWQgIi5zcGFjZSBvciAuZmlsbCB3aXRoIG5lZ2F0aXZlIHZhbHVlLCBpZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6MjU3NQotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iU3VidHJhY3Rpb24gb2YgdHdvIHN5bWJvbHMgaW4gZGlmZmVyZW50IHNlY3Rpb25zIFwiJXNcIiB7JXMgc2VjdGlvbn0gLSAiCi0iXCIlc1wiIHslcyBzZWN0aW9ufSBhdCBmaWxlIGFkZHJlc3MgJXMuIgotbXNnc3RyICIiCi0KLSM6IHdyaXRlLmM6Mjc1MAotIywgYy1mb3JtYXQKLW1zZ2lkICJWYWx1ZSBvZiAlcyB0b28gbGFyZ2UgZm9yIGZpZWxkIG9mICVkIGJ5dGVzIGF0ICVzIgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9nYXMvcmVhZC5jIGIvZ2FzL3JlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0NzFmZi4uMDAwMDAwMAotLS0gYS9nYXMvcmVhZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA3NCArMCwwIEBACi0vKiByZWFkLmMgLSByZWFkIGEgc291cmNlIGZpbGUgLQotICAgQ29weXJpZ2h0IChDKSAxOTg2LCA4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2lmIDAKLSNkZWZpbmUgTUFTS19DSEFSICgweEZGKQkvKiBJZiB5b3VyIGNoYXJzIGFyZW4ndCA4IGJpdHMsIHlvdSB3aWxsCi0JCQkJICAgY2hhbmdlIHRoaXMgYSBiaXQuICBCdXQgdGhlbiwgR05VIGlzbid0Ci0JCQkJICAgc3BvemVkIHRvIHJ1biBvbiB5b3VyIG1hY2hpbmUgYW55d2F5LgotCQkJCSAgIChSTVMgaXMgc28gc2hvcnRzaWdodGVkIHNvbWV0aW1lcy4pCi0JCQkJICAgKi8KLSNlbHNlCi0jZGVmaW5lIE1BU0tfQ0hBUiAoKGludCkodW5zaWduZWQgY2hhciktMSkKLSNlbmRpZgotCi0KLS8qIFRoaXMgaXMgdGhlIGxhcmdlc3Qga25vd24gZmxvYXRpbmcgcG9pbnQgZm9ybWF0IChmb3Igbm93KS4gSXQgd2lsbAotICAgZ3JvdyB3aGVuIHdlIGRvIDQzNjEgc3R5bGUgZmxvbnVtcy4gKi8KLQotI2RlZmluZSBNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVQgKDE2KQotCi0vKiBSb3V0aW5lcyB0aGF0IHJlYWQgYXNzZW1ibGVyIHNvdXJjZSB0ZXh0IHRvIGJ1aWxkIHNwYWdldHRpIGluIG1lbW9yeS4KLSAgIEFub3RoZXIgZ3JvdXAgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGluIHRoZSBleHByLmMgbW9kdWxlLiAgKi8KLQotLyogZm9yIGlzZGlnaXQoKSAqLwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJhcy5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJzYi5oIgotI2luY2x1ZGUgIm1hY3JvLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgImxpc3RpbmcuaCIKLSNpbmNsdWRlICJlY29mZi5oIgotCi0jaWZuZGVmIFRDX1NUQVJUX0xBQkVMCi0jZGVmaW5lIFRDX1NUQVJUX0xBQkVMKHgseSkgKHg9PSc6JykKLSNlbmRpZgotCi0vKiBUaGUgTk9QX09QQ09ERSBpcyBmb3IgdGhlIGFsaWdubWVudCBmaWxsIHZhbHVlLgotICogZmlsbCBpdCBhIG5vcCBpbnN0cnVjdGlvbiBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgZG9lcyBub3QgY2hva2UKLSAqIG9uIGl0Ci0gKi8KLSNpZm5kZWYgTk9QX09QQ09ERQotI2RlZmluZSBOT1BfT1BDT0RFIDB4MDAKLSNlbmRpZgotCi1jaGFyICppbnB1dF9saW5lX3BvaW50ZXI7CS8qLT5uZXh0IGNoYXIgb2Ygc291cmNlIGZpbGUgdG8gcGFyc2UuICovCi0KLSNpZiBCSVRTX1BFUl9DSEFSICE9IDgKLS8qICBUaGUgZm9sbG93aW5nIHRhYmxlIGlzIGluZGV4ZWQgYnlbKGNoYXIpXSBhbmQgd2lsbCBicmVhayBpZgotICAgIGEgY2hhciBkb2VzIG5vdCBoYXZlIGV4YWN0bHkgMjU2IHN0YXRlcyAoaG9wZWZ1bGx5IDA6MjU1ISkhICAqLwotZGllIGhvcnJpYmx5OwotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX0FUCi0vKiBUaGUgbTg4ayB1bmZvcnR1bmF0ZWx5IHVzZXMgQCBhcyBhIGxhYmVsIGJlZ2lubmVyLiAgKi8KLSNkZWZpbmUgTEVYX0FUIDAKLSNlbmRpZgotCi0jaWZuZGVmIExFWF9CUgotLyogVGhlIFJTLzYwMDAgYXNzZW1ibGVyIHVzZXMgeyx9LFssXSBhcyBwYXJ0cyBvZiBzeW1ib2wgbmFtZXMuICAqLwotI2RlZmluZSBMRVhfQlIgMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX1BDVAotLyogVGhlIERlbHRhIDY4ayBhc3NlbWJsZXIgcGVybWl0cyAlIGluc2lkZSBsYWJlbCBuYW1lcy4gICovCi0jZGVmaW5lIExFWF9QQ1QgMAotI2VuZGlmCi0KLSNpZm5kZWYgTEVYX1FNCi0vKiBUaGUgUG93ZXJQQyBXaW5kb3dzIE5UIGFzc2VtYmxlcnMgcGVybWl0cyA/IGluc2lkZSBsYWJlbCBuYW1lcy4gICovCi0jZGVmaW5lIExFWF9RTSAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfSEFTSAotI2RlZmluZSBMRVhfSEFTSCAwCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfRE9MTEFSCi0vKiBUaGUgYTI5ayBhc3NlbWJsZXIgZG9lcyBub3QgcGVybWl0cyBsYWJlbHMgdG8gc3RhcnQgd2l0aCAkLiAgKi8KLSNkZWZpbmUgTEVYX0RPTExBUiAzCi0jZW5kaWYKLQotI2lmbmRlZiBMRVhfVElMREUKLS8qIFRoZSBEZWx0YSA2OGsgYXNzZW1ibGVyIHBlcm1pdHMgfiBhdCBzdGFydCBvZiBsYWJlbCBuYW1lcy4gICovCi0jZGVmaW5lIExFWF9USUxERSAwCi0jZW5kaWYKLQotLyogdXNlZCBieSBpc18uLi4gbWFjcm9zLiBvdXIgY3R5cGVbXSAqLwotY2hhciBsZXhfdHlwZVsyNTZdID0KLXsKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogQEFCQ0RFRkdISUpLTE1OTyAqLwotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiBQUVJTVFVWV1hZWltcXV5fICovCi0gIDAsIDAsIDAsIExFWF9IQVNILCBMRVhfRE9MTEFSLCBMRVhfUENULCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAzLCAwLCAvKiBfISIjJCUmJygpKissLS4vICovCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIExFWF9RTSwJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLwotICBMRVhfQVQsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCS8qIEBBQkNERUZHSElKS0xNTk8gKi8KLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgTEVYX0JSLCAwLCBMRVhfQlIsIDAsIDMsIC8qIFBRUlNUVVZXWFlaW1xdXl8gKi8KLSAgMCwgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywJLyogYGFiY2RlZmdoaWprbG1ubyAqLwotICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCBMRVhfQlIsIDAsIExFWF9CUiwgTEVYX1RJTERFLCAwLCAvKiBwcXJzdHV2d3h5ent8fX4uICovCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMKLX07Ci0KLQotLyoKLSAqIEluOiBhIGNoYXJhY3Rlci4KLSAqIE91dDogMSBpZiB0aGlzIGNoYXJhY3RlciBlbmRzIGEgbGluZS4KLSAqLwotI2RlZmluZSBaXyAoMCkKLWNoYXIgaXNfZW5kX29mX2xpbmVbMjU2XSA9Ci17Ci0jaWZkZWYgQ1JfRU9MCi0gIDk5LCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCA5OSwgWl8sIFpfLCA5OSwgWl8sIFpfLAkvKiBAYWJjZGVmZ2hpamtsbW5vICovCi0jZWxzZQotICA5OSwgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgWl8sIFpfLCBaXywJLyogQGFiY2RlZmdoaWprbG1ubyAqLwotI2VuZGlmCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotI2lmZGVmIFRDX0hQUEEKLSAgWl8sOTksIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogXyEiIyQlJicoKSorLC0uLyAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogMDEyMzQ1Njc4OTo7PD0+PyAqLwotI2Vsc2UKLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgOTksIFpfLCBaXywgWl8sIFpfLAkvKiAwMTIzNDU2Nzg5Ojs8PT4/ICovCi0jZW5kaWYKLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLSAgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sCS8qICovCi0gIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLAkvKiAqLwotICBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywgWl8sIFpfLCBaXywJLyogKi8KLX07Ci0jdW5kZWYgWl8KLQotLyogRnVuY3Rpb25zIHByaXZhdGUgdG8gdGhpcyBmaWxlLiAqLwotCi1zdGF0aWMgY2hhciAqYnVmZmVyOwkvKiAxc3QgY2hhciBvZiBlYWNoIGJ1ZmZlciBvZiBsaW5lcyBpcyBoZXJlLiAqLwotc3RhdGljIGNoYXIgKmJ1ZmZlcl9saW1pdDsJLyotPjEgKyBsYXN0IGNoYXIgaW4gYnVmZmVyLiAqLwotCi0vKiBUQVJHRVRfQllURVNfQklHX0VORElBTiBpcyByZXF1aXJlZCB0byBiZSBkZWZpbmVkIHRvIGVpdGhlciAwIG9yIDEgaW4gdGhlCi0gICB0Yy08Q1BVPi5oIGZpbGUuICBTZWUgdGhlICJQb3J0aW5nIEdBUyIgc2VjdGlvbiBvZiB0aGUgaW50ZXJuYWxzIG1hbnVhbC4gKi8KLWludCB0YXJnZXRfYmlnX2VuZGlhbiA9IFRBUkdFVF9CWVRFU19CSUdfRU5ESUFOOwotCi1zdGF0aWMgY2hhciAqb2xkX2J1ZmZlcjsJLyogSkYgYSBoYWNrICovCi1zdGF0aWMgY2hhciAqb2xkX2lucHV0Owotc3RhdGljIGNoYXIgKm9sZF9saW1pdDsKLQotLyogVmFyaWFibGVzIGZvciBoYW5kbGluZyBpbmNsdWRlIGZpbGUgZGlyZWN0b3J5IHRhYmxlLiAqLwotCi1jaGFyICoqaW5jbHVkZV9kaXJzOwkvKiBUYWJsZSBvZiBwb2ludGVycyB0byBkaXJlY3RvcmllcyB0bwotCQkJICAgc2VhcmNoIGZvciAuaW5jbHVkZSdzICovCi1pbnQgaW5jbHVkZV9kaXJfY291bnQ7CS8qIEhvdyBtYW55IGFyZSBpbiB0aGUgdGFibGUgKi8KLWludCBpbmNsdWRlX2Rpcl9tYXhsZW4gPSAxOy8qIExlbmd0aCBvZiBsb25nZXN0IGluIHRhYmxlICovCi0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotc3RydWN0IGJyb2tlbl93b3JkICpicm9rZW5fd29yZHM7Ci1pbnQgbmV3X2Jyb2tlbl93b3JkczsKLSNlbmRpZgotCi0vKiBUaGUgY3VycmVudCBvZmZzZXQgaW50byB0aGUgYWJzb2x1dGUgc2VjdGlvbi4gIFdlIGRvbid0IHRyeSB0bwotICAgYnVpbGQgZnJhZ3MgaW4gdGhlIGFic29sdXRlIHNlY3Rpb24sIHNpbmNlIG5vIGRhdGEgY2FuIGJlIHN0b3JlZAotICAgdGhlcmUuICBXZSBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlIGN1cnJlbnQgb2Zmc2V0LiAgKi8KLWFkZHJlc3NUIGFic19zZWN0aW9uX29mZnNldDsKLQotLyogSWYgdGhpcyBsaW5lIGhhZCBhbiBNUkkgc3R5bGUgbGFiZWwsIGl0IGlzIHN0b3JlZCBpbiB0aGlzIHZhcmlhYmxlLgotICAgVGhpcyBpcyB1c2VkIGJ5IHNvbWUgb2YgdGhlIE1SSSBwc2V1ZG8tb3BzLiAgKi8KLXN5bWJvbFMgKmxpbmVfbGFiZWw7Ci0KLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIHVzZWQgdG8gc3VwcG9ydCBNUkkgY29tbW9uIHNlY3Rpb25zLiAgV2UKLSAgIHRyYW5zbGF0ZSBzdWNoIHNlY3Rpb25zIGludG8gYSBjb21tb24gc3ltYm9sLiAgVGhpcyB2YXJpYWJsZSBpcwotICAgbm9uLU5VTEwgd2hlbiB3ZSBhcmUgaW4gYW4gTVJJIGNvbW1vbiBzZWN0aW9uLiAgKi8KLXN5bWJvbFMgKm1yaV9jb21tb25fc3ltYm9sOwotCi0vKiBJbiBNUkkgbW9kZSwgYWZ0ZXIgYSBkYy5iIHBzZXVkby1vcCB3aXRoIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIHdlCi0gICBuZWVkIHRvIGFsaWduIHRvIGFuIGV2ZW4gYnl0ZSBib3VuZGFyeSB1bmxlc3MgdGhlIG5leHQgcHNldWRvLW9wIGlzCi0gICBkYy5iLCBkcy5iLCBvciBkY2IuYi4gIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIDEgaWYgYW4gYWxpZ25tZW50Ci0gICBtYXkgYmUgbmVlZGVkLiAgKi8KLXN0YXRpYyBpbnQgbXJpX3BlbmRpbmdfYWxpZ247Ci0KLSNpZm5kZWYgTk9fTElTVElORwotI2lmZGVmIE9CSl9FTEYKLS8qIFRoaXMgdmFyaWFibGUgaXMgc2V0IHRvIGJlIG5vbi16ZXJvIGlmIHRoZSBuZXh0IHN0cmluZyB3ZSBzZWUgbWlnaHQKLSAgIGJlIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZSBpbiBEV0FSRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBTZWUKLSAgIHRoZSBjb21tZW50IGluIGVtaXRfZXhwciBmb3IgdGhlIGZvcm1hdCB3ZSBsb29rIGZvci4gICovCi1zdGF0aWMgaW50IGR3YXJmX2ZpbGVfc3RyaW5nOwotI2VuZGlmCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgY29uc193b3JrZXIgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyBpbnQgc2NydWJfZnJvbV9zdHJpbmcgUEFSQU1TICgoY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRvX2FsaWduIFBBUkFNUyAoKGludCwgY2hhciAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgc19hbGlnbiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgc19sY29tbV9pbnRlcm5hbCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIGludCBoZXhfZmxvYXQgUEFSQU1TICgoaW50LCBjaGFyICopKTsKLXN0YXRpYyBpbmxpbmUgaW50IHNpemVvZl9zbGViMTI4IFBBUkFNUyAoKG9mZnNldFQpKTsKLXN0YXRpYyBpbmxpbmUgaW50IHNpemVvZl91bGViMTI4IFBBUkFNUyAoKHZhbHVlVCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X3NsZWIxMjggUEFSQU1TICgoY2hhciAqLCBvZmZzZXRUKSk7Ci1zdGF0aWMgaW5saW5lIGludCBvdXRwdXRfdWxlYjEyOCBQQVJBTVMgKChjaGFyICosIHZhbHVlVCkpOwotc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X2JpZ19zbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgTElUVExFTlVNX1RZUEUgKiwgaW50KSk7Ci1zdGF0aWMgaW5saW5lIGludCBvdXRwdXRfYmlnX3VsZWIxMjggUEFSQU1TICgoY2hhciAqLCBMSVRUTEVOVU1fVFlQRSAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgb3V0cHV0X2JpZ19sZWIxMjggUEFSQU1TICgoY2hhciAqLCBMSVRUTEVOVU1fVFlQRSAqLCBpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZG9fb3JnIFBBUkFNUyAoKHNlZ1QsIGV4cHJlc3Npb25TICosIGludCkpOwotY2hhciAqZGVtYW5kX2NvcHlfc3RyaW5nIFBBUkFNUyAoKGludCAqbGVuUCkpOwotc3RhdGljIHNlZ1QgZ2V0X3NlZ21lbnRlZF9leHByZXNzaW9uIFBBUkFNUyAoKGV4cHJlc3Npb25TICpleHBQKSk7Ci1zdGF0aWMgc2VnVCBnZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gUEFSQU1TICgoZXhwcmVzc2lvblMgKiBleHBQKSk7Ci1zdGF0aWMgdm9pZCBwb2JlZ2luIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2V0X2xpbmVfc2IgUEFSQU1TICgoc2IgKikpOwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfZmlsZV9kZWJ1ZyBQQVJBTVMgKCh2b2lkKSk7Ci0MCi0KLXZvaWQKLXJlYWRfYmVnaW4gKCkKLXsKLSAgY29uc3QgY2hhciAqcDsKLQotICBwb2JlZ2luICgpOwotICBvYmpfcmVhZF9iZWdpbl9ob29rICgpOwotCi0gIC8qIFNvbWV0aGluZyBjbG9zZSAtLSBidXQgbm90IHRvbyBjbG9zZSAtLSB0byBhIG11bHRpcGxlIG9mIDEwMjQuCi0gICAgIFRoZSBkZWJ1Z2dpbmcgbWFsbG9jIEknbSB1c2luZyBoYXMgMjQgYnl0ZXMgb2Ygb3ZlcmhlYWQuICAqLwotICBvYnN0YWNrX2JlZ2luICgmbm90ZXMsIGNodW5rc2l6ZSk7Ci0gIG9ic3RhY2tfYmVnaW4gKCZjb25kX29ic3RhY2ssIGNodW5rc2l6ZSk7Ci0KLSAgLyogVXNlIG1hY2hpbmUgZGVwZW5kZW50IHN5bnRheCAqLwotICBmb3IgKHAgPSBsaW5lX3NlcGFyYXRvcl9jaGFyczsgKnA7IHArKykKLSAgICBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnBdID0gMTsKLSAgLyogVXNlIG1vcmUuICBGSVhNRS1TT01FREFZLiAqLwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBsZXhfdHlwZVsnPyddID0gMzsKLX0KLQwKLS8qIHNldCB1cCBwc2V1ZG8tb3AgdGFibGVzICovCi0KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpwb19oYXNoOwotCi1zdGF0aWMgY29uc3QgcHNldWRvX3R5cGVTIHBvdGFibGVbXSA9Ci17Ci0gIHsiYWJvcnQiLCBzX2Fib3J0LCAwfSwKLSAgeyJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0gIHsiYXNjaWkiLCBzdHJpbmdlciwgMH0sCi0gIHsiYXNjaXoiLCBzdHJpbmdlciwgMX0sCi0gIHsiYmFsaWduIiwgc19hbGlnbl9ieXRlcywgMH0sCi0gIHsiYmFsaWdudyIsIHNfYWxpZ25fYnl0ZXMsIC0yfSwKLSAgeyJiYWxpZ25sIiwgc19hbGlnbl9ieXRlcywgLTR9LAotLyogYmxvY2sgKi8KLSAgeyJieXRlIiwgY29ucywgMX0sCi0gIHsiY29tbSIsIHNfY29tbSwgMH0sCi0gIHsiY29tbW9uIiwgc19tcmlfY29tbW9uLCAwfSwKLSAgeyJjb21tb24ucyIsIHNfbXJpX2NvbW1vbiwgMX0sCi0gIHsiZGF0YSIsIHNfZGF0YSwgMH0sCi0gIHsiZGMiLCBjb25zLCAyfSwKLSAgeyJkYy5iIiwgY29ucywgMX0sCi0gIHsiZGMuZCIsIGZsb2F0X2NvbnMsICdkJ30sCi0gIHsiZGMubCIsIGNvbnMsIDR9LAotICB7ImRjLnMiLCBmbG9hdF9jb25zLCAnZid9LAotICB7ImRjLnciLCBjb25zLCAyfSwKLSAgeyJkYy54IiwgZmxvYXRfY29ucywgJ3gnfSwKLSAgeyJkY2IiLCBzX3NwYWNlLCAyfSwKLSAgeyJkY2IuYiIsIHNfc3BhY2UsIDF9LAotICB7ImRjYi5kIiwgc19mbG9hdF9zcGFjZSwgJ2QnfSwKLSAgeyJkY2IubCIsIHNfc3BhY2UsIDR9LAotICB7ImRjYi5zIiwgc19mbG9hdF9zcGFjZSwgJ2YnfSwKLSAgeyJkY2IudyIsIHNfc3BhY2UsIDJ9LAotICB7ImRjYi54Iiwgc19mbG9hdF9zcGFjZSwgJ3gnfSwKLSAgeyJkcyIsIHNfc3BhY2UsIDJ9LAotICB7ImRzLmIiLCBzX3NwYWNlLCAxfSwKLSAgeyJkcy5kIiwgc19zcGFjZSwgOH0sCi0gIHsiZHMubCIsIHNfc3BhY2UsIDR9LAotICB7ImRzLnAiLCBzX3NwYWNlLCAxMn0sCi0gIHsiZHMucyIsIHNfc3BhY2UsIDR9LAotICB7ImRzLnciLCBzX3NwYWNlLCAyfSwKLSAgeyJkcy54Iiwgc19zcGFjZSwgMTJ9LAotICB7ImRlYnVnIiwgc19pZ25vcmUsIDB9LAotI2lmZGVmIFNfU0VUX0RFU0MKLSAgeyJkZXNjIiwgc19kZXNjLCAwfSwKLSNlbmRpZgotLyogZGltICovCi0gIHsiZG91YmxlIiwgZmxvYXRfY29ucywgJ2QnfSwKLS8qIGRzZWN0ICovCi0gIHsiZWplY3QiLCBsaXN0aW5nX2VqZWN0LCAwfSwJLyogRm9ybWZlZWQgbGlzdGluZyAqLwotICB7ImVsc2UiLCBzX2Vsc2UsIDB9LAotICB7ImVsc2VjIiwgc19lbHNlLCAwfSwKLSAgeyJlbmQiLCBzX2VuZCwgMH0sCi0gIHsiZW5kYyIsIHNfZW5kaWYsIDB9LAotICB7ImVuZGZ1bmMiLCBzX2Z1bmMsIDF9LAotICB7ImVuZGlmIiwgc19lbmRpZiwgMH0sCi0vKiBlbmRlZiAqLwotICB7ImVxdSIsIHNfc2V0LCAwfSwKLSAgeyJlcXVpdiIsIHNfc2V0LCAxfSwKLSAgeyJlcnIiLCBzX2VyciwgMH0sCi0gIHsiZXhpdG0iLCBzX21leGl0LCAwfSwKLS8qIGV4dGVuZCAqLwotICB7ImV4dGVybiIsIHNfaWdub3JlLCAwfSwJLyogV2UgdHJlYXQgYWxsIHVuZGVmIGFzIGV4dCAqLwotICB7ImFwcGZpbGUiLCBzX2FwcF9maWxlLCAxfSwKLSAgeyJhcHBsaW5lIiwgc19hcHBfbGluZSwgMH0sCi0gIHsiZmFpbCIsIHNfZmFpbCwgMH0sCi0gIHsiZmlsZSIsIHNfYXBwX2ZpbGUsIDB9LAotICB7ImZpbGwiLCBzX2ZpbGwsIDB9LAotICB7ImZsb2F0IiwgZmxvYXRfY29ucywgJ2YnfSwKLSAgeyJmb3JtYXQiLCBzX2lnbm9yZSwgMH0sCi0gIHsiZnVuYyIsIHNfZnVuYywgMH0sCi0gIHsiZ2xvYmFsIiwgc19nbG9ibCwgMH0sCi0gIHsiZ2xvYmwiLCBzX2dsb2JsLCAwfSwKLSAgeyJod29yZCIsIGNvbnMsIDJ9LAotICB7ImlmIiwgc19pZiwgKGludCkgT19uZX0sCi0gIHsiaWZjIiwgc19pZmMsIDB9LAotICB7ImlmZGVmIiwgc19pZmRlZiwgMH0sCi0gIHsiaWZlcSIsIHNfaWYsIChpbnQpIE9fZXF9LAotICB7ImlmZXFzIiwgc19pZmVxcywgMH0sCi0gIHsiaWZnZSIsIHNfaWYsIChpbnQpIE9fZ2V9LAotICB7ImlmZ3QiLCBzX2lmLCAoaW50KSBPX2d0fSwKLSAgeyJpZmxlIiwgc19pZiwgKGludCkgT19sZX0sCi0gIHsiaWZsdCIsIHNfaWYsIChpbnQpIE9fbHR9LAotICB7ImlmbmMiLCBzX2lmYywgMX0sCi0gIHsiaWZuZGVmIiwgc19pZmRlZiwgMX0sCi0gIHsiaWZuZSIsIHNfaWYsIChpbnQpIE9fbmV9LAotICB7ImlmbmVzIiwgc19pZmVxcywgMX0sCi0gIHsiaWZub3RkZWYiLCBzX2lmZGVmLCAxfSwKLSAgeyJpbmNsdWRlIiwgc19pbmNsdWRlLCAwfSwKLSAgeyJpbnQiLCBjb25zLCA0fSwKLSAgeyJpcnAiLCBzX2lycCwgMH0sCi0gIHsiaXJlcCIsIHNfaXJwLCAwfSwKLSAgeyJpcnBjIiwgc19pcnAsIDF9LAotICB7ImlyZXBjIiwgc19pcnAsIDF9LAotICB7Imxjb21tIiwgc19sY29tbSwgMH0sCi0gIHsibGZsYWdzIiwgbGlzdGluZ19mbGFncywgMH0sCS8qIExpc3RpbmcgZmxhZ3MgKi8KLSAgeyJsaW5rb25jZSIsIHNfbGlua29uY2UsIDB9LAotICB7Imxpc3QiLCBsaXN0aW5nX2xpc3QsIDF9LAkvKiBUdXJuIGxpc3Rpbmcgb24gKi8KLSAgeyJsbGVuIiwgbGlzdGluZ19wc2l6ZSwgMX0sCi0gIHsibG9uZyIsIGNvbnMsIDR9LAotICB7ImxzeW0iLCBzX2xzeW0sIDB9LAotICB7Im1hY3JvIiwgc19tYWNybywgMH0sCi0gIHsibWV4aXQiLCBzX21leGl0LCAwfSwKLSAgeyJtcmkiLCBzX21yaSwgMH0sCi0gIHsiLm1yaSIsIHNfbXJpLCAwfSwJLyogU3BlY2lhbCBjYXNlIHNvIC5tcmkgd29ya3MgaW4gTVJJIG1vZGUuICAqLwotICB7Im5hbWUiLCBzX2lnbm9yZSwgMH0sCi0gIHsibm9mb3JtYXQiLCBzX2lnbm9yZSwgMH0sCi0gIHsibm9saXN0IiwgbGlzdGluZ19saXN0LCAwfSwJLyogVHVybiBsaXN0aW5nIG9mZiAqLwotICB7Im5vcGFnZSIsIGxpc3Rpbmdfbm9wYWdlLCAwfSwKLSAgeyJvY3RhIiwgY29ucywgMTZ9LAotICB7Im9mZnNldCIsIHNfc3RydWN0LCAwfSwKLSAgeyJvcmciLCBzX29yZywgMH0sCi0gIHsicDJhbGlnbiIsIHNfYWxpZ25fcHR3bywgMH0sCi0gIHsicDJhbGlnbnciLCBzX2FsaWduX3B0d28sIC0yfSwKLSAgeyJwMmFsaWdubCIsIHNfYWxpZ25fcHR3bywgLTR9LAotICB7InBhZ2UiLCBsaXN0aW5nX2VqZWN0LCAwfSwKLSAgeyJwbGVuIiwgbGlzdGluZ19wc2l6ZSwgMH0sCi0gIHsicHJpbnQiLCBzX3ByaW50LCAwfSwKLSAgeyJwc2l6ZSIsIGxpc3RpbmdfcHNpemUsIDB9LAkvKiBzZXQgcGFwZXIgc2l6ZSAqLwotICB7InB1cmdlbSIsIHNfcHVyZ2VtLCAwfSwKLSAgeyJxdWFkIiwgY29ucywgOH0sCi0gIHsicmVwIiwgc19yZXB0LCAwfSwKLSAgeyJyZXB0Iiwgc19yZXB0LCAwfSwKLSAgeyJydmEiLCBzX3J2YSwgNH0sCi0gIHsic2J0dGwiLCBsaXN0aW5nX3RpdGxlLCAxfSwJLyogU3VidGl0bGUgb2YgbGlzdGluZyAqLwotLyogc2NsICovCi0vKiBzZWN0ICovCi0gIHsic2V0Iiwgc19zZXQsIDB9LAotICB7InNob3J0IiwgY29ucywgMn0sCi0gIHsic2luZ2xlIiwgZmxvYXRfY29ucywgJ2YnfSwKLS8qIHNpemUgKi8KLSAgeyJzcGFjZSIsIHNfc3BhY2UsIDB9LAotICB7InNraXAiLCBzX3NwYWNlLCAwfSwKLSAgeyJzbGViMTI4Iiwgc19sZWIxMjgsIDF9LAotICB7InNwYyIsIHNfaWdub3JlLCAwfSwKLSAgeyJzdGFiZCIsIHNfc3RhYiwgJ2QnfSwKLSAgeyJzdGFibiIsIHNfc3RhYiwgJ24nfSwKLSAgeyJzdGFicyIsIHNfc3RhYiwgJ3MnfSwKLSAgeyJzdHJpbmciLCBzdHJpbmdlciwgMX0sCi0gIHsic3RydWN0Iiwgc19zdHJ1Y3QsIDB9LAotLyogdGFnICovCi0gIHsidGV4dCIsIHNfdGV4dCwgMH0sCi0KLSAgLyogVGhpcyBpcyBmb3IgZ2NjIHRvIHVzZS4gIEl0J3Mgb25seSBqdXN0IGJlZW4gYWRkZWQgKDIvOTQpLCBzbyBnY2MKLSAgICAgd29uJ3QgYmUgYWJsZSB0byB1c2UgaXQgZm9yIGEgd2hpbGUgLS0gcHJvYmFibHkgYSB5ZWFyIG9yIG1vcmUuCi0gICAgIEJ1dCBvbmNlIHRoaXMgaGFzIGJlZW4gcmVsZWFzZWQsIGNoZWNrIHdpdGggZ2NjIG1haW50YWluZXJzCi0gICAgIGJlZm9yZSBkZWxldGluZyBpdCBvciBldmVuIGNoYW5naW5nIHRoZSBzcGVsbGluZy4gICovCi0gIHsidGhpc19HQ0NfcmVxdWlyZXNfdGhlX0dOVV9hc3NlbWJsZXIiLCBzX2lnbm9yZSwgMH0sCi0gIC8qIElmIHdlJ3JlIGZvbGRpbmcgY2FzZSAtLSBkb25lIGZvciBzb21lIHRhcmdldHMsIG5vdCBuZWNlc3NhcmlseQotICAgICBhbGwgLS0gdGhlIGFib3ZlIHN0cmluZyBpbiBhbiBpbnB1dCBmaWxlIHdpbGwgYmUgY29udmVydGVkIHRvCi0gICAgIHRoaXMgb25lLiAgTWF0Y2ggaXQgZWl0aGVyIHdheS4uLiAgKi8KLSAgeyJ0aGlzX2djY19yZXF1aXJlc190aGVfZ251X2Fzc2VtYmxlciIsIHNfaWdub3JlLCAwfSwKLQotICB7InRpdGxlIiwgbGlzdGluZ190aXRsZSwgMH0sCS8qIExpc3RpbmcgdGl0bGUgKi8KLSAgeyJ0dGwiLCBsaXN0aW5nX3RpdGxlLCAwfSwKLS8qIHR5cGUgKi8KLSAgeyJ1bGViMTI4Iiwgc19sZWIxMjgsIDB9LAotLyogdXNlICovCi0vKiB2YWwgKi8KLSAgeyJ4Y29tIiwgc19jb21tLCAwfSwKLSAgeyJ4ZGVmIiwgc19nbG9ibCwgMH0sCi0gIHsieHJlZiIsIHNfaWdub3JlLCAwfSwKLSAgeyJ4c3RhYnMiLCBzX3hzdGFiLCAncyd9LAotICB7IndvcmQiLCBjb25zLCAyfSwKLSAgeyJ6ZXJvIiwgc19zcGFjZSwgMH0sCi0gIHtOVUxMfQkJCS8qIGVuZCBzZW50aW5lbCAqLwotfTsKLQotc3RhdGljIGludCBwb3Bfb3ZlcnJpZGVfb2sgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKnBvcF90YWJsZV9uYW1lOwotCi12b2lkCi1wb3BfaW5zZXJ0ICh0YWJsZSkKLSAgICAgY29uc3QgcHNldWRvX3R5cGVTICp0YWJsZTsKLXsKLSAgY29uc3QgY2hhciAqZXJydHh0OwotICBjb25zdCBwc2V1ZG9fdHlwZVMgKnBvcDsKLSAgZm9yIChwb3AgPSB0YWJsZTsgcG9wLT5wb2NfbmFtZTsgcG9wKyspCi0gICAgewotICAgICAgZXJydHh0ID0gaGFzaF9pbnNlcnQgKHBvX2hhc2gsIHBvcC0+cG9jX25hbWUsIChjaGFyICopIHBvcCk7Ci0gICAgICBpZiAoZXJydHh0ICYmICghcG9wX292ZXJyaWRlX29rIHx8IHN0cmNtcCAoZXJydHh0LCAiZXhpc3RzIikpKQotCWFzX2ZhdGFsIChfKCJlcnJvciBjb25zdHJ1Y3RpbmcgJXMgcHNldWRvLW9wIHRhYmxlOiAlcyIpLCBwb3BfdGFibGVfbmFtZSwKLQkJICBlcnJ0eHQpOwotICAgIH0KLX0KLQotI2lmbmRlZiBtZF9wb3BfaW5zZXJ0Ci0jZGVmaW5lIG1kX3BvcF9pbnNlcnQoKQkJcG9wX2luc2VydChtZF9wc2V1ZG9fdGFibGUpCi0jZW5kaWYKLQotI2lmbmRlZiBvYmpfcG9wX2luc2VydAotI2RlZmluZSBvYmpfcG9wX2luc2VydCgpCXBvcF9pbnNlcnQob2JqX3BzZXVkb190YWJsZSkKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCAKLXBvYmVnaW4gKCkKLXsKLSAgcG9faGFzaCA9IGhhc2hfbmV3ICgpOwotCi0gIC8qIERvIHRoZSB0YXJnZXQtc3BlY2lmaWMgcHNldWRvIG9wcy4gKi8KLSAgcG9wX3RhYmxlX25hbWUgPSAibWQiOwotICBtZF9wb3BfaW5zZXJ0ICgpOwotCi0gIC8qIE5vdyBvYmplY3Qgc3BlY2lmaWMuICBTa2lwIGFueSB0aGF0IHdlcmUgaW4gdGhlIHRhcmdldCB0YWJsZS4gKi8KLSAgcG9wX3RhYmxlX25hbWUgPSAib2JqIjsKLSAgcG9wX292ZXJyaWRlX29rID0gMTsKLSAgb2JqX3BvcF9pbnNlcnQgKCk7Ci0KLSAgLyogTm93IHBvcnRhYmxlIG9uZXMuICBTa2lwIGFueSB0aGF0IHdlJ3ZlIHNlZW4gYWxyZWFkeS4gKi8KLSAgcG9wX3RhYmxlX25hbWUgPSAic3RhbmRhcmQiOwotICBwb3BfaW5zZXJ0IChwb3RhYmxlKTsKLX0KLQwKLSNkZWZpbmUgSEFORExFX0NPTkRJVElPTkFMX0FTU0VNQkxZKCkJCQkJCVwKLSAgaWYgKGlnbm9yZV9pbnB1dCAoKSkJCQkJCQkJXAotICAgIHsJCQkJCQkJCQlcCi0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcisrXSkJXAotCWlmIChpbnB1dF9saW5lX3BvaW50ZXIgPT0gYnVmZmVyX2xpbWl0KQkJCQlcCi0JICBicmVhazsJCQkJCQkJXAotICAgICAgY29udGludWU7CQkJCQkJCQlcCi0gICAgfQotCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIHNjcnViYmluZyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuICNBUFAKLSAgIGFuZCAjTk9fQVBQLiAgKi8KLQotc3RhdGljIGNoYXIgKnNjcnViX3N0cmluZzsKLXN0YXRpYyBjaGFyICpzY3J1Yl9zdHJpbmdfZW5kOwotCi1zdGF0aWMgaW50Ci1zY3J1Yl9mcm9tX3N0cmluZyAoYnVmLCBidWZsZW4pCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGJ1ZmxlbjsKLXsKLSAgaW50IGNvcHk7Ci0KLSAgY29weSA9IHNjcnViX3N0cmluZ19lbmQgLSBzY3J1Yl9zdHJpbmc7Ci0gIGlmIChjb3B5ID4gYnVmbGVuKQotICAgIGNvcHkgPSBidWZsZW47Ci0gIG1lbWNweSAoYnVmLCBzY3J1Yl9zdHJpbmcsIGNvcHkpOwotICBzY3J1Yl9zdHJpbmcgKz0gY29weTsKLSAgcmV0dXJuIGNvcHk7Ci19Ci0KLS8qCXJlYWRfYV9zb3VyY2VfZmlsZSgpCi0gKgotICogV2UgcmVhZCB0aGUgZmlsZSwgcHV0dGluZyB0aGluZ3MgaW50byBhIHdlYiB0aGF0Ci0gKiByZXByZXNlbnRzIHdoYXQgd2UgaGF2ZSBiZWVuIHJlYWRpbmcuCi0gKi8KLXZvaWQgCi1yZWFkX2Ffc291cmNlX2ZpbGUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqczsJCS8qIHN0cmluZyBvZiBzeW1ib2wsICdcMCcgYXBwZW5kZWQgKi8KLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHBzZXVkb190eXBlUyAqcG9wOwotCi0gIGJ1ZmZlciA9IGlucHV0X3NjcnViX25ld19maWxlIChuYW1lKTsKLQotICBsaXN0aW5nX2ZpbGUgKG5hbWUpOwotICBsaXN0aW5nX25ld2xpbmUgKE5VTEwpOwotICByZWdpc3Rlcl9kZXBlbmRlbmN5IChuYW1lKTsKLQotICAvKiBHZW5lcmF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmVmb3JlIHdlJ3ZlIHJlYWQgYW55dGhpbmcgaW4gdG8gZGVub3RlCi0gICAgIHRoaXMgZmlsZSBhcyB0aGUgIm1haW4iIHNvdXJjZSBmaWxlIGFuZCBub3QgYSBzdWJvcmRpbmF0ZSBvbmUKLSAgICAgKGUuZy4gTl9TTyB2cyBOX1NPTCBpbiBzdGFicykuICAqLwotICBnZW5lcmF0ZV9maWxlX2RlYnVnICgpOwotCi0gIHdoaWxlICgoYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpKSAhPSAwKQotICAgIHsJCQkJLyogV2UgaGF2ZSBhbm90aGVyIGxpbmUgdG8gcGFyc2UuICovCi0gICAgICBrbm93IChidWZmZXJfbGltaXRbLTFdID09ICdcbicpOwkvKiBNdXN0IGhhdmUgYSBzZW50aW5lbC4gKi8KLSAgICBjb250aW46CQkJLyogSkYgdGhpcyBnb3RvIGlzIG15IGZhdWx0IEkgYWRtaXQgaXQuCi0JCQkJICAgU29tZW9uZSBicmF2ZSBwbGVhc2UgcmUtd3JpdGUgdGhlIHdob2xlCi0JCQkJICAgaW5wdXQgc2VjdGlvbiBoZXJlPyAgUGxlZXplPz8/ICAqLwotICAgICAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdCkKLQl7Ci0JICAvKiBXZSBoYXZlIG1vcmUgb2YgdGhpcyBidWZmZXIgdG8gcGFyc2UuICovCi0KLQkgIC8qCi0JICAgKiBXZSBub3cgaGF2ZSBpbnB1dF9saW5lX3BvaW50ZXItPjFzdCBjaGFyIG9mIG5leHQgbGluZS4KLQkgICAqIElmIGlucHV0X2xpbmVfcG9pbnRlciBbLTFdID09ICdcbicgdGhlbiB3ZSBqdXN0Ci0JICAgKiBzY2FubmVkIGFub3RoZXIgbGluZTogc28gYnVtcCBsaW5lIGNvdW50ZXJzLgotCSAgICovCi0JICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKQotCSAgICB7Ci0jaWZkZWYgbWRfc3RhcnRfbGluZV9ob29rCi0JICAgICAgbWRfc3RhcnRfbGluZV9ob29rICgpOwotI2VuZGlmCi0KLQkgICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9PSAnXG4nKQotCQlidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0KLQkgICAgICBsaW5lX2xhYmVsID0gTlVMTDsKLQotCSAgICAgIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTEFCRUxTX1dJVEhPVVRfQ09MT05TCi0JCSAgfHwgMQotI2VuZGlmCi0JCSAgKQotCQl7Ci0JCSAgLyogVGV4dCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG11c3QgYmUgYSBsYWJlbCwgd2UKLQkJICAgICBydW4gZG93biBhbmQgc3RpY2sgYSBjb2xvbiBpbi4gICovCi0JCSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKCppbnB1dF9saW5lX3BvaW50ZXIpKQotCQkgICAgewotCQkgICAgICBjaGFyICpsaW5lX3N0YXJ0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCQkgICAgICBjaGFyIGM7Ci0JCSAgICAgIGludCBtcmlfbGluZV9tYWNybzsKLQotCQkgICAgICBMSVNUSU5HX05FV0xJTkUgKCk7Ci0JCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKLQotCQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLQkJICAgICAgLyogSW4gTVJJIG1vZGUsIHRoZSBFUVUgYW5kIE1BQ1JPIHBzZXVkb29wcyBtdXN0Ci0JCQkgYmUgaGFuZGxlZCBzcGVjaWFsbHkuICAqLwotCQkgICAgICBtcmlfbGluZV9tYWNybyA9IDA7Ci0JCSAgICAgIGlmIChmbGFnX202OGtfbXJpKQotCQkJewotCQkJICBjaGFyICpyZXN0ID0gaW5wdXRfbGluZV9wb2ludGVyICsgMTsKLQotCQkJICBpZiAoKnJlc3QgPT0gJzonKQotCQkJICAgICsrcmVzdDsKLQkJCSAgaWYgKCpyZXN0ID09ICcgJyB8fCAqcmVzdCA9PSAnXHQnKQotCQkJICAgICsrcmVzdDsKLQkJCSAgaWYgKChzdHJuY2FzZWNtcCAocmVzdCwgIkVRVSIsIDMpID09IDAKLQkJCSAgICAgICB8fCBzdHJuY2FzZWNtcCAocmVzdCwgIlNFVCIsIDMpID09IDApCi0JCQkgICAgICAmJiAocmVzdFszXSA9PSAnICcgfHwgcmVzdFszXSA9PSAnXHQnKSkKLQkJCSAgICB7Ci0JCQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSByZXN0ICsgMzsKLQkJCSAgICAgIGVxdWFscyAobGluZV9zdGFydCwKLQkJCQkgICAgICBzdHJuY2FzZWNtcCAocmVzdCwgIlNFVCIsIDMpID09IDApOwotCQkJICAgICAgY29udGludWU7Ci0JCQkgICAgfQotCQkJICBpZiAoc3RybmNhc2VjbXAgKHJlc3QsICJNQUNSTyIsIDUpID09IDAKLQkJCSAgICAgICYmIChyZXN0WzVdID09ICcgJwotCQkJCSAgfHwgcmVzdFs1XSA9PSAnXHQnCi0JCQkJICB8fCBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgcmVzdFs1XV0pKQotCQkJICAgIG1yaV9saW5lX21hY3JvID0gMTsKLQkJCX0KLQotCQkgICAgICAvKiBJbiBNUkkgbW9kZSwgd2UgbmVlZCB0byBoYW5kbGUgdGhlIE1BQ1JPCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvLW9wIHNwZWNpYWxseTogd2UgZG9uJ3Qgd2FudCB0byBwdXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCQkgICAgICBpZiAoISBtcmlfbGluZV9tYWNybykKLQkJCWxpbmVfbGFiZWwgPSBjb2xvbiAobGluZV9zdGFydCk7Ci0JCSAgICAgIGVsc2UKLQkJCWxpbmVfbGFiZWwgPSBzeW1ib2xfY3JlYXRlIChsaW5lX3N0YXJ0LAotCQkJCQkJICAgIGFic29sdXRlX3NlY3Rpb24sCi0JCQkJCQkgICAgKHZhbHVlVCkgMCwKLQkJCQkJCSAgICAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCQkgICAgICBpZiAoYyA9PSAnOicpCi0JCQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIC8qCi0JICAgKiBXZSBhcmUgYXQgdGhlIGJlZ2luaW5nIG9mIGEgbGluZSwgb3Igc2ltaWxhciBwbGFjZS4KLQkgICAqIFdlIGV4cGVjdCBhIHdlbGwtZm9ybWVkIGFzc2VtYmxlciBzdGF0ZW1lbnQuCi0JICAgKiBBICJzeW1ib2wtbmFtZToiIGlzIGEgc3RhdGVtZW50LgotCSAgICoKLQkgICAqIERlcGVuZGluZyBvbiB3aGF0IGNvbXBpbGVyIGlzIHVzZWQsIHRoZSBvcmRlciBvZiB0aGVzZSB0ZXN0cwotCSAgICogbWF5IHZhcnkgdG8gY2F0Y2ggbW9zdCBjb21tb24gY2FzZSAxc3QuCi0JICAgKiBFYWNoIHRlc3QgaXMgaW5kZXBlbmRlbnQgb2YgYWxsIG90aGVyIHRlc3RzIGF0IHRoZSAodG9wKSBsZXZlbC4KLQkgICAqIFBMRUFTRSBtYWtlIGEgY29tcGlsZXIgdGhhdCBkb2Vzbid0IHVzZSB0aGlzIGFzc2VtYmxlci4KLQkgICAqIEl0IGlzIGNydWZ0eSB0byB3YXN0ZSBhIGNvbXBpbGVyJ3MgdGltZSBlbmNvZGluZyB0aGluZ3MgZm9yIHRoaXMKLQkgICAqIGFzc2VtYmxlciwgd2hpY2ggdGhlbiB3YXN0ZXMgbW9yZSB0aW1lIGRlY29kaW5nIGl0LgotCSAgICogKEFuZCBjb21tdW5pY2F0aW5nIHZpYSAobGluZWFyKSBmaWxlcyBpcyBzaWxseSEKLQkgICAqIElmIHlvdSBtdXN0IHBhc3Mgc3R1ZmYsIHBsZWFzZSBwYXNzIGEgdHJlZSEpCi0JICAgKi8KLQkgIGlmICgoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykgPT0gJ1x0JwotCSAgICAgIHx8IGMgPT0gJyAnCi0JICAgICAgfHwgYyA9PSAnXGYnCi0JICAgICAgfHwgYyA9PSAwKQotCSAgICB7Ci0JICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgICAgfQotCSAga25vdyAoYyAhPSAnICcpOwkvKiBObyBmdXJ0aGVyIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi8KLQotI2lmbmRlZiBOT19MSVNUSU5HCi0JICAvKiBJZiBsaXN0aW5nIGlzIG9uLCBhbmQgd2UgYXJlIGV4cGFuZGluZyBhIG1hY3JvLCB0aGVuIGdpdmUKLQkgICAgIHRoZSBsaXN0aW5nIGNvZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHBhbmRlZCBsaW5lLiAgKi8KLQkgIGlmIChsaXN0aW5nKQotCSAgICB7Ci0JICAgICAgaWYgKChsaXN0aW5nICYgTElTVElOR19NQUNFWFApICYmIG1hY3JvX25lc3QgPiAwKQotCQl7Ci0JCSAgY2hhciAqY29weTsKLQkJICBpbnQgbGVuOwotCi0JCSAgLyogRmluZCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGV4cGFuZGVkIG1hY3JvIGxpbmUuICAqLwotCQkgIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlci0xOyAqcyA7ICsrcykKLQkJICAgIGlmIChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdKQotCQkgICAgICBicmVhazsKLQotCQkgIC8qIENvcHkgaXQgZm9yIHNhZmUga2VlcGluZy4gIEFsc28gZ2l2ZSBhbiBpbmRpY2F0aW9uIG9mCi0JCSAgICAgaG93IG11Y2ggbWFjcm8gbmVzdGluZyBpcyBpbnZvbHZlZCBhdCB0aGlzIHBvaW50LiAgKi8KLQkJICBsZW4gPSBzIC0gKGlucHV0X2xpbmVfcG9pbnRlci0xKTsKLQkJICBjb3B5ID0gKGNoYXIgKikgeG1hbGxvYyAobGVuICsgbWFjcm9fbmVzdCArIDIpOwotCQkgIG1lbXNldCAoY29weSwgJz4nLCBtYWNyb19uZXN0KTsKLQkJICBjb3B5W21hY3JvX25lc3RdID0gJyAnOwotCQkgIG1lbWNweSAoY29weSArIG1hY3JvX25lc3QgKyAxLCBpbnB1dF9saW5lX3BvaW50ZXItMSwgbGVuKTsKLQkJICBjb3B5W21hY3JvX25lc3QrMStsZW5dID0gJ1wwJzsKLQotCQkgIC8qIEluc3RhbGwgdGhlIGxpbmUgd2l0aCB0aGUgbGlzdGluZyBmYWNpbGl0eS4gICovCi0JCSAgbGlzdGluZ19uZXdsaW5lIChjb3B5KTsKLQkJfQotCSAgICAgIGVsc2UKLQkJbGlzdGluZ19uZXdsaW5lIChOVUxMKTsKLQkgICAgfQotI2VuZGlmCi0KLQkgIC8qCi0JICAgKiBDIGlzIHRoZSAxc3Qgc2lnbmlmaWNhbnQgY2hhcmFjdGVyLgotCSAgICogSW5wdXRfbGluZV9wb2ludGVyIHBvaW50cyBhZnRlciB0aGF0IGNoYXJhY3Rlci4KLQkgICAqLwotCSAgaWYgKGlzX25hbWVfYmVnaW5uZXIgKGMpKQotCSAgICB7Ci0JICAgICAgLyogd2FudCB1c2VyLWRlZmluZWQgbGFiZWwgb3IgcHNldWRvL29wY29kZSAqLwotCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKLQotCSAgICAgIHMgPSAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7CS8qIG5hbWUncyBkZWxpbWl0ZXIgKi8KLQkgICAgICAvKgotCSAgICAgICAqIEMgaXMgY2hhcmFjdGVyIGFmdGVyIHN5bWJvbC4KLQkgICAgICAgKiBUaGF0IGNoYXJhY3RlcidzIHBsYWNlIGluIHRoZSBpbnB1dCBsaW5lIGlzIG5vdyAnXDAnLgotCSAgICAgICAqIFMgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bWJvbC4KLQkgICAgICAgKiAgIFtJbiBjYXNlIG9mIHBzZXVkby1vcCwgcy0+Jy4nLl0KLQkgICAgICAgKiBJbnB1dF9saW5lX3BvaW50ZXItPidcMCcgd2hlcmUgYyB3YXMuCi0JICAgICAgICovCi0JICAgICAgaWYgKFRDX1NUQVJUX0xBQkVMKGMsIGlucHV0X2xpbmVfcG9pbnRlcikpCi0JCXsKLQkJICBpZiAoZmxhZ19tNjhrX21yaSkKLQkJICAgIHsKLQkJICAgICAgY2hhciAqcmVzdCA9IGlucHV0X2xpbmVfcG9pbnRlciArIDE7Ci0KLQkJICAgICAgLyogSW4gTVJJIG1vZGUsIFx0c3ltOiBzZXQgMCBpcyBwZXJtaXR0ZWQuICAqLwotCi0JCSAgICAgIGlmICgqcmVzdCA9PSAnOicpCi0JCQkrK3Jlc3Q7Ci0JCSAgICAgIGlmICgqcmVzdCA9PSAnICcgfHwgKnJlc3QgPT0gJ1x0JykKLQkJCSsrcmVzdDsKLQkJICAgICAgaWYgKChzdHJuY2FzZWNtcCAocmVzdCwgIkVRVSIsIDMpID09IDAKLQkJCSAgIHx8IHN0cm5jYXNlY21wIChyZXN0LCAiU0VUIiwgMykgPT0gMCkKLQkJCSAgJiYgKHJlc3RbM10gPT0gJyAnIHx8IHJlc3RbM10gPT0gJ1x0JykpCi0JCQl7Ci0JCQkgIGlucHV0X2xpbmVfcG9pbnRlciA9IHJlc3QgKyAzOwotCQkJICBlcXVhbHMgKHMsIDEpOwotCQkJICBjb250aW51ZTsKLQkJCX0KLQkJICAgIH0KLQotCQkgIGxpbmVfbGFiZWwgPSBjb2xvbiAocyk7CS8qIHVzZXItZGVmaW5lZCBsYWJlbCAqLwotCQkgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9ICc6JzsJLyogUHV0ICc6JyBiYWNrIGZvciBlcnJvciBtZXNzYWdlcycgc2FrZS4gKi8KLQkJICAvKiBJbnB1dF9saW5lX3BvaW50ZXItPmFmdGVyICc6Jy4gKi8KLQkJICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLQotCQl9Ci0JICAgICAgZWxzZSBpZiAoYyA9PSAnPScKLQkJICAgICAgIHx8ICgoYyA9PSAnICcgfHwgYyA9PSAnXHQnKQotCQkJICAgJiYgaW5wdXRfbGluZV9wb2ludGVyWzFdID09ICc9JwotI2lmZGVmIFRDX0VRVUFMX0lOX0lOU04KLQkJCSAgICYmICEgVENfRVFVQUxfSU5fSU5TTiAoYywgaW5wdXRfbGluZV9wb2ludGVyKQotI2VuZGlmCi0JCQkgICApKQotCQl7Ci0JCSAgZXF1YWxzIChzLCAxKTsKLQkJICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7CQkvKiBleHBlY3QgcHNldWRvLW9wIG9yIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gKi8KLQkJICBwb3AgPSBOVUxMOwotCi0jZGVmaW5lIElHTk9SRV9PUENPREVfQ0FTRQotI2lmZGVmIElHTk9SRV9PUENPREVfQ0FTRQotCQkgIHsKLQkJICAgIGNoYXIgKnMyID0gczsKLQkJICAgIHdoaWxlICgqczIpCi0JCSAgICAgIHsKLQkJCWlmIChpc3VwcGVyICgodW5zaWduZWQgY2hhcikgKnMyKSkKLQkJCSAgKnMyID0gdG9sb3dlciAoKnMyKTsKLQkJCXMyKys7Ci0JCSAgICAgIH0KLQkJICB9Ci0jZW5kaWYKLQotCQkgIGlmIChmbGFnX202OGtfbXJpCi0jaWZkZWYgTk9fUFNFVURPX0RPVAotCQkgICAgICB8fCAxCi0jZW5kaWYKLQkJICAgICAgKQotCQkgICAgewotCQkgICAgICAvKiBUaGUgTVJJIGFzc2VtYmxlciBhbmQgdGhlIG04OGsgdXNlIHBzZXVkby1vcHMKLSAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGEgcGVyaW9kLiAgKi8KLQkJICAgICAgcG9wID0gKHBzZXVkb190eXBlUyAqKSBoYXNoX2ZpbmQgKHBvX2hhc2gsIHMpOwotCQkgICAgICBpZiAocG9wICE9IE5VTEwgJiYgcG9wLT5wb2NfaGFuZGxlciA9PSBOVUxMKQotCQkJcG9wID0gTlVMTDsKLQkJICAgIH0KLQotCQkgIGlmIChwb3AgIT0gTlVMTAotCQkgICAgICB8fCAoISBmbGFnX202OGtfbXJpICYmICpzID09ICcuJykpCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqIFBTRVVETyAtIE9QLgotCQkgICAgICAgKgotCQkgICAgICAgKiBXQVJOSU5HOiBjIGhhcyBuZXh0IGNoYXIsIHdoaWNoIG1heSBiZSBlbmQtb2YtbGluZS4KLQkJICAgICAgICogV2UgbG9va3VwIHRoZSBwc2V1ZG8tb3AgdGFibGUgd2l0aCBzKzEgYmVjYXVzZSB3ZQotCQkgICAgICAgKiBhbHJlYWR5IGtub3cgdGhhdCB0aGUgcHNldWRvLW9wIGJlZ2lucyB3aXRoIGEgJy4nLgotCQkgICAgICAgKi8KLQotCQkgICAgICBpZiAocG9wID09IE5VTEwpCi0JCQlwb3AgPSAocHNldWRvX3R5cGVTICopIGhhc2hfZmluZCAocG9faGFzaCwgcyArIDEpOwotCi0JCSAgICAgIC8qIEluIE1SSSBtb2RlLCB3ZSBtYXkgbmVlZCB0byBpbnNlcnQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgYWxpZ25tZW50IGRpcmVjdGl2ZS4gIFdoYXQgYSBoYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcy4gICovCi0JCSAgICAgIGlmIChtcmlfcGVuZGluZ19hbGlnbgotCQkJICAmJiAocG9wID09IE5VTEwKLQkJCSAgICAgIHx8ICEgKChwb3AtPnBvY19oYW5kbGVyID09IGNvbnMKLQkJCQkgICAgICYmIHBvcC0+cG9jX3ZhbCA9PSAxKQotCQkJCSAgICB8fCAocG9wLT5wb2NfaGFuZGxlciA9PSBzX3NwYWNlCi0JCQkJCSYmIHBvcC0+cG9jX3ZhbCA9PSAxKQotI2lmZGVmIHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wCi0JCQkJICAgIHx8IHRjX2NvbmRpdGlvbmFsX3BzZXVkb29wIChwb3ApCi0jZW5kaWYKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2lmCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZmRlZgotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfaWZjCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZmVxcwotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfZWxzZQotCQkJCSAgICB8fCBwb3AtPnBvY19oYW5kbGVyID09IHNfZW5kaWYKLQkJCQkgICAgfHwgcG9wLT5wb2NfaGFuZGxlciA9PSBzX2dsb2JsCi0JCQkJICAgIHx8IHBvcC0+cG9jX2hhbmRsZXIgPT0gc19pZ25vcmUpKSkKLQkJCXsKLQkJCSAgZG9fYWxpZ24gKDEsIChjaGFyICopIE5VTEwsIDAsIDApOwotCQkJICBtcmlfcGVuZGluZ19hbGlnbiA9IDA7Ci0JCQkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JCQkgICAgewotCQkJICAgICAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCBmcmFnX25vdyk7Ci0JCQkgICAgICBTX1NFVF9WQUxVRSAobGluZV9sYWJlbCwgZnJhZ19ub3dfZml4ICgpKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgLyogUHJpbnQgdGhlIGVycm9yIG1zZyBub3csIHdoaWxlIHdlIHN0aWxsIGNhbiAqLwotCQkgICAgICBpZiAocG9wID09IE5VTEwpCi0JCQl7Ci0JCQkgIGFzX2JhZCAoXygiVW5rbm93biBwc2V1ZG8tb3A6ICBgJXMnIiksIHMpOwotCQkJICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJCSAgc19pZ25vcmUgKDApOwotCQkJICBjb250aW51ZTsKLQkJCX0KLQotCQkgICAgICAvKiBQdXQgaXQgYmFjayBmb3IgZXJyb3IgbWVzc2FnZXMgZXRjLiAqLwotCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkJICAgICAgLyogVGhlIGZvbGxvd2luZyBza2lwIG9mIHdoaXRlc3BhY2UgaXMgY29tcHVsc29yeS4KLQkJCSBBIHdlbGwgc2hhcGVkIHNwYWNlIGlzIHNvbWV0aW1lcyBhbGwgdGhhdCBzZXBhcmF0ZXMKLQkJCSBrZXl3b3JkIGZyb20gb3BlcmFuZHMuICovCi0JCSAgICAgIGlmIChjID09ICcgJyB8fCBjID09ICdcdCcpCi0JCQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJICAgICAgLyoKLQkJICAgICAgICogSW5wdXRfbGluZSBpcyByZXN0b3JlZC4KLQkJICAgICAgICogSW5wdXRfbGluZV9wb2ludGVyLT4xc3Qgbm9uLWJsYW5rIGNoYXIKLQkJICAgICAgICogYWZ0ZXIgcHNldWRvLW9wZXJhdGlvbi4KLQkJICAgICAgICovCi0JCSAgICAgICgqcG9wLT5wb2NfaGFuZGxlcikgKHBvcC0+cG9jX3ZhbCk7Ci0KLQkJICAgICAgLyogSWYgdGhhdCB3YXMgLmVuZCwganVzdCBnZXQgb3V0IG5vdy4gICovCi0JCSAgICAgIGlmIChwb3AtPnBvY19oYW5kbGVyID09IHNfZW5kKQotCQkJZ290byBxdWl0OwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaW50IGlucXVvdGUgPSAwOwotI2lmZGVmIFFVT1RFU19JTl9JTlNOCi0JCSAgICAgIGludCBpbmVzY2FwZSA9IDA7Ci0jZW5kaWYKLQotCQkgICAgICAvKiBXQVJOSU5HOiBjIGhhcyBjaGFyLCB3aGljaCBtYXkgYmUgZW5kLW9mLWxpbmUuICovCi0JCSAgICAgIC8qIEFsc286IGlucHV0X2xpbmVfcG9pbnRlci0+YFwwYCB3aGVyZSBjIHdhcy4gKi8KLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0JCSAgICAgIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdCi0JCQkgICAgIHx8IGlucXVvdGUKLSNpZmRlZiBUQ19FT0xfSU5fSU5TTgotCQkJICAgICB8fCBUQ19FT0xfSU5fSU5TTiAoaW5wdXRfbGluZV9wb2ludGVyKQotI2VuZGlmCi0JCQkgICAgICkKLQkJCXsKLQkJCSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXCcnKQotCQkJICAgIGlucXVvdGUgPSAhIGlucXVvdGU7Ci0jaWZkZWYgUVVPVEVTX0lOX0lOU04KLQkJCSAgaWYgKGluZXNjYXBlKQotCQkJICAgIGluZXNjYXBlID0gMDsKLQkJCSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnIicpCi0JCQkgICAgaW5xdW90ZSA9ICEgaW5xdW90ZTsKLQkJCSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXFwnKQotCQkJICAgIGluZXNjYXBlID0gMTsKLSNlbmRpZgotCQkJICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkJCX0KLQotCQkgICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLQkJICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0KLQkJICAgICAgZ2VuZXJhdGVfbGluZW5vX2RlYnVnICgpOwotCi0JCSAgICAgIGlmIChtYWNyb19kZWZpbmVkKQotCQkJewotCQkJICBzYiBvdXQ7Ci0JCQkgIGNvbnN0IGNoYXIgKmVycjsKLQotCQkJICBpZiAoY2hlY2tfbWFjcm8gKHMsICZvdXQsICdcMCcsICZlcnIpKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChlcnIgIT0gTlVMTCkKLQkJCQlhc19iYWQgKGVycik7Ci0JCQkgICAgICAqaW5wdXRfbGluZV9wb2ludGVyKysgPSBjOwotCQkJICAgICAgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiAoJm91dCwKLQkJCQkJCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0JCQkgICAgICBzYl9raWxsICgmb3V0KTsKLQkJCSAgICAgIGJ1ZmZlcl9saW1pdCA9Ci0JCQkJaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotCQkJICAgICAgY29udGludWU7Ci0JCQkgICAgfQotCQkJfQotCi0JCSAgICAgIGlmIChtcmlfcGVuZGluZ19hbGlnbikKLQkJCXsKLQkJCSAgZG9fYWxpZ24gKDEsIChjaGFyICopIE5VTEwsIDAsIDApOwotCQkJICBtcmlfcGVuZGluZ19hbGlnbiA9IDA7Ci0JCQkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JCQkgICAgewotCQkJICAgICAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCBmcmFnX25vdyk7Ci0JCQkgICAgICBTX1NFVF9WQUxVRSAobGluZV9sYWJlbCwgZnJhZ19ub3dfZml4ICgpKTsKLQkJCSAgICB9Ci0JCQl9Ci0KLQkJICAgICAgbWRfYXNzZW1ibGUgKHMpOwkvKiBBc3NlbWJsZSAxIGluc3RydWN0aW9uLiAqLwotCi0JCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIrKyA9IGM7Ci0KLQkJICAgICAgLyogV2UgcmVzdW1lIGxvb3AgQUZURVIgdGhlIGVuZC1vZi1saW5lIGZyb20KLQkJCSB0aGlzIGluc3RydWN0aW9uLiAqLwotCQkgICAgfQkJLyogaWYgKCpzPT0nLicpICovCi0JCX0JCS8qIGlmIGM9PSc6JyAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9CQkJLyogaWYgKGlzX25hbWVfYmVnaW5uZXIoYykgKi8KLQotCi0JICAvKiBFbXB0eSBzdGF0ZW1lbnQ/ICAqLwotCSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBjXSkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmICgoTE9DQUxfTEFCRUxTX0RPTExBUiB8fCBMT0NBTF9MQUJFTFNfRkIpCi0JICAgICAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIGMpKQotCSAgICB7Ci0JICAgICAgLyogbG9jYWwgbGFiZWwgICgiNDoiKSAqLwotCSAgICAgIGNoYXIgKmJhY2t1cCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotCSAgICAgIEhBTkRMRV9DT05ESVRJT05BTF9BU1NFTUJMWSAoKTsKLQotCSAgICAgIHRlbXAgPSBjIC0gJzAnOwotCi0JICAgICAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyKSkKLQkJewotCQkgIHRlbXAgPSAodGVtcCAqIDEwKSArICppbnB1dF9saW5lX3BvaW50ZXIgLSAnMCc7Ci0JCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JCX0JCS8qIHJlYWQgdGhlIHdob2xlIG51bWJlciAqLwotCi0JICAgICAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIKLQkJICAmJiAqaW5wdXRfbGluZV9wb2ludGVyID09ICckJwotCQkgICYmICooaW5wdXRfbGluZV9wb2ludGVyICsgMSkgPT0gJzonKQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLQkJICBpZiAoZG9sbGFyX2xhYmVsX2RlZmluZWQgKHRlbXApKQotCQkgICAgewotCQkgICAgICBhc19mYXRhbCAoXygibGFiZWwgXCIlZCRcIiByZWRlZmluZWQiKSwgdGVtcCk7Ci0JCSAgICB9Ci0KLQkJICBkZWZpbmVfZG9sbGFyX2xhYmVsICh0ZW1wKTsKLQkJICBjb2xvbiAoZG9sbGFyX2xhYmVsX25hbWUgKHRlbXAsIDApKTsKLQkJICBjb250aW51ZTsKLQkJfQotCi0JICAgICAgaWYgKExPQ0FMX0xBQkVMU19GQgotCQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnOicpCi0JCXsKLQkJICBmYl9sYWJlbF9pbnN0YW5jZV9pbmMgKHRlbXApOwotCQkgIGNvbG9uIChmYl9sYWJlbF9uYW1lICh0ZW1wLCAwKSk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGJhY2t1cDsKLQkgICAgfQkJCS8qIGxvY2FsIGxhYmVsICAoIjQ6IikgKi8KLQotCSAgaWYgKGMgJiYgc3RyY2hyIChsaW5lX2NvbW1lbnRfY2hhcnMsIGMpKQotCSAgICB7CQkJLyogSXRzIGEgY29tbWVudC4gIEJldHRlciBzYXkgQVBQIG9yIE5PX0FQUCAqLwotCSAgICAgIGNoYXIgKmVuZHM7Ci0JICAgICAgY2hhciAqbmV3X2J1ZjsKLQkgICAgICBjaGFyICpuZXdfdG1wOwotCSAgICAgIHVuc2lnbmVkIGludCBuZXdfbGVuZ3RoOwotCSAgICAgIGNoYXIgKnRtcF9idWYgPSAwOwotCi0JICAgICAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCSAgICAgIHMgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAgICAgaWYgKHN0cm5jbXAgKHMsICJBUFBcbiIsIDQpKQotCQljb250aW51ZTsJLyogV2UgaWdub3JlIGl0ICovCi0JICAgICAgcyArPSA0OwotCi0JICAgICAgZW5kcyA9IHN0cnN0ciAocywgIiNOT19BUFBcbiIpOwotCi0JICAgICAgaWYgKCFlbmRzKQotCQl7Ci0JCSAgdW5zaWduZWQgaW50IHRtcF9sZW47Ci0JCSAgdW5zaWduZWQgaW50IG51bTsKLQotCQkgIC8qIFRoZSBlbmQgb2YgdGhlICNBUFAgd2Fzbid0IGluIHRoaXMgYnVmZmVyLiAgV2UKLQkJICAgICBrZWVwIHJlYWRpbmcgaW4gYnVmZmVycyB1bnRpbCB3ZSBmaW5kIHRoZSAjTk9fQVBQCi0JCSAgICAgdGhhdCBnb2VzIHdpdGggdGhpcyAjQVBQICBUaGVyZSBpcyBvbmUuICBUaGUgc3BlY3MKLQkJICAgICBndWFyZW50ZWUgaXQuIC4gLiAqLwotCQkgIHRtcF9sZW4gPSBidWZmZXJfbGltaXQgLSBzOwotCQkgIHRtcF9idWYgPSB4bWFsbG9jICh0bXBfbGVuICsgMSk7Ci0JCSAgbWVtY3B5ICh0bXBfYnVmLCBzLCB0bXBfbGVuKTsKLQkJICBkbwotCQkgICAgewotCQkgICAgICBuZXdfdG1wID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZidWZmZXIpOwotCQkgICAgICBpZiAoIW5ld190bXApCi0JCQlicmVhazsKLQkJICAgICAgZWxzZQotCQkJYnVmZmVyX2xpbWl0ID0gbmV3X3RtcDsKLQkJICAgICAgaW5wdXRfbGluZV9wb2ludGVyID0gYnVmZmVyOwotCQkgICAgICBlbmRzID0gc3Ryc3RyIChidWZmZXIsICIjTk9fQVBQXG4iKTsKLQkJICAgICAgaWYgKGVuZHMpCi0JCQludW0gPSBlbmRzIC0gYnVmZmVyOwotCQkgICAgICBlbHNlCi0JCQludW0gPSBidWZmZXJfbGltaXQgLSBidWZmZXI7Ci0KLQkJICAgICAgdG1wX2J1ZiA9IHhyZWFsbG9jICh0bXBfYnVmLCB0bXBfbGVuICsgbnVtKTsKLQkJICAgICAgbWVtY3B5ICh0bXBfYnVmICsgdG1wX2xlbiwgYnVmZmVyLCBudW0pOwotCQkgICAgICB0bXBfbGVuICs9IG51bTsKLQkJICAgIH0KLQkJICB3aGlsZSAoIWVuZHMpOwotCi0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gZW5kcyA/IGVuZHMgKyA4IDogTlVMTDsKLQotCQkgIHMgPSB0bXBfYnVmOwotCQkgIGVuZHMgPSBzICsgdG1wX2xlbjsKLQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaW5wdXRfbGluZV9wb2ludGVyID0gZW5kcyArIDg7Ci0JCX0KLQotCSAgICAgIHNjcnViX3N0cmluZyA9IHM7Ci0JICAgICAgc2NydWJfc3RyaW5nX2VuZCA9IGVuZHM7Ci0KLQkgICAgICBuZXdfbGVuZ3RoID0gZW5kcyAtIHM7Ci0JICAgICAgbmV3X2J1ZiA9IChjaGFyICopIHhtYWxsb2MgKG5ld19sZW5ndGgpOwotCSAgICAgIG5ld190bXAgPSBuZXdfYnVmOwotCSAgICAgIGZvciAoOzspCi0JCXsKLQkJICBpbnQgc3BhY2U7Ci0JCSAgaW50IHNpemU7Ci0KLQkJICBzcGFjZSA9IChuZXdfYnVmICsgbmV3X2xlbmd0aCkgLSBuZXdfdG1wOwotCQkgIHNpemUgPSBkb19zY3J1Yl9jaGFycyAoc2NydWJfZnJvbV9zdHJpbmcsIG5ld190bXAsIHNwYWNlKTsKLQotCQkgIGlmIChzaXplIDwgc3BhY2UpCi0JCSAgICB7Ci0JCSAgICAgIG5ld190bXAgKz0gc2l6ZTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0KLQkJICBuZXdfYnVmID0geHJlYWxsb2MgKG5ld19idWYsIG5ld19sZW5ndGggKyAxMDApOwotCQkgIG5ld190bXAgPSBuZXdfYnVmICsgbmV3X2xlbmd0aDsKLQkJICBuZXdfbGVuZ3RoICs9IDEwMDsKLQkJfQotCi0JICAgICAgaWYgKHRtcF9idWYpCi0JCWZyZWUgKHRtcF9idWYpOwotCSAgICAgIG9sZF9idWZmZXIgPSBidWZmZXI7Ci0JICAgICAgb2xkX2lucHV0ID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIG9sZF9saW1pdCA9IGJ1ZmZlcl9saW1pdDsKLQkgICAgICBidWZmZXIgPSBuZXdfYnVmOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IG5ld19idWY7Ci0JICAgICAgYnVmZmVyX2xpbWl0ID0gbmV3X3RtcDsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBIQU5ETEVfQ09ORElUSU9OQUxfQVNTRU1CTFkgKCk7Ci0KLSNpZmRlZiB0Y191bnJlY29nbml6ZWRfbGluZQotCSAgaWYgKHRjX3VucmVjb2duaXplZF9saW5lIChjKSkKLQkgICAgY29udGludWU7Ci0jZW5kaWYKLQotCSAgLyogYXNfd2FybigiSnVuayBjaGFyYWN0ZXIgJWQuIixjKTsgIE5vdyBkb25lIGJ5IGlnbm9yZV9yZXN0ICovCi0JICBpbnB1dF9saW5lX3BvaW50ZXItLTsJLyogUmVwb3J0IHVua25vd24gY2hhciBhcyBpZ25vcmVkLiAqLwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQl9CQkJLyogd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlcjxidWZmZXJfbGltaXQpICovCi0KLSNpZmRlZiBtZF9hZnRlcl9wYXNzX2hvb2sKLSAgICAgIG1kX2FmdGVyX3Bhc3NfaG9vayAoKTsKLSNlbmRpZgotCi0gICAgICBpZiAob2xkX2J1ZmZlcikKLQl7Ci0JICBmcmVlIChidWZmZXIpOwotCSAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCSAgaWYgKG9sZF9pbnB1dCAhPSAwKQotCSAgICB7Ci0JICAgICAgYnVmZmVyID0gb2xkX2J1ZmZlcjsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBvbGRfaW5wdXQ7Ci0JICAgICAgYnVmZmVyX2xpbWl0ID0gb2xkX2xpbWl0OwotCSAgICAgIG9sZF9idWZmZXIgPSAwOwotCSAgICAgIGdvdG8gY29udGluOwotCSAgICB9Ci0JfQotICAgIH0JCQkJLyogd2hpbGUgKG1vcmUgYnVmZmVycyB0byBzY2FuKSAqLwotCi0gcXVpdDoKLQotI2lmZGVmIG1kX2NsZWFudXAKLSAgbWRfY2xlYW51cCgpOwotI2VuZGlmCi0gIGlucHV0X3NjcnViX2Nsb3NlICgpOwkJLyogQ2xvc2UgdGhlIGlucHV0IGZpbGUgKi8KLX0KLQotLyogRm9yIG1vc3QgTVJJIHBzZXVkby1vcHMsIHRoZSBsaW5lIGFjdHVhbGx5IGVuZHMgYXQgdGhlIGZpcnN0Ci0gICBub25xdW90ZWQgc3BhY2UuICBUaGlzIGZ1bmN0aW9uIGxvb2tzIGZvciB0aGF0IHBvaW50LCBzdHVmZnMgYSBudWxsCi0gICBpbiwgYW5kIHNldHMgKlNUT1BDUCB0byB0aGUgY2hhcmFjdGVyIHRoYXQgdXNlZCB0byBiZSB0aGVyZSwgYW5kCi0gICByZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQotICAgVW50aWwgSSBoZWFyIG90aGVyd2lzZSwgSSBhbSBnb2luZyB0byBhc3N1bWUgdGhhdCB0aGlzIGlzIG9ubHkgdHJ1ZQotICAgZm9yIHRoZSBtNjhrIE1SSSBhc3NlbWJsZXIuICAqLwotCi1jaGFyICoKLW1yaV9jb21tZW50X2ZpZWxkIChzdG9wY3ApCi0gICAgIGNoYXIgKnN0b3BjcDsKLXsKLSNpZmRlZiBUQ19NNjhLCi0KLSAgY2hhciAqczsKLSAgaW50IGlucXVvdGUgPSAwOwotCi0gIGtub3cgKGZsYWdfbTY4a19tcmkpOwotCi0gIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgICAoKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICpzXSAmJiAqcyAhPSAnICcgJiYgKnMgIT0gJ1x0JykKLQl8fCBpbnF1b3RlKTsKLSAgICAgICBzKyspCi0gICAgewotICAgICAgaWYgKCpzID09ICdcJycpCi0JaW5xdW90ZSA9ICEgaW5xdW90ZTsKLSAgICB9Ci0gICpzdG9wY3AgPSAqczsKLSAgKnMgPSAnXDAnOwotICByZXR1cm4gczsKLQotI2Vsc2UKLQotICBjaGFyICpzOwotCi0gIGZvciAocyA9IGlucHV0X2xpbmVfcG9pbnRlcjsgISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKnNdOyBzKyspCi0gICAgOwotICAqc3RvcGNwID0gKnM7Ci0gICpzID0gJ1wwJzsKLSAgcmV0dXJuIHM7Ci0KLSNlbmRpZgotCi19Ci0KLS8qIFNraXAgdG8gdGhlIGVuZCBvZiBhbiBNUkkgY29tbWVudCBmaWVsZC4gICovCi0KLXZvaWQKLW1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpCi0gICAgIGNoYXIgKnN0b3A7Ci0gICAgIGludCBzdG9wYzsKLXsKLSAga25vdyAoZmxhZ19tcmkpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IHN0b3A7Ci0gICpzdG9wID0gc3RvcGM7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLX0KLQotdm9pZCAKLXNfYWJvcnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgYXNfZmF0YWwgKF8oIi5hYm9ydCBkZXRlY3RlZC4gIEFiYW5kb25pbmcgc2hpcC4iKSk7Ci19Ci0KLS8qIEd1dHMgb2YgLmFsaWduIGRpcmVjdGl2ZS4gIE4gaXMgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCB0byBhbGlnbi4KLSAgIEZJTEwgbWF5IGJlIE5VTEwsIG9yIGl0IG1heSBwb2ludCB0byB0aGUgYnl0ZXMgb2YgdGhlIGZpbGwgcGF0dGVybi4KLSAgIExFTiBpcyB0aGUgbGVuZ3RoIG9mIHdoYXRldmVyIEZJTEwgcG9pbnRzIHRvLCBpZiBhbnl0aGluZy4gIE1BWCBpcwotICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2tpcCB3aGVuIGRvaW5nIHRoZSBhbGlnbm1lbnQsCi0gICBvciAwIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uICAqLwotCi1zdGF0aWMgdm9pZCAKLWRvX2FsaWduIChuLCBmaWxsLCBsZW4sIG1heCkKLSAgICAgaW50IG47Ci0gICAgIGNoYXIgKmZpbGw7Ci0gICAgIGludCBsZW47Ci0gICAgIGludCBtYXg7Ci17Ci0gIGNoYXIgZGVmYXVsdF9maWxsOwotCi0jaWZkZWYgbWRfZG9fYWxpZ24KLSAgbWRfZG9fYWxpZ24gKG4sIGZpbGwsIGxlbiwgbWF4LCBqdXN0X3JlY29yZF9hbGlnbm1lbnQpOwotI2VuZGlmCi0KLSAgaWYgKGZpbGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc3Vic2VnX3RleHRfcCAobm93X3NlZykpCi0JZGVmYXVsdF9maWxsID0gTk9QX09QQ09ERTsKLSAgICAgIGVsc2UKLQlkZWZhdWx0X2ZpbGwgPSAwOwotICAgICAgZmlsbCA9ICZkZWZhdWx0X2ZpbGw7Ci0gICAgICBsZW4gPSAxOwotICAgIH0KLQotICAvKiBPbmx5IG1ha2UgYSBmcmFnIGlmIHdlIEhBVkUgdG8uIC4gLiAqLwotICBpZiAobiAhPSAwICYmICFuZWVkX3Bhc3NfMikKLSAgICB7Ci0gICAgICBpZiAobGVuIDw9IDEpCi0JZnJhZ19hbGlnbiAobiwgKmZpbGwsIG1heCk7Ci0gICAgICBlbHNlCi0JZnJhZ19hbGlnbl9wYXR0ZXJuIChuLCBmaWxsLCBsZW4sIG1heCk7Ci0gICAgfQotCi0jaWZkZWYgbWRfZG9fYWxpZ24KLSBqdXN0X3JlY29yZF9hbGlnbm1lbnQ6Ci0jZW5kaWYKLQotICByZWNvcmRfYWxpZ25tZW50IChub3dfc2VnLCBuKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYWxpZ24gcHNldWRvLW9wLiAgQSBwb3NpdGl2ZSBBUkcgaXMgYSBkZWZhdWx0IGFsaWdubWVudAotICAgKGluIGJ5dGVzKS4gIEEgbmVnYXRpdmUgQVJHIGlzIHRoZSBuZWdhdGl2ZSBvZiB0aGUgbGVuZ3RoIG9mIHRoZQotICAgZmlsbCBwYXR0ZXJuLiAgQllURVNfUCBpcyBub24temVybyBpZiB0aGUgYWxpZ25tZW50IHZhbHVlIHNob3VsZCBiZQotICAgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksIHJhdGhlciB0aGFuIHRoZSBwb3dlciBvZiAyLiAgKi8KLQotc3RhdGljIHZvaWQKLXNfYWxpZ24gKGFyZywgYnl0ZXNfcCkKLSAgICAgaW50IGFyZzsKLSAgICAgaW50IGJ5dGVzX3A7Ci17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBhbGlnbjsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0gIG9mZnNldFQgZmlsbCA9IDA7Ci0gIGludCBtYXg7Ci0gIGludCBmaWxsX3A7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBpZiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgIGlmIChhcmcgPCAwKQotCWFsaWduID0gMDsKLSAgICAgIGVsc2UKLQlhbGlnbiA9IGFyZzsJLyogRGVmYXVsdCB2YWx1ZSBmcm9tIHBzZXVkby1vcCB0YWJsZSAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0gIGlmIChieXRlc19wKQotICAgIHsKLSAgICAgIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyLiAgKi8KLSAgICAgIGlmIChhbGlnbiAhPSAwKQotCXsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBmb3IgKGkgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKytpKQotCSAgICA7Ci0JICBpZiAoYWxpZ24gIT0gMSkKLQkgICAgYXNfYmFkIChfKCJBbGlnbm1lbnQgbm90IGEgcG93ZXIgb2YgMiIpKTsKLQkgIGFsaWduID0gaTsKLQl9Ci0gICAgfQotCi0gIGlmIChhbGlnbiA+IDE1KQotICAgIHsKLSAgICAgIGFsaWduID0gMTU7Ci0gICAgICBhc19iYWQgKF8oIkFsaWdubWVudCB0b28gbGFyZ2U6ICV1IGFzc3VtZWQiKSwgYWxpZ24pOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgZmlsbF9wID0gMDsKLSAgICAgIG1heCA9IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JZmlsbF9wID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0JICBmaWxsX3AgPSAxOwotCX0KLQotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCW1heCA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBtYXggPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLQl9Ci0gICAgfQotCi0gIGlmICghIGZpbGxfcCkKLSAgICB7Ci0gICAgICBpZiAoYXJnIDwgMCkKLQlhc193YXJuIChfKCJleHBlY3RlZCBmaWxsIHBhdHRlcm4gbWlzc2luZyIpKTsKLSAgICAgIGRvX2FsaWduIChhbGlnbiwgKGNoYXIgKikgTlVMTCwgMCwgbWF4KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgZmlsbF9sZW47Ci0KLSAgICAgIGlmIChhcmcgPj0gMCkKLQlmaWxsX2xlbiA9IDE7Ci0gICAgICBlbHNlCi0JZmlsbF9sZW4gPSAtIGFyZzsKLSAgICAgIGlmIChmaWxsX2xlbiA8PSAxKQotCXsKLQkgIGNoYXIgZmlsbF9jaGFyOwotCi0JICBmaWxsX2NoYXIgPSBmaWxsOwotCSAgZG9fYWxpZ24gKGFsaWduLCAmZmlsbF9jaGFyLCBmaWxsX2xlbiwgbWF4KTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBhYlsxNl07Ci0KLQkgIGlmICgoc2l6ZV90KSBmaWxsX2xlbiA+IHNpemVvZiBhYikKLQkgICAgYWJvcnQgKCk7Ci0JICBtZF9udW1iZXJfdG9fY2hhcnMgKGFiLCBmaWxsLCBmaWxsX2xlbik7Ci0JICBkb19hbGlnbiAoYWxpZ24sIGFiLCBmaWxsX2xlbiwgbWF4KTsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3Agb24gbWFjaGluZXMgd2hlcmUgIi5hbGlnbiA0IiBtZWFucwotICAgYWxpZ24gdG8gYSA0IGJ5dGUgYm91bmRhcnkuICAqLwotCi12b2lkIAotc19hbGlnbl9ieXRlcyAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBzX2FsaWduIChhcmcsIDEpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5hbGlnbiBwc2V1ZG8tb3Agb24gbWFjaGluZXMgd2hlcmUgIi5hbGlnbiA0IiBtZWFucyBhbGlnbgotICAgdG8gYSAyKio0IGJvdW5kYXJ5LiAgKi8KLQotdm9pZCAKLXNfYWxpZ25fcHR3byAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBzX2FsaWduIChhcmcsIDApOwotfQotCi12b2lkIAotc19jb21tIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgb2Zmc2V0VCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgLyoganVzdCBhZnRlciBuYW1lIGlzIG5vdyAnXDAnICovCi0gIHAgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICpwID0gYzsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBzeW1ib2wtbmFtZTogcmVzdCBvZiBsaW5lIGlnbm9yZWQuIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIGlmIChmbGFnX21yaSkKLQltcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOwkJLyogc2tpcCAnLCcgKi8KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCIuQ09NTW9uIGxlbmd0aCAoJWxkLikgPDAhIElnbm9yZWQuIiksIChsb25nKSB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAqcCA9IDA7Ci0gIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgKnAgPSBjOwotICBpZiAoU19JU19ERUZJTkVEIChzeW1ib2xQKSAmJiAhIFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIklnbm9yaW5nIGF0dGVtcHQgdG8gcmUtZGVmaW5lIHN5bWJvbCBgJXMnLiIpLAotCSAgICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApKQotICAgIHsKLSAgICAgIGlmIChTX0dFVF9WQUxVRSAoc3ltYm9sUCkgIT0gKHZhbHVlVCkgdGVtcCkKLQlhc19iYWQgKF8oIkxlbmd0aCBvZiAuY29tbSBcIiVzXCIgaXMgYWxyZWFkeSAlbGQuIE5vdCBjaGFuZ2VkIHRvICVsZC4iKSwKLQkJU19HRVRfTkFNRSAoc3ltYm9sUCksCi0JCShsb25nKSBTX0dFVF9WQUxVRSAoc3ltYm9sUCksCi0JCShsb25nKSB0ZW1wKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgdGVtcCk7Ci0gICAgICBTX1NFVF9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0gICAgfQotI2lmZGVmIE9CSl9WTVMKLSAgewotICAgIGV4dGVybiBpbnQgZmxhZ19vbmU7Ci0gICAgaWYgKCAoIXRlbXApIHx8ICFmbGFnX29uZSkKLSAgICAgIFNfR0VUX09USEVSKHN5bWJvbFApID0gY29uc3RfZmxhZzsKLSAgfQotI2VuZGlmIC8qIG5vdCBPQkpfVk1TICovCi0gIGtub3cgKHN5bWJvbFAtPnN5X2ZyYWcgPT0gJnplcm9fYWRkcmVzc19mcmFnKTsKLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0JCQkJLyogc19jb21tKCkgKi8KLQotLyogVGhlIE1SSSBDT01NT04gcHNldWRvLW9wLiAgV2UgaGFuZGxlIHRoaXMgYnkgY3JlYXRpbmcgYSBjb21tb24KLSAgIHN5bWJvbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBuYW1lLiAgV2UgbWFrZSBzX3NwYWNlIGRvIHRoZSByaWdodAotICAgdGhpbmcgYnkgaW5jcmVhc2luZyB0aGUgc2l6ZS4gICovCi0KLXZvaWQKLXNfbXJpX2NvbW1vbiAoc21hbGwpCi0gICAgIGludCBzbWFsbDsKLXsKLSAgY2hhciAqbmFtZTsKLSAgY2hhciBjOwotICBjaGFyICphbGMgPSBOVUxMOwotICBzeW1ib2xTICpzeW07Ci0gIG9mZnNldFQgYWxpZ247Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0gIGlmICghIGZsYWdfbXJpKQotICAgIHsKLSAgICAgIHNfY29tbSAoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKSkKLSAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLQotICAgICAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQl7Ci0JICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKFNfR0VUX05BTUUgKGxpbmVfbGFiZWwpKQotCQkJCSAgKyAoaW5wdXRfbGluZV9wb2ludGVyIC0gbmFtZSkKLQkJCQkgICsgMSk7Ci0JICBzcHJpbnRmIChhbGMsICIlcyVzIiwgbmFtZSwgU19HRVRfTkFNRSAobGluZV9sYWJlbCkpOwotCSAgbmFtZSA9IGFsYzsKLQl9Ci0gICAgfQotCi0gIHN5bSA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLSAgaWYgKGFsYyAhPSBOVUxMKQotICAgIGZyZWUgKGFsYyk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIGFsaWduID0gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICB9Ci0KLSAgaWYgKFNfSVNfREVGSU5FRCAoc3ltKSAmJiAhIFNfSVNfQ09NTU9OIChzeW0pKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcyciKSwgU19HRVRfTkFNRSAoc3ltKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIFNfU0VUX0VYVEVSTkFMIChzeW0pOwotICBtcmlfY29tbW9uX3N5bWJvbCA9IHN5bTsKLQotI2lmZGVmIFNfU0VUX0FMSUdOCi0gIGlmIChhbGlnbiAhPSAwKQotICAgIFNfU0VUX0FMSUdOIChzeW0sIGFsaWduKTsKLSNlbmRpZgotCi0gIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0gICAgewotICAgICAgZXhwcmVzc2lvblMgZXhwOwotICAgICAgZXhwLlhfb3AgPSBPX3N5bWJvbDsKLSAgICAgIGV4cC5YX2FkZF9zeW1ib2wgPSBzeW07Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIHN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAobGluZV9sYWJlbCwgJmV4cCk7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKGxpbmVfbGFiZWwsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBTX1NFVF9TRUdNRU5UIChsaW5lX2xhYmVsLCBleHByX3NlY3Rpb24pOwotICAgIH0KLQotICAvKiBGSVhNRTogV2UganVzdCBpZ25vcmUgdGhlIHNtYWxsIGFyZ3VtZW50LCB3aGljaCBkaXN0aW5ndWlzaGVzCi0gICAgIENPTU1PTiBhbmQgQ09NTU9OLlMuICBJIGRvbid0IGtub3cgd2hhdCB3ZSBjYW4gZG8gYWJvdXQgaXQuICAqLwotCi0gIC8qIElnbm9yZSB0aGUgdHlwZSBhbmQgaHB0eXBlLiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgaW5wdXRfbGluZV9wb2ludGVyICs9IDI7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotdm9pZAotc19kYXRhIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHNlZ1Qgc2VjdGlvbjsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0KLSAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAoZmxhZ19yZWFkb25seV9kYXRhX2luX3RleHQpCi0gICAgewotICAgICAgc2VjdGlvbiA9IHRleHRfc2VjdGlvbjsKLSAgICAgIHRlbXAgKz0gMTAwMDsKLSAgICB9Ci0gIGVsc2UKLSAgICBzZWN0aW9uID0gZGF0YV9zZWN0aW9uOwotCi0gIHN1YnNlZ19zZXQgKHNlY3Rpb24sIChzdWJzZWdUKSB0ZW1wKTsKLQotI2lmZGVmIE9CSl9WTVMKLSAgY29uc3RfZmxhZyA9IDA7Ci0jZW5kaWYKLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuYXBwZmlsZSBwc2V1ZG8tb3AuICBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5Ci0gICBkb19zY3J1Yl9jaGFycyB3aGVuIGEgcHJlcHJvY2Vzc29yICMgbGluZSBjb21tZW50IGlzIHNlZW4gd2l0aCBhCi0gICBmaWxlIG5hbWUuICBUaGlzIGRlZmF1bHQgZGVmaW5pdGlvbiBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgb2JqZWN0Ci0gICBvciBDUFUgc3BlY2lmaWMgcHNldWRvLW9wcy4gIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyB0aGUgZGVmYXVsdAotICAgZGVmaW5pdGlvbiBmb3IgLmZpbGU7IHRoZSBBUFBGSUxFIGFyZ3VtZW50IGlzIDEgZm9yIC5hcHBmaWxlLCAwIGZvcgotICAgLmZpbGUuICAqLwotCi12b2lkIAotc19hcHBfZmlsZSAoYXBwZmlsZSkKLSAgICAgaW50IGFwcGZpbGU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKnM7Ci0gIGludCBsZW5ndGg7Ci0KLSAgLyogU29tZSBhc3NlbWJsZXJzIHRvbGVyYXRlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyAnIicgKi8KLSAgaWYgKChzID0gZGVtYW5kX2NvcHlfc3RyaW5nICgmbGVuZ3RoKSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB0aGlzIGlzIGEgZmFrZSAuYXBwZmlsZSwgYSBmYWtlIG5ld2xpbmUgd2FzIGluc2VydGVkIGludG8KLQkgdGhlIGJ1ZmZlci4gIFBhc3NpbmcgLTIgdG8gbmV3X2xvZ2ljYWxfbGluZSB0ZWxscyBpdCB0bwotCSBhY2NvdW50IGZvciBpdC4gICovCi0gICAgICBpbnQgbWF5X29taXQKLQk9ICghIG5ld19sb2dpY2FsX2xpbmUgKHMsIGFwcGZpbGUgPyAtMiA6IC0xKSAmJiBhcHBmaWxlKTsKLQotICAgICAgLyogSW4gTVJJIG1vZGUsIHRoZSBwcmVwcm9jZXNzb3IgbWF5IGhhdmUgaW5zZXJ0ZWQgYW4gZXh0cmFuZW91cwotICAgICAgICAgYmFja3F1b3RlLiAgKi8KLSAgICAgIGlmIChmbGFnX202OGtfbXJpCi0JICAmJiAqaW5wdXRfbGluZV9wb2ludGVyID09ICdcJycKLQkgICYmIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSBpbnB1dF9saW5lX3BvaW50ZXJbMV1dKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgaWYgKCEgbWF5X29taXQpCi0JewotI2lmZGVmIExJU1RJTkcKLQkgIGlmIChsaXN0aW5nKQotCSAgICBsaXN0aW5nX3NvdXJjZV9maWxlIChzKTsKLSNlbmRpZgotCSAgcmVnaXN0ZXJfZGVwZW5kZW5jeSAocyk7Ci0jaWZkZWYgb2JqX2FwcF9maWxlCi0JICBvYmpfYXBwX2ZpbGUgKHMpOwotI2VuZGlmCi0JfQotICAgIH0KLX0KLQotLyogSGFuZGxlIHRoZSAuYXBwbGluZSBwc2V1ZG8tb3AuICBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5Ci0gICBkb19zY3J1Yl9jaGFycyB3aGVuIGEgcHJlcHJvY2Vzc29yICMgbGluZSBjb21tZW50IGlzIHNlZW4uICBUaGlzCi0gICBkZWZhdWx0IGRlZmluaXRpb24gbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIG9iamVjdCBvciBDUFUgc3BlY2lmaWMKLSAgIHBzZXVkby1vcHMuICAqLwotCi12b2lkCi1zX2FwcF9saW5lIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBsOwotCi0gIC8qIFRoZSBnaXZlbiBudW1iZXIgaXMgdGhhdCBvZiB0aGUgbmV4dCBsaW5lLiAgKi8KLSAgbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpIC0gMTsKLSAgaWYgKGwgPCAwKQotICAgIC8qIFNvbWUgb2YgdGhlIGJhY2sgZW5kcyBjYW4ndCBkZWFsIHdpdGggbm9uLXBvc2l0aXZlIGxpbmUgbnVtYmVycy4KLSAgICAgICBCZXNpZGVzLCBpdCdzIHNpbGx5LiAgKi8KLSAgICBhc193YXJuIChfKCJMaW5lIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZTsgbGluZSBudW1iZXIgJWQgcmVqZWN0ZWQuIiksIGwrMSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBuZXdfbG9naWNhbF9saW5lICgoY2hhciAqKSBOVUxMLCBsKTsKLSNpZmRlZiBMSVNUSU5HCi0gICAgICBpZiAobGlzdGluZykKLQlsaXN0aW5nX3NvdXJjZV9saW5lIChsKTsKLSNlbmRpZgotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuZW5kIHBzZXVkby1vcC4gIEFjdHVhbGx5LCB0aGUgcmVhbCB3b3JrIGlzIGRvbmUgaW4KLSAgIHJlYWRfYV9zb3VyY2VfZmlsZS4gICovCi0KLXZvaWQKLXNfZW5kIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGlmIChmbGFnX21yaSkKLSAgICB7Ci0gICAgICAvKiBUaGUgTVJJIGFzc2VtYmxlciBwZXJtaXRzIHRoZSBzdGFydCBzeW1ib2wgdG8gZm9sbG93IC5lbmQsCi0gICAgICAgICBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0LiAgKi8KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXQotCSAgJiYgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnKicKLQkgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyEnKQotCWFzX3dhcm4gKF8oInN0YXJ0IGFkZHJlc3Mgbm90IHN1cHBvcnRlZCIpKTsKLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLmVyciBwc2V1ZG8tb3AuICAqLwotCi12b2lkCi1zX2VyciAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBhc19iYWQgKF8oIi5lcnIgZW5jb3VudGVyZWQiKSk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIGZhaWwgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19mYWlsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIG9mZnNldFQgdGVtcDsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIGlmICh0ZW1wID49IDUwMCkKLSAgICBhc193YXJuIChfKCIuZmFpbCAlbGQgZW5jb3VudGVyZWQiKSwgKGxvbmcpIHRlbXApOwotICBlbHNlCi0gICAgYXNfYmFkIChfKCIuZmFpbCAlbGQgZW5jb3VudGVyZWQiKSwgKGxvbmcpIHRlbXApOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi12b2lkIAotc19maWxsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGV4cHJlc3Npb25TIHJlcF9leHA7Ci0gIGxvbmcgc2l6ZSA9IDE7Ci0gIHJlZ2lzdGVyIGxvbmcgZmlsbCA9IDA7Ci0gIGNoYXIgKnA7Ci0KLSNpZmRlZiBtZF9mbHVzaF9wZW5kaW5nX291dHB1dAotICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gIGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJnJlcF9leHApOwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBzaXplID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBmaWxsID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JfQotICAgIH0KLQotICAvKiBUaGlzIGlzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBCU0QgNC4yIEFTLCBub3QgZm9yIGFueSByYXRpb25hbCByZWFzb24uICAqLwotI2RlZmluZSBCU0RfRklMTF9TSVpFX0NST0NLXzggKDgpCi0gIGlmIChzaXplID4gQlNEX0ZJTExfU0laRV9DUk9DS184KQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oIi5maWxsIHNpemUgY2xhbXBlZCB0byAlZC4iKSwgQlNEX0ZJTExfU0laRV9DUk9DS184KTsKLSAgICAgIHNpemUgPSBCU0RfRklMTF9TSVpFX0NST0NLXzg7Ci0gICAgfQotICBpZiAoc2l6ZSA8IDApCi0gICAgewotICAgICAgYXNfd2FybiAoXygiU2l6ZSBuZWdhdGl2ZTogLmZpbGwgaWdub3JlZC4iKSk7Ci0gICAgICBzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKHJlcF9leHAuWF9vcCA9PSBPX2NvbnN0YW50ICYmIHJlcF9leHAuWF9hZGRfbnVtYmVyIDw9IDApCi0gICAgewotICAgICAgaWYgKHJlcF9leHAuWF9hZGRfbnVtYmVyIDwgMCkKLQlhc193YXJuIChfKCJSZXBlYXQgPCAwLCAuZmlsbCBpZ25vcmVkIikpOwotICAgICAgc2l6ZSA9IDA7Ci0gICAgfQotCi0gIGlmIChzaXplICYmICFuZWVkX3Bhc3NfMikKLSAgICB7Ci0gICAgICBpZiAocmVwX2V4cC5YX29wID09IE9fY29uc3RhbnQpCi0JewotCSAgcCA9IGZyYWdfdmFyIChyc19maWxsLCAoaW50KSBzaXplLCAoaW50KSBzaXplLAotCQkJKHJlbGF4X3N1YnN0YXRlVCkgMCwgKHN5bWJvbFMgKikgMCwKLQkJCShvZmZzZXRUKSByZXBfZXhwLlhfYWRkX251bWJlciwKLQkJCShjaGFyICopIDApOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBXZSBkb24ndCBoYXZlIGEgY29uc3RhbnQgcmVwZWF0IGNvdW50LCBzbyB3ZSBjYW4ndCB1c2UKLQkgICAgIHJzX2ZpbGwuICBXZSBjYW4gZ2V0IHRoZSBzYW1lIHJlc3VsdHMgb3V0IG9mIHJzX3NwYWNlLAotCSAgICAgYnV0IGl0cyBhcmd1bWVudCBpcyBpbiBieXRlcywgc28gd2UgbXVzdCBtdWx0aXBseSB0aGUKLQkgICAgIHJlcGVhdCBjb3VudCBieSBzaXplLiAgKi8KLQotCSAgc3ltYm9sUyAqcmVwX3N5bTsKLQkgIHJlcF9zeW0gPSBtYWtlX2V4cHJfc3ltYm9sICgmcmVwX2V4cCk7Ci0JICBpZiAoc2l6ZSAhPSAxKQotCSAgICB7Ci0JICAgICAgZXhwcmVzc2lvblMgc2l6ZV9leHA7Ci0JICAgICAgc2l6ZV9leHAuWF9vcCA9IE9fY29uc3RhbnQ7Ci0JICAgICAgc2l6ZV9leHAuWF9hZGRfbnVtYmVyID0gc2l6ZTsKLQotCSAgICAgIHJlcF9leHAuWF9vcCA9IE9fbXVsdGlwbHk7Ci0JICAgICAgcmVwX2V4cC5YX2FkZF9zeW1ib2wgPSByZXBfc3ltOwotCSAgICAgIHJlcF9leHAuWF9vcF9zeW1ib2wgPSBtYWtlX2V4cHJfc3ltYm9sICgmc2l6ZV9leHApOwotCSAgICAgIHJlcF9leHAuWF9hZGRfbnVtYmVyID0gMDsKLQkgICAgICByZXBfc3ltID0gbWFrZV9leHByX3N5bWJvbCAoJnJlcF9leHApOwotCSAgICB9Ci0KLQkgIHAgPSBmcmFnX3ZhciAocnNfc3BhY2UsIChpbnQpIHNpemUsIChpbnQpIHNpemUsCi0JCQkocmVsYXhfc3Vic3RhdGVUKSAwLCByZXBfc3ltLCAob2Zmc2V0VCkgMCwgKGNoYXIgKikgMCk7Ci0JfQotICAgICAgbWVtc2V0IChwLCAwLCAodW5zaWduZWQgaW50KSBzaXplKTsKLSAgICAgIC8qIFRoZSBtYWdpYyBudW1iZXIgQlNEX0ZJTExfU0laRV9DUk9DS180IGlzIGZyb20gQlNEIDQuMiBWQVgKLSAgICAgICAqIGZsYXZvdXJlZCBBUy4gIFRoZSBmb2xsb3dpbmcgYml6emFyZSBiZWhhdmlvdXIgaXMgdG8gYmUKLSAgICAgICAqIGNvbXBhdGlibGUgd2l0aCBhYm92ZS4gIEkgZ3Vlc3MgdGhleSB0cmllZCB0byB0YWtlIHVwIHRvIDgKLSAgICAgICAqIGJ5dGVzIGZyb20gYSA0LWJ5dGUgZXhwcmVzc2lvbiBhbmQgdGhleSBmb3Jnb3QgdG8gc2lnbgotICAgICAgICogZXh0ZW5kLiBVbip4IFN1eC4gKi8KLSNkZWZpbmUgQlNEX0ZJTExfU0laRV9DUk9DS180ICg0KQotICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSBmaWxsLAotCQkJICAoc2l6ZSA+IEJTRF9GSUxMX1NJWkVfQ1JPQ0tfNAotCQkJICAgPyBCU0RfRklMTF9TSVpFX0NST0NLXzQKLQkJCSAgIDogKGludCkgc2l6ZSkpOwotICAgICAgLyogTm90ZTogLmZpbGwgKCksMCBlbWl0cyBubyBmcmFnIChzaW5jZSB3ZSBhcmUgYXNrZWQgdG8gLmZpbGwgMCBieXRlcykKLSAgICAgICAqIGJ1dCBlbWl0cyBubyBlcnJvciBtZXNzYWdlIGJlY2F1c2UgaXQgc2VlbXMgYSBsZWdhbCB0aGluZyB0byBkby4KLSAgICAgICAqIEl0IGlzIGEgZGVnZW5lcmF0ZSBjYXNlIG9mIC5maWxsIGJ1dCBjb3VsZCBiZSBlbWl0dGVkIGJ5IGEgY29tcGlsZXIuCi0gICAgICAgKi8KLSAgICB9Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXZvaWQgCi1zX2dsb2JsIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBjOwotICBzeW1ib2xTICpzeW1ib2xQOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGRvCi0gICAgewotICAgICAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfZmluZF9vcl9tYWtlIChuYW1lKTsKLSAgICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBjID0gKmlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGlmIChjID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0JICAgIGMgPSAnXG4nOwotCX0KLSAgICB9Ci0gIHdoaWxlIChjID09ICcsJyk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgTVJJIElSUCBhbmQgSVJQQyBwc2V1ZG8tb3BzLiAgKi8KLQotdm9pZAotc19pcnAgKGlycGMpCi0gICAgIGludCBpcnBjOwotewotICBjaGFyICpmaWxlOwotICB1bnNpZ25lZCBpbnQgbGluZTsKLSAgc2IgczsKLSAgY29uc3QgY2hhciAqZXJyOwotICBzYiBvdXQ7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgc2JfbmV3ICgmcyk7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICBzYl9hZGRfY2hhciAoJnMsICppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci0KLSAgc2JfbmV3ICgmb3V0KTsKLQotICBlcnIgPSBleHBhbmRfaXJwIChpcnBjLCAwLCAmcywgJm91dCwgZ2V0X2xpbmVfc2IsICdcMCcpOwotICBpZiAoZXJyICE9IE5VTEwpCi0gICAgYXNfYmFkX3doZXJlIChmaWxlLCBsaW5lLCAiJXMiLCBlcnIpOwotCi0gIHNiX2tpbGwgKCZzKTsKLQotICBpbnB1dF9zY3J1Yl9pbmNsdWRlX3NiICgmb3V0LCBpbnB1dF9saW5lX3BvaW50ZXIpOwotICBzYl9raWxsICgmb3V0KTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5saW5rb25jZSBwc2V1ZG8tb3AuICBUaGlzIHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gbWFyawotICAgdGhlIHNlY3Rpb24gdG8gb25seSBiZSBsaW5rZWQgb25jZS4gIEhvd2V2ZXIsIHRoaXMgaXMgbm90IHN1cHBvcnRlZAotICAgYnkgbW9zdCBvYmplY3QgZmlsZSBmb3JtYXRzLiAgVGhpcyB0YWtlcyBhbiBvcHRpb25hbCBhcmd1bWVudCwKLSAgIHdoaWNoIGlzIHdoYXQgdG8gZG8gYWJvdXQgZHVwbGljYXRlcy4gICovCi0KLXZvaWQKLXNfbGlua29uY2UgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgZW51bSBsaW5rb25jZV90eXBlIHR5cGU7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIHR5cGUgPSBMSU5LT05DRV9ESVNDQVJEOwotCi0gIGlmICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotICAgICAgY2hhciBjOwotCi0gICAgICBzID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICAgICAgaWYgKHN0cmNhc2VjbXAgKHMsICJkaXNjYXJkIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfRElTQ0FSRDsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJvbmVfb25seSIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX09ORV9PTkxZOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAocywgInNhbWVfc2l6ZSIpID09IDApCi0JdHlwZSA9IExJTktPTkNFX1NBTUVfU0laRTsKLSAgICAgIGVsc2UgaWYgKHN0cmNhc2VjbXAgKHMsICJzYW1lX2NvbnRlbnRzIikgPT0gMCkKLQl0eXBlID0gTElOS09OQ0VfU0FNRV9DT05URU5UUzsKLSAgICAgIGVsc2UKLQlhc193YXJuIChfKCJ1bnJlY29nbml6ZWQgLmxpbmtvbmNlIHR5cGUgYCVzJyIpLCBzKTsKLQotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgfQotCi0jaWZkZWYgb2JqX2hhbmRsZV9saW5rX29uY2UKLSAgb2JqX2hhbmRsZV9saW5rX29uY2UgKHR5cGUpOwotI2Vsc2UgLyogISBkZWZpbmVkIChvYmpfaGFuZGxlX2xpbmtfb25jZSkgKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIHsKLSAgICBmbGFnd29yZCBmbGFnczsKLQotICAgIGlmICgoYmZkX2FwcGxpY2FibGVfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0KSAmIFNFQ19MSU5LX09OQ0UpID09IDApCi0gICAgICBhc193YXJuIChfKCIubGlua29uY2UgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvYmplY3QgZmlsZSBmb3JtYXQiKSk7Ci0KLSAgICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnKTsKLSAgICBmbGFncyB8PSBTRUNfTElOS19PTkNFOwotICAgIHN3aXRjaCAodHlwZSkKLSAgICAgIHsKLSAgICAgIGRlZmF1bHQ6Ci0JYWJvcnQgKCk7Ci0gICAgICBjYXNlIExJTktPTkNFX0RJU0NBUkQ6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19ESVNDQVJEOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9PTkVfT05MWToKLQlmbGFncyB8PSBTRUNfTElOS19EVVBMSUNBVEVTX09ORV9PTkxZOwotCWJyZWFrOwotICAgICAgY2FzZSBMSU5LT05DRV9TQU1FX1NJWkU6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX1NJWkU7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIExJTktPTkNFX1NBTUVfQ09OVEVOVFM6Ci0JZmxhZ3MgfD0gU0VDX0xJTktfRFVQTElDQVRFU19TQU1FX0NPTlRFTlRTOwotCWJyZWFrOwotICAgICAgfQotICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBub3dfc2VnLCBmbGFncykpCi0gICAgICBhc19iYWQgKF8oImJmZF9zZXRfc2VjdGlvbl9mbGFnczogJXMiKSwKLQkgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gIH0KLSNlbHNlIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLSAgYXNfd2FybiAoXygiLmxpbmtvbmNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb2JqZWN0IGZpbGUgZm9ybWF0IikpOwotI2VuZGlmIC8qICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKG9ial9oYW5kbGVfbGlua19vbmNlKSAqLwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIGJ5dGVzX3ApCi0gICAgIC8qIDEgaWYgdGhpcyB3YXMgYSAiLmJzcyIgZGlyZWN0aXZlLCB3aGljaCBtYXkgcmVxdWlyZSBhIDNyZCBhcmd1bWVudAotCShhbGlnbm1lbnQpOyAwIGlmIGl0IHdhcyBhbiAiLmxjb21tIiAoMiBhcmdzIG9ubHkpICAqLwotICAgICBpbnQgbmVlZHNfYWxpZ247Ci0gICAgIC8qIDEgaWYgdGhlIGFsaWdubWVudCB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdGhlIGJ5dGUgYm91bmRhcnksCi0JcmF0aGVyIHRoYW4gdGhlIHBvd2VyIG9mIDIuICovCi0gICAgIGludCBieXRlc19wOwotewotICByZWdpc3RlciBjaGFyICpuYW1lOwotICByZWdpc3RlciBjaGFyIGM7Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotICBzZWdUIGN1cnJlbnRfc2VnID0gbm93X3NlZzsKLSAgc3Vic2VnVCBjdXJyZW50X3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gIGNvbnN0IGludCBtYXhfYWxpZ25tZW50ID0gMTU7Ci0gIGludCBhbGlnbiA9IDA7Ci0gIHNlZ1QgYnNzX3NlZyA9IGJzc19zZWN0aW9uOwotCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgcCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgKnAgPSBjOwotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0KLSAgLyogQWNjZXB0IGFuIG9wdGlvbmFsIGNvbW1hIGFmdGVyIHRoZSBuYW1lLiAgVGhlIGNvbW1hIHVzZWQgdG8gYmUKLSAgICAgcmVxdWlyZWQsIGJ1dCBJcml4IDUgY2MgZG9lcyBub3QgZ2VuZXJhdGUgaXQuICAqLwotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdcbicpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNaXNzaW5nIHNpemUgZXhwcmVzc2lvbiIpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKCh0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCkpIDwgMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJCU1MgbGVuZ3RoICglZC4pIDwwISBJZ25vcmVkLiIpLCB0ZW1wKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgZGVmaW5lZCAoVENfTUlQUykgfHwgZGVmaW5lZCAoVENfQUxQSEEpCi0gIGlmIChPVVRQVVRfRkxBVk9SID09IGJmZF90YXJnZXRfZWNvZmZfZmxhdm91cgotICAgICAgfHwgT1VUUFVUX0ZMQVZPUiA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotICAgIHsKLSAgICAgIC8qIEZvciBNSVBTIGFuZCBBbHBoYSBFQ09GRiBvciBFTEYsIHNtYWxsIG9iamVjdHMgYXJlIHB1dCBpbiAuc2Jzcy4gICovCi0gICAgICBpZiAodGVtcCA8PSBiZmRfZ2V0X2dwX3NpemUgKHN0ZG91dHB1dCkpCi0JewotCSAgYnNzX3NlZyA9IHN1YnNlZ19uZXcgKCIuc2JzcyIsIDEpOwotCSAgc2VnX2luZm8gKGJzc19zZWcpLT5ic3MgPSAxOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBic3Nfc2VnLCBTRUNfQUxMT0MpKQotCSAgICBhc193YXJuIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIi5zYnNzXCI6ICVzIiksCi0JCSAgICAgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotI2VuZGlmCi0JfQotICAgIH0KLSNlbmRpZgotICAgaWYgKCFuZWVkc19hbGlnbikKLSAgICAgewotICAgICAgIC8qIEZJWE1FLiBUaGlzIG5lZWRzIHRvIGJlIG1hY2hpbmUgaW5kZXBlbmRlbnQuICovCi0gICAgICAgaWYgKHRlbXAgPj0gOCkKLQkgYWxpZ24gPSAzOwotICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gNCkKLQkgYWxpZ24gPSAyOwotICAgICAgIGVsc2UgaWYgKHRlbXAgPj0gMikKLQkgYWxpZ24gPSAxOwotICAgICAgIGVsc2UKLQkgYWxpZ24gPSAwOwotCi0jaWZkZWYgT0JKX0VWQVgKLSAgICAgICAvKiBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBkb25lIGluIGEgbW9yZSBnZW5lcmFsIGZhc2hpb24uICAqLwotICAgICAgIGFsaWduID0gMzsKLSNlbmRpZgotCi0gICAgICAgcmVjb3JkX2FsaWdubWVudChic3Nfc2VnLCBhbGlnbik7Ci0gICAgIH0KLQotICBpZiAobmVlZHNfYWxpZ24pCi0gICAgewotICAgICAgYWxpZ24gPSAwOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgc2l6ZSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXG4nKQotCXsKLQkgIGFzX2JhZCAoXygiTWlzc2luZyBhbGlnbm1lbnQiKSk7Ci0JICByZXR1cm47Ci0JfQotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIGlmIChieXRlc19wKQotCXsKLQkgIC8qIENvbnZlcnQgdG8gYSBwb3dlciBvZiAyLiAgKi8KLQkgIGlmIChhbGlnbiAhPSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGk7Ci0KLQkgICAgICBmb3IgKGkgPSAwOyAoYWxpZ24gJiAxKSA9PSAwOyBhbGlnbiA+Pj0gMSwgKytpKQotCQk7Ci0JICAgICAgaWYgKGFsaWduICE9IDEpCi0JCWFzX2JhZCAoXygiQWxpZ25tZW50IG5vdCBhIHBvd2VyIG9mIDIiKSk7Ci0JICAgICAgYWxpZ24gPSBpOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGFsaWduID4gbWF4X2FsaWdubWVudCkKLQl7Ci0JICBhbGlnbiA9IG1heF9hbGlnbm1lbnQ7Ci0JICBhc193YXJuIChfKCJBbGlnbm1lbnQgdG9vIGxhcmdlOiAlZC4gYXNzdW1lZC4iKSwgYWxpZ24pOwotCX0KLSAgICAgIGVsc2UgaWYgKGFsaWduIDwgMCkKLQl7Ci0JICBhbGlnbiA9IDA7Ci0JICBhc193YXJuIChfKCJBbGlnbm1lbnQgbmVnYXRpdmUuIDAgYXNzdW1lZC4iKSk7Ci0JfQotICAgICAgcmVjb3JkX2FsaWdubWVudCAoYnNzX3NlZywgYWxpZ24pOwotICAgIH0JCQkJLyogaWYgbmVlZHMgYWxpZ24gKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEFzc3VtZSBzb21lIG9iamVjdHMgbWF5IHJlcXVpcmUgYWxpZ25tZW50IG9uIHNvbWUgc3lzdGVtcy4gICovCi0jaWYgZGVmaW5lZCAoVENfQUxQSEEpICYmICEgZGVmaW5lZCAoVk1TKQotICAgICAgaWYgKHRlbXAgPiAxKQotCXsKLQkgIGFsaWduID0gZmZzICh0ZW1wKSAtIDE7Ci0JICBpZiAodGVtcCAlICgxIDw8IGFsaWduKSkKLQkgICAgYWJvcnQgKCk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAqcCA9IGM7Ci0KLSAgaWYgKAotI2lmIGRlZmluZWQoT0JKX0FPVVQpIHwgZGVmaW5lZChPQkpfQk9VVCkKLSAgICAgICBTX0dFVF9PVEhFUiAoc3ltYm9sUCkgPT0gMCAmJgotICAgICAgIFNfR0VUX0RFU0MgKHN5bWJvbFApID09IDAgJiYKLSNlbmRpZiAvKiBPQkpfQU9VVCBvciBPQkpfQk9VVCAqLwotICAgICAgIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBic3Nfc2VnCi0JfHwgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKSkpCi0gICAgewotICAgICAgY2hhciAqcGZyYWc7Ci0KLSAgICAgIHN1YnNlZ19zZXQgKGJzc19zZWcsIDEpOwotCi0gICAgICBpZiAoYWxpZ24pCi0JZnJhZ19hbGlnbiAoYWxpZ24sIDAsIDApOwotCQkJCQkvKiBkZXRhY2ggZnJvbSBvbGQgZnJhZwkqLwotICAgICAgaWYgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWcpCi0Jc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfc3ltYm9sID0gTlVMTDsKLQotICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCBmcmFnX25vdyk7Ci0gICAgICBwZnJhZyA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpMCwgc3ltYm9sUCwKLQkJCShvZmZzZXRUKSB0ZW1wLCAoY2hhciAqKSAwKTsKLSAgICAgICpwZnJhZyA9IDA7Ci0KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIGJzc19zZWcpOwotCi0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIC8qIFRoZSBzeW1ib2wgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBhIHByZWNlZGluZwotICAgICAgICAgIi5nbG9ibCIgZGlyZWN0aXZlIC0tIGJlIGNhcmVmdWwgbm90IHRvIHN0ZXAgb24gc3RvcmFnZSBjbGFzcwotICAgICAgICAgaW4gdGhhdCBjYXNlLiAgT3RoZXJ3aXNlLCBzZXQgaXQgdG8gc3RhdGljLiAqLwotICAgICAgaWYgKFNfR0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFApICE9IENfRVhUKQotCXsKLQkgIFNfU0VUX1NUT1JBR0VfQ0xBU1MgKHN5bWJvbFAsIENfU1RBVCk7Ci0JfQotI2VuZGlmIC8qIE9CSl9DT0ZGICovCi0KLSNpZmRlZiBTX1NFVF9TSVpFCi0gICAgICBTX1NFVF9TSVpFIChzeW1ib2xQLCB0ZW1wKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIGFzX2JhZCAoXygiSWdub3JpbmcgYXR0ZW1wdCB0byByZS1kZWZpbmUgc3ltYm9sIGAlcycuIiksCi0JICAgIFNfR0VUX05BTUUgKHN5bWJvbFApKTsKLQotICBzdWJzZWdfc2V0IChjdXJyZW50X3NlZywgY3VycmVudF9zdWJzZWcpOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfbGNvbW1faW50ZXJuYWwoKSAqLwotCi12b2lkCi1zX2xjb21tIChuZWVkc19hbGlnbikKLSAgICAgaW50IG5lZWRzX2FsaWduOwotewotICBzX2xjb21tX2ludGVybmFsIChuZWVkc19hbGlnbiwgMCk7Ci19Ci0KLXZvaWQgc19sY29tbV9ieXRlcyAobmVlZHNfYWxpZ24pCi0gICAgIGludCBuZWVkc19hbGlnbjsKLXsKLSAgc19sY29tbV9pbnRlcm5hbCAobmVlZHNfYWxpZ24sIDEpOwotfQotCi12b2lkIAotc19sc3ltIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgYzsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qIHdlIHBlcm1pdCBBTlkgZGVmaW5lZCBleHByZXNzaW9uOiBCU0Q0LjIgZGVtYW5kcyBjb25zdGFudHMgKi8KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICpwID0gMDsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGV4cHJlc3Npb24gKCZleHApOwotICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgJiYgZXhwLlhfb3AgIT0gT19yZWdpc3RlcikKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImJhZCBleHByZXNzaW9uIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICpwID0gMDsKLSAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotCi0gIC8qIEZJWE1FLVNPT04gSSBwdWxsZWQgYSAoJiYgc3ltYm9sUC0+c3lfb3RoZXIgPT0gMCAmJgotICAgICBzeW1ib2xQLT5zeV9kZXNjID09IDApIG91dCBvZiB0aGlzIHRlc3QgYmVjYXVzZSBjb2ZmIGRvZXNuJ3QgaGF2ZQotICAgICB0aG9zZSBmaWVsZHMsIGFuZCBJIGNhbid0IHNlZSB3aGVuIHRoZXknZCBldmVyIGJlIHRyaXBwZWQuICBJCi0gICAgIGRvbid0IHRoaW5rIEkgdW5kZXJzdGFuZCB3aHkgdGhleSB3ZXJlIGhlcmUgc28gSSBtYXkgaGF2ZQotICAgICBpbnRyb2R1Y2VkIGEgYnVnLiBBcyByZWNlbnRseSBhcyAxLjM3IGRpZG4ndCBoYXZlIHRoaXMgdGVzdAotICAgICBhbnl3YXkuICB4b3hvcmljaC4gKi8KLQotICBpZiAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLSAgICAgICYmIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIFRoZSBuYW1lIG1pZ2h0IGJlIGFuIHVuZGVmaW5lZCAuZ2xvYmFsIHN5bWJvbDsgYmUgc3VyZSB0bwotCSBrZWVwIHRoZSAiZXh0ZXJuYWwiIGJpdC4gKi8KLSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsCi0JCSAgICAgKGV4cC5YX29wID09IE9fY29uc3RhbnQKLQkJICAgICAgPyBhYnNvbHV0ZV9zZWN0aW9uCi0JCSAgICAgIDogcmVnX3NlY3Rpb24pKTsKLSAgICAgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCAodmFsdWVUKSBleHAuWF9hZGRfbnVtYmVyKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQiKSwgbmFtZSk7Ci0gICAgfQotICAqcCA9IGM7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHNfbHN5bSgpICovCi0KLS8qIFJlYWQgYSBsaW5lIGludG8gYW4gc2IuICAqLwotCi1zdGF0aWMgaW50Ci1nZXRfbGluZV9zYiAobGluZSkKLSAgICAgc2IgKmxpbmU7Ci17Ci0gIGNoYXIgcXVvdGUxLCBxdW90ZTIsIGlucXVvdGU7Ci0KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1xuJykKLSAgICBidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0KLSAgaWYgKGlucHV0X2xpbmVfcG9pbnRlciA+PSBidWZmZXJfbGltaXQpCi0gICAgewotICAgICAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgaWYgKGJ1ZmZlcl9saW1pdCA9PSAwKQotCXJldHVybiAwOwotICAgIH0KLQotICAvKiBJZiBhcHAuYyBzZXRzIGFueSBvdGhlciBjaGFyYWN0ZXJzIHRvIExFWF9JU19TVFJJTkdRVU9URSwgdGhpcwotICAgICBjb2RlIG5lZWRzIHRvIGJlIGNoYW5nZWQuICAqLwotICBpZiAoISBmbGFnX202OGtfbXJpKQotICAgIHF1b3RlMSA9ICciJzsKLSAgZWxzZQotICAgIHF1b3RlMSA9ICdcMCc7Ci0KLSAgcXVvdGUyID0gJ1wwJzsKLSAgaWYgKGZsYWdfbTY4a19tcmkpCi0gICAgcXVvdGUyID0gJ1wnJzsKLSNpZmRlZiBMRVhfSVNfU1RSSU5HUVVPVEUKLSAgcXVvdGUyID0gJ1wnJzsKLSNlbmRpZgotCi0gIGlucXVvdGUgPSAnXDAnOwotICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KLQkgfHwgKGlucXVvdGUgIT0gJ1wwJyAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcbicpKQotICAgIHsKLSAgICAgIGlmIChpbnF1b3RlID09ICppbnB1dF9saW5lX3BvaW50ZXIpCi0JaW5xdW90ZSA9ICdcMCc7Ci0gICAgICBlbHNlIGlmIChpbnF1b3RlID09ICdcMCcpCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gcXVvdGUxKQotCSAgICBpbnF1b3RlID0gcXVvdGUxOwotCSAgZWxzZSBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSBxdW90ZTIpCi0JICAgIGlucXVvdGUgPSBxdW90ZTI7Ci0JfQotICAgICAgc2JfYWRkX2NoYXIgKGxpbmUsICppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci0gICAgfQotICB3aGlsZSAoaW5wdXRfbGluZV9wb2ludGVyIDwgYnVmZmVyX2xpbWl0Ci0JICYmIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9PSAnXG4nKQotCWJ1bXBfbGluZV9jb3VudGVycyAoKTsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlZmluZSBhIG1hY3JvLiAgVGhpcyBpcyBhbiBpbnRlcmZhY2UgdG8gbWFjcm8uYywgd2hpY2ggaXMgc2hhcmVkCi0gICBiZXR3ZWVuIGdhcyBhbmQgZ2FzcC4gICovCi0KLXZvaWQKLXNfbWFjcm8gKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmU7Ci0gIHNiIHM7Ci0gIHNiIGxhYmVsOwotICBjb25zdCBjaGFyICplcnI7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZSk7Ci0KLSAgc2JfbmV3ICgmcyk7Ci0gIHdoaWxlICghIGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICBzYl9hZGRfY2hhciAoJnMsICppbnB1dF9saW5lX3BvaW50ZXIrKyk7Ci0KLSAgc2JfbmV3ICgmbGFiZWwpOwotICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotICAgIHNiX2FkZF9zdHJpbmcgKCZsYWJlbCwgU19HRVRfTkFNRSAobGluZV9sYWJlbCkpOwotCi0gIGVyciA9IGRlZmluZV9tYWNybyAoMCwgJnMsICZsYWJlbCwgZ2V0X2xpbmVfc2IsICZuYW1lKTsKLSAgaWYgKGVyciAhPSBOVUxMKQotICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwgIiVzIiwgZXJyKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JewotCSAgU19TRVRfU0VHTUVOVCAobGluZV9sYWJlbCwgdW5kZWZpbmVkX3NlY3Rpb24pOwotCSAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIDApOwotCSAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCX0KLQotICAgICAgaWYgKCgoZmxhZ19tNjhrX21yaQotI2lmZGVmIE5PX1BTRVVET19ET1QKLQkgICAgfHwgMQotI2VuZGlmCi0JICAgICkKLQkgICAmJiBoYXNoX2ZpbmQgKHBvX2hhc2gsIG5hbWUpICE9IE5VTEwpCi0JICB8fCAoISBmbGFnX202OGtfbXJpCi0JICAgICAgJiYgKm5hbWUgPT0gJy4nCi0JICAgICAgJiYgaGFzaF9maW5kIChwb19oYXNoLCBuYW1lICsgMSkgIT0gTlVMTCkpCi0JYXNfd2FybiAoXygiYXR0ZW1wdCB0byByZWRlZmluZSBwc2V1ZG8tb3AgYCVzJyBpZ25vcmVkIiksCi0JCSBuYW1lKTsKLSAgICB9Ci0KLSAgc2Jfa2lsbCAoJnMpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5tZXhpdCBwc2V1ZG8tb3AsIHdoaWNoIGltbWVkaWF0ZWx5IGV4aXRzIGEgbWFjcm8KLSAgIGV4cGFuc2lvbi4gICovCi0KLXZvaWQKLXNfbWV4aXQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY29uZF9leGl0X21hY3JvIChtYWNyb19uZXN0KTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBTd2l0Y2ggaW4gYW5kIG91dCBvZiBNUkkgbW9kZS4gICovCi0KLXZvaWQKLXNfbXJpIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBvbiwgb2xkX2ZsYWc7Ci0KLSAgb24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgb2xkX2ZsYWcgPSBmbGFnX21yaTsKLSAgaWYgKG9uICE9IDApCi0gICAgewotICAgICAgZmxhZ19tcmkgPSAxOwotI2lmZGVmIFRDX002OEsKLSAgICAgIGZsYWdfbTY4a19tcmkgPSAxOwotI2VuZGlmCi0gICAgICBtYWNyb19tcmlfbW9kZSAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZmxhZ19tcmkgPSAwOwotICAgICAgZmxhZ19tNjhrX21yaSA9IDA7Ci0gICAgICBtYWNyb19tcmlfbW9kZSAoMCk7Ci0gICAgfQotCi0gIC8qIE9wZXJhdG9yIHByZWNlZGVuY2UgY2hhbmdlcyBpbiBtNjhrIE1SSSBtb2RlLCBzbyB3ZSBuZWVkIHRvCi0gICAgIHVwZGF0ZSB0aGUgb3BlcmF0b3IgcmFua2luZ3MuICAqLwotICBleHByX3NldF9wcmVjZWRlbmNlICgpOwotCi0jaWZkZWYgTVJJX01PREVfQ0hBTkdFCi0gIGlmIChvbiAhPSBvbGRfZmxhZykKLSAgICBNUklfTU9ERV9DSEFOR0UgKG9uKTsKLSNlbmRpZgotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSBjaGFuZ2luZyB0aGUgbG9jYXRpb24gY291bnRlci4gICovCi0KLXN0YXRpYyB2b2lkCi1kb19vcmcgKHNlZ21lbnQsIGV4cCwgZmlsbCkKLSAgICAgc2VnVCBzZWdtZW50OwotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICBpbnQgZmlsbDsKLXsKLSAgaWYgKHNlZ21lbnQgIT0gbm93X3NlZyAmJiBzZWdtZW50ICE9IGFic29sdXRlX3NlY3Rpb24pCi0gICAgYXNfYmFkIChfKCJpbnZhbGlkIHNlZ21lbnQgXCIlc1wiOyBzZWdtZW50IFwiJXNcIiBhc3N1bWVkIiksCi0JICAgIHNlZ21lbnRfbmFtZSAoc2VnbWVudCksIHNlZ21lbnRfbmFtZSAobm93X3NlZykpOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgewotICAgICAgaWYgKGZpbGwgIT0gMCkKLQlhc193YXJuIChfKCJpZ25vcmluZyBmaWxsIHZhbHVlIGluIGFic29sdXRlIHNlY3Rpb24iKSk7Ci0gICAgICBpZiAoZXhwLT5YX29wICE9IE9fY29uc3RhbnQpCi0JewotCSAgYXNfYmFkIChfKCJvbmx5IGNvbnN0YW50IG9mZnNldHMgc3VwcG9ydGVkIGluIGFic29sdXRlIHNlY3Rpb24iKSk7Ci0JICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0JfQotICAgICAgYWJzX3NlY3Rpb25fb2Zmc2V0ID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqcDsKLQotICAgICAgcCA9IGZyYWdfdmFyIChyc19vcmcsIDEsIDEsIChyZWxheF9zdWJzdGF0ZVQpIDAsIGV4cC0+WF9hZGRfc3ltYm9sLAotCQkgICAgZXhwLT5YX2FkZF9udW1iZXIsIChjaGFyICopIE5VTEwpOwotICAgICAgKnAgPSBmaWxsOwotICAgIH0KLX0KLQotdm9pZCAKLXNfb3JnIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLSAgZXhwcmVzc2lvblMgZXhwOwotICByZWdpc3RlciBsb25nIHRlbXBfZmlsbDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgLyogVGhlIG02OGsgTVJJIGFzc2VtYmxlciBoYXMgYSBkaWZmZXJlbnQgbWVhbmluZyBmb3IgLm9yZy4gIEl0Ci0gICAgIG1lYW5zIHRvIGNyZWF0ZSBhbiBhYnNvbHV0ZSBzZWN0aW9uIGF0IGEgZ2l2ZW4gYWRkcmVzcy4gIFdlIGNhbid0Ci0gICAgIHN1cHBvcnQgdGhhdC0tdXNlIGEgbGlua2VyIHNjcmlwdCBpbnN0ZWFkLiAgKi8KLSAgaWYgKGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgYXNfYmFkIChfKCJNUkkgc3R5bGUgT1JHIHBzZXVkby1vcCBub3Qgc3VwcG9ydGVkIikpOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgYmVsaWV2ZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBCU0QgNC4yIEFTLiAgVGhlcmUgaXMgbm8gc3VjaAotICAgICB0aGluZyBhcyBhIHN1Yi1zZWdtZW50LXJlbGF0aXZlIG9yaWdpbi4gIEFueSBhYnNvbHV0ZSBvcmlnaW4gaXMKLSAgICAgZ2l2ZW4gYSB3YXJuaW5nLCB0aGVuIGFzc3VtZWQgdG8gYmUgc2VnbWVudC1yZWxhdGl2ZS4gIEFueQotICAgICBzZWdtZW50ZWQgb3JpZ2luIGV4cHJlc3Npb24gKCJmb28rNDIiKSBoYWQgYmV0dGVyIGJlIGluIHRoZSByaWdodAotICAgICBzZWdtZW50IG9yIHRoZSAub3JnIGlzIGlnbm9yZWQuCi0KLSAgICAgQlNEIDQuMiBBUyB3YXJucyBpZiB5b3UgdHJ5IHRvIC5vcmcgYmFja3dhcmRzLiBXZSBjYW5ub3QgYmVjYXVzZQotICAgICB3ZSBuZXZlciBrbm93IHN1Yi1zZWdtZW50IHNpemVzIHdoZW4gd2UgYXJlIHJlYWRpbmcgY29kZS4gIEJTRAotICAgICB3aWxsIGNyYXNoIHRyeWluZyB0byBlbWl0IG5lZ2F0aXZlIG51bWJlcnMgb2YgZmlsbGVyIGJ5dGVzIGluCi0gICAgIGNlcnRhaW4gLm9yZ3MuIFdlIGRvbid0IGNyYXNoLCBidXQgc2VlIGFzLXdyaXRlIGZvciB0aGF0IGNvZGUuCi0KLSAgICAgRG9uJ3QgbWFrZSBmcmFnIGlmIG5lZWRfcGFzc18yPT0xLiAgKi8KLSAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICAgIHRlbXBfZmlsbCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHRlbXBfZmlsbCA9IDA7Ci0KLSAgaWYgKCFuZWVkX3Bhc3NfMikKLSAgICBkb19vcmcgKHNlZ21lbnQsICZleHAsIHRlbXBfZmlsbCk7Ci0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLX0JCQkJLyogc19vcmcoKSAqLwotCi0vKiBIYW5kbGUgcGFyc2luZyBmb3IgdGhlIE1SSSBTRUNUL1NFQ1RJT04gcHNldWRvLW9wLiAgVGhpcyBzaG91bGQgYmUKLSAgIGNhbGxlZCBieSB0aGUgb2JqLWZvcm1hdCByb3V0aW5lIHdoaWNoIGhhbmRsZXMgc2VjdGlvbiBjaGFuZ2luZwotICAgd2hlbiBpbiBNUkkgbW9kZS4gIEl0IHdpbGwgY3JlYXRlIGEgbmV3IHNlY3Rpb24sIGFuZCByZXR1cm4gaXQuICBJdAotICAgd2lsbCBzZXQgKlRZUEUgdG8gdGhlIHNlY3Rpb24gdHlwZTogb25lIG9mICdDJyAoY29kZSksICdEJyAoZGF0YSksCi0gICAnTScgKG1peGVkKSwgb3IgJ1InIChyb21hYmxlKS4gIElmIEJGRF9BU1NFTUJMRVIgaXMgZGVmaW5lZCwgdGhlCi0gICBmbGFncyB3aWxsIGJlIHNldCBpbiB0aGUgc2VjdGlvbi4gICovCi0KLXZvaWQKLXNfbXJpX3NlY3QgKHR5cGUpCi0gICAgIGNoYXIgKnR5cGU7Ci17Ci0jaWZkZWYgVENfTTY4SwotCi0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgc2VnVCBzZWc7Ci0KLSAgU0tJUF9XSElURVNQQUNFICgpOwotICAKLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKSkKLSAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkbwotCXsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcikpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gJ1wwJzsKLSAgICB9Ci0KLSAgbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIHNlZyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICBpbnQgYWxpZ247Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgYWxpZ24gPSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgICAgIHJlY29yZF9hbGlnbm1lbnQgKHNlZywgYWxpZ24pOwotICAgIH0KLQotICAqdHlwZSA9ICdDJzsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIHsKLSAgICAgIGMgPSAqKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gdG91cHBlciAoKHVuc2lnbmVkIGNoYXIpIGMpOwotICAgICAgaWYgKGMgPT0gJ0MnIHx8IGMgPT0gJ0QnIHx8IGMgPT0gJ00nIHx8IGMgPT0gJ1InKQotCSp0eXBlID0gYzsKLSAgICAgIGVsc2UKLQlhc19iYWQgKF8oInVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUiKSk7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHsKLQlmbGFnd29yZCBmbGFnczsKLQotCWZsYWdzID0gU0VDX05PX0ZMQUdTOwotCWlmICgqdHlwZSA9PSAnQycpCi0JICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX1JFQURPTkxZIHwgU0VDX0NPREU7Ci0JZWxzZSBpZiAoKnR5cGUgPT0gJ0QnIHx8ICp0eXBlID09ICdNJykKLQkgIGZsYWdzID0gU0VDX0FMTE9DIHwgU0VDX0xPQUQgfCBTRUNfREFUQTsKLQllbHNlIGlmICgqdHlwZSA9PSAnUicpCi0JICBmbGFncyA9IFNFQ19BTExPQyB8IFNFQ19MT0FEIHwgU0VDX0RBVEEgfCBTRUNfUkVBRE9OTFkgfCBTRUNfUk9NOwotCWlmIChmbGFncyAhPSBTRUNfTk9fRkxBR1MpCi0JICB7Ci0JICAgIGlmICghIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoc3Rkb3V0cHV0LCBzZWcsIGZsYWdzKSkKLQkgICAgICBhc193YXJuIChfKCJlcnJvciBzZXR0aW5nIGZsYWdzIGZvciBcIiVzXCI6ICVzIiksCi0JCSAgICAgICBiZmRfc2VjdGlvbl9uYW1lIChzdGRvdXRwdXQsIHNlZyksCi0JCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0JICB9Ci0gICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogSWdub3JlIHRoZSBIUCB0eXBlLiAgKi8KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlciArPSAyOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSNlbHNlIC8qICEgVENfTTY4SyAqLwotI2lmZGVmIFRDX0k5NjAKLQotICBjaGFyICpuYW1lOwotICBjaGFyIGM7Ci0gIHNlZ1Qgc2VnOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0KLSAgbmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotCi0gICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCi0gIHNlZyA9IHN1YnNlZ19uZXcgKG5hbWUsIDApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICAqdHlwZSA9ICdDJzsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKnNlY3R5cGU7Ci0KLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgc2VjdHlwZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmICgqc2VjdHlwZSA9PSAnXDAnKQotCSp0eXBlID0gJ0MnOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc2VjdHlwZSwgInRleHQiKSA9PSAwKQotCSp0eXBlID0gJ0MnOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc2VjdHlwZSwgImRhdGEiKSA9PSAwKQotCSp0eXBlID0gJ0QnOwotICAgICAgZWxzZSBpZiAoc3RyY2FzZWNtcCAoc2VjdHlwZSwgInJvbWRhdGEiKSA9PSAwKQotCSp0eXBlID0gJ1InOwotICAgICAgZWxzZQotCWFzX3dhcm4gKF8oInVucmVjb2duaXplZCBzZWN0aW9uIHR5cGUgYCVzJyIpLCBzZWN0eXBlKTsKLSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotICAgIH0KLQotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnLCcpCi0gICAgewotICAgICAgY2hhciAqc2VjY21kOwotCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIHNlY2NtZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGMgPSBnZXRfc3ltYm9sX2VuZCAoKTsKLSAgICAgIGlmIChzdHJjYXNlY21wIChzZWNjbWQsICJhYnNvbHV0ZSIpID09IDApCi0JewotCSAgYXNfYmFkIChfKCJhYnNvbHV0ZSBzZWN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBjOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjYXNlY21wIChzZWNjbWQsICJhbGlnbiIpID09IDApCi0JewotCSAgaW50IGFsaWduOwotCi0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQkgIGFsaWduID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0JICByZWNvcmRfYWxpZ25tZW50IChzZWcsIGFsaWduKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYXNfd2FybiAoXygidW5yZWNvZ25pemVkIHNlY3Rpb24gY29tbWFuZCBgJXMnIiksIHNlY2NtZCk7Ci0JICAqaW5wdXRfbGluZV9wb2ludGVyID0gYzsKLQl9Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7CSAgCi0KLSNlbHNlIC8qICEgVENfSTk2MCAqLwotICAvKiBUaGUgTVJJIGFzc2VtYmxlciBzZWVtcyB0byB1c2UgZGlmZmVyZW50IGZvcm1zIG9mIC5zZWN0IGZvcgotICAgICBkaWZmZXJlbnQgdGFyZ2V0cy4gICovCi0gIGFzX2JhZCAoIk1SSSBtb2RlIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgdGFyZ2V0Iik7Ci0gIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0jZW5kaWYgLyogISBUQ19JOTYwICovCi0jZW5kaWYgLyogISBUQ19NNjhLICovCi19Ci0KLS8qIEhhbmRsZSB0aGUgLnByaW50IHBzZXVkby1vcC4gICovCi0KLXZvaWQKLXNfcHJpbnQgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqczsKLSAgaW50IGxlbjsKLQotICBzID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW4pOwotICBwcmludGYgKCIlc1xuIiwgcyk7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnB1cmdlbSBwc2V1ZG8tb3AuICAqLwotCi12b2lkCi1zX3B1cmdlbSAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkbwotICAgIHsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGM7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgICBjID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBkZWxldGVfbWFjcm8gKG5hbWUpOwotICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGM7Ci0gICAgICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gICAgfQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlcisrID09ICcsJyk7Ci0KLSAgLS1pbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19Ci0KLS8qIEhhbmRsZSB0aGUgLnJlcHQgcHNldWRvLW9wLiAgKi8KLQotdm9pZAotc19yZXB0IChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGludCBjb3VudDsKLSAgc2Igb25lOwotICBzYiBtYW55OwotCi0gIGNvdW50ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0KLSAgc2JfbmV3ICgmb25lKTsKLSAgaWYgKCEgYnVmZmVyX2FuZF9uZXN0ICgiUkVQVCIsICJFTkRSIiwgJm9uZSwgZ2V0X2xpbmVfc2IpKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygicmVwdCB3aXRob3V0IGVuZHIiKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIHNiX25ldyAoJm1hbnkpOwotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgc2JfYWRkX3NiICgmbWFueSwgJm9uZSk7Ci0KLSAgc2Jfa2lsbCAoJm9uZSk7Ci0KLSAgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiAoJm1hbnksIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIHNiX2tpbGwgKCZtYW55KTsKLSAgYnVmZmVyX2xpbWl0ID0gaW5wdXRfc2NydWJfbmV4dF9idWZmZXIgKCZpbnB1dF9saW5lX3BvaW50ZXIpOwotfQotCi0vKiBIYW5kbGUgdGhlIC5lcXUsIC5lcXVpdiBhbmQgLnNldCBkaXJlY3RpdmVzLiAgSWYgRVFVSVYgaXMgMSwgdGhlbgotICAgdGhpcyBpcyAuZXF1aXYsIGFuZCBpdCBpcyBhbiBlcnJvciBpZiB0aGUgc3ltYm9sIGlzIGFscmVhZHkKLSAgIGRlZmluZWQuICAqLwotCi12b2lkIAotc19zZXQgKGVxdWl2KQotICAgICBpbnQgZXF1aXY7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm5hbWU7Ci0gIHJlZ2lzdGVyIGNoYXIgZGVsaW07Ci0gIHJlZ2lzdGVyIGNoYXIgKmVuZF9uYW1lOwotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwotCi0gIC8qCi0gICAqIEVzcGVjaWFsIGFwb2xvZ2llcyBmb3IgdGhlIHJhbmRvbSBsb2dpYzoKLSAgICogdGhpcyBqdXN0IGdyZXcsIGFuZCBjb3VsZCBiZSBwYXJzZWQgbXVjaCBtb3JlIHNpbXBseSEKLSAgICogRGVhbiBpbiBoYXN0ZS4KLSAgICovCi0gIG5hbWUgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGRlbGltID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gIGVuZF9uYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqZW5kX25hbWUgPSBkZWxpbTsKLSAgU0tJUF9XSElURVNQQUNFICgpOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICcsJykKLSAgICB7Ci0gICAgICAqZW5kX25hbWUgPSAwOwotICAgICAgYXNfYmFkIChfKCJFeHBlY3RlZCBjb21tYSBhZnRlciBuYW1lIFwiJXNcIiIpLCBuYW1lKTsKLSAgICAgICplbmRfbmFtZSA9IGRlbGltOwotICAgICAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICplbmRfbmFtZSA9IDA7Ci0KLSAgaWYgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBUdXJuICcuID0gbXVtYmxlJyBpbnRvIGEgLm9yZyBtdW1ibGUgKi8KLSAgICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnbWVudDsKLSAgICAgIGV4cHJlc3Npb25TIGV4cDsKLQotICAgICAgc2VnbWVudCA9IGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgICAgIGlmICghbmVlZF9wYXNzXzIpCi0JZG9fb3JnIChzZWdtZW50LCAmZXhwLCAwKTsKLQotICAgICAgKmVuZF9uYW1lID0gZGVsaW07Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChuYW1lKSkgPT0gTlVMTAotICAgICAgJiYgKHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sIChuYW1lKSkgPT0gTlVMTCkKLSAgICB7Ci0jaWZuZGVmIE5PX0xJU1RJTkcKLSAgICAgIC8qIFdoZW4gZG9pbmcgc3ltYm9sIGxpc3RpbmdzLCBwbGF5IGdhbWVzIHdpdGggZHVtbXkgZnJhZ21lbnRzIGxpdmluZwotCSBvdXRzaWRlIHRoZSBub3JtYWwgZnJhZ21lbnQgY2hhaW4gdG8gcmVjb3JkIHRoZSBmaWxlIGFuZCBsaW5lIGluZm8KLSAgICAgICAgIGZvciB0aGlzIHN5bWJvbC4gICovCi0gICAgICBpZiAobGlzdGluZyAmIExJU1RJTkdfU1lNQk9MUykKLQl7Ci0JICBleHRlcm4gc3RydWN0IGxpc3RfaW5mb19zdHJ1Y3QgKmxpc3RpbmdfdGFpbDsKLQkgIGZyYWdTICpkdW1teV9mcmFnID0gKGZyYWdTICopIHhtYWxsb2MgKHNpemVvZihmcmFnUykpOwotCSAgbWVtc2V0IChkdW1teV9mcmFnLCAwLCBzaXplb2YoZnJhZ1MpKTsKLQkgIGR1bW15X2ZyYWctPmZyX3R5cGUgPSByc19maWxsOwotCSAgZHVtbXlfZnJhZy0+bGluZSA9IGxpc3RpbmdfdGFpbDsKLQkgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChuYW1lLCB1bmRlZmluZWRfc2VjdGlvbiwgMCwgZHVtbXlfZnJhZyk7Ci0JICBkdW1teV9mcmFnLT5mcl9zeW1ib2wgPSBzeW1ib2xQOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICBzeW1ib2xQID0gc3ltYm9sX25ldyAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JCQkgICAgCi0jaWZkZWYgT0JKX0NPRkYKLSAgICAgIC8qICJzZXQiIHN5bWJvbHMgYXJlIGxvY2FsIHVubGVzcyBvdGhlcndpc2Ugc3BlY2lmaWVkLiAqLwotICAgICAgU0ZfU0VUX0xPQ0FMIChzeW1ib2xQKTsKLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCi0gICAgfQkJCQkvKiBtYWtlIGEgbmV3IHN5bWJvbCAqLwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHN5bWJvbFApOwotCi0gICplbmRfbmFtZSA9IGRlbGltOwotCi0gIGlmIChlcXVpdgotICAgICAgJiYgU19JU19ERUZJTkVEIChzeW1ib2xQKQotICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgIT0gcmVnX3NlY3Rpb24pCi0gICAgYXNfYmFkIChfKCJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotCi0gIHBzZXVkb19zZXQgKHN5bWJvbFApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX3NldCgpICovCi0KLXZvaWQgCi1zX3NwYWNlIChtdWx0KQotICAgICBpbnQgbXVsdDsKLXsKLSAgZXhwcmVzc2lvblMgZXhwOwotICBleHByZXNzaW9uUyB2YWw7Ci0gIGNoYXIgKnAgPSAwOwotICBjaGFyICpzdG9wID0gTlVMTDsKLSAgY2hhciBzdG9wYzsKLSAgaW50IGJ5dGVzOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIC8qIEluIG02OGsgTVJJIG1vZGUsIHdlIG5lZWQgdG8gYWxpZ24gdG8gYSB3b3JkIGJvdW5kYXJ5LCB1bmxlc3MKLSAgICAgdGhpcyBpcyBkcy5iLiAgKi8KLSAgaWYgKGZsYWdfbTY4a19tcmkgJiYgbXVsdCA+IDEpCi0gICAgewotICAgICAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQl7Ci0JICBhYnNfc2VjdGlvbl9vZmZzZXQgKz0gYWJzX3NlY3Rpb25fb2Zmc2V0ICYgMTsKLQkgIGlmIChsaW5lX2xhYmVsICE9IE5VTEwpCi0JICAgIFNfU0VUX1ZBTFVFIChsaW5lX2xhYmVsLCBhYnNfc2VjdGlvbl9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UgaWYgKG1yaV9jb21tb25fc3ltYm9sICE9IE5VTEwpCi0JewotCSAgdmFsdWVUIHZhbDsKLQotCSAgdmFsID0gU19HRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sKTsKLQkgIGlmICgodmFsICYgMSkgIT0gMCkKLQkgICAgewotCSAgICAgIFNfU0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCwgdmFsICsgMSk7Ci0JICAgICAgaWYgKGxpbmVfbGFiZWwgIT0gTlVMTCkKLQkJewotCQkgIGV4cHJlc3Npb25TICpzeW1leHA7Ci0KLQkJICBzeW1leHAgPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGxpbmVfbGFiZWwpOwotCQkgIGtub3cgKHN5bWV4cC0+WF9vcCA9PSBPX3N5bWJvbCk7Ci0JCSAga25vdyAoc3ltZXhwLT5YX2FkZF9zeW1ib2wgPT0gbXJpX2NvbW1vbl9zeW1ib2wpOwotCQkgIHN5bWV4cC0+WF9hZGRfbnVtYmVyICs9IDE7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBkb19hbGlnbiAoMSwgKGNoYXIgKikgTlVMTCwgMCwgMCk7Ci0JICBpZiAobGluZV9sYWJlbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3NldF9mcmFnIChsaW5lX2xhYmVsLCBmcmFnX25vdyk7Ci0JICAgICAgU19TRVRfVkFMVUUgKGxpbmVfbGFiZWwsIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGJ5dGVzID0gbXVsdDsKLQotICBleHByZXNzaW9uICgmZXhwKTsKLQotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLSAgICB7Ci0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGV4cHJlc3Npb24gKCZ2YWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHZhbC5YX29wID0gT19jb25zdGFudDsKLSAgICAgIHZhbC5YX2FkZF9udW1iZXIgPSAwOwotICAgIH0KLQotICBpZiAodmFsLlhfb3AgIT0gT19jb25zdGFudAotICAgICAgfHwgdmFsLlhfYWRkX251bWJlciA8IC0gMHg4MAotICAgICAgfHwgdmFsLlhfYWRkX251bWJlciA+IDB4ZmYKLSAgICAgIHx8IChtdWx0ICE9IDAgJiYgbXVsdCAhPSAxICYmIHZhbC5YX2FkZF9udW1iZXIgIT0gMCkpCi0gICAgewotICAgICAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0JYXNfYmFkIChfKCJVbnN1cHBvcnRlZCB2YXJpYWJsZSBzaXplIG9yIGZpbGwgdmFsdWUiKSk7Ci0gICAgICBlbHNlCi0JewotCSAgb2Zmc2V0VCBpOwotCi0JICBpZiAobXVsdCA9PSAwKQotCSAgICBtdWx0ID0gMTsKLQkgIGJ5dGVzID0gbXVsdCAqIGV4cC5YX2FkZF9udW1iZXI7Ci0JICBmb3IgKGkgPSAwOyBpIDwgZXhwLlhfYWRkX251bWJlcjsgaSsrKQotCSAgICBlbWl0X2V4cHIgKCZ2YWwsIG11bHQpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXhwLlhfb3AgPT0gT19jb25zdGFudCkKLQl7Ci0JICBsb25nIHJlcGVhdDsKLQotCSAgcmVwZWF0ID0gZXhwLlhfYWRkX251bWJlcjsKLQkgIGlmIChtdWx0KQotCSAgICByZXBlYXQgKj0gbXVsdDsKLQkgIGJ5dGVzID0gcmVwZWF0OwotCSAgaWYgKHJlcGVhdCA8PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKCEgZmxhZ19tcmkpCi0JCWFzX3dhcm4gKF8oIi5zcGFjZSByZXBlYXQgY291bnQgaXMgemVybywgaWdub3JlZCIpKTsKLQkgICAgICBlbHNlIGlmIChyZXBlYXQgPCAwKQotCQlhc193YXJuIChfKCIuc3BhY2UgcmVwZWF0IGNvdW50IGlzIG5lZ2F0aXZlLCBpZ25vcmVkIikpOwotCSAgICAgIGdvdG8gZ2V0b3V0OwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGFyZSBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbiwganVzdCBidW1wIHRoZSBvZmZzZXQuICAqLwotCSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGFic19zZWN0aW9uX29mZnNldCArPSByZXBlYXQ7Ci0JICAgICAgZ290byBnZXRvdXQ7Ci0JICAgIH0KLQotCSAgLyogSWYgd2UgYXJlIHNlY3JldGx5IGluIGFuIE1SSSBjb21tb24gc2VjdGlvbiwgdGhlbgotCSAgICAgY3JlYXRpbmcgc3BhY2UganVzdCBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIGNvbW1vbgotCSAgICAgc3ltYm9sLiAgKi8KLQkgIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgU19TRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sLAotCQkJICAgU19HRVRfVkFMVUUgKG1yaV9jb21tb25fc3ltYm9sKSArIHJlcGVhdCk7Ci0JICAgICAgZ290byBnZXRvdXQ7Ci0JICAgIH0KLQotCSAgaWYgKCFuZWVkX3Bhc3NfMikKLQkgICAgcCA9IGZyYWdfdmFyIChyc19maWxsLCAxLCAxLCAocmVsYXhfc3Vic3RhdGVUKSAwLCAoc3ltYm9sUyAqKSAwLAotCQkJICAob2Zmc2V0VCkgcmVwZWF0LCAoY2hhciAqKSAwKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygic3BhY2UgYWxsb2NhdGlvbiB0b28gY29tcGxleCBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotCSAgICAgIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgMCk7Ci0JICAgIH0KLQkgIGlmIChtcmlfY29tbW9uX3N5bWJvbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYXNfYmFkIChfKCJzcGFjZSBhbGxvY2F0aW9uIHRvbyBjb21wbGV4IGluIGNvbW1vbiBzZWN0aW9uIikpOwotCSAgICAgIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLQkgICAgfQotCSAgaWYgKCFuZWVkX3Bhc3NfMikKLQkgICAgcCA9IGZyYWdfdmFyIChyc19zcGFjZSwgMSwgMSwgKHJlbGF4X3N1YnN0YXRlVCkgMCwKLQkJCSAgbWFrZV9leHByX3N5bWJvbCAoJmV4cCksIChvZmZzZXRUKSAwLCAoY2hhciAqKSAwKTsKLQl9Ci0KLSAgICAgIGlmIChwKQotCSpwID0gdmFsLlhfYWRkX251bWJlcjsKLSAgICB9Ci0KLSBnZXRvdXQ6Ci0KLSAgLyogSW4gTVJJIG1vZGUsIGFmdGVyIGFuIG9kZCBudW1iZXIgb2YgYnl0ZXMsIHdlIG11c3QgYWxpZ24gdG8gYW4KLSAgICAgZXZlbiB3b3JkIGJvdW5kYXJ5LCB1bmxlc3MgdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYSBkYy5iLCBkcy5iCi0gICAgIG9yIGRjYi5iLiAgKi8KLSAgaWYgKGZsYWdfbXJpICYmIChieXRlcyAmIDEpICE9IDApCi0gICAgbXJpX3BlbmRpbmdfYWxpZ24gPSAxOwotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIG1yaV9jb21tZW50X2VuZCAoc3RvcCwgc3RvcGMpOwotfQotCi0vKiBUaGlzIGlzIGxpa2Ugc19zcGFjZSwgYnV0IHRoZSB2YWx1ZSBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoCi0gICB0aGUgZ2l2ZW4gcHJlY2lzaW9uLiAgVGhpcyBpcyBmb3IgdGhlIE1SSSBkY2IucyBwc2V1ZG8tb3AgYW5kCi0gICBmcmllbmRzLiAgKi8KLQotdm9pZAotc19mbG9hdF9zcGFjZSAoZmxvYXRfdHlwZSkKLSAgICAgaW50IGZsb2F0X3R5cGU7Ci17Ci0gIG9mZnNldFQgY291bnQ7Ci0gIGludCBmbGVuOwotICBjaGFyIHRlbXBbTUFYSU1VTV9OVU1CRVJfT0ZfQ0hBUlNfRk9SX0ZMT0FUXTsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLQotICBjb3VudCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygibWlzc2luZyB2YWx1ZSIpKTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotCi0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAvKiBTa2lwIGFueSAwe2xldHRlcn0gdGhhdCBtYXkgYmUgcHJlc2VudC4gIERvbid0IGV2ZW4gY2hlY2sgaWYgdGhlCi0gICAqIGxldHRlciBpcyBsZWdhbC4gICovCi0gIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnCi0gICAgICAmJiBpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICAvKiBBY2NlcHQgOnh4eHgsIHdoZXJlIHRoZSB4J3MgYXJlIGhleCBkaWdpdHMsIGZvciBhIGZsb2F0aW5nIHBvaW50Ci0gICAgIHdpdGggdGhlIGV4YWN0IGRpZ2l0cyBzcGVjaWZpZWQuICAqLwotICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICc6JykKLSAgICB7Ci0gICAgICBmbGVuID0gaGV4X2Zsb2F0IChmbG9hdF90eXBlLCB0ZW1wKTsKLSAgICAgIGlmIChmbGVuIDwgMCkKLQl7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgaWYgKGZsYWdfbXJpKQotCSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqZXJyOwotCi0gICAgICBlcnIgPSBtZF9hdG9mIChmbG9hdF90eXBlLCB0ZW1wLCAmZmxlbik7Ci0gICAgICBrbm93IChmbGVuIDw9IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCk7Ci0gICAgICBrbm93IChmbGVuID4gMCk7Ci0gICAgICBpZiAoZXJyKQotCXsKLQkgIGFzX2JhZCAoXygiQmFkIGZsb2F0aW5nIGxpdGVyYWw6ICVzIiksIGVycik7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgaWYgKGZsYWdfbXJpKQotCSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIHdoaWxlICgtLWNvdW50ID49IDApCi0gICAgewotICAgICAgY2hhciAqcDsKLQotICAgICAgcCA9IGZyYWdfbW9yZSAoZmxlbik7Ci0gICAgICBtZW1jcHkgKHAsIHRlbXAsICh1bnNpZ25lZCBpbnQpIGZsZW4pOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotLyogSGFuZGxlIHRoZSAuc3RydWN0IHBzZXVkby1vcCwgYXMgZm91bmQgaW4gTUlQUyBhc3NlbWJsZXJzLiAgKi8KLQotdm9pZAotc19zdHJ1Y3QgKGlnbm9yZSkKLSAgICAgaW50IGlnbm9yZTsKLXsKLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaWYgKGZsYWdfbXJpKQotICAgIHN0b3AgPSBtcmlfY29tbWVudF9maWVsZCAoJnN0b3BjKTsKLSAgYWJzX3NlY3Rpb25fb2Zmc2V0ID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKGFic29sdXRlX3NlY3Rpb24sIDApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotICBpZiAoZmxhZ19tcmkpCi0gICAgbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci19Ci0KLXZvaWQKLXNfdGV4dCAoaWdub3JlKQotICAgICBpbnQgaWdub3JlOwotewotICByZWdpc3RlciBpbnQgdGVtcDsKLQotICB0ZW1wID0gZ2V0X2Fic29sdXRlX2V4cHJlc3Npb24gKCk7Ci0gIHN1YnNlZ19zZXQgKHRleHRfc2VjdGlvbiwgKHN1YnNlZ1QpIHRlbXApOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotI2lmZGVmIE9CSl9WTVMKLSAgY29uc3RfZmxhZyAmPSB+SU5fREVGQVVMVF9TRUNUSU9OOwotI2VuZGlmCi19CQkJCS8qIHNfdGV4dCgpICovCi0MCi0KLXZvaWQgCi1kZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpCi17Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKGlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgLyogUmV0dXJuIGhhdmluZyBhbHJlYWR5IHN3YWxsb3dlZCBlbmQtb2YtbGluZS4gKi8KLX0JCQkJLyogUmV0dXJuIHBvaW50aW5nIGp1c3QgYWZ0ZXIgZW5kLW9mLWxpbmUuICovCi0KLXZvaWQKLWlnbm9yZV9yZXN0X29mX2xpbmUgKCkJCS8qIEZvciBzdXNwZWN0IGxpbmVzOiBnaXZlcyB3YXJuaW5nLiAqLwotewotICBpZiAoIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpZiAoaXNwcmludCAoKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXIpKQotCWFzX2JhZCAoXygiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIGlzIGAlYycuIiksCi0JCSppbnB1dF9saW5lX3BvaW50ZXIpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiUmVzdCBvZiBsaW5lIGlnbm9yZWQuIEZpcnN0IGlnbm9yZWQgY2hhcmFjdGVyIHZhbHVlZCAweCV4LiIpLAotCQkqaW5wdXRfbGluZV9wb2ludGVyKTsKLSAgICAgIHdoaWxlIChpbnB1dF9saW5lX3BvaW50ZXIgPCBidWZmZXJfbGltaXQKLQkgICAgICYmICFpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0pCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JfQotICAgIH0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7CQkvKiBSZXR1cm4gcG9pbnRpbmcganVzdCBhZnRlciBlbmQtb2YtbGluZS4gKi8KLSAga25vdyAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpIGlucHV0X2xpbmVfcG9pbnRlclstMV1dKTsKLX0KLQotdm9pZAotZGlzY2FyZF9yZXN0X29mX2xpbmUgKCkKLXsKLSAgd2hpbGUgKGlucHV0X2xpbmVfcG9pbnRlciA8IGJ1ZmZlcl9saW1pdAotICAgICAgICAgJiYgIWlzX2VuZF9vZl9saW5lWyh1bnNpZ25lZCBjaGFyKSAqaW5wdXRfbGluZV9wb2ludGVyXSkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlcisrOyAgICAgICAgIC8qIFJldHVybiBwb2ludGluZyBqdXN0IGFmdGVyIGVuZC1vZi1saW5lLiAqLwotICBrbm93IChpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWy0xXV0pOwotfQotCi0vKgotICoJCQlwc2V1ZG9fc2V0KCkKLSAqCi0gKiBJbjoJUG9pbnRlciB0byBhIHN5bWJvbC4KLSAqCUlucHV0X2xpbmVfcG9pbnRlci0+ZXhwcmVzc2lvbi4KLSAqCi0gKiBPdXQ6CUlucHV0X2xpbmVfcG9pbnRlci0+anVzdCBhZnRlciBhbnkgd2hpdGVzcGFjZSBhZnRlciBleHByZXNzaW9uLgotICoJVHJpZWQgdG8gc2V0IHN5bWJvbCB0byB2YWx1ZSBvZiBleHByZXNzaW9uLgotICoJV2lsbCBjaGFuZ2Ugc3ltYm9scyB0eXBlLCB2YWx1ZSwgYW5kIGZyYWc7Ci0gKi8KLXZvaWQKLXBzZXVkb19zZXQgKHN5bWJvbFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLSNpZiAoZGVmaW5lZCAoT0JKX0FPVVQpIHx8IGRlZmluZWQgKE9CSl9CT1VUKSkgJiYgISBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBpbnQgZXh0OwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0KLSAga25vdyAoc3ltYm9sUCk7CQkvKiBOVUxMIHBvaW50ZXIgaXMgbG9naWMgZXJyb3IuICovCi0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgZXh0ID0gU19JU19FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQotICAodm9pZCkgZXhwcmVzc2lvbiAoJmV4cCk7Ci0KLSAgaWYgKGV4cC5YX29wID09IE9faWxsZWdhbCkKLSAgICBhc19iYWQgKF8oImlsbGVnYWwgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2Fic2VudCkKLSAgICBhc19iYWQgKF8oIm1pc3NpbmcgZXhwcmVzc2lvbjsgemVybyBhc3N1bWVkIikpOwotICBlbHNlIGlmIChleHAuWF9vcCA9PSBPX2JpZykKLSAgICB7Ci0gICAgICBpZiAoZXhwLlhfYWRkX251bWJlciA+IDApCi0JYXNfYmFkIChfKCJiaWdudW0gaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgZWxzZQotCWFzX2JhZCAoXygiZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGludmFsaWQ7IHplcm8gYXNzdW1lZCIpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGV4cC5YX29wID09IE9fc3VidHJhY3QKLQkgICAmJiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkKLQkgICAgICAgPT0gU19HRVRfU0VHTUVOVCAoZXhwLlhfb3Bfc3ltYm9sKSkKLQkgICAmJiBTRUdfTk9STUFMIChTX0dFVF9TRUdNRU5UIChleHAuWF9hZGRfc3ltYm9sKSkKLQkgICAmJiAoc3ltYm9sX2dldF9mcmFnIChleHAuWF9hZGRfc3ltYm9sKQotCSAgICAgICA9PSBzeW1ib2xfZ2V0X2ZyYWcgKGV4cC5YX29wX3N5bWJvbCkpKQotICAgIHsKLSAgICAgIGV4cC5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAoU19HRVRfVkFMVUUgKGV4cC5YX2FkZF9zeW1ib2wpCi0JCQkgIC0gU19HRVRfVkFMVUUgKGV4cC5YX29wX3N5bWJvbCkpOwotICAgIH0KLQotICBzd2l0Y2ggKGV4cC5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICBjYXNlIE9fYWJzZW50OgotICAgIGNhc2UgT19iaWc6Ci0gICAgICBleHAuWF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgYWJzb2x1dGVfc2VjdGlvbik7Ci0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgICAgIGlmIChleHQpCi0JU19TRVRfRVhURVJOQUwgKHN5bWJvbFApOwotICAgICAgZWxzZQotCVNfQ0xFQVJfRVhURVJOQUwgKHN5bWJvbFApOwotI2VuZGlmIC8qIE9CSl9BT1VUIG9yIE9CSl9CT1VUICovCi0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgICBpZiAoZXhwLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICAgICAgc3ltYm9sX3NldF9mcmFnIChzeW1ib2xQLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fcmVnaXN0ZXI6Ci0gICAgICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCByZWdfc2VjdGlvbik7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltYm9sUCwgKHZhbHVlVCkgZXhwLlhfYWRkX251bWJlcik7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT19zeW1ib2w6Ci0gICAgICBpZiAoU19HRVRfU0VHTUVOVCAoZXhwLlhfYWRkX3N5bWJvbCkgPT0gdW5kZWZpbmVkX3NlY3Rpb24KLQkgIHx8IGV4cC5YX2FkZF9udW1iZXIgIT0gMCkKLQlzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsICZleHApOwotICAgICAgZWxzZQotCXsKLQkgIHN5bWJvbFMgKnMgPSBleHAuWF9hZGRfc3ltYm9sOwotCi0JICBTX1NFVF9TRUdNRU5UIChzeW1ib2xQLCBTX0dFVF9TRUdNRU5UIChzKSk7Ci0jaWYgKGRlZmluZWQgKE9CSl9BT1VUKSB8fCBkZWZpbmVkIChPQkpfQk9VVCkpICYmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLQkgIGlmIChleHQpCi0JICAgIFNfU0VUX0VYVEVSTkFMIChzeW1ib2xQKTsKLQkgIGVsc2UKLQkgICAgU19DTEVBUl9FWFRFUk5BTCAoc3ltYm9sUCk7Ci0jZW5kaWYgLyogT0JKX0FPVVQgb3IgT0JKX0JPVVQgKi8KLQkgIFNfU0VUX1ZBTFVFIChzeW1ib2xQLAotCQkgICAgICAgZXhwLlhfYWRkX251bWJlciArIFNfR0VUX1ZBTFVFIChzKSk7Ci0JICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbFAsIHN5bWJvbF9nZXRfZnJhZyAocykpOwotCSAgY29weV9zeW1ib2xfYXR0cmlidXRlcyAoc3ltYm9sUCwgcyk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogVGhlIHZhbHVlIGlzIHNvbWUgY29tcGxleCBleHByZXNzaW9uLgotCSBGSVhNRTogU2hvdWxkIHdlIHNldCB0aGUgc2VnbWVudCB0byBhbnl0aGluZz8gICovCi0gICAgICBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gKHN5bWJvbFAsICZleHApOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotDAotLyoKLSAqCQkJY29ucygpCi0gKgotICogQ09OU3RydWN0IG1vcmUgZnJhZyBvZiAuYnl0ZXMsIG9yIC53b3JkcyBldGMuCi0gKiBTaG91bGQgbmVlZF9wYXNzXzIgYmUgMSB0aGVuIGVtaXQgbm8gZnJhZyhzKS4KLSAqIFRoaXMgdW5kZXJzdGFuZHMgRVhQUkVTU0lPTlMuCi0gKgotICogQnVnICg/KQotICoKLSAqIFRoaXMgaGFzIGEgc3BsaXQgcGVyc29uYWxpdHkuIFdlIHVzZSBleHByZXNzaW9uKCkgdG8gcmVhZCB0aGUKLSAqIHZhbHVlLiBXZSBjYW4gZGV0ZWN0IGlmIHRoZSB2YWx1ZSB3b24ndCBmaXQgaW4gYSBieXRlIG9yIHdvcmQuCi0gKiBCdXQgd2UgY2FuJ3QgZGV0ZWN0IGlmIGV4cHJlc3Npb24oKSBkaXNjYXJkZWQgc2lnbmlmaWNhbnQgZGlnaXRzCi0gKiBpbiB0aGUgY2FzZSBvZiBhIGxvbmcuIE5vdCB3b3J0aCB0aGUgY3JvY2tzIHJlcXVpcmVkIHRvIGZpeCBpdC4KLSAqLwotCi0vKiBTZWxlY3QgYSBwYXJzZXIgZm9yIGNvbnMgZXhwcmVzc2lvbnMuICAqLwotCi0vKiBTb21lIHRhcmdldHMgbmVlZCB0byBwYXJzZSB0aGUgZXhwcmVzc2lvbiBpbiB2YXJpb3VzIGZhbmN5IHdheXMuCi0gICBZb3UgY2FuIGRlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04gdG8gZG8gd2hhdGV2ZXIgeW91IGxpa2UKLSAgIChmb3IgZXhhbXBsZSwgdGhlIEhQUEEgZG9lcyB0aGlzKS4gIE90aGVyd2lzZSwgeW91IGNhbiBkZWZpbmUKLSAgIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMgdG8gcGVybWl0IGJpdGZpZWxkcyB0byBiZSBzcGVjaWZpZWQsIG9yCi0gICBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUyB0byBwZXJtaXQgcmVwZWF0IGNvdW50cy4gIElmIG5vbmUgb2YgdGhlc2UKLSAgIGFyZSBkZWZpbmVkLCB3aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZW4gb25seSBzaW1wbGUgZXhwcmVzc2lvbnMKLSAgIGFyZSBwZXJtaXR0ZWQuICAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnMgUEFSQU1TICgoZXhwcmVzc2lvblMgKmV4cCwgdW5zaWduZWQgaW50IG5ieXRlcykpOwotCi0jaWZuZGVmIFRDX1BBUlNFX0NPTlNfRVhQUkVTU0lPTgotI2lmZGVmIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMKLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBwYXJzZV9iaXRmaWVsZF9jb25zIChFWFAsIE5CWVRFUykKLXN0YXRpYyB2b2lkIAotcGFyc2VfYml0ZmllbGRfY29ucyBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7Ci0jZW5kaWYKLSNpZmRlZiBSRVBFQVRfQ09OU19FWFBSRVNTSU9OUwotI2RlZmluZSBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04oRVhQLCBOQllURVMpIHBhcnNlX3JlcGVhdF9jb25zIChFWFAsIE5CWVRFUykKLXN0YXRpYyB2b2lkCi1wYXJzZV9yZXBlYXRfY29ucyBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7Ci0jZW5kaWYKLQotLyogSWYgd2UgaGF2ZW4ndCBnb3R0ZW4gb25lIHlldCwganVzdCBjYWxsIGV4cHJlc3Npb24uICAqLwotI2lmbmRlZiBUQ19QQVJTRV9DT05TX0VYUFJFU1NJT04KLSNkZWZpbmUgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OKEVYUCwgTkJZVEVTKSBleHByZXNzaW9uIChFWFApCi0jZW5kaWYKLSNlbmRpZgotCi0vKiB3b3JrZXIgdG8gZG8gLmJ5dGUgZXRjIHN0YXRlbWVudHMgKi8KLS8qIGNsb2JiZXJzIGlucHV0X2xpbmVfcG9pbnRlciwgY2hlY2tzICovCi0vKiBlbmQtb2YtbGluZS4gKi8KLXN0YXRpYyB2b2lkIAotY29uc193b3JrZXIgKG5ieXRlcywgcnZhKQotICAgICByZWdpc3RlciBpbnQgbmJ5dGVzOwkvKiAxPS5ieXRlLCAyPS53b3JkLCA0PS5sb25nICovCi0gICAgIGludCBydmE7Ci17Ci0gIGludCBjOwotICBleHByZXNzaW9uUyBleHA7Ci0gIGNoYXIgKnN0b3AgPSBOVUxMOwotICBjaGFyIHN0b3BjOwotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBpZiAoZmxhZ19tcmkpCi0gICAgc3RvcCA9IG1yaV9jb21tZW50X2ZpZWxkICgmc3RvcGMpOwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICBpZiAoZmxhZ19tcmkpCi0JbXJpX2NvbW1lbnRfZW5kIChzdG9wLCBzdG9wYyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgbWRfY29uc19hbGlnbgotICBtZF9jb25zX2FsaWduIChuYnl0ZXMpOwotI2VuZGlmCi0KLSAgYyA9IDA7Ci0gIGRvCi0gICAgewotICAgICAgaWYgKGZsYWdfbTY4a19tcmkpCi0JcGFyc2VfbXJpX2NvbnMgKCZleHAsICh1bnNpZ25lZCBpbnQpIG5ieXRlcyk7Ci0gICAgICBlbHNlCi0JVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotCi0gICAgICBpZiAocnZhKQotCXsKLQkgIGlmIChleHAuWF9vcCA9PSBPX3N5bWJvbCkKLQkgICAgZXhwLlhfb3AgPSBPX3N5bWJvbF9ydmE7Ci0JICBlbHNlCi0JICAgIGFzX2ZhdGFsIChfKCJydmEgd2l0aG91dCBzeW1ib2wiKSk7Ci0JfQotICAgICAgZW1pdF9leHByICgmZXhwLCAodW5zaWduZWQgaW50KSBuYnl0ZXMpOwotICAgICAgKytjOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIC8qIEluIE1SSSBtb2RlLCBhZnRlciBhbiBvZGQgbnVtYmVyIG9mIGJ5dGVzLCB3ZSBtdXN0IGFsaWduIHRvIGFuCi0gICAgIGV2ZW4gd29yZCBib3VuZGFyeSwgdW5sZXNzIHRoZSBuZXh0IGluc3RydWN0aW9uIGlzIGEgZGMuYiwgZHMuYgotICAgICBvciBkY2IuYi4gICovCi0gIGlmIChmbGFnX21yaSAmJiBuYnl0ZXMgPT0gMSAmJiAoYyAmIDEpICE9IDApCi0gICAgbXJpX3BlbmRpbmdfYWxpZ24gPSAxOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gKi8KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLX0KLQotCi12b2lkCi1jb25zIChzaXplKQotICAgICBpbnQgc2l6ZTsKLXsKLSAgY29uc193b3JrZXIgKHNpemUsIDApOwotfQotCi12b2lkIAotc19ydmEgKHNpemUpCi0gICAgIGludCBzaXplOwotewotICBjb25zX3dvcmtlciAoc2l6ZSwgMSk7Ci19Ci0KLS8qIFB1dCB0aGUgY29udGVudHMgb2YgZXhwcmVzc2lvbiBFWFAgaW50byB0aGUgb2JqZWN0IGZpbGUgdXNpbmcKLSAgIE5CWVRFUyBieXRlcy4gIElmIG5lZWRfcGFzc18yIGlzIDEsIHRoaXMgZG9lcyBub3RoaW5nLiAgKi8KLQotdm9pZAotZW1pdF9leHByIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgb3BlcmF0b3JUIG9wOwotICByZWdpc3RlciBjaGFyICpwOwotICB2YWx1ZVQgZXh0cmFfZGlnaXQgPSAwOwotCi0gIC8qIERvbid0IGRvIGFueXRoaW5nIGlmIHdlIGFyZSBnb2luZyB0byBtYWtlIGFub3RoZXIgcGFzcy4gICovCi0gIGlmIChuZWVkX3Bhc3NfMikKLSAgICByZXR1cm47Ci0KLSNpZm5kZWYgTk9fTElTVElORwotI2lmZGVmIE9CSl9FTEYKLSAgLyogV2hlbiBnY2MgZW1pdHMgRFdBUkYgMSBkZWJ1Z2dpbmcgcHNldWRvLW9wcywgYSBsaW5lIG51bWJlciB3aWxsCi0gICAgIGFwcGVhciBhcyBhIGZvdXIgYnl0ZSBwb3NpdGl2ZSBjb25zdGFudCBpbiB0aGUgLmxpbmUgc2VjdGlvbiwKLSAgICAgZm9sbG93ZWQgYnkgYSAyIGJ5dGUgMHhmZmZmLiAgTG9vayBmb3IgdGhhdCBjYXNlIGhlcmUuICAqLwotICB7Ci0gICAgc3RhdGljIGludCBkd2FyZl9saW5lID0gLTE7Ci0KLSAgICBpZiAoc3RyY21wIChzZWdtZW50X25hbWUgKG5vd19zZWcpLCAiLmxpbmUiKSAhPSAwKQotICAgICAgZHdhcmZfbGluZSA9IC0xOwotICAgIGVsc2UgaWYgKGR3YXJmX2xpbmUgPj0gMAotCSAgICAgJiYgbmJ5dGVzID09IDIKLQkgICAgICYmIGV4cC0+WF9vcCA9PSBPX2NvbnN0YW50Ci0JICAgICAmJiAoZXhwLT5YX2FkZF9udW1iZXIgPT0gLTEgfHwgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHhmZmZmKSkKLSAgICAgIGxpc3Rpbmdfc291cmNlX2xpbmUgKCh1bnNpZ25lZCBpbnQpIGR3YXJmX2xpbmUpOwotICAgIGVsc2UgaWYgKG5ieXRlcyA9PSA0Ci0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPj0gMCkKLSAgICAgIGR3YXJmX2xpbmUgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICBlbHNlCi0gICAgICBkd2FyZl9saW5lID0gLTE7Ci0gIH0KLQotICAvKiBXaGVuIGdjYyBlbWl0cyBEV0FSRiAxIGRlYnVnZ2luZyBwc2V1ZG8tb3BzLCBhIGZpbGUgbmFtZSB3aWxsCi0gICAgIGFwcGVhciBhcyBhIDIgYnl0ZSBUQUdfY29tcGlsZV91bml0ICgweDExKSBmb2xsb3dlZCBieSBhIDIgYnl0ZQotICAgICBBVF9zaWJsaW5nICgweDEyKSBmb2xsb3dlZCBieSBhIGZvdXIgYnl0ZSBhZGRyZXNzIG9mIHRoZSBzaWJsaW5nCi0gICAgIGZvbGxvd2VkIGJ5IGEgMiBieXRlIEFUX25hbWUgKDB4MzgpIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZQotICAgICBmaWxlLiAgV2UgbG9vayBmb3IgdGhhdCBjYXNlIGhlcmUuICAqLwotICB7Ci0gICAgc3RhdGljIGludCBkd2FyZl9maWxlID0gMDsKLQotICAgIGlmIChzdHJjbXAgKHNlZ21lbnRfbmFtZSAobm93X3NlZyksICIuZGVidWciKSAhPSAwKQotICAgICAgZHdhcmZfZmlsZSA9IDA7Ci0gICAgZWxzZSBpZiAoZHdhcmZfZmlsZSA9PSAwCi0JICAgICAmJiBuYnl0ZXMgPT0gMgotCSAgICAgJiYgZXhwLT5YX29wID09IE9fY29uc3RhbnQKLQkgICAgICYmIGV4cC0+WF9hZGRfbnVtYmVyID09IDB4MTEpCi0gICAgICBkd2FyZl9maWxlID0gMTsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDEKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgxMikKLSAgICAgIGR3YXJmX2ZpbGUgPSAyOwotICAgIGVsc2UgaWYgKGR3YXJmX2ZpbGUgPT0gMgotCSAgICAgJiYgbmJ5dGVzID09IDQpCi0gICAgICBkd2FyZl9maWxlID0gMzsKLSAgICBlbHNlIGlmIChkd2FyZl9maWxlID09IDMKLQkgICAgICYmIG5ieXRlcyA9PSAyCi0JICAgICAmJiBleHAtPlhfb3AgPT0gT19jb25zdGFudAotCSAgICAgJiYgZXhwLT5YX2FkZF9udW1iZXIgPT0gMHgzOCkKLSAgICAgIGR3YXJmX2ZpbGUgPSA0OwotICAgIGVsc2UKLSAgICAgIGR3YXJmX2ZpbGUgPSAwOwotCi0gICAgLyogVGhlIHZhcmlhYmxlIGR3YXJmX2ZpbGVfc3RyaW5nIHRlbGxzIHN0cmluZ2VyIHRoYXQgdGhlIHN0cmluZwotICAgICAgIG1heSBiZSB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuICAqLwotICAgIGlmIChkd2FyZl9maWxlID09IDQpCi0gICAgICBkd2FyZl9maWxlX3N0cmluZyA9IDE7Ci0gICAgZWxzZQotICAgICAgZHdhcmZfZmlsZV9zdHJpbmcgPSAwOwotICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0gIGlmIChjaGVja19laF9mcmFtZSAoZXhwLCAmbmJ5dGVzKSkKLSAgICByZXR1cm47Ci0KLSAgb3AgPSBleHAtPlhfb3A7Ci0KLSAgLyogQWxsb3cgYC53b3JkIDAnIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLSAgaWYgKG5vd19zZWcgPT0gYWJzb2x1dGVfc2VjdGlvbikKLSAgICB7Ci0gICAgICBpZiAob3AgIT0gT19jb25zdGFudCB8fCBleHAtPlhfYWRkX251bWJlciAhPSAwKQotCWFzX2JhZCAoXygiYXR0ZW1wdCB0byBzdG9yZSB2YWx1ZSBpbiBhYnNvbHV0ZSBzZWN0aW9uIikpOwotICAgICAgYWJzX3NlY3Rpb25fb2Zmc2V0ICs9IG5ieXRlczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSGFuZGxlIGEgbmVnYXRpdmUgYmlnbnVtLiAgKi8KLSAgaWYgKG9wID09IE9fdW1pbnVzCi0gICAgICAmJiBleHAtPlhfYWRkX251bWJlciA9PSAwCi0gICAgICAmJiBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4cC0+WF9hZGRfc3ltYm9sKS0+WF9vcCA9PSBPX2JpZwotICAgICAgJiYgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChleHAtPlhfYWRkX3N5bWJvbCktPlhfYWRkX251bWJlciA+IDApCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICB1bnNpZ25lZCBsb25nIGNhcnJ5OwotCi0gICAgICBleHAgPSBzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKGV4cC0+WF9hZGRfc3ltYm9sKTsKLQotICAgICAgLyogTmVnYXRlIHRoZSBiaWdudW06IG9uZSdzIGNvbXBsZW1lbnQgZWFjaCBkaWdpdCBhbmQgYWRkIDEuICAqLwotICAgICAgY2FycnkgPSAxOwotICAgICAgZm9yIChpID0gMDsgaSA8IGV4cC0+WF9hZGRfbnVtYmVyOyBpKyspCi0JewotCSAgdW5zaWduZWQgbG9uZyBuZXh0OwotCi0JICBuZXh0ID0gKCgofiAoZ2VuZXJpY19iaWdudW1baV0gJiBMSVRUTEVOVU1fTUFTSykpCi0JCSAgICYgTElUVExFTlVNX01BU0spCi0JCSAgKyBjYXJyeSk7Ci0JICBnZW5lcmljX2JpZ251bVtpXSA9IG5leHQgJiBMSVRUTEVOVU1fTUFTSzsKLQkgIGNhcnJ5ID0gbmV4dCA+PiBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JfQotCi0gICAgICAvKiBXZSBjYW4gaWdub3JlIGFueSBjYXJyeSBvdXQsIGJlY2F1c2UgaXQgd2lsbCBiZSBoYW5kbGVkIGJ5Ci0JIGV4dHJhX2RpZ2l0IGlmIGl0IGlzIG5lZWRlZC4gICovCi0KLSAgICAgIGV4dHJhX2RpZ2l0ID0gKHZhbHVlVCkgLTE7Ci0gICAgICBvcCA9IE9fYmlnOwotICAgIH0KLQotICBpZiAob3AgPT0gT19hYnNlbnQgfHwgb3AgPT0gT19pbGxlZ2FsKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInplcm8gYXNzdW1lZCBmb3IgbWlzc2luZyBleHByZXNzaW9uIikpOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19iaWcgJiYgZXhwLT5YX2FkZF9udW1iZXIgPD0gMCkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImZsb2F0aW5nIHBvaW50IG51bWJlciBpbnZhbGlkOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotICBlbHNlIGlmIChvcCA9PSBPX3JlZ2lzdGVyKQotICAgIHsKLSAgICAgIGFzX3dhcm4gKF8oInJlZ2lzdGVyIHZhbHVlIHVzZWQgYXMgZXhwcmVzc2lvbiIpKTsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0KLSAgcCA9IGZyYWdfbW9yZSAoKGludCkgbmJ5dGVzKTsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0gIC8qIElmIHdlIGhhdmUgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMgaW4gYSB3b3JkLCBzYXZlIGl0IG9uCi0gICAgIHRoZSBicm9rZW5fd29yZHMgbGlzdC4gIFNlZSB0aGUgY29kZSBpbiB3cml0ZS5jLiAgKi8KLSAgaWYgKG9wID09IE9fc3VidHJhY3QgJiYgbmJ5dGVzID09IDIpCi0gICAgewotICAgICAgc3RydWN0IGJyb2tlbl93b3JkICp4OwotCi0gICAgICB4ID0gKHN0cnVjdCBicm9rZW5fd29yZCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBicm9rZW5fd29yZCkpOwotICAgICAgeC0+bmV4dF9icm9rZW5fd29yZCA9IGJyb2tlbl93b3JkczsKLSAgICAgIGJyb2tlbl93b3JkcyA9IHg7Ci0gICAgICB4LT5zZWcgPSBub3dfc2VnOwotICAgICAgeC0+c3Vic2VnID0gbm93X3N1YnNlZzsKLSAgICAgIHgtPmZyYWcgPSBmcmFnX25vdzsKLSAgICAgIHgtPndvcmRfZ29lc19oZXJlID0gcDsKLSAgICAgIHgtPmRpc3BmcmFnID0gMDsKLSAgICAgIHgtPmFkZCA9IGV4cC0+WF9hZGRfc3ltYm9sOwotICAgICAgeC0+c3ViID0gZXhwLT5YX29wX3N5bWJvbDsKLSAgICAgIHgtPmFkZG51bSA9IGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgeC0+YWRkZWQgPSAwOwotICAgICAgbmV3X2Jyb2tlbl93b3JkcysrOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIElmIHdlIGhhdmUgYW4gaW50ZWdlciwgYnV0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgdG9vIGxhcmdlIHRvCi0gICAgIHBhc3MgdG8gbWRfbnVtYmVyX3RvX2NoYXJzLCBoYW5kbGUgaXQgYXMgYSBiaWdudW0uICAqLwotICBpZiAob3AgPT0gT19jb25zdGFudCAmJiBuYnl0ZXMgPiBzaXplb2YgKHZhbHVlVCkpCi0gICAgewotICAgICAgdmFsdWVUIHZhbDsKLSAgICAgIGludCBnZW5jbnQ7Ci0KLSAgICAgIGlmICghIGV4cC0+WF91bnNpZ25lZCAmJiBleHAtPlhfYWRkX251bWJlciA8IDApCi0JZXh0cmFfZGlnaXQgPSAodmFsdWVUKSAtMTsKLSAgICAgIHZhbCA9ICh2YWx1ZVQpIGV4cC0+WF9hZGRfbnVtYmVyOwotICAgICAgZ2VuY250ID0gMDsKLSAgICAgIGRvCi0JewotCSAgZ2VuZXJpY19iaWdudW1bZ2VuY250XSA9IHZhbCAmIExJVFRMRU5VTV9NQVNLOwotCSAgdmFsID4+PSBMSVRUTEVOVU1fTlVNQkVSX09GX0JJVFM7Ci0JICArK2dlbmNudDsKLQl9Ci0gICAgICB3aGlsZSAodmFsICE9IDApOwotICAgICAgb3AgPSBleHAtPlhfb3AgPSBPX2JpZzsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gZ2VuY250OwotICAgIH0KLQotICBpZiAob3AgPT0gT19jb25zdGFudCkKLSAgICB7Ci0gICAgICByZWdpc3RlciB2YWx1ZVQgZ2V0OwotICAgICAgcmVnaXN0ZXIgdmFsdWVUIHVzZTsKLSAgICAgIHJlZ2lzdGVyIHZhbHVlVCBtYXNrOwotICAgICAgdmFsdWVUIGhpYml0OwotICAgICAgcmVnaXN0ZXIgdmFsdWVUIHVubWFzazsKLQotICAgICAgLyogSkYgPDwgb2YgPj0gbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9iamVjdCBpcyB1bmRlZmluZWQuICBJbgotCSBwYXJ0aWN1bGFyIFNQQVJDIChTdW4gNCkgaGFzIHByb2JsZW1zICovCi0gICAgICBpZiAobmJ5dGVzID49IHNpemVvZiAodmFsdWVUKSkKLQl7Ci0JICBtYXNrID0gMDsKLQkgIGlmIChuYnl0ZXMgPiBzaXplb2YgKHZhbHVlVCkpCi0JICAgIGhpYml0ID0gMDsKLQkgIGVsc2UKLQkgICAgaGliaXQgPSAodmFsdWVUKSAxIDw8IChuYnl0ZXMgKiBCSVRTX1BFUl9DSEFSIC0gMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvbid0IHN0b3JlIHRoZXNlIGJpdHMuICovCi0JICBtYXNrID0gfih2YWx1ZVQpIDAgPDwgKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpOwotCSAgaGliaXQgPSAodmFsdWVUKSAxIDw8IChuYnl0ZXMgKiBCSVRTX1BFUl9DSEFSIC0gMSk7Ci0JfQotCi0gICAgICB1bm1hc2sgPSB+bWFzazsJCS8qIERvIHN0b3JlIHRoZXNlIGJpdHMuICovCi0KLSNpZmRlZiBORVZFUgotICAgICAgIkRvIHRoaXMgbW9kIGlmIHlvdSB3YW50IGV2ZXJ5IG92ZXJmbG93IGNoZWNrIHRvIGFzc3VtZSBTSUdORUQgMidzIGNvbXBsZW1lbnQgZGF0YS4iOwotICAgICAgbWFzayA9IH4odW5tYXNrID4+IDEpOwkvKiBJbmNsdWRlcyBzaWduIGJpdCBub3cuICovCi0jZW5kaWYKLQotICAgICAgZ2V0ID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICB1c2UgPSBnZXQgJiB1bm1hc2s7Ci0gICAgICBpZiAoKGdldCAmIG1hc2spICE9IDAKLQkgICYmICgoZ2V0ICYgbWFzaykgIT0gbWFzawotCSAgICAgIHx8IChnZXQgJiBoaWJpdCkgPT0gMCkpCi0JewkJLyogTGVhZGluZyBiaXRzIGNvbnRhaW4gYm90aCAwcyAmIDFzLiAqLwotCSAgYXNfd2FybiAoXygiVmFsdWUgMHglbHggdHJ1bmNhdGVkIHRvIDB4JWx4LiIpLAotCQkgICAodW5zaWduZWQgbG9uZykgZ2V0LCAodW5zaWduZWQgbG9uZykgdXNlKTsKLQl9Ci0gICAgICAvKiBwdXQgYnl0ZXMgaW4gcmlnaHQgb3JkZXIuICovCi0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIHVzZSwgKGludCkgbmJ5dGVzKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBzaXplOwotICAgICAgTElUVExFTlVNX1RZUEUgKm51bXM7Ci0KLSAgICAgIGtub3cgKG5ieXRlcyAlIENIQVJTX1BFUl9MSVRUTEVOVU0gPT0gMCk7Ci0KLSAgICAgIHNpemUgPSBleHAtPlhfYWRkX251bWJlciAqIENIQVJTX1BFUl9MSVRUTEVOVU07Ci0gICAgICBpZiAobmJ5dGVzIDwgc2l6ZSkKLQl7Ci0JICBhc193YXJuIChfKCJCaWdudW0gdHJ1bmNhdGVkIHRvICVkIGJ5dGVzIiksIG5ieXRlcyk7Ci0JICBzaXplID0gbmJ5dGVzOwotCX0KLQotICAgICAgaWYgKHRhcmdldF9iaWdfZW5kaWFuKQotCXsKLQkgIHdoaWxlIChuYnl0ZXMgPiBzaXplKQotCSAgICB7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCBleHRyYV9kaWdpdCwgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7Ci0JICAgICAgbmJ5dGVzIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgcCArPSBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgICB9Ci0KLQkgIG51bXMgPSBnZW5lcmljX2JpZ251bSArIHNpemUgLyBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgd2hpbGUgKHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgLS1udW1zOwotCSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCwgKHZhbHVlVCkgKm51bXMsIENIQVJTX1BFUl9MSVRUTEVOVU0pOwotCSAgICAgIHNpemUgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbnVtcyA9IGdlbmVyaWNfYmlnbnVtOwotCSAgd2hpbGUgKHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChwLCAodmFsdWVUKSAqbnVtcywgQ0hBUlNfUEVSX0xJVFRMRU5VTSk7Ci0JICAgICAgKytudW1zOwotCSAgICAgIHNpemUgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgICAgbmJ5dGVzIC09IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgIH0KLQotCSAgd2hpbGUgKG5ieXRlcyA+IDApCi0JICAgIHsKLQkgICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsIGV4dHJhX2RpZ2l0LCBDSEFSU19QRVJfTElUVExFTlVNKTsKLQkgICAgICBuYnl0ZXMgLT0gQ0hBUlNfUEVSX0xJVFRMRU5VTTsKLQkgICAgICBwICs9IENIQVJTX1BFUl9MSVRUTEVOVU07Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbWVtc2V0IChwLCAwLCBuYnl0ZXMpOwotCi0gICAgICAvKiBOb3cgd2UgbmVlZCB0byBnZW5lcmF0ZSBhIGZpeFMgdG8gcmVjb3JkIHRoZSBzeW1ib2wgdmFsdWUuCi0JIFRoaXMgaXMgZWFzeSBmb3IgQkZELiAgRm9yIG90aGVyIHRhcmdldHMgaXQgY2FuIGJlIG1vcmUKLQkgY29tcGxleC4gIEZvciB2ZXJ5IGNvbXBsZXggY2FzZXMgKGN1cnJlbnRseSwgdGhlIEhQUEEgYW5kCi0JIE5TMzJLKSwgeW91IGNhbiBkZWZpbmUgVENfQ09OU19GSVhfTkVXIHRvIGRvIHdoYXRldmVyIHlvdQotCSB3YW50LiAgRm9yIHNpbXBsZXIgY2FzZXMsIHlvdSBjYW4gZGVmaW5lIFRDX0NPTlNfUkVMT0MgdG8gYmUKLQkgdGhlIG5hbWUgb2YgdGhlIHJlbG9jIGNvZGUgdGhhdCBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBmaXhTLgotCSBJZiBuZWl0aGVyIGlzIGRlZmluZWQsIHRoZSBjb2RlIHVzZXMgTk9fUkVMT0MgaWYgaXQgaXMKLQkgZGVmaW5lZCwgYW5kIG90aGVyd2lzZSB1c2VzIDAuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIFRDX0NPTlNfRklYX05FVwotICAgICAgVENfQ09OU19GSVhfTkVXIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBuYnl0ZXMsIGV4cCk7Ci0jZWxzZQotICAgICAgewotCWJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByOwotCi0Jc3dpdGNoIChuYnl0ZXMpCi0JICB7Ci0JICBjYXNlIDE6Ci0JICAgIHIgPSBCRkRfUkVMT0NfODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIDI6Ci0JICAgIHIgPSBCRkRfUkVMT0NfMTY7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSA0OgotCSAgICByID0gQkZEX1JFTE9DXzMyOwotCSAgICBicmVhazsKLQkgIGNhc2UgODoKLQkgICAgciA9IEJGRF9SRUxPQ182NDsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBhc19iYWQgKF8oInVuc3VwcG9ydGVkIEJGRCByZWxvY2F0aW9uIHNpemUgJXUiKSwgbmJ5dGVzKTsKLQkgICAgciA9IEJGRF9SRUxPQ18zMjsKLQkgICAgYnJlYWs7Ci0JICB9Ci0JZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIChpbnQpIG5ieXRlcywgZXhwLAotCQkgICAgIDAsIHIpOwotICAgICAgfQotI2VuZGlmCi0jZWxzZQotI2lmZGVmIFRDX0NPTlNfRklYX05FVwotICAgICAgVENfQ09OU19GSVhfTkVXIChmcmFnX25vdywgcCAtIGZyYWdfbm93LT5mcl9saXRlcmFsLCBuYnl0ZXMsIGV4cCk7Ci0jZWxzZQotICAgICAgLyogRmlndXJlIG91dCB3aGljaCByZWxvYyBudW1iZXIgdG8gdXNlLiAgVXNlIFRDX0NPTlNfUkVMT0MgaWYKLQkgaXQgaXMgZGVmaW5lZCwgb3RoZXJ3aXNlIHVzZSBOT19SRUxPQyBpZiBpdCBpcyBkZWZpbmVkLAotCSBvdGhlcndpc2UgdXNlIDAuICAqLwotI2lmbmRlZiBUQ19DT05TX1JFTE9DCi0jaWZkZWYgTk9fUkVMT0MKLSNkZWZpbmUgVENfQ09OU19SRUxPQyBOT19SRUxPQwotI2Vsc2UKLSNkZWZpbmUgVENfQ09OU19SRUxPQyAwCi0jZW5kaWYKLSNlbmRpZgotICAgICAgZml4X25ld19leHAgKGZyYWdfbm93LCBwIC0gZnJhZ19ub3ctPmZyX2xpdGVyYWwsIChpbnQpIG5ieXRlcywgZXhwLCAwLAotCQkgICBUQ19DT05TX1JFTE9DKTsKLSNlbmRpZiAvKiBUQ19DT05TX0ZJWF9ORVcgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0gICAgfQotfQotDAotI2lmZGVmIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMKLQotLyogaTk2MCBhc3NlbWJsZXJzLCAoZWcsIGFzbTk2MCksIGFsbG93IGJpdGZpZWxkcyBhZnRlciAiLmJ5dGUiIGFzCi0gICB3OngseTp6LCB3aGVyZSB3IGFuZCB5IGFyZSBiaXR3aWR0aHMgYW5kIHggYW5kIHkgYXJlIHZhbHVlcy4gIFRoZXkKLSAgIHRoZW4gcGFjayB0aGVtIGFsbCB0b2dldGhlci4gV2UgZG8gYSBsaXR0bGUgYmV0dGVyIGluIHRoYXQgd2UgYWxsb3cKLSAgIHRoZW0gaW4gd29yZHMsIGxvbmdzLCBldGMuIGFuZCB3ZSdsbCBwYWNrIHRoZW0gaW4gdGFyZ2V0IGJ5dGUgb3JkZXIKLSAgIGZvciB5b3UuCi0KLSAgIFRoZSBydWxlcyBhcmU6IHBhY2sgbGVhc3Qgc2lnbmlmaWNhdCBiaXQgZmlyc3QsIGlmIGEgZmllbGQgZG9lc24ndAotICAgZW50aXJlbHkgZml0LCBwdXQgaXQgaW4gdGhlIG5leHQgdW5pdC4gIE92ZXJmbG93aW5nIHRoZSBiaXRmaWVsZCBpcwotICAgZXhwbGljaXRseSAqbm90KiBldmVuIGEgd2FybmluZy4gIFRoZSBiaXR3aWR0aCBzaG91bGQgYmUgY29uc2lkZXJlZAotICAgYSAibWFzayIuCi0KLSAgIFRvIHVzZSB0aGlzIGZ1bmN0aW9uIHRoZSB0Yy1YWFguaCBmaWxlIHNob3VsZCBkZWZpbmUKLSAgIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMuICAqLwotCi1zdGF0aWMgdm9pZCAKLXBhcnNlX2JpdGZpZWxkX2NvbnMgKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotewotICB1bnNpZ25lZCBpbnQgYml0c19hdmFpbGFibGUgPSBCSVRTX1BFUl9DSEFSICogbmJ5dGVzOwotICBjaGFyICpob2xkID0gaW5wdXRfbGluZV9wb2ludGVyOwotCi0gICh2b2lkKSBleHByZXNzaW9uIChleHApOwotCi0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc6JykKLSAgICB7CQkJLyogYml0ZmllbGRzICovCi0gICAgICBsb25nIHZhbHVlID0gMDsKLQotICAgICAgZm9yICg7OykKLQl7Ci0JICB1bnNpZ25lZCBsb25nIHdpZHRoOwotCi0JICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnOicpCi0JICAgIHsKLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIGJyZWFrOwotCSAgICB9CQkJLyogbmV4dCBwaWVjZSBpcyBub3QgYSBiaXRmaWVsZCAqLwotCi0JICAvKiBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB3ZSBjYW4ndCBhbGxvdwotCSAgICAgZnVsbCBleHByZXNzaW9ucyB3aXRoIHN5bWJvbAotCSAgICAgZGlmZmVyZW5jZXMgYW5kIHN1Y2guICBUaGUgcmVsb2NhdGlvbgotCSAgICAgZW50cmllcyBmb3Igc3ltYm9scyBub3QgZGVmaW5lZCBpbiB0aGlzCi0JICAgICBhc3NlbWJseSB3b3VsZCByZXF1aXJlIGFyYml0cmFyeSBmaWVsZAotCSAgICAgd2lkdGhzLCBwb3NpdGlvbnMsIGFuZCBtYXNrcyB3aGljaCBtb3N0Ci0JICAgICBvZiBvdXIgY3VycmVudCBvYmplY3QgZm9ybWF0cyBkb24ndAotCSAgICAgc3VwcG9ydC4KLQotCSAgICAgSW4gdGhlIHNwZWNpZmljIGNhc2Ugd2hlcmUgYSBzeW1ib2wKLQkgICAgICppcyogZGVmaW5lZCBpbiB0aGlzIGFzc2VtYmx5LCB3ZQotCSAgICAgKmNvdWxkKiBidWlsZCBmaXh1cHMgYW5kIHRyYWNrIGl0LCBidXQKLQkgICAgIHRoaXMgY291bGQgbGVhZCB0byBjb25mdXNpb24gZm9yIHRoZQotCSAgICAgYmFja2VuZHMuICBJJ20gbGF6eS4gSSdsbCB0YWtlIGFueQotCSAgICAgU0VHX0FCU09MVVRFLiBJIHRoaW5rIHRoYXQgbWVhbnMgdGhhdAotCSAgICAgeW91IGNhbiB1c2UgYSBwcmV2aW91cyAuc2V0IG9yCi0JICAgICAuZXF1IHR5cGUgc3ltYm9sLiAgeG94b3JpY2guICovCi0KLQkgIGlmIChleHAtPlhfb3AgPT0gT19hYnNlbnQpCi0JICAgIHsKLQkgICAgICBhc193YXJuIChfKCJ1c2luZyBhIGJpdCBmaWVsZCB3aWR0aCBvZiB6ZXJvIikpOwotCSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLQkgICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotCSAgICB9CQkJLyogaW1wbGllZCB6ZXJvIHdpZHRoIGJpdGZpZWxkICovCi0KLQkgIGlmIChleHAtPlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnXDAnOwotCSAgICAgIGFzX2JhZCAoXygiZmllbGQgd2lkdGggXCIlc1wiIHRvbyBjb21wbGV4IGZvciBhIGJpdGZpZWxkIiksIGhvbGQpOwotCSAgICAgICppbnB1dF9saW5lX3BvaW50ZXIgPSAnOic7Ci0JICAgICAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0JCQkvKiB0b28gY29tcGxleCAqLwotCi0JICBpZiAoKHdpZHRoID0gZXhwLT5YX2FkZF9udW1iZXIpID4gKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpKQotCSAgICB7Ci0JICAgICAgYXNfd2FybiAoXygiZmllbGQgd2lkdGggJWx1IHRvbyBiaWcgdG8gZml0IGluICVkIGJ5dGVzOiB0cnVuY2F0ZWQgdG8gJWQgYml0cyIpLAotCQkgICAgICAgd2lkdGgsIG5ieXRlcywgKEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXMpKTsKLQkgICAgICB3aWR0aCA9IEJJVFNfUEVSX0NIQVIgKiBuYnl0ZXM7Ci0JICAgIH0JCQkvKiB0b28gYmlnICovCi0KLQkgIGlmICh3aWR0aCA+IGJpdHNfYXZhaWxhYmxlKQotCSAgICB7Ci0JICAgICAgLyogRklYTUUtU09NRURBWTogYmFja2luZyB1cCBhbmQgcmVwYXJzaW5nIGlzIHdhc3RlZnVsLiAgKi8KLQkgICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotCSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gdmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0JCQkvKiB3b24ndCBmaXQgKi8KLQotCSAgaG9sZCA9ICsraW5wdXRfbGluZV9wb2ludGVyOyAvKiBza2lwICc6JyAqLwotCi0JICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwKTsKLQkgIGlmIChleHAtPlhfb3AgIT0gT19jb25zdGFudCkKLQkgICAgewotCSAgICAgIGNoYXIgY2FjaGUgPSAqaW5wdXRfbGluZV9wb2ludGVyOwotCi0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9ICdcMCc7Ci0JICAgICAgYXNfYmFkIChfKCJmaWVsZCB2YWx1ZSBcIiVzXCIgdG9vIGNvbXBsZXggZm9yIGEgYml0ZmllbGQiKSwgaG9sZCk7Ci0JICAgICAgKmlucHV0X2xpbmVfcG9pbnRlciA9IGNhY2hlOwotCSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9CQkJLyogdG9vIGNvbXBsZXggKi8KLQotCSAgdmFsdWUgfD0gKCh+KC0xIDw8IHdpZHRoKSAmIGV4cC0+WF9hZGRfbnVtYmVyKQotCQkgICAgPDwgKChCSVRTX1BFUl9DSEFSICogbmJ5dGVzKSAtIGJpdHNfYXZhaWxhYmxlKSk7Ci0KLQkgIGlmICgoYml0c19hdmFpbGFibGUgLT0gd2lkdGgpID09IDAKLQkgICAgICB8fCBpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpCi0JICAgICAgfHwgKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnLCcpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQkJCS8qIGFsbCB0aGUgYml0ZmllbGRzIHdlJ3JlIGdvbm5hIGdldCAqLwotCi0JICBob2xkID0gKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICAodm9pZCkgZXhwcmVzc2lvbiAoZXhwKTsKLQl9CQkJLyogZm9yZXZlciBsb29wICovCi0KLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gdmFsdWU7Ci0gICAgICBleHAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwLT5YX3Vuc2lnbmVkID0gMTsKLSAgICB9CQkJCS8qIGlmIGxvb2tzIGxpa2UgYSBiaXRmaWVsZCAqLwotfQkJCQkvKiBwYXJzZV9iaXRmaWVsZF9jb25zKCkgKi8KLQotI2VuZGlmIC8qIEJJVEZJRUxEX0NPTlNfRVhQUkVTU0lPTlMgKi8KLQwKLS8qIEhhbmRsZSBhbiBNUkkgc3R5bGUgc3RyaW5nIGV4cHJlc3Npb24uICAqLwotCi1zdGF0aWMgdm9pZAotcGFyc2VfbXJpX2NvbnMgKGV4cCwgbmJ5dGVzKQotICAgICBleHByZXNzaW9uUyAqZXhwOwotICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzOwotewotICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnXCcnCi0gICAgICAmJiAoaW5wdXRfbGluZV9wb2ludGVyWzFdICE9ICdcJycKLQkgIHx8ICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICdBJwotCSAgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJ0UnKSkpCi0gICAgVENfUEFSU0VfQ09OU19FWFBSRVNTSU9OIChleHAsIG5ieXRlcyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgc2NhbjsKLSAgICAgIHVuc2lnbmVkIGludCByZXN1bHQgPSAwOwotCi0gICAgICAvKiBBbiBNUkkgc3R5bGUgc3RyaW5nLiAgQ3V0IGludG8gYXMgbWFueSBieXRlcyBhcyB3aWxsIGZpdCBpbnRvCi0JIGEgbmJ5dGUgY2h1bmssIGxlZnQganVzdGlmeSBpZiBuZWNlc3NhcnksIGFuZCBzZXBhcmF0ZSB3aXRoCi0JIGNvbW1hcyBzbyB3ZSBjYW4gdHJ5IGFnYWluIGxhdGVyLiAgKi8KLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICdBJykKLQkrK2lucHV0X2xpbmVfcG9pbnRlcjsKLSAgICAgIGVsc2UgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ0UnKQotCXsKLQkgIGFzX2JhZCAoXygiRUJDRElDIGNvbnN0YW50cyBhcmUgbm90IHN1cHBvcnRlZCIpKTsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCX0KLQotICAgICAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gICAgICBmb3IgKHNjYW4gPSAwOyBzY2FuIDwgbmJ5dGVzOyBzY2FuKyspCi0JewotCSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wnJykKLQkgICAgewotCSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wnJykKLQkJewotCQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCQl9Ci0JICAgICAgZWxzZQotCQlicmVhazsKLQkgICAgfQotCSAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSB8ICgqaW5wdXRfbGluZV9wb2ludGVyKyspOwotCX0KLQotICAgICAgLyogTGVmdCBqdXN0aWZ5ICovCi0gICAgICB3aGlsZSAoc2NhbiA8IG5ieXRlcykKLQl7Ci0JICByZXN1bHQgPDw9IDg7Ci0JICBzY2FuKys7Ci0JfQotICAgICAgLyogQ3JlYXRlIGNvcnJlY3QgZXhwcmVzc2lvbiAqLwotICAgICAgZXhwLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gcmVzdWx0OwotICAgICAgLyogRmFrZSBpdCBzbyB0aGF0IHdlIGNhbiByZWFkIHRoZSBuZXh0IGNoYXIgdG9vICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdICE9ICdcJycgfHwKLQkgIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJ1wnJyAmJiBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPT0gJ1wnJykpCi0JewotCSAgaW5wdXRfbGluZV9wb2ludGVyIC09IDI7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXJbMF0gPSAnLCc7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXJbMV0gPSAnXCcnOwotCX0KLSAgICAgIGVsc2UKLQlpbnB1dF9saW5lX3BvaW50ZXIrKzsKLSAgICB9Ci19Ci0MCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLQotLyogUGFyc2UgYSByZXBlYXQgZXhwcmVzc2lvbiBmb3IgY29ucy4gIFRoaXMgaXMgdXNlZCBieSB0aGUgTUlQUwotICAgYXNzZW1ibGVyLiAgVGhlIGZvcm1hdCBpcyBOVU1CRVI6Q09VTlQ7IE5VTUJFUiBhcHBlYXJzIGluIHRoZQotICAgb2JqZWN0IGZpbGUgQ09VTlQgdGltZXMuCi0KLSAgIFRvIHVzZSB0aGlzIGZvciBhIHRhcmdldCwgZGVmaW5lIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TLiAgKi8KLQotc3RhdGljIHZvaWQKLXBhcnNlX3JlcGVhdF9jb25zIChleHAsIG5ieXRlcykKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLSAgICAgdW5zaWduZWQgaW50IG5ieXRlczsKLXsKLSAgZXhwcmVzc2lvblMgY291bnQ7Ci0gIHJlZ2lzdGVyIGludCBpOwotCi0gIGV4cHJlc3Npb24gKGV4cCk7Ci0KLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJzonKQotICAgIHsKLSAgICAgIC8qIE5vIHJlcGVhdCBjb3VudC4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICsraW5wdXRfbGluZV9wb2ludGVyOwotICBleHByZXNzaW9uICgmY291bnQpOwotICBpZiAoY291bnQuWF9vcCAhPSBPX2NvbnN0YW50Ci0gICAgICB8fCBjb3VudC5YX2FkZF9udW1iZXIgPD0gMCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJVbnJlc29sdmFibGUgb3Igbm9ucG9zaXRpdmUgcmVwZWF0IGNvdW50OyB1c2luZyAxIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUaGUgY29ucyBmdW5jdGlvbiBpcyBnb2luZyB0byBvdXRwdXQgdGhpcyBleHByZXNzaW9uIG9uY2UuICBTbyB3ZQotICAgICBvdXRwdXQgaXQgY291bnQgLSAxIHRpbWVzLiAgKi8KLSAgZm9yIChpID0gY291bnQuWF9hZGRfbnVtYmVyIC0gMTsgaSA+IDA7IGktLSkKLSAgICBlbWl0X2V4cHIgKGV4cCwgbmJ5dGVzKTsKLX0KLQotI2VuZGlmIC8qIFJFUEVBVF9DT05TX0VYUFJFU1NJT05TICovCi0MCi0vKiBQYXJzZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlciByZXByZXNlbnRlZCBhcyBhIGhleCBjb25zdGFudC4gIFRoaXMKLSAgIHBlcm1pdHMgdXNlcnMgdG8gc3BlY2lmeSB0aGUgZXhhY3QgYml0cyB0aGV5IHdhbnQgaW4gdGhlIGZsb2F0aW5nCi0gICBwb2ludCBudW1iZXIuICAqLwotCi1zdGF0aWMgaW50Ci1oZXhfZmxvYXQgKGZsb2F0X3R5cGUsIGJ5dGVzKQotICAgICBpbnQgZmxvYXRfdHlwZTsKLSAgICAgY2hhciAqYnl0ZXM7Ci17Ci0gIGludCBsZW5ndGg7Ci0gIGludCBpOwotCi0gIHN3aXRjaCAoZmxvYXRfdHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnZic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBsZW5ndGggPSA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoKLSAgICBjYXNlICdEJzoKLSAgICBjYXNlICdyJzoKLSAgICBjYXNlICdSJzoKLSAgICAgIGxlbmd0aCA9IDg7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgotICAgIGNhc2UgJ1gnOgotICAgICAgbGVuZ3RoID0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ1AnOgotICAgICAgbGVuZ3RoID0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc19iYWQgKF8oIlVua25vd24gZmxvYXRpbmcgdHlwZSB0eXBlICclYyciKSwgZmxvYXRfdHlwZSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgZ28gdGhyb3VnaCBleHByZXNzaW9uIHRvIHBhcnNlIHRoZQotICAgICBoZXggY29uc3RhbnQsIGJ1dCBpZiB3ZSBnZXQgYSBiaWdudW0gaXQncyBhIHBhaW4gdG8gc29ydCBpdCBpbnRvCi0gICAgIHRoZSBidWZmZXIgY29ycmVjdGx5LiAgKi8KLSAgaSA9IDA7Ci0gIHdoaWxlIChoZXhfcCAoKmlucHV0X2xpbmVfcG9pbnRlcikgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXycpCi0gICAgewotICAgICAgaW50IGQ7Ci0KLSAgICAgIC8qIFRoZSBNUkkgYXNzZW1ibGVyIGFjY2VwdHMgYXJiaXRyYXJ5IHVuZGVyc2NvcmVzIHN0cmV3biBhYm91dAotCSB0aHJvdWdoIHRoZSBoZXggY29uc3RhbnQsIHNvIHdlIGlnbm9yZSB0aGVtIGFzIHdlbGwuICovCi0gICAgICBpZiAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXycpCi0JewotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChpID49IGxlbmd0aCkKLQl7Ci0JICBhc193YXJuIChfKCJGbG9hdGluZyBwb2ludCBjb25zdGFudCB0b28gbGFyZ2UiKSk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgZCA9IGhleF92YWx1ZSAoKmlucHV0X2xpbmVfcG9pbnRlcikgPDwgNDsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ18nKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgaWYgKGhleF9wICgqaW5wdXRfbGluZV9wb2ludGVyKSkKLQl7Ci0JICBkICs9IGhleF92YWx1ZSAoKmlucHV0X2xpbmVfcG9pbnRlcik7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQl9Ci0gICAgICBpZiAodGFyZ2V0X2JpZ19lbmRpYW4pCi0JYnl0ZXNbaV0gPSBkOwotICAgICAgZWxzZQotCWJ5dGVzW2xlbmd0aCAtIGkgLSAxXSA9IGQ7Ci0gICAgICArK2k7Ci0gICAgfQotCi0gIGlmIChpIDwgbGVuZ3RoKQotICAgIHsKLSAgICAgIGlmICh0YXJnZXRfYmlnX2VuZGlhbikKLQltZW1zZXQgKGJ5dGVzICsgaSwgMCwgbGVuZ3RoIC0gaSk7Ci0gICAgICBlbHNlCi0JbWVtc2V0IChieXRlcywgMCwgbGVuZ3RoIC0gaSk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLS8qCi0gKgkJCWZsb2F0X2NvbnMoKQotICoKLSAqIENPTlN0cnVjdCBzb21lIG1vcmUgZnJhZyBjaGFycyBvZiAuZmxvYXRzIC5mZmxvYXRzIGV0Yy4KLSAqIE1ha2VzIDAgb3IgbW9yZSBuZXcgZnJhZ3MuCi0gKiBJZiBuZWVkX3Bhc3NfMiA9PSAxLCBubyBmcmFncyBhcmUgZW1pdHRlZC4KLSAqIFRoaXMgdW5kZXJzdGFuZHMgb25seSBmbG9hdGluZyBsaXRlcmFscywgbm90IGV4cHJlc3Npb25zLiBTb3JyeS4KLSAqCi0gKiBBIGZsb2F0aW5nIGNvbnN0YW50IGlzIGRlZmluZWQgYnkgYXRvZl9nZW5lcmljKCksIGV4Y2VwdCBpdCBpcyBwcmVjZWRlZAotICogYnkgMGQgMGYgMGcgb3IgMGguIEFmdGVyIG9ic2VydmluZyB0aGUgU1RSQU5HRSB3YXkgbXkgQlNEIEFTIGRvZXMgaXRzCi0gKiByZWFkaW5nLCBJIGRlY2lkZWQgdG8gYmUgaW5jb21wYXRpYmxlLiBUaGlzIGFsd2F5cyB0cmllcyB0byBnaXZlIHlvdQotICogcm91bmRlZCBiaXRzIHRvIHRoZSBwcmVjaXNpb24gb2YgdGhlIHBzZXVkby1vcC4gRm9ybWVyIEFTIGRpZCBwcmVtYXR1cmUKLSAqIHRydW5jYXRhdGlvbiwgcmVzdG9yZWQgbm9pc3kgYml0cyBpbnN0ZWFkIG9mIHRyYWlsaW5nIDBzIEFORCBnYXZlIHlvdQotICogYSBjaG9pY2Ugb2YgMiBmbGF2b3VycyBvZiBub2lzZSBhY2NvcmRpbmcgdG8gd2hpY2ggb2YgMiBmbG9hdGluZy1wb2ludAotICogc2Nhbm5lcnMgeW91IGRpcmVjdGVkIEFTIHRvIHVzZS4KLSAqCi0gKiBJbjoJaW5wdXRfbGluZV9wb2ludGVyLT53aGl0ZXNwYWNlIGJlZm9yZSwgb3IgJzAnIG9mIGZsb251bS4KLSAqCi0gKi8KLQotdm9pZAotZmxvYXRfY29ucyAoZmxvYXRfdHlwZSkKLSAgICAgLyogQ2xvYmJlcnMgaW5wdXRfbGluZS1wb2ludGVyLCBjaGVja3MgZW5kLW9mLWxpbmUuICovCi0gICAgIHJlZ2lzdGVyIGludCBmbG9hdF90eXBlOwkvKiAnZic6LmZmbG9hdCAuLi4gJ0YnOi5mbG9hdCAuLi4gKi8KLXsKLSAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgaW50IGxlbmd0aDsJCQkvKiBOdW1iZXIgb2YgY2hhcnMgaW4gYW4gb2JqZWN0LiAqLwotICByZWdpc3RlciBjaGFyICplcnI7CQkvKiBFcnJvciBmcm9tIHNjYW5uaW5nIGZsb2F0aW5nIGxpdGVyYWwuICovCi0gIGNoYXIgdGVtcFtNQVhJTVVNX05VTUJFUl9PRl9DSEFSU19GT1JfRkxPQVRdOwotCi0gIGlmIChpc19pdF9lbmRfb2Zfc3RhdGVtZW50ICgpKQotICAgIHsKLSAgICAgIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWZkZWYgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQKLSAgbWRfZmx1c2hfcGVuZGluZ19vdXRwdXQgKCk7Ci0jZW5kaWYKLQotICBkbwotICAgIHsKLSAgICAgIC8qIGlucHV0X2xpbmVfcG9pbnRlci0+MXN0IGNoYXIgb2YgYSBmbG9udW0gKHdlIGhvcGUhKS4gKi8KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQotICAgICAgLyogU2tpcCBhbnkgMHtsZXR0ZXJ9IHRoYXQgbWF5IGJlIHByZXNlbnQuIERvbid0IGV2ZW4gY2hlY2sgaWYgdGhlCi0gICAgICAgKiBsZXR0ZXIgaXMgbGVnYWwuIFNvbWVvbmUgbWF5IGludmVudCBhICJ6IiBmb3JtYXQgYW5kIHRoaXMgcm91dGluZQotICAgICAgICogaGFzIG5vIHVzZSBmb3Igc3VjaCBpbmZvcm1hdGlvbi4gTHVzZXJzIGJld2FyZTogeW91IGdldAotICAgICAgICogZGlhZ25vc3RpY3MgaWYgeW91ciBpbnB1dCBpcyBpbGwtY29uZGl0aW9uZWQuCi0gICAgICAgKi8KLSAgICAgIGlmIChpbnB1dF9saW5lX3BvaW50ZXJbMF0gPT0gJzAnCi0JICAmJiBpc2FscGhhICgodW5zaWduZWQgY2hhcikgaW5wdXRfbGluZV9wb2ludGVyWzFdKSkKLQlpbnB1dF9saW5lX3BvaW50ZXIgKz0gMjsKLQotICAgICAgLyogQWNjZXB0IDp4eHh4LCB3aGVyZSB0aGUgeCdzIGFyZSBoZXggZGlnaXRzLCBmb3IgYSBmbG9hdGluZwotICAgICAgICAgcG9pbnQgd2l0aCB0aGUgZXhhY3QgZGlnaXRzIHNwZWNpZmllZC4gICovCi0gICAgICBpZiAoaW5wdXRfbGluZV9wb2ludGVyWzBdID09ICc6JykKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGxlbmd0aCA9IGhleF9mbG9hdCAoZmxvYXRfdHlwZSwgdGVtcCk7Ci0JICBpZiAobGVuZ3RoIDwgMCkKLQkgICAgewotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGVyciA9IG1kX2F0b2YgKGZsb2F0X3R5cGUsIHRlbXAsICZsZW5ndGgpOwotCSAga25vdyAobGVuZ3RoIDw9IE1BWElNVU1fTlVNQkVSX09GX0NIQVJTX0ZPUl9GTE9BVCk7Ci0JICBrbm93IChsZW5ndGggPiAwKTsKLQkgIGlmIChlcnIpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oIkJhZCBmbG9hdGluZyBsaXRlcmFsOiAlcyIpLCBlcnIpOwotCSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICAgICAgcmV0dXJuOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoIW5lZWRfcGFzc18yKQotCXsKLQkgIGludCBjb3VudDsKLQotCSAgY291bnQgPSAxOwotCi0jaWZkZWYgUkVQRUFUX0NPTlNfRVhQUkVTU0lPTlMKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc6JykKLQkgICAgewotCSAgICAgIGV4cHJlc3Npb25TIGNvdW50X2V4cDsKLQotCSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgICAgIGV4cHJlc3Npb24gKCZjb3VudF9leHApOwotCSAgICAgIGlmIChjb3VudF9leHAuWF9vcCAhPSBPX2NvbnN0YW50Ci0JCSAgfHwgY291bnRfZXhwLlhfYWRkX251bWJlciA8PSAwKQotCQl7Ci0JCSAgYXNfd2FybiAoXygidW5yZXNvbHZhYmxlIG9yIG5vbnBvc2l0aXZlIHJlcGVhdCBjb3VudDsgdXNpbmcgMSIpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJY291bnQgPSBjb3VudF9leHAuWF9hZGRfbnVtYmVyOwotCSAgICB9Ci0jZW5kaWYKLQotCSAgd2hpbGUgKC0tY291bnQgPj0gMCkKLQkgICAgewotCSAgICAgIHAgPSBmcmFnX21vcmUgKGxlbmd0aCk7Ci0JICAgICAgbWVtY3B5IChwLCB0ZW1wLCAodW5zaWduZWQgaW50KSBsZW5ndGgpOwotCSAgICB9Ci0JfQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLSAgd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIC0taW5wdXRfbGluZV9wb2ludGVyOwkJLyogUHV0IHRlcm1pbmF0b3IgYmFjayBpbnRvIHN0cmVhbS4gICovCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIGZsb2F0X2NvbnMoKSAqLwotDAotLyogUmV0dXJuIHRoZSBzaXplIG9mIGEgTEVCMTI4IHZhbHVlICovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1zaXplb2Zfc2xlYjEyOCAodmFsdWUpCi0gICAgIG9mZnNldFQgdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGludCBzaXplID0gMDsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgYnl0ZTsKLQotICBkbwotICAgIHsKLSAgICAgIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKLSAgICAgIC8qIFNhZGx5LCB3ZSBjYW5ub3QgcmVseSBvbiB0eXBpY2FsIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgYmVoYXZpb3VyLgotCSBGb3J0dW5hdGVseSwgd2UgY2FuIHN0cnVjdHVyZSB0aGluZ3Mgc28gdGhhdCB0aGUgZXh0cmEgd29yayByZWR1Y2VzCi0JIHRvIGEgbm9vcCBvbiBzeXN0ZW1zIHRoYXQgZG8gdGhpbmdzICJwcm9wZXJseSIuICAqLwotICAgICAgdmFsdWUgPSAodmFsdWUgPj4gNykgfCB+KC0ob2Zmc2V0VCkxID4+IDcpOwotICAgICAgc2l6ZSArPSAxOwotICAgIH0KLSAgd2hpbGUgKCEoKCh2YWx1ZSA9PSAwKSAmJiAoKGJ5dGUgJiAweDQwKSA9PSAwKSkKLQkgICB8fCAoKHZhbHVlID09IC0xKSAmJiAoKGJ5dGUgJiAweDQwKSAhPSAwKSkpKTsKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXNpemVvZl91bGViMTI4ICh2YWx1ZSkKLSAgICAgdmFsdWVUIHZhbHVlOwotewotICByZWdpc3RlciBpbnQgc2l6ZSA9IDA7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgZG8KLSAgICB7Ci0gICAgICBieXRlID0gKHZhbHVlICYgMHg3Zik7Ci0gICAgICB2YWx1ZSA+Pj0gNzsKLSAgICAgIHNpemUgKz0gMTsKLSAgICB9Ci0gIHdoaWxlICh2YWx1ZSAhPSAwKTsKLQotICByZXR1cm4gc2l6ZTsKLX0KLQotaW50Ci1zaXplb2ZfbGViMTI4ICh2YWx1ZSwgc2lnbikKLSAgICAgdmFsdWVUIHZhbHVlOwotICAgICBpbnQgc2lnbjsKLXsKLSAgaWYgKHNpZ24pCi0gICAgcmV0dXJuIHNpemVvZl9zbGViMTI4ICgob2Zmc2V0VCkgdmFsdWUpOwotICBlbHNlCi0gICAgcmV0dXJuIHNpemVvZl91bGViMTI4ICh2YWx1ZSk7Ci19Ci0KLS8qIE91dHB1dCBhIExFQjEyOCB2YWx1ZS4gICovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdXRwdXRfc2xlYjEyOCAocCwgdmFsdWUpCi0gICAgIGNoYXIgKnA7Ci0gICAgIG9mZnNldFQgdmFsdWU7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKm9yaWcgPSBwOwotICByZWdpc3RlciBpbnQgbW9yZTsKLQotICBkbwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGJ5dGUgPSAodmFsdWUgJiAweDdmKTsKLQotICAgICAgLyogU2FkbHksIHdlIGNhbm5vdCByZWx5IG9uIHR5cGljYWwgYXJpdGhtZXRpYyByaWdodCBzaGlmdCBiZWhhdmlvdXIuCi0JIEZvcnR1bmF0ZWx5LCB3ZSBjYW4gc3RydWN0dXJlIHRoaW5ncyBzbyB0aGF0IHRoZSBleHRyYSB3b3JrIHJlZHVjZXMKLQkgdG8gYSBub29wIG9uIHN5c3RlbXMgdGhhdCBkbyB0aGluZ3MgInByb3Blcmx5Ii4gICovCi0gICAgICB2YWx1ZSA9ICh2YWx1ZSA+PiA3KSB8IH4oLShvZmZzZXRUKTEgPj4gNyk7Ci0KLSAgICAgIG1vcmUgPSAhKCgoKHZhbHVlID09IDApICYmICgoYnl0ZSAmIDB4NDApID09IDApKQotCQl8fCAoKHZhbHVlID09IC0xKSAmJiAoKGJ5dGUgJiAweDQwKSAhPSAwKSkpKTsKLSAgICAgIGlmIChtb3JlKQotCWJ5dGUgfD0gMHg4MDsKLQotICAgICAgKnArKyA9IGJ5dGU7Ci0gICAgfQotICB3aGlsZSAobW9yZSk7Ci0KLSAgcmV0dXJuIHAgLSBvcmlnOwotfQotCi1zdGF0aWMgaW5saW5lIGludAotb3V0cHV0X3VsZWIxMjggKHAsIHZhbHVlKQotICAgICBjaGFyICpwOwotICAgICB2YWx1ZVQgdmFsdWU7Ci17Ci0gIGNoYXIgKm9yaWcgPSBwOwotCi0gIGRvCi0gICAgewotICAgICAgdW5zaWduZWQgYnl0ZSA9ICh2YWx1ZSAmIDB4N2YpOwotICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICBpZiAodmFsdWUgIT0gMCkKLQkvKiBNb3JlIGJ5dGVzIHRvIGZvbGxvdy4gICovCi0JYnl0ZSB8PSAweDgwOwotCi0gICAgICAqcCsrID0gYnl0ZTsKLSAgICB9Ci0gIHdoaWxlICh2YWx1ZSAhPSAwKTsKLQotICByZXR1cm4gcCAtIG9yaWc7Ci19Ci0KLWludAotb3V0cHV0X2xlYjEyOCAocCwgdmFsdWUsIHNpZ24pCi0gICAgIGNoYXIgKnA7Ci0gICAgIHZhbHVlVCB2YWx1ZTsKLSAgICAgaW50IHNpZ247Ci17Ci0gIGlmIChzaWduKQotICAgIHJldHVybiBvdXRwdXRfc2xlYjEyOCAocCwgKG9mZnNldFQpIHZhbHVlKTsKLSAgZWxzZQotICAgIHJldHVybiBvdXRwdXRfdWxlYjEyOCAocCwgdmFsdWUpOwotfQotCi0vKiBEbyB0aGUgc2FtZSBmb3IgYmlnbnVtcy4gIFdlIGNvbWJpbmUgc2l6ZW9mIHdpdGggb3V0cHV0IGhlcmUgaW4gdGhhdAotICAgd2UgZG9uJ3Qgb3V0cHV0IGZvciBOVUxMIHZhbHVlcyBvZiBQLiAgSXQgaXNuJ3QgcmVhbGx5IGFzIGNyaXRpY2FsIGFzCi0gICBmb3IgIm5vcm1hbCIgdmFsdWVzIHRoYXQgdGhpcyBiZSBzdHJlYW1saW5lZC4gICovCi0KLXN0YXRpYyBpbmxpbmUgaW50Ci1vdXRwdXRfYmlnX3NsZWIxMjggKHAsIGJpZ251bSwgc2l6ZSkKLSAgICAgY2hhciAqcDsKLSAgICAgTElUVExFTlVNX1RZUEUgKmJpZ251bTsKLSAgICAgaW50IHNpemU7Ci17Ci0gIGNoYXIgKm9yaWcgPSBwOwotICB2YWx1ZVQgdmFsID0gMDsKLSAgaW50IGxvYWRlZCA9IDA7Ci0gIHVuc2lnbmVkIGJ5dGU7Ci0KLSAgLyogU3RyaXAgbGVhZGluZyBzaWduIGV4dGVuc2lvbnMgb2ZmIHRoZSBiaWdudW0uICAqLwotICB3aGlsZSAoc2l6ZSA+IDAgJiYgYmlnbnVtW3NpemUtMV0gPT0gKExJVFRMRU5VTV9UWVBFKS0xKQotICAgIHNpemUtLTsKLQotICBkbwotICAgIHsKLSAgICAgIGlmIChsb2FkZWQgPCA3ICYmIHNpemUgPiAwKQotCXsKLQkgIHZhbCB8PSAoKmJpZ251bSA8PCBsb2FkZWQpOwotCSAgbG9hZGVkICs9IDggKiBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgc2l6ZS0tOwotCSAgYmlnbnVtKys7Ci0JfQotCi0gICAgICBieXRlID0gdmFsICYgMHg3ZjsKLSAgICAgIGxvYWRlZCAtPSA3OwotICAgICAgdmFsID4+PSA3OwotCi0gICAgICBpZiAoc2l6ZSA9PSAwKQotCXsKLQkgIGlmICgodmFsID09IDAgJiYgKGJ5dGUgJiAweDQwKSA9PSAwKQotCSAgICAgIHx8ICh+KHZhbCB8IH4oKCh2YWx1ZVQpMSA8PCBsb2FkZWQpIC0gMSkpID09IDAKLQkJICAmJiAoYnl0ZSAmIDB4NDApICE9IDApKQotCSAgICBieXRlIHw9IDB4ODA7Ci0JfQotCi0gICAgICBpZiAob3JpZykKLQkqcCA9IGJ5dGU7Ci0gICAgICBwKys7Ci0gICAgfQotICB3aGlsZSAoYnl0ZSAmIDB4ODApOwotCi0gIHJldHVybiBwIC0gb3JpZzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLW91dHB1dF9iaWdfdWxlYjEyOCAocCwgYmlnbnVtLCBzaXplKQotICAgICBjaGFyICpwOwotICAgICBMSVRUTEVOVU1fVFlQRSAqYmlnbnVtOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgY2hhciAqb3JpZyA9IHA7Ci0gIHZhbHVlVCB2YWwgPSAwOwotICBpbnQgbG9hZGVkID0gMDsKLSAgdW5zaWduZWQgYnl0ZTsKLQotICAvKiBTdHJpcCBsZWFkaW5nIHplcm9zIG9mZiB0aGUgYmlnbnVtLiAgKi8KLSAgLyogWFhYOiBJcyB0aGlzIG5lZWRlZD8gICovCi0gIHdoaWxlIChzaXplID4gMCAmJiBiaWdudW1bc2l6ZS0xXSA9PSAwKQotICAgIHNpemUtLTsKLQotICBkbwotICAgIHsKLSAgICAgIGlmIChsb2FkZWQgPCA3ICYmIHNpemUgPiAwKQotCXsKLQkgIHZhbCB8PSAoKmJpZ251bSA8PCBsb2FkZWQpOwotCSAgbG9hZGVkICs9IDggKiBDSEFSU19QRVJfTElUVExFTlVNOwotCSAgc2l6ZS0tOwotCSAgYmlnbnVtKys7Ci0JfQotCi0gICAgICBieXRlID0gdmFsICYgMHg3ZjsKLSAgICAgIGxvYWRlZCAtPSA3OwotICAgICAgdmFsID4+PSA3OwotCi0gICAgICBpZiAoc2l6ZSA+IDAgfHwgdmFsKQotCWJ5dGUgfD0gMHg4MDsKLQotICAgICAgaWYgKG9yaWcpCi0JKnAgPSBieXRlOwotICAgICAgcCsrOwotICAgIH0KLSAgd2hpbGUgKGJ5dGUgJiAweDgwKTsKLQotICByZXR1cm4gcCAtIG9yaWc7Ci19Ci0KLXN0YXRpYyBpbnQKLW91dHB1dF9iaWdfbGViMTI4IChwLCBiaWdudW0sIHNpemUsIHNpZ24pCi0gICAgIGNoYXIgKnA7Ci0gICAgIExJVFRMRU5VTV9UWVBFICpiaWdudW07Ci0gICAgIGludCBzaXplLCBzaWduOwotewotICBpZiAoc2lnbikKLSAgICByZXR1cm4gb3V0cHV0X2JpZ19zbGViMTI4IChwLCBiaWdudW0sIHNpemUpOwotICBlbHNlCi0gICAgcmV0dXJuIG91dHB1dF9iaWdfdWxlYjEyOCAocCwgYmlnbnVtLCBzaXplKTsKLX0KLQotLyogR2VuZXJhdGUgdGhlIGFwcHJvcHJpYXRlIGZyYWdtZW50cyBmb3IgYSBnaXZlbiBleHByZXNzaW9uIHRvIGVtaXQgYQotICAgbGViMTI4IHZhbHVlLiAgKi8KLQotdm9pZAotZW1pdF9sZWIxMjhfZXhwcihleHAsIHNpZ24pCi0gICAgIGV4cHJlc3Npb25TICpleHA7Ci0gICAgIGludCBzaWduOwotewotICBvcGVyYXRvclQgb3AgPSBleHAtPlhfb3A7Ci0KLSAgaWYgKG9wID09IE9fYWJzZW50IHx8IG9wID09IE9faWxsZWdhbCkKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJ6ZXJvIGFzc3VtZWQgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbiIpKTsKLSAgICAgIGV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICAgIG9wID0gT19jb25zdGFudDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wID09IE9fYmlnICYmIGV4cC0+WF9hZGRfbnVtYmVyIDw9IDApCi0gICAgewotICAgICAgYXNfYmFkIChfKCJmbG9hdGluZyBwb2ludCBudW1iZXIgaW52YWxpZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgZXhwLT5YX2FkZF9udW1iZXIgPSAwOwotICAgICAgb3AgPSBPX2NvbnN0YW50OwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19yZWdpc3RlcikKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJyZWdpc3RlciB2YWx1ZSB1c2VkIGFzIGV4cHJlc3Npb24iKSk7Ci0gICAgICBvcCA9IE9fY29uc3RhbnQ7Ci0gICAgfQotCi0gIGlmIChvcCA9PSBPX2NvbnN0YW50KQotICAgIHsKLSAgICAgIC8qIElmIHdlJ3ZlIGdvdCBhIGNvbnN0YW50LCBlbWl0IHRoZSB0aGluZyBkaXJlY3RseSByaWdodCBub3cuICAqLwotCi0gICAgICB2YWx1ZVQgdmFsdWUgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIGludCBzaXplOwotICAgICAgY2hhciAqcDsKLQotICAgICAgc2l6ZSA9IHNpemVvZl9sZWIxMjggKHZhbHVlLCBzaWduKTsKLSAgICAgIHAgPSBmcmFnX21vcmUgKHNpemUpOwotICAgICAgb3V0cHV0X2xlYjEyOCAocCwgdmFsdWUsIHNpZ24pOwotICAgIH0KLSAgZWxzZSBpZiAob3AgPT0gT19iaWcpCi0gICAgewotICAgICAgLyogT19iaWcgaXMgYSBkaWZmZXJlbnQgc29ydCBvZiBjb25zdGFudC4gICovCi0KLSAgICAgIGludCBzaXplOwotICAgICAgY2hhciAqcDsKLQotICAgICAgc2l6ZSA9IG91dHB1dF9iaWdfbGViMTI4IChOVUxMLCBnZW5lcmljX2JpZ251bSwgZXhwLT5YX2FkZF9udW1iZXIsIHNpZ24pOwotICAgICAgcCA9IGZyYWdfbW9yZSAoc2l6ZSk7Ci0gICAgICBvdXRwdXRfYmlnX2xlYjEyOCAocCwgZ2VuZXJpY19iaWdudW0sIGV4cC0+WF9hZGRfbnVtYmVyLCBzaWduKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBPdGhlcndpc2UsIHdlIGhhdmUgdG8gY3JlYXRlIGEgdmFyaWFibGUgc2l6ZWQgZnJhZ21lbnQgYW5kIAotCSByZXNvbHZlIHRoaW5ncyBsYXRlci4gICovCi0KLSAgICAgIGZyYWdfdmFyIChyc19sZWIxMjgsIHNpemVvZl91bGViMTI4ICh+KHZhbHVlVCkwKSwgMCwgc2lnbiwKLQkJbWFrZV9leHByX3N5bWJvbCAoZXhwKSwgMCwgKGNoYXIgKikgTlVMTCk7Ci0gICAgfQotfQotCi0vKiBQYXJzZSB0aGUgLnNsZWIxMjggYW5kIC51bGViMTI4IHBzZXVkb3MuICAqLwotCi12b2lkCi1zX2xlYjEyOCAoc2lnbikKLSAgICAgaW50IHNpZ247Ci17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBkbyB7Ci0gICAgZXhwcmVzc2lvbiAoJmV4cCk7Ci0gICAgZW1pdF9sZWIxMjhfZXhwciAoJmV4cCwgc2lnbik7Ci0gIH0gd2hpbGUgKCppbnB1dF9saW5lX3BvaW50ZXIrKyA9PSAnLCcpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlci0tOwotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotLyoKLSAqCQkJc3RyaW5nZXIoKQotICoKLSAqIFdlIHJlYWQgMCBvciBtb3JlICcsJyBzZXBhcmF0ZWQsIGRvdWJsZS1xdW90ZWQgc3RyaW5ncy4KLSAqCi0gKiBDYWxsZXIgc2hvdWxkIGhhdmUgY2hlY2tlZCBuZWVkX3Bhc3NfMiBpcyBGQUxTRSBiZWNhdXNlIHdlIGRvbid0IGNoZWNrIGl0LgotICovCi0KLQotdm9pZCAKLXN0cmluZ2VyIChhcHBlbmRfemVybykJCS8qIFdvcmtlciB0byBkbyAuYXNjaWkgZXRjIHN0YXRlbWVudHMuICovCi0gICAgIC8qIENoZWNrcyBlbmQtb2YtbGluZS4gKi8KLSAgICAgcmVnaXN0ZXIgaW50IGFwcGVuZF96ZXJvOwkvKiAwOiBkb24ndCBhcHBlbmQgJ1wwJywgZWxzZSAxICovCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBjOwotICBjaGFyICpzdGFydDsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0ICgpOwotI2VuZGlmCi0KLSAgLyoKLSAgICogVGhlIGZvbGxvd2luZyBhd2t3YXJkIGxvZ2ljIGlzIHRvIHBhcnNlIFpFUk8gb3IgbW9yZSBzdHJpbmdzLAotICAgKiBjb21tYSBzZXBhcmF0ZWQuIFJlY2FsbCBhIHN0cmluZyBleHByZXNzaW9uIGluY2x1ZGVzIHNwYWNlcwotICAgKiBiZWZvcmUgdGhlIG9wZW5pbmcgJ1wiJyBhbmQgc3BhY2VzIGFmdGVyIHRoZSBjbG9zaW5nICdcIicuCi0gICAqIFdlIGZha2UgYSBsZWFkaW5nICcsJyBpZiB0aGVyZSBpcyAoc3VwcG9zZWQgdG8gYmUpCi0gICAqIGEgMXN0LCBleHByZXNzaW9uLiBXZSBrZWVwIGRlbWFuZGluZyBleHByZXNzaW9ucyBmb3IgZWFjaAotICAgKiAnLCcuCi0gICAqLwotICBpZiAoaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKSkKLSAgICB7Ci0gICAgICBjID0gMDsJCQkvKiBTa2lwIGxvb3AuICovCi0gICAgICArK2lucHV0X2xpbmVfcG9pbnRlcjsJLyogQ29tcGVuc2F0ZSBmb3IgZW5kIG9mIGxvb3AuICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYyA9ICcsJzsJCQkvKiBEbyBsb29wLiAqLwotICAgIH0KLSAgd2hpbGUgKGMgPT0gJywnIHx8IGMgPT0gJzwnIHx8IGMgPT0gJyInKQotICAgIHsKLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIHN3aXRjaCAoKmlucHV0X2xpbmVfcG9pbnRlcikKLQl7Ci0JY2FzZSAnXCInOgotCSAgKytpbnB1dF9saW5lX3BvaW50ZXI7CS8qLT4xc3QgY2hhciBvZiBzdHJpbmcuICovCi0JICBzdGFydCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIHdoaWxlIChpc19hX2NoYXIgKGMgPSBuZXh0X2NoYXJfb2Zfc3RyaW5nICgpKSkKLQkgICAgewotCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoYyk7Ci0JICAgIH0KLQkgIGlmIChhcHBlbmRfemVybykKLQkgICAgewotCSAgICAgIEZSQUdfQVBQRU5EXzFfQ0hBUiAoMCk7Ci0JICAgIH0KLQkgIGtub3cgKGlucHV0X2xpbmVfcG9pbnRlclstMV0gPT0gJ1wiJyk7Ci0KLSNpZm5kZWYgTk9fTElTVElORwotI2lmZGVmIE9CSl9FTEYKLQkgIC8qIEluIEVMRiwgd2hlbiBnY2MgaXMgZW1pdHRpbmcgRFdBUkYgMSBkZWJ1Z2dpbmcgb3V0cHV0LCBpdAotICAgICAgICAgICAgIHdpbGwgZW1pdCAuc3RyaW5nIHdpdGggYSBmaWxlbmFtZSBpbiB0aGUgLmRlYnVnIHNlY3Rpb24KLSAgICAgICAgICAgICBhZnRlciBhIHNlcXVlbmNlIG9mIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudCBpbgotICAgICAgICAgICAgIGVtaXRfZXhwciBmb3IgdGhlIHNlcXVlbmNlLiAgZW1pdF9leHByIHdpbGwgc2V0Ci0gICAgICAgICAgICAgZHdhcmZfZmlsZV9zdHJpbmcgdG8gbm9uLXplcm8gaWYgdGhpcyBzdHJpbmcgbWlnaHQgYmUgYQotICAgICAgICAgICAgIHNvdXJjZSBmaWxlIG5hbWUuICAqLwotCSAgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChub3dfc2VnKSwgIi5kZWJ1ZyIpICE9IDApCi0JICAgIGR3YXJmX2ZpbGVfc3RyaW5nID0gMDsKLQkgIGVsc2UgaWYgKGR3YXJmX2ZpbGVfc3RyaW5nKQotCSAgICB7Ci0JICAgICAgYyA9IGlucHV0X2xpbmVfcG9pbnRlclstMV07Ci0JICAgICAgaW5wdXRfbGluZV9wb2ludGVyWy0xXSA9ICdcMCc7Ci0JICAgICAgbGlzdGluZ19zb3VyY2VfZmlsZSAoc3RhcnQpOwotCSAgICAgIGlucHV0X2xpbmVfcG9pbnRlclstMV0gPSBjOwotCSAgICB9Ci0jZW5kaWYKLSNlbmRpZgotCi0JICBicmVhazsKLQljYXNlICc8JzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYyA9IGdldF9zaW5nbGVfbnVtYmVyICgpOwotCSAgRlJBR19BUFBFTkRfMV9DSEFSIChjKTsKLQkgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyICE9ICc+JykKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgPG5uPiIpKTsKLQkgICAgfQotCSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICBicmVhazsKLQljYXNlICcsJzoKLQkgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgYnJlYWs7Ci0JfQotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXI7Ci0gICAgfQotCi0gIGRlbWFuZF9lbXB0eV9yZXN0X29mX2xpbmUgKCk7Ci19CQkJCS8qIHN0cmluZ2VyKCkgKi8KLQwKLS8qIEZJWE1FLVNPTUVEQVk6IEkgaGFkIHRyb3VibGUgaGVyZSBvbiBjaGFyYWN0ZXJzIHdpdGggdGhlCi0gICAgaGlnaCBiaXRzIHNldC4gIFdlJ2xsIHByb2JhYmx5IGFsc28gaGF2ZSB0cm91YmxlIHdpdGgKLSAgICBtdWx0aWJ5dGUgY2hhcnMsIHdpZGUgY2hhcnMsIGV0Yy4gIEFsc28gYmUgY2FyZWZ1bCBhYm91dAotICAgIHJldHVybmluZyB2YWx1ZXMgYmlnZ2VyIHRoYW4gMSBieXRlLiAgeG94b3JpY2guICovCi0KLXVuc2lnbmVkIGludCAKLW5leHRfY2hhcl9vZl9zdHJpbmcgKCkKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGM7Ci0KLSAgYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKyAmIENIQVJfTUFTSzsKLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlICdcIic6Ci0gICAgICBjID0gTk9UX0FfQ0hBUjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnXG4nOgotICAgICAgYXNfd2FybiAoXygiVW50ZXJtaW5hdGVkIHN0cmluZzogTmV3bGluZSBpbnNlcnRlZC4iKSk7Ci0gICAgICBidW1wX2xpbmVfY291bnRlcnMgKCk7Ci0gICAgICBicmVhazsKLQotI2lmbmRlZiBOT19TVFJJTkdfRVNDQVBFUwotICAgIGNhc2UgJ1xcJzoKLSAgICAgIHN3aXRjaCAoYyA9ICppbnB1dF9saW5lX3BvaW50ZXIrKykKLQl7Ci0JY2FzZSAnYic6Ci0JICBjID0gJ1xiJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnZic6Ci0JICBjID0gJ1xmJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAnbic6Ci0JICBjID0gJ1xuJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAncic6Ci0JICBjID0gJ1xyJzsKLQkgIGJyZWFrOwotCi0JY2FzZSAndCc6Ci0JICBjID0gJ1x0JzsKLQkgIGJyZWFrOwotCi0JY2FzZSAndic6Ci0JICBjID0gJ1wwMTMnOwotCSAgYnJlYWs7Ci0KLQljYXNlICdcXCc6Ci0JY2FzZSAnIic6Ci0JICBicmVhazsJCS8qIEFzIGl0c2VsZi4gKi8KLQotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCWNhc2UgJzcnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCSAgewotCSAgICBsb25nIG51bWJlcjsKLQkgICAgaW50IGk7Ci0KLQkgICAgZm9yIChpID0gMCwgbnVtYmVyID0gMDsgaXNkaWdpdCAoYykgJiYgaSA8IDM7IGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKyssIGkrKykKLQkgICAgICB7Ci0JCW51bWJlciA9IG51bWJlciAqIDggKyBjIC0gJzAnOwotCSAgICAgIH0KLQkgICAgYyA9IG51bWJlciAmIDB4ZmY7Ci0JICB9Ci0JICAtLWlucHV0X2xpbmVfcG9pbnRlcjsKLQkgIGJyZWFrOwotCi0JY2FzZSAneCc6Ci0JY2FzZSAnWCc6Ci0JICB7Ci0JICAgIGxvbmcgbnVtYmVyOwotCi0JICAgIG51bWJlciA9IDA7Ci0JICAgIGMgPSAqaW5wdXRfbGluZV9wb2ludGVyKys7Ci0JICAgIHdoaWxlIChpc3hkaWdpdCAoYykpCi0JICAgICAgewotCQlpZiAoaXNkaWdpdCAoYykpCi0JCSAgbnVtYmVyID0gbnVtYmVyICogMTYgKyBjIC0gJzAnOwotCQllbHNlIGlmIChpc3VwcGVyIChjKSkKLQkJICBudW1iZXIgPSBudW1iZXIgKiAxNiArIGMgLSAnQScgKyAxMDsKLQkJZWxzZQotCQkgIG51bWJlciA9IG51bWJlciAqIDE2ICsgYyAtICdhJyArIDEwOwotCQljID0gKmlucHV0X2xpbmVfcG9pbnRlcisrOwotCSAgICAgIH0KLQkgICAgYyA9IG51bWJlciAmIDB4ZmY7Ci0JICAgIC0taW5wdXRfbGluZV9wb2ludGVyOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdcbic6Ci0JICAvKiBUbyBiZSBjb21wYXRpYmxlIHdpdGggQlNEIDQuMiBhczogZ2l2ZSB0aGUgbHVzZXIgYSBsaW5lZmVlZCEhICovCi0JICBhc193YXJuIChfKCJVbnRlcm1pbmF0ZWQgc3RyaW5nOiBOZXdsaW5lIGluc2VydGVkLiIpKTsKLQkgIGMgPSAnXG4nOwotCSAgYnVtcF9saW5lX2NvdW50ZXJzICgpOwotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCi0jaWZkZWYgT05MWV9TVEFOREFSRF9FU0NBUEVTCi0JICBhc19iYWQgKF8oIkJhZCBlc2NhcGVkIGNoYXJhY3RlciBpbiBzdHJpbmcsICc/JyBhc3N1bWVkIikpOwotCSAgYyA9ICc/JzsKLSNlbmRpZiAvKiBPTkxZX1NUQU5EQVJEX0VTQ0FQRVMgKi8KLQotCSAgYnJlYWs7Ci0JfQkJCS8qIHN3aXRjaCBvbiBlc2NhcGVkIGNoYXIgKi8KLSAgICAgIGJyZWFrOwotI2VuZGlmIC8qICEgZGVmaW5lZCAoTk9fU1RSSU5HX0VTQ0FQRVMpICovCi0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQkJCQkvKiBzd2l0Y2ggb24gY2hhciAqLwotICByZXR1cm4gKGMpOwotfQkJCQkvKiBuZXh0X2NoYXJfb2Zfc3RyaW5nKCkgKi8KLQwKLXN0YXRpYyBzZWdUCi1nZXRfc2VnbWVudGVkX2V4cHJlc3Npb24gKGV4cFApCi0gICAgIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHBQOwotewotICByZWdpc3RlciBzZWdUIHJldHZhbDsKLQotICByZXR2YWwgPSBleHByZXNzaW9uIChleHBQKTsKLSAgaWYgKGV4cFAtPlhfb3AgPT0gT19pbGxlZ2FsCi0gICAgICB8fCBleHBQLT5YX29wID09IE9fYWJzZW50Ci0gICAgICB8fCBleHBQLT5YX29wID09IE9fYmlnKQotICAgIHsKLSAgICAgIGFzX2JhZCAoXygiZXhwZWN0ZWQgYWRkcmVzcyBleHByZXNzaW9uOyB6ZXJvIGFzc3VtZWQiKSk7Ci0gICAgICBleHBQLT5YX29wID0gT19jb25zdGFudDsKLSAgICAgIGV4cFAtPlhfYWRkX251bWJlciA9IDA7Ci0gICAgICByZXR2YWwgPSBhYnNvbHV0ZV9zZWN0aW9uOwotICAgIH0KLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHNlZ1QgCi1nZXRfa25vd25fc2VnbWVudGVkX2V4cHJlc3Npb24gKGV4cFApCi0gICAgIHJlZ2lzdGVyIGV4cHJlc3Npb25TICpleHBQOwotewotICByZWdpc3RlciBzZWdUIHJldHZhbDsKLQotICBpZiAoKHJldHZhbCA9IGdldF9zZWdtZW50ZWRfZXhwcmVzc2lvbiAoZXhwUCkpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIC8qIFRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGV4dHJhY3QgdGhlIHVuZGVmaW5lZCBzeW1ib2wgZnJvbSB0aGUKLQkgZXhwcmVzc2lvbi4gICovCi0gICAgICBpZiAoZXhwUC0+WF9hZGRfc3ltYm9sICE9IE5VTEwKLQkgICYmIFNfR0VUX1NFR01FTlQgKGV4cFAtPlhfYWRkX3N5bWJvbCkgIT0gZXhwcl9zZWN0aW9uKQotCWFzX3dhcm4gKF8oInN5bWJvbCBcIiVzXCIgdW5kZWZpbmVkOyB6ZXJvIGFzc3VtZWQiKSwKLQkJIFNfR0VUX05BTUUgKGV4cFAtPlhfYWRkX3N5bWJvbCkpOwotICAgICAgZWxzZQotCWFzX3dhcm4gKF8oInNvbWUgc3ltYm9sIHVuZGVmaW5lZDsgemVybyBhc3N1bWVkIikpOwotICAgICAgcmV0dmFsID0gYWJzb2x1dGVfc2VjdGlvbjsKLSAgICAgIGV4cFAtPlhfb3AgPSBPX2NvbnN0YW50OwotICAgICAgZXhwUC0+WF9hZGRfbnVtYmVyID0gMDsKLSAgICB9Ci0gIGtub3cgKHJldHZhbCA9PSBhYnNvbHV0ZV9zZWN0aW9uIHx8IFNFR19OT1JNQUwgKHJldHZhbCkpOwotICByZXR1cm4gKHJldHZhbCk7Ci19CQkJCS8qIGdldF9rbm93bl9zZWdtZW50ZWRfZXhwcmVzc2lvbigpICovCi0KLW9mZnNldFQKLWdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpCi17Ci0gIGV4cHJlc3Npb25TIGV4cDsKLQotICBleHByZXNzaW9uICgmZXhwKTsKLSAgaWYgKGV4cC5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgaWYgKGV4cC5YX29wICE9IE9fYWJzZW50KQotCWFzX2JhZCAoXygiYmFkIG9yIGlycmVkdWNpYmxlIGFic29sdXRlIGV4cHJlc3Npb247IHplcm8gYXNzdW1lZCIpKTsKLSAgICAgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotICAgIH0KLSAgcmV0dXJuIGV4cC5YX2FkZF9udW1iZXI7Ci19Ci0KLWNoYXIJCQkJLyogcmV0dXJuIHRlcm1pbmF0b3IgKi8KLWdldF9hYnNvbHV0ZV9leHByZXNzaW9uX2FuZF90ZXJtaW5hdG9yICh2YWxfcG9pbnRlcikKLSAgICAgbG9uZyAqdmFsX3BvaW50ZXI7CQkvKiByZXR1cm4gdmFsdWUgb2YgZXhwcmVzc2lvbiAqLwotewotICAvKiBGSVhNRTogdmFsX3BvaW50ZXIgc2hvdWxkIHByb2JhYmx5IGJlIG9mZnNldFQgKi4gICovCi0gICp2YWxfcG9pbnRlciA9IChsb25nKSBnZXRfYWJzb2x1dGVfZXhwcmVzc2lvbiAoKTsKLSAgcmV0dXJuICgqaW5wdXRfbGluZV9wb2ludGVyKyspOwotfQotDAotLyoKLSAqCQkJZGVtYW5kX2NvcHlfQ19zdHJpbmcoKQotICoKLSAqIExpa2UgZGVtYW5kX2NvcHlfc3RyaW5nLCBidXQgcmV0dXJuIE5VTEwgaWYgdGhlIHN0cmluZyBjb250YWlucyBhbnkgJ1wwJ3MuCi0gKiBHaXZlIGEgd2FybmluZyBpZiB0aGF0IGhhcHBlbnMuCi0gKi8KLWNoYXIgKgotZGVtYW5kX2NvcHlfQ19zdHJpbmcgKGxlbl9wb2ludGVyKQotICAgICBpbnQgKmxlbl9wb2ludGVyOwotewotICByZWdpc3RlciBjaGFyICpzOwotCi0gIGlmICgocyA9IGRlbWFuZF9jb3B5X3N0cmluZyAobGVuX3BvaW50ZXIpKSAhPSAwKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBsZW47Ci0KLSAgICAgIGZvciAobGVuID0gKmxlbl9wb2ludGVyOyBsZW4gPiAwOyBsZW4tLSkKLQl7Ci0JICBpZiAoKnMgPT0gMCkKLQkgICAgewotCSAgICAgIHMgPSAwOwotCSAgICAgIGxlbiA9IDE7Ci0JICAgICAgKmxlbl9wb2ludGVyID0gMDsKLQkgICAgICBhc19iYWQgKF8oIlRoaXMgc3RyaW5nIG1heSBub3QgY29udGFpbiBcJ1xcMFwnIikpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgcmV0dXJuIHM7Ci19Ci0MCi0vKgotICoJCQlkZW1hbmRfY29weV9zdHJpbmcoKQotICoKLSAqIERlbWFuZCBzdHJpbmcsIGJ1dCByZXR1cm4gYSBzYWZlICg9cHJpdmF0ZSkgY29weSBvZiB0aGUgc3RyaW5nLgotICogUmV0dXJuIE5VTEwgaWYgd2UgY2FuJ3QgcmVhZCBhIHN0cmluZyBoZXJlLgotICovCi1jaGFyICoKLWRlbWFuZF9jb3B5X3N0cmluZyAobGVuUCkKLSAgICAgaW50ICpsZW5QOwotewotICByZWdpc3RlciB1bnNpZ25lZCBpbnQgYzsKLSAgcmVnaXN0ZXIgaW50IGxlbjsKLSAgY2hhciAqcmV0dmFsOwotCi0gIGxlbiA9IDA7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJ1wiJykKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsJLyogU2tpcCBvcGVuaW5nIHF1b3RlLiAqLwotCi0gICAgICB3aGlsZSAoaXNfYV9jaGFyIChjID0gbmV4dF9jaGFyX29mX3N0cmluZyAoKSkpCi0JewotCSAgb2JzdGFja18xZ3JvdyAoJm5vdGVzLCBjKTsKLQkgIGxlbisrOwotCX0KLSAgICAgIC8qIEpGIHRoaXMgbmV4dCBsaW5lIGlzIHNvIGRlbWFuZF9jb3B5X0Nfc3RyaW5nIHdpbGwgcmV0dXJuIGEKLQkgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4gKi8KLSAgICAgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgJ1wwJyk7Ci0gICAgICByZXR2YWwgPSBvYnN0YWNrX2ZpbmlzaCAoJm5vdGVzKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBhc193YXJuIChfKCJNaXNzaW5nIHN0cmluZyIpKTsKLSAgICAgIHJldHZhbCA9IE5VTEw7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgKmxlblAgPSBsZW47Ci0gIHJldHVybiAocmV0dmFsKTsKLX0JCQkJLyogZGVtYW5kX2NvcHlfc3RyaW5nKCkgKi8KLQwKLS8qCi0gKgkJaXNfaXRfZW5kX29mX3N0YXRlbWVudCgpCi0gKgotICogSW46CUlucHV0X2xpbmVfcG9pbnRlci0+bmV4dCBjaGFyYWN0ZXIuCi0gKgotICogRG86CVNraXAgaW5wdXRfbGluZV9wb2ludGVyIG92ZXIgYWxsIHdoaXRlc3BhY2UuCi0gKgotICogT3V0OgkxIGlmIGlucHV0X2xpbmVfcG9pbnRlci0+ZW5kLW9mLWxpbmUuCi0qLwotaW50IAotaXNfaXRfZW5kX29mX3N0YXRlbWVudCAoKQotewotICBTS0lQX1dISVRFU1BBQ0UgKCk7Ci0gIHJldHVybiAoaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKTsKLX0JCQkJLyogaXNfaXRfZW5kX29mX3N0YXRlbWVudCgpICovCi0KLXZvaWQgCi1lcXVhbHMgKHN5bV9uYW1lLCByZWFzc2lnbikKLSAgICAgY2hhciAqc3ltX25hbWU7Ci0gICAgIGludCByZWFzc2lnbjsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsJLyogc3ltYm9sIHdlIGFyZSB3b3JraW5nIHdpdGggKi8KLSAgY2hhciAqc3RvcCA9IE5VTEw7Ci0gIGNoYXIgc3RvcGM7Ci0KLSAgaW5wdXRfbGluZV9wb2ludGVyKys7Ci0gIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICc9JykKLSAgICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQotICB3aGlsZSAoKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnICcgfHwgKmlucHV0X2xpbmVfcG9pbnRlciA9PSAnXHQnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotCi0gIGlmIChmbGFnX21yaSkKLSAgICBzdG9wID0gbXJpX2NvbW1lbnRfZmllbGQgKCZzdG9wYyk7Ci0KLSAgaWYgKHN5bV9uYW1lWzBdID09ICcuJyAmJiBzeW1fbmFtZVsxXSA9PSAnXDAnKQotICAgIHsKLSAgICAgIC8qIFR1cm4gJy4gPSBtdW1ibGUnIGludG8gYSAub3JnIG11bWJsZSAqLwotICAgICAgcmVnaXN0ZXIgc2VnVCBzZWdtZW50OwotICAgICAgZXhwcmVzc2lvblMgZXhwOwotCi0gICAgICBzZWdtZW50ID0gZ2V0X2tub3duX3NlZ21lbnRlZF9leHByZXNzaW9uICgmZXhwKTsKLSAgICAgIGlmICghbmVlZF9wYXNzXzIpCi0JZG9fb3JnIChzZWdtZW50LCAmZXhwLCAwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xQID0gc3ltYm9sX2ZpbmRfb3JfbWFrZSAoc3ltX25hbWUpOwotICAgICAgLyogUGVybWl0IHJlZ2lzdGVyIG5hbWVzIHRvIGJlIHJlZGVmaW5lZC4gICovCi0gICAgICBpZiAoISByZWFzc2lnbgotCSAgJiYgU19JU19ERUZJTkVEIChzeW1ib2xQKQotCSAgJiYgU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgIT0gcmVnX3NlY3Rpb24pCi0JYXNfYmFkIChfKCJzeW1ib2wgYCVzJyBhbHJlYWR5IGRlZmluZWQiKSwgU19HRVRfTkFNRSAoc3ltYm9sUCkpOwotICAgICAgcHNldWRvX3NldCAoc3ltYm9sUCk7Ci0gICAgfQotCi0gIGlmIChmbGFnX21yaSkKLSAgICAgewotICAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7IC8qIGNoZWNrIGdhcmJhZ2UgYWZ0ZXIgdGhlIGV4cHJlc3Npb24gKi8KLSAgICAgICBtcmlfY29tbWVudF9lbmQgKHN0b3AsIHN0b3BjKTsKLSAgICAgfQotfQkJCQkvKiBlcXVhbHMoKSAqLwotCi0vKiAuaW5jbHVkZSAtLSBpbmNsdWRlIGEgZmlsZSBhdCB0aGlzIHBvaW50LiAqLwotCi0vKiBBUkdTVVNFRCAqLwotdm9pZCAKLXNfaW5jbHVkZSAoYXJnKQotICAgICBpbnQgYXJnOwotewotICBjaGFyICpuZXdidWY7Ci0gIGNoYXIgKmZpbGVuYW1lOwotICBpbnQgaTsKLSAgRklMRSAqdHJ5OwotICBjaGFyICpwYXRoOwotCi0gIGlmICghIGZsYWdfbTY4a19tcmkpCi0gICAgewotICAgICAgZmlsZW5hbWUgPSBkZW1hbmRfY29weV9zdHJpbmcgKCZpKTsKLSAgICAgIGlmIChmaWxlbmFtZSA9PSBOVUxMKQotCXsKLQkgIC8qIGRlbWFuZF9jb3B5X3N0cmluZyBoYXMgYWxyZWFkeSBwcmludGVkIGFuIGVycm9yIGFuZAotICAgICAgICAgICAgIGNhbGxlZCBpZ25vcmVfcmVzdF9vZl9saW5lLiAgKi8KLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaSA9IDA7Ci0gICAgICB3aGlsZSAoISBpc19lbmRfb2ZfbGluZVsodW5zaWduZWQgY2hhcikgKmlucHV0X2xpbmVfcG9pbnRlcl0KLQkgICAgICYmICppbnB1dF9saW5lX3BvaW50ZXIgIT0gJyAnCi0JICAgICAmJiAqaW5wdXRfbGluZV9wb2ludGVyICE9ICdcdCcpCi0JewotCSAgb2JzdGFja18xZ3JvdyAoJm5vdGVzLCAqaW5wdXRfbGluZV9wb2ludGVyKTsKLQkgICsraW5wdXRfbGluZV9wb2ludGVyOwotCSAgKytpOwotCX0KLSAgICAgIG9ic3RhY2tfMWdyb3cgKCZub3RlcywgJ1wwJyk7Ci0gICAgICBmaWxlbmFtZSA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOwotICAgICAgd2hpbGUgKCEgaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotCSsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgZGVtYW5kX2VtcHR5X3Jlc3Rfb2ZfbGluZSAoKTsKLSAgcGF0aCA9IHhtYWxsb2MgKCh1bnNpZ25lZCBsb25nKSBpICsgaW5jbHVkZV9kaXJfbWF4bGVuICsgNSAvKiBzbG9wICovICk7Ci0gIGZvciAoaSA9IDA7IGkgPCBpbmNsdWRlX2Rpcl9jb3VudDsgaSsrKQotICAgIHsKLSAgICAgIHN0cmNweSAocGF0aCwgaW5jbHVkZV9kaXJzW2ldKTsKLSAgICAgIHN0cmNhdCAocGF0aCwgIi8iKTsKLSAgICAgIHN0cmNhdCAocGF0aCwgZmlsZW5hbWUpOwotICAgICAgaWYgKDAgIT0gKHRyeSA9IGZvcGVuIChwYXRoLCAiciIpKSkKLQl7Ci0JICBmY2xvc2UgKHRyeSk7Ci0JICBnb3RvIGdvdGl0OwotCX0KLSAgICB9Ci0gIGZyZWUgKHBhdGgpOwotICBwYXRoID0gZmlsZW5hbWU7Ci1nb3RpdDoKLSAgLyogbWFsbG9jIFN0b3JhZ2UgbGVhayB3aGVuIGZpbGUgaXMgZm91bmQgb24gcGF0aC4gIEZJWE1FLVNPTUVEQVkuICovCi0gIHJlZ2lzdGVyX2RlcGVuZGVuY3kgKHBhdGgpOwotICBuZXdidWYgPSBpbnB1dF9zY3J1Yl9pbmNsdWRlX2ZpbGUgKHBhdGgsIGlucHV0X2xpbmVfcG9pbnRlcik7Ci0gIGJ1ZmZlcl9saW1pdCA9IGlucHV0X3NjcnViX25leHRfYnVmZmVyICgmaW5wdXRfbGluZV9wb2ludGVyKTsKLX0JCQkJLyogc19pbmNsdWRlKCkgKi8KLQotdm9pZCAKLWFkZF9pbmNsdWRlX2RpciAocGF0aCkKLSAgICAgY2hhciAqcGF0aDsKLXsKLSAgaW50IGk7Ci0KLSAgaWYgKGluY2x1ZGVfZGlyX2NvdW50ID09IDApCi0gICAgewotICAgICAgaW5jbHVkZV9kaXJzID0gKGNoYXIgKiopIHhtYWxsb2MgKDIgKiBzaXplb2YgKCppbmNsdWRlX2RpcnMpKTsKLSAgICAgIGluY2x1ZGVfZGlyc1swXSA9ICIuIjsJLyogQ3VycmVudCBkaXIgKi8KLSAgICAgIGluY2x1ZGVfZGlyX2NvdW50ID0gMjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmNsdWRlX2Rpcl9jb3VudCsrOwotICAgICAgaW5jbHVkZV9kaXJzID0gKGNoYXIgKiopIHJlYWxsb2MgKGluY2x1ZGVfZGlycywKLQkJCQlpbmNsdWRlX2Rpcl9jb3VudCAqIHNpemVvZiAoKmluY2x1ZGVfZGlycykpOwotICAgIH0KLQotICBpbmNsdWRlX2RpcnNbaW5jbHVkZV9kaXJfY291bnQgLSAxXSA9IHBhdGg7CS8qIE5ldyBvbmUgKi8KLQotICBpID0gc3RybGVuIChwYXRoKTsKLSAgaWYgKGkgPiBpbmNsdWRlX2Rpcl9tYXhsZW4pCi0gICAgaW5jbHVkZV9kaXJfbWF4bGVuID0gaTsKLX0JCQkJLyogYWRkX2luY2x1ZGVfZGlyKCkgKi8KLQwKLS8qIE91dHB1dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gZGVub3RlIHRoZSBzb3VyY2UgZmlsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9maWxlX2RlYnVnICgpCi17Ci0gIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1NUQUJTKQotICAgIHN0YWJzX2dlbmVyYXRlX2FzbV9maWxlICgpOwotfQotCi0vKiBPdXRwdXQgbGluZSBudW1iZXIgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgY3VycmVudCBzb3VyY2UgbGluZS4gICovCi0KLXZvaWQKLWdlbmVyYXRlX2xpbmVub19kZWJ1ZyAoKQotewotI2lmZGVmIEVDT0ZGX0RFQlVHR0lORwotICAvKiBFQ09GRiBhc3NlbWJsZXJzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAKLSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGhhbmRsZWQgZWxzZXdoZXJlLiAgKi8KLSAgaWYgKGRlYnVnX3R5cGUgPT0gREVCVUdfVU5TUEVDSUZJRUQpCi0gICAgewotICAgICAgaWYgKEVDT0ZGX0RFQlVHR0lORyAmJiBlY29mZl9ub19jdXJyZW50X2ZpbGUgKCkpCi0gICAgICAgIGRlYnVnX3R5cGUgPSBERUJVR19FQ09GRjsKLSAgICAgIGVsc2UKLQlkZWJ1Z190eXBlID0gREVCVUdfTk9ORTsKLSAgICB9Ci0jZW5kaWYKLQotICBzd2l0Y2ggKGRlYnVnX3R5cGUpCi0gICAgewotICAgIGNhc2UgREVCVUdfVU5TUEVDSUZJRUQ6Ci0gICAgY2FzZSBERUJVR19OT05FOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERUJVR19TVEFCUzoKLSAgICAgIHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8gKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIERFQlVHX0VDT0ZGOgotICAgICAgZWNvZmZfZ2VuZXJhdGVfYXNtX2xpbmVubyAoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVCVUdfRFdBUkY6Ci0gICAgY2FzZSBERUJVR19EV0FSRjI6Ci0gICAgICAvKiBGSVhNRS4gICovCi0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIE91dHB1dCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gbWFyayBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50IG9yIGVuZCBwb2ludC4KLSAgIEVORF9QIGlzIHplcm8gZm9yIC5mdW5jLCBhbmQgbm9uLXplcm8gZm9yIC5lbmRmdW5jLiAgKi8KLQotdm9pZAotc19mdW5jIChlbmRfcCkKLSAgICAgaW50IGVuZF9wOwotewotICBkb19zX2Z1bmMgKGVuZF9wLCBOVUxMKTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBzX2Z1bmMgc28gdGFyZ2V0cyBjYW4gY2hvb3NlIGEgZGlmZmVyZW50IGRlZmF1bHQgcHJlZml4LgotICAgSWYgREVGQVVMVF9QUkVGSVggaXMgTlVMTCwgdXNlIHRoZSB0YXJnZXQncyAibGVhZGluZyBjaGFyIi4gICovCi0KLXZvaWQKLWRvX3NfZnVuYyAoZW5kX3AsIGRlZmF1bHRfcHJlZml4KQotICAgICBpbnQgZW5kX3A7Ci0gICAgIGNvbnN0IGNoYXIgKmRlZmF1bHRfcHJlZml4OwotewotICAvKiBSZWNvcmQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gc28gdGhhdCB3ZSBjYW4gaXNzdWUgYW4gZXJyb3IgbWVzc2FnZSBmb3IKLSAgICAgbWlzcGxhY2VkIC5mdW5jLC5lbmRmdW5jLCBhbmQgYWxzbyBzbyB0aGF0IC5lbmRmdW5jIG5lZWRzIG5vCi0gICAgIGFyZ3VtZW50cy4gICovCi0gIHN0YXRpYyBjaGFyICpjdXJyZW50X25hbWU7Ci0gIHN0YXRpYyBjaGFyICpjdXJyZW50X2xhYmVsOwotCi0gIGlmIChlbmRfcCkKLSAgICB7Ci0gICAgICBpZiAoY3VycmVudF9uYW1lID09IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCJtaXNzaW5nIC5mdW5jIikpOwotCSAgaWdub3JlX3Jlc3Rfb2ZfbGluZSAoKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChkZWJ1Z190eXBlID09IERFQlVHX1NUQUJTKQotCXN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jIChjdXJyZW50X25hbWUsIGN1cnJlbnRfbGFiZWwpOwotCi0gICAgICBjdXJyZW50X25hbWUgPSBjdXJyZW50X2xhYmVsID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UgLyogISBlbmRfcCAqLwotICAgIHsKLSAgICAgIGNoYXIgKm5hbWUsKmxhYmVsOwotICAgICAgY2hhciBkZWxpbTEsZGVsaW0yOwotCi0gICAgICBpZiAoY3VycmVudF9uYW1lICE9IE5VTEwpCi0JewotCSAgYXNfYmFkIChfKCIuZW5kZnVuYyBtaXNzaW5nIGZvciBwcmV2aW91cyAuZnVuYyIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICBuYW1lID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAgICAgZGVsaW0xID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0gICAgICBuYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gICAgICAqaW5wdXRfbGluZV9wb2ludGVyID0gZGVsaW0xOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGlmIChkZWZhdWx0X3ByZWZpeCkKLQkgICAgYXNwcmludGYgKCZsYWJlbCwgIiVzJXMiLCBkZWZhdWx0X3ByZWZpeCwgbmFtZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyIGxlYWRpbmdfY2hhciA9IDA7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgICAgIGxlYWRpbmdfY2hhciA9IGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAoc3Rkb3V0cHV0KTsKLSNlbmRpZgotCSAgICAgIC8qIE1pc3NpbmcgZW50cnkgcG9pbnQsIHVzZSBmdW5jdGlvbidzIG5hbWUgd2l0aCB0aGUgbGVhZGluZwotCQkgY2hhciBwcmVwZW5kZWQuICAqLwotCSAgICAgIGlmIChsZWFkaW5nX2NoYXIpCi0JCWFzcHJpbnRmICgmbGFiZWwsICIlYyVzIiwgbGVhZGluZ19jaGFyLCBuYW1lKTsKLQkgICAgICBlbHNlCi0JCWxhYmVsID0gbmFtZTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICArK2lucHV0X2xpbmVfcG9pbnRlcjsKLQkgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLQkgIGxhYmVsID0gaW5wdXRfbGluZV9wb2ludGVyOwotCSAgZGVsaW0yID0gZ2V0X3N5bWJvbF9lbmQgKCk7Ci0JICBsYWJlbCA9IHhzdHJkdXAgKGxhYmVsKTsKLQkgICppbnB1dF9saW5lX3BvaW50ZXIgPSBkZWxpbTI7Ci0JfQotCi0gICAgICBpZiAoZGVidWdfdHlwZSA9PSBERUJVR19TVEFCUykKLQlzdGFic19nZW5lcmF0ZV9hc21fZnVuYyAobmFtZSwgbGFiZWwpOwotCi0gICAgICBjdXJyZW50X25hbWUgPSBuYW1lOwotICAgICAgY3VycmVudF9sYWJlbCA9IGxhYmVsOwotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotDAotdm9pZCAKLXNfaWdub3JlIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIHdoaWxlICghaXNfZW5kX29mX2xpbmVbKHVuc2lnbmVkIGNoYXIpICppbnB1dF9saW5lX3BvaW50ZXJdKQotICAgIHsKLSAgICAgICsraW5wdXRfbGluZV9wb2ludGVyOwotICAgIH0KLSAgKytpbnB1dF9saW5lX3BvaW50ZXI7Ci19Ci0KLQotdm9pZAotcmVhZF9wcmludF9zdGF0aXN0aWNzIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJwc2V1ZG8tb3AgdGFibGUiLCBwb19oYXNoKTsKLX0KLQotLyogZW5kIG9mIHJlYWQuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3JlYWQuaCBiL2dhcy9yZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlM2IxMDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3JlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKiByZWFkLmggLSBvZiByZWFkLmMKLSAgIENvcHlyaWdodCAoQykgMTk4NiwgOTAsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NwotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGNoYXIgKmlucHV0X2xpbmVfcG9pbnRlcjsvKiAtPiBjaGFyIHdlIGFyZSBwYXJzaW5nIG5vdy4gKi8KLQotI2RlZmluZSBQRVJNSVRfV0hJVEVTUEFDRQkvKiBEZWZpbmUgdG8gbWFrZSB3aGl0ZXNwYWNlIGJlIGFsbG93ZWQgaW4gKi8KLS8qIG1hbnkgc3ludGFjdGljYWxseSB1bm5lY2Vzc2FyeSBwbGFjZXMuICovCi0vKiBOb3JtYWxseSB1bmRlZmluZWQuIEZvciBjb21wYXRpYmlsaXR5ICovCi0vKiB3aXRoIGFuY2llbnQgR05VIGNjLiAqLwotLyogI3VuZGVmIFBFUk1JVF9XSElURVNQQUNFICovCi0KLSNpZmRlZiBQRVJNSVRfV0hJVEVTUEFDRQotI2RlZmluZSBTS0lQX1dISVRFU1BBQ0UoKSB7aWYgKCogaW5wdXRfbGluZV9wb2ludGVyID09ICcgJykgKysgaW5wdXRfbGluZV9wb2ludGVyO30KLSNlbHNlCi0jZGVmaW5lIFNLSVBfV0hJVEVTUEFDRSgpIGtub3coKmlucHV0X2xpbmVfcG9pbnRlciAhPSAnICcgKQotI2VuZGlmCi0KLQotI2RlZmluZQlMRVhfTkFNRQkoMSkJLyogbWF5IGNvbnRpbnVlIGEgbmFtZSAqLwotI2RlZmluZSBMRVhfQkVHSU5fTkFNRQkoMikJLyogbWF5IGJlZ2luIGEgbmFtZSAqLwotI2RlZmluZSBMRVhfRU5EX05BTUUJKDQpCS8qIGVuZHMgYSBuYW1lICovCi0KLSNkZWZpbmUgaXNfbmFtZV9iZWdpbm5lcihjKSBcCi0gICggbGV4X3R5cGVbKHVuc2lnbmVkIGNoYXIpIChjKV0gJiBMRVhfQkVHSU5fTkFNRSApCi0jZGVmaW5lIGlzX3BhcnRfb2ZfbmFtZShjKSBcCi0gICggbGV4X3R5cGVbKHVuc2lnbmVkIGNoYXIpIChjKV0gJiBMRVhfTkFNRSAgICAgICApCi0jZGVmaW5lIGlzX25hbWVfZW5kZXIoYykgXAotICAoIGxleF90eXBlWyh1bnNpZ25lZCBjaGFyKSAoYyldICYgTEVYX0VORF9OQU1FICAgKQotCi0jaWZuZGVmIGlzX2FfY2hhcgotI2RlZmluZSBDSEFSX01BU0sJKDB4ZmYpCi0jZGVmaW5lIE5PVF9BX0NIQVIJKENIQVJfTUFTSysxKQotI2RlZmluZSBpc19hX2NoYXIoYykJKCgodW5zaWduZWQpKGMpKSA8PSBDSEFSX01BU0spCi0jZW5kaWYgLyogaXNfYV9jaGFyKCkgKi8KLQotZXh0ZXJuIGNoYXIgbGV4X3R5cGVbXTsKLWV4dGVybiBjaGFyIGlzX2VuZF9vZl9saW5lW107Ci0KLWV4dGVybiBpbnQgaXNfaXRfZW5kX29mX3N0YXRlbWVudCBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiBpbnQgdGFyZ2V0X2JpZ19lbmRpYW47Ci0KLS8qIFRoZXNlIGFyZSBpbml0aWFsaXplZCBieSB0aGUgQ1BVIHNwZWNpZmljIHRhcmdldCBmaWxlcyAodGMtKi5jKS4gICovCi1leHRlcm4gY29uc3QgY2hhciBjb21tZW50X2NoYXJzW107Ci1leHRlcm4gY29uc3QgY2hhciBsaW5lX2NvbW1lbnRfY2hhcnNbXTsKLWV4dGVybiBjb25zdCBjaGFyIGxpbmVfc2VwYXJhdG9yX2NoYXJzW107Ci0KLS8qIFRhYmxlIG9mIC1JIGRpcmVjdG9yaWVzLiAgKi8KLWV4dGVybiBjaGFyICoqaW5jbHVkZV9kaXJzOwotZXh0ZXJuIGludCBpbmNsdWRlX2Rpcl9jb3VudDsKLWV4dGVybiBpbnQgaW5jbHVkZV9kaXJfbWF4bGVuOwotCi0vKiBUaGUgb2Zmc2V0IGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLWV4dGVybiBhZGRyZXNzVCBhYnNfc2VjdGlvbl9vZmZzZXQ7Ci0KLS8qIFRoZSBsYWJlbCBvbiBhIGxpbmUsIHVzZWQgYnkgc29tZSBvZiB0aGUgcHNldWRvLW9wcy4gICovCi1leHRlcm4gc3ltYm9sUyAqbGluZV9sYWJlbDsKLQotLyogVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgTVJJIGNvbW1vbiBzZWN0aW9ucy4gICovCi1leHRlcm4gc3ltYm9sUyAqbXJpX2NvbW1vbl9zeW1ib2w7Ci0KLS8qIFBvc3NpYmxlIGFyZ3VtZW50cyB0byAubGlua29uY2UuICAqLwotZW51bSBsaW5rb25jZV90eXBlCi17Ci0gIExJTktPTkNFX1VOU0VUID0gMCwKLSAgTElOS09OQ0VfRElTQ0FSRCwKLSAgTElOS09OQ0VfT05FX09OTFksCi0gIExJTktPTkNFX1NBTUVfU0laRSwKLSAgTElOS09OQ0VfU0FNRV9DT05URU5UUwotfTsKLQotZXh0ZXJuIHZvaWQgcG9wX2luc2VydCBQQVJBTVMgKChjb25zdCBwc2V1ZG9fdHlwZVMgKikpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqc3RhYnN0cl9zZWNuYW1lKSk7Ci1leHRlcm4gY2hhciAqZGVtYW5kX2NvcHlfQ19zdHJpbmcgUEFSQU1TICgoaW50ICpsZW5fcG9pbnRlcikpOwotZXh0ZXJuIGNoYXIgZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IKLSAgUEFSQU1TICgobG9uZyAqdmFsX3BvaW50ZXIpKTsKLWV4dGVybiBvZmZzZXRUIGdldF9hYnNvbHV0ZV9leHByZXNzaW9uIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgbmV4dF9jaGFyX29mX3N0cmluZyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzX21yaV9zZWN0IFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIGNoYXIgKm1yaV9jb21tZW50X2ZpZWxkIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbXJpX2NvbW1lbnRfZW5kIFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBhZGRfaW5jbHVkZV9kaXIgUEFSQU1TICgoY2hhciAqcGF0aCkpOwotZXh0ZXJuIHZvaWQgY29ucyBQQVJBTVMgKChpbnQgbmJ5dGVzKSk7Ci1leHRlcm4gdm9pZCBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGVtaXRfZXhwciBQQVJBTVMgKChleHByZXNzaW9uUyAqZXhwLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKSk7Ci1leHRlcm4gdm9pZCBlbWl0X2xlYjEyOF9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICosIGludCkpOwotZXh0ZXJuIHZvaWQgZXF1YWxzIFBBUkFNUyAoKGNoYXIgKnN5bV9uYW1lLCBpbnQgcmVhc3NpZ24pKTsKLWV4dGVybiB2b2lkIGZsb2F0X2NvbnMgUEFSQU1TICgoaW50IGZsb2F0X3R5cGUpKTsKLWV4dGVybiB2b2lkIGlnbm9yZV9yZXN0X29mX2xpbmUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgZGlzY2FyZF9yZXN0X29mX2xpbmUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGludCBvdXRwdXRfbGViMTI4IFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQgc2lnbikpOwotZXh0ZXJuIHZvaWQgcHNldWRvX3NldCBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOwotZXh0ZXJuIHZvaWQgcmVhZF9hX3NvdXJjZV9maWxlIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIHJlYWRfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcmVhZF9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOwotZXh0ZXJuIGludCBzaXplb2ZfbGViMTI4IFBBUkFNUyAoKHZhbHVlVCwgaW50IHNpZ24pKTsKLWV4dGVybiB2b2lkIHN0YWJzX2dlbmVyYXRlX2FzbV9maWxlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHN0YWJzX2dlbmVyYXRlX2FzbV9lbmRmdW5jIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLWV4dGVybiB2b2lkIGdlbmVyYXRlX2xpbmVub19kZWJ1ZyBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIHNfYWJvcnQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2FsaWduX2J5dGVzIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfYWxpZ25fcHR3byBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfYXBwX2ZpbGUgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2FwcF9saW5lIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19jb21tIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19kYXRhIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19kZXNjIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19lbHNlIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfZW5kIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfZW5kaWYgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19lcnIgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2ZhaWwgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2ZpbGwgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2Zsb2F0X3NwYWNlIFBBUkFNUyAoKGludCBtdWx0KSk7Ci1leHRlcm4gdm9pZCBzX2Z1bmMgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBkb19zX2Z1bmMgUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIHNfZ2xvYmwgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZiBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lmYyBQQVJBTVMgKChpbnQgYXJnKSk7Ci1leHRlcm4gdm9pZCBzX2lmZGVmIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaWZlcXMgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pZ25vcmUgUEFSQU1TICgoaW50IGFyZykpOwotZXh0ZXJuIHZvaWQgc19pbmNsdWRlIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfaXJwIFBBUkFNUyAoKGludCBhcmcpKTsKLWV4dGVybiB2b2lkIHNfbGNvbW0gUEFSQU1TICgoaW50IG5lZWRzX2FsaWduKSk7Ci1leHRlcm4gdm9pZCBzX2xjb21tX2J5dGVzIFBBUkFNUyAoKGludCBuZWVkc19hbGlnbikpOwotZXh0ZXJuIHZvaWQgc19sZWIxMjggUEFSQU1TICgoaW50IHNpZ24pKTsKLWV4dGVybiB2b2lkIHNfbGlua29uY2UgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX2xzeW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX21hY3JvIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19tZXhpdCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfbXJpIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19tcmlfY29tbW9uIFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19vcmcgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3ByaW50IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIHZvaWQgc19wdXJnZW0gUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3JlcHQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3NldCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiB2b2lkIHNfc3BhY2UgUEFSQU1TICgoaW50IG11bHQpKTsKLWV4dGVybiB2b2lkIHNfc3RhYiBQQVJBTVMgKChpbnQgd2hhdCkpOwotZXh0ZXJuIHZvaWQgc19zdHJ1Y3QgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzX3RleHQgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gdm9pZCBzdHJpbmdlciBQQVJBTVMgKChpbnQgYXBwZW5kX3plcm8pKTsKLWV4dGVybiB2b2lkIHNfeHN0YWIgUEFSQU1TICgoaW50IHdoYXQpKTsKLWV4dGVybiB2b2lkIHNfcnZhIFBBUkFNUyAoKGludCkpOwotCi0vKiBlbmQgb2YgcmVhZC5oICovCmRpZmYgLS1naXQgYS9nYXMvc2IuYyBiL2dhcy9zYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWMyM2ZjLi4wMDAwMDAwCi0tLSBhL2dhcy9zYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qIHNiLmMgLSBzdHJpbmcgYnVmZmVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcwotICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFN0ZXZlIGFuZCBKdWR5IENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0LAotICAgICAgc2FjQGN5Z251cy5jb20KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInNiLmgiCi0KLS8qIFRoZXNlIHJvdXRpbmVzIGFyZSBhYm91dCBtYW5pcHVsYXRpbmcgc3RyaW5ncy4KLQotICAgVGhleSBhcmUgbWFuYWdlZCBpbiB0aGluZ3MgY2FsbGVkIGBzYidzIHdoaWNoIGlzIGFuIGFiYnJldmlhdGlvbgotICAgZm9yIHN0cmluZyBidWZmZXJzLiAgQW4gc2IgaGFzIHRvIGJlIGNyZWF0ZWQsIHRoaW5ncyBjYW4gYmUgZ2x1ZWQKLSAgIG9uIHRvIGl0LCBhbmQgYXQgdGhlIGVuZCBvZiBpdCdzIGxpZmUgaXQgc2hvdWxkIGJlIGZyZWVkLiAgVGhlCi0gICBjb250ZW50cyBzaG91bGQgbmV2ZXIgYmUgcG9pbnRlZCBhdCB3aGlsc3QgaXQgaXMgc3RpbGwgZ3Jvd2luZywKLSAgIHNpbmNlIGl0IGNvdWxkIGJlIG1vdmVkIGF0IGFueSB0aW1lCi0KLSAgIGVnOgotICAgc2JfbmV3ICgmZm9vKTsKLSAgIHNiX2dyb3cuLi4gKCZmb28sLi4uKTsKLSAgIHVzZSBmb28tPnB0clsqXTsKLSAgIHNiX2tpbGwgKCZmb28pOwotCi0qLwotCi0jZGVmaW5lIGRzaXplIDUKLQotc3RhdGljIHZvaWQgc2JfY2hlY2sgUEFSQU1TICgoc2IgKiwgaW50KSk7Ci0KLS8qIFN0YXRpc3RpY3Mgb2Ygc2Igc3RydWN0dXJlcy4gICovCi0KLWludCBzdHJpbmdfY291bnRbc2JfbWF4X3Bvd2VyX3R3b107Ci0KLS8qIEZyZWUgbGlzdCBvZiBzYiBzdHJ1Y3R1cmVzLiAgKi8KLQotc3RhdGljIHNiX2xpc3RfdmVjdG9yIGZyZWVfbGlzdDsKLQotLyogaW5pdGlhbGl6ZXMgYW4gc2IuICovCi0KLXZvaWQKLXNiX2J1aWxkIChwdHIsIHNpemUpCi0gICAgIHNiICpwdHI7Ci0gICAgIGludCBzaXplOwotewotICAvKiBzZWUgaWYgd2UgY2FuIGZpbmQgb25lIHRvIGFsbG9jYXRlICovCi0gIHNiX2VsZW1lbnQgKmU7Ci0KLSAgaWYgKHNpemUgPiBzYl9tYXhfcG93ZXJfdHdvKQotICAgIGFib3J0ICgpOwotCi0gIGUgPSBmcmVlX2xpc3Quc2l6ZVtzaXplXTsKLSAgaWYgKCFlKQotICAgIHsKLSAgICAgIC8qIG5vdGhpbmcgdGhlcmUsIGFsbG9jYXRlIG9uZSBhbmQgc3RpY2sgaW50byB0aGUgZnJlZSBsaXN0ICovCi0gICAgICBlID0gKHNiX2VsZW1lbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChzYl9lbGVtZW50KSArICgxIDw8IHNpemUpKTsKLSAgICAgIGUtPm5leHQgPSBmcmVlX2xpc3Quc2l6ZVtzaXplXTsKLSAgICAgIGUtPnNpemUgPSAxIDw8IHNpemU7Ci0gICAgICBmcmVlX2xpc3Quc2l6ZVtzaXplXSA9IGU7Ci0gICAgICBzdHJpbmdfY291bnRbc2l6ZV0rKzsKLSAgICB9Ci0KLSAgLyogcmVtb3ZlIGZyb20gZnJlZSBsaXN0ICovCi0KLSAgZnJlZV9saXN0LnNpemVbc2l6ZV0gPSBlLT5uZXh0OwotCi0gIC8qIGNvcHkgaW50byBjYWxsZXJzIHdvcmxkICovCi0gIHB0ci0+cHRyID0gZS0+ZGF0YTsKLSAgcHRyLT5wb3QgPSBzaXplOwotICBwdHItPmxlbiA9IDA7Ci0gIHB0ci0+aXRlbSA9IGU7Ci19Ci0KLQotdm9pZAotc2JfbmV3IChwdHIpCi0gICAgIHNiICpwdHI7Ci17Ci0gIHNiX2J1aWxkIChwdHIsIGRzaXplKTsKLX0KLQotLyogZGVhbGxvY2F0ZSB0aGUgc2IgYXQgcHRyICovCi0KLXZvaWQKLXNiX2tpbGwgKHB0cikKLSAgICAgc2IgKnB0cjsKLXsKLSAgLyogcmV0dXJuIGl0ZW0gdG8gZnJlZSBsaXN0ICovCi0gIHB0ci0+aXRlbS0+bmV4dCA9IGZyZWVfbGlzdC5zaXplW3B0ci0+cG90XTsKLSAgZnJlZV9saXN0LnNpemVbcHRyLT5wb3RdID0gcHRyLT5pdGVtOwotfQotCi0vKiBhZGQgdGhlIHNiIGF0IHMgdG8gdGhlIGVuZCBvZiB0aGUgc2IgYXQgcHRyICovCi0KLXZvaWQKLXNiX2FkZF9zYiAocHRyLCBzKQotICAgICBzYiAqcHRyOwotICAgICBzYiAqczsKLXsKLSAgc2JfY2hlY2sgKHB0ciwgcy0+bGVuKTsKLSAgbWVtY3B5IChwdHItPnB0ciArIHB0ci0+bGVuLCBzLT5wdHIsIHMtPmxlbik7Ci0gIHB0ci0+bGVuICs9IHMtPmxlbjsKLX0KLQotLyogbWFrZSBzdXJlIHRoYXQgdGhlIHNiIGF0IHB0ciBoYXMgcm9vbSBmb3IgYW5vdGhlciBsZW4gY2hhcmFjdGVycywKLSAgIGFuZCBncm93IGl0IGlmIGl0IGRvZXNuJ3QuICovCi0KLXN0YXRpYyB2b2lkCi1zYl9jaGVjayAocHRyLCBsZW4pCi0gICAgIHNiICpwdHI7Ci0gICAgIGludCBsZW47Ci17Ci0gIGlmIChwdHItPmxlbiArIGxlbiA+PSAxIDw8IHB0ci0+cG90KQotICAgIHsKLSAgICAgIHNiIHRtcDsKLSAgICAgIGludCBwb3QgPSBwdHItPnBvdDsKLSAgICAgIHdoaWxlIChwdHItPmxlbiArIGxlbiA+PSAxIDw8IHBvdCkKLQlwb3QrKzsKLSAgICAgIHNiX2J1aWxkICgmdG1wLCBwb3QpOwotICAgICAgc2JfYWRkX3NiICgmdG1wLCBwdHIpOwotICAgICAgc2Jfa2lsbCAocHRyKTsKLSAgICAgICpwdHIgPSB0bXA7Ci0gICAgfQotfQotCi0vKiBtYWtlIHRoZSBzYiBhdCBwdHIgcG9pbnQgYmFjayB0byB0aGUgYmVnaW5uaW5nLiAgKi8KLQotdm9pZAotc2JfcmVzZXQgKHB0cikKLSAgICAgc2IgKnB0cjsKLXsKLSAgcHRyLT5sZW4gPSAwOwotfQotCi0vKiBhZGQgY2hhcmFjdGVyIGMgdG8gdGhlIGVuZCBvZiB0aGUgc2IgYXQgcHRyLiAqLwotCi12b2lkCi1zYl9hZGRfY2hhciAocHRyLCBjKQotICAgICBzYiAqcHRyOwotICAgICBpbnQgYzsKLXsKLSAgc2JfY2hlY2sgKHB0ciwgMSk7Ci0gIHB0ci0+cHRyW3B0ci0+bGVuKytdID0gYzsKLX0KLQotLyogYWRkIG51bGwgdGVybWluYXRlZCBzdHJpbmcgcyB0byB0aGUgZW5kIG9mIHNiIGF0IHB0ci4gKi8KLQotdm9pZAotc2JfYWRkX3N0cmluZyAocHRyLCBzKQotICAgICBzYiAqcHRyOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpbnQgbGVuID0gc3RybGVuIChzKTsKLSAgc2JfY2hlY2sgKHB0ciwgbGVuKTsKLSAgbWVtY3B5IChwdHItPnB0ciArIHB0ci0+bGVuLCBzLCBsZW4pOwotICBwdHItPmxlbiArPSBsZW47Ci19Ci0KLS8qIGFkZCBzdHJpbmcgYXQgcyBvZiBsZW5ndGggbGVuIHRvIHNiIGF0IHB0ciAqLwotCi12b2lkCi1zYl9hZGRfYnVmZmVyIChwdHIsIHMsIGxlbikKLSAgICAgc2IgKnB0cjsKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IGxlbjsKLXsKLSAgc2JfY2hlY2sgKHB0ciwgbGVuKTsKLSAgbWVtY3B5IChwdHItPnB0ciArIHB0ci0+bGVuLCBzLCBsZW4pOwotICBwdHItPmxlbiArPSBsZW47Ci19Ci0KLS8qIHByaW50IHRoZSBzYiBhdCBwdHIgdG8gdGhlIG91dHB1dCBmaWxlICovCi0KLXZvaWQKLXNiX3ByaW50IChvdXRmaWxlLCBwdHIpCi0gICAgIEZJTEUgKm91dGZpbGU7Ci0gICAgIHNiICpwdHI7Ci17Ci0gIGludCBpOwotICBpbnQgbmMgPSAwOwotCi0gIGZvciAoaSA9IDA7IGkgPCBwdHItPmxlbjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChuYykKLQl7Ci0JICBmcHJpbnRmIChvdXRmaWxlLCAiLCIpOwotCX0KLSAgICAgIGZwcmludGYgKG91dGZpbGUsICIlZCIsIHB0ci0+cHRyW2ldKTsKLSAgICAgIG5jID0gMTsKLSAgICB9Ci19Ci0KLXZvaWQgCi1zYl9wcmludF9hdCAob3V0ZmlsZSwgaWR4LCBwdHIpCi0gICAgIEZJTEUgKm91dGZpbGU7Ci0gICAgIGludCBpZHg7Ci0gICAgIHNiICpwdHI7Ci17Ci0gIGludCBpOwotICBmb3IgKGkgPSBpZHg7IGkgPCBwdHItPmxlbjsgaSsrKQotICAgIHB1dGMgKHB0ci0+cHRyW2ldLCBvdXRmaWxlKTsKLX0KLQotLyogcHV0IGEgbnVsbCBhdCB0aGUgZW5kIG9mIHRoZSBzYiBhdCBpbiBhbmQgcmV0dXJuIHRoZSBzdGFydCBvZiB0aGUKLSAgIHN0cmluZywgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhbiBhcmcgdG8gcHJpbnRmICVzLiAqLwotCi1jaGFyICoKLXNiX25hbWUgKGluKQotICAgICBzYiAqaW47Ci17Ci0gIC8qIHN0aWNrIGEgbnVsbCBvbiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KLSAgc2JfYWRkX2NoYXIgKGluLCAwKTsKLSAgcmV0dXJuIGluLT5wdHI7Ci19Ci0KLS8qIGxpa2Ugc2JfbmFtZSwgYnV0IGRvbid0IGluY2x1ZGUgdGhlIG51bGwgYnl0ZSBpbiB0aGUgc3RyaW5nLiAgKi8KLQotY2hhciAqCi1zYl90ZXJtaW5hdGUgKGluKQotICAgICBzYiAqaW47Ci17Ci0gIHNiX2FkZF9jaGFyIChpbiwgMCk7Ci0gIC0taW4tPmxlbjsKLSAgcmV0dXJuIGluLT5wdHI7Ci19Ci0KLS8qIHN0YXJ0IGF0IHRoZSBpbmRleCBpZHggaW50byB0aGUgc3RyaW5nIGluIHNiIGF0IHB0ciBhbmQgc2tpcAotICAgd2hpdGVzcGFjZS4gcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgbm9uIHdoaXRlc3BhY2UgY2hhcmFjdGVyICovCi0KLWludAotc2Jfc2tpcF93aGl0ZSAoaWR4LCBwdHIpCi0gICAgIGludCBpZHg7Ci0gICAgIHNiICpwdHI7Ci17Ci0gIHdoaWxlIChpZHggPCBwdHItPmxlbgotCSAmJiAocHRyLT5wdHJbaWR4XSA9PSAnICcKLQkgICAgIHx8IHB0ci0+cHRyW2lkeF0gPT0gJ1x0JykpCi0gICAgaWR4Kys7Ci0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIHN0YXJ0IGF0IHRoZSBpbmRleCBpZHggaW50byB0aGUgc2IgYXQgcHRyLiBza2lwcyB3aGl0ZXNwYWNlLAotICAgYSBjb21tYSBhbmQgYW55IGZvbGxvd2luZyB3aGl0ZXNwYWNlLiByZXR1cm5lcyB0aGUgaW5kZXggb2YgdGhlCi0gICBuZXh0IGNoYXJhY3Rlci4gKi8KLQotaW50Ci1zYl9za2lwX2NvbW1hIChpZHgsIHB0cikKLSAgICAgaW50IGlkeDsKLSAgICAgc2IgKnB0cjsKLXsKLSAgd2hpbGUgKGlkeCA8IHB0ci0+bGVuCi0JICYmIChwdHItPnB0cltpZHhdID09ICcgJwotCSAgICAgfHwgcHRyLT5wdHJbaWR4XSA9PSAnXHQnKSkKLSAgICBpZHgrKzsKLQotICBpZiAoaWR4IDwgcHRyLT5sZW4KLSAgICAgICYmIHB0ci0+cHRyW2lkeF0gPT0gJywnKQotICAgIGlkeCsrOwotCi0gIHdoaWxlIChpZHggPCBwdHItPmxlbgotCSAmJiAocHRyLT5wdHJbaWR4XSA9PSAnICcKLQkgICAgIHx8IHB0ci0+cHRyW2lkeF0gPT0gJ1x0JykpCi0gICAgaWR4Kys7Ci0KLSAgcmV0dXJuIGlkeDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9zYi5oIGIvZ2FzL3NiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNmRhZjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3NiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKiBzYi5oIC0gaGVhZGVyIGZpbGUgZm9yIHN0cmluZyBidWZmZXIgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgU3RldmUgYW5kIEp1ZHkgQ2hhbWJlcmxhaW4gb2YgQ3lnbnVzIFN1cHBvcnQsCi0gICAgICBzYWNAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZm5kZWYgU0JfSAotCi0jZGVmaW5lIFNCX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogc3RyaW5nIGJsb2NrcwotCi0gICBJIGhhZCBhIGNvdXBsZSBvZiBjaG9pY2VzIHdoZW4gZGVjaWRpbmcgdXBvbiB0aGlzIGRhdGEgc3RydWN0dXJlLgotICAgZ2FzIHVzZXMgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MgZm9yIGFsbCBpdHMgaW50ZXJuYWwgd29yay4gIFRoaXMKLSAgIG9mdGVuIG1lYW5zIHRoYXQgcGFydHMgb2YgdGhlIHByb2dyYW0gdGhhdCB3YW50IHRvIGV4YW1pbmUKLSAgIHN1YnN0cmluZ3MgaGF2ZSB0byBtYW5pcHVsYXRlIHRoZSBkYXRhIGluIHRoZSBzdHJpbmcgdG8gZG8gdGhlCi0gICByaWdodCB0aGluZyAoYSBjb21tb24gb3BlcmF0aW9uIGlzIHRvIHNpbmdsZSBvdXQgYSBiaXQgb2YgdGV4dCBieQotICAgc2F2aW5nIGF3YXkgdGhlIGNoYXJhY3RlciBhZnRlciBpdCwgbnVsbGluZyBpdCBvdXQsIG9wZXJhdGluZyBvbgotICAgdGhlIHN1YnN0cmluZyBhbmQgdGhlbiByZXBsYWNpbmcgdGhlIGNoYXJhY3RlciB3aGljaCB3YXMgdW5kZXIgdGhlCi0gICBudWxsKS4gIFRoaXMgaXMgYSBwYWluIGFuZCBJIHJlbWVtYmVyIGEgbG9hZCBvZiBwcm9ibGVtcyB0aGF0IEkgaGFkIHdpdGgKLSAgIGNvZGUgaW4gZ2FzIHdoaWNoIGFsbW9zdCBnb3QgdGhpcyByaWdodC4gIEFsc28sIGl0J3MgaGFyZGVyIHRvIGdyb3cgYW5kCi0gICBhbGxvY2F0ZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncyBlZmZpY2llbnRseS4KLQotICAgT2JzdGFja3MgcHJvdmlkZSBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgbmVlZGVkLCBidXQgYXJlIHRvbwotICAgY29tcGxpY2F0ZWQsIGhlbmNlIHRoZSBzYi4KLQotICAgQW4gc2IgaXMgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBpcyBpbml0aWFsemVkIHRvIHBvaW50IHRvIGFuCi0gICBzYl9lbGVtZW50LiAgc2JfZWxlbWVudHMgYXJlIGtlcHQgb24gYSBmcmVlIGxpc3RzLCBhbmQgdXNlZCB3aGVuCi0gICBuZWVkZWQsIHJlcGxhY2VkIG9udG8gdGhlIGZyZWUgbGlzdCB3aGVuIHVudXNlZC4KLSAqLwotCi0jZGVmaW5lIHNiX21heF9wb3dlcl90d28gICAgMzAJLyogZG9uJ3QgYWxsb3cgc3RyaW5ncyBtb3JlIHRoYW4KLQkJCSAgICAgICAgICAgMl5zYl9tYXhfcG93ZXJfdHdvIGxvbmcgKi8KLS8qIHN0cnVjdHVyZSBvZiBhbiBzYiAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2IKLSAgewotICAgIGNoYXIgKnB0cjsJCQkvKiBwb2ludHMgdG8gdGhlIGN1cnJlbnQgYmxvY2suICovCi0gICAgaW50IGxlbjsJCQkvKiBob3cgbXVjaCBpcyB1c2VkLiAqLwotICAgIGludCBwb3Q7CQkJLyogdGhlIG1heGltdW0gbGVuZ3RoIGlzIDE8PHBvdCAqLwotICAgIHN0cnVjdCBsZSAqaXRlbTsKLSAgfQotc2I7Ci0KLS8qIFN0cnVjdHVyZSBvZiB0aGUgZnJlZSBsaXN0IG9iamVjdCBvZiBhbiBzYiAqLwotdHlwZWRlZiBzdHJ1Y3QgbGUKLSAgewotICAgIHN0cnVjdCBsZSAqbmV4dDsKLSAgICBpbnQgc2l6ZTsKLSAgICBjaGFyIGRhdGFbMV07Ci0gIH0KLXNiX2VsZW1lbnQ7Ci0KLS8qIFRoZSBmcmVlIGxpc3QgKi8KLXR5cGVkZWYgc3RydWN0Ci0gIHsKLSAgICBzYl9lbGVtZW50ICpzaXplW3NiX21heF9wb3dlcl90d29dOwotICB9IHNiX2xpc3RfdmVjdG9yOwotCi1leHRlcm4gaW50IHN0cmluZ19jb3VudFtzYl9tYXhfcG93ZXJfdHdvXTsKLQotZXh0ZXJuIHZvaWQgc2JfYnVpbGQgUEFSQU1TICgoc2IgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBzYl9uZXcgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIHZvaWQgc2Jfa2lsbCBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9hZGRfc2IgUEFSQU1TICgoc2IgKiwgc2IgKikpOwotZXh0ZXJuIHZvaWQgc2JfcmVzZXQgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIHZvaWQgc2JfYWRkX2NoYXIgUEFSQU1TICgoc2IgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBzYl9hZGRfc3RyaW5nIFBBUkFNUyAoKHNiICosIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgc2JfYWRkX2J1ZmZlciBQQVJBTVMgKChzYiAqLCBjb25zdCBjaGFyICosIGludCkpOwotZXh0ZXJuIHZvaWQgc2JfcHJpbnQgUEFSQU1TICgoRklMRSAqLCBzYiAqKSk7Ci1leHRlcm4gdm9pZCBzYl9wcmludF9hdCBQQVJBTVMgKChGSUxFICosIGludCwgc2IgKikpOwotZXh0ZXJuIGNoYXIgKnNiX25hbWUgUEFSQU1TICgoc2IgKikpOwotZXh0ZXJuIGNoYXIgKnNiX3Rlcm1pbmF0ZSBQQVJBTVMgKChzYiAqKSk7Ci1leHRlcm4gaW50IHNiX3NraXBfd2hpdGUgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci1leHRlcm4gaW50IHNiX3NraXBfY29tbWEgUEFSQU1TICgoaW50LCBzYiAqKSk7Ci0KLS8qIEFjdHVhbGx5IGluIGlucHV0LXNjcnViLmMuICAqLwotZXh0ZXJuIHZvaWQgaW5wdXRfc2NydWJfaW5jbHVkZV9zYiBQQVJBTVMgKChzYiAqLCBjaGFyICopKTsKLQotI2VuZGlmIC8qIFNCX0ggKi8KZGlmZiAtLWdpdCBhL2dhcy9zdGFicy5jIGIvZ2FzL3N0YWJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDQ2NTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3N0YWJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzIgKzAsMCBAQAotLyogR2VuZXJpYyBzdGFicyBwYXJzaW5nIGZvciBnYXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkwLCA5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLUdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi1wdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwKLW9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJlY29mZi5oIgotCi0vKiBXZSBuZWVkIHRoaXMsIGRlc3BpdGUgdGhlIGFwcGFyZW50IG9iamVjdCBmb3JtYXQgZGVwZW5kZW5jeSwgc2luY2UKLSAgIGl0IGRlZmluZXMgc3RhYiB0eXBlcywgd2hpY2ggYWxsIG9iamVjdCBmb3JtYXRzIGNhbiB1c2Ugbm93LiAqLwotCi0jaW5jbHVkZSAiYW91dC9zdGFiX2dudS5oIgotCi1zdGF0aWMgdm9pZCBzX3N0YWJfZ2VuZXJpYyBQQVJBTVMgKChpbnQsIGNoYXIgKiwgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9hc21fZmlsZSBQQVJBTVMgKChpbnQsIGNoYXIgKikpOwotCi0vKiBBbGxvdyBiYWNrZW5kcyB0byBvdmVycmlkZSB0aGUgbmFtZXMgdXNlZCBmb3IgdGhlIHN0YWIgc2VjdGlvbnMuICAqLwotI2lmbmRlZiBTVEFCX1NFQ1RJT05fTkFNRQotI2RlZmluZSBTVEFCX1NFQ1RJT05fTkFNRSAiLnN0YWIiCi0jZW5kaWYKLQotI2lmbmRlZiBTVEFCX1NUUklOR19TRUNUSU9OX05BTUUKLSNkZWZpbmUgU1RBQl9TVFJJTkdfU0VDVElPTl9OQU1FICIuc3RhYnN0ciIKLSNlbmRpZgotCi0vKiBOb24temVybyBpZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgLmZ1bmMgZnVuY3Rpb24sIGluIHdoaWNoIGNhc2UKLSAgIHN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8gZW1pdHMgZnVuY3Rpb24gcmVsYXRpdmUgbGluZSBudW1iZXIgc3RhYnMuCi0gICBPdGhlcndpc2UgaXQgZW1pdHMgbGluZSBudW1iZXIgc3RhYnMgd2l0aCBhYnNvbHV0ZSBhZGRyZXNzZXMuICBOb3RlIHRoYXQKLSAgIGJvdGggY2FzZXMgb25seSBhcHBseSB0byBhc3NlbWJsZXIgY29kZSBhc3NlbWJsZWQgd2l0aCAtZ3N0YWJzLiAgKi8KLXN0YXRpYyBpbnQgaW5fZG90X2Z1bmNfcDsKLQotLyogTGFiZWwgYXQgc3RhcnQgb2YgY3VycmVudCBmdW5jdGlvbiBpZiBpbl9kb3RfZnVuY19wICE9IDAuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmN1cnJlbnRfZnVuY3Rpb25fbGFiZWw7Ci0KLS8qCi0gKiBIYW5kbGUgLnN0YWJYIGRpcmVjdGl2ZXMsIHdoaWNoIHVzZWQgdG8gYmUgb3Blbi1jb2RlZC4KLSAqIFNvIG11Y2ggY3JlZXBpbmcgZmVhdHVyaXNtIG92ZXJsb2FkZWQgdGhlIHNlbWFudGljcyB0aGF0IHdlIGRlY2lkZWQKLSAqIHRvIHB1dCBhbGwgLnN0YWJYIHRoaW5raW5nIGluIG9uZSBwbGFjZS4gSGVyZS4KLSAqCi0gKiBXZSB0cnkgdG8gbWFrZSBhbnkgLnN0YWJYIGRpcmVjdGl2ZSBsZWdhbC4gT3RoZXIgcGVvcGxlJ3MgQVMgd2lsbCBvZnRlbgotICogZG8gYXNzZW1ibHktdGltZSBjb25zaXN0ZW5jeSBjaGVja3M6IGVnIGFzc2lnbmluZyBtZWFuaW5nIHRvIG5fdHlwZSBiaXRzCi0gKiBhbmQgInByb3RlY3RpbmciIHlvdSBmcm9tIHNldHRpbmcgdGhlbSB0byBjZXJ0YWluIHZhbHVlcy4gKFRoZXkgYWxzbyB6ZXJvCi0gKiBjZXJ0YWluIGJpdHMgYmVmb3JlIGVtaXR0aW5nIHN5bWJvbHMuIFR1dCB0dXQuKQotICoKLSAqIElmIGFuIGV4cHJlc3Npb24gaXMgbm90IGFic29sdXRlIHdlIGVpdGhlciBncmlwZSBvciB1c2UgdGhlIHJlbG9jYXRpb24KLSAqIGluZm9ybWF0aW9uLiBPdGhlciBwZW9wbGUncyBhc3NlbWJsZXJzIHNpbGVudGx5IGZvcmdldCBpbmZvcm1hdGlvbiB0aGV5Ci0gKiBkb24ndCBuZWVkIGFuZCBpbnZlbnQgaW5mb3JtYXRpb24gdGhleSBuZWVkIHRoYXQgeW91IGRpZG4ndCBzdXBwbHkuCi0gKi8KLQotLyoKLSAqIEJ1aWxkIGEgc3RyaW5nIGRpY3Rpb25hcnkgZW50cnkgZm9yIGEgLnN0YWJYIHN5bWJvbC4KLSAqIFRoZSBzeW1ib2wgaXMgYWRkZWQgdG8gdGhlIC48c2VjbmFtZT5zdHIgc2VjdGlvbi4KLSAqLwotCi0jaWZuZGVmIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMKLSNkZWZpbmUgU0VQQVJBVEVfU1RBQl9TRUNUSU9OUyAwCi0jZW5kaWYKLQotdW5zaWduZWQgaW50Ci1nZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChzdHJpbmcsIHN0YWJzdHJfc2VjbmFtZSkKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBjb25zdCBjaGFyICpzdGFic3RyX3NlY25hbWU7Ci17Ci0gIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0gIHVuc2lnbmVkIGludCByZXR2YWw7Ci0gIHNlZ1Qgc2F2ZV9zZWc7Ci0gIHN1YnNlZ1Qgc2F2ZV9zdWJzZWc7Ci0gIHNlZ1Qgc2VnOwotICBjaGFyICpwOwotCi0gIGlmICghIFNFUEFSQVRFX1NUQUJfU0VDVElPTlMpCi0gICAgYWJvcnQgKCk7Ci0KLSAgbGVuZ3RoID0gc3RybGVuIChzdHJpbmcpOwotCi0gIHNhdmVfc2VnID0gbm93X3NlZzsKLSAgc2F2ZV9zdWJzZWcgPSBub3dfc3Vic2VnOwotCi0gIC8qIENyZWF0ZSB0aGUgc3RhYiBzdHJpbmcgc2VjdGlvbi4gICovCi0gIHNlZyA9IHN1YnNlZ19uZXcgKHN0YWJzdHJfc2VjbmFtZSwgMCk7Ci0KLSAgcmV0dmFsID0gc2VnX2luZm8gKHNlZyktPnN0YWJ1LnN0YWJfc3RyaW5nX3NpemU7Ci0gIGlmIChyZXR2YWwgPD0gMCkKLSAgICB7Ci0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGZpcnN0IHN0cmluZyBpcyBlbXB0eS4gICovCi0gICAgICBwID0gZnJhZ19tb3JlICgxKTsKLSAgICAgICpwID0gMDsKLSAgICAgIHJldHZhbCA9IHNlZ19pbmZvIChzZWcpLT5zdGFidS5zdGFiX3N0cmluZ19zaXplID0gMTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLCBTRUNfUkVBRE9OTFkgfCBTRUNfREVCVUdHSU5HKTsKLSAgICAgIGlmIChzZWctPm5hbWUgPT0gc3RhYnN0cl9zZWNuYW1lKQotCXNlZy0+bmFtZSA9IHhzdHJkdXAgKHN0YWJzdHJfc2VjbmFtZSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgewkJCQkvKiBPcmRpbmFyeSBjYXNlLiAqLwotICAgICAgcCA9IGZyYWdfbW9yZSAobGVuZ3RoICsgMSk7Ci0gICAgICBzdHJjcHkgKHAsIHN0cmluZyk7Ci0KLSAgICAgIHNlZ19pbmZvIChzZWcpLT5zdGFidS5zdGFiX3N0cmluZ19zaXplICs9IGxlbmd0aCArIDE7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dmFsID0gMDsKLQotICBzdWJzZWdfc2V0IChzYXZlX3NlZywgc2F2ZV9zdWJzZWcpOwotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLSNpZmRlZiBBT1VUX1NUQUJTCi0jaWZuZGVmIE9CSl9QUk9DRVNTX1NUQUIKLSNkZWZpbmUgT0JKX1BST0NFU1NfU1RBQihTRUcsVyxTLFQsTyxEKQlhb3V0X3Byb2Nlc3Nfc3RhYihXLFMsVCxPLEQpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgYW91dF9wcm9jZXNzX3N0YWIgUEFSQU1TICgoaW50LCBjb25zdCBjaGFyICosIGludCwgaW50LCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWFvdXRfcHJvY2Vzc19zdGFiICh3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKQotICAgICBpbnQgd2hhdDsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBpbnQgdHlwZSwgb3RoZXIsIGRlc2M7Ci17Ci0gIC8qIFB1dCB0aGUgc3RhYiBpbmZvcm1hdGlvbiBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgc3ltYm9sUyAqc3ltYm9sOwotCi0gIC8qIENyZWF0ZSB0aGUgc3ltYm9sIG5vdywgYnV0IG9ubHkgaW5zZXJ0IGl0IGludG8gdGhlIHN5bWJvbCBjaGFpbgotICAgICBhZnRlciBhbnkgc3ltYm9scyBtZW50aW9uZWQgaW4gdGhlIHZhbHVlIGV4cHJlc3Npb24gZ2V0IGludG8gdGhlCi0gICAgIHN5bWJvbCBjaGFpbi4gIFRoaXMgaXMgdG8gYXZvaWQgImNvbnRpbnVhdGlvbiBzeW1ib2xzIiAod2hlcmUgb25lCi0gICAgIGVuZHMgaW4gIlwiIGFuZCB0aGUgZGVidWcgaW5mbyBpcyBjb250aW51ZWQgaW4gdGhlIG5leHQgLnN0YWJzCi0gICAgIGRpcmVjdGl2ZSkgZnJvbSBiZWluZyBzZXBhcmF0ZWQgYnkgb3RoZXIgcmFuZG9tIHN5bWJvbHMuICAqLwotICBzeW1ib2wgPSBzeW1ib2xfY3JlYXRlIChzdHJpbmcsIHVuZGVmaW5lZF9zZWN0aW9uLCAwLAotCQkJICAoc3RydWN0IGZyYWcgKikgTlVMTCk7Ci0gIGlmICh3aGF0ID09ICdzJyB8fCB3aGF0ID09ICduJykKLSAgICB7Ci0gICAgICAvKiBQaWNrIHVwIHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnB1dCBsaW5lLiAgKi8KLSAgICAgIHN5bWJvbF9zZXRfZnJhZyAoc3ltYm9sLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgcHNldWRvX3NldCAoc3ltYm9sKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiAuc3RhYmQgc2V0cyB0aGUgbmFtZSB0byBOVUxMLiAgV2h5PyAgKi8KLSAgICAgIFNfU0VUX05BTUUgKHN5bWJvbCwgTlVMTCk7Ci0gICAgICBzeW1ib2xfc2V0X2ZyYWcgKHN5bWJvbCwgZnJhZ19ub3cpOwotICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbCwgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpKTsKLSAgICB9Ci0KLSAgc3ltYm9sX2FwcGVuZCAoc3ltYm9sLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gIFNfU0VUX1RZUEUgKHN5bWJvbCwgdHlwZSk7Ci0gIFNfU0VUX09USEVSIChzeW1ib2wsIG90aGVyKTsKLSAgU19TRVRfREVTQyAoc3ltYm9sLCBkZXNjKTsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGNhbiBoYW5kbGUgZGlmZmVyZW50IGtpbmRzIG9mIHN0YWJzIChzLG4sZCkgYW5kIGRpZmZlcmVudAotICAga2luZHMgb2Ygc3RhYiBzZWN0aW9ucy4gKi8KLQotc3RhdGljIHZvaWQgCi1zX3N0YWJfZ2VuZXJpYyAod2hhdCwgc3RhYl9zZWNuYW1lLCBzdGFic3RyX3NlY25hbWUpCi0gICAgIGludCB3aGF0OwotICAgICBjaGFyICpzdGFiX3NlY25hbWU7Ci0gICAgIGNoYXIgKnN0YWJzdHJfc2VjbmFtZTsKLXsKLSAgbG9uZyBsb25naW50OwotICBjaGFyICpzdHJpbmc7Ci0gIGludCB0eXBlOwotICBpbnQgb3RoZXI7Ci0gIGludCBkZXNjOwotCi0gIC8qIFRoZSBnZW5lcmFsIGZvcm1hdCBpczoKLSAgICAgLnN0YWJzICJTVFJJTkciLFRZUEUsT1RIRVIsREVTQyxWQUxVRQotICAgICAuc3RhYm4gVFlQRSxPVEhFUixERVNDLFZBTFVFCi0gICAgIC5zdGFiZCBUWVBFLE9USEVSLERFU0MKLSAgICAgQXQgdGhpcyBwb2ludCBpbnB1dF9saW5lX3BvaW50ZXIgcG9pbnRzIGFmdGVyIHRoZSBwc2V1ZG8tb3AgYW5kCi0gICAgIGFueSB0cmFpbGluZyB3aGl0ZXNwYWNlLiAgVGhlIGFyZ3VtZW50IHdoYXQgaXMgb25lIG9mICdzJywgJ24nIG9yCi0gICAgICdkJyBpbmRpY2F0aW5nIHdoaWNoIHR5cGUgb2YgLnN0YWIgdGhpcyBpcy4gICovCi0KLSAgaWYgKHdoYXQgIT0gJ3MnKQotICAgIHN0cmluZyA9ICIiOwotICBlbHNlCi0gICAgewotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgc3RyaW5nID0gZGVtYW5kX2NvcHlfQ19zdHJpbmcgKCZsZW5ndGgpOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotCWlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgZWxzZQotCXsKLQkgIGFzX3dhcm4gKF8oIi5zdGFiczogTWlzc2luZyBjb21tYSIpKTsKLQkgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZsb25naW50KSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnN0YWIlYzogTWlzc2luZyBjb21tYSIpLCB3aGF0KTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB0eXBlID0gbG9uZ2ludDsKLQotICBpZiAoZ2V0X2Fic29sdXRlX2V4cHJlc3Npb25fYW5kX3Rlcm1pbmF0b3IgKCZsb25naW50KSAhPSAnLCcpCi0gICAgewotICAgICAgYXNfd2FybiAoXygiLnN0YWIlYzogTWlzc2luZyBjb21tYSIpLCB3aGF0KTsKLSAgICAgIGlnbm9yZV9yZXN0X29mX2xpbmUgKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBvdGhlciA9IGxvbmdpbnQ7Ci0KLSAgZGVzYyA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICBpZiAod2hhdCA9PSAncycgfHwgd2hhdCA9PSAnbicpCi0gICAgewotICAgICAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotCXsKLQkgIGFzX3dhcm4gKF8oIi5zdGFiJWM6IE1pc3NpbmcgY29tbWEiKSwgd2hhdCk7Ci0JICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgU0tJUF9XSElURVNQQUNFICgpOwotICAgIH0KLQotI2lmZGVmIFRDX1BQQwotI2lmZGVmIE9CSl9FTEYKLSAgLyogU29sYXJpcyBvbiBQb3dlclBDIGhhcyBkZWNpZGVkIHRoYXQgLnN0YWJkIGNhbiB0YWtlIDQgYXJndW1lbnRzLCBzbyBpZiB3ZSB3ZXJlCi0gICAgIGdpdmVuIDQgYXJndW1lbnRzLCBtYWtlIGl0IGEgLnN0YWJuICovCi0gIGVsc2UgaWYgKHdoYXQgPT0gJ2QnKQotICAgIHsKLSAgICAgIGNoYXIgKnNhdmVfbG9jYXRpb24gPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgICAgIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgICAgIGlmICgqaW5wdXRfbGluZV9wb2ludGVyID09ICcsJykKLQl7Ci0JICBpbnB1dF9saW5lX3BvaW50ZXIrKzsKLQkgIHdoYXQgPSAnbic7Ci0JfQotICAgICAgZWxzZQotCWlucHV0X2xpbmVfcG9pbnRlciA9IHNhdmVfbG9jYXRpb247Ci0gICAgfQotI2VuZGlmIC8qIE9CSl9FTEYgKi8KLSNlbmRpZiAvKiBUQ19QUEMgKi8KLQotI2lmbmRlZiBOT19MSVNUSU5HCi0gIGlmIChsaXN0aW5nKQotICAgIHsKLSAgICAgIHN3aXRjaCAodHlwZSkKLQl7Ci0JY2FzZSBOX1NMSU5FOgotCSAgbGlzdGluZ19zb3VyY2VfbGluZSAoKHVuc2lnbmVkIGludCkgZGVzYyk7Ci0JICBicmVhazsKLQljYXNlIE5fU086Ci0JY2FzZSBOX1NPTDoKLQkgIGxpc3Rpbmdfc291cmNlX2ZpbGUgKHN0cmluZyk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotI2VuZGlmIC8qICEgTk9fTElTVElORyAqLwotCi0gIC8qIFdlIGhhdmUgbm93IGdhdGhlcmVkIHRoZSB0eXBlLCBvdGhlciwgYW5kIGRlc2MgaW5mb3JtYXRpb24uICBGb3IKLSAgICAgLnN0YWJzIG9yIC5zdGFibiwgaW5wdXRfbGluZV9wb2ludGVyIGlzIG5vdyBwb2ludGluZyBhdCB0aGUKLSAgICAgdmFsdWUuICAqLwotCi0gIGlmIChTRVBBUkFURV9TVEFCX1NFQ1RJT05TKQotICAgIC8qIE91dHB1dCB0aGUgc3RhYiBpbmZvcm1hdGlvbiBpbiBhIHNlcGFyYXRlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQKLSAgICAgICBhdCBsZWFzdCBmb3IgQ09GRiBhbmQgRUxGLiAgKi8KLSAgICB7Ci0gICAgICBzZWdUIHNhdmVkX3NlZyA9IG5vd19zZWc7Ci0gICAgICBzdWJzZWdUIHNhdmVkX3N1YnNlZyA9IG5vd19zdWJzZWc7Ci0gICAgICBmcmFnUyAqc2F2ZWRfZnJhZyA9IGZyYWdfbm93OwotICAgICAgdmFsdWVUIGRvdDsKLSAgICAgIHNlZ1Qgc2VnOwotICAgICAgdW5zaWduZWQgaW50IHN0cm9mZjsKLSAgICAgIGNoYXIgKnA7Ci0KLSAgICAgIHN0YXRpYyBzZWdUIGNhY2hlZF9zZWM7Ci0gICAgICBzdGF0aWMgY2hhciAqY2FjaGVkX3NlY25hbWU7Ci0KLSAgICAgIGRvdCA9IGZyYWdfbm93X2ZpeCAoKTsKLQotI2lmZGVmIG1kX2ZsdXNoX3BlbmRpbmdfb3V0cHV0Ci0gICAgICBtZF9mbHVzaF9wZW5kaW5nX291dHB1dCAoKTsKLSNlbmRpZgotCi0gICAgICBpZiAoY2FjaGVkX3NlY25hbWUgJiYgIXN0cmNtcCAoY2FjaGVkX3NlY25hbWUsIHN0YWJfc2VjbmFtZSkpCi0JewotCSAgc2VnID0gY2FjaGVkX3NlYzsKLQkgIHN1YnNlZ19zZXQgKHNlZywgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHNlZyA9IHN1YnNlZ19uZXcgKHN0YWJfc2VjbmFtZSwgMCk7Ci0JICBpZiAoY2FjaGVkX3NlY25hbWUpCi0JICAgIGZyZWUgKGNhY2hlZF9zZWNuYW1lKTsKLQkgIGNhY2hlZF9zZWNuYW1lID0geHN0cmR1cCAoc3RhYl9zZWNuYW1lKTsKLQkgIGNhY2hlZF9zZWMgPSBzZWc7Ci0JfQotCi0gICAgICBpZiAoISBzZWdfaW5mbyAoc2VnKS0+aGFkb25lKQotCXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VnLAotCQkJCSBTRUNfUkVBRE9OTFkgfCBTRUNfUkVMT0MgfCBTRUNfREVCVUdHSU5HKTsKLSNlbmRpZgotI2lmZGVmIElOSVRfU1RBQl9TRUNUSU9OCi0JICBJTklUX1NUQUJfU0VDVElPTiAoc2VnKTsKLSNlbmRpZgotCSAgc2VnX2luZm8gKHNlZyktPmhhZG9uZSA9IDE7Ci0JfQotCi0gICAgICBzdHJvZmYgPSBnZXRfc3RhYl9zdHJpbmdfb2Zmc2V0IChzdHJpbmcsIHN0YWJzdHJfc2VjbmFtZSk7Ci0gICAgICBpZiAod2hhdCA9PSAncycpCi0JewotCSAgLyogcmVsZWFzZSB0aGUgc3RyaW5nICovCi0JICBvYnN0YWNrX2ZyZWUgKCZub3Rlcywgc3RyaW5nKTsKLQl9Ci0KLSAgICAgIC8qIEF0IGxlYXN0IGZvciBub3csIHN0YWJzIGluIGEgc3BlY2lhbCBzdGFiIHNlY3Rpb24gYXJlIGFsd2F5cwotCSBvdXRwdXQgYXMgMTIgYnl0ZSBibG9ja3Mgb2YgaW5mb3JtYXRpb24uICAqLwotICAgICAgcCA9IGZyYWdfbW9yZSAoOCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAsICh2YWx1ZVQpIHN0cm9mZiwgNCk7Ci0gICAgICBtZF9udW1iZXJfdG9fY2hhcnMgKHAgKyA0LCAodmFsdWVUKSB0eXBlLCAxKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDUsICh2YWx1ZVQpIG90aGVyLCAxKTsKLSAgICAgIG1kX251bWJlcl90b19jaGFycyAocCArIDYsICh2YWx1ZVQpIGRlc2MsIDIpOwotCi0gICAgICBpZiAod2hhdCA9PSAncycgfHwgd2hhdCA9PSAnbicpCi0JewotCSAgLyogUGljayB1cCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5wdXQgbGluZS4gICovCi0JICBjb25zICg0KTsKLQkgIGlucHV0X2xpbmVfcG9pbnRlci0tOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBjb25zdCBjaGFyICpmYWtlOwotCSAgc3ltYm9sUyAqc3ltYm9sOwotCSAgZXhwcmVzc2lvblMgZXhwOwotCi0JICAvKiBBcnJhbmdlIGZvciBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBsb2NhdGlvbi4gICovCi0JICBmYWtlID0gRkFLRV9MQUJFTF9OQU1FOwotCSAgc3ltYm9sID0gc3ltYm9sX25ldyAoZmFrZSwgc2F2ZWRfc2VnLCBkb3QsIHNhdmVkX2ZyYWcpOwotCi0JICBleHAuWF9vcCA9IE9fc3ltYm9sOwotCSAgZXhwLlhfYWRkX3N5bWJvbCA9IHN5bWJvbDsKLQkgIGV4cC5YX2FkZF9udW1iZXIgPSAwOwotCi0JICBlbWl0X2V4cHIgKCZleHAsIDQpOwotCX0KLQotI2lmZGVmIE9CSl9QUk9DRVNTX1NUQUIKLSAgICAgIE9CSl9QUk9DRVNTX1NUQUIgKHNlZywgd2hhdCwgc3RyaW5nLCB0eXBlLCBvdGhlciwgZGVzYyk7Ci0jZW5kaWYKLQotICAgICAgc3Vic2VnX3NldCAoc2F2ZWRfc2VnLCBzYXZlZF9zdWJzZWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSNpZmRlZiBPQkpfUFJPQ0VTU19TVEFCCi0gICAgICBPQkpfUFJPQ0VTU19TVEFCICgwLCB3aGF0LCBzdHJpbmcsIHR5cGUsIG90aGVyLCBkZXNjKTsKLSNlbHNlCi0gICAgICBhYm9ydCAoKTsKLSNlbmRpZgotICAgIH0KLQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQotCi0vKiBSZWd1bGFyIHN0YWIgZGlyZWN0aXZlLiAqLwotCi12b2lkCi1zX3N0YWIgKHdoYXQpCi0gICAgIGludCB3aGF0OwotewotICBzX3N0YWJfZ2VuZXJpYyAod2hhdCwgU1RBQl9TRUNUSU9OX05BTUUsIFNUQUJfU1RSSU5HX1NFQ1RJT05fTkFNRSk7Ci19Ci0KLS8qICJFeHRlbmRlZCBzdGFicyIsIHVzZWQgaW4gU29sYXJpcyBvbmx5IG5vdy4gKi8KLQotdm9pZAotc194c3RhYiAod2hhdCkKLSAgICAgaW50IHdoYXQ7Ci17Ci0gIGludCBsZW5ndGg7Ci0gIGNoYXIgKnN0YWJfc2VjbmFtZSwgKnN0YWJzdHJfc2VjbmFtZTsKLSAgc3RhdGljIGNoYXIgKnNhdmVkX3NlY25hbWUsICpzYXZlZF9zdHJzZWNuYW1lOwotCi0gIC8qIEBAIE1FTU9SWSBMRUFLOiBUaGlzIGFsbG9jYXRlcyBhIGNvcHkgb2YgdGhlIHN0cmluZywgYnV0IGluIG1vc3QKLSAgICAgY2FzZXMgaXQgd2lsbCBiZSB0aGUgc2FtZSBzdHJpbmcsIHNvIHdlIGNvdWxkIHJlbGVhc2UgdGhlIHN0b3JhZ2UKLSAgICAgYmFjayB0byB0aGUgb2JzdGFjayBpdCBjYW1lIGZyb20uICAqLwotICBzdGFiX3NlY25hbWUgPSBkZW1hbmRfY29weV9DX3N0cmluZyAoJmxlbmd0aCk7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgPT0gJywnKQotICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICBlbHNlCi0gICAgewotICAgICAgYXNfYmFkIChfKCJjb21tYSBtaXNzaW5nIGluIC54c3RhYnMiKSk7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBUbyBnZXQgdGhlIG5hbWUgb2YgdGhlIHN0YWIgc3RyaW5nIHNlY3Rpb24sIHNpbXBseSBhZGQgInN0ciIgdG8KLSAgICAgdGhlIHN0YWIgc2VjdGlvbiBuYW1lLiAgKi8KLSAgaWYgKHNhdmVkX3NlY25hbWUgPT0gMCB8fCBzdHJjbXAgKHNhdmVkX3NlY25hbWUsIHN0YWJfc2VjbmFtZSkpCi0gICAgewotICAgICAgc3RhYnN0cl9zZWNuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzdGFiX3NlY25hbWUpICsgNCk7Ci0gICAgICBzdHJjcHkgKHN0YWJzdHJfc2VjbmFtZSwgc3RhYl9zZWNuYW1lKTsKLSAgICAgIHN0cmNhdCAoc3RhYnN0cl9zZWNuYW1lLCAic3RyIik7Ci0gICAgICBpZiAoc2F2ZWRfc2VjbmFtZSkKLQl7Ci0JICBmcmVlIChzYXZlZF9zZWNuYW1lKTsKLQkgIGZyZWUgKHNhdmVkX3N0cnNlY25hbWUpOwotCX0KLSAgICAgIHNhdmVkX3NlY25hbWUgPSBzdGFiX3NlY25hbWU7Ci0gICAgICBzYXZlZF9zdHJzZWNuYW1lID0gc3RhYnN0cl9zZWNuYW1lOwotICAgIH0KLSAgc19zdGFiX2dlbmVyaWMgKHdoYXQsIHNhdmVkX3NlY25hbWUsIHNhdmVkX3N0cnNlY25hbWUpOwotfQotCi0jaWZkZWYgU19TRVRfREVTQwotCi0vKiBGcm9iIGludmVudGVkIGF0IFJNUycgcmVxdWVzdC4gU2V0IHRoZSBuX2Rlc2Mgb2YgYSBzeW1ib2wuICAqLwotCi12b2lkIAotc19kZXNjIChpZ25vcmUpCi0gICAgIGludCBpZ25vcmU7Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGNoYXIgYzsKLSAgY2hhciAqcDsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLSAgaW50IHRlbXA7Ci0KLSAgbmFtZSA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgYyA9IGdldF9zeW1ib2xfZW5kICgpOwotICBwID0gaW5wdXRfbGluZV9wb2ludGVyOwotICAqcCA9IGM7Ci0gIFNLSVBfV0hJVEVTUEFDRSAoKTsKLSAgaWYgKCppbnB1dF9saW5lX3BvaW50ZXIgIT0gJywnKQotICAgIHsKLSAgICAgICpwID0gMDsKLSAgICAgIGFzX2JhZCAoXygiRXhwZWN0ZWQgY29tbWEgYWZ0ZXIgbmFtZSBcIiVzXCIiKSwgbmFtZSk7Ci0gICAgICAqcCA9IGM7Ci0gICAgICBpZ25vcmVfcmVzdF9vZl9saW5lICgpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlcisrOwotICAgICAgdGVtcCA9IGdldF9hYnNvbHV0ZV9leHByZXNzaW9uICgpOwotICAgICAgKnAgPSAwOwotICAgICAgc3ltYm9sUCA9IHN5bWJvbF9maW5kX29yX21ha2UgKG5hbWUpOwotICAgICAgKnAgPSBjOwotICAgICAgU19TRVRfREVTQyAoc3ltYm9sUCwgdGVtcCk7Ci0gICAgfQotICBkZW1hbmRfZW1wdHlfcmVzdF9vZl9saW5lICgpOwotfQkJCQkvKiBzX2Rlc2MoKSAqLwotCi0jZW5kaWYgLyogZGVmaW5lZCAoU19TRVRfREVTQykgKi8KLQotLyogR2VuZXJhdGUgc3RhYnMgZGVidWdnaW5nIGluZm9ybWF0aW9uIHRvIGRlbm90ZSB0aGUgbWFpbiBzb3VyY2UgZmlsZS4gICovCi0KLXZvaWQKLXN0YWJzX2dlbmVyYXRlX2FzbV9maWxlICgpCi17Ci0gIGNoYXIgKmZpbGU7Ci0gIHVuc2lnbmVkIGludCBsaW5lbm87Ci0KLSAgYXNfd2hlcmUgKCZmaWxlLCAmbGluZW5vKTsKLSAgZ2VuZXJhdGVfYXNtX2ZpbGUgKE5fU08sIGZpbGUpOwotfQotCi0vKiBHZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8gZGVub3RlIHRoZSBzb3VyY2UgZmlsZS4KLSAgIFRZUEUgaXMgb25lIG9mIE5fU08sIE5fU09MLiAgKi8KLQotc3RhdGljIHZvaWQKLWdlbmVyYXRlX2FzbV9maWxlICh0eXBlLCBmaWxlKQotICAgICBpbnQgdHlwZTsKLSAgICAgY2hhciAqZmlsZTsKLXsKLSAgc3RhdGljIGNoYXIgKmxhc3RfZmlsZTsKLSAgc3RhdGljIGludCBsYWJlbF9jb3VudDsKLSAgY2hhciAqaG9sZDsKLSAgY2hhciBidWZbMTAwXTsKLSAgY2hhciBzeW1bMzBdOwotCi0gIC8qIFJhdGhlciB0aGFuIHRyeSB0byBkbyB0aGlzIGluIHNvbWUgZWZmaWNpZW50IGZhc2hpb24sIHdlIGp1c3QKLSAgICAgZ2VuZXJhdGUgYSBzdHJpbmcgYW5kIHRoZW4gcGFyc2UgaXQgYWdhaW4uICBUaGF0IGxldHMgdXMgdXNlIHRoZQotICAgICBleGlzdGluZyBzdGFicyBob29rLCB3aGljaCBleHBlY3QgdG8gc2VlIGEgc3RyaW5nLCByYXRoZXIgdGhhbgotICAgICBpbnZlbnRpbmcgbmV3IG9uZXMuICAqLwotCi0gIGhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0KLSAgaWYgKGxhc3RfZmlsZSA9PSBOVUxMCi0gICAgICB8fCBzdHJjbXAgKGxhc3RfZmlsZSwgZmlsZSkgIT0gMCkKLSAgICB7Ci0gICAgICBzcHJpbnRmIChzeW0sICIlc0YlZCIsIEZBS0VfTEFCRUxfTkFNRSwgbGFiZWxfY291bnQpOwotICAgICAgKytsYWJlbF9jb3VudDsKLQotICAgICAgc3ByaW50ZiAoYnVmLCAiXCIlc1wiLCVkLDAsMCwlc1xuIiwgZmlsZSwgdHlwZSwgc3ltKTsKLSAgICAgIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgICAgIHNfc3RhYiAoJ3MnKTsKLSAgICAgIGNvbG9uIChzeW0pOwotCi0gICAgICBpZiAobGFzdF9maWxlICE9IE5VTEwpCi0JZnJlZSAobGFzdF9maWxlKTsKLSAgICAgIGxhc3RfZmlsZSA9IHhzdHJkdXAgKGZpbGUpOwotICAgIH0KLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotfQotCi0vKiBHZW5lcmF0ZSBzdGFicyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50IGxpbmUuICBUaGlzIGlzCi0gICB1c2VkIHRvIHByb2R1Y2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJsZXIgZmlsZS4gICovCi0KLXZvaWQKLXN0YWJzX2dlbmVyYXRlX2FzbV9saW5lbm8gKCkKLXsKLSAgc3RhdGljIGludCBsYWJlbF9jb3VudDsKLSAgY2hhciAqaG9sZDsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLSAgY2hhciAqYnVmOwotICBjaGFyIHN5bVszMF07Ci0KLSAgLyogUmF0aGVyIHRoYW4gdHJ5IHRvIGRvIHRoaXMgaW4gc29tZSBlZmZpY2llbnQgZmFzaGlvbiwgd2UganVzdAotICAgICBnZW5lcmF0ZSBhIHN0cmluZyBhbmQgdGhlbiBwYXJzZSBpdCBhZ2Fpbi4gIFRoYXQgbGV0cyB1cyB1c2UgdGhlCi0gICAgIGV4aXN0aW5nIHN0YWJzIGhvb2ssIHdoaWNoIGV4cGVjdCB0byBzZWUgYSBzdHJpbmcsIHJhdGhlciB0aGFuCi0gICAgIGludmVudGluZyBuZXcgb25lcy4gICovCi0KLSAgaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLQotICBhc193aGVyZSAoJmZpbGUsICZsaW5lbm8pOwotCi0gIGdlbmVyYXRlX2FzbV9maWxlIChOX1NPTCwgZmlsZSk7Ci0KLSAgc3ByaW50ZiAoc3ltLCAiJXNMJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KTsKLSAgKytsYWJlbF9jb3VudDsKLQotICBpZiAoaW5fZG90X2Z1bmNfcCkKLSAgICB7Ci0gICAgICBidWYgPSAoY2hhciAqKSBhbGxvY2EgKDEwMCArIHN0cmxlbiAoY3VycmVudF9mdW5jdGlvbl9sYWJlbCkpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJWQsMCwlZCwlcy0lc1xuIiwgTl9TTElORSwgbGluZW5vLAotCSAgICAgICBzeW0sIGN1cnJlbnRfZnVuY3Rpb25fbGFiZWwpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIGFsbG9jYSAoMTAwKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIiVkLDAsJWQsJXNcbiIsIE5fU0xJTkUsIGxpbmVubywgc3ltKTsKLSAgICB9Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgc19zdGFiICgnbicpOwotICBjb2xvbiAoc3ltKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotfQotCi0vKiBFbWl0IGEgZnVuY3Rpb24gc3RhYi4KLSAgIEFsbCBhc3NlbWJsZXIgZnVuY3Rpb25zIGFyZSBhc3N1bWVkIHRvIGhhdmUgcmV0dXJuIHR5cGUgYHZvaWQnLiAgKi8KLQotdm9pZAotc3RhYnNfZ2VuZXJhdGVfYXNtX2Z1bmMgKGZ1bmNuYW1lLCBzdGFydGxhYm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZ1bmNuYW1lOwotICAgICBjb25zdCBjaGFyICpzdGFydGxhYm5hbWU7Ci17Ci0gIHN0YXRpYyBpbnQgdm9pZF9lbWl0dGVkX3A7Ci0gIGNoYXIgKmhvbGQgPSBpbnB1dF9saW5lX3BvaW50ZXI7Ci0gIGNoYXIgKmJ1ZjsKLSAgY2hhciAqZmlsZTsKLSAgdW5zaWduZWQgaW50IGxpbmVubzsKLQotICBpZiAoISB2b2lkX2VtaXR0ZWRfcCkKLSAgICB7Ci0gICAgICBpbnB1dF9saW5lX3BvaW50ZXIgPSAiXCJ2b2lkOnQxPTFcIiwxMjgsMCwwLDAiOwotICAgICAgc19zdGFiICgncycpOwotICAgICAgdm9pZF9lbWl0dGVkX3AgPSAxOwotICAgIH0KLQotICBhc193aGVyZSAoJmZpbGUsICZsaW5lbm8pOwotICBhc3ByaW50ZiAoJmJ1ZiwgIlwiJXM6RjFcIiwlZCwwLCVkLCVzIiwKLQkgICAgZnVuY25hbWUsIE5fRlVOLCBsaW5lbm8gKyAxLCBzdGFydGxhYm5hbWUpOwotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBidWY7Ci0gIHNfc3RhYiAoJ3MnKTsKLSAgZnJlZSAoYnVmKTsKLQotICBpbnB1dF9saW5lX3BvaW50ZXIgPSBob2xkOwotICBjdXJyZW50X2Z1bmN0aW9uX2xhYmVsID0geHN0cmR1cCAoc3RhcnRsYWJuYW1lKTsKLSAgaW5fZG90X2Z1bmNfcCA9IDE7Ci19Ci0KLS8qIEVtaXQgYSBzdGFiIHRvIHJlY29yZCB0aGUgZW5kIG9mIGEgZnVuY3Rpb24uICAqLwotCi12b2lkCi1zdGFic19nZW5lcmF0ZV9hc21fZW5kZnVuYyAoZnVuY25hbWUsIHN0YXJ0bGFibmFtZSkKLSAgICAgY29uc3QgY2hhciAqZnVuY25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnN0YXJ0bGFibmFtZTsKLXsKLSAgc3RhdGljIGludCBsYWJlbF9jb3VudDsKLSAgY2hhciAqaG9sZCA9IGlucHV0X2xpbmVfcG9pbnRlcjsKLSAgY2hhciAqYnVmOwotICBjaGFyIHN5bVszMF07Ci0KLSAgc3ByaW50ZiAoc3ltLCAiJXNlbmRmdW5jJWQiLCBGQUtFX0xBQkVMX05BTUUsIGxhYmVsX2NvdW50KTsKLSAgKytsYWJlbF9jb3VudDsKLSAgY29sb24gKHN5bSk7Ci0KLSAgYXNwcmludGYgKCZidWYsICJcIlwiLCVkLDAsMCwlcy0lcyIsIE5fRlVOLCBzeW0sIHN0YXJ0bGFibmFtZSk7Ci0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGJ1ZjsKLSAgc19zdGFiICgncycpOwotICBmcmVlIChidWYpOwotCi0gIGlucHV0X2xpbmVfcG9pbnRlciA9IGhvbGQ7Ci0gIGluX2RvdF9mdW5jX3AgPSAwOwotICBjdXJyZW50X2Z1bmN0aW9uX2xhYmVsID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2dhcy9zdGFtcC1oLmluIGIvZ2FzL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2dhcy9zdHJ1Yy1zeW1ib2wuaCBiL2dhcy9zdHJ1Yy1zeW1ib2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3MzU2Ni4uMDAwMDAwMAotLS0gYS9nYXMvc3RydWMtc3ltYm9sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyogc3RydWN0X3N5bWJvbC5oIC0gSW50ZXJuYWwgc3ltYm9sIHN0cnVjdHVyZQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX19zdHJ1Y19zeW1ib2xfaF9fCi0jZGVmaW5lIF9fc3RydWNfc3ltYm9sX2hfXwotCi0vKiBUaGUgaW5mb3JtYXRpb24gd2Uga2VlcCBmb3IgYSBzeW1ib2wuICBOb3RlIHRoYXQgdGhlIHN5bWJvbCB0YWJsZQotICAgaG9sZHMgcG9pbnRlcnMgYm90aCB0byB0aGlzIGFuZCB0byBsb2NhbF9zeW1ib2wgc3RydWN0dXJlcy4gIFNlZQotICAgYmVsb3cuICAqLwotCi1zdHJ1Y3Qgc3ltYm9sCi17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBCRkQgc3ltYm9sICovCi0gIGFzeW1ib2wgKmJzeW07Ci0jZWxzZQotICAvKiBUaGUgKDQtb3JpZ2luKSBwb3NpdGlvbiBvZiBzeV9uYW1lIGluIHRoZSBzeW1ib2wgdGFibGUgb2YgdGhlIG9iamVjdAotICAgICBmaWxlLiAgVGhpcyB3aWxsIGJlIDAgZm9yIChuYW1lbGVzcykgLnN0YWJkIHN5bWJvbHMuCi0KLSAgICAgTm90IHVzZWQgdW50aWwgd3JpdGVfb2JqZWN0X2ZpbGUoKSB0aW1lLiAqLwotICB1bnNpZ25lZCBsb25nIHN5X25hbWVfb2Zmc2V0OwotCi0gIC8qIFdoYXQgd2Ugd3JpdGUgaW4gLm8gZmlsZSAoaWYgcGVybWl0dGVkKS4gICovCi0gIG9ial9zeW1ib2xfdHlwZSBzeV9zeW1ib2w7Ci0KLSAgLyogVGhlIDI0IGJpdCBzeW1ib2wgbnVtYmVyLiAgU3ltYm9sIG51bWJlcnMgc3RhcnQgYXQgMCBhbmQgYXJlIHVuc2lnbmVkLiAqLwotICBsb25nIHN5X251bWJlcjsKLSNlbmRpZgotCi0gIC8qIFRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgZXhwcmVzc2lvblMgc3lfdmFsdWU7Ci0KLSAgLyogRm9yd2FyZHMgYW5kIChvcHRpb25hbGx5KSBiYWNrd2FyZHMgY2hhaW4gcG9pbnRlcnMuICAqLwotICBzdHJ1Y3Qgc3ltYm9sICpzeV9uZXh0OwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgc3RydWN0IHN5bWJvbCAqc3lfcHJldmlvdXM7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0gIC8qIFBvaW50ZXIgdG8gdGhlIGZyYWcgdGhpcyBzeW1ib2wgaXMgYXR0YWNoZWQgdG8sIGlmIGFueS4KLSAgICAgT3RoZXJ3aXNlLCBOVUxMLiAgKi8KLSAgc3RydWN0IGZyYWcgKnN5X2ZyYWc7Ci0KLSAgdW5zaWduZWQgaW50IHdyaXR0ZW4gOiAxOwotICAvKiBXaGV0aGVyIHN5bWJvbCB2YWx1ZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlc29sdmVkICh1c2VkIGR1cmluZwotICAgICBmaW5hbCBwYXNzIG92ZXIgc3ltYm9sIHRhYmxlKS4gICovCi0gIHVuc2lnbmVkIGludCBzeV9yZXNvbHZlZCA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCB2YWx1ZSBpcyBjdXJyZW50bHkgYmVpbmcgcmVzb2x2ZWQgKHVzZWQgdG8KLSAgICAgZGV0ZWN0IGxvb3BzIGluIHN5bWJvbCBkZXBlbmRlbmNpZXMpLiAgKi8KLSAgdW5zaWduZWQgaW50IHN5X3Jlc29sdmluZyA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhlIHN5bWJvbCB2YWx1ZSBpcyB1c2VkIGluIGEgcmVsb2MuICBUaGlzIGlzIHVzZWQgdG8KLSAgICAgZW5zdXJlIHRoYXQgc3ltYm9scyB1c2VkIGluIHJlbG9jcyBhcmUgd3JpdHRlbiBvdXQsIGV2ZW4gaWYgdGhleQotICAgICBhcmUgbG9jYWwgYW5kIHdvdWxkIG90aGVyd2lzZSBub3QgYmUuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfdXNlZF9pbl9yZWxvYyA6IDE7Ci0KLSAgLyogV2hldGhlciB0aGUgc3ltYm9sIGlzIHVzZWQgYXMgYW4gb3BlcmFuZCBvciBpbiBhbiBleHByZXNzaW9uLiAgCi0gICAgIE5PVEU6ICBOb3QgYWxsIHRoZSBiYWNrZW5kcyBrZWVwIHRoaXMgaW5mb3JtYXRpb24gYWNjdXJhdGU7Ci0gICAgIGJhY2tlbmRzIHdoaWNoIHVzZSB0aGlzIGJpdCBhcmUgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgaXQgd2hlbgotICAgICBhIHN5bWJvbCBpcyB1c2VkIGluIGJhY2tlbmQgcm91dGluZXMuICAqLwotICB1bnNpZ25lZCBpbnQgc3lfdXNlZCA6IDE7Ci0KLSAgLyogVGhpcyBpcyBzZXQgaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluIGFuIE1SSSBjb21tb24gc2VjdGlvbi4KLSAgICAgV2UgaGFuZGxlIHN1Y2ggc2VjdGlvbnMgYXMgc2luZ2xlIGNvbW1vbiBzeW1ib2xzLCBzbyBzeW1ib2xzCi0gICAgIGRlZmluZWQgd2l0aGluIHRoZW0gbXVzdCBiZSB0cmVhdGVkIHNwZWNpYWxseSBieSB0aGUgcmVsb2NhdGlvbgotICAgICByb3V0aW5lcy4gICovCi0gIHVuc2lnbmVkIGludCBzeV9tcmlfY29tbW9uIDogMTsKLQotI2lmZGVmIE9CSl9TWU1GSUVMRF9UWVBFCi0gIE9CSl9TWU1GSUVMRF9UWVBFIHN5X29iajsKLSNlbmRpZgotCi0jaWZkZWYgVENfU1lNRklFTERfVFlQRQotICBUQ19TWU1GSUVMRF9UWVBFIHN5X3RjOwotI2VuZGlmCi19OwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCi0vKiBBIHBvaW50ZXIgaW4gdGhlIHN5bWJvbCBtYXkgcG9pbnQgdG8gZWl0aGVyIGEgY29tcGxldGUgc3ltYm9sCi0gICAoc3RydWN0IHN5bWJvbCBhYm92ZSkgb3IgdG8gYSBsb2NhbCBzeW1ib2wgKHN0cnVjdCBsb2NhbF9zeW1ib2wKLSAgIGRlZmluZWQgaGVyZSkuICBUaGUgc3ltYm9sIGNvZGUgY2FuIGRldGVjdCB0aGUgY2FzZSBieSBleGFtaW5pbmcKLSAgIHRoZSBmaXJzdCBmaWVsZC4gIEl0IGlzIGFsd2F5cyBOVUxMIGZvciBhIGxvY2FsIHN5bWJvbC4KLQotICAgV2UgZG8gdGhpcyBiZWNhdXNlIHdlIG9yZGluYXJpbHkgb25seSBuZWVkIGEgc21hbGwgYW1vdW50IG9mCi0gICBpbmZvcm1hdGlvbiBmb3IgYSBsb2NhbCBzeW1ib2wuICBUaGUgc3ltYm9sIHRhYmxlIHRha2VzIHVwIGEgbG90IG9mCi0gICBzcGFjZSwgYW5kIHN0b3JpbmcgbGVzcyBpbmZvcm1hdGlvbiBmb3IgYSBsb2NhbCBzeW1ib2wgY2FuIG1ha2UgYQotICAgYmlnIGRpZmZlcmVuY2UgaW4gYXNzZW1ibGVyIG1lbW9yeSB1c2FnZSB3aGVuIGFzc2VtYmxpbmcgYSBsYXJnZQotICAgZmlsZS4gICovCi0KLXN0cnVjdCBsb2NhbF9zeW1ib2wKLXsKLSAgLyogVGhpcyBwb2ludGVyIGlzIGFsd2F5cyBOVUxMIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIGxvY2FsCi0gICAgIHN5bWJvbC4gICovCi0gIGFzeW1ib2wgKmxzeV9tYXJrZXI7Ci0KLSAgLyogVGhlIHN5bWJvbCBzZWN0aW9uLiAgVGhpcyBhbHNvIHNlcnZlcyBhcyBhIGZsYWcuICBJZiB0aGlzIGlzCi0gICAgIHJlZ19zZWN0aW9uLCB0aGVuIHRoaXMgc3ltYm9sIGhhcyBiZWVuIGNvbnZlcnRlZCBpbnRvIGEgcmVndWxhcgotICAgICBzeW1ib2wsIGFuZCBzeV9zeW0gcG9pbnRzIHRvIGl0LiAgKi8KLSAgc2VnVCBsc3lfc2VjdGlvbjsKLQotICAvKiBUaGUgc3ltYm9sIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpsc3lfbmFtZTsKLQotICAvKiBUaGUgc3ltYm9sIGZyYWcgb3IgdGhlIHJlYWwgc3ltYm9sLCBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgaW4KLSAgICAgc3lfc2VjdGlvbi4gIElmIHRoZSBzeW1ib2wgaGFzIGJlZW4gZnVsbHkgcmVzb2x2ZWQsIGxzeV9mcmFnIGlzCi0gICAgIHNldCB0byBOVUxMLiAgKi8KLSAgdW5pb24KLSAgewotICAgIGZyYWdTICpsc3lfZnJhZzsKLSAgICBzeW1ib2xTICpsc3lfc3ltOwotICB9IHU7Ci0KLSAgLyogVGhlIG9mZnNldCB3aXRoaW4gdGhlIGZyYWcuICAqLwotICB2YWx1ZVQgbHN5X29mZnNldDsKLX07Ci0KLSNkZWZpbmUgbG9jYWxfc3ltYm9sX2NvbnZlcnRlZF9wKGwpICgobCktPmxzeV9zZWN0aW9uID09IHJlZ19zZWN0aW9uKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfbWFya19jb252ZXJ0ZWQobCkgKChsKS0+bHN5X3NlY3Rpb24gPSByZWdfc2VjdGlvbikKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AobCkgKChsKS0+dS5sc3lfZnJhZyA9PSBOVUxMKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfbWFya19yZXNvbHZlZChsKSAoKGwpLT51LmxzeV9mcmFnID0gTlVMTCkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX2dldF9mcmFnKGwpICgobCktPnUubHN5X2ZyYWcpCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9zZXRfZnJhZyhsLCBmKSAoKGwpLT51LmxzeV9mcmFnID0gKGYpKQotI2RlZmluZSBsb2NhbF9zeW1ib2xfZ2V0X3JlYWxfc3ltYm9sKGwpICgobCktPnUubHN5X3N5bSkKLSNkZWZpbmUgbG9jYWxfc3ltYm9sX3NldF9yZWFsX3N5bWJvbChsLCBzKSAoKGwpLT51LmxzeV9zeW0gPSAocykpCi0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNlbmRpZiAvKiBfX3N0cnVjX3N5bWJvbF9oX18gKi8KLQotLyogZW5kIG9mIHN0cnVjLXN5bWJvbC5oICovCmRpZmYgLS1naXQgYS9nYXMvc3Vic2Vncy5jIGIvZ2FzL3N1YnNlZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiZjcwZC4uMDAwMDAwMAotLS0gYS9nYXMvc3Vic2Vncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjYzICswLDAgQEAKLS8qIHN1YnNlZ3MuYyAtIHN1YnNlZ21lbnRzIC0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBTZWdtZW50cyAmIHN1Yi1zZWdtZW50cy4KLSAqLwotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0KLWZyY2hhaW5TICpmcmNoYWluX3Jvb3QsICpmcmNoYWluX25vdzsKLQotc3RhdGljIHN0cnVjdCBvYnN0YWNrIGZyY2hhaW5zOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi1zZWdtZW50X2luZm9fdHlwZSBzZWdtZW50X2luZm9bU0VHX01BWElNVU1fT1JESU5BTF07Ci0KLSNlbHNlCi0vKiBDb21tZW50ZWQgaW4gInN1YnNlZ3MuaCIuICovCi1mcmNoYWluUyAqZGF0YTBfZnJjaGFpblAsICpic3MwX2ZyY2hhaW5QOwotCi0jZW5kaWYgLyogTUFOWV9TRUdNRU5UUyAqLwotY2hhciBjb25zdCAqY29uc3Qgc2VnX25hbWVbXSA9Ci17Ci0gICJhYnNvbHV0ZSIsCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICAiZTAiLCAiZTEiLCAiZTIiLCAiZTMiLCAiZTQiLCAiZTUiLCAiZTYiLCAiZTciLCAiZTgiLCAiZTkiLAotICAiZTEwIiwgImUxMSIsICJlMTIiLCAiZTEzIiwgImUxNCIsICJlMTUiLCAiZTE2IiwgImUxNyIsICJlMTgiLCAiZTE5IiwKLSAgImUyMCIsICJlMjEiLCAiZTIyIiwgImUyMyIsICJlMjQiLCAiZTI1IiwgImUyNiIsICJlMjciLCAiZTI4IiwgImUyOSIsCi0gICJlMzAiLCAiZTMxIiwgImUzMiIsICJlMzMiLCAiZTM0IiwgImUzNSIsICJlMzYiLCAiZTM3IiwgImUzOCIsICJlMzkiLAotI2Vsc2UKLSAgInRleHQiLAotICAiZGF0YSIsCi0gICJic3MiLAotI2VuZGlmIC8qIE1BTllfU0VHTUVOVFMgKi8KLSAgInVua25vd24iLAotICAiQVNTRU1CTEVSLUlOVEVSTkFMLUxPR0lDLUVSUk9SISIsCi0gICJleHByIiwKLSAgImRlYnVnIiwKLSAgInRyYW5zZmVydCB2ZWN0b3IgcHJlbG9hZCIsCi0gICJ0cmFuc2ZlcnQgdmVjdG9yIHBvc3Rsb2FkIiwKLSAgInJlZ2lzdGVyIiwKLSAgIiIsCi19OwkJCQkvKiBVc2VkIGJ5IGVycm9yIHJlcG9ydGVycywgZHVtcGVycyBldGMuICovCi0jZWxzZSAvKiBCRkRfQVNTRU1CTEVSICovCi0KLS8qIEdhcyBzZWdtZW50IGluZm9ybWF0aW9uIGZvciBiZmRfYWJzX3NlY3Rpb25fcHRyIGFuZAotICAgYmZkX3VuZF9zZWN0aW9uX3B0ci4gICovCi1zdGF0aWMgc2VnbWVudF9pbmZvX3R5cGUgKmFic19zZWdfaW5mbzsKLXN0YXRpYyBzZWdtZW50X2luZm9fdHlwZSAqdW5kX3NlZ19pbmZvOwotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zdGF0aWMgdm9pZCBzdWJzZWdfc2V0X3Jlc3QgUEFSQU1TICgoc2VnVCwgc3Vic2VnVCkpOwotCi1zdGF0aWMgZnJhZ1MgZHVtbXlfZnJhZzsKLQotc3RhdGljIGZyY2hhaW5TIGFic29sdXRlX2ZyY2hhaW47Ci0MCi12b2lkCi1zdWJzZWdzX2JlZ2luICgpCi17Ci0gIC8qIENoZWNrIHRhYmxlKHMpIHNlZ19uYW1lW10sIHNlZ19OX1RZUEVbXSBpcyBpbiBjb3JyZWN0IG9yZGVyICovCi0jaWYgIWRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBrbm93IChTRUdfQUJTT0xVVEUgPT0gMCk7Ci0gIGtub3cgKFNFR19URVhUID09IDEpOwotICBrbm93IChTRUdfREFUQSA9PSAyKTsKLSAga25vdyAoU0VHX0JTUyA9PSAzKTsKLSAga25vdyAoU0VHX1VOS05PV04gPT0gNCk7Ci0gIGtub3cgKFNFR19HT09GID09IDUpOwotICBrbm93IChTRUdfRVhQUiA9PSA2KTsKLSAga25vdyAoU0VHX0RFQlVHID09IDcpOwotICBrbm93IChTRUdfTlRWID09IDgpOwotICBrbm93IChTRUdfUFRWID09IDkpOwotICBrbm93IChTRUdfUkVHSVNURVIgPT0gMTApOwotICBrbm93IChTRUdfTUFYSU1VTV9PUkRJTkFMID09IFNFR19SRUdJU1RFUik7Ci0jZW5kaWYKLQotICBvYnN0YWNrX2JlZ2luICgmZnJjaGFpbnMsIGNodW5rc2l6ZSk7Ci0jaWYgX19HTlVDX18gPj0gMgotICBvYnN0YWNrX2FsaWdubWVudF9tYXNrICgmZnJjaGFpbnMpID0gX19hbGlnbm9mX18gKGZyY2hhaW5TKSAtIDE7Ci0jZW5kaWYKLQotICBmcmNoYWluX3Jvb3QgPSBOVUxMOwotICBmcmNoYWluX25vdyA9IE5VTEw7CQkvKiBXYXJuIG5ld19zdWJzZWcoKSB0aGF0IHdlIGFyZSBib290aW5nLiAqLwotCi0gIGZyYWdfbm93ID0gJmR1bW15X2ZyYWc7Ci0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICBub3dfc3Vic2VnID0gNDI7CQkvKiBMaWUgZm9yIDFzdCBjYWxsIHRvIHN1YnNlZ19uZXcuICovCi0jaWZkZWYgTUFOWV9TRUdNRU5UUwotICB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gU0VHX0UwOyBpIDwgU0VHX1VOS05PV047IGkrKykKLSAgICAgIHsKLQlzdWJzZWdfc2V0IChpLCAwKTsKLQlzZWdtZW50X2luZm9baV0uZnJjaGFpblAgPSBmcmNoYWluX25vdzsKLSAgICAgIH0KLSAgfQotI2Vsc2UKLSAgc3Vic2VnX3NldCAoU0VHX0RBVEEsIDApOwkvKiAuZGF0YSAwICovCi0gIGRhdGEwX2ZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0KLSAgc3Vic2VnX3NldCAoU0VHX0JTUywgMCk7Ci0gIGJzczBfZnJjaGFpblAgPSBmcmNoYWluX25vdzsKLQotI2VuZGlmIC8qICEgTUFOWV9TRUdNRU5UUyAqLwotI2VuZGlmIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0gIGFic29sdXRlX2ZyY2hhaW4uZnJjaF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfc3Vic2VnID0gMDsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGFic29sdXRlX2ZyY2hhaW4uZml4X3Jvb3QgPSBhYnNvbHV0ZV9mcmNoYWluLmZpeF90YWlsID0gMDsKLSNlbmRpZgotICBhYnNvbHV0ZV9mcmNoYWluLmZyY2hfZnJhZ19ub3cgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci0gIGFic29sdXRlX2ZyY2hhaW4uZnJjaF9yb290ID0gYWJzb2x1dGVfZnJjaGFpbi5mcmNoX2xhc3QgPSAmemVyb19hZGRyZXNzX2ZyYWc7Ci19Ci0MCi0vKgotICoJCQlzdWJzZWdfY2hhbmdlKCkKLSAqCi0gKiBDaGFuZ2UgdGhlIHN1YnNlZ21lbnQgd2UgYXJlIGluLCBCVVQgRE8gTk9UIE1BS0UgQSBORVcgRlJBRyBmb3IgdGhlCi0gKiBzdWJzZWdtZW50LiBJZiB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgY29ycmVjdCBzdWJzZWdtZW50LCBjaGFuZ2Ugbm90aGluZy4KLSAqIFRoaXMgaXMgdXNlZCBlZyBhcyBhIHdvcmtlciBmb3Igc3Vic2VnX3NldCBbd2hpY2ggZG9lcyBtYWtlIGEgbmV3IGZyYWdfbm93XQotICogYW5kIGZvciBjaGFuZ2luZyBzZWdtZW50cyBhZnRlciB3ZSBoYXZlIHJlYWQgdGhlIHNvdXJjZS4gV2UgY29uc3RydWN0IGVnCi0gKiBmaXhTcyBldmVuIGFmdGVyIHRoZSBzb3VyY2UgZmlsZSBpcyByZWFkLCBzbyB3ZSBkbyBoYXZlIHRvIGtlZXAgdGhlCi0gKiBzZWdtZW50IGNvbnRleHQgY29ycmVjdC4KLSAqLwotdm9pZAotc3Vic2VnX2NoYW5nZSAoc2VnLCBzdWJzZWcpCi0gICAgIHJlZ2lzdGVyIHNlZ1Qgc2VnOwotICAgICByZWdpc3RlciBpbnQgc3Vic2VnOwotewotICBub3dfc2VnID0gc2VnOwotICBub3dfc3Vic2VnID0gc3Vic2VnOwotCi0gIGlmIChub3dfc2VnID09IGFic29sdXRlX3NlY3Rpb24pCi0gICAgcmV0dXJuOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0gICAgc2VnaW5mbyA9IChzZWdtZW50X2luZm9fdHlwZSAqKSBiZmRfZ2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VnKTsKLSAgICBpZiAoISBzZWdpbmZvKQotICAgICAgewotCXNlZ2luZm8gPSAoc2VnbWVudF9pbmZvX3R5cGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2VnaW5mbykpOwotCW1lbXNldCAoKFBUUikgc2VnaW5mbywgMCwgc2l6ZW9mICgqc2VnaW5mbykpOwotCXNlZ2luZm8tPmZpeF9yb290ID0gTlVMTDsKLQlzZWdpbmZvLT5maXhfdGFpbCA9IE5VTEw7Ci0Jc2VnaW5mby0+YmZkX3NlY3Rpb24gPSBzZWc7Ci0Jc2VnaW5mby0+c3ltID0gMDsKLQlpZiAoc2VnID09IGJmZF9hYnNfc2VjdGlvbl9wdHIpCi0JICBhYnNfc2VnX2luZm8gPSBzZWdpbmZvOwotCWVsc2UgaWYgKHNlZyA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotCSAgdW5kX3NlZ19pbmZvID0gc2VnaW5mbzsKLQllbHNlCi0JICBiZmRfc2V0X3NlY3Rpb25fdXNlcmRhdGEgKHN0ZG91dHB1dCwgc2VnLCAoUFRSKSBzZWdpbmZvKTsKLSAgICAgIH0KLSAgfQotI2Vsc2UKLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0gIHNlZ19maXhfcm9vdFAgPSAmc2VnbWVudF9pbmZvW3NlZ10uZml4X3Jvb3Q7Ci0gIHNlZ19maXhfdGFpbFAgPSAmc2VnbWVudF9pbmZvW3NlZ10uZml4X3RhaWw7Ci0jZWxzZQotICBpZiAoc2VnID09IFNFR19EQVRBKQotICAgIHsKLSAgICAgIHNlZ19maXhfcm9vdFAgPSAmZGF0YV9maXhfcm9vdDsKLSAgICAgIHNlZ19maXhfdGFpbFAgPSAmZGF0YV9maXhfdGFpbDsKLSAgICB9Ci0gIGVsc2UgaWYgKHNlZyA9PSBTRUdfVEVYVCkKLSAgICB7Ci0gICAgICBzZWdfZml4X3Jvb3RQID0gJnRleHRfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJnRleHRfZml4X3RhaWw7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAga25vdyAoc2VnID09IFNFR19CU1MpOwotICAgICAgc2VnX2ZpeF9yb290UCA9ICZic3NfZml4X3Jvb3Q7Ci0gICAgICBzZWdfZml4X3RhaWxQID0gJmJzc19maXhfdGFpbDsKLSAgICB9Ci0KLSNlbmRpZgotI2VuZGlmCi19Ci0MCi1zdGF0aWMgdm9pZAotc3Vic2VnX3NldF9yZXN0IChzZWcsIHN1YnNlZykKLSAgICAgc2VnVCBzZWc7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICByZWdpc3RlciBmcmNoYWluUyAqZnJjUDsJLyogY3Jhd2wgZnJjaGFpbiBjaGFpbiAqLwotICByZWdpc3RlciBmcmNoYWluUyAqKmxhc3RQUDsJLyogYWRkcmVzcyBvZiBsYXN0IHBvaW50ZXIgKi8KLSAgZnJjaGFpblMgKm5ld1A7CQkvKiBhZGRyZXNzIG9mIG5ldyBmcmNoYWluICovCi0KLSAgbXJpX2NvbW1vbl9zeW1ib2wgPSBOVUxMOwotCi0gIGlmIChmcmFnX25vdyAmJiBmcmNoYWluX25vdykKLSAgICBmcmNoYWluX25vdy0+ZnJjaF9mcmFnX25vdyA9IGZyYWdfbm93OwotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3cgPT0gMAotCSAgfHwgbm93X3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbgotCSAgfHwgbm93X3NlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JICB8fCBmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKLQotICBzdWJzZWdfY2hhbmdlIChzZWcsIChpbnQpIHN1YnNlZyk7Ci0KLSAgaWYgKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHsKLSAgICAgIGZyY2hhaW5fbm93ID0gJmFic29sdXRlX2ZyY2hhaW47Ci0gICAgICBmcmFnX25vdyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgYXNzZXJ0IChmcmNoYWluX25vdyA9PSAwCi0JICB8fCBub3dfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uCi0JICB8fCBmcmNoYWluX25vdy0+ZnJjaF9sYXN0ID09IGZyYWdfbm93KTsKLQotICAvKgotICAgKiBBdHRlbXB0IHRvIGZpbmQgb3IgbWFrZSBhIGZyY2hhaW4gZm9yIHRoYXQgc3ViIHNlZy4KLSAgICogQ3Jhd2wgYWxvbmcgY2hhaW4gb2YgZnJjaGFpblNzLCBiZWdpbnMgQCBmcmNoYWluX3Jvb3QuCi0gICAqIElmIHdlIG5lZWQgdG8gbWFrZSBhIGZyY2hhaW5TLCBsaW5rIGl0IGludG8gY29ycmVjdAotICAgKiBwb3NpdGlvbiBvZiBjaGFpbiByb290ZWQgaW4gZnJjaGFpbl9yb290LgotICAgKi8KLSAgZm9yIChmcmNQID0gKihsYXN0UFAgPSAmZnJjaGFpbl9yb290KTsKLSAgICAgICBmcmNQICYmIGZyY1AtPmZyY2hfc2VnIDw9IHNlZzsKLSAgICAgICBmcmNQID0gKihsYXN0UFAgPSAmZnJjUC0+ZnJjaF9uZXh0KSkKLSAgICB7Ci0gICAgICBpZiAoZnJjUC0+ZnJjaF9zZWcgPT0gc2VnCi0JICAmJiBmcmNQLT5mcmNoX3N1YnNlZyA+PSBzdWJzZWcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgLyoKLSAgICogZnJjUDoJCUFkZHJlc3Mgb2YgdGhlIDFzdCBmcmNoYWluUyBpbiBjb3JyZWN0IHNlZ21lbnQgd2l0aAotICAgKgkJZnJjaF9zdWJzZWcgPj0gc3Vic2VnLgotICAgKgkJV2Ugd2FudCB0byBlaXRoZXIgdXNlIHRoaXMgZnJjaGFpblMsIG9yIHdlIHdhbnQKLSAgICoJCXRvIGluc2VydCBhIG5ldyBmcmNoYWluUyBqdXN0IGJlZm9yZSBpdC4KLSAgICoKLSAgICoJCUlmIGZyY1A9PU5VTEwsIHRoZW4gd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluCi0gICAqCQlvZiBmcmNoYWluUy1zLiBBIE5VTEwgZnJjUCBtZWFucyB3ZSBmZWxsIG9mZiB0aGUgZW5kCi0gICAqCQlvZiB0aGUgY2hhaW4gbG9va2luZyBmb3IgYQotICAgKgkJZnJjaF9zdWJzZWcgPj0gc3Vic2VnLCBzbyB3ZQotICAgKgkJbXVzdCBtYWtlIGEgbmV3IGZyY2hhaW5TLgotICAgKgotICAgKgkJSWYgd2UgZXZlciBtYWludGFpbiBhIHBvaW50ZXIgdG8KLSAgICoJCXRoZSBsYXN0IGZyY2hhaW5TIGluIHRoZSBjaGFpbiwgd2UgY2hhbmdlIHRoYXQgcG9pbnRlcgotICAgKgkJT05MWSB3aGVuIGZyY1A9PU5VTEwuCi0gICAqCi0gICAqIGxhc3RQUDoJQWRkcmVzcyBvZiB0aGUgcG9pbnRlciB3aXRoIHZhbHVlIGZyY1A7Ci0gICAqCQlOZXZlciBOVUxMLgotICAgKgkJTWF5IHBvaW50IHRvIGZyY2hhaW5fcm9vdC4KLSAgICoKLSAgICovCi0gIGlmICghZnJjUAotICAgICAgfHwgKGZyY1AtPmZyY2hfc2VnID4gc2VnCi0JICB8fCBmcmNQLT5mcmNoX3N1YnNlZyA+IHN1YnNlZykpCS8qIEtpbmt5IGxvZ2ljIG9ubHkgd29ya3Mgd2l0aCAyIHNlZ21lbnRzLiAqLwotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBUaGlzIHNob3VsZCBiZSB0aGUgb25seSBjb2RlIHRoYXQgY3JlYXRlcyBhIGZyY2hhaW5TLgotICAgICAgICovCi0gICAgICBuZXdQID0gKGZyY2hhaW5TICopIG9ic3RhY2tfYWxsb2MgKCZmcmNoYWlucywgc2l6ZW9mIChmcmNoYWluUykpOwotICAgICAgbmV3UC0+ZnJjaF9zdWJzZWcgPSBzdWJzZWc7Ci0gICAgICBuZXdQLT5mcmNoX3NlZyA9IHNlZzsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBuZXdQLT5maXhfcm9vdCA9IE5VTEw7Ci0gICAgICBuZXdQLT5maXhfdGFpbCA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgIG9ic3RhY2tfYmVnaW4gKCZuZXdQLT5mcmNoX29ic3RhY2ssIGNodW5rc2l6ZSk7Ci0jaWYgX19HTlVDX18gPj0gMgotICAgICAgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoJm5ld1AtPmZyY2hfb2JzdGFjaykgPSBfX2FsaWdub2ZfXyAoZnJhZ1MpIC0gMTsKLSNlbmRpZgotICAgICAgbmV3UC0+ZnJjaF9mcmFnX25vdyA9IGZyYWdfYWxsb2MgKCZuZXdQLT5mcmNoX29ic3RhY2spOwotICAgICAgbmV3UC0+ZnJjaF9mcmFnX25vdy0+ZnJfdHlwZSA9IHJzX2ZpbGw7Ci0KLSAgICAgIG5ld1AtPmZyY2hfcm9vdCA9IG5ld1AtPmZyY2hfbGFzdCA9IG5ld1AtPmZyY2hfZnJhZ19ub3c7Ci0KLSAgICAgICpsYXN0UFAgPSBuZXdQOwotICAgICAgbmV3UC0+ZnJjaF9uZXh0ID0gZnJjUDsJLyogcGVyaGFwcyBOVUxMICovCi0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICB7Ci0Jc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0Jc2VnaW5mbyA9IHNlZ19pbmZvIChzZWcpOwotCWlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZyY2hhaW5QID09IGZyY1ApCi0JICBzZWdpbmZvLT5mcmNoYWluUCA9IG5ld1A7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIAotICAgICAgZnJjUCA9IG5ld1A7Ci0gICAgfQotICAvKgotICAgKiBIZXJlIHdpdGggZnJjUCBwb2ludGluZyB0byB0aGUgZnJjaGFpblMgZm9yIHN1YnNlZy4KLSAgICovCi0gIGZyY2hhaW5fbm93ID0gZnJjUDsKLSAgZnJhZ19ub3cgPSBmcmNQLT5mcmNoX2ZyYWdfbm93OwotCi0gIGFzc2VydCAoZnJjaGFpbl9ub3ctPmZyY2hfbGFzdCA9PSBmcmFnX25vdyk7Ci19Ci0KLS8qCi0gKgkJCXN1YnNlZ19zZXQoc2VnVCwgc3Vic2VnVCkKLSAqCi0gKiBJZiB5b3UgYXR0ZW1wdCB0byBjaGFuZ2UgdG8gdGhlIGN1cnJlbnQgc3Vic2VnbWVudCwgbm90aGluZyBoYXBwZW5zLgotICoKLSAqIEluOglzZWdULCBzdWJzZWdUIGNvZGUgZm9yIG5ldyBzdWJzZWdtZW50LgotICoJZnJhZ19ub3cgLT4gaW5jb21wbGV0ZSBmcmFnIGZvciBjdXJyZW50IHN1YnNlZ21lbnQuCi0gKglJZiBmcmFnX25vdz09TlVMTCwgdGhlbiB0aGVyZSBpcyBubyBvbGQsIGluY29tcGxldGUgZnJhZywgc28KLSAqCXRoZSBvbGQgZnJhZyBpcyBub3QgY2xvc2VkIG9mZi4KLSAqCi0gKiBPdXQ6CW5vd19zdWJzZWcsIG5vd19zZWcgdXBkYXRlZC4KLSAqCUZyY2hhaW5fbm93IHBvaW50cyB0byB0aGUgKHBvc3NpYmx5IG5ldykgc3RydWN0IGZyY2hhaW4gZm9yIHRoaXMKLSAqCXN1Yi1zZWdtZW50LgotICoJRnJjaGFpbl9yb290IHVwZGF0ZWQgaWYgbmVlZGVkLgotICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi1zZWdUCi1zdWJzZWdfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAwOyBpIDwgKGludCkgU0VHX01BWElNVU1fT1JESU5BTDsgaSsrKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICAgIHMgPSBzZWdtZW50X25hbWUgKChzZWdUKSBpKTsKLSAgICAgIGlmIChzdHJjbXAgKHNlZ25hbWUsIHMpID09IDAKLQkgIHx8IChzZWduYW1lWzBdID09ICcuJwotCSAgICAgICYmIHN0cmNtcCAoc2VnbmFtZSArIDEsIHMpID09IDApKQotCXsKLQkgIHN1YnNlZ19zZXQgKChzZWdUKSBpLCBzdWJzZWcpOwotCSAgcmV0dXJuIChzZWdUKSBpOwotCX0KLSNpZmRlZiBvYmpfc2VnbWVudF9uYW1lCi0gICAgICBzID0gb2JqX3NlZ21lbnRfbmFtZSAoKHNlZ1QpIGkpOwotICAgICAgaWYgKHN0cmNtcCAoc2VnbmFtZSwgcykgPT0gMAotCSAgfHwgKHNlZ25hbWVbMF0gPT0gJy4nCi0JICAgICAgJiYgc3RyY21wIChzZWduYW1lICsgMSwgcykgPT0gMCkpCi0JewotCSAgc3Vic2VnX3NldCAoKHNlZ1QpIGksIHN1YnNlZyk7Ci0JICByZXR1cm4gKHNlZ1QpIGk7Ci0JfQotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgb2JqX2FkZF9zZWdtZW50Ci0gIHsKLSAgICBzZWdUIG5ld19zZWc7Ci0gICAgbmV3X3NlZyA9IG9ial9hZGRfc2VnbWVudCAoc2VnbmFtZSk7Ci0gICAgc3Vic2VnX3NldCAobmV3X3NlZywgc3Vic2VnKTsKLSAgICByZXR1cm4gbmV3X3NlZzsKLSAgfQotI2Vsc2UKLSAgYXNfYmFkIChfKCJBdHRlbXB0IHRvIHN3aXRjaCB0byBub25leGlzdGVudCBzZWdtZW50IFwiJXNcIiIpLCBzZWduYW1lKTsKLSAgcmV0dXJuIG5vd19zZWc7Ci0jZW5kaWYKLX0KLQotdm9pZAotc3Vic2VnX3NldCAoc2VnLCBzdWJzZWcpCS8qIGJlZ2luIGFzc2VtYmx5IGZvciBhIG5ldyBzdWItc2VnbWVudCAqLwotICAgICByZWdpc3RlciBzZWdUIHNlZzsJCS8qIFNFR19EQVRBIG9yIFNFR19URVhUICovCi0gICAgIHJlZ2lzdGVyIHN1YnNlZ1Qgc3Vic2VnOwotewotI2lmbmRlZiBNQU5ZX1NFR01FTlRTCi0gIGtub3cgKHNlZyA9PSBTRUdfREFUQQotCXx8IHNlZyA9PSBTRUdfVEVYVAotCXx8IHNlZyA9PSBTRUdfQlNTCi0JfHwgc2VnID09IFNFR19BQlNPTFVURSk7Ci0jZW5kaWYKLQotICBpZiAoc2VnICE9IG5vd19zZWcgfHwgc3Vic2VnICE9IG5vd19zdWJzZWcpCi0gICAgewkJCQkvKiB3ZSBqdXN0IGNoYW5nZWQgc3ViLXNlZ21lbnRzICovCi0gICAgICBzdWJzZWdfc2V0X3Jlc3QgKHNlZywgc3Vic2VnKTsKLSAgICB9Ci0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLX0KLQotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi1zZWdUCi1zdWJzZWdfZ2V0IChzZWduYW1lLCBmb3JjZV9uZXcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIGludCBmb3JjZV9uZXc7Ci17Ci0gIHNlZ1Qgc2VjcHRyOwotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbzsKLSAgY29uc3QgY2hhciAqbm93X3NlZ19uYW1lID0gKG5vd19zZWcKLQkJCSAgICAgID8gYmZkX2dldF9zZWN0aW9uX25hbWUgKHN0ZG91dHB1dCwgbm93X3NlZykKLQkJCSAgICAgIDogMCk7Ci0KLSAgaWYgKCFmb3JjZV9uZXcKLSAgICAgICYmIG5vd19zZWdfbmFtZQotICAgICAgJiYgKG5vd19zZWdfbmFtZSA9PSBzZWduYW1lCi0JICB8fCAhc3RyY21wIChub3dfc2VnX25hbWUsIHNlZ25hbWUpKSkKLSAgICByZXR1cm4gbm93X3NlZzsKLQotICBpZiAoIWZvcmNlX25ldykKLSAgICBzZWNwdHIgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN0ZG91dHB1dCwgc2VnbmFtZSk7Ci0gIGVsc2UKLSAgICBzZWNwdHIgPSBiZmRfbWFrZV9zZWN0aW9uX2FueXdheSAoc3Rkb3V0cHV0LCBzZWduYW1lKTsKLQotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8pCi0gICAgewotICAgICAgLyogQ2hlY2sgd2hldGhlciBvdXRwdXRfc2VjdGlvbiBpcyBzZXQgZmlyc3QgYmVjYXVzZSBzZWNwdHIgbWF5Ci0gICAgICAgICBiZSBiZmRfYWJzX3NlY3Rpb25fcHRyLiAgKi8KLSAgICAgIGlmIChzZWNwdHItPm91dHB1dF9zZWN0aW9uICE9IHNlY3B0cikKLQlzZWNwdHItPm91dHB1dF9zZWN0aW9uID0gc2VjcHRyOwotICAgICAgc2VnaW5mbyA9IChzZWdtZW50X2luZm9fdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKCpzZWdpbmZvKSk7Ci0gICAgICBtZW1zZXQgKChQVFIpIHNlZ2luZm8sIDAsIHNpemVvZiAoKnNlZ2luZm8pKTsKLSAgICAgIHNlZ2luZm8tPmZpeF9yb290ID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmZpeF90YWlsID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmJmZF9zZWN0aW9uID0gc2VjcHRyOwotICAgICAgaWYgKHNlY3B0ciA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotCWFic19zZWdfaW5mbyA9IHNlZ2luZm87Ci0gICAgICBlbHNlIGlmIChzZWNwdHIgPT0gYmZkX3VuZF9zZWN0aW9uX3B0cikKLQl1bmRfc2VnX2luZm8gPSBzZWdpbmZvOwotICAgICAgZWxzZQotCWJmZF9zZXRfc2VjdGlvbl91c2VyZGF0YSAoc3Rkb3V0cHV0LCBzZWNwdHIsIChQVFIpIHNlZ2luZm8pOwotICAgICAgc2VnaW5mby0+ZnJjaGFpblAgPSBOVUxMOwotICAgICAgc2VnaW5mby0+bGluZW5vX2xpc3RfaGVhZCA9IHNlZ2luZm8tPmxpbmVub19saXN0X3RhaWwgPSBOVUxMOwotICAgICAgc2VnaW5mby0+c3ltID0gTlVMTDsKLSAgICAgIHNlZ2luZm8tPmRvdCA9IE5VTEw7Ci0gICAgfQotICByZXR1cm4gc2VjcHRyOwotfQotCi1zZWdUCi1zdWJzZWdfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0KLSAgc2VjcHRyID0gc3Vic2VnX2dldCAoc2VnbmFtZSwgMCk7Ci0gIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gIHJldHVybiBzZWNwdHI7Ci19Ci0KLS8qIExpa2Ugc3Vic2VnX25ldywgZXhjZXB0IGEgbmV3IHNlY3Rpb24gaXMgYWx3YXlzIGNyZWF0ZWQsIGV2ZW4gaWYKLSAgIGEgc2VjdGlvbiB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cy4gICovCi1zZWdUCi1zdWJzZWdfZm9yY2VfbmV3IChzZWduYW1lLCBzdWJzZWcpCi0gICAgIGNvbnN0IGNoYXIgKnNlZ25hbWU7Ci0gICAgIHN1YnNlZ1Qgc3Vic2VnOwotewotICBzZWdUIHNlY3B0cjsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm87Ci0KLSAgc2VjcHRyID0gc3Vic2VnX2dldCAoc2VnbmFtZSwgMSk7Ci0gIHN1YnNlZ19zZXRfcmVzdCAoc2VjcHRyLCBzdWJzZWcpOwotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlY3B0cik7Ci0gIGlmICghIHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIHNlZ2luZm8tPmZyY2hhaW5QID0gZnJjaGFpbl9ub3c7Ci0gIHJldHVybiBzZWNwdHI7Ci19Ci0KLXZvaWQKLXN1YnNlZ19zZXQgKHNlY3B0ciwgc3Vic2VnKQotICAgICBzZWdUIHNlY3B0cjsKLSAgICAgc3Vic2VnVCBzdWJzZWc7Ci17Ci0gIGlmICghIChzZWNwdHIgPT0gbm93X3NlZyAmJiBzdWJzZWcgPT0gbm93X3N1YnNlZykpCi0gICAgc3Vic2VnX3NldF9yZXN0IChzZWNwdHIsIHN1YnNlZyk7Ci0gIG1yaV9jb21tb25fc3ltYm9sID0gTlVMTDsKLX0KLQotI2lmbmRlZiBvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MKLSNkZWZpbmUgb2JqX3NlY19zeW1fb2tfZm9yX3JlbG9jKFNFQykJMAotI2VuZGlmCi0KLS8qIEdldCB0aGUgZ2FzIGluZm9ybWF0aW9uIHdlIGFyZSBzdG9yaW5nIGZvciBhIHNlY3Rpb24uICAqLwotCi1zZWdtZW50X2luZm9fdHlwZSAqCi1zZWdfaW5mbyAoc2VjKQotICAgICBzZWdUIHNlYzsKLXsKLSAgaWYgKHNlYyA9PSBiZmRfYWJzX3NlY3Rpb25fcHRyKQotICAgIHJldHVybiBhYnNfc2VnX2luZm87Ci0gIGVsc2UgaWYgKHNlYyA9PSBiZmRfdW5kX3NlY3Rpb25fcHRyKQotICAgIHJldHVybiB1bmRfc2VnX2luZm87Ci0gIGVsc2UKLSAgICByZXR1cm4gKHNlZ21lbnRfaW5mb190eXBlICopIGJmZF9nZXRfc2VjdGlvbl91c2VyZGF0YSAoc3Rkb3V0cHV0LCBzZWMpOwotfQotCi1zeW1ib2xTICoKLXNlY3Rpb25fc3ltYm9sIChzZWMpCi0gICAgIHNlZ1Qgc2VjOwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBzeW1ib2xTICpzOwotCi0gIGlmIChzZWdpbmZvID09IDApCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChzZWdpbmZvLT5zeW0pCi0gICAgcmV0dXJuIHNlZ2luZm8tPnN5bTsKLQotI2lmbmRlZiBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2RlZmluZSBFTUlUX1NFQ1RJT05fU1lNQk9MUyAxCi0jZW5kaWYKLQotICBpZiAoISBFTUlUX1NFQ1RJT05fU1lNQk9MUwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIHx8IHN5bWJvbF90YWJsZV9mcm96ZW4KLSNlbmRpZgotICAgICAgKQotICAgIHsKLSAgICAgIC8qIEhlcmUgd2Uga25vdyBpdCB3b24ndCBiZSBnb2luZyBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICAgICAgcyA9IHN5bWJvbF9jcmVhdGUgKHNlYy0+bmFtZSwgc2VjLCAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHMgPSBzeW1ib2xfZmluZF9iYXNlIChzZWMtPm5hbWUsIDApOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlzID0gc3ltYm9sX25ldyAoc2VjLT5uYW1lLCBzZWMsIDAsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKFNfR0VUX1NFR01FTlQgKHMpID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICB7Ci0JICAgICAgU19TRVRfU0VHTUVOVCAocywgc2VjKTsKLQkgICAgICBzeW1ib2xfc2V0X2ZyYWcgKHMsICZ6ZXJvX2FkZHJlc3NfZnJhZyk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIFNfQ0xFQVJfRVhURVJOQUwgKHMpOwotCi0gIC8qIFVzZSB0aGUgQkZEIHNlY3Rpb24gc3ltYm9sLCBpZiBwb3NzaWJsZS4gICovCi0gIGlmIChvYmpfc2VjX3N5bV9va19mb3JfcmVsb2MgKHNlYykpCi0gICAgc3ltYm9sX3NldF9iZmRzeW0gKHMsIHNlYy0+c3ltYm9sKTsKLQotICBzZWdpbmZvLT5zeW0gPSBzOwotICByZXR1cm4gczsKLX0KLQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotLyogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzZWdtZW50IGlzIHRob3VnaHQgdG8gaG9sZCB0ZXh0LiAgKi8KLQotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi1jb25zdCBjaGFyICogY29uc3Qgbm9udGV4dF9zZWN0aW9uX25hbWVzW10gPQotewotICAiLmVoX2ZyYW1lIiwKLSAgIi5nY2NfZXhjZXB0X3RhYmxlIiwKLSNpZmRlZiBPQkpfQ09GRgotI2lmbmRlZiBDT0ZGX0xPTkdfU0VDVElPTl9OQU1FUwotICAiLmVoX2ZyYW0iLAotICAiLmdjY19leGMiLAotI2VuZGlmCi0jZW5kaWYKLSAgTlVMTAotfTsKLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotaW50Ci1zdWJzZWdfdGV4dF9wIChzZWMpCi0gICAgIHNlZ1Qgc2VjOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgcmV0dXJuIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc2VjKSAmIFNFQ19DT0RFKSAhPSAwOwotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0gIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKLQotICBpZiAoc2VjID09IGRhdGFfc2VjdGlvbiB8fCBzZWMgPT0gYnNzX3NlY3Rpb24pCi0gICAgcmV0dXJuIDA7Ci0KLSAgZm9yIChwID0gbm9udGV4dF9zZWN0aW9uX25hbWVzOyAqcCAhPSBOVUxMOyArK3ApCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoc2VnbWVudF9uYW1lIChzZWMpLCAqcCkgPT0gMCkKLQlyZXR1cm4gMDsKLQotI2lmZGVmIG9ial9zZWdtZW50X25hbWUKLSAgICAgIGlmIChzdHJjbXAgKG9ial9zZWdtZW50X25hbWUgKHNlYyksICpwKSA9PSAwKQotCXJldHVybiAwOwotI2VuZGlmCi0gICAgfQotCi0gIHJldHVybiAxOwotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi19Ci0KLXZvaWQKLXN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSkKLSAgICAgRklMRSAqZmlsZTsKLXsKLSAgZnJjaGFpblMgKmZyY2hwOwotICBmcHJpbnRmIChmaWxlLCAiZnJhZyBjaGFpbnM6XG4iKTsKLSAgZm9yIChmcmNocCA9IGZyY2hhaW5fcm9vdDsgZnJjaHA7IGZyY2hwID0gZnJjaHAtPmZyY2hfbmV4dCkKLSAgICB7Ci0gICAgICBpbnQgY291bnQgPSAwOwotICAgICAgZnJhZ1MgKmZyYWdwOwotCi0gICAgICAvKiBJZiBmcmNoX3N1YnNlZyBpcyBub24temVybywgaXQncyBwcm9iYWJseSBiZWVuIGNoYWluZWQgb250bwotCSB0aGUgZW5kIG9mIGEgcHJldmlvdXMgc3Vic2VjdGlvbi4gIERvbid0IGNvdW50IGl0IGFnYWluLiAgKi8KLSAgICAgIGlmIChmcmNocC0+ZnJjaF9zdWJzZWcgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogU2tpcCBnYXMtaW50ZXJuYWwgc2VjdGlvbnMuICAqLwotICAgICAgaWYgKHNlZ21lbnRfbmFtZSAoZnJjaHAtPmZyY2hfc2VnKVswXSA9PSAnKicpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAoZnJhZ3AgPSBmcmNocC0+ZnJjaF9yb290OyBmcmFncDsgZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dCkKLQl7Ci0jaWYgMAotCSAgc3dpdGNoIChmcmFncC0+ZnJfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIHJzX2ZpbGw6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgImYiKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfYWxpZ246Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgImEiKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfYWxpZ25fY29kZToKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiYyIpOyBicmVhazsKLQkgICAgY2FzZSByc19vcmc6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIm8iKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgIm0iKTsgYnJlYWs7Ci0JICAgIGNhc2UgcnNfc3BhY2U6Ci0JICAgICAgZnByaW50ZiAoZmlsZSwgInMiKTsgYnJlYWs7Ci0JICAgIGNhc2UgMDoKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiMCIpOyBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcHJpbnRmIChmaWxlLCAiPyIpOyBicmVhazsKLQkgICAgfQotI2VuZGlmCi0JICBjb3VudCsrOwotCX0KLSAgICAgIGZwcmludGYgKGZpbGUsICJcbiIpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIlx0JXAgJS0xMHNcdCUxMGQgZnJhZ3NcbiIsIGZyY2hwLAotCSAgICAgICBzZWdtZW50X25hbWUgKGZyY2hwLT5mcmNoX3NlZyksIGNvdW50KTsKLSAgICB9Ci19Ci0KLS8qIGVuZCBvZiBzdWJzZWdzLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy9zdWJzZWdzLmggYi9nYXMvc3Vic2Vncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQwZDViLi4wMDAwMDAwCi0tLSBhL2dhcy9zdWJzZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyogc3Vic2Vncy5oIC0+IHN1YnNlZ3MuYwotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gKiBGb3IgZXZlcnkgc3ViLXNlZ21lbnQgdGhlIHVzZXIgbWVudGlvbnMgaW4gdGhlIEFTc2VtYmxlciBwcm9ncmFtLAotICogd2UgbWFrZSBvbmUgc3RydWN0IGZyY2hhaW4uIEVhY2ggc3ViLXNlZ21lbnQgaGFzIGV4YWN0bHkgb25lIHN0cnVjdCBmcmNoYWluCi0gKiBhbmQgdmljZSB2ZXJzYS4KLSAqCi0gKiBTdHJ1Y3QgZnJjaGFpbidzIGFyZSBmb3J3YXJkIGNoYWluZWQgKGluIGFzY2VuZGluZyBvcmRlciBvZiBzdWItc2VnbWVudAotICogY29kZSBudW1iZXIpLiBUaGUgY2hhaW4gcnVucyB0aHJvdWdoIGZyY2hfbmV4dCBvZiBlYWNoIHN1YnNlZ21lbnQuCi0gKiBUaGlzIG1ha2VzIGl0IGhhcmQgdG8gZmluZCBhIHN1YnNlZ21lbnQncyBmcmFncwotICogaWYgcHJvZ3JhbW1lciB1c2VzIGEgbG90IG9mIHRoZW0uIE1vc3QgcHJvZ3JhbXMgb25seSB1c2UgdGV4dDAgYW5kCi0gKiBkYXRhMCwgc28gdGhleSBkb24ndCBzdWZmZXIuIEF0IGxlYXN0IHRoaXMgd2F5OgotICogKDEpCVRoZXJlIGFyZSBubyAiYXJiaXRyYXJ5IiByZXN0cmljdGlvbnMgb24gaG93IG1hbnkgc3Vic2VnbWVudHMKLSAqCWNhbiBiZSBwcm9ncmFtbWVkOwotICogKDIpCVN1YnNlZ21lbnRzJyBmcmNoYWluLXMgYXJlIChsYXRlcikgY2hhaW5lZCB0b2dldGhlciBpbiB0aGUgb3JkZXIgaW4KLSAqCXdoaWNoIHRoZXkgYXJlIGVtaXR0ZWQgZm9yIG9iamVjdCBmaWxlIHZpeiB0ZXh0IHRoZW4gZGF0YS4KLSAqCi0gKiBGcm9tIGVhY2ggc3RydWN0IGZyY2hhaW4gZGFuZ2xlcyBhIGNoYWluIG9mIHN0cnVjdCBmcmFncy4gVGhlIGZyYWdzCi0gKiByZXByZXNlbnQgY29kZSBmcmFnbWVudHMsIGZvciB0aGF0IHN1Yi1zZWdtZW50LCBmb3J3YXJkIGNoYWluZWQuCi0gKi8KLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotc3RydWN0IGZyY2hhaW4JCQkvKiBjb250cm9sIGJ1aWxkaW5nIG9mIGEgZnJhZyBjaGFpbiAqLwotewkJCQkvKiBGUkNIID0gRlJhZ21lbnQgQ0hhaW4gY29udHJvbCAqLwotICBzdHJ1Y3QgZnJhZyAqZnJjaF9yb290OwkvKiAxc3Qgc3RydWN0IGZyYWcgaW4gY2hhaW4sIG9yIE5VTEwgKi8KLSAgc3RydWN0IGZyYWcgKmZyY2hfbGFzdDsJLyogbGFzdCBzdHJ1Y3QgZnJhZyBpbiBjaGFpbiwgb3IgTlVMTCAqLwotICBzdHJ1Y3QgZnJjaGFpbiAqZnJjaF9uZXh0OwkvKiBuZXh0IGluIGNoYWluIG9mIHN0cnVjdCBmcmNoYWluLXMgKi8KLSAgc2VnVCBmcmNoX3NlZzsJCS8qIFNFR19URVhUIG9yIFNFR19EQVRBLiAqLwotICBzdWJzZWdUIGZyY2hfc3Vic2VnOwkJLyogc3Vic2VnbWVudCBudW1iZXIgb2YgdGhpcyBjaGFpbiAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgZml4UyAqZml4X3Jvb3Q7CQkvKiBSb290IG9mIGZpeHVwcyBmb3IgdGhpcyBzdWJzZWdtZW50LiAgKi8KLSAgZml4UyAqZml4X3RhaWw7CQkvKiBMYXN0IGZpeHVwIGZvciB0aGlzIHN1YnNlZ21lbnQuICAqLwotI2VuZGlmCi0gIHN0cnVjdCBvYnN0YWNrIGZyY2hfb2JzdGFjazsJLyogZm9yIG9iamVjdHMgaW4gdGhpcyBmcmFnIGNoYWluICovCi0gIGZyYWdTICpmcmNoX2ZyYWdfbm93OwkJLyogZnJhZ19ub3cgZm9yIHRoaXMgc3Vic2VnbWVudCAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgZnJjaGFpbiBmcmNoYWluUzsKLQotLyogQWxsIHN1YnNlZ21lbnRzJyBjaGFpbnMgaGFuZyBvZmYgaGVyZS4gIE5VTEwgbWVhbnMgbm8gZnJjaGFpbnMgeWV0LiAgKi8KLWV4dGVybiBmcmNoYWluUyAqZnJjaGFpbl9yb290OwotCi0vKiBGcmNoYWluIHdlIGFyZSBhc3NlbWJsaW5nIGludG8gbm93LiAgVGhhdCBpcywgdGhlIGN1cnJlbnQgc2VnbWVudCdzCi0gICBmcmFnIGNoYWluLCBldmVuIGlmIGl0IGNvbnRhaW5zIG5vIChjb21wbGV0ZSkgZnJhZ3MuICovCi1leHRlcm4gZnJjaGFpblMgKmZyY2hhaW5fbm93OwotCi0KLXR5cGVkZWYgc3RydWN0IHNlZ21lbnRfaW5mb19zdHJ1Y3QKLXsKLSAgZnJjaGFpblMgKmZyY2hhaW5QOwotICB1bnNpZ25lZCBpbnQgaGFkb25lIDogMTsKLQotICAvKiBUaGlzIGZpZWxkIGlzIHNldCBpZiB0aGlzIGlzIGEgLmJzcyBzZWN0aW9uIHdoaWNoIGRvZXMgbm90IHJlYWxseQotICAgICBoYXZlIGFueSBjb250ZW50cy4gIE9uY2UgdXBvbiBhIHRpbWUgYSAuYnNzIHNlY3Rpb24gZGlkIG5vdCBoYXZlCi0gICAgIGFueSBmcmFncywgYnV0IHRoYXQgaXMgbm8gbG9uZ2VyIHRydWUuICBUaGlzIGZpZWxkIHByZXZlbnQgdGhlCi0gICAgIFNFQ19IQVNfQ09OVEVOVFMgZmxhZyBmcm9tIGJlaW5nIHNldCBmb3IgdGhlIHNlY3Rpb24gZXZlbiBpZgotICAgICB0aGVyZSBhcmUgZnJhZ3MuICAqLwotICB1bnNpZ25lZCBpbnQgYnNzIDogMTsKLQotICBpbnQgdXNlcl9zdHVmZjsKLQotICAvKiBGaXh1cHMgZm9yIHRoaXMgc2VnbWVudC4gIElmIEJGRF9BU1NFTUJMRVIsIHRoaXMgaXMgb25seSB2YWxpZAotICAgICBhZnRlciB0aGUgZnJjaGFpbnMgYXJlIHJ1biB0b2dldGhlci4gICovCi0gIGZpeFMgKmZpeF9yb290OwotICBmaXhTICpmaXhfdGFpbDsKLQotI2lmIGRlZmluZWQgKE1BTllfU0VHTUVOVFMpICYmICFkZWZpbmVkIChCRkRfQVNTRU1CTEVSKQotICBzdHJ1Y3QgaW50ZXJuYWxfc2NuaGRyIHNjbmhkcjsKLSAgZW51bSBsaW5rb25jZV90eXBlIGxpbmtvbmNlOwotICBjb25zdCBjaGFyICpuYW1lOwotI2VuZGlmCi0KLSAgc3ltYm9sUyAqZG90OwotCi0gIHN0cnVjdCBsaW5lbm9fbGlzdCAqbGluZW5vX2xpc3RfaGVhZDsKLSAgc3RydWN0IGxpbmVub19saXN0ICpsaW5lbm9fbGlzdF90YWlsOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBXaGljaCBCRkQgc2VjdGlvbiBkb2VzIHRoaXMgZ2FzIHNlZ21lbnQgY29ycmVzcG9uZCB0bz8gICovCi0gIGFzZWN0aW9uICpiZmRfc2VjdGlvbjsKLQotICAvKiBOVUxMLCBvciBwb2ludGVyIHRvIHRoZSBnYXMgc3ltYm9sIHRoYXQgaXMgdGhlIHNlY3Rpb24gc3ltYm9sIGZvcgotICAgICB0aGlzIHNlY3Rpb24uICBzeW0tPmJzeW0gYW5kIGJmZF9zZWN0aW9uLT5zeW1ib2wgc2hvdWxkIGJlIHRoZSBzYW1lLiAgKi8KLSAgc3ltYm9sUyAqc3ltOwotI2VuZGlmCi0KLSAgdW5pb24KLSAgICB7Ci0gICAgICAvKiBDdXJyZW50IHNpemUgb2Ygc2VjdGlvbiBob2xkaW5nIHN0YWJzIHN0cmluZ3MuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBzdGFiX3N0cmluZ19zaXplOwotICAgICAgLyogSW5pdGlhbCBmcmFnIGZvciBFTEYuICAqLwotICAgICAgY2hhciAqcDsKLSAgICB9Ci0gIHN0YWJ1OwotCi0jaWZkZWYgTkVFRF9MSVRFUkFMX1BPT0wKLSAgdW5zaWduZWQgbG9uZyBsaXRlcmFsX3Bvb2xfc2l6ZTsKLSNlbmRpZgotCi0jaWZkZWYgVENfU0VHTUVOVF9JTkZPX1RZUEUKLSAgVENfU0VHTUVOVF9JTkZPX1RZUEUgdGNfc2VnbWVudF9pbmZvX2RhdGE7Ci0jZW5kaWYKLX0gc2VnbWVudF9pbmZvX3R5cGU7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLWV4dGVybiBzZWdtZW50X2luZm9fdHlwZSAqc2VnX2luZm8gUEFSQU1TICgoc2VnVCkpOwotZXh0ZXJuIHN5bWJvbFMgKnNlY3Rpb25fc3ltYm9sIFBBUkFNUyAoKHNlZ1QpKTsKLQotI2Vsc2UgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLSNpZmRlZiBNQU5ZX1NFR01FTlRTCi0KLWV4dGVybiBzZWdtZW50X2luZm9fdHlwZSBzZWdtZW50X2luZm9bXTsKLQotI2RlZmluZSBzZWdfaW5mbyhTRUMpCSgmc2VnbWVudF9pbmZvW1NFQ10pCi0KLSNlbHNlCi0KLS8qIFNlbnRpbmVsIGZvciBmcmNoYWluIGNyYXdsaW5nLiAgUG9pbnRzIHRvIHRoZSAxc3QgZGF0YS1zZWdtZW50Ci0gICBmcmNoYWluLiAgKFdoaWNoIGlzIHBvaW50ZWQgdG8gYnkgdGhlIGxhc3QgdGV4dC1zZWdtZW50IGZyY2hhaW4uKSAqLwotZXh0ZXJuIGZyY2hhaW5TICpkYXRhMF9mcmNoYWluUDsKLWV4dGVybiBmcmNoYWluUyAqYnNzMF9mcmNoYWluUDsKLQotLyogRHVtbXkgc28gc3R1ZmYgY2FuIGNvbXBpbGUuICBTaG91bGQgbmV2ZXIgYmUgdXNlZC4gICovCi1zdHJ1Y3Qgc2VnX2luZm9fdHJhc2ggewotICBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIHN0YWJfc3RyaW5nX3NpemUgOiAxOwotICB9IHN0YWJ1OwotICB1bnNpZ25lZCBoYWRvbmUgOiAxOwotfTsKLSNkZWZpbmUgc2VnX2luZm8oUykJKGFib3J0ICgpLCAoc3RydWN0IHNlZ19pbmZvX3RyYXNoICopIDApCi0KLSNlbmRpZgotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLWV4dGVybiB2b2lkIHN1YnNlZ3NfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLQotLyogZW5kIG9mIHN1YnNlZ3MuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N5bWJvbHMuYyBiL2dhcy9zeW1ib2xzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTIwMmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3N5bWJvbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI1MDEgKzAsMCBAQAotLyogc3ltYm9scy5jIC1zeW1ib2wgdGFibGUtCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAjZGVmaW5lIERFQlVHX1NZTVMgLyAqIHRvIGRlYnVnIHN5bWJvbCBsaXN0IG1haW50ZW5hbmNlICovCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYXMuaCIKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIJCS8qIEZvciAic3ltYm9scy5oIiAqLwotI2luY2x1ZGUgInN1YnNlZ3MuaCIKLQotI2luY2x1ZGUgInN0cnVjLXN5bWJvbC5oIgotCi0vKiBUaGlzIGlzIG5vbi16ZXJvIGlmIHN5bWJvbHMgYXJlIGNhc2Ugc2Vuc2l0aXZlLCB3aGljaCBpcyB0aGUKLSAgIGRlZmF1bHQuICAqLwotaW50IHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUgPSAxOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLWV4dGVybiBpbnQgbmV3X2Jyb2tlbl93b3JkczsKLSNlbmRpZgotCi0vKiBzeW1ib2wtbmFtZSA9PiBzdHJ1Y3Qgc3ltYm9sIHBvaW50ZXIgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpzeV9oYXNoOwotCi0vKiBUYWJsZSBvZiBsb2NhbCBzeW1ib2xzLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaGFzaF9jb250cm9sICpsb2NhbF9oYXNoOwotCi0vKiBCZWxvdyBhcmUgY29tbWVudGVkIGluICJzeW1ib2xzLmgiLiAqLwotc3ltYm9sUyAqc3ltYm9sX3Jvb3RQOwotc3ltYm9sUyAqc3ltYm9sX2xhc3RQOwotc3ltYm9sUyBhYnNfc3ltYm9sOwotCi0jaWZkZWYgREVCVUdfU1lNUwotI2RlZmluZSBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gdmVyaWZ5X3N5bWJvbF9jaGFpbgotI2Vsc2UKLSNkZWZpbmUgZGVidWdfdmVyaWZ5X3N5bWNoYWluKHJvb3QsIGxhc3QpICgodm9pZCkgMCkKLSNlbmRpZgotCi1zdHJ1Y3Qgb2JzdGFjayBub3RlczsKLQotc3RhdGljIHZvaWQgZmJfbGFiZWxfaW5pdCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgbG9uZyBkb2xsYXJfbGFiZWxfaW5zdGFuY2UgUEFSQU1TICgobG9uZykpOwotc3RhdGljIGxvbmcgZmJfbGFiZWxfaW5zdGFuY2UgUEFSQU1TICgobG9uZykpOwotCi1zdGF0aWMgdm9pZCBwcmludF9iaW5hcnkgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIGV4cHJlc3Npb25TICopKTsKLQotLyogc3ltYm9sX25ldygpCi0gIAotICAgUmV0dXJuIGEgcG9pbnRlciB0byBhIG5ldyBzeW1ib2wuICBEaWUgaWYgd2UgY2FuJ3QgbWFrZSBhIG5ldwotICAgc3ltYm9sLiAgRmlsbCBpbiB0aGUgc3ltYm9sJ3MgdmFsdWVzLiAgQWRkIHN5bWJvbCB0byBlbmQgb2Ygc3ltYm9sCi0gICBjaGFpbi4KLSAKLSAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgZ2VuZXJhbCBjYXNlIG9mIGNyZWF0aW5nIGEKLSAgIHN5bWJvbC4gIEhvd2V2ZXIsIGlmIHRoZSBvdXRwdXQgZmlsZSBzeW1ib2wgdGFibGUgaGFzIGFscmVhZHkgYmVlbgotICAgc2V0LCBhbmQgeW91IGFyZSBjZXJ0YWluIHRoYXQgdGhpcyBzeW1ib2wgd29uJ3QgYmUgd2FudGVkIGluIHRoZQotICAgb3V0cHV0IGZpbGUsIHlvdSBjYW4gY2FsbCBzeW1ib2xfY3JlYXRlLiAgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfbmV3IChuYW1lLCBzZWdtZW50LCB2YWx1LCBmcmFnKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBzZWdUIHNlZ21lbnQ7Ci0gICAgIHZhbHVlVCB2YWx1OwotICAgICBmcmFnUyAqZnJhZzsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUCA9IHN5bWJvbF9jcmVhdGUgKG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpOwotCi0gIC8qCi0gICAqIExpbmsgdG8gZW5kIG9mIHN5bWJvbCBjaGFpbi4KLSAgICovCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgZXh0ZXJuIGludCBzeW1ib2xfdGFibGVfZnJvemVuOwotICAgIGlmIChzeW1ib2xfdGFibGVfZnJvemVuKQotICAgICAgYWJvcnQgKCk7Ci0gIH0KLSNlbmRpZgotICBzeW1ib2xfYXBwZW5kIChzeW1ib2xQLCBzeW1ib2xfbGFzdFAsICZzeW1ib2xfcm9vdFAsICZzeW1ib2xfbGFzdFApOwotCi0gIHJldHVybiBzeW1ib2xQOwotfQotCi0vKiBTYXZlIGEgc3ltYm9sIG5hbWUgb24gYSBwZXJtYW5lbnQgb2JzdGFjaywgYW5kIGNvbnZlcnQgaXQgYWNjb3JkaW5nCi0gICB0byB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgKi8KLQotc3RhdGljIGNoYXIgKgotc2F2ZV9zeW1ib2xfbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgdW5zaWduZWQgaW50IG5hbWVfbGVuZ3RoOwotICBjaGFyICpyZXQ7Ci0KLSAgbmFtZV9sZW5ndGggPSBzdHJsZW4gKG5hbWUpICsgMTsJLyogKzEgZm9yIFwwICovCi0gIG9ic3RhY2tfZ3JvdyAoJm5vdGVzLCBuYW1lLCBuYW1lX2xlbmd0aCk7Ci0gIHJldCA9IG9ic3RhY2tfZmluaXNoICgmbm90ZXMpOwotCi0jaWZkZWYgU1RSSVBfVU5ERVJTQ09SRQotICBpZiAocmV0WzBdID09ICdfJykKLSAgICArK3JldDsKLSNlbmRpZgotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHJldCA9IHRjX2Nhbm9uaWNhbGl6ZV9zeW1ib2xfbmFtZSAocmV0KTsKLSNlbmRpZgotCi0gIGlmICghIHN5bWJvbHNfY2FzZV9zZW5zaXRpdmUpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqczsKLQotICAgICAgZm9yIChzID0gKHVuc2lnbmVkIGNoYXIgKikgcmV0OyAqcyAhPSAnXDAnOyBzKyspCi0JaWYgKGlzbG93ZXIgKCpzKSkKLQkgICpzID0gdG91cHBlciAoKnMpOwotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi1zeW1ib2xTICoKLXN5bWJvbF9jcmVhdGUgKG5hbWUsIHNlZ21lbnQsIHZhbHUsIGZyYWcpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7CQkvKiBJdCBpcyBjb3BpZWQsIHRoZSBjYWxsZXIgY2FuIGRlc3Ryb3kvbW9kaWZ5ICovCi0gICAgIHNlZ1Qgc2VnbWVudDsJCS8qIFNlZ21lbnQgaWRlbnRpZmllciAoU0VHXzxzb21ldGhpbmc+KSAqLwotICAgICB2YWx1ZVQgdmFsdTsJCS8qIFN5bWJvbCB2YWx1ZSAqLwotICAgICBmcmFnUyAqZnJhZzsJCS8qIEFzc29jaWF0ZWQgZnJhZ21lbnQgKi8KLXsKLSAgY2hhciAqcHJlc2VydmVkX2NvcHlfb2ZfbmFtZTsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBwcmVzZXJ2ZWRfY29weV9vZl9uYW1lID0gc2F2ZV9zeW1ib2xfbmFtZSAobmFtZSk7Ci0KLSAgc3ltYm9sUCA9IChzeW1ib2xTICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mIChzeW1ib2xTKSk7Ci0KLSAgLyogc3ltYm9sIG11c3QgYmUgYm9ybiBpbiBzb21lIGZpeGVkIHN0YXRlLiAgVGhpcyBzZWVtcyBhcyBnb29kIGFzIGFueS4gKi8KLSAgbWVtc2V0IChzeW1ib2xQLCAwLCBzaXplb2YgKHN5bWJvbFMpKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgc3ltYm9sUC0+YnN5bSA9IGJmZF9tYWtlX2VtcHR5X3N5bWJvbCAoc3Rkb3V0cHV0KTsKLSAgaWYgKHN5bWJvbFAtPmJzeW0gPT0gTlVMTCkKLSAgICBhc19wZXJyb3IgKCIlcyIsICJiZmRfbWFrZV9lbXB0eV9zeW1ib2wiKTsKLSAgc3ltYm9sUC0+YnN5bS0+dWRhdGEucCA9IChQVFIpIHN5bWJvbFA7Ci0jZW5kaWYKLSAgU19TRVRfTkFNRSAoc3ltYm9sUCwgcHJlc2VydmVkX2NvcHlfb2ZfbmFtZSk7Ci0KLSAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgc2VnbWVudCk7Ci0gIFNfU0VUX1ZBTFVFIChzeW1ib2xQLCB2YWx1KTsKLSAgc3ltYm9sX2NsZWFyX2xpc3RfcG9pbnRlcnMgKHN5bWJvbFApOwotCi0gIHN5bWJvbFAtPnN5X2ZyYWcgPSBmcmFnOwotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0gIHN5bWJvbFAtPnN5X251bWJlciA9IH4wOwotICBzeW1ib2xQLT5zeV9uYW1lX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIH4wOwotI2VuZGlmCi0KLSAgb2JqX3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUCk7Ci0KLSNpZmRlZiB0Y19zeW1ib2xfbmV3X2hvb2sKLSAgdGNfc3ltYm9sX25ld19ob29rIChzeW1ib2xQKTsKLSNlbmRpZgotCi0gIHJldHVybiBzeW1ib2xQOwotfQotDAotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogTG9jYWwgc3ltYm9sIHN1cHBvcnQuICBJZiB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBpdCwgd2Uga2VlcCBvbmx5IGEKLSAgIHNtYWxsIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBmb3IgbG9jYWwgc3ltYm9scy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NhbF9zeW1ib2xfbWFrZSBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlZ1QsCi0JCQkJCQkgICAgICAgdmFsdWVULCBmcmFnUyAqKSk7Ci1zdGF0aWMgc3ltYm9sUyAqbG9jYWxfc3ltYm9sX2NvbnZlcnQgUEFSQU1TICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSk7Ci0KLS8qIFVzZWQgZm9yIHN0YXRpc3RpY3MuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb2NhbF9zeW1ib2xfY291bnQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb2NhbF9zeW1ib2xfY29udmVyc2lvbl9jb3VudDsKLQotLyogVGhpcyBtYWNybyBpcyBjYWxsZWQgd2l0aCBhIHN5bWJvbCBhcmd1bWVudCBwYXNzZWQgYnkgcmVmZXJlbmNlLgotICAgSXQgcmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSBsb2NhbCBzeW1ib2wuICBJZiBuZWNlc3NhcnksIGl0Ci0gICBjaGFuZ2VzIGl0cyBhcmd1bWVudCB0byB0aGUgcmVhbCBzeW1ib2wuICAqLwotCi0jZGVmaW5lIExPQ0FMX1NZTUJPTF9DSEVDSyhzKQkJCQkJCVwKLSAgKHMtPmJzeW0gPT0gTlVMTAkJCQkJCQlcCi0gICA/IChsb2NhbF9zeW1ib2xfY29udmVydGVkX3AgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpCQlcCi0gICAgICA/IChzID0gbG9jYWxfc3ltYm9sX2dldF9yZWFsX3N5bWJvbCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyksCVwKLQkgMCkJCQkJCQkJCVwKLSAgICAgIDogMSkJCQkJCQkJCVwKLSAgIDogMCkKLQotLyogQ3JlYXRlIGEgbG9jYWwgc3ltYm9sIGFuZCBpbnNlcnQgaXQgaW50byB0aGUgbG9jYWwgaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgbG9jYWxfc3ltYm9sICoKLWxvY2FsX3N5bWJvbF9tYWtlIChuYW1lLCBzZWN0aW9uLCBvZmZzZXQsIGZyYWcpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIHNlZ1Qgc2VjdGlvbjsKLSAgICAgdmFsdWVUIG9mZnNldDsKLSAgICAgZnJhZ1MgKmZyYWc7Ci17Ci0gIGNoYXIgKm5hbWVfY29weTsKLSAgc3RydWN0IGxvY2FsX3N5bWJvbCAqcmV0OwotCi0gICsrbG9jYWxfc3ltYm9sX2NvdW50OwotCi0gIG5hbWVfY29weSA9IHNhdmVfc3ltYm9sX25hbWUgKG5hbWUpOwotCi0gIHJldCA9IChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIG9ic3RhY2tfYWxsb2MgKCZub3Rlcywgc2l6ZW9mICpyZXQpOwotICByZXQtPmxzeV9tYXJrZXIgPSBOVUxMOwotICByZXQtPmxzeV9uYW1lID0gbmFtZV9jb3B5OwotICByZXQtPmxzeV9zZWN0aW9uID0gc2VjdGlvbjsKLSAgbG9jYWxfc3ltYm9sX3NldF9mcmFnIChyZXQsIGZyYWcpOwotICByZXQtPmxzeV9vZmZzZXQgPSBvZmZzZXQ7Ci0KLSAgaGFzaF9qYW0gKGxvY2FsX2hhc2gsIG5hbWVfY29weSwgKFBUUikgcmV0KTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBDb252ZXJ0IGEgbG9jYWwgc3ltYm9sIGludG8gYSByZWFsIHN5bWJvbC4gIE5vdGUgdGhhdCB3ZSBkbyBub3QKLSAgIHJlY2xhaW0gdGhlIHNwYWNlIHVzZWQgYnkgdGhlIGxvY2FsIHN5bWJvbC4gICovCi0KLXN0YXRpYyBzeW1ib2xTICoKLWxvY2FsX3N5bWJvbF9jb252ZXJ0IChsb2NzeW0pCi0gICAgIHN0cnVjdCBsb2NhbF9zeW1ib2wgKmxvY3N5bTsKLXsKLSAgc3ltYm9sUyAqcmV0OwotCi0gIGFzc2VydCAobG9jc3ltLT5sc3lfbWFya2VyID09IE5VTEwpOwotICBpZiAobG9jYWxfc3ltYm9sX2NvbnZlcnRlZF9wIChsb2NzeW0pKQotICAgIHJldHVybiBsb2NhbF9zeW1ib2xfZ2V0X3JlYWxfc3ltYm9sIChsb2NzeW0pOwotCi0gICsrbG9jYWxfc3ltYm9sX2NvbnZlcnNpb25fY291bnQ7Ci0KLSAgcmV0ID0gc3ltYm9sX25ldyAobG9jc3ltLT5sc3lfbmFtZSwgbG9jc3ltLT5sc3lfc2VjdGlvbiwgbG9jc3ltLT5sc3lfb2Zmc2V0LAotCQkgICAgbG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pKTsKLQotICBpZiAobG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AgKGxvY3N5bSkpCi0gICAgcmV0LT5zeV9yZXNvbHZlZCA9IDE7Ci0KLSAgLyogTG9jYWwgc3ltYm9scyBhcmUgYWx3YXlzIGVpdGhlciBkZWZpbmVkIG9yIHVzZWQuICAqLwotICByZXQtPnN5X3VzZWQgPSAxOwotCi0gIHN5bWJvbF90YWJsZV9pbnNlcnQgKHJldCk7Ci0KLSAgbG9jYWxfc3ltYm9sX21hcmtfY29udmVydGVkIChsb2NzeW0pOwotICBsb2NhbF9zeW1ib2xfc2V0X3JlYWxfc3ltYm9sIChsb2NzeW0sIHJldCk7Ci0KLSAgaGFzaF9qYW0gKGxvY2FsX2hhc2gsIGxvY3N5bS0+bHN5X25hbWUsIE5VTEwpOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLSNlbHNlIC8qICEgQkZEX0FTU0VNQkxFUiAqLwotCi0jZGVmaW5lIExPQ0FMX1NZTUJPTF9DSEVDSyhzKSAwCi0jZGVmaW5lIGxvY2FsX3N5bWJvbF9jb252ZXJ0KHMpICgoc3ltYm9sUyAqKSBzKQotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0MCi0KLS8qCi0gKgkJCWNvbG9uKCkKLSAqCi0gKiBXZSBoYXZlIGp1c3Qgc2VlbiAiPG5hbWU+OiIuCi0gKiBDcmVhdGVzIGEgc3RydWN0IHN5bWJvbCB1bmxlc3MgaXQgYWxyZWFkeSBleGlzdHMuCi0gKgotICogR3JpcGVzIGlmIHdlIGFyZSByZWRlZmluaW5nIGEgc3ltYm9sIGluY29tcGF0aWJseSAoYW5kIGlnbm9yZXMgaXQpLgotICoKLSAqLwotc3ltYm9sUyAqCi1jb2xvbiAoc3ltX25hbWUpCQkvKiBqdXN0IHNlZW4gIng6IiAtIHJhdHRsZSBzeW1ib2xzICYgZnJhZ3MgKi8KLSAgICAgY29uc3QgY2hhciAqc3ltX25hbWU7CS8qIHN5bWJvbCBuYW1lLCBhcyBhIGNhbm5vbmljYWwgc3RyaW5nICovCi0gICAgIC8qIFdlIGNvcHkgdGhpcyBzdHJpbmc6IE9LIHRvIGFsdGVyIGxhdGVyLiAqLwotewotICByZWdpc3RlciBzeW1ib2xTICpzeW1ib2xQOwkvKiBzeW1ib2wgd2UgYXJlIHdvcmtpbmcgd2l0aCAqLwotCi0gIC8qIFN1biBsb2NhbCBsYWJlbHMgZ28gb3V0IG9mIHNjb3BlIHdoZW5ldmVyIGEgbm9uLWxvY2FsIHN5bWJvbCBpcwotICAgICBkZWZpbmVkLiAgKi8KLSAgaWYgKExPQ0FMX0xBQkVMU19ET0xMQVIpCi0gICAgewotICAgICAgaW50IGxvY2FsOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgbG9jYWwgPSBiZmRfaXNfbG9jYWxfbGFiZWxfbmFtZSAoc3Rkb3V0cHV0LCBzeW1fbmFtZSk7Ci0jZWxzZQotICAgICAgbG9jYWwgPSBMT0NBTF9MQUJFTCAoc3ltX25hbWUpOwotI2VuZGlmCi0KLSAgICAgIGlmICghIGxvY2FsKQotCWRvbGxhcl9sYWJlbF9jbGVhciAoKTsKLSAgICB9Ci0KLSNpZm5kZWYgV09SS0lOR19ET1RfV09SRAotICBpZiAobmV3X2Jyb2tlbl93b3JkcykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKmE7Ci0gICAgICBpbnQgcG9zc2libGVfYnl0ZXM7Ci0gICAgICBmcmFnUyAqZnJhZ190bXA7Ci0gICAgICBjaGFyICpmcmFnX29wY29kZTsKLQotICAgICAgZXh0ZXJuIGNvbnN0IGludCBtZF9zaG9ydF9qdW1wX3NpemU7Ci0gICAgICBleHRlcm4gY29uc3QgaW50IG1kX2xvbmdfanVtcF9zaXplOwotICAgICAgcG9zc2libGVfYnl0ZXMgPSAobWRfc2hvcnRfanVtcF9zaXplCi0JCQkrIG5ld19icm9rZW5fd29yZHMgKiBtZF9sb25nX2p1bXBfc2l6ZSk7Ci0KLSAgICAgIGZyYWdfdG1wID0gZnJhZ19ub3c7Ci0gICAgICBmcmFnX29wY29kZSA9IGZyYWdfdmFyIChyc19icm9rZW5fd29yZCwKLQkJCSAgICAgIHBvc3NpYmxlX2J5dGVzLAotCQkJICAgICAgcG9zc2libGVfYnl0ZXMsCi0JCQkgICAgICAocmVsYXhfc3Vic3RhdGVUKSAwLAotCQkJICAgICAgKHN5bWJvbFMgKikgYnJva2VuX3dvcmRzLAotCQkJICAgICAgKG9mZnNldFQpIDAsCi0JCQkgICAgICBOVUxMKTsKLQotICAgICAgLyogV2Ugd2FudCB0byBzdG9yZSB0aGUgcG9pbnRlciB0byB3aGVyZSB0byBpbnNlcnQgdGhlIGp1bXAgdGFibGUgaW4gdGhlCi0JIGZyX29wY29kZSBvZiB0aGUgcnNfYnJva2VuX3dvcmQgZnJhZy4gIFRoaXMgcmVxdWlyZXMgYSBsaXR0bGUKLQkgaGFja2VyeS4gICovCi0gICAgICB3aGlsZSAoZnJhZ190bXAKLQkgICAgICYmIChmcmFnX3RtcC0+ZnJfdHlwZSAhPSByc19icm9rZW5fd29yZAotCQkgfHwgZnJhZ190bXAtPmZyX29wY29kZSkpCi0JZnJhZ190bXAgPSBmcmFnX3RtcC0+ZnJfbmV4dDsKLSAgICAgIGtub3cgKGZyYWdfdG1wKTsKLSAgICAgIGZyYWdfdG1wLT5mcl9vcGNvZGUgPSBmcmFnX29wY29kZTsKLSAgICAgIG5ld19icm9rZW5fd29yZHMgPSAwOwotCi0gICAgICBmb3IgKGEgPSBicm9rZW5fd29yZHM7IGEgJiYgYS0+ZGlzcGZyYWcgPT0gMDsgYSA9IGEtPm5leHRfYnJva2VuX3dvcmQpCi0JYS0+ZGlzcGZyYWcgPSBmcmFnX3RtcDsKLSAgICB9Ci0jZW5kaWYgLyogV09SS0lOR19ET1RfV09SRCAqLwotCi0gIGlmICgoc3ltYm9sUCA9IHN5bWJvbF9maW5kIChzeW1fbmFtZSkpICE9IDApCi0gICAgewotI2lmZGVmIFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTgotICAgICAgaWYgKFJFU09MVkVfU1lNQk9MX1JFREVGSU5JVElPTiAoc3ltYm9sUCkpCi0JcmV0dXJuIHN5bWJvbFA7Ci0jZW5kaWYKLSAgICAgIC8qCi0gICAgICAgKglOb3cgY2hlY2sgZm9yIHVuZGVmaW5lZCBzeW1ib2xzCi0gICAgICAgKi8KLSAgICAgIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotCXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NzeW0gPSAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzeW1ib2xQOwotCi0JICBpZiAobG9jc3ltLT5sc3lfc2VjdGlvbiAhPSB1bmRlZmluZWRfc2VjdGlvbgotCSAgICAgICYmIChsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkgIT0gZnJhZ19ub3cKLQkJICB8fCBsb2NzeW0tPmxzeV9zZWN0aW9uICE9IG5vd19zZWcKLQkJICB8fCBsb2NzeW0tPmxzeV9vZmZzZXQgIT0gZnJhZ19ub3dfZml4ICgpKSkKLQkgICAgewotCSAgICAgIGFzX2JhZCAoXygiU3ltYm9sICVzIGFscmVhZHkgZGVmaW5lZC4iKSwgc3ltX25hbWUpOwotCSAgICAgIHJldHVybiBzeW1ib2xQOwotCSAgICB9Ci0KLQkgIGxvY3N5bS0+bHN5X3NlY3Rpb24gPSBub3dfc2VnOwotCSAgbG9jYWxfc3ltYm9sX3NldF9mcmFnIChsb2NzeW0sIGZyYWdfbm93KTsKLQkgIGxvY3N5bS0+bHN5X29mZnNldCA9IGZyYWdfbm93X2ZpeCAoKTsKLSNlbmRpZgotCX0KLSAgICAgIGVsc2UgaWYgKCFTX0lTX0RFRklORUQgKHN5bWJvbFApIHx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKSkKLQl7Ci0JICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApID09IDApCi0JICAgIHsKLQkgICAgICBzeW1ib2xQLT5zeV9mcmFnID0gZnJhZ19ub3c7Ci0jaWZkZWYgT0JKX1ZNUwotCSAgICAgIFNfU0VUX09USEVSKHN5bWJvbFAsIGNvbnN0X2ZsYWcpOwotI2VuZGlmCi0JICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgbm93X3NlZyk7Ci0jaWZkZWYgTl9VTkRGCi0JICAgICAga25vdyAoTl9VTkRGID09IDApOwotI2VuZGlmIC8qIGlmIHdlIGhhdmUgb25lLCBpdCBiZXR0ZXIgYmUgemVyby4gKi8KLQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqCVRoZXJlIGFyZSBzdGlsbCBzZXZlcmFsIGNhc2VzIHRvIGNoZWNrOgotCSAgICAgICAqCQlBIC5jb21tLy5sY29tbSBzeW1ib2wgYmVpbmcgcmVkZWZpbmVkIGFzCi0JICAgICAgICoJCQlpbml0aWFsaXplZCBkYXRhIGlzIE9LCi0JICAgICAgICoJCUEgLmNvbW0vLmxjb21tIHN5bWJvbCBiZWluZyByZWRlZmluZWQgd2l0aAotCSAgICAgICAqCQkJYSBsYXJnZXIgc2l6ZSBpcyBhbHNvIE9LCi0JICAgICAgICoKLQkgICAgICAgKiBUaGlzIG9ubHkgdXNlZCB0byBiZSBhbGxvd2VkIG9uIFZNUyBnYXMsIGJ1dCBTdW4gY2MKLQkgICAgICAgKiBvbiB0aGUgc3BhcmMgYWxzbyBkZXBlbmRzIG9uIGl0LgotCSAgICAgICAqLwotCi0JICAgICAgaWYgKCgoIVNfSVNfREVCVUcgKHN5bWJvbFApCi0JCSAgICAmJiAoIVNfSVNfREVGSU5FRCAoc3ltYm9sUCkgfHwgU19JU19DT01NT04gKHN5bWJvbFApKQotCQkgICAgJiYgU19JU19FWFRFUk5BTCAoc3ltYm9sUCkpCi0JCSAgIHx8IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IGJzc19zZWN0aW9uKQotCQkgICYmIChub3dfc2VnID09IGRhdGFfc2VjdGlvbgotCQkgICAgICB8fCBub3dfc2VnID09IFNfR0VUX1NFR01FTlQgKHN5bWJvbFApKSkKLQkJewotCQkgIC8qCi0JCSAgICoJU2VsZWN0IHdoaWNoIG9mIHRoZSAyIGNhc2VzIHRoaXMgaXMKLQkJICAgKi8KLQkJICBpZiAobm93X3NlZyAhPSBkYXRhX3NlY3Rpb24pCi0JCSAgICB7Ci0JCSAgICAgIC8qCi0JCSAgICAgICAqICAgTmV3IC5jb21tIGZvciBwcmV2IC5jb21tIHN5bWJvbC4KLQkJICAgICAgICoJSWYgdGhlIG5ldyBzaXplIGlzIGxhcmdlciB3ZSBqdXN0Ci0JCSAgICAgICAqCWNoYW5nZSBpdHMgdmFsdWUuICBJZiB0aGUgbmV3IHNpemUKLQkJICAgICAgICoJaXMgc21hbGxlciwgd2UgaWdub3JlIHRoaXMgc3ltYm9sCi0JCSAgICAgICAqLwotCQkgICAgICBpZiAoU19HRVRfVkFMVUUgKHN5bWJvbFApCi0JCQkgIDwgKCh1bnNpZ25lZCkgZnJhZ19ub3dfZml4ICgpKSkKLQkJCXsKLQkJCSAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICAvKiBJdCBpcyBhIC5jb21tLy5sY29tbSBiZWluZyBjb252ZXJ0ZWQgdG8gaW5pdGlhbGl6ZWQKLQkJCSBkYXRhLiAgKi8KLQkJICAgICAgc3ltYm9sUC0+c3lfZnJhZyA9IGZyYWdfbm93OwotI2lmZGVmIE9CSl9WTVMKLQkJICAgICAgU19TRVRfT1RIRVIoc3ltYm9sUCwgY29uc3RfZmxhZyk7Ci0jZW5kaWYKLQkJICAgICAgU19TRVRfVkFMVUUgKHN5bWJvbFAsICh2YWx1ZVQpIGZyYWdfbm93X2ZpeCAoKSk7Ci0JCSAgICAgIFNfU0VUX1NFR01FTlQgKHN5bWJvbFAsIG5vd19zZWcpOwkvKiBrZWVwIE5fRVhUIGJpdCAqLwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0jaWYgZGVmaW5lZCAoU19HRVRfT1RIRVIpICYmIGRlZmluZWQgKFNfR0VUX0RFU0MpCi0JCSAgYXNfZmF0YWwgKF8oIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lZC4lZC4lbGQuIiksCi0JCQkgICAgc3ltX25hbWUsCi0JCQkgICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSksCi0JCQkgICAgU19HRVRfT1RIRVIgKHN5bWJvbFApLCBTX0dFVF9ERVNDIChzeW1ib2xQKSwKLQkJCSAgICAobG9uZykgU19HRVRfVkFMVUUgKHN5bWJvbFApKTsKLSNlbHNlCi0JCSAgYXNfZmF0YWwgKF8oIlN5bWJvbCBcIiVzXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGFzIFwiJXNcIi8lbGQuIiksCi0JCQkgICAgc3ltX25hbWUsCi0JCQkgICAgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSksCi0JCQkgICAgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW1ib2xQKSk7Ci0jZW5kaWYKLQkJfQotCSAgICB9CQkJLyogaWYgdGhlIHVuZGVmaW5lZCBzeW1ib2wgaGFzIG5vIHZhbHVlICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIERvbid0IGJsb3cgdXAgaWYgdGhlIGRlZmluaXRpb24gaXMgdGhlIHNhbWUgKi8KLQkgIGlmICghKGZyYWdfbm93ID09IHN5bWJvbFAtPnN5X2ZyYWcKLQkJJiYgU19HRVRfVkFMVUUgKHN5bWJvbFApID09IGZyYWdfbm93X2ZpeCAoKQotCQkmJiBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBub3dfc2VnKSkKLQkgICAgYXNfZmF0YWwgKF8oIlN5bWJvbCAlcyBhbHJlYWR5IGRlZmluZWQuIiksIHN5bV9uYW1lKTsKLQl9CQkJLyogaWYgdGhpcyBzeW1ib2wgaXMgbm90IHlldCBkZWZpbmVkICovCi0KLSAgICB9Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBlbHNlIGlmICghIGZsYWdfa2VlcF9sb2NhbHMgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKHN0ZG91dHB1dCwgc3ltX25hbWUpKQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBsb2NhbF9zeW1ib2xfbWFrZSAoc3ltX25hbWUsIG5vd19zZWcsCi0JCQkJCSAgICAgICAodmFsdWVUKSBmcmFnX25vd19maXggKCksCi0JCQkJCSAgICAgICBmcmFnX25vdyk7Ci0gICAgfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLSAgZWxzZQotICAgIHsKLSAgICAgIHN5bWJvbFAgPSBzeW1ib2xfbmV3IChzeW1fbmFtZSwgbm93X3NlZywgKHZhbHVlVCkgZnJhZ19ub3dfZml4ICgpLAotCQkJICAgIGZyYWdfbm93KTsKLSNpZmRlZiBPQkpfVk1TCi0gICAgICBTX1NFVF9PVEhFUiAoc3ltYm9sUCwgY29uc3RfZmxhZyk7Ci0jZW5kaWYgLyogT0JKX1ZNUyAqLwotCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLSAgICB9CQkJCS8qIGlmIHdlIGhhdmUgc2VlbiB0aGlzIHN5bWJvbCBiZWZvcmUgKi8KLQotICBpZiAobXJpX2NvbW1vbl9zeW1ib2wgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIHN5bWJvbCBpcyBhY3R1YWxseSBiZWluZyBkZWZpbmVkIHdpdGhpbiBhbiBNUkkgY29tbW9uCi0gICAgICAgICBzZWN0aW9uLiAgVGhpcyByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLiAgKi8KLSAgICAgIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotCXN5bWJvbFAgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgc3ltYm9sUCk7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX29wID0gT19zeW1ib2w7Ci0gICAgICBzeW1ib2xQLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPSBtcmlfY29tbW9uX3N5bWJvbDsKLSAgICAgIHN5bWJvbFAtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IFNfR0VUX1ZBTFVFIChtcmlfY29tbW9uX3N5bWJvbCk7Ci0gICAgICBzeW1ib2xQLT5zeV9mcmFnID0gJnplcm9fYWRkcmVzc19mcmFnOwotICAgICAgU19TRVRfU0VHTUVOVCAoc3ltYm9sUCwgZXhwcl9zZWN0aW9uKTsKLSAgICAgIHN5bWJvbFAtPnN5X21yaV9jb21tb24gPSAxOwotICAgIH0KLQotI2lmZGVmIHRjX2Zyb2JfbGFiZWwKLSAgdGNfZnJvYl9sYWJlbCAoc3ltYm9sUCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9sYWJlbAotICBvYmpfZnJvYl9sYWJlbCAoc3ltYm9sUCk7Ci0jZW5kaWYKLQotICByZXR1cm4gc3ltYm9sUDsKLX0KLQwKLQotLyoKLSAqCQkJc3ltYm9sX3RhYmxlX2luc2VydCgpCi0gKgotICogRGllIGlmIHdlIGNhbid0IGluc2VydCB0aGUgc3ltYm9sLgotICoKLSAqLwotCi12b2lkIAotc3ltYm9sX3RhYmxlX2luc2VydCAoc3ltYm9sUCkKLSAgICAgc3ltYm9sUyAqc3ltYm9sUDsKLXsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqZXJyb3Jfc3RyaW5nOwotCi0gIGtub3cgKHN5bWJvbFApOwotICBrbm93IChTX0dFVF9OQU1FIChzeW1ib2xQKSk7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoc3ltYm9sUCkpCi0gICAgewotICAgICAgZXJyb3Jfc3RyaW5nID0gaGFzaF9qYW0gKGxvY2FsX2hhc2gsIFNfR0VUX05BTUUgKHN5bWJvbFApLAotCQkJICAgICAgIChQVFIpIHN5bWJvbFApOwotICAgICAgaWYgKGVycm9yX3N0cmluZyAhPSBOVUxMKQotCWFzX2ZhdGFsIChfKCJJbnNlcnRpbmcgXCIlc1wiIGludG8gc3ltYm9sIHRhYmxlIGZhaWxlZDogJXMiKSwKLQkJICBTX0dFVF9OQU1FIChzeW1ib2xQKSwgZXJyb3Jfc3RyaW5nKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKChlcnJvcl9zdHJpbmcgPSBoYXNoX2phbSAoc3lfaGFzaCwgU19HRVRfTkFNRSAoc3ltYm9sUCksIChQVFIpIHN5bWJvbFApKSkKLSAgICB7Ci0gICAgICBhc19mYXRhbCAoXygiSW5zZXJ0aW5nIFwiJXNcIiBpbnRvIHN5bWJvbCB0YWJsZSBmYWlsZWQ6ICVzIiksCi0JCVNfR0VUX05BTUUgKHN5bWJvbFApLCBlcnJvcl9zdHJpbmcpOwotICAgIH0JCQkJLyogb24gZXJyb3IgKi8KLX0JCQkJLyogc3ltYm9sX3RhYmxlX2luc2VydCgpICovCi0MCi0vKgotICoJCQlzeW1ib2xfZmluZF9vcl9tYWtlKCkKLSAqCi0gKiBJZiBhIHN5bWJvbCBuYW1lIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgaXQgYXMgdW5kZWZpbmVkLCBhbmQgaW5zZXJ0Ci0gKiBpdCBpbnRvIHRoZSBzeW1ib2wgdGFibGUuIFJldHVybiBhIHBvaW50ZXIgdG8gaXQuCi0gKi8KLXN5bWJvbFMgKgotc3ltYm9sX2ZpbmRfb3JfbWFrZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmVnaXN0ZXIgc3ltYm9sUyAqc3ltYm9sUDsKLQotICBzeW1ib2xQID0gc3ltYm9sX2ZpbmQgKG5hbWUpOwotCi0gIGlmIChzeW1ib2xQID09IE5VTEwpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGlmICghIGZsYWdfa2VlcF9sb2NhbHMgJiYgYmZkX2lzX2xvY2FsX2xhYmVsX25hbWUgKHN0ZG91dHB1dCwgbmFtZSkpCi0JewotCSAgc3ltYm9sUCA9IG1kX3VuZGVmaW5lZF9zeW1ib2wgKChjaGFyICopIG5hbWUpOwotCSAgaWYgKHN5bWJvbFAgIT0gTlVMTCkKLQkgICAgcmV0dXJuIHN5bWJvbFA7Ci0KLQkgIHN5bWJvbFAgPSAoc3ltYm9sUyAqKSBsb2NhbF9zeW1ib2xfbWFrZSAobmFtZSwgdW5kZWZpbmVkX3NlY3Rpb24sCi0JCQkJCQkgICAodmFsdWVUKSAwLAotCQkJCQkJICAgJnplcm9fYWRkcmVzc19mcmFnKTsKLQkgIHJldHVybiBzeW1ib2xQOwotCX0KLSNlbmRpZgotCi0gICAgICBzeW1ib2xQID0gc3ltYm9sX21ha2UgKG5hbWUpOwotCi0gICAgICBzeW1ib2xfdGFibGVfaW5zZXJ0IChzeW1ib2xQKTsKLSAgICB9CQkJCS8qIGlmIHN5bWJvbCB3YXNuJ3QgZm91bmQgKi8KLQotICByZXR1cm4gKHN5bWJvbFApOwotfQkJCQkvKiBzeW1ib2xfZmluZF9vcl9tYWtlKCkgKi8KLQotc3ltYm9sUyAqCi1zeW1ib2xfbWFrZSAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgc3ltYm9sUyAqc3ltYm9sUDsKLQotICAvKiBMZXQgdGhlIG1hY2hpbmUgZGVzY3JpcHRpb24gZGVmYXVsdCBpdCwgZS5nLiBmb3IgcmVnaXN0ZXIgbmFtZXMuICovCi0gIHN5bWJvbFAgPSBtZF91bmRlZmluZWRfc3ltYm9sICgoY2hhciAqKSBuYW1lKTsKLQotICBpZiAoIXN5bWJvbFApCi0gICAgc3ltYm9sUCA9IHN5bWJvbF9uZXcgKG5hbWUsIHVuZGVmaW5lZF9zZWN0aW9uLCAodmFsdWVUKSAwLCAmemVyb19hZGRyZXNzX2ZyYWcpOwotCi0gIHJldHVybiAoc3ltYm9sUCk7Ci19CQkJCS8qIHN5bWJvbF9tYWtlKCkgKi8KLQotLyoKLSAqCQkJc3ltYm9sX2ZpbmQoKQotICoKLSAqIEltcGxlbWVudCBzeW1ib2wgdGFibGUgbG9va3VwLgotICogSW46CUEgc3ltYm9sJ3MgbmFtZSBhcyBhIHN0cmluZzogJ1wwJyBjYW4ndCBiZSBwYXJ0IG9mIGEgc3ltYm9sIG5hbWUuCi0gKiBPdXQ6CU5VTEwgaWYgdGhlIG5hbWUgd2FzIG5vdCBpbiB0aGUgc3ltYm9sIHRhYmxlLCBlbHNlIHRoZSBhZGRyZXNzCi0gKglvZiBhIHN0cnVjdCBzeW1ib2wgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZS4KLSAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotI2lmZGVmIFNUUklQX1VOREVSU0NPUkUKLSAgcmV0dXJuIChzeW1ib2xfZmluZF9iYXNlIChuYW1lLCAxKSk7Ci0jZWxzZSAvKiBTVFJJUF9VTkRFUlNDT1JFICovCi0gIHJldHVybiAoc3ltYm9sX2ZpbmRfYmFzZSAobmFtZSwgMCkpOwotI2VuZGlmIC8qIFNUUklQX1VOREVSU0NPUkUgKi8KLX0JCQkJLyogc3ltYm9sX2ZpbmQoKSAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9maW5kX2Jhc2UgKG5hbWUsIHN0cmlwX3VuZGVyc2NvcmUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGludCBzdHJpcF91bmRlcnNjb3JlOwotewotICBpZiAoc3RyaXBfdW5kZXJzY29yZSAmJiAqbmFtZSA9PSAnXycpCi0gICAgbmFtZSsrOwotCi0jaWZkZWYgdGNfY2Fub25pY2FsaXplX3N5bWJvbF9uYW1lCi0gIHsKLSAgICBjaGFyICpjb3B5OwotICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKG5hbWUpICsgMTsKLQotICAgIGNvcHkgPSAoY2hhciAqKSBhbGxvY2EgKGxlbik7Ci0gICAgbWVtY3B5IChjb3B5LCBuYW1lLCBsZW4pOwotICAgIG5hbWUgPSB0Y19jYW5vbmljYWxpemVfc3ltYm9sX25hbWUgKGNvcHkpOwotICB9Ci0jZW5kaWYKLQotICBpZiAoISBzeW1ib2xzX2Nhc2Vfc2Vuc2l0aXZlKQotICAgIHsKLSAgICAgIGNoYXIgKmNvcHk7Ci0gICAgICBjb25zdCBjaGFyICpvcmlnOwotICAgICAgdW5zaWduZWQgY2hhciBjOwotCi0gICAgICBvcmlnID0gbmFtZTsKLSAgICAgIG5hbWUgPSBjb3B5ID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0KLSAgICAgIHdoaWxlICgoYyA9ICpvcmlnKyspICE9ICdcMCcpCi0JewotCSAgaWYgKGlzbG93ZXIgKGMpKQotCSAgICBjID0gdG91cHBlciAoYyk7Ci0JICAqY29weSsrID0gYzsKLQl9Ci0gICAgICAqY29weSA9ICdcMCc7Ci0gICAgfQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICB7Ci0gICAgc3RydWN0IGxvY2FsX3N5bWJvbCAqbG9jc3ltOwotCi0gICAgbG9jc3ltID0gKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgaGFzaF9maW5kIChsb2NhbF9oYXNoLCBuYW1lKTsKLSAgICBpZiAobG9jc3ltICE9IE5VTEwpCi0gICAgICByZXR1cm4gKHN5bWJvbFMgKikgbG9jc3ltOwotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gKChzeW1ib2xTICopIGhhc2hfZmluZCAoc3lfaGFzaCwgbmFtZSkpOwotfQotCi0vKgotICogT25jZSB1cG9uIGEgdGltZSwgc3ltYm9scyB3ZXJlIGtlcHQgaW4gYSBzaW5nbHkgbGlua2VkIGxpc3QuICBBdAotICogbGVhc3QgY29mZiBuZWVkcyB0byBiZSBhYmxlIHRvIHJlYXJyYW5nZSB0aGVtIGZyb20gdGltZSB0byB0aW1lLCBmb3IKLSAqIHdoaWNoIGEgZG91Ymx5IGxpbmtlZCBsaXN0IGlzIG11Y2ggbW9yZSBjb252ZW5pZW50LiAgTG9pYyBkaWQgdGhlc2UKLSAqIGFzIG1hY3JvcyB3aGljaCBzZWVtZWQgZGFuZ2Vyb3VzIHRvIG1lIHNvIHRoZXkncmUgbm93IGZ1bmN0aW9ucy4KLSAqIHhveG9yaWNoLgotICovCi0KLS8qIExpbmsgc3ltYm9sIEFERE1FIGFmdGVyIHN5bWJvbCBUQVJHRVQgaW4gdGhlIGNoYWluLiAqLwotdm9pZCAKLXN5bWJvbF9hcHBlbmQgKGFkZG1lLCB0YXJnZXQsIHJvb3RQUCwgbGFzdFBQKQotICAgICBzeW1ib2xTICphZGRtZTsKLSAgICAgc3ltYm9sUyAqdGFyZ2V0OwotICAgICBzeW1ib2xTICoqcm9vdFBQOwotICAgICBzeW1ib2xTICoqbGFzdFBQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChhZGRtZSkpCi0gICAgYWJvcnQgKCk7Ci0gIGlmICh0YXJnZXQgIT0gTlVMTCAmJiBMT0NBTF9TWU1CT0xfQ0hFQ0sgKHRhcmdldCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHRhcmdldCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGtub3cgKCpyb290UFAgPT0gTlVMTCk7Ci0gICAgICBrbm93ICgqbGFzdFBQID09IE5VTEwpOwotICAgICAgYWRkbWUtPnN5X25leHQgPSBOVUxMOwotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgICAgIGFkZG1lLT5zeV9wcmV2aW91cyA9IE5VTEw7Ci0jZW5kaWYKLSAgICAgICpyb290UFAgPSBhZGRtZTsKLSAgICAgICpsYXN0UFAgPSBhZGRtZTsKLSAgICAgIHJldHVybjsKLSAgICB9CQkJCS8qIGlmIHRoZSBsaXN0IGlzIGVtcHR5ICovCi0KLSAgaWYgKHRhcmdldC0+c3lfbmV4dCAhPSBOVUxMKQotICAgIHsKLSNpZmRlZiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTCi0gICAgICB0YXJnZXQtPnN5X25leHQtPnN5X3ByZXZpb3VzID0gYWRkbWU7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGtub3cgKCpsYXN0UFAgPT0gdGFyZ2V0KTsKLSAgICAgICpsYXN0UFAgPSBhZGRtZTsKLSAgICB9CQkJCS8qIGlmIHdlIGhhdmUgYSBuZXh0ICovCi0KLSAgYWRkbWUtPnN5X25leHQgPSB0YXJnZXQtPnN5X25leHQ7Ci0gIHRhcmdldC0+c3lfbmV4dCA9IGFkZG1lOwotCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICBhZGRtZS0+c3lfcHJldmlvdXMgPSB0YXJnZXQ7Ci0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0gIGRlYnVnX3ZlcmlmeV9zeW1jaGFpbiAoc3ltYm9sX3Jvb3RQLCBzeW1ib2xfbGFzdFApOwotfQotCi0vKiBTZXQgdGhlIGNoYWluIHBvaW50ZXJzIG9mIFNZTUJPTCB0byBudWxsLiAqLwotdm9pZCAKLXN5bWJvbF9jbGVhcl9saXN0X3BvaW50ZXJzIChzeW1ib2xQKQotICAgICBzeW1ib2xTICpzeW1ib2xQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1ib2xQKSkKLSAgICBhYm9ydCAoKTsKLSAgc3ltYm9sUC0+c3lfbmV4dCA9IE5VTEw7Ci0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICBzeW1ib2xQLT5zeV9wcmV2aW91cyA9IE5VTEw7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLS8qIFJlbW92ZSBTWU1CT0xQIGZyb20gdGhlIGxpc3QuICovCi12b2lkIAotc3ltYm9sX3JlbW92ZSAoc3ltYm9sUCwgcm9vdFBQLCBsYXN0UFApCi0gICAgIHN5bWJvbFMgKnN5bWJvbFA7Ci0gICAgIHN5bWJvbFMgKipyb290UFA7Ci0gICAgIHN5bWJvbFMgKipsYXN0UFA7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHN5bWJvbFApKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChzeW1ib2xQID09ICpyb290UFApCi0gICAgewotICAgICAgKnJvb3RQUCA9IHN5bWJvbFAtPnN5X25leHQ7Ci0gICAgfQkJCQkvKiBpZiBpdCB3YXMgdGhlIHJvb3QgKi8KLQotICBpZiAoc3ltYm9sUCA9PSAqbGFzdFBQKQotICAgIHsKLSAgICAgICpsYXN0UFAgPSBzeW1ib2xQLT5zeV9wcmV2aW91czsKLSAgICB9CQkJCS8qIGlmIGl0IHdhcyB0aGUgdGFpbCAqLwotCi0gIGlmIChzeW1ib2xQLT5zeV9uZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfbmV4dC0+c3lfcHJldmlvdXMgPSBzeW1ib2xQLT5zeV9wcmV2aW91czsKLSAgICB9CQkJCS8qIGlmIG5vdCBsYXN0ICovCi0KLSAgaWYgKHN5bWJvbFAtPnN5X3ByZXZpb3VzICE9IE5VTEwpCi0gICAgewotICAgICAgc3ltYm9sUC0+c3lfcHJldmlvdXMtPnN5X25leHQgPSBzeW1ib2xQLT5zeV9uZXh0OwotICAgIH0JCQkJLyogaWYgbm90IGZpcnN0ICovCi0KLSAgZGVidWdfdmVyaWZ5X3N5bWNoYWluICgqcm9vdFBQLCAqbGFzdFBQKTsKLX0KLQotLyogTGluayBzeW1ib2wgQURETUUgYmVmb3JlIHN5bWJvbCBUQVJHRVQgaW4gdGhlIGNoYWluLiAqLwotdm9pZCAKLXN5bWJvbF9pbnNlcnQgKGFkZG1lLCB0YXJnZXQsIHJvb3RQUCwgbGFzdFBQKQotICAgICBzeW1ib2xTICphZGRtZTsKLSAgICAgc3ltYm9sUyAqdGFyZ2V0OwotICAgICBzeW1ib2xTICoqcm9vdFBQOwotICAgICBzeW1ib2xTICoqbGFzdFBQOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChhZGRtZSkpCi0gICAgYWJvcnQgKCk7Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHRhcmdldCkpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHRhcmdldC0+c3lfcHJldmlvdXMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB0YXJnZXQtPnN5X3ByZXZpb3VzLT5zeV9uZXh0ID0gYWRkbWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAga25vdyAoKnJvb3RQUCA9PSB0YXJnZXQpOwotICAgICAgKnJvb3RQUCA9IGFkZG1lOwotICAgIH0JCQkJLyogaWYgbm90IGZpcnN0ICovCi0KLSAgYWRkbWUtPnN5X3ByZXZpb3VzID0gdGFyZ2V0LT5zeV9wcmV2aW91czsKLSAgdGFyZ2V0LT5zeV9wcmV2aW91cyA9IGFkZG1lOwotICBhZGRtZS0+c3lfbmV4dCA9IHRhcmdldDsKLQotICBkZWJ1Z192ZXJpZnlfc3ltY2hhaW4gKCpyb290UFAsICpsYXN0UFApOwotfQotCi0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi12b2lkIAotdmVyaWZ5X3N5bWJvbF9jaGFpbiAocm9vdFAsIGxhc3RQKQotICAgICBzeW1ib2xTICpyb290UDsKLSAgICAgc3ltYm9sUyAqbGFzdFA7Ci17Ci0gIHN5bWJvbFMgKnN5bWJvbFAgPSByb290UDsKLQotICBpZiAoc3ltYm9sUCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBmb3IgKDsgc3ltYm9sX25leHQgKHN5bWJvbFApICE9IE5VTEw7IHN5bWJvbFAgPSBzeW1ib2xfbmV4dCAoc3ltYm9sUCkpCi0gICAgewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgIGFzc2VydCAoc3ltYm9sUC0+YnN5bSAhPSBOVUxMKTsKLSNlbmRpZgotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSAgICAgIGFzc2VydCAoc3ltYm9sUC0+c3lfbmV4dC0+c3lfcHJldmlvdXMgPT0gc3ltYm9sUCk7Ci0jZWxzZQotICAgICAgLyogV2FsayB0aGUgbGlzdCBhbnl3YXlzLCB0byBtYWtlIHN1cmUgcG9pbnRlcnMgYXJlIHN0aWxsIGdvb2QuICAqLwotICAgICAgOwotI2VuZGlmIC8qIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMgKi8KLSAgICB9Ci0KLSAgYXNzZXJ0IChsYXN0UCA9PSBzeW1ib2xQKTsKLX0KLQotdm9pZAotdmVyaWZ5X3N5bWJvbF9jaGFpbl8yIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgc3ltYm9sUyAqcCA9IHN5bSwgKm4gPSBzeW07Ci0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotICB3aGlsZSAoc3ltYm9sX3ByZXZpb3VzIChwKSkKLSAgICBwID0gc3ltYm9sX3ByZXZpb3VzIChwKTsKLSNlbmRpZgotICB3aGlsZSAoc3ltYm9sX25leHQgKG4pKQotICAgIG4gPSBzeW1ib2xfbmV4dCAobik7Ci0gIHZlcmlmeV9zeW1ib2xfY2hhaW4gKHAsIG4pOwotfQotCi0vKiBSZXNvbHZlIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgZmluYWwKLSAgIHBhc3Mgb3ZlciB0aGUgc3ltYm9sIHRhYmxlIHRvIHJlc29sdmUgYW55IHN5bWJvbHMgd2l0aCBjb21wbGV4Ci0gICB2YWx1ZXMuICAqLwotCi12YWx1ZVQKLXJlc29sdmVfc3ltYm9sX3ZhbHVlIChzeW1wLCBmaW5hbGl6ZSkKLSAgICAgc3ltYm9sUyAqc3ltcDsKLSAgICAgaW50IGZpbmFsaXplOwotewotICBpbnQgcmVzb2x2ZWQ7Ci0gIHZhbHVlVCBmaW5hbF92YWw7Ci0gIHNlZ1QgZmluYWxfc2VnOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW1wKSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NzeW0gPSAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzeW1wOwotCi0gICAgICBpZiAobG9jYWxfc3ltYm9sX3Jlc29sdmVkX3AgKGxvY3N5bSkpCi0JcmV0dXJuIGxvY3N5bS0+bHN5X29mZnNldDsKLQotICAgICAgZmluYWxfdmFsID0gKGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAobG9jc3ltKS0+ZnJfYWRkcmVzcwotCQkgICArIGxvY3N5bS0+bHN5X29mZnNldCk7Ci0KLSAgICAgIGlmIChmaW5hbGl6ZSkKLQl7Ci0JICBsb2NzeW0tPmxzeV9vZmZzZXQgPSBmaW5hbF92YWw7Ci0JICBsb2NhbF9zeW1ib2xfbWFya19yZXNvbHZlZCAobG9jc3ltKTsKLQl9Ci0KLSAgICAgIHJldHVybiBmaW5hbF92YWw7Ci0gICAgfQotI2VuZGlmCi0KLSAgaWYgKHN5bXAtPnN5X3Jlc29sdmVkKQotICAgIHsKLSAgICAgIGlmIChzeW1wLT5zeV92YWx1ZS5YX29wID09IE9fY29uc3RhbnQpCi0JcmV0dXJuICh2YWx1ZVQpIHN5bXAtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLSAgICAgIGVsc2UKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgcmVzb2x2ZWQgPSAwOwotICBmaW5hbF9zZWcgPSBTX0dFVF9TRUdNRU5UIChzeW1wKTsKLQotICBpZiAoc3ltcC0+c3lfcmVzb2x2aW5nKQotICAgIHsKLSAgICAgIGlmIChmaW5hbGl6ZSkKLQlhc19iYWQgKF8oIlN5bWJvbCBkZWZpbml0aW9uIGxvb3AgZW5jb3VudGVyZWQgYXQgJXMiKSwgU19HRVRfTkFNRSAoc3ltcCkpOwotICAgICAgZmluYWxfdmFsID0gMDsKLSAgICAgIHJlc29sdmVkID0gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzeW1ib2xTICphZGRfc3ltYm9sLCAqb3Bfc3ltYm9sOwotICAgICAgb2Zmc2V0VCBsZWZ0LCByaWdodDsKLSAgICAgIHNlZ1Qgc2VnX2xlZnQsIHNlZ19yaWdodDsKLSAgICAgIG9wZXJhdG9yVCBvcDsKLQotICAgICAgc3ltcC0+c3lfcmVzb2x2aW5nID0gMTsKLQotICAgICAgLyogSGVscCBvdXQgd2l0aCBDU0UuICAqLwotICAgICAgYWRkX3N5bWJvbCA9IHN5bXAtPnN5X3ZhbHVlLlhfYWRkX3N5bWJvbDsKLSAgICAgIG9wX3N5bWJvbCA9IHN5bXAtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sOwotICAgICAgZmluYWxfdmFsID0gc3ltcC0+c3lfdmFsdWUuWF9hZGRfbnVtYmVyOwotICAgICAgb3AgPSBzeW1wLT5zeV92YWx1ZS5YX29wOwotCi0gICAgICBzd2l0Y2ggKG9wKQotCXsKLQlkZWZhdWx0OgotCSAgQkFEX0NBU0UgKG9wKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX2Fic2VudDoKLQkgIGZpbmFsX3ZhbCA9IDA7Ci0JICAvKiBGYWxsIHRocm91Z2guICAqLwotCi0JY2FzZSBPX2NvbnN0YW50OgotCSAgZmluYWxfdmFsICs9IHN5bXAtPnN5X2ZyYWctPmZyX2FkZHJlc3M7Ci0JICBpZiAoZmluYWxfc2VnID09IGV4cHJfc2VjdGlvbikKLQkgICAgZmluYWxfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLQkgIHJlc29sdmVkID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX3N5bWJvbDoKLQljYXNlIE9fc3ltYm9sX3J2YToKLQkgIGxlZnQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbCwgZmluYWxpemUpOwotCWRvX3N5bWJvbDoKLQotCSAgaWYgKHN5bXAtPnN5X21yaV9jb21tb24pCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIGlzIGEgc3ltYm9sIGluc2lkZSBhbiBNUkkgY29tbW9uIHNlY3Rpb24uICBUaGUKLSAgICAgICAgICAgICAgICAgcmVsb2NhdGlvbiByb3V0aW5lcyBhcmUgZ29pbmcgdG8gaGFuZGxlIGl0IHNwZWNpYWxseS4KLSAgICAgICAgICAgICAgICAgRG9uJ3QgY2hhbmdlIHRoZSB2YWx1ZS4gICovCi0JICAgICAgcmVzb2x2ZWQgPSBzeW1ib2xfcmVzb2x2ZWRfcCAoYWRkX3N5bWJvbCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKGZpbmFsaXplICYmIGZpbmFsX3ZhbCA9PSAwKQotCSAgICB7Ci0JICAgICAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAoYWRkX3N5bWJvbCkpCi0JCWFkZF9zeW1ib2wgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikKLQkJCQkJCSAgIGFkZF9zeW1ib2wpOwotCSAgICAgIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgKHN5bXAsIGFkZF9zeW1ib2wpOwotCSAgICB9Ci0KLQkgIC8qIElmIHdlIGhhdmUgZXF1YXRlZCB0aGlzIHN5bWJvbCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLCB3ZQotICAgICAgICAgICAgIGtlZXAgWF9vcCBzZXQgdG8gT19zeW1ib2wsIGFuZCB3ZSBkb24ndCBjaGFuZ2UKLSAgICAgICAgICAgICBYX2FkZF9udW1iZXIuICBUaGlzIHBlcm1pdHMgdGhlIHJvdXRpbmUgd2hpY2ggd3JpdGVzIG91dAotICAgICAgICAgICAgIHJlbG9jYXRpb24gdG8gZGV0ZWN0IHRoaXMgY2FzZSwgYW5kIGNvbnZlcnQgdGhlCi0gICAgICAgICAgICAgcmVsb2NhdGlvbiB0byBiZSBhZ2FpbnN0IHRoZSBzeW1ib2wgdG8gd2hpY2ggdGhpcyBzeW1ib2wKLSAgICAgICAgICAgICBpcyBlcXVhdGVkLiAgKi8KLQkgIGlmICghIFNfSVNfREVGSU5FRCAoYWRkX3N5bWJvbCkgfHwgU19JU19DT01NT04gKGFkZF9zeW1ib2wpKQotCSAgICB7Ci0JICAgICAgaWYgKGZpbmFsaXplKQotCQl7Ci0JCSAgU19TRVRfU0VHTUVOVCAoc3ltcCwgU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbCkpOwotCQkgIHN5bXAtPnN5X3ZhbHVlLlhfb3AgPSBPX3N5bWJvbDsKLQkJICBzeW1wLT5zeV92YWx1ZS5YX2FkZF9zeW1ib2wgPSBhZGRfc3ltYm9sOwotCQkgIHN5bXAtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IGZpbmFsX3ZhbDsKLQkJfQotCSAgICAgIGZpbmFsX3ZhbCA9IDA7Ci0JICAgICAgcmVzb2x2ZWQgPSBzeW1ib2xfcmVzb2x2ZWRfcCAoYWRkX3N5bWJvbCk7Ci0JICAgICAgZ290byBleGl0X2RvbnRfc2V0X3ZhbHVlOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmaW5hbF92YWwgKz0gc3ltcC0+c3lfZnJhZy0+ZnJfYWRkcmVzcyArIGxlZnQ7Ci0JICAgICAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24gfHwgZmluYWxfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQlmaW5hbF9zZWcgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sKTsKLQkgICAgfQotCi0JICByZXNvbHZlZCA9IHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX3VtaW51czoKLQljYXNlIE9fYml0X25vdDoKLQljYXNlIE9fbG9naWNhbF9ub3Q6Ci0JICBsZWZ0ID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGFkZF9zeW1ib2wsIGZpbmFsaXplKTsKLQotCSAgaWYgKG9wID09IE9fdW1pbnVzKQotCSAgICBsZWZ0ID0gLWxlZnQ7Ci0JICBlbHNlIGlmIChvcCA9PSBPX2xvZ2ljYWxfbm90KQotCSAgICBsZWZ0ID0gIWxlZnQ7Ci0JICBlbHNlCi0JICAgIGxlZnQgPSB+bGVmdDsKLQotCSAgZmluYWxfdmFsICs9IGxlZnQgKyBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzOwotCSAgaWYgKGZpbmFsX3NlZyA9PSBleHByX3NlY3Rpb24gfHwgZmluYWxfc2VnID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCSAgICBmaW5hbF9zZWcgPSBhYnNvbHV0ZV9zZWN0aW9uOwotCi0JICByZXNvbHZlZCA9IHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPX211bHRpcGx5OgotCWNhc2UgT19kaXZpZGU6Ci0JY2FzZSBPX21vZHVsdXM6Ci0JY2FzZSBPX2xlZnRfc2hpZnQ6Ci0JY2FzZSBPX3JpZ2h0X3NoaWZ0OgotCWNhc2UgT19iaXRfaW5jbHVzaXZlX29yOgotCWNhc2UgT19iaXRfb3Jfbm90OgotCWNhc2UgT19iaXRfZXhjbHVzaXZlX29yOgotCWNhc2UgT19iaXRfYW5kOgotCWNhc2UgT19hZGQ6Ci0JY2FzZSBPX3N1YnRyYWN0OgotCWNhc2UgT19lcToKLQljYXNlIE9fbmU6Ci0JY2FzZSBPX2x0OgotCWNhc2UgT19sZToKLQljYXNlIE9fZ2U6Ci0JY2FzZSBPX2d0OgotCWNhc2UgT19sb2dpY2FsX2FuZDoKLQljYXNlIE9fbG9naWNhbF9vcjoKLQkgIGxlZnQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAoYWRkX3N5bWJvbCwgZmluYWxpemUpOwotCSAgcmlnaHQgPSByZXNvbHZlX3N5bWJvbF92YWx1ZSAob3Bfc3ltYm9sLCBmaW5hbGl6ZSk7Ci0JICBzZWdfbGVmdCA9IFNfR0VUX1NFR01FTlQgKGFkZF9zeW1ib2wpOwotCSAgc2VnX3JpZ2h0ID0gU19HRVRfU0VHTUVOVCAob3Bfc3ltYm9sKTsKLQotCSAgLyogU2ltcGxpZnkgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gb2YgYSBjb25zdGFudCBieSBmb2xkaW5nIHRoZQotCSAgICAgY29uc3RhbnQgaW50byBYX2FkZF9udW1iZXIuICAqLwotCSAgaWYgKG9wID09IE9fYWRkIHx8IG9wID09IE9fc3VidHJhY3QpCi0JICAgIHsKLQkgICAgICBpZiAoc2VnX3JpZ2h0ID09IGFic29sdXRlX3NlY3Rpb24pCi0JCXsKLQkJICBpZiAob3AgPT0gT19hZGQpCi0JCSAgICBmaW5hbF92YWwgKz0gcmlnaHQ7Ci0JCSAgZWxzZQotCQkgICAgZmluYWxfdmFsIC09IHJpZ2h0OwotCQkgIG9wID0gT19zeW1ib2w7Ci0JCSAgb3Bfc3ltYm9sID0gTlVMTDsKLQkJICBnb3RvIGRvX3N5bWJvbDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHNlZ19sZWZ0ID09IGFic29sdXRlX3NlY3Rpb24gJiYgb3AgPT0gT19hZGQpCi0JCXsKLQkJICBvcCA9IE9fc3ltYm9sOwotCQkgIGZpbmFsX3ZhbCArPSBsZWZ0OwotCQkgIGFkZF9zeW1ib2wgPSBvcF9zeW1ib2w7Ci0JCSAgbGVmdCA9IHJpZ2h0OwotCQkgIG9wX3N5bWJvbCA9IE5VTEw7Ci0JCSAgZ290byBkb19zeW1ib2w7Ci0JCX0KLQkgICAgfQotCi0JICAvKiBTdWJ0cmFjdGlvbiBpcyBwZXJtaXR0ZWQgaWYgYm90aCBvcGVyYW5kcyBhcmUgaW4gdGhlIHNhbWUKLQkgICAgIHNlY3Rpb24uICBPdGhlcndpc2UsIGJvdGggb3BlcmFuZHMgbXVzdCBiZSBhYnNvbHV0ZS4gIFdlCi0JICAgICBhbHJlYWR5IGhhbmRsZWQgdGhlIGNhc2Ugb2YgYWRkaXRpb24gb3Igc3VidHJhY3Rpb24gb2YgYQotCSAgICAgY29uc3RhbnQgYWJvdmUuICBUaGlzIHdpbGwgcHJvYmFibHkgbmVlZCB0byBiZSBjaGFuZ2VkCi0JICAgICBmb3IgYW4gb2JqZWN0IGZpbGUgZm9ybWF0IHdoaWNoIHN1cHBvcnRzIGFyYml0cmFyeQotCSAgICAgZXhwcmVzc2lvbnMsIHN1Y2ggYXMgSUVFRS02OTUuICAqLwotCSAgLyogRG9uJ3QgZW1pdCBtZXNzYWdlcyB1bmxlc3Mgd2UncmUgZmluYWxpemluZyB0aGUgc3ltYm9sIHZhbHVlLAotCSAgICAgb3RoZXJ3aXNlIHdlIG1heSBnZXQgdGhlIHNhbWUgbWVzc2FnZSBtdWx0aXBsZSB0aW1lcy4gICovCi0JICBpZiAoKHNlZ19sZWZ0ICE9IGFic29sdXRlX3NlY3Rpb24KLQkgICAgICAgfHwgc2VnX3JpZ2h0ICE9IGFic29sdXRlX3NlY3Rpb24pCi0JICAgICAgJiYgKG9wICE9IE9fc3VidHJhY3QKLQkJICB8fCBzZWdfbGVmdCAhPSBzZWdfcmlnaHQKLQkJICB8fCBzZWdfbGVmdCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgICAmJiBmaW5hbGl6ZSkKLQkgICAgewotCSAgICAgIGNoYXIgKmZpbGU7Ci0JICAgICAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLQkgICAgICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKHN5bXAsICZmaWxlLCAmbGluZSkpCi0JCXsKLQkJICBpZiAoc2VnX2xlZnQgPT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsCi0JCQkJICBfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiIpLAotCQkJCSAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKSk7Ci0JCSAgaWYgKHNlZ19yaWdodCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZF93aGVyZSAoZmlsZSwgbGluZSwKLQkJCQkgIF8oInVuZGVmaW5lZCBzeW1ib2wgJXMgaW4gb3BlcmF0aW9uIiksCi0JCQkJICBTX0dFVF9OQU1FIChzeW1wLT5zeV92YWx1ZS5YX29wX3N5bWJvbCkpOwotCQkgIGlmIChzZWdfbGVmdCAhPSB1bmRlZmluZWRfc2VjdGlvbgotCQkgICAgICAmJiBzZWdfcmlnaHQgIT0gdW5kZWZpbmVkX3NlY3Rpb24pCi0JCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oImludmFsaWQgc2VjdGlvbiBmb3Igb3BlcmF0aW9uIikpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKHNlZ19sZWZ0ID09IHVuZGVmaW5lZF9zZWN0aW9uKQotCQkgICAgYXNfYmFkIChfKCJ1bmRlZmluZWQgc3ltYm9sICVzIGluIG9wZXJhdGlvbiBzZXR0aW5nICVzIiksCi0JCQkgICAgU19HRVRfTkFNRSAoc3ltcC0+c3lfdmFsdWUuWF9hZGRfc3ltYm9sKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JCSAgaWYgKHNlZ19yaWdodCA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZCAoXygidW5kZWZpbmVkIHN5bWJvbCAlcyBpbiBvcGVyYXRpb24gc2V0dGluZyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXAtPnN5X3ZhbHVlLlhfb3Bfc3ltYm9sKSwKLQkJCSAgICBTX0dFVF9OQU1FIChzeW1wKSk7Ci0JCSAgaWYgKHNlZ19sZWZ0ICE9IHVuZGVmaW5lZF9zZWN0aW9uCi0JCSAgICAgICYmIHNlZ19yaWdodCAhPSB1bmRlZmluZWRfc2VjdGlvbikKLQkJICAgIGFzX2JhZCAoXygiaW52YWxpZCBzZWN0aW9uIGZvciBvcGVyYXRpb24gc2V0dGluZyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIENoZWNrIGZvciBkaXZpc2lvbiBieSB6ZXJvLiAgKi8KLQkgIGlmICgob3AgPT0gT19kaXZpZGUgfHwgb3AgPT0gT19tb2R1bHVzKSAmJiByaWdodCA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSWYgc2VnX3JpZ2h0IGlzIG5vdCBhYnNvbHV0ZV9zZWN0aW9uLCB0aGVuIHdlJ3ZlCi0gICAgICAgICAgICAgICAgIGFscmVhZHkgaXNzdWVkIGEgd2FybmluZyBhYm91dCB1c2luZyBhIGJhZCBzeW1ib2wuICAqLwotCSAgICAgIGlmIChzZWdfcmlnaHQgPT0gYWJzb2x1dGVfc2VjdGlvbiAmJiBmaW5hbGl6ZSkKLQkJewotCQkgIGNoYXIgKmZpbGU7Ci0JCSAgdW5zaWduZWQgaW50IGxpbmU7Ci0KLQkJICBpZiAoZXhwcl9zeW1ib2xfd2hlcmUgKHN5bXAsICZmaWxlLCAmbGluZSkpCi0JCSAgICBhc19iYWRfd2hlcmUgKGZpbGUsIGxpbmUsIF8oImRpdmlzaW9uIGJ5IHplcm8iKSk7Ci0JCSAgZWxzZQotCQkgICAgYXNfYmFkIChfKCJkaXZpc2lvbiBieSB6ZXJvIHdoZW4gc2V0dGluZyAlcyIpLAotCQkJICAgIFNfR0VUX05BTUUgKHN5bXApKTsKLQkJfQotCi0JICAgICAgcmlnaHQgPSAxOwotCSAgICB9Ci0KLQkgIHN3aXRjaCAoc3ltcC0+c3lfdmFsdWUuWF9vcCkKLQkgICAgewotCSAgICBjYXNlIE9fbXVsdGlwbHk6CQlsZWZ0ICo9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2RpdmlkZToJCWxlZnQgLz0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fbW9kdWx1czoJCWxlZnQgJT0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fbGVmdF9zaGlmdDoJCWxlZnQgPDw9IHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX3JpZ2h0X3NoaWZ0OgkJbGVmdCA+Pj0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoJbGVmdCB8PSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfb3Jfbm90OgkJbGVmdCB8PSB+cmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fYml0X2V4Y2x1c2l2ZV9vcjoJbGVmdCBePSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19iaXRfYW5kOgkJbGVmdCAmPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19hZGQ6CQkJbGVmdCArPSByaWdodDsgYnJlYWs7Ci0JICAgIGNhc2UgT19zdWJ0cmFjdDoJCWxlZnQgLT0gcmlnaHQ7IGJyZWFrOwotCSAgICBjYXNlIE9fZXE6CWxlZnQgPSBsZWZ0ID09IHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fbmU6CWxlZnQgPSBsZWZ0ICE9IHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fbHQ6CWxlZnQgPSBsZWZ0IDwgIHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fbGU6CWxlZnQgPSBsZWZ0IDw9IHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fZ2U6CWxlZnQgPSBsZWZ0ID49IHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fZ3Q6CWxlZnQgPSBsZWZ0ID4gIHJpZ2h0ID8gfiAob2Zmc2V0VCkgMCA6IDA7IGJyZWFrOwotCSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6CWxlZnQgPSBsZWZ0ICYmIHJpZ2h0OyBicmVhazsKLQkgICAgY2FzZSBPX2xvZ2ljYWxfb3I6CWxlZnQgPSBsZWZ0IHx8IHJpZ2h0OyBicmVhazsKLQkgICAgZGVmYXVsdDoJCWFib3J0ICgpOwotCSAgICB9Ci0KLQkgIGZpbmFsX3ZhbCArPSBzeW1wLT5zeV9mcmFnLT5mcl9hZGRyZXNzICsgbGVmdDsKLQkgIGlmIChmaW5hbF9zZWcgPT0gZXhwcl9zZWN0aW9uIHx8IGZpbmFsX3NlZyA9PSB1bmRlZmluZWRfc2VjdGlvbikKLQkgICAgZmluYWxfc2VnID0gYWJzb2x1dGVfc2VjdGlvbjsKLQkgIHJlc29sdmVkID0gKHN5bWJvbF9yZXNvbHZlZF9wIChhZGRfc3ltYm9sKQotCQkgICAgICAmJiBzeW1ib2xfcmVzb2x2ZWRfcCAob3Bfc3ltYm9sKSk7Ci0gICAJICBicmVhazsKLQotCWNhc2UgT19yZWdpc3RlcjoKLQljYXNlIE9fYmlnOgotCWNhc2UgT19pbGxlZ2FsOgotCSAgLyogR2l2ZSBhbiBlcnJvciAoYmVsb3cpIGlmIG5vdCBpbiBleHByX3NlY3Rpb24uICBXZSBkb24ndAotCSAgICAgd2FudCB0byB3b3JyeSBhYm91dCBleHByX3NlY3Rpb24gc3ltYm9scywgYmVjYXVzZSB0aGV5Ci0JICAgICBhcmUgZmljdGlvbmFsICh0aGV5IGFyZSBjcmVhdGVkIGFzIHBhcnQgb2YgZXhwcmVzc2lvbgotCSAgICAgcmVzb2x1dGlvbiksIGFuZCBhbnkgcHJvYmxlbXMgbWF5IG5vdCBhY3R1YWxseSBtZWFuCi0JICAgICBhbnl0aGluZy4gICovCi0JICBicmVhazsKLQl9Ci0KLSAgICAgIHN5bXAtPnN5X3Jlc29sdmluZyA9IDA7Ci0gICAgfQotCi0gIGlmIChmaW5hbGl6ZSkKLSAgICB7Ci0gICAgICBTX1NFVF9WQUxVRSAoc3ltcCwgZmluYWxfdmFsKTsKLQotI2lmIGRlZmluZWQgKE9CSl9BT1VUKSAmJiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gICAgICAvKiBUaGUgb2xkIGEub3V0IGJhY2tlbmQgZG9lcyBub3QgaGFuZGxlIFNfU0VUX1NFR01FTlQgY29ycmVjdGx5Ci0gICAgICAgICBmb3IgYSBzdGFiIHN5bWJvbCwgc28gd2UgdXNlIHRoaXMgYmFkIGhhY2suICAqLwotICAgICAgaWYgKGZpbmFsX3NlZyAhPSBTX0dFVF9TRUdNRU5UIChzeW1wKSkKLSNlbmRpZgotCVNfU0VUX1NFR01FTlQgKHN5bXAsIGZpbmFsX3NlZyk7Ci0gICAgfQotCi1leGl0X2RvbnRfc2V0X3ZhbHVlOgotICAvKiBEb24ndCB3b3JyeSBpZiB3ZSBjYW4ndCByZXNvbHZlIGFuIGV4cHJfc2VjdGlvbiBzeW1ib2wuICAqLwotICBpZiAoZmluYWxpemUpCi0gICAgewotICAgICAgaWYgKHJlc29sdmVkKQotCXN5bXAtPnN5X3Jlc29sdmVkID0gMTsKLSAgICAgIGVsc2UgaWYgKFNfR0VUX1NFR01FTlQgKHN5bXApICE9IGV4cHJfc2VjdGlvbikKLQl7Ci0JICBhc19iYWQgKF8oImNhbid0IHJlc29sdmUgdmFsdWUgZm9yIHN5bWJvbCBcIiVzXCIiKSwgU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgc3ltcC0+c3lfcmVzb2x2ZWQgPSAxOwotCX0KLSAgICB9Ci0KLSAgcmV0dXJuIGZpbmFsX3ZhbDsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotc3RhdGljIHZvaWQgcmVzb2x2ZV9sb2NhbF9zeW1ib2wgUEFSQU1TICgoY29uc3QgY2hhciAqLCBQVFIpKTsKLQotLyogQSBzdGF0aWMgZnVuY3Rpb24gcGFzc2VkIHRvIGhhc2hfdHJhdmVyc2UuICAqLwotCi1zdGF0aWMgdm9pZAotcmVzb2x2ZV9sb2NhbF9zeW1ib2wgKGtleSwgdmFsdWUpCi0gICAgIGNvbnN0IGNoYXIgKmtleTsKLSAgICAgUFRSIHZhbHVlOwotewotICBpZiAodmFsdWUgIT0gTlVMTCkKLSAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAodmFsdWUsIDEpOwotfQotCi0jZW5kaWYKLQotLyogUmVzb2x2ZSBhbGwgbG9jYWwgc3ltYm9scy4gICovCi0KLXZvaWQKLXJlc29sdmVfbG9jYWxfc3ltYm9sX3ZhbHVlcyAoKQotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaGFzaF90cmF2ZXJzZSAobG9jYWxfaGFzaCwgcmVzb2x2ZV9sb2NhbF9zeW1ib2wpOwotI2VuZGlmCi19Ci0KLS8qIERvbGxhciBsYWJlbHMgbG9vayBsaWtlIGEgbnVtYmVyIGZvbGxvd2VkIGJ5IGEgZG9sbGFyIHNpZ24uICBFZywgIjQyJCIuCi0gICBUaGV5IGFyZSAqcmVhbGx5KiBsb2NhbC4gIFRoYXQgaXMsIHRoZXkgZ28gb3V0IG9mIHNjb3BlIHdoZW5ldmVyIHdlIHNlZSBhCi0gICBsYWJlbCB0aGF0IGlzbid0IGxvY2FsLiAgQWxzbywgbGlrZSBmYiBsYWJlbHMsIHRoZXJlIGNhbiBiZSBtdWx0aXBsZQotICAgaW5zdGFuY2VzIG9mIGEgZG9sbGFyIGxhYmVsLiAgVGhlcmVmb3IsIHdlIG5hbWUgZW5jb2RlIGVhY2ggaW5zdGFuY2Ugd2l0aAotICAgdGhlIGluc3RhbmNlIG51bWJlciwga2VlcCBhIGxpc3Qgb2YgZGVmaW5lZCBzeW1ib2xzIHNlcGFyYXRlIGZyb20gdGhlIHJlYWwKLSAgIHN5bWJvbCB0YWJsZSwgYW5kIHdlIHRyZWF0IHRoZXNlIGJ1Z2dlcnMgYXMgYSBzcGFyc2UgYXJyYXkuICAqLwotCi1zdGF0aWMgbG9uZyAqZG9sbGFyX2xhYmVsczsKLXN0YXRpYyBsb25nICpkb2xsYXJfbGFiZWxfaW5zdGFuY2VzOwotc3RhdGljIGNoYXIgKmRvbGxhcl9sYWJlbF9kZWZpbmVzOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9sbGFyX2xhYmVsX2NvdW50Owotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9sbGFyX2xhYmVsX21heDsKLQotaW50IAotZG9sbGFyX2xhYmVsX2RlZmluZWQgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGtub3cgKChkb2xsYXJfbGFiZWxzICE9IE5VTEwpIHx8IChkb2xsYXJfbGFiZWxfY291bnQgPT0gMCkpOwotCi0gIGZvciAoaSA9IGRvbGxhcl9sYWJlbHM7IGkgPCBkb2xsYXJfbGFiZWxzICsgZG9sbGFyX2xhYmVsX2NvdW50OyArK2kpCi0gICAgaWYgKCppID09IGxhYmVsKQotICAgICAgcmV0dXJuIGRvbGxhcl9sYWJlbF9kZWZpbmVzW2kgLSBkb2xsYXJfbGFiZWxzXTsKLQotICAvKiBpZiB3ZSBnZXQgaGVyZSwgbGFiZWwgaXNuJ3QgZGVmaW5lZCAqLwotICByZXR1cm4gMDsKLX0JCQkJLyogZG9sbGFyX2xhYmVsX2RlZmluZWQoKSAqLwotCi1zdGF0aWMgbG9uZwotZG9sbGFyX2xhYmVsX2luc3RhbmNlIChsYWJlbCkKLSAgICAgbG9uZyBsYWJlbDsKLXsKLSAgbG9uZyAqaTsKLQotICBrbm93ICgoZG9sbGFyX2xhYmVscyAhPSBOVUxMKSB8fCAoZG9sbGFyX2xhYmVsX2NvdW50ID09IDApKTsKLQotICBmb3IgKGkgPSBkb2xsYXJfbGFiZWxzOyBpIDwgZG9sbGFyX2xhYmVscyArIGRvbGxhcl9sYWJlbF9jb3VudDsgKytpKQotICAgIGlmICgqaSA9PSBsYWJlbCkKLSAgICAgIHJldHVybiAoZG9sbGFyX2xhYmVsX2luc3RhbmNlc1tpIC0gZG9sbGFyX2xhYmVsc10pOwotCi0gIC8qIElmIHdlIGdldCBoZXJlLCB3ZSBoYXZlbid0IHNlZW4gdGhlIGxhYmVsIGJlZm9yZSwgdGhlcmVmb3JlIGl0cyBpbnN0YW5jZQotICAgICBjb3VudCBpcyB6ZXJvLiAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgCi1kb2xsYXJfbGFiZWxfY2xlYXIgKCkKLXsKLSAgbWVtc2V0IChkb2xsYXJfbGFiZWxfZGVmaW5lcywgJ1wwJywgKHVuc2lnbmVkIGludCkgZG9sbGFyX2xhYmVsX2NvdW50KTsKLX0KLQotI2RlZmluZSBET0xMQVJfTEFCRUxfQlVNUF9CWSAxMAotCi12b2lkIAotZGVmaW5lX2RvbGxhcl9sYWJlbCAobGFiZWwpCi0gICAgIGxvbmcgbGFiZWw7Ci17Ci0gIGxvbmcgKmk7Ci0KLSAgZm9yIChpID0gZG9sbGFyX2xhYmVsczsgaSA8IGRvbGxhcl9sYWJlbHMgKyBkb2xsYXJfbGFiZWxfY291bnQ7ICsraSkKLSAgICBpZiAoKmkgPT0gbGFiZWwpCi0gICAgICB7Ci0JKytkb2xsYXJfbGFiZWxfaW5zdGFuY2VzW2kgLSBkb2xsYXJfbGFiZWxzXTsKLQlkb2xsYXJfbGFiZWxfZGVmaW5lc1tpIC0gZG9sbGFyX2xhYmVsc10gPSAxOwotCXJldHVybjsKLSAgICAgIH0KLQotICAvKiBpZiB3ZSBnZXQgdG8gaGVyZSwgd2UgZG9uJ3QgaGF2ZSBsYWJlbCBsaXN0ZWQgeWV0LiAqLwotCi0gIGlmIChkb2xsYXJfbGFiZWxzID09IE5VTEwpCi0gICAgewotICAgICAgZG9sbGFyX2xhYmVscyA9IChsb25nICopIHhtYWxsb2MgKERPTExBUl9MQUJFTF9CVU1QX0JZICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfaW5zdGFuY2VzID0gKGxvbmcgKikgeG1hbGxvYyAoRE9MTEFSX0xBQkVMX0JVTVBfQlkgKiBzaXplb2YgKGxvbmcpKTsKLSAgICAgIGRvbGxhcl9sYWJlbF9kZWZpbmVzID0geG1hbGxvYyAoRE9MTEFSX0xBQkVMX0JVTVBfQlkpOwotICAgICAgZG9sbGFyX2xhYmVsX21heCA9IERPTExBUl9MQUJFTF9CVU1QX0JZOwotICAgICAgZG9sbGFyX2xhYmVsX2NvdW50ID0gMDsKLSAgICB9Ci0gIGVsc2UgaWYgKGRvbGxhcl9sYWJlbF9jb3VudCA9PSBkb2xsYXJfbGFiZWxfbWF4KQotICAgIHsKLSAgICAgIGRvbGxhcl9sYWJlbF9tYXggKz0gRE9MTEFSX0xBQkVMX0JVTVBfQlk7Ci0gICAgICBkb2xsYXJfbGFiZWxzID0gKGxvbmcgKikgeHJlYWxsb2MgKChjaGFyICopIGRvbGxhcl9sYWJlbHMsCi0JCQkJCSBkb2xsYXJfbGFiZWxfbWF4ICogc2l6ZW9mIChsb25nKSk7Ci0gICAgICBkb2xsYXJfbGFiZWxfaW5zdGFuY2VzID0gKGxvbmcgKikgeHJlYWxsb2MgKChjaGFyICopIGRvbGxhcl9sYWJlbF9pbnN0YW5jZXMsCi0JCQkJCSAgZG9sbGFyX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgICAgZG9sbGFyX2xhYmVsX2RlZmluZXMgPSB4cmVhbGxvYyAoZG9sbGFyX2xhYmVsX2RlZmluZXMsIGRvbGxhcl9sYWJlbF9tYXgpOwotICAgIH0JCQkJLyogaWYgd2UgbmVlZGVkIHRvIGdyb3cgKi8KLQotICBkb2xsYXJfbGFiZWxzW2RvbGxhcl9sYWJlbF9jb3VudF0gPSBsYWJlbDsKLSAgZG9sbGFyX2xhYmVsX2luc3RhbmNlc1tkb2xsYXJfbGFiZWxfY291bnRdID0gMTsKLSAgZG9sbGFyX2xhYmVsX2RlZmluZXNbZG9sbGFyX2xhYmVsX2NvdW50XSA9IDE7Ci0gICsrZG9sbGFyX2xhYmVsX2NvdW50OwotfQotCi0vKgotICoJCQlkb2xsYXJfbGFiZWxfbmFtZSgpCi0gKgotICogQ2FsbGVyIG11c3QgY29weSByZXR1cm5lZCBuYW1lOiB3ZSByZS11c2UgdGhlIGFyZWEgZm9yIHRoZSBuZXh0IG5hbWUuCi0gKgotICogVGhlIG10aCBvY2N1cmVuY2Ugb2YgbGFiZWwgbjogaXMgdHVybmVkIGludG8gdGhlIHN5bWJvbCAiTG5eQW0iCi0gKiB3aGVyZSBuIGlzIHRoZSBsYWJlbCBudW1iZXIgYW5kIG0gaXMgdGhlIGluc3RhbmNlIG51bWJlci4gIkwiIG1ha2VzCi0gKiBpdCBhIGxhYmVsIGRpc2NhcmRlZCB1bmxlc3MgZGVidWdnaW5nIGFuZCAiXkEiKCdcMScpIGVuc3VyZXMgbm8KLSAqIG9yZGluYXJ5IHN5bWJvbCBTSE9VTEQgZ2V0IHRoZSBzYW1lIG5hbWUgYXMgYSBsb2NhbCBsYWJlbAotICogc3ltYm9sLiBUaGUgZmlyc3QgIjQ6IiBpcyAiTDReQTEiIC0gdGhlIG0gbnVtYmVycyBiZWdpbiBhdCAxLgotICoKLSAqIGZiIGxhYmVscyBnZXQgdGhlIHNhbWUgdHJlYXRtZW50LCBleGNlcHQgdGhhdCBeQiBpcyB1c2VkIGluIHBsYWNlIG9mIF5BLgotICovCi0KLWNoYXIgKgkJCQkvKiBSZXR1cm4gbG9jYWwgbGFiZWwgbmFtZS4gKi8KLWRvbGxhcl9sYWJlbF9uYW1lIChuLCBhdWdlbmQpCi0gICAgIHJlZ2lzdGVyIGxvbmcgbjsJCS8qIHdlIGp1c3Qgc2F3ICJuJDoiIDogbiBhIG51bWJlciAqLwotICAgICByZWdpc3RlciBpbnQgYXVnZW5kOwkvKiAwIGZvciBjdXJyZW50IGluc3RhbmNlLCAxIGZvciBuZXcgaW5zdGFuY2UgKi8KLXsKLSAgbG9uZyBpOwotICAvKiBSZXR1cm5lZCB0byBjYWxsZXIsIHRoZW4gY29waWVkLiAgdXNlZCBmb3IgY3JlYXRlZCBuYW1lcyAoIjRmIikgKi8KLSAgc3RhdGljIGNoYXIgc3ltYm9sX25hbWVfYnVpbGRbMjRdOwotICByZWdpc3RlciBjaGFyICpwOwotICByZWdpc3RlciBjaGFyICpxOwotICBjaGFyIHN5bWJvbF9uYW1lX3RlbXBvcmFyeVsyMF07CS8qIGJ1aWxkIHVwIGEgbnVtYmVyLCBCQUNLV0FSRFMgKi8KLQotICBrbm93IChuID49IDApOwotICBrbm93IChhdWdlbmQgPT0gMCB8fCBhdWdlbmQgPT0gMSk7Ci0gIHAgPSBzeW1ib2xfbmFtZV9idWlsZDsKLSAgKnArKyA9ICdMJzsKLQotICAvKiBOZXh0IGNvZGUganVzdCBkb2VzIHNwcmludGYoIHt9LCAiJWQiLCBuKTsgKi8KLSAgLyogbGFiZWwgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBuOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCA9ICotLXEpICE9ICdcMCcpCi0gICAgKytwOwotCi0gICpwKysgPSAxOwkJCS8qIF5BICovCi0KLSAgLyogaW5zdGFuY2UgbnVtYmVyICovCi0gIHEgPSBzeW1ib2xfbmFtZV90ZW1wb3Jhcnk7Ci0gIGZvciAoKnErKyA9IDAsIGkgPSBkb2xsYXJfbGFiZWxfaW5zdGFuY2UgKG4pICsgYXVnZW5kOyBpOyArK3EpCi0gICAgewotICAgICAgKnEgPSBpICUgMTAgKyAnMCc7Ci0gICAgICBpIC89IDEwOwotICAgIH0KLSAgd2hpbGUgKCgqcCsrID0gKi0tcSkgIT0gJ1wwJyk7OwotCi0gIC8qIFRoZSBsYWJlbCwgYXMgYSAnXDAnIGVuZGVkIHN0cmluZywgc3RhcnRzIGF0IHN5bWJvbF9uYW1lX2J1aWxkLiAqLwotICByZXR1cm4gc3ltYm9sX25hbWVfYnVpbGQ7Ci19Ci0KLS8qCi0gKiBTb21ib2R5IGVsc2UncyBpZGVhIG9mIGxvY2FsIGxhYmVscy4gVGhleSBhcmUgbWFkZSBieSAibjoiIHdoZXJlIG4KLSAqIGlzIGFueSBkZWNpbWFsIGRpZ2l0LiBSZWZlciB0byB0aGVtIHdpdGgKLSAqICAibmIiIGZvciBwcmV2aW91cyAoYmFja3dhcmQpIG46Ci0gKiAgb3IgIm5mIiBmb3IgbmV4dCAoZm9yd2FyZCkgbjouCi0gKgotICogV2UgZG8gYSBsaXR0bGUgYmV0dGVyIGFuZCBsZXQgbiBiZSBhbnkgbnVtYmVyLCBub3QganVzdCBhIHNpbmdsZSBkaWdpdCwgYnV0Ci0gKiBzaW5jZSB0aGUgb3RoZXIgZ3V5J3MgYXNzZW1ibGVyIG9ubHkgZG9lcyB0ZW4sIHdlIHRyZWF0IHRoZSBmaXJzdCB0ZW4KLSAqIHNwZWNpYWxseS4KLSAqCi0gKiBMaWtlIHNvbWVvbmUgZWxzZSdzIGFzc2VtYmxlciwgd2UgaGF2ZSBvbmUgc2V0IG9mIGxvY2FsIGxhYmVsIGNvdW50ZXJzIGZvcgotICogZW50aXJlIGFzc2VtYmx5LCBub3Qgb25lIHNldCBwZXIgKHN1YilzZWdtZW50IGxpa2UgaW4gbW9zdCBhc3NlbWJsZXJzLiBUaGlzCi0gKiBpbXBsaWVzIHRoYXQgb25lIGNhbiByZWZlciB0byBhIGxhYmVsIGluIGFub3RoZXIgc2VnbWVudCwgYW5kIGluZGVlZCBzb21lCi0gKiBjcnVmdHkgY29tcGlsZXJzIGhhdmUgZG9uZSBqdXN0IHRoYXQuCi0gKgotICogU2luY2UgdGhlcmUgY291bGQgYmUgYSBMT1Qgb2YgdGhlc2UgdGhpbmdzLCB0cmVhdCB0aGVtIGFzIGEgc3BhcnNlIGFycmF5LgotICovCi0KLSNkZWZpbmUgRkJfTEFCRUxfU1BFQ0lBTCAoMTApCi0KLXN0YXRpYyBsb25nIGZiX2xvd19jb3VudGVyW0ZCX0xBQkVMX1NQRUNJQUxdOwotc3RhdGljIGxvbmcgKmZiX2xhYmVsczsKLXN0YXRpYyBsb25nICpmYl9sYWJlbF9pbnN0YW5jZXM7Ci1zdGF0aWMgbG9uZyBmYl9sYWJlbF9jb3VudDsKLXN0YXRpYyBsb25nIGZiX2xhYmVsX21heDsKLQotLyogdGhpcyBtdXN0IGJlIG1vcmUgdGhhbiBGQl9MQUJFTF9TUEVDSUFMICovCi0jZGVmaW5lIEZCX0xBQkVMX0JVTVBfQlkgKEZCX0xBQkVMX1NQRUNJQUwgKyA2KQotCi1zdGF0aWMgdm9pZCAKLWZiX2xhYmVsX2luaXQgKCkKLXsKLSAgbWVtc2V0ICgodm9pZCAqKSBmYl9sb3dfY291bnRlciwgJ1wwJywgc2l6ZW9mIChmYl9sb3dfY291bnRlcikpOwotfQkJCQkvKiBmYl9sYWJlbF9pbml0KCkgKi8KLQotLyogYWRkIG9uZSB0byB0aGUgaW5zdGFuY2UgbnVtYmVyIG9mIHRoaXMgZmIgbGFiZWwgKi8KLXZvaWQgCi1mYl9sYWJlbF9pbnN0YW5jZV9pbmMgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGlmIChsYWJlbCA8IEZCX0xBQkVMX1NQRUNJQUwpCi0gICAgewotICAgICAgKytmYl9sb3dfY291bnRlcltsYWJlbF07Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChmYl9sYWJlbHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBmYl9sYWJlbHMgKyBGQl9MQUJFTF9TUEVDSUFMOwotCSAgIGkgPCBmYl9sYWJlbHMgKyBmYl9sYWJlbF9jb3VudDsgKytpKQotCXsKLQkgIGlmICgqaSA9PSBsYWJlbCkKLQkgICAgewotCSAgICAgICsrZmJfbGFiZWxfaW5zdGFuY2VzW2kgLSBmYl9sYWJlbHNdOwotCSAgICAgIHJldHVybjsKLQkgICAgfQkJCS8qIGlmIHdlIGZpbmQgaXQgKi8KLQl9CQkJLyogZm9yIGVhY2ggZXhpc3RpbmcgbGFiZWwgKi8KLSAgICB9Ci0KLSAgLyogaWYgd2UgZ2V0IHRvIGhlcmUsIHdlIGRvbid0IGhhdmUgbGFiZWwgbGlzdGVkIHlldC4gKi8KLQotICBpZiAoZmJfbGFiZWxzID09IE5VTEwpCi0gICAgewotICAgICAgZmJfbGFiZWxzID0gKGxvbmcgKikgeG1hbGxvYyAoRkJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfaW5zdGFuY2VzID0gKGxvbmcgKikgeG1hbGxvYyAoRkJfTEFCRUxfQlVNUF9CWSAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfbWF4ID0gRkJfTEFCRUxfQlVNUF9CWTsKLSAgICAgIGZiX2xhYmVsX2NvdW50ID0gRkJfTEFCRUxfU1BFQ0lBTDsKLQotICAgIH0KLSAgZWxzZSBpZiAoZmJfbGFiZWxfY291bnQgPT0gZmJfbGFiZWxfbWF4KQotICAgIHsKLSAgICAgIGZiX2xhYmVsX21heCArPSBGQl9MQUJFTF9CVU1QX0JZOwotICAgICAgZmJfbGFiZWxzID0gKGxvbmcgKikgeHJlYWxsb2MgKChjaGFyICopIGZiX2xhYmVscywKLQkJCQkgICAgIGZiX2xhYmVsX21heCAqIHNpemVvZiAobG9uZykpOwotICAgICAgZmJfbGFiZWxfaW5zdGFuY2VzID0gKGxvbmcgKikgeHJlYWxsb2MgKChjaGFyICopIGZiX2xhYmVsX2luc3RhbmNlcywKLQkJCQkJICAgICAgZmJfbGFiZWxfbWF4ICogc2l6ZW9mIChsb25nKSk7Ci0gICAgfQkJCQkvKiBpZiB3ZSBuZWVkZWQgdG8gZ3JvdyAqLwotCi0gIGZiX2xhYmVsc1tmYl9sYWJlbF9jb3VudF0gPSBsYWJlbDsKLSAgZmJfbGFiZWxfaW5zdGFuY2VzW2ZiX2xhYmVsX2NvdW50XSA9IDE7Ci0gICsrZmJfbGFiZWxfY291bnQ7Ci19Ci0KLXN0YXRpYyBsb25nIAotZmJfbGFiZWxfaW5zdGFuY2UgKGxhYmVsKQotICAgICBsb25nIGxhYmVsOwotewotICBsb25nICppOwotCi0gIGlmIChsYWJlbCA8IEZCX0xBQkVMX1NQRUNJQUwpCi0gICAgewotICAgICAgcmV0dXJuIChmYl9sb3dfY291bnRlcltsYWJlbF0pOwotICAgIH0KLQotICBpZiAoZmJfbGFiZWxzICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChpID0gZmJfbGFiZWxzICsgRkJfTEFCRUxfU1BFQ0lBTDsKLQkgICBpIDwgZmJfbGFiZWxzICsgZmJfbGFiZWxfY291bnQ7ICsraSkKLQl7Ci0JICBpZiAoKmkgPT0gbGFiZWwpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKGZiX2xhYmVsX2luc3RhbmNlc1tpIC0gZmJfbGFiZWxzXSk7Ci0JICAgIH0JCQkvKiBpZiB3ZSBmaW5kIGl0ICovCi0JfQkJCS8qIGZvciBlYWNoIGV4aXN0aW5nIGxhYmVsICovCi0gICAgfQotCi0gIC8qIFdlIGRpZG4ndCBmaW5kIHRoZSBsYWJlbCwgc28gdGhpcyBtdXN0IGJlIGEgcmVmZXJlbmNlIHRvIHRoZQotICAgICBmaXJzdCBpbnN0YW5jZS4gICovCi0gIHJldHVybiAwOwotfQotCi0vKgotICoJCQlmYl9sYWJlbF9uYW1lKCkKLSAqCi0gKiBDYWxsZXIgbXVzdCBjb3B5IHJldHVybmVkIG5hbWU6IHdlIHJlLXVzZSB0aGUgYXJlYSBmb3IgdGhlIG5leHQgbmFtZS4KLSAqCi0gKiBUaGUgbXRoIG9jY3VyZW5jZSBvZiBsYWJlbCBuOiBpcyB0dXJuZWQgaW50byB0aGUgc3ltYm9sICJMbl5CbSIKLSAqIHdoZXJlIG4gaXMgdGhlIGxhYmVsIG51bWJlciBhbmQgbSBpcyB0aGUgaW5zdGFuY2UgbnVtYmVyLiAiTCIgbWFrZXMKLSAqIGl0IGEgbGFiZWwgZGlzY2FyZGVkIHVubGVzcyBkZWJ1Z2dpbmcgYW5kICJeQiIoJ1wyJykgZW5zdXJlcyBubwotICogb3JkaW5hcnkgc3ltYm9sIFNIT1VMRCBnZXQgdGhlIHNhbWUgbmFtZSBhcyBhIGxvY2FsIGxhYmVsCi0gKiBzeW1ib2wuIFRoZSBmaXJzdCAiNDoiIGlzICJMNF5CMSIgLSB0aGUgbSBudW1iZXJzIGJlZ2luIGF0IDEuCi0gKgotICogZG9sbGFyIGxhYmVscyBnZXQgdGhlIHNhbWUgdHJlYXRtZW50LCBleGNlcHQgdGhhdCBeQSBpcyB1c2VkIGluIHBsYWNlIG9mIF5CLiAqLwotCi1jaGFyICoJCQkJLyogUmV0dXJuIGxvY2FsIGxhYmVsIG5hbWUuICovCi1mYl9sYWJlbF9uYW1lIChuLCBhdWdlbmQpCi0gICAgIGxvbmcgbjsJCQkvKiB3ZSBqdXN0IHNhdyAibjoiLCAibmYiIG9yICJuYiIgOiBuIGEgbnVtYmVyICovCi0gICAgIGxvbmcgYXVnZW5kOwkJLyogMCBmb3IgbmIsIDEgZm9yIG46LCBuZiAqLwotewotICBsb25nIGk7Ci0gIC8qIFJldHVybmVkIHRvIGNhbGxlciwgdGhlbiBjb3BpZWQuICB1c2VkIGZvciBjcmVhdGVkIG5hbWVzICgiNGYiKSAqLwotICBzdGF0aWMgY2hhciBzeW1ib2xfbmFtZV9idWlsZFsyNF07Ci0gIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gIHJlZ2lzdGVyIGNoYXIgKnE7Ci0gIGNoYXIgc3ltYm9sX25hbWVfdGVtcG9yYXJ5WzIwXTsJLyogYnVpbGQgdXAgYSBudW1iZXIsIEJBQ0tXQVJEUyAqLwotCi0gIGtub3cgKG4gPj0gMCk7Ci0gIGtub3cgKGF1Z2VuZCA9PSAwIHx8IGF1Z2VuZCA9PSAxKTsKLSAgcCA9IHN5bWJvbF9uYW1lX2J1aWxkOwotICAqcCsrID0gJ0wnOwotCi0gIC8qIE5leHQgY29kZSBqdXN0IGRvZXMgc3ByaW50Zigge30sICIlZCIsIG4pOyAqLwotICAvKiBsYWJlbCBudW1iZXIgKi8KLSAgcSA9IHN5bWJvbF9uYW1lX3RlbXBvcmFyeTsKLSAgZm9yICgqcSsrID0gMCwgaSA9IG47IGk7ICsrcSkKLSAgICB7Ci0gICAgICAqcSA9IGkgJSAxMCArICcwJzsKLSAgICAgIGkgLz0gMTA7Ci0gICAgfQotICB3aGlsZSAoKCpwID0gKi0tcSkgIT0gJ1wwJykKLSAgICArK3A7Ci0KLSAgKnArKyA9IDI7CQkJLyogXkIgKi8KLQotICAvKiBpbnN0YW5jZSBudW1iZXIgKi8KLSAgcSA9IHN5bWJvbF9uYW1lX3RlbXBvcmFyeTsKLSAgZm9yICgqcSsrID0gMCwgaSA9IGZiX2xhYmVsX2luc3RhbmNlIChuKSArIGF1Z2VuZDsgaTsgKytxKQotICAgIHsKLSAgICAgICpxID0gaSAlIDEwICsgJzAnOwotICAgICAgaSAvPSAxMDsKLSAgICB9Ci0gIHdoaWxlICgoKnArKyA9ICotLXEpICE9ICdcMCcpOzsKLQotICAvKiBUaGUgbGFiZWwsIGFzIGEgJ1wwJyBlbmRlZCBzdHJpbmcsIHN0YXJ0cyBhdCBzeW1ib2xfbmFtZV9idWlsZC4gKi8KLSAgcmV0dXJuIChzeW1ib2xfbmFtZV9idWlsZCk7Ci19CQkJCS8qIGZiX2xhYmVsX25hbWUoKSAqLwotCi0vKgotICogZGVjb2RlIG5hbWUgdGhhdCBtYXkgaGF2ZSBiZWVuIGdlbmVyYXRlZCBieSBmb29fbGFiZWxfbmFtZSgpIGFib3ZlLiAgSWYKLSAqIHRoZSBuYW1lIHdhc24ndCBnZW5lcmF0ZWQgYnkgZm9vX2xhYmVsX25hbWUoKSwgdGhlbiByZXR1cm4gaXQgdW5hbHRlcmVkLgotICogVGhpcyBpcyB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KLSAqLwotCi1jaGFyICoKLWRlY29kZV9sb2NhbF9sYWJlbF9uYW1lIChzKQotICAgICBjaGFyICpzOwotewotICBjaGFyICpwOwotICBjaGFyICpzeW1ib2xfZGVjb2RlOwotICBpbnQgbGFiZWxfbnVtYmVyOwotICBpbnQgaW5zdGFuY2VfbnVtYmVyOwotICBjaGFyICp0eXBlOwotICBjb25zdCBjaGFyICptZXNzYWdlX2Zvcm1hdCA9IF8oIlwiJWRcIiAoaW5zdGFuY2UgbnVtYmVyICVkIG9mIGEgJXMgbGFiZWwpIik7Ci0KLSAgaWYgKHNbMF0gIT0gJ0wnKQotICAgIHJldHVybiBzOwotCi0gIGZvciAobGFiZWxfbnVtYmVyID0gMCwgcCA9IHMgKyAxOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApOyArK3ApCi0gICAgbGFiZWxfbnVtYmVyID0gKDEwICogbGFiZWxfbnVtYmVyKSArICpwIC0gJzAnOwotCi0gIGlmICgqcCA9PSAxKQotICAgIHR5cGUgPSAiZG9sbGFyIjsKLSAgZWxzZSBpZiAoKnAgPT0gMikKLSAgICB0eXBlID0gImZiIjsKLSAgZWxzZQotICAgIHJldHVybiBzOwotCi0gIGZvciAoaW5zdGFuY2VfbnVtYmVyID0gMCwgcCsrOyBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnApOyArK3ApCi0gICAgaW5zdGFuY2VfbnVtYmVyID0gKDEwICogaW5zdGFuY2VfbnVtYmVyKSArICpwIC0gJzAnOwotCi0gIHN5bWJvbF9kZWNvZGUgPSBvYnN0YWNrX2FsbG9jICgmbm90ZXMsIHN0cmxlbiAobWVzc2FnZV9mb3JtYXQpICsgMzApOwotICBzcHJpbnRmIChzeW1ib2xfZGVjb2RlLCBtZXNzYWdlX2Zvcm1hdCwgbGFiZWxfbnVtYmVyLCBpbnN0YW5jZV9udW1iZXIsIHR5cGUpOwotCi0gIHJldHVybiBzeW1ib2xfZGVjb2RlOwotfQotCi0vKiBHZXQgdGhlIHZhbHVlIG9mIGEgc3ltYm9sLiAgKi8KLQotdmFsdWVUCi1TX0dFVF9WQUxVRSAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9vZmZzZXQ7Ci0jZW5kaWYKLQotICBpZiAoIXMtPnN5X3Jlc29sdmVkICYmIHMtPnN5X3ZhbHVlLlhfb3AgIT0gT19jb25zdGFudCkKLSAgICByZXNvbHZlX3N5bWJvbF92YWx1ZSAocywgMSk7Ci0gIGlmIChzLT5zeV92YWx1ZS5YX29wICE9IE9fY29uc3RhbnQpCi0gICAgewotICAgICAgc3RhdGljIHN5bWJvbFMgKnJlY3VyOwotCi0gICAgICAvKiBGSVhNRTogSW4gbm9uIEJGRCBhc3NlbWJsZXJzLCBTX0lTX0RFRklORUQgYW5kIFNfSVNfQ09NTU9OCi0gICAgICAgICBtYXkgY2FsbCBTX0dFVF9WQUxVRS4gIFdlIHVzZSBhIHN0YXRpYyBzeW1ib2wgdG8gYXZvaWQgdGhlCi0gICAgICAgICBpbW1lZGlhdGUgcmVjdXJzaW9uLiAgKi8KLSAgICAgIGlmIChyZWN1ciA9PSBzKQotCXJldHVybiAodmFsdWVUKSBzLT5zeV92YWx1ZS5YX2FkZF9udW1iZXI7Ci0gICAgICByZWN1ciA9IHM7Ci0gICAgICBpZiAoISBzLT5zeV9yZXNvbHZlZAotCSAgfHwgcy0+c3lfdmFsdWUuWF9vcCAhPSBPX3N5bWJvbAotCSAgfHwgKFNfSVNfREVGSU5FRCAocykgJiYgISBTX0lTX0NPTU1PTiAocykpKQotCWFzX2JhZCAoXygiQXR0ZW1wdCB0byBnZXQgdmFsdWUgb2YgdW5yZXNvbHZlZCBzeW1ib2wgJXMiKSwKLQkJU19HRVRfTkFNRSAocykpOwotICAgICAgcmVjdXIgPSBOVUxMOwotICAgIH0KLSAgcmV0dXJuICh2YWx1ZVQpIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlcjsKLX0KLQotLyogU2V0IHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLVNfU0VUX1ZBTFVFIChzLCB2YWwpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIHZhbHVlVCB2YWw7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9vZmZzZXQgPSB2YWw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0KLSAgcy0+c3lfdmFsdWUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIHMtPnN5X3ZhbHVlLlhfYWRkX251bWJlciA9IChvZmZzZXRUKSB2YWw7Ci0gIHMtPnN5X3ZhbHVlLlhfdW5zaWduZWQgPSAwOwotfQotCi12b2lkCi1jb3B5X3N5bWJvbF9hdHRyaWJ1dGVzIChkZXN0LCBzcmMpCi0gICAgIHN5bWJvbFMgKmRlc3QsICpzcmM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKGRlc3QpKQotICAgIGRlc3QgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgZGVzdCk7Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHNyYykpCi0gICAgc3JjID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHNyYyk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIC8qIEluIGFuIGV4cHJlc3Npb24sIHRyYW5zZmVyIHRoZSBzZXR0aW5ncyBvZiB0aGVzZSBmbGFncy4KLSAgICAgVGhlIHVzZXIgY2FuIG92ZXJyaWRlIGxhdGVyLCBvZiBjb3Vyc2UuICAqLwotI2RlZmluZSBDT1BJRURfU1lNRkxBR1MJKEJTRl9GVU5DVElPTiB8IEJTRl9PQkpFQ1QpCi0gIGRlc3QtPmJzeW0tPmZsYWdzIHw9IHNyYy0+YnN5bS0+ZmxhZ3MgJiBDT1BJRURfU1lNRkxBR1M7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTCi0gIE9CSl9DT1BZX1NZTUJPTF9BVFRSSUJVVEVTIChkZXN0LCBzcmMpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0KLWludAotU19JU19GVU5DVElPTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgZmxhZ3dvcmQgZmxhZ3M7Ci0KLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgZmxhZ3MgPSBzLT5ic3ltLT5mbGFnczsKLQotICByZXR1cm4gKGZsYWdzICYgQlNGX0ZVTkNUSU9OKSAhPSAwOwotfQotCi1pbnQKLVNfSVNfRVhURVJOQUwgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotCi0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotCi0gIGZsYWdzID0gcy0+YnN5bS0+ZmxhZ3M7Ci0KLSAgLyogc2FuaXR5IGNoZWNrICovCi0gIGlmICgoZmxhZ3MgJiBCU0ZfTE9DQUwpICYmIChmbGFncyAmIEJTRl9HTE9CQUwpKQotICAgIGFib3J0ICgpOwotCi0gIHJldHVybiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSAhPSAwOwotfQotCi1pbnQKLVNfSVNfV0VBSyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfV0VBSykgIT0gMDsKLX0KLQotaW50Ci1TX0lTX0NPTU1PTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBiZmRfaXNfY29tX3NlY3Rpb24gKHMtPmJzeW0tPnNlY3Rpb24pOwotfQotCi1pbnQKLVNfSVNfREVGSU5FRCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKS0+bHN5X3NlY3Rpb24gIT0gdW5kZWZpbmVkX3NlY3Rpb247Ci0gIHJldHVybiBzLT5ic3ltLT5zZWN0aW9uICE9IHVuZGVmaW5lZF9zZWN0aW9uOwotfQotCi1pbnQKLVNfSVNfREVCVUcgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICBpZiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfREVCVUdHSU5HKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1TX0lTX0xPQ0FMIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBmbGFnd29yZCBmbGFnczsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMTsKLQotICBmbGFncyA9IHMtPmJzeW0tPmZsYWdzOwotCi0gIC8qIHNhbml0eSBjaGVjayAqLwotICBpZiAoKGZsYWdzICYgQlNGX0xPQ0FMKSAmJiAoZmxhZ3MgJiBCU0ZfR0xPQkFMKSkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAoYmZkX2dldF9zZWN0aW9uIChzLT5ic3ltKSA9PSByZWdfc2VjdGlvbikKLSAgICByZXR1cm4gMTsKLQotICBpZiAoZmxhZ19zdHJpcF9sb2NhbF9hYnNvbHV0ZQotICAgICAgJiYgKGZsYWdzICYgQlNGX0dMT0JBTCkgPT0gMAotICAgICAgJiYgYmZkX2dldF9zZWN0aW9uIChzLT5ic3ltKSA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybiAxOwotCi0gIG5hbWUgPSBTX0dFVF9OQU1FIChzKTsKLSAgcmV0dXJuIChuYW1lICE9IE5VTEwKLQkgICYmICEgU19JU19ERUJVRyAocykKLQkgICYmIChzdHJjaHIgKG5hbWUsICdcMDAxJykKLQkgICAgICB8fCBzdHJjaHIgKG5hbWUsICdcMDAyJykKLQkgICAgICB8fCAoISBmbGFnX2tlZXBfbG9jYWxzCi0JCSAgJiYgKGJmZF9pc19sb2NhbF9sYWJlbCAoc3Rkb3V0cHV0LCBzLT5ic3ltKQotCQkgICAgICB8fCAoZmxhZ19tcmkKLQkJCSAgJiYgbmFtZVswXSA9PSAnPycKLQkJCSAgJiYgbmFtZVsxXSA9PSAnPycpKSkpKTsKLX0KLQotaW50Ci1TX0lTX0VYVEVSTiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgcmV0dXJuIFNfSVNfRVhURVJOQUwgKHMpOwotfQotCi1pbnQKLVNfSVNfU1RBQkQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIHJldHVybiBTX0dFVF9OQU1FIChzKSA9PSAwOwotfQotCi1DT05TVCBjaGFyICoKLVNfR0VUX05BTUUgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9uYW1lOwotICByZXR1cm4gcy0+YnN5bS0+bmFtZTsKLX0KLQotc2VnVAotU19HRVRfU0VHTUVOVCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKS0+bHN5X3NlY3Rpb247Ci0gIHJldHVybiBzLT5ic3ltLT5zZWN0aW9uOwotfQotCi12b2lkCi1TX1NFVF9TRUdNRU5UIChzLCBzZWcpCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIHNlZ1Qgc2VnOwotewotICAvKiBEb24ndCByZWFzc2lnbiBzZWN0aW9uIHN5bWJvbHMuICBUaGUgZGlyZWN0IHJlYXNvbiBpcyB0byBwcmV2ZW50IHNlZwotICAgICBmYXVsdHMgYXNzaWduaW5nIGJhY2sgdG8gY29uc3QgZ2xvYmFsIHN5bWJvbHMgc3VjaCBhcyAqQUJTKiwgYnV0IGl0Ci0gICAgIHNob3VsZG4ndCBoYXBwZW4gYW55d2F5LiAgKi8KLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBpZiAoc2VnID09IHJlZ19zZWN0aW9uKQotCXMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gICAgICBlbHNlCi0JewotCSAgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpLT5sc3lfc2VjdGlvbiA9IHNlZzsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIGlmIChzLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkKLSAgICB7Ci0gICAgICBpZiAocy0+YnN5bS0+c2VjdGlvbiAhPSBzZWcpCi0JYWJvcnQoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBzLT5ic3ltLT5zZWN0aW9uID0gc2VnOwotfQotCi12b2lkCi1TX1NFVF9FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgaWYgKChzLT5ic3ltLT5mbGFncyAmIEJTRl9XRUFLKSAhPSAwKQotICAgIHsKLSAgICAgIC8qIExldCAud2VhayBvdmVycmlkZSAuZ2xvYmFsLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9HTE9CQUw7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0xPQ0FMfEJTRl9XRUFLKTsKLX0KLQotdm9pZAotU19DTEVBUl9FWFRFUk5BTCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuOwotICBpZiAoKHMtPmJzeW0tPmZsYWdzICYgQlNGX1dFQUspICE9IDApCi0gICAgewotICAgICAgLyogTGV0IC53ZWFrIG92ZXJyaWRlLiAgKi8KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPmZsYWdzIHw9IEJTRl9MT0NBTDsKLSAgcy0+YnN5bS0+ZmxhZ3MgJj0gfihCU0ZfR0xPQkFMfEJTRl9XRUFLKTsKLX0KLQotdm9pZAotU19TRVRfV0VBSyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+YnN5bS0+ZmxhZ3MgfD0gQlNGX1dFQUs7Ci0gIHMtPmJzeW0tPmZsYWdzICY9IH4oQlNGX0dMT0JBTHxCU0ZfTE9DQUwpOwotfQotCi12b2lkCi1TX1NFVF9OQU1FIChzLCBuYW1lKQotICAgICBzeW1ib2xTICpzOwotICAgICBjaGFyICpuYW1lOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyktPmxzeV9uYW1lID0gbmFtZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHMtPmJzeW0tPm5hbWUgPSBuYW1lOwotfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmZGVmIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLQotLyogUmV0dXJuIHRoZSBwcmV2aW91cyBzeW1ib2wgaW4gYSBjaGFpbi4gICovCi0KLXN5bWJvbFMgKgotc3ltYm9sX3ByZXZpb3VzIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHMtPnN5X3ByZXZpb3VzOwotfQotCi0jZW5kaWYgLyogU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUyAqLwotCi0vKiBSZXR1cm4gdGhlIG5leHQgc3ltYm9sIGluIGEgY2hhaW4uICAqLwotCi1zeW1ib2xTICoKLXN5bWJvbF9uZXh0IChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBhYm9ydCAoKTsKLSAgcmV0dXJuIHMtPnN5X25leHQ7Ci19Ci0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGFzIGFuIGV4cHJlc3Npb24uICAqLwotCi1leHByZXNzaW9uUyAqCi1zeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHJldHVybiAmcy0+c3lfdmFsdWU7Ci19Ci0KLS8qIFNldCB0aGUgdmFsdWUgb2YgYSBzeW1ib2wgdG8gYW4gZXhwcmVzc2lvbi4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfdmFsdWVfZXhwcmVzc2lvbiAocywgZXhwKQotICAgICBzeW1ib2xTICpzOwotICAgICBjb25zdCBleHByZXNzaW9uUyAqZXhwOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV92YWx1ZSA9ICpleHA7Ci19Ci0KLS8qIFNldCB0aGUgZnJhZyBvZiBhIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9zZXRfZnJhZyAocywgZikKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgZnJhZ1MgKmY7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBsb2NhbF9zeW1ib2xfc2V0X2ZyYWcgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMsIGYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotICBzLT5zeV9mcmFnID0gZjsKLX0KLQotLyogUmV0dXJuIHRoZSBmcmFnIG9mIGEgc3ltYm9sLiAgKi8KLQotZnJhZ1MgKgotc3ltYm9sX2dldF9mcmFnIChzKQotICAgICBzeW1ib2xTICpzOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIGxvY2FsX3N5bWJvbF9nZXRfZnJhZyAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHMtPnN5X2ZyYWc7Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gdXNlZC4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3VzZWQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+c3lfdXNlZCA9IDE7Ci19Ci0KLS8qIENsZWFyIHRoZSBtYXJrIG9mIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gdXNlZC4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl91c2VkIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICBzID0gbG9jYWxfc3ltYm9sX2NvbnZlcnQgKChzdHJ1Y3QgbG9jYWxfc3ltYm9sICopIHMpOwotICBzLT5zeV91c2VkID0gMDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gdXNlZC4gICovCi0KLWludAotc3ltYm9sX3VzZWRfcCAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiBzLT5zeV91c2VkOwotfQotCi0vKiBNYXJrIGEgc3ltYm9sIGFzIGhhdmluZyBiZWVuIHVzZWQgaW4gYSByZWxvYy4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X3VzZWRfaW5fcmVsb2MgPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGhhcyBiZWVuIHVzZWQgaW4gYSByZWxvYy4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPnN5X3VzZWRfaW5fcmVsb2MgPSAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiB1c2VkIGluIGEgcmVsb2MuICAqLwotCi1pbnQKLXN5bWJvbF91c2VkX2luX3JlbG9jX3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gcy0+c3lfdXNlZF9pbl9yZWxvYzsKLX0KLQotLyogTWFyayBhIHN5bWJvbCBhcyBhbiBNUkkgY29tbW9uIHN5bWJvbC4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX21yaV9jb21tb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X21yaV9jb21tb24gPSAxOwotfQotCi0vKiBDbGVhciB0aGUgbWFyayBvZiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLiAgKi8KLQotdm9pZAotc3ltYm9sX2NsZWFyX21yaV9jb21tb24gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+c3lfbXJpX2NvbW1vbiA9IDA7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGFuIE1SSSBjb21tb24gc3ltYm9sLiAgKi8KLQotaW50Ci1zeW1ib2xfbXJpX2NvbW1vbl9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPnN5X21yaV9jb21tb247Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgYXMgaGF2aW5nIGJlZW4gd3JpdHRlbi4gICovCi0KLXZvaWQKLXN5bWJvbF9tYXJrX3dyaXR0ZW4gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybjsKLSAgcy0+d3JpdHRlbiA9IDE7Ci19Ci0KLS8qIENsZWFyIHRoZSBtYXJrIG9mIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gd3JpdHRlbi4gICovCi0KLXZvaWQKLXN5bWJvbF9jbGVhcl93cml0dGVuIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm47Ci0gIHMtPndyaXR0ZW4gPSAwOwotfQotCi0vKiBSZXR1cm4gd2hldGhlciBhIHN5bWJvbCBoYXMgYmVlbiB3cml0dGVuLiAgKi8KLQotaW50Ci1zeW1ib2xfd3JpdHRlbl9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHMtPndyaXR0ZW47Ci19Ci0KLS8qIE1hcmsgYSBzeW1ib2wgaGFzIGhhdmluZyBiZWVuIHJlc29sdmVkLiAgKi8KLQotdm9pZAotc3ltYm9sX21hcmtfcmVzb2x2ZWQgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICB7Ci0gICAgICBsb2NhbF9zeW1ib2xfbWFya19yZXNvbHZlZCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gIHMtPnN5X3Jlc29sdmVkID0gMTsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGJlZW4gcmVzb2x2ZWQuICAqLwotCi1pbnQKLXN5bWJvbF9yZXNvbHZlZF9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcmV0dXJuIGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSNlbmRpZgotICByZXR1cm4gcy0+c3lfcmVzb2x2ZWQ7Ci19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGEgc2VjdGlvbiBzeW1ib2wuICAqLwotCi1pbnQKLXN5bWJvbF9zZWN0aW9uX3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgcmV0dXJuIChzLT5ic3ltLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgIT0gMDsKLSNlbHNlCi0gIC8qIEZJWE1FICovCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybiB3aGV0aGVyIGEgc3ltYm9sIGlzIGVxdWF0ZWQgdG8gYW5vdGhlciBzeW1ib2wuICAqLwotCi1pbnQKLXN5bWJvbF9lcXVhdGVkX3AgKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gcy0+c3lfdmFsdWUuWF9vcCA9PSBPX3N5bWJvbDsKLX0KLQotLyogUmV0dXJuIHdoZXRoZXIgYSBzeW1ib2wgaGFzIGEgY29uc3RhbnQgdmFsdWUuICAqLwotCi1pbnQKLXN5bWJvbF9jb25zdGFudF9wIChzKQotICAgICBzeW1ib2xTICpzOwotewotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzKSkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIHMtPnN5X3ZhbHVlLlhfb3AgPT0gT19jb25zdGFudDsKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogUmV0dXJuIHRoZSBCRkQgc3ltYm9sIGZvciBhIHN5bWJvbC4gICovCi0KLWFzeW1ib2wgKgotc3ltYm9sX2dldF9iZmRzeW0gKHMpCi0gICAgIHN5bWJvbFMgKnM7Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHJldHVybiBzLT5ic3ltOwotfQotCi0vKiBTZXQgdGhlIEJGRCBzeW1ib2wgZm9yIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotc3ltYm9sX3NldF9iZmRzeW0gKHMsIGJzeW0pCi0gICAgIHN5bWJvbFMgKnM7Ci0gICAgIGFzeW1ib2wgKmJzeW07Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPmJzeW0gPSBic3ltOwotfQotCi0jZW5kaWYgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0jaWZkZWYgT0JKX1NZTUZJRUxEX1RZUEUKLQotLyogR2V0IGEgcG9pbnRlciB0byB0aGUgb2JqZWN0IGZvcm1hdCBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi1PQkpfU1lNRklFTERfVFlQRSAqCi1zeW1ib2xfZ2V0X29iaiAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcmV0dXJuICZzLT5zeV9vYmo7Ci19Ci0KLS8qIFNldCB0aGUgb2JqZWN0IGZvcm1hdCBpbmZvcm1hdGlvbiBmb3IgYSBzeW1ib2wuICAqLwotCi12b2lkCi1zeW1ib2xfc2V0X29iaiAocywgbykKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgT0JKX1NZTUZJRUxEX1RZUEUgKm87Ci17Ci0gIGlmIChMT0NBTF9TWU1CT0xfQ0hFQ0sgKHMpKQotICAgIHMgPSBsb2NhbF9zeW1ib2xfY29udmVydCAoKHN0cnVjdCBsb2NhbF9zeW1ib2wgKikgcyk7Ci0gIHMtPnN5X29iaiA9ICpvOwotfQotCi0jZW5kaWYgLyogT0JKX1NZTUZJRUxEX1RZUEUgKi8KLQotI2lmZGVmIFRDX1NZTUZJRUxEX1RZUEUKLQotLyogR2V0IGEgcG9pbnRlciB0byB0aGUgcHJvY2Vzc29yIGluZm9ybWF0aW9uIGZvciBhIHN5bWJvbC4gICovCi0KLVRDX1NZTUZJRUxEX1RZUEUgKgotc3ltYm9sX2dldF90YyAocykKLSAgICAgc3ltYm9sUyAqczsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcmV0dXJuICZzLT5zeV90YzsKLX0KLQotLyogU2V0IHRoZSBwcm9jZXNzb3IgaW5mb3JtYXRpb24gZm9yIGEgc3ltYm9sLiAgKi8KLQotdm9pZAotc3ltYm9sX3NldF90YyAocywgbykKLSAgICAgc3ltYm9sUyAqczsKLSAgICAgVENfU1lNRklFTERfVFlQRSAqbzsKLXsKLSAgaWYgKExPQ0FMX1NZTUJPTF9DSEVDSyAocykpCi0gICAgcyA9IGxvY2FsX3N5bWJvbF9jb252ZXJ0ICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzKTsKLSAgcy0+c3lfdGMgPSAqbzsKLX0KLQotI2VuZGlmIC8qIFRDX1NZTUZJRUxEX1RZUEUgKi8KLQotdm9pZAotc3ltYm9sX2JlZ2luICgpCi17Ci0gIHN5bWJvbF9sYXN0UCA9IE5VTEw7Ci0gIHN5bWJvbF9yb290UCA9IE5VTEw7CQkvKiBJbiBjYXNlIHdlIGhhdmUgMCBzeW1ib2xzICghISkgKi8KLSAgc3lfaGFzaCA9IGhhc2hfbmV3ICgpOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgbG9jYWxfaGFzaCA9IGhhc2hfbmV3ICgpOwotI2VuZGlmCi0KLSAgbWVtc2V0ICgoY2hhciAqKSAoJmFic19zeW1ib2wpLCAnXDAnLCBzaXplb2YgKGFic19zeW1ib2wpKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0jaWYgZGVmaW5lZCAoRU1JVF9TRUNUSU9OX1NZTUJPTFMpIHx8ICFkZWZpbmVkIChSRUxPQ19SRVFVSVJFU19TWU1CT0wpCi0gIGFic19zeW1ib2wuYnN5bSA9IGJmZF9hYnNfc2VjdGlvbi5zeW1ib2w7Ci0jZW5kaWYKLSNlbHNlCi0gIC8qIENhbid0IGluaXRpYWxpc2UgYSB1bmlvbi4gU2lnaC4gKi8KLSAgU19TRVRfU0VHTUVOVCAoJmFic19zeW1ib2wsIGFic29sdXRlX3NlY3Rpb24pOwotI2VuZGlmCi0gIGFic19zeW1ib2wuc3lfdmFsdWUuWF9vcCA9IE9fY29uc3RhbnQ7Ci0gIGFic19zeW1ib2wuc3lfZnJhZyA9ICZ6ZXJvX2FkZHJlc3NfZnJhZzsKLQotICBpZiAoTE9DQUxfTEFCRUxTX0ZCKQotICAgIGZiX2xhYmVsX2luaXQgKCk7Ci19Ci0KLQotDAotaW50IGluZGVudF9sZXZlbDsKLQotLyogTWF4aW11bSBpbmRlbnQgbGV2ZWwuCi0gICBBdmFpbGFibGUgZm9yIG1vZGlmaWNhdGlvbiBpbnNpZGUgYSBnZGIgc2Vzc2lvbi4gICovCi1pbnQgbWF4X2luZGVudF9sZXZlbCA9IDg7Ci0KLSNpZiAwCi0KLXN0YXRpYyB2b2lkCi1pbmRlbnQgKCkKLXsKLSAgcHJpbnRmICgiJSpzIiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotfQotCi0jZW5kaWYKLQotdm9pZAotcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIHN5bSkKLSAgICAgRklMRSAqZmlsZTsKLSAgICAgc3ltYm9sUyAqc3ltOwotewotICBjb25zdCBjaGFyICpuYW1lID0gU19HRVRfTkFNRSAoc3ltKTsKLSAgaWYgKCFuYW1lIHx8ICFuYW1lWzBdKQotICAgIG5hbWUgPSAiKHVubmFtZWQpIjsKLSAgZnByaW50ZiAoZmlsZSwgInN5bSAlbHggJXMiLCAodW5zaWduZWQgbG9uZykgc3ltLCBuYW1lKTsKLQotICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW0pKQotICAgIHsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBzdHJ1Y3QgbG9jYWxfc3ltYm9sICpsb2NzeW0gPSAoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzeW07Ci0gICAgICBpZiAobG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pICE9ICZ6ZXJvX2FkZHJlc3NfZnJhZwotCSAgJiYgbG9jYWxfc3ltYm9sX2dldF9mcmFnIChsb2NzeW0pICE9IE5VTEwpCi0JZnByaW50ZiAoZmlsZSwgIiBmcmFnICVseCIsIChsb25nKSBsb2NhbF9zeW1ib2xfZ2V0X2ZyYWcgKGxvY3N5bSkpOwotICAgICAgaWYgKGxvY2FsX3N5bWJvbF9yZXNvbHZlZF9wIChsb2NzeW0pKQotCWZwcmludGYgKGZpbGUsICIgcmVzb2x2ZWQiKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgbG9jYWwiKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzeW0tPnN5X2ZyYWcgIT0gJnplcm9fYWRkcmVzc19mcmFnKQotCWZwcmludGYgKGZpbGUsICIgZnJhZyAlbHgiLCAobG9uZykgc3ltLT5zeV9mcmFnKTsKLSAgICAgIGlmIChzeW0tPndyaXR0ZW4pCi0JZnByaW50ZiAoZmlsZSwgIiB3cml0dGVuIik7Ci0gICAgICBpZiAoc3ltLT5zeV9yZXNvbHZlZCkKLQlmcHJpbnRmIChmaWxlLCAiIHJlc29sdmVkIik7Ci0gICAgICBlbHNlIGlmIChzeW0tPnN5X3Jlc29sdmluZykKLQlmcHJpbnRmIChmaWxlLCAiIHJlc29sdmluZyIpOwotICAgICAgaWYgKHN5bS0+c3lfdXNlZF9pbl9yZWxvYykKLQlmcHJpbnRmIChmaWxlLCAiIHVzZWQtaW4tcmVsb2MiKTsKLSAgICAgIGlmIChzeW0tPnN5X3VzZWQpCi0JZnByaW50ZiAoZmlsZSwgIiB1c2VkIik7Ci0gICAgICBpZiAoU19JU19MT0NBTCAoc3ltKSkKLQlmcHJpbnRmIChmaWxlLCAiIGxvY2FsIik7Ci0gICAgICBpZiAoU19JU19FWFRFUk4gKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiBleHRlcm4iKTsKLSAgICAgIGlmIChTX0lTX0RFQlVHIChzeW0pKQotCWZwcmludGYgKGZpbGUsICIgZGVidWciKTsKLSAgICAgIGlmIChTX0lTX0RFRklORUQgKHN5bSkpCi0JZnByaW50ZiAoZmlsZSwgIiBkZWZpbmVkIik7Ci0gICAgfQotICBmcHJpbnRmIChmaWxlLCAiICVzIiwgc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzeW0pKSk7Ci0gIGlmIChzeW1ib2xfcmVzb2x2ZWRfcCAoc3ltKSkKLSAgICB7Ci0gICAgICBzZWdUIHMgPSBTX0dFVF9TRUdNRU5UIChzeW0pOwotCi0gICAgICBpZiAocyAhPSB1bmRlZmluZWRfc2VjdGlvbgotICAgICAgICAgICYmIHMgIT0gZXhwcl9zZWN0aW9uKQotCWZwcmludGYgKGZpbGUsICIgJWx4IiwgKGxvbmcpIFNfR0VUX1ZBTFVFIChzeW0pKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGluZGVudF9sZXZlbCA8IG1heF9pbmRlbnRfbGV2ZWwKLQkgICAmJiBTX0dFVF9TRUdNRU5UIChzeW0pICE9IHVuZGVmaW5lZF9zZWN0aW9uKQotICAgIHsKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgZnByaW50ZiAoZmlsZSwgIlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBpZiAoTE9DQUxfU1lNQk9MX0NIRUNLIChzeW0pKQotCWZwcmludGYgKGZpbGUsICJjb25zdGFudCAlbHgiLAotCQkgKGxvbmcpICgoc3RydWN0IGxvY2FsX3N5bWJvbCAqKSBzeW0pLT5sc3lfb2Zmc2V0KTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCXByaW50X2V4cHJfMSAoZmlsZSwgJnN5bS0+c3lfdmFsdWUpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICAgIGluZGVudF9sZXZlbC0tOwotICAgIH0KLSAgZmZsdXNoIChmaWxlKTsKLX0KLQotdm9pZAotcHJpbnRfc3ltYm9sX3ZhbHVlIChzeW0pCi0gICAgIHN5bWJvbFMgKnN5bTsKLXsKLSAgaW5kZW50X2xldmVsID0gMDsKLSAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKHN0ZGVyciwgc3ltKTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2JpbmFyeSAoZmlsZSwgbmFtZSwgZXhwKQotICAgICBGSUxFICpmaWxlOwotICAgICBjb25zdCBjaGFyICogbmFtZTsKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgaW5kZW50X2xldmVsKys7Ci0gIGZwcmludGYgKGZpbGUsICIlc1xuJSpzPCIsIG5hbWUsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgZnByaW50ZiAoZmlsZSwgIj5cbiUqczwiLCBpbmRlbnRfbGV2ZWwgKiA0LCAiIik7Ci0gIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKLSAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgaW5kZW50X2xldmVsLS07Ci19Ci0KLXZvaWQKLXByaW50X2V4cHJfMSAoZmlsZSwgZXhwKQotICAgICBGSUxFICpmaWxlOwotICAgICBleHByZXNzaW9uUyAqZXhwOwotewotICBmcHJpbnRmIChmaWxlLCAiZXhwciAlbHggIiwgKGxvbmcpIGV4cCk7Ci0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9faWxsZWdhbDoKLSAgICAgIGZwcmludGYgKGZpbGUsICJpbGxlZ2FsIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYWJzZW50OgotICAgICAgZnByaW50ZiAoZmlsZSwgImFic2VudCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgZnByaW50ZiAoZmlsZSwgImNvbnN0YW50ICVseCIsIChsb25nKSBleHAtPlhfYWRkX251bWJlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fc3ltYm9sOgotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAic3ltYm9sXG4lKnM8IiwgaW5kZW50X2xldmVsICogNCwgIiIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKGZpbGUsIGV4cC0+WF9hZGRfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgbWF5YmVfcHJpbnRfYWRkbnVtOgotICAgICAgaWYgKGV4cC0+WF9hZGRfbnVtYmVyKQotCWZwcmludGYgKGZpbGUsICJcbiUqcyVseCIsIGluZGVudF9sZXZlbCAqIDQsICIiLAotCQkgKGxvbmcpIGV4cC0+WF9hZGRfbnVtYmVyKTsKLSAgICAgIGluZGVudF9sZXZlbC0tOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX3JlZ2lzdGVyOgotICAgICAgZnByaW50ZiAoZmlsZSwgInJlZ2lzdGVyICMlZCIsIChpbnQpIGV4cC0+WF9hZGRfbnVtYmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19iaWc6Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiYmlnIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fdW1pbnVzOgotICAgICAgZnByaW50ZiAoZmlsZSwgInVtaW51cyAtPCIpOwotICAgICAgaW5kZW50X2xldmVsKys7Ci0gICAgICBwcmludF9zeW1ib2xfdmFsdWVfMSAoZmlsZSwgZXhwLT5YX2FkZF9zeW1ib2wpOwotICAgICAgZnByaW50ZiAoZmlsZSwgIj4iKTsKLSAgICAgIGdvdG8gbWF5YmVfcHJpbnRfYWRkbnVtOwotICAgIGNhc2UgT19iaXRfbm90OgotICAgICAgZnByaW50ZiAoZmlsZSwgImJpdF9ub3QiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19tdWx0aXBseToKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgIm11bHRpcGx5IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19kaXZpZGU6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJkaXZpZGUiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX21vZHVsdXM6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJtb2R1bHVzIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19sZWZ0X3NoaWZ0OgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAibHNoaWZ0IiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19yaWdodF9zaGlmdDoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgInJzaGlmdCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fYml0X2luY2x1c2l2ZV9vcjoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImJpdF9pb3IiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2JpdF9leGNsdXNpdmVfb3I6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJiaXRfeG9yIiwgZXhwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT19iaXRfYW5kOgotICAgICAgcHJpbnRfYmluYXJ5IChmaWxlLCAiYml0X2FuZCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fZXE6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJlcSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbmU6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJuZSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbHQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsdCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbGU6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsZSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fZ2U6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJnZSIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fZ3Q6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJndCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbG9naWNhbF9hbmQ6Ci0gICAgICBwcmludF9iaW5hcnkgKGZpbGUsICJsb2dpY2FsX2FuZCIsIGV4cCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9fbG9naWNhbF9vcjoKLSAgICAgIHByaW50X2JpbmFyeSAoZmlsZSwgImxvZ2ljYWxfb3IiLCBleHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPX2FkZDoKLSAgICAgIGluZGVudF9sZXZlbCsrOwotICAgICAgZnByaW50ZiAoZmlsZSwgImFkZFxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgICBnb3RvIG1heWJlX3ByaW50X2FkZG51bTsKLSAgICBjYXNlIE9fc3VidHJhY3Q6Ci0gICAgICBpbmRlbnRfbGV2ZWwrKzsKLSAgICAgIGZwcmludGYgKGZpbGUsICJzdWJ0cmFjdFxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfYWRkX3N5bWJvbCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiPlxuJSpzPCIsIGluZGVudF9sZXZlbCAqIDQsICIiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChmaWxlLCBleHAtPlhfb3Bfc3ltYm9sKTsKLSAgICAgIGZwcmludGYgKGZpbGUsICI+Iik7Ci0gICAgICBnb3RvIG1heWJlX3ByaW50X2FkZG51bTsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoZmlsZSwgInt1bmtub3duIG9wY29kZSAlZH0iLCAoaW50KSBleHAtPlhfb3ApOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBmZmx1c2ggKHN0ZG91dCk7Ci19Ci0KLXZvaWQKLXByaW50X2V4cHIgKGV4cCkKLSAgICAgZXhwcmVzc2lvblMgKmV4cDsKLXsKLSAgcHJpbnRfZXhwcl8xIChzdGRlcnIsIGV4cCk7Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci19Ci0KLXZvaWQKLXN5bWJvbF9wcmludF9zdGF0aXN0aWNzIChmaWxlKQotICAgICBGSUxFICpmaWxlOwotewotICBoYXNoX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUsICJzeW1ib2wgdGFibGUiLCBzeV9oYXNoKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGhhc2hfcHJpbnRfc3RhdGlzdGljcyAoZmlsZSwgIm1pbmkgbG9jYWwgc3ltYm9sIHRhYmxlIiwgbG9jYWxfaGFzaCk7Ci0gIGZwcmludGYgKGZpbGUsICIlbHUgbWluaSBsb2NhbCBzeW1ib2xzIGNyZWF0ZWQsICVsdSBjb252ZXJ0ZWRcbiIsCi0JICAgbG9jYWxfc3ltYm9sX2NvdW50LCBsb2NhbF9zeW1ib2xfY29udmVyc2lvbl9jb3VudCk7Ci0jZW5kaWYKLX0KLQotLyogZW5kIG9mIHN5bWJvbHMuYyAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3N5bWJvbHMuaCBiL2dhcy9zeW1ib2xzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjczYWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3N5bWJvbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKiBzeW1ib2xzLmggLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MCwgOTIsIDkzLCA5NCwgOTUsIDk3LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLS8qIFRoZSBCRkQgY29kZSB3YW50cyB0byB3YWxrIHRoZSBsaXN0IGluIGJvdGggZGlyZWN0aW9ucy4gICovCi0jdW5kZWYgIFNZTUJPTFNfTkVFRF9CQUNLUE9JTlRFUlMKLSNkZWZpbmUgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotI2VuZGlmCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotLyogVGhlIG5vbi1CRkQgY29kZSBleHBlY3RzIHRvIGJlIGFibGUgdG8gbWFuaXB1bGF0ZSB0aGUgc3ltYm9sIGZpZWxkcwotICAgZGlyZWN0bHkuICAqLwotI2luY2x1ZGUgInN0cnVjLXN5bWJvbC5oIgotI2VuZGlmCi0KLWV4dGVybiBzdHJ1Y3Qgb2JzdGFjayBub3RlczsJLyogZWcgRml4UyBsaXZlIGhlcmUuICovCi0KLWV4dGVybiBzdHJ1Y3Qgb2JzdGFjayBjb25kX29ic3RhY2s7CS8qIHRoaXMgaXMgd2hlcmUgd2UgdHJhY2sgLmlmZGVmLy5lbmRpZgotCQkJCSAgICAgICAoaWYgd2UgZG8gdGhhdCBhdCBhbGwpLiAgKi8KLQotZXh0ZXJuIHN5bWJvbFMgKnN5bWJvbF9yb290UDsJLyogYWxsIHRoZSBzeW1ib2wgbm9kZXMgKi8KLWV4dGVybiBzeW1ib2xTICpzeW1ib2xfbGFzdFA7CS8qIGxhc3Qgc3RydWN0IHN5bWJvbCB3ZSBtYWRlLCBvciBOVUxMICovCi0KLWV4dGVybiBzeW1ib2xTIGFic19zeW1ib2w7Ci0KLWV4dGVybiBpbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLQotLyogVGhpcyBpcyBub24temVybyBpZiBzeW1ib2xzIGFyZSBjYXNlIHNlbnNpdGl2ZSwgd2hpY2ggaXMgdGhlCi0gICBkZWZhdWx0LiAgKi8KLWV4dGVybiBpbnQgc3ltYm9sc19jYXNlX3NlbnNpdGl2ZTsKLQotY2hhciAqZGVjb2RlX2xvY2FsX2xhYmVsX25hbWUgUEFSQU1TICgoY2hhciAqcykpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmQgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSkpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmRfYmFzZSBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lLCBpbnQgc3RyaXBfdW5kZXJzY29yZSkpOwotc3ltYm9sUyAqc3ltYm9sX2ZpbmRfb3JfbWFrZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1zeW1ib2xTICpzeW1ib2xfbWFrZSBQQVJBTVMgKChDT05TVCBjaGFyICpuYW1lKSk7Ci1zeW1ib2xTICpzeW1ib2xfbmV3IFBBUkFNUyAoKENPTlNUIGNoYXIgKm5hbWUsIHNlZ1Qgc2VnbWVudCwgdmFsdWVUIHZhbHVlLAotCQkJICAgICBmcmFnUyAqIGZyYWcpKTsKLXN5bWJvbFMgKnN5bWJvbF9jcmVhdGUgUEFSQU1TICgoQ09OU1QgY2hhciAqbmFtZSwgc2VnVCBzZWdtZW50LCB2YWx1ZVQgdmFsdWUsCi0JCQkJZnJhZ1MgKiBmcmFnKSk7Ci1zeW1ib2xTICpjb2xvbiBQQVJBTVMgKChjb25zdCBjaGFyICpzeW1fbmFtZSkpOwotdm9pZCBsb2NhbF9jb2xvbiBQQVJBTVMgKChpbnQgbikpOwotdm9pZCBzeW1ib2xfYmVnaW4gUEFSQU1TICgodm9pZCkpOwotdm9pZCBzeW1ib2xfcHJpbnRfc3RhdGlzdGljcyBQQVJBTVMgKChGSUxFICopKTsKLXZvaWQgc3ltYm9sX3RhYmxlX2luc2VydCBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOwotdmFsdWVUIHJlc29sdmVfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKHN5bWJvbFMgKiwgaW50KSk7Ci12b2lkIHJlc29sdmVfbG9jYWxfc3ltYm9sX3ZhbHVlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQgcHJpbnRfc3ltYm9sX3ZhbHVlIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotdm9pZCBwcmludF9leHByIFBBUkFNUyAoKGV4cHJlc3Npb25TICopKTsKLXZvaWQgcHJpbnRfZXhwcl8xIFBBUkFNUyAoKEZJTEUgKiwgZXhwcmVzc2lvblMgKikpOwotdm9pZCBwcmludF9zeW1ib2xfdmFsdWVfMSBQQVJBTVMgKChGSUxFICosIHN5bWJvbFMgKikpOwotCi1pbnQgZG9sbGFyX2xhYmVsX2RlZmluZWQgUEFSQU1TICgobG9uZyBsKSk7Ci12b2lkIGRvbGxhcl9sYWJlbF9jbGVhciBQQVJBTVMgKCh2b2lkKSk7Ci12b2lkIGRlZmluZV9kb2xsYXJfbGFiZWwgUEFSQU1TICgobG9uZyBsKSk7Ci1jaGFyICpkb2xsYXJfbGFiZWxfbmFtZSBQQVJBTVMgKChsb25nIGwsIGludCBhdWdlbmQpKTsKLQotdm9pZCBmYl9sYWJlbF9pbnN0YW5jZV9pbmMgUEFSQU1TICgobG9uZyBsYWJlbCkpOwotY2hhciAqZmJfbGFiZWxfbmFtZSBQQVJBTVMgKChsb25nIG4sIGxvbmcgYXVnZW5kKSk7Ci0KLWV4dGVybiB2b2lkIGNvcHlfc3ltYm9sX2F0dHJpYnV0ZXMgUEFSQU1TICgoc3ltYm9sUyAqLCBzeW1ib2xTICopKTsKLQotLyogR2V0IGFuZCBzZXQgdGhlIHZhbHVlcyBvZiBzeW1ib2xzLiAgVGhlc2UgdXNlZCB0byBiZSBtYWNyb3MuICAqLwotZXh0ZXJuIHZhbHVlVCBTX0dFVF9WQUxVRSBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIFNfU0VUX1ZBTFVFIFBBUkFNUyAoKHN5bWJvbFMgKiwgdmFsdWVUKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1leHRlcm4gaW50IFNfSVNfRlVOQ1RJT04gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfRVhURVJOQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfV0VBSyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19DT01NT04gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfREVGSU5FRCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19ERUJVRyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19MT0NBTCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBpbnQgU19JU19FWFRFUk4gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IFNfSVNfU1RBQkQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gQ09OU1QgY2hhciAqU19HRVRfTkFNRSBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiBzZWdUIFNfR0VUX1NFR01FTlQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9TRUdNRU5UIFBBUkFNUyAoKHN5bWJvbFMgKiwgc2VnVCkpOwotZXh0ZXJuIHZvaWQgU19TRVRfRVhURVJOQUwgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBTX1NFVF9OQU1FIFBBUkFNUyAoKHN5bWJvbFMgKiwgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBTX0NMRUFSX0VYVEVSTkFMIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgU19TRVRfV0VBSyBQQVJBTVMgKChzeW1ib2xTICopKTsKLSNlbmRpZgotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLXN0cnVjdCBicm9rZW5fd29yZAotICB7Ci0gICAgLyogTGlua2VkIGxpc3QgLS0gb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMgcGVyICIud29yZCB4LXkrQyIKLSAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKm5leHRfYnJva2VuX3dvcmQ7Ci0gICAgLyogU2VnbWVudCBhbmQgc3Vic2VnbWVudCBmb3IgYnJva2VuIHdvcmQuICAqLwotICAgIHNlZ1Qgc2VnOwotICAgIHN1YnNlZ1Qgc3Vic2VnOwotICAgIC8qIFdoaWNoIGZyYWcgaXMgdGhpcyBicm9rZW4gd29yZCBpbj8gICovCi0gICAgZnJhZ1MgKmZyYWc7Ci0gICAgLyogV2hlcmUgaW4gdGhlIGZyYWcgaXMgaXQ/ICAqLwotICAgIGNoYXIgKndvcmRfZ29lc19oZXJlOwotICAgIC8qIFdoZXJlIHRvIGFkZCB0aGUgYnJlYWsuICAqLwotICAgIGZyYWdTICpkaXNwZnJhZzsJCS8qIHdoZXJlIHRvIGFkZCB0aGUgYnJlYWsgKi8KLSAgICAvKiBPcGVyYW5kcyBvZiBleHByZXNzaW9uLiAgKi8KLSAgICBzeW1ib2xTICphZGQ7Ci0gICAgc3ltYm9sUyAqc3ViOwotICAgIG9mZnNldFQgYWRkbnVtOwotCi0gICAgaW50IGFkZGVkOwkJCS8qIG5hc3R5IHRoaW5nIGhhcHBlbmQgeWV0PyAqLwotICAgIC8qIDE6IGFkZGVkIGFuZCBoYXMgYSBsb25nLWp1bXAgKi8KLSAgICAvKiAyOiBhZGRlZCBidXQgdXNlcyBzb21lb25lIGVsc2VzIGxvbmctanVtcCAqLwotCi0gICAgLyogUG9pbnRlciB0byBicm9rZW5fd29yZCB3aXRoIGEgc2ltaWxhciBsb25nLWp1bXAuICAqLwotICAgIHN0cnVjdCBicm9rZW5fd29yZCAqdXNlX2p1bXA7Ci0gIH07Ci1leHRlcm4gc3RydWN0IGJyb2tlbl93b3JkICpicm9rZW5fd29yZHM7Ci0jZW5kaWYgLyogbmRlZiBXT1JLSU5HX0RPVF9XT1JEICovCi0KLS8qCi0gKiBDdXJyZW50IG1lYW5zIGZvciBnZXR0aW5nIGZyb20gc3ltYm9scyB0byBzZWdtZW50cyBhbmQgdmljZSB2ZXJzZS4KLSAqIFRoaXMgd2lsbCBjaGFuZ2UgZm9yIGluZmluaXRlLXNlZ21lbnRzIHN1cHBvcnQgKGUuZy4gQ09GRikuCi0gKi8KLWV4dGVybiBjb25zdCBzZWdUIE5fVFlQRV9zZWdbXTsJLyogc3Vic2VnLmMgKi8KLQotI2RlZmluZQlTRUdNRU5UX1RPX1NZTUJPTF9UWVBFKHNlZykgICggc2VnX05fVFlQRSBbKGludCkgKHNlZyldICkKLWV4dGVybiBjb25zdCBzaG9ydCBzZWdfTl9UWVBFW107Lyogc3Vic2VnLmMgKi8KLQotI2RlZmluZQlOX1JFR0lTVEVSCTMwCS8qIEZha2UgTl9UWVBFIHZhbHVlIGZvciBTRUdfUkVHSVNURVIgKi8KLQotdm9pZCBzeW1ib2xfY2xlYXJfbGlzdF9wb2ludGVycyBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCkpOwotCi0jaWZkZWYgU1lNQk9MU19ORUVEX0JBQ0tQT0lOVEVSUwotCi12b2lkIHN5bWJvbF9pbnNlcnQgUEFSQU1TICgoc3ltYm9sUyAqIGFkZG1lLCBzeW1ib2xTICogdGFyZ2V0LAotCQkJICAgIHN5bWJvbFMgKiogcm9vdFAsIHN5bWJvbFMgKiogbGFzdFApKTsKLXZvaWQgc3ltYm9sX3JlbW92ZSBQQVJBTVMgKChzeW1ib2xTICogc3ltYm9sUCwgc3ltYm9sUyAqKiByb290UCwKLQkJCSAgICBzeW1ib2xTICoqIGxhc3RQKSk7Ci0KLWV4dGVybiBzeW1ib2xTICpzeW1ib2xfcHJldmlvdXMgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci0KLSNlbmRpZiAvKiBTWU1CT0xTX05FRURfQkFDS1BPSU5URVJTICovCi0KLXZvaWQgdmVyaWZ5X3N5bWJvbF9jaGFpbiBQQVJBTVMgKChzeW1ib2xTICogcm9vdFAsIHN5bWJvbFMgKiBsYXN0UCkpOwotdm9pZCB2ZXJpZnlfc3ltYm9sX2NoYWluXzIgUEFSQU1TICgoc3ltYm9sUyAqIHN5bVApKTsKLQotdm9pZCBzeW1ib2xfYXBwZW5kIFBBUkFNUyAoKHN5bWJvbFMgKiBhZGRtZSwgc3ltYm9sUyAqIHRhcmdldCwKLQkJCSAgICBzeW1ib2xTICoqIHJvb3RQLCBzeW1ib2xTICoqIGxhc3RQKSk7Ci0KLWV4dGVybiBzeW1ib2xTICpzeW1ib2xfbmV4dCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotZXh0ZXJuIGV4cHJlc3Npb25TICpzeW1ib2xfZ2V0X3ZhbHVlX2V4cHJlc3Npb24gUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gdm9pZCBzeW1ib2xfc2V0X3ZhbHVlX2V4cHJlc3Npb24gUEFSQU1TICgoc3ltYm9sUyAqLAotCQkJCQkJIGNvbnN0IGV4cHJlc3Npb25TICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9zZXRfZnJhZyBQQVJBTVMgKChzeW1ib2xTICosIGZyYWdTICopKTsKLWV4dGVybiBmcmFnUyAqc3ltYm9sX2dldF9mcmFnIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfdXNlZCBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9jbGVhcl91c2VkIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfdXNlZF9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9jbGVhcl91c2VkX2luX3JlbG9jIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfbXJpX2NvbW1vbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9jbGVhcl9tcmlfY29tbW9uIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfbXJpX2NvbW1vbl9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfd3JpdHRlbiBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9jbGVhcl93cml0dGVuIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfd3JpdHRlbl9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIHZvaWQgc3ltYm9sX21hcmtfcmVzb2x2ZWQgUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci1leHRlcm4gaW50IHN5bWJvbF9yZXNvbHZlZF9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfc2VjdGlvbl9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfZXF1YXRlZF9wIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotZXh0ZXJuIGludCBzeW1ib2xfY29uc3RhbnRfcCBQQVJBTVMgKChzeW1ib2xTICopKTsKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBhc3ltYm9sICpzeW1ib2xfZ2V0X2JmZHN5bSBQQVJBTVMgKChzeW1ib2xTICopKTsKLWV4dGVybiB2b2lkIHN5bWJvbF9zZXRfYmZkc3ltIFBBUkFNUyAoKHN5bWJvbFMgKiwgYXN5bWJvbCAqKSk7Ci0jZW5kaWYKLQotI2lmZGVmIE9CSl9TWU1GSUVMRF9UWVBFCi1PQkpfU1lNRklFTERfVFlQRSAqc3ltYm9sX2dldF9vYmogUEFSQU1TICgoc3ltYm9sUyAqKSk7Ci12b2lkIHN5bWJvbF9zZXRfb2JqIFBBUkFNUyAoKHN5bWJvbFMgKiwgT0JKX1NZTUZJRUxEX1RZUEUgKikpOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19TWU1GSUVMRF9UWVBFCi1UQ19TWU1GSUVMRF9UWVBFICpzeW1ib2xfZ2V0X3RjIFBBUkFNUyAoKHN5bWJvbFMgKikpOwotdm9pZCBzeW1ib2xfc2V0X3RjIFBBUkFNUyAoKHN5bWJvbFMgKiwgVENfU1lNRklFTERfVFlQRSAqKSk7Ci0jZW5kaWYKLQotLyogZW5kIG9mIHN5bWJvbHMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3RjLmggYi9nYXMvdGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0MDQ2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKiB0Yy5oIC0gdGFyZ2V0IGNwdSBkZXBlbmRlbnQKLQotICAgQ29weXJpZ2h0IChDKSAxOTg3LCAxOTkwLCAxOTkxLCAxOTkyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEluIHRoZW9yeSAobWluZSwgYXQgbGVhc3QhKSB0aGUgbWFjaGluZSBkZXBlbmRlbnQgcGFydCBvZiB0aGUgYXNzZW1ibGVyCi0gICBzaG91bGQgb25seSBoYXZlIHRvIGluY2x1ZGUgb25lIGZpbGUuICBUaGlzIG9uZS4gIC0tIEpGICovCi0KLWV4dGVybiBjb25zdCBwc2V1ZG9fdHlwZVMgbWRfcHNldWRvX3RhYmxlW107Ci0KLS8qIEpGIG1vdmVkIHRoaXMgaGVyZSBmcm9tIGFzLmggdW5kZXIgdGhlIHRoZW9yeSB0aGF0IG5vYm9keSBleGNlcHQgTUFDSElORS5jCi0gICBhbmQgd3JpdGUuYyBjYXJlIGFib3V0IGl0IGFueXdheS4gKi8KLQotc3RydWN0IHJlbGF4X3R5cGUKLXsKLSAgLyogRm9yd2FyZCByZWFjaC4gU2lnbmVkIG51bWJlci4gPiAwLiAqLwotICBsb25nIHJseF9mb3J3YXJkOwotICAvKiBCYWNrd2FyZCByZWFjaC4gU2lnbmVkIG51bWJlci4gPCAwLiAqLwotICBsb25nIHJseF9iYWNrd2FyZDsKLQotICAvKiBCeXRlcyBsZW5ndGggb2YgdGhpcyBhZGRyZXNzLiAqLwotICB1bnNpZ25lZCBjaGFyIHJseF9sZW5ndGg7Ci0KLSAgLyogTmV4dCBsb25nZXIgcmVsYXgtc3RhdGUuICAwIG1lYW5zIHRoZXJlIGlzIG5vICduZXh0JyByZWxheC1zdGF0ZS4gKi8KLSAgcmVsYXhfc3Vic3RhdGVUIHJseF9tb3JlOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgcmVsYXhfdHlwZSByZWxheF90eXBlUzsKLQotZXh0ZXJuIGNvbnN0IGludCBtZF9yZWxvY19zaXplOwkvKiBTaXplIG9mIGEgcmVsb2NhdGlvbiByZWNvcmQgKi8KLQotY2hhciAqbWRfYXRvZiBQQVJBTVMgKChpbnQgd2hhdF9zdGF0ZW1lbnRfdHlwZSwgY2hhciAqbGl0ZXJhbFAsIGludCAqc2l6ZVApKTsKLSNpZm5kZWYgbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXgKLWludCBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCBQQVJBTVMgKChmcmFnUyAqIGZyYWdQLCBzZWdUIHNlZ21lbnQpKTsKLSNlbmRpZgotaW50IG1kX3BhcnNlX29wdGlvbiBQQVJBTVMgKChpbnQgYywgY2hhciAqYXJnKSk7Ci12b2lkIG1kX3Nob3dfdXNhZ2UgUEFSQU1TICgoRklMRSAqKSk7Ci1sb25nIG1kX3BjcmVsX2Zyb20gUEFSQU1TICgoZml4UyAqIGZpeFApKTsKLXNob3J0IHRjX2NvZmZfZml4MnJ0eXBlIFBBUkFNUyAoKGZpeFMgKiBmaXhQKSk7Ci12b2lkIG1kX2Fzc2VtYmxlIFBBUkFNUyAoKGNoYXIgKnN0cikpOwotdm9pZCBtZF9iZWdpbiBQQVJBTVMgKCh2b2lkKSk7Ci0jaWZuZGVmIG1kX2NyZWF0ZV9sb25nX2p1bXAKLXZvaWQgbWRfY3JlYXRlX2xvbmdfanVtcCBQQVJBTVMgKChjaGFyICpwdHIsIGFkZHJlc3NUIGZyb21fYWRkciwKLQkJCQkgIGFkZHJlc3NUIHRvX2FkZHIsIGZyYWdTICogZnJhZywKLQkJCQkgIHN5bWJvbFMgKiB0b19zeW1ib2wpKTsKLSNlbmRpZgotI2lmbmRlZiBtZF9jcmVhdGVfc2hvcnRfanVtcAotdm9pZCBtZF9jcmVhdGVfc2hvcnRfanVtcCBQQVJBTVMgKChjaGFyICpwdHIsIGFkZHJlc3NUIGZyb21fYWRkciwKLQkJCQkgICBhZGRyZXNzVCB0b19hZGRyLCBmcmFnUyAqIGZyYWcsCi0JCQkJICAgc3ltYm9sUyAqIHRvX3N5bWJvbCkpOwotI2VuZGlmCi12b2lkIG1kX251bWJlcl90b19jaGFycyBQQVJBTVMgKChjaGFyICpidWYsIHZhbHVlVCB2YWwsIGludCBuKSk7Ci0KLSNpZm5kZWYgbWRfb3BlcmFuZAotdm9pZCBtZF9vcGVyYW5kIFBBUkFNUyAoKGV4cHJlc3Npb25TICogZXhwcmVzc2lvblApKTsKLSNlbmRpZgotCi0jaWZkZWYgTURfQVBQTFlfRklYMwotaW50IG1kX2FwcGx5X2ZpeDMgUEFSQU1TICgoZml4UyAqIGZpeFAsIHZhbHVlVCAqdmFsLCBzZWdUIHNlZykpOwotI2VuZGlmCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotaW50IG1kX2FwcGx5X2ZpeCBQQVJBTVMgKChmaXhTICogZml4UCwgdmFsdWVUICp2YWwpKTsKLSNpZm5kZWYgbWRfY29udmVydF9mcmFnCi12b2lkIG1kX2NvbnZlcnRfZnJhZyBQQVJBTVMgKChiZmQgKiBoZWFkZXJzLCBzZWdUIHNlYywgZnJhZ1MgKiBmcmFnUCkpOwotI2VuZGlmCi0jaWZuZGVmIHRjX2hlYWRlcnNfaG9vawotdm9pZCB0Y19oZWFkZXJzX2hvb2sgUEFSQU1TICgoc2VnVCAqLCBmaXhTICopKTsKLSNlbmRpZgotI2lmbmRlZiBSRUxPQ19FWFBBTlNJT05fUE9TU0lCTEUKLWV4dGVybiBhcmVsZW50ICp0Y19nZW5fcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKiwgZml4UyAqKSk7Ci0jZWxzZQotZXh0ZXJuIGFyZWxlbnQgKip0Y19nZW5fcmVsb2MgUEFSQU1TICgoYXNlY3Rpb24gKiwgZml4UyAqKSk7Ci0jZW5kaWYKLSNlbHNlIC8qIG5vdCBCRkRfQVNTRU1CTEVSICovCi12b2lkIG1kX2FwcGx5X2ZpeCBQQVJBTVMgKChmaXhTICogZml4UCwgbG9uZyB2YWwpKTsKLSNpZm5kZWYgbWRfY29udmVydF9mcmFnCi12b2lkIG1kX2NvbnZlcnRfZnJhZyBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMsIHNlZ1QsIGZyYWdTICogZnJhZ1ApKTsKLSNlbmRpZgotCi0jaWZuZGVmIHRjX2NyYXdsX3N5bWJvbF9jaGFpbgotdm9pZCB0Y19jcmF3bF9zeW1ib2xfY2hhaW4gUEFSQU1TICgob2JqZWN0X2hlYWRlcnMgKiBoZWFkZXJzKSk7Ci0jZW5kaWYgLyogdGNfY3Jhd2xfc3ltYm9sX2NoYWluICovCi0KLSNpZm5kZWYgdGNfaGVhZGVyc19ob29rCi12b2lkIHRjX2hlYWRlcnNfaG9vayBQQVJBTVMgKChvYmplY3RfaGVhZGVycyAqIGhlYWRlcnMpKTsKLSNlbmRpZiAvKiB0Y19oZWFkZXJzX2hvb2sgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZm5kZWYgbWRfc2VjdGlvbl9hbGlnbgotdmFsdWVUIG1kX3NlY3Rpb25fYWxpZ24gUEFSQU1TICgoc2VnVCBzZWcsIHZhbHVlVCBzaXplKSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBtZF91bmRlZmluZWRfc3ltYm9sCi1zeW1ib2xTICptZF91bmRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKGNoYXIgKm5hbWUpKTsKLSNlbmRpZgotCi0vKiBlbmQgb2YgdGMuaCAqLwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cgYi9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4Yzc4Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDI0MjEgKzAsMCBAQAotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGdhcy9pMzg2L2thdG1haS5kOiBUd2VhayBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi0xOTk5LTA2LTEyICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ2FzL2VsZi9lbGYuZXhwOiBEb24ndCBydW4gdGVzdHMgb24gIiotKi1saW51eCphb3V0KiIgb3IKLQkiKi0qLWxpbnV4Km9sZGxkKiIuCi0JKiBnYXMvdnRhYmxlL3Z0YWJsZS5leHA6IExpa2V3aXNlLgotCSogZ2FzL2kzODYvcmVsb2MuZDogTW9kaWZ5IGV4cGVjdGVkIHJlbG9jIG5hbWVzIHRvIGFjY2VwdCBhLm91dAotCW5hbWVzLgotCi0JKiBnYXMvaTM4Ni9hbWQuczogQWRkIGEgc3ltYm9sIHNvIGEub3V0IHRlc3RzIHdpbGwgd29yay4KLQkqIGdhcy9pMzg2L2thdG1haS5zOiBMaWtld2lzZS4KLQkqIGdhcy9pMzg2L2FtZC5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQkqIGdhcy9pMzg2L2thdG1haS5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotMTk5OS0wNi0xMCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGdhcy9taXBzL3N5bmMuZDogUGFzcyAtbWlwczIgdG8gdGhlIGFzc2VtYmxlci4KLQotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MuczogVHdlYWsgY29kZSBzbyB0aGF0IHRoZSB0ZXN0cyBwYXNzIGZvcgotCW1pcHMtZWxmIHRhcmdldCBhcyB3ZWxsIGFzIG1pcHM2NC1lbGYgdGFyZ2V0LgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzMi5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzMy5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL2VsZl9lX2ZsYWdzNC5kOiBMaWtld2lzZS4KLQotCSogZ2FzL2VsZi9lbGYuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIG1pcHMqLSotKi4KLQotCSogZ2FzL2FsbC9pdGJsLXRlc3QuYyAobWFpbik6IFVwZGF0ZSBpdGJsX2dldF9yZWdfdmFsIGNhbGwgZm9yIG5ldwotCXBhcmFtZXRlci4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBnYXMvc3BhcmMvc3ludGg2NC5zOiBBZGQgY2hlY2tzIGZvciBzaW5nbGUgcmVnaXN0ZXIgc2lnbngvY2xydXcuCi0JKiBnYXMvc3BhcmMvc2V0NjQuczogQWRkIHRlc3RzIGZvciBzZXR1dyBhbmQgc2V0c3cgc3ludGhldGljIGluc25zLgotCSogZ2FzL3NwYXJjL3ByZWZldGNoLmQ6IEFkZCAtNjQgYXMgc3dpdGNoLgotCSogZ2FzL3NwYXJjL3JkcHIuZDogRGl0dG8uCi0JKiBnYXMvc3BhcmMvd3Jwci5kOiBEaXR0by4KLQkqIGdhcy9zcGFyYy9zeW50aDY0LmQ6IERpdHRvLCByZWZsZWN0IHN5bnRoNjQucyBjaGFuZ2VzLgotCSogZ2FzL3NwYXJjL3JlbG9jNjQuZDogQWRkIC02NCBhcyBzd2l0Y2gsIGJlIG1vcmUgdG9sZXJhbnQsIGFzCi0JY3VycmVudCBnYXMgb3V0cHV0cyAlaGkoMCkgYW5kIG5vdCAlaGkoMHgwKS4KLQkqIGdhcy9zcGFyYy9zZXQ2NC5kOiBBZGQgLTY0IGFzIHN3aXRjaCwgcmVmbGVjdCBzZXQ2NC5zIGNoYW5nZXMgYW5kCi0Jb3B0aW1pemF0aW9ucyBmb3Igc2V0eCBpbnN0cnVjdGlvbi4KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IERvIHNwYXJjNjQqLSotKiBjaGVja3MgaWYgaXQgaXMgYW55IG9mIHRoZQotCWNvbXBpbGVkLWluIHRhcmdldHMuCi0KLTE5OTktMDYtMTAgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tYWNyb3MvaXJwLnM6IFVzZSBgZm9vJyBhbmQgYGJhcicgaW5zdGVhZCBvZiBgcicgYW5kIGBzJy4KLQkqIGdhcy9tYWNyb3MvcmVwdC5zLCBnYXMvbWFjcm9zL3Rlc3QyLnMsIGdhcy9tYWNyb3MvdGVzdDMuczogTGlrZXdpc2UuCi0JKiBnYXMvbWFjcm9zL3tpcnAscmVwdCx0ZXN0Mix0ZXN0M30uZDogVXBkYXRlLgotCi0xOTk5LTA2LTA1ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvZWxmL2VsZi5leHA6IE5ldyBkaXJlY3RvcnkuCi0JKiBnYXMvZWxmL3NlY3Rpb24wLltzZF06IE5ldyB0ZXN0LgotCSogZ2FzL2VsZi9zZWN0aW9uMS5bc2RdOiBOZXcgdGVzdC4KLQotMTk5OS0wNi0wMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogZ2FzL2FybS9hcm03dC5kLCBnYXMvYXJtL2luc3QuZDogVXBkYXRlIHRvIG1hdGNoIGN1cnJlbnQgZ2FzLAotIAliZmQgYW5kIG9wY29kZXMuCi0KLTE5OTktMDUtMjggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBnYXMvdnRhYmxlL3Z0YWJsZS5leHA6IERvbid0IHJ1biB0ZXN0IGZvciBpOTYwIHlldC4KLQotMTk5OS0wNS0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21jb3JlL2FsbGluc24uZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3Qgb2JqZHVtcCBvdXRwdXQuCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvb3Bjb2RlLmQ6IE1vZGlmeSBjYWxsdyB0byBzdWl0IGRpc2FzbSBmaXguCi0KLQkqIGdhcy9pMzg2L2FtZC5kOiBNb2RpZnkgYSAnKGJhZCknIHRvIFNJTUQgaW5zdHJ1Y3Rpb24uCi0KLQkqIGdhcy9pMzg2L2FtZC5zOiBQYWQgdG8gbXVsdGlwbGUgb2YgOAotCSogZ2FzL2kzODYvYW1kLmQ6IEhlcmUgdG9vLgotCi0JKiBnYXMvaTM4Ni9wcmVmaXguW3NkXTogQWxpZ24gd2l0aCBub3BzCi0JKiBnYXMvaTM4Ni9yZWxvYy5bc2RdOiBIZXJlIHRvby4KLQotCSogZ2FzL2kzODYva2F0bWFpLltzZF06IE5ldyBmb3IgUElJSSBTSU1ECi0JKiBnYXMvaTM4Ni9pMzg2LmV4cDogQ2FsbCBpdC4KLQotMTk5OS0wNS0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21jb3JlL2FsbGluc24uZDogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIKLQlvcGVyYXRpb25zLiAKLQotMTk5OS0wNC0xNiAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9pMzg2L2FtZC5zOiBBZGQgTk9QcyB0byBhbGlnbiBmb3IgY29mZiB0YXJnZXRzCi0JKiBnYXMvaTM4Ni9hbWQuZDogYW5kIGNoZWNrIGZvciB0aGVtLgotCi1UaHUgQXByIDE1IDE1OjAzOjQzIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwIChkb19jb3BybWVtKTogTm8gbG9uZ2VyIGV4cGVjdGVkIHRvIGZpbGUuCi0KLVdlZCBBcHIgMTQgMTM6NDM6MDYgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaHBwYS9iYXNpYy9icmFuY2guczogRG8gbm90IHVzZSBpbW1lZGlhdGUgdmFsdWUgd2hlcmUgd2UKLQlyZWFsbHkgd2FudCBhIHJlZ2lzdGVyLgotCSogZ2FzL2hwcGEvYmFzaWMvY29wcm1lbS5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL2Jhc2ljL2NvcHJtZW0uczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9iYXNpYy9zcG9wLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvYmFzaWMvaW1lbS5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9wYXJzZS9jYWxsZGF0YWJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcGFyc2UvZXhwcmJ1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2ZpeHVwN2J1Zy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3BhcnNlL2xhYmVsYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9sYWJlbG9wYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvbG9uZ2NhbGwuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9wbGFiZWxidWcuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UuczogTGlrZXdpc2UuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWR1Y2UyLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zOiBMaWtld2lzZS4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2JybGVuYnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnM6IExpa2V3aXNlLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvbGFzYmVsZGlmZnMuczogTGlrZXdpc2UuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCAoZG9faW1lbSk6IEhhbmRsZSBtdWx0aXBsZSBlbmNvZGluZ3MKLQlmb3IgbG9hZHMgYW5kIHN0b3JlcyB1c2luZyByZWcgKyBzbWFsbCBkIGFkZHJlc3Nlcy4KLQlObyBsb25nZXIgZXhwZWN0IGZhaWx1cmUgZm9yIG1pcy1wYXJzZSBvZiBpbW0gJXJlZy4KLQotMTk5OS0wNC0xMyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9tMzJyeC5kIChjbXB1X19yYWNoKTogRml4IGV4cGVjdGVkIG91dHB1dC4KLQkqIGdhcy9tMzJyL20zMnJ4LnMgKGJjX19hZGQsYWRkX19iYyk6IEV4cGxpY2l0bHkgc3BlY2lmeSBzaG9ydCBicmFuY2gKLQlzbyBicmFuY2ggcmVsYXhhdGlvbiByZXN0cmljdGlvbnMgd29uJ3QgaW50ZXJmZXJlIHdpdGggcGFyYWxsZWxpemF0aW9uCi0JYXR0ZW1wdHMuCi0KLTE5OTktMDQtMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tY29yZTogTmV3IERpcmVjdG9yeS4KLQkqIGdhcy9tY29yZS9hbGxpbnNuLmV4cDogTmV3IEZpbGU6IEV4cGVjdCBmaWxlIGZvciBNQ29yZSBhc3NlbWJseQotCXRlc3RzLgotCSogZ2FzL21jb3JlL2FsbGluc24uczogTmV3IEZpbGU6IFNvdXJjZSBmaWxlIGZvciBNQ29yZSBhc3NlbWJseQotCXRlc3RzLgotCSogZ2FzL21jb3JlL2FsbGluc24uZDogTmV3IEZpbGU6IEV4cGVjdGVkIG91dHB1dCBmaWxlIGZvciBNQ29yZQotCWFzc2VtYmx5IHRlc3RzLgotCi0xOTk5LTAzLTIwICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL20zMnJ4LltzZF06IEZpeCBhIGZldyBtb3JlIHRlc3RjYXNlcy4KLQotMTk5OS0wMy0xNiAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2QzMC5leHAgKHJ1bl9saXN0X3Rlc3QpOiBBZGQgbmV3IHRlc3RzLAotICAgICAgICBsYWJlbCwgZ3VhcmQtZGVidWcsIHNlcmlhbCwgd2Fybl9vZGRyZWcsIGJpdHRlc3QsIGFuZCBtdWwuCi0KLQkqIGdhcy9kMzB2L29wdC5zOiBGaXggc29tZSB3YXJuaW5ncyBhbmQgYWRkIGEgZmV3IGxhYmVscwotICAgICAgICB0byBrZWVwIHRoaW5ncyBmcm9tIHBhcmFsbGVsaXppbmcgd2hlcmUgd2UgZG9uJ3Qgd2FudCB0aGVtIHRvLgotCi0JKiBnYXMvZDMwdi9yZWxvYy5zOiBGaXggd2FybmluZy4KLSAgICAgICAgCi0JKiBnYXMvZDMwdi9vcHQuZCwgcmVsb2MuZCwgaW5zdC5kOiBSZWJ1aWxkLgotCi0JKiBnYXMvZDMwdi9sYWJlbC5zOiBOZXcgdGVzdC4gQ2hlY2sgdGhhdCBsYWJlbHMgYXJlIGFsaWduZWQgCi0gICAgICAgIG9uIDgtYnl0ZSBib3VuZGFyaWVzLgotCi0JKiBnYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zOiBOZXcgdGVzdC4gVGVzdCBvdXRwdXQgd2l0aCAiLWciLgotCi0JKiBnYXMvZDMwdi9zZXJpYWwuczogTmV3IHRlc3QuIENoZWNrIGZvciB3YXJuaW5ncyB3aXRoIAotICAgICAgICBpbGxlZ2FsIHNlcmlhbCBpbnN0cnVjdGlvbnMuCi0KLQkqIGdhcy9kMzB2L3dhcm5fb2RkcmVnLnM6IE5ldyB0ZXN0LiBDSGVjayBmb3Igd2FybmluZ3Mgd2hlbgotICAgICAgICBvZGQtbnVtYmVyZWQgcmVnaXN0ZXJzIGFyZSB1c2VkIGZvciBzb21lIGluc3RydWN0aW9ucy4KLQotCSogZ2FzL2QzMHYvYml0dGVzdC5zOiBOZXcgdGVzdC4gQ2hlY2sgZm9yIGJpdCBvcGVyYXRpb24gCi0gICAgICAgIGluc3RydWN0aW9ucyAoQkNMUiwgQk5PVCwgQlNFVCwgQlRTVCkgaW4gdGhlIElVLgotCi0JKiBnYXMvZDMwdi9tdWwuczogTmV3IHRlc3QuIENoZWNrIGZvciByZXN0cmljdGVkIHNlcXVlbmNlcwotICAgICAgICBpbiBhIGJ1bmNoIG9mIGRpZmZlcmVudCBtdWx0aXBseSBpbnN0cnVjdGlvbnMuCi0JCi0JKiBnYXMvdnRhYmxlL3Z0YWJsZS5leHAgKHJ1bl9saXN0X3Rlc3QpOiBEb24ndAotCXJ1biB0ZXN0IG9uIEQzMFYuCi0KLTE5OTktMDMtMDUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRXhwZWN0IHN0cm9uZ2FybS1jb2ZmIHRhcmdldCB0byBmYWlsIGNvZmZ0YWcKLQl0ZXN0LiAKLQotMTk5OS0wMi0xMyAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIHRoZSBuZXcgdGVzdHMsIGJlbG93LgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MxLmQsIGdhcy9taXBzL2VsZl9lX2ZsYWdzMi5kLAotCWdhcy9taXBzL2VsZl9lX2ZsYWdzMy5kLCBnYXMvbWlwcy9lbGZfZV9mbGFnczQuZDogTmV3IGZpbGVzLgotCSogZ2FzL21pcHMvZWxmX2VfZmxhZ3MuYywgZ2FzL21pcHMvZWxmX2VfZmxhZ3MuczogTmV3IGZpbGVzLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogRG9jdW1lbnQuICBJdCdzIG5vdAotIAlyZWFsbHkgdHJpdmlhbC4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IENsZWFuIHVwIGxvZ2ljIGZvciBndWVzc2luZwotCSRwcm9ncmFtICh0aGUgZHVtcCB0b29sKS4KLQotMTk5OS0wMi0xMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLmQ6IFByZWZpeCBhbGwgfCB3aXRoIFwuCi0JKHB1c2gscG9wKTogRml4IGV4cGVjdGVkIG91dHB1dC4KLQkqIGdhcy9tMzJyL3JlbGF4LTEuZDogRW1pdHRlZCBub3BzIGFyZSBzZXJpYWwsIG5vdCBwYXJhbGxlbC4KLQkqIGdhcy9tMzJyL2ZzbG90LmQ6IFByZWZpeCBhbGwgfCB3aXRoIFwuCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy92dGFibGUvaW5oZXJpdDAuczogRG8gbm90IHVzZSAnQCcgcHJlZml4IHRvIC50eXBlIG9wZXJhdG9yLgotCVNvbWUgcG9ydHMgdXNlIGl0IGFzIGEgY29tbWVudCBpbml0aWF0b3IuCi0KLQkqIGdhcy92dGFibGUvZW50cnkxLmQ6IERvIG5vdCBsb29rIGZvciBhbiBhZGRlbmQuICBTb21lIHBvcnRzIHVzZQotCVJFTCByZWxvY2F0aW9ucyBhbmQgc28gZG8gbm90IGhhdmUgb25lLgotCi0xOTk4LTEyLTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IEZpeCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIHN5bnRheC4KLQkqIGdhcy9mcjMwL2FsbGluc24uZDogRml4IHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0Ci0KLTE5OTgtMTItMDMgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQotMTk5OC0xMi0wMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBSZXBsYWNlIGlsbGVnYWwgaW5zbnMgd2l0aCBsZWdhbCB2ZXJzaW9ucy4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5kOiBVcGRhdGUgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0KLVRodSBOb3YgMTkgMTU6NTk6NTEgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IFJlb3JkZXIgaW5zbnMgZm9yIGJldHRlciBzaW11bGF0aW9uLgotCi1UaHUgTm92IDE5IDA3OjUwOjQ0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9zeW5jLltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gaXQuCi0KLVdlZCBOb3YgMTggMTE6Mjc6NTYgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnMgKGRtb3YpOiBDb3JyZWN0IGhleCBsaXRlcmFscy4KLQotVHVlIE5vdiAxNyAxNToyNDoyMCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IE1vdmVkIGN1cnJlbnRseSB1bi1hc3NlbWJsaWFibGUgaW5zdHJ1Y3Rpb25zCi0JdG8gZW5kIG9mIGZpbGUuCi0KLQkqIGdhcy9mcjMwL2FsbGluc24uZDogQWRkZWQgZGlzYXNzZW1ibHkgb2YgY3VycmVudGx5IGFzc2VtYmxpYWJsZQotCW9wY29kZXMuCi0KLU1vbiBOb3YgMTYgMTY6NTA6MjcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2ZyMzAvYWxsaW5zbi5zOiBGaXggc3ludGF4IGVycm9ycy4KLQotTW9uIE5vdiAxNiAxOToyNzo1MiAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogRml4ZWQgbW9yZSB0eXBvcy4KLQotRnJpIE5vdiAxMyAxMzoxNTowMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvZnIzMC9hbGxpbnNuLnM6IEZpeGVkIHR5cG9zIGFuZCBhZGRlZCBzb21lIHRlc3RzIG9mIHVwcGVyCi0JY2FzZSB2cyBsb3dlciBjYXNlLgotCi1UdWUgTm92IDEwIDE0OjU0OjQ3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9mcjMwL2FsbGluc24uczogTmV3IGZpbGUuCi0JKiBnYXMvZnIzMC9hbGxpbnNuLmQ6IE5ldyBmaWxlLgotCSogZ2FzL2ZyMzAvYWxsaW5zbi5leHA6IE5ldyBmaWxlLgotCSogZ2FzL2ZyMzAvZnIzMC5leHA6IE5ldyBmaWxlLgotCi1Nb24gTm92ICAyIDIwOjE2OjUwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2ZzbG90LltzZF06IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9tMzJyL20zMnIuZXhwOiBSdW4gaXQuCi0KLVR1ZSBPY3QgMjAgMTE6MzU6MDYgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBnYXMvaTM4Ni9pMzg2LmV4cDogUnVuIEFNRCBpbnNuIHRlc3QuCi0JKiBnYXMvaTM4Ni9hbWQuczogTmV3IHRlc3QuCi0JKiBnYXMvaTM4Ni9hbWQuZDogTmV3IHRlc3QgcmVzdWx0cy4KLQotU3VuIFNlcCAyMCAwMTowMDowMSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogZ2FzL3Z0YWJsZS9pbmhlcml0MS5sOiBSZXF1aXJlIG9ubHkgdGhlIHdvcmQgR0FTIHNvbWV3ZXJlIGluIHRoZQotCWZpcnN0IGxpbmUgb2YgdGhlIGxpc3RpbmcuCi0KLVR1ZSBTZXAgIDEgMTA6MjA6MDMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3BwYy9hc3Rlc3QuZDogQWRqdXN0IHJlZ2V4cHMgdG8gbWF0Y2ggYSA2NC1iaXQgaG9zdC4KLQkqIGdhcy9wcGMvYXN0ZXN0Mi5kOiBMaWtld2lzZS4KLQotTW9uIEF1ZyAzMSAxMzoyNTowNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBnYXMvdnRhYmxlL3tlbnRyeTAuZCxlbnRyeTEuZCxpbmhlcml0MC5kfTogRml4IHBhdHRlcm4gbWF0Y2hpbmcKLQlvZiB3aGl0ZXNwYWNlIGZvciA2NC1iaXQgaG9zdHMuCi0KLU1vbiBBdWcgMzEgMTI6NDU6NDkgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3Z0YWJsZS92dGFibGUuZXhwOiBOZXcuCi0JKiBnYXMvdnRhYmxlL3tlbnRyeTAucyxlbnRyeTAuZH06IE5ldy4KLQkqIGdhcy92dGFibGUve2VudHJ5MS5zLGVudHJ5MS5kfTogTmV3LgotCSogZ2FzL3Z0YWJsZS97aW5oZXJpdDAucyxpbmhlcml0MC5kfTogTmV3LgotCSogZ2FzL3Z0YWJsZS97aW5oZXJpdDEucyxpbmhlcml0MS5sfTogTmV3LgotCi1UaHUgQXVnIDIwIDIzOjE4OjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2kzODYvd2hpdGUubDogUmV2ZXJ0IHBhdGNoIG9mIEF1Z3VzdCAxMi4KLQotV2VkIEF1ZyAxMiAxMTo1NDozNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL3VkZi5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogUnVuIGl0LgotCi1XZWQgQXVnIDEyIDEzOjI1OjM4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvZ2VuZXJhbC5sOiBUZXN0IGFuZGIgJH4weDgwLGZvby4KLQkqIGdhcy9pMzg2L2dlbmVyYWwuczogVXBkYXRlLgotCi0JKiBnYXMvaTM4Ni93aGl0ZS5sOiBFeHBlY3Qgd2FybmluZyBmb3Igc3RhbmQtYWxvbmUgc3MgcHJlZml4LgotCi1UdWUgSnVsIDIxIDEyOjQ2OjU5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvd2hpdGUuczogQWRkIHNvbWUgbW9yZSB3aGl0ZXNwYWNlIHRlc3RzLgotCSogZ2FzL2kzODYvd2hpdGUubDogVXBkYXRlIGFjY29yZGluZ2x5LgotCi1Nb24gSnVsIDEzIDE4OjE1OjExIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogZ2FzL2kzODYvKjogQWxsIG5ldyBpMzg2IHRlc3RzdWl0ZS4KLQotMTk5OC0wNy0wMiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc19pbml0KTogQ29tcGxhaW4gaWYgdGFyZ2V0IG5hbWUgaXNuJ3QgaW4KLQljYW5vbmljYWwgZm9ybS4KLQotV2VkIEp1bCAgMSAxNTozNTowOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IEV4cGVjdCBBUk0gYW5kIFRodW1iIGNvZmZ0YWcgdGVzdCB0byBmYWlsLgotCi1XZWQgSnVsICAxIDE3OjMxOjM5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL3BwYy9zaW1wc2hmdC5zOiBBZGQgYWxpZ25tZW50IHNvIHRoYXQgaXQgd29ya3Mgb24gQUlYLgotCSogZ2FzL3BwYy9zaW1wc2hmdC5kOiBDaGFuZ2UgYWNjb3JkaW5nbHkuICBPbmx5IGR1bXAgdGhlIC50ZXh0Ci0Jc2VjdGlvbi4KLQotVHVlIEp1biAyMyAxNToxNDo0MyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvdjg1MC9oaWxvMi5zOiBVc2UgcjEgYXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBtb3ZlYQotCWluc3RydWN0aW9uLCBzaW5jZSByMCBpcyByZWFkIG9ubHkuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cDogRml4IG5hbWVzIG9mIHNwZWNpYWwgYXJlYSByZWxvY2F0aW9ucy4KLQlTZXQgLW13YXJuLXNpZ25lZC1vdmVyZmxvdyBmbGFnIHdoZW4gcnVubmluZyByYW5nZS5zIHRlc3QuCi0KLVN1biBKdW4gMjEgMTI6NDQ6NDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvcmVsb2MuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIG91dHB1dC4KLQotV2VkIEp1biAxNyAxNDowMjoxMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9kZWxheS5kOiBBZGQgLW1jcHU9Tk5OTiB0byBnYXMgZmxhZ3MgdG8gbGV0IHRlc3QgY2FzZQotIAlydW4gb24gZGlmZmVyZW50bHkgdGFyZ2V0ZWQgYXNzZW1ibGVyLgotCSogZ2FzL21pcHMve2xkLWlsb2Nrcy1hZGRyMzIsbGQtc3ZyNHBpYy5kfTogRGl0dG8uCi0JKiBnYXMvbWlwcy97bGQteGdvdC5kLGxpZi1zdnI0cGljLmQsbGlmLXhnb3QuZH06IFNhbWUuCi0JKiBnYXMvbWlwcy97bWlwczE2LmQsbWlwczQuZCxub2RlbGF5LmR9OiBBZ2Fpbi4KLQkqIGdhcy9taXBzL3t0cnVuYy5kLHVsZC5kLHVsaC14Z290LmQsdXNkLmR9OiBBbmQgdGhlbiBzb21lLgotCQotCSogZ2FzL21pcHMvbGQtaWxvY2tzLmQ6IFJlbW92ZWQgZGlzYXNzZW1ibGVyIGZsYWdzIHRvIGxldCB0YXJnZXQKLSAJZGVmYXVsdHMgZ28gdW5tb2RpZmllZC4gIFJlcGxhY2VkICRmNC8kZjUgd2l0aCAkZnBbNDVdLCBhcyB0aGUKLQlvcmlnaW5hbCBgbGQuZCcgaGFkLiAgRmluZCBgbGQucycuCi0JKiBnYXMvbWlwcy9tdWwtaWxvY2tzLmQ6IE5lYXJseSBkaXR0by4KLQkKLVRodSBKdW4gMTEgMTY6NTA6NDYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvaW5zdC5kOiBFeHBlY3QgcmVwZWF0aSBpbnN0cnVjaXRvbnMgdG8gYmUgY29tYmluZWQuCi0KLQkqIGdhcy9kMzB2L2luc3QuczogQWRkIG5vcCB0byBrZWVwIGFzc2VtYmxlZCBpbnN0cnVjdGlvbnMgYXQKLQlleHBlY3RlZCBhZGRyZXNzZXMuCi0KLU1vbiBKdW4gIDggMTg6NDc6MTEgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYvYXJyYXkuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyIHJlc3VsdHMuCi0JKiBnYXMvZDMwdi9yZWxvYy5kOiBQYXJ0aWFsbHkgdXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgYXNzZW1ibGVyCi0JcmVzdWx0cy4gCi0KLUZyaSBKdW4gIDUgMTk6MTU6NTkgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGdhcy9tNjhrL29wZXJhbmRzLnM6IEZvciBhbGwgcGMgcmVsYXRpdmUgYWRkcmVzc2VzIGNoYW5nZSB0c3RsCi0JdG8gcGVhIHNpbmNlIHRoZSBmb3JtZXIgZG9lcyBub3QgYWxsb3cgcGNyZWwgb24gbTY4MDAwLiAgRG8gbm90Ci0JbWFrZSBsYWJlbCBmb28gZ2xvYmFsLCBzbyB0aGF0IHJlZmVyZW5jZXMgdG8gaXQgY2FuIGJlIHJlbGF4ZWQgb24KLQlFTEYgdGFyZ2V0cy4KLQkqIGdhcy9tNjhrL29wZXJhbmRzLmQsIGdhcy9tNjhrL29wNjgwMDAuZDogVXBkYXRlZC4KLQotVHVlIEp1biAgMiAxNTowODozNiAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBnYXMvcHBjL3BwYy5leHA6IFJ1biBzaW1wc2hmdCB0ZXN0LgotCSogZ2FzL3BwYy9zaW1wc2hmdC5kOiBOZXcgZmlsZS4KLQkqIGdhcy9wcGMvc2ltcHNoZnQuczogTmV3IGZpbGUuCi0KLU1vbiBKdW4gIDEgMTc6MDA6MjIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy9kaXYtaWxvY2tzLmQ6IEhhbmRsZSBib3RoICJicmVhayIgaW5zdHJ1Y3Rpb24gdmFyaWFudHMuCi0JKiBnYXMvbWlwcy97ZGl2LmQsIG11bC1pbG9ja3MuZCwgbXVsLmR9OiBMaWtld2lzZS4KLQkKLUZyaSBNYXkgMjkgMTI6MDc6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogQWRqdXN0IGlsb2NrcyBpbml0aWFsaXphdGlvbiB0byBtYXRjaCBjdXJyZW50Ci0JYXNzZW1ibGVyIGRlZmF1bHRzIG1vcmUgY2xvc2VseS4KLQotCSogZ2FzL3NoL2ZwLnM6IFJlbW92ZSBmdHN0L25hbi4gIFRoZSBhc3NlbWJsZXIgbm8gbG9uZ2VyIHN1cHBvcnRzCi0JdGhlIGluc3RydWN0aW9uLgotCSogZ2FzL3NoL2Jhc2ljLmV4cDogQWRqdXN0IGFjY29yZGluZ2x5LgotCi1XZWQgTWF5IDI3IDE1OjI2OjUxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2FsaWduLmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0JKiBnYXMvZDMwdi9pbnN0LmQ6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBvdXRwdXQuCi0JKiBnYXMvZDMwdi9pbnN0LnM6IFVwZGF0ZWQgdG8gbWF0Y2ggbGF0ZXN0IGFzc2VtYmxlciBydWxlcy4KLQkqIGdhcy9kMzB2L29wdC5kOiBVcGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCi1GcmkgTWF5IDIyIDE1OjU2OjUxIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24uZDogSGFuZGxlIDY0IGJpdCBiZmRfdm1hLgotCSogZ2FzL20zMnIvdXBwZXJjYXNlLmQ6IExpa2V3aXNlLgotCi1UaHUgTWF5IDIxIDE1OjAzOjA2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vdGh1bWIuczogQWRkIHBlcmlvZCB0byBzdGFydCBvZiBsYWJlbHMgdG8gcHJldmVudAotCWFzc2VtYmxlciB0aGlua2luZyB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uIGVudHJ5IHBvaW50cy4KLQotVHVlIE1heSAxOSAxODoxNzoxMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMxNi5kOiBDb3JyZWN0IHRvIHJlZmxlY3QgYnVnIGZpeCB0byBkaXNhc3NlbWJsZXIuCi0KLU1vbiBNYXkgMTggMTM6MTE6NDUgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMve2RpdixsZCxtdWx9LmQ6IEFkZCBhc3NlbWJsZXIgLW1jcHU9IGZsYWcgdG8gbWF0Y2gKLSAJZGlzYXNzZW1ibGVyLgotCQotRnJpIE1heSAxNSAxNDo1MTowMSAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IERpc3Rpbmd1aXNoIGNoYWlucyB3aXRoIDMyLWJpdCBhZGRyZXNzZXMuCi0JKiBnYXMvbWlwcy9sZC1pbG9ja3MtYWRkcjMyLmQgOiBOZXcuCi0KLVdlZCBNYXkgMTMgMTU6MDY6MzEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvdXBwZXJjYXNlLltzZF06IFRlc3QgZm9yIEhJR0gsU0hJR0gsTE9XLFNEQS4KLQotVGh1IE1heSAgNyAxMzowNToyNSAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9icmVhazIwLltzZF06IE5ldyB0ZXN0cyBmb3IgMjAtYml0IG9wZXJhbmQgYnJlYWsgYW5kCi0gCXNkZGJwIGluc3RydWN0aW9ucy4gCi0JKiBnYXMvbWlwcy90cmFwMjAuW3NkXTogTmV3IHRlc3RzIGZvciAyMC1iaXQgb3BlcmFuZCB0cmFwCi0gCWluc3RydWN0aW9ucy4gCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIHRoZW0uCi0KLVRodSBBcHIgMzAgMTE6NTU6MDEgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2QzMHYve2luc3QsYXJyYXksb3B0LHJlbG9jfS5kOiBBY2NlcHQgPHN5bWJvbCtvZmZzZXQ+IGxhYmVscwotIAlpbiBkaXNhc3NlbWJseSwgd2hlcmUgdGhlIG9mZnNldCBpcyBpbiBoZXggYW5kIGhhcyBhICIweCIgcHJlZml4LgotCQotVHVlIEFwciAyOCAxNjozODozNCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9saW5lbm8uW3NkXTogQXNzZW1ibHkgc291cmNlIGxpbmUgbnVtYmVyIHRlc3QuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogQWRkZWQgbGluZW5vIHRlc3QuCi0KLVdlZCBBcHIgIDggMTg6NDU6MTcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdGVzdHN1aXRlL2FsbC9nYXMuZXhwOiBObyBsb25nZXIgZXhwZWN0IGZhaWx1cmVzIGZvcgotCWRpZmZlcmVuY2Ugb2YgdW5kZWZpbmVkIHN5bWJvbHMgb24gbW4xMHgwMCB0YXJnZXRzLgotCi1Nb24gTWFyIDIzIDEwOjQ3OjMzIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvYWxpZ24uczogQmFjayBvdXQgIi5zZWN0aW9uIHRleHQiIGNoYW5nZSBiZWxvdzsKLQl1c2UgIi50ZXh0IiBhZ2Fpbi4KLQkqIGdhcy9tYWNyb3Mvc2VtaS5zOiBEaXR0by4KLQkKLUZyaSBNYXIgMjAgMTg6NTE6NDkgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9hbGlnbi5zOiBJZGVudGlmeSAiLnRleHQiIHNlY3Rpb24gZXhwbGljaXRseS4KLQkqIGdhcy9tYWNyb3Mvc2VtaS5zOiBEaXR0by4KLQkKLQkKLQkKLU1vbiBNYXIgIDIgMTM6MzA6NDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24uW3NkXSAobGRpOGEsbGRpMTZhKTogRGVsZXRlLgotCShsZGkxNik6IEltcHJvdmUgdGVzdC4KLQkobm9wKTogRml4IHRlc3QuCi0KLVRodSBGZWIgMTIgMjA6MTI6MzkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwL21hY3JvLm91dDogQWRqdXN0IHRvIHJlZmxlY3QgdGhlIGZhY3QgdGhhdCBrZXl3b3JkCi0JYXJndW1lbnRzIGFyZSBub3cgcGVybWl0dGVkIGFmdGVyIHBvc2l0aW9uYWwgYXJndW1lbnRzLgotCi1XZWQgRmViICA0IDE1OjI3OjQ0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vYXJtN3QuZDogVXBkYXRlIHRvIG1hdGNoIGxhdGVzdCBhc3NlbWJsZXIgb3V0cHV0LgotCi1XZWQgRmViICA0IDE1OjQwOjAwIDE5OTggIEdlb2ZmcmV5IEtlYXRpbmcgIDxnZW9mZmtAb3plbWFpbC5jb20uYXU+Ci0KLQkqIGdhcy9wcGMvcHBjLmV4cDogTmV3IGZpbGUuCi0JKiBnYXMvcHBjL2FzdGVzdC5zLCBnYXMvcHBjL2FzdGVzdC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9wcGMvYXN0ZXN0Mi5zLCBnYXMvcHBjL2FzdGVzdDIuZDogTmV3IHRlc3QuCi0KLVN1biBGZWIgIDEgMjE6NDM6NTQgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbWlwcy80MDEwLnM6IFBhZCB0ZXN0IGNvZGUgb3V0IHRvIGEgMTZieXRlIGJvdW5kYXJ5LgotCSogZ2FzL21pcHMvNDAxMC5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBnYXMvbWlwcy80MTAwLnM6IFBhZCB0ZXN0IGNvZGUgb3V0IHRvIGEgMTZieXRlIGJvdW5kYXJ5LgotCSogZ2FzL21pcHMvNDEwMC5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0JKiBnYXMvbWlwcy80NjUwLnM6IFBhZCB0ZXN0IGNvZGUgb3V0IHRvIGEgMTZieXRlIGJvdW5kYXJ5LgotCSogZ2FzL21pcHMvNDY1MC5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZXMuCi0KLUZyaSBKYW4gMzAgMTQ6MDk6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL21vdmVtbC5kOiBBZGQgdGVzdCBjb21tZW50cywgZml4IHJlZ2V4cHMuCi0KLVRodSBKYW4gMjkgMTM6MzQ6NDkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIve2FsbGluc24saGlnaC0xfS5kOiBBbGxvdyAjIGNvbnN0YW50IHByZWZpeCB0byBiZSBtaXNzaW5nLgotCi1UaHUgSmFuIDI5IDA5OjQzOjUwIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL21yaV9tb3ZlbWwuW3NkXTogTW92ZWQgdG8gLi4uCi0JKiBnYXMvbXJpL21vdmVtbC5bc2RdOiAuLi4gaGVyZS4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgotCi1UdWUgSmFuIDI3IDIxOjU1OjQ0IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvNDAxMC5zOiBBZGQgNDAxMCB0ZXN0cy4KLQkqIGdhcy9taXBzLzQwMTAuZDogRXhwZWN0ZWQgb3V0cHV0LgotCSogZ2FzL21pcHMvNDEwMC5zOiBBZGQgNDAxMCB0ZXN0cy4KLQkqIGdhcy9taXBzLzQxMDAuZDogRXhwZWN0ZWQgb3V0cHV0LgotCSogZ2FzL21pcHMvNDY1MC5zOiBBZGQgNDAxMCB0ZXN0cy4KLQkqIGdhcy9taXBzLzQ2NTAuZDogRXhwZWN0ZWQgb3V0cHV0LgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biB0aGUgbmV3IHRlc3RzLgotCSogZ2FzL21pcHMvKi5kOiBQYXNzIHRoZSByaWdodCBwcm9jZXNzb3IgbW9kZWwgdG8gb2JqZHVtcC4KLQlGaXggbWlub3IgY2FzZXMgd2hlcmUgZXhwZWN0ZWQgb3V0cHV0IHdhcyB3cm9uZyBkdWUgdG8gb3Bjb2RlCi0JY29uZmxpY3RzLgotCi1UdWUgSmFuIDI3IDA1OjM1OjAyIDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL21yaV9tb3ZlbWwuW3NkXTogTmV3IHRlc3RjYXNlLgotCi1UaHUgSmFuIDIyIDE3OjI5OjA3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2hpZ2gtMS5kOiBBZGQgaGFzaCBwcmVmaXggdG8gY29uc3RhbnRzLgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLnM6IEFkZCBoYXNoIHByZWZpeCB0byBzb21lIGNvbnN0YW50cy4KLQkqIGdhcy9tMzJyL2FsbGluc24uZDogQWRkIGhhc2ggcHJlZml4IHRvIGNvbnN0YW50cy4KLQotV2VkIEphbiAyMSAyMToyNDowOCAxOTk4ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGdhcy9tODhrL2luaXQuZDogRml4IGhleGFkZWNpbWFsIG9mZnNldHMuCi0KLVdlZCBKYW4gMTQgMTc6NDk6MjIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvdXBwZXJjYXNlLmQ6IEZpeCB3aGl0ZSBzcGFjZSBtYXRjaGluZy4KLQkqIGdhcy9tMzJyL3JlbGF4LTEuZDogRml4IHdoaXRlIHNwYWNlIG1hdGNoaW5nLgotCi1XZWQgSmFuIDE0IDE1OjQ0OjMyIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvZGl2LmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGFzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL21pcHMvZGl2LWlsb2Nrcy5kOiBMaWtld2lzZS4KLQotV2VkIEphbiAxNCAxMToxMzowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogZ2FzL20zMnIvYWxsaW5zbi5kIChjbXB1aSk6IFVwZGF0ZSBvdXRwdXQgdG8gbmV3IGZvcm1hdC4KLQotVGh1IERlYyAxOCAxMToxMDo0MiAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2luc3QuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLQkqIGdhcy9hcm0vYXJtN3QuZDogVXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLVR1ZSBEZWMgMTYgMjI6MTk6MjUgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xiLXhnb3QuZCwgZ2FzL21pcHMvcm9sLmQsIGdhcy9taXBzL2phbC1zdnI0cGljLmQsCi0JZ2FzL21pcHMvamFsLXhnb3QuZDogQWRkIGFzc2VtYmxlciBvcHRpb24gdG8gc2VsZWN0IGEgc3BlY2lmaWMKLQl0YXJnZXQgY2hpcCwgdGhlIFIzMDAwLgotCSogZ2FzL21pcHMvbGIteGdvdC1pbG9ja3MuZDogTmV3IHRlc3QsIHNwZWNpZmljYWxseSBzZWxlY3RpbmcKLQlSMzkwMC4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cDogRG9uJ3QgcnVuIElFRUUgRlAgdGVzdHMgZm9yIFZheAotCXRhcmdldHMuCi0KLVdlZCBPY3QgMTUgMTA6NDA6MTQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvaWVlZS1mcC94OTMwNTA5YS5zOiBUd2VhayBzbGlnaHRseSB0byB3b3JrIG9uIHRoZSBQQS4KLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBVcGRhdGUgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIKLQljaGFuZ2VzLgotCi1UaHUgT2N0ICA5IDE4OjEwOjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zZXQ2NC5bc2RdOiBgc2V0JyBkb2Vzbid0IHRha2UgbmVnYXRpdmUgYXJndW1lbnRzLgotCi1UaHUgT2N0ICA5IDEyOjU5OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9hcm03dC5kOiBVcGRhdGUgZm9yIHJlY2VudCBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9oODMwMC9mZnh4MS5kOiBMaWtld2lzZS4KLQotV2VkIE9jdCAgOCAxNjoyMjo1MCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvcmVsb2M2NC5bc2RdOiBBZGQgdGVzdGNhc2VzIGZvciAlaGl4LCVsb3guCi0KLVdlZCBPY3QgIDggMTU6MTI6MzUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3ludGguZDogVXBkYXRlIGZvciByZWNlbnQgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvc3BhcmMvc3ludGg2NC5kOiBMaWtld2lzZS4KLQotCSogZ2FzL21pcHMvYmVxLnM6IEFkZCAudGV4dCB0byAuZ2xvYmwgdG8gbWFyayB0aGUgc3ltYm9sIHRvIGFzIGEKLQlmdW5jdGlvbiBzeW1ib2wuCi0JKiBnYXMvbWlwcy9qYWwuczogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgIDcgMTM6MzA6MzAgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3JlbG9jNjQuW3NkXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogUnVuIGl0LgotCi1TYXQgT2N0ICA0IDE5OjE0OjI0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwOiBBY2NlcHQgbTY4ayBsaXN0aW5nIGZvcm1hdC4KLQotRnJpIE9jdCAgMyAxNTo0NjowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9pZWVlLWZwL3g5MzA1MDlhLmV4cDogUmVtb3ZlIHNldHVwX3hmYWlsOyBpdCBzaG91bGQgbm93Ci0Jd29yay4gIENvcnJlY3QgZm9yIGJpZyBlbmRpYW4gYW5kIGZvciB0YWJzIGluIGlucHV0IGZpbGUuCi0KLQkqIGdhcy9hbHBoYS9mcC5leHA6IENoZWNrIGZvciBhbHBoYS0qLW9zZiosIG5vdCBhbHBoYS0qLW9zZjEqLgotCSogZ2FzL2FscGhhL2ZwLnM6IENoYW5nZSBjb21tZW50IGNoYXJhY3RlcnMgZnJvbSAhIHRvICMuCi0KLVRodSBTZXAgMTggMTE6MTc6NTMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NwbGV0LmQ6IFVwZGF0ZSB0byBuZXcgb2JqZHVtcCBvdXRwdXQgZm9ybWF0LgotCSogZ2FzL3NwYXJjL3thc2kuZCxtZW1iYXIuZCxwcmVmZXRjaC5kLHJkcHIuZCx3cnByLmR9OiBMaWtld2lzZS4KLQkqIGdhcy9zcGFyYy9zZXQ2NC5bZHNdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvc3BhcmMvc3BsZXQtMi5bZHNdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBSdW4gdGhlbS4KLQotVHVlIFNlcCAxNiAxNToyNzowOCAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlIGNoYW5nZXMgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogZ2FzL2QzMHYvaW5zdC5zOiBBZGQgc29tZSBuZXcgdGVzdHMuIAotCi0gCSogZ2FzL2QzMHYve2luc3QsIG9wdCwgcmVsb2N9LmQ6IFVwZGF0ZSByZXN1bHRzIHdpdGgKLSAJbmV3IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi0JKiBnYXMvZDMwdi9pbnN0LltzZF06IFVwZGF0ZSBleGFtcGxlcyBmb3IgZCppIGluc3RydWN0aW9ucy4gCi0KLQkqIGdhcy9kMzB2LyouZDogVXBkYXRlIGFsbCB0ZXN0IHJlc3VsdHMgYmVjYXVzZQotIAlvZiBuZXcgIi5zIiBhbmQgIi5sIiBleHRlbnNpb25zLgotCi0JKiBnYXMvZDMwdi9pbnN0LltzZF06IENvcnJlY3QgZW50cnkgZm9yIG11bHgyaC4KLQkqIGdhcy9kMzB2L29wdC5bc2RdOiBDb3JyZWN0IHN0MncgaW5zdHJ1Y3Rpb24uIAotCi0JKiBnYXMvZDMwdi9hbGlnbi5kOiBDaGFuZ2UgZXhwZWN0ZWQgb3V0cHV0LgotCi0JKiBnYXMvZDMwdi9yZWxvYy5bc2RdOiBBZGQgdGVzdCBjYXNlLiAKLQotCSogZ2FzL2QzMHYvYXJyYXkuW3NkXTogTmV3IHRlc3QgY2FzZS4KLQotCSogZ2FzL2QzMHYvb3B0LltzZF06IEFkZGVkIG1vcmUgdGVzdCBjYXNlcy4gCi0KLQkqIGdhcy9kMzB2L29wdC5zOiBBZGQgdGVzdCBjYXNlcy4KLQkqIGdhcy9kMzB2L3JlbG9jLnM6IEZpeCBhIHRlc3QgY2FzZS4JCi0JKiBnYXMvZDMwdi97b3B0LHJlbG9jfS5kOiBSZWdlbmVyYXRlLgotCi1Nb24gU2VwICA4IDE0OjIxOjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2hpZ2gtMS5bZHNdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbTMyci9tMzJyLmV4cDogUnVuIGl0LgotCi1Nb24gQXVnIDI1IDExOjA0OjI0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL3JlbGF4LTEuW2RzXTogTmV3IHRlc3RjYXNlLgotCSogZ2FzL20zMnIvbTMyci5leHA6IFJ1biBpdC4KLQotVGh1IEF1ZyAxNCAyMzo0OTo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvYXJjOiBOZXcgZGlyZWN0b3J5Ci0JKiBnYXMvYXJjL3thcmMuZXhwLGFsaWFzLltzZF0sYnJhbmNoLltzZF0sZmxhZy5bc2RdLGluc24zLltzZF0sai5bc2RdLAotCWxkLltzZF0sbWF0aC5bc2RdLHNzaGlmdC5bc2RdLHN0LltzZF0sd2Fybi57ZXhwLHN9fTogTmV3IGZpbGVzLgotCi1XZWQgQXVnICA2IDAwOjMzOjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgQVMgYW5kIEdBU1AgdG8gYXMtbmV3LCBub3QgYXMubmV3LgotCi1UdWUgQXVnICA1IDEyOjMzOjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgTk0gdG8gbm0tbmV3LCBub3Qgbm0ubmV3LCB0byBtYXRjaAotCXJlY2VudCBjaGFuZ2UgaW4gYmludXRpbHMgYnVpbGQgZGlyZWN0b3J5LgotCi1UaHUgSnVsIDMxIDE1OjIxOjUxIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvcmFuZ2UuczogTmV3IHRlc3QuCi0JKiBnYXMvdjg1MC9iYXNpYy5leHA6IFJ1biBpdC4KLQotVHVlIEp1bCAyOSAxNDozNTowMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL2hpbG8yLnM6IE5ldyB0ZXN0LgotCSogZ2FzL3Y4NTAvZmVwc3cuczogTmV3IHRlc3QuCi0JKiBnYXMvdjg1MC9iYXNpYy5leHA6IFJ1biB0aGVtLgotCi1UdWUgSnVsIDE1IDEzOjAzOjE3IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL3VwcGVyY2FzZS5bc2RdOiBOZXcgdGVzdGNhc2UuCi0JKiBnYXMvbTMyci9tMzJyLmV4cDogTmV3IGZpbGUuCi0KLU1vbiBKdW4gMTYgMTQ6MzI6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9wY3JlbC5kOiBVcGRhdGUgZm9yIG02OGsgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5kOiBMaWtld2lzZS4KLQotTW9uIEp1biAgMiAxNjo1MDowMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2FybS5leHA6IEFkZGVkIGNoYW5nZXMgZnJvbSBhcm1ULTk3MDMyOC1icmFuY2guCi0KLU1vbiBKdW4gIDIgMTI6MDk6MDIgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBUaGUgcjM5MDAgaGFzIGludGVybG9ja3MgZm9yIG11bCwgYnV0Ci0Jbm90IGRpdi4KLQotTW9uIEp1biAgMiAxMjowMzozMiAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5ALmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL211bC57ZCxzfTogRW5kIHRoZSB0ZXN0cyB3aXRoIG5vLW9wcy4gCi0KLU1vbiBKdW4gIDIgMTE6NDg6NTggMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJlZ2V4cF9kaWZmKTogSW1wcm92ZSBtZXNzYWdlcyB3aGVuIG9uZQotCWZpbGUgaXMgc2hvcnRlciB0aGFuIHRoZSBvdGhlci4KLQotV2VkIE1heSAgNyAxNjoxODozMCAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIGdhcy9tODhrL2luaXQue3MsZH06IE5ldyBjaGVja3MgZm9yIHByb3BlciBwYWRkaW5nIG9mCi0JLmluaXQgc2VjdGlvbnMuCi0JKiBnYXMvbTg4ay9tODguZXhwOiBSdW4gdGhlbS4KLQotCSogZ2FzL202OGsvdDIuZDogTmV3IGZpbGUgZm9yIGNoZWNrIG9mIHByZXNlbmNlIG9mIHNlY3Rpb24KLQlzeW1ib2xzIG9uIHRoZSBtNjhrLW1vdG9yb2xhLXN5c3YuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gdDIgaWYgW2lzdGFyZ2V0IG02OCotbW90b3JvbGEtc3lzdl0uCi0KLVdlZCBNYXkgIDcgMTY6MTI6MjQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IERvbid0IHJ1biBjb2ZmdGFnIHRlc3QgZm9yIG04OGstY29mZi4KLQotCSogZ2FzL21pcHMvbGlmbG9hdC5zOiBVcGRhdGUgZm9yIHJlY2VudCBjaGFuZ2VzIHRvIGZsb2F0aW5nIHBvaW50Ci0JaGFuZGxpbmcuCi0JKiBnYXMvbWlwcy9saWYtZW1waWMuZCwgZ2FzL21pcHMvbGlmLXN2cjRwaWMuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy9saWYteGdvdC5kLCBnYXMvbWlwcy9saWZsb2F0LmQ6IExpa2V3aXNlLgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogSGFuZGxlIElyaXggNiBsaWtlIElyaXggNS4KLQotU2F0IEFwciAxOSAyMzoxNjozNSAxOTk3ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQHBldHJhLmFwcGxpLnNlPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogSGFuZGxlIE9wZW5CU0QgbGlrZSBOZXRCU0QuCi0KLVdlZCBBcHIgMTYgMTI6MjA6MjQgMTk5NyAgTWFydGluIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGdhcy9kMzB2L2QzMC5leHA6IEFkZCBvcHRpbWl6ZXIgdGVzdCBjYXNlLgotCSogZ2FzL2QzMHYvb3B0LnM6IEFkZCBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0ZXN0cy4KLQkqIGdhcy9kMzB2L29wdC5kOiBSZWJ1aWxkLgotCi1UdWUgQXByIDE1IDE4OjEwOjAxIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy97ZGVsYXkuZCxub2RlbGF5LmR9OiBhZGRlZC4KLQotTW9uIEFwciAgNyAxMjo1Nzo0NSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvbTMyci9hbGxpbnNuLmQ6IFVwZGF0ZSB0byBuZXcgb2JqZHVtcCBvdXRwdXQgc3R5bGUuCi0KLUZyaSBBcHIgIDQgMTM6MTk6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL2Zsb2F0LnM6IFB1dCBhIHRhYiBiZWZvcmUgLnRleHQsIHRvIGtlZXAgdGhlIFBBIGhhcHB5LgotCi0JKiBnYXMvYXJtL2FybS5leHA6IE9ubHkgcnVuIGluc3QgYW5kIGFybTd0IG9uIHRhcmdldHMgd2hpY2ggY2FuCi0JaGFuZGxlIC1FTC4gIEFkZCBzZXR1cF94ZmFpbCBmb3IgdGh1bWIuCi0KLQkqIGdhcy9oODMwMC9mZnh4MS5kOiBEb24ndCBmYWlsIGlmIEJGRCBpcyA2NCBiaXRzLgotCi1UaHUgQXByICAzIDE4OjI2OjU2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9tMzJyL2FsbGluc24ue2V4cCxzLmR9OiBOZXcgdGVzdGNhc2VzLgotCi1UaHUgTWFyIDI3IDAwOjQyOjI4IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi9kMzAuZXhwOiBBZGQgdGVzdCBjYXNlIHJlbG9jLgotCSogZ2FzL2QzMHYvcmVsb2MuW3NkXTogTmV3IGZpbGVzIHRvIHRlc3QgcmVsb2NhdGlvbnMuCi0KLVNhdCBNYXIgMTUgMTc6MjE6NDYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYXJtL2luc3QuZDogVXBkYXRlIGZvciBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9hcm0vYXJtN3QuZDogTGlrZXdpc2UuCi0KLVR1ZSBNYXIgMTEgMTM6MzE6NTYgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGdhcy9tNjhrL29wNjgwMDAuZDogVXBkYXRlIGZvciByZWNlbnQgYXNzZW1ibGVyIGJ1ZyBmaXguCi0KLVdlZCBNYXIgIDUgMTM6MDE6MjQgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IHhmYWlsIGEgY291cGxlIHRlc3RzIGZvciB0aGUgbW4xMDMwMC4KLQotTW9uIE1hciAgMyAxMTo0MTowMCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3thZGQuZCwgZmxvYXQuZCwgcmVnb3BzMi5kLCByZWxvY3MxLmQsIHJlbG9jczFiLmQsCi0JcmVsb2NzMi5kLCByZWxvY3MyYi5kfTogQWRqdXN0IHRvIG9iamR1bXAgZm9ybWF0IHR3ZWFrcy4KLQotVGh1IEZlYiAyNyAxNToyMTo0NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3thbGlnbi5kLCBhbGlnbi5sc3QsIGFsaWduLnN9IE5ldyB0ZXN0IGZvciB0aGUKLQkiLmFsaWduIiBwc2V1ZG9wLgotCSogZ2FzL3RpYzgwL3RpYzgwLmV4cDogUnVuIHRoZSBhbGlnbiB0ZXN0LgotCQotV2VkIEZlYiAyNiAyMDozNjo0NiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3tmbG9hdC5kLCBmbG9hdC5sc3QsIGZsb2F0LnN9OiBOZXcgdGVzdHMgZm9yCi0Jc2ltcGxlIGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzLgotCSogZ2FzL3RpYzgwL3RpYzgwLmV4cDogUnVuIHRoZSBmbG9hdCB0ZXN0LgotCi1XZWQgRmViIDI2IDE1OjE2OjA0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve3JlZ29wczIuZCwgcmVnb3BzMi5sc3QsIHJlZ29wczIucywgcmVnb3BzMy5kLAotIAlyZWdvcHMzLmxzdCwgcmVnb3BzMy5zLCByZWdvcHM0LmQsIHJlZ29wczQubHN0LCByZWdvcHM0LnN9OgotCU5ldyB0ZXN0cyBmb3IgOm0gYW5kIDpzIG9wZXJhbmQgbW9kaWZpZXJzLgotCSogZ2FzL3RpYzgwL3RpYzgwLmV4cDogUnVuIHRoZSByZWdvcHMyLCByZWdvcHMzLCBhbmQgcmVnb3BzNCB0ZXN0cy4KLQotVHVlIEZlYiAyNSAxMzo0NTo1NSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tYWNyb3Mvc2VtaS5zOiBGb3JjZSB0aGUgZmluYWwgYWxpZ25tZW50IHRvIHVzZSBhIGZpbGwgdmFsdWUKLQlvZiAwLgotCi0JKiBnYXMvYWxsL2NvbmQucywgZ2FzL2FsbC9jb25kLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL2FsbC9nYXMuZXhwOiBSdW4gaXQuCi0KLU1vbiBGZWIgMjQgMTA6NTI6MTIgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9nYXMtZGVmcy5leHAoZ2FzX2luaXQpOiBBZGRlZCBuZXcgcGFyYW1ldGVyIGZvciBzY3JpcHQKLQluYW1lLgotCi1Nb24gRmViIDI0IDEwOjQwOjI4IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBnYXMvdGljODAve2FkZC5kLCBiaXRudW0uZCwgY2NvZGUuZCwgY3JlZ29wcy5kLCBlbmRtYXNrLmQsCi0JcmVnb3BzLmQsIHJlbG9jczEuZCwgCi0JKHJlbG9jczEuYyk6IEFkZCBmaWxlIGZvciByZWZlcmVuY2UuCi0JKHJlbG9jczFiLmQpOiBTcGxpdCByZWxvYyB0YWJsZSBjb250ZW50cyB0ZXN0IHRvIGRpZmZlcmVudCB0ZXN0IGZpbGUuCi0JKHJlbG9jczIuYyk6IEFkZCB0ZXN0IHRoYXQgdXNlcyB2YXJpb3VzIHR5cGVzIChjaGFyLCBzaG9ydCwgaW50LCAuLi4pIG9mCi0Jc3RhdGljIGFuZCBnbG9iYWwgdmFyaWFibGVzIHdpdGggZGF0YSBzaHVmZmxpbmcgdG8gZ2VuZXJhdGUgbG90cyBvZiBsZC9zdAotCWluc3RydWN0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcy4KLQkocmVsb2NzMi5kKTogTmV3IGZpbGUsIGV4cGVjdGVkIGNvZGUgZm9yIHJlbG9jczIgdGVzdC4KLQkocmVsb2NzMi5sc3QpOiBOZXcgZmlsZSwgVEkgYXNzZW1ibGVyIGxpc3RpbmcgZm9yIHJlZmVyZW5jZS4KLQkocmVsb2NzMi5zKTogTmV3IGZpbGUsIGFzc2VtYmx5IHNvdXJjZSBmb3IgcmVsb2NzMiB0ZXN0LgotCShyZWxvY3MyYi5kKTogTmV3IGZpbGUsIGV4cGVjdGVkIHJlbG9jIHRhYmxlIGNvbnRlbnRzIGZvciByZWxvY3MyIHRlc3QuCi0JKHRpYzgwLmV4cCk6IFJ1biB0aGUgcmVsb2NzMWIsIHJlbG9jczIsIGFuZCByZWxvY3MyYiB0ZXN0cy4KLQotU3VuIEZlYiAyMyAxNzo1NDowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvaXRibC10ZXN0LmMobWFpbik6IFVwZGF0ZSBmdW5jdGlvbiBjYWxscy4KLQlSZW1vdmUgcGFyYW1ldGVycyBmcm9tIGl0YmxfZ2V0X3JlZ192YWwgYW5kCi0JY2hhbmdlIGl0YmxfZ2V0X2luc25fbmFtZSB0byBpdGJsX2dldF9maWVsZC4KLQotU3VuIEZlYiAyMyAxNzoyMjowMCAxOTk3ICBEYXduIFBlcmNoaWsgIDxkYXduQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2l0Ymw6IEFkZCBjb21tZW50cy4KLQkqIGdhcy9taXBzL2l0YmwuczogQWRkIGNvbW1lbnRzLiAgUHJlZml4IHJlZ2lzdGVyIG5hbWVzIHdpdGggJC4KLQkqIGdhcy9hbGwvaXRibDogR2VuZXJpYyB0YWJsZSBmb3IgdGVzdGluZyBmb3IgaXRibCBzdXBwb3J0LgotCSogZ2FzL2FsbC9pdGJsLnM6IEdlbmVyaWMgYXNzZW1ibHkgZm9yIHRlc3RpbmcgZm9yIGl0Ymwgc3VwcG9ydC4KLQkqIGdhcy9taXBzL2l0YmwtdGVzdC5jOiBNb3ZlZCB0byBnYXMvYWxsLgotCSogZ2FzL2FsbC9pdGJsLXRlc3QuYzogTW92ZWQgZnJvbSBnYXMvbWlwcy4KLQotU2F0IEZlYiAyMiAyMDoyNDoyMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZ2FzL3RpYzgwL3thZGQubHN0LCBiaXRudW0ubHN0LCBjY29kZS5sc3QsIGNyZWdvcHMubHN0LAotIAllbmRtYXNrLmxzdCwgcmVnb3BzLmxzdH06IFJlbW92ZSBeTSdzIGZyb20gZW5kIG9mIGxpbmVzLgotCSogZ2FzL3RpYzgwL2JpdG51bS5zOiBBZGQgY29tbWVudCB0byBlYWNoIGxpbmUgc2hvd2luZyB2YWx1ZQotCXRoYXQgc3ltYm9saWMgQklUTlVNIGFzc2VtYmxlcyB0by4gIEFkZCBjb3ZlcmFnZSBmb3IgcmF3Ci0JbnVtZXJpYyB2YWx1ZXMgZm9yIHRoZSBCSVROVU0gb3BlcmFuZC4KLQkqIGdhcy90aWM4MC9iaXRudW0uZDogVXBkYXRlIGR1ZSB0byBiaXRudW0ucyBjaGFuZ2VzLgotCSogZ2FzL3RpYzgwL3JlZ29wcy5kOiBVcGRhdGUgZHVlIHRvIG9wY29kZSBsaWJyYXJ5IGFkZGl0aW9ucwotCW9mIGZsb2F0aW5nIHBvaW50IHRlc3QgQklUTlVNIHZhbHVlcyB0aGF0IGFyZSBhbWJpZ3VvdXMgd2l0aAotCXRoZSBpbnRlZ3JhbCBvbmVzLgotCSogZ2FzL3RpYzgwL3JlbG9jczEuczogTmV3IHRlc3QgY2FzZSB0aGF0IHRlc3RzIHNpbXBsZSByZWxvY3MuCi0JKiBnYXMvdGljODAvcmVsb2NzMS5kOiBFeHBlY3RlZCBvdXRwdXQgZm9yIGFib3ZlLgotCSogZ2FzL3RpYzgwL3JlbG9jczEubHN0OiBUSSBhc3NlbWJsZXIgbGlzdGluZyBmb3IgYWJvdmUuCi0JKiBnYXMvdGljODAvdGljODAuZXhwOiBBZGQgcmVsb2NzMSB0ZXN0LgotCi1GcmkgRmViIDIxIDE0OjIzOjE0IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBnYXMvZDMwdi97YWxpZ24uZCwgYWxpZ24ucywgZDMwLmV4cCwgZ3VhcmQuZCwgZ3VhcmQucywKLQlpbnN0LmQsIGluc3Qucywgb3B0LmQsIG9wdC5zfTogVGVzdCBmaWxlcyBmb3IgRDMwVi4KLQotV2VkIEZlYiAxOSAwMDo1NToyOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tYWNyb3Mvc2VtaS5zLCBnYXMvbWFjcm9zL3NlbWkuZDogTmV3IHRlc3QuCi0JKiBnYXMvbWFjcm9zL21hY3Jvcy5leHA6IFJ1biBpdC4KLQkqIGdhcy9tcmkvc2VtaS5zLCBnYXMvbXJpL3NlbWkuZDogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KLQotVHVlIEZlYiAxOCAxMzozNzowNiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCAoYWxpZ240IHRlc3RzKTogVHdlYWsgZXhwZWN0ZWQKLQlvdXRwdXQuCi0JCi1GcmkgRmViIDE0IDE3OjU2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9hbGlnbi5kLCBnYXMvYWxsL2FsaWduLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2FsbC9nYXMuZXhwOiBSdW4gaXQuCi0KLVRodSBGZWIgMTMgMTQ6NDQ6MDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzMTYuZDogQ29ycmVjdCBQQyByZWxhdGl2ZSBpbnN0cnVjdGlvbiBieXRlcy4KLQotV2VkIEZlYiAxMiAxMjozMzowOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xpZi1zdnI0cGljLmQ6IFBhc3MgLUVCIHdoZW4gcnVubmluZyB0aGUgYXNzZW1ibGVyLgotCSogZ2FzL21pcHMvbGlmLXhnb3QuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91bGgtc3ZyNHBpYy5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3VsaC14Z290LmQ6IExpa2V3aXNlLgotCi0JKiBnYXMvbWlwcy9taXBzMTYuZDogVXBkYXRlIGZvciB5ZXQgYW5vdGhlciBjaGFuZ2UgaW4gZGlzYXNzZW1ibHkKLQlvdXRwdXQgKHRoaXMgb25lIGlzIHNwYWNpbmcgb25seSkuCi0KLVR1ZSBGZWIgMTEgMTQ6NDU6MzkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGdhcy90aWM4MC97YWRkLmQsIGFkZC5sc3QsIGFkZC5zLCBiaXRudW0uZCwgYml0bnVtLmxzdCwgYml0bnVtLnMsCi0gCWNjb2RlLmQsIGNjb2RlLmxzdCwgY2NvZGUucywgY3JlZ29wcy5kLCBjcmVnb3BzLmxzdCwgY3JlZ29wcy5zLAotCWVuZG1hc2suZCwgZW5kbWFzay5sc3QsIGVuZG1hc2sucywgcmVnb3BzLmQsIHJlZ29wcy5sc3QsIHJlZ29wcy5zLAotCXRpYzgwLmV4cH06IE5ldyBmaWxlcyBmb3IgVEljODAgdGVzdCBjYXNlcy4KLQotVHVlIEZlYiAxMSAxNTo0NjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHMxNi5kOiBVcGRhdGUgZm9yIGNoYW5nZSBpbiBkaXNhc3NlbWJseSBvdXRwdXQuCi0KLU1vbiBGZWIgMTAgMjI6MjQ6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0gICAgICAgICogZ2FzL21pcHMvaXRibC10ZXN0LmM6IEFkZCBjb3B5cmlnaHQgbWVzc2FnZSBhbmQgZml4IGluZGVudGF0aW9uLiAgIAotCi1Nb24gRmViIDEwIDE3OjU0OjAwIDE5OTcgIERhd24gUGVyY2hpayAgPGRhd25AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvaXRibC10ZXN0LmM6IE5ldyBmaWxlLiAgU3RhbmQtYWxvbmUgYXNzZW1ibGVyIGFuZCAKLQlkaXNzYXNzZW1ibGVyIGZvciBpdGJsIHN1cHBvcnQuCi0KLU1vbiBGZWIgMTAgMTc6MjA6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9pdGJsOiBOZXcgZmlsZS4gIEluc3RydWN0aW9uIFNwZWMgZm9yIHRlc3RpbmcgLS1pdGJsCi0Jb3B0aW9uLgotCSogZ2FzL21pcHMvaXRibC5zOiBOZXcgZmlsZS4gIEFzc2VtYmx5IHdpdGggbmUydyBpbnN0cnVjdGlvbnMKLQlzcGVjaWZpZWQgaW4gaXRibC4KLQotRnJpIEZlYiAgNyAxNjo0Mjo1MyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZ2FzcC9nYXNwLmV4cDogVXNlIHBydW5lX3dhcm5pbmdzIGluc3RlYWQgb2YgcHJ1bmVfc3lzdGVtX2NydWQuCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBEaXR0by4KLQotTW9uIEZlYiAgMyAxNTo0NjowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hcm0vaW5zdC5kLCBnYXMvYXJtL2FybTd0LmQ6IFBhc3MgLS1wcmVmaXgtYWRkcmVzc2VzIHRvCi0Jb2JqZHVtcC4gIFVwZGF0ZSBmb3IgY3VycmVudCByZWxvY2F0aW9uIHByaW50aW5nIHN0eWxlLgotCi1UaHUgSmFuIDMwIDExOjU3OjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwczE2LmQ6IFVwZGF0ZSBmb3IgZGlzYXNzZW1ibGVyIGNoYW5nZXMuCi0KLVRodSBKYW4gMjMgMDM6MTU6MDYgMTk5NyAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBzZXQgaWxvY2tzIGZvciBhbGwgNDEwMC80MzAwCi0KLVRodSBKYW4gIDIgMTY6NDk6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzMTYucywgZ2FzL21pcHMvbWlwczE2LmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBtaXBzMTYgdGVzdC4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IFJ1biBkbGkgdGVzdCB1bmNvbmRpdGlvbmFsbHkuCi0JKiBnYXMvbWlwcy9kbGkuczogQWRkIHRleHQgc3ltYm9sLiAgQWRkIG5vcHMgdG8gcm91bmQgdG8gMTYgYnl0ZQotCWJvdW5kYXJ5LgotCSogZ2FzL21pcHMvZGxpLmQ6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotVHVlIERlYyAzMSAxMzowMzoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zeW50aC5kOiBVc2UgLS1wcmVmaXgtYWRkcmVzc2VzIGZvciBvYmpkdW1wLgotCSogZ2FzL3NwYXJjL3N5bnRoNjQuZDogTGlrZXdpc2UuCi0KLVR1ZSBEZWMgMjQgMTY6MzA6NTggMTk5NiAgQW5nZWxhIE1hcmllIFRob21hcyAoYW5nZWxhQGN5Z251cy5jb20pCi0KLQkqIGdhcy9taXBzLyotaWxvY2tzLmQ6IEZpeCByZWdleHBzIHRvIHJlc2VtYmxlIGRpc2Fzc2VtYmxlZCBvdXRwdXQuCi0KLUZyaSBEZWMgMTMgMTM6MDU6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy8qLltzZF06IEFkZCBleHBsaWNpdCBub3BzLCBzb21ldGltZXMgY29udHJvbGxlZCBieQotCS5pZmRlZiwgdG8gYWNjb21vZGF0ZSBjaGFuZ2UgdG8gYXZvaWQgZGVmYXVsdCBhbGlnbm1lbnQgb24KLQllbWJlZGRlZCBzeXN0ZW1zLgotCi1XZWQgRGVjIDExIDA5OjI2OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAyMDAvYmFzaWMuZXhwIChkb19tb3ZiKTogRml4IGJpdCBwYXR0ZXJuIGZvcgotCSJtb3ZiIGRtLChhbikiLgotCi1UdWUgRGVjIDEwIDEzOjAxOjA1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBVcGRhdGUgYWZ0ZXIgZW5kaWFubmVzcyBjaGFuZ2VzIHRvCi0JdGhlIGFzc2VtYmxlci4KLQotCSogZ2FzL21uMTAyMDAve21vdjEucyxtb3YyLnMsbW92My5zLG1vdjQucyxtb3Z4LnN9OiBOZXcgdGVzdHMuCi0JKiBnYXMvbW4xMDIwMC97bW92Yi5zLCBtb3ZidS5zfTogTGlrZXdpc2UuCi0JKiBnYXMvbW4xMDIwMC9iYXNpYy5leHA6IFJ1biB0aGVtLgotCi1Nb24gRGVjICA5IDE3OjA4OjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAyMDAvKi5zOiBOZXcgdGVzdHMgZm9yIHRoZSBtbjEwMjAwIGFzc2VtYmxlci4KLQkqIGdhcy9tbjEwMjAwL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLUZyaSBEZWMgIDYgMTU6MzU6MDQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC8qLnM6IFJlbW92ZSAnJCcgcmVnaXN0ZXIgcHJlZml4aW5nLgotCi1Nb24gTm92IDI1IDE2OjM1OjMzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy1zb2xhcmlzL2FkZGVuZC5leHA6IEZpeCBwYXR0ZXJucywgeW91IGNhbid0IGFzc3VtZQotCVxyIHdpbGwgYmUgcHJlc2VudC4KLQotTW9uIE5vdiAyNSAxMzo0NTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrLyouZDogVXBkYXRlIGZvciBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQkqIGdhcy9tcmkvKi5kOiBMaWtld2lzZS4KLQotTW9uIE5vdiAyNSAxMTozODozNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwLyouczogVXNlICckJyBhcyByZWdpc3RlciBwcmVmaXggZm9yCi0JYWxsIHJlZ2lzdGVyIG9wZXJhbmRzLgotCi1UaHUgTm92IDIxIDExOjUyOjU0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwOiB4ZmFpbCBhIGNvdXBsZSB0ZXN0cyBmb3IgdGhlIG1uMTAzMDAuCi0KLVdlZCBOb3YgMjAgMTE6MzE6NDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9vdGhlci5zOiBVcGRhdGUgZm9yIGNvcnJlY3Qgc3ludGF4IG9uIGEKLQlmZXcgaW5zdHJ1Y3Rpb25zICh0aG9zZSB3aXRoIHJlZ2lzdGVyIGxpc3RzKS4KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UdWUgTm92IDE5IDEzOjM2OjU3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvbW92bS5zOiBVcGRhdGUgZm9yIGNvcnJlY3Qgc3ludGF4LgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBVcGRhdGUgZXhwZWN0ZWQgbW92bSBiaXQgcGF0dGVybnMuCi0KLUZyaSBOb3YgMTUgMTM6NTc6NDIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9vdGhlci5zOiBQdXQgcGFyZW5zIGFyb3VuZCByZWdpc3RlcgotCWFyZ3VtZW50IGluIGNhbGxzIGFuZCBqbXAgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgTm92IDEzIDEzOjE2OjA0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2g4MzAwL2ZmeHgxLmQ6IFVwZGF0ZSBmb3IgcmVjZW50IGRpc2Fzc2VtYmxlciBjaGFuZ2VzLgotCi1Nb24gTm92IDExIDE2OjAzOjI0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBQYXNzICItLXByZWZpeC1hZGRyZXNzZXMiIHRvIG9iamR1bXAKLQlhcyBuZWVkZWQuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IExpa2V3aXNlLgotCi1UaHUgTm92ICA3IDAwOjI3OjUyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBvcGNvZGUgaW5zZXJ0aW9uIGZvcgotCWV4dGVuZGVkIGluc3RydWN0aW9ucy4KLQkqIGdhcy9tbjEwMzAwL2V4dGVuZC5zOiBUd2VhayBjb25zdGFudHMgZm9yIGJldHRlcgotCXRlc3RzdWl0ZSBjb3ZlcmFnZS4KLQotV2VkIE5vdiAgNiAxMzo1MDowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVGVzdCBpbnNlcnRpb24gb2Ygb3BlcmFuZHMKLQlpbnRvIGNhbGwgYW5kIGptcCBpbnN0cnVjdGlvbnMgd2l0aCAzMmJpdCBvZmZzZXRzLgotCUZpeCB0eXBvIGluIGJpdCB0ZXN0IHBhdHRlcm5zLgotCSogZ2FzL21uMTAzMDAvb3RoZXIuczogVHdlYWsgY29uc3RhbnRzIHRvIGltcHJvdmUKLQl0ZXN0c3VpdGUgY292ZXJhZ2UuCi0KLQkqIGdhcy9tbjEwMzAwL2Jhc2ljLmV4cDogVGVzdCBpbnNlcnRpb24gb2YgMzJiaXQgb3BlcmFuZAotCWluIGNhbGxzLCBidHN0LCBiY2xyICYgYnNldCBpbnN0cnVjdGlvbnMuCi0KLQkqIGdhcy9tbjEwMzAwLyouczogVHdlYWsgY29uc3RhbnRzIGluIDMyYml0IGluc25zIGZvcgotCWJldHRlciB0ZXN0aW5nIGNvdmVyYWdlLgotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBUZXN0IGluc2VydGlvbiBvZiBtb3N0IDMyYml0Ci0Jb3BlcmFuZHMuCi0KLVR1ZSBOb3YgIDUgMTM6MzM6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgaW5kZXhlZCBtb3YsCi0JbW92YnUsIG1vdmh1IGluc3RydWN0aW9ucy4gIENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgbW9yZSBiaXQKLQlvcGVyYXRpb25zLiAgQ2hlY2sgYml0IHBhdHRlcm5zIGZvciB2YXJpb3VzIDE2Yml0IGNhbGwsIHJldGYKLQlhbmQgcmV0IGluc3RydWN0aW9ucy4KLQkqIGdhcy9tbjEwMzAwL290aGVyLnM6IFVwZGF0ZSBvcGVyYW5kcyBmb3IgYmV0dGVyIHRlc3QgY292ZXJhZ2UuCi0KLU1vbiBOb3YgIDQgMTI6NTU6MTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IENoZWNrIGJpdCBwYXR0ZXJucyBmb3IgYSBjb3VwbGUgbW9yZQotCW1vdiBhbmQgY21wIGluc3RydWN0aW9ucy4KLQotVHVlIE9jdCAyOSAxNzowNTo0MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzLyouZDogVXBkYXRlIGZvciBkaXNhc3NlbWJsZXIgY2hhbmdlcy4KLQotV2VkIE9jdCAxNiAyMjozOTo1MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy92ODUwL3JlbG9jLnM6IE5ldyB0ZXN0cy4KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cDogUnVuIHRoZW0uCi0KLU1vbiBPY3QgMTQgMTM6NTI6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwczogQWRkIHN5bWJvbHMgdG8gc2V2ZXJhbCB0ZXN0c3VpdGVzLCBzaW5jZSB0aGUgRUxGCi0JYXNzZW1ibGVyIG5vdyBhbHdheXMgYnVpbGRzIGEgc3ltYm9sIHRhYmxlLCB3aGljaCBtZWFucyB0aGF0Ci0Jb2JqZHVtcCB3aWxsIG5vIGxvbmdlciByZXBvcnQgYE5vIHN5bWJvbHMgaW4gRklMRScuICBDaGFuZ2UgdGhlCi0JZXhwZWN0ZWQgb3V0cHV0IGFjY29yZGluZ2x5LgotCi1UaHUgT2N0IDEwIDEzOjExOjQ4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIGluc3RydWN0aW9ucwotCXdpdGggYSBzaW5nbGUgOGJpdCBvciAxNmJpdCBpbW1lZGlhdGUgb3BlcmFuZC4KLQotCSogZ2FzL21uMTAzMDAvYmFzaWMuZXhwOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIG1hbnkKLQlpbnN0cnVjdGlvbnMuICBBZGQgbWlzc2luZyB0ZXN0IGluIGRvX21vdjEuCi0JKiBnYXMvbW4xMDMwMC9tb3YxLnM6IEFkZCBtaXNzaW5nIHRlc3QuCi0KLVdlZCBPY3QgIDkgMTQ6MTU6MTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvbW4xMDMwMC97YWRkLnMsIGJjYy5zLCBiaXQucywgY21wLnMsIGV4dC5zfTogTmV3IHRlc3RzLgotCSogZ2FzL21uMTAzMDAve2V4dGVuZC5zIGxvZ2ljYWwucywgbG9vcC5zLCBtb3YxLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9tbjEwMzAwL3ttb3YyLnMsIG1vdjMucywgbW92NC5zLCBtb3ZidS5zfTogTGlrZXdpc2UuCi0JKiBnYXMvbW4xMDMwMC97bW92aHUucywgbW92bS5zLCBtdWxkaXYucywgb3RoZXIuc306IExpa2V3aXNlLgotCSogZ2FzL21uMTAzMDAve3NoaWZ0LnMsIHN1Yi5zfTogTGlrZXdpc2UuCi0JKiBnYXMvbW4xMDMwMC9iYXNpYy5leHA6IFJ1biB0aGVtLgotCi1UaHUgT2N0ICAzIDA5OjU3OjAzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL21uMTAyMDAsIGdhcy9tbjEwMzAwOiBOZXcgZGlyZWN0b3JpZXMgZm9yIE1hdHN1c2hpdGEKLQltbjEwMjAwIGFuZCBtbjEwMzAwIHRlc3RzLgotCi1UdWUgT2N0ICAxIDE1OjM4OjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX3ZlcnNpb24pOiBGaXggZm9yIGN1cnJlbnQgdmVyc2lvbgotCXByaW50aW5nLgotCi1TdW4gU2VwIDI5IDA3OjU1OjU4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zcGxldC5kOiBGaXggdHlwbyBpbiBjcHVzaGEgcmVzdWx0LgotCi1Nb24gU2VwIDIzIDEyOjMzOjMxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvZm1vdmVtbC5zLCBnYXMvbTY4ay9mbW92ZW1sLmQ6IEFkZCB0ZXN0cyBmb3IgZm1vdmVteC4KLQotV2VkIFNlcCAxOCAxMjoxNDowNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9hbGwvY29mZnRhZy5zOiBVc2UgLnAyYWxpZ24gcmF0aGVyIHRoYW4gLmFsaWduLgotCi1GcmkgU2VwIDEzIDE1OjI4OjA0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2g4MzAwL21hY3MuczogQWRkICJzdG1hYyIgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL2g4MzAwL2Jhc2ljLmV4cDogVGVzdCB0aGVtLgotCi1UaHUgU2VwIDEyIDEwOjI4OjQ0IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL2FybS90aHVtYi5zIChiYWNrKTogQ2hlY2sgYXNzZW1ibHkgb2YgVGh1bWIgQkwuCi0KLU1vbiBTZXAgIDkgMTQ6Mzc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9taXBzNC5zLCBnYXMvbWlwcy9taXBzNC5kOiBVc2UgJGZjY04gZm9yIGNvbmRpdGlvbiBjb2RlCi0JcmVnaXN0ZXJzLgotCi1GcmkgU2VwICA2IDE4OjIzOjU0IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL21pcHMvZGxpLntzLGR9OiBNb3JlIHRlc3QgY2FzZXMgYWRkZWQuCi0KLVdlZCBTZXAgIDQgMTE6NDc6MjkgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogQWRkIGNoZWNrIGZvciBkbGkgbWFjcm8gaW5zdHJ1Y3Rpb24uCi0JKiBnYXMvbWlwcy9kbGkue3MsZH06IEFkZGVkLgotCi1TYXQgQXVnIDMxIDAxOjI1OjAzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19tZW0pOiBDaGVjayBiaXQgcGF0dGVybnMgZm9yIHNob3J0Ci0JbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMuICBSZW1vdmUgeGZhaWxzIGZvciBzaG9ydCBsb2FkL3N0b3JlCi0JaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL3Y4NTAvbWVtLnM6IE9mZnNldHMgZm9yIHNob3J0IGxvYWQvc3RvcmUgb3BlcmFuZHMKLQlhcmUgdW5zaWduZWQuCi0KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fYnJhbmNoKTogQ2hlY2sgb2Zmc2V0cyBpbiBicmFuY2ggaW5zbnMuCi0JKGRvX2p1bXBzKTogTGlrZXdpc2UuCi0JCi1GcmkgQXVnIDMwIDAwOjM3OjU1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL3Y4NTAvbWlzYy5zOiBUd2VhayByZWdpc3RlciBudW1iZXJzIGZvciBiZXR0ZXIgdGVzdGluZy4KLQkqIGdhcy92ODUwL2Jhc2ljLmV4cCAoZG9fbWlzYyk6IENvcnJlc3BvbmRpbmcgY2hhbmdlcy4KLQotCSogZ2FzL3Y4NTAvaGlsby5zOiBOZXcgdGVzdGZpbGUuCi0JKiBnYXMvdjg1MC9iYXNpYy5leHA6IFJ1biBoaWxvIHRlc3RzLgotCi1UaHUgQXVnIDI5IDExOjMyOjIzIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL2FybS9hcm03dC5kOiBFeHBsaWNpdGx5IGZvcmNlIGxpdHRsZS1lbmRpYW4gYXNzZW1ibHkuCi0KLUZyaSBBdWcgMjMgMTE6MDI6NTUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21vdmUpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4KLQkqIGdhcy92ODUwL21vdmUuczogVHdlYWsgY29uc3RhbnRzIGZvciBiZXR0ZXIgdGVzdGluZy4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19tZW0pOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4KLQl4ZmFpbCBzc3QgYW5kIHNsZCB0ZXN0cy4KLQkoZG9fbW92KTogUmVtb3ZlIGJvZ3VzIHhmYWlsLgotCSogZ2FzL3Y4NTAvbWVtLnM6IHNzdCBhbmQgc2xkIGluc3RydWN0aW9ucyBjYW4gb25seSBpbmRleCBmcm9tCi0JImVwIiByZWdpc3Rlci4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19sb2dpY2FsKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCi0JVXBkYXRlIGFkZHJlc3Nlcy4KLQkqIGdhcy92ODUwL2xvZ2ljYWwuczogVHdlYWsgY29uc3RhbnRzIGZvciBiZXR0ZXIgdGVzdGluZy4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19qdW1wKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMsCi0JYnV0IG5vdCBkaXNwbGFjZW1lbnRzICh5ZXQpLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2NvbXBhcmUpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucy4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19icmFuY2gpOiBUZXN0IGluc3RydWN0aW9uIGJpdCBwYXR0ZXJucywKLQlidXQgbm90IGRpc3BsYWNlbWVudHMgKHlldCkuCi0JCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2JpdCk6IFRlc3QgaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm5zLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX2FyaXRoKTogVGVzdCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybnMuCQotCSogZ2FzL3Y4NTAvYXJpdGguczogVHdlYWsgY29uc3RhbnRzIGZvciBiZXR0ZXIgdGVzdGluZy4KLQotCSogZ2FzL3Y4NTAvYmFzaWMuZXhwIChkb19taXNjKTogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlcwotCWFzc2VtYmxpbmcgImxkc3IiIGFuZCAic3RzciIgb3Bjb2Rlcy4KLQkqIGdhcy92ODUwL21pc2MuczogUmUtZW5hYmxlIGFzc2VtYmxpbmcgb2YgImxkc3IiIGFuZCAic3RzciIKLQlvcGNvZGVzLgotCi0JKiBnYXMvdjg1MC9iYXNpYy5leHAgKGRvX21pc2MpOiBObyBsb25nZXIgZXhwZWN0IGZhaWx1cmVzCi0JYXNzZW1ibGluZyAidHJhcCIgb3Bjb2Rlcy4KLQkqIGdhcy92ODUwL21pc2MuczogUmUtZW5hYmxlIGFzc2VtYmxpbmcgb2YgInRyYXAiIG9wY29kZXMuCi0KLQkqIGdhcy92ODUwOiBOZXcgZGlyZWN0b3J5IHdpdGggdjg1MCB0ZXN0cy4KLQotRnJpIEF1ZyAxNiAwMDoxOToxMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL3B1cmdlLnM6IFVzZSAiJXNyNCIgb24gcGl0bGIsIHBpdGxiZQotCWZpYyBhbmQgZmljZSBpbnN0cnVjdGlvbnMgdG8gdGVzdCAzYml0IHNwYWNlIGlkZW50aWZpZXJzLgotCSogZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnM6IFNpbWlsYXJseSBmb3IgaWl0bGJhIGFuZAotCWlpdGxicC4KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UaHUgQXVnIDE1IDE2OjI1OjA1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL2FybS9hcm0uZXhwOiBDaGFuZ2UgaW5zdC5zIHRlc3QgdG8gY2hlY2sgb2JqZHVtcC4KLQkqIGdhcy9hcm0vaW5zdC5kOiBBZGRlZC4KLQkKLVRodSBBdWcgMTUgMTY6MDY6MDIgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBnYXMvYXJtL3RodW1iLnM6IEFkZGVkLgotCSogZ2FzL2FybS9pbW1lZC5zOiBBZGRlZC4KLQkqIGdhcy9hcm0vYXJjaDR0LnM6IEFkZGVkLgotCSogZ2FzL2FybS9hcm0uZXhwOiBVcGRhdGVkIHRvIHJ1biB0aGUgbmV3IHRlc3RzLgotCi1UdWUgQXVnICA2IDExOjA2OjI5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2g4MzAwL21pc2NoLnM6IFJlZW5hYmxlICJlZXBtb3YudyIgdGVzdC4KLQkqIGdhcy9oODMwMC9taXNjcy5zOiBMaWtld2lzZS4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IENoZWNrIGZvciBjb3JyZWN0IGFzc2VtYmx5IG9mICJlZXBtb3YudyIKLQlvbiB0aGUgSDgvMzAwSCBhbmQgSDgvUy4gIERvbid0IGV4cGVjdCBpdCB0byBmYWlsLgotCi1XZWQgSnVsIDMxIDEwOjU3OjQ0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9hc2kuczogVXBkYXRlIEFTSV9BU19JRl9VU0VSX3tQUklNQVJZLFNFQ09OREFSWX1fTElUVExFLgotCi1XZWQgSnVsIDMxIDE1OjU1OjEyIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL2FybS9hcm03dC5zOiBBZGRlZC4KLQkqIGdhcy9hcm0vYXJtN3QuZDogQWRkZWQuCi0JKiBnYXMvYXJtL2FybS5leHA6IFVwZGF0ZWQgdG8gcnVuIHRoZSBuZXcgdGVzdC4KLQotTW9uIEp1bCAgOCAxNDoyNzozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL3BjcmVsLmQ6IFJlbmFtZSBmcm9tIHNjaHdhYi5kLgotCSogZ2FzL202OGsvcGNyZWwuczogUmVuYW1lIGZyb20gc2Nod2FiLnMuCi0KLU1vbiBKdWwgIDggMTQ6MjM6MjYgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGdhcy9tNjhrL3NjaHdhYi5kOiBDb3JyZWN0IGZvciBFTEYgZm9ybWF0LgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuICJzY2h3YWIiIHRlc3QgZm9yIGFsbCB0YXJnZXRzLgotCi1UaHUgSnVsICA0IDE0OjIzOjM2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUF2b2lkIERPUyBmaWxlIG5hbWluZyBwcm9ibGVtczoKLQkqIGdhcy9oODMwMC9icmFuY2guczogUmVuYW1lIGZyb20gYnJhbmNoZXMucy4KLQkqIGdhcy9oODMwMC9icmFuY2hoLnM6IFJlbmFtZSBmcm9tIGJyYW5jaGVzaC5zLgotCSogZ2FzL2g4MzAwL2JyYW5jaHMuczogUmVuYW1lIGZyb20gYnJhbmNoZXNzLnMuCi0JKiBnYXMvaDgzMDAvcm90c2guczogUmVuYW1lIGZyb20gcm90c2hpZnQucy4KLQkqIGdhcy9oODMwMC9yb3RzaGguczogUmVuYW1lIGZyb20gcm90c2hpZnRoLnMuCi0JKiBnYXMvaDgzMDAvcm90c2hzLnM6IFJlbmFtZSBmcm9tIHJvdHNoaWZ0cy5zLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1UaHUgSnVsICA0IDE0OjAxOjQ2IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IEFkZCBuZXcgdGVzdHMgZm9yIHByb2Nlc3NvcnMgd2l0aCBpbnRlcmxvY2tzCi0gCW9uIGRpdiBhbmQgbXVsLgotCSogZ2FzL21pcHMvZGl2LWlsb2Nrcy5kOiBBZGRlZC4KLQkqIGdhcy9taXBzL211bC1pbG9ja3MuZDogQWRkZWQuCi0JCi1XZWQgSnVsICAzIDE0OjIwOjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWwgZm9yIGg4MzAwKi0qLSogZm9yIHR3byB0ZXN0cwotCXdoaWNoIG5vdyBwYXNzLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogRml4IHJlZ2V4cCBvZiBtb3YzMmJ1ZyB0ZXN0IHRvIHdvcmsgb24gYSA2NAotCWJpdCBob3N0LgotCi1TYXQgSnVuIDI5IDE4OjIxOjUxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIHZheCotKi12bXMqIGZvciA5MzA1MDlhCi0JdGVzdC4KLQkqIGdhcy92YXgvcXVhZC5leHA6IEV4cGVjdCBhIG5vcCBhZnRlciB0aGUgbW92cS4KLQotVHVlIEp1biAxOCAxMjozOTo0OSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogZ2FzL2g4MzAwL2NicmFuY2hoLnM6IFN3aXRjaCBpbnRvIGg4MzAwaCBtb2RlLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cCAoSDgvMzAwSCBtaXNjIHRlc3RzKTogRml4IHRlc3QgbmFtZXMuCi0KLQkqIGdhcy9oODMwMC97YWRkc3Vicy5zLGJpdG9wczFzLnMsYml0b3BzMnMuc306IE5ldyB0ZXN0cyBmb3IgdGhlCi0JSDgvUy4KLQkqIGdhcy9oODMwMC97Yml0b3BzMy5zLGJpdG9wczQucyxjYnJhbmNocy5zLGxvZ2ljYWxzLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9oODMwMC97YnJhbmNoZXNzLnMsY29tcGFyZXMucyxtYWNzLnMsZGVjaW1hbHMuc306IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL3tpbmNkZWNzLnMsZGl2bXVscy5zLG1pc2NzLnMsbXVsdGlwbGVzLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9oODMwMC97bW92YnMucyxtb3Z3cy5zLG1vdmxzLnMscHVzaHBvcHMuc306IExpa2V3aXNlLgotCSogZ2FzL2g4MzAwL3tyb3RzaGlmdHMucyxleHRlbmRzLnN9OiBMaWtld2lzZS4KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IFJ1biB0aGVtLgotCi1Nb24gSnVuIDEwIDE0OjE0OjQwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9jb2ZmdGFnLnMsIGdhcy9hbGwvY29mZnRhZy5kOiBOZXcgdGVzdCBmb3IgQ09GRiBlbnVtIHRhZwotCXdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIGdsb2JhbCB2YXJpYWJsZS4KLQkqIGdhcy9hbGwvZ2FzLmV4cDogUnVuIGNvZmZ0YWcgdGVzdCBmb3IgYW55IENPRkYgdGFyZ2V0LgotCi1UaHUgSnVuICA2IDEyOjMwOjA1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvYWxsLmV4cDogUGFzcyAtbTY4MDIwIHdoZW4gYXNzZW1ibGluZyB0aGUgZGlzcGVyci5zCi0JdGVzdC4KLQotRnJpIE1heSAzMSAxMDoxMToxMyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9oODMwMC9oODMwMC5leHA6IEZpeCBhZGQubCB0ZXN0IGZvciBIOC8zMDBILgotCi1XZWQgTWF5IDI5IDE2OjM1OjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvamFsLXhnb3QuZDogQ29ycmVjdCBmb3IgNjQgYml0IG91dHB1dC4KLQotVGh1IEFwciAyNSAxOTozMTo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBnYXMvc3BhcmMvc3BhcmMuZXhwOiBPbmx5IHJ1biBzcGFyY2xldCB0ZXN0cyBpZiBzcGFyY2xldC4KLQotV2VkIEFwciAyNCAxNzowNjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL29wNjgwMDAuZDogQWRkIHN0YXRlbWVudHMgbm93IGNhdWdodCBieSBnYXMuCi0KLU1vbiBBcHIgMjIgMTY6NDU6MTIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NwbGV0Lltkc106IE5ldyB0ZXN0cyBmb3Igc3BhcmNsZXQgZXh0ZW5zaW9ucy4KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IFJ1biB0aGVtLgotCi1Nb24gQXByIDE1IDE3OjI1OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGEuZDogVXBkYXRlZCBmb3IgQXByaWwgNSBNSVBTIGFzc2VtYmxlciBjaGFuZ2VzLgotCSogZ2FzL21pcHMvbGIuZCwgZ2FzL21pcHMvbGQuZCwgZ2FzL21pcHMvc2IuZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91bGQuZCwgZ2FzL21pcHMvdWxoLmQsIGdhcy9taXBzL3Vsdy5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL3VzZC5kLCBnYXMvbWlwcy91c2guZCwgZ2FzL21pcHMvdXN3LmQ6IExpa2V3aXNlLgotCi1XZWQgQXByIDEwIDE0OjI3OjUxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2g4MzAwL21vdjMyYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogUnVuIGl0LgotCi1GcmkgQXByICA1IDEwOjEzOjI4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2g4MzAwL3thZGRzdWJoLnMsYml0b3BzMWgucyxiaXRvcHMyaC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97Yml0b3BzM2gucyxiaXRvcHM0aC5zLGJyYW5jaGVzaC5zfTogTmV3IGg4MzAwaCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97Y2JyYW5jaGgucyxjb21wYXJlaC5zLGRlY2ltYWxoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tkaXZtdWxoLnMsaW5jZGVjaC5zLGxvZ2ljYWxoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL3ttaXNjaC5zLG1vdmJoLnMsbW92d2guc306IE5ldyBoODMwMGggdGVzdHMuCi0JKiBnYXMvaDgzMDAve3B1c2hwb3BoLnMscm90c2hpZnRoLnN9OiBOZXcgaDgzMDBoIHRlc3RzLgotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogUnVuIHRoZW0uCi0KLQkqIGdhcy9oODMwMC97bW92Yi5zLG1vdncuc306IENvcnJlY3QgcHJlZGVjcmVtZW50IHN5bnRheC4KLQotCSogZ2FzL2g4MzAwL2g4MzAwLmV4cDogRml4IHR5cG9zIGluIGJpdG9wczQgYW5kIG1vdmIgdGVzdHMuCi0KLQkqIGdhcy9oODMwMC97YWRkc3ViLnMsYml0b3BzMS5zLGJpdG9wczIuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97Yml0b3BzMy5zLGJpdG9wczQucyxicmFuY2hlcy5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL3tjYnJhbmNoLnMsY29tcGFyZS5zLGRlY2ltYWwuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97ZGl2bXVsLnMsaW5jZGVjLnMsbG9naWNhbC5zfTogTmV3IGg4MzAwIHRlc3RzLgotCSogZ2FzL2g4MzAwL3ttaXNjLnMsbW92Yi5zLG1vdncuc306IE5ldyBoODMwMCB0ZXN0cy4KLQkqIGdhcy9oODMwMC97cHVzaHBvcC5zLHJvdHNoaWZ0LnN9OiBOZXcgaDgzMDAgdGVzdHMuCi0JKiBnYXMvaDgzMDAvaDgzMDAuZXhwOiBSdW4gdGhlbS4KLQotRnJpIE1hciAxNSAxNzoxNjoyNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy9zeW50aC5kOiBEb24ndCByZXF1aXJlIHNwYXJjIGluIHRoZSBmaWxlIGZvcm1hdCwgc2luY2UKLQlpdCB3b24ndCBiZSB0aGVyZSBvbiBTdW5PUy4KLQotVGh1IE1hciAgNyAxNDo1MToyMyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3N5bnRoLltkc106IE5ldyB0ZXN0Y2FzZS4KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IFJ1biBpdC4KLQotRnJpIE1hciAgMSAxMjowMTo0OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogeGZhaWwgZGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkIHN5bWJvbHMKLQlhbmQgZGlmZmVyZW5jZSBvZiBmb3J3YXJkIHJlZmVyZW5jZXMgZm9yIHRoZSBoODMwMC4KLQotVGh1IEZlYiAyMiAxNjo0MDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL2xiLXhnb3QuZDogQ29ycmVjdC4KLQotTW9uIEZlYiAxOSAwMjo0MzozNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3thc2ksbWVtYmFyLHByZWZldGNoLHJkcHIsc3ludGg2NCx3cnByfS5kOiBQYXNzIC1BdjkKLQl0byBnYXMuCi0JKiBnYXMvc3BhcmMvYWRkZW5kLmV4cDogRXhlY3V0ZSBmb3IgYW55IHNwYXJjIGNwdS4KLQkqIGdhcy9zcGFyYy97bWlzbWF0Y2guZXhwLG1pc20tMS5zfTogTmV3IHRlc3QuCi0KLVdlZCBGZWIgMTQgMTM6NDk6NTkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9qYWwteGdvdC5kLCBnYXMvbWlwcy9sYS14Z290LmQ6IE5ldyB0ZXN0cy4KLQkqIGdhcy9taXBzL2xiLXhnb3QuZCwgZ2FzL21pcHMvbGQteGdvdC5kOiBOZXcgdGVzdHMuCi0JKiBnYXMvbWlwcy9saWYteGdvdC5kLCBnYXMvbWlwcy91bGgteGdvdC5kOiBOZXcgdGVzdHMuCi0JKiBnYXMvbWlwcy9taXBzLmV4cDogUnVuIG5ldyB0ZXN0cyBpZiBzdnI0cGljLgotCi1TYXQgSmFuIDI3IDEzOjI3OjQ1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRnLmV4cCAoZ2FzLWRnLXRlc3QpOiBEZWxldGUgZGVmYXVsdF9mbGFncyBhbmQgbGlicyBhcmdzLgotCi1GcmkgSmFuIDI2IDE0OjI0OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBVcGRhdGUgZm9yIG9iamR1bXAgY2hhbmdlcy4KLQotV2VkIEphbiAxMCAxMjo0MDozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzLyouZDogVXBkYXRlIGZvciBjaGFuZ2VzIHRvIGRpc2Fzc2VtYmxlci4KLQotV2VkIEphbiAgMyAyMjo1OTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3VsaC1zdnI0cGljLmQ6IFVwZGF0ZSBmb3IgdGMtbWlwcy5jIGxvYWRfYWRkcmVzcwotIAljaGFuZ2UuCi0KLUZyaSBOb3YgMTcgMTA6MzI6MjUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2ltbWNvbnN0LmQ6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gaXQuCi0JKiBnYXMvbXJpL2NvbnN0YW50cy5zOiBUZXN0IGltbWVkaWF0ZSBjb25zdGFudHMuCi0JKiBnYXMvbXJpL2NvbnN0YW50cy5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotCSogZ2FzL202OGsvbGluay5zOiBBZGQgbm9wIHRvIHBhZCB0byBlaWdodCBieXRlIGJvdW5kYXJ5LgotCSogZ2FzL202OGsvbGluay5kOiBDb3JyZXNwb25kaW5nIGNoYW5nZS4KLQotU3VuIE5vdiAxMiAyMToyODoxMSAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2JybGVuYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLVN1biBOb3YgIDUgMTI6NDk6MjcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9iZXEuczogRGVjbGFyZSB0ZXh0X2xhYmVsIGdsb2JhbC4KLQkqIGdhcy9taXBzL2phbC5zOiBMaWtld2lzZS4KLQotRnJpIE5vdiAgMyAxMjozNTowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tNjhrL2xpbmsuczogVXNlICImIiBpbnN0ZWFkIG9mICIjIiBmb3IgaW1tZWRpYXRlIHZhbHVlcy4KLQotCSogZ2FzL202OGsvZm1vdmVtbC5zLCBnYXMvbTY4ay9mbW92ZW1sLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIGl0LgotCi1UaHUgTm92ICAyIDIzOjExOjA1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL202OGsvbGluay5zLCBnYXMvbTY4ay9saW5rLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIGl0LgotCi1UdWUgT2N0IDI0IDEwOjU3OjIwIDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBUZXN0IGxjaSBhbmQgc3luY2RtYSBpbnN0cnVjdGlvbnMuCi0JKiBnYXMvaHBwYS9iYXNpYy9zeXN0ZW0uczogQ29ycmVzcG9uZGluZyBjaGFuZ2VzLgotCi1GcmkgT2N0ICA2IDE3OjEzOjM1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5kOiBEb24ndCByZXF1aXJlIGEgZml4ZWQgbnVtYmVyIG9mIGxlYWRpbmcKLQl6ZXJvcyBpbiBhbnkgbnVtYmVyLgotCi0JKiBnYXMvbTY4ay9vcGVyYW5kcy5zLCBnYXMvbTY4ay9iaXRmaWVsZC5zOiBVc2UgIiYiIGluc3RlYWQgb2YgIiMiCi0JZm9yIGltbWVkaWF0ZSB2YWx1ZXMuCi0KLUZyaSBPY3QgIDYgMTA6NTQ6MTMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FybS9hcm0uZXhwOiBSZW5hbWVkIGZyb20gZ2FzLmV4cC4KLQkqIGdhcy9hcm0vbGUtZnBjb25zdC5bc2RdOiBOZXcgdGVzdGNhc2UuCi0KLUZyaSBTZXAgMjkgMTU6MTI6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL21yaS5leHA6IE9ubHkgcnVuIHRlc3RzIGZvciBtNjhrIHRhcmdldC4KLQotTW9uIFNlcCAyNSAxMjozMTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBhcm0qLSotKiBmb3IgY29uc3RhbnRzCi0JdGVzdC4KLQotVGh1IFNlcCAyMSAwMToyNjowOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL3NoL2ZwLnMgKGZtYWMpOiBVcGRhdGUgZm9yIG5ldyBhc3NlbWJseSBzeW50YXguCi0KLU1vbiBTZXAgMTggMTQ6MDQ6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChnYXNfcnVuKTogQ2FsbCBwcnVuZV9zeXN0ZW1fY3J1ZC4KLQkocnVuX2R1bXBfdGVzdCwgb2JqZHVtcCk6IExpa2V3aXNlLgotCi1UaHUgU2VwIDE0IDEzOjEwOjEwIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy97d3Jkci5bZHNdLHJkcHIuW2RzXX06IE5ldyB0ZXN0cy4KLQkqIGdhcy9zcGFyYy9zcGFyYy5leHA6IFJ1biB0aGVtLgotCi1XZWQgU2VwIDEzIDE2OjM1OjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogUmVtb3ZlOyB0aGUgdGVzdHN1aXRlIGlzIG5vdyBydW4KLQlkaXJlY3RseSBmcm9tIHRoZSBnYXMgTWFrZWZpbGUuCi0KLU1vbiBTZXAgMTEgMTE6NDQ6MjMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2VtcHR5LnM6IE5ldyBmaWxlLgotCSogZ2FzL21yaS9tcmkuZXhwOiBUZXN0IGFzc2VtYmxpbmcgZW1wdHkucy4KLQkqIGdhcy9tcmkvY29tbWVudC5zOiBBZGQgYSBjb3VwbGUgbW9yZSBjb21tZW50IHZhcmlhbnRzLgotCi0JKiBnYXMvbXJpL21yaS5leHA6IEFkZCB4ZmFpbCBmb3IgdGhlIGV4cHIgdGVzdCBmb3IgYWxsIGhwcGEKLQl0YXJnZXRzLgotCi1XZWQgU2VwICA2IDIxOjM5OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9jb21tZW50LnMsIGdhcy9tcmkvY29tbWVudC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvbXJpLmV4cDogUnVuIGl0LgotCSogZ2FzL21yaS9leHByLnM6IFJlbW92ZSB3aGl0ZXNwYWNlIGluIG9wZXJhbmQgZmllbGQuCi0JKiBnYXMvbXJpL2Zvci5zOiBBZGQgY29tbWVudHMgZm9yIGZ1cnRoZXIgdGVzdGluZy4KLQkqIGdhcy9tYWNyb3MvdGVzdDIuczogUHV0IGluIGFuIHVwcGVyIGNhc2UgRUxTRSB0byB0ZXN0IGNhc2UKLQlpbnNlbnNpdGl2aXR5LgotCi1XZWQgQXVnIDMwIDE2OjEyOjAzIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9zcGFyYy97cHJlZmV0Y2guW2RzXSxzeW50aDY0Lltkc119OiBOZXcgdGVzdHMuCi0KLVR1ZSBBdWcgMjkgMTg6NTk6MzMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZ2FzL3NwYXJjL3NwYXJjLmV4cDogTmV3IGZpbGUuCi0JKiBnYXMvc3BhcmMve2FzaS5bZHNdLG1lbWJhci5bZHNdfTogTmV3IHRlc3RzLgotCi1Nb24gQXVnIDIxIDE0OjM5OjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21hY3Jvcy8qOiBOZXcgdGVzdHMgZm9yIG1hY3Jvcy4KLQotCSogZ2FzL21yaS9jb21tb24uczogVXNlIGRhdGEsIG5vdCAuZGF0YS4KLQotCSogZ2FzcC9wbDMub3V0OiBVcGRhdGUgZm9yIGNoYW5nZXMgaW4gY29tbWVudGVkIHNvdXJjZSBvdXRwdXQgd2hlbgotCUxPQ0FMIGlzIHVzZWQuCi0KLVNhdCBBdWcgMTkgMTc6MzY6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXNwL2dhc3AuZXhwIChnYXNwX3Rlc3QpOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkIG9uIHRoZSBvdXRwdXQKLQlvZiBkaWZmLgotCSogbGliL2dhcy1kZWZzLmV4cDogRGVmaW5lIHBydW5lX3N5c3RlbV9jcnVkIGlmIGl0IGlzIG5vdCBhbHJlYWR5Ci0JZGVmaW5lZC4KLQotRnJpIEF1ZyAxOCAxMTowOTozOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhc3AvbXJpLyoub3V0OiBVc2UgOywgbm90ICEsIGZvciB0aGUgY29tbWVudCBjaGFyYWN0ZXIuCi0KLVdlZCBBdWcgMTYgMTI6MjQ6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL21yaS5leHA6IENoYW5nZSBocHBhKi0qLSogZXhwZWN0ZWQgZmFpbHVyZXMgdG8gb25seQotCWV4cGVjdCBmYWlsdXJlIGZvciB0YXJnZXRzIHdoaWNoIHVzZSBTT00uCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBJZiB0aGUgcHJvZ3JhbSB0byBydW4gZG9lcyBub3QKLSAgICAgICAgZXhpc3QsIG1hcmsgdGhlIHRlc3QgYXMgdW50ZXN0ZWQuCi0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBpOTYwIGIub3V0IHRhcmdldHMgZm9yCi0JY29tbW9uIHRlc3QuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBOYW1lIHRoZSBvdXRwdXQgZmlsZSBkdW1wLm8sCi0JcmF0aGVyIHRoYW4gdXNpbmcgYW4gaW1wbGljaXQgYS5vdXQuCi0KLQkqIGdhcy9tcmkvZm9yLnM6IEFkZCBub3AgdG8gcm91bmQgb3V0IHRvIGZvdXIgYnl0ZSBib3VuZGFyeS4KLQkqIGdhcy9tcmkvcmVwZWF0LnM6IExpa2V3aXNlLgotCSogZ2FzL21yaS93aGlsZS5zOiBMaWtld2lzZS4KLQkqIGdhcy9tcmkvZm9yLmQ6IEV4cGVjdGVkIGFkZGVkIG5vcC4KLQkqIGdhcy9tcmkvcmVwZWF0LmQ6IExpa2V3aXNlLgotCSogZ2FzL21yaS93aGlsZS5kOiBMaWtld2lzZS4KLQotCSogZ2FzL21pcHMvKi5kOiBDaGFuZ2UgYWxsIHRlc3QgbmFtZXMgdG8gc2F5IE1JUFMuCi0KLVR1ZSBBdWcgMTUgMTU6NDI6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpL2Zvci5kLCBnYXMvbXJpL2Zvci5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvaWYuZCwgZ2FzL21yaS9pZi5zOiBOZXcgdGVzdC4KLQkqIGdhcy9tcmkvcmVwZWF0LmQsIGdhcy9tcmkvcmVwZWF0LnM6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS93aGlsZS5kLCBnYXMvbXJpL3doaWxlLnM6IE5ldyB0ZXN0LgotCSogZ2FzL21yaS9tcmkuZXhwOiBSdW4gdGhlIG5ldyB0ZXN0cy4KLQotTW9uIEF1ZyAxNCAxNjowMzowNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvZXhwci5kOiBQZXJtaXQgbGVhZGluZyB6ZXJvZXMsIGluIGNhc2Ugd2UncmUgdXNpbmcgYQotICAgICAgICA2NC1iaXQgQkZELgotCi0JKiBnYXNwL21yaS8qOiBOZXcgdGVzdHMuCi0JKiBnYXNwL2dhc3AuZXhwOiBSdW4gdGhlbS4gIEFsc28sIGNsZWFuIHVwIHRoZSB0ZXN0IG5hbWVzIHVzZWQgaW4KLQlwYXNzIGFuZCBmYWlsLgotCi1TdW4gQXVnIDEzIDAwOjM5OjI0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvc2gvYmFzaWMuZXhwOiBVcGRhdGUgbm93IHRoYXQgd2Uga25vdyB0aGUgcmlnaHQKLQliaXQgcGF0dGVycyBmb3IgdGhlIG5ldyBzdHMgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgQXVnIDEwIDAwOjQ2OjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9jaGFyLmQ6IEZpeCBmb3IgbGl0dGxlIGVuZGlhbiBtYWNoaW5lcy4KLQkqIGdhcy9tcmkvZmxvYXQuZDogTGlrZXdpc2UuCi0KLVdlZCBBdWcgIDkgMTU6MzQ6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL3N0cnVjdC5zLCBnYXMvYWxsL3N0cnVjdC5kOiBOZXcgdGVzdC4KLQkqIGdhcy9hbGwvZ2FzLmV4cDogUnVuIGl0LgotCi1UdWUgQXVnICA4IDE3OjExOjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ2FzL21yaS9jb21tb24ucywgZ2FzL21yaS9jb21tb24uZDogTmV3IHRlc3QuCi0JKiBnYXMvbXJpL21yaS5leHA6IFJ1biBpdC4KLQotTW9uIEF1ZyAgNyAyMjozOToyOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9tcmkvbXJpLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBhMjlrKi0qLSogZm9yIGNvbnN0YW50cwotCXRlc3QuCi0KLQkqIGdhc3AvY3Jhc2gxLm91dCwgZ2FzcC9tYWNyby5vdXQsIGdhc3Avc2Z1bmMub3V0OiBDb21wbGV0ZQotCXRydW5jYXRlZCBmaWxlcywgc28gdGhhdCB0aGUgdGVzdHMgcGFzcy4KLQotCSogZ2FzL21yaS9tcmkuZXhwOiBBZGQgc2V0dXBfeGZhaWwgZm9yIGhwcGEqLSotKiBmb3IgZXF1LAotCWNvbnN0YW50cywgYW5kIGV4cHIuCi0KLQkqIGdhcy9tNjhrL2FsbC5leHA6IFJ1biBzY2h3YWIgdGVzdCBvbiBocHV4Kiwgbm90IGp1c3QgaHB1eC4gIFJ1bgotCW9uIHZ4d29ya3MqLCBub3QganVzdCB2eHdvcmtzNS4xLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChmYWlsX3BoYXNlLCBwYXNzX3BoYXNlKTogUmVtb3ZlLgotCShydW5fZHVtcF90ZXN0KTogSnVzdCBjYWxsIHBhc3Mgb3IgZmFpbC4KLQotCSogZ2FzL202OGsvb3BlcmFuZHMucywgZ2FzL202OGsvb3BlcmFuZHMuZDogTmV3IHRlc3QuCi0JKiBnYXMvbTY4ay9vcDY4MDAwLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvY2FzLnMsIGdhcy9tNjhrL2Nhcy5kOiBOZXcgdGVzdC4KLQkqIGdhcy9tNjhrL2JpdGZpZWxkLnMsIGdhcy9tNjhrL2JpdGZpZWxkLmQ6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvc2Nod2FiLmQ6IFJ1biBvYmpkdW1wIHdpdGggLWogLnRleHQuICBBZGp1c3QgZm9yCi0JY2hhbmdlcyB0byBkaXNhc3NlbWJsZXIuCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gbmV3IHRlc3RzLiAgUnVuIHNjaHdhYiB0ZXN0IGZvcgotCW02OGstKi1jb2ZmKi4KLQotTW9uIEF1ZyAgNyAwMzowMTozMiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL3NoLyo6IE5ldyB0ZXN0cyBmb3IgdGhlIGhpdGFjaGktc2guCi0KLVR1ZSBBdWcgIDEgMTg6MDI6NDcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnYXMvbXJpLyo6IE5ldyB0ZXN0cyBmb3IgTVJJIG1vZGUuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBTdXBwb3J0IHVzaW5nIG9iamNvcHkuICBEdW1wCi0JcHJvZ3JhbSBleGVjdXRpb25zIHRvIHRoZSBsb2cgZmlsZSBiZWZvcmUgcnVubmluZyB0aGVtLiAgVXNlIHRoZQotCXNpbXBsZSBwcm9ncmFtIG5hbWUsIHJhdGhlciB0aGFuIHRoZSBwYXRoIHRvIHRoZSBiaW5hcnkgYmVpbmcgcnVuLAotCWluIHBhc3MvZmFpbCBtZXNzYWdlcy4KLQkocmVnZXhwX2RpZmYpOiBJZiB0aGUgcmVnZXhwIGZpbGUgaGFzIHRoZSBzcGVjaWFsIGNvbW1lbnQgI3Bhc3MsCi0Jc3RvcCBjaGVja2luZyBhdCB0aGF0IHBvaW50LgotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBTZXQgTk0sIE5NRkxBR1MsIE9CSkNPUFksIGFuZCBPQkpDT1BZRkxBR1MsCi0JaWYgdGhleSBhcmUgbm90IGFscmVhZHkgc2V0LgotCi1UdWUgQXVnICAxIDExOjQxOjMwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZW1vdmUgc3VwZXJmbHVvdXMgcnVudGVzdCBnYXNwLgotCi1Nb24gSnVsIDMxIDE4OjE5OjI2IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLSAJKiBnYXNwLyo6IE5ldy4KLQkqIE1ha2VmaWxlLmluOiBVc2UgZ2FzcCB0ZXN0cy4KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogQWRkIGdhc3Agc3R1ZmYuCi0KLVRodSBKdWwgMjAgMTg6NTY6NDggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRGlzYWJsZSB0ZXN0cyB0aGF0IGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yCi0JdGhlIFBBLgotCi1UaHUgSnVsIDEzIDE4OjIyOjQ5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gc2Nod2FiIHRlc3QgZm9yIG02OGsgdnh3b3JrczUuMS4KLQotV2VkIEp1biAyMSAyMToyODo1NyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvbTY4ay9zY2h3YWIuKjogTmV3IHRlc3QgYmFzZWQgb24gYSB0ZXN0IGNhc2UgZnJvbSBBbmRyZWFzCi0JU2Nod2FiLgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIGl0IGZvciBzb21lIGFvdXQgY29uZmlndXJhdGlvbnMuCi0KLU1vbiBKdW4gMTIgMjI6Mjc6MTggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9wYXJzZS9wYXJzZS5leHA6IFJ1biBpdC4KLQotU3VuIE1heSAyMSAyMDoyNjoxOCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBEaXNhYmxlIGFsaWduNCB0ZXN0cyBmb3IKLQlFTEYgdGFyZ2V0cy4KLQotV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykJCi0KLQkqIGFybS9hcm03ZG0uczogTmV3IGZpbGUgLS0gdGVzdHMgZm9yIEFSTTdETSBpbnN0cnVjdGlvbnMuCi0JKiBhcm0vYXJtNi5zOiBDb3JyZWN0IGJvZ3VzIHRlc3RzLgotCSogYXJtL2dhcy5leHAgKGFybTYucyk6IElzIG5vdyBhIHZhbGlkIHRlc3QuCi0JKGFybTdkbS5zKTogTmV3IHRlc3QuCi0JKiBhcm0vZmxvYXQuczogQWRkIGxvYWQvc3RvcmUgbXVsdGlwbGUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24gCi0JdGVzdHMuCi0KLVdlZCBNYXkgIDMgMTM6MTQ6NDQgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLVR1ZSBNYXkgIDIgMTY6Mzc6NDggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGQuZDogTW9kaWZpZWQgZm9yIGdhcyBkZWxheS1zbG90IGZpeGVzLgotCi1TYXQgQXByIDI5IDIzOjM1OjE4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZy5leHA6IE5ldyBmaWxlLgotCi1UdWUgQXByIDExIDEzOjU3OjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHM0LmQ6IEFsbG93IG1vcmUgdGhhbiBleGFjdGx5IDggemVyb3MgaW4gYmMxKgotCXRhcmdldHMuCi0KLU1vbiBBcHIgMTAgMTU6MzY6MzkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocGFzc19waGFzZSk6IE5ldyBwcm9jLgotCShydW5fZHVtcF90ZXN0KTogTm90ZSBwYXNzaW5nIG9yIGZhaWxpbmcgb2YgZWFjaCBwaGFzZSBvZiB0aGlzCi0JdGVzdCwgaW5zdGVhZCBvZiBmYWlsdXJlIG9mIHBoYXNlcyBvciBwYXNzaW5nIG9mIGNvbXBsZXRlIHRlc3QuCi0JRW5zdXJlIHRlc3QgZmlsZSBuYW1lIGlzIGluIHJlcG9ydGVkIG1lc3NhZ2UuCi0KLVNhdCBBcHIgIDggMTI6NDY6MzMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChydW5fZHVtcF90ZXN0KTogSGFuZGxlIGFyZ3VtZW50cyB3aXRoIHBhdGhzLgotCUFsd2F5cyByZXNvbHZlIHRlc3RjYXNlIHN0YXR1cyBiZWZvcmUgcmV0dXJuaW5nLgotCUlmIGBzbHVycF9vcHRpb25zJyBmYWlscywgcmV0dXJuIGFuZCBkb24ndCBkbyB0ZXN0LgotCShzbHVycF9vcHRpb25zKTogRml4ICJjYW4ndCBvcGVuIiBlcnJvciBtZXNzYWdlLgotCVJldHVybiAtMSB0byBpbmRpY2F0ZSBlcnJvci4KLQotTW9uIE1hciAyMCAyMjo0NTozMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLUZyaSBNYXIgMTAgMTk6MDc6MDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL2g4MzAwL2ZmeHgxLnM6IEFkZCAud29yZCAwIGF0IHRoZSBlbmQgdG8gZWxpbWluYXRlCi0JdW5jZXJ0YWludHkgYXMgdG8gd2hldGhlciB0aGVyZSBzaG91bGQgYmUgdHJhaWxpbmcgYnl0ZXMgaW4gdGhlCi0Jb3V0cHV0IGZpbGUuCi0JKiBnYXMvaDgzMDAvZmZ4eDEuZDogQWRqdXN0IHJlbG9jIHZhbHVlcyB0byBwZXJtaXQgYW4gYWRkZW5kIHZhbHVlCi0Jb2YgMHgwMDAwMDAwMGZmZmZmZmZmIG9uIDY0LWJpdCBob3N0cy4gIChJJ20gbm90IHN1cmUgaWYgdGhpcyBpcwotCWNvcnJlY3QuKSAgRW5kIHdpdGggIi4uLiIgdG8gbWF0Y2ggdHJhaWxpbmcgemVybyBieXRlcy4KLQotV2VkIE1hciAgOCAxNTo1MDozNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL21pcHM0LmQsIGdhcy9taXBzL21pcHM0LnM6IE5ldyBmaWxlcy4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gbmV3IHRlc3QuCi0KLVRodSBGZWIgMjMgMTc6NTg6NTAgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zOiBBZGQgaW5kZXhpbmcgdmFyaWFudHMuCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFRlc3QgdGhlbS4KLQotV2VkIEZlYiAxNSAxNTo0MzoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL3VsZC5kOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL3VsZC5zOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL3VzZC5kOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL3VzZC5zOiBOZXcgZmlsZS4KLQkqIGdhcy9taXBzL21pcHMuZXhwOiBSdW4gbmV3IHRlc3RzLgotCi1UaHUgRmViICA5IDEwOjU3OjM5IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAoZG9fYXBwbHlidWdfdGVzdCk6IFJ1biBpdC4KLQotVGh1IEZlYiAgMiAwMDozNDo1NSAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIGdhcy9ocHBhL3JlbG9jL3BpY3JlbG9jLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChkb19waWNfcmVsb2NhdGlvbl90ZXN0KTogUnVuIGl0LgotCi1GcmkgSmFuIDI3IDE0OjAyOjAyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9oODMwMC9mZnh4MS5kLCBnYXMvaDgzMDAvZmZ4eDEucywgZ2FzL2g4MzAwL2NtcHNpMi5zLAotCWdhcy9oODMwMC9oODMwMC5leHA6IE5ldyB0ZXN0cy4KLQotTW9uIEphbiAyMyAyMTo0NDoyNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwIChkb19zeXN0ZW0pOiBVcGRhdGUuCi0KLVdlZCBKYW4gMTEgMTc6MjA6MjUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbWlwcy5leHA6IERvbid0IHJ1biB0aGUgbWVtb3J5LWFjY2VzcyB0ZXN0cyBpZiB0aGUKLQlmb3JtYXQgaXMgYS5vdXQsIGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBjb2RlIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQKLQlpcyB1c2VkIHdpdGggb3RoZXIgZm9ybWF0cy4KLQotVHVlIEphbiAxMCAxMTo0MjoxMyAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIChhbGlnbjQucyk6IEZpeCBnbGl0Y2ggaW4KLQlyZWdleHAgdG8gYXZvaWQgbG9zaW5nIHdpdGhvdXQgYSBjb250cm9sbGluZyB0dHkuCi0KLUZyaSBEZWMgMzAgMTg6MDg6MjAgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL2kzODYvcHVzaHcubDogRml4ZWQgd2hpdGVzcGFjZSB0byBtYXRjaCBjdXJyZW50IGxpc3RpbmcKLQlzdHlsZS4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBNYXJrIHRlc3QgcDE0ODAucyBleHBlY3RlZCB0byBwYXNzLCBldmVuIHdpdGgKLQlsaXN0aW5ncyBlbmFibGVkLgotCi1UaHUgRGVjIDE1IDE4OjE0OjI3IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBU19GT1JfVEFSR0VULCBPQkpEVU1QX0ZPUl9UQVJHRVQpOiBEb24ndCBzZXQuCi0JKHVuaW5zdGFsbCk6IERvbid0IHNldCBPQkpEVU1QIGFuZCBPQkpEVU1QRkxBR1MgaW4gc2l0ZS5leHAuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IERlZmF1bHQgT0JKRFVNUCBhbmQgT0JKRFVNUEZMQUdTLiAgVXNlCi0JZmluZGZpbGUgYW5kIHRyYW5zZm9ybSBwcm9jZWR1cmVzIHRvIGRldGVybWluZSBvYmpkdW1wIHByb2dyYW0KLQluYW1lLgotCi0JKiBnYXMvbWlwcy9hYnMucywgZ2FzL21pcHMvZGl2LnM6IEZvcmNlIHNvbWUgcGFkZGluZyBhdCB0aGUgZW5kLAotCWluIGNhc2UgdGhlIGZvcm1hdCBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgcmVxdWlyZSBpdC4KLQkqIGdhcy9taXBzL2JlcS5kLCBnYXMvbWlwcy9qYWwuZDogSGFuZGxlIE1JUFNfSk1QIGFzIGFuIGFsdGVybmF0ZQotCW5hbWUgZm9yIHRoZSByZWxvYyB0eXBlLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChmaWxlX2NvbnRlbnRzLCB2ZXJib3NlX2V2YWwpOiBOZXcgcHJvY3MuCi0JKHJ1bl9kdW1wX3Rlc3QpOiBJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgb3ZlciAzLCBwcmludCBvdXQgZHVtcAotCWNvbW1hbmQgYW5kIGl0cyBvdXRwdXQuCi0KLVR1ZSBEZWMgMTMgMTg6MjE6MDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy9qYWwtc3ZyNHBpYy5kOiBGaXggMC1zdHJpbmdzIHRvIHdvcmsgd2l0aCA2NC1iaXQgaG9zdGVkCi0JZGlzYXNzZW1ibHkuCi0KLUZyaSBEZWMgIDkgMTk6NTQ6MDQgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogZ2FzL2FsbC9nYXMuZXhwIChjb21tZW50LnMgdGVzdCk6IE1ha2UgdGhlICJcciIgb3B0aW9uYWwsIHNpbmNlCi0JaXQgZGVwZW5kcyBvbiB0dHkgbW9kZXMuCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKGdhc19zdGFydCk6IFRyeSB1c2luZyAtbm90dHljb3B5IGluc3RlYWQgb2YKLQktbm90dHlpbml0LgotCi0JKiBnYXMvYXJtL2dhcy5leHA6IFRoZSBhcm02IHRlc3Qgc2hvdWxkIHJlcG9ydCBlcnJvcnMsIGZvciBub3cuCi0KLVRodSBEZWMgIDggMjA6MTk6MDkgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliL2dhcy1kZWZzLmV4cDogVXNlIC1pIGluIGV4cGVjdF9hZnRlciBjb21tYW5kLgotCi1XZWQgRGVjICA3IDE2OjQ5OjE0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGdhcy9taXBzL211bC5kLGphbC5kOiBGaXggMC1zdHJpbmdzIHRvIHdvcmsgd2l0aCA2NC1iaXQgaG9zdGVkCi0JZGlzYXNzZW1ibHkuCi0KLQkqIGdhcy9pZWVlLWZwOiBSZW5hbWVkIGZyb20gaWVlZS5mcC4KLQotCSogbGliL2dhcy1kZWZzLmV4cDogTWFrZSBzdXJlIHRpbWVvdXQgaXMgYXQgbGVhc3QgMiBtaW51dGVzLgotCi1XZWQgTm92IDMwIDEwOjQ4OjAwIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9wYXJzZTogUmVuYW1lZCBmcm9tIGdhcy9ocHBhL21vcmUucGFyc2UuCi0KLU1vbiBOb3YgMjggMDA6NDA6MjYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwIChub3N1YnNwYWNlLnMpOiBObyBsb25nZXIgZXhwZWN0ZWQKLQl0byBmYWlsLiAgRml4IGNvbW1lbnRzIGZvciB0aGUgdGVzdC4gIFR3ZWFrIHRlc3QgbmFtZS4KLQotVHVlIE5vdiAyMiAyMzozODoyMCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBNaW5vciB0d2Vha3MgdG8gbWF0Y2ggY3VycmVudCBQQSBFTEYKLQlvdXRwdXQuIAotCi1GcmkgTm92IDE4IDE3OjU2OjU3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZ2FzL21pcHMvbGQuZDogQWRqdXN0IHRvIHdvcmsgZm9yIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuCi0JY29kZS4KLQkqIGdhcy9taXBzL2xkLnMsIGdhcy9taXBzL2xpZi1lbXBpYy5kOiBMaWtld2lzZS4KLQkqIGdhcy9taXBzL2xpZmxvYXQuZCwgZ2FzL21pcHMvdWxoLWVtcGljLmQ6IExpa2V3aXNlLgotCSogZ2FzL21pcHMvdWxoLmQsIGdhcy9taXBzL3Vsdy5kLCBnYXMvbWlwcy91c2guZDogTGlrZXdpc2UuCi0JKiBnYXMvbWlwcy91c3cuZDogTGlrZXdpc2UuCi0KLVR1ZSBOb3YgMTUgMTE6MDk6NTcgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2FsaWduNC5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAgKGltcG9ydGJ1Zyk6IFR3ZWFrIHRvIG1hdGNoCi0JY3VycmVudCBleHBlY3RlZCBQQSBFTEYgb3V0cHV0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwIChkb19yX25vX3JlbG9jKTogTGlrZXdpc2UuCi0JKGRvX3BsYWJlbF9yZWxvY2F0aW9uX3Rlc3QpOiBMaWtld2lzZS4KLQotVGh1IE5vdiAgMyAxODoxNDowOSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnYXMvYWxsL3AxNDgwLnM6IFVzZSBsYXJnZXIgY29uc3RhbnQsIHNvIGV4cHJlc3Npb24gY2FuIGhhdmUgYQotCXBvc2l0aXZlIHZhbHVlLgotCSogZ2FzL2FsbC9nYXMuZXhwOiBFeHBlY3QgcDE0ODAucyB3aXRob3V0IGxpc3RpbmdzIHRvIHBhc3MuCi0KLVRodSBOb3YgIDMgMTU6NDM6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBnYXMvbWlwcy91bGguZCwgZ2FzL21pcHMvdWx3LmQsIGdhcy9taXBzL3VzaC5kLCBnYXMvbWlwcy91c3cuZDoKLQlDb3JyZWN0IHRlc3QgY2FzZXMuCi0KLVRodSBPY3QgMjAgMDA6NTU6MTMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL2JsZWJ1ZzMuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotTW9uIE9jdCAxNyAwMjozMzo1MyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1TdW4gT2N0IDE2IDIyOjI1OjU2IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKHJfbm9fcmVsb2MpOiBUd2VhayBvdXRwdXQgdG8gbWF0Y2gKLQljdXJyZW50IHJlYWxpdHkuCi0KLVdlZCBTZXAgMjggMjE6MjE6MzQgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlZHVjZS5zOiBSZW5hbWVkIGZyb20gcmVsb2NyZWR1Y2UucwotCSogZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zOiBSZW5hbWVkIGZyb20gcmVsb2NyZWR1Y2UyLnMKLQkqIGdhcy9ocHBhL3JlbG9jL3Jfbm9fcmVsb2MuczogUmVuYW1lZCBmcm9tIHJfbm9fcmVsb2NidWcucwotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCi1XZWQgU2VwIDI4IDEzOjI1OjEwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZ2FzL21pcHMvYmVxLmQsIGdhcy9taXBzL2JlcS5zOiBUZXN0IHRoYXQgdW5jb25kaXRpb25hbCBicmFuY2gKLQlvdmVyZmxvd3MgYXJlIGNvcnJlY3RseSBjb252ZXJ0ZWQgdG8ganVtcHMuCi0KLU1vbiBTZXAgMjYgMTc6NDE6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBnYXMvbWlwczogQWRkIHRlc3QgY2FzZXMgZm9yIFBJQyBjb2RlLCBib3RoIFNWUjQgc3R5bGUgYW5kCi0JLW1lbWJlZGRlZC1waWMgc3R5bGUuCi0KLUZyaSBTZXAgMjMgMTQ6NDU6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBnYXMvbWlwczogTmV3IGRpcmVjdG9yeSB3aXRoIE1JUFMgc3BlY2lmaWMgdGVzdCBjYXNlcy4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAocnVuX2R1bXBfdGVzdCk6IFBlcm1pdCB0aGUgLmQgZmlsZSB0byBzcGVjaWZ5Ci0JdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGFzc2VtYmxlLgotCShyZWdleHBfZGlmZik6IFB1dCB0aGUgcmVhc29uIGZvciBmYWlsdXJlIGluIHRoZSBsb2cgZmlsZS4KLQotV2VkIFNlcCAyMSAxMzo0NDoyMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxpYi9nYXMtZGVmcy5leHA6IERvbid0IHRyeSB0byB1c2Ugc2hlbGwgcmVkaXJlY3Rpb24sIHNpbmNlIFRDTAotCWRvZXNuJ3Qgc3VwcG9ydCBpdC4gIFJlZGlyZWN0IHN0ZG91dCB1c2luZyA+IGluc3RlYWQgb2YgMT4sIGFuZAotCWRvbid0IGJvdGhlciB0byByZWRpcmVjdCBzdGRlcnIgc2luY2UgVENMIHJlZGlyZWN0cyBpdCBhbnlob3cuCi0JKHJ1bl9kdW1wX3Rlc3QpOiBQYXNzIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyB0byBwcm9ncmFtLCBkZWZhdWx0aW5nCi0JdG8gLXIuCi0KLVNhdCBTZXAgMTcgMDE6MDQ6NTYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzL3ZheDogTmV3IGRpcmVjdG9yeS4KLQkqIGdhcy92YXgve3F1YWQucyxxdWFkLmV4cH06IE5ldyB0ZXN0LCBmb3IgaW1tZWRpYXRlIHF1YWR3b3JkCi0JdmFsdWVzLgotCi1Nb24gU2VwIDEyIDIyOjE5OjExIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAoZG9fZnVuY3Rpb25fcmVsb2NfYnVnKTogVXBkYXRlCi0JZXhwZWN0ZWQgb3V0cHV0LgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIGdhcy9hcm0vKjogTmV3IHN1YnRyZWUuICBBZGQgQVJNIHRlc3RzLgotCi1Nb24gQXVnICA4IDEyOjEzOjMxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IEFjY2VwdCBhbnkgY2hhcmFjdGVyCi0JYmV0d2VlbiBmb28ncyB0eXBlIGFuZCBmb28gaXRzZWxmLgotCi1GcmkgSnVsIDE1IDE5OjA5OjI1IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJ1bl9kdW1wX3Rlc3QpOiBOZXcgcm91dGluZSBmb3IgcnVubmluZyB0aGUKLQlhc3NlbWJsZXIsIHJ1bm5pbmcgb2JqZHVtcCBvciBubSAobm90IGZ1bGx5IHN1cHBvcnRlZCkgb24gdGhlCi0JcmVzdWx0aW5nIG9iamVjdCBmaWxlLCBhbmQgY29tcGFyaW5nIHRoZSByZXN1bHRzIGFnYWluc3QgYSBmaWxlIG9mCi0JcmVndWxhciBleHByZXNzaW9ucyBpbiB0aGUgdGVzdCBzdWl0ZSwgYWxsIGluIG9uZSBjb21tYW5kLgotCU9wdGlvbnMgZm9yIHRoZSBhc3NlbWJsZXIgYW5kIG9iamR1bXAgYXJlIHJlYWQgZnJvbSBjb21tZW50cyBhdAotCXRoZSBzdGFydCBvZiB0aGUgLmQgZmlsZS4KLQkoZmFpbF9waGFzZSwgc2x1cnBfb3B0aW9ucyk6IE5ldyBhdXhpbGlhcnkgcm91dGluZXMuCi0JKHJlZ2V4cF9kaWZmKTogQWx3YXlzIHJldHVybiBhIHZhbHVlLiAgRml4IGJ1Z3MgaW4gYWN0dWFsbHkgZG9pbmcKLQl0aGUgcmVnZXhwIHRlc3QuCi0KLQkqIGdhcy9zdW40L2FkZGVuZC5leHA6IFVzZSBydW5fZHVtcF90ZXN0LgotCSogZ2FzL3N1bjQvYWRkZW5kLmQ6IEZpeCByZWd1bGFyIGV4cHJlc3Npb25zIHNvIHRoYXQgdGhleSB3b3JrLgotCi1UaHUgSnVsICA3IDExOjU1OjMzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvY3JlZHVjZTIuczogTW9yZSByZWxvY2F0aW9uIHJlZHVjdGlvbiB0ZXN0cy4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIHRoZW0uCi0KLVRodSBKdW4gMzAgMTg6NDk6MjUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBMb29rIGZvciAiYXMubmV3IiBpbiAiJGJhc2VfZGlyLy4uIiwgd2hlcmUKLQlpdCBnb3QgY29tcGlsZWQsIG5vdCBpbiAiJGJhc2VfZGlyIi4KLQkqIGNvbmZpZy91bmtub3duLmV4cDogRGVsZXRlZC4KLQotU3VuIEp1biAyNiAxMzoyMzo1NCAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2xpYi9nYXMtZGVmcy5leHAgKGdhc19maW5pc2gpOiBDYWxsICJjbG9zZSIgYW5kICJ3YWl0IgotCWJlZm9yZSBleGl0aW5nLiAgRW5jbG9zZSBib3RoIGNhbGxzIGluc2lkZSBhICJjYXRjaCIuCi0JKG9iamR1bXBfZmluaXNoKTogTGlrZXdpc2UuCi0KLUZyaSBKdW4gMTAgMTA6MjM6MzUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCAocm91bmRtb2RlIHRlc3QpOiBUd2VhayBleHBlY3RlZCBvdXRwdXQKLQlmb3IgU09NIHRvIG1hdGNoIGN1cnJlbnQgdGVzdGNhc2UuCi0KLVRodSBKdW4gIDIgMTk6NDY6NTggMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZ2FzL2kzODYve3B1c2h3LnMscHVzaHcubH06IE5ldyB0ZXN0LgotCSogZ2FzL2kzODYvYWxsLmV4cDogUnVuIGl0LgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIHNpdGUgY29uZmlnIGZpbGVzIGFuZCBnYXMuc3VtLgotCi1GcmkgTWF5IDI3IDEyOjI0OjE4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhcy9tNjhrL2Rpc3BlcnIuczogVXNlICUgZm9yIHJlZ2lzdGVycy4KLQotCSogZ2FzL202OGstY29mZi9nYXMuZXhwOiBFeHBlY3QgZmFpbHVyZSBmb3IgcDIzODlhLnMuCi0KLVR1ZSBNYXkgMTcgMTQ6NTM6MDggMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwOiBSZXBsYWNlIGVycm9yIHByb2MgY2FsbHMgd2l0aCBwZXJyb3IgY2FsbHMuCi0KLU1vbiBNYXkgMTYgMTM6MTk6MTYgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogVHdlYWsgZXhwZWN0ZWQgb3V0cHV0IHRvIG1hdGNoIG5ldwotCUVMRiBjb2RlLgotCSogZ2FzL2hwcGEvcmVsb2Mvcm91bmRtb2RlLnM6IEF2b2lkICJTIiBhbmQgIkQiIG1vZGVzLCBFTEYgZG9lcwotCW5vdCBzdXBwb3J0IHRoZW0uCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFR3ZWFrIGV4cGVjdGVkIG91dHB1dCB0byBtYXRjaAotCW5ldyBFTEYgY29kZS4KLQotVGh1IE1heSAgNSAxNzoyNzo1NCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbmFtZWQgZnJvbSB1bml4LWdhcy5leHAuCi0KLU1vbiBBcHIgMTEgMTA6MzE6MDAgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2hlY2spOiBTZXQgVENMX0xJQlJBUlkgZm9yIHJ1bnRlc3QuCi0KLU1vbiBBcHIgMTEgMDc6NTQ6MTAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvY2FsbGluZm9idWcuczogQWRkIG1pc3NpbmcgbmFtZSBmb3IKLQlwcm9jZWR1cmUuCi0KLQkqIGdhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zOiBQbGFjZSB0aGUgdHJhbXBvbGluZSBpbiB0aGUKLQkkREFUQSQgcmF0aGVyIHRoYW4gJExJVCQgc3Vic3BhY2UuCi0KLVN1biBNYXIgMjcgMTQ6MDU6MzMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL2Z1bmNyZWxvY2J1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1UaHUgTWFyIDE3IDEzOjM4OjA0IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHA6IFJ1biBpdC4KLQotV2VkIE1hciAxNiAxMTo1NzowNyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9yZWdwb3BidWcuczogQWRkIHRyaXZpYWwgLmVxdSB0ZXN0LgotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9nbG9iYWxidWcuczogTmV3IHRlc3QgKGV4cGVjdGVkIHRvIGZhaWwpLgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvY2FsbGluZm9idWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9vbXJlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3JlZ3BvcGJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLU1vbiBGZWIgMjggMTQ6MTA6MDQgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGliL2dhcy1kZWZzLmV4cCAob2JqZHVtcCk6IE5ldyBwcm9jLgotCShvYmpkdW1wX3N0YXJ0KTogRGVsZXRlZCB1bnVzZWQgcHJvYy4KLQkob2JqZHVtcF9zdGFydF9jb21tb24pOiBNZXJnZWQgaW50byBvYmpkdW1wX3N0YXJ0X25vX3N1YmRpci4KLQotCSogZ2FzL2FscGhhL2ZwLmV4cDogVXNlIG9iamR1bXAgaW5zdGVhZCBvZgotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyLCBzaW5jZSB0aGUgZm9ybWVyIGFjdHVhbGx5IHdhaXRzIGZvcgotCW9iamR1bXAgdG8gZmluaXNoLiAgU3BlY2lmeSAucmRhdGEgc2VjdGlvbiBvbmx5LiAgTWFrZSBjb21tZW50Ci0JaW5kaWNhdGUgQWxwaGEgYXJjaGl0ZWN0dXJlIHJhdGhlciB0aGFuIFNQQVJDLgotCSogZ2FzL2FscGhhL2ZwLmQ6IE9taXQgLnJlZ2luZm8gcGF0dGVybnMuICBKdXN0IHVzZSAiLiIgdG8gbWF0Y2gKLQlhZ2FpbnN0IEFTQ0lJIGNvZGUgMHgyYSAoIioiLCBzcGVjaWFsIGluIHJlZ2V4cCkuCi0JKiBnYXMvc3VuNC9hZGRlbmQuZXhwOiBVc2Ugb2JqZHVtcCBpbnN0ZWFkIG9mCi0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIuCi0KLVRodSBGZWIgMjQgMDc6MTE6NTcgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLSAgICAgICAgKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cCAobm8gc3Vic3BhY2UgdGVzdCk6IE9ubHkgZXhwZWN0Ci0JYSBmYWlsdXJlIGlmIGdhcyBpcyBub3QgcHJvZHVjaW5nIGFuIEVMRiBvYmplY3QuCi0KLU1vbiBGZWIgMTQgMDk6MjQ6MDMgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogUnVuIGl0LgotCi1UaHUgRmViIDEwIDAwOjM0OjI2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGdhcy9hbHBoYS9mcC4qOiBOZXcgZmlsZXMuCi0JKiBsaWIvZ2FzLWRlZnMuZXhwIChyZWdleHBfZGlmZik6IFJlcG9ydCBub3RlZCBtaXNtYXRjaCBhdAotCXZlcmJvc2l0eSBsZXZlbCAzIG9yIGFib3ZlIG9ubHkuCi0KLU1vbiBGZWIgIDcgMTU6NTM6MTAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhLyovKi5leHA6IENoYW5nZSB4ZmFpbHMgdG8gY2hlY2sgZm9yIFBBIEVMRiByYXRoZXIgdGhhbgotCVBBIE9TRjEuCi0KLUZyaSBGZWIgIDQgMjM6NDI6MTQgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UveG1weXVidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogUnVuIGl0LgotCi1GcmkgRmViICA0IDE3OjEzOjIwIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxpYi9nYXMtZGVmcy5leHAgKHJlZ2V4cF9kaWZmKTogTmV3IHByb2NlZHVyZSwgdmFndWVseSBiYXNlZCBvbgotCSJzaW1wbGVfZGlmZiIgZnJvbSBsaW5rZXIgdGVzdCBzdWl0ZS4KLQkqIGdhcy9zdW40L2FkZGVuZC5leHA6IFVzZSBpdC4KLQkqIGdhcy9zdW40L2FkZGVuZC5kOiBOZXcgZmlsZS4KLQotU3VuIEphbiAzMCAyMzozNDo1OCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IEFkanVzdCByZWdleHAgZm9yIHg5MzA1MDkucyBmb3IgY3VycmVudCBsaXN0aW5nCi0JZm9ybWF0LgotCi1UaHUgSmFuIDIwIDE2OjQ0OjUxIDE5OTQgIFJvYiBTYXZveWUgIChyb2JAZGFya3N0YXIuY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9nYXMuZXhwLCBsaWIvZ2FzLWRlZnMuZXhwLCBzdW40L2FkZGVuZC5leHAsCi0Jc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwOiBUd2Vha2VkIHRvIGZpeCBhIGZldyBidWdzIGFuZCB0byBydW4KLQl3ZWxsIHVuZGVyIGVpdGhlciB2ZXJzaW9uIG9mIGV4cGVjdC4KLQotTW9uIEphbiAxNyAwMDoyNTowMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvYmFzaWMvZnBfbWlzYy5zOiBEZWxldGUgY29wciBpbnN0cnVjdGlvbi4gIEl0J3MgdGVzdGVkCi0JZWxzZXdoZXJlIG5vdy4KLQkqIGdhcy9ocHBhL2Jhc2ljL3tjb3ByLCBjb3BybWVtLCBzcG9wfS5zOiBOZXcgdGVzdHMuCi0JKiBnYXMvaHBwYS9iYXNpYy9iYXNpYy5leHA6IFJ1biB0aGVtLgotCi1UaHUgSmFuIDEzIDExOjU5OjIyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvYWxsL2dhcy5leHA6IE5vIGxvbmdlciBleHBlY3QgZGlmZmVyZW5jZSBvZiBmb3J3YXJkCi0JcmVmZXJlbmNlcyB0byBmYWlsLgotCSogZ2FzL2FsbC94OTMwNTA5LnM6IEZpeCB0ZXN0Y2FzZSB0byBtYXRjaCBob3cgdGhlIGV4cGVjdCBjb2RlIHdhcwotCXdyaXR0ZW4uCi0KLVdlZCBKYW4gMTIgMTM6NDE6MTAgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuICBMYXRlc3QgdGVzdAotCWZvciBjcm9zcy1zdWJzcGFjZSBjYWxsIGJ1Z3MgaXMgbm8gbG9uZ2VyIGV4cGVjdGVkIHRvIGZhaWwuCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcHJvY2J1Zy5zOiBBZGQgdGVzdCBmb3IgYW5vdGhlciBidWcgcmVsYXRpbmcKLQl0byBoYXZpbmcgYSBmdW5jdGlvbidzIGxhYmVsIGZvbGxvdyB0aGUgLlBST0MgZGlyZWN0aXZlLgotCi1UdWUgSmFuIDExIDIxOjQ3OjQ4IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IEFkZCB0ZXN0IGZvciBjcm9zcy1zdWJzcGFjZSBjYWxsIGJ1ZwotCWZvdW5kIHdoaWxlIHdvcmtpbmcgb24gbXVsdGlwbGUgJENPREUkIHN1YnNwYWNlIHN1cHBvcnQuCi0KLU1vbiBKYW4gMTAgMDk6NTQ6MTUgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBwcm9jYnVnLnMgaXMgbm8gbG9uZ2VyIGV4cGVjdGVkCi0JdG8gZmFpbC4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcHJvY2J1Zy5zOiBBZGQgbWlzc2luZyAucHJvY2VuZC4KLQotTW9uIEphbiAgMyAxMDowNzo0NyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9sYWJlbGJ1Zy5zOiBBZGQgdGVzdGNhc2UgZm9yIGJ1ZyBpbiBsYXN0Ci0JYXBwLmMgY2hhbmdlLgotCi1XZWQgRGVjIDI5IDExOjMyOjM5IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2xhYmVsYnVnLnM6IEFkZCBtb3JlIGNvbG9ubGVzcyBsYWJlbCB0ZXN0cy4KLQotV2VkIERlYyAxNSAwODoyNDozMSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChzaXRlLmV4cCk6IERvbid0IHNldCBBU0ZMQUdTLiAgUXVvdGUgdmFsdWUgb2YKLQlPQkpEVU1QRkxBR1MgaW4gY2FzZSBpdCdzIGVtcHR5LiAgVXNlIHRlbXBvcmFyeSBuYW1lcyB1bnRpbCB0aGUKLQllbmQ7IG1ha2UgY3JlYXRpbmcgc2l0ZS5leHAgdGhlIGZpbmFsIHN0ZXAuCi0JKGNoZWNrKTogUGFzcyBpbiBBU0ZMQUdTLgotCi0JKiBnYXMvYWxsL2dhcy5leHA6IFVzZSBhbGxfb25lcyBwcm9jLiAgQ2hhbmdlIHJlZ2V4cCBmb3IgbWF0Y2hpbmcKLQlDIGNvbW1lbnRzIHRvIGF2b2lkIGJ1Z3MgaW4gbGF0ZXN0IGV4cGVjdCBjb2RlLgotCi1XZWQgRGVjICA4IDE0OjMwOjE0IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvbTY4ay9kaXNwZXJyLnM6IE5ldyB0ZXN0LgotCSogZ2FzL202OGsvYWxsLmV4cDogUnVuIGl0LgotCi1TdW4gRGVjICA1IDE5OjI0OjU3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4gIEZpeCB0eXBvIGluIGxhc3QgY2hhbmdlLgotCi1XZWQgRGVjICAxIDEwOjQ0OjE4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biB0aGUgZmlyc3QgaGFsZiBvZiBib2d1cyBSX0VYSVQKLQl0ZXN0IGZvciBFTEYuICAKLQotVHVlIE5vdiAzMCAxMzo0MzoyMSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFRlc3QgZm9yIGVycm9yIG9uIGZvciBzdWJzcGFjZQotCWRpcmVjdGl2ZSBpcyBhbiBYRkFJTCBmb3IgU09NIGFzc21lYmxlcnMuCi0KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUmVtb3ZlIFhGQUlMIGZvciByZWxvY2F0aW9uIG9uCi0JY3Jvc3Mtc3Vic3BhY2UgY2FsbCB0ZXN0LgotCi1TdW4gTm92IDI4IDEyOjEyOjUwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2FwcGJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cDogUnVuIGl0LgotCi1TYXQgTm92IDI3IDIyOjUwOjAxIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvYWxsL3AyNDI1LnM6IEluc2VydCBhIHRhYiBiZWZvcmUgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc28KLQl0aGF0IHRoZSBkaXJlY3RpdmVzIGFyZSBub3QgaW50ZXJwcmV0ZWQgYXMgbGFiZWxzLgotCi0JKiBnYXMvaHBwYS9iYXNpYy93ZWlyZC5zOiBTeW5jIHdpdGggR0RCIHZlcnNpb24uCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvbGFiZWxidWcuczogTmV3IHRlc3QuCi0KLQkqIGdhcy9ocHBhL21vcmUucGFyc2UvcGFyc2UuZXhwOiBSdW4gaXQuCi0KLVdlZCBOb3YgMjQgMDE6MjU6MDMgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3JlbG9jL2ZpeHVwYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBSdW4gaXQuCi0KLQkqIGdhcy9ocHBhL3JlbG9jL2V4aXRidWcuczogTmV3IHRlc3QuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHA6IFJ1biBpdC4KLQotU3VuIE5vdiAyMSAyMjoxMToxMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBNaW5vciBmaXhlcyBzbyB0aGF0IFNPTSAmIEVMRiBjYW4KLQlzaGFyZSB0aGUgc2FtZSB0ZXN0IGNvZGUuCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvY3JlZHVjZS5zOiBMaWtld2lzZS4KLQotCSogZ2FzL2hwcGEvYmFzaWMvZm1lbS5zOiBBZGQgcXVhZHdvcmQgRlAgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCSogZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwOiBUZXN0IHF1YWR3b3JkIEZQIHN0b3JlIGluc3RydWN0aW9ucy4KLQotU3VuIE5vdiAgNyAwMDozMTo0MSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwOiBObyBsb25nZXIgZXhwZWN0IGZhaWx1cmUgZm9yCi0JZmllbGQgc2VsZWN0b3Igb24gYmxlIGluc3RydWN0aW9uIHRlc3QuCi0KLQkqIGdhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cDogTm8gbG9uZ2VyIGV4cGVjdCBmYWlsdXJlcyBmb3IKLQlzeXN0ZW0gaW5zdHJ1Y3Rpb24gdGVzdHMgbm93IHRoYXQgcHJvYmVpIGlzIGZpeGVkLgotCi1TYXQgTm92ICA2IDIyOjQ1OjA4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zOiBOZXcgdGVzdC4KLQkqIGdhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cDogUnVuIGl0LgotCi1UaHUgTm92ICA0IDE3OjAxOjMwIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS91bnNvcnRlZC9mcmFnYnVnLnM6IE5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwOiBSdW4gaXQuCi0KLVRodSBOb3YgMDQgMDk6MDk6NDkgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgUlVOVEVTVEZMQUdTIHRvIFJVTlRFU1RfRkxBR1MKLQotVHVlIE5vdiAgMiAyMjoxMjozMCAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS97ZGVmYnVnLnMsIHN0ZHJlZy5zfTogTmV3IHRlc3RzLgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IFJ1biB0aGVtLgotCi1Nb24gTm92ICAxIDIzOjM3OjU4IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9yZWxvYy9yZWxvYy5leHAgKHJlbG9jX3JlZHVjZSk6IENvcnJlY3Qgb2Zmc2V0cyBhdAotCXdoaWNoIHNwZWNpZmljIHJlbG9jYXRpb25zIGFyZSBleHBlY3RlZCB0byBiZSBmb3VuZC4KLQkKLVNhdCBPY3QgMzAgMTQ6MTI6MzEgMTk5MyAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGdhcy9ocHBhL3Vuc29ydGVkL3Vuc29ydGVkLmV4cCAoc3NfYWxpZ24pOiBSZW1vdmUgT1NGIHhmYWlsLgotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL3BhcnNlLmV4cDogQWRkIG5ldyB0ZXN0LgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9zc2J1Zy5zOiBOZXcgdGVzdCB0byBtYWtlIHN1cmUgbm9uLWRlZmF1bHQKLQlzZWN0aW9ucyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLQkqIGdhcy9hbGwvZ2FzLmV4cDogRGlzYWJsZSAoYW5kIGZhaWwpIHAxNDgwLnMgZm9yIGFsbCBQQSB0YXJnZXRzLgotCi1GcmkgT2N0IDI5IDE2OjI5OjA2IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBnYXMvaHBwYS9tb3JlLnBhcnNlL2NhbGxkYXRhYnVnLnM6IENvbG9uaXplLgotCSogZ2FzL2hwcGEvbW9yZS5wYXJzZS9wYXJzZS5leHA6IEZpeCB0eXBvcy4KLQotVGh1IE9jdCAyOCAyMTo0MDowNiAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ2FzL2hwcGEve2Jhc2ljLCBtb3JlLnBhcnNlLCByZWxvYywgdW5zb3J0ZWR9OiBOZXcgZGlyZWN0b3JpZXMuCi0JKiBnYXMvaHBwYS8qLyouZXhwOiBOZXcgdGVzdCBkcml2ZXJzLgotCSogZ2FzL2hwcGEvKi8qLnM6IE5ldyB0ZXN0IGZpbGVzLgotCi1Nb24gT2N0IDI1IDA5OjQwOjU5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBnYXMvc3VuNDogTmV3IGRpcmVjdG9yeS4KLQkqIGdhcy9zdW40L2FkZGVuZC5zLGFkZGVuZC5leHA6IE5ldyB0ZXN0IGNhc2UuCi0JKiBnYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQucyxhZGRlbmQuZXhwOiBTb2xhcmlzIHZlcnNpb24gb2Ygc2FtZQotCXRlc3QgY2FzZS4KLQotCSogZ2FzL2FsbC9nYXMuZXhwOiBDaGVjayBgKicgaW4gQyBjb21tZW50cy4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoYWxsX29uZXMpOiBOZXcgcHJvY2VkdXJlLCBmb3IgYSBwcmVkaWNhdGUgdG8KLQlzaW1wbGlmeSBzb21lIHRlc3RzLgotCSh3YW50X25vX291dHB1dCk6IFJldHVybiB6ZXJvIG9yIG5vbnplcm8sIGRlcGVuZGluZyBvbiBzdWNjZXNzIG9yCi0JZmFpbHVyZS4KLQkoZ2FzX3Rlc3Rfb2xkKTogUmV0dXJuIHZhbHVlIGZyb20gd2FudF9ub19vdXRwdXQuCi0JKG9iamR1bXBfc3RhcnRfY29tbW9uKTogU3BsaXQgb2ZmIGZyb20gb2JqZHVtcF9zdGFydC4KLQkob2JqZHVtcF9zdGFydF9ub19zdWJkaXIpOiBOZXcgcHJvY2VkdXJlLgotCi1XZWQgT2N0IDIwIDA3OjI1OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBnYXMvYWxsL2RpZmYxLnMsIGdhcy9tNjhrL3BpYzEuczogTmV3IHRlc3RzLgotCSogZ2FzL2FsbC9nYXMuZXhwLCBnYXMvbTY4ay9hbGwuZXhwOiBSdW4gdGhlbS4KLQotCSogTWFrZWZpbGUuaW4gKE9CSkRVTVBfRk9SX1RBUkdFVCk6IERlZmluZSBzaW1pbGFyIHRvCi0JQVNfRk9SX1RBUkdFVC4KLQkoY2hlY2spOiBEb24ndCBwYXNzIEFTRkxBR1MgdmFyaWFibGUuCi0JKHNpdGUuZXhwKTogUHV0IEFTRkxBR1MsIE9CSkRVTVAsIE9CSkRVTVBGTEFHUyBpbnRvIHNpdGUuZXhwLgotCi0JRnJvbSBKZWZmIExhdzoKLQotCSogbGliL2dhcy1kZWZzLmV4cCAob2JqZHVtcF9zdGFydCwgb2JqZHVtcF9maW5pc2gpOiBOZXcgZnVuY3Rpb25zCi0Jc28gdGhhdCB0ZXN0cyBjYW4gcGFyc2UgdGhlIG91dHB1dCBvZiBvYmpkdW1wIGxvb2tpbmcgZm9yIGVycm9ycwotCWluIHJlbG9jYXRpb24gZW50aXJlcywgZmlsZSBoZWFkZXJzIGFuZCB0aGUgbGlrZS4KLQotVGh1IFNlcCAyMyAxNjoyMDozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGdhcy9pZWVlLmZwL3g5MzA1MDlhLmV4cDogQ3VycmVudGx5IGV4cGVjdGVkIHRvIGZhaWwgYWx3YXlzLgotCSogZ2FzL2FsbC9nYXMuZXhwIChwMTQ4MC5zLCB4OTMwNTA5LnMpOiBEaXR0by4gIEJyZWFrIHVwIGdhc190ZXN0Ci0JY2FsbCBzbyBpdCBubyBsb25nZXIgcGVyZm9ybXMgbXVsdGlwbGUgdGVzdHMuCi0JKiBnYXMvbTY4ay9hbGwuZXhwICh0Mi5zKTogRG9uJ3QgYm90aGVyIHdpdGggbGlzdGluZ3MuCi0JKHAyNDEwLnMpOiBEb24ndCBwYXNzIHVud2FudGVkIGFyZ3VtZW50cyB0byBnYXNfdGVzdF9lcnJvci4KLQotV2VkIEF1ZyAyNSAxNjo1MDowOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGxpYi9kbyo6IFJlbW92ZSBSQ1MgaWQgc3RyaW5ncy4KLQotTW9uIE1heSAxNyAxNTowOTo0NSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogZ2FzL2FsbC9mbG9hdC5zLCBnYXMvYWxsL3AxNDgwLnMsIGdhcy9tNjhrL3AyNDEwLnM6IE5ldyB0ZXN0cy4KLQkqIGdhcy9hbGwvZ2FzLmV4cCwgZ2FzL202OGsvYWxsLmV4cDogUnVuIHRoZW0uCi0JKiBnYXMvaTM4NjogTmV3IGRpcmVjdG9yeS4KLQotTW9uIE1heSAxMCAxNDo1MDoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogQWRkZWQgZGlyZWN0b3J5IHN0cnVjdHVyZSwgdG8gY2F0ZWdvcml6ZSB0ZXN0cyBieSB0YXJnZXRzLgotCSogQWRkZWQgbmV3IHRlc3RzIGFsbC94OTMwNTA5LnMsIGllZWUuZnAveDkzMDUwOWEucywgbTY4ay9wMjY2My5zLAotCWFuZCByZWZpbmVkIHNvbWUgdG8gZXhhbWluZSB0aGUgYXNzZW1ibGVyIGxpc3Rpbmcgb3V0cHV0LgotCSogbGliL2dhcy1kZWZzLmV4cDogUmVuYW1lZCBnYXNfc3RhcnQgdG8gZ2FzX3J1bi4gIEFkZGVkIHNvbWUKLQlleHBlY3RfYWZ0ZXIgcGF0dGVybnMuCi0JKGdhc19zdGFydCwgZ2FzX2ZpbmlzaCk6IE5ldyBwcm9jcywgZm9yIHRlc3RzIHRoYXQgZXhhbWluZSBwcm9jZXNzCi0Jb3V0cHV0LgotCSogY29uZmlnL3VuaXgtZ2FzLmV4cDogSW52b2tlIGdhc19pbml0IGRpcmVjdGx5LCBpbnN0ZWFkIG9mCi0JcmVxdWlyaW5nIHRlc3QgLmV4cCBmaWxlcyBkbyBpdC4KLQotV2VkIEFwciAyMSAwMToyNDoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGdhcy9nYXMuZXhwOiBIYW5kbGUgbmV3IHRlc3RzLCBhbmQgY2hhbmdlcyB0byB0ZXN0aW5nIHByb2NzLgotCi0JKiBsaWIvZ2FzLWRlZnMuZXhwICh3YW50X25vX291dHB1dCk6IE5ldyBwcm9jOyBzdWNjZXNzIGlmZiBvdXRwdXQKLQlpcyBlbXB0eS4KLQkoZ2FzX3Rlc3Rfb2xkKTogRnVuY3Rpb25hbGx5IHNhbWUgYXMgb2xkIGdhc190ZXN0LgotCShnYXNfdGVzdF9pZ25vcmVfc3Rkb3V0KTogUmV3cml0dGVuIHRvIHVzZSB3YW50X25vX291dHB1dC4KLQkoZ2FzX3Rlc3QpOiBOZXcgYXJndW1lbnQgbGlzdHMgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdHJpZWQgaW4KLQljb21iaW5hdGlvbnMuICBPcHRpb24gd2l0aCB0cmFpbGluZyAiPiIgaW5kaWNhdGVzIHN0YW5kYXJkIG91dHB1dAotCXNob3VsZCBiZSBpZ25vcmVkLgotCi0JKiBnYXMvcDI0MjVhLnM6IFVzZSAlLWZvcm0gZm9yIHJlZ2lzdGVycywgc28gdGhpcyB0ZXN0IGNhbiBiZSBydW4KLQlvbiBtNjhrLWNvZmYgdGFyZ2V0cyB0b28uCi0KLQkqIGdhcy9wMjQzMGEuczogTmV3IHRlc3QgY2FzZSwgd2hpdGVzcGFjZSAmYyBtYXRjaGVzIGN1c3RvbWVyCi0JcmVwb3J0IG1vcmUgY2xvc2VseS4gIEdldHMgZGlmZmVyZW50IHJlc3VsdHMgZnJvbSBwMjQzMC5zOyB0aGlzIGlzCi0JYmFkLCBhbmQgbm90IHlldCB0ZXN0ZWQgZm9yLgotCi1Nb24gQXByICA1IDEyOjI3OjE5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBnYXMvcDIzODlhLnMsIGdhcy9wMjQxMS5zLCBnYXMvdDIuczogTmV3IHRlc3QgY2FzZXMuCi0JKiBsaWIvcnVuOiBOZXcgc2NyaXB0LgotCSogZ2FzL2dhcy1kZWZzLmV4cCAoZ2FzX3N0YXJ0KTogVGFrZXMgbmV3IGFyZ3MsIGFzc2VtYmxlciBvcHRpb25zCi0JYW5kIHJlZGlyZWN0aW9uIG9wdGlvbnMuICBVc2UgInJ1biIgc2NyaXB0IHNvIHJlZGlyZWN0aW9uIHdvcmtzLgotCShnYXNfdGVzdCk6IE5vdyB0YWtlcyBhc3NlbWJsZXIgb3B0aW9ucyBhcyBzZXBhcmF0ZSBhcmcgZnJvbSBpbnB1dAotCWZpbGUgbmFtZS4KLQkoZ2FzX3Rlc3RfaWdub3JlX3N0ZG91dCk6IE5ldyBwcm9jLiAgRGlzY2FyZHMgb3V0cHV0LgotCShnYXNfdGVzdF9lcnJvcik6IE5ldyBwcm9jLiAgRXhwZWN0cyBhc3NlbWJsZXIgdG8gZ2VuZXJhdGUgb3V0cHV0LgotCSh0YXJnZXRfY3B1X2ZhbWlseSBzZXR0aW5nKTogSGFuZGxlIGk0ODYtPmkzODYgYWxzby4KLQotCSogbGliL2RvKjogU2NyaXB0cyBtb3ZlZCBoZXJlIGZyb20gZ2FzL3Rlc3RzY3JpcHRzLiAgTWF5IGJlIHVzZWZ1bAotCXNvbWVkYXkgZm9yIHdyaXRpbmcgbW9yZSB0ZXN0IGNhc2VzOyBub3QgY3VycmVudGx5IHVzZWQuCi0KLVR1ZSBNYXIgMzAgMTE6NDU6MjcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBnYXMvc29sLWdjYy5zLCBnYXMvc29sLWNjLnMsIGdhcy9wMjQyNWEucywgZ2FzL3AyMzg5LnM6IE5ldyB0ZXN0Ci0JY2FzZXMuCi0JKiBnYXMvZ2FzLmV4cDogRW5hYmxlIHRoZW0gZm9yIGFwcHJvcHJpYXRlIHRhcmdldHMuICBSZW1vdmVkIHNvbWUKLQl1c2VsZXNzIGNvbW1lbnRzICZjLiAgQ2hhbmdlZCBtNjhrIHRhcmdldCB0ZXN0IHRvIGJlIG1vcmUgZ2VuZXJhbC4KLQotCSogbGliL2dhcy1kZWZzLmV4cCAoZ2FzX2V4aXQsIGdhc19pbml0KTogTmV3IHByb2NzLgotCSogZ2FzL2dhcy5leHA6IENhbGwgZ2FzX2luaXQuCi0KLU1vbiBNYXIgMjkgMDA6MDA6MDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIFRlc3Qgc3VpdGUgY3JlYXRlZC4KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9jb25maWcvZGVmYXVsdC5leHAgYi9nYXMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzNGEwMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLWxvYWRfbGliIGdhcy1kZWZzLmV4cAotCi1nbG9iYWwgQVMKLWlmICFbaW5mbyBleGlzdHMgQVNdIHRoZW4gewotICAgIHNldCBBUyBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2FzLW5ldyAiLi4vYXMtbmV3IiBbdHJhbnNmb3JtIGFzXV0KLX0KLQotZ2xvYmFsIEdBU1AKLWlmICFbaW5mbyBleGlzdHMgR0FTUF0gdGhlbiB7Ci0gICAgc2V0IEdBU1AgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9nYXNwLW5ldyAiLi4vZ2FzcC1uZXciIFt0cmFuc2Zvcm0gZ2FzcF1dCi19Ci0KLWdsb2JhbCBBU0ZMQUdTCi1pZiAhW2luZm8gZXhpc3RzIEFTRkxBR1NdIHRoZW4gewotICAgIHNldCBBU0ZMQUdTICIiCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKRFVNUF0gdGhlbiB7Ci0gICAgc2V0IE9CSkRVTVAgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9vYmpkdW1wIFwKLQkJCSAgJGJhc2VfZGlyLy4uLy4uL2JpbnV0aWxzL29iamR1bXAgXAotCQkJICBbdHJhbnNmb3JtIG9iamR1bXBdXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkRVTVBGTEFHU10gdGhlbiB7Ci0gICAgc2V0IE9CSkRVTVBGTEFHUyB7fQotfQotCi1pZiAhW2luZm8gZXhpc3RzIE5NXSB0aGVuIHsKLSAgICBzZXQgTk0gW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9ubS1uZXcgXAotCQkgICAgICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9ubS1uZXcgXAotCQkgICAgIFt0cmFuc2Zvcm0gbm1dXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIE5NRkxBR1NdIHRoZW4gewotICAgIHNldCBOTUZMQUdTIHt9Ci19Ci0KLWlmICFbaW5mbyBleGlzdHMgT0JKQ09QWV0gdGhlbiB7Ci0gICAgc2V0IE9CSkNPUFkgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi8uLi9iaW51dGlscy9vYmpjb3B5XQotfQotCi1pZiAhW2luZm8gZXhpc3RzIE9CSkNPUFlGTEFHU10gdGhlbiB7Ci0gICAgc2V0IE9CSkNPUFlGTEFHUyB7fQotfQotCi1nYXNfaW5pdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlZGU2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24uZAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNvYmpkdW1wOiAtcyAtaiAudGV4dAotI25hbWU6IGFsaWduCi0KLSMgVGVzdCB0aGUgYWxpZ25tZW50IHBzZXVkby1vcC4KLQotLio6IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci0gMDAwMCBmZjAwZmYwMSBmZjAyMDIwMiBmZmZmMDMwMyAwNDA0MDQwNCAgLi4uLi4uLi4uLi4uLi4uLgotIDAwMTAgZmZmZmZmZmYgMDUwNTA1MDUgZmYwOTBhMGEgMGEwYTBhMGEgIC4uLi4uLi4uLi4uLi4uLi4KLSAwMDIwIGZmMDBmZjAxIGZmMDIwMjAyIGZmZmYwMzAzIDA0MDQwNDA0ICAuLi4uLi4uLi4uLi4uLi4uCi0gMDAzMCBmZmZmZmZmZiAwNTA1MDUwNSBmZjA5MGEwYSAwYTBhMGEwYSAgLi4uLi4uLi4uLi4uLi4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2FsaWduLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjY2ExMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvYWxpZ24ucworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qIFRlc3QgdGhlIGFsaWdubWVudCBwc2V1ZG8tb3BzLiAgKi8KLQkudGV4dAotCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWduIDEsMAotCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWduIDEsMQotCi0JLmJ5dGUJMHhmZgotCS5wMmFsaWduIDIsMgotCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbncgMiwweDAzMDMKLQotCS5wMmFsaWduIDMsNAotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbmwgMywweDA1MDUwNTA1Ci0KLQkucDJhbGlnbiAxLDYKLQkucDJhbGlnbiAxLDcKLQotCS5ieXRlCTB4ZmYKLQkucDJhbGlnbiAzLDgsNQotCS5ieXRlCTkKLQkucDJhbGlnbiAzLDB4YQotCi0JLmJ5dGUJMHhmZgotCS5iYWxpZ24JMiwwCi0KLQkuYnl0ZQkweGZmCi0JLmJhbGlnbgkyLDEKLQotCS5ieXRlCTB4ZmYKLQkuYmFsaWduCTQsMgotCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYmFsaWdudyA0LDB4MDMwMwotCi0JLmJhbGlnbgk4LDQKLQkuYnl0ZQkweGZmCi0JLmJ5dGUJMHhmZgotCS5ieXRlCTB4ZmYKLQkuYnl0ZQkweGZmCi0JLmJhbGlnbmwgOCwweDA1MDUwNTA1Ci0KLQkuYmFsaWduIDIsNgotCS5iYWxpZ24gMiw3Ci0KLQkuYnl0ZQkweGZmCi0JLmJhbGlnbgk4LDgsNQotCS5ieXRlCTkKLQkuYmFsaWduCTgsMHhhCi0KLQkucDJhbGlnbiA1Ci0JLmJhbGlnbiAzMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ODk4YjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNvYmpkdW1wOiAtdAotI25hbWU6IGNvZmZ0YWcKLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1TWU1CT0wgVEFCTEU6Ci1cWyAgMFxdXChzZWMgLTJcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsIDEwM1wpIFwobnggMVwpIDB4MCswMDAwIGZvby5jCi1GaWxlIAotXFsgIDJcXVwoc2VjICAxXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDZcKSBcKG54IDBcKSAweDArMDAwMCBnY2MyX2NvbXBpbGVkLgotXFsgIDNcXVwoc2VjICAxXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDZcKSBcKG54IDBcKSAweDArMDAwMCBfX19nbnVfY29tcGlsZWRfYwotXFsgIDRcXVwoc2VjIC0yXClcKGZsIDB4MDBcKVwodHkgICBhXClcKHNjbCAgMTVcKSBcKG54IDFcKSAweDArMDAwMCBfdG9rZW4KLUFVWCBsbm5vIDAgc2l6ZSAweDQgdGFnbmR4IDAgZW5kbmR4IDEwCi1cWyAgNlxdXChzZWMgLTFcKVwoZmwgMHgwMFwpXCh0eSAgIGJcKVwoc2NsICAxNlwpIFwobnggMFwpIDB4MCswMDAwIF9vcGVyYXRvcgotXFsgIDdcXVwoc2VjIC0xXClcKGZsIDB4MDBcKVwodHkgICBiXClcKHNjbCAgMTZcKSBcKG54IDBcKSAweDArMDAwMSBfZmxhZ3MKLVxbICA4XF1cKHNlYyAtMVwpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgMTAyXCkgXChueCAxXCkgMHgwKzAwMDQgLmVvcwotQVVYIGxubm8gMCBzaXplIDB4NCB0YWduZHggNAotXFsgMTBcXVwoc2VjICAxXClcKGZsIDB4MDBcKVwodHkgICAwXClcKHNjbCAgIDNcKSBcKG54IDFcKSAweFswLTlhLWZdKyAudGV4dAotQVVYIHNjbmxlbiAweFswLTlhLWZdKyBucmVsb2MgMCBubG5ubyAwCi1cWyAxMlxdXChzZWMgIDJcKVwoZmwgMHgwMFwpXCh0eSAgIDBcKVwoc2NsICAgM1wpIFwobnggMVwpIDB4WzAtOWEtZl0rIC5kYXRhCi1BVVggc2NubGVuIDB4WzAtOWEtZl0rIG5yZWxvYyAwIG5sbm5vIDAKLVxbIDE0XF1cKHNlYyAgM1wpXChmbCAweDAwXClcKHR5ICAgMFwpXChzY2wgICAzXCkgXChueCAxXCkgMHhbMC05YS1mXSsgLmJzcwotQVVYIHNjbmxlbiAweFswLTlhLWZdKyBucmVsb2MgMCBubG5ubyAwCi1cWyAxNlxdXChzZWMgIDJcKVwoZmwgMHgwMFwpXCh0eSAgIDJcKVwoc2NsICAgMlwpIFwobnggMFwpIDB4MCswMDAwIF90b2tlbgotXFsgMTdcXVwoc2VjICAyXClcKGZsIDB4MDBcKVwodHkgICBhXClcKHNjbCAgIDJcKSBcKG54IDFcKSAweFswLTlhLWZdKyBfd2hhdAotQVVYIGxubm8gMCBzaXplIDB4NCB0YWduZHggNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb2ZmdGFnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTY1OTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvZmZ0YWcucworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIFRoaXMgZmlsZSB3YXMgY29tcGlsZWQgZnJvbSB0aGlzIEMgc291cmNlOgotCWNoYXIgdG9rZW4gPTA7Ci0JZW51bSB0b2tlbiB7Ci0JICAgICAgICBvcGVyYXRvciwKLQkgICAgICAgIGZsYWdzCi0JfTsKLQkgCi0JZW51bSB0b2tlbiB3aGF0PSBvcGVyYXRvcjsKLSAqLwotCi0JLmZpbGUJImZvby5jIgotZ2NjMl9jb21waWxlZC46Ci1fX19nbnVfY29tcGlsZWRfYzoKLS5nbG9ibCBfdG9rZW4KLS5kYXRhCi1fdG9rZW46Ci0JLmJ5dGUgMAotLnRleHQKLQkuZGVmCV90b2tlbgotCS5zY2wJMTUKLQkudHlwZQkwMTIKLQkuc2l6ZQk0Ci0JLmVuZGVmCi0JLmRlZglfb3BlcmF0b3IKLQkudmFsCTAKLQkuc2NsCTE2Ci0JLnR5cGUJMDEzCi0JLmVuZGVmCi0JLmRlZglfZmxhZ3MKLQkudmFsCTEKLQkuc2NsCTE2Ci0JLnR5cGUJMDEzCi0JLmVuZGVmCi0JLmRlZgkuZW9zCi0JLnZhbAk0Ci0JLnNjbAkxMDIKLQkudGFnCV90b2tlbgotCS5zaXplCTQKLQkuZW5kZWYKLS5nbG9ibCBfd2hhdAotLmRhdGEKLQkucDJhbGlnbiAyCi1fd2hhdDoKLQkubG9uZyAwCi0udGV4dAotCS5kZWYJX3Rva2VuCi0JLnZhbAlfdG9rZW4KLQkuc2NsCTIKLQkudHlwZQkwMgotCS5lbmRlZgotCS5kZWYJX3doYXQKLQkudmFsCV93aGF0Ci0JLnNjbAkyCi0JLnRhZwlfdG9rZW4KLQkuc2l6ZQk0Ci0JLnR5cGUJMDEyCi0JLmVuZGVmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29tbWVudC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2NvbW1lbnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiYzY0MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29tbWVudC5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFRoaXMgdGVzdCBmaWxlIGlzIHRvIHNlZSB3aGV0aGVyIGNvbW1lbnRzIGdldCB3cml0dGVuIGludG8gbGlzdGluZ3MKLSMgY29ycmVjdGx5LiAgVGhlIGZpbGUgaGFzIG5vIHJlYWwgY29udGVudHMuCi0vKiBDIGNvbW1lbnRzIHRvbyEgKi8KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWUzOTQyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBvdXRwdXQgb2YgZ2FzIC1hbGMgY29uZC5zLgotCi0uKmNvbmQucy4qCi0KLQotICAgMVsgCV0rLmlmCTAKLSAgIDhbIAldKy5lbHNlCi0gICA5WyAJXSsuaWYJMQotICAxMFsgCV0rLmVuZGMKLSAgMTEgMDAwMCAwWzAyXTAwID8wMDBbMDJdWyAJXSsubG9uZ1sgCV0rMgotICAxMlsgCV0rLmlmCTAKLSAgMTRbIAldKy5lbHNlCi0gIDE1IDAwMDQgMFswNF0wMCA/MDAwWzA0XVsgCV0rLmxvbmdbIAldKzQKLSAgMTZbIAldKy5lbmRjCi0gIDE3WyAJXSsuZW5kYwotICAxOCAwMDA4IDAwMDAgPzAwMDBbIAldKy5wMmFsaWduIDUsMAotICAxOFsgCV0rMDAwMCA/MDAwMCAKLSAgMThbIAldKzAwMDAgPzAwMDAgCi0gIDE4WyAJXSswMDAwID8wMDAwIAotICAxOFsgCV0rMDAwMCA/MDAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvY29uZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTU4MzIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9jb25kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmlmCTAKLQkuaWYJMQotCS5lbmRjCi0JLmxvbmcJMAotCS5pZgkwCi0JLmxvbmcJMQotCS5lbmRjCi0JLmVsc2UKLQkuaWYJMQotCS5lbmRjCi0JLmxvbmcJMgotCS5pZgkwCi0JLmxvbmcJMwotCS5lbHNlCi0JLmxvbmcJNAotCS5lbmRjCi0JLmVuZGMKLQkucDJhbGlnbiA1LDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9kaWZmMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2RpZmYxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTg5ZmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2RpZmYxLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgRGlmZmVyZW5jZSBvZiB0d28gdW5kZWZpbmVkIHN5bWJvbHMuCi0jIFRoZSBhc3NlbWJsZXIgc2hvdWxkIHJlamVjdCB0aGlzLgotCS50ZXh0Ci0JLmdsb2JsIF9mb28KLV9mb286CS5sb25nIF9hIC0gX2IKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9mbG9hdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2Zsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOThjYWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2Zsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkudGV4dAotZm9vOgkuc2luZ2xlCTByMS4yMzQ1ZSswNgotCS5zaW5nbGUgMGYzLjE0MTU5Ci0JLmRvdWJsZSAwcjIuNzE4MjgyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvZ2FzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9nYXMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTQ0NTUxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9nYXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLSMKLSMgVGhlc2UgdGVzdHMgc2hvdWxkIGJlIHZhbGlkIG9uIGFsbCB0YXJnZXRzLgotIwotCi0jIEkgdGhpbmsgY3VycmVudGx5IGFsbCB0YXJnZXRzIGZhaWwgdGhpcyBvbmUgd2hlbiBsaXN0aW5ncyBhcmUgZW5hYmxlZC4KLWdhc190ZXN0ICJwMjQyNS5zIiAiIiAgICIiICJwY3JlbCB2YWx1ZXMgaW4gYXNzaWdubWVudCIKLQotIyBwMTQ4MC5zIHVzZXMgYSAiLnNwYWNlIiBkaXJlY3RpdmUgd2hpY2ggZm9yIG1vc3QgYXNzZW1ibGVycyBtZWFucwotIyAiYWxsb2NhdGUgc29tZSBzcGFjZSIuICBPbiB0aGUgUEEgaXQgbWVhbnMgInN3aXRjaCBpbnRvIHRoaXMgc3BhY2UiLgotIwotIyBUaGVyZWZvcmUgdGhpcyB0ZXN0IChhcyBpdCBpcyBjdXJyZW50bHkgd3JpdHRlbikgaXMgY29tcGxldGVseSBib2d1cwotIyBmb3IgYW55IFBBIHRhcmdldC4gIERvIG5vdCBib3RoZXIgdHJ5aW5nIHRvIHJ1biBpdCBhbmQganVzdCBjbGFpbQotIyBpdCBmYWlscy4KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgIHNldHVwX3hmYWlsICotKi0qCi0gICAgZmFpbCAic2ltcGxpZmlhYmxlIGRvdWJsZSBzdWJ0cmFjdGlvbiIKLX0gZWxzZSB7Ci0gICAgZ2FzX3Rlc3QgInAxNDgwLnMiICIiICItYT4iICJzaW1wbGlmaWFibGUgZG91YmxlIHN1YnRyYWN0aW9uIgotfQotCi1nYXNfdGVzdCAiZmxvYXQucyIgIiIgICAiIiAic2ltcGxlIEZQIGNvbnN0YW50cyIKLQotIyBUaGlzIHRlc3QgaXMgbWVhbmluZ2xlc3MgZm9yIHRoZSBQQTsgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZAotIyBzeW1ib2xzIGlzIHNvbWV0aGluZyB0aGF0IGlzIChhbmQgbXVzdCBiZSkgc3VwcG9ydGVkIG9uIHRoZSBQQS4KLWlmICFbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICBnYXNfdGVzdF9lcnJvciAiZGlmZjEucyIgIiIgImRpZmZlcmVuY2Ugb2YgdHdvIHVuZGVmaW5lZCBzeW1ib2xzIgotfQotCi1wcm9jIGRvX2NvbW1lbnQge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tbWVudC5zOiBjb21tZW50cyBpbiBsaXN0aW5ncyIKLSAgICBzZXQgeDEgMAotICAgIHNldCB4MiAwCi0gICAgc2V0IHgzIDAKLSAgICBzZXQgd2hpdGUge1sgXHRdKn0KLSAgICBnYXNfc3RhcnQgImNvbW1lbnQucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLSMgQXBwYXJlbnRseSBDUkxGIGlzIHJlY2VpdmVkIHdoZW4gdXNpbmcgcHR5cyBmb3Igc3VicHJvY2Vzc2VzOyBoZW5jZSB0aGUKLSMgXHJcbiBmb3IgbGluZSAzLgotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArMVxbIFx0XF0rIyBUaGlzXFteXG5cXSpcbiIJCXsgc2V0IHgxIDEgfQotCSAgICAtcmUgIl4gKzJcWyBcdFxdKyMgY29ycmVjdGx5XFteXG5cXSpcbiIJeyBzZXQgeDIgMSB9Ci0JICAgIC1yZSAiXiArM1xbIFx0XF0rLy4gQyBjb21tZW50cyB0b28uIC4vXHI/XG4iIHsgc2V0IHgzIDEgfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLSAgICBnYXNfZmluaXNoCi0gICAgaWYgW2FsbF9vbmVzICR4MSAkeDIgJHgzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1kb19jb21tZW50Ci0KLSMKLSMgVGVzdCB4OTMwNTA5YSAtLSBjb3JyZWN0IGFzc2VtYmx5IG9mIGRpZmZlcmVuY2VzIGludm9sdmluZyBmb3J3YXJkCi0jIHJlZmVyZW5jZXMuCi0jCi0KLXByb2MgZG9fOTMwNTA5YSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkaWZmZXJlbmNlIGJldHdlZW4gZm9yd2FyZCByZWZlcmVuY2VzIgotICAgIHNldCB4IDAKLSAgICBnYXNfc3RhcnQgIng5MzA1MDkucyIgIi1hbCIKLSAgICB3aGlsZSAxIHsKLSMgV2UgbmVlZCB0byBhY2NvbW9kYXRlIGJvdGggYnl0ZSBvcmRlcnMgaGVyZS4KLSMgSWYgIi5sb25nIiBtZWFucyBhbiA4LWJ5dGUgdmFsdWUgb24gc29tZSB0YXJnZXQgc29tZWRheSwgdGhpcyB0ZXN0IHdpbGwgaGF2ZQotIyB0byBiZSBmaXhlZC4KLQlleHBlY3QgewotCSAgICAtcmUgIl4gKzEgLi4uLiAwMDAwICowMDAwIiB7IGZhaWwgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICJeICsxIC4uLi4gMDQwMCAqMDAwMCIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiXiArMSAuLi4uIDAwMDAgKjAwMDQiIHsgcGFzcyAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iIHsgfQotCSAgICB0aW1lb3V0IHsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZiB7IGJyZWFrIH0KLQl9Ci0gICAgfQotICAgIGdhc19maW5pc2gKLSAgICBpZiAhJHggdGhlbiB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotIyBUaGlzIHRlc3QgaXMgbWVhbmluZ2xlc3MgZm9yIHRoZSBQQTsgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHN5bWJvbHMKLSMgbXVzdCBub3QgYmUgcmVzb2x2ZWQgYnkgdGhlIGFzc2VtYmxlci4KLWlmICFbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIHRoZSB2YXggZmFpbHMgYmVjYXVzZSBWTVMgY2FuIGFwcGFyZW50bHkgYWN0dWFsbHkgaGFuZGxlIHRoaXMKLSAgICAjIGNhc2UgaW4gcmVsb2NzLCBzbyBnYXMgZG9lc24ndCBoYW5kbGUgaXQgaXRzZWxmLgotICAgIHNldHVwX3hmYWlsICJ2YXgqLSotdm1zKiIKLSAgICBzZXR1cF94ZmFpbCAibW4xMDMwMCotKi0qIgotICAgIHNldHVwX3hmYWlsICJtbjEwMjAwKi0qLSoiCi0gICAgZG9fOTMwNTA5YQotfQotCi1jYXNlICR0YXJnZXRfdHJpcGxldCBpbiB7Ci0gICAgeyBocHBhKi0qLSogfSB7IH0KLSAgICBkZWZhdWx0IHsKLQlydW5fZHVtcF90ZXN0IHN0cnVjdAotCXJ1bl9kdW1wX3Rlc3QgYWxpZ24KLSAgICB9Ci19Ci0KLSMgVGhpcyB0ZXN0IGlzIGZvciBhbnkgQ09GRiB0YXJnZXQuCi0jIFdlIG9taXQgbTg4ayBDT0ZGIGJlY2F1c2UgaXQgdXNlcyB3ZWlyZCBwc2V1ZG8tb3AgbmFtZXMuCi0jIFdlIG9taXQgdGhlIEFSTSB0b29sY2hhaW5zIGJlY2F1c2UgdGhleSBkZWZpbmUgbG9jYWxzIHRvCi0jICBzdGFydCB3aXRoICcuJywgd2hpY2ggZWxpbWluYXRlcyAuZW9zLCAudGV4dCBldGMgZnJvbSB0aGUgb3V0cHV0LgotaWYgeyAgIChbaXN0YXJnZXQgKi0qLWNvZmYqXSAmJiAhW2lzdGFyZ2V0IG04OCotKi0qXSAmJiAhW2lzdGFyZ2V0ICphcm0qLSotY29mZl0gJiYgIVtpc3RhcmdldCB0aHVtYiotKi1jb2ZmXSkgXAotICAgICB8fChbaXN0YXJnZXQgKi0qLXBlKl0gJiYgIVtpc3RhcmdldCBhcm0qLSotcGUqXSAmJiAhW2lzdGFyZ2V0IHRodW1iKi0qLXBlKl0pIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGEyOWstKi11ZGkqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBhMjlrLSotZWJtb24qXSBcCi0gICAgIHx8IFtpc3RhcmdldCBhMjlrLSotc3ltKl0gXAotICAgICB8fCBbaXN0YXJnZXQgYTI5ay0qLXZ4d29ya3MqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotYWl4Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgaSo4Ni0qLXNjbypdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1pc2MqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotZ28zMipdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IGkqODYtKi1jeWd3aW4qXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpKjg2LSotKm50XSBcCi0gICAgIHx8IChbaXN0YXJnZXQgaTk2MC0qLXZ4d29ya3M1LipdICYmICFbaXN0YXJnZXQgaTk2MC0qLXZ4d29ya3M1LjAqXSkgfSB7Ci0gICAgcnVuX2R1bXBfdGVzdCBjb2ZmdGFnCi19Ci0KLSMgVGVzdCBvbWl0dGluZyBjb25kaXRpb25hbHMgZnJvbSBsaXN0aW5ncy4KLXByb2MgdGVzdF9jb25kIHt9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotCi0gICAgc2V0IHRlc3RuYW1lICJjb25kaXRpb25hbCBsaXN0aW5ncyIKLSAgICBnYXNfcnVuIGNvbmQucyAtYWxjICI+ZHVtcC5vdXQiCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCWZhaWwgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiB7IFtyZWdleHBfZGlmZiBkdW1wLm91dCAkc3JjZGlyLyRzdWJkaXIvY29uZC5kXSB9IHsKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9IGVsc2UgewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0KLSAgICB9Ci19Ci0KLXRlc3RfY29uZAotCi0jIEZJWE1FOiB0aGlzIGlzIGhlcmUgY2F1c2Ugb2YgYSBidWcgaW4gRGVqYUdudSAxLjEuMS4gV2hlbiBpdCBpcyBubyBsb25nZXIKLSMgICAgICAgIGluIHVzZSwgdGhlbiB0aGlzIGNhbiBiZSByZW1vdmVkLgotaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgdW5zZXQgZXJyb3JJbmZvCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzY2ZGZiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9pdGJsCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCi0gICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgotICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCi0gICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KLSAgICA7IFRoZSAicDxuPiIgcmVwcmVzZW50IHByb2Nlc3NvcnMgb2YgYSBtdWx0aS1wcm9jZXNzb3Igc3lzdGVtLgotCi0gICAgcDEgZHJlZyBkMSAxICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQxIiBmb3IgQ09QMSBoYXMgdmFsdWUgMQotICAgIHAxIGNyZWcgYzMgMyAgICAgICAgOyBjdHJsIHJlZ2lzdGVyICJjMyIgZm9yIENPUDEgaGFzIHZhbHVlIDMKLSAgICBwMyBpbnNuIGZpZSAweDFlOjI0LTIwICAgICAgOyBmdW5jdGlvbiAiZmlsbCIgZm9yIENPUDMgaGFzIHZhbHVlIDMxCi0gICAgcDMgZHJlZyBkMyAzICAgICAgICA7IGRhdGEgcmVnaXN0ZXIgImQzIiBmb3IgQ09QMyBoYXMgdmFsdWUgMwotICAgIHAzIGNyZWcgYzIgMjIgICAgICAgOyBjb250cm9sIHJlZ2lzdGVyICJjMiIgZm9yIENPUDMgaGFzIHZhbHVlIDIyCi0gICAgcDMgaW5zbiBmZWUgMHgxZToyNC0yMCxkcmVnOjE3LTEzLGNyZWc6MTItOCxpbW1lZDo3LTAKLQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZnVtIDB4MDFlMDAwMDEgZHJlZzoxNy0xMyBjcmVnOjEyLTgKLSAgICBwMyBpbnNuIGZvaCAweGY6MjQtMjEgZHJlZzoyMC0xNiBpbW1lZDoxNS0wCi0KLSAgICBwMyBpbnNuIHBpZyAweDE6MjQtMjEqWzB4MTAwfDB4Ml0sIGRyZWc6MjAtMTYsIGltbWVkOjE1LTAqMHgxMDAwMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzQ1NGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwtdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLQotCi0vKiBpdGJsLXRlc3QuYwotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLgotCi0gICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHQVMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogU3RhbmQtYWxvbmUgdGVzdCBmb3IgaW5zdHJ1Y3Rpb24gc3BlY2lmaWNhdGlvbiB0YWJsZSBzdXBwb3J0LgotICAgUnVuIHVzaW5nICJpdGJsLXRlc3QgPGl0Ymw+IDxhc20ucz4iCi0gICB3aGVyZSA8aXRibD4gaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uIHRhYmxlLAotICAgYW5kIDxhc20ucz4gaXMgdGhlIG5hbWUgb2YgdGhlIGFzc2VtYmxlciBmaWUuICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiaXRibC1vcHMuaCIKLQotc3RhdGljIGludCB0ZXN0X3JlZyAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKLQkJICAgICB1bnNpZ25lZCBsb25nIHZhbCk7Ci0KLWludCAKLW1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgdW5zaWduZWQgaW50IGluc247Ci0gIEZJTEUgKmZhczsKLSAgaW50IGFsaW5lID0gMDsKLSAgY2hhciBzWzgxXSwgKm5hbWU7Ci0KLSAgaWYgKGFyZ2MgPCAzKQotICAgIHsKLSAgICAgIHByaW50ZiAoInVzYWdlOiAlcyBpdGJsIGFzbS5zXG4iLCBhcmd2WzBdKTsKLSAgICAgIGV4aXQgKDApOwotICAgIH0KLSAgaWYgKGl0YmxfcGFyc2UgKGFyZ3ZbMV0pICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbGVkIHRvIHBhcnNlIGl0YmxcbiIpOwotICAgICAgZXhpdCAoMCk7Ci0gICAgfQotCi0gIGZhcyA9IGZvcGVuIChhcmd2WzJdLCAiciIpOwotICBpZiAoZmFzID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiZmFpbGVkIHRvIG9wZW4gYXNtIGZpbGUgJXNcbiIsIGFyZ3ZbMl0pOwotICAgICAgZXhpdCAoMCk7Ci0gICAgfQotICB3aGlsZSAoZmdldHMgKHMsIDgwLCBmYXMpKQotICAgIHsKLSAgICAgIGNoYXIgKnA7Ci0gICAgICBhbGluZSsrOwotCi0gICAgICBpZiAocCA9IHN0cmNociAocywgJzsnKSwgcCkJLyogc3RyaXAgY29tbWVudHMgKi8KLQkqcCA9IDA7Ci0gICAgICBpZiAocCA9IHN0cmNociAocywgJyMnKSwgcCkJLyogc3RyaXAgY29tbWVudHMgKi8KLQkqcCA9IDA7Ci0gICAgICBwID0gcyArIHN0cmxlbiAocykgLSAxOwotICAgICAgd2hpbGUgKHAgPj0gcyAmJiAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJ1xuJykpCS8qIHN0cmlwIHRyYWlsaW5nIHNwYWNlcyAqLwotCXAtLTsKLSAgICAgICoocCArIDEpID0gMDsKLSAgICAgIHAgPSBzOwotICAgICAgd2hpbGUgKCpwICYmICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JyB8fCAqcCA9PSAnXG4nKSkJLyogc3RyaXAgbGVhZGluZyBzcGFjZXMgKi8KLQlwKys7Ci0gICAgICBpZiAoISpwKQotCWNvbnRpbnVlOwotCi0gICAgICBuYW1lID0gaXRibF9nZXRfZmllbGQgKCZwKTsKLSAgICAgIGluc24gPSBpdGJsX2Fzc2VtYmxlIChuYW1lLCBwKTsKLSAgICAgIGlmIChpbnNuID09IDApCi0JcHJpbnRmICgibGluZSAlZDogSW52YWxpZCBpbnN0cnVjdGlvbiAoJXMpXG4iLCBhbGluZSwgcyk7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBidWZbMTI4XTsKLQkgIHByaW50ZiAoImxpbmUgJWQ6IGluc24oJXMpID0gMHgleClcbiIsIGFsaW5lLCBzLCBpbnNuKTsKLQkgIGlmICghaXRibF9kaXNhc3NlbWJsZSAoYnVmLCBpbnNuKSkKLQkgICAgcHJpbnRmICgibGluZSAlZDogQ2FuJ3QgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb24gIgotCQkgICAgIigweCV4KVxuIiwgYWxpbmUsIGluc24pOwotCSAgZWxzZQotCSAgICBwcmludGYgKCJsaW5lICVkOiBkaXNhc20oMHgleCkgPSAlcylcbiIsIGFsaW5lLCBpbnNuLCBidWYpOwotCX0KLSAgICB9Ci0KLSAgdGVzdF9yZWcgKDEsIGVfZHJlZywgImQxIiwgMSk7Ci0gIHRlc3RfcmVnICgzLCBlX2NyZWcsICJjMiIsIDIyKTsKLSAgdGVzdF9yZWcgKDMsIGVfZHJlZywgImQzIiwgMyk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgCi10ZXN0X3JlZyAoZV9wcm9jZXNzb3IgcHJvY2Vzc29yLCBlX3R5cGUgdHlwZSwgY2hhciAqbmFtZSwKLQkgIHVuc2lnbmVkIGxvbmcgdmFsKQotewotICBjaGFyICpuOwotICB1bnNpZ25lZCBsb25nIHY7Ci0KLSAgbiA9IGl0YmxfZ2V0X25hbWUgKHByb2Nlc3NvciwgdHlwZSwgdmFsKTsKLSAgaWYgKCFuIHx8IHN0cmNtcCAobiwgbmFtZSkpCi0gICAgcHJpbnRmICgiRXJyb3IgLSByZWcgbmFtZSBub3QgZm91bmQgZm9yIHByb2Vzc29yPSVkLCB0eXBlPSVkLCB2YWw9JWRcbiIsCi0JICAgIHByb2Nlc3NvciwgdHlwZSwgdmFsKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIm5hbWU9JXMgZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgdmFsPSVkXG4iLAotCSAgICBuLCBwcm9jZXNzb3IsIHR5cGUsIHZhbCk7Ci0KLSAgLyogV2UgcmVxdWlyZSB0aGF0IG5hbWVzIGJlIHVuaXF1ZSBhbW91bmcgcHJvY2Vzc29ycyBhbmQgdHlwZXMuICovCi0gIGlmICghIGl0YmxfZ2V0X3JlZ192YWwgKG5hbWUsICZ2KQotICAgICAgfHwgdiAhPSB2YWwpCi0gICAgcHJpbnRmICgiRXJyb3IgLSByZWcgdmFsIG5vdCBmb3VuZCBmb3IgcHJvY2Vzc29yPSVkLCB0eXBlPSVkLCBuYW1lPSVzXG4iLAotCSAgICBwcm9jZXNzb3IsIHR5cGUsIG5hbWUpOwotICBlbHNlCi0gICAgcHJpbnRmICgidmFsPTB4JXggZm91bmQgZm9yIHByb2Nlc3Nvcj0lZCwgdHlwZT0lZCwgbmFtZT0lc1xuIiwKLQkgICAgdiwgcHJvY2Vzc29yLCB0eXBlLCBuYW1lKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL2l0YmwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1MWFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvaXRibC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi0gICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgotICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCi0gICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KLQotICAgIDsgQXNzZW1ibGUgcHJvY2Vzc29yIGluc3RydWN0aW9ucyBhcyBkZWZpbmVkIGluICJpdGJsIi4KLQotICAgIGZlZSAkZDMsJGMyLDB4MSAJOyAgMHg0ZmYwNzYwMQotICAgIGZpZSAJICAJOyAgMHg0ZmYwMDAwMAotICAgIGZvaCAkMiwweDEwMAotICAgIGZ1bSAkZDMsJGMyICAgICAJOyAgMHg0ZmYwNzYwMQotICAgIHBpZyAkMiwweDEwMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvcDE0ODAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMTQ4MC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDBiYTgxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMTQ4MC5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zdGFydDoJLmxvbmcgMCwgMSwgMiwgMywgNCwgNSwgNiwgNwotCS5zcGFjZSAweDgwIC0gKC4gLSBzdGFydCkKLWZvbzoJLmxvbmcgNDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9wMjQyNS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AyNDI1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWRjOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3AyNDI1LnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkudGV4dAotCS5nbG9ibCBfZnJvYm5pdHoKLV9mcm9ibml0ejoKLQkubG9uZyAxLCAyLCAzLCA0LCA1LCA2LCA3LCBHUlVNUCwgNDIKLQlHUlVNUD0uLV9mcm9ibml0egotCUhBTEZHUlVNUD1HUlVNUC8yCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbGwvc3RydWN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzVkZDQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBzdHJ1Y3QKLQotIyBUZXN0IHRoZSAuc3RydWN0IHBzZXVkby1vcC4KLQotMCswMCBBIHcxCi0wKzAyIEEgdzIKLTArMDQgQSB3MwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3N0cnVjdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWNmZDBiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FsbC9zdHJ1Y3QucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuZ2xvYmwJdzEKLQkuZ2xvYmwJdzIKLQkuZ2xvYmwJdzMKLQkubG9uZwkwCi0JLnN0cnVjdAkwCi13MToJLnNob3J0CTAKLXcyOgkuc2hvcnQJMAotdzM6CS5zaG9ydAkwCi0JLnRleHQKLQkubG9uZwkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwveDkzMDUwOS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYWxsL3g5MzA1MDkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5OTk5MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbGwveDkzMDUwOS5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0JLmxvbmcgTDItTDEKLUwxOgkubG9uZyAweDEyMzQKLUwyOgkubG9uZyAweDU2NzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTZmN2U5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQotLio6ICAgICBmaWxlIGZvcm1hdCBlY29mZi1saXR0bGVhbHBoYQotCi1Db250ZW50cyBvZiBzZWN0aW9uIC5yZGF0YToKLSAwMDAwIDcxYTM3OTA5IDRmOTMwYTQwIDU0NDE3ODlhIGNkNGI4ODFiICBxLnkuTy4uQFRBeC4uSy4uCi0gMDAxMCAyYTQwNGY5MyA3OTA5NzFhMyA3ODlhNTQ0MCA1NDQxNzg5YSAgLkBPLnkucS54LlRAVEF4LgotIDAwMjAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYzg4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jCi0jIEFscGhhIE9TRi8xIHRlc3RzCi0jCi0KLWlmIFtpc3RhcmdldCBhbHBoYS0qLW9zZipdIHRoZW4gewotICAgIHNldCB0ZXN0bmFtZSAiZnAgY29uc3RhbnRzIChwYXJ0IDIpIgotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZwLnMiICIiICJmcCBjb25zdGFudHMgKHBhcnQgMSkiXSB0aGVuIHsKLQlvYmpkdW1wICItcyAtaiAucmRhdGEgPiBhLmR1bXAiCi0JaWYgeyBbcmVnZXhwX2RpZmYgImEuZHVtcCIgIiRzcmNkaXIvJHN1YmRpci9mcC5kIl0gPT0gMCB9IHRoZW4gewotCSAgICBwYXNzICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hbHBoYS9mcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2ViYmJlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FscGhhL2ZwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLnJkYXRhCi0jIFRoZXNlIHRocmVlIGZvcm1hdHMgYXJlIDggYnl0ZXMgZWFjaC4KLQkudF9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg3MSwgMHhhMywgMHg3OSwgMHgwOSwgMHg0ZiwgMHg5MywgMHgwYSwgMHg0MAotCS5kX2Zsb2F0aW5nIDMuMzIxOTI4MDk0ODg3MzYyMTgxNzFlMAotIwkuYnl0ZSAweDU0LCAweDQxLCAweDc4LCAweDlhLCAweGNkLCAweDRiLCAweDg4LCAweDFiCi0JLmdfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4MmEsIDB4NDAsIDB4NGYsIDB4OTMsIDB4NzksIDB4MDksIDB4NzEsIDB4YTMKLSMgVGhlIG5leHQgdHdvIGFyZSBmb3VyIGJ5dGVzIGVhY2guCi0JLnNfZmxvYXRpbmcgMy4zMjE5MjgwOTQ4ODczNjIxODE3MWUwCi0jCS5ieXRlIDB4NzgsIDB4OWEsIDB4NTQsIDB4NDAsIDAsIDAsIDAsIDAKLQkuZl9mbG9hdGluZyAzLjMyMTkyODA5NDg4NzM2MjE4MTcxZTAKLSMJLmJ5dGUgMHg1NCwgMHg0MSwgMHg3OCwgMHg5YSwgMCwgMCwgMCwgMAotCS5sb25nIDAsIDAsIDAsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWFjZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FsaWFzLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgQElDKzBAMDA4MjAwCUBPQ0AgcjAscjEKLTAwMDAwMDA0IEBJQyszQDZlMzgwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCBASUMrMEAxZmZlMDAJQE9DQCByMCwwCi0wMDAwMDAwYyBASUMrMEAzZmZmZmYJQE9DQCByMSwtMQotMDAwMDAwMTAgQElDKzdAZTEwNDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgQElDKzdAZTE4N2ZmCUBPQ0AgLTEscjMKLTAwMDAwMDE4IEBJQyswQDlmZmVmZglAT0NAIHI0LDI1NQotMDAwMDAwMWMgQElDKzdAZTI4YWZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCBASUMrMEBkZmZmMDAJQE9DQCByNiwtMjU2Ci0wMDAwMDAyNCBASUMrN0BlMzhmMDAJQE9DQCAtMjU2LHI3Ci0wMDAwMDAyOCBASUMrMUAxZjdjMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIEBJQysxQDNmN2MwMAlAT0NAIHI5LC0yNTcKLTAwMDAwMDM4IEBJQys3QGM1MTQwMAlAT0NAIDUxMSxyMTAKLTAwMDAwMDQwIEBJQysxQDdmN2MwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCBASUMrN0BjNjE4MDAJQE9DQCAzMDU0MTk4OTYscjEyCi0wMDAwMDA1MCBASUMrN0BmZjdjZmYJQE9DQCAyNTUsMjU2Ci0wMDAwMDA1OCBASUMrN0BkZmZlZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCBASUMrMEAxZjdjMDAJQE9DQCByMCwwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiBmb28KLTAwMDAwMDY4IEBJQyswQDAwODIwMAlAT0NAIHIwLHIxCi0wMDAwMDA2YyBASUMrMEA2MjA4MDAJQE9DQCByMyxyNAotMDAwMDAwNzAgQElDKzBAYzM4ZTAxCUBPQ0AuZXEgcjYscjcKLTAwMDAwMDc0IEBJQysxQDI1MTQwMQlAT0NALmVxIHI5LHIxMAotMDAwMDAwNzggQElDKzFAODY5YTAyCUBPQ0AubmUgcjEyLHIxMwotMDAwMDAwN2MgQElDKzFAZTgyMDAyCUBPQ0AubmUgcjE1LHIxNgotMDAwMDAwODAgQElDKzJANDlhNjAzCUBPQ0AucCByMTgscjE5Ci0wMDAwMDA4NCBASUMrMkBhYjJjMDMJQE9DQC5wIHIyMSxyMjIKLTAwMDAwMDg4IEBJQyszQDBjYjIwNAlAT0NALm4gcjI0LHIyNQotMDAwMDAwOGMgQElDKzNANmUzODA0CUBPQ0AubiBmcCxzcAotMDAwMDAwOTAgQElDKzNAY2ZiZTA1CUBPQ0AuYyBpbGluazIsYmxpbmsKLTAwMDAwMDk0IEBJQys0QDMxNDQwNQlAT0NALmMgcjMzLHIzNAotMDAwMDAwOTggQElDKzRAOTJjYTA1CUBPQ0AuYyByMzYscjM3Ci0wMDAwMDA5YyBASUMrNEBmNDUwMDYJQE9DQC5uYyByMzkscjQwCi0wMDAwMDBhMCBASUMrNUA1NWQ2MDYJQE9DQC5uYyByNDIscjQzCi0wMDAwMDBhNCBASUMrNUBiNzVjMDYJQE9DQC5uYyByNDUscjQ2Ci0wMDAwMDBhOCBASUMrNkAxOGUyMDcJQE9DQC52IHI0OCxyNDkKLTAwMDAwMGFjIEBJQys2QDdhNjgwNwlAT0NALnYgcjUxLHI1MgotMDAwMDAwYjAgQElDKzZAZGJlZTA4CUBPQ0AubnYgcjU0LHI1NQotMDAwMDAwYjQgQElDKzdAM2Q3NDA4CUBPQ0AubnYgcjU3LHI1OAotMDAwMDAwYjggQElDKzdAOWU3ODA5CUBPQ0AuZ3QgbHBfY291bnQsbHBfY291bnQKLTAwMDAwMGJjIEBJQyswQDFmN2MwYQlAT0NALmdlIHIwLDAKLTAwMDAwMGM0IEBJQys3QGMwODIwYglAT0NALmx0IDEscjEKLTAwMDAwMGNjIEBJQys3QGRmN2MwYwlAT0NALmxlIDIsMgotMDAwMDAwZDQgQElDKzBANjE4NjBkCUBPQ0AuaGkgcjMscjMKLTAwMDAwMGQ4IEBJQyswQDgyMDgwZQlAT0NALmxzIHI0LHI0Ci0wMDAwMDBkYyBASUMrMEBhMjhhMGYJQE9DQC5wbnogcjUscjUKLTAwMDAwMGUwIEBJQyswQDAwODMwMAlAT0NALmYgcjAscjEKLTAwMDAwMGU0IEBJQyswQDVlZmEwMQlAT0NALmYgcjIsMQotMDAwMDAwZTggQElDKzdAYTE4NjAxCUBPQ0AuZiAxLHIzCi0wMDAwMDBlYyBASUMrN0BhMjA4MDAJQE9DQC5mIDAscjQKLTAwMDAwMGYwIEBJQyswQGJmN2QwMAlAT0NALmYgcjUsNTEyCi0wMDAwMDBmOCBASUMrN0BjMzBkMDAJQE9DQC5mIDUxMixyNgotMDAwMDAxMDAgQElDKzdAZGY3ZDAwCUBPQ0AuZiA1MTIsNTEyCi0wMDAwMDEwOCBASUMrMEAwMDgzMDEJQE9DQC5lcS5mIHIwLHIxCi0wMDAwMDEwYyBASUMrMEAzZjdkMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMTE0IEBJQys3QGMxMDUwYglAT0NALmx0LmYgMCxyMgotMDAwMDAxMWMgQElDKzdAYzEwNTA5CUBPQ0AuZ3QuZiAxLHIyCi0wMDAwMDEyNCBASUMrMEAxZjdkMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAxMmMgQElDKzdAYzEwNTBhCUBPQ0AuZ2UuZiA1MTIscjIKLTAwMDAwMTM0IEBJQys3QGRmN2QwNAlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYWxpYXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI0NDQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hbGlhcy5zCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIyBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuYWwgcjAscjEKLQlAT0NALnJhIHIzLHI0Ci0JQE9DQC5lcSByNixyNwotCUBPQ0AueiByOSxyMTAKLQlAT0NALm5lIHIxMixyMTMKLQlAT0NALm56IHIxNSxyMTYKLQlAT0NALnBsIHIxOCxyMTkKLQlAT0NALnAgcjIxLHIyMgotCUBPQ0AubWkgcjI0LHIyNQotCUBPQ0AubiByMjcscjI4Ci0JQE9DQC5jcyByMzAscjMxCi0JQE9DQC5jIHIzMyxyMzQKLQlAT0NALmxvIHIzNixyMzcKLQlAT0NALmNjIHIzOSxyNDAKLQlAT0NALm5jIHI0MixyNDMKLQlAT0NALmhzIHI0NSxyNDYKLQlAT0NALnZzIHI0OCxyNDkKLQlAT0NALnYgcjUxLHI1MgotCUBPQ0AudmMgcjU0LHI1NQotCUBPQ0AubnYgcjU3LHI1OAotCUBPQ0AuZ3QgcjYwLHI2MAotCUBPQ0AuZ2UgcjAsMAotCUBPQ0AubHQgMSxyMQotCUBPQ0AubGUgMiwyCi0JQE9DQC5oaSByMyxyMwotCUBPQ0AubHMgcjQscjQKLQlAT0NALnBueiByNSxyNQotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMQotCUBPQ0AuZiByMiwxCi0JQE9DQC5mIDEscjMKLQlAT0NALmYgMCxyNAotCUBPQ0AuZiByNSw1MTIKLQlAT0NALmYgNTEyLHI2Ci0JQE9DQC5mIDUxMiw1MTIKLQotIyBjb25kaXRpb25hbCBleGVjdXRpb24gKyBmbGFnIHNldHRpbmcKLQlAT0NALmVxLmYgcjAscjEKLQlAT0NALm5lLmYgcjEsMAotCUBPQ0AubHQuZiAwLHIyCi0JQE9DQC5ndC5mIDEscjIKLQlAT0NALmxlLmYgcjAsNTEyCi0JQE9DQC5nZS5mIDUxMixyMgotCUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9hcmMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FyYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTg0NTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2FyYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyBBUkMgZ2FzIHRlc3RzdWl0ZQotCi0jIFRlc3QgYW4gaW5zbiBmcm9tIGEgdGVtcGxhdGUgLnMvLmQuCi0jIFRoZSBiZXN0IHdheSB0byBjcmVhdGUgdGhlIC5kIGZpbGUgaXMgdG8gcnVuIHRoZSB0ZXN0cyB3aXRob3V0IGl0LCBsZXQKLSMgZGVqYWdudSBjcmFzaCwgcnVuIGFzLm5ldyBvbiB0aGUganVzdCBidWlsdCAucyBmaWxlLCBydW4gb2JqZHVtcCAtZHIgb24KLSMgdGhlIHJlc3VsdCBvZiB0aGF0LCBjb3B5IHRoZSByZXN1bHQgaW50byB0aGUgLmQgZmlsZSwgYW5kIGVkaXQgaW4gdGhlCi0jIG5lY2Vzc2FyeSBwYXR0ZXJucyAoQE9DQCwgZXRjLikuICBTb3VuZHMgY29tcGxpY2F0ZWQgYnV0IGl0J3MgZWFzeS4gIFRoZQotIyBjYXRjaCBpcyB0aGF0IHdlIGFzc3VtZSBhIHdvcmtpbmcgYXNzZW1ibGVyIGlzIHVzZWQgdG8gYnVpbGQgaXQuICBUaGF0J3MKLSMgb2J2aW91c2x5IG5vdCBlbnRpcmVseSBrb3NoZXIsIGJ1dCBvbmNlIHRoZSAuZCBmaWxlIGlzIGNyZWF0ZWQgb25lIGNhbgotIyB2ZXJpZnkgaXQncyBjb250ZW50cyBvdmVyIHRpbWUuCi0jCi0jIFRlbXBsYXRlIHBhdHRlcm5zOgotIyBAT0NAIC0gcGxhY2Vob2xkZXIgZm9yIHRoZSBvcGNvZGUKLSMgQElDKz9AIC0gcGxhY2UgaG9sZGVyIGZvciB0aGUgaW5zbiBjb2RlCi0jIEBJMys/P0AgLSBwbGFjZSBob2xkZXIgZm9yIHRoZSBvcGVyYXRpb24gY29kZSBvZiBjb2RlIDMgaW5zbnMuCi0KLXByb2MgdGVzdF90ZW1wbGF0ZV9pbnNuIHsgY3B1IHRtcGwgb3Bjb2RlIGljb2RlIH0gewotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyIG9iamRpcgotCi0gICAgIyBDaGFuZ2UgQE9DQCBpbiB0aGUgdGVtcGxhdGUgZmlsZSB0byAkb3Bjb2RlCi0KLSAgICBzZXQgaW5fZmQgW29wZW4gJHNyY2Rpci8kc3ViZGlyLyR0bXBsLnMgcl0KLSAgICBzZXQgb3V0X2ZkIFtvcGVuICRvYmpkaXIvJG9wY29kZS5zIHddCi0gICAgIyBGSVhNRTogY2hlY2sgcmV0dXJuIGNvZGVzCi0KLSAgICBwdXRzICRvdXRfZmQgIlx0LmNwdSAkY3B1XG4iCi0gICAgd2hpbGUgeyBbZ2V0cyAkaW5fZmQgbGluZV0gPj0gMCB9IHsKLQlyZWdzdWIgIkBPQ0AiICRsaW5lICRvcGNvZGUgbGluZQotCXB1dHMgJG91dF9mZCAkbGluZQotICAgIH0KLQotICAgIGNsb3NlICRpbl9mZAotICAgIGNsb3NlICRvdXRfZmQKLQotICAgICMgQ3JlYXRlIG91dHB1dCB0ZW1wbGF0ZS4KLQotICAgIHNldCBpbl9mZCBbb3BlbiAkc3JjZGlyLyRzdWJkaXIvJHRtcGwuZCByXQotICAgIHNldCBvdXRfZmQgW29wZW4gJG9iamRpci8kb3Bjb2RlLmQgd10KLSAgICAjIEZJWE1FOiBjaGVjayByZXR1cm4gY29kZXMKLQotICAgIHdoaWxlIHsgW2dldHMgJGluX2ZkIGxpbmVdID49IDAgfSB7Ci0JcmVnc3ViICJAT0NAIiAkbGluZSAkb3Bjb2RlIGxpbmUKLQkjc2VuZF91c2VyICIkbGluZVxuIgotCWlmIFtzdHJpbmcgbWF0Y2ggIipASUMrP0AqIiAkbGluZV0gewotCSAgICAjIEluc2VydCB0aGUgb3Bjb2RlLiAgSXQgb2NjdXBpZXMgdGhlIHRvcCA1IGJpdHMuCi0JICAgIHJlZ2V4cCAiXiguKilASUNcXCsoLilAKC4qKSQiICRsaW5lIGp1bmsgbGVmdHBhcnQgbiByaWdodHBhcnQKLQkgICAgc2V0IG4gW2V4cHIgKCRpY29kZSA8PCAzKSArICRuXQotCSAgICBzZXQgbiBbZm9ybWF0ICIlMDJ4IiAkbl0KLQkgICAgcHV0cyAkb3V0X2ZkICIkbGVmdHBhcnQkbiRyaWdodHBhcnQiCi0JfSBlbHNlaWYgW3N0cmluZyBtYXRjaCAiKkBJMys/P0AqIiAkbGluZV0gewotCSAgICAjIEluc2VydCBpbnNuIDMgY29kZSAocmVnaXN0ZXIgQyBmaWVsZCkKLQkgICAgIyBiMTU9OC8wLCBiOD0xLzAgKHRoZWlyIHJlc3BlY3RpdmUgaGV4IHZhbHVlcyBpbiB0aGUgb2JqZHVtcCkKLQkgICAgcmVnZXhwICJeKC4qKUBJM1xcKyguKSguKUAoLiopJCIgJGxpbmUganVuayBsZWZ0cGFydCBiMTUgYjggcmlnaHRwYXJ0Ci0JICAgIHNldCBuIFtleHByICgkaWNvZGUgPDwgMSkgKyAoJGIxNSA8PCA0KSArICgkYjggPDwgMCldCi0JICAgIHNldCBuIFtmb3JtYXQgIiUwMngiICRuXQotCSAgICBwdXRzICRvdXRfZmQgIiRsZWZ0cGFydCRuJHJpZ2h0cGFydCIKLQl9IGVsc2UgewotCSAgICBwdXRzICRvdXRfZmQgJGxpbmUKLQl9Ci0gICAgfQotCi0gICAgY2xvc2UgJGluX2ZkCi0gICAgY2xvc2UgJG91dF9mZAotCi0gICAgIyBGaW5hbGx5LCBydW4gdGhlIHRlc3QuCi0KLSAgICBydW5fZHVtcF90ZXN0ICRvYmpkaXIvJG9wY29kZQotCi0gICAgIyAibWFrZSBjbGVhbiIgd29uJ3QgZGVsZXRlIHRoZXNlLCBzbyBmb3Igbm93IHdlIG11c3QuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG9iamRpci8kb3Bjb2RlLnMgJG9iamRpci8kb3Bjb2RlLmQiCi19Ci0KLSMgUnVuIHRoZSB0ZXN0cy4KLQotaWYgW2lzdGFyZ2V0IGFyYyotKi0qXSB0aGVuIHsKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggYWRjIDkKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGFkZCA4Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCBhbmQgMTIKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIGJpYyAxNAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggb3IgMTMKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBtYXRoIHNiYyAxMQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIG1hdGggc3ViIDEwCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgbWF0aCB4b3IgMTUKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIG1vdiAxMgotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGFsaWFzIHJsYyA5Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYWxpYXMgYXNsIDgKLSMgYGxzbCcgZ2V0cyBkdW1wZWQgYXMgYGFzbCcgc28gdGhpcyBtdXN0IGJlIHRlc3RlZCBlbHNld2hlcmUuCi0jICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYWxpYXMgbHNsIDgKLQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBhc3IgMQotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBsc3IgMgotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCByb3IgMwotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIHNzaGlmdCBycmMgNAotCi0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYnJhbmNoIGIgNAotICAgIHRlc3RfdGVtcGxhdGVfaW5zbiBiYXNlIGJyYW5jaCBibCA1Ci0gICAgdGVzdF90ZW1wbGF0ZV9pbnNuIGJhc2UgYnJhbmNoIGxwIDYKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImoiCi0KLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBzZXhiIDUKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBzZXh3IDYKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBleHRiIDcKLSAgICB0ZXN0X3RlbXBsYXRlX2luc24gYmFzZSBpbnNuMyBleHR3IDgKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImZsYWciCi0jICAgIHJ1bl9kdW1wX3Rlc3QgIm5vcCIKLQotICAgIHJ1bl9kdW1wX3Rlc3QgImxkIgotICAgIHJ1bl9kdW1wX3Rlc3QgInN0IgotCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWIwMTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2JyYW5jaC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDx0ZXh0X2xhYmVsPiBASUMrN0BmZmZmODAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDA0IDx0ZXh0X2xhYmVsXCs0PiBASUMrN0BmZmZmMDAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDA4IDx0ZXh0X2xhYmVsXCs4PiBASUMrN0BmZmZlODAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDBjIDx0ZXh0X2xhYmVsXCtjPiBASUMrN0BmZmZlMDEJQE9DQGVxIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTAgPHRleHRfbGFiZWxcKzEwPiBASUMrN0BmZmZkODEJQE9DQGVxIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTQgPHRleHRfbGFiZWxcKzE0PiBASUMrN0BmZmZkMDIJQE9DQG5lIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMTggPHRleHRfbGFiZWxcKzE4PiBASUMrN0BmZmZjODIJQE9DQG5lIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMWMgPHRleHRfbGFiZWxcKzFjPiBASUMrN0BmZmZjMDMJQE9DQHAgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyMCA8dGV4dF9sYWJlbFwrMjA+IEBJQys3QGZmZmI4MwlAT0NAcCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDI0IDx0ZXh0X2xhYmVsXCsyND4gQElDKzdAZmZmYjA0CUBPQ0BuIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMjggPHRleHRfbGFiZWxcKzI4PiBASUMrN0BmZmZhODQJQE9DQG4gMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAyYyA8dGV4dF9sYWJlbFwrMmM+IEBJQys3QGZmZmEwNQlAT0NAYyAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDMwIDx0ZXh0X2xhYmVsXCszMD4gQElDKzdAZmZmOTg1CUBPQ0BjIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwMzQgPHRleHRfbGFiZWxcKzM0PiBASUMrN0BmZmY5MDUJQE9DQGMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzOCA8dGV4dF9sYWJlbFwrMzg+IEBJQys3QGZmZjg4NglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDAzYyA8dGV4dF9sYWJlbFwrM2M+IEBJQys3QGZmZjgwNglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0MCA8dGV4dF9sYWJlbFwrNDA+IEBJQys3QGZmZjc4NglAT0NAbmMgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA0NCA8dGV4dF9sYWJlbFwrNDQ+IEBJQys3QGZmZjcwNwlAT0NAdiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDQ4IDx0ZXh0X2xhYmVsXCs0OD4gQElDKzdAZmZmNjg3CUBPQ0B2IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNGMgPHRleHRfbGFiZWxcKzRjPiBASUMrN0BmZmY2MDgJQE9DQG52IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTAgPHRleHRfbGFiZWxcKzUwPiBASUMrN0BmZmY1ODgJQE9DQG52IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTQgPHRleHRfbGFiZWxcKzU0PiBASUMrN0BmZmY1MDkJQE9DQGd0IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNTggPHRleHRfbGFiZWxcKzU4PiBASUMrN0BmZmY0OGEJQE9DQGdlIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNWMgPHRleHRfbGFiZWxcKzVjPiBASUMrN0BmZmY0MGIJQE9DQGx0IDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjAgPHRleHRfbGFiZWxcKzYwPiBASUMrN0BmZmYzOGMJQE9DQGxlIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjQgPHRleHRfbGFiZWxcKzY0PiBASUMrN0BmZmYzMGQJQE9DQGhpIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNjggPHRleHRfbGFiZWxcKzY4PiBASUMrN0BmZmYyOGUJQE9DQGxzIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwNmMgPHRleHRfbGFiZWxcKzZjPiBASUMrN0BmZmYyMGYJQE9DQHBueiAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDcwIDx0ZXh0X2xhYmVsXCs3MD4gQElDKzdAZmZmZjgwCUBPQ0AgMDAwMDAwNzAgPHRleHRfbGFiZWxcKzcwPgotCQlSRUxPQzogMDAwMDAwNzAgUl9BUkNfQjIyX1BDUkVMIGV4dGVybmFsX3RleHRfbGFiZWwKLTAwMDAwMDc0IDx0ZXh0X2xhYmVsXCs3ND4gQElDKzBAMDAwMDAwCUBPQ0AgMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PgotMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PiBASUMrN0BmZmYwYTAJQE9DQC5kIDAwMDAwMDAwIDx0ZXh0X2xhYmVsPgotMDAwMDAwN2MgPHRleHRfbGFiZWxcKzdjPiBASUMrN0BmZmYwMDAJQE9DQCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDgwIDx0ZXh0X2xhYmVsXCs4MD4gQElDKzdAZmZlZmMwCUBPQ0AuamQgMDAwMDAwMDAgPHRleHRfbGFiZWw+Ci0wMDAwMDA4NCA8dGV4dF9sYWJlbFwrODQ+IEBJQys3QGZmZWYyMQlAT0NAZXEuZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDg4IDx0ZXh0X2xhYmVsXCs4OD4gQElDKzdAZmZlZTgyCUBPQ0BuZSAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KLTAwMDAwMDhjIDx0ZXh0X2xhYmVsXCs4Yz4gQElDKzdAZmZlZTQ2CUBPQ0BuYy5qZCAwMDAwMDAwMCA8dGV4dF9sYWJlbD4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJmMTYxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIEBPQ0AgdGVzdAotCQotdGV4dF9sYWJlbDoKLQotIyBDb25kaXRpb24gdGVzdHMKLQlAT0NACXRleHRfbGFiZWwKLQlAT0NAYWwJdGV4dF9sYWJlbAotCUBPQ0ByYQl0ZXh0X2xhYmVsCi0JQE9DQGVxCXRleHRfbGFiZWwKLQlAT0NAegl0ZXh0X2xhYmVsCi0JQE9DQG5lCXRleHRfbGFiZWwKLQlAT0NAbnoJdGV4dF9sYWJlbAotCUBPQ0BwbAl0ZXh0X2xhYmVsCi0JQE9DQHAJdGV4dF9sYWJlbAotCUBPQ0BtaQl0ZXh0X2xhYmVsCi0JQE9DQG4JdGV4dF9sYWJlbAotCUBPQ0Bjcwl0ZXh0X2xhYmVsCi0JQE9DQGMJdGV4dF9sYWJlbAotCUBPQ0Bsbwl0ZXh0X2xhYmVsCi0JQE9DQGNjCXRleHRfbGFiZWwKLQlAT0NAbmMJdGV4dF9sYWJlbAotCUBPQ0Bocwl0ZXh0X2xhYmVsCi0JQE9DQHZzCXRleHRfbGFiZWwKLQlAT0NAdgl0ZXh0X2xhYmVsCi0JQE9DQHZjCXRleHRfbGFiZWwKLQlAT0NAbnYJdGV4dF9sYWJlbAotCUBPQ0BndAl0ZXh0X2xhYmVsCi0JQE9DQGdlCXRleHRfbGFiZWwKLQlAT0NAbHQJdGV4dF9sYWJlbAotCUBPQ0BsZQl0ZXh0X2xhYmVsCi0JQE9DQGhpCXRleHRfbGFiZWwKLQlAT0NAbHMJdGV4dF9sYWJlbAotCUBPQ0BwbnoJdGV4dF9sYWJlbAotCi0JQE9DQAlleHRlcm5hbF90ZXh0X2xhYmVsCi0KLQlAT0NACTAKLQotIyBEZWxheSBzbG90cwotCUBPQ0AuZAl0ZXh0X2xhYmVsCi0JQE9DQC5uZAl0ZXh0X2xhYmVsCi0JQE9DQC5qZAl0ZXh0X2xhYmVsCi0KLSMgQ29uZGl0aW9uIHRlc3RzIGFuZCBkZWxheSBzbG90cwotCUBPQ0BlcS5kCXRleHRfbGFiZWwKLQlAT0NAbmUubmQJdGV4dF9sYWJlbAotCUBPQ0BjYy5qZAl0ZXh0X2xhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmMzZkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGZsYWcKLQotIyBUZXN0IHRoZSBmbGFnIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLS4qYXJjCi0KLU5vIHN5bWJvbHMgaW4gImEub3V0Ii4KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCAxZmEwMDAwMAlmbGFnIHIwCi0wMDAwMDAwNCAxZmJmODAwMQlmbGFnIDEKLTAwMDAwMDA4IDFmYmY4MDAyCWZsYWcgMgotMDAwMDAwMGMgMWZiZjgwMDQJZmxhZyA0Ci0wMDAwMDAxMCAxZmJmODAwOAlmbGFnIDgKLTAwMDAwMDE0IDFmYmY4MDEwCWZsYWcgMTYKLTAwMDAwMDE4IDFmYmY4MDIwCWZsYWcgMzIKLTAwMDAwMDFjIDFmYmY4MDQwCWZsYWcgNjQKLTAwMDAwMDIwIDFmYmY4MDgwCWZsYWcgMTI4Ci0wMDAwMDAyNCAxZmJmMDAwMAlmbGFnIC0yMTQ3NDgzNjQ3Ci0wMDAwMDAyYyAxZmEwMDAwYglmbGFnLmx0IHIwCi0wMDAwMDAzMCAxZmJmMDAwOQlmbGFnLmd0IDEKLTAwMDAwMDM4IDFmYmYwMDA5CWZsYWcuZ3QgMgotMDAwMDAwNDAgMWZiZjAwMDkJZmxhZy5ndCA0Ci0wMDAwMDA0OCAxZmJmMDAwOQlmbGFnLmd0IDgKLTAwMDAwMDUwIDFmYmYwMDA5CWZsYWcuZ3QgMTYKLTAwMDAwMDU4IDFmYmYwMDA5CWZsYWcuZ3QgMzIKLTAwMDAwMDYwIDFmYmYwMDA5CWZsYWcuZ3QgNjQKLTAwMDAwMDY4IDFmYmYwMDA5CWZsYWcuZ3QgMTI4Ci0wMDAwMDA3MCAxZmJmMDAwYQlmbGFnLmdlIC0yMTQ3NDgzNjQ3CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ZsYWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA2N2FhNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvZmxhZy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBmbGFnIHRlc3QKLQotCWZsYWcJcjAKLQotCWZsYWcJMQotCWZsYWcJMgotCWZsYWcJNAotCWZsYWcJOAotCWZsYWcJMTYKLQlmbGFnCTMyCi0JZmxhZwk2NAotCWZsYWcJMTI4Ci0KLQlmbGFnCTB4ODAwMDAwMDEKLQotCWZsYWcubHQJcjAKLQotCWZsYWcuZ3QJMQotCWZsYWcuZ3QJMgotCWZsYWcuZ3QJNAotCWZsYWcuZ3QJOAotCWZsYWcuZ3QJMTYKLQlmbGFnLmd0CTMyCi0JZmxhZy5ndAk2NAotCWZsYWcuZ3QJMTI4Ci0KLQlmbGFnLmdlCTB4ODAwMDAwMDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9pbnNuMy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjA3YTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMTgwMEBJMys4MEAwMAlAT0NAIHIwLHIxCi0wMDAwMDAwNCAxYjZlQEkzKzAwQDAwCUBPQ0AgZnAsc3AKLTAwMDAwMDA4IDE4MWZASTMrODBAMDAJQE9DQCByMCwwCi0wMDAwMDAwYyAxODNmQEkzKzgxQGZmCUBPQ0AgcjEsLTEKLTAwMDAwMDEwIDFmZTFASTMrMDBAMDAJQE9DQCAwLHIyCi0wMDAwMDAxNCAxZmUxQEkzKzgxQGZmCUBPQ0AgLTEscjMKLTAwMDAwMDE4IDE4OWZASTMrODBAZmYJQE9DQCByNCwyNTUKLTAwMDAwMDFjIDFmZTJASTMrODBAZmYJQE9DQCAyNTUscjUKLTAwMDAwMDIwIDE4ZGZASTMrODFAMDAJQE9DQCByNiwtMjU2Ci0wMDAwMDAyNCAxZmUzQEkzKzgxQDAwCUBPQ0AgLTI1NixyNwotMDAwMDAwMjggMTkxZkBJMyswMEAwMAlAT0NAIHI4LDI1NgotMDAwMDAwMzAgMTkzZkBJMyswMEAwMAlAT0NAIHI5LC0yNTcKLTAwMDAwMDM4IDFmYzVASTMrMDBAMDAJQE9DQCA1MTEscjEwCi0wMDAwMDA0MCAxOTdmQEkzKzAwQDAwCUBPQ0AgcjExLDExMTE2Mzg1OTQKLTAwMDAwMDQ4IDFmYzZASTMrMDBAMDAJQE9DQCAzMDU0MTk4OTYscjEyCi0wMDAwMDA1MCAxZmZmQEkzKzAwQGZmCUBPQ0AgMjU1LDI1NgotMDAwMDAwNTggMWZkZkBJMys4MEBmZglAT0NAIDI1NiwyNTUKLTAwMDAwMDYwIDE4MWZASTMrMDBAMDAJQE9DQCByMCwwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiBmb28KLTAwMDAwMDY4IDE5NDVASTMrODBAMDEJQE9DQC5lcSByMTAscjExCi0wMDAwMDA2YyAxOTg2QEkzKzgwQDAyCUBPQ0AubmUgcjEyLHIxMwotMDAwMDAwNzAgMTlkZkBJMyswMEAwYglAT0NALmx0IHIxNCwwCi0wMDAwMDA3OCAxOWZmQEkzKzAwQDA5CUBPQ0AuZ3QgcjE1LDUxMgotMDAwMDAwODAgMTgwMEBJMys4MUAwMAlAT0NALmYgcjAscjEKLTAwMDAwMDg0IDE4NWVASTMrODBAMDEJQE9DQC5mIHIyLDEKLTAwMDAwMDg4IDFmYTJASTMrMDBAMDAJQE9DQC5mIDAscjQKLTAwMDAwMDhjIDE4YmZASTMrMDFAMDAJQE9DQC5mIHI1LDUxMgotMDAwMDAwOTQgMWZjM0BJMyswMUAwMAlAT0NALmYgNTEyLHI2Ci0wMDAwMDA5YyAxZmRmQEkzKzAxQDAwCUBPQ0AuZiA1MTIsNTEyCi0wMDAwMDBhNCAxODAwQEkzKzgxQDAxCUBPQ0AuZXEuZiByMCxyMQotMDAwMDAwYTggMTgzZkBJMyswMUAwMglAT0NALm5lLmYgcjEsMAotMDAwMDAwYjAgMWZjMUBJMyswMUAwYglAT0NALmx0LmYgMCxyMgotMDAwMDAwYjggMWZjMUBJMyswMUAwOQlAT0NALmd0LmYgMSxyMgotMDAwMDAwYzAgMTgxZkBJMyswMUAwYwlAT0NALmxlLmYgcjAsNTEyCi0wMDAwMDBjOCAxZmMxQEkzKzAxQDBhCUBPQ0AuZ2UuZiA1MTIscjIKLTAwMDAwMGQwIDFmZGZASTMrMDFAMDQJQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2luc24zLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyZmI4OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvaW5zbjMucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgSW5zbiAzIEBPQ0AgdGVzdAotCi0jIHJlZyxyZWcKLQlAT0NAIHIwLHIxCi0JQE9DQCBmcCxzcAotCi0jIHNoaW1tIHZhbHVlcwotCUBPQ0AgcjAsMAotCUBPQ0AgcjEsLTEKLQlAT0NAIDAscjIKLQlAT0NAIC0xLHIzCi0JQE9DQCByNCwyNTUKLQlAT0NAIDI1NSxyNQotCUBPQ0AgcjYsLTI1NgotCUBPQ0AgLTI1NixyNwotCi0jIGxpbW0gdmFsdWVzCi0JQE9DQCByOCwyNTYKLQlAT0NAIHI5LC0yNTcKLQlAT0NAIDUxMSxyMTAKLQlAT0NAIHIxMSwweDQyNDI0MjQyCi0JQE9DQCAweDEyMzQ1Njc4LHIxMgotCi0jIHNoaW1tIGFuZCBsaW1tCi0JQE9DQCAyNTUsMjU2Ci0JQE9DQCAyNTYsMjU1Ci0KLSMgc3ltYm9scwotCUBPQ0AgcjAsZm9vCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0JQE9DQC5lcSByMTAscjExCi0JQE9DQC5uZSByMTIscjEzCi0JQE9DQC5sdCByMTQsMAotCUBPQ0AuZ3QgcjE1LDUxMgotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMQotCUBPQ0AuZiByMiwxCi0JQE9DQC5mIDAscjQKLQlAT0NALmYgcjUsNTEyCi0JQE9DQC5mIDUxMixyNgotCUBPQ0AuZiA1MTIsNTEyCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uICsgZmxhZyBzZXR0aW5nCi0JQE9DQC5lcS5mIHIwLHIxCi0JQE9DQC5uZS5mIHIxLDAKLQlAT0NALmx0LmYgMCxyMgotCUBPQ0AuZ3QuZiAxLHIyCi0JQE9DQC5sZS5mIHIwLDUxMgotCUBPQ0AuZ2UuZiA1MTIscjIKLQlAT0NALm4uZiA1MTIsNTEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2ouZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxMDNmMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5kCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGoKLQotIyBUZXN0IHRoZSBqIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDx0ZXh0X2xhYmVsPiAzODAwMDAwMAlqIHIwCi0wMDAwMDAwNCA8dGV4dF9sYWJlbFwrND4gMzgwMDAwMjAJai5kIHIwCi0wMDAwMDAwOCA8dGV4dF9sYWJlbFwrOD4gMzgwMDAwNDAJai5qZCByMAotMDAwMDAwMGMgPHRleHRfbGFiZWxcK2M+IDM4MDAwMDAwCWogcjAKLTAwMDAwMDEwIDx0ZXh0X2xhYmVsXCsxMD4gMzgwMDgwMDAJaiByMQotMDAwMDAwMTQgPHRleHRfbGFiZWxcKzE0PiAzODAwODAyMAlqLmQgcjEKLTAwMDAwMDE4IDx0ZXh0X2xhYmVsXCsxOD4gMzgwMDgwNDAJai5qZCByMQotMDAwMDAwMWMgPHRleHRfbGFiZWxcKzFjPiAzODAwODAwMAlqIHIxCi0wMDAwMDAyMCA8dGV4dF9sYWJlbFwrMjA+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAwMjQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDI4IDx0ZXh0X2xhYmVsXCsyOD4gMzgxZjAwMDAJaiAwCi0JCVJFTE9DOiAwMDAwMDAyYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwMzAgPHRleHRfbGFiZWxcKzMwPiAzODFmMDAwMAlqIDAKLQkJUkVMT0M6IDAwMDAwMDM0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDAzOCA8dGV4dF9sYWJlbFwrMzg+IDM4MWYwMDAxCWplcSAwCi0JCVJFTE9DOiAwMDAwMDAzYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNDAgPHRleHRfbGFiZWxcKzQwPiAzODFmMDAwMQlqZXEgMAotCQlSRUxPQzogMDAwMDAwNDQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDQ4IDx0ZXh0X2xhYmVsXCs0OD4gMzgxZjAwMDIJam5lIDAKLQkJUkVMT0M6IDAwMDAwMDRjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDA1MCA8dGV4dF9sYWJlbFwrNTA+IDM4MWYwMDAyCWpuZSAwCi0JCVJFTE9DOiAwMDAwMDA1NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNTggPHRleHRfbGFiZWxcKzU4PiAzODFmMDAwMwlqcCAwCi0JCVJFTE9DOiAwMDAwMDA1YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNjAgPHRleHRfbGFiZWxcKzYwPiAzODFmMDAwMwlqcCAwCi0JCVJFTE9DOiAwMDAwMDA2NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNjggPHRleHRfbGFiZWxcKzY4PiAzODFmMDAwNAlqbiAwCi0JCVJFTE9DOiAwMDAwMDA2YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwNzAgPHRleHRfbGFiZWxcKzcwPiAzODFmMDAwNAlqbiAwCi0JCVJFTE9DOiAwMDAwMDA3NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwNzggPHRleHRfbGFiZWxcKzc4PiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA3YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwODAgPHRleHRfbGFiZWxcKzgwPiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA4NCBSX0FSQ18zMiAudGV4dAotMDAwMDAwODggPHRleHRfbGFiZWxcKzg4PiAzODFmMDAwNQlqYyAwCi0JCVJFTE9DOiAwMDAwMDA4YyBSX0FSQ18zMiAudGV4dAotMDAwMDAwOTAgPHRleHRfbGFiZWxcKzkwPiAzODFmMDAwNglqbmMgMAotCQlSRUxPQzogMDAwMDAwOTQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMDk4IDx0ZXh0X2xhYmVsXCs5OD4gMzgxZjAwMDYJam5jIDAKLQkJUkVMT0M6IDAwMDAwMDljIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBhMCA8dGV4dF9sYWJlbFwrYTA+IDM4MWYwMDA2CWpuYyAwCi0JCVJFTE9DOiAwMDAwMDBhNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYTggPHRleHRfbGFiZWxcK2E4PiAzODFmMDAwNwlqdiAwCi0JCVJFTE9DOiAwMDAwMDBhYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwYjAgPHRleHRfbGFiZWxcK2IwPiAzODFmMDAwNwlqdiAwCi0JCVJFTE9DOiAwMDAwMDBiNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwYjggPHRleHRfbGFiZWxcK2I4PiAzODFmMDAwOAlqbnYgMAotCQlSRUxPQzogMDAwMDAwYmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGMwIDx0ZXh0X2xhYmVsXCtjMD4gMzgxZjAwMDgJam52IDAKLQkJUkVMT0M6IDAwMDAwMGM0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBjOCA8dGV4dF9sYWJlbFwrYzg+IDM4MWYwMDA5CWpndCAwCi0JCVJFTE9DOiAwMDAwMDBjYyBSX0FSQ18zMiAudGV4dAotMDAwMDAwZDAgPHRleHRfbGFiZWxcK2QwPiAzODFmMDAwYQlqZ2UgMAotCQlSRUxPQzogMDAwMDAwZDQgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGQ4IDx0ZXh0X2xhYmVsXCtkOD4gMzgxZjAwMGIJamx0IDAKLQkJUkVMT0M6IDAwMDAwMGRjIFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBlMCA8dGV4dF9sYWJlbFwrZTA+IDM4MWYwMDBjCWpsZSAwCi0JCVJFTE9DOiAwMDAwMDBlNCBSX0FSQ18zMiAudGV4dAotMDAwMDAwZTggPHRleHRfbGFiZWxcK2U4PiAzODFmMDAwZAlqaGkgMAotCQlSRUxPQzogMDAwMDAwZWMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMGYwIDx0ZXh0X2xhYmVsXCtmMD4gMzgxZjAwMGUJamxzIDAKLQkJUkVMT0M6IDAwMDAwMGY0IFJfQVJDXzMyIC50ZXh0Ci0wMDAwMDBmOCA8dGV4dF9sYWJlbFwrZjg+IDM4MWYwMDBmCWpwbnogMAotCQlSRUxPQzogMDAwMDAwZmMgUl9BUkNfMzIgLnRleHQKLTAwMDAwMTAwIDx0ZXh0X2xhYmVsXCsxMDA+IDM4MWYwMDAwCWogMAotCQlSRUxPQzogMDAwMDAxMDQgUl9BUkNfMzIgZXh0ZXJuYWxfdGV4dF9sYWJlbAotMDAwMDAxMDggPHRleHRfbGFiZWxcKzEwOD4gMzgxZjAwMDAJaiAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2oucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE2MWFmMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvai5zCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBqIHRlc3QKLQkKLXRleHRfbGFiZWw6CQotCWoJcjAKLQlqLmQJcjAKLQlqLmpkCXIwCi0Jai5uZAlyMAotCi0Jai5mCVtyMV0KLQlqLmQuZglbcjFdCi0Jai5qZC5mCVtyMV0KLQlqLm5kLmYJW3IxXQotCi0Jagl0ZXh0X2xhYmVsCi0JamFsCXRleHRfbGFiZWwKLQlqcmEJdGV4dF9sYWJlbAotCWplcQl0ZXh0X2xhYmVsCi0JanoJdGV4dF9sYWJlbAotCWpuZQl0ZXh0X2xhYmVsCi0Jam56CXRleHRfbGFiZWwKLQlqcGwJdGV4dF9sYWJlbAotCWpwCXRleHRfbGFiZWwKLQlqbWkJdGV4dF9sYWJlbAotCWpuCXRleHRfbGFiZWwKLQlqY3MJdGV4dF9sYWJlbAotCWpjCXRleHRfbGFiZWwKLQlqbG8JdGV4dF9sYWJlbAotCWpjYwl0ZXh0X2xhYmVsCi0Jam5jCXRleHRfbGFiZWwKLQlqaHMJdGV4dF9sYWJlbAotCWp2cwl0ZXh0X2xhYmVsCi0JanYJdGV4dF9sYWJlbAotCWp2Ywl0ZXh0X2xhYmVsCi0Jam52CXRleHRfbGFiZWwKLQlqZ3QJdGV4dF9sYWJlbAotCWpnZQl0ZXh0X2xhYmVsCi0Jamx0CXRleHRfbGFiZWwKLQlqbGUJdGV4dF9sYWJlbAotCWpoaQl0ZXh0X2xhYmVsCi0JamxzCXRleHRfbGFiZWwKLQlqcG56CXRleHRfbGFiZWwKLQotCWoJZXh0ZXJuYWxfdGV4dF9sYWJlbAotCi0JagkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRkMGExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9sZC5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IGxkL2xyCi0KLSMgVGVzdCB0aGUgbGQvbHIgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgMDgwMDgwMDAJbGQgcjAsXFtyMVxdCi0wMDAwMDAwNCAwMDQxODgwMAlsZCByMixcW3IzLHI0XF0KLTAwMDAwMDA4IDA4YTMwMDAxCWxkIHI1LFxbcjYsMVxdCi0wMDAwMDAwYyAwOGU0MDFmZglsZCByNyxcW3I4LC0xXF0KLTAwMDAwMDEwIDA5MjUwMGZmCWxkIHI5LFxbcjEwLDI1NVxdCi0wMDAwMDAxNCAwOTY2MDEwMAlsZCByMTEsXFtyMTIsLTI1NlxdCi0wMDAwMDAxOCAwMWE3N2MwMAlsZCByMTMsXFtyMTQsMjU2XF0KLTAwMDAwMDIwIDAxZTg3YzAwCWxkIHIxNSxcW3IxNiwtMjU3XF0KLTAwMDAwMDI4IDAyM2YzODAwCWxkIHIxNyxcWzMwNTQxOTg5NixzcFxdCi0wMDAwMDAzMCAwYTdmMDAwMAlsZCByMTksXFswXF0KLQkJUkVMT0M6IDAwMDAwMDM0IFJfQVJDXzMyIGZvbwotMDAwMDAwMzggMGE5ZjAwMDAJbGQgcjIwLFxbNFxdCi0JCVJFTE9DOiAwMDAwMDAzYyBSX0FSQ18zMiBmb28KLTAwMDAwMDQwIDA4MWY4NDAwCWxkYiByMCxcWzBcXQotMDAwMDAwNDQgMDgxZjg4MDAJbGR3IHIwLFxbMFxdCi0wMDAwMDA0OCAwODFmODIwMAlsZC54IHIwLFxbMFxdCi0wMDAwMDA0YyAwODFmOTAwMAlsZC5hIHIwLFxbMFxdCi0wMDAwMDA1MCAwODFmYzAwMAlsZC5kaSByMCxcWzBcXQotMDAwMDAwNTQgMDgwMDU2MDAJbGRiLnguYS5kaSByMCxcW3IwXF0KLTAwMDAwMDU4IDA4MDBhMDAwCWxyIHIwLFxbcjFcXQotMDAwMDAwNWMgMDg1ZmEwMDAJbHIgcjIsXFtzdGF0dXNcXQotMDAwMDAwNjAgMDg3ZjIwMDAJbHIgcjMsXFszMDU0MTk4OTZcXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL2xkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNjcxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbGQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgbGQvbHIgdGVzdAotCQotCWxkCXIwLFtyMV0KLQlsZAlyMixbcjMscjRdCi0JbGQJcjUsW3I2LDFdCi0JbGQJcjcsW3I4LC0xXQotCWxkCXI5LFtyMTAsMjU1XQotCWxkCXIxMSxbcjEyLC0yNTZdCi0JbGQJcjEzLFtyMTQsMjU2XQotCWxkCXIxNSxbcjE2LC0yNTddCi0JbGQJcjE3LFsweDEyMzQ1Njc4LHIyOF0KLQlsZAlyMTksW2Zvb10KLQlsZAlyMjAsW2Zvbys0XQotCi0JbGRiCXIwLFswXQotCWxkdwlyMCxbMF0KLQlsZC54CXIwLFswXQotCWxkLmEJcjAsWzBdCi0JbGQuZGkJcjAsWzBdCi0JbGRiLnguYS5kaSByMCxbcjBdCi0KLQlscglyMCxbcjFdCi0JbHIJcjIsW3N0YXR1c10KLQlscglyMyxbMHgxMjM0NTY3OF0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvbWF0aC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2I3OWM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLmQKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogQE9DQAotCi0jIFRlc3QgdGhlIEBPQ0AgaW5zbi4KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi0uKmFyYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgQElDKzBAMDA4NDAwCUBPQ0AgcjAscjEscjIKLTAwMDAwMDA0IEBJQyszQDRkYjgwMAlAT0NAIHIyNixmcCxzcAotMDAwMDAwMDggQElDKzNAYWYzZTAwCUBPQ0AgaWxpbmsxLGlsaW5rMixibGluawotMDAwMDAwMGMgQElDKzdANWRmODAwCUBPQ0AgcjU4LHI1OSxscF9jb3VudAotMDAwMDAwMTAgQElDKzBAMDBmZTAwCUBPQ0AgcjAscjEsMAotMDAwMDAwMTQgQElDKzBAMWY4NDAwCUBPQ0AgcjAsMCxyMgotMDAwMDAwMTggQElDKzdAZTA4NDAwCUBPQ0AgMCxyMSxyMgotMDAwMDAwMWMgQElDKzBAMDBmZmZmCUBPQ0AgcjAscjEsLTEKLTAwMDAwMDIwIEBJQyswQDFmODVmZglAT0NAIHIwLC0xLHIyCi0wMDAwMDAyNCBASUMrN0BlMDg1ZmYJQE9DQCAtMSxyMSxyMgotMDAwMDAwMjggQElDKzBAMDBmZWZmCUBPQ0AgcjAscjEsMjU1Ci0wMDAwMDAyYyBASUMrMEAxZjg0ZmYJQE9DQCByMCwyNTUscjIKLTAwMDAwMDMwIEBJQys3QGUwODRmZglAT0NAIDI1NSxyMSxyMgotMDAwMDAwMzQgQElDKzBAMDBmZjAwCUBPQ0AgcjAscjEsLTI1NgotMDAwMDAwMzggQElDKzBAMWY4NTAwCUBPQ0AgcjAsLTI1NixyMgotMDAwMDAwM2MgQElDKzdAZTA4NTAwCUBPQ0AgLTI1NixyMSxyMgotMDAwMDAwNDAgQElDKzBAMDBmYzAwCUBPQ0AgcjAscjEsMjU2Ci0wMDAwMDA0OCBASUMrMEAxZjA0MDAJQE9DQCByMCwtMjU3LHIyCi0wMDAwMDA1MCBASUMrN0BjMDg0MDAJQE9DQCA1MTEscjEscjIKLTAwMDAwMDU4IEBJQyswQDFmMDQwMAlAT0NAIHIwLDExMTE2Mzg1OTQscjIKLTAwMDAwMDYwIEBJQys3QGMwZmMwMAlAT0NAIDMwNTQxOTg5NixyMSwzMDU0MTk4OTYKLTAwMDAwMDY4IEBJQyswQDFmZmNmZglAT0NAIHIwLDI1NSwyNTYKLTAwMDAwMDcwIEBJQyswQDFmN2VmZglAT0NAIHIwLDI1NiwyNTUKLTAwMDAwMDc4IEBJQys3QGUwZmNmZglAT0NAIDI1NSxyMSwyNTYKLTAwMDAwMDgwIEBJQys3QGZmMDRmZglAT0NAIDI1NSwyNTYscjIKLTAwMDAwMDg4IEBJQys3QGMwZmVmZglAT0NAIDI1NixyMSwyNTUKLTAwMDAwMDkwIEBJQys3QGRmODRmZglAT0NAIDI1NiwyNTUscjIKLTAwMDAwMDk4IEBJQyswQDAwZmMwMAlAT0NAIHIwLHIxLDAKLQkJUkVMT0M6IDAwMDAwMDljIFJfQVJDXzMyIGZvbwotMDAwMDAwYTAgQElDKzBAMDA4NDAwCUBPQ0AgcjAscjEscjIKLTAwMDAwMGE0IEBJQyswQDYyMGEwMAlAT0NAIHIzLHI0LHI1Ci0wMDAwMDBhOCBASUMrMEBjMzkwMDEJQE9DQC5lcSByNixyNyxyOAotMDAwMDAwYWMgQElDKzFAMjUxNjAxCUBPQ0AuZXEgcjkscjEwLHIxMQotMDAwMDAwYjAgQElDKzFAODY5YzAyCUBPQ0AubmUgcjEyLHIxMyxyMTQKLTAwMDAwMGI0IEBJQysxQGU4MjIwMglAT0NALm5lIHIxNSxyMTYscjE3Ci0wMDAwMDBiOCBASUMrMkA0OWE4MDMJQE9DQC5wIHIxOCxyMTkscjIwCi0wMDAwMDBiYyBASUMrMkBhYjJlMDMJQE9DQC5wIHIyMSxyMjIscjIzCi0wMDAwMDBjMCBASUMrM0AwY2I0MDQJQE9DQC5uIHIyNCxyMjUscjI2Ci0wMDAwMDBjNCBASUMrM0A2ZTNhMDQJQE9DQC5uIGZwLHNwLGlsaW5rMQotMDAwMDAwYzggQElDKzNAY2ZjMDA1CUBPQ0AuYyBpbGluazIsYmxpbmsscjMyCi0wMDAwMDBjYyBASUMrNEAzMTQ2MDUJQE9DQC5jIHIzMyxyMzQscjM1Ci0wMDAwMDBkMCBASUMrNEA5MmNjMDUJQE9DQC5jIHIzNixyMzcscjM4Ci0wMDAwMDBkNCBASUMrNEBmNDUyMDYJQE9DQC5uYyByMzkscjQwLHI0MQotMDAwMDAwZDggQElDKzVANTVkODA2CUBPQ0AubmMgcjQyLHI0MyxyNDQKLTAwMDAwMGRjIEBJQys1QGI3NWUwNglAT0NALm5jIHI0NSxyNDYscjQ3Ci0wMDAwMDBlMCBASUMrNkAxOGU0MDcJQE9DQC52IHI0OCxyNDkscjUwCi0wMDAwMDBlNCBASUMrNkA3YTZhMDcJQE9DQC52IHI1MSxyNTIscjUzCi0wMDAwMDBlOCBASUMrNkBkYmYwMDgJQE9DQC5udiByNTQscjU1LHI1NgotMDAwMDAwZWMgQElDKzdAM2Q3NjA4CUBPQ0AubnYgcjU3LHI1OCxyNTkKLTAwMDAwMGYwIEBJQys3QDllMDAwOQlAT0NALmd0IGxwX2NvdW50LGxwX2NvdW50LHIwCi0wMDAwMDBmNCBASUMrMEAwMDdjMGEJQE9DQC5nZSByMCxyMCwwCi0wMDAwMDBmYyBASUMrMEAzZjAyMGIJQE9DQC5sdCByMSwxLHIxCi0wMDAwMDEwNCBASUMrN0BjMDg0MGMJQE9DQC5sZSAyLHIxLHIyCi0wMDAwMDEwYyBASUMrMEA3ZjA2MGQJQE9DQC5oaSByMywzLHIzCi0wMDAwMDExNCBASUMrN0BkZjA4MGUJQE9DQC5scyA0LDQscjQKLTAwMDAwMTFjIEBJQys3QGMyZmMwZglAT0NALnBueiA1LHI1LDUKLTAwMDAwMTI0IEBJQyswQDAwODUwMAlAT0NALmYgcjAscjEscjIKLTAwMDAwMTI4IEBJQyswQDAwZmEwMQlAT0NALmYgcjAscjEsMQotMDAwMDAxMmMgQElDKzBAMWU4NDAxCUBPQ0AuZiByMCwxLHIyCi0wMDAwMDEzMCBASUMrN0BhMDg0MDAJQE9DQC5mIDAscjEscjIKLTAwMDAwMTM0IEBJQyswQDAwZmQwMAlAT0NALmYgcjAscjEsNTEyCi0wMDAwMDEzYyBASUMrMEAxZjA1MDAJQE9DQC5mIHIwLDUxMixyMgotMDAwMDAxNDQgQElDKzdAYzA4NTAwCUBPQ0AuZiA1MTIscjEscjIKLTAwMDAwMTRjIEBJQyswQDAwODUwMQlAT0NALmVxLmYgcjAscjEscjIKLTAwMDAwMTUwIEBJQyswQDAwZmQwMglAT0NALm5lLmYgcjAscjEsMAotMDAwMDAxNTggQElDKzBAMWYwNTBiCUBPQ0AubHQuZiByMCwwLHIyCi0wMDAwMDE2MCBASUMrN0BjMDg1MDkJQE9DQC5ndC5mIDAscjEscjIKLTAwMDAwMTY4IEBJQyswQDAwZmQwYwlAT0NALmxlLmYgcjAscjEsNTEyCi0wMDAwMDE3MCBASUMrMEAxZjA1MGEJQE9DQC5nZS5mIHIwLDUxMixyMgotMDAwMDAxNzggQElDKzdAYzA4NTA0CUBPQ0Aubi5mIDUxMixyMSxyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9tYXRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTE2OWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL21hdGgucworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLSMgQE9DQCB0ZXN0Ci0KLSMgU3RheSBhd2F5IGZyb20gb3BlcmFuZHMgd2l0aCBkdXBsaWNhdGUgYXJndW1lbnRzIChlZzoJYWRkIHIwLHIxLHIxKS4KLSMgVGhleSB3aWxsIGJlIGRpc2Fzc2VtYmxlZCBhcyB0aGV5J3JlIG1hY3JvIGNvdW50ZXJwYXJ0cyAoZWc6IGFzbCByMCxyMSkuCi0KLSMgcmVnLHJlZyxyZWcKLQlAT0NAIHIwLHIxLHIyCi0JQE9DQCByMjYsZnAsc3AKLQlAT0NAIGlsaW5rMSxpbGluazIsYmxpbmsKLQlAT0NAIHI1OCxyNTksbHBfY291bnQKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLHIxLDAKLQlAT0NAIHIwLDAscjIKLQlAT0NAIDAscjEscjIKLQlAT0NAIHIwLHIxLC0xCi0JQE9DQCByMCwtMSxyMgotCUBPQ0AgLTEscjEscjIKLQlAT0NAIHIwLHIxLDI1NQotCUBPQ0AgcjAsMjU1LHIyCi0JQE9DQCAyNTUscjEscjIKLQlAT0NAIHIwLHIxLC0yNTYKLQlAT0NAIHIwLC0yNTYscjIKLQlAT0NAIC0yNTYscjEscjIKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjAscjEsMjU2Ci0JQE9DQCByMCwtMjU3LHIyCi0JQE9DQCA1MTEscjEscjIKLQlAT0NAIHIwLDB4NDI0MjQyNDIscjIKLQlAT0NAIDB4MTIzNDU2NzgscjEsMHgxMjM0NTY3OAotCi0jIHNoaW1tIGFuZCBsaW1tCi0JQE9DQCByMCwyNTUsMjU2Ci0JQE9DQCByMCwyNTYsMjU1Ci0JQE9DQCAyNTUscjEsMjU2Ci0JQE9DQCAyNTUsMjU2LHIyCi0JQE9DQCAyNTYscjEsMjU1Ci0JQE9DQCAyNTYsMjU1LHIyCi0KLSMgc3ltYm9scwotCUBPQ0AgcjAscjEsZm9vCi0KLSMgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0JQE9DQC5hbCByMCxyMSxyMgotCUBPQ0AucmEgcjMscjQscjUKLQlAT0NALmVxIHI2LHI3LHI4Ci0JQE9DQC56IHI5LHIxMCxyMTEKLQlAT0NALm5lIHIxMixyMTMscjE0Ci0JQE9DQC5ueiByMTUscjE2LHIxNwotCUBPQ0AucGwgcjE4LHIxOSxyMjAKLQlAT0NALnAgcjIxLHIyMixyMjMKLQlAT0NALm1pIHIyNCxyMjUscjI2Ci0JQE9DQC5uIHIyNyxyMjgscjI5Ci0JQE9DQC5jcyByMzAscjMxLHIzMgotCUBPQ0AuYyByMzMscjM0LHIzNQotCUBPQ0AubG8gcjM2LHIzNyxyMzgKLQlAT0NALmNjIHIzOSxyNDAscjQxCi0JQE9DQC5uYyByNDIscjQzLHI0NAotCUBPQ0AuaHMgcjQ1LHI0NixyNDcKLQlAT0NALnZzIHI0OCxyNDkscjUwCi0JQE9DQC52IHI1MSxyNTIscjUzCi0JQE9DQC52YyByNTQscjU1LHI1NgotCUBPQ0AubnYgcjU3LHI1OCxyNTkKLQlAT0NALmd0IHI2MCxyNjAscjAKLQlAT0NALmdlIHIwLHIwLDAKLQlAT0NALmx0IHIxLDEscjEKLQlAT0NALmxlIDIscjEscjIKLQlAT0NALmhpIHIzLDMscjMKLQlAT0NALmxzIDQsNCxyNAotCUBPQ0AucG56IDUscjUsNQotCi0jIGZsYWcgc2V0dGluZwotCUBPQ0AuZiByMCxyMSxyMgotCUBPQ0AuZiByMCxyMSwxCi0JQE9DQC5mIHIwLDEscjIKLQlAT0NALmYgMCxyMSxyMgotCUBPQ0AuZiByMCxyMSw1MTIKLQlAT0NALmYgcjAsNTEyLHIyCi0JQE9DQC5mIDUxMixyMSxyMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMSxyMgotCUBPQ0AubmUuZiByMCxyMSwwCi0JQE9DQC5sdC5mIHIwLDAscjIKLQlAT0NALmd0LmYgMCxyMSxyMgotCUBPQ0AubGUuZiByMCxyMSw1MTIKLQlAT0NALmdlLmYgcjAsNTEyLHIyCi0JQE9DQC5uLmYgNTEyLHIxLHIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjA3YTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3NzaGlmdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEBPQ0AKLQotIyBUZXN0IHRoZSBAT0NAIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDE4MDBASTMrODBAMDAJQE9DQCByMCxyMQotMDAwMDAwMDQgMWI2ZUBJMyswMEAwMAlAT0NAIGZwLHNwCi0wMDAwMDAwOCAxODFmQEkzKzgwQDAwCUBPQ0AgcjAsMAotMDAwMDAwMGMgMTgzZkBJMys4MUBmZglAT0NAIHIxLC0xCi0wMDAwMDAxMCAxZmUxQEkzKzAwQDAwCUBPQ0AgMCxyMgotMDAwMDAwMTQgMWZlMUBJMys4MUBmZglAT0NAIC0xLHIzCi0wMDAwMDAxOCAxODlmQEkzKzgwQGZmCUBPQ0AgcjQsMjU1Ci0wMDAwMDAxYyAxZmUyQEkzKzgwQGZmCUBPQ0AgMjU1LHI1Ci0wMDAwMDAyMCAxOGRmQEkzKzgxQDAwCUBPQ0AgcjYsLTI1NgotMDAwMDAwMjQgMWZlM0BJMys4MUAwMAlAT0NAIC0yNTYscjcKLTAwMDAwMDI4IDE5MWZASTMrMDBAMDAJQE9DQCByOCwyNTYKLTAwMDAwMDMwIDE5M2ZASTMrMDBAMDAJQE9DQCByOSwtMjU3Ci0wMDAwMDAzOCAxZmM1QEkzKzAwQDAwCUBPQ0AgNTExLHIxMAotMDAwMDAwNDAgMTk3ZkBJMyswMEAwMAlAT0NAIHIxMSwxMTExNjM4NTk0Ci0wMDAwMDA0OCAxZmM2QEkzKzAwQDAwCUBPQ0AgMzA1NDE5ODk2LHIxMgotMDAwMDAwNTAgMWZmZkBJMyswMEBmZglAT0NAIDI1NSwyNTYKLTAwMDAwMDU4IDFmZGZASTMrODBAZmYJQE9DQCAyNTYsMjU1Ci0wMDAwMDA2MCAxODFmQEkzKzAwQDAwCUBPQ0AgcjAsMAotCQlSRUxPQzogMDAwMDAwNjQgUl9BUkNfMzIgZm9vCi0wMDAwMDA2OCAxOTQ1QEkzKzgwQDAxCUBPQ0AuZXEgcjEwLHIxMQotMDAwMDAwNmMgMTk4NkBJMys4MEAwMglAT0NALm5lIHIxMixyMTMKLTAwMDAwMDcwIDE5ZGZASTMrMDBAMGIJQE9DQC5sdCByMTQsMAotMDAwMDAwNzggMTlmZkBJMyswMEAwOQlAT0NALmd0IHIxNSw1MTIKLTAwMDAwMDgwIDE4MDBASTMrODFAMDAJQE9DQC5mIHIwLHIxCi0wMDAwMDA4NCAxODVlQEkzKzgwQDAxCUBPQ0AuZiByMiwxCi0wMDAwMDA4OCAxZmEyQEkzKzAwQDAwCUBPQ0AuZiAwLHI0Ci0wMDAwMDA4YyAxOGJmQEkzKzAxQDAwCUBPQ0AuZiByNSw1MTIKLTAwMDAwMDk0IDFmYzNASTMrMDFAMDAJQE9DQC5mIDUxMixyNgotMDAwMDAwOWMgMWZkZkBJMyswMUAwMAlAT0NALmYgNTEyLDUxMgotMDAwMDAwYTQgMTgwMEBJMys4MUAwMQlAT0NALmVxLmYgcjAscjEKLTAwMDAwMGE4IDE4M2ZASTMrMDFAMDIJQE9DQC5uZS5mIHIxLDAKLTAwMDAwMGIwIDFmYzFASTMrMDFAMGIJQE9DQC5sdC5mIDAscjIKLTAwMDAwMGI4IDFmYzFASTMrMDFAMDkJQE9DQC5ndC5mIDEscjIKLTAwMDAwMGMwIDE4MWZASTMrMDFAMGMJQE9DQC5sZS5mIHIwLDUxMgotMDAwMDAwYzggMWZjMUBJMyswMUAwYQlAT0NALmdlLmYgNTEyLHIyCi0wMDAwMDBkMCAxZmRmQEkzKzAxQDA0CUBPQ0Aubi5mIDUxMiw1MTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy9zc2hpZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmYTY2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3NoaWZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIFNpbmdsZSBzaGlmdCBAT0NAIHRlc3QKLQotIyByZWcscmVnCi0JQE9DQCByMCxyMQotCUBPQ0AgZnAsc3AKLQotIyBzaGltbSB2YWx1ZXMKLQlAT0NAIHIwLDAKLQlAT0NAIHIxLC0xCi0JQE9DQCAwLHIyCi0JQE9DQCAtMSxyMwotCUBPQ0AgcjQsMjU1Ci0JQE9DQCAyNTUscjUKLQlAT0NAIHI2LC0yNTYKLQlAT0NAIC0yNTYscjcKLQotIyBsaW1tIHZhbHVlcwotCUBPQ0AgcjgsMjU2Ci0JQE9DQCByOSwtMjU3Ci0JQE9DQCA1MTEscjEwCi0JQE9DQCByMTEsMHg0MjQyNDI0MgotCUBPQ0AgMHgxMjM0NTY3OCxyMTIKLQotIyBzaGltbSBhbmQgbGltbQotCUBPQ0AgMjU1LDI1NgotCUBPQ0AgMjU2LDI1NQotCi0jIHN5bWJvbHMKLQlAT0NAIHIwLGZvbwotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbgotCUBPQ0AuZXEgcjEwLHIxMQotCUBPQ0AubmUgcjEyLHIxMwotCUBPQ0AubHQgcjE0LDAKLQlAT0NALmd0IHIxNSw1MTIKLQotIyBmbGFnIHNldHRpbmcKLQlAT0NALmYgcjAscjEKLQlAT0NALmYgcjIsMQotCUBPQ0AuZiAwLHI0Ci0JQE9DQC5mIHI1LDUxMgotCUBPQ0AuZiA1MTIscjYKLQlAT0NALmYgNTEyLDUxMgotCi0jIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiArIGZsYWcgc2V0dGluZwotCUBPQ0AuZXEuZiByMCxyMQotCUBPQ0AubmUuZiByMSwwCi0JQE9DQC5sdC5mIDAscjIKLQlAT0NALmd0LmYgMSxyMgotCUBPQ0AubGUuZiByMCw1MTIKLQlAT0NALmdlLmYgNTEyLHIyCi0JQE9DQC5uLmYgNTEyLDUxMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhOTlhOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzdC9zcgotCi0jIFRlc3QgdGhlIHN0L3NyIGluc24uCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItLiphcmMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTAwMDAwMDAwIDEwMDA4MDAwCXN0IHIwLFxbcjFcXQotMDAwMDAwMDQgMTAwMzBhMDEJc3QgcjUsXFtyNiwxXF0KLTAwMDAwMDA4IDEwMDQwZmZmCXN0IHI3LFxbcjgsLTFcXQotMDAwMDAwMGMgMTAwNTEyZmYJc3QgcjksXFtyMTAsMjU1XF0KLTAwMDAwMDEwIDEwMDYxNzAwCXN0IHIxMSxcW3IxMiwtMjU2XF0KLTAwMDAwMDE0IDEwMWYyNjAwCXN0IHIxOSxcWzBcXQotCQlSRUxPQzogMDAwMDAwMTggUl9BUkNfMzIgZm9vCi0wMDAwMDAxYyAxMDFmMjgwMAlzdCByMjAsXFs0XF0KLQkJUkVMT0M6IDAwMDAwMDIwIFJfQVJDXzMyIGZvbwotMDAwMDAwMjQgMTA1ZjAwMDAJc3RiIHIwLFxbMFxdCi0wMDAwMDAyYyAxMDlmMDAwMAlzdHcgcjAsXFswXF0KLTAwMDAwMDM0IDExMWYwMDAwCXN0LmEgcjAsXFswXF0KLTAwMDAwMDNjIDE0MWYwMDAwCXN0LmRpIHIwLFxbMFxdCi0wMDAwMDA0NCAxNTQwMDAwMAlzdGIuYS5kaSByMCxcW3IwXF0KLTAwMDAwMDQ4IDEyMDA4MDAwCXNyIHIwLFxbcjFcXQotMDAwMDAwNGMgMTIxZjg0MDAJc3IgcjIsXFtzdGF0dXNcXQotMDAwMDAwNTAgMTIxZjA2MDAJc3IgcjMsXFszMDU0MTk4OTZcXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3N0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhZjE5OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvc3QucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgc3Qvc3IgdGVzdAotCQotCXN0CXIwLFtyMV0KLQlzdAlyNSxbcjYsMV0KLQlzdAlyNyxbcjgsLTFdCi0Jc3QJcjksW3IxMCwyNTVdCi0Jc3QJcjExLFtyMTIsLTI1Nl0KLQlzdAlyMTksW2Zvb10KLQlzdAlyMjAsW2Zvbys0XQotCi0Jc3RiCXIwLFswXQotCXN0dwlyMCxbMF0KLQlzdC5hCXIwLFswXQotCXN0LmRpCXIwLFswXQotCXN0Yi5hLmRpIHIwLFtyMF0KLQotCXNyCXIwLFtyMV0KLQlzcglyMixbc3RhdHVzXQotCXNyCXIzLFsweDEyMzQ1Njc4XQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4uZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJjL3dhcm4uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWZmMTI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgVGVzdCBhc3NlbWJsZXIgd2FybmluZ3MuCi0KLWlmIFtpc3RhcmdldCBhcmMqLSotKl0gewotCi0gICAgbG9hZF9saWIgZ2FzLWRnLmV4cAotCi0gICAgZGctaW5pdAotCi0gICAgZGctcnVudGVzdCBbbHNvcnQgW2dsb2IgLW5vY29tcGxhaW4gJHNyY2Rpci8kc3ViZGlyL3dhcm4qLnNdXSAiIiAiIgotCi0gICAgZGctZmluaXNoCi0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcmMvd2Fybi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmNiNDM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FyYy93YXJuLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgQVJDIHNwZWNpZmljIGFzc2VtYmxlciB3YXJuaW5ncwotOwotOyB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IGFyYy0qLSogfSB9Ci0KLQliLmQgZm9vCi0JbW92IHIwLDI1Ngk7IHsgZGctd2FybmluZyAiOCBieXRlIGluc3RydWN0aW9uIGluIGRlbGF5IHNsb3QiICI4IGJ5dGUgaW5zbiBpbiBkZWxheSBzbG90IiB9Ci0KLQlqLmQgZm9vCQk7IHsgZGctd2FybmluZyAiOCBieXRlIGp1bXAgaW5zdHJ1Y3Rpb24gd2l0aCBkZWxheSBzbG90IiAiOCBieXRlIGp1bXAgd2l0aCBkZWxheSBzbG90IiB9Ci0JbW92IHIwLHIxCi0KLQlzdWIuZiAwLHIwLHIyCi0JYmVxIGZvbwkJOyB7IGRnLXdhcm5pbmcgImNvbmRpdGlvbmFsIGJyYW5jaCBmb2xsb3dzIHNldCBvZiBmbGFncyIgImNjIHNldC9icmFuY2ggbm9wIHRlc3QiIH0KLQotZm9vOgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FyY2g0dC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FyY2g0dC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI4ZjdmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcmNoNHQucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCQotCWJ4CXIwCi0JYnhlcQlyMQotCi1mb286CQotCWxkcmgJcjMsIGZvbwotCWxkcnNoCXI0LCBbcjVdCi0JbGRyc2IJcjQsIFtyMSwgcjNdCi0JbGRyc2gJcjEsIFtyNCwgcjRdIQotCWxkcmVxc2IJcjEsIFtyNSwgLXIzXQotCWxkcm5laAlyMiwgW3I2XSwgcjcKLQlsZHJjY3NoIHIyLCBbcjddLCArcjgKLQlsZHJzYglyMiwgW3IzLCAjMjU1XQotCWxkcnNoCXIxLCBbcjQsICMtMjUwXQotCWxkcnNiCXIxLCBbcjUsICMrMjQwXQotCi0Jc3RyaAlyMiwgYmFyCi0Jc3RybmVoCXIzLCBbcjNdCi1iYXI6CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFjNTRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0uZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIwotIyBTb21lIEFSTSB0ZXN0cwotIwotaWYgW2lzdGFyZ2V0IGFybS0qLSpdIHRoZW4gewotICAgIHJ1bl9kdW1wX3Rlc3QgImluc3QiCi0KLSAgICBnYXNfdGVzdCAiYXJtMy5zIiAiIiAkc3Rkb3B0bGlzdCAiQXJtIDMgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImFybTYucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSA2IGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcm03ZG0ucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSA3RE0gaW5zdHJ1Y3Rpb25zIgotCi0gICAgcnVuX2R1bXBfdGVzdCAiYXJtN3QiCi0KLSAgICBnYXNfdGVzdCAidGh1bWIucyIgIiIgJHN0ZG9wdGxpc3QgIlRodW1iIGluc3RydWN0aW9ucyIKLQotICAgIGdhc190ZXN0ICJhcmNoNHQucyIgIiIgJHN0ZG9wdGxpc3QgIkFybSBhcmNoaXRlY3R1cmUgNHQgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImNvcHJvLnMiICIiICRzdGRvcHRsaXN0ICJDbyBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIgotCi0gICAgZ2FzX3Rlc3QgImltbWVkLnMiICIiICRzdGRvcHRsaXN0ICJpbW1lZGlhdGUgZXhwcmVzc2lvbnMiCi0KLSAgICBnYXNfdGVzdCAiZmxvYXQucyIgIiIgJHN0ZG9wdGxpc3QgIkNvcmUgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIgotfQotCi0jIE5vdCBhbGwgYXJtIHRhcmdldHMgYXJlIGJpLWVuZGlhbiwgc28gb25seSBydW4gdGhpcyB0ZXN0IG9uIG9uZXMKLSMgd2Uga25vdyB0aGF0IGFyZS4gIEZJWE1FOiBXZSBzaG91bGQgcHJvYmFibHkgYWxzbyBrZXkgb2ZmIGFybWViL2FybWVsLgotCi1pZiBbaXN0YXJnZXQgYXJtLSotcGVdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJsZS1mcGNvbnN0IgotCi0gICAgIyBTaW5jZSBiaWctZW5kaWFuIG51bWJlcnMgaGF2ZSB0aGUgbm9ybWFsIGZvcm1hdCwgdGhpcyBkb2Vzbid0IGV4aXN0LgotICAgICNydW5fZHVtcF90ZXN0ICJiZS1mcGNvbnN0IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm0zLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2Y5MTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTMucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0Jc3dwCXIwLCByMSwgW3I4XQotCXN3cGIJcjIsIHIzLCBbcjNdCi0Jc3dwZ2ViCXI0LCByMSwgW3I0XQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtNi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MTcxMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtNi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0JCi0JbXJzCXI4LCBjcHNyCi0JbXJzZXEJcjksIGNwc3JfYWxsCi0JbXJzCXIyLCBzcHNyCi0KLQltc3IJY3BzciwgcjEKLQltc3JuZQljcHNyX2ZsZywgIzB4ZjAwMDAwMDAKLQltc3IJc3Bzcl9mbGcsIHI4Ci0JbXNyCXNwc3JfYWxsLCByOQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN2RtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN2RtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTZjNzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTdkbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLnRleHQKLS5hbGlnbiAwCi0JCi0Jc211bGwJcjAsIHIxLCByMiwgcjMKLQl1bXVsbAlyMCwgcjEsIHIyLCByMwotCXNtbGFsCXIwLCByMSwgcjIsIHIzCi0JdW1sYWwJcjAsIHIxLCByNCwgcjMKLQotCXNtdWxsbmUJcjAsIHIxLCByMywgcjQKLQlzbXVsbHMJcjEsIHIwLCByOSwgcjExCi0JdW1sYWxlcXMgcjIsIHI5LCByNCwgcjkKLQlzbWxhbGdlIHIxNCwgcjEwLCByOCwgcjE0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzRjODNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9hcm03dC5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLS1zaG93LXJhdy1pbnNuCi0jbmFtZTogQVJNIGFybTd0Ci0jYXM6IC1tYXJtN3QgLUVMCi0KLSMgVGVzdCB0aGUgaGFsZndvcmQgYW5kIHNpZ25leHRlbmQgbWVtb3J5IHRyYW5zZmVyczoKLQotLio6ICtmaWxlIGZvcm1hdCAuKmFybS4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wMDAwMDAwMCA8W14+XSo+IGUxZDEwMGIwID8JbGRyaAlyMCwgXFtyMVxdCi0wMDAwMDAwNCA8W14+XSo+IGUxZjEwMGIwID8JbGRyaAlyMCwgXFtyMVxdIQotMDAwMDAwMDggPFtePl0qPiBlMTkxMDBiMiA/CWxkcmgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMDBjIDxbXj5dKj4gZTFiMTAwYjIgPwlsZHJoCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwMTAgPFtePl0qPiBlMWQxMDBiYyA/CWxkcmgJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDAxNCA8W14+XSo+IGUxZjEwMGJjID8JbGRyaAlyMCwgXFtyMSwgIzEyXF0hCi0wMDAwMDAxOCA8W14+XSo+IGUxNTEwMGJjID8JbGRyaAlyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDAxYyA8W14+XSo+IGUwOTEwMGIyID8JbGRyaAlyMCwgXFtyMVxdLCByMgotMDAwMDAwMjAgPFtePl0qPiBlM2EwMGNmZiA/CW1vdglyMCwgIzY1MjgwCi0wMDAwMDAyNCA8W14+XSo+IGUxZGYwYmI0ID8JbGRyaAlyMCwgXFtwYywgI2I0XF0JOyAwMDAwMDBlMCA8W14+XSo+Ci0wMDAwMDAyOCA8W14+XSo+IGUxZGYwYWJjID8JbGRyaAlyMCwgXFtwYywgI2FjXF0JOyAwMDAwMDBkYyA8W14+XSo+Ci0wMDAwMDAyYyA8W14+XSo+IGUxYzEwMGIwID8Jc3RyaAlyMCwgXFtyMVxdCi0wMDAwMDAzMCA8W14+XSo+IGUxZTEwMGIwID8Jc3RyaAlyMCwgXFtyMVxdIQotMDAwMDAwMzQgPFtePl0qPiBlMTgxMDBiMiA/CXN0cmgJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMDM4IDxbXj5dKj4gZTFhMTAwYjIgPwlzdHJoCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwM2MgPFtePl0qPiBlMWMxMDBiYyA/CXN0cmgJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDA0MCA8W14+XSo+IGUxZTEwMGJjID8Jc3RyaAlyMCwgXFtyMSwgIzEyXF0hCi0wMDAwMDA0NCA8W14+XSo+IGUxNDEwMGJjID8Jc3RyaAlyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDA0OCA8W14+XSo+IGUwODEwMGIyID8Jc3RyaAlyMCwgXFtyMVxdLCByMgotMDAwMDAwNGMgPFtePl0qPiBlMWNmMDhiOCA/CXN0cmgJcjAsIFxbcGMsICM4OFxdCTsgMDAwMDAwZGMgPFtePl0qPgotMDAwMDAwNTAgPFtePl0qPiBlMWQxMDBkMCA/CWxkcnNiCXIwLCBcW3IxXF0KLTAwMDAwMDU0IDxbXj5dKj4gZTFmMTAwZDAgPwlsZHJzYglyMCwgXFtyMVxdIQotMDAwMDAwNTggPFtePl0qPiBlMTkxMDBkMiA/CWxkcnNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDA1YyA8W14+XSo+IGUxYjEwMGQyID8JbGRyc2IJcjAsIFxbcjEsIHIyXF0hCi0wMDAwMDA2MCA8W14+XSo+IGUxZDEwMGRjID8JbGRyc2IJcjAsIFxbcjEsICMxMlxdCi0wMDAwMDA2NCA8W14+XSo+IGUxZjEwMGRjID8JbGRyc2IJcjAsIFxbcjEsICMxMlxdIQotMDAwMDAwNjggPFtePl0qPiBlMTUxMDBkYyA/CWxkcnNiCXIwLCBcW3IxLCAtIzEyXF0KLTAwMDAwMDZjIDxbXj5dKj4gZTA5MTAwZDIgPwlsZHJzYglyMCwgXFtyMVxdLCByMgotMDAwMDAwNzAgPFtePl0qPiBlM2EwMDBkZSA/CW1vdglyMCwgIzIyMgotMDAwMDAwNzQgPFtePl0qPiBlMWRmMDZkMCA/CWxkcnNiCXIwLCBcW3BjLCAjNjBcXQk7IDAwMDAwMGRjIDxbXj5dKj4KLTAwMDAwMDc4IDxbXj5dKj4gZTFkMTAwZjAgPwlsZHJzaAlyMCwgXFtyMVxdCi0wMDAwMDA3YyA8W14+XSo+IGUxZjEwMGYwID8JbGRyc2gJcjAsIFxbcjFcXSEKLTAwMDAwMDgwIDxbXj5dKj4gZTE5MTAwZjIgPwlsZHJzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwODQgPFtePl0qPiBlMWIxMDBmMiA/CWxkcnNoCXIwLCBcW3IxLCByMlxdIQotMDAwMDAwODggPFtePl0qPiBlMWQxMDBmYyA/CWxkcnNoCXIwLCBcW3IxLCAjMTJcXQotMDAwMDAwOGMgPFtePl0qPiBlMWYxMDBmYyA/CWxkcnNoCXIwLCBcW3IxLCAjMTJcXSEKLTAwMDAwMDkwIDxbXj5dKj4gZTE1MTAwZmMgPwlsZHJzaAlyMCwgXFtyMSwgLSMxMlxdCi0wMDAwMDA5NCA8W14+XSo+IGUwOTEwMGYyID8JbGRyc2gJcjAsIFxbcjFcXSwgcjIKLTAwMDAwMDk4IDxbXj5dKj4gZTNhMDBjZmYgPwltb3YJcjAsICM2NTI4MAotMDAwMDAwOWMgPFtePl0qPiBlMWRmMDNmYyA/CWxkcnNoCXIwLCBcW3BjLCAjM2NcXQk7IDAwMDAwMGUwIDxbXj5dKj4KLTAwMDAwMGEwIDxbXj5dKj4gZTFkZjAzZjQgPwlsZHJzaAlyMCwgXFtwYywgIzM0XF0JOyAwMDAwMDBkYyA8W14+XSo+Ci0wMDAwMDBhNCA8W14+XSo+IGUxOTEwMGIyID8JbGRyaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYTggPFtePl0qPiAxMTkxMDBiMiA/CWxkcm5laAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYWMgPFtePl0qPiA4MTkxMDBiMiA/CWxkcmhpaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYjAgPFtePl0qPiBiMTkxMDBiMiA/CWxkcmx0aAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYjQgPFtePl0qPiBlMTkxMDBmMiA/CWxkcnNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBiOCA8W14+XSo+IDExOTEwMGYyID8JbGRybmVzaAlyMCwgXFtyMSwgcjJcXQotMDAwMDAwYmMgPFtePl0qPiA4MTkxMDBmMiA/CWxkcmhpc2gJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGMwIDxbXj5dKj4gYjE5MTAwZjIgPwlsZHJsdHNoCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBjNCA8W14+XSo+IGUxOTEwMGQyID8JbGRyc2IJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGM4IDxbXj5dKj4gMTE5MTAwZDIgPwlsZHJuZXNiCXIwLCBcW3IxLCByMlxdCi0wMDAwMDBjYyA8W14+XSo+IDgxOTEwMGQyID8JbGRyaGlzYglyMCwgXFtyMSwgcjJcXQotMDAwMDAwZDAgPFtePl0qPiBiMTkxMDBkMiA/CWxkcmx0c2IJcjAsIFxbcjEsIHIyXF0KLTAwMDAwMGQ0IDxbXj5dKj4gZTFkZjAwZjQgPwlsZHJzaAlyMCwgXFtwYywgIzRcXQk7IDAwMDAwMGUwIDxbXj5dKj4KLTAwMDAwMGQ4IDxbXj5dKj4gZTFkZjAwZjQgPwlsZHJzaAlyMCwgXFtwYywgIzRcXQk7IDAwMDAwMGU0IDxbXj5dKj4KLTAwMDAwMGRjIDxbXj5dKj4gMDAwMDAwMDAgPwlhbmRlcQlyMCwgcjAsIHIwCi1bCQldKmRjOi4qLnJkYXRhCi0wMDAwMDBlMCA8W14+XSo+IDAwMDBjMGRlID8JLioKLTAwMDAwMGU0IDxbXj5dKj4gMDAwMGRlYWQgPwkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2FybTd0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU2ZTkwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vYXJtN3QucworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLQkuc2VjdGlvbgkucmRhdGEKLQkuYWxpZ24JMAotLkxDMDoKLQkuYXNjaWkJInNvbWUgZGF0YVwwMDAiCi0KLQkudGV4dAotCS5hbGlnbgkwCi0KLWxvYWRoYWxmd29yZHM6Ci0JbGRyaAlyMCwgW3IxXQotCWxkcmgJcjAsIFtyMV0hCi0JbGRyaAlyMCwgW3IxLCByMl0KLQlsZHJoCXIwLCBbcjEsIHIyXSEKLQlsZHJoCXIwLCBbcjEsIzB4MENdCi0JbGRyaAlyMCwgW3IxLCMweDBDXSEKLQlsZHJoCXIwLCBbcjEsIy0weDBDXQotCWxkcmgJcjAsIFtyMV0sIHIyCi0JbGRyaAlyMCwgPTB4RkYwMAotCWxkcmgJcjAsID0weEMwREUKLQlsZHJoCXIwLCAuTDIKLQotc3RvcmVoYWxmd29yZHM6Ci0Jc3RyaAlyMCwgW3IxXQotCXN0cmgJcjAsIFtyMV0hCi0Jc3RyaAlyMCwgW3IxLCByMl0KLQlzdHJoCXIwLCBbcjEsIHIyXSEKLQlzdHJoCXIwLCBbcjEsIzB4MENdCi0Jc3RyaAlyMCwgW3IxLCMweDBDXSEKLQlzdHJoCXIwLCBbcjEsIy0weDBDXQotCXN0cmgJcjAsIFtyMV0sIHIyCi0Jc3RyaAlyMCwgLkwyCi0KLWxvYWRzaWduZWRieXRlczoKLQlsZHJzYglyMCwgW3IxXQotCWxkcnNiCXIwLCBbcjFdIQotCWxkcnNiCXIwLCBbcjEsIHIyXQotCWxkcnNiCXIwLCBbcjEsIHIyXSEKLQlsZHJzYglyMCwgW3IxLCMweDBDXQotCWxkcnNiCXIwLCBbcjEsIzB4MENdIQotCWxkcnNiCXIwLCBbcjEsIy0weDBDXQotCWxkcnNiCXIwLCBbcjFdLCByMgotCWxkcnNiCXIwLCA9MHhERQotCWxkcnNiCXIwLCAuTDIKLQotbG9hZHNpZ25lZGhhbGZ3b3JkczoKLQlsZHJzaAlyMCwgW3IxXQotCWxkcnNoCXIwLCBbcjFdIQotCWxkcnNoCXIwLCBbcjEsIHIyXQotCWxkcnNoCXIwLCBbcjEsIHIyXSEKLQlsZHJzaAlyMCwgW3IxLCAjMHgwQ10KLQlsZHJzaAlyMCwgW3IxLCAjMHgwQ10hCi0JbGRyc2gJcjAsIFtyMSwgIy0weDBDXQotCWxkcnNoCXIwLCBbcjFdLCByMgotCWxkcnNoCXIwLCA9MHhGRjAwCi0JbGRyc2gJcjAsID0weEMwREUKLQlsZHJzaAlyMCwgLkwyCi0JCi1taXNjOgotCWxkcmFsaAlyMCwgW3IxLCByMl0KLQlsZHJuZWgJcjAsIFtyMSwgcjJdCi0JbGRyaGloCXIwLCBbcjEsIHIyXQotCWxkcmx0aAlyMCwgW3IxLCByMl0KLQotCWxkcmFsc2gJcjAsIFtyMSwgcjJdCi0JbGRybmVzaAlyMCwgW3IxLCByMl0KLQlsZHJoaXNoCXIwLCBbcjEsIHIyXQotCWxkcmx0c2gJcjAsIFtyMSwgcjJdCi0KLQlsZHJhbHNiCXIwLCBbcjEsIHIyXQotCWxkcm5lc2IJcjAsIFtyMSwgcjJdCi0JbGRyaGlzYglyMCwgW3IxLCByMl0KLQlsZHJsdHNiCXIwLCBbcjEsIHIyXQotCi0JbGRyc2gJcjAsID0weEMwREUKLQlsZHJzaAlyMCwgPTB4REVBRAotCi0JLmFsaWduCi0uTDI6Ci0JLndvcmQJLkxDMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2NvcHJvLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vY29wcm8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjOWI5Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vY29wcm8ucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCWNkcAlwMSwgNCwgY3IxLCBjcjIsIGNyMwotCWNkcGVxCTQsIDMsIGMxLCBjNCwgY3I1LCA1Ci0KLQlsZGMJNSwgY3I5LCBbcjNdCi0JbGRjbAkxLCBjcjE0LCBbcjEsICMzMl0KLQlsZGNtaQkwLCBjcjAsIFtyMiwgIzEwMjBdIQotCWxkY3BsbAlwNywgYzEsIFtyM10sICM2NAotCWxkYwlwMCwgYzgsIGZvbwotZm9vOgotCi0Jc3RjCTUsIGNyMCwgW3IzXQotCXN0Y2wJMywgY3IxNSwgW3IwLCAjOF0KLQlzdGNlcQlwNCwgY3IxMiwgW3IyLCAjMTAwXSEKLQlzdGNjYwlwNiwgYzgsIFtyNF0sICM0OAotCXN0YwlwMSwgYzcsIGJhcgotYmFyOgotCi0JbXJjCTIsIDMsIHI1LCBjMSwgYzIKLQltcmNnZQlwNCwgNSwgcjE1LCBjcjEsIGNyMiwgNwotCi0JbWNyCXA3LCAxLCByMTUsIGNyMSwgY3IxCi0JbWNybHQJNSwgMSwgcjgsIGNyMiwgY3I5LCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFlZTk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS50ZXh0Ci0uYWxpZ24gMAotCW12ZmUJZjAsIGYxCi0JbXZmZXFlCWYzLCBmNQotCW12ZmVxZAlmNCwgIzEuMAotCW12ZnMJZjQsIGY3Ci0JbXZmc3AJZjAsIGYxCi0JbXZmZG0JZjMsIGY0Ci0JbXZmZXoJZjcsIGY3Ci0KLQlhZGZlCWYwLCBmMSwgIzIuMAotCWFkZmVxZQlmMSwgZjIsICMwLjUKLQlhZGZzbQlmMywgZjQsIGY1Ci0JCi0Jc3VmZAlmMCwgZjAsICMyLjAKLQlzdWZzCWYxLCBmMiwgIzEwLjAKLQlzdWZuZWV6IGYzLCBmNCwgZjUKLQotCXJzZnMJZjEsIGYxLCAjMC4wCi0JcnNmZHAJZjMsIGYwLCAjNS4wCi0JcnNmbGVkCWY3LCBmNiwgZjAKLQotCW11ZmQJZjAsIGYwLCBmMAotCW11ZmV6CWYxLCBmMiwgIzMuMAotCW11ZmFscwlmMCwgZjAsICM0LjAKLQotCWR2ZmQJZjAsIGYwLCAjMS4wMDAwCi0JZHZmZXoJZjAsIGYxLCAjMTBlMAotCWR2Zm1pc20gZjMsIGY0LCBmNQotCi0JcmRmZQlmMCwgZjEsICMxLjBlMQotCXJkZnMJZjMsIGY3LCAjMGYxCi0JcmRmY2NkcAlmNCwgZjQsIGYzCi0KLQlwb3dkCWYwLCBmMiwgZjMKLQlwb3dzCWYxLCBmMywgIzBlMWUxCi0JcG93Y3NleglmNCwgZjcsICMxCi0KLQlycHdzCWY3LCBmNiwgZjcKLQlycHdlcWQJZjAsIGYxLCBmMgotCXJwd2VtCWYyLCBmMiwgZjMKLQotCXJtZmQJZjEsIGYyLCAjMwotCXJtZnZzcwlmMywgZjQsIGY0Ci0Jcm1mZXAJZjQsIGY3LCBmMAotCi0JZm1scwlmMCwgZjEsIGYyCi0JZm1sZXFzCWYxLCBmMywgZjUKLQlmbWxwbHN6CWY0LCBmNiwgZjAKLQotCWZkdnMJZjEsIGYzLCAjMTAKLQlmZHZzcAlmMCwgZjEsIGYyCi0JZmR2aHNzbQlmNCwgZjQsIGY0Ci0KLQlmcmRzCWYxLCBmMSwgIzEuMAotCWZyZGd0cwlmMiwgZjEsIGYwCi0JZnJkZ3RzeglmNCwgZjQsIGY1Ci0KLQlwb2xkCWYwLCBmMSwgZjIKLQlwb2xzeglmNCwgZjYsICMzLjAKLQlwb2xlcWUJZjUsIGY2LCBmNwotCi0JbW5mcwlmMCwgZjEKLQltbmZkCWYwLCAjMy4wCi0JbW5mZXoJZjAsICM0LjAKLQltbmZlcWV6IGYwLCBmNQotCW1uZnNwCWYwLCBmNAotCW1uZmRtCWYxLCBmNwotCi0JYWJzZAlmMCwgZjEKLQlhYnNzcAlmMSwgIzMuMAotCWFic2VxZQlmNCwgZjUKLQotCXJuZHMJZjEsIGYyCi0Jcm5kZAlmMywgZjQKLQlybmRlcWV6CWY2LCAjNC4wCi0KLQlzcXRzCWY1LCBmNQotCXNxdGRwCWY2LCBmNgotCXNxdHBsZXogZjcsIGY2Ci0KLQlsb2dzCWYwLCAjMTAKLQlsb2dlCWYwLCAjMGYxMAotCWxvZ25lZHoJZjAsIGYxCi0KLQlsZ25lCWYxLCBmMgotCWxnbmR6CWYxLCBmMwotCWxnbnZjcwlmMywgZjQKLQotCWV4cHMJZjEsIGYzCi0JZXhwZW0JZjMsICMxMC4wCi0JZXhwcGxkCWY2LCBmNwotCi0Jc2luZAlmMCwgZjEKLQlzaW5zbQlmMSwgZjIKLQlzaW5ndGUJZjQsICM1Ci0KLQljb3NkCWYxLCBmMwotCWNvc2VtCWY0LCBmNQotCWNvc25lZHAJZjYsIGYxCi0KLQl0YW5lCWYxLCBmNQotCXRhbnN6CWY0LCBmNwotCXRhbmdlZHoJZjEsICM0LjAKLQotCWFzbmUJZjQsIGY1Ci0JYXNuc3AJZjYsICM1ZS0xCi0JYXNubWlkeglmNSwgZjUKLQotCWFjc3MJZjUsIGY2Ci0JYWNzZAlmNiwgZjAKLQlhY3Noc2VtCWYxLCAjMC4wNWUxCi0KLQlhdG5lCWYwLCBmNQotCWF0bnN6CWYxLCAjNQotCWF0bmx0ZAlmMywgZjIKLQotCXVyZGUJZjUsIGY0Ci0JbnJtZQlmNiwgZjUKLQlucm1wbGR6CWY3LCBmNQotCi0JZmx0c3AJZjAsIHI4Ci0JZmx0ZQlmMSwgcjAKLQlmbHRlcWR6CWY1LCByNwotCi0JZml4CXIwLCBmMQotCWZpeHoJcjEsIGY3Ci0JZml4Y3NtCXI1LCBmNQotCi0Jd2ZjCXIwCi0Jd2ZzCXIxCi0JcmZzZXEJcjIKLQlyZmMJcjQKLQotCWNtZglmMCwgIzEKLQljbWYJZjEsIGYyCi0JY21mZXEJZjAsIGYxCi0KLQljbmYJZjAsICMzCi0JY25mCWYxLCAjMC41Ci0JY25mdnMJZjMsIGY0Ci0KLQljbWZlCWYwLCBmMQotCWNtZmVlcQlmMSwgZjIKLQljbWZlcWUJZjMsICM1LjAKLQotCWNuZmUJZjEsIGYzCi0JY25mZWVxCWYzLCBmNAotCWNuZmVxZQlmNCwgZjcKLQljbmZhbGUJZjQsICM1LjAKLQotCWxmbQlmMCwgNCwgW3IwXQotCWxmbQlmMCwgNCwgW3IwLCAjMF0KLQlsZm0JZjEsIDQsIFtyMSwgIzY0XQotCXNmbQlmMiwgNCwgW3IxNCwgIzEwMjBdIQotCXNmbWVxCWY3LCAzLCBbcjhdLCAjLTEwMjAKLQotCWxmbWZkCWY2LCAyLCBbcjE1XQotCXNmbWVhCWY3LCAxLCBbcjhdIQotCWxmbWVxZWEJZjUsIDQsIFtyNl0KLQlzZm1uZWZkCWY0LCAzLCBbcjJdCi0Jc2ZtbmVmZAlmNCwgMywgW3IyXSEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbW1lZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjA5MmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2ltbWVkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1ACVRlc3RzIGZvciBjb21wbGV4IGltbWVkaWF0ZSBleHByZXNzaW9ucyAtIG5vbmUgb2YgdGhlc2UgbmVlZCAKLUAJcmVsb2NhdGlvbnMKLQkudGV4dAotYmFyOgotCW1vdglyMCwgIzAKLQltb3YJcjAsICMoLiAtIGJhciAtIDgpCi0JbGRyCXIwLCBiYXIKLQlsZHIJcjAsIFtwYywgIyAoYmFyIC0gLiAtOCldCi0JLnNwYWNlIDQwOTYKLQltb3YJcjAsICMoLiAtIGJhciAtIDgpICYgMHhmZgotCWxkcglyMCwgW3BjLCAjIChiYXIgLSAuIC04KSAmIDB4ZmZdCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjZmFmOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vaW5zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC0tc2hvdy1yYXctaW5zbgotI25hbWU6IEFSTSBiYXNpYyBpbnN0cnVjdGlvbnMKLSNhczogLW1hcm0yIC1FTAotCi0jIFRlc3QgdGhlIHN0YW5kYXJkIEFSTSBpbnN0cnVjdGlvbnM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMDAwMDAwMDAgPFtePl0qPiBlM2EwMDAwMCA/CW1vdglyMCwgIzAKLTAwMDAwMDA0IDxbXj5dKj4gZTFhMDEwMDIgPwltb3YJcjEsIHIyCi0wMDAwMDAwOCA8W14+XSo+IGUxYTAzMTg0ID8JbW92CXIzLCByNCwgbHNsICMzCi0wMDAwMDAwYyA8W14+XSo+IGUxYTA1NzM2ID8JbW92CXI1LCByNiwgbHNyIHI3Ci0wMDAwMDAxMCA8W14+XSo+IGUxYTA4YTU5ID8JbW92CXI4LCByOSwgYXNyIHNsCi0wMDAwMDAxNCA8W14+XSo+IGUxYTBiZDFjID8JbW92CWZwLCBpcCwgbHNsIHNwCi0wMDAwMDAxOCA8W14+XSo+IGUxYTBlMDZmID8JbW92CWxyLCBwYywgcnJ4Ci0wMDAwMDAxYyA8W14+XSo+IGUxYTAxMDAyID8JbW92CXIxLCByMgotMDAwMDAwMjAgPFtePl0qPiAwMWEwMjAwMyA/CW1vdmVxCXIyLCByMwotMDAwMDAwMjQgPFtePl0qPiAxMWEwNDAwNSA/CW1vdm5lCXI0LCByNQotMDAwMDAwMjggPFtePl0qPiBiMWEwNjAwNyA/CW1vdmx0CXI2LCByNwotMDAwMDAwMmMgPFtePl0qPiBhMWEwODAwOSA/CW1vdmdlCXI4LCByOQotMDAwMDAwMzAgPFtePl0qPiBkMWEwYTAwYiA/CW1vdmxlCXNsLCBmcAotMDAwMDAwMzQgPFtePl0qPiBjMWEwYzAwZCA/CW1vdmd0CWlwLCBzcAotMDAwMDAwMzggPFtePl0qPiAzMWEwMTAwMiA/CW1vdmNjCXIxLCByMgotMDAwMDAwM2MgPFtePl0qPiAyMWEwMTAwMyA/CW1vdmNzCXIxLCByMwotMDAwMDAwNDAgPFtePl0qPiA0MWEwMzAwNiA/CW1vdm1pCXIzLCByNgotMDAwMDAwNDQgPFtePl0qPiA1MWEwNzAwOSA/CW1vdnBsCXI3LCByOQotMDAwMDAwNDggPFtePl0qPiA2MWEwMTAwOCA/CW1vdnZzCXIxLCByOAotMDAwMDAwNGMgPFtePl0qPiA3MWEwOWZhMSA/CW1vdnZjCXI5LCByMSwgbHNyICMzMQotMDAwMDAwNTAgPFtePl0qPiA4MWEwODAwZiA/CW1vdmhpCXI4LCBwYwotMDAwMDAwNTQgPFtePl0qPiA5MWEwZjAwZSA/CW1vdmxzCXBjLCBscgotMDAwMDAwNTggPFtePl0qPiAyMWEwOTAwOCA/CW1vdmNzCXI5LCByOAotMDAwMDAwNWMgPFtePl0qPiAzMWEwMTAwMyA/CW1vdmNjCXIxLCByMwotMDAwMDAwNjAgPFtePl0qPiBlMWIwMDAwOCA/CW1vdnMJcjAsIHI4Ci0wMDAwMDA2NCA8W14+XSo+IDMxYjAwMDA3ID8JbW92Y2NzCXIwLCByNwotMDAwMDAwNjggPFtePl0qPiBlMjgxMDAwYSA/CWFkZAlyMCwgcjEsICMxMAotMDAwMDAwNmMgPFtePl0qPiBlMDgzMjAwNCA/CWFkZAlyMiwgcjMsIHI0Ci0wMDAwMDA3MCA8W14+XSo+IGUwODY1Mjg3ID8JYWRkCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwNzQgPFtePl0qPiBlMDgyMTExMyA/CWFkZAlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMDc4IDxbXj5dKj4gZTIwMTAwMGEgPwlhbmQJcjAsIHIxLCAjMTAKLTAwMDAwMDdjIDxbXj5dKj4gZTAwMzIwMDQgPwlhbmQJcjIsIHIzLCByNAotMDAwMDAwODAgPFtePl0qPiBlMDA2NTI4NyA/CWFuZAlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMDg0IDxbXj5dKj4gZTAwMjExMTMgPwlhbmQJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDA4OCA8W14+XSo+IGUyMjEwMDBhID8JZW9yCXIwLCByMSwgIzEwCi0wMDAwMDA4YyA8W14+XSo+IGUwMjMyMDA0ID8JZW9yCXIyLCByMywgcjQKLTAwMDAwMDkwIDxbXj5dKj4gZTAyNjUyODcgPwllb3IJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDA5NCA8W14+XSo+IGUwMjIxMTEzID8JZW9yCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwOTggPFtePl0qPiBlMjQxMDAwYSA/CXN1YglyMCwgcjEsICMxMAotMDAwMDAwOWMgPFtePl0qPiBlMDQzMjAwNCA/CXN1YglyMiwgcjMsIHI0Ci0wMDAwMDBhMCA8W14+XSo+IGUwNDY1Mjg3ID8Jc3ViCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwYTQgPFtePl0qPiBlMDQyMTExMyA/CXN1YglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGE4IDxbXj5dKj4gZTJhMTAwMGEgPwlhZGMJcjAsIHIxLCAjMTAKLTAwMDAwMGFjIDxbXj5dKj4gZTBhMzIwMDQgPwlhZGMJcjIsIHIzLCByNAotMDAwMDAwYjAgPFtePl0qPiBlMGE2NTI4NyA/CWFkYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGI0IDxbXj5dKj4gZTBhMjExMTMgPwlhZGMJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBiOCA8W14+XSo+IGUyYzEwMDBhID8Jc2JjCXIwLCByMSwgIzEwCi0wMDAwMDBiYyA8W14+XSo+IGUwYzMyMDA0ID8Jc2JjCXIyLCByMywgcjQKLTAwMDAwMGMwIDxbXj5dKj4gZTBjNjUyODcgPwlzYmMJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBjNCA8W14+XSo+IGUwYzIxMTEzID8Jc2JjCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwYzggPFtePl0qPiBlMjYxMDAwYSA/CXJzYglyMCwgcjEsICMxMAotMDAwMDAwY2MgPFtePl0qPiBlMDYzMjAwNCA/CXJzYglyMiwgcjMsIHI0Ci0wMDAwMDBkMCA8W14+XSo+IGUwNjY1Mjg3ID8JcnNiCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAwZDQgPFtePl0qPiBlMDYyMTExMyA/CXJzYglyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMGQ4IDxbXj5dKj4gZTJlMTAwMGEgPwlyc2MJcjAsIHIxLCAjMTAKLTAwMDAwMGRjIDxbXj5dKj4gZTBlMzIwMDQgPwlyc2MJcjIsIHIzLCByNAotMDAwMDAwZTAgPFtePl0qPiBlMGU2NTI4NyA/CXJzYwlyNSwgcjYsIHI3LCBsc2wgIzUKLTAwMDAwMGU0IDxbXj5dKj4gZTBlMjExMTMgPwlyc2MJcjEsIHIyLCByMywgbHNsIHIxCi0wMDAwMDBlOCA8W14+XSo+IGUzODEwMDBhID8Jb3JyCXIwLCByMSwgIzEwCi0wMDAwMDBlYyA8W14+XSo+IGUxODMyMDA0ID8Jb3JyCXIyLCByMywgcjQKLTAwMDAwMGYwIDxbXj5dKj4gZTE4NjUyODcgPwlvcnIJcjUsIHI2LCByNywgbHNsICM1Ci0wMDAwMDBmNCA8W14+XSo+IGUxODIxMTEzID8Jb3JyCXIxLCByMiwgcjMsIGxzbCByMQotMDAwMDAwZjggPFtePl0qPiBlM2MxMDAwYSA/CWJpYwlyMCwgcjEsICMxMAotMDAwMDAwZmMgPFtePl0qPiBlMWMzMjAwNCA/CWJpYwlyMiwgcjMsIHI0Ci0wMDAwMDEwMCA8W14+XSo+IGUxYzY1Mjg3ID8JYmljCXI1LCByNiwgcjcsIGxzbCAjNQotMDAwMDAxMDQgPFtePl0qPiBlMWMyMTExMyA/CWJpYwlyMSwgcjIsIHIzLCBsc2wgcjEKLTAwMDAwMTA4IDxbXj5dKj4gZTNlMDAwMGEgPwltdm4JcjAsICMxMAotMDAwMDAxMGMgPFtePl0qPiBlMWUwMjAwNCA/CW12bglyMiwgcjQKLTAwMDAwMTEwIDxbXj5dKj4gZTFlMDUyODcgPwltdm4JcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTE0IDxbXj5dKj4gZTFlMDExMTMgPwltdm4JcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTE4IDxbXj5dKj4gZTMxMDAwMGEgPwl0c3QJcjAsICMxMAotMDAwMDAxMWMgPFtePl0qPiBlMTEyMDAwNCA/CXRzdAlyMiwgcjQKLTAwMDAwMTIwIDxbXj5dKj4gZTExNTAyODcgPwl0c3QJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTI0IDxbXj5dKj4gZTExMTAxMTMgPwl0c3QJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTI4IDxbXj5dKj4gZTMzMDAwMGEgPwl0ZXEJcjAsICMxMAotMDAwMDAxMmMgPFtePl0qPiBlMTMyMDAwNCA/CXRlcQlyMiwgcjQKLTAwMDAwMTMwIDxbXj5dKj4gZTEzNTAyODcgPwl0ZXEJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTM0IDxbXj5dKj4gZTEzMTAxMTMgPwl0ZXEJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTM4IDxbXj5dKj4gZTM1MDAwMGEgPwljbXAJcjAsICMxMAotMDAwMDAxM2MgPFtePl0qPiBlMTUyMDAwNCA/CWNtcAlyMiwgcjQKLTAwMDAwMTQwIDxbXj5dKj4gZTE1NTAyODcgPwljbXAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTQ0IDxbXj5dKj4gZTE1MTAxMTMgPwljbXAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTQ4IDxbXj5dKj4gZTM3MDAwMGEgPwljbW4JcjAsICMxMAotMDAwMDAxNGMgPFtePl0qPiBlMTcyMDAwNCA/CWNtbglyMiwgcjQKLTAwMDAwMTUwIDxbXj5dKj4gZTE3NTAyODcgPwljbW4JcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTU0IDxbXj5dKj4gZTE3MTAxMTMgPwljbW4JcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTU4IDxbXj5dKj4gZTMzMGYwMGEgPwl0ZXFwCXIwLCAjMTAKLTAwMDAwMTVjIDxbXj5dKj4gZTEzMmYwMDQgPwl0ZXFwCXIyLCByNAotMDAwMDAxNjAgPFtePl0qPiBlMTM1ZjI4NyA/CXRlcXAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTY0IDxbXj5dKj4gZTEzMWYxMTMgPwl0ZXFwCXIxLCByMywgbHNsIHIxCi0wMDAwMDE2OCA8W14+XSo+IGUzNzBmMDBhID8JY21ucAlyMCwgIzEwCi0wMDAwMDE2YyA8W14+XSo+IGUxNzJmMDA0ID8JY21ucAlyMiwgcjQKLTAwMDAwMTcwIDxbXj5dKj4gZTE3NWYyODcgPwljbW5wCXI1LCByNywgbHNsICM1Ci0wMDAwMDE3NCA8W14+XSo+IGUxNzFmMTEzID8JY21ucAlyMSwgcjMsIGxzbCByMQotMDAwMDAxNzggPFtePl0qPiBlMzUwZjAwYSA/CWNtcHAJcjAsICMxMAotMDAwMDAxN2MgPFtePl0qPiBlMTUyZjAwNCA/CWNtcHAJcjIsIHI0Ci0wMDAwMDE4MCA8W14+XSo+IGUxNTVmMjg3ID8JY21wcAlyNSwgcjcsIGxzbCAjNQotMDAwMDAxODQgPFtePl0qPiBlMTUxZjExMyA/CWNtcHAJcjEsIHIzLCBsc2wgcjEKLTAwMDAwMTg4IDxbXj5dKj4gZTMxMGYwMGEgPwl0c3RwCXIwLCAjMTAKLTAwMDAwMThjIDxbXj5dKj4gZTExMmYwMDQgPwl0c3RwCXIyLCByNAotMDAwMDAxOTAgPFtePl0qPiBlMTE1ZjI4NyA/CXRzdHAJcjUsIHI3LCBsc2wgIzUKLTAwMDAwMTk0IDxbXj5dKj4gZTExMWYxMTMgPwl0c3RwCXIxLCByMywgbHNsIHIxCi0wMDAwMDE5OCA8W14+XSo+IGUwMDAwMjkxID8JbXVsCXIwLCByMSwgcjIKLTAwMDAwMTljIDxbXj5dKj4gZTAxMTAzOTIgPwltdWxzCXIxLCByMiwgcjMKLTAwMDAwMWEwIDxbXj5dKj4gMTAwMDAwOTEgPwltdWxuZQlyMCwgcjEsIHIwCi0wMDAwMDFhNCA8W14+XSo+IDkwMTkwNzk4ID8JbXVsbHNzCXI5LCByOCwgcjcKLTAwMDAwMWE4IDxbXj5dKj4gZTAyMWJhOTkgPwltbGEJcjEsIHI5LCBzbCwgZnAKLTAwMDAwMWFjIDxbXj5dKj4gZTAzM2M5OTQgPwltbGFzCXIzLCByNCwgcjksIGlwCi0wMDAwMDFiMCA8W14+XSo+IGIwMjlkNzk4ID8JbWxhbHQJcjksIHI4LCByNywgc3AKLTAwMDAwMWI0IDxbXj5dKj4gYTAzNGUzOTEgPwltbGFnZXMJcjQsIHIxLCByMywgbHIKLTAwMDAwMWI4IDxbXj5dKj4gZTU5MTAwMDAgPwlsZHIJcjAsIFxbcjFcXQotMDAwMDAxYmMgPFtePl0qPiBlNzkxMTAwMiA/CWxkcglyMSwgXFtyMSwgcjJcXQotMDAwMDAxYzAgPFtePl0qPiBlN2IzMjAwNCA/CWxkcglyMiwgXFtyMywgcjRcXSEKLTAwMDAwMWM0IDxbXj5dKj4gZTU5MjIwMjAgPwlsZHIJcjIsIFxbcjIsICMzMlxdCi0wMDAwMDFjOCA8W14+XSo+IGU3OTMyNDI0ID8JbGRyCXIyLCBcW3IzLCByNCwgbHNyICM4XF0KLTAwMDAwMWNjIDxbXj5dKj4gMDdiNTQ0ODQgPwlsZHJlcQlyNCwgXFtyNSwgcjQsIGxzbCAjOVxdIQotMDAwMDAxZDAgPFtePl0qPiAxNDk1NDAwNiA/CWxkcm5lCXI0LCBcW3I1XF0sICM2Ci0wMDAwMDFkNCA8W14+XSo+IGU2YjIxMDAzID8JbGRydAlyMSwgXFtyMlxdLCByMwotMDAwMDAxZDggPFtePl0qPiBlNjk0MjQyNSA/CWxkcglyMiwgXFtyNFxdLCByNSwgbHNyICM4Ci0wMDAwMDFkYyA8W14+XSo+IGU1MWYwMDA4ID8JbGRyCXIwLCBcW3BjLCAjZmZmZmZmZjhcXQk7IDAwMDAwMWRjIDxbXj5dKj4KLTAwMDAwMWUwIDxbXj5dKj4gZTVkNDMwMDAgPwlsZHJiCXIzLCBcW3I0XF0KLTAwMDAwMWU0IDxbXj5dKj4gMTRmODUwMDAgPwlsZHJuZWJ0CXI1LCBcW3I4XF0KLTAwMDAwMWU4IDxbXj5dKj4gZTU4MTAwMDAgPwlzdHIJcjAsIFxbcjFcXQotMDAwMDAxZWMgPFtePl0qPiBlNzgxMTAwMiA/CXN0cglyMSwgXFtyMSwgcjJcXQotMDAwMDAxZjAgPFtePl0qPiBlN2EzMzAwNCA/CXN0cglyMywgXFtyMywgcjRcXSEKLTAwMDAwMWY0IDxbXj5dKj4gZTU4MjIwMjAgPwlzdHIJcjIsIFxbcjIsICMzMlxdCi0wMDAwMDFmOCA8W14+XSo+IGU3ODMyNDI0ID8Jc3RyCXIyLCBcW3IzLCByNCwgbHNyICM4XF0KLTAwMDAwMWZjIDxbXj5dKj4gMDdhNTQ0ODQgPwlzdHJlcQlyNCwgXFtyNSwgcjQsIGxzbCAjOVxdIQotMDAwMDAyMDAgPFtePl0qPiAxNDg1NDAwNiA/CXN0cm5lCXI0LCBcW3I1XF0sICM2Ci0wMDAwMDIwNCA8W14+XSo+IGU2ODIxMDAzID8Jc3RyCXIxLCBcW3IyXF0sIHIzCi0wMDAwMDIwOCA8W14+XSo+IGU2YTQyNDI1ID8Jc3RydAlyMiwgXFtyNFxdLCByNSwgbHNyICM4Ci0wMDAwMDIwYyA8W14+XSo+IGU1MGYxMDA0ID8Jc3RyCXIxLCBcW3BjLCAjZmZmZmZmZmNcXQk7IDAwMDAwMjEwIDxbXj5dKj4KLTAwMDAwMjEwIDxbXj5dKj4gZTVjNzEwMDAgPwlzdHJiCXIxLCBcW3I3XF0KLTAwMDAwMjE0IDxbXj5dKj4gZTRlMDIwMDAgPwlzdHJidAlyMiwgXFtyMFxdCi0wMDAwMDIxOCA8W14+XSo+IGU4OTAwMDAyID8JbGRtaWEJcjAsIHtyMX0KLTAwMDAwMjFjIDxbXj5dKj4gMDk5MjAwMzggPwlsZG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLTAwMDAwMjIwIDxbXj5dKj4gZTg1M2ZmZmYgPwlsZG1kYQlyMywge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHI5LCBzbCwgZnAsIGlwLCBzcCwgbHIsIHBjfVxeCi0wMDAwMDIyNCA8W14+XSo+IGU5M2IwNWZmID8JbGRtZGIJZnAhLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgc2x9Ci0wMDAwMDIyOCA8W14+XSo+IGU5OTEwMGY3ID8JbGRtaWIJcjEsIHtyMCwgcjEsIHIyLCByNCwgcjUsIHI2LCByN30KLTAwMDAwMjJjIDxbXj5dKj4gZTg5MjAxZjggPwlsZG1pYQlyMiwge3IzLCByNCwgcjUsIHI2LCByNywgcjh9Ci0wMDAwMDIzMCA8W14+XSo+IGU5MTMwMDAzID8JbGRtZGIJcjMsIHtyMCwgcjF9Ci0wMDAwMDIzNCA8W14+XSo+IGU4NzQwMzAwID8JbGRtZGEJcjQhLCB7cjgsIHI5fVxeCi0wMDAwMDIzOCA8W14+XSo+IGU4ODAwMDAyID8Jc3RtaWEJcjAsIHtyMX0KLTAwMDAwMjNjIDxbXj5dKj4gMDk4MjAwMzggPwlzdG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLTAwMDAwMjQwIDxbXj5dKj4gZTg0M2ZmZmYgPwlzdG1kYQlyMywge3IwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHI5LCBzbCwgZnAsIGlwLCBzcCwgbHIsIHBjfVxeCi0wMDAwMDI0NCA8W14+XSo+IGU5MmEwNWZmID8Jc3RtZGIJc2whLCB7cjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgc2x9Ci0wMDAwMDI0OCA8W14+XSo+IGU4MDEwMDA3ID8Jc3RtZGEJcjEsIHtyMCwgcjEsIHIyfQotMDAwMDAyNGMgPFtePl0qPiBlOTAyMDAxOCA/CXN0bWRiCXIyLCB7cjMsIHI0fQotMDAwMDAyNTAgPFtePl0qPiBlODgzMDAwMyA/CXN0bWlhCXIzLCB7cjAsIHIxfQotMDAwMDAyNTQgPFtePl0qPiBlOWU0MDMwMCA/CXN0bWliCXI0ISwge3I4LCByOX1cXgotMDAwMDAyNTggPFtePl0qPiBlZjEyMzQ1NiA/CXN3aQkweDAwMTIzNDU2Ci0wMDAwMDI1YyA8W14+XSo+IDJmMDAwMDMzID8Jc3dpY3MJMHgwMDAwMDAzMwotMDAwMDAyNjAgPFtePl0qPiBlYmZmZmZmZSA/CWJsCTAwMDAwMjYwIDxbXj5dKj4KLVsJCV0qMjYwOi4qX3dvbWJhdC4qCi0wMDAwMDI2NCA8W14+XSo+IDViMDAwMDgyID8JYmxwbAkwMDAwMDQ3NCA8W14+XSo+Ci0JCQkyNjQ6IFJfQVJNX1BDMjQJXC50ZXh0Ci0wMDAwMDI2OCA8W14+XSo+IGVhZmZmZmZlID8JYgkwMDAwMDI2OCA8W14+XSo+Ci1bCQldKjI2ODouKl93aWJibGUuKgotMDAwMDAyNmMgPFtePl0qPiBkYWZmZmZmZSA/CWJsZQkwMDAwMDI2YyA8W14+XSo+Ci1bCQldKjI2YzouKnRlc3RlcmZ1bmMuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9pbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDkyYzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvYXJtL2luc3QucworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi1ACVRlc3QgZmlsZSBmb3IgQVJNL0dBUyAtLSBiYXNpYyBpbnN0cnVjdGlvbnMKLQotLnRleHQKLS5hbGlnbgotCW1vdglyMCwgIzAKLQltb3YJcjEsIHIyCi0JbW92CXIzLCByNCwgbHNsICMzCi0JbW92CXI1LCByNiwgbHNyIHI3Ci0JbW92CXI4LCByOSwgYXNyIHIxMAotCW1vdglyMTEsIHIxMiwgYXNsIHIxMwotCW1vdglyMTQsIHIxNSwgcnJ4Ci0JbW92YWwJcjEsIHIyCi0JbW92ZXEJcjIsIHIzCi0JbW92bmUJcjQsIHI1Ci0JbW92bHQJcjYsIHI3Ci0JbW92Z2UJcjgsIHI5Ci0JbW92bGUJcjEwLCByMTEKLQltb3ZndAlyMTIsIHIxMwotCW1vdmNjCXIxLCByMgotCW1vdmNzCXIxLCByMwotCW1vdm1pCXIzLCByNgotCW1vdnBsCXI3LCByOQotCW1vdnZzCXIxLCByOAotCW1vdnZjCXI5LCByMSwgbHNyICMzMQotCW1vdmhpCXI4LCByMTUKLQltb3ZscwlyMTUsIHIxNAotCW1vdmhzCXI5LCByOAotCW1vdnVsCXIxLCByMwotCW1vdnMJcjAsIHI4Ci0JbW92dWxzCXIwLCByNwotCQotCWFkZAlyMCwgcjEsICMxMAotCWFkZAlyMiwgcjMsIHI0Ci0JYWRkCXI1LCByNiwgcjcsIGFzbCAjNQotCWFkZAlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCWFuZAlyMCwgcjEsICMxMAotCWFuZAlyMiwgcjMsIHI0Ci0JYW5kCXI1LCByNiwgcjcsIGFzbCAjNQotCWFuZAlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCWVvcglyMCwgcjEsICMxMAotCWVvcglyMiwgcjMsIHI0Ci0JZW9yCXI1LCByNiwgcjcsIGFzbCAjNQotCWVvcglyMSwgcjIsIHIzLCBsc2wgcjEKLQotCXN1YglyMCwgcjEsICMxMAotCXN1YglyMiwgcjMsIHI0Ci0Jc3ViCXI1LCByNiwgcjcsIGFzbCAjNQotCXN1YglyMSwgcjIsIHIzLCBsc2wgcjEKLQotCWFkYwlyMCwgcjEsICMxMAotCWFkYwlyMiwgcjMsIHI0Ci0JYWRjCXI1LCByNiwgcjcsIGFzbCAjNQotCWFkYwlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCXNiYwlyMCwgcjEsICMxMAotCXNiYwlyMiwgcjMsIHI0Ci0Jc2JjCXI1LCByNiwgcjcsIGFzbCAjNQotCXNiYwlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCXJzYglyMCwgcjEsICMxMAotCXJzYglyMiwgcjMsIHI0Ci0JcnNiCXI1LCByNiwgcjcsIGFzbCAjNQotCXJzYglyMSwgcjIsIHIzLCBsc2wgcjEKLQotCXJzYwlyMCwgcjEsICMxMAotCXJzYwlyMiwgcjMsIHI0Ci0JcnNjCXI1LCByNiwgcjcsIGFzbCAjNQotCXJzYwlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCW9ycglyMCwgcjEsICMxMAotCW9ycglyMiwgcjMsIHI0Ci0Jb3JyCXI1LCByNiwgcjcsIGFzbCAjNQotCW9ycglyMSwgcjIsIHIzLCBsc2wgcjEKLQotCWJpYwlyMCwgcjEsICMxMAotCWJpYwlyMiwgcjMsIHI0Ci0JYmljCXI1LCByNiwgcjcsIGFzbCAjNQotCWJpYwlyMSwgcjIsIHIzLCBsc2wgcjEKLQotCW12bglyMCwgIzEwCi0JbXZuCXIyLCByNAotCW12bglyNSwgcjcsIGFzbCAjNQotCW12bglyMSwgcjMsIGxzbCByMQotCi0JdHN0CXIwLCAjMTAKLQl0c3QJcjIsIHI0Ci0JdHN0CXI1LCByNywgYXNsICM1Ci0JdHN0CXIxLCByMywgbHNsIHIxCi0KLQl0ZXEJcjAsICMxMAotCXRlcQlyMiwgcjQKLQl0ZXEJcjUsIHI3LCBhc2wgIzUKLQl0ZXEJcjEsIHIzLCBsc2wgcjEKLQotCWNtcAlyMCwgIzEwCi0JY21wCXIyLCByNAotCWNtcAlyNSwgcjcsIGFzbCAjNQotCWNtcAlyMSwgcjMsIGxzbCByMQotCi0JY21uCXIwLCAjMTAKLQljbW4JcjIsIHI0Ci0JY21uCXI1LCByNywgYXNsICM1Ci0JY21uCXIxLCByMywgbHNsIHIxCi0KLQl0ZXFwCXIwLCAjMTAKLQl0ZXFwCXIyLCByNAotCXRlcXAJcjUsIHI3LCBhc2wgIzUKLQl0ZXFwCXIxLCByMywgbHNsIHIxCi0KLQljbW5wCXIwLCAjMTAKLQljbW5wCXIyLCByNAotCWNtbnAJcjUsIHI3LCBhc2wgIzUKLQljbW5wCXIxLCByMywgbHNsIHIxCi0KLQljbXBwCXIwLCAjMTAKLQljbXBwCXIyLCByNAotCWNtcHAJcjUsIHI3LCBhc2wgIzUKLQljbXBwCXIxLCByMywgbHNsIHIxCi0KLQl0c3RwCXIwLCAjMTAKLQl0c3RwCXIyLCByNAotCXRzdHAJcjUsIHI3LCBhc2wgIzUKLQl0c3RwCXIxLCByMywgbHNsIHIxCi0KLQltdWwJcjAsIHIxLCByMgotCW11bHMJcjEsIHIyLCByMwotCW11bG5lCXIwLCByMSwgcjAKLQltdWxsc3MJcjksIHI4LCByNwotCi0JbWxhCXIxLCByOSwgcjEwLCByMTEKLQltbGFzCXIzLCByNCwgcjksIHIxMgotCW1sYWx0CXI5LCByOCwgcjcsIHIxMwotCW1sYWdlcwlyNCwgcjEsIHIzLCByMTQKLQotCWxkcglyMCwgW3IxXQotCWxkcglyMSwgW3IxLCByMl0KLQlsZHIJcjIsIFtyMywgcjRdIQotCWxkcglyMiwgW3IyLCAjMzJdCi0JbGRyCXIyLCBbcjMsIHI0LCBsc3IgIzhdCi0JbGRyZXEJcjQsIFtyNSwgcjQsIGFzbCAjOV0hCi0JbGRybmUJcjQsIFtyNV0sICM2Ci0JbGRydAlyMSwgW3IyXSwgcjMKLQlsZHIJcjIsIFtyNF0sIHI1LCBsc3IgIzgKLWZvbzoKLQlsZHIJcjAsIGZvbwotCWxkcmIJcjMsIFtyNF0KLQlsZHJuZWJ0CXI1LCBbcjhdCi0JCi0Jc3RyCXIwLCBbcjFdCi0Jc3RyCXIxLCBbcjEsIHIyXQotCXN0cglyMywgW3IzLCByNF0hCi0Jc3RyCXIyLCBbcjIsICMzMl0KLQlzdHIJcjIsIFtyMywgcjQsIGxzciAjOF0KLQlzdHJlcQlyNCwgW3I1LCByNCwgYXNsICM5XSEKLQlzdHJuZQlyNCwgW3I1XSwgIzYKLQlzdHIJcjEsIFtyMl0sIHIzCi0Jc3RydAlyMiwgW3I0XSwgcjUsIGxzciAjOAotCXN0cglyMSwgYmFyCi1iYXI6Ci0Jc3RyYWxiCXIxLCBbcjddCi0Jc3RyYnQJcjIsIFtyMF0KLQotCWxkbWlhCXIwLCB7cjF9Ci0JbGRtZXFpYglyMiwge3IzLCByNCwgcjV9Ci0JbGRtYWxkYQlyMywge3IwLXIxNX1eCi0JbGRtZGIJcjExISwge3IwLXI4LCByMTB9Ci0JbGRtZWQJcjEsIHtyMCwgcjEsIHIyfXwweGYwCi0JbGRtZmQJcjIsIHtyMywgcjR9K3tyNSwgcjYsIHI3LCByOH0KLQlsZG1lYQlyMywgMwotCWxkbWZhCXI0ISwge3I4LCByOX1eCi0JCi0Jc3RtaWEJcjAsIHtyMX0KLQlzdG1lcWliCXIyLCB7cjMsIHI0LCByNX0KLQlzdG1hbGRhCXIzLCB7cjAtcjE1fV4KLQlzdG1kYglyMTAhLCB7cjAtcjgsIHIxMH0KLQlzdG1lZAlyMSwge3IwLCByMSwgcjJ9Ci0Jc3RtZmQJcjIsIHtyMywgcjR9Ci0Jc3RtZWEJcjMsIDMKLQlzdG1mYQlyNCEsIHtyOCwgcjl9XgotCi0Jc3dpCTB4MTIzNDU2Ci0Jc3dpaHMJMHgzMwotCi0JYmwJX3dvbWJhdAotCWJscGwJYmFyCi0JYglfd2liYmxlCi0JYmxlCXRlc3RlcmZ1bmMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTRlMGUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNvYmpkdW1wOiAtcwotI2FzOiAtRUwKLSNuYW1lOiBhcm0gbGl0dGxlLWVuZGlhbiBmcGNvbnN0Ci0KLS4qOiArZmlsZSBmb3JtYXQgLiphcm0uKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgY2RjYzhjM2YgMDAwMDAwMDAgOTk5OWYxM2YgOWE5OTk5OTkgLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vbGUtZnBjb25zdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTNjM2Q3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS9sZS1mcGNvbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMgVGVzdCBmcCBjb25zdGFudHMuCi0jIFRoZXNlIG5lZWQgQVJNIHNwZWNpZmljIHN1cHBvcnQgYmVjYXVzZSA4IGJ5dGUgZnAgY29uc3RhbnRzIGluIGxpdHRsZQotIyBlbmRpYW4gbW9kZSBhcmUgcmVwcmVzZW50ZWQgYWJub3JtYWxseS4KLQkKLQkudGV4dAotCS5mbG9hdCAxLjEKLQkuZmxvYXQgMAotCS5kb3VibGUgMS4xCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9hcm0vdGh1bWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS90aHVtYi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRiODJkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2FybS90aHVtYi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLQkudGV4dAotCS5jb2RlIDE2Ci0uZm9vOgkKLQlsc2wJcjIsIHIxLCAjMwotCWxzcglyMywgcjQsICMzMQotd2liYmxlL2RhdGE6CQotCWFzcglyNywgcjAsICM1Ci0KLQlsc2wJcjEsIHIyLCAjMAotCWxzcglyMywgcjQsICMwCi0JYXNyCXI0LCByNSwgIzAKLQotCWxzcglyNiwgcjcsICMzMgotCWFzcglyMCwgcjEsICMzMgotCi0JYWRkCXIxLCByMiwgcjMKLQlhZGQJcjIsIHI0LCAjMgotCXN1YglyMywgcjUsIHI3Ci0Jc3ViCXIyLCByNCwgIzcKLQotCW1vdglyNCwgIzI1NQotCWNtcAlyMywgIzI1MAotCWFkZAlyNiwgIzEyMwotCXN1YglyNSwgIzEyOAotCi0JYW5kCXIzLCByNQotCWVvcglyNCwgcjYKLQlsc2wJcjEsIHIwCi0JbHNyCXIyLCByMwotCWFzcglyNCwgcjYKLQlhZGMJcjUsIHI3Ci0Jc2JjCXIwLCByNAotCXJvcglyMSwgcjQKLQl0c3QJcjIsIHI1Ci0JbmVnCXIxLCByMQotCWNtcAlyMiwgcjMKLQljbW4JcjEsIHI0Ci0Jb3JyCXIwLCByMwotCW11bAlyNCwgcjUKLQliaWMJcjUsIHI3Ci0JbXZuCXI1LCByNQotCi0JYWRkCXIxLCByMTMKLQlhZGQJcjEyLCByMgotCWFkZAlyOSwgcjkKLQljbXAJcjEsIHIxNAotCWNtcAlyOCwgcjAKLQljbXAJcjEyLCByMTQKLQltb3YJcjAsIHI5Ci0JbW92CXI5LCByNAotCW1vdglyOCwgcjgKLQlieAlyNwotCWJ4CXI4Ci0JLmFsaWduIDAKLQlieAlwYwotCi0JbGRyCXIzLCBbcGMsICMxMjhdCi0JbGRyCXI0LCBiYXIKLQotCXN0cglyMCwgW3IxLCByMl0KLQlzdHJiCXIxLCBbcjIsIHI0XQotCWxkcglyNSwgW3I2LCByN10KLQlsZHJiCXIyLCBbcjQsIHI1XQotCQotCS5hbGlnbiAwCi1iYXI6CQotCXN0cmgJcjEsIFtyMiwgcjNdCi0JbGRyaAlyMywgW3I0LCByMF0KLQlsZHNiCXIxLCBbcjYsIHI3XQotCWxkc2gJcjIsIFtyMCwgcjVdCi0KLQlzdHIJcjMsIFtyMywgIzEyNF0KLQlsZHIJcjEsIFtyNCwgIzEyNF0KLQlsZHIJcjUsIFtyNV0KLQlzdHJiCXIxLCBbcjUsICMzMV0KLQlzdHJiCXIxLCBbcjQsICM1XQotCXN0cmIJcjIsIFtyNl0KLQotCXN0cmgJcjQsIFtyNSwgIzYyXQotCWxkcmgJcjUsIFtyMCwgIzRdCi0JbGRyaAlyMywgW3IyXQotCi0Jc3RyCXIzLCBbcjEzLCAjMTAyMF0KLQlsZHIJcjEsIFtyMTMsICM0NF0KLQlsZHIJcjIsIFtyMTNdCi0KLQlhZGQJcjcsIHIxNSwgIzEwMjAKLQlhZGQJcjQsIHIxMywgIzUxMgotCi0JYWRkCXIxMywgIzI2OAotCWFkZAlyMTMsICMtMTA0Ci0Jc3ViCXIxMywgIzI2OAotCXN1YglyMTMsICMtMTA4Ci0KLQlwdXNoCXtyMCwgcjEsIHIyLCByNH0KLQlwdXNoCXtyMCwgcjMtcjcsIGxyfQotCXBvcAl7cjMsIHI0LCByN30KLQlwb3AJe3IwLXI3LCByMTV9Ci0KLQlzdG1pYQlyMyEsIHtyMCwgcjEsIHI0LXI3fQotCWxkbWlhCXIwISwge3IxLXI3fQotCi0JYmVxCWJhcgotCWJuZQliYXIKLQliY3MJYmFyCi0JYmNjCWJhcgotCWJtaQliYXIKLQlicGwJYmFyCi0JYnZzCWJhcgotCWJ2YwliYXIKLQliaGkJYmFyCi0JYmxzCWJhcgotCWJnZQliYXIKLQliZ3QJYmFyCi0JYmx0CWJhcgotCWJndAliYXIKLQlibGUJYmFyCi0JYmhpCWJhcgotCWJsbwliYXIKLQlidWwJYmFyCi0KLWNsb3NlOgotCWxzbAlyNCwgcjUsICNuZWFyIC0gY2xvc2UKLW5lYXI6Ci0JYWRkCXIyLCByMywgI25lYXIgLSBjbG9zZQotCi0JYWRkCXNwLCBzcCwgIzEyNyA8PCAyCi0Jc3ViCXNwLCBzcCwgIzEyNyA8PCAyCi0JYWRkCXIwLCBzcCwgIzI1NSA8PCAyCi0JYWRkCXIwLCBwYywgIzI1NSA8PCAyCi0KLQlhZGQJc3AsIHNwLCAjYmFyIC0gLmZvbwotCXN1YglzcCwgc3AsICNiYXIgLSAuZm9vCi0JYWRkCXIwLCBzcCwgI2JhciAtIC5mb28KLQlhZGQJcjAsIHBjLCAjYmFyIC0gLmZvbwotCi0JYWRkCXIxLCAjYmFyIC0gLmZvbwotCW1vdglyNiwgI2JhciAtIC5mb28KLQljbXAJcjcsICNiYXIgLSAuZm9vCi0KLQlub3AKLQlub3AKLQotCS5hcm0KLS5sb2NhbGJhcjoKLQliCS5sb2NhbGJhcgotCWIJLndvbWJhdAotCWJsCS5sb2NhbGJhcgotCWJsCS53b21iYXQKLQotCWJ4CXIwCi0Jc3dpCTB4MTIzNDU2Ci0KLQkudGh1bWIKLQlAIFRoZSBmb2xsb3dpbmcgd2lsbCBiZSBkaXNhc3NlbWJsZWQgaW5jb3JyZWN0bHkgaWYgd2UgZG8gbm90Ci0JQCBoYXZlIGEgVGh1bWIgc3ltYm9sIGRlZmluZWQgYmVmb3JlIHRoZSBmaXJzdCBUaHVtYiBpbnN0cnVjdGlvbjoKLW1vcmV0aHVtYjoKLQlhZHIJcjAsIGZvcndhcmRvbmx5Ci0KLQliCS5mb28KLQliCS53b21iYXQKLQlibAkuZm9vCi0JYmwJLndvbWJhdAotCi0JYngJcjAKLQotCXN3aQkweGZmCi0JLmFsaWduCTAKLWZvcndhcmRvbmx5OgotCWJlcQkud29tYmF0Ci0JYm5lCS53b21iYXQKLQliY3MJLndvbWJhdAotCWJjYwkud29tYmF0Ci0JYm1pCS53b21iYXQKLQlicGwJLndvbWJhdAotCWJ2cwkud29tYmF0Ci0JYnZjCS53b21iYXQKLQliaGkJLndvbWJhdAotCWJscwkud29tYmF0Ci0JYmdlCS53b21iYXQKLQliZ3QJLndvbWJhdAotCWJsdAkud29tYmF0Ci0JYmd0CS53b21iYXQKLQlibGUJLndvbWJhdAotCWJoaQkud29tYmF0Ci0JYmxvCS53b21iYXQKLQlidWwJLndvbWJhdAotCi0uYmFjazoKLQlibAkubG9jYWwKLQkuc3BhY2UJKDEgPDwgMTEpCUAgbGVhdmUgc3BhY2UgdG8gZm9yY2UgbG9uZyBvZmZzZXRzCi0ubG9jYWw6Ci0JYmwJLmJhY2sKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2NzY4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBhbGlnbm1lbnQgdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxzdGFydD46Ci0gICAwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgIDg6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAxMDoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDE4OgkwMGYwMDAwMCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLSAgMjA6CTA4ODE1YTgwIDAwZjAwMDAwIAlhYnMJcjIxLCByNDIJfHwJbm9wCQotICAyODoJMDg4MTVhODAgMDBmMDAwMDAgCWFicwlyMjEsIHI0Mgl8fAlub3AJCi0gIDMwOgkwODgxNWE4MCAwMGYwMDAwMCAJYWJzCXIyMSwgcjQyCXx8CW5vcAkKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYWxpZ24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMDM5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIHRlc3RzIHByb3BlciBoYW5kbGluZyBvZiBhbGlnbnMgb24gRDMwVgotCi0JLnRleHQKLQkuYWxpZ24gMwotc3RhcnQ6Ci0JYWJzCXIyMSxyNDIKLQkuYWxpZ24gMwotCWFicwlyMjEscjQyCi0JLmFsaWduIDQKLQlhYnMJcjIxLHI0MgotCS5hbGlnbiA0Ci0JYWJzCXIyMSxyNDIKLQkKLQkuZGF0YQotCS5sb25nCTB4ZGVhZGJlZWYKLQkKLQkudGV4dAotCWFicwlyMjEscjQyCi0KLQkuZGF0YQotCS5hbGlnbiA0Ci0JLmxvbmcJMHhkZWFkYmVlZgotCQotCS50ZXh0Ci0JLmFsaWduIDMKLQlhYnMJcjIxLHI0MgotCS5lbmQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9hcnJheS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODFiYzMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkuZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGFycmF5IHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8X19mb28tMHg0OD46Ci0gICAwOgk4ODA4MjBjMCA4MDAwMDA0OCAJYWRkLmwJcjIsIHIzLCAweDQ4Ci0JCQkwOiBSX0QzMFZfMzIJLnRleHQKLSAgIDg6CTg4MDgyMGMwIDgwMDAwMDQ5IAlhZGQubAlyMiwgcjMsIDB4NDkKLQkJCTg6IFJfRDMwVl8zMgkudGV4dAotICAxMDoJODgwODIwYzAgODAwMDAwNGEgCWFkZC5sCXIyLCByMywgMHg0YQotCQkJMTA6IFJfRDMwVl8zMgkudGV4dAotICAxODoJODgwODIwYzAgODAwMDAwNGIgCWFkZC5sCXIyLCByMywgMHg0YgotCQkJMTg6IFJfRDMwVl8zMgkudGV4dAotICAyMDoJODgwODIwYzAgODAwMDAwNGMgCWFkZC5sCXIyLCByMywgMHg0YwotCQkJMjA6IFJfRDMwVl8zMgkudGV4dAotICAyODoJODgwODIwYzAgODAwMDAwNGQgCWFkZC5sCXIyLCByMywgMHg0ZAotCQkJMjg6IFJfRDMwVl8zMgkudGV4dAotICAzMDoJODgwODIwYzAgODAwMDAwNGUgCWFkZC5sCXIyLCByMywgMHg0ZQotCQkJMzA6IFJfRDMwVl8zMgkudGV4dAotICAzODoJODgwODIwYzAgODAwMDAwNGYgCWFkZC5sCXIyLCByMywgMHg0ZgotCQkJMzg6IFJfRDMwVl8zMgkudGV4dAotICA0MDoJODgwODIwYzAgODAwMDAwNTAgCWFkZC5sCXIyLCByMywgMHg1MAotCQkJNDA6IFJfRDMwVl8zMgkudGV4dAotCi0wKzAwNDggPF9fZm9vPjoKLSAgNDg6CTEyMzQ1Njc4IDEyMzQ1Njc4IAkubG9uZwkweDEyMzQ1Njc4CXx8CS5sb25nCTB4MTIzNDU2NzgKLSAgNTA6CTEyMzQ1Njc4IDAwMDAwMDAwICAgICAgCS5sb25nCTB4MTIzNDU2NzgJfHwJYnJhLnMJcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYXJyYXkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExODdkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2FycmF5LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIEQzMFYgYXJyYXkgdGVzdAotCS50ZXh0Ci0JYWRkIHIyLCByMyAsIF9fZm9vCi0JYWRkIHIyLCByMyAsIF9fZm9vKzEKLQlhZGQgcjIsIHIzICwgX19mb28rMgotCWFkZCByMiwgcjMgLCBfX2ZvbyszCi0JYWRkIHIyLCByMyAsIF9fZm9vKzQKLQlhZGQgcjIsIHIzICwgX19mb28rNQotCWFkZCByMiwgcjMgLCBfX2Zvbys2Ci0JYWRkIHIyLCByMyAsIF9fZm9vKzcKLQlhZGQgcjIsIHIzICwgX19mb28rOAotX19mb286Ci0JLmludCAweDEyMzQ1Njc4Ci0gICAgICAgIC5pbnQgMHgxMjM0NTY3OAotICAgICAgICAuaW50IDB4MTIzNDU2NzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NmFiNDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBiaXR0ZXN0IG9wdAotI2FzOiAtV08KLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwMGYwMDAwMCA4NDQwMTA4MyAJbm9wCQktPglsZHcucwlyMSwgQFwocjIsIHIzXCkKLSAgIDg6CTA0NDA2MTQ0IDAwZjAwMDAwIAlsZHcucwlyNiwgQFwocjUsIHI0XCkJfHwJbm9wCQotICAxMDoJMDBmMDAwMDAgODIyMDEwODMgCW5vcAkJLT4JYnNldAlyMSwgcjIsIHIzCi0gIDE4Ogk4MGYwMDAwMCAwMjAwMTA4MyAJbm9wCQk8LQlidHN0CWYxLCByMiwgcjMKLSAgMjA6CTAwZjAwMDAwIDAyMzAxMDgzIAlub3AJCXx8CWJjbHIJcjEsIHIyLCByMwotICAyODoJMDBmMDAwMDAgODIxMDEwODMgCW5vcAkJLT4JYm5vdAlyMSwgcjIsIHIzCi0gIDMwOgkwMjEwMTA4MyA4MGYwMDAwMCAJYm5vdAlyMSwgcjIsIHIzCS0+CW5vcAkKLSAgMzg6CTA0N2MwMTA1IDAyMjAxMDgzIAltb2RkZWMJcjQsIDB4NQl8fAlic2V0CXIxLCByMiwgcjMKLSAgNDA6CTAyMjAxMDgzIDg0N2MwMTA1IAlic2V0CXIxLCByMiwgcjMJLT4JbW9kZGVjCXI0LCAweDUKLSAgNDg6CTAyMjAxMDgzIDA4YzA0MTQ2IAlic2V0CXIxLCByMiwgcjMJfHwJam9pbmxsLnMJcjQsIHI1LCByNgotICA1MDoJMDIyMDEwODMgMDhjMDQxNDYgCWJzZXQJcjEsIHIyLCByMwl8fAlqb2lubGwucwlyNCwgcjUsIHI2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9iaXR0ZXN0LmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVkMWI3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QubAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjogV2FybmluZzogU3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnRzdCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYmNsciBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYm5vdCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLS4qOiBXYXJuaW5nOiBTd2FwcGluZyBpbnN0cnVjdGlvbiBvcmRlcgotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAJIyBiaXR0ZXN0LnMKLSAgIDIgICAgICAgICAgICAgIAkjCi0gICAzICAgICAgICAgICAgICAJIyBCaXQgb3BlcmF0aW9uIGluc3RydWN0aW9ucyBcKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1RcKSBzaG91bGQgbm90IGJlIHBsYWNlZCBpbiBJVS4KLSAgIDQgICAgICAgICAgICAgIAkjIElmIHRoZSB1c2VyIHNwZWNpZmljYWxseSBpbmRpY2F0ZXMgdGhleSBzaG91bGQgYmUgaW4gdGhlIElVLCBHQVMgd2lsbAotICAgNSAgICAgICAgICAgICAgCSMgZ2VuZXJhdGUgd2FybmluZ3MuIFRoZSByZWFzb24gd2h5IHRoaXMgaXMgbm90IGFuIGVycm9yIGlzIHRoYXQgdGhvc2UgaW5zdHJ1Y3Rpb25zIAotICAgNiAgICAgICAgICAgICAgCSMgd2lsbCBmYWlsIGluIElVIG9ubHkgb2NjYXNpb25hbGx5LiBUaHVzIEdBUyBzaG91bGQgcGFjayB0aGVtIGluIE1VIGZvcgotICAgNyAgICAgICAgICAgICAgCSMgc2FmZXR5LCBhbmQgaXQganVzdCBuZWVkcyB0byBkcmF3IGF0dGVudGlvbiB3aGVuIGEgdmlvbGF0aW9uIGlzIGdpdmVuLiAKLSAgIDggICAgICAgICAgICAgIAkKLSAgIDkgICAgICAgICAgICAgIAkJCi0gIDEwIDAwMDAgMDBGMDAwMDAgCQlub3AgLT4gbGR3IFIxLCBAXChSMixSM1wpCi0gIDEwICAgICAgODQ0MDEwODMgCi0gIDExIDAwMDggMDQ0MDYxNDQgCSAgICAgICAgbm9wIHx8IGxkdyBSNiwgQFwoUjUsUjRcKQotLiogIFdhcm5pbmc6U3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAgICAgICAgIAkgICAgICAgIAotICAxMyAwMDEwIDAwRjAwMDAwIAkgICAgICAgIG5vcCAtPiBCU0VUIFIxLCBSMiwgUjMgCi0uKiAgV2FybmluZzpFeGVjdXRpbmcgYnNldCBpbiBJVSBtYXkgbm90IHdvcmsKLSAgMTMgICAgICA4MjIwMTA4MyAKLSAgMTQgMDAxOCA4MEYwMDAwMCAJICAgICAgICBub3AgPC0gQlRTVCBGMSwgUjIsIFIzIAotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJ0c3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE0ICAgICAgMDIwMDEwODMgCi0gIDE1IDAwMjAgMDBGMDAwMDAgCSAgICAgICAgbm9wIHx8IEJDTFIgUjEsIFIyLCBSMwotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJjbHIgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE1ICAgICAgMDIzMDEwODMgCi0gIDE2IDAwMjggMDBGMDAwMDAgCSAgICAgICAgbm9wIC0+IEJOT1QgUjEsIFIyLCBSMwotLiogIFdhcm5pbmc6RXhlY3V0aW5nIGJub3QgaW4gSVUgbWF5IG5vdCB3b3JrCi0gIDE2ICAgICAgODIxMDEwODMgCi0gIDE3IDAwMzAgMDIxMDEwODMgCSAgICAgICAgQk5PVCByMSwgcjIsIHIzIC0+IG5vcAotICAxNyAgICAgIDgwRjAwMDAwIAotICAxOCAgICAgICAgICAgICAgCSAgICAgICAgCi0gIDE5IDAwMzggMDQ3QzAxMDUgCSAgICAgICAgYnNldCByMSwgcjIsIHIzIHx8IG1vZGRlYyByNCwgNQotLiogIFdhcm5pbmc6U3dhcHBpbmcgaW5zdHJ1Y3Rpb24gb3JkZXIKLSAgMTkgICAgICAwMjIwMTA4MyAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgICAgICAgICAgICAgIAkgICAgICAgIGJzZXQgcjEsIHIyLCByMwotICAyMiAwMDQwIDAyMjAxMDgzIAkgICAgICAgIG1vZGRlYyByNCwgNQotICAyMiAgICAgIDg0N0MwMTA1IAotICAyMyAgICAgICAgICAgICAgCQotICAyNCAgICAgICAgICAgICAgCSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gIDI1IDAwNDggMDIyMDEwODMgCSAgICAgICAgam9pbmxsIHI0LCByNSwgcjYKLSAgMjUgICAgICA4OEMwNDE0NiAKLSAgMjYgICAgICAgICAgICAgIAkKLSAgMjcgICAgICAgICAgICAgIAkgICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0gIDI4IDAwNTAgODIyMDEwODMgCSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gIDI4ICAgICAgMDhDMDQxNDYgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2JpdHRlc3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzlhNTZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvYml0dGVzdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIyBiaXR0ZXN0LnMKLSMKLSMgQml0IG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKEJDTFIsIEJOT1QsIEJTRVQsIEJUU1QpIHNob3VsZCBub3QgYmUgcGxhY2VkIGluIElVLgotIyBJZiB0aGUgdXNlciBzcGVjaWZpY2FsbHkgaW5kaWNhdGVzIHRoZXkgc2hvdWxkIGJlIGluIHRoZSBJVSwgR0FTIHdpbGwKLSMgZ2VuZXJhdGUgd2FybmluZ3MuIFRoZSByZWFzb24gd2h5IHRoaXMgaXMgbm90IGFuIGVycm9yIGlzIHRoYXQgdGhvc2UgaW5zdHJ1Y3Rpb25zIAotIyB3aWxsIGZhaWwgaW4gSVUgb25seSBvY2Nhc2lvbmFsbHkuIFRodXMgR0FTIHNob3VsZCBwYWNrIHRoZW0gaW4gTVUgZm9yCi0jIHNhZmV0eSwgYW5kIGl0IGp1c3QgbmVlZHMgdG8gZHJhdyBhdHRlbnRpb24gd2hlbiBhIHZpb2xhdGlvbiBpcyBnaXZlbi4gCi0KLQkKLQlub3AgLT4gbGR3IFIxLCBAKFIyLFIzKQotICAgICAgICBub3AgfHwgbGR3IFI2LCBAKFI1LFI0KQotICAgICAgICAKLSAgICAgICAgbm9wIC0+IEJTRVQgUjEsIFIyLCBSMyAKLSAgICAgICAgbm9wIDwtIEJUU1QgRjEsIFIyLCBSMyAKLSAgICAgICAgbm9wIHx8IEJDTFIgUjEsIFIyLCBSMwotICAgICAgICBub3AgLT4gQk5PVCBSMSwgUjIsIFIzCi0gICAgICAgIEJOT1QgcjEsIHIyLCByMyAtPiBub3AKLSAgICAgICAgCi0gICAgICAgIGJzZXQgcjEsIHIyLCByMyB8fCBtb2RkZWMgcjQsIDUKLQotICAgICAgICBic2V0IHIxLCByMiwgcjMKLSAgICAgICAgbW9kZGVjIHI0LCA1Ci0KLSAgICAgICAgYnNldCByMSwgcjIsIHIzCi0gICAgICAgIGpvaW5sbCByNCwgcjUsIHI2Ci0KLSAgICAgICAgam9pbmxsIHI0LCByNSwgcjYKLSAgICAgICAgYnNldCByMSwgcjIsIHIzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2QzMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2QzMC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NWIwZTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9kMzAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyBEMzBWIGFzc2VtYmxlciB0ZXN0cwotIwotCi1wcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7Ci0gIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gIHNldCB0ZXN0bmFtZSAiRDMwViAkbmFtZSIKLSAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gIGdhc19ydW4gJHtuYW1lfS5zICRvcHRzICI+JmR1bXAub3V0IgotICBpZiB7W3JlZ2V4cF9kaWZmICJkdW1wLm91dCIgIiR7ZmlsZX0ubCJdIH0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCi0gICAgcmV0dXJuCi0gIH0KLSAgcGFzcyAkdGVzdG5hbWUKLX0KLQotaWYge1tpc3RhcmdldCBkMzB2LSotKl19IHsKLSAgcnVuX2R1bXBfdGVzdCAiaW5zdCIKLSAgcnVuX2R1bXBfdGVzdCAiYWxpZ24iCi0gIHJ1bl9kdW1wX3Rlc3QgImd1YXJkIgotICBydW5fZHVtcF90ZXN0ICJndWFyZC1kZWJ1ZyIKLSAgcnVuX2R1bXBfdGVzdCAicmVsb2MiCi0gIHJ1bl9kdW1wX3Rlc3QgIm9wdCIKLSAgcnVuX2R1bXBfdGVzdCAiYXJyYXkiCi0gIHJ1bl9kdW1wX3Rlc3QgImxhYmVsIgotICBydW5fbGlzdF90ZXN0ICJ3YXJuX29kZHJlZyIgIi1hbCIKLSAgcnVuX2xpc3RfdGVzdCAiYml0dGVzdCIgIi1hbCIKLSAgcnVuX2R1bXBfdGVzdCAiYml0dGVzdCIKLSAgcnVuX2xpc3RfdGVzdCAic2VyaWFsIiAiLWFsIgotICBydW5fbGlzdF90ZXN0ICJzZXJpYWwyIiAiLWFsIgotICBydW5fbGlzdF90ZXN0ICJzZXJpYWwyTyIgIi1hbCAtTyIKLSAgcnVuX2R1bXBfdGVzdCAibXVsIgotfQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTE1NGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI29iamR1bXA6IC1sZHIKLSNuYW1lOiBEMzBWIGRlYnVnICgtZykgdGVzdAotI2FzOiAtZwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLS4qOlswLTldKwotICAgMDoJMDgwMDEwODMgMDBmMDAwMDAgCWFkZC5zCXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gICA4OgkwODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMTA6CTE4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy90eAlyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAxODoJMjgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL2Z4CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDIwOgkzODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMveHQJcjEsIHIyLCByMwl8fAlub3AJCi0uKjpbMC05XSsKLSAgMjg6CTQ4MDAxMDgzIDAwZjAwMDAwIAlhZGQucy94ZglyMSwgcjIsIHIzCXx8CW5vcAkKLS4qOlswLTldKwotICAzMDoJNTgwMDEwODMgMDBmMDAwMDAgCWFkZC5zL3R0CXIxLCByMiwgcjMJfHwJbm9wCQotLio6WzAtOV0rCi0gIDM4Ogk2ODAwMTA4MyAwMGYwMDAwMCAJYWRkLnMvdGYJcjEsIHIyLCByMwl8fAlub3AJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2d1YXJkLWRlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjBmN2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC1kZWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBTYW1lIGFzIGd1YXJkLnMgYnV0IGhlcmUgd2UgYXJlIHRlc3RpbmcgZGVidWcgKC1nKSBhc3NlbWJseQotIyBPbiB0aGUgRDMwViwgYXNzZW1ibGluZyB3aXRoIC1nIHNob3VsZCBkaXNhYmxlIHRoZSBWTElXIHBhY2tpbmcKLSMgYW5kIHB1dCBvbmx5IG9uZSBpbnN0cnVjdGlvbiBwZXIgbGluZS4JCi0KLQkudGV4dAotCi0JYWRkCXIxLHIyLHIzCi0JYWRkL2FsCXIxLHIyLHIzCi0JYWRkL3R4CXIxLHIyLHIzCi0JYWRkL2Z4CXIxLHIyLHIzCi0JYWRkL3h0CXIxLHIyLHIzCi0JYWRkL3hmCXIxLHIyLHIzCi0JYWRkL3R0CXIxLHIyLHIzCi0JYWRkL3RmCXIxLHIyLHIzCi0KLQkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2ZhMmRhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIGd1YXJkZWQgZXhlY3V0aW9uIHRlc3QKLSNhczoKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8LnRleHQ+OgotICAgMDoJMDgwMDEwODMgODgwMDEwODMgCWFkZC5zCXIxLCByMiwgcjMJLT4JYWRkLnMJcjEsIHIyLCByMwotICAgODoJMTgwMDEwODMgYTgwMDEwODMgCWFkZC5zL3R4CXIxLCByMiwgcjMJLT4JYWRkLnMvZngJcjEsIHIyLCByMwotICAxMDoJMzgwMDEwODMgYzgwMDEwODMgCWFkZC5zL3h0CXIxLCByMiwgcjMJLT4JYWRkLnMveGYJcjEsIHIyLCByMwotICAxODoJNTgwMDEwODMgZTgwMDEwODMgCWFkZC5zL3R0CXIxLCByMiwgcjMJLT4JYWRkLnMvdGYJcjEsIHIyLCByMwotICAyMDoJMDgwMDEwODMgODgwMDEwODMgCWFkZC5zCXIxLCByMiwgcjMJLT4JYWRkLnMJcjEsIHIyLCByMwotICAyODoJMTgwMDEwODMgYTgwMDEwODMgCWFkZC5zL3R4CXIxLCByMiwgcjMJLT4JYWRkLnMvZngJcjEsIHIyLCByMwotICAzMDoJMzgwMDEwODMgYzgwMDEwODMgCWFkZC5zL3h0CXIxLCByMiwgcjMJLT4JYWRkLnMveGYJcjEsIHIyLCByMwotICAzODoJNTgwMDEwODMgZTgwMDEwODMgCWFkZC5zL3R0CXIxLCByMiwgcjMJLT4JYWRkLnMvdGYJcjEsIHIyLCByMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9ndWFyZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDljZDMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvZ3VhcmQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgRDMwViBndWFyZGVkIGV4ZWN1dGlvbiBhc3NlbWJseSB0ZXN0Ci0KLQkudGV4dAotCi0JYWRkCXIxLHIyLHIzCi0JYWRkL2FsCXIxLHIyLHIzCi0JYWRkL3R4CXIxLHIyLHIzCi0JYWRkL2Z4CXIxLHIyLHIzCi0JYWRkL3h0CXIxLHIyLHIzCi0JYWRkL3hmCXIxLHIyLHIzCi0JYWRkL3R0CXIxLHIyLHIzCi0JYWRkL3RmCXIxLHIyLHIzCi0KLSMgY2hlY2sgY2FzZSBzZW5zaXRpdml0eSB0b28KLQlBREQJcjEscjIscjMKLQlBREQvQUwJcjEscjIscjMKLQlBREQvdHgJcjEscjIscjMKLQlhZGQvRlgJcjEscjIscjMKLQlBREQvWFQJcjEscjIscjMKLQlBREQvWEYJcjEscjIscjMKLQlhZGQvVFQJcjEscjIscjMKLQlBREQvdGYJcjEscjIscjMKLQkKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2MWNiZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2luc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBiYXNpYyBpbnN0cnVjdGlvbiB0ZXN0Ci0jYXM6Ci0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8c3RhcnQ+OgotICAgMDoJMDg4MTVhODAgODgwMDEwODMgCWFicwlyMjEsIHI0MgktPglhZGQucwlyMSwgcjIsIHIzCi0gICA4OgkwODBiMmNkYSAwMGYwMDAwMCAJYWRkLnMJcjUwLCByNTEsIDB4MWEJfHwJbm9wCQotICAxMDoJODgwYjJjZjcgOGFiMWJlZWYgCWFkZC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDE4OgkwODEwMTA4MyA4ODFiMmNkYSAJYWRkMmgucwlyMSwgcjIsIHIzCS0+CWFkZDJoLnMJcjUwLCByNTEsIDB4MWEKLSAgMjA6CTg4MWIyY2Y3IDhhYjFiZWVmIAlhZGQyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDI4OgkwODQwMTA4MyA4ODRiMmNkYSAJYWRkYy5zCXIxLCByMiwgcjMJLT4JYWRkYy5zCXI1MCwgcjUxLCAweDFhCi0gIDMwOgk4ODRiMmNmNyA4YWIxYmVlZiAJYWRkYy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDM4OgkwOTAwMTA4MyA4OTBiMmNkYSAJYWRkaGxsbC5zCXIxLCByMiwgcjMJLT4JYWRkaGxsbC5zCXI1MCwgcjUxLCAweDFhCi0gIDQwOgk4OTBiMmNmNyA4YWIxYmVlZiAJYWRkaGxsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDQ4OgkwOTEwMTA4MyA4OTFiMmNkYSAJYWRkaGxsaC5zCXIxLCByMiwgcjMJLT4JYWRkaGxsaC5zCXI1MCwgcjUxLCAweDFhCi0gIDUwOgk4OTFiMmNmNyA4YWIxYmVlZiAJYWRkaGxsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDU4OgkwOTIwMTA4MyA4OTJiMmNkYSAJYWRkaGxobC5zCXIxLCByMiwgcjMJLT4JYWRkaGxobC5zCXI1MCwgcjUxLCAweDFhCi0gIDYwOgk4OTJiMmNmNyA4YWIxYmVlZiAJYWRkaGxobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDY4OgkwOTMwMTA4MyA4OTNiMmNkYSAJYWRkaGxoaC5zCXIxLCByMiwgcjMJLT4JYWRkaGxoaC5zCXI1MCwgcjUxLCAweDFhCi0gIDcwOgk4OTNiMmNmNyA4YWIxYmVlZiAJYWRkaGxoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDc4OgkwOTQwMTA4MyA4OTRiMmNkYSAJYWRkaGhsbC5zCXIxLCByMiwgcjMJLT4JYWRkaGhsbC5zCXI1MCwgcjUxLCAweDFhCi0gIDgwOgk4OTRiMmNmNyA4YWIxYmVlZiAJYWRkaGhsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDg4OgkwOTUwMTA4MyA4OTViMmNkYSAJYWRkaGhsaC5zCXIxLCByMiwgcjMJLT4JYWRkaGhsaC5zCXI1MCwgcjUxLCAweDFhCi0gIDkwOgk4OTViMmNmNyA4YWIxYmVlZiAJYWRkaGhsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIDk4OgkwOTYwMTA4MyA4OTZiMmNkYSAJYWRkaGhobC5zCXIxLCByMiwgcjMJLT4JYWRkaGhobC5zCXI1MCwgcjUxLCAweDFhCi0gIGEwOgk4OTZiMmNmNyA4YWIxYmVlZiAJYWRkaGhobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGE4OgkwOTcwMTA4MyA4OTdiMmNkYSAJYWRkaGhoaC5zCXIxLCByMiwgcjMJLT4JYWRkaGhoaC5zCXI1MCwgcjUxLCAweDFhCi0gIGIwOgk4OTdiMmNmNyA4YWIxYmVlZiAJYWRkaGhoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGI4OgkwODYwMTA4MyA4ODZiMmNkYSAJYWRkcy5zCXIxLCByMiwgcjMJLT4JYWRkcy5zCXI1MCwgcjUxLCAweDFhCi0gIGMwOgk4ODZiMmNmNyA4YWIxYmVlZiAJYWRkcy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGM4OgkwODcwMTA4MyA4ODdiMmNkYSAJYWRkczJoLnMJcjEsIHIyLCByMwktPglhZGRzMmgucwlyNTAsIHI1MSwgMHgxYQotICBkMDoJODg3YjJjZjcgOGFiMWJlZWYgCWFkZHMyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGQ4OgkwMzgwMTA4MyA4MzhiMmNkYSAJYW5kLnMJcjEsIHIyLCByMwktPglhbmQucwlyNTAsIHI1MSwgMHgxYQotICBlMDoJODM4YjJjZjcgOGFiMWJlZWYgCWFuZC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gIGU4OgkwMjgwMDA0MiA4Mjg4MzEwNSAJYW5kZmcJZjAsIGYxLCBmMgktPglhbmRmZwlmMywgcywgMHg1Ci0gIGYwOgkwOGEwMTA4MyA4OGE4NDE0NiAJYXZnLnMJcjEsIHIyLCByMwktPglhdmcucwlyNCwgcjUsIDB4NgotICBmODoJODhhYjJjZjcgOGFiMWJlZWYgCWF2Zy5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gMTAwOgkwOGIwMTA4MyA4OGI4NDE0NiAJYXZnMmgucwlyMSwgcjIsIHIzCS0+CWF2ZzJoLnMJcjQsIHI1LCAweDYKLSAxMDg6CTg4YmIyY2Y3IDhhYjFiZWVmIAlhdmcyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gMTEwOgkwMjMwMTA4MyA4MjM4NDE0NiAJYmNscglyMSwgcjIsIHIzCS0+CWJjbHIJcjQsIHI1LCAweDYKLSAxMTg6CTAyMTAxMDgzIDgyMTg1Y2M2IAlibm90CXIxLCByMiwgcjMJLT4JYm5vdAlyNSwgcjUxLCAweDYKLSAxMjA6CTAwMDAwMDI5IDAwZjAwMDAwIAlicmEucwlyNDEJfHwJbm9wCQotIDEyODoJMDAwODAwMDggMDBmMDAwMDAgCWJyYS5zCTQwCVwoMTY4IDxzdGFydFwrMHgxNjg+XCkJfHwJbm9wCQotIDEzMDoJMDAwODFlMDEgMDBmMDAwMDAgCWJyYS5zCWYwMDgJXChmMTM4IDxzdGFydFwrMHhmMTM4PlwpCXx8CW5vcAkKLSAxMzg6CTAwNDY5MDJhIDAwZjAwMDAwIAlicmF0bnoucwlyNDEsIHI0Mgl8fAlub3AJCi0gMTQwOgk4MDRjMTAwMCA4MDAwZjAwZCAJYnJhdG56LmwJcjEsIGYwMGQJXChmMTRkIDxzdGFydFwrMHhmMTRkPlwpCi0gMTQ4Ogk4MDRjMTAzNyA4YWIxZjAwZCAJYnJhdG56LmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMTU1IDxzdGFydFwrMHhkZWFkZjE1NT5cKQotIDE1MDoJMDA0MjkwMmEgMDBmMDAwMDAgCWJyYXR6ci5zCXI0MSwgcjQyCXx8CW5vcAkKLSAxNTg6CTgwNDgxMDAwIDgwMDBmMDBkIAlicmF0enIubAlyMSwgZjAwZAlcKGYxNjUgPHN0YXJ0XCsweGYxNjU+XCkKLSAxNjA6CTgwNDgxMDM3IDhhYjFmMDBkIAlicmF0enIubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYxNmQgPHN0YXJ0XCsweGRlYWRmMTZkPlwpCi0gMTY4OgkwMjIwMTA4MyA4MjI4NWNjNiAJYnNldAlyMSwgcjIsIHIzCS0+CWJzZXQJcjUsIHI1MSwgMHg2Ci0gMTcwOgkwMDIwMDAyOSAwMGYwMDAwMCAJYnNyLnMJcjQxCXx8CW5vcAkKLSAxNzg6CTAwMjgxZTAxIDAwZjAwMDAwIAlic3IucwlmMDA4CVwoZjE4MCA8c3RhcnRcKzB4ZjE4MD5cKQl8fAlub3AJCi0gMTgwOgk4MDI4MDAzNyA4YWIxZjAwZCAJYnNyLmwJLTIxNTIwZmYzCVwoZGVhZGYxOGQgPHN0YXJ0XCsweGRlYWRmMThkPlwpCi0gMTg4OgkwMDY2OTAyYSAwMGYwMDAwMCAJYnNydG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDE5MDoJODA2YzEwMDAgODAwMGYwMGQgCWJzcnRuei5sCXIxLCBmMDBkCVwoZjE5ZCA8c3RhcnRcKzB4ZjE5ZD5cKQotIDE5ODoJODA2YzEwMzcgOGFiMWYwMGQgCWJzcnRuei5sCXIxLCAtMjE1MjBmZjMJXChkZWFkZjFhNSA8c3RhcnRcKzB4ZGVhZGYxYTU+XCkKLSAxYTA6CTAwNjI5MDJhIDAwZjAwMDAwIAlic3J0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMWE4Ogk4MDY4MTAwMCA4MDAwZjAwZCAJYnNydHpyLmwJcjEsIGYwMGQJXChmMWI1IDxzdGFydFwrMHhmMWI1PlwpCi0gMWIwOgk4MDY4MTAzNyA4YWIxZjAwZCAJYnNydHpyLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMWJkIDxzdGFydFwrMHhkZWFkZjFiZD5cKQotIDFiODoJMDIwMDEwODMgODIwODVjYzYgCWJ0c3QJZjEsIHIyLCByMwktPglidHN0CXYsIHI1MSwgMHg2Ci0gMWMwOgkwMmMwMDBjMSA4MmMwOTUxNSAJY21wZXEucwlmMCwgcjMsIHIxCS0+CWNtcG5lLnMJZjEsIHIyMCwgcjIxCi0gMWM4OgkwMmMxMjdlMCA4MmMxYjBjNCAJY21wZ3QucwlmMiwgcjMxLCByMzIJLT4JY21wZ2UucwlmMywgcjMsIHI0Ci0gMWQwOgkwMmMyNDBjNCA4MmMyZDBjNCAJY21wbHQucwlzLCByMywgcjQJLT4JY21wbGUucwl2LCByMywgcjQKLSAxZDg6CTAyYzM2MGM0IDgyYzNmMGM0IAljbXBwcy5zCXZhLCByMywgcjQJLT4JY21wbmcucwljLCByMywgcjQKLSAxZTA6CTAyZDEyN2UwIDgyZDFiMGM0IAljbXB1Z3QucwlmMiwgcjMxLCByMzIJLT4JY21wdWdlLnMJZjMsIHIzLCByNAotIDFlODoJMDJkMjQwYzQgODJkMmQwYzQgCWNtcHVsdC5zCXMsIHIzLCByNAktPgljbXB1bGUucwl2LCByMywgcjQKLSAxZjA6CTAxMDAxMDA4IDgxMDgxMDIwIAlkYnJhLnMJcjEsIHI4CS0+CWRicmEucwlyMSwgMTAwCVwoMmYwIDxzdGFydFwrMHgyZjA+XCkKLSAxZjg6CTgxMDgxMDM3IDhhYjFmMDBkIAlkYnJhLmwJcjEsIC0yMTUyMGZmMwlcKGRlYWRmMjA1IDxzdGFydFwrMHhkZWFkZjIwNT5cKQotIDIwMDoJMDE0MDIwMWYgODE0ODIwMjAgCWRicmFpLnMJMTAsIHIzMQktPglkYnJhaS5zCTEwLCAxMDAJXCgzMDAgPHN0YXJ0XCsweDMwMD5cKQotIDIwODoJODE0ODIwMzcgOGFiMWYwMGQgCWRicmFpLmwJMTAsIC0yMTUyMGZmMwlcKGRlYWRmMjE1IDxzdGFydFwrMHhkZWFkZjIxNT5cKQotIDIxMDoJMDEyMDEwMDggMDBmMDAwMDAgCWRic3IucwlyMSwgcjgJfHwJbm9wCQotIDIxODoJMDEyODEwMjAgMDBmMDAwMDAgCWRic3IucwlyMSwgMTAwCVwoMzE4IDxzdGFydFwrMHgzMTg+XCkJfHwJbm9wCQotIDIyMDoJODEyODEwMzcgOGFiMWYwMGQgCWRic3IubAlyMSwgLTIxNTIwZmYzCVwoZGVhZGYyMmQgPHN0YXJ0XCsweGRlYWRmMjJkPlwpCi0gMjI4OgkwMTYwNDAxZiAwMGYwMDAwMCAJZGJzcmkucwkyMCwgcjMxCXx8CW5vcAkKLSAyMzA6CTAxNjg0MDIwIDAwZjAwMDAwIAlkYnNyaS5zCTIwLCAxMDAJXCgzMzAgPHN0YXJ0XCsweDMzMD5cKQl8fAlub3AJCi0gMjM4Ogk4MTY4NDAzNyA4YWIxZjAwZCAJZGJzcmkubAkyMCwgLTIxNTIwZmYzCVwoZGVhZGYyNDUgPHN0YXJ0XCsweGRlYWRmMjQ1PlwpCi0gMjQwOgkwMTEwMTAyMCAwMGYwMDAwMCAJZGptcC5zCXIxLCByMzIJfHwJbm9wCQotIDI0ODoJODExODEwMDAgODAwMGYwMGQgCWRqbXAubAlyMSwgZjAwZCA8c3RhcnRcKzB4ZjAwZD4KLSAyNTA6CTgxMTgxMDM3IDhhYjFmMDBkIAlkam1wLmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyNTg6CTAxNTA2MDIwIDAwZjAwMDAwIAlkam1waS5zCTMwLCByMzIJfHwJbm9wCQotIDI2MDoJODE1ODYwMDAgODAwMGYwMGQgCWRqbXBpLmwJMzAsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjY4Ogk4MTU4NjAzNyA4YWIxZjAwZCAJZGptcGkubAkzMCwgZGVhZGYwMGQgPHN0YXJ0XCsweGRlYWRmMDBkPgotIDI3MDoJMDEzMDEwMjAgMDBmMDAwMDAgCWRqc3IucwlyMSwgcjMyCXx8CW5vcAkKLSAyNzg6CTgxMzgxMDAwIDgwMDBmMDBkIAlkanNyLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMjgwOgk4MTM4MTAzNyA4YWIxZjAwZCAJZGpzci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMjg4OgkwMTcwMjAyMCAwMGYwMDAwMCAJZGpzcmkucwkxMCwgcjMyCXx8CW5vcAkKLSAyOTA6CTgxNzg0MDAwIDgwMDBmMDBkIAlkanNyaS5sCTIwLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDI5ODoJODE3ODgwMzcgOGFiMWYwMGQgCWRqc3JpLmwJNDAsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAyYTA6CTAwMTAwMDI5IDAwZjAwMDAwIAlqbXAucwlyNDEJfHwJbm9wCQotIDJhODoJMDAxODFlMDEgMDBmMDAwMDAgCWptcC5zCWYwMDggPHN0YXJ0XCsweGYwMDg+CXx8CW5vcAkKLSAyYjA6CTgwMTgwMDM3IDhhYjFmMDBkIAlqbXAubAlkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmI4OgkwMDU2OTAyYSAwMGYwMDAwMCAJam1wdG56LnMJcjQxLCByNDIJfHwJbm9wCQotIDJjMDoJODA1YzEwMDAgODAwMGYwMGQgCWptcHRuei5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDJjODoJODA1YzEwMzcgOGFiMWYwMGQgCWptcHRuei5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmQwOgkwMDUyOTAyYSAwMGYwMDAwMCAJam1wdHpyLnMJcjQxLCByNDIJfHwJbm9wCQotIDJkODoJODA1ODEwMDAgODAwMGYwMGQgCWptcHR6ci5sCXIxLCBmMDBkIDxzdGFydFwrMHhmMDBkPgotIDJlMDoJODA1ODEwMzcgOGFiMWYwMGQgCWptcHR6ci5sCXIxLCBkZWFkZjAwZCA8c3RhcnRcKzB4ZGVhZGYwMGQ+Ci0gMmU4OgkwOGMwMTA4NCA4OGM4MTA4ZiAJam9pbmxsLnMJcjEsIHIyLCByNAktPglqb2lubGwucwlyMSwgcjIsIDB4ZgotIDJmMDoJODhjODEwYjcgOGFiMWYwMGQgCWpvaW5sbC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDJmODoJMDhkMDEwODQgODhkODEwOGYgCWpvaW5saC5zCXIxLCByMiwgcjQJLT4Jam9pbmxoLnMJcjEsIHIyLCAweGYKLSAzMDA6CTg4ZDgxMGI3IDhhYjFmMDBkIAlqb2lubGgubAlyMSwgcjIsIDB4ZGVhZGYwMGQKLSAzMDg6CTA4ZTAxMDg0IDg4ZTgxMDhmIAlqb2luaGwucwlyMSwgcjIsIHI0CS0+CWpvaW5obC5zCXIxLCByMiwgMHhmCi0gMzEwOgk4OGU4MTBiNyA4YWIxZjAwZCAJam9pbmhsLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gMzE4OgkwOGYwMTA4NCA4OGY4MTA4ZiAJam9pbmhoLnMJcjEsIHIyLCByNAktPglqb2luaGgucwlyMSwgcjIsIDB4ZgotIDMyMDoJODhmODEwYjcgOGFiMWYwMGQgCWpvaW5oaC5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDMyODoJMDAzMDAwMjkgMDBmMDAwMDAgCWpzci5zCXI0MQl8fAlub3AJCi0gMzMwOgkwMDM4MWUwMSAwMGYwMDAwMCAJanNyLnMJZjAwOCA8c3RhcnRcKzB4ZjAwOD4JfHwJbm9wCQotIDMzODoJODAzODAwMzcgOGFiMWYwMGQgCWpzci5sCWRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNDA6CTAwNzY5MDJhIDAwZjAwMDAwIAlqc3J0bnoucwlyNDEsIHI0Mgl8fAlub3AJCi0gMzQ4Ogk4MDdjMTAwMCA4MDAwZjAwZCAJanNydG56LmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMzUwOgk4MDdjMTAzNyA4YWIxZjAwZCAJanNydG56LmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNTg6CTAwNzI5MDJhIDAwZjAwMDAwIAlqc3J0enIucwlyNDEsIHI0Mgl8fAlub3AJCi0gMzYwOgk4MDc4MTAwMCA4MDAwZjAwZCAJanNydHpyLmwJcjEsIGYwMGQgPHN0YXJ0XCsweGYwMGQ+Ci0gMzY4Ogk4MDc4MTAzNyA4YWIxZjAwZCAJanNydHpyLmwJcjEsIGRlYWRmMDBkIDxzdGFydFwrMHhkZWFkZjAwZD4KLSAzNzA6CTA0MzA2MWM4IDg0MzQ2MWM4IAlsZDJoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkMmgucwlyNiwgQFwocjdcKywgcjhcKQotIDM3ODoJMDQzYzYxYzggODQzODYxZGEgCWxkMmgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkMmgucwlyNiwgQFwocjcsIDB4MWFcKQotIDM4MDoJODQzODYxYzAgODAwMDEyMzQgCWxkMmgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gMzg4OgkwNDYwNjFjOCA4NDY0NjFjOCAJbGQydy5zCXI2LCBAXChyNywgcjhcKQktPglsZDJ3LnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzOTA6CTA0NmM2MWM4IDg0Njg2MWRhIAlsZDJ3LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZDJ3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzOTg6CTg0Njg2MWMwIDgwMDAxMjM0IAlsZDJ3LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNhMDoJMDQ1MDYxYzggODQ1NDYxYzggCWxkNGJoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkNGJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSAzYTg6CTA0NWM2MWM4IDg0NTg2MWRhIAlsZDRiaC5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQ0YmgucwlyNiwgQFwocjcsIDB4MWFcKQotIDNiMDoJODQ1ODYxYzAgODAwMDEyMzQgCWxkNGJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDNiODoJMDRkMDYxYzggODRkNDYxYzggCWxkNGJodS5zCXI2LCBAXChyNywgcjhcKQktPglsZDRiaHUucwlyNiwgQFwocjdcKywgcjhcKQotIDNjMDoJMDRkYzYxYzggODRkODYxZGEgCWxkNGJodS5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGQ0Ymh1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSAzYzg6CTg0ZDg2MWMwIDgwMDAxMjM0IAlsZDRiaHUubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gM2QwOgkwNDAwNjFjOCA4NDA0NjFjOCAJbGRiLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkYi5zCXI2LCBAXChyN1wrLCByOFwpCi0gM2Q4OgkwNDBjNjFjOCA4NDA4NjFkYSAJbGRiLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGIucwlyNiwgQFwocjcsIDB4MWFcKQotIDNlMDoJODQwODYxYzAgODAwMDEyMzQgCWxkYi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSAzZTg6CTA0OTA2MWM4IDg0OTQ2MWM4IAlsZGJ1LnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkYnUucwlyNiwgQFwocjdcKywgcjhcKQotIDNmMDoJMDQ5YzYxYzggODQ5ODYxZGEgCWxkYnUucwlyNiwgQFwocjctLCByOFwpCS0+CWxkYnUucwlyNiwgQFwocjcsIDB4MWFcKQotIDNmODoJODQ5ODYxYzAgODAwMDEyMzQgCWxkYnUubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDAwOgkwNDIwNjFjOCA4NDI0NjFjOCAJbGRoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkaC5zCXI2LCBAXChyN1wrLCByOFwpCi0gNDA4OgkwNDJjNjFjOCA4NDI4NjFkYSAJbGRoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGgucwlyNiwgQFwocjcsIDB4MWFcKQotIDQxMDoJODQyODYxYzAgODAwMDEyMzQgCWxkaC5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA0MTg6CTA0MTA2MWM4IDg0MTQ2MWM4IAlsZGhoLnMJcjYsIEBcKHI3LCByOFwpCS0+CWxkaGgucwlyNiwgQFwocjdcKywgcjhcKQotIDQyMDoJMDQxYzYxYzggODQxODYxZGEgCWxkaGgucwlyNiwgQFwocjctLCByOFwpCS0+CWxkaGgucwlyNiwgQFwocjcsIDB4MWFcKQotIDQyODoJODQxODYxYzAgODAwMDEyMzQgCWxkaGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDMwOgkwNGEwNjFjOCA4NGE0NjFjOCAJbGRodS5zCXI2LCBAXChyNywgcjhcKQktPglsZGh1LnMJcjYsIEBcKHI3XCssIHI4XCkKLSA0Mzg6CTA0YWM2MWM4IDg0YTg2MWRhIAlsZGh1LnMJcjYsIEBcKHI3LSwgcjhcKQktPglsZGh1LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0NDA6CTg0YTg2MWMwIDgwMDAxMjM0IAlsZGh1LmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDQ0ODoJMDQ0MDYxYzggODQ0NDYxYzggCWxkdy5zCXI2LCBAXChyNywgcjhcKQktPglsZHcucwlyNiwgQFwocjdcKywgcjhcKQotIDQ1MDoJMDQ0YzYxYzggODQ0ODYxZGEgCWxkdy5zCXI2LCBAXChyNy0sIHI4XCkJLT4JbGR3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA0NTg6CTg0NDg2MWMwIDgwMDAxMjM0IAlsZHcubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNDYwOgk4YjQ4MTA5ZiAwYjQwMTA4NCAJbWFjMAlyMSwgcjIsIDB4MWYJPC0JbWFjMAlyMSwgcjIsIHI0Ci0gNDY4Ogk4YjRjMTA5ZiAwYjQ0MTA4NCAJbWFjMQlyMSwgcjIsIDB4MWYJPC0JbWFjMQlyMSwgcjIsIHI0Ci0gNDcwOgk4YjU4MTA5ZiAwYjUwMTA4NCAJbWFjczAJcjEsIHIyLCAweDFmCTwtCW1hY3MwCXIxLCByMiwgcjQKLSA0Nzg6CThiNWMxMDlmIDBiNTQxMDg0IAltYWNzMQlyMSwgcjIsIDB4MWYJPC0JbWFjczEJcjEsIHIyLCByNAotIDQ4MDoJMDQ3YzAwNGEgODQ3NDAwNGEgCW1vZGRlYwlyMSwgMHhhCS0+CW1vZGluYwlyMSwgMHhhCi0gNDg4Ogk4YjY4MTA5ZiAwYjYwMTA4NCAJbXN1YjAJcjEsIHIyLCAweDFmCTwtCW1zdWIwCXIxLCByMiwgcjQKLSA0OTA6CThiNmMxMDlmIDBiNjQxMDg0IAltc3ViMQlyMSwgcjIsIDB4MWYJPC0JbXN1YjEJcjEsIHIyLCByNAotIDQ5ODoJOGIwODEwOGEgMGIwMDEwODQgCW11bAlyMSwgcjIsIDB4YQk8LQltdWwJcjEsIHIyLCByNAotIDRhMDoJOGI3ODEwOWYgMGI3MDEwODQgCW1zdWJzMAlyMSwgcjIsIDB4MWYJPC0JbXN1YnMwCXIxLCByMiwgcjQKLSA0YTg6CThiN2MxMDlmIDBiNzQxMDg0IAltc3ViczEJcjEsIHIyLCAweDFmCTwtCW1zdWJzMQlyMSwgcjIsIHI0Ci0gNGIwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gNGI4Ogk4YTA4MTA4YSAwYTAwMTA4NCAJbXVsMmgJcjEsIHIyLCAweGEJPC0JbXVsMmgJcjEsIHIyLCByNAotIDRjMDoJOGE0ODEwOGEgMGE0MDEwODQgCW11bGh4bGwJcjEsIHIyLCAweGEJPC0JbXVsaHhsbAlyMSwgcjIsIHI0Ci0gNGM4Ogk4YTU4MTA4YSAwYTUwMTA4NCAJbXVsaHhsaAlyMSwgcjIsIDB4YQk8LQltdWxoeGxoCXIxLCByMiwgcjQKLSA0ZDA6CThhNjgxMDhhIDBhNjAxMDg0IAltdWxoeGhsCXIxLCByMiwgMHhhCTwtCW11bGh4aGwJcjEsIHIyLCByNAotIDRkODoJOGE3ODEwOGEgMGE3MDEwODQgCW11bGh4aGgJcjEsIHIyLCAweGEJPC0JbXVsaHhoaAlyMSwgcjIsIHI0Ci0gNGUwOgk4YjkwMDA0NCAwYTEwODA4NCAJbXVseHMJYTAsIHIxLCByNAk8LQltdWx4MmgJcjgsIHIyLCByNAotIDRlODoJOGI4ODEwOGEgMGI4MDAwNDQgCW11bHgJYTEsIHIyLCAweGEJPC0JbXVseAlhMCwgcjEsIHI0Ci0gNGYwOgk4YmY4MjA0YSAwYmYwMTAwNCAJbXZmYWNjCXIyLCBhMSwgMHhhCTwtCW12ZmFjYwlyMSwgYTAsIHI0Ci0gNGY4Ogk4Yjk4MTA4YSAwYTE4ODA4YSAJbXVseHMJYTEsIHIyLCAweGEJPC0JbXVseDJoCXI4LCByMiwgMHhhCi0gNTAwOgkwMWUwYTA4MCA4MWUwYTFjMCAJbXZmc3lzCXIxMCwgcGMJLT4JbXZmc3lzCXIxMCwgcnB0X2MKLSA1MDg6CTAxZTBhMDAwIDgxZTBhMDAyIAltdmZzeXMJcjEwLCBwc3cJLT4JbXZmc3lzCXIxMCwgcHN3aAotIDUxMDoJMDFlMGEwMDEgODFlMGEwMDMgCW12ZnN5cwlyMTAsIHBzd2wJLT4JbXZmc3lzCXIxMCwgZjAKLSA1MTg6CTAxZTBhMTAzIDhhZjAxMDg0IAltdmZzeXMJcjEwLCBzCS0+CW12dGFjYwlhMSwgcjIsIHI0Ci0gNTIwOgkwMGUwNzI4MCA4MGUwMDI4MCAJbXZ0c3lzCXJwdF9jLCByMTAJLT4JbXZ0c3lzCXBzdywgcjEwCi0gNTI4OgkwMGUwMDI4MiA4MGUwMDI4MSAJbXZ0c3lzCXBzd2gsIHIxMAktPgltdnRzeXMJcHN3bCwgcjEwCi0gNTMwOgkwMGUwMDI4MyA4MGUwMzI4MyAJbXZ0c3lzCWYwLCByMTAJLT4JbXZ0c3lzCWYzLCByMTAKLSA1Mzg6CTAwZTA0MjgzIDgwZTA1MjgzIAltdnRzeXMJcywgcjEwCS0+CW12dHN5cwl2LCByMTAKLSA1NDA6CTAwZTA2MjgzIDgwZTA3MjgzIAltdnRzeXMJdmEsIHIxMAktPgltdnRzeXMJYywgcjEwCi0gNTQ4OgkwMGYwMDAwMCA4MzkwMTA4MCAJbm9wCQktPglub3QJcjEsIHIyCi0gNTUwOgkwMjkwMTA4MCA4M2EwMTA4NCAJbm90ZmcJZjEsIGYyCS0+CW9yLnMJcjEsIHIyLCByNAotIDU1ODoJMDNhODEwOWEgMDBmMDAwMDAgCW9yLnMJcjEsIHIyLCAweDFhCXx8CW5vcAkKLSA1NjA6CTgzYTgxMGI3IDhhYjFmMDBkIAlvci5sCXIxLCByMiwgMHhkZWFkZjAwZAotIDU2ODoJMDJhMDEwODQgODJhODQwODEgCW9yZmcJZjEsIGYyLCBzCS0+CW9yZmcJcywgZjIsIDB4MQotIDU3MDoJMDA4MDAwMDAgMDBmMDAwMDAgCXJlaXQJCXx8CW5vcAkKLSA1Nzg6CTAxODAxMDAyIDAwZjAwMDAwIAlyZXBlYXQucwlyMSwgcjIJfHwJbm9wCQotIDU4MDoJODE4ODQwMDAgODAwMGRlYWQgCXJlcGVhdC5sCXI0LCBkZWFkCVwoZTQyZCA8c3RhcnRcKzB4ZTQyZD5cKQotIDU4ODoJODE4ODQwMzcgOGFiMWYwMGQgCXJlcGVhdC5sCXI0LCAtMjE1MjBmZjMJXChkZWFkZjU5NSA8c3RhcnRcKzB4ZGVhZGY1OTU+XCkKLSA1OTA6CTAxYTBhMDAxIDgxYThhMjAwIAlyZXBlYXRpLnMJYQlcKDU5YSA8c3RhcnRcKzB4NTlhPlwpLCByMQktPglyZXBlYXRpLnMJYQlcKDU5YSA8c3RhcnRcKzB4NTlhPlwpLCAxMDAwCVwoMTU5MCA8c3RhcnRcKzB4MTU5MD5cKQotIDU5ODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotIDVhMDoJMDM0MDEwODQgODM0ODEwOGEgCXJvdAlyMSwgcjIsIHI0CS0+CXJvdAlyMSwgcjIsIDB4YQotIDVhODoJMDM1MDEwODQgODM1ODEwOGEgCXJvdDJoCXIxLCByMiwgcjQJLT4Jcm90MmgJcjEsIHIyLCAweGEKLSA1YjA6CThhODgxMDhhIDBhODAxMDg0IAlzYXQJcjEsIHIyLCAweGEJPC0Jc2F0CXIxLCByMiwgcjQKLSA1Yjg6CThhOTgxMDhhIDBhOTAxMDg0IAlzYXQyaAlyMSwgcjIsIDB4YQk8LQlzYXQyaAlyMSwgcjIsIHI0Ci0gNWMwOgk4YmM4MTA4YSAwYmMwMTA4NCAJc2F0aGwJcjEsIHIyLCAweGEJPC0Jc2F0aGwJcjEsIHIyLCByNAotIDVjODoJOGJkODEwOGEgMGJkMDEwODQgCXNhdGhoCXIxLCByMiwgMHhhCTwtCXNhdGhoCXIxLCByMiwgcjQKLSA1ZDA6CThhYTgxMDhhIDBhYTAxMDg0IAlzYXR6CXIxLCByMiwgMHhhCTwtCXNhdHoJcjEsIHIyLCByNAotIDVkODoJOGFiODEwOGEgMGFiMDEwODQgCXNhdHoyaAlyMSwgcjIsIDB4YQk8LQlzYXR6MmgJcjEsIHIyLCByNAotIDVlMDoJMDMwMDEwODQgODMwODEwOGEgCXNyYQlyMSwgcjIsIHI0CS0+CXNyYQlyMSwgcjIsIDB4YQotIDVlODoJMDMxMDEwODQgODMxODEwOGEgCXNyYTJoCXIxLCByMiwgcjQJLT4Jc3JhMmgJcjEsIHIyLCAweGEKLSA1ZjA6CTAzNjAxMDg0IDgzNjgxMDhhIAlzcmMJcjEsIHIyLCByNAktPglzcmMJcjEsIHIyLCAweGEKLSA1Zjg6CTAzMjAxMDg0IDgzMjgxMDhhIAlzcmwJcjEsIHIyLCByNAktPglzcmwJcjEsIHIyLCAweGEKLSA2MDA6CTAzMzAxMDg0IDgzMzgxMDhhIAlzcmwyaAlyMSwgcjIsIHI0CS0+CXNybDJoCXIxLCByMiwgMHhhCi0gNjA4OgkwNTMwNjFjOCA4NTM0NjFjOCAJc3QyaC5zCXI2LCBAXChyNywgcjhcKQktPglzdDJoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2MTA6CTA1M2M2MWM4IDg1Mzg2MWRhIAlzdDJoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdDJoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2MTg6CTg1Mzg2MWMwIDgwMDAxMjM0IAlzdDJoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDYyMDoJMDU2MDYxYzggODU2NDYxYzggCXN0MncucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3Qydy5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjI4OgkwNTZjNjFjOCA4NTY4NjFkYSAJc3Qydy5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3Qydy5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjMwOgk4NTY4NjFjMCA4MDAwMTIzNCAJc3Qydy5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2Mzg6CTA1NTA2MWM4IDg1NTQ2MWM4IAlzdDRoYi5zCXI2LCBAXChyNywgcjhcKQktPglzdDRoYi5zCXI2LCBAXChyN1wrLCByOFwpCi0gNjQwOgkwNTVjNjFjOCA4NTU4NjFkYSAJc3Q0aGIucwlyNiwgQFwocjctLCByOFwpCS0+CXN0NGhiLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2NDg6CTg1NTg2MWMwIDgwMDAxMjM0IAlzdDRoYi5sCXI2LCBAXChyNywgMHgxMjM0XCkKLSA2NTA6CTA1MDA2MWM4IDg1MDQ2MWM4IAlzdGIucwlyNiwgQFwocjcsIHI4XCkJLT4Jc3RiLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2NTg6CTA1MGM2MWM4IDg1MDg2MWRhIAlzdGIucwlyNiwgQFwocjctLCByOFwpCS0+CXN0Yi5zCXI2LCBAXChyNywgMHgxYVwpCi0gNjYwOgk4NTA4NjFjMCA4MDAwMTIzNCAJc3RiLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY2ODoJMDUyMDYxYzggODUyNDYxYzggCXN0aC5zCXI2LCBAXChyNywgcjhcKQktPglzdGgucwlyNiwgQFwocjdcKywgcjhcKQotIDY3MDoJMDUyYzYxYzggODUyODYxZGEgCXN0aC5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3RoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2Nzg6CTg1Mjg2MWMwIDgwMDAxMjM0IAlzdGgubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNjgwOgkwNTEwNjFjOCA4NTE0NjFjOCAJc3RoaC5zCXI2LCBAXChyNywgcjhcKQktPglzdGhoLnMJcjYsIEBcKHI3XCssIHI4XCkKLSA2ODg6CTA1MWM2MWM4IDg1MTg2MWRhIAlzdGhoLnMJcjYsIEBcKHI3LSwgcjhcKQktPglzdGhoLnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2OTA6CTg1MTg2MWMwIDgwMDAxMjM0IAlzdGhoLmwJcjYsIEBcKHI3LCAweDEyMzRcKQotIDY5ODoJMDU0MDYxYzggODU0NDYxYzggCXN0dy5zCXI2LCBAXChyNywgcjhcKQktPglzdHcucwlyNiwgQFwocjdcKywgcjhcKQotIDZhMDoJMDU0YzYxYzggODU0ODYxZGEgCXN0dy5zCXI2LCBAXChyNy0sIHI4XCkJLT4Jc3R3LnMJcjYsIEBcKHI3LCAweDFhXCkKLSA2YTg6CTg1NDg2MWMwIDgwMDAxMjM0IAlzdHcubAlyNiwgQFwocjcsIDB4MTIzNFwpCi0gNmIwOgkwODIwMTA4MyA4ODJiMmNkYSAJc3ViLnMJcjEsIHIyLCByMwktPglzdWIucwlyNTAsIHI1MSwgMHgxYQotIDZiODoJODgyYjJjZjcgOGFiMWJlZWYgCXN1Yi5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmMwOgkwODMwMTA4MyA4ODNiMmNkYSAJc3ViMmgucwlyMSwgcjIsIHIzCS0+CXN1YjJoLnMJcjUwLCByNTEsIDB4MWEKLSA2Yzg6CTg4M2IyY2Y3IDhhYjFiZWVmIAlzdWIyaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmQwOgkwODUwMTA4MyA4ODViMmNkYSAJc3ViYi5zCXIxLCByMiwgcjMJLT4Jc3ViYi5zCXI1MCwgcjUxLCAweDFhCi0gNmQ4Ogk4ODViMmNmNyA4YWIxYmVlZiAJc3ViYi5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmUwOgkwOTgwMTA4MyA4OThiMmNkYSAJc3ViaGxsbC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxsbC5zCXI1MCwgcjUxLCAweDFhCi0gNmU4Ogk4OThiMmNmNyA4YWIxYmVlZiAJc3ViaGxsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNmYwOgkwOTkwMTA4MyA4OTliMmNkYSAJc3ViaGxsaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxsaC5zCXI1MCwgcjUxLCAweDFhCi0gNmY4Ogk4OTliMmNmNyA4YWIxYmVlZiAJc3ViaGxsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzAwOgkwOWEwMTA4MyA4OWFiMmNkYSAJc3ViaGxobC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxobC5zCXI1MCwgcjUxLCAweDFhCi0gNzA4Ogk4OWFiMmNmNyA4YWIxYmVlZiAJc3ViaGxobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzEwOgkwOWIwMTA4MyA4OWJiMmNkYSAJc3ViaGxoaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGxoaC5zCXI1MCwgcjUxLCAweDFhCi0gNzE4Ogk4OWJiMmNmNyA4YWIxYmVlZiAJc3ViaGxoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzIwOgkwOWMwMTA4MyA4OWNiMmNkYSAJc3ViaGhsbC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhsbC5zCXI1MCwgcjUxLCAweDFhCi0gNzI4Ogk4OWNiMmNmNyA4YWIxYmVlZiAJc3ViaGhsbC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzMwOgkwOWQwMTA4MyA4OWRiMmNkYSAJc3ViaGhsaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhsaC5zCXI1MCwgcjUxLCAweDFhCi0gNzM4Ogk4OWRiMmNmNyA4YWIxYmVlZiAJc3ViaGhsaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzQwOgkwOWUwMTA4MyA4OWViMmNkYSAJc3ViaGhobC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhobC5zCXI1MCwgcjUxLCAweDFhCi0gNzQ4Ogk4OWViMmNmNyA4YWIxYmVlZiAJc3ViaGhobC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzUwOgkwOWYwMTA4MyA4OWZiMmNkYSAJc3ViaGhoaC5zCXIxLCByMiwgcjMJLT4Jc3ViaGhoaC5zCXI1MCwgcjUxLCAweDFhCi0gNzU4Ogk4OWZiMmNmNyA4YWIxYmVlZiAJc3ViaGhoaC5sCXI1MCwgcjUxLCAweGRlYWRiZWVmCi0gNzYwOgkwMDkwMDAwMSAwMGYwMDAwMCAJdHJhcC5zCXIxCXx8CW5vcAkKLSA3Njg6CTAwOTgwMDBhIDAwZjAwMDAwIAl0cmFwLnMJMHhhCXx8CW5vcAkKLSA3NzA6CTAzYjAxMDg0IDgzYjgxMDhhIAl4b3IucwlyMSwgcjIsIHI0CS0+CXhvci5zCXIxLCByMiwgMHhhCi0gNzc4Ogk4M2I4MTBiNyA4YWIxZjAwZCAJeG9yLmwJcjEsIHIyLCAweGRlYWRmMDBkCi0gNzgwOgkwMmIwMTA4NCA4MmI4MTEwYSAJeG9yZmcJZjEsIGYyLCBzCS0+CXhvcmZnCWYxLCBzLCAweGEKLSA3ODg6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSA3OTA6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSA3OTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLSA3YTA6CTgwZjAwMDAwIDAwZjAwMDAwIAlub3AJCTwtCW5vcAkKLSA3YTg6CTAzOTAxMDgwIDAwZjAwMDAwIAlub3QJcjEsIHIyCXx8CW5vcAkKLSA3YjA6CTAzOTAyMGMwIDgwZjAwMDAwIAlub3QJcjIsIHIzCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvaW5zdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNjYxMWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9pbnN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQgKzAsMCBAQAotIyB0ZXN0IGFsbCBpbnN0cnVjdGlvbnMKLQotc3RhcnQ6Ci0JYWJzCXIyMSxyNDIKLQotCWFkZAlyMSxyMixyMwotCWFkZAlyNTAscjUxLDB4MWEKLQlhZGQJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGQyaAlyMSxyMixyMwotCWFkZDJoCXI1MCxyNTEsMHgxYQotCWFkZDJoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkYwlyMSxyMixyMwotCWFkZGMJcjUwLHI1MSwweDFhCi0JYWRkYwlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsbGwJcjEscjIscjMKLQlhZGRobGxsCXI1MCxyNTEsMHgxYQotCWFkZGhsbGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRobGxoCXIxLHIyLHIzCi0JYWRkaGxsaAlyNTAscjUxLDB4MWEKLQlhZGRobGxoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGxobAlyMSxyMixyMwotCWFkZGhsaGwJcjUwLHI1MSwweDFhCi0JYWRkaGxobAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhsaGgJcjEscjIscjMKLQlhZGRobGhoCXI1MCxyNTEsMHgxYQotCWFkZGhsaGgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCQotCWFkZGhobGwJcjEscjIscjMKLQlhZGRoaGxsCXI1MCxyNTEsMHgxYQotCWFkZGhobGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlhZGRoaGxoCXIxLHIyLHIzCi0JYWRkaGhsaAlyNTAscjUxLDB4MWEKLQlhZGRoaGxoCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYWRkaGhobAlyMSxyMixyMwotCWFkZGhoaGwJcjUwLHI1MSwweDFhCi0JYWRkaGhobAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFkZGhoaGgJcjEscjIscjMKLQlhZGRoaGhoCXI1MCxyNTEsMHgxYQotCWFkZGhoaGgJcjUwLHI1MSwweGRlYWRiZWVmCi0JCi0JYWRkcwlyMSxyMixyMwotCWFkZHMJcjUwLHI1MSwweDFhCi0JYWRkcwlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0JYWRkczJoCXIxLHIyLHIzCi0JYWRkczJoCXI1MCxyNTEsMHgxYQotCWFkZHMyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQkJCi0JYW5kCXIxLHIyLHIzCi0JYW5kCXI1MCxyNTEsMHgxYQotCWFuZAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCWFuZGZnCWYwLGYxLGYyCi0JYW5kZmcJZjMsZjQsNQotCQotCWF2ZwlyMSxyMixyMwotCWF2ZwlyNCxyNSw2Ci0JYXZnCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0JYXZnMmgJcjEscjIscjMKLQlhdmcyaAlyNCxyNSw2Ci0JYXZnMmgJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQliY2xyCXIxLHIyLHIzCi0JYmNscglyNCxyNSw2Ci0JCi0JYm5vdAlyMSxyMixyMwotCWJub3QJcjUscjUxLDYKLQkJCQotCWJyYQlyNDEKLQlicmEJMHg0MAotCWJyYQkweGYwMGQKLQotCWJyYXRueglyNDEscjQyCi0JYnJhdG56CXIxLDB4ZjAwZAotCWJyYXRueglyMSwweGRlYWRmMDBkCi0KLQlicmF0enIJcjQxLHI0MgotCWJyYXR6cglyMSwweGYwMGQKLQlicmF0enIJcjEsMHhkZWFkZjAwZAotCi0JYnNldAlyMSxyMixyMwotCWJzZXQJcjUscjUxLDYKLQotCWJzcglyNDEKLQlic3IJMHhmMDBkCi0JYnNyCTB4ZGVhZGYwMGQKLQotCWJzcnRueglyNDEscjQyCi0JYnNydG56CXIxLDB4ZjAwZAotCWJzcnRueglyMSwweGRlYWRmMDBkCi0KLQlic3J0enIJcjQxLHI0MgotCWJzcnR6cglyMSwweGYwMGQKLQlic3J0enIJcjEsMHhkZWFkZjAwZAotCi0JYnRzdAlmMSxyMixyMwotCWJ0c3QJZjUscjUxLDYKLQkJCQkJCQotCWNtcGVxCWYwLHIzLHIxCi0JY21wbmUJZjEscjIwLHIyMQotCWNtcGd0CWYyLHIzMSxyMzIKLQljbXBnZQlmMyxyMyxyNAotCWNtcGx0CWY0LHIzLHI0Ci0JY21wbGUJZjUscjMscjQKLQljbXBwcwlmNixyMyxyNAotCWNtcG5nCWY3LHIzLHI0CQkJCQotCi0JY21wdWd0CWYyLHIzMSxyMzIKLQljbXB1Z2UJZjMscjMscjQKLQljbXB1bHQJZjQscjMscjQKLQljbXB1bGUJZjUscjMscjQKLQkJCi0JZGJyYQlyMSxyOCAKLQlkYnJhCXIxLDB4MTAwCi0JZGJyYQlyMSwweGRlYWRmMDBkCi0KLQlkYnJhaQkweDEwLHIzMQotCWRicmFpCTB4MTAsMHgxMDAKLQlkYnJhaQkweDEwLDB4ZGVhZGYwMGQKLQotCWRic3IJcjEscjggfHwgbm9wCi0JZGJzcglyMSwweDEwMCB8fCBub3AKLQlkYnNyCXIxLDB4ZGVhZGYwMGQKLQotCWRic3JpCTB4MjAscjMxIHx8IG5vcAotCWRic3JpCTB4MjAsMHgxMDAgfHwgbm9wCi0JZGJzcmkJMHgyMCwweGRlYWRmMDBkCi0KLQlkam1wCXIxLHIzMgotCWRqbXAJcjEsMHhmMDBkCi0JZGptcAlyMSwweGRlYWRmMDBkCi0KLQlkam1waQkweDMwLHIzMgotCWRqbXBpCTB4MzAsMHhmMDBkCi0JZGptcGkJMHgzMCwweGRlYWRmMDBkCi0KLQlkanNyCXIxLHIzMgotCWRqc3IJcjEsMHhmMDBkCi0JZGpzcglyMSwweGRlYWRmMDBkCi0KLQlkanNyaQkweDEwLHIzMgotCWRqc3JpCTB4MjAsMHhmMDBkCi0JZGpzcmkJMHg0MCwweGRlYWRmMDBkCi0JCi0Jam1wCXI0MQotCWptcAkweGYwMGQKLQlqbXAJMHhkZWFkZjAwZAotCi0Jam1wdG56CXI0MSxyNDIKLQlqbXB0bnoJcjEsMHhmMDBkCi0Jam1wdG56CXIxLDB4ZGVhZGYwMGQKLQotCWptcHR6cglyNDEscjQyCi0Jam1wdHpyCXIxLDB4ZjAwZAotCWptcHR6cglyMSwweGRlYWRmMDBkCi0KLQlqb2lubGwJcjEscjIscjQKLQlqb2lubGwJcjEscjIsMHhmCi0Jam9pbmxsCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2lubGgJcjEscjIscjQKLQlqb2lubGgJcjEscjIsMHhmCi0Jam9pbmxoCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2luaGwJcjEscjIscjQKLQlqb2luaGwJcjEscjIsMHhmCi0Jam9pbmhsCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqb2luaGgJcjEscjIscjQKLQlqb2luaGgJcjEscjIsMHhmCi0Jam9pbmhoCXIxLHIyLDB4ZGVhZGYwMGQJCi0KLQlqc3IJcjQxCi0JanNyCTB4ZjAwZAotCWpzcgkweGRlYWRmMDBkCi0KLQlqc3J0bnoJcjQxLHI0MgotCWpzcnRueglyMSwweGYwMGQKLQlqc3J0bnoJcjEsMHhkZWFkZjAwZAotCi0JanNydHpyCXI0MSxyNDIKLQlqc3J0enIJcjEsMHhmMDBkCi0JanNydHpyCXIxLDB4ZGVhZGYwMGQKLQkJCQkJCi0JbGQyaAlyNixAKHI3LHI4KQotCWxkMmgJcjYsQChyNysscjgpCi0JbGQyaAlyNixAKHI3LSxyOCkKLQlsZDJoCXI2LEAocjcsMHgxYSkKLQlsZDJoCXI2LEAocjcsMHgxMjM0KQotCQotCWxkMncJcjYsQChyNyxyOCkKLQlsZDJ3CXI2LEAocjcrLHI4KQotCWxkMncJcjYsQChyNy0scjgpCi0JbGQydwlyNixAKHI3LDB4MWEpCi0JbGQydwlyNixAKHI3LDB4MTIzNCkKLQkKLQlsZDRiaAlyNixAKHI3LHI4KQotCWxkNGJoCXI2LEAocjcrLHI4KQotCWxkNGJoCXI2LEAocjctLHI4KQotCWxkNGJoCXI2LEAocjcsMHgxYSkKLQlsZDRiaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkNGJodQlyNixAKHI3LHI4KQotCWxkNGJodQlyNixAKHI3KyxyOCkKLQlsZDRiaHUJcjYsQChyNy0scjgpCi0JbGQ0Ymh1CXI2LEAocjcsMHgxYSkKLQlsZDRiaHUJcjYsQChyNywweDEyMzQpCi0KLQlsZGIJcjYsQChyNyxyOCkKLQlsZGIJcjYsQChyNysscjgpCi0JbGRiCXI2LEAocjctLHI4KQotCWxkYglyNixAKHI3LDB4MWEpCi0JbGRiCXI2LEAocjcsMHgxMjM0KQotCi0JbGRidQlyNixAKHI3LHI4KQotCWxkYnUJcjYsQChyNysscjgpCi0JbGRidQlyNixAKHI3LSxyOCkKLQlsZGJ1CXI2LEAocjcsMHgxYSkKLQlsZGJ1CXI2LEAocjcsMHgxMjM0KQotCi0JbGRoCXI2LEAocjcscjgpCi0JbGRoCXI2LEAocjcrLHI4KQotCWxkaAlyNixAKHI3LSxyOCkKLQlsZGgJcjYsQChyNywweDFhKQotCWxkaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkaGgJcjYsQChyNyxyOCkKLQlsZGhoCXI2LEAocjcrLHI4KQotCWxkaGgJcjYsQChyNy0scjgpCi0JbGRoaAlyNixAKHI3LDB4MWEpCi0JbGRoaAlyNixAKHI3LDB4MTIzNCkKLQotCWxkaHUJcjYsQChyNyxyOCkKLQlsZGh1CXI2LEAocjcrLHI4KQotCWxkaHUJcjYsQChyNy0scjgpCi0JbGRodQlyNixAKHI3LDB4MWEpCi0JbGRodQlyNixAKHI3LDB4MTIzNCkKLQotCWxkdwlyNixAKHI3LHI4KQotCWxkdwlyNixAKHI3KyxyOCkKLQlsZHcJcjYsQChyNy0scjgpCi0JbGR3CXI2LEAocjcsMHgxYSkKLQlsZHcJcjYsQChyNywweDEyMzQpCi0JCQkJCQkJCi0JbWFjMAlyMSxyMixyNAotCW1hYzAJcjEscjIsMHgxZgotCW1hYzEJcjEscjIscjQKLQltYWMxCXIxLHIyLDB4MWYKLQotCW1hY3MwCXIxLHIyLHI0Ci0JbWFjczAJcjEscjIsMHgxZgotCW1hY3MxCXIxLHIyLHI0Ci0JbWFjczEJcjEscjIsMHgxZgotCi0JbW9kZGVjCXIxLDB4YQotCi0JbW9kaW5jCXIxLDB4YQotCi0JbXN1YjAJcjEscjIscjQKLQltc3ViMAlyMSxyMiwweDFmCi0JbXN1YjEJcjEscjIscjQKLQltc3ViMQlyMSxyMiwweDFmCi0KLQltdWwJcjEscjIscjQKLQltdWwJcjEscjIsMHhhCi0KLQltc3ViczAJcjEscjIscjQKLQltc3ViczAJcjEscjIsMHgxZgotCW1zdWJzMQlyMSxyMixyNAotCW1zdWJzMQlyMSxyMiwweDFmCi0KLQltdWwyaAlyMSxyMixyNAotCW11bDJoCXIxLHIyLDB4YQotCQotCW11bGh4bGwJcjEscjIscjQKLQltdWxoeGxsCXIxLHIyLDB4YQotCi0JbXVsaHhsaAlyMSxyMixyNAotCW11bGh4bGgJcjEscjIsMHhhCi0KLQltdWxoeGhsCXIxLHIyLHI0Ci0JbXVsaHhobAlyMSxyMiwweGEKLQotCW11bGh4aGgJcjEscjIscjQKLQltdWxoeGhoCXIxLHIyLDB4YQotCi0JbXVseDJoCXI4LHIyLHI0Ci0JbXVseHMJYTAscjEscjQKLQkKLQltdWx4CWEwLHIxLHI0Ci0JbXVseAlhMSxyMiwweGEKLQotCW12ZmFjYwlyMSxhMCxyNAotCW12ZmFjYwlyMixhMSwweGEKLQotCW11bHgyaAlyOCxyMiwweGEKLQltdWx4cwlhMSxyMiwweGEKLQkJCi0JbXZmc3lzCXIxMCxwYwotCW12ZnN5cwlyMTAscnB0X2MKLQltdmZzeXMJcjEwLHBzdwotCW12ZnN5cwlyMTAscHN3aAotCW12ZnN5cwlyMTAscHN3bAotCW12ZnN5cwlyMTAsZjAKLQltdmZzeXMJcjEwLFMKLQotCW12dGFjYwlhMSxyMixyNAotCi0JbXZ0c3lzCXJwdF9jLCByMTAKLQltdnRzeXMJcHN3LCByMTAKLQltdnRzeXMJcHN3aCwgcjEwCi0JbXZ0c3lzCXBzd2wsIHIxMAotCW12dHN5cwlmMCwgcjEwCi0JbXZ0c3lzCWYzLCByMTAKLQltdnRzeXMJUywgcjEwCi0JbXZ0c3lzCVYsIHIxMAotCW12dHN5cwlWQSwgcjEwCi0JbXZ0c3lzCUMsIHIxMAotCi0Jbm9wCi0KLQlub3QJcjEscjIKLQotCW5vdGZnCWYxLGYyCi0KLQlvcglyMSxyMixyNAotCW9yCXIxLHIyLDB4MWEKLQlvcglyMSxyMiwweGRlYWRmMDBkCi0KLQlvcmZnCWYxLGYyLGY0Ci0Jb3JmZwlmNCxmMiwweDEKLQkKLQlyZWl0Ci0KLQlyZXBlYXQJcjEscjIKLQlyZXBlYXQJcjQsMHhkZWFkCi0JcmVwZWF0CXI0LDB4ZGVhZGYwMGQKLQotCXJlcGVhdGkJMHhhLHIxCi0JcmVwZWF0aQkweGEsMHgxMDAxCi0KLQlub3AgfHwgbm9wCi0JCi0Jcm90CXIxLHIyLHI0Ci0Jcm90CXIxLHIyLDB4YQotCi0Jcm90MmgJcjEscjIscjQKLQlyb3QyaAlyMSxyMiwweGEKLQotCXNhdAlyMSxyMixyNAotCXNhdAlyMSxyMiwweGEKLQotCXNhdDJoCXIxLHIyLHI0Ci0Jc2F0MmgJcjEscjIsMHhhCi0KLQlzYXRobAlyMSxyMixyNAotCXNhdGhsCXIxLHIyLDB4YQotCi0Jc2F0aGgJcjEscjIscjQKLQlzYXRoaAlyMSxyMiwweGEKLQkJCi0Jc2F0eglyMSxyMixyNAotCXNhdHoJcjEscjIsMHhhCi0KLQlzYXR6MmgJcjEscjIscjQKLQlzYXR6MmgJcjEscjIsMHhhCi0JCQkKLQlzcmEJcjEscjIscjQKLQlzcmEJcjEscjIsMHhhCi0KLQlzcmEyaAlyMSxyMixyNAotCXNyYTJoCXIxLHIyLDB4YQotCi0Jc3JjCXIxLHIyLHI0Ci0Jc3JjCXIxLHIyLDB4YQotCQotCXNybAlyMSxyMixyNAotCXNybAlyMSxyMiwweGEKLQotCXNybDJoCXIxLHIyLHI0Ci0Jc3JsMmgJcjEscjIsMHhhCi0KLQkKLQlzdDJoCXI2LEAocjcscjgpCi0Jc3QyaAlyNixAKHI3KyxyOCkKLQlzdDJoCXI2LEAocjctLHI4KQotCXN0MmgJcjYsQChyNywweDFhKQotCXN0MmgJcjYsQChyNywweDEyMzQpCi0JCQotCXN0MncJcjYsQChyNyxyOCkKLQlzdDJ3CXI2LEAocjcrLHI4KQotCXN0MncJcjYsQChyNy0scjgpCi0Jc3QydwlyNixAKHI3LDB4MWEpCi0Jc3QydwlyNixAKHI3LDB4MTIzNCkKLQotCXN0NGhiCXI2LEAocjcscjgpCi0Jc3Q0aGIJcjYsQChyNysscjgpCi0Jc3Q0aGIJcjYsQChyNy0scjgpCi0Jc3Q0aGIJcjYsQChyNywweDFhKQotCXN0NGhiCXI2LEAocjcsMHgxMjM0KQotCi0Jc3RiCXI2LEAocjcscjgpCi0Jc3RiCXI2LEAocjcrLHI4KQotCXN0YglyNixAKHI3LSxyOCkKLQlzdGIJcjYsQChyNywweDFhKQotCXN0YglyNixAKHI3LDB4MTIzNCkKLQotCXN0aAlyNixAKHI3LHI4KQotCXN0aAlyNixAKHI3KyxyOCkKLQlzdGgJcjYsQChyNy0scjgpCi0Jc3RoCXI2LEAocjcsMHgxYSkKLQlzdGgJcjYsQChyNywweDEyMzQpCi0KLQlzdGhoCXI2LEAocjcscjgpCi0Jc3RoaAlyNixAKHI3KyxyOCkKLQlzdGhoCXI2LEAocjctLHI4KQotCXN0aGgJcjYsQChyNywweDFhKQotCXN0aGgJcjYsQChyNywweDEyMzQpCi0KLQlzdHcJcjYsQChyNyxyOCkKLQlzdHcJcjYsQChyNysscjgpCi0Jc3R3CXI2LEAocjctLHI4KQotCXN0dwlyNixAKHI3LDB4MWEpCi0Jc3R3CXI2LEAocjcsMHgxMjM0KQotCQkJCQkJCQkKLQlzdWIJcjEscjIscjMKLQlzdWIJcjUwLHI1MSwweDFhCi0Jc3ViCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViMmgJcjEscjIscjMKLQlzdWIyaAlyNTAscjUxLDB4MWEKLQlzdWIyaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmIJcjEscjIscjMKLQlzdWJiCXI1MCxyNTEsMHgxYQotCXN1YmIJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGxsCXIxLHIyLHIzCi0Jc3ViaGxsbAlyNTAscjUxLDB4MWEKLQlzdWJobGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGxsaAlyMSxyMixyMwotCXN1YmhsbGgJcjUwLHI1MSwweDFhCi0Jc3ViaGxsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhsaGwJcjEscjIscjMKLQlzdWJobGhsCXI1MCxyNTEsMHgxYQotCXN1YmhsaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJobGhoCXIxLHIyLHIzCi0Jc3ViaGxoaAlyNTAscjUxLDB4MWEKLQlzdWJobGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQkKLQlzdWJoaGxsCXIxLHIyLHIzCi0Jc3ViaGhsbAlyNTAscjUxLDB4MWEKLQlzdWJoaGxsCXI1MCxyNTEsMHhkZWFkYmVlZgotCi0Jc3ViaGhsaAlyMSxyMixyMwotCXN1YmhobGgJcjUwLHI1MSwweDFhCi0Jc3ViaGhsaAlyNTAscjUxLDB4ZGVhZGJlZWYKLQotCXN1YmhoaGwJcjEscjIscjMKLQlzdWJoaGhsCXI1MCxyNTEsMHgxYQotCXN1YmhoaGwJcjUwLHI1MSwweGRlYWRiZWVmCi0KLQlzdWJoaGhoCXIxLHIyLHIzCi0Jc3ViaGhoaAlyNTAscjUxLDB4MWEKLQlzdWJoaGhoCXI1MCxyNTEsMHhkZWFkYmVlZgotCQotCXRyYXAJcjEKLQl0cmFwCTB4YQotCi0JeG9yCXIxLHIyLHI0Ci0JeG9yCXIxLHIyLDB4YQotCXhvcglyMSxyMiwweGRlYWRmMDBkCi0KLQl4b3JmZwlmMSxmMixmNAotCXhvcmZnCWYxLGY0LDB4YQotCi0jIFZMSVcgc3ludGF4IHRlc3QKLQlub3AKLQlub3AKLQlub3AJLT4Jbm9wCi0Jbm9wCXx8CW5vcAotCW5vcAk8LQlub3AKLQotIyB0cnkgY2hhbmdpbmcgc2VjdGlvbnMKLQlub3QJcjEscjIKLQkuc2VjdGlvbiAuZm9vCi0JYWRkCXIxMCxyMTIsNgotCS50ZXh0Ci0Jbm90CXIyLHIzCi0Jbm9wCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI5ZjgxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcuZAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSNvYmpkdW1wOiAtbGRyCi0jbmFtZTogRDMwViBkZWJ1ZyAoLWcpIHRlc3QKLSNhczogLWcKLQotLio6ICtmaWxlIGZvcm1hdCBlbGYzMi1kMzB2Ci0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDxfYWJjLTB4MTg+OgotLipsYWJlbC1kZWJ1Zy5zOjQKLSAgIDA6CTEwMDgwMDAzIDAwZjAwMDAwIAlicmEuc1wvdHgJMTgJXCgxOCA8X2FiYz5cKQlcfFx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczo1Ci0gICA4OgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gIDEwOgkwZTAwMDAwNCAwMGYwMDAwMCAJLmxvbmcJMHhlMDAwMDA0CXx8CW5vcAkKLQotMDAwMDAwMTggPF9hYmM+OgotLipsYWJlbC1kZWJ1Zy5zOjgKLSAgMTg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczo5Ci0gIDIwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0uKmxhYmVsLWRlYnVnLnM6MTAKLSAgMjg6CTAwZjAwMDAwIDAwZjAwMDAwIAlub3AJCXx8CW5vcAkKLS4qbGFiZWwtZGVidWcuczoxMQotICAzMDoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9sYWJlbC1kZWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjQwYWE0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwtZGVidWcucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMgbGFiZWxzIHNob3VsZCBiZSBhbGlnbmVkIG9uIDgtYnl0ZSBib3VuZHJpZXMKLQkKLQkudGV4dAotCWJyYS5zL3R4IF9hYmMgICB8fCBub3AgCi0Jbm9wICAgICB8fCBub3AgCi0JLndvcmQgMHgwZTAwMDAwNAotX2FiYzoKLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjZmNkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBsYWJlbCBhbGlnbm1lbnQgdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPF9hYmMtMHgxOD46Ci0gICAwOgkxMDA4MDAwMyAwMGYwMDAwMCAJYnJhLnMvdHgJMTgJKDE4IDxfYWJjPikJfHwJbm9wCQotICAgODoJMDBmMDAwMDAgMDBmMDAwMDAgCW5vcAkJfHwJbm9wCQotICAxMDoJMGUwMDAwMDQgMDBmMDAwMDAgCS5sb25nCTB4ZTAwMDAwNAl8fAlub3AJCi0KLTAwMDAwMDE4IDxfYWJjPjoKLSAgMTg6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKLSAgMjA6CTAwZjAwMDAwIDgwZjAwMDAwIAlub3AJCS0+CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvbGFiZWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0MGFhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L2xhYmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0jIGxhYmVscyBzaG91bGQgYmUgYWxpZ25lZCBvbiA4LWJ5dGUgYm91bmRyaWVzCi0JCi0JLnRleHQKLQlicmEucy90eCBfYWJjICAgfHwgbm9wIAotCW5vcCAgICAgfHwgbm9wIAotCS53b3JkIDB4MGUwMDAwMDQKLV9hYmM6Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMGE1NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcgotI25hbWU6IEQzMFYgYWxpZ25tZW50IHRlc3QKLSNhczogLVdPCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItZDMwdgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJOGExMDUxODcgMGExMDIwYzQgCW11bHgyaAlyNSwgcjYsIHI3CTwtCW11bHgyaAlyMiwgcjMsIHI0Ci0gICA4OgkwMGYwMDAwMCAwYTEwODI0YSAJbm9wCQl8fAltdWx4MmgJcjgsIHI5LCByMTAKLSAgMTA6CTAwZjAwMDAwIDBhMTBiMzBkIAlub3AJCXx8CW11bHgyaAlyMTEsIHIxMiwgcjEzCi0gIDE4Ogk4YTExMTQ5MyAwYTEwZTNkMCAJbXVseDJoCXIxNywgcjE4LCByMTkJPC0JbXVseDJoCXIxNCwgcjE1LCByMTYKLSAgMjA6CThhMTE3NjE5IDBhMTE0NTU2IAltdWx4MmgJcjIzLCByMjQsIHIyNQk8LQltdWx4MmgJcjIwLCByMjEsIHIyMgotICAyODoJOGIwMWQ3OWYgMGExMWE2ZGMgCW11bAlyMjksIHIzMCwgcjMxCTwtCW11bHgyaAlyMjYsIHIyNywgcjI4Ci0gIDMwOgk4YjAwNTE4NyAwYjAwMjBjNCAJbXVsCXI1LCByNiwgcjcJPC0JbXVsCXIyLCByMywgcjQKLSAgMzg6CThhMTBiMzBkIDBhMTA4MjRhIAltdWx4MmgJcjExLCByMTIsIHIxMwk8LQltdWx4MmgJcjgsIHI5LCByMTAKLSAgNDA6CTgwZjAwMDAwIDBiMDBlM2QwIAlub3AJCTwtCW11bAlyMTQsIHIxNSwgcjE2Ci0gIDQ4OgkwMGYwMDAwMCAwYTExMTQ5MyAJbm9wCQl8fAltdWx4MmgJcjE3LCByMTgsIHIxOQotICA1MDoJOGIwMTc2MTkgMGExMTQ1NTYgCW11bAlyMjMsIHIyNCwgcjI1CTwtCW11bHgyaAlyMjAsIHIyMSwgcjIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9tdWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2Nzg1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L211bC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyAgT25lIG9mIHRoZSBydWxlIG9uIHJlc3RyaWN0ZWQgc2VxdWVuY2UgaXMgY29uc2VjdXRpdmUgSVUgaW5zdHJ1Y3Rpb24gCi0jICAgICAgIElVOiBNVUwsIE1BQywgTUFDUywgTVNVQiwgTVNVQlMgIChhKSAgICAKLSMgICAgICAgSVU6IE1VTEhYcHAsIE1VTFgySCwgTVVMMkggICAgICAoYikKLSMgVGhpcyBtZWFucyB0aGF0IGluc3RydWN0aW9ucyBpbiBncm91cCAoYSkgYW5kIGluIChiKSBzaG91bGQgbm90IGJlIGV4ZWN1dGVkCi0jIGluIElVIGluIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiB0aGUgb3JkZXIgKGEpLT4oYikuIEl0IGRvZXMgbmVpdGhlciBwcm9oaWJpdAotIyBleGVjdXRpb25zIGluIHRoZSByZXZlcnNlIG9yZGVyIChiKS0+IChhKSBub3IgY29uc2VjdXRpdmUgZXhlY3V0aW9uIG9mCi0jIGdyb3VwIChhKS0+KGEpIG9yIChiKS0+KGIpCi0KLQltdWx4MmggcjUscjYscjcJCTwtCW11bHgyaCByMixyMyxyNAotCW5vcAl8fAltdWx4MmggcjgscjkscjEwCi0Jbm9wCXx8CW11bHgyaCByMTEscjEyLHIxMyAgICAgICAKLQltdWx4MmggcjE0LHIxNSxyMTYKLQltdWx4MmggcjE3LHIxOCxyMTkgICAgICAKLQltdWx4MmggcjIzLHIyNCxyMjUgICAgIDwtCW11bHgyaCByMjAscjIxLHIyMgotCW11bCAgICByMjkscjMwLHIzMSAgICAgPC0JbXVseDJoIHIyNixyMjcscjI4Ci0JbXVsICAgIHI1LCByNiwgcjcgICAgICA8LQltdWwgcjIsIHIzLCByNAotCW11bHgyaCByMTEsIHIxMiwgcjEzICAgPC0JbXVseDJoIHI4LCByOSwgcjEwCi0JbXVseDJoIHIxNywgcjE4LCByMTkgICA8LQltdWwgcjE0LCByMTUsIHIxNgotCW11bCAgICByMjMsIHIyNCwgcjI1ICAgPC0JbXVseDJoIHIyMCwgcjIxLCByMjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJmYTljLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvb3B0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jb2JqZHVtcDogLWRyCi0jbmFtZTogRDMwViBvcHRpbWl6YXRpb24gdGVzdAotI2FzOiAtTwotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgIDA6CTA4ODAxMDgwIDA4ODAzMTAwIAlhYnMJcjEsIHIyCXx8CWFicwlyMywgcjQKLSAgIDg6CTAyOTAwMTAwIDAyOTAxMDgwIAlub3RmZwlmMCwgcwl8fAlub3RmZwlmMSwgZjIKLSAgMTA6CTA4ODAxMDgwIDAyOTAxMDgwIAlhYnMJcjEsIHIyCXx8CW5vdGZnCWYxLCBmMgotICAxODoJMDgwMDEwODMgODI5MDcwMDAgCWFkZC5zCXIxLCByMiwgcjMJLT4Jbm90ZmcJYywgZjAKLSAgMjA6CTA4MDAxMDgzIDgyOTAwMWMwIAlhZGQucwlyMSwgcjIsIHIzCS0+CW5vdGZnCWYwLCBjCi0gIDI4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDI4IDxzdGFydFwrMHgyOD5cKQl8fAlub3AJCi0gIDMwOgkwODgwMTA4MCA4ODgwMTA4MCAJYWJzCXIxLCByMgktPglhYnMJcjEsIHIyCi0gIDM4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDM4IDxzdGFydFwrMHgzOD5cKQl8fAlub3AJCi0gIDQwOgkwMDJiZmZmZiAwMGYwMDAwMCAJYnNyLnMJLTgJXCgzOCA8c3RhcnRcKzB4Mzg+XCkJfHwJbm9wCQotICA0ODoJMDg4MDEwODAgODg4MDEwODAgCWFicwlyMSwgcjIJLT4JYWJzCXIxLCByMgotICA1MDoJMDAyODAwMDAgMDg4MDEwODAgCWJzci5zCTAJXCg1MCA8c3RhcnRcKzB4NTA+XCkJfHwJYWJzCXIxLCByMgotICA1ODoJMDQwMDEwODMgODUwMDcyMDkgCWxkYi5zCXIxLCBAXChyMiwgcjNcKQktPglzdGIucwlyNywgQFwocjgsIHI5XCkKLSAgNjA6CTA1MDA3MjA5IDg0MDAxMDgzIAlzdGIucwlyNywgQFwocjgsIHI5XCkJLT4JbGRiLnMJcjEsIEBcKHIyLCByM1wpCi0gIDY4OgkwNDAwNzIwOSA4NDAwMTA4MyAJbGRiLnMJcjcsIEBcKHI4LCByOVwpCS0+CWxkYi5zCXIxLCBAXChyMiwgcjNcKQotICA3MDoJMDUwMDcyMDkgODUwMDEwODMgCXN0Yi5zCXI3LCBAXChyOCwgcjlcKQktPglzdGIucwlyMSwgQFwocjIsIHIzXCkKLSAgNzg6CTA4MDAzMGM2IDg1NDgyMGMwIAlhZGQucwlyMywgcjMsIHI2CS0+CXN0dy5zCXIyLCBAXChyMywgMHgwXCkKLSAgODA6CTAyYzI4MTA1IDkwMTgwMDAwIAljbXBsZS5zCWYwLCByNCwgcjUJLT4Jam1wLnMvdHgJMCA8c3RhcnQ+Ci0gIDg4OgkwMmMyODEwNSBhMDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL2Z4CTAgPHN0YXJ0PgotICA5MDoJMzAxODAwMDAgMDJjMjgxMDUgCWptcC5zL3h0CTAgPHN0YXJ0Pgl8fAljbXBsZS5zCWYwLCByNCwgcjUKLSAgOTg6CTQwMTgwMDAwIDAyYzI4MTA1IAlqbXAucy94ZgkwIDxzdGFydD4JfHwJY21wbGUucwlmMCwgcjQsIHI1Ci0gIGEwOgkwMmMyODEwNSBkMDE4MDAwMCAJY21wbGUucwlmMCwgcjQsIHI1CS0+CWptcC5zL3R0CTAgPHN0YXJ0PgotICBhODoJMDJjMjgxMDUgZTAxODAwMDAgCWNtcGxlLnMJZjAsIHI0LCByNQktPglqbXAucy90ZgkwIDxzdGFydD4KLSAgYjA6CTEwMTgwMDAwIDAyYzI5MTA1IAlqbXAucy90eAkwIDxzdGFydD4JfHwJY21wbGUucwlmMSwgcjQsIHI1Ci0gIGI4OgkwMmMyOTEwNSBiMDE4MDAwMCAJY21wbGUucwlmMSwgcjQsIHI1CS0+CWptcC5zL3h0CTAgPHN0YXJ0PgotICBjMDoJMDgwODQwMDEgODJjMjgxMDUgCWFkZC5zCXI0LCByMCwgMHgxCS0+CWNtcGxlLnMJZjAsIHI0LCByNQotICBjODoJMDgwODQwMDEgMDJjMjgwYzUgCWFkZC5zCXI0LCByMCwgMHgxCXx8CWNtcGxlLnMJZjAsIHIzLCByNQotICBkMDoJMDQ2MDQwMDYgODg2MDU0ZDQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJLT4JYWRkcy5zCXI1LCByMTksIHIyMAotICBkODoJMDQ2MDQwMDYgODg2MDMxNTQgCWxkMncucwlyNCwgQFwocjAsIHI2XCkJLT4JYWRkcy5zCXIzLCByNSwgcjIwCi0gIGUwOgkwNDYwNDAwNiAwODYwNjRkNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjYsIHIxOSwgcjIwCi0gIGU4OgkwNDYwNDAwNiAwODYwNzRkNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjcsIHIxOSwgcjIwCi0gIGYwOgkwNDYwNDAwNiAwODYwNzAxNCAJbGQydy5zCXI0LCBAXChyMCwgcjZcKQl8fAlhZGRzLnMJcjcsIHIwLCByMjAKLSAgZjg6CTA1NjA0MDA2IDA4NjA1NGQ0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyNSwgcjE5LCByMjAKLSAxMDA6CTA1NjA0MDA2IDA4NjAzMTU0IAlzdDJ3LnMJcjQsIEBcKHIwLCByNlwpCXx8CWFkZHMucwlyMywgcjUsIHIyMAotIDEwODoJMDU2MDQwMDYgMDg2MDY0ZDQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI2LCByMTksIHIyMAotIDExMDoJMDU2MDQwMDYgMDg2MDc0ZDQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMTksIHIyMAotIDExODoJMDU2MDQwMDYgMDg2MDcwMTQgCXN0MncucwlyNCwgQFwocjAsIHI2XCkJfHwJYWRkcy5zCXI3LCByMCwgcjIwCi0gMTIwOgkwNTYwYTBjNCA4NTYyOGFlYyAJc3Qydy5zCXIxMCwgQFwocjMsIHI0XCkJLT4Jc3Qydy5zCXI0MCwgQFwocjQzLCByNDRcKQotIDEyODoJMDU0MDEwODMgODQ0MjlhYWIgCXN0dy5zCXIxLCBAXChyMiwgcjNcKQktPglsZHcucwlyNDEsIEBcKHI0MiwgcjQzXCkKLSAxMzA6CTA0NDAxMDgzIDg0MDI5YWFiIAlsZHcucwlyMSwgQFwocjIsIHIzXCkJLT4JbGRiLnMJcjQxLCBAXChyNDIsIHI0M1wpCi0gMTM4OgkwNDQ0NDE4YiA4ODY4OTE4MiAJbGR3LnMJcjQsIEBcKHI2XCssIHIxMVwpCS0+CWFkZHMucwlyOSwgcjYsIDB4MgotIDE0MDoJMDQ0YzQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNi0sIHIxMVwpCXx8CWFkZHMucwlyOSwgcjYsIDB4MgotIDE0ODoJMDU0YzQxOGIgODg2ODkxODIgCXN0dy5zCXI0LCBAXChyNi0sIHIxMVwpCS0+CWFkZHMucwlyOSwgcjYsIDB4MgotIDE1MDoJMDQ0MDQxOGIgMDg2ODkxODIgCWxkdy5zCXI0LCBAXChyNiwgcjExXCkJfHwJYWRkcy5zCXI5LCByNiwgMHgyCi0gMTU4OgkwNDQwNDE4YiAwODY4OTE4MiAJbGR3LnMJcjQsIEBcKHI2LCByMTFcKQl8fAlhZGRzLnMJcjksIHI2LCAweDIKLSAxNjA6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotIDE2ODoJMDAzODAwMDAgMDg4MDEwODAgCWpzci5zCTAgPHN0YXJ0Pgl8fAlhYnMJcjEsIHIyCi0gMTcwOgkwODgwMTA4MCAwMGYwMDAwMCAJYWJzCXIxLCByMgl8fAlub3AJCi0gMTc4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDE3OCA8c3RhcnRcKzB4MTc4PlwpCXx8CW5vcAkKLSAxODA6CTAwMjgwMDAwIDA4ODAxMDgwIAlic3IucwkwCVwoMTgwIDxzdGFydFwrMHgxODA+XCkJfHwJYWJzCXIxLCByMgotIDE4ODoJMDg4MDEwODAgMDBmMDAwMDAgCWFicwlyMSwgcjIJfHwJbm9wCQotCi0wMDAwMDE5MCA8bGFiZWwxPjoKLSAxOTA6CTA1NjAyMDgzIDg5MDA0MTQ2IAlzdDJ3LnMJcjIsIEBcKHIyLCByM1wpCS0+CWFkZGhsbGwucwlyNCwgcjUsIHI2Ci0KLTAwMDAwMTk4IDxsYWJlbDI+OgotIDE5ODoJMDU1MDgyMDkgODk5MGEyY2MgCXN0NGhiLnMJcjgsIEBcKHI4LCByOVwpCS0+CXN1YmhsbGgucwlyMTAsIHIxMSwgcjEyCi0KLTAwMDAwMWEwIDxsYWJlbDM+OgotIDFhMDoJMDQ2MGUzOGYgOGE2MTA0NTIgCWxkMncucwlyMTQsIEBcKHIxNCwgcjE1XCkJLT4JbXVsaHhobAlyMTYsIHIxNywgcjE4Ci0KLTAwMDAwMWE4IDxsYWJlbDQ+OgotIDFhODoJMDQ0MTM1MTUgOGExMTY1ZDggCWxkdy5zCXIxOSwgQFwocjIwLCByMjFcKQktPgltdWx4MmgJcjIyLCByMjMsIHIyNAotCi0wMDAwMDFiMCA8bGFiZWw1PjoKLSAxYjA6CTA0MjE5NjliIDhhMDFjNzVlIAlsZGgucwlyMjUsIEBcKHIyNiwgcjI3XCkJLT4JbXVsMmgJcjI4LCByMjksIHIzMAotCi0wMDAwMDFiOCA8bGFiZWw2PjoKLSAxYjg6CTgwZjAwMDAwIDBiMDAxMDgzIAlub3AJCTwtCW11bAlyMSwgcjIsIHIzCi0gMWMwOgkwODAwNzIwOSAwYTQwNDE0NiAJYWRkLnMJcjcsIHI4LCByOQl8fAltdWxoeGxsCXI0LCByNSwgcjYKLQotMDAwMDAxYzggPGxhYmVsNz46Ci0gMWM4OgkwNDQwNTE4MCAwYjAwMjBjNCAJbGR3LnMJcjUsIEBcKHI2LCByMFwpCXx8CW11bAlyMiwgcjMsIHI0Ci0gMWQwOgk4MGYwMDAwMCAwYjAwNzIwOSAJbm9wCQk8LQltdWwJcjcsIHI4LCByOQotIDFkODoJMDQ0MGEyYzAgMDBmMDAwMDAgCWxkdy5zCXIxMCwgQFwocjExLCByMFwpCXx8CW5vcAkKLSAxZTA6CTgwZjAwMDAwIDBiMDBjMzRlIAlub3AJCTwtCW11bAlyMTIsIHIxMywgcjE0Ci0gMWU4OgkwNDQwZjQwMCAwYjQ0MjBjNCAJbGR3LnMJcjE1LCBAXChyMTYsIHIwXCkJfHwJbWFjMQlyMiwgcjMsIHI0Ci0gMWYwOgkwMGYwMDAwMCAwMGYwMDAwMCAJbm9wCQl8fAlub3AJCi0gMWY4OgkwNDQwNTE4MCAwMGYwMDAwMCAJbGR3LnMJcjUsIEBcKHI2LCByMFwpCXx8CW5vcAkKLSAyMDA6CTgwZjAwMDAwIDBiNDA3MjA5IAlub3AJCTwtCW1hYzAJcjcsIHI4LCByOQotIDIwODoJMDQ0MGEyYzAgODQ0MGEyYzAgCWxkdy5zCXIxMCwgQFwocjExLCByMFwpCS0+CWxkdy5zCXIxMCwgQFwocjExLCByMFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9vcHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczMzMwMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L29wdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLSMgRDMwViBwYXJhbGxlbCBvcHRpbWl6YXRpb24gdGVzdAotIyBhc3NlbWJsZSB3aXRoICItTyIKLQkKLQkudGV4dAotc3RhcnQ6CQotCWFicwlyMSxyMgotCWFicwlyMyxyNAotCi0Jbm90ZmcJZjAsZjQKLQlub3RmZwlmMSxmMgotCQkKLQlhYnMJcjEscjIKLQlub3RmZwlmMSxmMgotCi0jIGJvdGggY2hhbmdlIEMgZmxhZwotCWFkZAlyMSxyMixyMwotCW5vdGZnCUMsZjAKLQotIyBvbmUgdXNlcyBhbmQgb25lIGNoYW5nZXMgQyBmbGFnCQotCWFkZAlyMSxyMixyMwotCW5vdGZnCWYwLEMKLQotCWJyYQkuCi0JYWJzCXIxLHIyCi0KLQlhYnMJcjEscjIJCi0JYnJhCS4KLQotCWJzcgkuCi0JYWJzCXIxLHIyCi0JCi0JYWJzCXIxLHIyCQotCWFicwlyMSxyMgkKLQlic3IJLgotCQotCWxkYglyMSxAKHIyLHIzKQotCXN0YglyNyxAKHI4LHI5KQotCi0Jc3RiCXI3LEAocjgscjkpCQotCWxkYglyMSxAKHIyLHIzKQotCi0JbGRiCXI3LEAocjgscjkpCQotCWxkYglyMSxAKHIyLHIzKQotCi0Jc3RiCXI3LEAocjgscjkpCQotCXN0YglyMSxAKHIyLHIzKQotCi0JYWRkICAgICByMywgcjMsIHI2Ci0Jc3R3ICAgICByMiwgQChyMywgMCkKLQkJCQotIyBzaG91bGQgYmUgc2VyaWFsIGJlY2F1c2Ugb2YgY29uZGl0aW9uYWwgZXhlY3V0aW9uCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3R4ICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC9meCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAveHQgIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjAscjQscjUKLSAgICAgICAgam1wL3hmICAweDAKLQotICAgICAgICBjbXBsZSAgIGYwLHI0LHI1Ci0gICAgICAgIGptcC90dCAgMHgwCi0KLSAgICAgICAgY21wbGUgICBmMCxyNCxyNQotICAgICAgICBqbXAvdGYgIDB4MAotCQkJCQkKLSAgICAgICAgY21wbGUgICBmMSxyNCxyNQotICAgICAgICBqbXAvdHggIDB4MAotCi0gICAgICAgIGNtcGxlICAgZjEscjQscjUKLSAgICAgICAgam1wL3h0ICAweDAKLQotCSMgc2VyaWFsIGJlY2F1c2Ugb2YgdGhlIHI0IGRlcGVuZGVuY3kKLQlhZGQJcjQsIHIwLCAxCi0JY21wbGUJZjAsIHI0LCByNQotCi0JIyBwYXJhbGxlbAotCWFkZAlyNCwgcjAsIDEKLQljbXBsZQlmMCwgcjMsIHI1Ci0KLQkjIHNlcmlhbCBiZWNhdXNlIGxkMncgbG9hZHMgcjUKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNSxyMTkscjIwCi0KLQkjIHNlcmlhbCBiZWNhdXNlIGxkMncgbG9hZHMgcjUKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyMyxyNSxyMjAKLQotCSMgcGFyYWxsZWwgZXZlbiB0aG91Z2ggbGQydyB1c2VzIHI2IGFuZCBhZGRzIGNoYW5nZXMgaXQKLQlsZDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNixyMTkscjIwCi0KLQkjIHBhcmFsbGVsCi0JbGQydwlyNCxAKHIwLHI2KQotCWFkZHMJcjcscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCWxkMncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIwLHIyMAotCi0JIyBwYXJhbGxlbCBldmVuIHRob3VnaCBzdDJ3IHVzZXMgcjUgYW5kIGFkZHMgbW9kaWZpZXMgaXQKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNSxyMTkscjIwCi0KLQkjIHBhcmFsbGVsLCBib3RoIHVzZSBidXQgZG9uJ3QgbW9kaWZ5IHI1Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjMscjUscjIwCi0KLQkjIHBhcmFsbGVsIGV2ZW4gdGhvdWdoIHN0MncgdXNlcyByNiBhbmQgYWRkcyBjaGFuZ2VzIGl0Ci0Jc3QydwlyNCxAKHIwLHI2KQotCWFkZHMJcjYscjE5LHIyMAotCi0JIyBwYXJhbGxlbAotCXN0MncJcjQsQChyMCxyNikKLQlhZGRzCXI3LHIxOSxyMjAKLQotCSMgcGFyYWxsZWwKLQlzdDJ3CXI0LEAocjAscjYpCi0JYWRkcwlyNyxyMCxyMjAKLQkJCQkJCQotIyB0ZXN0IG1lbW9yeSBkZXBlbmRlbmNpZXMKLQotCSMgYWx3YXlzIHNlcmlhbCBiZWNhdXNlIG9uZSBjb3VsZCBvdmVyd3JpdGUgdGhlIG90aGVyCi0Jc3QydwlyMTAsQChyMyxyNCkKLQlzdDJ3CXI0MCxAKHI0MyxyNDQpCi0KLQkjIGFsd2F5cyBzZXJpYWwKLQlzdHcJcjEsQChyMixyMykKLQlsZHcJcjQxLEAocjQyLHI0MykJCQkKLQotCSMgcmVhZHMgY2FuIGhhcHBlbiBpbiBwYXJhbGxlbCBidXQgdGhlIGN1cnJlbnQgYXJjaGl0ZWN0dXJlIAotCSMgZG9lc24ndCBzdXBwb3J0IGl0Ci0JbGR3CXIxLEAocjIscjMpCi0JbGRiCXI0MSxAKHI0MixyNDMpCQkJCi0KLSMgdGVzdCBwb3N0IGluY3JlbWVudCBhbmQgZGVjcmVtZW50IGRlcGVuZGVuY2llcwotCi0JIyBzZXJpYWwKLQlsZHcJcjQsQChyNisscjExKQotCWFkZHMJcjkscjYsMgotCi0JIyBwYXJhbGxlbCwgbW9kaWZpY2F0aW9uIHRvIHI2IGhhcHBlbnMgbGFzdAotCWFkZHMJcjkscjYsMgkKLQlsZHcJcjQsQChyNi0scjExKQotCi0JIyBzZXJpYWwKLQlzdHcJcjQsQChyNi0scjExKQotCWFkZHMJcjkscjYsMgotCQotCSMgcGFyYWxsZWwKLQlsZHcJcjQsQChyNixyMTEpCi0JYWRkcwlyOSxyNiwyCi0KLQkjIHBhcmFsbGVsCi0JYWRkcwlyOSxyNiwyCQotCWxkdwlyNCxAKHI2LHIxMSkKLQkKLSMgaWYgdGhlIGZpcnN0IGluc3RydWN0aW9uIGlzIGEgam1wLCBkb24ndCBwYXJhbGxlbGl6ZQotCWptcAkwCi0JYWJzCXIxLHIyCQotCi0JanNyCTAKLQlhYnMJcjEscjIJCi0KLQkuYWxpZ24JMwotCQotCWJyYQkwCi0JYWJzCXIxLHIyCQotCQotCWJzcgkwCi0JYWJzCXIxLHIyCQotCi0jIEV4cGxpY2l0bHkgcHJvaGliaXRlZCBmcm9tIHBhcmFsbGVsIGV4ZWN1dGlvbi4KLSMgVGhlIGxhYmVscyBhcmUgaGVyZSB0byBwcmV2ZW50IGluc3RydWN0aW9uIHBhaXJzCi0jICBmcm9tIGJlaW5nIG1lcmdlZCB3aXRoIGZvbGxvd2luZyBwYWlycy4KLQkKLWxhYmVsMToJCi0Jc3QydyAgICAgcjIsIEAocjIsIHIzKQotCWFkZGhsbGwgIHI0LCByNSwgcjYKLWxhYmVsMjoKLQlzdDRoYiAgICByOCwgQChyOCwgcjkpCi0Jc3ViaGxsaCAgcjEwLCByMTEsIHIxMgotbGFiZWwzOgotCWxkMncgICAgIHIxNCwgQChyMTQsIHIxNSkKLQltdWxoeGhsICByMTYsIHIxNywgcjE4Ci1sYWJlbDQ6Ci0JbGR3ICAgICAgcjE5LCBAKHIyMCwgcjIxKQotCW11bHgyaCAgIHIyMiwgcjIzLCByMjQKLWxhYmVsNToKLQlsZGggICAgICByMjUsIEAocjI2LCByMjcpCi0JbXVsMmggICAgcjI4LCByMjksIHIzMAotCi0jIEluc2VydGlvbiBvZiBOT1BzIHJlcXVpcmVkIHRvIHByZXZlbnQgcGlwZWxpbmUgY2xhc2hlcy4KLQotbGFiZWw2OgotCW11bCByMSxyMixyMwotCW11bGh4bGwgcjQscjUscjYKLSAgICAgICAgYWRkIHI3LCByOCwgcjkKLWxhYmVsNzoKLQkKLSAgICAgICAgbXVsICByMixyMyxyNAotICAgICAgICBsZHcgIHI1LCBAKHI2LHIwKQotIAotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSA8LSBtdWwgcjcscjgscjkKLQkKLSAgICAgICAgbXVsICByMTIscjEzLHIxNCAtPiBsZHcgcjE1LCBAKHIxNiwgcjApCi0KLSAgICAgICAgbWFjMSByMixyMyxyNAotICAgICAgICBsZHcgIHI1LCBAKHI2LHIwKQotIAotICAgICAgICBsZHcgIHIxMCwgQChyMTEsIHIwKSA8LSBtYWMwIHI3LHI4LHI5Ci0gICAgICAgIGxkdyAgcjEwLCBAKHIxMSwgcjApIAotCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9yZWxvYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGUyNzgwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MuZAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBEMzBWIHJlbG9jYXRpb24gdGVzdAotI2FzOgotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLWQzMHYKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPHN0YXJ0PjoKLSAgICAgICAwOgk4ODA4MjAwMCA4MDAwMDAyOCAJYWRkLmwJcjIsIHIwLCAweDI4Ci0JCQkwOiBSX0QzMFZfMzIJLnRleHQKLSAgICAgICA4Ogk4ODA4NDAwMCA4MDAwMDAwMCAJYWRkLmwJcjQsIHIwLCAweDAKLQkJCTg6IFJfRDMwVl8zMgkuZGF0YQotICAgICAgMTA6CTg4MDg0MDAwIDgwMDAwMDA2IAlhZGQubAlyNCwgcjAsIDB4NgotCQkJMTA6IFJfRDMwVl8zMgkuZGF0YQotICAgICAgMTg6CTg4MDg0MDAwIDgwMDAwMDAwIAlhZGQubAlyNCwgcjAsIDB4MAotCQkJMTg6IFJfRDMwVl8zMgl1bmsKLSAgICAgIDIwOgk4MDA4MDAwMCA4MDAwMDAxOCAJYnJhLmwJMTgJXCgzOCA8Y29udD5cKQotCi0wMDAwMDAyOCA8aGVsbG8+OgotICAgICAgMjg6CTQ4NjU2YzZjIDZmMjA1NzZmIAkubG9uZwkweDQ4NjU2YzZjCXx8CS5sb25nCTB4NmYyMDU3NmYKLSAgICAgIDMwOgk3MjZjNjQwYSAwMGYwMDAwMCAJLmxvbmcJMHg3MjZjNjQwYQl8fAlub3AJCi0KLTAwMDAwMDM4IDxjb250PjoKLSAgICAgIDM4Ogk4MDE4MDAwMCA4MDAwMDA0OCAJam1wLmwJNDggPGNvbnQyPgotCQkJMzg6IFJfRDMwVl8zMgkudGV4dAotICAgICAgNDA6CTA4ODAyMGMwIDAwZjAwMDAwIAlhYnMJcjIsIHIzCXx8CW5vcAkKLQotMDAwMDAwNDggPGNvbnQyPjoKLSAgICAgIDQ4OgkwMDBiZmZmNyAwMGYwMDAwMCAJYnJhLnMJLTQ4CVwoMCA8c3RhcnQ+XCkJfHwJbm9wCQotICAgICAgNTA6CTAwMDgwMjA1IDAwZjAwMDAwIAlicmEucwkxMDI4CVwoMTA3OCA8ZXhpdD5cKQl8fAlub3AJCi0gICAgICA1ODoJMDAxODAwMDAgMDBmMDAwMDAgCWptcC5zCTAgPHN0YXJ0Pgl8fAlub3AJCi0gICAgICA2MDoJMDA2YzFmZmIgMDBmMDAwMDAgCWJzcnRuei5zCXIxLCAtMjgJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA2ODoJMDA2YzFmZmEgMDBmMDAwMDAgCWJzcnRuei5zCXIxLCAtMzAJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA3MDoJMDA0YzFmZjkgMDBmMDAwMDAgCWJyYXRuei5zCXIxLCAtMzgJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA3ODoJMDA0YzFmZjggMDBmMDAwMDAgCWJyYXRuei5zCXIxLCAtNDAJXCgzOCA8Y29udD5cKQl8fAlub3AJCi0gICAgICA4MDoJMDA1YzEwMDcgMDBmMDAwMDAgCWptcHRuei5zCXIxLCAzOCA8Y29udD4JfHwJbm9wCQotCQkJODA6IFJfRDMwVl8xNQkudGV4dAotICAgICAgODg6CTAwNmMxMWYxIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgZjg4CVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAgIDkwOgkwMDVjMTAwMCAwMGYwMDAwMCAJam1wdG56LnMJcjEsIDAgPHN0YXJ0Pgl8fAlub3AJCi0JCQk5MDogUl9EMzBWXzE1CXVuawotICAgICAgOTg6CTAwNmMxMDAwIDAwZjAwMDAwIAlic3J0bnoucwlyMSwgMAlcKDk4IDxjb250MlwrMHg1MD5cKQl8fAlub3AJCi0JCQk5ODogUl9EMzBWXzE1X1BDUkVMCXVuawotICAgICAgYTA6CTgwNWMxMDAwIDgwMDAwMDAwIAlqbXB0bnoubAlyMSwgMCA8c3RhcnQ+Ci0JCQlhMDogUl9EMzBWXzMyCXVuawotICAgICAgYTg6CTgwNmMxMDAwIDgwMDAwMDAwIAlic3J0bnoubAlyMSwgMAlcKGE4IDxjb250MlwrMHg2MD5cKQotCQkJYTg6IFJfRDMwVl8zMl9QQ1JFTAl1bmsKLSAgICAgIGIwOgkwMDA4MDFlYyAwMGYwMDAwMCAJYnJhLnMJZjYwCVwoMTAxMCA8Zm9vPlwpCXx8CW5vcAkKLSAgICAgIGI4Ogk4MDA4MDAwMCA4MDAwMGY1OCAJYnJhLmwJZjU4CVwoMTAxMCA8Zm9vPlwpCi0gICAgICBjMDoJMDAwYmZmZTggMDBmMDAwMDAgCWJyYS5zCS1jMAlcKDAgPHN0YXJ0PlwpCXx8CW5vcAkKLSAgICAgIGM4Ogk4MDE4MDAwMCA4MDAwMDAwMCAJam1wLmwJMCA8c3RhcnQ+Ci0JCQljODogUl9EMzBWXzMyCS50ZXh0Ci0gICAgICBkMDoJODAxODAwMDAgODAwMDAwMDAgCWptcC5sCTAgPHN0YXJ0PgotCQkJZDA6IFJfRDMwVl8zMgkudGV4dAotICAgICAgZDg6CTAwMTgwMDAwIDAwZjAwMDAwIAlqbXAucwkwIDxzdGFydD4JfHwJbm9wCQotCQkJZDg6IFJfRDMwVl8yMQkudGV4dAotICAgICAgZTA6CTAwMTgwMjAyIDAwZjAwMDAwIAlqbXAucwkxMDEwIDxmb28+CXx8CW5vcAkKLQkJCWUwOiBSX0QzMFZfMjEJLnRleHQKLSAgICAgIGU4OgkwMDBiZmZlMyAwMGYwMDAwMCAJYnJhLnMJLWU4CVwoMCA8c3RhcnQ+XCkJfHwJbm9wCQotICAgICAgZjA6CTgwMDgwMDAwIDgwMDAwMDAwIAlicmEubAkwCVwoZjAgPGNvbnQyXCsweGE4PlwpCi0JCQlmMDogUl9EMzBWXzMyX1BDUkVMCXVua25vd24KLSAgICAgIGY4Ogk4MDE4MDAwMCA4MDAwMDAwMCAJam1wLmwJMCA8c3RhcnQ+Ci0JCQlmODogUl9EMzBWXzMyCXVua25vd24KLSAgICAgMTAwOgkwMDE4MDAwMCAwMGYwMDAwMCAJam1wLnMJMCA8c3RhcnQ+CXx8CW5vcAkKLQkJCTEwMDogUl9EMzBWXzIxCXVua25vd24KLSAgICAgMTA4OgkwMDA4MDAwMCAwMGYwMDAwMCAJYnJhLnMJMAlcKDEwOCA8Y29udDJcKzB4YzA+XCkJfHwJbm9wCQotCQkJMTA4OiBSX0QzMFZfMjFfUENSRUwJdW5rbm93bgotCS4uLgotCi0wMDAwMTAxMCA8Zm9vPjoKLSAgICAxMDEwOgkwODAwMTAwMCAwMGYwMDAwMCAJYWRkLnMJcjEsIHIwLCByMAl8fAlub3AJCi0gICAgMTAxODoJODQ2YmMwMDAgODAwMDEwNzAgCWxkMncubAlyNjAsIEBcKHIwLCAweDEwNzBcKQotCQkJMTAxODogUl9EMzBWXzMyCS50ZXh0Ci0gICAgMTAyMDoJMDgwM2UwMDAgODAyODAwMGIgCWFkZC5zCXI2MiwgcjAsIHIwCS0+CWJzci5zCTU4CVwoMTA3OCA8ZXhpdD5cKQotICAgIDEwMjg6CTAwMmJmZmZkIDAwZjAwMDAwIAlic3IucwktMTgJXCgxMDEwIDxmb28+XCkJfHwJbm9wCQotICAgIDEwMzA6CTAwMGJmZTAzIDAwZjAwMDAwIAlicmEucwktZmU4CVwoNDggPGNvbnQyPlwpCXx8CW5vcAkKLSAgICAxMDM4OgkwMDBiZmUwMiAwMGYwMDAwMCAJYnJhLnMJLWZmMAlcKDQ4IDxjb250Mj5cKQl8fAlub3AJCi0gICAgMTA0MDoJMDAyODAwMDcgMDBmMDAwMDAgCWJzci5zCTM4CVwoMTA3OCA8ZXhpdD5cKQl8fAlub3AJCi0gICAgMTA0ODoJMDAxODAyMGYgMDBmMDAwMDAgCWptcC5zCTEwNzggPGV4aXQ+CXx8CW5vcAkKLQkJCTEwNDg6IFJfRDMwVl8yMQkudGV4dAotICAgIDEwNTA6CTAwMTgwMjBmIDAwZjAwMDAwIAlqbXAucwkxMDc4IDxleGl0Pgl8fAlub3AJCi0JCQkxMDUwOiBSX0QzMFZfMjEJLnRleHQKLSAgICAxMDU4OgkwMDE4MDIwZiAwMGYwMDAwMCAJam1wLnMJMTA3OCA8ZXhpdD4JfHwJbm9wCQotCQkJMTA1ODogUl9EMzBWXzIxCS50ZXh0Ci0gICAgMTA2MDoJODAyODAwMDAgODAwMDAwMTggCWJzci5sCTE4CVwoMTA3OCA8ZXhpdD5cKQotICAgIDEwNjg6CTgwMTgwMDAwIDgwMDAxMDc4IAlqbXAubAkxMDc4IDxleGl0PgotCQkJMTA2ODogUl9EMzBWXzMyCS50ZXh0Ci0KLTAwMDAxMDcwIDxsb25nemVybz46Ci0JLi4uCi0KLTAwMDAxMDc4IDxleGl0PjoKLSAgICAxMDc4OgkwMDEwMDAzZSAwMGYwMDAwMCAJam1wLnMJcjYyCXx8CW5vcAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvcmVsb2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE5OWJmOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jIEQzMFYgcmVsb2NhdGlvbiB0ZXN0Ci0JCi0JLnRleHQKLXN0YXJ0OgotCWFkZAlyMiwgcjAsIGhlbGxvCi0JYWRkCXI0LCByMCwgYmFyCi0JYWRkCXI0LCByMCwgYmFyMgotCWFkZAlyNCwgcjAsIHVuawkKLQlicmEJY29udAotaGVsbG86CS5hc2NpaSAiSGVsbG8gV29ybGRcbiIKLQkuYWxpZ24gMwotY29udDoJam1wCWNvbnQyCi0JYWJzCXIyLHIzCi1jb250MjoKLQlicmEJc3RhcnQJfHwJbm9wCi0JYnJhLnMJZXhpdAotCWptcAkwCXx8CW5vcAotCWJzcnRuei5zCXIxLGNvbnQKLQlic3J0bnoJcjEsY29udAkKLQlicmF0bnoucwlyMSxjb250Ci0JYnJhdG56CXIxLGNvbnQKLQlqbXB0bnoucwlyMSxjb250CQkKLQlic3J0bnoucwlyMSwgZm9vCi0Jam1wdG56LnMJcjEsIHVuawkKLQlic3J0bnoucwlyMSwgdW5rCi0Jam1wdG56CXIxLCB1bmsJCi0JYnNydG56CXIxLCB1bmsKLQlicmEucwlmb28KLQlicmEJZm9vCQotCWJyYQlzdGFydAotCWptcAlzdGFydAotCWptcAlzdGFydAotCWptcC5zCXN0YXJ0Ci0Jam1wLnMJZm9vCi0JYnJhCXN0YXJ0Ci0JYnJhCXVua25vd24KLQlqbXAJdW5rbm93bgotCWptcC5zCXVua25vd24JCi0JYnJhLnMJdW5rbm93bgotCQotCS5kYXRhCi1iYXI6CS5hc2NpegkiWFlaWlkiCi1iYXIyOgkubG9uZwkweGRlYWRiZWVmCi0JCi0JLnRleHQKLQkuc3BhY2UgMHhGMDAsMAotCi1mb286Ci0JYWRkCXIxLHIwLHIwCi0JbGQydwlyNjAsIEAocjAsbG9uZ3plcm8pCi0JYWRkCXI2MixyMCxyMAotCWJzci5zCWV4aXQKLQlic3Iucwlmb28KLQlicmEucwljb250MgotCWJyYS5zCWNvbnQyCQkJCQotCWJzci5zCWV4aXQJCi0Jam1wLnMJZXhpdAotCWptcC5zCWV4aXQKLQlqbXAucwlleGl0CQkKLQlic3IJZXhpdAotCWptcAlleGl0Ci0KLWxvbmd6ZXJvOgotCS5xdWFkCTAKLQotCS50ZXh0Ci1leGl0OgkKLQlqbXAJcjYyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhNWE2Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgc2VyaWFsLnMKLSAgIDIgICAgICAgICAgICAgIAkjCi0gICAzICAgICAgICAgICAgICAJIyBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGVzLCB0aGUgcmlnaHQtc3ViaW5zdHJ1Y3Rpb25zCi0gICA0ICAgICAgICAgICAgICAJIyB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLiAgR0FTIHNob3VsZCBkZXRlY3QgdGhpcy4KLSAgIDUgICAgICAgICAgICAgIAkJCi0gICA2IFw/XD9cP1w/IDAwMDAwMEYwIAkJdHJhcCByMjEgLT4gYWRkIHIyLCByMCwgcjAgOyByaWdodCBpbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLgotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwMDAwMEYwIAotICAgNiAgICAgIDAwMDAwMEYwIAotICAgNiAgICAgIDAwMDAwMDkwIAotICAgNiAgICAgIDAwMTUwMEYwIAotICAgNyBcP1w/XD9cPyAwODAwMjAwMCAJCWRidCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA3ICAgICAgMDBCMDAwMDAgCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA4IFw/XD9cP1w/IDA4MDAyMDAwIAkJcnRkICAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDggICAgICAwMEEwMDAwMCAKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDkgXD9cP1w/XD8gMDgwMDIwMDAgCQlyZWl0ICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgOSAgICAgIDAwRjAwMDAwIAotICAgOSAgICAgIDAwODAwMDAwIAotICAgOSAgICAgIDAwRjAwMDAwIAotICAxMCBcP1w/XD9cPyAwODAwMjAwMCAJCW12dHN5cyBwc3csICByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0gIDEwICAgICAgMDBGMDAwMDAgCi0gIDEwICAgICAgMDBFMDAwNDAgCi0gIDEwICAgICAgODgwMDIwMDAgCi0gIDExIFw/XD9cP1w/IDAwRTAwMDQyIAkJbXZ0c3lzIHBzd2gsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLSAgMTEgICAgICA4ODAwMjAwMCAKLSAgMTIgXD9cP1w/XD8gMDBFMDAwNDEgCQltdnRzeXMgcHN3bCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotICAxMiAgICAgIDg4MDAyMDAwIAotICAxMyBcP1w/XD9cPyAwMEUwMDA0MyAJCW12dHN5cyBmMCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICA7IE9LCi0gIDEzICAgICAgODgwMDIwMDAgCi0gIDE0IFw/XD9cP1w/IDAwRTBBMDQwIAkJbXZ0c3lzIG1vZF9zLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgIDsgT0sKLSAgMTQgICAgICA4ODAwMjAwMCAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTk1ZDYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIHNlcmlhbC5zCi0jCi0jIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIHRoZSByaWdodC1zdWJpbnN0cnVjdGlvbnMKLSMgd2lsbCBuZXZlciBiZSBleGVjdXRlZC4gIEdBUyBzaG91bGQgZGV0ZWN0IHRoaXMuCi0JCi0JdHJhcCByMjEgLT4gYWRkIHIyLCByMCwgcjAgOyByaWdodCBpbnN0cnVjdGlvbiB3aWxsIG5ldmVyIGJlIGV4ZWN1dGVkLgotCWRidCAgICAgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICAgICAgICA7IGRpdHRvCi0JcnRkICAgICAtPiBhZGQgcjIsIHIwLCByMCAgICAgICAgICAgICAgIDsgZGl0dG8KLQlyZWl0ICAgIC0+IGFkZCByMiwgcjAsIHIwICAgICAgICAgICAgICAgOyBkaXR0bwotCW12dHN5cyBwc3csICByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgICA7IE9LCi0JbXZ0c3lzIHBzd2gsIHIxIC0+IGFkZCByMiwgcjAsIHIwICAgICAgIDsgT0sKLQltdnRzeXMgcHN3bCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgOyBPSwotCW12dHN5cyBmMCwgcjEgLT4gYWRkIHIyLCByMCwgcjAgICAgICAgICA7IE9LCi0JbXZ0c3lzIG1vZF9zLCByMSAtPiBhZGQgcjIsIHIwLCByMCAgICAgIDsgT0sKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMi5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZTA0ZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLmwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjU6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjY6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjk6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjExOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTM6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE0OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE4OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxOTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyMzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjQ6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjg6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjI5OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEQzMFYgc2VyaWFsIGV4ZWN1dGlvbiB0ZXN0Ci0gICAyICAgICAgICAgICAgICAJCQotICAgMyAgICAgICAgICAgICAgCQkudGV4dAotICAgNCAgICAgICAgICAgICAgCQkKLSAgIDUgXD9cP1w/XD8gMDAwMDAwRjAgCQlicmEgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwRjAgCi0gICA1ICAgICAgMDAwMDAwMEIgCi0gICA1ICAgICAgRkZGRjAwRjAgCi0gICA2IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNiAgICAgIDAwMkJGRkZGIAotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAgICAgICAgICAgICAgCQotICAgOCBcP1w/XD9cPyAwODA4MzAwMCAJCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA4ICAgICAgMTAwQkZGRkYgCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgIDkgICAgICAxMDJCRkZGRiAKLSAgIDkgICAgICAwMEYwMDAwMCAKLSAgMTAgICAgICAgICAgICAgIAkKLSAgMTEgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTEgICAgICAwMDJCRkZGRiAKLSAgMTEgICAgICAwMEYwMDAwMCAKLSAgMTIgXD9cP1w/XD8gMDAyQkZGRkUgCQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTIgICAgICAwMDJCRkZGRiAKLSAgMTIgICAgICAwMEYwMDAwMCAKLSAgMTMgXD9cP1w/XD8gMzAyQkZGRkUgCQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDEzICAgICAgMTAyQkZGRkYgCi0gIDEzICAgICAgMDBGMDAwMDAgCi0gIDE0IFw/XD9cP1w/IDAwMkJGRkZFIAkJYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNCAgICAgIDAwRjAwMDAwIAotICAxNCAgICAgIDEwMkJGRkZGIAotICAxNCAgICAgIDAwRjAwMDAwIAotICAxNSAgICAgICAgICAgICAgCQotICAxNiBcP1w/XD9cPyAyMDJCRkZGRSAJCWJyYSAtMyAtPiBicmEgIDEwICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE2ICAgICAgMDAwQkZGRkYgCi0gIDE2ICAgICAgMDBGMDAwMDAgCi0gIDE3IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnJhIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTcgICAgICAwMDBCRkZGRiAKLQxHQVMgTElTVElORyAuKgotCi0KLSAgMTcgICAgICAwMEYwMDAwMCAKLSAgMTggXD9cP1w/XD8gMTAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTggICAgICAxMDBCRkZGRiAKLSAgMTggICAgICAwMEYwMDAwMCAKLSAgMTkgXD9cP1w/XD8gMDAwODAwMDEgCQlicmEvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTkgICAgICAwMEYwMDAwMCAKLSAgMTkgICAgICAxMDBCRkZGRiAKLSAgMTkgICAgICAwMEYwMDAwMCAKLSAgMjAgICAgICAgICAgICAgIAkKLSAgMjEgXD9cP1w/XD8gMjAwODAwMDEgCQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMSAgICAgIDAwMkJGRkZGIAotICAyMSAgICAgIDAwRjAwMDAwIAotICAyMiBcP1w/XD9cPyAwMDA4MDAwMSAJCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIyICAgICAgMDAyQkZGRkYgCi0gIDIyICAgICAgMDBGMDAwMDAgCi0gIDIzIFw/XD9cP1w/IDEwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDIzICAgICAgMTAyQkZGRkYgCi0gIDIzICAgICAgMDBGMDAwMDAgCi0gIDI0IFw/XD9cP1w/IDAwMDgwMDAxIAkJYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI0ICAgICAgMDBGMDAwMDAgCi0gIDI0ICAgICAgMTAyQkZGRkYgCi0gIDI0ICAgICAgMDBGMDAwMDAgCi0gIDI1ICAgICAgICAgICAgICAJCi0gIDI2IFw/XD9cP1w/IDIwMDgwMDAxIAkJYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjYgICAgICAwMDBCRkZGRiAKLSAgMjYgICAgICAwMEYwMDAwMCAKLSAgMjcgXD9cP1w/XD8gMDAyODAwMDEgCQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyNyAgICAgIDAwMEJGRkZGIAotICAyNyAgICAgIDAwRjAwMDAwIAotICAyOCBcP1w/XD9cPyAxMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOCAgICAgIDEwMEJGRkZGIAotICAyOCAgICAgIDAwRjAwMDAwIAotICAyOSBcP1w/XD9cPyAwMDI4MDAwMSAJCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyOSAgICAgIDAwRjAwMDAwIAotICAyOSAgICAgIDEwMEJGRkZGIAotICAyOSAgICAgIDAwRjAwMDAwIAotICAyOSAgICAgIDIwMjgwMDAxIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1MzE1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDIucworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLQkKLQkudGV4dAotCQotCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi0KLQlicmEvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnNyIC0xMAk7ICAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnNyL3h0IC0xMCAgICA7ICAgICAgIEludmFsaWQKLQlic3IvdHggLTMgLT4gYnNyIC0xMCAgICA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJzci9meCAtMTAgOyAgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnNyIC0zIC0+IGJyYSAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlic3IgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotCWJzci90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotCi0JYnJhIC0zIC0+IGJzciAxMCAgICAgICAgOyAgICAgIEludmFsaWQKLQlicmEgLTMgLT4gYnNyL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotCWJyYS90eCAtMyAtPiBic3IgMTAgICAgIDsgICAgICBWYWxpZAotCWJyYS90eCAtMyAtPiBic3IvZnggMTAgIDsgICAgICBWYWxpZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWViMDVjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvc2VyaWFsMk8ubAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS4qOiBBc3NlbWJsZXIgbWVzc2FnZXM6Ci0uKjo1OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjo2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxMTogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MTI6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjE2OiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoxNzogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6MjE6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLS4qOjIyOiBFcnJvcjogVW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0uKjoyNjogRXJyb3I6IFVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotLio6Mjc6IEVycm9yOiBVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLUdBUyBMSVNUSU5HIC4qCi0KLQotICAgMSAgICAgICAgICAgICAgCSMgRDMwViBzZXJpYWwgZXhlY3V0aW9uIHRlc3QKLSAgIDIgICAgICAgICAgICAgIAkJCi0gICAzICAgICAgICAgICAgICAJCS50ZXh0Ci0gICA0ICAgICAgICAgICAgICAJCQotICAgNSBcP1w/XD9cPyAwMDAwMDBGMCAJCWJyYSAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgIDUgICAgICAwMDAwMDBGMCAKLSAgIDUgICAgICAwMDAwMDBGMCAKLSAgIDUgICAgICAwMDAwMDAwQiAKLSAgIDUgICAgICBGRkZGMDBGMCAKLSAgIDYgXD9cP1w/XD8gMDgwODMwMDAgCQlic3IgLTMgLT4gYWRkIHIzLHIwLDAJOyBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gICA2ICAgICAgMDBGMDAwMDAgCi0gICA2ICAgICAgMDAyQkZGRkYgCi0gICA2ICAgICAgMDBGMDAwMDAgCi0gICA3ICAgICAgICAgICAgICAJCi0gICA4IFw/XD9cP1w/IDA4MDgzMDAwIAkJYnJhL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLSAgIDggICAgICAwMEYwMDAwMCAKLSAgIDggICAgICAxMDBCRkZGRiAKLSAgIDggICAgICA4ODA4MzAwMCAKLSAgIDkgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYWRkIHIzLHIwLDAgOyAgICAgICBWYWxpZAotICAgOSAgICAgIDg4MDgzMDAwIAotICAxMCAgICAgICAgICAgICAgCQotICAxMSBcP1w/XD9cPyAwMDJCRkZGRiAJCWJzciAtMyAtPiBic3IgLTEwCTsgICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMSAgICAgIDAwRjAwMDAwIAotICAxMiBcP1w/XD9cPyAwMDJCRkZGRSAJCWJzciAtMyAtPiBic3IveHQgLTEwICAgIDsgICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxMiAgICAgIDAwRjAwMDAwIAotICAxMiAgICAgIDAwMkJGRkZGIAotICAxMiAgICAgIDAwRjAwMDAwIAotICAxMyBcP1w/XD9cPyAzMDJCRkZGRSAJCWJzci90eCAtMyAtPiBic3IgLTEwICAgIDsgICAgICAgVmFsaWQKLSAgMTMgICAgICAwMEYwMDAwMCAKLSAgMTMgICAgICAxMDJCRkZGRiAKLSAgMTMgICAgICA4MDJCRkZGRSAKLSAgMTQgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYnNyL2Z4IC0xMCA7ICAgICAgIFZhbGlkCi0gIDE0ICAgICAgQTAyQkZGRkUgCi0gIDE1ICAgICAgICAgICAgICAJCi0gIDE2IFw/XD9cP1w/IDAwMEJGRkZGIAkJYnJhIC0zIC0+IGJyYSAgMTAgICAgICAgOyAgICAgIEludmFsaWQKLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMTYgICAgICAwMEYwMDAwMCAKLSAgMTcgXD9cP1w/XD8gMDAwODAwMDEgCQlicmEgLTMgLT4gYnJhL3R4IDEwICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAxNyAgICAgIDAwRjAwMDAwIAotICAxNyAgICAgIDAwMEJGRkZGIAotICAxNyAgICAgIDAwRjAwMDAwIAotICAxOCBcP1w/XD9cPyAxMDA4MDAwMSAJCWJyYS90eCAtMyAtPiBicmEgMTAgICAgIDsgICAgICBWYWxpZAotICAxOCAgICAgIDAwRjAwMDAwIAotICAxOCAgICAgIDEwMEJGRkZGIAotICAxOCAgICAgIDgwMDgwMDAxIAotICAxOSBcP1w/XD9cPyAxMDBCRkZGRiAJCWJyYS90eCAtMyAtPiBicmEvZnggMTAgIDsgICAgICBWYWxpZAotICAxOSAgICAgIEEwMDgwMDAxIAotICAyMCAgICAgICAgICAgICAgCQotICAyMSBcP1w/XD9cPyAwMDJCRkZGRiAJCWJzciAtMyAtPiBicmEgMTAgICAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDIxICAgICAgMDBGMDAwMDAgCi0gIDIyIFw/XD9cP1w/IDAwMDgwMDAxIAkJYnNyIC0zIC0+IGJyYS90eCAxMCAgICAgOyAgICAgIEludmFsaWQKLQxHQVMgTElTVElORyAuKgotCi0KLVwqXCpcKlwqICBFcnJvcjpVbmFibGUgdG8gbWl4IGluc3RydWN0aW9ucyBhcyBzcGVjaWZpZWQKLSAgMjIgICAgICAwMEYwMDAwMCAKLSAgMjIgICAgICAwMDJCRkZGRiAKLSAgMjIgICAgICAwMEYwMDAwMCAKLSAgMjMgXD9cP1w/XD8gMTAwODAwMDEgCQlic3IvdHggLTMgLT4gYnJhIDEwICAgICA7ICAgICAgVmFsaWQKLSAgMjMgICAgICAwMEYwMDAwMCAKLSAgMjMgICAgICAxMDJCRkZGRiAKLSAgMjMgICAgICA4MDA4MDAwMSAKLSAgMjQgXD9cP1w/XD8gMTAyQkZGRkYgCQlic3IvdHggLTMgLT4gYnJhL2Z4IDEwICA7ICAgICAgVmFsaWQKLSAgMjQgICAgICBBMDA4MDAwMSAKLSAgMjUgICAgICAgICAgICAgIAkKLSAgMjYgXD9cP1w/XD8gMDAwQkZGRkYgCQlicmEgLTMgLT4gYnNyIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotXCpcKlwqXCogIEVycm9yOlVuYWJsZSB0byBtaXggaW5zdHJ1Y3Rpb25zIGFzIHNwZWNpZmllZAotICAyNiAgICAgIDAwRjAwMDAwIAotICAyNyBcP1w/XD9cPyAwMDI4MDAwMSAJCWJyYSAtMyAtPiBic3IvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi1cKlwqXCpcKiAgRXJyb3I6VW5hYmxlIHRvIG1peCBpbnN0cnVjdGlvbnMgYXMgc3BlY2lmaWVkCi0gIDI3ICAgICAgMDBGMDAwMDAgCi0gIDI3ICAgICAgMDAwQkZGRkYgCi0gIDI3ICAgICAgMDBGMDAwMDAgCi0gIDI4IFw/XD9cP1w/IDEwMjgwMDAxIAkJYnJhL3R4IC0zIC0+IGJzciAxMCAgICAgOyAgICAgIFZhbGlkCi0gIDI4ICAgICAgMDBGMDAwMDAgCi0gIDI4ICAgICAgMTAwQkZGRkYgCi0gIDI4ICAgICAgODAyODAwMDEgCi0gIDI5IFw/XD9cP1w/IDEwMEJGRkZGIAkJYnJhL3R4IC0zIC0+IGJzci9meCAxMCAgOyAgICAgIFZhbGlkCi0gIDI5ICAgICAgQTAyODAwMDEgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3NlcmlhbDJPLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTMxNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi9zZXJpYWwyTy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyBEMzBWIHNlcmlhbCBleGVjdXRpb24gdGVzdAotCQotCS50ZXh0Ci0JCi0JYnJhIC0zIC0+IGFkZCByMyxyMCwwCTsgSW52YWxpZAotCWJzciAtMyAtPiBhZGQgcjMscjAsMAk7IEludmFsaWQKLQotCWJyYS90eCAtMyAtPiBhZGQgcjMscjAsMCA7ICAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGFkZCByMyxyMCwwIDsgICAgICAgVmFsaWQKLQotCWJzciAtMyAtPiBic3IgLTEwCTsgICAgICAgSW52YWxpZAotCWJzciAtMyAtPiBic3IveHQgLTEwICAgIDsgICAgICAgSW52YWxpZAotCWJzci90eCAtMyAtPiBic3IgLTEwICAgIDsgICAgICAgVmFsaWQKLQlic3IvdHggLTMgLT4gYnNyL2Z4IC0xMCA7ICAgICAgIFZhbGlkCi0KLQlicmEgLTMgLT4gYnJhICAxMCAgICAgICA7ICAgICAgSW52YWxpZAotCWJyYSAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnJhL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0KLQlic3IgLTMgLT4gYnJhIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotCWJzciAtMyAtPiBicmEvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnNyL3R4IC0zIC0+IGJyYSAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnNyL3R4IC0zIC0+IGJyYS9meCAxMCAgOyAgICAgIFZhbGlkCi0KLQlicmEgLTMgLT4gYnNyIDEwICAgICAgICA7ICAgICAgSW52YWxpZAotCWJyYSAtMyAtPiBic3IvdHggMTAgICAgIDsgICAgICBJbnZhbGlkCi0JYnJhL3R4IC0zIC0+IGJzciAxMCAgICAgOyAgICAgIFZhbGlkCi0JYnJhL3R4IC0zIC0+IGJzci9meCAxMCAgOyAgICAgIFZhbGlkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9kMzB2L3dhcm5fb2RkcmVnLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI0M2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjU6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6NjogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjo3OiBXYXJuaW5nOiBPZGQgbnVtYmVyZWQgcmVnaXN0ZXIgdXNlZCBhcyB0YXJnZXQgb2YgbXVsdGktcmVnaXN0ZXIgaW5zdHJ1Y3Rpb24KLS4qOjg6IFdhcm5pbmc6IE9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotLio6OTogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMDogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMTogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0uKjoxMjogV2FybmluZzogT2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgICAgICAgICAgICAgIAkjIEdBUyBzaG91bGQgcHJpbnQgYSB3YXJuaW5nICB3aGVuIGFuIG9kZCByZWdpc3RlciBpcyB1c2VkIGFzIGEgdGFyZ2V0IAotICAgMiAgICAgICAgICAgICAgCSMgb2YgbXVsdGktd29yZCBpbnN0cnVjdGlvbnM6IGxkMncsIGxkNGJoLCBsZDRiaHUsIGxkMmgsIHN0MncsIHN0NGhiLCBzdDJoLCAKLSAgIDMgICAgICAgICAgICAgIAkjIGFuZCBtdWx4MmgKLSAgIDQgICAgICAgICAgICAgIAkKLSAgIDUgMDAwMCAwNTY4MTAwMCAJc3QydyByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA1ICAgICAgMDBGMDAwMDAgCi0gICA2IDAwMDggMDQ2ODEwMDAgCWxkMncgcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgNiAgICAgIDAwRjAwMDAwIAotICAgNyAwMDEwIDA0NTgxMDAwIAlsZDRiaCByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA3ICAgICAgMDBGMDAwMDAgCi0gICA4IDAwMTggMDREODEwMDAgCWxkNGJodSByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gICA4ICAgICAgMDBGMDAwMDAgCi0gICA5IDAwMjAgMDQzODEwMDAgCWxkMmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAgOSAgICAgIDAwRjAwMDAwIAotICAxMCAwMDI4IDA1NTgxMDAwIAlzdDRoYiByMSwgQChyMCwgMCkJfHwJbm9wIAotLiogIFdhcm5pbmc6T2RkIG51bWJlcmVkIHJlZ2lzdGVyIHVzZWQgYXMgdGFyZ2V0IG9mIG11bHRpLXJlZ2lzdGVyIGluc3RydWN0aW9uCi0gIDEwICAgICAgMDBGMDAwMDAgCi0gIDExIDAwMzAgMDUzODEwMDAgCXN0MmggcjEsIEAocjAsIDApCXx8CW5vcCAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMSAgICAgIDAwRjAwMDAwIAotICAxMiAwMDM4IDAwRjAwMDAwIAlub3AJfHwJbXVseDJoIHIxLCByNSwgcjYgICAKLS4qICBXYXJuaW5nOk9kZCBudW1iZXJlZCByZWdpc3RlciB1c2VkIGFzIHRhcmdldCBvZiBtdWx0aS1yZWdpc3RlciBpbnN0cnVjdGlvbgotICAxMiAgICAgIDBBMTAxMTQ2IApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZDMwdi93YXJuX29kZHJlZy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDlmNzUwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2QzMHYvd2Fybl9vZGRyZWcucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgR0FTIHNob3VsZCBwcmludCBhIHdhcm5pbmcgIHdoZW4gYW4gb2RkIHJlZ2lzdGVyIGlzIHVzZWQgYXMgYSB0YXJnZXQgCi0jIG9mIG11bHRpLXdvcmQgaW5zdHJ1Y3Rpb25zOiBsZDJ3LCBsZDRiaCwgbGQ0Ymh1LCBsZDJoLCBzdDJ3LCBzdDRoYiwgc3QyaCwgCi0jIGFuZCBtdWx4MmgKLQotc3QydyByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQydyByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQ0YmggcjEsIEAocjAsIDApCXx8CW5vcCAKLWxkNGJodSByMSwgQChyMCwgMCkJfHwJbm9wIAotbGQyaCByMSwgQChyMCwgMCkJfHwJbm9wIAotc3Q0aGIgcjEsIEAocjAsIDApCXx8CW5vcCAKLXN0MmggcjEsIEAocjAsIDApCXx8CW5vcCAKLW5vcAl8fAltdWx4MmggcjEsIHI1LCByNiAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL2VsZi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvZWxmLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2ODRkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvZWxmLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgZWxmIHRlc3RzCi0jCi0KLSMgV2UncmUgdGVzdGluZyBiaXRzIGluIG9iai1lbGYgLS0gZG9uJ3QgcnVuIG9uIGFueXRoaW5nIGVsc2UuCi1pZiB7IChbaXN0YXJnZXQgIiotKi1lbGYqIl0JCQotICAgICAgfHwgW2lzdGFyZ2V0ICIqLSotbGludXgqIl0KLSAgICAgIHx8IFtpc3RhcmdldCAic3BhcmMqLSotc29sYXJpcyoiXQotICAgICAgfHwgW2lzdGFyZ2V0ICJtaXBzKi0qLWlyaXg2KiJdKQotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0KLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXQotfSB0aGVuIHsKLQotICAgICMgRklYTUU6IFRoaXMgZG9lc24ndCB3b3JrIGZvciBNSVBTIHRhcmdldHMgYmVjYXVzZSBvZiB0aGUgLnJlZ2luZm8KLSAgICAjIGFuZCAubWRlYnVnIHNlY3Rpb25zLgotICAgIHNldHVwX3hmYWlsIG1pcHMqLSotKgotICAgIHJ1bl9kdW1wX3Rlc3QgInNlY3Rpb24wIiAKLQotICAgIHNldHVwX3hmYWlsIG1pcHMqLSotKgotICAgIHJ1bl9kdW1wX3Rlc3QgInNlY3Rpb24xIiAKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ3YzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24wLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jb2JqZHVtcDogLXMKLSNuYW1lOiBlbGYgc2VjdGlvbjAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotQ29udGVudHMgb2Ygc2VjdGlvbiAuZGF0YToKLSAwMDAwIDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLiAgICAgICAgICAgICAgCi1Db250ZW50cyBvZiBzZWN0aW9uIEE6Ci0gMDAwMCAwMTAxMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBCOgotIDAwMDAgMDIwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uICAgICAgICAgICAgICAKLUNvbnRlbnRzIG9mIHNlY3Rpb24gQzoKLSAwMDAwIDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGM4ZjBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLmRhdGEKLQkuYnl0ZSAwCi0uc2VjdGlvbiBBCi0JLmJ5dGUgMQotLnB1c2hzZWN0aW9uIEIKLQkuYnl0ZSAyCi0ucHVzaHNlY3Rpb24gQwotCS5ieXRlIDMKLS5wb3BzZWN0aW9uCi0JLmJ5dGUgMgotLnBvcHNlY3Rpb24KLQkuYnl0ZSAxCi0ucHJldmlvdXMKLQkuYnl0ZSAwCi0ucHJldmlvdXMKLQkuYnl0ZSAxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmExNmEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2VsZi9zZWN0aW9uMS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI29iamR1bXA6IC1zCi0jbmFtZTogZWxmIHNlY3Rpb24xCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotQ29udGVudHMgb2Ygc2VjdGlvbiAudGV4dDoKLUNvbnRlbnRzIG9mIHNlY3Rpb24gLmRhdGE6Ci0gMDAwMCAwMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgIAotQ29udGVudHMgb2Ygc2VjdGlvbiBBOgotIDAwMDAgMDEwMTAxMDEgMDEwMSAgICAgICAgICAgICAgICAgICAgICAgIC4uLi4uLiAgICAgICAgICAKLUNvbnRlbnRzIG9mIHNlY3Rpb24gQjoKLSAwMDAwIDAyMDIwMjAyIDAyICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLiAgICAgICAgICAgCi1Db250ZW50cyBvZiBzZWN0aW9uIEM6Ci0gMDAwMCAwMzAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4gICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZWxmL3NlY3Rpb24xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5MmFkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9lbGYvc2VjdGlvbjEucworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS5kYXRhCi0JLmJ5dGUgMAotLnNlY3Rpb24gQQotCS5ieXRlIDEKLS5wcmV2aW91cwotCS5ieXRlIDAKLS5wcmV2aW91cwotCS5ieXRlIDEKLS5wdXNoc2VjdGlvbiBCCi0JLmJ5dGUgMgotLnByZXZpb3VzCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMgotLnB1c2hzZWN0aW9uIEMKLQkuYnl0ZSAzCi0ucHJldmlvdXMKLQkuYnl0ZSAyCi0ucHJldmlvdXMKLQkuYnl0ZSAzCi0ucG9wc2VjdGlvbgotCS5ieXRlIDIKLS5wcmV2aW91cwotCS5ieXRlIDEKLS5wcmV2aW91cwotCS5ieXRlIDIKLS5wb3BzZWN0aW9uCi0JLmJ5dGUgMQotLnByZXZpb3VzCi0JLmJ5dGUgMAotLnByZXZpb3VzCi0JLmJ5dGUgMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJhYzc2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MCArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogYWxsaW5zbgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8YWRkPjoKLSAgIDA6CWE2IDAxICAgICAgIAlhZGQgcjAscjEKLSAgIDI6CWE0IDAyICAgICAgIAlhZGQgMHgwLHIyCi0KLTArMDAwNCA8YWRkMj46Ci0gICA0OglhNSBmMyAgICAgICAJYWRkMiAtMSxyMwotCi0wKzAwMDYgPGFkZGM+OgotICAgNjoJYTcgNDUgICAgICAgCWFkZGMgcjQscjUKLQotMCswMDA4IDxhZGRuPjoKLSAgIDg6CWEyIDY3ICAgICAgIAlhZGRuIHI2LHI3Ci0gICBhOglhMCBmOCAgICAgICAJYWRkbiAweGYscjgKLQotMCswMDBjIDxhZGRuMj46Ci0gICBjOglhMSAwOSAgICAgICAJYWRkbjIgLTE2LHI5Ci0KLTArMDAwZSA8c3ViPjoKLSAgIGU6CWFjIGFiICAgICAgIAlzdWIgcjEwLHIxMQotCi0wKzAwMTAgPHN1YmM+OgotICAxMDoJYWQgY2QgICAgICAgCXN1YmMgcjEyLHIxMwotCi0wKzAwMTIgPHN1Ym4+OgotICAxMjoJYWUgZWYgICAgICAgCXN1Ym4gcjE0LHIxNQotCi0wKzAwMTQgPGNtcD46Ci0gIDE0OglhYSBkZSAgICAgICAJY21wIHIxMyxyMTQKLSAgMTY6CWE4IDFmICAgICAgIAljbXAgMHgxLHIxNQotCi0wKzAwMTggPGNtcDI+OgotICAxODoJYTkgMTAgICAgICAgCWNtcDIgLTE1LHIwCi0KLTArMDAxYSA8YW5kPjoKLSAgMWE6CTgyIDEyICAgICAgIAlhbmQgcjEscjIKLSAgMWM6CTg0IDM0ICAgICAgIAlhbmQgcjMsQHI0Ci0KLTArMDAxZSA8YW5kaD46Ci0gIDFlOgk4NSA1NiAgICAgICAJYW5kaCByNSxAcjYKLQotMCswMDIwIDxhbmRiPjoKLSAgMjA6CTg2IDc4ICAgICAgIAlhbmRiIHI3LEByOAotCi0wKzAwMjIgPG9yPjoKLSAgMjI6CTkyIDlhICAgICAgIAlvciByOSxyMTAKLSAgMjQ6CTk0IGJjICAgICAgIAlvciByMTEsQHIxMgotCi0wKzAwMjYgPG9yaD46Ci0gIDI2Ogk5NSBkZSAgICAgICAJb3JoIHIxMyxAcjE0Ci0KLTArMDAyOCA8b3JiPjoKLSAgMjg6CTk2IGZkICAgICAgIAlvcmIgcjE1LEByMTMKLQotMCswMDJhIDxlb3I+OgotICAyYToJOWEgZWYgICAgICAgCWVvciByMTQscjE1Ci0gIDJjOgk5YyAwMSAgICAgICAJZW9yIHIwLEByMQotCi0wKzAwMmUgPGVvcmg+OgotICAyZToJOWQgMjMgICAgICAgCWVvcmggcjIsQHIzCi0KLTArMDAzMCA8ZW9yYj46Ci0gIDMwOgk5ZSA0NSAgICAgICAJZW9yYiByNCxAcjUKLQotMCswMDMyIDxiYW5kbD46Ci0gIDMyOgk4MCBmNiAgICAgICAJYmFuZGwgMHhmLEByNgotCi0wKzAwMzQgPG5hZGg+OgotICAzNDoJODEgNzcgICAgICAgCWJhbmRoIDB4NyxAcjcKLQotMCswMDM2IDxib3JsPjoKLSAgMzY6CTkwIDM4ICAgICAgIAlib3JsIDB4MyxAcjgKLQotMCswMDM4IDxib3JoPjoKLSAgMzg6CTkxIGQ5ICAgICAgIAlib3JoIDB4ZCxAcjkKLQotMCswMDNhIDxiZW9ybD46Ci0gIDNhOgk5OCBmYSAgICAgICAJYmVvcmwgMHhmLEByMTAKLQotMCswMDNjIDxiZW9yaD46Ci0gIDNjOgk5OSAxYiAgICAgICAJYmVvcmggMHgxLEByMTEKLQotMCswMDNlIDxidHN0bD46Ci0gIDNlOgk4OCAwYyAgICAgICAJYnRzdGwgMHgwLEByMTIKLQotMCswMDQwIDxidHN0aD46Ci0gIDQwOgk4OSA4ZCAgICAgICAJYnRzdGggMHg4LEByMTMKLQotMCswMDQyIDxtdWw+OgotICA0MjoJYWYgZWYgICAgICAgCW11bCByMTQscjE1Ci0KLTArMDA0NCA8bXVsdT46Ci0gIDQ0OglhYiBkZSAgICAgICAJbXVsdSByMTMscjE0Ci0KLTArMDA0NiA8bXVsdWg+OgotICA0NjoJYmIgZjAgICAgICAgCW11bHVoIHIxNSxyMAotCi0wKzAwNDggPG11bGg+OgotICA0ODoJYmYgMTIgICAgICAgCW11bGggcjEscjIKLQotMCswMDRhIDxkaXYwcz46Ci0gIDRhOgk5NyA0MyAgICAgICAJZGl2MHMgcjMKLQotMCswMDRjIDxkaXYwdT46Ci0gIDRjOgk5NyA1NCAgICAgICAJZGl2MHUgcjQKLQotMCswMDRlIDxkaXYxPjoKLSAgNGU6CTk3IDY1ICAgICAgIAlkaXYxIHI1Ci0KLTArMDA1MCA8ZGl2Mj46Ci0gIDUwOgk5NyA3NiAgICAgICAJZGl2MiByNgotCi0wKzAwNTIgPGRpdjM+OgotICA1MjoJOWYgNjAgICAgICAgCWRpdjMKLQotMCswMDU0IDxkaXY0cz46Ci0gIDU0Ogk5ZiA3MCAgICAgICAJZGl2NHMKLQotMCswMDU2IDxsc2w+OgotICA1NjoJYjYgNzggICAgICAgCWxzbCByNyxyOAotICA1ODoJYjQgMzkgICAgICAgCWxzbCAweDMscjkKLQotMCswMDVhIDxsc2wyPjoKLSAgNWE6CWI1IDBhICAgICAgIAlsc2wyIDB4MCxyMTAKLQotMCswMDVjIDxsc3I+OgotICA1YzoJYjIgYmMgICAgICAgCWxzciByMTEscjEyCi0gIDVlOgliMCBmZCAgICAgICAJbHNyIDB4ZixyMTMKLQotMCswMDYwIDxsc3IyPjoKLSAgNjA6CWIxIGZlICAgICAgIAlsc3IyIDB4ZixyMTQKLQotMCswMDYyIDxhc3I+OgotICA2MjoJYmEgZmQgICAgICAgCWFzciByMTUscjEzCi0gIDY0OgliOCA2ZSAgICAgICAJYXNyIDB4NixyMTQKLQotMCswMDY2IDxhc3IyPjoKLSAgNjY6CWI5IDdmICAgICAgIAlhc3IyIDB4NyxyMTUKLQotMCswMDY4IDxsZGlfOD46Ci0gIDY4OgljZiBmMiAgICAgICAJbGRpOjggMHhmZixyMgotCi0wKzAwNmEgPGxkPjoKLSAgNmE6CTA0IDM0ICAgICAgIAlsZCBAcjMscjQKLSAgNmM6CTAwIDU2ICAgICAgIAlsZCBAXChyMTMscjVcKSxyNgotICA2ZToJMjcgZjcgICAgICAgCWxkIEBcKHIxNCw1MDhcKSxyNwotICA3MDoJMDMgZjggICAgICAgCWxkIEBcKHIxNSwweDNjXCkscjgKLSAgNzI6CTA3IDA5ICAgICAgIAlsZCBAcjE1XCsscjkKLSAgNzQ6CTA3IDkwICAgICAgIAlsZCBAcjE1XCsscHMKLSAgNzY6CTA3IDgwICAgICAgIAlsZCBAcjE1XCssdGJyCi0gIDc4OgkwNyA4MSAgICAgICAJbGQgQHIxNVwrLHJwCi0gIDdhOgkwNyA4MiAgICAgICAJbGQgQHIxNVwrLHNzcAotCi0wKzAwN2MgPGxkdWg+OgotICA3YzoJMDUgYWIgICAgICAgCWxkdWggQHIxMCxyMTEKLSAgN2U6CTAxIGNkICAgICAgIAlsZHVoIEBcKHIxMyxyMTJcKSxyMTMKLSAgODA6CTQ4IDBmICAgICAgIAlsZHVoIEBcKHIxNCwtMjU2XCkscjE1Ci0KLTArMDA4MiA8bGR1Yj46Ci0gIDgyOgkwNiBkZSAgICAgICAJbGR1YiBAcjEzLHIxNAotICA4NDoJMDIgZjAgICAgICAgCWxkdWIgQFwocjEzLHIxNVwpLHIwCi0gIDg2Ogk2OCAwMSAgICAgICAJbGR1YiBAXChyMTQsLTEyOFwpLHIxCi0KLTArMDA4OCA8c3Q+OgotICA4ODoJMTQgMzIgICAgICAgCXN0IHIyLEByMwotICA4YToJMTAgNTQgICAgICAgCXN0IHI0LEBcKHIxMyxyNVwpCi0gIDhjOgkzOCAwNiAgICAgICAJc3QgcjYsQFwocjE0LC01MTJcKQotICA4ZToJMTMgZjcgICAgICAgCXN0IHI3LEBcKHIxNSwweDNjXCkKLSAgOTA6CTE3IDA4ICAgICAgIAlzdCByOCxALXIxNQotICA5MjoJMTcgODQgICAgICAgCXN0IG1kaCxALXIxNQotICA5NDoJMTcgOTAgICAgICAgCXN0IHBzLEAtcjE1Ci0KLTArMDA5NiA8c3RoPjoKLSAgOTY6CTE1IGE5ICAgICAgIAlzdGggcjksQHIxMAotICA5ODoJMTEgY2IgICAgICAgCXN0aCByMTEsQFwocjEzLHIxMlwpCi0gIDlhOgk1NCAwZCAgICAgICAJc3RoIHIxMyxAXChyMTQsMTI4XCkKLQotMCswMDljIDxzdGI+OgotICA5YzoJMTYgZmUgICAgICAgCXN0YiByMTQsQHIxNQotICA5ZToJMTIgMTAgICAgICAgCXN0YiByMCxAXChyMTMscjFcKQotICBhMDoJNzggMDIgICAgICAgCXN0YiByMixAXChyMTQsLTEyOFwpCi0KLTArMDBhMiA8bW92PjoKLSAgYTI6CThiIDM0ICAgICAgIAltb3YgcjMscjQKLSAgYTQ6CWI3IDU1ICAgICAgIAltb3YgbWRsLHI1Ci0gIGE2OgkxNyAxNiAgICAgICAJbW92IHBzLHI2Ci0gIGE4OgliMyAzNyAgICAgICAJbW92IHI3LHVzcAotICBhYToJMDcgMTggICAgICAgCW1vdiByOCxwcwotCi0wKzAwYWMgPGptcD46Ci0gIGFjOgk5NyAwOSAgICAgICAJam1wIEByOQotCi0wKzAwYWUgPHJldD46Ci0gIGFlOgk5NyAyMCAgICAgICAJcmV0Ci0KLTArMDBiMCA8YnJhPjoKLSAgYjA6CWUwIGE3ICAgICAgIAlicmEgMCBcPGFkZFw+Ci0KLTArMDBiMiA8Ym5vPjoKLSAgYjI6CWUxIGE2ICAgICAgIAlibm8gMCBcPGFkZFw+Ci0KLTArMDBiNCA8YmVxPjoKLSAgYjQ6CWUyIGE1ICAgICAgIAliZXEgMCBcPGFkZFw+Ci0KLTArMDBiNiA8Ym5lPjoKLSAgYjY6CWUzIGE0ICAgICAgIAlibmUgMCBcPGFkZFw+Ci0KLTArMDBiOCA8YmM+OgotICBiODoJZTQgYTMgICAgICAgCWJjIDAgXDxhZGRcPgotCi0wKzAwYmEgPGJuYz46Ci0gIGJhOgllNSBhMiAgICAgICAJYm5jIDAgXDxhZGRcPgotCi0wKzAwYmMgPGJuPjoKLSAgYmM6CWU2IGExICAgICAgIAlibiAwIFw8YWRkXD4KLQotMCswMGJlIDxicD46Ci0gIGJlOgllNyBhMCAgICAgICAJYnAgMCBcPGFkZFw+Ci0KLTArMDBjMCA8YnY+OgotICBjMDoJZTggOWYgICAgICAgCWJ2IDAgXDxhZGRcPgotCi0wKzAwYzIgPGJudj46Ci0gIGMyOgllOSA5ZSAgICAgICAJYm52IDAgXDxhZGRcPgotCi0wKzAwYzQgPGJsdD46Ci0gIGM0OgllYSA5ZCAgICAgICAJYmx0IDAgXDxhZGRcPgotCi0wKzAwYzYgPGJnZT46Ci0gIGM2OgllYiA5YyAgICAgICAJYmdlIDAgXDxhZGRcPgotCi0wKzAwYzggPGJsZT46Ci0gIGM4OgllYyA5YiAgICAgICAJYmxlIDAgXDxhZGRcPgotCi0wKzAwY2EgPGJndD46Ci0gIGNhOgllZCA5YSAgICAgICAJYmd0IDAgXDxhZGRcPgotCi0wKzAwY2MgPGJscz46Ci0gIGNjOgllZSA5OSAgICAgICAJYmxzIDAgXDxhZGRcPgotCi0wKzAwY2UgPGJoaT46Ci0gIGNlOgllZiA5OCAgICAgICAJYmhpIDAgXDxhZGRcPgotCi0wKzAwZDAgPGptcF9kPjoKLSAgZDA6CTlmIDBiICAgICAgIAlqbXA6ZCBAcjExCi0gIGQyOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBkNCA8cmV0X2Q+OgotICBkNDoJOWYgMjAgICAgICAgCXJldDpkCi0gIGQ2Ogk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBkOCA8YnJhX2Q+OgotICBkODoJZjAgZmIgICAgICAgCWJyYTpkIGQwIFw8am1wX2RcPgotICBkYToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZGMgPGJub19kPjoKLSAgZGM6CWYxIGY5ICAgICAgIAlibm86ZCBkMCBcPGptcF9kXD4KLSAgZGU6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGUwIDxiZXFfZD46Ci0gIGUwOglmMiBmNyAgICAgICAJYmVxOmQgZDAgXDxqbXBfZFw+Ci0gIGUyOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBlNCA8Ym5lX2Q+OgotICBlNDoJZjMgZjUgICAgICAgCWJuZTpkIGQwIFw8am1wX2RcPgotICBlNjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZTggPGJjX2Q+OgotICBlODoJZjQgZjMgICAgICAgCWJjOmQgZDAgXDxqbXBfZFw+Ci0gIGVhOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBlYyA8Ym5jX2Q+OgotICBlYzoJZjUgZjEgICAgICAgCWJuYzpkIGQwIFw8am1wX2RcPgotICBlZToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZjAgPGJuX2Q+OgotICBmMDoJZjYgZWYgICAgICAgCWJuOmQgZDAgXDxqbXBfZFw+Ci0gIGYyOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDBmNCA8YnBfZD46Ci0gIGY0OglmNyBlZCAgICAgICAJYnA6ZCBkMCBcPGptcF9kXD4KLSAgZjY6CTlmIGEwICAgICAgIAlub3AKLQotMCswMGY4IDxidl9kPjoKLSAgZjg6CWY4IGViICAgICAgIAlidjpkIGQwIFw8am1wX2RcPgotICBmYToJOWYgYTAgICAgICAgCW5vcAotCi0wKzAwZmMgPGJudl9kPjoKLSAgZmM6CWY5IGU5ICAgICAgIAlibnY6ZCBkMCBcPGptcF9kXD4KLSAgZmU6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTAwIDxibHRfZD46Ci0gMTAwOglmYSBlNyAgICAgICAJYmx0OmQgZDAgXDxqbXBfZFw+Ci0gMTAyOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDEwNCA8YmdlX2Q+OgotIDEwNDoJZmIgZTUgICAgICAgCWJnZTpkIGQwIFw8am1wX2RcPgotIDEwNjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMDggPGJsZV9kPjoKLSAxMDg6CWZjIGUzICAgICAgIAlibGU6ZCBkMCBcPGptcF9kXD4KLSAxMGE6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTBjIDxiZ3RfZD46Ci0gMTBjOglmZCBlMSAgICAgICAJYmd0OmQgZDAgXDxqbXBfZFw+Ci0gMTBlOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDExMCA8YmxzX2Q+OgotIDExMDoJZmUgZGYgICAgICAgCWJsczpkIGQwIFw8am1wX2RcPgotIDExMjoJOWYgYTAgICAgICAgCW5vcAotCi0wKzAxMTQgPGJoaV9kPjoKLSAxMTQ6CWZmIGRkICAgICAgIAliaGk6ZCBkMCBcPGptcF9kXD4KLSAxMTY6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTE4IDxsZHJlcz46Ci0gMTE4OgliYyA4MiAgICAgICAJbGRyZXMgQHIyXCssMHg4Ci0KLTArMDExYSA8c3RyZXM+OgotIDExYToJYmQgZjMgICAgICAgCXN0cmVzIDB4ZixAcjNcKwotCi0wKzAxMWMgPG5vcD46Ci0gMTFjOgk5ZiBhMCAgICAgICAJbm9wCi0KLTArMDExZSA8YW5kY2NyPjoKLSAxMWU6CTgzIGZmICAgICAgIAlhbmRjY3IgMHhmZgotCi0wKzAxMjAgPG9yY2NyPjoKLSAxMjA6CTkzIDdkICAgICAgIAlvcmNjciAweDdkCi0KLTArMDEyMiA8c3RpbG0+OgotIDEyMjoJODcgNjEgICAgICAgCXN0aWxtIDB4NjEKLQotMCswMTI0IDxhZGRzcD46Ci0gMTI0OglhMyA4MCAgICAgICAJYWRkc3AgLTUxMgotCi0wKzAxMjYgPGV4dHNiPjoKLSAxMjY6CTk3IDg5ICAgICAgIAlleHRzYiByOQotCi0wKzAxMjggPGV4dHViPjoKLSAxMjg6CTk3IDlhICAgICAgIAlleHR1YiByMTAKLQotMCswMTJhIDxleHRzaD46Ci0gMTJhOgk5NyBhYiAgICAgICAJZXh0c2ggcjExCi0KLTArMDEyYyA8ZXh0dWg+OgotIDEyYzoJOTcgYmMgICAgICAgCWV4dHVoIHIxMgotCi0wKzAxMmUgPGVudGVyPjoKLSAxMmU6CTBmIGZmICAgICAgIAllbnRlciAweDNmYwotCi0wKzAxMzAgPGxlYXZlPjoKLSAxMzA6CTlmIDkwICAgICAgIAlsZWF2ZQotCi0wKzAxMzIgPHhjaGI+OgotIDEzMjoJOGEgZWYgICAgICAgCXhjaGIgQHIxNCxyMTUKLQotMCswMTM0IDxsZGlfMzI+OgotIDEzNDoJOWYgODAgMTIgMzQgCWxkaTozMiAweDEyMzQ1Njc4LHIwCi0gMTM4Ogk1NiA3OCAKLQotMCswMTNhIDxjb3BvcD46Ci0gMTNhOgk5ZiBjZiAwMSAzNCAJY29wb3AgMHhmLDB4MSxjcjMsY3I0Ci0gMTNlOgk5ZiBjZiAwNCA1NiAJY29wb3AgMHhmLDB4NCxjcjUsY3I2Ci0gMTQyOgk5ZiBjZiBmZiA3MCAJY29wb3AgMHhmLDB4ZmYsY3I3LGNyMAotCi0wKzAxNDYgPGNvcGxkPjoKLSAxNDY6CTlmIGQwIDAwIDQwIAljb3BsZCAweDAsMHgwLHI0LGNyMAotCi0wKzAxNGEgPGNvcHN0PjoKLSAxNGE6CTlmIGU3IDAyIDE1IAljb3BzdCAweDcsMHgyLGNyMSxyNQotCi0wKzAxNGUgPGNvcHN2PjoKLSAxNGU6CTlmIGY4IDAzIDI2IAljb3BzdiAweDgsMHgzLGNyMixyNgotCi0wKzAxNTIgPGxkbTA+OgotIDE1MjoJOGMgOGQgICAgICAgCWxkbTAgXChyMCxyMixyMyxyN1wpCi0KLTArMDE1NCA8bGRtMT46Ci0gMTU0Ogk4ZCA4OSAgICAgICAJbGRtMSBcKHI4LHIxMSxyMTVcKQotCi0wKzAxNTYgPHN0bTA+OgotIDE1NjoJOGUgMzAgICAgICAgCXN0bTAgXChyMixyM1wpCi0KLTArMDE1OCA8c3RtMT46Ci0gMTU4Ogk4ZiAwNiAgICAgICAJc3RtMSBcKHIxMyxyMTRcKQotCi0wKzAxNWEgPGNhbGw+OgotIDE1YToJZDcgNTIgICAgICAgCWNhbGwgMCBcPGFkZFw+Ci0gMTVjOgk5NyAxYSAgICAgICAJY2FsbCBAcjEwCi0KLTArMDE1ZSA8Y2FsbF9kPjoKLSAxNWU6CWRmIDUwICAgICAgIAljYWxsOmQgMCBcPGFkZFw+Ci0gMTYwOgk5ZiBhMCAgICAgICAJbm9wCi0gMTYyOgk5ZiAxYyAgICAgICAJY2FsbDpkIEByMTIKLSAxNjQ6CTlmIGEwICAgICAgIAlub3AKLQotMCswMTY2IDxkbW92PjoKLSAxNjY6CTA4IDIyICAgICAgIAlkbW92IEAweDg4LHIxMwotIDE2ODoJMTggMTUgICAgICAgCWRtb3YgcjEzLEAweDU0Ci0gMTZhOgkwYyAxMSAgICAgICAJZG1vdiBAMHg0NCxAcjEzXCsKLSAxNmM6CTFjIDAwICAgICAgIAlkbW92IEByMTNcKyxAMHgwCi0gMTZlOgkwYiAwYiAgICAgICAJZG1vdiBAMHgyYyxALXIxNQotIDE3MDoJMWIgMDkgICAgICAgCWRtb3YgQHIxNVwrLEAweDI0Ci0KLTArMDE3MiA8ZG1vdmg+OgotIDE3MjoJMDkgNDQgICAgICAgCWRtb3ZoIEAweDg4LHIxMwotIDE3NDoJMTkgMjkgICAgICAgCWRtb3ZoIHIxMyxAMHg1MgotIDE3NjoJMGQgMWEgICAgICAgCWRtb3ZoIEAweDM0LEByMTNcKwotIDE3ODoJMWQgMjkgICAgICAgCWRtb3ZoIEByMTNcKyxAMHg1MgotCi0wKzAxN2EgPGRtb3ZiPjoKLSAxN2E6CTBhIDkxICAgICAgIAlkbW92YiBAMHg5MSxyMTMKLSAxN2M6CTFhIDUzICAgICAgIAlkbW92YiByMTMsQDB4NTMKLSAxN2U6CTBlIDQ3ICAgICAgIAlkbW92YiBAMHg0NyxAcjEzXCsKLSAxODA6CTFlIDAwICAgICAgIAlkbW92YiBAcjEzXCssQDB4MAotCi0wKzAxODIgPGxkaV8yMD46Ci0gMTgyOgk5YiBmMSBmZiBmZiAJbGRpOjIwIDB4ZmZmZmYscjEKLQotMCswMTg2IDxmaW5pc2g+OgotIDE4NjoJOWYgODAgMDAgMDAgCWxkaTozMiAweDgwMDAscjAKLSAxOGE6CTgwIDAwIAotIDE4YzoJYjMgMjAgICAgICAgCW1vdiByMCxzc3AKLSAxOGU6CTlmIDgwIDAwIDAwIAlsZGk6MzIgMHgxLHIwCi0gMTkyOgkwMCAwMSAKLSAxOTQ6CTFmIDBhICAgICAgIAlpbnQgMHhhCi0KLTArMDE5NiA8aW50ZT46Ci0gMTk2Ogk5ZiAzMCAgICAgICAJaW50ZQotCi0wKzAxOTggPHJldGk+OgotIDE5ODoJOTcgMzAgICAgICAgCXJldGkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2FsbGluc24uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2NmZTE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgRlIzMCBhc3NlbWJsZXIgdGVzdHN1aXRlLgotCi1pZiBbaXN0YXJnZXQgZnIzMCotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYWxsaW5zbiIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvYWxsaW5zbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4M2QyNGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvZnIzMC9hbGxpbnNuLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotIC5kYXRhCi1mb29kYXRhOiAud29yZCA0MgotCSAudGV4dAotZm9vdGV4dDoKLQkuZ2xvYmFsIGFkZAotYWRkOgotCWFkZCByMCwgcjEKLQlhZGQgIzAsIHIyCi0JLmdsb2JhbCBhZGQyCi1hZGQyOgotCWFkZDIgIy0xLCByMwotCS5nbG9iYWwgYWRkYwotYWRkYzoKLQlhZGRjIHI0LCByNQotCS5nbG9iYWwgYWRkbgotYWRkbjoKLQlhZGRuIHI2LCByNwotCWFkZG4gIzE1LCByOAotCS5nbG9iYWwgYWRkbjIKLWFkZG4yOgotCWFkZG4yICMtMTYsIHI5Ci0JLmdsb2JhbCBzdWIKLXN1YjoKLQlzdWIgcjEwLCByMTEKLQkuZ2xvYmFsIHN1YmMKLXN1YmM6Ci0Jc3ViYyByMTIsIHIxMwotCS5nbG9iYWwgc3Vibgotc3VibjoKLQlzdWJuIHIxNCwgcjE1Ci0JLmdsb2JhbCBjbXAKLWNtcDoKLQljbXAgYWMsIGZwCi0JY21wICMxLCBzcAotCS5nbG9iYWwgY21wMgotY21wMjoKLQljbXAyICMtMTUsIHIwCi0JLmdsb2JhbCBhbmQKLWFuZDoKLQlhbmQgcjEsIHIyCi0JYW5kIHIzLCBAcjQKLQkuZ2xvYmFsIGFuZGgKLWFuZGg6Ci0JYW5kaCByNSwgQHI2Ci0JLmdsb2JhbCBhbmRiCi1hbmRiOgotCWFuZGIgcjcsIEByOAotCS5nbG9iYWwgb3IKLW9yOgotCW9yIHI5LCByMTAKLQlvciByMTEsIEByMTIKLQkuZ2xvYmFsIG9yaAotb3JoOgotCW9yaCByMTMsIEByMTQKLQkuZ2xvYmFsIG9yYgotb3JiOgotCW9yYiByMTUsIEBhYwotCS5nbG9iYWwgZW9yCi1lb3I6Ci0JZW9yIGZwLCBzcAotCWVvciByMCwgQHIxCi0JLmdsb2JhbCBlb3JoCi1lb3JoOgotCWVvcmggcjIsIEByMwotCS5nbG9iYWwgZW9yYgotZW9yYjoKLQllb3JiIHI0LCBAcjUKLQkuZ2xvYmFsIGJhbmRsCi1iYW5kbDoKLQliYW5kbCAjMTUsIEByNgotCS5nbG9iYWwgYmFuZGgKLW5hZGg6Ci0JYmFuZGggIzcsIEByNwotCS5nbG9iYWwgYm9ybAotYm9ybDoKLQlib3JsICMzLCBAcjgKLQkuZ2xvYmFsIGJvcmgKLWJvcmg6Ci0JYm9yaCAjMTMsIEByOQotCS5nbG9iYWwgYmVvcmwKLWJlb3JsOgotCWJlb3JsICMxNSwgQHIxMAotCS5nbG9iYWwgYmVvcmgKLWJlb3JoOgotCWJlb3JoICMxLCBAcjExCi0JLmdsb2JhbCBidHN0bAotYnRzdGw6Ci0JYnRzdGwgIzAsIEByMTIKLQkuZ2xvYmFsIGJ0c3RoCi1idHN0aDoKLQlidHN0aCAjOCwgQHIxMwotCS5nbG9iYWwgbXVsCi1tdWw6Ci0JbXVsIHIxNCwgcjE1Ci0JLmdsb2JhbCBtdWx1Ci1tdWx1OgotCW11bHUgYWMsIGZwCi0JLmdsb2JhbCBtdWx1aAotbXVsdWg6CQotCW11bHVoIHNwLCByMAotCS5nbG9iYWwgbXVsaAotbXVsaDoJCi0JbXVsaCByMSwgcjIKLQkuZ2xvYmFsIGRpdjBzCi1kaXYwczoKLQlkaXYwcyByMwotCS5nbG9iYWwgZGl2MHUKLWRpdjB1OgotCWRpdjB1IHI0Ci0JLmdsb2JhbCBkaXYxCi1kaXYxOgotCWRpdjEgcjUKLQkuZ2xvYmFsIGRpdjIKLWRpdjI6Ci0JZGl2MiByNgotCS5nbG9iYWwgZGl2MwotZGl2MzoKLQlkaXYzCi0JLmdsb2JhbCBkaXY0cwotZGl2NHM6Ci0JZGl2NHMKLQkuZ2xvYmFsIGxzbAotbHNsOgotCWxzbCByNywgcjgKLQlsc2wgIzMsIHI5Ci0JLmdsb2JhbCBsc2wyCi1sc2wyOgotCWxzbDIgIzAsIHIxMAotCS5nbG9iYWwgbHNyCi1sc3I6Ci0JbHNyIHIxMSwgcjEyCi0JbHNyICMxNSwgcjEzCi0JLmdsb2JhbCBsc3IyCi1sc3IyOgotCWxzcjIgIzE1LCByMTQKLQkuZ2xvYmFsIGFzcgotYXNyOgotCWFzciByMTUsIGFjCi0JYXNyICM2LCBmcAotCS5nbG9iYWwgYXNyMgotYXNyMjoKLQlhc3IyICM3LCBzcAotCS5nbG9iYWwgbGRpXzgKLWxkaV84OgotCWxkaTo4ICMweGZmLCByMgotCS5nbG9iYWwgbGQKLWxkOgotCWxkIEByMywgcjQKLQlsZCBAKFIxMywgcjUpLCByNgotCWxkIEAoUjE0LCAweDFmYyksIHI3Ci0JbGQgQChSMTUsIDB4M2MpLCByOAotCWxkIEByMTUrLCByOQotCWxkIEByMTUrLCBwcwotCWxkIEBSMTUrLCB0YnIKLQlsZCBAcjE1KywgcnAKLQlsZCBAUjE1Kywgc3NwCi0JLmdsb2JhbCBsZHVoCi1sZHVoOgotCWxkdWggQHIxMCwgcjExCi0JbGR1aCBAKHIxMywgcjEyKSwgcjEzCi0JbGR1aCBAKHIxNCwgIy0yNTYpLCByMTUKLQkuZ2xvYmFsIGxkdWIKLWxkdWI6Ci0JbGR1YiBAYWMsIGZwCi0JbGR1YiBAKHIxMywgc3ApLCByMAotCWxkdWIgQChyMTQsIC0xMjgpLCByMQotCS5nbG9iYWwgc3QKLXN0OgotCXN0IHIyLCBAcjMKLQlzdCByNCwgQChyMTMsIHI1KQotCXN0IHI2LCBAKHIxNCwgLTUxMikKLQlzdCByNywgQChyMTUsIDB4M2MpCi0Jc3QgcjgsIEAgLSByMTUKLQlzdCBNREgsIEAtcjE1Ci0Jc3QgUFMsIEAgLSByMTUKLQkuZ2xvYmFsIGxzdGgKLXN0aDoKLQlzdGggcjksIEByMTAKLQlzdGggcjExLCBAKHIxMywgcjEyKQotCXN0aCByMTMsIEAocjE0LCAxMjgpCi0JLmdsb2JhbCBzdGIKLXN0YjoKLQlTVEIgcjE0LCBAcjE1Ci0Jc3RiIHIwLCBAKHIxMywgcjEpCi0JU1RCIHIyLCBAKHIxNCwgLTEyOCkKLQkuZ2xvYmFsIG1vdgotbW92OgotCW1vdiByMywgcjQKLQlNT1YgbWRsLCByNQotCW1vdiBwcywgcjYKLQltb3YgcjcsIHVzcAotCW1vdiByOCwgcHMKLQkuZ2xvYmFsIGptcAotam1wOgotCWptcCBAcjkKLQkuZ2xvYmFsIHJldAotcmV0OgotCXJldAotCS5nbG9iYWwgYnJhCi1icmE6Ci0JYnJhIGZvb3RleHQKLQkuZ2xvYmFsIGJubwotYm5vOgotCWJubyBmb290ZXh0Ci0JLmdsb2JhbCBiZXEKLWJlcToKLQliZXEgZm9vdGV4dAotCS5nbG9iYWwgYm5lCi1ibmU6Ci0JYm5lIGZvb3RleHQKLQkuZ2xvYmFsIGJjCi1iYzoKLQliYyBmb290ZXh0Ci0JLmdsb2JhbCBibmMKLWJuYzoKLQlibmMgZm9vdGV4dAotCS5nbG9iYWwgYm4KLWJuOgotCWJuIGZvb3RleHQKLQkuZ2xvYmFsIGJwCi1icDoKLQlicCBmb290ZXh0Ci0JLmdsb2JhbCBidgotYnY6Ci0JYnYgZm9vdGV4dAotCS5nbG9iYWwgYm52Ci1ibnY6Ci0JYm52IGZvb3RleHQKLQkuZ2xvYmFsIGJsdAotYmx0OgotCWJsdCBmb290ZXh0Ci0JLmdsb2JhbCBiZ2UKLWJnZToKLQliZ2UgZm9vdGV4dAotCS5nbG9iYWwgYmxlCi1ibGU6Ci0JYmxlIGZvb3RleHQKLQkuZ2xvYmFsIGJndAotYmd0OgotCWJndCBmb290ZXh0Ci0JLmdsb2JhbCBibHMKLWJsczoKLQlibHMgZm9vdGV4dAotCS5nbG9iYWwgYmhpCi1iaGk6Ci0JYmhpIGZvb3RleHQKLWRlbGF5X2Zvb3RleHQ6CQkKLQkuZ2xvYmFsIGptcF9kCi1qbXBfZDoKLQlqbXA6ZCBAcjExCi0Jbm9wCi0JLmdsb2JhbCByZXRfZAotcmV0X2Q6Ci0JcmV0OmQKLQlub3AKLQkuZ2xvYmFsIGJyYV9kCi1icmFfZDoKLQlicmE6RCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibm9fZAotYm5vX2Q6Ci0JYm5vOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmVxX2QKLWJlcV9kOgotCWJlcTpEIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJuZV9kCi1ibmVfZDoKLQlibmU6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBiY19kCi1iY19kOgotCWJjOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYm5jX2QKLWJuY19kOgotCWJuYzpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJuX2QKLWJuX2Q6Ci0JYm46ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBicF9kCi1icF9kOgotCWJwOmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYnZfZAotYnZfZDoKLQlidjpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJudl9kCi1ibnZfZDoKLQlibnY6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBibHRfZAotYmx0X2Q6Ci0JYmx0OmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmdlX2QKLWJnZV9kOgotCWJnZTpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJsZV9kCi1ibGVfZDoKLQlibGU6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBiZ3RfZAotYmd0X2Q6Ci0JYmd0OmQgZGVsYXlfZm9vdGV4dAotCW5vcAotCS5nbG9iYWwgYmxzX2QKLWJsc19kOgotCWJsczpkIGRlbGF5X2Zvb3RleHQKLQlub3AKLQkuZ2xvYmFsIGJoaV9kCi1iaGlfZDoKLQliaGk6ZCBkZWxheV9mb290ZXh0Ci0Jbm9wCi0JLmdsb2JhbCBsZHJlcwotbGRyZXM6Ci0JbGRyZXMgQHIyKywgIzgKLQkuZ2xvYmFsIHN0cmVzCi1zdHJlczoKLQlzdHJlcyAjMTUsIEByMysKLQkuZ2xvYmFsIG5vcAotbm9wOgotCW5vcAotCS5nbG9iYWwgYW5kY2NyCi1hbmRjY3I6Ci0JYW5kY2NyICMyNTUKLQkuZ2xvYmFsIG9yY2NyCi1vcmNjcjoKLQlvcmNjciAjMTI1Ci0JLmdsb2JhbCBzdGlsbQotc3RpbG06Ci0Jc3RpbG0gIzk3Ci0JLmdsb2JhbCBhZGRzcAotYWRkc3A6Ci0JYWRkc3AgIy01MTIKLQkuZ2xvYmFsIGV4dHNiCi1leHRzYjoKLQlleHRzYiByOQotCS5nbG9iYWwgZXh0dWIKLWV4dHViOgotCWV4dHViIHIxMAotCS5nbG9iYWwgZXh0c2gKLWV4dHNoOgotCWV4dHNoIHIxMQotCS5nbG9iYWwgZXh0dWgKLWV4dHVoOgotCWV4dHVoIHIxMgotCS5nbG9iYWwgZW50ZXIKLWVudGVyOgotCWVudGVyICMxMDIwCi0JLmdsb2JhbCBsZWF2ZQotbGVhdmU6Ci0JbGVhdmUgCi0JLmdsb2JhbCB4Y2hiCi14Y2hiOgotCXhjaGIgQHIxNCwgcjE1Ci0JLmdsb2JhbCBsZGlfMzIKLWxkaV8zMjoKLQlsZGk6MzIgIzB4MTIzNDU2NzgsIHIwCi0JLmdsb2JhbCBjb3BvcAotY29wb3A6Ci0JY29wb3AgIzE1LCAjMSwgY3IzLCBjcjQKLQljb3BvcCAjMTUsICM0LCBjcjUsIGNyNgotCWNvcG9wICMxNSwgIzI1NSwgY3I3LCBjcjAKLQkuZ2xvYmFsIGNvcGxkCi1jb3BsZDoKLQljb3BsZCAjMCwgIzAsIHI0LCBjcjAKLQkuZ2xvYmFsIGNvcHN0Ci1jb3BzdDoKLQljb3BzdCAjNywgIzIsIGNyMSwgcjUKLQkuZ2xvYmFsIGNvcHN2Ci1jb3BzdjoKLQljb3BzdiAjOCwgIzMsIGNyMiwgcjYKLQkuZ2xvYmFsIGxkbTAKLWxkbTA6Ci0JbGRtMCAocjAsIHIyLCByMywgcjcpCi0JLmdsb2JhbCBsZG0xCi1sZG0xOgotCWxkbTEgKHI4LCByMTEsIHIxNSkKLQkuZ2xvYmFsIHN0bTAKLXN0bTA6Ci0Jc3RtMCAocjIsIHIzKQotCS5nbG9iYWwgc3RtMQotc3RtMToKLQlzdG0xIChyMTMsIHIxNCkKLQkuZ2xvYmFsIGNhbGwKLWNhbGw6Ci0JY2FsbCBmb290ZXh0Ci0JY2FsbCBAcjEwCi0JLmdsb2JhbCBjYWxsX2QKLWNhbGxfZDoKLQljYWxsOkQgZm9vdGV4dAotCW5vcAotCWNhbGw6ZCBAcjEyCi0Jbm9wCi0JLmdsb2JhbCBkbW92Ci1kbW92OgotCWRtb3YgQDB4ODgsIHIxMwotCWRtb3YgcjEzLCBAMHg1NAotCWRtb3YgQDB4NDQsIEByMTMrCi0JZG1vdiBAUjEzKywgQDB4MgotCWRtb3YgQDB4MmMsIEAtcjE1Ci0JZG1vdiBAcjE1KywgQDM4Ci0JLmdsb2JhbCBkbW92aAotZG1vdmg6Ci0JZG1vdmggQDB4ODgsIHIxMwotCWRtb3ZoIHIxMywgQDB4NTIKLQlkbW92aCBAMHgzNCwgQHIxMyArCi0JZG1vdmggQHIxMyssIEAweDUyCi0JLmdsb2JhbCBkbW92YgotZG1vdmI6Ci0JZG1vdmIgQDB4OTEsIHIxMwotCWRtb3ZiIHIxMywgQDB4NTMKLQlkbW92YiBANzEsIEByMTMrCi0JZG1vdmIgQHIxMyssIEAweDAKLQkuZ2xvYmFsIGxkaV8yMAotbGRpXzIwOgotIAlsZGk6MjAgIzB4MDAwZmZmZmYsIHIxCi1maW5pc2g6CQotICAgICAgICBsZGk6MzIgIzB4ODAwMCxyMAotCW1vdiAgICByMCxzc3AKLSAgICAgICAgbGRpOjMyICMxLHIwCi0JaW50ICAgICMxMAotCS5nbG9iYWwgaW50ZQotaW50ZToKLQlpbnRlCi0JLmdsb2JhbCByZXRpCi1yZXRpOgotCXJldGkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvZnIzMC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9mcjMwL2ZyMzAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI4NmIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2ZyMzAvZnIzMC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgRlIzMCB0ZXN0Y2FzZXMKLQotaWYgW2lzdGFyZ2V0IGZyMzAqLSotKl0gewotIyAgICBydW5fZHVtcF90ZXN0ICJoaWdoLTEiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDJiMGQ3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1Yi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9hZGRfc3ViOgotCWFkZC5iICMxNixyMWwKLQlhZGQuYiByMWgscjFsCi0JYWRkLncgcjEscjIKLQlhZGRzICMxLHI0Ci0JYWRkcyAjMixyNQotCWFkZHggcjBsLHIxbAotCWFkZHggIzE2LHIyaAotCXN1Yi5iIHIwbCxyMWwKLQlzdWIudyByMCxyMQotCXN1YnMgIzEscjQKLQlzdWJzICMyLHI1Ci0Jc3VieCByMGwscjFsCi0Jc3VieCAjMTYscjJoCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YmgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2FkZHN1YmgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4ODVkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYWRkX3N1YjoKLQlhZGQuYiAjMTYscjFsCi0JYWRkLmIgcjFoLHIxbAotCWFkZC53ICMzMixyMQotCWFkZC53IHIxLHIyCi0JYWRkLmwgIzY0LGVyMQotCWFkZC5sIGVyMSxlcjIKLQlhZGRzICMxLGVyNAotCWFkZHMgIzIsZXI1Ci0JYWRkcyAjNCxlcjYKLQlhZGR4IHIwbCxyMWwKLQlhZGR4ICMxNixyMmgKLQlzdWIuYiByMGwscjFsCi0Jc3ViLncgIzE2LHIxCi0Jc3ViLncgcjAscjEKLQlzdWIubCAjNjQsZXIxCi0Jc3ViLmwgZXIxLGVyMgotCXN1YnMgIzEsZXI0Ci0Jc3VicyAjMixlcjUKLQlzdWJzICM0LGVyNgotCXN1YnggcjBsLHIxbAotCXN1YnggIzE2LHIyaAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9hZGRzdWJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjM2OTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYWRkc3Vicy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2FkZF9zdWI6Ci0JYWRkLmIgIzE2LHIxbAotCWFkZC5iIHIxaCxyMWwKLQlhZGQudyAjMzIscjEKLQlhZGQudyByMSxyMgotCWFkZC5sICM2NCxlcjEKLQlhZGQubCBlcjEsZXIyCi0JYWRkcyAjMSxlcjQKLQlhZGRzICMyLGVyNQotCWFkZHMgIzQsZXI2Ci0JYWRkeCByMGwscjFsCi0JYWRkeCAjMTYscjJoCi0Jc3ViLmIgcjBsLHIxbAotCXN1Yi53ICMxNixyMQotCXN1Yi53IHIwLHIxCi0Jc3ViLmwgIzY0LGVyMQotCXN1Yi5sIGVyMSxlcjIKLQlzdWJzICMxLGVyNAotCXN1YnMgIzIsZXI1Ci0Jc3VicyAjNCxlcjYKLQlzdWJ4IHIwbCxyMWwKLQlzdWJ4ICMxNixyMmgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEwN2ExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczEucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkudGV4dAotaDgzMDBfYml0X29wc18xOgotCWJhbmQgIzAscjBsCi0JYmFuZCAjMCxAcjAKLQliYW5kICMwLEA2NDo4Ci0JYmNsciAjMCxyMGwKLQliY2xyICMwLEByMAotCWJjbHIgIzAsQDY0OjgKLQliY2xyIHIxbCxyMGwKLQliY2xyIHIxbCxAcjAKLQliY2xyIHIxbCxANjQ6OAotCWJpYW5kICMwLHIwbAotCWJpYW5kICMwLEByMAotCWJpYW5kICMwLEA2NDo4Ci0JYmlsZCAjMCxyMGwKLQliaWxkICMwLEByMAotCWJpbGQgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMWgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzlhNTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMWgucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9iaXRfb3BzXzE6Ci0JYmFuZCAjMCxyMGwKLQliYW5kICMwLEBlcjAKLQliYW5kICMwLEA2NDo4Ci0JYmNsciAjMCxyMGwKLQliY2xyICMwLEBlcjAKLQliY2xyICMwLEA2NDo4Ci0JYmNsciByMWwscjBsCi0JYmNsciByMWwsQGVyMAotCWJjbHIgcjFsLEA2NDo4Ci0JYmlhbmQgIzAscjBsCi0JYmlhbmQgIzAsQGVyMAotCWJpYW5kICMwLEA2NDo4Ci0JYmlsZCAjMCxyMGwKLQliaWxkICMwLEBlcjAKLQliaWxkICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMxcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjU5OWQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczFzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYml0X29wc18xOgotCWJhbmQgIzAscjBsCi0JYmFuZCAjMCxAZXIwCi0JYmFuZCAjMCxANjQ6OAotCWJhbmQgIzAsQDEyODoxNgotCWJhbmQgIzAsQDY1NTM2OjMyCi0JYmNsciAjMCxyMGwKLQliY2xyICMwLEBlcjAKLQliY2xyICMwLEA2NDo4Ci0JYmNsciAjMCxAMTI4OjE2Ci0JYmNsciAjMCxANjU1MzY6MzIKLQliY2xyIHIxbCxyMGwKLQliY2xyIHIxbCxAZXIwCi0JYmNsciByMWwsQDY0OjgKLQliY2xyIHIxbCxAMTI4OjE2Ci0JYmNsciByMWwsQDY1NTM2OjMyCi0JYmlhbmQgIzAscjBsCi0JYmlhbmQgIzAsQGVyMAotCWJpYW5kICMwLEA2NDo4Ci0JYmlhbmQgIzAsQDEyODoxNgotCWJpYW5kICMwLEA2NTUzNjozMgotCWJpbGQgIzAscjBsCi0JYmlsZCAjMCxAZXIwCi0JYmlsZCAjMCxANjQ6OAotCWJpbGQgIzAsQDEyODoxNgotCWJpbGQgIzAsQDY1NTM2OjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5NmU1YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX2JpdF9vcHNfMjoKLQliaW9yICMwLHIwbAotCWJpb3IgIzAsQHIwCi0JYmlvciAjMCxANjQ6OAotCWJpc3QgIzAscjBsCi0JYmlzdCAjMCxAcjAKLQliaXN0ICMwLEA2NDo4Ci0JYml4b3IgIzAscjBsCi0JYml4b3IgIzAsQHIwCi0JYml4b3IgIzAsQDY0OjgKLQlibGQgIzAscjBsCi0JYmxkICMwLEByMAotCWJsZCAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMmgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJiZTc0ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMyaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2JpdF9vcHNfMjoKLQliaW9yICMwLHIwbAotCWJpb3IgIzAsQGVyMAotCWJpb3IgIzAsQDY0OjgKLQliaXN0ICMwLHIwbAotCWJpc3QgIzAsQGVyMAotCWJpc3QgIzAsQDY0OjgKLQliaXhvciAjMCxyMGwKLQliaXhvciAjMCxAZXIwCi0JYml4b3IgIzAsQDY0OjgKLQlibGQgIzAscjBsCi0JYmxkICMwLEBlcjAKLQlibGQgIzAsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NzA1MjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzMnMucworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19iaXRfb3BzXzI6Ci0JYmlvciAjMCxyMGwKLQliaW9yICMwLEBlcjAKLQliaW9yICMwLEA2NDo4Ci0JYmlvciAjMCxAMTI4OjE2Ci0JYmlvciAjMCxANjU1MzY6MzIKLQliaXN0ICMwLHIwbAotCWJpc3QgIzAsQGVyMAotCWJpc3QgIzAsQDY0OjgKLQliaXN0ICMwLEAxMjg6MTYKLQliaXN0ICMwLEA2NTUzNjozMgotCWJpeG9yICMwLHIwbAotCWJpeG9yICMwLEBlcjAKLQliaXhvciAjMCxANjQ6OAotCWJpeG9yICMwLEAxMjg6MTYKLQliaXhvciAjMCxANjU1MzY6MzIKLQlibGQgIzAscjBsCi0JYmxkICMwLEBlcjAKLQlibGQgIzAsQDY0OjgKLQlibGQgIzAsQDEyODoxNgotCWJsZCAjMCxANjU1MzY6MzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjOWJmYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX2JpdF9vcHNfMzoKLQlibm90ICMwLHIwbAotCWJub3QgIzAsQHIwCi0JYm5vdCAjMCxANjQ6OAotCWJub3QgcjFsLHIwbAotCWJub3QgcjFsLEByMAotCWJub3QgcjFsLEA2NDo4Ci0JYnNldCAjMCxyMGwKLQlic2V0ICMwLEByMAotCWJzZXQgIzAsQDY0OjgKLQlic2V0IHIxbCxyMGwKLQlic2V0IHIxbCxAcjAKLQlic2V0IHIxbCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlZGE2MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHMzaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2JpdF9vcHNfMzoKLQlibm90ICMwLHIwbAotCWJub3QgIzAsQGVyMAotCWJub3QgIzAsQDY0OjgKLQlibm90IHIxbCxyMGwKLQlibm90IHIxbCxAZXIwCi0JYm5vdCByMWwsQDY0OjgKLQlic2V0ICMwLHIwbAotCWJzZXQgIzAsQGVyMAotCWJzZXQgIzAsQDY0OjgKLQlic2V0IHIxbCxyMGwKLQlic2V0IHIxbCxAZXIwCi0JYnNldCByMWwsQDY0OjgKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczNzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNjRlMDYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzM3MucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19iaXRfb3BzXzM6Ci0JYm5vdCAjMCxyMGwKLQlibm90ICMwLEBlcjAKLQlibm90ICMwLEA2NDo4Ci0JYm5vdCAjMCxAMTI4OjE2Ci0JYm5vdCAjMCxANjU1MzY6MzIKLQlibm90IHIxbCxyMGwKLQlibm90IHIxbCxAZXIwCi0JYm5vdCByMWwsQDY0OjgKLQlibm90IHIxbCxAMTI4OjE2Ci0JYm5vdCByMWwsQDY1NTM2OjMyCi0JYnNldCAjMCxyMGwKLQlic2V0ICMwLEBlcjAKLQlic2V0ICMwLEA2NDo4Ci0JYnNldCAjMCxAMTI4OjE2Ci0JYnNldCAjMCxANjU1MzY6MzIKLQlic2V0IHIxbCxyMGwKLQlic2V0IHIxbCxAZXIwCi0JYnNldCByMWwsQDY0OjgKLQlic2V0IHIxbCxAMTI4OjE2Ci0JYnNldCByMWwsQDY1NTM2OjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlNjZkOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLnRleHQKLWg4MzAwX2JpdF9vcHNfNDoKLQlib3IgIzAscjBsCi0JYm9yICMwLEByMAotCWJvciAjMCxANjQ6OAotCWJzdCAjMCxyMGwKLQlic3QgIzAsQHIwCi0JYnN0ICMwLEA2NDo4Ci0JYnRzdCAjMCxyMGwKLQlidHN0ICMwLEByMAotCWJ0c3QgIzAsQDY0OjgKLQlidHN0IHIxbCxyMGwKLQlidHN0IHIxbCxAcjAKLQlidHN0IHIxbCxANjQ6OAotCWJ4b3IgIzAscjBsCi0JYnhvciAjMCxAcjAKLQlieG9yICMwLEA2NDo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0aC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM1ZTE3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JpdG9wczRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYml0X29wc180OgotCWJvciAjMCxyMGwKLQlib3IgIzAsQGVyMAotCWJvciAjMCxANjQ6OAotCWJzdCAjMCxyMGwKLQlic3QgIzAsQGVyMAotCWJzdCAjMCxANjQ6OAotCWJ0c3QgIzAscjBsCi0JYnRzdCAjMCxAZXIwCi0JYnRzdCAjMCxANjQ6OAotCWJ0c3QgcjFsLHIwbAotCWJ0c3QgcjFsLEBlcjAKLQlidHN0IHIxbCxANjQ6OAotCWJ4b3IgIzAscjBsCi0JYnhvciAjMCxAZXIwCi0JYnhvciAjMCxANjQ6OAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0cy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvYml0b3BzNHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmNDdiNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9iaXRvcHM0cy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2JpdF9vcHNfNDoKLQlib3IgIzAscjBsCi0JYm9yICMwLEBlcjAKLQlib3IgIzAsQDY0OjgKLQlib3IgIzAsQDEyODoxNgotCWJvciAjMCxANjU1MzY6MzIKLQlic3QgIzAscjBsCi0JYnN0ICMwLEBlcjAKLQlic3QgIzAsQDY0OjgKLQlic3QgIzAsQDEyODoxNgotCWJzdCAjMCxANjU1MzY6MzIKLQlidHN0ICMwLHIwbAotCWJ0c3QgIzAsQGVyMAotCWJ0c3QgIzAsQDY0OjgKLQlidHN0ICMwLEAxMjg6MTYKLQlidHN0ICMwLEA2NTUzNjozMgotCWJ0c3QgcjFsLHIwbAotCWJ0c3QgcjFsLEBlcjAKLQlidHN0IHIxbCxANjQ6OAotCWJ0c3QgcjFsLEAxMjg6MTYKLQlidHN0IHIxbCxANjU1MzY6MzIKLQlieG9yICMwLHIwbAotCWJ4b3IgIzAsQGVyMAotCWJ4b3IgIzAsQDY0OjgKLQlieG9yICMwLEAxMjg6MTYKLQlieG9yICMwLEA2NTUzNjozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTgwNjE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9icmFuY2hlczoKLQlic3IgaDgzMDBfYnJhbmNoZXMKLQlqbXAgaDgzMDBfYnJhbmNoZXMKLQlqbXAgQHIwCi0Jam1wIEBAMTY6OAotCWpzciBoODMwMF9icmFuY2hlcwotCWpzciBAcjAKLQlqc3IgQEAxNjo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiYzYyZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfYnJhbmNoZXM6Ci0JYnNyIGg4MzAwaF9icmFuY2hlczo4Ci0JYnNyIGg4MzAwaF9icmFuY2hlczoxNgotCWptcCBoODMwMGhfYnJhbmNoZXMKLQlqbXAgQGVyMAotCWptcCBAQDE2OjgKLQlqc3IgaDgzMDBoX2JyYW5jaGVzCi0JanNyIEBlcjAKLQlqc3IgQEAxNjo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2JyYW5jaHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzM2UxNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9icmFuY2hzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfYnJhbmNoZXM6Ci0JYnNyIGg4MzAwc19icmFuY2hlczo4Ci0JYnNyIGg4MzAwc19icmFuY2hlczoxNgotCWptcCBoODMwMHNfYnJhbmNoZXMKLQlqbXAgQGVyMAotCWptcCBAQDE2OjgKLQlqc3IgaDgzMDBzX2JyYW5jaGVzCi0JanNyIEBlcjAKLQlqc3IgQEAxNjo4Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzZDUzZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0JLnRleHQKLWg4MzAwX2NicmFuY2g6Ci0JYnJhIGg4MzAwX2NicmFuY2gKLQlidCBoODMwMF9jYnJhbmNoCi0JYnJuIGg4MzAwX2NicmFuY2gKLQliZiBoODMwMF9jYnJhbmNoCi0JYmhpIGg4MzAwX2NicmFuY2gKLQlibHMgaDgzMDBfY2JyYW5jaAotCWJjYyBoODMwMF9jYnJhbmNoCi0JYmhzIGg4MzAwX2NicmFuY2gKLQliY3MgaDgzMDBfY2JyYW5jaAotCWJsbyBoODMwMF9jYnJhbmNoCi0JYm5lIGg4MzAwX2NicmFuY2gKLQliZXEgaDgzMDBfY2JyYW5jaAotCWJ2YyBoODMwMF9jYnJhbmNoCi0JYnZzIGg4MzAwX2NicmFuY2gKLQlicGwgaDgzMDBfY2JyYW5jaAotCWJtaSBoODMwMF9jYnJhbmNoCi0JYmdlIGg4MzAwX2NicmFuY2gKLQlibHQgaDgzMDBfY2JyYW5jaAotCWJndCBoODMwMF9jYnJhbmNoCi0JYmxlIGg4MzAwX2NicmFuY2gKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NicmFuY2hoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NGUxYTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaGgucworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLQkudGV4dAotCS5oODMwMGgKLWg4MzAwaF9jYnJhbmNoOgotCWJyYSBoODMwMGhfY2JyYW5jaDo4Ci0JYnQgaDgzMDBoX2NicmFuY2g6OAotCWJybiBoODMwMGhfY2JyYW5jaDo4Ci0JYmYgaDgzMDBoX2NicmFuY2g6OAotCWJoaSBoODMwMGhfY2JyYW5jaDo4Ci0JYmxzIGg4MzAwaF9jYnJhbmNoOjgKLQliY2MgaDgzMDBoX2NicmFuY2g6OAotCWJocyBoODMwMGhfY2JyYW5jaDo4Ci0JYmNzIGg4MzAwaF9jYnJhbmNoOjgKLQlibG8gaDgzMDBoX2NicmFuY2g6OAotCWJuZSBoODMwMGhfY2JyYW5jaDo4Ci0JYmVxIGg4MzAwaF9jYnJhbmNoOjgKLQlidmMgaDgzMDBoX2NicmFuY2g6OAotCWJ2cyBoODMwMGhfY2JyYW5jaDo4Ci0JYnBsIGg4MzAwaF9jYnJhbmNoOjgKLQlibWkgaDgzMDBoX2NicmFuY2g6OAotCWJnZSBoODMwMGhfY2JyYW5jaDo4Ci0JYmx0IGg4MzAwaF9jYnJhbmNoOjgKLQliZ3QgaDgzMDBoX2NicmFuY2g6OAotCWJsZSBoODMwMGhfY2JyYW5jaDo4Ci0JYnJhIGg4MzAwaF9jYnJhbmNoOjE2Ci0JYnQgaDgzMDBoX2NicmFuY2g6MTYKLQlicm4gaDgzMDBoX2NicmFuY2g6MTYKLQliZiBoODMwMGhfY2JyYW5jaDoxNgotCWJoaSBoODMwMGhfY2JyYW5jaDoxNgotCWJscyBoODMwMGhfY2JyYW5jaDoxNgotCWJjYyBoODMwMGhfY2JyYW5jaDoxNgotCWJocyBoODMwMGhfY2JyYW5jaDoxNgotCWJjcyBoODMwMGhfY2JyYW5jaDoxNgotCWJsbyBoODMwMGhfY2JyYW5jaDoxNgotCWJuZSBoODMwMGhfY2JyYW5jaDoxNgotCWJlcSBoODMwMGhfY2JyYW5jaDoxNgotCWJ2YyBoODMwMGhfY2JyYW5jaDoxNgotCWJ2cyBoODMwMGhfY2JyYW5jaDoxNgotCWJwbCBoODMwMGhfY2JyYW5jaDoxNgotCWJtaSBoODMwMGhfY2JyYW5jaDoxNgotCWJnZSBoODMwMGhfY2JyYW5jaDoxNgotCWJsdCBoODMwMGhfY2JyYW5jaDoxNgotCWJndCBoODMwMGhfY2JyYW5jaDoxNgotCWJsZSBoODMwMGhfY2JyYW5jaDoxNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNocy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY2JyYW5jaHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyMjJlYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jYnJhbmNocy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCS50ZXh0Ci0JLmg4MzAwcwotaDgzMDBzX2NicmFuY2g6Ci0JYnJhIGg4MzAwc19jYnJhbmNoOjgKLQlidCBoODMwMHNfY2JyYW5jaDo4Ci0JYnJuIGg4MzAwc19jYnJhbmNoOjgKLQliZiBoODMwMHNfY2JyYW5jaDo4Ci0JYmhpIGg4MzAwc19jYnJhbmNoOjgKLQlibHMgaDgzMDBzX2NicmFuY2g6OAotCWJjYyBoODMwMHNfY2JyYW5jaDo4Ci0JYmhzIGg4MzAwc19jYnJhbmNoOjgKLQliY3MgaDgzMDBzX2NicmFuY2g6OAotCWJsbyBoODMwMHNfY2JyYW5jaDo4Ci0JYm5lIGg4MzAwc19jYnJhbmNoOjgKLQliZXEgaDgzMDBzX2NicmFuY2g6OAotCWJ2YyBoODMwMHNfY2JyYW5jaDo4Ci0JYnZzIGg4MzAwc19jYnJhbmNoOjgKLQlicGwgaDgzMDBzX2NicmFuY2g6OAotCWJtaSBoODMwMHNfY2JyYW5jaDo4Ci0JYmdlIGg4MzAwc19jYnJhbmNoOjgKLQlibHQgaDgzMDBzX2NicmFuY2g6OAotCWJndCBoODMwMHNfY2JyYW5jaDo4Ci0JYmxlIGg4MzAwc19jYnJhbmNoOjgKLQlicmEgaDgzMDBzX2NicmFuY2g6MTYKLQlidCBoODMwMHNfY2JyYW5jaDoxNgotCWJybiBoODMwMHNfY2JyYW5jaDoxNgotCWJmIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmhpIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmxzIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmNjIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmhzIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmNzIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmxvIGg4MzAwc19jYnJhbmNoOjE2Ci0JYm5lIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmVxIGg4MzAwc19jYnJhbmNoOjE2Ci0JYnZjIGg4MzAwc19jYnJhbmNoOjE2Ci0JYnZzIGg4MzAwc19jYnJhbmNoOjE2Ci0JYnBsIGg4MzAwc19jYnJhbmNoOjE2Ci0JYm1pIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmdlIGg4MzAwc19jYnJhbmNoOjE2Ci0JYmx0IGg4MzAwc19jYnJhbmNoOjE2Ci0JYmd0IGg4MzAwc19jYnJhbmNoOjE2Ci0JYmxlIGg4MzAwc19jYnJhbmNoOjE2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NtcHNpMi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY21wc2kyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmN2YwM2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY21wc2kyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIDEgImxpYmdjYzEuUyIKLTs7IGxpYmdjYzEgcm91dGluZXMgZm9yIHRoZSBIaXRhY2hpIGg4LzMwMCBjcHUuCi07OyBDb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbi4KLTs7IHNhY0BjeWdudXMuY29tCi0JLnNlY3Rpb24gLnRleHQKLQkuYWxpZ24gMgotCS5nbG9iYWwgX19fY21wc2kyCi1fX19jbXBzaTI6Ci0JY21wLncJcjIgLHIwIAotCWJuZQkuTDIKLQljbXAudwlyMyAscjEgCi0JYm5lCS5MMgotCW1vdi53CSMxLHIwIAotCXJ0cwotLkwyOgotCWNtcC53CXIwICxyMiAKLQliZ3QJLkw0Ci0JYm5lCS5MMwotCWNtcC53CXIxICxyMyAKLQlibHMJLkwzCi0uTDQ6Ci0Jc3ViLncJcjAgLHIwIAotCXJ0cwotLkwzOgotCW1vdi53CSMyLHIwIAotLkw1OgotCXJ0cwotCS5lbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2NvbXBhcmUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjMWE0MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLQkudGV4dAotaDgzMDBfY21wOgotCWNtcC5iICMwLHIwbAotCWNtcC5iIHIwaCxyMGwKLQljbXAudyByMCxyMQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZWgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxZTg4ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2NtcDoKLQljbXAuYiAjMCxyMGwKLQljbXAuYiByMGgscjBsCi0JY21wLncgIzMyLHIwCi0JY21wLncgcjAscjEKLQljbXAubCAjNjQsZXIwCi0JY21wLmwgZXIwLGVyMQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvY29tcGFyZXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzZjNmZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9jb21wYXJlcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2NtcDoKLQljbXAuYiAjMCxyMGwKLQljbXAuYiByMGgscjBsCi0JY21wLncgIzMyLHIwCi0JY21wLncgcjAscjEKLQljbXAubCAjNjQsZXIwCi0JY21wLmwgZXIwLGVyMQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kZWNpbWFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGMwYTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX2RlY2ltYWw6Ci0JZGFhIHIwbAotCWRhcyByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTI0MDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbGgucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2RlY2ltYWw6Ci0JZGFhIHIwbAotCWRhcyByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2RlY2ltYWxzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ODAyZmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGVjaW1hbHMucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX2RlY2ltYWw6Ci0JZGFhIHIwbAotCWRhcyByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzczNzJjZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWwucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9kaXZfbXVsOgotCWRpdnh1IHIwbCxyMQotCW11bHh1IHIwbCxyMQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjBmOGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVsaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2Rpdl9tdWw6Ci0JZGl2eHUuYiByMGwscjEKLQlkaXZ4dS53IHIwLGVyMQotCWRpdnhzLmIgcjBsLHIxCi0JZGl2eHMudyByMCxlcjEKLQltdWx4dS5iIHIwbCxyMQotCW11bHh1LncgcjAsZXIxCi0JbXVseHMuYiByMGwscjEKLQltdWx4cy53IHIwLGVyMQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9kaXZtdWxzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjBmOGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZGl2bXVscy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2Rpdl9tdWw6Ci0JZGl2eHUuYiByMGwscjEKLQlkaXZ4dS53IHIwLGVyMQotCWRpdnhzLmIgcjBsLHIxCi0JZGl2eHMudyByMCxlcjEKLQltdWx4dS5iIHIwbCxyMQotCW11bHh1LncgcjAsZXIxCi0JbXVseHMuYiByMGwscjEKLQltdWx4cy53IHIwLGVyMQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzRjODMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZXh0ZW5kaC5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfZXh0ZW5kOgotCWV4dHMudyByMAotCWV4dHMubCBlcjAKLQlleHR1LncgcjAKLQlleHR1LmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2V4dGVuZHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI2ZTliYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9leHRlbmRzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19leHRlbmQ6Ci0JZXh0cy53IHIwCi0JZXh0cy5sIGVyMAotCWV4dHUudyByMAotCWV4dHUubCBlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2ZmeHgxLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNDU1ZDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEuZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNvYmpkdW1wOiAtLXByZWZpeC1hZGRyZXNzZXMgLWRyCi0jbmFtZTogRkZ4eDEKLQotIyBUZXN0IGZvciBGRnh4OjggYWRkcmVzc2luZy4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKmg4MzAwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQkuLi4KLQkJCTA6IDE2CW1haW4KLTArMDQwMCA8bWFpbj4gZjggN2YgICAgICAgICAgICAgbW92LmIJIzB4N2YscjBsCi0wKzA0MDIgPG1haW5bK10oMHh8KTI+IDI4IGJiICAgICAgICAgICAgIG1vdi5iCUAweGJiOjgscjBsCi0wKzA0MDQgPG1haW5bK10oMHh8KTQ+IDZhIDg4IGZmIGI5ICAgICAgIG1vdi5iCXIwbCxAMHhmZmI5OjE2Ci0wKzA0MDggPG1haW5bK10oMHh8KTg+IGY4IDAxICAgICAgICAgICAgIG1vdi5iCSMweDEscjBsCi0wKzA0MGEgPGxvb3A+IDZhIDg4IGZmIGJiICAgICAgIG1vdi5iCXIwbCxAMHhmZmJiOjE2Ci0wKzA0MGUgPGRlbGF5PiA3OSAwMSAwMCAwMCAgICAgICBtb3YudwkjMHgwLHIxCi0wKzA0MTIgPGRlbG9vcD4gMGIgMDEgICAgICAgICAgICAgYWRkcwkjMHgxLGVyMQotMCswNDE0IDxkZWxvb3BbK10oMHh8KTI+IDQ2IDAwICAgICAgICAgICAgIGJuZQkuMCBcKDQxNlwpCi0JCQk0MTU6IERJU1A4CWRlbG9vcFsrXTB4ZmZmZmZmZmYKLTArMDQxNiA8ZGVsb29wWytdKDB4fCk0PiAxMiA4OCAgICAgICAgICAgICByb3RsCXIwbAotMCswNDE4IDxkZWxvb3BbK10oMHh8KTY+IDQwIDAwICAgICAgICAgICAgIGJyYQkuMCBcKDQxYVwpCi0JCQk0MTk6IERJU1A4CWxvb3BbK10weGZmZmZmZmZmCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvZmZ4eDEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmYzg0MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9mZnh4MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS5lcXUgICAgcDZkZHIsICAweGZmYjkgICAgICAgICAgOzB4N2YgZm9yIG91dHB1dCAKLQkuZXF1ICAgIHA2ZHIsICAgIDB4ZmZiYgotCS5lcXUgICAgc2VlZCwgICAgMHgwMQotCS50ZXh0Ci0JLm9yZyAgICAwCi1yZXNldDogIC53b3JkICAgbWFpbiAgICAgICAgICAgIDtyZXNldCB2ZWN0b3IgCi07Ci0JLm9yZyAgICAweDQwMAotbWFpbjogICBtb3YuYiAgICMweDdmLHIwbCAgICAgICA7cG9ydCA2IGRkciA9IDdGIAotCW1vdi5iICAgQDB4ZmZiYjo4LHIwbCAgIDsqKip0ZXN0KioqCi0JbW92LmIgICByMGwsQHA2ZGRyOjE2Ci07Ci0JbW92LmIgICAjc2VlZCxyMGwgICAgICAgO3N0YXJ0IHdpdGggMDAwMDAwMQotbG9vcDogICBtb3YuYiAgIHIwbCxAcDZkcjoxNiAgICA7b3V0cHV0IHRvIHBvcnQgNiAKLWRlbGF5OiAgbW92LncgICAjMHgwMDAwLHIxCi1kZWxvb3A6IGFkZHMudyAgIzEscjEKLQlibmUgICAgIGRlbG9vcDo4ICAgICAgICA7bm90ID0gMAotCXJvdGwgICAgcjBsCi0gICAgICAgIGJyYSAgICAgbG9vcDo4Ci0JLndvcmQJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaDgzMDAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaDgzMDAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjdkNDFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2g4MzAwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxODMgKzAsMCBAQAotIwotIyBTb21lIEg4LzMwMCB0ZXN0cwotIwotcHJvYyBkb19oODMwMF9hZGRfc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZHN1Yi5zOiBoODMwMCBhZGQvc3ViIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkc3ViLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA4OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDgxOVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDA5MTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAwQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMEI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDBFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA5MjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTg4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDE5MDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAxQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMUI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDFFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCBCMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2FsLnM6IGg4MzAwIGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBFOTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTY5MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDA2MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiBDODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMTQ5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDA0MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyBEODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMTU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDA1MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAxNzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMTcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2NicmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiY2JyYW5jaC5zOiBoODMwMCBjb25kaXRpb25hbCBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjYnJhbmNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNDIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDQzMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNDYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDQ3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA0ODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNDkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDRBMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA0QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNEMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDREMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA0RTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNEYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2JpdG9wczEge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMS5zOiBoODMwMCBiaXRvcHMgdGVzdHMgIzEiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHMxLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDcyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNjI5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdEMDA2MjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0Y0MDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3Njg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0MwMDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RTQwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDc3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSA3QzAwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDdFNDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfYml0b3BzMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMyLnM6IGg4MzAwIGJpdG9wcyB0ZXN0cyAjMiIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczIucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc0ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3NTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0MwMDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RTQwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfYml0b3BzMyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMzLnM6IGg4MzAwIGJpdG9wcyB0ZXN0cyAjMyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDcxMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3RDAwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdGNDA3MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjE5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3MDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0QwMDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RjQwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDYwOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3RDAwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdGNDA2MDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfYml0b3BzNCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHM0LnM6IGg4MzAwIGJpdG9wcyB0ZXN0cyAjNCIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc0MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3MzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0MwMDczMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RTQwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDYzOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNzUwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDdDMDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgN0U0MDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9icmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoLnM6IGg4MzAwIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJyYW5jaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNTUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDVBMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNTkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDVCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA1RTAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDVEMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA1RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9jb21wYXJlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbXBhcmUuczogaDgzMDAgY29tcGFyZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbXBhcmUucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEE4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgMUQwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfZGVjaW1hbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkZWNpbWFsLnM6IGg4MzAwIGRlY2ltYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkZWNpbWFsLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUYwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2luY2RlYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbmNkZWMuczogaDgzMDAgaW5jZGVjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaW5jZGVjLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMEEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX2Rpdm11bCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJkaXZtdWwuczogaDgzMDAgZGl2bXVsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGl2bXVsLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA1MTgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNTA4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAibWlzYy5zOiBoODMwMCBtaXNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWlzYy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgN0I1QzU5OEZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwNzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMDMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA1NjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNTQ3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDAxODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLSAgICBzZXR1cF94ZmFpbCAiaDgzMDAqLSotKiIKLSAgICBmYWlsICJoODMwMCBtb3ZmcGUvbW92dHBlIHRlc3RzIgotfQotCi1wcm9jIGRvX2g4MzAwX21vdmIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92Yi5zOiBoODMwMCBtb3ZiIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92Yi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEM4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIEY4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA2ODE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNkUxODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2QzE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDZBMDgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNjg5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDZFOTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggNkM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDM4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyA2QTg4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9tb3Z3IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdncuczogaDgzMDAgbW92dyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdncucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3OTAwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2RjEwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDZEMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA2QjAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2RjkwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDZEOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QjgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMF9wdXNocG9wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInB1c2hwb3AuczogaDgzMDAgcHVzaHBvcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInB1c2hwb3AucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBfcm90YXRlX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJvdHNoLnM6IGg4MzAwIHJvdGF0ZSBhbmQgc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJyb3RzaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMTI4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDEzODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxMjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMTMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDEwODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAxMTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMTAwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDExMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfYWRkX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhZGRzdWJoLnM6IGg4MzAwaCBhZGQvc3ViIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkc3ViaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgODkxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDA4MTlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3OTExMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDA5MTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3QTExMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgMEE5MlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDBCMDRcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAwQjg1XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMEI5NlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDBFODlcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA5MjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMTg4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc5MzEwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgMTkwMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdBMzEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYSAxQTkyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgMUIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDFCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAxQjk2XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMUU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IEIyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2FsaC5zOiBoODMwMGggbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWxoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCBFOTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMTY5MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5NjEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNjYxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBNjEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMUYwNjYxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDA2MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiBDODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggMTQ5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDc5NDEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjQxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdBNDEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAwMUYwNjQxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDA0MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyBEODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMTU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDc5NTEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNjUxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdBNTEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyAwMUYwNjUxMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDA1MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAxNzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgMTc5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDE3QjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCAxNzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgMTcxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDE3MzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfY2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjYnJhbmNoaC5zOiBoODMwMGggY29uZGl0aW9uYWwgYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY2JyYW5jaGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDQwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNDEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA0MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNDMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDQ0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwZSA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNDUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA0NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNDcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDQ4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA0OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgNEEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDRCMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA0QzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNEQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDRFMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA0RjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNTgwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyA1ODAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDU4MTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNTgxMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzOCA1ODIwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNjIDU4MzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNTg0MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NCA1ODQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDU4NTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGMgNTg1MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MCA1ODYwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU0IDU4NzAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNTg4MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1YyA1ODkwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDU4QTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjQgNThCMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2OCA1OEMwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZjIDU4RDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzAgNThFMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA3NCA1OEYwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDQwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotcHJvYyBkb19oODMwMGhfYml0b3BzMSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMxaC5zOiBoODMwMGggYml0b3BzIHRlc3RzICMxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMWgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc2MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNzIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA3MjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA2Mjk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0QwMDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RjQwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc2ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA3NjgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNzc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDdDMDA3NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgN0U0MDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfYml0b3BzMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMyaC5zOiBoODMwMGggYml0b3BzIHRlc3RzICMyIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMmgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc0ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNjc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDdEMDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgN0Y0MDY3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCA3NTg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgN0MwMDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RTQwNzU4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDc3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA3QzAwNzcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI0IDdFNDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2JpdG9wczMge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzM2guczogaDgzMDBoIGJpdG9wcyB0ZXN0cyAjMyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3MTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0QwMDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RjQwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDYxOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3RDAwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDdGNDA2MTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNzAwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDdEMDA3MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0Y0MDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA2MDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgN0QwMDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3RjQwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9iaXRvcHM0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdG9wczRoLnM6IGg4MzAwaCBiaXRvcHMgdGVzdHMgIzQiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiaXRvcHM0aC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNzQwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDdDMDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgN0U0MDc0MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA2NzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgN0QwMDY3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCA3RjQwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDczMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA3QzAwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDdFNDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNjM5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDdDMDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0U0MDYzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCA3NTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgN0MwMDc1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA3RTQwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9icmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNoaC5zOiBoODMwMGggYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNoaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNTUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDVDMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNUEwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA1OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNUIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDVFMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNUQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDVGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9jb21wYXJlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbXBhcmVoLnM6IGg4MzAwaCBjb21wYXJlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29tcGFyZWgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEE4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzkyMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0EyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDFGODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9kZWNpbWFsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRlY2ltYWxoLnM6IGg4MzAwaCBkZWNpbWFsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGVjaW1hbGgucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX2luY2RlYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbmNkZWNoLnM6IGg4MzAwaCBpbmNkZWMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbmNkZWNoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUI1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDFCRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxQjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMUJGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDBBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwQjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMEJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDBCNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwQkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9kaXZtdWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGl2bXVsaC5zOiBoODMwMGggZGl2bXVsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGl2bXVsaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNTE4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDUzMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwMUQwNTE4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxRDA1MzAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNTA4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDUyMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMUMwNTA4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDAxQzA1MjAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBoX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAibWlzY2guczogaDgzMDBoIG1pc2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtaXNjaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgN0I1QzU5OEZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3QkQ0NTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDA3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMDE0MDY5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMTQwNkYwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgMDE0MDc4MDBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDAxNDA2RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgMDE0MDZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDAxNDA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDU2NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA1NDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMDE4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDAyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyAwMTQwNjk4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDAxNDA2RjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NiAwMTQwNzgwMFxbXlxuXF0qXG4gK1xbMC05XF0rICs2QkEwMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgMDE0MDZEODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCAwMTQwNkI4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWEgMDE0MDZCQTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0KLSAgICBzZXR1cF94ZmFpbCAiaDgzMDAqLSotKiIKLSAgICBmYWlsICJoODMwMGggbW92ZnBlL21vdnRwZSB0ZXN0cyIKLX0KLQotcHJvYyBkb19oODMwMGhfbW92YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZiaC5zOiBoODMwMGggbW92YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmJoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwQzg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgRjgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDY4MThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2RTE4MDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDc4MTA2QTI4XFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNkMxOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDI4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA2QTA4MDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZBMjgwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA2ODk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkU5ODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA3ODEwNkFBOFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDZDOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCAzODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgNkE4ODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA2QUE4MDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDE2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9tb3Z3IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdndoLnM6IGg4MzAwaCBtb3Z3IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92d2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3OTAwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDY5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2RjEwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBjIDc4MTA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDZCMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDY5OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiA2RjkwMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDc4MTA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDZCODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfbW92bCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZsaC5zOiBoODMwMGggbW92bCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmxoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRjgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0EwMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxMDA2OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMDEwMDZGMTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDAxMDA3ODEwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAwMTAwNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDAxMDA2QjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAwMTAwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDAxMDA2OTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMDEwMDZGOTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDAxMDA3ODkwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAwMTAwNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDAxMDA2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyAwMTAwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfcHVzaHBvcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXNocG9waC5zOiBoODMwMGggcHVzaHBvcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInB1c2hwb3BoLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA2RDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDEwMDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEwMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfcm90YXRlX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJvdHNoaC5zOiBoODMwMGggcm90YXRlIGFuZCBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInJvdHNoaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMTI4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDEyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxMkIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMTM4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDEzOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAxM0IwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMTIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDEyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAxMjMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMTMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDEzMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAxMzMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggMTA4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDEwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAxMEIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgMTE4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDExOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiAxMUIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgMTAwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDEwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCAxMDMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMTEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDExMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxMTMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDI0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwaF9leHRlbmQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0ZW5kaC5zOiBoODMwMGggZXh0ZW5kIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0ZW5kaC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMTdEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE3RjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxNzUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMTc3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19hZGRfc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZHN1YnMuczogaDgzMDBzIGFkZC9zdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGRzdWJzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA4OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDgxOVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDc5MTEwMDIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDkxMlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDdBMTEwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwNDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwQTkyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMEIwNFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDBCODVcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwQjk2XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggMEU4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDkyMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAxODg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgNzkzMTAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiAxOTAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgN0EzMTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJhIDFBOTJcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyYyAxQjA0XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmUgMUI4NVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDFCOTZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiAxRTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzQgQjIxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDIxXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWxzLnM6IGg4MzAwcyBsb2dpY2FsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibG9naWNhbHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEU5MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxNjkxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzk2MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCA2NjExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0E2MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxRjA2NjExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDYxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDAxNDEwNjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgQzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDE0OThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3OTQxMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDY0MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA3QTQxMDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDQwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMDFGMDY0MTFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAwNDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMDE0MTA0MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCi0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IEQ4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiAxNTg5XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggNzk1MTAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyA2NTExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2UgN0E1MTAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDAxRjA2NTExXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggMDUxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDAxNDEwNTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgMTc4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDE3OTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiAxN0IwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgMTcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU2IDE3MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCAxNzMwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMzBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2NicmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiY2JyYW5jaHMuczogaDgzMDBzIGNvbmRpdGlvbmFsIGJyYW5jaCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNicmFuY2hzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA0MDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDQxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA0MTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNDIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDQzMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA0NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgNDQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDQ1MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiA0NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgNDYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE2IDQ3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA0ODAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgNDkwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFjIDRBMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA0QjAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNEMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDREMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNCA0RTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNEYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDU4MDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmMgNTgwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA1ODEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDU4MTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggNTgyMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyA1ODMwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDU4NDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDQgNTg0MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA1ODUwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDU4NTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgNTg2MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1NCA1ODcwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDU4ODAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWMgNTg5MDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MCA1OEEwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY0IDU4QjAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjggNThDMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2YyA1OEQwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDcwIDU4RTAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzQgNThGMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLXByb2MgZG9faDgzMDBzX2JpdG9wczEge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzMXMuczogaDgzMDBzIGJpdG9wcyB0ZXN0cyAjMSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczFzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3NjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0MwMDc2MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RTQwNzYwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc2MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NjAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA3MjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0QwMDcyMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3RjQwNzIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzcyMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3MjAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA2Mjk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgN0QwMDYyOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3RjQwNjI5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzYyOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2MjkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA3Njg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgN0MwMDc2ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSA3RTQwNzY4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc2ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NjgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MCA3Nzg4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjIgN0MwMDc3ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2NiA3RTQwNzc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDZhIDZBMTAwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzc3ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDcwIDZBMzAwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3NzgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfYml0b3BzMiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHMycy5zOiBoODMwMHMgYml0b3BzIHRlc3RzICMyIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzMnMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc0ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzQ4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzQ4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc0ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDY3ODhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RDAwNjc4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDdGNDA2NzgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjc4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDY3ODAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgNzU4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDdDMDA3NTgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgN0U0MDc1ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NTgwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzU4MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggNzcwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDdDMDA3NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgN0U0MDc3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiA2QTEwMDA4MFxbXlxuXF0qXG4gK1xbMC05XF0rICs3NzAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCA2QTMwMDAwMVxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwNzcwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgdGltZW91dCAJCQkJeyBwZXJyb3IgInRpbWVvdXRcbjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2JpdG9wczMge30gewotICAgIHNldCB0ZXN0bmFtZSAiYml0b3BzM3MuczogaDgzMDBzIGJpdG9wcyB0ZXN0cyAjMyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdG9wczNzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA3MTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0QwMDcxMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA3RjQwNzEwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzcxMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3MTAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxOCA2MTk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWEgN0QwMDYxOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxZSA3RjQwNjE5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzYxOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI4IDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2MTkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA3MDA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgN0QwMDcwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNiA3RjQwNzAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNhIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzcwMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQwIDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA3MDAwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0OCA2MDk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGEgN0QwMDYwOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0ZSA3RjQwNjA5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUyIDZBMTgwMDgwXFteXG5cXSpcbiArXFswLTlcXSsgKzYwOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU4IDZBMzgwMDAxXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDA2MDkwIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAyMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfYml0b3BzNCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXRvcHM0cy5zOiBoODMwMHMgYml0b3BzIHRlc3RzICM0IgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0b3BzNHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDc0MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiA3QzAwNzQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA2IDdFNDA3NDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzQwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc0MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE4IDY3MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA3RDAwNjcwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFlIDdGNDA2NzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkExODAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjcwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjggNkEzODAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDY3MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDczMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMiA3QzAwNzMwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM2IDdFNDA3MzAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2EgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzMwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDczMDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ4IDYzOThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YSA3QzAwNjM5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRlIDdFNDA2MzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTIgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNjM5MCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTggNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDYzOTAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDc1MDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MiA3QzAwNzUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY2IDdFNDA3NTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmEgNkExMDAwODBcW15cblxdKlxuICtcWzAtOVxdKyArNzUwMCIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzAgNkEzMDAwMDFcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDc1MDAiICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIHRpbWVvdXQgCQkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDI1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19icmFuY2gge30gewotICAgIHNldCB0ZXN0bmFtZSAiYnJhbmNocy5zOiBoODMwMHMgYnJhbmNoIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYnJhbmNocy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNTUwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDVDMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNUEwMDAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA1OTAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNUIwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDVFMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgNUQwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDVGMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19jb21wYXJlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbXBhcmVzLnM6IGg4MzAwcyBjb21wYXJlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29tcGFyZXMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIEE4MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxQzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDQgNzkyMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwOCAxRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGEgN0EyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDFGODFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICB0aW1lb3V0IAkJCQl7IHBlcnJvciAidGltZW91dFxuOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19kZWNpbWFsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRlY2ltYWxzLnM6IGg4MzAwcyBkZWNpbWFsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGVjaW1hbHMucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgZWFjaCBpbnN0cnVjdGlvbiBiaXQgcGF0dGVybiB0byB2ZXJpZnkgaXQgZ290Ci0gICAgIyBhc3NlbWJsZWQgY29ycmVjdGx5LgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAwIDBGMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMiAxRjA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX2luY2RlYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbmNkZWNzLnM6IGg4MzAwcyBpbmNkZWMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJpbmNkZWNzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAxQTA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMUI1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDFCRDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiAxQjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMUJGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBhIDBBMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwQjUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGUgMEJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDBCNzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMiAwQkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDEwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19kaXZtdWwge30gewotICAgIHNldCB0ZXN0bmFtZSAiZGl2bXVscy5zOiBoODMwMHMgZGl2bXVsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGl2bXVscy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgNTE4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDUzMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwMUQwNTE4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxRDA1MzAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgNTA4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDUyMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMUMwNTA4MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDAxQzA1MjAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faDgzMDBzX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAibWlzY3MuczogaDgzMDBzIG1pc2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtaXNjcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgN0I1QzU5OEZcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA3QkQ0NTk4RlxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDA3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwMzA4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMDE0MTA3MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAwMzE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMDE0MDY5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAwMTQwNkYwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWMgMDE0MDc4MDBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDAxNDA2RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMDE0MDZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMwIDAxNDA2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzggMDE0MTY5MDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYyAwMTQxNkYwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDIgMDE0MTc4MDBcW15cblxdKlxuICtcWzAtOVxdKyArNkIyMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRjIDAxNDE2RDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTAgMDE0MTZCMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU2IDAxNDE2QjIwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWUgMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDYwIDU2NzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2MiA1NDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNjQgMDE4MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDY2IDAyMDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2OCAwMjE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNmEgMDE0MDY5ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA2ZSAwMTQwNkY4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNzQgMDE0MDc4MDBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDdlIDAxNDA2RDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwODIgMDE0MDZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDg4IDAxNDA2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwOTAgMDE0MTY5ODBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA5NCAwMTQxNkY4MFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwOWEgMDE0MTc4MDBcW15cblxdKlxuICtcWzAtOVxdKyArNkJBMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMGE0IDAxNDE2RDgwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwYTggMDE0MTZCODBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMGFlIDAxNDE2QkEwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDAwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDM2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgc2V0dXBfeGZhaWwgImg4MzAwKi0qLSoiCi0gICAgZmFpbCAiaDgzMDBzIG1vdmZwZS9tb3Z0cGUgdGVzdHMiCi19Ci0KLXByb2MgZG9faDgzMDBzX21vdmIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92YnMuczogaDgzMDBzIG1vdmIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3Zicy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMEM4OVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIEY4MTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCA2ODE4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgNkUxODAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSA3ODEwNkEyOFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDZDMThcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNCAyODEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTYgNkEwODAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYSA2QTI4MDAwMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjAgNjg5OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIyIDZFOTgwMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjYgNzgxMDZBQThcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMDAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSA2Qzk4XFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMzgxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDZBODgwMDAwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgNkFBODAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfbW92dyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Z3cy5zOiBoODMwMHMgbW92dyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdndzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRDAxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgNzkwMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggNkYxMDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyA3ODEwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDZEMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiA2QjAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMCA2OTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjIgNkY5MDAwMTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiA3ODEwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAyMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDZEOTBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzMCA2QjgwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM0IDZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotcHJvYyBkb19oODMwMHNfbW92bCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3Zscy5zOiBoODMwMHMgbW92bCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmxzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwRjgxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgN0EwMDAwMDBcW15cblxdKlxuICtcWzAtOVxdKyArMDA0MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDAxMDA2OTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMDEwMDZGMTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEyIDAxMDA3ODEwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCMjAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAwMTAwNkQxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDAxMDA2QjAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyNiAwMTAwNkIyMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJlIDAxMDA2OTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzIgMDEwMDZGOTBcW15cblxdKlxuICtcWzAtOVxdKyArMDAxMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDAxMDA3ODkwXFteXG5cXSpcbiArXFswLTlcXSsgKzZCQTAwMDAwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MiAwMTAwNkQ5MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ2IDAxMDA2QjgwXFteXG5cXSpcbiArXFswLTlcXSsgKzAwMDBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyAwMTAwNkJBMFxbXlxuXF0qXG4gK1xbMC05XF0rICswMDAwMDAwMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSAxNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfcHVzaHBvcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJwdXNocG9wcy5zOiBoODMwMHMgcHVzaHBvcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInB1c2hwb3BzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCA2RDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDIgMDEwMDZENzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNiA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEwMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMHNfcm90YXRlX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInJvdHNocy5zOiBoODMwMHMgcm90YXRlIGFuZCBzaGlmdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInJvdHNocy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMTI4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDEyQzhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxMjkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMTJEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA4IDEyQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAxMkYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMTM4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDBlIDEzQzhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxMCAxMzkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTIgMTNEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDE0IDEzQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxNiAxM0YwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTggMTIwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDFhIDEyNDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAxYyAxMjEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMWUgMTI1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDIwIDEyMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyMiAxMjcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMjQgMTMwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDI2IDEzNDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyOCAxMzEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMmEgMTM1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDJjIDEzMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAyZSAxMzcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzAgMTA4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDMyIDEwQzhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzNCAxMDkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMzYgMTBEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDM4IDEwQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAzYSAxMEYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwM2MgMTE4OFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDNlIDExQzhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0MCAxMTkwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDIgMTFEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDQ0IDExQjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0NiAxMUYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNDggMTAwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDRhIDEwNDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA0YyAxMDEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNGUgMTA1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDUwIDEwMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1MiAxMDcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNTQgMTEwOFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDU2IDExNDhcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1OCAxMTEwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwNWEgMTE1MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDVjIDExMzBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDA1ZSAxMTcwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4ID09IDQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19leHRlbmQge30gewotICAgIHNldCB0ZXN0bmFtZSAiZXh0ZW5kcy5zOiBoODMwMHMgZXh0ZW5kIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0ZW5kcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMTdEMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDE3RjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAxNzUwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMTc3MFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19tYWMge30gewotICAgIHNldCB0ZXN0bmFtZSAibWFjcy5zOiBoODMwMHMgbWFjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWFjcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayBlYWNoIGluc3RydWN0aW9uIGJpdCBwYXR0ZXJuIHRvIHZlcmlmeSBpdCBnb3QKLSAgICAjIGFzc2VtYmxlZCBjb3JyZWN0bHkuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDAgMDFBMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDAyIDAzMjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwNCAwMzMxXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDYgMDE2MDZEMDFcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYSAwMjIwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMGMgMDIzMVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeCA9PSA2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2g4MzAwc19tdWx0aXBsZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtdWx0aXBsZXMuczogaDgzMDBzIG11bHRpcGxlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibXVsdGlwbGVzLnMiICItYWwiCi0KLSAgICAjIENoZWNrIGVhY2ggaW5zdHJ1Y3Rpb24gYml0IHBhdHRlcm4gdG8gdmVyaWZ5IGl0IGdvdAotICAgICMgYXNzZW1ibGVkIGNvcnJlY3RseS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwMCAwMTEwNkQ3MVxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDA0IDAxMjA2RDcyXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMDggMDEzMDZENzNcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIiArXFswLTlcXSsgMDAwYyAwMTEwNkRGMFxbXlxuXF0qXG4iICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiICtcWzAtOVxdKyAwMDEwIDAxMjA2REYwXFteXG5cXSpcbiIgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICIgK1xbMC05XF0rIDAwMTQgMDEzMDZERjBcW15cblxdKlxuIiAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19oODMwMGhfbW92MzJidWcge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92MzJidWcuczogaDgzMDBoIG1vdjMyYnVnIHRlc3QiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAibW92MzJidWcucyIgIiIgIlByb3BlciByZWxvY2F0aW9uIGZvciBtb3YubCAocGFydCAxKSJdIHRoZW4gewotICAgICAgICBvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIjAwMDAwMDAyXFteXG5cXSozMlxbXlxuXF0qX2EuMHgwKjg4Y2E2YzAwXFteXG5cXSpcbiIKLQkJCQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQl0aW1lb3V0IAkJCXsgcGVycm9yICJ0aW1lb3V0XG47IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHggPT0gMV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotaWYgW2lzdGFyZ2V0IGg4MzAwKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaDgzMDAgaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICAgZG9faDgzMDBfYWRkX3N1YgotICAgIGRvX2g4MzAwX2xvZ2ljYWwKLSAgICBkb19oODMwMF9jYnJhbmNoCi0gICAgZG9faDgzMDBfYml0b3BzMQotICAgIGRvX2g4MzAwX2JpdG9wczIKLSAgICBkb19oODMwMF9iaXRvcHMzCi0gICAgZG9faDgzMDBfYml0b3BzNAotICAgIGRvX2g4MzAwX2JyYW5jaAotICAgIGRvX2g4MzAwX2NvbXBhcmUKLSAgICBkb19oODMwMF9kZWNpbWFsCi0gICAgZG9faDgzMDBfaW5jZGVjCi0gICAgZG9faDgzMDBfZGl2bXVsCi0gICAgZG9faDgzMDBfbWlzYwotICAgIGRvX2g4MzAwX21vdmIKLSAgICBkb19oODMwMF9tb3Z3Ci0gICAgZG9faDgzMDBfcHVzaHBvcAotICAgIGRvX2g4MzAwX3JvdGF0ZV9zaGlmdAotCi0gICAgIyBOb3cgdGVzdCB0aGUgaDgzMDBoIGluc3RydWN0aW9uIHBhcnNlcgotICAgIGRvX2g4MzAwaF9hZGRfc3ViCi0gICAgZG9faDgzMDBoX2xvZ2ljYWwKLSAgICBkb19oODMwMGhfY2JyYW5jaAotICAgIGRvX2g4MzAwaF9iaXRvcHMxCi0gICAgZG9faDgzMDBoX2JpdG9wczIKLSAgICBkb19oODMwMGhfYml0b3BzMwotICAgIGRvX2g4MzAwaF9iaXRvcHM0Ci0gICAgZG9faDgzMDBoX2JyYW5jaAotICAgIGRvX2g4MzAwaF9jb21wYXJlCi0gICAgZG9faDgzMDBoX2RlY2ltYWwKLSAgICBkb19oODMwMGhfaW5jZGVjCi0gICAgZG9faDgzMDBoX2Rpdm11bAotICAgIGRvX2g4MzAwaF9taXNjCi0gICAgZG9faDgzMDBoX21vdmIKLSAgICBkb19oODMwMGhfbW92dwotICAgIGRvX2g4MzAwaF9tb3ZsCi0gICAgZG9faDgzMDBfcHVzaHBvcAotICAgIGRvX2g4MzAwaF9yb3RhdGVfc2hpZnQKLSAgICBkb19oODMwMGhfZXh0ZW5kCi0KLSAgICAjIE5vdyB0ZXN0IHRoZSBoODMwMHMgaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICAgZG9faDgzMDBzX2FkZF9zdWIKLSAgICBkb19oODMwMHNfbG9naWNhbAotICAgIGRvX2g4MzAwc19jYnJhbmNoCi0gICAgZG9faDgzMDBzX2JpdG9wczEKLSAgICBkb19oODMwMHNfYml0b3BzMgotICAgIGRvX2g4MzAwc19iaXRvcHMzCi0gICAgZG9faDgzMDBzX2JpdG9wczQKLSAgICBkb19oODMwMHNfYnJhbmNoCi0gICAgZG9faDgzMDBzX2NvbXBhcmUKLSAgICBkb19oODMwMHNfZGVjaW1hbAotICAgIGRvX2g4MzAwc19pbmNkZWMKLSAgICBkb19oODMwMHNfZGl2bXVsCi0gICAgZG9faDgzMDBzX21pc2MKLSAgICBkb19oODMwMHNfbW92YgotICAgIGRvX2g4MzAwc19tb3Z3Ci0gICAgZG9faDgzMDBzX21vdmwKLSAgICBkb19oODMwMF9wdXNocG9wCi0gICAgZG9faDgzMDBzX3JvdGF0ZV9zaGlmdAotICAgIGRvX2g4MzAwc19leHRlbmQKLSAgICBkb19oODMwMHNfbWFjCi0gICAgZG9faDgzMDBzX211bHRpcGxlCi0KLSAgICBkb19oODMwMGhfbW92MzJidWcKLQotICAgICMgTm93IHNvbWUgcmFuZG9tIHRlc3RzCi0gICAgc2V0IHN2cjRwaWMgW2V4cHIgW2lzdGFyZ2V0ICotKi1lbGYqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXg1Kl0gXQotICAgIHNldCBlbXBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVjb2ZmKl0gfHwgW2lzdGFyZ2V0ICotKi11bHRyaXgqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXhcWzEtNFxdKl0gXQotICAgIHNldCBhb3V0IFtleHByIFtpc3RhcmdldCAqLSotYnNkKl0gfHwgW2lzdGFyZ2V0ICotKi1uZXRic2QqXV0KLQotICAgIHJ1bl9kdW1wX3Rlc3QgImZmeHgxIgotICAgIGdhc190ZXN0ICJjbXBzaTIucyIgIiIgIiIgImNtcHNpMi5zIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxODgyNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9pbmNkZWMucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9pbmNkZWM6Ci0JZGVjIHIwbAotCWluYyByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkzZmM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY2gucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9pbmNkZWM6Ci0JZGVjLmIgcjBsCi0JZGVjLncgIzEscjAKLQlkZWMudyAjMixyMAotCWRlYy5sICMxLGVyMAotCWRlYy5sICMyLGVyMAotCWluYy5iIHIwbAotCWluYy53ICMxLHIwCi0JaW5jLncgIzIscjAKLQlpbmMubCAjMSxlcjAKLQlpbmMubCAjMixlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvaW5jZGVjcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ1NzA4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2luY2RlY3MucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19pbmNkZWM6Ci0JZGVjLmIgcjBsCi0JZGVjLncgIzEscjAKLQlkZWMudyAjMixyMAotCWRlYy5sICMxLGVyMAotCWRlYy5sICMyLGVyMAotCWluYy5iIHIwbAotCWluYy53ICMxLHIwCi0JaW5jLncgIzIscjAKLQlpbmMubCAjMSxlcjAKLQlpbmMubCAjMixlcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdlM2I3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWwucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkudGV4dAotaDgzMDBfbG9naWNhbDoKLQlhbmQgIzE2LHIxbAotCWFuZCByMWwscjFoCi0JYW5kYyAjMTYsY2NyCi0Jb3IgIzE2LHIwbAotCW9yIHIxbCxyMGwKLQlvcmMgIzE2LGNjcgotCXhvciAjMTYscjBsCi0JeG9yIHIwbCxyMWwKLQl4b3JjICMxNixjY3IKLQluZWcgcjBsCi0Jbm90IHIwbAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbG9naWNhbGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU5NWYxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2FsaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX2xvZ2ljYWw6Ci0JYW5kLmIgIzE2LHIxbAotCWFuZC5iIHIxbCxyMWgKLQlhbmQudyAjMzIscjEKLQlhbmQudyByMSxyMQotCWFuZC5sICM2NCxlcjEKLQlhbmQubCBlcjEsZXIxCi0JYW5kYyAjMTYsY2NyCi0Jb3IuYiAjMTYscjBsCi0Jb3IuYiByMWwscjBsCi0Jb3IudyAjMzIscjEKLQlvci53IHIxLHIxCi0Jb3IubCAjNjQsZXIxCi0Jb3IubCBlcjEsZXIxCi0Jb3JjICMxNixjY3IKLQl4b3IuYiAjMTYscjBsCi0JeG9yLmIgcjBsLHIxbAotCXhvci53ICMzMixyMQotCXhvci53IHIxLHIxCi0JeG9yLmwgIzY0LGVyMQotCXhvci5sIGVyMSxlcjEKLQl4b3JjICMxNixjY3IKLQluZWcuYiByMGwKLQluZWcudyByMAotCW5lZy5sIGVyMAotCW5vdC5iIHIwbAotCW5vdC53IHIwCi0Jbm90LmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9sb2dpY2Fscy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2M0Y2JhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL2xvZ2ljYWxzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbG9naWNhbDoKLQlhbmQuYiAjMTYscjFsCi0JYW5kLmIgcjFsLHIxaAotCWFuZC53ICMzMixyMQotCWFuZC53IHIxLHIxCi0JYW5kLmwgIzY0LGVyMQotCWFuZC5sIGVyMSxlcjEKLQlhbmRjICMxNixjY3IKLQlhbmRjICMxNixleHIKLQlvci5iICMxNixyMGwKLQlvci5iIHIxbCxyMGwKLQlvci53ICMzMixyMQotCW9yLncgcjEscjEKLQlvci5sICM2NCxlcjEKLQlvci5sIGVyMSxlcjEKLQlvcmMgIzE2LGNjcgotCW9yYyAjMTYsZXhyCi0JeG9yLmIgIzE2LHIwbAotCXhvci5iIHIwbCxyMWwKLQl4b3IudyAjMzIscjEKLQl4b3IudyByMSxyMQotCXhvci5sICM2NCxlcjEKLQl4b3IubCBlcjEsZXIxCi0JeG9yYyAjMTYsY2NyCi0JeG9yYyAjMTYsZXhyCi0JbmVnLmIgcjBsCi0JbmVnLncgcjAKLQluZWcubCBlcjAKLQlub3QuYiByMGwKLQlub3QudyByMAotCW5vdC5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tYWNzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tYWNzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZGY2ZGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWFjcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21hYzoKLQljbHJtYWMKLQlsZG1hYyBlcjAsbWFjaAotCWxkbWFjIGVyMSxtYWNsCi0JbWFjIEBlcjArLEBlcjErCi0Jc3RtYWMgbWFjaCxlcjAKLQlzdG1hYyBtYWNsLGVyMQotCQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNmY4MDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbWlzYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci1oODMwMF9taXNjOgotCWVlcG1vdgotCWxkYyAjMCxjY3IKLQlsZGMgcjBsLGNjcgotOwltb3ZmcGUgMTY6MTYscjBsCi07CW1vdnRwZSByMGwsMTY6MTYKLQlub3AKLQlydGUKLQlydHMKLQlzbGVlcAotCXN0YyBjY3IscjBsCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2VjYjNkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbWlzYzoKLQllZXBtb3YuYgotIAllZXBtb3YudwotCWxkYy5iICMwLGNjcgotCWxkYy5iIHIwbCxjY3IKLQlsZGMudyBAZXIwLGNjcgotCWxkYy53IEAoMTY6MTYsZXIwKSxjY3IKLQlsZGMudyBAKDMyOjI0LGVyMCksY2NyCi0JbGRjLncgQGVyMCssY2NyCi0JbGRjLncgQGg4MzAwaF9taXNjOjE2LGNjcgotCWxkYy53IEBoODMwMGhfbWlzYzoyNCxjY3IKLTsJbW92ZnBlIDE2OjE2LHIwbAotOwltb3Z0cGUgcjBsLDE2OjE2Ci0Jbm9wCi0JcnRlCi0JcnRzCi0Jc2xlZXAKLQlzdGMuYiBjY3IscjBsCi0Jc3RjLncgY2NyLEBlcjAKLQlzdGMudyBjY3IsQCgxNjoxNixlcjApCi0Jc3RjLncgY2NyLEAoMzI6MjQsZXIwKQotCXN0Yy53IGNjcixALWVyMAotCXN0Yy53IGNjcixAaDgzMDBoX21pc2M6MTYKLQlzdGMudyBjY3IsQGg4MzAwaF9taXNjOjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9taXNjcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzdhMTc3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21pc2NzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbWlzYzoKLQllZXBtb3YuYgotIAllZXBtb3YudwotCWxkYy5iICMwLGNjcgotCWxkYy5iIHIwbCxjY3IKLQlsZGMuYiAjMCxleHIKLQlsZGMuYiByMGwsZXhyCi0JbGRjLncgQGVyMCxjY3IKLQlsZGMudyBAKDE2OjE2LGVyMCksY2NyCi0JbGRjLncgQCgzMjozMixlcjApLGNjcgotCWxkYy53IEBlcjArLGNjcgotCWxkYy53IEBoODMwMHNfbWlzYzoxNixjY3IKLQlsZGMudyBAaDgzMDBzX21pc2M6MzIsY2NyCi0JbGRjLncgQGVyMCxleHIKLQlsZGMudyBAKDE2OjE2LGVyMCksZXhyCi0JbGRjLncgQCgzMjozMixlcjApLGV4cgotCWxkYy53IEBlcjArLGV4cgotCWxkYy53IEBoODMwMHNfbWlzYzoxNixleHIKLQlsZGMudyBAaDgzMDBzX21pc2M6MzIsZXhyCi07CW1vdmZwZSAxNjoxNixyMGwKLTsJbW92dHBlIHIwbCwxNjoxNgotCW5vcAotCXJ0ZQotCXJ0cwotCXNsZWVwCi0Jc3RjLmIgY2NyLHIwbAotCXN0Yy5iIGV4cixyMGwKLQlzdGMudyBjY3IsQGVyMAotCXN0Yy53IGNjcixAKDE2OjE2LGVyMCkKLQlzdGMudyBjY3IsQCgzMjozMixlcjApCi0Jc3RjLncgY2NyLEAtZXIwCi0Jc3RjLncgY2NyLEBoODMwMHNfbWlzYzoxNgotCXN0Yy53IGNjcixAaDgzMDBzX21pc2M6MzIKLQlzdGMudyBleHIsQGVyMAotCXN0Yy53IGV4cixAKDE2OjE2LGVyMCkKLQlzdGMudyBleHIsQCgzMjozMixlcjApCi0Jc3RjLncgZXhyLEAtZXIwCi0Jc3RjLncgZXhyLEBoODMwMHNfbWlzYzoxNgotCXN0Yy53IGV4cixAaDgzMDBzX21pc2M6MzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdjMyYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3YzMmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM5M2UzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdjMyYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQkuaDgzMDBoCi0JLmdsb2JhbCBfYQotYmxhaDoKLQltb3YubCAgICNfYS0yMDAwMDAwMDAwLGVyMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92Yi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTA0MGMwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmIucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotaDgzMDBfbW92YjoKLQltb3YuYiByMGwscjFsCi0JbW92LmIgIzE2LHIwbAotCW1vdi5iIEByMSxyMGwKLQltb3YuYiBAKDE2OjE2LHIxKSxyMGwKLQltb3YuYiBAcjErLHIwbAotCW1vdi5iIEAxNjo4LHIwbAotCW1vdi5iIEBoODMwMF9tb3ZiOjE2LHIwbAotCW1vdi5iIHIwbCxAcjEKLQltb3YuYiByMGwsQCgxNjoxNixyMSkKLQltb3YuYiByMGwsQC1yMQotCW1vdi5iIHIwbCxAMTY6OAotCW1vdi5iIHIwbCxAaDgzMDBfbW92YjoxNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YmgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3MTFmOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZiaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX21vdmI6Ci0JbW92LmIgcjBsLHIxbAotCW1vdi5iICMxNixyMGwKLQltb3YuYiBAZXIxLHIwbAotCW1vdi5iIEAoMTY6MTYsZXIxKSxyMGwKLQltb3YuYiBAKDMyOjI0LGVyMSkscjBsCi0JbW92LmIgQGVyMSsscjBsCi0JbW92LmIgQDE2OjgscjBsCi0JbW92LmIgQGg4MzAwaF9tb3ZiOjE2LHIwbAotCW1vdi5iIEBoODMwMGhfbW92YjoyNCxyMGwKLQltb3YuYiByMGwsQGVyMQotCW1vdi5iIHIwbCxAKDE2OjE2LGVyMSkKLQltb3YuYiByMGwsQCgzMjoyNCxlcjEpCi0JbW92LmIgcjBsLEAtZXIxCi0JbW92LmIgcjBsLEAxNjo4Ci0JbW92LmIgcjBsLEBoODMwMGhfbW92YjoxNgotCW1vdi5iIHIwbCxAaDgzMDBoX21vdmI6MjQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNTAwMmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92YnMucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19tb3ZiOgotCW1vdi5iIHIwbCxyMWwKLQltb3YuYiAjMTYscjBsCi0JbW92LmIgQGVyMSxyMGwKLQltb3YuYiBAKDE2OjE2LGVyMSkscjBsCi0JbW92LmIgQCgzMjozMixlcjEpLHIwbAotCW1vdi5iIEBlcjErLHIwbAotCW1vdi5iIEAxNjo4LHIwbAotCW1vdi5iIEBoODMwMHNfbW92YjoxNixyMGwKLQltb3YuYiBAaDgzMDBzX21vdmI6MzIscjBsCi0JbW92LmIgcjBsLEBlcjEKLQltb3YuYiByMGwsQCgxNjoxNixlcjEpCi0JbW92LmIgcjBsLEAoMzI6MzIsZXIxKQotCW1vdi5iIHIwbCxALWVyMQotCW1vdi5iIHIwbCxAMTY6OAotCW1vdi5iIHIwbCxAaDgzMDBzX21vdmI6MTYKLQltb3YuYiByMGwsQGg4MzAwc19tb3ZiOjMyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3ZsaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M3OGU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdmxoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmg4MzAwaAotCS50ZXh0Ci1oODMwMGhfbW92bDoKLQltb3YubCBlcjAsZXIxCi0JbW92LmwgIzY0LGVyMAotCW1vdi5sIEBlcjEsZXIwCi0JbW92LmwgQCgxNjoxNixlcjEpLGVyMAotCW1vdi5sIEAoMzI6MjQsZXIxKSxlcjAKLQltb3YubCBAZXIxKyxlcjAKLQltb3YubCBAaDgzMDBoX21vdmw6MTYsZXIwCi0JbW92LmwgQGg4MzAwaF9tb3ZsOjI0LGVyMAotCW1vdi5sIGVyMCxAZXIxCi0JbW92LmwgZXIwLEAoMTY6MTYsZXIxKQotCW1vdi5sIGVyMCxAKDMyOjI0LGVyMSkKLQltb3YubCBlcjAsQC1lcjEKLQltb3YubCBlcjAsQGg4MzAwaF9tb3ZsOjE2Ci0JbW92LmwgZXIwLEBoODMwMGhfbW92bDoyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zscy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92bHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0Mzc2Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Zscy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX21vdmw6Ci0JbW92LmwgZXIwLGVyMQotCW1vdi5sICM2NCxlcjAKLQltb3YubCBAZXIxLGVyMAotCW1vdi5sIEAoMTY6MTYsZXIxKSxlcjAKLQltb3YubCBAKDMyOjMyLGVyMSksZXIwCi0JbW92LmwgQGVyMSssZXIwCi0JbW92LmwgQGg4MzAwc19tb3ZsOjE2LGVyMAotCW1vdi5sIEBoODMwMHNfbW92bDozMixlcjAKLQltb3YubCBlcjAsQGVyMQotCW1vdi5sIGVyMCxAKDE2OjE2LGVyMSkKLQltb3YubCBlcjAsQCgzMjozMixlcjEpCi0JbW92LmwgZXIwLEAtZXIxCi0JbW92LmwgZXIwLEBoODMwMHNfbW92bDoxNgotCW1vdi5sIGVyMCxAaDgzMDBzX21vdmw6MzIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92dy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92dy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2M2NGY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdncucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotaDgzMDBfbW92dzoKLQltb3YudyByMCxyMQotCW1vdi53ICMxNixyMAotCW1vdi53IEByMSxyMAotCW1vdi53IEAoMTY6MTYscjEpLHIwCi0JbW92LncgQHIxKyxyMAotCW1vdi53IEBoODMwMF9tb3Z3OjE2LHIwCi0JbW92LncgcjAsQHIxCi0JbW92LncgcjAsQCgxNjoxNixyMSkKLQltb3YudyByMCxALXIxCi0JbW92LncgcjAsQGg4MzAwX21vdnc6MTYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d2gucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NTA1N2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvbW92d2gucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9tb3Z3OgotCW1vdi53IHIwLHIxCi0JbW92LncgIzE2LHIwCi0JbW92LncgQGVyMSxyMAotCW1vdi53IEAoMTY6MTYsZXIxKSxyMAotCW1vdi53IEAoMzI6MjQsZXIxKSxyMAotCW1vdi53IEBlcjErLHIwCi0JbW92LncgQGg4MzAwaF9tb3Z3OjE2LHIwCi0JbW92LncgQGg4MzAwaF9tb3Z3OjI0LHIwCi0JbW92LncgcjAsQGVyMQotCW1vdi53IHIwLEAoMTY6MTYsZXIxKQotCW1vdi53IHIwLEAoMzI6MjQsZXIxKQotCW1vdi53IHIwLEAtZXIxCi0JbW92LncgcjAsQGg4MzAwaF9tb3Z3OjE2Ci0JbW92LncgcjAsQGg4MzAwaF9tb3Z3OjI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tb3Z3cy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGYyMWRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL21vdndzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfbW92dzoKLQltb3YudyByMCxyMQotCW1vdi53ICMxNixyMAotCW1vdi53IEBlcjEscjAKLQltb3YudyBAKDE2OjE2LGVyMSkscjAKLQltb3YudyBAKDMyOjMyLGVyMSkscjAKLQltb3YudyBAZXIxKyxyMAotCW1vdi53IEBoODMwMHNfbW92dzoxNixyMAotCW1vdi53IEBoODMwMHNfbW92dzozMixyMAotCW1vdi53IHIwLEBlcjEKLQltb3YudyByMCxAKDE2OjE2LGVyMSkKLQltb3YudyByMCxAKDMyOjMyLGVyMSkKLQltb3YudyByMCxALWVyMQotCW1vdi53IHIwLEBoODMwMHNfbW92dzoxNgotCW1vdi53IHIwLEBoODMwMHNfbW92dzozMgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9tdWx0aXBsZXMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL211bHRpcGxlcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjA3OWI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL211bHRpcGxlcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS5oODMwMHMKLQkudGV4dAotaDgzMDBzX211bHRpcGxlOgotCWxkbS5sIEBzcCssZXIwLWVyMQotCWxkbS5sIEBzcCssZXIwLWVyMgotCWxkbS5sIEBzcCssZXIwLWVyMwotCXN0bS5sIGVyMC1lcjEsQC1zcAotCXN0bS5sIGVyMC1lcjIsQC1zcAotCXN0bS5sIGVyMC1lcjMsQC1zcAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWI3MzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLWg4MzAwX3B1c2hfcG9wOgotCXBvcCByMAotCXB1c2ggcjAKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3B1c2hwb3BoLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDk2MzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcGgucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5oODMwMGgKLQkudGV4dAotaDgzMDBoX3B1c2hfcG9wOgotCXBvcC53IHIwCi0JcG9wLmwgZXIwCi0JcHVzaC53IHIwCi0JcHVzaC5sIGVyMAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcHVzaHBvcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZGYwNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9wdXNocG9wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLmg4MzAwcwotCS50ZXh0Ci1oODMwMHNfcHVzaF9wb3A6Ci0JcG9wLncgcjAKLQlwb3AubCBlcjAKLQlwdXNoLncgcjAKLQlwdXNoLmwgZXIwCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWFhODdkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2g4MzAwL3JvdHNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLnRleHQKLWg4MzAwX3JvdGF0ZV9zaGlmdDoKLQlyb3RsIHIwbAotCXJvdHIgcjBsCi0Jcm90eGwgcjBsCi0Jcm90eHIgcjBsCi0Jc2hhbCByMGwKLQlzaGFyIHIwbAotCXNobGwgcjBsCi0Jc2hsciByMGwKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhYmU0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaGgucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQkuaDgzMDBoCi0JLnRleHQKLWg4MzAwaF9yb3RhdGVfc2hpZnQ6Ci0Jcm90bC5iIHIwbAotCXJvdGwudyByMAotCXJvdGwubCBlcjAKLQlyb3RyLmIgcjBsCi0Jcm90ci53IHIwCi0Jcm90ci5sIGVyMAotCXJvdHhsLmIgcjBsCi0Jcm90eGwudyByMAotCXJvdHhsLmwgZXIwCi0Jcm90eHIuYiByMGwKLQlyb3R4ci53IHIwCi0Jcm90eHIubCBlcjAKLQlzaGFsLmIgcjBsCi0Jc2hhbC53IHIwCi0Jc2hhbC5sIGVyMAotCXNoYXIuYiByMGwKLQlzaGFyLncgcjAKLQlzaGFyLmwgZXIwCi0Jc2hsbC5iIHIwbAotCXNobGwudyByMAotCXNobGwubCBlcjAKLQlzaGxyLmIgcjBsCi0Jc2hsci53IHIwCi0Jc2hsci5sIGVyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaDgzMDAvcm90c2hzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZjNDFjYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9oODMwMC9yb3RzaHMucworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLQkuaDgzMDBzCi0JLnRleHQKLWg4MzAwc19yb3RhdGVfc2hpZnQ6Ci0Jcm90bC5iIHIwbAotCXJvdGwuYiAjMixyMGwKLQlyb3RsLncgcjAKLQlyb3RsLncgIzIscjAKLQlyb3RsLmwgZXIwCi0Jcm90bC5sICMyLGVyMAotCXJvdHIuYiByMGwKLQlyb3RyLmIgIzIscjBsCi0Jcm90ci53IHIwCi0Jcm90ci53ICMyLHIwCi0Jcm90ci5sIGVyMAotCXJvdHIubCAjMixlcjAKLQlyb3R4bC5iIHIwbAotCXJvdHhsLmIgIzIscjBsCi0Jcm90eGwudyByMAotCXJvdHhsLncgIzIscjAKLQlyb3R4bC5sIGVyMAotCXJvdHhsLmwgIzIsZXIwCi0Jcm90eHIuYiByMGwKLQlyb3R4ci5iICMyLHIwbAotCXJvdHhyLncgcjAKLQlyb3R4ci53ICMyLHIwCi0Jcm90eHIubCBlcjAKLQlyb3R4ci5sICMyLGVyMAotCXNoYWwuYiByMGwKLQlzaGFsLmIgIzIscjBsCi0Jc2hhbC53IHIwCi0Jc2hhbC53ICMyLHIwCi0Jc2hhbC5sIGVyMAotCXNoYWwubCAjMixlcjAKLQlzaGFyLmIgcjBsCi0Jc2hhci5iICMyLHIwbAotCXNoYXIudyByMAotCXNoYXIudyAjMixyMAotCXNoYXIubCBlcjAKLQlzaGFyLmwgIzIsZXIwCi0Jc2hsbC5iIHIwbAotCXNobGwuYiAjMixyMGwKLQlzaGxsLncgcjAKLQlzaGxsLncgIzIscjAKLQlzaGxsLmwgZXIwCi0Jc2hsbC5sICMyLGVyMAotCXNobHIuYiByMGwKLQlzaGxyLmIgIzIscjBsCi0Jc2hsci53IHIwCi0Jc2hsci53ICMyLHIwCi0Jc2hsci5sIGVyMAotCXNobHIubCAjMixlcjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvUkVBRE1FIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjE3NGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1Ob3RlcyBvbiBob3cgdGhlIEhQUEEgdGVzdHN1aXRlIGlzIG9yZ2FuaXplZDoKLQotYmFzaWMucGFyc2UgLS0gdGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNpbmcKLXRlc3RzIGFuZCBhIHNpbXBsZSAuc3RhYiBwYXJzaW5nIHRlc3QuICBUaGlzIHdvdWxkIGJlIHdoZXJlIHlvdSdkCi1hZGQgY29kZSB0byBtYWtlIHN1cmUgbmV3IGluc3RydWN0aW9ucyBhcmUgcGFyc2VkIGNvcnJlY3RseSwgbmV3Ci1jb21wbGV0ZXJzIChzdWNoIGFzIGNhY2hlIGhpdHMpIGFyZSBwYXJzZWQgY29ycmVjdGx5LCBldGMuCi0KLUl0J3MgYWxzbyBhIHJlYXNvbmFibGUgcGxhY2UgdG8gbWFrZSBzdXJlIHBhcnNpbmcgb2YgdGhlIHZhcmlvdXMKLWFzc2VtYmxlciBkaXJlY3RpdmVzIGlzIGhhbmRsZWQgY29ycmVjdGx5LiAgSWYgeW91J3JlIGdvaW5nIHRvIGFkZAotc3VjaCBjb2RlLCB0cnkgdG8gYmUgcmVhc29uYWJseSBjb21wbGV0ZS4gIEFkZCB0ZXN0IGNvZGUgZm9yIGVhY2gKLWJhc2ljIGRpcmVjdGl2ZSBhbmQgdGVzdCBhbGwgKG9yIGEgbm90ZXdvcnRoeSkgc3Vic2V0IG9mIGFyZ3VtZW50cy4KLQotSXQgc2hvdWxkIG9ubHkgYmUgbmVjZXNzYXJ5IHRvIGhhdmUgYW4gYXNzZW1ibGVyIHRvIHJ1biB0aGVzZSB0ZXN0czsKLWNhbGxpbmcgb2JqZHVtcF9zdGFydCBvciBzb21ldGhpbmcgc2ltaWxhciBzaG91bGQgbm90IGJlIGRvbmUgZnJvbQotdGhpcyBkaXJlY3RvcnkuCi0KLQotbW9yZS5wYXJzZSAtLSB0aGlzIGlzIHdoZXJlIHlvdSBzaG91bGQgcHV0IGFkZGl0aW9uYWwgcGFyc2luZyB0ZXN0cywgc3VjaAotYXMgdGVzdHMgdG8gY2hlY2sgbW9kZSBzZWxlY3RvciBwYXJzaW5nLCBzdHJpbmcgcGFyc2luZywgZXhwcmVzc2lvbiBwYXJzaW5nLAotZXRjLiAgSXQncyBhbHNvIGEgcmVhc29uYWJsZSBwbGFjZSB0byBwdXQgcGFyc2luZyB0ZXN0cyB3aGljaCBhcmUgbm90IGNvbXBsZXRlCi1lbm91Z2ggKHdoYXRldmVyIHRoYXQgbWVhbnMpIGZvciBiYXNpYy5wYXJzZS4gIAotCi1JdCBzaG91bGQgb25seSBiZSBuZWNlc3NhcnkgdG8gaGF2ZSBhbiBhc3NlbWJsZXIgdG8gcnVuIHRoZXNlIHRlc3RzOwotY2FsbGluZyBvYmpkdW1wX3N0YXJ0IG9yIHNvbWV0aGluZyBzaW1pbGFyIHNob3VsZCBub3QgYmUgZG9uZSBmcm9tCi10aGlzIGRpcmVjdG9yeS4KLQotCi1yZWxvYyAtLSB0aGlzIGlzIHdoZXJlIHlvdSB0ZXN0cyB3aGljaCBleGFtaW5lIHJlbG9jYXRpb25zIHByb2R1Y2VkCi1ieSBHQVMgYmVsb25nLiAgVG8gcnVuIHRoZXNlIHRlc3RzIHlvdSBtdXN0IGhhdmUgYSBmdW5jdGlvbmluZyBvYmpkdW1wLgotCi0KLXVuc29ydGVkIC0tIHRoaXMgaXMgd2hlcmUgZXZlcnl0aGluZyBlbHNlIGdvZXMuICBBcyBncm91cHMgb2YgcmVsYXRlZCB0ZXN0cwotZW5kIHVwIGluIHRoaXMgZGlyZWN0b3J5LCB0aGV5IHNob3VsZCBiZSBicm9rZW4gb3V0IGludG8gYSBuZXcgY2xhc3Mgb2YKLXRlc3RzLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMWQ0Y2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGQucworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgYWRkL3NoP2FkZCBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JYWRkICAlcjQsJXI1LCVyNgotCWFkZCw9ICAlcjQsJXI1LCVyNgotCWFkZCw8ICAlcjQsJXI1LCVyNgotCWFkZCw8PSAgJXI0LCVyNSwlcjYKLQlhZGQsbnV2ICAlcjQsJXI1LCVyNgotCWFkZCx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkLHN2ICAlcjQsJXI1LCVyNgotCWFkZCxvZCAgJXI0LCVyNSwlcjYKLQlhZGQsdHIgICVyNCwlcjUsJXI2Ci0JYWRkLDw+ICAlcjQsJXI1LCVyNgotCWFkZCw+PSAgJXI0LCVyNSwlcjYKLQlhZGQsPiAgJXI0LCVyNSwlcjYKLQlhZGQsdXYgICVyNCwlcjUsJXI2Ci0JYWRkLHZueiAgJXI0LCVyNSwlcjYKLQlhZGQsbnN2ICAlcjQsJXI1LCVyNgotCWFkZCxldiAgJXI0LCVyNSwlcjYKLQotCWFkZGwgICVyNCwlcjUsJXI2Ci0JYWRkbCw9ICAlcjQsJXI1LCVyNgotCWFkZGwsPCAgJXI0LCVyNSwlcjYKLQlhZGRsLDw9ICAlcjQsJXI1LCVyNgotCWFkZGwsbnV2ICAlcjQsJXI1LCVyNgotCWFkZGwsem52ICAlcjQsJXI1LCVyNgotCWFkZGwsc3YgICVyNCwlcjUsJXI2Ci0JYWRkbCxvZCAgJXI0LCVyNSwlcjYKLQlhZGRsLHRyICAlcjQsJXI1LCVyNgotCWFkZGwsPD4gICVyNCwlcjUsJXI2Ci0JYWRkbCw+PSAgJXI0LCVyNSwlcjYKLQlhZGRsLD4gICVyNCwlcjUsJXI2Ci0JYWRkbCx1diAgJXI0LCVyNSwlcjYKLQlhZGRsLHZueiAgJXI0LCVyNSwlcjYKLQlhZGRsLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGRsLGV2ICAlcjQsJXI1LCVyNgotCi0JYWRkbyAgJXI0LCVyNSwlcjYKLQlhZGRvLD0gICVyNCwlcjUsJXI2Ci0JYWRkbyw8ICAlcjQsJXI1LCVyNgotCWFkZG8sPD0gICVyNCwlcjUsJXI2Ci0JYWRkbyxudXYgICVyNCwlcjUsJXI2Ci0JYWRkbyx6bnYgICVyNCwlcjUsJXI2Ci0JYWRkbyxzdiAgJXI0LCVyNSwlcjYKLQlhZGRvLG9kICAlcjQsJXI1LCVyNgotCWFkZG8sdHIgICVyNCwlcjUsJXI2Ci0JYWRkbyw8PiAgJXI0LCVyNSwlcjYKLQlhZGRvLD49ICAlcjQsJXI1LCVyNgotCWFkZG8sPiAgJXI0LCVyNSwlcjYKLQlhZGRvLHV2ICAlcjQsJXI1LCVyNgotCWFkZG8sdm56ICAlcjQsJXI1LCVyNgotCWFkZG8sbnN2ICAlcjQsJXI1LCVyNgotCWFkZG8sZXYgICVyNCwlcjUsJXI2Ci0KLQlhZGRjICAlcjQsJXI1LCVyNgotCWFkZGMsPSAgJXI0LCVyNSwlcjYKLQlhZGRjLDwgICVyNCwlcjUsJXI2Ci0JYWRkYyw8PSAgJXI0LCVyNSwlcjYKLQlhZGRjLG51diAgJXI0LCVyNSwlcjYKLQlhZGRjLHpudiAgJXI0LCVyNSwlcjYKLQlhZGRjLHN2ICAlcjQsJXI1LCVyNgotCWFkZGMsb2QgICVyNCwlcjUsJXI2Ci0JYWRkYyx0ciAgJXI0LCVyNSwlcjYKLQlhZGRjLDw+ICAlcjQsJXI1LCVyNgotCWFkZGMsPj0gICVyNCwlcjUsJXI2Ci0JYWRkYyw+ICAlcjQsJXI1LCVyNgotCWFkZGMsdXYgICVyNCwlcjUsJXI2Ci0JYWRkYyx2bnogICVyNCwlcjUsJXI2Ci0JYWRkYyxuc3YgICVyNCwlcjUsJXI2Ci0JYWRkYyxldiAgJXI0LCVyNSwlcjYKLQotCWFkZGNvICAlcjQsJXI1LCVyNgotCWFkZGNvLD0gICVyNCwlcjUsJXI2Ci0JYWRkY28sPCAgJXI0LCVyNSwlcjYKLQlhZGRjbyw8PSAgJXI0LCVyNSwlcjYKLQlhZGRjbyxudXYgICVyNCwlcjUsJXI2Ci0JYWRkY28sem52ICAlcjQsJXI1LCVyNgotCWFkZGNvLHN2ICAlcjQsJXI1LCVyNgotCWFkZGNvLG9kICAlcjQsJXI1LCVyNgotCWFkZGNvLHRyICAlcjQsJXI1LCVyNgotCWFkZGNvLDw+ICAlcjQsJXI1LCVyNgotCWFkZGNvLD49ICAlcjQsJXI1LCVyNgotCWFkZGNvLD4gICVyNCwlcjUsJXI2Ci0JYWRkY28sdXYgICVyNCwlcjUsJXI2Ci0JYWRkY28sdm56ICAlcjQsJXI1LCVyNgotCWFkZGNvLG5zdiAgJXI0LCVyNSwlcjYKLQlhZGRjbyxldiAgJXI0LCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYWRkaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGRpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMzZiODAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9hZGRpLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlhZGRpICAxMjMsJXI1LCVyNgotCWFkZGksPSAgMTIzLCVyNSwlcjYKLQlhZGRpLDwgIDEyMywlcjUsJXI2Ci0JYWRkaSw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpLG51diAgMTIzLCVyNSwlcjYKLQlhZGRpLHpudiAgMTIzLCVyNSwlcjYKLQlhZGRpLHN2ICAxMjMsJXI1LCVyNgotCWFkZGksb2QgIDEyMywlcjUsJXI2Ci0JYWRkaSx0ciAgMTIzLCVyNSwlcjYKLQlhZGRpLDw+ICAxMjMsJXI1LCVyNgotCWFkZGksPj0gIDEyMywlcjUsJXI2Ci0JYWRkaSw+ICAxMjMsJXI1LCVyNgotCWFkZGksdXYgIDEyMywlcjUsJXI2Ci0JYWRkaSx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaSxuc3YgIDEyMywlcjUsJXI2Ci0JYWRkaSxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGlvICAxMjMsJXI1LCVyNgotCWFkZGlvLD0gIDEyMywlcjUsJXI2Ci0JYWRkaW8sPCAgMTIzLCVyNSwlcjYKLQlhZGRpbyw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpbyxudXYgIDEyMywlcjUsJXI2Ci0JYWRkaW8sem52ICAxMjMsJXI1LCVyNgotCWFkZGlvLHN2ICAxMjMsJXI1LCVyNgotCWFkZGlvLG9kICAxMjMsJXI1LCVyNgotCWFkZGlvLHRyICAxMjMsJXI1LCVyNgotCWFkZGlvLDw+ICAxMjMsJXI1LCVyNgotCWFkZGlvLD49ICAxMjMsJXI1LCVyNgotCWFkZGlvLD4gIDEyMywlcjUsJXI2Ci0JYWRkaW8sdXYgIDEyMywlcjUsJXI2Ci0JYWRkaW8sdm56ICAxMjMsJXI1LCVyNgotCWFkZGlvLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpbyxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGl0ICAxMjMsJXI1LCVyNgotCWFkZGl0LD0gIDEyMywlcjUsJXI2Ci0JYWRkaXQsPCAgMTIzLCVyNSwlcjYKLQlhZGRpdCw8PSAgMTIzLCVyNSwlcjYKLQlhZGRpdCxudXYgIDEyMywlcjUsJXI2Ci0JYWRkaXQsem52ICAxMjMsJXI1LCVyNgotCWFkZGl0LHN2ICAxMjMsJXI1LCVyNgotCWFkZGl0LG9kICAxMjMsJXI1LCVyNgotCWFkZGl0LHRyICAxMjMsJXI1LCVyNgotCWFkZGl0LDw+ICAxMjMsJXI1LCVyNgotCWFkZGl0LD49ICAxMjMsJXI1LCVyNgotCWFkZGl0LD4gIDEyMywlcjUsJXI2Ci0JYWRkaXQsdXYgIDEyMywlcjUsJXI2Ci0JYWRkaXQsdm56ICAxMjMsJXI1LCVyNgotCWFkZGl0LG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpdCxldiAgMTIzLCVyNSwlcjYKLQotCWFkZGl0byAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPSAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPCAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPD0gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLG51diAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sem52ICAxMjMsJXI1LCVyNgotCWFkZGl0byxzdiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sb2QgIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHRyICAxMjMsJXI1LCVyNgotCWFkZGl0byw8PiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sPj0gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLD4gIDEyMywlcjUsJXI2Ci0JYWRkaXRvLHV2ICAxMjMsJXI1LCVyNgotCWFkZGl0byx2bnogIDEyMywlcjUsJXI2Ci0JYWRkaXRvLG5zdiAgMTIzLCVyNSwlcjYKLQlhZGRpdG8sZXYgIDEyMywlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWJhNWVhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvYmFzaWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjI2MiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJpc3R5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2ltZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAiaW1lbS5zOiBpbnRlZ2VyIG1lbW9yeSBsb2FkcyBhbmQgc3RvcmVzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiaW1lbS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDQ4OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwQzgwMTA5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgNDQ5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDBDODAxMDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA0MDlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMEM4MDEwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDY4OUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwQzlBMTI4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgNjQ5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDBDOUExMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCA2MDlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMEM5QTEyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDRDOUEwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyA2QzlBMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMEM4NTAwOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDBDODUyMDlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwQzg1MDBCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMEM4NTIwQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDBDODUwMDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwQzg1MjA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMEM4NTAwN0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDBDODUyMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwQzg1MDAxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMEM4NTIwMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDBDODUwMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwQzg1MjAzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMEM4NTAxOUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDBDODUyMTlBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwQzg1MDFCQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMEM4NTIxQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDBDODUwMURBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwQzg1MjFEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMEM4NTAxRkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDBDODUyMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwQzgwMTA5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMEM4MDMwQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDBDODAxMEJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwQzgwMTA1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMEM4MDMwN0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDBDODAxMDdBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwQzgwMTAxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMEM4MDMwM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDBDODAxMDNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwQzgwMTE5QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMEM4MDMxQkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDBDODAxMUJBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwQzgwMTFEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMEM4MDMxRkFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDBDODAxMUZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwQzlBMTI4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMEM5QTMyQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDBDOUExMkEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwQzlBMTI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMEM5QTMyNjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDBDOUExMjYwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAwQzlBMTIwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMEM5QTMyMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDBDOUExMjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAwQzlBMTM4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMEM5QTMzQTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDBDOUExM0EwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAwQzlBMTMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMEM5QTEzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDBDOUEzMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAwQzlBMTMyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMEM5QTMzMjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTYwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ltbWVkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImltbWVkLnM6IGltbWVkaWF0ZSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImltbWVkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzc1QTAwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDIzNERGQkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyOEFERkJENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdCAKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYnJhbmNoIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJyYW5jaC5zOiBicmFuY2ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2gucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFODVGMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTg1RjFGRUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEU4MUYxRkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBFODFGMUZERlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRTg1RjNGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEU4NUYzRkNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBFODQ0NDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRTg0NDQwMDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEU4MDQ0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBFODA0NDAwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRTg0MEMwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEU4NDBDMDAyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBFMDQwNDQ2Q1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRTA0MDQ0NkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEU0NDA0NDZDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBFNDQwNDQ2RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgQ0I0NDFGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IENCNDQzRkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBDQjQ0NUZFNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgQ0I0NDdGRERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIENCNDQ5RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBDQjQ0QkZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggQ0I0NERGQzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIENCNDRGRkJEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBDQjQ0MUZCN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgQ0I0NDNGQUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IENCNDQ1RkE3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBDQjQ0N0Y5RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgQ0I0NDlGOTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IENCNDRCRjhGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBDQjQ0REY4N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgQ0I0NEZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIENGNEExRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBDRjRBM0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggQ0Y0QTVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIENGNEE3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBDRjRBOUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgQ0Y0QUJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IENGNEFERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBDRjRBRkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgQ0Y0QTFGQjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IENGNEEzRkFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBDRjRBNUZBN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgQ0Y0QTdGOUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIENGNEE5Rjk3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBDRjRBQkY4RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggQ0Y0QURGODdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIENGNEFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCA4MDgwMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgODA4MDNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDgwODA1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyA4MDgwN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgODA4MDlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDgwODBCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCA4MDgwREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgODA4MEZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDg4ODAxRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCA4ODgwM0ZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggODg4MDVGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDg4ODA3RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCA4ODgwOUY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgODg4MEJGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDg4ODBERjg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyA4ODgwRkY3RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgODA4MDFGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDgwODAzRjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCA4MDgwNUY2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgODA4MDdGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDgwODA5RjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCA4MDgwQkY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggODA4MERGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDgwODBGRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCA4ODgwMUYzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgODg4MDNGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDg4ODA1RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyA4ODgwN0YxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgODg4MDlGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDg4ODBCRjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCA4ODgwREYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgODg4MEZFRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIDg0ODAxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCA4NDgwNUZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggODQ4MDdGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIDg0ODA5RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCA4NDgwQkZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgODQ4MERGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IDg0ODBGRkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyA4QzgwMUZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgOEM4MDNGQjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IDhDODA1RkFEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCA4QzgwN0ZBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgOEM4MDlGOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIDhDODBCRjk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCA4QzgwREY4RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggOEM4MEZFODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIDg0ODAxRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MCA4NDgwM0Y3N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxODQgODQ4MDVGNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg4IDg0ODA3RjY3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4YyA4NDgwOUY1RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOTAgODQ4MEJGNTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk0IDg0ODBERjRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5OCA4NDgwRkY0N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOWMgOEM4MDFGM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWEwIDhDODAzRjM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNCA4QzgwNUYyRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYTggOEM4MDdGMjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWFjIDhDODA5RjFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiMCA4QzgwQkYxN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjQgOEM4MERGMEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWI4IDhDODBGRjA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiYyBBMDgxMUZGNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzAgQTA4MTNGRURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWM0IEEwODE1RkU1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjOCBBMDgxN0ZERFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxY2MgQTA4MTlGRDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWQwIEEwODFCRkNEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkNCBBMDgxREZDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDggQTA4MUZGQkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWRjIEE4ODExRkI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlMCBBODgxM0ZBRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZTQgQTg4MTVGQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWU4IEE4ODE3RjlEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFlYyBBODgxOUY5NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZjAgQTg4MUJGOERcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWY0IEE4ODFERjg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFmOCBBODgxRkY3RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZmMgQTA4MTFGNzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjAwIEEwODEzRjZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIwNCBBMDgxNUY2N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMDggQTA4MTdGNUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjBjIEEwODE5RjU3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxMCBBMDgxQkY0RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMTQgQTA4MURGNDdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjE4IEEwODFGRjNGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIxYyBBODgxMUYzN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMjAgQTg4MTNGMkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjI0IEE4ODE1RjI3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIyOCBBODgxN0YxRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMmMgQTg4MTlGMTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjMwIEE4ODFCRjBGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDIzNCBBODgxREYwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyMzggQTg4MUZFRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjNjIEE0OUYxRkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0MCBBNDlGM0ZFRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNDQgQTQ5RjVGRTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjQ4IEE0OUY3RkREXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI0YyBBNDlGOUZENVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNTAgQTQ5RkJGQ0RcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjU0IEE0OUZERkM1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI1OCBBNDlGRkZCRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNWMgQUM5RjFGQjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjYwIEFDOUYzRkFEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI2NCBBQzlGNUZBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNjggQUM5RjdGOURcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjZjIEFDOUY5Rjk1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3MCBBQzlGQkY4RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyNzQgQUM5RkRGODVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjc4IEFDOUZGQzg1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI3YyBBNDlGMUY3N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyODAgQTQ5RjNGNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjg0IEE0OUY1RjY3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI4OCBBNDlGN0Y1RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOGMgQTQ5RjlGNTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjkwIEE0OUZCRjRGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDI5NCBBNDlGREY0N1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyOTggQTQ5RkZGM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMjljIEFDOUYxRjM3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhMCBBQzlGM0YyRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYTQgQUM5RjVGMjdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmE4IEFDOUY3RjFGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJhYyBBQzlGOUYxN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYjAgQUM5RkJGMEZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmI0IEFDOUZERjA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJiOCBBQzlGRkVGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYmMgQzAwNDVGRjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmMwIEMwMDRERkVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJjNCBDMDA0NUZFN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyYzggQzAwNERGREZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmNjIEM0QTQ1RkQ1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDJkMCBDNEE0REZDRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAyZDQgQzRBNDVGQzdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMmQ4IEM0QTRERkJGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xODNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZC5zOiBhZGQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhZGQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3NjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0EwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REEwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCAwOEE0MDcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDhBNDI3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDA4QTQ0NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyAwOEE0NjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDAgMDhBNDg3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDA4QTRBNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCAwOEE0QzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZGMgMDhBNEU3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDA4QTQxNzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCAwOEE0MzcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTggMDhBNDU3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDA4QTQ3NzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCAwOEE0OTcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjQgMDhBNEI3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDA4QTRENzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyAwOEE0RjcwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDAgMDhBNDBGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDA4QTQyRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwOCAwOEE0NEYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGMgMDhBNDZGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDA4QTQ4RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExNCAwOEE0QUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTggMDhBNENGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDA4QTRFRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMCAwOEE0MUYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjQgMDhBNDNGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDA4QTQ1RjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYyAwOEE0N0YwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzAgMDhBNDlGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDA4QTRCRjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzOCAwOEE0REYwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2MgMDhBNEZGMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTgwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoMWFkZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzaDFhZGQuczogc2gxYWRkIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2gxYWRkLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDY0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY2NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERBNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MEU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDhFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0Q0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxRTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0M0U0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDVFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3RTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OUU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEJFNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRERTQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RkU0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NDhdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2gyYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoMmFkZC5zOiBzaDJhZGQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaDJhZGQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOEE0MDY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDhBNDI2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ0Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwOEE0NjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMDhBNDg2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRBNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwOEE0QzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMDhBNEU2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQxNjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwOEE0MzY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMDhBNDU2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTQ3Njg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwOEE0OTY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMDhBNEI2ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTRENjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwOEE0RjY4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMDhBNDBBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTQyQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAwOEE0NEE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMDhBNDZBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ4QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAwOEE0QUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMDhBNENBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRFQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAwOEE0MUE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMDhBNDNBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ1QTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAwOEE0N0E4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMDhBNDlBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRCQTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAwOEE0REE4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMDhBNEZBODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQwRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAwOEE0MkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMDhBNDRFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTQ2RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAwOEE0OEU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMDhBNEFFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDA4QTRDRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAwOEE0RUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMDhBNDFFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDA4QTQzRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAwOEE0NUU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMDhBNDdFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDA4QTQ5RTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAwOEE0QkU4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMDhBNERFODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDA4QTRGRTg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zaDNhZGQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2gzYWRkLnM6IHNoM2FkZCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInNoM2FkZC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjZDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ2QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNkM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwOEE0MEFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMDhBNDJBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQ0QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAwOEE0NkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMDhBNDhBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTRBQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAwOEE0Q0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMDhBNEVBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQxQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAwOEE0M0FDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMDhBNDVBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ3QUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAwOEE0OUFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMDhBNEJBQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTREQUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAwOEE0RkFDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMDhBNDBFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQyRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAwOEE0NEVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMDhBNDZFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDA4QTQ4RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAwOEE0QUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMDhBNENFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDA4QTRFRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAwOEE0MUVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMDhBNDNFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDA4QTQ1RUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAwOEE0N0VDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMDhBNDlFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDA4QTRCRUM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAwOEE0REVDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMDhBNEZFQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTQ4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3N1YiB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdWIuczogc3ViIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3ViLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDA0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDY0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTQ4NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0QTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNEM0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTRFNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0MTQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNDM0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQ1NDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0NzQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDk0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTRCNDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RDQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNEY0MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQwQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0MkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDRDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ2QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0OEMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNEFDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTRDQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0RUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNDFDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQzQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0NUMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDdDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ5QzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0QkMwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNERDMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTRGQzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0MDUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDI1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTQ0NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0NjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDg1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTRBNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0QzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEU1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDA4QTQxNTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAwOEE0MzUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMDhBNDU1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDA4QTQ3NTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAwOEE0OTUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMDhBNEI1MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDA4QTRENTA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAwOEE0RjUwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMDhBNDBEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDA4QTQyRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAwOEE0NEQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMDhBNDZEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDA4QTQ4RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCAwOEE0QUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMDhBNENEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDA4QTRFRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCAwOEE0MUQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTQgMDhBNDNEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDA4QTQ1RDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyAwOEE0N0QwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjAgMDhBNDlEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDA4QTRCRDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCAwOEE0REQwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZmMgMDhBNEZEMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDA4QTQwNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwNCAwOEE0MjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDggMDhBNDQ0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDA4QTQ2NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCAwOEE0ODRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTQgMDhBNEE0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDA4QTRDNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExYyAwOEE0RTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjAgMDhBNDE0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDA4QTQzNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyOCAwOEE0NTRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMmMgMDhBNDc0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDA4QTQ5NEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCAwOEE0QjRDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzggMDhBNEQ0QzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDA4QTRGNEM2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0MCAwOEE0MENDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDQgMDhBNDJDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IDA4QTQ0Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0YyAwOEE0NkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTAgMDhBNDhDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IDA4QTRBQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1OCAwOEE0Q0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNWMgMDhBNEVDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIDA4QTQxQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2NCAwOEE0M0NDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjggMDhBNDVDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIDA4QTQ3Q0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3MCAwOEE0OUNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzQgMDhBNEJDQzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IDA4QTREQ0M2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3YyAwOEE0RkNDNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZHMge30gewotICAgIHNldCB0ZXN0bmFtZSAiZHMuczogZHMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJkcy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0MjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5NDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0QjQ0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ0NDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGNDQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19jb21jbHIge30gewotICAgIHNldCB0ZXN0bmFtZSAiY29tY2xyLnM6IGNvbWNsciB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNvbWNsci5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwOEE0Mjg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDhBNDQ4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ2ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwOEE0ODg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDhBNEE4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTRDODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwOEE0RTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMDhBNDE4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQzODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwOEE0NTg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMDhBNDc4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQ5ODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwOEE0Qjg4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMDhBNEQ4ODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTRGODg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCA5MEE2MDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgOTBBNjIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDkwQTY0MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyA5MEE2NjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgOTBBNjgwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDkwQTZBMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCA5MEE2QzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgOTBBNkUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDkwQTYxMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCA5MEE2MzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggOTBBNjUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDkwQTY3MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCA5MEE2OTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgOTBBNkIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDkwQTZEMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyA5MEE2RjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbG9naWNhbCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2dpY2FsLnM6IGxvZ2ljYWwgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDhBNDAyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQyMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwOEE0NDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMDhBNDYyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTRFMjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwOEE0MTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMDhBNDMyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTQ1MjQ2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwOEE0NzI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMDhBNEYyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTQwMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwOEE0MjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMDhBNDQyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTQ2Mjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwOEE0RTI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMDhBNDEyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTQzMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwOEE0NTI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMDhBNDcyODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTRGMjg2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAwOEE0MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMDhBNDIyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTQ0MjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAwOEE0NjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMDhBNEUyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAwOEE0MzIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMDhBNDUyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTQ3MjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAwOEE0RjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMDhBNDAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTQyMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAwOEE0NDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMDhBNDYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTRFMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAwOEE0MTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMDhBNDMwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDA4QTQ1MDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAwOEE0NzAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMDhBNEYwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTQwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3VuaXQge30gewotICAgIHNldCB0ZXN0bmFtZSAidW5pdC5zOiB1bml0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAidW5pdC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4QTQwMzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4QTQ0Mzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4QTQ2Mzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4QTQ4Mzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4QTRDMzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4QTRFMzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4QTQxMzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4QTQ1Mzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4QTQ3Mzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4QTQ5Mzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4QTREMzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4QTRGMzg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4QTQwOTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4QTQ0OTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4QTQ2OTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4QTQ4OTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4QTRDOTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4QTRFOTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4QTQxOTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4QTQ1OTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4QTQ3OTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4QTQ5OTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4QTREOTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4QTRGOTg2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA4QTQwOUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA4QTQ0OUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA4QTQ2OUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDA4QTQ4OUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDA4QTRDOUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDA4QTRFOUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDA4QTQxOUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDA4QTQ1OUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDA4QTQ3OUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDA4QTQ5OUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDA4QTREOUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDA4QTRGOUM2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTM2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2Rjb3Ige30gewotICAgIHNldCB0ZXN0bmFtZSAiZGNvci5zOiBkY29yIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZGNvci5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4ODAwQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDA4ODA0Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4ODA2Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA4ODA4Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDA4ODBDQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDA4ODBFQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDA4ODAxQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA4ODA1Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDA4ODA3Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDA4ODA5Qjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDA4ODBEQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDA4ODBGQjg1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDA4ODAwQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDA4ODA0QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA4ODA2QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA4ODA4QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA4ODBDQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA4ODBFQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA4ODAxQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA4ODA1QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA4ODA3QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA4ODA5QkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA4ODBEQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA4ODBGQkM1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FkZGkge30gewotICAgIHNldCB0ZXN0bmFtZSAiYWRkaS5zOiBhZGRpIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYWRkaS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEI0QTYwMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBCNEE2MjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQjRBNjQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEI0QTY2MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBCNEE2ODBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgQjRBNkEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEI0QTZDMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBCNEE2RTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgQjRBNjEwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEI0QTYzMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBCNEE2NTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgQjRBNjcwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEI0QTY5MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBCNEE2QjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggQjRBNkQwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIEI0QTZGMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBCNEE2MDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgQjRBNjI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEI0QTY0OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBCNEE2NjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgQjRBNjg4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IEI0QTZBOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBCNEE2QzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgQjRBNkU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIEI0QTYxOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBCNEE2MzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggQjRBNjU4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIEI0QTY3OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBCNEE2OThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgQjRBNkI4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEI0QTZEOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBCNEE2RjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgQjBBNjAwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEIwQTYyMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBCMEE2NDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgQjBBNjYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEIwQTY4MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBCMEE2QTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggQjBBNkMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEIwQTZFMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBCMEE2MTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgQjBBNjMwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEIwQTY1MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBCMEE2NzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgQjBBNjkwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IEIwQTZCMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBCMEE2RDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgQjBBNkYwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIEIwQTYwOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBCMEE2MjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggQjBBNjQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIEIwQTY2OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBCMEE2ODhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgQjBBNkE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IEIwQTZDOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBCMEE2RThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgQjBBNjE4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IEIwQTYzOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBCMEE2NThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgQjBBNjc4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIEIwQTY5OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBCMEE2QjhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggQjBBNkQ4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIEIwQTZGOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWJpIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN1Ymkuczogc3ViaSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1YmkucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA5NEE2MDBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgOTRBNjIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDk0QTY0MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyA5NEE2NjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgOTRBNjgwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDk0QTZBMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCA5NEE2QzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgOTRBNkUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDk0QTYxMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCA5NEE2MzBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggOTRBNjUwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDk0QTY3MEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCA5NEE2OTBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgOTRBNkIwRjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDk0QTZEMEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyA5NEE2RjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgOTRBNjA4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDk0QTYyOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCA5NEE2NDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgOTRBNjY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDk0QTY4OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCA5NEE2QThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggOTRBNkM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDk0QTZFOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCA5NEE2MThGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgOTRBNjM4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDk0QTY1OEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyA5NEE2NzhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgOTRBNjk4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDk0QTZCOEY2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCA5NEE2RDhGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgOTRBNkY4RjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTMyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NoaWZ0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNoaWZ0LnM6IHNoaWZ0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic2hpZnQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMEE0MDAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMEE0MjAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMEE0NDAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMEE0NjAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMEE0ODAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMEE0QTAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMEE0QzAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMEE0RTAwNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMEE0MEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMEE0MkI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMEE0NEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMEE0NkI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMEE0OEI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMEE0QUI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMEE0Q0I0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMEE0RUI0NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19leHRyYWN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImV4dHJhY3QuczogZXh0cmFjdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImV4dHJhY3QucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEMDg2MThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEMDg2MzhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEMDg2NThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBEMDg2NzhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBEMDg2OThCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBEMDg2QjhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBEMDg2RDhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBEMDg2RjhCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBEMDg2MUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBEMDg2M0NCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBEMDg2NUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBEMDg2N0NCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBEMDg2OUNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBEMDg2QkNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBEMDg2RENCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBEMDg2RkNCNlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBEMDg2MTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBEMDg2MzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBEMDg2NTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBEMDg2NzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBEMDg2OTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBEMDg2QjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBEMDg2RDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBEMDg2RjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBEMDg2MTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBEMDg2MzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBEMDg2NTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBEMDg2NzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBEMDg2OTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBEMDg2QjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBEMDg2RDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBEMDg2RjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19kZXBvc2l0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImRlcG9zaXQuczogZGVwb3NpdCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImRlcG9zaXQucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBENEM0MEI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBENEM0MkI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBENEM0NEI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBENEM0NkI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBENEM0OEI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBENEM0QUI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBENEM0Q0I1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBENEM0RUI1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBENEM0MEY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBENEM0MkY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBENEM0NEY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBENEM0NkY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCBENEM0OEY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCBENEM0QUY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBENEM0Q0Y1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyBENEM0RUY1NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCBENEM0MDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBENEM0MjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCBENEM0NDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBENEM0NjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBENEM0ODAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCBENEM0QTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCBENEM0QzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyBENEM0RTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCBENEM0MDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCBENEM0MjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCBENEM0NDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyBENEM0NjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBENEM0ODQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCBENEM0QTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCBENEM0QzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBENEM0RTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCBENERGMTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCBENERGMzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBENERGNTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyBENERGNzQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCBENERGOTQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBENERGQjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCBENERGRDQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyBENERGRjQxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBENERGMTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCBENERGMzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCBENERGNTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBENERGNzAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCBENERGOTAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCBENERGQjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCBENERGRDAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyBENERGRjAxQlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBENERGMUY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCBENERGM0Y3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBENERGNUY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjYyBENERGN0Y3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCBENERGOUY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCBENERGQkY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkOCBENERGREY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyBENERGRkY3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlMCBENERGMUI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlNCBENERGM0I3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCBENERGNUI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBENERGN0I3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmMCBENERGOUI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCBENERGQkI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmOCBENERGREI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmYyBENERGRkI3NlxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT02NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zeXN0ZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAic3lzdGVtLnM6IHN5c3RlbSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN5c3RlbS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDAwMDE4MDA1XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDAwMDAwQzAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDAwMDAwQ0EwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDAwMDUwRDY0XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDAwMDUwRTY0XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDAwMDQxODYwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDAwQTAxMEE0XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDAwMDQxODIwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDAxNDQxODQwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDAwMDAwNEE0XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDAxNDAwOEE0XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDAwMDAwNDAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDAwMTAwNDAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDE0MDAwNEQyXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDA0QTYxMTg3XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDA0QTEzMTg3XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDA0QTYxMUM3XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDA0QTEzMUM3XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDA0QTQxMzQ2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDA0QTQxMzY2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDA0QTQxMzA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDA0QTQxMzI2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDA0QTQxMzA2XFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDA0QTQxMDQwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDA0QTQyMDQwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDA0QTQxMDAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDA0QTQyMDAwXFteXG5dKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTI3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3B1cmdlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInB1cmdlLnM6IHB1cmdlIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAicHVyZ2UucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwNEE0MTIwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwNEE0MTIyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwNEE0MjIwMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwNEE0MjIyMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAwNEE0MTI0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAwNEE0MTI2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAwNEE0MjI0MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAwNEE0MjI2MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAwNEE0MTM4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAwNEE0MTNBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAwNEE0MTI4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAwNEE0MTJBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAwNEE0MjI4MFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAwNEE0MjJBMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAwNEE0MTJDMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAwNEE0MTJFMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAwNEE0MjJDMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAwNEE0MjJFMFxbXlxuXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE4XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX21pc2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnBfbWlzYy5zOiBmcF9taXNjIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfbWlzYy5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwMDAyNDIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZtZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAiZm1lbS5zOiBmbWVtIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZm1lbS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDI0QTQwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNEE0MjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjRBNDAwMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDI0QTQyMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAyQ0E0MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMkNBNDIwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDJDQTQwMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAyQ0E0MjAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMjRBNDAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDI0QTQyMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAyNEE0MDIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMjRBNDIyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDJDQTQwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAyQ0E0MjIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMkNBNDAyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDJDQTQyMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzQ0E0MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgM0NBNDIyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDNDQTQwMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzQ0E0MjIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMjRBMDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDI0QTAzMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAyNEEwMTAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMkNBMDEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDJDQTAzMDI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAyQ0EwMTAyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMjRBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDI0QTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAyNEEwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMkNBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDJDQTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAyQ0EwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgM0NBMDEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDNDQTAzMjI2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzQ0EwMTIyNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fZnBfY29tcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmcF9jb21wLnM6IGZwX2NvbXAgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJmcF9jb21wLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzBBMDQwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwQTA0ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMEEwNTgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzI4MDQwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDMyODA0ODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCAzMEEwNjAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggMzBBMDY4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDMwQTA3ODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCAzMjgwNjAxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgMzI4MDY4MThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDMwQTA4MDBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyAzMEEwODgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgMzBBMDk4MEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDMyODA4MDE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCAzMjgwODgxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgMzBBMEEwMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDMwQTBBODBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCAzMEEwQjgwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggMzI4MEEwMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDMyODBBODE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCAzMDg4MDYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgMzA4ODBFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDMwODgxRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1YyAzMjk4MDYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjAgMzI5ODBFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDMyOTgxRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2OCAzMDg4MjYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmMgMzA4ODJFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDMwODgzRTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3NCAzMjk4MjYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzggMzI5ODJFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDMyOTgzRTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4MCAzMDg4NDYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODQgMzA4ODRFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDMwODg1RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4YyAzMjk4NDYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTAgMzI5ODRFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDMyOTg1RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5OCAzMDg4NjYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOWMgMzA4ODZFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDMwODg3RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhNCAzMjk4NjYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTggMzI5ODZFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDMyOTg3RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiMCAzMDg4ODYwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjQgMzA4ODhFMENcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDMwODg5RTBDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiYyAzMjk4ODYxQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzAgMzI5ODhFMUNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDMyOTg5RTFDXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCAxODAxMjBFMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwY2MgMUExMUE0RDJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDk4MDEyMEUyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkNCA5QTExQTREMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDggMzg4NTQ3MDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTU1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX2NvbnYge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnBfY29udi5zOiBmcF9jb252IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfY29udi5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwQTAwMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzMEEwMjIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMzBBMDYyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDMwQTAwQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAzMEEwMkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMzBBMDZBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDMwQTAxQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAzMEEwM0EwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMzBBMDdBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDMyODAwMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAzMjgwMjIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMzI4MDYyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDMyODAwQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAzMjgwMkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMzI4MDZBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDMyODAxQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAzMjgwM0ExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMzI4MDdBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDMwQTA4MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAzMEEwQTIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMzBBMEUyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDMwQTA4QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAzMEEwQUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMzBBMEVBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDMwQTA5QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAzMEEwQkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMzBBMEZBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDMyODA4MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCAzMjgwQTIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgMzI4MEUyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDMyODA4QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyAzMjgwQUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgMzI4MEVBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDMyODA5QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCAzMjgwQkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgMzI4MEZBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDMwQTEwMjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCAzMEExMjIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggMzBBMTYyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDMwQTEwQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCAzMEExMkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgMzBBMTZBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDMwQTExQTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyAzMEExM0EwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgMzBBMTdBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDMyODEwMjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiOCAzMjgxMjIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYmMgMzI4MTYyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDMyODEwQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjNCAzMjgxMkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzggMzI4MTZBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDMyODExQTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkMCAzMjgxM0ExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgMzI4MTdBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDMwQTE4MjBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYyAzMEExQTIwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTAgMzBBMUUyMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDMwQTE4QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlOCAzMEExQUEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZWMgMzBBMUVBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDMwQTE5QTBBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmNCAzMEExQkEwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggMzBBMUZBMEFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDMyODE4MjE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwMCAzMjgxQTIxOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMDQgMzI4MUUyMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDMyODE4QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEwYyAzMjgxQUExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTAgMzI4MUVBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDMyODE5QTE4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOCAzMjgxQkExOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWMgMzI4MUZBMThcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTcyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2ZwX2ZjbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnBfZmNtcC5zOiBmcF9mY21wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZnBfZmNtcC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDMwODUwNDAwXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwODUwNDAxXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDMwODUwNDAyXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDMwODUwNDAzXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDMwODUwNDA0XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDMwODUwNDA1XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDMwODUwNDA2XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDMwODUwNDA3XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDMwODUwNDA4XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDMwODUwNDA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IDMwODUwNDBBXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDMwODUwNDBCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDMwODUwNDBDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDMwODUwNDBEXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDMwODUwNDBFXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDMwODUwNDBGXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIDMwODUwNDEwXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDMwODUwNDExXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDMwODUwNDEyXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIDMwODUwNDEzXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDMwODUwNDE0XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDMwODUwNDE1XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IDMwODUwNDE2XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDMwODUwNDE3XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDMwODUwNDE4XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY0IDMwODUwNDE5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDMwODUwNDFBXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDMwODUwNDFCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDcwIDMwODUwNDFDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDMwODUwNDFEXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IDMwODUwNDFFXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDdjIDMwODUwNDFGXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDMwODUwQzAwXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IDMwODUwQzAxXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg4IDMwODUwQzAyXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDMwODUwQzAzXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIDMwODUwQzA0XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk0IDMwODUwQzA1XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDMwODUwQzA2XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIDMwODUwQzA3XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGEwIDMwODUwQzA4XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDMwODUwQzA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IDMwODUwQzBBXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGFjIDMwODUwQzBCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDMwODUwQzBDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI0IDMwODUwQzBEXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGI4IDMwODUwQzBFXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDMwODUwQzBGXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGMwIDMwODUwQzEwXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM0IDMwODUwQzExXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGM4IDMwODUwQzEyXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNjIDMwODUwQzEzXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQwIDMwODUwQzE0XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ0IDMwODUwQzE1XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGQ4IDMwODUwQzE2XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGRjIDMwODUwQzE3XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIDMwODUwQzE4XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU0IDMwODUwQzE5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGU4IDMwODUwQzFBXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGVjIDMwODUwQzFCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYwIDMwODUwQzFDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY0IDMwODUwQzFEXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGY4IDMwODUwQzFFXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGZjIDMwODUwQzFGXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTAwIDMwODUxQzAwXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IDMwODUxQzAxXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA4IDMwODUxQzAyXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTBjIDMwODUxQzAzXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEwIDMwODUxQzA0XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE0IDMwODUxQzA1XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTE4IDMwODUxQzA2XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIDMwODUxQzA3XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTIwIDMwODUxQzA4XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI0IDMwODUxQzA5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI4IDMwODUxQzBBXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJjIDMwODUxQzBCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTMwIDMwODUxQzBDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM0IDMwODUxQzBEXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM4IDMwODUxQzBFXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTNjIDMwODUxQzBGXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIDMwODUxQzEwXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ0IDMwODUxQzExXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQ4IDMwODUxQzEyXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIDMwODUxQzEzXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTUwIDMwODUxQzE0XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU0IDMwODUxQzE1XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IDMwODUxQzE2XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTVjIDMwODUxQzE3XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTYwIDMwODUxQzE4XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IDMwODUxQzE5XFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY4IDMwODUxQzFBXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTZjIDMwODUxQzFCXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIDMwODUxQzFDXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc0IDMwODUxQzFEXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTc4IDMwODUxQzFFXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIDMwODUxQzFGXFteXG5cXSpcbiIJe3NldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTk2XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3NwZWNpYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAic3BlY2lhbC5zOiBzcGVjaWFsIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3BlY2lhbC5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA0QTQxNjgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAwNEE0MTZBMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMDRBNDFBODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDA0QTQxQUEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3Nwb3Age30gewotICAgIHNldCB0ZXN0bmFtZSAic3BvcC5zOiBzcG9wIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgICMgVGhpcyB0aWNrbGVzIGEgYnVnIGluIHRoZSBleHByZXNzaW9uIHBhcnNlci4KLSAgICBnYXNfc3RhcnQgInNwb3AucyIgIi1hbCIKLQotICAgICMgQ2hlY2sgdGhlIGFzc2VtYmxlZCBpbnN0cnVjdGlvbiBhZ2FpbnN0IGEgdGFibGUgYnVpbHQgYnkgdGhlIEhQIGFzc2VtYmxlcgotICAgICMgQW55IGRpZmZlcmVuY2VzIHNob3VsZCBiZSBjaGVja2VkIGJ5IGhhbmQgLS0gd2l0aCB0aGUgbnVtYmVyIG9mIHByb2JsZW1zCi0gICAgIyBJJ3ZlIHNlZW4gaW4gdGhlIEhQIGFzc2VtYmxlciBJIGRvbid0IGNvbXBsZXRlbHkgdHJ1c3QgaXQuCi0gICAgIwotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAxMDAwMDEwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMTAwMDE5MTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDEwMDAwMTI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAxMDAwMTkzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMTAwMDJCMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDEwMDM5QjA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAxMDAwMkIyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMTAwMzlCMjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDEwQTAwNTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAxMEEwMUQxM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMTBBMDA1MjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDEwQTAxRDMzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAxMEM1MDcwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMTBDNTFGMTNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDEwQzUwNzI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAxMEM1MUYzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29wciB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb3ByLnM6IGNvcHIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjb3ByLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzAwMDAxMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDMwMDAwNzEzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMDAwMDEyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgMzAwMDA3MzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fY29wcm1lbSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb3BybWVtLnM6IGNvcHIgbWVtb3J5IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29wcm1lbS5zIiAiLWFsIgotCi0gICAgIyBDaGVjayB0aGUgYXNzZW1ibGVkIGluc3RydWN0aW9uIGFnYWluc3QgYSB0YWJsZSBidWlsdCBieSB0aGUgSFAgYXNzZW1ibGVyCi0gICAgIyBBbnkgZGlmZmVyZW5jZXMgc2hvdWxkIGJlIGNoZWNrZWQgYnkgaGFuZCAtLSB3aXRoIHRoZSBudW1iZXIgb2YgcHJvYmxlbXMKLSAgICAjIEkndmUgc2VlbiBpbiB0aGUgSFAgYXNzZW1ibGVyIEkgZG9uJ3QgY29tcGxldGVseSB0cnVzdCBpdC4KLSAgICAjCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDI0ODUwMTFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNDg1MjExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjQ4NTAxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDI0ODUyMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCAyQzg1MDExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMkM4NTIxMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IDJDODUwMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyAyQzg1MjEzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgMjQ4NTAzMUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IDI0ODUyMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCAyNDg1MDMzQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgMjQ4NTIzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIDJDODUwMzFBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzNCAyQzg1MjMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggMkM4NTAzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDNjIDJDODUyMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MCAyNDgwMTExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDQgMjQ4MDMxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IDI0ODAxMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyAyQzgwMTExQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTAgMkM4MDMxM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU0IDJDODAxMTNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1OCAyNDgwMTMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWMgMjQ4MDMzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYwIDI0ODAxMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NCAyQzgwMTMxQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjggMkM4MDMzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZjIDJDODAxMzNBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yOF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19mbWVtX0xSX3Rlc3RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZtZW1MUmJ1Zy5zOiBMUiByZWdpc3RlciBzZWxlY3Rpb24gb24gZnAgbWVtIGluc3RydWN0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZtZW1MUmJ1Zy5zIiAiLWFsIgotCi0gICAgIyBNYWtlIHN1cmUgd2UgY29ycmVjdGx5IGhhbmRsZSBmaWVsZCBzZWxlY3RvcnMuIAotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyNzQwMTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMjc0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDI3NTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAyRjQwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgMkY0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IDJGNTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCAyNzQwMTA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgMjc0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDI3NTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCAyRjQwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggMkY0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIDJGNTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMCAyNzQwMTI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgMjc0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IDI3NTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzYyAyRjQwMTIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgMkY0ODEyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ0IDJGNTAxMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0OCAyNzQwMTA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNGMgMjc0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDUwIDI3NTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NCAyRjQwMTAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTggMkY0ODEwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDVjIDJGNTAxMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2MCAyNzU5MDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgMjc1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDY4IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2YyAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzAgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc0IDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3OCAyNzU5MDA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwN2MgMjc1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDgwIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4NCAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODggMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDhjIDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5MCAyNzU5MDI0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTQgMjc1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDk4IDI3NTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5YyAyRjU5MDIwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTAgMkY1OTAyMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE0IDJGNTkwMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhOCAyNzU5MDA0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYWMgMjc1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGIwIDI3NTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNCAyRjU5MDAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjggMkY1OTAwMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIDJGNTkwMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjMCBFODQwQzAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzQgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTUwXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19pbWVtCi0gICAgZG9faW1tZWQKLSAgICBkb19icmFuY2gKLSAgICBkb19hZGQKLSAgICBkb19zaDFhZGQKLSAgICBkb19zaDJhZGQKLSAgICBkb19zaDNhZGQKLSAgICBkb19zdWIKLSAgICBkb19kcwotICAgIGRvX2NvbWNscgotICAgIGRvX2xvZ2ljYWwKLSAgICBkb191bml0Ci0gICAgZG9fZGNvcgotICAgIGRvX2FkZGkKLSAgICBkb19zdWJpCi0gICAgZG9fc2hpZnQKLSAgICBkb19leHRyYWN0Ci0gICAgZG9fZGVwb3NpdAotICAgIGRvX3N5c3RlbQotICAgIGRvX3B1cmdlCi0gICAgZG9fZnBfbWlzYwotICAgIGRvX2ZtZW0KLSAgICBkb19mcF9jb21wCi0gICAgZG9fZnBfY29udgotICAgIGRvX2ZwX2ZjbXAKLSAgICBkb19zcGVjaWFsCi0gICAgZG9fc3BvcAotICAgIGRvX2NvcHIKLSAgICBkb19jb3BybWVtCi0KLSAgICAjIFRoZSAid2VpcmQucyIgZmlsZSBmcm9tIHRoZSBnZGIgdGVzdHN1aXRlLiAgU2ltcGx5IHZlcmlmeSBpdAotICAgICMgYXNzZW1ibGVzLgotICAgIGdhc190ZXN0ICJ3ZWlyZC5zIiAiIiAiIiAic3RhYnMgcGFyc2luZyIKLQotICAgICMgVGVzdCB0aGF0IHdlIGNvcnJlY3RseSBhc3NlbWJsZSBzb21lIEZQIG1lbW9yeSB0ZXN0cyB3aGljaAotICAgICMgTC9SIHJlZ2lzdGVyIHNlbGVjdHMuICAoUmVncmVzc2lvbiB0ZXN0IGZvciBhIGJ1ZyBUZWdlIGZvdW5kKS4KLSAgICBkb19mbWVtX0xSX3Rlc3RzCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9icmFuY2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmODM5ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2JyYW5jaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBNb3JlIGJyYW5jaGluZyBpbnN0cnVjdGlvbnMgdGhhbiB5b3UgZXZlciBrbmV3IHdoYXQgdG8gZG8gd2l0aC4KLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotYnJhbmNoX3Rlc3RzOiAKLQlibCBicmFuY2hfdGVzdHMsJXIyCi0JYmwsbiBicmFuY2hfdGVzdHMsJXIyCi0JYiBicmFuY2hfdGVzdHMKLQliLG4gYnJhbmNoX3Rlc3RzCi0JZ2F0ZSBicmFuY2hfdGVzdHMsJXIyCi0JZ2F0ZSxuIGJyYW5jaF90ZXN0cywlcjIKLQlibHIgJXI0LCVyMgotCWJscixuICVyNCwlcjIKLQlibHIgJXI0LCVyMAotCWJscixuICVyNCwlcjAKLQlidiAlcjAoJXIyKQotCWJ2LG4gJXIwKCVyMikKLQliZSAweDEyMzQoJXNyMSwlcjIpCi0JYmUsbiAweDEyMzQoJXNyMSwlcjIpCi0JYmxlIDB4MTIzNCglc3IxLCVyMikKLQlibGUsbiAweDEyMzQoJXNyMSwlcjIpCi0KLW1vdmJfdGVzdHM6IAotCW1vdmIgJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPSAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw8ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLG9kICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLHRyICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDw+ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLD49ICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLGV2ICVyNCwlcjI2LG1vdmJfdGVzdHMKLW1vdmJfbnVsbGlmaWVkX3Rlc3RzOiAKLQltb3ZiLG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPSxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLDwsbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92YixvZCxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLHRyLG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCW1vdmIsPD4sbiAlcjQsJXIyNixtb3ZiX3Rlc3RzCi0JbW92Yiw+PSxuICVyNCwlcjI2LG1vdmJfdGVzdHMKLQltb3ZiLGV2LG4gJXI0LCVyMjYsbW92Yl90ZXN0cwotCi1tb3ZpYl90ZXN0czogCi0JbW92aWIgNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPSA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLG9kIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLHRyIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLDw+IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD49IDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLGV2IDUsJXIyNixtb3ZpYl90ZXN0cwotbW92aWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQltb3ZpYixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLD0sbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYiw8LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsb2QsbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYix0cixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCW1vdmliLDw+LG4gNSwlcjI2LG1vdmliX3Rlc3RzCi0JbW92aWIsPj0sbiA1LCVyMjYsbW92aWJfdGVzdHMKLQltb3ZpYixldixuIDUsJXIyNixtb3ZpYl90ZXN0cwotCi1jb21iX3Rlc3RzOiAKLQljb21iICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDwgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw8ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDw9ICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsc3YgJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixvZCAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHRyICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPD4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+PSAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+Pj0gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw+PiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG5zdiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLGV2ICVyMCwlcjQsY29tYl90ZXN0cwotY29tYl9udWxsaWZpZWRfdGVzdHM6IAotCWNvbWIsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDwsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLDw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PCxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPDw9LG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYixzdixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsb2QsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLHRyLG4gJXIwLCVyNCxjb21iX3Rlc3RzCi0JY29tYiw8PixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj0sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLD4+PSxuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsPj4sbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQljb21iLG5zdixuICVyMCwlcjQsY29tYl90ZXN0cwotCWNvbWIsZXYsbiAlcjAsJXI0LGNvbWJfdGVzdHMKLQotY29taWJfdGVzdHM6IAotCWNvbWliIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPCAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw9IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDwgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PD0gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixzdiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG9kIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsdHIgMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD49IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+PSAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsbnN2IDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsZXYgMCwlcjQsY29tYl90ZXN0cwotCi1jb21pYl9udWxsaWZpZWRfdGVzdHM6IAotCWNvbWliLG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw9LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw8PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPDwsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLDw8PSxuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsc3YsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLG9kLG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYix0cixuIDAsJXI0LGNvbWliX3Rlc3RzCi0JY29taWIsPD4sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD49LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYiw+Pj0sbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLD4+LG4gMCwlcjQsY29taWJfdGVzdHMKLQljb21pYixuc3YsbiAwLCVyNCxjb21pYl90ZXN0cwotCWNvbWliLGV2LG4gMCwlcjQsY29taWJfdGVzdHMKLQotCi0KLWFkZGJfdGVzdHM6IAotCWFkZGIgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw9ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPCAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw9ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsbnV2ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsem52ICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsc3YgJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixvZCAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHRyICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPD4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+PSAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix1diAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHZueiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG5zdiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLGV2ICVyMSwlcjQsYWRkYl90ZXN0cwotYWRkYl9udWxsaWZpZWRfdGVzdHM6IAotCWFkZGIsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD0sbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDwsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLDw9LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixudXYsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLHpudixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsc3YsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLG9kLG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix0cixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsPD4sbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLD49LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYiw+LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYix1dixuICVyMSwlcjQsYWRkYl90ZXN0cwotCWFkZGIsdm56LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0JYWRkYixuc3YsbiAlcjEsJXI0LGFkZGJfdGVzdHMKLQlhZGRiLGV2LG4gJXIxLCVyNCxhZGRiX3Rlc3RzCi0KLWFkZGliX3Rlc3RzOiAKLQlhZGRpYiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw9IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLDwgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD0gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnV2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHpudiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixzdiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixvZCAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix0ciAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8PiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+PSAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw+IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHV2IC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHZueiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixuc3YgLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsZXYgLTEsJXI0LGNvbWJfdGVzdHMKLQotYWRkaWJfbnVsbGlmaWVkX3Rlc3RzOiAKLQlhZGRpYixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD0sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPD0sbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixudXYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYix6bnYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYixzdixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLG9kLG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdHIsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQlhZGRpYiw8PixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLD49LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsPixuIC0xLCVyNCxhZGRpYl90ZXN0cwotCWFkZGliLHV2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsdm56LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsbnN2LG4gLTEsJXI0LGFkZGliX3Rlc3RzCi0JYWRkaWIsZXYsbiAtMSwlcjQsYWRkaWJfdGVzdHMKLQotCi07IE5lZWRzIHRvIGNoZWNrIGxvdHMgb2Ygc3R1ZmYgKGxpa2UgY29ybmVyIGJpdCBjYXNlcykKLWJiX3Rlc3RzOiAKLQlidmIsPCAlcjQsYmJfdGVzdHMKLQlidmIsPj0gJXI0LGJiX3Rlc3RzCi0JYnZiLDwsbiAlcjQsYmJfdGVzdHMKLQlidmIsPj0sbiAlcjQsYmJfdGVzdHMKLQliYiw8ICVyNCw1LGJiX3Rlc3RzCi0JYmIsPj0gJXI0LDUsYmJfdGVzdHMKLQliYiw8LG4gJXI0LDUsYmJfdGVzdHMKLQliYiw+PSxuICVyNCw1LGJiX3Rlc3RzCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvbWNsci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb21jbHIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlNWFhNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvbWNsci5zCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JY29tY2xyICVyNCwlcjUsJXI2Ci0JY29tY2xyLD0gJXI0LCVyNSwlcjYKLQljb21jbHIsPCAlcjQsJXI1LCVyNgotCWNvbWNsciw8PSAlcjQsJXI1LCVyNgotCWNvbWNsciw8PCAlcjQsJXI1LCVyNgotCWNvbWNsciw8PD0gJXI0LCVyNSwlcjYKLQljb21jbHIsc3YgJXI0LCVyNSwlcjYKLQljb21jbHIsb2QgJXI0LCVyNSwlcjYKLQljb21jbHIsdHIgJXI0LCVyNSwlcjYKLQljb21jbHIsPD4gJXI0LCVyNSwlcjYKLQljb21jbHIsPj0gJXI0LCVyNSwlcjYKLQljb21jbHIsPiAlcjQsJXI1LCVyNgotCWNvbWNsciw+Pj0gJXI0LCVyNSwlcjYKLQljb21jbHIsPj4gJXI0LCVyNSwlcjYKLQljb21jbHIsbnN2ICVyNCwlcjUsJXI2Ci0JY29tY2xyLGV2ICVyNCwlcjUsJXI2Ci0KLQljb21pY2xyIDEyMywlcjUsJXI2Ci0JY29taWNsciw9IDEyMywlcjUsJXI2Ci0JY29taWNsciw8IDEyMywlcjUsJXI2Ci0JY29taWNsciw8PSAxMjMsJXI1LCVyNgotCWNvbWljbHIsPDwgMTIzLCVyNSwlcjYKLQljb21pY2xyLDw8PSAxMjMsJXI1LCVyNgotCWNvbWljbHIsc3YgMTIzLCVyNSwlcjYKLQljb21pY2xyLG9kIDEyMywlcjUsJXI2Ci0JY29taWNscix0ciAxMjMsJXI1LCVyNgotCWNvbWljbHIsPD4gMTIzLCVyNSwlcjYKLQljb21pY2xyLD49IDEyMywlcjUsJXI2Ci0JY29taWNsciw+IDEyMywlcjUsJXI2Ci0JY29taWNsciw+Pj0gMTIzLCVyNSwlcjYKLQljb21pY2xyLD4+IDEyMywlcjUsJXI2Ci0JY29taWNscixuc3YgMTIzLCVyNSwlcjYKLQljb21pY2xyLGV2IDEyMywlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvY29wci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3ByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Y2I2YTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3ByLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotY29wcl90ZXN0czogCi0JY29wciw0LDUKLQljb3ByLDQsMTE1Ci0JY29wciw0LDUsbgotCWNvcHIsNCwxMTUsbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9jb3BybWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHJtZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZjE1MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2NvcHJtZW0ucworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBjb3ByIG1lbW9yeSB0ZXN0cyB3aGljaCBhbHNvIHRlc3QgdGhlIHZhcmlvdXMgCi07IGFkZHJlc3NpbmcgbW9kZXMgYW5kIGNvbXBsZXRlcnMuCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLTsgCi1jb3ByX2luZGV4aW5nX2xvYWQgCi0KLQljbGR3eCw0ICVyNSglc3IwLCVyNCksJXIyNgotCWNsZHd4LDQscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGR3eCw0LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3gsNCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0ICVyNSglc3IwLCVyNCksJXIyNgotCWNsZGR4LDQscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQljbGRkeCw0LG0gJXI1KCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHgsNCxzbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQotY29wcl9pbmRleGluZ19zdG9yZSAKLQljc3R3eCw0ICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdHd4LDQscyAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3R3eCw0LG0gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0d3gsNCxzbSAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0ICVyMjYsJXI1KCVzcjAsJXI0KQotCWNzdGR4LDQscyAlcjI2LCVyNSglc3IwLCVyNCkKLQljc3RkeCw0LG0gJXIyNiwlcjUoJXNyMCwlcjQpCi0JY3N0ZHgsNCxzbSAlcjI2LCVyNSglc3IwLCVyNCkKLQotY29wcl9zaG9ydF9tZW1vcnkgCi0JY2xkd3MsNCAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3MsNCxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkd3MsNCxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCxtYiAwKCVzcjAsJXI0KSwlcjI2Ci0JY2xkZHMsNCxtYSAwKCVzcjAsJXI0KSwlcjI2Ci0JY3N0d3MsNCAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0d3MsNCxtYiAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0d3MsNCxtYSAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCxtYiAlcjI2LDAoJXNyMCwlcjQpCi0JY3N0ZHMsNCxtYSAlcjI2LDAoJXNyMCwlcjQpCi0KLTsgZ2FzIGZ1Y2tzIHRoaXMgdXAgdGhpbmtzIGl0IGdldHMgdGhlIGV4cHJlc3Npb24gNCBtb2R1bG8gNQotOwljbGR3eCw0ICVyNSgwLCVyNCksJXIlcjI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2Rjb3IucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDc0NTU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZGNvci5zCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZGNvciAlcjQsJXI1Ci0JZGNvcixzYnogJXI0LCVyNQotCWRjb3Isc2h6ICVyNCwlcjUKLQlkY29yLHNkYyAlcjQsJXI1Ci0JZGNvcixzYmMgJXI0LCVyNQotCWRjb3Isc2hjICVyNCwlcjUKLQlkY29yLHRyICVyNCwlcjUKLQlkY29yLG5ieiAlcjQsJXI1Ci0JZGNvcixuaHogJXI0LCVyNQotCWRjb3IsbmRjICVyNCwlcjUKLQlkY29yLG5iYyAlcjQsJXI1Ci0JZGNvcixuaGMgJXI0LCVyNQotCi0JaWRjb3IgJXI0LCVyNQotCWlkY29yLHNieiAlcjQsJXI1Ci0JaWRjb3Isc2h6ICVyNCwlcjUKLQlpZGNvcixzZGMgJXI0LCVyNQotCWlkY29yLHNiYyAlcjQsJXI1Ci0JaWRjb3Isc2hjICVyNCwlcjUKLQlpZGNvcix0ciAlcjQsJXI1Ci0JaWRjb3IsbmJ6ICVyNCwlcjUKLQlpZGNvcixuaHogJXI0LCVyNQotCWlkY29yLG5kYyAlcjQsJXI1Ci0JaWRjb3IsbmJjICVyNCwlcjUKLQlpZGNvcixuaGMgJXI0LCVyNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kZXBvc2l0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4NTNiMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RlcG9zaXQucworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXpkZXAgJXI0LDUsMTAsJXI2Ci0JemRlcCw9ICVyNCw1LDEwLCVyNgotCXpkZXAsPCAlcjQsNSwxMCwlcjYKLQl6ZGVwLG9kICVyNCw1LDEwLCVyNgotCXpkZXAsdHIgJXI0LDUsMTAsJXI2Ci0JemRlcCw8PiAlcjQsNSwxMCwlcjYKLQl6ZGVwLD49ICVyNCw1LDEwLCVyNgotCXpkZXAsZXYgJXI0LDUsMTAsJXI2Ci0KLQlkZXAgJXI0LDUsMTAsJXI2Ci0JZGVwLD0gJXI0LDUsMTAsJXI2Ci0JZGVwLDwgJXI0LDUsMTAsJXI2Ci0JZGVwLG9kICVyNCw1LDEwLCVyNgotCWRlcCx0ciAlcjQsNSwxMCwlcjYKLQlkZXAsPD4gJXI0LDUsMTAsJXI2Ci0JZGVwLD49ICVyNCw1LDEwLCVyNgotCWRlcCxldiAlcjQsNSwxMCwlcjYKLQotCXp2ZGVwICVyNCw1LCVyNgotCXp2ZGVwLD0gJXI0LDUsJXI2Ci0JenZkZXAsPCAlcjQsNSwlcjYKLQl6dmRlcCxvZCAlcjQsNSwlcjYKLQl6dmRlcCx0ciAlcjQsNSwlcjYKLQl6dmRlcCw8PiAlcjQsNSwlcjYKLQl6dmRlcCw+PSAlcjQsNSwlcjYKLQl6dmRlcCxldiAlcjQsNSwlcjYKLQotCXZkZXAgJXI0LDUsJXI2Ci0JdmRlcCw9ICVyNCw1LCVyNgotCXZkZXAsPCAlcjQsNSwlcjYKLQl2ZGVwLG9kICVyNCw1LCVyNgotCXZkZXAsdHIgJXI0LDUsJXI2Ci0JdmRlcCw8PiAlcjQsNSwlcjYKLQl2ZGVwLD49ICVyNCw1LCVyNgotCXZkZXAsZXYgJXI0LDUsJXI2Ci0KLQl2ZGVwaSAtMSw1LCVyNgotCXZkZXBpLD0gLTEsNSwlcjYKLQl2ZGVwaSw8IC0xLDUsJXI2Ci0JdmRlcGksb2QgLTEsNSwlcjYKLQl2ZGVwaSx0ciAtMSw1LCVyNgotCXZkZXBpLDw+IC0xLDUsJXI2Ci0JdmRlcGksPj0gLTEsNSwlcjYKLQl2ZGVwaSxldiAtMSw1LCVyNgotCi0JenZkZXBpIC0xLDUsJXI2Ci0JenZkZXBpLD0gLTEsNSwlcjYKLQl6dmRlcGksPCAtMSw1LCVyNgotCXp2ZGVwaSxvZCAtMSw1LCVyNgotCXp2ZGVwaSx0ciAtMSw1LCVyNgotCXp2ZGVwaSw8PiAtMSw1LCVyNgotCXp2ZGVwaSw+PSAtMSw1LCVyNgotCXp2ZGVwaSxldiAtMSw1LCVyNgotCi0JZGVwaSAtMSw0LDEwLCVyNgotCWRlcGksPSAtMSw0LDEwLCVyNgotCWRlcGksPCAtMSw0LDEwLCVyNgotCWRlcGksb2QgLTEsNCwxMCwlcjYKLQlkZXBpLHRyIC0xLDQsMTAsJXI2Ci0JZGVwaSw8PiAtMSw0LDEwLCVyNgotCWRlcGksPj0gLTEsNCwxMCwlcjYKLQlkZXBpLGV2IC0xLDQsMTAsJXI2Ci0KLQl6ZGVwaSAtMSw0LDEwLCVyNgotCXpkZXBpLD0gLTEsNCwxMCwlcjYKLQl6ZGVwaSw8IC0xLDQsMTAsJXI2Ci0JemRlcGksb2QgLTEsNCwxMCwlcjYKLQl6ZGVwaSx0ciAtMSw0LDEwLCVyNgotCXpkZXBpLDw+IC0xLDQsMTAsJXI2Ci0JemRlcGksPj0gLTEsNCwxMCwlcjYKLQl6ZGVwaSxldiAtMSw0LDEwLCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2RzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzFlMjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9kcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JZHMgJXI0LCVyNSwlcjYKLQlkcyw9ICVyNCwlcjUsJXI2Ci0JZHMsPCAlcjQsJXI1LCVyNgotCWRzLDw9ICVyNCwlcjUsJXI2Ci0JZHMsPDwgJXI0LCVyNSwlcjYKLQlkcyw8PD0gJXI0LCVyNSwlcjYKLQlkcyxzdiAlcjQsJXI1LCVyNgotCWRzLG9kICVyNCwlcjUsJXI2Ci0JZHMsdHIgJXI0LCVyNSwlcjYKLQlkcyw8PiAlcjQsJXI1LCVyNgotCWRzLD49ICVyNCwlcjUsJXI2Ci0JZHMsPiAlcjQsJXI1LCVyNgotCWRzLD4+PSAlcjQsJXI1LCVyNgotCWRzLD4+ICVyNCwlcjUsJXI2Ci0JZHMsbnN2ICVyNCwlcjUsJXI2Ci0JZHMsZXYgJXI0LCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZXh0cmFjdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDMwZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9leHRyYWN0LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlleHRydSAlcjQsNSwxMCwlcjYKLQlleHRydSw9ICVyNCw1LDEwLCVyNgotCWV4dHJ1LDwgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsb2QgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsdHIgJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPD4gJXI0LDUsMTAsJXI2Ci0JZXh0cnUsPj0gJXI0LDUsMTAsJXI2Ci0JZXh0cnUsZXYgJXI0LDUsMTAsJXI2Ci0KLQlleHRycyAlcjQsNSwxMCwlcjYKLQlleHRycyw9ICVyNCw1LDEwLCVyNgotCWV4dHJzLDwgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsb2QgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsdHIgJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPD4gJXI0LDUsMTAsJXI2Ci0JZXh0cnMsPj0gJXI0LDUsMTAsJXI2Ci0JZXh0cnMsZXYgJXI0LDUsMTAsJXI2Ci0KLQl2ZXh0cnUgJXI0LDUsJXI2Ci0JdmV4dHJ1LD0gJXI0LDUsJXI2Ci0JdmV4dHJ1LDwgJXI0LDUsJXI2Ci0JdmV4dHJ1LG9kICVyNCw1LCVyNgotCXZleHRydSx0ciAlcjQsNSwlcjYKLQl2ZXh0cnUsPD4gJXI0LDUsJXI2Ci0JdmV4dHJ1LD49ICVyNCw1LCVyNgotCXZleHRydSxldiAlcjQsNSwlcjYKLQotCXZleHRycyAlcjQsNSwlcjYKLQl2ZXh0cnMsPSAlcjQsNSwlcjYKLQl2ZXh0cnMsPCAlcjQsNSwlcjYKLQl2ZXh0cnMsb2QgJXI0LDUsJXI2Ci0JdmV4dHJzLHRyICVyNCw1LCVyNgotCXZleHRycyw8PiAlcjQsNSwlcjYKLQl2ZXh0cnMsPj0gJXI0LDUsJXI2Ci0JdmV4dHJzLGV2ICVyNCw1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mbWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjczMGI0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW0ucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZsZHd4ICVyNCglc3IwLCVyNSksJWZyNgotCWZsZHd4LHMgJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3gsbSAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGR3eCxzbSAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCAlcjQoJXNyMCwlcjUpLCVmcjYKLQlmbGRkeCxzICVyNCglc3IwLCVyNSksJWZyNgotCWZsZGR4LG0gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHgsc20gJXI0KCVzcjAsJXI1KSwlZnI2Ci0JZnN0d3ggJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0d3gscyAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3R3eCxtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHd4LHNtICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4ICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdGR4LHMgJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0ZHgsbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RkeCxzbSAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCAlZnI2LCVyNCglc3IwLCVyNSkKLQlmc3RxeCxzICVmcjYsJXI0KCVzcjAsJXI1KQotCWZzdHF4LG0gJWZyNiwlcjQoJXNyMCwlcjUpCi0JZnN0cXgsc20gJWZyNiwlcjQoJXNyMCwlcjUpCi0KLQlmbGR3cyAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkd3MsbWIgMCglc3IwLCVyNSksJWZyNgotCWZsZHdzLG1hIDAoJXNyMCwlcjUpLCVmcjYKLQlmbGRkcyAwKCVzcjAsJXI1KSwlZnI2Ci0JZmxkZHMsbWIgMCglc3IwLCVyNSksJWZyNgotCWZsZGRzLG1hIDAoJXNyMCwlcjUpLCVmcjYKLQlmc3R3cyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0d3MsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHdzLG1hICVmcjYsMCglc3IwLCVyNSkKLQlmc3RkcyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0ZHMsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdGRzLG1hICVmcjYsMCglc3IwLCVyNSkKLQlmc3RxcyAlZnI2LDAoJXNyMCwlcjUpCi0JZnN0cXMsbWIgJWZyNiwwKCVzcjAsJXI1KQotCWZzdHFzLG1hICVmcjYsMCglc3IwLCVyNSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZtZW1MUmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMzMGJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZm1lbUxSYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0JLmNvZGUKLQkuZXhwb3J0CQlmCi1mCi0JLnByb2MKLQkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscwotCS5lbnRyeQotCi0JZnN0d3MJCSVmcjZSLDAoJXIyNikKLQlmc3R3cwkJJWZyNkwsNCglcjI2KQotCWZzdHdzCQklZnI2LDgoJXIyNikKLQotCWZzdGRzCQklZnI2UiwwKCVyMjYpCi0JZnN0ZHMJCSVmcjZMLDQoJXIyNikKLQlmc3RkcwkJJWZyNiw4KCVyMjYpCi0KLQlmbGR3cwkJMCglcjI2KSwlZnI2UgotCWZsZHdzCQk0KCVyMjYpLCVmcjZMCi0JZmxkd3MJCTgoJXIyNiksJWZyNgotCi0JZmxkZHMJCTAoJXIyNiksJWZyNlIKLQlmbGRkcwkJNCglcjI2KSwlZnI2TAotCWZsZGRzCQk4KCVyMjYpLCVmcjYKLQotCWZzdHdzCQklZnI2UiwwKCVzcjAsJXIyNikKLQlmc3R3cwkJJWZyNkwsNCglc3IwLCVyMjYpCi0JZnN0d3MJCSVmcjYsOCglc3IwLCVyMjYpCi0KLQlmc3RkcwkJJWZyNlIsMCglc3IwLCVyMjYpCi0JZnN0ZHMJCSVmcjZMLDQoJXNyMCwlcjI2KQotCWZzdGRzCQklZnI2LDgoJXNyMCwlcjI2KQotCi0JZmxkd3MJCTAoJXNyMCwlcjI2KSwlZnI2UgotCWZsZHdzCQk0KCVzcjAsJXIyNiksJWZyNkwKLQlmbGR3cwkJOCglc3IwLCVyMjYpLCVmcjYKLQotCWZsZGRzCQkwKCVzcjAsJXIyNiksJWZyNlIKLQlmbGRkcwkJNCglc3IwLCVyMjYpLCVmcjZMCi0JZmxkZHMJCTgoJXNyMCwlcjI2KSwlZnI2Ci0KLQlmc3R3eAkJJWZyNlIsJXIyNSglcjI2KQotCWZzdHd4CQklZnI2TCwlcjI1KCVyMjYpCi0JZnN0d3gJCSVmcjYsJXIyNSglcjI2KQotCi0JZnN0ZHgJCSVmcjZSLCVyMjUoJXIyNikKLQlmc3RkeAkJJWZyNkwsJXIyNSglcjI2KQotCWZzdGR4CQklZnI2LCVyMjUoJXIyNikKLQotCWZsZHd4CQklcjI1KCVyMjYpLCVmcjZSCi0JZmxkd3gJCSVyMjUoJXIyNiksJWZyNkwKLQlmbGR3eAkJJXIyNSglcjI2KSwlZnI2Ci0KLQlmbGRkeAkJJXIyNSglcjI2KSwlZnI2UgotCWZsZGR4CQklcjI1KCVyMjYpLCVmcjZMCi0JZmxkZHgJCSVyMjUoJXIyNiksJWZyNgotCi0JZnN0d3gJCSVmcjZSLCVyMjUoJXNyMCwlcjI2KQotCWZzdHd4CQklZnI2TCwlcjI1KCVzcjAsJXIyNikKLQlmc3R3eAkJJWZyNiwlcjI1KCVzcjAsJXIyNikKLQotCWZzdGR4CQklZnI2UiwlcjI1KCVzcjAsJXIyNikKLQlmc3RkeAkJJWZyNkwsJXIyNSglc3IwLCVyMjYpCi0JZnN0ZHgJCSVmcjYsJXIyNSglc3IwLCVyMjYpCi0KLQlmbGR3eAkJJXIyNSglc3IwLCVyMjYpLCVmcjZSCi0JZmxkd3gJCSVyMjUoJXNyMCwlcjI2KSwlZnI2TAotCWZsZHd4CQklcjI1KCVzcjAsJXIyNiksJWZyNgotCi0JZmxkZHgJCSVyMjUoJXNyMCwlcjI2KSwlZnI2UgotCWZsZGR4CQklcjI1KCVzcjAsJXIyNiksJWZyNkwKLQlmbGRkeAkJJXIyNSglc3IwLCVyMjYpLCVmcjYKLQotCWJ2CQklcjAoJXIyKQotCW5vcAotCi0JLmV4aXQKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb21wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwMTdmNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbXAucworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZjcHksc2dsICVmcjUsJWZyMTAKLQlmY3B5LGRibCAlZnI1LCVmcjEwCi0JZmNweSxxdWFkICVmcjUsJWZyMTAKLQlmY3B5LHNnbCAlZnIyMCwlZnIyNAotCWZjcHksZGJsICVmcjIwLCVmcjI0Ci0KLQlmYWJzLHNnbCAlZnI1LCVmcjEwCi0JZmFicyxkYmwgJWZyNSwlZnIxMAotCWZhYnMscXVhZCAlZnI1LCVmcjEwCi0JZmFicyxzZ2wgJWZyMjAsJWZyMjQKLQlmYWJzLGRibCAlZnIyMCwlZnIyNAotCi0JZnNxcnQsc2dsICVmcjUsJWZyMTAKLQlmc3FydCxkYmwgJWZyNSwlZnIxMAotCWZzcXJ0LHF1YWQgJWZyNSwlZnIxMAotCWZzcXJ0LHNnbCAlZnIyMCwlZnIyNAotCWZzcXJ0LGRibCAlZnIyMCwlZnIyNAotCi0JZnJuZCxzZ2wgJWZyNSwlZnIxMAotCWZybmQsZGJsICVmcjUsJWZyMTAKLQlmcm5kLHF1YWQgJWZyNSwlZnIxMAotCWZybmQsc2dsICVmcjIwLCVmcjI0Ci0JZnJuZCxkYmwgJWZyMjAsJWZyMjQKLQkKLQlmYWRkLHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmYWRkLGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmYWRkLHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZmFkZCxzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmYWRkLGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZhZGQscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZnN1YixzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZnN1YixkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZnN1YixxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZzdWIsc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZnN1YixkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmc3ViLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZtcHksc2dsICVmcjQsJWZyOCwlZnIxMgotCWZtcHksZGJsICVmcjQsJWZyOCwlZnIxMgotCWZtcHkscXVhZCAlZnI0LCVmcjgsJWZyMTIKLQlmbXB5LHNnbCAlZnIyMCwlZnIyNCwlZnIyOAotCWZtcHksZGJsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZm1weSxxdWFkICVmcjIwLCVmcjI0LCVmcjI4Ci0KLQlmZGl2LHNnbCAlZnI0LCVmcjgsJWZyMTIKLQlmZGl2LGRibCAlZnI0LCVmcjgsJWZyMTIKLQlmZGl2LHF1YWQgJWZyNCwlZnI4LCVmcjEyCi0JZmRpdixzZ2wgJWZyMjAsJWZyMjQsJWZyMjgKLQlmZGl2LGRibCAlZnIyMCwlZnIyNCwlZnIyOAotCWZkaXYscXVhZCAlZnIyMCwlZnIyNCwlZnIyOAotCi0JZnJlbSxzZ2wgJWZyNCwlZnI4LCVmcjEyCi0JZnJlbSxkYmwgJWZyNCwlZnI4LCVmcjEyCi0JZnJlbSxxdWFkICVmcjQsJWZyOCwlZnIxMgotCWZyZW0sc2dsICVmcjIwLCVmcjI0LCVmcjI4Ci0JZnJlbSxkYmwgJWZyMjAsJWZyMjQsJWZyMjgKLQlmcmVtLHF1YWQgJWZyMjAsJWZyMjQsJWZyMjgKLQotCWZtcHlhZGQsc2dsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCi0JZm1weWFkZCxkYmwgJWZyMTYsJWZyMTcsJWZyMTgsJWZyMTksJWZyMjAKLQlmbXB5c3ViLHNnbCAlZnIxNiwlZnIxNywlZnIxOCwlZnIxOSwlZnIyMAotCWZtcHlzdWIsZGJsICVmcjE2LCVmcjE3LCVmcjE4LCVmcjE5LCVmcjIwCi0KLQl4bXB5dSAlZnI0LCVmcjUsJWZyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9jb252LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbnYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0NGNiMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2NvbnYucworKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZjbnZmZixzZ2wsc2dsICVmcjUsJWZyMTAKLQlmY252ZmYsc2dsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZmLHNnbCxxdWFkICVmcjUsJWZyMTAKLQlmY252ZmYsZGJsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZmLGRibCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmZixkYmwscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZmLHF1YWQsc2dsICVmcjUsJWZyMTAKLQlmY252ZmYscXVhZCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmZixxdWFkLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmZixzZ2wsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZmLHNnbCxkYmwgJWZyMjAsJWZyMjQKLQlmY252ZmYsc2dsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252ZmYsZGJsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmZixkYmwsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZmLGRibCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZmLHF1YWQsc2dsICVmcjIwLCVmcjI0Ci0JZmNudmZmLHF1YWQsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZmLHF1YWQscXVhZCAlZnIyMCwlZnIyNAotCi0JZmNudnhmLHNnbCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZ4ZixzZ2wsZGJsICVmcjUsJWZyMTAKLQlmY252eGYsc2dsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZ4ZixkYmwsc2dsICVmcjUsJWZyMTAKLQlmY252eGYsZGJsLGRibCAlZnI1LCVmcjEwCi0JZmNudnhmLGRibCxxdWFkICVmcjUsJWZyMTAKLQlmY252eGYscXVhZCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZ4ZixxdWFkLGRibCAlZnI1LCVmcjEwCi0JZmNudnhmLHF1YWQscXVhZCAlZnI1LCVmcjEwCi0JZmNudnhmLHNnbCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252eGYsc2dsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixzZ2wscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZ4ZixkYmwsc2dsICVmcjIwLCVmcjI0Ci0JZmNudnhmLGRibCxkYmwgJWZyMjAsJWZyMjQKLQlmY252eGYsZGJsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252eGYscXVhZCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252eGYscXVhZCxkYmwgJWZyMjAsJWZyMjQKLQlmY252eGYscXVhZCxxdWFkICVmcjIwLCVmcjI0Ci0KLQlmY252Zngsc2dsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZ4LHNnbCxkYmwgJWZyNSwlZnIxMAotCWZjbnZmeCxzZ2wscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4LGRibCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeCxkYmwsZGJsICVmcjUsJWZyMTAKLQlmY252ZngsZGJsLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeCxxdWFkLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZ4LHF1YWQsZGJsICVmcjUsJWZyMTAKLQlmY252ZngscXVhZCxxdWFkICVmcjUsJWZyMTAKLQlmY252Zngsc2dsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmeCxzZ2wsZGJsICVmcjIwLCVmcjI0Ci0JZmNudmZ4LHNnbCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZ4LGRibCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252ZngsZGJsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeCxkYmwscXVhZCAlZnIyMCwlZnIyNAotCWZjbnZmeCxxdWFkLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmeCxxdWFkLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeCxxdWFkLHF1YWQgJWZyMjAsJWZyMjQKLQotCWZjbnZmeHQsc2dsLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxzZ2wsZGJsICVmcjUsJWZyMTAKLQlmY252Znh0LHNnbCxxdWFkICVmcjUsJWZyMTAKLQlmY252Znh0LGRibCxzZ2wgJWZyNSwlZnIxMAotCWZjbnZmeHQsZGJsLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxkYmwscXVhZCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxxdWFkLHNnbCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxxdWFkLGRibCAlZnI1LCVmcjEwCi0JZmNudmZ4dCxxdWFkLHF1YWQgJWZyNSwlZnIxMAotCWZjbnZmeHQsc2dsLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmeHQsc2dsLGRibCAlZnIyMCwlZnIyNAotCWZjbnZmeHQsc2dsLHF1YWQgJWZyMjAsJWZyMjQKLQlmY252Znh0LGRibCxzZ2wgJWZyMjAsJWZyMjQKLQlmY252Znh0LGRibCxkYmwgJWZyMjAsJWZyMjQKLQlmY252Znh0LGRibCxxdWFkICVmcjIwLCVmcjI0Ci0JZmNudmZ4dCxxdWFkLHNnbCAlZnIyMCwlZnIyNAotCWZjbnZmeHQscXVhZCxkYmwgJWZyMjAsJWZyMjQKLQlmY252Znh0LHF1YWQscXVhZCAlZnIyMCwlZnIyNAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX2ZjbXAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfZmNtcC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmQwOTJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvZnBfZmNtcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWZjbXAsc2dsLGZhbHNlPyAlZnI0LCVmcjUKLQlmY21wLHNnbCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLHNnbCw/ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE8PT4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPSAlZnI0LCVmcjUKLQlmY21wLHNnbCw9VCAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT8+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCw8ICVmcjQsJWZyNQotCWZjbXAsc2dsLD88ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPz4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPzw9ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE+ICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPiAlZnI0LCVmcjUKLQlmY21wLHNnbCw/PiAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT88ICVmcjQsJWZyNQotCWZjbXAsc2dsLD49ICVmcjQsJWZyNQotCWZjbXAsc2dsLD8+PSAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPCAlZnI0LCVmcjUKLQlmY21wLHNnbCwhPz0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsPD4gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT0gJWZyNCwlZnI1Ci0JZmNtcCxzZ2wsIT1UICVmcjQsJWZyNQotCWZjbXAsc2dsLCE/ICVmcjQsJWZyNQotCWZjbXAsc2dsLDw9PiAlZnI0LCVmcjUKLQlmY21wLHNnbCx0cnVlPyAlZnI0LCVmcjUKLQlmY21wLHNnbCx0cnVlICVmcjQsJWZyNQotCi0JZmNtcCxkYmwsZmFsc2U/ICVmcjQsJWZyNQotCWZjbXAsZGJsLGZhbHNlICVmcjQsJWZyNQotCWZjbXAsZGJsLD8gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsITw9PiAlZnI0LCVmcjUKLQlmY21wLGRibCw9ICVmcjQsJWZyNQotCWZjbXAsZGJsLD1UICVmcjQsJWZyNQotCWZjbXAsZGJsLD89ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPz49ICVmcjQsJWZyNQotCWZjbXAsZGJsLDwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPzwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT49ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PiAlZnI0LCVmcjUKLQlmY21wLGRibCw8PSAlZnI0LCVmcjUKLQlmY21wLGRibCw/PD0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT4gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT88PSAlZnI0LCVmcjUKLQlmY21wLGRibCw+ICVmcjQsJWZyNQotCWZjbXAsZGJsLD8+ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8PSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPzwgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPj0gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPz49ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE8ICVmcjQsJWZyNQotCWZjbXAsZGJsLCE/PSAlZnI0LCVmcjUKLQlmY21wLGRibCw8PiAlZnI0LCVmcjUKLQlmY21wLGRibCwhPSAlZnI0LCVmcjUKLQlmY21wLGRibCwhPVQgJWZyNCwlZnI1Ci0JZmNtcCxkYmwsIT8gJWZyNCwlZnI1Ci0JZmNtcCxkYmwsPD0+ICVmcjQsJWZyNQotCWZjbXAsZGJsLHRydWU/ICVmcjQsJWZyNQotCWZjbXAsZGJsLHRydWUgJWZyNCwlZnI1Ci0KLQlmY21wLHF1YWQsZmFsc2U/ICVmcjQsJWZyNQotCWZjbXAscXVhZCxmYWxzZSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPyAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITw9PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPVQgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD89ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/Pj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLDwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD88ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PiAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD88PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsIT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8+ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPD0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PCAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPj0gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLD8+PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsITwgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/PSAlZnI0LCVmcjUKLQlmY21wLHF1YWQsPD4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE9ICVmcjQsJWZyNQotCWZjbXAscXVhZCwhPVQgJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLCE/ICVmcjQsJWZyNQotCWZjbXAscXVhZCw8PT4gJWZyNCwlZnI1Ci0JZmNtcCxxdWFkLHRydWU/ICVmcjQsJWZyNQotCWZjbXAscXVhZCx0cnVlICVmcjQsJWZyNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9mcF9taXNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX21pc2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2YWMwNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ZwX21pc2MucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotZnB1X21pc2NfdGVzdHM6IAotCWZ0ZXN0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltZW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1lbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQ5YzEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvaW1lbS5zCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBpbnRlZ2VyX21lbW9yeV90ZXN0cyxDT0RFCi0JLkVYUE9SVCBpbnRlZ2VyX2luZGV4aW5nX2xvYWQsQ09ERQotCS5FWFBPUlQgaW50ZWdlcl9sb2FkX3Nob3J0X21lbW9yeSxDT0RFCi0JLkVYUE9SVCBpbnRlZ2VyX3N0b3JlX3Nob3J0X21lbW9yeSxDT0RFCi0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLTsgQmFzaWMgaW50ZWdlciBtZW1vcnkgdGVzdHMgd2hpY2ggYWxzbyB0ZXN0IHRoZSB2YXJpb3VzIAotOyBhZGRyZXNzaW5nIG1vZGVzIGFuZCBjb21wbGV0ZXJzLgotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi07IAotaW50ZWdlcl9tZW1vcnlfdGVzdHM6IAotCWxkdyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRoIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGIgMCglc3IwLCVyNCksJXIyNgotCXN0dyAlcjI2LDAoJXNyMCwlcjQpCi0Jc3RoICVyMjYsMCglc3IwLCVyNCkKLQlzdGIgJXIyNiwwKCVzcjAsJXI0KQotCi07IFNob3VsZCBtYWtlIHN1cmUgcHJlL3Bvc3QgbW9kZXMgYXJlIHJlY29nbml6ZWQgY29ycmVjdGx5LgotCWxkd20gMCglc3IwLCVyNCksJXIyNgotCXN0d20gJXIyNiwwKCVzcjAsJXI0KQotCi1pbnRlZ2VyX2luZGV4aW5nX2xvYWQ6IAotCWxkd3ggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGR3eCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkd3gsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZHd4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRoeCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkaHgsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGh4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkYnggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRieCxzICVyNSglc3IwLCVyNCksJXIyNgotCWxkYngsbSAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGJ4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCWxkd2F4ICVyNSglcjQpLCVyMjYKLQlsZHdheCxzICVyNSglcjQpLCVyMjYKLQlsZHdheCxtICVyNSglcjQpLCVyMjYKLQlsZHdheCxzbSAlcjUoJXI0KSwlcjI2Ci0JbGRjd3ggJXI1KCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3gscyAlcjUoJXNyMCwlcjQpLCVyMjYKLQlsZGN3eCxtICVyNSglc3IwLCVyNCksJXIyNgotCWxkY3d4LHNtICVyNSglc3IwLCVyNCksJXIyNgotCi1pbnRlZ2VyX2xvYWRfc2hvcnRfbWVtb3J5OiAKLQlsZHdzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGhzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzLG1iIDAoJXNyMCwlcjQpLCVyMjYKLQlsZGJzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQlsZHdhcyAwKCVyNCksJXIyNgotCWxkd2FzLG1iIDAoJXI0KSwlcjI2Ci0JbGR3YXMsbWEgMCglcjQpLCVyMjYKLQlsZGN3cyAwKCVzcjAsJXI0KSwlcjI2Ci0JbGRjd3MsbWIgMCglc3IwLCVyNCksJXIyNgotCWxkY3dzLG1hIDAoJXNyMCwlcjQpLCVyMjYKLQotaW50ZWdlcl9zdG9yZV9zaG9ydF9tZW1vcnk6IAotCXN0d3MgJXIyNiwwKCVzcjAsJXI0KQotCXN0d3MsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0d3MsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0aHMsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMsbWIgJXIyNiwwKCVzcjAsJXI0KQotCXN0YnMsbWEgJXIyNiwwKCVzcjAsJXI0KQotCXN0d2FzICVyMjYsMCglcjQpCi0Jc3R3YXMsbWIgJXIyNiwwKCVyNCkKLQlzdHdhcyxtYSAlcjI2LDAoJXI0KQotCXN0YnlzICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxiICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxlICVyMjYsMCglc3IwLCVyNCkKLQlzdGJ5cyxiLG0gJXIyNiwwKCVzcjAsJXI0KQotCXN0YnlzLGUsbSAlcjI2LDAoJXNyMCwlcjQpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltbWVkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2ltbWVkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjdkMmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9pbW1lZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi1pbW1lZGlhdGVfdGVzdHM6IAotCWxkbyA1KCVyMjYpLCVyMjYKLQlsZGlsIEwlMHhkZWFkYmVlZiwlcjI2Ci0JYWRkaWwgTCUweGRlYWRiZWVmLCVyNQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL2xvZ2ljYWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbG9naWNhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzEwNTllLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvbG9naWNhbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jb3IgJXI0LCVyNSwlcjYKLQlvciw9ICVyNCwlcjUsJXI2Ci0Jb3IsPCAlcjQsJXI1LCVyNgotCW9yLDw9ICVyNCwlcjUsJXI2Ci0Jb3Isb2QgJXI0LCVyNSwlcjYKLQlvcix0ciAlcjQsJXI1LCVyNgotCW9yLDw+ICVyNCwlcjUsJXI2Ci0Jb3IsPj0gJXI0LCVyNSwlcjYKLQlvciw+ICVyNCwlcjUsJXI2Ci0Jb3IsZXYgJXI0LCVyNSwlcjYKLQotCXhvciAlcjQsJXI1LCVyNgotCXhvciw9ICVyNCwlcjUsJXI2Ci0JeG9yLDwgJXI0LCVyNSwlcjYKLQl4b3IsPD0gJXI0LCVyNSwlcjYKLQl4b3Isb2QgJXI0LCVyNSwlcjYKLQl4b3IsdHIgJXI0LCVyNSwlcjYKLQl4b3IsPD4gJXI0LCVyNSwlcjYKLQl4b3IsPj0gJXI0LCVyNSwlcjYKLQl4b3IsPiAlcjQsJXI1LCVyNgotCXhvcixldiAlcjQsJXI1LCVyNgotCi0JYW5kICVyNCwlcjUsJXI2Ci0JYW5kLD0gJXI0LCVyNSwlcjYKLQlhbmQsPCAlcjQsJXI1LCVyNgotCWFuZCw8PSAlcjQsJXI1LCVyNgotCWFuZCxvZCAlcjQsJXI1LCVyNgotCWFuZCx0ciAlcjQsJXI1LCVyNgotCWFuZCw8PiAlcjQsJXI1LCVyNgotCWFuZCw+PSAlcjQsJXI1LCVyNgotCWFuZCw+ICVyNCwlcjUsJXI2Ci0JYW5kLGV2ICVyNCwlcjUsJXI2Ci0KLQlhbmRjbSAlcjQsJXI1LCVyNgotCWFuZGNtLD0gJXI0LCVyNSwlcjYKLQlhbmRjbSw8ICVyNCwlcjUsJXI2Ci0JYW5kY20sPD0gJXI0LCVyNSwlcjYKLQlhbmRjbSxvZCAlcjQsJXI1LCVyNgotCWFuZGNtLHRyICVyNCwlcjUsJXI2Ci0JYW5kY20sPD4gJXI0LCVyNSwlcjYKLQlhbmRjbSw+PSAlcjQsJXI1LCVyNgotCWFuZGNtLD4gJXI0LCVyNSwlcjYKLQlhbmRjbSxldiAlcjQsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3B1cmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMTlmOTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9wdXJnZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0JcGR0bGIgJXI0KCVzcjAsJXI1KQotCXBkdGxiLG0gJXI0KCVzcjAsJXI1KQotCXBpdGxiICVyNCglc3I0LCVyNSkKLQlwaXRsYixtICVyNCglc3I0LCVyNSkKLQlwZHRsYmUgJXI0KCVzcjAsJXI1KQotCXBkdGxiZSxtICVyNCglc3IwLCVyNSkKLQlwaXRsYmUgJXI0KCVzcjQsJXI1KQotCXBpdGxiZSxtICVyNCglc3I0LCVyNSkKLQlwZGMgJXI0KCVzcjAsJXI1KQotCXBkYyxtICVyNCglc3IwLCVyNSkKLQlmZGMgJXI0KCVzcjAsJXI1KQotCWZkYyxtICVyNCglc3IwLCVyNSkKLQlmaWMgJXI0KCVzcjQsJXI1KQotCWZpYyxtICVyNCglc3I0LCVyNSkKLQlmZGNlICVyNCglc3IwLCVyNSkKLQlmZGNlLG0gJXI0KCVzcjAsJXI1KQotCWZpY2UgJXI0KCVzcjQsJXI1KQotCWZpY2UsbSAlcjQoJXNyNCwlcjUpCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gxYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoMWFkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjVkNmNjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gxYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzaDFhZGQgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLDwgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLDw9ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLHpudiAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLG9kICAlcjQsJXI1LCVyNgotCXNoMWFkZCx0ciAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsPD4gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLD49ICAlcjQsJXI1LCVyNgotCXNoMWFkZCw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZCx1diAgJXI0LCVyNSwlcjYKLQlzaDFhZGQsdm56ICAlcjQsJXI1LCVyNgotCXNoMWFkZCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gxYWRkbCAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw8ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPD0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCxudXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCxzdiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLG9kICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsdHIgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbCw8PiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLD49ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsPiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRsLHV2ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsdm56ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsbnN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZGwsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDFhZGRvICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLDwgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw8PSAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLG51diAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLHpudiAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLHN2ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sb2QgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyx0ciAgJXI0LCVyNSwlcjYKLQlzaDFhZGRvLDw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sPj0gICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyw+ICAlcjQsJXI1LCVyNgotCXNoMWFkZG8sdXYgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyx2bnogICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gxYWRkbyxldiAgJXI0LCVyNSwlcjYKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDJhZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2gyYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOWM5OWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDJhZGQucworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCXNoMmFkZCAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPCAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPD0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsem52ICAlcjQsJXI1LCVyNgotCXNoMmFkZCxzdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHRyICAlcjQsJXI1LCVyNgotCXNoMmFkZCw8PiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLHV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGQsZXYgICVyNCwlcjUsJXI2Ci0KLQlzaDJhZGRsICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLDwgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw8PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLG51diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHpudiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLHN2ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsb2QgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx0ciAgJXI0LCVyNSwlcjYKLQlzaDJhZGRsLDw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsPj0gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCw+ICAlcjQsJXI1LCVyNgotCXNoMmFkZGwsdXYgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCx2bnogICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxuc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbCxldiAgJXI0LCVyNSwlcjYKLQotCXNoMmFkZG8gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLDw9ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sbnV2ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sem52ICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sc3YgICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyxvZCAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHRyICAlcjQsJXI1LCVyNgotCXNoMmFkZG8sPD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyw+PSAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLD4gICVyNCwlcjUsJXI2Ci0Jc2gyYWRkbyx1diAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLHZueiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDJhZGRvLGV2ICAlcjQsJXI1LCVyNgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoM2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zaDNhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxZTZlMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoM2FkZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc2gzYWRkICAlcjQsJXI1LCVyNgotCXNoM2FkZCw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZCw8ICAlcjQsJXI1LCVyNgotCXNoM2FkZCw8PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsbnV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZCx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxvZCAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsdHIgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLDw+ICAlcjQsJXI1LCVyNgotCXNoM2FkZCw+PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsPiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsdXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkLHZueiAgJXI0LCVyNSwlcjYKLQlzaDNhZGQsbnN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZCxldiAgJXI0LCVyNSwlcjYKLQotCXNoM2FkZGwgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLDw9ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsbnV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsem52ICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsc3YgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCxvZCAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHRyICAlcjQsJXI1LCVyNgotCXNoM2FkZGwsPD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCw+PSAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLD4gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbCx1diAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLHZueiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLG5zdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRsLGV2ICAlcjQsJXI1LCVyNgotCi0Jc2gzYWRkbyAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw8ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPD0gICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxudXYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyx6bnYgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyxzdiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLG9kICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sdHIgICVyNCwlcjUsJXI2Ci0Jc2gzYWRkbyw8PiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLD49ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sPiAgJXI0LCVyNSwlcjYKLQlzaDNhZGRvLHV2ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sdm56ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sbnN2ICAlcjQsJXI1LCVyNgotCXNoM2FkZG8sZXYgICVyNCwlcjUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hpZnQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc2hpZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjNjIxZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3NoaWZ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQl2c2hkICVyNCwlcjUsJXI2Ci0JdnNoZCw9ICVyNCwlcjUsJXI2Ci0JdnNoZCw8ICVyNCwlcjUsJXI2Ci0JdnNoZCxvZCAlcjQsJXI1LCVyNgotCXZzaGQsdHIgJXI0LCVyNSwlcjYKLQl2c2hkLDw+ICVyNCwlcjUsJXI2Ci0JdnNoZCw+PSAlcjQsJXI1LCVyNgotCXZzaGQsZXYgJXI0LCVyNSwlcjYKLQotCXNoZCAlcjQsJXI1LDUsJXI2Ci0Jc2hkLD0gJXI0LCVyNSw1LCVyNgotCXNoZCw8ICVyNCwlcjUsNSwlcjYKLQlzaGQsb2QgJXI0LCVyNSw1LCVyNgotCXNoZCx0ciAlcjQsJXI1LDUsJXI2Ci0Jc2hkLDw+ICVyNCwlcjUsNSwlcjYKLQlzaGQsPj0gJXI0LCVyNSw1LCVyNgotCXNoZCxldiAlcjQsJXI1LDUsJXI2Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BlY2lhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcGVjaWFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDE2NjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcGVjaWFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQlnZncgJXI0KCVzcjAsJXI1KQotCWdmdyxtICVyNCglc3IwLCVyNSkKLQlnZnIgJXI0KCVzcjAsJXI1KQotCWdmcixtICVyNCglc3IwLCVyNSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3BvcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcG9wLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzZhOTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zcG9wLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5Lgotc3BvcF90ZXN0czogCi0Jc3BvcDAsNCw1Ci0Jc3BvcDAsNCwxMTUKLQlzcG9wMCw0LDUsbgotCXNwb3AwLDQsMTE1LG4KLQlzcG9wMSw0LDUgJXI1Ci0Jc3BvcDEsNCwxMTUgJXI1Ci0Jc3BvcDEsNCw1LG4gJXI1Ci0Jc3BvcDEsNCwxMTUsbiAlcjUKLQlzcG9wMiw0LDUgJXI1Ci0Jc3BvcDIsNCwxMTUgJXI1Ci0Jc3BvcDIsNCw1LG4gJXI1Ci0Jc3BvcDIsNCwxMTUsbiAlcjUKLQlzcG9wMyw0LDUgJXI1LCVyNgotCXNwb3AzLDQsMTE1ICVyNSwlcjYKLQlzcG9wMyw0LDUsbiAlcjUsJXI2Ci0Jc3BvcDMsNCwxMTUsbiAlcjUsJXI2Ci0KLTsgR2FzIGZ1Y2tzIHRoaXMgdXAuLi4gIFRoaW5rcyBpdCBoYXMgdGhlIGV4cHJlc3Npb24gNSBtb2QgcjUuCi07CXNwb3AxLDQsNSAlcjUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3N1Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGZmMGRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0Jc3ViICVyNCwlcjUsJXI2Ci0Jc3ViLD0gJXI0LCVyNSwlcjYKLQlzdWIsPCAlcjQsJXI1LCVyNgotCXN1Yiw8PSAlcjQsJXI1LCVyNgotCXN1Yiw8PCAlcjQsJXI1LCVyNgotCXN1Yiw8PD0gJXI0LCVyNSwlcjYKLQlzdWIsc3YgJXI0LCVyNSwlcjYKLQlzdWIsb2QgJXI0LCVyNSwlcjYKLQlzdWIsdHIgJXI0LCVyNSwlcjYKLQlzdWIsPD4gJXI0LCVyNSwlcjYKLQlzdWIsPj0gJXI0LCVyNSwlcjYKLQlzdWIsPiAlcjQsJXI1LCVyNgotCXN1Yiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWIsPj4gJXI0LCVyNSwlcjYKLQlzdWIsbnN2ICVyNCwlcjUsJXI2Ci0Jc3ViLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJvICVyNCwlcjUsJXI2Ci0Jc3Vibyw9ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8ICVyNCwlcjUsJXI2Ci0Jc3Vibyw8PSAlcjQsJXI1LCVyNgotCXN1Ym8sPDwgJXI0LCVyNSwlcjYKLQlzdWJvLDw8PSAlcjQsJXI1LCVyNgotCXN1Ym8sc3YgJXI0LCVyNSwlcjYKLQlzdWJvLG9kICVyNCwlcjUsJXI2Ci0Jc3Vibyx0ciAlcjQsJXI1LCVyNgotCXN1Ym8sPD4gJXI0LCVyNSwlcjYKLQlzdWJvLD49ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+ICVyNCwlcjUsJXI2Ci0Jc3Vibyw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJvLD4+ICVyNCwlcjUsJXI2Ci0Jc3Vibyxuc3YgJXI0LCVyNSwlcjYKLQlzdWJvLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJiICVyNCwlcjUsJXI2Ci0Jc3ViYiw9ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8ICVyNCwlcjUsJXI2Ci0Jc3ViYiw8PSAlcjQsJXI1LCVyNgotCXN1YmIsPDwgJXI0LCVyNSwlcjYKLQlzdWJiLDw8PSAlcjQsJXI1LCVyNgotCXN1YmIsc3YgJXI0LCVyNSwlcjYKLQlzdWJiLG9kICVyNCwlcjUsJXI2Ci0Jc3ViYix0ciAlcjQsJXI1LCVyNgotCXN1YmIsPD4gJXI0LCVyNSwlcjYKLQlzdWJiLD49ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+ICVyNCwlcjUsJXI2Ci0Jc3ViYiw+Pj0gJXI0LCVyNSwlcjYKLQlzdWJiLD4+ICVyNCwlcjUsJXI2Ci0Jc3ViYixuc3YgJXI0LCVyNSwlcjYKLQlzdWJiLGV2ICVyNCwlcjUsJXI2Ci0KLQlzdWJibyAlcjQsJXI1LCVyNgotCXN1YmJvLD0gJXI0LCVyNSwlcjYKLQlzdWJibyw8ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPD0gJXI0LCVyNSwlcjYKLQlzdWJibyw8PCAlcjQsJXI1LCVyNgotCXN1YmJvLDw8PSAlcjQsJXI1LCVyNgotCXN1YmJvLHN2ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sb2QgJXI0LCVyNSwlcjYKLQlzdWJibyx0ciAlcjQsJXI1LCVyNgotCXN1YmJvLDw+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj0gJXI0LCVyNSwlcjYKLQlzdWJibyw+ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj49ICVyNCwlcjUsJXI2Ci0Jc3ViYm8sPj4gJXI0LCVyNSwlcjYKLQlzdWJibyxuc3YgJXI0LCVyNSwlcjYKLQlzdWJibyxldiAlcjQsJXI1LCVyNgotCi0Jc3VidCAlcjQsJXI1LCVyNgotCXN1YnQsPSAlcjQsJXI1LCVyNgotCXN1YnQsPCAlcjQsJXI1LCVyNgotCXN1YnQsPD0gJXI0LCVyNSwlcjYKLQlzdWJ0LDw8ICVyNCwlcjUsJXI2Ci0Jc3VidCw8PD0gJXI0LCVyNSwlcjYKLQlzdWJ0LHN2ICVyNCwlcjUsJXI2Ci0Jc3VidCxvZCAlcjQsJXI1LCVyNgotCXN1YnQsdHIgJXI0LCVyNSwlcjYKLQlzdWJ0LDw+ICVyNCwlcjUsJXI2Ci0Jc3VidCw+PSAlcjQsJXI1LCVyNgotCXN1YnQsPiAlcjQsJXI1LCVyNgotCXN1YnQsPj49ICVyNCwlcjUsJXI2Ci0Jc3VidCw+PiAlcjQsJXI1LCVyNgotCXN1YnQsbnN2ICVyNCwlcjUsJXI2Ci0Jc3VidCxldiAlcjQsJXI1LCVyNgotCi0Jc3VidG8gJXI0LCVyNSwlcjYKLQlzdWJ0byw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPCAlcjQsJXI1LCVyNgotCXN1YnRvLDw9ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPDwgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PD0gJXI0LCVyNSwlcjYKLQlzdWJ0byxzdiAlcjQsJXI1LCVyNgotCXN1YnRvLG9kICVyNCwlcjUsJXI2Ci0Jc3VidG8sdHIgJXI0LCVyNSwlcjYKLQlzdWJ0byw8PiAlcjQsJXI1LCVyNgotCXN1YnRvLD49ICVyNCwlcjUsJXI2Ci0Jc3VidG8sPiAlcjQsJXI1LCVyNgotCXN1YnRvLD4+PSAlcjQsJXI1LCVyNgotCXN1YnRvLD4+ICVyNCwlcjUsJXI2Ci0Jc3VidG8sbnN2ICVyNCwlcjUsJXI2Ci0Jc3VidG8sZXYgJXI0LCVyNSwlcjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3ViaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWJpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MzI2N2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zdWJpLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQmFzaWMgaW1tZWRpYXRlIGluc3RydWN0aW9uIHRlc3RzLiAgCi07Ci07IFdlIGNvdWxkL3Nob3VsZCB0ZXN0IHNvbWUgb2YgdGhlIGNvcm5lciBjYXNlcyBmb3IgcmVnaXN0ZXIgYW5kIAotOyBpbW1lZGlhdGUgZmllbGRzLiAgV2Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGFzc29ydGVkIGZpZWxkCi07IHNlbGVjdG9ycyB0byBtYWtlIHN1cmUgdGhleSdyZSBoYW5kbGVkIGNvcnJlY3RseS4KLQlzdWJpIDEyMywlcjUsJXI2Ci0Jc3ViaSw9IDEyMywlcjUsJXI2Ci0Jc3ViaSw8IDEyMywlcjUsJXI2Ci0Jc3ViaSw8PSAxMjMsJXI1LCVyNgotCXN1YmksPDwgMTIzLCVyNSwlcjYKLQlzdWJpLDw8PSAxMjMsJXI1LCVyNgotCXN1Ymksc3YgMTIzLCVyNSwlcjYKLQlzdWJpLG9kIDEyMywlcjUsJXI2Ci0Jc3ViaSx0ciAxMjMsJXI1LCVyNgotCXN1YmksPD4gMTIzLCVyNSwlcjYKLQlzdWJpLD49IDEyMywlcjUsJXI2Ci0Jc3ViaSw+IDEyMywlcjUsJXI2Ci0Jc3ViaSw+Pj0gMTIzLCVyNSwlcjYKLQlzdWJpLD4+IDEyMywlcjUsJXI2Ci0Jc3ViaSxuc3YgMTIzLCVyNSwlcjYKLQlzdWJpLGV2IDEyMywlcjUsJXI2Ci0KLQlzdWJpbyAxMjMsJXI1LCVyNgotCXN1YmlvLD0gMTIzLCVyNSwlcjYKLQlzdWJpbyw8IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPD0gMTIzLCVyNSwlcjYKLQlzdWJpbyw8PCAxMjMsJXI1LCVyNgotCXN1YmlvLDw8PSAxMjMsJXI1LCVyNgotCXN1YmlvLHN2IDEyMywlcjUsJXI2Ci0Jc3ViaW8sb2QgMTIzLCVyNSwlcjYKLQlzdWJpbyx0ciAxMjMsJXI1LCVyNgotCXN1YmlvLDw+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj0gMTIzLCVyNSwlcjYKLQlzdWJpbyw+IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj49IDEyMywlcjUsJXI2Ci0Jc3ViaW8sPj4gMTIzLCVyNSwlcjYKLQlzdWJpbyxuc3YgMTIzLCVyNSwlcjYKLQlzdWJpbyxldiAxMjMsJXI1LCVyNgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zeXN0ZW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvc3lzdGVtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMmU3YmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy9zeXN0ZW0ucworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCWJyZWFrIDUsMTIKLQlyZmkKLQlyZmlyCi0Jc3NtIDUsJXI0Ci0JcnNtIDUsJXI0Ci0JbXRzbSAlcjQKLQlsZHNpZCAoJXNyMCwlcjUpLCVyNAotCW10c3AgJXI0LCVzcjAKLQltdGN0bCAlcjQsJWNyMTAKLQltZnNwICVzcjAsJXI0Ci0JbWZjdGwgJWNyMTAsJXI0Ci0Jc3luYwotCXN5bmNkbWEKLQlkaWFnIDEyMzQKLQotCXByb2JlciAoJXNyMCwlcjUpLCVyNiwlcjcKLQlwcm9iZXJpICglc3IwLCVyNSksMSwlcjcKLQlwcm9iZXcgKCVzcjAsJXI1KSwlcjYsJXI3Ci0JcHJvYmV3aSAoJXNyMCwlcjUpLDEsJXI3Ci0JCi0JbHBhICVyNCglc3IwLCVyNSksJXI2Ci0JbHBhLG0gJXI0KCVzcjAsJXI1KSwlcjYKLQlsaGEgJXI0KCVzcjAsJXI1KSwlcjYKLQlsaGEsbSAlcjQoJXNyMCwlcjUpLCVyNgotCWxjaSAlcjQoJXNyMCwlcjUpLCVyNgotCi0JaWR0bGJhICVyNCwoJXNyMCwlcjUpCi0JaWl0bGJhICVyNCwoJXNyNCwlcjUpCi0JaWR0bGJwICVyNCwoJXNyMCwlcjUpCi0JaWl0bGJwICVyNCwoJXNyNCwlcjUpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3VuaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjliMTBlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvYmFzaWMvdW5pdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci07IEJhc2ljIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiB0ZXN0cy4gIAotOwotOyBXZSBjb3VsZC9zaG91bGQgdGVzdCBzb21lIG9mIHRoZSBjb3JuZXIgY2FzZXMgZm9yIHJlZ2lzdGVyIGFuZCAKLTsgaW1tZWRpYXRlIGZpZWxkcy4gIFdlIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBhc3NvcnRlZCBmaWVsZAotOyBzZWxlY3RvcnMgdG8gbWFrZSBzdXJlIHRoZXkncmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLQl1eG9yICVyNCwlcjUsJXI2Ci0JdXhvcixzYnogJXI0LCVyNSwlcjYKLQl1eG9yLHNoeiAlcjQsJXI1LCVyNgotCXV4b3Isc2RjICVyNCwlcjUsJXI2Ci0JdXhvcixzYmMgJXI0LCVyNSwlcjYKLQl1eG9yLHNoYyAlcjQsJXI1LCVyNgotCXV4b3IsdHIgJXI0LCVyNSwlcjYKLQl1eG9yLG5ieiAlcjQsJXI1LCVyNgotCXV4b3Isbmh6ICVyNCwlcjUsJXI2Ci0JdXhvcixuZGMgJXI0LCVyNSwlcjYKLQl1eG9yLG5iYyAlcjQsJXI1LCVyNgotCXV4b3IsbmhjICVyNCwlcjUsJXI2Ci0KLQl1YWRkY20gJXI0LCVyNSwlcjYKLQl1YWRkY20sc2J6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNoeiAlcjQsJXI1LCVyNgotCXVhZGRjbSxzZGMgJXI0LCVyNSwlcjYKLQl1YWRkY20sc2JjICVyNCwlcjUsJXI2Ci0JdWFkZGNtLHNoYyAlcjQsJXI1LCVyNgotCXVhZGRjbSx0ciAlcjQsJXI1LCVyNgotCXVhZGRjbSxuYnogJXI0LCVyNSwlcjYKLQl1YWRkY20sbmh6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtLG5kYyAlcjQsJXI1LCVyNgotCXVhZGRjbSxuYmMgJXI0LCVyNSwlcjYKLQl1YWRkY20sbmhjICVyNCwlcjUsJXI2Ci0KLQl1YWRkY210ICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzYnogJXI0LCVyNSwlcjYKLQl1YWRkY210LHNoeiAlcjQsJXI1LCVyNgotCXVhZGRjbXQsc2RjICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxzYmMgJXI0LCVyNSwlcjYKLQl1YWRkY210LHNoYyAlcjQsJXI1LCVyNgotCXVhZGRjbXQsdHIgJXI0LCVyNSwlcjYKLQl1YWRkY210LG5ieiAlcjQsJXI1LCVyNgotCXVhZGRjbXQsbmh6ICVyNCwlcjUsJXI2Ci0JdWFkZGNtdCxuZGMgJXI0LCVyNSwlcjYKLQl1YWRkY210LG5iYyAlcjQsJXI1LCVyNgotCXVhZGRjbXQsbmhjICVyNCwlcjUsJXI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3dlaXJkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL2Jhc2ljL3dlaXJkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjRlYTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9iYXNpYy93ZWlyZC5zCisrKyAvZGV2L251bGwKQEAgLTEsODcwICswLDAgQEAKLQkuc3RhYnMgIndlaXJkLmMiLDB4NjQsMCwwLExhYmVsMAotTGFiZWwwOgotCS5zdGFicyAiaW50dHlwZTp0MT1idTQ7MDszMjsiLDB4ODAsMCwwLDAKLQotCi0JLnN0YWJzICJzeW0zMjogICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgInR5cGUzMjp0MzI9ICAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0KLQkuc3RhYnMgImF0dHIxMDQ6RzQwND1AaCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTA1Okc0MDU9QGkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJ2YXIwOkczMDA9QGE4OzEiLDB4MjAsMCwwLCAwCi0JLmV4cG9ydCB2YXIwCi0JLmRhdGEKLQkuYWxpZ24gNAotdmFyMDoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJzeW0zMzohICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0zNTojICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0zNjokICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0zNzolICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0zODomICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0zOTonICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00MDooICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00MTopICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00MjoqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00MzorICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00NDosICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW00NTotICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuZXhwb3J0IGF0dHIxMjIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTIyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTIzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyMzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyNAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjQ6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAic3ltNDY6LiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDc6LyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDg6MCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNDk6MSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltNTA6MiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJhdHRyOTY6RzM5Nj1AYCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyOTc6RzM5Nz1AYSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyOTg6RzM5OD1AYiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyOTk6RzM5OT1AYyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgInN5bTUxOjMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTUyOjQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTUzOjUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTU0OjYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTU1OjcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTU2OjggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTU3OjkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTU4OjogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTU5OjsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTYwOjwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTYxOj0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTYyOj4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTYzOj8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTY0OkAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTY1OkEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTY2OkIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTY3OkMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTY4OkQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTY5OkUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTcwOkYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTcxOkcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTcyOkggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTczOkkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTc0OkogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTc1OksgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTc2OkwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTc3Ok0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTc4Ok4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTc5Ok8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTgwOlAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTgxOlEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTgyOlIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTgzOlMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTg0OlQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTg1OlUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTg2OlYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTg3OlcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTg4OlggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTg5OlkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTkwOlogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTkxOlsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5zdGFicyAic3ltOTM6XSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTQ6XiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTU6XyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTY6YCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTc6YSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTg6YiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltOTk6YyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTAwOmQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwMTplICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDI6ZiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTAzOmcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwNDpoICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDU6aSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA2OmogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEwNzprICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMDg6bCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTA5Om0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExMDpuICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTE6byAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTEyOnAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExMzpxICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTQ6ciAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE1OnMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExNjp0ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMTc6dSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTE4OnYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTExOTp3ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjA6eCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTIxOnkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyMjp6ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjM6eyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAic3ltMTI0OnwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInN5bTEyNTp9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJzeW0xMjY6fiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJ0eXBlMzM6dDMzPSEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUzNTp0MzU9IyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTM2OnQzNj0kICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMzc6dDM3PSUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUzODp0Mzg9JiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTM5OnQzOT0nICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDA6dDQwPSggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0MTp0NDE9KSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQyOnQ0Mj0qICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDM6dDQzPSsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0NDp0NDQ9LCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ1OnQ0NT0tICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDY6dDQ2PS4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU0Nzp0NDc9LyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTQ4OnQ0OD0wICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNDk6dDQ5PTEgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1MDp0NTA9MiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTUxOnQ1MT0zICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTI6dDUyPTQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1Mzp0NTM9NSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU0OnQ1ND02ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTU6dDU1PTcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1Njp0NTY9OCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTU3OnQ1Nz05ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNTg6dDU4PTogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU1OTp0NTk9OyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTYwOnQ2MD08ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjE6dDYxPT0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2Mjp0NjI9PiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTYzOnQ2Mz0/ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjQ6dDY0PUAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU2NTp0NjU9QSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTY2OnQ2Nj1CICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNjc6dDY3PUMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQotCS5leHBvcnQgYXR0cjY2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2OAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2ODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjY5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY5OgotCS5sb25nIDQyCi0KLQkuc3RhYnMgInR5cGU2ODp0Njg9RCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTY5OnQ2OT1FICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzA6dDcwPUYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3MTp0NzE9RyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTcyOnQ3Mj1IICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzM6dDczPUkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3NDp0NzQ9SiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc1OnQ3NT1LICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzY6dDc2PUwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU3Nzp0Nzc9TSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTc4OnQ3OD1OICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlNzk6dDc5PU8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4MDp0ODA9UCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTgxOnQ4MT1RICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODI6dDgyPVIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4Mzp0ODM9UyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTg0OnQ4ND1UICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODU6dDg1PVUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU4Njp0ODY9ViAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTg3OnQ4Nz1XICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgImF0dHI2OTpHMzY5PUBFICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3MDpHMzcwPUBGICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3MTpHMzcxPUBHICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAidHlwZTg4OnQ4OD1YICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlODk6dDg5PVkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5MDp0OTA9WiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTkxOnQ5MT1bICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0KLQkuc3RhYnMgInR5cGU5Mzp0OTM9XSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk0OnQ5ND1eICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTU6dDk1PV8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5Njp0OTY9YCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTk3OnQ5Nz1hICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlOTg6dDk4PWIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGU5OTp0OTk9YyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwMDp0MTAwPWQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDE6dDEwMT1lICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTAyOnQxMDI9ZiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwMzp0MTAzPWcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDQ6dDEwND1oICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA1OnQxMDU9aSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwNjp0MTA2PWogISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMDc6dDEwNz1rICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTA4OnQxMDg9bCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEwOTp0MTA5PW0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTA6dDExMD1uICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTExOnQxMTE9byAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExMjp0MTEyPXAgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTM6dDExMz1xICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE0OnQxMTQ9ciAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExNTp0MTE1PXMgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTY6dDExNj10ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTE3OnQxMTc9dSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTExODp0MTE4PXYgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMTk6dDExOT13ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTIwOnQxMjA9eCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyMTp0MTIxPXkgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjI6dDEyMj16ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTIzOnQxMjM9eyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTEyNDp0MTI0PXwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4iLDB4ODAsMCwwLDAKLQkuc3RhYnMgInR5cGUxMjU6dDEyNT19ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+IiwweDgwLDAsMCwwCi0JLnN0YWJzICJ0eXBlMTI2OnQxMjY9fiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCi0JLnN0YWJzICJhdHRyMzI6RzMzMj1AICAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMzM6RzMzMz1AISAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMzU6RzMzND1AIyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgInByaW1hcnk6RzIwMD1lcmVkOjAsZ3JlZW46MSxibHVlOjIsOyIsIDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgImF0dHIzNjpHMzM1PUAkICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5leHBvcnQgcHJpbWFyeQotCS5kYXRhCi0JLmFsaWduIDQKLXByaW1hcnk6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAiYXR0cjM3OkczMzc9QCUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLnN0YWJzICJjb25zdDY5OmM9ZTEsNjkiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJjb25zdDcwOmM9ZTE5MD1iczI7MDsxNjssNzAiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJhdHRyMzg6RzMzOD1AJiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgImJhZF9uZWcwdHlwZTp0MjAxPXM4ZmllbGQwOjEsMCwzMjtmaWVsZDI6LTUzNCwzMiw2NDtmaWVsZDM6LTEsOTYsMzI7OyIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImJhZF9uZWcwOkcyMDEiLCAweDIwLDAsMCwgMAotCi0JLmV4cG9ydCBiYWRfbmVnMAotCS5kYXRhCi0JLmFsaWduIDQKLWJhZF9uZWcwOgotCS5sb25nIDQyCi0JLmxvbmcgNDMsIDQ0LCA0NQotCi0JLnN0YWJzICJhdHRyMzk6RzMzOT1AJyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNDE6RzM0MT1AKSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNDI6RzM0Mj1AKiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNDM6RzM0Mz1AKyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNDQ6RzM0ND1ALCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNDY6RzM0Nj1ALiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNDc6RzM0Nz1ALyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyNTg6RzM1OD1AOiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgImF0dHI1OTpHMzU5PUA7QCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0KLQkuc3RhYnMgImF0dHI2MDpHMzYwPUA8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI2MTpHMzYxPUA9ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI2MjpHMzYyPUA+ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI2MzpHMzYzPUA/ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI2NDpHMzY0PUBAICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI2NTpHMzY1PUBBICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI2NjpHMzY2PUBCICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI2NzpHMzY3PUBDICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI2ODpHMzY4PUBEICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3MjpHMzcyPUBIICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3MzpHMzczPUBJICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3NDpHMzc0PUBKICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3NTpHMzc1PUBLICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3NjpHMzc2PUBMICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3NzpHMzc3PUBNICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3ODpHMzc4PUBOICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI3OTpHMzc5PUBPICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4MDpHMzgwPUBQICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4MTpHMzgxPUBRICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4MjpHMzgyPUBSICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4MzpHMzgzPUBTICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4NDpHMzg0PUBUICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4NTpHMzg1PUBVICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4NjpHMzg2PUBWICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4NzpHMzg3PUBXICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4ODpHMzg4PUBYICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI4OTpHMzg5PUBZICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5MDpHMzkwPUBaICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHI5MTpHMzkxPUBbICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQotCS5zdGFicyAiYXR0cjkzOkczOTM9QF0gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0KLQkuZXhwb3J0IF9jb21tb24wCi0JLmRhdGEKLQkuYWxpZ24gNAotX2NvbW1vbjA6Ci0JLmxvbmcgNDIKLQkubG9uZyAyNAotCS5sb25nIDIyCi0JLmV4cG9ydCBjb21tb24wCi0JLmRhdGEKLQkuYWxpZ24gNAotY29tbW9uMDoKLQkubG9uZyA0MgotCS5sb25nIDI0Ci0JLmxvbmcgMjIKLQkuc3RhYnMgICJjb21tb24wIiwweGUyLDAsMCwwCi0JLnN0YWJzICJjb21tb24wdmFyMDpTMSIsIDB4MjAsMCwwLCAwCi0JLnN0YWJzICJjb21tb24wdmFyMTpTMSIsIDB4MjAsMCwwLCA0Ci0JLnN0YWJzICJjb21tb24wdmFyMjpTMSIsIDB4MjAsMCwwLCA4Ci0JLnN0YWJzICAiY29tbW9uMCIsMHhlNCwwLDAsMAotCi0JLnN0YWJzICJhdHRyOTQ6RzM5ND1AXiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyOTU6RzM5NT1AXyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTAwOkc0MDA9QGQgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwMTpHNDAxPUBlICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDI6RzQwMj1AZiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTAzOkc0MDM9QGcgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwNjpHNDA2PUBqICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMDc6RzQwNz1AayAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTA4Okc0MDg9QGwgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEwOTpHNDA5PUBtICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTA6RzQxMD1AbiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTExOkc0MTE9QG8gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExMjpHNDEyPUBwICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTM6RzQxMz1AcSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE0Okc0MTQ9QHIgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExNTpHNDE1PUBzICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTY6RzQxNj1AdCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTE3Okc0MTc9QHUgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjExODpHNDE4PUB2ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMTk6RzQxOT1AdyAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTIwOkc0MjA9QHggISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyMTpHNDIxPUB5ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjI6RzQyMj1AeiAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTIzOkc0MjM9QHsgISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCS5zdGFicyAiYXR0cjEyNDpHNDI0PUB8ICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKLQkuc3RhYnMgImF0dHIxMjU6RzQyNT1AfSAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+OzEiLDB4MjAsMCwwLCAwCi0JLnN0YWJzICJhdHRyMTI2Okc0MjY9QH4gISMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fjsxIiwweDIwLDAsMCwgMAotCi0JLmV4cG9ydCBhdHRyMzIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzMwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzMzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjM1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjM1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIzNwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIzNzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjM4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjM4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMzkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMzk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0MQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0MToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI0NAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI0NDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjQ2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjQ2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNDcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNDc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI1OAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI1ODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjU5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjU5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2MQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2MToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjYyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjYyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNjMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNjM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI2NAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI2NDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjY1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjY1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3MQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3MToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjcyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjcyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3NAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3NDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI3NwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI3NzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjc4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjc4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyNzkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyNzk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4MAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4MDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjgxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjgxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4MwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4MzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjg0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg0OgotCS5sb25nIDQyCi0KLQkuc3RhYnMgImZsb2F0NzJ0eXBlOnQyMDI9Ujg3Ozk7IiwgMHg4MCwwLDAsIDAKLQotCS5zdGFicyAiaW50MjU2dmFyOkcyMDM9YnUzMjswOzI1NjsiLCAweDIwLDAsMCwgMAotCS5leHBvcnQgaW50MjU2dmFyCi0JLmRhdGEKLQkuYWxpZ24gNAotaW50MjU2dmFyOgotCS5sb25nIDQyCi0JLmxvbmcgMHgyYiwgMHgyYywgMHgyZCwgMHgyZCwgMHgyYywgMHgyYiwgMHgyYQotCi0KLQkuc3RhYnMgImNvbnN0aDpjPWUxLDQyOTQ5NjcyOTYiLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJjb25zdGgyOmM9ZTEsLTczNDcyMzk4NTczMjY0Mjc1ODkyODQ3NTY3ODk4NzIzNDU2MzI4NDkzNzQ1NiIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImJhZF9uZWcwY29uc3Q6Yz1TMjAxLDEyOCwxMjgsMTEyMjIyMTEzNDM0MzQzNDU2NTY1NjU2Nzc4ODg4NzciLCAweDgwLDAsMCwgMAotCi0JLnN0YWJzICJiYWRfdHlwZTA6dCgtMyw3KSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJiYWRfdHlwZTE6dCg0Miw2KSIsIDB4ODAsMCwwLCAwCi0KLQkuc3RhYnMgImFycmF5X2luZGV4MDp0MjA1PXIxOzA7NTsiLCAweDgwLDAsMCwgMAotCS5zdGFicyAiYXJyYXkwOkcyMDY9YTIwNTsxIiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IGFycmF5MAotCS5kYXRhCi0JLmFsaWduIDQKLWFycmF5MDoKLQkubG9uZyA0MgotCS5sb25nIDQzLCA0NCwgNDUsIDQ2LCA0NwotCi0JLnN0YWJzICJhcnJheV9pbmRleDE6dDIwNz0iLCAweDgwLDAsMCwgMAotCS5zdGFicyAiYXJyYXkxOkcyMDg9YWVhaTFfcmVkOjAsYWkxX2dyZWVuOjEsYWkxX2JsdWU6Miw7OzEiLCAweDIwLDAsMCwgMAotCS5leHBvcnQgYXJyYXkxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXJyYXkxOgotCS5sb25nIDQyCi0JLmxvbmcgNDMsIDQ0Ci0KLQkuc3RhYnMgImludHR5cGVfb25lOnQyMDk9MSIsIDB4ODAsMCwwLCAwCi0JLnN0YWJzICJpbnR0eXBlX3R3bzp0MjEwPTEiLCAweDgwLDAsMCwgMAotCS5zdGFicyAib25lX3ZhcjpHMjA5IiwgMHgyMCwwLDAsIDAKLQkuZXhwb3J0IG9uZV92YXIKLQkuZGF0YQotCS5hbGlnbiA0Ci1vbmVfdmFyOgotCS5sb25nIDQyCi0JLnN0YWJzICJ0d29fdmFyOkcyMTAiLCAweDIwLDAsMCwgMAotCS5leHBvcnQgdHdvX3ZhcgotCS5kYXRhCi0JLmFsaWduIDQKLXR3b192YXI6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAiaW50cDp0MjExPSoxIiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgInBvaW50ZXJfdG9faW50X3ZhcjpHMjEyPSoxIiwgMHg4MCwwLDAsIDAKLQkuc3RhYnMgImludHBfdmFyOkcyMTEiLCAweDIwLDAsMCwgMAotCS5leHBvcnQgaW50cF92YXIKLQkuZGF0YQotCS5hbGlnbiA0Ci1pbnRwX3ZhcjoKLQkubG9uZyA0MgotCi0JLnN0YWJzICJ1bnJlY29nX2NvbnN0OmM9eGprc2RmbHNrZDMzLDQ7NDczOyIsIDB4ODAsMCwwLCAwCi0KLQkuZXhwb3J0IGF0dHI4NQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4NToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjg2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyODcKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyODc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI4OAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI4ODoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjg5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjg5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5MQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5MToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjkyCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjkyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTM6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5NAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5NDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTY6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHI5NwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHI5NzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjk4Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjk4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyOTkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyOTk6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDAKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTAwOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTAxCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwMToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwMgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDI6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDMKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTAzOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA0Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwNDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwNQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDU6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDYKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA2OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTA3Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEwNzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEwOAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMDg6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMDkKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTA5OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTEwCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExMDoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExMQotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTE6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTIKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTEyOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTEzCi0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExMzoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExNAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTQ6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTUKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE1OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE2Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExNjoKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjExNwotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMTc6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMTgKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTE4OgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTE5Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjExOToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyMAotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjA6Ci0JLmxvbmcgNDIKLQkuZXhwb3J0IGF0dHIxMjEKLQkuZGF0YQotCS5hbGlnbiA0Ci1hdHRyMTIxOgotCS5sb25nIDQyCi0JLmV4cG9ydCBhdHRyMTI1Ci0JLmRhdGEKLQkuYWxpZ24gNAotYXR0cjEyNToKLQkubG9uZyA0MgotCS5leHBvcnQgYXR0cjEyNgotCS5kYXRhCi0JLmFsaWduIDQKLWF0dHIxMjY6Ci0JLmxvbmcgNDIKLQotCS5zdGFicyAidmFyMTpHMzAxPUBzMzI7MSIsMHgyMCwwLDAsIDAKLQkuZXhwb3J0IHZhcjEKLQkuZGF0YQotCS5hbGlnbiA0Ci12YXIxOgotCS5sb25nIDQyCi0JLnN0YWJzICJ2YXIyOkczMDI9QHA0MjsxIiwweDIwLDAsMCwgMAotCS5leHBvcnQgdmFyMgotCS5kYXRhCi0JLmFsaWduIDQKLXZhcjI6Ci0JLmxvbmcgNDIKLQkuc3RhYnMgInZhcjM6RzMwMz1AUDsxIiwweDIwLDAsMCwgMAotCS5leHBvcnQgdmFyMwotCS5kYXRhCi0JLmFsaWduIDQKLXZhcjM6Ci0JLmxvbmcgNDIKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQkuc3RhYnMgInZfY29tYjpHNDQ4PXMyNCEyLDAyMCw0NDU9czEyITEsMTIwLDQ0ND1zNHg6MSwwLDMyOzs7JHZiNDQ0OjQ0Nj0qNDQ0LDA7YTovMDEsMzIsMzI7OzswMjY0LDQ0Nz1zMTIhMSwxMjAsNDQ0OyR2YjQ0NDo0NDYsMDtiOi8wMSwzMiwzMjs7O2NvbWI6LzAxLDEyOCwzMjs7IiwgMHgyMCwwLDAsIDAKLQotCS5leHBvcnQgdl9jb21iCi0JLmFsaWduIDEKLXZfY29tYjoKLQkubG9uZyB2X2NvbWJfc2hhcmVkIAotCS5sb25nIDQzIAotCS5sb25nIHZfY29tYl9zaGFyZWQgCi0JLmxvbmcgNDQgCi0JLmxvbmcgNDUgCi12X2NvbWJfc2hhcmVkOgotCS5sb25nIDQyIAotCi0JLnN0YWJzICJzeW05MjpcXCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAidHlwZTkyOnQ5Mj1cXCAhIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fiIsMHg4MCwwLDAsMAotCS5zdGFicyAiYXR0cjkyOkczOTI9QFxcICEjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW11eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX47MSIsMHgyMCwwLDAsIDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2FsaWduMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjgxZTk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24xLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDEKLQkuYWxpZ24gOAotCW5vcAotOyAiOCIgYXNzdW1lZCBpZiBubyBhbGlnbm1lbnQgZ2l2ZW4uCi0JLmFsaWduCi0Jbm9wCi0JLmFsaWduIDQwOTYKLQlub3AKLQotCi0gICAgICAgIC5TUEFDRSAgJFBSSVZBVEUkCi0gICAgICAgIC5TVUJTUEEgJEJTUyQKLQotICAgICAgICAuQUxJR04gIDgKLSRMMDBCU1M6Ci1ob21lX2J1ZmY6Ci0gICAgICAgIC5CTE9DSyAgMTAyNAotICAgICAgICAuQUxJR04gIDgKLWN1cnJlbnRfYnVmZjoKLSAgICAgICAgLkJMT0NLICAxMDI0Ci0gICAgICAgIC5BTElHTiAgNAotbG9ja19maWxlOgotICAgICAgICAuQkxPQ0sgIDQKLSAgICAgICAgLkFMSUdOICA4Ci1MMzMyLm5hbWU6Ci0gICAgICAgIC5CTE9DSyAgMzAKLSAgICAgICAgLkFMSUdOICA0Ci1MMzUyLmxhc3RfY2FzZV93YToKLSAgICAgICAgLkJMT0NLICA0Ci0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYWxpZ24yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzM0YzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hbGlnbjIucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gMwotCi0JCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hcHBidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYXBwYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMzdmOWUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9hcHBidWcucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgMSAiY3J0MC5zIgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9iYWRmbXB5YWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxYzFmOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2JhZGZtcHlhZGQucworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvb2JhcixFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUZSLEFSR1cxPUZVLEFSR1cyPUZSLEFSR1czPUZVLFJUTlZBTD1GUgotZm9vYmFyCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCWxkbyAtNjQoJXIzMCksJXIyMAotCWFkZGlsIExSJ3gtJGdsb2JhbCQsJXIyNwotCWZsZGRzIDgoJXIyMCksJWZyNAotCWZsZGRzIDAoJXIyMCksJWZyMjIKLQlsZG8gUlIneC0kZ2xvYmFsJCglcjEpLCVyMTkKLQlmbXB5c3ViLHNnbCAlZnI1TCwlZnI3TCwlZnI1TCwlZnIyMkwsJWZyNEwKLQlidiAlcjAoJXIyKQotCWZzdGRzICVmcjUsMCglcjE5KQotCS5FWElUCi0JLlBST0NFTkQKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkQlNTJAotCi14CS5jb21tIDgKLXkJLmNvbW0gOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2sxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzY5OWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazEucworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJERBVEEkCi0KLWZvbzoKLQkuYmxvY2sKLWJhcjoKLQkuYmxvY2sgMHg3ZmZmZmZmZgotY29tOgotCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvYmxvY2syLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhM2I1ZjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ibG9jazIucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJERBVEEkCi0KLWZvbzoKLQkuYmxvY2sgLTEKLQotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGRhdGFidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4MGNmNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2NhbGxkYXRhYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLklNUE9SVCBwcmludGYsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLUxDJDAwMDA6Ci0JLlNUUklORyAiJWQgJWxmICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGVycm9yX18zQUFBaWlkaQotCS5FWFBPUlQgZXJyb3JfXzNBQUFpaWRpLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9RlIsQVJHVzQ9RlUsUlROVkFMPUdSCi1lcnJvcl9fM0FBQWlpZGk6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWNvcHkgJXIyNiwlcjUKLQlsZG8gLTgoJXIwKSwlcjYKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNiwlcjcKLQlzdHcgJXIyNSwwKCVyNykKLQlsZG8gLTEyKCVyMCksJXI4Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjgsJXI5Ci0Jc3R3ICVyMjQsMCglcjkpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC0yNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkbyAtMjgoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JbGRpbCBMJ0xDJDAwMDAsJXIyNgotCWxkbyBSJ0xDJDAwMDAoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlmbGRkcyAwKCVyMjApLCVmcjcKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1GUixBUkdXMz1GVQotCWJsIHByaW50ZiwlcjIKLQlub3AKLQlibCxuIEwkMDAwMiwlcjAKLQlibCxuIEwkMDAwMSwlcjAKLUwkMDAwMjoKLUwkMDAwMToKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgb2tfXzNBQUFpZGkKLQkuRVhQT1JUIG9rX18zQUFBaWRpLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUsUlROVkFMPUdSCi1va19fM0FBQWlkaToKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JY29weSAlcjI2LCVyNQotCWxkbyAtOCglcjApLCVyNgotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI2LCVyNwotCXN0dyAlcjI1LDAoJXI3KQotCWxkbyAtMTYoJXIwKSwlcjgKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOCwlcjkKLQlmc3RkcyAlZnI3LDAoJXI5KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtMTYoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTIwKCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWxkaWwgTCdMQyQwMDAwLCVyMjYKLQlsZG8gUidMQyQwMDAwKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JZmxkZHMgMCglcjIwKSwlZnI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9RlIsQVJHVzM9RlUKLQlibCBwcmludGYsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwMDQsJXIwCi0JYmwsbiBMJDAwMDMsJXIwCi1MJDAwMDQ6Ci1MJDAwMDM6Ci0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBfX21haW4sQ09ERQotCS5hbGlnbiA4Ci1MQyQwMDAxOgotCTsgLmRvdWJsZSA1LjUwMDAwMDAwMDAwMDAwMDAwMDAwZSswMAotCS53b3JkIDEwNzUxODM2MTYgOyA9IDB4NDAxNjAwMDAKLQkud29yZCAwIDsgPSAweDAKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbgotCS5FWFBPUlQgbWFpbixQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCS5DQUxMIAotCWJsIF9fbWFpbiwlcjIKLQlub3AKLQlsZG8gLTI0KCVyMCksJXIxOQotCWxkbyAtMzIoJXIzMCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDAxLCVyMjAKLQlsZG8gUidMQyQwMDAxKCVyMjApLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQoJXIyMSksJXIyMwotCXN0dyAlcjIyLDAoJXIxOSkKLQlzdHcgJXIyMyw0KCVyMTkpCi0JbGRvIDMoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksLTYwKCVyMzApCi0JbGRvIDgoJXI0KSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JbGRvIDQoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBlcnJvcl9fM0FBQWlpZGksJXIyCi0Jbm9wCi0JbGRvIDMoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksLTUyKCVyMzApCi0JbGRvIDgoJXI0KSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JbGRpbCBMJ0xDJDAwMDEsJXIxOQotCWxkbyBSJ0xDJDAwMDEoJXIxOSksJXIyMAotCWZsZGRzIDAoJXIyMCksJWZyNwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUZSLEFSR1czPUZVCi0JYmwgb2tfXzNBQUFpZGksJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIyOAotCWJsLG4gTCQwMDA1LCVyMAotCWJsLG4gTCQwMDA1LCVyMAotTCQwMDA1OgotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsaW5mb2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9jYWxsaW5mb2J1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDhjNzczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvY2FsbGluZm9idWcucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5zcGFjZSAkVEVYVCQKLQkuc3Vic3BhICRDT0RFJAotCS5hbGlnbiA0Ci0JLmV4cG9ydCBkaXZ1LG1pbGxpY29kZQotCS5wcm9jCi0JLmNhbGxpbmZvIG1pbGxpY29kZQotZGl2dQotCS5wcm9jZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2RlZmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9kZWZidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0Y2FmNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2RlZmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLmltcG9ydAlfc2V0ZXJybm8KLSAJLmV4cG9ydCAgIHZmb3JrICAhCS5sYWJlbCAgIHZmb3JrICAhCS5wcm9jIQkuY2FsbGluZm8gbm9fY2FsbHMhCS5lbnRyeSAhCSAJLmxhYmVsCV9fdmZvcmsgICEJbXRzcAklcjAsJXNyMCEJbGRpbAlMJTB4YzAwMDAwMDQsJXIxIQlibGUJUiUweGMwMDAwMDA0KCVzcjAsJXIxKSEJbGRpCTY2ICAgLCVyMjIgIQliLG4JeXl5IQliLG4JX192Zm9yayAhCWIJX3NldGVycm5vIQljb3B5CSVyMjgsJXIyNiEJLmxhYmVsCXl5eSAKLQlhZGQsPQklcjAsJXIyOSwlcjAJCSAKLQljb3B5CSVyMCwlcjI4CQkgCi0JYnYsbgkoJXIyKQotCS5leGl0Ci0gCS5wcm9jZW5kIAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZW50cnlidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmZTdhNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2VudHJ5YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLlBBUkFNIGZvbyxSVE5WQUw9R1IKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsTk9fQ0FMTFMsRU5UUllfR1I9MSxFTlRSWV9GUj0xMQotCS5FTlRSWQotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHBvcnRidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwb3J0YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NjY0MTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9leHBvcnRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotICAgICAgICAuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2V4cHJidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwcmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2JhZDQyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZXhwcmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotICAgICAgICAuc3BhY2UJJFRFWFQkCi0gICAgICAgIC5zdWJzcGEJJENPREUkCi0KLQkuYWxpZ24JOAotCS5leHBvcnQJaWNvZGUsZGF0YQotaWNvZGU6Ci0JLnByb2MKLQkuY2FsbGluZm8JZnJhbWU9MCxub19jYWxscwotCS5lbnRyeQotCWJ2LG4JJXIwKCVyMikKLQkuZXhpdAotCW5vcAotCS5wcm9jZW5kCi0KLQk7Ci0JOyBGSVJTVCwgYXJndiBhcnJheSBvZiBwb2ludGVycyB0byBhcmdzLCAxc3QgaXMgc2FtZSBhcyBwYXRoLgotCTsKLQkuYWxpZ24JOAotaWNfYXJndjoKLQkud29yZAlpY19hcmd2MS1pY29kZQk7IHNlY29uZCwgcG9pbnRlciB0byAxc3QgYXJndW1lbnQKLQkud29yZAlpY19wYXRoLWljb2RlCQk7IGZpcnN0LCAgcG9pbnRlciB0byBpbml0IHBhdGgKLQkud29yZAkwCQkJOyBmb3VydGgsIE5VTEwgYXJndiB0ZXJtaW5hdG9yIChwYWQpCi0JLndvcmQJMAkJCTsgdGhpcmQsICBOVUxMIGFyZ3YgdGVybWluYXRvcgotCi1pY19wYXRoOgotCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCi0JLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCi0JLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgotCi1pY19hcmd2MToKLQkuYmxvY2t6CTQwOTYJCQk7IG11c3QgYmUgbXVsdGlwbGUgb2YgNCBieXRlcwotCS53b3JkCTAJCQk7IGluIGNhc2UgZnVsbCBzdHJpbmcgaXMgdXNlZAotCS53b3JkCTAJCQk7IHRoaXMgd2lsbCBiZSB0aGUgc3RyaW5nIHRlcm1pbmF0b3IKLQotCS5leHBvcnQJc3ppY29kZSxkYXRhCi1zemljb2RlOgotCS53b3JkCXN6aWNvZGUtaWNvZGUKLQkud29yZAkwCQkJOyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpbGxlciBhdCBlbmQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9maXh1cDdidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZml4dXA3YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzg3NDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9maXh1cDdidWcucworKysgL2Rldi9udWxsCkBAIC0xLDYxOTIgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLklNUE9SVCB4bWFsbG9jLENPREUKLQkuSU1QT1JUIF9vYnN0YWNrX25ld2NodW5rLENPREUKLQkuSU1QT1JUIG1lbXNldCxDT0RFCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgYWxsb2NfdHlwZSxDT0RFCi0JLkVYUE9SVCBhbGxvY190eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1hbGxvY190eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjcsMzIoJXI0KQotCXN0dyAlcjYsMzYoJXI0KQotCXN0dyAlcjUsNDAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAwMiwlcjAKLQlub3AKLQlsZG8gNTIoJXIwKSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCB4bWFsbG9jLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjcKLQlibCxuIEwkMDAwMywlcjAKLUwkMDAwMjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxMjAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyNCkKLQlsZG8gNTIoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMTYoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAxNiglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDA0LCVyMAotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZHcgMTYoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwMDUsJXIwCi1MJDAwMDQ6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDAwNTogCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyAxNiglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMjAoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyAyNCglcjQpLCVyMTkKLQljb21jbHIsPSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMDA2LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgNDAoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0JZGVwaSAtMSwxLDEsJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi1MJDAwMDY6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxMiglcjIwKSwlcjIwCi0JbGR3IDI0KCVyMjEpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDI0KCVyMjEpLCVyMjIKLQl1YWRkY20gJXIwLCVyMjIsJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIyMAotCWNvcHkgJXIyMCwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjE5KSwlcjE5Ci0JbGR3IDQoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMjAoJXI0KSwlcjIxCi0JbGR3IDE2KCVyMjApLCVyMjAKLQlsZHcgNCglcjIxKSwlcjIxCi0Jc3ViICVyMjAsJXIyMSwlcjIwCi0JY29tY2xyLD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDAwNywlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxNiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTIoJXIxOSkKLQljb3B5ICVyMjEsJXIxOQotCWJsLG4gTCQwMDA4LCVyMAotTCQwMDA3OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAwMDg6IAotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw4KCVyMTkpCi0JbGR3IDI0KCVyNCksJXI3Ci1MJDAwMDM6IAotCWNvcHkgJXI3LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCXN0dyAlcjAsMCglcjcpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDEyKCVyNykKLQlsZG8gLTEoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI3KQotCWNvcHkgJXI3LCVyMjgKLQlibCxuIEwkMDAwMSwlcjAKLUwkMDAwMTogCi0JbGR3IDMyKCVyNCksJXI3Ci0JbGR3IDM2KCVyNCksJXI2Ci0JbGR3IDQwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWtlX3BvaW50ZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX3BvaW50ZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbWFrZV9wb2ludGVyX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyOSwxNiglcjQpCi0Jc3R3ICVyOCwyMCglcjQpCi0Jc3R3ICVyNywyNCglcjQpCi0Jc3R3ICVyNiwyOCglcjQpCi0Jc3R3ICVyNSwzMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAyMCglcjE5KSwlcjkKLQljb21pY2xyLDw+IDAsJXI5LCVyMAotCWJsIEwkMDAxMCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMTEsJXIwCi0Jbm9wCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDA5LCVyMAotCWJsLG4gTCQwMDEyLCVyMAotTCQwMDExOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDEzLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMDksJXIwCi1MJDAwMTM6IAotTCQwMDEyOiAKLUwkMDAxMDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAxNSwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDE0LCVyMAotCW5vcAotCWJsLG4gTCQwMDE1LCVyMAotTCQwMDE1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMTYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotTCQwMDE2OiAKLQlibCxuIEwkMDAxNywlcjAKLUwkMDAxNDogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyOQotCWxkdyAxMiglcjkpLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLQljb3B5ICVyOSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjkpCi1MJDAwMTc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxNiglcjkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMjAoJXIxOSkKLQlsZG8gNCglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyOSkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSwwKCVyOSkKLQlsZGggMzIoJXI5KSwlcjE5Ci0JY29weSAlcjE5LCVyMjAKLQlkZXBpIC0xLDMxLDEsJXIyMAotCXN0aCAlcjIwLDMyKCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDIwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAxOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyMCglcjE5KQotTCQwMDE4OiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMDksJXIwCi1MJDAwMDk6IAotCWxkdyAxNiglcjQpLCVyOQotCWxkdyAyMCglcjQpLCVyOAotCWxkdyAyNCglcjQpLCVyNwotCWxkdyAyOCglcjQpLCVyNgotCWxkdyAzMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3BvaW50ZXJfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfcG9pbnRlcl90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcG9pbnRlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIG1ha2VfcG9pbnRlcl90eXBlLCVyMgotCW5vcAotCWJsLG4gTCQwMDE5LCVyMAotTCQwMDE5OiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFrZV9yZWZlcmVuY2VfdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX3JlZmVyZW5jZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1tYWtlX3JlZmVyZW5jZV90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjksMTYoJXI0KQotCXN0dyAlcjgsMjAoJXI0KQotCXN0dyAlcjcsMjQoJXI0KQotCXN0dyAlcjYsMjgoJXI0KQotCXN0dyAlcjUsMzIoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjQoJXIxOSksJXI5Ci0JY29taWNsciw8PiAwLCVyOSwlcjAKLQlibCBMJDAwMjEsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDIyLCVyMAotCW5vcAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLQlibCxuIEwkMDAyMywlcjAKLUwkMDAyMjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyNCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi0JY29weSAlcjksJXIyOAotCWJsLG4gTCQwMDIwLCVyMAotTCQwMDI0OiAKLUwkMDAyMzogCi1MJDAwMjE6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwMjYsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAyNSwlcjAKLQlub3AKLQlibCxuIEwkMDAyNiwlcjAKLUwkMDAyNjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDI3LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDAoJXIxOSkKLUwkMDAyNzogCi0JYmwsbiBMJDAwMjgsJXIwCi1MJDAwMjU6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjkKLQlsZHcgMTIoJXI5KSwlcjE5Ci0Jc3R3ICVyMTksOCglcjQpCi0JY29weSAlcjksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI5KQotTCQwMDI4OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI0KCVyMTkpCi0JbGRvIDQoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksOCglcjkpCi0JbGRvIDE2KCVyMCksJXIxOQotCXN0dyAlcjE5LDAoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjQoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDI5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI0KCVyMTkpCi1MJDAwMjk6IAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAyMCwlcjAKLUwkMDAyMDogCi0JbGR3IDE2KCVyNCksJXI5Ci0JbGR3IDIwKCVyNCksJXI4Ci0JbGR3IDI0KCVyNCksJXI3Ci0JbGR3IDI4KCVyNCksJXI2Ci0JbGR3IDMyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfcmVmZXJlbmNlX3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3JlZmVyZW5jZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfcmVmZXJlbmNlX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiw4KCVyNCkKLQlzdHcgJXI1LDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgbWFrZV9yZWZlcmVuY2VfdHlwZSwlcjIKLQlub3AKLQlibCxuIEwkMDAzMCwlcjAKLUwkMDAzMDogCi0JbGR3IDgoJXI0KSwlcjYKLQlsZHcgMTIoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIG1ha2VfZnVuY3Rpb25fdHlwZSxDT0RFCi0JLkVYUE9SVCBtYWtlX2Z1bmN0aW9uX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLW1ha2VfZnVuY3Rpb25fdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI5LDE2KCVyNCkKLQlzdHcgJXI4LDIwKCVyNCkKLQlzdHcgJXI3LDI0KCVyNCkKLQlzdHcgJXI2LDI4KCVyNCkKLQlzdHcgJXI1LDMyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDI4KCVyMTkpLCVyOQotCWNvbWljbHIsPD4gMCwlcjksJXIwCi0JYmwgTCQwMDMyLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDAzMywlcjAKLQlub3AKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAwMzEsJXIwCi0JYmwsbiBMJDAwMzQsJXIwCi1MJDAwMzM6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzUsJXIwCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCXN0dyAlcjksMCglcjE5KQotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAzMSwlcjAKLUwkMDAzNTogCi1MJDAwMzQ6IAotTCQwMDMyOiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMDM3LCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw9IDAsJXIyMCwlcjAKLQlibCBMJDAwMzYsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwMzcsJXIwCi1MJDAwMzc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgYWxsb2NfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDAzOCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwwKCVyMTkpCi1MJDAwMzg6IAotCWJsLG4gTCQwMDM5LCVyMAotTCQwMDM2OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXI5Ci0JbGR3IDEyKCVyOSksJXIxOQotCXN0dyAlcjE5LDgoJXI0KQotCWNvcHkgJXI5LCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDEyKCVyOSkKLUwkMDAzOTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDE2KCVyOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0Jc3R3ICVyOSwyOCglcjE5KQotCWxkbyAxKCVyMCksJXIxOQotCXN0dyAlcjE5LDgoJXI5KQotCWxkbyA2KCVyMCksJXIxOQotCXN0dyAlcjE5LDAoJXI5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMjgoJXIxOSksJXIyMAotCWNvbWljbHIsPSAwLCVyMjAsJXIwCi0JYmwgTCQwMDQwLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlzdHcgJXI5LDI4KCVyMTkpCi1MJDAwNDA6IAotCWNvcHkgJXI5LCVyMjgKLQlibCxuIEwkMDAzMSwlcjAKLUwkMDAzMTogCi0JbGR3IDE2KCVyNCksJXI5Ci0JbGR3IDIwKCVyNCksJXI4Ci0JbGR3IDI0KCVyNCksJXI3Ci0JbGR3IDI4KCVyNCksJXI2Ci0JbGR3IDMyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfZnVuY3Rpb25fdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfZnVuY3Rpb25fdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX2Z1bmN0aW9uX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiw4KCVyNCkKLQlzdHcgJXI1LDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgbWFrZV9mdW5jdGlvbl90eXBlLCVyMgotCW5vcAotCWJsLG4gTCQwMDQxLCVyMAotTCQwMDQxOiAKLQlsZHcgOCglcjQpLCVyNgotCWxkdyAxMiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHNtYXNoX3RvX21lbWJlcl90eXBlLENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX21lbWJlcl90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF9tZW1iZXJfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX21lbWJlcl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsOCglcjQpCi0Jc3R3ICVyNywxMiglcjQpCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIDI0KCVyNCksJXIxCi0JZnN0ZHMsbWEgJWZyMTIsOCglcjEpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LC0xNiglcjMwKQotCWZsZHdzIC0xNiglcjMwKSwlZnIxMgotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWZzdHdzICVmcjEyLC0xNiglcjMwKQotCWxkdyAtMTYoJXIzMCksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQlsZHcgMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBzbWFzaF90b19tZW1iZXJfdHlwZSwlcjIKLQlub3AKLQlmc3R3cyAlZnIxMiwtMTYoJXIzMCkKLQlsZHcgLTE2KCVyMzApLCVyMjgKLQlibCxuIEwkMDA0MiwlcjAKLUwkMDA0MjogCi0JbGR3IDgoJXI0KSwlcjgKLQlsZHcgMTIoJXI0KSwlcjcKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gMjQoJXI0KSwlcjEKLQlmbGRkcyxtYSA4KCVyMSksJWZyMTIKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIGFsbG9jYXRlX3N0dWJfbWV0aG9kLENPREUKLQkuRVhQT1JUIGFsbG9jYXRlX3N0dWJfbWV0aG9kLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1hbGxvY2F0ZV9zdHViX21ldGhvZDogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDQoJXIwKSwlcjIwCi0Jc3RoICVyMjAsMzIoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMTUoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMCksJXIyMAotCXN0dyAlcjIwLDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA0MywlcjAKLUwkMDA0MzogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgYnVpbHRpbl90eXBlX2ludCxEQVRBCi0JLmFsaWduIDQKLQkuRVhQT1JUIGNyZWF0ZV9hcnJheV90eXBlLENPREUKLQkuRVhQT1JUIGNyZWF0ZV9hcnJheV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1jcmVhdGVfYXJyYXlfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMCw1NiglcjQpCi0Jc3R3ICVyOSw2MCglcjQpCi0Jc3R3ICVyOCw2NCglcjQpCi0Jc3R3ICVyNyw2OCglcjQpCi0Jc3R3ICVyNiw3MiglcjQpCi0Jc3R3ICVyNSw3NiglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAyKCVyMCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTYoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDAoJXIyMCksJXIyMAotCWxkdyA4KCVyMjEpLCVyMjEKLQlzdHcgJXIyMCwtMTYoJXIzMCkKLQlmbGR3cyAtMTYoJXIzMCksJWZyNQotCXN0dyAlcjIxLC0xNiglcjMwKQotCWZsZHdzIC0xNiglcjMwKSwlZnI1UgotCXhtcHl1ICVmcjUsJWZyNVIsJWZyNAotCWZzdHdzICVmcjRSLC0xNiglcjMwKQotCWxkdyAtMTYoJXIzMCksJXIyNAotCXN0dyAlcjI0LDgoJXIxOSkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdGggJXIyMCwzNCglcjE5KQotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAwNTAsJXIwCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZG8gMTIwKCVyMjApLCVyMTkKLQlzdHcgJXIxOSwxNiglcjQpCi0JbGR3IDE2KCVyNCksJXIxOQotCXN0dyAlcjE5LDIwKCVyNCkKLQlsZG8gMTYoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksMjQoJXI0KQotCWxkdyAyMCglcjQpLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyNCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDQ1LCVyMAotCW5vcAotCWxkdyAyMCglcjQpLCVyMjYKLQlsZHcgMjQoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwNDYsJXIwCi1MJDAwNDU6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA0NjogCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyAyNCglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDE2KCVyNCksJXIxOQotCXN0dyAlcjE5LDI4KCVyNCkKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDMyKCVyNCkKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMzIoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDA0NywlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDQ3OiAKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAyOCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDI4KCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjgoJXI0KSwlcjIwCi0JbGR3IDI4KCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwNDgsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkdyAyOCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDA0OSwlcjAKLUwkMDA0ODogCi0JY29weSAlcjAsJXIxOQotTCQwMDQ5OiAKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGR3IDI4KCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyAzMiglcjQpLCVyMTAKLQlibCxuIEwkMDA1MSwlcjAKLUwkMDA1MDogCi0JbGRvIDE2KCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMAotTCQwMDUxOiAKLQlzdHcgJXIxMCwzNiglcjkpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGFsbG9jX3R5cGUsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsMTYoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDQoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMiglcjApLCVyMjAKLQlzdGggJXIyMCwzNCglcjE5KQotCWxkdyAxMiglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA1NywlcjAKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZG8gMTIwKCVyMjApLCVyMTkKLQlzdHcgJXIxOSwzNiglcjQpCi0JbGR3IDM2KCVyNCksJXIxOQotCXN0dyAlcjE5LDQwKCVyNCkKLQlsZG8gMzIoJXIwKSwlcjE5Ci0Jc3R3ICVyMTksNDQoJXI0KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZHcgNDAoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyA0NCglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMDUyLCVyMAotCW5vcAotCWxkdyA0MCglcjQpLCVyMjYKLQlsZHcgNDQoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAwNTMsJXIwCi1MJDAwNTI6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDA1MzogCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkdyA0MCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyA0NCglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDM2KCVyNCksJXIxOQotCXN0dyAlcjE5LDQ4KCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDUyKCVyNCkKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgNTIoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDA1NCwlcjAKLQlub3AKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMDU0OiAKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyA0OCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDQ4KCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDQ4KCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAwNTUsJXIwCi0Jbm9wCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDA1NiwlcjAKLUwkMDA1NTogCi0JY29weSAlcjAsJXIxOQotTCQwMDU2OiAKLQlsZHcgNDgoJXI0KSwlcjE5Ci0JbGR3IDQ4KCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyA1MiglcjQpLCVyMTAKLQlibCxuIEwkMDA1OCwlcjAKLUwkMDA1NzogCi0JbGRvIDMyKCVyMCksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgeG1hbGxvYywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMAotTCQwMDU4OiAKLQlzdHcgJXIxMCwzNiglcjkpCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkdyAzNiglcjE5KSwlcjIwCi0Jc3R3ICVyMCwwKCVyMjApCi0JbGR3IDEyKCVyNCksJXIxOQotCWxkbyAxNiglcjApLCVyMjAKLQlsZHcgMzYoJXIxOSksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZG8gLTEoJXIyMCksJXIyMQotCXN0dyAlcjIxLDAoJXIxOSkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDM2KCVyMjApLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyAxMiglcjQpLCVyMTkKLQlsZG8gMTYoJXIwKSwlcjIwCi0JbGR3IDM2KCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlhZGRpbCBMJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV9pbnQtJGdsb2JhbCQoJXIxKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCWxkdyAzNiglcjE5KSwlcjIwCi0JbGR3IDEyKCVyNCksJXIxOQotCXN0dyAlcjE5LDgoJXIyMCkKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsNDQoJXIxOSkKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA0NCwlcjAKLUwkMDA0NDogCi0JbGR3IDU2KCVyNCksJXIxMAotCWxkdyA2MCglcjQpLCVyOQotCWxkdyA2NCglcjQpLCVyOAotCWxkdyA2OCglcjQpLCVyNwotCWxkdyA3MiglcjQpLCVyNgotCWxkdyA3NiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgc21hc2hfdG9fbWVtYmVyX3R5cGUsQ09ERQotCS5FWFBPUlQgc21hc2hfdG9fbWVtYmVyX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotc21hc2hfdG9fbWVtYmVyX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTAsMTYoJXI0KQotCXN0dyAlcjksMjAoJXI0KQotCXN0dyAlcjgsMjQoJXI0KQotCXN0dyAlcjcsMjgoJXI0KQotCXN0dyAlcjYsMzIoJXI0KQotCXN0dyAlcjUsMzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMCwlcjI1Ci0JbGRvIDUyKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbWVtc2V0LCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTEyKCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMSglcjApLCVyMjAKLQlzdHcgJXIyMCw4KCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAxNCglcjApLCVyMjAKLQlzdHcgJXIyMCwwKCVyMTkpCi1MJDAwNTk6IAotCWxkdyAxNiglcjQpLCVyMTAKLQlsZHcgMjAoJXI0KSwlcjkKLQlsZHcgMjQoJXI0KSwlcjgKLQlsZHcgMjgoJXI0KSwlcjcKLQlsZHcgMzIoJXI0KSwlcjYKLQlsZHcgMzYoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLQkuRVhQT1JUIHNtYXNoX3RvX21ldGhvZF90eXBlLENPREUKLQkuRVhQT1JUIHNtYXNoX3RvX21ldGhvZF90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLXNtYXNoX3RvX21ldGhvZF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjEyLDE2KCVyNCkKLQlzdHcgJXIxMSwyMCglcjQpCi0Jc3R3ICVyMTAsMjQoJXI0KQotCXN0dyAlcjksMjgoJXI0KQotCXN0dyAlcjgsMzIoJXI0KQotCXN0dyAlcjcsMzYoJXI0KQotCXN0dyAlcjYsNDAoJXI0KQotCXN0dyAlcjUsNDQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtMTYoJXIwKSwlcjExCi0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjExLCVyMTIKLQlzdHcgJXIyMywwKCVyMTIpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQlsZG8gNTIoJXIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXN0dyAlcjIwLDEyKCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtMTIoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsMTYoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCXN0dyAlcjIxLDQwKCVyMTkpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtMTYoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsNDgoJXIxOSkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDEoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsOCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gMTUoJXIwKSwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotTCQwMDYwOiAKLQlsZHcgMTYoJXI0KSwlcjEyCi0JbGR3IDIwKCVyNCksJXIxMQotCWxkdyAyNCglcjQpLCVyMTAKLQlsZHcgMjgoJXI0KSwlcjkKLQlsZHcgMzIoJXI0KSwlcjgKLQlsZHcgMzYoJXI0KSwlcjcKLQlsZHcgNDAoJXI0KSwlcjYKLQlsZHcgNDQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzdHJuY21wLENPREUKLQkuYWxpZ24gNAotTEMkMDAwMDogCi0JLlNUUklORyAic3RydWN0IFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDE6IAotCS5TVFJJTkcgInVuaW9uIFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDI6IAotCS5TVFJJTkcgImVudW0gXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgdHlwZV9uYW1lX25vX3RhZyxDT0RFCi0JLkVYUE9SVCB0eXBlX25hbWVfbm9fdGFnLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi10eXBlX25hbWVfbm9fdGFnOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsOCglcjQpCi0Jc3R3ICVyNSwxMiglcjQpCi0JY29weSAlcjI2LCVyNQotCWxkdyA0KCVyNSksJXI2Ci0JY29taWNsciw8PiAwLCVyNiwlcjAKLQlibCBMJDAwNjIsJXIwCi0Jbm9wCi0JbGR3IDAoJXI1KSwlcjE5Ci0JY29taWNsciw8PiA0LCVyMTksJXIwCi0JYmwgTCQwMDY2LCVyMAotCW5vcAotCWNvbWljbHIsPj0gNCwlcjE5LCVyMAotCWJsIEwkMDA3MiwlcjAKLQlub3AKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAwNjQsJXIwCi0Jbm9wCi0JYmwsbiBMJDAwNzAsJXIwCi1MJDAwNzI6IAotCWNvbWljbHIsPD4gNSwlcjE5LCVyMAotCWJsIEwkMDA2OCwlcjAKLQlub3AKLQlibCxuIEwkMDA3MCwlcjAKLUwkMDA2NDogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAwLCVyMjUKLQlsZG8gUidMQyQwMDAwKCVyMjUpLCVyMjUKLQlsZG8gNyglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2NSwlcjAKLQlub3AKLQlsZG8gNyglcjYpLCVyNgotTCQwMDY1OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA2NjogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAxLCVyMjUKLQlsZG8gUidMQyQwMDAxKCVyMjUpLCVyMjUKLQlsZG8gNiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2NywlcjAKLQlub3AKLQlsZG8gNiglcjYpLCVyNgotTCQwMDY3OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA2ODogCi0JY29weSAlcjYsJXIyNgotCWxkaWwgTCdMQyQwMDAyLCVyMjUKLQlsZG8gUidMQyQwMDAyKCVyMjUpLCVyMjUKLQlsZG8gNSglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0cm5jbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA2OSwlcjAKLQlub3AKLQlsZG8gNSglcjYpLCVyNgotTCQwMDY5OiAKLQlibCxuIEwkMDA2MywlcjAKLUwkMDA3MDogCi0JYmwsbiBMJDAwNjMsJXIwCi1MJDAwNjM6IAotTCQwMDYyOiAKLQljb3B5ICVyNiwlcjI4Ci0JYmwsbiBMJDAwNjEsJXIwCi1MJDAwNjE6IAotCWxkdyA4KCVyNCksJXI2Ci0JbGR3IDEyKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgY3VycmVudF9sYW5ndWFnZSxEQVRBCi0JLklNUE9SVCBzdHJjbXAsQ09ERQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfcHJpbWl0aXZlX3R5cGVuYW1lLENPREUKLQkuRVhQT1JUIGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixSVE5WQUw9R1IKLWxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyNiwxNiglcjQpCi0Jc3R3ICVyNSwyMCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JYWRkaWwgTCdjdXJyZW50X2xhbmd1YWdlLSRnbG9iYWwkLCVyMjcKLQlsZHcgUidjdXJyZW50X2xhbmd1YWdlLSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDA3NDogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA3NSwlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyA0KCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQljb21pY2xyLD0gMCwlcjE5LCVyMAotCWJsIEwkMDA3NywlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDAoJXIyMCksJXIyOAotCWJsLG4gTCQwMDczLCVyMAotTCQwMDc3OiAKLUwkMDA3NjogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDQoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMDc0LCVyMAotTCQwMDc1OiAKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAwNzMsJXIwCi1MJDAwNzM6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGxvb2t1cF9zeW1ib2wsQ09ERQotCS5JTVBPUlQgZXJyb3IsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDAzOiAKLQkuU1RSSU5HICJObyB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfdHlwZW5hbWUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixSVE5WQUw9R1IKLWxvb2t1cF90eXBlbmFtZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMiw4KCVyNCkKLQlzdHcgJXIxMSwxMiglcjQpCi0Jc3R3ICVyMTAsMTYoJXI0KQotCXN0dyAlcjksMjAoJXI0KQotCXN0dyAlcjgsMjQoJXI0KQotCXN0dyAlcjcsMjgoJXI0KQotCXN0dyAlcjYsMzIoJXI0KQotCXN0dyAlcjUsMzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjExCi0JY29taWNsciw8PiAwLCVyMTEsJXIwCi0JYmwgTCQwMDgwLCVyMAotCW5vcAotCWxkdyA4KCVyMTEpLCVyMTkKLQljb21pY2xyLD0gOCwlcjE5LCVyMAotCWJsIEwkMDA4MCwlcjAKLQlub3AKLQlibCxuIEwkMDA3OSwlcjAKLUwkMDA4MDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMgotCWNvbWljbHIsPD4gMCwlcjEyLCVyMAotCWJsIEwkMDA4MSwlcjAKLQlub3AKLQljb3B5ICVyMTIsJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotCWJsLG4gTCQwMDgyLCVyMAotTCQwMDgxOiAKLQljb21pY2xyLD0gMCwlcjEyLCVyMAotCWJsIEwkMDA4MywlcjAKLQlub3AKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDA4MywlcjAKLQlub3AKLQljb3B5ICVyMCwlcjI4Ci0JYmwsbiBMJDAwNzgsJXIwCi0JYmwsbiBMJDAwODQsJXIwCi1MJDAwODM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDAzLCVyMjYKLQlsZG8gUidMQyQwMDAzKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA4NDogCi1MJDAwODI6IAotTCQwMDc5OiAKLQlsZHcgMTIoJXIxMSksJXIyOAotCWJsLG4gTCQwMDc4LCVyMAotTCQwMDc4OiAKLQlsZHcgOCglcjQpLCVyMTIKLQlsZHcgMTIoJXI0KSwlcjExCi0JbGR3IDE2KCVyNCksJXIxMAotCWxkdyAyMCglcjQpLCVyOQotCWxkdyAyNCglcjQpLCVyOAotCWxkdyAyOCglcjQpLCVyNwotCWxkdyAzMiglcjQpLCVyNgotCWxkdyAzNiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGFsbG9jYSxDT0RFCi0JLklNUE9SVCBzdHJsZW4sQ09ERQotCS5JTVBPUlQgc3RyY3B5LENPREUKLQkuYWxpZ24gNAotTEMkMDAwNDogCi0JLlNUUklORyAidW5zaWduZWQgXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lLENPREUKLQkuRVhQT1JUIGxvb2t1cF91bnNpZ25lZF90eXBlbmFtZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLFJUTlZBTD1HUgotbG9va3VwX3Vuc2lnbmVkX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkbyAxMCglcjE5KSwlcjIwCi0JbGRvIDcoJXIyMCksJXIyMQotCWNvcHkgJXIyMSwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWxkdyA4KCVyNCksJXIyNgotCWxkaWwgTCdMQyQwMDA0LCVyMjUKLQlsZG8gUidMQyQwMDA0KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgOCglcjQpLCVyMjAKLQlsZG8gOSglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDgoJXI0KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWNvcHkgJXIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGxvb2t1cF90eXBlbmFtZSwlcjIKLQlub3AKLQlibCxuIEwkMDA4NSwlcjAKLUwkMDA4NTogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDA1OiAKLQkuU1RSSU5HICJzaWduZWQgXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX3NpZ25lZF90eXBlbmFtZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfc2lnbmVkX3R5cGVuYW1lLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1sb29rdXBfc2lnbmVkX3R5cGVuYW1lOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkbyA4KCVyMTkpLCVyMjAKLQlsZG8gNyglcjIwKSwlcjIxCi0JY29weSAlcjIxLCVyMTkKLQlsZG8gNjMoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMjUsMjYsJXIxOQotCXpkZXAgJXIxOSwyNSwyNiwlcjIwCi0JbGRvIC05NiglcjMwKSwlcjE5Ci0JYWRkICVyMzAsJXIyMCwlcjMwCi0JbGRvIDcoJXIxOSksJXIyMAotCWV4dHJ1ICVyMjAsMjgsMjksJXIxOQotCXpkZXAgJXIxOSwyOCwyOSwlcjIwCi0Jc3R3ICVyMjAsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAwNSwlcjI1Ci0JbGRvIFInTEMkMDAwNSglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjcHksJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyMAotCWxkbyA3KCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQljb3B5ICVyMTksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNweSwlcjIKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgbG9va3VwX3R5cGVuYW1lLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDA4NywlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMjgKLQlibCxuIEwkMDA4NiwlcjAKLUwkMDA4NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWNvcHkgJXIwLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfdHlwZW5hbWUsJXIyCi0Jbm9wCi0JYmwsbiBMJDAwODYsJXIwCi1MJDAwODY6IAotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAwNjogCi0JLlNUUklORyAiTm8gc3RydWN0IHR5cGUgbmFtZWQgJXMuXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAwNzogCi0JLlNUUklORyAiVGhpcyBjb250ZXh0IGhhcyBjbGFzcywgdW5pb24gb3IgZW51bSAlcywgbm90IGEgc3RydWN0Llx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3QsQ09ERQotCS5FWFBPUlQgbG9va3VwX3N0cnVjdCxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX3N0cnVjdDogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI5LDgoJXI0KQotCXN0dyAlcjgsMTIoJXI0KQotCXN0dyAlcjcsMTYoJXI0KQotCXN0dyAlcjYsMjAoJXI0KQotCXN0dyAlcjUsMjQoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQljb3B5ICVyMCwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBsb29rdXBfc3ltYm9sLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQljb21pY2xyLD0gMCwlcjksJXIwCi0JYmwgTCQwMDg5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA2LCVyMjYKLQlsZG8gUidMQyQwMDA2KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA4OTogCi0JbGR3IDEyKCVyOSksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDMsJXIyMCwlcjAKLQlibCBMJDAwOTAsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDcsJXIyNgotCWxkbyBSJ0xDJDAwMDcoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDkwOiAKLQlsZHcgMTIoJXI5KSwlcjI4Ci0JYmwsbiBMJDAwODgsJXIwCi1MJDAwODg6IAotCWxkdyA4KCVyNCksJXI5Ci0JbGR3IDEyKCVyNCksJXI4Ci0JbGR3IDE2KCVyNCksJXI3Ci0JbGR3IDIwKCVyNCksJXI2Ci0JbGR3IDI0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci1MQyQwMDA4OiAKLQkuU1RSSU5HICJObyB1bmlvbiB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMDk6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHN0cnVjdCBvciBlbnVtICVzLCBub3QgYSB1bmlvbi5ceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfdW5pb24sQ09ERQotCS5FWFBPUlQgbG9va3VwX3VuaW9uLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsUlROVkFMPUdSCi1sb29rdXBfdW5pb246IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOSw4KCVyNCkKLQlzdHcgJXI4LDEyKCVyNCkKLQlzdHcgJXI3LDE2KCVyNCkKLQlzdHcgJXI2LDIwKCVyNCkKLQlzdHcgJXI1LDI0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlzdHcgJXIwLC01MiglcjMwKQotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JY29weSAlcjAsJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgbG9va3VwX3N5bWJvbCwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JY29taWNsciw9IDAsJXI5LCVyMAotCWJsIEwkMDA5MiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAwOCwlcjI2Ci0JbGRvIFInTEMkMDAwOCglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTI6IAotCWxkdyAxMiglcjkpLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMDkzLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDA5LCVyMjYKLQlsZG8gUidMQyQwMDA5KCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDA5MzogCi0JbGR3IDEyKCVyOSksJXIyOAotCWJsLG4gTCQwMDkxLCVyMAotTCQwMDkxOiAKLQlsZHcgOCglcjQpLCVyOQotCWxkdyAxMiglcjQpLCVyOAotCWxkdyAxNiglcjQpLCVyNwotCWxkdyAyMCglcjQpLCVyNgotCWxkdyAyNCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDAxMDogCi0JLlNUUklORyAiTm8gZW51bSB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTE6IAotCS5TVFJJTkcgIlRoaXMgY29udGV4dCBoYXMgY2xhc3MsIHN0cnVjdCBvciB1bmlvbiAlcywgbm90IGFuIGVudW0uXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbG9va3VwX2VudW0sQ09ERQotCS5FWFBPUlQgbG9va3VwX2VudW0sRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixSVE5WQUw9R1IKLWxvb2t1cF9lbnVtOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjksOCglcjQpCi0Jc3R3ICVyOCwxMiglcjQpCi0Jc3R3ICVyNywxNiglcjQpCi0Jc3R3ICVyNiwyMCglcjQpCi0Jc3R3ICVyNSwyNCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWNvbWljbHIsPSAwLCVyOSwlcjAKLQlibCBMJDAwOTUsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTAsJXIyNgotCWxkbyBSJ0xDJDAwMTAoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk1OiAKLQlsZHcgMTIoJXI5KSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gNSwlcjIwLCVyMAotCWJsIEwkMDA5NiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAxMSwlcjI2Ci0JbGRvIFInTEMkMDAxMSglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi1MJDAwOTY6IAotCWxkdyAxMiglcjkpLCVyMjgKLQlibCxuIEwkMDA5NCwlcjAKLUwkMDA5NDogCi0JbGR3IDgoJXI0KSwlcjkKLQlsZHcgMTIoJXI0KSwlcjgKLQlsZHcgMTYoJXI0KSwlcjcKLQlsZHcgMjAoJXI0KSwlcjYKLQlsZHcgMjQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBzdHJjYXQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDEyOiAKLQkuU1RSSU5HICI8XHgwMCIKLQkuYWxpZ24gNAotTEMkMDAxMzogCi0JLlNUUklORyAiID5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDE0OiAKLQkuU1RSSU5HICJObyB0ZW1wbGF0ZSB0eXBlIG5hbWVkICVzLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF90ZW1wbGF0ZV90eXBlLENPREUKLQkuRVhQT1JUIGxvb2t1cF90ZW1wbGF0ZV90eXBlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCi1sb29rdXBfdGVtcGxhdGVfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMSwxNiglcjQpCi0Jc3R3ICVyMTAsMjAoJXI0KQotCXN0dyAlcjksMjQoJXI0KQotCXN0dyAlcjgsMjgoJXI0KQotCXN0dyAlcjcsMzIoJXI0KQotCXN0dyAlcjYsMzYoJXI0KQotCXN0dyAlcjUsNDAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHN0cmxlbiwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxMQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlhZGQgJXIxMSwlcjE5LCVyMjAKLQlsZG8gNCglcjIwKSwlcjE5Ci0JbGRvIDcoJXIxOSksJXIyMAotCWNvcHkgJXIyMCwlcjE5Ci0JbGRvIDYzKCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI1LDI2LCVyMTkKLQl6ZGVwICVyMTksMjUsMjYsJXIyMAotCWxkbyAtOTYoJXIzMCksJXIxOQotCWFkZCAlcjMwLCVyMjAsJXIzMAotCWxkbyA3KCVyMTkpLCVyMjAKLQlleHRydSAlcjIwLDI4LDI5LCVyMTkKLQl6ZGVwICVyMTksMjgsMjksJXIyMAotCXN0dyAlcjIwLDEyKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY3B5LCVyMgotCW5vcAotCWxkdyAxMiglcjQpLCVyMjYKLQlsZGlsIEwnTEMkMDAxMiwlcjI1Ci0JbGRvIFInTEMkMDAxMiglcjI1KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxMiglcjQpLCVyMjYKLQlsZHcgNCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjYXQsJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyNgotCWxkaWwgTCdMQyQwMDEzLCVyMjUKLQlsZG8gUidMQyQwMDEzKCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNhdCwlcjIKLQlub3AKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0Jc3R3ICVyMCwtNTIoJXIzMCkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAwOTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMTQsJXIyNgotCWxkbyBSJ0xDJDAwMTQoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk4OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDMsJXIxOSwlcjAKLQlibCBMJDAwOTksJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRpbCBMJ0xDJDAwMDcsJXIyNgotCWxkbyBSJ0xDJDAwMDcoJXIyNiksJXIyNgotCWxkdyAwKCVyMTkpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMDk5OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyOAotCWJsLG4gTCQwMDk3LCVyMAotTCQwMDk3OiAKLQlsZHcgMTYoJXI0KSwlcjExCi0JbGR3IDIwKCVyNCksJXIxMAotCWxkdyAyNCglcjQpLCVyOQotCWxkdyAyOCglcjQpLCVyOAotCWxkdyAzMiglcjQpLCVyNwotCWxkdyAzNiglcjQpLCVyNgotCWxkdyA0MCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGN1cnJlbnRfdGFyZ2V0LERBVEEKLQkuSU1QT1JUIGZmbHVzaCxDT0RFCi0JLklNUE9SVCBfX2lvYixEQVRBCi0JLklNUE9SVCBmcHJpbnRmLENPREUKLQkuYWxpZ24gNAotTEMkMDAxNTogCi0JLlNUUklORyAiVHlwZSBceDAwIgotCS5JTVBPUlQgdHlwZV9wcmludCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwMTY6IAotCS5TVFJJTkcgIlx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMTc6IAotCS5TVFJJTkcgIiBpcyBub3QgYSBzdHJ1Y3R1cmUgb3IgdW5pb24gdHlwZS5ceDAwIgotCS5JTVBPUlQgY2hlY2tfc3R1Yl90eXBlLENPREUKLQkuYWxpZ24gNAotTEMkMDAxODogCi0JLlNUUklORyAiIGhhcyBubyBjb21wb25lbnQgbmFtZWQgXHgwMCIKLQkuSU1QT1JUIGZwdXRzX2ZpbHRlcmVkLENPREUKLQkuYWxpZ24gNAotTEMkMDAxOTogCi0JLlNUUklORyAiLlx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIGxvb2t1cF9zdHJ1Y3RfZWx0X3R5cGUsQ09ERQotCS5FWFBPUlQgbG9va3VwX3N0cnVjdF9lbHRfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLFJUTlZBTD1HUgotbG9va3VwX3N0cnVjdF9lbHRfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXIxMSwyNCglcjQpCi0Jc3R3ICVyMTAsMjgoJXI0KQotCXN0dyAlcjksMzIoJXI0KQotCXN0dyAlcjgsMzYoJXI0KQotCXN0dyAlcjcsNDAoJXI0KQotCXN0dyAlcjYsNDQoJXI0KQotCXN0dyAlcjUsNDgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtMTIoJXIwKSwlcjkKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyOSwlcjEwCi0Jc3R3ICVyMjQsMCglcjEwKQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAxLCVyMjAsJXIwCi0JYmwgTCQwMTAyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDE2KCVyMCksJXIxOQotCWNvbWNsciw8PiAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTAyLCVyMAotCW5vcAotCWJsLG4gTCQwMTAxLCVyMAotTCQwMTAyOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDE2KCVyMjApLCVyMjEKLQlzdHcgJXIyMSwwKCVyMTkpCi1MJDAxMDE6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAzLCVyMjAsJXIwCi0JYmwgTCQwMTAzLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiA0LCVyMjAsJXIwCi0JYmwgTCQwMTAzLCVyMAotCW5vcAotCWFkZGlsIEwnY3VycmVudF90YXJnZXQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2N1cnJlbnRfdGFyZ2V0LSRnbG9iYWwkKCVyMSksJXIxOQotCWxkdyA3NiglcjE5KSwlcjExCi0JY29weSAlcjExLCVyMjIKLQkuQ0FMTAlBUkdXMD1HUgotCWJsICQkZHluY2FsbCwlcjMxCi0JY29weSAlcjMxLCVyMgotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMTYsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzE2KCVyMSksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZmZsdXNoLCVyMgotCW5vcAotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNgotCWxkaWwgTCdMQyQwMDE1LCVyMjUKLQlsZG8gUidMQyQwMDE1KCVyMjUpLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGZwcmludGYsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDE2LCVyMjUKLQlsZG8gUidMQyQwMDE2KCVyMjUpLCVyMjUKLQlhZGRpbCBMJ19faW9iLSRnbG9iYWwkKzMyLCVyMjcKLQlsZG8gUidfX2lvYi0kZ2xvYmFsJCszMiglcjEpLCVyMjQKLQlsZG8gLTEoJXIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCB0eXBlX3ByaW50LCVyMgotCW5vcAotCWxkaWwgTCdMQyQwMDE3LCVyMjYKLQlsZG8gUidMQyQwMDE3KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGVycm9yLCVyMgotCW5vcAotTCQwMTAzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBjaGVja19zdHViX3R5cGUsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzNCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSwxNiwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDEwNDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw+PSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTA1LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwxMiglcjQpCi0JbGR3IDEyKCVyNCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDEwNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMDcsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMDc6IAotTCQwMTA2OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMTA0LCVyMAotTCQwMTA1OiAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZGggMCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLUwkMDEwODogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JY29taWNsciw8PSAwLCVyMTksJXIwCi0JYmwgTCQwMTA5LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDgoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBsb29rdXBfc3RydWN0X2VsdF90eXBlLCVyMgotCW5vcAotCXN0dyAlcjI4LDE2KCVyNCkKLQlsZHcgMTYoJXI0KSwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTExLCVyMAotCW5vcAotCWxkdyAxNiglcjQpLCVyMjgKLQlibCxuIEwkMDEwMCwlcjAKLUwkMDExMTogCi1MJDAxMTA6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAtMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAxMDgsJXIwCi1MJDAxMDk6IAotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMTEyLCVyMAotCW5vcAotCWNvcHkgJXIwLCVyMjgKLQlibCxuIEwkMDEwMCwlcjAKLUwkMDExMjogCi0JYWRkaWwgTCdjdXJyZW50X3RhcmdldC0kZ2xvYmFsJCwlcjI3Ci0JbGR3IFInY3VycmVudF90YXJnZXQtJGdsb2JhbCQoJXIxKSwlcjE5Ci0JbGR3IDc2KCVyMTkpLCVyMTEKLQljb3B5ICVyMTEsJXIyMgotCS5DQUxMCUFSR1cwPUdSCi0JYmwgJCRkeW5jYWxsLCVyMzEKLQljb3B5ICVyMzEsJXIyCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCsxNiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMTYoJXIxKSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmZmx1c2gsJXIyCi0Jbm9wCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTUsJXIyNQotCWxkbyBSJ0xDJDAwMTUoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnByaW50ZiwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTYsJXIyNQotCWxkbyBSJ0xDJDAwMTYoJXIyNSksJXIyNQotCWFkZGlsIEwnX19pb2ItJGdsb2JhbCQrMzIsJXIyNwotCWxkbyBSJ19faW9iLSRnbG9iYWwkKzMyKCVyMSksJXIyNAotCWxkbyAtMSglcjApLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHR5cGVfcHJpbnQsJXIyCi0Jbm9wCi0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI2Ci0JbGRpbCBMJ0xDJDAwMTgsJXIyNQotCWxkbyBSJ0xDJDAwMTgoJXIyNSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZnByaW50ZiwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JYWRkaWwgTCdfX2lvYi0kZ2xvYmFsJCszMiwlcjI3Ci0JbGRvIFInX19pb2ItJGdsb2JhbCQrMzIoJXIxKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBmcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDAxOSwlcjI2Ci0JbGRvIFInTEMkMDAxOSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLQlsZG8gLTEoJXIwKSwlcjI4Ci0JYmwsbiBMJDAxMDAsJXIwCi1MJDAxMDA6IAotCWxkdyAyNCglcjQpLCVyMTEKLQlsZHcgMjgoJXI0KSwlcjEwCi0JbGR3IDMyKCVyNCksJXI5Ci0JbGR3IDM2KCVyNCksJXI4Ci0JbGR3IDQwKCVyNCksJXI3Ci0JbGR3IDQ0KCVyNCksJXI2Ci0JbGR3IDQ4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmaWxsX2luX3ZwdHJfZmllbGRubyxDT0RFCi0JLkVYUE9SVCBmaWxsX2luX3ZwdHJfZmllbGRubyxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSCi1maWxsX2luX3ZwdHJfZmllbGRubzogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI2LDE2KCVyNCkKLQlzdHcgJXI1LDIwKCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ0KCVyMTkpLCVyMjAKLQljb21pY2xyLD4gMCwlcjIwLCVyMAotCWJsIEwkMDExNCwlcjAKLQlub3AKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLUwkMDExNTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDAoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAxMTYsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCXpkZXAgJXIyMCwyNywyOCwlcjIxCi0JbGR3IDM2KCVyMTkpLCVyMjAKLQlhZGQgJXIyMSwlcjIwLCVyMTkKLQlsZHcgOCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmaWxsX2luX3ZwdHJfZmllbGRubywlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkdyA4KCVyMTkpLCVyMjAKLQlsZHcgNDQoJXIyMCksJXIxOQotCWNvbWljbHIsPD0gMCwlcjE5LCVyMAotCWJsIEwkMDExOCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA4KCVyNCksJXIyMQotCXpkZXAgJXIyMSwyNywyOCwlcjIyCi0JbGR3IDM2KCVyMjApLCVyMjEKLQlhZGQgJXIyMiwlcjIxLCVyMjAKLQlsZHcgOCglcjIwKSwlcjIxCi0JbGR3IDQ0KCVyMjEpLCVyMjAKLQlzdHcgJXIyMCw0NCglcjE5KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI3LDI4LCVyMjIKLQlsZHcgMzYoJXIyMCksJXIyMQotCWFkZCAlcjIyLCVyMjEsJXIyMAotCWxkdyA4KCVyMjApLCVyMjEKLQlsZHcgNDAoJXIyMSksJXIyMAotCXN0dyAlcjIwLDQwKCVyMTkpCi0JYmwsbiBMJDAxMTYsJXIwCi1MJDAxMTg6IAotTCQwMTE3OiAKLQlsZHcgOCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JYmwsbiBMJDAxMTUsJXIwCi1MJDAxMTY6IAotTCQwMTE0OiAKLUwkMDExMzogCi0JbGR3IDE2KCVyNCksJXI2Ci0JbGR3IDIwKCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5FWFBPUlQgc3R1Yl9ub25hbWVfY29tcGxhaW50LERBVEEKLQkuYWxpZ24gNAotTEMkMDAyMDogCi0JLlNUUklORyAic3R1YiB0eXBlIGhhcyBOVUxMIG5hbWVceDAwIgotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLmFsaWduIDQKLXN0dWJfbm9uYW1lX2NvbXBsYWludDogCi0JLndvcmQgTEMkMDAyMAotCS53b3JkIDAKLQkud29yZCAwCi0JLklNUE9SVCBjb21wbGFpbixDT0RFCi0JLklNUE9SVCBtZW1jcHksQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGNoZWNrX3N0dWJfdHlwZSxDT0RFCi0JLkVYUE9SVCBjaGVja19zdHViX3R5cGUsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUgotY2hlY2tfc3R1Yl90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWxkbyA0KCVyMCksJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIxOQotCWV4dHJzICVyMTksMzEsMTYsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDEyMCwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCB0eXBlX25hbWVfbm9fdGFnLCVyMgotCW5vcAotCXN0dyAlcjI4LDgoJXI0KQotCWxkdyA4KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTIxLCVyMAotCW5vcAotCWFkZGlsIEwnc3R1Yl9ub25hbWVfY29tcGxhaW50LSRnbG9iYWwkLCVyMjcKLQlsZG8gUidzdHViX25vbmFtZV9jb21wbGFpbnQtJGdsb2JhbCQoJXIxKSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgY29tcGxhaW4sJXIyCi0Jbm9wCi0JYmwsbiBMJDAxMTksJXIwCi1MJDAxMjE6IAotCXN0dyAlcjAsLTUyKCVyMzApCi0JbGR3IDgoJXI0KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWNvcHkgJXIwLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGxvb2t1cF9zeW1ib2wsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMTkKLQljb21pY2xyLDw+IDAsJXIxOSwlcjAKLQlibCBMJDAxMjIsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMTIoJXIyMCksJXIyNQotCWxkbyA1MiglcjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbWNweSwlcjIKLQlub3AKLUwkMDEyMjogCi1MJDAxMjA6IAotTCQwMTE5OiAKLQlsZHcgMTYoJXI0KSwlcjYKLQlsZHcgMjAoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLklNUE9SVCBnZGJfbWFuZ2xlX25hbWUsQ09ERQotCS5JTVBPUlQgY3BsdXNfZGVtYW5nbGUsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDIxOiAKLQkuU1RSSU5HICJJbnRlcm5hbDogQ2Fubm90IGRlbWFuZ2xlIG1hbmdsZWQgbmFtZSBgJXMnLlx4MDAiCi0JLklNUE9SVCBzdHJjaHIsQ09ERQotCS5JTVBPUlQgcGFyc2VfYW5kX2V2YWxfdHlwZSxDT0RFCi0JLklNUE9SVCBidWlsdGluX3R5cGVfdm9pZCxEQVRBCi0JLklNUE9SVCBmcmVlLENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgY2hlY2tfc3R1Yl9tZXRob2QsQ09ERQotCS5FWFBPUlQgY2hlY2tfc3R1Yl9tZXRob2QsRU5UUlksUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotY2hlY2tfc3R1Yl9tZXRob2Q6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTEsNjQoJXI0KQotCXN0dyAlcjEwLDY4KCVyNCkKLQlzdHcgJXI5LDcyKCVyNCkKLQlzdHcgJXI4LDc2KCVyNCkKLQlzdHcgJXI3LDgwKCVyNCkKLQlzdHcgJXI2LDg0KCVyNCkKLQlzdHcgJXI1LDg4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZG8gLTEyKCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQlsZHcgMCglcjIxKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBnZGJfbWFuZ2xlX25hbWUsJXIyCi0Jbm9wCi0Jc3R3ICVyMjgsMTIoJXI0KQotCWxkdyAxMiglcjQpLCVyMjYKLQlsZG8gMyglcjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIGNwbHVzX2RlbWFuZ2xlLCVyMgotCW5vcAotCXN0dyAlcjI4LDE2KCVyNCkKLQlzdHcgJXIwLDI4KCVyNCkKLQlsZG8gMSglcjApLCVyMTkKLQlzdHcgJXIxOSwzMiglcjQpCi0JbGR3IDE2KCVyNCksJXIxOQotCWNvbWljbHIsPSAwLCVyMTksJXIwCi0JYmwgTCQwMTI0LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDIxLCVyMjYKLQlsZG8gUidMQyQwMDIxKCVyMjYpLCVyMjYKLQlsZHcgMTIoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLUwkMDEyNDogCi0JbGR3IDE2KCVyNCksJXIyNgotCWxkbyA0MCglcjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNociwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyMCglcjQpCi0JbGR3IDIwKCVyNCksJXIxOQotCXN0dyAlcjE5LDI0KCVyNCkKLUwkMDEyNTogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDEyNiwlcjAKLQlub3AKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQwKCVyMCksJXIyMAotCWNvbWNsciw9ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMjcsJXIwCi0Jbm9wCi0JbGR3IDI4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi0JYmwsbiBMJDAxMjgsJXIwCi1MJDAxMjc6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDEoJXIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEyOSwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGRvIC0xKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyOCglcjQpCi0JYmwsbiBMJDAxMzAsJXIwCi1MJDAxMjk6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDQoJXIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDEzMSwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAxMzEsJXIwCi0Jbm9wCi0JbGR3IDMyKCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwzMiglcjQpCi1MJDAxMzE6IAotTCQwMTMwOiAKLUwkMDEyODogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyNCglcjQpCi0JYmwsbiBMJDAxMjUsJXIwCi1MJDAxMjY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDEzNywlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZG8gMTIwKCVyMjApLCVyMTkKLQlzdHcgJXIxOSw0NCglcjQpCi0JbGR3IDQ0KCVyNCksJXIxOQotCXN0dyAlcjE5LDQ4KCVyNCkKLQlsZHcgMzIoJXI0KSwlcjIwCi0JbGRvIDIoJXIyMCksJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjIwCi0Jc3R3ICVyMjAsNTIoJXI0KQotCWxkdyA0OCglcjQpLCVyMTkKLQlsZHcgNDgoJXI0KSwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMTkKLQlsZHcgMTIoJXIyMCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyA1MiglcjQpLCVyMjAKLQljb21jbHIsPCAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTMyLCVyMAotCW5vcAotCWxkdyA0OCglcjQpLCVyMjYKLQlsZHcgNTIoJXI0KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBfb2JzdGFja19uZXdjaHVuaywlcjIKLQlub3AKLQljb3B5ICVyMCwlcjE5Ci0JYmwsbiBMJDAxMzMsJXIwCi1MJDAxMzI6IAotCWNvcHkgJXIwLCVyMTkKLUwkMDEzMzogCi0JbGR3IDQ4KCVyNCksJXIxOQotCWxkdyA0OCglcjQpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIyMQotCWxkdyA1MiglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDQ0KCVyNCksJXIxOQotCXN0dyAlcjE5LDU2KCVyNCkKLQlsZHcgNTYoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDYwKCVyNCkKLQlsZHcgNTYoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgNjAoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDEzNCwlcjAKLQlub3AKLQlsZHcgNTYoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMTM0OiAKLQlsZHcgNTYoJXI0KSwlcjE5Ci0JbGR3IDU2KCVyNCksJXIyMAotCWxkdyA1NiglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDU2KCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNTYoJXI0KSwlcjIwCi0JbGR3IDU2KCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxMzUsJXIwCi0Jbm9wCi0JbGR3IDU2KCVyNCksJXIxOQotCWxkdyA1NiglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDEzNiwlcjAKLUwkMDEzNTogCi0JY29weSAlcjAsJXIxOQotTCQwMTM2OiAKLQlsZHcgNTYoJXI0KSwlcjE5Ci0JbGR3IDU2KCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyA2MCglcjQpLCVyMTEKLQlibCxuIEwkMDEzOCwlcjAKLUwkMDEzNzogCi0JbGR3IDMyKCVyNCksJXIyMAotCWxkbyAyKCVyMjApLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIyMAotCWNvcHkgJXIyMCwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCB4bWFsbG9jLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjExCi1MJDAxMzg6IAotCXN0dyAlcjExLDM2KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMjQoJXI0KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGxvb2t1cF9wb2ludGVyX3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZHcgMzYoJXI0KSwlcjIwCi0Jc3R3ICVyMTksMCglcjIwKQotCWxkbyAxKCVyMCksJXIxOQotCXN0dyAlcjE5LDMyKCVyNCkKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQxKCVyMCksJXIyMAotCWNvbWNsciw8PiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTM5LCVyMAotCW5vcAotCXN0dyAlcjAsMjgoJXI0KQotTCQwMTQwOiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwgTCQwMTQxLCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQljb21pY2xyLD49IDAsJXIxOSwlcjAKLQlibCBMJDAxNDIsJXIwCi0Jbm9wCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0NCglcjApLCVyMjAKLQljb21jbHIsPD4gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0MywlcjAKLQlub3AKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGRiIDAoJXIxOSksJXIyMAotCWV4dHJzICVyMjAsMzEsOCwlcjE5Ci0JbGRvIDQxKCVyMCksJXIyMAotCWNvbWNsciw8PiAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTQzLCVyMAotCW5vcAotCWJsLG4gTCQwMTQyLCVyMAotTCQwMTQzOiAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCXN1YiAlcjE5LCVyMjAsJXIxOQotCWxkdyAyMCglcjQpLCVyMjYKLQljb3B5ICVyMTksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcGFyc2VfYW5kX2V2YWxfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWxkdyAzMiglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMQotCWxkdyAzNiglcjQpLCVyMjIKLQlhZGQgJXIyMSwlcjIyLCVyMjAKLQlzdHcgJXIxOSwwKCVyMjApCi0JbGR3IDMyKCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwzMiglcjQpCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwyMCglcjQpCi1MJDAxNDI6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDAoJXIwKSwlcjIwCi0JY29tY2xyLD0gJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE0NCwlcjAKLQlub3AKLQlsZHcgMjgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI4KCVyNCkKLQlibCxuIEwkMDE0NSwlcjAKLUwkMDE0NDogCi0JbGR3IDI0KCVyNCksJXIxOQotCWxkYiAwKCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDgsJXIxOQotCWxkbyA0MSglcjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTQ2LCVyMAotCW5vcAotCWxkdyAyOCglcjQpLCVyMTkKLQlsZG8gLTEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI4KCVyNCkKLUwkMDE0NjogCi1MJDAxNDU6IAotCWxkdyAyNCglcjQpLCVyMTkKLQlsZG8gMSglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsMjQoJXI0KQotCWJsLG4gTCQwMTQwLCVyMAotTCQwMTQxOiAKLUwkMDEzOTogCi0JbGRvIC0yKCVyMCksJXIxOQotCWxkdyAyNCglcjQpLCVyMjAKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQlsZGIgMCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSw4LCVyMTkKLQlsZG8gNDYoJXIwKSwlcjIwCi0JY29tY2xyLDw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNDcsJXIwCi0Jbm9wCi0JbGR3IDMyKCVyNCksJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjIwCi0JbGR3IDM2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCWFkZGlsIEwnYnVpbHRpbl90eXBlX3ZvaWQtJGdsb2JhbCQsJXIyNwotCWxkdyBSJ2J1aWx0aW5fdHlwZV92b2lkLSRnbG9iYWwkKCVyMSksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlibCxuIEwkMDE0OCwlcjAKLUwkMDE0NzogCi0JbGR3IDMyKCVyNCksJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjIwCi0JbGR3IDM2KCVyNCksJXIyMQotCWFkZCAlcjIwLCVyMjEsJXIxOQotCXN0dyAlcjAsMCglcjE5KQotTCQwMTQ4OiAKLQlsZHcgMTYoJXI0KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZHcgNDgoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQl6ZGVwICVyMjEsMzAsMzEsJXIyMAotCWFkZCAlcjIwLCVyMjEsJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjIwCi0JbGR3IDIwKCVyMTkpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMTkKLQlsZHcgOCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCXN0dyAlcjIwLDAoJXIxOSkKLQlsZG8gLTEyKCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjE5Ci0JYWRkICVyMTksJXIyMCwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQlsZHcgNCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsNDAoJXI0KQotCWxkdyA0MCglcjQpLCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsNDAoJXIxOSkKLQlsZHcgNDAoJXI0KSwlcjE5Ci0JbGR3IDM2KCVyNCksJXIyMAotCXN0dyAlcjIwLDQ4KCVyMTkpCi0JbGR3IDQwKCVyNCksJXIxOQotCWxkdyA0MCglcjQpLCVyMjAKLQlsZGggMzIoJXIyMCksJXIyMQotCWNvcHkgJXIyMSwlcjIwCi0JZGVwaSAwLDI5LDEsJXIyMAotCXN0aCAlcjIwLDMyKCVyMTkpCi0JbGRvIC0xMiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIxOQotCWFkZCAlcjE5LCVyMjAsJXIxOQotCXpkZXAgJXIxOSwyOSwzMCwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JYWRkICVyMTksJXIyMCwlcjE5Ci0JbGR3IDE2KCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgMCw0LDEsJXIyMQotCXN0dyAlcjIxLDE2KCVyMTkpCi1MJDAxMjM6IAotCWxkdyA2NCglcjQpLCVyMTEKLQlsZHcgNjgoJXI0KSwlcjEwCi0JbGR3IDcyKCVyNCksJXI5Ci0JbGR3IDc2KCVyNCksJXI4Ci0JbGR3IDgwKCVyNCksJXI3Ci0JbGR3IDg0KCVyNCksJXI2Ci0JbGR3IDg4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5hbGlnbiA0Ci0JLkVYUE9SVCBhbGxvY2F0ZV9jcGx1c19zdHJ1Y3RfdHlwZSxDT0RFCi0JLkVYUE9SVCBhbGxvY2F0ZV9jcGx1c19zdHJ1Y3RfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSCi1hbGxvY2F0ZV9jcGx1c19zdHJ1Y3RfdHlwZTogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTkyLENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxOTIoJXIzMCkKLQlzdHcgJXI4LDMyKCVyNCkKLQlzdHcgJXI3LDM2KCVyNCkKLQlzdHcgJXI2LDQwKCVyNCkKLQlzdHcgJXI1LDQ0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMTkKLQlsZGlsIEwnY3BsdXNfc3RydWN0X2RlZmF1bHQsJXIyMAotCWxkbyBSJ2NwbHVzX3N0cnVjdF9kZWZhdWx0KCVyMjApLCVyMjAKLQljb21jbHIsPSAlcjE5LCVyMjAsJXIwCi0JYmwgTCQwMTUwLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyNwotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTIoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDE1NiwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZG8gMTIwKCVyMjApLCVyMTkKLQlzdHcgJXIxOSw4KCVyNCkKLQlsZHcgOCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxMiglcjQpCi0JbGRvIDI0KCVyMCksJXIxOQotCXN0dyAlcjE5LDE2KCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE1MSwlcjAKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDE2KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMTUyLCVyMAotTCQwMTUxOiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxNTI6IAotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDIwKCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDE1MywlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMTUzOiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNTQsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDE1NSwlcjAKLUwkMDE1NDogCi0JY29weSAlcjAsJXIxOQotTCQwMTU1OiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyAyNCglcjQpLCVyOAotCWJsLG4gTCQwMTU3LCVyMAotTCQwMTU2OiAKLQlsZG8gMjQoJXIwKSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCB4bWFsbG9jLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjgKLUwkMDE1NzogCi0Jc3R3ICVyOCw0OCglcjcpCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRpbCBMJ2NwbHVzX3N0cnVjdF9kZWZhdWx0LCVyMTkKLQljb3B5ICVyMjAsJXIyMQotCWxkbyBSJ2NwbHVzX3N0cnVjdF9kZWZhdWx0KCVyMTkpLCVyMjIKLQlsZHdzLG1hIDQoJXIyMiksJXIxOQotCWxkd3MsbWEgNCglcjIyKSwlcjIwCi0Jc3R3cyxtYSAlcjE5LDQoJXIyMSkKLQlsZHdzLG1hIDQoJXIyMiksJXIxOQotCXN0d3MsbWEgJXIyMCw0KCVyMjEpCi0JbGR3cyxtYSA0KCVyMjIpLCVyMjAKLQlzdHdzLG1hICVyMTksNCglcjIxKQotCWxkd3MsbWEgNCglcjIyKSwlcjE5Ci0Jc3R3cyxtYSAlcjIwLDQoJXIyMSkKLQlsZHdzLG1hIDQoJXIyMiksJXIyMAotCXN0d3MsbWEgJXIxOSw0KCVyMjEpCi0Jc3R3ICVyMjAsMCglcjIxKQotTCQwMTUwOiAKLUwkMDE0OTogCi0JbGR3IDMyKCVyNCksJXI4Ci0JbGR3IDM2KCVyNCksJXI3Ci0JbGR3IDQwKCVyNCksJXI2Ci0JbGR3IDQ0KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgb2JzYXZlc3RyaW5nLENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgaW5pdF90eXBlLENPREUKLQkuRVhQT1JUIGluaXRfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSLFJUTlZBTD1HUgotaW5pdF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjE0LDgoJXI0KQotCXN0dyAlcjEzLDEyKCVyNCkKLQlzdHcgJXIxMiwxNiglcjQpCi0Jc3R3ICVyMTEsMjAoJXI0KQotCXN0dyAlcjEwLDI0KCVyNCkKLQlzdHcgJXI5LDI4KCVyNCkKLQlzdHcgJXI4LDMyKCVyNCkKLQlzdHcgJXI3LDM2KCVyNCkKLQlzdHcgJXI2LDQwKCVyNCkKLQlzdHcgJXI1LDQ0KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlsZG8gLTEyKCVyMCksJXI5Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjksJXIxMAotCXN0dyAlcjI0LDAoJXIxMCkKLQlsZG8gLTE2KCVyMCksJXIxMQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXIxMSwlcjEyCi0Jc3R3ICVyMjMsMCglcjEyKQotCWxkbyAtMjAoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBhbGxvY190eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjEzCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLDAoJXIxMykKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjEzKQotCWxkbyAtMTIoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGggMzIoJXIxMyksJXIyMAotCWxkaCAyKCVyMTkpLCVyMTkKLQlvciAlcjIwLCVyMTksJXIyMAotCXN0aCAlcjIwLDMyKCVyMTMpCi0JbGRvIC0xNiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxNTksJXIwCi0Jbm9wCi0JbGRvIC0yMCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAxNTksJXIwCi0Jbm9wCi0JbGRvIC0xNiglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxNAotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBzdHJsZW4sJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlsZG8gLTIwKCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkbyAxMjAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTQpLCVyMjYKLQljb3B5ICVyMTksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBvYnNhdmVzdHJpbmcsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyMTkKLQlzdHcgJXIxOSw0KCVyMTMpCi0JYmwsbiBMJDAxNjAsJXIwCi1MJDAxNTk6IAotCWxkbyAtMTYoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsNCglcjEzKQotTCQwMTYwOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAzLCVyMjAsJXIwCi0JYmwgTCQwMTYyLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDQsJXIyMCwlcjAKLQlibCBMJDAxNjIsJXIwCi0Jbm9wCi0JYmwsbiBMJDAxNjEsJXIwCi1MJDAxNjI6IAotCWxkaWwgTCdjcGx1c19zdHJ1Y3RfZGVmYXVsdCwlcjE5Ci0JbGRvIFInY3BsdXNfc3RydWN0X2RlZmF1bHQoJXIxOSksJXIxOQotCXN0dyAlcjE5LDQ4KCVyMTMpCi1MJDAxNjE6IAotCWNvcHkgJXIxMywlcjI4Ci0JYmwsbiBMJDAxNTgsJXIwCi1MJDAxNTg6IAotCWxkdyA4KCVyNCksJXIxNAotCWxkdyAxMiglcjQpLCVyMTMKLQlsZHcgMTYoJXI0KSwlcjEyCi0JbGR3IDIwKCVyNCksJXIxMQotCWxkdyAyNCglcjQpLCVyMTAKLQlsZHcgMjgoJXI0KSwlcjkKLQlsZHcgMzIoJXI0KSwlcjgKLQlsZHcgMzYoJXI0KSwlcjcKLQlsZHcgNDAoJXI0KSwlcjYKLQlsZHcgNDQoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwMjI6IAotCS5TVFJJTkcgImludGVybmFsIGVycm9yIC0gaW52YWxpZCBmdW5kYW1lbnRhbCB0eXBlIGlkICVkXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyMzogCi0JLlNUUklORyAiaW50ZXJuYWwgZXJyb3I6IHVuaGFuZGxlZCB0eXBlIGlkICVkXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyNDogCi0JLlNUUklORyAidm9pZFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMjU6IAotCS5TVFJJTkcgImJvb2xlYW5ceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI2OiAKLQkuU1RSSU5HICJzdHJpbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI3OiAKLQkuU1RSSU5HICJjaGFyXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAyODogCi0JLlNUUklORyAic2lnbmVkIGNoYXJceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDI5OiAKLQkuU1RSSU5HICJ1bnNpZ25lZCBjaGFyXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzMDogCi0JLlNUUklORyAic2hvcnRceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDMxOiAKLQkuU1RSSU5HICJ1bnNpZ25lZCBzaG9ydFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzI6IAotCS5TVFJJTkcgImludFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzM6IAotCS5TVFJJTkcgInVuc2lnbmVkIGludFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzQ6IAotCS5TVFJJTkcgImZpeGVkIGRlY2ltYWxceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM1OiAKLQkuU1RSSU5HICJsb25nXHgwMCIKLQkuYWxpZ24gNAotTEMkMDAzNjogCi0JLlNUUklORyAidW5zaWduZWQgbG9uZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzc6IAotCS5TVFJJTkcgImxvbmcgbG9uZ1x4MDAiCi0JLmFsaWduIDQKLUxDJDAwMzg6IAotCS5TVFJJTkcgInNpZ25lZCBsb25nIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDM5OiAKLQkuU1RSSU5HICJ1bnNpZ25lZCBsb25nIGxvbmdceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQwOiAKLQkuU1RSSU5HICJmbG9hdFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNDE6IAotCS5TVFJJTkcgImRvdWJsZVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNDI6IAotCS5TVFJJTkcgImZsb2F0aW5nIGRlY2ltYWxceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQzOiAKLQkuU1RSSU5HICJsb25nIGRvdWJsZVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNDQ6IAotCS5TVFJJTkcgImNvbXBsZXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ1OiAKLQkuU1RSSU5HICJkb3VibGUgY29tcGxleFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNDY6IAotCS5TVFJJTkcgImxvbmcgZG91YmxlIGNvbXBsZXhceDAwIgotCS5hbGlnbiA0Ci0JLkVYUE9SVCBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSxDT0RFCi0JLkVYUE9SVCBsb29rdXBfZnVuZGFtZW50YWxfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSLFJUTlZBTD1HUgotbG9va3VwX2Z1bmRhbWVudGFsX3R5cGU6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTkyKCVyMzApCi0Jc3R3ICVyMTIsMzIoJXI0KQotCXN0dyAlcjExLDM2KCVyNCkKLQlzdHcgJXIxMCw0MCglcjQpCi0Jc3R3ICVyOSw0NCglcjQpCi0Jc3R3ICVyOCw0OCglcjQpCi0Jc3R3ICVyNyw1MiglcjQpCi0Jc3R3ICVyNiw1NiglcjQpCi0Jc3R3ICVyNSw2MCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JY29weSAlcjAsJXI5Ci0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPD0gMCwlcjIwLCVyMAotCWJsIEwkMDE2NSwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDI1KCVyMCksJXIxOQotCWNvbWNsciw8PSAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMTY1LCVyMAotCW5vcAotCWJsLG4gTCQwMTY0LCVyMAotTCQwMTY1OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZGlsIEwnTEMkMDAyMiwlcjI2Ci0JbGRvIFInTEMkMDAyMiglcjI2KSwlcjI2Ci0JbGR3IDAoJXIxOSksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgZXJyb3IsJXIyCi0Jbm9wCi0JYmwsbiBMJDAxNjYsJXIwCi1MJDAxNjQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMTk2KCVyMTkpLCVyMjAKLQljb21pY2xyLD0gMCwlcjIwLCVyMAotCWJsIEwkMDE2NywlcjAKLQlub3AKLQlsZG8gMTA0KCVyMCksJXIxMQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMTIKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRvIDEyMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsOCglcjQpCi0JbGR3IDgoJXI0KSwlcjE5Ci0Jc3R3ICVyMTksMTIoJXI0KQotCXN0dyAlcjExLDE2KCVyNCkKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyAxNiglcjE5KSwlcjE5Ci0JbGR3IDEyKCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIxOSwlcjIwLCVyMAotCWJsIEwkMDE2OCwlcjAKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjI2Ci0JbGR3IDE2KCVyNCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgX29ic3RhY2tfbmV3Y2h1bmssJXIyCi0Jbm9wCi0JY29weSAlcjAsJXIxOQotCWJsLG4gTCQwMTY5LCVyMAotTCQwMTY4OiAKLQljb3B5ICVyMCwlcjE5Ci1MJDAxNjk6IAotCWxkdyAxMiglcjQpLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIwCi0JbGR3IDEyKCVyMjApLCVyMjEKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIwCi0JY29weSAlcjIwLCVyMjEKLQlzdHcgJXIyMSwxMiglcjE5KQotCWxkdyA4KCVyNCksJXIxOQotCXN0dyAlcjE5LDIwKCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDI0KCVyNCkKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDEyKCVyMTkpLCVyMjAKLQlsZHcgMjQoJXI0KSwlcjE5Ci0JY29tY2xyLD0gJXIyMCwlcjE5LCVyMAotCWJsIEwkMDE3MCwlcjAKLQlub3AKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCWRlcGkgLTEsMSwxLCVyMjEKLQlzdHcgJXIyMSw0MCglcjE5KQotTCQwMTcwOiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAyMCglcjQpLCVyMjEKLQlsZHcgMTIoJXIyMCksJXIyMAotCWxkdyAyNCglcjIxKSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAyNCglcjIxKSwlcjIyCi0JdWFkZGNtICVyMCwlcjIyLCVyMjEKLQlhbmQgJXIyMCwlcjIxLCVyMjAKLQljb3B5ICVyMjAsJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTIoJXIxOSksJXIxOQotCWxkdyA0KCVyMjApLCVyMjAKLQlzdWIgJXIxOSwlcjIwLCVyMTkKLQlsZHcgMjAoJXI0KSwlcjIwCi0JbGR3IDIwKCVyNCksJXIyMQotCWxkdyAxNiglcjIwKSwlcjIwCi0JbGR3IDQoJXIyMSksJXIyMQotCXN1YiAlcjIwLCVyMjEsJXIyMAotCWNvbWNsciw+ICVyMTksJXIyMCwlcjAKLQlibCBMJDAxNzEsJXIwCi0Jbm9wCi0JbGR3IDIwKCVyNCksJXIxOQotCWxkdyAyMCglcjQpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCXN0dyAlcjIxLDEyKCVyMTkpCi0JY29weSAlcjIxLCVyMTkKLQlibCxuIEwkMDE3MiwlcjAKLUwkMDE3MTogCi0JY29weSAlcjAsJXIxOQotTCQwMTcyOiAKLQlsZHcgMjAoJXI0KSwlcjE5Ci0JbGR3IDIwKCVyNCksJXIyMAotCWxkdyAxMiglcjIwKSwlcjIxCi0Jc3R3ICVyMjEsOCglcjE5KQotCWxkdyAyNCglcjQpLCVyMTkKLQlzdHcgJXIxOSwxOTYoJXIxMikKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDE5NiglcjE5KSwlcjI2Ci0JY29weSAlcjAsJXIyNQotCWNvcHkgJXIxMSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyCi0Jbm9wCi1MJDAxNjc6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlsZHcgMTk2KCVyMTkpLCVyMTkKLQlhZGQgJXIyMCwlcjE5LCVyMTAKLQlsZHcgMCglcjEwKSwlcjkKLQljb21pY2xyLD0gMCwlcjksJXIwCi0JYmwgTCQwMTczLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlhZGRpLHV2IC0yNiwlcjIwLCVyMAotCWJscixuICVyMjAsJXIwCi0JYixuIEwkMDE3NQotTCQwMjAyOiAKLQliIEwkMDE3NgotCW5vcAotCWIgTCQwMTc3Ci0Jbm9wCi0JYiBMJDAxNzkKLQlub3AKLQliIEwkMDE4MAotCW5vcAotCWIgTCQwMTgxCi0Jbm9wCi0JYiBMJDAxODIKLQlub3AKLQliIEwkMDE4MwotCW5vcAotCWIgTCQwMTg0Ci0Jbm9wCi0JYiBMJDAxODUKLQlub3AKLQliIEwkMDE4NgotCW5vcAotCWIgTCQwMTg3Ci0Jbm9wCi0JYiBMJDAxODkKLQlub3AKLQliIEwkMDE5MAotCW5vcAotCWIgTCQwMTkxCi0Jbm9wCi0JYiBMJDAxOTIKLQlub3AKLQliIEwkMDE5MwotCW5vcAotCWIgTCQwMTk0Ci0Jbm9wCi0JYiBMJDAxOTUKLQlub3AKLQliIEwkMDE5NgotCW5vcAotCWIgTCQwMTk4Ci0Jbm9wCi0JYiBMJDAxOTkKLQlub3AKLQliIEwkMDIwMAotCW5vcAotCWIgTCQwMjAxCi0Jbm9wCi0JYiBMJDAxNzgKLQlub3AKLQliIEwkMDE4OAotCW5vcAotCWIgTCQwMTk3Ci0Jbm9wCi1MJDAxNzU6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkaWwgTCdMQyQwMDIzLCVyMjYKLQlsZG8gUidMQyQwMDIzKCVyMjYpLCVyMjYKLQlsZHcgMCglcjE5KSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBlcnJvciwlcjIKLQlub3AKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE3NjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA5KCVyMCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAyNCwlcjIzCi0JbGRvIFInTEMkMDAyNCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTc3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjUsJXIyMwotCWxkbyBSJ0xDJDAwMjUoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE3ODogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyAxMiglcjApLCVyMjYKLQlsZG8gMSglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjYsJXIyMwotCWxkbyBSJ0xDJDAwMjYoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE3OTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAyNywlcjIzCi0JbGRvIFInTEMkMDAyNyglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTgwOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDEoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMjgsJXIyMwotCWxkbyBSJ0xDJDAwMjgoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4MTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAxKCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDI5LCVyMjMKLQlsZG8gUidMQyQwMDI5KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODI6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMiglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzAsJXIyMwotCWxkbyBSJ0xDJDAwMzAoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4MzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyAyKCVyMCksJXIyNQotCWxkbyAyKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDMwLCVyMjMKLQlsZG8gUidMQyQwMDMwKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODQ6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gMiglcjApLCVyMjUKLQlsZG8gMSglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzMSwlcjIzCi0JbGRvIFInTEMkMDAzMSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg1OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDMyLCVyMjMKLQlsZG8gUidMQyQwMDMyKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxODY6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzMiwlcjIzCi0JbGRvIFInTEMkMDAzMiglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzMsJXIyMwotCWxkbyBSJ0xDJDAwMzMoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE4ODogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA0KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzNCwlcjIzCi0JbGRvIFInTEMkMDAzNCglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTg5OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDM1LCVyMjMKLQlsZG8gUidMQyQwMDM1KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTA6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gNyglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQlsZG8gMiglcjApLCVyMjQKLQlsZGlsIEwnTEMkMDAzNSwlcjIzCi0JbGRvIFInTEMkMDAzNSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTkxOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDQoJXIwKSwlcjI1Ci0JbGRvIDEoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzYsJXIyMwotCWxkbyBSJ0xDJDAwMzYoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5MjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDAzNywlcjIzCi0JbGRvIFInTEMkMDAzNyglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTkzOiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDcoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JbGRvIDIoJXIwKSwlcjI0Ci0JbGRpbCBMJ0xDJDAwMzgsJXIyMwotCWxkbyBSJ0xDJDAwMzgoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5NDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA3KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWxkbyAxKCVyMCksJXIyNAotCWxkaWwgTCdMQyQwMDM5LCVyMjMKLQlsZG8gUidMQyQwMDM5KCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gNCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDAsJXIyMwotCWxkbyBSJ0xDJDAwNDAoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE5NjogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyA4KCVyMCksJXIyNQotCWNvcHkgJXIwLCVyMjQKLQlsZGlsIEwnTEMkMDA0MSwlcjIzCi0JbGRvIFInTEMkMDA0MSglcjIzKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbml0X3R5cGUsJXIyCi0Jbm9wCi0JY29weSAlcjI4LCVyOQotCWJsLG4gTCQwMTc0LCVyMAotTCQwMTk3OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0Jc3R3ICVyMjAsLTUyKCVyMzApCi0JbGRvIDgoJXIwKSwlcjI2Ci0JbGRvIDgoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQyLCVyMjMKLQlsZG8gUidMQyQwMDQyKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTg6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gMTYoJXIwKSwlcjI1Ci0JY29weSAlcjAsJXIyNAotCWxkaWwgTCdMQyQwMDQzLCVyMjMKLQlsZG8gUidMQyQwMDQzKCVyMjMpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluaXRfdHlwZSwlcjIKLQlub3AKLQljb3B5ICVyMjgsJXI5Ci0JYmwsbiBMJDAxNzQsJXIwCi1MJDAxOTk6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCwtNTIoJXIzMCkKLQlsZG8gOCglcjApLCVyMjYKLQlsZG8gOCglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDQsJXIyMwotCWxkbyBSJ0xDJDAwNDQoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDIwMDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyAxNiglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDUsJXIyMwotCWxkbyBSJ0xDJDAwNDUoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDIwMTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCXN0dyAlcjIwLC01MiglcjMwKQotCWxkbyA4KCVyMCksJXIyNgotCWxkbyAxNiglcjApLCVyMjUKLQljb3B5ICVyMCwlcjI0Ci0JbGRpbCBMJ0xDJDAwNDYsJXIyMwotCWxkbyBSJ0xDJDAwNDYoJXIyMyksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgaW5pdF90eXBlLCVyMgotCW5vcAotCWNvcHkgJXIyOCwlcjkKLQlibCxuIEwkMDE3NCwlcjAKLUwkMDE3NDogCi0Jc3R3ICVyOSwwKCVyMTApCi1MJDAxNzM6IAotTCQwMTY2OiAKLQljb3B5ICVyOSwlcjI4Ci0JYmwsbiBMJDAxNjMsJXIwCi1MJDAxNjM6IAotCWxkdyAzMiglcjQpLCVyMTIKLQlsZHcgMzYoJXI0KSwlcjExCi0JbGR3IDQwKCVyNCksJXIxMAotCWxkdyA0NCglcjQpLCVyOQotCWxkdyA0OCglcjQpLCVyOAotCWxkdyA1MiglcjQpLCVyNwotCWxkdyA1NiglcjQpLCVyNgotCWxkdyA2MCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHB1dHNfZmlsdGVyZWQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDQ3OiAKLQkuU1RSSU5HICIgXHgwMCIKLQkuSU1QT1JUIHByaW50Zl9maWx0ZXJlZCxDT0RFCi0JLmFsaWduIDQKLUxDJDAwNDg6IAotCS5TVFJJTkcgIjFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDQ5OiAKLQkuU1RSSU5HICIwXHgwMCIKLQkuYWxpZ24gNAotcHJpbnRfYml0X3ZlY3RvcjogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDE2KCVyNCkKLQlzdHcgJXI3LDIwKCVyNCkKLQlzdHcgJXI2LDI0KCVyNCkKLQlzdHcgJXI1LDI4KCVyNCkKLQlsZG8gLTQoJXIwKSwlcjUKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNSwlcjYKLQlzdHcgJXIyNiwwKCVyNikKLQlsZG8gLTgoJXIwKSwlcjcKLQlsZG8gLTMyKCVyNCksJXIxOQotCWFkZCAlcjE5LCVyNywlcjgKLQlzdHcgJXIyNSwwKCVyOCkKLQlzdHcgJXIwLDgoJXI0KQotTCQwMjA0OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjE5Ci0JY29tY2xyLDwgJXIyMCwlcjE5LCVyMAotCWJsIEwkMDIwNSwlcjAKLQlub3AKLQlsZHcgOCglcjQpLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQljb21pY2xyLD4gMCwlcjE5LCVyMAotCWJsIEwkMDIwOCwlcjAKLQlub3AKLQlsZG8gNyglcjE5KSwlcjE5Ci1MJDAyMDg6IAotCWV4dHJzICVyMTksMjgsMjksJXIxOQotCXpkZXAgJXIxOSwyOCwyOSwlcjIxCi0Jc3ViICVyMjAsJXIyMSwlcjE5Ci0JY29taWNsciw9IDAsJXIxOSwlcjAKLQlibCBMJDAyMDcsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNDcsJXIyNgotCWxkbyBSJ0xDJDAwNDcoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDIwNzogCi0JbGR3IDgoJXI0KSwlcjIwCi0JZXh0cnMgJXIyMCwyOCwyOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWFkZCAlcjE5LCVyMjEsJXIyMAotCWxkYiAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQlleHRydSAlcjIwLDMxLDMsJXIyMQotCXN1YmksPj49IDMxLCVyMjEsJXIyMAotCWNvcHkgJXIwLCVyMjAKLQltdHNhciAlcjIwCi0JdmV4dHJzICVyMTksMzIsJXIxOQotCWV4dHJ1ICVyMTksMzEsMSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjA5LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDQ4LCVyMjYKLQlsZG8gUidMQyQwMDQ4KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIxMCwlcjAKLUwkMDIwOTogCi0JbGRpbCBMJ0xDJDAwNDksJXIyNgotCWxkbyBSJ0xDJDAwNDkoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjEwOiAKLUwkMDIwNjogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMjA0LCVyMAotTCQwMjA1OiAKLUwkMDIwMzogCi0JbGR3IDE2KCVyNCksJXI4Ci0JbGR3IDIwKCVyNCksJXI3Ci0JbGR3IDI0KCVyNCksJXI2Ci0JbGR3IDI4KCVyNCksJXI1Ci0JbGRvIDgoJXI0KSwlcjMwCi0JbGR3IC0yOCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkd20gLTgoJXIzMCksJXI0Ci0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgcmVjdXJzaXZlX2R1bXBfdHlwZSxDT0RFCi0JLmFsaWduIDQKLXByaW50X2FyZ190eXBlczogCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCWNvcHkgJXI0LCVyMQotCWNvcHkgJXIzMCwlcjQKLQlzdHdtICVyMSwxMjgoJXIzMCkKLQlzdHcgJXI4LDgoJXI0KQotCXN0dyAlcjcsMTIoJXI0KQotCXN0dyAlcjYsMTYoJXI0KQotCXN0dyAlcjUsMjAoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyMTIsJXIwCi0Jbm9wCi1MJDAyMTM6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjE0LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDIoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDQoJXIyMCksJXIyMQotCXN0dyAlcjIxLDAoJXIxOSkKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWNvbWljbHIsPSA5LCVyMjAsJXIwCi0JYmwgTCQwMjE1LCVyMAotCW5vcAotCWJsLG4gTCQwMjE0LCVyMAotTCQwMjE1OiAKLQlibCxuIEwkMDIxMywlcjAKLUwkMDIxNDogCi1MJDAyMTI6IAotTCQwMjExOiAKLQlsZHcgOCglcjQpLCVyOAotCWxkdyAxMiglcjQpLCVyNwotCWxkdyAxNiglcjQpLCVyNgotCWxkdyAyMCglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIHByaW50ZmlfZmlsdGVyZWQsQ09ERQotCS5hbGlnbiA0Ci1MQyQwMDUwOiAKLQkuU1RSSU5HICJmbl9maWVsZGxpc3RzIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1MTogCi0JLlNUUklORyAiWyVkXSBuYW1lICclcycgKDB4JXgpIGxlbmd0aCAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDUyOiAKLQkuU1RSSU5HICJbJWRdIHBoeXNuYW1lICclcycgKDB4JXgpXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTM6IAotCS5TVFJJTkcgInR5cGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU0OiAKLQkuU1RSSU5HICJhcmdzIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA1NTogCi0JLlNUUklORyAiZmNvbnRleHQgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU2OiAKLQkuU1RSSU5HICJpc19jb25zdCAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU3OiAKLQkuU1RSSU5HICJpc192b2xhdGlsZSAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDU4OiAKLQkuU1RSSU5HICJpc19wcml2YXRlICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNTk6IAotCS5TVFJJTkcgImlzX3Byb3RlY3RlZCAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDYwOiAKLQkuU1RSSU5HICJpc19zdHViICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjE6IAotCS5TVFJJTkcgInZvZmZzZXQgJXVceDBhXHgwMCIKLQkuYWxpZ24gNAotZHVtcF9mbl9maWVsZGxpc3RzOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xOTIsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDE5MiglcjMwKQotCXN0dyAlcjgsMjQoJXI0KQotCXN0dyAlcjcsMjgoJXI0KQotCXN0dyAlcjYsMzIoJXI0KQotCXN0dyAlcjUsMzYoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZHcgNDgoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA1MCwlcjI1Ci0JbGRvIFInTEMkMDA1MCglcjI1KSwlcjI1Ci0JbGR3IDIwKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0Jc3R3ICVyMCw4KCVyNCkKLUwkMDIxNzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDIoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWxkdyA4KCVyNCksJXIyMAotCWNvbWNsciw8ICVyMjAsJXIxOSwlcjAKLQlibCBMJDAyMTgsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDMwLDMxLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAyMCglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCXN0dyAlcjIwLDE2KCVyNCkKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDIoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZHcgNDgoJXIyMSksJXIyMAotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwzMCwzMSwlcjIxCi0JYWRkICVyMjEsJXIyMiwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjEKLQlsZHcgMjAoJXIyMCksJXIyMgotCWFkZCAlcjIxLCVyMjIsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjEsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlsZHcgNDgoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMwotCXpkZXAgJXIyMywzMCwzMSwlcjIyCi0JYWRkICVyMjIsJXIyMywlcjIyCi0JemRlcCAlcjIyLDI5LDMwLCVyMjIKLQlsZHcgMjAoJXIyMSksJXIyMwotCWFkZCAlcjIyLCVyMjMsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNTIoJXIzMCkKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQ4KCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjMKLQl6ZGVwICVyMjMsMzAsMzEsJXIyMgotCWFkZCAlcjIyLCVyMjMsJXIyMgotCXpkZXAgJXIyMiwyOSwzMCwlcjIyCi0JbGR3IDIwKCVyMjEpLCVyMjMKLQlhZGQgJXIyMiwlcjIzLCVyMjEKLQlsZHcgNCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTU2KCVyMzApCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1MSwlcjI1Ci0JbGRvIFInTEMkMDA1MSglcjI1KSwlcjI1Ci0JbGR3IDgoJXI0KSwlcjI0Ci0JbGR3IDAoJXIyMCksJXIyMwotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlzdHcgJXIwLDEyKCVyNCkKLUwkMDIyMDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDMwLDMxLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAyMCglcjE5KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMAotCWxkdyA0KCVyMTkpLCVyMTkKLQljb21jbHIsPCAlcjIwLCVyMTksJXIwCi0JYmwgTCQwMjIxLCVyMAotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gNCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JbGR3IDEyKCVyNCksJXIyMgotCXpkZXAgJXIyMiwyOSwzMCwlcjIxCi0JYWRkICVyMjEsJXIyMiwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjEKLQlsZHcgMTYoJXI0KSwlcjIyCi0JYWRkICVyMjEsJXIyMiwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCXN0dyAlcjIyLC01MiglcjMwKQotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNTIsJXIyNQotCWxkbyBSJ0xDJDAwNTIoJXIyNSksJXIyNQotCWxkdyAxMiglcjQpLCVyMjQKLQlsZHcgMCglcjIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1MywlcjI1Ci0JbGRvIFInTEMkMDA1MyglcjI1KSwlcjI1Ci0JbGR3IDQoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZHcgMTIoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMTkKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQl6ZGVwICVyMTksMjksMzAsJXIxOQotCWxkdyAxNiglcjQpLCVyMjAKLQlhZGQgJXIxOSwlcjIwLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDEwKCVyMjEpLCVyMjAKLQlsZHcgNCglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjIKLQlhZGQgJXIyMCwlcjIyLCVyMjEKLQlsZHcgNCglcjIxKSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1NCwlcjI1Ci0JbGRvIFInTEMkMDA1NCglcjI1KSwlcjI1Ci0JbGR3IDQ4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGR3IDEyKCVyNCksJXIyMAotCXpkZXAgJXIyMCwyOSwzMCwlcjE5Ci0JYWRkICVyMTksJXIyMCwlcjE5Ci0JemRlcCAlcjE5LDI5LDMwLCVyMTkKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMTksJXIyMSwlcjIwCi0JbGR3IDQoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyA0OCglcjE5KSwlcjI2Ci0JbGR3IDAoJXIyMCksJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcHJpbnRfYXJnX3R5cGVzLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkdyAwKCVyMTkpLCVyMjAKLQlsZG8gOCglcjIwKSwlcjE5Ci0JbGR3IDEyKCVyNCksJXIyMQotCXpkZXAgJXIyMSwyOSwzMCwlcjIwCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JemRlcCAlcjIwLDI5LDMwLCVyMjAKLQlsZHcgMTYoJXI0KSwlcjIxCi0JYWRkICVyMjAsJXIyMSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1NSwlcjI1Ci0JbGRvIFInTEMkMDA1NSglcjI1KSwlcjI1Ci0JbGR3IDEyKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCWV4dHJ1ICVyMjEsMCsxLTEsMSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1NiwlcjI1Ci0JbGRvIFInTEMkMDA1NiglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCWV4dHJ1ICVyMjEsMSsxLTEsMSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1NywlcjI1Ci0JbGRvIFInTEMkMDA1NyglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCWV4dHJ1ICVyMjEsMisxLTEsMSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1OCwlcjI1Ci0JbGRvIFInTEMkMDA1OCglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCWV4dHJ1ICVyMjEsMysxLTEsMSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA1OSwlcjI1Ci0JbGRvIFInTEMkMDA1OSglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCWV4dHJ1ICVyMjEsNCsxLTEsMSwlcjIwCi0JY29weSAlcjE5LCVyMjYKLQlsZGlsIEwnTEMkMDA2MCwlcjI1Ci0JbGRvIFInTEMkMDA2MCglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkbyA4KCVyMjApLCVyMTkKLQlsZHcgMTIoJXI0KSwlcjIxCi0JemRlcCAlcjIxLDI5LDMwLCVyMjAKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQl6ZGVwICVyMjAsMjksMzAsJXIyMAotCWxkdyAxNiglcjQpLCVyMjEKLQlhZGQgJXIyMCwlcjIxLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIyMQotCWV4dHJ1ICVyMjEsOCsyNC0xLDI0LCVyMjIKLQlsZG8gLTIoJXIyMiksJXIyMAotCWNvcHkgJXIxOSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjEsJXIyNQotCWxkbyBSJ0xDJDAwNjEoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjIyOiAKLQlsZHcgMTIoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDEyKCVyNCkKLQlibCxuIEwkMDIyMCwlcjAKLUwkMDIyMTogCi1MJDAyMTk6IAotCWxkdyA4KCVyNCksJXIxOQotCWxkbyAxKCVyMTkpLCVyMjAKLQlzdHcgJXIyMCw4KCVyNCkKLQlibCxuIEwkMDIxNywlcjAKLUwkMDIxODogCi1MJDAyMTY6IAotCWxkdyAyNCglcjQpLCVyOAotCWxkdyAyOCglcjQpLCVyNwotCWxkdyAzMiglcjQpLCVyNgotCWxkdyAzNiglcjQpLCVyNQotCWxkbyA4KCVyNCksJXIzMAotCWxkdyAtMjgoJXIzMCksJXIyCi0JYnYgJXIwKCVyMikKLQlsZHdtIC04KCVyMzApLCVyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotTEMkMDA2MjogCi0JLlNUUklORyAibl9iYXNlY2xhc3NlcyAlZFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDYzOiAKLQkuU1RSSU5HICJuZm5fZmllbGRzICVkXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjQ6IAotCS5TVFJJTkcgIm5mbl9maWVsZHNfdG90YWwgJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2NTogCi0JLlNUUklORyAidmlydHVhbF9maWVsZF9iaXRzICglZCBiaXRzIGF0ICoweCV4KVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNjY6IAotCS5TVFJJTkcgIlx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDY3OiAKLQkuU1RSSU5HICJwcml2YXRlX2ZpZWxkX2JpdHMgKCVkIGJpdHMgYXQgKjB4JXgpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA2ODogCi0JLlNUUklORyAicHJvdGVjdGVkX2ZpZWxkX2JpdHMgKCVkIGJpdHMgYXQgKjB4JXgpXHgwMCIKLQkuYWxpZ24gNAotcHJpbnRfY3BsdXNfc3R1ZmY6IAotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyNCwlcjEKLQljb3B5ICVyMzAsJXI0Ci0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyOCwxNiglcjQpCi0Jc3R3ICVyNywyMCglcjQpCi0Jc3R3ICVyNiwyNCglcjQpCi0Jc3R3ICVyNSwyOCglcjQpCi0JbGRvIC00KCVyMCksJXI1Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjUsJXI2Ci0Jc3R3ICVyMjYsMCglcjYpCi0JbGRvIC04KCVyMCksJXI3Ci0JbGRvIC0zMiglcjQpLCVyMTkKLQlhZGQgJXIxOSwlcjcsJXI4Ci0Jc3R3ICVyMjUsMCglcjgpCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjIxCi0JbGRoIDAoJXIyMSksJXIyMgotCWV4dHJzICVyMjIsMzEsMTYsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2MiwlcjI1Ci0JbGRvIFInTEMkMDA2MiglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjIxCi0JbGRoIDIoJXIyMSksJXIyMgotCWV4dHJzICVyMjIsMzEsMTYsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2MywlcjI1Ci0JbGRvIFInTEMkMDA2MyglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIyMCksJXIyMQotCWxkdyA0OCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY0LCVyMjUKLQlsZG8gUidMQyQwMDY0KCVyMjUpLCVyMjUKLQlsZHcgNCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgNDgoJXIxOSksJXIyMAotCWxkaCAwKCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMTkKLQljb21pY2xyLDwgMCwlcjE5LCVyMAotCWJsIEwkMDIyNCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDQ4KCVyMjApLCVyMjEKLQlsZGggMCglcjIxKSwlcjIyCi0JZXh0cnMgJXIyMiwzMSwxNiwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0OCglcjIyKSwlcjIxCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDY1LCVyMjUKLQlsZG8gUidMQyQwMDY1KCVyMjUpLCVyMjUKLQljb3B5ICVyMjAsJXIyNAotCWxkdyA4KCVyMjEpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjIxCi0JbGRoIDAoJXIyMSksJXIyMgotCWV4dHJzICVyMjIsMzEsMTYsJXIyMAotCWxkdyA4KCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcHJpbnRfYml0X3ZlY3RvciwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDA2NiwlcjI2Ci0JbGRvIFInTEMkMDA2NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjI0OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGRoIDM0KCVyMTkpLCVyMjAKLQlleHRycyAlcjIwLDMxLDE2LCVyMTkKLQljb21pY2xyLDwgMCwlcjE5LCVyMAotCWJsIEwkMDIyNSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZHcgMTIoJXIyMCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDIyNiwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDM0KCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQ4KCVyMjIpLCVyMjEKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjcsJXIyNQotCWxkbyBSJ0xDJDAwNjcoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JbGR3IDEyKCVyMjEpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGR3IDEyKCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcHJpbnRfYml0X3ZlY3RvciwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDA2NiwlcjI2Ci0JbGRvIFInTEMkMDA2NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjI2OiAKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQlsZHcgMTYoJXIyMCksJXIxOQotCWNvbWljbHIsPD4gMCwlcjE5LCVyMAotCWJsIEwkMDIyNywlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRoIDM0KCVyMjApLCVyMjEKLQlleHRycyAlcjIxLDMxLDE2LCVyMjAKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIxLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIyCi0JbGR3IDQ4KCVyMjIpLCVyMjEKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwNjgsJXIyNQotCWxkbyBSJ0xDJDAwNjgoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JbGR3IDE2KCVyMjEpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyA0OCglcjIwKSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkaCAzNCglcjIwKSwlcjIxCi0JZXh0cnMgJXIyMSwzMSwxNiwlcjIwCi0JbGR3IDE2KCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcHJpbnRfYml0X3ZlY3RvciwlcjIKLQlub3AKLQlsZGlsIEwnTEMkMDA2NiwlcjI2Ci0JbGRvIFInTEMkMDA2NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjI3OiAKLUwkMDIyNTogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyA0OCglcjE5KSwlcjIwCi0JbGRoIDIoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIxOQotCWNvbWljbHIsPCAwLCVyMTksJXIwCi0JYmwgTCQwMjI4LCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZHcgMCglcjIwKSwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBkdW1wX2ZuX2ZpZWxkbGlzdHMsJXIyCi0Jbm9wCi1MJDAyMjg6IAotTCQwMjIzOiAKLQlsZHcgMTYoJXI0KSwlcjgKLQlsZHcgMjAoJXI0KSwlcjcKLQlsZHcgMjQoJXI0KSwlcjYKLQlsZHcgMjgoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLmFsaWduIDQKLUxDJDAwNjk6IAotCS5TVFJJTkcgInR5cGUgbm9kZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzA6IAotCS5TVFJJTkcgIm5hbWUgJyVzJyAoMHgleClceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3MTogCi0JLlNUUklORyAiPE5VTEw+XHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3MjogCi0JLlNUUklORyAiY29kZSAweCV4IFx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzM6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfVU5ERUYpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NDogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9QVFIpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA3NTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9BUlJBWSlceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc2OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1NUUlVDVClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc3OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1VOSU9OKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwNzg6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfRU5VTSlceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDc5OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0ZVTkMpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4MDogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9JTlQpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4MTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9GTFQpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4MjogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9WT0lEKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODM6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfU0VUKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwODQ6IAotCS5TVFJJTkcgIihUWVBFX0NPREVfUkFOR0UpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4NTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9QQVNDQUxfQVJSQVkpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA4NjogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9FUlJPUilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg3OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX01FTUJFUilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg4OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX01FVEhPRClceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDg5OiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX1JFRilceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDkwOiAKLQkuU1RSSU5HICIoVFlQRV9DT0RFX0NIQVIpXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5MTogCi0JLlNUUklORyAiKFRZUEVfQ09ERV9CT09MKVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTI6IAotCS5TVFJJTkcgIihVTktOT1dOIFRZUEUgQ09ERSlceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDkzOiAKLQkuU1RSSU5HICJsZW5ndGggJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5NDogCi0JLlNUUklORyAib2JqZmlsZSAweCV4XHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAwOTU6IAotCS5TVFJJTkcgInRhcmdldF90eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5NjogCi0JLlNUUklORyAicG9pbnRlcl90eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5NzogCi0JLlNUUklORyAicmVmZXJlbmNlX3R5cGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMDk4OiAKLQkuU1RSSU5HICJmdW5jdGlvbl90eXBlIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDA5OTogCi0JLlNUUklORyAiZmxhZ3MgMHgleFx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDA6IAotCS5TVFJJTkcgIiBUWVBFX0ZMQUdfVU5TSUdORURceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTAxOiAKLQkuU1RSSU5HICIgVFlQRV9GTEFHX1NJR05FRFx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDI6IAotCS5TVFJJTkcgIiBUWVBFX0ZMQUdfU1RVQlx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDM6IAotCS5TVFJJTkcgIm5maWVsZHMgJWQgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA0OiAKLQkuU1RSSU5HICJbJWRdIGJpdHBvcyAlZCBiaXRzaXplICVkIHR5cGUgMHgleCBuYW1lICclcycgKDB4JXgpXHgwYVx4MDAiCi0JLmFsaWduIDQKLUxDJDAxMDU6IAotCS5TVFJJTkcgInZwdHJfYmFzZXR5cGUgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA2OiAKLQkuU1RSSU5HICJ2cHRyX2ZpZWxkbm8gJWRceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwNzogCi0JLlNUUklORyAiYXJnX3R5cGVzIDB4JXhceDBhXHgwMCIKLQkuYWxpZ24gNAotTEMkMDEwODogCi0JLlNUUklORyAiY3BsdXNfc3R1ZmYgMHgleFx4MGFceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTA5OiAKLQkuU1RSSU5HICJ0eXBlX3NwZWNpZmljIDB4JXhceDAwIgotCS5hbGlnbiA0Ci1MQyQwMTEwOiAKLQkuU1RSSU5HICIgKHVua25vd24gZGF0YSBmb3JtKVx4MDAiCi0JLmFsaWduIDQKLQkuRVhQT1JUIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsQ09ERQotCS5FWFBPUlQgcmVjdXJzaXZlX2R1bXBfdHlwZSxFTlRSWSxQUklWX0xFVj0zLEFSR1cwPUdSLEFSR1cxPUdSCi1yZWN1cnNpdmVfZHVtcF90eXBlOiAKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjgsMTYoJXI0KQotCXN0dyAlcjcsMjAoJXI0KQotCXN0dyAlcjYsMjQoJXI0KQotCXN0dyAlcjUsMjgoJXI0KQotCWxkbyAtNCglcjApLCVyNQotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI1LCVyNgotCXN0dyAlcjI2LDAoJXI2KQotCWxkbyAtOCglcjApLCVyNwotCWxkbyAtMzIoJXI0KSwlcjE5Ci0JYWRkICVyMTksJXI3LCVyOAotCXN0dyAlcjI1LDAoJXI4KQotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA2OSwlcjI1Ci0JbGRvIFInTEMkMDA2OSglcjI1KSwlcjI1Ci0JbGR3IDAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMSwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMgotCWxkdyA0KCVyMjIpLCVyMjEKLQlsZG8gLTQoJXIwKSwlcjIyCi0JbGRvIC0zMiglcjQpLCVyMjQKLQlhZGQgJXIyNCwlcjIyLCVyMjMKLQlsZHcgMCglcjIzKSwlcjIyCi0JbGR3IDQoJXIyMiksJXIyMwotCWNvbWljbHIsPSAwLCVyMjMsJXIwCi0JYmwgTCQwMjMwLCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMDcxLCVyMjEKLQlsZG8gUidMQyQwMDcxKCVyMjEpLCVyMjEKLUwkMDIzMDogCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMDcwLCVyMjUKLQlsZG8gUidMQyQwMDcwKCVyMjUpLCVyMjUKLQlsZHcgNCglcjIwKSwlcjI0Ci0JY29weSAlcjIxLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA3MiwlcjI1Ci0JbGRvIFInTEMkMDA3MiglcjI1KSwlcjI1Ci0JbGR3IDAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWFkZGksdXYgLTE5LCVyMjAsJXIwCi0JYmxyLG4gJXIyMCwlcjAKLQliLG4gTCQwMjUxCi1MJDAyNTI6IAotCWIgTCQwMjMyCi0Jbm9wCi0JYiBMJDAyMzMKLQlub3AKLQliIEwkMDIzNAotCW5vcAotCWIgTCQwMjM1Ci0Jbm9wCi0JYiBMJDAyMzYKLQlub3AKLQliIEwkMDIzNwotCW5vcAotCWIgTCQwMjM4Ci0Jbm9wCi0JYiBMJDAyMzkKLQlub3AKLQliIEwkMDI0MAotCW5vcAotCWIgTCQwMjQxCi0Jbm9wCi0JYiBMJDAyNDIKLQlub3AKLQliIEwkMDI0MwotCW5vcAotCWIgTCQwMjQ0Ci0Jbm9wCi0JYiBMJDAyNDUKLQlub3AKLQliIEwkMDI0NgotCW5vcAotCWIgTCQwMjQ3Ci0Jbm9wCi0JYiBMJDAyNDgKLQlub3AKLQliIEwkMDI0OQotCW5vcAotCWIgTCQwMjUwCi0Jbm9wCi1MJDAyMzI6IAotCWxkaWwgTCdMQyQwMDczLCVyMjYKLQlsZG8gUidMQyQwMDczKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzMzogCi0JbGRpbCBMJ0xDJDAwNzQsJXIyNgotCWxkbyBSJ0xDJDAwNzQoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM0OiAKLQlsZGlsIEwnTEMkMDA3NSwlcjI2Ci0JbGRvIFInTEMkMDA3NSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzU6IAotCWxkaWwgTCdMQyQwMDc2LCVyMjYKLQlsZG8gUidMQyQwMDc2KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzNjogCi0JbGRpbCBMJ0xDJDAwNzcsJXIyNgotCWxkbyBSJ0xDJDAwNzcoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjM3OiAKLQlsZGlsIEwnTEMkMDA3OCwlcjI2Ci0JbGRvIFInTEMkMDA3OCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyMzg6IAotCWxkaWwgTCdMQyQwMDc5LCVyMjYKLQlsZG8gUidMQyQwMDc5KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDIzOTogCi0JbGRpbCBMJ0xDJDAwODAsJXIyNgotCWxkbyBSJ0xDJDAwODAoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQwOiAKLQlsZGlsIEwnTEMkMDA4MSwlcjI2Ci0JbGRvIFInTEMkMDA4MSglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDE6IAotCWxkaWwgTCdMQyQwMDgyLCVyMjYKLQlsZG8gUidMQyQwMDgyKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0MjogCi0JbGRpbCBMJ0xDJDAwODMsJXIyNgotCWxkbyBSJ0xDJDAwODMoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQzOiAKLQlsZGlsIEwnTEMkMDA4NCwlcjI2Ci0JbGRvIFInTEMkMDA4NCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDQ6IAotCWxkaWwgTCdMQyQwMDg1LCVyMjYKLQlsZG8gUidMQyQwMDg1KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0NTogCi0JbGRpbCBMJ0xDJDAwODYsJXIyNgotCWxkbyBSJ0xDJDAwODYoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ2OiAKLQlsZGlsIEwnTEMkMDA4NywlcjI2Ci0JbGRvIFInTEMkMDA4NyglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNDc6IAotCWxkaWwgTCdMQyQwMDg4LCVyMjYKLQlsZG8gUidMQyQwMDg4KCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI0ODogCi0JbGRpbCBMJ0xDJDAwODksJXIyNgotCWxkbyBSJ0xDJDAwODkoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjQ5OiAKLQlsZGlsIEwnTEMkMDA5MCwlcjI2Ci0JbGRvIFInTEMkMDA5MCglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyMzEsJXIwCi1MJDAyNTA6IAotCWxkaWwgTCdMQyQwMDkxLCVyMjYKLQlsZG8gUidMQyQwMDkxKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHByaW50Zl9maWx0ZXJlZCwlcjIKLQlub3AKLQlibCxuIEwkMDIzMSwlcjAKLUwkMDI1MTogCi0JbGRpbCBMJ0xDJDAwOTIsJXIyNgotCWxkbyBSJ0xDJDAwOTIoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotCWJsLG4gTCQwMjMxLCVyMAotTCQwMjMxOiAKLQlsZGlsIEwnTEMkMDA2NiwlcjI2Ci0JbGRvIFInTEMkMDA2NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTMsJXIyNQotCWxkbyBSJ0xDJDAwOTMoJXIyNSksJXIyNQotCWxkdyA4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA5NCwlcjI1Ci0JbGRvIFInTEMkMDA5NCglcjI1KSwlcjI1Ci0JbGR3IDEyKCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA5NSwlcjI1Ci0JbGRvIFInTEMkMDA5NSglcjI1KSwlcjI1Ci0JbGR3IDE2KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkdyAxNiglcjE5KSwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjUzLCVyMAotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgMCglcjIwKSwlcjIxCi0JbGRvIDIoJXIyMSksJXIyMAotCWxkdyAxNiglcjE5KSwlcjI2Ci0JY29weSAlcjIwLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlY3Vyc2l2ZV9kdW1wX3R5cGUsJXIyCi0Jbm9wCi1MJDAyNTM6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTYsJXIyNQotCWxkbyBSJ0xDJDAwOTYoJXIyNSksJXIyNQotCWxkdyAyMCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTcsJXIyNQotCWxkbyBSJ0xDJDAwOTcoJXIyNSksJXIyNQotCWxkdyAyNCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAwOTgsJXIyNQotCWxkbyBSJ0xDJDAwOTgoJXIyNSksJXIyNQotCWxkdyAyOCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzIoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDA5OSwlcjI1Ci0JbGRvIFInTEMkMDA5OSglcjI1KSwlcjI1Ci0JY29weSAlcjIwLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzMiglcjE5KSwlcjIwCi0JZXh0cnUgJXIyMCwzMSwxLCVyMTkKLQlleHRycyAlcjE5LDMxLDE2LCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNTQsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAxMDAsJXIyNgotCWxkbyBSJ0xDJDAxMDAoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHV0c19maWx0ZXJlZCwlcjIKLQlub3AKLUwkMDI1NDogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzMiglcjE5KSwlcjIwCi0JbGRvIDIoJXIwKSwlcjIxCi0JYW5kICVyMjAsJXIyMSwlcjE5Ci0JZXh0cnMgJXIxOSwzMSwxNiwlcjIwCi0JY29taWNsciw8PiAwLCVyMjAsJXIwCi0JYmwgTCQwMjU1LCVyMAotCW5vcAotCWxkaWwgTCdMQyQwMTAxLCVyMjYKLQlsZG8gUidMQyQwMTAxKCVyMjYpLCVyMjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIHB1dHNfZmlsdGVyZWQsJXIyCi0Jbm9wCi1MJDAyNTU6IAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZGggMzIoJXIxOSksJXIyMAotCWxkbyA0KCVyMCksJXIyMQotCWFuZCAlcjIwLCVyMjEsJXIxOQotCWV4dHJzICVyMTksMzEsMTYsJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI1NiwlcjAKLQlub3AKLQlsZGlsIEwnTEMkMDEwMiwlcjI2Ci0JbGRvIFInTEMkMDEwMiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjU2OiAKLQlsZGlsIEwnTEMkMDA2NiwlcjI2Ci0JbGRvIFInTEMkMDA2NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwdXRzX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZGggMzQoJXIyMCksJXIyMQotCWV4dHJzICVyMjEsMzEsMTYsJXIyMAotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDMsJXIyNQotCWxkbyBSJ0xDJDAxMDMoJXIyNSksJXIyNQotCWNvcHkgJXIyMCwlcjI0Ci0JbGR3IDM2KCVyMjEpLCVyMjMKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0Jc3R3ICVyMCw4KCVyNCkKLUwkMDI1NzogCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkaCAzNCglcjE5KSwlcjIwCi0JZXh0cnMgJXIyMCwzMSwxNiwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JY29tY2xyLDwgJXIyMCwlcjE5LCVyMAotCWJsIEwkMDI1OCwlcjAKLQlub3AKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZHcgMCglcjE5KSwlcjIwCi0JbGRvIDIoJXIyMCksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgOCglcjQpLCVyMjEKLQl6ZGVwICVyMjEsMjcsMjgsJXIyMgotCWxkdyAzNiglcjIwKSwlcjIxCi0JYWRkICVyMjIsJXIyMSwlcjIwCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwyNywyOCwlcjIzCi0JbGR3IDM2KCVyMjEpLCVyMjIKLQlhZGQgJXIyMywlcjIyLCVyMjEKLQlsZHcgNCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTUyKCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwyNywyOCwlcjIzCi0JbGR3IDM2KCVyMjEpLCVyMjIKLQlhZGQgJXIyMywlcjIyLCVyMjEKLQlsZHcgOCglcjIxKSwlcjIyCi0Jc3R3ICVyMjIsLTU2KCVyMzApCi0JbGRvIC00KCVyMCksJXIyMQotCWxkbyAtMzIoJXI0KSwlcjIzCi0JYWRkICVyMjMsJXIyMSwlcjIyCi0JbGR3IDAoJXIyMiksJXIyMQotCWxkdyA4KCVyNCksJXIyMgotCXpkZXAgJXIyMiwyNywyOCwlcjIzCi0JbGR3IDM2KCVyMjEpLCVyMjIKLQlhZGQgJXIyMywlcjIyLCVyMjEKLQlsZHcgMTIoJXIyMSksJXIyMgotCXN0dyAlcjIyLC02MCglcjMwKQotCWxkbyAtNCglcjApLCVyMjEKLQlsZG8gLTMyKCVyNCksJXIyMwotCWFkZCAlcjIzLCVyMjEsJXIyMgotCWxkdyAwKCVyMjIpLCVyMjEKLQlsZHcgOCglcjQpLCVyMjIKLQl6ZGVwICVyMjIsMjcsMjgsJXIyMwotCWxkdyAzNiglcjIxKSwlcjIyCi0JYWRkICVyMjMsJXIyMiwlcjIxCi0JbGR3IDEyKCVyMjEpLCVyMjIKLQlzdHcgJXIyMiwtNjQoJXIzMCkKLQlsZG8gLTQoJXIwKSwlcjIxCi0JbGRvIC0zMiglcjQpLCVyMjMKLQlhZGQgJXIyMywlcjIxLCVyMjIKLQlsZHcgMCglcjIyKSwlcjIxCi0JbGR3IDgoJXI0KSwlcjIyCi0JemRlcCAlcjIyLDI3LDI4LCVyMjMKLQlsZHcgMzYoJXIyMSksJXIyMgotCWFkZCAlcjIzLCVyMjIsJXIyMQotCWxkdyAxMiglcjIxKSwlcjIyCi0JY29taWNsciw9IDAsJXIyMiwlcjAKLQlibCBMJDAyNjAsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwNzEsJXIyMQotCWxkbyBSJ0xDJDAwNzEoJXIyMSksJXIyMQotCXN0dyAlcjIxLC02NCglcjMwKQotTCQwMjYwOiAKLQljb3B5ICVyMTksJXIyNgotCWxkaWwgTCdMQyQwMTA0LCVyMjUKLQlsZG8gUidMQyQwMTA0KCVyMjUpLCVyMjUKLQlsZHcgOCglcjQpLCVyMjQKLQlsZHcgMCglcjIwKSwlcjIzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZHcgOCglcjQpLCVyMjAKLQl6ZGVwICVyMjAsMjcsMjgsJXIyMQotCWxkdyAzNiglcjE5KSwlcjIwCi0JYWRkICVyMjEsJXIyMCwlcjE5Ci0JbGR3IDgoJXIxOSksJXIyMAotCWNvbWljbHIsPD4gMCwlcjIwLCVyMAotCWJsIEwkMDI2MSwlcjAKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDgoJXI0KSwlcjIwCi0JemRlcCAlcjIwLDI3LDI4LCVyMjEKLQlsZHcgMzYoJXIxOSksJXIyMAotCWFkZCAlcjIxLCVyMjAsJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gNCglcjIxKSwlcjIwCi0JbGR3IDgoJXIxOSksJXIyNgotCWNvcHkgJXIyMCwlcjI1Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWN1cnNpdmVfZHVtcF90eXBlLCVyMgotCW5vcAotTCQwMjYxOiAKLUwkMDI1OTogCi0JbGR3IDgoJXI0KSwlcjE5Ci0JbGRvIDEoJXIxOSksJXIyMAotCXN0dyAlcjIwLDgoJXI0KQotCWJsLG4gTCQwMjU3LCVyMAotTCQwMjU4OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTA1LCVyMjUKLQlsZG8gUidMQyQwMTA1KCVyMjUpLCVyMjUKLQlsZHcgNDAoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQwKCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNjIsJXIwCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIxOSwlcjIwCi0JbGR3IDAoJXIyMCksJXIxOQotCWxkbyAtOCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMjAsJXIyMAotCWxkdyAwKCVyMjApLCVyMjEKLQlsZG8gMiglcjIxKSwlcjIwCi0JbGR3IDQwKCVyMTkpLCVyMjYKLQljb3B5ICVyMjAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVjdXJzaXZlX2R1bXBfdHlwZSwlcjIKLQlub3AKLUwkMDI2MjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwNiwlcjI1Ci0JbGRvIFInTEMkMDEwNiglcjI1KSwlcjI1Ci0JbGR3IDQ0KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGR3IDAoJXIxOSksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQljb21pY2xyLDw+IDYsJXIxOSwlcjAKLQlibCBMJDAyNjUsJXIwCi0Jbm9wCi0JY29taWNsciw+PSA2LCVyMTksJXIwCi0JYmwgTCQwMjcwLCVyMAotCW5vcAotCWNvbWljbHIsPD4gMywlcjE5LCVyMAotCWJsIEwkMDI2NiwlcjAKLQlub3AKLQlibCxuIEwkMDI2NywlcjAKLUwkMDI3MDogCi0JY29taWNsciw8PiAxNSwlcjE5LCVyMAotCWJsIEwkMDI2NCwlcjAKLQlub3AKLQlibCxuIEwkMDI2NywlcjAKLUwkMDI2NDogCi1MJDAyNjU6IAotCWxkbyAtOCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMAotCWFkZCAlcjIwLCVyMTksJXIxOQotCWxkbyAtNCglcjApLCVyMjAKLQlsZG8gLTMyKCVyNCksJXIyMgotCWFkZCAlcjIyLCVyMjAsJXIyMQotCWxkdyAwKCVyMjEpLCVyMjAKLQlsZHcgMCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0xDJDAxMDcsJXIyNQotCWxkbyBSJ0xDJDAxMDcoJXIyNSksJXIyNQotCWxkdyA0OCglcjIwKSwlcjI0Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBwcmludGZpX2ZpbHRlcmVkLCVyMgotCW5vcAotCWxkbyAtNCglcjApLCVyMTkKLQlsZG8gLTMyKCVyNCksJXIyMQotCWFkZCAlcjIxLCVyMTksJXIyMAotCWxkdyAwKCVyMjApLCVyMTkKLQlsZG8gLTgoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjIwLCVyMjAKLQlsZHcgNDgoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2FyZ190eXBlcywlcjIKLQlub3AKLQlibCxuIEwkMDI2MywlcjAKLUwkMDI2NjogCi0JbGRvIC04KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC00KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIyCi0JYWRkICVyMjIsJXIyMCwlcjIxCi0JbGR3IDAoJXIyMSksJXIyMAotCWxkdyAwKCVyMTkpLCVyMjYKLQlsZGlsIEwnTEMkMDEwOCwlcjI1Ci0JbGRvIFInTEMkMDEwOCglcjI1KSwlcjI1Ci0JbGR3IDQ4KCVyMjApLCVyMjQKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHByaW50ZmlfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JbGRvIC00KCVyMCksJXIxOQotCWxkbyAtMzIoJXI0KSwlcjIwCi0JYWRkICVyMjAsJXIxOSwlcjE5Ci0JbGRvIC04KCVyMCksJXIyMAotCWxkbyAtMzIoJXI0KSwlcjIxCi0JYWRkICVyMjEsJXIyMCwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkdyAwKCVyMjApLCVyMjUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHByaW50X2NwbHVzX3N0dWZmLCVyMgotCW5vcAotCWJsLG4gTCQwMjYzLCVyMAotTCQwMjY3OiAKLQlsZG8gLTgoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjAKLQlhZGQgJXIyMCwlcjE5LCVyMTkKLQlsZG8gLTQoJXIwKSwlcjIwCi0JbGRvIC0zMiglcjQpLCVyMjIKLQlhZGQgJXIyMiwlcjIwLCVyMjEKLQlsZHcgMCglcjIxKSwlcjIwCi0JbGR3IDAoJXIxOSksJXIyNgotCWxkaWwgTCdMQyQwMTA5LCVyMjUKLQlsZG8gUidMQyQwMTA5KCVyMjUpLCVyMjUKLQlsZHcgNDgoJXIyMCksJXIyNAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgcHJpbnRmaV9maWx0ZXJlZCwlcjIKLQlub3AKLQlsZG8gLTQoJXIwKSwlcjE5Ci0JbGRvIC0zMiglcjQpLCVyMjEKLQlhZGQgJXIyMSwlcjE5LCVyMjAKLQlsZHcgMCglcjIwKSwlcjE5Ci0JbGR3IDQ4KCVyMTkpLCVyMjAKLQljb21pY2xyLDw+IDAsJXIyMCwlcjAKLQlibCBMJDAyNjgsJXIwCi0Jbm9wCi0JbGRpbCBMJ0xDJDAxMTAsJXIyNgotCWxkbyBSJ0xDJDAxMTAoJXIyNiksJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmX2ZpbHRlcmVkLCVyMgotCW5vcAotTCQwMjY4OiAKLQlsZGlsIEwnTEMkMDA2NiwlcjI2Ci0JbGRvIFInTEMkMDA2NiglcjI2KSwlcjI2Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBwcmludGZfZmlsdGVyZWQsJXIyCi0Jbm9wCi0JYmwsbiBMJDAyNjMsJXIwCi1MJDAyNjM6IAotTCQwMjI5OiAKLQlsZHcgMTYoJXI0KSwlcjgKLQlsZHcgMjAoJXI0KSwlcjcKLQlsZHcgMjQoJXI0KSwlcjYKLQlsZHcgMjgoJXI0KSwlcjUKLQlsZG8gOCglcjQpLCVyMzAKLQlsZHcgLTI4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGR3bSAtOCglcjMwKSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJEJTUyQKLQotY3BsdXNfc3RydWN0X2RlZmF1bHQ6IC5jb21tIDI0Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZ2xvYmFsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2dsb2JhbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBjNGE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvZ2xvYmFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCS5JTVBPUlQgZm9vLGRhdGEKLQotCS5hbGlnbiA0Ci07IE9mZmljaWFsIGdhcyBjb2RlIHdpbGwgbm90IGFjY2VwdCBzeW0tJGdsb2JhbCQuCi0JYWRkaWwgTCVmb28tJGdsb2JhbCQsJXIyNwotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xhYmVsYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xhYmVsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzZhNzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sYWJlbGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UJJFRFWFQkLCBTT1JUPTgKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgQSBjb21tZW50LiAgVGhpcyBzaG91bGQgbm90IGJlIGludGVycHJldGVkIGFzIGEgbGFiZWwsIGJ1dCBib3RoIG9mIHRoZQotOyBmb2xsb3dpbmcgc3RhdGVtZW50cyBzaG91bGQuCi1sYWJlbF93aXRob3V0X2NvbG9uCi1sYWJlbF93aXRoX2NvbG9uOgotCi07IEEgcHJvYmxlbSB0ZWdlIGZvdW5kLi4uCi07IElucHV0IHNjcnViYmluZyBpbiBnYXMgbWFrZXMgbGlmZSBhIHJlYWwgbmlnaHRtYXJlIGZvciBhc3NlbWJsZXJzCi07IGluIHdoaWNoIHRoZSAqcG9zaXRpb24qIHdpdGhpbiBhIGxpbmUgZGV0ZXJtaW5lcyBob3cgdG8gaW50ZXJwcmV0Ci07IGEgc3RyZWFtIGEgY2hhcmFjdGVycy4gIFRoZXNlIHRlc3Qgb25lIHBhcnRpY3VsYXIgY2FzZSB3aGVyZSBnYXMKLTsgaGFkIHRoZSB0ZW5kZW5jeSB0byBkZWxldGUgdGhlIHdoaXRlc3BhY2UgYmV0d2VlbiB0aGUgb3Bjb2RlIGFuZAotOyBvcGVyYW5kcyBpZiBhIGxhYmVsIHdpdGhvdXQgYSBjb2xvbiBiZWdhbiBhIGxpbmUsIGFuZCB0aGUgb3BlcmFuZHMKLTsgc3RhcnRlZCB3aXRoIGEgbm9uLW51bWVyaWMgY2hhcmFjdGVyLgotTCQxCWFkZCAlcjIsJXIyLCVyMgotTCQyOglhZGQgJXIyLCVyMiwlcjIKLUwkMwotCWFkZCAlcjIsJXIyLCVyMgotCi1MJDQJYWRkICVyMiwlcjIsJXIyCi1MJDU6CWFkZCAlcjIsJXIyLCVyMgotTCQ2Ci0JYWRkICVyMiwlcjIsJXIyCi0KLTsgQW4gaW5zdHJ1Y3Rpb24gb3IgcHNldWRvLW9wIG1heSBiZWdpbiBhbnl3aGVyZSBhZnRlciBjb2x1bW4gMC4KLSBiLG4gbGFiZWxfd2l0aG91dF9jb2xvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9saW5lc2VwYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xpbmVzZXBidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxOWMxNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL2xpbmVzZXBidWcucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotOyBCYXNpYyBpbW1lZGlhdGUgaW5zdHJ1Y3Rpb24gdGVzdHMuICAKLTsKLTsgV2UgY291bGQvc2hvdWxkIHRlc3Qgc29tZSBvZiB0aGUgY29ybmVyIGNhc2VzIGZvciByZWdpc3RlciBhbmQgCi07IGltbWVkaWF0ZSBmaWVsZHMuICBXZSBzaG91bGQgYWxzbyBjaGVjayB0aGUgYXNzb3J0ZWQgZmllbGQKLTsgc2VsZWN0b3JzIHRvIG1ha2Ugc3VyZSB0aGV5J3JlIGhhbmRsZWQgY29ycmVjdGx5LgotCi1mb286Ci0JLldPUkQgMCAhLklNUE9SVCAkYmFyJCxEQVRBCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvbHNlbGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sc2VsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Y2Q5OTcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9sc2VsYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgSW4gZ2FzLTEuMzYgdGhlIGxkaWwgaW5zdHJ1Y3Rpb24gdXNpbmcgcGFyZW50aGVzaXMgZ2VuZXJhdGVkCi07IGdhcmJhZ2UgYml0cyB3aGlsZSB0aGUgb25lIHdpdGhvdXQgcGFyZW5zIHdvcmtlZCBmaW5lLgotCWxkaWwgTCUoMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyKSwlcjIxCi0JbGRvIEwlKDB4MDAwNDAwMDAgfCAweDAwMDAwMDA4IHwgMHgwMDAwMDAwMikgKCVyMjEpLCVyMjEKLQlsZGlsIEwlMHgwMDA0MDAwMCB8IDB4MDAwMDAwMDggfCAweDAwMDAwMDAyLCVyMjEKLQlsZG8gTCUweDAwMDQwMDAwIHwgMHgwMDAwMDAwOCB8IDB4MDAwMDAwMDIgKCVyMjEpLCVyMjEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9ub3N1YnNwYWNlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL25vc3Vic3BhY2UucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkwNDYwMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL25vc3Vic3BhY2UucworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuU1BBQ0UgJFRFWFQkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgbXBuX2FkZF9uCi0JLkVYUE9SVCBtcG5fYWRkX24sUFJJVl9MRVY9MyxBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUixSVE5WQUw9R1IKLW1wbl9hZGRfbjoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0KLQlhZGQJJXIwLCVyMCwlcjAJCTsgcmVzZXQgY3kKLUxvb3A6Ci0JbGR3cyxtYQkgNCgwLCVyMjUpLCVyMjAKLQlsZHdzLG1hCSA0KDAsJXIyNCksJXIxOQotCi0JYWRkYwkgJXIxOSwlcjIwLCVyMTkKLQlhZGRpYiw8PiAtMSwlcjIzLExvb3AKLQlzdHdzLG1hCSAlcjE5LDQoMCwlcjI2KQotCi0JYnYJMCgyKQotCSBhZGRjCSVyMCwlcjAsJXIyOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wYXJzZS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0YzJhNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3BhcnNlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMTk5MywgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAKLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSMgYW5kIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX3N0cmluZ190ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJzdHJpbmdlci5zOiBUZXN0IGVtYmVkZGVkIHF1b3RlcyBhbmQgb2N0YWwgZXNjYXBlcyBpbiBzdHJpbmdzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAic3RyaW5nZXIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAyMzY5NkU2M1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rICAgICAgNkM3NTY0NjVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDZCMkU2NDY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgICAgICA2NjIyMEEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgMDkzMDc4MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAgICAgIDMyMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbHNlbF90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxzZWxidWdzLnM6IGxzZWxidWciCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsc2VsYnVnLnMiICItYWwiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBjb3JyZWN0bHkgaGFuZGxlIGZpZWxkIHNlbGVjdG9ycy4gCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIyQTA0MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAzNkI1MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggMjJBMDQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIDM2QjUwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX3ZhbGlkX2FsaWduX3Rlc3RzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFsaWduMS5zOiB2YWxpZCBhbGlnbm1lbnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhbGlnbjEucyIgIi1hbCIKLQotICAgICMgTWFrZSBzdXJlIHdlIGNvcnJlY3RseSBoYW5kbGUgZmllbGQgc2VsZWN0b3JzLiAKLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDgwMDAyNDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA4MDAwMjQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMTAwMCAwODAwMDI0MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDBcW15cblxdKkJMT0NLXFteXG5cXSoxMDI0XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDQwMFxbXlxuXF0qQkxPQ0tcW15cblxdKjEwMjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODAwXFteXG5cXSpCTE9DS1xbXlxuXF0qNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDA4MDRcW15cblxdKkFMSUdOXFteXG5cXSo4XFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgwOFxbXlxuXF0qQkxPQ0tcW15cblxdKjMwXFteXG5cXSpcbiIKLQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDgyNlxbXlxuXF0qQUxJR05cW15cblxdKjRcW15cblxdKlxuIgotCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwODI4XFteXG5cXSpCTE9DS1xbXlxuXF0qNFxbXlxuXF0qXG4iCi0JCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgICMgR0FTLTIuMCBkb2VzIG5vdCBhbHdheXMgcGFyc2UgISBhcyBhIGxpbmUgc2VwYXJhdG9yIHdoZW4gaXQgc2hvdWxkLgotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0ICJsaW5lc2VwYnVnLnMiICIiICIiICJsaW5lIHNlcGFyYXRvciBidWciCi0KLSAgICAjIE1ha2Ugc3VyZSBHQVMgYWNjZXB0cyBzeW50YXggZm9yIGFjY2Vzc2luZyBzdGF0aWMgZGF0YS4KLSAgICBnYXNfdGVzdCAiZ2xvYmFsLnMiICIiICIiICJjaGVjayBmb3Igc3ltLVwkZ2xvYmFsXCQgYWNjZXB0YW5jZSIKLQotICAgICMgR0FTLTIuMCAoYW5kIDEuMzYgZm9yIHRoYXQgbWF0dGVyKSBjYW4gbm90IGhhbmRsZSBhIC5wcm9jIHdoaWNoCi0gICAgIyBoYXMgbm8gbGFiZWwgYmVmb3JlIGl0LgotICAgIGdhc190ZXN0ICJwcm9jYnVnLnMiICIiICIiICJMYWJlbCBmb2xsb3dpbmcgLnByb2MiCi0KLSAgICAjIE9uZSBpcyByZXF1aXJlZCB0byBleHBsaWNpdGx5IElNUE9SVCBhbnkgbm9uLWxvY2FsIHN5bWJvbCB1c2VkCi0gICAgIyBpbiBhbiBhc3NlbWJseSBmaWxlLiAgTWFrZSBzdXJlIHdlIGdpdmUgYW4gZXJyb3IgaWYgd2UgdXNlCi0gICAgIyBhbiB1bmRlZmluZWQgc3ltYm9sLgotICAgIHNldHVwX3hmYWlsIGhwcGEqLSotKgotICAgIGdhc190ZXN0X2Vycm9yICJ1bmRlZmJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIHdoZW4gdXNpbmcgdW5kZWZpbmVkIHN5bWJvbCIKLQotICAgICMgVGhpcyBmaWxlIGhhcyBjb2RlIGFuZCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBiZWZvcmUgc3dpdGNoaW5nIGludG8gYW55Ci0gICAgIyBzcGFjZS9zdWJzcGFjZSBwYWlyLiAgVGhpcyBzaG91bGQgcmVwb3J0IGFuIGVycm9yIGZvciBTT00gKGl0IGlzIG5vdAotICAgICMgYW4gZXJyb3IgZm9yIEVMRi4gIFRoZSBmaWxlIGFsc28gaGFzIG1pc21hdGNoZWQgZW50cnkvZXhpdCBhbmQKLSAgICAjIHByb2MvcHJvY2VuZCBwYWlycyB3aGljaCBhcmUgZXJyb3JzIGZvciBib3RoIFNPTSBhbmQgRUxGLgotICAgIGdhc190ZXN0X2Vycm9yICJub3N1YnNwYWNlLnMiICIiICJDaGVjayBmb3IgZXJyb3IocykgaW4gaW5wdXQgZmlsZSAiCi0KLSAgICAjIFRoaXMgZmlsZSBzaG91bGQgcmV0dXJuIGVycm9ycyBmb3IgYm90aCB0aGUgRU5UUllfR1IgYW5kIEVOVFJZX0ZSCi0gICAgIyBkaXJlY3RpdmVzICh0aGV5IGFyZSBvdXQtb2YtcmFuZ2UpCi0gICAgZ2FzX3Rlc3RfZXJyb3IgImVudHJ5YnVnLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gZW50cnlfZ3IgYW5kIGVudHJ5X2ZyIgotCi0gICAgIyBNYWtlIHN1cmUgZW1iZWRkZWQgcXVvdGVzIGFuZCBvY3RhbCBlc2NhcGVzIGluIHN0cmluZ3Mgd29yawotICAgIGRvX3N0cmluZ190ZXN0cwotCi0gICAgIyBNYWtlIHN1cmUgd2UgZG8gbm90IGRpZSBvbiBhIC52ZXJzaW9uIGRpcmVjdGl2ZQotICAgIGdhc190ZXN0ICJ2ZXJzaW9uYnVnLnMiICIiICIiICIudmVyc2lvbiBkaXJlY3RpdmUiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBnaXZlIGFuIGVycm9yIG9uIGEgYm9ndXMgLnNwYWNlIGRpcmVjdGl2ZS4KLSAgICAjIHJlY2VudCB2ZXJzaW9uIG9mIGdhczIgd2VudCBpbnRvIGluZmluaXRlIGxvb3BzIHByaW50aW5nCi0gICAgIyBlcnJvcnMgb24gdGhpcyB0ZXN0LgotICAgIGdhc190ZXN0X2Vycm9yICJzcGFjZWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIC5zcGFjZSBkaXJlY3RpdmUiCi0KLSAgICAjIEdBUyBzaG91bGQgZ2l2ZSBhbiBlcnJvciBmb3IgdGhpcyB0ZXN0LgotICAgIGdhc190ZXN0X2Vycm9yICJjYWxsZGF0YWJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGludmFsaWQgYWd1bWVudHMgb24gLmNhbGwiCi0KLSAgICAjIE9sZCB2ZXJzaW9ucyBvZiBnYXMgaW5jb3JyZWN0bHkgZ2F2ZSBlcnJvcnMgb24gc29tZSB2YWxpZCAuRVhQT1JUIGxpbmVzCi0gICAgZ2FzX3Rlc3QgImV4cG9ydGJ1Zy5zIiAiIiAiIiAic3ludGF4IGNoZWNrIGZvciBhbiBvbGQgLkVYUE9SVCBidWciCi0KLSAgICAjIE9sZCB2ZXJzaW9ucyBvZiBnYXMgY2hva2VkIG9uIHRoaXMgZmlsZSBmb3Igc29tZSByZWFzb24KLSAgICBnYXNfdGVzdCAiZml4dXA3YnVnLnMiICIiICIiICJjaGVjayBmb3Igb2xkIFwiZml4dXA3XCIgZ2FzIGJ1ZyIKLQotICAgICMgVGVzdCBhbiBMJSBzZWxlY3RvciBwYXJzaW5nIGJ1ZyB3aGljaCBleGlzdGVkIGluIGdhcy0xLjM2ICAgCi0gICAgZG9fbHNlbF90ZXN0Ci0KLSAgICAjIEZpcnN0IGNoZWNrIGhvdyBzb21lIHZhbGlkIGFsaWdubWVudHMgYXJlIGhhbmRsZWQuCi0gICAgZG9fdmFsaWRfYWxpZ25fdGVzdHMKLQotICAgICMgTm93IGNoZWNrIHRvIG1ha2Ugc3VyZSBhbiBpbnZhbGlkIGFyZ3VtZW50IGlzIGZsYWdnZWQgYXMgYW4gZXJyb3IuCi0gICAgZ2FzX3Rlc3RfZXJyb3IgImFsaWduMi5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIGFyZ3VtZW50IHRvIC5hbGlnbiIKLQotICAgICMgR0FTIGNhbid0IGhhbmRsZSB1cHBlciBib3VuZCBmb3IgYSBQQSAuYmxvY2tbel0gZGlyZWN0aXZlCi0gICAgc2V0dXBfeGZhaWwgaHBwYSotKi0qCi0gICAgZ2FzX3Rlc3QgImJsb2NrMS5zIiAiIiAiIiAiQ2hlY2sgbWluL21heCB2YWx1ZXMgZm9yIC5ibG9jayIKLQotICAgICMgTm93IGNoZWNrIGZvciBhbiBpbnZhbGlkIGFyZ3VtZW50Ci0gICAgZ2FzX3Rlc3RfZXJyb3IgImJsb2NrMi5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yIG9uIGJvZ3VzIGFyZ3VtZW50IHRvIC5ibG9jayIKLQotICAgICMgR0FTLTEuMzYgY2hva2VkIG9uIHRoaXMgZmlsZS4KLSAgICAjIEZJWE1FLiAgU2hvdWxkIGNoZWNrIHJlbG9jYXRpb25zIG1hZGUgZm9yIHRoaXMgdGVzdCEKLSAgICBnYXNfdGVzdCAiZXhwcmJ1Zy5zIiAiIiAiIiAiQ2hlY2sgZm9yIHN5bTEtc3ltMiBhY2NlcHRhbmNlIgotCi0gICAgIyBCYWQgdGhpbmdzIGhhcHBlbiBpbiB0aGUgUEEgRUxGIGJhY2tlbmQgKG90aGVycyB0b28/KSBpZiBhIG5vbi1kZWZhdWx0Ci0gICAgIyBzZWN0aW9uIGlzIGNyZWF0ZWQuLi4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSplbGYqCi0gICAgZ2FzX3Rlc3QgInNzYnVnLnMiICIiICIiICJDaGVjayBmb3IgYWNjZXB0YW5jZSBvZiBub24tZGVmYXVsdCBzdWJzcGFjZXMiCi0KLSAgICAjIFRvIGJlIGNvbXBhdGFibGUgd2l0aCBjZXJ0YWluICJmZWF0dXJlcyIgb2YgdGhlIEhQIGNvbXBpbGVyCi0gICAgIyBub24tZXhpc3RhbnQgcmVnaXN0ZXJzIHNob3VsZCBkZWZhdWx0IHRvICVyMC4KLSAgICBnYXNfdGVzdCAiZGVmYnVnLnMiICIiICIiICJNaXNzaW5nIHJlZ2lzdGVyIHNob3VsZCBkZWZhdWx0IHRvICUlcjAiCi0KLSAgICAjIE1ha2Ugc3VyZSBHQVMgdW5kZXJzdGFuZHMgYSByZWFzb25hYmxlIHNldCBvZiBzdGFuZGFyZCBwcmVkZWZpbmVkCi0gICAgIyByZWdpc3RlcnMuICBlZyAlcnAsICVkcCwgJXNwLCBldGMuCi0gICAgZ2FzX3Rlc3QgInN0ZHJlZy5zIiAiIiAiIiAiVGVzdCBzdGFuZGFyZCBwcmVkZWZpbmVkIHJlZ2lzdGVycyIKLQotICAgICMgTWFrZSBzdXJlIEdBUyB3aWxsIGFjY2VwdCBhIGxhYmVsIHdpdGhvdXQgYSBjb2xvbi4KLSAgICBnYXNfdGVzdCAibGFiZWxidWcucyIgIiIgIiIgIlRlc3QgbGFiZWwgd2l0aG91dCBjb2xvbiIKLQotICAgICMgTWFrZSBzdXJlIHdlIGdyb2sgIyBsaW5lIGRpcmVjdGl2ZXMuCi0gICAgZ2FzX3Rlc3QgImFwcGJ1Zy5zIiAiIiAiIiAiVGVzdCBhY2NlcHRhbmNlIG9mICNsaW5lIGRpcmVjdGl2ZXMiCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBnaXZlIGVycm9ycyBpZiBhIGZsb2F0aW5nIHBvaW50IGZvcm1hdCBpcyBzcGVjaWZpZWQKLSAgICAjIGZvciBhbiB4bXB5dSBpbnN0cnVjdGlvbiAoaW50ZWdlciBtdWx0aXBsZSkKLSAgICBnYXNfdGVzdF9lcnJvciAieG1weXVidWcucyIgIiIgIkNoZWNrIGZvciBlcnJvciBvbiBib2d1cyBhcmd1bWVudCB0byB4bXB5dSIKLQotICAgICMgTWFrZSBzdXJlIGdhcyBoYW5kbGVzIHZhcmlvdXMga2luZHMgb2YgLnJlZyBwc2V1ZG8tb3BzCi0gICAgZ2FzX3Rlc3QgInJlZ3BvcGJ1Zy5zIiAiIiAiIiAiVGVzdCBmb3IgYnVncyBpbiAucmVnIHBzZXVkby1vcCIKLQotICAgICMgQ2hlY2sgc29tZSBidWdzIHRoYXQgaGF2ZSBhcHBlYXJlZCBpbiBwYXJzaW5nIC5jYWxsaW5mbyBkaXJlY3RpdmVzCi0gICAgZ2FzX3Rlc3QgImNhbGxpbmZvYnVnLnMiICIiICIiICJUZXN0IGZvciBidWdzIGluIC5jYWxsaW5mbyBkaXJlY3RpdmUiCi0KLSAgICAjIENoZWNrIGZvciBib2d1cyByZWdpc3RlcnMgaW4gc2luZ2xlIHByZWNpc2lvbiBmbXB5YWRkL2ZtcHlzdWIKLSAgICAjIGluc3RydWN0aW9ucwotICAgIGdhc190ZXN0X2Vycm9yICJiYWRmbXB5YWRkLnMiICIiICJDaGVjayBmb3IgZXJyb3Igb24gYmFkIGZtcHlhZGQgaW5zbiIKLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9wcm9jYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3Byb2NidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlNTA1Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3Byb2NidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkuc3BhY2UgJFRFWFQkCi0JLnN1YnNwYSAkQ09ERSQKLQkuYWxpZ24gNAotCS5leHBvcnQgZGl2dSxlbnRyeQotCS5wcm9jCi0JLmNhbGxpbmZvCi1kaXZ1OglzdHdzLG1hCQklcjQsNCglcjUpCQk7IHNhdmUgcmVnaXN0ZXJzIG9uIHN0YWNrCi0JLnByb2NlbmQKLQotCS5leHBvcnQgZGl2dTIsZW50cnkKLQkucHJvYwotCS5jYWxsaW5mbwotCS5lbnRyeQotZGl2dTI6CXN0d3MsbWEJCSVyNCw0KCVyNSkJCTsgc2F2ZSByZWdpc3RlcnMgb24gc3RhY2sKLQkuZXhpdAotCS5wcm9jZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3JlZ3BvcGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9yZWdwb3BidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkYjI2Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3JlZ3BvcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotcjAJLnJlZwklcjAKLXNoaWZ0CS5yZWcJJXNhcgotZnByZWcxMAkucmVnCSVmcjEwCi1zaGlmdDIJLnJlZwlzaGlmdAotCi07IE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgYm90Y2ggLmVxdS4uLgoteWFiYmEJLmVxdQlyMCArIHNoaWZ0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NwYWNlYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NwYWNlYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4M2I0MDEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zcGFjZWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zdGFydDoJLmxvbmcgMCwgMSwgMiwgMywgNCwgNSwgNiwgNwotCS5zcGFjZSAweDIwIC0gKC4gLSBzdGFydCkKLWZvbzoJLmxvbmcgNDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3NidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3NidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2MGUwZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3NzYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TVUJTUEEgJFNIT1JUQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdGRyZWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2Uvc3RkcmVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Mjk3OGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdGRyZWcucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5leHBvcnQgZm9vCi1mb286Ci0JLnByb2MKLQkuY2FsbGluZm8gbm9fY2FsbHMKLQkuZW50cnkKLQlsZGkgMTUsJXNwCi0JbGRpIDE1LCVycAotCWxkaSAxNSwlZHAKLQlsZGkgMTUsJXJldDAKLQlsZGkgMTUsJXJldDEKLQlsZGkgMTUsJWFyZzAKLQlsZGkgMTUsJWFyZzEKLQlsZGkgMTUsJWFyZzIKLQlsZGkgMTUsJWFyZzMKLQkuZXhpdAotIAkucHJvY2VuZCAJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0cmluZ2VyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3N0cmluZ2VyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzVlNmQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS9zdHJpbmdlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCi07IEdBUyB1c2VkIHRvIG1pcy1wYXJzZSB0aGUgZW1iZWRkZWQgcXVvdGVzCi0JLlNUUklORyAiI2luY2x1ZGUgXCJhd2suZGVmXCJceDBhXHgwMCIKLQotOyBPY3RhbCBlc2NhcGVzIHVzZWQgdG8gY29uc3VtZSA+IDMgY2hhcnMgd2hpY2ggbGVkIHRvIHRoaXMKLTsgc3RyaW5nIGJlaW5nIHNjcmV3ZWQgaW4gYSBiaWcgd2F5LgotCS5TVFJJTkcgIlwwMTEweDEyMyIKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3VuZGVmYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3VuZGVmYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZWRhOTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9wYXJzZS91bmRlZmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JYmwgc29tZXdoZXJlLCVyMgotCW5vcAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3ZlcnNpb25idWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdmVyc2lvbmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmVmMWI3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UvdmVyc2lvbmJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5WRVJTSU9OICJhYmMxMjMiCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UveG1weXVidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcGFyc2UveG1weXVidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNzI3NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3BhcnNlL3htcHl1YnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLTsgTm8gZm9ybWF0IHNlbGVjdG9yIGZvciB4bXB5dSEKLQl4bXB5dSxzZ2wgJWZyNCwlZnI1LCVmcjYKLQl4bXB5dSxkYmwgJWZyNCwlZnI1LCVmcjYKLQl4bXB5dSxxdWFkICVmcjQsJWZyNSwlZnI2Ci0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9hcHBseWJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGVkNmU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYXBwbHlidWcucworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci10YWJfX18yCi0JLndvcmQgTCQwMDAyCi0JLndvcmQgTCQwMDAzCi0JLndvcmQgTCQwMDA0Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgZXhlY3V0ZSxDT0RFCi0JLkVYUE9SVCBleGVjdXRlLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsUlROVkFMPUdSCi1leGVjdXRlCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCWFkZGlsIEwnYnVmLSRnbG9iYWwkLCVyMjcKLQlsZG8gUididWYtJGdsb2JhbCQoJXIxKSwlcjIwCi0JbGRpbCBMJ0wkMDAwMiwlcjE5Ci0JbW92Yiw8PiAlcjI2LCVyMjYsTCQwMDAyCi0JbGRvIFInTCQwMDAyKCVyMTkpLCVyMjIKLQljb3B5ICVyMCwlcjIxCi0JYWRkaWwgTCd0YWJfX18yLSRnbG9iYWwkLCVyMjcKLQlsZG8gUid0YWJfX18yLSRnbG9iYWwkKCVyMSksJXIyMwotCWFkZGlsIEwnb3B0YWItJGdsb2JhbCQsJXIyNwotCWxkbyBSJ29wdGFiLSRnbG9iYWwkKCVyMSksJXIyMAotTCQwMDA5Ci0Jc2gyYWRkICVyMjEsJXIyMywlcjE5Ci0JbGRoIDIoJXIxOSksJXIxOQotCWxkbyAxKCVyMjEpLCVyMjEKLQlzdWIgJXIxOSwlcjIyLCVyMTkKLQljb21pYiw+PSAyLCVyMjEsTCQwMDA5Ci0Jc3RocyxtYSAlcjE5LDIoJXIyMCkKLQlidixuICVyMCglcjIpCi1MJDAwMDIKLQlsZGkgMTIwLCVyMTkKLQlzdGJzLG1hICVyMTksMSglcjIwKQotCWxkaHMsbWEgMiglcjI2KSwlcjE5Ci0JYWRkICVyMjIsJXIxOSwlcjE5Ci0JYnYsbiAlcjAoJXIxOSkKLUwkMDAwMwotCWxkaSAxMjEsJXIxOQotCXN0YnMsbWEgJXIxOSwxKCVyMjApCi0JbGRocyxtYSAyKCVyMjYpLCVyMTkKLQlhZGQgJXIyMiwlcjE5LCVyMTkKLQlidixuICVyMCglcjE5KQotTCQwMDA0Ci0JbGRpIDEyMiwlcjE5Ci0Jc3RiICVyMTksMCglcjIwKQotCWJ2ICVyMCglcjIpCi0Jc3RicyxtYiAlcjAsMSglcjIwKQotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIF9fbWFpbixDT0RFCi0JLklNUE9SVCBzdHJjbXAsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KLQkuYWxpZ24gNAotTCRDMDAwMAotCS5TVFJJTkcgInh5eHl6XHgwMCIKLQkuSU1QT1JUIGFib3J0LENPREUKLQkuSU1QT1JUIGV4aXQsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIG1haW4sQ09ERQotCS5FWFBPUlQgbWFpbixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotbWFpbgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGVjdXRlLCVyMgotCWNvcHkgJXIwLCVyMjYKLQlhZGRpbCBMJ29wdGFiLSRnbG9iYWwkLCVyMjcKLQljb3B5ICVyMSwlcjE5Ci0JbGRvIFInb3B0YWItJGdsb2JhbCQoJXIxOSksJXIyMQotCWxkaCAyKCVyMjEpLCVyMjAKLQlsZGggUidvcHRhYi0kZ2xvYmFsJCglcjE5KSwlcjE5Ci0JYWRkaWwgTCdwLSRnbG9iYWwkLCVyMjcKLQljb3B5ICVyMSwlcjIyCi0Jc3RoICVyMjAsUidwLSRnbG9iYWwkKCVyMjIpCi0JbGRvIFIncC0kZ2xvYmFsJCglcjIyKSwlcjI2Ci0Jc3RoICVyMjAsNCglcjI2KQotCXN0aCAlcjE5LDIoJXIyNikKLQlsZGggNCglcjIxKSwlcjE5Ci0JLkNBTEwgQVJHVzA9R1IKLQlibCBleGVjdXRlLCVyMgotCXN0aCAlcjE5LDYoJXIyNikKLQlhZGRpbCBMJ2J1Zi0kZ2xvYmFsJCwlcjI3Ci0JY29weSAlcjEsJXIxOQotCWxkbyBSJ2J1Zi0kZ2xvYmFsJCglcjE5KSwlcjI2Ci0JbGRpbCBMJ0wkQzAwMDAsJXIyNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMgotCWxkbyBSJ0wkQzAwMDAoJXIyNSksJXIyNQotCWNvbWliLD0sbiAwLCVyMjgsTCQwMDExCi0JLkNBTEwgCi0JYmwgYWJvcnQsJXIyCi0Jbm9wCi1MJDAwMTEKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGV4aXQsJXIyCi0JY29weSAlcjAsJXIyNgotCW5vcAotCS5FWElUCi0JLlBST0NFTkQKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkQlNTJAotCi1vcHRhYgkuY29tbSAxMAotYnVmCS5jb21tIDEwCi1wCS5jb21tIDEwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzMDc3NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLklNUE9SVAkkJGR5bmNhbGwsTUlMTElDT0RFIDsgQ29kZSBmb3IgZHluYW1pYyBmdW5jdGlvbiBjYWxscy4KLQotX3NpZ3RyYW1wOgotCWxkaWwJTCUkJGR5bmNhbGwsJXIyCTsgICB3aG9zZSBhZGRyZXNzIGlzIGluIHIyMi4KLQlibGUJUiUkJGR5bmNhbGwoJXNyNCwlcjIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2JsZWJ1ZzIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTc3YjUzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0KLSAgCWxkaWwJTCUweGMwMDAxMDA0LCVyMQotICAJYmxlCVIlMHhjMDAwMTAwNCglc3I3LCVyMSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvYmxlYnVnMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWczLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTliM2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9ibGVidWczLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuaW1wb3J0IHlhYmJhLGNvZGUKLQotICAJYmxlCVIleWFiYmEoJXNyNCwlcjApCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2V4aXRidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZXhpdGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODk4ZTM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZXhpdGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgZm9vLENPREUKLQkuRVhQT1JUIGZvbyxFTlRSWSxQUklWX0xFVj0zCi1mb286Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2ZpeHVwYnVnLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2ZpeHVwYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNThkMDIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9maXh1cGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLlNVQlNQQSAkTUlMTElDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsU09SVD04Ci0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCWIsbgkkJGZvbwotCW5vcAotCW5vcAotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJE1JTExJQ09ERSQKLSQkZm9vOgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9mdW5jcmVsb2NidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTQzYmM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvZnVuY3JlbG9jYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgZyxDT0RFCi0JLkVYUE9SVCBnLEVOVFJZLFBSSVZfTEVWPTMsQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsUlROVkFMPUdSCi1nCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsMTI4KCVyMzApCi0Jc3R3ICVyMjYsLTM2KCVyMykKLQlzdHcgJXIyNSwtNDAoJXIzKQotCXN0dyAlcjI0LC00NCglcjMpCi0JbGR3IC0zNiglcjMpLCVyMjYKLQlsZHcgLTQwKCVyMyksJXIyNQotCWxkdyAtNDQoJXIzKSwlcjE5Ci0JY29weSAlcjE5LCVyMjIKLQkuQ0FMTAlBUkdXMD1HUgotCWJsICQkZHluY2FsbCwlcjMxCi0JY29weSAlcjMxLCVyMgotCWNvcHkgJXIyOCwlcjE5Ci0JY29taWNsciw8PiAwLCVyMTksJXIwCi0JYmwsbiBMJDAwMDIsJXIwCi0JbGR3IC0zNiglcjMpLCVyMjgKLQlibCxuIEwkMDAwMSwlcjAKLQlibCxuIEwkMDAwMywlcjAKLUwkMDAwMgotCWxkdyAtNDAoJXIzKSwlcjI4Ci0JYmwsbiBMJDAwMDEsJXIwCi1MJDAwMDMKLUwkMDAwMQotCWxkdyAtMjAoJXIzKSwlcjIKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotZjJfX180Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsTk9fQ0FMTFMsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDY0KCVyMzApCi0Jc3R3ICVyMjksOCglcjMpCi0Jc3R3ICVyMjYsLTM2KCVyMykKLQlzdHcgJXIyNSwtNDAoJXIzKQotCWxkdyAtMzYoJXIzKSwlcjE5Ci0JbGR3IC00MCglcjMpLCVyMjAKLQljb21jbHIsPj0gJXIyMCwlcjE5LCVyMTkKLQlsZGkgMSwlcjE5Ci0JY29weSAlcjE5LCVyMjgKLQlibCxuIEwkMDAwNSwlcjAKLUwkMDAwNQotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5JTVBPUlQgYWJvcnQsQ09ERQotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLmFsaWduIDQKLUwkVFJBTVAwMDAwCi0JbGR3CTM2KCVyMjIpLCVyMjEKLQliYiw+PSxuCSVyMjEsMzAsLisxNgotCWRlcGkJMCwzMSwyLCVyMjEKLQlsZHcJNCglcjIxKSwlcjE5Ci0JbGR3CTAoJXIyMSksJXIyMQotCWxkc2lkCSglcjIxKSwlcjEKLQltdHNwCSVyMSwlc3IwCi0JYmUJMCglc3IwLCVyMjEpCi0JbGR3CTQwKCVyMjIpLCVyMjkKLQkud29yZAkwCi0JLndvcmQJMAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGYsQ09ERQotCS5FWFBPUlQgZixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotZgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTE5MixDQUxMUyxTQVZFX1JQLFNBVkVfU1AsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjMsJXIxCi0JY29weSAlcjMwLCVyMwotCXN0d20gJXIxLDE5MiglcjMwKQotCWxkbyAxNiglcjMpLCVyMTkKLQlhZGRpbCBMJ0wkVFJBTVAwMDAwLSRnbG9iYWwkLCVyMjcKLQlsZG8gUidMJFRSQU1QMDAwMC0kZ2xvYmFsJCglcjEpLCVyMjIKLQlsZG8gNDAoJXIwKSwlcjIwCi0JbGR3cyxtYSA0KCVyMjIpLCVyMjEKLQlhZGRpYiw+PSAtNCwlcjIwLC4tNAotCXN0d3MsbWEgJXIyMSw0KCVyMTkpCi0JbGRpbCBMJ2YyX19fNCwlcjIwCi0JbGRvIFInZjJfX180KCVyMjApLCVyMTkKLQlzdHcgJXIxOSw1MiglcjMpCi0JbGRvIDgoJXIzKSwlcjE5Ci0Jc3R3ICVyMTksNTYoJXIzKQotCWxkbyAxNiglcjMpLCVyMTkKLQlsZG8gNDgoJXIzKSwlcjIwCi0JZmRjICVyMCglcjE5KQotCWZkYyAlcjAoJXIyMCkKLQlzeW5jCi0JbGRvIDMyKCVyMTkpLCVyMjIKLQltZnNwICVzcjAsJXIyMQotCWxkc2lkICglcjE5KSwlcjIwCi0JbXRzcCAlcjIwLCVzcjAKLQlmaWMgJXIwKCVzcjAsJXIxOSkKLQlmaWMgJXIwKCVzcjAsJXIyMikKLQlzeW5jCi0JbXRzcCAlcjIxLCVzcjAKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlub3AKLQlsZG8gMTYoJXIzKSwlcjE5Ci0JbGRpIDEsJXIyNgotCWxkaSAyLCVyMjUKLQljb3B5ICVyMTksJXIyNAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgZywlcjIKLQlub3AKLQljb3B5ICVyMjgsJXIxOQotCWNvbWljbHIsPD4gMiwlcjE5LCVyMAotCWJsLG4gTCQwMDA2LCVyMAotCS5DQUxMIEFSR1cwPU5PLEFSR1cxPU5PLEFSR1cyPU5PLEFSR1czPU5PCi0JYmwgYWJvcnQsJXIyCi0Jbm9wCi1MJDAwMDYKLUwkMDAwNAotCWxkdyAtMjAoJXIzKSwlcjIKLQlsZG8gNjQoJXIzKSwlcjMwCi0JbGR3bSAtNjQoJXIzMCksJXIzCi0JYnYsbiAlcjAoJXIyKQotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIF9fbWFpbixDT0RFCi0JLklNUE9SVCBleGl0LENPREUKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsU0FWRV9TUCxFTlRSWV9HUj0zCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsMTI4KCVyMzApCi0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JLkNBTEwgQVJHVzA9Tk8sQVJHVzE9Tk8sQVJHVzI9Tk8sQVJHVzM9Tk8KLQlibCBmLCVyMgotCW5vcAotCWNvcHkgJXIwLCVyMjYKLQkuQ0FMTCBBUkdXMD1OTyxBUkdXMT1OTyxBUkdXMj1OTyxBUkdXMz1OTwotCWJsIGV4aXQsJXIyCi0Jbm9wCi1MJDAwMDcKLQlsZHcgLTIwKCVyMyksJXIyCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xhYmVsb3BidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2RjNDIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvbGFiZWxvcGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotczoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0xMjgsQ0FMTFMsU0FWRV9SUAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JY29weSAlcjQsJXIxCi0JY29weSAlcjMwLCVyNAotCXN0d20gJXIxLDEyOCglcjMwKQotCXN0dyAlcjMwLDEyKCVyNCkKLQlsZGlsIEwnTCQwMDA3LCVyMTkKLQlsZG8gUidMJDAwMDcoJXIxOSksJXIxOQotCWNvbWliLD49IDAsJXIyNixMJDAwMDIKLQlzdHcgJXIxOSw4KCVyNCkKLUwkMDAwMzoKLUwkMDAwMjoKLQliIEwkMDAwMQotCWxkbyAxKCVyMCksJXIyOAotTCQwMDA3OgotCWxkaWwgTCdMJDAwMDIsJXIxOQotCWxkbyBSJ0wkMDAwMiglcjE5KSwlcjE5Ci0JY29tYiw9ICVyMjksJXIxOSxMJDAwMDIKLQlsZG8gLTgoJXI0KSwlcjQKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL2xvbmdjYWxsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzk5NmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9sb25nY2FsbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLklNUE9SVCBiYXIsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuRVhQT1JUIGZvbyxDT0RFCi0JLkVYUE9SVCBmb28sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLWZvbwotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTY0LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlzdHcgJXIyLC0yMCglcjMwKQotCS5DQUxMIAotCWJsIGJhciwlcjIKLQlsZG8gNjQoJXIzMCksJXIzMAotCS5ibG9ja3ogMjYyMTQ0Ci0JbGR3IC04NCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkbyAtNjQoJXIzMCksJXIzMAotCS5FWElUCi0JLlBST0NFTkQKLQkuYWxpZ24gNAotCS5FWFBPUlQgYmFyLENPREUKLQkuRVhQT1JUIGJhcixFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotYmFyCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MCxOT19DQUxMUwotCS5FTlRSWQotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BpY3JlbG9jLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BpY3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOWE0NGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9waWNyZWxvYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCi0JLlNQQUNFCSRURVhUJCxTT1JUPTgKLQkuU1VCU1BBCSRDT0RFJCxRVUFEPTAsQUxJR049NCxBQ0NFU1M9MHgyYyxDT0RFX09OTFksU09SVD0yNAotCS5TUEFDRQkkUFJJVkFURSQsU09SVD0xNgotCS5TVUJTUEEJJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0weDFmLFNPUlQ9MTYKLWJvZ28KLQkuQUxJR04JOAotCS5XT1JEICBib2dvKzQJOyA9IDB4NAotCS5TVFJJTkcJIlx4MDBceDAwXHgwMHtceDAwXHgwMFx4MDFceEM4XHgwMFx4MDBceDAzXHgxNSIKLQkuU1BBQ0UJJFBSSVZBVEUkCi0JLlNVQlNQQQkkREFUQSQKLQkuRVhQT1JUCWJvZ28KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9wbGFiZWxidWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwNWIzMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3BsYWJlbGJ1Zy5zCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLklNUE9SVCBhYm9ydCxDT0RFCi0JLkVYUE9SVCBmLERBVEEKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1mOgotCS53b3JkIFAlYWJvcnQKLQkud29yZCBQJWFib3J0Ci0JLklNUE9SVCBfX21haW4sQ09ERQotCS5JTVBPUlQgcHJpbnRmLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci1MQyQwMDAwOgotCS5TVFJJTkcgImZyb2JceDBhXHgwMCIKLQkuYWxpZ24gNAotCS5FWFBPUlQgbWFpbixDT0RFCi0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTEyOCxDQUxMUyxTQVZFX1JQCi0JLkVOVFJZCi0Jc3R3ICVyMiwtMjAoJXIzMCkKLQlsZG8gMTI4KCVyMzApLCVyMzAKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0Jbm9wCi0JbGRpbCBMJ0xDJDAwMDAsJXIyNgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgcHJpbnRmLCVyMgotCWxkbyBSJ0xDJDAwMDAoJXIyNiksJXIyNgotCWxkdyAtMTQ4KCVyMzApLCVyMgotCWJ2ICVyMCglcjIpCi0JbGRvIC0xMjgoJXIzMCksJXIzMAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvcl9ub19yZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNmYyZDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yX25vX3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0JLkNPUFlSSUdIVCAiTWV0YVdhcmUgSW5jb3Jwb3JhdGVkLCAxOTkyIgotCS5WRVJTSU9OCSJoYzIuNmEgLU8xIHQzLmNcbiIKLQotCS5TUEFDRQkkUFJJVkFURSQsU09SVD0xNgotCS5TVUJTUEEJJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTB4MUYsU09SVD04MCxaRVJPCi0JLlNVQlNQQQkkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTB4MUYsU09SVD0xNgotCi0JLlNQQUNFCSRURVhUJCxTT1JUPTgKLQkuU1VCU1BBCSRDT0RFJCxRVUFEPTAsQUxJR049NCxBQ0NFU1M9NDQsQ09ERV9PTkxZLFNPUlQ9MjQKLQotCS5TUEFDRQkkUFJJVkFURSQKLQkuU1VCU1BBCSREQVRBJAotCS5BTElHTgk4Ci0kTDAwREFUQQotCS5BTElHTgk4Ci0JLkVYUE9SVAlzCi1zCi0JLldPUkQJMHgwCi0JLkJMT0NLWgk3ODY0MjUKLQkuQkxPQ0taCTcKLQotCS5TUEFDRQkkVEVYVCQKLQkuU1VCU1BBCSRDT0RFJAotTCQwMDEuMwotZwkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wLE5PX0NBTExTCi0JLkVOVFJZCi0JO2xkbwkxMjAoJXIwKSwlcjI4IC0tPiB0byBkZWxheSBzbG90Ci0JYnYJJXIwKCVyMikKLQkuRVhJVAotCWxkbwkxMjAoJXIwKSwlcjI4Ci0JLlBST0NFTkQKLQotCi0JLlNQQUNFCSRQUklWQVRFJAotCS5TVUJTUEEJJERBVEEkCi0JLkFMSUdOCTQKLQkuRVhQT1JUCWwKLWwKLQkuV09SRAlQJ2cKLQkuSU1QT1JUCWNvbW1vbixEQVRBCTsgY29tbW9uIHNlY3Rpb24sIHNpemU9MAotCS5JTVBPUlQJJGdsb2JhbCQsREFUQQotCS5FWFBPUlQJZyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1HUgotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNzc1MmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UucworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLQkuUEFSQU0gZm9vLFJUTlZBTD1HUgotZm9vOgotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLUxDJDAwMDA6Ci0JLndvcmQgUCVmb28KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBiYXIsQ09ERQotCS5FWFBPUlQgYmFyLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1iYXI6Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAKLQkuRU5UUlkKLQlsZGlsIEwnTEMkMDAwMCwlcjE5Ci0JbGR3IFInTEMkMDAwMCglcjE5KSwlcjI2Ci0Jc3R3ICVyMiwtMjAoJXIzMCkKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZvbywlcjIKLQlsZG8gMTI4KCVyMzApLCVyMzAKLQlsZHcgLTE0OCglcjMwKSwlcjIKLQlidiAlcjAoJXIyKQotCWxkbyAtMTI4KCVyMzApLCVyMzAKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlZHVjZTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzNmYTM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMi5zCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQKLQotCS5hbGlnbiA4Ci1MJFAwMDAwCi0JLndvcmQgMHgxMjM0NTY3OAotCS53b3JkIDB4MAotCi0JLmFsaWduIDgKLUwkQzAwMDAKLQkud29yZCAweDNmZjAwMDAwCi0JLndvcmQgMHgwCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCS5FWFBPUlQgZyxFTlRSWSxQUklWX0xFVj0zLFJUTlZBTD1GUgotZwotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAsTk9fQ0FMTFMKLQkuRU5UUlkKLQlzdHcgJXIxOSwtMzIoJXIzMCkKLQlsZHcgVCdMJEMwMDAwKCVyMTkpLCVyMjAKLQlidiAlcjAoJXIyKQotCWZsZGRzIDAoJXIyMCksJWZyNAotCS5FWElUCi0JLlBST0NFTkQKLQkuSU1QT1JUIGFib3J0LENPREUKLQkuSU1QT1JUIGV4aXQsQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkCi0KLQkuYWxpZ24gOAotTCRDMDAwMQotCS53b3JkIDB4M2ZmMDAwMDAKLQkud29yZCAweDAKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1tYWluCi0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9MTI4LENBTExTLFNBVkVfUlAsRU5UUllfR1I9MwotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApCi0JbGRvIDEyOCglcjMwKSwlcjMwCi0Jc3R3ICVyMTksLTMyKCVyMzApCi0Jc3R3ICVyNCwtMTI4KCVyMzApCi0KLQljb3B5ICVyMTksJXI0Ci0JLkNBTEwgCi0JYmwgZywlcjIKLQljb3B5ICVyNCwlcjE5Ci0JY29weSAlcjQsJXIxOQotCWxkdyBUJ0wkQzAwMDEoJXIxOSksJXIyMAotCWZsZGRzIDAoJXIyMCksJWZyOAotCWZjbXAsZGJsLD0gJWZyNCwlZnI4Ci0JZnRlc3QKLQlhZGQsdHIgJXIwLCVyMCwlcjAKLQliLG4gTCQwMDAzCi0JLkNBTEwgCi0JYmwgYWJvcnQsJXIyCi0Jbm9wCi1MJDAwMDMKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGV4aXQsJXIyCi0JbGRpIDAsJXIyNgotCW5vcAotCS5FWElUCi0JLlBST0NFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVkdWNlMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzFlNzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yZWR1Y2UzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMQotCS5TVUJTUEEgJEJTUyQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxLFpFUk8sU09SVD04MgotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRMSVQkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NAotCS5TVUJTUEEgJENPREUkLFFVQUQ9MCxBTElHTj04LEFDQ0VTUz00NCxDT0RFX09OTFkKLQkuSU1QT1JUICRnbG9iYWwkLERBVEEKLQkuSU1QT1JUICQkZHluY2FsbCxNSUxMSUNPREUKLTsgZ2NjX2NvbXBpbGVkLjoKLQkuRVhQT1JUIGJsYWgsREFUQQotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLmFsaWduIDgKLWJsYWgKLQk7IC5kb3VibGUgMGUrMDAKLQkud29yZCAwIDsgPSAweDAKLQkud29yZCAwIDsgPSAweDAKLQkuRVhQT1JUIGZvbyxEQVRBCi0JLmFsaWduIDgKLWZvbwotCTsgLmRvdWJsZSAwZSswMAotCS53b3JkIDAgOyA9IDB4MAotCS53b3JkIDAgOyA9IDB4MAotCS5FWFBPUlQgeWFiYmEsREFUQQotCS5hbGlnbiA0Ci15YWJiYQotCS53b3JkIDEKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBiYXIsQ09ERQotCS5FWFBPUlQgYmFyLEVOVFJZLFBSSVZfTEVWPTMsUlROVkFMPUdSCi1iYXIKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT02NCxOT19DQUxMUyxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsNjQoJXIzMCkKLQlhZGRpbCBMJ3lhYmJhLSRnbG9iYWwkLCVyMjcKLQlsZG8gUid5YWJiYS0kZ2xvYmFsJCglcjEpLCVyMTkKLQlsZGkgMiwlcjIwCi0Jc3R3ICVyMjAsMCglcjE5KQotTCQwMDAxCi0JbGRvIDY0KCVyMyksJXIzMAotCWxkd20gLTY0KCVyMzApLCVyMwotCWJ2LG4gJXIwKCVyMikKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JlbG9jLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2IyMzZjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2MvcmVsb2MuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IHRoZSBDZW50ZXIgZm9yIFNvZnR3YXJlIFNjaWVuY2UgYXQgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaAotIyBhbmQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fYmxlX3JlbG9jYXRpb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJibGVidWcuczogVGVzdCBmb3IgcHJvcGVyIHJlbG9jYXRpb24gZm9yIEJMRSAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJibGVidWcucyIgIiIgIlByb3BlciByZWxvY2F0aW9uIGZvciBCTEUgKHBhcnQgMSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotICAgICAgICBpZiAhW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCSAgICAjIEF0IG9uZSB0aW1lIGJvdGggdmVyc2lvbnMgb2YgdGhlIGFzc2VtYmxlciB3b3VsZCBpbmNvcnJlY3RseSB1c2UgCi0JICAgICMgYSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBhIEJMRSBpbnN0cnVjdGlvbi4KLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JCSAgICAtcmUgIl4wMDAwMDAwNFxbXlxuXF0qQUJTX0NBTExcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQkgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICAjIEF0IG9uZSB0aW1lIGJvdGggdmVyc2lvbnMgb2YgdGhlIGFzc2VtYmxlciB3b3VsZCBpbmNvcnJlY3RseSB1c2UgCi0JICAgICMgYSBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uIGZvciBhIEJMRSBpbnN0cnVjdGlvbi4KLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JCSAgICAtcmUgIl4wMDAwMDAwMFxbXlxuXF0qRElSMjFMXFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjAwMDAwMDA0XFteXG5cXSpESVIxN1JcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQkgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19yZWxvY2F0aW9uX3JlZHVjdGlvbl90ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyZWR1Y2UuczogVGVzdCByZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicmVkdWNlLnMiICIiICJSZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQxKSJdIHRoZW4gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgcmVsb2NhdGlvbnMgaW52b2x2aW5nIHByb2NlZHVyZSBsYWJlbHMgCi0JIyBhcmUgbm90IHJlZHVjZWQgdG8gYSByZWxvY2F0aW9uIGludm9sdmluZyBzb21lIG90aGVyIHN5bWJvbC4KLQkjIERvaW5nIHNvIG1ha2VzIGdlbmVyYXRpbmcgcGFyYW1ldGVyIHJlbG9jYXRpb24gc3R1YnMgaW1wb3NzaWJsZS4KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDRcW15cblxdKlBMQUJFTFxbXlxuXF0qZm9vXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAxNFxbXlxuXF0qUENSRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgc2V0IHRlc3RuYW1lICJyZWR1Y2UyLnM6IE1vcmUgcmVsb2NhdGlvbiByZWR1Y3Rpb24gdGVzdHMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicmVkdWNlMi5zIiAiIiAiTW9yZSByZWxvY2F0b2luICByZWR1Y3Rpb25zIChwYXJ0MSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgQ2hlY2sgdG8gbWFrZSBzdXJlIERMVCByZWxhdGl2ZSByZWxvY3MgYXJlIG5vdCByZWR1Y2VkIHRvIHN5bSthZGRlbmQKLQkjIERvaW5nIHNvIGRvZXNuJ3Qgd29yayBhcyBvbmUgbWlnaHQgZXhwZWN0Ci0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXjAwMDAwMDA0XFteXG5cXSpETFRcW15cblxdKkwuQzAwMDBcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDFjXFteXG5cXSpETFRcW15cblxdKkwuQzAwMDBcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDMwXFteXG5cXSpETFRcW15cblxdKkwuQzAwMDFcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDQ4XFteXG5cXSpETFRcW15cblxdKkwuQzAwMDFcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgb2JqZHVtcF9maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotICAgIHNldCB0ZXN0bmFtZSAicmVkdWNlMy5zOiBUZXN0IGV2ZW4gbW9yZSByZWxvY2F0aW9uIHJlZHVjdGlvbnMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicmVkdWNlMy5zIiAiIiAiRXZlbiBtb3JlIHJlbG9jYXRpb24gcmVkdWN0aW9ucyAocGFydDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRvIG1ha2Ugc3VyZSByZWxvY2F0aW9ucyBpbnZvbHZpbmcgcHJvY2VkdXJlIGxhYmVscyAKLQkjIGFyZSBub3QgcmVkdWNlZCB0byBhIHJlbG9jYXRpb24gaW52b2x2aW5nIHNvbWUgb3RoZXIgc3ltYm9sLgotCSMgRG9pbmcgc28gbWFrZXMgZ2VuZXJhdGluZyBwYXJhbWV0ZXIgcmVsb2NhdGlvbiBzdHVicyBpbXBvc3NpYmxlLgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wMDAwMDAwY1xbXlxuXF0qeWFiYmFcW15cblwrXF0qXG4iCi0JCSAgICB7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMGNcW15cblxdKnlhYmJhXCtcW15cblxdKlxuIgotCQkgICAgeyBzZXQgeCAwOyBicmVhayB9Ci0JCS1yZSAiXjAwMDAwMDEwXFteXG5cXSp5YWJiYVxbXlxuXCtcXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAxMFxbXlxuXF0qeWFiYmFcK1xbXlxuXF0qXG4iCi0JCSAgICB7IHNldCB4IDA7IGJyZWFrIH0KLQkJLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotICAgICAgICAgICAgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBvYmpkdW1wX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JsZV9tb2RlX3NlbGVjdG9yX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmxlYnVnMi5zOiBibGVidWcyIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYmxlYnVnMi5zIiAiLWFsIgotCi0gICAgIyBHQVMgdXNlcyB0b28gbWFueSBiaXRzIG9uIHRoZSBCTEUgaW5zdHJ1Y3Rpb24uCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDIwMjAyODAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFNDIwRTAwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19ibGVfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJsZWJ1ZzMuczogYmxlYnVnMyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJsZWJ1ZzMucyIgIi1hbCIKLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFNDAwMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19wbGFiZWxfcmVsb2NhdGlvbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInBsYWJlbGJ1Zy5zOiBPbGQgZ2FzLTEuMzYgcGxhYmVsIGJ1ZyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJwbGFiZWxidWcucyIgIiIgIk9sZCBnYXMtMS4zNiBwbGFiZWwgYnVnIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0aGF0IHdlIG1ha2UgUExBQkVMIHJlbG9jYXRpb24gZW50cmllcyB3aGVuIHRoZXkncmUgbmVlZGVkLgotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wMDAwMDAwMFxbXlxuXF0qUExBQkVMXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAwNFxbXlxuXF0qUExBQkVMXFteXG5cXSpcbiIKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJeyB9Ci0JCXRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotICAgIAkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX3NlbGVjdG9yX3Njb3BlX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAic2VsZWN0b3JidWcuczogVGVzdCBzY29wZSBvZiBmaWVsZCBzZWxlY3RvciIgCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAic2VsZWN0b3JidWcucyIgIiIgIlRlc3Qgc2NvcGUgb2YgZmllbGQgc2VsZWN0b3IgKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcmVsb2NhdGlvbiBlbnRyeSBhZnRlciB0aGUgcGxhYmVsIGlzIGNvcnJlY3QuCi0JIyBJZiBhbiBvbGQgZmllbGQgc2VsZWN0b3Igd2FzIGluY29ycmVjdGx5ICJjYXJyaWVkIiBvdmVyLCB0aGVuIAotCSMgdGhpcyB0ZXN0IHdpbGwgZmFpbC4KLSAgICAgICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxNFxbXlxuXF0qRElSMzJcW15cblxdKlxuIgotCQkJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXjAwMDAwMDE0XFteXG5cXSpQTEFCRUxcW15cblxdKmZvb1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IDAgfQotCSAgICAgICAgICAgIC1yZSAiXFteXG5cXSpcbiIJCXsgfQotCSAgICAgICAgICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICAgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotICAgICAgICAgICAgfQotCX0gZWxzZSB7Ci0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDE0XFteXG5cXSpEQVRBX09ORVxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IDEgfQotCQkgICAgLXJlICJeMDAwMDAwMTRcW15cblxdKlBMQUJFTFxbXlxuXF0qZm9vXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggMCB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICAgICAgdGltZW91dAkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICAgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fbG9jYWxfbGFiZWxfYXNfb3BlcmFuZF90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxhYmVsb3BidWcuczogVGVzdCBsb2NhbCBsYWJlbCBhcyBvcGVyYW5kIChub24tYnJhbmNoaW5nKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJsYWJlbG9wYnVnLnMiICIiICJMb2NhbCBsYWJlbCBhcyBvcGVyYW5kIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGFuZGxlIGRpZmZlcmVuY2Ugb2YgbG9jYWwgbGFibGVzIGFzIGFuIG9wZXJhbmQKLQkjIHRvIGEgbm9uLWJyYW5jaGluZyBpbnN0cnVjdGlvbiBjb3JyZWN0bHkuCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wMDAwMDAyY1xbXlxuXF0qMHgwMDAwMDAyNFxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIl4wMDAwMDAzMFxbXlxuXF0qMHgwMDAwMDAyNFxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19leGl0X3JlbG9jYXRpb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleGl0YnVnLnM6IFRlc3QgZm9yIGJvZ3VzIFJfRVhJVCByZWxvY2F0aW9uIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgICMgRWxmIChvc2YpIGRvZXMgbm90IHVzZSBFTlRSWS9FWElUIHJlbG9jYXRpb25zLgotICAgICMgSSBndWVzcyB3ZSBjb3VsZCBsb29rIGF0IHRoZSB1bndpbmQgc3Vic3BhY2VzIGl0IGJ1aWxkcy4uLgotICAgICMgVW50aWwgdGhlbiwgbWFrZSBzdXJlIGl0IHN0aWxsIGFzc2VtYmxlcy4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JZ2FzX3Rlc3Rfb2xkICJleGl0YnVnLnMiICIiICJUZXN0IGZvciBib2d1cyBSX0VYSVQgcmVsb2NhdGlvbiAocGFydCAxKSIKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiZXhpdGJ1Zy5zIiAiIiAiVGVzdCBmb3IgYm9ndXMgUl9FWElUIHJlbG9jYXRpb24gKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE5vdGUgdGhhdCBhIG1hdGNoIGhlcmUgaXMgcmVhbGx5IGEgRkFJTFVSRSEKLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkgICAgICAgIC1yZSAiXjAwMDAwMDAwXFteXG5cXSpSX0VYSVRcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8xIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZpeHVwYnVnLnM6IFRlc3QgY3Jvc3Mgc3BhY2UganVtcC9jYWxsIGZpeHVwIGJ1ZyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZpeHVwYnVnLnMiICIiICJUZXN0IGNyb3NzIHNwYWNlIGp1bXAvY2FsbCBmaXh1cCBidWcgKHBhcnQgMSkiXSB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQkjIE1ha2Ugc3VyZSBHQVMgZ2VuZXJhdGVkIGEgZml4dXAvcmVsb2NhdGlvbiBmb3IgdGhlIGNyb3NzLXNwYWNlCi0JIyBicmFuY2gvY2FsbAotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCSAgICAgICAgLXJlICJeMDAwMDAwMDBcW15cblxdKlBDUkVMX0NBTExcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fY3Jvc3Nfc3BhY2VfZml4dXBfdGVzdF8yIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZpeHVwYnVnLnM6IFRlc3QgY3Jvc3Mgc3BhY2UganVtcC9jYWxsIGZpeHVwIGJ1ZyAocGFydCAzKSIKLSAgICBzZXQgeCAwCi0KLSAgICAjIEVMRiAob3NmKSBkb2Vzbid0IHJlYWxseSBoYW5kbGUgZXh0cmEgc2VjdGlvbnMgdG9vIHdlbGwuLi4KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuOwotICAgIH0KLQotICAgIGdhc19zdGFydCAiZml4dXBidWcucyIgIi1hbCIKLQotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFODAwMDAwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19yb3VuZF9tb2RlX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAicm91bmRtb2RlLnM6IFRlc3Qgc3dpdGNoaW5nIG9mIHJvdW5kaW5nIG1vZGVzIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInJvdW5kbW9kZS5zIiAiIiAiVGVzdCBzd2l0Y2ggb2Ygcm91bmRpbmcgbW9kZXMocGFydCAxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItciIKLQotCSMgTWFrZSBzdXJlIEdBUyBnZW5lcmF0ZWQgY29ycmVjdCByZWxvY2F0aW9ucyB0byBzd2l0Y2ggcm91bmRpbmcgbW9kZXMuCi0JIyBBbHNvIG1ha2Ugc3VyZSAoZm9yIFNPTSkgdGhhdCByZWR1bmRhbnQgcm91bmRpbmcgbW9kZSByZWxvY2F0aW9ucwotCSMgd2VyZSBlbGltaW5hdGVkLgotCWlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQkgICAgd2hpbGUgMSB7Ci0JCWV4cGVjdCB7Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMDBcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwNFxbXlxuXF0qRElSMTRSXFteXG5cXSpcbiIgCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwOFxbXlxuXF0qRElSMjFMXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDBjXFteXG5cXSpESVIxNFJcW15cblxdKlxuIiAKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDEwXFteXG5cXSpESVIyMUxcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMTRcW15cblxdKkRJUjE0UlxbXlxuXF0qXG4iIAotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAgICAgLXJlICJeMDAwMDAwMThcW15cblxdKkRJUjIxTFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxY1xbXlxuXF0qRElSMTRSXFteXG5cXSpcbiIgCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotICAgICAgICAgICAgfQotCX0gZWxzZSB7Ci0JICAgIHdoaWxlIDEgewotCQlleHBlY3QgewotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDAwXFteXG5cXSpSX1JfTU9ERVxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwNFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDA4XFteXG5cXSpSX05fTU9ERVxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAwY1xbXlxuXF0qUl9OX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDEwXFteXG5cXSpSX1JfTU9ERVxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgICAgICAgICAtcmUgIl4wMDAwMDAxNFxbXlxuXF0qUl9SX01PREVcW15cblxdKlxuIiAKLQkJCXsgZmFpbCAkdGVzdG5hbWUgfQotCSAgICAgICAgICAgIC1yZSAiXjAwMDAwMDFjXFteXG5cXSpSX1JfTU9ERVxbXlxuXF0qXG4iIAotCQkJeyBmYWlsICR0ZXN0bmFtZSB9Ci0JICAgICAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0JCX0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCSAgICBpZiBbZXhwciAkeD09OF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQl9IGVsc2UgewotCSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQl9Ci0gICAgfQotfQotCi1wcm9jIGRvX2Z1bmN0aW9uX3JlbG9jX2J1ZyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJmdW5jcmVsb2NidWcuczogVGVzdCBmb3IgcmVsb2MgYnVnIGluIG5vbi1wbGFiZWwgZnVuY3Rpb24gcmVmZXJlbmNlIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZ1bmNyZWxvY2J1Zy5zIiAiIiAiVGVzdCBmb3IgcmVsb2MgYnVnIGluIG5vbi1wbGFiZWwgZnVuY3Rpb24gcmVmZXJlbmNlIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGNvcnJlY3QgcmVsb2NhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZS4KLQkjIGJyYW5jaC9jYWxsCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wMDAwMDBjY1xbXlxuXF0qZjJfX180XFteXG4rXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIl4wMDAwMDBkMFxbXlxuXF0qZjJfX180XFteXG4rXF0qXG4iICAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0gICAgICAgICAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09Ml0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLQotCXNldCB0ZXN0bmFtZSAiZnVuY3JlbG9jYnVnLnM6IFRlc3QgZm9yIHJlbG9jIGJ1ZyBpbiBub24tcGxhYmVsIGZ1bmN0aW9uIHJlZmVyZW5jZSAocGFydDMpIgotCXNldCB4IDAKLQotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi0tcHJlZml4LWFkZHJlc3NlcyAtZCIKLQkjIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgcHV0IGFueXRoaW5nIGluIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYhCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JICAgICAgICAtcmUgIl4wMDAwMDBjY1xbXlxuXF0qbGRpbCAwLHIyMFxbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIl4wMDAwMDBkMFxbXlxuXF0qbGRvIDBcW1woXF0rcjIwXFtcKVxdKyxyMTlcW15cblxdKlxuIiAKLQkJICAgIHsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAgICAgLXJlICJcW15cblxdKlxuIgkJeyB9Ci0JICAgICAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgICAgICBlb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLQotfQotCi1wcm9jIGRvX3Jfbm9fcmVsb2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAicl9ub19yZWxvYy5zOiBUZXN0IGZvciByZWxvYyBidWcgaW4gNC1ieXRlIFJfTk9fUkVMQ09BVElPTiBmaXh1cHMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicl9ub19yZWxvYy5zIiAiIiAiVGVzdCBmb3IgcmVsb2MgYnVnIGluIDQtYnl0ZSBSX05PX1JFTE9DQVRJT04gZml4dXBzIChwYXJ0IDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1yIgotCi0JIyBNYWtlIHN1cmUgR0FTIGdlbmVyYXRlZCBhIGNvcnJlY3QgcmVsb2NhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZS4KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkgICAgICAgIC1yZSAiXjAwMGMwMDA0XFteXG5cXSpQTEFCRUxcW15cbl0qZ1xbXlxuXF0qXG4iIAotCQkgICAgeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgICAgICAtcmUgIlxbXlxuXF0qXG4iCQl7IH0KLQkgICAgICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgICAgIGVvZgkJCQl7IGJyZWFrIH0KLSAgICAgICAgICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotCi0gICAgfQotfQotCi1wcm9jIGRvX3BpY19yZWxvY2F0aW9uX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAicGljcmVsb2MuczogVGVzdCBmb3IgcHJvcGVyIFBJQyByZWxvY2F0aW9uIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgICMgRUxGIChvc2YpIGRvZXNuJ3QgcmVhbGx5IGhhbmRsZSBleHRyYSBzZWN0aW9ucyB0b28gd2VsbC4uLgotICAgIGlmIFtpc3RhcmdldCBocHBhKi0qLSplbGYqXSB0aGVuIHsKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgZ2FzX3N0YXJ0ICJwaWNyZWxvYy5zIiAiLWFsIgotCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDAwMDAwMDA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2FwcGx5X3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiYXBwbHlidWcuczogVGVzdCBmb3IgcHJvcGVyIGZpeHVwIGFwcGxpYXRpb24gKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgIyBFTEYgKG9zZikgZG9lc24ndCByZWFsbHkgaGFuZGxlIGV4dHJhIHNlY3Rpb25zIHRvbyB3ZWxsLi4uCi0gICAgaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCXJldHVybjsKLSAgICB9Ci0KLSAgICBnYXNfc3RhcnQgImFwcGx5YnVnLnMiICItYWwiCi0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDAwMDAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDAwMDAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAwMDAwMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLWlmIFtpc3RhcmdldCBocHBhKi0qLSpdIHRoZW4gewotICAgICMgTWFrZSBzdXJlIHdlIHB1dCB0aGUgcmlnaHQgcmVsb2NhdGlvbiBlbnRyeSBvbiBhIEJMRSBpbnN0cnVjdGlvbi4KLSAgICBkb19ibGVfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSByZWxvY2F0aW9uIHJlZHVjdGlvbnMgYXJlIG5vdCB0b28gYWdyZXNzaXZlIGFib3V0Ci0gICAgIyBhZGp1c3RpbmcgcmVsb2NhdGlvbnMgYWdhaW5zdCBzb21lIHN5bWJvbHMuCi0gICAgZG9fcmVsb2NhdGlvbl9yZWR1Y3Rpb25fdGVzdHMKLQotICAgICMgQ2hlY2sgdGhhdCBtb2RlIHNlbGVjdG9ycyBvbiBhIGJsZSBpbnN0cnVjdGlvbiBhY3R1YWxseSB3b3JrLgotICAgIGRvX2JsZV9tb2RlX3NlbGVjdG9yX3Rlc3QKLQotICAgICMgQ2hlY2sgdGhhdCB3ZSB0YWtlIHRoZSAtOCBhZGp1c3RtZW50IGludG8gYWNjb3VudCB3aGVuIHplcm9pbmcKLSAgICAjIG91dCB0aGUgZGlzcGxhY2VtZW50IGZpZWxkIGluIGEgYmxlIGluc3RydWN0aW9uIHdpdGggYSByZWxvYwotICAgIGRvX2JsZV9yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgMS4zNiBzaW1wbHkgZGlkbid0IGdlbmVyYXRlIGFsbCB0aGUgcGxhYmVscyBpdCBzaG91bGQgaGF2ZS4gIE1ha2UKLSAgICAjIHN1cmUgZ2FzLTIgZG9lcy4KLSAgICBkb19wbGFiZWxfcmVsb2NhdGlvbl90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSBhIGZpZWxkIHNlbGVjdG9yIG9ubHkgZWZmZWN0cyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbgotICAgICMgb3IgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KLSAgICBkb19zZWxlY3Rvcl9zY29wZV90ZXN0Ci0KLSAgICAjIFRoaXMgc2hvdWxkIHJlYWxseSBnZW5lcmF0ZSBhIHJlbG9jYXRpb24uICBJdCB3b3VsZCBtYWtlIGxpZmUgbXVjaAotICAgICMgZWFzaWVyIG9uIHRoZSBvcHRpbWl6aW5nIGxpbmtlci4gIFVudGlsIHRoZW4ganVzdCBtYWtlIHN1cmUgdGhlIAotICAgICMgZGlmZmVyZW5jZSBpcyBjb21wdXRlZCBjb3JyZWN0bHkuCi0gICAgZG9fbG9jYWxfbGFiZWxfYXNfb3BlcmFuZF90ZXN0Ci0KLSAgICAjIEdBUzIgaW5jb3JyZWN0bHkgZ2VuZXJhdGVkIFJfRVhJVCByZWxvY2F0aW9ucyB3aGVuIC5leGl0IGRpcmVjdGl2ZXMKLSAgICAjIHdlcmUgbm90IGluIHRoZSBzb3VyY2UgY29kZS4KLSAgICBkb19leGl0X3JlbG9jYXRpb25fdGVzdAotCi0gICAgIyBHQVMyIGluY29ycmVjdGx5IHRob3VnaHQgaXQgY291bGQgYXBwbHkgYSBmaXh1cCBmb3IgYSBwYy1yZWxhdGl2ZQotICAgICMgYnJhbmNoL2NhbGwgd2hpY2ggY3Jvc3NlZCBkaWZmZXJlbnQgc3Vic3BhY2VzLgotICAgICMgQWxzbyBjaGVjayB0aGF0IHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gaXMgY29ycmVjdAotICAgIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMQotICAgIGRvX2Nyb3NzX3NwYWNlX2ZpeHVwX3Rlc3RfMgotCi0gICAgIyBNYWtlIHN1cmUgd2Ugc3dpdGNoIHJvdW5kaW5nIG1vZGVzIGNvcnJlY3RseQotICAgIGRvX3JvdW5kX21vZGVfdGVzdAotCi0gICAgIyBUZXN0IGZvciBhIGJ1ZyBmb3VuZCB3aGVuIGEgZnVuY3Rpb24gd2FzIHVzZWQgaW4gYSBub24tYnJhbmNoaW5nCi0gICAgIyBpbnN0cnVjdGlvbiAqd2l0aG91dCogYSBwbGFiZWwgKGZvciBwb3J0YWJsZSBydW50aW1lIG1vZGVsKQotICAgIGRvX2Z1bmN0aW9uX3JlbG9jX2J1ZwotCi0gICAgIyBUZXN0IGZvciBhbiBvZmYtYnktb25lIGJ1ZyBpbiB0aGUgaGFuZGxpbmcgb2YgNC1ieXRlIFJfTk9fUkVMT0NBVElPTgotICAgICMgZml4dXBzLgotICAgIGRvX3Jfbm9fcmVsb2MKLQotICAgICMgVGVzdCBhIHJlbG9jYXRpb24gcHJvYmxlbSB3aGljaCBzaG93cyB1cCB3aGVuIGJ1aWxkaW5nIHNoYXJlZAotICAgICMgbGlicmFyaWVzIGluIFNPTQotICAgIGRvX3BpY19yZWxvY2F0aW9uX3Rlc3QKLQotICAgICMgVGVzdCBhIHByb2JsZW0gd2l0aCBtZF9hcHBseV9maXggdGhhdCB3YXMgaW50cm9kdWNlZCB3aGVuIGZpeGluZwotICAgICMgdGhlIHBpYyByZWxvY2F0aW9uIHRlc3QuCi0gICAgZG9fYXBwbHlfdGVzdAotCi0gICAgIyBNYWtlIHN1cmUgZ2FzIGRvZXNuJ3QgcmVzb2x2ZSBsb25nLWNhbGxzIHdoaWNoIGFyZSB0byBiZSBmaXhlZAotICAgICMgYnkgdGhlIGxpbmtlcgotICAgIGdhc190ZXN0ICJsb25nY2FsbC5zIiAiIiAiIiAiQXZvaWQgcmVzb2x2aW5nIGxvbmctY2FsbHMiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9yb3VuZG1vZGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4N2U2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3JlbG9jL3JvdW5kbW9kZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1VCU1BBICRCU1MkLFFVQUQ9MSxBTElHTj04LEFDQ0VTUz0zMSxaRVJPLFNPUlQ9ODIKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLklNUE9SVCBmb28sZGF0YQotCi07IFN3aXRjaCBpbi9vdXQgb2YgZGlmZmVyZW50IHJvdW5kaW5nIG1vZGVzLgotOyBBbHNvIG1ha2Ugc3VyZSB3ZSAib3B0aW1pemUiIGF3YXkgdXNlbGVzcyByb3VuZGluZyBtb2RlIHJlbG9jYXRpb25zCi0JYWRkaWwgICBMUidmb28tMHgxMjM0NSwlcjI3Ci0JbGRvCVJSJ2Zvby0weDEyMzQ1KCVyMSksJXIxCi0JYWRkaWwgICBMJ2Zvby0weDEyMzQ1LCVyMjcKLQlsZG8JUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQotCWFkZGlsICAgTFInZm9vLTB4MTIzNDUsJXIyNwotCWxkbwlSUidmb28tMHgxMjM0NSglcjEpLCVyMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS9yZWxvYy9zZWxlY3RvcmJ1Zy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTI1ZDM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvcmVsb2Mvc2VsZWN0b3JidWcucworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5FWFBPUlQgaW50VmVjX2Vycm9yX2hhbmRsZXIsREFUQQotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi1pbnRWZWNfZXJyb3JfaGFuZGxlcjoKLQkud29yZCBQJWRlZmF1bHRfaW50VmVjX2Vycm9yX2hhbmRsZXJfX0ZQQ2MKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBmb28sQ09ERQotCS5FWFBPUlQgZm9vLEVOVFJZLFBSSVZfTEVWPTMKLWZvbzoKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0wCi0JLkVOVFJZCi0JLnN0YWJkIDY4LDAsNDEKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkMjQwOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduMy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLmJsb2NreiA0Ci0KLW1haW46Ci0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5QUk9DCi0JLkNBTExJTkZPIEZSQU1FPTAKLQkuRU5UUlkKLQlub3AKLQkuRVhJVAotCS5QUk9DRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9hbGlnbjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyZjk5Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2FsaWduNC5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLnNwYWNlICRURVhUJAotCS5zdWJzcGEgJFlBQkJBJAotCS5zdWJzcGEgJE1JTExJQ09ERSQKLQkuYWxpZ24gNjQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvYnJsZW5idWcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlNWM3ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2JybGVuYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLmFsaWduIDQKLWRvbmVfX18yCi0JLndvcmQgMAotCS5JTVBPUlQgbWVtc2V0LENPREUKLQkuRVhQT1JUIHJlX3N5bnRheF9vcHRpb25zLERBVEEKLQkuYWxpZ24gNAotcmVfc3ludGF4X29wdGlvbnMKLQkud29yZCAwCi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi0KLQkuYWxpZ24gNAotcmVfZXJyb3JfbXNnCi0JLndvcmQgMAotCS53b3JkIEwkQzAwMDAKLQkud29yZCBMJEMwMDAxCi0JLndvcmQgTCRDMDAwMgotCS53b3JkIEwkQzAwMDMKLQkud29yZCBMJEMwMDA0Ci0JLndvcmQgTCRDMDAwNQotCS53b3JkIEwkQzAwMDYKLQkud29yZCBMJEMwMDA3Ci0JLndvcmQgTCRDMDAwOAotCS53b3JkIEwkQzAwMDkKLQkud29yZCBMJEMwMDEwCi0JLndvcmQgTCRDMDAxMQotCS53b3JkIEwkQzAwMTIKLQkud29yZCBMJEMwMDEzCi0JLndvcmQgTCRDMDAxNAotCS53b3JkIEwkQzAwMTUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJAotCi0JLmFsaWduIDQKLUwkQzAwMTUKLQkuU1RSSU5HICJVbm1hdGNoZWQgKSBvciBcXClceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDE0Ci0JLlNUUklORyAiUmVndWxhciBleHByZXNzaW9uIHRvbyBiaWdceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDEzCi0JLlNUUklORyAiUHJlbWF0dXJlIGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb25ceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDEyCi0JLlNUUklORyAiSW52YWxpZCBwcmVjZWRpbmcgcmVndWxhciBleHByZXNzaW9uXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAxMQotCS5TVFJJTkcgIk1lbW9yeSBleGhhdXN0ZWRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDEwCi0JLlNUUklORyAiSW52YWxpZCByYW5nZSBlbmRceDAwIgotCS5hbGlnbiA0Ci1MJEMwMDA5Ci0JLlNUUklORyAiSW52YWxpZCBjb250ZW50IG9mIFxce1xcfVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDgKLQkuU1RSSU5HICJVbm1hdGNoZWQgXFx7XHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwNwotCS5TVFJJTkcgIlVubWF0Y2hlZCAoIG9yIFxcKFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDYKLQkuU1RSSU5HICJVbm1hdGNoZWQgWyBvciBbXlx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDUKLQkuU1RSSU5HICJJbnZhbGlkIGJhY2sgcmVmZXJlbmNlXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwNAotCS5TVFJJTkcgIlRyYWlsaW5nIGJhY2tzbGFzaFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDMKLQkuU1RSSU5HICJJbnZhbGlkIGNoYXJhY3RlciBjbGFzcyBuYW1lXHgwMCIKLQkuYWxpZ24gNAotTCRDMDAwMgotCS5TVFJJTkcgIkludmFsaWQgY29sbGF0aW9uIGNoYXJhY3Rlclx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDEKLQkuU1RSSU5HICJJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvblx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMDAKLQkuU1RSSU5HICJObyBtYXRjaFx4MDAiCi0JLkVYUE9SVCByZV9tYXhfZmFpbHVyZXMsREFUQQotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICREQVRBJAotCi0JLmFsaWduIDQKLXJlX21heF9mYWlsdXJlcwotCS53b3JkIDIwMDAKLQkuSU1QT1JUIG1hbGxvYyxDT0RFCi0JLklNUE9SVCByZWFsbG9jLENPREUKLQkuSU1QT1JUIGZyZWUsQ09ERQotCS5JTVBPUlQgc3RyY21wLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJAotCi0JLmFsaWduIDQKLUwkQzAwMTYKLQkuU1RSSU5HICJhbG51bVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTcKLQkuU1RSSU5HICJhbHBoYVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTgKLQkuU1RSSU5HICJibGFua1x4MDAiCi0JLmFsaWduIDQKLUwkQzAwMTkKLQkuU1RSSU5HICJjbnRybFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMjAKLQkuU1RSSU5HICJkaWdpdFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMjEKLQkuU1RSSU5HICJncmFwaFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMjIKLQkuU1RSSU5HICJsb3dlclx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMjMKLQkuU1RSSU5HICJwcmludFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMjQKLQkuU1RSSU5HICJwdW5jdFx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMjUKLQkuU1RSSU5HICJzcGFjZVx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMjYKLQkuU1RSSU5HICJ1cHBlclx4MDAiCi0JLmFsaWduIDQKLUwkQzAwMjcKLQkuU1RSSU5HICJ4ZGlnaXRceDAwIgotCS5JTVBPUlQgX19hbG51bSxEQVRBCi0JLklNUE9SVCBfX2N0eXBlMixEQVRBCi0JLklNUE9SVCBfX2N0eXBlLERBVEEKLQkuSU1QT1JUIGF0X2JlZ2xpbmVfbG9jX3AsQ09ERQotCS5JTVBPUlQgYXRfZW5kbGluZV9sb2NfcCxDT0RFCi0JLklNUE9SVCBzdG9yZV9vcDEsQ09ERQotCS5JTVBPUlQgaW5zZXJ0X29wMSxDT0RFCi0JLklNUE9SVCBzdG9yZV9vcDIsQ09ERQotCS5JTVBPUlQgaW5zZXJ0X29wMixDT0RFCi0JLklNUE9SVCBjb21waWxlX3JhbmdlLENPREUKLQkuSU1QT1JUIGdyb3VwX2luX2NvbXBpbGVfc3RhY2ssQ09ERQotCS5TUEFDRSAkVEVYVCQKLQkuU1VCU1BBICRDT0RFJAotCi0JLmFsaWduIDQKLXJlZ2V4X2NvbXBpbGUKLQkuUFJPQwotCS5DQUxMSU5GTyBGUkFNRT0zMjAsQ0FMTFMsU0FWRV9SUCxFTlRSWV9HUj0xOAotCS5FTlRSWQotCXN0dyAlcjIsLTIwKCVyMzApIDsjIDg5ODkgcmVsb2FkX291dHNpKzIvNgotCWxkbyAzMjAoJXIzMCksJXIzMCA7IyA4OTkxIGFkZHNpMy8yCi0Jc3R3ICVyMTgsLTE2OCglcjMwKSA7IyA4OTkzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNywtMTY0KCVyMzApIDsjIDg5OTUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjE2LC0xNjAoJXIzMCkgOyMgODk5NyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTUsLTE1NiglcjMwKSA7IyA4OTk5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNCwtMTUyKCVyMzApIDsjIDkwMDEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEzLC0xNDgoJXIzMCkgOyMgOTAwMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMTIsLTE0NCglcjMwKSA7IyA5MDA1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxMSwtMTQwKCVyMzApIDsjIDkwMDcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjEwLC0xMzYoJXIzMCkgOyMgOTAwOSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyOSwtMTMyKCVyMzApIDsjIDkwMTEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjgsLTEyOCglcjMwKSA7IyA5MDEzIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LC0xMjQoJXIzMCkgOyMgOTAxNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNiwtMTIwKCVyMzApIDsjIDkwMTcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjUsLTExNiglcjMwKSA7IyA5MDE5IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LC0xMTIoJXIzMCkgOyMgOTAyMSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMywtMTA4KCVyMzApIDsjIDkwMjMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjI2LC0yNzYoJXIzMCkgOyMgNCByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDAsJXI5IDsjIDI1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMCwlcjggOyMgMjggcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjAsLTI2MCglcjMwKSA7IyAzNCByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDAsJXIxMCA7IyAzMSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDY0MCwlcjI2IDsjIDM3IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODc3NCByZWxvYWRfb3V0c2krMi81Ci0JY29weSAlcjI0LCVyMTUgOyMgOCByZWxvYWRfb3V0c2krMi8xCi0Jc3R3ICVyMSwtMjk2KCVyMzApIDsjIDIzMjUgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIyMywlcjUgOyMgMTAgcmVsb2FkX291dHNpKzIvMQotCWFkZGwgJXIxLCVyMjUsJXIxNiA7IyAxOSBhZGRzaTMvMQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbWFsbG9jLCVyMiA7IyAzOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyAyMCglcjUpLCVyMTQgOyMgMjIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLDw+IDAsJXIyOCxMJDAwMjEgOyMgNDggYmxldSsxCi0Jc3R3ICVyMjgsLTMxMiglcjMwKSA7IyA0MyByZWxvYWRfb3V0c2krMi82Ci1MJDA5NTMKLQlibCBMJDA4NjcsJXIwIDsjIDUzIGp1bXAKLQlsZGkgMTIsJXIyOCA7IyA1MSByZWxvYWRfb3V0c2krMi8yCi1MJDAwMjEKLQlsZGkgMzIsJXIxOSA7IyA1OCByZWxvYWRfb3V0c2krMi8yCi0Jc3R3ICVyMTksLTMwOCglcjMwKSA7IyA1OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCwtMzA0KCVyMzApIDsjIDYyIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIxNSwxMiglcjUpIDsjIDY1IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIwLDgoJXI1KSA7IyA4NSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMCwyNCglcjUpIDsjIDg4IHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRpbCBMUidkb25lX19fMi0kZ2xvYmFsJCwlcjI3IDsjIDkyIHBpYzJfbG9fc3VtKzEKLQlsZHcgMjgoJXI1KSwlcjE5IDsjIDY4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgUlInZG9uZV9fXzItJGdsb2JhbCQoJXIxKSwlcjIwIDsjIDk0IHJlbG9hZF9vdXRzaSsyLzUKLQlkZXBpIDAsMywxLCVyMTkgOyMgNjkgYW5kc2kzLzIKLQlkZXBpIDAsNiwyLCVyMTkgOyMgODAgYW5kc2kzLzIKLQljb21pYiw8PiAwLCVyMjAsTCQwMDIyIDsjIDk1IGJsZXUrMQotCXN0dyAlcjE5LDI4KCVyNSkgOyMgODIgcmVsb2FkX291dHNpKzIvNgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCwlcjI3IDsjIDk5IHBpYzJfbG9fc3VtKzEKLQlsZG8gUlIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkKCVyMSksJXI0IDsjIDEwMCBtb3ZoaS0yCi0JY29weSAlcjQsJXIyNiA7IyAxMDEgcmVsb2FkX291dHNpKzIvMQotCWxkaSAwLCVyMjUgOyMgMTAyIHJlbG9hZF9vdXRzaSsyLzIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIG1lbXNldCwlcjIgOyMgMTA0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGRpIDI1NiwlcjI0IDsjIDEwMyByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEsJXIyMCA7IyA4NzMyIG1vdnFpKzEvMgotCWxkbyA5NyglcjQpLCVyMTkgOyMgODczNiBhZGRzaTMvMgotCWxkbyAxMjIoJXI0KSwlcjQgOyMgODczOCBhZGRzaTMvMgotCXN0YnMsbWEgJXIyMCwxKCVyMTkpIDsjIDExNSBtb3ZxaSsxLzYKLUwkMTE1NQotCWNvbWIsPj0sbiAlcjQsJXIxOSxMJDExNTUgOyMgMTIxIGJsZXUrMQotCXN0YnMsbWEgJXIyMCwxKCVyMTkpIDsjIDExNSBtb3ZxaSsxLzYKLQlsZGkgMSwlcjIxIDsjIDg3MTcgbW92cWkrMS8yCi0JYWRkaWwgTFIncmVfc3ludGF4X3RhYmxlLSRnbG9iYWwkLCVyMjcgOyMgODcxMiBwaWMyX2xvX3N1bSsxCi0JbGRvIFJSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCglcjEpLCVyMTkgOyMgODcxNSBtb3ZoaS0yCi0JbGRvIDY1KCVyMTkpLCVyMjAgOyMgODcyMSBhZGRzaTMvMgotCWxkbyA5MCglcjE5KSwlcjE5IDsjIDg3MjMgYWRkc2kzLzIKLQlzdGJzLG1hICVyMjEsMSglcjIwKSA7IyAxMzggbW92cWkrMS82Ci1MJDExNTYKLQljb21iLD49LG4gJXIxOSwlcjIwLEwkMTE1NiA7IyAxNDQgYmxldSsxCi0Jc3RicyxtYSAlcjIxLDEoJXIyMCkgOyMgMTM4IG1vdnFpKzEvNgotCWxkaSA0OCwlcjIwIDsjIDE1MSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDU3LCVyMjIgOyMgNzk3NiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEsJXIyMSA7IyA4NzA3IG1vdnFpKzEvMgotCWFkZGlsIExSJ3JlX3N5bnRheF90YWJsZS0kZ2xvYmFsJCs0OCwlcjI3IDsjIDg3MDUgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQrNDgoJXIxKSwlcjE5IDsjIDg3MTEgbW92aGktMgotTCQwMDM3Ci0JbGRvIDEoJXIyMCksJXIyMCA7IyAxNjQgYWRkc2kzLzIKLQljb21iLD49ICVyMjIsJXIyMCxMJDAwMzcgOyMgMTY3IGJsZXUrMQotCXN0YnMsbWEgJXIyMSwxKCVyMTkpIDsjIDE2MSBtb3ZxaSsxLzYKLQlhZGRpbCBMUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQsJXIyNyA7IyAxNzQgcGljMl9sb19zdW0rMQotCWxkbyBSUidyZV9zeW50YXhfdGFibGUtJGdsb2JhbCQoJXIxKSwlcjE5IDsjIDE3NSBtb3ZoaS0yCi0JbGRpIDEsJXIyMCA7IyAxNzYgbW92cWkrMS8yCi0Jc3RiICVyMjAsOTUoJXIxOSkgOyMgMTc3IG1vdnFpKzEvNgotCWFkZGlsIExSJ2RvbmVfX18yLSRnbG9iYWwkLCVyMjcgOyMgMTc4IHBpYzJfbG9fc3VtKzEKLQlsZGkgMSwlcjE5IDsjIDE4MCByZWxvYWRfb3V0c2krMi8yCi0Jc3R3ICVyMTksUlInZG9uZV9fXzItJGdsb2JhbCQoJXIxKSA7IyAxODEgcmVsb2FkX291dHNpKzIvNgotTCQwMDIyCi0JbGR3IDQoJXI1KSwlcjE5IDsjIDE4NyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwMDM5IDsjIDE4OSBibGV1KzEKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTkzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9LG4gMCwlcjI2LEwkMDA0MCA7IyAxOTUgYmxldSsxCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAyMDUgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNSA7IyAyMDMgcmVsb2FkX291dHNpKzIvMgotCWJsIEwkMTE1NywlcjAgOyMgMjExIGp1bXAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgMjIzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDA0MAotCS5DQUxMIEFSR1cwPUdSCi0JYmwgbWFsbG9jLCVyMiA7IyAyMTkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNiA7IyAyMTcgcmVsb2FkX291dHNpKzIvMgotCXN0dyAlcjI4LDAoJXI1KSA7IyAyMjMgcmVsb2FkX291dHNpKzIvNgotTCQxMTU3Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDIyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4gMCwlcjE5LEwkMDA0MiA7IyAyMzAgYmxldSsxCi0JbGRpIDMyLCVyMTkgOyMgMjQzIHJlbG9hZF9vdXRzaSsyLzIKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDIzNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMjMyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDIzOCBqdW1wCi0JbGRpIDEyLCVyMjggOyMgNTEgcmVsb2FkX291dHNpKzIvMgotTCQwMDQyCi0Jc3R3ICVyMTksNCglcjUpIDsjIDI0NCByZWxvYWRfb3V0c2krMi82Ci1MJDAwMzkKLQlsZHcgMCglcjUpLCVyNiA7IyAyNDkgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgNzk4MSByZWxvYWRfb3V0c2krMi81Ci0JY29tY2xyLDw+ICVyMTYsJXIxOSwlcjAgOyMgNzk4MiBibGV1KzEKLQlibCBMJDAwNDQsJXIwCi0JY29weSAlcjYsJXIxMiA7IyAyNTMgcmVsb2FkX291dHNpKzIvMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMzNCByZWxvYWRfb3V0c2krMi81Ci1MJDExNzgKLQlsZGJzLG1hIDEoJXIxOSksJXI3IDsjIDI3NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAwNDcgOyMgMjgyIGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjMzNyByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDI4MyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyODYgemVyb19leHRlbmRxaXNpMi8yCi1MJDAwNDcKLQlsZG8gLTEwKCVyNyksJXIxOSA7IyA3ODk1IGFkZHNpMy8yCi0JYWRkaSx1diAtMTE1LCVyMTksJXIwIDsjIDc4OTYgY2FzZXNpMAotCWJscixuICVyMTksJXIwCi0JYixuIEwkMDA3NgotTCQwODYzCi0JYmwgTCQwMzc2LCVyMAotCW5vcCA7IyA5MDkyIHN3aXRjaF9qdW1wCi1MJDA5NTQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkwOTUgc3dpdGNoX2p1bXAKLUwkMDk1NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTA5OCBzd2l0Y2hfanVtcAotTCQwOTU2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTAxIHN3aXRjaF9qdW1wCi1MJDA5NTcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMDQgc3dpdGNoX2p1bXAKLUwkMDk1OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEwNyBzd2l0Y2hfanVtcAotTCQwOTU5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTEwIHN3aXRjaF9qdW1wCi1MJDA5NjAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMTMgc3dpdGNoX2p1bXAKLUwkMDk2MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTExNiBzd2l0Y2hfanVtcAotTCQwOTYyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTE5IHN3aXRjaF9qdW1wCi1MJDA5NjMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMjIgc3dpdGNoX2p1bXAKLUwkMDk2NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEyNSBzd2l0Y2hfanVtcAotTCQwOTY1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTI4IHN3aXRjaF9qdW1wCi1MJDA5NjYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxMzEgc3dpdGNoX2p1bXAKLUwkMDk2NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTEzNCBzd2l0Y2hfanVtcAotTCQwOTY4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTM3IHN3aXRjaF9qdW1wCi1MJDA5NjkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDAgc3dpdGNoX2p1bXAKLUwkMDk3MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE0MyBzd2l0Y2hfanVtcAotTCQwOTcxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTQ2IHN3aXRjaF9qdW1wCi1MJDA5NzIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNDkgc3dpdGNoX2p1bXAKLUwkMDk3MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE1MiBzd2l0Y2hfanVtcAotTCQwOTc0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTU1IHN3aXRjaF9qdW1wCi1MJDA5NzUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNTggc3dpdGNoX2p1bXAKLUwkMDk3NgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE2MSBzd2l0Y2hfanVtcAotTCQwOTc3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTY0IHN3aXRjaF9qdW1wCi1MJDA5NzgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNjcgc3dpdGNoX2p1bXAKLUwkMDk3OQotCWJsIEwkMDA3NywlcjAgOyMgOTE3MCBzd2l0Y2hfanVtcAotCWxkdyAtMjk2KCVyMzApLCVyMjYgOyMgMjM0OSByZWxvYWRfb3V0c2krMi81Ci1MJDA5ODAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxNzMgc3dpdGNoX2p1bXAKLUwkMDk4MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE3NiBzd2l0Y2hfanVtcAotTCQwOTgyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MTc5IHN3aXRjaF9qdW1wCi1MJDA5ODMKLQlibCBMJDAzNjgsJXIwCi0Jbm9wIDsjIDkxODIgc3dpdGNoX2p1bXAKLUwkMDk4NAotCWJsIEwkMDM3MiwlcjAKLQlub3AgOyMgOTE4NSBzd2l0Y2hfanVtcAotTCQwOTg1Ci0JYmwgTCQwMTA0LCVyMAotCW5vcCA7IyA5MTg4IHN3aXRjaF9qdW1wCi1MJDA5ODYKLQlibCBMJDExNTgsJXIwIDsjIDkxOTEgc3dpdGNoX2p1bXAKLQlsZGkgMTAyNiwlcjE5IDsjIDY2MiByZWxvYWRfb3V0c2krMi8yCi1MJDA5ODcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkxOTQgc3dpdGNoX2p1bXAKLUwkMDk4OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTE5NyBzd2l0Y2hfanVtcAotTCQwOTg5Ci0JYmwgTCQwMTk2LCVyMCA7IyA5MjAwIHN3aXRjaF9qdW1wCi0JbGR3IDAoJXI1KSwlcjQgOyMgODAyNyByZWxvYWRfb3V0c2krMi81Ci1MJDA5OTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMDMgc3dpdGNoX2p1bXAKLUwkMDk5MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIwNiBzd2l0Y2hfanVtcAotTCQwOTkyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjA5IHN3aXRjaF9qdW1wCi1MJDA5OTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMTIgc3dpdGNoX2p1bXAKLUwkMDk5NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIxNSBzd2l0Y2hfanVtcAotTCQwOTk1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjE4IHN3aXRjaF9qdW1wCi1MJDA5OTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMjEgc3dpdGNoX2p1bXAKLUwkMDk5NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIyNCBzd2l0Y2hfanVtcAotTCQwOTk4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjI3IHN3aXRjaF9qdW1wCi1MJDA5OTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzAgc3dpdGNoX2p1bXAKLUwkMTAwMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTIzMyBzd2l0Y2hfanVtcAotTCQxMDAxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjM2IHN3aXRjaF9qdW1wCi1MJDEwMDIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyMzkgc3dpdGNoX2p1bXAKLUwkMTAwMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI0MiBzd2l0Y2hfanVtcAotTCQxMDA0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjQ1IHN3aXRjaF9qdW1wCi1MJDEwMDUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNDggc3dpdGNoX2p1bXAKLUwkMTAwNgotCWJsIEwkMDEwMSwlcjAgOyMgOTI1MSBzd2l0Y2hfanVtcAotCWxkaSAxMDI2LCVyMTkgOyMgNjYyIHJlbG9hZF9vdXRzaSsyLzIKLUwkMTAwNwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI1NCBzd2l0Y2hfanVtcAotTCQxMDA4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjU3IHN3aXRjaF9qdW1wCi1MJDEwMDkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjAgc3dpdGNoX2p1bXAKLUwkMTAxMAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI2MyBzd2l0Y2hfanVtcAotTCQxMDExCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjY2IHN3aXRjaF9qdW1wCi1MJDEwMTIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNjkgc3dpdGNoX2p1bXAKLUwkMTAxMwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI3MiBzd2l0Y2hfanVtcAotTCQxMDE0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjc1IHN3aXRjaF9qdW1wCi1MJDEwMTUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyNzggc3dpdGNoX2p1bXAKLUwkMTAxNgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI4MSBzd2l0Y2hfanVtcAotTCQxMDE3Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mjg0IHN3aXRjaF9qdW1wCi1MJDEwMTgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyODcgc3dpdGNoX2p1bXAKLUwkMTAxOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5MCBzd2l0Y2hfanVtcAotTCQxMDIwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MjkzIHN3aXRjaF9qdW1wCi1MJDEwMjEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkyOTYgc3dpdGNoX2p1bXAKLUwkMTAyMgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTI5OSBzd2l0Y2hfanVtcAotTCQxMDIzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzAyIHN3aXRjaF9qdW1wCi1MJDEwMjQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMDUgc3dpdGNoX2p1bXAKLUwkMTAyNQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMwOCBzd2l0Y2hfanVtcAotTCQxMDI2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzExIHN3aXRjaF9qdW1wCi1MJDEwMjcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMTQgc3dpdGNoX2p1bXAKLUwkMTAyOAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMxNyBzd2l0Y2hfanVtcAotTCQxMDI5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzIwIHN3aXRjaF9qdW1wCi1MJDEwMzAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMjMgc3dpdGNoX2p1bXAKLUwkMTAzMQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTMyNiBzd2l0Y2hfanVtcAotTCQxMDMyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzI5IHN3aXRjaF9qdW1wCi1MJDEwMzMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzMzIgc3dpdGNoX2p1bXAKLUwkMTAzNAotCWJsIEwkMDIxNiwlcjAgOyMgOTMzNSBzd2l0Y2hfanVtcAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQxOCByZWxvYWRfb3V0c2krMi81Ci1MJDEwMzUKLQlibCBMJDAzODcsJXIwIDsjIDkzMzggc3dpdGNoX2p1bXAKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDM3OTcgcmVsb2FkX291dHNpKzIvNQotTCQxMDM2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzQxIHN3aXRjaF9qdW1wCi1MJDEwMzcKLQlibCBMJDAwNTMsJXIwIDsjIDkzNDQgc3dpdGNoX2p1bXAKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODc3NyByZWxvYWRfb3V0c2krMi81Ci1MJDEwMzgKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNDcgc3dpdGNoX2p1bXAKLUwkMTAzOQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1MCBzd2l0Y2hfanVtcAotTCQxMDQwCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzUzIHN3aXRjaF9qdW1wCi1MJDEwNDEKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNTYgc3dpdGNoX2p1bXAKLUwkMTA0MgotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM1OSBzd2l0Y2hfanVtcAotTCQxMDQzCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzYyIHN3aXRjaF9qdW1wCi1MJDEwNDQKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNjUgc3dpdGNoX2p1bXAKLUwkMTA0NQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM2OCBzd2l0Y2hfanVtcAotTCQxMDQ2Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzcxIHN3aXRjaF9qdW1wCi1MJDEwNDcKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzNzQgc3dpdGNoX2p1bXAKLUwkMTA0OAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM3NyBzd2l0Y2hfanVtcAotTCQxMDQ5Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5MzgwIHN3aXRjaF9qdW1wCi1MJDEwNTAKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzODMgc3dpdGNoX2p1bXAKLUwkMTA1MQotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM4NiBzd2l0Y2hfanVtcAotTCQxMDUyCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzg5IHN3aXRjaF9qdW1wCi1MJDEwNTMKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDkzOTIgc3dpdGNoX2p1bXAKLUwkMTA1NAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTM5NSBzd2l0Y2hfanVtcAotTCQxMDU1Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5Mzk4IHN3aXRjaF9qdW1wCi1MJDEwNTYKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MDEgc3dpdGNoX2p1bXAKLUwkMTA1NwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQwNCBzd2l0Y2hfanVtcAotTCQxMDU4Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDA3IHN3aXRjaF9qdW1wCi1MJDEwNTkKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTAgc3dpdGNoX2p1bXAKLUwkMTA2MAotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQxMyBzd2l0Y2hfanVtcAotTCQxMDYxCi0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDE2IHN3aXRjaF9qdW1wCi1MJDEwNjIKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0MTkgc3dpdGNoX2p1bXAKLUwkMTA2MwotCWJsIEwkMDA3NiwlcjAKLQlub3AgOyMgOTQyMiBzd2l0Y2hfanVtcAotTCQxMDY0Ci0JYmwgTCQwMDc2LCVyMAotCW5vcCA7IyA5NDI1IHN3aXRjaF9qdW1wCi1MJDEwNjUKLQlibCBMJDAwNzYsJXIwCi0Jbm9wIDsjIDk0Mjggc3dpdGNoX2p1bXAKLUwkMTA2NgotCWJsIEwkMDM4MywlcjAgOyMgOTQzMSBzd2l0Y2hfanVtcAotCWxkaSA0NjA4LCVyMjAgOyMgMzc3OCByZWxvYWRfb3V0c2krMi8yCi1MJDEwNjcKLQlibCBMJDAzODAsJXIwCi0Jbm9wIDsjIDk0MzQgc3dpdGNoX2p1bXAKLUwkMTA2OAotCWJsLG4gTCQwMDc2LCVyMCA7IyA3ODk5IGp1bXAKLUwkMDA1MwotCWxkdyAtMjk2KCVyMzApLCVyMjUgOyMgMjM0MyByZWxvYWRfb3V0c2krMi81Ci0JbGRvIDEoJXIxKSwlcjE5IDsjIDMwNiBhZGRzaTMvMgotCWNvbWIsPSxuICVyMTksJXIyNSxMJDAwNTUgOyMgMzA4IGJsZXUrMQotCWJiLDwgJXIxNSwyOCxMJDAwNTUgOyMgMzEzIGJsZXUrMwotCWxkdyAtMjc2KCVyMzApLCVyMjYgOyMgMzE1IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGF0X2JlZ2xpbmVfbG9jX3AsJXIyIDsjIDMyMSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxNSwlcjI0IDsjIDMxOSByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgMzI0IGV4dGVuZHFpc2kyCi0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDMyNiBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDA1NQotCWxkdyAwKCVyNSksJXI0IDsjIDc5ODYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3OTg5IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc5ODcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc5ODggYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAwNjAgOyMgNzk5MCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg3MDEgcmVsb2FkX291dHNpKzIvMwotTCQwMDYxCi0JY29tY2xyLDw+ICVyMywlcjIwLCVyMCA7IyAzNTcgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDM2NyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAwNjYgOyMgMzc1IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAzNjkgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDM3OCByZWxvYWRfb3V0c2krMi82Ci1MJDAwNjYKLQlsZHcgMCglcjUpLCVyMjYgOyMgMzg1IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDM4OSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyAzODcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAzOTcgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDM5MyByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDA1OSA7IyA0MDcgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0MDkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDEyIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDEzIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMDY5IDsjIDQxOCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQxNiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQxOSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDIyIGFkZHNpMy8xCi1MJDAwNjkKLQljb21pYiw9IDAsJXI4LEwkMDA3MCA7IyA0MjUgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MjYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDI5IGFkZHNpMy8xCi1MJDAwNzAKLQljb21pYiw9IDAsJXI5LEwkMDA1OSA7IyA0MzIgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MzMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDM2IGFkZHNpMy8xCi1MJDAwNTkKLQlsZHcgMCglcjUpLCVyNCA7IyAzMzcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyAzNDEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMzM4IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzMzkgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAwNjEKLQlub3AgOyMgMzQzIGJsZXUrMQotTCQwMDYwCi0JbGRpIDgsJXIxOSA7IyA0NTggbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA0NzkganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDU5IG1vdnFpKzEvNgotTCQwMDc3Ci0JY29tYiw9LG4gJXIxNiwlcjI2LEwkMDA3OSA7IyA0ODUgYmxldSsxCi0JYmIsPCAlcjE1LDI4LEwkMDA3OSA7IyA0OTAgYmxldSszCi0JY29weSAlcjE2LCVyMjUgOyMgNDk0IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIGF0X2VuZGxpbmVfbG9jX3AsJXIyIDsjIDQ5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxNSwlcjI0IDsjIDQ5NiByZWxvYWRfb3V0c2krMi8xCi0JZXh0cnMgJXIyOCwzMSw4LCVyMjggOyMgNTAxIGV4dGVuZHFpc2kyCi0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDUwMyBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDA3OQotCWxkdyAwKCVyNSksJXI0IDsjIDc5OTQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA3OTk3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc5OTUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc5OTYgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAwODQgOyMgNzk5OCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg2OTkgcmVsb2FkX291dHNpKzIvMwotTCQwMDg1Ci0JY29tY2xyLDw+ICVyMywlcjIwLCVyMCA7IyA1MzQgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDU0NCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAwOTAgOyMgNTUyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NDYgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDU1NSByZWxvYWRfb3V0c2krMi82Ci1MJDAwOTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNTYyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU2NiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA1NjQgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA1NzQgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU3MCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDA4MyA7IyA1ODQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA1ODYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTg5IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNTkwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMDkzIDsjIDU5NSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU5MyBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDU5NiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNTk5IGFkZHNpMy8xCi1MJDAwOTMKLQljb21pYiw9IDAsJXI4LEwkMDA5NCA7IyA2MDIgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2MDMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjA2IGFkZHNpMy8xCi1MJDAwOTQKLQljb21pYiw9IDAsJXI5LEwkMDA4MyA7IyA2MDkgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2MTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjEzIGFkZHNpMy8xCi1MJDAwODMKLQlsZHcgMCglcjUpLCVyNCA7IyA1MTQgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA1MTggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNTE1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA1MTYgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAwODUKLQlub3AgOyMgNTIwIGJsZXUrMQotTCQwMDg0Ci0JbGRpIDksJXIxOSA7IyA2MzUgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NTYganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjM2IG1vdnFpKzEvNgotTCQwODc3Ci0JYmwgTCQwMTEwLCVyMCA7IyA4OTcganVtcAotCXN0dyAlcjIxLC0yOTYoJXIzMCkgOyMgMjM5MSByZWxvYWRfb3V0c2krMi82Ci1MJDAxMDEKLUwkMTE1OAotCWFuZCAlcjE1LCVyMTksJXIxOSA7IyA2NjMgYW5kc2kzLzEKLQljb21pY2xyLD0gMCwlcjE5LCVyMCA7IyA2NjUgYmxldSsxCi0JYmwsbiBMJDAwNzYsJXIwCi1MJDAxMDQKLQljb21pYiw8PiAwLCVyOCxMJDAxMDUgOyMgNjc0IGJsZXUrMQotCWxkaSAwLCVyMTMgOyMgNzExIHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyw+PSAlcjE1LDI2LDEsJXIwIDsjIDY4MSBibGV1KzMKLQlleHRycyw8ICVyMTUsMjcsMSwlcjAgOyMgNzAwIG1vdnNpLTQKLQlub3AKLQlibCxuIEwkMDA3NiwlcjAKLUwkMDEwNQotCWxkaSAwLCVyMTEgOyMgNzE0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMCwlcjIyIDsjIDcxNiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDQzLCVyMjQgOyMgODY4OCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDYzLCVyMjMgOyMgODY5MCByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDQyLCVyMjggOyMgODY5MiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDIsJXIxOSA7IyA4Njk0IHJlbG9hZF9vdXRzaSsyLzIKLQlhbmQgJXIxNSwlcjE5LCVyMjUgOyMgODY5NSBhbmRzaTMvMQotCWxkaSA5MiwlcjI2IDsjIDg2OTcgcmVsb2FkX291dHNpKzIvMgotTCQwMTA5Ci0JY29tYiw9ICVyMjQsJXI3LEwkMDExMiA7IyA3MjcgYmxldSsxCi0JY29weSAlcjExLCVyMTkgOyMgODc4MCByZWxvYWRfb3V0c2krMi8xCi0JZGVwaSAtMSwzMSwxLCVyMTkgOyMgNzI5IGlvcnNpMysxLzIKLQlibCBMJDAxMTMsJXIwIDsjIDczMSBqdW1wCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzMwIGV4dGVuZHFpc2kyCi1MJDAxMTIKLQlleHRycyAlcjExLDMxLDgsJXIxOSA7IyA3MzQgZXh0ZW5kcWlzaTIKLUwkMDExMwotTCQxMTU5Ci0JY29tYiw9ICVyMjMsJXI3LEwkMDExNCA7IyA3NDQgYmxldSsxCi0JY29weSAlcjE5LCVyMTEgOyMgNzM3IHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMjIsJXIxOSA7IyA4NzgzIHJlbG9hZF9vdXRzaSsyLzEKLQlkZXBpIC0xLDMxLDEsJXIxOSA7IyA3NDYgaW9yc2kzKzEvMgotCWJsIEwkMDExNSwlcjAgOyMgNzQ4IGp1bXAKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NDcgZXh0ZW5kcWlzaTIKLUwkMDExNAotCWV4dHJzICVyMjIsMzEsOCwlcjE5IDsjIDc1MSBleHRlbmRxaXNpMgotTCQwMTE1Ci0JbGR3IC0yOTYoJXIzMCksJXIyMSA7IyAyMzU1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIxLEwkMDExMCA7IyA3NTcgYmxldSsxCi0JY29weSAlcjE5LCVyMjIgOyMgNzU0IHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMjEsJXIyMCA7IyA4NzQzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGJzLG1hIDEoJXIyMCksJXI3IDsjIDc3NiB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAxMTggOyMgNzgxIGJsZXUrMQotCXN0dyAlcjIwLC0yOTYoJXIzMCkgOyMgMjM2NCByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDc4MiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA3ODUgemVyb19leHRlbmRxaXNpMi8yCi1MJDAxMTgKLQljb21iLD0gJXIyOCwlcjcsTCQwMTA5Ci0Jbm9wIDsjIDgwMiBibGV1KzEKLQljb21pYiw8PixuIDAsJXIyNSxMJDA4NjkgOyMgODA3IGJsZXUrMQotCWNvbWIsPSAlcjI0LCVyNyxMJDExNTkgOyMgODExIGJsZXUrMQotCWV4dHJzICVyMTEsMzEsOCwlcjE5IDsjIDczNCBleHRlbmRxaXNpMgotCWNvbWIsPSAlcjIzLCVyNyxMJDAxMDkgOyMgODE1IGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjQwMCByZWxvYWRfb3V0c2krMi81Ci0JYmwsbiBMJDExNjAsJXIwIDsjIDgyNyBqdW1wCi1MJDA4NjkKLQljb21iLDw+ICVyMjYsJXI3LEwkMDEyNiA7IyA4MzEgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDAwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21jbHIsPD4gJXIxNiwlcjIwLCVyMCA7IyA4MzUgYmxldSsxCi0JYmwgTCQwOTAzLCVyMAotCWxkbyAxKCVyMjApLCVyMTkgOyMgODYzIGFkZHNpMy8yCi0JbGRiIDEoJXIyMSksJXIzIDsjIDg2MCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQljb21pYiw9IDAsJXIxNCxMJDAxMjkgOyMgODY1IGJsZXUrMQotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjM3OSByZWxvYWRfb3V0c2krMi82Ci0JYWRkbCAlcjE0LCVyMywlcjE5IDsjIDg2NiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMyA7IyA4NjkgemVyb19leHRlbmRxaXNpMi8yCi1MJDAxMjkKLQljb21iLD0gJXIyNCwlcjMsTCQwMTA5IDsjIDg4NiBibGV1KzEKLQljb3B5ICVyMywlcjcgOyMgOTAzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21iLDw+ICVyMjMsJXIzLEwkMDg3NwotCW5vcCA7IyA4OTAgYmxldSsxCi0JYmwsbiBMJDAxMDksJXIwIDsjIDkwNSBqdW1wCi1MJDAxMjYKLUwkMTE2MAotCWxkbyAtMSglcjE5KSwlcjE5IDsjIDkxMCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjM5NyByZWxvYWRfb3V0c2krMi82Ci1MJDAxMTAKLQljb21pY2xyLDw+IDAsJXI4LCVyMCA7IyA5MjcgYmxldSsxCi0JYmwgTCQxMTYxLCVyMAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSxuIDAsJXIyMixMJDAxMzcgOyMgOTM0IGJsZXUrMQotCWxkdyAwKCVyNSksJXIzIDsjIDgwMDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDA1IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMDMgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwMDQgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAxMzkgOyMgODAwNiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2ODYgcmVsb2FkX291dHNpKzIvMwotTCQwMTQwCi0JY29tY2xyLDw+ICVyNCwlcjIwLCVyMCA7IyA5NjEgYmxldSsxCi0JYmwgTCQwOTQ0LCVyMAotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDk3MSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAxNDUgOyMgOTc5IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA5NzMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDk4MiByZWxvYWRfb3V0c2krMi82Ci1MJDAxNDUKLQlsZHcgMCglcjUpLCVyMjYgOyMgOTg5IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDk5MyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA5OTEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxMDAxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA5OTcgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxMzggOyMgMTAxMSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDEwMTMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTAxNiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDEwMTcgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxNDggOyMgMTAyMiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDEwMjAgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxMDIzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxMDI2IGFkZHNpMy8xCi1MJDAxNDgKLQljb21pYiw9IDAsJXI4LEwkMDE0OSA7IyAxMDI5IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTAzMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxMDMzIGFkZHNpMy8xCi1MJDAxNDkKLQljb21pYiw9IDAsJXI5LEwkMDEzOCA7IyAxMDM2IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTAzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxMDQwIGFkZHNpMy8xCi1MJDAxMzgKLQlsZHcgMCglcjUpLCVyMyA7IyA5NDEgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA5NDUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgOTQyIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA5NDMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAxNDAKLQlub3AgOyMgOTQ3IGJsZXUrMQotTCQwMTM5Ci0JY29taWIsPSAwLCVyMTQsTCQwMTU0IDsjIDEwNjMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDAzIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgLTIoJXIxOSksJXIxOSA7IyAxMDY2IHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjE5LCVyMTkgOyMgMTA2NyBhZGRzaTMvMQotCWJsIEwkMDk0NywlcjAgOyMgMTA3MSBqdW1wCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAxMDY5IG1vdnFpKzEvNQotTCQwMTU0Ci0JbGRiIC0yKCVyMTkpLCVyMTkgOyMgMTA3NSBtb3ZxaSsxLzUKLUwkMDk0NwotCWNvbWliLD0gMCwlcjE0LEwkMDE1NiA7IyAxMDc5IGJsZXUrMQotCWV4dHJzICVyMTksMzEsOCwlcjIwIDsjIDEwNzYgZXh0ZW5kcWlzaTIKLQlsZGIgNDYoJXIxNCksJXIxOSA7IyAxMDgxIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDEwODIgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxOSwlcjIwLEwkMDE1NyA7IyAxMDg0IGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQxMTYyLCVyMCA7IyAxMDg1IGp1bXAKLUwkMDE1NgotCWxkaSA0NiwlcjE5IDsjIDEwODkgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjIwLEwkMTE2MiA7IyAxMDkxIGJsZXUrMQotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotTCQwMTU3Ci0JY29taWIsPSAwLCVyMTEsTCQwMTUzIDsjIDEwOTYgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDA5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLDw8PSAlcjE2LCVyMTksTCQxMTYyIDsjIDEwOTggYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPSxuIDAsJXIxNCxMJDAxNTggOyMgMTEwMCBibGV1KzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDExMDMgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyMTksJXIxOSA7IyAxMTA0IGFkZHNpMy8xCi1MJDAxNTgKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDExMTIgbW92cWkrMS81Ci0JY29taWIsPSAwLCVyMTQsTCQwMTYwIDsjIDExMTYgYmxldSsxCi0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgMTExMyBleHRlbmRxaXNpMgotCWxkYiAxMCglcjE0KSwlcjE5IDsjIDExMTggbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTExOSBleHRlbmRxaXNpMgotCWNvbWIsPSAlcjE5LCVyMjAsTCQwMTYxIDsjIDExMjEgYmxldSsxCi0JbGRpIDE3LCVyMjYgOyMgMTE1OSByZWxvYWRfb3V0c2krMi8yCi0JYmwsbiBMJDExNjIsJXIwIDsjIDExMjIganVtcAotTCQwMTYwCi0JY29taWIsPD4gMTAsJXIyMCxMJDExNjIgOyMgMTEyNiBibGV1KzEKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE2MQotCWJiLDwgJXIxNSwyNSxMJDExNjIgOyMgMTEzNCBibGV1KzMKLQlsZGkgMTcsJXIyNiA7IyAxMTU5IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMTIsJXIyNiA7IyAxMTQwIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyNiwlcjI1IDsjIDExNDIgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjgsJXI2LCVyMjQgOyMgMTEzNyBzdWJzaTMvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSCi0JYmwgc3RvcmVfb3AxLCVyMiA7IyAxMTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGRvIC0zKCVyMjQpLCVyMjQgOyMgMTE0NCBhZGRzaTMvMgotCWJsIEwkMDE2MiwlcjAgOyMgMTE1MSBqdW1wCi0JbGRpIDEsJXIxMyA7IyAxMTQ5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDE1MwotCWxkaSAxNywlcjI2IDsjIDExNTkgcmVsb2FkX291dHNpKzIvMgotTCQxMTYyCi0JY29weSAlcjYsJXIyNSA7IyAxMTYxIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDExNTYgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgMTE2NSBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtNiglcjI0KSwlcjI0IDsjIDExNjMgYWRkc2kzLzIKLUwkMDE2MgotCWxkbyAzKCVyNiksJXI2IDsjIDExNjggYWRkc2kzLzIKLUwkMDEzNwotCWxkdyAwKCVyNSksJXIzIDsjIDgwMTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDEzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMTEgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwMTIgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDAxNjQgOyMgODAxNCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg2ODQgcmVsb2FkX291dHNpKzIvMwotTCQwMTY1Ci0JY29tY2xyLDw+ICVyNCwlcjIwLCVyMCA7IyAxMTk1IGJsZXUrMQotCWJsIEwkMDk0NCwlcjAKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxMjA1IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDE3MCA7IyAxMjEzIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxMjA3IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyAxMjE2IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDE3MAotCWxkdyAwKCVyNSksJXIyNiA7IyAxMjIzIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDEyMjcgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTIyNSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDEyMzUgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDEyMzEgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxNjMgOyMgMTI0NSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDEyNDcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTI1MCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDEyNTEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxNzMgOyMgMTI1NiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDEyNTQgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxMjU3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxMjYwIGFkZHNpMy8xCi1MJDAxNzMKLQljb21pYiw9IDAsJXI4LEwkMDE3NCA7IyAxMjYzIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTI2NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxMjY3IGFkZHNpMy8xCi1MJDAxNzQKLQljb21pYiw9IDAsJXI5LEwkMDE2MyA7IyAxMjcwIGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTI3MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxMjc0IGFkZHNpMy8xCi1MJDAxNjMKLQlsZHcgMCglcjUpLCVyMyA7IyAxMTc1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTE3OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMTc2IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyAxMTc3IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTY1Ci0Jbm9wIDsjIDExODEgYmxldSsxCi1MJDAxNjQKLQlsZGkgMTQsJXIyNiA7IyA4Nzg2IHJlbG9hZF9vdXRzaSsyLzIKLQljb21pY2xyLD0gMCwlcjEzLCVyMCA7IyAxMzEwIGJlcS0xLzIKLQlsZGkgMTUsJXIyNgotCWNvcHkgJXI4LCVyMjUgOyMgMTMxMiByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyAxMzE0IHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyAxMzE4IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyAxMzE2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjkgOyMgMTMyMSByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPD4gMCwlcjExLEwkMDA0MyA7IyAxMzI2IGJsZXUrMQotCWxkbyAzKCVyNiksJXI2IDsjIDEzMjMgYWRkc2kzLzIKLQlsZHcgMCglcjUpLCVyMyA7IyA4MDE5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODAyMiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MDIwIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MDIxIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwMTgyIDsjIDgwMjMgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NjgyIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDE4MwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgMTM1MiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxMzYyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDE4OCA7IyAxMzcwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxMzY0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyAxMzczIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDE4OAotCWxkdyAwKCVyNSksJXIyNiA7IyAxMzgwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDEzODQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTM4MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDEzOTIgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDEzODggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDAxODEgOyMgMTQwMiBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDE0MDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMTQwNyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDE0MDggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAxOTEgOyMgMTQxMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDE0MTEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyAxNDE0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAxNDE3IGFkZHNpMy8xCi1MJDAxOTEKLQljb21pYiw9IDAsJXI4LEwkMDE5MiA7IyAxNDIwIGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgMTQyMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAxNDI0IGFkZHNpMy8xCi1MJDAxOTIKLQljb21pYiw9IDAsJXI5LEwkMDE4MSA7IyAxNDI3IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgMTQyOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAxNDMxIGFkZHNpMy8xCi1MJDAxODEKLQlsZHcgMCglcjUpLCVyMyA7IyAxMzMyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTMzNiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxMzMzIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyAxMzM0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMTgzCi0Jbm9wIDsjIDEzMzggYmxldSsxCi1MJDAxODIKLQlsZGkgMTgsJXIyNiA7IyAxNDU0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyOCwlcjI1IDsjIDE0NTYgcmVsb2FkX291dHNpKzIvMQotCWxkaSAzLCVyMjQgOyMgMTQ1OCByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyAxNDYyIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyAxNDYwIHJlbG9hZF9vdXRzaSsyLzEKLQlibCBMJDAwNDMsJXIwIDsjIDE0NzAganVtcAotCWxkbyAzKCVyNiksJXI2IDsjIDE0NjQgYWRkc2kzLzIKLUwkMDE5NgotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDMwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwMjggc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwMjkgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjAxIDsjIDgwMzEgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDE0NzUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY4MCByZWxvYWRfb3V0c2krMi8zCi1MJDAyMDIKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE1MDMgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTUxMyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyMDcgOyMgMTUyMSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTUxNSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTUyNCByZWxvYWRfb3V0c2krMi82Ci1MJDAyMDcKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTUzMSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxNTM1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE1MzMgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxNTQzIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxNTM5IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjAwIDsjIDE1NTMgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxNTU1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE1NTggYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAxNTU5IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjEwIDsjIDE1NjQgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNTYyIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMTU2NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTU2OCBhZGRzaTMvMQotTCQwMjEwCi0JY29taWIsPSAwLCVyOCxMJDAyMTEgOyMgMTU3MSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDE1NzIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTU3NSBhZGRzaTMvMQotTCQwMjExCi0JY29taWIsPSAwLCVyOSxMJDAyMDAgOyMgMTU3OCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDE1Nzkgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTU4MiBhZGRzaTMvMQotTCQwMjAwCi0JbGR3IDAoJXI1KSwlcjQgOyMgMTQ4MyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE0ODcgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTQ4NCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTQ4NSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDIwMgotCW5vcCA7IyAxNDg5IGJsZXUrMQotTCQwMjAxCi0JbGRpIDIsJXIxOSA7IyAxNjA0IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgMTYxNyBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyAxNjA1IG1vdnFpKzEvNgotTCQwMjE2Ci0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MDIgOyMgMTYyNiBibGV1KzEKLQlsZGkgMCwlcjEzIDsjIDE2MjMgcmVsb2FkX291dHNpKzIvMgotCWxkdyAwKCVyNSksJXIzIDsjIDgwMzUgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDM4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgwMzYgc3Vic2kzLzEKLQlsZG8gMzQoJXIxOSksJXIxOSA7IyA4MDM3IGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDIxOSA7IyA4MDM5IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjQgOyMgODY3OCByZWxvYWRfb3V0c2krMi8zCi1MJDAyMjAKLQljb21iLD0gJXI0LCVyMjAsTCQwOTQ0IDsjIDE2NjEgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTY3MSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjQsJXIxOSxMJDAyMjUgOyMgMTY3OSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTY3MyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyNCw0KCVyNSkgOyMgMTY4MiByZWxvYWRfb3V0c2krMi82Ci1MJDAyMjUKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTY4OSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxNjkzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE2OTEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxNzAxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxNjk3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjMsTCQwMjE4IDsjIDE3MTEgYmxldSsxCi0Jc3ViICVyNiwlcjMsJXIxOSA7IyAxNzEzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE3MTYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjMsJXIxOSA7IyAxNzE3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjI4IDsjIDE3MjIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxNzIwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgMTcyMyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTcyNiBhZGRzaTMvMQotTCQwMjI4Ci0JY29taWIsPSAwLCVyOCxMJDAyMjkgOyMgMTcyOSBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDE3MzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTczMyBhZGRzaTMvMQotTCQwMjI5Ci0JY29taWIsPSAwLCVyOSxMJDAyMTggOyMgMTczNiBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDE3Mzcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTc0MCBhZGRzaTMvMQotTCQwMjE4Ci0JbGR3IDAoJXI1KSwlcjMgOyMgMTY0MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE2NDUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgMTY0MiBzdWJzaTMvMQotCWxkbyAzNCglcjE5KSwlcjE5IDsjIDE2NDMgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDAyMjAKLQlub3AgOyMgMTY0NyBibGV1KzEKLUwkMDIxOQotCWxkdyAwKCVyNSksJXI0IDsjIDgwNDMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwNDQgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwNDUgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwMjM3IDsjIDgwNDcgYmxldSsxCi0JY29weSAlcjYsJXI4IDsjIDE3NjMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODY3NiByZWxvYWRfb3V0c2krMi8zCi1MJDAyMzgKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDE3OTEgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgMTgwMSBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDAyNDMgOyMgMTgwOSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgMTgwMyByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgMTgxMiByZWxvYWRfb3V0c2krMi82Ci1MJDAyNDMKLQlsZHcgMCglcjUpLCVyMjYgOyMgMTgxOSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyAxODIzIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDE4MjEgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAxODMxIGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyAxODI3IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwMjM2IDsjIDE4NDEgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxODQzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDE4NDYgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyAxODQ3IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwMjQ2IDsjIDE4NTIgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyAxODUwIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgMTg1MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgMTg1NiBhZGRzaTMvMQotTCQwMjQ2Ci0JY29taWIsPSAwLCVyOCxMJDAyNDcgOyMgMTg1OSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDE4NjAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgMTg2MyBhZGRzaTMvMQotTCQwMjQ3Ci0JY29taWIsPSAwLCVyOSxMJDAyMzYgOyMgMTg2NiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDE4Njcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgMTg3MCBhZGRzaTMvMQotTCQwMjM2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgMTc3MSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDE3NzUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgMTc3MiBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMTc3MyBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDIzOAotCW5vcCA7IyAxNzc3IGJsZXUrMQotTCQwMjM3Ci0JY29weSAlcjYsJXIyMiA7IyAxOTA5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gMSglcjYpLCVyNiA7IyAxODkxIGFkZHNpMy8yCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDIxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDE4OTMgbW92cWkrMS81Ci0JbGRpIDk0LCVyMjEgOyMgMTg5NiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTg5NCBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIyMSwlcjE5LEwkMDI1MSA7IyAxODk4IGJsZXUrMQotCWxkaSAzLCVyMjAgOyMgODA1MSBtb3ZxaSsxLzIKLQlsZGkgNCwlcjIwIDsjIDE5MDAgbW92cWkrMS8yCi1MJDAyNTEKLQlzdGIgJXIyMCwwKCVyMjIpIDsjIDE5MTEgbW92cWkrMS82Ci0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNDI0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgMCglcjIwKSwlcjE5IDsjIDE5MjMgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMTkyNCBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIyMSwlcjE5LEwkMDI1NCA7IyAxOTI4IGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMTkzMCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjQyNyByZWxvYWRfb3V0c2krMi82Ci1MJDAyNTQKLQlsZHcgMCglcjUpLCVyNCA7IyA4MDUyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODA1NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yOTYoJXIzMCksJXIxIDsjIDI0MzMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODA1MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODA1NCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDAyNTkgOyMgODA1NiBibGV1KzEKLQlzdHcgJXIxLC0yNjgoJXIzMCkgOyMgODc4OSByZWxvYWRfb3V0c2krMi82Ci0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4Njc0IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDI2MAotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgMTk2MiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyAxOTcyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDI2NSA7IyAxOTgwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyAxOTc0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyAxOTgzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDI2NQotCWxkdyAwKCVyNSksJXIyNiA7IyAxOTkwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDE5OTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgMTk5MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDIwMDIgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDE5OTggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDAyNTggOyMgMjAxMiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDIwMTQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgMjAxNyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDIwMTggc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDAyNjggOyMgMjAyMyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDIwMjEgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyAyMDI0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyAyMDI3IGFkZHNpMy8xCi1MJDAyNjgKLQljb21pYiw9IDAsJXI4LEwkMDI2OSA7IyAyMDMwIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgMjAzMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyAyMDM0IGFkZHNpMy8xCi1MJDAyNjkKLQljb21pYiw9IDAsJXI5LEwkMDI1OCA7IyAyMDM3IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgMjAzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyAyMDQxIGFkZHNpMy8xCi1MJDAyNTgKLQlsZHcgMCglcjUpLCVyNCA7IyAxOTQyIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgMTk0NiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyAxOTQzIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAxOTQ0IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwMjYwCi0Jbm9wIDsjIDE5NDggYmxldSsxCi1MJDAyNTkKLQlsZGkgMzIsJXIxOSA7IyAyMDYzIG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgMjA2NCBtb3ZxaSsxLzYKLQljb3B5ICVyNiwlcjI2IDsjIDIwNzcgcmVsb2FkX291dHNpKzIvMQotCWxkaSAwLCVyMjUgOyMgMjA3OSByZWxvYWRfb3V0c2krMi8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IKLQlibCBtZW1zZXQsJXIyIDsjIDIwODMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZGkgMzIsJXIyNCA7IyAyMDgxIHJlbG9hZF9vdXRzaSsyLzIKLQlsZGIgLTIoJXI2KSwlcjE5IDsjIDIwODcgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPD4gNCwlcjE5LEwkMDI3NCA7IyAyMDg5IGJsZXUrMQotCWxkaSA5MywlcjE3IDsjIDg2MjIgcmVsb2FkX291dHNpKzIvMgotCWJiLD49LG4gJXIxNSwyMyxMJDAyNzQgOyMgMjA5NCBtb3ZzaS00Ci0JbGRiIDEoJXI2KSwlcjE5IDsjIDIwOTcgbW92cWkrMS81Ci0JZGVwaSAtMSwyOSwxLCVyMTkgOyMgMjA5OSBpb3JzaTMrMS8yCi0Jc3RiICVyMTksMSglcjYpIDsjIDIxMDEgbW92cWkrMS82Ci1MJDAyNzQKLQlsZGkgNCwlcjE4IDsjIDg2MjggcmVsb2FkX291dHNpKzIvMgotCWFuZCAlcjE1LCVyMTgsJXIxIDsjIDg2MjkgYW5kc2kzLzEKLQlzdHcgJXIxLC0yNTIoJXIzMCkgOyMgODc5MiByZWxvYWRfb3V0c2krMi82Ci0JbGRvIC0yODgoJXIzMCksJXIxMSA7IyA4NjMyIGFkZHNpMy8yCi1MJDAyNzUKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0MzYgcmVsb2FkX291dHNpKzIvNQotTCQxMTY1Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MDIgOyMgMjEwOSBibGV1KzEKLQljb3B5ICVyMjAsJXIyMSA7IyA4NzQ1IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGJzLG1hIDEoJXIyMSksJXI3IDsjIDIxMzQgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMjgwIDsjIDIxMzkgYmxldSsxCi0Jc3R3ICVyMjEsLTI5NiglcjMwKSA7IyAyNDQ1IHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgMjE0MCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyAyMTQzIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMjgwCi0JYmIsPj0gJXIxNSwzMSxMJDAyODUgOyMgMjE1OSBtb3ZzaS00Ci0JbGRpIDkyLCVyMTkgOyMgMjE2MSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PixuICVyMTksJXI3LEwkMDI4NSA7IyAyMTYzIGJsZXUrMQotCWNvbWIsPSAlcjE2LCVyMjEsTCQwOTAzIDsjIDIxNjcgYmxldSsxCi0JbGRvIDEoJXIyMSksJXIxOSA7IyAyMTk1IGFkZHNpMy8yCi0JbGRiIDEoJXIyMCksJXIzIDsjIDIxOTIgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSAwLCVyMTQsTCQwMjg4IDsjIDIxOTcgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAyNDYwIHJlbG9hZF9vdXRzaSsyLzYKLQlhZGRsICVyMTQsJXIzLCVyMTkgOyMgMjE5OCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMyA7IyAyMjAxIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwMjg4Ci0JZXh0cnUgJXIzLDI4LDI5LCVyMTkgOyMgMjIxNiBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjE5LCVyMTkgOyMgMjIxOSBhZGRzaTMvMQotCWJsIEwkMDk0OCwlcjAgOyMgMjIzNSBqdW1wCi0JZXh0cnUgJXIzLDMxLDMsJXIyMCA7IyAyMjIyIGFuZHNpMy8xCi1MJDAyODUKLQljb21iLDw+LG4gJXIxNywlcjcsTCQwMjkzIDsjIDIyNDMgYmxldSsxCi0JbGR3IC0yNjgoJXIzMCksJXIxIDsjIDg3OTggcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjQ2NiByZWxvYWRfb3V0c2krMi81Ci0JbGRvIDEoJXIxKSwlcjE5IDsjIDIyNDQgYWRkc2kzLzIKLQljb21iLDw+LG4gJXIxOSwlcjIwLEwkMDI3NiA7IyAyMjQ2IGJsZXUrMQotTCQwMjkzCi0JY29taWIsPSAwLCVyMTMsTCQwMjk0IDsjIDIyNTMgYmxldSsxCi0JbGRpIDQ1LCVyMSA7IyA4ODAxIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMSwlcjcsTCQxMTYzIDsjIDIyNTcgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyAyNTI0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0NjkgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMjI1OSBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyAyMjYwIGV4dGVuZHFpc2kyCi0JY29tYiw8PixuICVyMTcsJXIxOSxMJDA4OTUgOyMgMjI2NCBibGV1KzEKLUwkMDI5NAotCWxkaSA0NSwlcjEgOyMgODgwNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PiAlcjEsJXI3LEwkMTE2MyA7IyAyMjgwIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg4MDcgcmVsb2FkX291dHNpKzIvNQotCWxkbyAtMiglcjIwKSwlcjE5IDsjIDIyODEgYWRkc2kzLzIKLQljb21iLD4+LG4gJXIxLCVyMTksTCQxMTc5IDsjIDIyODMgYmxldSsxCi0JbGRiIC0yKCVyMjApLCVyMTkgOyMgMjI4NSBtb3ZxaSsxLzUKLQlsZGkgOTEsJXIxIDsjIDg4MTAgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIyODYgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIxLCVyMTksTCQxMTYzIDsjIDIyOTAgYmxldSsxCi0JbGR3IC0yNzYoJXIzMCksJXIxIDsjIDg4MTMgcmVsb2FkX291dHNpKzIvNQotTCQxMTc5Ci0JbGRvIC0zKCVyMjApLCVyMTkgOyMgMjI5NCBhZGRzaTMvMgotCWNvbWIsPj4sbiAlcjEsJXIxOSxMJDAyOTcgOyMgMjI5NiBibGV1KzEKLQlsZGIgLTMoJXIyMCksJXIxOSA7IyAyMjk4IG1vdnFpKzEvNQotCWxkaSA5MSwlcjEgOyMgODgxNiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjI5OSBleHRlbmRxaXNpMgotCWNvbWIsPD4gJXIxLCVyMTksTCQxMTY0IDsjIDIzMDMgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNDg3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGIgLTIoJXIyMCksJXIxOSA7IyAyMzA1IG1vdnFpKzEvNQotCWxkaSA5NCwlcjIwIDsjIDIzMDggcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIzMDYgZXh0ZW5kcWlzaTIKLQljb21iLD0gJXIyMCwlcjE5LEwkMTE2MyA7IyAyMzEwIGJsZXUrMQotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgMjUyNCByZWxvYWRfb3V0c2krMi81Ci1MJDAyOTcKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDI0ODcgcmVsb2FkX291dHNpKzIvNQotTCQxMTY0Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAyMzE1IG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDIzMTYgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMTcsJXIxOSxMJDAzMDIgOyMgMjMyMCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI1MjQgcmVsb2FkX291dHNpKzIvNQotTCQxMTYzCi0JbGRiIDAoJXIyMCksJXIxOSA7IyAyNTI2IG1vdnFpKzEvNQotCWxkaSA0NSwlcjEgOyMgODgxOSByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjUyNyBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjEsJXIxOSxMJDAzMDAgOyMgMjUzMSBibGV1KzEKLQlsZGIgMSglcjIwKSwlcjE5IDsjIDI1MzUgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgMjUzNiBleHRlbmRxaXNpMgotCWNvbWIsPSxuICVyMTcsJXIxOSxMJDAzMDAgOyMgMjU0MCBibGV1KzEKLQljb21iLD0gJXIxNiwlcjIwLEwkMDkyMiA7IyAyNTUwIGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMjU1OSBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgMjU2MSByZWxvYWRfb3V0c2krMi82Ci1MJDAzMDIKLQlzdHcgJXI2LC01MiglcjMwKSA7IyAyNTg4IHJlbG9hZF9vdXRzaSsyLzYKLQlsZG8gLTI5NiglcjMwKSwlcjI2IDsjIDI1OTAgYWRkc2kzLzIKLQljb3B5ICVyMTYsJXIyNSA7IyAyNTkyIHJlbG9hZF9vdXRzaSsyLzEKLQljb3B5ICVyMTQsJXIyNCA7IyAyNTk0IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGNvbXBpbGVfcmFuZ2UsJXIyIDsjIDI1OTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMTUsJXIyMyA7IyAyNTk2IHJlbG9hZF9vdXRzaSsyLzEKLQltb3ZiLD0gJXIyOCwlcjQsTCQxMTY1IDsjIDI2MDMgZGVjcmVtZW50X2FuZF9icmFuY2hfdW50aWxfemVybysyLzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI0MzYgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMjYwNyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMjYwNSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAyNjExIGp1bXAKLQljb3B5ICVyNCwlcjI4IDsjIDI2MDkgcmVsb2FkX291dHNpKzIvMQotTCQwMzAwCi0JbGR3IC0yNTIoJXIzMCksJXIxIDsjIDg4MjIgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzA5IDsjIDI2MjQgYmxldSsxCi0JbGRpIDkxLCVyMSA7IyA4ODI1IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw+ICVyMSwlcjcsTCQxMTY2IDsjIDI2MjggYmxldSsxCi0JbGRpIDAsJXIxMyA7IyAzNjI0IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDI2MzAgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjApLCVyMTkgOyMgMjYzMiBtb3ZxaSsxLzUKLQlsZGkgNTgsJXIxIDsjIDg4MjggcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI2MzMgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIxLCVyMTksTCQxMTY2IDsjIDI2MzcgYmxldSsxCi0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgMjY0NyBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDI2NTYgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDI2NTggcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTAyIDsjIDI2ODkgYmxldSsxCi0JbGRpIDAsJXIzIDsjIDI2ODQgcmVsb2FkX291dHNpKzIvMgotTCQwMzE3Ci0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyNzA5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjE5LEwkMDkyMiA7IyAyNzExIGJsZXUrMQotCWxkbyAxKCVyMTkpLCVyMjAgOyMgMjcyMCBhZGRzaTMvMgotCXN0dyAlcjIwLC0yOTYoJXIzMCkgOyMgMjcyMiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwMzIxIDsjIDI3MjkgYmxldSsxCi0JbGRiIDAoJXIxOSksJXI3IDsjIDI3MjUgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDI3MzAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMjczMyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDMyMQotCWxkaSA1OCwlcjEgOyMgODgzMSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMSwlcjcsTCQxMTY3IDsjIDI3NTAgYmxldSsxCi0JYWRkbCAlcjExLCVyMywlcjE5IDsjIDI3ODkgYWRkc2kzLzEKLQljb21iLD0sbiAlcjE3LCVyNyxMJDExNjcgOyMgMjc1NCBibGV1KzEKLQljb21iLD0sbiAlcjE2LCVyMjAsTCQxMTY3IDsjIDI3NTggYmxldSsxCi0JY29taWIsPSA2LCVyMyxMJDExNjcgOyMgMjc2MCBibGV1KzEKLQljb3B5ICVyMywlcjIwIDsjIDI3NzAgcmVsb2FkX291dHNpKzIvMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgMjc3MSBhZGRzaTMvMgotCWV4dHJ1ICVyMTksMzEsOCwlcjMgOyMgMjc3MiB6ZXJvX2V4dGVuZHFpc2kyLzEKLQlhZGRsICVyMTEsJXIyMCwlcjIwIDsjIDI3NzYgYWRkc2kzLzEKLQlibCBMJDAzMTcsJXIwIDsjIDI3ODMganVtcAotCXN0YiAlcjcsMCglcjIwKSA7IyAyNzc4IG1vdnFpKzEvNgotTCQxMTY3Ci0JY29tYiw8PiAlcjEsJXI3LEwkMDMyOCA7IyAyNzk2IGJsZXUrMQotCXN0YiAlcjAsMCglcjE5KSA7IyAyNzkxIG1vdnFpKzEvNgotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjc5OCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyAyODAwIG1vdnFpKzEvNQotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDI4MDEgZXh0ZW5kcWlzaTIKLQljb21iLDw+ICVyMTcsJXIxOSxMJDExNjggOyMgMjgwNSBibGV1KzEKLQlsZGkgMjU1LCVyMTkgOyMgODA2OSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjExLCVyMjYgOyMgMjgxMyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE2LCVyMSA7IyA4ODM1IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNiglcjEpLCVyMSA7IyA4ODM2IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjgxNyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMjgxNSByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjExLCVyMjYgOyMgMjgyOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE3LCVyMSA7IyA4ODM3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxNyglcjEpLCVyMSA7IyA4ODM4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4MzEgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjgyMSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4MzMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjQ0KCVyMzApIDsjIDg4NDEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4NDUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxOCwlcjEgOyMgODg0MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTgoJXIxKSwlcjEgOyMgODg0MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODQ3IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4Mzcgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODQ5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIzNiglcjMwKSA7IyA4ODQ2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyODYxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTksJXIxIDsjIDg4NDcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE5KCVyMSksJXIxIDsjIDg4NDggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjg2MyByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyODUzIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjg2NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMjgoJXIzMCkgOyMgODg1MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjg3NyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIwLCVyMSA7IyA4ODUyIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMCglcjEpLCVyMSA7IyA4ODUzIG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI4NzkgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjg2OSBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI4ODEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMjIwKCVyMzApIDsjIDg4NTYgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI4OTMgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyMSwlcjEgOyMgODg1NyBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjEoJXIxKSwlcjEgOyMgODg1OCBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyODk1IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI4ODUgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyODk3IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTIxMiglcjMwKSA7IyA4ODYxIHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTA5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjIsJXIxIDsjIDg4NjIgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIyKCVyMSksJXIxIDsjIDg4NjMgbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjkxMSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTAxIHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjkxMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0yMDQoJXIzMCkgOyMgODg2NiByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjkyNSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIzLCVyMSA7IyA4ODY3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMyglcjEpLCVyMSA7IyA4ODY4IG1vdmhpLTIKLQljb3B5ICVyMSwlcjI1IDsjIDI5MjcgcmVsb2FkX291dHNpKzIvMQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMjggOyMgMjkxNyBzY2MKLQlsZGkgMSwlcjI4Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5MjkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXIyOCwtMTk2KCVyMzApIDsjIDg4NzEgcmVsb2FkX291dHNpKzIvNgotCWNvcHkgJXIxMSwlcjI2IDsjIDI5NDEgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAyNCwlcjEgOyMgODg3MiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjQoJXIxKSwlcjEgOyMgODg3MyBtb3ZoaS0yCi0JY29weSAlcjEsJXIyNSA7IyAyOTQzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pY2xyLDw+IDAsJXIyOCwlcjI4IDsjIDI5MzMgc2NjCi0JbGRpIDEsJXIyOAotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAyOTQ1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyMjgsLTE4OCglcjMwKSA7IyA4ODc2IHJlbG9hZF9vdXRzaSsyLzYKLQljb3B5ICVyMTEsJXIyNiA7IyAyOTU3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjUsJXIxIDsjIDg4NzcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDI1KCVyMSksJXIxIDsjIDg4NzggbW92aGktMgotCWNvcHkgJXIxLCVyMjUgOyMgMjk1OSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTQ5IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xODAoJXIzMCkgOyMgODg4MSByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk3MyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI2LCVyMTkgOyMgMjk3MCBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjYoJXIxOSksJXIzIDsjIDI5NzEgbW92aGktMgotCWNvcHkgJXIzLCVyMjUgOyMgMjk3NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWNsciw8PiAwLCVyMjgsJXIyOCA7IyAyOTY1IHNjYwotCWxkaSAxLCVyMjgKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMjk3NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCXN0dyAlcjI4LC0xNzIoJXIzMCkgOyMgODg4NCByZWxvYWRfb3V0c2krMi82Ci0JY29weSAlcjExLCVyMjYgOyMgMjk4OSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI3LCVyMTkgOyMgMjk4NiBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMjcoJXIxOSksJXI0IDsjIDI5ODcgbW92aGktMgotCWNvbWljbHIsPD4gMCwlcjI4LCVyMTMgOyMgMjk4MSBzY2MKLQlsZGkgMSwlcjEzCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDI5OTMgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjI1IDsjIDI5OTEgcmVsb2FkX291dHNpKzIvMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwMDUgcmVsb2FkX291dHNpKzIvMQotCWxkaWwgTFInTCRDMDAxNywlcjEgOyMgODg4NSBhZGRfaGlnaF9jb25zdCszCi0JbGRvIFJSJ0wkQzAwMTcoJXIxKSwlcjEgOyMgODg4NiBtb3ZoaS0yCi0JY29taWNsciw8PiAwLCVyMjgsJXI3IDsjIDI5OTcgc2NjCi0JbGRpIDEsJXI3Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBzdHJjbXAsJXIyIDsjIDMwMDkgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyMSwlcjI1IDsjIDMwMDcgcmVsb2FkX291dHNpKzIvMQotCWNvbWliLD0gMCwlcjI4LEwkMDMyOSA7IyAzMDEzIGJsZXUrMQotCWNvcHkgJXIxMSwlcjI2IDsjIDMwMTggcmVsb2FkX291dHNpKzIvMQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDIyIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjMsJXIyNSA7IyAzMDIwIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAyNiBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDMxIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjIsJXIxIDsjIDg4ODcgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIyKCVyMSksJXIxIDsjIDg4ODggbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDM1IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDMzIHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzAzOSBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDQ0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMjAsJXIxIDsjIDg4ODkgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDIwKCVyMSksJXIxIDsjIDg4OTAgbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDQ4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDQ2IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzA1MiBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDU3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIExSJ0wkQzAwMTYsJXIxIDsjIDg4OTEgYWRkX2hpZ2hfY29uc3QrMwotCWxkbyBSUidMJEMwMDE2KCVyMSksJXIxIDsjIDg4OTIgbW92aGktMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgc3RyY21wLCVyMiA7IyAzMDYxIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjEsJXIyNSA7IyAzMDU5IHJlbG9hZF9vdXRzaSsyLzEKLQljb21pYiw9IDAsJXIyOCxMJDAzMjkgOyMgMzA2NSBibGV1KzEKLQljb3B5ICVyMTEsJXIyNiA7IyAzMDcwIHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA3NCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXI0LCVyMjUgOyMgMzA3MiByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwNzggYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA4MyByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI1LCVyMSA7IyA4ODkzIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNSglcjEpLCVyMSA7IyA4ODk0IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzA4NyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA4NSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMwOTEgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzA5NiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIzLCVyMSA7IyA4ODk1IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMyglcjEpLCVyMSA7IyA4ODk2IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEwMCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzA5OCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMDQgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEwOSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDI0LCVyMSA7IyA4ODk3IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyNCglcjEpLCVyMSA7IyA4ODk4IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzExMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzExMSByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMTcgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEyMiByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDIxLCVyMSA7IyA4ODk5IGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAyMSglcjEpLCVyMSA7IyA4OTAwIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEyNiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzEyNCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxMzAgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzEzNSByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE5LCVyMSA7IyA4OTAxIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOSglcjEpLCVyMSA7IyA4OTAyIG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzEzOSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzEzNyByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPSAwLCVyMjgsTCQwMzI5IDsjIDMxNDMgYmxldSsxCi0JY29weSAlcjExLCVyMjYgOyMgMzE0OCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMUidMJEMwMDE4LCVyMSA7IyA4OTAzIGFkZF9oaWdoX2NvbnN0KzMKLQlsZG8gUlInTCRDMDAxOCglcjEpLCVyMSA7IyA4OTA0IG1vdmhpLTIKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHN0cmNtcCwlcjIgOyMgMzE1MiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWNvcHkgJXIxLCVyMjUgOyMgMzE1MCByZWxvYWRfb3V0c2krMi8xCi0JY29taWIsPD4sbiAwLCVyMjgsTCQwOTAwIDsjIDMxNTYgYmxldSsxCi1MJDAzMjkKLQlsZHcgLTI5NiglcjMwKSwlcjE5IDsjIDMxNzMgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMTksTCQwOTIyIDsjIDMxNzUgYmxldSsxCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzMTg0IGFkZHNpMy8yCi0JY29tYiw9ICVyMTYsJXIxOSxMJDA5MDIgOyMgMzIxNCBibGV1KzEKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDMxODYgcmVsb2FkX291dHNpKzIvNgotCWxkaSAwLCVyMjIgOyMgMzIyNyByZWxvYWRfb3V0c2krMi8yCi0JYWRkaWwgTFInX19hbG51bS0kZ2xvYmFsJCwlcjI3IDsjIDg1OTYgcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyMiA7IyA4OTA3IHJlbG9hZF9vdXRzaSsyLzEKLQlhZGRpbCBMUidfX2N0eXBlMi0kZ2xvYmFsJCwlcjI3IDsjIDg1OTggcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyMjMgOyMgODkxMCByZWxvYWRfb3V0c2krMi8xCi0JYWRkaWwgTFInX19jdHlwZS0kZ2xvYmFsJCwlcjI3IDsjIDg2MDAgcGljMl9sb19zdW0rMQotCWNvcHkgJXIxLCVyNCA7IyA4OTEzIHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMzIsJXIyNSA7IyA4NjA1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZGkgMiwlcjI0IDsjIDg2MDcgcmVsb2FkX291dHNpKzIvMgotCWxkaSAxNiwlcjMxIDsjIDg2MDkgcmVsb2FkX291dHNpKzIvMgotCWxkaSA4LCVyMjkgOyMgODYxMSByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDEyOCwlcjI4IDsjIDg2MTMgcmVsb2FkX291dHNpKzIvMgotCWxkaSAyNTUsJXIyNiA7IyA4NjE1IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgLTI0NCglcjMwKSwlcjEgOyMgODkxNiByZWxvYWRfb3V0c2krMi81Ci1MJDExNzMKLQljb21pYiw9LG4gMCwlcjEsTCQwMzQzIDsjIDMyNDAgYmxldSsxCi0Jc3R3ICVyMjIsUlInX19hbG51bS0kZ2xvYmFsJCglcjIpIDsjIDMyNDQgcmVsb2FkX291dHNpKzIvNgotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDMyNDggcmVsb2FkX291dHNpKzIvNQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIyMSA7IyAzMjYwIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMyNTMgYWRkc2kzLzEKLQlhZGRsICVyMjEsJXIyMiwlcjIxIDsjIDMyNjUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjIwIDsjIDMyNTUgbW92cWkrMS81Ci0JbGRiIDAoJXIyMSksJXIxOSA7IyAzMjY3IG1vdnFpKzEvNQotCWV4dHJ1ICVyMjAsMzEsMSwlcjIwIDsjIDMyNTYgYW5kc2kzLzEKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzI3MCBhbmRzaTMvMQotCW9yICVyMjAsJXIxOSwlcjIwIDsjIDMyNzggeG9yZGkzLTEKLQljb21pYiw8PiAwLCVyMjAsTCQxMTY5IDsjIDMyODAgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0MwotCWxkdyAtMjM2KCVyMzApLCVyMSA7IyA4OTE5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0NCA7IyAzMjg1IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDMyODkgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzI5MCBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzI5MiBtb3ZxaSsxLzUKLQliYiw8ICVyMTksMzEsTCQxMTY5IDsjIDMyOTYgYmxldSszCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzMzMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0NAotCWxkdyAtMjI4KCVyMzApLCVyMSA7IyA4OTIyIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9LG4gMCwlcjEsTCQwMzQ1IDsjIDMzMDEgYmxldSsxCi0JY29tYiw9ICVyMjUsJXIyMixMJDExNjkgOyMgMzMwNSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzMzMwIHplcm9fZXh0ZW5kcWlzaTIvMQotCWNvbWliLD0gOSwlcjIyLEwkMTE3MCA7IyAzMzA3IGJsZXUrMQotCWV4dHJ1ICVyMTksMjgsMjksJXIyMSA7IyAzMzMyIGxzaHJzaTMvMgotTCQwMzQ1Ci0JbGR3IC0yMjAoJXIzMCksJXIxIDsjIDg5MjUgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzQxIDsjIDMzMTIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDMzMTYgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzMxNyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzMxOSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI1LCVyMTkgOyMgMzMyMiBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM0MSA7IyAzMzI1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDMzMzAgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNjkKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzMzMiBsc2hyc2kzLzIKLUwkMTE3MAotCWFkZGwgJXI2LCVyMjEsJXIyMSA7IyAzMzM1IGFkZHNpMy8xCi0JZXh0cnUgJXIxOSwzMSwzLCVyMTkgOyMgMzMzOSBhbmRzaTMvMQotCXN1YmkgMzEsJXIxOSwlcjE5IDsjIDMzNDAgc3Vic2kzLzIKLQlsZGIgMCglcjIxKSwlcjIwIDsjIDMzNDMgbW92cWkrMS81Ci0JbXRzYXIgJXIxOSA7IyA4OTI4IHJlbG9hZF9vdXRzaSsyLzcKLQl2ZGVwaSAtMSwxLCVyMjAgOyMgMzM0OCB2ZGVwaV9pb3IKLQlzdGIgJXIyMCwwKCVyMjEpIDsjIDMzNTAgbW92cWkrMS82Ci1MJDAzNDEKLQlsZHcgLTIxMiglcjMwKSwlcjEgOyMgODkzMSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDggOyMgMzM1NCBibGV1KzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjQpLCVyMTkgOyMgMzM1OCByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjE5LCVyMjIsJXIxOSA7IyAzMzU5IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXIxOSA7IyAzMzYxIG1vdnFpKzEvNQotCWFuZCAlcjE5LCVyMTgsJXIxOSA7IyAzMzY0IGFuZHNpMy8xCi0JY29taWIsPD4gMCwlcjE5LEwkMTE3MSA7IyAzMzY3IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDAzNDgKLQlsZHcgLTIwNCglcjMwKSwlcjEgOyMgODkzNCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMSxMJDAzNDkgOyMgMzM3MiBibGV1KzEKLQlsZHcgUlInX19jdHlwZTItJGdsb2JhbCQoJXIyMyksJXIxOSA7IyAzMzc2IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzNzcgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzNzkgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNCwlcjE5IDsjIDMzODIgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcxIDsjIDMzODUgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzQyNiB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM0OQotCWxkdyAtMTk2KCVyMzApLCVyMSA7IyA4OTM3IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM1MCA7IyAzMzkwIGJsZXUrMQotCWxkdyBSUidfX2N0eXBlLSRnbG9iYWwkKCVyNCksJXIxOSA7IyAzMzk0IHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMTksJXIyMiwlcjE5IDsjIDMzOTUgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDMzOTcgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyNCwlcjE5IDsjIDM0MDAgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQxMTcxIDsjIDM0MDMgYmxldSsxCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzQyNiB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1MAotCWxkdyAtMTg4KCVyMzApLCVyMSA7IyA4OTQwIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIxLEwkMDM0NiA7IyAzNDA4IGJsZXUrMQotCWxkdyBSUidfX2N0eXBlMi0kZ2xvYmFsJCglcjIzKSwlcjE5IDsjIDM0MTIgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQxMyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQxNSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjE4LCVyMTkgOyMgMzQxOCBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDM0NiA7IyAzNDIxIGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM0MjYgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNzEKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzQyOCBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzQzMSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDM0MzUgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzNDM2IHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzNDM5IG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODk0MyByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDM0NDQgdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzNDQ2IG1vdnFpKzEvNgotTCQwMzQ2Ci0JbGR3IC0xODAoJXIzMCksJXIxIDsjIDg5NDYgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzUzIDsjIDM0NTAgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0NTQgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ1NSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ1NyBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjMxLCVyMTkgOyMgMzQ2MCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzIgOyMgMzQ2MyBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzUzCi0JbGR3IC0xNzIoJXIzMCksJXIxIDsjIDg5NDkgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjEsTCQwMzU0IDsjIDM0NjggYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0NzIgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ3MyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ3NSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI5LCVyMTkgOyMgMzQ3OCBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDExNzIgOyMgMzQ4MSBibGV1KzEKLQlleHRydSAlcjIyLDMxLDgsJXIxOSA7IyAzNTIwIHplcm9fZXh0ZW5kcWlzaTIvMQotTCQwMzU0Ci0JY29taWIsPSAwLCVyMTMsTCQwMzU1IDsjIDM0ODYgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM0OTAgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzQ5MSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzQ5MyBtb3ZxaSsxLzUKLQliYiw8ICVyMTksMzEsTCQxMTcyIDsjIDM0OTcgYmxldSszCi0JZXh0cnUgJXIyMiwzMSw4LCVyMTkgOyMgMzUyMCB6ZXJvX2V4dGVuZHFpc2kyLzEKLUwkMDM1NQotCWNvbWliLD0gMCwlcjcsTCQwMzM5IDsjIDM1MDIgYmxldSsxCi0JbGR3IFJSJ19fY3R5cGUtJGdsb2JhbCQoJXI0KSwlcjE5IDsjIDM1MDYgcmVsb2FkX291dHNpKzIvNQotCWFkZGwgJXIxOSwlcjIyLCVyMTkgOyMgMzUwNyBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgMzUwOSBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjI4LCVyMTkgOyMgMzUxMiBhbmRzaTMvMQotCWNvbWliLD0gMCwlcjE5LEwkMDMzOSA7IyAzNTE1IGJsZXUrMQotCWV4dHJ1ICVyMjIsMzEsOCwlcjE5IDsjIDM1MjAgemVyb19leHRlbmRxaXNpMi8xCi1MJDExNzIKLQlleHRydSAlcjE5LDI4LDI5LCVyMjEgOyMgMzUyMiBsc2hyc2kzLzIKLQlhZGRsICVyNiwlcjIxLCVyMjEgOyMgMzUyNSBhZGRzaTMvMQotCWV4dHJ1ICVyMTksMzEsMywlcjE5IDsjIDM1MjkgYW5kc2kzLzEKLQlzdWJpIDMxLCVyMTksJXIxOSA7IyAzNTMwIHN1YnNpMy8yCi0JbGRiIDAoJXIyMSksJXIyMCA7IyAzNTMzIG1vdnFpKzEvNQotCW10c2FyICVyMTkgOyMgODk1MiByZWxvYWRfb3V0c2krMi83Ci0JdmRlcGkgLTEsMSwlcjIwIDsjIDM1MzggdmRlcGlfaW9yCi0Jc3RiICVyMjAsMCglcjIxKSA7IyAzNTQwIG1vdnFpKzEvNgotTCQwMzM5Ci0JbGRvIDEoJXIyMiksJXIyMiA7IyAzNTQ2IGFkZHNpMy8yCi0JY29tYiw+PSxuICVyMjYsJXIyMixMJDExNzMgOyMgMzIzMyBibGV1KzEKLQlsZHcgLTI0NCglcjMwKSwlcjEgOyMgODkxNiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwMjc1LCVyMCA7IyAzNTU5IGp1bXAKLQlsZGkgMSwlcjEzIDsjIDM1NTYgcmVsb2FkX291dHNpKzIvMgotTCQwMzI4Ci0JbGRpIDI1NSwlcjE5IDsjIDgwNjkgcmVsb2FkX291dHNpKzIvMgotTCQxMTY4Ci0JY29tYiw9ICVyMTksJXIzLEwkMDM1OSA7IyA4MDcwIGJsZXUrMQotCWNvcHkgJXIxOSwlcjIxIDsjIDg1OTUgcmVsb2FkX291dHNpKzIvMQotTCQwMzYwCi0JbGRvIC0xKCVyMyksJXIyMCA7IyAzNTcxIGFkZHNpMy8yCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAzNTgzIHJlbG9hZF9vdXRzaSsyLzUKLQlleHRydSAlcjIwLDMxLDgsJXIzIDsjIDM1NzIgemVyb19leHRlbmRxaXNpMi8xCi0JbGRvIC0xKCVyMTkpLCVyMTkgOyMgMzU4NCBhZGRzaTMvMgotCWNvbWIsPD4gJXIyMSwlcjMsTCQwMzYwIDsjIDM1NzcgYmxldSsxCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyAzNTg4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDM1OQotCWxkYiAxMSglcjYpLCVyMTkgOyMgMzU5OSBtb3ZxaSsxLzUKLQlkZXBpIC0xLDI4LDEsJXIxOSA7IyAzNjAxIGlvcnNpMysxLzIKLQlzdGIgJXIxOSwxMSglcjYpIDsjIDM2MDMgbW92cWkrMS82Ci0JbGRiIDcoJXI2KSwlcjE5IDsjIDM2MDYgbW92cWkrMS81Ci0JbGRpIDAsJXIxMyA7IyAzNjEzIHJlbG9hZF9vdXRzaSsyLzIKLQlkZXBpIC0xLDI5LDEsJXIxOSA7IyAzNjA4IGlvcnNpMysxLzIKLQlibCBMJDAyNzUsJXIwIDsjIDM2MTgganVtcAotCXN0YiAlcjE5LDcoJXI2KSA7IyAzNjEwIG1vdnFpKzEvNgotTCQwMzA5Ci0JbGRpIDAsJXIxMyA7IyAzNjI0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE2NgotCWV4dHJ1ICVyNywyMSs4LTEsOCwlcjE5IDsjIDM2MjcgZXh0enYKLQlhZGRsICVyNiwlcjE5LCVyMTkgOyMgMzYzMCBhZGRzaTMvMQotCWV4dHJ1ICVyNywzMSwzLCVyMjAgOyMgMzYzMyBhbmRzaTMvMQotTCQwOTQ4Ci0Jc3ViaSAzMSwlcjIwLCVyMjAgOyMgMzYzNCBzdWJzaTMvMgotCWxkYiAwKCVyMTkpLCVyMjEgOyMgMzYzNyBtb3ZxaSsxLzUKLQltdHNhciAlcjIwIDsjIDg5NTUgcmVsb2FkX291dHNpKzIvNwotCXZkZXBpIC0xLDEsJXIyMSA7IyAzNjQyIHZkZXBpX2lvcgotCWJsIEwkMDI3NSwlcjAgOyMgMzY1MyBqdW1wCi0Jc3RiICVyMjEsMCglcjE5KSA7IyAzNjQ0IG1vdnFpKzEvNgotTCQwMjc2Ci0JbGRiIC0xKCVyNiksJXIyMCA7IyA4MDc0IG1vdnFpKzEvNQotCWV4dHJ1ICVyMjAsMzEsOCwlcjE5IDsjIDgwNzUgemVyb19leHRlbmRxaXNpMi8xCi0JY29taWIsPSAwLCVyMTksTCQwMzY0IDsjIDgwNzYgYmxldSsxCi0JYWRkbCAlcjE5LCVyNiwlcjE5IDsjIDgwNzkgYWRkc2kzLzEKLQlsZGIgLTEoJXIxOSksJXIxOSA7IyA4MDgyIHplcm9fZXh0ZW5kcWlzaTIvMgotCWNvbWliLDw+IDAsJXIxOSxMJDAzNjQgOyMgODA4MyBibGV1KzEKLQlsZG8gLTEoJXIyMCksJXIxOSA7IyA4MjQyIGFkZHNpMy8yCi0JYmwgTCQxMTgzLCVyMCA7IyA4MjUzIGp1bXAKLQlzdGIgJXIxOSwtMSglcjYpIDsjIDM2ODggbW92cWkrMS82Ci1MJDAzNjUKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyAzNjg2IGFkZHNpMy8yCi0Jc3RiICVyMTksLTEoJXI2KSA7IyAzNjg4IG1vdnFpKzEvNgotTCQxMTgzCi0JZXh0cnUgJXIxOSwzMSw4LCVyMTkgOyMgMzY2MiB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21pYiw9IDAsJXIxOSxMJDAzNjQgOyMgMzY2NCBibGV1KzEKLQlhZGRsICVyMTksJXI2LCVyMTkgOyMgMzY2OCBhZGRzaTMvMQotCWxkYiAtMSglcjE5KSwlcjE5IDsjIDM2NzIgemVyb19leHRlbmRxaXNpMi8yCi0JY29taWIsPSxuIDAsJXIxOSxMJDAzNjUgOyMgMzY3NCBibGV1KzEKLQlsZGIgLTEoJXI2KSwlcjE5IDsjIDM2ODMgbW92cWkrMS81Ci1MJDAzNjQKLQlsZGIgLTEoJXI2KSwlcjE5IDsjIDM3MDAgemVyb19leHRlbmRxaXNpMi8yCi0JYmwgTCQwMDQzLCVyMCA7IyAzNzA1IGp1bXAKLQlhZGRsICVyNiwlcjE5LCVyNiA7IyAzNzAxIGFkZHNpMy8xCi1MJDAzNjgKLQliYiw+PSxuICVyMTUsMTgsTCQwMDc2IDsjIDM3MTMgbW92c2ktNAotCWJsIEwkMTE4MSwlcjAgOyMgMzcyMSBqdW1wCi0JbGR3IDI0KCVyNSksJXIxOSA7IyAzODYxIHJlbG9hZF9vdXRzaSsyLzUKLUwkMDM3MgotCWJiLD49LG4gJXIxNSwxOCxMJDAwNzYgOyMgMzczMCBtb3ZzaS00Ci0JYmwsbiBMJDAzNzQsJXIwIDsjIDM3MzgganVtcAotTCQwMzc2Ci0JYmIsPj0sbiAlcjE1LDIwLEwkMDA3NiA7IyAzNzQ3IG1vdnNpLTQKLQlibCxuIEwkMDM3OCwlcjAgOyMgMzc1NSBqdW1wCi1MJDAzODAKLQliYiw+PSxuICVyMTUsMTYsTCQwMDc2IDsjIDM3NjQgbW92c2ktNAotCWJsLG4gTCQwMzc4LCVyMCA7IyAzNzcyIGp1bXAKLUwkMDM4MwotCWFuZCAlcjE1LCVyMjAsJXIxOSA7IyAzNzc5IGFuZHNpMy8xCi0JY29tYiw9ICVyMjAsJXIxOSxMJDExNzQgOyMgMzc4MyBibGV1KzEKLQlsZGkgLTEsJXI0IDsjIDUwNzQgcmVsb2FkX291dHNpKzIvMgotCWJsLG4gTCQwMDc2LCVyMCA7IyAzNzkxIGp1bXAKLUwkMDM4NwotCWNvbWIsPSxuICVyMTYsJXIxOSxMJDA5MDMgOyMgMzc5OSBibGV1KzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgMzgzMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDM4MjYgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDM4MjggcmVsb2FkX291dHNpKzIvNgotCWxkbyAtMzkoJXI3KSwlcjE5IDsjIDc0NDYgYWRkc2kzLzIKLQlhZGRpLHV2IC04NiwlcjE5LCVyMCA7IyA3NDQ3IGNhc2VzaTAKLQlibHIsbiAlcjE5LCVyMAotCWIsbiBMJDAzOTcKLUwkMDgxNwotCWJsIEwkMDc1OSwlcjAgOyMgOTQzNyBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgyMDQgcmVsb2FkX291dHNpKzIvNQotTCQxMDY5Ci0JYmwgTCQwMzk1LCVyMAotCW5vcCA7IyA5NDQwIHN3aXRjaF9qdW1wCi1MJDEwNzAKLQlibCBMJDA0MjIsJXIwCi0Jbm9wIDsjIDk0NDMgc3dpdGNoX2p1bXAKLUwkMTA3MQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ0NiBzd2l0Y2hfanVtcAotTCQxMDcyCi0JYmwgTCQwODExLCVyMAotCW5vcCA7IyA5NDQ5IHN3aXRjaF9qdW1wCi1MJDEwNzMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NTIgc3dpdGNoX2p1bXAKLUwkMTA3NAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ1NSBzd2l0Y2hfanVtcAotTCQxMDc1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDU4IHN3aXRjaF9qdW1wCi1MJDEwNzYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0NjEgc3dpdGNoX2p1bXAKLUwkMTA3NwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTQ2NCBzd2l0Y2hfanVtcAotTCQxMDc4Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDY3IHN3aXRjaF9qdW1wCi1MJDEwNzkKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0NzAgc3dpdGNoX2p1bXAKLUwkMTA4MAotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ3MyBzd2l0Y2hfanVtcAotTCQxMDgxCi0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDc2IHN3aXRjaF9qdW1wCi1MJDEwODIKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0Nzkgc3dpdGNoX2p1bXAKLUwkMTA4MwotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ4MiBzd2l0Y2hfanVtcAotTCQxMDg0Ci0JYmwgTCQwNzg3LCVyMAotCW5vcCA7IyA5NDg1IHN3aXRjaF9qdW1wCi1MJDEwODUKLQlibCBMJDA3ODcsJXIwCi0Jbm9wIDsjIDk0ODggc3dpdGNoX2p1bXAKLUwkMTA4NgotCWJsIEwkMDc4NywlcjAKLQlub3AgOyMgOTQ5MSBzd2l0Y2hfanVtcAotTCQxMDg3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NDk0IHN3aXRjaF9qdW1wCi1MJDEwODgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk0OTcgc3dpdGNoX2p1bXAKLUwkMTA4OQotCWJsIEwkMDY1OSwlcjAgOyMgOTUwMCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxNjQgcmVsb2FkX291dHNpKzIvNQotTCQxMDkwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTAzIHN3aXRjaF9qdW1wCi1MJDEwOTEKLQlibCBMJDA2NzksJXIwIDsjIDk1MDYgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTcyIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTA5MgotCWJsIEwkMDgxMSwlcjAKLQlub3AgOyMgOTUwOSBzd2l0Y2hfanVtcAotTCQxMDkzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTEyIHN3aXRjaF9qdW1wCi1MJDEwOTQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MTUgc3dpdGNoX2p1bXAKLUwkMTA5NQotCWJsIEwkMDcxOSwlcjAgOyMgOTUxOCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxODggcmVsb2FkX291dHNpKzIvNQotTCQxMDk2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTIxIHN3aXRjaF9qdW1wCi1MJDEwOTcKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MjQgc3dpdGNoX2p1bXAKLUwkMTA5OAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUyNyBzd2l0Y2hfanVtcAotTCQxMDk5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTMwIHN3aXRjaF9qdW1wCi1MJDExMDAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1MzMgc3dpdGNoX2p1bXAKLUwkMTEwMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTUzNiBzd2l0Y2hfanVtcAotTCQxMTAyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTM5IHN3aXRjaF9qdW1wCi1MJDExMDMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NDIgc3dpdGNoX2p1bXAKLUwkMTEwNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU0NSBzd2l0Y2hfanVtcAotTCQxMTA1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTQ4IHN3aXRjaF9qdW1wCi1MJDExMDYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NTEgc3dpdGNoX2p1bXAKLUwkMTEwNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU1NCBzd2l0Y2hfanVtcAotTCQxMTA4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTU3IHN3aXRjaF9qdW1wCi1MJDExMDkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1NjAgc3dpdGNoX2p1bXAKLUwkMTExMAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU2MyBzd2l0Y2hfanVtcAotTCQxMTExCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTY2IHN3aXRjaF9qdW1wCi1MJDExMTIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Njkgc3dpdGNoX2p1bXAKLUwkMTExMwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU3MiBzd2l0Y2hfanVtcAotTCQxMTE0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTc1IHN3aXRjaF9qdW1wCi1MJDExMTUKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1Nzggc3dpdGNoX2p1bXAKLUwkMTExNgotCWJsIEwkMDYzOSwlcjAgOyMgOTU4MSBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxNTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTE3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTg0IHN3aXRjaF9qdW1wCi1MJDExMTgKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1ODcgc3dpdGNoX2p1bXAKLUwkMTExOQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5MCBzd2l0Y2hfanVtcAotTCQxMTIwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NTkzIHN3aXRjaF9qdW1wCi1MJDExMjEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk1OTYgc3dpdGNoX2p1bXAKLUwkMTEyMgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTU5OSBzd2l0Y2hfanVtcAotTCQxMTIzCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjAyIHN3aXRjaF9qdW1wCi1MJDExMjQKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MDUgc3dpdGNoX2p1bXAKLUwkMTEyNQotCWJsIEwkMDczOSwlcjAgOyMgOTYwOCBzd2l0Y2hfanVtcAotCWxkdyAwKCVyNSksJXI0IDsjIDgxOTYgcmVsb2FkX291dHNpKzIvNQotTCQxMTI2Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjExIHN3aXRjaF9qdW1wCi1MJDExMjcKLQlibCBMJDA2OTksJXIwIDsjIDk2MTQgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTgwIHJlbG9hZF9vdXRzaSsyLzUKLUwkMTEyOAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYxNyBzd2l0Y2hfanVtcAotTCQxMTI5Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjIwIHN3aXRjaF9qdW1wCi1MJDExMzAKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MjMgc3dpdGNoX2p1bXAKLUwkMTEzMQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYyNiBzd2l0Y2hfanVtcAotTCQxMTMyCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjI5IHN3aXRjaF9qdW1wCi1MJDExMzMKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2MzIgc3dpdGNoX2p1bXAKLUwkMTEzNAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTYzNSBzd2l0Y2hfanVtcAotTCQxMTM1Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjM4IHN3aXRjaF9qdW1wCi1MJDExMzYKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NDEgc3dpdGNoX2p1bXAKLUwkMTEzNwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY0NCBzd2l0Y2hfanVtcAotTCQxMTM4Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjQ3IHN3aXRjaF9qdW1wCi1MJDExMzkKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTAgc3dpdGNoX2p1bXAKLUwkMTE0MAotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY1MyBzd2l0Y2hfanVtcAotTCQxMTQxCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjU2IHN3aXRjaF9qdW1wCi1MJDExNDIKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2NTkgc3dpdGNoX2p1bXAKLUwkMTE0MwotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY2MiBzd2l0Y2hfanVtcAotTCQxMTQ0Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjY1IHN3aXRjaF9qdW1wCi1MJDExNDUKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2Njggc3dpdGNoX2p1bXAKLUwkMTE0NgotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY3MSBzd2l0Y2hfanVtcAotTCQxMTQ3Ci0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5Njc0IHN3aXRjaF9qdW1wCi1MJDExNDgKLQlibCBMJDA2MTksJXIwIDsjIDk2Nzcgc3dpdGNoX2p1bXAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MTQ4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE0OQotCWJsIEwkMDM5NywlcjAKLQlub3AgOyMgOTY4MCBzd2l0Y2hfanVtcAotTCQxMTUwCi0JYmwgTCQwMzk3LCVyMAotCW5vcCA7IyA5NjgzIHN3aXRjaF9qdW1wCi1MJDExNTEKLQlibCBMJDAzOTcsJXIwCi0Jbm9wIDsjIDk2ODYgc3dpdGNoX2p1bXAKLUwkMTE1MgotCWJsIEwkMDUwNiwlcjAKLQlub3AgOyMgOTY4OSBzd2l0Y2hfanVtcAotTCQxMTUzCi0JYmwgTCQwNDcyLCVyMCA7IyA5NjkyIHN3aXRjaF9qdW1wCi0JbGRpbCBMJzMzNzkyLCVyMTkgOyMgNDcyNCBhZGRfaGlnaF9jb25zdCszCi1MJDExNTQKLQlibCxuIEwkMDM5NywlcjAgOyMgNzQ1MCBqdW1wCi1MJDAzOTUKLQliYiw8LG4gJXIxNSwxOCxMJDAzOTcgOyMgMzg1MyBibGV1KzMKLQlsZHcgMjQoJXI1KSwlcjE5IDsjIDM4NjEgcmVsb2FkX291dHNpKzIvNQotTCQxMTgxCi0JbGRvIDEoJXIxOSksJXIxOSA7IyAzODYyIGFkZHNpMy8yCi0Jc3R3ICVyMTksMjQoJXI1KSA7IyAzODY2IHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM4NzEgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTU4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMwOCglcjMwKSwlcjE5IDsjIDM4NzMgcmVsb2FkX291dHNpKzIvNQotCWxkbyAxKCVyMSksJXIxIDsjIDM4NjggYWRkc2kzLzIKLQljb21iLDw+ICVyMTksJXIyMCxMJDAzOTggOyMgMzg3NSBibGV1KzEKLQlzdHcgJXIxLC0yNjAoJXIzMCkgOyMgODk2MSByZWxvYWRfb3V0c2krMi82Ci0JemRlcCAlcjIwLDI4LDI5LCVyMjUgOyMgMzg4NSBhc2hsc2kzKzEKLQlzaDFhZGRsICVyMjAsJXIyNSwlcjI1IDsjIDM4ODYgYXNobHNpMy0yCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzODkwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDM4OTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQl6ZGVwICVyMjUsMjksMzAsJXIyNSA7IyAzODkyIGFzaGxzaTMrMQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyAzOTAzIGJsZXUrMQotCXN0dyAlcjI4LC0zMTIoJXIzMCkgOyMgMzg5OCByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDgoJXIzMCksJXIxOSA7IyAzOTEyIHJlbG9hZF9vdXRzaSsyLzUKLQl6ZGVwICVyMTksMzAsMzEsJXIxOSA7IyAzOTE0IGFzaGxzaTMrMQotCXN0dyAlcjE5LC0zMDgoJXIzMCkgOyMgMzkxNiByZWxvYWRfb3V0c2krMi82Ci1MJDAzOTgKLQlsZHcgLTMwNCglcjMwKSwlcjIwIDsjIDM5MjEgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjEgOyMgMzkyMyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjE5IDsjIDM5MzMgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIyMCwlcjIwLCVyMjAgOyMgMzkyOCBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMjAsJXIyMSwlcjIxIDsjIDM5MzEgYXNobHNpMy0yCi0Jc3ViICVyMTIsJXIxOSwlcjE5IDsjIDM5MzQgc3Vic2kzLzEKLQlzdHcgJXIxOSwwKCVyMjEpIDsjIDM5MzYgcmVsb2FkX291dHNpKzIvNgotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgMzkzOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMCA7IyAzOTQxIHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDM5NDYgYXNobHNpMy0yCi0JY29taWIsPSAwLCVyMTAsTCQwNDAwIDsjIDM5NTEgYmxldSsxCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyAzOTQ5IGFzaGxzaTMtMgotCWxkdyAwKCVyNSksJXIxOSA7IyAzOTUzIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXIxMCwlcjE5LCVyMTkgOyMgMzk1NCBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgMzk1NSBhZGRzaTMvMgotCWJsIEwkMDQwMSwlcjAgOyMgMzk1OCBqdW1wCi0Jc3R3ICVyMTksNCglcjIwKSA7IyAzOTU3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQwMAotCXN0dyAlcjAsNCglcjIwKSA7IyAzOTYyIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQwMQotCWxkdyAtMzA0KCVyMzApLCVyMjAgOyMgMzk2NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0zMTIoJXIzMCksJXIyMSA7IyAzOTY4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgMzk3OCByZWxvYWRfb3V0c2krMi81Ci0Jc2gyYWRkbCAlcjIwLCVyMjAsJXIyMCA7IyAzOTczIGFzaGxzaTMtMgotCXNoMmFkZGwgJXIyMCwlcjIxLCVyMjEgOyMgMzk3NiBhc2hsc2kzLTIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyAzOTc5IHN1YnNpMy8xCi0Jc3R3ICVyMTksMTIoJXIyMSkgOyMgMzk4MSByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyAzOTg0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDM5ODYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTY0IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMTksJXIxOSwlcjE5IDsjIDM5OTEgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjE5LCVyMjAsJXIyMCA7IyAzOTk0IGFzaGxzaTMtMgotCWxkaSAyNTUsJXIxOSA7IyAzOTk5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw8ICVyMTksJXIxLEwkMDQwMiA7IyA0MDAxIGJsZXUrMQotCXN0dyAlcjEsMTYoJXIyMCkgOyMgMzk5NiByZWxvYWRfb3V0c2krMi82Ci0JbGR3IC0zMDQoJXIzMCksJXIyMCA7IyA0MDA1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTMxMiglcjMwKSwlcjIxIDsjIDQwMDcgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyNSksJXIxOSA7IyA0MDE3IHJlbG9hZF9vdXRzaSsyLzUKLQlzaDJhZGRsICVyMjAsJXIyMCwlcjIwIDsjIDQwMTIgYXNobHNpMy0yCi0Jc2gyYWRkbCAlcjIwLCVyMjEsJXIyMSA7IyA0MDE1IGFzaGxzaTMtMgotCXN1YiAlcjYsJXIxOSwlcjE5IDsjIDQwMTggc3Vic2kzLzEKLQlsZG8gMiglcjE5KSwlcjE5IDsjIDQwMTkgYWRkc2kzLzIKLQlzdHcgJXIxOSw4KCVyMjEpIDsjIDQwMjEgcmVsb2FkX291dHNpKzIvNgotCWxkdyAwKCVyNSksJXI0IDsjIDgwODcgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDkwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwODggc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgwODkgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0MDcgOyMgODA5MSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1OTMgcmVsb2FkX291dHNpKzIvMwotTCQwNDA4Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0MDQ5IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQwNTkgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDEzIDsjIDQwNjcgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQwNjEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQwNzAgcmVsb2FkX291dHNpKzIvNgotTCQwNDEzCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDQwNzcgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDA4MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0MDc5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDA4OSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDA4NSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQwNiA7IyA0MDk5IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDEwMSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQxNiA7IyA0MTEwIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0MTA0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNDExMSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDExNCBhZGRzaTMvMQotTCQwNDE2Ci0JY29taWIsPSAwLCVyOCxMJDA0MTcgOyMgNDExNyBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDQxMTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDEyMSBhZGRzaTMvMQotTCQwNDE3Ci0JY29taWIsPSAwLCVyOSxMJDA0MDYgOyMgNDEyNCBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDQxMjUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDEyOCBhZGRzaTMvMQotTCQwNDA2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNDAyOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQwMzMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDAzMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDAzMSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQwOAotCW5vcCA7IyA0MDM1IGJsZXUrMQotTCQwNDA3Ci0JbGRpIDUsJXIxOSA7IyA0MTUwIG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDE1MSBtb3ZxaSsxLzYKLQlsZGIgLTI1NyglcjMwKSwlcjEgOyMgNDE1NiBtb3ZxaSsxLzUKLQlzdGJzLG1hICVyMSwxKCVyNikgOyMgODk2OCBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyMCwxKCVyNikgOyMgNDE1OSBtb3ZxaSsxLzYKLUwkMDQwMgotCWxkaSAwLCVyMTAgOyMgNDE4MiByZWxvYWRfb3V0c2krMi8yCi0JbGRpIDAsJXI4IDsjIDQxODUgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI2LCVyMTIgOyMgNDE4OCByZWxvYWRfb3V0c2krMi8xCi0JbGR3IC0zMDQoJXIzMCksJXIxOSA7IyA0MTc0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZGkgMCwlcjkgOyMgNDE5MSByZWxvYWRfb3V0c2krMi8yCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA0MTc1IGFkZHNpMy8yCi0JYmwgTCQwMDQzLCVyMCA7IyA0MTkzIGp1bXAKLQlzdHcgJXIxOSwtMzA0KCVyMzApIDsjIDQxNzkgcmVsb2FkX291dHNpKzIvNgotTCQwNDIyCi0JYmIsPCAlcjE1LDE4LEwkMDM5NyA7IyA0MjAxIGJsZXUrMwotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDIwNyByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwMzc0IDsjIDQyMDkgYmxldSsxCi0JYmIsPj0sbiAlcjE1LDE0LEwkMDk1MCA7IyA0MjE1IG1vdnNpLTQKLQlibCxuIEwkMDM5NywlcjAgOyMgNDIzMCBqdW1wCi1MJDAzNzQKLQljb21pYiw9LG4gMCwlcjEwLEwkMDQyNyA7IyA0MjM3IGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgwOTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MDk4IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgwOTYgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgwOTcgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA0MzIgOyMgODA5OSBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1OTEgcmVsb2FkX291dHNpKzIvMwotTCQwNDMzCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA0MjY2IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQyNzYgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNDM4IDsjIDQyODQgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQyNzggcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDQyODcgcmVsb2FkX291dHNpKzIvNgotTCQwNDM4Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDQyOTQgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDI5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0Mjk2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDMwNiBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDMwMiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDQzMSA7IyA0MzE2IGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDMxOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0MzIxIGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNDMyMiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDQ0MSA7IyA0MzI3IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNDMyNSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDQzMjggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDQzMzEgYWRkc2kzLzEKLUwkMDQ0MQotCWNvbWliLD0gMCwlcjgsTCQwNDQyIDsjIDQzMzQgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA0MzM1IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDQzMzggYWRkc2kzLzEKLUwkMDQ0MgotCWNvbWliLD0gMCwlcjksTCQwNDMxIDsjIDQzNDEgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA0MzQyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDQzNDUgYWRkc2kzLzEKLUwkMDQzMQotCWxkdyAwKCVyNSksJXI0IDsjIDQyNDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA0MjUwIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDQyNDcgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDQyNDggYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA0MzMKLQlub3AgOyMgNDI1MiBibGV1KzEKLUwkMDQzMgotCWxkaSAxOSwlcjE5IDsjIDQzNjcgbW92cWkrMS8yCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA0MzY4IG1vdnFpKzEvNgotCXVhZGRjbSAlcjYsJXIxMCwlcjI0IDsjIDQzODEgYWRkZGkzKzEKLQlsZGkgMTMsJXIyNiA7IyA0Mzg0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTAsJXIyNSA7IyA0Mzg2IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNDM5MCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDQzODggYWRkc2kzLzIKLUwkMDQyNwotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNDM5NSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwNDQ3IDsjIDQzOTcgYmxldSsxCi0JYmIsPCxuICVyMTUsMTQsTCQwMDc2IDsjIDQ0MDMgYmxldSszCi1MJDA5NTAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDQ0MTQgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDQ0MTIgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNDQxOCBqdW1wCi0JbGRpIDE2LCVyMjggOyMgNDQxNiByZWxvYWRfb3V0c2krMi8yCi1MJDA0NDcKLQlsZG8gLTEoJXIxOSksJXIxOSA7IyA0NDI3IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTMwNCglcjMwKSA7IyA0NDMxIHJlbG9hZF9vdXRzaSsyLzYKLQlsZHcgLTMxMiglcjMwKSwlcjIwIDsjIDQ0MzYgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIxOSwlcjE5LCVyMTkgOyMgNDQ0MSBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMTksJXIyMCwlcjIwIDsjIDQ0NDQgYXNobHNpMy0yCi0JbGR3IDAoJXI1KSwlcjIxIDsjIDQ0NDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAwKCVyMjApLCVyMTkgOyMgNDQ0OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXIyMCksJXIyMCA7IyA0NDY0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyMCxMJDA0NTAgOyMgNDQ2NiBibGV1KzEKLQlhZGRsICVyMjEsJXIxOSwlcjEyIDsjIDQ0NDkgYWRkc2kzLzEKLQlhZGRsICVyMjEsJXIyMCwlcjE5IDsjIDQ0ODMgYWRkc2kzLzEKLQlibCBMJDA0NTEsJXIwIDsjIDQ0ODUganVtcAotCWxkbyAtMSglcjE5KSwlcjEwIDsjIDQ0ODQgYWRkc2kzLzIKLUwkMDQ1MAotCWxkaSAwLCVyMTAgOyMgNDQ4OSByZWxvYWRfb3V0c2krMi8yCi1MJDA0NTEKLQlsZHcgLTMwNCglcjMwKSwlcjE5IDsjIDQ0OTMgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMzEyKCVyMzApLCVyMjAgOyMgNDQ5NSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDAoJXI1KSwlcjIxIDsjIDQ1MDUgcmVsb2FkX291dHNpKzIvNQotCXNoMmFkZGwgJXIxOSwlcjE5LCVyMTkgOyMgNDUwMCBhc2hsc2kzLTIKLQlzaDJhZGRsICVyMTksJXIyMCwlcjIwIDsjIDQ1MDMgYXNobHNpMy0yCi0JbGR3IDEyKCVyMjApLCVyMTkgOyMgNDUwNyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDE2KCVyMjApLCVyNyA7IyA0NTIzIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMjEsJXIxOSwlcjggOyMgNDUwOCBhZGRzaTMvMQotCWxkaSAyNTUsJXIxOSA7IyA0NTI5IHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLDw8ICVyMTksJXI3LEwkMDA0MyA7IyA0NTMxIGJsZXUrMQotCWxkaSAwLCVyOSA7IyA0NTI2IHJlbG9hZF9vdXRzaSsyLzIKLQlsZHcgOCglcjIwKSwlcjE5IDsjIDQ1NTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjYwKCVyMzApLCVyMSA7IyA4OTcxIHJlbG9hZF9vdXRzaSsyLzUKLQlhZGRsICVyMjEsJXIxOSwlcjE5IDsjIDQ1NTEgYWRkc2kzLzEKLQlzdWIgJXIxLCVyNywlcjIwIDsjIDQ1NTcgc3Vic2kzLzEKLQlzdGIgJXIyMCwwKCVyMTkpIDsjIDQ1NTkgbW92cWkrMS82Ci0JbGR3IDAoJXI1KSwlcjQgOyMgODEwMyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxMDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODEwNCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgODEwNSBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDQ1NyA7IyA4MTA3IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU4OSByZWxvYWRfb3V0c2krMi8zCi1MJDA0NTgKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDQ1ODcgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNDU5NyBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA0NjMgOyMgNDYwNSBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNDU5OSByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNDYwOCByZWxvYWRfb3V0c2krMi82Ci1MJDA0NjMKLQlsZHcgMCglcjUpLCVyMjYgOyMgNDYxNSByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA0NjE5IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDQ2MTcgcmVsb2FkX291dHNpKzIvNQotCWNvbWliLD0gMCwlcjI4LEwkMDk1MyA7IyA0NjI3IGJsZXUrMQotCXN0dyAlcjI4LDAoJXI1KSA7IyA0NjIzIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNDU2IDsjIDQ2MzcgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA0NjM5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDQ2NDIgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA0NjQzIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNDY2IDsjIDQ2NDggYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA0NjQ2IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNDY0OSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDY1MiBhZGRzaTMvMQotTCQwNDY2Ci0JY29taWIsPSAwLCVyOCxMJDA0NjcgOyMgNDY1NSBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDQ2NTYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNDY1OSBhZGRzaTMvMQotTCQwNDY3Ci0JY29taWIsPSAwLCVyOSxMJDA0NTYgOyMgNDY2MiBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDQ2NjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNDY2NiBhZGRzaTMvMQotTCQwNDU2Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNDU2NyByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ1NzEgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNDU2OCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDU2OSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ1OAotCW5vcCA7IyA0NTczIGJsZXUrMQotTCQwNDU3Ci0JbGRpIDYsJXIxOSA7IyA0Njg4IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNDY4OSBtb3ZxaSsxLzYKLQlzdGJzLG1hICVyNywxKCVyNikgOyMgNDY5NCBtb3ZxaSsxLzYKLQlsZHcgLTI2MCglcjMwKSwlcjEgOyMgODk3NCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyMSwlcjcsJXIxOSA7IyA0NzAwIHN1YnNpMy8xCi0JYmwgTCQwMDQzLCVyMCA7IyA0NzIwIGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDQ3MDIgbW92cWkrMS82Ci1MJDA0NzIKLQlsZG8gUiczMzc5MiglcjE5KSwlcjE5IDsjIDQ3MjUgbW92aGktMgotCWFuZCAlcjE1LCVyMTksJXIxOSA7IyA0NzI2IGFuZHNpMy8xCi0JY29taWIsPD4sbiAwLCVyMTksTCQwMzk3IDsjIDQ3MjggYmxldSsxCi1MJDAzNzgKLQliYiw8LG4gJXIxNSwyMSxMJDAwNzYgOyMgNDczOSBibGV1KzMKLQlsZHcgMCglcjUpLCVyMyA7IyA4MTExIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODExNCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4MTEyIHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA4MTEzIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNDc2IDsjIDgxMTUgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNCA7IyA4NTg3IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDQ3NwotCWNvbWIsPSAlcjQsJXIyMCxMJDA5NDQgOyMgNDc2OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA0Nzc4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNCwlcjE5LEwkMDQ4MiA7IyA0Nzg2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA0NzgwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI0LDQoJXI1KSA7IyA0Nzg5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDQ4MgotCWxkdyAwKCVyNSksJXIyNiA7IyA0Nzk2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDQ4MDAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNDc5OCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDQ4MDggYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDQ4MDQgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA0NzUgOyMgNDgxOCBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDQ4MjAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNDgyMyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDQ4MjQgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA0ODUgOyMgNDgyOSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDQ4MjcgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA0ODMwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA0ODMzIGFkZHNpMy8xCi1MJDA0ODUKLQljb21pYiw9IDAsJXI4LEwkMDQ4NiA7IyA0ODM2IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNDgzNyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA0ODQwIGFkZHNpMy8xCi1MJDA0ODYKLQljb21pYiw9IDAsJXI5LEwkMDQ3NSA7IyA0ODQzIGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNDg0NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA0ODQ3IGFkZHNpMy8xCi1MJDA0NzUKLQlsZHcgMCglcjUpLCVyMyA7IyA0NzQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNDc1MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA0NzQ5IHN1YnNpMy8xCi0JbGRvIDMoJXIxOSksJXIxOSA7IyA0NzUwIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNDc3Ci0Jbm9wIDsjIDQ3NTQgYmxldSsxCi1MJDA0NzYKLQlsZGkgMTQsJXIyNiA7IyA0ODczIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTIsJXIyNSA7IyA0ODc1IHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyMjUsJXIyNCA7IyA0ODcwIHN1YnNpMy8xCi0JbGRvIDMoJXIyNCksJXIyNCA7IyA0ODc3IGFkZHNpMy8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyA0ODgxIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyA0ODc5IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGkgMCwlcjkgOyMgNDg4NCByZWxvYWRfb3V0c2krMi8yCi0JY29taWIsPSAwLCVyMTAsTCQwNDkwIDsjIDQ4ODkgYmxldSsxCi0JbGRvIDMoJXI2KSwlcjYgOyMgNDg4NiBhZGRzaTMvMgotCWxkaSAxMywlcjI2IDsjIDQ4OTQgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMCwlcjI1IDsjIDQ4OTYgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXIyNSwlcjI0IDsjIDQ4OTEgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNDkwMCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDQ4OTggYWRkc2kzLzIKLUwkMDQ5MAotCWxkdyAwKCVyNSksJXIzIDsjIDgxMTkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTIyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgxMjAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxMjEgYWRkc2kzLzIKLQljb21iLD4+PSAlcjIwLCVyMTksTCQwNDkyIDsjIDgxMjMgYmxldSsxCi0JY29weSAlcjYsJXIxMCA7IyA0OTA0IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg1ODUgcmVsb2FkX291dHNpKzIvMwotTCQwNDkzCi0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyA0OTI5IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDQ5MzkgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwNDk4IDsjIDQ5NDcgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDQ5NDEgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDQ5NTAgcmVsb2FkX291dHNpKzIvNgotTCQwNDk4Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDQ5NTcgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNDk2MSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA0OTU5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNDk2OSBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNDk2NSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDQ5MSA7IyA0OTc5IGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDk4MSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDUwMSA7IyA0OTkwIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA0OTg0IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXIzLCVyMTkgOyMgNDk5MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNDk5NCBhZGRzaTMvMQotTCQwNTAxCi0JY29taWIsPSAwLCVyOCxMJDA1MDIgOyMgNDk5NyBibGV1KzEKLQlzdWIgJXI4LCVyMywlcjE5IDsjIDQ5OTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNTAwMSBhZGRzaTMvMQotTCQwNTAyCi0JY29taWIsPSAwLCVyOSxMJDA0OTEgOyMgNTAwNCBibGV1KzEKLQlzdWIgJXI5LCVyMywlcjE5IDsjIDUwMDUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNTAwOCBhZGRzaTMvMQotTCQwNDkxCi0JbGR3IDAoJXI1KSwlcjMgOyMgNDkwOSByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDQ5MTMgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNDkxMCBzdWJzaTMvMQotCWxkbyAzKCVyMTkpLCVyMTkgOyMgNDkxMSBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDQ5MwotCW5vcCA7IyA0OTE1IGJsZXUrMQotTCQwNDkyCi0JbGRvIDMoJXI2KSwlcjYgOyMgNTAzMCBhZGRzaTMvMgotCWxkaSAwLCVyOCA7IyA1MDMzIHJlbG9hZF9vdXRzaSsyLzIKLQlibCBMJDAwNDMsJXIwIDsjIDUwMzgganVtcAotCWNvcHkgJXI2LCVyMTIgOyMgNTAzNiByZWxvYWRfb3V0c2krMi8xCi1MJDA1MDYKLQliYiw+PSAlcjE1LDIyLEwkMDM5NyA7IyA1MDQ2IG1vdnNpLTQKLQlsZGkgNDYwOCwlcjIwIDsjIDUwNDggcmVsb2FkX291dHNpKzIvMgotCWFuZCAlcjE1LCVyMjAsJXIxOSA7IyA1MDQ5IGFuZHNpMy8xCi0JY29tYiw9ICVyMjAsJXIxOSxMJDAzOTcgOyMgNTA1MyBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUwNTUgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMjc2KCVyMzApLCVyMSA7IyA4OTc3IHJlbG9hZF9vdXRzaSsyLzUKLQlsZG8gLTIoJXIyMCksJXIxOSA7IyA1MDU2IGFkZHNpMy8yCi0JY29tYiw8PiAlcjEsJXIxOSxMJDExNzUgOyMgNTA1OCBibGV1KzEKLQlsZGkgLTEsJXI0IDsjIDUwNzQgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSxuICVyMTYsJXIyMCxMJDAzOTcgOyMgNTA2MiBibGV1KzEKLUwkMTE3NAotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTA3OSByZWxvYWRfb3V0c2krMi81Ci1MJDExNzUKLQljb3B5ICVyNCwlcjExIDsjIDUwNzYgcmVsb2FkX291dHNpKzIvMQotCWNvbWIsPD4gJXIxNiwlcjIwLEwkMDUxNyA7IyA1MDg1IGJsZXUrMQotCWxkbyAtMSglcjIwKSwlcjIzIDsjIDUwODAgYWRkc2kzLzIKLQliYiw+PSxuICVyMTUsMTksTCQwOTE1IDsjIDUwOTIgbW92c2ktNAotCWJsIEwkMTE4MiwlcjAgOyMgNTEwNyBqdW1wCi0Jc3R3ICVyMjMsLTI5NiglcjMwKSA7IyA1OTY4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDUxNwotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTEzNCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTEzNiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTE1IDsjIDUxNDMgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUxMzkgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUxNDQgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTE0NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDUxNQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4MjU3IHBpYzJfbG9fc3VtKzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjEpLCVyMjEgOyMgODI1OSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDgyNjAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDgyNjEgbW92cWkrMS81Ci0JYmIsPj0gJXIxOSwyOSxMJDA1MTMgOyMgODI2NSBtb3ZzaS00Ci0JbGRpIDQsJXIyMCA7IyA4MjYzIHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMjAsJXIyMiA7IyA4NTgzIHJlbG9hZF9vdXRzaSsyLzEKLUwkMDUyMgotCWNvbWljbHIsPCAtMSwlcjExLCVyMCA7IyA4MTI4IG1vdnNpY2MrMS8xCi0JbGRpIDAsJXIxMQotCXNoMmFkZGwgJXIxMSwlcjExLCVyMTkgOyMgNTE4OCBhc2hsc2kzLTIKLQlzaDFhZGRsICVyMTksJXI3LCVyMTkgOyMgNTE5MSBhc2hsc2kzLTIKLQlsZHcgLTI5NiglcjMwKSwlcjIwIDsjIDUxOTQgcmVsb2FkX291dHNpKzIvNQotCWNvbWIsPSAlcjE2LCVyMjAsTCQwNTEzIDsjIDUxOTYgYmxldSsxCi0JbGRvIC00OCglcjE5KSwlcjExIDsjIDUxOTIgYWRkc2kzLzIKLQlsZG8gMSglcjIwKSwlcjE5IDsjIDUyMTUgYWRkc2kzLzIKLQlzdHcgJXIxOSwtMjk2KCVyMzApIDsjIDUyMTcgcmVsb2FkX291dHNpKzIvNgotCWNvbWliLD0gMCwlcjE0LEwkMDUyMCA7IyA1MjI0IGJsZXUrMQotCWxkYiAwKCVyMjApLCVyNyA7IyA1MjIwIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXIxNCwlcjcsJXIxOSA7IyA1MjI1IGFkZHNpMy8xCi0JbGRiIDAoJXIxOSksJXI3IDsjIDUyMjggemVyb19leHRlbmRxaXNpMi8yCi1MJDA1MjAKLQlhZGRsICVyMjEsJXI3LCVyMTkgOyMgNTE2NiBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNTE2OCBtb3ZxaSsxLzUKLQlhbmQgJXIxOSwlcjIyLCVyMTkgOyMgNTE3MiBhbmRzaTMvMQotCWNvbWliLDw+IDAsJXIxOSxMJDA1MjIKLQlub3AgOyMgNTE3NCBibGV1KzEKLUwkMDUxMwotCWxkaSA0NCwlcjE5IDsjIDUyNTIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjcsTCQwNTMyIDsjIDUyNTQgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1MjU5IHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDUzMyA7IyA1MjYxIGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTI3OCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTI4MCByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTM1IDsjIDUyODcgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDUyODMgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDUyODggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTI5MSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDUzNQotCWFkZGlsIExSJ19fY3R5cGUtJGdsb2JhbCQsJXIyNyA7IyA4MjY5IHBpYzJfbG9fc3VtKzEKLQlsZHcgUlInX19jdHlwZS0kZ2xvYmFsJCglcjEpLCVyMjEgOyMgODI3MSByZWxvYWRfb3V0c2krMi81Ci0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDgyNzIgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDgyNzMgbW92cWkrMS81Ci0JYmIsPj0gJXIxOSwyOSxMJDA1MzMgOyMgODI3NyBtb3ZzaS00Ci0JbGRpIDQsJXIyMCA7IyA4Mjc1IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMjAsJXIyMiA7IyA4NTc4IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU0MgotCWNvbWljbHIsPCAtMSwlcjQsJXIwIDsjIDgxMzIgbW92c2ljYysxLzEKLQlsZGkgMCwlcjQKLQlzaDJhZGRsICVyNCwlcjQsJXIxOSA7IyA1MzMyIGFzaGxzaTMtMgotCXNoMWFkZGwgJXIxOSwlcjcsJXIxOSA7IyA1MzM1IGFzaGxzaTMtMgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTMzOCByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA1MzMgOyMgNTM0MCBibGV1KzEKLQlsZG8gLTQ4KCVyMTkpLCVyNCA7IyA1MzM2IGFkZHNpMy8yCi0JbGRvIDEoJXIyMCksJXIxOSA7IyA1MzU5IGFkZHNpMy8yCi0Jc3R3ICVyMTksLTI5NiglcjMwKSA7IyA1MzYxIHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA1NDAgOyMgNTM2OCBibGV1KzEKLQlsZGIgMCglcjIwKSwlcjcgOyMgNTM2NCB6ZXJvX2V4dGVuZHFpc2kyLzIKLQlhZGRsICVyMTQsJXI3LCVyMTkgOyMgNTM2OSBhZGRzaTMvMQotCWxkYiAwKCVyMTkpLCVyNyA7IyA1MzcyIHplcm9fZXh0ZW5kcWlzaTIvMgotTCQwNTQwCi0JYWRkbCAlcjIxLCVyNywlcjE5IDsjIDUzMTAgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjE5IDsjIDUzMTIgbW92cWkrMS81Ci0JYW5kICVyMTksJXIyMiwlcjE5IDsjIDUzMTYgYW5kc2kzLzEKLQljb21pYiw8PiAwLCVyMTksTCQwNTQyCi0Jbm9wIDsjIDUzMTggYmxldSsxCi1MJDA1MzMKLQljb21pY2xyLDwgLTEsJXI0LCVyMCA7IyA4MTM2IGJlcS0xLzQKLQl6ZGVwaSAtMSwzMSwxNSwlcjQKLQlibCxuIEwkMDU1MywlcjAgOyMgNTQwMSBqdW1wCi1MJDA1MzIKLQljb3B5ICVyMTEsJXI0IDsjIDU0MDYgcmVsb2FkX291dHNpKzIvMQotTCQwNTUzCi0JY29taWIsPiAwLCVyMTEsTCQwOTUxIDsjIDU0MTAgYmxldSsxCi0JemRlcGkgLTEsMzEsMTUsJXIxOSA7IyA1NDEyIHJlbG9hZF9vdXRzaSsyLzQKLQljb21iLDwsbiAlcjE5LCVyNCxMJDA5NTEgOyMgNTQxNCBibGV1KzEKLQljb21iLDwsbiAlcjQsJXIxMSxMJDA5NTEgOyMgNTQxNiBibGV1KzEKLQliYiw8ICVyMTUsMTksTCQxMTc2IDsjIDU0NTEgYmxldSszCi0JbGRpIDEyNSwlcjE5IDsjIDU1MTQgcmVsb2FkX291dHNpKzIvMgotCWxkaSA5MiwlcjE5IDsjIDU0NTUgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPD4gJXIxOSwlcjcsTCQwOTE1IDsjIDU0NTcgYmxldSsxCi0JbGR3IC0yOTYoJXIzMCksJXIyMCA7IyA1NDczIHJlbG9hZF9vdXRzaSsyLzUKLQljb21iLD0gJXIxNiwlcjIwLEwkMDkyMiA7IyA1NDc1IGJsZXUrMQotCWxkbyAxKCVyMjApLCVyMTkgOyMgNTQ4NCBhZGRzaTMvMgotCXN0dyAlcjE5LC0yOTYoJXIzMCkgOyMgNTQ4NiByZWxvYWRfb3V0c2krMi82Ci0JY29taWIsPSAwLCVyMTQsTCQwNTU4IDsjIDU0OTMgYmxldSsxCi0JbGRiIDAoJXIyMCksJXI3IDsjIDU0ODkgemVyb19leHRlbmRxaXNpMi8yCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDU0OTQgYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNTQ5NyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDU1OAotCWxkaSAxMjUsJXIxOSA7IyA1NTE0IHJlbG9hZF9vdXRzaSsyLzIKLUwkMTE3NgotCWNvbWIsPSxuICVyMTksJXI3LEwkMDU2NiA7IyA1NTE2IGJsZXUrMQotTCQwOTUxCi0JYmIsPCxuICVyMTUsMTksTCQwNTExIDsjIDU1MjMgYmxldSszCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA1NTM0IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA1NTMyIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDU1MzgganVtcAotCWxkaSAxMCwlcjI4IDsjIDU1MzYgcmVsb2FkX291dHNpKzIvMgotTCQwNTY2Ci0JY29taWIsPD4sbiAwLCVyOCxMJDA1NjkgOyMgNTU0NSBibGV1KzEKLQliYiw8LG4gJXIxNSwyNixMJDA5MTcgOyMgNTU1MiBibGV1KzMKLQliYiw+PSxuICVyMTUsMjcsTCQwNTExIDsjIDU1NzEgbW92c2ktNAotCWNvcHkgJXI2LCVyOCA7IyA1NTc0IHJlbG9hZF9vdXRzaSsyLzEKLUwkMDU2OQotCWNvbWliLDw+IDAsJXI0LEwkMDU3NCA7IyA1NTg3IGJsZXUrMQotCWxkaSAxMCwlcjEzIDsjIDg5ODAgcmVsb2FkX291dHNpKzIvMgotCWxkdyAwKCVyNSksJXIzIDsjIDgxMzkgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTQyIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDgxNDAgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDgxNDEgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA1NzYgOyMgODE0MyBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXI0IDsjIDg1NzMgcmVsb2FkX291dHNpKzIvMwotTCQwNTc3Ci0JY29tYiw9ICVyNCwlcjIwLEwkMDk0NCA7IyA1NjEzIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDU2MjMgYXNobHNpMysxCi0JY29tYiw+Pj0gJXI0LCVyMTksTCQwNTgyIDsjIDU2MzEgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDU2MjUgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjQsNCglcjUpIDsjIDU2MzQgcmVsb2FkX291dHNpKzIvNgotTCQwNTgyCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDU2NDEgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNTY0NSBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA1NjQzIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pYiw9IDAsJXIyOCxMJDA5NTMgOyMgNTY1MyBibGV1KzEKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNTY0OSByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXIzLEwkMDU3NSA7IyA1NjYzIGJsZXUrMQotCXN1YiAlcjYsJXIzLCVyMTkgOyMgNTY2NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA1NjY4IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXIzLCVyMTkgOyMgNTY2OSBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDU4NSA7IyA1Njc0IGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNTY3MiBhZGRzaTMvMQotCXN1YiAlcjEwLCVyMywlcjE5IDsjIDU2NzUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDU2NzggYWRkc2kzLzEKLUwkMDU4NQotCWNvbWliLD0gMCwlcjgsTCQwNTg2IDsjIDU2ODEgYmxldSsxCi0Jc3ViICVyOCwlcjMsJXIxOSA7IyA1NjgyIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDU2ODUgYWRkc2kzLzEKLUwkMDU4NgotCWNvbWliLD0gMCwlcjksTCQwNTc1IDsjIDU2ODggYmxldSsxCi0Jc3ViICVyOSwlcjMsJXIxOSA7IyA1Njg5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDU2OTIgYWRkc2kzLzEKLUwkMDU3NQotCWxkdyAwKCVyNSksJXIzIDsjIDU1OTMgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA1NTk3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU1OTQgc3Vic2kzLzEKLQlsZG8gMyglcjE5KSwlcjE5IDsjIDU1OTUgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA1NzcKLQlub3AgOyMgNTU5OSBibGV1KzEKLUwkMDU3NgotCWxkaSAxMiwlcjI2IDsjIDU3MTggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTcyMCByZWxvYWRfb3V0c2krMi8xCi0Jc3ViICVyNiwlcjgsJXIyNCA7IyA1NzIyIHN1YnNpMy8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AxLCVyMiA7IyA1NzI2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjYsJXIyMyA7IyA1NzI0IHJlbG9hZF9vdXRzaSsyLzEKLQlibCBMJDA1OTAsJXIwIDsjIDU3MzAganVtcAotCWxkbyAzKCVyNiksJXI2IDsjIDU3MjggYWRkc2kzLzIKLUwkMDU3NAotCWNvbWljbHIsPiAyLCVyNCwlcjAgOyMgODI4MiBiZXEtMS8yCi0JbGRpIDIwLCVyMTMKLQlsZHcgMCglcjUpLCVyMyA7IyA4Mjg1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODI4OCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA4Mjg2IHN1YnNpMy8xCi0JYWRkbCAlcjE5LCVyMTMsJXIxOSA7IyA4Mjg3IGFkZHNpMy8xCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwODY4IDsjIDgyODkgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyNyA7IyA4NTcxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDU5NQotCWNvbWIsPSAlcjcsJXIyMCxMJDA5NDQgOyMgNTc2OSBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA1Nzc5IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNywlcjE5LEwkMDYwMCA7IyA1Nzg3IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA1NzgxIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LDQoJXI1KSA7IyA1NzkwIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDYwMAotCWxkdyAwKCVyNSksJXIyNiA7IyA1Nzk3IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDU4MDEgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNTc5OSByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPSAwLCVyMjgsTCQwOTUzIDsjIDU4MDkgYmxldSsxCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDU4MDUgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyMyxMJDA1OTMgOyMgNTgxOSBibGV1KzEKLQlzdWIgJXI2LCVyMywlcjE5IDsjIDU4MjEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNTgyNCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyMywlcjE5IDsjIDU4MjUgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2MDMgOyMgNTgzMCBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDU4MjggYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjMsJXIxOSA7IyA1ODMxIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA1ODM0IGFkZHNpMy8xCi1MJDA2MDMKLQljb21pYiw9IDAsJXI4LEwkMDYwNCA7IyA1ODM3IGJsZXUrMQotCXN1YiAlcjgsJXIzLCVyMTkgOyMgNTgzOCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA1ODQxIGFkZHNpMy8xCi1MJDA2MDQKLQljb21pYiw9IDAsJXI5LEwkMDU5MyA7IyA1ODQ0IGJsZXUrMQotCXN1YiAlcjksJXIzLCVyMTkgOyMgNTg0NSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA1ODQ4IGFkZHNpMy8xCi1MJDA1OTMKLQlsZHcgMCglcjUpLCVyMyA7IyA1NzQ5IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNTc1MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjMsJXIxOSA7IyA1NzUwIHN1YnNpMy8xCi0JYWRkbCAlcjE5LCVyMTMsJXIxOSA7IyA1NzUxIGFkZHNpMy8xCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNTk1Ci0Jbm9wIDsjIDU3NTUgYmxldSsxCi1MJDA4NjgKLQljb21pYiw+PSAxLCVyNCxMJDA2MDggOyMgNTg3MiBibGV1KzEKLQlsZG8gNSglcjYpLCVyMTkgOyMgNTg3MCBhZGRzaTMvMgotCXN1YiAlcjE5LCVyOCwlcjE5IDsjIDU4NzQgc3Vic2kzLzEKLQlibCBMJDA2MDksJXIwIDsjIDU4NzYganVtcAotCWxkbyAyKCVyMTkpLCVyMjQgOyMgNTg3NSBhZGRzaTMvMgotTCQwNjA4Ci0Jc3ViICVyMTksJXI4LCVyMTkgOyMgNTg3OSBzdWJzaTMvMQotCWxkbyAtMyglcjE5KSwlcjI0IDsjIDU4ODAgYWRkc2kzLzIKLUwkMDYwOQotCWxkaSAyMCwlcjI2IDsjIDU4ODUgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTg4NyByZWxvYWRfb3V0c2krMi8xCi0JY29weSAlcjExLCVyMjMgOyMgNTg5MSByZWxvYWRfb3V0c2krMi8xCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IsQVJHVzI9R1IsQVJHVzM9R1IKLQlibCBpbnNlcnRfb3AyLCVyMiA7IyA1ODkzIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTg4MyByZWxvYWRfb3V0c2krMi82Ci0JbGRvIDUoJXI2KSwlcjYgOyMgNTg5NSBhZGRzaTMvMgotCWxkaSAyMiwlcjI2IDsjIDU5MDAgcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXI4LCVyMjUgOyMgNTkwMiByZWxvYWRfb3V0c2krMi8xCi0JbGRpIDUsJXIyNCA7IyA1OTA0IHJlbG9hZF9vdXRzaSsyLzIKLQljb3B5ICVyMTEsJXIyMyA7IyA1OTA2IHJlbG9hZF9vdXRzaSsyLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluc2VydF9vcDIsJXIyIDsjIDU5MDggY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlzdHcgJXI2LC01MiglcjMwKSA7IyA1ODk4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw+PSAxLCVyNCxMJDA1OTAgOyMgNTkxMyBibGV1KzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTEwIGFkZHNpMy8yCi0JbGRpIDIxLCVyMjYgOyMgNTkyMSByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjYsJXIyNSA7IyA1OTIzIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI4LCVyNiwlcjI0IDsjIDU5MTcgc3Vic2kzLzEKLQlsZG8gMiglcjI0KSwlcjI0IDsjIDU5MjUgYWRkc2kzLzIKLQlsZG8gLTEoJXI0KSwlcjQgOyMgNTkxOSBhZGRzaTMvMgotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSLEFSR1cyPUdSLEFSR1czPUdSCi0JYmwgc3RvcmVfb3AyLCVyMiA7IyA1OTI5IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjQsJXIyMyA7IyA1OTI3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZG8gNSglcjYpLCVyNiA7IyA1OTMxIGFkZHNpMy8yCi0Jc3R3ICVyNiwtNTIoJXIzMCkgOyMgNTkzNiByZWxvYWRfb3V0c2krMi82Ci0JbGRpIDIyLCVyMjYgOyMgNTkzOCByZWxvYWRfb3V0c2krMi8yCi0JY29weSAlcjgsJXIyNSA7IyA1OTQwIHJlbG9hZF9vdXRzaSsyLzEKLQlzdWIgJXI2LCVyOCwlcjI0IDsjIDU5NDIgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUixBUkdXMz1HUgotCWJsIGluc2VydF9vcDIsJXIyIDsjIDU5NDYgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQljb3B5ICVyNCwlcjIzIDsjIDU5NDQgcmVsb2FkX291dHNpKzIvMQotCWxkbyA1KCVyNiksJXI2IDsjIDU5NDggYWRkc2kzLzIKLUwkMDU5MAotCWJsIEwkMDA0MywlcjAgOyMgNTk2MyBqdW1wCi0JbGRpIDAsJXI5IDsjIDU5NTYgcmVsb2FkX291dHNpKzIvMgotTCQwNTExCi0Jc3R3ICVyMjMsLTI5NiglcjMwKSA7IyA1OTY4IHJlbG9hZF9vdXRzaSsyLzYKLUwkMTE4MgotCWxkdyAtMjk2KCVyMzApLCVyMjAgOyMgNTk3NyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw9ICVyMTYsJXIyMCxMJDA5MjIgOyMgNTk3OSBibGV1KzEKLQlsZG8gMSglcjIwKSwlcjIxIDsjIDU5ODggYWRkc2kzLzIKLQlsZGIgMCglcjIwKSwlcjIwIDsjIDU5OTIgbW92cWkrMS81Ci0Jc3R3ICVyMjEsLTI5NiglcjMwKSA7IyA1OTkwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21pYiw9IDAsJXIxNCxMJDA2MTIgOyMgNTk5NyBibGV1KzEKLQlleHRydSAlcjIwLDMxLDgsJXI3IDsjIDU5OTMgemVyb19leHRlbmRxaXNpMi8xCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDU5OTggYWRkc2kzLzEKLQlsZGIgMCglcjE5KSwlcjcgOyMgNjAwMSB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDYxMgotCWJiLDwgJXIxNSwxOSxMJDAwNzYgOyMgNjAxOSBibGV1KzMKLQlsZHcgLTI3NiglcjMwKSwlcjEgOyMgODk4MyByZWxvYWRfb3V0c2krMi81Ci0JY29tYiw+Pj0gJXIxLCVyMjEsTCQwMDc2IDsjIDYwMjUgYmxldSsxCi0JZXh0cnMgJXIyMCwzMSw4LCVyMjAgOyMgNjAzMCBleHRlbmRxaXNpMgotCWxkaSA5MiwlcjE5IDsjIDYwMzIgcmVsb2FkX291dHNpKzIvMgotCWNvbWIsPSxuICVyMTksJXIyMCxMJDAzOTcgOyMgNjAzNCBibGV1KzEKLQlibCxuIEwkMDA3NiwlcjAgOyMgNjA0MiBqdW1wCi1MJDA2MTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE1MSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTQ5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTUwIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDYyNCA7IyA4MTUyIGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyA2MDQ3IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjkgcmVsb2FkX291dHNpKzIvMwotTCQwNjI1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2MDc1IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDYwODUgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjMwIDsjIDYwOTMgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDYwODcgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDYwOTYgcmVsb2FkX291dHNpKzIvNgotTCQwNjMwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDYxMDMgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjEwNyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2MTA1IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjExNSBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDYxMTEgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2MjMgOyMgNjEyNSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDYxMjcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjEzMCBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDYxMzEgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2MzMgOyMgNjEzNiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDYxMzQgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2MTM3IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2MTQwIGFkZHNpMy8xCi1MJDA2MzMKLQljb21pYiw9IDAsJXI4LEwkMDYzNCA7IyA2MTQzIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjE0NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2MTQ3IGFkZHNpMy8xCi1MJDA2MzQKLQljb21pYiw9IDAsJXI5LEwkMDYyMyA7IyA2MTUwIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjE1MSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2MTU0IGFkZHNpMy8xCi1MJDA2MjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2MDU1IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjA1OSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MDU2IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2MDU3IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjI1Ci0Jbm9wIDsjIDYwNjEgYmxldSsxCi1MJDA2MjQKLQlsZGkgMjMsJXIxOSA7IyA2MTc2IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjE4OSBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2MTc3IG1vdnFpKzEvNgotTCQwNjM5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE1NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE1OCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA2NDQgOyMgODE2MCBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNjE5NCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTY3IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDY0NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjIyMiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2MjMyIGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDY1MCA7IyA2MjQwIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2MjM0IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2MjQzIHJlbG9hZF9vdXRzaSsyLzYKLUwkMDY1MAotCWxkdyAwKCVyNSksJXIyNiA7IyA2MjUwIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDYyNTQgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjI1MiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDYyNjIgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2MjU4IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNjQzIDsjIDYyNzIgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2Mjc0IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDYyNzcgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2Mjc4IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNjUzIDsjIDYyODMgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2MjgxIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjI4NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjI4NyBhZGRzaTMvMQotTCQwNjUzCi0JY29taWIsPSAwLCVyOCxMJDA2NTQgOyMgNjI5MCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDYyOTEgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjI5NCBhZGRzaTMvMQotTCQwNjU0Ci0JY29taWIsPSAwLCVyOSxMJDA2NDMgOyMgNjI5NyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDYyOTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjMwMSBhZGRzaTMvMQotTCQwNjQzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjIwMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDYyMDYgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjIwMyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjIwNCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDY0NQotCW5vcCA7IyA2MjA4IGJsZXUrMQotTCQwNjQ0Ci0JbGRpIDI0LCVyMTkgOyMgNjMyMyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDYzMzYganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjMyNCBtb3ZxaSsxLzYKLUwkMDY1OQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTY3IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxNjUgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxNjYgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA2NjQgOyMgODE2OCBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NjUgcmVsb2FkX291dHNpKzIvMwotTCQwNjY1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2MzY2IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDYzNzYgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNjcwIDsjIDYzODQgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDYzNzggcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDYzODcgcmVsb2FkX291dHNpKzIvNgotTCQwNjcwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDYzOTQgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjM5OCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2Mzk2IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjQwNiBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY0MDIgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA2NjMgOyMgNjQxNiBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY0MTggc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjQyMSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY0MjIgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA2NzMgOyMgNjQyNyBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY0MjUgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2NDI4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2NDMxIGFkZHNpMy8xCi1MJDA2NzMKLQljb21pYiw9IDAsJXI4LEwkMDY3NCA7IyA2NDM0IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjQzNSBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2NDM4IGFkZHNpMy8xCi1MJDA2NzQKLQljb21pYiw9IDAsJXI5LEwkMDY2MyA7IyA2NDQxIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjQ0MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2NDQ1IGFkZHNpMy8xCi1MJDA2NjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2MzQ2IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjM1MCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2MzQ3IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2MzQ4IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNjY1Ci0Jbm9wIDsjIDYzNTIgYmxldSsxCi1MJDA2NjQKLQlsZGkgMjUsJXIxOSA7IyA2NDY3IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjQ4MCBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2NDY4IG1vdnFpKzEvNgotTCQwNjc5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxNzUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE3MyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE3NCBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDY4NCA7IyA4MTc2IGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU2MyByZWxvYWRfb3V0c2krMi8zCi1MJDA2ODUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY1MTAgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjUyMCBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA2OTAgOyMgNjUyOCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjUyMiByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjUzMSByZWxvYWRfb3V0c2krMi82Ci1MJDA2OTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjUzOCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2NTQyIGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY1NDAgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2NTUwIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjU0NiByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDY4MyA7IyA2NTYwIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjU2MiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2NTY1IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjU2NiBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDY5MyA7IyA2NTcxIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNjU2OSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDY1NzIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDY1NzUgYWRkc2kzLzEKLUwkMDY5MwotCWNvbWliLD0gMCwlcjgsTCQwNjk0IDsjIDY1NzggYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA2NTc5IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDY1ODIgYWRkc2kzLzEKLUwkMDY5NAotCWNvbWliLD0gMCwlcjksTCQwNjgzIDsjIDY1ODUgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA2NTg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDY1ODkgYWRkc2kzLzEKLUwkMDY4MwotCWxkdyAwKCVyNSksJXI0IDsjIDY0OTAgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2NDk0IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY0OTEgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY0OTIgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA2ODUKLQlub3AgOyMgNjQ5NiBibGV1KzEKLUwkMDY4NAotCWxkaSAyNiwlcjE5IDsjIDY2MTEgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA2NjI0IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDY2MTIgbW92cWkrMS82Ci1MJDA2OTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODE4MyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MTgxIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MTgyIGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzA0IDsjIDgxODQgYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTYxIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDcwNQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNjY1NCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA2NjY0IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDcxMCA7IyA2NjcyIGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA2NjY2IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA2Njc1IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDcxMAotCWxkdyAwKCVyNSksJXIyNiA7IyA2NjgyIHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDY2ODYgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNjY4NCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDY2OTQgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA2NjkwIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzAzIDsjIDY3MDQgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2NzA2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDY3MDkgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA2NzEwIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzEzIDsjIDY3MTUgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA2NzEzIGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNjcxNiBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNjcxOSBhZGRzaTMvMQotTCQwNzEzCi0JY29taWIsPSAwLCVyOCxMJDA3MTQgOyMgNjcyMiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDY3MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNjcyNiBhZGRzaTMvMQotTCQwNzE0Ci0JY29taWIsPSAwLCVyOSxMJDA3MDMgOyMgNjcyOSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDY3MzAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNjczMyBhZGRzaTMvMQotTCQwNzAzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNjYzNCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDY2MzggcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjYzNSBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNjYzNiBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDcwNQotCW5vcCA7IyA2NjQwIGJsZXUrMQotTCQwNzA0Ci0JbGRpIDI3LCVyMTkgOyMgNjc1NSBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDY3NjgganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNjc1NiBtb3ZxaSsxLzYKLUwkMDcxOQotCWxkdyA0KCVyNSksJXIyMCA7IyA4MTkxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgxODkgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgxOTAgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA3MjQgOyMgODE5MiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTkgcmVsb2FkX291dHNpKzIvMwotTCQwNzI1Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA2Nzk4IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDY4MDggYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwNzMwIDsjIDY4MTYgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDY4MTAgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDY4MTkgcmVsb2FkX291dHNpKzIvNgotTCQwNzMwCi0JbGR3IDAoJXI1KSwlcjI2IDsjIDY4MjYgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNjgzMCBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA2ODI4IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNjgzOCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDY4MzQgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA3MjMgOyMgNjg0OCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY4NTAgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNjg1MyBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDY4NTQgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA3MzMgOyMgNjg1OSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDY4NTcgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA2ODYwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA2ODYzIGFkZHNpMy8xCi1MJDA3MzMKLQljb21pYiw9IDAsJXI4LEwkMDczNCA7IyA2ODY2IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNjg2NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA2ODcwIGFkZHNpMy8xCi1MJDA3MzQKLQljb21pYiw9IDAsJXI5LEwkMDcyMyA7IyA2ODczIGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNjg3NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA2ODc3IGFkZHNpMy8xCi1MJDA3MjMKLQlsZHcgMCglcjUpLCVyNCA7IyA2Nzc4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNjc4MiByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA2Nzc5IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA2NzgwIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwNzI1Ci0Jbm9wIDsjIDY3ODQgYmxldSsxCi1MJDA3MjQKLQlsZGkgMjgsJXIxOSA7IyA2ODk5IG1vdnFpKzEvMgotCWJsIEwkMDA0MywlcjAgOyMgNjkxMiBqdW1wCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA2OTAwIG1vdnFpKzEvNgotTCQwNzM5Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgxOTkgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODE5NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgODE5OCBhZGRzaTMvMgotCWNvbWIsPj49LG4gJXIyMCwlcjE5LEwkMDc0NCA7IyA4MjAwIGJsZXUrMQotCWxkaWwgTCc2NTUzNiwlcjMgOyMgODU1NyByZWxvYWRfb3V0c2krMi8zCi1MJDA3NDUKLQljb21iLD0gJXIzLCVyMjAsTCQwOTQ0IDsjIDY5NDIgYmxldSsxCi0JemRlcCAlcjIwLDMwLDMxLCVyMTkgOyMgNjk1MiBhc2hsc2kzKzEKLQljb21iLD4+PSAlcjMsJXIxOSxMJDA3NTAgOyMgNjk2MCBibGV1KzEKLQlzdHcgJXIxOSw0KCVyNSkgOyMgNjk1NCByZWxvYWRfb3V0c2krMi82Ci0Jc3R3ICVyMyw0KCVyNSkgOyMgNjk2MyByZWxvYWRfb3V0c2krMi82Ci1MJDA3NTAKLQlsZHcgMCglcjUpLCVyMjYgOyMgNjk3MCByZWxvYWRfb3V0c2krMi81Ci0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCByZWFsbG9jLCVyMiA7IyA2OTc0IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IDQoJXI1KSwlcjI1IDsjIDY5NzIgcmVsb2FkX291dHNpKzIvNQotCWNvbWljbHIsPD4gMCwlcjI4LCVyMCA7IyA2OTgyIGJsZXUrMQotCWJsIEwkMDk1MywlcjAKLQlzdHcgJXIyOCwwKCVyNSkgOyMgNjk3OCByZWxvYWRfb3V0c2krMi82Ci0JY29tYiw9ICVyMjgsJXI0LEwkMDc0MyA7IyA2OTkyIGJsZXUrMQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNjk5NCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyNiA7IyA2OTk3IGFkZHNpMy8xCi0Jc3ViICVyMTIsJXI0LCVyMTkgOyMgNjk5OCBzdWJzaTMvMQotCWNvbWliLD0gMCwlcjEwLEwkMDc1MyA7IyA3MDAzIGJsZXUrMQotCWFkZGwgJXIyOCwlcjE5LCVyMTIgOyMgNzAwMSBhZGRzaTMvMQotCXN1YiAlcjEwLCVyNCwlcjE5IDsjIDcwMDQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjEwIDsjIDcwMDcgYWRkc2kzLzEKLUwkMDc1MwotCWNvbWliLD0gMCwlcjgsTCQwNzU0IDsjIDcwMTAgYmxldSsxCi0Jc3ViICVyOCwlcjQsJXIxOSA7IyA3MDExIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI4IDsjIDcwMTQgYWRkc2kzLzEKLUwkMDc1NAotCWNvbWliLD0gMCwlcjksTCQwNzQzIDsjIDcwMTcgYmxldSsxCi0Jc3ViICVyOSwlcjQsJXIxOSA7IyA3MDE4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI5IDsjIDcwMjEgYWRkc2kzLzEKLUwkMDc0MwotCWxkdyAwKCVyNSksJXI0IDsjIDY5MjIgcmVsb2FkX291dHNpKzIvNQotCWxkdyA0KCVyNSksJXIyMCA7IyA2OTI2IHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDY5MjMgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDY5MjQgYWRkc2kzLzIKLQljb21iLDw8ICVyMjAsJXIxOSxMJDA3NDUKLQlub3AgOyMgNjkyOCBibGV1KzEKLUwkMDc0NAotCWxkaSAxMCwlcjE5IDsjIDcwNDMgbW92cWkrMS8yCi0JYmwgTCQwMDQzLCVyMCA7IyA3MDU2IGp1bXAKLQlzdGJzLG1hICVyMTksMSglcjYpIDsjIDcwNDQgbW92cWkrMS82Ci1MJDA3NTkKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIwNyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjA1IHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA4MjA2IGFkZHNpMy8yCi0JY29tYiw+Pj0sbiAlcjIwLCVyMTksTCQwNzY0IDsjIDgyMDggYmxldSsxCi0JbGRpbCBMJzY1NTM2LCVyMyA7IyA4NTU1IHJlbG9hZF9vdXRzaSsyLzMKLUwkMDc2NQotCWNvbWIsPSAlcjMsJXIyMCxMJDA5NDQgOyMgNzA4NiBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3MDk2IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyMywlcjE5LEwkMDc3MCA7IyA3MTA0IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3MDk4IHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXIzLDQoJXI1KSA7IyA3MTA3IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDc3MAotCWxkdyAwKCVyNSksJXIyNiA7IyA3MTE0IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDcxMTggY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzExNiByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDcxMjYgYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3MTIyIHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzYzIDsjIDcxMzYgYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3MTM4IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDcxNDEgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3MTQyIHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwNzczIDsjIDcxNDcgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3MTQ1IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzE0OCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzE1MSBhZGRzaTMvMQotTCQwNzczCi0JY29taWIsPSAwLCVyOCxMJDA3NzQgOyMgNzE1NCBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDcxNTUgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzE1OCBhZGRzaTMvMQotTCQwNzc0Ci0JY29taWIsPSAwLCVyOSxMJDA3NjMgOyMgNzE2MSBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDcxNjIgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzE2NSBhZGRzaTMvMQotTCQwNzYzCi0JbGR3IDAoJXI1KSwlcjQgOyMgNzA2NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDcwNzAgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzA2NyBzdWJzaTMvMQotCWxkbyAxKCVyMTkpLCVyMTkgOyMgNzA2OCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDc2NQotCW5vcCA7IyA3MDcyIGJsZXUrMQotTCQwNzY0Ci0JbGRpIDExLCVyMTkgOyMgNzE4NyBtb3ZxaSsxLzIKLQlibCBMJDAwNDMsJXIwIDsjIDcyMDAganVtcAotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzE4OCBtb3ZxaSsxLzYKLUwkMDc4NwotCWJiLDwgJXIxNSwxNyxMJDAwNzYgOyMgNzIxNiBibGV1KzMKLQlsZG8gLTQ4KCVyNyksJXIxOSA7IyA3MjI0IGFkZHNpMy8yCi0JbGR3IC0yNjAoJXIzMCksJXIxIDsjIDg5ODYgcmVsb2FkX291dHNpKzIvNQotCWV4dHJ1ICVyMTksMzEsOCwlcjMgOyMgNzIyNSB6ZXJvX2V4dGVuZHFpc2kyLzEKLQljb21iLDw8ICVyMSwlcjMsTCQwOTM5IDsjIDcyMzAgYmxldSsxCi0JbGRvIC0zMTIoJXIzMCksJXIyNiA7IyA3MjQ0IGFkZHNpMy8yCi0JLkNBTEwgQVJHVzA9R1IsQVJHVzE9R1IKLQlibCBncm91cF9pbl9jb21waWxlX3N0YWNrLCVyMiA7IyA3MjQ4IGNhbGxfdmFsdWVfaW50ZXJuYWxfc3ltcmVmCi0JY29weSAlcjMsJXIyNSA7IyA3MjQ2IHJlbG9hZF9vdXRzaSsyLzEKLQlleHRycyAlcjI4LDMxLDgsJXIyOCA7IyA3MjUxIGV4dGVuZHFpc2kyCi0JY29taWIsPD4sbiAwLCVyMjgsTCQwMDc2IDsjIDcyNTMgYmxldSsxCi0JbGR3IDAoJXI1KSwlcjQgOyMgODIxMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDgyMTUgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgODIxMyBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgODIxNCBhZGRzaTMvMgotCWNvbWIsPj49ICVyMjAsJXIxOSxMJDA3OTUgOyMgODIxNiBibGV1KzEKLQljb3B5ICVyNiwlcjggOyMgNzI2MCByZWxvYWRfb3V0c2krMi8xCi0JbGRpbCBMJzY1NTM2LCVyNyA7IyA4NTUzIHJlbG9hZF9vdXRzaSsyLzMKLUwkMDc5NgotCWNvbWIsPSAlcjcsJXIyMCxMJDA5NDQgOyMgNzI4OCBibGV1KzEKLQl6ZGVwICVyMjAsMzAsMzEsJXIxOSA7IyA3Mjk4IGFzaGxzaTMrMQotCWNvbWIsPj49ICVyNywlcjE5LEwkMDgwMSA7IyA3MzA2IGJsZXUrMQotCXN0dyAlcjE5LDQoJXI1KSA7IyA3MzAwIHJlbG9hZF9vdXRzaSsyLzYKLQlzdHcgJXI3LDQoJXI1KSA7IyA3MzA5IHJlbG9hZF9vdXRzaSsyLzYKLUwkMDgwMQotCWxkdyAwKCVyNSksJXIyNiA7IyA3MzE2IHJlbG9hZF9vdXRzaSsyLzUKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUgotCWJsIHJlYWxsb2MsJXIyIDsjIDczMjAgY2FsbF92YWx1ZV9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgNCglcjUpLCVyMjUgOyMgNzMxOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWNsciw8PiAwLCVyMjgsJXIwIDsjIDczMjggYmxldSsxCi0JYmwgTCQwOTUzLCVyMAotCXN0dyAlcjI4LDAoJXI1KSA7IyA3MzI0IHJlbG9hZF9vdXRzaSsyLzYKLQljb21iLD0gJXIyOCwlcjQsTCQwNzk0IDsjIDczMzggYmxldSsxCi0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3MzQwIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXI2IDsjIDczNDMgYWRkc2kzLzEKLQlzdWIgJXIxMiwlcjQsJXIxOSA7IyA3MzQ0IHN1YnNpMy8xCi0JY29taWIsPSAwLCVyMTAsTCQwODA0IDsjIDczNDkgYmxldSsxCi0JYWRkbCAlcjI4LCVyMTksJXIxMiA7IyA3MzQ3IGFkZHNpMy8xCi0Jc3ViICVyMTAsJXI0LCVyMTkgOyMgNzM1MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyMTAgOyMgNzM1MyBhZGRzaTMvMQotTCQwODA0Ci0JY29taWIsPSAwLCVyOCxMJDA4MDUgOyMgNzM1NiBibGV1KzEKLQlzdWIgJXI4LCVyNCwlcjE5IDsjIDczNTcgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjggOyMgNzM2MCBhZGRzaTMvMQotTCQwODA1Ci0JY29taWIsPSAwLCVyOSxMJDA3OTQgOyMgNzM2MyBibGV1KzEKLQlzdWIgJXI5LCVyNCwlcjE5IDsjIDczNjQgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjkgOyMgNzM2NyBhZGRzaTMvMQotTCQwNzk0Ci0JbGR3IDAoJXI1KSwlcjQgOyMgNzI2OCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IDQoJXI1KSwlcjIwIDsjIDcyNzIgcmVsb2FkX291dHNpKzIvNQotCXN1YiAlcjYsJXI0LCVyMTkgOyMgNzI2OSBzdWJzaTMvMQotCWxkbyAyKCVyMTkpLCVyMTkgOyMgNzI3MCBhZGRzaTMvMgotCWNvbWIsPDwgJXIyMCwlcjE5LEwkMDc5NgotCW5vcCA7IyA3Mjc0IGJsZXUrMQotTCQwNzk1Ci0JbGRpIDcsJXIxOSA7IyA3Mzg5IG1vdnFpKzEvMgotCXN0YnMsbWEgJXIxOSwxKCVyNikgOyMgNzM5MCBtb3ZxaSsxLzYKLQlibCBMJDAwNDMsJXIwIDsjIDc0MDUganVtcAotCXN0YnMsbWEgJXIzLDEoJXI2KSA7IyA3MzkzIG1vdnFpKzEvNgotTCQwODExCi0JYmIsPCAlcjE1LDMwLEwkMDEwNAotCW5vcCA7IyA3NDE0IGJsZXUrMwotTCQwMzk3Ci0JY29taWIsPSAwLCVyMTQsTCQwODE1IDsjIDc0MjkgYmxldSsxCi0JYWRkbCAlcjE0LCVyNywlcjE5IDsjIDc0MzAgYWRkc2kzLzEKLQlibCBMJDA4MTYsJXIwIDsjIDc0MzQganVtcAotCWxkYiAwKCVyMTkpLCVyMTkgOyMgNzQzMyB6ZXJvX2V4dGVuZHFpc2kyLzIKLUwkMDgxNQotCWNvcHkgJXI3LCVyMTkgOyMgNzQzOCByZWxvYWRfb3V0c2krMi8xCi1MJDA4MTYKLQljb3B5ICVyMTksJXI3IDsjIDc0NDEgcmVsb2FkX291dHNpKzIvMQotTCQwMDc2Ci0JY29taWIsPSxuIDAsJXI5LEwkMDgyMCA7IyA3NDYwIGJsZXUrMQotCWxkYiAwKCVyOSksJXIyMCA7IyA3NDYzIHplcm9fZXh0ZW5kcWlzaTIvMgotCWFkZGwgJXI5LCVyMjAsJXIxOSA7IyA3NDY0IGFkZHNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3NDY1IGFkZHNpMy8yCi0JY29tYiw8PiAlcjYsJXIxOSxMJDA4MjAgOyMgNzQ2NyBibGV1KzEKLQlsZGkgMjU1LCVyMTkgOyMgNzQ3MiByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzQ3NCBibGV1KzEKLQlsZHcgLTI5NiglcjMwKSwlcjIxIDsjIDc0NzYgcmVsb2FkX291dHNpKzIvNQotCWxkYiAwKCVyMjEpLCVyMTkgOyMgNzQ3OCBtb3ZxaSsxLzUKLQlleHRycyAlcjE5LDMxLDgsJXIyMCA7IyA3NDc5IGV4dGVuZHFpc2kyCi0JbGRpIDQyLCVyMTkgOyMgNzQ4MSByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzQ4MyBibGV1KzEKLQlsZGkgOTQsJXIxOSA7IyA3NDkwIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwODIwIDsjIDc0OTIgYmxldSsxCi0JYmIsPj0gJXIxNSwzMCxMJDA4MjEgOyMgNzQ5NyBtb3ZzaS00Ci0JbGRpIDkyLCVyMTkgOyMgNzUwNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw8PixuICVyMTksJXIyMCxMJDA4MjIgOyMgNzUwNiBibGV1KzEKLQlsZGIgMSglcjIxKSwlcjE5IDsjIDc1MTAgbW92cWkrMS81Ci0JZXh0cnMgJXIxOSwzMSw4LCVyMjAgOyMgNzUxMSBleHRlbmRxaXNpMgotTCQwODIxCi0JbGRpIDQzLCVyMTkgOyMgNzUzNCByZWxvYWRfb3V0c2krMi8yCi0JY29tYiw9ICVyMTksJXIyMCxMJDA4MjAgOyMgNzUzNiBibGV1KzEKLQlsZGkgNjMsJXIxOSA7IyA3NTQzIHJlbG9hZF9vdXRzaSsyLzIKLQljb21iLD0sbiAlcjE5LCVyMjAsTCQwODIwIDsjIDc1NDUgYmxldSsxCi1MJDA4MjIKLQliYiw+PSxuICVyMTUsMjIsTCQwODE5IDsjIDc1NTMgbW92c2ktNAotCWJiLD49ICVyMTUsMTksTCQwODIzIDsjIDc1NTggbW92c2ktNAotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgNzU2MCByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIxOSksJXIxOSA7IyA3NTYyIG1vdnFpKzEvNQotCWxkaSAxMjMsJXIyMCA7IyA3NTY1IHJlbG9hZF9vdXRzaSsyLzIKLQlleHRycyAlcjE5LDMxLDgsJXIxOSA7IyA3NTYzIGV4dGVuZHFpc2kyCi0JY29tYiw9LG4gJXIyMCwlcjE5LEwkMDgyMCA7IyA3NTY3IGJsZXUrMQotCWxkdyAwKCVyNSksJXI0IDsjIDgyMjggcmVsb2FkX291dHNpKzIvNQotCWJsLG4gTCQxMTc3LCVyMCA7IyA3NTY4IGp1bXAKLUwkMDgyMwotCWxkdyAtMjk2KCVyMzApLCVyMjEgOyMgNzU3MiByZWxvYWRfb3V0c2krMi81Ci0JbGRiIDAoJXIyMSksJXIxOSA7IyA3NTc0IG1vdnFpKzEvNQotCWxkaSA5MiwlcjIwIDsjIDc1NzcgcmVsb2FkX291dHNpKzIvMgotCWV4dHJzICVyMTksMzEsOCwlcjE5IDsjIDc1NzUgZXh0ZW5kcWlzaTIKLQljb21iLDw+LG4gJXIyMCwlcjE5LEwkMDgxOSA7IyA3NTc5IGJsZXUrMQotCWxkYiAxKCVyMjEpLCVyMTkgOyMgNzU4MyBtb3ZxaSsxLzUKLQlsZGkgMTIzLCVyMjAgOyMgNzU4NiByZWxvYWRfb3V0c2krMi8yCi0JZXh0cnMgJXIxOSwzMSw4LCVyMTkgOyMgNzU4NCBleHRlbmRxaXNpMgotCWNvbWIsPD4sbiAlcjIwLCVyMTksTCQwODE5IDsjIDc1ODggYmxldSsxCi1MJDA4MjAKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjIwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgODIyMyByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA4MjIxIHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA4MjIyIGFkZHNpMy8yCi0JY29tYiw+Pj0gJXIyMCwlcjE5LEwkMDgyOSA7IyA4MjI0IGJsZXUrMQotCWNvcHkgJXI2LCVyOCA7IyA3NTk2IHJlbG9hZF9vdXRzaSsyLzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NTEgcmVsb2FkX291dHNpKzIvMwotTCQwODMwCi0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA3NjI0IGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDc2MzQgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwODM1IDsjIDc2NDIgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDc2MzYgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDc2NDUgcmVsb2FkX291dHNpKzIvNgotTCQwODM1Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDc2NTIgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNzY1NiBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA3NjU0IHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNzY2NCBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDc2NjAgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA4MjggOyMgNzY3NCBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc2NzYgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNzY3OSBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDc2ODAgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA4MzggOyMgNzY4NSBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDc2ODMgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3Njg2IHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3Njg5IGFkZHNpMy8xCi1MJDA4MzgKLQljb21pYiw9IDAsJXI4LEwkMDgzOSA7IyA3NjkyIGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzY5MyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3Njk2IGFkZHNpMy8xCi1MJDA4MzkKLQljb21pYiw9IDAsJXI5LEwkMDgyOCA7IyA3Njk5IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzcwMCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3NzAzIGFkZHNpMy8xCi1MJDA4MjgKLQlsZHcgMCglcjUpLCVyNCA7IyA3NjA0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzYwOCByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3NjA1IHN1YnNpMy8xCi0JbGRvIDIoJXIxOSksJXIxOSA7IyA3NjA2IGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwODMwCi0Jbm9wIDsjIDc2MTAgYmxldSsxCi1MJDA4MjkKLQlsZGkgMSwlcjE5IDsjIDc3MjUgbW92cWkrMS8yCi0Jc3RicyxtYSAlcjE5LDEoJXI2KSA7IyA3NzI2IG1vdnFpKzEvNgotCXN0YnMsbWEgJXIwLDEoJXI2KSA7IyA3NzI5IG1vdnFpKzEvNgotCWxkbyAtMSglcjYpLCVyOSA7IyA3NzQxIGFkZHNpMy8yCi1MJDA4MTkKLQlsZHcgMCglcjUpLCVyNCA7IyA4MjI4IHJlbG9hZF9vdXRzaSsyLzUKLUwkMTE3NwotCWxkdyA0KCVyNSksJXIyMCA7IyA4MjMxIHJlbG9hZF9vdXRzaSsyLzUKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDgyMjkgc3Vic2kzLzEKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDgyMzAgYWRkc2kzLzIKLQljb21iLD4+PSxuICVyMjAsJXIxOSxMJDA4NDggOyMgODIzMiBibGV1KzEKLQlsZGlsIEwnNjU1MzYsJXIzIDsjIDg1NDkgcmVsb2FkX291dHNpKzIvMwotTCQwODQ5Ci0JY29tYiw9ICVyMywlcjIwLEwkMDk0NCA7IyA3NzcxIGJsZXUrMQotCXpkZXAgJXIyMCwzMCwzMSwlcjE5IDsjIDc3ODEgYXNobHNpMysxCi0JY29tYiw+Pj0gJXIzLCVyMTksTCQwODU0IDsjIDc3ODkgYmxldSsxCi0Jc3R3ICVyMTksNCglcjUpIDsjIDc3ODMgcmVsb2FkX291dHNpKzIvNgotCXN0dyAlcjMsNCglcjUpIDsjIDc3OTIgcmVsb2FkX291dHNpKzIvNgotTCQwODU0Ci0JbGR3IDAoJXI1KSwlcjI2IDsjIDc3OTkgcmVsb2FkX291dHNpKzIvNQotCS5DQUxMIEFSR1cwPUdSLEFSR1cxPUdSCi0JYmwgcmVhbGxvYywlcjIgOyMgNzgwMyBjYWxsX3ZhbHVlX2ludGVybmFsX3N5bXJlZgotCWxkdyA0KCVyNSksJXIyNSA7IyA3ODAxIHJlbG9hZF9vdXRzaSsyLzUKLQljb21pY2xyLDw+IDAsJXIyOCwlcjAgOyMgNzgxMSBibGV1KzEKLQlibCBMJDA5NTMsJXIwCi0Jc3R3ICVyMjgsMCglcjUpIDsjIDc4MDcgcmVsb2FkX291dHNpKzIvNgotCWNvbWIsPSAlcjI4LCVyNCxMJDA4NDcgOyMgNzgyMSBibGV1KzEKLQlzdWIgJXI2LCVyNCwlcjE5IDsjIDc4MjMgc3Vic2kzLzEKLQlhZGRsICVyMjgsJXIxOSwlcjYgOyMgNzgyNiBhZGRzaTMvMQotCXN1YiAlcjEyLCVyNCwlcjE5IDsjIDc4Mjcgc3Vic2kzLzEKLQljb21pYiw9IDAsJXIxMCxMJDA4NTcgOyMgNzgzMiBibGV1KzEKLQlhZGRsICVyMjgsJXIxOSwlcjEyIDsjIDc4MzAgYWRkc2kzLzEKLQlzdWIgJXIxMCwlcjQsJXIxOSA7IyA3ODMzIHN1YnNpMy8xCi0JYWRkbCAlcjI4LCVyMTksJXIxMCA7IyA3ODM2IGFkZHNpMy8xCi1MJDA4NTcKLQljb21pYiw9IDAsJXI4LEwkMDg1OCA7IyA3ODM5IGJsZXUrMQotCXN1YiAlcjgsJXI0LCVyMTkgOyMgNzg0MCBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOCA7IyA3ODQzIGFkZHNpMy8xCi1MJDA4NTgKLQljb21pYiw9IDAsJXI5LEwkMDg0NyA7IyA3ODQ2IGJsZXUrMQotCXN1YiAlcjksJXI0LCVyMTkgOyMgNzg0NyBzdWJzaTMvMQotCWFkZGwgJXIyOCwlcjE5LCVyOSA7IyA3ODUwIGFkZHNpMy8xCi1MJDA4NDcKLQlsZHcgMCglcjUpLCVyNCA7IyA3NzUxIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgNCglcjUpLCVyMjAgOyMgNzc1NSByZWxvYWRfb3V0c2krMi81Ci0Jc3ViICVyNiwlcjQsJXIxOSA7IyA3NzUyIHN1YnNpMy8xCi0JbGRvIDEoJXIxOSksJXIxOSA7IyA3NzUzIGFkZHNpMy8yCi0JY29tYiw8PCAlcjIwLCVyMTksTCQwODQ5Ci0Jbm9wIDsjIDc3NTcgYmxldSsxCi1MJDA4NDgKLQlzdGJzLG1hICVyNywxKCVyNikgOyMgNzg3MiBtb3ZxaSsxLzYKLQlsZGIgMCglcjkpLCVyMTkgOyMgNzg4NSBtb3ZxaSsxLzUKLQlsZG8gMSglcjE5KSwlcjE5IDsjIDc4ODggYWRkc2kzLzIKLQlzdGIgJXIxOSwwKCVyOSkgOyMgNzg5MCBtb3ZxaSsxLzYKLUwkMDA0MwotCWxkdyAtMjk2KCVyMzApLCVyMTkgOyMgMjMyOCByZWxvYWRfb3V0c2krMi81Ci1MJDExNjEKLQljb21jbHIsPSAlcjE2LCVyMTksJXIwIDsjIDI1OCBibGV1KzEKLQlibCBMJDExNzgsJXIwCi0JbGR3IC0yOTYoJXIzMCksJXIxOSA7IyAyMzM0IHJlbG9hZF9vdXRzaSsyLzUKLUwkMDA0NAotCWNvbWliLD0gMCwlcjEwLEwkMDg2NSA7IyA3OTEzIGJsZXUrMQotCWxkaSAxMywlcjI2IDsjIDc5MTggcmVsb2FkX291dHNpKzIvMgotCWNvcHkgJXIxMCwlcjI1IDsjIDc5MjAgcmVsb2FkX291dHNpKzIvMQotCXN1YiAlcjYsJXIyNSwlcjI0IDsjIDc5MTUgc3Vic2kzLzEKLQkuQ0FMTCBBUkdXMD1HUixBUkdXMT1HUixBUkdXMj1HUgotCWJsIHN0b3JlX29wMSwlcjIgOyMgNzkyNCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkbyAtMyglcjI0KSwlcjI0IDsjIDc5MjIgYWRkc2kzLzIKLUwkMDg2NQotCWxkdyAtMzA0KCVyMzApLCVyMTkgOyMgNzkyOCByZWxvYWRfb3V0c2krMi81Ci0JY29taWIsPD4sbiAwLCVyMTksTCQwODY2IDsjIDc5MzAgYmxldSsxCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyA3OTQ2IGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyA3OTQ0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgMCglcjUpLCVyMTkgOyMgNzk0OSByZWxvYWRfb3V0c2krMi81Ci0JbGRpIDAsJXIyOCA7IyA3OTU1IHJlbG9hZF9vdXRzaSsyLzIKLQlzdWIgJXI2LCVyMTksJXIxOSA7IyA3OTUwIHN1YnNpMy8xCi0JYmwgTCQwODY3LCVyMCA7IyA3OTU3IGp1bXAKLQlzdHcgJXIxOSw4KCVyNSkgOyMgNzk1MiByZWxvYWRfb3V0c2krMi82Ci1MJDA4OTUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDIyNjkgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDIyNjcgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMjI3MyBqdW1wCi0JbGRpIDExLCVyMjggOyMgMjI3MSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MDAKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDMxNjEgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDMxNTkgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgMzE2NSBqdW1wCi0JbGRpIDQsJXIyOCA7IyAzMTYzIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkwMgotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgMzIxOCBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgMzIxNiByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyAzMjIyIGp1bXAKLQlsZGkgNywlcjI4IDsjIDMyMjAgcmVsb2FkX291dHNpKzIvMgotTCQwOTAzCi0JLkNBTEwgQVJHVzA9R1IKLQlibCBmcmVlLCVyMiA7IyAzODAzIGNhbGxfaW50ZXJuYWxfc3ltcmVmCi0JbGR3IC0zMTIoJXIzMCksJXIyNiA7IyAzODAxIHJlbG9hZF9vdXRzaSsyLzUKLQlibCBMJDA4NjcsJXIwIDsjIDM4MDcganVtcAotCWxkaSA1LCVyMjggOyMgMzgwNSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MTUKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDU0NjEgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDU0NTkgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNTQ2NSBqdW1wCi0JbGRpIDksJXIyOCA7IyA1NDYzIHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkxNwotCS5DQUxMIEFSR1cwPUdSCi0JYmwgZnJlZSwlcjIgOyMgNTU1NyBjYWxsX2ludGVybmFsX3N5bXJlZgotCWxkdyAtMzEyKCVyMzApLCVyMjYgOyMgNTU1NSByZWxvYWRfb3V0c2krMi81Ci0JYmwgTCQwODY3LCVyMCA7IyA1NTYxIGp1bXAKLQlsZGkgMTMsJXIyOCA7IyA1NTU5IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDkyMgotCWJsIEwkMDg2NywlcjAgOyMgNTk4MyBqdW1wCi0JbGRpIDE0LCVyMjggOyMgNTk4MSByZWxvYWRfb3V0c2krMi8yCi1MJDA5MzkKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDcyMzUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDcyMzMgcmVsb2FkX291dHNpKzIvNQotCWJsIEwkMDg2NywlcjAgOyMgNzIzOSBqdW1wCi0JbGRpIDYsJXIyOCA7IyA3MjM3IHJlbG9hZF9vdXRzaSsyLzIKLUwkMDk0NAotCWJsIEwkMDg2NywlcjAgOyMgNzc3NSBqdW1wCi0JbGRpIDE1LCVyMjggOyMgNzc3MyByZWxvYWRfb3V0c2krMi8yCi1MJDA4NjYKLQkuQ0FMTCBBUkdXMD1HUgotCWJsIGZyZWUsJXIyIDsjIDc5MzUgY2FsbF9pbnRlcm5hbF9zeW1yZWYKLQlsZHcgLTMxMiglcjMwKSwlcjI2IDsjIDc5MzMgcmVsb2FkX291dHNpKzIvNQotCWxkaSA4LCVyMjggOyMgNzkzNyByZWxvYWRfb3V0c2krMi8yCi1MJDA4NjcKLQlsZHcgLTM0MCglcjMwKSwlcjIgOyMgOTAyNiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNjgoJXIzMCksJXIxOCA7IyA5MDI4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE2NCglcjMwKSwlcjE3IDsjIDkwMzAgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTYwKCVyMzApLCVyMTYgOyMgOTAzMiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNTYoJXIzMCksJXIxNSA7IyA5MDM0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE1MiglcjMwKSwlcjE0IDsjIDkwMzYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTQ4KCVyMzApLCVyMTMgOyMgOTAzOCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xNDQoJXIzMCksJXIxMiA7IyA5MDQwIHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTE0MCglcjMwKSwlcjExIDsjIDkwNDIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTM2KCVyMzApLCVyMTAgOyMgOTA0NCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMzIoJXIzMCksJXI5IDsjIDkwNDYgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTI4KCVyMzApLCVyOCA7IyA5MDQ4IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTEyNCglcjMwKSwlcjcgOyMgOTA1MCByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMjAoJXIzMCksJXI2IDsjIDkwNTIgcmVsb2FkX291dHNpKzIvNQotCWxkdyAtMTE2KCVyMzApLCVyNSA7IyA5MDU0IHJlbG9hZF9vdXRzaSsyLzUKLQlsZHcgLTExMiglcjMwKSwlcjQgOyMgOTA1NiByZWxvYWRfb3V0c2krMi81Ci0JbGR3IC0xMDgoJXIzMCksJXIzIDsjIDkwNTggcmVsb2FkX291dHNpKzIvNQotCWJ2ICVyMCglcjIpIDsjIDkwNjEgcmV0dXJuX2ludGVybmFsCi0JbGRvIC0zMjAoJXIzMCksJXIzMCA7IyA5MDYwIGFkZHNpMy8yCi0JLkVYSVQKLQkuUFJPQ0VORAotCS5TUEFDRSAkUFJJVkFURSQKLQkuU1VCU1BBICRCU1MkCi0KLQkuYWxpZ24gMQotcmVfc3ludGF4X3RhYmxlCi0JLmJsb2NrIDI1NgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9jb21tb24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvY29tbW9uLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MmIwY2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9jb21tb24ucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci10ZXh0X3N5bWJvbDoJCi0JLmxvbmcJMQotCS5sb25nCWV4dGVybmFsX3N5bWJvbAotCS5kYXRhCi1kYXRhX3N5bWJvbDoKLQkubG9uZwkyCi1jb21tb25fc3ltYm9sCS5jb21tCTQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZnJhZ2J1Zy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9mcmFnYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzQxOTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9mcmFnYnVnLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQkuU1BBQ0UgJFRFWFQkCQotCS5TVUJTUEEgJENPREUkCQotCW5vcAkJCQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9nbG9iYWxidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvZ2xvYmFsYnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwZjA1ZjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9nbG9iYWxidWcucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQotCS5zcGFjZSAkUFJJVkFURSQKLQkuc3Vic3BhICRHTE9CQUwkCi0JLmV4cG9ydCAkZ2xvYmFsJAotJGdsb2JhbCQKLQkuc3BhY2UgJFRFWFQkCi0JLnN1YnNwYSAkQ09ERSQKLQotCS5wcm9jCi0JLmNhbGxpbmZvCi1pdmFhZGRyCi0Jbm9wCi0Jbm9wCi0JYWRkaWwgTCVpdmFhZGRyLSRnbG9iYWwkLCVkcAotCWxkbyAgIFIlaXZhYWRkci0kZ2xvYmFsJCglcjEpLCVyMTkKLQkucHJvY2VuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvaW1wb3J0YnVnLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNGFmYjYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9pbXBvcnRidWcucworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCS5JTVBPUlQgJGdsb2JhbCQsREFUQQotCS5JTVBPUlQgJCRkeW5jYWxsLE1JTExJQ09ERQotOyBnY2NfY29tcGlsZWQuOgotCS5FWFBPUlQgZm9vLERBVEEKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQKLQotCS5hbGlnbiA0Ci1mb286Ci0JLndvcmQgMAotCS5JTVBPUlQgX19tYWluLENPREUKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkQ09ERSQKLQotCS5hbGlnbiA0Ci0JLkVYUE9SVCBtYWluLENPREUKLQkuRVhQT1JUIG1haW4sRU5UUlksUFJJVl9MRVY9MyxSVE5WQUw9R1IKLW1haW46Ci0JLlBST0MKLQkuQ0FMTElORk8gRlJBTUU9NjQsQ0FMTFMsU0FWRV9SUCxTQVZFX1NQLEVOVFJZX0dSPTMKLQkuRU5UUlkKLQkuaW1wb3J0IGZvbwotCXN0dyAlcjIsLTIwKDAsJXIzMCkKLQljb3B5ICVyMywlcjEKLQljb3B5ICVyMzAsJXIzCi0Jc3R3bSAlcjEsNjQoJXIzMCkKLQkuQ0FMTCAKLQlibCBfX21haW4sJXIyCi0Jbm9wCi1MJDAwMDE6Ci0JbGR3IC0yMCglcjMpLCVyMgotCWxkbyA2NCglcjMpLCVyMzAKLQlsZHdtIC02NCglcjMwKSwlcjMKLQlidixuICVyMCglcjIpCi0JLkVYSVQKLQkuUFJPQ0VORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sYWJlbGRpZmZzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xhYmVsZGlmZnMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVlNjZmOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xhYmVsZGlmZnMucworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTsgU2hvdWxkIGNoZWNrIHRvIG1ha2Ugc3VyZSBzb21ldGhpbmcgdXNlZnVsIGdldHMgcHV0IG9uIHRob3NlIC53b3JkCi07IHN0YXRlbWVudHMuCi0gICAgICAgIC5zcGFjZQkkVEVYVCQKLSAgICAgICAgLnN1YnNwYQkkQ09ERSQKLQotCS5hbGlnbgk4Ci0JLmV4cG9ydAlpY29kZSxkYXRhCi1pY29kZToKLQkucHJvYwotCS5jYWxsaW5mbwlmcmFtZT0wLG5vX2NhbGxzCi0JLmVudHJ5Ci0JYnYsbgklcjAoJXIyKQotCS5leGl0Ci0Jbm9wCi0JLnByb2NlbmQKLQotCTsKLQk7IEZJUlNULCBhcmd2IGFycmF5IG9mIHBvaW50ZXJzIHRvIGFyZ3MsIDFzdCBpcyBzYW1lIGFzIHBhdGguCi0JOwotCS5hbGlnbgk4Ci1pY19hcmd2OgotCS53b3JkCWljX2FyZ3YxLWljb2RlCTsgc2Vjb25kLCBwb2ludGVyIHRvIDFzdCBhcmd1bWVudAotCS53b3JkCWljX3BhdGgtaWNvZGUJCTsgZmlyc3QsICBwb2ludGVyIHRvIGluaXQgcGF0aAotCS53b3JkCTAJCQk7IGZvdXJ0aCwgTlVMTCBhcmd2IHRlcm1pbmF0b3IgKHBhZCkKLQkud29yZAkwCQkJOyB0aGlyZCwgIE5VTEwgYXJndiB0ZXJtaW5hdG9yCi0KLWljX3BhdGg6Ci0JLmJsb2Nregk0MDk2CQkJOyBtdXN0IGJlIG11bHRpcGxlIG9mIDQgYnl0ZXMKLQkud29yZAkwCQkJOyBpbiBjYXNlIGZ1bGwgc3RyaW5nIGlzIHVzZWQKLQkud29yZAkwCQkJOyB0aGlzIHdpbGwgYmUgdGhlIHN0cmluZyB0ZXJtaW5hdG9yCi0KLWljX2FyZ3YxOgotCS5ibG9ja3oJNDA5NgkJCTsgbXVzdCBiZSBtdWx0aXBsZSBvZiA0IGJ5dGVzCi0JLndvcmQJMAkJCTsgaW4gY2FzZSBmdWxsIHN0cmluZyBpcyB1c2VkCi0JLndvcmQJMAkJCTsgdGhpcyB3aWxsIGJlIHRoZSBzdHJpbmcgdGVybWluYXRvcgotCi0JLmV4cG9ydAlzemljb2RlLGRhdGEKLXN6aWNvZGU6Ci0JLndvcmQJc3ppY29kZS1pY29kZQotCS53b3JkCTAJCQk7IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZmlsbGVyIGF0IGVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC9sb2NhbGxhYmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xvY2FsbGFiZWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1NzIxZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL2xvY2FsbGFiZWwucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkuU1BBQ0UgJFBSSVZBVEUkCi0JLlNVQlNQQSAkREFUQSQsUVVBRD0xLEFMSUdOPTgsQUNDRVNTPTMxCi0JLlNVQlNQQSAkQlNTJCxRVUFEPTEsQUxJR049OCxBQ0NFU1M9MzEsWkVSTyxTT1JUPTgyCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJExJVCQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0Ci0JLlNVQlNQQSAkQ09ERSQsUVVBRD0wLEFMSUdOPTgsQUNDRVNTPTQ0LENPREVfT05MWQotCi0JLlNQQUNFICRURVhUJAotCS5TVUJTUEEgJENPREUkCi0KLQkuYWxpZ24gNAotCi1MYWJlbDoKLUwkMDEyMzQ6Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvc3NfYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvc3NfYWxpZ24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5OGViMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9ocHBhL3Vuc29ydGVkL3NzX2FsaWduLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkLFFVQUQ9MSxBTElHTj02NCxBQ0NFU1M9MzEKLQkuU1BBQ0UgJFRFWFQkCi0JLlNVQlNQQSAkTElUJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQKLQkuU1VCU1BBICRDT0RFJCxRVUFEPTAsQUxJR049OCxBQ0NFU1M9NDQsQ09ERV9PTkxZCi0JLklNUE9SVCAkZ2xvYmFsJCxEQVRBCi0JLklNUE9SVCAkJGR5bmNhbGwsTUlMTElDT0RFCi07IGdjY19jb21waWxlZC46Ci0JLlNQQUNFICRQUklWQVRFJAotCS5TVUJTUEEgJERBVEEkCi1zeW0xOgkuV09SRCAyCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2hwcGEvdW5zb3J0ZWQvdW5zb3J0ZWQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzAwYzcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaHBwYS91bnNvcnRlZC91bnNvcnRlZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUgVW5pdmVyc2l0eSBvZiBVdGFoCi0jIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19zdWJzcGFjZV9hbGlnbl90ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInNzX2FsaWduLnM6IFRlc3Qgc3Vic3BhY2UgYWxpZ25tZW50IChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgInNzX2FsaWduLnMiICIiICJzdWJzcGFjZSBhbGlnbm1lbnQgKHBhcnQgMSkiXSB0aGVuIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItaCIKLQotICAgICMgQ2hlY2sgdGhlIGhlYWRlcnMgZm9yIHRoZSBjb3JyZWN0IGFsaWdubWVudCB2YWx1ZSBmb3IgdGhlCi0gICAgIyAuZGF0YSBzZWN0aW9uIChlbGYpIG9yIHRoZSAkREFUQSQgc3Vic3BhY2UgKHNvbSkuCi0JaWYgW2lzdGFyZ2V0IGhwcGEqLSotKmVsZipdIHRoZW4gewotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0IHsKLQkJICAgIC1yZSAiZGF0YVxbXlxuXF0qIDIuLjZcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQkgICAgZW9mCQkJCXsgYnJlYWsgfQotCQl9Ci0JICAgIH0KLQl9IGVsc2UgewotCSAgICB3aGlsZSAxIHsKLQkJZXhwZWN0ICB7Ci0JCSAgICAtcmUgIkRBVEFcW15cblxdKiAyLi42XFteXG5cXSpcbiIJeyBzZXQgeCAxIH0KLQkJICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JCSAgICB0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJICAgIGVvZgkJCQl7IGJyZWFrIH0KLQkJfQotCSAgICB9Ci0JfQotCi0JIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0JIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0Jb2JqZHVtcF9maW5pc2gKLQotCSMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLQlpZiBbZXhwciAkeD09MV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLSAgICB9Ci19Ci0KLXByb2MgZG9fbG9jYWxfbGFiZWxfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb2NhbGxhYmVsLnM6IEVsaW1pbmF0aW9uIG9mIGxvY2FsIGxhYmVscyAocGFydCAyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbZ2FzX3Rlc3Rfb2xkICJsb2NhbGxhYmVsLnMiICIiICJFbGltaW5hdGlvbiBvZiBsb2NhbCBsYWJlbHMgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItdCIKLQotCXdoaWxlIDEgewotCSAgICBleHBlY3QgewotCQktcmUgIl4wMDAwMDAwMFxbXlxuXF0qTGFiZWxcW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJeMDAwMDAwMDBcW15cblxdKkxcJDAxMjM0XFteXG5cXSpcbiIJeyBzZXQgeCAwIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19mcmNoYWluX3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiZnJhZ2J1Zy5zOiBUZXN0IGJ1ZyBpbiBmcmFnIGNoYWluaW5nIChwYXJ0IDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImZyYWdidWcucyIgIiIgIlRlc3QgYnVnIGluIGZyYWcgY2hhaW5pbmcgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMHgwMDAwMDAwMFxbXlxuXF0qbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXjB4MDAwMDAwMDRcW15cblxdKm5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDAgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1wcm9jIGRvX2FsaWduM190ZXN0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFsaWduMy5zOiBUZXN0IGZvciBhbGlnbm1lbnQgYnVnIHdoZW4gc3dpdGNoaW5nIHN1YnNwYWNlcyAocGFydDIpIgotICAgIHNldCB4IDAKLQotICAgIGlmIFtnYXNfdGVzdF9vbGQgImFsaWduMy5zIiAiIiAiVGVzdCBmb3IgYWxpZ25tZW50IGJ1ZyB3aGVuIHN3aXRjaGluZyBzdWJzcGFjZXMgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXByZWZpeC1hZGRyZXNzZXMgLWQiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJcW15cblxdKiA8bWFpbj4gbm9wXFteXG5cXSpcbiIJCXsgc2V0IHggMSB9Ci0JCS1yZSAiXFteXG5cXSogPC4qZW5kX21haW4+IG5vcFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCQktcmUgIlxbXlxuXF0qIDxtYWluKy4qPiBub3BcW15cblxdKlxuIgkJeyBzZXQgeCAwIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19hbGlnbjRfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhbGlnbjQuczogTW9yZSBzdWJzcGFjZSBhbGlnbm1lbnQgdGVzdHMgKHBhcnQyKSIKLSAgICBzZXQgeCAwCi0KLSAgICBpZiBbaXN0YXJnZXQgaHBwYSotKi0qZWxmKl0gdGhlbiB7Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYWxpZ240LnMiICIiICJNb3JlIHN1YnNwYWNlIGFsaWdubWVudCB0ZXN0cyAocGFydDEpIl0gewotCW9iamR1bXBfc3RhcnRfbm9fc3ViZGlyICJhLm91dCIgIi1oIgotCi0Jd2hpbGUgMSB7Ci0JICAgIGV4cGVjdCB7Ci0JCS1yZSAiXFteXG5cXSpNSUxMSUNPREVcW15cblxdKjIuLjZcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXFteXG5cXSpZQUJCQVxbXlxuXF0qMi4uM1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0yXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19pbXBvcnRfdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJpbXBvcnRidWcuczogVGVzdCBmb3IgYnVnIGluIC5pbXBvcnQgZGlyZWN0aXZlIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiaW1wb3J0YnVnLnMiICIiICJUZXN0IGZvciBidWcgaW4gLmltcG9ydCBkaXJlY3RpdmUgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXN5bXMiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJcW15cblxdKi5EQVRBLi5mb29cW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKi5kYXRhLipmb29cW15cblxdKlxuIgkJeyBzZXQgeCAxIH0KLQkJLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkJdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCQllb2YJCQkJeyBicmVhayB9Ci0JICAgIH0KLQl9Ci0KLQkjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLQkjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLQlvYmpkdW1wX2ZpbmlzaAotCi0JIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotCWlmIFtleHByICR4PT0xXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotICAgIH0KLX0KLQotcHJvYyBkb19jb21tb25fdGVzdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJjb21tb24uczogVGVzdCBmb3IgYnVnIGluIC5jb21tIGhhbmRsaW5nIChwYXJ0MikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAiY29tbW9uLnMiICIiICJUZXN0IGZvciBidWcgaW4gLmNvbW0gaGFuZGxpbmcgKHBhcnQxKSJdIHsKLQlvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciAiYS5vdXQiICItLXN5bXMiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJcW15cblxdKi5DT00uKmNvbW1vbl9zeW1ib2xcW15cblxdKlxuIgl7IHNldCB4IDEgfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQotCSMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotCSMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotCW9iamR1bXBfZmluaXNoCi0KLQkjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0JaWYgW2V4cHIgJHg9PTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci0gICAgfQotfQotCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB0aGVuIHsKLSAgICAjIE1ha2Ugc3VyZSBzdWJzcGFjZSBhbGlnbm1lbnQgcmVxdWVzdHMgZnJvbSB0aGUgc3Vic3BhY2UgZGlyZWN0aXZlcwotICAgICMgYXJlIGhvbm9yZWQKLSAgICBkb19zdWJzcGFjZV9hbGlnbl90ZXN0Ci0KLSAgICAjIE1ha2Ugc3VyZSB0aGUgY29ycmVjdCBsYWJlbHMgZW5kIHVwIGluIHRoZSBzeW1ib2wgdGFibGUKLSAgICBkb19sb2NhbF9sYWJlbF90ZXN0Ci0KLSAgICAjIEdBUy0xLjM2IGNob2tlZCBvbiB0aGlzIGZpbGUuCi0gICAgZ2FzX3Rlc3QgImxhYmVsZGlmZnMucyIgIiIgIiIgIkRpZmZlcmVuY2Ugb2YgbGFiZWxzIgotCi0gICAgIyBUZXN0IGEgcmVjZW50IGJ1ZyB3aGVyZSBmcmFnIGNoYWluaW5nIHdhc24ndCB3b3JraW5nIGNvcnJlY3RseS4KLSAgICBkb19mcmNoYWluX3Rlc3QKLQotICAgICMgVGVzdCBidWcgd2hlcmUgc3dpdGNoaW5nIGJldHdlZW4gc3Vic3BhY2VzIGNyZWF0ZXMgYm9ndXMgYWxpZ25tZW50cwotICAgIGRvX2FsaWduM190ZXN0Ci0KLSAgICAjIFRlc3QgYnVnIHdoZXJlIHN3aXRjaGluZyBiZXR3ZWVuIHN1YnNwYWNlcyBjcmVhdGVzIGJvZ3VzIGFsaWdubWVudHMKLSAgICBkb19hbGlnbjRfdGVzdAotCi0gICAgIyBUZXN0IGEgcHJvYmxlbSB3aGVyZSAkZ2xvYmFsJCBpcyBkZWZpbmVkLCB0aGVuIHVzZWQgd2l0aGluIHRoZQotICAgICMgc2FtZSBzb3VyY2UgZmlsZS4KLSAgICBzZXR1cF94ZmFpbCBocHBhKi0qLSoKLSAgICBnYXNfdGVzdCAiZ2xvYmFsYnVnLnMiICIiICIiICJVc2UgXCRnbG9iYWxcJCBpbiBmaWxlIHdoaWNoIGRlZmluZXMgaXQiCi0KLSAgICAjIFRlc3QgdGhhdCBpbXBvcnRpbmcgYSBkZWZpbmVkIHN5bWJvbCBkb2Vzbid0IHNjcmV3IHVwIHRoZSBzeW1ib2wncwotICAgICMgc3BhY2Uvc3Vic3BhY2UuCi0gICAgZG9faW1wb3J0X3Rlc3QKLQotICAgICMgVGVzdCBmb3IgYSBidWdsZXQgaW4gdGhlIGhhbmRsaW5nIG9mIGNvbW1vbiBzeW1ib2xzCi0gICAgZG9fY29tbW9uX3Rlc3QKLQotICAgICMgVGVzdCBmb3IgYW4gb2ZmLWJ5LTIgYnVnIGluIHJhbmdlIGNoZWNrIGZvciBjb25kaXRpb25hbCBicmFuY2hlcwotICAgIGdhc190ZXN0X2Vycm9yICJicmxlbmJ1Zy5zIiAiIiAiQ2hlY2sgZm9yIGVycm9yKHMpIGluIGJyYW5jaCBsZW5ndGgiCi0KLX0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvYW1kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjE2NzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQuZAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IGFtZAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMGYgMGQgMDMgWyAJXSpwcmVmZXRjaCBcKCVlYnhcKQotICAgMzoJMGYgMGQgMGMgNzUgMDAgMTAgMDAgMDAgWyAJXSpwcmVmZXRjaHcgMHgxMDAwXCgsJWVzaSwyXCkKLSAgIGI6CTBmIDBlIFsgCV0qZmVtbXMgIAotICAgZDoJMGYgMGYgMDAgYmYgWyAJXSpwYXZndXNiIFwoJWVheFwpLCVtbTAKLSAgMTE6CTBmIDBmIDQ4IDAyIDFkIFsgCV0qcGYyaWQgIDB4MlwoJWVheFwpLCVtbTEKLSAgMTY6CTBmIDBmIDkwIDAwIDAxIDAwIDAwIGFlIFsgCV0qcGZhY2MgIDB4MTAwXCglZWF4XCksJW1tMgotICAxZToJMGYgMGYgMWUgOWUgWyAJXSpwZmFkZCAgXCglZXNpXCksJW1tMwotICAyMjoJMGYgMGYgNjYgMDIgYjAgWyAJXSpwZmNtcGVxIDB4MlwoJWVzaVwpLCVtbTQKLSAgMjc6CTBmIDBmIGFlIDkwIDkwIDAwIDAwIDkwIFsgCV0qcGZjbXBnZSAweDkwOTBcKCVlc2lcKSwlbW01Ci0gIDJmOgkwZiAwZiA3NCA3NSAwMCBhMCBbIAldKnBmY21wZ3QgMHgwXCglZWJwLCVlc2ksMlwpLCVtbTYKLSAgMzU6CTBmIDBmIDdjIDc1IDAyIGE0IFsgCV0qcGZtYXggIDB4MlwoJWVicCwlZXNpLDJcKSwlbW03Ci0gIDNiOgkwZiAwZiA4NCA3NSA5MCA5MCA5MCA5MCA5NCBbIAldKnBmbWluICAweDkwOTA5MDkwXCglZWJwLCVlc2ksMlwpLCVtbTAKLSAgNDQ6CTBmIDBmIDBkIDA0IDAwIDAwIDAwIGI0IFsgCV0qcGZtdWwgIDB4NCwlbW0xCi0gIDRjOgkyZSAwZiAwZiA1NCBjMyAwNyA5NiBbIAldKnBmcmNwICAlY3M6MHg3XCglZWJ4LCVlYXgsOFwpLCVtbTIKLSAgNTM6CTBmIDBmIGQ4IGE2IFsgCV0qcGZyY3BpdDEgJW1tMCwlbW0zCi0gIDU3OgkwZiAwZiBlMSBiNiBbIAldKnBmcmNwaXQyICVtbTEsJW1tNAotICA1YjoJMGYgMGYgZWEgYTcgWyAJXSpwZnJzcWl0MSAlbW0yLCVtbTUKLSAgNWY6CTBmIDBmIGYzIDk3IFsgCV0qcGZyc3FydCAlbW0zLCVtbTYKLSAgNjM6CTBmIDBmIGZjIDlhIFsgCV0qcGZzdWIgICVtbTQsJW1tNwotICA2NzoJMGYgMGYgYzUgYWEgWyAJXSpwZnN1YnIgJW1tNSwlbW0wCi0gIDZiOgkwZiAwZiBjZSAwZCBbIAldKnBpMmZkICAlbW02LCVtbTEKLSAgNmY6CTBmIDBmIGQ3IGI3IFsgCV0qcGZtdWxocncgJW1tNywlbW0yCi0gIDczOgkyZSAwZiBbIAldKlwoYmFkXCkgIAotICA3NToJMGYgNTQgYzMgWyAJXSphbmRwcyAgJXhtbTMsJXhtbTAKLSAgNzg6CTA3IFsgCV0qcG9wICAgICVlcwotICA3OToJYzMgWyAJXSpyZXQgICAgCi0gIDdhOgk5MCBbIAldKm5vcCAgICAKLSAgN2I6CTkwIFsgCV0qbm9wICAgIAotICA3YzoJOTAgWyAJXSpub3AgICAgCi0gIDdkOgk5MCBbIAldKm5vcCAgICAKLSAgN2U6CTkwIFsgCV0qbm9wICAgIAotICA3ZjoJOTAgWyAJXSpub3AgICAgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9hbWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQwOWM2MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2FtZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotI0FNRCAzRE5vdyEgaW5zdHJ1Y3Rpb25zCi0KLS50ZXh0Ci1mb286Ci0gcHJlZmV0Y2gJKCVlYngpCi0gcHJlZmV0Y2h3CTB4MTAwMCgsJWVzaSwyKQotIGZlbW1zCi0gcGF2Z3VzYgkoJWVheCksJW1tMAotIHBmMmlkCQkyKCVlYXgpLCVtbTEKLSBwZmFjYwkJMHgxMDAoJWVheCksJW1tMgotIHBmYWRkCQkoJWVzaSksJW1tMwotIHBmY21wZXEJMiglZXNpKSwlbW00Ci0gcGZjbXBnZQkweDkwOTAoJWVzaSksJW1tNQotIHBmY21wZ3QJKCVlYnAsJWVzaSwyKSwlbW02Ci0gcGZtYXgJCTIoJWVicCwlZXNpLDIpLCVtbTcKLSBwZm1pbgkJMHg5MDkwOTA5MCglZWJwLCVlc2ksMiksJW1tMAotIHBmbXVsCQk0LCVtbTEKLSBwZnJjcAkJJWNzOjcoJWVieCwlZWF4LDgpLCVtbTIKLSBwZnJjcGl0MQklbW0wLCVtbTMKLSBwZnJjcGl0MgklbW0xLCVtbTQKLSBwZnJzcWl0MQklbW0yLCVtbTUKLSBwZnJzcXJ0CSVtbTMsJW1tNgotIHBmc3ViCQklbW00LCVtbTcKLSBwZnN1YnIJCSVtbTUsJW1tMAotIHBpMmZkCQklbW02LCVtbTEKLSBwbXVsaHJ3CSVtbTcsJW1tMgotCi0jIFRoaXMgaXMgYSAzRE5vdyEgaW5zdHJ1Y3Rpb24sIHdpdGggYSBwcmVmaXgsIHRoYXQgaXNuJ3QgcXVpdGUgcmlnaHQKLSMgRXZlcnl0aGluZydzIGdvb2QgYmFyIHRoZSBvcGNvZGUgc3VmZml4Ci0uYnl0ZSAweDJlLCAweDBmLCAweDBmLCAweDU0LCAweGMzLCAweDA3LCAweGMzCi0KLSMgUGFkIG91dCB0byBhIGdvb2QgYWxpZ25tZW50Ci0gLmJ5dGUgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZmxvYXQubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2Y2FkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LmwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MzogV2FybmluZzouKmZhZGRwLioKLS4qOjE0OiBXYXJuaW5nOi4qZnN1YnAuKgotLio6MjU6IFdhcm5pbmc6Lipmc3VicnAuKgotLio6MzY6IFdhcm5pbmc6LipmbXVscC4qCi0uKjo0NzogV2FybmluZzouKmZkaXZwLioKLS4qOjU4OiBXYXJuaW5nOi4qZmRpdnJwLioKLSAgIDEgWyAJXSoucHNpemUgMAotICAgMiBbIAldKi50ZXh0Ci0gICAzIDAwMDAgREVDMSBbIAldKmZhZGQKLS4qV2FybmluZzouKmZhZGRwLioKLSAgIDQgMDAwMiBEOEMzIFsgCV0qZmFkZAklc3RcKDNcKQotICAgNSAwMDA0IEQ4QzMgWyAJXSpmYWRkCSVzdFwoM1wpLCVzdAotICAgNiAwMDA2IERDQzMgWyAJXSpmYWRkCSVzdCwlc3RcKDNcKQotICAgNyAwMDA4IEQ4MDMgWyAJXSpmYWRkcwlcKCVlYnhcKQotICAgOCAwMDBhIERDMDMgWyAJXSpmYWRkbAlcKCVlYnhcKQotICAgOSAwMDBjIERFMDMgWyAJXSpmaWFkZHMJXCglZWJ4XCkKLSAgMTAgMDAwZSBEQTAzIFsgCV0qZmlhZGRsCVwoJWVieFwpCi0gIDExIDAwMTAgREVDMSBbIAldKmZhZGRwCi0gIDEyIDAwMTIgREVDMyBbIAldKmZhZGRwCSVzdFwoM1wpCi0gIDEzIDAwMTQgREVDMyBbIAldKmZhZGRwCSVzdCwlc3RcKDNcKQotICAxNCAwMDE2IERFRTEgWyAJXSpmc3ViCi0uKldhcm5pbmc6Lipmc3VicC4qCi0gIDE1IDAwMTggRDhFMyBbIAldKmZzdWIJJXN0XCgzXCkKLSAgMTYgMDAxYSBEOEUzIFsgCV0qZnN1Ygklc3RcKDNcKSwlc3QKLSAgMTcgMDAxYyBEQ0UzIFsgCV0qZnN1Ygklc3QsJXN0XCgzXCkKLSAgMTggMDAxZSBEODIzIFsgCV0qZnN1YnMJXCglZWJ4XCkKLSAgMTkgMDAyMCBEQzIzIFsgCV0qZnN1YmwJXCglZWJ4XCkKLSAgMjAgMDAyMiBERTIzIFsgCV0qZmlzdWJzCVwoJWVieFwpCi0gIDIxIDAwMjQgREEyMyBbIAldKmZpc3VibAlcKCVlYnhcKQotICAyMiAwMDI2IERFRTEgWyAJXSpmc3VicAotICAyMyAwMDI4IERFRTMgWyAJXSpmc3VicAklc3RcKDNcKQotICAyNCAwMDJhIERFRTMgWyAJXSpmc3VicAklc3QsJXN0XCgzXCkKLSAgMjUgMDAyYyBERUU5IFsgCV0qZnN1YnIKLS4qV2FybmluZzouKmZzdWJycC4qCi0gIDI2IDAwMmUgRDhFQiBbIAldKmZzdWJyCSVzdFwoM1wpCi0gIDI3IDAwMzAgRDhFQiBbIAldKmZzdWJyCSVzdFwoM1wpLCVzdAotICAyOCAwMDMyIERDRUIgWyAJXSpmc3Vicgklc3QsJXN0XCgzXCkKLSAgMjkgMDAzNCBEODJCIFsgCV0qZnN1YnJzCVwoJWVieFwpCi0gIDMwIDAwMzYgREMyQiBbIAldKmZzdWJybAlcKCVlYnhcKQotICAzMSAwMDM4IERFMkIgWyAJXSpmaXN1YnJzCVwoJWVieFwpCi0gIDMyIDAwM2EgREEyQiBbIAldKmZpc3VicmwJXCglZWJ4XCkKLSAgMzMgMDAzYyBERUU5IFsgCV0qZnN1YnJwCi0gIDM0IDAwM2UgREVFQiBbIAldKmZzdWJycAklc3RcKDNcKQotICAzNSAwMDQwIERFRUIgWyAJXSpmc3VicnAJJXN0LCVzdFwoM1wpCi0gIDM2IDAwNDIgREVDOSBbIAldKmZtdWwKLS4qV2FybmluZzouKmZtdWxwLioKLSAgMzcgMDA0NCBEOENCIFsgCV0qZm11bAklc3RcKDNcKQotICAzOCAwMDQ2IEQ4Q0IgWyAJXSpmbXVsCSVzdFwoM1wpLCVzdAotICAzOSAwMDQ4IERDQ0IgWyAJXSpmbXVsCSVzdCwlc3RcKDNcKQotICA0MCAwMDRhIEQ4MEIgWyAJXSpmbXVscwlcKCVlYnhcKQotICA0MSAwMDRjIERDMEIgWyAJXSpmbXVsbAlcKCVlYnhcKQotICA0MiAwMDRlIERFMEIgWyAJXSpmaW11bHMJXCglZWJ4XCkKLSAgNDMgMDA1MCBEQTBCIFsgCV0qZmltdWxsCVwoJWVieFwpCi0gIDQ0IDAwNTIgREVDOSBbIAldKmZtdWxwCi0gIDQ1IDAwNTQgREVDQiBbIAldKmZtdWxwCSVzdFwoM1wpCi0gIDQ2IDAwNTYgREVDQiBbIAldKmZtdWxwCSVzdCwlc3RcKDNcKQotICA0NyAwMDU4IERFRjEgWyAJXSpmZGl2Ci0uKldhcm5pbmc6LipmZGl2cC4qCi0gIDQ4IDAwNWEgRDhGMyBbIAldKmZkaXYJJXN0XCgzXCkKLSAgNDkgMDA1YyBEOEYzIFsgCV0qZmRpdgklc3RcKDNcKSwlc3QKLSAgNTAgMDA1ZSBEQ0YzIFsgCV0qZmRpdgklc3QsJXN0XCgzXCkKLSAgNTEgMDA2MCBEODMzIFsgCV0qZmRpdnMJXCglZWJ4XCkKLSAgNTIgMDA2MiBEQzMzIFsgCV0qZmRpdmwJXCglZWJ4XCkKLSAgNTMgMDA2NCBERTMzIFsgCV0qZmlkaXZzCVwoJWVieFwpCi0gIDU0IDAwNjYgREEzMyBbIAldKmZpZGl2bAlcKCVlYnhcKQotICA1NSAwMDY4IERFRjEgWyAJXSpmZGl2cAotICA1NiAwMDZhIERFRjMgWyAJXSpmZGl2cAklc3RcKDNcKQotICA1NyAwMDZjIERFRjMgWyAJXSpmZGl2cAklc3QsJXN0XCgzXCkKLSAgNTggMDA2ZSBERUY5IFsgCV0qZmRpdnIKLS4qV2FybmluZzouKmZkaXZycC4qCi0gIDU5IDAwNzAgRDhGQiBbIAldKmZkaXZyCSVzdFwoM1wpCi0gIDYwIDAwNzIgRDhGQiBbIAldKmZkaXZyCSVzdFwoM1wpLCVzdAotICA2MSAwMDc0IERDRkIgWyAJXSpmZGl2cgklc3QsJXN0XCgzXCkKLSAgNjIgMDA3NiBEODNCIFsgCV0qZmRpdnJzCVwoJWVieFwpCi0gIDYzIDAwNzggREMzQiBbIAldKmZkaXZybAlcKCVlYnhcKQotICA2NCAwMDdhIERFM0IgWyAJXSpmaWRpdnJzCVwoJWVieFwpCi0gIDY1IDAwN2MgREEzQiBbIAldKmZpZGl2cmwJXCglZWJ4XCkKLSAgNjYgMDA3ZSBERUY5IFsgCV0qZmRpdnJwCi0gIDY3IDAwODAgREVGQiBbIAldKmZkaXZycAklc3RcKDNcKQotICA2OCAwMDgyIERFRkIgWyAJXSpmZGl2cnAJJXN0LCVzdFwoM1wpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2Zsb2F0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjA5ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0JZmFkZAotCWZhZGQJJXN0KDMpCi0JZmFkZAklc3QoMyksJXN0Ci0JZmFkZAklc3QsJXN0KDMpCi0JZmFkZHMJKCVlYngpCi0JZmFkZGwJKCVlYngpCi0JZmlhZGRzCSglZWJ4KQotCWZpYWRkbAkoJWVieCkKLQlmYWRkcAotCWZhZGRwCSVzdCgzKQotCWZhZGRwCSVzdCwlc3QoMykKLQlmc3ViCi0JZnN1Ygklc3QoMykKLQlmc3ViCSVzdCgzKSwlc3QKLQlmc3ViCSVzdCwlc3QoMykKLQlmc3VicwkoJWVieCkKLQlmc3VibAkoJWVieCkKLQlmaXN1YnMJKCVlYngpCi0JZmlzdWJsCSglZWJ4KQotCWZzdWJwCi0JZnN1YnAJJXN0KDMpCi0JZnN1YnAJJXN0LCVzdCgzKQotCWZzdWJyCi0JZnN1YnIJJXN0KDMpCi0JZnN1YnIJJXN0KDMpLCVzdAotCWZzdWJyCSVzdCwlc3QoMykKLQlmc3VicnMJKCVlYngpCi0JZnN1YnJsCSglZWJ4KQotCWZpc3VicnMJKCVlYngpCi0JZmlzdWJybAkoJWVieCkKLQlmc3VicnAKLQlmc3VicnAJJXN0KDMpCi0JZnN1YnJwCSVzdCwlc3QoMykKLQlmbXVsCi0JZm11bAklc3QoMykKLQlmbXVsCSVzdCgzKSwlc3QKLQlmbXVsCSVzdCwlc3QoMykKLQlmbXVscwkoJWVieCkKLQlmbXVsbAkoJWVieCkKLQlmaW11bHMJKCVlYngpCi0JZmltdWxsCSglZWJ4KQotCWZtdWxwCi0JZm11bHAJJXN0KDMpCi0JZm11bHAJJXN0LCVzdCgzKQotCWZkaXYKLQlmZGl2CSVzdCgzKQotCWZkaXYJJXN0KDMpLCVzdAotCWZkaXYJJXN0LCVzdCgzKQotCWZkaXZzCSglZWJ4KQotCWZkaXZsCSglZWJ4KQotCWZpZGl2cwkoJWVieCkKLQlmaWRpdmwJKCVlYngpCi0JZmRpdnAKLQlmZGl2cAklc3QoMykKLQlmZGl2cAklc3QsJXN0KDMpCi0JZmRpdnIKLQlmZGl2cgklc3QoMykKLQlmZGl2cgklc3QoMyksJXN0Ci0JZmRpdnIJJXN0LCVzdCgzKQotCWZkaXZycwkoJWVieCkKLQlmZGl2cmwJKCVlYngpCi0JZmlkaXZycwkoJWVieCkKLQlmaWRpdnJsCSglZWJ4KQotCWZkaXZycAotCWZkaXZycAklc3QoMykKLQlmZGl2cnAJJXN0LCVzdCgzKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwMzQ0Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2dlbmVyYWwubAorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MTA6IFdhcm5pbmc6LioKLS4qOjEyOiBXYXJuaW5nOi4qCi0uKjoxOTogV2FybmluZzouKgotLio6MjI6IFdhcm5pbmc6LioKLS4qOjgxOiBXYXJuaW5nOi4qCi0uKjo4MjogV2FybmluZzouKgotLio6ODM6IFdhcm5pbmc6LioKLS4qOjg0OiBXYXJuaW5nOi4qCi0uKjo4NTogV2FybmluZzouKgotLio6ODY6IFdhcm5pbmc6LioKLS4qOjg3OiBXYXJuaW5nOi4qCi0uKjo4ODogV2FybmluZzouKgotLio6ODk6IFdhcm5pbmc6LioKLS4qOjkwOiBXYXJuaW5nOi4qCi0uKjo5MTogV2FybmluZzouKgotLio6OTI6IFdhcm5pbmc6LioKLS4qOjkzOiBXYXJuaW5nOi4qCi0uKjo5NDogV2FybmluZzouKgotLio6OTU6IFdhcm5pbmc6LioKLS4qOjk2OiBXYXJuaW5nOi4qCi0uKjo5NzogV2FybmluZzouKgotLio6OTg6IFdhcm5pbmc6LioKLS4qOjk5OiBXYXJuaW5nOi4qCi0uKjoxMDA6IFdhcm5pbmc6LioKLS4qOjEwMTogV2FybmluZzouKgotLio6MTM1OiBXYXJuaW5nOi4qCi0gICAxICAgICAgICAgICAgICAgICAgICAgICAJLnBzaXplIDAKLSAgIDIgICAgICAgICAgICAgICAgICAgICAgIAkudGV4dAotICAgMyAgICAgICAgICAgICAgICAgICAgICAgCSMgdGVzdCB2YXJpb3VzIHNlZ21lbnQgcmVnIGluc25zCi0gICA0IDAwMDAgMUUgICAgICAgICAgICAgICAgCQlwdXNoCSVkcwotICAgNSAwMDAxIDFFICAgICAgICAgICAgICAgIAkJcHVzaGwJJWRzCi0gICA2IDAwMDIgMUYgICAgICAgICAgICAgICAgCQlwb3AJJWRzCi0gICA3IDAwMDMgMUYgICAgICAgICAgICAgICAgCQlwb3BsCSVkcwotICAgOCAwMDA0IDhDRDggICAgICAgICAgICAgIAkJbW92CSVkcywlZWF4Ci0gICA5IDAwMDYgOENEOCAgICAgICAgICAgICAgCQltb3ZsCSVkcywlZWF4Ci0gIDEwIDAwMDggOENEOCAgICAgICAgICAgICAgCQltb3ZsCSVkcywlYXgKLS4qV2FybmluZzouKgotICAxMSAwMDBhIDhFRDggICAgICAgICAgICAgIAkJbW92CSVlYXgsJWRzCi0gIDEyIDAwMGMgOEVEOCAgICAgICAgICAgICAgCQltb3ZsCSVheCwlZHMKLS4qV2FybmluZzouKgotICAxMyAwMDBlIDhFRDggICAgICAgICAgICAgIAkJbW92bAklZWF4LCVkcwotICAxNCAgICAgICAgICAgICAgICAgICAgICAgCQotICAxNSAwMDEwIDY2MUUgICAgICAgICAgICAgIAkJcHVzaHcJJWRzCi0gIDE2IDAwMTIgNjYxRiAgICAgICAgICAgICAgCQlwb3B3CSVkcwotICAxNyAwMDE0IDY2OENEOCAgICAgICAgICAgIAkJbW92CSVkcywlYXgKLSAgMTggMDAxNyA2NjhDRDggICAgICAgICAgICAJCW1vdncJJWRzLCVheAotICAxOSAwMDFhIDY2OENEOCAgICAgICAgICAgIAkJbW92dwklZHMsJWVheAotLipXYXJuaW5nOi4qCi0gIDIwIDAwMWQgOEVEOCAgICAgICAgICAgICAgCQltb3YJJWF4LCVkcwotICAyMSAwMDFmIDhFRDggICAgICAgICAgICAgIAkJbW92dwklYXgsJWRzCi0gIDIyIDAwMjEgOEVEOCAgICAgICAgICAgICAgCQltb3Z3CSVlYXgsJWRzCi0uKldhcm5pbmc6LioKLSAgMjMgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgMjQgICAgICAgICAgICAgICAgICAgICAgIAkjIHRlc3QgdmFyaW91cyBwdXNoZXMKLSAgMjUgMDAyMyA2QTBBICAgICAgICAgICAgICAJCXB1c2hsCVwkMTAKLSAgMjYgMDAyNSA2NjZBMEEgICAgICAgICAgICAJCXB1c2h3CVwkMTAKLSAgMjcgMDAyOCA2QTBBICAgICAgICAgICAgICAJCXB1c2gJXCQxMAotICAyOCAwMDJhIDY4RTgwMzAwIDAwICAgICAgIAkJcHVzaGwJXCQxMDAwCi0gIDI5IDAwMmYgNjY2OEU4MDMgICAgICAgICAgCQlwdXNodwlcJDEwMDAKLSAgMzAgMDAzMyA2OEU4MDMwMCAwMCAgICAgICAJCXB1c2gJXCQxMDAwCi0gIDMxIDAwMzggRkYzNTU3MDAgMDAwMCAgICAgCQlwdXNobAkxZgotICAzMiAwMDNlIDY2RkYzNTU3IDAwMDAwMCAgIAkJcHVzaHcJMWYKLSAgMzMgMDA0NSBGRjM1NTcwMCAwMDAwICAgICAJCXB1c2gJMWYKLSAgMzQgMDA0YiBGRkIzMEMwMCAwMDAwICAgICAJCXB1c2gJXCgxZi0uXClcKCVlYnhcKQotICAzNSAwMDUxIEZGMzUwNjAwIDAwMDAgICAgIAkJcHVzaAkxZi0uCi0gIDM2ICAgICAgICAgICAgICAgICAgICAgICAJIyB0aGVzZSwgYW5kIG90aGVycyBsaWtlIHRoZW0gc2hvdWxkIGhhdmUgbm8gb3BlcmFuZCBzaXplIHByZWZpeAotICAzNyAwMDU3IDBGMDBEMSAgICAgICAgICAgIAkxOglsbGR0CSVjeAotICAzOCAwMDVhIDBGMDFGMCAgICAgICAgICAgIAkJbG1zdwklYXgKLSAgMzkgICAgICAgICAgICAgICAgICAgICAgIAkKLSAgNDAgICAgICAgICAgICAgICAgICAgICAgIAkjIEp1c3QgdG8gbWFrZSBzdXJlIHRoZXNlIGRvbid0IGJlY29tZSBpbGxlZ2FsIGR1ZSB0byBvdmVyLWVudGh1c2lhc3RpYwotICA0MSAgICAgICAgICAgICAgICAgICAgICAgCSMgcmVnaXN0ZXIgY2hlY2tpbmcKLSAgNDIgMDA1ZCA2NjBGQkVGOCAgICAgICAgICAJCW1vdnNidwklYWwsJWRpCi0gIDQzIDAwNjEgMEZCRUM4ICAgICAgICAgICAgCQltb3ZzYmwJJWFsLCVlY3gKLSAgNDQgMDA2NCAwRkJGQzggICAgICAgICAgICAJCW1vdnN3bAklYXgsJWVjeAotICA0NSAwMDY3IDY2MEZCNkY4ICAgICAgICAgIAkJbW92emJ3CSVhbCwlZGkKLSAgNDYgMDA2YiAwRkI2QzggICAgICAgICAgICAJCW1vdnpibAklYWwsJWVjeAotICA0NyAwMDZlIDBGQjdDOCAgICAgICAgICAgIAkJbW92endsCSVheCwlZWN4Ci0gIDQ4ICAgICAgICAgICAgICAgICAgICAgICAJCi0gIDQ5IDAwNzEgRUMgICAgICAgICAgICAgICAgCQlpbgklZHgsJWFsCi0gIDUwIDAwNzIgNjZFRCAgICAgICAgICAgICAgCQlpbgklZHgsJWF4Ci0gIDUxIDAwNzQgRUQgICAgICAgICAgICAgICAgCQlpbgklZHgsJWVheAotICA1MiAwMDc1IEVDICAgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYWwKLSAgNTMgMDA3NiA2NkVEICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWF4Ci0gIDU0IDAwNzggRUQgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVlYXgKLSAgNTUgMDA3OSBFQyAgICAgICAgICAgICAgICAJCWluYgklZHgsJWFsCi0gIDU2IDAwN2EgNjZFRCAgICAgICAgICAgICAgCQlpbncJJWR4LCVheAotICA1NyAwMDdjIEVEICAgICAgICAgICAgICAgIAkJaW5sCSVkeCwlZWF4Ci0gIDU4IDAwN2QgRUMgICAgICAgICAgICAgICAgCQlpbmIJJWR4Ci0gIDU5IDAwN2UgNjZFRCAgICAgICAgICAgICAgCQlpbncJJWR4Ci0gIDYwIDAwODAgRUQgICAgICAgICAgICAgICAgCQlpbmwJJWR4Ci0gIDYxIDAwODEgRTRGRiAgICAgICAgICAgICAgCQlpbmIJXCQyNTUKLSAgNjIgMDA4MyA2NkU1MDIgICAgICAgICAgICAJCWludwlcJDIKLSAgNjMgMDA4NiBFNTA0ICAgICAgICAgICAgICAJCWlubAlcJDQKLSAgNjQgMDA4OCBFRiAgICAgICAgICAgICAgICAJCW91dGwJJWVheCwlZHgKLSAgNjUgMDA4OSBFNjJBICAgICAgICAgICAgICAJCW91dAklYWwsIFwkNDIKLSAgNjYgMDA4YiA2NkU1MEQgICAgICAgICAgICAJCWluCVwkMTMsICVheAotICA2NyAgICAgICAgICAgICAgICAgICAgICAgCSMgVGhlc2UgYXJlIHVzZWQgaW4gQUlYLgotICA2OCAwMDhlIDY2RUQgICAgICAgICAgICAgIAkJaW53CVwoJWR4XCkKLSAgNjkgMDA5MCA2NkVGICAgICAgICAgICAgICAJCW91dHcJXCglZHhcKQotICA3MCAgICAgICAgICAgICAgICAgICAgICAgCQotICA3MSAwMDkyIEE0ICAgICAgICAgICAgICAgIAkJbW92c2IKLSAgNzIgMDA5MyA2NkE3ICAgICAgICAgICAgICAJCWNtcHN3Ci0gIDczIDAwOTUgQUYgICAgICAgICAgICAgICAgCQlzY2FzbAotICA3NCAwMDk2IEQ3ICAgICAgICAgICAgICAgIAkJeGxhdGIKLSAgNzUgMDA5NyAyRUE1ICAgICAgICAgICAgICAJCW1vdnNsCSVjczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSAgNzYgMDA5OSAwRjkzMDMgICAgICAgICAgICAJCXNldGFlCVwoJWVieFwpCi0gIDc3IDAwOWMgMEY5MzAzICAgICAgICAgICAgCQlzZXRhZWIJXCglZWJ4XCkKLSAgNzggMDA5ZiAwRjkzQzAgICAgICAgICAgICAJCXNldGFlCSVhbAotICA3OSAgICAgICAgICAgICAgICAgICAgICAgCQotICA4MCAgICAgICAgICAgICAgICAgICAgICAgCSN0aGVzZSBzaG91bGQgZ2l2ZSB3YXJuaW5ncwotICA4MSAwMGEyIDBDMDEgICAgICAgICAgICAgIAkJb3JiCVwkMSwlYXgKLS4qV2FybmluZzouKgotICA4MiAwMGE0IDBDMDEgICAgICAgICAgICAgIAkJb3JiCVwkMSwlZWF4Ci0uKldhcm5pbmc6LioKLSAgODMgMDBhNiA4MENCMDEgICAgICAgICAgICAJCW9yYglcJDEsJWJ4Ci0uKldhcm5pbmc6LioKLSAgODQgMDBhOSA4MENCMDEgICAgICAgICAgICAJCW9yYglcJDEsJWVieAotLipXYXJuaW5nOi4qCi0gIDg1IDAwYWMgRDlDMSAgICAgICAgICAgICAgCQlmbGRsCSVzdFwoMVwpCi0uKldhcm5pbmc6LioKLSAgODYgMDBhZSBEREQyICAgICAgICAgICAgICAJCWZzdGwJJXN0XCgyXCkKLS4qV2FybmluZzouKgotICA4NyAwMGIwIEREREIgICAgICAgICAgICAgIAkJZnN0cGwJJXN0XCgzXCkKLS4qV2FybmluZzouKgotICA4OCAwMGIyIEQ4RDQgICAgICAgICAgICAgIAkJZmNvbWwJJXN0XCg0XCkKLS4qV2FybmluZzouKgotICA4OSAwMGI0IEQ4REQgICAgICAgICAgICAgIAkJZmNvbXBsCSVzdFwoNVwpCi0uKldhcm5pbmc6LioKLSAgOTAgMDBiNiBERUMxICAgICAgICAgICAgICAJCWZhZGRwCSVzdFwoMVwpLCVzdAotLipXYXJuaW5nOi4qCi0gIDkxIDAwYjggREVDQSAgICAgICAgICAgICAgCQlmbXVscAklc3RcKDJcKSwlc3QKLS4qV2FybmluZzouKgotICA5MiAwMGJhIERFRTMgICAgICAgICAgICAgIAkJZnN1YnAJJXN0XCgzXCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTMgMDBiYyBERUVDICAgICAgICAgICAgICAJCWZzdWJycAklc3RcKDRcKSwlc3QKLS4qV2FybmluZzouKgotICA5NCAwMGJlIERFRjUgICAgICAgICAgICAgIAkJZmRpdnAJJXN0XCg1XCksJXN0Ci0uKldhcm5pbmc6LioKLSAgOTUgMDBjMCBERUZFICAgICAgICAgICAgICAJCWZkaXZycAklc3RcKDZcKSwlc3QKLS4qV2FybmluZzouKgotICA5NiAwMGMyIERFQzEgICAgICAgICAgICAgIAkJZmFkZAotLipXYXJuaW5nOi4qCi0gIDk3IDAwYzQgREVFMSAgICAgICAgICAgICAgCQlmc3ViCi0uKldhcm5pbmc6LioKLSAgOTggMDBjNiBERUM5ICAgICAgICAgICAgICAJCWZtdWwKLS4qV2FybmluZzouKgotICA5OSAwMGM4IERFRjEgICAgICAgICAgICAgIAkJZmRpdgotLipXYXJuaW5nOi4qCi0gMTAwIDAwY2EgREVFOSAgICAgICAgICAgICAgCQlmc3VicgotLipXYXJuaW5nOi4qCi0gMTAxIDAwY2MgREVGOSAgICAgICAgICAgICAgCQlmZGl2cgotLipXYXJuaW5nOi4qCi0gMTAyICAgICAgICAgICAgICAgICAgICAgICAJI3RoZXNlIHNob3VsZCBhbGwgYmUgbGVnYWwKLSAxMDMgMDBjZSAwRkEzMTU1NiAzNDEyMDAgICAJCWJ0bAklZWR4LCAweDEyMzQ1NgotIDEwNCAwMGQ1IDBGQTNEMCAgICAgICAgICAgIAkJYnRsCSVlZHgsICVlYXgKLSAxMDUgMDBkOCAwQzAxICAgICAgICAgICAgICAJCW9yYglcJDEsJWFsCi0gMTA2IDAwZGEgODBDQjAxICAgICAgICAgICAgCQlvcmIJXCQxLCVibAotIDEwNyAwMGRkIEExMTEwMDAwIDAwICAgICAgIAkJbW92bAkxNywlZWF4Ci0gMTA4IDAwZTIgQTExMTAwMDAgMDAgICAgICAgCQltb3YJMTcsJWVheAotIDEwOSAwMGU3IDY2RUQgICAgICAgICAgICAgIAkJaW53CSVkeCwlYXgKLSAxMTAgMDBlOSBFRCAgICAgICAgICAgICAgICAJCWlubAklZHgsJWVheAotIDExMSAwMGVhIDY2RUQgICAgICAgICAgICAgIAkJaW53CVwoJWR4XCksJWF4Ci0gMTEyIDAwZWMgRUQgICAgICAgICAgICAgICAgCQlpbmwJXCglZHhcKSwlZWF4Ci0gMTEzIDAwZWQgRUMgICAgICAgICAgICAgICAgCQlpbglcKCVkeFwpLCVhbAotIDExNCAwMGVlIDY2RUQgICAgICAgICAgICAgIAkJaW4JXCglZHhcKSwlYXgKLSAxMTUgMDBmMCBFRCAgICAgICAgICAgICAgICAJCWluCVwoJWR4XCksJWVheAotIDExNiAwMGYxIDBGQjYxNDM3ICAgICAgICAgIAkJbW92emJsCVwoJWVkaSwlZXNpXCksJWVkeAotIDExNyAwMGY1IDBGQjY0NTFDICAgICAgICAgIAkJbW92emJsCTI4XCglZWJwXCksJWVheAotIDExOCAwMGY5IDBGQjZDMCAgICAgICAgICAgIAkJbW92emJsCSVhbCwlZWF4Ci0gMTE5IDAwZmMgMEZCNkYxICAgICAgICAgICAgCQltb3Z6YmwJJWNsLCVlc2kKLSAxMjAgMDBmZiAyNkQ3ICAgICAgICAgICAgICAJCXhsYXQJJWVzOlwoJWVieFwpCi0gMTIxIDAxMDEgRDcgICAgICAgICAgICAgICAgCQl4bGF0Ci0gMTIyIDAxMDIgRDcgICAgICAgICAgICAgICAgCQl4bGF0YgotIDEyMyAwMTAzIERERDggICAgICAgICAgICAgIAkxOglmc3RwCSVzdFwoMFwpCi0gMTI0IDAxMDUgRTJGQyAgICAgICAgICAgICAgCQlsb29wCTFiCi0gMTI1IDAxMDcgRjZGMSAgICAgICAgICAgICAgCQlkaXZiICAgICVjbCAKLSAxMjYgMDEwOSA2NkY3RjEgICAgICAgICAgICAJCWRpdncgICAgJWN4IAotIDEyNyAwMTBjIEY3RjEgICAgICAgICAgICAgIAkJZGl2bCAgICAlZWN4Ci0gMTI4IDAxMGUgRjZGMSAgICAgICAgICAgICAgCQlkaXYJJWNsCi0gMTI5IDAxMTAgNjZGN0YxICAgICAgICAgICAgCQlkaXYJJWN4Ci0gMTMwIDAxMTMgRjdGMSAgICAgICAgICAgICAgCQlkaXYJJWVjeAotIDEzMSAwMTE1IEY2RjEgICAgICAgICAgICAgIAkJZGl2CSVjbCwlYWwKLSAxMzIgMDExNyA2NkY3RjEgICAgICAgICAgICAJCWRpdgklY3gsJWF4Ci0gMTMzIDAxMWEgRjdGMSAgICAgICAgICAgICAgCQlkaXYJJWVjeCwlZWF4Ci0gMTM0IDAxMWMgOEVERSAgICAgICAgICAgICAgCQltb3YJJXNpLCVkcwotIDEzNSAwMTFlIDhFREUgICAgICAgICAgICAgIAkJbW92bAklc2ksJWRzCQkjIHdhcm5pbmcgaGVyZQotLipXYXJuaW5nOi4qCi0gMTM2IDAxMjAgMUUgICAgICAgICAgICAgICAgCQlwdXNobAklZHMKLSAxMzcgMDEyMSAxRSAgICAgICAgICAgICAgICAJCXB1c2gJJWRzCi0gMTM4IDAxMjIgQTAwMDAwMDAgMDAgICAgICAgCQltb3YJMCwlYWwKLSAxMzkgMDEyNyA2NkExMDAwMCAwMTAwICAgICAJCW1vdgkweDEwMDAwLCVheAotIDE0MCAwMTJkIDg5QzMgICAgICAgICAgICAgIAkJbW92CSVlYXgsJWVieAotIDE0MSAwMTJmIDlDICAgICAgICAgICAgICAgIAkJcHVzaGYKLSAxNDIgMDEzMCA5QyAgICAgICAgICAgICAgICAJCXB1c2hmbAotIDE0MyAwMTMxIDY2OUMgICAgICAgICAgICAgIAkJcHVzaGZ3Ci0gMTQ0IDAxMzMgOUQgICAgICAgICAgICAgICAgCQlwb3BmCi0gMTQ1IDAxMzQgOUQgICAgICAgICAgICAgICAgCQlwb3BmbAotIDE0NiAwMTM1IDY2OUQgICAgICAgICAgICAgIAkJcG9wZncKLSAxNDcgMDEzNyA4OTM0MUQwMCAwMDAwMDAgICAJCW1vdgklZXNpLFwoLCVlYngsMVwpCi0gMTQ4IDAxM2UgODAyNTAwMDAgMDAwMDdGICAgCQlhbmRiCVwkfjB4ODAsZm9vCi0gMTQ5ICAgICAgICAgICAgICAgICAgICAgICAJCi0gMTUwICAgICAgICAgICAgICAgICAgICAgICAJCSMgRm9yY2UgYSBnb29kIGFsaWdubWVudC4KLSAxNTEgMDE0NSAwMDAwICAgICAgICAgICAgICAJCS53b3JkCTAKLSAxNTIgMDE0NyAwMCAgICAgICAgICAgICAgICAJCS5ieXRlCTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvZ2VuZXJhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3M2Y0ODkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9nZW5lcmFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLnBzaXplIDAKLS50ZXh0Ci0jIHRlc3QgdmFyaW91cyBzZWdtZW50IHJlZyBpbnNucwotCXB1c2gJJWRzCi0JcHVzaGwJJWRzCi0JcG9wCSVkcwotCXBvcGwJJWRzCi0JbW92CSVkcywlZWF4Ci0JbW92bAklZHMsJWVheAotCW1vdmwJJWRzLCVheAotCW1vdgklZWF4LCVkcwotCW1vdmwJJWF4LCVkcwotCW1vdmwJJWVheCwlZHMKLQotCXB1c2h3CSVkcwotCXBvcHcJJWRzCi0JbW92CSVkcywlYXgKLQltb3Z3CSVkcywlYXgKLQltb3Z3CSVkcywlZWF4Ci0JbW92CSVheCwlZHMKLQltb3Z3CSVheCwlZHMKLQltb3Z3CSVlYXgsJWRzCi0KLSMgdGVzdCB2YXJpb3VzIHB1c2hlcwotCXB1c2hsCSQxMAotCXB1c2h3CSQxMAotCXB1c2gJJDEwCi0JcHVzaGwJJDEwMDAKLQlwdXNodwkkMTAwMAotCXB1c2gJJDEwMDAKLQlwdXNobAkxZgotCXB1c2h3CTFmCi0JcHVzaAkxZgotCXB1c2gJKDFmLS4pKCVlYngpCi0JcHVzaAkxZi0uCi0jIHRoZXNlLCBhbmQgb3RoZXJzIGxpa2UgdGhlbSBzaG91bGQgaGF2ZSBubyBvcGVyYW5kIHNpemUgcHJlZml4Ci0xOglsbGR0CSVjeAotCWxtc3cJJWF4Ci0KLSMgSnVzdCB0byBtYWtlIHN1cmUgdGhlc2UgZG9uJ3QgYmVjb21lIGlsbGVnYWwgZHVlIHRvIG92ZXItZW50aHVzaWFzdGljCi0jIHJlZ2lzdGVyIGNoZWNraW5nCi0JbW92c2J3CSVhbCwlZGkKLQltb3ZzYmwJJWFsLCVlY3gKLQltb3Zzd2wJJWF4LCVlY3gKLQltb3Z6YncJJWFsLCVkaQotCW1vdnpibAklYWwsJWVjeAotCW1vdnp3bAklYXgsJWVjeAotCi0JaW4JJWR4LCVhbAotCWluCSVkeCwlYXgKLQlpbgklZHgsJWVheAotCWluCSglZHgpLCVhbAotCWluCSglZHgpLCVheAotCWluCSglZHgpLCVlYXgKLQlpbmIJJWR4LCVhbAotCWludwklZHgsJWF4Ci0JaW5sCSVkeCwlZWF4Ci0JaW5iCSVkeAotCWludwklZHgKLQlpbmwJJWR4Ci0JaW5iCSQyNTUKLQlpbncJJDIKLQlpbmwJJDQKLQlvdXRsCSVlYXgsJWR4Ci0Jb3V0CSVhbCwgJDQyCi0JaW4JJDEzLCAlYXgKLSMgVGhlc2UgYXJlIHVzZWQgaW4gQUlYLgotCWludwkoJWR4KQotCW91dHcJKCVkeCkKLQotCW1vdnNiCi0JY21wc3cKLQlzY2FzbAotCXhsYXRiCi0JbW92c2wJJWNzOiglZXNpKSwlZXM6KCVlZGkpCi0Jc2V0YWUJKCVlYngpCi0Jc2V0YWViCSglZWJ4KQotCXNldGFlCSVhbAotCi0jdGhlc2Ugc2hvdWxkIGdpdmUgd2FybmluZ3MKLQlvcmIJJDEsJWF4Ci0Jb3JiCSQxLCVlYXgKLQlvcmIJJDEsJWJ4Ci0Jb3JiCSQxLCVlYngKLQlmbGRsCSVzdCgxKQotCWZzdGwJJXN0KDIpCi0JZnN0cGwJJXN0KDMpCi0JZmNvbWwJJXN0KDQpCi0JZmNvbXBsCSVzdCg1KQotCWZhZGRwCSVzdCgxKSwlc3QKLQlmbXVscAklc3QoMiksJXN0Ci0JZnN1YnAJJXN0KDMpLCVzdAotCWZzdWJycAklc3QoNCksJXN0Ci0JZmRpdnAJJXN0KDUpLCVzdAotCWZkaXZycAklc3QoNiksJXN0Ci0JZmFkZAotCWZzdWIKLQlmbXVsCi0JZmRpdgotCWZzdWJyCi0JZmRpdnIKLSN0aGVzZSBzaG91bGQgYWxsIGJlIGxlZ2FsCi0JYnRsCSVlZHgsIDB4MTIzNDU2Ci0JYnRsCSVlZHgsICVlYXgKLQlvcmIJJDEsJWFsCi0Jb3JiCSQxLCVibAotCW1vdmwJMTcsJWVheAotCW1vdgkxNywlZWF4Ci0JaW53CSVkeCwlYXgKLQlpbmwJJWR4LCVlYXgKLQlpbncJKCVkeCksJWF4Ci0JaW5sCSglZHgpLCVlYXgKLQlpbgkoJWR4KSwlYWwKLQlpbgkoJWR4KSwlYXgKLQlpbgkoJWR4KSwlZWF4Ci0JbW92emJsCSglZWRpLCVlc2kpLCVlZHgKLQltb3Z6YmwJMjgoJWVicCksJWVheAotCW1vdnpibAklYWwsJWVheAotCW1vdnpibAklY2wsJWVzaQotCXhsYXQJJWVzOiglZWJ4KQotCXhsYXQKLQl4bGF0YgotMToJZnN0cAklc3QoMCkKLQlsb29wCTFiCi0JZGl2YiAgICAlY2wgCi0JZGl2dyAgICAlY3ggCi0JZGl2bCAgICAlZWN4Ci0JZGl2CSVjbAotCWRpdgklY3gKLQlkaXYJJWVjeAotCWRpdgklY2wsJWFsCi0JZGl2CSVjeCwlYXgKLQlkaXYJJWVjeCwlZWF4Ci0JbW92CSVzaSwlZHMKLQltb3ZsCSVzaSwlZHMJCSMgd2FybmluZyBoZXJlCi0JcHVzaGwJJWRzCi0JcHVzaAklZHMKLQltb3YJMCwlYWwKLQltb3YJMHgxMDAwMCwlYXgKLQltb3YJJWVheCwlZWJ4Ci0JcHVzaGYKLQlwdXNoZmwKLQlwdXNoZncKLQlwb3BmCi0JcG9wZmwKLQlwb3BmdwotCW1vdgklZXNpLCgsJWVieCwxKQotCWFuZGIJJH4weDgwLGZvbwotCi0JIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotCS53b3JkCTAKLQkuYnl0ZQkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9pMzg2LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNDlmNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2kzODYuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIwotIyBpMzg2IHRlc3RzCi0jCi1wcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpciBzdWJkaXIKLSAgICBzZXQgdGVzdG5hbWUgImkzODYgJG5hbWUiCi0gICAgc2V0IGZpbGUgJHNyY2Rpci8kc3ViZGlyLyRuYW1lCi0gICAgZ2FzX3J1biAke25hbWV9LnMgJG9wdHMgIj4mZHVtcC5vdXQiCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5sIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLSAgICBwYXNzICR0ZXN0bmFtZQotfQotCi0KLWlmIFtpc3RhcmdldCAiaSo4Ni0qLSoiXSB0aGVuIHsKLQotICAgIHJ1bl9saXN0X3Rlc3QgImZsb2F0IiAiLWFsIgotICAgIHJ1bl9saXN0X3Rlc3QgImdlbmVyYWwiICItYWwgLS1saXN0aW5nLWxocy13aWR0aD0yIgotICAgIHJ1bl9saXN0X3Rlc3QgImludmFsIiAiLWFsIgotICAgIHJ1bl9saXN0X3Rlc3QgIm1vZHJtIiAiLWFsIC0tbGlzdGluZy1saHMtd2lkdGg9MiIKLSAgICBydW5fZHVtcF90ZXN0ICJvcGNvZGUiCi0gICAgcnVuX2R1bXBfdGVzdCAicHJlZml4IgotICAgIHJ1bl9kdW1wX3Rlc3QgImFtZCIKLSAgICBydW5fZHVtcF90ZXN0ICJrYXRtYWkiCi0KLSAgICAjIFRoZSByZWxvYyBhbmQgd2hpdGUgdGVzdHMgcmVxdWlyZSBzdXBwb3J0IGZvciA4IGFuZCAxNiBiaXQKLSAgICAjIHJlbG9jcywgc28gd2Ugb25seSBydW4gdGhlbSBmb3IgRUxGIHRhcmdldHMuCi0gICAgaWYge1tpc3RhcmdldCAiKi0qLWVsZioiXSB8fCBbaXN0YXJnZXQgIiotKi1saW51eCoiXX0gdGhlbiB7Ci0JcnVuX2R1bXBfdGVzdCAicmVsb2MiCi0JcnVuX2xpc3RfdGVzdCAid2hpdGUiICItYWwgLS1saXN0aW5nLWxocy13aWR0aD0zIgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwubCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4OTQ5OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLmwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0uKjogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLio6MzogRXJyb3I6IC4qCi0uKjo0OiBFcnJvcjogLioKLS4qOjU6IEVycm9yOiAuKgotLio6NjogRXJyb3I6IC4qCi0uKjo3OiBFcnJvcjogLioKLS4qOjg6IEVycm9yOiAuKgotLio6OTogRXJyb3I6IC4qCi0uKjoxMDogRXJyb3I6IC4qCi0uKjoxMTogRXJyb3I6IC4qCi0uKjoxMjogRXJyb3I6IC4qCi0uKjoxMzogRXJyb3I6IC4qCi0uKjoxNDogRXJyb3I6IC4qCi0uKjoxNTogRXJyb3I6IC4qCi0uKjoxNjogRXJyb3I6IC4qCi0uKjoxNzogRXJyb3I6IC4qCi0uKjoxODogRXJyb3I6IC4qCi0uKjoxOTogRXJyb3I6IC4qCi0uKjoyMDogRXJyb3I6IC4qCi0uKjoyMTogRXJyb3I6IC4qCi0uKjoyMjogRXJyb3I6IC4qCi0uKjoyMzogRXJyb3I6IC4qCi0uKjoyNDogRXJyb3I6IC4qCi0uKjoyNTogRXJyb3I6IC4qCi0uKjoyNjogRXJyb3I6IC4qCi0uKjoyNzogRXJyb3I6IC4qCi0uKjoyODogRXJyb3I6IC4qCi0uKjoyOTogRXJyb3I6IC4qCi0uKjozMDogRXJyb3I6IC4qCi0uKjozMTogRXJyb3I6IC4qCi0uKjozMjogRXJyb3I6IC4qCi0uKjozMzogRXJyb3I6IC4qCi0uKjozNDogRXJyb3I6IC4qCi0uKjozNTogRXJyb3I6IC4qCi0uKjozNjogRXJyb3I6IC4qCi0uKjozNzogRXJyb3I6IC4qCi0uKjozODogRXJyb3I6IC4qCi0uKjozOTogRXJyb3I6IC4qCi0uKjo0MDogRXJyb3I6IC4qCi0uKjo0MTogRXJyb3I6IC4qCi0uKjo0MjogRXJyb3I6IC4qCi0uKjo0MzogRXJyb3I6IC4qCi0uKjo0NDogRXJyb3I6IC4qCi0uKjo0NTogRXJyb3I6IC4qCi0uKjo0NjogRXJyb3I6IC4qCi0uKjo0NzogRXJyb3I6IC4qCi0uKjo0ODogRXJyb3I6IC4qCi1HQVMgTElTVElORyAuKgotCi0KLSAgIDEgWyAJXSoJLnRleHQKLSAgIDIgWyAJXSojIEFsbCB0aGUgZm9sbG93aW5nIHNob3VsZCBiZSBpbGxlZ2FsCi0gICAzIFsgCV0qCW1vdglcKCVkeFwpLCVhbAotICAgNCBbIAldKgltb3YJXCglZWF4LCVlc3AsMlwpLCVhbAotICAgNSBbIAldKglzZXRhZQklZWF4Ci0gICA2IFsgCV0qCXB1c2hiCSVkcwotICAgNyBbIAldKglwb3BiCSVkcwotICAgOCBbIAldKglwdXNoYgklYWwKLSAgIDkgWyAJXSoJcG9wYgklYWwKLSAgMTAgWyAJXSoJcHVzaGIJJWFoCi0gIDExIFsgCV0qCXBvcGIJJWFoCi0gIDEyIFsgCV0qCXB1c2hiCSVheAotICAxMyBbIAldKglwb3BiCSVheAotICAxNCBbIAldKglwdXNoYgklZWF4Ci0gIDE1IFsgCV0qCXBvcGIJJWVheAotICAxNiBbIAldKgltb3ZiCSVkcywlYXgKLSAgMTcgWyAJXSoJbW92YgklZHMsJWVheAotICAxOCBbIAldKgltb3ZiCSVheCwlZHMKLSAgMTkgWyAJXSoJbW92YgklZWF4LCVkcwotICAyMCBbIAldKgltb3ZkYgklZWF4LCVtbTAKLSAgMjEgWyAJXSoJbW92cWIJMCwlbW0wCi0gIDIyIFsgCV0qCWxkc2IJMCwlZWF4Ci0gIDIzIFsgCV0qCXNldG5ldwkwCi0gIDI0IFsgCV0qCW1vdmR3CSVlYXgsJW1tMAotICAyNSBbIAldKgltb3ZxdwkwLCVtbTAKLSAgMjYgWyAJXSoJZGl2CSVjeCwlYWwKLSAgMjcgWyAJXSoJZGl2CSVjbCwlYXgKLSAgMjggWyAJXSoJZGl2CSVlY3gsJWFsCi0gIDI5IFsgCV0qCWltdWwJMTAsJWJ4LCVlY3gKLSAgMzAgWyAJXSoJaW11bAkxMCwlYngsJWFsCi0gIDMxIFsgCV0qCXBvcGFiCi0gIDMyIFsgCV0qCXN0aWwKLSAgMzMgWyAJXSoJYWFhYgotICAzNCBbIAldKgljd2RlbAotICAzNSBbIAldKgljd2R3Ci0gIDM2IFsgCV0qCWNhbGx3dwkwCi0gIDM3IFsgCV0qZm9vOglqYXcJZm9vCi0gIDM4IFsgCV0qCWpjeHp3CWZvbwotICAzOSBbIAldKglqZWN4emwJZm9vCi0gIDQwIFsgCV0qCWxvb3BiCWZvbwotICA0MSBbIAldKgl4bGF0dwklZXM6JWJ4Ci0gIDQyIFsgCV0qCXhsYXRsCSVlczolYngKLSAgNDMgWyAJXSoJaW50bAkyCi0gIDQ0IFsgCV0qCWludDNiCi0gIDQ1IFsgCV0qCWhsdGIKLSAgNDYgWyAJXSoJZnN0Ygklc3RcKDBcKQotICA0NyBbIAldKglmY29tcGxsCTI4XCglZWJwXCkKLSAgNDggWyAJXSoJZmxkbHcJXCglZWF4XCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvaW52YWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3YTE4ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2ludmFsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0JLnRleHQKLSMgQWxsIHRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIGlsbGVnYWwKLQltb3YJKCVkeCksJWFsCi0JbW92CSglZWF4LCVlc3AsMiksJWFsCi0Jc2V0YWUJJWVheAotCXB1c2hiCSVkcwotCXBvcGIJJWRzCi0JcHVzaGIJJWFsCi0JcG9wYgklYWwKLQlwdXNoYgklYWgKLQlwb3BiCSVhaAotCXB1c2hiCSVheAotCXBvcGIJJWF4Ci0JcHVzaGIJJWVheAotCXBvcGIJJWVheAotCW1vdmIJJWRzLCVheAotCW1vdmIJJWRzLCVlYXgKLQltb3ZiCSVheCwlZHMKLQltb3ZiCSVlYXgsJWRzCi0JbW92ZGIJJWVheCwlbW0wCi0JbW92cWIJMCwlbW0wCi0JbGRzYgkwLCVlYXgKLQlzZXRuZXcJMAotCW1vdmR3CSVlYXgsJW1tMAotCW1vdnF3CTAsJW1tMAotCWRpdgklY3gsJWFsCi0JZGl2CSVjbCwlYXgKLQlkaXYJJWVjeCwlYWwKLQlpbXVsCTEwLCVieCwlZWN4Ci0JaW11bAkxMCwlYngsJWFsCi0JcG9wYWIKLQlzdGlsCi0JYWFhYgotCWN3ZGVsCi0JY3dkdwotCWNhbGx3dwkwCi1mb286CWphdwlmb28KLQlqY3h6dwlmb28KLQlqZWN4emwJZm9vCi0JbG9vcGIJZm9vCi0JeGxhdHcJJWVzOiVieAotCXhsYXRsCSVlczolYngKLQlpbnRsCTIKLQlpbnQzYgotCWhsdGIKLQlmc3RiCSVzdCgwKQotCWZjb21wbGwJMjgoJWVicCkKLQlmbGRsdwkoJWVheCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjE1NDk4Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L2thdG1haS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHcKLSNuYW1lOiBpMzg2IGthdG1haQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwIDxmb28+OgotICAgMDoJMGYgNTggMDEgWyAJXSphZGRwcyAgXCglZWN4XCksJXhtbTAKLSAgIDM6CTBmIDU4IGNhIFsgCV0qYWRkcHMgICV4bW0yLCV4bW0xCi0gICA2OglmMyAwZiA1OCAxMyBbIAldKmFkZHNzICBcKCVlYnhcKSwleG1tMgotICAgYToJZjMgMGYgNTggZGMgWyAJXSphZGRzcyAgJXhtbTQsJXhtbTMKLSAgIGU6CTBmIDU1IDY1IDAwIFsgCV0qYW5kbnBzIDB4MFwoJWVicFwpLCV4bW00Ci0gIDEyOgkwZiA1NSBlZSBbIAldKmFuZG5wcyAleG1tNiwleG1tNQotICAxNToJMGYgNTQgMzcgWyAJXSphbmRwcyAgXCglZWRpXCksJXhtbTYKLSAgMTg6CTBmIDU0IGY4IFsgCV0qYW5kcHMgICV4bW0wLCV4bW03Ci0gIDFiOgkwZiBjMiBjMSAwMiBbIAldKmNtcGxlcHMgJXhtbTEsJXhtbTAKLSAgMWY6CTBmIGMyIDBhIDAzIFsgCV0qY21wdW5vcmRwcyBcKCVlZHhcKSwleG1tMQotICAyMzoJZjMgMGYgYzIgZDIgMDQgWyAJXSpjbXBuZXFzcyAleG1tMiwleG1tMgotICAyODoJZjMgMGYgYzIgMWMgMjQgMDUgWyAJXSpjbXBubHRzcyBcKCVlc3AsMVwpLCV4bW0zCi0gIDJlOgkwZiBjMiBlNSAwNiBbIAldKmNtcG5sZXBzICV4bW01LCV4bW00Ci0gIDMyOgkwZiBjMiAyZSAwNyBbIAldKmNtcG9yZHBzIFwoJWVzaVwpLCV4bW01Ci0gIDM2OglmMyAwZiBjMiBmNyAwMCBbIAldKmNtcGVxc3MgJXhtbTcsJXhtbTYKLSAgM2I6CWYzIDBmIGMyIDM4IDAxIFsgCV0qY21wbHRzcyBcKCVlYXhcKSwleG1tNwotICA0MDoJMGYgYzIgYzEgMDAgWyAJXSpjbXBlcXBzICV4bW0xLCV4bW0wCi0gIDQ0OgkwZiBjMiAwYSAwMCBbIAldKmNtcGVxcHMgXCglZWR4XCksJXhtbTEKLSAgNDg6CWYzIDBmIGMyIGQyIDAwIFsgCV0qY21wZXFzcyAleG1tMiwleG1tMgotICA0ZDoJZjMgMGYgYzIgMWMgMjQgMDAgWyAJXSpjbXBlcXNzIFwoJWVzcCwxXCksJXhtbTMKLSAgNTM6CTBmIGMyIGU1IDAxIFsgCV0qY21wbHRwcyAleG1tNSwleG1tNAotICA1NzoJMGYgYzIgMmUgMDEgWyAJXSpjbXBsdHBzIFwoJWVzaVwpLCV4bW01Ci0gIDViOglmMyAwZiBjMiBmNyAwMSBbIAldKmNtcGx0c3MgJXhtbTcsJXhtbTYKLSAgNjA6CWYzIDBmIGMyIDM4IDAxIFsgCV0qY21wbHRzcyBcKCVlYXhcKSwleG1tNwotICA2NToJMGYgYzIgMDEgMDIgWyAJXSpjbXBsZXBzIFwoJWVjeFwpLCV4bW0wCi0gIDY5OgkwZiBjMiBjYSAwMiBbIAldKmNtcGxlcHMgJXhtbTIsJXhtbTEKLSAgNmQ6CWYzIDBmIGMyIDEzIDAyIFsgCV0qY21wbGVzcyBcKCVlYnhcKSwleG1tMgotICA3MjoJZjMgMGYgYzIgZGMgMDIgWyAJXSpjbXBsZXNzICV4bW00LCV4bW0zCi0gIDc3OgkwZiBjMiA2NSAwMCAwMyBbIAldKmNtcHVub3JkcHMgMHgwXCglZWJwXCksJXhtbTQKLSAgN2M6CTBmIGMyIGVlIDAzIFsgCV0qY21wdW5vcmRwcyAleG1tNiwleG1tNQotICA4MDoJZjMgMGYgYzIgMzcgMDMgWyAJXSpjbXB1bm9yZHNzIFwoJWVkaVwpLCV4bW02Ci0gIDg1OglmMyAwZiBjMiBmOCAwMyBbIAldKmNtcHVub3Jkc3MgJXhtbTAsJXhtbTcKLSAgOGE6CTBmIGMyIGMxIDA0IFsgCV0qY21wbmVxcHMgJXhtbTEsJXhtbTAKLSAgOGU6CTBmIGMyIDBhIDA0IFsgCV0qY21wbmVxcHMgXCglZWR4XCksJXhtbTEKLSAgOTI6CWYzIDBmIGMyIGQyIDA0IFsgCV0qY21wbmVxc3MgJXhtbTIsJXhtbTIKLSAgOTc6CWYzIDBmIGMyIDFjIDI0IDA0IFsgCV0qY21wbmVxc3MgXCglZXNwLDFcKSwleG1tMwotICA5ZDoJMGYgYzIgZTUgMDUgWyAJXSpjbXBubHRwcyAleG1tNSwleG1tNAotICBhMToJMGYgYzIgMmUgMDUgWyAJXSpjbXBubHRwcyBcKCVlc2lcKSwleG1tNQotICBhNToJZjMgMGYgYzIgZjcgMDUgWyAJXSpjbXBubHRzcyAleG1tNywleG1tNgotICBhYToJZjMgMGYgYzIgMzggMDUgWyAJXSpjbXBubHRzcyBcKCVlYXhcKSwleG1tNwotICBhZjoJMGYgYzIgMDEgMDYgWyAJXSpjbXBubGVwcyBcKCVlY3hcKSwleG1tMAotICBiMzoJMGYgYzIgY2EgMDYgWyAJXSpjbXBubGVwcyAleG1tMiwleG1tMQotICBiNzoJZjMgMGYgYzIgMTMgMDYgWyAJXSpjbXBubGVzcyBcKCVlYnhcKSwleG1tMgotICBiYzoJZjMgMGYgYzIgZGMgMDYgWyAJXSpjbXBubGVzcyAleG1tNCwleG1tMwotICBjMToJMGYgYzIgNjUgMDAgMDcgWyAJXSpjbXBvcmRwcyAweDBcKCVlYnBcKSwleG1tNAotICBjNjoJMGYgYzIgZWUgMDcgWyAJXSpjbXBvcmRwcyAleG1tNiwleG1tNQotICBjYToJZjMgMGYgYzIgMzcgMDcgWyAJXSpjbXBvcmRzcyBcKCVlZGlcKSwleG1tNgotICBjZjoJZjMgMGYgYzIgZjggMDcgWyAJXSpjbXBvcmRzcyAleG1tMCwleG1tNwotICBkNDoJMGYgMmYgYzEgWyAJXSpjb21pc3MgJXhtbTEsJXhtbTAKLSAgZDc6CTBmIDJmIDBhIFsgCV0qY29taXNzIFwoJWVkeFwpLCV4bW0xCi0gIGRhOgkwZiAyYSBkMyBbIAldKmN2dHBpMnBzICVtbTMsJXhtbTIKLSAgZGQ6CTBmIDJhIDFjIDI0IFsgCV0qY3Z0cGkycHMgXCglZXNwLDFcKSwleG1tMwotICBlMToJZjMgMGYgMmEgZTUgWyAJXSpjdnRzaTJzcyAlZWJwLCV4bW00Ci0gIGU1OglmMyAwZiAyYSAyZSBbIAldKmN2dHNpMnNzIFwoJWVzaVwpLCV4bW01Ci0gIGU5OgkwZiAyZCBmNyBbIAldKmN2dHBzMnBpICV4bW03LCVtbTYKLSAgZWM6CTBmIDJkIDM4IFsgCV0qY3Z0cHMycGkgXCglZWF4XCksJW1tNwotICBlZjoJZjMgMGYgMmQgMDEgWyAJXSpjdnRzczJzaSBcKCVlY3hcKSwlZWF4Ci0gIGYzOglmMyAwZiAyZCBjYSBbIAldKmN2dHNzMnNpICV4bW0yLCVlY3gKLSAgZjc6CTBmIDJjIDEzIFsgCV0qY3Z0dHBzMnBpIFwoJWVieFwpLCVtbTIKLSAgZmE6CTBmIDJjIGRjIFsgCV0qY3Z0dHBzMnBpICV4bW00LCVtbTMKLSAgZmQ6CWYzIDBmIDJjIDY1IDAwIFsgCV0qY3Z0dHNzMnNpIDB4MFwoJWVicFwpLCVlc3AKLSAxMDI6CWYzIDBmIDJjIGVlIFsgCV0qY3Z0dHNzMnNpICV4bW02LCVlYnAKLSAxMDY6CTBmIDVlIGMxIFsgCV0qZGl2cHMgICV4bW0xLCV4bW0wCi0gMTA5OgkwZiA1ZSAwYSBbIAldKmRpdnBzICBcKCVlZHhcKSwleG1tMQotIDEwYzoJZjMgMGYgNWUgZDMgWyAJXSpkaXZzcyAgJXhtbTMsJXhtbTIKLSAxMTA6CWYzIDBmIDVlIDFjIDI0IFsgCV0qZGl2c3MgIFwoJWVzcCwxXCksJXhtbTMKLSAxMTU6CTBmIGFlIDU1IDAwIFsgCV0qbGRteGNzciAweDBcKCVlYnBcKQotIDExOToJMGYgYWUgMWUgWyAJXSpzdG14Y3NyIFwoJWVzaVwpCi0gMTFjOgkwZiBhZSBmOCBbIAldKnNmZW5jZSAKLSAxMWY6CTBmIDVmIGMxIFsgCV0qbWF4cHMgICV4bW0xLCV4bW0wCi0gMTIyOgkwZiA1ZiAwYSBbIAldKm1heHBzICBcKCVlZHhcKSwleG1tMQotIDEyNToJZjMgMGYgNWYgZDMgWyAJXSptYXhzcyAgJXhtbTMsJXhtbTIKLSAxMjk6CWYzIDBmIDVmIDFjIDI0IFsgCV0qbWF4c3MgIFwoJWVzcCwxXCksJXhtbTMKLSAxMmU6CTBmIDVkIGU1IFsgCV0qbWlucHMgICV4bW01LCV4bW00Ci0gMTMxOgkwZiA1ZCAyZSBbIAldKm1pbnBzICBcKCVlc2lcKSwleG1tNQotIDEzNDoJZjMgMGYgNWQgZjcgWyAJXSptaW5zcyAgJXhtbTcsJXhtbTYKLSAxMzg6CWYzIDBmIDVkIDM4IFsgCV0qbWluc3MgIFwoJWVheFwpLCV4bW03Ci0gMTNjOgkwZiAyOCBjMSBbIAldKm1vdmFwcyAleG1tMSwleG1tMAotIDEzZjoJMGYgMjkgMTEgWyAJXSptb3ZhcHMgJXhtbTIsXCglZWN4XCkKLSAxNDI6CTBmIDI4IDEyIFsgCV0qbW92YXBzIFwoJWVkeFwpLCV4bW0yCi0gMTQ1OgkwZiAxNiBkYyBbIAldKm1vdmxocHMgJXhtbTQsJXhtbTMKLSAxNDg6CTBmIDE3IDJjIDI0IFsgCV0qbW92aHBzICV4bW01LFwoJWVzcCwxXCkKLSAxNGM6CTBmIDE2IDJlIFsgCV0qbW92aHBzIFwoJWVzaVwpLCV4bW01Ci0gMTRmOgkwZiAxMiBmNyBbIAldKm1vdmhscHMgJXhtbTcsJXhtbTYKLSAxNTI6CTBmIDEzIDA3IFsgCV0qbW92bHBzICV4bW0wLFwoJWVkaVwpCi0gMTU1OgkwZiAxMiAwMCBbIAldKm1vdmxwcyBcKCVlYXhcKSwleG1tMAotIDE1ODoJMGYgNTAgY2EgWyAJXSptb3Ztc2twcyAleG1tMiwlZWN4Ci0gMTViOgkwZiAxMCBkMyBbIAldKm1vdnVwcyAleG1tMywleG1tMgotIDE1ZToJMGYgMTEgMjIgWyAJXSptb3Z1cHMgJXhtbTQsXCglZWR4XCkKLSAxNjE6CTBmIDEwIDY1IDAwIFsgCV0qbW92dXBzIDB4MFwoJWVicFwpLCV4bW00Ci0gMTY1OglmMyAwZiAxMCBlZSBbIAldKm1vdnNzICAleG1tNiwleG1tNQotIDE2OToJZjMgMGYgMTEgM2UgWyAJXSptb3ZzcyAgJXhtbTcsXCglZXNpXCkKLSAxNmQ6CWYzIDBmIDEwIDM4IFsgCV0qbW92c3MgIFwoJWVheFwpLCV4bW03Ci0gMTcxOgkwZiA1OSBjMSBbIAldKm11bHBzICAleG1tMSwleG1tMAotIDE3NDoJMGYgNTkgMGEgWyAJXSptdWxwcyAgXCglZWR4XCksJXhtbTEKLSAxNzc6CWYzIDBmIDU5IGQyIFsgCV0qbXVsc3MgICV4bW0yLCV4bW0yCi0gMTdiOglmMyAwZiA1OSAxYyAyNCBbIAldKm11bHNzICBcKCVlc3AsMVwpLCV4bW0zCi0gMTgwOgkwZiA1NiBlNSBbIAldKm9ycHMgICAleG1tNSwleG1tNAotIDE4MzoJMGYgNTYgMmUgWyAJXSpvcnBzICAgXCglZXNpXCksJXhtbTUKLSAxODY6CTBmIDUzIGY3IFsgCV0qcmNwcHMgICV4bW03LCV4bW02Ci0gMTg5OgkwZiA1MyAzOCBbIAldKnJjcHBzICBcKCVlYXhcKSwleG1tNwotIDE4YzoJZjMgMGYgNTMgMDEgWyAJXSpyY3BzcyAgXCglZWN4XCksJXhtbTAKLSAxOTA6CWYzIDBmIDUzIGNhIFsgCV0qcmNwc3MgICV4bW0yLCV4bW0xCi0gMTk0OgkwZiA1MiAxMyBbIAldKnJzcXJ0cHMgXCglZWJ4XCksJXhtbTIKLSAxOTc6CTBmIDUyIGRjIFsgCV0qcnNxcnRwcyAleG1tNCwleG1tMwotIDE5YToJZjMgMGYgNTIgNjUgMDAgWyAJXSpyc3FydHNzIDB4MFwoJWVicFwpLCV4bW00Ci0gMTlmOglmMyAwZiA1MiBlZSBbIAldKnJzcXJ0c3MgJXhtbTYsJXhtbTUKLSAxYTM6CTBmIGM2IDM3IDAyIFsgCV0qc2h1ZnBzIFwkMHgyLFwoJWVkaVwpLCV4bW02Ci0gMWE3OgkwZiBjNiBmOCAwMyBbIAldKnNodWZwcyBcJDB4MywleG1tMCwleG1tNwotIDFhYjoJMGYgNTEgYzEgWyAJXSpzcXJ0cHMgJXhtbTEsJXhtbTAKLSAxYWU6CTBmIDUxIDBhIFsgCV0qc3FydHBzIFwoJWVkeFwpLCV4bW0xCi0gMWIxOglmMyAwZiA1MSBkMiBbIAldKnNxcnRzcyAleG1tMiwleG1tMgotIDFiNToJZjMgMGYgNTEgMWMgMjQgWyAJXSpzcXJ0c3MgXCglZXNwLDFcKSwleG1tMwotIDFiYToJMGYgNWMgZTUgWyAJXSpzdWJwcyAgJXhtbTUsJXhtbTQKLSAxYmQ6CTBmIDVjIDJlIFsgCV0qc3VicHMgIFwoJWVzaVwpLCV4bW01Ci0gMWMwOglmMyAwZiA1YyBmNyBbIAldKnN1YnNzICAleG1tNywleG1tNgotIDFjNDoJZjMgMGYgNWMgMzggWyAJXSpzdWJzcyAgXCglZWF4XCksJXhtbTcKLSAxYzg6CTBmIDJlIDAxIFsgCV0qdWNvbWlzcyBcKCVlY3hcKSwleG1tMAotIDFjYjoJMGYgMmUgY2EgWyAJXSp1Y29taXNzICV4bW0yLCV4bW0xCi0gMWNlOgkwZiAxNSAxMyBbIAldKnVucGNraHBzIFwoJWVieFwpLCV4bW0yCi0gMWQxOgkwZiAxNSBkYyBbIAldKnVucGNraHBzICV4bW00LCV4bW0zCi0gMWQ0OgkwZiAxNCA2NSAwMCBbIAldKnVucGNrbHBzIDB4MFwoJWVicFwpLCV4bW00Ci0gMWQ4OgkwZiAxNCBlZSBbIAldKnVucGNrbHBzICV4bW02LCV4bW01Ci0gMWRiOgkwZiA1NyAzNyBbIAldKnhvcnBzICBcKCVlZGlcKSwleG1tNgotIDFkZToJMGYgNTcgZjggWyAJXSp4b3JwcyAgJXhtbTAsJXhtbTcKLSAxZTE6CTBmIGUwIGMxIFsgCV0qcGF2Z2IgICVtbTEsJW1tMAotIDFlNDoJMGYgZTAgMGEgWyAJXSpwYXZnYiAgXCglZWR4XCksJW1tMQotIDFlNzoJMGYgZTMgZDMgWyAJXSpwYXZndyAgJW1tMywlbW0yCi0gMWVhOgkwZiBlMyAxYyAyNCBbIAldKnBhdmd3ICBcKCVlc3AsMVwpLCVtbTMKLSAxZWU6CTBmIGM1IGM4IDAwIFsgCV0qcGV4dHJ3IFwkMHgwLCVtbTEsJWVheAotIDFmMjoJMGYgYzQgMDkgMDEgWyAJXSpwaW5zcncgXCQweDEsXCglZWN4XCksJW1tMQotIDFmNjoJMGYgYzQgZDIgMDIgWyAJXSpwaW5zcncgXCQweDIsJWVkeCwlbW0yCi0gMWZhOgkwZiBlZSBjMSBbIAldKnBtYXhzdyAlbW0xLCVtbTAKLSAxZmQ6CTBmIGVlIDBhIFsgCV0qcG1heHN3IFwoJWVkeFwpLCVtbTEKLSAyMDA6CTBmIGRlIGQyIFsgCV0qcG1heHViICVtbTIsJW1tMgotIDIwMzoJMGYgZGUgMWMgMjQgWyAJXSpwbWF4dWIgXCglZXNwLDFcKSwlbW0zCi0gMjA3OgkwZiBlYSBlNSBbIAldKnBtaW5zdyAlbW01LCVtbTQKLSAyMGE6CTBmIGVhIDJlIFsgCV0qcG1pbnN3IFwoJWVzaVwpLCVtbTUKLSAyMGQ6CTBmIGRhIGY3IFsgCV0qcG1pbnViICVtbTcsJW1tNgotIDIxMDoJMGYgZGEgMzggWyAJXSpwbWludWIgXCglZWF4XCksJW1tNwotIDIxMzoJMGYgZDcgZTggWyAJXSpwbW92bXNrYiAlbW01LCVlYXgKLSAyMTY6CTBmIGU0IGU1IFsgCV0qcG11bGh1dyAlbW01LCVtbTQKLSAyMTk6CTBmIGU0IDJlIFsgCV0qcG11bGh1dyBcKCVlc2lcKSwlbW01Ci0gMjFjOgkwZiBmNiBmNyBbIAldKnBzYWRidyAlbW03LCVtbTYKLSAyMWY6CTBmIGY2IDM4IFsgCV0qcHNhZGJ3IFwoJWVheFwpLCVtbTcKLSAyMjI6CTBmIDcwIGRhIDAxIFsgCV0qcHNodWZ3IFwkMHgxLCVtbTIsJW1tMwotIDIyNjoJMGYgNzAgNzUgMDAgMDQgWyAJXSpwc2h1ZncgXCQweDQsMHgwXCglZWJwXCksJW1tNgotIDIyYjoJMGYgZjcgYzcgWyAJXSptYXNrbW92cSAlbW03LCVtbTAKLSAyMmU6CTBmIDJiIDMzIFsgCV0qbW92bnRwcyAleG1tNixcKCVlYnhcKQotIDIzMToJMGYgZTcgMTAgWyAJXSptb3ZudHEgJW1tMixcKCVlYXhcKQotIDIzNDoJMGYgMTggMDYgWyAJXSpwcmVmZXRjaG50YSBcKCVlc2lcKQotIDIzNzoJMGYgMTggMGMgOTggWyAJXSpwcmVmZXRjaHQwIFwoJWVheCwlZWJ4LDRcKQotIDIzYjoJMGYgMTggMTIgWyAJXSpwcmVmZXRjaHQxIFwoJWVkeFwpCi0gMjNlOgkwZiAxOCAxOSBbIAldKnByZWZldGNodDIgXCglZWN4XCkKLSAyNDE6CTJlIDBmIFsgCV0qXChiYWRcKSAgCi0gMjQzOgljMiAwYSAwOCBbIAldKnJldCAgICBcJDB4ODBhCi0gMjQ2Ogk5MCBbIAldKm5vcCAgICAKLSAyNDc6CTkwIFsgCV0qbm9wICAgIAotIDI0ODoJNjUgWyAJXSpncwotIDI0OToJMGYgWyAJXSpzZmVuY2UuKlwoYmFkXCkuKgotIDI0YToJYWUgWyAJXSpzY2FzICAgJWVzOlwoJWVkaVwpLCVhbAotIDI0YjoJZmYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjYWxsICAgXCoweDkwOTA5MDkwXCglZWF4XCkKLSAyNTE6CTkwIFsgCV0qbm9wICAgIAotIDI1MjoJOTAgWyAJXSpub3AgICAgCi0gMjUzOgk5MCBbIAldKm5vcCAgICAKLSAyNTQ6CTkwIFsgCV0qbm9wICAgIAotIDI1NToJOTAgWyAJXSpub3AgICAgCi0gMjU2Ogk5MCBbIAldKm5vcCAgICAKLSAyNTc6CTkwIFsgCV0qbm9wICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYva2F0bWFpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MmE3NGQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9rYXRtYWkucworKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0jUElJSSBTSU1EIGluc3RydWN0aW9ucwotCi0udGV4dAotZm9vOgotIGFkZHBzCQkoJWVjeCksJXhtbTAKLSBhZGRwcwkJJXhtbTIsJXhtbTEKLSBhZGRzcwkJKCVlYngpLCV4bW0yCi0gYWRkc3MJCSV4bW00LCV4bW0zCi0gYW5kbnBzCQkweDAoJWVicCksJXhtbTQKLSBhbmRucHMJCSV4bW02LCV4bW01Ci0gYW5kcHMJCSglZWRpKSwleG1tNgotIGFuZHBzCQkleG1tMCwleG1tNwotIGNtcHBzCQkkMHgyLCV4bW0xLCV4bW0wCi0gY21wcHMJCSQweDMsKCVlZHgpLCV4bW0xCi0gY21wc3MJCSQweDQsJXhtbTIsJXhtbTIKLSBjbXBzcwkJJDB4NSwoJWVzcCwxKSwleG1tMwotIGNtcHBzCQkkMHg2LCV4bW01LCV4bW00Ci0gY21wcHMJCSQweDcsKCVlc2kpLCV4bW01Ci0gY21wc3MJCSQweDAsJXhtbTcsJXhtbTYKLSBjbXBzcwkJJDB4MSwoJWVheCksJXhtbTcKLSBjbXBlcXBzCSV4bW0xLCV4bW0wCi0gY21wZXFwcwkoJWVkeCksJXhtbTEKLSBjbXBlcXNzCSV4bW0yLCV4bW0yCi0gY21wZXFzcwkoJWVzcCwxKSwleG1tMwotIGNtcGx0cHMJJXhtbTUsJXhtbTQKLSBjbXBsdHBzCSglZXNpKSwleG1tNQotIGNtcGx0c3MJJXhtbTcsJXhtbTYKLSBjbXBsdHNzCSglZWF4KSwleG1tNwotIGNtcGxlcHMJKCVlY3gpLCV4bW0wCi0gY21wbGVwcwkleG1tMiwleG1tMQotIGNtcGxlc3MJKCVlYngpLCV4bW0yCi0gY21wbGVzcwkleG1tNCwleG1tMwotIGNtcHVub3JkcHMJMHgwKCVlYnApLCV4bW00Ci0gY21wdW5vcmRwcwkleG1tNiwleG1tNQotIGNtcHVub3Jkc3MJKCVlZGkpLCV4bW02Ci0gY21wdW5vcmRzcwkleG1tMCwleG1tNwotIGNtcG5lcXBzCSV4bW0xLCV4bW0wCi0gY21wbmVxcHMJKCVlZHgpLCV4bW0xCi0gY21wbmVxc3MJJXhtbTIsJXhtbTIKLSBjbXBuZXFzcwkoJWVzcCwxKSwleG1tMwotIGNtcG5sdHBzCSV4bW01LCV4bW00Ci0gY21wbmx0cHMJKCVlc2kpLCV4bW01Ci0gY21wbmx0c3MJJXhtbTcsJXhtbTYKLSBjbXBubHRzcwkoJWVheCksJXhtbTcKLSBjbXBubGVwcwkoJWVjeCksJXhtbTAKLSBjbXBubGVwcwkleG1tMiwleG1tMQotIGNtcG5sZXNzCSglZWJ4KSwleG1tMgotIGNtcG5sZXNzCSV4bW00LCV4bW0zCi0gY21wb3JkcHMJMHgwKCVlYnApLCV4bW00Ci0gY21wb3JkcHMJJXhtbTYsJXhtbTUKLSBjbXBvcmRzcwkoJWVkaSksJXhtbTYKLSBjbXBvcmRzcwkleG1tMCwleG1tNwotIGNvbWlzcwkJJXhtbTEsJXhtbTAKLSBjb21pc3MJCSglZWR4KSwleG1tMQotIGN2dHBpMnBzCSVtbTMsJXhtbTIKLSBjdnRwaTJwcwkoJWVzcCwxKSwleG1tMwotIGN2dHNpMnNzCSVlYnAsJXhtbTQKLSBjdnRzaTJzcwkoJWVzaSksJXhtbTUKLSBjdnRwczJwaQkleG1tNywlbW02Ci0gY3Z0cHMycGkJKCVlYXgpLCVtbTcKLSBjdnRzczJzaQkoJWVjeCksJWVheAotIGN2dHNzMnNpCSV4bW0yLCVlY3gKLSBjdnR0cHMycGkJKCVlYngpLCVtbTIKLSBjdnR0cHMycGkJJXhtbTQsJW1tMwotIGN2dHRzczJzaQkweDAoJWVicCksJWVzcAotIGN2dHRzczJzaQkleG1tNiwlZWJwCi0gZGl2cHMJCSV4bW0xLCV4bW0wCi0gZGl2cHMJCSglZWR4KSwleG1tMQotIGRpdnNzCQkleG1tMywleG1tMgotIGRpdnNzCQkoJWVzcCwxKSwleG1tMwotIGxkbXhjc3IJMHgwKCVlYnApCi0gc3RteGNzcgkoJWVzaSkKLSBzZmVuY2UKLSBtYXhwcwkJJXhtbTEsJXhtbTAKLSBtYXhwcwkJKCVlZHgpLCV4bW0xCi0gbWF4c3MJCSV4bW0zLCV4bW0yCi0gbWF4c3MJCSglZXNwLDEpLCV4bW0zCi0gbWlucHMJCSV4bW01LCV4bW00Ci0gbWlucHMJCSglZXNpKSwleG1tNQotIG1pbnNzCQkleG1tNywleG1tNgotIG1pbnNzCQkoJWVheCksJXhtbTcKLSBtb3ZhcHMJCSV4bW0xLCV4bW0wCi0gbW92YXBzCQkleG1tMiwoJWVjeCkKLSBtb3ZhcHMJCSglZWR4KSwleG1tMgotIG1vdmxocHMJJXhtbTQsJXhtbTMKLSBtb3ZocHMJCSV4bW01LCglZXNwLDEpCi0gbW92aHBzCQkoJWVzaSksJXhtbTUKLSBtb3ZobHBzCSV4bW03LCV4bW02Ci0gbW92bHBzCQkleG1tMCwoJWVkaSkKLSBtb3ZscHMJCSglZWF4KSwleG1tMAotIG1vdm1za3BzCSV4bW0yLCVlY3gKLSBtb3Z1cHMJCSV4bW0zLCV4bW0yCi0gbW92dXBzCQkleG1tNCwoJWVkeCkKLSBtb3Z1cHMJCTB4MCglZWJwKSwleG1tNAotIG1vdnNzCQkleG1tNiwleG1tNQotIG1vdnNzCQkleG1tNywoJWVzaSkKLSBtb3ZzcwkJKCVlYXgpLCV4bW03Ci0gbXVscHMJCSV4bW0xLCV4bW0wCi0gbXVscHMJCSglZWR4KSwleG1tMQotIG11bHNzCQkleG1tMiwleG1tMgotIG11bHNzCQkoJWVzcCwxKSwleG1tMwotIG9ycHMJCSV4bW01LCV4bW00Ci0gb3JwcwkJKCVlc2kpLCV4bW01Ci0gcmNwcHMJCSV4bW03LCV4bW02Ci0gcmNwcHMJCSglZWF4KSwleG1tNwotIHJjcHNzCQkoJWVjeCksJXhtbTAKLSByY3BzcwkJJXhtbTIsJXhtbTEKLSByc3FydHBzCSglZWJ4KSwleG1tMgotIHJzcXJ0cHMJJXhtbTQsJXhtbTMKLSByc3FydHNzCTB4MCglZWJwKSwleG1tNAotIHJzcXJ0c3MJJXhtbTYsJXhtbTUKLSBzaHVmcHMJCSQweDIsKCVlZGkpLCV4bW02Ci0gc2h1ZnBzCQkkMHgzLCV4bW0wLCV4bW03Ci0gc3FydHBzCQkleG1tMSwleG1tMAotIHNxcnRwcwkJKCVlZHgpLCV4bW0xCi0gc3FydHNzCQkleG1tMiwleG1tMgotIHNxcnRzcwkJKCVlc3AsMSksJXhtbTMKLSBzdWJwcwkJJXhtbTUsJXhtbTQKLSBzdWJwcwkJKCVlc2kpLCV4bW01Ci0gc3Vic3MJCSV4bW03LCV4bW02Ci0gc3Vic3MJCSglZWF4KSwleG1tNwotIHVjb21pc3MJKCVlY3gpLCV4bW0wCi0gdWNvbWlzcwkleG1tMiwleG1tMQotIHVucGNraHBzCSglZWJ4KSwleG1tMgotIHVucGNraHBzCSV4bW00LCV4bW0zCi0gdW5wY2tscHMJMHgwKCVlYnApLCV4bW00Ci0gdW5wY2tscHMJJXhtbTYsJXhtbTUKLSB4b3JwcwkJKCVlZGkpLCV4bW02Ci0geG9ycHMJCSV4bW0wLCV4bW03Ci0gcGF2Z2IJCSVtbTEsJW1tMAotIHBhdmdiCQkoJWVkeCksJW1tMQotIHBhdmd3CQklbW0zLCVtbTIKLSBwYXZndwkJKCVlc3AsMSksJW1tMwotIHBleHRydwkJJDB4MCwlbW0xLCVlYXgKLSBwaW5zcncJCSQweDEsKCVlY3gpLCVtbTEKLSBwaW5zcncJCSQweDIsJWVkeCwlbW0yCi0gcG1heHN3CQklbW0xLCVtbTAKLSBwbWF4c3cJCSglZWR4KSwlbW0xCi0gcG1heHViCQklbW0yLCVtbTIKLSBwbWF4dWIJCSglZXNwLDEpLCVtbTMKLSBwbWluc3cJCSVtbTUsJW1tNAotIHBtaW5zdwkJKCVlc2kpLCVtbTUKLSBwbWludWIJCSVtbTcsJW1tNgotIHBtaW51YgkJKCVlYXgpLCVtbTcKLSBwbW92bXNrYgklbW01LCVlYXgKLSBwbXVsaHV3CSVtbTUsJW1tNAotIHBtdWxodXcJKCVlc2kpLCVtbTUKLSBwc2FkYncJCSVtbTcsJW1tNgotIHBzYWRidwkJKCVlYXgpLCVtbTcKLSBwc2h1ZncJCSQweDEsJW1tMiwlbW0zCi0gcHNodWZ3CQkkMHg0LDB4MCglZWJwKSwlbW02Ci0gbWFza21vdnEJJW1tNywlbW0wCi0gbW92bnRwcwkleG1tNiwoJWVieCkKLSBtb3ZudHEJCSVtbTIsKCVlYXgpCi0gcHJlZmV0Y2hudGEJKCVlc2kpCi0gcHJlZmV0Y2h0MAkoJWVheCwlZWJ4LDQpCi0gcHJlZmV0Y2h0MQkoJWVkeCkKLSBwcmVmZXRjaHQyCSglZWN4KQotCi0jIEEgU0lNRCBpbnN0cnVjdGlvbiB3aXRoIGEgYmFkIGV4dGVuc2lvbiBieXRlCi0uYnl0ZSAweDJFLDB4MEYsMHhDMiwweDBBLDB4MDgKLSBub3AKLSBub3AKLSMgQSBiYWQgc2ZlbmNlIG1vZHJtIGJ5dGUKLS5ieXRlIDB4NjUsMHgwRiwweEFFLDB4ZmYKLSMgUGFkIG91dCB0byBnb28gYWxpZ25tZW50Ci0uYnl0ZSAweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwLDB4OTAsMHg5MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5sIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTFiYzc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvbW9kcm0ubAorKysgL2Rldi9udWxsCkBAIC0xLDE5ODQgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjEyODogV2FybmluZzouKgotLio6MTI5OiBXYXJuaW5nOi4qCi0uKjoxMzA6IFdhcm5pbmc6LioKLS4qOjEzMTogV2FybmluZzouKgotLio6MTMyOiBXYXJuaW5nOi4qCi0uKjoxMzM6IFdhcm5pbmc6LioKLS4qOjEzNDogV2FybmluZzouKgotLio6MTM1OiBXYXJuaW5nOi4qCi0uKjoxOTI6IFdhcm5pbmc6LioKLS4qOjE5MzogV2FybmluZzouKgotLio6MTk0OiBXYXJuaW5nOi4qCi0uKjoxOTU6IFdhcm5pbmc6LioKLS4qOjE5NjogV2FybmluZzouKgotLio6MTk3OiBXYXJuaW5nOi4qCi0uKjoxOTg6IFdhcm5pbmc6LioKLS4qOjE5OTogV2FybmluZzouKgotLio6MjU2OiBXYXJuaW5nOi4qCi0uKjoyNTc6IFdhcm5pbmc6LioKLS4qOjI1ODogV2FybmluZzouKgotLio6MjU5OiBXYXJuaW5nOi4qCi0uKjoyNjA6IFdhcm5pbmc6LioKLS4qOjI2MTogV2FybmluZzouKgotLio6MjYyOiBXYXJuaW5nOi4qCi0uKjoyNjM6IFdhcm5pbmc6LioKLS4qOjM4NDogV2FybmluZzouKgotLio6Mzg1OiBXYXJuaW5nOi4qCi0uKjozODY6IFdhcm5pbmc6LioKLS4qOjM4NzogV2FybmluZzouKgotLio6Mzg4OiBXYXJuaW5nOi4qCi0uKjozODk6IFdhcm5pbmc6LioKLS4qOjM5MDogV2FybmluZzouKgotLio6MzkxOiBXYXJuaW5nOi4qCi0uKjo0NDg6IFdhcm5pbmc6LioKLS4qOjQ0OTogV2FybmluZzouKgotLio6NDUwOiBXYXJuaW5nOi4qCi0uKjo0NTE6IFdhcm5pbmc6LioKLS4qOjQ1MjogV2FybmluZzouKgotLio6NDUzOiBXYXJuaW5nOi4qCi0uKjo0NTQ6IFdhcm5pbmc6LioKLS4qOjQ1NTogV2FybmluZzouKgotLio6NTEyOiBXYXJuaW5nOi4qCi0uKjo1MTM6IFdhcm5pbmc6LioKLS4qOjUxNDogV2FybmluZzouKgotLio6NTE1OiBXYXJuaW5nOi4qCi0uKjo1MTY6IFdhcm5pbmc6LioKLS4qOjUxNzogV2FybmluZzouKgotLio6NTE4OiBXYXJuaW5nOi4qCi0uKjo1MTk6IFdhcm5pbmc6LioKLS4qOjY0MDogV2FybmluZzouKgotLio6NjQxOiBXYXJuaW5nOi4qCi0uKjo2NDI6IFdhcm5pbmc6LioKLS4qOjY0MzogV2FybmluZzouKgotLio6NjQ0OiBXYXJuaW5nOi4qCi0uKjo2NDU6IFdhcm5pbmc6LioKLS4qOjY0NjogV2FybmluZzouKgotLio6NjQ3OiBXYXJuaW5nOi4qCi0uKjo3MDQ6IFdhcm5pbmc6LioKLS4qOjcwNTogV2FybmluZzouKgotLio6NzA2OiBXYXJuaW5nOi4qCi0uKjo3MDc6IFdhcm5pbmc6LioKLS4qOjcwODogV2FybmluZzouKgotLio6NzA5OiBXYXJuaW5nOi4qCi0uKjo3MTA6IFdhcm5pbmc6LioKLS4qOjcxMTogV2FybmluZzouKgotLio6NzY4OiBXYXJuaW5nOi4qCi0uKjo3Njk6IFdhcm5pbmc6LioKLS4qOjc3MDogV2FybmluZzouKgotLio6NzcxOiBXYXJuaW5nOi4qCi0uKjo3NzI6IFdhcm5pbmc6LioKLS4qOjc3MzogV2FybmluZzouKgotLio6Nzc0OiBXYXJuaW5nOi4qCi0uKjo3NzU6IFdhcm5pbmc6LioKLS4qOjgxMjogV2FybmluZzouKgotLio6ODIwOiBXYXJuaW5nOi4qCi0uKjo4Mjg6IFdhcm5pbmc6LioKLS4qOjgzMzogV2FybmluZzouKgotLio6ODM0OiBXYXJuaW5nOi4qCi0uKjo4MzU6IFdhcm5pbmc6LioKLS4qOjk2MTogV2FybmluZzouKgotLio6OTYyOiBXYXJuaW5nOi4qCi0uKjo5NjM6IFdhcm5pbmc6LioKLS4qOjk2NDogV2FybmluZzouKgotLio6OTY1OiBXYXJuaW5nOi4qCi0uKjo5NjY6IFdhcm5pbmc6LioKLS4qOjk2NzogV2FybmluZzouKgotLio6OTY4OiBXYXJuaW5nOi4qCi0uKjoxMDI1OiBXYXJuaW5nOi4qCi0uKjoxMDI2OiBXYXJuaW5nOi4qCi0uKjoxMDI3OiBXYXJuaW5nOi4qCi0uKjoxMDI4OiBXYXJuaW5nOi4qCi0uKjoxMDI5OiBXYXJuaW5nOi4qCi0uKjoxMDMwOiBXYXJuaW5nOi4qCi0uKjoxMDMxOiBXYXJuaW5nOi4qCi0uKjoxMDMyOiBXYXJuaW5nOi4qCi0uKjoxMDg5OiBXYXJuaW5nOi4qCi0uKjoxMDkwOiBXYXJuaW5nOi4qCi0uKjoxMDkxOiBXYXJuaW5nOi4qCi0uKjoxMDkyOiBXYXJuaW5nOi4qCi0uKjoxMDkzOiBXYXJuaW5nOi4qCi0uKjoxMDk0OiBXYXJuaW5nOi4qCi0uKjoxMDk1OiBXYXJuaW5nOi4qCi0uKjoxMDk2OiBXYXJuaW5nOi4qCi0uKjoxMjE3OiBXYXJuaW5nOi4qCi0uKjoxMjE4OiBXYXJuaW5nOi4qCi0uKjoxMjE5OiBXYXJuaW5nOi4qCi0uKjoxMjIwOiBXYXJuaW5nOi4qCi0uKjoxMjIxOiBXYXJuaW5nOi4qCi0uKjoxMjIyOiBXYXJuaW5nOi4qCi0uKjoxMjIzOiBXYXJuaW5nOi4qCi0uKjoxMjI0OiBXYXJuaW5nOi4qCi0uKjoxMjgxOiBXYXJuaW5nOi4qCi0uKjoxMjgyOiBXYXJuaW5nOi4qCi0uKjoxMjgzOiBXYXJuaW5nOi4qCi0uKjoxMjg0OiBXYXJuaW5nOi4qCi0uKjoxMjg1OiBXYXJuaW5nOi4qCi0uKjoxMjg2OiBXYXJuaW5nOi4qCi0uKjoxMjg3OiBXYXJuaW5nOi4qCi0uKjoxMjg4OiBXYXJuaW5nOi4qCi0uKjoxMzQ1OiBXYXJuaW5nOi4qCi0uKjoxMzQ2OiBXYXJuaW5nOi4qCi0uKjoxMzQ3OiBXYXJuaW5nOi4qCi0uKjoxMzQ4OiBXYXJuaW5nOi4qCi0uKjoxMzQ5OiBXYXJuaW5nOi4qCi0uKjoxMzUwOiBXYXJuaW5nOi4qCi0uKjoxMzUxOiBXYXJuaW5nOi4qCi0uKjoxMzUyOiBXYXJuaW5nOi4qCi0uKjoxNDczOiBXYXJuaW5nOi4qCi0uKjoxNDc0OiBXYXJuaW5nOi4qCi0uKjoxNDc1OiBXYXJuaW5nOi4qCi0uKjoxNDc2OiBXYXJuaW5nOi4qCi0uKjoxNDc3OiBXYXJuaW5nOi4qCi0uKjoxNDc4OiBXYXJuaW5nOi4qCi0uKjoxNDc5OiBXYXJuaW5nOi4qCi0uKjoxNDgwOiBXYXJuaW5nOi4qCi0uKjoxNTM3OiBXYXJuaW5nOi4qCi0uKjoxNTM4OiBXYXJuaW5nOi4qCi0uKjoxNTM5OiBXYXJuaW5nOi4qCi0uKjoxNTQwOiBXYXJuaW5nOi4qCi0uKjoxNTQxOiBXYXJuaW5nOi4qCi0uKjoxNTQyOiBXYXJuaW5nOi4qCi0uKjoxNTQzOiBXYXJuaW5nOi4qCi0uKjoxNTQ0OiBXYXJuaW5nOi4qCi0uKjoxNjAxOiBXYXJuaW5nOi4qCi0uKjoxNjAyOiBXYXJuaW5nOi4qCi0uKjoxNjAzOiBXYXJuaW5nOi4qCi0uKjoxNjA0OiBXYXJuaW5nOi4qCi0uKjoxNjA1OiBXYXJuaW5nOi4qCi0uKjoxNjA2OiBXYXJuaW5nOi4qCi0uKjoxNjA3OiBXYXJuaW5nOi4qCi0uKjoxNjA4OiBXYXJuaW5nOi4qCi0uKjoxNjQ1OiBXYXJuaW5nOi4qCi0uKjoxNjUzOiBXYXJuaW5nOi4qCi0uKjoxNjYxOiBXYXJuaW5nOi4qCi0uKjoxNjY2OiBXYXJuaW5nOi4qCi0uKjoxNjY3OiBXYXJuaW5nOi4qCi0uKjoxNjY4OiBXYXJuaW5nOi4qCi0gICAxICAgICAgICAgICAgICAgICAgICAgICAJLnBzaXplIDAKLSAgIDIgICAgICAgICAgICAgICAgICAgICAgIAkudGV4dAotICAgMyAwMDAwIDM2OEMxOCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWF4XCkKLSAgIDQgMDAwMyAzNjhDMTkgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeFwpCi0gICA1IDAwMDYgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHhcKQotICAgNiAwMDA5IDM2OEMxQiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJ4XCkKLSAgIDcgMDAwYyAzNjhDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjAKLSAgIDggMDAxMyAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaVwpCi0gICA5IDAwMTYgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGlcKQotICAxMCAwMDE5IDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheFwpCi0gIDExIDAwMWQgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4XCkKLSAgMTIgMDAyMSAzNjhDNUExMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHhcKQotICAxMyAwMDI1IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieFwpCi0gIDE0IDAwMjkgOEM1RDEyICAgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWJwXCkKLSAgMTUgMDAyYyAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2lcKQotICAxNiAwMDMwIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaVwpCi0gIDE3IDAwMzQgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4XCkKLSAgMTggMDAzYiAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3hcKQotICAxOSAwMDQyIDM2OEM5QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeFwpCi0gIDIwIDAwNDkgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4XCkKLSAgMjEgMDA1MCA4QzlENzg1NiAzNDEyICAgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlYnBcKQotICAyMiAwMDU2IDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaVwpCi0gIDIzIDAwNWQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpXCkKLSAgMjQgMDA2NCA4Q0Q4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVheAotICAyNSAwMDY2IDhDRDkgICAgICAgICAgICAgIAkJbW92CSVkcywlZWN4Ci0gIDI2IDAwNjggOENEQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlZHgKLSAgMjcgMDA2YSA4Q0RCICAgICAgICAgICAgICAJCW1vdgklZHMsJWVieAotICAyOCAwMDZjIDhDREMgICAgICAgICAgICAgIAkJbW92CSVkcywlZXNwCi0gIDI5IDAwNmUgOENERCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYnAKLSAgMzAgMDA3MCA4Q0RFICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzaQotICAzMSAwMDcyIDhDREYgICAgICAgICAgICAgIAkJbW92CSVkcywlZWRpCi0gIDMyIDAwNzQgMzY4QzFDMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVheCwxXCkKLSAgMzMgMDA3OCAzNjhDMUMwMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWF4LDFcKQotICAzNCAwMDdjIDM2OEMxQzAyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYXgsMVwpCi0gIDM1IDAwODAgMzY4QzFDMDMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVheCwxXCkKLSAgMzYgMDA4NCA4QzFDMDQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWF4LDFcKQotICAzNyAwMDg3IDM2OEMxQzA1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVheCwxXCkKLSAgMzggMDA4ZiAzNjhDMUMwNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWF4LDFcKQotICAzOSAwMDkzIDM2OEMxQzA3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYXgsMVwpCi0gIDQwIDAwOTcgMzY4QzFDMDggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVjeCwxXCkKLSAgNDEgMDA5YiAzNjhDMUMwOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWN4LDFcKQotICA0MiAwMDlmIDM2OEMxQzBBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlY3gsMVwpCi0gIDQzIDAwYTMgMzY4QzFDMEIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVjeCwxXCkKLSAgNDQgMDBhNyA4QzFDMEMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWN4LDFcKQotICA0NSAwMGFhIDM2OEMxQzBEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVjeCwxXCkKLSAgNDYgMDBiMiAzNjhDMUMwRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWN4LDFcKQotICA0NyAwMGI2IDM2OEMxQzBGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlY3gsMVwpCi0gIDQ4IDAwYmEgMzY4QzFDMTAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVkeCwxXCkKLSAgNDkgMDBiZSAzNjhDMUMxMSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWR4LDFcKQotICA1MCAwMGMyIDM2OEMxQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZHgsMVwpCi0gIDUxIDAwYzYgMzY4QzFDMTMgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVkeCwxXCkKLSAgNTIgMDBjYSA4QzFDMTQgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWR4LDFcKQotICA1MyAwMGNkIDM2OEMxQzE1IDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVkeCwxXCkKLSAgNTQgMDBkNSAzNjhDMUMxNiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWR4LDFcKQotICA1NSAwMGQ5IDM2OEMxQzE3ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlZHgsMVwpCi0gIDU2IDAwZGQgMzY4QzFDMTggICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsJWVieCwxXCkKLSAgNTcgMDBlMSAzNjhDMUMxOSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVjeCwlZWJ4LDFcKQotICA1OCAwMGU1IDM2OEMxQzFBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlYngsMVwpCi0gIDU5IDAwZTkgMzY4QzFDMUIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsJWVieCwxXCkKLSAgNjAgMDBlZCA4QzFDMUMgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzcCwlZWJ4LDFcKQotICA2MSAwMGYwIDM2OEMxQzFEIDAwMDAwMDAwIAkJbW92CSVkcywlc3M6XCgsJWVieCwxXCkKLSAgNjIgMDBmOCAzNjhDMUMxRSAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwlZWJ4LDFcKQotICA2MyAwMGZjIDM2OEMxQzFGICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWRpLCVlYngsMVwpCi0gIDY0IDAxMDAgMzY4QzE4ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYXgsMVwpCi0gIDY1IDAxMDMgMzY4QzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsMVwpCi0gIDY2IDAxMDYgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsMVwpCi0gIDY3IDAxMDkgMzY4QzFCICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYngsMVwpCi0gIDY4IDAxMGMgOEMxQzI0ICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlc3AsMVwpCi0gIDY5IDAxMGYgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCwxXCkKLSAgNzAgMDExNiAzNjhDMUUgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVzaSwxXCkKLSAgNzEgMDExOSAzNjhDMUYgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVkaSwxXCkKLSAgNzIgMDExYyAzNjhDMUMyOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDFcKQotICA3MyAwMTIwIDM2OEMxQzI5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsMVwpCi0gIDc0IDAxMjQgMzY4QzFDMkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCwxXCkKLSAgNzUgMDEyOCAzNjhDMUMyQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDFcKQotICA3NiAwMTJjIDhDMUMyQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsMVwpCi0gIDc3IDAxMmYgMzY4QzFDMkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDFcKQotICA3OCAwMTM3IDM2OEMxQzJFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsMVwpCi0gIDc5IDAxM2IgMzY4QzFDMkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCwxXCkKLSAgODAgMDEzZiAzNjhDMUMzMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDFcKQotICA4MSAwMTQzIDM2OEMxQzMxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksMVwpCi0gIDgyIDAxNDcgMzY4QzFDMzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSwxXCkKLSAgODMgMDE0YiAzNjhDMUMzMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDFcKQotICA4NCAwMTRmIDhDMUMzNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksMVwpCi0gIDg1IDAxNTIgMzY4QzFDMzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDFcKQotICA4NiAwMTVhIDM2OEMxQzM2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksMVwpCi0gIDg3IDAxNWUgMzY4QzFDMzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSwxXCkKLSAgODggMDE2MiAzNjhDMUMzOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDFcKQotICA4OSAwMTY2IDM2OEMxQzM5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksMVwpCi0gIDkwIDAxNmEgMzY4QzFDM0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSwxXCkKLSAgOTEgMDE2ZSAzNjhDMUMzQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDFcKQotICA5MiAwMTcyIDhDMUMzQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksMVwpCi0gIDkzIDAxNzUgMzY4QzFDM0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDFcKQotICA5NCAwMTdkIDM2OEMxQzNFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksMVwpCi0gIDk1IDAxODEgMzY4QzFDM0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSwxXCkKLSAgOTYgMDE4NSAzNjhDMUM0MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDJcKQotICA5NyAwMTg5IDM2OEMxQzQxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsMlwpCi0gIDk4IDAxOGQgMzY4QzFDNDIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCwyXCkKLSAgOTkgMDE5MSAzNjhDMUM0MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDJcKQotIDEwMCAwMTk1IDhDMUM0NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsMlwpCi0gMTAxIDAxOTggMzY4QzFDNDUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDJcKQotIDEwMiAwMWEwIDM2OEMxQzQ2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsMlwpCi0gMTAzIDAxYTQgMzY4QzFDNDcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCwyXCkKLSAxMDQgMDFhOCAzNjhDMUM0OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDJcKQotIDEwNSAwMWFjIDM2OEMxQzQ5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsMlwpCi0gMTA2IDAxYjAgMzY4QzFDNEEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCwyXCkKLSAxMDcgMDFiNCAzNjhDMUM0QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDJcKQotIDEwOCAwMWI4IDhDMUM0QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsMlwpCi0gMTA5IDAxYmIgMzY4QzFDNEQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDJcKQotIDExMCAwMWMzIDM2OEMxQzRFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsMlwpCi0gMTExIDAxYzcgMzY4QzFDNEYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCwyXCkKLSAxMTIgMDFjYiAzNjhDMUM1MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDJcKQotIDExMyAwMWNmIDM2OEMxQzUxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsMlwpCi0gMTE0IDAxZDMgMzY4QzFDNTIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCwyXCkKLSAxMTUgMDFkNyAzNjhDMUM1MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDJcKQotIDExNiAwMWRiIDhDMUM1NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsMlwpCi0gMTE3IDAxZGUgMzY4QzFDNTUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDJcKQotIDExOCAwMWU2IDM2OEMxQzU2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsMlwpCi0gMTE5IDAxZWEgMzY4QzFDNTcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCwyXCkKLSAxMjAgMDFlZSAzNjhDMUM1OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDJcKQotIDEyMSAwMWYyIDM2OEMxQzU5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsMlwpCi0gMTIyIDAxZjYgMzY4QzFDNUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCwyXCkKLSAxMjMgMDFmYSAzNjhDMUM1QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDJcKQotIDEyNCAwMWZlIDhDMUM1QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsMlwpCi0gMTI1IDAyMDEgMzY4QzFDNUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDJcKQotIDEyNiAwMjA5IDM2OEMxQzVFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsMlwpCi0gMTI3IDAyMGQgMzY4QzFDNUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCwyXCkKLSAxMjggMDIxMSAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDEyOSAwMjE0IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gMTMwIDAyMTcgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsMlwpCi0uKldhcm5pbmc6LioKLSAxMzEgMDIxYSAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDEzMiAwMjFkIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gMTMzIDAyMjAgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCwyXCkKLS4qV2FybmluZzouKgotIDEzNCAwMjI3IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gMTM1IDAyMmEgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxMzYgMDIyZCAzNjhDMUM2OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDJcKQotIDEzNyAwMjMxIDM2OEMxQzY5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsMlwpCi0gMTM4IDAyMzUgMzY4QzFDNkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCwyXCkKLSAxMzkgMDIzOSAzNjhDMUM2QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDJcKQotIDE0MCAwMjNkIDhDMUM2QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsMlwpCi0gMTQxIDAyNDAgMzY4QzFDNkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDJcKQotIDE0MiAwMjQ4IDM2OEMxQzZFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsMlwpCi0gMTQzIDAyNGMgMzY4QzFDNkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCwyXCkKLSAxNDQgMDI1MCAzNjhDMUM3MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDJcKQotIDE0NSAwMjU0IDM2OEMxQzcxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksMlwpCi0gMTQ2IDAyNTggMzY4QzFDNzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSwyXCkKLSAxNDcgMDI1YyAzNjhDMUM3MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDJcKQotIDE0OCAwMjYwIDhDMUM3NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksMlwpCi0gMTQ5IDAyNjMgMzY4QzFDNzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDJcKQotIDE1MCAwMjZiIDM2OEMxQzc2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksMlwpCi0gMTUxIDAyNmYgMzY4QzFDNzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSwyXCkKLSAxNTIgMDI3MyAzNjhDMUM3OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDJcKQotIDE1MyAwMjc3IDM2OEMxQzc5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksMlwpCi0gMTU0IDAyN2IgMzY4QzFDN0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSwyXCkKLSAxNTUgMDI3ZiAzNjhDMUM3QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDJcKQotIDE1NiAwMjgzIDhDMUM3QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksMlwpCi0gMTU3IDAyODYgMzY4QzFDN0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDJcKQotIDE1OCAwMjhlIDM2OEMxQzdFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksMlwpCi0gMTU5IDAyOTIgMzY4QzFDN0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSwyXCkKLSAxNjAgMDI5NiAzNjhDMUM4MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDRcKQotIDE2MSAwMjlhIDM2OEMxQzgxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsNFwpCi0gMTYyIDAyOWUgMzY4QzFDODIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCw0XCkKLSAxNjMgMDJhMiAzNjhDMUM4MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDRcKQotIDE2NCAwMmE2IDhDMUM4NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsNFwpCi0gMTY1IDAyYTkgMzY4QzFDODUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDRcKQotIDE2NiAwMmIxIDM2OEMxQzg2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsNFwpCi0gMTY3IDAyYjUgMzY4QzFDODcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCw0XCkKLSAxNjggMDJiOSAzNjhDMUM4OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDRcKQotIDE2OSAwMmJkIDM2OEMxQzg5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsNFwpCi0gMTcwIDAyYzEgMzY4QzFDOEEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCw0XCkKLSAxNzEgMDJjNSAzNjhDMUM4QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDRcKQotIDE3MiAwMmM5IDhDMUM4QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsNFwpCi0gMTczIDAyY2MgMzY4QzFDOEQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDRcKQotIDE3NCAwMmQ0IDM2OEMxQzhFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsNFwpCi0gMTc1IDAyZDggMzY4QzFDOEYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCw0XCkKLSAxNzYgMDJkYyAzNjhDMUM5MCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDRcKQotIDE3NyAwMmUwIDM2OEMxQzkxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsNFwpCi0gMTc4IDAyZTQgMzY4QzFDOTIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCw0XCkKLSAxNzkgMDJlOCAzNjhDMUM5MyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDRcKQotIDE4MCAwMmVjIDhDMUM5NCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsNFwpCi0gMTgxIDAyZWYgMzY4QzFDOTUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDRcKQotIDE4MiAwMmY3IDM2OEMxQzk2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsNFwpCi0gMTgzIDAyZmIgMzY4QzFDOTcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCw0XCkKLSAxODQgMDJmZiAzNjhDMUM5OCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDRcKQotIDE4NSAwMzAzIDM2OEMxQzk5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsNFwpCi0gMTg2IDAzMDcgMzY4QzFDOUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCw0XCkKLSAxODcgMDMwYiAzNjhDMUM5QiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDRcKQotIDE4OCAwMzBmIDhDMUM5QyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsNFwpCi0gMTg5IDAzMTIgMzY4QzFDOUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDRcKQotIDE5MCAwMzFhIDM2OEMxQzlFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsNFwpCi0gMTkxIDAzMWUgMzY4QzFDOUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCw0XCkKLSAxOTIgMDMyMiAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDE5MyAwMzI1IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTk0IDAzMjggMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsNFwpCi0uKldhcm5pbmc6LioKLSAxOTUgMDMyYiAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDE5NiAwMzJlIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTk3IDAzMzEgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCw0XCkKLS4qV2FybmluZzouKgotIDE5OCAwMzM4IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTk5IDAzM2IgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksNFwpCi0uKldhcm5pbmc6LioKLSAyMDAgMDMzZSAzNjhDMUNBOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDRcKQotIDIwMSAwMzQyIDM2OEMxQ0E5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsNFwpCi0gMjAyIDAzNDYgMzY4QzFDQUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCw0XCkKLSAyMDMgMDM0YSAzNjhDMUNBQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDRcKQotIDIwNCAwMzRlIDhDMUNBQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsNFwpCi0gMjA1IDAzNTEgMzY4QzFDQUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDRcKQotIDIwNiAwMzU5IDM2OEMxQ0FFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsNFwpCi0gMjA3IDAzNWQgMzY4QzFDQUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCw0XCkKLSAyMDggMDM2MSAzNjhDMUNCMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDRcKQotIDIwOSAwMzY1IDM2OEMxQ0IxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksNFwpCi0gMjEwIDAzNjkgMzY4QzFDQjIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSw0XCkKLSAyMTEgMDM2ZCAzNjhDMUNCMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDRcKQotIDIxMiAwMzcxIDhDMUNCNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksNFwpCi0gMjEzIDAzNzQgMzY4QzFDQjUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDRcKQotIDIxNCAwMzdjIDM2OEMxQ0I2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksNFwpCi0gMjE1IDAzODAgMzY4QzFDQjcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSw0XCkKLSAyMTYgMDM4NCAzNjhDMUNCOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDRcKQotIDIxNyAwMzg4IDM2OEMxQ0I5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZGksNFwpCi0gMjE4IDAzOGMgMzY4QzFDQkEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkaSw0XCkKLSAyMTkgMDM5MCAzNjhDMUNCQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDRcKQotIDIyMCAwMzk0IDhDMUNCQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksNFwpCi0gMjIxIDAzOTcgMzY4QzFDQkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDRcKQotIDIyMiAwMzlmIDM2OEMxQ0JFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksNFwpCi0gMjIzIDAzYTMgMzY4QzFDQkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSw0XCkKLSAyMjQgMDNhNyAzNjhDMUNDMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWF4LDhcKQotIDIyNSAwM2FiIDM2OEMxQ0MxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYXgsOFwpCi0gMjI2IDAzYWYgMzY4QzFDQzIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVheCw4XCkKLSAyMjcgMDNiMyAzNjhDMUNDMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWF4LDhcKQotIDIyOCAwM2I3IDhDMUNDNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYXgsOFwpCi0gMjI5IDAzYmEgMzY4QzFDQzUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWF4LDhcKQotIDIzMCAwM2MyIDM2OEMxQ0M2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYXgsOFwpCi0gMjMxIDAzYzYgMzY4QzFDQzcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVheCw4XCkKLSAyMzIgMDNjYSAzNjhDMUNDOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWN4LDhcKQotIDIzMyAwM2NlIDM2OEMxQ0M5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlY3gsOFwpCi0gMjM0IDAzZDIgMzY4QzFDQ0EgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVjeCw4XCkKLSAyMzUgMDNkNiAzNjhDMUNDQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWN4LDhcKQotIDIzNiAwM2RhIDhDMUNDQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlY3gsOFwpCi0gMjM3IDAzZGQgMzY4QzFDQ0QgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWN4LDhcKQotIDIzOCAwM2U1IDM2OEMxQ0NFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlY3gsOFwpCi0gMjM5IDAzZTkgMzY4QzFDQ0YgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVjeCw4XCkKLSAyNDAgMDNlZCAzNjhDMUNEMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWR4LDhcKQotIDI0MSAwM2YxIDM2OEMxQ0QxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlZHgsOFwpCi0gMjQyIDAzZjUgMzY4QzFDRDIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVkeCw4XCkKLSAyNDMgMDNmOSAzNjhDMUNEMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWR4LDhcKQotIDI0NCAwM2ZkIDhDMUNENCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZHgsOFwpCi0gMjQ1IDA0MDAgMzY4QzFDRDUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWR4LDhcKQotIDI0NiAwNDA4IDM2OEMxQ0Q2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZHgsOFwpCi0gMjQ3IDA0MGMgMzY4QzFDRDcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkeCw4XCkKLSAyNDggMDQxMCAzNjhDMUNEOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJ4LDhcKQotIDI0OSAwNDE0IDM2OEMxQ0Q5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYngsOFwpCi0gMjUwIDA0MTggMzY4QzFDREEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVieCw4XCkKLSAyNTEgMDQxYyAzNjhDMUNEQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJ4LDhcKQotIDI1MiAwNDIwIDhDMUNEQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYngsOFwpCi0gMjUzIDA0MjMgMzY4QzFDREQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJ4LDhcKQotIDI1NCAwNDJiIDM2OEMxQ0RFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYngsOFwpCi0gMjU1IDA0MmYgMzY4QzFDREYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVieCw4XCkKLSAyNTYgMDQzMyAzNjhDMTggICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDI1NyAwNDM2IDM2OEMxOSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gMjU4IDA0MzkgMzY4QzFBICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAyNTkgMDQzYyAzNjhDMUIgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDI2MCAwNDNmIDhDMUMyNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gMjYxIDA0NDIgMzY4QzFEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVzczpcKCw4XCkKLS4qV2FybmluZzouKgotIDI2MiAwNDQ5IDM2OEMxRSAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMjYzIDA0NGMgMzY4QzFGICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksOFwpCi0uKldhcm5pbmc6LioKLSAyNjQgMDQ0ZiAzNjhDMUNFOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWJwLDhcKQotIDI2NSAwNDUzIDM2OEMxQ0U5ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlYnAsOFwpCi0gMjY2IDA0NTcgMzY4QzFDRUEgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVicCw4XCkKLSAyNjcgMDQ1YiAzNjhDMUNFQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWJwLDhcKQotIDI2OCAwNDVmIDhDMUNFQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlYnAsOFwpCi0gMjY5IDA0NjIgMzY4QzFDRUQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWJwLDhcKQotIDI3MCAwNDZhIDM2OEMxQ0VFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlYnAsOFwpCi0gMjcxIDA0NmUgMzY4QzFDRUYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVicCw4XCkKLSAyNzIgMDQ3MiAzNjhDMUNGMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZXNpLDhcKQotIDI3MyAwNDc2IDM2OEMxQ0YxICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWN4LCVlc2ksOFwpCi0gMjc0IDA0N2EgMzY4QzFDRjIgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZHgsJWVzaSw4XCkKLSAyNzUgMDQ3ZSAzNjhDMUNGMyAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZXNpLDhcKQotIDI3NiAwNDgyIDhDMUNGNCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlc2ksOFwpCi0gMjc3IDA0ODUgMzY4QzFDRjUgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZXNpLDhcKQotIDI3OCAwNDhkIDM2OEMxQ0Y2ICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlc2ksOFwpCi0gMjc5IDA0OTEgMzY4QzFDRjcgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVzaSw4XCkKLSAyODAgMDQ5NSAzNjhDMUNGOCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVheCwlZWRpLDhcKQotIDI4MSAwNDk5IDM2OEMxQ0ZBICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWR4LCVlZGksOFwpCi0gMjgyIDA0OWQgMzY4QzFDRjkgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlY3gsJWVkaSw4XCkKLSAyODMgMDRhMSAzNjhDMUNGQiAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVieCwlZWRpLDhcKQotIDI4NCAwNGE1IDhDMUNGQyAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNwLCVlZGksOFwpCi0gMjg1IDA0YTggMzY4QzFDRkQgMDAwMDAwMDAgCQltb3YJJWRzLCVzczpcKCwlZWRpLDhcKQotIDI4NiAwNGIwIDM2OEMxQ0ZFICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZXNpLCVlZGksOFwpCi0gMjg3IDA0YjQgMzY4QzFDRkYgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlZGksJWVkaSw4XCkKLSAyODggMDRiOCAzNjhDNUMwMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVheCwxXCkKLSAyODkgMDRiZCAzNjhDNUMwMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVheCwxXCkKLSAyOTAgMDRjMiAzNjhDNUMwMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVheCwxXCkKLSAyOTEgMDRjNyAzNjhDNUMwMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVheCwxXCkKLSAyOTIgMDRjYyA4QzVDMDQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVheCwxXCkKLSAyOTMgMDRkMCA4QzVDMDUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVheCwxXCkKLSAyOTQgMDRkNCAzNjhDNUMwNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVheCwxXCkKLSAyOTUgMDRkOSAzNjhDNUMwNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVheCwxXCkKLSAyOTYgMDRkZSAzNjhDNUMwOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVjeCwxXCkKLSAyOTcgMDRlMyAzNjhDNUMwOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVjeCwxXCkKLSAyOTggMDRlOCAzNjhDNUMwQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVjeCwxXCkKLSAyOTkgMDRlZCAzNjhDNUMwQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVjeCwxXCkKLSAzMDAgMDRmMiA4QzVDMEMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVjeCwxXCkKLSAzMDEgMDRmNiA4QzVDMEQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVjeCwxXCkKLSAzMDIgMDRmYSAzNjhDNUMwRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVjeCwxXCkKLSAzMDMgMDRmZiAzNjhDNUMwRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVjeCwxXCkKLSAzMDQgMDUwNCAzNjhDNUMxMCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVkeCwxXCkKLSAzMDUgMDUwOSAzNjhDNUMxMSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVkeCwxXCkKLSAzMDYgMDUwZSAzNjhDNUMxMiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVkeCwxXCkKLSAzMDcgMDUxMyAzNjhDNUMxMyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVkeCwxXCkKLSAzMDggMDUxOCA4QzVDMTQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVkeCwxXCkKLSAzMDkgMDUxYyA4QzVDMTUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVkeCwxXCkKLSAzMTAgMDUyMCAzNjhDNUMxNiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVkeCwxXCkKLSAzMTEgMDUyNSAzNjhDNUMxNyAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVkeCwxXCkKLSAzMTIgMDUyYSAzNjhDNUMxOCAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsJWVieCwxXCkKLSAzMTMgMDUyZiAzNjhDNUMxOSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlY3gsJWVieCwxXCkKLSAzMTQgMDUzNCAzNjhDNUMxQSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZHgsJWVieCwxXCkKLSAzMTUgMDUzOSAzNjhDNUMxQiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsJWVieCwxXCkKLSAzMTYgMDUzZSA4QzVDMUMxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc3AsJWVieCwxXCkKLSAzMTcgMDU0MiA4QzVDMUQxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYnAsJWVieCwxXCkKLSAzMTggMDU0NiAzNjhDNUMxRSAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksJWVieCwxXCkKLSAzMTkgMDU0YiAzNjhDNUMxRiAxMiAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlZGksJWVieCwxXCkKLSAzMjAgMDU1MCAzNjhDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYXgsMVwpCi0gMzIxIDA1NTQgMzY4QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWN4LDFcKQotIDMyMiAwNTU4IDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwxXCkKLSAzMjMgMDU1YyAzNjhDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlYngsMVwpCi0gMzI0IDA1NjAgOEM1QzI0MTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZXNwLDFcKQotIDMyNSAwNTY0IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwxXCkKLSAzMjYgMDU2NyAzNjhDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCVlc2ksMVwpCi0gMzI3IDA1NmIgMzY4QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVzczoweDEyXCglZWRpLDFcKQotIDMyOCAwNTZmIDM2OEM1QzI4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDFcKQotIDMyOSAwNTc0IDM2OEM1QzI5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDFcKQotIDMzMCAwNTc5IDM2OEM1QzJBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDFcKQotIDMzMSAwNTdlIDM2OEM1QzJCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDFcKQotIDMzMiAwNTgzIDhDNUMyQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDFcKQotIDMzMyAwNTg3IDhDNUMyRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDFcKQotIDMzNCAwNThiIDM2OEM1QzJFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDFcKQotIDMzNSAwNTkwIDM2OEM1QzJGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDFcKQotIDMzNiAwNTk1IDM2OEM1QzMwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDFcKQotIDMzNyAwNTlhIDM2OEM1QzMxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDFcKQotIDMzOCAwNTlmIDM2OEM1QzMyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDFcKQotIDMzOSAwNWE0IDM2OEM1QzMzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDFcKQotIDM0MCAwNWE5IDhDNUMzNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDFcKQotIDM0MSAwNWFkIDhDNUMzNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDFcKQotIDM0MiAwNWIxIDM2OEM1QzM2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDFcKQotIDM0MyAwNWI2IDM2OEM1QzM3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDFcKQotIDM0NCAwNWJiIDM2OEM1QzM4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDFcKQotIDM0NSAwNWMwIDM2OEM1QzM5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDFcKQotIDM0NiAwNWM1IDM2OEM1QzNBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDFcKQotIDM0NyAwNWNhIDM2OEM1QzNCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDFcKQotIDM0OCAwNWNmIDhDNUMzQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDFcKQotIDM0OSAwNWQzIDhDNUMzRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDFcKQotIDM1MCAwNWQ3IDM2OEM1QzNFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDFcKQotIDM1MSAwNWRjIDM2OEM1QzNGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDFcKQotIDM1MiAwNWUxIDM2OEM1QzQwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDJcKQotIDM1MyAwNWU2IDM2OEM1QzQxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDJcKQotIDM1NCAwNWViIDM2OEM1QzQyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDJcKQotIDM1NSAwNWYwIDM2OEM1QzQzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDJcKQotIDM1NiAwNWY1IDhDNUM0NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDJcKQotIDM1NyAwNWY5IDhDNUM0NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDJcKQotIDM1OCAwNWZkIDM2OEM1QzQ2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDJcKQotIDM1OSAwNjAyIDM2OEM1QzQ3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDJcKQotIDM2MCAwNjA3IDM2OEM1QzQ4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDJcKQotIDM2MSAwNjBjIDM2OEM1QzQ5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDJcKQotIDM2MiAwNjExIDM2OEM1QzRBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDJcKQotIDM2MyAwNjE2IDM2OEM1QzRCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDJcKQotIDM2NCAwNjFiIDhDNUM0QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDJcKQotIDM2NSAwNjFmIDhDNUM0RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDJcKQotIDM2NiAwNjIzIDM2OEM1QzRFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDJcKQotIDM2NyAwNjI4IDM2OEM1QzRGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDJcKQotIDM2OCAwNjJkIDM2OEM1QzUwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDJcKQotIDM2OSAwNjMyIDM2OEM1QzUxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDJcKQotIDM3MCAwNjM3IDM2OEM1QzUyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDJcKQotIDM3MSAwNjNjIDM2OEM1QzUzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDJcKQotIDM3MiAwNjQxIDhDNUM1NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDJcKQotIDM3MyAwNjQ1IDhDNUM1NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDJcKQotIDM3NCAwNjQ5IDM2OEM1QzU2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDJcKQotIDM3NSAwNjRlIDM2OEM1QzU3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDJcKQotIDM3NiAwNjUzIDM2OEM1QzU4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDJcKQotIDM3NyAwNjU4IDM2OEM1QzU5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDJcKQotIDM3OCAwNjVkIDM2OEM1QzVBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDJcKQotIDM3OSAwNjYyIDM2OEM1QzVCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDJcKQotIDM4MCAwNjY3IDhDNUM1QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDJcKQotIDM4MSAwNjZiIDhDNUM1RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDJcKQotIDM4MiAwNjZmIDM2OEM1QzVFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDJcKQotIDM4MyAwNjc0IDM2OEM1QzVGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDJcKQotIDM4NCAwNjc5IDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDM4NSAwNjdkIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDM4NiAwNjgxIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwyXCkKLS4qV2FybmluZzouKgotIDM4NyAwNjg1IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDM4OCAwNjg5IDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDM4OSAwNjhkIDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwyXCkKLS4qV2FybmluZzouKgotIDM5MCAwNjkwIDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDM5MSAwNjk0IDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwyXCkKLS4qV2FybmluZzouKgotIDM5MiAwNjk4IDM2OEM1QzY4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDJcKQotIDM5MyAwNjlkIDM2OEM1QzY5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDJcKQotIDM5NCAwNmEyIDM2OEM1QzZBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDJcKQotIDM5NSAwNmE3IDM2OEM1QzZCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDJcKQotIDM5NiAwNmFjIDhDNUM2QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDJcKQotIDM5NyAwNmIwIDhDNUM2RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDJcKQotIDM5OCAwNmI0IDM2OEM1QzZFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDJcKQotIDM5OSAwNmI5IDM2OEM1QzZGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDJcKQotIDQwMCAwNmJlIDM2OEM1QzcwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDJcKQotIDQwMSAwNmMzIDM2OEM1QzcxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDJcKQotIDQwMiAwNmM4IDM2OEM1QzcyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDJcKQotIDQwMyAwNmNkIDM2OEM1QzczIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDJcKQotIDQwNCAwNmQyIDhDNUM3NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDJcKQotIDQwNSAwNmQ2IDhDNUM3NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDJcKQotIDQwNiAwNmRhIDM2OEM1Qzc2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDJcKQotIDQwNyAwNmRmIDM2OEM1Qzc3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDJcKQotIDQwOCAwNmU0IDM2OEM1Qzc4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDJcKQotIDQwOSAwNmU5IDM2OEM1Qzc5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDJcKQotIDQxMCAwNmVlIDM2OEM1QzdBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDJcKQotIDQxMSAwNmYzIDM2OEM1QzdCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDJcKQotIDQxMiAwNmY4IDhDNUM3QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDJcKQotIDQxMyAwNmZjIDhDNUM3RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDJcKQotIDQxNCAwNzAwIDM2OEM1QzdFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDJcKQotIDQxNSAwNzA1IDM2OEM1QzdGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDJcKQotIDQxNiAwNzBhIDM2OEM1QzgwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDRcKQotIDQxNyAwNzBmIDM2OEM1QzgxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDRcKQotIDQxOCAwNzE0IDM2OEM1QzgyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDRcKQotIDQxOSAwNzE5IDM2OEM1QzgzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDRcKQotIDQyMCAwNzFlIDhDNUM4NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDRcKQotIDQyMSAwNzIyIDhDNUM4NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDRcKQotIDQyMiAwNzI2IDM2OEM1Qzg2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDRcKQotIDQyMyAwNzJiIDM2OEM1Qzg3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDRcKQotIDQyNCAwNzMwIDM2OEM1Qzg4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDRcKQotIDQyNSAwNzM1IDM2OEM1Qzg5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDRcKQotIDQyNiAwNzNhIDM2OEM1QzhBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDRcKQotIDQyNyAwNzNmIDM2OEM1QzhCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDRcKQotIDQyOCAwNzQ0IDhDNUM4QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDRcKQotIDQyOSAwNzQ4IDhDNUM4RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDRcKQotIDQzMCAwNzRjIDM2OEM1QzhFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDRcKQotIDQzMSAwNzUxIDM2OEM1QzhGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDRcKQotIDQzMiAwNzU2IDM2OEM1QzkwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDRcKQotIDQzMyAwNzViIDM2OEM1QzkxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDRcKQotIDQzNCAwNzYwIDM2OEM1QzkyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDRcKQotIDQzNSAwNzY1IDM2OEM1QzkzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDRcKQotIDQzNiAwNzZhIDhDNUM5NDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDRcKQotIDQzNyAwNzZlIDhDNUM5NTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDRcKQotIDQzOCAwNzcyIDM2OEM1Qzk2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDRcKQotIDQzOSAwNzc3IDM2OEM1Qzk3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDRcKQotIDQ0MCAwNzdjIDM2OEM1Qzk4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDRcKQotIDQ0MSAwNzgxIDM2OEM1Qzk5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDRcKQotIDQ0MiAwNzg2IDM2OEM1QzlBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDRcKQotIDQ0MyAwNzhiIDM2OEM1QzlCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDRcKQotIDQ0NCAwNzkwIDhDNUM5QzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDRcKQotIDQ0NSAwNzk0IDhDNUM5RDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDRcKQotIDQ0NiAwNzk4IDM2OEM1QzlFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDRcKQotIDQ0NyAwNzlkIDM2OEM1QzlGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDRcKQotIDQ0OCAwN2EyIDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDQ0OSAwN2E2IDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDQ1MCAwN2FhIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDQ1MSAwN2FlIDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDQ1MiAwN2IyIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDQ1MyAwN2I2IDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDQ1NCAwN2I5IDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSw0XCkKLS4qV2FybmluZzouKgotIDQ1NSAwN2JkIDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSw0XCkKLS4qV2FybmluZzouKgotIDQ1NiAwN2MxIDM2OEM1Q0E4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDRcKQotIDQ1NyAwN2M2IDM2OEM1Q0E5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDRcKQotIDQ1OCAwN2NiIDM2OEM1Q0FBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDRcKQotIDQ1OSAwN2QwIDM2OEM1Q0FCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDRcKQotIDQ2MCAwN2Q1IDhDNUNBQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDRcKQotIDQ2MSAwN2Q5IDhDNUNBRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDRcKQotIDQ2MiAwN2RkIDM2OEM1Q0FFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDRcKQotIDQ2MyAwN2UyIDM2OEM1Q0FGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDRcKQotIDQ2NCAwN2U3IDM2OEM1Q0IwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDRcKQotIDQ2NSAwN2VjIDM2OEM1Q0IxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDRcKQotIDQ2NiAwN2YxIDM2OEM1Q0IyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDRcKQotIDQ2NyAwN2Y2IDM2OEM1Q0IzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDRcKQotIDQ2OCAwN2ZiIDhDNUNCNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDRcKQotIDQ2OSAwN2ZmIDhDNUNCNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDRcKQotIDQ3MCAwODAzIDM2OEM1Q0I2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDRcKQotIDQ3MSAwODA4IDM2OEM1Q0I3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDRcKQotIDQ3MiAwODBkIDM2OEM1Q0I4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDRcKQotIDQ3MyAwODEyIDM2OEM1Q0I5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDRcKQotIDQ3NCAwODE3IDM2OEM1Q0JBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDRcKQotIDQ3NSAwODFjIDM2OEM1Q0JCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDRcKQotIDQ3NiAwODIxIDhDNUNCQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDRcKQotIDQ3NyAwODI1IDhDNUNCRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDRcKQotIDQ3OCAwODI5IDM2OEM1Q0JFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDRcKQotIDQ3OSAwODJlIDM2OEM1Q0JGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDRcKQotIDQ4MCAwODMzIDM2OEM1Q0MwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWF4LDhcKQotIDQ4MSAwODM4IDM2OEM1Q0MxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWF4LDhcKQotIDQ4MiAwODNkIDM2OEM1Q0MyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWF4LDhcKQotIDQ4MyAwODQyIDM2OEM1Q0MzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWF4LDhcKQotIDQ4NCAwODQ3IDhDNUNDNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWF4LDhcKQotIDQ4NSAwODRiIDhDNUNDNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWF4LDhcKQotIDQ4NiAwODRmIDM2OEM1Q0M2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWF4LDhcKQotIDQ4NyAwODU0IDM2OEM1Q0M3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWF4LDhcKQotIDQ4OCAwODU5IDM2OEM1Q0M4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWN4LDhcKQotIDQ4OSAwODVlIDM2OEM1Q0M5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWN4LDhcKQotIDQ5MCAwODYzIDM2OEM1Q0NBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWN4LDhcKQotIDQ5MSAwODY4IDM2OEM1Q0NCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWN4LDhcKQotIDQ5MiAwODZkIDhDNUNDQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWN4LDhcKQotIDQ5MyAwODcxIDhDNUNDRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWN4LDhcKQotIDQ5NCAwODc1IDM2OEM1Q0NFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWN4LDhcKQotIDQ5NSAwODdhIDM2OEM1Q0NGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWN4LDhcKQotIDQ5NiAwODdmIDM2OEM1Q0QwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWR4LDhcKQotIDQ5NyAwODg0IDM2OEM1Q0QxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWR4LDhcKQotIDQ5OCAwODg5IDM2OEM1Q0QyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWR4LDhcKQotIDQ5OSAwODhlIDM2OEM1Q0QzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWR4LDhcKQotIDUwMCAwODkzIDhDNUNENDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWR4LDhcKQotIDUwMSAwODk3IDhDNUNENTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWR4LDhcKQotIDUwMiAwODliIDM2OEM1Q0Q2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWR4LDhcKQotIDUwMyAwOGEwIDM2OEM1Q0Q3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWR4LDhcKQotIDUwNCAwOGE1IDM2OEM1Q0Q4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJ4LDhcKQotIDUwNSAwOGFhIDM2OEM1Q0Q5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJ4LDhcKQotIDUwNiAwOGFmIDM2OEM1Q0RBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJ4LDhcKQotIDUwNyAwOGI0IDM2OEM1Q0RCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJ4LDhcKQotIDUwOCAwOGI5IDhDNUNEQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJ4LDhcKQotIDUwOSAwOGJkIDhDNUNERDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJ4LDhcKQotIDUxMCAwOGMxIDM2OEM1Q0RFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJ4LDhcKQotIDUxMSAwOGM2IDM2OEM1Q0RGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJ4LDhcKQotIDUxMiAwOGNiIDM2OEM1ODEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCw4XCkKLS4qV2FybmluZzouKgotIDUxMyAwOGNmIDM2OEM1OTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDUxNCAwOGQzIDM2OEM1QTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCw4XCkKLS4qV2FybmluZzouKgotIDUxNSAwOGQ3IDM2OEM1QjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCw4XCkKLS4qV2FybmluZzouKgotIDUxNiAwOGRiIDhDNUMyNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDUxNyAwOGRmIDhDNUQxMiAgICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCw4XCkKLS4qV2FybmluZzouKgotIDUxOCAwOGUyIDM2OEM1RTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDUxOSAwOGU2IDM2OEM1RjEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDUyMCAwOGVhIDM2OEM1Q0U4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWJwLDhcKQotIDUyMSAwOGVmIDM2OEM1Q0U5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWJwLDhcKQotIDUyMiAwOGY0IDM2OEM1Q0VBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWJwLDhcKQotIDUyMyAwOGY5IDM2OEM1Q0VCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWJwLDhcKQotIDUyNCAwOGZlIDhDNUNFQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWJwLDhcKQotIDUyNSAwOTAyIDhDNUNFRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWJwLDhcKQotIDUyNiAwOTA2IDM2OEM1Q0VFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWJwLDhcKQotIDUyNyAwOTBiIDM2OEM1Q0VGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWJwLDhcKQotIDUyOCAwOTEwIDM2OEM1Q0YwIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZXNpLDhcKQotIDUyOSAwOTE1IDM2OEM1Q0YxIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZXNpLDhcKQotIDUzMCAwOTFhIDM2OEM1Q0YyIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZXNpLDhcKQotIDUzMSAwOTFmIDM2OEM1Q0YzIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZXNpLDhcKQotIDUzMiAwOTI0IDhDNUNGNDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZXNpLDhcKQotIDUzMyAwOTI4IDhDNUNGNTEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZXNpLDhcKQotIDUzNCAwOTJjIDM2OEM1Q0Y2IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZXNpLDhcKQotIDUzNSAwOTMxIDM2OEM1Q0Y3IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZXNpLDhcKQotIDUzNiAwOTM2IDM2OEM1Q0Y4IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVheCwlZWRpLDhcKQotIDUzNyAwOTNiIDM2OEM1Q0ZBIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkeCwlZWRpLDhcKQotIDUzOCAwOTQwIDM2OEM1Q0Y5IDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVjeCwlZWRpLDhcKQotIDUzOSAwOTQ1IDM2OEM1Q0ZCIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVieCwlZWRpLDhcKQotIDU0MCAwOTRhIDhDNUNGQzEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzcCwlZWRpLDhcKQotIDU0MSAwOTRlIDhDNUNGRDEyICAgICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVicCwlZWRpLDhcKQotIDU0MiAwOTUyIDM2OEM1Q0ZFIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVzaSwlZWRpLDhcKQotIDU0MyAwOTU3IDM2OEM1Q0ZGIDEyICAgICAgIAkJbW92CSVkcywlc3M6MHgxMlwoJWVkaSwlZWRpLDhcKQotIDU0NCAwOTVjIDM2OEM5QzAwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDFcKQotIDU0NSAwOTY0IDM2OEM5QzAxIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDFcKQotIDU0NiAwOTZjIDM2OEM5QzAyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDFcKQotIDU0NyAwOTc0IDM2OEM5QzAzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDFcKQotIDU0OCAwOTdjIDhDOUMwNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDFcKQotIDU0OSAwOTgzIDhDOUMwNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDFcKQotIDU1MCAwOThhIDM2OEM5QzA2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDFcKQotIDU1MSAwOTkyIDM2OEM5QzA3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDFcKQotIDU1MiAwOTlhIDM2OEM5QzA4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDFcKQotIDU1MyAwOWEyIDM2OEM5QzA5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDFcKQotIDU1NCAwOWFhIDM2OEM5QzBBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDFcKQotIDU1NSAwOWIyIDM2OEM5QzBCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDFcKQotIDU1NiAwOWJhIDhDOUMwQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDFcKQotIDU1NyAwOWMxIDhDOUMwRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDFcKQotIDU1OCAwOWM4IDM2OEM5QzBFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDFcKQotIDU1OSAwOWQwIDM2OEM5QzBGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDFcKQotIDU2MCAwOWQ4IDM2OEM5QzEwIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDFcKQotIDU2MSAwOWUwIDM2OEM5QzExIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDFcKQotIDU2MiAwOWU4IDM2OEM5QzEyIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDFcKQotIDU2MyAwOWYwIDM2OEM5QzEzIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDFcKQotIDU2NCAwOWY4IDhDOUMxNDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDFcKQotIDU2NSAwOWZmIDhDOUMxNTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDFcKQotIDU2NiAwYTA2IDM2OEM5QzE2IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDFcKQotIDU2NyAwYTBlIDM2OEM5QzE3IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDFcKQotIDU2OCAwYTE2IDM2OEM5QzE4IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDFcKQotIDU2OSAwYTFlIDM2OEM5QzE5IDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDFcKQotIDU3MCAwYTI2IDM2OEM5QzFBIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDFcKQotIDU3MSAwYTJlIDM2OEM5QzFCIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDFcKQotIDU3MiAwYTM2IDhDOUMxQzc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDFcKQotIDU3MyAwYTNkIDhDOUMxRDc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDFcKQotIDU3NCAwYTQ0IDM2OEM5QzFFIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDFcKQotIDU3NSAwYTRjIDM2OEM5QzFGIDc4NTYzNDEyIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDFcKQotIDU3NiAwYTU0IDM2OEM5ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVheCwxXCkKLSA1NzcgMGE1YiAzNjhDOTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlY3gsMVwpCi0gNTc4IDBhNjIgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDFcKQotIDU3OSAwYTY5IDM2OEM5Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVieCwxXCkKLSA1ODAgMGE3MCA4QzlDMjQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlc3AsMVwpCi0gNTgxIDBhNzcgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDFcKQotIDU4MiAwYTdkIDM2OEM5RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlc3M6MHgxMjM0NTY3OFwoJWVzaSwxXCkKLSA1ODMgMGE4NCAzNjhDOUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJXNzOjB4MTIzNDU2NzhcKCVlZGksMVwpCi0gNTg0IDBhOGIgMzY4QzlDMjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMVwpCi0gNTg1IDBhOTMgMzY4QzlDMjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMVwpCi0gNTg2IDBhOWIgMzY4QzlDMkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMVwpCi0gNTg3IDBhYTMgMzY4QzlDMkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMVwpCi0gNTg4IDBhYWIgOEM5QzJDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMVwpCi0gNTg5IDBhYjIgOEM5QzJENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMVwpCi0gNTkwIDBhYjkgMzY4QzlDMkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMVwpCi0gNTkxIDBhYzEgMzY4QzlDMkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMVwpCi0gNTkyIDBhYzkgMzY4QzlDMzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMVwpCi0gNTkzIDBhZDEgMzY4QzlDMzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMVwpCi0gNTk0IDBhZDkgMzY4QzlDMzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMVwpCi0gNTk1IDBhZTEgMzY4QzlDMzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMVwpCi0gNTk2IDBhZTkgOEM5QzM0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMVwpCi0gNTk3IDBhZjAgOEM5QzM1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMVwpCi0gNTk4IDBhZjcgMzY4QzlDMzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMVwpCi0gNTk5IDBhZmYgMzY4QzlDMzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMVwpCi0gNjAwIDBiMDcgMzY4QzlDMzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMVwpCi0gNjAxIDBiMGYgMzY4QzlDMzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMVwpCi0gNjAyIDBiMTcgMzY4QzlDM0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMVwpCi0gNjAzIDBiMWYgMzY4QzlDM0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMVwpCi0gNjA0IDBiMjcgOEM5QzNDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMVwpCi0gNjA1IDBiMmUgOEM5QzNENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMVwpCi0gNjA2IDBiMzUgMzY4QzlDM0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMVwpCi0gNjA3IDBiM2QgMzY4QzlDM0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMVwpCi0gNjA4IDBiNDUgMzY4QzlDNDAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsMlwpCi0gNjA5IDBiNGQgMzY4QzlDNDEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMlwpCi0gNjEwIDBiNTUgMzY4QzlDNDIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsMlwpCi0gNjExIDBiNWQgMzY4QzlDNDMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsMlwpCi0gNjEyIDBiNjUgOEM5QzQ0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMlwpCi0gNjEzIDBiNmMgOEM5QzQ1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsMlwpCi0gNjE0IDBiNzMgMzY4QzlDNDYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsMlwpCi0gNjE1IDBiN2IgMzY4QzlDNDcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMlwpCi0gNjE2IDBiODMgMzY4QzlDNDggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsMlwpCi0gNjE3IDBiOGIgMzY4QzlDNDkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsMlwpCi0gNjE4IDBiOTMgMzY4QzlDNEEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMlwpCi0gNjE5IDBiOWIgMzY4QzlDNEIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsMlwpCi0gNjIwIDBiYTMgOEM5QzRDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsMlwpCi0gNjIxIDBiYWEgOEM5QzRENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMlwpCi0gNjIyIDBiYjEgMzY4QzlDNEUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsMlwpCi0gNjIzIDBiYjkgMzY4QzlDNEYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsMlwpCi0gNjI0IDBiYzEgMzY4QzlDNTAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMlwpCi0gNjI1IDBiYzkgMzY4QzlDNTEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsMlwpCi0gNjI2IDBiZDEgMzY4QzlDNTIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsMlwpCi0gNjI3IDBiZDkgMzY4QzlDNTMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMlwpCi0gNjI4IDBiZTEgOEM5QzU0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsMlwpCi0gNjI5IDBiZTggOEM5QzU1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsMlwpCi0gNjMwIDBiZWYgMzY4QzlDNTYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMlwpCi0gNjMxIDBiZjcgMzY4QzlDNTcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsMlwpCi0gNjMyIDBiZmYgMzY4QzlDNTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsMlwpCi0gNjMzIDBjMDcgMzY4QzlDNTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMlwpCi0gNjM0IDBjMGYgMzY4QzlDNUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsMlwpCi0gNjM1IDBjMTcgMzY4QzlDNUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsMlwpCi0gNjM2IDBjMWYgOEM5QzVDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMlwpCi0gNjM3IDBjMjYgOEM5QzVENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsMlwpCi0gNjM4IDBjMmQgMzY4QzlDNUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsMlwpCi0gNjM5IDBjMzUgMzY4QzlDNUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMlwpCi0gNjQwIDBjM2QgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQxIDBjNDQgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQyIDBjNGIgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQzIDBjNTIgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDJcKQotLipXYXJuaW5nOi4qCi0gNjQ0IDBjNTkgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ1IDBjNjAgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ2IDBjNjYgMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ3IDBjNmQgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gNjQ4IDBjNzQgMzY4QzlDNjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMlwpCi0gNjQ5IDBjN2MgMzY4QzlDNjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMlwpCi0gNjUwIDBjODQgMzY4QzlDNkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsMlwpCi0gNjUxIDBjOGMgMzY4QzlDNkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMlwpCi0gNjUyIDBjOTQgOEM5QzZDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMlwpCi0gNjUzIDBjOWIgOEM5QzZENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsMlwpCi0gNjU0IDBjYTIgMzY4QzlDNkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMlwpCi0gNjU1IDBjYWEgMzY4QzlDNkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMlwpCi0gNjU2IDBjYjIgMzY4QzlDNzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksMlwpCi0gNjU3IDBjYmEgMzY4QzlDNzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMlwpCi0gNjU4IDBjYzIgMzY4QzlDNzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMlwpCi0gNjU5IDBjY2EgMzY4QzlDNzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksMlwpCi0gNjYwIDBjZDIgOEM5Qzc0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMlwpCi0gNjYxIDBjZDkgOEM5Qzc1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMlwpCi0gNjYyIDBjZTAgMzY4QzlDNzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksMlwpCi0gNjYzIDBjZTggMzY4QzlDNzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMlwpCi0gNjY0IDBjZjAgMzY4QzlDNzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMlwpCi0gNjY1IDBjZjggMzY4QzlDNzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksMlwpCi0gNjY2IDBkMDAgMzY4QzlDN0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMlwpCi0gNjY3IDBkMDggMzY4QzlDN0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMlwpCi0gNjY4IDBkMTAgOEM5QzdDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksMlwpCi0gNjY5IDBkMTcgOEM5QzdENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMlwpCi0gNjcwIDBkMWUgMzY4QzlDN0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMlwpCi0gNjcxIDBkMjYgMzY4QzlDN0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksMlwpCi0gNjcyIDBkMmUgMzY4QzlDODAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsNFwpCi0gNjczIDBkMzYgMzY4QzlDODEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsNFwpCi0gNjc0IDBkM2UgMzY4QzlDODIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsNFwpCi0gNjc1IDBkNDYgMzY4QzlDODMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsNFwpCi0gNjc2IDBkNGUgOEM5Qzg0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsNFwpCi0gNjc3IDBkNTUgOEM5Qzg1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsNFwpCi0gNjc4IDBkNWMgMzY4QzlDODYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsNFwpCi0gNjc5IDBkNjQgMzY4QzlDODcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsNFwpCi0gNjgwIDBkNmMgMzY4QzlDODggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsNFwpCi0gNjgxIDBkNzQgMzY4QzlDODkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsNFwpCi0gNjgyIDBkN2MgMzY4QzlDOEEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsNFwpCi0gNjgzIDBkODQgMzY4QzlDOEIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsNFwpCi0gNjg0IDBkOGMgOEM5QzhDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsNFwpCi0gNjg1IDBkOTMgOEM5QzhENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsNFwpCi0gNjg2IDBkOWEgMzY4QzlDOEUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsNFwpCi0gNjg3IDBkYTIgMzY4QzlDOEYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsNFwpCi0gNjg4IDBkYWEgMzY4QzlDOTAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsNFwpCi0gNjg5IDBkYjIgMzY4QzlDOTEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsNFwpCi0gNjkwIDBkYmEgMzY4QzlDOTIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsNFwpCi0gNjkxIDBkYzIgMzY4QzlDOTMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsNFwpCi0gNjkyIDBkY2EgOEM5Qzk0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsNFwpCi0gNjkzIDBkZDEgOEM5Qzk1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsNFwpCi0gNjk0IDBkZDggMzY4QzlDOTYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsNFwpCi0gNjk1IDBkZTAgMzY4QzlDOTcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsNFwpCi0gNjk2IDBkZTggMzY4QzlDOTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsNFwpCi0gNjk3IDBkZjAgMzY4QzlDOTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsNFwpCi0gNjk4IDBkZjggMzY4QzlDOUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsNFwpCi0gNjk5IDBlMDAgMzY4QzlDOUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsNFwpCi0gNzAwIDBlMDggOEM5QzlDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsNFwpCi0gNzAxIDBlMGYgOEM5QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsNFwpCi0gNzAyIDBlMTYgMzY4QzlDOUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsNFwpCi0gNzAzIDBlMWUgMzY4QzlDOUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsNFwpCi0gNzA0IDBlMjYgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA1IDBlMmQgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA2IDBlMzQgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA3IDBlM2IgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDRcKQotLipXYXJuaW5nOi4qCi0gNzA4IDBlNDIgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gNzA5IDBlNDkgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDRcKQotLipXYXJuaW5nOi4qCi0gNzEwIDBlNGYgMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gNzExIDBlNTYgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gNzEyIDBlNWQgMzY4QzlDQTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsNFwpCi0gNzEzIDBlNjUgMzY4QzlDQTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsNFwpCi0gNzE0IDBlNmQgMzY4QzlDQUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsNFwpCi0gNzE1IDBlNzUgMzY4QzlDQUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsNFwpCi0gNzE2IDBlN2QgOEM5Q0FDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsNFwpCi0gNzE3IDBlODQgOEM5Q0FENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsNFwpCi0gNzE4IDBlOGIgMzY4QzlDQUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsNFwpCi0gNzE5IDBlOTMgMzY4QzlDQUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsNFwpCi0gNzIwIDBlOWIgMzY4QzlDQjAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksNFwpCi0gNzIxIDBlYTMgMzY4QzlDQjEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksNFwpCi0gNzIyIDBlYWIgMzY4QzlDQjIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksNFwpCi0gNzIzIDBlYjMgMzY4QzlDQjMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksNFwpCi0gNzI0IDBlYmIgOEM5Q0I0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksNFwpCi0gNzI1IDBlYzIgOEM5Q0I1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksNFwpCi0gNzI2IDBlYzkgMzY4QzlDQjYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksNFwpCi0gNzI3IDBlZDEgMzY4QzlDQjcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksNFwpCi0gNzI4IDBlZDkgMzY4QzlDQjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksNFwpCi0gNzI5IDBlZTEgMzY4QzlDQjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksNFwpCi0gNzMwIDBlZTkgMzY4QzlDQkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksNFwpCi0gNzMxIDBlZjEgMzY4QzlDQkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksNFwpCi0gNzMyIDBlZjkgOEM5Q0JDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksNFwpCi0gNzMzIDBmMDAgOEM5Q0JENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksNFwpCi0gNzM0IDBmMDcgMzY4QzlDQkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksNFwpCi0gNzM1IDBmMGYgMzY4QzlDQkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksNFwpCi0gNzM2IDBmMTcgMzY4QzlDQzAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsOFwpCi0gNzM3IDBmMWYgMzY4QzlDQzEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsOFwpCi0gNzM4IDBmMjcgMzY4QzlDQzIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsOFwpCi0gNzM5IDBmMmYgMzY4QzlDQzMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsOFwpCi0gNzQwIDBmMzcgOEM5Q0M0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsOFwpCi0gNzQxIDBmM2UgOEM5Q0M1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsOFwpCi0gNzQyIDBmNDUgMzY4QzlDQzYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsOFwpCi0gNzQzIDBmNGQgMzY4QzlDQzcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsOFwpCi0gNzQ0IDBmNTUgMzY4QzlDQzggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsOFwpCi0gNzQ1IDBmNWQgMzY4QzlDQzkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsOFwpCi0gNzQ2IDBmNjUgMzY4QzlDQ0EgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsOFwpCi0gNzQ3IDBmNmQgMzY4QzlDQ0IgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsOFwpCi0gNzQ4IDBmNzUgOEM5Q0NDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsOFwpCi0gNzQ5IDBmN2MgOEM5Q0NENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsOFwpCi0gNzUwIDBmODMgMzY4QzlDQ0UgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsOFwpCi0gNzUxIDBmOGIgMzY4QzlDQ0YgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsOFwpCi0gNzUyIDBmOTMgMzY4QzlDRDAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsOFwpCi0gNzUzIDBmOWIgMzY4QzlDRDEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsOFwpCi0gNzU0IDBmYTMgMzY4QzlDRDIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsOFwpCi0gNzU1IDBmYWIgMzY4QzlDRDMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsOFwpCi0gNzU2IDBmYjMgOEM5Q0Q0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsOFwpCi0gNzU3IDBmYmEgOEM5Q0Q1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsOFwpCi0gNzU4IDBmYzEgMzY4QzlDRDYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsOFwpCi0gNzU5IDBmYzkgMzY4QzlDRDcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsOFwpCi0gNzYwIDBmZDEgMzY4QzlDRDggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYngsOFwpCi0gNzYxIDBmZDkgMzY4QzlDRDkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYngsOFwpCi0gNzYyIDBmZTEgMzY4QzlDREEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYngsOFwpCi0gNzYzIDBmZTkgMzY4QzlDREIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsOFwpCi0gNzY0IDBmZjEgOEM5Q0RDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYngsOFwpCi0gNzY1IDBmZjggOEM5Q0RENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYngsOFwpCi0gNzY2IDBmZmYgMzY4QzlDREUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYngsOFwpCi0gNzY3IDEwMDcgMzY4QzlDREYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYngsOFwpCi0gNzY4IDEwMGYgMzY4Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gNzY5IDEwMTYgMzY4Qzk5NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcwIDEwMWQgMzY4QzlBNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcxIDEwMjQgMzY4QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gNzcyIDEwMmIgOEM5QzI0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLDhcKQotLipXYXJuaW5nOi4qCi0gNzczIDEwMzIgOEM5RDc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLDhcKQotLipXYXJuaW5nOi4qCi0gNzc0IDEwMzggMzY4QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gNzc1IDEwM2YgMzY4QzlGNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLDhcKQotLipXYXJuaW5nOi4qCi0gNzc2IDEwNDYgMzY4QzlDRTggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsOFwpCi0gNzc3IDEwNGUgMzY4QzlDRTkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsOFwpCi0gNzc4IDEwNTYgMzY4QzlDRUEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsOFwpCi0gNzc5IDEwNWUgMzY4QzlDRUIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsOFwpCi0gNzgwIDEwNjYgOEM5Q0VDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsOFwpCi0gNzgxIDEwNmQgOEM5Q0VENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsOFwpCi0gNzgyIDEwNzQgMzY4QzlDRUUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsOFwpCi0gNzgzIDEwN2MgMzY4QzlDRUYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsOFwpCi0gNzg0IDEwODQgMzY4QzlDRjAgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksOFwpCi0gNzg1IDEwOGMgMzY4QzlDRjEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksOFwpCi0gNzg2IDEwOTQgMzY4QzlDRjIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksOFwpCi0gNzg3IDEwOWMgMzY4QzlDRjMgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksOFwpCi0gNzg4IDEwYTQgOEM5Q0Y0NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksOFwpCi0gNzg5IDEwYWIgOEM5Q0Y1NzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksOFwpCi0gNzkwIDEwYjIgMzY4QzlDRjYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksOFwpCi0gNzkxIDEwYmEgMzY4QzlDRjcgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksOFwpCi0gNzkyIDEwYzIgMzY4QzlDRjggNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWF4LCVlZGksOFwpCi0gNzkzIDEwY2EgMzY4QzlDRkEgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWR4LCVlZGksOFwpCi0gNzk0IDEwZDIgMzY4QzlDRjkgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWN4LCVlZGksOFwpCi0gNzk1IDEwZGEgMzY4QzlDRkIgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksOFwpCi0gNzk2IDEwZTIgOEM5Q0ZDNzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNwLCVlZGksOFwpCi0gNzk3IDEwZTkgOEM5Q0ZENzggNTYzNDEyICAgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWJwLCVlZGksOFwpCi0gNzk4IDEwZjAgMzY4QzlDRkUgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZXNpLCVlZGksOFwpCi0gNzk5IDEwZjggMzY4QzlDRkYgNzg1NjM0MTIgCQltb3YJJWRzLCVzczoweDEyMzQ1Njc4XCglZWRpLCVlZGksOFwpCi0gODAwIDExMDAgOEM1QzA1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCwxXCkKLSA4MDEgMTEwNCA4QzVDMEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDFcKQotIDgwMiAxMTA4IDhDNUMxNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsMVwpCi0gODAzIDExMGMgOEM1QzFEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCwxXCkKLSA4MDQgMTExMCA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwxXCkKLSA4MDUgMTExMyA4QzVDMkQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDFcKQotIDgwNiAxMTE3IDhDNUMzNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksMVwpCi0gODA3IDExMWIgOEM1QzNEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSwxXCkKLSA4MDggMTExZiA4QzVDNDUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWF4LDJcKQotIDgwOSAxMTIzIDhDNUM0RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlY3gsMlwpCi0gODEwIDExMjcgOEM1QzU1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkeCwyXCkKLSA4MTEgMTEyYiA4QzVDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJ4LDJcKQotIDgxMiAxMTJmIDhDNUQwMCAgICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gODEzIDExMzIgOEM1QzZEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVicCwyXCkKLSA4MTQgMTEzNiA4QzVDNzUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZXNpLDJcKQotIDgxNSAxMTNhIDhDNUM3RDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZGksMlwpCi0gODE2IDExM2UgOEM1Qzg1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVheCw0XCkKLSA4MTcgMTE0MiA4QzVDOEQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWN4LDRcKQotIDgxOCAxMTQ2IDhDNUM5NTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlZHgsNFwpCi0gODE5IDExNGEgOEM1QzlEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVieCw0XCkKLSA4MjAgMTE0ZSA4QzVEMDAgICAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDgyMSAxMTUxIDhDNUNBRDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYnAsNFwpCi0gODIyIDExNTUgOEM1Q0I1MDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVzaSw0XCkKLSA4MjMgMTE1OSA4QzVDQkQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWRpLDRcKQotIDgyNCAxMTVkIDhDNUNDNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYXgsOFwpCi0gODI1IDExNjEgOEM1Q0NEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVjeCw4XCkKLSA4MjYgMTE2NSA4QzVDRDUwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWR4LDhcKQotIDgyNyAxMTY5IDhDNUNERDAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlYngsOFwpCi0gODI4IDExNmQgOEM1RDAwICAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSA4MjkgMTE3MCA4QzVDRUQwMCAgICAgICAgICAJCW1vdgklZHMsJXNzOlwoJWVicCwlZWJwLDhcKQotIDgzMCAxMTc0IDhDNUNGNTAwICAgICAgICAgIAkJbW92CSVkcywlc3M6XCglZWJwLCVlc2ksOFwpCi0gODMxIDExNzggOEM1Q0ZEMDAgICAgICAgICAgCQltb3YJJWRzLCVzczpcKCVlYnAsJWVkaSw4XCkKLSA4MzIgMTE3YyAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCwxXCkKLSA4MzMgMTE4MyAzNjhDMUQxMiAwMDAwMDAgICAJCW1vdgklZHMsJXNzOjB4MTJcKCwyXCkKLS4qV2FybmluZzouKgotIDgzNCAxMThhIDM2OEMxRDEyIDAwMDAwMCAgIAkJbW92CSVkcywlc3M6MHgxMlwoLDRcKQotLipXYXJuaW5nOi4qCi0gODM1IDExOTEgMzY4QzFEMTIgMDAwMDAwICAgCQltb3YJJWRzLCVzczoweDEyXCgsOFwpCi0uKldhcm5pbmc6LioKLSA4MzYgMTE5OCA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheFwpCi0gODM3IDExOWEgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3hcKQotIDgzOCAxMTljIDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4XCkKLSA4MzkgMTE5ZSA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieFwpCi0gODQwIDExYTAgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczowCi0gODQxIDExYTYgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2lcKQotIDg0MiAxMWE4IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpXCkKLSA4NDMgMTFhYSA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXhcKQotIDg0NCAxMWFkIDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeFwpCi0gODQ1IDExYjAgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4XCkKLSA4NDYgMTFiMyA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnhcKQotIDg0NyAxMWI2IDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicFwpCi0gODQ4IDExYmEgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpXCkKLSA4NDkgMTFiZCA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGlcKQotIDg1MCAxMWMwIDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheFwpCi0gODUxIDExYzYgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4XCkKLSA4NTIgMTFjYyA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHhcKQotIDg1MyAxMWQyIDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieFwpCi0gODU0IDExZDggM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwXCkKLSA4NTUgMTFkZiA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2lcKQotIDg1NiAxMWU1IDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaVwpCi0gODU3IDExZWIgOENEOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYXgKLSA4NTggMTFlZCA4Q0Q5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWVjeAotIDg1OSAxMWVmIDhDREEgICAgICAgICAgICAgIAkJbW92CSVkcywlZWR4Ci0gODYwIDExZjEgOENEQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVlYngKLSA4NjEgMTFmMyA4Q0RDICAgICAgICAgICAgICAJCW1vdgklZHMsJWVzcAotIDg2MiAxMWY1IDhDREQgICAgICAgICAgICAgIAkJbW92CSVkcywlZWJwCi0gODYzIDExZjcgOENERSAgICAgICAgICAgICAgCQltb3YJJWRzLCVlc2kKLSA4NjQgMTFmOSA4Q0RGICAgICAgICAgICAgICAJCW1vdgklZHMsJWVkaQotIDg2NSAxMWZiIDhDMUMwMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsMVwpCi0gODY2IDExZmUgOEMxQzAxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVheCwxXCkKLSA4NjcgMTIwMSA4QzFDMDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWF4LDFcKQotIDg2OCAxMjA0IDhDMUMwMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsMVwpCi0gODY5IDEyMDcgM0U4QzFDMDQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVheCwxXCkKLSA4NzAgMTIwYiA4QzFDMDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYXgsMVwpCi0gODcxIDEyMTIgOEMxQzA2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCwxXCkKLSA4NzIgMTIxNSA4QzFDMDcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDFcKQotIDg3MyAxMjE4IDhDMUMwOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlY3gsMVwpCi0gODc0IDEyMWIgOEMxQzA5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCwxXCkKLSA4NzUgMTIxZSA4QzFDMEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDFcKQotIDg3NiAxMjIxIDhDMUMwQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlY3gsMVwpCi0gODc3IDEyMjQgM0U4QzFDMEMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCwxXCkKLSA4NzggMTIyOCA4QzFDMEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsMVwpCi0gODc5IDEyMmYgOEMxQzBFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVjeCwxXCkKLSA4ODAgMTIzMiA4QzFDMEYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDFcKQotIDg4MSAxMjM1IDhDMUMxMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsMVwpCi0gODgyIDEyMzggOEMxQzExICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkeCwxXCkKLSA4ODMgMTIzYiA4QzFDMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDFcKQotIDg4NCAxMjNlIDhDMUMxMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsMVwpCi0gODg1IDEyNDEgM0U4QzFDMTQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkeCwxXCkKLSA4ODYgMTI0NSA4QzFDMTUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsMVwpCi0gODg3IDEyNGMgOEMxQzE2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCwxXCkKLSA4ODggMTI0ZiA4QzFDMTcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWR4LDFcKQotIDg4OSAxMjUyIDhDMUMxOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsMVwpCi0gODkwIDEyNTUgOEMxQzE5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCwxXCkKLSA4OTEgMTI1OCA4QzFDMUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJ4LDFcKQotIDg5MiAxMjViIDhDMUMxQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsMVwpCi0gODkzIDEyNWUgM0U4QzFDMUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCwxXCkKLSA4OTQgMTI2MiA4QzFDMUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYngsMVwpCi0gODk1IDEyNjkgOEMxQzFFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCwxXCkKLSA4OTYgMTI2YyA4QzFDMUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDFcKQotIDg5NyAxMjZmIDhDMTggICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LDFcKQotIDg5OCAxMjcxIDhDMTkgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LDFcKQotIDg5OSAxMjczIDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDFcKQotIDkwMCAxMjc1IDhDMUIgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LDFcKQotIDkwMSAxMjc3IDNFOEMxQzI0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLDFcKQotIDkwMiAxMjdiIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsMVwpCi0gOTAzIDEyODEgOEMxRSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksMVwpCi0gOTA0IDEyODMgOEMxRiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksMVwpCi0gOTA1IDEyODUgOEMxQzI4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCwxXCkKLSA5MDYgMTI4OCA4QzFDMjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDFcKQotIDkwNyAxMjhiIDhDMUMyQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsMVwpCi0gOTA4IDEyOGUgOEMxQzJCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCwxXCkKLSA5MDkgMTI5MSAzRThDMUMyQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDFcKQotIDkxMCAxMjk1IDhDMUMyRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCwxXCkKLSA5MTEgMTI5YyA4QzFDMkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDFcKQotIDkxMiAxMjlmIDhDMUMyRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsMVwpCi0gOTEzIDEyYTIgOEMxQzMwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSwxXCkKLSA5MTQgMTJhNSA4QzFDMzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDFcKQotIDkxNSAxMmE4IDhDMUMzMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksMVwpCi0gOTE2IDEyYWIgOEMxQzMzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSwxXCkKLSA5MTcgMTJhZSAzRThDMUMzNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDFcKQotIDkxOCAxMmIyIDhDMUMzNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSwxXCkKLSA5MTkgMTJiOSA4QzFDMzYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDFcKQotIDkyMCAxMmJjIDhDMUMzNyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksMVwpCi0gOTIxIDEyYmYgOEMxQzM4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSwxXCkKLSA5MjIgMTJjMiA4QzFDMzkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDFcKQotIDkyMyAxMmM1IDhDMUMzQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksMVwpCi0gOTI0IDEyYzggOEMxQzNCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSwxXCkKLSA5MjUgMTJjYiAzRThDMUMzQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDFcKQotIDkyNiAxMmNmIDhDMUMzRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSwxXCkKLSA5MjcgMTJkNiA4QzFDM0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDFcKQotIDkyOCAxMmQ5IDhDMUMzRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksMVwpCi0gOTI5IDEyZGMgOEMxQzQwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVheCwyXCkKLSA5MzAgMTJkZiA4QzFDNDEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDJcKQotIDkzMSAxMmUyIDhDMUM0MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsMlwpCi0gOTMyIDEyZTUgOEMxQzQzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVheCwyXCkKLSA5MzMgMTJlOCAzRThDMUM0NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDJcKQotIDkzNCAxMmVjIDhDMUM0NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCwyXCkKLSA5MzUgMTJmMyA4QzFDNDYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWF4LDJcKQotIDkzNiAxMmY2IDhDMUM0NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYXgsMlwpCi0gOTM3IDEyZjkgOEMxQzQ4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCwyXCkKLSA5MzggMTJmYyA4QzFDNDkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWN4LDJcKQotIDkzOSAxMmZmIDhDMUM0QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlY3gsMlwpCi0gOTQwIDEzMDIgOEMxQzRCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCwyXCkKLSA5NDEgMTMwNSAzRThDMUM0QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWN4LDJcKQotIDk0MiAxMzA5IDhDMUM0RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVjeCwyXCkKLSA5NDMgMTMxMCA4QzFDNEUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDJcKQotIDk0NCAxMzEzIDhDMUM0RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlY3gsMlwpCi0gOTQ1IDEzMTYgOEMxQzUwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkeCwyXCkKLSA5NDYgMTMxOSA4QzFDNTEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDJcKQotIDk0NyAxMzFjIDhDMUM1MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZHgsMlwpCi0gOTQ4IDEzMWYgOEMxQzUzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkeCwyXCkKLSA5NDkgMTMyMiAzRThDMUM1NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDJcKQotIDk1MCAxMzI2IDhDMUM1NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkeCwyXCkKLSA5NTEgMTMyZCA4QzFDNTYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWR4LDJcKQotIDk1MiAxMzMwIDhDMUM1NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsMlwpCi0gOTUzIDEzMzMgOEMxQzU4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVieCwyXCkKLSA5NTQgMTMzNiA4QzFDNTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJ4LDJcKQotIDk1NSAxMzM5IDhDMUM1QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsMlwpCi0gOTU2IDEzM2MgOEMxQzVCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVieCwyXCkKLSA5NTcgMTMzZiAzRThDMUM1QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJ4LDJcKQotIDk1OCAxMzQzIDhDMUM1RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCwyXCkKLSA5NTkgMTM0YSA4QzFDNUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJ4LDJcKQotIDk2MCAxMzRkIDhDMUM1RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYngsMlwpCi0gOTYxIDEzNTAgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsMlwpCi0uKldhcm5pbmc6LioKLSA5NjIgMTM1MiA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwyXCkKLS4qV2FybmluZzouKgotIDk2MyAxMzU0IDhDMUEgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gOTY0IDEzNTYgOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsMlwpCi0uKldhcm5pbmc6LioKLSA5NjUgMTM1OCAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwyXCkKLS4qV2FybmluZzouKgotIDk2NiAxMzVjIDhDMUQwMDAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6XCgsMlwpCi0uKldhcm5pbmc6LioKLSA5NjcgMTM2MiA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDk2OCAxMzY0IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDJcKQotLipXYXJuaW5nOi4qCi0gOTY5IDEzNjYgOEMxQzY4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVicCwyXCkKLSA5NzAgMTM2OSA4QzFDNjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDJcKQotIDk3MSAxMzZjIDhDMUM2QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsMlwpCi0gOTcyIDEzNmYgOEMxQzZCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVicCwyXCkKLSA5NzMgMTM3MiAzRThDMUM2QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDJcKQotIDk3NCAxMzc2IDhDMUM2RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCwyXCkKLSA5NzUgMTM3ZCA4QzFDNkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJwLDJcKQotIDk3NiAxMzgwIDhDMUM2RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsMlwpCi0gOTc3IDEzODMgOEMxQzcwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSwyXCkKLSA5NzggMTM4NiA4QzFDNzEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZXNpLDJcKQotIDk3OSAxMzg5IDhDMUM3MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksMlwpCi0gOTgwIDEzOGMgOEMxQzczICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSwyXCkKLSA5ODEgMTM4ZiAzRThDMUM3NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZXNpLDJcKQotIDk4MiAxMzkzIDhDMUM3NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSwyXCkKLSA5ODMgMTM5YSA4QzFDNzYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDJcKQotIDk4NCAxMzlkIDhDMUM3NyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlc2ksMlwpCi0gOTg1IDEzYTAgOEMxQzc4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSwyXCkKLSA5ODYgMTNhMyA4QzFDNzkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDJcKQotIDk4NyAxM2E2IDhDMUM3QSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZGksMlwpCi0gOTg4IDEzYTkgOEMxQzdCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSwyXCkKLSA5ODkgMTNhYyAzRThDMUM3QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDJcKQotIDk5MCAxM2IwIDhDMUM3RDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkaSwyXCkKLSA5OTEgMTNiNyA4QzFDN0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDJcKQotIDk5MiAxM2JhIDhDMUM3RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksMlwpCi0gOTkzIDEzYmQgOEMxQzgwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVheCw0XCkKLSA5OTQgMTNjMCA4QzFDODEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWF4LDRcKQotIDk5NSAxM2MzIDhDMUM4MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsNFwpCi0gOTk2IDEzYzYgOEMxQzgzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVheCw0XCkKLSA5OTcgMTNjOSAzRThDMUM4NCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWF4LDRcKQotIDk5OCAxM2NkIDhDMUM4NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCw0XCkKLSA5OTkgMTNkNCA4QzFDODYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWF4LDRcKQotIDEwMDAgMTNkNyA4QzFDODcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWF4LDRcKQotIDEwMDEgMTNkYSA4QzFDODggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWN4LDRcKQotIDEwMDIgMTNkZCA4QzFDODkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWN4LDRcKQotIDEwMDMgMTNlMCA4QzFDOEEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWN4LDRcKQotIDEwMDQgMTNlMyA4QzFDOEIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWN4LDRcKQotIDEwMDUgMTNlNiAzRThDMUM4QyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWN4LDRcKQotIDEwMDYgMTNlYSA4QzFDOEQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlY3gsNFwpCi0gMTAwNyAxM2YxIDhDMUM4RSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlY3gsNFwpCi0gMTAwOCAxM2Y0IDhDMUM4RiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlY3gsNFwpCi0gMTAwOSAxM2Y3IDhDMUM5MCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlZHgsNFwpCi0gMTAxMCAxM2ZhIDhDMUM5MSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlZHgsNFwpCi0gMTAxMSAxM2ZkIDhDMUM5MiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlZHgsNFwpCi0gMTAxMiAxNDAwIDhDMUM5MyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlZHgsNFwpCi0gMTAxMyAxNDAzIDNFOEMxQzk0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlZHgsNFwpCi0gMTAxNCAxNDA3IDhDMUM5NTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVkeCw0XCkKLSAxMDE1IDE0MGUgOEMxQzk2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVkeCw0XCkKLSAxMDE2IDE0MTEgOEMxQzk3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVkeCw0XCkKLSAxMDE3IDE0MTQgOEMxQzk4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVieCw0XCkKLSAxMDE4IDE0MTcgOEMxQzk5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVieCw0XCkKLSAxMDE5IDE0MWEgOEMxQzlBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVieCw0XCkKLSAxMDIwIDE0MWQgOEMxQzlCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVieCw0XCkKLSAxMDIxIDE0MjAgM0U4QzFDOUMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVieCw0XCkKLSAxMDIyIDE0MjQgOEMxQzlEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWJ4LDRcKQotIDEwMjMgMTQyYiA4QzFDOUUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWJ4LDRcKQotIDEwMjQgMTQyZSA4QzFDOUYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWJ4LDRcKQotIDEwMjUgMTQzMSA4QzE4ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCw0XCkKLS4qV2FybmluZzouKgotIDEwMjYgMTQzMyA4QzE5ICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCw0XCkKLS4qV2FybmluZzouKgotIDEwMjcgMTQzNSA4QzFBICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDEwMjggMTQzNyA4QzFCICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCw0XCkKLS4qV2FybmluZzouKgotIDEwMjkgMTQzOSAzRThDMUMyNCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCw0XCkKLS4qV2FybmluZzouKgotIDEwMzAgMTQzZCA4QzFEMDAwMCAwMDAwICAgICAJCW1vdgklZHMsJWRzOlwoLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMSAxNDQzIDhDMUUgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMiAxNDQ1IDhDMUYgICAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTAzMyAxNDQ3IDhDMUNBOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYnAsNFwpCi0gMTAzNCAxNDRhIDhDMUNBOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYnAsNFwpCi0gMTAzNSAxNDRkIDhDMUNBQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYnAsNFwpCi0gMTAzNiAxNDUwIDhDMUNBQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYnAsNFwpCi0gMTAzNyAxNDUzIDNFOEMxQ0FDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYnAsNFwpCi0gMTAzOCAxNDU3IDhDMUNBRDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVicCw0XCkKLSAxMDM5IDE0NWUgOEMxQ0FFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVicCw0XCkKLSAxMDQwIDE0NjEgOEMxQ0FGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVicCw0XCkKLSAxMDQxIDE0NjQgOEMxQ0IwICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVzaSw0XCkKLSAxMDQyIDE0NjcgOEMxQ0IxICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVzaSw0XCkKLSAxMDQzIDE0NmEgOEMxQ0IyICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVzaSw0XCkKLSAxMDQ0IDE0NmQgOEMxQ0IzICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVzaSw0XCkKLSAxMDQ1IDE0NzAgM0U4QzFDQjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVzaSw0XCkKLSAxMDQ2IDE0NzQgOEMxQ0I1MDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZXNpLDRcKQotIDEwNDcgMTQ3YiA4QzFDQjYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZXNpLDRcKQotIDEwNDggMTQ3ZSA4QzFDQjcgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZXNpLDRcKQotIDEwNDkgMTQ4MSA4QzFDQjggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWRpLDRcKQotIDEwNTAgMTQ4NCA4QzFDQjkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWRpLDRcKQotIDEwNTEgMTQ4NyA4QzFDQkEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWRpLDRcKQotIDEwNTIgMTQ4YSA4QzFDQkIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWRpLDRcKQotIDEwNTMgMTQ4ZCAzRThDMUNCQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWRpLDRcKQotIDEwNTQgMTQ5MSA4QzFDQkQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZGksNFwpCi0gMTA1NSAxNDk4IDhDMUNCRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZGksNFwpCi0gMTA1NiAxNDliIDhDMUNCRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZGksNFwpCi0gMTA1NyAxNDllIDhDMUNDMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYXgsOFwpCi0gMTA1OCAxNGExIDhDMUNDMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYXgsOFwpCi0gMTA1OSAxNGE0IDhDMUNDMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYXgsOFwpCi0gMTA2MCAxNGE3IDhDMUNDMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYXgsOFwpCi0gMTA2MSAxNGFhIDNFOEMxQ0M0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYXgsOFwpCi0gMTA2MiAxNGFlIDhDMUNDNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVheCw4XCkKLSAxMDYzIDE0YjUgOEMxQ0M2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVheCw4XCkKLSAxMDY0IDE0YjggOEMxQ0M3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVheCw4XCkKLSAxMDY1IDE0YmIgOEMxQ0M4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVjeCw4XCkKLSAxMDY2IDE0YmUgOEMxQ0M5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVjeCw4XCkKLSAxMDY3IDE0YzEgOEMxQ0NBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVjeCw4XCkKLSAxMDY4IDE0YzQgOEMxQ0NCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVjeCw4XCkKLSAxMDY5IDE0YzcgM0U4QzFDQ0MgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVjeCw4XCkKLSAxMDcwIDE0Y2IgOEMxQ0NEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWN4LDhcKQotIDEwNzEgMTRkMiA4QzFDQ0UgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWN4LDhcKQotIDEwNzIgMTRkNSA4QzFDQ0YgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWN4LDhcKQotIDEwNzMgMTRkOCA4QzFDRDAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWR4LDhcKQotIDEwNzQgMTRkYiA4QzFDRDEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWR4LDhcKQotIDEwNzUgMTRkZSA4QzFDRDIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWR4LDhcKQotIDEwNzYgMTRlMSA4QzFDRDMgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWR4LDhcKQotIDEwNzcgMTRlNCAzRThDMUNENCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWR4LDhcKQotIDEwNzggMTRlOCA4QzFDRDUwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlZHgsOFwpCi0gMTA3OSAxNGVmIDhDMUNENiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlZHgsOFwpCi0gMTA4MCAxNGYyIDhDMUNENyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlZHgsOFwpCi0gMTA4MSAxNGY1IDhDMUNEOCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlYngsOFwpCi0gMTA4MiAxNGY4IDhDMUNEOSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlYngsOFwpCi0gMTA4MyAxNGZiIDhDMUNEQSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlYngsOFwpCi0gMTA4NCAxNGZlIDhDMUNEQiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlYngsOFwpCi0gMTA4NSAxNTAxIDNFOEMxQ0RDICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlYngsOFwpCi0gMTA4NiAxNTA1IDhDMUNERDAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVieCw4XCkKLSAxMDg3IDE1MGMgOEMxQ0RFICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVieCw4XCkKLSAxMDg4IDE1MGYgOEMxQ0RGICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVieCw4XCkKLSAxMDg5IDE1MTIgOEMxOCAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkwIDE1MTQgOEMxOSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkxIDE1MTYgOEMxQSAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkyIDE1MTggOEMxQiAgICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsOFwpCi0uKldhcm5pbmc6LioKLSAxMDkzIDE1MWEgM0U4QzFDMjQgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsOFwpCi0uKldhcm5pbmc6LioKLSAxMDk0IDE1MWUgOEMxRDAwMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczpcKCw4XCkKLS4qV2FybmluZzouKgotIDEwOTUgMTUyNCA4QzFFICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSw4XCkKLS4qV2FybmluZzouKgotIDEwOTYgMTUyNiA4QzFGICAgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDEwOTcgMTUyOCA4QzFDRTggICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVheCwlZWJwLDhcKQotIDEwOTggMTUyYiA4QzFDRTkgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVjeCwlZWJwLDhcKQotIDEwOTkgMTUyZSA4QzFDRUEgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkeCwlZWJwLDhcKQotIDExMDAgMTUzMSA4QzFDRUIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVieCwlZWJwLDhcKQotIDExMDEgMTUzNCAzRThDMUNFQyAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzcCwlZWJwLDhcKQotIDExMDIgMTUzOCA4QzFDRUQwMCAwMDAwMDAgICAJCW1vdgklZHMsJWRzOlwoLCVlYnAsOFwpCi0gMTEwMyAxNTNmIDhDMUNFRSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNpLCVlYnAsOFwpCi0gMTEwNCAxNTQyIDhDMUNFRiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWRpLCVlYnAsOFwpCi0gMTEwNSAxNTQ1IDhDMUNGMCAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWF4LCVlc2ksOFwpCi0gMTEwNiAxNTQ4IDhDMUNGMSAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWN4LCVlc2ksOFwpCi0gMTEwNyAxNTRiIDhDMUNGMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWR4LCVlc2ksOFwpCi0gMTEwOCAxNTRlIDhDMUNGMyAgICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZWJ4LCVlc2ksOFwpCi0gMTEwOSAxNTUxIDNFOEMxQ0Y0ICAgICAgICAgIAkJbW92CSVkcywlZHM6XCglZXNwLCVlc2ksOFwpCi0gMTExMCAxNTU1IDhDMUNGNTAwIDAwMDAwMCAgIAkJbW92CSVkcywlZHM6XCgsJWVzaSw4XCkKLSAxMTExIDE1NWMgOEMxQ0Y2ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc2ksJWVzaSw4XCkKLSAxMTEyIDE1NWYgOEMxQ0Y3ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZGksJWVzaSw4XCkKLSAxMTEzIDE1NjIgOEMxQ0Y4ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYXgsJWVkaSw4XCkKLSAxMTE0IDE1NjUgOEMxQ0ZBICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlZHgsJWVkaSw4XCkKLSAxMTE1IDE1NjggOEMxQ0Y5ICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlY3gsJWVkaSw4XCkKLSAxMTE2IDE1NmIgOEMxQ0ZCICAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYngsJWVkaSw4XCkKLSAxMTE3IDE1NmUgM0U4QzFDRkMgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlc3AsJWVkaSw4XCkKLSAxMTE4IDE1NzIgOEMxQ0ZEMDAgMDAwMDAwICAgCQltb3YJJWRzLCVkczpcKCwlZWRpLDhcKQotIDExMTkgMTU3OSA4QzFDRkUgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVzaSwlZWRpLDhcKQotIDExMjAgMTU3YyA4QzFDRkYgICAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVkaSwlZWRpLDhcKQotIDExMjEgMTU3ZiA4QzVDMDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCwxXCkKLSAxMTIyIDE1ODMgOEM1QzAxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsMVwpCi0gMTEyMyAxNTg3IDhDNUMwMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDFcKQotIDExMjQgMTU4YiA4QzVDMDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCwxXCkKLSAxMTI1IDE1OGYgM0U4QzVDMDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsMVwpCi0gMTEyNiAxNTk0IDNFOEM1QzA1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDFcKQotIDExMjcgMTU5OSA4QzVDMDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCwxXCkKLSAxMTI4IDE1OWQgOEM1QzA3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsMVwpCi0gMTEyOSAxNWExIDhDNUMwODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDFcKQotIDExMzAgMTVhNSA4QzVDMDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCwxXCkKLSAxMTMxIDE1YTkgOEM1QzBBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsMVwpCi0gMTEzMiAxNWFkIDhDNUMwQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDFcKQotIDExMzMgMTViMSAzRThDNUMwQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCwxXCkKLSAxMTM0IDE1YjYgM0U4QzVDMEQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsMVwpCi0gMTEzNSAxNWJiIDhDNUMwRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDFcKQotIDExMzYgMTViZiA4QzVDMEYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCwxXCkKLSAxMTM3IDE1YzMgOEM1QzEwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsMVwpCi0gMTEzOCAxNWM3IDhDNUMxMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDFcKQotIDExMzkgMTVjYiA4QzVDMTIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCwxXCkKLSAxMTQwIDE1Y2YgOEM1QzEzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsMVwpCi0gMTE0MSAxNWQzIDNFOEM1QzE0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDFcKQotIDExNDIgMTVkOCAzRThDNUMxNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCwxXCkKLSAxMTQzIDE1ZGQgOEM1QzE2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsMVwpCi0gMTE0NCAxNWUxIDhDNUMxNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDFcKQotIDExNDUgMTVlNSA4QzVDMTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCwxXCkKLSAxMTQ2IDE1ZTkgOEM1QzE5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsMVwpCi0gMTE0NyAxNWVkIDhDNUMxQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDFcKQotIDExNDggMTVmMSA4QzVDMUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCwxXCkKLSAxMTQ5IDE1ZjUgM0U4QzVDMUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsMVwpCi0gMTE1MCAxNWZhIDNFOEM1QzFEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDFcKQotIDExNTEgMTVmZiA4QzVDMUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCwxXCkKLSAxMTUyIDE2MDMgOEM1QzFGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsMVwpCi0gMTE1MyAxNjA3IDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwxXCkKLSAxMTU0IDE2MGEgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDFcKQotIDExNTUgMTYwZCA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsMVwpCi0gMTE1NiAxNjEwIDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwxXCkKLSAxMTU3IDE2MTMgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDFcKQotIDExNTggMTYxOCAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsMVwpCi0gMTE1OSAxNjFjIDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwxXCkKLSAxMTYwIDE2MWYgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDFcKQotIDExNjEgMTYyMiA4QzVDMjgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCwxXCkKLSAxMTYyIDE2MjYgOEM1QzI5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsMVwpCi0gMTE2MyAxNjJhIDhDNUMyQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDFcKQotIDExNjQgMTYyZSA4QzVDMkIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCwxXCkKLSAxMTY1IDE2MzIgM0U4QzVDMkMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsMVwpCi0gMTE2NiAxNjM3IDNFOEM1QzJEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDFcKQotIDExNjcgMTYzYyA4QzVDMkUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCwxXCkKLSAxMTY4IDE2NDAgOEM1QzJGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsMVwpCi0gMTE2OSAxNjQ0IDhDNUMzMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDFcKQotIDExNzAgMTY0OCA4QzVDMzExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSwxXCkKLSAxMTcxIDE2NGMgOEM1QzMyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksMVwpCi0gMTE3MiAxNjUwIDhDNUMzMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDFcKQotIDExNzMgMTY1NCAzRThDNUMzNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSwxXCkKLSAxMTc0IDE2NTkgM0U4QzVDMzUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksMVwpCi0gMTE3NSAxNjVlIDhDNUMzNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDFcKQotIDExNzYgMTY2MiA4QzVDMzcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSwxXCkKLSAxMTc3IDE2NjYgOEM1QzM4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksMVwpCi0gMTE3OCAxNjZhIDhDNUMzOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWRpLDFcKQotIDExNzkgMTY2ZSA4QzVDM0ExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkaSwxXCkKLSAxMTgwIDE2NzIgOEM1QzNCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksMVwpCi0gMTE4MSAxNjc2IDNFOEM1QzNDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDFcKQotIDExODIgMTY3YiAzRThDNUMzRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSwxXCkKLSAxMTgzIDE2ODAgOEM1QzNFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksMVwpCi0gMTE4NCAxNjg0IDhDNUMzRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDFcKQotIDExODUgMTY4OCA4QzVDNDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVheCwyXCkKLSAxMTg2IDE2OGMgOEM1QzQxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYXgsMlwpCi0gMTE4NyAxNjkwIDhDNUM0MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWF4LDJcKQotIDExODggMTY5NCA4QzVDNDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVheCwyXCkKLSAxMTg5IDE2OTggM0U4QzVDNDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYXgsMlwpCi0gMTE5MCAxNjlkIDNFOEM1QzQ1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWF4LDJcKQotIDExOTEgMTZhMiA4QzVDNDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVheCwyXCkKLSAxMTkyIDE2YTYgOEM1QzQ3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYXgsMlwpCi0gMTE5MyAxNmFhIDhDNUM0ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWN4LDJcKQotIDExOTQgMTZhZSA4QzVDNDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVjeCwyXCkKLSAxMTk1IDE2YjIgOEM1QzRBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlY3gsMlwpCi0gMTE5NiAxNmI2IDhDNUM0QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWN4LDJcKQotIDExOTcgMTZiYSAzRThDNUM0QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVjeCwyXCkKLSAxMTk4IDE2YmYgM0U4QzVDNEQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlY3gsMlwpCi0gMTE5OSAxNmM0IDhDNUM0RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWN4LDJcKQotIDEyMDAgMTZjOCA4QzVDNEYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVjeCwyXCkKLSAxMjAxIDE2Y2MgOEM1QzUwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZHgsMlwpCi0gMTIwMiAxNmQwIDhDNUM1MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWR4LDJcKQotIDEyMDMgMTZkNCA4QzVDNTIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVkeCwyXCkKLSAxMjA0IDE2ZDggOEM1QzUzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZHgsMlwpCi0gMTIwNSAxNmRjIDNFOEM1QzU0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWR4LDJcKQotIDEyMDYgMTZlMSAzRThDNUM1NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkeCwyXCkKLSAxMjA3IDE2ZTYgOEM1QzU2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZHgsMlwpCi0gMTIwOCAxNmVhIDhDNUM1NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWR4LDJcKQotIDEyMDkgMTZlZSA4QzVDNTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVieCwyXCkKLSAxMjEwIDE2ZjIgOEM1QzU5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYngsMlwpCi0gMTIxMSAxNmY2IDhDNUM1QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJ4LDJcKQotIDEyMTIgMTZmYSA4QzVDNUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVieCwyXCkKLSAxMjEzIDE2ZmUgM0U4QzVDNUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYngsMlwpCi0gMTIxNCAxNzAzIDNFOEM1QzVEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJ4LDJcKQotIDEyMTUgMTcwOCA4QzVDNUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVieCwyXCkKLSAxMjE2IDE3MGMgOEM1QzVGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYngsMlwpCi0gMTIxNyAxNzEwIDhDNTgxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDEyMTggMTcxMyA4QzU5MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAxMjE5IDE3MTYgOEM1QTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMCAxNzE5IDhDNUIxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDEyMjEgMTcxYyAzRThDNUMyNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAxMjIyIDE3MjEgM0U4QzVEMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMTIyMyAxNzI1IDhDNUUxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDEyMjQgMTcyOCA4QzVGMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxMjI1IDE3MmIgOEM1QzY4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYnAsMlwpCi0gMTIyNiAxNzJmIDhDNUM2OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJwLDJcKQotIDEyMjcgMTczMyA4QzVDNkExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVicCwyXCkKLSAxMjI4IDE3MzcgOEM1QzZCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYnAsMlwpCi0gMTIyOSAxNzNiIDNFOEM1QzZDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJwLDJcKQotIDEyMzAgMTc0MCAzRThDNUM2RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVicCwyXCkKLSAxMjMxIDE3NDUgOEM1QzZFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYnAsMlwpCi0gMTIzMiAxNzQ5IDhDNUM2RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJwLDJcKQotIDEyMzMgMTc0ZCA4QzVDNzAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVzaSwyXCkKLSAxMjM0IDE3NTEgOEM1QzcxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlc2ksMlwpCi0gMTIzNSAxNzU1IDhDNUM3MjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZXNpLDJcKQotIDEyMzYgMTc1OSA4QzVDNzMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVzaSwyXCkKLSAxMjM3IDE3NWQgM0U4QzVDNzQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlc2ksMlwpCi0gMTIzOCAxNzYyIDNFOEM1Qzc1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZXNpLDJcKQotIDEyMzkgMTc2NyA4QzVDNzYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVzaSwyXCkKLSAxMjQwIDE3NmIgOEM1Qzc3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlc2ksMlwpCi0gMTI0MSAxNzZmIDhDNUM3ODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWRpLDJcKQotIDEyNDIgMTc3MyA4QzVDNzkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSwyXCkKLSAxMjQzIDE3NzcgOEM1QzdBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZGksMlwpCi0gMTI0NCAxNzdiIDhDNUM3QjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWRpLDJcKQotIDEyNDUgMTc3ZiAzRThDNUM3QyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkaSwyXCkKLSAxMjQ2IDE3ODQgM0U4QzVDN0QgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZGksMlwpCi0gMTI0NyAxNzg5IDhDNUM3RTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWRpLDJcKQotIDEyNDggMTc4ZCA4QzVDN0YxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkaSwyXCkKLSAxMjQ5IDE3OTEgOEM1QzgwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYXgsNFwpCi0gMTI1MCAxNzk1IDhDNUM4MTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWF4LDRcKQotIDEyNTEgMTc5OSA4QzVDODIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVheCw0XCkKLSAxMjUyIDE3OWQgOEM1QzgzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYXgsNFwpCi0gMTI1MyAxN2ExIDNFOEM1Qzg0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWF4LDRcKQotIDEyNTQgMTdhNiAzRThDNUM4NSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVheCw0XCkKLSAxMjU1IDE3YWIgOEM1Qzg2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYXgsNFwpCi0gMTI1NiAxN2FmIDhDNUM4NzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWF4LDRcKQotIDEyNTcgMTdiMyA4QzVDODgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVjeCw0XCkKLSAxMjU4IDE3YjcgOEM1Qzg5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlY3gsNFwpCi0gMTI1OSAxN2JiIDhDNUM4QTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWN4LDRcKQotIDEyNjAgMTdiZiA4QzVDOEIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVjeCw0XCkKLSAxMjYxIDE3YzMgM0U4QzVDOEMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlY3gsNFwpCi0gMTI2MiAxN2M4IDNFOEM1QzhEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWN4LDRcKQotIDEyNjMgMTdjZCA4QzVDOEUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVjeCw0XCkKLSAxMjY0IDE3ZDEgOEM1QzhGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlY3gsNFwpCi0gMTI2NSAxN2Q1IDhDNUM5MDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWR4LDRcKQotIDEyNjYgMTdkOSA4QzVDOTExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkeCw0XCkKLSAxMjY3IDE3ZGQgOEM1QzkyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlZHgsNFwpCi0gMTI2OCAxN2UxIDhDNUM5MzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWR4LDRcKQotIDEyNjkgMTdlNSAzRThDNUM5NCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVkeCw0XCkKLSAxMjcwIDE3ZWEgM0U4QzVDOTUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlZHgsNFwpCi0gMTI3MSAxN2VmIDhDNUM5NjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWR4LDRcKQotIDEyNzIgMTdmMyA4QzVDOTcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVkeCw0XCkKLSAxMjczIDE3ZjcgOEM1Qzk4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlYngsNFwpCi0gMTI3NCAxN2ZiIDhDNUM5OTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWJ4LDRcKQotIDEyNzUgMTdmZiA4QzVDOUExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVieCw0XCkKLSAxMjc2IDE4MDMgOEM1QzlCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlYngsNFwpCi0gMTI3NyAxODA3IDNFOEM1QzlDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWJ4LDRcKQotIDEyNzggMTgwYyAzRThDNUM5RCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVieCw0XCkKLSAxMjc5IDE4MTEgOEM1QzlFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlYngsNFwpCi0gMTI4MCAxODE1IDhDNUM5RjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWJ4LDRcKQotIDEyODEgMTgxOSA4QzU4MTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxMjgyIDE4MWMgOEM1OTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTI4MyAxODFmIDhDNUExMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDEyODQgMTgyMiA4QzVCMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxMjg1IDE4MjUgM0U4QzVDMjQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4NiAxODJhIDNFOEM1RDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDEyODcgMTgyZSA4QzVFMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSAxMjg4IDE4MzEgOEM1RjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTI4OSAxODM0IDhDNUNBODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJwLDRcKQotIDEyOTAgMTgzOCA4QzVDQTkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVicCw0XCkKLSAxMjkxIDE4M2MgOEM1Q0FBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYnAsNFwpCi0gMTI5MiAxODQwIDhDNUNBQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJwLDRcKQotIDEyOTMgMTg0NCAzRThDNUNBQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVicCw0XCkKLSAxMjk0IDE4NDkgM0U4QzVDQUQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYnAsNFwpCi0gMTI5NSAxODRlIDhDNUNBRTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJwLDRcKQotIDEyOTYgMTg1MiA4QzVDQUYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVicCw0XCkKLSAxMjk3IDE4NTYgOEM1Q0IwMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlc2ksNFwpCi0gMTI5OCAxODVhIDhDNUNCMTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZXNpLDRcKQotIDEyOTkgMTg1ZSA4QzVDQjIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVzaSw0XCkKLSAxMzAwIDE4NjIgOEM1Q0IzMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlc2ksNFwpCi0gMTMwMSAxODY2IDNFOEM1Q0I0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZXNpLDRcKQotIDEzMDIgMTg2YiAzRThDNUNCNSAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVzaSw0XCkKLSAxMzAzIDE4NzAgOEM1Q0I2MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlc2ksNFwpCi0gMTMwNCAxODc0IDhDNUNCNzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZXNpLDRcKQotIDEzMDUgMTg3OCA4QzVDQjgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkaSw0XCkKLSAxMzA2IDE4N2MgOEM1Q0I5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZGksNFwpCi0gMTMwNyAxODgwIDhDNUNCQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDRcKQotIDEzMDggMTg4NCA4QzVDQkIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkaSw0XCkKLSAxMzA5IDE4ODggM0U4QzVDQkMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZGksNFwpCi0gMTMxMCAxODhkIDNFOEM1Q0JEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWRpLDRcKQotIDEzMTEgMTg5MiA4QzVDQkUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkaSw0XCkKLSAxMzEyIDE4OTYgOEM1Q0JGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZGksNFwpCi0gMTMxMyAxODlhIDhDNUNDMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWF4LDhcKQotIDEzMTQgMTg5ZSA4QzVDQzExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVheCw4XCkKLSAxMzE1IDE4YTIgOEM1Q0MyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYXgsOFwpCi0gMTMxNiAxOGE2IDhDNUNDMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWF4LDhcKQotIDEzMTcgMThhYSAzRThDNUNDNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVheCw4XCkKLSAxMzE4IDE4YWYgM0U4QzVDQzUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYXgsOFwpCi0gMTMxOSAxOGI0IDhDNUNDNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWF4LDhcKQotIDEzMjAgMThiOCA4QzVDQzcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVheCw4XCkKLSAxMzIxIDE4YmMgOEM1Q0M4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlY3gsOFwpCi0gMTMyMiAxOGMwIDhDNUNDOTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCwlZWN4LDhcKQotIDEzMjMgMThjNCA4QzVDQ0ExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsJWVjeCw4XCkKLSAxMzI0IDE4YzggOEM1Q0NCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlY3gsOFwpCi0gMTMyNSAxOGNjIDNFOEM1Q0NDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWN4LDhcKQotIDEzMjYgMThkMSAzRThDNUNDRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVjeCw4XCkKLSAxMzI3IDE4ZDYgOEM1Q0NFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlY3gsOFwpCi0gMTMyOCAxOGRhIDhDNUNDRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWN4LDhcKQotIDEzMjkgMThkZSA4QzVDRDAxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVkeCw4XCkKLSAxMzMwIDE4ZTIgOEM1Q0QxMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlZHgsOFwpCi0gMTMzMSAxOGU2IDhDNUNEMjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWR4LDhcKQotIDEzMzIgMThlYSA4QzVDRDMxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVkeCw4XCkKLSAxMzMzIDE4ZWUgM0U4QzVDRDQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlZHgsOFwpCi0gMTMzNCAxOGYzIDNFOEM1Q0Q1IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWR4LDhcKQotIDEzMzUgMThmOCA4QzVDRDYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVkeCw4XCkKLSAxMzM2IDE4ZmMgOEM1Q0Q3MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlZHgsOFwpCi0gMTMzNyAxOTAwIDhDNUNEODEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZWJ4LDhcKQotIDEzMzggMTkwNCA4QzVDRDkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVieCw4XCkKLSAxMzM5IDE5MDggOEM1Q0RBMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlYngsOFwpCi0gMTM0MCAxOTBjIDhDNUNEQjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZWJ4LDhcKQotIDEzNDEgMTkxMCAzRThDNUNEQyAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVieCw4XCkKLSAxMzQyIDE5MTUgM0U4QzVDREQgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlYngsOFwpCi0gMTM0MyAxOTFhIDhDNUNERTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZWJ4LDhcKQotIDEzNDQgMTkxZSA4QzVDREYxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVieCw4XCkKLSAxMzQ1IDE5MjIgOEM1ODEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0NiAxOTI1IDhDNTkxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDEzNDcgMTkyOCA4QzVBMTIgICAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxMzQ4IDE5MmIgOEM1QjEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMTM0OSAxOTJlIDNFOEM1QzI0IDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDEzNTAgMTkzMyAzRThDNUQxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxMzUxIDE5MzcgOEM1RTEyICAgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMTM1MiAxOTNhIDhDNUYxMiAgICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDEzNTMgMTkzZCA4QzVDRTgxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYXgsJWVicCw4XCkKLSAxMzU0IDE5NDEgOEM1Q0U5MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWN4LCVlYnAsOFwpCi0gMTM1NSAxOTQ1IDhDNUNFQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWJwLDhcKQotIDEzNTYgMTk0OSA4QzVDRUIxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYngsJWVicCw4XCkKLSAxMzU3IDE5NGQgM0U4QzVDRUMgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNwLCVlYnAsOFwpCi0gMTM1OCAxOTUyIDNFOEM1Q0VEIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVicCwlZWJwLDhcKQotIDEzNTkgMTk1NyA4QzVDRUUxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc2ksJWVicCw4XCkKLSAxMzYwIDE5NWIgOEM1Q0VGMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWRpLCVlYnAsOFwpCi0gMTM2MSAxOTVmIDhDNUNGMDEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVheCwlZXNpLDhcKQotIDEzNjIgMTk2MyA4QzVDRjExMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVzaSw4XCkKLSAxMzYzIDE5NjcgOEM1Q0YyMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWR4LCVlc2ksOFwpCi0gMTM2NCAxOTZiIDhDNUNGMzEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVieCwlZXNpLDhcKQotIDEzNjUgMTk2ZiAzRThDNUNGNCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlc3AsJWVzaSw4XCkKLSAxMzY2IDE5NzQgM0U4QzVDRjUgMTIgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJwLCVlc2ksOFwpCi0gMTM2NyAxOTc5IDhDNUNGNjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzaSwlZXNpLDhcKQotIDEzNjggMTk3ZCA4QzVDRjcxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlZGksJWVzaSw4XCkKLSAxMzY5IDE5ODEgOEM1Q0Y4MTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWF4LCVlZGksOFwpCi0gMTM3MCAxOTg1IDhDNUNGQTEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkeCwlZWRpLDhcKQotIDEzNzEgMTk4OSA4QzVDRjkxMiAgICAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlY3gsJWVkaSw4XCkKLSAxMzcyIDE5OGQgOEM1Q0ZCMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZWJ4LCVlZGksOFwpCi0gMTM3MyAxOTkxIDNFOEM1Q0ZDIDEyICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVzcCwlZWRpLDhcKQotIDEzNzQgMTk5NiAzRThDNUNGRCAxMiAgICAgICAJCW1vdgklZHMsJWRzOjB4MTJcKCVlYnAsJWVkaSw4XCkKLSAxMzc1IDE5OWIgOEM1Q0ZFMTIgICAgICAgICAgCQltb3YJJWRzLCVkczoweDEyXCglZXNpLCVlZGksOFwpCi0gMTM3NiAxOTlmIDhDNUNGRjEyICAgICAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoJWVkaSwlZWRpLDhcKQotIDEzNzcgMTlhMyA4QzlDMDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwxXCkKLSAxMzc4IDE5YWEgOEM5QzAxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMVwpCi0gMTM3OSAxOWIxIDhDOUMwMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDFcKQotIDEzODAgMTliOCA4QzlDMDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwxXCkKLSAxMzgxIDE5YmYgM0U4QzlDMDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMVwpCi0gMTM4MiAxOWM3IDNFOEM5QzA1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDFcKQotIDEzODMgMTljZiA4QzlDMDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwxXCkKLSAxMzg0IDE5ZDYgOEM5QzA3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMVwpCi0gMTM4NSAxOWRkIDhDOUMwODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDFcKQotIDEzODYgMTllNCA4QzlDMDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwxXCkKLSAxMzg3IDE5ZWIgOEM5QzBBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMVwpCi0gMTM4OCAxOWYyIDhDOUMwQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDFcKQotIDEzODkgMTlmOSAzRThDOUMwQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwxXCkKLSAxMzkwIDFhMDEgM0U4QzlDMEQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMVwpCi0gMTM5MSAxYTA5IDhDOUMwRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDFcKQotIDEzOTIgMWExMCA4QzlDMEY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwxXCkKLSAxMzkzIDFhMTcgOEM5QzEwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMVwpCi0gMTM5NCAxYTFlIDhDOUMxMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDFcKQotIDEzOTUgMWEyNSA4QzlDMTI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwxXCkKLSAxMzk2IDFhMmMgOEM5QzEzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMVwpCi0gMTM5NyAxYTMzIDNFOEM5QzE0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDFcKQotIDEzOTggMWEzYiAzRThDOUMxNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwxXCkKLSAxMzk5IDFhNDMgOEM5QzE2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMVwpCi0gMTQwMCAxYTRhIDhDOUMxNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDFcKQotIDE0MDEgMWE1MSA4QzlDMTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwxXCkKLSAxNDAyIDFhNTggOEM5QzE5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMVwpCi0gMTQwMyAxYTVmIDhDOUMxQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDFcKQotIDE0MDQgMWE2NiA4QzlDMUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwxXCkKLSAxNDA1IDFhNmQgM0U4QzlDMUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMVwpCi0gMTQwNiAxYTc1IDNFOEM5QzFEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDFcKQotIDE0MDcgMWE3ZCA4QzlDMUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwxXCkKLSAxNDA4IDFhODQgOEM5QzFGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMVwpCi0gMTQwOSAxYThiIDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwxXCkKLSAxNDEwIDFhOTEgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDFcKQotIDE0MTEgMWE5NyA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsMVwpCi0gMTQxMiAxYTlkIDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwxXCkKLSAxNDEzIDFhYTMgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDFcKQotIDE0MTQgMWFhYiAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsMVwpCi0gMTQxNSAxYWIyIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwxXCkKLSAxNDE2IDFhYjggOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDFcKQotIDE0MTcgMWFiZSA4QzlDMjg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCwxXCkKLSAxNDE4IDFhYzUgOEM5QzI5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsMVwpCi0gMTQxOSAxYWNjIDhDOUMyQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDFcKQotIDE0MjAgMWFkMyA4QzlDMkI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCwxXCkKLSAxNDIxIDFhZGEgM0U4QzlDMkMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsMVwpCi0gMTQyMiAxYWUyIDNFOEM5QzJEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDFcKQotIDE0MjMgMWFlYSA4QzlDMkU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCwxXCkKLSAxNDI0IDFhZjEgOEM5QzJGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsMVwpCi0gMTQyNSAxYWY4IDhDOUMzMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDFcKQotIDE0MjYgMWFmZiA4QzlDMzE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSwxXCkKLSAxNDI3IDFiMDYgOEM5QzMyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksMVwpCi0gMTQyOCAxYjBkIDhDOUMzMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDFcKQotIDE0MjkgMWIxNCAzRThDOUMzNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSwxXCkKLSAxNDMwIDFiMWMgM0U4QzlDMzUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksMVwpCi0gMTQzMSAxYjI0IDhDOUMzNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDFcKQotIDE0MzIgMWIyYiA4QzlDMzc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSwxXCkKLSAxNDMzIDFiMzIgOEM5QzM4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksMVwpCi0gMTQzNCAxYjM5IDhDOUMzOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWRpLDFcKQotIDE0MzUgMWI0MCA4QzlDM0E3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkaSwxXCkKLSAxNDM2IDFiNDcgOEM5QzNCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksMVwpCi0gMTQzNyAxYjRlIDNFOEM5QzNDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDFcKQotIDE0MzggMWI1NiAzRThDOUMzRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSwxXCkKLSAxNDM5IDFiNWUgOEM5QzNFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksMVwpCi0gMTQ0MCAxYjY1IDhDOUMzRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDFcKQotIDE0NDEgMWI2YyA4QzlDNDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVheCwyXCkKLSAxNDQyIDFiNzMgOEM5QzQxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYXgsMlwpCi0gMTQ0MyAxYjdhIDhDOUM0Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWF4LDJcKQotIDE0NDQgMWI4MSA4QzlDNDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVheCwyXCkKLSAxNDQ1IDFiODggM0U4QzlDNDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYXgsMlwpCi0gMTQ0NiAxYjkwIDNFOEM5QzQ1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWF4LDJcKQotIDE0NDcgMWI5OCA4QzlDNDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVheCwyXCkKLSAxNDQ4IDFiOWYgOEM5QzQ3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYXgsMlwpCi0gMTQ0OSAxYmE2IDhDOUM0ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWN4LDJcKQotIDE0NTAgMWJhZCA4QzlDNDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVjeCwyXCkKLSAxNDUxIDFiYjQgOEM5QzRBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlY3gsMlwpCi0gMTQ1MiAxYmJiIDhDOUM0Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWN4LDJcKQotIDE0NTMgMWJjMiAzRThDOUM0QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVjeCwyXCkKLSAxNDU0IDFiY2EgM0U4QzlDNEQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlY3gsMlwpCi0gMTQ1NSAxYmQyIDhDOUM0RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWN4LDJcKQotIDE0NTYgMWJkOSA4QzlDNEY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVjeCwyXCkKLSAxNDU3IDFiZTAgOEM5QzUwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZHgsMlwpCi0gMTQ1OCAxYmU3IDhDOUM1MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWR4LDJcKQotIDE0NTkgMWJlZSA4QzlDNTI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVkeCwyXCkKLSAxNDYwIDFiZjUgOEM5QzUzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZHgsMlwpCi0gMTQ2MSAxYmZjIDNFOEM5QzU0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWR4LDJcKQotIDE0NjIgMWMwNCAzRThDOUM1NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkeCwyXCkKLSAxNDYzIDFjMGMgOEM5QzU2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZHgsMlwpCi0gMTQ2NCAxYzEzIDhDOUM1Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWR4LDJcKQotIDE0NjUgMWMxYSA4QzlDNTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVieCwyXCkKLSAxNDY2IDFjMjEgOEM5QzU5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYngsMlwpCi0gMTQ2NyAxYzI4IDhDOUM1QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJ4LDJcKQotIDE0NjggMWMyZiA4QzlDNUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVieCwyXCkKLSAxNDY5IDFjMzYgM0U4QzlDNUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYngsMlwpCi0gMTQ3MCAxYzNlIDNFOEM5QzVEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJ4LDJcKQotIDE0NzEgMWM0NiA4QzlDNUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVieCwyXCkKLSAxNDcyIDFjNGQgOEM5QzVGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYngsMlwpCi0gMTQ3MyAxYzU0IDhDOTg3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwyXCkKLS4qV2FybmluZzouKgotIDE0NzQgMWM1YSA4Qzk5Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc1IDFjNjAgOEM5QTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3NiAxYzY2IDhDOUI3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwyXCkKLS4qV2FybmluZzouKgotIDE0NzcgMWM2YyAzRThDOUMyNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsMlwpCi0uKldhcm5pbmc6LioKLSAxNDc4IDFjNzQgM0U4QzlENzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLDJcKQotLipXYXJuaW5nOi4qCi0gMTQ3OSAxYzdiIDhDOUU3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwyXCkKLS4qV2FybmluZzouKgotIDE0ODAgMWM4MSA4QzlGNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksMlwpCi0uKldhcm5pbmc6LioKLSAxNDgxIDFjODcgOEM5QzY4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYnAsMlwpCi0gMTQ4MiAxYzhlIDhDOUM2OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJwLDJcKQotIDE0ODMgMWM5NSA4QzlDNkE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVicCwyXCkKLSAxNDg0IDFjOWMgOEM5QzZCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYnAsMlwpCi0gMTQ4NSAxY2EzIDNFOEM5QzZDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJwLDJcKQotIDE0ODYgMWNhYiAzRThDOUM2RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVicCwyXCkKLSAxNDg3IDFjYjMgOEM5QzZFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYnAsMlwpCi0gMTQ4OCAxY2JhIDhDOUM2Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJwLDJcKQotIDE0ODkgMWNjMSA4QzlDNzA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVzaSwyXCkKLSAxNDkwIDFjYzggOEM5QzcxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlc2ksMlwpCi0gMTQ5MSAxY2NmIDhDOUM3Mjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZXNpLDJcKQotIDE0OTIgMWNkNiA4QzlDNzM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVzaSwyXCkKLSAxNDkzIDFjZGQgM0U4QzlDNzQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlc2ksMlwpCi0gMTQ5NCAxY2U1IDNFOEM5Qzc1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZXNpLDJcKQotIDE0OTUgMWNlZCA4QzlDNzY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVzaSwyXCkKLSAxNDk2IDFjZjQgOEM5Qzc3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlc2ksMlwpCi0gMTQ5NyAxY2ZiIDhDOUM3ODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWRpLDJcKQotIDE0OTggMWQwMiA4QzlDNzk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSwyXCkKLSAxNDk5IDFkMDkgOEM5QzdBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZGksMlwpCi0gMTUwMCAxZDEwIDhDOUM3Qjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWRpLDJcKQotIDE1MDEgMWQxNyAzRThDOUM3QyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkaSwyXCkKLSAxNTAyIDFkMWYgM0U4QzlDN0QgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZGksMlwpCi0gMTUwMyAxZDI3IDhDOUM3RTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWRpLDJcKQotIDE1MDQgMWQyZSA4QzlDN0Y3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkaSwyXCkKLSAxNTA1IDFkMzUgOEM5QzgwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYXgsNFwpCi0gMTUwNiAxZDNjIDhDOUM4MTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWF4LDRcKQotIDE1MDcgMWQ0MyA4QzlDODI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVheCw0XCkKLSAxNTA4IDFkNGEgOEM5QzgzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYXgsNFwpCi0gMTUwOSAxZDUxIDNFOEM5Qzg0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWF4LDRcKQotIDE1MTAgMWQ1OSAzRThDOUM4NSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVheCw0XCkKLSAxNTExIDFkNjEgOEM5Qzg2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYXgsNFwpCi0gMTUxMiAxZDY4IDhDOUM4Nzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWF4LDRcKQotIDE1MTMgMWQ2ZiA4QzlDODg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVjeCw0XCkKLSAxNTE0IDFkNzYgOEM5Qzg5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlY3gsNFwpCi0gMTUxNSAxZDdkIDhDOUM4QTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWN4LDRcKQotIDE1MTYgMWQ4NCA4QzlDOEI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVjeCw0XCkKLSAxNTE3IDFkOGIgM0U4QzlDOEMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlY3gsNFwpCi0gMTUxOCAxZDkzIDNFOEM5QzhEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWN4LDRcKQotIDE1MTkgMWQ5YiA4QzlDOEU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVjeCw0XCkKLSAxNTIwIDFkYTIgOEM5QzhGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlY3gsNFwpCi0gMTUyMSAxZGE5IDhDOUM5MDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWR4LDRcKQotIDE1MjIgMWRiMCA4QzlDOTE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkeCw0XCkKLSAxNTIzIDFkYjcgOEM5QzkyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlZHgsNFwpCi0gMTUyNCAxZGJlIDhDOUM5Mzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWR4LDRcKQotIDE1MjUgMWRjNSAzRThDOUM5NCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVkeCw0XCkKLSAxNTI2IDFkY2QgM0U4QzlDOTUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlZHgsNFwpCi0gMTUyNyAxZGQ1IDhDOUM5Njc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWR4LDRcKQotIDE1MjggMWRkYyA4QzlDOTc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVkeCw0XCkKLSAxNTI5IDFkZTMgOEM5Qzk4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlYngsNFwpCi0gMTUzMCAxZGVhIDhDOUM5OTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWJ4LDRcKQotIDE1MzEgMWRmMSA4QzlDOUE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVieCw0XCkKLSAxNTMyIDFkZjggOEM5QzlCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlYngsNFwpCi0gMTUzMyAxZGZmIDNFOEM5QzlDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWJ4LDRcKQotIDE1MzQgMWUwNyAzRThDOUM5RCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVieCw0XCkKLSAxNTM1IDFlMGYgOEM5QzlFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlYngsNFwpCi0gMTUzNiAxZTE2IDhDOUM5Rjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWJ4LDRcKQotIDE1MzcgMWUxZCA4Qzk4Nzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsNFwpCi0uKldhcm5pbmc6LioKLSAxNTM4IDFlMjMgOEM5OTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LDRcKQotLipXYXJuaW5nOi4qCi0gMTUzOSAxZTI5IDhDOUE3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCw0XCkKLS4qV2FybmluZzouKgotIDE1NDAgMWUyZiA4QzlCNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsNFwpCi0uKldhcm5pbmc6LioKLSAxNTQxIDFlMzUgM0U4QzlDMjQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0MiAxZTNkIDNFOEM5RDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCw0XCkKLS4qV2FybmluZzouKgotIDE1NDMgMWU0NCA4QzlFNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksNFwpCi0uKldhcm5pbmc6LioKLSAxNTQ0IDFlNGEgOEM5Rjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLDRcKQotLipXYXJuaW5nOi4qCi0gMTU0NSAxZTUwIDhDOUNBODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJwLDRcKQotIDE1NDYgMWU1NyA4QzlDQTk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVicCw0XCkKLSAxNTQ3IDFlNWUgOEM5Q0FBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYnAsNFwpCi0gMTU0OCAxZTY1IDhDOUNBQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJwLDRcKQotIDE1NDkgMWU2YyAzRThDOUNBQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVicCw0XCkKLSAxNTUwIDFlNzQgM0U4QzlDQUQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYnAsNFwpCi0gMTU1MSAxZTdjIDhDOUNBRTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJwLDRcKQotIDE1NTIgMWU4MyA4QzlDQUY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVicCw0XCkKLSAxNTUzIDFlOGEgOEM5Q0IwNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlc2ksNFwpCi0gMTU1NCAxZTkxIDhDOUNCMTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZXNpLDRcKQotIDE1NTUgMWU5OCA4QzlDQjI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVzaSw0XCkKLSAxNTU2IDFlOWYgOEM5Q0IzNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlc2ksNFwpCi0gMTU1NyAxZWE2IDNFOEM5Q0I0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZXNpLDRcKQotIDE1NTggMWVhZSAzRThDOUNCNSA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVzaSw0XCkKLSAxNTU5IDFlYjYgOEM5Q0I2NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlc2ksNFwpCi0gMTU2MCAxZWJkIDhDOUNCNzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZXNpLDRcKQotIDE1NjEgMWVjNCA4QzlDQjg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkaSw0XCkKLSAxNTYyIDFlY2IgOEM5Q0I5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZGksNFwpCi0gMTU2MyAxZWQyIDhDOUNCQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDRcKQotIDE1NjQgMWVkOSA4QzlDQkI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkaSw0XCkKLSAxNTY1IDFlZTAgM0U4QzlDQkMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZGksNFwpCi0gMTU2NiAxZWU4IDNFOEM5Q0JEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWRpLDRcKQotIDE1NjcgMWVmMCA4QzlDQkU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkaSw0XCkKLSAxNTY4IDFlZjcgOEM5Q0JGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZGksNFwpCi0gMTU2OSAxZWZlIDhDOUNDMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWF4LDhcKQotIDE1NzAgMWYwNSA4QzlDQzE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVheCw4XCkKLSAxNTcxIDFmMGMgOEM5Q0MyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYXgsOFwpCi0gMTU3MiAxZjEzIDhDOUNDMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWF4LDhcKQotIDE1NzMgMWYxYSAzRThDOUNDNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVheCw4XCkKLSAxNTc0IDFmMjIgM0U4QzlDQzUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYXgsOFwpCi0gMTU3NSAxZjJhIDhDOUNDNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWF4LDhcKQotIDE1NzYgMWYzMSA4QzlDQzc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVheCw4XCkKLSAxNTc3IDFmMzggOEM5Q0M4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlY3gsOFwpCi0gMTU3OCAxZjNmIDhDOUNDOTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCwlZWN4LDhcKQotIDE1NzkgMWY0NiA4QzlDQ0E3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsJWVjeCw4XCkKLSAxNTgwIDFmNGQgOEM5Q0NCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlY3gsOFwpCi0gMTU4MSAxZjU0IDNFOEM5Q0NDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWN4LDhcKQotIDE1ODIgMWY1YyAzRThDOUNDRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVjeCw4XCkKLSAxNTgzIDFmNjQgOEM5Q0NFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlY3gsOFwpCi0gMTU4NCAxZjZiIDhDOUNDRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWN4LDhcKQotIDE1ODUgMWY3MiA4QzlDRDA3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVkeCw4XCkKLSAxNTg2IDFmNzkgOEM5Q0QxNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlZHgsOFwpCi0gMTU4NyAxZjgwIDhDOUNEMjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWR4LDhcKQotIDE1ODggMWY4NyA4QzlDRDM3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVkeCw4XCkKLSAxNTg5IDFmOGUgM0U4QzlDRDQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlZHgsOFwpCi0gMTU5MCAxZjk2IDNFOEM5Q0Q1IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWR4LDhcKQotIDE1OTEgMWY5ZSA4QzlDRDY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVkeCw4XCkKLSAxNTkyIDFmYTUgOEM5Q0Q3NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlZHgsOFwpCi0gMTU5MyAxZmFjIDhDOUNEODc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZWJ4LDhcKQotIDE1OTQgMWZiMyA4QzlDRDk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVieCw4XCkKLSAxNTk1IDFmYmEgOEM5Q0RBNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlYngsOFwpCi0gMTU5NiAxZmMxIDhDOUNEQjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZWJ4LDhcKQotIDE1OTcgMWZjOCAzRThDOUNEQyA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVieCw4XCkKLSAxNTk4IDFmZDAgM0U4QzlDREQgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlYngsOFwpCi0gMTU5OSAxZmQ4IDhDOUNERTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZWJ4LDhcKQotIDE2MDAgMWZkZiA4QzlDREY3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVieCw4XCkKLSAxNjAxIDFmZTYgOEM5ODc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwMiAxZmVjIDhDOTk3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVjeCw4XCkKLS4qV2FybmluZzouKgotIDE2MDMgMWZmMiA4QzlBNzg1NiAzNDEyICAgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZHgsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA0IDFmZjggOEM5Qjc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LDhcKQotLipXYXJuaW5nOi4qCi0gMTYwNSAxZmZlIDNFOEM5QzI0IDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCw4XCkKLS4qV2FybmluZzouKgotIDE2MDYgMjAwNiAzRThDOUQ3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxNjA3IDIwMGQgOEM5RTc4NTYgMzQxMiAgICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLDhcKQotLipXYXJuaW5nOi4qCi0gMTYwOCAyMDEzIDhDOUY3ODU2IDM0MTIgICAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSw4XCkKLS4qV2FybmluZzouKgotIDE2MDkgMjAxOSA4QzlDRTg3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYXgsJWVicCw4XCkKLSAxNjEwIDIwMjAgOEM5Q0U5NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWN4LCVlYnAsOFwpCi0gMTYxMSAyMDI3IDhDOUNFQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWJwLDhcKQotIDE2MTIgMjAyZSA4QzlDRUI3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYngsJWVicCw4XCkKLSAxNjEzIDIwMzUgM0U4QzlDRUMgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNwLCVlYnAsOFwpCi0gMTYxNCAyMDNkIDNFOEM5Q0VEIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVicCwlZWJwLDhcKQotIDE2MTUgMjA0NSA4QzlDRUU3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc2ksJWVicCw4XCkKLSAxNjE2IDIwNGMgOEM5Q0VGNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWRpLCVlYnAsOFwpCi0gMTYxNyAyMDUzIDhDOUNGMDc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVheCwlZXNpLDhcKQotIDE2MTggMjA1YSA4QzlDRjE3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVzaSw4XCkKLSAxNjE5IDIwNjEgOEM5Q0YyNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWR4LCVlc2ksOFwpCi0gMTYyMCAyMDY4IDhDOUNGMzc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVieCwlZXNpLDhcKQotIDE2MjEgMjA2ZiAzRThDOUNGNCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlc3AsJWVzaSw4XCkKLSAxNjIyIDIwNzcgM0U4QzlDRjUgNzg1NjM0MTIgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJwLCVlc2ksOFwpCi0gMTYyMyAyMDdmIDhDOUNGNjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzaSwlZXNpLDhcKQotIDE2MjQgMjA4NiA4QzlDRjc3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlZGksJWVzaSw4XCkKLSAxNjI1IDIwOGQgOEM5Q0Y4NzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWF4LCVlZGksOFwpCi0gMTYyNiAyMDk0IDhDOUNGQTc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkeCwlZWRpLDhcKQotIDE2MjcgMjA5YiA4QzlDRjk3OCA1NjM0MTIgICAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlY3gsJWVkaSw4XCkKLSAxNjI4IDIwYTIgOEM5Q0ZCNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZWJ4LCVlZGksOFwpCi0gMTYyOSAyMGE5IDNFOEM5Q0ZDIDc4NTYzNDEyIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVzcCwlZWRpLDhcKQotIDE2MzAgMjBiMSAzRThDOUNGRCA3ODU2MzQxMiAJCW1vdgklZHMsJWRzOjB4MTIzNDU2NzhcKCVlYnAsJWVkaSw4XCkKLSAxNjMxIDIwYjkgOEM5Q0ZFNzggNTYzNDEyICAgCQltb3YJJWRzLCVkczoweDEyMzQ1Njc4XCglZXNpLCVlZGksOFwpCi0gMTYzMiAyMGMwIDhDOUNGRjc4IDU2MzQxMiAgIAkJbW92CSVkcywlZHM6MHgxMjM0NTY3OFwoJWVkaSwlZWRpLDhcKQotIDE2MzMgMjBjNyAzRThDNUMwNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWF4LDFcKQotIDE2MzQgMjBjYyAzRThDNUMwRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWN4LDFcKQotIDE2MzUgMjBkMSAzRThDNUMxNSAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWR4LDFcKQotIDE2MzYgMjBkNiAzRThDNUMxRCAwMCAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwlZWJ4LDFcKQotIDE2MzcgMjBkYiAzRThDNUQwMCAgICAgICAgICAJCW1vdgklZHMsJWRzOlwoJWVicCwxXCkKLSAxNjM4IDIwZGYgM0U4QzVDMkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCwxXCkKLSAxNjM5IDIwZTQgM0U4QzVDMzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSwxXCkKLSAxNjQwIDIwZTkgM0U4QzVDM0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSwxXCkKLSAxNjQxIDIwZWUgM0U4QzVDNDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCwyXCkKLSAxNjQyIDIwZjMgM0U4QzVDNEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCwyXCkKLSAxNjQzIDIwZjggM0U4QzVDNTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCwyXCkKLSAxNjQ0IDIwZmQgM0U4QzVDNUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCwyXCkKLSAxNjQ1IDIxMDIgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsMlwpCi0uKldhcm5pbmc6LioKLSAxNjQ2IDIxMDYgM0U4QzVDNkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCwyXCkKLSAxNjQ3IDIxMGIgM0U4QzVDNzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSwyXCkKLSAxNjQ4IDIxMTAgM0U4QzVDN0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSwyXCkKLSAxNjQ5IDIxMTUgM0U4QzVDODUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCw0XCkKLSAxNjUwIDIxMWEgM0U4QzVDOEQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCw0XCkKLSAxNjUxIDIxMWYgM0U4QzVDOTUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCw0XCkKLSAxNjUyIDIxMjQgM0U4QzVDOUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCw0XCkKLSAxNjUzIDIxMjkgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsNFwpCi0uKldhcm5pbmc6LioKLSAxNjU0IDIxMmQgM0U4QzVDQUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCw0XCkKLSAxNjU1IDIxMzIgM0U4QzVDQjUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSw0XCkKLSAxNjU2IDIxMzcgM0U4QzVDQkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSw0XCkKLSAxNjU3IDIxM2MgM0U4QzVDQzUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVheCw4XCkKLSAxNjU4IDIxNDEgM0U4QzVDQ0QgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVjeCw4XCkKLSAxNjU5IDIxNDYgM0U4QzVDRDUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkeCw4XCkKLSAxNjYwIDIxNGIgM0U4QzVDREQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVieCw4XCkKLSAxNjYxIDIxNTAgM0U4QzVEMDAgICAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsOFwpCi0uKldhcm5pbmc6LioKLSAxNjYyIDIxNTQgM0U4QzVDRUQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVicCw4XCkKLSAxNjYzIDIxNTkgM0U4QzVDRjUgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVzaSw4XCkKLSAxNjY0IDIxNWUgM0U4QzVDRkQgMDAgICAgICAgCQltb3YJJWRzLCVkczpcKCVlYnAsJWVkaSw4XCkKLSAxNjY1IDIxNjMgOEMxRDEyMDAgMDAwMCAgICAgCQltb3YJJWRzLCVkczoweDEyXCgsMVwpCi0gMTY2NiAyMTY5IDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDJcKQotLipXYXJuaW5nOi4qCi0gMTY2NyAyMTZmIDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDRcKQotLipXYXJuaW5nOi4qCi0gMTY2OCAyMTc1IDhDMUQxMjAwIDAwMDAgICAgIAkJbW92CSVkcywlZHM6MHgxMlwoLDhcKQotLipXYXJuaW5nOi4qCi0gMTY2OSBbIAldKgotIDE2NzAgWyAJXSogICAgIAkJIyBGb3JjZSBhIGdvb2QgYWxpZ25tZW50LgotIDE2NzEgMjE3YiAwMCBbIAldKgkuYnl0ZQkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L21vZHJtLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZmM2ODkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9tb2RybS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTY3MSArMCwwIEBACi0ucHNpemUgMAotLnRleHQKLQltb3YJJWRzLCVzczooJWVheCkKLQltb3YJJWRzLCVzczooJWVjeCkKLQltb3YJJWRzLCVzczooJWVkeCkKLQltb3YJJWRzLCVzczooJWVieCkKLQltb3YJJWRzLCVzczowCi0JbW92CSVkcywlc3M6KCVlc2kpCi0JbW92CSVkcywlc3M6KCVlZGkpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2kpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnApCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSkKLQltb3YJJWRzLCVlYXgKLQltb3YJJWRzLCVlY3gKLQltb3YJJWRzLCVlZHgKLQltb3YJJWRzLCVlYngKLQltb3YJJWRzLCVlc3AKLQltb3YJJWRzLCVlYnAKLQltb3YJJWRzLCVlc2kKLQltb3YJJWRzLCVlZGkKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJXNzOigsJWVheCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVzczooLCVlY3gsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCwlZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJXNzOigsJWVieCwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlYXgsMSkKLQltb3YJJWRzLCVzczooJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWR4LDEpCi0JbW92CSVkcywlc3M6KCVlYngsMSkKLQltb3YJJWRzLCVzczooJWVzcCwxKQotCW1vdgklZHMsJXNzOigsMSkKLQltb3YJJWRzLCVzczooJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCwxKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVzczooLCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCwxKQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCwlZXNpLDEpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJXNzOigsJWVkaSwxKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVheCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVzczooLCVlYXgsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVheCwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCwlZWN4LDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVheCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVieCwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJXNzOigsJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVieCwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVzczooLCVlYngsMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVieCwyKQotCW1vdgklZHMsJXNzOiglZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlY3gsMikKLQltb3YJJWRzLCVzczooJWVkeCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlc3AsMikKLQltb3YJJWRzLCVzczooLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJXNzOiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVheCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVieCwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJXNzOigsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVzczooJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVzczooJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVzczooLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkaSwyKQotCW1vdgklZHMsJXNzOiglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJXNzOigsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVzczooLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVkeCw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVzczooJWVheCw0KQotCW1vdgklZHMsJXNzOiglZWN4LDQpCi0JbW92CSVkcywlc3M6KCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVieCw0KQotCW1vdgklZHMsJXNzOiglZXNwLDQpCi0JbW92CSVkcywlc3M6KCw0KQotCW1vdgklZHMsJXNzOiglZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJXNzOigsJWVicCw0KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVzczooLCVlc2ksNCkKLQltb3YJJWRzLCVzczooJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6KCVlZGksJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCwlZWRpLDQpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVheCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJXNzOigsJWVheCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVzczooLCVlY3gsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCwlZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJXNzOigsJWVieCw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlYXgsOCkKLQltb3YJJWRzLCVzczooJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWR4LDgpCi0JbW92CSVkcywlc3M6KCVlYngsOCkKLQltb3YJJWRzLCVzczooJWVzcCw4KQotCW1vdgklZHMsJXNzOigsOCkKLQltb3YJJWRzLCVzczooJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYngsJWVicCw4KQotCW1vdgklZHMsJXNzOiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVzczooLCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlZGksJWVicCw4KQotCW1vdgklZHMsJXNzOiglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCwlZXNpLDgpCi0JbW92CSVkcywlc3M6KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVzczooJWVheCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVieCwlZWRpLDgpCi0JbW92CSVkcywlc3M6KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJXNzOigsJWVkaSw4KQotCW1vdgklZHMsJXNzOiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlY3gsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYnAsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlYngsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMiglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCVlZGksJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDEpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVheCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlY3gsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYngsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVieCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYnAsMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVicCwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZGksMikKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkaSwyKQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYXgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlYngsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVicCw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlc2ksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDQpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZGksNCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVheCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVjeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWN4LCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVieCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZHgsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYXgsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYngsJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc2ksJWVicCw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWF4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWJ4LCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlc3AsJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNpLCVlc2ksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWR4LCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZXNwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyMzQ1Njc4KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJXNzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDgpCi0JbW92CSVkcywlc3M6MHgxMjM0NTY3OCglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlc3M6KCVlYnAsMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDEpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlc3M6KCVlYnAsMikKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDIpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSwyKQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksMikKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDQpCi0JbW92CSVkcywlc3M6KCVlYnAsNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDQpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVzczooJWVicCwlZWF4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlc3M6KCVlYnAsOCkKLQltb3YJJWRzLCVzczooJWVicCwlZWJwLDgpCi0JbW92CSVkcywlc3M6KCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJXNzOiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVzczoweDEyKCwxKQotCW1vdgklZHMsJXNzOjB4MTIoLDIpCi0JbW92CSVkcywlc3M6MHgxMigsNCkKLQltb3YJJWRzLCVzczoweDEyKCw4KQotCW1vdgklZHMsJWRzOiglZWF4KQotCW1vdgklZHMsJWRzOiglZWN4KQotCW1vdgklZHMsJWRzOiglZWR4KQotCW1vdgklZHMsJWRzOiglZWJ4KQotCW1vdgklZHMsJWRzOjAKLQltb3YJJWRzLCVkczooJWVzaSkKLQltb3YJJWRzLCVkczooJWVkaSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGkpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2kpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpKQotCW1vdgklZHMsJWVheAotCW1vdgklZHMsJWVjeAotCW1vdgklZHMsJWVkeAotCW1vdgklZHMsJWVieAotCW1vdgklZHMsJWVzcAotCW1vdgklZHMsJWVicAotCW1vdgklZHMsJWVzaQotCW1vdgklZHMsJWVkaQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCwlZWF4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJWRzOigsJWVjeCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVkczooLCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVheCwxKQotCW1vdgklZHMsJWRzOiglZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlZHgsMSkKLQltb3YJJWRzLCVkczooJWVieCwxKQotCW1vdgklZHMsJWRzOiglZXNwLDEpCi0JbW92CSVkcywlZHM6KCwxKQotCW1vdgklZHMsJWRzOiglZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCwxKQotCW1vdgklZHMsJWRzOigsJWVicCwxKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVkczooLCVlc2ksMSkKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSwxKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCwlZWRpLDEpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksMSkKLQltb3YJJWRzLCVkczooJWVheCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVheCwyKQotCW1vdgklZHMsJWRzOigsJWVheCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVkczooLCVlY3gsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCwlZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlZHgsMikKLQltb3YJJWRzLCVkczooJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlYngsMikKLQltb3YJJWRzLCVkczooJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVieCwyKQotCW1vdgklZHMsJWRzOigsJWVieCwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6KCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVjeCwyKQotCW1vdgklZHMsJWRzOiglZWR4LDIpCi0JbW92CSVkcywlZHM6KCVlYngsMikKLQltb3YJJWRzLCVkczooJWVzcCwyKQotCW1vdgklZHMsJWRzOigsMikKLQltb3YJJWRzLCVkczooJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVkeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlYngsJWVicCwyKQotCW1vdgklZHMsJWRzOiglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVkczooLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6KCVlZGksJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJWRzOiglZWRpLCVlc2ksMikKLQltb3YJJWRzLCVkczooJWVheCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWR4LCVlZGksMikKLQltb3YJJWRzLCVkczooJWVieCwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJWRzOigsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZXNpLCVlZGksMikKLQltb3YJJWRzLCVkczooJWVkaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVheCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVkczooLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVheCw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVieCwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJWRzOigsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVieCw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVkczooLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVieCw0KQotCW1vdgklZHMsJWRzOiglZWF4LDQpCi0JbW92CSVkcywlZHM6KCVlY3gsNCkKLQltb3YJJWRzLCVkczooJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LDQpCi0JbW92CSVkcywlZHM6KCVlc3AsNCkKLQltb3YJJWRzLCVkczooLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCwlZWJwLDQpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVheCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZWR4LCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVieCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJWRzOigsJWVzaSw0KQotCW1vdgklZHMsJWRzOiglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVkczooJWVkaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVkczooLCVlZGksNCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCwlZWF4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJWRzOigsJWVjeCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVkczooLCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVieCw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVheCw4KQotCW1vdgklZHMsJWRzOiglZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlZHgsOCkKLQltb3YJJWRzLCVkczooJWVieCw4KQotCW1vdgklZHMsJWRzOiglZXNwLDgpCi0JbW92CSVkcywlZHM6KCw4KQotCW1vdgklZHMsJWRzOiglZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVheCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWR4LCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVieCwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlc3AsJWVicCw4KQotCW1vdgklZHMsJWRzOigsJWVicCw4KQotCW1vdgklZHMsJWRzOiglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVkaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6KCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlYngsJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVkczooLCVlc2ksOCkKLQltb3YJJWRzLCVkczooJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlZGksJWVzaSw4KQotCW1vdgklZHMsJWRzOiglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlY3gsJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVkczooJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCwlZWRpLDgpCi0JbW92CSVkcywlZHM6KCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWRpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVjeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWF4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlY3gsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJ4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc3AsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVicCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZGksJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVheCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlZHgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVieCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZXNwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYnAsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWRpLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYXgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWN4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlYngsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVzcCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMiglZWJwLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyKCVlc2ksJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoJWVkaSwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDEpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksMSkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSwxKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVheCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWF4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVjeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWN4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWR4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkeCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVieCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJ4LDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVicCwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJwLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZXNpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlc2ksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVzaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWRpLDIpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZGksMikKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVheCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlY3gsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVjeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlZHgsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVieCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJwLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYnAsNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVicCw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVzaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZXNpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlc2ksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZGksNCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkaSw0KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWRpLDQpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWF4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYXgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWN4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlY3gsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlZHgsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZWR4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlY3gsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWJ4LDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlYngsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkeCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVheCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWN4LCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVieCwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNwLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYnAsJWVicCw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzaSwlZWJwLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWRpLCVlYnAsOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYXgsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWR4LCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlYngsJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVzcCwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJwLCVlc2ksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc2ksJWVzaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVkaSwlZXNpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWF4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZHgsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVjeCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZWJ4LCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlc3AsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIzNDU2NzgoJWVicCwlZWRpLDgpCi0JbW92CSVkcywlZHM6MHgxMjM0NTY3OCglZXNpLCVlZGksOCkKLQltb3YJJWRzLCVkczoweDEyMzQ1Njc4KCVlZGksJWVkaSw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsMSkKLQltb3YJJWRzLCVkczooJWVicCwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsMSkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDEpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSwxKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsMikKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsMikKLQltb3YJJWRzLCVkczooJWVicCwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsMikKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDIpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSwyKQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsNCkKLQltb3YJJWRzLCVkczooJWVicCw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsNCkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDQpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSw0KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYXgsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZWN4LDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkeCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYngsOCkKLQltb3YJJWRzLCVkczooJWVicCw4KQotCW1vdgklZHMsJWRzOiglZWJwLCVlYnAsOCkKLQltb3YJJWRzLCVkczooJWVicCwlZXNpLDgpCi0JbW92CSVkcywlZHM6KCVlYnAsJWVkaSw4KQotCW1vdgklZHMsJWRzOjB4MTIoLDEpCi0JbW92CSVkcywlZHM6MHgxMigsMikKLQltb3YJJWRzLCVkczoweDEyKCw0KQotCW1vdgklZHMsJWRzOjB4MTIoLDgpCi0KLQkjIEZvcmNlIGEgZ29vZCBhbGlnbm1lbnQuCi0JLmJ5dGUJMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvb3Bjb2RlLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjQ5ZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUuZAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0jYXM6IC1KCi0jb2JqZHVtcDogLWR3Ci0jbmFtZTogaTM4NiBvcGNvZGUKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMCA8Zm9vPjoKLSAgIDA6CTAwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgIDY6CTAxIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRkICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gICBjOgkwMiA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDEyOgkwMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkZCAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICAxODoJMDQgOTAgWyAJXSphZGQgICAgXCQweDkwLCVhbAotICAxYToJMDUgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgMWY6CTA2IFsgCV0qcHVzaCAgICVlcwotICAyMDoJMDcgWyAJXSpwb3AgICAgJWVzCi0gIDIxOgkwOCA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDI3OgkwOSA5MCA5MCA5MCA5MCA5MCBbIAldKm9yICAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICAyZDoJMGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICAzMzoJMGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgMzk6CTBjIDkwIFsgCV0qb3IgICAgIFwkMHg5MCwlYWwKLSAgM2I6CTBkIDkwIDkwIDkwIDkwIFsgCV0qb3IgICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIDQwOgkwZSBbIAldKnB1c2ggICAlY3MKLSAgNDE6CTEwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgNDc6CTExIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDRkOgkxMiA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIDUzOgkxMyA5MCA5MCA5MCA5MCA5MCBbIAldKmFkYyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICA1OToJMTQgOTAgWyAJXSphZGMgICAgXCQweDkwLCVhbAotICA1YjoJMTUgOTAgOTAgOTAgOTAgWyAJXSphZGMgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgNjA6CTE2IFsgCV0qcHVzaCAgICVzcwotICA2MToJMTcgWyAJXSpwb3AgICAgJXNzCi0gIDYyOgkxOCA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIDY4OgkxOSA5MCA5MCA5MCA5MCA5MCBbIAldKnNiYiAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICA2ZToJMWEgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICA3NDoJMWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzYmIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgN2E6CTFjIDkwIFsgCV0qc2JiICAgIFwkMHg5MCwlYWwKLSAgN2M6CTFkIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIDgxOgkxZSBbIAldKnB1c2ggICAlZHMKLSAgODI6CTFmIFsgCV0qcG9wICAgICVkcwotICA4MzoJMjAgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICA4OToJMjEgOTAgOTAgOTAgOTAgOTAgWyAJXSphbmQgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgOGY6CTIyIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgOTU6CTIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIDliOgkyNCA5MCBbIAldKmFuZCAgICBcJDB4OTAsJWFsCi0gIDlkOgkyNSA5MCA5MCA5MCA5MCBbIAldKmFuZCAgICBcJDB4OTA5MDkwOTAsJWVheAotICBhMjoJMjcgWyAJXSpkYWEgICAgCi0gIGEzOgkyOCA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGE5OgkyOSA5MCA5MCA5MCA5MCA5MCBbIAldKnN1YiAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotICBhZjoJMmEgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotICBiNToJMmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAgYmI6CTJjIDkwIFsgCV0qc3ViICAgIFwkMHg5MCwlYWwKLSAgYmQ6CTJkIDkwIDkwIDkwIDkwIFsgCV0qc3ViICAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gIGMyOgkyZiBbIAldKmRhcyAgICAKLSAgYzM6CTMwIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAgYzk6CTMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeG9yICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gIGNmOgkzMiA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAweDkwOTA5MDkwXCglZWF4XCksJWRsCi0gIGQ1OgkzMyA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotICBkYjoJMzQgOTAgWyAJXSp4b3IgICAgXCQweDkwLCVhbAotICBkZDoJMzUgOTAgOTAgOTAgOTAgWyAJXSp4b3IgICAgXCQweDkwOTA5MDkwLCVlYXgKLSAgZTI6CTM3IFsgCV0qYWFhICAgIAotICBlMzoJMzggOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotICBlOToJMzkgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXAgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAgZWY6CTNhIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZGwKLSAgZjU6CTNiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gIGZiOgkzYyA5MCBbIAldKmNtcCAgICBcJDB4OTAsJWFsCi0gIGZkOgkzZCA5MCA5MCA5MCA5MCBbIAldKmNtcCAgICBcJDB4OTA5MDkwOTAsJWVheAotIDEwMjoJM2YgWyAJXSphYXMgICAgCi0gMTAzOgk0MCBbIAldKmluYyAgICAlZWF4Ci0gMTA0Ogk0MSBbIAldKmluYyAgICAlZWN4Ci0gMTA1Ogk0MiBbIAldKmluYyAgICAlZWR4Ci0gMTA2Ogk0MyBbIAldKmluYyAgICAlZWJ4Ci0gMTA3Ogk0NCBbIAldKmluYyAgICAlZXNwCi0gMTA4Ogk0NSBbIAldKmluYyAgICAlZWJwCi0gMTA5Ogk0NiBbIAldKmluYyAgICAlZXNpCi0gMTBhOgk0NyBbIAldKmluYyAgICAlZWRpCi0gMTBiOgk0OCBbIAldKmRlYyAgICAlZWF4Ci0gMTBjOgk0OSBbIAldKmRlYyAgICAlZWN4Ci0gMTBkOgk0YSBbIAldKmRlYyAgICAlZWR4Ci0gMTBlOgk0YiBbIAldKmRlYyAgICAlZWJ4Ci0gMTBmOgk0YyBbIAldKmRlYyAgICAlZXNwCi0gMTEwOgk0ZCBbIAldKmRlYyAgICAlZWJwCi0gMTExOgk0ZSBbIAldKmRlYyAgICAlZXNpCi0gMTEyOgk0ZiBbIAldKmRlYyAgICAlZWRpCi0gMTEzOgk1MCBbIAldKnB1c2ggICAlZWF4Ci0gMTE0Ogk1MSBbIAldKnB1c2ggICAlZWN4Ci0gMTE1Ogk1MiBbIAldKnB1c2ggICAlZWR4Ci0gMTE2Ogk1MyBbIAldKnB1c2ggICAlZWJ4Ci0gMTE3Ogk1NCBbIAldKnB1c2ggICAlZXNwCi0gMTE4Ogk1NSBbIAldKnB1c2ggICAlZWJwCi0gMTE5Ogk1NiBbIAldKnB1c2ggICAlZXNpCi0gMTFhOgk1NyBbIAldKnB1c2ggICAlZWRpCi0gMTFiOgk1OCBbIAldKnBvcCAgICAlZWF4Ci0gMTFjOgk1OSBbIAldKnBvcCAgICAlZWN4Ci0gMTFkOgk1YSBbIAldKnBvcCAgICAlZWR4Ci0gMTFlOgk1YiBbIAldKnBvcCAgICAlZWJ4Ci0gMTFmOgk1YyBbIAldKnBvcCAgICAlZXNwCi0gMTIwOgk1ZCBbIAldKnBvcCAgICAlZWJwCi0gMTIxOgk1ZSBbIAldKnBvcCAgICAlZXNpCi0gMTIyOgk1ZiBbIAldKnBvcCAgICAlZWRpCi0gMTIzOgk2MCBbIAldKnB1c2hhICAKLSAxMjQ6CTYxIFsgCV0qcG9wYSAgIAotIDEyNToJNjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpib3VuZCAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxMmI6CTYzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYXJwbCAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxMzE6CTY4IDkwIDkwIDkwIDkwIFsgCV0qcHVzaCAgIFwkMHg5MDkwOTA5MAotIDEzNjoJNjkgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweDkwOTA5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMTQwOgk2YSA5MCBbIAldKnB1c2ggICBcJDB4ZmZmZmZmOTAKLSAxNDI6CTZiIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDE0OToJNmMgWyAJXSppbnNiICAgXCglZHhcKSwlZXM6XCglZWRpXCkKLSAxNGE6CTZkIFsgCV0qaW5zbCAgIFwoJWR4XCksJWVzOlwoJWVkaVwpCi0gMTRiOgk2ZSBbIAldKm91dHNiICAlZHM6XCglZXNpXCksXCglZHhcKQotIDE0YzoJNmYgWyAJXSpvdXRzbCAgJWRzOlwoJWVzaVwpLFwoJWR4XCkKLSAxNGQ6CTcwIDkwIFsgCV0qam8gICAgICgweCk/ZGYuKgotIDE0ZjoJNzEgOTAgWyAJXSpqbm8gICAgKDB4KT9lMS4qCi0gMTUxOgk3MiA5MCBbIAldKmpiICAgICAoMHgpP2UzLioKLSAxNTM6CTczIDkwIFsgCV0qamFlICAgICgweCk/ZTUuKgotIDE1NToJNzQgOTAgWyAJXSpqZSAgICAgKDB4KT9lNy4qCi0gMTU3Ogk3NSA5MCBbIAldKmpuZSAgICAoMHgpP2U5LioKLSAxNTk6CTc2IDkwIFsgCV0qamJlICAgICgweCk/ZWIuKgotIDE1YjoJNzcgOTAgWyAJXSpqYSAgICAgKDB4KT9lZC4qCi0gMTVkOgk3OCA5MCBbIAldKmpzICAgICAoMHgpP2VmLioKLSAxNWY6CTc5IDkwIFsgCV0qam5zICAgICgweCk/ZjEuKgotIDE2MToJN2EgOTAgWyAJXSpqcCAgICAgKDB4KT9mMy4qCi0gMTYzOgk3YiA5MCBbIAldKmpucCAgICAoMHgpP2Y1LioKLSAxNjU6CTdjIDkwIFsgCV0qamwgICAgICgweCk/ZjcuKgotIDE2NzoJN2QgOTAgWyAJXSpqZ2UgICAgKDB4KT9mOS4qCi0gMTY5Ogk3ZSA5MCBbIAldKmpsZSAgICAoMHgpP2ZiLioKLSAxNmI6CTdmIDkwIFsgCV0qamcgICAgICgweCk/ZmQuKgotIDE2ZDoJODAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGNiICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE3NDoJODEgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGNsICAgXCQweDkwOTA5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE3ZToJODMgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGNsICAgXCQweGZmZmZmZjkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE4NToJODQgOTAgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgJWRsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDE4YjoJODUgOTAgOTAgOTAgOTAgOTAgWyAJXSp0ZXN0ICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOTE6CTg2IDkwIDkwIDkwIDkwIDkwIFsgCV0qeGNoZyAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSAxOTc6CTg3IDkwIDkwIDkwIDkwIDkwIFsgCV0qeGNoZyAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gMTlkOgk4OCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlZGwsMHg5MDkwOTA5MFwoJWVheFwpCi0gMWEzOgk4OSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDFhOToJOGEgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkbAotIDFhZjoJOGIgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAxYjU6CThjIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92bCAgICVzcywweDkwOTA5MDkwXCglZWF4XCkKLSAxYmI6CThkIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVhICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMWMxOgk4ZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdmwgICAweDkwOTA5MDkwXCglZWF4XCksJXNzCi0gMWM3Ogk4ZiA4MCA5MCA5MCA5MCA5MCBbIAldKnBvcGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSAxY2Q6CTkwIFsgCV0qbm9wICAgIAotIDFjZToJOTEgWyAJXSp4Y2hnICAgJWVheCwlZWN4Ci0gMWNmOgk5MiBbIAldKnhjaGcgICAlZWF4LCVlZHgKLSAxZDA6CTkzIFsgCV0qeGNoZyAgICVlYXgsJWVieAotIDFkMToJOTQgWyAJXSp4Y2hnICAgJWVheCwlZXNwCi0gMWQyOgk5NSBbIAldKnhjaGcgICAlZWF4LCVlYnAKLSAxZDM6CTk2IFsgCV0qeGNoZyAgICVlYXgsJWVzaQotIDFkNDoJOTcgWyAJXSp4Y2hnICAgJWVheCwlZWRpCi0gMWQ1Ogk5OCBbIAldKmN3dGwgICAKLSAxZDY6CTk5IFsgCV0qY2x0ZCAgIAotIDFkNzoJOWEgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSpsY2FsbCAgXCQweDkwOTAsXCQweDkwOTA5MDkwCi0gMWRlOgk5YiBbIAldKmZ3YWl0Ci0gMWRmOgk5YyBbIAldKnB1c2hmICAKLSAxZTA6CTlkIFsgCV0qcG9wZiAgIAotIDFlMToJOWUgWyAJXSpzYWhmICAgCi0gMWUyOgk5ZiBbIAldKmxhaGYgICAKLSAxZTM6CWEwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTAsJWFsCi0gMWU4OglhMSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAweDkwOTA5MDkwLCVlYXgKLSAxZWQ6CWEyIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVhbCwweDkwOTA5MDkwCi0gMWYyOglhMyA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICAlZWF4LDB4OTA5MDkwOTAKLSAxZjc6CWE0IFsgCV0qbW92c2IgICVkczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSAxZjg6CWE1IFsgCV0qbW92c2wgICVkczpcKCVlc2lcKSwlZXM6XCglZWRpXCkKLSAxZjk6CWE2IFsgCV0qY21wc2IgICVlczpcKCVlZGlcKSwlZHM6XCglZXNpXCkKLSAxZmE6CWE3IFsgCV0qY21wc2wgICVlczpcKCVlZGlcKSwlZHM6XCglZXNpXCkKLSAxZmI6CWE4IDkwIFsgCV0qdGVzdCAgIFwkMHg5MCwlYWwKLSAxZmQ6CWE5IDkwIDkwIDkwIDkwIFsgCV0qdGVzdCAgIFwkMHg5MDkwOTA5MCwlZWF4Ci0gMjAyOglhYSBbIAldKnN0b3MgICAlYWwsJWVzOlwoJWVkaVwpCi0gMjAzOglhYiBbIAldKnN0b3MgICAlZWF4LCVlczpcKCVlZGlcKQotIDIwNDoJYWMgWyAJXSpsb2RzICAgJWRzOlwoJWVzaVwpLCVhbAotIDIwNToJYWQgWyAJXSpsb2RzICAgJWRzOlwoJWVzaVwpLCVlYXgKLSAyMDY6CWFlIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlYWwKLSAyMDc6CWFmIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlZWF4Ci0gMjA4OgliMCA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWFsCi0gMjBhOgliMSA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWNsCi0gMjBjOgliMiA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWRsCi0gMjBlOgliMyA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWJsCi0gMjEwOgliNCA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWFoCi0gMjEyOgliNSA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWNoCi0gMjE0OgliNiA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWRoCi0gMjE2OgliNyA5MCBbIAldKm1vdiAgICBcJDB4OTAsJWJoCi0gMjE4OgliOCA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVheAotIDIxZDoJYjkgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlY3gKLSAyMjI6CWJhIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWR4Ci0gMjI3OgliYiA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVieAotIDIyYzoJYmMgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlc3AKLSAyMzE6CWJkIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwOTA5MCwlZWJwCi0gMjM2OgliZSA5MCA5MCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MDkwOTAsJWVzaQotIDIzYjoJYmYgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTA5MDkwLCVlZGkKLSAyNDA6CWMwIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsYiAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAyNDc6CWMxIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsbCAgIFwkMHg5MCwweDkwOTA5MDkwXCglZWF4XCkKLSAyNGU6CWMyIDkwIDkwIFsgCV0qcmV0ICAgIFwkMHg5MDkwCi0gMjUxOgljMyBbIAldKnJldCAgICAKLSAyNTI6CWM0IDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVzICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMjU4OgljNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxkcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDI1ZToJYzYgODAgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZiICAgXCQweDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI2NToJYzcgODAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZsICAgXCQweDkwOTA5MDkwLDB4OTA5MDkwOTBcKCVlYXhcKQotIDI2ZjoJYzggOTAgOTAgOTAgWyAJXSplbnRlciAgXCQweDkwOTAsXCQweDkwCi0gMjczOgljOSBbIAldKmxlYXZlICAKLSAyNzQ6CWNhIDkwIDkwIFsgCV0qbHJldCAgIFwkMHg5MDkwCi0gMjc3OgljYiBbIAldKmxyZXQgICAKLSAyNzg6CWNjIFsgCV0qaW50MyAgIAotIDI3OToJY2QgOTAgWyAJXSppbnQgICAgXCQweDkwCi0gMjdiOgljZSBbIAldKmludG8gICAKLSAyN2M6CWNmIFsgCV0qaXJldCAgIAotIDI3ZDoJZDAgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2xiICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMjgzOglkMSA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyODk6CWQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsYiAgICVjbCwweDkwOTA5MDkwXCglZWF4XCkKLSAyOGY6CWQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsbCAgICVjbCwweDkwOTA5MDkwXCglZWF4XCkKLSAyOTU6CWQ0IDkwIFsgCV0qYWFtICAgIFwkMHhmZmZmZmY5MAotIDI5NzoJZDUgOTAgWyAJXSphYWQgICAgXCQweGZmZmZmZjkwCi0gMjk5OglkNyBbIAldKnhsYXQgICAlZHM6XCglZWJ4XCkKLSAyOWE6CWQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qZmNvbXMgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJhMDoJZDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpmc3RzICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmE2OglkYSA5MCA5MCA5MCA5MCA5MCBbIAldKmZpY29tbCAweDkwOTA5MDkwXCglZWF4XCkKLSAyYWM6CWRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmlzdGwgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJiMjoJZGMgOTAgOTAgOTAgOTAgOTAgWyAJXSpmY29tbCAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmI4OglkZCA5MCA5MCA5MCA5MCA5MCBbIAldKmZzdGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyYmU6CWRlIDkwIDkwIDkwIDkwIDkwIFsgCV0qZmljb20gIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJjNDoJZGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpmaXN0ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMmNhOgllMCA5MCBbIAldKmxvb3BuZSAoMHgpPzI1Yy4qCi0gMmNjOgllMSA5MCBbIAldKmxvb3BlICAoMHgpPzI1ZS4qCi0gMmNlOgllMiA5MCBbIAldKmxvb3AgICAoMHgpPzI2MC4qCi0gMmQwOgllMyA5MCBbIAldKmplY3h6ICAoMHgpPzI2Mi4qCi0gMmQyOgllNCA5MCBbIAldKmluICAgICBcJDB4OTAsJWFsCi0gMmQ0OgllNSA5MCBbIAldKmluICAgICBcJDB4OTAsJWVheAotIDJkNjoJZTYgOTAgWyAJXSpvdXQgICAgJWFsLFwkMHg5MAotIDJkODoJZTcgOTAgWyAJXSpvdXQgICAgJWVheCxcJDB4OTAKLSAyZGE6CWU4IDkwIDkwIDkwIDkwIFsgCV0qY2FsbCAgICgweCk/OTA5MDkzNmYuKgotIDJkZjoJZTkgOTAgOTAgOTAgOTAgWyAJXSpqbXAgICAgKDB4KT85MDkwOTM3NC4qCi0gMmU0OgllYSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmxqbXAgICBcJDB4OTA5MCxcJDB4OTA5MDkwOTAKLSAyZWI6CWViIDkwIFsgCV0qam1wICAgICgweCk/MjdkLioKLSAyZWQ6CWVjIFsgCV0qaW4gICAgIFwoJWR4XCksJWFsCi0gMmVlOgllZCBbIAldKmluICAgICBcKCVkeFwpLCVlYXgKLSAyZWY6CWVlIFsgCV0qb3V0ICAgICVhbCxcKCVkeFwpCi0gMmYwOgllZiBbIAldKm91dCAgICAlZWF4LFwoJWR4XCkKLSAyZjE6CWY0IFsgCV0qaGx0ICAgIAotIDJmMjoJZjUgWyAJXSpjbWMgICAgCi0gMmYzOglmNiA5MCA5MCA5MCA5MCA5MCBbIAldKm5vdGIgICAweDkwOTA5MDkwXCglZWF4XCkKLSAyZjk6CWY3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90bCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDJmZjoJZjggWyAJXSpjbGMgICAgCi0gMzAwOglmOSBbIAldKnN0YyAgICAKLSAzMDE6CWZhIFsgCV0qY2xpICAgIAotIDMwMjoJZmIgWyAJXSpzdGkgICAgCi0gMzAzOglmYyBbIAldKmNsZCAgICAKLSAzMDQ6CWZkIFsgCV0qc3RkICAgIAotIDMwNToJZmYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjYWxsICAgXCoweDkwOTA5MDkwXCglZWF4XCkKLSAzMGI6CTBmIDAwIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGxkdCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDMxMjoJMGYgMDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZ2R0ICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gMzE5OgkwZiAwMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxhciAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDMyMDoJMGYgMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc2wgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzMjc6CTBmIDA2IFsgCV0qY2x0cyAgIAotIDMyOToJMGYgMDggWyAJXSppbnZkICAgCi0gMzJiOgkwZiAwOSBbIAldKndiaW52ZCAKLSAzMmQ6CTBmIDBiIFsgCV0qdWQyYSAgIAotIDMyZjoJMGYgMjAgZDAgWyAJXSptb3YgICAgJWNyMiwlZWF4Ci0gMzMyOgkwZiAyMSBkMCBbIAldKm1vdiAgICAlZGIyLCVlYXgKLSAzMzU6CTBmIDIyIGQwIFsgCV0qbW92ICAgICVlYXgsJWNyMgotIDMzODoJMGYgMjMgZDAgWyAJXSptb3YgICAgJWVheCwlZGIyCi0gMzNiOgkwZiAyNCBkMCBbIAldKm1vdiAgICAldHIyLCVlYXgKLSAzM2U6CTBmIDI2IGQwIFsgCV0qbW92ICAgICVlYXgsJXRyMgotIDM0MToJMGYgMzAgWyAJXSp3cm1zciAgCi0gMzQzOgkwZiAzMSBbIAldKnJkdHNjICAKLSAzNDU6CTBmIDMyIFsgCV0qcmRtc3IgIAotIDM0NzoJMGYgMzMgWyAJXSpyZHBtYyAgCi0gMzQ5OgkwZiA0MCA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZvICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM1MDoJMGYgNDEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92bm8gMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNTc6CTBmIDQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzVlOgkwZiA0MyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZhZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM2NToJMGYgNDQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92ZSAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzNmM6CTBmIDQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5lIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzczOgkwZiA0NiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZiZSAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM3YToJMGYgNDcgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92YSAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzODE6CTBmIDQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnMgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzg4OgkwZiA0OSA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZucyAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDM4ZjoJMGYgNGEgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92cCAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzOTY6CTBmIDRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5wIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gMzlkOgkwZiA0YyA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZsICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNhNDoJMGYgNGQgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbW92Z2UgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSAzYWI6CTBmIDRlIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmxlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gM2IyOgkwZiA0ZiA5MCA5MCA5MCA5MCA5MCBbIAldKmNtb3ZnICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDNiOToJMGYgNjAgOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2tsYncgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzYzA6CTBmIDYxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNrbHdkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2M3OgkwZiA2MiA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2xkcSAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNjZToJMGYgNjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWNrc3N3YiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNkNToJMGYgNjQgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZ3RiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2RjOgkwZiA2NSA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBndHcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZTM6CTBmIDY2IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGd0ZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNlYToJMGYgNjcgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWNrdXN3YiAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDNmMToJMGYgNjggOTAgOTAgOTAgOTAgOTAgWyAJXSpwdW5wY2toYncgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSAzZjg6CTBmIDY5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHVucGNraHdkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gM2ZmOgkwZiA2YSA5MCA5MCA5MCA5MCA5MCBbIAldKnB1bnBja2hkcSAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQwNjoJMGYgNmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWNrc3NkdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQwZDoJMGYgNmUgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3ZkICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MTQ6CTBmIDZmIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92cSAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDFiOgkwZiA3MSBkMCA5MCBbIAldKnBzcmx3ICBcJDB4OTAsJW1tMAotIDQxZjoJMGYgNzIgZDAgOTAgWyAJXSpwc3JsZCAgXCQweDkwLCVtbTAKLSA0MjM6CTBmIDczIGQwIDkwIFsgCV0qcHNybHEgIFwkMHg5MCwlbW0wCi0gNDI3OgkwZiA3NCA5MCA5MCA5MCA5MCA5MCBbIAldKnBjbXBlcWIgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA0MmU6CTBmIDc1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcGNtcGVxdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDQzNToJMGYgNzYgOTAgOTAgOTAgOTAgOTAgWyAJXSpwY21wZXFkIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNDNjOgkwZiA3NyBbIAldKmVtbXMgICAKLSA0M2U6CTBmIDdlIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ZCAgICVtbTIsMHg5MDkwOTA5MFwoJWVheFwpCi0gNDQ1OgkwZiA3ZiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnEgICAlbW0yLDB4OTA5MDkwOTBcKCVlYXhcKQotIDQ0YzoJMGYgODAgOTAgOTAgOTAgOTAgWyAJXSpqbyAgICAgKDB4KT85MDkwOTRlMi4qCi0gNDUyOgkwZiA4MSA5MCA5MCA5MCA5MCBbIAldKmpubyAgICAoMHgpPzkwOTA5NGU4LioKLSA0NTg6CTBmIDgyIDkwIDkwIDkwIDkwIFsgCV0qamIgICAgICgweCk/OTA5MDk0ZWUuKgotIDQ1ZToJMGYgODMgOTAgOTAgOTAgOTAgWyAJXSpqYWUgICAgKDB4KT85MDkwOTRmNC4qCi0gNDY0OgkwZiA4NCA5MCA5MCA5MCA5MCBbIAldKmplICAgICAoMHgpPzkwOTA5NGZhLioKLSA0NmE6CTBmIDg1IDkwIDkwIDkwIDkwIFsgCV0qam5lICAgICgweCk/OTA5MDk1MDAuKgotIDQ3MDoJMGYgODYgOTAgOTAgOTAgOTAgWyAJXSpqYmUgICAgKDB4KT85MDkwOTUwNi4qCi0gNDc2OgkwZiA4NyA5MCA5MCA5MCA5MCBbIAldKmphICAgICAoMHgpPzkwOTA5NTBjLioKLSA0N2M6CTBmIDg4IDkwIDkwIDkwIDkwIFsgCV0qanMgICAgICgweCk/OTA5MDk1MTIuKgotIDQ4MjoJMGYgODkgOTAgOTAgOTAgOTAgWyAJXSpqbnMgICAgKDB4KT85MDkwOTUxOC4qCi0gNDg4OgkwZiA4YSA5MCA5MCA5MCA5MCBbIAldKmpwICAgICAoMHgpPzkwOTA5NTFlLioKLSA0OGU6CTBmIDhiIDkwIDkwIDkwIDkwIFsgCV0qam5wICAgICgweCk/OTA5MDk1MjQuKgotIDQ5NDoJMGYgOGMgOTAgOTAgOTAgOTAgWyAJXSpqbCAgICAgKDB4KT85MDkwOTUyYS4qCi0gNDlhOgkwZiA4ZCA5MCA5MCA5MCA5MCBbIAldKmpnZSAgICAoMHgpPzkwOTA5NTMwLioKLSA0YTA6CTBmIDhlIDkwIDkwIDkwIDkwIFsgCV0qamxlICAgICgweCk/OTA5MDk1MzYuKgotIDRhNjoJMGYgOGYgOTAgOTAgOTAgOTAgWyAJXSpqZyAgICAgKDB4KT85MDkwOTUzYy4qCi0gNGFjOgkwZiA5MCA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG8gICAweDkwOTA5MDkwXCglZWF4XCkKLSA0YjM6CTBmIDkxIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0bm8gIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRiYToJMGYgOTIgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRiICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGMxOgkwZiA5MyA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGFlICAweDkwOTA5MDkwXCglZWF4XCkKLSA0Yzg6CTBmIDk0IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0ZSAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRjZjoJMGYgOTUgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRuZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGQ2OgkwZiA5NiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGJlICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZGQ6CTBmIDk3IDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0YSAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRlNDoJMGYgOTggODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRzICAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNGViOgkwZiA5OSA4MCA5MCA5MCA5MCA5MCBbIAldKnNldG5zICAweDkwOTA5MDkwXCglZWF4XCkKLSA0ZjI6CTBmIDlhIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0cCAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDRmOToJMGYgOWIgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRucCAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTAwOgkwZiA5YyA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGwgICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MDc6CTBmIDlkIDgwIDkwIDkwIDkwIDkwIFsgCV0qc2V0Z2UgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDUwZToJMGYgOWUgODAgOTAgOTAgOTAgOTAgWyAJXSpzZXRsZSAgMHg5MDkwOTA5MFwoJWVheFwpCi0gNTE1OgkwZiA5ZiA4MCA5MCA5MCA5MCA5MCBbIAldKnNldGcgICAweDkwOTA5MDkwXCglZWF4XCkKLSA1MWM6CTBmIGEwIFsgCV0qcHVzaCAgICVmcwotIDUxZToJMGYgYTEgWyAJXSpwb3AgICAgJWZzCi0gNTIwOgkwZiBhMiBbIAldKmNwdWlkICAKLSA1MjI6CTBmIGEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnQgICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTI5OgkwZiBhNCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICBcJDB4OTAsJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1MzE6CTBmIGE1IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hsZCAgICVjbCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDUzODoJMGYgYTggWyAJXSpwdXNoICAgJWdzCi0gNTNhOgkwZiBhOSBbIAldKnBvcCAgICAlZ3MKLSA1M2M6CTBmIGFhIFsgCV0qcnNtICAgIAotIDUzZToJMGYgYWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpidHMgICAgJWVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NDU6CTBmIGFjIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2hyZCAgIFwkMHg5MCwlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU0ZDoJMGYgYWQgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgJWNsLCVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTU0OgkwZiBhZiA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU1YjoJMGYgYjAgOTAgOTAgOTAgOTAgOTAgWyAJXSpjbXB4Y2hnICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSA1NjI6CTBmIGIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21weGNoZyAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU2OToJMGYgYjIgOTAgOTAgOTAgOTAgOTAgWyAJXSpsc3MgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1NzA6CTBmIGIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnRyICAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNTc3OgkwZiBiNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxmcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU3ZToJMGYgYjUgOTAgOTAgOTAgOTAgOTAgWyAJXSpsZ3MgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1ODU6CTBmIGI2IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92emJsIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNThjOgkwZiBiNyA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnp3bCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDU5MzoJMGYgYjkgWyAJXSp1ZDJiICAgCi0gNTk1OgkwZiBiYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0YyAgICAlZWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDU5YzoJMGYgYmMgOTAgOTAgOTAgOTAgOTAgWyAJXSpic2YgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1YTM6CTBmIGJkIDkwIDkwIDkwIDkwIDkwIFsgCV0qYnNyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZWR4Ci0gNWFhOgkwZiBiZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnNibCAweDkwOTA5MDkwXCglZWF4XCksJWVkeAotIDViMToJMGYgYmYgOTAgOTAgOTAgOTAgOTAgWyAJXSptb3Zzd2wgMHg5MDkwOTA5MFwoJWVheFwpLCVlZHgKLSA1Yjg6CTBmIGMwIDkwIDkwIDkwIDkwIDkwIFsgCV0qeGFkZCAgICVkbCwweDkwOTA5MDkwXCglZWF4XCkKLSA1YmY6CTBmIGMxIDkwIDkwIDkwIDkwIDkwIFsgCV0qeGFkZCAgICVlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNWM2OgkwZiBjOCBbIAldKmJzd2FwICAlZWF4Ci0gNWM4OgkwZiBjOSBbIAldKmJzd2FwICAlZWN4Ci0gNWNhOgkwZiBjYSBbIAldKmJzd2FwICAlZWR4Ci0gNWNjOgkwZiBjYiBbIAldKmJzd2FwICAlZWJ4Ci0gNWNlOgkwZiBjYyBbIAldKmJzd2FwICAlZXNwCi0gNWQwOgkwZiBjZCBbIAldKmJzd2FwICAlZWJwCi0gNWQyOgkwZiBjZSBbIAldKmJzd2FwICAlZXNpCi0gNWQ0OgkwZiBjZiBbIAldKmJzd2FwICAlZWRpCi0gNWQ2OgkwZiBkMSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmx3ICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVkZDoJMGYgZDIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3JsZCAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA1ZTQ6CTBmIGQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNybHEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWViOgkwZiBkNSA5MCA5MCA5MCA5MCA5MCBbIAldKnBtdWxsdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDVmMjoJMGYgZDggOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3VidXNiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNWY5OgkwZiBkOSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJ1c3cgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MDA6CTBmIGRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFuZCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjA3OgkwZiBkYyA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGR1c2IgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MGU6CTBmIGRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHVzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYxNToJMGYgZGYgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYW5kbiAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MWM6CTBmIGUxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNyYXcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjIzOgkwZiBlMiA5MCA5MCA5MCA5MCA5MCBbIAldKnBzcmFkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYyYToJMGYgZTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpwbXVsaHcgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2MzE6CTBmIGU4IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YnNiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjM4OgkwZiBlOSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDYzZjoJMGYgZWIgOTAgOTAgOTAgOTAgOTAgWyAJXSpwb3IgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NDY6CTBmIGVjIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHNiIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjRkOgkwZiBlZCA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRzdyAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY1NDoJMGYgZWYgOTAgOTAgOTAgOTAgOTAgWyAJXSpweG9yICAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NWI6CTBmIGYxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcHNsbHcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjYyOgkwZiBmMiA5MCA5MCA5MCA5MCA5MCBbIAldKnBzbGxkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY2OToJMGYgZjMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwc2xscSAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2NzA6CTBmIGY1IDkwIDkwIDkwIDkwIDkwIFsgCV0qcG1hZGR3ZCAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY3NzoJMGYgZjggOTAgOTAgOTAgOTAgOTAgWyAJXSpwc3ViYiAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2N2U6CTBmIGY5IDkwIDkwIDkwIDkwIDkwIFsgCV0qcHN1YncgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjg1OgkwZiBmYSA5MCA5MCA5MCA5MCA5MCBbIAldKnBzdWJkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDY4YzoJMGYgZmMgOTAgOTAgOTAgOTAgOTAgWyAJXSpwYWRkYiAgMHg5MDkwOTA5MFwoJWVheFwpLCVtbTIKLSA2OTM6CTBmIGZkIDkwIDkwIDkwIDkwIDkwIFsgCV0qcGFkZHcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlbW0yCi0gNjlhOgkwZiBmZSA5MCA5MCA5MCA5MCA5MCBbIAldKnBhZGRkICAweDkwOTA5MDkwXCglZWF4XCksJW1tMgotIDZhMToJNjYgMDEgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZhODoJNjYgMDMgOTAgOTAgOTAgOTAgOTAgWyAJXSphZGQgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZhZjoJNjYgMDUgOTAgOTAgWyAJXSphZGQgICAgXCQweDkwOTAsJWF4Ci0gNmIzOgk2NiAwNiBbIAldKnB1c2h3ICAlZXMKLSA2YjU6CTY2IDA3IFsgCV0qcG9wdyAgICVlcwotIDZiNzoJNjYgMDkgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDZiZToJNjYgMGIgOTAgOTAgOTAgOTAgOTAgWyAJXSpvciAgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDZjNToJNjYgMGQgOTAgOTAgWyAJXSpvciAgICAgXCQweDkwOTAsJWF4Ci0gNmM5Ogk2NiAwZSBbIAldKnB1c2h3ICAlY3MKLSA2Y2I6CTY2IDExIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2ZDI6CTY2IDEzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA2ZDk6CTY2IDE1IDkwIDkwIFsgCV0qYWRjICAgIFwkMHg5MDkwLCVheAotIDZkZDoJNjYgMTYgWyAJXSpwdXNodyAgJXNzCi0gNmRmOgk2NiAxNyBbIAldKnBvcHcgICAlc3MKLSA2ZTE6CTY2IDE5IDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2ZTg6CTY2IDFiIDkwIDkwIDkwIDkwIDkwIFsgCV0qc2JiICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA2ZWY6CTY2IDFkIDkwIDkwIFsgCV0qc2JiICAgIFwkMHg5MDkwLCVheAotIDZmMzoJNjYgMWUgWyAJXSpwdXNodyAgJWRzCi0gNmY1Ogk2NiAxZiBbIAldKnBvcHcgICAlZHMKLSA2Zjc6CTY2IDIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA2ZmU6CTY2IDIzIDkwIDkwIDkwIDkwIDkwIFsgCV0qYW5kICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3MDU6CTY2IDI1IDkwIDkwIFsgCV0qYW5kICAgIFwkMHg5MDkwLCVheAotIDcwOToJNjYgMjkgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDcxMDoJNjYgMmIgOTAgOTAgOTAgOTAgOTAgWyAJXSpzdWIgICAgMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDcxNzoJNjYgMmQgOTAgOTAgWyAJXSpzdWIgICAgXCQweDkwOTAsJWF4Ci0gNzFiOgk2NiAzMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzIyOgk2NiAzMyA5MCA5MCA5MCA5MCA5MCBbIAldKnhvciAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gNzI5Ogk2NiAzNSA5MCA5MCBbIAldKnhvciAgICBcJDB4OTA5MCwlYXgKLSA3MmQ6CTY2IDM5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3MzQ6CTY2IDNiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21wICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3M2I6CTY2IDNkIDkwIDkwIFsgCV0qY21wICAgIFwkMHg5MDkwLCVheAotIDczZjoJNjYgNDAgWyAJXSppbmMgICAgJWF4Ci0gNzQxOgk2NiA0MSBbIAldKmluYyAgICAlY3gKLSA3NDM6CTY2IDQyIFsgCV0qaW5jICAgICVkeAotIDc0NToJNjYgNDMgWyAJXSppbmMgICAgJWJ4Ci0gNzQ3Ogk2NiA0NCBbIAldKmluYyAgICAlc3AKLSA3NDk6CTY2IDQ1IFsgCV0qaW5jICAgICVicAotIDc0YjoJNjYgNDYgWyAJXSppbmMgICAgJXNpCi0gNzRkOgk2NiA0NyBbIAldKmluYyAgICAlZGkKLSA3NGY6CTY2IDQ4IFsgCV0qZGVjICAgICVheAotIDc1MToJNjYgNDkgWyAJXSpkZWMgICAgJWN4Ci0gNzUzOgk2NiA0YSBbIAldKmRlYyAgICAlZHgKLSA3NTU6CTY2IDRiIFsgCV0qZGVjICAgICVieAotIDc1NzoJNjYgNGMgWyAJXSpkZWMgICAgJXNwCi0gNzU5Ogk2NiA0ZCBbIAldKmRlYyAgICAlYnAKLSA3NWI6CTY2IDRlIFsgCV0qZGVjICAgICVzaQotIDc1ZDoJNjYgNGYgWyAJXSpkZWMgICAgJWRpCi0gNzVmOgk2NiA1MCBbIAldKnB1c2ggICAlYXgKLSA3NjE6CTY2IDUxIFsgCV0qcHVzaCAgICVjeAotIDc2MzoJNjYgNTIgWyAJXSpwdXNoICAgJWR4Ci0gNzY1Ogk2NiA1MyBbIAldKnB1c2ggICAlYngKLSA3Njc6CTY2IDU0IFsgCV0qcHVzaCAgICVzcAotIDc2OToJNjYgNTUgWyAJXSpwdXNoICAgJWJwCi0gNzZiOgk2NiA1NiBbIAldKnB1c2ggICAlc2kKLSA3NmQ6CTY2IDU3IFsgCV0qcHVzaCAgICVkaQotIDc2ZjoJNjYgNTggWyAJXSpwb3AgICAgJWF4Ci0gNzcxOgk2NiA1OSBbIAldKnBvcCAgICAlY3gKLSA3NzM6CTY2IDVhIFsgCV0qcG9wICAgICVkeAotIDc3NToJNjYgNWIgWyAJXSpwb3AgICAgJWJ4Ci0gNzc3Ogk2NiA1YyBbIAldKnBvcCAgICAlc3AKLSA3Nzk6CTY2IDVkIFsgCV0qcG9wICAgICVicAotIDc3YjoJNjYgNWUgWyAJXSpwb3AgICAgJXNpCi0gNzdkOgk2NiA1ZiBbIAldKnBvcCAgICAlZGkKLSA3N2Y6CTY2IDYwIFsgCV0qcHVzaGF3IAotIDc4MToJNjYgNjEgWyAJXSpwb3BhdyAgCi0gNzgzOgk2NiA2MiA5MCA5MCA5MCA5MCA5MCBbIAldKmJvdW5kICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gNzhhOgk2NiA2OCA5MCA5MCBbIAldKnB1c2h3ICBcJDB4OTA5MAotIDc4ZToJNjYgNjkgOTAgOTAgOTAgOTAgOTAgOTAgOTAgWyAJXSppbXVsICAgXCQweDkwOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDc5NzoJNjYgNmEgOTAgWyAJXSpwdXNodyAgXCQweGZmZmZmZjkwCi0gNzlhOgk2NiA2YiA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmltdWwgICBcJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MFwoJWVheFwpLCVkeAotIDdhMjoJNjYgNmQgWyAJXSppbnN3ICAgXCglZHhcKSwlZXM6XCglZWRpXCkKLSA3YTQ6CTY2IDZmIFsgCV0qb3V0c3cgICVkczpcKCVlc2lcKSxcKCVkeFwpCi0gN2E2Ogk2NiA4MSA5MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKmFkY3cgICBcJDB4OTA5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA3YWY6CTY2IDgzIDkwIDkwIDkwIDkwIDkwIDkwIFsgCV0qYWRjdyAgIFwkMHhmZmZmZmY5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA3Yjc6CTY2IDg1IDkwIDkwIDkwIDkwIDkwIFsgCV0qdGVzdCAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3YmU6CTY2IDg3IDkwIDkwIDkwIDkwIDkwIFsgCV0qeGNoZyAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3YzU6CTY2IDg5IDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA3Y2M6CTY2IDhiIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3ZDM6CTY2IDhjIDkwIDkwIDkwIDkwIDkwIFsgCV0qbW92dyAgICVzcywweDkwOTA5MDkwXCglZWF4XCkKLSA3ZGE6CTY2IDhkIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGVhICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA3ZTE6CTY2IDhmIDgwIDkwIDkwIDkwIDkwIFsgCV0qcG9wdyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDdlODoJNjYgOTEgWyAJXSp4Y2hnICAgJWF4LCVjeAotIDdlYToJNjYgOTIgWyAJXSp4Y2hnICAgJWF4LCVkeAotIDdlYzoJNjYgOTMgWyAJXSp4Y2hnICAgJWF4LCVieAotIDdlZToJNjYgOTQgWyAJXSp4Y2hnICAgJWF4LCVzcAotIDdmMDoJNjYgOTUgWyAJXSp4Y2hnICAgJWF4LCVicAotIDdmMjoJNjYgOTYgWyAJXSp4Y2hnICAgJWF4LCVzaQotIDdmNDoJNjYgOTcgWyAJXSp4Y2hnICAgJWF4LCVkaQotIDdmNjoJNjYgOTggWyAJXSpjYnR3ICAgCi0gN2Y4Ogk2NiA5OSBbIAldKmN3dGQgICAKLSA3ZmE6CTY2IDlhIDkwIDkwIDkwIDkwIFsgCV0qbGNhbGx3IFwkMHg5MDkwLFwkMHg5MDkwCi0gODAwOgk2NiA5YyBbIAldKnB1c2hmdyAKLSA4MDI6CTY2IDlkIFsgCV0qcG9wZncgIAotIDgwNDoJNjYgYTEgOTAgOTAgOTAgOTAgWyAJXSptb3YgICAgMHg5MDkwOTA5MCwlYXgKLSA4MGE6CTY2IGEzIDkwIDkwIDkwIDkwIFsgCV0qbW92ICAgICVheCwweDkwOTA5MDkwCi0gODEwOgk2NiBhNSBbIAldKm1vdnN3ICAlZHM6XCglZXNpXCksJWVzOlwoJWVkaVwpCi0gODEyOgk2NiBhNyBbIAldKmNtcHN3ICAlZXM6XCglZWRpXCksJWRzOlwoJWVzaVwpCi0gODE0Ogk2NiBhOSA5MCA5MCBbIAldKnRlc3QgICBcJDB4OTA5MCwlYXgKLSA4MTg6CTY2IGFiIFsgCV0qc3RvcyAgICVheCwlZXM6XCglZWRpXCkKLSA4MWE6CTY2IGFkIFsgCV0qbG9kcyAgICVkczpcKCVlc2lcKSwlYXgKLSA4MWM6CTY2IGFmIFsgCV0qc2NhcyAgICVlczpcKCVlZGlcKSwlYXgKLSA4MWU6CTY2IGI4IDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVheAotIDgyMjoJNjYgYjkgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWN4Ci0gODI2Ogk2NiBiYSA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlZHgKLSA4MmE6CTY2IGJiIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVieAotIDgyZToJNjYgYmMgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJXNwCi0gODMyOgk2NiBiZCA5MCA5MCBbIAldKm1vdiAgICBcJDB4OTA5MCwlYnAKLSA4MzY6CTY2IGJlIDkwIDkwIFsgCV0qbW92ICAgIFwkMHg5MDkwLCVzaQotIDgzYToJNjYgYmYgOTAgOTAgWyAJXSptb3YgICAgXCQweDkwOTAsJWRpCi0gODNlOgk2NiBjMSA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnJjbHcgICBcJDB4OTAsMHg5MDkwOTA5MFwoJWVheFwpCi0gODQ2Ogk2NiBjMiA5MCA5MCBbIAldKnJldHcgICBcJDB4OTA5MAotIDg0YToJNjYgYzMgWyAJXSpyZXR3ICAgCi0gODRjOgk2NiBjNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxlcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gODUzOgk2NiBjNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxkcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gODVhOgk2NiBjNyA4MCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdncgICBcJDB4OTA5MCwweDkwOTA5MDkwXCglZWF4XCkKLSA4NjM6CTY2IGM4IDkwIDkwIDkwIFsgCV0qZW50ZXJ3IFwkMHg5MDkwLFwkMHg5MAotIDg2ODoJNjYgYzkgWyAJXSpsZWF2ZXcgCi0gODZhOgk2NiBjYSA5MCA5MCBbIAldKmxyZXR3ICBcJDB4OTA5MAotIDg2ZToJNjYgY2IgWyAJXSpscmV0dyAgCi0gODcwOgk2NiBjZiBbIAldKmlyZXR3ICAKLSA4NzI6CTY2IGQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qcmNsdyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDg3OToJNjYgZDMgOTAgOTAgOTAgOTAgOTAgWyAJXSpyY2x3ICAgJWNsLDB4OTA5MDkwOTBcKCVlYXhcKQotIDg4MDoJNjYgZTUgOTAgWyAJXSppbiAgICAgXCQweDkwLCVheAotIDg4MzoJNjYgZTcgOTAgWyAJXSpvdXQgICAgJWF4LFwkMHg5MAotIDg4NjoJNjYgZTggOGYgOTAgWyAJXSpjYWxsdyAgKDB4KT85OTE5LioKLSA4OGE6CTY2IGVhIDkwIDkwIDkwIDkwIFsgCV0qbGptcHcgIFwkMHg5MDkwLFwkMHg5MDkwCi0gODkwOgk2NiBlZCBbIAldKmluICAgICBcKCVkeFwpLCVheAotIDg5MjoJNjYgZWYgWyAJXSpvdXQgICAgJWF4LFwoJWR4XCkKLSA4OTQ6CTY2IGY3IDkwIDkwIDkwIDkwIDkwIFsgCV0qbm90dyAgIDB4OTA5MDkwOTBcKCVlYXhcKQotIDg5YjoJNjYgZmYgOTAgOTAgOTAgOTAgOTAgWyAJXSpjYWxsdyAgXCoweDkwOTA5MDkwXCglZWF4XCkKLSA4YTI6CTY2IDBmIDAyIDkwIDkwIDkwIDkwIDkwIFsgCV0qbGFyICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4YWE6CTY2IDBmIDAzIDkwIDkwIDkwIDkwIDkwIFsgCV0qbHNsICAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4YjI6CTY2IDBmIDQwIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm8gIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4YmE6CTY2IDBmIDQxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5vIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4YzI6CTY2IDBmIDQyIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmIgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4Y2E6CTY2IDBmIDQzIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmFlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZDI6CTY2IDBmIDQ0IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmUgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZGE6CTY2IDBmIDQ1IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5lIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZTI6CTY2IDBmIDQ2IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmJlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZWE6CTY2IDBmIDQ3IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmEgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZjI6CTY2IDBmIDQ4IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnMgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA4ZmE6CTY2IDBmIDQ5IDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5zIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MDI6CTY2IDBmIDRhIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdnAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MGE6CTY2IDBmIDRiIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdm5wIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MTI6CTY2IDBmIDRjIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmwgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MWE6CTY2IDBmIDRkIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmdlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MjI6CTY2IDBmIDRlIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmxlIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MmE6CTY2IDBmIDRmIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21vdmcgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5MzI6CTY2IDBmIGEwIFsgCV0qcHVzaHcgICVmcwotIDkzNToJNjYgMGYgYTEgWyAJXSpwb3B3ICAgJWZzCi0gOTM4Ogk2NiAwZiBhMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ICAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTQwOgk2NiAwZiBhNCA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNobGQgICBcJDB4OTAsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk0OToJNjYgMGYgYTUgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaGxkICAgJWNsLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NTE6CTY2IDBmIGE4IFsgCV0qcHVzaHcgICVncwotIDk1NDoJNjYgMGYgYTkgWyAJXSpwb3B3ICAgJWdzCi0gOTU3Ogk2NiAwZiBhYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0cyAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTVmOgk2NiAwZiBhYyA5MCA5MCA5MCA5MCA5MCA5MCBbIAldKnNocmQgICBcJDB4OTAsJWR4LDB4OTA5MDkwOTBcKCVlYXhcKQotIDk2ODoJNjYgMGYgYWQgOTAgOTAgOTAgOTAgOTAgWyAJXSpzaHJkICAgJWNsLCVkeCwweDkwOTA5MDkwXCglZWF4XCkKLSA5NzA6CTY2IDBmIGFmIDkwIDkwIDkwIDkwIDkwIFsgCV0qaW11bCAgIDB4OTA5MDkwOTBcKCVlYXhcKSwlZHgKLSA5Nzg6CTY2IDBmIGIxIDkwIDkwIDkwIDkwIDkwIFsgCV0qY21weGNoZyAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTgwOgk2NiAwZiBiMiA5MCA5MCA5MCA5MCA5MCBbIAldKmxzcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTg4Ogk2NiAwZiBiMyA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0ciAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOTkwOgk2NiAwZiBiNCA5MCA5MCA5MCA5MCA5MCBbIAldKmxmcyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOTk4Ogk2NiAwZiBiNSA5MCA5MCA5MCA5MCA5MCBbIAldKmxncyAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWEwOgk2NiAwZiBiNiA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnpidyAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWE4Ogk2NiAwZiBiYiA5MCA5MCA5MCA5MCA5MCBbIAldKmJ0YyAgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCi0gOWIwOgk2NiAwZiBiYyA5MCA5MCA5MCA5MCA5MCBbIAldKmJzZiAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWI4Ogk2NiAwZiBiZCA5MCA5MCA5MCA5MCA5MCBbIAldKmJzciAgICAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWMwOgk2NiAwZiBiZSA5MCA5MCA5MCA5MCA5MCBbIAldKm1vdnNidyAweDkwOTA5MDkwXCglZWF4XCksJWR4Ci0gOWM4Ogk2NiAwZiBjMSA5MCA5MCA5MCA5MCA5MCBbIAldKnhhZGQgICAlZHgsMHg5MDkwOTA5MFwoJWVheFwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9vcGNvZGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzljNTk2Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L29wY29kZS5zCisrKyAvZGV2L251bGwKQEAgLTEsNTY3ICswLDAgQEAKLS50ZXh0Ci1mb286Ci0gYWRkICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gYWRkICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGFkZCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBhZGQgICAgJDB4OTAsJWFsCi0gYWRkICAgICQweDkwOTA5MDkwLCVlYXgKLSBwdXNoICAgJWVzCi0gcG9wICAgICVlcwotIG9yICAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIG9yICAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBvciAgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBvciAgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gb3IgICAgICQweDkwLCVhbAotIG9yICAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gcHVzaCAgICVjcwotIGFkYyAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIGFkYyAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhZGMgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBhZGMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gYWRjICAgICQweDkwLCVhbAotIGFkYyAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gcHVzaCAgICVzcwotIHBvcCAgICAlc3MKLSBzYmIgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBzYmIgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2JiICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gc2JiICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHNiYiAgICAkMHg5MCwlYWwKLSBzYmIgICAgJDB4OTA5MDkwOTAsJWVheAotIHB1c2ggICAlZHMKLSBwb3AgICAgJWRzCi0gYW5kICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gYW5kICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFuZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGFuZCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBhbmQgICAgJDB4OTAsJWFsCi0gYW5kICAgICQweDkwOTA5MDkwLCVlYXgKLSBkYWEKLSBzdWIgICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBzdWIgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc3ViICAgIDB4OTA5MDkwOTAoJWVheCksJWRsCi0gc3ViICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHN1YiAgICAkMHg5MCwlYWwKLSBzdWIgICAgJDB4OTA5MDkwOTAsJWVheAotIGRhcwotIHhvciAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHhvciAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4b3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSB4b3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0geG9yICAgICQweDkwLCVhbAotIHhvciAgICAkMHg5MDkwOTA5MCwlZWF4Ci0gYWFhCi0gY21wICAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0gY21wICAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGNtcCAgICAweDkwOTA5MDkwKCVlYXgpLCVkbAotIGNtcCAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbXAgICAgJDB4OTAsJWFsCi0gY21wICAgICQweDkwOTA5MDkwLCVlYXgKLSBhYXMKLSBpbmMgICAgJWVheAotIGluYyAgICAlZWN4Ci0gaW5jICAgICVlZHgKLSBpbmMgICAgJWVieAotIGluYyAgICAlZXNwCi0gaW5jICAgICVlYnAKLSBpbmMgICAgJWVzaQotIGluYyAgICAlZWRpCi0gZGVjICAgICVlYXgKLSBkZWMgICAgJWVjeAotIGRlYyAgICAlZWR4Ci0gZGVjICAgICVlYngKLSBkZWMgICAgJWVzcAotIGRlYyAgICAlZWJwCi0gZGVjICAgICVlc2kKLSBkZWMgICAgJWVkaQotIHB1c2ggICAlZWF4Ci0gcHVzaCAgICVlY3gKLSBwdXNoICAgJWVkeAotIHB1c2ggICAlZWJ4Ci0gcHVzaCAgICVlc3AKLSBwdXNoICAgJWVicAotIHB1c2ggICAlZXNpCi0gcHVzaCAgICVlZGkKLSBwb3AgICAgJWVheAotIHBvcCAgICAlZWN4Ci0gcG9wICAgICVlZHgKLSBwb3AgICAgJWVieAotIHBvcCAgICAlZXNwCi0gcG9wICAgICVlYnAKLSBwb3AgICAgJWVzaQotIHBvcCAgICAlZWRpCi0gcHVzaGEKLSBwb3BhCi0gYm91bmQgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFycGwgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHB1c2ggICAkMHg5MDkwOTA5MAotIGltdWwgICAkMHg5MDkwOTA5MCwweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBwdXNoICAgJDB4ZmZmZmZmOTAKLSBpbXVsICAgJDB4ZmZmZmZmOTAsMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gaW5zYiAgICglZHgpLCVlczooJWVkaSkKLSBpbnNsICAgKCVkeCksJWVzOiglZWRpKQotIG91dHNiICAlZHM6KCVlc2kpLCglZHgpCi0gb3V0c2wgICVkczooJWVzaSksKCVkeCkKLSBqbyAgICAgLisyLTB4NzAKLSBqbm8gICAgLisyLTB4NzAKLSBqYiAgICAgLisyLTB4NzAKLSBqYWUgICAgLisyLTB4NzAKLSBqZSAgICAgLisyLTB4NzAKLSBqbmUgICAgLisyLTB4NzAKLSBqYmUgICAgLisyLTB4NzAKLSBqYSAgICAgLisyLTB4NzAKLSBqcyAgICAgLisyLTB4NzAKLSBqbnMgICAgLisyLTB4NzAKLSBqcCAgICAgLisyLTB4NzAKLSBqbnAgICAgLisyLTB4NzAKLSBqbCAgICAgLisyLTB4NzAKLSBqZ2UgICAgLisyLTB4NzAKLSBqbGUgICAgLisyLTB4NzAKLSBqZyAgICAgLisyLTB4NzAKLSBhZGNiICAgJDB4OTAsMHg5MDkwOTA5MCglZWF4KQotIGFkY2wgICAkMHg5MDkwOTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjbCAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCkKLSB0ZXN0ICAgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSB0ZXN0ICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVkbCwweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIG1vdiAgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBtb3YgICAgMHg5MDkwOTA5MCglZWF4KSwlZGwKLSBtb3YgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92bCAgICVzcywweDkwOTA5MDkwKCVlYXgpCi0gbGVhICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIG1vdmwgICAweDkwOTA5MDkwKCVlYXgpLCVzcwotIHBvcGwgICAweDkwOTA5MDkwKCVlYXgpCi0geGNoZyAgICVlYXgsJWVheAotIHhjaGcgICAlZWF4LCVlY3gKLSB4Y2hnICAgJWVheCwlZWR4Ci0geGNoZyAgICVlYXgsJWVieAotIHhjaGcgICAlZWF4LCVlc3AKLSB4Y2hnICAgJWVheCwlZWJwCi0geGNoZyAgICVlYXgsJWVzaQotIHhjaGcgICAlZWF4LCVlZGkKLSBjd3RsCi0gY2x0ZAotIGxjYWxsICAkMHg5MDkwLCQweDkwOTA5MDkwCi0gZndhaXQKLSBwdXNoZgotIHBvcGYKLSBzYWhmCi0gbGFoZgotIG1vdiAgICAweDkwOTA5MDkwLCVhbAotIG1vdiAgICAweDkwOTA5MDkwLCVlYXgKLSBtb3YgICAgJWFsLDB4OTA5MDkwOTAKLSBtb3YgICAgJWVheCwweDkwOTA5MDkwCi0gbW92c2IgICVkczooJWVzaSksJWVzOiglZWRpKQotIG1vdnNsICAlZHM6KCVlc2kpLCVlczooJWVkaSkKLSBjbXBzYiAgJWVzOiglZWRpKSwlZHM6KCVlc2kpCi0gY21wc2wgICVlczooJWVkaSksJWRzOiglZXNpKQotIHRlc3QgICAkMHg5MCwlYWwKLSB0ZXN0ICAgJDB4OTA5MDkwOTAsJWVheAotIHN0b3MgICAlYWwsJWVzOiglZWRpKQotIHN0b3MgICAlZWF4LCVlczooJWVkaSkKLSBsb2RzICAgJWRzOiglZXNpKSwlYWwKLSBsb2RzICAgJWRzOiglZXNpKSwlZWF4Ci0gc2NhcyAgICVlczooJWVkaSksJWFsCi0gc2NhcyAgICVlczooJWVkaSksJWVheAotIG1vdiAgICAkMHg5MCwlYWwKLSBtb3YgICAgJDB4OTAsJWNsCi0gbW92ICAgICQweDkwLCVkbAotIG1vdiAgICAkMHg5MCwlYmwKLSBtb3YgICAgJDB4OTAsJWFoCi0gbW92ICAgICQweDkwLCVjaAotIG1vdiAgICAkMHg5MCwlZGgKLSBtb3YgICAgJDB4OTAsJWJoCi0gbW92ICAgICQweDkwOTA5MDkwLCVlYXgKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVjeAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWR4Ci0gbW92ICAgICQweDkwOTA5MDkwLCVlYngKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVzcAotIG1vdiAgICAkMHg5MDkwOTA5MCwlZWJwCi0gbW92ICAgICQweDkwOTA5MDkwLCVlc2kKLSBtb3YgICAgJDB4OTA5MDkwOTAsJWVkaQotIHJjbGIgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gcmNsbCAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSByZXQgICAgJDB4OTA5MAotIHJldAotIGxlcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBsZHMgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92YiAgICQweDkwLDB4OTA5MDkwOTAoJWVheCkKLSBtb3ZsICAgJDB4OTA5MDkwOTAsMHg5MDkwOTA5MCglZWF4KQotIGVudGVyICAkMHg5MDkwLCQweDkwCi0gbGVhdmUKLSBscmV0ICAgJDB4OTA5MAotIGxyZXQKLSBpbnQzCi0gaW50ICAgICQweDkwCi0gaW50bwotIGlyZXQKLSByY2xiICAgMHg5MDkwOTA5MCglZWF4KQotIHJjbGwgICAweDkwOTA5MDkwKCVlYXgpCi0gcmNsYiAgICVjbCwweDkwOTA5MDkwKCVlYXgpCi0gcmNsbCAgICVjbCwweDkwOTA5MDkwKCVlYXgpCi0gYWFtICAgICQweGZmZmZmZjkwCi0gYWFkICAgICQweGZmZmZmZjkwCi0geGxhdCAgICVkczooJWVieCkKLSBmY29tcyAgMHg5MDkwOTA5MCglZWF4KQotIGZzdHMgICAweDkwOTA5MDkwKCVlYXgpCi0gZmljb21sIDB4OTA5MDkwOTAoJWVheCkKLSBmaXN0bCAgMHg5MDkwOTA5MCglZWF4KQotIGZjb21sICAweDkwOTA5MDkwKCVlYXgpCi0gZnN0bCAgIDB4OTA5MDkwOTAoJWVheCkKLSBmaWNvbSAgMHg5MDkwOTA5MCglZWF4KQotIGZpc3QgICAweDkwOTA5MDkwKCVlYXgpCi0gbG9vcG5lIC4rMi0weDcwCi0gbG9vcGUgIC4rMi0weDcwCi0gbG9vcCAgIC4rMi0weDcwCi0gamVjeHogIC4rMi0weDcwCi0gaW4gICAgICQweDkwLCVhbAotIGluICAgICAkMHg5MCwlZWF4Ci0gb3V0ICAgICVhbCwkMHg5MAotIG91dCAgICAlZWF4LCQweDkwCi0gY2FsbCAgIC4rNSsweDkwOTA5MDkwCi0gam1wICAgIC4rNSsweDkwOTA5MDkwCi0gbGptcCAgICQweDkwOTAsJDB4OTA5MDkwOTAKLSBqbXAgICAgLisyLTB4NzAKLSBpbiAgICAgKCVkeCksJWFsCi0gaW4gICAgICglZHgpLCVlYXgKLSBvdXQgICAgJWFsLCglZHgpCi0gb3V0ICAgICVlYXgsKCVkeCkKLSBobHQKLSBjbWMKLSBub3RiICAgMHg5MDkwOTA5MCglZWF4KQotIG5vdGwgICAweDkwOTA5MDkwKCVlYXgpCi0gY2xjCi0gc3RjCi0gY2xpCi0gc3RpCi0gY2xkCi0gc3RkCi0gY2FsbCAgICoweDkwOTA5MDkwKCVlYXgpCi0gbGxkdCAgIDB4OTA5MDkwOTAoJWVheCkKLSBsZ2R0ICAgMHg5MDkwOTA5MCglZWF4KQotIGxhciAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBsc2wgICAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY2x0cwotIGludmQKLSB3YmludmQKLSB1ZDJhCi0gbW92ICAgICVjcjIsJWVheAotIG1vdiAgICAlZGIyLCVlYXgKLSBtb3YgICAgJWVheCwlY3IyCi0gbW92ICAgICVlYXgsJWRiMgotIG1vdiAgICAldHIyLCVlYXgKLSBtb3YgICAgJWVheCwldHIyCi0gd3Jtc3IKLSByZHRzYwotIHJkbXNyCi0gcmRwbWMKLSBjbW92byAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdm5vIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZiICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92YWUgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmUgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZuZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92YmUgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmEgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZzICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bnMgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdnAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZucCAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92bCAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gY21vdmdlIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtb3ZsZSAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBjbW92ZyAgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gcHVucGNrbGJ3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2x3ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2tsZHEgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFja3Nzd2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGd0YiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwY21wZ3R3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBndGQgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFja3Vzd2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHVucGNraGJ3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB1bnBja2h3ZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwdW5wY2toZHEgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFja3NzZHcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gbW92ZCAgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIG1vdnEgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JsdyAgJDB4OTAsJW1tMAotIHBzcmxkICAkMHg5MCwlbW0wCi0gcHNybHEgICQweDkwLCVtbTAKLSBwY21wZXFiIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBjbXBlcXcgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGNtcGVxZCAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBlbW1zCi0gbW92ZCAgICVtbTIsMHg5MDkwOTA5MCglZWF4KQotIG1vdnEgICAlbW0yLDB4OTA5MDkwOTAoJWVheCkKLSBqbyAgICAgLis2KzB4OTA5MDkwOTAKLSBqbm8gICAgLis2KzB4OTA5MDkwOTAKLSBqYiAgICAgLis2KzB4OTA5MDkwOTAKLSBqYWUgICAgLis2KzB4OTA5MDkwOTAKLSBqZSAgICAgLis2KzB4OTA5MDkwOTAKLSBqbmUgICAgLis2KzB4OTA5MDkwOTAKLSBqYmUgICAgLis2KzB4OTA5MDkwOTAKLSBqYSAgICAgLis2KzB4OTA5MDkwOTAKLSBqcyAgICAgLis2KzB4OTA5MDkwOTAKLSBqbnMgICAgLis2KzB4OTA5MDkwOTAKLSBqcCAgICAgLis2KzB4OTA5MDkwOTAKLSBqbnAgICAgLis2KzB4OTA5MDkwOTAKLSBqbCAgICAgLis2KzB4OTA5MDkwOTAKLSBqZ2UgICAgLis2KzB4OTA5MDkwOTAKLSBqbGUgICAgLis2KzB4OTA5MDkwOTAKLSBqZyAgICAgLis2KzB4OTA5MDkwOTAKLSBzZXRvICAgMHg5MDkwOTA5MCglZWF4KQotIHNldG5vICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0YiAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRhZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGUgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bmUgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRiZSAgMHg5MDkwOTA5MCglZWF4KQotIHNldGEgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0cyAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRucyAgMHg5MDkwOTA5MCglZWF4KQotIHNldHAgICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bnAgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRsICAgMHg5MDkwOTA5MCglZWF4KQotIHNldGdlICAweDkwOTA5MDkwKCVlYXgpCi0gc2V0bGUgIDB4OTA5MDkwOTAoJWVheCkKLSBzZXRnICAgMHg5MDkwOTA5MCglZWF4KQotIHB1c2ggICAlZnMKLSBwb3AgICAgJWZzCi0gY3B1aWQKLSBidCAgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hsZCAgICQweDkwLCVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNobGQgICAlY2wsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gcHVzaCAgICVncwotIHBvcCAgICAlZ3MKLSByc20KLSBidHMgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2hyZCAgICQweDkwLCVlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNocmQgICAlY2wsJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gaW11bCAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGNtcHhjaGcgJWRsLDB4OTA5MDkwOTAoJWVheCkKLSBjbXB4Y2hnICVlZHgsMHg5MDkwOTA5MCglZWF4KQotIGxzcyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBidHIgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbGZzICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGxncyAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3Z6YmwgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92endsIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHVkMmIKLSBidGMgICAgJWVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYnNmICAgIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIGJzciAgICAweDkwOTA5MDkwKCVlYXgpLCVlZHgKLSBtb3ZzYmwgMHg5MDkwOTA5MCglZWF4KSwlZWR4Ci0gbW92c3dsIDB4OTA5MDkwOTAoJWVheCksJWVkeAotIHhhZGQgICAlZGwsMHg5MDkwOTA5MCglZWF4KQotIHhhZGQgICAlZWR4LDB4OTA5MDkwOTAoJWVheCkKLSBic3dhcCAgJWVheAotIGJzd2FwICAlZWN4Ci0gYnN3YXAgICVlZHgKLSBic3dhcCAgJWVieAotIGJzd2FwICAlZXNwCi0gYnN3YXAgICVlYnAKLSBic3dhcCAgJWVzaQotIGJzd2FwICAlZWRpCi0gcHNybHcgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzcmxkICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JscSAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcG11bGx3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJ1c2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YnVzdyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYW5kICAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZHVzYiAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkdXN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhbmRuICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3JhdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNyYWQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBtdWxodyAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3Vic2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YnN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBvciAgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkc2IgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZHN3IDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHB4b3IgICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc2xsdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHNsbGQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzbGxxICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwbWFkZHdkIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBzdWJiICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwc3VidyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcHN1YmQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIHBhZGRiICAweDkwOTA5MDkwKCVlYXgpLCVtbTIKLSBwYWRkdyAgMHg5MDkwOTA5MCglZWF4KSwlbW0yCi0gcGFkZGQgIDB4OTA5MDkwOTAoJWVheCksJW1tMgotIGFkZCAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkZCAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGFkZCAgICAkMHg5MDkwLCVheAotIHB1c2h3ICAlZXMKLSBwb3B3ICAgJWVzCi0gb3IgICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gb3IgICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gb3IgICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVjcwotIGFkYyAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIGFkYyAgICAweDkwOTA5MDkwKCVlYXgpLCVkeAotIGFkYyAgICAkMHg5MDkwLCVheAotIHB1c2h3ICAlc3MKLSBwb3B3ICAgJXNzCi0gc2JiICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gc2JiICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gc2JiICAgICQweDkwOTAsJWF4Ci0gcHVzaHcgICVkcwotIHBvcHcgICAlZHMKLSBhbmQgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBhbmQgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBhbmQgICAgJDB4OTA5MCwlYXgKLSBzdWIgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBzdWIgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBzdWIgICAgJDB4OTA5MCwlYXgKLSB4b3IgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4b3IgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSB4b3IgICAgJDB4OTA5MCwlYXgKLSBjbXAgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBjbXAgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbXAgICAgJDB4OTA5MCwlYXgKLSBpbmMgICAgJWF4Ci0gaW5jICAgICVjeAotIGluYyAgICAlZHgKLSBpbmMgICAgJWJ4Ci0gaW5jICAgICVzcAotIGluYyAgICAlYnAKLSBpbmMgICAgJXNpCi0gaW5jICAgICVkaQotIGRlYyAgICAlYXgKLSBkZWMgICAgJWN4Ci0gZGVjICAgICVkeAotIGRlYyAgICAlYngKLSBkZWMgICAgJXNwCi0gZGVjICAgICVicAotIGRlYyAgICAlc2kKLSBkZWMgICAgJWRpCi0gcHVzaCAgICVheAotIHB1c2ggICAlY3gKLSBwdXNoICAgJWR4Ci0gcHVzaCAgICVieAotIHB1c2ggICAlc3AKLSBwdXNoICAgJWJwCi0gcHVzaCAgICVzaQotIHB1c2ggICAlZGkKLSBwb3AgICAgJWF4Ci0gcG9wICAgICVjeAotIHBvcCAgICAlZHgKLSBwb3AgICAgJWJ4Ci0gcG9wICAgICVzcAotIHBvcCAgICAlYnAKLSBwb3AgICAgJXNpCi0gcG9wICAgICVkaQotIHB1c2hhdwotIHBvcGF3Ci0gYm91bmQgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gcHVzaHcgICQweDkwOTAKLSBpbXVsICAgJDB4OTA5MCwweDkwOTA5MDkwKCVlYXgpLCVkeAotIHB1c2h3ICAkMHhmZmZmZmY5MAotIGltdWwgICAkMHhmZmZmZmY5MCwweDkwOTA5MDkwKCVlYXgpLCVkeAotIGluc3cgICAoJWR4KSwlZXM6KCVlZGkpCi0gb3V0c3cgICVkczooJWVzaSksKCVkeCkKLSBhZGN3ICAgJDB4OTA5MCwweDkwOTA5MDkwKCVlYXgpCi0gYWRjdyAgICQweGZmZmZmZjkwLDB4OTA5MDkwOTAoJWVheCkKLSB0ZXN0ICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSB4Y2hnICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBtb3YgICAgJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBtb3YgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBtb3Z3ICAgJXNzLDB4OTA5MDkwOTAoJWVheCkKLSBsZWEgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBwb3B3ICAgMHg5MDkwOTA5MCglZWF4KQotIHhjaGcgICAlYXgsJWN4Ci0geGNoZyAgICVheCwlZHgKLSB4Y2hnICAgJWF4LCVieAotIHhjaGcgICAlYXgsJXNwCi0geGNoZyAgICVheCwlYnAKLSB4Y2hnICAgJWF4LCVzaQotIHhjaGcgICAlYXgsJWRpCi0gY2J0dwotIGN3dGQKLSBsY2FsbHcgJDB4OTA5MCwkMHg5MDkwCi0gcHVzaGZ3Ci0gcG9wZncKLSBtb3YgICAgMHg5MDkwOTA5MCwlYXgKLSBtb3YgICAgJWF4LDB4OTA5MDkwOTAKLSBtb3ZzdyAgJWRzOiglZXNpKSwlZXM6KCVlZGkpCi0gY21wc3cgICVlczooJWVkaSksJWRzOiglZXNpKQotIHRlc3QgICAkMHg5MDkwLCVheAotIHN0b3MgICAlYXgsJWVzOiglZWRpKQotIGxvZHMgICAlZHM6KCVlc2kpLCVheAotIHNjYXMgICAlZXM6KCVlZGkpLCVheAotIG1vdiAgICAkMHg5MDkwLCVheAotIG1vdiAgICAkMHg5MDkwLCVjeAotIG1vdiAgICAkMHg5MDkwLCVkeAotIG1vdiAgICAkMHg5MDkwLCVieAotIG1vdiAgICAkMHg5MDkwLCVzcAotIG1vdiAgICAkMHg5MDkwLCVicAotIG1vdiAgICAkMHg5MDkwLCVzaQotIG1vdiAgICAkMHg5MDkwLCVkaQotIHJjbHcgICAkMHg5MCwweDkwOTA5MDkwKCVlYXgpCi0gcmV0dyAgICQweDkwOTAKLSByZXR3Ci0gbGVzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbGRzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbW92dyAgICQweDkwOTAsMHg5MDkwOTA5MCglZWF4KQotIGVudGVydyAkMHg5MDkwLCQweDkwCi0gbGVhdmV3Ci0gbHJldHcgICQweDkwOTAKLSBscmV0dwotIGlyZXR3Ci0gcmNsdyAgIDB4OTA5MDkwOTAoJWVheCkKLSByY2x3ICAgJWNsLDB4OTA5MDkwOTAoJWVheCkKLSBpbiAgICAgJDB4OTAsJWF4Ci0gb3V0ICAgICVheCwkMHg5MAotIGNhbGx3ICAuKzMrMHg5MDkwCi0gbGptcHcgICQweDkwOTAsJDB4OTA5MAotIGluICAgICAoJWR4KSwlYXgKLSBvdXQgICAgJWF4LCglZHgpCi0gbm90dyAgIDB4OTA5MDkwOTAoJWVheCkKLSBjYWxsdyAgKjB4OTA5MDkwOTAoJWVheCkKLSBsYXIgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBsc2wgICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92byAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bm8gMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92YiAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92YWUgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92ZSAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bmUgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92YmUgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92YSAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92cyAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bnMgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92cCAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bnAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bCAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92Z2UgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92bGUgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbW92ZyAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBwdXNodyAgJWZzCi0gcG9wdyAgICVmcwotIGJ0ICAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNobGQgICAkMHg5MCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNobGQgICAlY2wsJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBwdXNodyAgJWdzCi0gcG9wdyAgICVncwotIGJ0cyAgICAlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNocmQgICAkMHg5MCwlZHgsMHg5MDkwOTA5MCglZWF4KQotIHNocmQgICAlY2wsJWR4LDB4OTA5MDkwOTAoJWVheCkKLSBpbXVsICAgMHg5MDkwOTA5MCglZWF4KSwlZHgKLSBjbXB4Y2hnICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbHNzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYnRyICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gbGZzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbGdzICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbW92emJ3IDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYnRjICAgICVkeCwweDkwOTA5MDkwKCVlYXgpCi0gYnNmICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gYnNyICAgIDB4OTA5MDkwOTAoJWVheCksJWR4Ci0gbW92c2J3IDB4OTA5MDkwOTAoJWVheCksJWR4Ci0geGFkZCAgICVkeCwweDkwOTA5MDkwKCVlYXgpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9wcmVmaXguZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlYmE4MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI29iamR1bXA6IC1kdwotI25hbWU6IGkzODYgcHJlZml4Ci0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPGZvbz46Ci0gICAwOgk5YiA2NyAyNiBkOSAzYyBbIAldKmFkZHIxNiBmc3RjdyAlZXM6XCglc2lcKQotICAgNToJOWIgZGYgZTAgWyAJXSpmc3RzdyAgJWF4Ci0gICA4Ogk5YiBkZiBlMCBbIAldKmZzdHN3ICAlYXgKLSAgIGI6CTliIGRmIGUwIFsgCV0qZnN0c3cgICVheAotICAgZToJOWIgNjcgZGYgZTAgWyAJXSphZGRyMTYgZnN0c3cgJWF4Ci0gIDEyOglmMyA2NyA2NiAzNiBhNyBbIAldKnJlcHogYWRkcjE2IGNtcHN3ICVlczpcKCVkaVwpLCVzczpcKCVzaVwpCi0gIDE3Ogk5MCBbIAldKm5vcCAgICAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3ByZWZpeC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk4YjQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcHJlZml4LnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0udGV4dAotZm9vOgotIGFkZHIxNiBmc3RjdyAlZXM6KCVzaSkKLSBmc3RzdwotIGZzdHN3ICVheAotIGZzdHN3ICVlYXgKLSBhZGRyMTYgZnN0c3cgJWF4Ci0gYWRkcjE2IHJlcCBjbXBzdyAlZXM6KCVkaSksJXNzOiglc2kpCi0KLSMgR2V0IGEgZ29vZCBhbGlnbm1lbnQuCi0gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3JlbG9jLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOTY4YzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kcncKLSNuYW1lOiBpMzg2IHJlbG9jCi0KLS4qOiArZmlsZSBmb3JtYXQgLippMzg2LioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPGZvbz46Ci0gICAwOgliMyAwMCBbIAldKm1vdiAgICBcJDB4MCwlYmwJMTogKFJfMzg2Xyk/OAkudGV4dAotICAgMjoJNjggMDAgMDAgMDAgMDAgWyAJXSpwdXNoICAgXCQweDAJMzogKFJfMzg2Xyk/MzIJLnRleHQKLSAgIDc6CTA1IDAwIDAwIDAwIDAwIFsgCV0qYWRkICAgIFwkMHgwLCVlYXgJODogKFJfMzg2Xyk/MzIJLnRleHQKLSAgIGM6CTgxIGMzIDAwIDAwIDAwIDAwIFsgCV0qYWRkICAgIFwkMHgwLCVlYngJZTogKFJfMzg2Xyk/MzIJLnRleHQKLSAgMTI6CTY5IGQyIDAwIDAwIDAwIDAwIFsgCV0qaW11bCAgIFwkMHgwLCVlZHgsJWVkeAkxNDogKFJfMzg2Xyk/MzIJLnRleHQKLSAgMTg6CTlhIDAwIDAwIDAwIDAwIDAwIDAwIFsgCV0qbGNhbGwgIFwkMHgwLFwkMHgwCTE5OiAoUl8zODZfKT8zMgkudGV4dAotICAxZjoJNjYgNjggMDAgMDAgWyAJXSpwdXNodyAgXCQweDAJMjE6IChSXzM4Nl8pPzE2CS50ZXh0Ci0gIDIzOgk5MCBbIAldKm5vcCAgICAKLSAgMjQ6CTkwIFsgCV0qbm9wICAgIAotICAyNToJOTAgWyAJXSpub3AgICAgCi0gIDI2Ogk5MCBbIAldKm5vcCAgICAKLSAgMjc6CTkwIFsgCV0qbm9wICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni9yZWxvYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmY5NWI2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL2kzODYvcmVsb2MucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS50ZXh0Ci1mb286CW1vdgkkZm9vLCAlYmwKLQlwdXNoCSRmb28KLQlhZGQJJGZvbywgJWVheAotCWFkZAkkZm9vLCAlZWJ4Ci0JaW11bAkkZm9vLCAlZWR4Ci0JbGNhbGwJJDAsICRmb28KLQlwdXNodwkkZm9vCi0KLSMgUGFkIG91dCB0byBhIGdvb2QgYWxpZ25tZW50Ci0gLmJ5dGUgMHg5MCwweDkwLDB4OTAsMHg5MCwweDkwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZTYxNjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotR0FTIExJU1RJTkcgLioKLQotCi0gICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJIyB0ZXN0IGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UsIGFuZCB1cHBlci1jYXNlCi0gICAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLlRlWHQgCi0gICAzIDAwMDAgMzYgICAgICAgICAgICAgICAgICAgICAgICAgCQlzcyAKLSAgIDQgMDAwMSA4ODAzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdiAlIGFsICwgXCggJSBlYnggXCkgCi0gICA1IDAwMDMgQzcwNUQ3MTEgMDAwMDdCMDAgMDAwMCAgICAgCSAgICAgICAgbU92bCBcJCAxMjMgLCA0NTY3IAotICAgNiAwMDBkIDY3OEE3ODdCICAgICAgICAgICAgICAgICAgIAkgQUREcjE2CW1vdiAxMjMgXCggJSBieCAsICUgc2kgLCAxIFwpICwgJSBiaCAKLSAgIDcgMDAxMSBGRkUwICAgICAgICAgICAgICAgICAgICAgICAJCWptcCBcKiAlIGVheCAKLSAgIDggMDAxMyA2NjI2RkYyMyAgICAgICAgICAgICAgICAgICAJZm9vOglqbXB3ICUgZXMgOiBcKiBcKCAlIGVieCBcKQkKLSAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgCi0gIDEwIDAwMTcgQTA1MDAwMDAgMDAgICAgICAgICAgICAgICAgCQltb3YgXCggMHg4IFwqIDBYYSBcKSAsICUgYWwgCi0gIDExIDAwMWMgQjAyMCAgICAgICAgICAgICAgICAgICAgICAgCQltb3YgXCQgXCggOCBcKiA0IFwpICwgJSBhbCAKLSAgMTIgMDAxZSBCNzEzICAgICAgICAgICAgICAgICAgICAgICAJCW1vdiBcJCBmb28gLCAlIGJIIAotICAxMyAwMDIwIEI3MTMgICAgICAgICAgICAgICAgICAgICAgIAkJbW92YiBcJCBmb28gLCAlIEJIIAotICAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkKLSAgMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkuQ09ERTE2CQotICAxNiAwMDIyIDY2QjgxMzAwIDAwMDAgICAgICAgICAgICAgIAkJTW92IFwkIGZvbyAsICVlQXgJCi0gIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLkNvZGUzMiAKLSAgMTggMDAyOCA2NkI4MTMwMCAgICAgICAgICAgICAgICAgICAJCW1vdiBcJCBmb28gLCAlYXgJCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9pMzg2L3doaXRlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjUwNzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaTM4Ni93aGl0ZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyB0ZXN0IGhhbmRsaW5nIG9mIHdoaXRlc3BhY2UsIGFuZCB1cHBlci1jYXNlCi0uVGVYdCAKLQlzcyAKLQltb3YgJSBhbCAsICggJSBlYnggKSAKLSAgICAgICAgbU92bCAkIDEyMyAsIDQ1NjcgCi0gQUREcjE2CW1vdiAxMjMgKCAlIGJ4ICwgJSBzaSAsIDEgKSAsICUgYmggCi0Jam1wICogJSBlYXggCi1mb286CWptcHcgJSBlcyA6ICogKCAlIGVieCApCQotIAotCW1vdiAoIDB4OCAqIDBYYSApICwgJSBhbCAKLQltb3YgJCAoIDggKiA0ICkgLCAlIGFsIAotCW1vdiAkIGZvbyAsICUgYkggCi0JbW92YiAkIGZvbyAsICUgQkggCi0JCi0uQ09ERTE2CQotCU1vdiAkIGZvbyAsICVlQXgJCi0uQ29kZTMyIAotCW1vdiAkIGZvbyAsICVheAkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ODhkMmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvaWVlZS1mcC94OTMwNTA5YS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIFJlcG9ydGVkIDkzLzA1LzA5IGJ5IEppbSBXaWxzb246IElFRUUgc2luZ2xlLXByZWNpc2lvbiBGTFRfTUlOIHZhbHVlIGdldHMKLSMgYXNzZW1ibGVkIGluY29ycmVjdGx5LiAgKE9mZiBieSBvbmUgdWxwLikKLQotcHJvYyBkb3Rlc3Qge30gewotICAgIHNldCB0ZXN0bmFtZSAiSUVFRSBGTFRfTUlOLCBzaW5nbGUtcHJlY2lzaW9uIgotICAgIHNldCB4IDAKLSAgICBnYXNfc3RhcnQgIng5MzA1MDlhLnMiICItYWwiCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICIgMDAwMDgwMDBcWyAJXF0rLnNpbmdsZSIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiIDAwODAwMDAwXFsgCVxdKy5zaW5nbGUiIHsgcGFzcyAkdGVzdG5hbWU7IHNldCB4IDEgfQotCSAgICAtcmUgIiAwMDgwIDAwMDBcWyAJXF0rLnNpbmdsZSIgeyBwYXNzICR0ZXN0bmFtZTsgc2V0IHggMSB9Ci0JICAgIC1yZSAiIC4uLi4uLi4uICsuc2luZ2xlIiB7IGZhaWwgJHRlc3RuYW1lOyBzZXQgeCAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIiB7IH0KLQkgICAgdGltZW91dCB7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YgeyBicmVhayB9Ci0JfQotICAgIH0KLSAgICBnYXNfZmluaXNoCi0gICAgaWYgISR4IHRoZW4geyBmYWlsICIkdGVzdG5hbWUgKGxpc3RpbmcgZGlkbid0IG1hdGNoKSIgfQotfQotCi1pZiAhW2lzdGFyZ2V0IHZheCotKi0qXSB0aGVuIHsKLSAgICBkb3Rlc3QKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL2llZWUtZnAveDkzMDUwOWEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxYjMzOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9pZWVlLWZwL3g5MzA1MDlhLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSAgICAgICAgLmdsb2JhbCBfZmx0X21pbgotCS5kYXRhCi0gICAgICAgIC5hbGlnbiA0Ci1fZmx0X21pbjoKLSAgICAgICAgLnNpbmdsZSAwcjEuMTc1NDk0MzVlLTM4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTk2NWU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBhbGxpbnNuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwIDxhZGQ+OgotICAgMDoJMGQgYWQgZjAgMDAgCWFkZCBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMDQgPGFkZDM+OgotICAgNDoJOGQgYWQgMDAgMDAgCWFkZDMgZnAsZnAsWyNdKjAKLQotMCswMDA4IDxhbmQ+OgotICAgODoJMGQgY2QgZjAgMDAgCWFuZCBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMGMgPGFuZDM+OgotICAgYzoJOGQgY2QgMDAgMDAgCWFuZDMgZnAsZnAsWyNdKjB4MAotCi0wKzAwMTAgPG9yPjoKLSAgMTA6CTBkIGVkIGYwIDAwIAlvciBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMTQgPG9yMz46Ci0gIDE0Ogk4ZCBlZCAwMCAwMCAJb3IzIGZwLGZwLFsjXSoweDAKLQotMCswMDE4IDx4b3I+OgotICAxODoJMGQgZGQgZjAgMDAgCXhvciBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMWMgPHhvcjM+OgotICAxYzoJOGQgZGQgMDAgMDAgCXhvcjMgZnAsZnAsWyNdKjB4MAotCi0wKzAwMjAgPGFkZGk+OgotICAyMDoJNGQgMDAgZjAgMDAgCWFkZGkgZnAsWyNdKjAgXHxcfCBub3AKLQotMCswMDI0IDxhZGR2PjoKLSAgMjQ6CTBkIDhkIGYwIDAwIAlhZGR2IGZwLGZwIFx8XHwgbm9wCi0KLTArMDAyOCA8YWRkdjM+OgotICAyODoJOGQgOGQgMDAgMDAgCWFkZHYzIGZwLGZwLFsjXSowCi0KLTArMDAyYyA8YWRkeD46Ci0gIDJjOgkwZCA5ZCBmMCAwMCAJYWRkeCBmcCxmcCBcfFx8IG5vcAotCi0wKzAwMzAgPGJjOD46Ci0gIDMwOgk3YyBmNCBmMCAwMCAJYmMgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwMzQgPGJjOF9zPjoKLSAgMzQ6CTdjIGYzIGYwIDAwIAliYyAwIDxhZGQ+IFx8XHwgbm9wCi0KLTArMDAzOCA8YmMyND46Ci0gIDM4Ogk3YyBmMiBmMCAwMCAJYmMgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwM2MgPGJjMjRfbD46Ci0gIDNjOglmYyBmZiBmZiBmMSAJYmMgMCA8YWRkPgotCi0wKzAwNDAgPGJlcT46Ci0gIDQwOgliZCAwZCBmZiBmMCAJYmVxIGZwLGZwLDAgPGFkZD4KLQotMCswMDQ0IDxiZXF6PjoKLSAgNDQ6CWIwIDhkIGZmIGVmIAliZXF6IGZwLDAgPGFkZD4KLQotMCswMDQ4IDxiZ2V6PjoKLSAgNDg6CWIwIGJkIGZmIGVlIAliZ2V6IGZwLDAgPGFkZD4KLQotMCswMDRjIDxiZ3R6PjoKLSAgNGM6CWIwIGRkIGZmIGVkIAliZ3R6IGZwLDAgPGFkZD4KLQotMCswMDUwIDxibGV6PjoKLSAgNTA6CWIwIGNkIGZmIGVjIAlibGV6IGZwLDAgPGFkZD4KLQotMCswMDU0IDxibHR6PjoKLSAgNTQ6CWIwIGFkIGZmIGViIAlibHR6IGZwLDAgPGFkZD4KLQotMCswMDU4IDxibmV6PjoKLSAgNTg6CWIwIDlkIGZmIGVhIAlibmV6IGZwLDAgPGFkZD4KLQotMCswMDVjIDxibDg+OgotICA1YzoJN2UgZTkgZjAgMDAgCWJsIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDYwIDxibDhfcz46Ci0gIDYwOgk3ZSBlOCBmMCAwMCAJYmwgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwNjQgPGJsMjQ+OgotICA2NDoJN2UgZTcgZjAgMDAgCWJsIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDY4IDxibDI0X2w+OgotICA2ODoJZmUgZmYgZmYgZTYgCWJsIDAgPGFkZD4KLQotMCswMDZjIDxibmM4PjoKLSAgNmM6CTdkIGU1IGYwIDAwIAlibmMgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwNzAgPGJuYzhfcz46Ci0gIDcwOgk3ZCBlNCBmMCAwMCAJYm5jIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDc0IDxibmMyND46Ci0gIDc0Ogk3ZCBlMyBmMCAwMCAJYm5jIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDc4IDxibmMyNF9sPjoKLSAgNzg6CWZkIGZmIGZmIGUyIAlibmMgMCA8YWRkPgotCi0wKzAwN2MgPGJuZT46Ci0gIDdjOgliZCAxZCBmZiBlMSAJYm5lIGZwLGZwLDAgPGFkZD4KLQotMCswMDgwIDxicmE4PjoKLSAgODA6CTdmIGUwIGYwIDAwIAlicmEgMCA8YWRkPiBcfFx8IG5vcAotCi0wKzAwODQgPGJyYThfcz46Ci0gIDg0Ogk3ZiBkZiBmMCAwMCAJYnJhIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDg4IDxicmEyND46Ci0gIDg4Ogk3ZiBkZSBmMCAwMCAJYnJhIDAgPGFkZD4gXHxcfCBub3AKLQotMCswMDhjIDxicmEyNF9sPjoKLSAgOGM6CWZmIGZmIGZmIGRkIAlicmEgMCA8YWRkPgotCi0wKzAwOTAgPGNtcD46Ci0gIDkwOgkwZCA0ZCBmMCAwMCAJY21wIGZwLGZwIFx8XHwgbm9wCi0KLTArMDA5NCA8Y21waT46Ci0gIDk0Ogk4MCA0ZCAwMCAwMCAJY21waSBmcCxbI10qMAotCi0wKzAwOTggPGNtcHU+OgotICA5ODoJMGQgNWQgZjAgMDAgCWNtcHUgZnAsZnAgXHxcfCBub3AKLQotMCswMDljIDxjbXB1aT46Ci0gIDljOgk4MCA1ZCAwMCAwMCAJY21wdWkgZnAsWyNdKjAKLQotMCswMGEwIDxkaXY+OgotICBhMDoJOWQgMGQgMDAgMDAgCWRpdiBmcCxmcAotCi0wKzAwYTQgPGRpdnU+OgotICBhNDoJOWQgMWQgMDAgMDAgCWRpdnUgZnAsZnAKLQotMCswMGE4IDxyZW0+OgotICBhODoJOWQgMmQgMDAgMDAgCXJlbSBmcCxmcAotCi0wKzAwYWMgPHJlbXU+OgotICBhYzoJOWQgM2QgMDAgMDAgCXJlbXUgZnAsZnAKLQotMCswMGIwIDxqbD46Ci0gIGIwOgkxZSBjZCBmMCAwMCAJamwgZnAgXHxcfCBub3AKLQotMCswMGI0IDxqbXA+OgotICBiNDoJMWYgY2QgZjAgMDAgCWptcCBmcCBcfFx8IG5vcAotCi0wKzAwYjggPGxkPjoKLSAgYjg6CTJkIGNkIGYwIDAwIAlsZCBmcCxAZnAgXHxcfCBub3AKLQotMCswMGJjIDxsZF8yPjoKLSAgYmM6CTJkIGNkIGYwIDAwIAlsZCBmcCxAZnAgXHxcfCBub3AKLQotMCswMGMwIDxsZF9kPjoKLSAgYzA6CWFkIGNkIDAwIDAwIAlsZCBmcCxAXCgwLGZwXCkKLQotMCswMGM0IDxsZF9kMj46Ci0gIGM0OglhZCBjZCAwMCAwMCAJbGQgZnAsQFwoMCxmcFwpCi0KLTArMDBjOCA8bGRiPjoKLSAgYzg6CTJkIDhkIGYwIDAwIAlsZGIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBjYyA8bGRiXzI+OgotICBjYzoJMmQgOGQgZjAgMDAgCWxkYiBmcCxAZnAgXHxcfCBub3AKLQotMCswMGQwIDxsZGJfZD46Ci0gIGQwOglhZCA4ZCAwMCAwMCAJbGRiIGZwLEBcKDAsZnBcKQotCi0wKzAwZDQgPGxkYl9kMj46Ci0gIGQ0OglhZCA4ZCAwMCAwMCAJbGRiIGZwLEBcKDAsZnBcKQotCi0wKzAwZDggPGxkaD46Ci0gIGQ4OgkyZCBhZCBmMCAwMCAJbGRoIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwZGMgPGxkaF8yPjoKLSAgZGM6CTJkIGFkIGYwIDAwIAlsZGggZnAsQGZwIFx8XHwgbm9wCi0KLTArMDBlMCA8bGRoX2Q+OgotICBlMDoJYWQgYWQgMDAgMDAgCWxkaCBmcCxAXCgwLGZwXCkKLQotMCswMGU0IDxsZGhfZDI+OgotICBlNDoJYWQgYWQgMDAgMDAgCWxkaCBmcCxAXCgwLGZwXCkKLQotMCswMGU4IDxsZHViPjoKLSAgZTg6CTJkIDlkIGYwIDAwIAlsZHViIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwZWMgPGxkdWJfMj46Ci0gIGVjOgkyZCA5ZCBmMCAwMCAJbGR1YiBmcCxAZnAgXHxcfCBub3AKLQotMCswMGYwIDxsZHViX2Q+OgotICBmMDoJYWQgOWQgMDAgMDAgCWxkdWIgZnAsQFwoMCxmcFwpCi0KLTArMDBmNCA8bGR1Yl9kMj46Ci0gIGY0OglhZCA5ZCAwMCAwMCAJbGR1YiBmcCxAXCgwLGZwXCkKLQotMCswMGY4IDxsZHVoPjoKLSAgZjg6CTJkIGJkIGYwIDAwIAlsZHVoIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAwZmMgPGxkdWhfMj46Ci0gIGZjOgkyZCBiZCBmMCAwMCAJbGR1aCBmcCxAZnAgXHxcfCBub3AKLQotMCswMTAwIDxsZHVoX2Q+OgotIDEwMDoJYWQgYmQgMDAgMDAgCWxkdWggZnAsQFwoMCxmcFwpCi0KLTArMDEwNCA8bGR1aF9kMj46Ci0gMTA0OglhZCBiZCAwMCAwMCAJbGR1aCBmcCxAXCgwLGZwXCkKLQotMCswMTA4IDxsZF9wbHVzPjoKLSAxMDg6CTJkIGVkIGYwIDAwIAlsZCBmcCxAZnBcKyBcfFx8IG5vcAotCi0wKzAxMGMgPGxkMjQ+OgotIDEwYzoJZWQgMDAgMDAgMDAgCWxkMjQgZnAsWyNdKjAgPGFkZD4KLQkJCTEwYzogUl9NMzJSXzI0CS5kYXRhCi0KLTArMDExMCA8bGRpOD46Ci0gMTEwOgk2ZCAwMCBmMCAwMCAJbGRpIGZwLFsjXSowIFx8XHwgbm9wCi0KLTArMDExNCA8bGRpMTY+OgotIDExNDoJOWQgZjAgMDEgMDAgCWxkaSBmcCxbI10qMjU2Ci0KLTArMDExOCA8bG9jaz46Ci0gMTE4OgkyZCBkZCBmMCAwMCAJbG9jayBmcCxAZnAgXHxcfCBub3AKLQotMCswMTFjIDxtYWNoaT46Ci0gMTFjOgkzZCA0ZCBmMCAwMCAJbWFjaGkgZnAsZnAgXHxcfCBub3AKLQotMCswMTIwIDxtYWNsbz46Ci0gMTIwOgkzZCA1ZCBmMCAwMCAJbWFjbG8gZnAsZnAgXHxcfCBub3AKLQotMCswMTI0IDxtYWN3aGk+OgotIDEyNDoJM2QgNmQgZjAgMDAgCW1hY3doaSBmcCxmcCBcfFx8IG5vcAotCi0wKzAxMjggPG1hY3dsbz46Ci0gMTI4OgkzZCA3ZCBmMCAwMCAJbWFjd2xvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDEyYyA8bXVsPjoKLSAxMmM6CTFkIDZkIGYwIDAwIAltdWwgZnAsZnAgXHxcfCBub3AKLQotMCswMTMwIDxtdWxoaT46Ci0gMTMwOgkzZCAwZCBmMCAwMCAJbXVsaGkgZnAsZnAgXHxcfCBub3AKLQotMCswMTM0IDxtdWxsbz46Ci0gMTM0OgkzZCAxZCBmMCAwMCAJbXVsbG8gZnAsZnAgXHxcfCBub3AKLQotMCswMTM4IDxtdWx3aGk+OgotIDEzODoJM2QgMmQgZjAgMDAgCW11bHdoaSBmcCxmcCBcfFx8IG5vcAotCi0wKzAxM2MgPG11bHdsbz46Ci0gMTNjOgkzZCAzZCBmMCAwMCAJbXVsd2xvIGZwLGZwIFx8XHwgbm9wCi0KLTArMDE0MCA8bXY+OgotIDE0MDoJMWQgOGQgZjAgMDAgCW12IGZwLGZwIFx8XHwgbm9wCi0KLTArMDE0NCA8bXZmYWNoaT46Ci0gMTQ0Ogk1ZCBmMCBmMCAwMCAJbXZmYWNoaSBmcCBcfFx8IG5vcAotCi0wKzAxNDggPG12ZmFjbG8+OgotIDE0ODoJNWQgZjEgZjAgMDAgCW12ZmFjbG8gZnAgXHxcfCBub3AKLQotMCswMTRjIDxtdmZhY21pPjoKLSAxNGM6CTVkIGYyIGYwIDAwIAltdmZhY21pIGZwIFx8XHwgbm9wCi0KLTArMDE1MCA8bXZmYz46Ci0gMTUwOgkxZCA5MCBmMCAwMCAJbXZmYyBmcCxwc3cgXHxcfCBub3AKLQotMCswMTU0IDxtdnRhY2hpPjoKLSAxNTQ6CTVkIDcwIGYwIDAwIAltdnRhY2hpIGZwIFx8XHwgbm9wCi0KLTArMDE1OCA8bXZ0YWNsbz46Ci0gMTU4Ogk1ZCA3MSBmMCAwMCAJbXZ0YWNsbyBmcCBcfFx8IG5vcAotCi0wKzAxNWMgPG12dGM+OgotIDE1YzoJMTAgYWQgZjAgMDAgCW12dGMgZnAscHN3IFx8XHwgbm9wCi0KLTArMDE2MCA8bmVnPjoKLSAxNjA6CTBkIDNkIGYwIDAwIAluZWcgZnAsZnAgXHxcfCBub3AKLQotMCswMTY0IDxub3A+OgotIDE2NDoJNzAgMDAgZjAgMDAgCW5vcCBcfFx8IG5vcAotCi0wKzAxNjggPG5vdD46Ci0gMTY4OgkwZCBiZCBmMCAwMCAJbm90IGZwLGZwIFx8XHwgbm9wCi0KLTArMDE2YyA8cmFjPjoKLSAxNmM6CWRkIGMwIDAwIDAwIAlzZXRoIGZwLFsjXSoweDAKLQotMCswMTcwIDxzbGw+OgotIDE3MDoJMWQgNGQgZjAgMDAgCXNsbCBmcCxmcCBcfFx8IG5vcAotCi0wKzAxNzQgPHNsbDM+OgotIDE3NDoJOWQgY2QgMDAgMDAgCXNsbDMgZnAsZnAsWyNdKjAKLQotMCswMTc4IDxzbGxpPjoKLSAxNzg6CTVkIDQwIGYwIDAwIAlzbGxpIGZwLFsjXSoweDAgXHxcfCBub3AKLQotMCswMTdjIDxzcmE+OgotIDE3YzoJMWQgMmQgZjAgMDAgCXNyYSBmcCxmcCBcfFx8IG5vcAotCi0wKzAxODAgPHNyYTM+OgotIDE4MDoJOWQgYWQgMDAgMDAgCXNyYTMgZnAsZnAsWyNdKjAKLQotMCswMTg0IDxzcmFpPjoKLSAxODQ6CTVkIDIwIGYwIDAwIAlzcmFpIGZwLFsjXSoweDAgXHxcfCBub3AKLQotMCswMTg4IDxzcmw+OgotIDE4ODoJMWQgMGQgZjAgMDAgCXNybCBmcCxmcCBcfFx8IG5vcAotCi0wKzAxOGMgPHNybDM+OgotIDE4YzoJOWQgOGQgMDAgMDAgCXNybDMgZnAsZnAsWyNdKjAKLQotMCswMTkwIDxzcmxpPjoKLSAxOTA6CTVkIDAwIGYwIDAwIAlzcmxpIGZwLFsjXSoweDAgXHxcfCBub3AKLQotMCswMTk0IDxzdD46Ci0gMTk0OgkyZCA0ZCBmMCAwMCAJc3QgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDE5OCA8c3RfMj46Ci0gMTk4OgkyZCA0ZCBmMCAwMCAJc3QgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDE5YyA8c3RfZD46Ci0gMTljOglhZCA0ZCAwMCAwMCAJc3QgZnAsQFwoMCxmcFwpCi0KLTArMDFhMCA8c3RfZDI+OgotIDFhMDoJYWQgNGQgMDAgMDAgCXN0IGZwLEBcKDAsZnBcKQotCi0wKzAxYTQgPHN0Yj46Ci0gMWE0OgkyZCAwZCBmMCAwMCAJc3RiIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxYTggPHN0Yl8yPjoKLSAxYTg6CTJkIDBkIGYwIDAwIAlzdGIgZnAsQGZwIFx8XHwgbm9wCi0KLTArMDFhYyA8c3RiX2Q+OgotIDFhYzoJYWQgMGQgMDAgMDAgCXN0YiBmcCxAXCgwLGZwXCkKLQotMCswMWIwIDxzdGJfZDI+OgotIDFiMDoJYWQgMGQgMDAgMDAgCXN0YiBmcCxAXCgwLGZwXCkKLQotMCswMWI0IDxzdGg+OgotIDFiNDoJMmQgMmQgZjAgMDAgCXN0aCBmcCxAZnAgXHxcfCBub3AKLQotMCswMWI4IDxzdGhfMj46Ci0gMWI4OgkyZCAyZCBmMCAwMCAJc3RoIGZwLEBmcCBcfFx8IG5vcAotCi0wKzAxYmMgPHN0aF9kPjoKLSAxYmM6CWFkIDJkIDAwIDAwIAlzdGggZnAsQFwoMCxmcFwpCi0KLTArMDFjMCA8c3RoX2QyPjoKLSAxYzA6CWFkIDJkIDAwIDAwIAlzdGggZnAsQFwoMCxmcFwpCi0KLTArMDFjNCA8c3RfcGx1cz46Ci0gMWM0OgkyZCA2ZCBmMCAwMCAJc3QgZnAsQFwrZnAgXHxcfCBub3AKLQotMCswMWM4IDxzdF9taW51cz46Ci0gMWM4OgkyZCA3ZCBmMCAwMCAJc3QgZnAsQC1mcCBcfFx8IG5vcAotCi0wKzAxY2MgPHN1Yj46Ci0gMWNjOgkwZCAyZCBmMCAwMCAJc3ViIGZwLGZwIFx8XHwgbm9wCi0KLTArMDFkMCA8c3Vidj46Ci0gMWQwOgkwZCAwZCBmMCAwMCAJc3VidiBmcCxmcCBcfFx8IG5vcAotCi0wKzAxZDQgPHN1Yng+OgotIDFkNDoJMGQgMWQgZjAgMDAgCXN1YnggZnAsZnAgXHxcfCBub3AKLQotMCswMWQ4IDx0cmFwPjoKLSAxZDg6CTEwIGYwIGYwIDAwIAl0cmFwIFsjXSoweDAgXHxcfCBub3AKLQotMCswMWRjIDx1bmxvY2s+OgotIDFkYzoJMmQgNWQgZjAgMDAgCXVubG9jayBmcCxAZnAgXHxcfCBub3AKLQotMCswMWUwIDxwdXNoPjoKLSAxZTA6CTJkIDdmIGYwIDAwIAlwdXNoIGZwIFx8XHwgbm9wCi0KLTArMDFlNCA8cG9wPjoKLSAxZTQ6CTJkIGVmIGYwIDAwIAlwb3AgZnAgXHxcfCBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2FsbGluc24uZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWRkZDBlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgTTMyUiBhc3NlbWJsZXIgdGVzdHN1aXRlLgotCi1pZiBbaXN0YXJnZXQgbTMyciotKi0qXSB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYWxsaW5zbiIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvYWxsaW5zbi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjQ1NjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9hbGxpbnNuLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDEgKzAsMCBAQAotIC5kYXRhCi1mb29kYXRhOiAud29yZCA0MgotIC50ZXh0Ci1mb290ZXh0OgotCS50ZXh0Ci0JLmdsb2JhbCBhZGQKLWFkZDoKLQlhZGQgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgYWRkMwotYWRkMzoKLQlhZGQzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGFuZAotYW5kOgotCWFuZCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBhbmQzCi1hbmQzOgotCWFuZDMgZnAsZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgb3IKLW9yOgotCW9yIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG9yMwotb3IzOgotCW9yMyBmcCxmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCB4b3IKLXhvcjoKLQl4b3IgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgeG9yMwoteG9yMzoKLQl4b3IzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZGkKLWFkZGk6Ci0JYWRkaSBmcCwjMAotCS50ZXh0Ci0JLmdsb2JhbCBhZGR2Ci1hZGR2OgotCWFkZHYgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgYWRkdjMKLWFkZHYzOgotCWFkZHYzIGZwLGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGFkZHgKLWFkZHg6Ci0JYWRkeCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBiYzgKLWJjODoKLQliYyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJjOF9zCi1iYzhfczoKLQliYy5zIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmMyNAotYmMyNDoKLQliYyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJjMjRfbAotYmMyNF9sOgotCWJjLmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiZXEKLWJlcToKLQliZXEgZnAsZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiZXF6Ci1iZXF6OgotCWJlcXogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiZ2V6Ci1iZ2V6OgotCWJnZXogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBiZ3R6Ci1iZ3R6OgotCWJndHogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibGV6Ci1ibGV6OgotCWJsZXogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibHR6Ci1ibHR6OgotCWJsdHogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmV6Ci1ibmV6OgotCWJuZXogZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibDgKLWJsODoKLQlibCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsOF9zCi1ibDhfczoKLQlibC5zIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYmwyNAotYmwyNDoKLQlibCBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJsMjRfbAotYmwyNF9sOgotCWJsLmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmM4Ci1ibmM4OgotCWJuYyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuYzhfcwotYm5jOF9zOgotCWJuYy5zIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYm5jMjQKLWJuYzI0OgotCWJuYyBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJuYzI0X2wKLWJuYzI0X2w6Ci0JYm5jLmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBibmUKLWJuZToKLQlibmUgZnAsZnAsZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBicmE4Ci1icmE4OgotCWJyYSBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJyYThfcwotYnJhOF9zOgotCWJyYS5zIGZvb3RleHQKLQkudGV4dAotCS5nbG9iYWwgYnJhMjQKLWJyYTI0OgotCWJyYSBmb290ZXh0Ci0JLnRleHQKLQkuZ2xvYmFsIGJyYTI0X2wKLWJyYTI0X2w6Ci0JYnJhLmwgZm9vdGV4dAotCS50ZXh0Ci0JLmdsb2JhbCBjbXAKLWNtcDoKLQljbXAgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgY21waQotY21waToKLQljbXBpIGZwLCMwCi0JLnRleHQKLQkuZ2xvYmFsIGNtcHUKLWNtcHU6Ci0JY21wdSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBjbXB1aQotY21wdWk6Ci0JY21wdWkgZnAsIzAKLQkudGV4dAotCS5nbG9iYWwgZGl2Ci1kaXY6Ci0JZGl2IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGRpdnUKLWRpdnU6Ci0JZGl2dSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCByZW0KLXJlbToKLQlyZW0gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgcmVtdQotcmVtdToKLQlyZW11IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIGpsCi1qbDoKLQlqbCBmcAotCS50ZXh0Ci0JLmdsb2JhbCBqbXAKLWptcDoKLQlqbXAgZnAKLQkudGV4dAotCS5nbG9iYWwgbGQKLWxkOgotCWxkIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZF8yCi1sZF8yOgotCWxkIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkX2QKLWxkX2Q6Ci0JbGQgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZF9kMgotbGRfZDI6Ci0JbGQgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGIKLWxkYjoKLQlsZGIgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkYl8yCi1sZGJfMjoKLQlsZGIgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRiX2QKLWxkYl9kOgotCWxkYiBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkYl9kMgotbGRiX2QyOgotCWxkYiBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkaAotbGRoOgotCWxkaCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbGRoXzIKLWxkaF8yOgotCWxkaCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZGhfZAotbGRoX2Q6Ci0JbGRoIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgbGRoX2QyCi1sZGhfZDI6Ci0JbGRoIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgbGR1YgotbGR1YjoKLQlsZHViIGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBsZHViXzIKLWxkdWJfMjoKLQlsZHViIGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWJfZAotbGR1Yl9kOgotCWxkdWIgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHViX2QyCi1sZHViX2QyOgotCWxkdWIgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBsZHVoCi1sZHVoOgotCWxkdWggZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWhfMgotbGR1aF8yOgotCWxkdWggZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgbGR1aF9kCi1sZHVoX2Q6Ci0JbGR1aCBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIGxkdWhfZDIKLWxkdWhfZDI6Ci0JbGR1aCBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIGxkX3BsdXMKLWxkX3BsdXM6Ci0JbGQgZnAsQGZwKwotCS50ZXh0Ci0JLmdsb2JhbCBsZDI0Ci1sZDI0OgotCWxkMjQgZnAsZm9vZGF0YQotCS50ZXh0Ci0JLmdsb2JhbCBsZGk4Ci1sZGk4OgotCWxkaSBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIGxkaTE2Ci1sZGkxNjoKLQlsZGkgZnAsMjU2Ci0JLnRleHQKLQkuZ2xvYmFsIGxvY2sKLWxvY2s6Ci0JbG9jayBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgbWFjaGkKLW1hY2hpOgotCW1hY2hpIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG1hY2xvCi1tYWNsbzoKLQltYWNsbyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtYWN3aGkKLW1hY3doaToKLQltYWN3aGkgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbWFjd2xvCi1tYWN3bG86Ci0JbWFjd2xvIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bAotbXVsOgotCW11bCBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWxoaQotbXVsaGk6Ci0JbXVsaGkgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXVsbG8KLW11bGxvOgotCW11bGxvIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG11bHdoaQotbXVsd2hpOgotCW11bHdoaSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdWx3bG8KLW11bHdsbzoKLQltdWx3bG8gZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgbXYKLW12OgotCW12IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmFjaGkKLW12ZmFjaGk6Ci0JbXZmYWNoaSBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdmZhY2xvCi1tdmZhY2xvOgotCW12ZmFjbG8gZnAKLQkudGV4dAotCS5nbG9iYWwgbXZmYWNtaQotbXZmYWNtaToKLQltdmZhY21pIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12ZmMKLW12ZmM6Ci0JbXZmYyBmcCxwc3cKLQkudGV4dAotCS5nbG9iYWwgbXZ0YWNoaQotbXZ0YWNoaToKLQltdnRhY2hpIGZwCi0JLnRleHQKLQkuZ2xvYmFsIG12dGFjbG8KLW12dGFjbG86Ci0JbXZ0YWNsbyBmcAotCS50ZXh0Ci0JLmdsb2JhbCBtdnRjCi1tdnRjOgotCW12dGMgZnAscHN3Ci0JLnRleHQKLQkuZ2xvYmFsIG5lZwotbmVnOgotCW5lZyBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBub3AKLW5vcDoKLQlub3AKLQkudGV4dAotCS5nbG9iYWwgbm90Ci1ub3Q6Ci0Jbm90IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHJhYwotcmFjOgotCS50ZXh0Ci0JLmdsb2JhbCByYWNoCi1yYWNoOgotCS50ZXh0Ci0JLmdsb2JhbCBydGUKLXJ0ZToKLQkudGV4dAotCS5nbG9iYWwgc2V0aAotc2V0aDoKLQlzZXRoIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc2xsCi1zbGw6Ci0Jc2xsIGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHNsbDMKLXNsbDM6Ci0Jc2xsMyBmcCxmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNsbGkKLXNsbGk6Ci0Jc2xsaSBmcCwwCi0JLnRleHQKLQkuZ2xvYmFsIHNyYQotc3JhOgotCXNyYSBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzcmEzCi1zcmEzOgotCXNyYTMgZnAsZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzcmFpCi1zcmFpOgotCXNyYWkgZnAsMAotCS50ZXh0Ci0JLmdsb2JhbCBzcmwKLXNybDoKLQlzcmwgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc3JsMwotc3JsMzoKLQlzcmwzIGZwLGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3JsaQotc3JsaToKLQlzcmxpIGZwLDAKLQkudGV4dAotCS5nbG9iYWwgc3QKLXN0OgotCXN0IGZwLEBmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdF8yCi1zdF8yOgotCXN0IGZwLEAoZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0X2QKLXN0X2Q6Ci0Jc3QgZnAsQCgwLGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdF9kMgotc3RfZDI6Ci0Jc3QgZnAsQChmcCwwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGIKLXN0YjoKLQlzdGIgZnAsQGZwCi0JLnRleHQKLQkuZ2xvYmFsIHN0Yl8yCi1zdGJfMjoKLQlzdGIgZnAsQChmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RiX2QKLXN0Yl9kOgotCXN0YiBmcCxAKDAsZnApCi0JLnRleHQKLQkuZ2xvYmFsIHN0Yl9kMgotc3RiX2QyOgotCXN0YiBmcCxAKGZwLDApCi0JLnRleHQKLQkuZ2xvYmFsIHN0aAotc3RoOgotCXN0aCBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgc3RoXzIKLXN0aF8yOgotCXN0aCBmcCxAKGZwKQotCS50ZXh0Ci0JLmdsb2JhbCBzdGhfZAotc3RoX2Q6Ci0Jc3RoIGZwLEAoMCxmcCkKLQkudGV4dAotCS5nbG9iYWwgc3RoX2QyCi1zdGhfZDI6Ci0Jc3RoIGZwLEAoZnAsMCkKLQkudGV4dAotCS5nbG9iYWwgc3RfcGx1cwotc3RfcGx1czoKLQlzdCBmcCxAK2ZwCi0JLnRleHQKLQkuZ2xvYmFsIHN0X21pbnVzCi1zdF9taW51czoKLQlzdCBmcCxALWZwCi0JLnRleHQKLQkuZ2xvYmFsIHN1Ygotc3ViOgotCXN1YiBmcCxmcAotCS50ZXh0Ci0JLmdsb2JhbCBzdWJ2Ci1zdWJ2OgotCXN1YnYgZnAsZnAKLQkudGV4dAotCS5nbG9iYWwgc3VieAotc3VieDoKLQlzdWJ4IGZwLGZwCi0JLnRleHQKLQkuZ2xvYmFsIHRyYXAKLXRyYXA6Ci0JdHJhcCAwCi0JLnRleHQKLQkuZ2xvYmFsIHVubG9jawotdW5sb2NrOgotCXVubG9jayBmcCxAZnAKLQkudGV4dAotCS5nbG9iYWwgcHVzaAotcHVzaDoKLQlwdXNoIGZwCi0JLnRleHQKLQkuZ2xvYmFsIHBvcAotcG9wOgotCXBvcCBmcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9mc2xvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWNmMDJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBmc2xvdAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMCA8Ymw+OgotICowOgk3ZSAwMCBmMCAwMCAJYmwgMCA8Ymw+IFx8XHwgbm9wCi0gKjQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCs4IDxibF9zPjoKLSAqODoJN2UgMDAgZjAgMDAgCWJsIDggPGJsX3M+IFx8XHwgbm9wCi0gKmM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsxMCA8YnJhPjoKLSAqMTA6CTdmIDAwIGYwIDAwIAlicmEgMTAgPGJyYT4gXHxcfCBub3AKLSAqMTQ6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKLQotMCsxOCA8YnJhX3M+OgotICoxODoJN2YgMDAgZjAgMDAgCWJyYSAxOCA8YnJhX3M+IFx8XHwgbm9wCi0gKjFjOgk2MCAwOCBmMCAwMCAJbGRpIHIwLFsjXSo4IFx8XHwgbm9wCi0KLTArMjAgPGpsPjoKLSAqMjA6CTFlIGMwIGYwIDAwIAlqbCByMCBcfFx8IG5vcAotICoyNDoJNjAgMDggZjAgMDAgCWxkaSByMCxbI10qOCBcfFx8IG5vcAotCi0wKzI4IDx0cmFwPjoKLSAqMjg6CTEwIGY0IGYwIDAwIAl0cmFwIFsjXSoweDQgXHxcfCBub3AKLSAqMmM6CTYwIDA4IGYwIDAwIAlsZGkgcjAsWyNdKjggXHxcfCBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvZnNsb3QucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2YjY2NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2ZzbG90LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIFRlc3QgdGhlIEZJTEwtU0xPVCBhdHRyaWJ1dGUuCi0jIFRoZSBGSUxMLVNMT1QgYXR0cmlidXRlIGVuc3VyZXMgdGhlIG5leHQgaW5zbiBiZWdpbnMgb24gYSAzMiBieXRlIGJvdW5kYXJ5LgotIyBUaGlzIGlzIG5lZWRlZCBmb3IgZXhhbXBsZSB3aXRoIGJsIGJlY2F1c2UgdGhlIHN1YnJvdXRpbmUgd2lsbCByZXR1cm4KLSMgdG8gYSAzMiBiaXQgYm91bmRhcnkuCi0KLQkudGV4dAotYmw6Ci0JYmwgYmwKLQlsZGkgcjAsIzgKLWJsX3M6Ci0JYmwucyBibF9zCi0JbGRpIHIwLCM4Ci0KLWJyYToKLQlicmEgYnJhCi0JbGRpIHIwLCM4Ci1icmFfczoKLQlicmEucyBicmFfcwotCWxkaSByMCwjOAotCi1qbDoKLQlqbCByMAotCWxkaSByMCwjOAotCi10cmFwOgotCXRyYXAgIzQKLQlsZGkgcjAsIzgKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNjYjhjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jYXM6Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogaGlnaC0xCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCogPGZvbz46Ci0gKjA6CWQ0IGMwIDAwIDAxIAlzZXRoIHI0LFsjXSoweDEKLVsgCV0qMDogUl9NMzJSX0hJMTZfVUxPCS50ZXh0Ci0gKjQ6CTg0IGU0IDAwIDAwIAlvcjMgcjQscjQsWyNdKjB4MAotWyAJXSo0OiBSX00zMlJfTE8xNgkudGV4dAotICo4OglkNCBjMCAxMiAzNCAJc2V0aCByNCxbI10qMHgxMjM0Ci0gKmM6CTg0IGU0IDg3IDY1IAlvcjMgcjQscjQsWyNdKjB4ODc2NQotICoxMDoJZDQgYzAgMTIgMzUgCXNldGggcjQsWyNdKjB4MTIzNQotICoxNDoJODQgZTQgODcgNjUgCW9yMyByNCxyNCxbI10qMHg4NzY1Ci0gKjE4OglkNCBjMCA4NyA2NSAJc2V0aCByNCxbI10qMHg4NzY1Ci0gKjFjOgk4NCBlNCA0MyAyMSAJb3IzIHI0LHI0LFsjXSoweDQzMjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL2hpZ2gtMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTVkMWQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvaGlnaC0xLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi07IFRlc3QgaGlnaC9zaGlnaCBoYW5kbGluZy4KLQotZm9vOgotCXNldGggcjQsI2hpZ2goZm9vKzB4MTAwMDApCi0Jb3IzICByNCxyNCwjbG93KGZvbysweDEwMDAwKQotCi0Jc2V0aCByNCwjaGlnaCgweDEyMzQ4NzY1KQotCW9yMyAgcjQscjQsI2xvdygweDEyMzQ4NzY1KQotCi0Jc2V0aCByNCwjc2hpZ2goMHgxMjM0ODc2NSkKLQlvcjMgIHI0LHI0LCNsb3coMHgxMjM0ODc2NSkKLQotCXNldGggcjQsI3NoaWdoKDB4ODc2NTQzMjEpCi0Jb3IzICByNCxyNCwjbG93KDB4ODc2NTQzMjEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnIuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9tMzJyLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMjM2NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL20zMnIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIE0zMlIgdGVzdGNhc2VzCi0KLWlmIFtpc3RhcmdldCBtMzJyKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0ICJoaWdoLTEiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsYXgtMSIKLSAgICBydW5fZHVtcF90ZXN0ICJ1cHBlcmNhc2UiCi0gICAgcnVuX2R1bXBfdGVzdCAiZnNsb3QiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL291dG9mcmFuZ2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvb3V0b2ZyYW5nZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzBkMzExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvb3V0b2ZyYW5nZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTsgVGVzdCBlcnJvciBtZXNzYWdlcyB3aGVyZSBicmFuY2hlcyBhcmUgb3V0IG9mIHJhbmdlLgotCi07IHsgZGctZG8gYXNzZW1ibGUgeyB0YXJnZXQgbTMyci0qLSogfSB9Ci0KLQkudGV4dAotCS5nbG9iYWwgZm9vCi1mb286Ci0JYmwucyBsYWJlbAotCQk7IHsgZGctZXJyb3IgIm91dCBvZiByYW5nZSIgIm91dCBvZiByYW5nZSBibC5zIiB7IHRhcmdldCAqLSotKiB9IHsgOCB9IH0KLQlibmMucyBsYWJlbAotCQk7IHsgZGctZXJyb3IgIm91dCBvZiByYW5nZSIgIm91dCBvZiByYW5nZSBibmMucyIgeyB0YXJnZXQgKi0qLSogfSB7IDEwIH0gfQotCWJyYS5zIGxhYmVsCi0JCTsgeyBkZy1lcnJvciAib3V0IG9mIHJhbmdlIiAib3V0IG9mIHJhbmdlIGJyYS5zIiB7IHRhcmdldCAqLSotKiB9IHsgMTIgfSB9Ci0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotCWxkMjQgcjAsIzAKLQlsZDI0IHIwLCMwCi0JbGQyNCByMCwjMAotbGFiZWw6Ci0Jam1wIHIxNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0ZmNiOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3JlbGF4LTEuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiByZWxheC0xCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCogPERvZXNOb3RXb3JrPjoKLSAqMDoJNzAgMDAgNzAgMDAgKglub3AgLT4gbm9wCi0KLTAqNCA8V29yaz46Ci0gKjQ6CTcwIDAwIDcwIDAwICoJbm9wIC0+IG5vcAotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuYnJhbmNoOgotCi0wKiA8YnJhbmNoPjoKLSAqMDoJZmYgMDAgMDAgMDEgCWJyYSA0IDxXb3JrPgotWyAJXSowOiBSX00zMlJfMjZfUENSRUwJLnRleHQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL20zMnIvcmVsYXgtMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZTEyYzAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci9yZWxheC0xLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi07IFRlc3QgcmVsYXhhdGlvbiBpbnRvIG5vbi16ZXJvIG9mZnNldCB0byBkaWZmZXJlbnQgc2VnbWVudC4KLQotCS5zZWN0aW9uIC5icmFuY2gsICJheCIsQHByb2diaXRzCi0JLmJhbGlnbiA0Ci1icmFuY2g6Ci0gICAgICAgIGJyYSBXb3JrCi0KLQotCS5zZWN0aW9uIC50ZXh0Ci0gICAgICAgIC5iYWxpZ24gNAotRG9lc05vdFdvcms6Ci0Jbm9wCi0Jbm9wCi0KLVdvcms6Ci0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiMTM0NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5kCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2FzOgotI29iamR1bXA6IC1kcgotI25hbWU6IHVwcGVyY2FzZQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArMDAwMCA8Zm9vPjoKLSAgIDA6CTEwIDgxIDEwIDkxICoJbXYgcjAscjEgLT4gbXZmYyByMCxjYnIKLQotMCswMDA0IDxoaWdoPjoKLSAgIDQ6CWQwIGMwIDAwIDAwIAlzZXRoIHIwLCMweDAKLVsgCV0qNDogUl9NMzJSX0hJMTZfVUxPCVsuXXRleHQKLQotMCswMDA4IDxzaGlnaD46Ci0gICA4OglkMCBjMCAwMCAwMCAJc2V0aCByMCwjMHgwCi1bIAldKjg6IFJfTTMyUl9ISTE2X1NMTwlbLl10ZXh0Ci0KLTArMDAwYyA8bG93PjoKLSAgIGM6CTgwIGUwIDAwIDBjIAlvcjMgcjAscjAsIzB4YwotWyAJXSpjOiBSX00zMlJfTE8xNglbLl10ZXh0Ci0KLTArMDAxMCA8c2RhPjoKLSAgMTA6CTgwIGEwIDAwIDAwIAlhZGQzIHIwLHIwLCMwCi1bIAldKjEwOiBSX00zMlJfU0RBMTYJc2RhdmFyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTMyci91cHBlcmNhc2UucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhZWFmZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tMzJyL3VwcGVyY2FzZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JhbCBmb28KLWZvbzoKLQltdiBSMCxSMQotCW12ZmMgUjAsQ0JSCi0KLWhpZ2g6Ci0Jc2V0aCByMCwjSElHSChoaWdoKQotc2hpZ2g6Ci0Jc2V0aCByMCwjU0hJR0goc2hpZ2gpCi1sb3c6Ci0Jb3IzIHIwLHIwLCNMT1cobG93KQotc2RhOgotCWFkZDMgcjAscjAsI1NEQShzZGF2YXIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvZ2FzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9nYXMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdlZWZhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9nYXMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIwotIyBTb21lIG02OGstY29mZiB0ZXN0cwotIwotaWYgW2lzdGFyZ2V0IG02OCotKi1jb2ZmXSB0aGVuIHsKLSAgICBnYXNfdGVzdCAicDI0MzAucyIgIiIgJHN0ZG9wdGxpc3QgImxvY2FsIGJyYW5jaCBub3QgaW4gdGV4dCBzZWN0aW9uIgotCi0gICAgZ2FzX3Rlc3QgInAyNDMwYS5zIiAiIiAkc3Rkb3B0bGlzdCAibG9jYWwgYnJhbmNoIG5vdCBpbiB0ZXh0IHNlY3Rpb24iCi0KLSAgICBnYXNfdGVzdCAidDEucyIgIiIgJHN0ZG9wdGxpc3QgIm11bHRpcGxlIC5maWxlIGRpcmVjdGl2ZXMiCi0KLSAgICBnYXNfdGVzdCAicDIzODkucyIgIiIgJHN0ZG9wdGxpc3QgImJzcyBmaWxsIgotCi0gICAgc2V0dXBfeGZhaWwgbTY4Ki0qLWNvZmYKLSAgICBnYXNfdGVzdF9lcnJvciAicDIzODlhLnMiICIiICJkZXRlY3QgYnNzIGZpbGwgd2l0aCBub24temVybyBkYXRhIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyMzg5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhOTNlOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODkucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgIEkgcmVhY2hlZCBhIHBvaW50IHdoZXJlIHRoZSBmaWxlIGxvb2tzCi0jIGNsZWFuIGFuZCBjb21wbGllcyB3aXRoIGdhcyBzeW50YXgsIGJ1dCBpdCBjb3JlIGR1bXBzIGdhcy4gSGVyZSdzIGEKLSMgbGl0dGxlIGdkYiBpbmZvOgotIwotIyBQcm9ncmFtIHRlcm1pbmF0ZWQgd2l0aCBzaWduYWwgMTEsIFNlZ21lbnRhdGlvbiBmYXVsdC4KLSMgIzAgIDB4NjMyM2MgaW4gbWVtY3B5ICgpCi0jIChnZGIpIGJ0Ci0jICMwICAweDYzMjNjIGluIG1lbWNweSAoKQotIyAjMSAgMHhmMmIwIGluIGZpbGxfc2VjdGlvbiAoYWJmZD0weGVhZWU4LCBmaWxlaGRyPTB4OGE3ZjQsIAotIyAgICAgZmlsZV9jdXJzb3I9MHhmN2ZmZjY1NCkgYXQgb2JqLWZvcm1hdC5jOjUzNAotIyAjMiAgMHgxMTJhOCBpbiB3cml0ZV9vYmplY3RfZmlsZSAoKSBhdCBvYmotZm9ybWF0LmM6MTc4NgotIyAjMyAgMHgxM2VmOCBpbiBtYWluIChhcmdjPTUsIGFyZ3Y9MHhmN2ZmZjdiYykgYXQgLi4vLi4vcDMvZ2FzL2FzLmM6MzEwCi0jIChnZGIpIAotIwotIyBnYXMgZGlkIG1hbmFnZSB0byBjcmVhdGUgdGhlIC5vIGZpbGUgYXQgdGhpcyBwb2ludC4KLQotCS5ic3MKLQotX0FTSUNfSU5UX1RCTDogICAuc3BhY2UgMzIsMAl8IGtlZXAgaW50ZXJydXB0IHJvdXRpbmVzIGhlcmUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OWEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjM4OWEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZiMjc2NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDIzODlhLnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQkuYnNzCi0KLV9BU0lDX0lOVF9UQkw6ICAgLnNwYWNlIDMyLDEJfCBrZWVwIGludGVycnVwdCByb3V0aW5lcyBoZXJlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTcyM2Q5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi9wMjQzMC5zCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIFRoaXMgZGlmZmVycyBmcm9tIHAyNDMwYS5zICh0aGUgY3VzdG9tZXIncyBhY3R1YWwgc291cmNlIGZpbGUpIG9ubHkKLSMgaW4gd2hpdGVzcGFjZSBhbmQgY29tbWVudHMuICBTdHJhbmdlbHksIHRoaXMgZmlsZSBnYXZlIG5vIHByb2JsZW1zLi4uCi0KLQkuc2VjdCBmb28KLXRhZzoKLQlicmEgdGFnCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzBhLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvcDI0MzBhLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMWZiMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay1jb2ZmL3AyNDMwYS5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0gICAgLnNlY3QgZm9vCi0KLXRhZzoKLQlicmEgdGFnCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrLWNvZmYvdDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi90MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzAxNWYyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGstY29mZi90MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyAxICJsaWJnY2MxLlMiCi0jIDQyICJsaWJ4eXoxLlMiCi0jIDI1OSAibGliZ2NjMS5TIgotCS50ZXh0Ci0JLnByb2MKLXwjUFJPQyMgMDQKLQkuZ2xvYmwJIF9fbXVsc2kzICAgICAgCi0gX19tdWxzaTMgICAgICA6Ci18I1BST0xPR1VFIyAwCi0JbGluawkgICVhNiAgICAgICAsIzAKLQlhZGRsCSMtTEYxNCwgICVzcCAgICAgICAKLQltb3ZlbWwJI0xTMTQsICAlc3AgICAgICAgQAotfCNQUk9MT0dVRSMgMQotCW1vdmV3CSAgJWE2ICAgICAgIEAoMHg4KSwgICAlZDAgICAgICAgCSAKLQltdWx1dwkgICVhNiAgICAgICBAKDB4ZSksICAgJWQwICAgICAgIAkgCi0JbW92ZXcJICAlYTYgICAgICAgQCgweGEpLCAgICVkMSAgICAgICAJIAotCW11bHV3CSAgJWE2ICAgICAgIEAoMHhjKSwgICAlZDEgICAgICAgCSAKLQlhZGR3CSAgJWQxICAgICAgICwgICAlZDAgICAgICAgCi0JbHNsbAkjOCwgICAlZDAgICAgICAgCi0JbHNsbAkjOCwgICAlZDAgICAgICAgCi0JbW92ZXcJICAlYTYgICAgICAgQCgweGEpLCAgICVkMSAgICAgICAJIAotCW11bHV3CSAgJWE2ICAgICAgIEAoMHhlKSwgICAlZDEgICAgICAgCSAKLQlhZGRsCSAgJWQxICAgICAgICwgICAlZDAgICAgICAgCi0JanJhCUxFMTQKLUxFMTQ6Ci18I1BST0xPR1VFIyAyCi0JbW92ZW1sCSAgJXNwICAgICAgIEAsICNMUzE0Ci0JdW5sawkgICVhNiAgICAgICAKLXwjUFJPTE9HVUUjIDMKLQlydHMKLQlMRjE0ID0gNAotCUxTMTQgPSAweDAwMDIJCSAKLQlMRkYxNCA9IDAKLSMgMzU0ICJsaWJnY2MxLlMiCi0JTFNTMTQgPSAweDAKLQlMVjE0ID0gMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9hbGwuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9hbGwuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGFiMmEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYWxsLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMKLSMgU29tZSBnZW5lcmljIG02OGsgdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBtNjgqLSotKl0gdGhlbiB7Ci0gICAgZ2FzX3Rlc3QgInQyLnMiICIiICIiICJjcm9zcy1zZWN0aW9uIGJyYW5jaCIKLSAgICBpZiBbaXN0YXJnZXQgbTY4Ki1tb3Rvcm9sYS1zeXN2XSB0aGVuIHsKLQlydW5fZHVtcF90ZXN0IHQyCi0gICAgfQotCi0gICAgZ2FzX3Rlc3QgInBpYzEucyIgIiIgIiIgIlBJQyBnZW5lcmF0aW9uIgotCi0gICAgZ2FzX3Rlc3QgImRpc3BlcnIucyIgIi1tNjgwMjAiICIiICJJbmNvcnJlY3QgRGlzcGxhY2VtZW50IHRvbyBsb25nIGVycm9yIgotCi0gICAgZ2FzX3Rlc3RfZXJyb3IgInAyNDEwLnMiICIiICJvdXQtb2YtcmFuZ2UgJ2JyYXMnIgotCi0gICAgcnVuX2R1bXBfdGVzdCBwY3JlbAotICAgIHJ1bl9kdW1wX3Rlc3Qgb3BlcmFuZHMKLSAgICBydW5fZHVtcF90ZXN0IGNhcwotICAgIHJ1bl9kdW1wX3Rlc3QgYml0ZmllbGQKLSAgICBydW5fZHVtcF90ZXN0IGxpbmsKLSAgICBydW5fZHVtcF90ZXN0IGZtb3ZlbWwKLQotICAgIHNldCB0ZXN0bmFtZSAiNjgwMDAgb3BlcmFuZHMiCi0gICAgZ2FzX3J1biAib3BlcmFuZHMucyIgIi1tNjgwMDAiICIyPmVyci5vdXQiCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggImNoaWxkIHByb2Nlc3MgZXhpdGVkIGFibm9ybWFsbHkiICRjb21wX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCXZlcmJvc2UgIiRjb21wX291dHB1dCIgMwotCWZhaWwgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiBbcmVnZXhwX2RpZmYgImVyci5vdXQiICIkc3JjZGlyLyRzdWJkaXIvb3A2ODAwMC5kIl0gdGhlbiB7Ci0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgcGFzcyAkdGVzdG5hbWUKLQl9Ci0gICAgfQotfQotaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgdW5zZXQgZXJyb3JJbmZvCi0gICAgfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmIxYmRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBiaXRmaWVsZAotCi0jIFRlc3QgaGFuZGxpbmcgb2YgYml0ZmllbGQgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGJmZXh0cyAlYTBALDEsMiwlZDAKLTArMDA0IDxmb29cKygweHwpND4gYmZleHRzICVhMEAsMSw2LCVkMAotMCswMDggPGZvb1wrKDB4fCk4PiBiZmV4dHMgJWEwQCwzLDIsJWQwCi0wKzAwYyA8Zm9vXCsoMHh8KWM+IGJmZXh0cyAlYTBALDMsNiwlZDAKLTArMDEwIDxmb29cKygweHwpMTA+IGJmZXh0cyAlYTBALDEsMiwlZDAKLTArMDE0IDxmb29cKygweHwpMTQ+IGJmZXh0cyAlYTBALDEsNiwlZDAKLTArMDE4IDxmb29cKygweHwpMTg+IGJmZXh0cyAlYTBALDMsMiwlZDAKLTArMDFjIDxmb29cKygweHwpMWM+IGJmZXh0cyAlYTBALDMsNiwlZDAKLTArMDIwIDxmb29cKygweHwpMjA+IGJmc2V0ICVhMEAsMSwyCi0wKzAyNCA8Zm9vXCsoMHh8KTI0PiBiZnNldCAlYTBALDEsNgotMCswMjggPGZvb1wrKDB4fCkyOD4gYmZzZXQgJWEwQCwzLDIKLTArMDJjIDxmb29cKygweHwpMmM+IGJmc2V0ICVhMEAsMyw2Ci0wKzAzMCA8Zm9vXCsoMHh8KTMwPiBiZnNldCAlYTBALDEsMgotMCswMzQgPGZvb1wrKDB4fCkzND4gYmZzZXQgJWEwQCwxLDYKLTArMDM4IDxmb29cKygweHwpMzg+IGJmc2V0ICVhMEAsMywyCi0wKzAzYyA8Zm9vXCsoMHh8KTNjPiBiZnNldCAlYTBALDMsNgotMCswNDAgPGZvb1wrKDB4fCk0MD4gYmZleHRzICVhMEAsJWQxLCVkMiwlZDAKLTArMDQ0IDxmb29cKygweHwpNDQ+IGJmZXh0cyAlYTBALCVkMSwlZDIsJWQwCi0wKzA0OCA8Zm9vXCsoMHh8KTQ4PiBiZnNldCAlYTBALCVkMSwlZDIKLTArMDRjIDxmb29cKygweHwpNGM+IGJmc2V0ICVhMEAsJWQxLCVkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9iaXRmaWVsZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDJmNzU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvYml0ZmllbGQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgVGVzdCBoYW5kbGluZyBvZiBiaXRmaWVsZCBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KLQkudGV4dAotCS5nbG9ibAlmb28KLWZvbzoJCi0JYmZleHRzCSglYTApeyYxOiYyfSwlZDAKLQliZmV4dHMJKCVhMCl7JjE6JigyKzQpfSwlZDAKLQliZmV4dHMJKCVhMCl7JigxKzIpOiYyfSwlZDAKLQliZmV4dHMJKCVhMCl7JigxKzIpOiYoMis0KX0sJWQwCi0JYmZleHRzCSVhMEAsJjEsJjIsJWQwCi0JYmZleHRzCSVhMEAsJjEsJigyKzQpLCVkMAotCWJmZXh0cwklYTBALCYxKzIsJjIsJWQwCi0JYmZleHRzCSVhMEAsJigxKzIpLCYoMis0KSwlZDAKLQliZnNldAkoJWEwKXsmMTomMn0KLQliZnNldAkoJWEwKXsmMTomKDIrNCl9Ci0JYmZzZXQJKCVhMCl7JigxKzIpOiYyfQotCWJmc2V0CSglYTApeyYoMSsyKTomKDIrNCl9Ci0JYmZzZXQJJWEwQCwmMSwmMgotCWJmc2V0CSVhMEAsJjEsJigyKzQpCi0JYmZzZXQJJWEwQCwmMSsyLCYyCi0JYmZzZXQJJWEwQCwmKDErMiksJigyKzQpCi0JYmZleHRzCSglYTApeyVkMTolZDJ9LCVkMAotCWJmZXh0cwklYTBALCVkMSwlZDIsJWQwCi0JYmZzZXQJKCVhMCl7JWQxOiVkMn0KLQliZnNldAklYTBALCVkMSwlZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzA5NzMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvY2FzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogY2FzCi0KLSMgVGVzdCBwYXJzaW5nIG9mIHRoZSBvcGVyYW5kcyBvZiB0aGUgY2FzIGluc3RydWN0aW9uCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGNhc3cgJWQwLCVkMSwlYTBACi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGNhc3cgJWQwLCVkMSwlYTBACi0wKzAwOCA8Zm9vXCsoMHh8KTg+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDBlIDxmb29cKygweHwpZT4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LEBcKCVkMFwpLEBcKCVkMVwpCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAxYSA8Zm9vXCsoMHh8KTFhPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsJWEwQCwlYTFACi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiBjYXMydyAlZDAsJWQyLCVkMywlZDQsQFwoJWQwXCksQFwoJWQxXCkKLTArMDI2IDxmb29cKygweHwpMjY+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCwlYTBALCVhMUAKLTArMDJjIDxmb29cKygweHwpMmM+IGNhczJ3ICVkMCwlZDIsJWQzLCVkNCxAXCglZDBcKSxAXCglZDFcKQotMCswMzIgPGZvb1wrKDB4fCkzMj4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswMzggPGZvb1wrKDB4fCkzOD4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotMCswM2UgPGZvb1wrKDB4fCkzZT4gY2FzMncgJWQwLCVkMiwlZDMsJWQ0LEBcKCVkMFwpLEBcKCVkMVwpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9jYXMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY0ZTdmNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Nhcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBUZXN0IHBhcnNpbmcgb2YgdGhlIG9wZXJhbmRzIG9mIHRoZSBjYXMgaW5zdHJ1Y3Rpb24KLQkudGV4dAotCS5nbG9ibAlmb28KLWZvbzoJCi0JY2FzCSVkMCwlZDEsKCVhMCkKLQljYXMJJWQwLCVkMSwlYTBACi0JY2FzMgklZDA6JWQyLCVkMzolZDQsKCVhMCk6KCVhMSkKLQljYXMyCSVkMDolZDIsJWQzOiVkNCwoJWQwKTooJWQxKQotCWNhczIJJWQwOiVkMiwlZDM6JWQ0LCVhMEA6JWExQAotCWNhczIJJWQwOiVkMiwlZDM6JWQ0LEAoJWEwKTpAKCVhMSkKLQljYXMyCSVkMDolZDIsJWQzOiVkNCxAKCVkMCk6QCglZDEpCi0JY2FzMgklZDAsJWQyLCVkMywlZDQsKCVhMCksKCVhMSkKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCwoJWQwKSwoJWQxKQotCWNhczIJJWQwLCVkMiwlZDMsJWQ0LCVhMEAsJWExQAotCWNhczIJJWQwLCVkMiwlZDMsJWQ0LEAoJWEwKSxAKCVhMSkKLQljYXMyCSVkMCwlZDIsJWQzLCVkNCxAKCVkMCksQCglZDEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Rpc3BlcnIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZGlzcGVyci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2QzYjdiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZGlzcGVyci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI05PX0FQUAotZ2NjMl9jb21waWxlZC46Ci1fX19nbnVfY29tcGlsZWRfYzoKLS50ZXh0Ci0JLmV2ZW4KLS5nbG9ibCBfZm9vCi1fZm9vOgotCWxpbmsgJWE2LCMtMTIKLQlmbW92ZXggJWE2QCgtMTIpLCVmcDAKLQlmbW92ZXggJWZwMCwlc3BALQotCWpic3IgX2JhcgotCWFkZHF3ICM4LCVzcAotCWFkZHF3ICM0LCVzcAotTDE6Ci0JdW5sayAlYTYKLQlydHMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvZm1vdmVtbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZTI3OTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogZm1vdmVtbAotCi0jIFRlc3QgaGFuZGxpbmcgb2YgZm1vdmVtbCBhbmQgZm1vdmVteCBpbnN0cnVjdGlvbnMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGZtb3ZlbCAlZnBjciwlYTBACi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IGZtb3ZlbCAlZnBzciwlYTBACi0wKzAwOCA8Zm9vXCsoMHh8KTg+IGZtb3ZlbCAlZnBpYXIsJWEwQAotMCswMGMgPGZvb1wrKDB4fCljPiBmbW92ZW1sICVmcHNyLyVmcGNyLCVhMEAKLTArMDEwIDxmb29cKygweHwpMTA+IGZtb3ZlbWwgJWZwaWFyLyVmcGNyLCVhMEAKLTArMDE0IDxmb29cKygweHwpMTQ+IGZtb3ZlbWwgJWZwaWFyLyVmcHNyLCVhMEAKLTArMDE4IDxmb29cKygweHwpMTg+IGZtb3ZlbWwgJWZwaWFyLyVmcHNyLyVmcGNyLCVhMEAKLTArMDFjIDxmb29cKygweHwpMWM+IGZtb3ZlbCAlZnBjciwlZDAKLTArMDIwIDxmb29cKygweHwpMjA+IGZtb3ZlbCAlZnBzciwlZDAKLTArMDI0IDxmb29cKygweHwpMjQ+IGZtb3ZlbCAlZnBpYXIsJWQwCi0wKzAyOCA8Zm9vXCsoMHh8KTI4PiBmbW92ZWwgJWZwaWFyLCVhMAotMCswMmMgPGZvb1wrKDB4fCkyYz4gZm1vdmVsICVhMEAsJWZwY3IKLTArMDMwIDxmb29cKygweHwpMzA+IGZtb3ZlbCAlYTBALCVmcHNyCi0wKzAzNCA8Zm9vXCsoMHh8KTM0PiBmbW92ZWwgJWEwQCwlZnBpYXIKLTArMDM4IDxmb29cKygweHwpMzg+IGZtb3ZlbWwgJWEwQCwlZnBzci8lZnBjcgotMCswM2MgPGZvb1wrKDB4fCkzYz4gZm1vdmVtbCAlYTBALCVmcGlhci8lZnBjcgotMCswNDAgPGZvb1wrKDB4fCk0MD4gZm1vdmVtbCAlYTBALCVmcGlhci8lZnBzcgotMCswNDQgPGZvb1wrKDB4fCk0ND4gZm1vdmVtbCAlYTBALCVmcGlhci8lZnBzci8lZnBjcgotMCswNDggPGZvb1wrKDB4fCk0OD4gZm1vdmVsICVkMCwlZnBjcgotMCswNGMgPGZvb1wrKDB4fCk0Yz4gZm1vdmVsICVkMCwlZnBzcgotMCswNTAgPGZvb1wrKDB4fCk1MD4gZm1vdmVsICVkMCwlZnBpYXIKLTArMDU0IDxmb29cKygweHwpNTQ+IGZtb3ZlbCAlYTAsJWZwaWFyCi0wKzA1OCA8Zm9vXCsoMHh8KTU4PiBmbW92ZWwgIzEsJWZwY3IKLTArMDYwIDxmb29cKygweHwpNjA+IGZtb3ZlbCAjMSwlZnBzcgotMCswNjggPGZvb1wrKDB4fCk2OD4gZm1vdmVsICMxLCVmcGlhcgotMCswNzAgPGZvb1wrKDB4fCk3MD4gZm1vdmVtbCAjMSwlZnBzci8lZnBjcgotMCswNzggPGZvb1wrKDB4fCk3OD4gZm1vdmVtbCAjMSwlZnBpYXIvJWZwY3IKLTArMDgwIDxmb29cKygweHwpODA+IGZtb3ZlbWwgIzEsJWZwaWFyLyVmcHNyCi0wKzA4OCA8Zm9vXCsoMHh8KTg4PiBmbW92ZW1sICMxLCVmcGlhci8lZnBzci8lZnBjcgotMCswOTAgPGZvb1wrKDB4fCk5MD4gZm1vdmVteCAlZnAxLCVhMEAKLTArMDk0IDxmb29cKygweHwpOTQ+IGZtb3ZlbXggJWZwNCwlYTBACi0wKzA5OCA8Zm9vXCsoMHh8KTk4PiBmbW92ZW14ICVmcDcsJWEwQAotMCswOWMgPGZvb1wrKDB4fCk5Yz4gZm1vdmVteCAlZnAxLyVmcDMsJWEwQAotMCswYTAgPGZvb1wrKDB4fClhMD4gZm1vdmVteCAlZnAxLSVmcDQsJWEwQAotMCswYTQgPGZvb1wrKDB4fClhND4gZm1vdmVteCAlZnAwLyVmcDcsJWEwQAotMCswYTggPGZvb1wrKDB4fClhOD4gZm1vdmVteCAlZnAwLSVmcDcsJWEwQAotMCswYWMgPGZvb1wrKDB4fClhYz4gZm1vdmVteCAlYTBALCVmcDAKLTArMGIwIDxmb29cKygweHwpYjA+IGZtb3ZlbXggJWEwQCwlZnAxCi0wKzBiNCA8Zm9vXCsoMHh8KWI0PiBmbW92ZW14ICVhMEAsJWZwNwotMCswYjggPGZvb1wrKDB4fCliOD4gZm1vdmVteCAlYTBALCVmcDAvJWZwMwotMCswYmMgPGZvb1wrKDB4fCliYz4gZm1vdmVteCAlYTBALCVmcDAvJWZwNAotMCswYzAgPGZvb1wrKDB4fCljMD4gZm1vdmVteCAlYTBALCVmcDItJWZwNAotMCswYzQgPGZvb1wrKDB4fCljND4gZm1vdmVteCAlYTBALCVmcDEtJWZwNwotMCswYzggPGZvb1wrKDB4fCljOD4gZm1vdmVteCAlZnAwLCVhMEAtCi0wKzBjYyA8Zm9vXCsoMHh8KWNjPiBmbW92ZW14ICVmcDAtJWZwNywlYTBALQotMCswZDAgPGZvb1wrKDB4fClkMD4gZm1vdmVteCAlZnAwLyVmcDQsJWEwQC0KLTArMGQ0IDxmb29cKygweHwpZDQ+IGZtb3ZlbXggJWEwQFwrLCVmcDcKLTArMGQ4IDxmb29cKygweHwpZDg+IGZtb3ZlbXggJWEwQFwrLCVmcDAtJWZwNwotMCswZGMgPGZvb1wrKDB4fClkYz4gZm1vdmVteCAlYTBAXCssJWZwMy8lZnA3Ci0wKzBlMCA8Zm9vXCsoMHh8KWUwPiBmbW92ZW14ICVkMCwlYTBALQotMCswZTQgPGZvb1wrKDB4fCllND4gZm1vdmVteCAlYTBAXCssJWQwCi0wKzBlOCA8Zm9vXCsoMHh8KWU4PiBmbW92ZW14ICVmcDEvJWZwNSwlYTBALQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9mbW92ZW1sLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0MjI0Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2Ztb3ZlbWwucworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSMgVGVzdCBoYW5kbGluZyBvZiB0aGUgZm1vdmVtbCBhbmQgZm1vdmVteCBpbnN0cnVjdGlvbnMuCi0JLnRleHQKLQkuZ2xvYmwJZm9vCi1mb286Ci0JZm1vdmVtbCAlZnBjciwlYTBACi0JZm1vdmVtbCAlZnBzciwlYTBACi0JZm1vdmVtbCAlZnBpYXIsJWEwQAotCWZtb3ZlbWwgJWZwY3IvJWZwc3IsJWEwQAotCWZtb3ZlbWwJJWZwY3IvJWZwaWFyLCVhMEAKLQlmbW92ZW1sCSVmcHNyLyVmcGlhciwlYTBACi0JZm1vdmVtbAklZnBjci8lZnBzci8lZnBpYXIsJWEwQAotCWZtb3ZlbWwJJWZwY3IsJWQwCi0JZm1vdmVtbAklZnBzciwlZDAKLQlmbW92ZW1sCSVmcGlhciwlZDAKLQlmbW92ZW1sCSVmcGlhciwlYTAKLQlmbW92ZW1sICVhMEAsJWZwY3IKLQlmbW92ZW1sICVhMEAsJWZwc3IKLQlmbW92ZW1sICVhMEAsJWZwaWFyCi0JZm1vdmVtbCAlYTBALCVmcHNyLyVmcGNyCi0JZm1vdmVtbAklYTBALCVmcGlhci8lZnBjcgotCWZtb3ZlbWwJJWEwQCwlZnBpYXIvJWZwc3IKLQlmbW92ZW1sCSVhMEAsJWZwc3IvJWZwaWFyLyVmcGNyCi0JZm1vdmVtbAklZDAsJWZwY3IKLQlmbW92ZW1sCSVkMCwlZnBzcgotCWZtb3ZlbWwJJWQwLCVmcGlhcgotCWZtb3ZlbWwJJWEwLCVmcGlhcgotCWZtb3ZlbWwJJjEsJWZwY3IKLQlmbW92ZW1sCSYxLCVmcHNyCi0JZm1vdmVtbAkmMSwlZnBpYXIKLQlmbW92ZW1sCSYxLCVmcGNyLyVmcHNyCi0JZm1vdmVtbAkmMSwlZnBjci8lZnBpYXIKLQlmbW92ZW1sCSYxLCVmcHNyLyVmcGlhcgotCWZtb3ZlbWwJJjEsJWZwaWFyLyVmcHNyLyVmcGNyCi0KLQlmbW92ZW14ICVmcDEsJWEwQAotCWZtb3ZlbXggJWZwNCwlYTBACi0JZm1vdmVteCAlZnA3LCVhMEAKLQlmbW92ZW14ICVmcDEvJWZwMywlYTBACi0JZm1vdmVteAklZnAxLSVmcDQsJWEwQAotCWZtb3ZlbXgJJWZwMC8lZnA3LCVhMEAKLQlmbW92ZW14CSVmcDAtJWZwNywlYTBACi0JZm1vdmVteCAlYTBALCVmcDAKLQlmbW92ZW14ICVhMEAsJWZwMQotCWZtb3ZlbXggJWEwQCwlZnA3Ci0JZm1vdmVteCAlYTBALCVmcDAvJWZwMwotCWZtb3ZlbXgJJWEwQCwlZnAwLyVmcDQKLQlmbW92ZW14CSVhMEAsJWZwMi0lZnA0Ci0JZm1vdmVteAklYTBALCVmcDEtJWZwNwotCWZtb3ZlbXgJJjEsJWEwQC0KLQlmbW92ZW14CSYweGZmLCVhMEAtCi0JZm1vdmVteAkmMHgxMSwlYTBALQotCWZtb3ZlbXgJJWEwQCssJjEKLQlmbW92ZW14CSVhMEArLCYweGZmCi0JZm1vdmVteAklYTBAKywmMHgxMQotCWZtb3ZlbXgJJWQwLCVhMEAtCi0JZm1vdmVteAklYTBAKywlZDAKLQlmbW92ZW14CSZzeW0sJWEwQC0KLQlzeW0JPQkweDIyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUyNjNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5kCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IGxpbmsKLQotIyBUZXN0IGhhbmRsaW5nIG9mIGxpbmsgaW5zdHJ1Y3Rpb24uCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwIDxmb28+IGxpbmt3ICVmcCwjMAotMCswMDQgPGZvb1wrKDB4fCk0PiBsaW5rdyAlZnAsIy00Ci0wKzAwOCA8Zm9vXCsoMHh8KTg+IGxpbmt3ICVmcCwjLTMyNzY3Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IGxpbmt3ICVmcCwjLTMyNzY4Ci0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBsaW5rbCAlZnAsIy0zMjc2OQotMCswMTYgPGZvb1wrKDB4fCkxNj4gbGlua3cgJWZwLCMzMjc2NwotMCswMWEgPGZvb1wrKDB4fCkxYT4gbGlua2wgJWZwLCMzMjc2OAotMCswMjAgPGZvb1wrKDB4fCkyMD4gbGlua2wgJWZwLCMzMjc2OQotMCswMjYgPGZvb1wrKDB4fCkyNj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL2xpbmsucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTMyMWRkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvbGluay5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyBUZXN0IGhhbmRsaW5nIG9mIGxpbmsgaW5zdHJ1Y3Rpb24uCi0JLnRleHQKLQkuZ2xvYmwJZm9vCi1mb286Ci0JbGluawklYTYsJjAKLQlsaW5rCSVhNiwmLTQKLQlsaW5rCSVhNiwmLTB4N2ZmZgotCWxpbmsJJWE2LCYtMHg4MDAwCi0JbGluawklYTYsJi0weDgwMDEKLQlsaW5rCSVhNiwmMHg3ZmZmCi0JbGluawklYTYsJjB4ODAwMAotCWxpbmsJJWE2LCYweDgwMDEKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3A2ODAwMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcDY4MDAwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGQ1YTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcDY4MDAwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotIyBUaGlzIHNob3VsZCBtYXRjaCB0aGUgc3RkZXJyIG91dHB1dCBvZiBnYXMgLW02ODAwMCBvbiBvcGVyYW5kcy5zLgotIyBXZSBkb24ndCBib3RoZXIgdG8gbWF0Y2ggdGhlIGV4YWN0IGVycm9yIG1lc3NhZ2UsIGJ1dCBpbnN0ZWFkIGp1c3QKLSMgbG9vayBmb3IgdGhlIHN0YXRlbWVudHMgd2hpY2ggc2hvdWxkIGZhaWwuCi0KLS4qb3BlcmFuZHMuczogQXNzZW1ibGVyIG1lc3NhZ2VzOgotLipzdGF0ZW1lbnQgYHRzdGwgJWEwJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6dzo0XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOnc6OFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCg4LCVkMDpsOjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoOCwlZDA6bDo0XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDgsJWQwOmw6OFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwXCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwXCo0XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwXCo4XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAud1wqNFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC53XCo4XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTAsJWQwLmxcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCg4LCVhMCwlZDAubFwqNFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDgsJWEwLCVkMC5sXCo4XCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoOCwlYTEud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgOFwoJWEwLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDhcKCVkMC53XCoyLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCA4XCglYTEud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCglYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCglZDAud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVkMCwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCVhMS53XCoyLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglYTAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWQwLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCglZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAwMCwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMDAwXCglYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJXphMUBcKDEwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlemExQFwoMTAwMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlemExLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMCwlZDAsJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWExLndcKjIsJXphMVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglemExLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCVkMCwlemExXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoMTAwMDAwLCV6YTFcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMDAwXCglemExXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJXpkMTp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMCwlemQxOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCglemQxOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJWEwLCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJXpkMSwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXCgxMDAwLCV6YTEud1wqMiwlYTBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgMTAwMFwoJWEwLCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAxMDAwXCglemQxLCVhMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKDEwMDAsJXpkMS53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIDEwMDBcKCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKCV6ZDEud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCAlYTBAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKDEwMDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgwXClAXCgyMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMFxdLCVkMDp3OjIsMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTBcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDBcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDBcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbJWEwXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTBcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFswXF0sJWQwOnc6MiwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFswXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoMTAwMCwlZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKDEwMDAsJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCgxMDAwLCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgQFwoMTAwMCwlZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsICVhMEBcKCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgJWEwQFwoJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBAXCglZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIEBcKCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFsxMDAwLCVkMDp3OjIsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDAsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTEsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlYTE6dzoyLCVhMFxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWEwLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgdHN0bCBcKFxbMTAwMCwlZDAsJWEwXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWzEwMDAsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTAsJWQwOnc6MlxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVkMCwlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslYTAsJWQwOnc6MlxdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDAsJWEwXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHRzdGwgXChcWyVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGB0c3RsIFwoXFslZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCg4LCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCg4LCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDhcKCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoJXBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMTAwMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVwYywlZDAud1wqMlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlZDAsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCVhMS53XCoyLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlYTEsJXBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJXBjLCVkMC53XCoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgMTAwMFwoJWQwLCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVhMSwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAwMCwlcGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwMDBcKCVwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMTAwMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwLCV6cGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWQwLCV6cGNcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKDEwMDAsJWExLndcKjIsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoMTAwMCwlYTEsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCV6cGMsJWQwLndcKjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAxMDAwXCglZDAsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDBcKCVhMSwlenBjXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXCgxMDAwMDAsJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIDEwMDAwMFwoJXpwY1wpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDEwMDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoMFwpQFwoJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICVwY0BcKDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGNcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGNcXSwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGNcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDBcKUBcKDIwMDAsJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwXClAXCglZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDBcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMFwpQFwoMjAwMCwlZDA6dzoyXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDBcKUBcKCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoMFwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGNcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjXF0sJWQwOnc6MlwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGNcXSwlZDA6dzoyLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwY1xdLCVkMDp3OjJcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwLCVkMDp3OjJcKUBcKDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCgxMDAwLCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlcGNAXCglZDA6dzoyXClAXCgyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXBjQFwoJWQwOnc6MlwpQFwoMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMDp3OjIsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMCwlcGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCVwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlcGMsJWExXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVhMTp3OjIsJXBjXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVwYywlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXBjXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTEsJXBjXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJXBjLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwYywlYTBcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyVwYywlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbJWQwLCVwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgJXpwY0BcKDEwMDAsJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCgxMDAwLCVkMDp3OjJcKUBcKDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSAlenBjQFwoJWQwOnc6MlwpQFwoMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhICV6cGNAXCglZDA6dzoyXClAXCgwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwYywlZDA6dzoyXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFsxMDAwLCVkMDp3OjIsJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTEsJXpwY1xdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlenBjLCVhMVxdLDIwMDBcKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlYTE6dzoyLCV6cGNcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJXpwYywlZDA6dzoyXF1cKScgaWdub3JlZAotLipzdGF0ZW1lbnQgYHBlYSBcKFxbMTAwMCwlZDAsJXpwY1xdXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWzEwMDAsJWExLCV6cGNcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjLCVkMDp3OjJcXSwyMDAwXCknIGlnbm9yZWQKLS4qc3RhdGVtZW50IGBwZWEgXChcWyV6cGMsJWEwXF0sMjAwMFwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslenBjLCVkMDp3OjJcXVwpJyBpZ25vcmVkCi0uKnN0YXRlbWVudCBgcGVhIFwoXFslZDAsJXpwY1xdXCknIGlnbm9yZWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvb3BlcmFuZHMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzODNjMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IG9wZXJhbmRzCi0KLSMgVGVzdCBoYW5kbGluZyBvZiBNSVQgYW5kIE1vdG9yb2xhIHN5bnRheCBvcGVyYW5kcwotIyBJZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSwgc2VlIGFsc28gb3A2ODAwMC5kLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiB0c3RsICVkMAotMCswMDIgPGZvb1wrKDB4fCkyPiB0c3RsICVhMAotMCswMDQgPGZvb1wrKDB4fCk0PiB0c3RsICVhMEAKLTArMDA2IDxmb29cKygweHwpNj4gdHN0bCAlYTBACi0wKzAwOCA8Zm9vXCsoMHh8KTg+IHRzdGwgJWEwQFwrCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IHRzdGwgJWEwQFwrCi0wKzAwYyA8Zm9vXCsoMHh8KWM+IHRzdGwgJWEwQC0KLTArMDBlIDxmb29cKygweHwpZT4gdHN0bCAlYTBALQotMCswMTAgPGZvb1wrKDB4fCkxMD4gdHN0bCAlYTBAXCg4XCkKLTArMDE0IDxmb29cKygweHwpMTQ+IHRzdGwgJWEwQFwoOFwpCi0wKzAxOCA8Zm9vXCsoMHh8KTE4PiB0c3RsICVhMEBcKDhcKQotMCswMWMgPGZvb1wrKDB4fCkxYz4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzAyMCA8Zm9vXCsoMHh8KTIwPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKLTArMDI0IDxmb29cKygweHwpMjQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOndcKQotMCswMjggPGZvb1wrKDB4fCkyOD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzoyXCkKLTArMDJjIDxmb29cKygweHwpMmM+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6NFwpCi0wKzAzMCA8Zm9vXCsoMHh8KTMwPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjhcKQotMCswMzQgPGZvb1wrKDB4fCkzND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzAzOCA8Zm9vXCsoMHh8KTM4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDNjIDxmb29cKygweHwpM2M+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6MlwpCi0wKzA0MCA8Zm9vXCsoMHh8KTQwPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjRcKQotMCswNDQgPGZvb1wrKDB4fCk0ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo4XCkKLTArMDQ4IDxmb29cKygweHwpNDg+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpCi0wKzA0YyA8Zm9vXCsoMHh8KTRjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDUwIDxmb29cKygweHwpNTA+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswNTQgPGZvb1wrKDB4fCk1ND4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDoyXCkKLTArMDU4IDxmb29cKygweHwpNTg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6NFwpCi0wKzA1YyA8Zm9vXCsoMHh8KTVjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjhcKQotMCswNjAgPGZvb1wrKDB4fCk2MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6d1wpCi0wKzA2NCA8Zm9vXCsoMHh8KTY0PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3XCkKLTArMDY4IDxmb29cKygweHwpNjg+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCi0wKzA2YyA8Zm9vXCsoMHh8KTZjPiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjRcKQotMCswNzAgPGZvb1wrKDB4fCk3MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6dzo4XCkKLTArMDc0IDxmb29cKygweHwpNzQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmxcKQotMCswNzggPGZvb1wrKDB4fCk3OD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bFwpCi0wKzA3YyA8Zm9vXCsoMHh8KTdjPiB0c3RsICVhMEBcKDArMDA4LCVkMDpsOjJcKQotMCswODAgPGZvb1wrKDB4fCk4MD4gdHN0bCAlYTBAXCgwKzAwOCwlZDA6bDo0XCkKLTArMDg0IDxmb29cKygweHwpODQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOmw6OFwpCi0wKzA4OCA8Zm9vXCsoMHh8KTg4PiB0c3RsICVhMEBcKDArMDA4LCVkMDpsXCkKLTArMDhjIDxmb29cKygweHwpOGM+IHRzdGwgJWEwQFwoMCswMDgsJWExOnc6MlwpCi0wKzA5MCA8Zm9vXCsoMHh8KTkwPiB0c3RsICVhMUBcKDArMDA4LCVhMDpsXCkKLTArMDk0IDxmb29cKygweHwpOTQ+IHRzdGwgJWEwQFwoMCswMDgsJWQwOnc6MlwpCi0wKzA5OCA8Zm9vXCsoMHh8KTk4PiB0c3RsICVhMEBcKDArMDA4LCVkMDp3OjJcKQotMCswOWMgPGZvb1wrKDB4fCk5Yz4gdHN0bCAlYTBAXCgwKzAwOCwlYTE6dzoyXCkKLTArMGEwIDxmb29cKygweHwpYTA+IHRzdGwgJWEwQFwoMCswMDAsJWQwOnc6MlwpCi0wKzBhNCA8Zm9vXCsoMHh8KWE0PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKQotMCswYTggPGZvb1wrKDB4fClhOD4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGFlIDxmb29cKygweHwpYWU+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBiNCA8Zm9vXCsoMHh8KWI0PiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKQotMCswYjggPGZvb1wrKDB4fCliOD4gdHN0bCBAXCgwKzNlOFwpCi0wKzBiZSA8Zm9vXCsoMHh8KWJlPiB0c3RsICVhMEBcKDArMTg2YTBcKQotMCswYzYgPGZvb1wrKDB4fCljNj4gdHN0bCAlYTBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMGNjIDxmb29cKygweHwpY2M+IHRzdGwgJWEwQFwoMCszZTgsJWQwOmxcKQotMCswZDIgPGZvb1wrKDB4fClkMj4gdHN0bCAlYTBAXCgwKzNlOCwlYTE6dzoyXCkKLTArMGQ4IDxmb29cKygweHwpZDg+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBkZSA8Zm9vXCsoMHh8KWRlPiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXCkKLTArMGU0IDxmb29cKygweHwpZTQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzBlYSA8Zm9vXCsoMHh8KWVhPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCswZjAgPGZvb1wrKDB4fClmMD4gdHN0bCBAXCgwKzAwMCwlZDA6dzoyXCkKLTArMGY0IDxmb29cKygweHwpZjQ+IHRzdGwgJWEwQFwoMCsxODZhMFwpCi0wKzBmYyA8Zm9vXCsoMHh8KWZjPiB0c3RsICVhMEBcKDArMTg2YTBcKQotMCsxMDQgPGZvb1wrKDB4fCkxMDQ+IHRzdGwgQFwoMCszZTgsJWQwOnc6MlwpCi0wKzEwYSA8Zm9vXCsoMHh8KTEwYT4gdHN0bCBAXCgwKzE4NmEwXCkKLTArMTEyIDxmb29cKygweHwpMTEyPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKQotMCsxMTggPGZvb1wrKDB4fCkxMTg+IHRzdGwgQFwoMCszZTgsJWQwOmxcKQotMCsxMWUgPGZvb1wrKDB4fCkxMWU+IHRzdGwgQFwoMCszZTgsJWExOnc6MlwpCi0wKzEyNCA8Zm9vXCsoMHh8KTEyND4gdHN0bCBAXCgwKzNlOCwlZDA6dzoyXCkKLTArMTJhIDxmb29cKygweHwpMTJhPiB0c3RsIEBcKDArM2U4LCVkMDpsXCkKLTArMTMwIDxmb29cKygweHwpMTMwPiB0c3RsIEBcKDArMTg2YTBcKQotMCsxMzggPGZvb1wrKDB4fCkxMzg+IHRzdGwgQFwoMCsxODZhMFwpCi0wKzE0MCA8Zm9vXCsoMHh8KTE0MD4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE0NiA8Zm9vXCsoMHh8KTE0Nj4gdHN0bCBAXCgwKzNlOFwpCi0wKzE0YyA8Zm9vXCsoMHh8KTE0Yz4gdHN0bCBAXCgwKzAwMFwpCi0wKzE1MCA8Zm9vXCsoMHh8KTE1MD4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE1NiA8Zm9vXCsoMHh8KTE1Nj4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE1YyA8Zm9vXCsoMHh8KTE1Yz4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE2MiA8Zm9vXCsoMHh8KTE2Mj4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE2OCA8Zm9vXCsoMHh8KTE2OD4gdHN0bCAlYTBAXCgwKzNlOFwpCi0wKzE2ZSA8Zm9vXCsoMHh8KTE2ZT4gdHN0bCBAXCgwKzNlOFwpCi0wKzE3NCA8Zm9vXCsoMHh8KTE3ND4gdHN0bCBAXCgwKzNlOFwpCi0wKzE3YSA8Zm9vXCsoMHh8KTE3YT4gdHN0bCBAXCgwKzAwMFwpCi0wKzE3ZSA8Zm9vXCsoMHh8KTE3ZT4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzE4NiA8Zm9vXCsoMHh8KTE4Nj4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzE4YyA8Zm9vXCsoMHh8KTE4Yz4gdHN0bCAlYTBAXCgwKzNlOFwpQFwoMCs3ZDBcKQotMCsxOTQgPGZvb1wrKDB4fCkxOTQ+IHRzdGwgQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxOWMgPGZvb1wrKDB4fCkxOWM+IHRzdGwgQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxYTIgPGZvb1wrKDB4fCkxYTI+IHRzdGwgQFwoMCszZThcKUBcKDArN2QwXCkKLTArMWFhIDxmb29cKygweHwpMWFhPiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMWIwIDxmb29cKygweHwpMWIwPiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWI0IDxmb29cKygweHwpMWI0PiB0c3RsICVhMEBcKDArMDAwXClAXCgwKzdkMFwpCi0wKzFiYSA8Zm9vXCsoMHh8KTFiYT4gdHN0bCBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFjMCA8Zm9vXCsoMHh8KTFjMD4gdHN0bCBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzFjNCA8Zm9vXCsoMHh8KTFjND4gdHN0bCBAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCsxY2EgPGZvb1wrKDB4fCkxY2E+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsxZDIgPGZvb1wrKDB4fCkxZDI+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsxZDggPGZvb1wrKDB4fCkxZDg+IHRzdGwgJWEwQFwoMCszZThcKUBcKDArN2QwXCkKLTArMWUwIDxmb29cKygweHwpMWUwPiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMWU4IDxmb29cKygweHwpMWU4PiB0c3RsIEBcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMWVlIDxmb29cKygweHwpMWVlPiB0c3RsIEBcKDArM2U4XClAXCgwKzdkMFwpCi0wKzFmNiA8Zm9vXCsoMHh8KTFmNj4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzFmYyA8Zm9vXCsoMHh8KTFmYz4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzIwMCA8Zm9vXCsoMHh8KTIwMD4gdHN0bCAlYTBAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCsyMDYgPGZvb1wrKDB4fCkyMDY+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwLCVkMDp3OjJcKQotMCsyMGMgPGZvb1wrKDB4fCkyMGM+IHRzdGwgQFwoMCswMDBcKUBcKDArMDAwLCVkMDp3OjJcKQotMCsyMTAgPGZvb1wrKDB4fCkyMTA+IHRzdGwgQFwoMCswMDBcKUBcKDArN2QwXCkKLTArMjE2IDxmb29cKygweHwpMjE2PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjFlIDxmb29cKygweHwpMjFlPiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjI0IDxmb29cKygweHwpMjI0PiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjJjIDxmb29cKygweHwpMjJjPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjMyIDxmb29cKygweHwpMjMyPiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjM4IDxmb29cKygweHwpMjM4PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjNjIDxmb29cKygweHwpMjNjPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjQyIDxmb29cKygweHwpMjQyPiB0c3RsIEBcKDArMDAwLCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjQ2IDxmb29cKygweHwpMjQ2PiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjRlIDxmb29cKygweHwpMjRlPiB0c3RsICVhMEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjU2IDxmb29cKygweHwpMjU2PiB0c3RsICVhMEBcKDArM2U4LCVkMDpsXClAXCgwKzdkMFwpCi0wKzI1ZSA8Zm9vXCsoMHh8KTI1ZT4gdHN0bCAlYTFAXCgwKzNlOCwlYTA6bFwpQFwoMCs3ZDBcKQotMCsyNjYgPGZvb1wrKDB4fCkyNjY+IHRzdGwgJWEwQFwoMCszZTgsJWExOnc6MlwpQFwoMCs3ZDBcKQotMCsyNmUgPGZvb1wrKDB4fCkyNmU+IHRzdGwgJWEwQFwoMCszZTgsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyNzQgPGZvb1wrKDB4fCkyNzQ+IHRzdGwgJWEwQFwoMCszZTgsJWQwOmxcKUBcKDArMDAwXCkKLTArMjdhIDxmb29cKygweHwpMjdhPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjgyIDxmb29cKygweHwpMjgyPiB0c3RsIEBcKDArM2U4LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArMjg4IDxmb29cKygweHwpMjg4PiB0c3RsICVhMEBcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArMjhlIDxmb29cKygweHwpMjhlPiB0c3RsICVhMEBcKDArMDAwLCVkMDpsXClAXCgwKzdkMFwpCi0wKzI5NCA8Zm9vXCsoMHh8KTI5ND4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzI5OCA8Zm9vXCsoMHh8KTI5OD4gdHN0bCAlYTBAXCgwKzAwMCwlZDA6bFwpQFwoMCswMDBcKQotMCsyOWMgPGZvb1wrKDB4fCkyOWM+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCsyYTIgPGZvb1wrKDB4fCkyYTI+IHRzdGwgQFwoMCswMDAsJWQwOnc6MlwpQFwoMCswMDBcKQotMCsyYTYgPGZvb1wrKDB4fCkyYTY+IHBlYSAlcGNAXCgwKzJiMCA8Zm9vXCsoMHh8KTJiMD5cKQotMCsyYWEgPGZvb1wrKDB4fCkyYWE+IHBlYSAlcGNAXCgwKzJiNCA8Zm9vXCsoMHh8KTJiND5cKQotMCsyYWUgPGZvb1wrKDB4fCkyYWU+IHBlYSAlcGNAXCgwKzJiOCA8Zm9vXCsoMHh8KTJiOD5cKQotMCsyYjIgPGZvb1wrKDB4fCkyYjI+IHBlYSAlcGNAXCgwKzAwMCA8Zm9vPlwpCi0wKzJiNiA8Zm9vXCsoMHh8KTJiNj4gcGVhICVwY0BcKDArMmMwIDxmb29cKygweHwpMmMwPiwlZDA6dzoyXCkKLTArMmJhIDxmb29cKygweHwpMmJhPiBwZWEgJXBjQFwoMCsyYmMgPGZvb1wrKDB4fCkyYmM+LCVkMDp3OjJcKQotMCsyYmUgPGZvb1wrKDB4fCkyYmU+IHBlYSAlcGNAXCgwKzJjOCA8Zm9vXCsoMHh8KTJjOD4sJWQwOnc6MlwpCi0wKzJjMiA8Zm9vXCsoMHh8KTJjMj4gcGVhICVwY0BcKDArMmNjIDxmb29cKygweHwpMmNjPiwlZDA6bFwpCi0wKzJjNiA8Zm9vXCsoMHh8KTJjNj4gcGVhICVwY0BcKDArMmQwIDxmb29cKygweHwpMmQwPiwlYTA6bFwpCi0wKzJjYSA8Zm9vXCsoMHh8KTJjYT4gcGVhICVwY0BcKDArMmQ0IDxmb29cKygweHwpMmQ0PiwlZDA6dzoyXCkKLTArMmNlIDxmb29cKygweHwpMmNlPiBwZWEgJXBjQFwoMCsyZDggPGZvb1wrKDB4fCkyZDg+LCVkMDpsXCkKLTArMmQyIDxmb29cKygweHwpMmQyPiBwZWEgJXBjQFwoMCsyZGMgPGZvb1wrKDB4fCkyZGM+LCVhMDpsXCkKLTArMmQ2IDxmb29cKygweHwpMmQ2PiBwZWEgJXBjQFwoMCsyZDggPGZvb1wrKDB4fCkyZDg+LCVkMDp3OjJcKQotMCsyZGEgPGZvb1wrKDB4fCkyZGE+IHBlYSAlcGNAXCgwKzJkYyA8Zm9vXCsoMHh8KTJkYz4sJWQwOmxcKQotMCsyZGUgPGZvb1wrKDB4fCkyZGU+IHBlYSAlcGNAXCgwKzJlMCA8Zm9vXCsoMHh8KTJlMD4sJWEwOmxcKQotMCsyZTIgPGZvb1wrKDB4fCkyZTI+IHBlYSAlcGNAXCgwKzZjYyA8Lio+LCVkMDp3OjJcKQotMCsyZTggPGZvb1wrKDB4fCkyZTg+IHBlYSAlcGNAXCgwKzE4OThhIDwuKj5cKQotMCsyZjAgPGZvb1wrKDB4fCkyZjA+IHBlYSAlcGNAXCgwKzZkYSA8Lio+LCVkMDp3OjJcKQotMCsyZjYgPGZvb1wrKDB4fCkyZjY+IHBlYSAlcGNAXCgwKzZlMCA8Lio+LCVkMDpsXCkKLTArMmZjIDxmb29cKygweHwpMmZjPiBwZWEgJXBjQFwoMCs2ZTYgPC4qPiwlYTE6dzoyXCkKLTArMzAyIDxmb29cKygweHwpMzAyPiBwZWEgJXBjQFwoMCs2ZWMgPC4qPiwlYTE6bFwpCi0wKzMwOCA8Zm9vXCsoMHh8KTMwOD4gcGVhICVwY0BcKDArNmYyIDwuKj4sJWQwOnc6MlwpCi0wKzMwZSA8Zm9vXCsoMHh8KTMwZT4gcGVhICVwY0BcKDArNmY4IDwuKj4sJWQwOmxcKQotMCszMTQgPGZvb1wrKDB4fCkzMTQ+IHBlYSAlcGNAXCgwKzZmZSA8Lio+LCVhMTpsXCkKLTArMzFhIDxmb29cKygweHwpMzFhPiBwZWEgJXBjQFwoMCsxODliYyA8Lio+XCkKLTArMzIyIDxmb29cKygweHwpMzIyPiBwZWEgJXBjQFwoMCsxODljNCA8Lio+XCkKLTArMzJhIDxmb29cKygweHwpMzJhPiBwZWEgJXpwY0BcKDArM2U4LCVkMDp3OjJcKQotMCszMzAgPGZvb1wrKDB4fCkzMzA+IHBlYSAlenBjQFwoMCsxODZhMFwpCi0wKzMzOCA8Zm9vXCsoMHh8KTMzOD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXCkKLTArMzNlIDxmb29cKygweHwpMzNlPiBwZWEgJXpwY0BcKDArM2U4LCVkMDpsXCkKLTArMzQ0IDxmb29cKygweHwpMzQ0PiBwZWEgJXpwY0BcKDArM2U4LCVhMTp3OjJcKQotMCszNGEgPGZvb1wrKDB4fCkzNGE+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKQotMCszNTAgPGZvb1wrKDB4fCkzNTA+IHBlYSAlenBjQFwoMCszZTgsJWQwOnc6MlwpCi0wKzM1NiA8Zm9vXCsoMHh8KTM1Nj4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpCi0wKzM1YyA8Zm9vXCsoMHh8KTM1Yz4gcGVhICV6cGNAXCgwKzNlOCwlYTE6bFwpCi0wKzM2MiA8Zm9vXCsoMHh8KTM2Mj4gcGVhICV6cGNAXCgwKzE4NmEwXCkKLTArMzZhIDxmb29cKygweHwpMzZhPiBwZWEgJXpwY0BcKDArMTg2YTBcKQotMCszNzIgPGZvb1wrKDB4fCkzNzI+IHBlYSAlcGNAXCgwKzc1YyA8Lio+XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMzdhIDxmb29cKygweHwpMzdhPiBwZWEgJXBjQFwoMCs3NjQgPC4qPlwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzM4MCA8Zm9vXCsoMHh8KTM4MD4gcGVhICVwY0BcKDArNzZhIDwuKj5cKUBcKDArN2QwXCkKLTArMzg4IDxmb29cKygweHwpMzg4PiBwZWEgJXBjQFwoMCszOGEgPGZvb1wrKDB4fCkzOGE+XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArMzhlIDxmb29cKygweHwpMzhlPiBwZWEgJXBjQFwoMCszOTAgPGZvb1wrKDB4fCkzOTA+XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArMzkyIDxmb29cKygweHwpMzkyPiBwZWEgJXBjQFwoMCszOTQgPGZvb1wrKDB4fCkzOTQ+XClAXCgwKzdkMFwpCi0wKzM5OCA8Zm9vXCsoMHh8KTM5OD4gcGVhICVwY0BcKDArNzgyIDwuKj5cKUBcKDArN2QwLCVkMDp3OjJcKQotMCszYTAgPGZvb1wrKDB4fCkzYTA+IHBlYSAlcGNAXCgwKzc4YSA8Lio+XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2E2IDxmb29cKygweHwpM2E2PiBwZWEgJXBjQFwoMCs3OTAgPC4qPlwpQFwoMCs3ZDBcKQotMCszYWUgPGZvb1wrKDB4fCkzYWU+IHBlYSAlcGNAXCgwKzNiMCA8Zm9vXCsoMHh8KTNiMD5cKUBcKDArN2QwLCVkMDp3OjJcKQotMCszYjQgPGZvb1wrKDB4fCkzYjQ+IHBlYSAlcGNAXCgwKzNiNiA8Zm9vXCsoMHh8KTNiNj5cKUBcKDArMDAwLCVkMDp3OjJcKQotMCszYjggPGZvb1wrKDB4fCkzYjg+IHBlYSAlcGNAXCgwKzNiYSA8Zm9vXCsoMHh8KTNiYT5cKUBcKDArN2QwXCkKLTArM2JlIDxmb29cKygweHwpM2JlPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMCwlZDA6dzoyXCkKLTArM2M2IDxmb29cKygweHwpM2M2PiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzAwMCwlZDA6dzoyXCkKLTArM2NjIDxmb29cKygweHwpM2NjPiBwZWEgJXpwY0BcKDArM2U4XClAXCgwKzdkMFwpCi0wKzNkNCA8Zm9vXCsoMHh8KTNkND4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDAsJWQwOnc6MlwpCi0wKzNkYSA8Zm9vXCsoMHh8KTNkYT4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCswMDAsJWQwOnc6MlwpCi0wKzNkZSA8Zm9vXCsoMHh8KTNkZT4gcGVhICV6cGNAXCgwKzAwMFwpQFwoMCs3ZDBcKQotMCszZTQgPGZvb1wrKDB4fCkzZTQ+IHBlYSAlenBjQFwoMCszZThcKUBcKDArN2QwLCVkMDp3OjJcKQotMCszZWMgPGZvb1wrKDB4fCkzZWM+IHBlYSAlenBjQFwoMCszZThcKUBcKDArMDAwLCVkMDp3OjJcKQotMCszZjIgPGZvb1wrKDB4fCkzZjI+IHBlYSAlenBjQFwoMCszZThcKUBcKDArN2QwXCkKLTArM2ZhIDxmb29cKygweHwpM2ZhPiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzdkMCwlZDA6dzoyXCkKLTArNDAwIDxmb29cKygweHwpNDAwPiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzAwMCwlZDA6dzoyXCkKLTArNDA0IDxmb29cKygweHwpNDA0PiBwZWEgJXpwY0BcKDArMDAwXClAXCgwKzdkMFwpCi0wKzQwYSA8Zm9vXCsoMHh8KTQwYT4gcGVhICVwY0BcKDArN2Y0IDwuKj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0MTIgPGZvb1wrKDB4fCk0MTI+IHBlYSAlcGNAXCgwKzdmYyA8Lio+LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDE4IDxmb29cKygweHwpNDE4PiBwZWEgJXBjQFwoMCs0MWEgPGZvb1wrKDB4fCk0MWE+LCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNDFlIDxmb29cKygweHwpNDFlPiBwZWEgJXBjQFwoMCs0MjAgPGZvb1wrKDB4fCk0MjA+LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDIyIDxmb29cKygweHwpNDIyPiBwZWEgJXBjQFwoMCs4MGMgPC4qPiwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQyYSA8Zm9vXCsoMHh8KTQyYT4gcGVhICVwY0BcKDArODE0IDwuKj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0MzIgPGZvb1wrKDB4fCk0MzI+IHBlYSAlcGNAXCgwKzgxYyA8Lio+LCVkMDpsXClAXCgwKzdkMFwpCi0wKzQzYSA8Zm9vXCsoMHh8KTQzYT4gcGVhICVwY0BcKDArODI0IDwuKj4sJWExOmxcKUBcKDArN2QwXCkKLTArNDQyIDxmb29cKygweHwpNDQyPiBwZWEgJXBjQFwoMCs4MmMgPC4qPiwlYTE6bFwpQFwoMCs3ZDBcKQotMCs0NGEgPGZvb1wrKDB4fCk0NGE+IHBlYSAlcGNAXCgwKzgzNCA8Lio+LCVhMTp3OjJcKUBcKDArN2QwXCkKLTArNDUyIDxmb29cKygweHwpNDUyPiBwZWEgJXBjQFwoMCs4M2MgPC4qPiwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQ1OCA8Zm9vXCsoMHh8KTQ1OD4gcGVhICVwY0BcKDArODQyIDwuKj4sJWQwOmxcKUBcKDArMDAwXCkKLTArNDVlIDxmb29cKygweHwpNDVlPiBwZWEgJXBjQFwoMCs4NDggPC4qPiwlYTE6bFwpQFwoMCswMDBcKQotMCs0NjQgPGZvb1wrKDB4fCk0NjQ+IHBlYSAlcGNAXCgwKzQ2NiA8Zm9vXCsoMHh8KTQ2Nj4sJWQwOnc6MlwpQFwoMCs3ZDBcKQotMCs0NmEgPGZvb1wrKDB4fCk0NmE+IHBlYSAlcGNAXCgwKzQ2YyA8Zm9vXCsoMHh8KTQ2Yz4sJWEwOmxcKUBcKDArN2QwXCkKLTArNDcwIDxmb29cKygweHwpNDcwPiBwZWEgJXBjQFwoMCs0NzIgPGZvb1wrKDB4fCk0NzI+LCVkMDp3OjJcKUBcKDArMDAwXCkKLTArNDc0IDxmb29cKygweHwpNDc0PiBwZWEgJXBjQFwoMCs0NzYgPGZvb1wrKDB4fCk0NzY+LCVkMDpsXClAXCgwKzAwMFwpCi0wKzQ3OCA8Zm9vXCsoMHh8KTQ3OD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQ4MCA8Zm9vXCsoMHh8KTQ4MD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQ4NiA8Zm9vXCsoMHh8KTQ4Nj4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQ4YyA8Zm9vXCsoMHh8KTQ4Yz4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzQ5MCA8Zm9vXCsoMHh8KTQ5MD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzQ5OCA8Zm9vXCsoMHh8KTQ5OD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzdkMFwpCi0wKzRhMCA8Zm9vXCsoMHh8KTRhMD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpQFwoMCs3ZDBcKQotMCs0YTggPGZvb1wrKDB4fCk0YTg+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKUBcKDArN2QwXCkKLTArNGIwIDxmb29cKygweHwpNGIwPiBwZWEgJXpwY0BcKDArM2U4LCVhMTpsXClAXCgwKzdkMFwpCi0wKzRiOCA8Zm9vXCsoMHh8KTRiOD4gcGVhICV6cGNAXCgwKzNlOCwlYTE6dzoyXClAXCgwKzdkMFwpCi0wKzRjMCA8Zm9vXCsoMHh8KTRjMD4gcGVhICV6cGNAXCgwKzNlOCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzRjNiA8Zm9vXCsoMHh8KTRjNj4gcGVhICV6cGNAXCgwKzNlOCwlZDA6bFwpQFwoMCswMDBcKQotMCs0Y2MgPGZvb1wrKDB4fCk0Y2M+IHBlYSAlenBjQFwoMCszZTgsJWExOmxcKUBcKDArMDAwXCkKLTArNGQyIDxmb29cKygweHwpNGQyPiBwZWEgJXpwY0BcKDArMDAwLCVkMDp3OjJcKUBcKDArN2QwXCkKLTArNGQ4IDxmb29cKygweHwpNGQ4PiBwZWEgJXpwY0BcKDArMDAwLCVhMDpsXClAXCgwKzdkMFwpCi0wKzRkZSA8Zm9vXCsoMHh8KTRkZT4gcGVhICV6cGNAXCgwKzAwMCwlZDA6dzoyXClAXCgwKzAwMFwpCi0wKzRlMiA8Zm9vXCsoMHh8KTRlMj4gcGVhICV6cGNAXCgwKzAwMCwlZDA6bFwpQFwoMCswMDBcKQotMCs0ZTYgPGZvb1wrKDB4fCk0ZTY+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgotMCs0ZWEgPGZvb1wrKDB4fCk0ZWE+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgotMCs0ZWUgPGZvb1wrKDB4fCk0ZWU+IHRzdGwgMCswMDQgPGZvb1wrKDB4fCk0PgotMCs0ZjIgPGZvb1wrKDB4fCk0ZjI+IHRzdGwgMCsxODZhMCA8Lio+Ci0wKzRmOCA8Zm9vXCsoMHh8KTRmOD4gdHN0bCAwKzAwOCA8Zm9vXCsoMHh8KTg+Ci0wKzRmZSA8Zm9vXCsoMHh8KTRmZT4gdHN0bCAwKzAwOCA8Zm9vXCsoMHh8KTg+Ci0wKzUwNCA8Zm9vXCsoMHh8KTUwND4gYWRkaWIgIzEsJWQwCi0wKzUwOCA8Zm9vXCsoMHh8KTUwOD4gYWRkaXcgIzEsJWQwCi0wKzUwYyA8Zm9vXCsoMHh8KTUwYz4gYWRkaWwgIzEsJWQwCi0wKzUxMiA8Zm9vXCsoMHh8KTUxMj4gYWRkcWIgIzEsJWQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL29wZXJhbmRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOWY1NmYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9vcGVyYW5kcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLSMgVGVzdCBoYW5kbGluZyBvZiBNSVQgYW5kIE1vdG9yb2xhIHN5bnRheCBvcGVyYW5kcwotIyBJZiB5b3UgY2hhbmdlIHRoaXMgZmlsZSwgc2VlIGFsc28gb3A2ODAwMC5kLgotCS50ZXh0Ci1mb286CQotCXwgRGF0YSByZWdpc3RlciBkaXJlY3QKLQl0c3RsCSVkMAotCi0JfCBBZGRyZXNzIHJlZ2lzdGVyIGRpcmVjdAotCXRzdGwJJWEwCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3QKLQl0c3RsCSVhMEAKLQl0c3RsCSglYTApCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwb3N0aW5jcmVtZW50Ci0JdHN0bAklYTBAKwotCXRzdGwJKCVhMCkrCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBwcmVkZWNyZW1lbnQKLQl0c3RsCSVhMEAtCi0JdHN0bAktKCVhMCkKLQotCXwgQWRkcmVzcyByZWdpc3RlciBpbmRpcmVjdCB3aXRoIGRpc3BsYWNlbWVudAotCXRzdGwJJWEwQCg4KQotCXRzdGwJKDgsJWEwKQotCXRzdGwJOCglYTApCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBpbmRleCAoOC1iaXQgZGlzcGxhY2VtZW50KQotCXRzdGwJJWEwQCg4LCVkMCkKLQl0c3RsCSVhMEAoOCwlZDA6dykKLQl0c3RsCSVhMEAoOCwlZDA6dzoxKQotCXRzdGwJJWEwQCg4LCVkMDp3OjIpCi0JdHN0bAklYTBAKDgsJWQwOnc6NCkKLQl0c3RsCSVhMEAoOCwlZDA6dzo4KQotCXRzdGwJJWEwQCg4LCVkMDpsKQotCXRzdGwJJWEwQCg4LCVkMDpsOjEpCi0JdHN0bAklYTBAKDgsJWQwOmw6MikKLQl0c3RsCSVhMEAoOCwlZDA6bDo0KQotCXRzdGwJJWEwQCg4LCVkMDpsOjgpCi0JdHN0bAklYTBAKCVkMDp3OjIpCi0JdHN0bAkoOCwlYTAsJWQwKQotCXRzdGwJKDgsJWEwLCVkMCoxKQotCXRzdGwJKDgsJWEwLCVkMCoyKQotCXRzdGwJKDgsJWEwLCVkMCo0KQotCXRzdGwJKDgsJWEwLCVkMCo4KQotCXRzdGwJKDgsJWEwLCVkMC53KQotCXRzdGwJKDgsJWEwLCVkMC53KjEpCi0JdHN0bAkoOCwlYTAsJWQwLncqMikKLQl0c3RsCSg4LCVhMCwlZDAudyo0KQotCXRzdGwJKDgsJWEwLCVkMC53KjgpCi0JdHN0bAkoOCwlYTAsJWQwLmwpCi0JdHN0bAkoOCwlYTAsJWQwLmwqMSkKLQl0c3RsCSg4LCVhMCwlZDAubCoyKQotCXRzdGwJKDgsJWEwLCVkMC5sKjQpCi0JdHN0bAkoOCwlYTAsJWQwLmwqOCkKLQl0c3RsCSg4LCVkMCwlYTApCi0JdHN0bAkoOCwlYTEudyoyLCVhMCkKLQl0c3RsCSg4LCVhMSwlYTApCi0JdHN0bAk4KCVhMCwlZDAudyoyKQotCXRzdGwJOCglZDAudyoyLCVhMCkKLQl0c3RsCTgoJWExLncqMiwlYTApCi0JdHN0bAkoJWEwLCVkMC53KjIpCi0JdHN0bAkoJWQwLncqMiwlYTApCi0KLQl8IEFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgd2l0aCBpbmRleCAoYmFzZSBkaXNwbGFjZW1lbnQpCi0JdHN0bAklYTBAKDEwMDAsJWQwOnc6MikKLQl0c3RsCUAoMTAwMCwlZDA6dzoyKQotCXRzdGwJQCglZDA6dzoyKQotCXRzdGwJQCgxMDAwKQotCXRzdGwJJWEwQCgxMDAwMDApCi0JdHN0bAkoMTAwMCwlYTAsJWQwLncqMikKLQl0c3RsCSgxMDAwLCVkMCwlYTApCi0JdHN0bAkoMTAwMCwlYTEudyoyLCVhMCkKLQl0c3RsCTEwMDAoJWEwLCVkMC53KjIpCi0JdHN0bAkxMDAwKCVkMCwlYTApCi0JdHN0bAkoMTAwMCwlZDAudyoyKQotCXRzdGwJMTAwMCglZDAudyoyKQotCXRzdGwJKCVkMC53KjIpCi0JdHN0bAkoMTAwMDAwLCVhMCkKLQl0c3RsCTEwMDAwMCglYTApCi0JdHN0bAklemExQCgxMDAwLCVkMDp3OjIpCi0JdHN0bAklemExQCgxMDAwMDApCi0JdHN0bAkoMTAwMCwlemExLCVkMC53KjIpCi0JdHN0bAkoMTAwMCwlZDAsJXphMSkKLQl0c3RsCSgxMDAwLCVhMS53KjIsJXphMSkKLQl0c3RsCTEwMDAoJXphMSwlZDAudyoyKQotCXRzdGwJMTAwMCglZDAsJXphMSkKLQl0c3RsCSgxMDAwMDAsJXphMSkKLQl0c3RsCTEwMDAwMCglemExKQotCXRzdGwJJWEwQCgxMDAwLCV6ZDE6dzoyKQotCXRzdGwJQCgxMDAwLCV6ZDE6dzoyKQotCXRzdGwJQCglemQxOnc6MikKLQl0c3RsCSgxMDAwLCVhMCwlemQxLncqMikKLQl0c3RsCSgxMDAwLCV6ZDEsJWEwKQotCXRzdGwJKDEwMDAsJXphMS53KjIsJWEwKQotCXRzdGwJMTAwMCglYTAsJXpkMS53KjIpCi0JdHN0bAkxMDAwKCV6ZDEsJWEwKQotCXRzdGwJKDEwMDAsJXpkMS53KjIpCi0JdHN0bAkxMDAwKCV6ZDEudyoyKQotCXRzdGwJKCV6ZDEudyoyKQotCi0JfCBNZW1vcnkgaW5kaXJlY3QgcG9zdGluZGV4ZWQKLQl0c3RsCSVhMEAoMTAwMClAKDIwMDAsJWQwOnc6MikKLQl0c3RsCSVhMEAoMTAwMClAKCVkMDp3OjIpCi0JdHN0bAklYTBAKDEwMDApQCgyMDAwKQotCXRzdGwJQCgxMDAwKUAoMjAwMCwlZDA6dzoyKQotCXRzdGwJQCgxMDAwKUAoJWQwOnc6MikKLQl0c3RsCUAoMTAwMClAKDIwMDApCi0JdHN0bAklYTBAKDApQCgyMDAwLCVkMDp3OjIpCi0JdHN0bAklYTBAKDApQCglZDA6dzoyKQotCXRzdGwJJWEwQCgwKUAoMjAwMCkKLQl0c3RsCUAoMClAKDIwMDAsJWQwOnc6MikKLQl0c3RsCUAoMClAKCVkMDp3OjIpCi0JdHN0bAlAKDApQCgyMDAwKQotCXRzdGwJKFsxMDAwLCVhMF0sJWQwOnc6MiwyMDAwKQotCXRzdGwJKFsxMDAwLCVhMF0sJWQwOnc6MikKLQl0c3RsCShbMTAwMCwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDBdLCVkMDp3OjIsMjAwMCkKLQl0c3RsCShbMTAwMF0sJWQwOnc6MikKLQl0c3RsCShbMTAwMF0sMjAwMCkKLQl0c3RsCShbJWEwXSwlZDA6dzoyLDIwMDApCi0JdHN0bAkoWyVhMF0sJWQwOnc6MikKLQl0c3RsCShbJWEwXSwyMDAwKQotCXRzdGwJKFswXSwlZDA6dzoyLDIwMDApCi0JdHN0bAkoWzBdLCVkMDp3OjIpCi0JdHN0bAkoWzBdLDIwMDApCi0KLQl8IE1lbW9yeSBpbmRpcmVjdCBwcmVpbmRleGVkCi0JdHN0bAklYTBAKDEwMDAsJWQwOnc6MilAKDIwMDApCi0JdHN0bAklYTBAKDEwMDAsJWQwOnc6MilAKDApCi0JdHN0bAlAKDEwMDAsJWQwOnc6MilAKDIwMDApCi0JdHN0bAlAKDEwMDAsJWQwOnc6MilAKDApCi0JdHN0bAklYTBAKCVkMDp3OjIpQCgyMDAwKQotCXRzdGwJJWEwQCglZDA6dzoyKUAoMCkKLQl0c3RsCUAoJWQwOnc6MilAKDIwMDApCi0JdHN0bAlAKCVkMDp3OjIpQCgwKQotCXRzdGwJKFsxMDAwLCVhMCwlZDA6dzoyXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVkMDp3OjIsJWEwXSwyMDAwKQotCXRzdGwJKFsxMDAwLCVkMCwlYTBdLDIwMDApCi0JdHN0bAkoWzEwMDAsJWExLCVhMF0sMjAwMCkKLQl0c3RsCShbMTAwMCwlYTE6dzoyLCVhMF0sMjAwMCkKLQl0c3RsCShbMTAwMCwlYTAsJWQwOnc6Ml0pCi0JdHN0bAkoWzEwMDAsJWQwLCVhMF0pCi0JdHN0bAkoWzEwMDAsJWQwOnc6Ml0sMjAwMCkKLQl0c3RsCShbMTAwMCwlZDA6dzoyXSkKLQl0c3RsCShbJWEwLCVkMDp3OjJdLDIwMDApCi0JdHN0bAkoWyVkMCwlYTBdLDIwMDApCi0JdHN0bAkoWyVhMCwlZDA6dzoyXSkKLQl0c3RsCShbJWQwLCVhMF0pCi0JdHN0bAkoWyVkMDp3OjJdLDIwMDApCi0JdHN0bAkoWyVkMDp3OjJdKQotCi0JfCBQcm9ncmFtIGNvdW50ZXIgaW5kaXJlY3Qgd2l0aCBkaXNwbGFjZW1lbnQKLQlwZWEJJXBjQCg4KQotCXBlYQkoOCwlcGMpCi0JcGVhCTgoJXBjKQotCXBlYQlmb28KLQotCXwgUHJvZ3JhbSBjb3VudGVyIGluZGlyZWN0IHdpdGggaW5kZXggKDgtYml0IGRpc3BsYWNlbWVudCkKLQlwZWEJJXBjQCg4LCVkMDp3OjIpCi0JcGVhCSVwY0AoJWQwOnc6MikKLQlwZWEJKDgsJXBjLCVkMC53KjIpCi0JcGVhCSg4LCVkMCwlcGMpCi0JcGVhCSg4LCVhMCwlcGMpCi0JcGVhCTgoJXBjLCVkMC53KjIpCi0JcGVhCTgoJWQwLCVwYykKLQlwZWEJOCglYTAsJXBjKQotCXBlYQkoJXBjLCVkMC53KjIpCi0JcGVhCSglZDAsJXBjKQotCXBlYQkoJWEwLCVwYykKLQotCXwgUHJvZ3JhbSBjb3VudGVyIGluZGlyZWN0IHdpdGggaW5kZXggKGJhc2UgZGlzcGxhY2VtZW50KQotCXBlYQklcGNAKDEwMDAsJWQwOnc6MikKLQlwZWEJJXBjQCgxMDAwMDApCi0JcGVhCSgxMDAwLCVwYywlZDAudyoyKQotCXBlYQkoMTAwMCwlZDAsJXBjKQotCXBlYQkoMTAwMCwlYTEudyoyLCVwYykKLQlwZWEJKDEwMDAsJWExLCVwYykKLQlwZWEJMTAwMCglcGMsJWQwLncqMikKLQlwZWEJMTAwMCglZDAsJXBjKQotCXBlYQkxMDAwKCVhMSwlcGMpCi0JcGVhCSgxMDAwMDAsJXBjKQotCXBlYQkxMDAwMDAoJXBjKQotCXBlYQklenBjQCgxMDAwLCVkMDp3OjIpCi0JcGVhCSV6cGNAKDEwMDAwMCkKLQlwZWEJKDEwMDAsJXpwYywlZDAudyoyKQotCXBlYQkoMTAwMCwlZDAsJXpwYykKLQlwZWEJKDEwMDAsJWExLncqMiwlenBjKQotCXBlYQkoMTAwMCwlYTEsJXpwYykKLQlwZWEJMTAwMCglenBjLCVkMC53KjIpCi0JcGVhCTEwMDAoJWQwLCV6cGMpCi0JcGVhCTEwMDAoJWExLCV6cGMpCi0JcGVhCSgxMDAwMDAsJXpwYykKLQlwZWEJMTAwMDAwKCV6cGMpCi0KLQl8IFByb2dyYW0gY291bnRlciBtZW1vcnkgaW5kaXJlY3QgcG9zdGluZGV4ZWQKLQlwZWEJJXBjQCgxMDAwKUAoMjAwMCwlZDA6dzoyKQotCXBlYQklcGNAKDEwMDApQCglZDA6dzoyKQotCXBlYQklcGNAKDEwMDApQCgyMDAwKQotCXBlYQklcGNAKDApQCgyMDAwLCVkMDp3OjIpCi0JcGVhCSVwY0AoMClAKCVkMDp3OjIpCi0JcGVhCSVwY0AoMClAKDIwMDApCi0JcGVhCShbMTAwMCwlcGNdLCVkMDp3OjIsMjAwMCkKLQlwZWEJKFsxMDAwLCVwY10sJWQwOnc6MikKLQlwZWEJKFsxMDAwLCVwY10sMjAwMCkKLQlwZWEJKFslcGNdLCVkMDp3OjIsMjAwMCkKLQlwZWEJKFslcGNdLCVkMDp3OjIpCi0JcGVhCShbJXBjXSwyMDAwKQotCXBlYQklenBjQCgxMDAwKUAoMjAwMCwlZDA6dzoyKQotCXBlYQklenBjQCgxMDAwKUAoJWQwOnc6MikKLQlwZWEJJXpwY0AoMTAwMClAKDIwMDApCi0JcGVhCSV6cGNAKDApQCgyMDAwLCVkMDp3OjIpCi0JcGVhCSV6cGNAKDApQCglZDA6dzoyKQotCXBlYQklenBjQCgwKUAoMjAwMCkKLQlwZWEJKFsxMDAwLCV6cGNdLCVkMDp3OjIsMjAwMCkKLQlwZWEJKFsxMDAwLCV6cGNdLCVkMDp3OjIpCi0JcGVhCShbMTAwMCwlenBjXSwyMDAwKQotCXBlYQkoWyV6cGNdLCVkMDp3OjIsMjAwMCkKLQlwZWEJKFslenBjXSwlZDA6dzoyKQotCXBlYQkoWyV6cGNdLDIwMDApCi0KLQl8IFByb2dyYW0gY291bnRlciBtZW1vcnkgaW5kaXJlY3QgcHJlaW5kZXhlZAotCXBlYQklcGNAKDEwMDAsJWQwOnc6MilAKDIwMDApCi0JcGVhCSVwY0AoMTAwMCwlZDA6dzoyKUAoMCkKLQlwZWEJJXBjQCglZDA6dzoyKUAoMjAwMCkKLQlwZWEJJXBjQCglZDA6dzoyKUAoMCkKLQlwZWEJKFsxMDAwLCVwYywlZDA6dzoyXSwyMDAwKQotCXBlYQkoWzEwMDAsJWQwOnc6MiwlcGNdLDIwMDApCi0JcGVhCShbMTAwMCwlZDAsJXBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJWExLCVwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVwYywlYTFdLDIwMDApCi0JcGVhCShbMTAwMCwlYTE6dzoyLCVwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVwYywlZDA6dzoyXSkKLQlwZWEJKFsxMDAwLCVkMCwlcGNdKQotCXBlYQkoWzEwMDAsJWExLCVwY10pCi0JcGVhCShbJXBjLCVkMDp3OjJdLDIwMDApCi0JcGVhCShbJXBjLCVhMF0sMjAwMCkKLQlwZWEJKFslcGMsJWQwOnc6Ml0pCi0JcGVhCShbJWQwLCVwY10pCi0JcGVhCSV6cGNAKDEwMDAsJWQwOnc6MilAKDIwMDApCi0JcGVhCSV6cGNAKDEwMDAsJWQwOnc6MilAKDApCi0JcGVhCSV6cGNAKCVkMDp3OjIpQCgyMDAwKQotCXBlYQklenBjQCglZDA6dzoyKUAoMCkKLQlwZWEJKFsxMDAwLCV6cGMsJWQwOnc6Ml0sMjAwMCkKLQlwZWEJKFsxMDAwLCVkMDp3OjIsJXpwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCVkMCwlenBjXSwyMDAwKQotCXBlYQkoWzEwMDAsJWExLCV6cGNdLDIwMDApCi0JcGVhCShbMTAwMCwlenBjLCVhMV0sMjAwMCkKLQlwZWEJKFsxMDAwLCVhMTp3OjIsJXpwY10sMjAwMCkKLQlwZWEJKFsxMDAwLCV6cGMsJWQwOnc6Ml0pCi0JcGVhCShbMTAwMCwlZDAsJXpwY10pCi0JcGVhCShbMTAwMCwlYTEsJXpwY10pCi0JcGVhCShbJXpwYywlZDA6dzoyXSwyMDAwKQotCXBlYQkoWyV6cGMsJWEwXSwyMDAwKQotCXBlYQkoWyV6cGMsJWQwOnc6Ml0pCi0JcGVhCShbJWQwLCV6cGNdKQotCi0JfCBBYnNvbHV0ZSBzaG9ydAotCXRzdGwJNAotCXRzdGwJNC53Ci0JdHN0bAkoNCkudwotCi0JfCBBYnNvbHV0ZSBsb25nCi0JdHN0bAkxMDAwMDAKLQl0c3RsCTgubAotCXRzdGwJKDgpLmwKLQotCXwgSW1tZWRpYXRlCi0JYWRkaWIJJjEsJWQwCi0JYWRkaXcJJjEsJWQwCi0JYWRkaWwJJjEsJWQwCi0JYWRkcWIJJjEsJWQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNDEwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNDEwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMDMzN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wMjQxMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLnRleHQKLXN0YXJ0Oglub3AKLQlub3AKLQlub3AKLQlicmFzIGxhYmVsMQotCWJyYXMgbGFiZWwyCi0uZ2xvYmwgbGFiZWwxCi1sYWJlbDE6CW5vcAotCS5zcGFjZSAweGEwCi0Jbm9wCi0Jbm9wCi0uZ2xvYmwgbGFiZWwyCi1sYWJlbDI6CWJyYXMgbGFiZWwxCi0JYnJhcyBsYWJlbDIKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI2NjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcDI2NjMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzNjUwZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3AyNjYzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi18Ci18IFRoaXMgY29kZSBnZW5lcmF0ZXMgYW4gaW5jb3JyZWN0IHBjIHJlbGF0aXZlIG9mZnNldCAKLXwKLWJ1ZzogICAgICAgbW92ZWwgICM0LCVkNwotICAgICAgICAgICBqc3IgICAgdGFibGUoJXBjLCVkNy53KSAgICAgICAgICAgIHwgd3JvbmcKLSAgICAgICAgICAganNyICAgICVwY0AodGFibGUtLi0yOmIsJWQ3OncpICAgICB8IGNvcnJlY3QgYnV0IGNyeXB0aWMKLSAgICAgICAgICAgbm9wCi0gICAgICAgICAgIG5vcAotdGFibGU6Ci0gICAgICAgICAgIGJyYSAgICBqdW5rCi0gICAgICAgICAgIGJyYSAgICBqdW5rCi0gICAgICAgICAgIGJyYSAgICBqdW5rCi0KLWp1bms6Ci0gICAgbm9wCi0gICAgcnRzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTgzNTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5kCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotI25hbWU6IHBjcmVsCi0jb2JqZHVtcDogLWRycyAtaiAudGV4dCAtLXByZWZpeC1hZGRyZXNzZXMKLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1Db250ZW50cyBvZiBzZWN0aW9uIC50ZXh0OgotIDAwMDAgNGU3MTRlNzEgNGNmYTAzMDAgZmZmYTRjZmEgMDMwMGZmZjQgIE5xTnFMLi4uLi5MLi4uLi4KLSAwMDEwIDRjZmIwMzAwIDA4ZWU0MWZhIGZmZWE0MWZhIGZmZTY0MWZhICBMLi4uLi5BLi4uQS4uLkEuCi0gMDAyMCBmZjYyNDFmYiAwOGRlNDFmYiAwOGRhNDFmYiAwOGQ2NDFmYiAgLmJBLi4uQS4uLkEuLi5BLgotIDAwMzAgMDkyMGZmZDIgNDFmYjA5MjAgZmZjYzQxZmIgMDkzMGZmZmYgIC4gLi5BLi4gLi5BLi4wLi4KLSAwMDQwIGZmYzY0MWZiIDA5MzBmZmZmIGZmYmU0ZTcxIDYxZmYwMDAwICAuLkEuLjAuLi4uTnFhLi4uCi0gMDA1MCAwMDU4NjEwMCAwMDUyNjE0ZSA2MTRjNGU3MSA0MWY5MDAwMCAgLlhhLi5SYU5hTE5xQS4uLgotIDAwNjAgMDAoYTZ8MDApNDFmYSAwMDQyNDFmYSAwMGJlNDFmYiAwODNhNDFmYiAgLi5BLi5CQS4uLkEuLjpBLgotIDAwNzAgMDgzNjQxZmIgMDgzMjQxZmIgMDkyMDAwMmUgNDFmYjA5MjAgIC42QS4uMkEuLiAuLkEuLiAKLSAwMDgwIDAwMjg0MWZiIDA5MzAwMDAwIDAwMjI0MWZiIDA5MzAwMDAwICAuXChBLi4wLi4uIkEuLjAuLgotIDAwOTAgMDAxYTQxZmIgMDkzMDAwMDAgMDAxMjQxZmIgMDkyMDAwMGEgIC4uQS4uMC4uLi5BLi4gLi4KLSAwMGEwIDQxZmIwODA0IDRlNzE0ZTcxIDRlNzE0MWZiIDA4ODA0MWZiICBBLi4uTnFOcU5xQS4uLkEuCi0gMDBiMCAwOTIwZmY3ZiA0MWZiMDkyMCA4MDAwNDFmYiAwOTMwZmZmZiAgLiAuLkEuLiAuLkEuLjAuLgotIDAwYzAgN2ZmZjRlNzEgNDFmYjA4N2YgNDFmYjA5MjAgMDA4MDQxZmIgIC4uTnFBLi4uQS4uIC4uQS4KLSAwMGQwIDA5MjA3ZmZmIDQxZmIwOTMwIDAwMDA4MDAwIDRlNzE0MWZhICAuIC4uQS4uMC4uLi5OcUEuCi0gMDBlMCA4MDAwNDFmYiAwMTcwZmZmZiA3ZmZmNGU3MSA0MWZhN2ZmZiAgLi5BLi5wLi4uLk5xQS4uLgotIDAwZjAgNDFmYjAxNzAgMDAwMDgwMDAgNGU3MTQxZmIgMDE3MChmZmZmfDAwMDApICBBLi5wLi4uLk5xQS4ucC4uCi0gMDEwMCAoZmYwNHwwMDAwKTQxZmIgMDkzMChmZmZmfDAwMDApIChmZWZjfDAwMDApNGU3MSA0MWY5MDAwMCAgLi5BLi4wLi4uLk5xQS4uLgotIDAxMTAgMDAwMC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gIC4uLi4uLi4uLi4uLi4uLi4KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDwuKj4gbm9wCi0wKzAwMDIgPGxibF9iPiBub3AKLTArMDAwNCA8bGJsX2JcKygweHwpMj4gbW92ZW1sICVwY0BcKDArMDAwMiA8bGJsX2I+XCksJWEwLSVhMQotMCswMDBhIDxsYmxfYlwrKDB4fCk4PiBtb3ZlbWwgJXBjQFwoMCswMDAyIDxsYmxfYj5cKSwlYTAtJWExCi0wKzAwMTAgPGxibF9iXCsoMHh8KWU+IG1vdmVtbCAlcGNAXCgwKzAyIDxsYmxfYj4sJWQwOmxcKSwlYTAtJWExCi0wKzAwMTYgPGxibF9iXCsoMHh8KTE0PiBsZWEgJXBjQFwoMCswMDAyIDxsYmxfYj5cKSwlYTAKLTArMDAxYSA8bGJsX2JcKygweHwpMTg+IGxlYSAlcGNAXCgwKzAwMDIgPGxibF9iPlwpLCVhMAotMCswMDFlIDxsYmxfYlwrKDB4fCkxYz4gbGVhICVwY0BcKGYrZmY4MiA8Lio+XCksJWEwCi0wKzAwMjIgPGxibF9iXCsoMHh8KTIwPiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwMjYgPGxibF9iXCsoMHh8KTI0PiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwMmEgPGxibF9iXCsoMHh8KTI4PiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwMmUgPGxibF9iXCsoMHh8KTJjPiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwMzQgPGxibF9iXCsoMHh8KTMyPiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwM2EgPGxibF9iXCsoMHh8KTM4PiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwNDIgPGxibF9iXCsoMHh8KTQwPiBsZWEgJXBjQFwoMCswMiA8bGJsX2I+LCVkMDpsXCksJWEwCi0wKzAwNGEgPGxibF9iXCsoMHh8KTQ4PiBub3AKLTArMDA0YyA8bGJsX2JcKygweHwpNGE+IGJzcmwgMCswMGE2IDxsYmxfYT4KLTArMDA1MiA8bGJsX2JcKygweHwpNTA+IGJzcncgMCswMGE2IDxsYmxfYT4KLTArMDA1NiA8bGJsX2JcKygweHwpNTQ+IGJzcnMgMCswMGE2IDxsYmxfYT4KLTArMDA1OCA8bGJsX2JcKygweHwpNTY+IGJzcnMgMCswMGE2IDxsYmxfYT4KLTArMDA1YSA8bGJsX2JcKygweHwpNTg+IG5vcAotMCswMDVjIDxsYmxfYlwrKDB4fCk1YT4gbGVhICgwKzAwYTYgPGxibF9hPnwwKzAgPC4qPiksJWEwCi0JCQk1ZTogKDMyCVwudGV4dHxSXzY4S18zMglcLnRleHRcKzB4YTYpCi0wKzAwNjIgPGxibF9iXCsoMHh8KTYwPiBsZWEgJXBjQFwoMCswMGE2IDxsYmxfYT5cKSwlYTAKLTArMDA2NiA8bGJsX2JcKygweHwpNjQ+IGxlYSAlcGNAXCgwKzAxMjYgPC4qPlwpLCVhMAotMCswMDZhIDxsYmxfYlwrKDB4fCk2OD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDZlIDxsYmxfYlwrKDB4fCk2Yz4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDcyIDxsYmxfYlwrKDB4fCk3MD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDc2IDxsYmxfYlwrKDB4fCk3ND4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDdjIDxsYmxfYlwrKDB4fCk3YT4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDgyIDxsYmxfYlwrKDB4fCk4MD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDhhIDxsYmxfYlwrKDB4fCk4OD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDkyIDxsYmxfYlwrKDB4fCk5MD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMDlhIDxsYmxfYlwrKDB4fCk5OD4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMGEwIDxsYmxfYlwrKDB4fCk5ZT4gbGVhICVwY0BcKDArYTYgPGxibF9hPiwlZDA6bFwpLCVhMAotMCswMGE0IDxsYmxfYlwrKDB4fClhMj4gbm9wCi0wKzAwYTYgPGxibF9hPiBub3AKLTArMDBhOCA8bGJsX2FcKygweHwpMj4gbm9wCi0wKzAwYWEgPGxibF9hXCsoMHh8KTQ+IGxlYSAlcGNAXCgwKzJjIDxsYmxfYlwrKDB4fCkyYT4sJWQwOmxcKSwlYTAKLTArMDBhZSA8bGJsX2FcKygweHwpOD4gbGVhICVwY0BcKDArMmYgPGxibF9iXCsoMHh8KTJkPiwlZDA6bFwpLCVhMAotMCswMGI0IDxsYmxfYVwrKDB4fCllPiBsZWEgJXBjQFwoZis4MGI2IDwuKj4sJWQwOmxcKSwlYTAKLTArMDBiYSA8bGJsX2FcKygweHwpMTQ+IGxlYSAlcGNAXChmKzgwYmIgPC4qPiwlZDA6bFwpLCVhMAotMCswMGMyIDxsYmxfYVwrKDB4fCkxYz4gbm9wCi0wKzAwYzQgPGxibF9hXCsoMHh8KTFlPiBsZWEgJXBjQFwoMCsxNDUgPC4qPiwlZDA6bFwpLCVhMAotMCswMGM4IDxsYmxfYVwrKDB4fCkyMj4gbGVhICVwY0BcKDArMTRhIDwuKj4sJWQwOmxcKSwlYTAKLTArMDBjZSA8bGJsX2FcKygweHwpMjg+IGxlYSAlcGNAXCgwKzgwY2YgPC4qPiwlZDA6bFwpLCVhMAotMCswMGQ0IDxsYmxfYVwrKDB4fCkyZT4gbGVhICVwY0BcKDArODBkNiA8Lio+LCVkMDpsXCksJWEwCi0wKzAwZGMgPGxibF9hXCsoMHh8KTM2PiBub3AKLTArMDBkZSA8bGJsX2FcKygweHwpMzg+IGxlYSAlcGNAXChmKzgwZTAgPC4qPlwpLCVhMAotMCswMGUyIDxsYmxfYVwrKDB4fCkzYz4gbGVhICVwY0BcKGYrODBlMyA8Lio+XCksJWEwCi0wKzAwZWEgPGxibF9hXCsoMHh8KTQ0PiBub3AKLTArMDBlYyA8bGJsX2FcKygweHwpNDY+IGxlYSAlcGNAXCgwKzgwZWQgPC4qPlwpLCVhMAotMCswMGYwIDxsYmxfYVwrKDB4fCk0YT4gbGVhICVwY0BcKDArODBmMiA8Lio+XCksJWEwCi0wKzAwZjggPGxibF9hXCsoMHh8KTUyPiBub3AKLTArMDBmYSA8bGJsX2FcKygweHwpNTQ+IGxlYSAlcGNAXCgoMCswIDwuKj58MCswZmMgPGxibF9hXCsoMHh8KTU2PilcKSwlYTAKLQkJCWZlOiAoRElTUDMyCXVuZGVmfFJfNjhLX1BDMzIJdW5kZWZcKzB4MikKLTArMDEwMiA8bGJsX2FcKygweHwpNWM+IGxlYSAlcGNAXCgoMCswIDwuKj58MCswMTA0IDxsYmxfYVwrKDB4fCk1ZT4pLCVkMDpsXCksJWEwCi0JCQkxMDY6IChESVNQMzIJdW5kZWZ8Ul82OEtfUEMzMgl1bmRlZlwrMHgyKQotMCswMTBhIDxsYmxfYVwrKDB4fCk2ND4gbm9wCi0wKzAxMGMgPGxibF9hXCsoMHh8KTY2PiBsZWEgMCswIDwuKj4sJWEwCi0JCQkxMGU6IChSXzY4S18pPzMyCXVuZGVmCi0wKzAxMTIgPGxibF9hXCsoMHh8KTZjPiBub3AKLTArMDExNCA8bGJsX2FcKygweHwpNmU+IG9yaWIgIzAsJWQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BjcmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNWMyMmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay9wY3JlbC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotCW5vcAotbGJsX2I6CW5vcAotCW1vdmVtbAlsYmxfYiwlYTAtJWExCi0JbW92ZW1sCSVwY0AobGJsX2IpLCVhMC0lYTEKLQltb3ZlbWwJJXBjQChsYmxfYiwlZDApLCVhMC0lYTEKLQlsZWEJbGJsX2IsJWEwCi0JbGVhCSVwY0AobGJsX2IpLCVhMAotCWxlYQklcGNAKGxibF9iLTEyOCksJWEwCi0JbGVhCSVwY0AobGJsX2IsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYjpiLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2ItLi0yOmIsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYjp3LCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2ItLi0yOncsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYjpsLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2ItLi0yOmwsJWQwKSwlYTAKLQlub3AKLQlic3JsCWxibF9hCi0JYnNyCWxibF9hCi0JYnNycwlsYmxfYQotCWpic3IJbGJsX2EKLQlub3AKLQlsZWEJbGJsX2EsJWEwCi0JbGVhCSVwY0AobGJsX2EpLCVhMAotCWxlYQklcGNAKGxibF9hKzEyOCksJWEwCi0JbGVhCSVwY0AobGJsX2EsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYTpiLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2EtLi0yOmIsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYTp3LCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2EtLi0yOncsJWQwKSwlYTAKLQlsZWEJJXBjQChsYmxfYTpsLCVkMCksJWEwCi0JbGVhCSVwY0AobGJsX2EtLi0yOmwsJWQwKSwlYTAKLQlsZWEJJXBjQCgxODpsLCVkMCksJWEwCi0JbGVhCSVwY0AoMTA6dywlZDApLCVhMAotCWxlYQklcGNAKDQ6YiwlZDApLCVhMAotCW5vcAotbGJsX2E6CW5vcAotCW5vcAotCWxlYQklcGNAKC4tMTI2LCVkMCksJWEwCi0JbGVhCSVwY0AoLi0xMjcsJWQwKSwlYTAKLQlsZWEJJXBjQCguLTMyNzY2LCVkMCksJWEwCi0JbGVhCSVwY0AoLi0zMjc2NywlZDApLCVhMAotCW5vcAotCWxlYQklcGNAKC4rMTI5LCVkMCksJWEwCi0JbGVhCSVwY0AoLisxMzAsJWQwKSwlYTAKLQlsZWEJJXBjQCguKzMyNzY5LCVkMCksJWEwCi0JbGVhCSVwY0AoLiszMjc3MCwlZDApLCVhMAotCW5vcAotCWxlYQklcGNAKC4tMzI3NjYpLCVhMAotCWxlYQklcGNAKC4tMzI3NjcpLCVhMAotCW5vcAotCWxlYQklcGNAKC4rMzI3NjkpLCVhMAotCWxlYQklcGNAKC4rMzI3NzApLCVhMAotCW5vcAotCWxlYQklcGNAKHVuZGVmKSwlYTAKLQlsZWEJJXBjQCh1bmRlZiwlZDApLCVhMAotCW5vcAotCWxlYQl1bmRlZiwlYTAKLQlub3AKLQkubG9uZyAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tNjhrL3BpYzEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGljMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTc4Nzc0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvcGljMS5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmwgX2ZvbwotX2ZvbzoKLQlsZWFsICVwY0AoX2kpLCAlYTAKLQlsZWFsICVwY0AoX2ktLiksICVhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTEwOWM4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIuZAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotI1BST0c6IG5tCi0jbmFtZTogcHJlc2VuY2Ugb2Ygc2VjdGlvbiBzeW1ib2xzCi0KLTAwMDAwMDEyIGIgLmJzcwotMDAwMDAwMGUgZCAuZGF0YQotMDAwMDAwMDAgdCAudGV4dAotMDAwMDAwMGUgZCBsb29wMQotMDAwMDAwMDAgdCBsb29wMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTY4ay90Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjcxZTg2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL202OGsvdDIucworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCS50ZXh0Ci1sb29wMjoJCi0JbW92ZS5sCSVkMSwlYTBAKwotCWRiZgklZDAsbG9vcDEKLQkuZGF0YQotbG9vcDE6CWJyYQlsb29wMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkOTI1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQuZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNvYmpkdW1wOiAtZCAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBwYWRkaW5nIG9mIC5pbml0IHNlY3Rpb24KLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAuaW5pdDoKLTAwMDAwMDAwIDwuaW5pdD4gc3VidSAgICAgICAgcjMxLHIzMSwweDEwCi0wMDAwMDAwNCA8LmluaXRcKzB4ND4gc3QgICAgICAgICAgcjEzLHIzMSwweDIwCi0wMDAwMDAwOCA8LmluaXRcKzB4OD4gb3IgICAgICAgICAgcjAscjAscjAKLTAwMDAwMDBjIDwuaW5pdFwrMHhjPiBvciAgICAgICAgICByMCxyMCxyMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbTg4ay9pbml0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2ODFjYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL2luaXQucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotOyBUZXN0IHByb3BlciBwYWRkaW5nIG9mIHRoZSAuaW5pdCBzZWN0aW9uCi0Jc2VjdGlvbgkgLmluaXQsIngiCi0JYWxpZ24JIDQKLQlzdWJ1CSByMzEscjMxLDE2Ci0Jc3QJIHIxMyxyMzEsMzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvbTg4ay5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tODhrL204OGsuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA3YzExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL204OGsvbTg4ay5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jCi0jIFRlc3RzIGZvciBtODhrIHN2cjMgdGFyZ2V0cwotIwotaWYgeyBbaXN0YXJnZXQgbTg4Ki0qLXN5c3YzXSB8fCBbaXN0YXJnZXQgbTg4Ki0qLWNvZmYqIF0gfSB0aGVuIHsKLSAgICBzZXQgdGVzdG5hbWUgIlByb3BlciBwYWRkaW5nIG9mIC5pbml0IHNlY3Rpb24iCi0gICAgcnVuX2R1bXBfdGVzdCBpbml0Ci19Ci1pZiBbaW5mbyBleGlzdHMgZXJyb3JJbmZvXSB0aGVuIHsKLSAgICB1bnNldCBlcnJvckluZm8KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9lcnIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9lcnIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5NzYzMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvZXJyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkubWFjcm8JbQotCW0KLQkuZW5kbQotCi0JbQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmQ3YmNmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAuZAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI25hbWU6IG1hY3JvIGlycAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKLU9GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgotMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQotMCswNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMgotMCswOFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMwotMCswY1sgCV0rW2EtekEtWjAtOV9dK1sgCV0rYmFyMQotMCsxMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rYmFyMgotMCsxNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rYmFyMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL2lycC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzdkZDU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9pcnAucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS5pcnAJcGFyYW0sMSwyLDMKLQkubG9uZwlmb29ccGFyYW0KLQkuZW5kcgotCi0JLmlycGMJcGFyYW0sMTIzCi0JLmxvbmcJYmFyXHBhcmFtCi0JLmVuZHIKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL21hY3Jvcy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvbWFjcm9zLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxZTQ4NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvbWFjcm9zLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMgUnVuIHNvbWUgdGVzdHMgb2YgZ2FzIG1hY3Jvcy4KLQotaWYgIVtpc3RhcmdldCBocHBhKi0qLSpdIHsKLSAgICBydW5fZHVtcF90ZXN0IHRlc3QxCi19Ci0KLXJ1bl9kdW1wX3Rlc3QgdGVzdDIKLQotcnVuX2R1bXBfdGVzdCB0ZXN0MwotCi1ydW5fZHVtcF90ZXN0IGlycAotCi1ydW5fZHVtcF90ZXN0IHJlcHQKLQotZ2FzX3Rlc3RfZXJyb3IgImVyci5zIiAiIiAibWFjcm8gaW5maW5pdGUgcmVjdXJzaW9uIgotCi1jYXNlICR0YXJnZXRfdHJpcGxldCBpbiB7Ci0gICAgeyBocHBhKi0qLSogfSB7IH0KLSAgICBkZWZhdWx0IHsKLQlydW5fZHVtcF90ZXN0IHNlbWkKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyMmQ1Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvcmVwdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogbWFjcm8gcmVwdAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgLioKLU9GRlNFVFsgCV0rVFlQRVsgCV0rVkFMVUUuKgotMCswMFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQotMCswNFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQotMCswOFsgCV0rW2EtekEtWjAtOV9dK1sgCV0rZm9vMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9yZXB0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MWI2ZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3JlcHQucworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCS5yZXB0CTMKLQkubG9uZwlmb28xCi0JLmVuZHIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg5ZTczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNvYmpkdW1wOiAtcyAtaiAudGV4dAotI25hbWU6IHNlbWkKLQotLio6IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci0gMDAwMCAzYjIwM2IyMCAzYTIwM2EyMCAwMDAwMDAwMCAwMDAwMDAwMCAgOyA7IDogOiAuLi4uLi4uLgotIDAwMTAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3Mvc2VtaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmUwOTYzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy9zZW1pLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0gICAgICAgIC5tYWNybyBzZW1pY29sb24KLSAgICAgICAgLmFzY2lpICI7ICIKLSAgICAgICAgLmVuZG0KLQotICAgICAgICAubWFjcm8gY29sb24KLSAgICAgICAgLmFzY2lpICI6ICIKLSAgICAgICAgLmVuZG0KLQotICAgICAgICBzZW1pY29sb24KLSAgICAgICAgLmFzY2lpICI7ICIKLSAgICAgICAgY29sb24KLSAgICAgICAgLmFzY2lpICI6ICIKLQotCS5wMmFsaWduIDUsMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0YjNmYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEuZAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogbWFjcm8gdGVzdCAxCi0KLTArMDEgQSBzMQotMCswMiBBIHMyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODhiN2NkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0MS5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0JLm1hY3JvCW0gYXJnMSBhcmcyCi0JLmdsb2JsCVxhcmcxCi0JXGFyZzEgPSBcYXJnMgotCS5lbmRtCi0KLQltIHMxLDEKLQltIHMyLDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhN2Q0MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiBtYWNybyB0ZXN0IDIKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKLTArMDRbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzIKLTArMDhbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMWIwMTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQkubWFjcm8JbSBhcmcxIGFyZzIgYXJnMwotCS5sb25nCVxhcmcxCi0JLmlmYwksXGFyZzJcYXJnMwotCS5FTFNFCi0JbQlcYXJnMixcYXJnMwotCS5lbmRpZgotCS5lbmRtCi0KLQltCWZvbzEsZm9vMixmb28zCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tYWNyb3MvdGVzdDMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjgwYWQ0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5kCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiBtYWNybyB0ZXN0IDMKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIC4qCi1PRkZTRVRbIAldK1RZUEVbIAldK1ZBTFVFLioKLTArMDBbIAldK1thLXpBLVowLTlfXStbIAldK2ZvbzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21hY3Jvcy90ZXN0My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MGFhMjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWFjcm9zL3Rlc3QzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkubWFjcm8JbSBhcmcxIGFyZzIKLQlcYXJnMQotCS5leGl0bQotCVxhcmcyCi0JLmVuZG0KLQotCW0JIi5sb25nIGZvbzEiLC5nYXJiYWdlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNGNlZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLSNhczoKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBhbGxpbnNuCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPGFicz46Ci0gICAwOgkwMWUwICAgICAgCWFicwlyMAotCi0wKzAwMiA8YWRkYz46Ci0gICAyOgkwNjIxICAgICAgCWFkZGMJcjEsIHIyCi0KLTArMDA0IDxhZGRpPjoKLSAgIDQ6CTIwMDMgICAgICAJYWRkaQlyMywgMQotCi0wKzAwNiA8YWRkdT46Ci0gICA2OgkxYzU0ICAgICAgCWFkZHUJcjQsIHI1Ci0KLTArMDA4IDxhbmQ+OgotICAgODoJMTY3NiAgICAgIAlhbmQJcjYsIHI3Ci0KLTArMDBhIDxhbmRpPjoKLSAgIGE6CTJlMjggICAgICAJYW5kaQlyOCwgMgotCi0wKzAwYyA8YW5kbj46Ci0gICBjOgkxZmE5ICAgICAgCWFuZG4JcjksIHIxMAotCi0wKzAwZSA8YXNyPjoKLSAgIGU6CTFhY2IgICAgICAJYXNyCXIxMSwgcjEyCi0KLTArMDEwIDxhc3JjPjoKLSAgMTA6CTNhMGQgICAgICAJYXNyYwlyMTMKLQotMCswMTIgPGFzcmk+OgotICAxMjoJM2JmZSAgICAgIAlhc3JpCXIxNCwgMzEKLQotMCswMTQgPGJjbHJpPjoKLSAgMTQ6CTMwMGYgICAgICAJYmNscmkJcjE1LCAwCi0KLTArMDE2IDxiZj46Ci0gIDE2OgllZmY0ICAgICAgCWJmCTB4MAotCi0wKzAxOCA8Ymdlbmk+OgotICAxODoJMzI3MCAgICAgIAliZ2VuaQlyMCwgNwotCi0wKzAxYSA8QkdFTkk+OgotICAxYToJMzI4MCAgICAgIAliZ2VuaQlyMCwgOAotCi0wKzAxYyA8QkdFTmk+OgotICAxYzoJMzNmMCAgICAgIAliZ2VuaQlyMCwgMzEKLQotMCswMWUgPGJnZW5yPjoKLSAgMWU6CTEzMjEgICAgICAJYmdlbnIJcjEsIHIyCi0KLTArMDIwIDxia3B0PjoKLQkuLi4KLQotMCswMjIgPGJtYXNraT46Ci0gIDIyOgkyYzgzICAgICAgCWJtYXNraQlyMywgOAotCi0wKzAyNCA8Qk1BU0tJPjoKLSAgMjQ6CTJkZjMgICAgICAJYm1hc2tpCXIzLCAzMQotCi0wKzAyNiA8YnI+OgotICAyNjoJZjdmZiAgICAgIAlicgkweDI2Ci0KLTArMDI4IDxicmV2PjoKLSAgMjg6CTAwZjQgICAgICAJYnJldglyNAotCi0wKzAyYSA8YnNldGk+OgotICAyYToJMzVlNSAgICAgIAlic2V0aQlyNSwgMzAKLQotMCswMmMgPGJzcj46Ci0gIDJjOglmZmU5ICAgICAgCWJzcgkweDAKLQotMCswMmUgPGJ0PjoKLSAgMmU6CWU3ZTggICAgICAJYnQJMHgwCi0KLTArMDMwIDxidHN0aT46Ci0gIDMwOgkzN2I2ICAgICAgCWJ0c3RpCXI2LCAyNwotCi0wKzAzMiA8Y2xyYz46Ci0gIDMyOgkwZjAwICAgICAgCWNtcG5lCXIwLCByMAotCi0wKzAzNCA8Y2xyZj46Ci0gIDM0OgkwMWQ3ICAgICAgCWNscmYJcjcKLQotMCswMzYgPGNscnQ+OgotICAzNjoJMDFjOCAgICAgIAljbHJ0CXI4Ci0KLTArMDM4IDxjbXBocz46Ci0gIDM4OgkwY2E5ICAgICAgCWNtcGhzCXI5LCByMTAKLQotMCswM2EgPGNtcGx0PjoKLSAgM2E6CTBkY2IgICAgICAJY21wbHQJcjExLCByMTIKLQotMCswM2MgPGNtcGxlaT46Ci0gIDNjOgkyMmViICAgICAgCWNtcGx0aQlyMTEsIDE1Ci0KLTArMDNlIDxjbXBsdGk+OgotICAzZToJMjNmZCAgICAgIAljbXBsdGkJcjEzLCAzMgotCi0wKzA0MCA8Y21wbmU+OgotICA0MDoJMGZmZSAgICAgIAljbXBuZQlyMTQsIHIxNQotCi0wKzA0MiA8Y21wbmVpPjoKLSAgNDI6CTJhMDAgICAgICAJY21wbmVpCXIwLCAwCi0KLTArMDQ0IDxkZWNmPjoKLSAgNDQ6CTAwOTEgICAgICAJZGVjZglyMQotCi0wKzA0NiA8ZGVjZ3Q+OgotICA0NjoJMDFhMiAgICAgIAlkZWNndAlyMgotCi0wKzA0OCA8ZGVjbHQ+OgotICA0ODoJMDE4MyAgICAgIAlkZWNsdAlyMwotCi0wKzA0YSA8ZGVjbmU+OgotICA0YToJMDFiNCAgICAgIAlkZWNuZQlyNAotCi0wKzA0YyA8ZGVjdD46Ci0gIDRjOgkwMDg1ICAgICAgCWRlY3QJcjUKLQotMCswNGUgPGRpdnM+OgotICA0ZToJMzIxNiAgICAgIAlkaXZzCXI2LCByMQotCi0wKzA1MCA8ZGl2dT46Ci0gIDUwOgkyYzE4ICAgICAgCWRpdnUJcjgsIHIxCi0KLTArMDUyIDxkb3plPjoKLSAgNTI6CTAwMDYgICAgICAJZG96ZQotCi0wKzA1NCA8ZmYxPjoKLSAgNTQ6CTAwZWEgICAgICAJZmYxCXIxMAotCi0wKzA1NiA8aW5jZj46Ci0gIDU2OgkwMGJiICAgICAgCWluY2YJcjExCi0KLTArMDU4IDxpbmN0PjoKLSAgNTg6CTAwYWMgICAgICAJaW5jdAlyMTIKLQotMCswNWEgPGl4aD46Ci0gIDVhOgkxZGVkICAgICAgCWl4aAlyMTMsIHIxNAotCi0wKzA1YyA8aXh3PjoKLSAgNWM6CTE1MGYgICAgICAJaXh3CXIxNSwgcjAKLQotMCswNWUgPGpiZj46Ci0gIDVlOgllZmQwICAgICAgCWJmCTB4MAotCi0wKzA2MCA8amJyPjoKLSAgNjA6CWYwMGUgICAgICAJYnIJMHg3ZQotCi0wKzA2MiA8amJzcj46Ci0gIDYyOgk3ZjBhICAgICAgCWpzcmkJMHguKgotCi0wKzA2NCA8amJ0PjoKLSAgNjQ6CWUwMGMgICAgICAJYnQJMHg3ZQotCi0wKzA2NiA8am1wPjoKLSAgNjY6CTAwYzEgICAgICAJam1wCXIxCi0KLTArMDY4IDxqbXBpPjoKLSAgNjg6CTcwMDkgICAgICAJam1waQkweC4qCi0KLTArMDZhIDxqc3I+OgotICA2YToJMDBkMiAgICAgIAlqc3IJcjIKLQotMCswNmMgPGpzcmk+OgotICA2YzoJN2YwOCAgICAgIAlqc3JpCTB4LioKLQotMCswNmUgPGxkLmI+OgotICA2ZToJYTMwNCAgICAgIAlsZGIJcjMsIFwocjQsIDBcKQotCi0wKzA3MCA8bGQuaD46Ci0gIDcwOgljNTE2ICAgICAgCWxkaAlyNSwgXChyNiwgMlwpCi0KLTArMDcyIDxsZC53PjoKLSAgNzI6CTg3MTggICAgICAJbGQJcjcsIFwocjgsIDRcKQotCi0wKzA3NCA8bGRiPjoKLSAgNzQ6CWE5ZmEgICAgICAJbGRiCXI5LCBcKHIxMCwgMTVcKQotCi0wKzA3NiA8bGRoPjoKLSAgNzY6CWNiZmMgICAgICAJbGRoCXIxMSwgXChyMTIsIDMwXCkKLQotMCswNzggPGxkPjoKLSAgNzg6CThkNWUgICAgICAJbGQJcjEzLCBcKHIxNCwgMjBcKQotCi0wKzA3YSA8bGR3PjoKLSAgN2E6CThkZmUgICAgICAJbGQJcjEzLCBcKHIxNCwgNjBcKQotCi0wKzA3YyA8bGRtPjoKLSAgN2M6CTAwNjIgICAgICAJbGRtCXIyLXIxNSwgXChyMFwpCi0KLTArMDdlIDxmb29sb29wPjoKLSAgN2U6CTAwNDEgICAgICAJbGRxCXI0LXI3LCBcKHIxXCkKLQotMCswODAgPGxvb3B0PjoKLSAgODA6CTA0OGUgICAgICAJbG9vcHQJcjgsIDB4NjQKLQotMCswODIgPExSVz46Ci0gIDgyOgk3OTAzICAgICAgCWxydwlyOSwgMHguKgotCi0wKzA4NCA8bHJ3PjoKLSAgODQ6CTc5MDQgICAgICAJbHJ3CXI5LCAweDQzMjEKLQotMCswODYgPGZvb2xpdD46Ci0gIDg2OgkxMjM0ICAgICAgCW1vdglyNCwgcjMKLQotMCswODggPGxzbD46Ci0gIDg4OgkxYmJhICAgICAgCWxzbAlyMTAsIHIxMQotCi0wKzA4YSA8bHNsYz46Ci0gIDhhOgkzYzBjICAgICAgCWxzbGMJcjEyCi0KLQkuLi4KLQkJCThjOiBBRERSMzIJLnRleHQKLQkJCTkwOiBBRERSMzIJLnRleHQuKgotICA5NDoJMDAwMCAgICAgIAlia3B0Ci0gIDk2Ogk0MzIxICAgICAgCS5zaG9ydCAweDQzMjEKLQotMCswOTggPGxzbGk+OgotICA5ODoJM2RmZCAgICAgIAlsc2xpCXIxMywgMzEKLQotMCswOWEgPGxzcj46Ci0gIDlhOgkwYmZlICAgICAgCWxzcglyMTQsIHIxNQotCi0wKzA5YyA8bHNyYz46Ci0gIDljOgkzZTAwICAgICAgCWxzcmMJcjAKLQotMCswOWUgPGxzcmk+OgotICA5ZToJM2UxMSAgICAgIAlsc3JpCXIxLCAxCi0KLTArMGEwIDxtY2xyaT46Ci0gIGEwOgkzMDY0ICAgICAgCWJjbHJpCXI0LCA2Ci0KLTArMGEyIDxtZmNyPjoKLSAgYTI6CTEwMDIgICAgICAJbWZjcglyMiwgcHNyCi0KLTArMGE0IDxtb3Y+OgotICBhNDoJMTI0MyAgICAgIAltb3YJcjMsIHI0Ci0KLTArMGE2IDxtb3ZmPjoKLSAgYTY6CTBhNjUgICAgICAJbW92ZglyNSwgcjYKLQotMCswYTggPG1vdmk+OgotICBhODoJNjdmNyAgICAgIAltb3ZpCXI3LCAxMjcKLQotMCswYWEgPG1vdnQ+OgotICBhYToJMDI5OCAgICAgIAltb3Z0CXI4LCByOQotCi0wKzBhYyA8bXRjcj46Ci0gIGFjOgkxODBhICAgICAgCW10Y3IJcjEwLCBwc3IKLQotMCswYWUgPG11bHQ+OgotICBhZToJMDNjYiAgICAgIAltdWx0CXIxMSwgcjEyCi0KLTArMGIwIDxtdmM+OgotICBiMDoJMDAyZCAgICAgIAltdmMJcjEzCi0KLTArMGIyIDxtdmN2PjoKLSAgYjI6CTAwM2UgICAgICAJbXZjdglyMTQKLQotMCswYjQgPG5lZz46Ci0gIGI0OgkyODAyICAgICAgCXJzdWJpCXIyLCAwCi0KLTArMGI2IDxub3Q+OgotICBiNjoJMDFmZiAgICAgIAlub3QJcjE1Ci0KLTArMGI4IDxvcj46Ci0gIGI4OgkxZTEwICAgICAgCW9yCXIwLCByMQotCi0wKzBiYSA8cmZpPjoKLSAgYmE6CTAwMDMgICAgICAJcmZpCi0KLTArMGJjIDxyb2xjPjoKLSAgYmM6CTA2NjYgICAgICAJYWRkYwlyNiwgcjYKLQotMCswYmUgPHJvcmk+OgotICBiZToJMzlhOSAgICAgIAlyb3RsaQlyOSwgMjYKLQotMCswYzAgPHJvdGxjPjoKLSAgYzA6CTA2NjYgICAgICAJYWRkYwlyNiwgcjYKLQotMCswYzIgPHJvdGxpPjoKLSAgYzI6CTM4YTIgICAgICAJcm90bGkJcjIsIDEwCi0KLTArMGM0IDxyb3RyaT46Ci0gIGM0OgkzOWE5ICAgICAgCXJvdGxpCXI5LCAyNgotCi0wKzBjNiA8cnN1Yj46Ci0gIGM2OgkxNDQzICAgICAgCXJzdWIJcjMsIHI0Ci0KLTArMGM4IDxyc3ViaT46Ci0gIGM4OgkyODA1ICAgICAgCXJzdWJpCXI1LCAwCi0KLTArMGNhIDxydGU+OgotICBjYToJMDAwMiAgICAgIAlydGUKLQotMCswY2MgPHJ0cz46Ci0gIGNjOgkwMGNmICAgICAgCWptcAlyMTUKLQotMCswY2UgPHNldGM+OgotICBjZToJMGMwMCAgICAgIAljbXBocwlyMCwgcjAKLQotMCswZDAgPHNleHRiPjoKLSAgZDA6CTAxNTYgICAgICAJc2V4dGIJcjYKLQotMCswZDIgPHNleHRoPjoKLSAgZDI6CTAxNzcgICAgICAJc2V4dGgJcjcKLQotMCswZDQgPHN0LmI+OgotICBkNDoJYjgwOSAgICAgIAlzdGIJcjgsIFwocjksIDBcKQotCi0wKzBkNiA8c3QuaD46Ci0gIGQ2OglkYTFiICAgICAgCXN0aAlyMTAsIFwocjExLCAyXCkKLQotMCswZDggPHN0Lnc+OgotICBkODoJOWMxZCAgICAgIAlzdAlyMTIsIFwocjEzLCA0XCkKLQotMCswZGEgPHN0Yj46Ci0gIGRhOgliZWZmICAgICAgCXN0YglyMTQsIFwocjE1LCAxNVwpCi0KLTArMGRjIDxzdGg+OgotICBkYzoJZDBmMSAgICAgIAlzdGgJcjAsIFwocjEsIDMwXCkKLQotMCswZGUgPHN0dz46Ci0gIGRlOgk5MmYzICAgICAgCXN0CXIyLCBcKHIzLCA2MFwpCi0KLTArMGUwIDxzdD46Ci0gIGUwOgk5NDA1ICAgICAgCXN0CXI0LCBcKHI1LCAwXCkKLQotMCswZTIgPHN0bT46Ci0gIGUyOgkwMDdlICAgICAgCXN0bQlyMTQtcjE1LCBcKHIwXCkKLQotMCswZTQgPHN0b3A+OgotICBlNDoJMDAwNCAgICAgIAlzdG9wCi0KLTArMGU2IDxzdHE+OgotICBlNjoJMDA1MSAgICAgIAlzdHEJcjQtcjcsIFwocjFcKQotCi0wKzBlOCA8c3ViYz46Ci0gIGU4OgkwN2Q3ICAgICAgCXN1YmMJcjcsIHIxMwotCi0wKzBlYSA8c3ViaT46Ci0gIGVhOgkyNWZlICAgICAgCXN1YmkJcjE0LCAzMgotCi0wKzBlYyA8c3VidT46Ci0gIGVjOgkwNTM5ICAgICAgCXN1YnUJcjksIHIzCi0KLTArMGVlIDxzeW5jPjoKLSAgZWU6CTAwMDEgICAgICAJc3luYwotCi0wKzBmMCA8dHN0bHQ+OgotICBmMDoJMzdmNSAgICAgIAlidHN0aQlyNSwgMzEKLQotMCswZjIgPHRzdG5lPjoKLSAgZjI6CTJhMDcgICAgICAJY21wbmVpCXI3LCAwCi0KLTArMGY0IDx0cmFwPjoKLSAgZjQ6CTAwMGEgICAgICAJdHJhcAkyCi0KLTArMGY2IDx0c3Q+OgotICBmNjoJMGVlZSAgICAgIAl0c3QJcjE0LCByMTQKLQotMCswZjggPHRzdG5iej46Ci0gIGY4OgkwMTkyICAgICAgCXRzdG5ieglyMgotCi0wKzBmYSA8d2FpdD46Ci0gIGZhOgkwMDA1ICAgICAgCXdhaXQKLQotMCswZmMgPHhvcj46Ci0gIGZjOgkxNzBmICAgICAgCXhvcglyMTUsIHIwCi0KLTArMGZlIDx4c3I+OgotICBmZToJMzgwYiAgICAgIAl4c3IJcjExCi0KLTArMDEwMCA8eHRyYjA+OgotIDEwMDoJMDEzMSAgICAgIAl4dHJiMAlyMSwgcjEKLQotMCswMTAyIDx4dHJiMT46Ci0gMTAyOgkwMTIyICAgICAgCXh0cmIxCXIxLCByMgotCi0wKzAxMDQgPHh0cmIyPjoKLSAxMDQ6CTAxMTAgICAgICAJeHRyYjIJcjEsIHIwCi0KLTArMDEwNiA8eHRyYjM+OgotIDEwNjoJMDEwZCAgICAgIAl4dHJiMwlyMSwgcjEzCi0KLTArMDEwOCA8emV4dGI+OgotIDEwODoJMDE0OCAgICAgIAl6ZXh0YglyOAotCi0wKzAxMGEgPHpleHRoPjoKLSAxMGE6CTAxNjQgICAgICAJemV4dGgJcjQKLSAxMGM6CTBmMDAgICAgICAJY21wbmUJcjAsIHIwCi0gMTBlOgkwZjAwICAgICAgCWNtcG5lCXIwLCByMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1Nzg2My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBNKkNvcmUgYXNzZW1ibGVyIHRlc3RzdWl0ZS4KLQotaWYgW2lzdGFyZ2V0IG1jb3JlLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgImFsbGluc24iCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tY29yZS9hbGxpbnNuLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MDY4NDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWNvcmUvYWxsaW5zbi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSAuZGF0YQotZm9vZGF0YTogLndvcmQgNDIKLQkgLnRleHQKLWZvb3RleHQ6Ci0KLS5tYWNybyB0ZXN0IGluc24gdGV4dD0iIgotCS5leHBvcnQgXGluc24KLVxpbnNuOgotCVxpbnNuIFx0ZXh0Ci0uZW5kbQotCi0JdGVzdCBhYnMgICByMAkJCi0JdGVzdCBhZGRjICAicjEscjIiCS8vIEEgZG91YmxlIGZvcndhcmQgc2xhc2ggc3RhcnRzIGEgbGluZSBjb21tZW50Ci0JdGVzdCBhZGRpICAicjMsIDEiCSMgU28gZG9lcyBhIGhhc2gKLQl0ZXN0IGFkZHUgICJyNCwgcjUiCS8vIFdoaXRlIHNwYWNlIGJldHdlZW4gb3BlcmFuZHMgc2hvdWxkIGJlIGlnbm9yZWQKLQl0ZXN0IGFuZCAgICJyNixyNyIgICA7CXRlc3QgYW5kaSAgInI4LCMyIiAvLyBBIHNlbWljb2xvbiBzZXBlcmF0ZXMgc3RhdGVtZW50cwotCXRlc3QgYW5kbiAgInI5LCByMTAiCi0JdGVzdCBhc3IgICAicjExLCBSMTIiCS8vIFVwcGVyY2FzZSBSIGlzIGFsbG93ZWQgYXMgYSByZWdpc3RlciBwcmVmaXgKLQl0ZXN0IGFzcmMgICJyMTMiCi0JdGVzdCBhc3JpICAicjE0LCMweDFmIgotCXRlc3QgYmNscmkgInIxNSwwIgotCXRlc3QgYmYgICAgZm9vdGV4dAotCXRlc3QgYmdlbmkgInNwLCA3IgkvLyByMCBjYW4gYWxzbyBiZSByZWZlcmVkIHRvIGFzICdzcCcKLQl0ZXN0IEJHRU5JICJyMCwgOCIJLy8gT2ZmaWNpYWxseSB1cHBlciBjYXNlIG9yIG1peGVkIGNhc2UKLQl0ZXN0IEJHRU5pICJyMCwgMzEiCS8vIG1uZW1vbmljcyBzaG91bGQgbm90IGJlIGFsbG93ZWQsIGJ1dCB3ZSByZWxheCB0aGlzLi4uCi0JdGVzdCBiZ2VuciAicjEsIHIyIgotCXRlc3QgYmtwdAotCXRlc3QgYm1hc2tpICJyMywjOCIKLQl0ZXN0IEJNQVNLSSAicjMsMHgxZiIKLQl0ZXN0IGJyICAgICAuICAvLyBEb3QgbWVhbnMgdGhlIGN1cnJlbnQgYWRkcmVzcwotCXRlc3QgYnJldiAgIHI0Ci0JdGVzdCBic2V0aSAgInI1LDMwIgotCXRlc3QgYnNyICAgIGZvb3RleHQKLQl0ZXN0IGJ0ICAgICBmb290ZXh0Ci0JdGVzdCBidHN0aSAgInI2LCAyNyIKLQl0ZXN0IGNscmMgICAKLQl0ZXN0IGNscmYgICByNwotCXRlc3QgY2xydCAgIHI4Ci0JdGVzdCBjbXBocyAgInI5LHIxMCIKLQl0ZXN0IGNtcGx0ICAicjExLHIxMiIgCi0JdGVzdCBjbXBsZWkgInIxMSwgMTQiIAotCXRlc3QgY21wbHRpICJyMTMsMzIiCi0JdGVzdCBjbXBuZSAgInIxNCwgcjE1IgotCXRlc3QgY21wbmVpICJyMCwwIgotCXRlc3QgZGVjZiAgIHIxCi0JdGVzdCBkZWNndCAgcjIKLQl0ZXN0IGRlY2x0ICByMwotCXRlc3QgZGVjbmUgIHI0Ci0JdGVzdCBkZWN0ICAgcjUKLQl0ZXN0IGRpdnMgICAicjYscjEiCi0JdGVzdCBkaXZ1ICAgInI4LCByMSIKLQl0ZXN0IGRvemUKLQl0ZXN0IGZmMSAgICByMTAKLQl0ZXN0IGluY2YgICByMTEKLQl0ZXN0IGluY3QgICByMTIKLQl0ZXN0IGl4aCAgICAicjEzLHIxNCIKLQl0ZXN0IGl4dyAgICAicjE1LHIwIgotCXRlc3QgamJmICAgIGZvb3RleHQKLQl0ZXN0IGpiciAgICBmb29sb29wCi0JdGVzdCBqYnNyICAgZm9vdGV4dAotCXRlc3QgamJ0ICAgIGZvb2xvb3AKLQl0ZXN0IGptcCAgICByMQotCXRlc3Qgam1waSAgIGZvb3RleHQgCi0JdGVzdCBqc3IgICAgcjIKLQl0ZXN0IGpzcmkgICBmb290ZXh0Ci0JdGVzdCBsZC5iICAgInIzLChyNCwwKSIKLQl0ZXN0IGxkLmggICAicjUgLCAoIHI2LCAjMikiCi0JdGVzdCBsZC53ICAgInI3LCAocjgsIDB4NCkiCi0JdGVzdCBsZGIgICAgInI5LChyMTAsIzB4ZikiCi0JdGVzdCBsZGggICAgInIxMSwgKHIxMiwgMzApIgotCXRlc3QgbGQgICAgICJyMTMsIChyMTQsIDIwKSIKLQl0ZXN0IGxkdyAgICAicjEzLCAocjE0LCA2MCkiCi0JdGVzdCBsZG0gICAgInIyLXIxNSwocjApIgotCS5leHBvcnQgZm9vbG9vcAotZm9vbG9vcDoJCQotCXRlc3QgbGRxICAgICJyNC1yNywocjEpIgotCXRlc3QgbG9vcHQgICJyOCwgZm9vbG9vcCIKLQl0ZXN0IExSVyAgICAicjksIFtmb29saXRdIgotCXRlc3QgbHJ3ICAgICJyOSwgMHg0MzIxIiAgIAkvLyBQQyByZWwgaW5kaXJlY3QKLQkuZ2xvYmFsIGZvb2xpdAotZm9vbGl0OgotCS53b3JkIDB4MTIzNAotCXRlc3QgbHNsICAgICJyMTAscjExIgotCXRlc3QgbHNsYyAgIHIxMgotCS5saXRlcmFscwkJCS8vIER1bXAgbGl0ZXJhbHMgdGFibGUJCi0JdGVzdCBsc2xpICAgInIxMywzMSIKLQl0ZXN0IGxzciAgICAicjE0LHIxNSIKLQl0ZXN0IGxzcmMgICByMAotCXRlc3QgbHNyaSAgICJyMSwxIgotCXRlc3QgbWNscmkgICJyNCwgNjQiCi0JdGVzdCBtZmNyICAgInIyLCBjcjAiCi0JdGVzdCBtb3YgICAgInIzLHI0IgotCXRlc3QgbW92ZiAgICJyNSwgcjYiCi0JdGVzdCBtb3ZpICAgInI3LCAxMjciCi0JdGVzdCBtb3Z0ICAgInI4LCByOSIKLQl0ZXN0IG10Y3IgICAicjEwLCBwc3IiCi0JdGVzdCBtdWx0ICAgInIxMSwgcjEyIgotCXRlc3QgbXZjICAgIHIxMwotCXRlc3QgbXZjdiAgIHIxNAotCXRlc3QgbmVnICAgIHIyCi0JdGVzdCBub3QgICAgcjE1Ci0JdGVzdCBvciAgICAgInIwLHIxIgotCXRlc3QgcmZpCi0JdGVzdCByb2xjICAgInI2LCAxIgotCXRlc3Qgcm9yaSAgICJyOSwgNiIKLQl0ZXN0IHJvdGxjICAicjYsIDEiCi0JdGVzdCByb3RsaSAgInIyLCAjMTAiCi0JdGVzdCByb3RyaSAgInI5LCA2IgotCXRlc3QgcnN1YiAgICJyMywgcjQiCi0JdGVzdCByc3ViaSAgInI1LCAweDAiCi0JdGVzdCBydGUKLQl0ZXN0IHJ0cwotCXRlc3Qgc2V0YwotCXRlc3Qgc2V4dGIgIHI2Ci0JdGVzdCBzZXh0aCAgcjcKLQl0ZXN0IHN0LmIgICAicjgsIChyOSwgMCkiCi0JdGVzdCBzdC5oICAgInIxMCwgKHIxMSwgMikiCi0JdGVzdCBzdC53ICAgInIxMiwgKHIxMywgNCkiCi0JdGVzdCBzdGIgICAgInIxNCwgKHIxNSwgMTUpIgkKLQl0ZXN0IHN0aCAgICAicjAsIChyMSwgMzApIgotCXRlc3Qgc3R3ICAgICJyMiwgKHIzLCAweDNjKSIKLQl0ZXN0IHN0ICAgICAicjQsIChyNSwgMCkiCi0JdGVzdCBzdG0gICAgInIxNCAtIHIxNSAsIChyMCkiCi0JdGVzdCBzdG9wCi0JdGVzdCBzdHEgICAgInI0IC0gcjcgLCAocjEpIgotCXRlc3Qgc3ViYyAgICJyNywgcjEzIgotCXRlc3Qgc3ViaSAgICJyMTQsIDMyIgotCXRlc3Qgc3VidSAgICJyOSwgcjMiCi0JdGVzdCBzeW5jCi0JdGVzdCB0c3RsdCAgcjUKLQl0ZXN0IHRzdG5lICByNwotCXRlc3QgdHJhcCAgIDIKLQl0ZXN0IHRzdCAgICAicjE0LCByMTQiCi0JdGVzdCB0c3RuYnogcjIKLQl0ZXN0IHdhaXQKLQl0ZXN0IHhvciAgICAicjE1LHIwIgotCXRlc3QgeHNyICAgIHIxMQotCXRlc3QgeHRyYjAgICJyMSwgcjEiCi0JdGVzdCB4dHJiMSAgInIxLCByMiIKLQl0ZXN0IHh0cmIyICAicjEsIHIwIgotCXRlc3QgeHRyYjMgICJyMSwgcjEzIgotCXRlc3QgemV4dGIgIHI4Ci0JdGVzdCB6ZXh0aCAgcjQKLQljbHJjCQkJLy8gVGhlc2UgdHdvIGluc3RydWN0aW9ucyBwYWQgdGhlIG9iamVjdCBmaWxlCi0JY2xyYwkJCS8vIG91dCB0byBhIDE2IGJ5dGUgYm91bmRhcnkuCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NmQ1YzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMuZAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBhYnMKLQotIyBUZXN0IHRoZSBhYnMgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGJnZXoJXCRhMCwwKzAwMGMgPGZvb1wrKDB4fCljPgotMCswMDA0IDxbXj5dKj4gbm9wCi0wKzAwMDggPFtePl0qPiBuZWcJXCRhMCxcJGEwCi0wKzAwMGMgPFtePl0qPiBiZ2V6CVwkYTEsMCswMDE4IDxmb29cKygweHwpMTg+Ci0wKzAwMTAgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQotMCswMDE0IDxbXj5dKj4gbmVnCVwkYTAsXCRhMQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWJzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjE3MmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hYnMucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGFicyBtYWNyby4KLWZvbzoKLQlhYnMJJDQKLQlhYnMJJDQsJDUKLQkuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMjFkMWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBhZGQKLQotIyBUZXN0IHRoZSBhZGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGFkZGkJXCRhMCxcJGEwLDAKLTArMDAwNCA8W14+XSo+IGFkZGkJXCRhMCxcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBhZGQJXCRhMCxcJGEwLFwkYXQKLTArMDAxMCA8W14+XSo+IGFkZGkJXCRhMCxcJGEwLC0zMjc2OAotMCswMDE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTggPFtePl0qPiBhZGQJXCRhMCxcJGEwLFwkYXQKLTArMDAxYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDIwIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAyNCA8W14+XSo+IGFkZAlcJGEwLFwkYTAsXCRhdAotMCswMDI4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDAyYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZTk2NGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hZGQucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBhZGQgbWFjcm8uCi0JCi1mb286Ci0JYWRkCSQ0LCQ0LDAKLQlhZGQJJDQsJDQsMQotCWFkZAkkNCwkNCwweDgwMDAKLQlhZGQJJDQsJDQsLTB4ODAwMAotCWFkZAkkNCwkNCwweDEwMDAwCi0JYWRkCSQ0LCQ0LDB4MWE1YTUKLQkKLSMgYWRkdSBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhZGQgaXM7IGp1c3QgY29uZmlybSB0aGF0IGl0IGlzbid0Ci0jIHRvdGFsbHkgYnJva2VuLgotCWFkZHUJJDQsJDQsMQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjE3MTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9hbmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBhbmQKLQotIyBUZXN0IHRoZSBhbmQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGFuZGkJXCRhMCxcJGEwLDB4MAotMCswMDA0IDxbXj5dKj4gYW5kaQlcJGEwLFwkYTAsMHgxCi0wKzAwMDggPFtePl0qPiBhbmRpCVwkYTAsXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBhbmQJXCRhMCxcJGEwLFwkYXQKLTArMDAxNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE4IDxbXj5dKj4gYW5kCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAyMCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwMjQgPFtePl0qPiBhbmQJXCRhMCxcJGEwLFwkYXQKLTArMDAyOCA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHgwCi0wKzAwMmMgPFtePl0qPiBub3IJXCRhMCxcJGEwLFwkemVybwotMCswMDMwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMSwweDEKLTArMDAzNCA8W14+XSo+IG5vcglcJGEwLFwkYTAsXCR6ZXJvCi0wKzAwMzggPFtePl0qPiBvcmkJXCRhMCxcJGExLDB4ODAwMAotMCswMDNjIDxbXj5dKj4gbm9yCVwkYTAsXCRhMCxcJHplcm8KLTArMDA0MCA8W14+XSo+IGxpCVwkYXQsLTMyNzY4Ci0wKzAwNDQgPFtePl0qPiBub3IJXCRhMCxcJGExLFwkYXQKLTArMDA0OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDRjIDxbXj5dKj4gbm9yCVwkYTAsXCRhMSxcJGF0Ci0wKzAwNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1NCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNTggPFtePl0qPiBub3IJXCRhMCxcJGExLFwkYXQKLTArMDA1YyA8W14+XSo+IG9yaQlcJGEwLFwkYTEsMHgwCi0wKzAwNjAgPFtePl0qPiB4b3JpCVwkYTAsXCRhMSwweDAKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2FuZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZjNTdlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYW5kLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYW5kIG1hY3JvLgotCQotZm9vOgotCWFuZAkkNCwkNCwwCi0JYW5kCSQ0LCQ0LDEKLQlhbmQJJDQsJDQsMHg4MDAwCi0JYW5kCSQ0LCQ0LC0weDgwMDAKLQlhbmQJJDQsJDQsMHgxMDAwMAotCWFuZAkkNCwkNCwweDFhNWE1Ci0KLSMgbm9yLCBvciwgYW5kIHhvciBhcmUgaGFuZGxlZCBieSB0aGUgc2FtZSBjb2RlLiAgVGhlcmUgaXMgYSBzcGVjaWFsCi0jIGNhc2UgZm9yIG5vciwgc28gd2UgdGVzdCBhbGwgdmFyaWFudHMuCi0JCi0Jbm9yCSQ0LCQ1LDAKLQlub3IJJDQsJDUsMQotCW5vcgkkNCwkNSwweDgwMDAKLQlub3IJJDQsJDUsLTB4ODAwMAotCW5vcgkkNCwkNSwweDEwMDAwCi0Jbm9yCSQ0LCQ1LDB4MWE1YTUKLQkKLQlvcgkkNCwkNSwwCi0KLQl4b3IJJDQsJDUsMAotCi0JIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTMyOTM0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmVxCi0KLSMgVGVzdCB0aGUgYmVxIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBiZXEJXCRhMCxcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gYmVxeglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwYyA8W14+XSo+IG5vcAotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwxCi0wKzAwMTQgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAyMCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDJjIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzAgPFtePl0qPiBub3AKLTArMDAzNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDM4IDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwM2MgPFtePl0qPiBub3AKLTArMDA0MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA0OCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBibmV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDU0IDxbXj5dKj4gbm9wCi0wKzAwNTggPFtePl0qPiBiZXF6bAlcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1YyA8W14+XSo+IG5vcAotMCswMDYwIDxbXj5dKj4gYm5lemwJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCi0wKzIwMDY4IDxbXj5dKj4gagkwKzAwMDAgPHRleHRfbGFiZWw+Ci1bIAldKjIwMDY4OiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCS50ZXh0Ci0wKzIwMDZjIDxbXj5dKj4gbm9wCi0wKzIwMDcwIDxbXj5dKj4gamFsCTArMDAwMCA8dGV4dF9sYWJlbD4KLVsgCV0qMjAwNzA6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJLnRleHQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JlcS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTIyZWVjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmVxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmVxIG1hY3JvLgotCS5nbG9ibAl0ZXh0X2xhYmVsCS50ZXh0Ci10ZXh0X2xhYmVsOgkKLQliZXEJJDQsJDUsdGV4dF9sYWJlbAotCWJlcQkkNCwwLHRleHRfbGFiZWwKLQliZXEJJDQsMSx0ZXh0X2xhYmVsCi0JYmVxCSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmVxCSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJlcQkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQliZXEJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYm5lIGlzIGhhbmRsZWQgYnkgdGhlIHNhbWUgY29kZSBhcyBiZXEuICBKdXN0IHNhbml0eSBjaGVjay4KLQlibmUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IGNoZWNrIGJlcWwgYW5kIGJuZWwKLQkuc2V0CW1pcHMyCi0JYmVxbAkkNCwwLHRleHRfbGFiZWwKLQlibmVsCSQ0LDAsdGV4dF9sYWJlbAotCi0jIFRlc3QgdGhhdCBicmFuY2hlcyB3aGljaCBvdmVyZmxvdyBhcmUgY29udmVydGVkIHRvIGp1bXBzLgotCS5zcGFjZQkweDIwMDAwCi0JYgl0ZXh0X2xhYmVsCi0JYmFsCXRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTNlMjdjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLmQKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmdlCi0KLSMgVGVzdCB0aGUgYmdlIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IGJnZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGJsZXoJXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IGJnZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGJndHoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjggPFtePl0qPiBub3AKLTArMDAyYyA8W14+XSo+IHNsdGkJXCRhdCxcJGEwLDIKLTArMDAzMCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMzQgPFtePl0qPiBub3AKLTArMDAzOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwM2MgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA0MCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNDQgPFtePl0qPiBub3AKLTArMDA0OCA8W14+XSo+IHNsdGkJXCRhdCxcJGEwLC0zMjc2OAotMCswMDRjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA1MCA8W14+XSo+IG5vcAotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA1YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNjAgPFtePl0qPiBub3AKLTArMDA2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDY4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA2YyA8W14+XSo+IHNsdAlcJGF0LFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA3NCA8W14+XSo+IG5vcAotMCswMDc4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCi0wKzAwN2MgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBiZ3R6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDg4IDxbXj5dKj4gbm9wCi0wKzAwOGMgPFtePl0qPiBibHR6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDkwIDxbXj5dKj4gbm9wCi0wKzAwOTQgPFtePl0qPiBiZ3R6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDk4IDxbXj5dKj4gbm9wCi0wKzAwOWMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYTEKLTArMDBhMCA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMGE0IDxbXj5dKj4gbm9wCi0wKzAwYTggPFtePl0qPiBzbHQJXCRhdCxcJGExLFwkYTAKLTArMDBhYyA8W14+XSo+IGJuZXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNWZkODIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2UucworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBiZ2UgbWFjcm8uCi0JCi10ZXh0X2xhYmVsOgkKLQliZ2UJJDQsJDUsdGV4dF9sYWJlbAotCWJnZQkkNCwkMCx0ZXh0X2xhYmVsCi0JYmdlCSQwLCQ1LHRleHRfbGFiZWwKLQliZ2UJJDQsMCx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDEsdGV4dF9sYWJlbAotCWJnZQkkNCwyLHRleHRfbGFiZWwKLQliZ2UJJDQsMHg4MDAwLHRleHRfbGFiZWwKLQliZ2UJJDQsLTB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdlCSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJnZQkkNCwweDFhNWE1LHRleHRfbGFiZWwKLQotIyBiZ3QgaXMgaGFuZGxlZCBsaWtlIGJnZSwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWJndAkkNCwkNSx0ZXh0X2xhYmVsCi0JYmd0CSQ0LCQwLHRleHRfbGFiZWwKLQliZ3QJJDAsJDUsdGV4dF9sYWJlbAotCWJndAkkNCwwLHRleHRfbGFiZWwKLQotIyBTYW5pdHkgdGVzdCBiZ2VsIGFuZCBiZ3RsCi0JLnNldAltaXBzMgotCWJnZWwJJDQsJDUsdGV4dF9sYWJlbAotCWJndGwJJDQsJDUsdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhNjA0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JnZXUuZAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBiZ2V1Ci0KLSMgVGVzdCB0aGUgYmdldSBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAwOCA8W14+XSo+IG5vcAotMCswMDBjIDxbXj5dKj4gYmVxCVwkemVybyxcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxMCA8W14+XSo+IG5vcAotMCswMDE0IDxbXj5dKj4gYm5leglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAxOCA8W14+XSo+IG5vcAotMCswMDFjIDxbXj5dKj4gc2x0aXUJXCRhdCxcJGEwLDIKLTArMDAyMCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMmMgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwMzAgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDM0IDxbXj5dKj4gbm9wCi0wKzAwMzggPFtePl0qPiBzbHRpdQlcJGF0LFwkYTAsLTMyNzY4Ci0wKzAwM2MgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDQwIDxbXj5dKj4gbm9wCi0wKzAwNDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0OCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDA0YyA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA1YyA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYXQKLTArMDA2MCA8W14+XSo+IGJlcXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IHNsdHUJXCRhdCxcJGExLFwkYTAKLTArMDA2YyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzAgPFtePl0qPiBub3AKLTArMDA3NCA8W14+XSo+IGJuZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzggPFtePl0qPiBub3AKLTArMDA3YyA8W14+XSo+IGJuZXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwODAgPFtePl0qPiBub3AKLTArMDA4NCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYTEKLTArMDA4OCA8W14+XSo+IGJlcXpsCVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDhjIDxbXj5dKj4gbm9wCi0wKzAwOTAgPFtePl0qPiBzbHR1CVwkYXQsXCRhMSxcJGEwCi0wKzAwOTQgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmdldS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMzdmOTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9iZ2V1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmdldSBtYWNyby4KLQkKLXRleHRfbGFiZWw6CQotCWJnZXUJJDQsJDUsdGV4dF9sYWJlbAotCWJnZXUJJDAsJDUsdGV4dF9sYWJlbAotCSMgQSBzZWNvbmQgYXJndW1lbnQgb2YgMCBvciAkMCBpcyBhbHdheXMgdHJ1ZQotCWJnZXUJJDQsMSx0ZXh0X2xhYmVsCi0JYmdldQkkNCwyLHRleHRfbGFiZWwKLQliZ2V1CSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmdldQkkNCwtMHg4MDAwLHRleHRfbGFiZWwKLQliZ2V1CSQ0LDB4MTAwMDAsdGV4dF9sYWJlbAotCWJnZXUJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmd0dSBpcyBoYW5kbGVkIGxpa2UgYmdldSwgZXhjZXB0IHdoZW4gYm90aCBhcmd1bWVudHMgYXJlIHJlZ2lzdGVycy4KLSMgSnVzdCBzYW5pdHkgY2hlY2sgaXQgb3RoZXJ3aXNlLgotCWJndHUJJDQsJDUsdGV4dF9sYWJlbAotCWJndHUJJDQsJDAsdGV4dF9sYWJlbAotCWJndHUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmdldWwgYW5kIGJndHVsCi0JLnNldAltaXBzMgotCWJnZXVsCSQ0LCQ1LHRleHRfbGFiZWwKLQliZ3R1bAkkNCwkNSx0ZXh0X2xhYmVsCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxMGUyMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGJsdAotCi0jIFRlc3QgdGhlIGJsdCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDA4IDxbXj5dKj4gbm9wCi0wKzAwMGMgPFtePl0qPiBibHR6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDEwIDxbXj5dKj4gbm9wCi0wKzAwMTQgPFtePl0qPiBiZ3R6CVwkYTEsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDE4IDxbXj5dKj4gbm9wCi0wKzAwMWMgPFtePl0qPiBibHR6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDIwIDxbXj5dKj4gbm9wCi0wKzAwMjQgPFtePl0qPiBibGV6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI4IDxbXj5dKj4gbm9wCi0wKzAwMmMgPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwyCi0wKzAwMzAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDM0IDxbXj5dKj4gbm9wCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDNjIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNDAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDQ0IDxbXj5dKj4gbm9wCi0wKzAwNDggPFtePl0qPiBzbHRpCVwkYXQsXCRhMCwtMzI3NjgKLTArMDA0YyA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNTAgPFtePl0qPiBub3AKLTArMDA1NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDU4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNWMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDYwIDxbXj5dKj4gbm9wCi0wKzAwNjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA2OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNmMgPFtePl0qPiBzbHQJXCRhdCxcJGEwLFwkYXQKLTArMDA3MCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwNzQgPFtePl0qPiBub3AKLTArMDA3OCA8W14+XSo+IHNsdAlcJGF0LFwkYTEsXCRhMAotMCswMDdjIDxbXj5dKj4gYmVxeglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4MCA8W14+XSo+IG5vcAotMCswMDg0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gYmdleglcJGExLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5MCA8W14+XSo+IG5vcAotMCswMDk0IDxbXj5dKj4gYmxleglcJGEwLDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gc2x0CVwkYXQsXCRhMCxcJGExCi0wKzAwYTAgPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gc2x0CVwkYXQsXCRhMSxcJGEwCi0wKzAwYWMgPFtePl0qPiBiZXF6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAzMDU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYmx0IG1hY3JvLgotCQotdGV4dF9sYWJlbDoJCi0JYmx0CSQ0LCQ1LHRleHRfbGFiZWwKLQlibHQJJDQsJDAsdGV4dF9sYWJlbAotCWJsdAkkMCwkNSx0ZXh0X2xhYmVsCi0JYmx0CSQ0LDAsdGV4dF9sYWJlbAotCWJsdAkkNCwxLHRleHRfbGFiZWwKLQlibHQJJDQsMix0ZXh0X2xhYmVsCi0JYmx0CSQ0LDB4ODAwMCx0ZXh0X2xhYmVsCi0JYmx0CSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJsdAkkNCwweDEwMDAwLHRleHRfbGFiZWwKLQlibHQJJDQsMHgxYTVhNSx0ZXh0X2xhYmVsCi0KLSMgYmxlIGlzIGhhbmRsZWQgbGlrZSBibHQsIGV4Y2VwdCB3aGVuIGJvdGggYXJndW1lbnRzIGFyZSByZWdpc3RlcnMuCi0jIEp1c3Qgc2FuaXR5IGNoZWNrIGl0IG90aGVyd2lzZS4KLQlibGUJJDQsJDUsdGV4dF9sYWJlbAotCWJsZQkkNCwkMCx0ZXh0X2xhYmVsCi0JYmxlCSQwLCQ1LHRleHRfbGFiZWwKLQlibGUJJDQsMCx0ZXh0X2xhYmVsCi0KLSMgU2FuaXR5IHRlc3QgYmx0bCBhbmQgYmxlbAotCS5zZXQJbWlwczIKLQlibHRsCSQ0LCQ1LHRleHRfbGFiZWwKLQlibGVsCSQ0LCQ1LHRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMjYxYzYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ibHR1LmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgYmx0dQotCi0jIFRlc3QgdGhlIGJsdHUgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNsdHUJXCRhdCxcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IGJuZXoJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IGJuZQlcJHplcm8sXCRhMSwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGJlcXoJXCRhMCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IHNsdGl1CVwkYXQsXCRhMCwyCi0wKzAwMjAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDJjIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTAsXCRhdAotMCswMDMwIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDAzNCA8W14+XSo+IG5vcAotMCswMDM4IDxbXj5dKj4gc2x0aXUJXCRhdCxcJGEwLC0zMjc2OAotMCswMDNjIDxbXj5dKj4gYm5leglcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA0MCA8W14+XSo+IG5vcAotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDggPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNGMgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDUwIDxbXj5dKj4gbm9wCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1OCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwNWMgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGF0Ci0wKzAwNjAgPFtePl0qPiBibmV6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDY0IDxbXj5dKj4gbm9wCi0wKzAwNjggPFtePl0qPiBzbHR1CVwkYXQsXCRhMSxcJGEwCi0wKzAwNmMgPFtePl0qPiBiZXF6CVwkYXQsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDcwIDxbXj5dKj4gbm9wCi0wKzAwNzQgPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDc4IDxbXj5dKj4gbm9wCi0wKzAwN2MgPFtePl0qPiBiZXF6CVwkYTAsMCswMDAwIDx0ZXh0X2xhYmVsPgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBzbHR1CVwkYXQsXCRhMCxcJGExCi0wKzAwODggPFtePl0qPiBibmV6bAlcJGF0LDArMDAwMCA8dGV4dF9sYWJlbD4KLTArMDA4YyA8W14+XSo+IG5vcAotMCswMDkwIDxbXj5dKj4gc2x0dQlcJGF0LFwkYTEsXCRhMAotMCswMDk0IDxbXj5dKj4gYmVxemwJXCRhdCwwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JsdHUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGIxYWU2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYmx0dS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGJsdHUgbWFjcm8uCi0JCi10ZXh0X2xhYmVsOgkKLQlibHR1CSQ0LCQ1LHRleHRfbGFiZWwKLQlibHR1CSQwLCQ1LHRleHRfbGFiZWwKLQkjIEEgc2Vjb25kIGFyZ3VtZW50IG9mIDAgb3IgJDAgaXMgYWx3YXlzIGZhbHNlCi0JYmx0dQkkNCwxLHRleHRfbGFiZWwKLQlibHR1CSQ0LDIsdGV4dF9sYWJlbAotCWJsdHUJJDQsMHg4MDAwLHRleHRfbGFiZWwKLQlibHR1CSQ0LC0weDgwMDAsdGV4dF9sYWJlbAotCWJsdHUJJDQsMHgxMDAwMCx0ZXh0X2xhYmVsCi0JYmx0dQkkNCwweDFhNWE1LHRleHRfbGFiZWwKLQotIyBibGV1IGlzIGhhbmRsZWQgbGlrZSBibHR1LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JYmxldQkkNCwkNSx0ZXh0X2xhYmVsCi0JYmxldQkkNCwkMCx0ZXh0X2xhYmVsCi0JYmxldQkkNCwwLHRleHRfbGFiZWwKLQotIyBTYW5pdHkgdGVzdCBibHR1bCBhbmQgYmxldWwKLQkuc2V0CW1pcHMyCi0JYmx0dWwJJDQsJDUsdGV4dF9sYWJlbAotCWJsZXVsCSQ0LCQ1LHRleHRfbGFiZWwKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvYnJlYWsyMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OThhNGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jYXM6IC1tY3B1PXIzOTAwCi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzkwMAotI25hbWU6IE1JUFMgMjAtYml0IGJyZWFrCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGJyZWFrCi0wKzAwMDQgPFtePl0qPiBicmVhawotMCswMDA4IDxbXj5dKj4gYnJlYWsJMHgxNAotMCswMDBjIDxbXj5dKj4gYnJlYWsJMHgxNCwweDI4Ci0wKzAwMTAgPFtePl0qPiBicmVhawkweDNmZiwweDNmZgotMCswMDE0IDxbXj5dKj4gc2RiYnAKLTArMDAxOCA8W14+XSo+IHNkYmJwCi0wKzAwMWMgPFtePl0qPiBzZGJicAkweDE0Ci0wKzAwMjAgPFtePl0qPiBzZGJicAkweDE0LDB4MjgKLTArMDAyNCA8W14+XSo+IHNkYmJwCTB4M2ZmLDB4M2ZmCi0JLi4uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9icmVhazIwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNWIwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2JyZWFrMjAucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSAyMC1iaXQgYnJlYWsgaW5zdHJ1Y3Rpb25zCi1mb286CQotCWJyZWFrCi0JYnJlYWsJMAotCWJyZWFrCTIwCi0JYnJlYWsJMjAsNDAKLQlicmVhawkxMDIzLDEwMjMKLQkKLQlzZGJicAotCXNkYmJwCTAKLQlzZGJicAkyMAotCXNkYmJwCTIwLDQwCi0Jc2RiYnAJMTAyMywxMDIzCi0JCi0jIGZvcmNlIHNvbWUgcGFkZGluZywgdG8gbWFrZSBvYmpkdW1wIGNvbnNpc3RlbnRseSByZXBvcnQgdGhhdCB0aGVyZSdzIHNvbWUKLSMgaGVyZS4uLgotCS5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZGMwZWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5kCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIGRlbGF5Ci0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotCi0jIAotIyBHYXMgc2hvdWxkIHByb2R1Y2Ugbm9wJ3MgYWZ0ZXIgbXRjMSBhbmQgcmVsYXRlZCAKLSMgaW5zbidzIGlmIHRoZSB0YXJnZXQgZnByIGlzIHVzZWQgaW4gdGhlIAotIyBpbW1lZGlhdGx5IGZvbGxvd2luZyBpbnNuLiAgU2VlIGFsc28gbm9kZWxheS5kLgotIwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBtdGMxCVwkemVybyxcJGYwCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGN2dC5kLncJXCRmMCxcJGYwCi0wKzAwMGMgPFtePl0qPiBtdGMxCVwkemVybyxcJGYxCi0wKzAwMTAgPFtePl0qPiBub3AKLTArMDAxNCA8W14+XSo+IGN2dC5kLncJXCRmMSxcJGYxCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RlbGF5LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTJmMDAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kZWxheS5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgYWJzIG1hY3JvLgotZm9vOgotCW10YzEJJDAsJGYwCi0JY3Z0LmQudwkkZjAsJGYwCi0gICAgICAgIG10YzEgICAgJDAsJGYxCi0gICAgICAgIGN2dC5kLncgJGYxLCRmMQotICAgICAgICAuc3BhY2UJOAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LWlsb2Nrcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg1NmQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LWlsb2Nrcy5kCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBkaXYKLSNzb3VyY2U6IGRpdi5zCi0KLSMgVGVzdCB0aGUgZGl2IG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gYm5leglcJGExLDArMDAxMCA8Zm9vXCsweDEwPgotMCswMDA4IDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYTEKLTArMDAwYyA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDAxNCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMTggPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDAxYyA8W14+XSo+IGJuZQlcJGEwLFwkYXQsMCswMDI4IDxmb29cKzB4Mjg+Ci0wKzAwMjAgPFtePl0qPiBub3AKLTArMDAyNCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDAyOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDJjIDxbXj5dKj4gYm5leglcJGEyLDArMDAzOCA8Zm9vXCsweDM4PgotMCswMDMwIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDAzNCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDAzOCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDAzYyA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMDUwIDxmb29cKzB4NTA+Ci0wKzAwNDAgPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDA0NCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMDUwIDxmb29cKzB4NTA+Ci0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDA1MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDU0IDxbXj5dKj4gbW92ZQlcJGEwLFwkYTAKLTArMDA1OCA8W14+XSo+IG1vdmUJXCRhMCxcJGExCi0wKzAwNWMgPFtePl0qPiBuZWcJXCRhMCxcJGEwCi0wKzAwNjAgPFtePl0qPiBuZWcJXCRhMCxcJGExCi0wKzAwNjQgPFtePl0qPiBsaQlcJGF0LDIKLTArMDA2OCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwNmMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA3MCA8W14+XSo+IGxpCVwkYXQsMgotMCswMDc0IDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDA3OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDdjIDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDA4MCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwODQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA4OCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwOGMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMDkwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwOTQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDk4IDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA5YyA8W14+XSo+IG1mbG8JXCRhMAotMCswMGEwIDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDBhNCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGF0Ci0wKzAwYTggPFtePl0qPiBtZmxvCVwkYTAKLTArMDBhYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGIwIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBiNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwYmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGMwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBjOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwY2MgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGQwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBkOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwZGMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGUwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZTQgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKLTArMDBlOCA8W14+XSo+IGJuZXoJXCRhMSwwKzBmNCA8Zm9vXCsweGY0PgotMCswMGVjIDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMCxcJGExCi0wKzAwZjAgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwZjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBmOCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxMDQgPGZvb1wrMHgxMDQ+Ci0wKzAwZmMgPFtePl0qPiBkaXZ1CVwkemVybyxcJGExLFwkYTIKLTArMDEwMCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDEwNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTA4IDxbXj5dKj4gbW92ZQlcJGEwLFwkYTAKLTArMDEwYyA8W14+XSo+IGJuZXoJXCRhMiwwKzAxMTggPGZvb1wrMHgxMTg+Ci0wKzAxMTAgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTE0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTE4IDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMTFjIDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAxMzAgPGZvb1wrMHgxMzA+Ci0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCwweDgwMDAKLTArMDEyNCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMTMwIDxmb29cKzB4MTMwPgotMCswMTI4IDxbXj5dKj4gbm9wCi0wKzAxMmMgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAxMzAgPFtePl0qPiBtZmhpCVwkYTAKLTArMDEzNCA8W14+XSo+IGxpCVwkYXQsMgotMCswMTM4IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxM2MgPFtePl0qPiBtZmhpCVwkYTAKLTArMDE0MCA8W14+XSo+IGJuZXoJXCRhMiwwKzAxNGMgPGZvb1wrMHgxNGM+Ci0wKzAxNDQgPFtePl0qPiBkZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDE0OCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDE0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywtMQotMCswMTUwIDxbXj5dKj4gYm5lCVwkYTIsXCRhdCwwKzAxNjggPGZvb1wrMHgxNjg+Ci0wKzAxNTQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJHplcm8sMQotMCswMTU4IDxbXj5dKj4gZHNsbDMyCVwkYXQsXCRhdCwweDFmCi0wKzAxNWMgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDE2OCA8Zm9vXCsweDE2OD4KLTArMDE2MCA8W14+XSo+IG5vcAotMCswMTY0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTY4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAxNmMgPFtePl0qPiBsaQlcJGF0LDIKLTArMDE3MCA8W14+XSo+IGRkaXZ1CVwkemVybyxcJGExLFwkYXQKLTArMDE3NCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTc4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDE3YyA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTgwIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxODQgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMTg4IDxbXj5dKj4gZGRpdnUJXCR6ZXJvLFwkYTEsXCRhdAotMCswMThjIDxbXj5dKj4gbWZoaQlcJGEwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kaXYuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjNWJiMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5kCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jYXM6IC1tY3B1PXI0MDAwCi0jbmFtZTogTUlQUyBkaXYKLQotIyBUZXN0IHRoZSBkaXYgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGExCi0wKzAwMDQgPFtePl0qPiBibmV6CVwkYTEsMCswMDEwIDxmb29cKzB4MTA+Ci0wKzAwMDggPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhMQotMCswMDBjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMDEwIDxbXj5dKj4gbGkJXCRhdCwtMQotMCswMDE0IDxbXj5dKj4gYm5lCVwkYTEsXCRhdCwwKzAwMjggPGZvb1wrMHgyOD4KLTArMDAxOCA8W14+XSo+IGx1aQlcJGF0LDB4ODAwMAotMCswMDFjIDxbXj5dKj4gYm5lCVwkYTAsXCRhdCwwKzAwMjggPGZvb1wrMHgyOD4KLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDI4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMmMgPFtePl0qPiBub3AKLTArMDAzMCA8W14+XSo+IGJuZXoJXCRhMiwwKzAwM2MgPGZvb1wrMHgzYz4KLTArMDAzNCA8W14+XSo+IGRpdglcJHplcm8sXCRhMSxcJGEyCi0wKzAwMzggPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAwM2MgPFtePl0qPiBsaQlcJGF0LC0xCi0wKzAwNDAgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDA1NCA8Zm9vXCsweDU0PgotMCswMDQ0IDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAwNDggPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDA1NCA8Zm9vXCsweDU0PgotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwNTQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA1OCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAwNWMgPFtePl0qPiBtb3ZlCVwkYTAsXCRhMQotMCswMDYwIDxbXj5dKj4gbmVnCVwkYTAsXCRhMAotMCswMDY0IDxbXj5dKj4gbmVnCVwkYTAsXCRhMQotMCswMDY4IDxbXj5dKj4gbGkJXCRhdCwyCi0wKzAwNmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMDcwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNzQgPFtePl0qPiBsaQlcJGF0LDIKLTArMDA3OCA8W14+XSo+IG5vcAotMCswMDdjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDA4MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDg0IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDA4OCA8W14+XSo+IG5vcAotMCswMDhjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDA5MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDk0IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDA5OCA8W14+XSo+IG5vcAotMCswMDljIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBhMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGE0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDBhOCA8W14+XSo+IG5vcAotMCswMGFjIDxbXj5dKj4gZGl2CVwkemVybyxcJGEwLFwkYXQKLTArMDBiMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGI0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDBiOCA8W14+XSo+IG5vcAotMCswMGJjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYXQKLTArMDBjMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwYzggPFtePl0qPiBub3AKLTArMDBjYyA8W14+XSo+IGRpdglcJHplcm8sXCRhMCxcJGF0Ci0wKzAwZDAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBkNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMGQ4IDxbXj5dKj4gbm9wCi0wKzAwZGMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMGUwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBlOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwZWMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTAsXCRhdAotMCswMGYwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDBmOCA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhhNWE1Ci0wKzAwZmMgPFtePl0qPiBkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMTAwIDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAxMGMgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKLTArMDExMCA8W14+XSo+IGJuZXoJXCRhMSwwKzAxMWMgPGZvb1wrMHgxMWM+Ci0wKzAxMTQgPFtePl0qPiBkaXZ1CVwkemVybyxcJGEwLFwkYTEKLTArMDExOCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDExYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMTIwIDxbXj5dKj4gbm9wCi0wKzAxMjQgPFtePl0qPiBibmV6CVwkYTIsMCswMTMwIDxmb29cKzB4MTMwPgotMCswMTI4IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGEyCi0wKzAxMmMgPFtePl0qPiBicmVhawkoMHgwLDB4N3wweDcpCi0wKzAxMzAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDEzNCA8W14+XSo+IG1vdmUJXCRhMCxcJGEwCi0wKzAxMzggPFtePl0qPiBibmV6CVwkYTIsMCswMTQ0IDxmb29cKzB4MTQ0PgotMCswMTNjIDxbXj5dKj4gZGl2CVwkemVybyxcJGExLFwkYTIKLTArMDE0MCA8W14+XSo+IGJyZWFrCSgweDAsMHg3fDB4NykKLTArMDE0NCA8W14+XSo+IGxpCVwkYXQsLTEKLTArMDE0OCA8W14+XSo+IGJuZQlcJGEyLFwkYXQsMCswMTVjIDxmb29cKzB4MTVjPgotMCswMTRjIDxbXj5dKj4gbHVpCVwkYXQsMHg4MDAwCi0wKzAxNTAgPFtePl0qPiBibmUJXCRhMSxcJGF0LDArMDE1YyA8Zm9vXCsweDE1Yz4KLTArMDE1NCA8W14+XSo+IG5vcAotMCswMTU4IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMTVjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxNjAgPFtePl0qPiBsaQlcJGF0LDIKLTArMDE2NCA8W14+XSo+IG5vcAotMCswMTY4IDxbXj5dKj4gZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxNmMgPFtePl0qPiBtZmhpCVwkYTAKLTArMDE3MCA8W14+XSo+IG5vcAotMCswMTc0IDxbXj5dKj4gYm5leglcJGEyLDArMDE4MCA8Zm9vXCsweDE4MD4KLTArMDE3OCA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhMgotMCswMTdjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDd8MHg3KQotMCswMTgwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCR6ZXJvLC0xCi0wKzAxODQgPFtePl0qPiBibmUJXCRhMixcJGF0LDArMDE5YyA8Zm9vXCsweDE5Yz4KLTArMDE4OCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkemVybywxCi0wKzAxOGMgPFtePl0qPiBkc2xsMzIJXCRhdCxcJGF0LDB4MWYKLTArMDE5MCA8W14+XSo+IGJuZQlcJGExLFwkYXQsMCswMTljIDxmb29cKzB4MTljPgotMCswMTk0IDxbXj5dKj4gbm9wCi0wKzAxOTggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAxOWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDFhMCA8W14+XSo+IGxpCVwkYXQsMgotMCswMWE0IDxbXj5dKj4gbm9wCi0wKzAxYTggPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxYWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDFiMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAxYjQgPFtePl0qPiBub3AKLTArMDFiOCA8W14+XSo+IGRkaXYJXCR6ZXJvLFwkYTEsXCRhdAotMCswMWJjIDxbXj5dKj4gbWZoaQlcJGEwCi0wKzAxYzAgPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMWM0IDxbXj5dKj4gbm9wCi0wKzAxYzggPFtePl0qPiBkZGl2dQlcJHplcm8sXCRhMSxcJGF0Ci0wKzAxY2MgPFtePl0qPiBtZmhpCVwkYTAKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2Rpdi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk5OTA2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZGl2LnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgZGl2IG1hY3JvLgotZm9vOgotCWRpdgkkMCwkNCwkNQotCWRpdgkkNCwkNQotCWRpdgkkNCwkNSwkNgotCWRpdgkkNCwxCi0JZGl2CSQ0LCQ1LDEKLQlkaXYJJDQsLTEKLQlkaXYJJDQsJDUsLTEKLQlkaXYJJDQsMgotCWRpdgkkNCwkNSwyCi0JZGl2CSQ0LDB4ODAwMAotCWRpdgkkNCwkNSwweDgwMDAKLQlkaXYJJDQsLTB4ODAwMAotCWRpdgkkNCwkNSwtMHg4MDAwCi0JZGl2CSQ0LDB4MTAwMDAKLQlkaXYJJDQsJDUsMHgxMDAwMAotCWRpdgkkNCwweDFhNWE1Ci0JZGl2CSQ0LCQ1LDB4MWE1YTUKLQotIyBkaXZ1IGlzIGxpa2UgZGl2LCBleGNlcHQgd2hlbiBib3RoIGFyZ3VtZW50cyBhcmUgcmVnaXN0ZXJzLgotIyBKdXN0IHNhbml0eSBjaGVjayBpdCBvdGhlcndpc2UuCi0JZGl2dQkkMCwkNCwkNQotCWRpdnUJJDQsJDUKLQlkaXZ1CSQ0LCQ1LCQ2Ci0JZGl2dQkkNCwxCi0KLSMgcmVtIGlzIGxpa2UgZGl2LCByZW11IGlzIGxpa2UgZGl2dQotCXJlbQkkNCwkNSwkNgotCXJlbXUJJDQsJDUsMgotCi0jIFNhbml0eSBjaGVjayB0aGUgNjQgYml0IHZlcnNpb25zLgotCS5zZXQJbWlwczMKLQlkZGl2CSQ0LCQ1LCQ2Ci0JZGRpdnUJJDQsJDUsMgotCWRyZW0JJDQsJDUsMHg4MDAwCi0JZHJlbXUJJDQsJDUsLTB4ODAwMAotCi0jIGZvcmNlIHNvbWUgcGFkZGluZywgdG8gbWFrZSBvYmpkdW1wIGNvbnNpc3RlbnRseSByZXBvcnQgdGhhdCB0aGVyZSdzIHNvbWUKLSMgaGVyZS4uLgotCS5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiNDQ1ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBkbGkKLSNhczogLW1pcHMzCi0KLSMgVGVzdCB0aGUgZGxpIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAxMCA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDFjIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAyMCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMjQgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwMjggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4MTIzNAotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHhmZmZmCi0wKzAwMzAgPFtePl0qPiBkc3JsMzIJXCRhMCxcJGEwLDB4MAotMCswMDM0IDxbXj5dKj4gbHVpCVwkYTAsMHhmZmZmCi0wKzAwMzggPFtePl0qPiBkc3JsMzIJXCRhMCxcJGEwLDB4MAotMCswMDNjIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMDQwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMDQ0IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhjCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDgwMDAKLTArMDA0YyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0Ci0wKzAwNTAgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDU0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDU4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDEyMzQKLTArMDA1YyA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDA2MCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHg1Njc4Ci0wKzAwNjQgPFtePl0qPiBsdWkJXCRhMCwweDgwMDAKLTArMDA2OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHgxMjM0Ci0wKzAwNmMgPFtePl0qPiBkc2xsCVwkYTAsXCRhMCwweDEwCi0wKzAwNzAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4NTY3OAotMCswMDc0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMDc4IDxbXj5dKj4gbGkJXCRhMCwtMzA4NzUKLTArMDA3YyA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDgwIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweDQzMjEKLTArMDA4NCA8W14+XSo+IGxpCVwkYTAsLTE2Ci0wKzAwODggPFtePl0qPiBsaQlcJGEwLC0yNTYKLTArMDA4YyA8W14+XSo+IGxpCVwkYTAsLTQwOTYKLTArMDA5MCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMDk0IDxbXj5dKj4gbHVpCVwkYTAsMHhmZmYwCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhMCwweGZmMDAKLTArMDA5YyA8W14+XSo+IGx1aQlcJGEwLDB4ZjAwMAotMCswMGEwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGE0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBhOCA8W14+XSo+IGxpCVwkYTAsLTE2Ci0wKzAwYWMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMGIwIDxbXj5dKj4gbGkJXCRhMCwtMjU2Ci0wKzAwYjQgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MAotMCswMGI4IDxbXj5dKj4gbGkJXCRhMCwtNDA5NgotMCswMGJjIDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDAKLTArMDBjMCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAwYzQgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MTAKLTArMDBjOCA8W14+XSo+IGxpCVwkYTAsMHhmZmYwCi0wKzAwY2MgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MTAKLTArMDBkMCA8W14+XSo+IGxpCVwkYTAsMHhmZjAwCi0wKzAwZDQgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MTAKLTArMDBkOCA8W14+XSo+IGxpCVwkYTAsMHhmMDAwCi0wKzAwZGMgPFtePl0qPiBkc2xsMzIJXCRhMCxcJGEwLDB4MTAKLTArMDBlMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBlNCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4NAotMCswMGU4IDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMGVjIDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwZjAgPFtePl0qPiBsaQlcJGEwLC0xCi0wKzAwZjQgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGMKLTArMDBmOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDBmYyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4MTAKLTArMDEwMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDEwNCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4MTQKLTArMDEwOCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDEwYyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4MTgKLTArMDExMCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDExNCA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4MWMKLTArMDExOCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmZgotMCswMTFjIDxbXj5dKj4gZHNybDMyCVwkYTAsXCRhMCwweDAKLTArMDEyMCA8W14+XSo+IGx1aQlcJGEwLDB4ZmZmCi0wKzAxMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmZmZgotMCswMTI4IDxbXj5dKj4gbHVpCVwkYTAsMHhmZgotMCswMTJjIDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDEzMCA8W14+XSo+IGx1aQlcJGEwLDB4ZgotMCswMTM0IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDEzOCA8W14+XSo+IGxpCVwkYTAsMHhmZmZmCi0wKzAxM2MgPFtePl0qPiBsaQlcJGEwLDQwOTUKLTArMDE0MCA8W14+XSo+IGxpCVwkYTAsMjU1Ci0wKzAxNDQgPFtePl0qPiBsaQlcJGEwLDE1Ci0wKzAxNDggPFtePl0qPiBsdWkJXCRhMCwweDMKLTArMDE0YyA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhmZmZjCi0wKzAxNTAgPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMTU0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxZQotMCswMTU4IDxbXj5dKj4gbGkJXCRhMCwweGZmZmYKLTArMDE1YyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgyCi0wKzAxNjAgPFtePl0qPiBsaQlcJGEwLDB4ZmZmZgotMCswMTY0IDxbXj5dKj4gZHNsbDMyCVwkYTAsXCRhMCwweDYKLTArMDE2OCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDE2YyA8W14+XSo+IGRzbGwzMglcJGEwLFwkYTAsMHgwCi0wKzAxNzAgPFtePl0qPiBkc3JsCVwkYTAsXCRhMCwweGEKLTArMDE3NCA8W14+XSo+IGxpCVwkYTAsLTEKLTArMDE3OCA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MWMKLTArMDE3YyA8W14+XSo+IGRzcmwJXCRhMCxcJGEwLDB4YQotMCswMTgwIDxbXj5dKj4gbGkJXCRhMCwtMQotMCswMTg0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxOAotMCswMTg4IDxbXj5dKj4gZHNybAlcJGEwLFwkYTAsMHhhCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhMCwweDNmCi0wKzAxOTAgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4ZmMwMwotMCswMTk0IDxbXj5dKj4gZHNsbAlcJGEwLFwkYTAsMHgxMAotMCswMTk4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGZmZmYKLTArMDE5YyA8W14+XSo+IGRzbGwJXCRhMCxcJGEwLDB4MTAKLTArMDFhMCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjMDAwCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9kbGkucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3OTUyOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2RsaS5zCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGRsaSBtYWNyby4KLQkKLWZvbzoJCi0JZGxpCSQ0LDAKLQlkbGkJJDQsMQotCWRsaQkkNCwtMQotCWRsaQkkNCwweDgwMDAKLQlkbGkJJDQsLTB4ODAwMAotCWRsaQkkNCwweDEwMDAwCi0JZGxpCSQ0LDB4MWE1YTUKLQlkbGkJJDQsMHg4MDAwMTIzNAotCWRsaQkkNCwweGZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDBmZmZmZmZmZgotCWRsaQkkNCwweGZmZmZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDBmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4ZmZmZmZmZmY4MDAwMTIzNAotCWRsaQkkNCwweGZmZmY4MDAwMTIzNDU2NzgKLQlkbGkJJDQsMHg4MDAwMTIzNDU2NzgwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmODc2NQotCWRsaQkkNCwweGZmZmZmZmZmZmZmZjQzMjEKLQotCWRsaQkkNCwweGZmZmZmZmZmZmZmZmZmZjAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZmZmZjAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZmZmZjAwMAotCWRsaQkkNCwweGZmZmZmZmZmZmZmZjAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZmZmZjAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZmZmZjAwMDAwMAotCWRsaQkkNCwweGZmZmZmZmZmZjAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZmZmZjAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZmZmZjAwMDAwMDAwMAotCWRsaQkkNCwweGZmZmZmZjAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZmZmZjAwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZmZmZjAwMDAwMDAwMDAwMAotCWRsaQkkNCwweGZmZjAwMDAwMDAwMDAwMDAKLQlkbGkJJDQsMHhmZjAwMDAwMDAwMDAwMDAwCi0JZGxpCSQ0LDB4ZjAwMDAwMDAwMDAwMDAwMAotCi0JZGxpCSQ0LDB4MGZmZmZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwZmZmZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDBmZmZmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMGZmZmZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwZmZmZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDBmZmZmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMGZmZmZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwZmZmZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDBmZmZmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMGZmZmZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwZmZmZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDBmZmZmCi0JZGxpCSQ0LDB4MDAwMDAwMDAwMDAwMGZmZgotCWRsaQkkNCwweDAwMDAwMDAwMDAwMDAwZmYKLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDAwMDBmCi0KLQlkbGkJJDQsMHgwMDAwMDAwMDAwMDNmZmZjCi0JZGxpCSQ0LDB4MDAwMDNmZmZjMDAwMDAwMAotCWRsaQkkNCwweDAwMDNmZmZjMDAwMDAwMDAKLQlkbGkJJDQsMHgwMDNmZmZjMDAwMDAwMDAwCi0JZGxpCSQ0LDB4MDAzZmZmZmZmZmMwMDAwMAotCWRsaQkkNCwweDAwM2ZmZmZmZmZmYzAwMDAKLQlkbGkJJDQsMHgwMDNmZmZmZmZmZmZjMDAwCi0KLQlkbGkJJDQsMHgwMDNmZmMwM2ZmZmZjMDAwCi0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCi0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLmMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTVmOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzbid0IGRpcmVjdGx5IHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGU7IGl0IHVzZXMKLSAgIGVsZl9lX2ZsYWdzLnMuICBIb3dldmVyLCBJIGZpZ3VyZWQgaXQgd291bGQgYmUgbmljZSB0byBwcm92aWRlIHRoZQotICAgc291cmNlIGNvZGUgZnJvbSB3aGljaCB0aGUgLnMgZmlsZSB3YXMgZ2VuZXJhdGVkLgotCi0gICBJdCB3YXMgY29tcGlsZWQgYXMgZm9sbG93czoKLQotICAgbWlwczY0LWVsZi1nY2MgLW00NjUwIC1TIC1PIGVsZl9lX2ZsYWdzLmMKLQotICAgV2UgdXNlIHRoZSAtbTQ2NTAgZmxhZyB0byBnZXQgdGhlIDQ2NTAtc3BlY2lmaWMgJ211bCcgaW5zdHJ1Y3Rpb24KLSAgIGluIHRoZXJlOyB0aGUgdGVzdCBzdWl0ZSB3YW50cyB0byBiZSBzdXJlIHRoYXQgR0FTJ3MgLW00NjUwIGZsYWcKLSAgIHdpbGwgaW5kZWVkIGNhdXNlIGl0IHRvIGdlbmVyYXRlIHRoZSA0NjUwIG11bCBpbnN0cnVjdGlvbiwgYW5kIG5vdAotICAgZXhwYW5kIGl0IGFzIGEgbWFjcm8uCi0KLSAgIElhbiAxMCBKdW5lIDE5OTk6IEkgdHdlYWtlZCB0aGUgcmVzdWx0aW5nIGFzc2VtYmxlciBmaWxlIHNvIHRoYXQgaXQKLSAgIHdvdWxkIGdlbmVyYXRlIHRoZSBzYW1lIGNvZGUgd2hlbiBnYXMgd2FzIGNvbmZpZ3VyZWQgZm9yIG1pcHMtZWxmCi0gICBhbmQgZm9yIG1pcHM2NC1lbGYuICAqLwotCi1pbnQKLWZvbyAoaW50IGEsIGludCBiKQotewotICByZXR1cm4gKGEgKiBiKSArIDE7Ci19Ci0KLWludAotbWFpbiAoKQotewotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVjYThjNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0JLmZpbGUJMSAiZWxmX2VfZmxhZ3MuYyIKLWdjYzJfY29tcGlsZWQuOgotX19nbnVfY29tcGlsZWRfYzoKLQkudGV4dAotCS5hbGlnbgkyCi0JLmdsb2JsCWZvbwotCS50ZXh0Ci0JLmVudAlmb28KLWZvbzoKLQkuZnJhbWUJJHNwLDAsJDMxCQkjIHZhcnM9IDAsIHJlZ3M9IDAvMCwgYXJncz0gMCwgZXh0cmE9IDAKLQkubWFzawkweDAwMDAwMDAwLDAKLQkuZm1hc2sJMHgwMDAwMDAwMCwwCi0JbXVsCSQyLCQ0LCQ1Ci0JLnNldAlub3Jlb3JkZXIKLQkuc2V0CW5vbWFjcm8KLQlqCSQzMQotCWFkZHUJJDIsJDIsMQotCS5zZXQJbWFjcm8KLQkuc2V0CXJlb3JkZXIKLQotCS5lbmQJZm9vCi0JLmFsaWduCTIKLQkuZ2xvYmwJbWFpbgotCS50ZXh0Ci0JLmVudAltYWluCi1tYWluOgotCS5mcmFtZQkkc3AsNDAsJDMxCQkjIHZhcnM9IDAsIHJlZ3M9IDEvMCwgYXJncz0gMzIsIGV4dHJhPSAwCi0JLm1hc2sJMHg4MDAwMDAwMCwtOAotCS5mbWFzawkweDAwMDAwMDAwLDAKLQlzdWJ1CSRzcCwkc3AsNDAKLQlzdwkkMzEsMzIoJHNwKQotCWphbAlfX2djY21haW4KLQltb3ZlCSQyLCQwCi0JbHcJJDMxLDMyKCRzcCkKLQlub3AKLQkuc2V0CW5vcmVvcmRlcgotCS5zZXQJbm9tYWNybwotCWoJJDMxCi0JYWRkdQkkc3AsJHNwLDQwCi0JLnNldAltYWNybwotCS5zZXQJcmVvcmRlcgotCi0JLmVuZAltYWluCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczEuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkZTY3ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMS5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBuYW1lOiBFTEYgZV9mbGFnczogbm90aGluZyBzcGVjaWFsCi0jIHNvdXJjZTogZWxmX2VfZmxhZ3MucwotIyBvYmpkdW1wOiAtZmQKLQotLio6LipmaWxlIGZvcm1hdC4qbWlwcy4qCi1hcmNoaXRlY3R1cmU6IG1pcHM6WzM0XTAwMCwgZmxhZ3MgMHgwMDAwMDAxMToKLUhBU19SRUxPQywgSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMDAwMDAwMDAwCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwMDAwMDAwMDAgPGZvbz46Ci0gICAwOgkwMDg1MDAxOSAJbXVsdHUJXCRhMCxcJGExCi0gICA0OgkwMDAwMTAxMiAJbWZsbwlcJHYwCi0gICA4OgkwM2UwMDAwOCAJanIJXCRyYQotICAgYzoJMjQ0MjAwMDEgCWFkZGl1CVwkdjAsXCR2MCwxCi0KLTAwMDAwMDAwMDAwMDAwMTAgPG1haW4+OgotICAxMDoJMjdiZGZmZDggCWFkZGl1CVwkc3AsXCRzcCwtNDAKLSAgMTQ6CWFmYmYwMDIwIAlzdwlcJHJhLDMyXChcJHNwXCkKLSAgMTg6CTBjMDAwMDAwIAlqYWwJMCA8Zm9vPgotICAxYzoJMDAwMDAwMDAgCW5vcAotICAyMDoJMDAwMDEwMlsxZF0gCW1vdmUJXCR2MCxcJHplcm8KLSAgMjQ6CThmYmYwMDIwIAlsdwlcJHJhLDMyXChcJHNwXCkKLSAgMjg6CTAwMDAwMDAwIAlub3AKLSAgMmM6CTAzZTAwMDA4IAlqcglcJHJhCi0gIDMwOgkyN2JkMDAyOCAJYWRkaXUJXCRzcCxcJHNwLDQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxM2JkMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBuYW1lOiBFTEYgZV9mbGFnczogLW00NjUwCi0jIHNvdXJjZTogZWxmX2VfZmxhZ3MucwotIyBhczogLW00NjUwCi0jIG9iamR1bXA6IC1mZAotCi0uKjouKmZpbGUgZm9ybWF0LiptaXBzLioKLWFyY2hpdGVjdHVyZTogbWlwczo0NjUwLCBmbGFncyAweDAwMDAwMDExOgotSEFTX1JFTE9DLCBIQVNfU1lNUwotc3RhcnQgYWRkcmVzcyAweDAwMDAwMDAwMDAwMDAwMDAKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAwMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTcwODUxMDAyIAltdWwJXCR2MCxcJGEwLFwkYTEKLSAgIDQ6CTAzZTAwMDA4IAlqcglcJHJhCi0gICA4OgkyNDQyMDAwMSAJYWRkaXUJXCR2MCxcJHYwLDEKLQotMDAwMDAwMDAwMDAwMDAwYyA8bWFpbj46Ci0gICBjOgkyN2JkZmZkOCAJYWRkaXUJXCRzcCxcJHNwLC00MAotICAxMDoJYWZiZjAwMjAgCXN3CVwkcmEsMzJcKFwkc3BcKQotICAxNDoJMGMwMDAwMDAgCWphbAkwIDxmb28+Ci0gIDE4OgkwMDAwMDAwMCAJbm9wCi0gIDFjOgkwMDAwMTAyZCAJbW92ZQlcJHYwLFwkemVybwotICAyMDoJOGZiZjAwMjAgCWx3CVwkcmEsMzJcKFwkc3BcKQotICAyNDoJMDAwMDAwMDAgCW5vcAotICAyODoJMDNlMDAwMDggCWpyCVwkcmEKLSAgMmM6CTI3YmQwMDI4IAlhZGRpdQlcJHNwLFwkc3AsNDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzMy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODEzNDkxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvZWxmX2VfZmxhZ3MzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIG5hbWU6IEVMRiBlX2ZsYWdzOiAtbWNwdT00NjUwCi0jIHNvdXJjZTogZWxmX2VfZmxhZ3MucwotIyBhczogLW1jcHU9NDY1MAotIyBvYmpkdW1wOiAtZmQKLQotLio6LipmaWxlIGZvcm1hdC4qbWlwcy4qCi1hcmNoaXRlY3R1cmU6IG1pcHM6NDY1MCwgZmxhZ3MgMHgwMDAwMDAxMToKLUhBU19SRUxPQywgSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMDAwMDAwMDAwCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwMDAwMDAwMDAgPGZvbz46Ci0gICAwOgk3MDg1MTAwMiAJbXVsCVwkdjAsXCRhMCxcJGExCi0gICA0OgkwM2UwMDAwOCAJanIJXCRyYQotICAgODoJMjQ0MjAwMDEgCWFkZGl1CVwkdjAsXCR2MCwxCi0KLTAwMDAwMDAwMDAwMDAwMGMgPG1haW4+OgotICAgYzoJMjdiZGZmZDggCWFkZGl1CVwkc3AsXCRzcCwtNDAKLSAgMTA6CWFmYmYwMDIwIAlzdwlcJHJhLDMyXChcJHNwXCkKLSAgMTQ6CTBjMDAwMDAwIAlqYWwJMCA8Zm9vPgotICAxODoJMDAwMDAwMDAgCW5vcAotICAxYzoJMDAwMDEwMmQgCW1vdmUJXCR2MCxcJHplcm8KLSAgMjA6CThmYmYwMDIwIAlsdwlcJHJhLDMyXChcJHNwXCkKLSAgMjQ6CTAwMDAwMDAwIAlub3AKLSAgMjg6CTAzZTAwMDA4IAlqcglcJHJhCi0gIDJjOgkyN2JkMDAyOCAJYWRkaXUJXCRzcCxcJHNwLDQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzNC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9lbGZfZV9mbGFnczQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzZWJhMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2VsZl9lX2ZsYWdzNC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotIyBuYW1lOiBFTEYgZV9mbGFnczogLW00NjUwIC1tY3B1PTQ2NTAKLSMgc291cmNlOiBlbGZfZV9mbGFncy5zCi0jIGFzOiAtbTQ2NTAgLW1jcHU9NDY1MAotIyBvYmpkdW1wOiAtZmQKLQotLio6LipmaWxlIGZvcm1hdC4qbWlwcy4qCi1hcmNoaXRlY3R1cmU6IG1pcHM6NDY1MCwgZmxhZ3MgMHgwMDAwMDAxMToKLUhBU19SRUxPQywgSEFTX1NZTVMKLXN0YXJ0IGFkZHJlc3MgMHgwMDAwMDAwMDAwMDAwMDAwCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwMDAwMDAwMDAgPGZvbz46Ci0gICAwOgk3MDg1MTAwMiAJbXVsCVwkdjAsXCRhMCxcJGExCi0gICA0OgkwM2UwMDAwOCAJanIJXCRyYQotICAgODoJMjQ0MjAwMDEgCWFkZGl1CVwkdjAsXCR2MCwxCi0KLTAwMDAwMDAwMDAwMDAwMGMgPG1haW4+OgotICAgYzoJMjdiZGZmZDggCWFkZGl1CVwkc3AsXCRzcCwtNDAKLSAgMTA6CWFmYmYwMDIwIAlzdwlcJHJhLDMyXChcJHNwXCkKLSAgMTQ6CTBjMDAwMDAwIAlqYWwJMCA8Zm9vPgotICAxODoJMDAwMDAwMDAgCW5vcAotICAxYzoJMDAwMDEwMmQgCW1vdmUJXCR2MCxcJHplcm8KLSAgMjA6CThmYmYwMDIwIAlsdwlcJHJhLDMyXChcJHNwXCkKLSAgMjQ6CTAwMDAwMDAwIAlub3AKLSAgMjg6CTAzZTAwMDA4IAlqcglcJHJhCi0gIDJjOgkyN2JkMDAyOCAJYWRkaXUJXCRzcCxcJHNwLDQwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2l0YmwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjhhNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotCi0gICAgOyBUZXN0IGNhc2UgZm9yIGFzc2VtYmxlciBvcHRpb24gIml0YmwiLgotICAgIDsgUnVuIGFzICJhcyAtLWl0YmwgaXRibCBpdGJsLnMiCi0gICAgOyBvciB3aXRoIHN0YW5kLWFsb25lIHRlc3QgY2FzZSAiaXRibC10ZXN0IGl0YmwgaXRibC5zIi4KLSAgICA7IEhlcmUsIHRoZSBwcm9jZXNzb3JzIHJlcHJlc2VudCBtaXBzIGNvcHJvY2Vzc29ycy4KLQotICAgIHAxIGRyZWcgZDEgMSAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMSIgZm9yIENPUDEgaGFzIHZhbHVlIDEKLSAgICBwMSBjcmVnIGMzIDMgICAgICAgIDsgY3RybCByZWdpc3RlciAiYzMiIGZvciBDT1AxIGhhcyB2YWx1ZSAzCi0gICAgcDMgaW5zbiBmaWUgMHgxZToyNC0yMCAgICAgIDsgZnVuY3Rpb24gImZpbGwiIGZvciBDT1AzIGhhcyB2YWx1ZSAzMQotICAgIHAzIGRyZWcgZDMgMyAgICAgICAgOyBkYXRhIHJlZ2lzdGVyICJkMyIgZm9yIENPUDMgaGFzIHZhbHVlIDMKLSAgICBwMyBjcmVnIGMyIDIyICAgICAgIDsgY29udHJvbCByZWdpc3RlciAiYzIiIGZvciBDT1AzIGhhcyB2YWx1ZSAyMgotICAgIHAzIGluc24gZmVlIDB4MWU6MjQtMjAsZHJlZzoxNy0xMyxjcmVnOjEyLTgsaW1tZWQ6Ny0wCi0KLSAgICBwMyBkcmVnIGQzIDMgICAgICAgIDsgZGF0YSByZWdpc3RlciAiZDMiIGZvciBDT1AzIGhhcyB2YWx1ZSAzCi0gICAgcDMgY3JlZyBjMiAyMiAgICAgICA7IGNvbnRyb2wgcmVnaXN0ZXIgImMyIiBmb3IgQ09QMyBoYXMgdmFsdWUgMjIKLSAgICBwMyBpbnNuIGZ1bSAweDAxZTAwMDAxIGRyZWc6MTctMTMgY3JlZzoxMi04Ci0gICAgcDMgaW5zbiBmb2ggMHhmOjI0LTIxIGRyZWc6MjAtMTYgaW1tZWQ6MTUtMAotCi0gICAgcDMgaW5zbiBwaWcgMHgxOjI0LTIxKlsweDEwMHwweDJdLCBkcmVnOjIwLTE2LCBpbW1lZDoxNS0wKjB4MTAwMDAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvaXRibC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NTU0NWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9pdGJsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0KLSAgICA7IFRlc3QgY2FzZSBmb3IgYXNzZW1ibGVyIG9wdGlvbiAiaXRibCIuCi0gICAgOyBSdW4gYXMgImFzIC0taXRibCBpdGJsIGl0YmwucyIKLSAgICA7IG9yIHdpdGggc3RhbmQtYWxvbmUgdGVzdCBjYXNlICJpdGJsLXRlc3QgaXRibCBpdGJsLnMiLgotCi0gICAgOyBDYWxsIG1pcHMgY29wcm9jZXNzb3IgImNvZnVuInMgYXMgZGVmaW5lZCBpbiAiaXRibCIuCi0KLSAgICBmZWUgJGQzLCRjMiwweDEgCTsgIDB4NGZmMDc2MDEKLSAgICBmaWUgCSAgCTsgIDB4NGZmMDAwMDAKLSAgICBmb2ggJDIsMHgxMDAKLSAgICBmdW0gJGQzLCRjMiAgICAgCTsgIDB4NGZmMDc2MDEKLSAgICBwaWcgJDIsMHgxMDAKLQotICAgIDsgQ2FsbCBhIG1pcHMgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gd2l0aCByZWdpc3RlciAiZDEiIAotICAgIDsgZGVmaW5lZCBpbiAiaXRibCIuCi0KLSAgICBMV0MxICRkMSwweDEwMCgkMikKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NmNjZmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBqYWwtZW1waWMKLSNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljCi0jc291cmNlOiBqYWwucwotCi0jIFRlc3QgdGhlIGphbCBtYWNybyB3aXRoIC1tZW1iZWRkZWQtcGljLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBqYWxyCVwkdDkKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gamFscglcJGEwLFwkdDkKLTArMDAwYyA8W14+XSo+IG5vcAotMCswMDEwIDxbXj5dKj4gYmFsCTArMDAwMCA8dGV4dF9sYWJlbD4KLVsgCV0qMTA6IFBDUkVMMTYJLnRleHQKLTArMDAxNCA8W14+XSo+IG5vcAotMCswMDE4IDxbXj5dKj4gYmFsCTArMDAxOCA8dGV4dF9sYWJlbFwrKDB4fCkxOD4KLVsgCV0qMTg6IFBDUkVMMTYJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDFjIDxbXj5dKj4gbm9wCi0wKzAwMjAgPFtePl0qPiBiCTArMDAwMCA8dGV4dF9sYWJlbD4KLVsgCV0qMjA6IFBDUkVMMTYJLnRleHQKLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gYgkwKzAwMjggPHRleHRfbGFiZWxcKygweHwpMjg+Ci1bIAldKjI4OiBQQ1JFTDE2CWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDAyYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTViZTc2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBSMzAwMCBqYWwtc3ZyNHBpYwotI2FzOiAtbWlwczEgLUtQSUMgLW1jcHU9cjMwMDAKLQotIyBUZXN0IHRoZSBqYWwgbWFjcm8gd2l0aCAtS1BJQy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHVpCVwkZ3AsMHgwCi1bIAldKjA6IFJfTUlQU19ISTE2CV9ncF9kaXNwCi0wKzAwMDQgPFtePl0qPiBhZGRpdQlcJGdwLFwkZ3AsMAotWyAJXSo0OiBSX01JUFNfTE8xNglfZ3BfZGlzcAotMCswMDA4IDxbXj5dKj4gYWRkdQlcJGdwLFwkZ3AsXCR0OQotMCswMDBjIDxbXj5dKj4gc3cJXCRncCwwXChcJHNwXCkKLTArMDAxMCA8W14+XSo+IGphbHIJXCR0OQotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDFjIDxbXj5dKj4gamFscglcJGEwLFwkdDkKLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDAyOCA8W14+XSo+IG5vcAotMCswMDJjIDxbXj5dKj4gbHcJXCR0OSwwXChcJGdwXCkKLVsgCV0qMmM6IFJfTUlQU19HT1QxNgkudGV4dAotMCswMDMwIDxbXj5dKj4gbm9wCi0wKzAwMzQgPFtePl0qPiBhZGRpdQlcJHQ5LFwkdDksMAotWyAJXSozNDogUl9NSVBTX0xPMTYJLnRleHQKLTArMDAzOCA8W14+XSo+IGphbHIJXCR0OQotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDQ0IDxbXj5dKj4gbm9wCi0wKzAwNDggPFtePl0qPiBsdwlcJHQ5LDBcKFwkZ3BcKQotWyAJXSo0ODogUl9NSVBTX0NBTEwxNglleHRlcm5hbF90ZXh0X2xhYmVsCi0wKzAwNGMgPFtePl0qPiBub3AKLTArMDA1MCA8W14+XSo+IGphbHIJXCR0OQotMCswMDU0IDxbXj5dKj4gbm9wCi0wKzAwNTggPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDVjIDxbXj5dKj4gYgkwKzAwMDAgPHRleHRfbGFiZWw+Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC1zdnI0cGljLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODlkZmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwtc3ZyNHBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGphbCBtYWNybyB3aXRoIC1LUElDIGNvZGUuCi0JCi10ZXh0X2xhYmVsOgkKLQkuc2V0CW5vcmVvcmRlcgotCS5jcGxvYWQJJDI1Ci0JLnNldAlyZW9yZGVyCi0JLmNwcmVzdG9yZQkwCi0JamFsCSQyNQotCWphbAkkNCwkMjUKLQlqYWwJdGV4dF9sYWJlbAotCWphbAlleHRlcm5hbF90ZXh0X2xhYmVsCi0JCi0jIFRlc3QgaiBhcyB3ZWxsCQotCWoJdGV4dF9sYWJlbAotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjZkY2EzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLXhnb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBSMzAwMCBqYWwteGdvdAotI2FzOiAtbWlwczEgLUtQSUMgLXhnb3QgLW1jcHU9cjMwMDAKLSNzb3VyY2U6IGphbC1zdnI0cGljLnMKLQotIyBUZXN0IHRoZSBqYWwgbWFjcm8gd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHVpCVwkZ3AsMHgwCi1bIAldKjA6IFJfTUlQU19ISTE2CV9ncF9kaXNwCi0wKzAwMDQgPFtePl0qPiBhZGRpdQlcJGdwLFwkZ3AsMAotWyAJXSo0OiBSX01JUFNfTE8xNglfZ3BfZGlzcAotMCswMDA4IDxbXj5dKj4gYWRkdQlcJGdwLFwkZ3AsXCR0OQotMCswMDBjIDxbXj5dKj4gc3cJXCRncCwwXChcJHNwXCkKLTArMDAxMCA8W14+XSo+IGphbHIJXCR0OQotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDFjIDxbXj5dKj4gamFscglcJGEwLFwkdDkKLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gbHcJXCRncCwwXChcJHNwXCkKLTArMDAyOCA8W14+XSo+IG5vcAotMCswMDJjIDxbXj5dKj4gbHcJXCR0OSwwXChcJGdwXCkKLVsgCV0qMmM6IFJfTUlQU19HT1QxNgkudGV4dAotMCswMDMwIDxbXj5dKj4gbm9wCi0wKzAwMzQgPFtePl0qPiBhZGRpdQlcJHQ5LFwkdDksMAotWyAJXSozNDogUl9NSVBTX0xPMTYJLnRleHQKLTArMDAzOCA8W14+XSo+IGphbHIJXCR0OQotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBsdwlcJGdwLDBcKFwkc3BcKQotMCswMDQ0IDxbXj5dKj4gbHVpCVwkdDksMHgwCi1bIAldKjQ0OiBSX01JUFNfQ0FMTF9ISTE2CWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDA0OCA8W14+XSo+IGFkZHUJXCR0OSxcJHQ5LFwkZ3AKLTArMDA0YyA8W14+XSo+IGx3CVwkdDksMFwoXCR0OVwpCi1bIAldKjRjOiBSX01JUFNfQ0FMTF9MTzE2CWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDA1MCA8W14+XSo+IG5vcAotMCswMDU0IDxbXj5dKj4gamFscglcJHQ5Ci0wKzAwNTggPFtePl0qPiBub3AKLTArMDA1YyA8W14+XSo+IGx3CVwkZ3AsMFwoXCRzcFwpCi0wKzAwNjAgPFtePl0qPiBiCTArMDAwMCA8dGV4dF9sYWJlbD4KLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2I1ODZmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvamFsLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgamFsCi0KLSMgVGVzdCB0aGUgamFsIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBqYWxyCVwkdDkKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gamFscglcJGEwLFwkdDkKLTArMDAwYyA8W14+XSo+IG5vcAotMCswMDEwIDxbXj5dKj4gamFsCTArIDx0ZXh0X2xhYmVsPgotWyAJXSoxMDogKE1JUFNfSk1QfE1JUFNfSk1QfEpNUEFERFJ8Ul9NSVBTXzI2KQkudGV4dAotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBqYWwJMCsgPHRleHRfbGFiZWw+Ci1bIAldKjE4OiAoTUlQU19KTVB8Sk1QQUREUnxSX01JUFNfMjYpCWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDAxYyA8W14+XSo+IG5vcAotMCswMDIwIDxbXj5dKj4gagkwKyA8dGV4dF9sYWJlbD4KLVsgCV0qMjA6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJLnRleHQKLTArMDAyNCA8W14+XSo+IG5vcAotMCswMDI4IDxbXj5dKj4gagkwKyA8dGV4dF9sYWJlbD4KLVsgCV0qMjg6IChNSVBTX0pNUHxKTVBBRERSfFJfTUlQU18yNikJZXh0ZXJuYWxfdGV4dF9sYWJlbAotMCswMDJjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9qYWwucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5YmU5NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2phbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGphbCBtYWNyby4KLQkuZ2xvYmwJdGV4dF9sYWJlbAkudGV4dAotdGV4dF9sYWJlbDoJCi0JamFsCSQyNQotCWphbAkkNCwkMjUKLQlqYWwJdGV4dF9sYWJlbAotCWphbAlleHRlcm5hbF90ZXh0X2xhYmVsCi0JCi0jIFRlc3QgaiBhcyB3ZWxsCQotCWoJdGV4dF9sYWJlbAotCWoJZXh0ZXJuYWxfdGV4dF9sYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjI5NTcwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEtZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGEtZW1waWMKLSNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljCi0KLSMgVGVzdCB0aGUgbGEgbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDEwIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMWMgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDJjIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQ4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODQKLVsgCV0qNTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA1NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjU0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNTggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo1ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo1YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSo2MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA2NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODQKLVsgCV0qNjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDY4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNTM4NAotWyAJXSo2ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2MzgzCi1bIAldKjZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwNzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qNzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qNzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDdjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDEKLVsgCV0qN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE2MzgzCi1bIAldKjgwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTUzODMKLVsgCV0qODQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDg4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4NAotWyAJXSo4ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDhjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDkwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBhMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBhOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGIwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNjM4NAotWyAJXSpiMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwYjggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsLTE1Mzg0Ci1bIAldKmI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBjMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODMKLVsgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBjOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwxCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwZDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSpkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwZDggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSpkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwZTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMQotWyAJXSplMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDBlOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwtMTYzODMKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMGYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLC0xNTM4MwotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwZjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZjg6IFJFTEhJCWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDBmYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwyNTIKLVsgCV0qZmM6IFJFTExPCWV4dGVybmFsX3RleHRfbGFiZWwKLTArMDEwMCA8W14+XSo+IGxpCVwkYTAsMjQ4Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLWVtcGljLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZGY1ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1lbXBpYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxhIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMKLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci10ZXh0X2xhYmVsOgkKLQlsYQkkNCwwCi0JbGEJJDQsMQotCWxhCSQ0LDB4ODAwMAotCWxhCSQ0LC0weDgwMDAKLQlsYQkkNCwweDEwMDAwCi0JbGEJJDQsMHgxYTVhNQotCWxhCSQ0LDAoJDUpCi0JbGEJJDQsMSgkNSkKLQlsYQkkNCwweDgwMDAoJDUpCi0JbGEJJDQsLTB4ODAwMCgkNSkKLQlsYQkkNCwweDEwMDAwKCQ1KQotCWxhCSQ0LDB4MWE1YTUoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbAotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGEJJDQsZGF0YV9sYWJlbCsxCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsYQkkNCxkYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGEJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0KLXNlY29uZF90ZXh0X2xhYmVsOgkKLQlsYQkkNCxleHRlcm5hbF90ZXh0X2xhYmVsIC0gdGV4dF9sYWJlbAotCWxhCSQ0LHNlY29uZF90ZXh0X2xhYmVsIC0gdGV4dF9sYWJlbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXN2cjRwaWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4YTNkNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGEtc3ZyNHBpYwotI2FzOiAtbWlwczEgLUtQSUMgLS1kZWZzeW0gS1BJQz0xCi0jc291cmNlOiBsYS5zCi0KLSMgVGVzdCB0aGUgbGEgbWFjcm8gd2l0aCAtS1BJQy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDEwIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMWMgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDJjIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQ4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjUwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA1NCA8W14+XSo+IG5vcAotMCswMDU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNTg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1YzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2MDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjY0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjZjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMDcwIDxbXj5dKj4gbm9wCi0wKzAwNzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo3NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNzg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwN2MgPFtePl0qPiBub3AKLTArMDA4MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjgwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwODQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo4NDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKjhjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMDkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOTA6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk0IDxbXj5dKj4gbm9wCi0wKzAwOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMDljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOWM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTAgPFtePl0qPiBub3AKLTArMDBhNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwYTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSphODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IG5vcAotMCswMGIwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDBiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmI0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBub3AKLTArMDBiYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwYzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpjMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qYzg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmNjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGQwIDxbXj5dKj4gbm9wCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMQotWyAJXSpkNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZDg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMGRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKmUwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZTg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwZjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAwZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpmODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMTA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTA4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTBjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxMTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAxMTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxMTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDExYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMTI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTI4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxMzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKjEzMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTM4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxNDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMxNzY4Ci1bIAldKjE0MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTQ4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDE0YyA8W14+XSo+IG5vcAotMCswMTUwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSoxNTA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxNTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNTQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTU4IDxbXj5dKj4gbm9wCi0wKzAxNWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNjA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDE2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE2YzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3MCA8W14+XSo+IG5vcAotMCswMTc0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswMTc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTc4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxN2MgPFtePl0qPiBub3AKLTArMDE4MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDE4NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE4NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE4OCA8W14+XSo+IG5vcAotMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSoxOGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE5MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMTc2OAotWyAJXSoxOTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE5YzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxYTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDFhNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjFhNDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDFhOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDFhYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFhYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDFiNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzAxYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYmM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYzAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDFjNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzAxYzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxY2M6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDFkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzAxZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxZGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZGM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMWU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDFlOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDFlYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFlYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFmMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMWY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMWY0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZmM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyMDAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDIwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjIwNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjA4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjBjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjBjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDIxMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMjE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSoyMTQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyMTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyMWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyMjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzAyMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMmM6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDIzNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDIzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDIzYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIzYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMjQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswMjQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjRjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDI1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDI1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI1YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI1YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI2MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMjY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSoyNjQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI2OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI2YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI3MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMjc0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMjEzMQotWyAJXSoyNzQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI3YzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyODAgPFtePl0qPiBub3AKLTArMDI4NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjI4NDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDI4OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI4YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI4YzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBub3AKLTArMDI5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI5ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5YyA8W14+XSo+IG5vcAotMCswMmEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmE0OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmE4IDxbXj5dKj4gbm9wCi0wKzAyYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyYjA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJiNCA8W14+XSo+IG5vcAotMCswMmI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmJjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMmMwIDxbXj5dKj4gbm9wCi0wKzAyYzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyYzQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDJjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjJjYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJkMCA8W14+XSo+IG5vcAotMCswMmQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMmQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyZDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyZGM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMmUwIDxbXj5dKj4gbm9wCi0wKzAyZTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotWyAJXSoyZTQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyZTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyZWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmYwIDxbXj5dKj4gbm9wCi0wKzAyZjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMmY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmZjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzAwIDxbXj5dKj4gbm9wCi0wKzAzMDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMzA4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzBjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzBjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzEwIDxbXj5dKj4gbm9wCi0wKzAzMTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMzE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzFjOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMjAgPFtePl0qPiBub3AKLTArMDMyNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAzMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozMmM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAzMzAgPFtePl0qPiBub3AKLTArMDMzNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKjMzNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMzM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzNjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMzQwIDxbXj5dKj4gbm9wCi0wKzAzNDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMQotWyAJXSozNDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDM0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM0YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjM0YzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAzNTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDM1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qMzU0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMzU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMzVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzYwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMzY4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMzZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMzcwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzc0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMzc0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzc4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAzN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAzODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzODQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzODggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozODg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzOGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDM5MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDM5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDM5OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjM5YzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2EwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAzYTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAzYTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzYWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzYjAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozYjA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAzYjQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDNiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qM2I4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzYzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzYzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozYzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAzYzggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDNjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKLVsgCV0qM2NjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzZDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAzZDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozZDg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswM2RjIDxbXj5dKj4gbm9wCi0wKzAzZTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKjNlMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDNlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNlOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjNlODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZWMgPFtePl0qPiBub3AKLTArMDNmMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDNmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjNmODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNmYyA8W14+XSo+IG5vcAotMCswNDAwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswNDA0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDA4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDBjIDxbXj5dKj4gbm9wCi0wKzA0MTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzA0MTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0MTggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0MTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQxYyA8W14+XSo+IG5vcAotMCswNDIwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswNDI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDI4OiBSX01JUFNfR09UMTYJLmJzcwotMCswNDJjIDxbXj5dKj4gbm9wCi0wKzA0MzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKjQzMDogUl9NSVBTX0xPMTYJLmJzcwotMCswNDM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDM4OiBSX01JUFNfR09UMTYJLmJzcwotMCswNDNjIDxbXj5dKj4gbm9wCi0wKzA0NDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMxNzY4Ci1bIAldKjQ0MDogUl9NSVBTX0xPMTYJLmJzcwotMCswNDQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDQ4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDQ0YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNDUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNDUwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswNDU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNDU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDVjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDVjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ2MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNDY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDQ2OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDQ2YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ3MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQ3MDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ3NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNDc4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDQ3YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDQ4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ4NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQ4NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ4OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNDhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDQ5MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDQ5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQ5ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDljIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0YTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswNGE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNGE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNGFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNGFjOiBSX01JUFNfR09UMTYJLmJzcwotMCswNGIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0YjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSo0YjQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDRiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRjMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjRjMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDRjNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNGM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qNGM4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA0Y2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0ZDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0ZDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0ZDQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswNGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA0ZGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKjRkYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDRlMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRlNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRlOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjRlODogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0ZWMgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDRmMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDRmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjRmYzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUwMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNTA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswNTA4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNTBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTEwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNTE0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA1MTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzA1MWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1MjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1MjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo1MjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDUyOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNTJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswNTMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNTM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTM4OiBSX01JUFNfR09UMTYJLmJzcwotMCswNTNjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA1NDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKjU0MDogUl9NSVBTX0xPMTYJLmJzcwotMCswNTQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNTQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTRjOiBSX01JUFNfR09UMTYJLmJzcwotMCswNTUwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA1NTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCi1bIAldKjU1NDogUl9NSVBTX0xPMTYJLmJzcwotMCswNTU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNTVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS14Z290LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXhnb3QuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1Y2QyNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLXhnb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGEteGdvdAotI2FzOiAtbWlwczEgLUtQSUMgLXhnb3QgLS1kZWZzeW0gS1BJQz0xCi0jc291cmNlOiBsYS5zCi0KLSMgVGVzdCB0aGUgbGEgbWFjcm8gd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMDQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAwOCA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMGMgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDEwIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwMWMgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDJjIDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQ4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjUwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA1NCA8W14+XSo+IG5vcAotMCswMDU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNTg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwNWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNWM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNjQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNzA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNzQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo3YzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo4MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qODg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjhjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMDkwIDxbXj5dKj4gbm9wCi0wKzAwOTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo5NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOTg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwOWMgPFtePl0qPiBub3AKLTArMDBhMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKmEwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSphNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwYTggPFtePl0qPiBub3AKLTArMDBhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKmFjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGIwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmIwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmI4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IG5vcAotMCswMGMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDBjNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpjNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmNjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQwIDxbXj5dKj4gbm9wCi0wKzAwZDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmQ4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGUwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qZTA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBub3AKLTArMDBlOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAwZWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZWM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBmNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmY0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPFtePl0qPiBub3AKLTArMDBmYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzAxMDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMDA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMDQgPFtePl0qPiBub3AKLTArMDEwOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi1bIAldKjEwODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTBjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTBjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTEwIDxbXj5dKj4gbm9wCi0wKzAxMTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMQotWyAJXSoxMTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjExODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxMWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDEyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qMTIwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTI4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEyODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxMzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxMzA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxMzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAxM2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxNDAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTQwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTQ4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxNTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAxNTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxNTggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTU4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTYwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTY0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxNjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzAxNmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAxNzAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTcwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxNzg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMTgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotMCswMTg0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTg4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxOTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci1bIAldKjE5MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMTk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTk4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTljIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAxYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMxNzY4Ci1bIAldKjFhMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMWE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWE4OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDFhYyA8W14+XSo+IG5vcAotMCswMWIwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSoxYjA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxYjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWI0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFiYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYzAgPFtePl0qPiBub3AKLTArMDFjNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDFjOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxYzg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxY2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxZDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxZDA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDQgPFtePl0qPiBub3AKLTArMDFkOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDFkYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZGM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxZTQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTggPFtePl0qPiBub3AKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDFmMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZjA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFmOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjFmODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWZjIDxbXj5dKj4gbm9wCi0wKzAyMDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci0wKzAyMDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMDQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyMDggPFtePl0qPiBub3AKLTArMDIwYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLVsgCV0qMjBjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyMTQgPFtePl0qPiBub3AKLTArMDIxOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzE3NjgKLVsgCV0qMjE4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyMWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyMWM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAyMjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMjQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyMjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyMmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjJjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDIzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjIzNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDIzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzAyNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyNDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjQ0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjRjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAyNTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswMjU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI1YzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI2NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI2NDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI2OCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMjZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDI3MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDI3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjI3YzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjgwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAyODQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswMjg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMjhjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMjhjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjkwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAyOTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyOTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI5OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDI5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjI5YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJhMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMmE0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEwMDAKLVsgCV0qMmE0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyYTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzAyYWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyYWM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMmIwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAyYjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKjJiNDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDJiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDJiYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMmM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMmM0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMmNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswMmQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMmQ0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJkNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDJkYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjJkYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMmU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswMmU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMmVjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJlYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJmMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDJmNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjJmNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJmOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMmZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswMzAwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswMzA0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjMwNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzA4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMzBjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMzBjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDMxNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLTArMDMxOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDMxYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjMxYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDMyMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMzI0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotWyAJXSozMjQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDMyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDMyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjMyYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDMzMCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswMzM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMjEzMQotWyAJXSozMzQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDMzOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDMzYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjMzYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAzNDAgPFtePl0qPiBub3AKLTArMDM0NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjM0NDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDM0OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM0YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSozNGM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMzU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMzU0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1OCA8W14+XSo+IG5vcAotMCswMzVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzYwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjM2MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDM2OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjM2ODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2YyA8W14+XSo+IG5vcAotMCswMzcwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjM3NDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDM3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjM3YzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM4MCA8W14+XSo+IG5vcAotMCswMzg0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzg4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjM4ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzhjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMzkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMzkwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzOTQgPFtePl0qPiBub3AKLTArMDM5OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM5YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjM5YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDNhMCA8W14+XSo+IG5vcAotMCswM2E0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qM2E0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzYTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzYWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSozYWM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAzYjAgPFtePl0qPiBub3AKLTArMDNiNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjNiNDogUl9NSVBTX0xPMTYJLmJzcwotMCswM2I4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2JjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qM2JjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDNjMCA8W14+XSo+IG5vcAotMCswM2M0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qM2M0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswM2M4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2NjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjNjYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAzZDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSozZDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2Q4IDxbXj5dKj4gbm9wCi0wKzAzZGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMQotMCswM2UwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswM2U0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjNlNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNlOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDNlYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjNlYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNmMCA8W14+XSo+IG5vcAotMCswM2Y0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDNmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDNmYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSozZmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA0MDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo0MDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MDggPFtePl0qPiBub3AKLTArMDQwYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxCi0wKzA0MTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0MTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNDE0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA0MWMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo0MWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQyMCA8W14+XSo+IG5vcAotMCswNDI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLTArMDQyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQyYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjQyYzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDQzMCA8W14+XSo+IG5vcAotMCswNDM0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEKLVsgCV0qNDM0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA0MzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0M2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0M2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA0NDAgPFtePl0qPiBub3AKLTArMDQ0NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAxCi1bIAldKjQ0NDogUl9NSVBTX0xPMTYJLmJzcwotMCswNDQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNDRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNDRjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDQ1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNDU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0zMjc2OAotWyAJXSo0NTQ6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzA0NTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0NWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0NjAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNDYwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ2NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDQ2OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjQ2ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDQ3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDQ3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDQ3OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ3YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo0N2M6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0ODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA0ODQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo0ODQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0ODggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDQ4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDQ5MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDQ5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDQ5OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo0OTg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0OWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA0YTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo0YTA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YTQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDRhOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLTArMDRhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDRiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDRiNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo0YjQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRiOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDRiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjRiYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA0YzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTMyNzY4Ci0wKzA0YzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0Y2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0ZDAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0ZDA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA0ZDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDRkOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzI3NjgKLVsgCV0qNGQ4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzA0ZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0ZTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0ZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0ZTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA0ZTggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDRlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMzE3NjgKLVsgCV0qNGVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzA0ZjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA0ZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA0ZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo0Zjg6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswNGZjIDxbXj5dKj4gbm9wCi0wKzA1MDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsLTMyNzY4Ci1bIAldKjUwMDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDUwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDUwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1MDg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNTEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNTEwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUxNCA8W14+XSo+IG5vcAotMCswNTE4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswNTFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTIwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjUyMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUyNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDUyOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjUyODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUyYyA8W14+XSo+IG5vcAotMCswNTMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswNTM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTM4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjUzODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDUzYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDU0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKjU0MDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU0NCA8W14+XSo+IG5vcAotMCswNTQ4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotMCswNTRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNTUwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjU1MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNTU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNTU4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NWMgPFtePl0qPiBub3AKLTArMDU2MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwtMzI3NjgKLTArMDU2NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDU2OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU2ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDU2YyA8W14+XSo+IG5vcAotMCswNTcwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMjc2OAotWyAJXSo1NzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDU3NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDU3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU3ODogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDU3YyA8W14+XSo+IG5vcAotMCswNTgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLC0zMTc2OAotWyAJXSo1ODA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDU4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDU4OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU4ODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzA1OGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU5MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjU5MDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDU5NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDU5OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDU5YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1OWM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNWEwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNWE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNWE0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDVhOCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNWFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLTArMDViMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDViNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDViOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1Yjg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1YmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA1YzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo1YzA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1YzQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDVjOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzA1Y2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA1ZDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA1ZDQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNWQ0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNWRjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNWRjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWUwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1ZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotMCswNWU4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNWVjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNWYwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjVmMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNWY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNWY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNWY4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1ZmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDYwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi0wKzA2MDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2MDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2MGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2MGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzA2MTAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDYxNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjYxNDogUl9NSVBTX0xPMTYJLmJzcwotMCswNjE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNjFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNjIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjIwOiBSX01JUFNfR09UMTYJLmJzcwotMCswNjI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA2MjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSo2Mjg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDYyYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYXQKLTArMDYzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDYzNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjYzNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzA2MzggPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDYzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwtMjMxMzEKLVsgCV0qNjNjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswNjQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNjQ0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNjQ4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY0ODogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA2NGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA2NTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo2NTA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNjU0IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA2NTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzA2NWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2NjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2NjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjY0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNjY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNjZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNjZjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA2NzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzA2NzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2N2MgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2ODAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjgwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNjg0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswNjg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNjg4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNjhjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA2OTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi0wKzA2OTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGF0Ci0wKzA2OTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzA2OWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjljOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA2YTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzA2YTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo2YTQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDZhOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotMCswNmFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LC0yMzEzMQotMCswNmIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNmI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNmI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNmI4OiBSX01JUFNfR09UMTYJLmJzcwotMCswNmJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA2YzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIzMTMxCi1bIAldKjZjMDogUl9NSVBTX0xPMTYJLmJzcwotMCswNmM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNmM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNmNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNmNjOiBSX01JUFNfR09UMTYJLmJzcwotMCswNmQwIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzA2ZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsLTIyMTMxCi1bIAldKjZkNDogUl9NSVBTX0xPMTYJLmJzcwotMCswNmQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhdAotMCswNmRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWVhYTFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEuZAorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGEKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgbGEgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxpCVwkYTAsMAotMCswMDA0IDxbXj5dKj4gbGkJXCRhMCwxCi0wKzAwMDggPFtePl0qPiBsaQlcJGEwLDB4ODAwMAotMCswMDBjIDxbXj5dKj4gbGkJXCRhMCwtMzI3NjgKLTArMDAxMCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMTggPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4YTVhNQotMCswMDFjIDxbXj5dKj4gbGkJXCRhMCwwCi0wKzAwMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMjQgPFtePl0qPiBsaQlcJGEwLDEKLTArMDAyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAyYyA8W14+XSo+IGxpCVwkYTAsMHg4MDAwCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsaQlcJGEwLC0zMjc2OAotMCswMDM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNDQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0OCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhhNWE1Ci0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwNTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLDAKLVsgCV0qNjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjZjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDcwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDc0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qNzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwNzggPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSo3ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwN2MgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDg0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwODggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSo4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDhjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDkwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDljIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSphNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSphODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSphYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGNjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMGRjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMGUwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBlNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBlOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSplODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDExNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjExNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTM4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTU0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE1OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNmMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTcwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTc0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTc4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTdjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTgwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE4NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxOTQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoxOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCwwCi1bIAldKjFhMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYTggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsMAotWyAJXSoxYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWMwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWM4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qMWM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMWQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFkOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjFlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWU4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGdwLFstMC05XSsKLVsgCV0qMWU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFmMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWY0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMWY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFmYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRncCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIwNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMTAgPFtePl0qPiBhZGRpdQlcJGEwLFwkZ3AsWy0wLTldKwotWyAJXSoyMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMjE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIxYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjIyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjJjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjMwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjIzNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyM2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI0OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI1MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI1NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI2MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjI2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjZjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyNzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjc4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyODQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjg0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4OCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjI4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyOTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjI5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyOWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJhYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJiNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmI4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJjMCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyYzQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSoyYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJkOCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmUwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmU0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJlOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjJlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZjAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSoyZjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMDggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzBjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDMxMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMxNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMxNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMTggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzFjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzIwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMjQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMyYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzM4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMzYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCxbLTAtOV0rCi1bIAldKjMzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNDQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDggPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNTAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzNTQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsWy0wLTldKwotWyAJXSozNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzNTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzYwIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLFstMC05XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDM2NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4YzgxMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xhLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIGxhIG1hY3JvLgotCQotCS5kYXRhCi1kYXRhX2xhYmVsOgotCS5leHRlcm4gYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwsMTAwMAotCS5leHRlcm4gc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxCi0JLmNvbW0gYmlnX2V4dGVybmFsX2NvbW1vbiwxMDAwCi0JLmNvbW0gc21hbGxfZXh0ZXJuYWxfY29tbW9uLDEKLQkubGNvbW0gYmlnX2xvY2FsX2NvbW1vbiwxMDAwCi0JLmxjb21tIHNtYWxsX2xvY2FsX2NvbW1vbiwxCi0JCi0JLnRleHQKLQlsYQkkNCwwCi0JbGEJJDQsMQotCWxhCSQ0LDB4ODAwMAotCWxhCSQ0LC0weDgwMDAKLQlsYQkkNCwweDEwMDAwCi0JbGEJJDQsMHgxYTVhNQotCWxhCSQ0LDAoJDUpCi0JbGEJJDQsMSgkNSkKLQlsYQkkNCwweDgwMDAoJDUpCi0JbGEJJDQsLTB4ODAwMCgkNSkKLQlsYQkkNCwweDEwMDAwKCQ1KQotCWxhCSQ0LDB4MWE1YTUoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbAotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24KLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JbGEJJDQsZGF0YV9sYWJlbCsxCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQlsYQkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JbGEJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMAotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxhCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGEJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsYQkkNCxkYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24oJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbigkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24oJDUpCi0JbGEJJDQsZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMSgkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEoJDUpCi0JbGEJJDQsZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCWxhCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYQkkNCxkYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0JbGEJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYQkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYQkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDEwMDAwKCQ1KQotCWxhCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxhCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlsYQkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGEJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGEJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCWxhCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0JLmlmbmRlZglLUElDCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCS5lbmRpZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1lbXBpYy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI0YTMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGItZW1waWMKLSNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljCi0jc291cmNlOiBsYi1waWMucwotCi0jIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qNTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA1OCA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCi1bIAldKjU4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNWMgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo1YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjAgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjQgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA2OCA8W14+XSo+IGxiCVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qNjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDZjIDxbXj5dKj4gbGIJXCRhMCwtMTUzODRcKFwkZ3BcKQotWyAJXSo2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwNzAgPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRncFwpCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwNzQgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo3NDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qNzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDdjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qN2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGdwXCkKLVsgCV0qODA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBsYglcJGEwLC0xNjM4M1woXCRncFwpCi1bIAldKjg0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4OCA8W14+XSo+IGxiCVwkYTAsLTE1MzgzXChcJGdwXCkKLVsgCV0qODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDhjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMDkwIDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkYTBcKQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMDk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMDk4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5YyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBhMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKmEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBhOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBiMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGI4IDxbXj5dKj4gbGIJXCRhMCwtMTYzODRcKFwkYTBcKQotWyAJXSpiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwYzAgPFtePl0qPiBsYglcJGEwLC0xNTM4NFwoXCRhMFwpCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBjOCA8W14+XSo+IGxiCVwkYTAsLTE2MzgzXChcJGEwXCkKLVsgCV0qYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDBjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBkMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi1bIAldKmQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZDggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSpkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSplMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAwZTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGExLFwkZ3AKLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsLTE2MzgzXChcJGEwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGY0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMGY4IDxbXj5dKj4gbGIJXCRhMCwtMTUzODNcKFwkYTBcKQotWyAJXSpmODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZmMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItcGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNmZGY5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGItcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGIgbWFjcm8gd2l0aCBQSUMgY29kZS4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGIJJDQsMAotCWxiCSQ0LDEKLQlsYgkkNCwweDgwMDAKLQlsYgkkNCwtMHg4MDAwCi0JbGIJJDQsMHgxMDAwMAotCWxiCSQ0LDB4MWE1YTUKLQlsYgkkNCwwKCQ1KQotCWxiCSQ0LDEoJDUpCi0JbGIJJDQsMHg4MDAwKCQ1KQotCWxiCSQ0LC0weDgwMDAoJDUpCi0JbGIJJDQsMHgxMDAwMCgkNSkKLQlsYgkkNCwweDFhNWE1KCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxiCSQ0LGRhdGFfbGFiZWwrMQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGIJJDQsZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXN2cjRwaWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4ODRkNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXN2cjRwaWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGItc3ZyNHBpYwotI2FzOiAtbWlwczEgLUtQSUMKLSNzb3VyY2U6IGxiLXBpYy5zCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8gd2l0aCAtS1BJQy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbGIJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMGMgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMTAgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDAxYyA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDIwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGExXCkKLTArMDAyOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMVwpCi0wKzAwMmMgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAzMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAzOCA8W14+XSo+IGxiCVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDAzYyA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA0OCA8W14+XSo+IGx1aQlcJGEwLDB4MgotMCswMDRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDxbXj5dKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qNTQ6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMDU4IDxbXj5dKj4gbm9wCi0wKzAwNWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo1YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDA2MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo2NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBub3AKLTArMDA2YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNzAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSo3MDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IG5vcAotMCswMDc4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjdjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gbm9wCi0wKzAwODQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qODg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4YyA8W14+XSo+IG5vcAotMCswMDkwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA5NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjk0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMDk4IDxbXj5dKj4gbm9wCi0wKzAwOWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSo5YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMGEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmE0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMGE4IDxbXj5dKj4gbm9wCi0wKzAwYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSphYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMGIwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmI0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDBiOCA8W14+XSo+IG5vcAotMCswMGJjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qYmM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwYzAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYzQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gbm9wCi0wKzAwY2MgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qZDA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDQgPFtePl0qPiBub3AKLTArMDBkOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpkYzogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlMCA8W14+XSo+IG5vcAotMCswMGU0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBlOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmU4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBub3AKLTArMDBmMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSpmNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDBmOCA8W14+XSo+IG5vcAotMCswMGZjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qZmM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEwMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMDQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxMDggPFtePl0qPiBub3AKLTArMDEwYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKjEwYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTEwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDExNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjExNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxMTggPFtePl0qPiBub3AKLTArMDExYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjExYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEyMCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDEyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxMjg6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbm9wCi0wKzAxMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxMzQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTM4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gbm9wCi0wKzAxNDAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNDQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTQ4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbm9wCi0wKzAxNTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxNTQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTU4OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBub3AKLTArMDE2MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE2NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNjggPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNjg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNmMgPFtePl0qPiBub3AKLTArMDE3MCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE3MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMTc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTc4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE3YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE3YzogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE4MCA8W14+XSo+IG5vcAotMCswMTg0IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLVsgCV0qMTg0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxODggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxOGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTkwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTkwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDE5NCA8W14+XSo+IG5vcAotMCswMTk4IDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMTk4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMTljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWEwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFhNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFhNDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTggPFtePl0qPiBub3AKLTArMDFhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxYjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjggPFtePl0qPiBub3AKLTArMDFiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFjMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxYzQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxYzQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzggPFtePl0qPiBub3AKLTArMDFjYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFkMCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZDQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkOCA8W14+XSo+IG5vcAotMCswMWRjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWUwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFlNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjFlNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDFlOCA8W14+XSo+IG5vcAotMCswMWVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qMWVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxZjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZjQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMWY4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWY4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWZjIDxbXj5dKj4gbm9wCi0wKzAyMDAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoyMDA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDIwNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIwOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMGMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC1pbG9ja3MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4YmQyNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xiLXhnb3QtaWxvY2tzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLXhnb3QtaWxvY2tzCi0jYXM6IC1taXBzMSAtS1BJQyAteGdvdCAtbWNwdT1yMzkwMAotI3NvdXJjZTogbGItcGljLnMKLQotIyBUZXN0IHRoZSBsYiBtYWNybyB3aXRoIC1LUElDIC14Z290LgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDwuKj4gbGIJXCRhMCwwXChcJHplcm9cKQotMCswMDA0IDwuKj4gbGIJXCRhMCwxXChcJHplcm9cKQotMCswMDA4IDwuKj4gbHVpCVwkYTAsMHgxCi0wKzAwMGMgPC4qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMTAgPC4qPiBsYglcJGEwLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDAxNCA8Lio+IGx1aQlcJGEwLDB4MQotMCswMDE4IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDAxYyA8Lio+IGx1aQlcJGEwLDB4MgotMCswMDIwIDwuKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDI0IDwuKj4gbGIJXCRhMCwwXChcJGExXCkKLTArMDAyOCA8Lio+IGxiCVwkYTAsMVwoXCRhMVwpCi0wKzAwMmMgPC4qPiBsdWkJXCRhMCwweDEKLTArMDAzMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDAzNCA8Lio+IGxiCVwkYTAsLTMyNzY4XChcJGEwXCkKLTArMDAzOCA8Lio+IGxiCVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDAzYyA8Lio+IGx1aQlcJGEwLDB4MQotMCswMDQwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA0OCA8Lio+IGx1aQlcJGEwLDB4MgotMCswMDRjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMDUwIDwuKj4gbGIJXCRhMCwtMjMxMzFcKFwkYTBcKQotMCswMDU0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCTU0OiBSX01JUFNfR09UMTYJXC5kYXRhCi0wKzAwNTggPC4qPiBub3AKLTArMDA1YyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQk1YzogUl9NSVBTX0xPMTYJXC5kYXRhCi0wKzAwNjAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDY0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQk2NDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwNmMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJNmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDcwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDA3NCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJNzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNzggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwN2MgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJN2M6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwODAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDg0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQk4NDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDA4YyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQk4YzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5MCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwOTQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTk0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwOWMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJOWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhMCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwYTQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJYTQ6IFJfTUlQU19HT1QxNglcLmJzcwotMCswMGE4IDwuKj4gbm9wCi0wKzAwYWMgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJYWM6IFJfTUlQU19MTzE2CVwuYnNzCi0wKzAwYjAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGI0IDwuKj4gbHcJXCRhMCwwXChcJGdwXCkKLQkJCWI0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDBiOCA8Lio+IG5vcAotMCswMGJjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLQkJCWJjOiBSX01JUFNfTE8xNglcLmJzcwotMCswMGMwIDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBjNCA8Lio+IGx3CVwkYTAsMFwoXCRncFwpCi0JCQljNDogUl9NSVBTX0dPVDE2CVwuZGF0YQotMCswMGM4IDwuKj4gbm9wCi0wKzAwY2MgPC4qPiBhZGRpdQlcJGEwLFwkYTAsMAotCQkJY2M6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMGQwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBkNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJZDQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGRjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCWRjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAwZTQgPC4qPiBsdWkJXCRhMCwweDAKLQkJCWU0OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU4IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGVjIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCWVjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDBmNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJZjQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwZmMgPC4qPiBsdwlcJGEwLDBcKFwkYTBcKQotCQkJZmM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTA0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxMDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDEwYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxMGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDExMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMTQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMTE0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDExOCA8Lio+IG5vcAotMCswMTFjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTExYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDEyMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMjQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMTI0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDEyOCA8Lio+IG5vcAotMCswMTJjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLQkJCTEyYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDEzMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMzQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMTM0OiBSX01JUFNfR09UMTYJXC5kYXRhCi0wKzAxMzggPC4qPiBub3AKLTArMDEzYyA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxM2M6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMTQwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTQ0IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE0OCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTQ4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0YyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE1MCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxNTA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTU0IDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTU4IDwuKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE1YyA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMTVjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTYwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTY0IDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTE2NDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE2YyA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxNzAgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTE3MDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3NCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE3OCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxNzg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxN2MgPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxODAgPC4qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMTg0IDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkxODQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE4OCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDE4YyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxOGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE5MCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDE5NCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxOTggPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMTk4OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDE5YyA8Lio+IG5vcAotMCswMWEwIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTFhMDogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDFhNCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFhOCA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxYWMgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMWFjOiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDFiMCA8Lio+IG5vcAotMCswMWI0IDwuKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLQkJCTFiNDogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDFiOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiYyA8Lio+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxYzAgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMWMwOiBSX01JUFNfR09UMTYJXC5kYXRhCi0wKzAxYzQgPC4qPiBub3AKLTArMDFjOCA8Lio+IGFkZGl1CVwkYTAsXCRhMCwwCi0JCQkxYzg6IFJfTUlQU19MTzE2CVwuZGF0YQotMCswMWNjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWQwIDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFkNCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMWQ0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkOCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDFkYyA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkxZGM6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWUwIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWU0IDwuKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDFlOCA8Lio+IGx1aQlcJGEwLDB4MAotCQkJMWU4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWVjIDwuKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWYwIDwuKj4gbHcJXCRhMCwwXChcJGEwXCkKLQkJCTFmMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFmNCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFmOCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxZmMgPC4qPiBsdWkJXCRhMCwweDAKLQkJCTFmYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDIwNCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkyMDQ6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDggPC4qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMGMgPC4qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjEwIDwuKj4gbHVpCVwkYTAsMHgwCi0JCQkyMTA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIxNCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDIxOCA8Lio+IGx3CVwkYTAsMFwoXCRhMFwpCi0JCQkyMTg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIxYyA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIyMCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMjQgPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMjI0OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDIyOCA8Lio+IG5vcAotMCswMjJjIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDAKLQkJCTIyYzogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDIzMCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIzNCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyMzggPC4qPiBsdwlcJGEwLDBcKFwkZ3BcKQotCQkJMjM4OiBSX01JUFNfR09UMTYJXC5ic3MKLTArMDIzYyA8Lio+IG5vcAotMCswMjQwIDwuKj4gYWRkaXUJXCRhMCxcJGEwLDEwMDAKLQkJCTI0MDogUl9NSVBTX0xPMTYJXC5ic3MKLTArMDI0NCA8Lio+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI0OCA8Lio+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyNGMgPC4qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOGM2N2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxiLXhnb3QKLSNhczogLW1pcHMxIC1LUElDIC14Z290IC1tY3B1PXIzMDAwCi0jc291cmNlOiBsYi1waWMucwotCi0jIFRlc3QgdGhlIGxiIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjU0OiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA1OCA8W14+XSo+IG5vcAotMCswMDVjIDxbXj5dKj4gYWRkaXUJXCRhMCxcJGEwLDAKLVsgCV0qNWM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwNjAgPFtePl0qPiBub3AKLTArMDA2NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qNjg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDZjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDcwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qNzA6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gbm9wCi0wKzAwNzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMDdjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjdjOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDgwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMDg0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qODQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwODggPFtePl0qPiBub3AKLTArMDA4YyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qOTA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAwOTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSo5ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5YyA8W14+XSo+IG5vcAotMCswMGEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBhNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSphNDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGE4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMGFjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qYWM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IG5vcAotMCswMGI0IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDBiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmI4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMGJjIDxbXj5dKj4gbm9wCi0wKzAwYzAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMAotWyAJXSpjMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMGNjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qY2M6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwZDAgPFtePl0qPiBub3AKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwxMDAwCi1bIAldKmQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwZDggPFtePl0qPiBub3AKLTArMDBkYyA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSplMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwZTQgPFtePl0qPiBub3AKLTArMDBlOCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKmU4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGVjIDxbXj5dKj4gbm9wCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMGY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmY0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkZ3AKLTArMDBmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMFwpCi1bIAldKmZjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEwMCA8W14+XSo+IG5vcAotMCswMTA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDEwOCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMDg6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxMTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxMTA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMTQgPFtePl0qPiBub3AKLTArMDExOCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxMWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTFjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTIwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTI0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTI4IDxbXj5dKj4gbm9wCi0wKzAxMmMgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTMwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjEzMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTM0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTM4OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBub3AKLTArMDE0MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAxNDQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxNDQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNDggPFtePl0qPiBub3AKLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE0YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMTUwIDxbXj5dKj4gbm9wCi0wKzAxNTQgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMTU4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTVjIDxbXj5dKj4gbm9wCi0wKzAxNjAgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoxNjA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE2NCA8W14+XSo+IG5vcAotMCswMTY4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDE2YyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjE2YzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxNzAgPFtePl0qPiBub3AKLTArMDE3NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjE3NDogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDE3OCA8W14+XSo+IG5vcAotMCswMTdjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTgwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE4NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxODQ6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMThjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMThjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5MCA8W14+XSo+IG5vcAotMCswMTk0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTk4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDE5YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxOWM6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAxYTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoxYTQ6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTggPFtePl0qPiBub3AKLTArMDFhYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFiMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxYjQgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMWI0OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWJjOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbm9wCi0wKzAxYzQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWNjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFjYzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMWQ0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWQ0OiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDggPFtePl0qPiBub3AKLTArMDFkYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFlMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAxZTQgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoxZTQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxZTggPFtePl0qPiBub3AKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjFlYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWYwIDxbXj5dKj4gbm9wCi0wKzAxZjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZjggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotMCswMWZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMWZjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMjAwIDxbXj5dKj4gbm9wCi0wKzAyMDQgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoyMDQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDIwOCA8W14+XSo+IG5vcAotMCswMjBjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjIxNDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAyMTggPFtePl0qPiBub3AKLTArMDIxYyA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjIxYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDIyMCA8W14+XSo+IG5vcAotMCswMjI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDIyYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyMmM6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjM0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzOCA8W14+XSo+IG5vcAotMCswMjNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjQwIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDI0NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNDQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNDggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGdwCi0wKzAyNGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYTBcKQotWyAJXSoyNGM6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNTAgPFtePl0qPiBub3AKLTArMDI1NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI1OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyNWMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMjVjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjYwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjY0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjY0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjY4IDxbXj5dKj4gbm9wCi0wKzAyNmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNzAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMjc0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI3NDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjc4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRncAotMCswMjdjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGEwXCkKLVsgCV0qMjdjOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyODAgPFtePl0qPiBub3AKLTArMDI4NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI4OCA8W14+XSo+IGxiCVwkYTAsMVwoXCRhMFwpCi0wKzAyOGMgPFtePl0qPiBsdwlcJGEwLDBcKFwkZ3BcKQotWyAJXSoyOGM6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyOTAgPFtePl0qPiBub3AKLTArMDI5NCA8W14+XSo+IGFkZGl1CVwkYTAsXCRhMCwwCi1bIAldKjI5NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjk4IDxbXj5dKj4gbm9wCi0wKzAyOWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYTAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotMCswMmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qMmE0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMmE4IDxbXj5dKj4gbm9wCi0wKzAyYWMgPFtePl0qPiBhZGRpdQlcJGEwLFwkYTAsMTAwMAotWyAJXSoyYWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDJiMCA8W14+XSo+IG5vcAotMCswMmI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmI4IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLTArMDJiYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDVjNGM0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIuZAorKysgL2Rldi9udWxsCkBAIC0xLDM5NSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGIKLSNhczogLW1pcHMxCi0KLSMgVGVzdCB0aGUgbGIgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxiCVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDBjIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkYTBcKQotMCswMDEwIDxbXj5dKj4gbGIJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxOCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwMWMgPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDAyMCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDAyNCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMVwpCi0wKzAwMjggPFtePl0qPiBsYglcJGEwLDFcKFwkYTFcKQotMCswMDJjIDxbXj5dKj4gbHVpCVwkYTAsMHgxCi0wKzAwMzAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAwMzQgPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMFwpCi0wKzAwMzggPFtePl0qPiBsYglcJGEwLC0zMjc2OFwoXCRhMVwpCi0wKzAwM2MgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDA0MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA0NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi0wKzAwNDggPFtePl0qPiBsdWkJXCRhMCwweDIKLTArMDA0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDA1MCA8W14+XSo+IGxiCVwkYTAsLTIzMTMxXChcJGEwXCkKLTArMDA1NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDYwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGxiCVwkYTAsMFwoXCRncFwpCi1bIAldKjY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSo2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNzAgPFtePl0qPiBsYglcJGEwLDBcKFwkZ3BcKQotWyAJXSo3MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA3NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA3OCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwN2MgPFtePl0qPiBsYglcJGEwLC0xNjM4NFwoXCRncFwpCi1bIAldKjdjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA4MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODQgPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjg0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA4OCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDhjIDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5MCA8W14+XSo+IGxiCVwkYTAsMVwoXCRncFwpCi1bIAldKjkwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSo5NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTggPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOWMgPFtePl0qPiBsYglcJGEwLDFcKFwkZ3BcKQotWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBhMCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSphMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhNCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkZ3BcKQotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSphYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpiMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKmNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSpkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGRjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMGUwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMGU0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKmU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBlOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBlYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSpmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSpmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMGMgPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMTBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTEwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjExNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTFjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMTIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjEzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMzggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTNjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTQ4IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTUwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE1NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNTggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTVjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjE2NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNjggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTZjIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjE3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxN2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxODAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxODQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoxODQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTg4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMTg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMTk0IDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoxOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTk4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWEwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAxYTggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxYjQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWJjIDxbXj5dKj4gbGIJXCRhMCwwXChcJGEwXCkKLVsgCV0qMWJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDFjOCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWNjIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMWQwIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMWQwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDFkNCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWQ4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWRjIDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWUwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMWU4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMSxcJGdwCi0wKzAxZjAgPFtePl0qPiBsYglcJGEwLDFcKFwkYTBcKQotWyAJXSoxZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWY0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjFmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAxZmMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjAwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMjA0IDxbXj5dKj4gbGIJXCRhMCwxXChcJGEwXCkKLVsgCV0qMjA0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjA4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDIxMCA8W14+XSo+IGxiCVwkYTAsWzAtOV0rXChcJGEwXCkKLVsgCV0qMjEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjE0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTEsXCRncAotMCswMjE4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDIxYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMjQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjI4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyMzAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzNCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyM2MgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI0OCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNGMgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNTQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyNjAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjZjIDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI3MCA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMjc4IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMjc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3YyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDI4NCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjI4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg4IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyOTAgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjk0IDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjI5NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyOWMgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gbHVpCVwkYTAsMHgwCi1bIAldKjJhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJhOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGEwLDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyYjQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhMCwweDAKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJjMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmM4IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMmNjIDxbXj5dKj4gbGIJXCRhMCxbMC05XStcKFwkYTBcKQotWyAJXSoyY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMmQwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZDggPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJkYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjJkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZTQgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMmU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJlYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDJmMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhMFwpCi1bIAldKjJmMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSoyZjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZjggPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAyZmMgPFtePl0qPiBsYglcJGEwLDBcKFwkYTBcKQotWyAJXSoyZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDAgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMDggPFtePl0qPiBsYglcJGEwLFswLTldK1woXCRhMFwpCi1bIAldKjMwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMwYyA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjMwYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMTAgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzMTQgPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzE4IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMxYyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMyMCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjMyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMjQgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMyOCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMyYyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjMyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzMwIDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qMzMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzNCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDMzOCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjMzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzM2MgPFtePl0qPiBsdWkJXCRhMCxbLTAtOXhdKwotWyAJXSozM2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzQwIDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswMzQ0IDxbXj5dKj4gbGIJXCRhMCxbLTAtOV0rXChcJGEwXCkKLVsgCV0qMzQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM0OCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM0YyA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM1MCA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjM1MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM1NCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM1NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDM1OCA8W14+XSo+IGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDM1YyA8W14+XSo+IGxiCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjM1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM2MCA8W14+XSo+IGx1aQlcJGEwLFstMC05eF0rCi1bIAldKjM2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNjQgPFtePl0qPiBhZGR1CVwkYTAsXCRhMCxcJGExCi0wKzAzNjggPFtePl0qPiBsYglcJGEwLFstMC05XStcKFwkYTBcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzZjIDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3MCA8W14+XSo+IGxoCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM3NCA8W14+XSo+IGxodQlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzggPFtePl0qPiBsdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAzN2MgPFtePl0qPiBsd2wJXCRhMCwwXChcJHplcm9cKQotMCswMzgwIDxbXj5dKj4gbHdyCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM4NCA8W14+XSo+IGx3YzAJXCQ0LDBcKFwkemVyb1wpCi0wKzAzODggPFtePl0qPiBsd2MxCVwkZjQsMFwoXCR6ZXJvXCkKLTArMDM4YyA8W14+XSo+IGx3YzIJXCQ0LDBcKFwkemVyb1wpCi0wKzAzOTAgPFtePl0qPiBsd2MzCVwkNCwwXChcJHplcm9cKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sYi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNjY2FmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGIucworKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGIgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxiCSQ0LDAKLQlsYgkkNCwxCi0JbGIJJDQsMHg4MDAwCi0JbGIJJDQsLTB4ODAwMAotCWxiCSQ0LDB4MTAwMDAKLQlsYgkkNCwweDFhNWE1Ci0JbGIJJDQsMCgkNSkKLQlsYgkkNCwxKCQ1KQotCWxiCSQ0LDB4ODAwMCgkNSkKLQlsYgkkNCwtMHg4MDAwKCQ1KQotCWxiCSQ0LDB4MTAwMDAoJDUpCi0JbGIJJDQsMHgxYTVhNSgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsYgkkNCxkYXRhX2xhYmVsKzEKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxiCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsYgkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JbGIJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGIJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsYgkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCWxiCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQlsYgkkNCxkYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGIJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxiCSQ0LGRhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxiCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGIJJDQsZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGIJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGIJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0KLSMgU2V2ZXJhbCBtYWNyb3MgYXJlIGhhbmRsZWQgbGlrZSBsYi4gIFNhbml0eSBjaGVjayB0aGVtLgotCWxidQkkNCwwCi0JbGgJJDQsMAotCWxodQkkNCwwCi0JbHcJJDQsMAotCWx3bAkkNCwwCi0JbHdyCSQ0LDAKLQlsd2MwCSQ0LDAKLQlsd2MxCSQ0LDAKLQlsd2MyCSQ0LDAKLQlsd2MzCSQ0LDAKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5NjFmNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWVtcGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxkLWVtcGljCi0jYXM6IC1taXBzMSAtbWVtYmVkZGVkLXBpYyAtLWRlZnN5bSBFTVBJQz0xCi0jc291cmNlOiBsZC1waWMucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA5NCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGdwXCkKLVsgCV0qOTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSo5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGFjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGIwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjQgPFtePl0qPiBsdwlcJGExLDRcKFwkZ3BcKQotWyAJXSpiNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBiOCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGdwXCkKLVsgCV0qYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGJjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkZ3BcKQotWyAJXSpiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzAgPFtePl0qPiBsdwlcJGEwLC0xNTM4NFwoXCRncFwpCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjNCA8W14+XSo+IGx3CVwkYTEsLTE1MzgwXChcJGdwXCkKLVsgCV0qYzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGM4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSpjODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMGNjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSpjYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZGMgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSplMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSplNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTggPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSplODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDBlYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGYwIDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRncFwpCi1bIAldKmY0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsLTE1MzgzXChcJGdwXCkKLVsgCV0qZjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSwtMTUzNzlcKFwkZ3BcKQotWyAJXSpmYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMDAgPFtePl0qPiBub3AKLTArMDEwNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDEwOCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMTA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAxMGMgPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRhdFwpCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTEwIDxbXj5dKj4gbm9wCi0wKzAxMTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDExYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTIwIDxbXj5dKj4gbm9wCi0wKzAxMjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMTJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IG5vcAotMCswMTM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjEzYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBub3AKLTArMDE0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE0OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjE0ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IG5vcAotMCswMTU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMTU4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkYXRcKQotWyAJXSoxNTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTVjIDxbXj5dKj4gbHcJXCRhMSwtMTYzODBcKFwkYXRcKQotWyAJXSoxNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTYwIDxbXj5dKj4gbm9wCi0wKzAxNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxNjggPFtePl0qPiBsdwlcJGEwLC0xNTM4NFwoXCRhdFwpCi1bIAldKjE2ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGExLC0xNTM4MFwoXCRhdFwpCi1bIAldKjE2YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNzAgPFtePl0qPiBub3AKLTArMDE3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLC0xNjM3OVwoXCRhdFwpCi1bIAldKjE3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2RhdGEuKgotMCswMTgwIDxbXj5dKj4gbm9wCi0wKzAxODQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxODggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTkwIDxbXj5dKj4gbm9wCi0wKzAxOTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxOTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxOTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IG5vcAotMCswMWE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjFhYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBub3AKLTArMDFiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFiOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFiYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjFiYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IG5vcAotMCswMWM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWM4IDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkYXRcKQotWyAJXSoxYzg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWNjIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkYXRcKQotWyAJXSoxY2M6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMWQwIDxbXj5dKj4gbm9wCi0wKzAxZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLC0xNTM4M1woXCRhdFwpCi1bIAldKjFkODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZGMgPFtePl0qPiBsdwlcJGExLC0xNTM3OVwoXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy1hZGRyMzIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODQ2ZDYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtaWxvY2tzLWFkZHIzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsNjMyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotI25hbWU6IE1JUFMgbGQtaWxvY2tzCi0jc291cmNlOiBsZC5zCi0KLSMgVGVzdCB0aGUgbGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8LnRleHQ+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKLTArMDA0OCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDA1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3YyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4MCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA4NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGEwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSpiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGM0IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSpjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzggPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRncFwpCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTBjIDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjExNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE2YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFiNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFiYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFjNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjIwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIxOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIxYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjQgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzOCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMjg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJjMCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJjNCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGF0XCkKLVsgCV0qMmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZTAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmVjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJmOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJmYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDMxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMxOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMxYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMyNCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMzI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDMyOCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGF0XCkKLVsgCV0qMzI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDMyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzM0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzM4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjMzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzQ0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzY0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzY4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM3NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzc4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzN2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzODggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzk0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzk4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2FjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2I4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2MwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2M0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2M4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2NjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2RjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2UwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2U0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2Y4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2ZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjQwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjQwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQxMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQxNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0MTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0M2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ0NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0NjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQ3MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ3NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Nzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ODQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjQ4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ODggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjQ4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0OGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0OTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjQ5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDk4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0OTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGE0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGE4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0YTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGFjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YjQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YmMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0Y2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZDQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGRjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZWMgPFtePl0qPiBsd2MxCVwkZjUsMFwoXCR6ZXJvXCkKLTArMDRmMCA8W14+XSo+IGx3YzEJXCRmNCw0XChcJHplcm9cKQotMCswNGY0IDxbXj5dKj4gbHdjMQlcJGY1LDFcKFwkemVyb1wpCi0wKzA0ZjggPFtePl0qPiBsd2MxCVwkZjQsNVwoXCR6ZXJvXCkKLTArMDRmYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTAwIDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCRhdFwpCi0wKzA1MDQgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKLTArMDUwOCA8W14+XSo+IGx3YzEJXCRmNSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1MGMgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJHplcm9cKQotMCswNTEwIDxbXj5dKj4gbHdjMQlcJGY1LDBcKFwkYTFcKQotMCswNTE0IDxbXj5dKj4gbHdjMQlcJGY0LDRcKFwkYTFcKQotMCswNTE4IDxbXj5dKj4gbHdjMQlcJGY1LDFcKFwkYTFcKQotMCswNTFjIDxbXj5dKj4gbHdjMQlcJGY0LDVcKFwkYTFcKQotMCswNTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1MjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1MjggPFtePl0qPiBsd2MxCVwkZjUsLTMyNzY4XChcJGF0XCkKLTArMDUyYyA8W14+XSo+IGx3YzEJXCRmNCwtMzI3NjRcKFwkYXRcKQotMCswNTMwIDxbXj5dKj4gbHdjMQlcJGY1LC0zMjc2OFwoXCRhMVwpCi0wKzA1MzQgPFtePl0qPiBsd2MxCVwkZjQsLTMyNzY0XChcJGExXCkKLTArMDUzOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1Mzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1M2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1NDAgPFtePl0qPiBsd2MxCVwkZjUsLTIzMTMxXChcJGF0XCkKLVsgCV0qNTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTQ0IDxbXj5dKj4gbHdjMQlcJGY0LC0yMzEyN1woXCRhdFwpCi1bIAldKjU0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0OCA8W14+XSo+IG5vcAotMCswNTRjIDxbXj5dKj4gc3djMQlcJGY1LDBcKFwkemVyb1wpCi0wKzA1NTAgPFtePl0qPiBzd2MxCVwkZjQsNFwoXCR6ZXJvXCkKLTArMDU1NCA8W14+XSo+IHN3YzEJXCRmNSwxXChcJHplcm9cKQotMCswNTU4IDxbXj5dKj4gc3djMQlcJGY0LDVcKFwkemVyb1wpCi0wKzA1NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU2MCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkYXRcKQotMCswNTY0IDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCRhdFwpCi0wKzA1NjggPFtePl0qPiBzd2MxCVwkZjUsLTMyNzY4XChcJHplcm9cKQotMCswNTZjIDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCR6ZXJvXCkKLTArMDU3MCA8W14+XSo+IHN3YzEJXCRmNSwwXChcJGExXCkKLTArMDU3NCA8W14+XSo+IHN3YzEJXCRmNCw0XChcJGExXCkKLTArMDU3OCA8W14+XSo+IHN3YzEJXCRmNSwxXChcJGExXCkKLTArMDU3YyA8W14+XSo+IHN3YzEJXCRmNCw1XChcJGExXCkKLTArMDU4MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTg4IDxbXj5dKj4gc3djMQlcJGY1LC0zMjc2OFwoXCRhdFwpCi0wKzA1OGMgPFtePl0qPiBzd2MxCVwkZjQsLTMyNzY0XChcJGF0XCkKLTArMDU5MCA8W14+XSo+IHN3YzEJXCRmNSwtMzI3NjhcKFwkYTFcKQotMCswNTk0IDxbXj5dKj4gc3djMQlcJGY0LC0zMjc2NFwoXCRhMVwpCi0wKzA1OTggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVhMCA8W14+XSo+IHN3YzEJXCRmNSwtMjMxMzFcKFwkYXRcKQotWyAJXSo1YTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE0IDxbXj5dKj4gc3djMQlcJGY0LC0yMzEyN1woXCRhdFwpCi1bIAldKjVhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1YTggPFtePl0qPiBzdwlcJGEwLDBcKFwkemVyb1wpCi0wKzA1YWMgPFtePl0qPiBzdwlcJGExLDRcKFwkemVyb1wpCi0wKzA1YjAgPFtePl0qPiBsdWkJXCRhMCwweDIKLVsgCV0qNWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNWI0IDxbXj5dKj4gYWRkdQlcJGEwLFwkYTAsXCRhMQotMCswNWI4IDxbXj5dKj4gbGQJXCRhMCwtMjMxMzFcKFwkYTBcKQotWyAJXSo1Yjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1YmMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNWJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDVjMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDVjNCA8W14+XSo+IHNkCVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qNWM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVjOCA8W14+XSo+IG5vcAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1pbG9ja3MuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiMmJkYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLWlsb2Nrcy5kCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTUlQUyBsZC1pbG9ja3MKLSNzb3VyY2U6IGxkLnMKLSNhczoKLSMgVGVzdCB0aGUgbGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8LnRleHQ+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhMVwpCi0wKzAwNDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGExXCkKLTArMDA0OCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDA1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLTArMDA1YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA2NCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA3OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA3YyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4MCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA4NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwODggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA5NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDljIDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qOWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGEwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmIwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGI0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGdwXCkKLVsgCV0qYjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSpiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGM0IDxbXj5dKj4gbHcJXCRhMCwtMTYzODRcKFwkZ3BcKQotWyAJXSpjNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYzggPFtePl0qPiBsdwlcJGExLC0xNjM4MFwoXCRncFwpCi1bIAldKmM4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBjYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSpkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSpkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSplMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGdwXCkKLVsgCV0qZTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKmYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKmY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBmOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKmY4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGdwXCkKLVsgCV0qZmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMTA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTBjIDxbXj5dKj4gbHcJXCRhMCwtMTYzODNcKFwkZ3BcKQotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gbHcJXCRhMSwtMTYzNzlcKFwkZ3BcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjExNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjExODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxM2MgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTVjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjAgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjQgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE2YyA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3MCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE3OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxN2MgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMThjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5MCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMTkwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5NCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFhMCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFhOCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMWFjIDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFiNCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMWI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFiOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFiYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWMwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFjNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxY2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFlOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMWVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFmYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjIwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjIwYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDIxNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIxOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIxYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjQgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzAgPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjIzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzOCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0MCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjI0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjRjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjI0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjU0IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjZjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI3MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMjg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjg4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjI4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI5OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmE4IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjJiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDJjMCA8W14+XSo+IGx3CVwkYTAsLTE2Mzg0XChcJGF0XCkKLVsgCV0qMmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJjNCA8W14+XSo+IGx3CVwkYTEsLTE2MzgwXChcJGF0XCkKLVsgCV0qMmM0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmNjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZTAgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMmVjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjJmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJmOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJmYyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMDAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSozMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMzA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMzA4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMxMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDMxNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDMxOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMxYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDMyMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMyNCA8W14+XSo+IGx3CVwkYTAsLTE2MzgzXChcJGF0XCkKLVsgCV0qMzI0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDMyOCA8W14+XSo+IGx3CVwkYTEsLTE2Mzc5XChcJGF0XCkKLVsgCV0qMzI4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDMyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozMmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzM0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzM4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjMzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzQ0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM0OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzRjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM1NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1OCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qMzU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzY0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzY4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzZjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjM2YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDM3MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM3NCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGF0XCkKLVsgCV0qMzc0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzc4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzN2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qMzdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzgwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzg0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzODggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjM4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDM4YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSozOGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzkwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzk0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzk4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozOTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMzljIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYTQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2FjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2I4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNiYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2MwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2M0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozYzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2M4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotWyAJXSozYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2NjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNjYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2RjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2UwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2U0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotWyAJXSozZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZTggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjNlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDNlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZjQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjNmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDNmOCA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGF0XCkKLVsgCV0qM2Y4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2ZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MDQgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi1bIAldKjQwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MDggPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi1bIAldKjQwODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MGMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDQxMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQxNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MTggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0MTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDIwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDI0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Mjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0MmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDM0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQzOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQzODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0M2MgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ0MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ0NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NDggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0NDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi1bIAldKjQ0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ1NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1OCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjQ1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotWyAJXSo0NWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0NjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NjQgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA0NmMgPFtePl0qPiBsdWkJXCRhdCwweDEKLVsgCV0qNDZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQ3MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ3NCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ3NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NzggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo0Nzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDdjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjQ3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ODAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ODQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjQ4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0ODggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjQ4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0OGMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNDhjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0OTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0OTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjQ5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDk4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0OTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ5YyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0OWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGE0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGE4IDxbXj5dKj4gbHcJXCRhMSwtMjMxMjdcKFwkYXRcKQotWyAJXSo0YTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGFjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YjQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YjggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YmMgPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNGJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNGMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGM0IDxbXj5dKj4gbHcJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo0YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0YzggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRjYyA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo0Y2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA0ZDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZDQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRkNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRkOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLVsgCV0qNGQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNGRjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjRkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZTQgPFtePl0qPiBsdwlcJGEwLC0yMzEzMVwoXCRhdFwpCi1bIAldKjRlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZTggPFtePl0qPiBsdwlcJGExLC0yMzEyN1woXCRhdFwpCi1bIAldKjRlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0ZWMgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCR6ZXJvXCkKLTArMDRmMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSw0XChcJHplcm9cKQotMCswNGY0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkemVyb1wpCi0wKzA0ZjggPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCR6ZXJvXCkKLTArMDRmYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTAwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1MDQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDUwOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkemVyb1wpCi0wKzA1MGMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJHplcm9cKQotMCswNTEwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDBcKFwkYTFcKQotMCswNTE0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkYTFcKQotMCswNTE4IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDFcKFwkYTFcKQotMCswNTFjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLDVcKFwkYTFcKQotMCswNTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1MjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1MjggPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDUyYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTMwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCRhMVwpCi0wKzA1MzQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY0XChcJGExXCkKLTArMDUzOCA8W14+XSo+IGx1aQlcJGF0LDB4MgotWyAJXSo1Mzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1M2MgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1NDAgPFtePl0qPiBsd2MxCVwkZls0NV0sLTIzMTMxXChcJGF0XCkKLVsgCV0qNTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTQ0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0yMzEyN1woXCRhdFwpCi1bIAldKjU0NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU0OCA8W14+XSo+IG5vcAotMCswNTRjIDxbXj5dKj4gc3djMQlcJGZbNDVdLDBcKFwkemVyb1wpCi0wKzA1NTAgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKLTArMDU1NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQotMCswNTU4IDxbXj5dKj4gc3djMQlcJGZbNDVdLDVcKFwkemVyb1wpCi0wKzA1NWMgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU2MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTY0IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1NjggPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQotMCswNTZjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDU3MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJGExXCkKLTArMDU3NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw0XChcJGExXCkKLTArMDU3OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJGExXCkKLTArMDU3YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJGExXCkKLTArMDU4MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNTg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTg4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1OGMgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDU5MCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQotMCswNTk0IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCi0wKzA1OTggPFtePl0qPiBsdWkJXCRhdCwweDIKLVsgCV0qNTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDU5YyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDVhMCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMjMxMzFcKFwkYXRcKQotWyAJXSo1YTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWE0IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0yMzEyN1woXCRhdFwpCi1bIAldKjVhNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1YTggPFtePl0qPiBzdwlcJGEwLDBcKFwkemVyb1wpCi0wKzA1YWMgPFtePl0qPiBzdwlcJGExLDRcKFwkemVyb1wpCi0wKzA1YjAgPFtePl0qPiBsdWkJXCRhMCwweDIKLVsgCV0qNWIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNWI0IDxbXj5dKj4gKGR8KWFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDViOCA8W14+XSo+IGxkCVwkYTAsLTIzMTMxXChcJGEwXCkKLVsgCV0qNWI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNWJjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi1bIAldKjViYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YzAgPFtePl0qPiAoZHwpYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswNWM0IDxbXj5dKj4gc2QJXCRhMCwtMjMxMzFcKFwkYXRcKQotWyAJXSo1YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNWM4IDxbXj5dKj4gbm9wCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtcGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLXBpYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2Y1MmRmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtcGljLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGQgbWFjcm8gd2l0aCBQSUMgY29kZS4KLQkKLQkuc2V0CW1pcHMxCi0KLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JbGQJJDQsMAotCWxkCSQ0LDEKLQlsZAkkNCwweDgwMDAKLQlsZAkkNCwtMHg4MDAwCi0JbGQJJDQsMHgxMDAwMAotCWxkCSQ0LDB4MWE1YTUKLQlsZAkkNCwwKCQ1KQotCWxkCSQ0LDEoJDUpCi0JbGQJJDQsMHg4MDAwKCQ1KQotCWxkCSQ0LC0weDgwMDAoJDUpCi0JbGQJJDQsMHgxMDAwMCgkNSkKLQlsZAkkNCwweDFhNWE1KCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbgotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCWxkCSQ0LGRhdGFfbGFiZWwrMQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JbGQJJDQsZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCS5pZm5kZWYJRU1QSUMKLQlub3AKLQlub3AKLQkuZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQtc3ZyNHBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNDNkNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxkLXN2cjRwaWMKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDCi0jc291cmNlOiBsZC1waWMucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvIHdpdGggLUtQSUMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjkwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA5NCA8W14+XSo+IG5vcAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qOTg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo5YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBhMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmEwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhNCA8W14+XSo+IG5vcAotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBhYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpiMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiNCA8W14+XSo+IG5vcAotMCswMGI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBiYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpjMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjNCA8W14+XSo+IG5vcAotMCswMGM4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDBjYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpkMDogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQ0IDxbXj5dKj4gbm9wCi0wKzAwZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmUwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGU0IDxbXj5dKj4gbm9wCi0wKzAwZTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSplODogUl9NSVBTX0xPMTYJLmJzcwotMCswMGVjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qZWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDBmMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmYwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMGY0IDxbXj5dKj4gbm9wCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQotWyAJXSpmODogUl9NSVBTX0xPMTYJLmJzcwotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKLVsgCV0qZmM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxMDQgPFtePl0qPiBub3AKLTArMDEwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEwODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEwYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDExMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjExMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMTQgPFtePl0qPiBub3AKLTArMDExOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTIwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTI0IDxbXj5dKj4gbm9wCi0wKzAxMjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTJjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDEzMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEzMDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzNCA8W14+XSo+IG5vcAotMCswMTM4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDEzYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNDAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNDA6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0NCA8W14+XSo+IG5vcAotMCswMTQ4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE0YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNTAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNTQgPFtePl0qPiBub3AKLTArMDE1OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjE1ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTVjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMTVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNjA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAxNjQgPFtePl0qPiBub3AKLTArMDE2OCA8W14+XSo+IGx3CVwkYTAsMTAwMVwoXCRhdFwpCi1bIAldKjE2ODogUl9NSVBTX0xPMTYJLmJzcwotMCswMTZjIDxbXj5dKj4gbHcJXCRhMSwxMDA1XChcJGF0XCkKLVsgCV0qMTZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxNzAgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxNzA6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMTc0IDxbXj5dKj4gbm9wCi0wKzAxNzggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxN2MgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxN2M6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxODAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxODA6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAxODQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxODQ6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTg4IDxbXj5dKj4gbm9wCi0wKzAxOGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE5ODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IG5vcAotMCswMWEwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWE0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAxYWMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoxYWM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBub3AKLTArMDFiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFiOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxYmMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWMwOiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzQgPFtePl0qPiBub3AKLTArMDFjOCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFjYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxZDAgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWQ0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWQ4IDxbXj5dKj4gbm9wCi0wKzAxZGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZTAgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZTA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFlNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKjFlNDogUl9NSVBTX0xPMTYJLmJzcwotMCswMWU4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWU4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMWVjIDxbXj5dKj4gbm9wCi0wKzAxZjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZjQgPFtePl0qPiBsdwlcJGEwLDEwMDBcKFwkYXRcKQotWyAJXSoxZjQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFmOCA8W14+XSo+IGx3CVwkYTEsMTAwNFwoXCRhdFwpCi1bIAldKjFmODogUl9NSVBTX0xPMTYJLmJzcwotMCswMWZjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWZjOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDIwMCA8W14+XSo+IG5vcAotMCswMjA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjA4IDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMjA4OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMjBjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMjEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjEwOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxNCA8W14+XSo+IG5vcAotMCswMjE4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjFjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDIyMCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyMjQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjggPFtePl0qPiBub3AKLTArMDIyYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDIzMCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMjM4OiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gbm9wCi0wKzAyNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNDQgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDI0YyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjI0YzogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjUwIDxbXj5dKj4gbm9wCi0wKzAyNTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMjVjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDI2MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjI2MDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI2NCA8W14+XSo+IG5vcAotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjZjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMjZjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNzAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyNzA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDI3NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjI3NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDI3OCA8W14+XSo+IG5vcAotMCswMjdjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjgwIDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKLVsgCV0qMjgwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyODQgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQotWyAJXSoyODQ6IFJfTUlQU19MTzE2CS5ic3MKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC14Z290LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMjYyY2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC14Z290LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxkLXhnb3QKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC14Z290Ci0jc291cmNlOiBsZC1waWMucwotCi0jIFRlc3QgdGhlIGxkIG1hY3JvIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjkwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDA5NCA8W14+XSo+IG5vcAotMCswMDk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qOTg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwOWMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSo5YzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDBhMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSphMDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwYTggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSphODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYWMgPFtePl0qPiBub3AKLTArMDBiMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGJjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGMwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qYzA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzQgPFtePl0qPiBub3AKLTArMDBjOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMGQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qZDg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZGMgPFtePl0qPiBub3AKLTArMDBlMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAwZTQgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMGU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmU4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwZjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSpmMDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gbm9wCi0wKzAwZjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDEwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDEwNCA8W14+XSo+IG5vcAotMCswMTA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTA4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMGMgPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotWyAJXSoxMGM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDExMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjExMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDExNCA8W14+XSo+IG5vcAotMCswMTE4IDxbXj5dKj4gbHcJXCRhMCwxMDAwXChcJGF0XCkKLVsgCV0qMTE4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxMWMgPFtePl0qPiBsdwlcJGExLDEwMDRcKFwkYXRcKQotWyAJXSoxMWM6IFJfTUlQU19MTzE2CS5ic3MKLTArMDEyMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEyMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAxMjQgPFtePl0qPiBub3AKLTArMDEyOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjEyODogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEyYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjEyYzogUl9NSVBTX0xPMTYJLmRhdGEKLTArMDEzMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMzA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTM4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTM4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IG5vcAotMCswMTQwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTQ4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTUwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTUwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTU0IDxbXj5dKj4gbm9wCi0wKzAxNTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMTVjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDE2MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNjA6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxNjggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxNjg6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNmMgPFtePl0qPiBub3AKLTArMDE3MCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE3ODogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTdjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTgwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTgwOiBSX01JUFNfR09UX0xPMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxODQgPFtePl0qPiBub3AKLTArMDE4OCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAxOGMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMTkwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTkwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTk0IDxbXj5dKj4gbm9wCi0wKzAxOTggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoxOTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE5YyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjE5YzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWEwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMWE0IDxbXj5dKj4gbm9wCi0wKzAxYTggPFtePl0qPiBsdwlcJGEwLDEwMDFcKFwkYXRcKQotWyAJXSoxYTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFhYyA8W14+XSo+IGx3CVwkYTEsMTAwNVwoXCRhdFwpCi1bIAldKjFhYzogUl9NSVBTX0xPMTYJLmJzcwotMCswMWIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWIwOiBSX01JUFNfR09UMTYJLmRhdGEKLTArMDFiNCA8W14+XSo+IG5vcAotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMWJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWJjOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMWMwIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMWMwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMWM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxY2MgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxY2M6IFJfTUlQU19HT1RfTE8xNgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWQwIDxbXj5dKj4gbm9wCi0wKzAxZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAxZDggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLTArMDFlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZTA6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxZTggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxZTg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPFtePl0qPiBub3AKLTArMDFmMCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDFmNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdwlcJGExLDRcKFwkYXRcKQotMCswMWZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFmYzogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDIwNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjIwNDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIwOCA8W14+XSo+IG5vcAotMCswMjBjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjEwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjE4OiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAyMjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoyMjA6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIyNCA8W14+XSo+IG5vcAotMCswMjI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjJjIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDIzMCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyMzQ6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyMzggPFtePl0qPiBub3AKLTArMDIzYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI0MCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjI0MDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qMjQ0OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNDggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNDg6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAyNGMgPFtePl0qPiBub3AKLTArMDI1MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI1NCA8W14+XSo+IGx3CVwkYTAsMTAwMFwoXCRhdFwpCi1bIAldKjI1NDogUl9NSVBTX0xPMTYJLmJzcwotMCswMjU4IDxbXj5dKj4gbHcJXCRhMSwxMDA0XChcJGF0XCkKLVsgCV0qMjU4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyNWMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSoyNWM6IFJfTUlQU19HT1QxNgkuZGF0YQotMCswMjYwIDxbXj5dKj4gbm9wCi0wKzAyNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyNjggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSoyNjg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyNmMgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyNmM6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjcwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDI3OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjI3ODogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyN2MgPFtePl0qPiBub3AKLTArMDI4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI4NCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotMCswMjhjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI4YzogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDI5NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjI5NDogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5OCA8W14+XSo+IG5vcAotMCswMjljIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmEwIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLTArMDJhNCA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi0wKzAyYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmE4OiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMmIwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMmIwOiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmI0IDxbXj5dKj4gbm9wCi0wKzAyYjggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyYmMgPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMmMwIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDJjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYzQ6IFJfTUlQU19HT1RfSEkxNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJjOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDJjYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjJjYzogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmQwIDxbXj5dKj4gbm9wCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotMCswMmRjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLTArMDJlMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjJlMDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJlNCA8W14+XSo+IG5vcAotMCswMmU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmVjIDxbXj5dKj4gbHcJXCRhMCwxXChcJGF0XCkKLVsgCV0qMmVjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAyZjAgPFtePl0qPiBsdwlcJGExLDVcKFwkYXRcKQotWyAJXSoyZjA6IFJfTUlQU19MTzE2CS5ic3MKLTArMDJmNCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjJmNDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDJmOCA8W14+XSo+IG5vcAotMCswMmZjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzAwIDxbXj5dKj4gbHcJXCRhMCwxMDAxXChcJGF0XCkKLVsgCV0qMzAwOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAzMDQgPFtePl0qPiBsdwlcJGExLDEwMDVcKFwkYXRcKQotWyAJXSozMDQ6IFJfTUlQU19MTzE2CS5ic3MKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4OWNmMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xkLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2MzkgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNhczogLW1jcHU9cjQwMDAKLSNuYW1lOiBNSVBTIGxkCi0KLSMgVGVzdCB0aGUgbGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYTAsMFwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGx3CVwkYTEsNFwoXCR6ZXJvXCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDE0IDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDE4IDxbXj5dKj4gbHcJXCRhMSwtMzI3NjRcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHcJXCRhMCwtMzI3NjhcKFwkemVyb1wpCi0wKzAwMjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMzAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDAzNCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDAzYyA8W14+XSo+IG5vcAotMCswMDQwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBub3AKLTArMDA0YyA8W14+XSo+IGx3CVwkYTAsMVwoXCRhMVwpCi0wKzAwNTAgPFtePl0qPiBsdwlcJGExLDVcKFwkYTFcKQotMCswMDU0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTggPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNWMgPFtePl0qPiBsdwlcJGEwLC0zMjc2OFwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdwlcJGExLC0zMjc2NFwoXCRhdFwpCi0wKzAwNjQgPFtePl0qPiBub3AKLTArMDA2OCA8W14+XSo+IGx3CVwkYTAsLTMyNzY4XChcJGExXCkKLTArMDA2YyA8W14+XSo+IGx3CVwkYTEsLTMyNzY0XChcJGExXCkKLTArMDA3MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMDc4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDIKLTArMDA4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDA4OCA8W14+XSo+IGx3CVwkYTAsLTIzMTMxXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGx3CVwkYTEsLTIzMTI3XChcJGF0XCkKLTArMDA5MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo5NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhMCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSphNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGE4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGdwXCkKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmIwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiNCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKmI0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBiYyA8W14+XSo+IGx3CVwkYTAsMFwoXCRncFwpCi1bIAldKmJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGMwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwYzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBjYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGQwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGdwXCkKLVsgCV0qZDA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGQ0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBkYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBlMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBlNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGU4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKmVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjAgPFtePl0qPiBsdwlcJGEwLDFcKFwkZ3BcKQotWyAJXSpmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjQgPFtePl0qPiBsdwlcJGExLDVcKFwkZ3BcKQotWyAJXSpmNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGZjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwNCA8W14+XSo+IGx3CVwkYTAsMVwoXCRncFwpCi1bIAldKjEwNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwOCA8W14+XSo+IGx3CVwkYTEsNVwoXCRncFwpCi1bIAldKjEwODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDEwYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxMTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkZ3BcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qMTFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDEyMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTI4IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoxMzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1NCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2MCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2NCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNmMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTcwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE3NCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTc4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxODAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxODQgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE4OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjE4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTk0IDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTk0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTljIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFhMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFiNCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFiNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFiOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFiYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMWMwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFjNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWNjIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDFkMCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFkOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjFkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMWRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWYwIDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjFmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZmMgPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyMDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyMTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjE0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjE0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDIxOCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIxODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyMWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjIwIDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIyNCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyYyA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjMwIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjIzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNDAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjQ0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0OCA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTAgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTQgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNWMgPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNjAgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjY4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjY4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDI3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjgwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMjg4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjg4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IG5vcAotMCswMjk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMjk4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qMjk4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjI5YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyYTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDJhOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gbm9wCi0wKzAyYjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyYjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSoyYjg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSoyYmM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmMwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmM4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmQwIDxbXj5dKj4gbm9wCi0wKzAyZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyZDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMmRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmRjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDJlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmU0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMmU4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyZjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAyZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjJmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzAwIDxbXj5dKj4gbm9wCi0wKzAzMDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAzMDggPFtePl0qPiBsdwlcJGEwLDFcKFwkYXRcKQotWyAJXSozMDg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzBjIDxbXj5dKj4gbHcJXCRhMSw1XChcJGF0XCkKLVsgCV0qMzBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMxMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDMxYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjMxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzMjAgPFtePl0qPiBub3AKLTArMDMyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDMyOCA8W14+XSo+IGx3CVwkYTAsMVwoXCRhdFwpCi1bIAldKjMyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMyYyA8W14+XSo+IGx3CVwkYTEsNVwoXCRhdFwpCi1bIAldKjMyYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDMzMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzMzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzMzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozMzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzM2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzNDAgPFtePl0qPiBub3AKLTArMDM0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDM0OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM0ODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozNGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMzUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDM1NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM1OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzNWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMzYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzNjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM2YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjM2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzcwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzcwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDM3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM3OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzN2MgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzgwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzgwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDM4OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzOGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzkwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzkwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzk0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswMzk4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzljIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2EwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2EwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswM2E0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswM2E4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2E4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2FjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2FjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswM2IwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2IwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDNiNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNiOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswM2MwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzYzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzYzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozYzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswM2NjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2NjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNkMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNkNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNkOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNkODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2RjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2RjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qM2UwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDNlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjNlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZWMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSozZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswM2YwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzZjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzAzZjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozZjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswM2ZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qM2ZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo0MDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0MGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNDEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNDE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDE4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDE4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswNDIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjQyMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0MjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MjggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Mjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDJjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDQzMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0MzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Mzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDQ0MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ0MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNDQ4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qNDQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NGMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0NGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ1MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NTggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0NTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDVjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0NjggPFtePl0qPiBsdwlcJGEwLDBcKFwkYXRcKQotWyAJXSo0Njg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDZjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ3MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ3NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ3OCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjQ3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ3YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDQ4MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ4MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ4NCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDQ4OCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ4ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ4YyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjQ4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ5MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ5MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0OTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0OTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0OTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNDljIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDRhMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0YTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YTggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0YTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNGFjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDRiMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRiMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGI0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNGI4IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YmMgPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo0YmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRjMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0YzQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0YzggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNGNjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDRkMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0ZDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA0ZDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo0ZDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNGRjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNGRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDRlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRlNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRlOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRlODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRlYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDRmMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjRmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDRmNCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDRmOCA8W14+XSo+IGx3CVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjRmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRmYyA8W14+XSo+IGx3CVwkYTEsWy0wLTldK1woXCRhdFwpCi1bIAldKjRmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDUwMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1MDQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGF0Ci0wKzA1MDggPFtePl0qPiBsdwlcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo1MDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswNTBjIDxbXj5dKj4gbHcJXCRhMSxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDUxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwwXChcJHplcm9cKQotMCswNTE0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLDRcKFwkemVyb1wpCi0wKzA1MTggPFtePl0qPiBsd2MxCVwkZls0NV0sMVwoXCR6ZXJvXCkKLTArMDUxYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSw1XChcJHplcm9cKQotMCswNTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzA1MjQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGF0XCkKLTArMDUyOCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYXRcKQotMCswNTJjIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2OFwoXCR6ZXJvXCkKLTArMDUzMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkemVyb1wpCi0wKzA1MzQgPFtePl0qPiBsd2MxCVwkZls0NV0sMFwoXCRhMVwpCi0wKzA1MzggPFtePl0qPiBsd2MxCVwkZls0NV0sNFwoXCRhMVwpCi0wKzA1M2MgPFtePl0qPiBsd2MxCVwkZls0NV0sMVwoXCRhMVwpCi0wKzA1NDAgPFtePl0qPiBsd2MxCVwkZls0NV0sNVwoXCRhMVwpCi0wKzA1NDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU0OCA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkYXQKLTArMDU0YyA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTUwIDxbXj5dKj4gbHdjMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1NTQgPFtePl0qPiBsd2MxCVwkZls0NV0sLTMyNzY4XChcJGExXCkKLTArMDU1OCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMzI3NjRcKFwkYTFcKQotMCswNTVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNTYwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNTY0IDxbXj5dKj4gbHdjMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1NjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NjggPFtePl0qPiBsd2MxCVwkZls0NV0sWy0wLTldK1woXCRhdFwpCi1bIAldKjU2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU2YyA8W14+XSo+IG5vcAotMCswNTcwIDxbXj5dKj4gc3djMQlcJGZbNDVdLDBcKFwkemVyb1wpCi0wKzA1NzQgPFtePl0qPiBzd2MxCVwkZls0NV0sNFwoXCR6ZXJvXCkKLTArMDU3OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJHplcm9cKQotMCswNTdjIDxbXj5dKj4gc3djMQlcJGZbNDVdLDVcKFwkemVyb1wpCi0wKzA1ODAgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDU4NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYXRcKQotMCswNTg4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhdFwpCi0wKzA1OGMgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY4XChcJHplcm9cKQotMCswNTkwIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCR6ZXJvXCkKLTArMDU5NCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwwXChcJGExXCkKLTArMDU5OCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw0XChcJGExXCkKLTArMDU5YyA8W14+XSo+IHN3YzEJXCRmWzQ1XSwxXChcJGExXCkKLTArMDVhMCA8W14+XSo+IHN3YzEJXCRmWzQ1XSw1XChcJGExXCkKLTArMDVhNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswNWE4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNWFjIDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2OFwoXCRhdFwpCi0wKzA1YjAgPFtePl0qPiBzd2MxCVwkZls0NV0sLTMyNzY0XChcJGF0XCkKLTArMDViNCA8W14+XSo+IHN3YzEJXCRmWzQ1XSwtMzI3NjhcKFwkYTFcKQotMCswNWI4IDxbXj5dKj4gc3djMQlcJGZbNDVdLC0zMjc2NFwoXCRhMVwpCi0wKzA1YmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRhdAotMCswNWM0IDxbXj5dKj4gc3djMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1YzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWM4IDxbXj5dKj4gc3djMQlcJGZbNDVdLFstMC05XStcKFwkYXRcKQotWyAJXSo1Yzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNWNjIDxbXj5dKj4gc3cJXCRhMCwwXChcJHplcm9cKQotMCswNWQwIDxbXj5dKj4gc3cJXCRhMSw0XChcJHplcm9cKQotMCswNWQ0IDxbXj5dKj4gbHVpCVwkYTAsWy0wLTl4XSsKLVsgCV0qNWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswNWQ4IDxbXj5dKj4gZGFkZHUJXCRhMCxcJGEwLFwkYTEKLTArMDVkYyA8W14+XSo+IGxkCVwkYTAsWy0wLTldK1woXCRhMFwpCi1bIAldKjVkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDVlMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjVlMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1ZTQgPFtePl0qPiBkYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswNWU4IDxbXj5dKj4gc2QJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNWU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDVlYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9sZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWVlM2MwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGQucworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIFNvdXJjZSBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgbGQgbWFjcm8uCi0JCi0JLnNldAltaXBzMQotCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCWxkCSQ0LDAKLQlsZAkkNCwxCi0JbGQJJDQsMHg4MDAwCi0JbGQJJDQsLTB4ODAwMAotCWxkCSQ0LDB4MTAwMDAKLQlsZAkkNCwweDFhNWE1Ci0JbGQJJDQsMCgkNSkKLQlsZAkkNCwxKCQ1KQotCWxkCSQ0LDB4ODAwMCgkNSkKLQlsZAkkNCwtMHg4MDAwKCQ1KQotCWxkCSQ0LDB4MTAwMDAoJDUpCi0JbGQJJDQsMHgxYTVhNSgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24KLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24KLQlsZAkkNCxkYXRhX2xhYmVsKzEKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCWxkCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHg4MDAwCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQlsZAkkNCxkYXRhX2xhYmVsLTB4ODAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24tMHg4MDAwCi0JbGQJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDEwMDAwCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlsZAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCWxkCSQ0LGRhdGFfbGFiZWwoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbigkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbigkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMSgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMSgkNSkKLQlsZAkkNCxkYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAoJDUpCi0JbGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCWxkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMCgkNSkKLQlsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCWxkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwKCQ1KQotCWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwKCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMCgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAoJDUpCi0JbGQJJDQsZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0JbGQJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1KCQ1KQotCWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNSgkNSkKLQlsZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JbGQJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0KLSMgbC5kIGFuZCBzLmQgYXJlIHNvcnQgb2YgbGlrZSBsZC4KLQlsLmQJJGY0LDAKLQlsLmQJJGY0LDEKLQlsLmQJJGY0LDB4ODAwMAotCWwuZAkkZjQsLTB4ODAwMAotCWwuZAkkZjQsMCgkNSkKLQlsLmQJJGY0LDEoJDUpCi0JbC5kCSRmNCwweDgwMDAoJDUpCi0JbC5kCSRmNCwtMHg4MDAwKCQ1KQotCWwuZAkkZjQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUoJDUpCi0JIyBMaXR0bGUgZW5kaWFuIHdpbGwgaW5zZXJ0IGEgbm9wIGhlcmUuCi0JIyBXZSBwdXQgaXQgaW4gZXhwbGljaXRseSBzbyB0aGF0IGJpZyBhbmQgbGl0dGxlIGVuZGlhbiBhcmUgc2ltaWxhci4KLQlub3AKLQlzLmQJJGY0LDAKLQlzLmQJJGY0LDEKLQlzLmQJJGY0LDB4ODAwMAotCXMuZAkkZjQsLTB4ODAwMAotCXMuZAkkZjQsMCgkNSkKLQlzLmQJJGY0LDEoJDUpCi0Jcy5kCSRmNCwweDgwMDAoJDUpCi0Jcy5kCSRmNCwtMHg4MDAwKCQ1KQotCXMuZAkkZjQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIHNkIGlzIGhhbmRsZWQgbGlrZSBsZC4gIFNhbml0eSBjaGVjayBpdC4KLQlzZAkkNCwwCi0KLSMgU2FuaXR5IGNoZWNrIHRoZSAtbWlwczMgdmVyc2lvbnMKLQkuc2V0CW1pcHMzCi0JbGQJJDQsYmlnX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1KCQ1KQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmUyYjIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkuZAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jbmFtZTogTUlQUyBsaQotCi0jIFRlc3QgdGhlIGxpIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBsaQlcJGEwLDAKLTArMDAwNCA8W14+XSo+IGxpCVwkYTAsMQotMCswMDA4IDxbXj5dKj4gbGkJXCRhMCwweDgwMDAKLTArMDAwYyA8W14+XSo+IGxpCVwkYTAsLTMyNzY4Ci0wKzAwMTAgPFtePl0qPiBsdWkJXCRhMCwweDEKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4MQotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGE1YTUKLTArMDAxYyA8W14+XSo+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzNhNjAxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGkucworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsaSBtYWNyby4KLQotZm9vOgotCWxpCSQ0LDAKLQlsaQkkNCwxCi0JbGkJJDQsMHg4MDAwCi0JbGkJJDQsLTB4ODAwMAotCWxpCSQ0LDB4MTAwMDAKLQlsaQkkNCwweDFhNWE1Ci0KLSMgUm91bmQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LCBmb3IgZWFzZSBpbiB0ZXN0aW5nIG11bHRpcGxlIHRhcmdldHMuCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1lbXBpYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtZW1waWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwZGNhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1lbXBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxpZmxvYXQtZW1waWMKLSNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljIC0tZGVmc3ltIEVNUElDPTEKLSNzb3VyY2U6IGxpZmxvYXQucwotCi0jIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLW1lbWJlZGRlZC1waWMuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODQKLVsgCV0qMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkucmRhdGEuKgotMCswMDA0IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLTArMDAwOCA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi0wKzAwMGMgPFtePl0qPiBsd2MxCVwkZls0NV0sLTE2MzY4XChcJGdwXCkKLVsgCV0qYzogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ4LioKLTArMDAxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSwtMTYzNjRcKFwkZ3BcKQotWyAJXSoxMDogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ4LioKLTArMDAxNCA8W14+XSo+IGx1aQlcJGEwLDB4M2Y4ZgotMCswMDE4IDxbXj5dKj4gb3JpCVwkYTAsXCRhMCwweGNkMzYKLTArMDAxYyA8W14+XSo+IGx1aQlcJGF0LDB4M2Y4ZgotMCswMDIwIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGNkMzYKLTArMDAyNCA8W14+XSo+IG10YzEJXCRhdCxcJGY0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1zdnI0cGljLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZi1zdnI0cGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDlhN2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYtc3ZyNHBpYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIGxpZmxvYXQtc3ZyNHBpYwotI2FzOiAtbWlwczEgLW1jcHU9cjMwMDAgLUtQSUMgLUVCIC0tZGVmc3ltIFNWUjQ9MQotI3NvdXJjZTogbGlmbG9hdC5zCi0KLSMgVGVzdCB0aGUgbGkuZCBhbmQgbGkucyBtYWNyb3Mgd2l0aCAtS1BJQy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMDogUl9NSVBTX0dPVDE2CS5yb2RhdGEKLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gbHcJXCRhMCwwXChcJGF0XCkKLVsgCV0qODogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDBjIDxbXj5dKj4gbHcJXCRhMSw0XChcJGF0XCkKLVsgCV0qYzogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTA6IFJfTUlQU19HT1QxNgkucm9kYXRhCi0wKzAwMTQgPFtePl0qPiBub3AKLTArMDAxOCA8W14+XSo+IGx3YzEJXCRmNSw4XChcJGF0XCkKLVsgCV0qMTg6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAxYyA8W14+XSo+IGx3YzEJXCRmNCwxMlwoXCRhdFwpCi1bIAldKjFjOiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMjAgPFtePl0qPiBsdWkJXCRhMCwweDNmOGYKLTArMDAyNCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjZDM2Ci0wKzAwMjggPFtePl0qPiBsdWkJXCRhdCwweDNmOGYKLTArMDAyYyA8W14+XSo+IG9yaQlcJGF0LFwkYXQsMHhjZDM2Ci0wKzAwMzAgPFtePl0qPiBtdGMxCVwkYXQsXCRmNAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWYteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjg2ZTJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmLXhnb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyBsaWZsb2F0LXhnb3QKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC14Z290IC1FQiAtLWRlZnN5bSBYR09UPTEKLSNzb3VyY2U6IGxpZmxvYXQucwotCi0jIFRlc3QgdGhlIGxpLmQgYW5kIGxpLnMgbWFjcm9zIHdpdGggLUtQSUMgLXhnb3QuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjA6IFJfTUlQU19HT1QxNgkucm9kYXRhCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGx3CVwkYTAsMFwoXCRhdFwpCi1bIAldKjg6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAwYyA8W14+XSo+IGx3CVwkYTEsNFwoXCRhdFwpCi1bIAldKmM6IFJfTUlQU19MTzE2CS5yb2RhdGEKLTArMDAxMCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjEwOiBSX01JUFNfR09UMTYJLnJvZGF0YQotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBsd2MxCVwkZjUsOFwoXCRhdFwpCi1bIAldKjE4OiBSX01JUFNfTE8xNgkucm9kYXRhCi0wKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsMTJcKFwkYXRcKQotWyAJXSoxYzogUl9NSVBTX0xPMTYJLnJvZGF0YQotMCswMDIwIDxbXj5dKj4gbHVpCVwkYTAsMHgzZjhmCi0wKzAwMjQgPFtePl0qPiBvcmkJXCRhMCxcJGEwLDB4Y2QzNgotMCswMDI4IDxbXj5dKj4gbHVpCVwkYXQsMHgzZjhmCi0wKzAwMmMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4Y2QzNgotMCswMDMwIDxbXj5dKj4gbXRjMQlcJGF0LFwkZjQKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGlmbG9hdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWI1NTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgbGlmbG9hdAotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3Jvcy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnJvP2RhdGEuKgotMCswMDA0IDxbXj5dKj4gbHcJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkucm8/ZGF0YS4qCi0wKzAwMDggPFtePl0qPiBsdwlcJGExLFstMC05XStcKFwkYXRcKQotWyAJXSo4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ybz9kYXRhLioKLTArMDAwYyA8W14+XSo+IGx3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qYzogW0EtWjAtOV9dKkxJVEVSQUxbQS1aMC05X10qCS5saXQ4LioKLTArMDAxMCA8W14+XSo+IGx3YzEJXCRmWzQ1XSxbLTAtOV0rXChcJGdwXCkKLVsgCV0qMTA6IFtBLVowLTlfXSpMSVRFUkFMW0EtWjAtOV9dKgkubGl0OC4qCi0wKzAwMTQgPFtePl0qPiBsdWkJXCRhMCwweDNmOGYKLTArMDAxOCA8W14+XSo+IG9yaQlcJGEwLFwkYTAsMHhjZDM2Ci0wKzAwMWMgPFtePl0qPiBsd2MxCVwkZjQsWy0wLTldK1woXCRncFwpCi1bIAldKjFjOiBbQS1aMC05X10qTElURVJBTFtBLVowLTlfXSoJLmxpdDQuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saWZsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3N2YwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpZmxvYXQucworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBsaS5kIGFuZCBsaS5zIG1hY3Jvcy4KLQkKLWZvbzoJCi0JbGkuZAkkNCwxLjEyMzQ1Ci0JbGkuZAkkZjQsMS4xMjM0NQotCQotCWxpLnMJJDQsMS4xMjM0NQotCWxpLnMJJGY0LDEuMTIzNDUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQkuaWZkZWYJU1ZSNAotCW5vcAotCW5vcAotCW5vcAotCS5lbmRpZgotCS5pZmRlZglYR09UCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCi0JLmlmZGVmCUVNUElDCi0Jbm9wCi0Jbm9wCi0JLmVuZGlmCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9saW5lbm8uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJhNDBmNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5kCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotI29iamR1bXA6IC1kIC1sIC1tbWlwczo0MDAwCi0jbmFtZTogYXNzZW1ibHkgbGluZSBudW1iZXJzCi0jYXM6IC1nIC1tY3B1PXI0MDAwCi0KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8bWFpbi0weDEwPjoKLS4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgotLipbMC05YS1mXSs6LipkZWFkYmVlZi4qCi0uKlswLTlhLWZdKzouKmRlYWRiZWVmLioKLS4qWzAtOWEtZl0rOi4qZGVhZGJlZWYuKgotCi0wKzAwMTAgPG1haW4+OgotbWFpblwoXCk6Ci0uKmxpbmVuby5zOjE2Ci0uKjEwOi4qYWRkaXUuKgotLipsaW5lbm8uczoxNwotLioxNDouKnNkLioKLS4qbGluZW5vLnM6MTgKLS4qMTg6LipzZC4qCi0uKmxpbmVuby5zOjE5Ci0uKjFjOi4qbW92ZS4qCi0uKmxpbmVuby5zOjIwCi0uKjIwOi4qamFsLioKLS4qMjQ6Lipub3AKLS4qbGluZW5vLnM6MjEKLS4qMjg6LipsaS4qCi0uKmxpbmVuby5zOjIyCi0uKjJjOi4qc3cuKgotLipsaW5lbm8uczoyMwotLiozMDouKmx3LioKLS4qbGluZW5vLnM6MjQKLS4qMzQ6Liptb3ZlLioKLS4qbGluZW5vLnM6MjUKLS4qMzg6LipzbGwuKgotLipsaW5lbm8uczoyNgotLiozYzouKmFkZHUuKgotLipsaW5lbm8uczoyNwotLio0MDouKnN3LioKLS4qbGluZW5vLnM6MjgKLS4qNDQ6Lipsdy4qCi0uKmxpbmVuby5zOjI5Ci0uKjQ4Oi4qamFsLioKLS4qNGM6Lipub3AKLS4qbGluZW5vLnM6MzAKLS4qNTA6Lipsdy4qCi0uKmxpbmVuby5zOjMxCi0uKjU0Oi4qbW92ZS4qCi0uKmxpbmVuby5zOjMyCi0uKjU4Oi4qYi4qCi0uKjVjOi4qbm9wCi0KLTAwMDAwMDAwMDAwMDAwNjAgPFwkTDE+OgotLipsaW5lbm8uczozNAotLio2MDouKm1vdmUuKgotLipsaW5lbm8uczozNQotLio2NDouKmxkLioKLS4qbGluZW5vLnM6MzYKLS4qNjg6LipsZC4qCi0uKmxpbmVuby5zOjM3Ci0uKjZjOi4qYWRkaXUuKgotLipsaW5lbm8uczozOAotLio3MDouKmpyLioKLS4qNzQ6Lipub3AKLQotMDAwMDAwMDAwMDAwMDA3OCA8Zz46Ci1nXChcKToKLS4qbGluZW5vLnM6NDcKLS4qNzg6LiphZGRpdS4qCi0uKmxpbmVuby5zOjQ4Ci0uKjdjOi4qc2QuKgotLipsaW5lbm8uczo0OQotLio4MDouKm1vdmUuKgotLipsaW5lbm8uczo1MAotLio4NDouKnN3LioKLS4qbGluZW5vLnM6NTEKLS4qODg6Lipsdy4qCi0uKmxpbmVuby5zOjUyCi0uKjhjOi4qYWRkaXUuKgotLipsaW5lbm8uczo1MwotLio5MDouKm1vdmUuKgotLipsaW5lbm8uczo1NAotLio5NDouKmIuKgotLio5ODouKm5vcAotCi0wMDAwMDAwMDAwMDAwMDljIDxcJEwyPjoKLS4qbGluZW5vLnM6NTYKLS4qOWM6Liptb3ZlLioKLS4qbGluZW5vLnM6NTcKLS4qYTA6LipsZC4qCi0uKmxpbmVuby5zOjU4Ci0uKmE0Oi4qYWRkaXUuKgotLipsaW5lbm8uczo1OQotLiphODouKmpyLioKLS4qYWM6Lipub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL2xpbmVuby5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFmMzMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbGluZW5vLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0JLnRleHQKLQotIyBzb21lIGRhdGEKLQkud29yZAkweGRlYWRiZWVmCi0JLndvcmQJMHhkZWFkYmVlZgotCS53b3JkCTB4ZGVhZGJlZWYKLQkud29yZAkweGRlYWRiZWVmCi0KLSMgc29tZSByZWFsIGNvZGUsIGNvbXBpbGVkIGZyb20gYSB0b3kgQyBwcm9ncmFtCi0JICAgICAgICAuZ2xvYmwgIG1haW4KLSAgICAgICAgLmVudCAgICBtYWluCi1tYWluOgotICAgICAgICAuZnJhbWUgICRmcCwzMiwkMzEgICAgICAgICAgICAgICMgdmFycz0gMTYsIHJlZ3M9IDIvMCwgYXJncz0gMCwgZXh0cmE9IDAKLSAgICAgICAgLm1hc2sgICAweGMwMDAwMDAwLC04Ci0gICAgICAgIC5mbWFzayAgMHgwMDAwMDAwMCwwCi0gICAgICAgIHN1YnUgICAgJHNwLCRzcCwzMgotICAgICAgICBzZCAgICAgICQzMSwyNCgkc3ApCi0gICAgICAgIHNkICAgICAgJGZwLDE2KCRzcCkKLSAgICAgICAgbW92ZSAgICAkZnAsJHNwCi0gICAgICAgIGphbCAgICAgX19tYWluCi0gICAgICAgIGxpICAgICAgJDIsMiAgICAgICAgICAgICAgICAgICAgIyAweDIKLSAgICAgICAgc3cgICAgICAkMiwwKCRmcCkKLSAgICAgICAgbHcgICAgICAkMiwwKCRmcCkKLSAgICAgICAgbW92ZSAgICAkMywkMgotICAgICAgICBzbGwgICAgICQ0LCQzLDEKLSAgICAgICAgYWRkdSAgICAkMiwkNCwkMgotICAgICAgICBzdyAgICAgICQyLDQoJGZwKQotICAgICAgICBsdyAgICAgICQ0LDQoJGZwKQotICAgICAgICBqYWwgICAgIGcKLSAgICAgICAgbHcgICAgICAkMywwKCRmcCkKLSAgICAgICAgbW92ZSAgICAkMiwkMwotICAgICAgICBiICAgICAgICRMMQotJEwxOgotICAgICAgICBtb3ZlICAgICRzcCwkZnAKLSAgICAgICAgbGQgICAgICAkMzEsMjQoJHNwKQotICAgICAgICBsZCAgICAgICRmcCwxNigkc3ApCi0gICAgICAgIGFkZHUgICAgJHNwLCRzcCwzMgotICAgICAgICBqICAgICAgICQzMQotICAgICAgICAuZW5kICAgIG1haW4KLSAgICAgICAgLmFsaWduICAyCi0gICAgICAgIC5nbG9ibCAgZwotICAgICAgICAuZW50ICAgIGcKLWc6Ci0gICAgICAgIC5mcmFtZSAgJGZwLDMyLCQzMSAgICAgICAgICAgICAgIyB2YXJzPSAxNiwgcmVncz0gMS8wLCBhcmdzPSAwLCBleHRyYT0gMAotICAgICAgICAubWFzayAgIDB4NDAwMDAwMDAsLTE2Ci0gICAgICAgIC5mbWFzayAgMHgwMDAwMDAwMCwwCi0gICAgICAgIHN1YnUgICAgJHNwLCRzcCwzMgotICAgICAgICBzZCAgICAgICRmcCwxNigkc3ApCi0gICAgICAgIG1vdmUgICAgJGZwLCRzcAotICAgICAgICBzdyAgICAgICQ0LDAoJGZwKQotICAgICAgICBsdyAgICAgICQyLDAoJGZwKQotICAgICAgICBhZGR1ICAgICQzLCQyLDEKLSAgICAgICAgbW92ZSAgICAkMiwkMwotICAgICAgICBiICAgICAgICRMMgotJEwyOgotICAgICAgICBtb3ZlICAgICRzcCwkZnAKLSAgICAgICAgbGQgICAgICAkZnAsMTYoJHNwKQotICAgICAgICBhZGR1ICAgICRzcCwkc3AsMzIKLSAgICAgICAgaiAgICAgICAkMzEKLSAgICAgICAgLmVuZCAgICBnCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1MjY5ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLSMKLSMgU29tZSBnZW5lcmljIE1JUFMgdGVzdHMKLSMKLWlmIFtpc3RhcmdldCBtaXBzKi0qLSpdIHRoZW4gewotICAgIHNldCBub19taXBzMTYgMAotICAgIHNldCBzdnI0cGljIFtleHByIFtpc3RhcmdldCAqLSotZWxmKl0gfHwgW2lzdGFyZ2V0ICotKi1pcml4NSpdIHx8IFtpc3RhcmdldCAqLSotaXJpeDYqIF0gXQotICAgIHNldCBlbXBpYyBbZXhwciBbaXN0YXJnZXQgKi0qLWVjb2ZmKl0gfHwgW2lzdGFyZ2V0ICotKi11bHRyaXgqXSB8fCBbaXN0YXJnZXQgKi0qLWlyaXhcWzEtNFxdKl0gXQotICAgIHNldCBhb3V0IFtleHByIFtpc3RhcmdldCAqLSotYnNkKl0gfHwgW2lzdGFyZ2V0ICotKi1uZXRic2QqXSB8fCBbaXN0YXJnZXQgKi0qLW9wZW5ic2QqXV0KLSAgICBzZXQgaWxvY2tzIFtpc3RhcmdldCBtaXBzdHgzOSotKi0qXQotICAgIHNldCBncHJfaWxvY2tzIFtleHByIFtpc3RhcmdldCBtaXBzdHgzOSotKi0qXV0KLSAgICBzZXQgYWRkcjMyIFtleHByIFtpc3RhcmdldCBtaXBzdHgzOSotKi0qXV0KLQotCi0KLQotCi0gICAgcnVuX2R1bXBfdGVzdCAiYWJzIgotICAgIHJ1bl9kdW1wX3Rlc3QgImFkZCIKLSAgICBydW5fZHVtcF90ZXN0ICJhbmQiCi0gICAgcnVuX2R1bXBfdGVzdCAiYnJlYWsyMCIKLSAgICBydW5fZHVtcF90ZXN0ICJ0cmFwMjAiCi0gICAgcnVuX2R1bXBfdGVzdCAiYmVxIgotICAgIHJ1bl9kdW1wX3Rlc3QgImJnZSIKLSAgICBydW5fZHVtcF90ZXN0ICJiZ2V1IgotICAgIHJ1bl9kdW1wX3Rlc3QgImJsdCIKLSAgICBydW5fZHVtcF90ZXN0ICJibHR1IgotICAgIGlmICEkaWxvY2tzIHsgcnVuX2R1bXBfdGVzdCAiZGl2IiB9IGVsc2UgeyBydW5fZHVtcF90ZXN0ICJkaXYtaWxvY2tzIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAiZGxpIgotICAgIHJ1bl9kdW1wX3Rlc3QgImphbCIKLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImphbC1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJqYWwteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImphbC1lbXBpYyIgfQotICAgIGlmICEkYW91dCB7IHJ1bl9kdW1wX3Rlc3QgImxhIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsYS1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJsYS14Z290IiB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGEtZW1waWMiIH0KLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJsYiIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGItc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsKLQkjIEJvdGggdmVyc2lvbnMgc3BlY2lmeSB0aGUgY3B1LCBzbyB3ZSBjYW4gcnVuIGJvdGggcmVnYXJkbGVzcyBvZgotCSMgdGhlIGludGVybG9ja2luZyBpbiB0aGUgY29uZmlndXJlZCBkZWZhdWx0IGNwdS4KLQlydW5fZHVtcF90ZXN0ICJsYi14Z290IgotCXJ1bl9kdW1wX3Rlc3QgImxiLXhnb3QtaWxvY2tzIgotICAgIH0KLSAgICBpZiAkZW1waWMgeyBydW5fZHVtcF90ZXN0ICJsYi1lbXBpYyIgfQotICAgIGlmICEkYW91dCB7IAotICAgICAgICBpZiAhJGdwcl9pbG9ja3MgeyAKLSAgICAgICAgICAgIHJ1bl9kdW1wX3Rlc3QgImxkIiAKLSAgICAgICAgfSBlbHNlIHsgCi0gICAgICAgICAgICBpZiAhJGFkZHIzMiB7Ci0gICAgICAgICAgICAgICAgcnVuX2R1bXBfdGVzdCAibGQtaWxvY2tzIgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBydW5fZHVtcF90ZXN0ICJsZC1pbG9ja3MtYWRkcjMyIgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGQtc3ZyNHBpYyIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGQteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxkLWVtcGljIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAibGkiCi0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAibGlmbG9hdCIgfQotICAgIGlmICRzdnI0cGljIHsgcnVuX2R1bXBfdGVzdCAibGlmLXN2cjRwaWMiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgImxpZi14Z290IiB9Ci0gICAgaWYgJGVtcGljIHsgcnVuX2R1bXBfdGVzdCAibGlmLWVtcGljIiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAibWlwczQiCi0gICAgaWYgISRpbG9ja3MgeyBydW5fZHVtcF90ZXN0ICJtdWwiIH0gZWxzZSB7IHJ1bl9kdW1wX3Rlc3QgIm11bC1pbG9ja3MiIH0KLSAgICBydW5fZHVtcF90ZXN0ICJyb2wiCi0gICAgaWYgISRhb3V0IHsgcnVuX2R1bXBfdGVzdCAic2IiIH0KLSAgICBydW5fZHVtcF90ZXN0ICJ0cnVuYyIKLSAgICBpZiAhJGFvdXQgeyBydW5fZHVtcF90ZXN0ICJ1bGgiIH0KLSAgICBpZiAkc3ZyNHBpYyB7IHJ1bl9kdW1wX3Rlc3QgInVsaC1zdnI0cGljIiB9Ci0gICAgaWYgJHN2cjRwaWMgeyBydW5fZHVtcF90ZXN0ICJ1bGgteGdvdCIgfQotICAgIGlmICRlbXBpYyB7IHJ1bl9kdW1wX3Rlc3QgInVsaC1lbXBpYyIgfQotICAgIGlmICEkYW91dCB7Ci0JcnVuX2R1bXBfdGVzdCAidWx3IgotCXJ1bl9kdW1wX3Rlc3QgInVsZCIKLQlydW5fZHVtcF90ZXN0ICJ1c2giCi0JcnVuX2R1bXBfdGVzdCAidXN3IgotCXJ1bl9kdW1wX3Rlc3QgInVzZCIKLSAgICB9Ci0gICAgIyBUaGUgbWlwczE2IHRlc3QgY2FuIG9ubHkgYmUgcnVuIG9uIEVMRiwgYmVjYXVzZSBvbmx5IEVMRgotICAgICMgc3VwcG9ydHMgdGhlIG5lY2Vzc2FyeSBtaXBzMTYgcmVsb2MuCi0gICAgaWYgeyAkc3ZyNHBpYyAmJiAhJG5vX21pcHMxNiB9IHsgcnVuX2R1bXBfdGVzdCAibWlwczE2IiB9Ci0gICAgcnVuX2R1bXBfdGVzdCAiZGVsYXkiCi0gICAgcnVuX2R1bXBfdGVzdCAibm9kZWxheSIKLSAgICBydW5fZHVtcF90ZXN0ICJtaXBzNDAxMCIKLSAgICBydW5fZHVtcF90ZXN0ICJtaXBzNDY1MCIKLSAgICBydW5fZHVtcF90ZXN0ICJtaXBzNDEwMCIKLSAgICBydW5fZHVtcF90ZXN0ICJsaW5lbm8iCi0gICAgcnVuX2R1bXBfdGVzdCAic3luYyIKLQotICAgICMgTWFrZSBzdXJlIHRoYXQgLW1jcHU9Rk9PIGFuZCAtbUZPTyBhcmUgZXF1aXZhbGVudC4gIEFzc2VtYmxlIGEgZmlsZQotICAgICMgY29udGFpbmluZyA0NjUwLXNwZWNpZmljIGluc3RydWN0aW9ucyB3aXRoIC1tNDY1MCBhbmQgLW1jcHU9NDY1MCwKLSAgICAjIGFuZCB2ZXJpZnkgdGhhdCB0aGV5J3JlIHRoZSBzYW1lLiAgU3BlY2lmaWNhbGx5LCB3ZSdyZSBjaGVja2luZwotICAgICMgdGhhdCB0aGUgRUZfTUlQU19NQUNIIGZpZWxkIGlzIHNldCwgYW5kIHRoYXQgdGhlIDQ2NTAgJ211bCcKLSAgICAjIGluc3RydWN0aW9uIGRvZXMgZ2V0IHVzZWQuICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBHQVMsIAotICAgICMgb25seSAtbWNwdT00NjUwIHdvdWxkIHNldCB0aGUgRUZfTUlQU19NQUNIIGZpZWxkOyAtbTQ2NTAgd291bGRuJ3QuCi0gICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3MxIgotICAgIHJ1bl9kdW1wX3Rlc3QgImVsZl9lX2ZsYWdzMiIKLSAgICBydW5fZHVtcF90ZXN0ICJlbGZfZV9mbGFnczMiCi0gICAgcnVuX2R1bXBfdGVzdCAiZWxmX2VfZmxhZ3M0IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczE2LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YzFhMGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYuZAorKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC1tbWlwczo0MDAwCi0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotI25hbWU6IG1pcHMxNgotCi0jIFRlc3QgdGhlIG1pcHMxNiBpbnN0cnVjdGlvbiBzZXQuCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAwMDAgPGRhdGExPjoKLSAgIDA6CTAwMDAwMDAwIAlub3AKLQotMCswMDAwMDQgPGluc25zMT46Ci0gICA0OgkzYjQwICAgICAgCWxkCVwkdjAsMFwoXCR2MVwpCi0gICA2OglmMDAwIDNiNDEgCWxkCVwkdjAsMVwoXCR2MVwpCi0gICBhOglmMDAwIDNiNDIgCWxkCVwkdjAsMlwoXCR2MVwpCi0gICBlOglmMDAwIDNiNDMgCWxkCVwkdjAsM1woXCR2MVwpCi0gIDEyOglmMDAwIDNiNDQgCWxkCVwkdjAsNFwoXCR2MVwpCi0gIDE2OgkzYjQxICAgICAgCWxkCVwkdjAsOFwoXCR2MVwpCi0gIDE4OgkzYjQyICAgICAgCWxkCVwkdjAsMTZcKFwkdjFcKQotICAxYToJM2I0NCAgICAgIAlsZAlcJHYwLDMyXChcJHYxXCkKLSAgMWM6CTNiNDggICAgICAJbGQJXCR2MCw2NFwoXCR2MVwpCi0gIDFlOgkzYjUwICAgICAgCWxkCVwkdjAsMTI4XChcJHYxXCkKLSAgMjA6CWYxMDAgM2I0MCAJbGQJXCR2MCwyNTZcKFwkdjFcKQotICAyNDoJZjIwMCAzYjQwIAlsZAlcJHYwLDUxMlwoXCR2MVwpCi0gIDI4OglmNDAwIDNiNDAgCWxkCVwkdjAsMTAyNFwoXCR2MVwpCi0gIDJjOglmMDAxIDNiNDAgCWxkCVwkdjAsMjA0OFwoXCR2MVwpCi0gIDMwOglmN2ZmIDNiNWYgCWxkCVwkdjAsLTFcKFwkdjFcKQotICAzNDoJZjdmZiAzYjVlIAlsZAlcJHYwLC0yXChcJHYxXCkKLSAgMzg6CWY3ZmYgM2I1ZCAJbGQJXCR2MCwtM1woXCR2MVwpCi0gIDNjOglmN2ZmIDNiNWMgCWxkCVwkdjAsLTRcKFwkdjFcKQotICA0MDoJZjdmZiAzYjU4IAlsZAlcJHYwLC04XChcJHYxXCkKLSAgNDQ6CWY3ZmYgM2I1MCAJbGQJXCR2MCwtMTZcKFwkdjFcKQotICA0ODoJZjdmZiAzYjQwIAlsZAlcJHYwLC0zMlwoXCR2MVwpCi0gIDRjOglmN2RmIDNiNDAgCWxkCVwkdjAsLTY0XChcJHYxXCkKLSAgNTA6CWY3OWYgM2I0MCAJbGQJXCR2MCwtMTI4XChcJHYxXCkKLSAgNTQ6CWY3MWYgM2I0MCAJbGQJXCR2MCwtMjU2XChcJHYxXCkKLSAgNTg6CWY2MWYgM2I0MCAJbGQJXCR2MCwtNTEyXChcJHYxXCkKLSAgNWM6CWY0MWYgM2I0MCAJbGQJXCR2MCwtMTAyNFwoXCR2MVwpCi0gIDYwOglmMDFmIDNiNDAgCWxkCVwkdjAsLTIwNDhcKFwkdjFcKQotICA2NDoJZjdiZiBmYzQwIAlsZAlcJHYwLDAgPGRhdGExPgotICA2ODoJZjZhMCBmYzU0IAlsZAlcJHYwLDcxYyA8ZGF0YTI+Ci0gIDZjOglmMDAxIGZjNDAgCWxkCVwkdjAsODY4IDxiYXI+Ci0gIDcwOglmMGMxIGZjNDAgCWxkCVwkdjAsOTMwIDxxdXV4PgotICA3NDoJZjg0MCAgICAgIAlsZAlcJHYwLDBcKFwkc3BcKQotICA3NjoJZjAwMCBmODQxIAlsZAlcJHYwLDFcKFwkc3BcKQotICA3YToJZjAwMCBmODQyIAlsZAlcJHYwLDJcKFwkc3BcKQotICA3ZToJZjAwMCBmODQzIAlsZAlcJHYwLDNcKFwkc3BcKQotICA4MjoJZjAwMCBmODQ0IAlsZAlcJHYwLDRcKFwkc3BcKQotICA4NjoJZjg0MSAgICAgIAlsZAlcJHYwLDhcKFwkc3BcKQotICA4ODoJZjg0MiAgICAgIAlsZAlcJHYwLDE2XChcJHNwXCkKLSAgOGE6CWY4NDQgICAgICAJbGQJXCR2MCwzMlwoXCRzcFwpCi0gIDhjOglmODQ4ICAgICAgCWxkCVwkdjAsNjRcKFwkc3BcKQotICA4ZToJZjg1MCAgICAgIAlsZAlcJHYwLDEyOFwoXCRzcFwpCi0gIDkwOglmMTAwIGY4NDAgCWxkCVwkdjAsMjU2XChcJHNwXCkKLSAgOTQ6CWYyMDAgZjg0MCAJbGQJXCR2MCw1MTJcKFwkc3BcKQotICA5ODoJZjQwMCBmODQwIAlsZAlcJHYwLDEwMjRcKFwkc3BcKQotICA5YzoJZjAwMSBmODQwIAlsZAlcJHYwLDIwNDhcKFwkc3BcKQotICBhMDoJZjdmZiBmODVmIAlsZAlcJHYwLC0xXChcJHNwXCkKLSAgYTQ6CWY3ZmYgZjg1ZSAJbGQJXCR2MCwtMlwoXCRzcFwpCi0gIGE4OglmN2ZmIGY4NWQgCWxkCVwkdjAsLTNcKFwkc3BcKQotICBhYzoJZjdmZiBmODVjIAlsZAlcJHYwLC00XChcJHNwXCkKLSAgYjA6CWY3ZmYgZjg1OCAJbGQJXCR2MCwtOFwoXCRzcFwpCi0gIGI0OglmN2ZmIGY4NTAgCWxkCVwkdjAsLTE2XChcJHNwXCkKLSAgYjg6CWY3ZmYgZjg0MCAJbGQJXCR2MCwtMzJcKFwkc3BcKQotICBiYzoJZjdkZiBmODQwIAlsZAlcJHYwLC02NFwoXCRzcFwpCi0gIGMwOglmNzlmIGY4NDAgCWxkCVwkdjAsLTEyOFwoXCRzcFwpCi0gIGM0OglmNzFmIGY4NDAgCWxkCVwkdjAsLTI1NlwoXCRzcFwpCi0gIGM4OglmNjFmIGY4NDAgCWxkCVwkdjAsLTUxMlwoXCRzcFwpCi0gIGNjOglmNDFmIGY4NDAgCWxkCVwkdjAsLTEwMjRcKFwkc3BcKQotICBkMDoJZjAxZiBmODQwIAlsZAlcJHYwLC0yMDQ4XChcJHNwXCkKLSAgZDQ6CWJiNDAgICAgICAJbHd1CVwkdjAsMFwoXCR2MVwpCi0gIGQ2OglmMDAwIGJiNDEgCWx3dQlcJHYwLDFcKFwkdjFcKQotICBkYToJZjAwMCBiYjQyIAlsd3UJXCR2MCwyXChcJHYxXCkKLSAgZGU6CWYwMDAgYmI0MyAJbHd1CVwkdjAsM1woXCR2MVwpCi0gIGUyOgliYjQxICAgICAgCWx3dQlcJHYwLDRcKFwkdjFcKQotICBlNDoJYmI0MiAgICAgIAlsd3UJXCR2MCw4XChcJHYxXCkKLSAgZTY6CWJiNDQgICAgICAJbHd1CVwkdjAsMTZcKFwkdjFcKQotICBlODoJYmI0OCAgICAgIAlsd3UJXCR2MCwzMlwoXCR2MVwpCi0gIGVhOgliYjUwICAgICAgCWx3dQlcJHYwLDY0XChcJHYxXCkKLSAgZWM6CWYwODAgYmI0MCAJbHd1CVwkdjAsMTI4XChcJHYxXCkKLSAgZjA6CWYxMDAgYmI0MCAJbHd1CVwkdjAsMjU2XChcJHYxXCkKLSAgZjQ6CWYyMDAgYmI0MCAJbHd1CVwkdjAsNTEyXChcJHYxXCkKLSAgZjg6CWY0MDAgYmI0MCAJbHd1CVwkdjAsMTAyNFwoXCR2MVwpCi0gIGZjOglmMDAxIGJiNDAgCWx3dQlcJHYwLDIwNDhcKFwkdjFcKQotIDEwMDoJZjdmZiBiYjVmIAlsd3UJXCR2MCwtMVwoXCR2MVwpCi0gMTA0OglmN2ZmIGJiNWUgCWx3dQlcJHYwLC0yXChcJHYxXCkKLSAxMDg6CWY3ZmYgYmI1ZCAJbHd1CVwkdjAsLTNcKFwkdjFcKQotIDEwYzoJZjdmZiBiYjVjIAlsd3UJXCR2MCwtNFwoXCR2MVwpCi0gMTEwOglmN2ZmIGJiNTggCWx3dQlcJHYwLC04XChcJHYxXCkKLSAxMTQ6CWY3ZmYgYmI1MCAJbHd1CVwkdjAsLTE2XChcJHYxXCkKLSAxMTg6CWY3ZmYgYmI0MCAJbHd1CVwkdjAsLTMyXChcJHYxXCkKLSAxMWM6CWY3ZGYgYmI0MCAJbHd1CVwkdjAsLTY0XChcJHYxXCkKLSAxMjA6CWY3OWYgYmI0MCAJbHd1CVwkdjAsLTEyOFwoXCR2MVwpCi0gMTI0OglmNzFmIGJiNDAgCWx3dQlcJHYwLC0yNTZcKFwkdjFcKQotIDEyODoJZjYxZiBiYjQwIAlsd3UJXCR2MCwtNTEyXChcJHYxXCkKLSAxMmM6CWY0MWYgYmI0MCAJbHd1CVwkdjAsLTEwMjRcKFwkdjFcKQotIDEzMDoJZjAxZiBiYjQwIAlsd3UJXCR2MCwtMjA0OFwoXCR2MVwpCi0gMTM0Ogk5YjQwICAgICAgCWx3CVwkdjAsMFwoXCR2MVwpCi0gMTM2OglmMDAwIDliNDEgCWx3CVwkdjAsMVwoXCR2MVwpCi0gMTNhOglmMDAwIDliNDIgCWx3CVwkdjAsMlwoXCR2MVwpCi0gMTNlOglmMDAwIDliNDMgCWx3CVwkdjAsM1woXCR2MVwpCi0gMTQyOgk5YjQxICAgICAgCWx3CVwkdjAsNFwoXCR2MVwpCi0gMTQ0Ogk5YjQyICAgICAgCWx3CVwkdjAsOFwoXCR2MVwpCi0gMTQ2Ogk5YjQ0ICAgICAgCWx3CVwkdjAsMTZcKFwkdjFcKQotIDE0ODoJOWI0OCAgICAgIAlsdwlcJHYwLDMyXChcJHYxXCkKLSAxNGE6CTliNTAgICAgICAJbHcJXCR2MCw2NFwoXCR2MVwpCi0gMTRjOglmMDgwIDliNDAgCWx3CVwkdjAsMTI4XChcJHYxXCkKLSAxNTA6CWYxMDAgOWI0MCAJbHcJXCR2MCwyNTZcKFwkdjFcKQotIDE1NDoJZjIwMCA5YjQwIAlsdwlcJHYwLDUxMlwoXCR2MVwpCi0gMTU4OglmNDAwIDliNDAgCWx3CVwkdjAsMTAyNFwoXCR2MVwpCi0gMTVjOglmMDAxIDliNDAgCWx3CVwkdjAsMjA0OFwoXCR2MVwpCi0gMTYwOglmN2ZmIDliNWYgCWx3CVwkdjAsLTFcKFwkdjFcKQotIDE2NDoJZjdmZiA5YjVlIAlsdwlcJHYwLC0yXChcJHYxXCkKLSAxNjg6CWY3ZmYgOWI1ZCAJbHcJXCR2MCwtM1woXCR2MVwpCi0gMTZjOglmN2ZmIDliNWMgCWx3CVwkdjAsLTRcKFwkdjFcKQotIDE3MDoJZjdmZiA5YjU4IAlsdwlcJHYwLC04XChcJHYxXCkKLSAxNzQ6CWY3ZmYgOWI1MCAJbHcJXCR2MCwtMTZcKFwkdjFcKQotIDE3ODoJZjdmZiA5YjQwIAlsdwlcJHYwLC0zMlwoXCR2MVwpCi0gMTdjOglmN2RmIDliNDAgCWx3CVwkdjAsLTY0XChcJHYxXCkKLSAxODA6CWY3OWYgOWI0MCAJbHcJXCR2MCwtMTI4XChcJHYxXCkKLSAxODQ6CWY3MWYgOWI0MCAJbHcJXCR2MCwtMjU2XChcJHYxXCkKLSAxODg6CWY2MWYgOWI0MCAJbHcJXCR2MCwtNTEyXChcJHYxXCkKLSAxOGM6CWY0MWYgOWI0MCAJbHcJXCR2MCwtMTAyNFwoXCR2MVwpCi0gMTkwOglmMDFmIDliNDAgCWx3CVwkdjAsLTIwNDhcKFwkdjFcKQotIDE5NDoJZjY3ZiBiMjBjIAlsdwlcJHYwLDAgPGRhdGExPgotIDE5ODoJZjU4MCBiMjA0IAlsdwlcJHYwLDcxYyA8ZGF0YTI+Ci0gMTljOglmNmMwIGIyMGMgCWx3CVwkdjAsODY4IDxiYXI+Ci0gMWEwOglmNzgwIGIyMTAgCWx3CVwkdjAsOTMwIDxxdXV4PgotIDFhNDoJOTIwMCAgICAgIAlsdwlcJHYwLDBcKFwkc3BcKQotIDFhNjoJZjAwMCA5MjAxIAlsdwlcJHYwLDFcKFwkc3BcKQotIDFhYToJZjAwMCA5MjAyIAlsdwlcJHYwLDJcKFwkc3BcKQotIDFhZToJZjAwMCA5MjAzIAlsdwlcJHYwLDNcKFwkc3BcKQotIDFiMjoJOTIwMSAgICAgIAlsdwlcJHYwLDRcKFwkc3BcKQotIDFiNDoJOTIwMiAgICAgIAlsdwlcJHYwLDhcKFwkc3BcKQotIDFiNjoJOTIwNCAgICAgIAlsdwlcJHYwLDE2XChcJHNwXCkKLSAxYjg6CTkyMDggICAgICAJbHcJXCR2MCwzMlwoXCRzcFwpCi0gMWJhOgk5MjEwICAgICAgCWx3CVwkdjAsNjRcKFwkc3BcKQotIDFiYzoJOTIyMCAgICAgIAlsdwlcJHYwLDEyOFwoXCRzcFwpCi0gMWJlOgk5MjQwICAgICAgCWx3CVwkdjAsMjU2XChcJHNwXCkKLSAxYzA6CTkyODAgICAgICAJbHcJXCR2MCw1MTJcKFwkc3BcKQotIDFjMjoJZjQwMCA5MjAwIAlsdwlcJHYwLDEwMjRcKFwkc3BcKQotIDFjNjoJZjAwMSA5MjAwIAlsdwlcJHYwLDIwNDhcKFwkc3BcKQotIDFjYToJZjdmZiA5MjFmIAlsdwlcJHYwLC0xXChcJHNwXCkKLSAxY2U6CWY3ZmYgOTIxZSAJbHcJXCR2MCwtMlwoXCRzcFwpCi0gMWQyOglmN2ZmIDkyMWQgCWx3CVwkdjAsLTNcKFwkc3BcKQotIDFkNjoJZjdmZiA5MjFjIAlsdwlcJHYwLC00XChcJHNwXCkKLSAxZGE6CWY3ZmYgOTIxOCAJbHcJXCR2MCwtOFwoXCRzcFwpCi0gMWRlOglmN2ZmIDkyMTAgCWx3CVwkdjAsLTE2XChcJHNwXCkKLSAxZTI6CWY3ZmYgOTIwMCAJbHcJXCR2MCwtMzJcKFwkc3BcKQotIDFlNjoJZjdkZiA5MjAwIAlsdwlcJHYwLC02NFwoXCRzcFwpCi0gMWVhOglmNzlmIDkyMDAgCWx3CVwkdjAsLTEyOFwoXCRzcFwpCi0gMWVlOglmNzFmIDkyMDAgCWx3CVwkdjAsLTI1NlwoXCRzcFwpCi0gMWYyOglmNjFmIDkyMDAgCWx3CVwkdjAsLTUxMlwoXCRzcFwpCi0gMWY2OglmNDFmIDkyMDAgCWx3CVwkdjAsLTEwMjRcKFwkc3BcKQotIDFmYToJZjAxZiA5MjAwIAlsdwlcJHYwLC0yMDQ4XChcJHNwXCkKLSAxZmU6CThiNDAgICAgICAJbGgJXCR2MCwwXChcJHYxXCkKLSAyMDA6CWYwMDAgOGI0MSAJbGgJXCR2MCwxXChcJHYxXCkKLSAyMDQ6CThiNDEgICAgICAJbGgJXCR2MCwyXChcJHYxXCkKLSAyMDY6CWYwMDAgOGI0MyAJbGgJXCR2MCwzXChcJHYxXCkKLSAyMGE6CThiNDIgICAgICAJbGgJXCR2MCw0XChcJHYxXCkKLSAyMGM6CThiNDQgICAgICAJbGgJXCR2MCw4XChcJHYxXCkKLSAyMGU6CThiNDggICAgICAJbGgJXCR2MCwxNlwoXCR2MVwpCi0gMjEwOgk4YjUwICAgICAgCWxoCVwkdjAsMzJcKFwkdjFcKQotIDIxMjoJZjA0MCA4YjQwIAlsaAlcJHYwLDY0XChcJHYxXCkKLSAyMTY6CWYwODAgOGI0MCAJbGgJXCR2MCwxMjhcKFwkdjFcKQotIDIxYToJZjEwMCA4YjQwIAlsaAlcJHYwLDI1NlwoXCR2MVwpCi0gMjFlOglmMjAwIDhiNDAgCWxoCVwkdjAsNTEyXChcJHYxXCkKLSAyMjI6CWY0MDAgOGI0MCAJbGgJXCR2MCwxMDI0XChcJHYxXCkKLSAyMjY6CWYwMDEgOGI0MCAJbGgJXCR2MCwyMDQ4XChcJHYxXCkKLSAyMmE6CWY3ZmYgOGI1ZiAJbGgJXCR2MCwtMVwoXCR2MVwpCi0gMjJlOglmN2ZmIDhiNWUgCWxoCVwkdjAsLTJcKFwkdjFcKQotIDIzMjoJZjdmZiA4YjVkIAlsaAlcJHYwLC0zXChcJHYxXCkKLSAyMzY6CWY3ZmYgOGI1YyAJbGgJXCR2MCwtNFwoXCR2MVwpCi0gMjNhOglmN2ZmIDhiNTggCWxoCVwkdjAsLThcKFwkdjFcKQotIDIzZToJZjdmZiA4YjUwIAlsaAlcJHYwLC0xNlwoXCR2MVwpCi0gMjQyOglmN2ZmIDhiNDAgCWxoCVwkdjAsLTMyXChcJHYxXCkKLSAyNDY6CWY3ZGYgOGI0MCAJbGgJXCR2MCwtNjRcKFwkdjFcKQotIDI0YToJZjc5ZiA4YjQwIAlsaAlcJHYwLC0xMjhcKFwkdjFcKQotIDI0ZToJZjcxZiA4YjQwIAlsaAlcJHYwLC0yNTZcKFwkdjFcKQotIDI1MjoJZjYxZiA4YjQwIAlsaAlcJHYwLC01MTJcKFwkdjFcKQotIDI1NjoJZjQxZiA4YjQwIAlsaAlcJHYwLC0xMDI0XChcJHYxXCkKLSAyNWE6CWYwMWYgOGI0MCAJbGgJXCR2MCwtMjA0OFwoXCR2MVwpCi0gMjVlOglhYjQwICAgICAgCWxodQlcJHYwLDBcKFwkdjFcKQotIDI2MDoJZjAwMCBhYjQxIAlsaHUJXCR2MCwxXChcJHYxXCkKLSAyNjQ6CWFiNDEgICAgICAJbGh1CVwkdjAsMlwoXCR2MVwpCi0gMjY2OglmMDAwIGFiNDMgCWxodQlcJHYwLDNcKFwkdjFcKQotIDI2YToJYWI0MiAgICAgIAlsaHUJXCR2MCw0XChcJHYxXCkKLSAyNmM6CWFiNDQgICAgICAJbGh1CVwkdjAsOFwoXCR2MVwpCi0gMjZlOglhYjQ4ICAgICAgCWxodQlcJHYwLDE2XChcJHYxXCkKLSAyNzA6CWFiNTAgICAgICAJbGh1CVwkdjAsMzJcKFwkdjFcKQotIDI3MjoJZjA0MCBhYjQwIAlsaHUJXCR2MCw2NFwoXCR2MVwpCi0gMjc2OglmMDgwIGFiNDAgCWxodQlcJHYwLDEyOFwoXCR2MVwpCi0gMjdhOglmMTAwIGFiNDAgCWxodQlcJHYwLDI1NlwoXCR2MVwpCi0gMjdlOglmMjAwIGFiNDAgCWxodQlcJHYwLDUxMlwoXCR2MVwpCi0gMjgyOglmNDAwIGFiNDAgCWxodQlcJHYwLDEwMjRcKFwkdjFcKQotIDI4NjoJZjAwMSBhYjQwIAlsaHUJXCR2MCwyMDQ4XChcJHYxXCkKLSAyOGE6CWY3ZmYgYWI1ZiAJbGh1CVwkdjAsLTFcKFwkdjFcKQotIDI4ZToJZjdmZiBhYjVlIAlsaHUJXCR2MCwtMlwoXCR2MVwpCi0gMjkyOglmN2ZmIGFiNWQgCWxodQlcJHYwLC0zXChcJHYxXCkKLSAyOTY6CWY3ZmYgYWI1YyAJbGh1CVwkdjAsLTRcKFwkdjFcKQotIDI5YToJZjdmZiBhYjU4IAlsaHUJXCR2MCwtOFwoXCR2MVwpCi0gMjllOglmN2ZmIGFiNTAgCWxodQlcJHYwLC0xNlwoXCR2MVwpCi0gMmEyOglmN2ZmIGFiNDAgCWxodQlcJHYwLC0zMlwoXCR2MVwpCi0gMmE2OglmN2RmIGFiNDAgCWxodQlcJHYwLC02NFwoXCR2MVwpCi0gMmFhOglmNzlmIGFiNDAgCWxodQlcJHYwLC0xMjhcKFwkdjFcKQotIDJhZToJZjcxZiBhYjQwIAlsaHUJXCR2MCwtMjU2XChcJHYxXCkKLSAyYjI6CWY2MWYgYWI0MCAJbGh1CVwkdjAsLTUxMlwoXCR2MVwpCi0gMmI2OglmNDFmIGFiNDAgCWxodQlcJHYwLC0xMDI0XChcJHYxXCkKLSAyYmE6CWYwMWYgYWI0MCAJbGh1CVwkdjAsLTIwNDhcKFwkdjFcKQotIDJiZToJODM0MCAgICAgIAlsYglcJHYwLDBcKFwkdjFcKQotIDJjMDoJODM0MSAgICAgIAlsYglcJHYwLDFcKFwkdjFcKQotIDJjMjoJODM0MiAgICAgIAlsYglcJHYwLDJcKFwkdjFcKQotIDJjNDoJODM0MyAgICAgIAlsYglcJHYwLDNcKFwkdjFcKQotIDJjNjoJODM0NCAgICAgIAlsYglcJHYwLDRcKFwkdjFcKQotIDJjODoJODM0OCAgICAgIAlsYglcJHYwLDhcKFwkdjFcKQotIDJjYToJODM1MCAgICAgIAlsYglcJHYwLDE2XChcJHYxXCkKLSAyY2M6CWYwMjAgODM0MCAJbGIJXCR2MCwzMlwoXCR2MVwpCi0gMmQwOglmMDQwIDgzNDAgCWxiCVwkdjAsNjRcKFwkdjFcKQotIDJkNDoJZjA4MCA4MzQwIAlsYglcJHYwLDEyOFwoXCR2MVwpCi0gMmQ4OglmMTAwIDgzNDAgCWxiCVwkdjAsMjU2XChcJHYxXCkKLSAyZGM6CWYyMDAgODM0MCAJbGIJXCR2MCw1MTJcKFwkdjFcKQotIDJlMDoJZjQwMCA4MzQwIAlsYglcJHYwLDEwMjRcKFwkdjFcKQotIDJlNDoJZjAwMSA4MzQwIAlsYglcJHYwLDIwNDhcKFwkdjFcKQotIDJlODoJZjdmZiA4MzVmIAlsYglcJHYwLC0xXChcJHYxXCkKLSAyZWM6CWY3ZmYgODM1ZSAJbGIJXCR2MCwtMlwoXCR2MVwpCi0gMmYwOglmN2ZmIDgzNWQgCWxiCVwkdjAsLTNcKFwkdjFcKQotIDJmNDoJZjdmZiA4MzVjIAlsYglcJHYwLC00XChcJHYxXCkKLSAyZjg6CWY3ZmYgODM1OCAJbGIJXCR2MCwtOFwoXCR2MVwpCi0gMmZjOglmN2ZmIDgzNTAgCWxiCVwkdjAsLTE2XChcJHYxXCkKLSAzMDA6CWY3ZmYgODM0MCAJbGIJXCR2MCwtMzJcKFwkdjFcKQotIDMwNDoJZjdkZiA4MzQwIAlsYglcJHYwLC02NFwoXCR2MVwpCi0gMzA4OglmNzlmIDgzNDAgCWxiCVwkdjAsLTEyOFwoXCR2MVwpCi0gMzBjOglmNzFmIDgzNDAgCWxiCVwkdjAsLTI1NlwoXCR2MVwpCi0gMzEwOglmNjFmIDgzNDAgCWxiCVwkdjAsLTUxMlwoXCR2MVwpCi0gMzE0OglmNDFmIDgzNDAgCWxiCVwkdjAsLTEwMjRcKFwkdjFcKQotIDMxODoJZjAxZiA4MzQwIAlsYglcJHYwLC0yMDQ4XChcJHYxXCkKLSAzMWM6CWEzNDAgICAgICAJbGJ1CVwkdjAsMFwoXCR2MVwpCi0gMzFlOglhMzQxICAgICAgCWxidQlcJHYwLDFcKFwkdjFcKQotIDMyMDoJYTM0MiAgICAgIAlsYnUJXCR2MCwyXChcJHYxXCkKLSAzMjI6CWEzNDMgICAgICAJbGJ1CVwkdjAsM1woXCR2MVwpCi0gMzI0OglhMzQ0ICAgICAgCWxidQlcJHYwLDRcKFwkdjFcKQotIDMyNjoJYTM0OCAgICAgIAlsYnUJXCR2MCw4XChcJHYxXCkKLSAzMjg6CWEzNTAgICAgICAJbGJ1CVwkdjAsMTZcKFwkdjFcKQotIDMyYToJZjAyMCBhMzQwIAlsYnUJXCR2MCwzMlwoXCR2MVwpCi0gMzJlOglmMDQwIGEzNDAgCWxidQlcJHYwLDY0XChcJHYxXCkKLSAzMzI6CWYwODAgYTM0MCAJbGJ1CVwkdjAsMTI4XChcJHYxXCkKLSAzMzY6CWYxMDAgYTM0MCAJbGJ1CVwkdjAsMjU2XChcJHYxXCkKLSAzM2E6CWYyMDAgYTM0MCAJbGJ1CVwkdjAsNTEyXChcJHYxXCkKLSAzM2U6CWY0MDAgYTM0MCAJbGJ1CVwkdjAsMTAyNFwoXCR2MVwpCi0gMzQyOglmMDAxIGEzNDAgCWxidQlcJHYwLDIwNDhcKFwkdjFcKQotIDM0NjoJZjdmZiBhMzVmIAlsYnUJXCR2MCwtMVwoXCR2MVwpCi0gMzRhOglmN2ZmIGEzNWUgCWxidQlcJHYwLC0yXChcJHYxXCkKLSAzNGU6CWY3ZmYgYTM1ZCAJbGJ1CVwkdjAsLTNcKFwkdjFcKQotIDM1MjoJZjdmZiBhMzVjIAlsYnUJXCR2MCwtNFwoXCR2MVwpCi0gMzU2OglmN2ZmIGEzNTggCWxidQlcJHYwLC04XChcJHYxXCkKLSAzNWE6CWY3ZmYgYTM1MCAJbGJ1CVwkdjAsLTE2XChcJHYxXCkKLSAzNWU6CWY3ZmYgYTM0MCAJbGJ1CVwkdjAsLTMyXChcJHYxXCkKLSAzNjI6CWY3ZGYgYTM0MCAJbGJ1CVwkdjAsLTY0XChcJHYxXCkKLSAzNjY6CWY3OWYgYTM0MCAJbGJ1CVwkdjAsLTEyOFwoXCR2MVwpCi0gMzZhOglmNzFmIGEzNDAgCWxidQlcJHYwLC0yNTZcKFwkdjFcKQotIDM2ZToJZjYxZiBhMzQwIAlsYnUJXCR2MCwtNTEyXChcJHYxXCkKLSAzNzI6CWY0MWYgYTM0MCAJbGJ1CVwkdjAsLTEwMjRcKFwkdjFcKQotIDM3NjoJZjAxZiBhMzQwIAlsYnUJXCR2MCwtMjA0OFwoXCR2MVwpCi0gMzdhOgk3YjQwICAgICAgCXNkCVwkdjAsMFwoXCR2MVwpCi0gMzdjOglmMDAwIDdiNDEgCXNkCVwkdjAsMVwoXCR2MVwpCi0gMzgwOglmMDAwIDdiNDIgCXNkCVwkdjAsMlwoXCR2MVwpCi0gMzg0OglmMDAwIDdiNDMgCXNkCVwkdjAsM1woXCR2MVwpCi0gMzg4OglmMDAwIDdiNDQgCXNkCVwkdjAsNFwoXCR2MVwpCi0gMzhjOgk3YjQxICAgICAgCXNkCVwkdjAsOFwoXCR2MVwpCi0gMzhlOgk3YjQyICAgICAgCXNkCVwkdjAsMTZcKFwkdjFcKQotIDM5MDoJN2I0NCAgICAgIAlzZAlcJHYwLDMyXChcJHYxXCkKLSAzOTI6CTdiNDggICAgICAJc2QJXCR2MCw2NFwoXCR2MVwpCi0gMzk0Ogk3YjUwICAgICAgCXNkCVwkdjAsMTI4XChcJHYxXCkKLSAzOTY6CWYxMDAgN2I0MCAJc2QJXCR2MCwyNTZcKFwkdjFcKQotIDM5YToJZjIwMCA3YjQwIAlzZAlcJHYwLDUxMlwoXCR2MVwpCi0gMzllOglmNDAwIDdiNDAgCXNkCVwkdjAsMTAyNFwoXCR2MVwpCi0gM2EyOglmMDAxIDdiNDAgCXNkCVwkdjAsMjA0OFwoXCR2MVwpCi0gM2E2OglmN2ZmIDdiNWYgCXNkCVwkdjAsLTFcKFwkdjFcKQotIDNhYToJZjdmZiA3YjVlIAlzZAlcJHYwLC0yXChcJHYxXCkKLSAzYWU6CWY3ZmYgN2I1ZCAJc2QJXCR2MCwtM1woXCR2MVwpCi0gM2IyOglmN2ZmIDdiNWMgCXNkCVwkdjAsLTRcKFwkdjFcKQotIDNiNjoJZjdmZiA3YjU4IAlzZAlcJHYwLC04XChcJHYxXCkKLSAzYmE6CWY3ZmYgN2I1MCAJc2QJXCR2MCwtMTZcKFwkdjFcKQotIDNiZToJZjdmZiA3YjQwIAlzZAlcJHYwLC0zMlwoXCR2MVwpCi0gM2MyOglmN2RmIDdiNDAgCXNkCVwkdjAsLTY0XChcJHYxXCkKLSAzYzY6CWY3OWYgN2I0MCAJc2QJXCR2MCwtMTI4XChcJHYxXCkKLSAzY2E6CWY3MWYgN2I0MCAJc2QJXCR2MCwtMjU2XChcJHYxXCkKLSAzY2U6CWY2MWYgN2I0MCAJc2QJXCR2MCwtNTEyXChcJHYxXCkKLSAzZDI6CWY0MWYgN2I0MCAJc2QJXCR2MCwtMTAyNFwoXCR2MVwpCi0gM2Q2OglmMDFmIDdiNDAgCXNkCVwkdjAsLTIwNDhcKFwkdjFcKQotIDNkYToJZjk0MCAgICAgIAlzZAlcJHYwLDBcKFwkc3BcKQotIDNkYzoJZjAwMCBmOTQxIAlzZAlcJHYwLDFcKFwkc3BcKQotIDNlMDoJZjAwMCBmOTQyIAlzZAlcJHYwLDJcKFwkc3BcKQotIDNlNDoJZjAwMCBmOTQzIAlzZAlcJHYwLDNcKFwkc3BcKQotIDNlODoJZjAwMCBmOTQ0IAlzZAlcJHYwLDRcKFwkc3BcKQotIDNlYzoJZjk0MSAgICAgIAlzZAlcJHYwLDhcKFwkc3BcKQotIDNlZToJZjk0MiAgICAgIAlzZAlcJHYwLDE2XChcJHNwXCkKLSAzZjA6CWY5NDQgICAgICAJc2QJXCR2MCwzMlwoXCRzcFwpCi0gM2YyOglmOTQ4ICAgICAgCXNkCVwkdjAsNjRcKFwkc3BcKQotIDNmNDoJZjk1MCAgICAgIAlzZAlcJHYwLDEyOFwoXCRzcFwpCi0gM2Y2OglmMTAwIGY5NDAgCXNkCVwkdjAsMjU2XChcJHNwXCkKLSAzZmE6CWYyMDAgZjk0MCAJc2QJXCR2MCw1MTJcKFwkc3BcKQotIDNmZToJZjQwMCBmOTQwIAlzZAlcJHYwLDEwMjRcKFwkc3BcKQotIDQwMjoJZjAwMSBmOTQwIAlzZAlcJHYwLDIwNDhcKFwkc3BcKQotIDQwNjoJZjdmZiBmOTVmIAlzZAlcJHYwLC0xXChcJHNwXCkKLSA0MGE6CWY3ZmYgZjk1ZSAJc2QJXCR2MCwtMlwoXCRzcFwpCi0gNDBlOglmN2ZmIGY5NWQgCXNkCVwkdjAsLTNcKFwkc3BcKQotIDQxMjoJZjdmZiBmOTVjIAlzZAlcJHYwLC00XChcJHNwXCkKLSA0MTY6CWY3ZmYgZjk1OCAJc2QJXCR2MCwtOFwoXCRzcFwpCi0gNDFhOglmN2ZmIGY5NTAgCXNkCVwkdjAsLTE2XChcJHNwXCkKLSA0MWU6CWY3ZmYgZjk0MCAJc2QJXCR2MCwtMzJcKFwkc3BcKQotIDQyMjoJZjdkZiBmOTQwIAlzZAlcJHYwLC02NFwoXCRzcFwpCi0gNDI2OglmNzlmIGY5NDAgCXNkCVwkdjAsLTEyOFwoXCRzcFwpCi0gNDJhOglmNzFmIGY5NDAgCXNkCVwkdjAsLTI1NlwoXCRzcFwpCi0gNDJlOglmNjFmIGY5NDAgCXNkCVwkdjAsLTUxMlwoXCRzcFwpCi0gNDMyOglmNDFmIGY5NDAgCXNkCVwkdjAsLTEwMjRcKFwkc3BcKQotIDQzNjoJZjAxZiBmOTQwIAlzZAlcJHYwLC0yMDQ4XChcJHNwXCkKLSA0M2E6CWZhMDAgICAgICAJc2QJXCRyYSwwXChcJHNwXCkKLSA0M2M6CWYwMDAgZmEwMSAJc2QJXCRyYSwxXChcJHNwXCkKLSA0NDA6CWYwMDAgZmEwMiAJc2QJXCRyYSwyXChcJHNwXCkKLSA0NDQ6CWYwMDAgZmEwMyAJc2QJXCRyYSwzXChcJHNwXCkKLSA0NDg6CWYwMDAgZmEwNCAJc2QJXCRyYSw0XChcJHNwXCkKLSA0NGM6CWZhMDEgICAgICAJc2QJXCRyYSw4XChcJHNwXCkKLSA0NGU6CWZhMDIgICAgICAJc2QJXCRyYSwxNlwoXCRzcFwpCi0gNDUwOglmYTA0ICAgICAgCXNkCVwkcmEsMzJcKFwkc3BcKQotIDQ1MjoJZmEwOCAgICAgIAlzZAlcJHJhLDY0XChcJHNwXCkKLSA0NTQ6CWZhMTAgICAgICAJc2QJXCRyYSwxMjhcKFwkc3BcKQotIDQ1NjoJZmEyMCAgICAgIAlzZAlcJHJhLDI1NlwoXCRzcFwpCi0gNDU4OglmYTQwICAgICAgCXNkCVwkcmEsNTEyXChcJHNwXCkKLSA0NWE6CWZhODAgICAgICAJc2QJXCRyYSwxMDI0XChcJHNwXCkKLSA0NWM6CWYwMDEgZmEwMCAJc2QJXCRyYSwyMDQ4XChcJHNwXCkKLSA0NjA6CWY3ZmYgZmExZiAJc2QJXCRyYSwtMVwoXCRzcFwpCi0gNDY0OglmN2ZmIGZhMWUgCXNkCVwkcmEsLTJcKFwkc3BcKQotIDQ2ODoJZjdmZiBmYTFkIAlzZAlcJHJhLC0zXChcJHNwXCkKLSA0NmM6CWY3ZmYgZmExYyAJc2QJXCRyYSwtNFwoXCRzcFwpCi0gNDcwOglmN2ZmIGZhMTggCXNkCVwkcmEsLThcKFwkc3BcKQotIDQ3NDoJZjdmZiBmYTEwIAlzZAlcJHJhLC0xNlwoXCRzcFwpCi0gNDc4OglmN2ZmIGZhMDAgCXNkCVwkcmEsLTMyXChcJHNwXCkKLSA0N2M6CWY3ZGYgZmEwMCAJc2QJXCRyYSwtNjRcKFwkc3BcKQotIDQ4MDoJZjc5ZiBmYTAwIAlzZAlcJHJhLC0xMjhcKFwkc3BcKQotIDQ4NDoJZjcxZiBmYTAwIAlzZAlcJHJhLC0yNTZcKFwkc3BcKQotIDQ4ODoJZjYxZiBmYTAwIAlzZAlcJHJhLC01MTJcKFwkc3BcKQotIDQ4YzoJZjQxZiBmYTAwIAlzZAlcJHJhLC0xMDI0XChcJHNwXCkKLSA0OTA6CWYwMWYgZmEwMCAJc2QJXCRyYSwtMjA0OFwoXCRzcFwpCi0gNDk0OglkYjQwICAgICAgCXN3CVwkdjAsMFwoXCR2MVwpCi0gNDk2OglmMDAwIGRiNDEgCXN3CVwkdjAsMVwoXCR2MVwpCi0gNDlhOglmMDAwIGRiNDIgCXN3CVwkdjAsMlwoXCR2MVwpCi0gNDllOglmMDAwIGRiNDMgCXN3CVwkdjAsM1woXCR2MVwpCi0gNGEyOglkYjQxICAgICAgCXN3CVwkdjAsNFwoXCR2MVwpCi0gNGE0OglkYjQyICAgICAgCXN3CVwkdjAsOFwoXCR2MVwpCi0gNGE2OglkYjQ0ICAgICAgCXN3CVwkdjAsMTZcKFwkdjFcKQotIDRhODoJZGI0OCAgICAgIAlzdwlcJHYwLDMyXChcJHYxXCkKLSA0YWE6CWRiNTAgICAgICAJc3cJXCR2MCw2NFwoXCR2MVwpCi0gNGFjOglmMDgwIGRiNDAgCXN3CVwkdjAsMTI4XChcJHYxXCkKLSA0YjA6CWYxMDAgZGI0MCAJc3cJXCR2MCwyNTZcKFwkdjFcKQotIDRiNDoJZjIwMCBkYjQwIAlzdwlcJHYwLDUxMlwoXCR2MVwpCi0gNGI4OglmNDAwIGRiNDAgCXN3CVwkdjAsMTAyNFwoXCR2MVwpCi0gNGJjOglmMDAxIGRiNDAgCXN3CVwkdjAsMjA0OFwoXCR2MVwpCi0gNGMwOglmN2ZmIGRiNWYgCXN3CVwkdjAsLTFcKFwkdjFcKQotIDRjNDoJZjdmZiBkYjVlIAlzdwlcJHYwLC0yXChcJHYxXCkKLSA0Yzg6CWY3ZmYgZGI1ZCAJc3cJXCR2MCwtM1woXCR2MVwpCi0gNGNjOglmN2ZmIGRiNWMgCXN3CVwkdjAsLTRcKFwkdjFcKQotIDRkMDoJZjdmZiBkYjU4IAlzdwlcJHYwLC04XChcJHYxXCkKLSA0ZDQ6CWY3ZmYgZGI1MCAJc3cJXCR2MCwtMTZcKFwkdjFcKQotIDRkODoJZjdmZiBkYjQwIAlzdwlcJHYwLC0zMlwoXCR2MVwpCi0gNGRjOglmN2RmIGRiNDAgCXN3CVwkdjAsLTY0XChcJHYxXCkKLSA0ZTA6CWY3OWYgZGI0MCAJc3cJXCR2MCwtMTI4XChcJHYxXCkKLSA0ZTQ6CWY3MWYgZGI0MCAJc3cJXCR2MCwtMjU2XChcJHYxXCkKLSA0ZTg6CWY2MWYgZGI0MCAJc3cJXCR2MCwtNTEyXChcJHYxXCkKLSA0ZWM6CWY0MWYgZGI0MCAJc3cJXCR2MCwtMTAyNFwoXCR2MVwpCi0gNGYwOglmMDFmIGRiNDAgCXN3CVwkdjAsLTIwNDhcKFwkdjFcKQotIDRmNDoJZDIwMCAgICAgIAlzdwlcJHYwLDBcKFwkc3BcKQotIDRmNjoJZjAwMCBkMjAxIAlzdwlcJHYwLDFcKFwkc3BcKQotIDRmYToJZjAwMCBkMjAyIAlzdwlcJHYwLDJcKFwkc3BcKQotIDRmZToJZjAwMCBkMjAzIAlzdwlcJHYwLDNcKFwkc3BcKQotIDUwMjoJZDIwMSAgICAgIAlzdwlcJHYwLDRcKFwkc3BcKQotIDUwNDoJZDIwMiAgICAgIAlzdwlcJHYwLDhcKFwkc3BcKQotIDUwNjoJZDIwNCAgICAgIAlzdwlcJHYwLDE2XChcJHNwXCkKLSA1MDg6CWQyMDggICAgICAJc3cJXCR2MCwzMlwoXCRzcFwpCi0gNTBhOglkMjEwICAgICAgCXN3CVwkdjAsNjRcKFwkc3BcKQotIDUwYzoJZDIyMCAgICAgIAlzdwlcJHYwLDEyOFwoXCRzcFwpCi0gNTBlOglkMjQwICAgICAgCXN3CVwkdjAsMjU2XChcJHNwXCkKLSA1MTA6CWQyODAgICAgICAJc3cJXCR2MCw1MTJcKFwkc3BcKQotIDUxMjoJZjQwMCBkMjAwIAlzdwlcJHYwLDEwMjRcKFwkc3BcKQotIDUxNjoJZjAwMSBkMjAwIAlzdwlcJHYwLDIwNDhcKFwkc3BcKQotIDUxYToJZjdmZiBkMjFmIAlzdwlcJHYwLC0xXChcJHNwXCkKLSA1MWU6CWY3ZmYgZDIxZSAJc3cJXCR2MCwtMlwoXCRzcFwpCi0gNTIyOglmN2ZmIGQyMWQgCXN3CVwkdjAsLTNcKFwkc3BcKQotIDUyNjoJZjdmZiBkMjFjIAlzdwlcJHYwLC00XChcJHNwXCkKLSA1MmE6CWY3ZmYgZDIxOCAJc3cJXCR2MCwtOFwoXCRzcFwpCi0gNTJlOglmN2ZmIGQyMTAgCXN3CVwkdjAsLTE2XChcJHNwXCkKLSA1MzI6CWY3ZmYgZDIwMCAJc3cJXCR2MCwtMzJcKFwkc3BcKQotIDUzNjoJZjdkZiBkMjAwIAlzdwlcJHYwLC02NFwoXCRzcFwpCi0gNTNhOglmNzlmIGQyMDAgCXN3CVwkdjAsLTEyOFwoXCRzcFwpCi0gNTNlOglmNzFmIGQyMDAgCXN3CVwkdjAsLTI1NlwoXCRzcFwpCi0gNTQyOglmNjFmIGQyMDAgCXN3CVwkdjAsLTUxMlwoXCRzcFwpCi0gNTQ2OglmNDFmIGQyMDAgCXN3CVwkdjAsLTEwMjRcKFwkc3BcKQotIDU0YToJZjAxZiBkMjAwIAlzdwlcJHYwLC0yMDQ4XChcJHNwXCkKLSA1NGU6CTYyMDAgICAgICAJc3cJXCRyYSwwXChcJHNwXCkKLSA1NTA6CWYwMDAgNjIwMSAJc3cJXCRyYSwxXChcJHNwXCkKLSA1NTQ6CWYwMDAgNjIwMiAJc3cJXCRyYSwyXChcJHNwXCkKLSA1NTg6CWYwMDAgNjIwMyAJc3cJXCRyYSwzXChcJHNwXCkKLSA1NWM6CTYyMDEgICAgICAJc3cJXCRyYSw0XChcJHNwXCkKLSA1NWU6CTYyMDIgICAgICAJc3cJXCRyYSw4XChcJHNwXCkKLSA1NjA6CTYyMDQgICAgICAJc3cJXCRyYSwxNlwoXCRzcFwpCi0gNTYyOgk2MjA4ICAgICAgCXN3CVwkcmEsMzJcKFwkc3BcKQotIDU2NDoJNjIxMCAgICAgIAlzdwlcJHJhLDY0XChcJHNwXCkKLSA1NjY6CTYyMjAgICAgICAJc3cJXCRyYSwxMjhcKFwkc3BcKQotIDU2ODoJNjI0MCAgICAgIAlzdwlcJHJhLDI1NlwoXCRzcFwpCi0gNTZhOgk2MjgwICAgICAgCXN3CVwkcmEsNTEyXChcJHNwXCkKLSA1NmM6CWY0MDAgNjIwMCAJc3cJXCRyYSwxMDI0XChcJHNwXCkKLSA1NzA6CWYwMDEgNjIwMCAJc3cJXCRyYSwyMDQ4XChcJHNwXCkKLSA1NzQ6CWY3ZmYgNjIxZiAJc3cJXCRyYSwtMVwoXCRzcFwpCi0gNTc4OglmN2ZmIDYyMWUgCXN3CVwkcmEsLTJcKFwkc3BcKQotIDU3YzoJZjdmZiA2MjFkIAlzdwlcJHJhLC0zXChcJHNwXCkKLSA1ODA6CWY3ZmYgNjIxYyAJc3cJXCRyYSwtNFwoXCRzcFwpCi0gNTg0OglmN2ZmIDYyMTggCXN3CVwkcmEsLThcKFwkc3BcKQotIDU4ODoJZjdmZiA2MjEwIAlzdwlcJHJhLC0xNlwoXCRzcFwpCi0gNThjOglmN2ZmIDYyMDAgCXN3CVwkcmEsLTMyXChcJHNwXCkKLSA1OTA6CWY3ZGYgNjIwMCAJc3cJXCRyYSwtNjRcKFwkc3BcKQotIDU5NDoJZjc5ZiA2MjAwIAlzdwlcJHJhLC0xMjhcKFwkc3BcKQotIDU5ODoJZjcxZiA2MjAwIAlzdwlcJHJhLC0yNTZcKFwkc3BcKQotIDU5YzoJZjYxZiA2MjAwIAlzdwlcJHJhLC01MTJcKFwkc3BcKQotIDVhMDoJZjQxZiA2MjAwIAlzdwlcJHJhLC0xMDI0XChcJHNwXCkKLSA1YTQ6CWYwMWYgNjIwMCAJc3cJXCRyYSwtMjA0OFwoXCRzcFwpCi0gNWE4OgljYjQwICAgICAgCXNoCVwkdjAsMFwoXCR2MVwpCi0gNWFhOglmMDAwIGNiNDEgCXNoCVwkdjAsMVwoXCR2MVwpCi0gNWFlOgljYjQxICAgICAgCXNoCVwkdjAsMlwoXCR2MVwpCi0gNWIwOglmMDAwIGNiNDMgCXNoCVwkdjAsM1woXCR2MVwpCi0gNWI0OgljYjQyICAgICAgCXNoCVwkdjAsNFwoXCR2MVwpCi0gNWI2OgljYjQ0ICAgICAgCXNoCVwkdjAsOFwoXCR2MVwpCi0gNWI4OgljYjQ4ICAgICAgCXNoCVwkdjAsMTZcKFwkdjFcKQotIDViYToJY2I1MCAgICAgIAlzaAlcJHYwLDMyXChcJHYxXCkKLSA1YmM6CWYwNDAgY2I0MCAJc2gJXCR2MCw2NFwoXCR2MVwpCi0gNWMwOglmMDgwIGNiNDAgCXNoCVwkdjAsMTI4XChcJHYxXCkKLSA1YzQ6CWYxMDAgY2I0MCAJc2gJXCR2MCwyNTZcKFwkdjFcKQotIDVjODoJZjIwMCBjYjQwIAlzaAlcJHYwLDUxMlwoXCR2MVwpCi0gNWNjOglmNDAwIGNiNDAgCXNoCVwkdjAsMTAyNFwoXCR2MVwpCi0gNWQwOglmMDAxIGNiNDAgCXNoCVwkdjAsMjA0OFwoXCR2MVwpCi0gNWQ0OglmN2ZmIGNiNWYgCXNoCVwkdjAsLTFcKFwkdjFcKQotIDVkODoJZjdmZiBjYjVlIAlzaAlcJHYwLC0yXChcJHYxXCkKLSA1ZGM6CWY3ZmYgY2I1ZCAJc2gJXCR2MCwtM1woXCR2MVwpCi0gNWUwOglmN2ZmIGNiNWMgCXNoCVwkdjAsLTRcKFwkdjFcKQotIDVlNDoJZjdmZiBjYjU4IAlzaAlcJHYwLC04XChcJHYxXCkKLSA1ZTg6CWY3ZmYgY2I1MCAJc2gJXCR2MCwtMTZcKFwkdjFcKQotIDVlYzoJZjdmZiBjYjQwIAlzaAlcJHYwLC0zMlwoXCR2MVwpCi0gNWYwOglmN2RmIGNiNDAgCXNoCVwkdjAsLTY0XChcJHYxXCkKLSA1ZjQ6CWY3OWYgY2I0MCAJc2gJXCR2MCwtMTI4XChcJHYxXCkKLSA1Zjg6CWY3MWYgY2I0MCAJc2gJXCR2MCwtMjU2XChcJHYxXCkKLSA1ZmM6CWY2MWYgY2I0MCAJc2gJXCR2MCwtNTEyXChcJHYxXCkKLSA2MDA6CWY0MWYgY2I0MCAJc2gJXCR2MCwtMTAyNFwoXCR2MVwpCi0gNjA0OglmMDFmIGNiNDAgCXNoCVwkdjAsLTIwNDhcKFwkdjFcKQotIDYwODoJYzM0MCAgICAgIAlzYglcJHYwLDBcKFwkdjFcKQotIDYwYToJYzM0MSAgICAgIAlzYglcJHYwLDFcKFwkdjFcKQotIDYwYzoJYzM0MiAgICAgIAlzYglcJHYwLDJcKFwkdjFcKQotIDYwZToJYzM0MyAgICAgIAlzYglcJHYwLDNcKFwkdjFcKQotIDYxMDoJYzM0NCAgICAgIAlzYglcJHYwLDRcKFwkdjFcKQotIDYxMjoJYzM0OCAgICAgIAlzYglcJHYwLDhcKFwkdjFcKQotIDYxNDoJYzM1MCAgICAgIAlzYglcJHYwLDE2XChcJHYxXCkKLSA2MTY6CWYwMjAgYzM0MCAJc2IJXCR2MCwzMlwoXCR2MVwpCi0gNjFhOglmMDQwIGMzNDAgCXNiCVwkdjAsNjRcKFwkdjFcKQotIDYxZToJZjA4MCBjMzQwIAlzYglcJHYwLDEyOFwoXCR2MVwpCi0gNjIyOglmMTAwIGMzNDAgCXNiCVwkdjAsMjU2XChcJHYxXCkKLSA2MjY6CWYyMDAgYzM0MCAJc2IJXCR2MCw1MTJcKFwkdjFcKQotIDYyYToJZjQwMCBjMzQwIAlzYglcJHYwLDEwMjRcKFwkdjFcKQotIDYyZToJZjAwMSBjMzQwIAlzYglcJHYwLDIwNDhcKFwkdjFcKQotIDYzMjoJZjdmZiBjMzVmIAlzYglcJHYwLC0xXChcJHYxXCkKLSA2MzY6CWY3ZmYgYzM1ZSAJc2IJXCR2MCwtMlwoXCR2MVwpCi0gNjNhOglmN2ZmIGMzNWQgCXNiCVwkdjAsLTNcKFwkdjFcKQotIDYzZToJZjdmZiBjMzVjIAlzYglcJHYwLC00XChcJHYxXCkKLSA2NDI6CWY3ZmYgYzM1OCAJc2IJXCR2MCwtOFwoXCR2MVwpCi0gNjQ2OglmN2ZmIGMzNTAgCXNiCVwkdjAsLTE2XChcJHYxXCkKLSA2NGE6CWY3ZmYgYzM0MCAJc2IJXCR2MCwtMzJcKFwkdjFcKQotIDY0ZToJZjdkZiBjMzQwIAlzYglcJHYwLC02NFwoXCR2MVwpCi0gNjUyOglmNzlmIGMzNDAgCXNiCVwkdjAsLTEyOFwoXCR2MVwpCi0gNjU2OglmNzFmIGMzNDAgCXNiCVwkdjAsLTI1NlwoXCR2MVwpCi0gNjVhOglmNjFmIGMzNDAgCXNiCVwkdjAsLTUxMlwoXCR2MVwpCi0gNjVlOglmNDFmIGMzNDAgCXNiCVwkdjAsLTEwMjRcKFwkdjFcKQotIDY2MjoJZjAxZiBjMzQwIAlzYglcJHYwLC0yMDQ4XChcJHYxXCkKLSA2NjY6CTZhMDAgICAgICAJbGkJXCR2MCwwCi0gNjY4Ogk2YTAxICAgICAgCWxpCVwkdjAsMQotIDY2YToJZjEwMCA2YTAwIAlsaQlcJHYwLDI1NgotIDY2ZToJNjc1ZSAgICAgIAltb3ZlCVwkdjAsXCRzOAotIDY3MDoJNjU5MiAgICAgIAltb3ZlCVwkczQsXCR2MAotIDY3MjoJNDM1MCAgICAgIAlkYWRkaXUJXCR2MCxcJHYxLDAKLSA2NzQ6CTQzNTEgICAgICAJZGFkZGl1CVwkdjAsXCR2MSwxCi0gNjc2Ogk0MzVmICAgICAgCWRhZGRpdQlcJHYwLFwkdjEsLTEKLSA2Nzg6CWYwMTAgNDM1MCAJZGFkZGl1CVwkdjAsXCR2MSwxNgotIDY3YzoJZjdmZiA0MzUwIAlkYWRkaXUJXCR2MCxcJHYxLC0xNgotIDY4MDoJZTM4OCAgICAgIAlkYWRkdQlcJHYwLFwkdjEsXCRhMAotIDY4MjoJZmQ0MCAgICAgIAlkYWRkaXUJXCR2MCwwCi0gNjg0OglmZDQxICAgICAgCWRhZGRpdQlcJHYwLDEKLSA2ODY6CWZkNWYgICAgICAJZGFkZGl1CVwkdjAsLTEKLSA2ODg6CWYwMjAgZmQ0MCAJZGFkZGl1CVwkdjAsMzIKLSA2OGM6CWY3ZmYgZmQ0MCAJZGFkZGl1CVwkdjAsLTMyCi0gNjkwOglmMDgwIGZkNDAgCWRhZGRpdQlcJHYwLDEyOAotIDY5NDoJZjc5ZiBmZDQwIAlkYWRkaXUJXCR2MCwtMTI4Ci0gNjk4OglmMTdmIGZlNDggCWRsYQlcJHYwLDAgPGRhdGExPgotIDY5YzoJZjA4MCBmZTQwIAlkbGEJXCR2MCw3MWMgPGRhdGEyPgotIDZhMDoJZjFjMCBmZTQ4IAlkbGEJXCR2MCw4NjggPGJhcj4KLSA2YTQ6CWYyODAgZmU0YyAJZGxhCVwkdjAsOTMwIDxxdXV4PgotIDZhODoJZmIwMCAgICAgIAlkYWRkaXUJXCRzcCwwCi0gNmFhOglmMDAwIGZiMDEgCWRhZGRpdQlcJHNwLDEKLSA2YWU6CWY3ZmYgZmIxZiAJZGFkZGl1CVwkc3AsLTEKLSA2YjI6CWZiMjAgICAgICAJZGFkZGl1CVwkc3AsMjU2Ci0gNmI0OglmYmUwICAgICAgCWRhZGRpdQlcJHNwLC0yNTYKLSA2YjY6CWZmNDAgICAgICAJZGFkZGl1CVwkdjAsXCRzcCwwCi0gNmI4OglmMDAwIGZmNDEgCWRhZGRpdQlcJHYwLFwkc3AsMQotIDZiYzoJZjdmZiBmZjVmIAlkYWRkaXUJXCR2MCxcJHNwLC0xCi0gNmMwOglmZjQ4ICAgICAgCWRhZGRpdQlcJHYwLFwkc3AsMzIKLSA2YzI6CWY3ZmYgZmY0MCAJZGFkZGl1CVwkdjAsXCRzcCwtMzIKLSA2YzY6CWYwODAgZmY0MCAJZGFkZGl1CVwkdjAsXCRzcCwxMjgKLSA2Y2E6CWY3OWYgZmY0MCAJZGFkZGl1CVwkdjAsXCRzcCwtMTI4Ci0gNmNlOgk0MzQwICAgICAgCWFkZGl1CVwkdjAsXCR2MSwwCi0gNmQwOgk0MzQxICAgICAgCWFkZGl1CVwkdjAsXCR2MSwxCi0gNmQyOgk0MzRmICAgICAgCWFkZGl1CVwkdjAsXCR2MSwtMQotIDZkNDoJZjAxMCA0MzQwIAlhZGRpdQlcJHYwLFwkdjEsMTYKLSA2ZDg6CWY3ZmYgNDM0MCAJYWRkaXUJXCR2MCxcJHYxLC0xNgotIDZkYzoJZTM4OSAgICAgIAlhZGR1CVwkdjAsXCR2MSxcJGEwCi0gNmRlOgk0YTAwICAgICAgCWFkZGl1CVwkdjAsMAotIDZlMDoJNGEwMSAgICAgIAlhZGRpdQlcJHYwLDEKLSA2ZTI6CTRhZmYgICAgICAJYWRkaXUJXCR2MCwtMQotIDZlNDoJNGEyMCAgICAgIAlhZGRpdQlcJHYwLDMyCi0gNmU2Ogk0YWUwICAgICAgCWFkZGl1CVwkdjAsLTMyCi0gNmU4OglmMDgwIDRhMDAgCWFkZGl1CVwkdjAsMTI4Ci0gNmVjOgk0YTgwICAgICAgCWFkZGl1CVwkdjAsLTEyOAotIDZlZToJZjExZiAwYTE0IAlsYQlcJHYwLDAgPGRhdGExPgotIDZmMjoJMGEwYiAgICAgIAlsYQlcJHYwLDcxYyA8ZGF0YTI+Ci0gNmY0OgkwYTVkICAgICAgCWxhCVwkdjAsODY4IDxiYXI+Ci0gNmY2OgkwYThmICAgICAgCWxhCVwkdjAsOTMwIDxxdXV4PgotIDZmODoJNjMwMCAgICAgIAlhZGRpdQlcJHNwLDAKLSA2ZmE6CWYwMDAgNjMwMSAJYWRkaXUJXCRzcCwxCi0gNmZlOglmN2ZmIDYzMWYgCWFkZGl1CVwkc3AsLTEKLSA3MDI6CTYzMjAgICAgICAJYWRkaXUJXCRzcCwyNTYKLSA3MDQ6CTYzZTAgICAgICAJYWRkaXUJXCRzcCwtMjU2Ci0gNzA2OgkwMjAwICAgICAgCWFkZGl1CVwkdjAsXCRzcCwwCi0gNzA4OglmMDAwIDAyMDEgCWFkZGl1CVwkdjAsXCRzcCwxCi0gNzBjOglmN2ZmIDAyMWYgCWFkZGl1CVwkdjAsXCRzcCwtMQotIDcxMDoJMDIwOCAgICAgIAlhZGRpdQlcJHYwLFwkc3AsMzIKLSA3MTI6CWY3ZmYgMDIwMCAJYWRkaXUJXCR2MCxcJHNwLC0zMgotIDcxNjoJMDIyMCAgICAgIAlhZGRpdQlcJHYwLFwkc3AsMTI4Ci0gNzE4OglmNzlmIDAyMDAgCWFkZGl1CVwkdjAsXCRzcCwtMTI4Ci0KLTArMDAwNzFjIDxkYXRhMj46Ci0gNzFjOgkwMDAwMDAwMCAJbm9wCi0KLTArMDAwNzIwIDxpbnNuczI+OgotIDcyMDoJZTM4YSAgICAgIAlkc3VidQlcJHYwLFwkdjEsXCRhMAotIDcyMjoJZTM4YiAgICAgIAlzdWJ1CVwkdjAsXCR2MSxcJGEwCi0gNzI0OgllYTZiICAgICAgCW5lZwlcJHYwLFwkdjEKLSA3MjY6CWVhNmMgICAgICAJYW5kCVwkdjAsXCR2MQotIDcyODoJZWE2ZCAgICAgIAlvcglcJHYwLFwkdjEKLSA3MmE6CWVhNmUgICAgICAJeG9yCVwkdjAsXCR2MQotIDcyYzoJZWE2ZiAgICAgIAlub3QJXCR2MCxcJHYxCi0gNzJlOgk1MjAwICAgICAgCXNsdGkJXCR2MCwwCi0gNzMwOgk1MjAxICAgICAgCXNsdGkJXCR2MCwxCi0gNzMyOglmN2ZmIDUyMWYgCXNsdGkJXCR2MCwtMQotIDczNjoJNTJmZiAgICAgIAlzbHRpCVwkdjAsMjU1Ci0gNzM4OglmMTAwIDUyMDAgCXNsdGkJXCR2MCwyNTYKLSA3M2M6CWVhNjIgICAgICAJc2x0CVwkdjAsXCR2MQotIDczZToJNWEwMCAgICAgIAlzbHRpdQlcJHYwLDAKLSA3NDA6CTVhMDEgICAgICAJc2x0aXUJXCR2MCwxCi0gNzQyOglmN2ZmIDVhMWYgCXNsdGl1CVwkdjAsLTEKLSA3NDY6CTVhZmYgICAgICAJc2x0aXUJXCR2MCwyNTUKLSA3NDg6CWYxMDAgNWEwMCAJc2x0aXUJXCR2MCwyNTYKLSA3NGM6CWVhNjMgICAgICAJc2x0dQlcJHYwLFwkdjEKLSA3NGU6CTcyMDAgICAgICAJY21waQlcJHYwLDAKLSA3NTA6CTcyMDEgICAgICAJY21waQlcJHYwLDEKLSA3NTI6CTcyZmYgICAgICAJY21waQlcJHYwLDI1NQotIDc1NDoJZjEwMCA3MjAwIAljbXBpCVwkdjAsMjU2Ci0gNzU4OgllYTZhICAgICAgCWNtcAlcJHYwLFwkdjEKLSA3NWE6CWYwMDAgMzI2MSAJZHNsbAlcJHYwLFwkdjEsMAotIDc1ZToJMzI2NSAgICAgIAlkc2xsCVwkdjAsXCR2MSwxCi0gNzYwOgkzMjYxICAgICAgCWRzbGwJXCR2MCxcJHYxLDgKLSA3NjI6CWYyNDAgMzI2MSAJZHNsbAlcJHYwLFwkdjEsOQotIDc2NjoJZjdlMCAzMjYxIAlkc2xsCVwkdjAsXCR2MSw2MwotIDc2YToJZWI1NCAgICAgIAlkc2xsdglcJHYwLFwkdjEKLSA3NmM6CWYwMDAgZTg0OCAJZHNybAlcJHYwLDAKLSA3NzA6CWU5NDggICAgICAJZHNybAlcJHYwLDEKLSA3NzI6CWU4NDggICAgICAJZHNybAlcJHYwLDgKLSA3NzQ6CWYyNDAgZTg0OCAJZHNybAlcJHYwLDkKLSA3Nzg6CWY3ZTAgZTg0OCAJZHNybAlcJHYwLDYzCi0gNzdjOgllYjU2ICAgICAgCWRzcmx2CVwkdjAsXCR2MQotIDc3ZToJZjAwMCBlODUzIAlkc3JhCVwkdjAsMAotIDc4MjoJZTk1MyAgICAgIAlkc3JhCVwkdjAsMQotIDc4NDoJZTg1MyAgICAgIAlkc3JhCVwkdjAsOAotIDc4NjoJZjI0MCBlODUzIAlkc3JhCVwkdjAsOQotIDc4YToJZjdlMCBlODUzIAlkc3JhCVwkdjAsNjMKLSA3OGU6CWViNTcgICAgICAJZHNyYXYJXCR2MCxcJHYxCi0gNzkwOgllYTEyICAgICAgCW1mbG8JXCR2MAotIDc5MjoJZWIxMCAgICAgIAltZmhpCVwkdjEKLSA3OTQ6CWYwMDAgMzI2MCAJc2xsCVwkdjAsXCR2MSwwCi0gNzk4OgkzMjY0ICAgICAgCXNsbAlcJHYwLFwkdjEsMQotIDc5YToJMzI2MCAgICAgIAlzbGwJXCR2MCxcJHYxLDgKLSA3OWM6CWYyNDAgMzI2MCAJc2xsCVwkdjAsXCR2MSw5Ci0gN2EwOglmN2MwIDMyNjAgCXNsbAlcJHYwLFwkdjEsMzEKLSA3YTQ6CWViNDQgICAgICAJc2xsdglcJHYwLFwkdjEKLSA3YTY6CWYwMDAgMzI2MiAJc3JsCVwkdjAsXCR2MSwwCi0gN2FhOgkzMjY2ICAgICAgCXNybAlcJHYwLFwkdjEsMQotIDdhYzoJMzI2MiAgICAgIAlzcmwJXCR2MCxcJHYxLDgKLSA3YWU6CWYyNDAgMzI2MiAJc3JsCVwkdjAsXCR2MSw5Ci0gN2IyOglmN2MwIDMyNjIgCXNybAlcJHYwLFwkdjEsMzEKLSA3YjY6CWViNDYgICAgICAJc3JsdglcJHYwLFwkdjEKLSA3Yjg6CWYwMDAgMzI2MyAJc3JhCVwkdjAsXCR2MSwwCi0gN2JjOgkzMjY3ICAgICAgCXNyYQlcJHYwLFwkdjEsMQotIDdiZToJMzI2MyAgICAgIAlzcmEJXCR2MCxcJHYxLDgKLSA3YzA6CWYyNDAgMzI2MyAJc3JhCVwkdjAsXCR2MSw5Ci0gN2M0OglmN2MwIDMyNjMgCXNyYQlcJHYwLFwkdjEsMzEKLSA3Yzg6CWViNDcgICAgICAJc3JhdglcJHYwLFwkdjEKLSA3Y2E6CWVhN2MgICAgICAJZG11bHQJXCR2MCxcJHYxCi0gN2NjOgllYTdkICAgICAgCWRtdWx0dQlcJHYwLFwkdjEKLSA3Y2U6CWVhN2UgICAgICAJZGRpdglcJHplcm8sXCR2MCxcJHYxCi0gN2QwOgkyYjAxICAgICAgCWJuZXoJXCR2MSw3ZDQgPGluc25zMlwrKDB4fCliND4KLSA3ZDI6CWU4ZTUgICAgICAJYnJlYWsJNwotIDdkNDoJZWExMiAgICAgIAltZmxvCVwkdjAKLSA3ZDY6CTY1MDAgICAgICAJbm9wCi0gN2Q4Ogk2NTAwICAgICAgCW5vcAotIDdkYToJZWE3ZiAgICAgIAlkZGl2dQlcJHplcm8sXCR2MCxcJHYxCi0gN2RjOgkyYjAxICAgICAgCWJuZXoJXCR2MSw3ZTAgPGluc25zMlwrKDB4fCljMD4KLSA3ZGU6CWU4ZTUgICAgICAJYnJlYWsJNwotIDdlMDoJZWExMiAgICAgIAltZmxvCVwkdjAKLSA3ZTI6CTY1MDAgICAgICAJbm9wCi0gN2U0Ogk2NTAwICAgICAgCW5vcAotIDdlNjoJZWE3OCAgICAgIAltdWx0CVwkdjAsXCR2MQotIDdlODoJZWE3OSAgICAgIAltdWx0dQlcJHYwLFwkdjEKLSA3ZWE6CWVhN2EgICAgICAJZGl2CVwkemVybyxcJHYwLFwkdjEKLSA3ZWM6CTJiMDEgICAgICAJYm5leglcJHYxLDdmMCA8aW5zbnMyXCsoMHh8KWQwPgotIDdlZToJZThlNSAgICAgIAlicmVhawk3Ci0gN2YwOgllYTEyICAgICAgCW1mbG8JXCR2MAotIDdmMjoJNjUwMCAgICAgIAlub3AKLSA3ZjQ6CTY1MDAgICAgICAJbm9wCi0gN2Y2OgllYTdiICAgICAgCWRpdnUJXCR6ZXJvLFwkdjAsXCR2MQotIDdmODoJMmIwMSAgICAgIAlibmV6CVwkdjEsN2ZjIDxpbnNuczJcKygweHwpZGM+Ci0gN2ZhOgllOGU1ICAgICAgCWJyZWFrCTcKLSA3ZmM6CWVhMTIgICAgICAJbWZsbwlcJHYwCi0gN2ZlOgllYTAwICAgICAgCWpyCVwkdjAKLSA4MDA6CTY1MDAgICAgICAJbm9wCi0gODAyOgllODIwICAgICAgCWpyCVwkcmEKLSA4MDQ6CTY1MDAgICAgICAJbm9wCi0gODA2OgllYTQwICAgICAgCWphbHIJXCR2MAotIDgwODoJNjUwMCAgICAgIAlub3AKLSA4MGE6CWYzZmYgMjIxYiAJYmVxeglcJHYwLDQgPGluc25zMT4KLSA4MGU6CTIyODggICAgICAJYmVxeglcJHYwLDcyMCA8aW5zbnMyPgotIDgxMDoJMjIyYiAgICAgIAliZXF6CVwkdjAsODY4IDxiYXI+Ci0gODEyOglmMDgwIDIyMGQgCWJlcXoJXCR2MCw5MzAgPHF1dXg+Ci0gODE2OglmM2ZmIDJhMTUgCWJuZXoJXCR2MCw0IDxpbnNuczE+Ci0gODFhOgkyYTgyICAgICAgCWJuZXoJXCR2MCw3MjAgPGluc25zMj4KLSA4MWM6CTJhMjUgICAgICAJYm5leglcJHYwLDg2OCA8YmFyPgotIDgxZToJZjA4MCAyYTA3IAlibmV6CVwkdjAsOTMwIDxxdXV4PgotIDgyMjoJZjNmZiA2MDBmIAlidGVxegk0IDxpbnNuczE+Ci0gODI2OglmNzdmIDYwMWIgCWJ0ZXF6CTcyMCA8aW5zbnMyPgotIDgyYToJNjAxZSAgICAgIAlidGVxegk4NjggPGJhcj4KLSA4MmM6CWYwODAgNjAwMCAJYnRlcXoJOTMwIDxxdXV4PgotIDgzMDoJZjNmZiA2MTA4IAlidG5legk0IDxpbnNuczE+Ci0gODM0OglmNzdmIDYxMTQgCWJ0bmV6CTcyMCA8aW5zbnMyPgotIDgzODoJNjExNyAgICAgIAlidG5legk4NjggPGJhcj4KLSA4M2E6CTYxN2EgICAgICAJYnRuZXoJOTMwIDxxdXV4PgotIDgzYzoJZjNmZiAxMDAyIAliCTQgPGluc25zMT4KLSA4NDA6CTE3NmYgICAgICAJYgk3MjAgPGluc25zMj4KLSA4NDI6CTEwMTIgICAgICAJYgk4NjggPGJhcj4KLSA4NDQ6CTEwNzUgICAgICAJYgk5MzAgPHF1dXg+Ci0gODQ2OgllODA1ICAgICAgCWJyZWFrCTAKLSA4NDg6CWU4MjUgICAgICAJYnJlYWsJMQotIDg0YToJZWZlNSAgICAgIAlicmVhawk2MwotIDg0YzoJMTgwMCAwMDAwIAlqYWwJMCA8ZGF0YTE+Ci0JCQk4NGM6IFJfTUlQUzE2XzI2CWV4dGVybgotIDg1MDoJNjUwMCAgICAgIAlub3AKLSA4NTI6CWU4MDkgICAgICAJZW50cnkJCi0gODU0OgllOTA5ICAgICAgCWVudHJ5CVwkYTAKLSA4NTY6CWViNDkgICAgICAJZW50cnkJXCRhMC1cJGEyLFwkczAKLSA4NTg6CWU4YTkgICAgICAJZW50cnkJXCRzMC1cJHMxLFwkcmEKLSA4NWE6CWU4MjkgICAgICAJZW50cnkJXCRyYQotIDg1YzoJZWYwOSAgICAgIAlleGl0CQotIDg1ZToJZWY0OSAgICAgIAlleGl0CVwkczAKLSA4NjA6CWVmYTkgICAgICAJZXhpdAlcJHMwLVwkczEsXCRyYQotIDg2MjoJZWYyOSAgICAgIAlleGl0CVwkcmEKLSA4NjQ6CTAwMDAgICAgICAJYWRkaXUJXCRzMCxcJHNwLDAKLQkuLi4KLQotMCswMDA4NjggPGJhcj46Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzMTYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2OGZiMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHMxNi5zCisrKyAvZGV2L251bGwKQEAgLTEsMjU4ICswLDAgQEAKLSMgVGVzdCB0aGUgbWlwczE2IGluc3RydWN0aW9uIHNldC4KLQotCS5zZXQJbWlwczE2Ci0KLQkubWFjcm8JbGRzdCBvcCwgcmVnLCBiYXNlCi0JXG9wCVxyZWcsMChcYmFzZSkKLQlcb3AJXHJlZywxKFxiYXNlKQotCVxvcAlccmVnLDIoXGJhc2UpCi0JXG9wCVxyZWcsMyhcYmFzZSkKLQlcb3AJXHJlZyw0KFxiYXNlKQotCVxvcAlccmVnLDgoXGJhc2UpCi0JXG9wCVxyZWcsMTYoXGJhc2UpCi0JXG9wCVxyZWcsMzIoXGJhc2UpCi0JXG9wCVxyZWcsNjQoXGJhc2UpCi0JXG9wCVxyZWcsMTI4KFxiYXNlKQotCVxvcAlccmVnLDI1NihcYmFzZSkKLQlcb3AJXHJlZyw1MTIoXGJhc2UpCi0JXG9wCVxyZWcsMTAyNChcYmFzZSkKLQlcb3AJXHJlZywyMDQ4KFxiYXNlKQotCVxvcAlccmVnLC0xKFxiYXNlKQotCVxvcAlccmVnLC0yKFxiYXNlKQotCVxvcAlccmVnLC0zKFxiYXNlKQotCVxvcAlccmVnLC00KFxiYXNlKQotCVxvcAlccmVnLC04KFxiYXNlKQotCVxvcAlccmVnLC0xNihcYmFzZSkKLQlcb3AJXHJlZywtMzIoXGJhc2UpCi0JXG9wCVxyZWcsLTY0KFxiYXNlKQotCVxvcAlccmVnLC0xMjgoXGJhc2UpCi0JXG9wCVxyZWcsLTI1NihcYmFzZSkKLQlcb3AJXHJlZywtNTEyKFxiYXNlKQotCVxvcAlccmVnLC0xMDI0KFxiYXNlKQotCVxvcAlccmVnLC0yMDQ4KFxiYXNlKQotCS5lbmRtCi0KLQkucDJhbGlnbiAzCi1kYXRhMToKLQkud29yZAkwCi1pbnNuczE6Ci0JbGRzdAlsZCwgJDIsICQzCi0JbGQJJDIsZGF0YTEKLQlsZAkkMixkYXRhMgotCWxkCSQyLGJhcgotCWxkCSQyLHF1dXgKLQlsZHN0CWxkLCAkMiwgJHNwCi0JbGRzdAlsd3UsICQyLCAkMwotCWxkc3QJbHcsICQyLCAkMwotCWx3CSQyLGRhdGExCi0JbHcJJDIsZGF0YTIKLQlsdwkkMixiYXIKLQlsdwkkMixxdXV4Ci0JbGRzdAlsdywgJDIsICRzcAotCWxkc3QJbGgsICQyLCAkMwotCWxkc3QJbGh1LCAkMiwgJDMKLQlsZHN0CWxiLCAkMiwgJDMKLQlsZHN0CWxidSwgJDIsICQzCi0JbGRzdAlzZCwgJDIsICQzCi0JbGRzdAlzZCwgJDIsICRzcAotCWxkc3QJc2QsICQzMSwgJHNwCi0JbGRzdAlzdywgJDIsICQzCi0JbGRzdAlzdywgJDIsICRzcAotCWxkc3QJc3csICQzMSwgJHNwCi0JbGRzdAlzaCwgJDIsICQzCi0JbGRzdAlzYiwgJDIsICQzCi0KLQlsaQkkMiwwCi0JbGkJJDIsMQotCWxpCSQyLDI1NgotCi0JbW92ZQkkMiwkMzAKLQltb3ZlCSQyMCwkMgotCi0JZGFkZHUJJDIsJDMsMAotCWRhZGR1CSQyLCQzLDEKLQlkYWRkdQkkMiwkMywtMQotCWRhZGR1CSQyLCQzLDE2Ci0JZGFkZHUJJDIsJDMsLTE2Ci0JZGFkZHUJJDIsJDMsJDQKLQlkYWRkdQkkMiwwCi0JZGFkZHUJJDIsMQotCWRhZGR1CSQyLC0xCi0JZGFkZHUJJDIsMzIKLQlkYWRkdQkkMiwtMzIKLQlkYWRkdQkkMiwxMjgKLQlkYWRkdQkkMiwtMTI4Ci0JZGxhCSQyLGRhdGExCi0JZGxhCSQyLGRhdGEyCi0JZGxhCSQyLGJhcgotCWRsYQkkMixxdXV4Ci0JZGFkZHUJJHNwLDAKLQlkYWRkdQkkc3AsMQotCWRhZGR1CSRzcCwtMQotCWRhZGR1CSRzcCwyNTYKLQlkYWRkdQkkc3AsLTI1NgotCWRhZGR1CSQyLCRzcCwwCi0JZGFkZHUJJDIsJHNwLDEKLQlkYWRkdQkkMiwkc3AsLTEKLQlkYWRkdQkkMiwkc3AsMzIKLQlkYWRkdQkkMiwkc3AsLTMyCi0JZGFkZHUJJDIsJHNwLDEyOAotCWRhZGR1CSQyLCRzcCwtMTI4Ci0KLQlhZGR1CSQyLCQzLDAKLQlhZGR1CSQyLCQzLDEKLQlhZGR1CSQyLCQzLC0xCi0JYWRkdQkkMiwkMywxNgotCWFkZHUJJDIsJDMsLTE2Ci0JYWRkdQkkMiwkMywkNAotCWFkZHUJJDIsMAotCWFkZHUJJDIsMQotCWFkZHUJJDIsLTEKLQlhZGR1CSQyLDMyCi0JYWRkdQkkMiwtMzIKLQlhZGR1CSQyLDEyOAotCWFkZHUJJDIsLTEyOAotCWxhCSQyLGRhdGExCi0JbGEJJDIsZGF0YTIKLQlsYQkkMixiYXIKLQlsYQkkMixxdXV4Ci0JYWRkdQkkc3AsMAotCWFkZHUJJHNwLDEKLQlhZGR1CSRzcCwtMQotCWFkZHUJJHNwLDI1NgotCWFkZHUJJHNwLC0yNTYKLQlhZGR1CSQyLCRzcCwwCi0JYWRkdQkkMiwkc3AsMQotCWFkZHUJJDIsJHNwLC0xCi0JYWRkdQkkMiwkc3AsMzIKLQlhZGR1CSQyLCRzcCwtMzIKLQlhZGR1CSQyLCRzcCwxMjgKLQlhZGR1CSQyLCRzcCwtMTI4Ci0KLWRhdGEyOgotCS53b3JkCTAKLWluc25zMjoJCi0JZHN1YnUJJDIsJDMsJDQKLQlzdWJ1CSQyLCQzLCQ0Ci0JbmVnCSQyLCQzCi0KLQlhbmQJJDIsJDMKLQlvcgkkMiwkMwotCXhvcgkkMiwkMwotCW5vdAkkMiwkMwotCi0Jc2x0CSQyLDAKLQlzbHQJJDIsMQotCXNsdAkkMiwtMQotCXNsdAkkMiwyNTUKLQlzbHQJJDIsMjU2Ci0Jc2x0CSQyLCQzCi0Jc2x0dQkkMiwwCi0Jc2x0dQkkMiwxCi0Jc2x0dQkkMiwtMQotCXNsdHUJJDIsMjU1Ci0Jc2x0dQkkMiwyNTYKLQlzbHR1CSQyLCQzCi0JY21wCSQyLDAKLQljbXAJJDIsMQotCWNtcAkkMiwyNTUKLQljbXAJJDIsMjU2Ci0JY21wCSQyLCQzCi0KLQlkc2xsCSQyLCQzLDAKLQlkc2xsCSQyLCQzLDEKLQlkc2xsCSQyLCQzLDgKLQlkc2xsCSQyLCQzLDkKLQlkc2xsCSQyLCQzLDYzCi0JZHNsbAkkMiwkMwotCWRzcmwJJDIsMAotCWRzcmwJJDIsMQotCWRzcmwJJDIsOAotCWRzcmwJJDIsOQotCWRzcmwJJDIsNjMKLQlkc3JsCSQyLCQzCi0JZHNyYQkkMiwwCi0JZHNyYQkkMiwxCi0JZHNyYQkkMiw4Ci0JZHNyYQkkMiw5Ci0JZHNyYQkkMiw2MwotCWRzcmEJJDIsJDMKLQotCW1mbG8JJDIKLQltZmhpCSQzCi0KLQlzbGwJJDIsJDMsMAotCXNsbAkkMiwkMywxCi0Jc2xsCSQyLCQzLDgKLQlzbGwJJDIsJDMsOQotCXNsbAkkMiwkMywzMQotCXNsbAkkMiwkMwotCXNybAkkMiwkMywwCi0Jc3JsCSQyLCQzLDEKLQlzcmwJJDIsJDMsOAotCXNybAkkMiwkMyw5Ci0Jc3JsCSQyLCQzLDMxCi0Jc3JsCSQyLCQzCi0Jc3JhCSQyLCQzLDAKLQlzcmEJJDIsJDMsMQotCXNyYQkkMiwkMyw4Ci0Jc3JhCSQyLCQzLDkKLQlzcmEJJDIsJDMsMzEKLQlzcmEJJDIsJDMKLQotCWRtdWx0CSQyLCQzCi0JZG11bHR1CSQyLCQzCi0JZGRpdgkkMiwkMwotCWRkaXZ1CSQyLCQzCi0KLQltdWx0CSQyLCQzCi0JbXVsdHUJJDIsJDMKLQlkaXYJJDIsJDMKLQlkaXZ1CSQyLCQzCi0KLQlqcgkkMgotCWpyCSQzMQotCWphbHIJJDMxLCQyCi0KLQliZXF6CSQyLGluc25zMQotCWJlcXoJJDIsaW5zbnMyCi0JYmVxegkkMixiYXIKLQliZXF6CSQyLHF1dXgKLQlibmV6CSQyLGluc25zMQotCWJuZXoJJDIsaW5zbnMyCi0JYm5legkkMixiYXIKLQlibmV6CSQyLHF1dXgKLQlidGVxeglpbnNuczEKLQlidGVxeglpbnNuczIKLQlidGVxegliYXIKLQlidGVxeglxdXV4Ci0JYnRuZXoJaW5zbnMxCi0JYnRuZXoJaW5zbnMyCi0JYnRuZXoJYmFyCi0JYnRuZXoJcXV1eAotCWIJaW5zbnMxCi0JYglpbnNuczIKLQliCWJhcgotCWIJcXV1eAotCi0JYnJlYWsJMAotCWJyZWFrCTEKLQlicmVhawk2MwotCi0JamFsCWV4dGVybgotCi0JZW50cnkKLQllbnRyeQkkNAotCWVudHJ5CSQ0LSQ2LCQxNgotCWVudHJ5CSQxNi0kMTcsJDMxCi0JZW50cnkJJDMxCi0JZXhpdAotCWV4aXQJJDE2Ci0JZXhpdAkkMTYtJDE3LCQzMQotCWV4aXQJJDMxCi0KLQkucDJhbGlnbiAzCi1iYXI6CQotCi0JLnNraXAJMjAwCi1xdXV4OgkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2ZGU5My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0LmQKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NTAwMAotI25hbWU6IE1JUFMgbWlwczQKLSNhczogLW1pcHM0IC1tY3B1PXI1MDAwCi0KLSMgVGVzdCB0aGUgbWlwczQgbWFjcm9zLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBiYzFmCTAwMDAwMDAwKyA8dGV4dF9sYWJlbD4KLTArMDAwNCA8W14+XSo+IG5vcAotMCswMDA4IDxbXj5dKj4gYmMxZglcJGZjYzEsMDAwMDAwMDArIDx0ZXh0X2xhYmVsPgotMCswMDBjIDxbXj5dKj4gbm9wCi0wKzAwMTAgPFtePl0qPiBiYzFmbAlcJGZjYzEsMDAwMDAwMDArIDx0ZXh0X2xhYmVsPgotMCswMDE0IDxbXj5dKj4gbm9wCi0wKzAwMTggPFtePl0qPiBiYzF0CVwkZmNjMSwwMDAwMDAwMCsgPHRleHRfbGFiZWw+Ci0wKzAwMWMgPFtePl0qPiBub3AKLTArMDAyMCA8W14+XSo+IGJjMXRsCVwkZmNjMiwwMDAwMDAwMCsgPHRleHRfbGFiZWw+Ci0wKzAwMjQgPFtePl0qPiBub3AKLTArMDAyOCA8W14+XSo+IGMuZi5kCVwkZjQsXCRmNgotMCswMDJjIDxbXj5dKj4gYy5mLmQJXCRmY2MxLFwkZjQsXCRmNgotMCswMDMwIDxbXj5dKj4gbGR4YzEJXCRmMixcJGEwXChcJGExXCkKLTArMDAzNCA8W14+XSo+IGx3eGMxCVwkZjIsXCRhMFwoXCRhMVwpCi0wKzAwMzggPFtePl0qPiBtYWRkLmQJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDNjIDxbXj5dKj4gbWFkZC5zCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDA0MCA8W14+XSo+IG1vdmYJXCRhMCxcJGExLFwkZmNjNAotMCswMDQ0IDxbXj5dKj4gbW92Zi5kCVwkZjQsXCRmNixcJGZjYzAKLTArMDA0OCA8W14+XSo+IG1vdmYucwlcJGY0LFwkZjYsXCRmY2MwCi0wKzAwNGMgPFtePl0qPiBtb3ZuCVwkYTAsXCRhMixcJGEyCi0wKzAwNTAgPFtePl0qPiBtb3ZuLmQJXCRmNCxcJGY1LFwkYTIKLTArMDA1NCA8W14+XSo+IG1vdm4ucwlcJGY0LFwkZjUsXCRhMgotMCswMDU4IDxbXj5dKj4gbW92dAlcJGEwLFwkYTEsXCRmY2M0Ci0wKzAwNWMgPFtePl0qPiBtb3Z0LmQJXCRmNCxcJGY2LFwkZmNjMAotMCswMDYwIDxbXj5dKj4gbW92dC5zCVwkZjQsXCRmNixcJGZjYzAKLTArMDA2NCA8W14+XSo+IG1vdnoJXCRhMCxcJGEyLFwkYTIKLTArMDA2OCA8W14+XSo+IG1vdnouZAlcJGY0LFwkZjUsXCRhMgotMCswMDZjIDxbXj5dKj4gbW92ei5zCVwkZjQsXCRmNSxcJGEyCi0wKzAwNzAgPFtePl0qPiBtc3ViLmQJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDc0IDxbXj5dKj4gbXN1Yi5zCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDA3OCA8W14+XSo+IG5tYWRkLmQJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDdjIDxbXj5dKj4gbm1hZGQucwlcJGYwLFwkZjIsXCRmNCxcJGY2Ci0wKzAwODAgPFtePl0qPiBubXN1Yi5kCVwkZjAsXCRmMixcJGY0LFwkZjYKLTArMDA4NCA8W14+XSo+IG5tc3ViLnMJXCRmMCxcJGYyLFwkZjQsXCRmNgotMCswMDg4IDxbXj5dKj4gcHJlZngJMHg0LFwkYTBcKFwkYTFcKQotMCswMDhjIDxbXj5dKj4gcmVjaXAuZAlcJGY0LFwkZjYKLTArMDA5MCA8W14+XSo+IHJlY2lwLnMJXCRmNCxcJGY2Ci0wKzAwOTQgPFtePl0qPiByc3FydC5kCVwkZjQsXCRmNgotMCswMDk4IDxbXj5dKj4gcnNxcnQucwlcJGY0LFwkZjYKLTArMDA5YyA8W14+XSo+IHNkeGMxCVwkZjQsXCRhMFwoXCRhMVwpCi0wKzAwYTAgPFtePl0qPiBzd3hjMQlcJGY0LFwkYTBcKFwkYTFcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjhiOTQzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IC1taXBzNCBpbnN0cnVjdGlvbnMuCi0KLXRleHRfbGFiZWw6CQotCWJjMWYJdGV4dF9sYWJlbAotCWJjMWYJJGZjYzEsdGV4dF9sYWJlbAotCWJjMWZsCSRmY2MxLHRleHRfbGFiZWwKLQliYzF0CSRmY2MxLHRleHRfbGFiZWwKLQliYzF0bAkkZmNjMix0ZXh0X2xhYmVsCi0JYy5mLmQJJGY0LCRmNgotCWMuZi5kCSRmY2MxLCRmNCwkZjYKLQlsZHhjMQkkZjIsJDQoJDUpCi0JbHd4YzEJJGYyLCQ0KCQ1KQotCW1hZGQuZAkkZjAsJGYyLCRmNCwkZjYKLQltYWRkLnMJJGYwLCRmMiwkZjQsJGY2Ci0JbW92ZgkkNCwkNSwkZmNjNAotCW1vdmYuZAkkZjQsJGY2LCRmY2MwCi0JbW92Zi5zCSRmNCwkZjYsJGZjYzAKLQltb3ZuCSQ0LCQ2LCQ2Ci0JbW92bi5kCSRmNCwkZjUsJDYKLQltb3ZuLnMJJGY0LCRmNSwkNgotCW1vdnQJJDQsJDUsJGZjYzQKLQltb3Z0LmQJJGY0LCRmNiwkZmNjMAotCW1vdnQucwkkZjQsJGY2LCRmY2MwCi0JbW92egkkNCwkNiwkNgotCW1vdnouZAkkZjQsJGY1LCQ2Ci0JbW92ei5zCSRmNCwkZjUsJDYKLQltc3ViLmQJJGYwLCRmMiwkZjQsJGY2Ci0JbXN1Yi5zCSRmMCwkZjIsJGY0LCRmNgotCW5tYWRkLmQJJGYwLCRmMiwkZjQsJGY2Ci0Jbm1hZGQucwkkZjAsJGYyLCRmNCwkZjYKLQlubXN1Yi5kCSRmMCwkZjIsJGY0LCRmNgotCW5tc3ViLnMJJGYwLCRmMiwkZjQsJGY2Ci0KLQkjIFdlIGRvbid0IHRlc3QgcHJlZiBiZWNhdXNlIGN1cnJlbnRseSB0aGUgZGlzYXNzZW1ibGVyIHdpbGwKLQkjIGRpc2Fzc2VtYmxlIGl0IGFzIGx3YzMuICBsd2MzIGlzIGNvcnJlY3QgZm9yIG1pcHMxIHRvIG1pcHMzLAotCSMgd2hpbGUgcHJlZiBpcyBjb3JyZWN0IGZvciBtaXBzNC4gIFVuZm9ydHVuYXRlbHksIHRoZQotCSMgZGlzYXNzZW1ibGVyIGRvZXMgbm90IGtub3cgd2hpY2ggYXJjaGl0ZWN0dXJlIGl0IGlzCi0JIyBkaXNhc3NlbWJsaW5nIGZvci4KLQkjIHByZWYJNCwwKCQ0KQotCi0JcHJlZngJNCwkNCgkNSkKLQlyZWNpcC5kCSRmNCwkZjYKLQlyZWNpcC5zCSRmNCwkZjYKLQlyc3FydC5kCSRmNCwkZjYKLQlyc3FydC5zCSRmNCwkZjYKLQlzZHhjMQkkZjQsJDQoJDUpCi0Jc3d4YzEJJGY0LCQ0KCQ1KQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDAxMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RlMTk2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQwMTAuZAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDEwCi0jbmFtZTogTUlQUyA0MDEwCi0jYXM6IC1tY3B1PTQwMTAKLQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC50ZXh0OgotMCswMDAwIDxzdHVmZj4gZmx1c2hpCi0wKzAwMDQgPHN0dWZmXCsweDQ+IGZsdXNoZAotMCswMDA4IDxzdHVmZlwrMHg4PiBmbHVzaGlkCi0wKzAwMGMgPHN0dWZmXCsweGM+IG1hZGQJXCRhMCxcJGExCi0wKzAwMTAgPHN0dWZmXCsweDEwPiBtYWRkdQlcJGExLFwkYTIKLTArMDAxNCA8c3R1ZmZcKzB4MTQ+IGZmYwlcJGEyLFwkYTMKLTArMDAxOCA8c3R1ZmZcKzB4MTg+IGZmcwlcJGEzLFwkdDAKLTArMDAxYyA8c3R1ZmZcKzB4MWM+IG1zdWIJXCR0MCxcJHQxCi0wKzAwMjAgPHN0dWZmXCsweDIwPiBtc3VidQlcJHQxLFwkdDIKLTArMDAyNCA8c3R1ZmZcKzB4MjQ+IHNlbHNsCVwkdDIsXCR0MyxcJHQ0Ci0wKzAwMjggPHN0dWZmXCsweDI4PiBzZWxzcglcJHQzLFwkdDQsXCR0NQotMCswMDJjIDxzdHVmZlwrMHgyYz4gd2FpdGkKLTArMDAzMCA8c3R1ZmZcKzB4MzA+IHdiCTE2XChcJHQ2XCkKLTArMDAzNCA8c3R1ZmZcKzB4MzQ+IGFkZGNpdQlcJHQ2LFwkdDcsMTYKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQwMTAucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQwMTAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkNmUyNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MDEwLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JLnRleHQKLQotc3R1ZmY6Ci0JLmVudCBzdHVmZgotCWZsdXNoaQotCWZsdXNoZAotCWZsdXNoaWQKLQltYWRkICQ0LCQ1Ci0JbWFkZHUgJDUsJDYKLQlmZmMgJDYsJDcKLQlmZnMgJDcsJDgKLQltc3ViICQ4LCQ5Ci0JbXN1YnUgJDksJDEwCi0Jc2Vsc2wgJDEwLCQxMSwkMTIKLQlzZWxzciAkMTEsJDEyLCQxMwotCXdhaXRpCi0Jd2IgMTYoJDE0KQotCWFkZGNpdSAkMTQsJDE1LDE2Ci0Jbm9wCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0MTAwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODRmMTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQxMDAKLSNuYW1lOiBNSVBTIDQxMDAKLSNhczogLW1jcHU9NDEwMAotCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPHN0dWZmPiBkbWFkZDE2CVwkYTAsXCRhMQotCS4uLgotMCswMDBjIDxzdHVmZlwrMHhjPiBtYWRkMTYJXCRhMSxcJGEyCi0wKzAwMTAgPHN0dWZmXCsweDEwPiBoaWJlcm5hdGUKLTArMDAxNCA8c3R1ZmZcKzB4MTQ+IHN0YW5kYnkKLTArMDAxOCA8c3R1ZmZcKzB4MTg+IHN1c3BlbmQKLTArMDAxYyA8c3R1ZmZcKzB4MWM+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDEwMC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIwZTBlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQxMDAucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCi1zdHVmZjoKLQkuZW50IHN0dWZmCi0JZG1hZGQxNiAkNCwkNQotCW1hZGQxNiAkNSwkNgotCWhpYmVybmF0ZQotCXN0YW5kYnkKLQlzdXNwZW5kCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL21pcHM0NjUwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNjQyYTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQ2NTAKLSNuYW1lOiBNSVBTIDQ2NTAKLSNhczogLW1jcHU9NDY1MAotCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0wKzAwMDAgPHN0dWZmPiBtYWQJXCRhMCxcJGExCi0JLi4uCi0wKzAwMGMgPHN0dWZmXCsweGM+IG1hZHUJXCRhMSxcJGEyCi0JLi4uCi0wKzAwMTggPHN0dWZmXCsweDE4PiBtdWwJXCRhMixcJGEzLFwkdDAKLTArMDAxYyA8c3R1ZmZcKzB4MWM+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9taXBzNDY1MC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmMyMmExLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbWlwczQ2NTAucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0KLXN0dWZmOgotCS5lbnQgc3R1ZmYKLQltYWQgJDQsJDUKLQltYWR1ICQ1LCQ2Ci0JbXVsICQ2LCQ3LCQ4Ci0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL211bC1pbG9ja3MuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLWlsb2Nrcy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFlZDJlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLWlsb2Nrcy5kCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBNSVBTIG11bC1pbG9ja3MKLSNhczoKLSNzb3VyY2U6IG11bC5zCi0KLSMgVGVzdCB0aGUgbXVsIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBtdWx0dQlcJGEwLFwkYTEKLTArMDAwNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDA4IDxbXj5dKj4gbXVsdHUJXCRhMSxcJGEyCi0wKzAwMGMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMAotMCswMDE0IDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDAxOCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDFjIDxbXj5dKj4gbGkJXCRhdCwxCi0wKzAwMjAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDI0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMjggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDJjIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDAzMCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDM0IDxbXj5dKj4gbGkJXCRhdCwtMzI3NjgKLTArMDAzOCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwM2MgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA0MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ0IDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDA0OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDRjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNTAgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDU0IDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDA1OCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDVjIDxbXj5dKj4gbXVsdAlcJGEwLFwkYTEKLTArMDA2MCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDY0IDxbXj5dKj4gc3JhCVwkYTAsXCRhMCwweDFmCi0wKzAwNjggPFtePl0qPiBtZmhpCVwkYXQKLTArMDA2YyA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCs3OCA8Zm9vXCsoMHh8KTc4PgotMCswMDcwIDxbXj5dKj4gbm9wCi0wKzAwNzQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwNzggPFtePl0qPiBtZmxvCVwkYTAKLTArMDA3YyA8W14+XSo+IG11bHQJXCRhMSxcJGEyCi0wKzAwODAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDA4NCA8W14+XSo+IHNyYQlcJGEwLFwkYTAsMHgxZgotMCswMDg4IDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwOGMgPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArOTggPGZvb1wrKDB4fCk5OD4KLTArMDA5MCA8W14+XSo+IG5vcAotMCswMDk0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMDk4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwOWMgPFtePl0qPiBtdWx0dQlcJGEwLFwkYTEKLTArMDBhMCA8W14+XSo+IG1maGkJXCRhdAotMCswMGE0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYTggPFtePl0qPiBiZXF6CVwkYXQsMCtiNCA8Zm9vXCsoMHh8KWI0PgotMCswMGFjIDxbXj5dKj4gbm9wCi0wKzAwYjAgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwYjQgPFtePl0qPiBtdWx0dQlcJGExLFwkYTIKLTArMDBiOCA8W14+XSo+IG1maGkJXCRhdAotMCswMGJjIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwYzAgPFtePl0qPiBiZXF6CVwkYXQsMCtjYyA8Zm9vXCsoMHh8KWNjPgotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwY2MgPFtePl0qPiBkbXVsdHUJXCRhMSxcJGEyCi0wKzAwZDAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBkNCA8W14+XSo+IGxpCVwkYXQsMQotMCswMGQ4IDxbXj5dKj4gZG11bHQJXCRhMSxcJGF0Ci0wKzAwZGMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBlMCA8W14+XSo+IGRtdWx0CVwkYTEsXCRhMgotMCswMGU0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZTggPFtePl0qPiBkc3JhMzIJXCRhMCxcJGEwLDB4MWYKLTArMDBlYyA8W14+XSo+IG1maGkJXCRhdAotMCswMGYwIDxbXj5dKj4gYmVxCVwkYTAsXCRhdCwwK2ZjIDxmb29cKygweHwpZmM+Ci0wKzAwZjQgPFtePl0qPiBub3AKLTArMDBmOCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDBmYyA8W14+XSo+IG1mbG8JXCRhMAotMCswMTAwIDxbXj5dKj4gZG11bHR1CVwkYTEsXCRhMgotMCswMTA0IDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAxMDggPFtePl0qPiBtZmxvCVwkYTAKLTArMDEwYyA8W14+XSo+IGJlcXoJXCRhdCwwKzExOCA8Zm9vXCsoMHh8KTExOD4KLTArMDExMCA8W14+XSo+IG5vcAotMCswMTE0IDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYjYyNjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwuZAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo0MDAwCi0jYXM6IC1tY3B1PXI0MDAwCi0jbmFtZTogTUlQUyBtdWwKLQotIyBUZXN0IHRoZSBtdWwgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IG11bHR1CVwkYTAsXCRhMQotMCswMDA0IDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAwMTAgPFtePl0qPiBtdWx0dQlcJGExLFwkYTIKLTArMDAxNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDE4IDxbXj5dKj4gbGkJXCRhdCwwCi0wKzAwMWMgPFtePl0qPiBub3AKLTArMDAyMCA8W14+XSo+IG11bHQJXCRhMSxcJGF0Ci0wKzAwMjQgPFtePl0qPiBtZmxvCVwkYTAKLTArMDAyOCA8W14+XSo+IGxpCVwkYXQsMQotMCswMDJjIDxbXj5dKj4gbm9wCi0wKzAwMzAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDM0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwMzggPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDNjIDxbXj5dKj4gbm9wCi0wKzAwNDAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDQ0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNDggPFtePl0qPiBsaQlcJGF0LC0zMjc2OAotMCswMDRjIDxbXj5dKj4gbm9wCi0wKzAwNTAgPFtePl0qPiBtdWx0CVwkYTEsXCRhdAotMCswMDU0IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwNTggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA1YyA8W14+XSo+IG5vcAotMCswMDYwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDA2NCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDY4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNmMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDcwIDxbXj5dKj4gbXVsdAlcJGExLFwkYXQKLTArMDA3NCA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMDgwIDxbXj5dKj4gbXVsdAlcJGEwLFwkYTEKLTArMDA4NCA8W14+XSo+IG1mbG8JXCRhMAotMCswMDg4IDxbXj5dKj4gc3JhCVwkYTAsXCRhMCwweDFmCi0wKzAwOGMgPFtePl0qPiBtZmhpCVwkYXQKLTArMDA5MCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCs5YyA8Zm9vXCsoMHh8KTljPgotMCswMDk0IDxbXj5dKj4gbm9wCi0wKzAwOTggPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwOWMgPFtePl0qPiBtZmxvCVwkYTAKLQkuLi4KLTArMDBhOCA8W14+XSo+IG11bHQJXCRhMSxcJGEyCi0wKzAwYWMgPFtePl0qPiBtZmxvCVwkYTAKLTArMDBiMCA8W14+XSo+IHNyYQlcJGEwLFwkYTAsMHgxZgotMCswMGI0IDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAwYjggPFtePl0qPiBiZXEJXCRhMCxcJGF0LDArYzQgPGZvb1wrKDB4fCljND4KLTArMDBiYyA8W14+XSo+IG5vcAotMCswMGMwIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotMCswMGM0IDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAwZDAgPFtePl0qPiBtdWx0dQlcJGEwLFwkYTEKLTArMDBkNCA8W14+XSo+IG1maGkJXCRhdAotMCswMGQ4IDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZGMgPFtePl0qPiBiZXF6CVwkYXQsMCtlOCA8Zm9vXCsoMHh8KWU4PgotMCswMGUwIDxbXj5dKj4gbm9wCi0wKzAwZTQgPFtePl0qPiBicmVhawkoMHgwLDB4NnwweDYpCi0wKzAwZTggPFtePl0qPiBtdWx0dQlcJGExLFwkYTIKLTArMDBlYyA8W14+XSo+IG1maGkJXCRhdAotMCswMGYwIDxbXj5dKj4gbWZsbwlcJGEwCi0wKzAwZjQgPFtePl0qPiBiZXF6CVwkYXQsMCsxMDAgPGZvb1wrKDB4fCkxMDA+Ci0wKzAwZjggPFtePl0qPiBub3AKLTArMDBmYyA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDEwMCA8W14+XSo+IGRtdWx0dQlcJGExLFwkYTIKLTArMDEwNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTA4IDxbXj5dKj4gbGkJXCRhdCwxCi0wKzAxMGMgPFtePl0qPiBub3AKLTArMDExMCA8W14+XSo+IGRtdWx0CVwkYTEsXCRhdAotMCswMTE0IDxbXj5dKj4gbWZsbwlcJGEwCi0JLi4uCi0wKzAxMjAgPFtePl0qPiBkbXVsdAlcJGExLFwkYTIKLTArMDEyNCA8W14+XSo+IG1mbG8JXCRhMAotMCswMTI4IDxbXj5dKj4gZHNyYTMyCVwkYTAsXCRhMCwweDFmCi0wKzAxMmMgPFtePl0qPiBtZmhpCVwkYXQKLTArMDEzMCA8W14+XSo+IGJlcQlcJGEwLFwkYXQsMCsxM2MgPGZvb1wrKDB4fCkxM2M+Ci0wKzAxMzQgPFtePl0qPiBub3AKLTArMDEzOCA8W14+XSo+IGJyZWFrCSgweDAsMHg2fDB4NikKLTArMDEzYyA8W14+XSo+IG1mbG8JXCRhMAotCS4uLgotMCswMTQ4IDxbXj5dKj4gZG11bHR1CVwkYTEsXCRhMgotMCswMTRjIDxbXj5dKj4gbWZoaQlcJGF0Ci0wKzAxNTAgPFtePl0qPiBtZmxvCVwkYTAKLTArMDE1NCA8W14+XSo+IGJlcXoJXCRhdCwwKzE2MCA8Zm9vXCsoMHh8KTE2MD4KLTArMDE1OCA8W14+XSo+IG5vcAotMCswMTVjIDxbXj5dKj4gYnJlYWsJKDB4MCwweDZ8MHg2KQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvbXVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWUzNjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9tdWwucworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBtdWwgbWFjcm8uCi0JCi1mb286Ci0JbXVsCSQ0LCQ1Ci0JbXVsCSQ0LCQ1LCQ2Ci0JbXVsCSQ0LCQ1LDAKLQltdWwJJDQsJDUsMQotCW11bAkkNCwkNSwweDgwMDAKLQltdWwJJDQsJDUsLTB4ODAwMAotCW11bAkkNCwkNSwweDEwMDAwCi0JbXVsCSQ0LCQ1LDB4MWE1YTUKLQotIyBtdWxvIGFuZCBtdWxvdSBhcmUgb25seSBzdXBwb3J0ZWQgZm9yIHJlZ2lzdGVyIGFyZ3VtZW50cwkKLQltdWxvCSQ0LCQ1Ci0JbXVsbwkkNCwkNSwkNgotCi0JbXVsb3UJJDQsJDUKLQltdWxvdQkkNCwkNSwkNgotCi0jIFNhbml0eSBjaGVjayB0aGUgNjQgYml0IHZlcnNpb25zLgotCS5zZXQJbWlwczMKLQlkbXVsCSQ0LCQ1LCQ2Ci0JZG11bAkkNCwkNSwxCi0JZG11bG8JJDQsJDUsJDYKLQlkbXVsb3UJJDQsJDUsJDYKLQotICAgICAgICAuc3BhY2UJOApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9ub2RlbGF5LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL25vZGVsYXkuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM5MzA3OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL25vZGVsYXkuZAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczo1MDAwCi0jbmFtZTogTUlQUyBub2RlbGF5Ci0jYXM6IC1taXBzNCAtbWNwdT1yODAwMAotI3NvdXJjZTogZGVsYXkucwotCi0jIEZvciAtbWlwczQgCi0jIEdhcyBzaG91bGQgKm5vdCogcHJvZHVjZSBub3AncyBhZnRlciBtdGMxIGFuZCByZWxhdGVkIAotIyBpbnNuJ3MgaWYgdGhlIHRhcmdldCBmcHIgaXMgdXNlZCBpbiB0aGUgaW1tZWRpYXRseSAKLSMgZm9sbG93aW5nIGluc24uICBTZWUgYWxzbyBkZWxheS5kLgotIwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBtdGMxCVwkemVybyxcJGYwCi0wKzAwMDQgPFtePl0qPiBjdnQuZC53CVwkZjAsXCRmMAotMCswMDA4IDxbXj5dKj4gbXRjMQlcJHplcm8sXCRmMQotMCswMDBjIDxbXj5dKj4gY3Z0LmQudwlcJGYxLFwkZjEKLQkuLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3JvbC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGNlMTQyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvcm9sLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI2FzOiAtbWNwdT1yMzAwMAotI25hbWU6IE1JUFMgUjMwMDAgcm9sCi0KLSMgVGVzdCB0aGUgcm9sIGFuZCByb3IgbWFjcm9zLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBuZWd1CVwkYXQsXCRhMQotMCswMDA0IDxbXj5dKj4gc3JsdglcJGF0LFwkYTAsXCRhdAotMCswMDA4IDxbXj5dKj4gc2xsdglcJGEwLFwkYTAsXCRhMQotMCswMDBjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAxMCA8W14+XSo+IG5lZ3UJXCRhdCxcJGEyCi0wKzAwMTQgPFtePl0qPiBzcmx2CVwkYXQsXCRhMSxcJGF0Ci0wKzAwMTggPFtePl0qPiBzbGx2CVwkYTAsXCRhMSxcJGEyCi0wKzAwMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDIwIDxbXj5dKj4gc2xsCVwkYXQsXCRhMCwweDEKLTArMDAyNCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHgxZgotMCswMDI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAyYyA8W14+XSo+IHNsbAlcJGF0LFwkYTEsMHgxCi0wKzAwMzAgPFtePl0qPiBzcmwJXCRhMCxcJGExLDB4MWYKLTArMDAzNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMzggPFtePl0qPiBuZWd1CVwkYXQsXCRhMQotMCswMDNjIDxbXj5dKj4gc2xsdglcJGF0LFwkYTAsXCRhdAotMCswMDQwIDxbXj5dKj4gc3JsdglcJGEwLFwkYTAsXCRhMQotMCswMDQ0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA0OCA8W14+XSo+IG5lZ3UJXCRhdCxcJGEyCi0wKzAwNGMgPFtePl0qPiBzbGx2CVwkYXQsXCRhMSxcJGF0Ci0wKzAwNTAgPFtePl0qPiBzcmx2CVwkYTAsXCRhMSxcJGEyCi0wKzAwNTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDU4IDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDEKLTArMDA1YyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHgxZgotMCswMDYwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA2NCA8W14+XSo+IHNybAlcJGF0LFwkYTEsMHgxCi0wKzAwNjggPFtePl0qPiBzbGwJXCRhMCxcJGExLDB4MWYKLTArMDA2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3JvbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9yb2wucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5YTk1Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3JvbC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHJvbCBhbmQgcm9yIG1hY3Jvcy4KLQotZm9vOgotCXJvbAkkNCwkNQotCXJvbAkkNCwkNSwkNgotCXJvbAkkNCwxCi0Jcm9sCSQ0LCQ1LDEKLQotCXJvcgkkNCwkNQotCXJvcgkkNCwkNSwkNgotCXJvcgkkNCwxCi0Jcm9yCSQ0LCQ1LDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc2IuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmNGJjMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3NiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHNiCi0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIHNiIG1hY3JvLgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qbWlwcy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPFtePl0qPiBzYglcJGEwLDBcKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBzYglcJGEwLDFcKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDAwYyA8W14+XSo+IHNiCVwkYTAsLTMyNzY4XChcJGF0XCkKLTArMDAxMCA8W14+XSo+IHNiCVwkYTAsLTMyNzY4XChcJHplcm9cKQotMCswMDE0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMTggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwMjAgPFtePl0qPiBzYglcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwMjQgPFtePl0qPiBzYglcJGEwLDBcKFwkYTFcKQotMCswMDI4IDxbXj5dKj4gc2IJXCRhMCwxXChcJGExXCkKLTArMDAyYyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDMwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMDM0IDxbXj5dKj4gc2IJXCRhMCwtMzI3NjhcKFwkYXRcKQotMCswMDM4IDxbXj5dKj4gc2IJXCRhMCwtMzI3NjhcKFwkYTFcKQotMCswMDNjIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAwNDQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMDQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgyCi0wKzAwNGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAwNTAgPFtePl0qPiBzYglcJGEwLC0yMzEzMVwoXCRhdFwpCi0wKzAwNTQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNTQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSo2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGdwXCkKLVsgCV0qNjQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2YyA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA3MCA8W14+XSo+IHNiCVwkYTAsMFwoXCRncFwpCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDc0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjc0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDc4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qNzg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwN2MgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkZ3BcKQotWyAJXSo3YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwODAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qODA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDg0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qODQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwOGMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSo4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDkwIDxbXj5dKj4gc2IJXCRhMCwxXChcJGdwXCkKLVsgCV0qOTA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjk0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjk4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA5YyA8W14+XSo+IHNiCVwkYTAsMVwoXCRncFwpCi1bIAldKjljOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMGE0IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkZ3BcKQotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSphYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpiMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGI4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBjYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKmNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZDQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSpkNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDBkOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMGRjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMGUwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMGU0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBlOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKmU4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBlYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGYwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSpmODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZmMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTAwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEwNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxMDQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMGMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTEwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTE0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjExNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxMTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTFjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDEyMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjEyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjEyODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTM4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMTM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDEzYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0MCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi1bIAldKjE0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE0NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE0OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE0YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxNTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxNTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTU0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE1OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE1ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxNWMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTY0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTcwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMTcwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE3NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE3NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE3ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE3YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE4MCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjE4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE4NCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE4NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxODggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxODg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMThjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE4YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAxOTQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMWEwIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAxYTggPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAxYjQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoxYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMWJjIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMWJjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDFjOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFjYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFkMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFkMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZDQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFkOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDFkYyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZTQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAxZTggPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoxZTg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlYyA8W14+XSo+IGFkZHUJXCRhdCxcJGExLFwkZ3AKLTArMDFmMCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi1bIAldKjFmMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxZjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFmOCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDFmYyA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhMSxcJGdwCi0wKzAyMDQgPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotWyAJXSoyMDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjBjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjEwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjEwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjE0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYTEsXCRncAotMCswMjE4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDIxYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyMjQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMmMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyMzAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIzNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMzggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyM2MgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI0NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI0OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI0ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyNTQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyNjAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNjQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjZjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI3MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyNzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjc0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMjc4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMjc4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDI4NCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjI4NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyOTAgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyOTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjk0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI5NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOTggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyOWMgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJhOCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJhODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyYWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyYjQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSoyYjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDJjMCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjJjMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyYzQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMmM4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmNjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDJkMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJkMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmQ4IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyZGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmUwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmU0IDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDJlOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAyZjAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotWyAJXSoyZjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmY0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmY0OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmY4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMmZjIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLVsgCV0qMmZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzAwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzAwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzA0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzA4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzA4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzBjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzBjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDMxMCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDMxNCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjMxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMzFjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzIwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDMyNCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMyNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzI4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzJjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozMzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzM0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzM4IDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDMzYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAzNDAgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGExCi0wKzAzNDQgPFtePl0qPiBzYglcJGEwLFstMC05XStcKFwkYXRcKQotWyAJXSozNDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzRjIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzUwIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzU0IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzU0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMzU4IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRhMQotMCswMzVjIDxbXj5dKj4gc2IJXCRhMCxbLTAtOV0rXChcJGF0XCkKLVsgCV0qMzVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMzYwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDM2NCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkYTEKLTArMDM2OCA8W14+XSo+IHNiCVwkYTAsWy0wLTldK1woXCRhdFwpCi1bIAldKjM2ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzNmMgPFtePl0qPiBzdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzAgPFtePl0qPiBzdwlcJGExLDRcKFwkemVyb1wpCi0wKzAzNzQgPFtePl0qPiBzaAlcJGEwLDBcKFwkemVyb1wpCi0wKzAzNzggPFtePl0qPiBzdwlcJGEwLDBcKFwkemVyb1wpCi0wKzAzN2MgPFtePl0qPiBzd2MwCVwkNCwwXChcJHplcm9cKQotMCswMzgwIDxbXj5dKj4gc3djMQlcJGY0LDBcKFwkemVyb1wpCi0wKzAzODQgPFtePl0qPiBzd2MyCVwkNCwwXChcJHplcm9cKQotMCswMzg4IDxbXj5dKj4gc3djMwlcJDQsMFwoXCR6ZXJvXCkKLTArMDM4YyA8W14+XSo+IHN3YzEJXCRmNCwwXChcJHplcm9cKQotMCswMzkwIDxbXj5dKj4gc3dsCVwkYTAsMFwoXCR6ZXJvXCkKLTArMDM5NCA8W14+XSo+IHN3cglcJGEwLDBcKFwkemVyb1wpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3NiLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3NiLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzczNTQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zYi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSBzYiBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0Jc2IJJDQsMAotCXNiCSQ0LDEKLQlzYgkkNCwweDgwMDAKLQlzYgkkNCwtMHg4MDAwCi0Jc2IJJDQsMHgxMDAwMAotCXNiCSQ0LDB4MWE1YTUKLQlzYgkkNCwwKCQ1KQotCXNiCSQ0LDEoJDUpCi0Jc2IJJDQsMHg4MDAwKCQ1KQotCXNiCSQ0LC0weDgwMDAoJDUpCi0Jc2IJJDQsMHgxMDAwMCgkNSkKLQlzYgkkNCwweDFhNWE1KCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbgotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXNiCSQ0LGRhdGFfbGFiZWwrMQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0Jc2IJJDQsZGF0YV9sYWJlbCsweDgwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHg4MDAwCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4ODAwMAotCXNiCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbC0weDgwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uLTB4ODAwMAotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQlzYgkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4MTAwMDAKLQlzYgkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXNiCSQ0LGRhdGFfbGFiZWwrMHgxYTVhNQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4MWE1YTUKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDFhNWE1Ci0Jc2IJJDQsZGF0YV9sYWJlbCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24oJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKCQ1KQotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24oJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwrMSgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMSgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0Jc2IJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbisxKCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxKCQ1KQotCXNiCSQ0LGRhdGFfbGFiZWwrMHg4MDAwKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMCgkNSkKLQlzYgkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMCgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwKCQ1KQotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAoJDUpCi0Jc2IJJDQsZGF0YV9sYWJlbC0weDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwKCQ1KQotCXNiCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAoJDUpCi0Jc2IJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAoJDUpCi0Jc2IJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMCgkNSkKLQlzYgkkNCxkYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMCgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwKCQ1KQotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMCgkNSkKLQlzYgkkNCxkYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNSgkNSkKLQlzYgkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUoJDUpCi0Jc2IJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCXNiCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1KCQ1KQotCXNiCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQlzYgkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNSgkNSkKLQkKLSMgU2V2ZXJhbCBtYWNyb3MgYXJlIGhhbmRsZWQgbGlrZSBzYi4gIFNhbml0eSBjaGVjayB0aGVtLgotCXNkCSQ0LDAKLQlzaAkkNCwwCi0Jc3cJJDQsMAotCXN3YzAJJDQsMAotCXN3YzEJJDQsMAotCXN3YzIJJDQsMAotCXN3YzMJJDQsMAotCXMucwkkZjQsMAotCXN3bAkkNCwwCi0Jc3dyCSQ0LDAKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWExODcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtLXNob3ctcmF3LWluc24KLSNuYW1lOiBzeW5jIGluc3RydWN0aW9ucwotI2FzOiAtbWlwczIKLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIFwudGV4dDoKLTArMDAwMCA8Zm9vPiAwMDAwMDAwZlsgCV0qc3luYwotMCswMDA0IDxmb29cKzB4ND4gMDAwMDA0MGZbIAldKnN5bmMucAotMCswMDA4IDxmb29cKzB4OD4gMDAwMDAwMGZbIAldKnN5bmMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvc3luYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYzBlZDMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy9zeW5jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotZm9vOgotCXN5bmMKLQlzeW5jLnAKLQlzeW5jLmwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdhZGIwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJhcDIwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jYXM6IC1tY3B1PXI0MDAwCi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgMjAtYml0IHRyYXAKLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gdGVxCVwkemVybyxcJHYxCi0wKzAwMDQgPFtePl0qPiB0ZXEJXCR6ZXJvLFwkdjEsMHgxCi0wKzAwMDggPFtePl0qPiB0Z2UJXCR6ZXJvLFwkdjEKLTArMDAwYyA8W14+XSo+IHRnZQlcJHplcm8sXCR2MSwweDMKLTArMDAxMCA8W14+XSo+IHRnZXUJXCR6ZXJvLFwkdjEKLTArMDAxNCA8W14+XSo+IHRnZXUJXCR6ZXJvLFwkdjEsMHg3Ci0wKzAwMTggPFtePl0qPiB0bHQJXCR6ZXJvLFwkdjEKLTArMDAxYyA8W14+XSo+IHRsdAlcJHplcm8sXCR2MSwweDFmCi0wKzAwMjAgPFtePl0qPiB0bHR1CVwkemVybyxcJHYxCi0wKzAwMjQgPFtePl0qPiB0bHR1CVwkemVybyxcJHYxLDB4ZmYKLTArMDAyOCA8W14+XSo+IHRuZQlcJHplcm8sXCR2MQotMCswMDJjIDxbXj5dKj4gdG5lCVwkemVybyxcJHYxLDB4M2ZmCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cmFwMjAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2ZDY1OS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RyYXAyMC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIDIwLWJpdCB0cmFwIGluc3RydWN0aW9ucwotZm9vOgkKLQl0ZXEJJDAsJDMKLQl0ZXEJJDAsJDMsMQotCXRnZQkkMCwkMwotCXRnZQkkMCwkMywzCi0JdGdldQkkMCwkMwotCXRnZXUJJDAsJDMsNwotCXRsdAkkMCwkMwotCXRsdAkkMCwkMywzMQotCXRsdHUJJDAsJDMKLQl0bHR1CSQwLCQzLDI1NQotCXRuZQkkMCwkMwotCXRuZQkkMCwkMywxMDIzCi0JCi0jIGZvcmNlIHNvbWUgcGFkZGluZywgdG8gbWFrZSBvYmpkdW1wIGNvbnNpc3RlbnRseSByZXBvcnQgdGhhdCB0aGVyZSdzIHNvbWUKLSMgaGVyZS4uLgotCS5zcGFjZQk4CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzhhZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy90cnVuYy5kCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHRydW5jCi0jYXM6IC1taXBzMSAtbWNwdT1yMzAwMAotCi0jIFRlc3QgdGhlIHRydW5jIG1hY3Jvcy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gY2ZjMQlcJGEwLFwkMzEKLTArMDAwNCA8W14+XSo+IGNmYzEJXCRhMCxcJDMxCi0wKzAwMDggPFtePl0qPiBub3AKLTArMDAwYyA8W14+XSo+IG9yaQlcJGF0LFwkYTAsMHgzCi0wKzAwMTAgPFtePl0qPiB4b3JpCVwkYXQsXCRhdCwweDIKLTArMDAxNCA8W14+XSo+IGN0YzEJXCRhdCxcJDMxCi0wKzAwMTggPFtePl0qPiBub3AKLTArMDAxYyA8W14+XSo+IGN2dC53LmQJXCRmNCxcJGY2Ci0wKzAwMjAgPFtePl0qPiBjdGMxCVwkYTAsXCQzMQotMCswMDI0IDxbXj5dKj4gbm9wCi0wKzAwMjggPFtePl0qPiBjZmMxCVwkYTAsXCQzMQotMCswMDJjIDxbXj5dKj4gY2ZjMQlcJGEwLFwkMzEKLTArMDAzMCA8W14+XSo+IG5vcAotMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhMCwweDMKLTArMDAzOCA8W14+XSo+IHhvcmkJXCRhdCxcJGF0LDB4MgotMCswMDNjIDxbXj5dKj4gY3RjMQlcJGF0LFwkMzEKLTArMDA0MCA8W14+XSo+IG5vcAotMCswMDQ0IDxbXj5dKj4gY3Z0LncucwlcJGY0LFwkZjYKLTArMDA0OCA8W14+XSo+IGN0YzEJXCRhMCxcJDMxCi0wKzAwNGMgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdHJ1bmMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlOTBmMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3RydW5jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB0cnVuYyBtYWNyb3MuCi0KLWZvbzoKLQl0cnVuYy53LmQJJGY0LCRmNiwkNAotCi0JdHJ1bmMudy5zCSRmNCwkZjYsJDQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlMjlkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjQwMDAKLSNuYW1lOiBNSVBTIHVsZAotI2FzOiAtbWlwczMgLW1jcHU9cjQwMDAKLQotIyBUZXN0IHRoZSB1bGQgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbGRsCVwkYTAsWzE4XVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGxkcglcJGEwLFsxOF1cKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDE0IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGxkbAlcJGEwLC0zMjc2WzE4XVwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IGxkcglcJGEwLC0zMjc2WzE4XVwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAzOCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbGRsCVwkYTAsWzE4XVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBsZHIJXCRhMCxbLTAtOV0rXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1NCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwNTggPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDYwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2OCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDZjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNzAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwODggPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSo4YzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA5MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDk0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDA5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYTggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjggPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qYjg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMGJjIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYzAgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpjNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGM4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwY2MgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkMCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlOCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGVjIDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZjAgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTAwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTA4IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTBjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTE0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEzNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTQwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNDQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTYwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxNzAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE3NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDE3YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTgwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxODQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMThjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWEwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYTQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFhOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFiNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWM0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFkMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZDggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMWRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFlMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWU0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFlYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWYwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZjQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDIwMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjA0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIwYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIyNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIyYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjMwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIzYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI0NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjU0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNjAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI2NCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDI2YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyODQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjhjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjk0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyOTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjljIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBsZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJhNCA8W14+XSo+IGxkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmI0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMmMwIDxbXj5dKj4gbGRsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYzQgPFtePl0qPiBsZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyY2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJkMCA8W14+XSo+IGxkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmQ0IDxbXj5dKj4gbGRyCVwkYTAsWzA3XVwoXCRhdFwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhZmZiYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsZC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVsZCBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdWxkCSQ0LDAKLQl1bGQJJDQsMQotCXVsZAkkNCwweDgwMDAKLQl1bGQJJDQsLTB4ODAwMAotCXVsZAkkNCwweDEwMDAwCi0JdWxkCSQ0LDB4MWE1YTUKLQl1bGQJJDQsMCgkNSkKLQl1bGQJJDQsMSgkNSkKLQl1bGQJJDQsZGF0YV9sYWJlbAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdWxkCSQ0LGRhdGFfbGFiZWwrMQotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bGQJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JdWxkCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVsZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bGQJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdWxkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bGQJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bGQJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsZAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXVsZAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bGQJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdWxkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdWxkCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXVsZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtZW1waWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLWVtcGljLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NWYwNmIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtZW1waWMuZAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLSNvYmpkdW1wOiAtZHIgLS1wcmVmaXgtYWRkcmVzc2VzIC1tbWlwczozMDAwCi0jbmFtZTogTUlQUyB1bGgtZW1waWMKLSNhczogLW1pcHMxIC1tZW1iZWRkZWQtcGljCi0jc291cmNlOiB1bGgtcGljLnMKLQotIyBUZXN0IHRoZSB1bGggbWFjcm8gd2l0aCAtbWVtYmVkZGVkLXBpYy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4NAotWyAJXSowOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zZGF0YS4qCi0wKzAwMDQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDA4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwMGMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDEwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAxNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjE0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMTggPFtePl0qPiBsYnUJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDIwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAyNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMjggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMAotWyAJXSoyODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMmMgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qMzQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDM4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAzYyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwNDAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDQ0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDRjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA1MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjUwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDU0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNTggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA1YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODQKLVsgCV0qNWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMDYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsLTE1Mzg0Ci1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDA3NCA8W14+XSo+IGxidQlcJGEwLFswMV1cKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDgwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA4NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwtMTYzODMKLVsgCV0qODQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNkYXRhLioKLTArMDA4OCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSo5MDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDk0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwOWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGEwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwYTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmFjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBiMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpiODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwYmMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwYzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmNjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGQwIDxbXj5dKj4gbGJ1CVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBkOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNjM4MwotWyAJXSplMDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZTQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlOCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLC0xNTM4MwotWyAJXSplYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwZjAgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGY0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDBmOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDEwMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgtcGljLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1waWMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYjI5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1waWMucworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgVGVzdCB1bmFsaWduZWQgbG9hZCBhbmQgc3RvcmUgbWFjcm9zIHdpdGggUElDIGNvZGUuICBXZSBkb24ndCBib3RoZXIKLSMgdG8gdGVzdCBtb3N0IGNhc2VzLiAgVGhlIGFjdHVhbCBsb2FkcyBhbmQgc3RvcmVzIGFyZSB0ZXN0ZWQgYnkgdGhlCi0jIG5vbi1QSUMgdGVzdCBjYXNlLiAgV2UganVzdCB3YW50IHRvIGNoZWNrIHRoYXQgdGhlIGluaXRpYWwgYWRkcmVzcwotIyBpcyBsb2FkZWQgY29ycmVjdGx5LgotCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVsaAkkNCxkYXRhX2xhYmVsCi0JdWxodQkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1bGh1CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVsdwkkNCxkYXRhX2xhYmVsKzEKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdWxodQkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMQotCXVsdwkkNCxiaWdfbG9jYWxfY29tbW9uKzEKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uKzEKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQkuaWZuZGVmCVhHT1QKLQlub3AKLQlub3AKLQkuZW5kaWYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXN2cjRwaWMuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXN2cjRwaWMuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlMzNiZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC1zdnI0cGljLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVsaC1zdnI0cGljCi0jYXM6IC1taXBzMSAtS1BJQyAtRUIKLSNzb3VyY2U6IHVsaC1waWMucwotCi0jIFRlc3QgdGhlIHVuYWxpZ25lZCBsb2FkIGFuZCBzdG9yZSBtYWNyb3Mgd2l0aCAtS1BJQy4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwMGMgPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMDEwIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwMTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAxYyA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjFjOiBSX01JUFNfR09UMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAyMCA8W14+XSo+IG5vcAotMCswMDI0IDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAwMjggPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMzQ6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwMzggPFtePl0qPiBub3AKLTArMDAzYyA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMDQwIDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAwNDQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo0NDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA0OCA8W14+XSo+IG5vcAotMCswMDRjIDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDA1MCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwNTQgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMDU4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDYwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA2NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjY0OiBSX01JUFNfR09UMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNjggPFtePl0qPiBub3AKLTArMDA2YyA8W14+XSo+IHN3bAlcJGEwLDBcKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gc3dyCVwkYTAsM1woXCRhdFwpCi0wKzAwNzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSo3NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDA3OCA8W14+XSo+IG5vcAotMCswMDdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qN2M6IFJfTUlQU19MTzE2CS5ic3MKLTArMDA4MCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAwODQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDA4OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwOGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDkwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qOTA6IFJfTUlQU19HT1QxNgkuYnNzCi0wKzAwOTQgPFtePl0qPiBub3AKLTArMDA5OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxMDAwCi1bIAldKjk4OiBSX01JUFNfTE8xNgkuYnNzCi0wKzAwOWMgPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDBhMCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBhOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYWMgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSphYzogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwYjAgPFtePl0qPiBub3AKLTArMDBiNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKmI0OiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGI4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDBiYyA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAwYzQgPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpjNDogUl9NSVBTX0dPVDE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBub3AKLTArMDBjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAwZDAgPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDBkOCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGU4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZTg6IFJfTUlQU19HT1QxNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZWMgPFtePl0qPiBub3AKLTArMDBmMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAwZjQgPFtePl0qPiBzd2wJXCRhMCwwXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IHN3cglcJGEwLDNcKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qZmM6IFJfTUlQU19HT1QxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxMDAgPFtePl0qPiBub3AKLTArMDEwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxMDggPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxMTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTE0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDExOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjExODogUl9NSVBTX0dPVDE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTFjIDxbXj5dKj4gbm9wCi0wKzAxMjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTI0IDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAxMjggPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDEyYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTM0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTM0OiBSX01JUFNfR09UMTYJLmJzcwotMCswMTM4IDxbXj5dKj4gbm9wCi0wKzAxM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoxM2M6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxNDQgPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDE0OCA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMTRjIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMTRjOiBSX01JUFNfR09UMTYJLmJzcwotMCswMTUwIDxbXj5dKj4gbm9wCi0wKzAxNTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSoxNTQ6IFJfTUlQU19MTzE2CS5ic3MKLTArMDE1OCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxNWMgPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMTYwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDE2NCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDE2YyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNzAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgteGdvdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgteGdvdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJmOWNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLXhnb3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdWxoLXhnb3QKLSNhczogLW1pcHMxIC1tY3B1PXIzMDAwIC1LUElDIC14Z290IC1FQiAtLWRlZnN5bSBYR09UPTEKLSNzb3VyY2U6IHVsaC1waWMucwotCi0jIFRlc3QgdGhlIHVuYWxpZ25lZCBsb2FkIGFuZCBzdG9yZSBtYWNyb3Mgd2l0aCAtS1BJQyAteGdvdC4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMDogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwMDQgPFtePl0qPiBub3AKLTArMDAwOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjg6IFJfTUlQU19MTzE2CS5kYXRhCi0wKzAwMGMgPFtePl0qPiBub3AKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsMFwoXCRhdFwpCi0wKzAwMTQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDAxOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjIwOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDAyOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjI4OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDAyYyA8W14+XSo+IG5vcAotMCswMDMwIDxbXj5dKj4gbGJ1CVwkYTAsMFwoXCRhdFwpCi0wKzAwMzQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDAzOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwM2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDQwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjQwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDQ0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMDQ4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qNDg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNGMgPFtePl0qPiBub3AKLTArMDA1MCA8W14+XSo+IGx3bAlcJGEwLDBcKFwkYXRcKQotMCswMDU0IDxbXj5dKj4gbHdyCVwkYTAsM1woXCRhdFwpCi0wKzAwNTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNTg6IFJfTUlQU19HT1RfSEkxNgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwNWMgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwNjAgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSo2MDogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA2NCA8W14+XSo+IG5vcAotMCswMDY4IDxbXj5dKj4gc2IJXCRhMCwxXChcJGF0XCkKLTArMDA2YyA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwNzAgPFtePl0qPiBzYglcJGEwLDBcKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDdjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA4MCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo4MDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMDg4IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qODg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDA4YyA8W14+XSo+IG5vcAotMCswMDkwIDxbXj5dKj4gc3dsCVwkYTAsMFwoXCRhdFwpCi0wKzAwOTQgPFtePl0qPiBzd3IJXCRhMCwzXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjk4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMDljIDxbXj5dKj4gbm9wCi0wKzAwYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSphMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGE0IDxbXj5dKj4gbm9wCi0wKzAwYTggPFtePl0qPiBsYglcJGEwLDBcKFwkYXRcKQotMCswMGFjIDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGI0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBiOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKmI4OiBSX01JUFNfR09UMTYJLmJzcwotMCswMGJjIDxbXj5dKj4gbm9wCi0wKzAwYzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSpjMDogUl9NSVBTX0xPMTYJLmJzcwotMCswMGM0IDxbXj5dKj4gbm9wCi0wKzAwYzggPFtePl0qPiBsYnUJXCRhMCwwXChcJGF0XCkKLTArMDBjYyA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMGQwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBkNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZDggPFtePl0qPiBsdwlcJGF0LDBcKFwkZ3BcKQotWyAJXSpkODogUl9NSVBTX0dPVDE2CS5kYXRhCi0wKzAwZGMgPFtePl0qPiBub3AKLTArMDBlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKmUwOiBSX01JUFNfTE8xNgkuZGF0YQotMCswMGU0IDxbXj5dKj4gbm9wCi0wKzAwZTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMGVjIDxbXj5dKj4gbHdsCVwkYTAsMFwoXCRhdFwpCi0wKzAwZjAgPFtePl0qPiBsd3IJXCRhMCwzXChcJGF0XCkKLTArMDBmNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmNDogUl9NSVBTX0dPVF9ISTE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZjggPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAwZmMgPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSpmYzogUl9NSVBTX0dPVF9MTzE2CWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMDAgPFtePl0qPiBub3AKLTArMDEwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxMDggPFtePl0qPiBzYglcJGEwLDFcKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDExMCA8W14+XSo+IHNiCVwkYTAsMFwoXCRhdFwpCi0wKzAxMTQgPFtePl0qPiBsYnUJXCRhdCwxXChcJGF0XCkKLTArMDExOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTIwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEyMDogUl9NSVBTX0dPVF9ISTE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyNCA8W14+XSo+IGFkZHUJXCRhdCxcJGF0LFwkZ3AKLTArMDEyOCA8W14+XSo+IGx3CVwkYXQsMFwoXCRhdFwpCi1bIAldKjEyODogUl9NSVBTX0dPVF9MTzE2CXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEyYyA8W14+XSo+IG5vcAotMCswMTMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDEzNCA8W14+XSo+IHN3bAlcJGEwLDBcKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gc3dyCVwkYTAsM1woXCRhdFwpCi0wKzAxM2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTNjOiBSX01JUFNfR09UX0hJMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQwIDxbXj5dKj4gYWRkdQlcJGF0LFwkYXQsXCRncAotMCswMTQ0IDxbXj5dKj4gbHcJXCRhdCwwXChcJGF0XCkKLVsgCV0qMTQ0OiBSX01JUFNfR09UX0xPMTYJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTQ4IDxbXj5dKj4gbm9wCi0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMQotMCswMTUwIDxbXj5dKj4gbGIJXCRhMCwwXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMTU4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE1YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTYwOiBSX01JUFNfR09UX0hJMTYJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjQgPFtePl0qPiBhZGR1CVwkYXQsXCRhdCxcJGdwCi0wKzAxNjggPFtePl0qPiBsdwlcJGF0LDBcKFwkYXRcKQotWyAJXSoxNjg6IFJfTUlQU19HT1RfTE8xNglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2YyA8W14+XSo+IG5vcAotMCswMTcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDE3NCA8W14+XSo+IGxidQlcJGEwLDBcKFwkYXRcKQotMCswMTc4IDxbXj5dKj4gbGJ1CVwkYXQsMVwoXCRhdFwpCi0wKzAxN2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTgwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE4NCA8W14+XSo+IGx3CVwkYXQsMFwoXCRncFwpCi1bIAldKjE4NDogUl9NSVBTX0dPVDE2CS5ic3MKLTArMDE4OCA8W14+XSo+IG5vcAotMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMThjOiBSX01JUFNfTE8xNgkuYnNzCi0wKzAxOTAgPFtePl0qPiBub3AKLTArMDE5NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwxCi0wKzAxOTggPFtePl0qPiBsd2wJXCRhMCwwXChcJGF0XCkKLTArMDE5YyA8W14+XSo+IGx3cglcJGEwLDNcKFwkYXRcKQotMCswMWEwIDxbXj5dKj4gbHcJXCRhdCwwXChcJGdwXCkKLVsgCV0qMWEwOiBSX01JUFNfR09UMTYJLmJzcwotMCswMWE0IDxbXj5dKj4gbm9wCi0wKzAxYTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMTAwMAotWyAJXSoxYTg6IFJfTUlQU19MTzE2CS5ic3MKLTArMDFhYyA8W14+XSo+IG5vcAotMCswMWIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDEKLTArMDFiNCA8W14+XSo+IHNiCVwkYTAsMVwoXCRhdFwpCi0wKzAxYjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMWJjIDxbXj5dKj4gc2IJXCRhMCwwXChcJGF0XCkKLTArMDFjMCA8W14+XSo+IGxidQlcJGF0LDFcKFwkYXRcKQotMCswMWM0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFjOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxY2MgPFtePl0qPiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDZkNGI0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWxoLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVsaAotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSB1bGggbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDBjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAxMCA8W14+XSo+IGxiCVwkYTAsWzEyXVwoXCR6ZXJvXCkKLTArMDAxNCA8W14+XSo+IGxidQlcJGF0LFsxMl1cKFwkemVyb1wpCi0wKzAwMTggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDFjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAyMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMjQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDI4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDAzNCA8W14+XSo+IGxiCVwkYTAsLTMyNzZbNzhdXChcJHplcm9cKQotMCswMDM4IDxbXj5dKj4gbGJ1CVwkYXQsLTMyNzZbNzhdXChcJHplcm9cKQotMCswMDNjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA0MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNDQgPFtePl0qPiBsdWkJXCRhdCwweDEKLTArMDA0OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNGMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDA1MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwNTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDU4IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwNWMgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDYwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA2NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDY4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA2YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwNzAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYTFcKQotMCswMDc0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhMVwpCi0wKzAwNzggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDdjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA4MCA8W14+XSo+IGxiCVwkYTAsWzEyXVwoXCRhMVwpCi0wKzAwODQgPFtePl0qPiBsYnUJXCRhdCxbMTJdXChcJGExXCkKLTArMDA4OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwOGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMDkwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDk0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDk4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA5YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBhNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwYjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGJjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBjMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKmMwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjNCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYzggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBjYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZDAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGQ0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmQ4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBkYyA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBlNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwZTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qZWM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDEwMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDExMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qMTE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDExYyA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTJjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTM0IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTNjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE0MCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNDQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTQ0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNDg6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0YyA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qMTVjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE2MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxNmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTc4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE3YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTgwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE4NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxODggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSoxODg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxOGMgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE5YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOWM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxYTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxYTQgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxYWMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWIwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFiNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjFiNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxYjggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWJjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxYzAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWM0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMWQwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFkNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFkYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxZTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFlNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFlNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWU4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFlYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWYwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFmNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIwMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDIwOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyMGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjEwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjEwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIxNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjIxNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjFjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyMjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjI0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDIzMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDIzOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyM2MgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjQwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjQ0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjQ4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI0YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjUwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI1NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyNmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjcwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjI3MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNzQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNzQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjc4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI3YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjgwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDI4NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI5MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI5OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyOWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmEwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjJhMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyYTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMmE4IDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJhYyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmIwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJiNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyYjggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYzAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmM0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmNjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJkMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZDQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyZDQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyZDggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmRjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyZTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmU0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJlOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoyZTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyZjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmY0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyZjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmZjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDMwMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozMDA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzA0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzA0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDMwOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMGMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDMxMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzMTQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMxYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjMxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMjAgPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzI0IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzMjggPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzJjIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDMzMCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjMzMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzM0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMzM0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzMzggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzNjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzNDAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzQ0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjM0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSozNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzUwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM1NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzU4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM1YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzNjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzY0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMzY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM2OCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM3MCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzNzQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzc4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMzc4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMzdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMzgwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM4NCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzg4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM4YyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzOTAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozOTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzOTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozOTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzOTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzljIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzYTAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2E0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNhOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswM2IwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNiNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswM2I4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDNiYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzYzAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSozYzA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswM2M0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2M0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDNjOCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzY2MgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNkMCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzZDQgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2Q4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2Q4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNlMCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzZTQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNlOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzZWMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2YwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qM2YwOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDNmNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjNmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzZjggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2ZjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0MDAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDA0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0MGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNDEwIDxbXj5dKj4gbGIJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQxNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNDE4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQxYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0MjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0MjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0MjQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzA0MjggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDJjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0MzAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDM0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDQzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjQzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDQ0MCA8W14+XSo+IGxiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQ0OCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0NGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDQ1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjQ1NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA0NTggPFtePl0qPiBsYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDVjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0NjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDY0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQ2OCA8W14+XSo+IGxidQlcJGEwLFswMV1cKFwkemVyb1wpCi0wKzA0NmMgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJHplcm9cKQotMCswNDcwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDQ3NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlY2JiOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VsaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVsaCBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdWxoCSQ0LDAKLQl1bGgJJDQsMQotCXVsaAkkNCwweDgwMDAKLQl1bGgJJDQsLTB4ODAwMAotCXVsaAkkNCwweDEwMDAwCi0JdWxoCSQ0LDB4MWE1YTUKLQl1bGgJJDQsMCgkNSkKLQl1bGgJJDQsMSgkNSkKLQl1bGgJJDQsZGF0YV9sYWJlbAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdWxoCSQ0LGRhdGFfbGFiZWwrMQotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bGgJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JdWxoCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVsaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bGgJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdWxoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bGgJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bGgJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsaAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXVsaAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bGgJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdWxoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdWxoCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXVsaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCi0jIHVsaHUgaXMgaGFuZGxlZCBsaWtlIHVsaC4gIFNhbml0eSBjaGVjayBpdC4KLQl1bGh1CSQ0LDAKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmJkYzk0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdWx3LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVsdwotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSB1bHcgbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkemVyb1wpCi0wKzAwMDQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJHplcm9cKQotMCswMDA4IDxbXj5dKj4gbHdsCVwkYTAsWzE0XVwoXCR6ZXJvXCkKLTArMDAwYyA8W14+XSo+IGx3cglcJGEwLFsxNF1cKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBsaQlcJGF0LDB4ODAwMAotMCswMDE0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMTggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAxYyA8W14+XSo+IGx3bAlcJGEwLC0zMjc2WzU4XVwoXCR6ZXJvXCkKLTArMDAyMCA8W14+XSo+IGx3cglcJGEwLC0zMjc2WzU4XVwoXCR6ZXJvXCkKLTArMDAyNCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDI4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwMmMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAzMCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDM0IDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDAzOCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDNjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGExXCkKLTArMDA0NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYTFcKQotMCswMDQ4IDxbXj5dKj4gbHdsCVwkYTAsWzE0XVwoXCRhMVwpCi0wKzAwNGMgPFtePl0qPiBsd3IJXCRhMCxbLTAtOV0rXChcJGExXCkKLTArMDA1MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDA1NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qNjA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA2NCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA2YyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qNzA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDc0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNzggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSo3YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwODQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA4OCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDhjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA5NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDBhMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYTggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSphODogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAwYWMgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiMCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDBiOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiYyA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwY2MgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkMCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGQ0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZDQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGQ4IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlMCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSplMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSplNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTggPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBlYyA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDEKLVsgCV0qZjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmOCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmZjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTA0IDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMDggPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEwYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDExNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjExYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEyNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTM0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE1MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTU0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE2NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMTZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTcwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxN2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMTgwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxODQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE4OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMThjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMThjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE5MCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTk0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxOTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFiNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWMwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFjOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxY2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFkNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFkYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFkYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDFlMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWU0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDFlYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFlYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZjAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFmNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWY4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMWY4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDFmYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIwNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjE0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIyMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjI0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMjJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyM2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyNDAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI0NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMjRjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjRjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMjUwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNTQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI1OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyNWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjcwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNzQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI4NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI5YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTAgPFtePl0qPiBsd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJhNCA8W14+XSo+IGx3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmFjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmFjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmIwIDxbXj5dKj4gbHdsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYjQgPFtePl0qPiBsd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJiOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJiODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJiYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmM0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDJkMCA8W14+XSo+IGx3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmQ0IDxbXj5dKj4gbHdyCVwkYTAsWzAzXVwoXCRhdFwpCi0JLi4uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91bHcucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzNmYxYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3Vsdy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVsdyBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdWx3CSQ0LDAKLQl1bHcJJDQsMQotCXVsdwkkNCwweDgwMDAKLQl1bHcJJDQsLTB4ODAwMAotCXVsdwkkNCwweDEwMDAwCi0JdWx3CSQ0LDB4MWE1YTUKLQl1bHcJJDQsMCgkNSkKLQl1bHcJJDQsMSgkNSkKLQl1bHcJJDQsZGF0YV9sYWJlbAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdWx3CSQ0LGRhdGFfbGFiZWwrMQotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bHcJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JdWx3CSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVsdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1bHcJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdWx3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1bHcJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1bHcJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVsdwkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXVsdwkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVsdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1bHcJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdWx3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdWx3CSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXVsdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYzBiNzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6NDAwMAotI25hbWU6IE1JUFMgdXNkCi0jYXM6IC1taXBzMyAtbWNwdT1yNDAwMAotCi0jIFRlc3QgdGhlIHVzZCBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBzZGwJXCRhMCxbMThdXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gc2RyCVwkYTAsWzE4XVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMTQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAxOCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gc2RsCVwkYTAsLTMyNzZbMThdXChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gc2RyCVwkYTAsLTMyNzZbMThdXChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDM4IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDA0MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBzZGwJXCRhMCxbMThdXChcJGExXCkKLTArMDA0YyA8W14+XSo+IHNkcglcJGEwLFstMC05XStcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDA1OCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDVjIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwNjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo2MDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY0IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjY0OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA2YyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDcwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDA4NCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMDg4IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwOGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qOGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAwOTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDA5NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMDk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAwOWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGE4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKmE4OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCS5zYnNzLioKLTArMDBhYyA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGIwIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYjQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYjQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMGI4IDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKmI4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDBiYyA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMGMwIDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwYzQgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBjOCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGNjIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSpkNDogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwZDggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBkYyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGUwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmUwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDBlNCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSplNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZTggPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDBlYyA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMGYwIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwMCA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxMDQgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDEwOCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTBjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRncCxbLTAtOV0rCi1bIAldKjEwYzogW0EtWjAtOV9dKkdQUkVMW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxMTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDExNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDExYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTMwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxMzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDEzOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEzODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxM2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE0MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTQ0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNDggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMTRjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMTU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE1YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDE2MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTY0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxNmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5ic3MuKgotMCswMTcwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE3OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE3ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxN2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMTg0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE4YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTkwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDE5OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxOTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWE0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYTggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDFhYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWIwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxYjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxYzAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFjNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWM4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFjODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDFjYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxY2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFkNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWQ4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFkODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDFkYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxZTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDFlNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMWU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZWMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDFmMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMWY0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAxZjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxZjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMWZjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjFmYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyMDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIwNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjA4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjA4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMGMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsMAotWyAJXSoyMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjIwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDIyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIzMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjM0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyMzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyMzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyM2MgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNDQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyNTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI1NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDI1YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMjYwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNjQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDI2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNmMgPFtePl0qPiBkYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjc0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyN2M6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMjg0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyODggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyODg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjhjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOTAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMjk4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDI5YyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gc2RsCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBzZHIJXCRhMCxbMDddXChcJGF0XCkKLTArMDJhOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGRhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYjAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJiNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotMCswMmI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMmJjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJiYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJjMCA8W14+XSo+IHNkbAlcJGEwLFswN11cKFwkYXRcKQotMCswMmM0IDxbXj5dKj4gc2RyCVwkYTAsWzA3XVwoXCRhdFwpCi0wKzAyYzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMmNjIDxbXj5dKj4gZGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZDAgPFtePl0qPiBzZGwJXCRhMCxbMDddXChcJGF0XCkKLTArMDJkNCA8W14+XSo+IHNkcglcJGEwLFswN11cKFwkYXRcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMzY3MzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2QucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1c2QgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVzZAkkNCwwCi0JdXNkCSQ0LDEKLQl1c2QJJDQsMHg4MDAwCi0JdXNkCSQ0LC0weDgwMDAKLQl1c2QJJDQsMHgxMDAwMAotCXVzZAkkNCwweDFhNWE1Ci0JdXNkCSQ0LDAoJDUpCi0JdXNkCSQ0LDEoJDUpCi0JdXNkCSQ0LGRhdGFfbGFiZWwKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVzZAkkNCxkYXRhX2xhYmVsKzEKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdXNkCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVzZAkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1c2QJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzZAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdXNkCSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVzZAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXNkCSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdXNkCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c2QJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1c2QJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNkCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2QJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXNkCSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVzZAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVzZAkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1c2QJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmYwYTEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXNoLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMgLW1taXBzOjMwMDAKLSNuYW1lOiBNSVBTIHVzaAotI2FzOiAtbWlwczEKLQotIyBUZXN0IHRoZSB1c2ggbWFjcm8uCi0KLS4qOiArZmlsZSBmb3JtYXQgLiptaXBzLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLTArMDAwMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4Ci0wKzAwMDggPFtePl0qPiBzYglcJGF0LFswMV1cKFwkemVyb1wpCi0wKzAwMGMgPFtePl0qPiBzYglcJGEwLFsxMl1cKFwkemVyb1wpCi0wKzAwMTAgPFtePl0qPiBzcmwJXCRhdCxcJGEwLDB4OAotMCswMDE0IDxbXj5dKj4gc2IJXCRhdCxbMTJdXChcJHplcm9cKQotMCswMDE4IDxbXj5dKj4gbGkJXCRhdCwweDgwMDAKLTArMDAxYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwMjAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDAyOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDJjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDAzMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwMzQgPFtePl0qPiBzYglcJGEwLC0zMjc2Wzc4XVwoXCR6ZXJvXCkKLTArMDAzOCA8W14+XSo+IHNybAlcJGF0LFwkYTAsMHg4Ci0wKzAwM2MgPFtePl0qPiBzYglcJGF0LC0zMjc2Wzc4XVwoXCR6ZXJvXCkKLTArMDA0MCA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDQ0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA0OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwNGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMDUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwNTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMDU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDA1YyA8W14+XSo+IGx1aQlcJGF0LDB4MQotMCswMDYwIDxbXj5dKj4gb3JpCVwkYXQsXCRhdCwweGE1YTUKLTArMDA2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwNjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMDZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMDc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDA3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwN2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYTFcKQotMCswMDgwIDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKLTArMDA4NCA8W14+XSo+IHNiCVwkYXQsWzAxXVwoXCRhMVwpCi0wKzAwODggPFtePl0qPiBzYglcJGEwLFsxMl1cKFwkYTFcKQotMCswMDhjIDxbXj5dKj4gc3JsCVwkYXQsXCRhMCwweDgKLTArMDA5MCA8W14+XSo+IHNiCVwkYXQsWzEyXVwoXCRhMVwpCi0wKzAwOTQgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo5NDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOTggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo5ODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwOWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGEwIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDBhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwYTggPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDBhYyA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAwYjAgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMGI0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmI0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGJjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAwYzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGM4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAwY2MgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMGQwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAwZGMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMGUwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDBlNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMGU4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDBlYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAwZjAgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSpmMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpmNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAwZjggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMGZjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDEwMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMDQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDEwOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxMGMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMTEwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLDAKLVsgCV0qMTEwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTE0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDExOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxMWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTIwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTI4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDEyYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEzMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEzNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxMzggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTNjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE0MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTQ0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE0OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxNGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxNGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTUwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxNTggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMTVjIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxNjAgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMTY0IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMTZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDE3MCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxNzQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTc4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE3YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMTgwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDE4NCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDE5MCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxOTQgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMTk4IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDE5YyA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWEwIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFhNCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxYTggPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSoxYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFiMCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAxYjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWI4IDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAxYmMgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMWMwIDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDFjNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYzQ6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWM4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWM4OiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZDAgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMWQ0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMWRjIDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDFlMCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAxZTQgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsMQotWyAJXSoxZTQ6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0wKzAxZTggPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMWVjIDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDFmMCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAxZjQgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDFmOCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAxZmMgPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjAwIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjIwMDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjIwNDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDIwOCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyMGMgPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMjEwIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDIxYyA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyMjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoyMjA6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMjI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDIyOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyMmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjMwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyMzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDIzYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAyNDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyNDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjQ0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyNGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyNTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMjU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDI1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjYwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjYwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyNjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDI2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyNzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyNzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjdjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI4MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI4MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyODQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMjg4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDI4YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyOTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDI5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyOTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMjljIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjljOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDJhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyYTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmE4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDJhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyYjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDJiNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAyYjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMmJjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmJjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMmMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMmM0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJjOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAyY2MgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMmQwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAyZDQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMmQ4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDJkYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDJlMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJlMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDJlNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAyZTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMmVjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDJmMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMmY0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDJmOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAyZmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMzAwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzAwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDMwNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMDggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMzBjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDMxMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzE0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDMxOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzMWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzFjOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDMyMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjMyMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAzMjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDMyYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzMzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDMzNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzMzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzNjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjMzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzQwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzQwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDM0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzNTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDM1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzNTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswMzVjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjM1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAzNjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozNjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMzY0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM2OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzNmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswMzcwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzNzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswMzc4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDM3YyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMzgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMzgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDM4NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzODggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswMzhjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDM5MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswMzk0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDM5OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzAzOWMgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMzljOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2EwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qM2EwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswM2E0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNhOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzYWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2IwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzYjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2I4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNiYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSozYmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAzYzAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozYzA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAzYzQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2M4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDNjYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzAzZDAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDNkNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzAzZDggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswM2RjIDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjNkYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAzZTAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSozZTA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswM2U0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDNlOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzAzZWMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswM2YwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzAzZjQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswM2Y4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDNmYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjNmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzA0MDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo0MDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswNDA0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQwOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0MGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDEwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0MTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQxYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNDIwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNDIwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0MjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDI4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDQyYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0MzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQzNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0MzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDNjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDNjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDQ0MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjQ0MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA0NDQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDQ4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDQ0YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQ1NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0NTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDVjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDVjOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDQ2MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjQ2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA0NjQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDY4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDQ2YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0NzAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDQ3NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA0NzggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNDdjIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNDdjOiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qNDgwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswNDg0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDQ4OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA0OGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNDkwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA0OTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNDk4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDQ5YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjQ5YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDRhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjRhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDRhNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0YTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNGFjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRiMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNGI0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDRiOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0YmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0YmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswNGMwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNGMwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDRjNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0YzggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNGNjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRkMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNGQ0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDRkOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0ZGMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZGM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswNGUwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNGUwOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDRlNCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA0ZTggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNGVjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDRmMCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNGY0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDRmOCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA0ZmMgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo0ZmM6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDUwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjUwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTA0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDUwOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1MGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTEwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1MTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNTE4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDUxYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUxYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzA1MjAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1MjA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswNTI0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDUyOCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1MmMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTMwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1MzQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNTM4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDUzYyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjUzYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzA1NDAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1NDA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswNTQ0IDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU0OCA8W14+XSo+IHNybAlcJGEwLFwkYTAsMHg4Ci0wKzA1NGMgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTUwIDxbXj5dKj4gbGJ1CVwkYXQsWzAxXVwoXCRhdFwpCi0wKzA1NTQgPFtePl0qPiBzbGwJXCRhMCxcJGEwLDB4OAotMCswNTU4IDxbXj5dKj4gb3IJXCRhMCxcJGEwLFwkYXQKLTArMDU1YyA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjU1YzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU2MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjU2MDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDU2NCA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1NjggPFtePl0qPiBzcmwJXCRhMCxcJGEwLDB4OAotMCswNTZjIDxbXj5dKj4gc2IJXCRhMCxbMDFdXChcJGF0XCkKLTArMDU3MCA8W14+XSo+IGxidQlcJGF0LFswMV1cKFwkYXRcKQotMCswNTc0IDxbXj5dKj4gc2xsCVwkYTAsXCRhMCwweDgKLTArMDU3OCA8W14+XSo+IG9yCVwkYTAsXCRhMCxcJGF0Ci0wKzA1N2MgPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSo1N2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzA1ODAgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo1ODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzA1ODQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNTg4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDU4YyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1OTAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDU5NCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1OTggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNTljIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTljOiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDVhMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjVhMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzA1YTQgPFtePl0qPiBzYglcJGEwLFswMV1cKFwkYXRcKQotMCswNWE4IDxbXj5dKj4gc3JsCVwkYTAsXCRhMCwweDgKLTArMDVhYyA8W14+XSo+IHNiCVwkYTAsWzAxXVwoXCRhdFwpCi0wKzA1YjAgPFtePl0qPiBsYnUJXCRhdCxbMDFdXChcJGF0XCkKLTArMDViNCA8W14+XSo+IHNsbAlcJGEwLFwkYTAsMHg4Ci0wKzA1YjggPFtePl0qPiBvcglcJGEwLFwkYTAsXCRhdAotMCswNWJjIDxbXj5dKj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE1NTgxNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9taXBzL3VzaC5zCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotIyBTb3VyY2UgZmlsZSB1c2VkIHRvIHRlc3QgdGhlIHVzaCBtYWNyby4KLQkKLQkuZGF0YQotZGF0YV9sYWJlbDoKLQkuZXh0ZXJuIGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLDEwMDAKLQkuZXh0ZXJuIHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwsMQotCS5jb21tIGJpZ19leHRlcm5hbF9jb21tb24sMTAwMAotCS5jb21tIHNtYWxsX2V4dGVybmFsX2NvbW1vbiwxCi0JLmxjb21tIGJpZ19sb2NhbF9jb21tb24sMTAwMAotCS5sY29tbSBzbWFsbF9sb2NhbF9jb21tb24sMQotCQotCS50ZXh0Ci0JdXNoCSQ0LDAKLQl1c2gJJDQsMQotCXVzaAkkNCwweDgwMDAKLQl1c2gJJDQsLTB4ODAwMAotCXVzaAkkNCwweDEwMDAwCi0JdXNoCSQ0LDB4MWE1YTUKLQl1c2gJJDQsMCgkNSkKLQl1c2gJJDQsMSgkNSkKLQl1c2gJJDQsZGF0YV9sYWJlbAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24KLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uCi0JdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24KLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uCi0JdXNoCSQ0LGRhdGFfbGFiZWwrMQotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsxCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c2gJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzEKLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbisxCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisxCi0JdXNoCSQ0LGRhdGFfbGFiZWwrMHg4MDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4ODAwMAotCXVzaAkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHg4MDAwCi0JdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24rMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2xvY2FsX2NvbW1vbisweDgwMDAKLQl1c2gJJDQsZGF0YV9sYWJlbC0weDgwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwtMHg4MDAwCi0JdXNoCSQ0LGJpZ19leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbi0weDgwMDAKLQl1c2gJJDQsYmlnX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c2gJJDQsc21hbGxfbG9jYWxfY29tbW9uLTB4ODAwMAotCXVzaAkkNCxkYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxMDAwMAotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDEwMDAwCi0JdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxMDAwMAotCXVzaAkkNCxkYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMHgxYTVhNQotCXVzaAkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c2gJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXNoCSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisweDFhNWE1Ci0JdXNoCSQ0LGJpZ19sb2NhbF9jb21tb24rMHgxYTVhNQotCXVzaAkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHgxYTVhNQotCi0jIFJvdW5kIHRvIGEgMTYgYnl0ZSBib3VuZGFyeSwgZm9yIGVhc2UgaW4gdGVzdGluZyBtdWx0aXBsZSB0YXJnZXRzLgotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZDI4Y2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcyAtbW1pcHM6MzAwMAotI25hbWU6IE1JUFMgdXN3Ci0jYXM6IC1taXBzMQotCi0jIFRlc3QgdGhlIHVzdyBtYWNyby4KLQotLio6ICtmaWxlIGZvcm1hdCAuKm1pcHMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCR6ZXJvXCkKLTArMDAwNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkemVyb1wpCi0wKzAwMDggPFtePl0qPiBzd2wJXCRhMCxbMTRdXChcJHplcm9cKQotMCswMDBjIDxbXj5dKj4gc3dyCVwkYTAsWzE0XVwoXCR6ZXJvXCkKLTArMDAxMCA8W14+XSo+IGxpCVwkYXQsMHg4MDAwCi0wKzAwMTQgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAxOCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDFjIDxbXj5dKj4gc3dsCVwkYTAsLTMyNzZbNThdXChcJHplcm9cKQotMCswMDIwIDxbXj5dKj4gc3dyCVwkYTAsLTMyNzZbNThdXChcJHplcm9cKQotMCswMDI0IDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMjggPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDAyYyA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMDMwIDxbXj5dKj4gbHVpCVwkYXQsMHgxCi0wKzAwMzQgPFtePl0qPiBvcmkJXCRhdCxcJGF0LDB4YTVhNQotMCswMDM4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwM2MgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA0MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYTFcKQotMCswMDQ0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhMVwpCi0wKzAwNDggPFtePl0qPiBzd2wJXCRhMCxbMTRdXChcJGExXCkKLTArMDA0YyA8W14+XSo+IHN3cglcJGEwLFstMC05XStcKFwkYTFcKQotMCswMDUwIDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qNTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMDU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qNTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMDU4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNWMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA2MCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjYwOiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwNjQgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSo2NDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMDY4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwNmMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA3MCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjcwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDA3NCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMDc4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwN2MgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qN2M6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDgwIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qODA6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMDg0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwODggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwwCi1bIAldKjhjOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMDkwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwOTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDA5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjk4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5ic3MuKgotMCswMDljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAwYTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBhNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGE4IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGdwLFstMC05XSsKLVsgCV0qYTg6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMGFjIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwYjAgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBiNCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpiNDogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYjggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpiODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAwYmMgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBjMCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMGM0IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKmM0OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAwYzggPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSpjODogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMGNjIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZDAgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBkNCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmQ0OiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDBkOCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMGRjIDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZTAgPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qZTA6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU0IDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qZTQ6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMGU4IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZWMgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRncCwxCi1bIAldKmYwOiBbQS1aMC05X10qR1BSRUxbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMGY0IDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAwZjggPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDBmYyA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSpmYzogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwMCA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEwMDogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDEwNCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTA4IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkZ3AsWy0wLTldKwotWyAJXSoxMGM6IFtBLVowLTlfXSpHUFJFTFtBLVowLTlfXSoJLnNic3MuKgotMCswMTEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDExOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjExODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxMWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxMWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMTIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxMjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEyOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjEyODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxMzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDEzNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDEzYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjEzYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxNDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE0NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTQ4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTQ4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDE0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAxNTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE1NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTU4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMTU4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMTYwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE2OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjE2ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDE2YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE2YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDE3MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTc0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoxNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMTdjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTdjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDE4MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMTg0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxODggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMTg4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5kYXRhLioKLTArMDE4YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjE4YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxOTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDE5NCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMTk4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjE5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMTljIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMTljOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFhNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWE4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAxYWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxYWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMWIwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFiOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMWJjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWJjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDFjMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMWM0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxYzggPFtePl0qPiBsdWkJXCRhdCwweDAKLVsgCV0qMWM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMWNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMWQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFkOCA8W14+XSo+IGx1aQlcJGF0LDB4MAotWyAJXSoxZDg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAxZGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAxZTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFlNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMWU4IDxbXj5dKj4gbHVpCVwkYXQsMHgwCi1bIAldKjFlODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAxZWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLnNic3MuKgotMCswMWYwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAxZjQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDFmOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjFmODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuZGF0YS4qCi0wKzAxZmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoxZmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmRhdGEuKgotMCswMjAwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyMDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIwOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjIwODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjBjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjBjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCWJpZ19leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMTAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIxNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjE4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjE4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDIxYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIxYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyMjAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIyNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjI4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjI4OiBbQS1aMC05X10qSElbQS1aMC05X10qCWJpZ19leHRlcm5hbF9jb21tb24KLTArMDIyYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCwwCi1bIAldKjIyYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyMzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDIzNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMjM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMjM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjNjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LDAKLVsgCV0qMjNjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCXNtYWxsX2V4dGVybmFsX2NvbW1vbgotMCswMjQwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNDQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI0OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI0ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgkuYnNzLioKLTArMDI0YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI0YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuYnNzLioKLTArMDI1MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjU0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNTggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNTg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLnNic3MuKgotMCswMjVjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjVjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5zYnNzLioKLTArMDI2MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjY0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmRhdGEuKgotMCswMjZjIDxbXj5dKj4gYWRkaXUJXCRhdCxcJGF0LFstMC05XSsKLVsgCV0qMjZjOiBbQS1aMC05X10qTE9bQS1aMC05X10qCS5kYXRhLioKLTArMDI3MCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMjc0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyNzggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyNzg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLTArMDI3YyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjI3YzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjgwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyODQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI4OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI4ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsCi0wKzAyOGMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOGM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotMCswMjkwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyOTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDI5OCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjI5ODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKgliaWdfZXh0ZXJuYWxfY29tbW9uCi0wKzAyOWMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyOWM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJYmlnX2V4dGVybmFsX2NvbW1vbgotMCswMmEwIDxbXj5dKj4gc3dsCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYTQgPFtePl0qPiBzd3IJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJhOCA8W14+XSo+IGx1aQlcJGF0LFstMC05eF0rCi1bIAldKjJhODogW0EtWjAtOV9dKkhJW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJhYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJhYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKglzbWFsbF9leHRlcm5hbF9jb21tb24KLTArMDJiMCA8W14+XSo+IHN3bAlcJGEwLFswM11cKFwkYXRcKQotMCswMmI0IDxbXj5dKj4gc3dyCVwkYTAsWzAzXVwoXCRhdFwpCi0wKzAyYjggPFtePl0qPiBsdWkJXCRhdCxbLTAtOXhdKwotWyAJXSoyYjg6IFtBLVowLTlfXSpISVtBLVowLTlfXSoJLmJzcy4qCi0wKzAyYmMgPFtePl0qPiBhZGRpdQlcJGF0LFwkYXQsWy0wLTldKwotWyAJXSoyYmM6IFtBLVowLTlfXSpMT1tBLVowLTlfXSoJLmJzcy4qCi0wKzAyYzAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJjNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotMCswMmM4IDxbXj5dKj4gbHVpCVwkYXQsWy0wLTl4XSsKLVsgCV0qMmM4OiBbQS1aMC05X10qSElbQS1aMC05X10qCS5zYnNzLioKLTArMDJjYyA8W14+XSo+IGFkZGl1CVwkYXQsXCRhdCxbLTAtOV0rCi1bIAldKjJjYzogW0EtWjAtOV9dKkxPW0EtWjAtOV9dKgkuc2Jzcy4qCi0wKzAyZDAgPFtePl0qPiBzd2wJXCRhMCxbMDNdXChcJGF0XCkKLTArMDJkNCA8W14+XSo+IHN3cglcJGEwLFswM11cKFwkYXRcKQotCS4uLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21pcHMvdXN3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMWM2MGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbWlwcy91c3cucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSMgU291cmNlIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSB1c3cgbWFjcm8uCi0JCi0JLmRhdGEKLWRhdGFfbGFiZWw6Ci0JLmV4dGVybiBiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCwxMDAwCi0JLmV4dGVybiBzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLDEKLQkuY29tbSBiaWdfZXh0ZXJuYWxfY29tbW9uLDEwMDAKLQkuY29tbSBzbWFsbF9leHRlcm5hbF9jb21tb24sMQotCS5sY29tbSBiaWdfbG9jYWxfY29tbW9uLDEwMDAKLQkubGNvbW0gc21hbGxfbG9jYWxfY29tbW9uLDEKLQkKLQkudGV4dAotCXVzdwkkNCwwCi0JdXN3CSQ0LDEKLQl1c3cJJDQsMHg4MDAwCi0JdXN3CSQ0LC0weDgwMDAKLQl1c3cJJDQsMHgxMDAwMAotCXVzdwkkNCwweDFhNWE1Ci0JdXN3CSQ0LDAoJDUpCi0JdXN3CSQ0LDEoJDUpCi0JdXN3CSQ0LGRhdGFfbGFiZWwKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbgotCXVzdwkkNCxiaWdfbG9jYWxfY29tbW9uCi0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbgotCXVzdwkkNCxkYXRhX2xhYmVsKzEKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2RhdGFfbGFiZWwrMQotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsKzEKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisxCi0JdXN3CSQ0LHNtYWxsX2V4dGVybmFsX2NvbW1vbisxCi0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24rMQotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMQotCXVzdwkkNCxkYXRhX2xhYmVsKzB4ODAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDgwMDAKLQl1c3cJJDQsYmlnX2V4dGVybmFsX2NvbW1vbisweDgwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfY29tbW9uKzB4ODAwMAotCXVzdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4ODAwMAotCXVzdwkkNCxzbWFsbF9sb2NhbF9jb21tb24rMHg4MDAwCi0JdXN3CSQ0LGRhdGFfbGFiZWwtMHg4MDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9kYXRhX2xhYmVsLTB4ODAwMAotCXVzdwkkNCxiaWdfZXh0ZXJuYWxfY29tbW9uLTB4ODAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24tMHg4MDAwCi0JdXN3CSQ0LGJpZ19sb2NhbF9jb21tb24tMHg4MDAwCi0JdXN3CSQ0LHNtYWxsX2xvY2FsX2NvbW1vbi0weDgwMDAKLQl1c3cJJDQsZGF0YV9sYWJlbCsweDEwMDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MTAwMDAKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDEwMDAwCi0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxMDAwMAotCXVzdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MTAwMDAKLQl1c3cJJDQsZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXN3CSQ0LGJpZ19leHRlcm5hbF9kYXRhX2xhYmVsKzB4MWE1YTUKLQl1c3cJJDQsc21hbGxfZXh0ZXJuYWxfZGF0YV9sYWJlbCsweDFhNWE1Ci0JdXN3CSQ0LGJpZ19leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVzdwkkNCxzbWFsbF9leHRlcm5hbF9jb21tb24rMHgxYTVhNQotCXVzdwkkNCxiaWdfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQl1c3cJJDQsc21hbGxfbG9jYWxfY29tbW9uKzB4MWE1YTUKLQotIyBSb3VuZCB0byBhIDE2IGJ5dGUgYm91bmRhcnksIGZvciBlYXNlIGluIHRlc3RpbmcgbXVsdGlwbGUgdGFyZ2V0cy4KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDI1MWJjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLQlhZGQgZDEsZDIKLQlhZGQgZDIsYTMKLQlhZGQgYTIsZDEKLQlhZGQgYTMsYTIKLQlhZGQgMTYsZDEKLQlhZGQgMjU2LGQyCi0JYWRkIDEzMTA3MSxkMwotCWFkZCAxNixhMQotCWFkZCAyNTYsYTIKLQlhZGQgMTMxMDcxLGEzCi0JYWRkYyBkMSxkMgotCWFkZG5mIDE2LGEyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmFzaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzkzZWIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvYmFzaWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsODM2ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZC5zOiBBZGQgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDk2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMjBCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMkM5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMjRFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBENTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGNzFBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjQ2M0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBEMTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGNzBBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjQ2N0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgRjI4NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRjUwRTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19iY2Mge30gewotICAgIHNldCB0ZXN0bmFtZSAiYmNjLnM6IEJjYyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJjYy5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEU5MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEUxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEUyMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEUzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEUwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEU1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEU2MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEU3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEU0MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEY1RkMwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTcgRjVGRDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBGNUZFMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFkIEY1RkYwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRUEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTVdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmNjeCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiY2N4LnM6IEJjY3ggdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiY2N4LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjVFODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNUU5MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEY1RTEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjVFMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGNUUzMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIEY1RTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjVFNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNSBGNUU2MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY1RTcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgRjVFNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGNUVDMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIxIEY1RUQwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjVFRTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGNUVGMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE0XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjUwNTQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGNzA2MDAyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjAyOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRjAzOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICtGRkZGNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi0KLXByb2MgZG9fY21wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNtcC5zOiBjbXAgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJjbXAucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMzk2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGMjJCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGMkVGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMjZFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBEQjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGNzRBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjQ3OUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBFRTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEY0N0RGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHQuczogZXh0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjNDNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQjJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBCN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEJBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgQkRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dGVuZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRlbmQuczogZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRlbmQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNkZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGOTAyMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZCMDMwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGRDAzMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjYxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjkxNjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQjE3MDEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkQxNzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGNjRCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNjVFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGNjc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMzA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNTAyN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEY3MDNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGNzEwRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjMxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRjUwQTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNzQzRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjcxNEZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYzMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEY3NEZGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBGM0U3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbG9vcCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJsb29wLnM6IGxvb3AgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb29wLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRDhcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBEOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEQxXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRDJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBEM1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEQwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRDVcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBENlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEQ3XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDkgRDRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBEQVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIERCXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YxLnM6IG1vdjEgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YxLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjIzNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjJGOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgODZcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMjc5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGM0YzXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGM0Q4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGM0UxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGM0M4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiAyOVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIDY5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEY3QzkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNDg5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEzICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YyIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjIuczogbW92MiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMTU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDOTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEY0QzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgNzkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjdCOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY0RjlGRkZGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEYxMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY3MzEwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYiBGNEQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEwICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YzIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjMuczogbW92MyB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjMucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgNDkyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjc4OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY0MDlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjFFOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgQzE4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMSBGNDQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IDU5MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEY3QTkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBGNDE5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xM10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3Y0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjQuczogbW92NCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMUE5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNzIxODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjQ1MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiA4NTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY0NzFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNyArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgREQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGNDc1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTExXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdngge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92eC5zOiBtb3Z4IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92eC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1NzkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjc3OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY0QjlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjU1OTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGNzY5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjQzOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT04XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdmIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92Yi5zOiBtb3ZiIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92Yi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEY1MjkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjdEOTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEY0QTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjA2QlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjRDNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyAxOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjUxOTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNyBGNzk5MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWIgRjQyOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjBFOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgQzUwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNSBGNDQ1RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEzICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3ZidSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZidS5zOiBtb3ZidSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmJ1LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMzlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEY1MzkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjc1OTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEY0OTlGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRjA5NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgQ0QwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGNEM5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92aHUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92aHUuczogbW92aHUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZodS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NjYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE2NjAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNjYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEJEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQkQwMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0JEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjRBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzk4MDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0FEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICtGRkZGXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NzYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE3NjAxMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNzYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk3ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5NzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArRkZGRlxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNERBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNzAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjEgK0ZGRkZcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92bSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZtLnM6IG1vdm0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZtLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQ0UzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQ0VGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQ0YzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0ZGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tdWxkaXYge30gewotICAgIHNldCB0ZXN0bmFtZSAibXVsZGl2LnM6IG11bGRpdiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm11bGRpdi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYzNUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYzNkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fb3RoZXIge30gewotICAgIHNldCB0ZXN0bmFtZSAib3RoZXIuczogb3RoZXIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJvdGhlci5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZDMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjRFMEZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICszICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGMDA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGRDAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEY0RTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDFcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjAwOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEVCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYzM0FcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYzM0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYzMzVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYzMzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc3ViIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInN1Yi5zOiBzdWIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzdWIucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBBNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjIxQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjJERlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjI1RVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjcxRUZGN0YgXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGNDZBRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY3MEVGRjdGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjQ2RUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMVxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOSBGMjk2IFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCBtbjEwMjAwKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgotICAgIGRvX2FkZAotICAgIGRvX2JjYwotICAgIGRvX2JjY3gKLSAgICBkb19iaXQKLSAgICBkb19jbXAKLSAgICBkb19leHQKLSAgICBkb19sb2dpY2FsCi0gICAgZG9fbW92MQotICAgIGRvX21vdjIKLSAgICBkb19tb3YzCi0gICAgZG9fbW92NAotICAgIGRvX21vdmIKLSAgICBkb19tb3Z4Ci0gICAgZG9fbW92YnUKLSAgICBkb19tdWxkaXYKLSAgICBkb19vdGhlcgotICAgIGRvX3NoaWZ0Ci0gICAgZG9fc3ViCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5MmRjZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjYy5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS50ZXh0Ci1mb286Ci0JYmVxIGZvbwotCWJuZSBmb28KLQliZ3QgZm9vCi0JYmdlIGZvbwotCWJsZSBmb28KLQlibHQgZm9vCi0JYmhpIGZvbwotCWJjYyBmb28KLQlibHMgZm9vCQotCWJjcyBmb28KLQlidmMgZm9vCi0JYnZzIGZvbwotCWJuYyBmb28KLQlibnMgZm9vCi0JYnJhIGZvbwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iY2N4LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjY3gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlN2VkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JjY3gucworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLQkudGV4dAotZm9vOgotCWJlcXggZm9vCi0JYm5leCBmb28KLQliZ3R4IGZvbwotCWJnZXggZm9vCi0JYmxleCBmb28KLQlibHR4IGZvbwotCWJoaXggZm9vCi0JYmNjeCBmb28KLQlibHN4IGZvbwkKLQliY3N4IGZvbwotCWJ2Y3ggZm9vCi0JYnZzeCBmb28KLQlibmN4IGZvbwotCWJuc3ggZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JpdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9iaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiNjBkNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2JpdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQlidHN0IDY0LGQxCi0JYnRzdCA4MTkyLGQyCi0JYnNldCBkMSwoYTIpCi0JYmNsciBkMSwoYTIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2NtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9jbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzOTI1Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL2NtcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0JY21wIGQxLGQyCi0JY21wIGQyLGEzCi0JY21wIGEzLGQzCi0JY21wIGEzLGEyCi0JY21wIDE2LGQzCi0JY21wIDI1NixkMgotCWNtcCAxMzEwNzEsZDEKLQljbXAgMjU2LGEyCi0JY21wIDEzMTA3MSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9leHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvZXh0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTAxYmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9leHQucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS50ZXh0Ci0JZXh0IGQxCi0JZXh0eCBkMgotCWV4dHh1IGQzCi0JZXh0eGIgZDIKLQlleHR4YnUgZDEKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MDlkN2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLnRleHQKLQlhbmQgZDEsZDIKLQlhbmQgMTI3LGQyCi0JYW5kIDMyNzY3LGQzCi0JYW5kIDMyNzY3LHBzdwotCW9yIGQxLGQyCi0Jb3IgMTI3LGQyCi0Jb3IgMzI3NjcsZDMKLQlvciAzMjc2Nyxwc3cKLQl4b3IgZDEsZDIKLQl4b3IgMzI3NjcsZDMKLQlub3QgZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92MS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YxLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjhlMzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLnRleHQKLQltb3YgZDEsYTIKLQltb3YgYTIsZDEKLQltb3YgZDEsZDIKLQltb3YgYTIsYTEKLQltb3YgcHN3LGQzCi0JbW92IGQyLHBzdwotCW1vdiBtZHIsZDEKLQltb3YgZDIsbWRyCi0JbW92IChhMiksZDEKLQltb3YgKDgsYTIpLGQxCi0JbW92ICgyNTYsYTIpLGQxCi0JbW92ICgxMzEwNzEsYTIpLGQxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Mi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGY2ZTI1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0JbW92IChkMSxhMSksZDIKLQltb3YgKDMyNzY4KSxkMQotCW1vdiAoMTMxMDcxKSxkMQotCW1vdiAoOCxhMiksYTEKLQltb3YgKDI1NixhMiksYTEKLQltb3YgKDEzMTA3MSxhMiksYTEKLQltb3YgKGQxLGExKSxhMgotICAgICAgICBtb3YgKDMyNzY4KSxhMQotICAgICAgICBtb3YgKDEzMTA3MSksYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92My5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzQ5MGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3YzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0JLnRleHQKLSAgICAgICAgbW92IGQxLChhMikKLSAgICAgICAgbW92IGQxLCgzMixhMikKLQltb3YgZDEsKDI1NixhMikKLQltb3YgZDEsKDEzMTA3MSxhMikKLQltb3YgZDEsKGQyLGEyKQotCW1vdiBkMSwoMTI4KQotCW1vdiBkMSwoMTMxMDcxKQotCW1vdiBhMSwoMzIsYTIpCi0JbW92IGExLCgyNTYsYTIpCi0JbW92IGExLCgxMzEwNzEsYTIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTE4N2UwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92NC5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0JLnRleHQKLQltb3YgYTEsKGQyLGEyKQotCW1vdiBhMSwoMTI4KQotCW1vdiBhMSwoMTMxMDcxKQotCW1vdiA4LGQxCi0JbW92IDI1NixkMQotCW1vdiAxMzEwNzEsZDEKLQltb3YgMjU2LGExCi0JbW92IDEzMTA3MSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZiLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU1NjYxNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmIucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotCW1vdmIgKDgsYTIpLGQxCi0JbW92YiAoMjU2LGEyKSxkMQotCW1vdmIgKDEzMTA3MSxhMiksZDEKLQltb3ZiIChkMixhMiksZDMKLQltb3ZiICgxMzEwNzEpLGQyCi0JbW92YiBkMSwoYTIpCi0JbW92YiBkMSwoOCxhMikKLQltb3ZiIGQxLCgyNTYsYTIpCi0JbW92YiBkMSwoMTMxMDcxLGEyKQotCW1vdmIgZDEsKGQyLGEyKQotCW1vdmIgZDEsKDI1NikKLQltb3ZiIGQxLCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmJ1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL21vdmJ1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDk3M2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3ZidS5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0JLnRleHQKLQltb3ZidSAoYTIpLGQxCi0JbW92YnUgKDgsYTIpLGQxCi0JbW92YnUgKDI1NixhMiksZDEKLQltb3ZidSAoMTMxMDcxLGEyKSxkMQotCW1vdmJ1IChkMSxhMSksZDIKLQltb3ZidSAoMzI3NjgpLGQxCi0JbW92YnUgKDEzMTA3MSksZDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvbW92eC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Z4LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZTFkNzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tb3Z4LnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkudGV4dAotCW1vdnggKDgsYTIpLGQxCi0JbW92eCAoMjU2LGEyKSxkMQotCW1vdnggKDEzMTA3MSxhMiksZDEKLQltb3Z4IGQxLCg4LGEyKQotCW1vdnggZDEsKDI1NixhMikKLQltb3Z4IGQxLCgxMzEwNzEsYTIpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL211bGRpdi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9tdWxkaXYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxNzAyNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL211bGRpdi5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLnRleHQKLQltdWwgZDEsZDIKLQltdWx1IGQyLGQzCi0JZGl2dSBkMyxkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9vdGhlci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9vdGhlci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y5NGJkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvb3RoZXIucworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkudGV4dAotCWptcCAyNTYKLQlqbXAgMTMxMDcxCi0Jam1wIChhMikKLQlqc3IgMjU2Ci0JanNyIDEzMTA3MQotCWpzciAoYTIpCi0JcnRzCi0JcnRpCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGU3NjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDIwMC9zaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0JLnRleHQKLQlhc3IgZDIKLQlsc3IgZDMKLQlyb3IgZDEKLQlyb2wgZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc3ViLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMjAwL3N1Yi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTUxNjU0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAyMDAvc3ViLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0JLnRleHQKLQlzdWIgZDEsZDIKLQlzdWIgZDIsYTMKLQlzdWIgYTMsZDMKLQlzdWIgYTMsYTIKLQlzdWIgMzI3NjcsZDIKLQlzdWIgMTMxMDcxLGQyCi0Jc3ViIDMyNzY3LGEyCi0Jc3ViIDEzMTA3MSxhMgotCXN1YmMgZDEsZDIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYWRkLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2FkZC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY1NThmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLQlhZGQgZDEsZDIKLQlhZGQgZDIsYTMKLQlhZGQgYTMsYTIKLQlhZGQgYTIsZDEKLQlhZGQgMTYsZDEKLQlhZGQgMjU2LGQyCi0JYWRkIDEzMTA3MSxkMwotCWFkZCAxNixhMQotCWFkZCAyNTYsYTIKLQlhZGQgMTMxMDcxLGEzCi0JYWRkIDE2LHNwCi0JYWRkIDI1NixzcAotCWFkZCAxMzEwNzEsc3AKLQlhZGRjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2Jhc2ljLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmFzaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA1N2I5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmFzaWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsOTg2ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLXByb2MgZG9fYWRkIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImFkZC5zOiBBZGQgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImFkZC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMSBGMTZCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGMTdFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNSBGMTU5XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyAyOTEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQUMyMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGQgRkNDM0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIDIxMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEZBRDIwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOSBGQ0QzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFmIEY4RkUxMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFGRTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEZDRkVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjE0NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTddIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYmNjIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJjYy5zOiBCY2MgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJiY2MucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBDODAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBDOTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDMTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBDMjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBDMzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBDNTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBDNjAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBDNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBDNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBGOEU4MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEY4RTkwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjhFQTAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZCBGOEVCMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIENBMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE1XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JpdCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJiaXQuczogYml0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiYml0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjhFRDQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBGQUVFMDAyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRkNFRkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBkIEZBRjkwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMSBGRTAyRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxMDA0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE4IEYwODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEZBRjEwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSBGRTAwRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzkgKzAxMDA0MFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI1IEYwOTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEZBRjUwODQwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYiBGRTAxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICswMTAwNDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19jbXAge30gewotICAgIHNldCB0ZXN0bmFtZSAiY21wLnM6IGNtcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImNtcC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEE2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgRjFBQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDMgRjE5RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgQkVcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBBRjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBGQUNBMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRkNDOUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEJGMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEZBREEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQ0Q5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTEyXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHQuczogZXh0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiZXh0LnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjJEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgMTJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyAxN1xbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDFBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgMURcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT01XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2V4dGVuZCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJleHRlbmQuczogZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJleHRlbmQucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGNTA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGNkZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGNjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGOTAyMTBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZCMDMwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGRDAzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRjYxNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTUgRjkxNjEwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBGQjE3MDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkQxN0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGNjRCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBGNjVFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGNjc2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xNV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb2dpY2FsIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvZ2ljYWwuczogbG9naWNhbCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvZ2ljYWwucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBGMjA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGOEUyN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IEZBRTNGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGQ0UzRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGYgRkFGQ0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEzIEYyMTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE1IEY4RTY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRkFFN0ZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEZDRTdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTAgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRkFGREZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI2IEYyMjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEZBRUJGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBGQ0VCRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE0ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIEYyMzNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xN10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19sb29wIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImxvb3AuczogbG9vcCB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImxvb3AucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBEOFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEQ5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRDFcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMyBEMlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEQzXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBENVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA3IEQ2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRDdcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBENFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIERBXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGIgREJcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0xMl0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tb3YxIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgIm1vdjEuczogbW92MSB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdjEucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA4NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEYxRTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIEYxRDlcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA1IDk5XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgM0VcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNyBGMkY0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBGMkZCXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYiBGMkUxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZCBGMkZBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiA3NlxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEY4MDYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRkEwNjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE3IEZDMDZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTQgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWQgNTkwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRkFCNTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIzIEYyRTdcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE3XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjIge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92Mi5zOiBtb3YyIHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92Mi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZDQjVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBGMzI1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAzMTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBiIEZDQTVGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMSBGMDA2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMyBGODI2MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZBMjYwMDAxIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRkMyNkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs5ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIDVEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIEZBQjEwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBGQ0IxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYzQTVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEZBQTEwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzMiBGQ0ExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM4IEY4RjEyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92MyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3YzLnM6IG1vdjMgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3YzLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAxIEY4MTYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRkExNjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEZDMTZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSA0NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBGQTk1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRkM5NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFhIEYzNUFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIDA1ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWYgRkM4NUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNSBGMDE2XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNyBGODM2MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJhIEZBMzYwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyZSBGQzM2RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzE1ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IDQ3MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE5XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX21vdjQge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92NC5zOiBtb3Y0IHRlc3RzIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibW92NC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEZBOTQwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBGQzk0RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjNEQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRkE4NDgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEZDODRGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNiArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGOEY1MjBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE5IDg1MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFiIDJEMDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRkNDREZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCA5NTA4XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiAyNTAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEZDRERGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92YnUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92YnUuczogbW92YnUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZidS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NDYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE0NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNDZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEI5MDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQjkwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0I5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjQyNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0E5RkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNTZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NTYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE1NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNTZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NjIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk2MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5NkZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNDVBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNjgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92aHUge30gewotICAgIHNldCB0ZXN0bmFtZSAibW92aHUuczogbW92aHUgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZodS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYwNjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4NjYwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRkE2NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA5IEZDNjZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNSArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZiBGOEJEMDhcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEyIEZBQkQwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBGQ0JERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjRBNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgMzkwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMSBGQ0FERkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI3IEYwNzZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI5IEY4NzYyMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRkE3NjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEZDNzZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTUgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjg5NzIwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOSBGQTk3MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2QgRkM5N0ZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxOCArMDEwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGNERBXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NSAwNzgwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ4IEZDODdGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMjEgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92bSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZtLnM6IG1vdm0gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJtb3ZtLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQ0UzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQ0VGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgQ0YzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0ZGOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09NF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tdWxkaXYge30gewotICAgIHNldCB0ZXN0bmFtZSAibXVsZGl2LnM6IG11bGRpdiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm11bGRpdi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyNDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYyNUJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYyNkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYyN0VcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fb3RoZXIge30gewotICAgIHNldCB0ZXN0bmFtZSAib3RoZXIuczogb3RoZXIgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJvdGhlci5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIDA4XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDEgNDRcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiA0OVxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAzIDUzXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjBGNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgQ0MwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOSBEQ0ZGRkYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzggKzAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIENEMDAwMTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArOSArMDlcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTMgRERGRkZGMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMCArMDAzMDIwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjBGMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRkFGRjAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIwIEZDRkZGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTMgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgREYzMDA3XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOSBERTMwMDVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJjIEYwRkNcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDJlIEYwRkRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMwIEYwRkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDMyIENCXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzMgRjBGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fc2hpZnQge30gewotICAgIHNldCB0ZXN0bmFtZSAic2hpZnQuczogc2hpZnQgdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJzaGlmdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYyQjZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEY4Q0EwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDUgRjJBQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDcgRjhDNzA0XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBGMjlFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBGOEMyMDRcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBmIDU2XFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjI4NVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjI4MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09OV0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19zdWIge30gewotICAgIHNldCB0ZXN0bmFtZSAic3ViLnM6IHN1YiB0ZXN0cyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgInN1Yi5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEYxMDZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIEYxMkJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEYxMUZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEYxM0VcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEZDQzZGRkZGIFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzYgKzAxMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRkNENUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3ICswMTAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE0IEYxODZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fdWRmIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgInVkZi5zOiB1ZGYgdGVzdHMgcGFydCAxIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAidWRmLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjYwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjYxMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjYyMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjYzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjY0MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjY1MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjY2MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjY3MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjY4MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjY5MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjZBMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjZCMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjZDMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjZEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjZFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRjZGMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjUwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjUxMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjUyMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjU0MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRjU1MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjU2MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgRjU3MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRjU4MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgRjU5MVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgRjVBMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgRjVCMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggRjVDMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2EgRjVEMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRjVFMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2UgRjVGMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDAgRjkwMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0MyBGOTExN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQ2IEY5MjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDkgRjkzMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0YyBGOTQxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRmIEY5NTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTIgRjk2MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1NSBGOTcxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDU4IEY5ODE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNWIgRjk5MTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1ZSBGOUExN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDYxIEY5QjE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNjQgRjlDMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA2NyBGOUQxN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDZhIEY5RTE3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNmQgRjlGMTdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3MCBGQjAxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNzQgRkIxMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDc4IEZCMjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA3YyBGQjMxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwODAgRkI0MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDg0IEZCNTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA4OCBGQjYxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOGMgRkI3MUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDkwIEZCODFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA5NCBGQjkxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwOTggRkJBMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDljIEZCQjFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhMCBGQkMxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYTQgRkJEMUZGN0ZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGE4IEZCRTFGRjdGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBhYyBGQkYxRkY3RlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYjAgRkQwMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2NiArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBiNiBGRDExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzY3ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGJjIEZEMjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNjggKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwYzIgRkQzMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs2OSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBjOCBGRDQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzcwICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGNlIEZENTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzEgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZDQgRkQ2MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3MiArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBkYSBGRDcxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzczICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGUwIEZEODFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzQgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZTYgRkQ5MUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3NSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBlYyBGREExRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc2ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMGYyIEZEQjFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArNzcgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwZjggRkRDMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs3OCArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDBmZSBGREQxRkZGRlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzc5ICswMDAwXFteXG5cXSpcbiIJCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTA0IEZERTFGRkZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArODAgKzAwMDBcW15cblxdKlxuIgkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMGEgRkRGMUZGRkZcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICs4MSArMDAwMFxbXlxuXF0qXG4iCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExMCBGOTA1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTEzIEY5MTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMTYgRjkyNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDExOSBGOTM1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTFjIEY5NDU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMWYgRjk1NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyMiBGOTY1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTI1IEY5NzU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMjggRjk4NTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEyYiBGOTk1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTJlIEY5QTU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxMzEgRjlCNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzNCBGOUM1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTM3IEY5RDU4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxM2EgRjlFNTgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDEzZCBGOUY1ODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTQwIEZCMDUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE0NCBGQjE1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNDggRkIyNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTRjIEZCMzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1MCBGQjQ1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNTQgRkI1NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTU4IEZCNjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE1YyBGQjc1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNjAgRkI4NTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTY0IEZCOTUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE2OCBGQkE1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNmMgRkJCNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTcwIEZCQzUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE3NCBGQkQ1MDA4MFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxNzggRkJFNTAwODBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTdjIEZCRjUwMDgwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE4MCBGRDA1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTg2IEZEMTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE1ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOGMgRkQyNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTYgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDE5MiBGRDM1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzExNyArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMTk4IEZENDUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTE4ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxOWUgRkQ1NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMTkgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFhNCBGRDY1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMCArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWFhIEZENzUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTIxICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYjAgRkQ4NTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjIgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFiNiBGRDk1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyMyArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWJjIEZEQTUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI0ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxYzIgRkRCNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjUgKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFjOCBGREM1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyNiArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMWNlIEZERDUwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArMTI3ICswMTAwXFteXG5cXSpcbiIJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAxZDQgRkRFNTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICsxMjggKzAxMDBcW15cblxdKlxuIgkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDFkYSBGREY1MDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gKzEyOSArMDEwMFxbXlxuXF0qXG4iCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTE2MF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1pZiBbaXN0YXJnZXQgbW4xMDMwMCotKi0qXSB0aGVuIHsKLSAgICAjIFRlc3QgdGhlIGJhc2ljIGluc3RydWN0aW9uIHBhcnNlci4KLSAgICBkb19hZGQKLSAgICBkb19iY2MKLSAgICBkb19iaXQKLSAgICBkb19jbXAKLSAgICBkb19leHQKLSAgICBkb19leHRlbmQKLSAgICBkb19sb2dpY2FsCi0gICAgZG9fbG9vcAotICAgIGRvX21vdjEKLSAgICBkb19tb3YyCi0gICAgZG9fbW92MwotICAgIGRvX21vdjQKLSAgICBkb19tb3ZidQotICAgIGRvX21vdmh1Ci0gICAgZG9fbW92bQotICAgIGRvX211bGRpdgotICAgIGRvX290aGVyCi0gICAgZG9fc2hpZnQKLSAgICBkb19zdWIKLSAgICBkb191ZGYKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JjYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjkyZGNlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvYmNjLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0JLnRleHQKLWZvbzoKLQliZXEgZm9vCi0JYm5lIGZvbwotCWJndCBmb28KLQliZ2UgZm9vCi0JYmxlIGZvbwotCWJsdCBmb28KLQliaGkgZm9vCi0JYmNjIGZvbwotCWJscyBmb28JCi0JYmNzIGZvbwotCWJ2YyBmb28KLQlidnMgZm9vCi0JYm5jIGZvbwotCWJucyBmb28KLQlicmEgZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JpdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9iaXQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVjNTUxOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2JpdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotCS50ZXh0Ci0JYnRzdCA2NCxkMQotCWJ0c3QgODE5MixkMgotCWJ0c3QgMTMxMDcxLGQzCi0JYnRzdCA2NCwoOCxhMSkKLQlidHN0IDY0LCgxMzEwNzEpCi0JYnNldCBkMSwoYTIpCi0JYnNldCA2NCwoOCxhMSkKLQlic2V0IDY0LCgxMzEwNzEpCi0JYmNsciBkMSwoYTIpCi0JYmNsciA2NCwoOCxhMSkKLQliY2xyIDY0LCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2NtcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9jbXAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y4YTcxZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2NtcC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci0JY21wIGQxLGQyCi0JY21wIGQyLGEzCi0JY21wIGEzLGQzCi0JY21wIGEzLGEyCi0JY21wIDE2LGQzCi0JY21wIDI1NixkMgotCWNtcCAxMzEwNzEsZDEKLQljbXAgMTYsYTMKLQljbXAgMjU2LGEyCi0JY21wIDEzMTA3MSxhMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvZXh0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTJlNzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHQucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCS50ZXh0Ci0JZXh0IGQxCi0JZXh0YiBkMgotCWV4dGJ1IGQzCi0JZXh0aCBkMgotCWV4dGh1IGQxCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dGVuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9leHRlbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDViNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2V4dGVuZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotCS50ZXh0Ci0JcHV0eCBkMQotCWdldHggZDIKLQltdWxxIGQxLGQyCi0JbXVscSAxNixkMgotCW11bHEgMjU2LGQzCi0JbXVscSAxMzEwNzEsZDMKLQltdWxxdSBkMSxkMgotCW11bHF1IDE2LGQyCi0JbXVscXUgMjU2LGQzCi0JbXVscXUgMTMxMDcxLGQzCi0Jc2F0MTYgZDIsZDMKLQlzYXQyNCBkMyxkMgotCWJzY2ggZDEsZDIKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOTc2ZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0JLnRleHQKLQlhbmQgZDEsZDIKLQlhbmQgMTI3LGQyCi0JYW5kIDMyNzY3LGQzCi0JYW5kIDEzMTA3MSxkMwotCWFuZCAzMjc2Nyxwc3cKLQlvciBkMSxkMgotCW9yIDEyNyxkMgotCW9yIDMyNzY3LGQzCi0Jb3IgMTMxMDcxLGQzCi0Jb3IgMzI3NjcscHN3Ci0JeG9yIGQxLGQyCi0JeG9yIDMyNzY3LGQzCi0JeG9yIDEzMTA3MSxkMwotCW5vdCBkMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9sb29wLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkxODIwNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL2xvb3AucworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLQkudGV4dAotZm9vOgotCWxlcQotCWxuZQotCWxndAotCWxnZQotCWxsZQotCWxsdAotCWxoaQotCWxjYwotCWxscwkKLQlsY3MKLQlscmEKLQlzZXRsYgotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDRjYzU1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92MS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGQxLGQyCi0JbW92IGQxLGEyCi0JbW92IGEyLGQxCi0JbW92IGEyLGExCi0JbW92IHNwLGEyCi0JbW92IGExLHNwCi0JbW92IGQyLHBzdwotCW1vdiBtZHIsZDEKLQltb3YgZDIsbWRyCi0JbW92IChhMiksZDEKLQltb3YgKDgsYTIpLGQxCi0JbW92ICgyNTYsYTIpLGQxCi0JbW92ICgxMzEwNzEsYTIpLGQxCi0JbW92ICg4LHNwKSxkMQotCW1vdiAoMjU2LHNwKSxkMQotCW1vdiBwc3csZDMKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3YyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZDFlZGM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92Mi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci0gICAgICAgIG1vdiAoMTMxMDcxLHNwKSxkMQotCW1vdiAoZDEsYTEpLGQyCi0JbW92ICgzMjc2OCksZDEKLQltb3YgKDEzMTA3MSksZDEKLQltb3YgKGEyKSxhMQotCW1vdiAoOCxhMiksYTEKLQltb3YgKDI1NixhMiksYTEKLQltb3YgKDEzMTA3MSxhMiksYTEKLQltb3YgKDgsc3ApLGExCi0JbW92ICgyNTYsc3ApLGExCi0JbW92ICgxMzEwNzEsc3ApLGExCi0JbW92IChkMSxhMSksYTIKLSAgICAgICAgbW92ICgzMjc2OCksYTEKLSAgICAgICAgbW92ICgxMzEwNzEpLGExCi0gICAgICAgIG1vdiAoMzIsYTEpLHNwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVjMGI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92My5zCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotCS50ZXh0Ci0gICAgICAgIG1vdiBkMSwoYTIpCi0gICAgICAgIG1vdiBkMSwoMzIsYTIpCi0JbW92IGQxLCgyNTYsYTIpCi0JbW92IGQxLCgxMzEwNzEsYTIpCi0JbW92IGQxLCgzMixzcCkKLQltb3YgZDEsKDMyNzY4LHNwKQotCW1vdiBkMSwoMTMxMDcxLHNwKQotCW1vdiBkMSwoZDIsYTIpCi0JbW92IGQxLCgxMjgpCi0JbW92IGQxLCgxMzEwNzEpCi0JbW92IGExLChhMikKLQltb3YgYTEsKDMyLGEyKQotCW1vdiBhMSwoMjU2LGEyKQotCW1vdiBhMSwoMTMxMDcxLGEyKQotCW1vdiBhMSwoMzIsc3ApCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdjQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQ2OWMxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92NC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCS50ZXh0Ci0JbW92IGExLCgzMjc2OCxzcCkKLQltb3YgYTEsKDEzMTA3MSxzcCkKLQltb3YgYTEsKGQyLGEyKQotCW1vdiBhMSwoMTI4KQotCW1vdiBhMSwoMTMxMDcxKQotCW1vdiBzcCwoMzIsYTEpCi0JbW92IDgsZDEKLQltb3YgMjU2LGQxCi0JbW92IDEzMTA3MSxkMQotCW1vdiA4LGExCi0JbW92IDI1NixhMQotCW1vdiAxMzEwNzEsYTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbW92YnUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkYjdiZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmJ1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0JLnRleHQKLQltb3ZidSAoYTIpLGQxCi0JbW92YnUgKDgsYTIpLGQxCi0JbW92YnUgKDI1NixhMiksZDEKLQltb3ZidSAoMTMxMDcxLGEyKSxkMQotCW1vdmJ1ICg4LHNwKSxkMQotCW1vdmJ1ICgyNTYsc3ApLGQxCi0JbW92YnUgKDEzMTA3MSxzcCksZDEKLQltb3ZidSAoZDEsYTEpLGQyCi0JbW92YnUgKDMyNzY4KSxkMQotCW1vdmJ1ICgxMzEwNzEpLGQxCi0JbW92YnUgZDEsKGEyKQotCW1vdmJ1IGQxLCgzMixhMikKLQltb3ZidSBkMSwoMjU2LGEyKQotCW1vdmJ1IGQxLCgxMzEwNzEsYTIpCi0JbW92YnUgZDEsKDMyLHNwKQotCW1vdmJ1IGQxLCgzMjc2OCxzcCkKLQltb3ZidSBkMSwoMTMxMDcxLHNwKQotCW1vdmJ1IGQxLChkMixhMikKLQltb3ZidSBkMSwoMTI4KQotCW1vdmJ1IGQxLCgxMzEwNzEpCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmh1LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdmh1LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MzdlODAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZodS5zCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotCS50ZXh0Ci0JbW92aHUgKGEyKSxkMQotCW1vdmh1ICg4LGEyKSxkMQotCW1vdmh1ICgyNTYsYTIpLGQxCi0JbW92aHUgKDEzMTA3MSxhMiksZDEKLQltb3ZodSAoOCxzcCksZDEKLQltb3ZodSAoMjU2LHNwKSxkMQotCW1vdmh1ICgxMzEwNzEsc3ApLGQxCi0JbW92aHUgKGQxLGExKSxkMgotCW1vdmh1ICgzMjc2OCksZDEKLQltb3ZodSAoMTMxMDcxKSxkMQotCW1vdmh1IGQxLChhMikKLQltb3ZodSBkMSwoMzIsYTIpCi0JbW92aHUgZDEsKDI1NixhMikKLQltb3ZodSBkMSwoMTMxMDcxLGEyKQotCW1vdmh1IGQxLCgzMixzcCkKLQltb3ZodSBkMSwoMzI3Njgsc3ApCi0JbW92aHUgZDEsKDEzMTA3MSxzcCkKLQltb3ZodSBkMSwoZDIsYTIpCi0JbW92aHUgZDEsKDEyOCkKLQltb3ZodSBkMSwoMTMxMDcxKQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9tb3ZtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdm0ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmYzY4My4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL21vdm0ucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCS50ZXh0Ci0JbW92bSAoc3ApLFthMixhM10KLQltb3ZtIChzcCksW2QyLGQzLGEyLGEzLG90aGVyXQotCW1vdm0gW2EyLGEzXSwoc3ApCi0JbW92bSBbZDIsZDMsYTIsYTMsb3RoZXJdLChzcCkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbXVsZGl2LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL211bGRpdi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjExZTVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvbXVsZGl2LnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLQkudGV4dAotCW11bCBkMSxkMgotCW11bHUgZDIsZDMKLQlkaXYgZDMsZDMKLQlkaXZ1IGQzLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL290aGVyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL290aGVyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYWY3NGEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9vdGhlci5zCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotCS50ZXh0Ci0JY2xyIGQyCi0JaW5jIGQxCi0JaW5jIGEyCi0JaW5jNCBhMwotCWptcCAoYTIpCi0Jam1wIDI1NgotCWptcCAxMzEwNzEKLQljYWxsIDI1NixbYTIsYTNdLDkKLQljYWxsIDEzMTA3MSxbYTIsYTNdLDMyCi0JY2FsbHMgKGEyKQotCWNhbGxzIDI1NgotCWNhbGxzIDEzMTA3MQotCXJldCBbYTIsYTNdLDcKLQlyZXRmIFthMixhM10sNQotCXJldHMKLQlydGkKLQl0cmFwCi0Jbm9wCi0JcnRtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3NoaWZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3NoaWZ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGM5Y2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zaGlmdC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotCS50ZXh0Ci0JYXNyIGQxLGQyCi0JYXNyIDQsZDIKLQlsc3IgZDIsZDMKLQlsc3IgNCxkMwotCWFzbCBkMyxkMgotCWFzbCA0LGQyCi0JYXNsMiBkMgotCXJvciBkMQotCXJvbCBkMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zdWIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21uMTAzMDAvc3ViLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGM2NjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC9zdWIucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0Jc3ViIGQxLGQyCi0Jc3ViIGQyLGEzCi0Jc3ViIGEzLGQzCi0Jc3ViIGEzLGEyCi0Jc3ViIDEzMTA3MSxkMgotCXN1YiAxMzEwNzEsYTEKLQlzdWJjIGQxLGQyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbW4xMDMwMC91ZGYucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjYmQxMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tbjEwMzAwL3VkZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLQkudGV4dAotCXVkZjAwIGQwLGQxCi0JdWRmMDEgZDAsZDEKLQl1ZGYwMiBkMCxkMQotCXVkZjAzIGQwLGQxCi0JdWRmMDQgZDAsZDEKLQl1ZGYwNSBkMCxkMQotCXVkZjA2IGQwLGQxCi0JdWRmMDcgZDAsZDEKLQl1ZGYwOCBkMCxkMQotCXVkZjA5IGQwLGQxCi0JdWRmMTAgZDAsZDEKLQl1ZGYxMSBkMCxkMQotCXVkZjEyIGQwLGQxCi0JdWRmMTMgZDAsZDEKLQl1ZGYxNCBkMCxkMQotCXVkZjE1IGQwLGQxCi0JdWRmMjAgZDAsZDEKLQl1ZGYyMSBkMCxkMQotCXVkZjIyIGQwLGQxCi0JdWRmMjMgZDAsZDEKLQl1ZGYyNCBkMCxkMQotCXVkZjI1IGQwLGQxCi0JdWRmMjYgZDAsZDEKLQl1ZGYyNyBkMCxkMQotCXVkZjI4IGQwLGQxCi0JdWRmMjkgZDAsZDEKLQl1ZGYzMCBkMCxkMQotCXVkZjMxIGQwLGQxCi0JdWRmMzIgZDAsZDEKLQl1ZGYzMyBkMCxkMQotCXVkZjM0IGQwLGQxCi0JdWRmMzUgZDAsZDEKLQl1ZGYwMCAxMjcsZDEKLQl1ZGYwMSAxMjcsZDEKLQl1ZGYwMiAxMjcsZDEKLQl1ZGYwMyAxMjcsZDEKLQl1ZGYwNCAxMjcsZDEKLQl1ZGYwNSAxMjcsZDEKLQl1ZGYwNiAxMjcsZDEKLQl1ZGYwNyAxMjcsZDEKLQl1ZGYwOCAxMjcsZDEKLQl1ZGYwOSAxMjcsZDEKLQl1ZGYxMCAxMjcsZDEKLQl1ZGYxMSAxMjcsZDEKLQl1ZGYxMiAxMjcsZDEKLQl1ZGYxMyAxMjcsZDEKLQl1ZGYxNCAxMjcsZDEKLQl1ZGYxNSAxMjcsZDEKLQl1ZGYwMCAzMjc2NyxkMQotCXVkZjAxIDMyNzY3LGQxCi0JdWRmMDIgMzI3NjcsZDEKLQl1ZGYwMyAzMjc2NyxkMQotCXVkZjA0IDMyNzY3LGQxCi0JdWRmMDUgMzI3NjcsZDEKLQl1ZGYwNiAzMjc2NyxkMQotCXVkZjA3IDMyNzY3LGQxCi0JdWRmMDggMzI3NjcsZDEKLQl1ZGYwOSAzMjc2NyxkMQotCXVkZjEwIDMyNzY3LGQxCi0JdWRmMTEgMzI3NjcsZDEKLQl1ZGYxMiAzMjc2NyxkMQotCXVkZjEzIDMyNzY3LGQxCi0JdWRmMTQgMzI3NjcsZDEKLQl1ZGYxNSAzMjc2NyxkMQotCXVkZjAwIDY1NTM1LGQxCi0JdWRmMDEgNjU1MzUsZDEKLQl1ZGYwMiA2NTUzNSxkMQotCXVkZjAzIDY1NTM1LGQxCi0JdWRmMDQgNjU1MzUsZDEKLQl1ZGYwNSA2NTUzNSxkMQotCXVkZjA2IDY1NTM1LGQxCi0JdWRmMDcgNjU1MzUsZDEKLQl1ZGYwOCA2NTUzNSxkMQotCXVkZjA5IDY1NTM1LGQxCi0JdWRmMTAgNjU1MzUsZDEKLQl1ZGYxMSA2NTUzNSxkMQotCXVkZjEyIDY1NTM1LGQxCi0JdWRmMTMgNjU1MzUsZDEKLQl1ZGYxNCA2NTUzNSxkMQotCXVkZjE1IDY1NTM1LGQxCi0JdWRmdTAwIDEyOCxkMQotCXVkZnUwMSAxMjgsZDEKLQl1ZGZ1MDIgMTI4LGQxCi0JdWRmdTAzIDEyOCxkMQotCXVkZnUwNCAxMjgsZDEKLQl1ZGZ1MDUgMTI4LGQxCi0JdWRmdTA2IDEyOCxkMQotCXVkZnUwNyAxMjgsZDEKLQl1ZGZ1MDggMTI4LGQxCi0JdWRmdTA5IDEyOCxkMQotCXVkZnUxMCAxMjgsZDEKLQl1ZGZ1MTEgMTI4LGQxCi0JdWRmdTEyIDEyOCxkMQotCXVkZnUxMyAxMjgsZDEKLQl1ZGZ1MTQgMTI4LGQxCi0JdWRmdTE1IDEyOCxkMQotCXVkZnUwMCAzMjc2OCxkMQotCXVkZnUwMSAzMjc2OCxkMQotCXVkZnUwMiAzMjc2OCxkMQotCXVkZnUwMyAzMjc2OCxkMQotCXVkZnUwNCAzMjc2OCxkMQotCXVkZnUwNSAzMjc2OCxkMQotCXVkZnUwNiAzMjc2OCxkMQotCXVkZnUwNyAzMjc2OCxkMQotCXVkZnUwOCAzMjc2OCxkMQotCXVkZnUwOSAzMjc2OCxkMQotCXVkZnUxMCAzMjc2OCxkMQotCXVkZnUxMSAzMjc2OCxkMQotCXVkZnUxMiAzMjc2OCxkMQotCXVkZnUxMyAzMjc2OCxkMQotCXVkZnUxNCAzMjc2OCxkMQotCXVkZnUxNSAzMjc2OCxkMQotCXVkZnUwMCA2NTUzNixkMQotCXVkZnUwMSA2NTUzNixkMQotCXVkZnUwMiA2NTUzNixkMQotCXVkZnUwMyA2NTUzNixkMQotCXVkZnUwNCA2NTUzNixkMQotCXVkZnUwNSA2NTUzNixkMQotCXVkZnUwNiA2NTUzNixkMQotCXVkZnUwNyA2NTUzNixkMQotCXVkZnUwOCA2NTUzNixkMQotCXVkZnUwOSA2NTUzNixkMQotCXVkZnUxMCA2NTUzNixkMQotCXVkZnUxMSA2NTUzNixkMQotCXVkZnUxMiA2NTUzNixkMQotCXVkZnUxMyA2NTUzNixkMQotCXVkZnUxNCA2NTUzNixkMQotCXVkZnUxNSA2NTUzNixkMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNWY0YjUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NoYXIuZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI29iamNvcHk6IC1PIHNyZWMKLSNuYW1lOiBNUkkgY2hhcmFjdGVyIGNvbnN0YW50cwotI2FzOiAtTQotCi0jIFRlc3QgTVJJIGNoYXJhY3RlciBjb25zdGFudHMKLQotUzAuKgotUzExMy4uLi4oNjE2MTYyNjM2MTYyNjM2NDY1MDAwMDAwNjEyNzYyMDApfCg2MTYxNjI2MzY0NjM2MjYxMDAwMDAwNjUwMDYyMjc2MSkuKgotI3Bhc3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY2hhci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjBhODNhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jaGFyLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTsgVGVzdCBNUkkgc3R5bGUgY2hhcmFjdGVyIGNvbnN0YW50cy4KLQotCWRjLmIJJ2EnCi0JZGMuYgknYWJjJwotCWRjLmwJJ2FiY2RlJwotCWRjLmwJJ2EnJ2InCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0MzRkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5kCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jbm06IC0tZXh0ZXJuLW9ubHkKLSNuYW1lOiBNUkkgY29tbWVudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBjb21tZW50cwotCi0wKzAyIEEgUkFNCi0wKzAxIEEgUk9NCi0gKiBVIGxhYmVsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbW1lbnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3MzE4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbWVudC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotCXhyZWYgbGFiZWwKLQl4ZGVmCVJPTSxSQU0KLQkqIHRoaXMgaXMgYSBjb21tZW50Ci0KLQlkYy5sCWxhYmVsCWxvb3AgaWYgd2UgaGF2ZW4ndCByZWFjaCBlbmQgeWV0Ci0JCi1ST00JCQkJRVFVCSQwMDAwMDAwMQkqIHdvcmQgd2lkZQotUkFNCQkJCUVRVQkkMDAwMDAwMDIJd29yZCB3aWRlCi0JZGMubAlSQU0KLQlkYy5sCTAJLHJlYWxseSxhLGNvbW1lbnQKLTsgYSBjb21tZW50Ci0gOyBhbm90aGVyIGNvbW1lbnQKLSAgOyBhbm90aGVyIGNvbW1lbnQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24uZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjMTUzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBjb21tb24gc2VjdGlvbnMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBjb21tb24gc2VjdGlvbnMKLQotMCswOCBDIDAwY29tMgotMCswOCBDIGNvbTEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb21tb24ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczNWM2Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29tbW9uLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi07IFRlc3QgTVJJIGNvbW1vbiBzZWN0aW9ucwotCWNvbW1vbgljb20xCi0JZHMubAkxCi1jb20yCWNvbW1vbiAwMAotCWRzLmwJMQotaW5jb20JZHMubAkxCi0JY29tbW9uCWNvbTEKLQlkcy5sCTEKLQlkYXRhCi0JZGMubAljb20xCi0JZGMubAlpbmNvbQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjEwMDIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9jb25zdGFudHMuZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBjb25zdGFudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHlsZSBjb25zdGFudHMKLQotMCowIFQgZm9vCi0wKmEgQSBzMDEKLTAqYSBBIHMwMgotMCphIEEgczAzCi0wKmEgQSBzMDQKLTAqYSBBIHMwNQotMCphIEEgczA2Ci0wKmEgQSBzMDcKLTAqYSBBIHMwOAotMCphIEEgczA5Ci0wKjYxIEEgczEwCi0wKjYxIEEgczExCi0wKjYxNjI2MzY0IEEgczEyCi0wKjYxMjc2MjAwIEEgczEzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvY29uc3RhbnRzLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMzRlNjcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2NvbnN0YW50cy5zCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotCXhkZWYJczAxLHMwMixzMDMsczA0LHMwNSxzMDYsczA3LHMwOCxzMDksczEwLHMxMSxzMTIsczEzCi1zMDEJZXF1CSUxMDEwCi1zMDIJZXF1CTEwMTBiCi1zMDMJZXF1CUAxMgotczA0CWVxdQkxMm8KLXMwNQllcXUJMTJxCi1zMDYJZXF1CTEwCi1zMDcJZXF1CTEwZAotczA4CWVxdQkkYQotczA5CWVxdQkwYWgKLXMxMAllcXUJJ2EnCi1zMTEJZXF1CUEnYScKLXMxMgllcXUJJ2FiY2QnCi1zMTMJZXF1CSdhJydiJwotCi0JeGRlZglmb28KLWZvbwotCW1vdmVxLmwJIyUxMDEwLGQwCi0JbW92ZXEubAkjMTAxMGIsZDAKLQltb3ZlcS5sCSNAMTIsZDAKLQltb3ZlcS5sCSMxMm8sZDAKLQltb3ZlcS5sCSMxMnEsZDAKLQltb3ZlcS5sCSMxMCxkMAotCW1vdmVxLmwJIzEwZCxkMAotCW1vdmVxLmwJIyRhLGQwCi0JbW92ZXEubAkjMGFoLGQwCi0JbW92ZXEubAkjJ2EnLGQwCi0JbW92ZXEubAkjQSdhJyxkMAotCW5vcAotCi0JZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZW1wdHkucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGMyY2RkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lbXB0eS5zCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQlQJTUFDUk8JCTsgZW1wdHkgbWFjcm8KLQlFTkRNCi0KLQlTQlQJYXJnMSAKLSAgICAgICAgU0JUICAgICBhcmcyIC0gb25lIHR3dwotICAgICAgICBTQlQgICAgIGFyZzMgLSBvbmUgdHdvIHRocmVlCi0gICAgICAgIFNCVCAgICAgYXJnNCAtIG9uZSB0d28gdGhyZWUgZm91cgotICAgICAgICBTQlQgICAgIGFyZzUgLSBvbmUgdHdvIHRocmVlIGZvdXIgZml2ZQotICAgICAgICBTQlQgICAgIGFyZzYgLSBvbmUgdHdvICh0aHJlZSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmOWE4Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LmQKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBFUVUKLSNhczogLU0KLQotIyBUZXN0IHRoZSBNUkkgRVFVIGRpcmVjdGl2ZQotCi0wKjQgQSBTWU1CT0wKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9lcXUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1MTJhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXF1LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVGVzdCB0aGUgTVJJIEVRVSBkaXJlY3RpdmUKLQlYREVGCVNZTUJPTAotU1lNQk9MCUVRVQk0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkZWU0ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZXhwci5kCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotI25tOiAtLWV4dGVybi1vbmx5Ci0jbmFtZTogTVJJIGV4cHJlc3Npb25zCi0jYXM6IC1NCi0KLSMgVGVzdCBleHByZXNzaW9ucyBpbiBNUkkgbW9kZQotCi0wMCogQSBzMQotMDAqMTIgQSBzMgotMDAqNiBBIHMzCi0oMDAwMDAwMDApP2ZmKiBBIHM0Ci0wMCogQSBzNQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9leHByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Njc3YzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2V4cHIucworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotOyBUZXN0IGV4cHJlc3Npb25zIGluIE1SSSBtb2RlCi0JeGRlZglzMSxzMixzMyxzNCxzNQotczEJZXF1CTE+MgotczIJZXF1CTM8PDEqMwotczMJZXF1CTUhITMKLXM0CWVxdQkiMAotczUJZXF1CSgxPj0yKSEoMTw+MSkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTYyN2EuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zsb2F0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jb2JqY29weTogLU8gc3JlYwotI25hbWU6IE1SSSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMKLSNhczogLU0KLQotIyBUZXN0IE1SSSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMKLQotUzAuKgotUzExOC4uLi4oMTIzNDU2Nzg5QUJDREVGMDNGODAwMDAwNDEyMDAwMDA0MTIwMDAwMDQyKXwoRjBERUJDOUE3ODU2MzQxMjAwMDA4MDNGMDAwMDIwNDEwMDAwMjA0MTAwKS4qCi1TMTAuLi4uLihDODAwMDApfCgwMEM4NDIpLioKLSNwYXNzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZmxvYXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdmOWM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mbG9hdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi07IFRlc3QgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzIGluIE1SSSBtb2RlLgotCi0JZGMuZAk6MTIzNF81Njc4XzlhYmNfZGVmMAotCWRjLnMJMS4wCi0JZGMucwkxZTEKLQlkYy5zCTFfZV8xCi0JZGMucwkxRTIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1ZmI5NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvZm9yLmQKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTVJJIHN0cnVjdHVyZWQgZm9yCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3RydWN0dXJlZCBmb3IgcHNldWRvLW9wLgotCi0uKjogICAgIGZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMCA8Zm9vPiBjbHJ3ICVkMQotMCswMDIgPGZvb1wrKDB4fCkyPiBtb3ZldyAjMSwlZDAKLTArMDA2IDxmb29cKygweHwpNj4gY21waXcgIzEwLCVkMAotMCswMGEgPGZvb1wrKDB4fClhPiBibHRzIDArMDE2IDxmb29cKygweHwpMTY+Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IGFkZHcgJWQwLCVkMQotMCswMGUgPGZvb1wrKDB4fCllPiBidmNzIDArMDEyIDxmb29cKygweHwpMTI+Ci0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBicmFzIDArMDE2IDxmb29cKygweHwpMTY+Ci0wKzAxMiA8Zm9vXCsoMHh8KTEyPiBhZGRxdyAjMiwlZDAKLTArMDE0IDxmb29cKygweHwpMTQ+IGJyYXMgMCswMDYgPGZvb1wrKDB4fCk2PgotMCswMTYgPGZvb1wrKDB4fCkxNj4gY2xydyAlZDEKLTArMDE4IDxmb29cKygweHwpMTg+IG1vdmV3ICMxMCwlZDAKLTArMDFjIDxmb29cKygweHwpMWM+IGNtcGl3ICMxLCVkMAotMCswMjAgPGZvb1wrKDB4fCkyMD4gYmd0cyAwKzAzMCA8Zm9vXCsoMHh8KTMwPgotMCswMjIgPGZvb1wrKDB4fCkyMj4gY21waXcgIzEwMCwlZDEKLTArMDI2IDxmb29cKygweHwpMjY+IGJndHMgMCswMmEgPGZvb1wrKDB4fCkyYT4KLTArMDI4IDxmb29cKygweHwpMjg+IGJyYXMgMCswMmMgPGZvb1wrKDB4fCkyYz4KLTArMDJhIDxmb29cKygweHwpMmE+IGFkZHcgJWQwLCVkMQotMCswMmMgPGZvb1wrKDB4fCkyYz4gc3VicXcgIzEsJWQwCi0wKzAyZSA8Zm9vXCsoMHh8KTJlPiBicmFzIDArMDFjIDxmb29cKygweHwpMWM+Ci0wKzAzMCA8Zm9vXCsoMHh8KTMwPiBub3AKLTArMDMyIDxmb29cKygweHwpMzI+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2Zvci5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTI0NzI1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9mb3IucworKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTsgVGVzdCBNUkkgc3RydWN0dXJlZCBmb3IgcHNldWRvLW9wLgotCi0JeGRlZglmb28KLWZvbwotCWNsciBkMQotCWZvciBkMCA9ICMxIHRvICMxMCBieSAjMiBkbwotCSAgYWRkIGQwLGQxIGFyYml0cmFyeSB0ZXh0ICdpbiBjb21tZW50IGZpZWxkCi0JICBpZiA8dnM+IHRoZW4KLQkgICAgYnJlYWsKLQkgIGVuZGkKLQllbmRmCi0KLQljbHIgZDEKLQlmb3IgZDAgPSAjMTAgZG93bnRvICMxIGRvCi0JICBpZiBkMSA8Z2U+ICMxMDAgdGhlbgotCSAgICBuZXh0Ci0JICBlbmRpCi0JICBhZGQgZDAsZDEKLQllbmRmCi0KLQlub3AKLQlub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjk3MmMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2lmLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jb2JqZHVtcDogLWQgLS1wcmVmaXgtYWRkcmVzc2VzCi0jbmFtZTogTVJJIHN0cnVjdHVyZWQgaWYKLSNhczogLU0KLQotIyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIGlmIHBzZXVkby1vcC4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gY21wdyAlZDEsJWQwCi0wKzAwMiA8Zm9vXCsoMHh8KTI+IGJsZXMgMCswMTQgPGZvb1wrKDB4fCkxND4KLTArMDA0IDxmb29cKygweHwpND4gY21wdyAlZDIsJWQwCi0wKzAwNiA8Zm9vXCsoMHh8KTY+IGJsZXMgMCswMTQgPGZvb1wrKDB4fCkxND4KLTArMDA4IDxmb29cKygweHwpOD4gY21wdyAlZDEsJWQyCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IGJsZXMgMCswMTAgPGZvb1wrKDB4fCkxMD4KLTArMDBjIDxmb29cKygweHwpYz4gbW92ZXcgJWQxLCVkMwotMCswMGUgPGZvb1wrKDB4fCllPiBicmFzIDArMDEyIDxmb29cKygweHwpMTI+Ci0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBtb3ZldyAlZDIsJWQzCi0wKzAxMiA8Zm9vXCsoMHh8KTEyPiBicmFzIDArMDFlIDxmb29cKygweHwpMWU+Ci0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBjbXB3ICVkMCwlZDEKLTArMDE2IDxmb29cKygweHwpMTY+IGJndHMgMCswMWMgPGZvb1wrKDB4fCkxYz4KLTArMDE4IDxmb29cKygweHwpMTg+IGNtcHcgJWQwLCVkMgotMCswMWEgPGZvb1wrKDB4fCkxYT4gYmxlcyAwKzAxZSA8Zm9vXCsoMHh8KTFlPgotMCswMWMgPGZvb1wrKDB4fCkxYz4gbW92ZXcgJWQwLCVkMwotMCswMWUgPGZvb1wrKDB4fCkxZT4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaWYucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjQ2YmU4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pZi5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIGlmIHBzZXVkby1vcC4KLQotCXhkZWYJZm9vCi1mb28KLQlpZiBkMSA8Z3Q+IGQwIGFuZCBkMiA8Z3Q+IGQwIHRoZW4KLQkgIGlmIGQxIDxndD4gZDIgdGhlbgotCSAgICBtb3ZlIGQxLGQzCi0JICBlbHNlCi0JICAgIG1vdmUgZDIsZDMKLQkgIGVuZGkKLQllbHNlCi0JICBpZiBkMCA8Z3Q+IGQxIG9yIGQwIDxndD4gZDIgdGhlbgotCSAgICBtb3ZlIGQwLGQzCi0JICBlbmRpCi0JZW5kaQotCi0Jbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvaW1tY29uc3QuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pbW1jb25zdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJkYTEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9pbW1jb25zdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBpbW1lZGlhdGUgY29uc3RhbnRzCi0jYXM6IC1NCi0jc291cmNlOiBjb25zdGFudHMucwotCi0jIFRlc3QgTVJJIGltbWVkaWF0ZSBjb25zdGFudHMKLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gbW92ZXEgIzEwLCVkMAotMCswMDIgPGZvb1wrKDB4fCkyPiBtb3ZlcSAjMTAsJWQwCi0wKzAwNCA8Zm9vXCsoMHh8KTQ+IG1vdmVxICMxMCwlZDAKLTArMDA2IDxmb29cKygweHwpNj4gbW92ZXEgIzEwLCVkMAotMCswMDggPGZvb1wrKDB4fCk4PiBtb3ZlcSAjMTAsJWQwCi0wKzAwYSA8Zm9vXCsoMHh8KWE+IG1vdmVxICMxMCwlZDAKLTArMDBjIDxmb29cKygweHwpYz4gbW92ZXEgIzEwLCVkMAotMCswMGUgPGZvb1wrKDB4fCllPiBtb3ZlcSAjMTAsJWQwCi0wKzAxMCA8Zm9vXCsoMHh8KTEwPiBtb3ZlcSAjMTAsJWQwCi0wKzAxMiA8Zm9vXCsoMHh8KTEyPiBtb3ZlcSAjOTcsJWQwCi0wKzAxNCA8Zm9vXCsoMHh8KTE0PiBtb3ZlcSAjOTcsJWQwCi0wKzAxNiA8Zm9vXCsoMHh8KTE2PiBub3AKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTU4NTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNubTogLS1leHRlcm4tb25seQotI25hbWU6IE1SSSBsYWJlbAotI2FzOiAtTQotCi0jIFRlc3QgdXNpbmcgYW4gTVJJIHN0eWxlIGxhYmVsCi0KLTAwMDAqIFQgTEFCRUwKLVsgCV0qVSBTWU1CT0wKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9sYWJlbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWVjMmEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL2xhYmVsLnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTsgVGVzdCB1c2luZyBhbiBNUkkgc3R5bGUgbGFiZWwKLSogQWxzbyB0ZXN0IE1SSSBzdHlsZSBjb21tZW50cwotISBBbmQgYW5vdGhlciBjb21tZW50Ci0JWERFRglMQUJFTAotTEFCRUwJREMuTAlTWU1CT0wJCTsgQW5kIHlldCBhbm90aGVyIGNvbW1lbnQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzNmZhOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbW92ZW1sLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBNUkkgbW92ZW1sCi0jYXM6IC1NCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCswMDAgPC50ZXh0PjoKLSAgIDA6CTRjZGYgMDdmYyAgICAgIAltb3ZlbWwgJXNwQFwrLCVkMi0lYTIKLSAgIDQ6CTRjZGYgMDdmYyAgICAgIAltb3ZlbWwgJXNwQFwrLCVkMi0lYTIKLSAgIDg6CTQ4ZjkgMDdmYyAwMDAwIAltb3ZlbWwgJWQyLSVhMiwwIDwudGV4dD4KLSAgIGU6CTAwMDAgCi0gIDEwOgk0OGY5IDA3ZmMgMDAwMCAJbW92ZW1sICVkMi0lYTIsMCA8LnRleHQ+Ci0gIDE2OgkwMDAwIAotICAxODoJNGNmOSAwN2ZjIDAwMDAgCW1vdmVtbCAwIDwudGV4dD4sJWQyLSVhMgotICAxZToJMDAwMCAKLSAgMjA6CTRjZjkgMDdmYyAwMDAwIAltb3ZlbWwgMCA8LnRleHQ+LCVkMi0lYTIKLSAgMjY6CTAwMDAgCi0gIDI4Ogk0Y2Y5IDA3ZmMgMDAwMSAJbW92ZW1sIDE2MDAwIDxmZHNhPiwlZDItJWEyCi0gIDJlOgk2MDAwIAotICAzMDoJNGNmOSAwN2ZjIDAwMDEgCW1vdmVtbCAxNjAwMCA8ZmRzYT4sJWQyLSVhMgotICAzNjoJNjAwMCAKLSAgMzg6CTQ4ZjkgMDdmYyAwMDAxIAltb3ZlbWwgJWQyLSVhMiwxNjAwMCA8ZmRzYT4KLSAgM2U6CTYwMDAgCi0gIDQwOgk0OGY5IDA3ZmMgMDAwMSAJbW92ZW1sICVkMi0lYTIsMTYwMDAgPGZkc2E+Ci0gIDQ2Ogk2MDAwIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL21vdmVtbC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGZjNzI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tb3ZlbWwucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLWFzZGYJcmVnCWEwLWEyL2QyLWQ3Ci1mZHNhCWVxdQkkMTYwMDAKLQotCW1vdmVtLmwJKHNwKSssYTAtYTIvZDItZDcKLQltb3ZlbS5sCShzcCkrLGFzZGYKLQkKLQltb3ZlbS5sIGEwLWEyL2QyLWQ3LHN5bWJvbAotCW1vdmVtLmwJYXNkZixzeW1ib2wKLQotCW1vdmVtLmwgc3ltYm9sLGEwLWEyL2QyLWQ3Ci0JbW92ZW0ubAlzeW1ib2wsYXNkZgotCi0JbW92ZW0ubCBmZHNhLGEwLWEyL2QyLWQ3Ci0JbW92ZW0ubAlmZHNhLGFzZGYKLQotCW1vdmVtLmwgYTAtYTIvZDItZDcsZmRzYQotCW1vdmVtLmwJYXNkZixmZHNhCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvbXJpLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tcmkuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZjZGVkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9tcmkuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIwotIyBUZXN0IHRoZSBtNjhrIE1SSSBjb21wYXRpYmlsaXR5IG1vZGUuCi0jCi0jIEkgb3JpZ2luYWxseSB0aG91Z2h0IHRoYXQgbW9zdCBvZiB0ZXN0cyBhcHBsaWVkIHRvIGFueSBNUkkKLSMgYXNzZW1ibGVyLCBidXQgaXQgdHVybnMgb3V0IHRoYXQgZGlmZmVyZW50IE1SSSBhc3NlbWJsZXJzIHVzZQotIyBkaWZmZXJlbnQgc3ludGF4ZXMuCi0jCi0KLWlmICFbaXN0YXJnZXQgIm02OCotKi0qIl0gewotICAgIHJldHVybgotfQotCi1ydW5fZHVtcF90ZXN0IGxhYmVsCi1ydW5fZHVtcF90ZXN0IGVxdQotcnVuX2R1bXBfdGVzdCBjb25zdGFudHMKLXJ1bl9kdW1wX3Rlc3QgaW1tY29uc3QKLXJ1bl9kdW1wX3Rlc3QgZmxvYXQKLXJ1bl9kdW1wX3Rlc3QgY2hhcgotcnVuX2R1bXBfdGVzdCBleHByCi1ydW5fZHVtcF90ZXN0IGNvbW1vbgotcnVuX2R1bXBfdGVzdCBjb21tZW50Ci1nYXNfdGVzdCAiZW1wdHkucyIgIi1NIiAiIiAiTVJJIGVtcHR5IG1hY3JvIgotcnVuX2R1bXBfdGVzdCBmb3IKLXJ1bl9kdW1wX3Rlc3QgaWYKLXJ1bl9kdW1wX3Rlc3QgcmVwZWF0Ci1ydW5fZHVtcF90ZXN0IHdoaWxlCi1ydW5fZHVtcF90ZXN0IHNlbWkKLXJ1bl9kdW1wX3Rlc3QgbW92ZW1sCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvcmVwZWF0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzVmNjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIHJlcGVhdAotI2FzOiAtTQotCi0jIFRlc3QgTVJJIHN0cnVjdHVyZWQgcmVwZWF0IHBzZXVkby1vcC4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gYmNjcyAwKzAwMCA8Zm9vPgotMCswMDIgPGZvb1wrKDB4fCkyPiBjbHJ3ICVkMQotMCswMDQgPGZvb1wrKDB4fCk0PiBhZGRxdyAjMSwlZDEKLTArMDA2IDxmb29cKygweHwpNj4gY21waXcgIzEwLCVkMQotMCswMGEgPGZvb1wrKDB4fClhPiBiZ3RzIDArMDA0IDxmb29cKygweHwpND4KLTArMDBjIDxmb29cKygweHwpYz4gbm9wCi0wKzAwZSA8Zm9vXCsoMHh8KWU+IG5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3JlcGVhdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTRlYTJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9yZXBlYXQucworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTsgVGVzdCBNUkkgc3RydWN0dXJlZCByZXBlYXQgcHNldWRvLW9wLgotCi0JeGRlZglmb28KLWZvbwotCXJlcGVhdAotCXVudGlsCTxjcz4KLQotCWNsciBkMQotCXJlcGVhdAotCSAgYWRkICMxLGQxCi0JdW50aWwgZDEgPGdlPiAjMTAKLQotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWNjZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvbXJpL3NlbWkuZAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI29iamR1bXA6IC1zIC1qIC50ZXh0Ci0jbmFtZTogTVJJIHNlbWkKLSNhczogLU0KLQotLio6IC4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gLnRleHQ6Ci0gMDAwMCAzYjIwM2IyMCAzYTIwM2EyMCAwMDAwMDAwMCAwMDAwMDAwMCAgOyA7IDogOiAuLi4uLi4uLgotIDAwMTAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgIC4uLi4uLi4uLi4uLi4uLi4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvc2VtaS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjMwNjc3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS9zZW1pLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1zZW1pY29sb24gIG1hY3JvCi0JZGMuYiAgICAnOyAnCi0JZW5kbQotCi1jb2xvbgkgICAgbWFjcm8KLQlkYy5iICAgICc6ICcKLQllbmRtCi0KLQlzZW1pY29sb24KLQlkYy5iCSc7ICcKLQljb2xvbgotCWRjLmIJJzogJwotCi0JcDJhbGlnbgk1CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRkMzdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotI29iamR1bXA6IC1kIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IE1SSSBzdHJ1Y3R1cmVkIHdoaWxlCi0jYXM6IC1NCi0KLSMgVGVzdCBNUkkgc3RydWN0dXJlIHdoaWxlIHBzZXVkby1vcC4KLQotLio6ICAgICBmaWxlIGZvcm1hdCAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAgPGZvbz4gYmNjcyAwKzAwNCA8Zm9vXCsoMHh8KTQ+Ci0wKzAwMiA8Zm9vXCsoMHh8KTI+IGJyYXMgMCswMDAgPGZvbz4KLTArMDA0IDxmb29cKygweHwpND4gY2xydyAlZDEKLTArMDA2IDxmb29cKygweHwpNj4gY21waXcgIzEwLCVkMQotMCswMGEgPGZvb1wrKDB4fClhPiBibHRzIDArMDEwIDxmb29cKygweHwpMTA+Ci0wKzAwYyA8Zm9vXCsoMHh8KWM+IGFkZHF3ICMxLCVkMQotMCswMGUgPGZvb1wrKDB4fCllPiBicmFzIDArMDA2IDxmb29cKygweHwpNj4KLTArMDEwIDxmb29cKygweHwpMTA+IG5vcAotMCswMTIgPGZvb1wrKDB4fCkxMj4gbm9wCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9tcmkvd2hpbGUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNiZGJiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL21yaS93aGlsZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotOyBUZXN0IE1SSSBzdHJ1Y3R1cmVkIHdoaWxlIHBzZXVkby1vcC4KLQotCXhkZWYJZm9vCi1mb28KLQl3aGlsZSA8Y3M+IGRvCi0JZW5kdwotCi0JY2xyIGQxCi0Jd2hpbGUgZDEgPGxlPiAjMTAgZG8KLQkgIGFkZCAjMSxkMQotCWVuZHcKLQotCW5vcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFhYjU1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QuZAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSNvYmpkdW1wOiAtRHIKLSNuYW1lOiBQb3dlclBDIHRlc3QgMQotCi0uKjogK2ZpbGUgZm9ybWF0IGVsZjMyLXBvd2VycGMKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiBcLnRleHQ6Ci0KLTArMDAwMDAwMCA8Zm9vPjoKLSAgIDA6CTYwIDAwIDAwIDAwIAlub3AKLSAgIDQ6CTYwIDAwIDAwIDAwIAlub3AKLSAgIDg6CTYwIDAwIDAwIDAwIAlub3AKLQotMCswMDAwMDBjIDxhPjoKLSAgIGM6CTQ4IDAwIDAwIDA0IAliCTEwIDxhcGZvdXI+Ci0KLTArMDAwMDAxMCA8YXBmb3VyPjoKLSAgMTA6CTQ4IDAwIDAwIDA4IAliCTE4IDxhcGZvdXJcKzB4OD4KLSAgMTQ6CTQ4IDAwIDAwIDAwIAliCTE0IDxhcGZvdXJcKzB4ND4KLQkJCTE0OiBSX1BQQ19SRUwyNAl4Ci0gIDE4Ogk0OCAwMCAwMCAwNCAJYgkxYyA8YXBmb3VyXCsweGM+Ci0JCQkxODogUl9QUENfUkVMMjQJXC5kYXRhXCsweDQKLSAgMWM6CTQ4IDAwIDAwIDAwIAliCTFjIDxhcGZvdXJcKzB4Yz4KLQkJCTFjOiBSX1BQQ19SRUwyNAl6Ci0gIDIwOgk0OCAwMCAwMCAxNCAJYgkzNCA8YXBmb3VyXCsweDI0PgotCQkJMjA6IFJfUFBDX1JFTDI0CXpcKzB4MTQKLSAgMjQ6CTQ4IDAwIDAwIDA0IAliCTI4IDxhcGZvdXJcKzB4MTg+Ci0gIDI4Ogk0OCAwMCAwMCAwMCAJYgkyOCA8YXBmb3VyXCsweDE4PgotCQkJMjg6IFJfUFBDX1JFTDI0CWEKLSAgMmM6CTRiIGZmIGZmIGU0IAliCTEwIDxhcGZvdXI+Ci0gIDMwOgk0OCAwMCAwMCAwNCAJYgkzNCA8YXBmb3VyXCsweDI0PgotCQkJMzA6IFJfUFBDX1JFTDI0CWFcKzB4NAotICAzNDoJNGIgZmYgZmYgZTAgCWIJMTQgPGFwZm91clwrMHg0PgotICAzODoJNDggMDAgMDAgMDAgCWIJMzggPGFwZm91clwrMHgyOD4KLQkJCTM4OiBSX1BQQ19MT0NBTDI0UEMJYQotICAzYzoJNGIgZmYgZmYgZDQgCWIJMTAgPGFwZm91cj4KLQotICA0MDoJMDAgMDAgMDAgNDAgCVwubG9uZyAweDQwCi0JCQk0MDogUl9QUENfQUREUjMyCVwudGV4dFwrMHg0MAotCi0gIDQ0OgkwMCAwMCAwMCA0YyAJXC5sb25nIDB4NGMKLQkJCTQ0OiBSX1BQQ19BRERSMzIJXC50ZXh0XCsweDRjCi0gIDQ4OgkwMCAwMCAwMCAwMCAJXC5sb25nIDB4MAotCQkJNDg6IFJfUFBDX1JFTDMyCXgKLSAgNGM6CTAwIDAwIDAwIDA0IAlcLmxvbmcgMHg0Ci0JCQk0YzogUl9QUENfUkVMMzIJeFwrMHg0Ci0JXC5cLlwuCi0JCQk1MDogUl9QUENfUkVMMzIJegotCQkJNTQ6IFJfUFBDX1JFTDMyCXkKLQkJCTU4OiBSX1BQQ19BRERSMzIJeAotCQkJNWM6IFJfUFBDX0FERFIzMgl5Ci0JCQk2MDogUl9QUENfQUREUjMyCXoKLSAgNjQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2NDogUl9QUENfQUREUjMyCXhcKzB4ZitmZmZmZmZjCi0gIDY4OglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNjg6IFJfUFBDX0FERFIzMgl5XCsweGYrZmZmZmZmYwotICA2YzoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTZjOiBSX1BQQ19BRERSMzIJelwrMHhmK2ZmZmZmZmMKLSAgNzA6CWZmIGZmIGZmIDljIAlcLmxvbmcgMHhmZmZmZmY5YwotICA3NDoJZmYgZmYgZmYgOWMgCVwubG9uZyAweGZmZmZmZjljCi0JXC5cLlwuCi0JCQk3ODogUl9QUENfQUREUjMyCWEKLQkJCTdjOiBSX1BQQ19BRERSMzIJYgotCQkJODA6IFJfUFBDX0FERFIzMglhcGZvdXIKLSAgODQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0gIDg4OgkwMCAwMCAwMCAwMiAJXC5sb25nIDB4MgotCQkJODg6IFJfUFBDX0FERFIzMglhcGZvdXJcKzB4MgotICA4YzoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gXC5kYXRhOgotCi0wKzAwMDAwMDAgPHg+OgotICAgMDoJMDAgMDAgMDAgMDAgCVwubG9uZyAweDAKLQotMCswMDAwMDA0IDx5PjoKLSAgIDQ6CTAwIDAwIDAwIDAwIAlcLmxvbmcgMHgwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYWYyMTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotCS5zZWN0aW9uICIuZGF0YSIKLQkuZ2xvYmwgeAotCS5nbG9ibCB6Ci14OgkubG9uZyAwCi16CT0gLiArIDQKLWZvdXIJPSB6IC0geCAtIDQKLXk6CS5sb25nIDAKLQkKLQkuc2VjdGlvbiAiLnRleHQiCi1mb286CQotCW5vcCA7IG5vcCA7IG5vcAotCS5nbG9ibCBhCi1hOgliIC4rNAotYjoJYiAuKzgKLQliIHgKLQliIHkKLQliIHoKLQliIHorMjAKLQliIC4rZm91cgotCWIgYQotCWIgYgotCWIgYSs0Ci0JYiBiKzQKLQliIGFAbG9jYWwKLQliIGJAbG9jYWwKLQkubG9uZyAuCi0JLmxvbmcgLis4Ci0JLmxvbmcgeC0uCi0JLmxvbmcgeCs0LS4KLQkubG9uZyB6LS4KLQkubG9uZyB5LS4KLQkubG9uZyB4Ci0JLmxvbmcgeQotCS5sb25nIHoKLQkubG9uZyB4LWZvdXIKLQkubG9uZyB5LWZvdXIKLQkubG9uZyB6LWZvdXIKLQkubG9uZyBhLS4KLQkubG9uZyBiLS4KLQkubG9uZyBhCi0JLmxvbmcgYgotCi1hcGZvdXIJPSBhICsgZm91cgotCS5sb25nIGFwZm91cgotCS5sb25nIGEtYXBmb3VyCi0JLmxvbmcgYXBmb3VyKzIKLQkubG9uZyBhcGZvdXItYgotCi0JLnR5cGUJZm9vLEBmdW5jdGlvbgotCS50eXBlCWEsQGZ1bmN0aW9uCi0JLnR5cGUJYixAZnVuY3Rpb24KLQkudHlwZQlhcGZvdXIsQGZ1bmN0aW9uCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0Mi5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwZTNiZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvYXN0ZXN0Mi5kCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotI29iamR1bXA6IC1EcgotI25hbWU6IFBvd2VyUEMgdGVzdCAyCi0KLS4qOiArZmlsZSBmb3JtYXQgZWxmMzItcG93ZXJwYwotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKzAwMDAwMDAgPGZvbz46Ci0gICAwOgk2MCAwMCAwMCAwMCAJbm9wCi0gICA0Ogk2MCAwMCAwMCAwMCAJbm9wCi0gICA4Ogk2MCAwMCAwMCAwMCAJbm9wCi0gICBjOgk0OCAwMCAwMCAwNCAJYgkxMCA8Zm9vXCsweDEwPgotICAxMDoJNDggMDAgMDAgMDggCWIJMTggPGZvb1wrMHgxOD4KLSAgMTQ6CTQ4IDAwIDAwIDAwIAliCTE0IDxmb29cKzB4MTQ+Ci0JCQkxNDogUl9QUENfUkVMMjQJeAotICAxODoJNDggMDAgMDAgMDQgCWIJMWMgPGZvb1wrMHgxYz4KLQkJCTE4OiBSX1BQQ19SRUwyNAkuZGF0YVwrMHg0Ci0gIDFjOgk0OCAwMCAwMCAwMCAJYgkxYyA8Zm9vXCsweDFjPgotCQkJMWM6IFJfUFBDX1JFTDI0CXoKLSAgMjA6CTQ4IDAwIDAwIDE0IAliCTM0IDxmb29cKzB4MzQ+Ci0JCQkyMDogUl9QUENfUkVMMjQJelwrMHgxNAotICAyNDoJNDggMDAgMDAgMDQgCWIJMjggPGZvb1wrMHgyOD4KLSAgMjg6CTQ4IDAwIDAwIDAwIAliCTI4IDxmb29cKzB4Mjg+Ci0JCQkyODogUl9QUENfUkVMMjQJYQotICAyYzoJNDggMDAgMDAgNTAgCWIJN2MgPGFwZm91cj4KLSAgMzA6CTQ4IDAwIDAwIDA0IAliCTM0IDxmb29cKzB4MzQ+Ci0JCQkzMDogUl9QUENfUkVMMjQJYVwrMHg0Ci0gIDM0Ogk0OCAwMCAwMCA0YyAJYgk4MCA8YXBmb3VyXCsweDQ+Ci0gIDM4Ogk0OCAwMCAwMCAwMCAJYgkzOCA8Zm9vXCsweDM4PgotCQkJMzg6IFJfUFBDX0xPQ0FMMjRQQwlhCi0gIDNjOgk0OCAwMCAwMCA0MCAJYgk3YyA8YXBmb3VyPgotCi0gIDQwOgkwMCAwMCAwMCA0MCAJLmxvbmcgMHg0MAotCQkJNDA6IFJfUFBDX0FERFIzMgkudGV4dFwrMHg0MAotCi0gIDQ0OgkwMCAwMCAwMCA0YyAJLmxvbmcgMHg0YwotCQkJNDQ6IFJfUFBDX0FERFIzMgkudGV4dFwrMHg0YwotICA0ODoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotCQkJNDg6IFJfUFBDX1JFTDMyCXgKLSAgNGM6CTAwIDAwIDAwIDA0IAkubG9uZyAweDQKLQkJCTRjOiBSX1BQQ19SRUwzMgl4XCsweDQKLQkuLi4KLQkJCTUwOiBSX1BQQ19SRUwzMgl6Ci0JCQk1NDogUl9QUENfUkVMMzIJeQotCQkJNTg6IFJfUFBDX0FERFIzMgl4Ci0JCQk1YzogUl9QUENfQUREUjMyCXkKLQkJCTYwOiBSX1BQQ19BRERSMzIJegotICA2NDoJZmYgZmYgZmYgZmMgCWZubXN1YglmMzEsZjMxLGYzMSxmMzEKLQkJCTY0OiBSX1BQQ19BRERSMzIJeFwrMHhmK2ZmZmZmZmMKLSAgNjg6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0JCQk2ODogUl9QUENfQUREUjMyCXlcKzB4ZitmZmZmZmZjCi0gIDZjOglmZiBmZiBmZiBmYyAJZm5tc3ViCWYzMSxmMzEsZjMxLGYzMQotCQkJNmM6IFJfUFBDX0FERFIzMgl6XCsweGYrZmZmZmZmYwotICA3MDoJMDAgMDAgMDAgMDggCS5sb25nIDB4OAotICA3NDoJMDAgMDAgMDAgMDggCS5sb25nIDB4OAotCi0wKzAwMDAwNzggPGE+OgotICA3ODoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotCQkJNzg6IFJfUFBDX0FERFIzMglhCi0KLTArMDAwMDA3YyA8YXBmb3VyPjoKLQkuLi4KLQkJCTdjOiBSX1BQQ19BRERSMzIJYgotCQkJODA6IFJfUFBDX0FERFIzMglhcGZvdXIKLSAgODQ6CWZmIGZmIGZmIGZjIAlmbm1zdWIJZjMxLGYzMSxmMzEsZjMxCi0gIDg4OgkwMCAwMCAwMCAwMiAJLmxvbmcgMHgyCi0JCQk4ODogUl9QUENfQUREUjMyCWFwZm91clwrMHgyCi0gIDhjOgkwMCAwMCAwMCAwMCAJLmxvbmcgMHgwCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC5kYXRhOgotCi0wKzAwMDAwMDAgPHg+OgotICAgMDoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MAotCi0wKzAwMDAwMDQgPHk+OgotICAgNDoJMDAgMDAgMDAgMDAgCS5sb25nIDB4MApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3BwYy9hc3Rlc3QyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZjIyMzMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL2FzdGVzdDIucworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLWZvdXIJPSA0Ci0JLnNlY3Rpb24gIi50ZXh0IgotZm9vOgkKLQlub3AgOyBub3AgOyBub3AKLQkuZ2xvYmwgYQotCWIgLis0Ci0JYiAuKzgKLQliIHgKLQliIHkKLQliIHoKLQliIHorMjAKLQliIC4rZm91cgotCWIgYQotCWIgYgotCWIgYSs0Ci0JYiBiKzQKLQliIGFAbG9jYWwKLQliIGJAbG9jYWwKLQkubG9uZyAuCi0JLmxvbmcgLis4Ci0JLmxvbmcgeC0uCi0JLmxvbmcgeCs0LS4KLQkubG9uZyB6LS4KLQkubG9uZyB5LS4KLQkubG9uZyB4Ci0JLmxvbmcgeQotCS5sb25nIHoKLQkubG9uZyB4LWZvdXIKLQkubG9uZyB5LWZvdXIKLQkubG9uZyB6LWZvdXIKLQkubG9uZyBhLS4KLQkubG9uZyBiLS4KLWE6CS5sb25nIGEKLWI6CS5sb25nIGIKLQotYXBmb3VyCT0gYSArIGZvdXIKLQkubG9uZyBhcGZvdXIKLQkubG9uZyBhLWFwZm91cgotCS5sb25nIGFwZm91cisyCi0JLmxvbmcgYXBmb3VyLWIKLQotCS5zZWN0aW9uICIuZGF0YSIKLQkuZ2xvYmwgeAotCS5nbG9ibCB6Ci14OgkubG9uZyAwCi16CT0gLiArIDQKLXk6CS5sb25nIDAKLQotCS50eXBlCWZvbyxAZnVuY3Rpb24KLQkudHlwZQlhLEBmdW5jdGlvbgotCS50eXBlCWIsQGZ1bmN0aW9uCi0JLnR5cGUJYXBmb3VyLEBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3BwYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvcHBjLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcyZmJjMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvcHBjLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgU29tZSBQb3dlclBDIHRlc3RzCi0jCi0KLSMgVGhlc2UgdGVzdHMgYXJlIGN1cnJlbnRseSBFTEYgc3BlY2lmaWMsIG9ubHkgYmVjYXVzZSBub2JvZHkgaGFzCi0jIGNvbnZlcnRlZCB0aGVtIHRvIGxvb2sgZm9yIFhDT0ZGIHJlbG9jYXRpb25zLgotCi1pZiB7IFtpc3RhcmdldCBwb3dlcnBjKi0qLSpic2QqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWVsZipdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotZWFiaSpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotc3lzdjQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWxpbnV4Kl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1zb2xhcmlzKl0gXAotICAgICB8fCBbaXN0YXJnZXQgcG93ZXJwYyotKi1ydGVtcypdIH0gdGhlbiB7Ci0gICAgcnVuX2R1bXBfdGVzdCAiYXN0ZXN0IgotICAgIHJ1bl9kdW1wX3Rlc3QgImFzdGVzdDIiCi19Ci0KLWlmIHsgW2lzdGFyZ2V0IHBvd2VycGMqLSotKl0gfSB0aGVuIHsKLSAgIHJ1bl9kdW1wX3Rlc3QgInNpbXBzaGZ0IgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4OTNkNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQuZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSNvYmpkdW1wOiAtcyAtaiAudGV4dAotI2FzOiAtbXBwYzY0Ci0jbmFtZTogUG93ZXJQQyB0ZXN0IDMsIHNpbXBsaWZpZWQgc2hpZnRzCi0KLS4qCi0KLUNvbnRlbnRzIG9mIHNlY3Rpb24gXC50ZXh0OgotIDAwMDAgNzg2NDBmZTAgNzg4M2Y4MGUgNzhhNTQ1ZTQgNzg2NDAwMjAgIHhkLi54Li4ueC5FLnhkLiAKLSAwMDEwIDU0NjQwZmZlIDUwODNmODAwIDU0YTU0MDJlIDU0NjQwNDNlICBUZC4uUC4uLlQuQC5UZC4+Ci0gMDAyMCA3ODY0MDAwNCA3ODY0MDdlNCA3ODY0ZjgwNiA3ODY0ZmZlNiAgeGQuLnhkLi54ZC4ueGQuLgotIDAwMzAgNzg2NGY4NDIgNzg2NGZmZTIgNzg2NDAwMGMgNzg2NDA4MGMgIHhkLkJ4ZC4ueGQuLnhkLi4KLSAwMDQwIDc4NjQwZmFjIDc4NjQwN2VjIDc4NjQwMDAwIDc4NjQwODAwICB4ZC4ueGQuLnhkLi54ZC4uCi0gMDA1MCA3ODY0ZjgwMiA3ODY0MDAwMCA3ODY0ZjgwMiA3ODY0MDgwMCAgeGQuLnhkLi54ZC4ueGQuLgotIDAwNjAgNzg2NTIwMTAgNzg2NDA3ZTQgNzg2NGY4MDYgNzg2NDAwMDAgIHhlIC54ZC4ueGQuLnhkLi4KLSAwMDcwIDc4NjRmODQyIDc4NjQwZmUwIDc4NjQwMDAwIDc4NjQwMDQwICB4ZC5CeGQuLnhkLi54ZC5ACi0gMDA4MCA3ODY0MDdlMCA3ODY0MDdlNCA3ODY0MDdhNCA3ODY0MDAwNCAgeGQuLnhkLi54ZC4ueGQuLgotIDAwOTAgNzg2NDAwMDggNzg2NDAwNDggNzg2NDA3ZTggNzg2NDBmYTggIHhkLi54ZC5IeGQuLnhkLi4KLSAwMGEwIDc4NjRmODBhIDU0NjQwMDAwIDU0NjQwMDNlIDU0NjRmODAwICB4ZC4uVGQuLlRkLj5UZC4uCi0gMDBiMCA1NDY0ZjgzZSA1NDY0Zjg3ZSA1NDY0ZmZmZSA1MDY0MDAwMCAgVGQuPlRkLn5UZC4uUGQuLgotIDAwYzAgNTA2NDAwM2UgNTA2NDBmZmUgNTA2NGY4MDAgNTA2NDAwM2UgIFBkLj5QZC4uUGQuLlBkLj4KLSAwMGQwIDUwNjQwN2ZlIDU0NjQwMDNlIDU0NjQwODNlIDU0NjRmODNlICBQZC4uVGQuPlRkLj5UZC4+Ci0gMDBlMCA1NDY0MDAzZSA1NDY0ZjgzZSA1NDY0MDgzZSA1YzY1MjAzZSAgVGQuPlRkLj5UZC4+XFxlID4KLSAwMGYwIDU0NjQwMDNlIDU0NjQwODNjIDU0NjRmODAwIDU0NjQwMDNlICBUZC4+VGQuPFRkLi5UZC4+Ci0gMDEwMCA1NDY0Zjg3ZSA1NDY0MGZmZSA1NDY0MDAzZSA1NDY0MDA3ZSAgVGQuflRkLi5UZC4+VGQufgotIDAxMTAgNTQ2NDA3ZmUgNTQ2NDAwM2UgNTQ2NDAwM2MgNTQ2NDAwMDAgIFRkLi5UZC4+VGQuPFRkLi4KLSAwMTIwIDU0NjQwMDNlIDU0NjQwMDdlIDU0NjQwN2ZlIDU0NjQwZmJjICBUZC4+VGQuflRkLi5UZC4uCi0gMDEzMCA1NDY0ZjgwMCAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgVGQuLi4uLi4gICAgICAgIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvcHBjL3NpbXBzaGZ0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlmZjk4ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9wcGMvc2ltcHNoZnQucworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0jIFRoZXNlIGFyZSBhbGwgdGhlIGV4YW1wbGVzIGZyb20gc2VjdGlvbiBGLjQgb2YKLSMgIlBvd2VyUEMgTWljcm9wcm9jZXNzb3IgRmFtaWx5OiBUaGUgUHJvZ3JhbW1pbmcgRW52aXJvbm1lbnRzIi4KLSMgNjQtYml0IGV4YW1wbGVzCi0JZXh0cmRpCSVyNCwlcjMsMSwwCi0JaW5zcmRpCSVyMywlcjQsMSwwCi0Jc2xkaQklcjUsJXI1LDgKLQljbHJsZGkJJXI0LCVyMywzMgotIyAzMi1iaXQgZXhhbXBsZXMKLQlleHRyd2kJJXI0LCVyMywxLDAKLQlpbnNyd2kJJXIzLCVyNCwxLDAKLQlzbHdpCSVyNSwlcjUsOAotCWNscmx3aQklcjQsJXIzLDE2Ci0KLQotIyBUaGVzZSB0ZXN0IHRoZSByZW1haW5pbmcgY29ybmVyIGNhc2VzIGZvciA2NC1iaXQgb3BlcmF0aW9ucy4KLQlleHRsZGkJJXI0LCVyMywxLDAKLQlleHRsZGkJJXI0LCVyMyw2NCwwCi0JZXh0bGRpCSVyNCwlcjMsMSw2MwotCWV4dGxkaQklcjQsJXIzLDY0LDYzICAgICMgYml0IHdlaXJkLCB0aGF0IG9uZS4KLQkKLQlleHRyZGkJJXI0LCVyMyw2MywwCi0JZXh0cmRpCSVyNCwlcjMsMSw2MgotCi0JaW5zcmRpCSVyNCwlcjMsNjQsMAotCWluc3JkaQklcjQsJXIzLDYzLDAKLQlpbnNyZGkJJXI0LCVyMywxLDYyCi0JaW5zcmRpCSVyNCwlcjMsMSw2MwotCi0Jcm90bGRpCSVyNCwlcjMsMAotCXJvdGxkaQklcjQsJXIzLDEKLQlyb3RsZGkJJXI0LCVyMyw2MwotCi0Jcm90cmRpCSVyNCwlcjMsMAotCXJvdHJkaQklcjQsJXIzLDEKLQlyb3RyZGkJJXI0LCVyMyw2MwotCi0Jcm90bGQJJXI1LCVyMywlcjQKLQotCXNsZGkJJXI0LCVyMywwCi0Jc2xkaQklcjQsJXIzLDYzCi0KLQlzcmRpCSVyNCwlcjMsMAotCXNyZGkJJXI0LCVyMywxCi0Jc3JkaQklcjQsJXIzLDYzCi0KLQljbHJsZGkJJXI0LCVyMywwCi0JY2xybGRpCSVyNCwlcjMsMQotCWNscmxkaQklcjQsJXIzLDYzCi0KLQljbHJyZGkJJXI0LCVyMywwCi0JY2xycmRpCSVyNCwlcjMsMQotCWNscnJkaQklcjQsJXIzLDYzCi0JCi0JY2xybHNsZGkJJXI0LCVyMywwLDAKLQljbHJsc2xkaQklcjQsJXIzLDEsMAotCWNscmxzbGRpCSVyNCwlcjMsNjMsMAotCWNscmxzbGRpCSVyNCwlcjMsNjMsMQotCWNscmxzbGRpCSVyNCwlcjMsNjMsNjMKLQkKLSMgVGhlc2UgdGVzdCB0aGUgcmVtYWluaW5nIGNvcm5lciBjYXNlcyBmb3IgMzItYml0IG9wZXJhdGlvbnMuCi0JZXh0bHdpCSVyNCwlcjMsMSwwCi0JZXh0bHdpCSVyNCwlcjMsMzIsMAotCWV4dGx3aQklcjQsJXIzLDEsMzEKLQlleHRsd2kJJXI0LCVyMywzMiwzMSAgICAjIGJpdCB3ZWlyZCwgdGhhdCBvbmUuCi0JCi0JZXh0cndpCSVyNCwlcjMsMzEsMAotCWV4dHJ3aQklcjQsJXIzLDEsMzAKLQkKLQlpbnNsd2kJJXI0LCVyMywxLDAKLQlpbnNsd2kJJXI0LCVyMywzMiwwCi0JaW5zbHdpCSVyNCwlcjMsMSwzMQotCQotCWluc3J3aQklcjQsJXIzLDEsMAotCWluc3J3aQklcjQsJXIzLDMyLDAKLQlpbnNyd2kJJXI0LCVyMywxLDMxCi0JCi0Jcm90bHdpCSVyNCwlcjMsMAotCXJvdGx3aQklcjQsJXIzLDEKLQlyb3Rsd2kJJXI0LCVyMywzMQotCi0Jcm90cndpCSVyNCwlcjMsMAotCXJvdHJ3aQklcjQsJXIzLDEKLQlyb3Ryd2kJJXI0LCVyMywzMQotCi0Jcm90bHcJJXI1LCVyMywlcjQKLQotCXNsd2kJJXI0LCVyMywwCi0Jc2x3aQklcjQsJXIzLDEKLQlzbHdpCSVyNCwlcjMsMzEKLQotCXNyd2kJJXI0LCVyMywwCi0Jc3J3aQklcjQsJXIzLDEKLQlzcndpCSVyNCwlcjMsMzEKLQotCWNscmx3aQklcjQsJXIzLDAKLQljbHJsd2kJJXI0LCVyMywxCi0JY2xybHdpCSVyNCwlcjMsMzEKLQotCWNscnJ3aQklcjQsJXIzLDAKLQljbHJyd2kJJXI0LCVyMywxCi0JY2xycndpCSVyNCwlcjMsMzEKLQkKLQljbHJsc2x3aQklcjQsJXIzLDAsMAotCWNscmxzbHdpCSVyNCwlcjMsMSwwCi0JY2xybHNsd2kJJXI0LCVyMywzMSwwCi0JY2xybHNsd2kJJXI0LCVyMywzMSwxCi0JY2xybHNsd2kJJXI0LCVyMywzMSwzMQotCi0jIEZvcmNlIGFsaWdubWVudCBzbyB0aGF0IHdlIHBhc3MgdGhlIHRlc3Qgb24gQUlYCi0JLnAyYWxpZ24JMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvYmFzaWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGRiYjBiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NoL2Jhc2ljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBEZWphR251QGN5Z251cy5jb20KLQotIyBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LgotCi1wcm9jIGRvX2ZwIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImZwLnM6IGZsb2F0aW5nIHBvaW50IHRlc3RzIChzaDNlKSIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImZwLnMiICItYWwiCi0KLSAgICAjIENoZWNrIHRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24gYWdhaW5zdCBhIHRhYmxlIGJ1aWx0IGJ5IHRoZSBIUCBhc3NlbWJsZXIKLSAgICAjIEFueSBkaWZmZXJlbmNlcyBzaG91bGQgYmUgY2hlY2tlZCBieSBoYW5kIC0tIHdpdGggdGhlIG51bWJlciBvZiBwcm9ibGVtcwotICAgICMgSSd2ZSBzZWVuIGluIHRoZSBIUCBhc3NlbWJsZXIgSSBkb24ndCBjb21wbGV0ZWx5IHRydXN0IGl0LgotICAgICMKLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgRjAwOFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgRjAwQVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRjAwOVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDYgRjAwQlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggRjAwNlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGEgRjAwN1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRjEwQ1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgRjA4RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgRjA5RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRjEwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTQgRjEwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgRjEwMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRjEwM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgRjEwRVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgRjEwNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRjEwNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgRjA0RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgRjA1RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRjA2RFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjYgRjAyRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjggRjAzRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmEgRjAwRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmMgRjAxRFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgNDM1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgNDM1NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgNDM2QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzQgNDM2NlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzYgMDM1QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzggNDM1MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2EgMDM2QVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgNDM2MlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MzFdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLQotaWYgW2lzdGFyZ2V0IHNoKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgotICAgIGRvX2ZwCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9mcC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc2gvZnAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUyZDg2NC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zaC9mcC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCS5maWxlCSJ0ZXN0LmMiCi0JLmRhdGEKLQotISBIaXRhY2hpIFNIIGNjMSAoY3lnbnVzLTIuNy4xLTk1MDcyOCkgYXJndW1lbnRzOiAtTyAtZnBlZXBob2xlCi0hIC1mZnVuY3Rpb24tY3NlIC1mcmVnLXN0cnVjdC1yZXR1cm4gLWZkZWxheWVkLWJyYW5jaCAtZmNvbW1vbiAtZmdudS1saW5rZXIKLQotZ2NjMl9jb21waWxlZC46Ci1fX19nbnVfY29tcGlsZWRfYzoKLQkudGV4dAotCS5hbGlnbiAyCi0JLmdsb2JhbAlfZm9vCi1fZm9vOgotCWZtb3YucwlAcjAsZnIwCi0JZm1vdi5zCWZyMCxAcjAKLQlmbW92LnMJQHIwKyxmcjAKLQlmbW92LnMJZnIwLEAtcjAKLQlmbW92LnMJQChyMCxyMCksZnIwCi0JZm1vdi5zCWZyMCxAKHIwLHIwKQotCWZtb3YJZnIwLGZyMQotCWZsZGkwCWZyMAotCWZsZGkxCWZyMAotCWZhZGQJZnIwLGZyMQotCWZzdWIJZnIwLGZyMQotCWZtdWwJZnIwLGZyMQotCWZkaXYJZnIwLGZyMQotCWZtYWMJZnIwLGZyMCxmcjEKLQlmY21wL2VxCWZyMCxmcjEKLQlmY21wL2d0CWZyMCxmcjEKLQlmbmVnCWZyMAotCWZhYnMJZnIwCi0JZnNxcnQJZnIwCi0JZmxvYXQJZnB1bCxmcjAKLQlmdHJjCWZyMCxmcHVsCi0JZnN0cwlmcHVsLGZyMAotCWZsZHMJZnIwLGZwdWwKLQlsZHMJcjMsZnB1bAotCWxkcy5sCUByMyssZnB1bAotCWxkcwlyMyxmcHNjcgotCWxkcy5sCUByMyssZnBzY3IKLQlzdHMJZnB1bCxyMwotCXN0cy5sCWZwdWwsQC1yMwotCXN0cwlmcHNjcixyMwotCXN0cy5sCWZwc2NyLEAtcjMKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzgzOGM3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMKLSMgU29sYXJpcyBvbiBTUEFSQyB0ZXN0cwotIwotCi1pZiBbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXSB0aGVuIHsKLSAgICBzZXQgeDEgMAotICAgIHNldCB4MiAwCi0gICAgc2V0IHgzIDAKLSAgICBzZXQgeDQgMAotICAgIHNldCB4NSAwCi0gICAgc2V0IHg2IDAKLSAgICBzZXQgdGVzdG5hbWUgImFkZGVuZHMgKHBhcnQgMikiCi0gICAgaWYgW2dhc190ZXN0X29sZCAiYWRkZW5kLnMiICIiICJhZGRlbmRzIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0Jd2hpbGUgMSB7Ci0JICAgICMgVGhlc2UgYXJlIHdoYXQgd2UgZ2V0IHVzaW5nIHRoZSBTb2xhcmlzIGFzc2VtYmxlci4KLQkgICAgZXhwZWN0IHsKLQkJLXJlICIwOCBSX1NQQVJDX1dESVNQMjIgK2ZvbzFcWytcXSsweDArMDRcW15cblxdKlxuIgl7IGluY3IgeDEgfQotCQktcmUgIjBjIFJfU1BBUkNfV0RJU1AyMiArZm9vMVxbK1xdKzB4MCswNFxbXlxuXF0qXG4iCXsgaW5jciB4MiB9Ci0JCS1yZSAiMTAgUl9TUEFSQ19XRElTUDIyICtmb28xXFteXG5cXSpcbiIJCXsgaW5jciB4MyB9Ci0JCS1yZSAiMTQgUl9TUEFSQ19XRElTUDIyICtmb28xXFteXG5cXSpcbiIJCXsgaW5jciB4NCB9Ci0JCS1yZSAiMWMgUl9TUEFSQ18zMiArZm9vMVxbXlxuXF0qXG4iCQkJeyBpbmNyIHg1IH0KLQkJLXJlICIyMCBSX1NQQVJDXzMyICtmb28xXFsrXF0rMHgwKzA0XFteXG5cXSpcbiIJCXsgaW5jciB4NiB9Ci0JCS1yZSAiXFteXG5cXSpcbiIJCQkJCXsgfQotCQl0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JCWVvZgkJCQl7IGJyZWFrIH0KLQkgICAgfQotCX0KLQlvYmpkdW1wX2ZpbmlzaAotCWlmIFthbGxfb25lcyAkeDEgJHgyICR4MyAkeDQgJHg1ICR4Nl0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgZmFpbCAkdGVzdG5hbWUKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvYWRkZW5kLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWIxMDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9hZGRlbmQucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLQkuZ2xvYmFsIGZvbwotZm9vOgotCW5vcAotCW5vcAotCWJhIGZvbzErMHg0Ci0JYmEgZm9vMSsweDQKLQliYSBmb28xCi0JYmEgZm9vMQotCW5vcAotCS53b3JkIGZvbzEKLQkud29yZCBmb28xKzQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvZ2FzLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvZ2FzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhZjY5MS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL2dhcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jCi0jIFNvbGFyaXMtMiBvbiBTUEFSQyB0ZXN0cwotIwotIyBUaGUgdHdvIGNvbXBpbGVycywgY2MgYW5kIGdjYywgZ2VuZXJhdGUgcXVpdGUgZGlmZmVyZW50IGRlYnVnZ2luZwotIyByZWNvcmRzLiAgVmVyaWZ5IHRoYXQgd2UgY2FuIGFjY2VwdCBib3RoLgotIwotaWYgW2lzdGFyZ2V0IHNwYXJjLSotc29sYXJpczIqXSB0aGVuIHsKLSAgICBnYXNfdGVzdCAic29sLWNjLnMiICAiIiAkc3Rkb3B0bGlzdCAiU1BBUkMgU29sYXJpcyBjYyAtZyIKLSAgICBnYXNfdGVzdCAic29sLWdjYy5zIiAiIiAkc3Rkb3B0bGlzdCAiU1BBUkMgU29sYXJpcyBnY2MgLWciCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1jYy5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMtc29sYXJpcy9zb2wtY2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyNTBkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1jYy5zCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotCS5zZWN0aW9uICIudGV4dCIJCQkhIFtpbnRlcm5hbF0KLQkucHJvYwk0Ci0JLmdsb2JhbAltYWluCi0JLmFsaWduCTQKLQkuZ2xvYmFsCW1haW4KLW1haW46Ci0hI1BST0xPR1VFIyAwCi0hI1BST0xPR1VFIyAxCi0Jc2F2ZQklc3AsLTk2LCVzcAotCXNldGhpCSVoaSguTDE4KSwlbzAKLQlzZXRoaQklaGkobXNnKSwlbzEKLQlvcgklbzEsJWxvKG1zZyksJW8xCSEgW2ludGVybmFsXQotCWNhbGwJcHJpbnRmLDIKLQlvcgklbzAsJWxvKC5MMTgpLCVvMAkhIFtpbnRlcm5hbF0KLQlyZXQKLQlyZXN0b3JlCSVnMCwwLCVvMAotCS50eXBlCW1haW4sI2Z1bmN0aW9uCi0JLnNpemUJbWFpbiwoLi1tYWluKQotCS5zZWN0aW9uICIuZGF0YSIJCQkhIFtpbnRlcm5hbF0KLQkuYWxpZ24JNAotRGRhdGEuZGF0YToKLQkuc2VjdGlvbiAiLmJzcyIJCQkhIFtpbnRlcm5hbF0KLUJic3MuYnNzOgotCS5zZWN0aW9uICIucm9kYXRhIgkJISBbaW50ZXJuYWxdCi1Ecm9kYXRhLnJvZGF0YToKLQkuZmlsZQkiaGktc29sLmMiCi0JLmdsb2JhbAltc2cKLQkuZ2xvYmFsCW1zZwotbXNnOgotCS5hc2NpaQkiaGVsbG8sIHdvcmxkIVwwIgotCS50eXBlCW1zZywjb2JqZWN0Ci0JLnNpemUJbXNnLDE0Ci0JLnNlY3Rpb24gIi5kYXRhMSIsICN3cml0ZSwgI2FsbG9jICEgW2ludGVybmFsXQotCS5hbGlnbgk0Ci0uTDE4OgotCS5hc2NpaQkiJXNcblwwIgotCS5pZGVudAkiYWNvbXA6IChDRFMpIFNQQVJDb21waWxlcnMgMi4wLjEgMDMgU2VwIDE5OTIiCi0JLnNlY3Rpb24gInRleHQiCQkJISBbaW50ZXJuYWxdCi0JLnN0YWJzCSIvY3lnaW50L3MxL3VzZXJzL3JhZWJ1cm4vIiwxMDAsMCwwLDAKLQkuc3RhYnMJImhpLXNvbC5jIiwxMDAsMCwzLDAKLQkuc3RhYnMJIiIsNTYsMCwwLDAKLQkuc3RhYnMJIiIsNTYsMCwwLDAKLQkuc3RhYnMJIlh0IDsgZyA7IE8gOyBWPTIuMCIsNjAsMCwwLDB4MmJiNzczYmEKLQkuc3RhYnMJImNoYXI6dCgwLDEpPWJzYzE7MDs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaG9ydDp0KDAsMik9YnMyOzA7MTY7IiwxMjgsMCwwLDAKLQkuc3RhYnMJImludDp0KDAsMyk9YnM0OzA7MzI7IiwxMjgsMCwwLDAKLQkuc3RhYnMJImxvbmc6dCgwLDQpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJsb25nIGxvbmc6dCgwLDUpPWJzODswOzY0OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgY2hhcjp0KDAsNik9YnNjMTswOzg7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInNpZ25lZCBzaG9ydDp0KDAsNyk9YnMyOzA7MTY7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInNpZ25lZCBpbnQ6dCgwLDgpPWJzNDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJzaWduZWQgbG9uZzp0KDAsOSk9YnM0OzA7MzI7IiwxMjgsMCwwLDAKLQkuc3RhYnMJInNpZ25lZCBsb25nIGxvbmc6dCgwLDEwKT1iczg7MDs2NDsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgY2hhcjp0KDAsMTEpPWJ1YzE7MDs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJ1bnNpZ25lZCBzaG9ydDp0KDAsMTIpPWJ1MjswOzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJ1bnNpZ25lZCBpbnQ6dCgwLDEzKT1idTQ7MDszMjsiLDEyOCwwLDAsMAotCS5zdGFicwkidW5zaWduZWQgbG9uZzp0KDAsMTQpPWJ1NDswOzMyOyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJ1bnNpZ25lZCBsb25nIGxvbmc6dCgwLDE1KT1idTg7MDs2NDsiLDEyOCwwLDAsMAotCS5zdGFicwkiZmxvYXQ6dCgwLDE2KT1SMTs0OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJkb3VibGU6dCgwLDE3KT1SMjs4OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJsb25nIGRvdWJsZTp0KDAsMTgpPVI2OzE2OyIsMTI4LDAsMCwwCi0JLnN0YWJzCSJ2b2lkOnQoMCwxOSk9YnMwOzA7MCIsMTI4LDAsMCwwCi0JLnN0YWJzCSJtc2c6RygwLDIwKT1hcigwLDMpOzA7MTM7KDAsMSkiLDMyLDAsMTQsMAotCS5zdGFicwkibWFpbjpGKDAsMyk7KDAsMyk7KDAsMjEpPSooMCwyMik9KigwLDEpIiwzNiwwLDAsbWFpbgotCS5zdGFicwkibWFpbiIsNDIsMCwwLDAKLQkuc3RhYm4JMTkyLDAsMSwwCi0JLnN0YWJuCTY4LDAsNCwwCi0JLnN0YWJzCSJhcmdjOnAoMCwzKSIsMTYwLDAsNCw2OAotCS5zdGFicwkiYXJndjpwKDAsMjEpIiwxNjAsMCw0LDcyCi0JLnN0YWJzCSJwcmludGY6UCgwLDMpIiwzNiwwLDAsMAotCS5zdGFibgkyMjQsMCwxLDAKLQkuc3RhYnMJIiIsOTgsMCwwLDAKLQkuc2VjdGlvbiAidGV4dCIJCQkhIFtpbnRlcm5hbF0KLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIi9jeWdpbnQvczEvdXNlcnMvcmFlYnVybi8iLDEwMCwwLDAsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiaGktc29sLmMiLDEwMCwwLDMsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiIiw1NiwwLDAsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiIiw1NiwwLDAsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwiWHQgOyBnIDsgTyA7IFY9Mi4wIiw2MCwwLDAsMHgyYmI3NzNiYQotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwibXNnIiwzMiwwLDAsMAotCS54c3RhYnMJIi5zdGFiLmluZGV4IiwibWFpbiIsNDIsMCwwLDAKLQkueHN0YWJzCSIuc3RhYi5pbmRleCIsIm1haW4iLDM2LDAsMCwwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy1zb2xhcmlzL3NvbC1nY2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWdjYy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTVmZGNkLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjLXNvbGFyaXMvc29sLWdjYy5zCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotCS5maWxlCSJoaS1zb2wuYyIKLS5zdGFicyAiLzFoL2Rldm8vc3JjL2dhcy90ZXN0c3VpdGUvZ2FzLyIsMTAwLDAsMCwuTEx0ZXh0MAotLnN0YWJzICJoaS1zb2wuYyIsMTAwLDAsMCwuTEx0ZXh0MAotLnNlY3Rpb24JIi50ZXh0IgotLkxMdGV4dDA6Ci0JLnN0YWJzCSJnY2MyX2NvbXBpbGVkLiIsIDB4M2MsIDAsIDAsIDAKLS5zdGFicyAiaW50OnQxPXIxOy0yMTQ3NDgzNjQ4OzIxNDc0ODM2NDc7IiwxMjgsMCwwLDAKLS5zdGFicyAiY2hhcjp0Mj1yMjswOzEyNzsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIGludDp0Mz1yMTstMjE0NzQ4MzY0ODsyMTQ3NDgzNjQ3OyIsMTI4LDAsMCwwCi0uc3RhYnMgInVuc2lnbmVkIGludDp0ND1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgImxvbmcgdW5zaWduZWQgaW50OnQ1PXIxOzA7LTE7IiwxMjgsMCwwLDAKLS5zdGFicyAic2hvcnQgaW50OnQ2PXIxOy0zMjc2ODszMjc2NzsiLDEyOCwwLDAsMAotLnN0YWJzICJsb25nIGxvbmcgaW50OnQ3PXIxOzA7LTE7IiwxMjgsMCwwLDAKLS5zdGFicyAic2hvcnQgdW5zaWduZWQgaW50OnQ4PXIxOzA7NjU1MzU7IiwxMjgsMCwwLDAKLS5zdGFicyAibG9uZyBsb25nIHVuc2lnbmVkIGludDp0OT1yMTswOy0xOyIsMTI4LDAsMCwwCi0uc3RhYnMgInNpZ25lZCBjaGFyOnQxMD1yMTstMTI4OzEyNzsiLDEyOCwwLDAsMAotLnN0YWJzICJ1bnNpZ25lZCBjaGFyOnQxMT1yMTswOzI1NTsiLDEyOCwwLDAsMAotLnN0YWJzICJmbG9hdDp0MTI9cjE7NDswOyIsMTI4LDAsMCwwCi0uc3RhYnMgImRvdWJsZTp0MTM9cjE7ODswOyIsMTI4LDAsMCwwCi0uc3RhYnMgImxvbmcgZG91YmxlOnQxND1yMTs4OzA7IiwxMjgsMCwwLDAKLS5zdGFicyAidm9pZDp0MTU9MTUiLDEyOCwwLDAsMAotLnN0YWJzICJtc2c6RzE2PWFyMTswOzEzOzIiLDMyLDAsMCwwCi0JLmdsb2JhbCBtc2cKLS5zZWN0aW9uCSIucm9kYXRhIgotCS5hbGlnbiA4Ci0JLnR5cGUJIG1zZywjb2JqZWN0Ci0JLnNpemUJIG1zZywxNAotbXNnOgotCS5hc2NpegkiaGVsbG8sIHdvcmxkISIKLQkuYWxpZ24gOAotLkxMQzA6Ci0JLmFzY2l6CSIlc1xuIgotLnNlY3Rpb24JIi50ZXh0IgotCS5hbGlnbiA0Ci0uc3RhYnMgIm1haW46RjEiLDM2LDAsMCxtYWluCi0uc3RhYnMgImFyZ2M6UDEiLDY0LDAsMCwyNAotLnN0YWJzICJhcmd2OlAxNz0qMTg9KjIiLDY0LDAsMCwyNQotCS5nbG9iYWwgbWFpbgotCS50eXBlCSBtYWluLCNmdW5jdGlvbgotCS5wcm9jCTA0Ci1tYWluOgotLnN0YWJuIDY4LDAsNCwuTE0xLW1haW4KLS5MTTE6Ci0JISNQUk9MT0dVRSMgMAotCXNhdmUgJXNwLC0xMTIsJXNwCi0JISNQUk9MT0dVRSMgMQotLnN0YWJuIDY4LDAsNSwuTE0yLW1haW4KLS5MTTI6Ci0uTExCQjI6Ci0Jc2V0aGkgJWhpKC5MTEMwKSwlbzAKLQlvciAlbzAsJWxvKC5MTEMwKSwlbzAKLQlzZXRoaSAlaGkobXNnKSwlbzEKLQljYWxsIHByaW50ZiwwCi0Jb3IgJW8xLCVsbyhtc2cpLCVvMQotLnN0YWJuIDY4LDAsNiwuTE0zLW1haW4KLS5MTTM6Ci0uc3RhYm4gNjgsMCw3LC5MTTQtbWFpbgotLkxNNDoKLS5MTEJFMjoKLQlyZXQKLQlyZXN0b3JlICVnMCwwLCVvMAotLkxMZmUxOgotCS5zaXplCSBtYWluLC5MTGZlMS1tYWluCi0uc3RhYm4gMTkyLDAsMCwuTExCQjItbWFpbgotLnN0YWJuIDIyNCwwLDAsLkxMQkUyLW1haW4KLQkuaWRlbnQJIkdDQzogKEdOVSkgY3lnbnVzLTIuMy4zIgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9hc2kuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1ZWExYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9hc2kuZAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSNhczogLUF2OQotI29iamR1bXA6IC1kcgotI25hbWU6IHNwYXJjNjQgYXNpCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgljNCA4MCA0MCAwMCAJbGRhICBcWyAlZzEgXF0gXCgwXCksICVnMgotICAgNDoJYzQgODAgNWYgZTAgCWxkYSAgXFsgJWcxIFxdIFwoMjU1XCksICVnMgotICAgODoJYzQgODAgNDIgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUCwgJWcyCi0gICBjOgljNCA4MCA0MiAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTLCAlZzIKLSAgMTA6CWM0IDgwIDQzIDAwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVBfTCwgJWcyCi0gIDE0OgljNCA4MCA0MyAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVTX0wsICVnMgotICAxODoJYzQgODAgNTAgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUCwgJWcyCi0gIDFjOgljNCA4MCA1MCAyMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TLCAlZzIKLSAgMjA6CWM0IDgwIDUwIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORiwgJWcyCi0gIDI0OgljNCA4MCA1MCA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkYsICVnMgotICAyODoJYzQgODAgNTEgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUF9MLCAlZzIKLSAgMmM6CWM0IDgwIDUxIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NfTCwgJWcyCi0gIDMwOgljNCA4MCA1MSA0MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QTkZfTCwgJWcyCi0gIDM0OgljNCA4MCA1MSA2MCAJbGRhICBcWyAlZzEgXF0gI0FTSV9TTkZfTCwgJWcyCi0gIDM4OgljNCA4MCA0MiAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9BSVVQLCAlZzIKLSAgM2M6CWM0IDgwIDQyIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVMsICVnMgotICA0MDoJYzQgODAgNDMgMDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfQUlVUF9MLCAlZzIKLSAgNDQ6CWM0IDgwIDQzIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX0FJVVNfTCwgJWcyCi0gIDQ4OgljNCA4MCA1MCAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QLCAlZzIKLSAgNGM6CWM0IDgwIDUwIDIwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1MsICVnMgotICA1MDoJYzQgODAgNTAgNDAgCWxkYSAgXFsgJWcxIFxdICNBU0lfUE5GLCAlZzIKLSAgNTQ6CWM0IDgwIDUwIDYwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NORiwgJWcyCi0gIDU4OgljNCA4MCA1MSAwMCAJbGRhICBcWyAlZzEgXF0gI0FTSV9QX0wsICVnMgotICA1YzoJYzQgODAgNTEgMjAgCWxkYSAgXFsgJWcxIFxdICNBU0lfU19MLCAlZzIKLSAgNjA6CWM0IDgwIDUxIDQwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1BORl9MLCAlZzIKLSAgNjQ6CWM0IDgwIDUxIDYwIAlsZGEgIFxbICVnMSBcXSAjQVNJX1NORl9MLCAlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL2FzaS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NmZlOWMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvYXNpLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIFRlc3QgYXNpJ3MuCi0JLnRleHQKLQlsZHV3YSBbJWcxXTAsJWcyCi0JbGR1d2EgWyVnMV0yNTUsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVAsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVMsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX0FJVVBfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQUlVU19MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QTkYsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1NORiwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfUF9MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TX0wsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BORl9MLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TTkZfTCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9QUklNQVJZLCVnMgotCWxkdXdhIFslZzFdI0FTSV9BU19JRl9VU0VSX1NFQ09OREFSWSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9QUklNQVJZX0xJVFRMRSwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfQVNfSUZfVVNFUl9TRUNPTkRBUllfTElUVExFLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TRUNPTkRBUlksJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BSSU1BUllfTk9GQVVMVCwlZzIKLQlsZHV3YSBbJWcxXSNBU0lfU0VDT05EQVJZX05PRkFVTFQsJWcyCi0JbGR1d2EgWyVnMV0jQVNJX1BSSU1BUllfTElUVExFLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TRUNPTkRBUllfTElUVExFLCVnMgotCWxkdXdhIFslZzFdI0FTSV9QUklNQVJZX05PRkFVTFRfTElUVExFLCVnMgotCWxkdXdhIFslZzFdI0FTSV9TRUNPTkRBUllfTk9GQVVMVF9MSVRUTEUsJWcyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9tZW1iYXIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWI2YjJlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5kCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotI2FzOiAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCBtZW1iYXIKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPC50ZXh0PjoKLSAgIDA6CTgxIDQzIGUwIDAwIAltZW1iYXIgIDAKLSAgIDQ6CTgxIDQzIGUwIDdmIAltZW1iYXIgICNTeW5jfCNNZW1Jc3N1ZXwjTG9va2FzaWRlfCNTdG9yZVN0b3JlfCNMb2FkU3RvcmV8I1N0b3JlTG9hZHwjTG9hZExvYWQKLSAgIDg6CTgxIDQzIGUwIDdmIAltZW1iYXIgICNTeW5jfCNNZW1Jc3N1ZXwjTG9va2FzaWRlfCNTdG9yZVN0b3JlfCNMb2FkU3RvcmV8I1N0b3JlTG9hZHwjTG9hZExvYWQKLSAgIGM6CTgxIDQzIGUwIDQwIAltZW1iYXIgICNTeW5jCi0gIDEwOgk4MSA0MyBlMCAyMCAJbWVtYmFyICAjTWVtSXNzdWUKLSAgMTQ6CTgxIDQzIGUwIDEwIAltZW1iYXIgICNMb29rYXNpZGUKLSAgMTg6CTgxIDQzIGUwIDA4IAltZW1iYXIgICNTdG9yZVN0b3JlCi0gIDFjOgk4MSA0MyBlMCAwNCAJbWVtYmFyICAjTG9hZFN0b3JlCi0gIDIwOgk4MSA0MyBlMCAwMiAJbWVtYmFyICAjU3RvcmVMb2FkCi0gIDI0Ogk4MSA0MyBlMCAwMSAJbWVtYmFyICAjTG9hZExvYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21lbWJhci5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MDVlMDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWVtYmFyLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIFRlc3QgbWVtYmFyIGFyZ3MKLQkudGV4dAotCW1lbWJhciAwCi0JbWVtYmFyIDEyNwotCW1lbWJhciAjU3luY3wjTWVtSXNzdWV8I0xvb2thc2lkZXwjU3RvcmVTdG9yZXwjTG9hZFN0b3JlfCNTdG9yZUxvYWR8I0xvYWRMb2FkCi0JbWVtYmFyICNTeW5jCi0JbWVtYmFyICNNZW1Jc3N1ZQotCW1lbWJhciAjTG9va2FzaWRlCi0JbWVtYmFyICNTdG9yZVN0b3JlCi0JbWVtYmFyICNMb2FkU3RvcmUKLQltZW1iYXIgI1N0b3JlTG9hZAotCW1lbWJhciAjTG9hZExvYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc20tMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbS0xLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYzVlNDguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbS0xLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0hIFRlc3QgYXJjaGl0ZWN0dXJlIG1pc21hdGNoIHdhcm5pbmdzLgotISBXZSBkb24ndCB0ZXN0IGV2ZXJ5IHBvc3NpYmxlIG1pc21hdGNoLCB3ZSBqdXN0IHdhbnQgdG8gYmUgcmVhc29uYWJsZSBzdXJlCi0hIHRoZSBtaXNtYXRjaCBjaGVja2luZyBjb2RlIHdvcmtzLgotIQotISB7IGRnLWRvIGFzc2VtYmxlIHsgdGFyZ2V0IHNwYXJjKi0qLSogfSB9Ci0hIHsgZGctb3B0aW9ucyAtQXY2IH0KLQotISBzcGFyY2xpdGUKLQotCWRpdnNjYyAlZzEsJWcyLCVnMwkhIHsgZGctZXJyb3IgIm1pc21hdGNofHNwYXJjbGl0ZSIgInNwYXJjbGl0ZSBkaXZzY2MgbWlzbWF0Y2giIH0KLQotCXNjYW4gJWcxLCVnMiwlZzMJISB7IGRnLWVycm9yICJtaXNtYXRjaHxzcGFyY2xpdGUiICJzcGFyY2xpdGUgc2NhbiBtaXNtYXRjaCIgfQotCi0hIHY5Ci0KLQltb3ZyeiAlZzEsJWcyLCVnMwkhIHsgZGctZXJyb3IgIm1pc21hdGNofHY5IiAidjkgZnAgcmVnIG1pc21hdGNoIiB9Ci0KLSEgdjlhCi0KLQlzaHV0ZG93bgkJISB7IGRnLWVycm9yICJtaXNtYXRjaHx2OWEiICJ2OWEgc2h1dGRvd24gbWlzbWF0Y2giIH0KLQotZm9vOgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbWF0Y2guZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvbWlzbWF0Y2guZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Zjg5ZGUyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL21pc21hdGNoLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgVGVzdCBhcmNoaXRlY3R1cmUgbWlzbWF0Y2ggZXJyb3JzLgotIwotIyBHQVMgaXNzdWVzIHR3byBsaW5lcyBvZiBlcnJvciB0ZXh0IGZvciBlYWNoIG1pc21hdGNoOgotIwotIyBtbS1saXRlLnM6NzogRXJyb3I6IEFyY2hpdGVjdHVyZSBtaXNtYXRjaCBvbiAiZGl2c2NjIi4KLSMgbW0tbGl0ZS5zOjc6ICAoUmVxdWlyZXMgc3BhcmNsaXRlOyByZXF1ZXN0ZWQgYXJjaGl0ZWN0dXJlIGlzIHY4LikKLSMKLSMgVGhlIHN1Z2dlc3RlZCByZWdleHAgYXJndW1lbnQgdG8gZGctZXJyb3IgaXMgIm1pc21hdGNofDxhcmNoPiIuCi0KLWlmIFtpc3RhcmdldCBzcGFyYyotKi0qXSB7Ci0KLSAgICBsb2FkX2xpYiBnYXMtZGcuZXhwCi0KLSAgICBkZy1pbml0Ci0KLSAgICBkZy1ydW50ZXN0IFtsc29ydCBbZ2xvYiAtbm9jb21wbGFpbiAkc3JjZGlyLyRzdWJkaXIvbWlzbS0qLnNdXSAiIiAiIgotCi0gICAgZGctZmluaXNoCi0KLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3ByZWZldGNoLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGY0MjE1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3ByZWZldGNoLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCBwcmVmZXRjaAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8LnRleHQ+OgotICAgMDoJYzEgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNuX3JlYWRzCi0gICA0OglmZiA2OCA0MCAwMCAJcHJlZmV0Y2ggIFxbICVnMSBcXSwgMzEKLSAgIDg6CWMxIDY4IDQwIDAwIAlwcmVmZXRjaCAgXFsgJWcxIFxdLCAjbl9yZWFkcwotICAgYzoJYzMgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNvbmVfcmVhZAotICAxMDoJYzUgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNuX3dyaXRlcwotICAxNDoJYzcgNjggNDAgMDAgCXByZWZldGNoICBcWyAlZzEgXF0sICNvbmVfd3JpdGUKLSAgMTg6CWMxIGU4IDQyIDAwIAlwcmVmZXRjaGEgIFxbICVnMSBcXSAjQVNJX0FJVVAsICNuX3JlYWRzCi0gIDFjOglmZiBlOCA2MCAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gJWFzaSwgMzEKLSAgMjA6CWMxIGU4IDQyIDIwIAlwcmVmZXRjaGEgIFxbICVnMSBcXSAjQVNJX0FJVVMsICNuX3JlYWRzCi0gIDI0OgljMyBlOCA2MCAwMCAJcHJlZmV0Y2hhICBcWyAlZzEgXF0gJWFzaSwgI29uZV9yZWFkCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcHJlZmV0Y2gucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThjNjhiYi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9wcmVmZXRjaC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS50ZXh0Ci0JcHJlZmV0Y2ggWyVnMV0sMAotCXByZWZldGNoIFslZzFdLDMxCi0JcHJlZmV0Y2ggWyVnMV0sI25fcmVhZHMKLQlwcmVmZXRjaCBbJWcxXSwjb25lX3JlYWQKLQlwcmVmZXRjaCBbJWcxXSwjbl93cml0ZXMKLQlwcmVmZXRjaCBbJWcxXSwjb25lX3dyaXRlCi0JcHJlZmV0Y2hhIFslZzFdI0FTSV9BSVVQLDAKLQlwcmVmZXRjaGEgWyVnMV0lYXNpLDMxCi0JcHJlZmV0Y2hhIFslZzFdI0FTSV9BSVVTLCNuX3JlYWRzCi0JcHJlZmV0Y2hhIFslZzFdJWFzaSwjb25lX3JlYWQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM2ZWE5Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCByZHByCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgk4MyA1MCAwMCAwMCAJcmRwciAgJXRwYywgJWcxCi0gICA0Ogk4NSA1MCA0MCAwMCAJcmRwciAgJXRucGMsICVnMgotICAgODoJODcgNTAgODAgMDAgCXJkcHIgICV0c3RhdGUsICVnMwotICAgYzoJODkgNTAgYzAgMDAgCXJkcHIgICV0dCwgJWc0Ci0gIDEwOgk4YiA1MSAwMCAwMCAJcmRwciAgJXRpY2ssICVnNQotICAxNDoJOGQgNTEgNDAgMDAgCXJkcHIgICV0YmEsICVnNgotICAxODoJOGYgNTEgODAgMDAgCXJkcHIgICVwc3RhdGUsICVnNwotICAxYzoJOTEgNTEgYzAgMDAgCXJkcHIgICV0bCwgJW8wCi0gIDIwOgk5MyA1MiAwMCAwMCAJcmRwciAgJXBpbCwgJW8xCi0gIDI0Ogk5NSA1MiA0MCAwMCAJcmRwciAgJWN3cCwgJW8yCi0gIDI4Ogk5NyA1MiA4MCAwMCAJcmRwciAgJWNhbnNhdmUsICVvMwotICAyYzoJOTkgNTIgYzAgMDAgCXJkcHIgICVjYW5yZXN0b3JlLCAlbzQKLSAgMzA6CTliIDUzIDAwIDAwIAlyZHByICAlY2xlYW53aW4sICVvNQotICAzNDoJOWQgNTMgNDAgMDAgCXJkcHIgICVvdGhlcndpbiwgJXNwCi0gIDM4Ogk5ZiA1MyA4MCAwMCAJcmRwciAgJXdzdGF0ZSwgJW83Ci0gIDNjOglhMSA1MyBjMCAwMCAJcmRwciAgJWZxLCAlbDAKLSAgNDA6CWEzIDU3IGMwIDAwIAlyZHByICAldmVyLCAlbDEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JkcHIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NjE5Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZHByLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIFRlc3QgcmRwcgotCS50ZXh0Ci0JcmRwciAldHBjLCVnMQotCXJkcHIgJXRucGMsJWcyCi0JcmRwciAldHN0YXRlLCVnMwotCXJkcHIgJXR0LCVnNAotCXJkcHIgJXRpY2ssJWc1Ci0JcmRwciAldGJhLCVnNgotCXJkcHIgJXBzdGF0ZSwlZzcKLQlyZHByICV0bCwlbzAKLQlyZHByICVwaWwsJW8xCi0JcmRwciAlY3dwLCVvMgotCXJkcHIgJWNhbnNhdmUsJW8zCi0JcmRwciAlY2FucmVzdG9yZSwlbzQKLQlyZHByICVjbGVhbndpbiwlbzUKLQlyZHByICVvdGhlcndpbiwlbzYKLQlyZHByICV3c3RhdGUsJW83Ci0JcmRwciAlZnEsJWwwCi0JcmRwciAldmVyLCVsMQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQwZDBjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3JlbG9jNjQuZAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSNhczogLTY0IC1BdjkKLSNvYmpkdW1wOiAtZHIKLSNuYW1lOiBzcGFyYzY0IHJlbG9jNjQKLQotLio6ICtmaWxlIGZvcm1hdCAuKnNwYXJjLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPGZvbz46Ci0gICAwOgkwMyAwNCA4ZCAxNSAJc2V0aGkgICVoaVwoMHgxMjM0NTQwMFwpLCAlZzEKLSAgIDQ6CTgyIDEwIDYyIDc4IAlvciAgJWcxLCAweDI3OCwgJWcxLioKLSAgIDg6CTAxIDAwIDAwIDAwIAlub3AgCi0gICBjOgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJYzogUl9TUEFSQ19ISDIyCS50ZXh0Ci0gIDEwOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTEwOiBSX1NQQVJDX0hNMTAJLnRleHQKLSAgMTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDE4OgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJMTg6IFJfU1BBUkNfSEgyMgkudGV4dFwrMHgxMjM0NTY3ODAwMDAwMDAwCi0gIDFjOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTFjOiBSX1NQQVJDX0hNMTAJLnRleHRcKzB4MTIzNDU2NzgwMDAwMDAwMAotICAyMDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgMjQ6CTAzIDNmIGI3IDJlIAlzZXRoaSAgJWhpXCgweGZlZGNiODAwXCksICVnMQotICAyODoJODIgMTAgNjIgOTggCW9yICAlZzEsIDB4Mjk4LCAlZzEuKgotICAyYzoJMDUgMWQgOTUgMGMgCXNldGhpICAlaGlcKDB4NzY1NDMwMDBcKSwgJWcyCi0gIDMwOgk4NCAxMCA2MiAxMCAJb3IgICVnMSwgMHgyMTAsICVnMgotICAzNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgMzg6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQkzODogUl9TUEFSQ19ISDIyCS50ZXh0Ci0gIDNjOgk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQkhIDAgPGZvbz4KLQkJCTNjOiBSX1NQQVJDX0hNMTAJLnRleHQKLSAgNDA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQk0MDogUl9TUEFSQ19MTTIyCS50ZXh0Ci0gIDQ0Ogk4NCAxMCA2MCAwMCAJbW92ICAlZzEsICVnMgotCQkJNDQ6IFJfU1BBUkNfTE8xMAkudGV4dAotICA0ODoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgNGM6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk0YzogUl9TUEFSQ19ISDIyCS50ZXh0XCsweGZlZGNiYTk4NzY1NDMyMTAKLSAgNTA6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgotCQkJNTA6IFJfU1BBUkNfSE0xMAkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDU0OgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJNTQ6IFJfU1BBUkNfTE0yMgkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDU4Ogk4NCAxMCA2MCAwMCAJbW92ICAlZzEsICVnMgotCQkJNTg6IFJfU1BBUkNfTE8xMAkudGV4dFwrMHhmZWRjYmE5ODc2NTQzMjEwCi0gIDVjOgkwMSAwMCAwMCAwMCAJbm9wIAotICA2MDoJMDMgMmEgNjEgZDkgCXNldGhpICAlaGlcKDB4YTk4NzY0MDBcKSwgJWcxCi0gIDY0Ogk4MiAxMCA2MSA0MyAJb3IgICVnMSwgMHgxNDMsICVnMS4qCi0gIDY4Ogk4MiAxMCA2MiAxMCAJb3IgICVnMSwgMHgyMTAsICVnMQotICA2YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAgNzA6CTAzIDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcxCi0JCQk3MDogUl9TUEFSQ19INDQJLnRleHQKLSAgNzQ6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCSEgMCA8Zm9vPgotCQkJNzQ6IFJfU1BBUkNfTTQ0CS50ZXh0Ci0gIDc4Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQotCQkJNzg6IFJfU1BBUkNfTDQ0CS50ZXh0Ci0gIDdjOgkwMSAwMCAwMCAwMCAJbm9wIAotICA4MDoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTgwOiBSX1NQQVJDX0g0NAkudGV4dFwrMHhhOTg3NjU0MzIxMAotICA4NDoJODIgMTAgNjAgMDAgCW1vdiAgJWcxLCAlZzEJISAwIDxmb28+Ci0JCQk4NDogUl9TUEFSQ19NNDQJLnRleHRcKzB4YTk4NzY1NDMyMTAKLSAgODg6CTgyIDEwIDYwIDAwIAltb3YgICVnMSwgJWcxCi0JCQk4ODogUl9TUEFSQ19MNDQJLnRleHRcKzB4YTk4NzY1NDMyMTAKLSAgOGM6CTAxIDAwIDAwIDAwIAlub3AgCi0gIDkwOgkwMyAyMiA2YSBmMyAJc2V0aGkgICVoaVwoMHg4OWFiY2MwMFwpLCAlZzEKLSAgOTQ6CTgyIDE4IDdlIDEwIAl4b3IgICVnMSwgLTQ5NiwgJWcxCi0gIDk4OgkwMSAwMCAwMCAwMCAJbm9wIAotICA5YzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTljOiBSX1NQQVJDX0hJWDIyCS50ZXh0Ci0gIGEwOgk4MiAxOCA2MCAwMCAJeG9yICAlZzEsIDAsICVnMQotCQkJYTA6IFJfU1BBUkNfTE9YMTAJLnRleHQKLSAgYTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gIGE4OgkwMyAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMQotCQkJYTg6IFJfU1BBUkNfSElYMjIJLnRleHRcKzB4ZmZmZmZmZmY3NjU0MzIxMAotICBhYzoJODIgMTggNjAgMDAgCXhvciAgJWcxLCAwLCAlZzEKLQkJCWFjOiBSX1NQQVJDX0xPWDEwCS50ZXh0XCsweGZmZmZmZmZmNzY1NDMyMTAKLSAgYjA6CTAxIDAwIDAwIDAwIAlub3AgCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9yZWxvYzY0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYWQ2YWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvcmVsb2M2NC5zCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyBzcGFyYzY0IHNwZWNpYWwgcmVsb2NzCi0KLWZvbzoKLQlzZXRoaSAldWhpKDB4MTIzNDU2NzgwMDAwMDAwMCksJWcxCi0Jb3IgJWcxLCV1bG8oMHgxMjM0NTY3ODAwMDAwMDAwKSwlZzEKLQlub3AKLQlzZXRoaSAldWhpKGZvbyksJWcxCi0Jb3IgJWcxLCV1bG8oZm9vKSwlZzEKLQlub3AKLQlzZXRoaSAldWhpKGZvbysweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQotCW9yICVnMSwldWxvKGZvbysweDEyMzQ1Njc4MDAwMDAwMDApLCVnMQotCW5vcAotCXNldGhpICVoaCgweGZlZGNiYTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlaG0oMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKLQlzZXRoaSAlbG0oMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzIKLQlvciAlZzEsJWxvKDB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jbm9wCi0Jc2V0aGkgJWhoKGZvbyksJWcxCi0Jb3IgJWcxLCVobShmb28pLCVnMQotCXNldGhpICVsbShmb28pLCVnMgotCW9yICVnMSwlbG8oZm9vKSwlZzIKLQlub3AKLQlzZXRoaSAlaGgoZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcxCi0Jb3IgJWcxLCVobShmb28rMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzEKLQlzZXRoaSAlbG0oZm9vKzB4ZmVkY2JhOTg3NjU0MzIxMCksJWcyCi0Jb3IgJWcxLCVsbyhmb28rMHhmZWRjYmE5ODc2NTQzMjEwKSwlZzIKLQlub3AKLQlzZXRoaSAlaDQ0KDB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbTQ0KDB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbDQ0KDB4YTk4NzY1NDMyMTApLCVnMQotCW5vcAotCXNldGhpICVoNDQoZm9vKSwlZzEKLQlvciAlZzEsJW00NChmb28pLCVnMQotCW9yICVnMSwlbDQ0KGZvbyksJWcxCi0Jbm9wCi0Jc2V0aGkgJWg0NChmb28rMHhhOTg3NjU0MzIxMCksJWcxCi0Jb3IgJWcxLCVtNDQoZm9vKzB4YTk4NzY1NDMyMTApLCVnMQotCW9yICVnMSwlbDQ0KGZvbysweGE5ODc2NTQzMjEwKSwlZzEKLQlub3AKLQlzZXRoaSAlaGl4KDB4ZmZmZmZmZmY3NjU0MzIxMCksJWcxCi0JeG9yICVnMSwlbG94KDB4ZmZmZmZmZmY3NjU0MzIxMCksJWcxCi0Jbm9wCi0Jc2V0aGkgJWhpeChmb28pLCVnMQotCXhvciAlZzEsJWxveChmb28pLCVnMQotCW5vcAotCXNldGhpICVoaXgoZm9vKzB4ZmZmZmZmZmY3NjU0MzIxMCksJWcxCi0JeG9yICVnMSwlbG94KGZvbysweGZmZmZmZmZmNzY1NDMyMTApLCVnMQotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NldDY0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNjAyM2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQuZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCBzZXQ2NAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wKyA8Zm9vPjoKLSAgIDA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQkwOiBSX1NQQVJDX0hJMjIJLnRleHQKLSAgIDQ6CTg0IDEwIGEwIDAwIAltb3YgICVnMiwgJWcyCSEgMCA8Zm9vPgotCQkJNDogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gICA4OgkwNyAxZCA5NSAwYyAJc2V0aGkgICVoaVwoMHg3NjU0MzAwMFwpLCAlZzMKLSAgIGM6CTg2IDEwIGUyIDEwIAlvciAgJWczLCAweDIxMCwgJWczCSEgNzY1NDMyMTAgPChcKkFCU1wqfGZvbylcKygweHwpMHg3NjU0MzIxMD4KLSAgMTA6CTg4IDEwIDIwIDAwIAljbHIgICVnNAotICAxNDoJMGIgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzUKLSAgMTg6CThhIDExIDYzIGZmIAlvciAgJWc1LCAweDNmZiwgJWc1CSEgZmZmZiA8KFwqQUJTXCp8Zm9vKVwrKDB4fClmZmZmPgotICAxYzoJMDMgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzEKLQkJCTFjOiBSX1NQQVJDX0hIMjIJLnRleHQKLSAgMjA6CTA1IDAwIDAwIDAwIAlzZXRoaSAgJWhpXCgoMHh8KTBcKSwgJWcyCi0JCQkyMDogUl9TUEFSQ19MTTIyCS50ZXh0Ci0gIDI0Ogk4MiAxMCA2MCAwMCAJbW92ICAlZzEsICVnMQotCQkJMjQ6IFJfU1BBUkNfSE0xMAkudGV4dAotICAyODoJODQgMTAgYTAgMDAgCW1vdiAgJWcyLCAlZzIKLQkJCTI4OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAgMmM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICAzMDoJODQgMTAgODAgMDEgCW9yICAlZzIsICVnMSwgJWcyCi0gIDM0Ogk4NiAxMCAzZiBmZiAJbW92ICAtMSwgJWczCi0gIDM4Ogk4NiAxMCAyMCAwMCAJY2xyICAlZzMKLSAgM2M6CTg2IDEwIDIwIDAxIAltb3YgIDEsICVnMwotICA0MDoJODYgMTAgMmYgZmYgCW1vdiAgMHhmZmYsICVnMwotICA0NDoJMDcgMDAgMDAgMDQgCXNldGhpICAlaGlcKDB4MTAwMFwpLCAlZzMKLSAgNDg6CTg2IDEwIDMwIDAwIAltb3YgIC00MDk2LCAlZzMKLSAgNGM6CTA3IDAwIDAwIDA0IAlzZXRoaSAgJWhpXCgweDEwMDBcKSwgJWczCi0gIDUwOgk4NiAxOCBmZiBmZiAJeG9yICAlZzMsIC0xLCAlZzMKLSAgNTQ6CTA3IDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWczCi0gIDU4Ogk4NiAxMCBlMyBmZiAJb3IgICVnMywgMHgzZmYsICVnMwkhIGZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpZmZmZj4KLSAgNWM6CTA3IDAwIDAwIDNmIAlzZXRoaSAgJWhpXCgweGZjMDBcKSwgJWczCi0gIDYwOgk4NiAxOCBmYyAwMCAJeG9yICAlZzMsIC0xMDI0LCAlZzMKLSAgNjQ6CTA5IDFmIGZmIGZmIAlzZXRoaSAgJWhpXCgweDdmZmZmYzAwXCksICVnNAotICA2ODoJODggMTEgMjMgZmYgCW9yICAlZzQsIDB4M2ZmLCAlZzQJISA3ZmZmZmZmZiA8KFwqQUJTXCp8Zm9vKVwrKDB4fCk3ZmZmZmZmZj4KLSAgNmM6CTA5IDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNAotICA3MDoJMDkgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWc0Ci0gIDc0Ogk4OCAxOSAzYyAwMCAJeG9yICAlZzQsIC0xMDI0LCAlZzQKLSAgNzg6CTA5IDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNAotICA3YzoJODggMTkgM2YgZmYgCXhvciAgJWc0LCAtMSwgJWc0Ci0gIDgwOgkwOSAzZiBmZiBmZiAJc2V0aGkgICVoaVwoMHhmZmZmZmMwMFwpLCAlZzQKLSAgODQ6CTg4IDExIDIzIGZmIAlvciAgJWc0LCAweDNmZiwgJWc0CSEgZmZmZmZmZmYgPChcKkFCU1wqfGZvbylcKygweHwpZmZmZmZmZmY+Ci0gIDg4Ogk4OCAxMCAyMCAwMSAJbW92ICAxLCAlZzQKLSAgOGM6CTg5IDI5IDMwIDIwIAlzbGx4ICAlZzQsIDB4MjAsICVnNAotICA5MDoJMDMgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWcxCi0gIDk0OgkwYiAzZiBmZiBmZiAJc2V0aGkgICVoaVwoMHhmZmZmZmMwMFwpLCAlZzUKLSAgOTg6CTgyIDEwIDYzIGZmIAlvciAgJWcxLCAweDNmZiwgJWcxCi0gIDljOgk4YSAxMSA2MyBmZiAJb3IgICVnNSwgMHgzZmYsICVnNQotICBhMDoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gIGE0Ogk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAgYTg6CTBiIDIwIDAwIDAwIAlzZXRoaSAgJWhpXCgweDgwMDAwMDAwXCksICVnNQotICBhYzoJOGIgMjkgNzAgMjAgCXNsbHggICVnNSwgMHgyMCwgJWc1Ci0gIGIwOgkwYiAzZiBmZiBmZiAJc2V0aGkgICVoaVwoMHhmZmZmZmMwMFwpLCAlZzUKLSAgYjQ6CThhIDE5IDdjIDAwIAl4b3IgICVnNSwgLTEwMjQsICVnNQotICBiODoJMGIgMWYgZmYgZmYgCXNldGhpICAlaGlcKDB4N2ZmZmZjMDBcKSwgJWc1Ci0gIGJjOgk4YSAxOSA3YyAwMCAJeG9yICAlZzUsIC0xMDI0LCAlZzUKLSAgYzA6CTAzIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnMQotICBjNDoJMGIgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWc1Ci0gIGM4Ogk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAgY2M6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotICBkMDoJMDMgM2YgZmYgYzAgCXNldGhpICAlaGlcKDB4ZmZmZjAwMDBcKSwgJWcxCi0gIGQ0Ogk4YSAxMCAyMCAwMSAJbW92ICAxLCAlZzUKLSAgZDg6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotICBkYzoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gIGUwOgkwYiAzZiBmZiBjMCAJc2V0aGkgICVoaVwoMHhmZmZmMDAwMFwpLCAlZzUKLSAgZTQ6CTgyIDEwIDIwIDAxIAltb3YgIDEsICVnMQotICBlODoJOGEgMTEgNjAgMDEgCW9yICAlZzUsIDEsICVnNQotICBlYzoJODMgMjggNzAgMjAgCXNsbHggICVnMSwgMHgyMCwgJWcxCi0gIGYwOgk4YSAxMSA0MCAwMSAJb3IgICVnNSwgJWcxLCAlZzUKLSAgZjQ6CTBiIDNmIGZmIGMwIAlzZXRoaSAgJWhpXCgweGZmZmYwMDAwXCksICVnNQotICBmODoJODIgMTAgMjAgMDEgCW1vdiAgMSwgJWcxCi0gIGZjOgk4MyAyOCA3MCAyMCAJc2xseCAgJWcxLCAweDIwLCAlZzEKLSAxMDA6CThhIDExIDQwIDAxIAlvciAgJWc1LCAlZzEsICVnNQotIDEwNDoJODIgMTAgMjAgMDEgCW1vdiAgMSwgJWcxCi0gMTA4Ogk4YSAxMCAyMCAwMSAJbW92ICAxLCAlZzUKLSAxMGM6CTgzIDI4IDcwIDIwIAlzbGx4ICAlZzEsIDB4MjAsICVnMQotIDExMDoJOGEgMTEgNDAgMDEgCW9yICAlZzUsICVnMSwgJWc1Ci0gMTE0OgkwNSAwMCAwMCAwMCAJc2V0aGkgICVoaVwoKDB4fCkwXCksICVnMgotCQkJMTE0OiBSX1NQQVJDX0hJMjIJLnRleHQKLSAxMTg6CTg0IDEwIGEwIDAwIAltb3YgICVnMiwgJWcyCSEgMCA8Zm9vPgotCQkJMTE4OiBSX1NQQVJDX0xPMTAJLnRleHQKLSAxMWM6CTA3IDFkIDk1IDBjIAlzZXRoaSAgJWhpXCgweDc2NTQzMDAwXCksICVnMwotIDEyMDoJODYgMTAgZTIgMTAgCW9yICAlZzMsIDB4MjEwLCAlZzMJISA3NjU0MzIxMCA8KFwqQUJTXCp8Zm9vKVwrMHg3NjU0MzIxMD4KLSAxMjQ6CTg4IDEwIDIwIDAwIAljbHIgICVnNAotIDEyODoJMGIgMDAgMDAgM2YgCXNldGhpICAlaGlcKDB4ZmMwMFwpLCAlZzUKLSAxMmM6CThhIDExIDYzIGZmIAlvciAgJWc1LCAweDNmZiwgJWc1CSEgZmZmZiA8KFwqQUJTXCp8Zm9vKVwrMHhmZmZmPgotIDEzMDoJMDUgMDAgMDAgMDAgCXNldGhpICAlaGlcKCgweHwpMFwpLCAlZzIKLQkJCTEzMDogUl9TUEFSQ19ISTIyCS50ZXh0Ci0gMTM0Ogk4NCAxMCBhMCAwMCAJbW92ICAlZzIsICVnMgkhIDAgPGZvbz4KLQkJCTEzNDogUl9TUEFSQ19MTzEwCS50ZXh0Ci0gMTM4Ogk4NSAzOCA4MCAwMCAJc2lnbnggICVnMgotIDEzYzoJMDcgMWQgOTUgMGMgCXNldGhpICAlaGlcKDB4NzY1NDMwMDBcKSwgJWczCi0gMTQwOgk4NiAxMCBlMiAxMCAJb3IgICVnMywgMHgyMTAsICVnMwkhIDc2NTQzMjEwIDwoXCpBQlNcKnxmb28pXCsweDc2NTQzMjEwPgotIDE0NDoJODggMTAgMjAgMDAgCWNsciAgJWc0Ci0gMTQ4OgkwYiAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnNQotIDE0YzoJOGEgMTEgNjMgZmYgCW9yICAlZzUsIDB4M2ZmLCAlZzUJISBmZmZmIDwoXCpBQlNcKnxmb28pXCsweGZmZmY+Ci0gMTUwOgk4MiAxMCAzZiBmZiAJbW92ICAtMSwgJWcxCi0gMTU0OgkwNSAxZiBmZiBmZiAJc2V0aGkgICVoaVwoMHg3ZmZmZmMwMFwpLCAlZzIKLSAxNTg6CTg0IDEwIGEzIGZmIAlvciAgJWcyLCAweDNmZiwgJWcyCSEgN2ZmZmZmZmYgPChcKkFCU1wqfGZvbylcKzB4N2ZmZmZmZmY+Ci0gMTVjOgkwNyAwMCAwMCAzZiAJc2V0aGkgICVoaVwoMHhmYzAwXCksICVnMwotIDE2MDoJODYgMTggZmMgMDAgCXhvciAgJWczLCAtMTAyNCwgJWczCi0gMTY0Ogk4OCAxMCAzZiBmZiAJbW92ICAtMSwgJWc0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc2V0NjQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI1MDM2ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zZXQ2NC5zCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyBzcGFyYzY0IHNldCBpbnNuIGhhbmRsaW5nIChpbmNsdWRlcyBzZXQsIHNldHV3LCBzZXRzdywgc2V0eCkKLQotZm9vOgotCXNldCBmb28sJWcyCi0Jc2V0IDB4NzY1NDMyMTAsJWczCi0Jc2V0IDAsJWc0Ci0Jc2V0IDY1NTM1LCVnNQotCi0Jc2V0eCBmb28sJWcxLCVnMgotCi0Jc2V0eCAtMSwlZzEsJWczCi0Jc2V0eCAwLCVnMSwlZzMKLQlzZXR4IDEsJWcxLCVnMwotCXNldHggNDA5NSwlZzEsJWczCi0Jc2V0eCA0MDk2LCVnMSwlZzMKLQlzZXR4IC00MDk2LCVnMSwlZzMKLQlzZXR4IC00MDk3LCVnMSwlZzMKLQlzZXR4IDY1NTM1LCVnMSwlZzMKLQlzZXR4IC02NTUzNiwlZzEsJWczCi0KLQlzZXR4IDIxNDc0ODM2NDcsJWcxLCVnNAotCXNldHggMjE0NzQ4MzY0OCwlZzEsJWc0Ci0Jc2V0eCAtMjE0NzQ4MzY0OCwlZzEsJWc0Ci0Jc2V0eCAtMjE0NzQ4MzY0OSwlZzEsJWc0Ci0Jc2V0eCA0Mjk0OTY3Mjk1LCVnMSwlZzQKLQlzZXR4IDQyOTQ5NjcyOTYsJWcxLCVnNAotCi0hIEdBUyBkb2Vzbid0IGhhbmRsZSBsYXJnZSBiYXNlMTAgbnVtYmVycyB5ZXQuCi0hCXNldHggOTIyMzM3MjAzNjg1NDc3NTgwNywlZzEsJWc1Ci0hCXNldHggOTIyMzM3MjAzNjg1NDc3NTgwOCwlZzEsJWc1Ci0hCXNldHggLTkyMjMzNzIwMzY4NTQ3NzU4MDgsJWcxLCVnNQotIQlzZXR4IC05MjIzMzcyMDM2ODU0Nzc1ODA5LCVnMSwlZzUKLQotCXNldHggMHg3ZmZmZmZmZmZmZmZmZmZmLCVnMSwlZzUKLQlzZXR4IDB4ODAwMDAwMDAwMDAwMDAwMCwlZzEsJWc1CQkhIHRlc3Qgb25seSBoaDIyIG5lZWRlZAotCXNldHggMHhmZmZmZmZmZjAwMDAwMDAwLCVnMSwlZzUJCSEgdGVzdCBvbmx5IGhtMTAgbmVlZGVkCi0Jc2V0eCAweGZmZmZmZmZmODAwMDAwMDAsJWcxLCVnNQkJISB0ZXN0IHNpZ24tZXh0IG9mIGxvd2VyIDMyCi0Jc2V0eCAweGZmZmYwMDAwZmZmZjAwMDAsJWcxLCVnNQkJISB0ZXN0IGhoMjIsaGkyMgotCXNldHggMHhmZmZmMDAwMDAwMDAwMDAxLCVnMSwlZzUJCSEgdGVzdCBoaDIyLGxvMTAKLQlzZXR4IDB4MDAwMDAwMDFmZmZmMDAwMSwlZzEsJWc1CQkhIHRlc3QgaG0xMCxoaTIyLGxvMTAKLQlzZXR4IDB4MDAwMDAwMDFmZmZmMDAwMCwlZzEsJWc1CQkhIHRlc3QgaG0xMCxoaTIyCi0Jc2V0eCAweDAwMDAwMDAxMDAwMDAwMDEsJWcxLCVnNQkJISB0ZXN0IGhtMTAsbG8xMAotCi0Jc2V0dXcgZm9vLCVnMgotCXNldHV3IDB4NzY1NDMyMTAsJWczCi0Jc2V0dXcgMCwlZzQKLQlzZXR1dyA2NTUzNSwlZzUKLQotCXNldHN3IGZvbywlZzIKLQlzZXRzdyAweDc2NTQzMjEwLCVnMwotCXNldHN3IDAsJWc0Ci0Jc2V0c3cgNjU1MzUsJWc1Ci0Jc2V0c3cgMHhmZmZmZmZmZiwlZzEKLQlzZXRzdyAweDdmZmZmZmZmLCVnMgotCXNldHN3IDB4ZmZmZjAwMDAsJWczCi0Jc2V0c3cgLTEsJWc0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGFyYy5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGFyYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZGNhYWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BhcmMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBTb21lIGdlbmVyaWMgU1BBUkMgYW5kIFNQQVJDNjQgdGVzdHMKLQotIyBGSVhNRTogVGhlIHRlc3RzIGhlcmUgYXJlbid0IHJlYWxseSBidWxsZXQgcHJvb2YuICBBIG1pc3Rha2UgaW4gdGhlIG9wY29kZQotIyB0YWJsZSBjYW4gc2xpcCB0aHJvdWdoIHNpbmNlIHdlIHVzZSB0aGUgc2FtZSB0YWJsZSBmb3IgYXNzZW1ibHkgYW5kCi0jIGRpc2Fzc2VtYmx5LiAgVGhlIHdheSB0byBmaXggdGhpcyBpcyB0byBpbmNsdWRlIGEgaGV4IGR1bXAgb2YgdGhlIGluc25zCi0jIGFuZCB0ZXN0IHRoYXQgYXMgd2VsbC4gIExhdGVyLgotCi0jIEZpbmQgb3V0IGlmIHRoZXNlIGJpbnV0aWxzIGFyZSBlaXRoZXIgc3BhcmM2NCotKi0qIG9yCi0jIHNwYXJjKi0qLSogd2l0aCAtLWVuYWJsZS10YXJnZXRzPXNwYXJjNjQtKi0qCi1wcm9jIGdhc182NF9jaGVjayB7IH0gewotICAgIGdsb2JhbCBOTQotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotCi0gICAgY2F0Y2ggImV4ZWMgJHNyY2Rpci9saWIvcnVuICROTSAkTk1GTEFHUyAtLWhlbHAiIG5tX2hlbHAKLSAgICByZXR1cm4gW3JlZ2V4cCAiZWxmNjRcW18tXF1zcGFyYyIgJG5tX2hlbHBdOwotfQotCi1pZiBbaXN0YXJnZXQgc3BhcmMqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgInN5bnRoIgotICAgIGlmIFtnYXNfNjRfY2hlY2tdIHsKLQlydW5fZHVtcF90ZXN0ICJhc2kiCi0JcnVuX2R1bXBfdGVzdCAibWVtYmFyIgotCXJ1bl9kdW1wX3Rlc3QgInByZWZldGNoIgotCXJ1bl9kdW1wX3Rlc3QgInNldDY0IgotCXJ1bl9kdW1wX3Rlc3QgInN5bnRoNjQiCi0JcnVuX2R1bXBfdGVzdCAicmRwciIKLQlydW5fZHVtcF90ZXN0ICJ3cnByIgotCXJ1bl9kdW1wX3Rlc3QgInJlbG9jNjQiCi0gICAgfQotfQotCi1pZiBbaXN0YXJnZXQgc3BhcmNsZXQqLSotKl0gewotICAgIHJ1bl9kdW1wX3Rlc3QgInNwbGV0IgotICAgIHJ1bl9kdW1wX3Rlc3QgInNwbGV0LTIiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTU1MzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQtMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2FzOiAtQXNwYXJjbGV0Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzCi0KLS4qOiArZmlsZSBmb3JtYXQgLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMCsgPHN0YXJ0PjoKLSAgIDA6CTgxIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjc3IKLSAgIDQ6CTgzIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjZnIKLSAgIDg6CTg1IGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjY3JjcgotICAgYzoJODcgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2NwcgotICAxMDoJODkgYjAgNDAgYzAgCWN3cmN4dCAgJWcxLCAlY2NzcjIKLSAgMTQ6CThiIGIwIDQwIGMwIAljd3JjeHQgICVnMSwgJWNjY3JyCi0gIDE4Ogk4ZCBiMCA0MCBjMCAJY3dyY3h0ICAlZzEsICVjY3JzdHIKLSAgMWM6CTgzIGIwIDAxIDAwIAljcmRjeHQgICVjY3NyLCAlZzEKLSAgMjA6CTgzIGIwIDQxIDAwIAljcmRjeHQgICVjY2ZyLCAlZzEKLSAgMjQ6CTgzIGIwIDgxIDAwIAljcmRjeHQgICVjY2NyY3IsICVnMQotICAyODoJODMgYjAgYzEgMDAgCWNyZGN4dCAgJWNjcHIsICVnMQotICAyYzoJODMgYjEgMDEgMDAgCWNyZGN4dCAgJWNjc3IyLCAlZzEKLSAgMzA6CTgzIGIxIDQxIDAwIAljcmRjeHQgICVjY2NyciwgJWcxCi0gIDM0Ogk4MyBiMSA4MSAwMCAJY3JkY3h0ICAlY2Nyc3RyLCAlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LTIucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzNDQ5NS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC0yLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0hIFRlc3Qgc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzLgotCi0JLnRleHQKLQkuZ2xvYmFsIHN0YXJ0Ci1zdGFydDoKLQotCWN3cmN4dCAgICAlZzEsJWNjc3IKLQljd3JjeHQgICAgJWcxLCVjY2ZyCi0JY3dyY3h0ICAgICVnMSwlY2NjcmNyCi0JY3dyY3h0ICAgICVnMSwlY2NwcgotCWN3cmN4dCAgICAlZzEsJWNjc3IyCi0JY3dyY3h0ICAgICVnMSwlY2NjcnIKLQljd3JjeHQgICAgJWcxLCVjY3JzdHIKLQotCWNyZGN4dCAgICAlY2NzciwlZzEKLQljcmRjeHQgICAgJWNjZnIsJWcxCi0JY3JkY3h0ICAgICVjY2NyY3IsJWcxCi0JY3JkY3h0ICAgICVjY3ByLCVnMQotCWNyZGN4dCAgICAlY2NzcjIsJWcxCi0JY3JkY3h0ICAgICVjY2NyciwlZzEKLQljcmRjeHQgICAgJWNjcnN0ciwlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zcGxldC5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWMwYTIxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotI2FzOiAtQXNwYXJjbGV0Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmNsZXQgZXh0ZW5zaW9ucwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDxzdGFydD46Ci0gICAwOglhMSA0MCAwMCAwMCAJcmQgICV5LCAlbDAKLSAgIDQ6CWExIDQwIDQwIDAwIAlyZCAgJWFzcjEsICVsMAotICAgODoJYTEgNDMgYzAgMDAgCXJkICAlYXNyMTUsICVsMAotICAgYzoJYTEgNDQgNDAgMDAgCXJkICAlYXNyMTcsICVsMAotICAxMDoJYTEgNDQgODAgMDAgCXJkICAlYXNyMTgsICVsMAotICAxNDoJYTEgNDQgYzAgMDAgCXJkICAlYXNyMTksICVsMAotICAxODoJYTEgNDUgMDAgMDAgCXJkICAlYXNyMjAsICVsMAotICAxYzoJYTEgNDUgNDAgMDAgCXJkICAlYXNyMjEsICVsMAotICAyMDoJYTEgNDUgODAgMDAgCXJkICAlYXNyMjIsICVsMAotICAyNDoJODEgODQgMjAgMDAgCW1vdiAgJWwwLCAleQotICAyODoJODMgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMQotICAyYzoJOWYgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTUKLSAgMzA6CWEzIDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjE3Ci0gIDM0OglhNSA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IxOAotICAzODoJYTcgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMTkKLSAgM2M6CWE5IDg0IDIwIDAwIAltb3YgICVsMCwgJWFzcjIwCi0gIDQwOglhYiA4NCAyMCAwMCAJbW92ICAlbDAsICVhc3IyMQotICA0NDoJYWQgODQgMjAgMDAgCW1vdiAgJWwwLCAlYXNyMjIKLQotMCs0OCA8dGVzdF91bXVsPjoKLSAgNDg6CTg2IDUwIDQwIDAyIAl1bXVsICAlZzEsICVnMiwgJWczCi0gIDRjOgk4NiA1MCA0MCAwMiAJdW11bCAgJWcxLCAlZzIsICVnMwotCi0wKzUwIDx0ZXN0X3NtdWw+OgotICA1MDoJODYgNTggNDAgMDIgCXNtdWwgICVnMSwgJWcyLCAlZzMKLSAgNTQ6CTg2IDU4IDQwIDAyIAlzbXVsICAlZzEsICVnMiwgJWczCi0KLTArNTggPHRlc3Rfc3RiYXI+OgotICA1ODoJODEgNDMgYzAgMDAgCXN0YmFyIAotICA1YzoJODEgNDMgYzAgMDAgCXN0YmFyIAotICA2MDoJMDAgMDAgMDAgMDEgCXVuaW1wICAweDEKLSAgNjQ6CTgxIGRjIDQwIDAwIAlmbHVzaCAgJWwxCi0KLTArNjggPHRlc3Rfc2Nhbj46Ci0gIDY4OglhNyA2NCA3ZiBmZiAJc2NhbiAgJWwxLCAtMSwgJWwzCi0gIDZjOglhNyA2NCA2MCAwMCAJc2NhbiAgJWwxLCAwLCAlbDMKLSAgNzA6CWE3IDY0IDQwIDExIAlzY2FuICAlbDEsICVsMSwgJWwzCi0KLTArNzQgPHRlc3Rfc2h1ZmZsZT46Ci0gIDc0OglhMyA2YyAyMCAwMSAJc2h1ZmZsZSAgJWwwLCAxLCAlbDEKLSAgNzg6CWEzIDZjIDIwIDAyIAlzaHVmZmxlICAlbDAsIDIsICVsMQotICA3YzoJYTMgNmMgMjAgMDQgCXNodWZmbGUgICVsMCwgNCwgJWwxCi0gIDgwOglhMyA2YyAyMCAwOCAJc2h1ZmZsZSAgJWwwLCA4LCAlbDEKLSAgODQ6CWEzIDZjIDIwIDEwIAlzaHVmZmxlICAlbDAsIDB4MTAsICVsMQotICA4ODoJYTMgNmMgMjAgMTggCXNodWZmbGUgICVsMCwgMHgxOCwgJWwxCi0KLTArOGMgPHRlc3RfdW1hYz46Ci0gIDhjOglhMSBmNCA0MCAxMiAJdW1hYyAgJWwxLCAlbDIsICVsMAotICA5MDoJYTEgZjQgNjAgMDIgCXVtYWMgICVsMSwgMiwgJWwwCi0gIDk0OglhMSBmNCA2MCAwMiAJdW1hYyAgJWwxLCAyLCAlbDAKLQotMCs5OCA8dGVzdF91bWFjZD46Ci0gIDk4OglhMSA3NCA4MCAxNCAJdW1hY2QgICVsMiwgJWw0LCAlbDAKLSAgOWM6CWExIDc0IGEwIDAzIAl1bWFjZCAgJWwyLCAzLCAlbDAKLSAgYTA6CWExIDc0IGEwIDAzIAl1bWFjZCAgJWwyLCAzLCAlbDAKLQotMCthNCA8dGVzdF9zbWFjPjoKLSAgYTQ6CWExIGZjIDQwIDEyIAlzbWFjICAlbDEsICVsMiwgJWwwCi0gIGE4OglhMSBmYyA3ZiBkNiAJc21hYyAgJWwxLCAtNDIsICVsMAotICBhYzoJYTEgZmMgN2YgZDYgCXNtYWMgICVsMSwgLTQyLCAlbDAKLQotMCtiMCA8dGVzdF9zbWFjZD46Ci0gIGIwOglhMSA3YyA4MCAxNCAJc21hY2QgICVsMiwgJWw0LCAlbDAKLSAgYjQ6CWExIDdjIGEwIDdiIAlzbWFjZCAgJWwyLCAweDdiLCAlbDAKLSAgYjg6CWExIDdjIGEwIDdiIAlzbWFjZCAgJWwyLCAweDdiLCAlbDAKLQotMCtiYyA8dGVzdF91bXVsZD46Ci0gIGJjOgk5MCA0YSA4MCAwYyAJdW11bGQgICVvMiwgJW80LCAlbzAKLSAgYzA6CTkwIDRhIGEyIDM0IAl1bXVsZCAgJW8yLCAweDIzNCwgJW8wCi0gIGM0Ogk5MCA0YSBhNSA2NyAJdW11bGQgICVvMiwgMHg1NjcsICVvMAotCi0wK2M4IDx0ZXN0X3NtdWxkPjoKLSAgYzg6CWIwIDZlIDgwIDFjIAlzbXVsZCAgJWkyLCAlaTQsICVpMAotICBjYzoJYjAgNmUgYjAgMDAgCXNtdWxkICAlaTIsIC00MDk2LCAlaTAKLSAgZDA6CWIwIDZmIDJmIGZmIAlzbXVsZCAgJWk0LCAweGZmZiwgJWkwCi0KLTArZDQgPHRlc3RfY29wcm9jZXNzb3I+OgotICBkNDoJODEgYjQgMDAgMTEgCWNwdXNoICAlbDAsICVsMQotICBkODoJODEgYjQgMjAgMDEgCWNwdXNoICAlbDAsIDEKLSAgZGM6CTgxIGI0IDAwIDUxIAljcHVzaGEgICVsMCwgJWwxCi0gIGUwOgk4MSBiNCAyMCA0MSAJY3B1c2hhICAlbDAsIDEKLSAgZTQ6CWExIGIwIDAwIDgwIAljcHVsbCAgJWwwCi0gIGU4OglhMSBiMCAwMSAwMCAJY3JkY3h0ICAlY2NzciwgJWwwCi0gIGVjOglhMSBiMCA0MSAwMCAJY3JkY3h0ICAlY2NmciwgJWwwCi0gIGYwOglhMSBiMCBjMSAwMCAJY3JkY3h0ICAlY2NwciwgJWwwCi0gIGY0OglhMSBiMCA4MSAwMCAJY3JkY3h0ICAlY2NjcmNyLCAlbDAKLSAgZjg6CTgxIGI0IDAwIGMwIAljd3JjeHQgICVsMCwgJWNjc3IKLSAgZmM6CTgzIGI0IDAwIGMwIAljd3JjeHQgICVsMCwgJWNjZnIKLSAxMDA6CTg3IGI0IDAwIGMwIAljd3JjeHQgICVsMCwgJWNjcHIKLSAxMDQ6CTg1IGI0IDAwIGMwIAljd3JjeHQgICVsMCwgJWNjY3JjcgotIDEwODoJMDEgYzAgMDAgMDEgCWNibiAgMTBjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTM4PgotCQkJMTA4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZjgKLSAxMGM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTEwOgkyMSBjMCAwMCAwMSAJY2JuLGEgICAxMTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNDA+Ci0JCQkxMTA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVmMAotIDExNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMTg6CTAzIGMwIDAwIDAxIAljYmUgIDExYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk0OD4KLQkJCTExODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWU4Ci0gMTFjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDEyMDoJMjMgYzAgMDAgMDEgCWNiZSxhICAgMTI0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTUwPgotCQkJMTIwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlZTAKLSAxMjQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTI4OgkwNSBjMCAwMCAwMSAJY2JmICAxMmMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpNTg+Ci0JCQkxMjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVkOAotIDEyYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxMzA6CTI1IGMwIDAwIDAxIAljYmYsYSAgIDEzNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk2MD4KLQkJCTEzMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWQwCi0gMTM0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDEzODoJMDcgYzAgMDAgMDEgCWNiZWYgIDEzYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk2OD4KLQkJCTEzODogV0RJU1AyMglzdG9wXCsweGZmZmZmZWM4Ci0gMTNjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDE0MDoJMjcgYzAgMDAgMDEgCWNiZWYsYSAgIDE0NCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCk3MD4KLQkJCTE0MDogV0RJU1AyMglzdG9wXCsweGZmZmZmZWMwCi0gMTQ0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDE0ODoJMDkgYzAgMDAgMDEgCWNiciAgMTRjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTc4PgotCQkJMTQ4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlYjgKLSAxNGM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTUwOgkyOSBjMCAwMCAwMSAJY2JyLGEgICAxNTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpODA+Ci0JCQkxNTA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmViMAotIDE1NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNTg6CTBiIGMwIDAwIDAxIAljYmVyICAxNWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpODg+Ci0JCQkxNTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVhOAotIDE1YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNjA6CTJiIGMwIDAwIDAxIAljYmVyLGEgICAxNjQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpOTA+Ci0JCQkxNjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmVhMAotIDE2NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNjg6CTBkIGMwIDAwIDAxIAljYmZyICAxNmMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpOTg+Ci0JCQkxNjg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU5OAotIDE2YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNzA6CTJkIGMwIDAwIDAxIAljYmZyLGEgICAxNzQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYTA+Ci0JCQkxNzA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU5MAotIDE3NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxNzg6CTBmIGMwIDAwIDAxIAljYmVmciAgMTdjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWE4PgotCQkJMTc4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlODgKLSAxN2M6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTgwOgkyZiBjMCAwMCAwMSAJY2JlZnIsYSAgIDE4NCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCliMD4KLQkJCTE4MDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTgwCi0gMTg0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDE4ODoJMTEgYzAgMDAgMDEgCWNiYSAgMThjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWI4PgotCQkJMTg4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNzgKLSAxOGM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMTkwOgkzMSBjMCAwMCAwMSAJY2JhLGEgICAxOTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYzA+Ci0JCQkxOTA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU3MAotIDE5NDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxOTg6CTEzIGMwIDAwIDAxIAljYm5lICAxOWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpYzg+Ci0JCQkxOTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU2OAotIDE5YzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYTA6CTMzIGMwIDAwIDAxIAljYm5lLGEgICAxYTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZDA+Ci0JCQkxYTA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU2MAotIDFhNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYTg6CTE1IGMwIDAwIDAxIAljYm5mICAxYWMgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZDg+Ci0JCQkxYTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU1OAotIDFhYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYjA6CTM1IGMwIDAwIDAxIAljYm5mLGEgICAxYjQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpZTA+Ci0JCQkxYjA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmU1MAotIDFiNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxYjg6CTE3IGMwIDAwIDAxIAljYm5lZiAgMWJjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KWU4PgotCQkJMWI4OiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlNDgKLSAxYmM6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWMwOgkzNyBjMCAwMCAwMSAJY2JuZWYsYSAgIDFjNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClmMD4KLQkJCTFjMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTQwCi0gMWM0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDFjODoJMTkgYzAgMDAgMDEgCWNibnIgIDFjYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fClmOD4KLQkJCTFjODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTM4Ci0gMWNjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDFkMDoJMzkgYzAgMDAgMDEgCWNibnIsYSAgIDFkNCA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMDA+Ci0JCQkxZDA6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUzMAotIDFkNDoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZDg6CTFiIGMwIDAwIDAxIAljYm5lciAgMWRjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTEwOD4KLQkJCTFkODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTI4Ci0gMWRjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDFlMDoJM2IgYzAgMDAgMDEgCWNibmVyLGEgICAxZTQgPHRlc3RfY29wcm9jZXNzb3JcKygweHwpMTEwPgotCQkJMWUwOiBXRElTUDIyCXN0b3BcKzB4ZmZmZmZlMjAKLSAxZTQ6CTAxIDAwIDAwIDAwIAlub3AgCi0gMWU4OgkxZCBjMCAwMCAwMSAJY2JuZnIgIDFlYyA8dGVzdF9jb3Byb2Nlc3NvclwrKDB4fCkxMTg+Ci0JCQkxZTg6IFdESVNQMjIJc3RvcFwrMHhmZmZmZmUxOAotIDFlYzoJMDEgMDAgMDAgMDAgCW5vcCAKLSAxZjA6CTNkIGMwIDAwIDAxIAljYm5mcixhICAgMWY0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTEyMD4KLQkJCTFmMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTEwCi0gMWY0OgkwMSAwMCAwMCAwMCAJbm9wIAotIDFmODoJMWYgYzAgMDAgMDEgCWNibmVmciAgMWZjIDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTEyOD4KLQkJCTFmODogV0RJU1AyMglzdG9wXCsweGZmZmZmZTA4Ci0gMWZjOgkwMSAwMCAwMCAwMCAJbm9wIAotIDIwMDoJM2YgYzAgMDAgMDEgCWNibmVmcixhICAgMjA0IDx0ZXN0X2NvcHJvY2Vzc29yXCsoMHh8KTEzMD4KLQkJCTIwMDogV0RJU1AyMglzdG9wXCsweGZmZmZmZTAwCi0gMjA0OgkwMSAwMCAwMCAwMCAJbm9wIApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3NwbGV0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmQ1MDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3BsZXQucworKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0JLnRleHQKLQkuZ2xvYmFsIHN0YXJ0Ci0KLSEJU3RhcnRpbmcgcG9pbnQKLXN0YXJ0OgotCi0hCXRlc3QgYWxsIEFTUnMKLQotCXJkCSVhc3IwLCAlbDAKLQlyZAklYXNyMSwgJWwwCi0JcmQJJWFzcjE1LCAlbDAKLQlyZAklYXNyMTcsICVsMAotCXJkCSVhc3IxOCwgJWwwCi0JcmQJJWFzcjE5LCAlbDAJISBzaG91bGQgc3RvcCB0aGUgcHJvY2Vzc29yCi0JcmQJJWFzcjIwLCAlbDAKLQlyZAklYXNyMjEsICVsMAotCXJkCSVhc3IyMiwgJWwwCi0KLQl3cgklbDAsIDAsICVhc3IwCi0Jd3IJJWwwLCAwLCAlYXNyMQotCXdyCSVsMCwgMCwgJWFzcjE1Ci0Jd3IJJWwwLCAwLCAlYXNyMTcKLQl3cgklbDAsIDAsICVhc3IxOAotCXdyCSVsMCwgMCwgJWFzcjE5Ci0Jd3IJJWwwLCAwLCAlYXNyMjAKLQl3cgklbDAsIDAsICVhc3IyMQotCXdyCSVsMCwgMCwgJWFzcjIyCi0KLSEJdGVzdCBVTVVMIHdpdGggbm8gb3ZlcmZsb3cgaW5zaWRlIFkKLXRlc3RfdW11bDoKLQl1bXVsCSVnMSwgJWcyLCAlZzMKLQotIQl0ZXN0IFVNVUwgd2l0aCBhbiBvdmVyZmxvdyBpbnNpZGUgWQotCi0JdW11bAklZzEsICVnMiwgJWczCSEgJWczIG11c3QgYmUgZXF1YWwgdG8gMAotCi0hCXRlc3QgU01VTCB3aXRoIG5lZ2F0aXZlIHJlc3VsdAotdGVzdF9zbXVsOgotCXNtdWwJJWcxLCAlZzIsICVnMwotCi0hCXRlc3QgU01VTCB3aXRoIHBvc2l0aXZlIHJlc3VsdAotCi0Jc211bAklZzEsICVnMiwgJWczCi0KLSEJdGVzdCBTVEJBUjogdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBzeW50YXhlcwotdGVzdF9zdGJhcjoKLQlzdGJhcgkJCSEgaXMgYSB2YWxpZCBWOCBzeW50YXgsIGF0IGxlYXN0IGEgc3ludGhldGljCi0JCQkJISBpbnN0cnVjdGlvbgotCXJkCSVhc3IxNSwgJWcwCSEgb3RoZXIgc29sdXRpb24KLQotIQl0ZXN0IFVOSU1QCi0JdW5pbXAJMQotCi0hCXRlc3QgRkxVU0gKLQlmbHVzaAklbDEJCSEgaXMgdGhlIG9mZmljaWFsIFY4IHN5bnRheAotCi0hCXRlc3QgU0NBTjogZmluZCBmaXJzdCAwCi10ZXN0X3NjYW46Ci0Jc2NhbgklbDEsIDB4ZmZmZmZmZmYsICVsMwotCi0hCXRlc3Qgc2NhbjogZmluZCBmaXJzdCAxCi0KLQlzY2FuCSVsMSwgMCwgJWwzCi0KLSEJdGVzdCBzY2FuOiBmaW5kIGZpcnN0IGJpdCAhPSBiaXQtMAotCi0Jc2NhbgklbDEsICVsMSwgJWwzCi0KLSEJdGVzdCBTSFVGRkxFCi10ZXN0X3NodWZmbGU6Ci0Jc2h1ZmZsZQklbDAsIDB4MSwgJWwxCi0Jc2h1ZmZsZQklbDAsIDB4MiwgJWwxCi0Jc2h1ZmZsZQklbDAsIDB4NCwgJWwxCi0Jc2h1ZmZsZQklbDAsIDB4OCwgJWwxCi0Jc2h1ZmZsZQklbDAsIDB4MTAsICVsMQotCXNodWZmbGUJJWwwLCAweDE4LCAlbDEKLQotIQl0ZXN0IFVNQUMKLXRlc3RfdW1hYzoKLQl1bWFjCSVsMSwgJWwyLCAlbDAKLQl1bWFjCSVsMSwgMiwgJWwwCi0JdW1hYwkyLCAlbDEsICVsMAotCi0hCXRlc3QgVU1BQ0QKLXRlc3RfdW1hY2Q6Ci0JdW1hY2QJJWwyLCAlbDQsICVsMAotCXVtYWNkCSVsMiwgMywgJWwwCi0JdW1hY2QJMywgJWwyLCAlbDAKLQotIQl0ZXN0IFNNQUMKLXRlc3Rfc21hYzoKLQlzbWFjCSVsMSwgJWwyLCAlbDAKLQlzbWFjCSVsMSwgLTQyLCAlbDAKLQlzbWFjCS00MiwgJWwxLCAlbDAKLQotIQl0ZXN0IFNNQUNECi10ZXN0X3NtYWNkOgotCXNtYWNkCSVsMiwgJWw0LCAlbDAKLQlzbWFjZAklbDIsIDEyMywgJWwwCi0Jc21hY2QJMTIzLCAlbDIsICVsMAotCi0hCXRlc3QgVU1VTEQKLXRlc3RfdW11bGQ6Ci0JdW11bGQJJW8yLCAlbzQsICVvMAotCXVtdWxkCSVvMiwgMHgyMzQsICVvMAotCXVtdWxkCTB4NTY3LCAlbzIsICVvMAotCi0hCXRlc3QgU01VTEQKLXRlc3Rfc211bGQ6Ci0Jc211bGQJJWkyLCAlaTQsICVpMAotCXNtdWxkCSVpMiwgLTQwOTYsICVpMAotCXNtdWxkCTQwOTUsICVpNCwgJWkwCi0KLSEJQ29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zCi10ZXN0X2NvcHJvY2Vzc29yOgotIQklY2NzcglpcyByZWdpc3RlciAjIDAKLSEJJWNjZnIJaXMgcmVnaXN0ZXIgIyAxCi0hCSVjY3ByCWlzIHJlZ2lzdGVyICMgMwotIQklY2NjcmNyIGlzIHJlZ2lzdGVyICMgMgotCi0hCXRlc3QgQ1BVU0g6IGp1c3Qgc3ludGF4Ci0KLQljcHVzaAklbDAsICVsMQotCWNwdXNoCSVsMCwgMQotCWNwdXNoYQklbDAsICVsMQotCWNwdXNoYQklbDAsIDEKLQotIQl0ZXN0IENQVUxMOiBqdXN0IHN5bnRheAotCi0JY3B1bGwJJWwwCi0KLSEJdGVzdCBDUFJEQ1hUOiBqdXN0IHN5bnRheAotCi0JY3JkY3h0CSVjY3NyLCAlbDAKLQljcmRjeHQJJWNjZnIsICVsMAotCWNyZGN4dAklY2NwciwgJWwwCi0JY3JkY3h0CSVjY2NyY3IsICVsMAotCi0hCXRlc3QgQ1BXUkNYVDoganVzdCBzeW50YXgKLQotCWN3cmN4dAklbDAsICVjY3NyCi0JY3dyY3h0CSVsMCwgJWNjZnIKLQljd3JjeHQJJWwwLCAlY2NwcgotCWN3cmN4dAklbDAsICVjY2NyY3IKLQotIQl0ZXN0IENCY2NjOiBqdXN0IHN5bnRheAotCi0JY2JuCXN0b3AKLQlub3AKLQljYm4sYQlzdG9wCi0Jbm9wCi0JY2JlCXN0b3AKLQlub3AKLQljYmUsYQlzdG9wCi0Jbm9wCi0JY2JmCXN0b3AKLQlub3AKLQljYmYsYQlzdG9wCi0Jbm9wCi0JY2JlZglzdG9wCi0Jbm9wCi0JY2JlZixhCXN0b3AKLQlub3AKLQljYnIJc3RvcAotCW5vcAotCWNicixhCXN0b3AKLQlub3AKLQljYmVyCXN0b3AKLQlub3AKLQljYmVyLGEJc3RvcAotCW5vcAotCWNiZnIJc3RvcAotCW5vcAotCWNiZnIsYQlzdG9wCi0Jbm9wCi0JY2JlZnIJc3RvcAotCW5vcAotCWNiZWZyLGEJc3RvcAotCW5vcAotCWNiYQlzdG9wCi0Jbm9wCi0JY2JhLGEJc3RvcAotCW5vcAotCWNibmUJc3RvcAotCW5vcAotCWNibmUsYQlzdG9wCi0Jbm9wCi0JY2JuZglzdG9wCi0Jbm9wCi0JY2JuZixhCXN0b3AKLQlub3AKLQljYm5lZglzdG9wCi0Jbm9wCi0JY2JuZWYsYQlzdG9wCi0Jbm9wCi0JY2JucglzdG9wCi0Jbm9wCi0JY2JucixhCXN0b3AKLQlub3AKLQljYm5lcglzdG9wCi0Jbm9wCi0JY2JuZXIsYQlzdG9wCi0Jbm9wCi0JY2JuZnIJc3RvcAotCW5vcAotCWNibmZyLGEJc3RvcAotCW5vcAotCWNibmVmcglzdG9wCi0Jbm9wCi0JY2JuZWZyLGEJc3RvcAotCW5vcApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGguZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMjIyYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGguZAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNhczogLUF2NwotI29iamR1bXA6IC1kciAtLXByZWZpeC1hZGRyZXNzZXMKLSNuYW1lOiBzcGFyYyBzeW50aAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0wKzAwMDAgPGZvbz4geG5vciAgJWcxLCAlZzAsICVnMgotMCswMDA0IDxmb29cKygweHwpND4geG5vciAgJWcxLCAlZzAsICVnMQotMCswMDA4IDxmb29cKygweHwpOD4gbmVnICAlZzEsICVnMgotMCswMDBjIDxmb29cKygweHwpYz4gbmVnICAlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTA2NjI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgY29tbW9uICh2OCBvciB2OSkgc3ludGhldGljIGluc25zCi0JLnRleHQKLWZvbzoKLQlub3QgJWcxLCVnMgotCW5vdCAlZzEKLQluZWcgJWcxLCVnMgotCW5lZyAlZzEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2YzhjOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy9zeW50aDY0LmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyIC0tcHJlZml4LWFkZHJlc3NlcwotI25hbWU6IHNwYXJjNjQgc3ludGg2NAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qc3BhcmMuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotMCswMDAwIDxmb28tKDB4fCk0PiBpcHJlZmV0Y2ggIDArMDAwNCA8Zm9vPgotMCswMDA0IDxmb28+IHNpZ254ICAlZzEsICVnMgotMCswMDA4IDxmb29cKygweHwpND4gY2xydXcgICVnMSwgJWcyCi0wKzAwMGMgPGZvb1wrKDB4fCk4PiBjYXMgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxMCA8Zm9vXCsoMHh8KWM+IGNhc2wgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxNCA8Zm9vXCsoMHh8KTEwPiBjYXN4ICBcWyAlZzEgXF0sICVnMiwgJWczCi0wKzAwMTggPGZvb1wrKDB4fCkxND4gY2FzeGwgIFxbICVnMSBcXSwgJWcyLCAlZzMKLTArMDAxYyA8Zm9vXCsoMHh8KTE4PiBjbHJ4ICBcWyAlZzEgXCsgJWcyIFxdCi0wKzAwMjAgPGZvb1wrKDB4fCkxYz4gY2xyeCAgXFsgJWcxIFxdCi0wKzAwMjQgPGZvb1wrKDB4fCkyMD4gY2xyeCAgXFsgJWcxIFwrIDEgXF0KLTArMDAyOCA8Zm9vXCsoMHh8KTI0PiBjbHJ4ICBcWyAlZzEgXCsgMHgyYSBcXQotMCswMDJjIDxmb29cKygweHwpMjg+IGNscnggIFxbIDB4NDIgXF0KLTArMDAzMCA8Zm9vXCsoMHh8KTJjPiBzaWdueCAgJWcxCi0wKzAwMzQgPGZvb1wrKDB4fCkzMD4gY2xydXcgICVnMgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvc3ludGg2NC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2FiODczLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3N5bnRoNjQucworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMgc3BhcmM2NCBzeW50aGV0aWMgaW5zbnMKLQkudGV4dAotCWlwcmVmZXRjaCBmb28KLWZvbzoKLQlzaWdueCAlZzEsJWcyCi0JY2xydXcgJWcxLCVnMgotCWNhcyBbJWcxXSwlZzIsJWczCi0JY2FzbCBbJWcxXSwlZzIsJWczCi0JY2FzeCBbJWcxXSwlZzIsJWczCi0JY2FzeGwgWyVnMV0sJWcyLCVnMwotCi0JY2xyeCBbJWcxKyVnMl0KLQljbHJ4IFslZzFdCi0JY2xyeCBbJWcxKzFdCi0JY2xyeCBbNDIrJWcxXQotCWNscnggWzB4NDJdCi0KLQlzaWdueCAlZzEKLQljbHJ1dyAlZzIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3NwYXJjL3dycHIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzYzgwZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jYXM6IC02NCAtQXY5Ci0jb2JqZHVtcDogLWRyCi0jbmFtZTogc3BhcmM2NCB3cnByCi0KLS4qOiArZmlsZSBmb3JtYXQgLipzcGFyYy4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTArIDwudGV4dD46Ci0gICAwOgk4MSA5MCA0MCAwMCAJd3JwciAgJWcxLCAldHBjCi0gICA0Ogk4MyA5MCA4MCAwMCAJd3JwciAgJWcyLCAldG5wYwotICAgODoJODUgOTAgYzAgMDAgCXdycHIgICVnMywgJXRzdGF0ZQotICAgYzoJODcgOTEgMDAgMDAgCXdycHIgICVnNCwgJXR0Ci0gIDEwOgk4OSA5MSA0MCAwMCAJd3JwciAgJWc1LCAldGljawotICAxNDoJOGIgOTEgODAgMDAgCXdycHIgICVnNiwgJXRiYQotICAxODoJOGQgOTEgYzAgMDAgCXdycHIgICVnNywgJXBzdGF0ZQotICAxYzoJOGYgOTIgMDAgMDAgCXdycHIgICVvMCwgJXRsCi0gIDIwOgk5MSA5MiA0MCAwMCAJd3JwciAgJW8xLCAlcGlsCi0gIDI0Ogk5MyA5MiA4MCAwMCAJd3JwciAgJW8yLCAlY3dwCi0gIDI4Ogk5NSA5MiBjMCAwMCAJd3JwciAgJW8zLCAlY2Fuc2F2ZQotICAyYzoJOTcgOTMgMDAgMDAgCXdycHIgICVvNCwgJWNhbnJlc3RvcmUKLSAgMzA6CTk5IDkzIDQwIDAwIAl3cnByICAlbzUsICVjbGVhbndpbgotICAzNDoJOWIgOTMgODAgMDAgCXdycHIgICVzcCwgJW90aGVyd2luCi0gIDM4Ogk5ZCA5MyBjMCAwMCAJd3JwciAgJW83LCAld3N0YXRlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy9zcGFyYy93cnByLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3ZmQ0NTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3BhcmMvd3Jwci5zCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBUZXN0IHdycHIKLQkudGV4dAotCXdycHIgJWcxLCV0cGMKLQl3cnByICVnMiwldG5wYwotCXdycHIgJWczLCV0c3RhdGUKLQl3cnByICVnNCwldHQKLQl3cnByICVnNSwldGljawotCXdycHIgJWc2LCV0YmEKLQl3cnByICVnNywlcHN0YXRlCi0Jd3JwciAlbzAsJXRsCi0Jd3JwciAlbzEsJXBpbAotCXdycHIgJW8yLCVjd3AKLQl3cnByICVvMywlY2Fuc2F2ZQotCXdycHIgJW80LCVjYW5yZXN0b3JlCi0Jd3JwciAlbzUsJWNsZWFud2luCi0Jd3JwciAlbzYsJW90aGVyd2luCi0Jd3JwciAlbzcsJXdzdGF0ZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3N1bjQvYWRkZW5kLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZmY0NTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSNvYmpkdW1wOiAtcgotIyBuYW1lIDogYWRkZW5kcwotLio6ICtmaWxlIGZvcm1hdCBhLm91dC1zdW5vcy1iaWcKLQotUkVMT0NBVElPTiBSRUNPUkRTIEZPUiBcWy50ZXh0XF06Ci1PRkZTRVQgICBUWVBFICtWQUxVRSAKLTArMDggV0RJU1AyMiArZm9vMVwrMHhmK2ZjCi0wKzBjIFdESVNQMjIgK2ZvbzFcKzB4ZitmOAotMCsxMCBXRElTUDIyICtmb28xXCsweGYrZjAKLTArMTQgV0RJU1AyMiArZm9vMVwrMHhmK2VjCi0wKzFjIDMyICtmb28xCi0wKzIwIDMyICtmb28xXCsweDArNAotIzArMjAgMzIgK2ZvbzFcKzB4MCs0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2I0NmUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jCi0jIFN1bk9TNCBvbiBTUEFSQyB0ZXN0cwotIwotCi1pZiBbaXN0YXJnZXQgc3BhcmMtKi1zdW5vczQqXSB0aGVuIHsKLSAgICBydW5fZHVtcF90ZXN0ICJhZGRlbmQiCi19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvc3VuNC9hZGRlbmQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlYjEwOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy9zdW40L2FkZGVuZC5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotCS5nbG9iYWwgZm9vCi1mb286Ci0Jbm9wCi0Jbm9wCi0JYmEgZm9vMSsweDQKLQliYSBmb28xKzB4NAotCWJhIGZvbzEKLQliYSBmb28xCi0Jbm9wCi0JLndvcmQgZm9vMQotCS53b3JkIGZvbzErNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGVtcGxhdGUgYi9nYXMvdGVzdHN1aXRlL2dhcy90ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0ZDc5ZS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSMKLSMgVGhpcyBpcyBzb3J0IG9mIGEgcHJvdG90eXBlIHRlc3QgY2FzZSwgd2hpY2ggcGFyc2VzIHRoZSBsaXN0aW5nIG91dHB1dAotIyBmcm9tIHRoZSBhc3NlbWJsZXIuICBMYXRlciwgbW9yZSBwcm90b3R5cGVzIHNob3VsZCBiZSBhZGRlZCBmb3IgY2FzZXMKLSMgd2hlcmUgb2JqZHVtcCBnZXRzIHJ1biBvdmVyIHRoZSAubyBmaWxlLCBhbmQgYW55dGhpbmcgZWxzZSBsaWtlIHRoYXQuLi4KLSMKLSMgV2hlbiB5b3Ugd3JpdGUgYSB0ZXN0IGNhc2UgdGhhdCB1c2VzIHRoZSBsaXN0aW5nIG91dHB1dCwganVzdCBjb3B5IHRoaXMKLSMgZmlsZSAodHJpbW1pbmcgZG93biB0aGUgb3Zlcmx5LXZlcmJvc2UgY29tbWVudHMgYSBsaXR0bGUpLCBhbmQKLSMgYWRqdXN0IGl0IHRvIGRvIHdoYXQgeW91IG5lZWQuCi0jCi0jIFJlbWVtYmVyIHRoYXQgYW55ICIuZXhwIiBmaWxlIGZvdW5kIGluIHRoZSB0cmVlIHdpbGwgYmUgcHJvY2Vzc2VkIGJ5Ci0jIGRlamFnbnUuCi0KLSMKLSMgRklSU1QgU0FNUExFIFRFU1QgQ0FTRQotIwotCi1wcm9jIGRvX2ZvbyB7fSB7Ci0jIFRoaXMgc3RyaW5nIGlzIHVzZWQgYmVsb3cgd2hlbiBwcmludGluZyBvdXQgYSBzdWNjZXNzIG9yIGZhaWx1cmUgbWVzc2FnZS4KLSMgSWYgbW9yZSB0aGFuIG9uZSB0ZXN0IGlzIHJ1biBieSBhIGdpdmVuIC5leHAgZmlsZSwgaXQnZCBiZSBuaWNlIHRvIGluY2x1ZGUKLSMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUuCi0gICAgc2V0IHRlc3RuYW1lICJmb28uczogbXVsdGktcmVnaXN0ZXIgdHdlYWtpbmcgYW5kIGZyb2JuaWNhdGlvbiIKLQotIyBJIHVzZSB0aGlzIGFzIGEgZmxhZyB0byByZWNvcmQgd2hldGhlciB0aGUgdGVzdCBjYXNlIHBhc3NlZC4gIElmIHRoaXMKLSMgZmxhZyBpcyBzdGlsbCBjbGVhciB3aGVuIEVPRiBpcyByZWFjaGVkLCB0aGlzIHRlc3QgZmFpbHMuICBJZiB0aGVyZSBhcmUKLSMgdHdvIG9yIG1vcmUgcGF0dGVybnMsIGFuZCBJIG5lZWQgdG8gc2VlIGFsbCBvZiB0aGVtLCBJJ2xsIGNyZWF0ZSBOIHZhcmlhYmxlcwotIyBhbmQgY2hlY2sgaWYgdGhlIHN1bSBpcyBOLgotICAgIHNldCB4IDAKLQotIyBDYWxsIGdhc19zdGFydCB3aXRoIHR3byBhcmd1bWVudHM6IFRoZSBpbnB1dCBmaWxlIG5hbWUgKHdoaWNoIGl0J2xsIHNlYXJjaAotIyBmb3IgaW4gJHNyY2Rpci8kc3ViZGlyLCB0aGF0IGlzLCB0aGUgc291cmNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgLmV4cCBmaWxlCi0jIGlzKSwgYW5kIGEgKHBvc3NpYmx5IGVtcHR5KSBzdHJpbmcgb2Ygb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBhc3NlbWJsZXIuCi0gICAgZ2FzX3N0YXJ0ICJmb28ucyIgIi1hbCIKLQotIyBOb3cgSSBqdXN0IGl0ZXJhdGUgb3ZlciBhbGwgdGhlIG91dHB1dCBsaW5lcywgbG9va2luZyBmb3Igd2hhdCBJIHdhbnQKLSMgdG8gc2VlLiAgU2luY2UgZWFjaCBwYXR0ZXJuIGV4cGxpY2l0bHkgd2lsbCBub3Qgc3BhbiBsaW5lIGJyZWFrcywgdGhlcmUncwotIyBhbHNvIGEgcGF0dGVybiBmb3IgbGluZXMgdGhhdCBkb24ndCBtYXRjaCBhbnl0aGluZyBlbHNlLiAgIChJcyBpdCBzYWZlIHRvCi0jIHVzZSAiLioiIGZvciBwYXR0ZXJucyBub3QgY3Jvc3NpbmcgbGluZSBicmVha3M/IEkgZG9uJ3QgdGhpbmsgIiQiIGRvZXMgdGhlCi0jIHJpZ2h0IHRoaW5nIGZvciB0aGF0LCBpbiBhbnkgY2FzZS4gIEkgc2hvdWxkIGNoZWNrIGludG8gd2hldGhlciB0aGUgZXh0cmEKLSMgcGF0dGVybiBpcyBldmVuIG5lZWRlZC4KLQotIyBBcHBhcmVudGx5IENSTEYgaXMgcmVjZWl2ZWQgd2hlbiB1c2luZyBwdHlzIGZvciBzdWJwcm9jZXNzZXM7IGhlbmNlIHRoZQotIyBcclxuIGZvciBtYXRjaGluZyBsaW5lIG51bWJlciAzLgotCi0jIE5vdGUgdGhhdCBpZiB5b3UgdXNlICJ7IC4uLiB9IiBmb3IgdGhlIGV4cGVjdCBjbGF1c2UsIHlvdSBjYW4ndCBoYXZlCi0jIGNvbW1lbnRzIGluc2lkZSBpdC4KLQotIyBUaGlzIHRlc3QgY2FzZSBpcyBraW5kYSBib2d1cyBpbiB0aGF0IHNlZWluZyBlaXRoZXIgYSB3b3JkIG9mIGFsbCB6ZXJvcwotIyBhdCBhZGRyZXNzIHplcm8gb3IgYSBDLXN0eWxlIGNvbW1lbnQgb24gbGluZSB0aHJlZSB0aGF0IHNheXMgIkxvb2tpbmcgZm9yCi0jIEMgY29tbWVudHMiICh3aXRoIHZlcnkgc3BlY2lmaWMgcHVuY3R1YXRpb24gYW5kIHdoaXRlc3BhY2UpIHdpbGwgY2F1c2UKLSMgaXQgdG8gcGFzcyB0aGlzIHRlc3QuICBVc3VhbGx5IAotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwMDAwMDAwMFxbXlxuXF0qXG4iCQl7IHNldCB4IDEgfQotCSAgICAtcmUgIl4gKzNcWyBcdFxdKy8uIExvb2tpbmcgZm9yIEMgY29tbWVudHMuIC4vXHJcbiIJeyBzZXQgeCAxIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0jIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQgaXNuJ3QKLSMgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmICR4IHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLSMgTm93IGFjdHVhbGx5IHJ1biB0aGUgdGVzdC4gIEl0IGNhbiBiZSBjb25kaXRpb25hbGl6ZWQgaWYgdGhlIHRlc3QgaXMKLSMgbm90IGFwcHJvcHJpYXRlIGZvciBhbGwgdGFyZ2V0cy4gIFRoZSBwcm9jICJpc3RhcmdldCIgY2hlY2tzIGEgZ2VuZXJhbGl6ZWQKLSMgZm9ybSBvZiB0aGUgdGFyZ2V0IG5hbWUsIHNvIHRoYXQgKGUuZy4pICJtNjgzMzItdW5rbm93bi1hb3V0IiB3b3VsZCBtYXRjaAotIyBoZXJlLiAgU28gZmFyLCBJIHRoaW5rIG9ubHkgdGhlIENQVSBuYW1lIGlzIGFjdHVhbGx5IGV2ZXIgYWx0ZXJlZC4KLWlmIFtpc3RhcmdldCBtNjhrLSpdIHRoZW4gewotICAgIGRvX2ZvbwotfQotCi0KLQotCi0jCi0jIFNFQ09ORCBTQU1QTEUgVEVTVCBDQVNFCi0jCi0KLSMgVGhpcyBpcyBhIHRpbnkgYml0IGxpa2UgdGhlIEMgY29tcGlsZXIgdG9ydHVyZSB0ZXN0cywgaW4gdGhhdCBpdCdsbCBydW4KLSMgdGhlIGFzc2VtYmxlciB3aXRoIHRoZSBwb3dlciBzZXQgb2YgdGhlIGxpc3Qgb2Ygb3B0aW9ucyBzdXBwbGllZC4KLSMKLSMgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSB0ZXN0IGZpbGUgbmFtZTsgdGhlIHNlY29uZCBpcyBhcmd1bWVudHMgdGhhdAotIyBhcmUgYWx3YXlzIHRvIGJlIHByb3ZpZGVkOyB0aGUgdGhpcmQgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBvcHRpb25zCi0jIHdoaWNoIGFyZSBvcHRpb25hbCAoZW5kaW5nIGluICI+IiBpZiBvdXRwdXQgc2hvdWxkIGJlIGlnbm9yZWQsIGxpa2UgIi1hPiIpOwotIyB0aGUgZm91cnRoIGlzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0LiAgU28gZmFyLCBvbmx5IGJpbmFyeSBvcHRpb25zIGFyZSBoYW5kbGVkCi0jIHRoaXMgd2F5OyBOLXdheSBvcHRpb25zIChsaWtlIENQVSB0eXBlIGZvciBtNjhrKSBhcmVuJ3QgaGFuZGxlZCB5ZXQuCi0jCi0jIFRoZSB2YXJpYWJsZSAkc3Rkb3B0bGlzdCB1c3VhbGx5IGhhcyBhIHJlYXNvbmFibGUgc2V0IG9mIG9wdGlvbmFsIG9wdGlvbnMKLSMgZm9yIHRoaXMgdGFyZ2V0LgotCi0jIE5vLCBQSUMgaXNuJ3Qgc3VwcG9ydGVkIHlldC4gIFRoaXMgaXMgb25seSBhbiBleGFtcGxlLgotZ2FzX3Rlc3QgInF1dXgucyIgIi1LIiAkc3Rkb3B0bGlzdCAidXNlIG9mIHF1dXhlcyBpbiBQSUMgbW9kZSIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZWM3MDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLmQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBzaWduZWQgYW5kIHVuc2lnbmVkIGFkZCBpbnN0cnVjdGlvbnMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTBhIDAwIGZiIDYyLioKLSAgIDQ6CWZmIDNmIGFjIDIwLioKLSAgIDg6CTAwIDQwIDJjIDIxLioKLSAgIGM6CTAwIDEwIDdiIDMxIDAwIDQwIDAwIDAwLioKLSAgMTQ6CTAwIDEwIGZiIDQxIGZmIGJmIGZmIGZmLioKLSAgMWM6CTAwIDEwIGJiIDVhIGZmIGZmIGZmIDdmLioKLSAgMjQ6CTAwIDEwIDNiIDZiIDAwIDAwIDAwIDgwLioKLSAgMmM6CTBhIDIwIGZiIDYyLioKLSAgMzA6CWZmIGJmIGFjIDIwLioKLSAgMzQ6CTAwIGMwIDJjIDIxLioKLSAgMzg6CTAwIDMwIDdiIDMxIDAwIDQwIDAwIDAwLioKLSAgNDA6CTAwIDMwIGZiIDQxIGZmIGJmIGZmIGZmLioKLSAgNDg6CTAwIDMwIGJiIDVhIGZmIGZmIGZmIDdmLioKLSAgNTA6CTAwIDMwIDNiIDZiIDAwIDAwIDAwIDgwLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hZGQubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJiMzY4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMjA6MTM6MzMgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1hZGQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOyBUZXN0IHNpZ25lZCBhbmQgdW5zaWduZWQgYWRkaXRpb24gaW5zdHJ1Y3Rpb24uCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7IFRlc3QgYm91bmRhcnkgY29uZGl0aW9ucyB0byBlbnN1cmUgcHJvcGVyIGhhbmRsaW5nLgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOyBOb3RlIHRoYXQgdW5zaWduZWQgYWRkaXRpb24gc3RpbGwgdXNlcyBzaWduZWQgaW1tZWRpYXRlcy4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1IDAwMDAwMDAwICAgNjJGQjAwMEEgICAgICAgICBhZGQgICAgIHIxMCxyMTEscjEyICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA2IDAwMDAwMDA0ICAgMjBBQzNGRkYgICAgICAgICBhZGQgICAgIDE2MzgzLHIyLHI0ICAgICAgICAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgIDcgMDAwMDAwMDggICAyMTJDNDAwMCAgICAgICAgIGFkZCAgICAgLTE2Mzg0LHI0LHI0ICAgICAgICAgICAgOyBNaW5pbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgOCAwMDAwMDAwQyAgIDMxN0IxMDAwICAgICAgICAgYWRkICAgICAxNjM4NCxyNSxyNiAgICAgICAgICAgICA7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgICAgMDAwMDAwMTAgICAwMDAwNDAwMCAKLSAgICAgICAgOSAwMDAwMDAxNCAgIDQxRkIxMDAwICAgICAgICAgYWRkICAgICAtMTYzODUscjcscjggICAgICAgICAgICA7IE1heGltdW0gbmVnYXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDE4ICAgRkZGRkJGRkYgCi0gICAgICAgMTAgMDAwMDAwMUMgICA1QUJCMTAwMCAgICAgICAgIGFkZCAgICAgMjE0NzQ4MzY0NyxyMTAscjExICAgICAgOyBNYXhpbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDIwICAgN0ZGRkZGRkYgCi0gICAgICAgMTEgMDAwMDAwMjQgICA2QjNCMTAwMCAgICAgICAgIGFkZCAgICAgLTIxNDc0ODM2NDgscjEyLHIxMyAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDI4ICAgODAwMDAwMDAgCi0gICAgICAgMTIgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxMyAwMDAwMDAyQyAgIDYyRkIyMDBBICAgICAgICAgYWRkdSAgICByMTAscjExLHIxMiAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICAxNCAwMDAwMDAzMCAgIDIwQUNCRkZGICAgICAgICAgYWRkdSAgICAxNjM4MyxyMixyNCAgICAgICAgICAgICA7IE1heGltdW0gcG9zaXRpdmUgc2hvcnQgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgIDE1IDAwMDAwMDM0ICAgMjEyQ0MwMDAgICAgICAgICBhZGR1ICAgIC0xNjM4NCxyNCxyNCAgICAgICAgICAgIDsgTWluaW11bSBuZWdhdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0gICAgICAgMTYgMDAwMDAwMzggICAzMTdCMzAwMCAgICAgICAgIGFkZHUgICAgMTYzODQscjUscjYgICAgICAgICAgICAgOyBNaW5pbXVtIHBvc2l0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotICAgICAgICAgIDAwMDAwMDNDICAgMDAwMDQwMDAgCi0gICAgICAgMTcgMDAwMDAwNDAgICA0MUZCMzAwMCAgICAgICAgIGFkZHUgICAgLTE2Mzg1LHI3LHI4ICAgICAgICAgICAgOyBNYXhpbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDA0NCAgIEZGRkZCRkZGIAotICAgICAgIDE4IDAwMDAwMDQ4ICAgNUFCQjMwMDAgICAgICAgICBhZGR1ICAgIDIxNDc0ODM2NDcscjEwLHIxMSAgICAgIDsgTWF4aW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDA0QyAgIDdGRkZGRkZGIAotICAgICAgIDE5IDAwMDAwMDUwICAgNkIzQjMwMDAgICAgICAgICBhZGR1ICAgIC0yMTQ3NDgzNjQ4LHIxMixyMTMgICAgIDsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLSAgICAgICAgICAwMDAwMDA1NCAgIDgwMDAwMDAwIAotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FkZC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjI5ZWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWRkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi07IFRlc3Qgc2lnbmVkIGFuZCB1bnNpZ25lZCBhZGRpdGlvbiBpbnN0cnVjdGlvbi4KLTsgVGVzdCBib3VuZGFyeSBjb25kaXRpb25zIHRvIGVuc3VyZSBwcm9wZXIgaGFuZGxpbmcuCi07IE5vdGUgdGhhdCB1bnNpZ25lZCBhZGRpdGlvbiBzdGlsbCB1c2VzIHNpZ25lZCBpbW1lZGlhdGVzLgotCi0JYWRkCXIxMCxyMTEscjEyCQk7IFJlZ2lzdGVyIGZvcm0KLQlhZGQJMTYzODMscjIscjQJCTsgTWF4aW11bSBwb3NpdGl2ZSBzaG9ydCBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCS0xNjM4NCxyNCxyNAkJOyBNaW5pbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLQlhZGQJMTYzODQscjUscjYJCTsgTWluaW11bSBwb3NpdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLQlhZGQJLTE2Mzg1LHI3LHI4CQk7IE1heGltdW0gbmVnYXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCTIxNDc0ODM2NDcscjEwLHIxMQk7IE1heGltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkCS0yMTQ3NDgzNjQ4LHIxMixyMTMJOyBNaW5pbXVtIG5lZ2F0aXZlIGxvbmcgc2lnbmVkIGltbWVkaWF0ZQotCi0JYWRkdQlyMTAscjExLHIxMgkJOyBSZWdpc3RlciBmb3JtCi0JYWRkdQkxNjM4MyxyMixyNAkJOyBNYXhpbXVtIHBvc2l0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLQlhZGR1CS0xNjM4NCxyNCxyNAkJOyBNaW5pbXVtIG5lZ2F0aXZlIHNob3J0IHNpZ25lZCBpbW1lZGlhdGUKLQlhZGR1CTE2Mzg0LHI1LHI2CQk7IE1pbmltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQktMTYzODUscjcscjgJCTsgTWF4aW11bSBuZWdhdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKLQlhZGR1CTIxNDc0ODM2NDcscjEwLHIxMQk7IE1heGltdW0gcG9zaXRpdmUgbG9uZyBzaWduZWQgaW1tZWRpYXRlCi0JYWRkdQktMjE0NzQ4MzY0OCxyMTIscjEzCTsgTWluaW11bSBuZWdhdGl2ZSBsb25nIHNpZ25lZCBpbW1lZGlhdGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY5NjEwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCAuYWxpZ24gcHNldWRvIG9wCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOglhYiAwMCAwMCAwMC4qCi0gICA0OgljZCAwMCBlZiAwMC4qCi0gICA4OglmMSAwMCAwMCAwMC4qCi0gICBjOgllZSAwMCAwMCAwMC4qCi0gIDEwOglhYyAwMCAwMCAwMC4qCi0gIDE0OgkwMCAwMCAwMCAwMC4qCi0gIDE4OglhYiAwMCAwMCAwMC4qCi0gIDFjOgkwMCAwMCAwMCAwMC4qCi0gIDIwOglmZSAwMCAwMCAwMC4qCi0JXC5cLlwuCi0gIDMwOglkZSBhZCBiZSBlZi4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9hbGlnbi5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTQxNWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ubHN0CisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBUaHUgRmViIDI3IDE3OjAyOjIzIDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYWxpZ24ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7ICAgICAgVGVzdCB0aGUgLmFsaWduIGRpcmVjdGl2ZS4KLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAzIDAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAudGV4dAotICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQjAwMDAwMAotICAgICAgICA2IDAwMDAwMDAwICAgQUIgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUIKLSAgICAgICAgNyAwMDAwMDAwMSAgICAgICAgICAgICAgICAgICAgLmFsaWduICAgICAgICAgICAgICAgICAgOyBTaG91bGQgZGVmYXVsdCB0byA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgIDggICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhDRDAwRUYwMAotICAgICAgIDEwIDAwMDAwMDA0ICAgQ0QgICAgICAgICAgICAgICAuYnl0ZSAgIDB4Q0QKLSAgICAgICAxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsaWduICAyICAgICAgICAgICAgICAgOyAgU2hvdWxkIGFsaWduIHRvIHRoZSBuZXh0IDItYnl0ZSBib3VuZGFyeSAocGFkIHdpdGggb25lIG51bGwgYnl0Ci0gICAgICAgMTIgMDAwMDAwMDYgICBFRiAgICAgICAgICAgICAgIC5ieXRlICAgMHhFRgotICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDEKLSAgICAgICAxNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEYxMDAwMDAwCi0gICAgICAgMTYgMDAwMDAwMDcgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgNCAgICAgICAgICAgICAgIDsgIFNob3VsZCBub3QgYWZmZWN0IGFsaWdubWVudCAoYWxyZWFkeSBvbiA0KQotICAgICAgIDE3IDAwMDAwMDA4ICAgRjEgICAgICAgICAgICAgICAuYnl0ZSAgIDB4RjEKLSAgICAgICAxOCAwMDAwMDAwOSAgICAgICAgICAgICAgICAgICAgLmFsaWduICA0ICAgICAgICAgICAgICAgOyAgU2hvdWxkIGFsaWduIHRvIG5leHQgNCBieXRlIGJvdW5kYXJ5Ci0gICAgICAgMTkgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhFRTAwMDAwMCBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBvbiA0IGJ5dGUgYWxpZ25tZW50Ci0gICAgICAgMjEgMDAwMDAwMEMgICBFRSAgICAgICAgICAgICAgIC5ieXRlIDB4RUUKLSAgICAgICAyMiAwMDAwMDAwRCAgICAgICAgICAgICAgICAgICAgLmFsaWduICA4Ci0gICAgICAgMjMgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhBQzAwMDAwMCAweDAwMDAwMDAwCi0gICAgICAgMjUgMDAwMDAwMTAgICBBQyAgICAgICAgICAgICAgIC5ieXRlICAgMHhBQwotICAgICAgIDI2IDAwMDAwMDExICAgICAgICAgICAgICAgICAgICAuYWxpZ24gIDgKLSAgICAgICAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAgMHgwMDAwMDAwMCBzaW5jZSB3ZSBhcmUgYXQgOCBieXRlIGFsaWdubWVudAotICAgICAgIDI5IDAwMDAwMDE4ICAgQUIgICAgICAgICAgICAgICAuYnl0ZSAgIDB4QUIKLSAgICAgICAzMCAwMDAwMDAxOSAgICAgICAgICAgICAgICAgICAgLmFsaWduICAxNgotICAgICAgIDMxICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4RkUwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAwMDAKLSAgICAgICAzMyAwMDAwMDAyMCAgIEZFICAgICAgICAgICAgICAgLmJ5dGUgICAweEZFCi0gICAgICAgMzQgMDAwMDAwMjEgICAgICAgICAgICAgICAgICAgIC5hbGlnbiAgMTYKLSAgICAgICAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoaXMganVzdCBmb3JjZXMgdGhlIGRpc2Fzc2VtYmxlciB0byBub3QgcHJpbnQgLi4uIGZvciB0cmFpbGluZyBudWxscwotICAgICAgIDM3IDAwMDAwMDMwICAgREUgICAgICAgICAgICAgICAuYnl0ZSAweERFLCAweEFELCAweEJFLCAweEVGCi0gICAgICAgICAgMDAwMDAwMzEgICBBRCAgICAgICAKLSAgICAgICAgICAwMDAwMDAzMiAgIEJFICAgICAgIAotICAgICAgICAgIDAwMDAwMDMzICAgRUYgICAgICAgCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2FsaWduLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYzEyNTYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYWxpZ24ucworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTs7CVRlc3QgdGhlIC5hbGlnbiBkaXJlY3RpdmUuCi0KLQkudGV4dAotCQotCTs7IFRoaXMgc2hvdWxkIGdlbmVyYXRlIDB4QUIwMDAwMDAKLQkuYnl0ZQkweEFCCi0JLmFsaWduCQkJOyBTaG91bGQgZGVmYXVsdCB0byA0IGJ5dGUgYWxpZ25tZW50Ci0KLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweENEMDBFRjAwCi0JLmJ5dGUJMHhDRAotCS5hbGlnbgkyCQk7ICBTaG91bGQgYWxpZ24gdG8gdGhlIG5leHQgMi1ieXRlIGJvdW5kYXJ5IChwYWQgd2l0aCBvbmUgbnVsbCBieXRlKQotCS5ieXRlCTB4RUYKLQkuYWxpZ24JMQotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhGMTAwMDAwMAotCS5hbGlnbgk0CQk7ICBTaG91bGQgbm90IGFmZmVjdCBhbGlnbm1lbnQgKGFscmVhZHkgb24gNCkKLQkuYnl0ZQkweEYxCi0JLmFsaWduCTQJCTsgIFNob3VsZCBhbGlnbiB0byBuZXh0IDQgYnl0ZSBib3VuZGFyeQotCi0JOzsgVGhpcyBzaG91bGQgZ2VuZXJhdGUgMHhFRTAwMDAwMCBzaW5jZSB3ZSBhcmUgYWxyZWFkeSBvbiA0IGJ5dGUgYWxpZ25tZW50Ci0JLmJ5dGUgMHhFRQotCS5hbGlnbgk4Ci0KLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFDMDAwMDAwIDB4MDAwMDAwMDAKLQkuYnl0ZQkweEFDCi0JLmFsaWduCTgKLQkKLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEFCMDAwMDAwIDB4MDAwMDAwMDAgc2luY2Ugd2UgYXJlIGF0IDggYnl0ZSBhbGlnbm1lbnQKLQkuYnl0ZQkweEFCCi0JLmFsaWduCTE2Ci0KLQk7OyBUaGlzIHNob3VsZCBnZW5lcmF0ZSAweEZFMDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwMDAwCi0JLmJ5dGUJMHhGRQotCS5hbGlnbgkxNgotCQotCTs7IFRoaXMganVzdCBmb3JjZXMgdGhlIGRpc2Fzc2VtYmxlciB0byBub3QgcHJpbnQgLi4uIGZvciB0cmFpbGluZyBudWxscwotCS5ieXRlIDB4REUsIDB4QUQsIDB4QkUsIDB4RUYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYWVlOGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmQKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBjb3ZlcmFnZSBvZiBzeW1ib2xpYyBCSVROVU0gdmFsdWVzCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwYSA0MCAzOSBmYS4qCi0gICA0OgkwYSA0MCAzOSBmMi4qCi0gICA4OgkwYSA0MCAzOSBlYS4qCi0gICBjOgkwYSA0MCAzOSBlMi4qCi0gIDEwOgkwYSA0MCAzOSBkYS4qCi0gIDE0OgkwYSA0MCAzOSBkMi4qCi0gIDE4OgkwYSA0MCAzOSBjYS4qCi0gIDFjOgkwYSA0MCAzOSBjMi4qCi0gIDIwOgkwYSA0MCAzOSBiYS4qCi0gIDI0OgkwYSA0MCAzOSBiMi4qCi0gIDI4OgkwYSA0MCAzOSBhYS4qCi0gIDJjOgkwYSA0MCAzOSBhMi4qCi0gIDMwOgkwYSA0MCAzOSA5YS4qCi0gIDM0OgkwYSA0MCAzOSA5Mi4qCi0gIDM4OgkwYSA0MCAzOSA4YS4qCi0gIDNjOgkwYSA0MCAzOSA4Mi4qCi0gIDQwOgkwYSA0MCAzOSA3YS4qCi0gIDQ0OgkwYSA0MCAzOSA3Mi4qCi0gIDQ4OgkwYSA0MCAzOSA2YS4qCi0gIDRjOgkwYSA0MCAzOSA2Mi4qCi0gIDUwOgkwYSA0MCAzOSA1YS4qCi0gIDU0OgkwYSA0MCAzOSA1Mi4qCi0gIDU4OgkwYSA0MCAzOSA0YS4qCi0gIDVjOgkwYSA0MCAzOSA0Mi4qCi0gIDYwOgkwYSA0MCAzOSAzYS4qCi0gIDY0OgkwYSA0MCAzOSAzMi4qCi0gIDY4OgkwYSA0MCAzOSAyYS4qCi0gIDZjOgkwYSA0MCAzOSAyMi4qCi0gIDcwOgkwYSA0MCAzOSAxYS4qCi0gIDc0OgkwYSA0MCAzOSAxMi4qCi0gIDc4OgkwYSA0MCAzOSA1YS4qCi0gIDdjOgkwYSA0MCAzOSA1Mi4qCi0gIDgwOgkwYSA0MCAzOSA0YS4qCi0gIDg0OgkwYSA0MCAzOSA0Mi4qCi0gIDg4OgkwYSA0MCAzOSAzYS4qCi0gIDhjOgkwYSA0MCAzOSAzMi4qCi0gIDkwOgkwYSA0MCAzOSAyYS4qCi0gIDk0OgkwYSA0MCAzOSAyMi4qCi0gIDk4OgkwYSA0MCAzOSAxYS4qCi0gIDljOgkwYSA0MCAzOSAxMi4qCi0gIGEwOgkwYSA0MCAzOSAwYS4qCi0gIGE0OgkwYSA0MCAzOSAwMi4qCi0gIGE4OgkwYSA0MCAzOSBmYS4qCi0gIGFjOgkwYSA0MCAzOSBmMi4qCi0gIGIwOgkwYSA0MCAzOSBlYS4qCi0gIGI0OgkwYSA0MCAzOSBlMi4qCi0gIGI4OgkwYSA0MCAzOSBkYS4qCi0gIGJjOgkwYSA0MCAzOSBkMi4qCi0gIGMwOgkwYSA0MCAzOSBjYS4qCi0gIGM0OgkwYSA0MCAzOSBjMi4qCi0gIGM4OgkwYSA0MCAzOSBiYS4qCi0gIGNjOgkwYSA0MCAzOSBiMi4qCi0gIGQwOgkwYSA0MCAzOSBhYS4qCi0gIGQ0OgkwYSA0MCAzOSBhMi4qCi0gIGQ4OgkwYSA0MCAzOSA5YS4qCi0gIGRjOgkwYSA0MCAzOSA5Mi4qCi0gIGUwOgkwYSA0MCAzOSA4YS4qCi0gIGU0OgkwYSA0MCAzOSA4Mi4qCi0gIGU4OgkwYSA0MCAzOSA3YS4qCi0gIGVjOgkwYSA0MCAzOSA3Mi4qCi0gIGYwOgkwYSA0MCAzOSA2YS4qCi0gIGY0OgkwYSA0MCAzOSA2Mi4qCi0gIGY4OgkwYSA0MCAzOSA1YS4qCi0gIGZjOgkwYSA0MCAzOSA1Mi4qCi0gMTAwOgkwYSA0MCAzOSA0YS4qCi0gMTA0OgkwYSA0MCAzOSA0Mi4qCi0gMTA4OgkwYSA0MCAzOSAzYS4qCi0gMTBjOgkwYSA0MCAzOSAzMi4qCi0gMTEwOgkwYSA0MCAzOSAyYS4qCi0gMTE0OgkwYSA0MCAzOSAyMi4qCi0gMTE4OgkwYSA0MCAzOSAxYS4qCi0gMTFjOgkwYSA0MCAzOSAxMi4qCi0gMTIwOgkwYSA0MCAzOSAwYS4qCi0gMTI0OgkwYSA0MCAzOSAwMi4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvYml0bnVtLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjMjY4Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ubHN0CisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBTYXQgRmViIDIyIDIxOjM3OjE1IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotYml0bnVtLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRlc3QgdGhhdCBhbGwgdGhlIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciB0aGUgQklUTlVNIGZpZWxkCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7OyBhcmUgcHJvcGVybHkgYWNjZXB0ZWQgYW5kIHRyYW5zbGF0ZWQgdG8gbnVtZXJpYyB2YWx1ZXMuICBBbHNvCi0gICAgICAgIDMgICAgICAgICAgICAgICAgICAgICA7OyB2ZXJpZmllcyB0aGF0IHRoZXkgYXJlIGRpc2Fzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLCBhbmQKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIDs7IHRoYXQgdGhlIHJhdyBudW1lcmljIHZhbHVlcyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkgKHN0b3JlZCBhcwotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgOzsgdGhlIG9uZSdzIGNvbXBsZW1lbnQgb2YgdGhlIG9wZXJhbmQgbnVtZXJpYyB2YWx1ZS4KLSAgICAgICAgNiAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA3IDAwMDAwMDAwICAgRkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS5iICAgICA7ICh+MCAmIDB4MUYpCi0gICAgICAgIDggMDAwMDAwMDQgICBGMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmIgICAgIDsgKH4xICYgMHgxRikKLSAgICAgICAgOSAwMDAwMDAwOCAgIEVBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QuYiAgICAgOyAofjIgJiAweDFGKQotICAgICAgIDEwIDAwMDAwMDBDICAgRTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS5iICAgICA7ICh+MyAmIDB4MUYpCi0gICAgICAgMTEgMDAwMDAwMTAgICBEQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmIgICAgIDsgKH40ICYgMHgxRikKLSAgICAgICAxMiAwMDAwMDAxNCAgIEQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UuYiAgICAgOyAofjUgJiAweDFGKQotICAgICAgIDEzIDAwMDAwMDE4ICAgQ0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxoaS5iICAgICA7ICh+NiAmIDB4MUYpCi0gICAgICAgMTQgMDAwMDAwMUMgICBDMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxzLmIgICAgIDsgKH43ICYgMHgxRikKLSAgICAgICAxNSAwMDAwMDAyMCAgIEJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8uYiAgICAgOyAofjggJiAweDFGKQotICAgICAgIDE2IDAwMDAwMDI0ICAgQjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxocy5iICAgICA7ICh+OSAmIDB4MUYpCi0gICAgICAgMTcgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxOCAwMDAwMDAyOCAgIEFBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZXEuaCAgICAgOyAofjEwICYgMHgxRikKLSAgICAgICAxOSAwMDAwMDAyQyAgIEEyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbmUuaCAgICAgOyAofjExICYgMHgxRikKLSAgICAgICAyMCAwMDAwMDAzMCAgIDlBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ3QuaCAgICAgOyAofjEyICYgMHgxRikKLSAgICAgICAyMSAwMDAwMDAzNCAgIDkyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbGUuaCAgICAgOyAofjEzICYgMHgxRikKLSAgICAgICAyMiAwMDAwMDAzOCAgIDhBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHQuaCAgICAgOyAofjE0ICYgMHgxRikKLSAgICAgICAyMyAwMDAwMDAzQyAgIDgyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsZ2UuaCAgICAgOyAofjE1ICYgMHgxRikKLSAgICAgICAyNCAwMDAwMDA0MCAgIDdBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaGkuaCAgICAgOyAofjE2ICYgMHgxRikKLSAgICAgICAyNSAwMDAwMDA0NCAgIDcyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbHMuaCAgICAgOyAofjE3ICYgMHgxRikKLSAgICAgICAyNiAwMDAwMDA0OCAgIDZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsbG8uaCAgICAgOyAofjE4ICYgMHgxRikKLSAgICAgICAyNyAwMDAwMDA0QyAgIDYyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsaHMuaCAgICAgOyAofjE5ICYgMHgxRikKLSAgICAgICAyOCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDI5IDAwMDAwMDUwICAgNUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxlcS53ICAgICA7ICh+MjAgJiAweDFGKQotICAgICAgIDMwIDAwMDAwMDU0ICAgNTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxuZS53ICAgICA7ICh+MjEgJiAweDFGKQotICAgICAgIDMxIDAwMDAwMDU4ICAgNEEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxndC53ICAgICA7ICh+MjIgJiAweDFGKQotICAgICAgIDMyIDAwMDAwMDVDICAgNDIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsZS53ICAgICA7ICh+MjMgJiAweDFGKQotICAgICAgIDMzIDAwMDAwMDYwICAgM0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsdC53ICAgICA7ICh+MjQgJiAweDFGKQotICAgICAgIDM0IDAwMDAwMDY0ICAgMzIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxnZS53ICAgICA7ICh+MjUgJiAweDFGKQotICAgICAgIDM1IDAwMDAwMDY4ICAgMkEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxoaS53ICAgICA7ICh+MjYgJiAweDFGKQotICAgICAgIDM2IDAwMDAwMDZDICAgMjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxscy53ICAgICA7ICh+MjcgJiAweDFGKQotICAgICAgIDM3IDAwMDAwMDcwICAgMUEzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxsby53ICAgICA7ICh+MjggJiAweDFGKQotICAgICAgIDM4IDAwMDAwMDc0ICAgMTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCxocy53ICAgICA7ICh+MjkgJiAweDFGKQotICAgICAgIDM5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgNDAgMDAwMDAwNzggICA1QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGVxLmYgICAgIDsgKH4yMCAmIDB4MUYpCi0gICAgICAgNDEgMDAwMDAwN0MgICA1MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG5lLmYgICAgIDsgKH4yMSAmIDB4MUYpCi0gICAgICAgNDIgMDAwMDAwODAgICA0QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGd0LmYgICAgIDsgKH4yMiAmIDB4MUYpCi0gICAgICAgNDMgMDAwMDAwODQgICA0MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGxlLmYgICAgIDsgKH4yMyAmIDB4MUYpCi0gICAgICAgNDQgMDAwMDAwODggICAzQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGx0LmYgICAgIDsgKH4yNCAmIDB4MUYpCi0gICAgICAgNDUgMDAwMDAwOEMgICAzMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGdlLmYgICAgIDsgKH4yNSAmIDB4MUYpCi0gICAgICAgNDYgMDAwMDAwOTAgICAyQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG91LmYgICAgIDsgKH4yNiAmIDB4MUYpCi0gICAgICAgNDcgMDAwMDAwOTQgICAyMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGluLmYgICAgIDsgKH4yNyAmIDB4MUYpCi0gICAgICAgNDggMDAwMDAwOTggICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LGliLmYgICAgIDsgKH4yOCAmIDB4MUYpCi0gICAgICAgNDkgMDAwMDAwOUMgICAxMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG9iLmYgICAgIDsgKH4yOSAmIDB4MUYpCi0gICAgICAgNTAgMDAwMDAwQTAgICAwQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LHVvLmYgICAgIDsgKH4zMCAmIDB4MUYpCi0gICAgICAgNTEgMDAwMDAwQTQgICAwMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LG9yLmYgICAgIDsgKH4zMSAmIDB4MUYpCi0gICAgICAgNTIgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICA1MyAwMDAwMDBBOCAgIEZBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsMAotICAgICAgIDU0IDAwMDAwMEFDICAgRjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwxCi0gICAgICAgNTUgMDAwMDAwQjAgICBFQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFNhdCBGZWIgMjIgMjE6Mzc6MTUgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1iaXRudW0ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgIDU2IDAwMDAwMEI0ICAgRTIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCwzCi0gICAgICAgNTcgMDAwMDAwQjggICBEQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDQKLSAgICAgICA1OCAwMDAwMDBCQyAgIEQyMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsNQotICAgICAgIDU5IDAwMDAwMEMwICAgQ0EzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw2Ci0gICAgICAgNjAgMDAwMDAwQzQgICBDMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDcKLSAgICAgICA2MSAwMDAwMDBDOCAgIEJBMzk0MDBBICAgICAgICAgYmJvICAgICByMTAscjgsOAotICAgICAgIDYyIDAwMDAwMENDICAgQjIzOTQwMEEgICAgICAgICBiYm8gICAgIHIxMCxyOCw5Ci0gICAgICAgNjMgMDAwMDAwRDAgICBBQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEwCi0gICAgICAgNjQgMDAwMDAwRDQgICBBMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDExCi0gICAgICAgNjUgMDAwMDAwRDggICA5QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEyCi0gICAgICAgNjYgMDAwMDAwREMgICA5MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDEzCi0gICAgICAgNjcgMDAwMDAwRTAgICA4QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE0Ci0gICAgICAgNjggMDAwMDAwRTQgICA4MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE1Ci0gICAgICAgNjkgMDAwMDAwRTggICA3QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE2Ci0gICAgICAgNzAgMDAwMDAwRUMgICA3MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE3Ci0gICAgICAgNzEgMDAwMDAwRjAgICA2QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE4Ci0gICAgICAgNzIgMDAwMDAwRjQgICA2MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDE5Ci0gICAgICAgNzMgMDAwMDAwRjggICA1QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIwCi0gICAgICAgNzQgMDAwMDAwRkMgICA1MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIxCi0gICAgICAgNzUgMDAwMDAxMDAgICA0QTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIyCi0gICAgICAgNzYgMDAwMDAxMDQgICA0MjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDIzCi0gICAgICAgNzcgMDAwMDAxMDggICAzQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI0Ci0gICAgICAgNzggMDAwMDAxMEMgICAzMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI1Ci0gICAgICAgNzkgMDAwMDAxMTAgICAyQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI2Ci0gICAgICAgODAgMDAwMDAxMTQgICAyMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI3Ci0gICAgICAgODEgMDAwMDAxMTggICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI4Ci0gICAgICAgODIgMDAwMDAxMUMgICAxMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDI5Ci0gICAgICAgODMgMDAwMDAxMjAgICAwQTM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDMwCi0gICAgICAgODQgMDAwMDAxMjQgICAwMjM5NDAwQSAgICAgICAgIGJibyAgICAgcjEwLHI4LDMxCi0gICAgICAgODUgICAgICAgICAgICAgICAgICAgICAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9iaXRudW0ucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTI2ZTA2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2JpdG51bS5zCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotOzsgVGVzdCB0aGF0IGFsbCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMgZm9yIHRoZSBCSVROVU0gZmllbGQKLTs7IGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4gIEFsc28KLTs7IHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlzYXNzZW1ibGVkIGNvcnJlY3RseSBhcyBzeW1ib2xpY3MsIGFuZAotOzsgdGhhdCB0aGUgcmF3IG51bWVyaWMgdmFsdWVzIGFyZSBoYW5kbGVkIGNvcnJlY3RseSAoc3RvcmVkIGFzCi07OyB0aGUgb25lJ3MgY29tcGxlbWVudCBvZiB0aGUgb3BlcmFuZCBudW1lcmljIHZhbHVlLgotCi0JYmJvCXIxMCxyOCxlcS5iCTsgKH4wICYgMHgxRikKLQliYm8JcjEwLHI4LG5lLmIJOyAofjEgJiAweDFGKQotCWJibwlyMTAscjgsZ3QuYgk7ICh+MiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsZS5iCTsgKH4zICYgMHgxRikKLQliYm8JcjEwLHI4LGx0LmIJOyAofjQgJiAweDFGKQotCWJibwlyMTAscjgsZ2UuYgk7ICh+NSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxoaS5iCTsgKH42ICYgMHgxRikKLQliYm8JcjEwLHI4LGxzLmIJOyAofjcgJiAweDFGKQotCWJibwlyMTAscjgsbG8uYgk7ICh+OCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxocy5iCTsgKH45ICYgMHgxRikKLQotCWJibwlyMTAscjgsZXEuaAk7ICh+MTAgJiAweDFGKQotCWJibwlyMTAscjgsbmUuaAk7ICh+MTEgJiAweDFGKQotCWJibwlyMTAscjgsZ3QuaAk7ICh+MTIgJiAweDFGKQotCWJibwlyMTAscjgsbGUuaAk7ICh+MTMgJiAweDFGKQotCWJibwlyMTAscjgsbHQuaAk7ICh+MTQgJiAweDFGKQotCWJibwlyMTAscjgsZ2UuaAk7ICh+MTUgJiAweDFGKQotCWJibwlyMTAscjgsaGkuaAk7ICh+MTYgJiAweDFGKQotCWJibwlyMTAscjgsbHMuaAk7ICh+MTcgJiAweDFGKQotCWJibwlyMTAscjgsbG8uaAk7ICh+MTggJiAweDFGKQotCWJibwlyMTAscjgsaHMuaAk7ICh+MTkgJiAweDFGKQotCi0JYmJvCXIxMCxyOCxlcS53CTsgKH4yMCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxuZS53CTsgKH4yMSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxndC53CTsgKH4yMiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsZS53CTsgKH4yMyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsdC53CTsgKH4yNCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxnZS53CTsgKH4yNSAmIDB4MUYpCi0JYmJvCXIxMCxyOCxoaS53CTsgKH4yNiAmIDB4MUYpCi0JYmJvCXIxMCxyOCxscy53CTsgKH4yNyAmIDB4MUYpCi0JYmJvCXIxMCxyOCxsby53CTsgKH4yOCAmIDB4MUYpCi0JYmJvCXIxMCxyOCxocy53CTsgKH4yOSAmIDB4MUYpCi0KLQliYm8JcjEwLHI4LGVxLmYJOyAofjIwICYgMHgxRikKLQliYm8JcjEwLHI4LG5lLmYJOyAofjIxICYgMHgxRikKLQliYm8JcjEwLHI4LGd0LmYJOyAofjIyICYgMHgxRikKLQliYm8JcjEwLHI4LGxlLmYJOyAofjIzICYgMHgxRikKLQliYm8JcjEwLHI4LGx0LmYJOyAofjI0ICYgMHgxRikKLQliYm8JcjEwLHI4LGdlLmYJOyAofjI1ICYgMHgxRikKLQliYm8JcjEwLHI4LG91LmYJOyAofjI2ICYgMHgxRikKLQliYm8JcjEwLHI4LGluLmYJOyAofjI3ICYgMHgxRikKLQliYm8JcjEwLHI4LGliLmYJOyAofjI4ICYgMHgxRikKLQliYm8JcjEwLHI4LG9iLmYJOyAofjI5ICYgMHgxRikKLQliYm8JcjEwLHI4LHVvLmYJOyAofjMwICYgMHgxRikKLQliYm8JcjEwLHI4LG9yLmYJOyAofjMxICYgMHgxRikKLQotCWJibwlyMTAscjgsMAotCWJibwlyMTAscjgsMQotCWJibwlyMTAscjgsMgotCWJibwlyMTAscjgsMwotCWJibwlyMTAscjgsNAotCWJibwlyMTAscjgsNQotCWJibwlyMTAscjgsNgotCWJibwlyMTAscjgsNwotCWJibwlyMTAscjgsOAotCWJibwlyMTAscjgsOQotCWJibwlyMTAscjgsMTAKLQliYm8JcjEwLHI4LDExCi0JYmJvCXIxMCxyOCwxMgotCWJibwlyMTAscjgsMTMKLQliYm8JcjEwLHI4LDE0Ci0JYmJvCXIxMCxyOCwxNQotCWJibwlyMTAscjgsMTYKLQliYm8JcjEwLHI4LDE3Ci0JYmJvCXIxMCxyOCwxOAotCWJibwlyMTAscjgsMTkKLQliYm8JcjEwLHI4LDIwCi0JYmJvCXIxMCxyOCwyMQotCWJibwlyMTAscjgsMjIKLQliYm8JcjEwLHI4LDIzCi0JYmJvCXIxMCxyOCwyNAotCWJibwlyMTAscjgsMjUKLQliYm8JcjEwLHI4LDI2Ci0JYmJvCXIxMCxyOCwyNwotCWJibwlyMTAscjgsMjgKLQliYm8JcjEwLHI4LDI5Ci0JYmJvCXIxMCxyOCwzMAotCWJibwlyMTAscjgsMzEKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTM4YWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUuZAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIGNvdmVyYWdlIG9mIHN5bWJvbGljIGNvbmRpdGlvbiBjb2RlIHZhbHVlcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDcgYTAgNzkgMDEuKgotICAgNDoJMDcgYTAgNzkgMDkuKgotICAgODoJMDcgYTAgNzkgMTEuKgotICAgYzoJMDcgYTAgNzkgMTkuKgotICAxMDoJMDcgYTAgNzkgMjEuKgotICAxNDoJMDcgYTAgNzkgMjkuKgotICAxODoJMDcgYTAgNzkgMzEuKgotICAxYzoJMDcgYTAgNzkgMzkuKgotICAyMDoJMDcgYTAgNzkgNDEuKgotICAyNDoJMDcgYTAgNzkgNDkuKgotICAyODoJMDcgYTAgNzkgNTEuKgotICAyYzoJMDcgYTAgNzkgNTkuKgotICAzMDoJMDcgYTAgNzkgNjEuKgotICAzNDoJMDcgYTAgNzkgNjkuKgotICAzODoJMDcgYTAgNzkgNzEuKgotICAzYzoJMDcgYTAgNzkgNzkuKgotICA0MDoJMDcgYTAgNzkgODEuKgotICA0NDoJMDcgYTAgNzkgODkuKgotICA0ODoJMDcgYTAgNzkgOTEuKgotICA0YzoJMDcgYTAgNzkgOTkuKgotICA1MDoJMDcgYTAgNzkgYTEuKgotICA1NDoJMDcgYTAgNzkgYTkuKgotICA1ODoJMDcgYTAgNzkgYjEuKgotICA1YzoJMDcgYTAgNzkgYjkuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAzNTFjLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Njb2RlLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo0OSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWNjb2RlLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBuYW1lcyBmb3IgdGhlIGNvbmRpdGlvbgotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgY29kZXMgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgIEFsc28gdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaXNhc3NlbWJsZWQgY29ycmVjdGx5IGFzIHN5bWJvbGljcy4KLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA1IDAwMDAwMDAwICAgMDE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5ldi5iICAgICAgICAgICAgIDsgMDAwMDAKLSAgICAgICAgNiAwMDAwMDAwNCAgIDA5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxndDAuYiAgICAgICAgICAgICA7IDAwMDAxCi0gICAgICAgIDcgMDAwMDAwMDggICAxMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZXEwLmIgICAgICAgICAgICAgOyAwMDAxMAotICAgICAgICA4IDAwMDAwMDBDICAgMTk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGdlMC5iICAgICAgICAgICAgIDsgMDAwMTEKLSAgICAgICAgOSAwMDAwMDAxMCAgIDIxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsdDAuYiAgICAgICAgICAgICA7IDAwMTAwCi0gICAgICAgMTAgMDAwMDAwMTQgICAyOTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmUwLmIgICAgICAgICAgICAgOyAwMDEwMQotICAgICAgIDExIDAwMDAwMDE4ICAgMzE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGxlMC5iICAgICAgICAgICAgIDsgMDAxMTAKLSAgICAgICAxMiAwMDAwMDAxQyAgIDM5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxhbHcuYiAgICAgICAgICAgICA7IDAwMTExCi0gICAgICAgMTMgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxNCAwMDAwMDAyMCAgIDQxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZXYuaCAgICAgICAgICAgICA7IDAxMDAwCi0gICAgICAgMTUgMDAwMDAwMjQgICA0OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ3QwLmggICAgICAgICAgICAgOyAwMTAwMQotICAgICAgIDE2IDAwMDAwMDI4ICAgNTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGVxMC5oICAgICAgICAgICAgIDsgMDEwMTAKLSAgICAgICAxNyAwMDAwMDAyQyAgIDU5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxnZTAuaCAgICAgICAgICAgICA7IDAxMDExCi0gICAgICAgMTggMDAwMDAwMzAgICA2MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbHQwLmggICAgICAgICAgICAgOyAwMTEwMAotICAgICAgIDE5IDAwMDAwMDM0ICAgNjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LG5lMC5oICAgICAgICAgICAgIDsgMDExMDEKLSAgICAgICAyMCAwMDAwMDAzOCAgIDcxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxsZTAuaCAgICAgICAgICAgICA7IDAxMTEwCi0gICAgICAgMjEgMDAwMDAwM0MgICA3OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsYWx3LmggICAgICAgICAgICAgOyAwMTExMQotICAgICAgIDIyICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMjMgMDAwMDAwNDAgICA4MTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbmV2LncgICAgICAgICAgICAgOyAxMDAwMAotICAgICAgIDI0IDAwMDAwMDQ0ICAgODk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGd0MC53ICAgICAgICAgICAgIDsgMTAwMDEKLSAgICAgICAyNSAwMDAwMDA0OCAgIDkxNzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxlcTAudyAgICAgICAgICAgICA7IDEwMDEwCi0gICAgICAgMjYgMDAwMDAwNEMgICA5OTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsZ2UwLncgICAgICAgICAgICAgOyAxMDAxMQotICAgICAgIDI3IDAwMDAwMDUwICAgQTE3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGx0MC53ICAgICAgICAgICAgIDsgMTAxMDAKLSAgICAgICAyOCAwMDAwMDA1NCAgIEE5NzlBMDA3ICAgICAgICAgYmNuZC5hICByNyxyNSxuZTAudyAgICAgICAgICAgICA7IDEwMTAxCi0gICAgICAgMjkgMDAwMDAwNTggICBCMTc5QTAwNyAgICAgICAgIGJjbmQuYSAgcjcscjUsbGUwLncgICAgICAgICAgICAgOyAxMDExMAotICAgICAgIDMwIDAwMDAwMDVDICAgQjk3OUEwMDcgICAgICAgICBiY25kLmEgIHI3LHI1LGFsdy53ICAgICAgICAgICAgIDsgMTAxMTEKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY2NvZGUucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0YWFjMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jY29kZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotOzsgVGVzdCB0aGF0IGFsbCB0aGUgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZXMgZm9yIHRoZSBjb25kaXRpb24KLTs7IGNvZGVzIGFyZSBwcm9wZXJseSBhY2NlcHRlZCBhbmQgdHJhbnNsYXRlZCB0byBudW1lcmljIHZhbHVlcy4KLTs7ICBBbHNvIHZlcmlmaWVzIHRoYXQgdGhleSBhcmUgZGlzYXNzZW1ibGVkIGNvcnJlY3RseSBhcyBzeW1ib2xpY3MuCi0KLQliY25kLmEJcjcscjUsbmV2LmIJCTsgMDAwMDAKLQliY25kLmEJcjcscjUsZ3QwLmIJCTsgMDAwMDEKLQliY25kLmEJcjcscjUsZXEwLmIJCTsgMDAwMTAKLQliY25kLmEJcjcscjUsZ2UwLmIJCTsgMDAwMTEKLQliY25kLmEJcjcscjUsbHQwLmIJCTsgMDAxMDAKLQliY25kLmEJcjcscjUsbmUwLmIJCTsgMDAxMDEKLQliY25kLmEJcjcscjUsbGUwLmIJCTsgMDAxMTAKLQliY25kLmEJcjcscjUsYWx3LmIJCTsgMDAxMTEKLQotCWJjbmQuYQlyNyxyNSxuZXYuaAkJOyAwMTAwMAotCWJjbmQuYQlyNyxyNSxndDAuaAkJOyAwMTAwMQotCWJjbmQuYQlyNyxyNSxlcTAuaAkJOyAwMTAxMAotCWJjbmQuYQlyNyxyNSxnZTAuaAkJOyAwMTAxMQotCWJjbmQuYQlyNyxyNSxsdDAuaAkJOyAwMTEwMAotCWJjbmQuYQlyNyxyNSxuZTAuaAkJOyAwMTEwMQotCWJjbmQuYQlyNyxyNSxsZTAuaAkJOyAwMTExMAotCWJjbmQuYQlyNyxyNSxhbHcuaAkJOyAwMTExMQotCi0JYmNuZC5hCXI3LHI1LG5ldi53CQk7IDEwMDAwCi0JYmNuZC5hCXI3LHI1LGd0MC53CQk7IDEwMDAxCi0JYmNuZC5hCXI3LHI1LGVxMC53CQk7IDEwMDEwCi0JYmNuZC5hCXI3LHI1LGdlMC53CQk7IDEwMDExCi0JYmNuZC5hCXI3LHI1LGx0MC53CQk7IDEwMTAwCi0JYmNuZC5hCXI3LHI1LG5lMC53CQk7IDEwMTAxCi0JYmNuZC5hCXI3LHI1LGxlMC53CQk7IDEwMTEwCi0JYmNuZC5hCXI3LHI1LGFsdy53CQk7IDEwMTExCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjYxZTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5kCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgY29udHJvbCByZWdpc3RlciBvcGVyYW5kcwotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMzQgMDAgMDIgMTAuKgotICAgNDoJMzkgMDAgMDIgMTAuKgotICAgODoJM2EgMDAgMDIgMTAuKgotICAgYzoJMDIgMDAgMDIgMTAuKgotICAxMDoJMDAgMDUgMDIgMTAuKgotICAxNDoJMDAgMDQgMDIgMTAuKgotICAxODoJMDEgMDQgMDIgMTAuKgotICAxYzoJMGEgMDQgMDIgMTAuKgotICAyMDoJMGIgMDQgMDIgMTAuKgotICAyNDoJMGMgMDQgMDIgMTAuKgotICAyODoJMGQgMDQgMDIgMTAuKgotICAyYzoJMGUgMDQgMDIgMTAuKgotICAzMDoJMGYgMDQgMDIgMTAuKgotICAzNDoJMDIgMDQgMDIgMTAuKgotICAzODoJMDMgMDQgMDIgMTAuKgotICAzYzoJMDQgMDQgMDIgMTAuKgotICA0MDoJMDUgMDQgMDIgMTAuKgotICA0NDoJMDYgMDQgMDIgMTAuKgotICA0ODoJMDcgMDQgMDIgMTAuKgotICA0YzoJMDggMDQgMDIgMTAuKgotICA1MDoJMDkgMDQgMDIgMTAuKgotICA1NDoJMzMgMDAgMDIgMTAuKgotICA1ODoJMDEgMDAgMDIgMTAuKgotICA1YzoJMDAgMDAgMDIgMTAuKgotICA2MDoJMTEgMDAgMDIgMTAuKgotICA2NDoJMTQgMDAgMDIgMTAuKgotICA2ODoJMTMgMDAgMDIgMTAuKgotICA2YzoJMTAgMDAgMDIgMTAuKgotICA3MDoJMTIgMDAgMDIgMTAuKgotICA3NDoJMDggMDAgMDIgMTAuKgotICA3ODoJMDYgMDAgMDIgMTAuKgotICA3YzoJMDAgMDMgMDIgMTAuKgotICA4MDoJMDAgNDAgMDIgMTAuKgotICA4NDoJMDEgNDAgMDIgMTAuKgotICA4ODoJMDQgMDAgMDIgMTAuKgotICA4YzoJMDAgMDIgMDIgMTAuKgotICA5MDoJMDEgMDIgMDIgMTAuKgotICA5NDoJMGEgMDIgMDIgMTAuKgotICA5ODoJMGIgMDIgMDIgMTAuKgotICA5YzoJMGMgMDIgMDIgMTAuKgotICBhMDoJMGQgMDIgMDIgMTAuKgotICBhNDoJMGUgMDIgMDIgMTAuKgotICBhODoJMGYgMDIgMDIgMTAuKgotICBhYzoJMDIgMDIgMDIgMTAuKgotICBiMDoJMDMgMDIgMDIgMTAuKgotICBiNDoJMDQgMDIgMDIgMTAuKgotICBiODoJMDUgMDIgMDIgMTAuKgotICBiYzoJMDYgMDIgMDIgMTAuKgotICBjMDoJMDcgMDIgMDIgMTAuKgotICBjNDoJMDggMDIgMDIgMTAuKgotICBjODoJMDkgMDIgMDIgMTAuKgotICBjYzoJMzEgMDAgMDIgMTAuKgotICBkMDoJMzAgMDAgMDIgMTAuKgotICBkNDoJMDIgNDAgMDIgMTAuKgotICBkODoJMGQgMDAgMDIgMTAuKgotICBkYzoJMGEgMDAgMDIgMTAuKgotICBlMDoJMjAgMDAgMDIgMTAuKgotICBlNDoJMjEgMDAgMDIgMTAuKgotICBlODoJMGUgMDAgMDIgMTAuKgotICBlYzoJMGYgMDAgMDIgMTAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvY3JlZ29wcy5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlYTU3Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDo1NiAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLWNyZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUZXN0IHRoYXQgYWxsIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciBjb250cm9sIHJlZ2lzdGVycwotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbwotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaWFzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLgotICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDUgMDAwMDAwMDAgICAxMDAyMDAzNCAgICAgICAgIHJkY3IgICAgQU5BU1RBVCxyMgotICAgICAgICA2IDAwMDAwMDA0ICAgMTAwMjAwMzkgICAgICAgICByZGNyICAgIEJSSzEscjIKLSAgICAgICAgNyAwMDAwMDAwOCAgIDEwMDIwMDNBICAgICAgICAgcmRjciAgICBCUksyLHIyCi0gICAgICAgIDggMDAwMDAwMEMgICAxMDAyMDAwMiAgICAgICAgIHJkY3IgICAgQ09ORklHLHIyCi0gICAgICAgIDkgMDAwMDAwMTAgICAxMDAyMDUwMCAgICAgICAgIHJkY3IgICAgRExSVSxyMgotICAgICAgIDEwIDAwMDAwMDE0ICAgMTAwMjA0MDAgICAgICAgICByZGNyICAgIERUQUcwLHIyCi0gICAgICAgMTEgMDAwMDAwMTggICAxMDAyMDQwMSAgICAgICAgIHJkY3IgICAgRFRBRzEscjIKLSAgICAgICAxMiAwMDAwMDAxQyAgIDEwMDIwNDBBICAgICAgICAgcmRjciAgICBEVEFHMTAscjIKLSAgICAgICAxMyAwMDAwMDAyMCAgIDEwMDIwNDBCICAgICAgICAgcmRjciAgICBEVEFHMTEscjIKLSAgICAgICAxNCAwMDAwMDAyNCAgIDEwMDIwNDBDICAgICAgICAgcmRjciAgICBEVEFHMTIscjIKLSAgICAgICAxNSAwMDAwMDAyOCAgIDEwMDIwNDBEICAgICAgICAgcmRjciAgICBEVEFHMTMscjIKLSAgICAgICAxNiAwMDAwMDAyQyAgIDEwMDIwNDBFICAgICAgICAgcmRjciAgICBEVEFHMTQscjIKLSAgICAgICAxNyAwMDAwMDAzMCAgIDEwMDIwNDBGICAgICAgICAgcmRjciAgICBEVEFHMTUscjIKLSAgICAgICAxOCAwMDAwMDAzNCAgIDEwMDIwNDAyICAgICAgICAgcmRjciAgICBEVEFHMixyMgotICAgICAgIDE5IDAwMDAwMDM4ICAgMTAwMjA0MDMgICAgICAgICByZGNyICAgIERUQUczLHIyCi0gICAgICAgMjAgMDAwMDAwM0MgICAxMDAyMDQwNCAgICAgICAgIHJkY3IgICAgRFRBRzQscjIKLSAgICAgICAyMSAwMDAwMDA0MCAgIDEwMDIwNDA1ICAgICAgICAgcmRjciAgICBEVEFHNSxyMgotICAgICAgIDIyIDAwMDAwMDQ0ICAgMTAwMjA0MDYgICAgICAgICByZGNyICAgIERUQUc2LHIyCi0gICAgICAgMjMgMDAwMDAwNDggICAxMDAyMDQwNyAgICAgICAgIHJkY3IgICAgRFRBRzcscjIKLSAgICAgICAyNCAwMDAwMDA0QyAgIDEwMDIwNDA4ICAgICAgICAgcmRjciAgICBEVEFHOCxyMgotICAgICAgIDI1IDAwMDAwMDUwICAgMTAwMjA0MDkgICAgICAgICByZGNyICAgIERUQUc5LHIyCi0gICAgICAgMjYgMDAwMDAwNTQgICAxMDAyMDAzMyAgICAgICAgIHJkY3IgICAgRUNPTUNOVEwscjIKLSAgICAgICAyNyAwMDAwMDA1OCAgIDEwMDIwMDAxICAgICAgICAgcmRjciAgICBFSVAscjIKLSAgICAgICAyOCAwMDAwMDA1QyAgIDEwMDIwMDAwICAgICAgICAgcmRjciAgICBFUEMscjIKLSAgICAgICAyOSAwMDAwMDA2MCAgIDEwMDIwMDExICAgICAgICAgcmRjciAgICBGTFRBRFIscjIKLSAgICAgICAzMCAwMDAwMDA2NCAgIDEwMDIwMDE0ICAgICAgICAgcmRjciAgICBGTFREVEgscjIKLSAgICAgICAzMSAwMDAwMDA2OCAgIDEwMDIwMDEzICAgICAgICAgcmRjciAgICBGTFREVEwscjIKLSAgICAgICAzMiAwMDAwMDA2QyAgIDEwMDIwMDEwICAgICAgICAgcmRjciAgICBGTFRPUCxyMgotICAgICAgIDMzIDAwMDAwMDcwICAgMTAwMjAwMTIgICAgICAgICByZGNyICAgIEZMVFRBRyxyMgotICAgICAgIDM0IDAwMDAwMDc0ICAgMTAwMjAwMDggICAgICAgICByZGNyICAgIEZQU1QscjIKLSAgICAgICAzNSAwMDAwMDA3OCAgIDEwMDIwMDA2ICAgICAgICAgcmRjciAgICBJRSxyMgotICAgICAgIDM2IDAwMDAwMDdDICAgMTAwMjAzMDAgICAgICAgICByZGNyICAgIElMUlUscjIKLSAgICAgICAzNyAwMDAwMDA4MCAgIDEwMDI0MDAwICAgICAgICAgcmRjciAgICBJTjBQLHIyCi0gICAgICAgMzggMDAwMDAwODQgICAxMDAyNDAwMSAgICAgICAgIHJkY3IgICAgSU4xUCxyMgotICAgICAgIDM5IDAwMDAwMDg4ICAgMTAwMjAwMDQgICAgICAgICByZGNyICAgIElOVFBFTixyMgotICAgICAgIDQwIDAwMDAwMDhDICAgMTAwMjAyMDAgICAgICAgICByZGNyICAgIElUQUcwLHIyCi0gICAgICAgNDEgMDAwMDAwOTAgICAxMDAyMDIwMSAgICAgICAgIHJkY3IgICAgSVRBRzEscjIKLSAgICAgICA0MiAwMDAwMDA5NCAgIDEwMDIwMjBBICAgICAgICAgcmRjciAgICBJVEFHMTAscjIKLSAgICAgICA0MyAwMDAwMDA5OCAgIDEwMDIwMjBCICAgICAgICAgcmRjciAgICBJVEFHMTEscjIKLSAgICAgICA0NCAwMDAwMDA5QyAgIDEwMDIwMjBDICAgICAgICAgcmRjciAgICBJVEFHMTIscjIKLSAgICAgICA0NSAwMDAwMDBBMCAgIDEwMDIwMjBEICAgICAgICAgcmRjciAgICBJVEFHMTMscjIKLSAgICAgICA0NiAwMDAwMDBBNCAgIDEwMDIwMjBFICAgICAgICAgcmRjciAgICBJVEFHMTQscjIKLSAgICAgICA0NyAwMDAwMDBBOCAgIDEwMDIwMjBGICAgICAgICAgcmRjciAgICBJVEFHMTUscjIKLSAgICAgICA0OCAwMDAwMDBBQyAgIDEwMDIwMjAyICAgICAgICAgcmRjciAgICBJVEFHMixyMgotICAgICAgIDQ5IDAwMDAwMEIwICAgMTAwMjAyMDMgICAgICAgICByZGNyICAgIElUQUczLHIyCi0gICAgICAgNTAgMDAwMDAwQjQgICAxMDAyMDIwNCAgICAgICAgIHJkY3IgICAgSVRBRzQscjIKLSAgICAgICA1MSAwMDAwMDBCOCAgIDEwMDIwMjA1ICAgICAgICAgcmRjciAgICBJVEFHNSxyMgotICAgICAgIDUyIDAwMDAwMEJDICAgMTAwMjAyMDYgICAgICAgICByZGNyICAgIElUQUc2LHIyCi0gICAgICAgNTMgMDAwMDAwQzAgICAxMDAyMDIwNyAgICAgICAgIHJkY3IgICAgSVRBRzcscjIKLSAgICAgICA1NCAwMDAwMDBDNCAgIDEwMDIwMjA4ICAgICAgICAgcmRjciAgICBJVEFHOCxyMgotICAgICAgIDU1IDAwMDAwMEM4ICAgMTAwMjAyMDkgICAgICAgICByZGNyICAgIElUQUc5LHIyCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjU2IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotY3JlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICA1NiAwMDAwMDBDQyAgIDEwMDIwMDMxICAgICAgICAgcmRjciAgICBNSVAscjIKLSAgICAgICA1NyAwMDAwMDBEMCAgIDEwMDIwMDMwICAgICAgICAgcmRjciAgICBNUEMscjIKLSAgICAgICA1OCAwMDAwMDBENCAgIDEwMDI0MDAyICAgICAgICAgcmRjciAgICBPVVRQLHIyCi0gICAgICAgNTkgMDAwMDAwRDggICAxMDAyMDAwRCAgICAgICAgIHJkY3IgICAgUEtUUkVRLHIyCi0gICAgICAgNjAgMDAwMDAwREMgICAxMDAyMDAwQSAgICAgICAgIHJkY3IgICAgUFBFUlJPUixyMgotICAgICAgIDYxIDAwMDAwMEUwICAgMTAwMjAwMjAgICAgICAgICByZGNyICAgIFNZU1NUSyxyMgotICAgICAgIDYyIDAwMDAwMEU0ICAgMTAwMjAwMjEgICAgICAgICByZGNyICAgIFNZU1RNUCxyMgotICAgICAgIDYzIDAwMDAwMEU4ICAgMTAwMjAwMEUgICAgICAgICByZGNyICAgIFRDT1VOVCxyMgotICAgICAgIDY0IDAwMDAwMEVDICAgMTAwMjAwMEYgICAgICAgICByZGNyICAgIFRTQ0FMRSxyMgotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2NyZWdvcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwYWRjZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9jcmVnb3BzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi07OyBUZXN0IHRoYXQgYWxsIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzIGZvciBjb250cm9sIHJlZ2lzdGVycwotOzsgYXJlIHByb3Blcmx5IGFjY2VwdGVkIGFuZCB0cmFuc2xhdGVkIHRvIG51bWVyaWMgdmFsdWVzLiAgQWxzbwotOzsgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBkaWFzc2VtYmxlZCBjb3JyZWN0bHkgYXMgc3ltYm9saWNzLgotCi0JcmRjcglBTkFTVEFULHIyCi0JcmRjcglCUksxLHIyCi0JcmRjcglCUksyLHIyCi0JcmRjcglDT05GSUcscjIKLQlyZGNyCURMUlUscjIKLQlyZGNyCURUQUcwLHIyCi0JcmRjcglEVEFHMSxyMgotCXJkY3IJRFRBRzEwLHIyCi0JcmRjcglEVEFHMTEscjIKLQlyZGNyCURUQUcxMixyMgotCXJkY3IJRFRBRzEzLHIyCi0JcmRjcglEVEFHMTQscjIKLQlyZGNyCURUQUcxNSxyMgotCXJkY3IJRFRBRzIscjIKLQlyZGNyCURUQUczLHIyCi0JcmRjcglEVEFHNCxyMgotCXJkY3IJRFRBRzUscjIKLQlyZGNyCURUQUc2LHIyCi0JcmRjcglEVEFHNyxyMgotCXJkY3IJRFRBRzgscjIKLQlyZGNyCURUQUc5LHIyCi0JcmRjcglFQ09NQ05UTCxyMgotCXJkY3IJRUlQLHIyCi0JcmRjcglFUEMscjIKLQlyZGNyCUZMVEFEUixyMgotCXJkY3IJRkxURFRILHIyCi0JcmRjcglGTFREVEwscjIKLQlyZGNyCUZMVE9QLHIyCi0JcmRjcglGTFRUQUcscjIKLQlyZGNyCUZQU1QscjIKLQlyZGNyCUlFLHIyCi0JcmRjcglJTFJVLHIyCi0JcmRjcglJTjBQLHIyCi0JcmRjcglJTjFQLHIyCi0JcmRjcglJTlRQRU4scjIKLQlyZGNyCUlUQUcwLHIyCi0JcmRjcglJVEFHMSxyMgotCXJkY3IJSVRBRzEwLHIyCi0JcmRjcglJVEFHMTEscjIKLQlyZGNyCUlUQUcxMixyMgotCXJkY3IJSVRBRzEzLHIyCi0JcmRjcglJVEFHMTQscjIKLQlyZGNyCUlUQUcxNSxyMgotCXJkY3IJSVRBRzIscjIKLQlyZGNyCUlUQUczLHIyCi0JcmRjcglJVEFHNCxyMgotCXJkY3IJSVRBRzUscjIKLQlyZGNyCUlUQUc2LHIyCi0JcmRjcglJVEFHNyxyMgotCXJkY3IJSVRBRzgscjIKLQlyZGNyCUlUQUc5LHIyCi0JcmRjcglNSVAscjIKLQlyZGNyCU1QQyxyMgotCXJkY3IJT1VUUCxyMgotCXJkY3IJUEtUUkVRLHIyCi0JcmRjcglQUEVSUk9SLHIyCi0JcmRjcglTWVNTVEsscjIKLQlyZGNyCVNZU1RNUCxyMgotCXJkY3IJVENPVU5ULHIyCi0JcmRjcglUU0NBTEUscjIKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2suZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2suZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkMDg0Ny4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmQKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCBjb3ZlcmFnZSBvZiBzaGlmdCBpbnN0cnVjdGlvbiBFTkRNQVNLIGZpZWxkCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwNSAwMCBjNyA0OS4qCi0gICA0OgkyNSAwMCBjNyA0OS4qCi0gICA4Ogk0NSAwMCBjNyA0OS4qCi0gICBjOgk2NSAwMCBjNyA0OS4qCi0gIDEwOgk4NSAwMCBjNyA0OS4qCi0gIDE0OglhNSAwMCBjNyA0OS4qCi0gIDE4OgljNSAwMCBjNyA0OS4qCi0gIDFjOgllNSAwMCBjNyA0OS4qCi0gIDIwOgkwNSAwMSBjNyA0OS4qCi0gIDI0OgkyNSAwMSBjNyA0OS4qCi0gIDI4Ogk0NSAwMSBjNyA0OS4qCi0gIDJjOgk2NSAwMSBjNyA0OS4qCi0gIDMwOgk4NSAwMSBjNyA0OS4qCi0gIDM0OglhNSAwMSBjNyA0OS4qCi0gIDM4OgljNSAwMSBjNyA0OS4qCi0gIDNjOgllNSAwMSBjNyA0OS4qCi0gIDQwOgkwNSAwMiBjNyA0OS4qCi0gIDQ0OgkyNSAwMiBjNyA0OS4qCi0gIDQ4Ogk0NSAwMiBjNyA0OS4qCi0gIDRjOgk2NSAwMiBjNyA0OS4qCi0gIDUwOgk4NSAwMiBjNyA0OS4qCi0gIDU0OglhNSAwMiBjNyA0OS4qCi0gIDU4OgljNSAwMiBjNyA0OS4qCi0gIDVjOgllNSAwMiBjNyA0OS4qCi0gIDYwOgkwNSAwMyBjNyA0OS4qCi0gIDY0OgkyNSAwMyBjNyA0OS4qCi0gIDY4Ogk0NSAwMyBjNyA0OS4qCi0gIDZjOgk2NSAwMyBjNyA0OS4qCi0gIDcwOgk4NSAwMyBjNyA0OS4qCi0gIDc0OglhNSAwMyBjNyA0OS4qCi0gIDc4OgljNSAwMyBjNyA0OS4qCi0gIDdjOgllNSAwMyBjNyA0OS4qCi0gIDgwOgkwNSAwMCBjNyA0OS4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9lbmRtYXNrLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2subHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTAzYjMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2subHN0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotZW5kbWFzay5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFRlc3QgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiB0aGUgZW5kbWFzayBpbiBiaXRzIDUtOS4KLSAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgIDs7IFRoZSBtYXNrIHRoYXQgaXMgdXNlZCBpcyBjb21wdXRlZCBhcyAyKipiaXRzLTEgd2hlcmUgYml0cwotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHRoZSBiaXRzIDUtOSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCAwIGFuZCAzMgotICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgOzsgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHksIGFuZCBkaXNhc3NlbWJsZWQgYXMgMC4KLSAgICAgICAgNSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICA2IDAwMDAwMDAwICAgNDlDNzAwMDUgICAgICAgICBzbC5peiAgIDUsMCxyNyxyOQotICAgICAgICA3IDAwMDAwMDA0ICAgNDlDNzAwMjUgICAgICAgICBzbC5peiAgIDUsMSxyNyxyOQotICAgICAgICA4IDAwMDAwMDA4ICAgNDlDNzAwNDUgICAgICAgICBzbC5peiAgIDUsMixyNyxyOQotICAgICAgICA5IDAwMDAwMDBDICAgNDlDNzAwNjUgICAgICAgICBzbC5peiAgIDUsMyxyNyxyOQotICAgICAgIDEwIDAwMDAwMDEwICAgNDlDNzAwODUgICAgICAgICBzbC5peiAgIDUsNCxyNyxyOQotICAgICAgIDExIDAwMDAwMDE0ICAgNDlDNzAwQTUgICAgICAgICBzbC5peiAgIDUsNSxyNyxyOQotICAgICAgIDEyIDAwMDAwMDE4ICAgNDlDNzAwQzUgICAgICAgICBzbC5peiAgIDUsNixyNyxyOQotICAgICAgIDEzIDAwMDAwMDFDICAgNDlDNzAwRTUgICAgICAgICBzbC5peiAgIDUsNyxyNyxyOQotICAgICAgIDE0IDAwMDAwMDIwICAgNDlDNzAxMDUgICAgICAgICBzbC5peiAgIDUsOCxyNyxyOQotICAgICAgIDE1IDAwMDAwMDI0ICAgNDlDNzAxMjUgICAgICAgICBzbC5peiAgIDUsOSxyNyxyOQotICAgICAgIDE2IDAwMDAwMDI4ICAgNDlDNzAxNDUgICAgICAgICBzbC5peiAgIDUsMTAscjcscjkKLSAgICAgICAxNyAwMDAwMDAyQyAgIDQ5QzcwMTY1ICAgICAgICAgc2wuaXogICA1LDExLHI3LHI5Ci0gICAgICAgMTggMDAwMDAwMzAgICA0OUM3MDE4NSAgICAgICAgIHNsLml6ICAgNSwxMixyNyxyOQotICAgICAgIDE5IDAwMDAwMDM0ICAgNDlDNzAxQTUgICAgICAgICBzbC5peiAgIDUsMTMscjcscjkKLSAgICAgICAyMCAwMDAwMDAzOCAgIDQ5QzcwMUM1ICAgICAgICAgc2wuaXogICA1LDE0LHI3LHI5Ci0gICAgICAgMjEgMDAwMDAwM0MgICA0OUM3MDFFNSAgICAgICAgIHNsLml6ICAgNSwxNSxyNyxyOQotICAgICAgIDIyIDAwMDAwMDQwICAgNDlDNzAyMDUgICAgICAgICBzbC5peiAgIDUsMTYscjcscjkKLSAgICAgICAyMyAwMDAwMDA0NCAgIDQ5QzcwMjI1ICAgICAgICAgc2wuaXogICA1LDE3LHI3LHI5Ci0gICAgICAgMjQgMDAwMDAwNDggICA0OUM3MDI0NSAgICAgICAgIHNsLml6ICAgNSwxOCxyNyxyOQotICAgICAgIDI1IDAwMDAwMDRDICAgNDlDNzAyNjUgICAgICAgICBzbC5peiAgIDUsMTkscjcscjkKLSAgICAgICAyNiAwMDAwMDA1MCAgIDQ5QzcwMjg1ICAgICAgICAgc2wuaXogICA1LDIwLHI3LHI5Ci0gICAgICAgMjcgMDAwMDAwNTQgICA0OUM3MDJBNSAgICAgICAgIHNsLml6ICAgNSwyMSxyNyxyOQotICAgICAgIDI4IDAwMDAwMDU4ICAgNDlDNzAyQzUgICAgICAgICBzbC5peiAgIDUsMjIscjcscjkKLSAgICAgICAyOSAwMDAwMDA1QyAgIDQ5QzcwMkU1ICAgICAgICAgc2wuaXogICA1LDIzLHI3LHI5Ci0gICAgICAgMzAgMDAwMDAwNjAgICA0OUM3MDMwNSAgICAgICAgIHNsLml6ICAgNSwyNCxyNyxyOQotICAgICAgIDMxIDAwMDAwMDY0ICAgNDlDNzAzMjUgICAgICAgICBzbC5peiAgIDUsMjUscjcscjkKLSAgICAgICAzMiAwMDAwMDA2OCAgIDQ5QzcwMzQ1ICAgICAgICAgc2wuaXogICA1LDI2LHI3LHI5Ci0gICAgICAgMzMgMDAwMDAwNkMgICA0OUM3MDM2NSAgICAgICAgIHNsLml6ICAgNSwyNyxyNyxyOQotICAgICAgIDM0IDAwMDAwMDcwICAgNDlDNzAzODUgICAgICAgICBzbC5peiAgIDUsMjgscjcscjkKLSAgICAgICAzNSAwMDAwMDA3NCAgIDQ5QzcwM0E1ICAgICAgICAgc2wuaXogICA1LDI5LHI3LHI5Ci0gICAgICAgMzYgMDAwMDAwNzggICA0OUM3MDNDNSAgICAgICAgIHNsLml6ICAgNSwzMCxyNyxyOQotICAgICAgIDM3IDAwMDAwMDdDICAgNDlDNzAzRTUgICAgICAgICBzbC5peiAgIDUsMzEscjcscjkKLSAgICAgICAzOCAwMDAwMDA4MCAgIDQ5QzcwMDA1ICAgICAgICAgc2wuaXogICA1LDMyLHI3LHI5Ci0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZW5kbWFzay5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzZhZWRlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2VuZG1hc2sucworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTs7IFRlc3QgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiB0aGUgZW5kbWFzayBpbiBiaXRzIDUtOS4KLTs7IFRoZSBtYXNrIHRoYXQgaXMgdXNlZCBpcyBjb21wdXRlZCBhcyAyKipiaXRzLTEgd2hlcmUgYml0cwotOzsgYXJlIHRoZSBiaXRzIDUtOSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCAwIGFuZCAzMgotOzsgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHksIGFuZCBkaXNhc3NlbWJsZWQgYXMgMC4KLQotCXNsLml6CTUsMCxyNyxyOQotCXNsLml6CTUsMSxyNyxyOQotCXNsLml6CTUsMixyNyxyOQotCXNsLml6CTUsMyxyNyxyOQotCXNsLml6CTUsNCxyNyxyOQotCXNsLml6CTUsNSxyNyxyOQotCXNsLml6CTUsNixyNyxyOQotCXNsLml6CTUsNyxyNyxyOQotCXNsLml6CTUsOCxyNyxyOQotCXNsLml6CTUsOSxyNyxyOQotCXNsLml6CTUsMTAscjcscjkKLQlzbC5pegk1LDExLHI3LHI5Ci0Jc2wuaXoJNSwxMixyNyxyOQotCXNsLml6CTUsMTMscjcscjkKLQlzbC5pegk1LDE0LHI3LHI5Ci0Jc2wuaXoJNSwxNSxyNyxyOQotCXNsLml6CTUsMTYscjcscjkKLQlzbC5pegk1LDE3LHI3LHI5Ci0Jc2wuaXoJNSwxOCxyNyxyOQotCXNsLml6CTUsMTkscjcscjkKLQlzbC5pegk1LDIwLHI3LHI5Ci0Jc2wuaXoJNSwyMSxyNyxyOQotCXNsLml6CTUsMjIscjcscjkKLQlzbC5pegk1LDIzLHI3LHI5Ci0Jc2wuaXoJNSwyNCxyNyxyOQotCXNsLml6CTUsMjUscjcscjkKLQlzbC5pegk1LDI2LHI3LHI5Ci0Jc2wuaXoJNSwyNyxyNyxyOQotCXNsLml6CTUsMjgscjcscjkKLQlzbC5pegk1LDI5LHI3LHI5Ci0Jc2wuaXoJNSwzMCxyNyxyOQotCXNsLml6CTUsMzEscjcscjkKLQlzbC5pegk1LDMyLHI3LHI5CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlYjg1Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5kCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgc2ltcGxlIGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgk4MCAxMiBiZSA1MSAxNiA2OCBhOSA2NS4qCi0gICA4OgkwMCAxMiBiZSA1MSAxNiA2OCBhOSBlNS4qCi0gIDEwOgkwMCAxMCBiZSA1MSA5YSA2ZCA0MSAxOS4qCi0gIDE4Ogk4MCBiMCAzZSA1MiA5YSA2ZCA0MSA5OS4qCi0gIDIwOgkwMCBiMCAzZSA1MiAwMCAwMCAwMCAwMC4qCi0gIDI4Ogk4MCA3MiBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIDMwOgkwMCA3MiBiZSA1MSAwMCAwMCAwMCAzZi4qCi0gIDM4OgkwMCA3MCBiZSA1MSAwMCAwMCA4MCA0NS4qCi0gIDQwOgk4MCA1MiBiZSA1MSAwMCAwMCA4MCBjNS4qCi0gIDQ4OgkwMCA1MiBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIDUwOgkwMCA1MCBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIDU4Ogk4MCA5MyAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDYwOgk4MCA5NSAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDY4Ogk4MCA5MSAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDcwOgk4MCA5NyAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDc4OgkwMCA5MiAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDgwOgkwMCA5NCAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDg4OgkwMCA5MCAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDkwOgkwMCA5NiAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIDk4OgkwMCA5MyAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGEwOgkwMCA5NSAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGE4OgkwMCA5MSAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGIwOgkwMCA5NyAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGI4Ogk4MCA5MiAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGMwOgk4MCA5NCAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGM4Ogk4MCA5MCAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGQwOgk4MCA5NiAzZSA0MCAwMCAwMCAwMCA0MC4qCi0gIGQ4OgkwMCBmMiAzZSA1MCAwMCAwMCAwMCA0MC4qCi0gIGUwOgkwMCBmMCAzZSA1MCAwMCAwMCAwMCA0MC4qCi0gIGU4Ogk4MCAzMiBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIGYwOgkwMCAzMiBiZSA1MSAwMCAwMCAwMCA0MC4qCi0gIGY4OgkwMCAzMCBiZSA1MSAwMCAwMCAwMCA0MC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMzQ1OTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvZmxvYXQubHN0CisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDIyOjA5OjA5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotZmxvYXQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAwMDAwMDAwMCAgIDUxQkUxMjgwICAgICAgICAgZmFkZC5zZGQgICAgICAgIDEuMEUyMyxyNixyMTAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMDQgICA2NUE5NjgxNiAKLSAgICAgICAgMiAwMDAwMDAwOCAgIDUxQkUxMjAwICAgICAgICAgZmFkZC5zc2QgICAgICAgIC0xLjBFMjMscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMEMgICBFNUE5NjgxNiAKLSAgICAgICAgMyAwMDAwMDAxMCAgIDUxQkUxMDAwICAgICAgICAgZmFkZC5zc3MgICAgICAgIDEuMEUtMjMscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMTQgICAxOTQxNkQ5QSAKLSAgICAgICAgNCAwMDAwMDAxOCAgIDUyM0VCMDgwICAgICAgICAgZmNtcC5zZCAgICAgICAgIC0xLjBFLTIzLHI4LHIxMCA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMUMgICA5OTQxNkQ5QSAKLSAgICAgICAgNSAwMDAwMDAyMCAgIDUyM0VCMDAwICAgICAgICAgZmNtcC5zcyAgICAgICAgIDAuMCxyOCxyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMjQgICAwMDAwMDAwMCAKLSAgICAgICAgNiAwMDAwMDAyOCAgIDUxQkU3MjgwICAgICAgICAgZmRpdi5zZGQgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMkMgICA0MDAwMDAwMCAKLSAgICAgICAgNyAwMDAwMDAzMCAgIDUxQkU3MjAwICAgICAgICAgZmRpdi5zc2QgICAgICAgIDAuNSxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwMzQgICAzRjAwMDAwMCAKLSAgICAgICAgOCAwMDAwMDAzOCAgIDUxQkU3MDAwICAgICAgICAgZmRpdi5zc3MgICAgICAgIDQwOTYuMCxyNixyMTAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwM0MgICA0NTgwMDAwMCAKLSAgICAgICAgOSAwMDAwMDA0MCAgIDUxQkU1MjgwICAgICAgICAgZm1weS5zZGQgICAgICAgIC00MDk2LjAscjYscjEwICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNDQgICBDNTgwMDAwMCAKLSAgICAgICAxMCAwMDAwMDA0OCAgIDUxQkU1MjAwICAgICAgICAgZm1weS5zc2QgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNEMgICA0MDAwMDAwMCAKLSAgICAgICAxMSAwMDAwMDA1MCAgIDUxQkU1MDAwICAgICAgICAgZm1weS5zc3MgICAgICAgIDIuMCxyNixyMTAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNTQgICA0MDAwMDAwMCAKLSAgICAgICAxMiAwMDAwMDA1OCAgIDQwM0U5MzgwICAgICAgICAgZnJuZG0uc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNUMgICA0MDAwMDAwMCAKLSAgICAgICAxMyAwMDAwMDA2MCAgIDQwM0U5NTgwICAgICAgICAgZnJuZG0uc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNjQgICA0MDAwMDAwMCAKLSAgICAgICAxNCAwMDAwMDA2OCAgIDQwM0U5MTgwICAgICAgICAgZnJuZG0uc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNkMgICA0MDAwMDAwMCAKLSAgICAgICAxNSAwMDAwMDA3MCAgIDQwM0U5NzgwICAgICAgICAgZnJuZG0uc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNzQgICA0MDAwMDAwMCAKLSAgICAgICAxNiAwMDAwMDA3OCAgIDQwM0U5MjAwICAgICAgICAgZnJuZG4uc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwN0MgICA0MDAwMDAwMCAKLSAgICAgICAxNyAwMDAwMDA4MCAgIDQwM0U5NDAwICAgICAgICAgZnJuZG4uc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwODQgICA0MDAwMDAwMCAKLSAgICAgICAxOCAwMDAwMDA4OCAgIDQwM0U5MDAwICAgICAgICAgZnJuZG4uc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwOEMgICA0MDAwMDAwMCAKLSAgICAgICAxOSAwMDAwMDA5MCAgIDQwM0U5NjAwICAgICAgICAgZnJuZG4uc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwOTQgICA0MDAwMDAwMCAKLSAgICAgICAyMCAwMDAwMDA5OCAgIDQwM0U5MzAwICAgICAgICAgZnJuZHAuc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwOUMgICA0MDAwMDAwMCAKLSAgICAgICAyMSAwMDAwMDBBMCAgIDQwM0U5NTAwICAgICAgICAgZnJuZHAuc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQTQgICA0MDAwMDAwMCAKLSAgICAgICAyMiAwMDAwMDBBOCAgIDQwM0U5MTAwICAgICAgICAgZnJuZHAuc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQUMgICA0MDAwMDAwMCAKLSAgICAgICAyMyAwMDAwMDBCMCAgIDQwM0U5NzAwICAgICAgICAgZnJuZHAuc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQjQgICA0MDAwMDAwMCAKLSAgICAgICAyNCAwMDAwMDBCOCAgIDQwM0U5MjgwICAgICAgICAgZnJuZHouc2QgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQkMgICA0MDAwMDAwMCAKLSAgICAgICAyNSAwMDAwMDBDMCAgIDQwM0U5NDgwICAgICAgICAgZnJuZHouc2kgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQzQgICA0MDAwMDAwMCAKLSAgICAgICAyNiAwMDAwMDBDOCAgIDQwM0U5MDgwICAgICAgICAgZnJuZHouc3MgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwQ0MgICA0MDAwMDAwMCAKLSAgICAgICAyNyAwMDAwMDBEMCAgIDQwM0U5NjgwICAgICAgICAgZnJuZHouc3UgICAgICAgIDIuMCxyOCAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRDQgICA0MDAwMDAwMCAKLSAgICAgICAyOCAwMDAwMDBEOCAgIDUwM0VGMjAwICAgICAgICAgZnNxcnQuc2QgICAgICAgIDIuMCxyMTAgICAgICAgICA7IEltbWVkaWF0ZSBmb3JtCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDIyOjA5OjA5IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotZmxvYXQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICAgICAwMDAwMDBEQyAgIDQwMDAwMDAwIAotICAgICAgIDI5IDAwMDAwMEUwICAgNTAzRUYwMDAgICAgICAgICBmc3FydC5zcyAgICAgICAgMi4wLHIxMCAgICAgICAgIDsgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBFNCAgIDQwMDAwMDAwIAotICAgICAgIDMwIDAwMDAwMEU4ICAgNTFCRTMyODAgICAgICAgICBmc3ViLnNkZCAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBFQyAgIDQwMDAwMDAwIAotICAgICAgIDMxIDAwMDAwMEYwICAgNTFCRTMyMDAgICAgICAgICBmc3ViLnNzZCAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBGNCAgIDQwMDAwMDAwIAotICAgICAgIDMyIDAwMDAwMEY4ICAgNTFCRTMwMDAgICAgICAgICBmc3ViLnNzcyAgICAgICAgMi4wLHI2LHIxMCAgICAgIDsgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBGQyAgIDQwMDAwMDAwIAotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9mbG9hdC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGEyYjdhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL2Zsb2F0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0JZmFkZC5zZGQJMGYxLjBFMjMscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmYWRkLnNzZAkwZi0xLjBFMjMscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmYWRkLnNzcwkwZjEuMEUtMjMscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmY21wLnNkCQkwZi0xLjBFLTIzLHI4LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmNtcC5zcwkJMGYwLjAscjgscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmZGl2LnNkZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZkaXYuc3NkCTBmMC41LHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZmRpdi5zc3MJMGY0MDk2LjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmbXB5LnNkZAkwZi00MDk2LjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KLQlmbXB5LnNzZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZtcHkuc3NzCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG0uc2QJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbS5zaQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRtLnNzCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG0uc3UJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbi5zZAkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRuLnNpCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZG4uc3MJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kbi5zdQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRwLnNkCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHAuc2kJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kcC5zcwkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmRwLnN1CTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHouc2QJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmcm5kei5zaQkwZjIuMCxyOAkJOyBJbW1lZGlhdGUgZm9ybQotCWZybmR6LnNzCTBmMi4wLHI4CQk7IEltbWVkaWF0ZSBmb3JtCi0JZnJuZHouc3UJMGYyLjAscjgJCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3FydC5zZAkwZjIuMCxyMTAJCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3FydC5zcwkwZjIuMCxyMTAJCTsgSW1tZWRpYXRlIGZvcm0KLQlmc3ViLnNkZAkwZjIuMCxyNixyMTAJOyBJbW1lZGlhdGUgZm9ybQotCWZzdWIuc3NkCTBmMi4wLHI2LHIxMAk7IEltbWVkaWF0ZSBmb3JtCi0JZnN1Yi5zc3MJMGYyLjAscjYscjEwCTsgSW1tZWRpYXRlIGZvcm0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGZhODUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgcmVnaXN0ZXIgb3BlcmFuZHMKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTAzIDAwIDNiIDI5LioKLSAgIDQ6CTAzIDIwIDNiIDI5LioKLSAgIDg6CTA1IDIwIDMyIDExLioKLSAgIGM6CTA1IDIwIDMyIDExLioKLSAgMTA6CTBhIDAwIDMzIDczLioKLSAgMTQ6CTBhIDgwIDMyIDczLioKLSAgMTg6CTBhIDQwIDMyIDczLioKLSAgMWM6CTBhIDQwIDM5IDFhLioKLSAgMjA6CTBhIDYwIDM5IGZhLioKLSAgMjQ6CTBhIDAwIDM5IDIyLioKLSAgMjg6CTBhIDIwIDM5IDJhLioKLSAgMmM6CTA0IDgwIGI5IDIxLioKLSAgMzA6CTA0IGEwIGI5IDIxLioKLSAgMzQ6CTA2IDAwIDM5IDAwLioKLSAgMzg6CTA2IDIwIDM5IDAwLioKLSAgM2M6CTBhIDAwIDAzIDAwLioKLSAgNDA6CTA2IDAwIDM4IGY4LioKLSAgNDQ6CTA2IDIwIDM4IGY4LioKLSAgNDg6CTA3IDQwIDMwIDAwLioKLSAgNGM6CTAzIDAwIDNhIDI5LioKLSAgNTA6CTA4IDAwIGI3IDAyLioKLSAgNTQ6CTA4IDAwIGI3IDBhLioKLSAgNTg6CTA0IDA0IGI0IDQxLioKLSAgNWM6CTA0IDI0IGI0IDQxLioKLSAgNjA6CTA0IDQ0IGI0IDQxLioKLSAgNjQ6CTA0IDY0IGI0IDQxLioKLSAgNjg6CTA0IDA0IGI1IDQxLioKLSAgNmM6CTA0IDI0IGI1IDQxLioKLSAgNzA6CTA0IDA0IGI2IDQxLioKLSAgNzQ6CTA0IDI0IGI2IDQxLioKLSAgNzg6CTA0IDQ0IGI2IDQxLioKLSAgN2M6CTA0IDY0IGI2IDQxLioKLSAgODA6CTA1IDIwIDMwIDA4LioKLSAgODQ6CWUzIDQ3IDcxIDMxLioKLSAgODg6CWMyIDA3IDcxIDQ5LioKLSAgOGM6CTAyIDAwIDNlIDMxLioKLSAgOTA6CTAyIDAyIDNlIDMxLioKLSAgOTQ6CTgyIDAyIDNlIDMxLioKLSAgOTg6CTIyIDAyIDNlIDMxLioKLSAgOWM6CWEyIDAyIDNlIDMxLioKLSAgYTA6CTA0IGEwIGJlIDQxLioKLSAgYTQ6CTg0IGEwIGJlIDQxLioKLSAgYTg6CTI0IGEwIGJlIDQxLioKLSAgYWM6CWE0IGEwIGJlIDQxLioKLSAgYjA6CTAyIDYwIDNlIDMxLioKLSAgYjQ6CTAyIDYyIDNlIDMxLioKLSAgYjg6CTgyIDYyIDNlIDMxLioKLSAgYmM6CTIyIDYyIDNlIDMxLioKLSAgYzA6CWEyIDYyIDNlIDMxLioKLSAgYzQ6CTAyIDQwIDNlIDMxLioKLSAgYzg6CTAyIDQyIDNlIDMxLioKLSAgY2M6CTgyIDQyIDNlIDMxLioKLSAgZDA6CTIyIDQyIDNlIDMxLioKLSAgZDQ6CWEyIDQyIDNlIDMxLioKLSAgZDg6CTQyIDQ1IDNlIDMxLioKLSAgZGM6CWUyIDQ3IDNlIDMxLioKLSAgZTA6CTg0IDgxIDNlIDMwLioKLSAgZTQ6CTg0IDgzIDNlIDMwLioKLSAgZTg6CTg0IDg1IDNlIDMwLioKLSAgZWM6CTg0IDg3IDNlIDMwLioKLSAgZjA6CWEyIDgxIDNlIDQwLioKLSAgZjQ6CWEyIDgzIDNlIDQwLioKLSAgZjg6CWEyIDg1IDNlIDQwLioKLSAgZmM6CWEyIDg3IDNlIDQwLioKLSAxMDA6CWM0IDgxIDNlIDMwLioKLSAxMDQ6CWM0IDgzIDNlIDMwLioKLSAxMDg6CWUyIDgxIDNlIDQwLioKLSAxMGM6CWUyIDgzIDNlIDQwLioKLSAxMTA6CTA0IDgwIDNlIDMwLioKLSAxMTQ6CTA0IDgyIDNlIDMwLioKLSAxMTg6CTA0IDg0IDNlIDMwLioKLSAxMWM6CTA0IDg2IDNlIDMwLioKLSAxMjA6CTIyIDgwIDNlIDQwLioKLSAxMjQ6CTIyIDgyIDNlIDQwLioKLSAxMjg6CTIyIDg0IDNlIDQwLioKLSAxMmM6CTIyIDg2IDNlIDQwLioKLSAxMzA6CTQ0IDgwIDNlIDMwLioKLSAxMzQ6CTQ0IDgyIDNlIDMwLioKLSAxMzg6CTYyIDgwIDNlIDQwLioKLSAxM2M6CTYyIDgyIDNlIDQwLioKLSAxNDA6CTA0IDgxIDNlIDMwLioKLSAxNDQ6CTA0IDgzIDNlIDMwLioKLSAxNDg6CTA0IDg1IDNlIDMwLioKLSAxNGM6CTA0IDg3IDNlIDMwLioKLSAxNTA6CTIyIDgxIDNlIDQwLioKLSAxNTQ6CTIyIDgzIDNlIDQwLioKLSAxNTg6CTIyIDg1IDNlIDQwLioKLSAxNWM6CTIyIDg3IDNlIDQwLioKLSAxNjA6CTQ0IDgxIDNlIDMwLioKLSAxNjQ6CTQ0IDgzIDNlIDMwLioKLSAxNjg6CTYyIDgxIDNlIDQwLioKLSAxNmM6CTYyIDgzIDNlIDQwLioKLSAxNzA6CTg0IDgwIDNlIDMwLioKLSAxNzQ6CTg0IDgyIDNlIDMwLioKLSAxNzg6CTg0IDg0IDNlIDMwLioKLSAxN2M6CTg0IDg2IDNlIDMwLioKLSAxODA6CWEyIDgwIDNlIDQwLioKLSAxODQ6CWEyIDgyIDNlIDQwLioKLSAxODg6CWEyIDg0IDNlIDQwLioKLSAxOGM6CWEyIDg2IDNlIDQwLioKLSAxOTA6CWM0IDgwIDNlIDMwLioKLSAxOTQ6CWM0IDgyIDNlIDMwLioKLSAxOTg6CWUyIDgwIDNlIDQwLioKLSAxOWM6CWUyIDgyIDNlIDQwLioKLSAxYTA6CTA2IGUwIDNlIDQwLioKLSAxYTQ6CTA2IGUyIDNlIDQwLioKLSAxYTg6CTI2IGUyIDNlIDQwLioKLSAxYWM6CTAyIDIwIDNlIDMxLioKLSAxYjA6CTAyIDIyIDNlIDMxLioKLSAxYjQ6CTgyIDIyIDNlIDMxLioKLSAxYjg6CTIyIDIyIDNlIDMxLioKLSAxYmM6CWEyIDIyIDNlIDMxLioKLSAxYzA6CWU0IGUzIDMxIDUyLioKLSAxYzQ6CTA0IDgwIGI4IDQxLioKLSAxYzg6CTA0IGEwIGI4IDQxLioKLSAxY2M6CTA0IDAwIGI0IDQxLioKLSAxZDA6CTA0IDIwIGI0IDQxLioKLSAxZDQ6CTA0IDQwIGI0IDQxLioKLSAxZDg6CTA0IDYwIGI0IDQxLioKLSAxZGM6CTA0IDAwIGI1IDQxLioKLSAxZTA6CTA0IDIwIGI1IDQxLioKLSAxZTQ6CTAwIDAwIGZmIDQxLioKLSAxZTg6CTAxIGUwIGIyIDE4LioKLSAxZWM6CTAxIGUwIGIyIDE4LioKLSAxZjA6CTAxIGMwIGIzIDE4LioKLSAxZjQ6CTAxIGEwIGIzIDE4LioKLSAxZjg6CTAxIDYwIGIzIDE4LioKLSAxZmM6CTA2IDgwIDMwIDIwLioKLSAyMDA6CTAwIDIwIDNmIDI5LioKLSAyMDQ6CWUyIDAzIDMxIDUyLioKLSAyMDg6CWU4IDA3IGIxIDMwLioKLSAyMGM6CWU0IGMzIGIxIDMwLioKLSAyMTA6CTg0IDAxIDcxIDMxLioKLSAyMTQ6CTg0IDIxIDcxIDMxLioKLSAyMTg6CTg0IDQxIDcxIDMxLioKLSAyMWM6CTg0IDYxIDcxIDMxLioKLSAyMjA6CTg0IDgxIDcxIDMxLioKLSAyMjQ6CTg0IGExIDcxIDMxLioKLSAyMjg6CTg0IGMxIDcxIDMxLioKLSAyMmM6CTg0IGUxIDcxIDMxLioKLSAyMzA6CTg0IDA5IDcxIDMxLioKLSAyMzQ6CTg0IDI5IDcxIDMxLioKLSAyMzg6CTg0IDQ5IDcxIDMxLioKLSAyM2M6CTg0IDY5IDcxIDMxLioKLSAyNDA6CTg0IDg5IDcxIDMxLioKLSAyNDQ6CTg0IGE5IDcxIDMxLioKLSAyNDg6CTg0IGM5IDcxIDMxLioKLSAyNGM6CTg0IGU5IDcxIDMxLioKLSAyNTA6CTg0IDA1IDcxIDMxLioKLSAyNTQ6CTg0IDI1IDcxIDMxLioKLSAyNTg6CTg0IDQ1IDcxIDMxLioKLSAyNWM6CTg0IDY1IDcxIDMxLioKLSAyNjA6CTg0IDg1IDcxIDMxLioKLSAyNjQ6CTg0IGE1IDcxIDMxLioKLSAyNjg6CTg0IGM1IDcxIDMxLioKLSAyNmM6CTg0IGU1IDcxIDMxLioKLSAyNzA6CTA0IGE0IGIxIDQxLioKLSAyNzQ6CTg0IDBkIDcxIDMxLioKLSAyNzg6CTg0IDJkIDcxIDMxLioKLSAyN2M6CTg0IDRkIDcxIDMxLioKLSAyODA6CTg0IDZkIDcxIDMxLioKLSAyODQ6CTg0IDhkIDcxIDMxLioKLSAyODg6CTg0IGFkIDcxIDMxLioKLSAyOGM6CTg0IGNkIDcxIDMxLioKLSAyOTA6CTg0IGVkIDcxIDMxLioKLSAyOTQ6CTA0IDY0IGIxIDQxLioKLSAyOTg6CTA0IDAwIGI2IDQxLioKLSAyOWM6CTA0IDIwIGI2IDQxLioKLSAyYTA6CTA0IDQwIGI2IDQxLioKLSAyYTQ6CTA0IDYwIGI2IDQxLioKLSAyYTg6CTA3IDQwIDNiIDRhLioKLSAyYWM6CTA3IDYwIDNiIDRhLioKLSAyYjA6CTA4IGEwIGIwIDIxLioKLSAyYjQ6CTBhIDIwIDMwIDAwLioKLSAyYjg6CTAyIDAwIDNjIDAxLioKLSAyYmM6CTgyIDAwIGJjIDAxLioKLSAyYzA6CWEyIDAwIGJjIDAyLioKLSAyYzQ6CTA2IGEwIDcwIDAxLioKLSAyYzg6CTA1IDIwIGIzIDM5LioKLSAyY2M6CTA3IGMwIDMyIDRhLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODg5ZGQxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgIDs7IFNpbXBsZSByZWdpc3RlciBmb3JtcwotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgVGhvc2UgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFsc28gdXNlIGFuIGltbWVkaWF0ZSBqdXN0IHVzZSBhIGNvbnN0YW50LgotICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDQgMDAwMDAwMDAgICAgICAgICAgICAgICAgICAgIC50ZXh0Ci0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNiAwMDAwMDAwMCAgIDI5M0IwMDAzICAgICAgICAgYWRkICAgICAgICAgICAgIHIzLHI0LHI1Ci0gICAgICAgIDcgMDAwMDAwMDQgICAyOTNCMjAwMyAgICAgICAgIGFkZHUgICAgICAgICAgICByMyxyNCxyNQotICAgICAgICA4IDAwMDAwMDA4ICAgMTEzMjIwMDUgICAgICAgICBhbmQgICAgICAgICAgICAgcjUscjQscjIKLSAgICAgICAgOSAwMDAwMDAwQyAgIDExMzIyMDA1ICAgICAgICAgYW5kLnR0ICAgICAgICAgIHI1LHI0LHIyCi0gICAgICAgMTAgMDAwMDAwMTAgICA3MzMzMDAwQSAgICAgICAgIGFuZC5mZiAgICAgICAgICByMTAscjEyLHIxNAotICAgICAgIDExIDAwMDAwMDE0ICAgNzMzMjgwMEEgICAgICAgICBhbmQuZnQgICAgICAgICAgcjEwLHIxMixyMTQKLSAgICAgICAxMiAwMDAwMDAxOCAgIDczMzI0MDBBICAgICAgICAgYW5kLnRmICAgICAgICAgIHIxMCxyMTIscjE0Ci0gICAgICAgMTMgMDAwMDAwMUMgICAxQTM5NDAwQSAgICAgICAgIGJibyAgICAgICAgICAgICByMTAscjgsbG8udwotICAgICAgIDE0IDAwMDAwMDIwICAgRkEzOTYwMEEgICAgICAgICBiYm8uYSAgICAgICAgICAgcjEwLHI4LGVxLmIKLSAgICAgICAxNSAwMDAwMDAyNCAgIDIyMzkwMDBBICAgICAgICAgYmJ6ICAgICAgICAgICAgIHIxMCxyOCxscy53Ci0gICAgICAgMTYgMDAwMDAwMjggICAyQTM5MjAwQSAgICAgICAgIGJiei5hICAgICAgICAgICByMTAscjgsaGkudwotICAgICAgIDE3IDAwMDAwMDJDICAgMjFCOTgwMDQgICAgICAgICBiY25kICAgICAgICAgICAgcjQscjYsbHQwLmIKLSAgICAgICAxOCAwMDAwMDAzMCAgIDIxQjlBMDA0ICAgICAgICAgYmNuZC5hICAgICAgICAgIHI0LHI2LGx0MC5iCi0gICAgICAgMTkgMDAwMDAwMzQgICAwMDM5MDAwNiAgICAgICAgIGJyICAgICAgICAgICAgICByNgotICAgICAgIDIwIDAwMDAwMDM4ICAgMDAzOTIwMDYgICAgICAgICBici5hICAgICAgICAgICAgcjYKLSAgICAgICAyMSAwMDAwMDAzQyAgIDAwMDMwMDBBICAgICAgICAgYnJjciAgICAgICAgICAgIDEwCi0gICAgICAgMjIgMDAwMDAwNDAgICBGODM4MDAwNiAgICAgICAgIGJzciAgICAgICAgICAgICByNixyMzEKLSAgICAgICAyMyAwMDAwMDA0NCAgIEY4MzgyMDA2ICAgICAgICAgYnNyLmEgICAgICAgICAgIHI2LHIzMQotICAgICAgIDI0IDAwMDAwMDQ4ICAgMDAzMDQwMDcgICAgICAgICBjbW5kICAgICAgICAgICAgcjcKLSAgICAgICAyNSAwMDAwMDA0QyAgIDI5M0EwMDAzICAgICAgICAgY21wICAgICAgICAgICAgIHIzLHI0LHI1Ci0gICAgICAgMjYgMDAwMDAwNTAgICAwMkI3MDAwOCAgICAgICAgIGRjYWNoZWMgICAgICAgICByOChyMTApCi0gICAgICAgMjcgMDAwMDAwNTQgICAwQUI3MDAwOCAgICAgICAgIGRjYWNoZWYgICAgICAgICByOChyMTApCi0gICAgICAgMjggMDAwMDAwNTggICA0MUI0MDQwNCAgICAgICAgIGRsZC5iICAgICAgICAgICByNChyNikscjgKLSAgICAgICAyOSAwMDAwMDA1QyAgIDQxQjQyNDA0ICAgICAgICAgZGxkLmggICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDMwIDAwMDAwMDYwICAgNDFCNDQ0MDQgICAgICAgICBkbGQgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzEgMDAwMDAwNjQgICA0MUI0NjQwNCAgICAgICAgIGRsZC5kICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzMiAwMDAwMDA2OCAgIDQxQjUwNDA0ICAgICAgICAgZGxkLnViICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDMzIDAwMDAwMDZDICAgNDFCNTI0MDQgICAgICAgICBkbGQudWggICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzQgMDAwMDAwNzAgICA0MUI2MDQwNCAgICAgICAgIGRzdC5iICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzNSAwMDAwMDA3NCAgIDQxQjYyNDA0ICAgICAgICAgZHN0LmggICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgIDM2IDAwMDAwMDc4ICAgNDFCNjQ0MDQgICAgICAgICBkc3QgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAgMzcgMDAwMDAwN0MgICA0MUI2NjQwNCAgICAgICAgIGRzdC5kICAgICAgICAgICByNChyNikscjgKLSAgICAgICAzOCAwMDAwMDA4MCAgIDA4MzAyMDA1ICAgICAgICAgZXRyYXAgICAgICAgICAgIHI1Ci0gICAgICAgMzkgMDAwMDAwODQgICAzMTcxNDdFMyAgICAgICAgIGV4dHMgICAgICAgICAgICByMywzMSxyNSxyNgotICAgICAgIDQwIDAwMDAwMDg4ICAgNDk3MTA3QzIgICAgICAgICBleHR1ICAgICAgICAgICAgcjIsMzAscjUscjkKLSAgICAgICA0MSAwMDAwMDA4QyAgIDMxM0UwMDAyICAgICAgICAgZmFkZC5zc3MgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNDIgMDAwMDAwOTAgICAzMTNFMDIwMiAgICAgICAgIGZhZGQuc3NkICAgICAgICByMixyNCxyNgotICAgICAgIDQzIDAwMDAwMDk0ICAgMzEzRTAyODIgICAgICAgICBmYWRkLnNkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA0NCAwMDAwMDA5OCAgIDMxM0UwMjIyICAgICAgICAgZmFkZC5kc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNDUgMDAwMDAwOUMgICAzMTNFMDJBMiAgICAgICAgIGZhZGQuZGRkICAgICAgICByMixyNCxyNgotICAgICAgIDQ2IDAwMDAwMEEwICAgNDFCRUEwMDQgICAgICAgICBmY21wLnNzICAgICAgICAgcjQscjYscjgKLSAgICAgICA0NyAwMDAwMDBBNCAgIDQxQkVBMDg0ICAgICAgICAgZmNtcC5zZCAgICAgICAgIHI0LHI2LHI4Ci0gICAgICAgNDggMDAwMDAwQTggICA0MUJFQTAyNCAgICAgICAgIGZjbXAuZHMgICAgICAgICByNCxyNixyOAotICAgICAgIDQ5IDAwMDAwMEFDICAgNDFCRUEwQTQgICAgICAgICBmY21wLmRkICAgICAgICAgcjQscjYscjgKLSAgICAgICA1MCAwMDAwMDBCMCAgIDMxM0U2MDAyICAgICAgICAgZmRpdi5zc3MgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTEgMDAwMDAwQjQgICAzMTNFNjIwMiAgICAgICAgIGZkaXYuc3NkICAgICAgICByMixyNCxyNgotICAgICAgIDUyIDAwMDAwMEI4ICAgMzEzRTYyODIgICAgICAgICBmZGl2LnNkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1MyAwMDAwMDBCQyAgIDMxM0U2MjIyICAgICAgICAgZmRpdi5kc2QgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTQgMDAwMDAwQzAgICAzMTNFNjJBMiAgICAgICAgIGZkaXYuZGRkICAgICAgICByMixyNCxyNgotICAgICAgIDU1IDAwMDAwMEM0ICAgMzEzRTQwMDIgICAgICAgICBmbXB5LnNzcyAgICAgICAgcjIscjQscjYKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDIKLQotICAgICAgIDU2IDAwMDAwMEM4ICAgMzEzRTQyMDIgICAgICAgICBmbXB5LnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgICA1NyAwMDAwMDBDQyAgIDMxM0U0MjgyICAgICAgICAgZm1weS5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNTggMDAwMDAwRDAgICAzMTNFNDIyMiAgICAgICAgIGZtcHkuZHNkICAgICAgICByMixyNCxyNgotICAgICAgIDU5IDAwMDAwMEQ0ICAgMzEzRTQyQTIgICAgICAgICBmbXB5LmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgICA2MCAwMDAwMDBEOCAgIDMxM0U0NTQyICAgICAgICAgZm1weS5paWkgICAgICAgIHIyLHI0LHI2Ci0gICAgICAgNjEgMDAwMDAwREMgICAzMTNFNDdFMiAgICAgICAgIGZtcHkudXV1ICAgICAgICByMixyNCxyNgotICAgICAgIDYyIDAwMDAwMEUwICAgMzAzRTgxODQgICAgICAgICBmcm5kbS5zcyAgICAgICAgcjQscjYKLSAgICAgICA2MyAwMDAwMDBFNCAgIDMwM0U4Mzg0ICAgICAgICAgZnJuZG0uc2QgICAgICAgIHI0LHI2Ci0gICAgICAgNjQgMDAwMDAwRTggICAzMDNFODU4NCAgICAgICAgIGZybmRtLnNpICAgICAgICByNCxyNgotICAgICAgIDY1IDAwMDAwMEVDICAgMzAzRTg3ODQgICAgICAgICBmcm5kbS5zdSAgICAgICAgcjQscjYKLSAgICAgICA2NiAwMDAwMDBGMCAgIDQwM0U4MUEyICAgICAgICAgZnJuZG0uZHMgICAgICAgIHIyLHI4Ci0gICAgICAgNjcgMDAwMDAwRjQgICA0MDNFODNBMiAgICAgICAgIGZybmRtLmRkICAgICAgICByMixyOAotICAgICAgIDY4IDAwMDAwMEY4ICAgNDAzRTg1QTIgICAgICAgICBmcm5kbS5kaSAgICAgICAgcjIscjgKLSAgICAgICA2OSAwMDAwMDBGQyAgIDQwM0U4N0EyICAgICAgICAgZnJuZG0uZHUgICAgICAgIHIyLHI4Ci0gICAgICAgNzAgMDAwMDAxMDAgICAzMDNFODFDNCAgICAgICAgIGZybmRtLmlzICAgICAgICByNCxyNgotICAgICAgIDcxIDAwMDAwMTA0ICAgMzAzRTgzQzQgICAgICAgICBmcm5kbS5pZCAgICAgICAgcjQscjYKLSAgICAgICA3MiAwMDAwMDEwOCAgIDQwM0U4MUUyICAgICAgICAgZnJuZG0udXMgICAgICAgIHIyLHI4Ci0gICAgICAgNzMgMDAwMDAxMEMgICA0MDNFODNFMiAgICAgICAgIGZybmRtLnVkICAgICAgICByMixyOAotICAgICAgIDc0IDAwMDAwMTEwICAgMzAzRTgwMDQgICAgICAgICBmcm5kbi5zcyAgICAgICAgcjQscjYKLSAgICAgICA3NSAwMDAwMDExNCAgIDMwM0U4MjA0ICAgICAgICAgZnJuZG4uc2QgICAgICAgIHI0LHI2Ci0gICAgICAgNzYgMDAwMDAxMTggICAzMDNFODQwNCAgICAgICAgIGZybmRuLnNpICAgICAgICByNCxyNgotICAgICAgIDc3IDAwMDAwMTFDICAgMzAzRTg2MDQgICAgICAgICBmcm5kbi5zdSAgICAgICAgcjQscjYKLSAgICAgICA3OCAwMDAwMDEyMCAgIDQwM0U4MDIyICAgICAgICAgZnJuZG4uZHMgICAgICAgIHIyLHI4Ci0gICAgICAgNzkgMDAwMDAxMjQgICA0MDNFODIyMiAgICAgICAgIGZybmRuLmRkICAgICAgICByMixyOAotICAgICAgIDgwIDAwMDAwMTI4ICAgNDAzRTg0MjIgICAgICAgICBmcm5kbi5kaSAgICAgICAgcjIscjgKLSAgICAgICA4MSAwMDAwMDEyQyAgIDQwM0U4NjIyICAgICAgICAgZnJuZG4uZHUgICAgICAgIHIyLHI4Ci0gICAgICAgODIgMDAwMDAxMzAgICAzMDNFODA0NCAgICAgICAgIGZybmRuLmlzICAgICAgICByNCxyNgotICAgICAgIDgzIDAwMDAwMTM0ICAgMzAzRTgyNDQgICAgICAgICBmcm5kbi5pZCAgICAgICAgcjQscjYKLSAgICAgICA4NCAwMDAwMDEzOCAgIDQwM0U4MDYyICAgICAgICAgZnJuZG4udXMgICAgICAgIHIyLHI4Ci0gICAgICAgODUgMDAwMDAxM0MgICA0MDNFODI2MiAgICAgICAgIGZybmRuLnVkICAgICAgICByMixyOAotICAgICAgIDg2IDAwMDAwMTQwICAgMzAzRTgxMDQgICAgICAgICBmcm5kcC5zcyAgICAgICAgcjQscjYKLSAgICAgICA4NyAwMDAwMDE0NCAgIDMwM0U4MzA0ICAgICAgICAgZnJuZHAuc2QgICAgICAgIHI0LHI2Ci0gICAgICAgODggMDAwMDAxNDggICAzMDNFODUwNCAgICAgICAgIGZybmRwLnNpICAgICAgICByNCxyNgotICAgICAgIDg5IDAwMDAwMTRDICAgMzAzRTg3MDQgICAgICAgICBmcm5kcC5zdSAgICAgICAgcjQscjYKLSAgICAgICA5MCAwMDAwMDE1MCAgIDQwM0U4MTIyICAgICAgICAgZnJuZHAuZHMgICAgICAgIHIyLHI4Ci0gICAgICAgOTEgMDAwMDAxNTQgICA0MDNFODMyMiAgICAgICAgIGZybmRwLmRkICAgICAgICByMixyOAotICAgICAgIDkyIDAwMDAwMTU4ICAgNDAzRTg1MjIgICAgICAgICBmcm5kcC5kaSAgICAgICAgcjIscjgKLSAgICAgICA5MyAwMDAwMDE1QyAgIDQwM0U4NzIyICAgICAgICAgZnJuZHAuZHUgICAgICAgIHIyLHI4Ci0gICAgICAgOTQgMDAwMDAxNjAgICAzMDNFODE0NCAgICAgICAgIGZybmRwLmlzICAgICAgICByNCxyNgotICAgICAgIDk1IDAwMDAwMTY0ICAgMzAzRTgzNDQgICAgICAgICBmcm5kcC5pZCAgICAgICAgcjQscjYKLSAgICAgICA5NiAwMDAwMDE2OCAgIDQwM0U4MTYyICAgICAgICAgZnJuZHAudXMgICAgICAgIHIyLHI4Ci0gICAgICAgOTcgMDAwMDAxNkMgICA0MDNFODM2MiAgICAgICAgIGZybmRwLnVkICAgICAgICByMixyOAotICAgICAgIDk4IDAwMDAwMTcwICAgMzAzRTgwODQgICAgICAgICBmcm5kei5zcyAgICAgICAgcjQscjYKLSAgICAgICA5OSAwMDAwMDE3NCAgIDMwM0U4Mjg0ICAgICAgICAgZnJuZHouc2QgICAgICAgIHI0LHI2Ci0gICAgICAxMDAgMDAwMDAxNzggICAzMDNFODQ4NCAgICAgICAgIGZybmR6LnNpICAgICAgICByNCxyNgotICAgICAgMTAxIDAwMDAwMTdDICAgMzAzRTg2ODQgICAgICAgICBmcm5kei5zdSAgICAgICAgcjQscjYKLSAgICAgIDEwMiAwMDAwMDE4MCAgIDQwM0U4MEEyICAgICAgICAgZnJuZHouZHMgICAgICAgIHIyLHI4Ci0gICAgICAxMDMgMDAwMDAxODQgICA0MDNFODJBMiAgICAgICAgIGZybmR6LmRkICAgICAgICByMixyOAotICAgICAgMTA0IDAwMDAwMTg4ICAgNDAzRTg0QTIgICAgICAgICBmcm5kei5kaSAgICAgICAgcjIscjgKLSAgICAgIDEwNSAwMDAwMDE4QyAgIDQwM0U4NkEyICAgICAgICAgZnJuZHouZHUgICAgICAgIHIyLHI4Ci0gICAgICAxMDYgMDAwMDAxOTAgICAzMDNFODBDNCAgICAgICAgIGZybmR6LmlzICAgICAgICByNCxyNgotICAgICAgMTA3IDAwMDAwMTk0ICAgMzAzRTgyQzQgICAgICAgICBmcm5kei5pZCAgICAgICAgcjQscjYKLSAgICAgIDEwOCAwMDAwMDE5OCAgIDQwM0U4MEUyICAgICAgICAgZnJuZHoudXMgICAgICAgIHIyLHI4Ci0gICAgICAxMDkgMDAwMDAxOUMgICA0MDNFODJFMiAgICAgICAgIGZybmR6LnVkICAgICAgICByMixyOAotICAgICAgMTEwIDAwMDAwMUEwICAgNDAzRUUwMDYgICAgICAgICBmc3FydC5zcyAgICAgICAgcjYscjgKLQxNVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIE1vbiBGZWIgMTAgMTc6MDA6MjQgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDMKLQotICAgICAgMTExIDAwMDAwMUE0ICAgNDAzRUUyMDYgICAgICAgICBmc3FydC5zZCAgICAgICAgcjYscjgKLSAgICAgIDExMiAwMDAwMDFBOCAgIDQwM0VFMjI2ICAgICAgICAgZnNxcnQuZGQgICAgICAgIHI2LHI4Ci0gICAgICAxMTMgMDAwMDAxQUMgICAzMTNFMjAwMiAgICAgICAgIGZzdWIuc3NzICAgICAgICByMixyNCxyNgotICAgICAgMTE0IDAwMDAwMUIwICAgMzEzRTIyMDIgICAgICAgICBmc3ViLnNzZCAgICAgICAgcjIscjQscjYKLSAgICAgIDExNSAwMDAwMDFCNCAgIDMxM0UyMjgyICAgICAgICAgZnN1Yi5zZGQgICAgICAgIHIyLHI0LHI2Ci0gICAgICAxMTYgMDAwMDAxQjggICAzMTNFMjIyMiAgICAgICAgIGZzdWIuZHNkICAgICAgICByMixyNCxyNgotICAgICAgMTE3IDAwMDAwMUJDICAgMzEzRTIyQTIgICAgICAgICBmc3ViLmRkZCAgICAgICAgcjIscjQscjYKLSAgICAgIDExOCAwMDAwMDFDMCAgIDUyMzFFM0U0ICAgICAgICAgaW5zICAgICAgICAgICAgIHI0LDMxLHI4LHIxMAotICAgICAgMTE5IDAwMDAwMUM0ICAgNDFCODgwMDQgICAgICAgICBqc3IgICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjAgMDAwMDAxQzggICA0MUI4QTAwNCAgICAgICAgIGpzci5hICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyMSAwMDAwMDFDQyAgIDQxQjQwMDA0ICAgICAgICAgbGQuYiAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTIyIDAwMDAwMUQwICAgNDFCNDIwMDQgICAgICAgICBsZC5oICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjMgMDAwMDAxRDQgICA0MUI0NDAwNCAgICAgICAgIGxkICAgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyNCAwMDAwMDFEOCAgIDQxQjQ2MDA0ICAgICAgICAgbGQuZCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTI1IDAwMDAwMURDICAgNDFCNTAwMDQgICAgICAgICBsZC51YiAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxMjYgMDAwMDAxRTAgICA0MUI1MjAwNCAgICAgICAgIGxkLnVoICAgICAgICAgICByNChyNikscjgKLSAgICAgIDEyNyAwMDAwMDFFNCAgIDQxRkYwMDA3ICAgICAgICAgbG1vICAgICAgICAgICAgIHI3LHI4Ci0gICAgICAxMjggMDAwMDAxRTggICAxOEIyRTAwMSAgICAgICAgIG9yICAgICAgICAgICAgICByMSxyMixyMwotICAgICAgMTI5IDAwMDAwMUVDICAgMThCMkUwMDEgICAgICAgICBvci50dCAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEzMCAwMDAwMDFGMCAgIDE4QjNDMDAxICAgICAgICAgb3IuZmYgICAgICAgICAgIHIxLHIyLHIzCi0gICAgICAxMzEgMDAwMDAxRjQgICAxOEIzQTAwMSAgICAgICAgIG9yLmZ0ICAgICAgICAgICByMSxyMixyMwotICAgICAgMTMyIDAwMDAwMUY4ICAgMThCMzYwMDEgICAgICAgICBvci50ZiAgICAgICAgICAgcjEscjIscjMKLSAgICAgIDEzMyAwMDAwMDFGQyAgIDIwMzA4MDA2ICAgICAgICAgcmRjciAgICAgICAgICAgIHI2LHI0Ci0gICAgICAxMzQgMDAwMDAyMDAgICAyOTNGMjAwNCAgICAgICAgIHJtbyAgICAgICAgICAgICByNCxyNQotICAgICAgMTM1IDAwMDAwMjA0ICAgNTIzMTAzRTIgICAgICAgICByb3RsICAgICAgICAgICAgcjIsMzEscjgscjEwCi0gICAgICAxMzYgMDAwMDAyMDggICAzMEIxMDdFOCAgICAgICAgIHJvdHIgICAgICAgICAgICByOCwzMSxyMixyNgotICAgICAgMTM3IDAwMDAwMjBDICAgMzBCMUMzRTQgICAgICAgICBzaGwgICAgICAgICAgICAgcjQsMzEscjIscjYKLSAgICAgIDEzOCAwMDAwMDIxMCAgIDMxNzEwMTg0ICAgICAgICAgc2wuZHogICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxMzkgMDAwMDAyMTQgICAzMTcxMjE4NCAgICAgICAgIHNsLmRtICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQwIDAwMDAwMjE4ICAgMzE3MTQxODQgICAgICAgICBzbC5kcyAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0MSAwMDAwMDIxQyAgIDMxNzE2MTg0ICAgICAgICAgc2wuZXogICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDIgMDAwMDAyMjAgICAzMTcxODE4NCAgICAgICAgIHNsLmVtICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQzIDAwMDAwMjI0ICAgMzE3MUExODQgICAgICAgICBzbC5lcyAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0NCAwMDAwMDIyOCAgIDMxNzFDMTg0ICAgICAgICAgc2wuaXogICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDUgMDAwMDAyMkMgICAzMTcxRTE4NCAgICAgICAgIHNsLmltICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ2IDAwMDAwMjMwICAgMzE3MTA5ODQgICAgICAgICBzbGkuZHogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE0NyAwMDAwMDIzNCAgIDMxNzEyOTg0ICAgICAgICAgc2xpLmRtICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNDggMDAwMDAyMzggICAzMTcxNDk4NCAgICAgICAgIHNsaS5kcyAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTQ5IDAwMDAwMjNDICAgMzE3MTY5ODQgICAgICAgICBzbGkuZXogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1MCAwMDAwMDI0MCAgIDMxNzE4OTg0ICAgICAgICAgc2xpLmVtICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTEgMDAwMDAyNDQgICAzMTcxQTk4NCAgICAgICAgIHNsaS5lcyAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTUyIDAwMDAwMjQ4ICAgMzE3MUM5ODQgICAgICAgICBzbGkuaXogICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1MyAwMDAwMDI0QyAgIDMxNzFFOTg0ICAgICAgICAgc2xpLmltICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTQgMDAwMDAyNTAgICAzMTcxMDU4NCAgICAgICAgIHNyLmR6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU1IDAwMDAwMjU0ICAgMzE3MTI1ODQgICAgICAgICBzci5kbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1NiAwMDAwMDI1OCAgIDMxNzE0NTg0ICAgICAgICAgc3IuZHMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNTcgMDAwMDAyNUMgICAzMTcxNjU4NCAgICAgICAgIHNyLmV6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTU4IDAwMDAwMjYwICAgMzE3MTg1ODQgICAgICAgICBzci5lbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE1OSAwMDAwMDI2NCAgIDMxNzFBNTg0ICAgICAgICAgc3IuZXMgICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjAgMDAwMDAyNjggICAzMTcxQzU4NCAgICAgICAgIHNyLml6ICAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTYxIDAwMDAwMjZDICAgMzE3MUU1ODQgICAgICAgICBzci5pbSAgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2MiAwMDAwMDI3MCAgIDQxQjFBNDA0ICAgICAgICAgc3JhICAgICAgICAgICAgIHI0LDMyLHI2LHI4Ci0gICAgICAxNjMgMDAwMDAyNzQgICAzMTcxMEQ4NCAgICAgICAgIHNyaS5keiAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTY0IDAwMDAwMjc4ICAgMzE3MTJEODQgICAgICAgICBzcmkuZG0gICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2NSAwMDAwMDI3QyAgIDMxNzE0RDg0ICAgICAgICAgc3JpLmRzICAgICAgICAgIHI0LDEyLHI1LHI2Ci0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBNb24gRmViIDEwIDE3OjAwOjI0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICA0Ci0KLSAgICAgIDE2NiAwMDAwMDI4MCAgIDMxNzE2RDg0ICAgICAgICAgc3JpLmV6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNjcgMDAwMDAyODQgICAzMTcxOEQ4NCAgICAgICAgIHNyaS5lbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTY4IDAwMDAwMjg4ICAgMzE3MUFEODQgICAgICAgICBzcmkuZXMgICAgICAgICAgcjQsMTIscjUscjYKLSAgICAgIDE2OSAwMDAwMDI4QyAgIDMxNzFDRDg0ICAgICAgICAgc3JpLml6ICAgICAgICAgIHI0LDEyLHI1LHI2Ci0gICAgICAxNzAgMDAwMDAyOTAgICAzMTcxRUQ4NCAgICAgICAgIHNyaS5pbSAgICAgICAgICByNCwxMixyNSxyNgotICAgICAgMTcxIDAwMDAwMjk0ICAgNDFCMTY0MDQgICAgICAgICBzcmwgICAgICAgICAgICAgcjQsMzIscjYscjgKLSAgICAgIDE3MiAwMDAwMDI5OCAgIDQxQjYwMDA0ICAgICAgICAgc3QuYiAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTczIDAwMDAwMjlDICAgNDFCNjIwMDQgICAgICAgICBzdC5oICAgICAgICAgICAgcjQocjYpLHI4Ci0gICAgICAxNzQgMDAwMDAyQTAgICA0MUI2NDAwNCAgICAgICAgIHN0ICAgICAgICAgICAgICByNChyNikscjgKLSAgICAgIDE3NSAwMDAwMDJBNCAgIDQxQjY2MDA0ICAgICAgICAgc3QuZCAgICAgICAgICAgIHI0KHI2KSxyOAotICAgICAgMTc2IDAwMDAwMkE4ICAgNEEzQjQwMDcgICAgICAgICBzdWIgICAgICAgICAgICAgcjcscjgscjkKLSAgICAgIDE3NyAwMDAwMDJBQyAgIDRBM0I2MDA3ICAgICAgICAgc3VidSAgICAgICAgICAgIHI3LHI4LHI5Ci0gICAgICAxNzggMDAwMDAyQjAgICAyMUIwQTAwOCAgICAgICAgIHN3Y3IgICAgICAgICAgICByOCxyNixyNAotICAgICAgMTc5IDAwMDAwMkI0ICAgMDAzMDIwMEEgICAgICAgICB0cmFwICAgICAgICAgICAgcjEwCi0gICAgICAxODAgMDAwMDAyQjggICAwMTNDMDAwMiAgICAgICAgIHZhZGQuc3MgICAgICAgICByMixyNCxyNAotICAgICAgMTgxIDAwMDAwMkJDICAgMDFCQzAwODIgICAgICAgICB2YWRkLnNkICAgICAgICAgcjIscjYscjYKLSAgICAgIDE4MiAwMDAwMDJDMCAgIDAyQkMwMEEyICAgICAgICAgdmFkZC5kZCAgICAgICAgIHIyLHIxMCxyMTAKLSAgICAgIDE4MyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMC5zICAgICAgICAgIHI2Ci0gICAgICAxODQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZsZDEucyAgICAgICAgICByNwotICAgICAgMTg1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bGQwLmQgICAgICAgICAgcjYKLSAgICAgIDE4NiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdmxkMS5kICAgICAgICAgIHI4Ci0gICAgICAxODcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSwwLGEzCi0gICAgICAxODggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NzICAgICAgICByNyxyOSwwLHIxMAotICAgICAgMTg5ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzcyAgICAgICAgcjcscjksYTEsYTMKLSAgICAgIDE5MCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc3MgICAgICAgIHI3LHI5LGEzLHIxMAotICAgICAgMTkxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksMCxhMAotICAgICAgMTkyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bWFjLnNzZCAgICAgICAgcjcscjksMCxyMTAKLSAgICAgIDE5MyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1hYy5zc2QgICAgICAgIHI3LHI5LGExLGEyCi0gICAgICAxOTQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtYWMuc3NkICAgICAgICByNyxyOSxhMyxyMTAKLSAgICAgIDE5NSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1weS5zcyAgICAgICAgIHIxLHIzLHIzCi0gICAgICAxOTYgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtcHkuc2QgICAgICAgICByNSxyNixyNgotICAgICAgMTk3ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXB5LmRkICAgICAgICAgcjIscjQscjQKLSAgICAgIDE5OCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LDAsYTAKLSAgICAgIDE5OSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc3MgICAgICAgIHI3LHI5LDAscjEwCi0gICAgICAyMDAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NzICAgICAgICByNyxyOSxhMCxhMQotICAgICAgMjAxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzcyAgICAgICAgcjcscjksYTMscjEwCi0gICAgICAyMDIgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSwwLGEwCi0gICAgICAyMDMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc2Muc3NkICAgICAgICByNyxyOSwwLHIxMAotICAgICAgMjA0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXNjLnNzZCAgICAgICAgcjcscjksYTAsYTEKLSAgICAgIDIwNSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zYy5zc2QgICAgICAgIHI3LHI5LGEzLHIxMAotICAgICAgMjA2ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zcyAgICAgICAgcjYsYTIsYTQKLSAgICAgIDIwNyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdm1zdWIuc2QgICAgICAgIHI2LGEyLGE0Ci0gICAgICAyMDggICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZtc3ViLnNzICAgICAgICByNCxhNCxyNgotICAgICAgMjA5ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2bXN1Yi5zZCAgICAgICAgcjQsYTQscjYKLSAgICAgIDIxMCAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zaSAgICAgICAgIHI0LHI2Ci0gICAgICAyMTEgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2kgICAgICAgICByNCxhMAotICAgICAgMjEyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnN1ICAgICAgICAgcjQscjYKLSAgICAgIDIxMyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zdSAgICAgICAgIHI0LGEwCi0gICAgICAyMTQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc3MgICAgICAgICByNCxyNgotICAgICAgMjE1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnNzICAgICAgICAgcjQsYTAKLSAgICAgIDIxNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5zZCAgICAgICAgIHI0LHI2Ci0gICAgICAyMTcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuc2QgICAgICAgICByNCxhMAotICAgICAgMjE4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRpICAgICAgICAgcjQscjYKLSAgICAgIDIxOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kaSAgICAgICAgIHI0LGEwCi0gICAgICAyMjAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHUgICAgICAgICByNCxyNgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgTW9uIEZlYiAxMCAxNzowMDoyNCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wcy5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgNQotCi0gICAgICAyMjEgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZHUgICAgICAgICByNCxhMAotICAgICAgMjIyICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRzICAgICAgICAgcjQscjYKLSAgICAgIDIyMyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5kcyAgICAgICAgIHI0LGEwCi0gICAgICAyMjQgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuZGQgICAgICAgICByNCxyNgotICAgICAgMjI1ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLmRkICAgICAgICAgcjQsYTAKLSAgICAgIDIyNiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC5pcyAgICAgICAgIHI0LHI2Ci0gICAgICAyMjcgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZybmQuaWQgICAgICAgICByNCxyNgotICAgICAgMjI4ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2cm5kLnVzICAgICAgICAgcjQscjYKLSAgICAgIDIyOSAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnJuZC51ZCAgICAgICAgIHI0LHI2Ci0gICAgICAyMzAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdC5zICAgICAgICAgICByNgotICAgICAgMjMxICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3QuZCAgICAgICAgICAgcjYKLSAgICAgIDIzMiAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgdnN1Yi5zcyAgICAgICAgIHIyLHI0LHI2Ci0gICAgICAyMzMgICAgICAgICAgICAgICAgICAgICA7ICAgICAgIHZzdWIuc2QgICAgICAgICByMixyNCxyNgotICAgICAgMjM0ICAgICAgICAgICAgICAgICAgICAgOyAgICAgICB2c3ViLmRkICAgICAgICAgcjIscjQscjYKLSAgICAgIDIzNSAwMDAwMDJDNCAgIDAxNzBBMDA2ICAgICAgICAgd3JjciAgICAgICAgICAgIHI2LHI1Ci0gICAgICAyMzYgMDAwMDAyQzggICAzOUIzMjAwNSAgICAgICAgIHhub3IgICAgICAgICAgICByNSxyNixyNwotICAgICAgMjM3IDAwMDAwMkNDICAgNEEzMkMwMDcgICAgICAgICB4b3IgICAgICAgICAgICAgcjcscjgscjkKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY5MzUyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wcy5zCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLTs7IFNpbXBsZSByZWdpc3RlciBmb3JtcwotOzsgVGhvc2UgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFsc28gdXNlIGFuIGltbWVkaWF0ZSBqdXN0IHVzZSBhIGNvbnN0YW50LgotCi0JLnRleHQKLQotCWFkZAkJcjMscjQscjUKLQlhZGR1CQlyMyxyNCxyNQotCWFuZAkJcjUscjQscjIKLQlhbmQudHQJCXI1LHI0LHIyCi0JYW5kLmZmCQlyMTAscjEyLHIxNAotCWFuZC5mdAkJcjEwLHIxMixyMTQKLQlhbmQudGYJCXIxMCxyMTIscjE0Ci0JYmJvCQlyMTAscjgsbG8udwotCWJiby5hCQlyMTAscjgsZXEuYgotCWJiegkJcjEwLHI4LGxzLncKLQliYnouYQkJcjEwLHI4LGhpLncKLQliY25kCQlyNCxyNixsdDAuYgotCWJjbmQuYQkJcjQscjYsbHQwLmIKLQlicgkJcjYKLQlici5hCQlyNgotCWJyY3IJCTEwCi0JYnNyCQlyNixyMzEKLQlic3IuYQkJcjYscjMxCi0JY21uZAkJcjcKLQljbXAJCXIzLHI0LHI1Ci0JZGNhY2hlYwkJcjgocjEwKQotCWRjYWNoZWYJCXI4KHIxMCkKLQlkbGQuYgkJcjQocjYpLHI4Ci0JZGxkLmgJCXI0KHI2KSxyOAotCWRsZAkJcjQocjYpLHI4Ci0JZGxkLmQJCXI0KHI2KSxyOAotCWRsZC51YgkJcjQocjYpLHI4Ci0JZGxkLnVoCQlyNChyNikscjgKLQlkc3QuYgkJcjQocjYpLHI4Ci0JZHN0LmgJCXI0KHI2KSxyOAotCWRzdAkJcjQocjYpLHI4Ci0JZHN0LmQJCXI0KHI2KSxyOAotCWV0cmFwCQlyNQotCWV4dHMJCXIzLDMxLHI1LHI2Ci0JZXh0dQkJcjIsMzAscjUscjkKLQlmYWRkLnNzcwlyMixyNCxyNgotCWZhZGQuc3NkCXIyLHI0LHI2Ci0JZmFkZC5zZGQJcjIscjQscjYKLQlmYWRkLmRzZAlyMixyNCxyNgotCWZhZGQuZGRkCXIyLHI0LHI2Ci0JZmNtcC5zcwkJcjQscjYscjgKLQlmY21wLnNkCQlyNCxyNixyOAotCWZjbXAuZHMJCXI0LHI2LHI4Ci0JZmNtcC5kZAkJcjQscjYscjgKLQlmZGl2LnNzcwlyMixyNCxyNgotCWZkaXYuc3NkCXIyLHI0LHI2Ci0JZmRpdi5zZGQJcjIscjQscjYKLQlmZGl2LmRzZAlyMixyNCxyNgotCWZkaXYuZGRkCXIyLHI0LHI2Ci0JZm1weS5zc3MJcjIscjQscjYKLQlmbXB5LnNzZAlyMixyNCxyNgotCWZtcHkuc2RkCXIyLHI0LHI2Ci0JZm1weS5kc2QJcjIscjQscjYKLQlmbXB5LmRkZAlyMixyNCxyNgotCWZtcHkuaWlpCXIyLHI0LHI2Ci0JZm1weS51dXUJcjIscjQscjYKLQlmcm5kbS5zcwlyNCxyNgotCWZybmRtLnNkCXI0LHI2Ci0JZnJuZG0uc2kJcjQscjYKLQlmcm5kbS5zdQlyNCxyNgotCWZybmRtLmRzCXIyLHI4Ci0JZnJuZG0uZGQJcjIscjgKLQlmcm5kbS5kaQlyMixyOAotCWZybmRtLmR1CXIyLHI4Ci0JZnJuZG0uaXMJcjQscjYKLQlmcm5kbS5pZAlyNCxyNgotCWZybmRtLnVzCXIyLHI4Ci0JZnJuZG0udWQJcjIscjgKLQlmcm5kbi5zcwlyNCxyNgotCWZybmRuLnNkCXI0LHI2Ci0JZnJuZG4uc2kJcjQscjYKLQlmcm5kbi5zdQlyNCxyNgotCWZybmRuLmRzCXIyLHI4Ci0JZnJuZG4uZGQJcjIscjgKLQlmcm5kbi5kaQlyMixyOAotCWZybmRuLmR1CXIyLHI4Ci0JZnJuZG4uaXMJcjQscjYKLQlmcm5kbi5pZAlyNCxyNgotCWZybmRuLnVzCXIyLHI4Ci0JZnJuZG4udWQJcjIscjgKLQlmcm5kcC5zcwlyNCxyNgotCWZybmRwLnNkCXI0LHI2Ci0JZnJuZHAuc2kJcjQscjYKLQlmcm5kcC5zdQlyNCxyNgotCWZybmRwLmRzCXIyLHI4Ci0JZnJuZHAuZGQJcjIscjgKLQlmcm5kcC5kaQlyMixyOAotCWZybmRwLmR1CXIyLHI4Ci0JZnJuZHAuaXMJcjQscjYKLQlmcm5kcC5pZAlyNCxyNgotCWZybmRwLnVzCXIyLHI4Ci0JZnJuZHAudWQJcjIscjgKLQlmcm5kei5zcwlyNCxyNgotCWZybmR6LnNkCXI0LHI2Ci0JZnJuZHouc2kJcjQscjYKLQlmcm5kei5zdQlyNCxyNgotCWZybmR6LmRzCXIyLHI4Ci0JZnJuZHouZGQJcjIscjgKLQlmcm5kei5kaQlyMixyOAotCWZybmR6LmR1CXIyLHI4Ci0JZnJuZHouaXMJcjQscjYKLQlmcm5kei5pZAlyNCxyNgotCWZybmR6LnVzCXIyLHI4Ci0JZnJuZHoudWQJcjIscjgKLQlmc3FydC5zcwlyNixyOAotCWZzcXJ0LnNkCXI2LHI4Ci0JZnNxcnQuZGQJcjYscjgKLQlmc3ViLnNzcwlyMixyNCxyNgotCWZzdWIuc3NkCXIyLHI0LHI2Ci0JZnN1Yi5zZGQJcjIscjQscjYKLQlmc3ViLmRzZAlyMixyNCxyNgotCWZzdWIuZGRkCXIyLHI0LHI2Ci0JaW5zCQlyNCwzMSxyOCxyMTAKLQlqc3IJCXI0KHI2KSxyOAotCWpzci5hCQlyNChyNikscjgKLQlsZC5iCQlyNChyNikscjgKLQlsZC5oCQlyNChyNikscjgKLQlsZAkJcjQocjYpLHI4Ci0JbGQuZAkJcjQocjYpLHI4Ci0JbGQudWIJCXI0KHI2KSxyOAotCWxkLnVoCQlyNChyNikscjgKLQlsbW8JCXI3LHI4Ci0Jb3IJCXIxLHIyLHIzCi0Jb3IudHQJCXIxLHIyLHIzCi0Jb3IuZmYJCXIxLHIyLHIzCi0Jb3IuZnQJCXIxLHIyLHIzCi0Jb3IudGYJCXIxLHIyLHIzCi0JcmRjcgkJcjYscjQKLQlybW8JCXI0LHI1Ci0Jcm90bAkJcjIsMzEscjgscjEwCi0Jcm90cgkJcjgsMzEscjIscjYKLQlzaGwJCXI0LDMxLHIyLHI2Ci0Jc2wuZHoJCXI0LDEyLHI1LHI2Ci0Jc2wuZG0JCXI0LDEyLHI1LHI2Ci0Jc2wuZHMJCXI0LDEyLHI1LHI2Ci0Jc2wuZXoJCXI0LDEyLHI1LHI2Ci0Jc2wuZW0JCXI0LDEyLHI1LHI2Ci0Jc2wuZXMJCXI0LDEyLHI1LHI2Ci0Jc2wuaXoJCXI0LDEyLHI1LHI2Ci0Jc2wuaW0JCXI0LDEyLHI1LHI2Ci0Jc2xpLmR6CQlyNCwxMixyNSxyNgotCXNsaS5kbQkJcjQsMTIscjUscjYKLQlzbGkuZHMJCXI0LDEyLHI1LHI2Ci0Jc2xpLmV6CQlyNCwxMixyNSxyNgotCXNsaS5lbQkJcjQsMTIscjUscjYKLQlzbGkuZXMJCXI0LDEyLHI1LHI2Ci0Jc2xpLml6CQlyNCwxMixyNSxyNgotCXNsaS5pbQkJcjQsMTIscjUscjYKLQlzci5kegkJcjQsMTIscjUscjYKLQlzci5kbQkJcjQsMTIscjUscjYKLQlzci5kcwkJcjQsMTIscjUscjYKLQlzci5legkJcjQsMTIscjUscjYKLQlzci5lbQkJcjQsMTIscjUscjYKLQlzci5lcwkJcjQsMTIscjUscjYKLQlzci5pegkJcjQsMTIscjUscjYKLQlzci5pbQkJcjQsMTIscjUscjYKLQlzcmEJCXI0LDMyLHI2LHI4Ci0Jc3JpLmR6CQlyNCwxMixyNSxyNgotCXNyaS5kbQkJcjQsMTIscjUscjYKLQlzcmkuZHMJCXI0LDEyLHI1LHI2Ci0Jc3JpLmV6CQlyNCwxMixyNSxyNgotCXNyaS5lbQkJcjQsMTIscjUscjYKLQlzcmkuZXMJCXI0LDEyLHI1LHI2Ci0Jc3JpLml6CQlyNCwxMixyNSxyNgotCXNyaS5pbQkJcjQsMTIscjUscjYKLQlzcmwJCXI0LDMyLHI2LHI4Ci0Jc3QuYgkJcjQocjYpLHI4Ci0Jc3QuaAkJcjQocjYpLHI4Ci0Jc3QJCXI0KHI2KSxyOAotCXN0LmQJCXI0KHI2KSxyOAotCXN1YgkJcjcscjgscjkKLQlzdWJ1CQlyNyxyOCxyOQotCXN3Y3IJCXI4LHI2LHI0Ci0JdHJhcAkJcjEwCi0JdmFkZC5zcwkJcjIscjQscjQKLQl2YWRkLnNkCQlyMixyNixyNgotCXZhZGQuZGQJCXIyLHIxMCxyMTAKLTsJdmxkMC5zCQlyNgotOwl2bGQxLnMJCXI3Ci07CXZsZDAuZAkJcjYKLTsJdmxkMS5kCQlyOAotOwl2bWFjLnNzcwlyNyxyOSwwLGEzCi07CXZtYWMuc3NzCXI3LHI5LDAscjEwCi07CXZtYWMuc3NzCXI3LHI5LGExLGEzCi07CXZtYWMuc3NzCXI3LHI5LGEzLHIxMAotOwl2bWFjLnNzZAlyNyxyOSwwLGEwCi07CXZtYWMuc3NkCXI3LHI5LDAscjEwCi07CXZtYWMuc3NkCXI3LHI5LGExLGEyCi07CXZtYWMuc3NkCXI3LHI5LGEzLHIxMAotOwl2bXB5LnNzCQlyMSxyMyxyMwotOwl2bXB5LnNkCQlyNSxyNixyNgotOwl2bXB5LmRkCQlyMixyNCxyNAotOwl2bXNjLnNzcwlyNyxyOSwwLGEwCi07CXZtc2Muc3NzCXI3LHI5LDAscjEwCi07CXZtc2Muc3NzCXI3LHI5LGEwLGExCi07CXZtc2Muc3NzCXI3LHI5LGEzLHIxMAotOwl2bXNjLnNzZAlyNyxyOSwwLGEwCi07CXZtc2Muc3NkCXI3LHI5LDAscjEwCi07CXZtc2Muc3NkCXI3LHI5LGEwLGExCi07CXZtc2Muc3NkCXI3LHI5LGEzLHIxMAotOwl2bXN1Yi5zcwlyNixhMixhNAotOwl2bXN1Yi5zZAlyNixhMixhNAotOwl2bXN1Yi5zcwlyNCxhNCxyNgotOwl2bXN1Yi5zZAlyNCxhNCxyNgotOwl2cm5kLnNpCQlyNCxyNgotOwl2cm5kLnNpCQlyNCxhMAotOwl2cm5kLnN1CQlyNCxyNgotOwl2cm5kLnN1CQlyNCxhMAotOwl2cm5kLnNzCQlyNCxyNgotOwl2cm5kLnNzCQlyNCxhMAotOwl2cm5kLnNkCQlyNCxyNgotOwl2cm5kLnNkCQlyNCxhMAotOwl2cm5kLmRpCQlyNCxyNgotOwl2cm5kLmRpCQlyNCxhMAotOwl2cm5kLmR1CQlyNCxyNgotOwl2cm5kLmR1CQlyNCxhMAotOwl2cm5kLmRzCQlyNCxyNgotOwl2cm5kLmRzCQlyNCxhMAotOwl2cm5kLmRkCQlyNCxyNgotOwl2cm5kLmRkCQlyNCxhMAotOwl2cm5kLmlzCQlyNCxyNgotOwl2cm5kLmlkCQlyNCxyNgotOwl2cm5kLnVzCQlyNCxyNgotOwl2cm5kLnVkCQlyNCxyNgotOwl2c3QucwkJcjYKLTsJdnN0LmQJCXI2Ci07CXZzdWIuc3MJCXIyLHI0LHI2Ci07CXZzdWIuc2QJCXIyLHI0LHI2Ci07CXZzdWIuZGQJCXIyLHI0LHI2Ci0Jd3JjcgkJcjYscjUKLQl4bm9yCQlyNSxyNixyNwotCXhvcgkJcjcscjgscjkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIuZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3ZjRhMS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0jb2JqZHVtcDogLWQKLSNuYW1lOiBUSWM4MCByZWdpc3RlciBvcGVyYW5kcyB3aXRoIDptIG1vZGlmaWVyCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLURpc2Fzc2VtYmx5IG9mIHNlY3Rpb24gLnRleHQ6Ci0KLTAwMDAwMDAwIDwudGV4dD46Ci0gICAwOgkwOCA4MCBiNyAwMi4qCi0gICA0OgkwNCAwMCA5ZSAwMi4qCi0gICA4OglmYyA3ZiA5ZSAwMi4qCi0gICBjOgkwMCA5MCBiNyAwMiA3OCA1NiAzNCAxMi4qCi0gIDE0OgkwMCA5MCBiNyAwMiBlZiBiZSBhZCBkZS4qCi0gIDFjOgkwOCA4MCBiNyAwYS4qCi0gIDIwOgkwNCAwMCA5ZSAwYS4qCi0gIDI0OglmYyA3ZiA5ZSAwYS4qCi0gIDI4OgkwMCA5MCBiNyAwYSA3OCA1NiAzNCAxMi4qCi0gIDMwOgkwMCA5MCBiNyAwYSBlZiBiZSBhZCBkZS4qCi0gIDM4OgkwNCA4NCBiNCA0MS4qCi0gIDNjOgkwNCBhNCBiNCA0MS4qCi0gIDQwOgkwNCBjNCBiNCA0MS4qCi0gIDQ0OgkwNCBlNCBiNCA0MS4qCi0gIDQ4OgkwMCA5NCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIDUwOgkwMCBiNCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIDU4OgkwMCBkNCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIDYwOgkwMCBmNCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIDY4OgkwNCA4NCBiNSA0MS4qCi0gIDZjOgkwNCBhNCBiNSA0MS4qCi0gIDcwOgkwMCA5NCBiNSA0MSAwMCAwMCAwMCBlMC4qCi0gIDc4OgkwMCBiNCBiNSA0MSAwMCAwMCAwMCBlMC4qCi0gIDgwOgkwNCA4NCBiNiA0MS4qCi0gIDg0OgkwNCBhNCBiNiA0MS4qCi0gIDg4OgkwNCBjNCBiNiA0MS4qCi0gIDhjOgkwNCBlNCBiNiA0MS4qCi0gIDkwOgkwMCA5NCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gIDk4OgkwMCBiNCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gIGEwOgkwMCBkNCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gIGE4OgkwMCBmNCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gIGIwOgkwNCA4MCBiNCA0MS4qCi0gIGI0OgkwNCBhMCBiNCA0MS4qCi0gIGI4OgkwNCBjMCBiNCA0MS4qCi0gIGJjOgkwNCBlMCBiNCA0MS4qCi0gIGMwOglmMCA3ZiA5MiA0MS4qCi0gIGM0OglmMCBmZiA5MiA0MS4qCi0gIGM4OglmMCA3ZiA5MyA0MS4qCi0gIGNjOglmMCBmZiA5MyA0MS4qCi0gIGQwOgkwMCA5MCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIGQ4OgkwMCBiMCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIGUwOgkwMCBkMCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIGU4OgkwMCBmMCBiNCA0MSAwMCAwMCAwMCBlMC4qCi0gIGYwOgkwNCA4MCBiNSA0MS4qCi0gIGY0OgkwNCBhMCBiNSA0MS4qCi0gIGY4OglmMCA3ZiA5NiA0MS4qCi0gIGZjOglmMCBmZiA5NiA0MS4qCi0gMTAwOgkwMCA5MCBiNSA0MSAwMCAwMCAwMCBlMC4qCi0gMTA4OgkwMCBiMCBiNSA0MSAwMCAwMCAwMCBlMC4qCi0gMTEwOgkwNCA4MCBiNiA0MS4qCi0gMTE0OgkwNCBhMCBiNiA0MS4qCi0gMTE4OgkwNCBjMCBiNiA0MS4qCi0gMTFjOgkwNCBlMCBiNiA0MS4qCi0gMTIwOgkwMCA3ZiA5YSA0MS4qCi0gMTI0OgkwMCBmZiA5YSA0MS4qCi0gMTI4OgkwMCA3ZiA5YiA0MS4qCi0gMTJjOgkwMCBmZiA5YiA0MS4qCi0gMTMwOgkwMCA5MCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gMTM4OgkwMCBiMCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gMTQwOgkwMCBkMCBiNiA0MSAwMCAwMCAwMCBlMC4qCi0gMTQ4OgkwMCBmMCBiNiA0MSAwMCAwMCAwMCBlMC4qCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLmxzdCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTFmYjk3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczIubHN0CisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAxCi0KLSAgICAgICAgMSAwMDAwMDAwMCAgIDAyQjc4MDA4ICAgICAgICAgZGNhY2hlYyByOChyMTA6bSkgICAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0gKG1vZGlmaWVkKQotICAgICAgICAyIDAwMDAwMDA0ICAgMDI5RTAwMDQgICAgICAgICBkY2FjaGVjIDQocjEwOm0pICAgICAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAzIDAwMDAwMDA4ICAgMDI5RTdGRkMgICAgICAgICBkY2FjaGVjIC00KHIxMDptKSAgICAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICA0IDAwMDAwMDBDICAgMDJCNzkwMDAgICAgICAgICBkY2FjaGVjIDB4MTIzNDU2NzgocjEwOm0pICAgICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0gICAgICAgICAgMDAwMDAwMTAgICAxMjM0NTY3OCAKLSAgICAgICAgNSAwMDAwMDAxNCAgIDAyQjc5MDAwICAgICAgICAgZGNhY2hlYyAweERFQURCRUVGKHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAgIDAwMDAwMDE4ICAgREVBREJFRUYgCi0gICAgICAgIDYgMDAwMDAwMUMgICAwQUI3ODAwOCAgICAgICAgIGRjYWNoZWYgcjgocjEwOm0pICAgICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtIChtb2RpZmllZCkKLSAgICAgICAgNyAwMDAwMDAyMCAgIDBBOUUwMDA0ICAgICAgICAgZGNhY2hlZiA0KHIxMDptKSAgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChwb3NpdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgOCAwMDAwMDAyNCAgIDBBOUU3RkZDICAgICAgICAgZGNhY2hlZiAtNChyMTA6bSkgICAgICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgOSAwMDAwMDAyOCAgIDBBQjc5MDAwICAgICAgICAgZGNhY2hlZiAweDEyMzQ1Njc4KHIxMDptKSAgICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotICAgICAgICAgIDAwMDAwMDJDICAgMTIzNDU2NzggCi0gICAgICAgMTAgMDAwMDAwMzAgICAwQUI3OTAwMCAgICAgICAgIGRjYWNoZWYgMHhERUFEQkVFRihyMTA6bSkgICAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLSAgICAgICAgICAwMDAwMDAzNCAgIERFQURCRUVGIAotICAgICAgIDExIDAwMDAwMDM4ICAgNDFCNDg0MDQgICAgICAgICBkbGQuYiAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEyIDAwMDAwMDNDICAgNDFCNEE0MDQgICAgICAgICBkbGQuaCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEzIDAwMDAwMDQwICAgNDFCNEM0MDQgICAgICAgICBkbGQgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE0IDAwMDAwMDQ0ICAgNDFCNEU0MDQgICAgICAgICBkbGQuZCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE1IDAwMDAwMDQ4ICAgNDFCNDk0MDAgICAgICAgICBkbGQuYiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDRDICAgRTAwMDAwMDAgCi0gICAgICAgMTYgMDAwMDAwNTAgICA0MUI0QjQwMCAgICAgICAgIGRsZC5oICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNTQgICBFMDAwMDAwMCAKLSAgICAgICAxNyAwMDAwMDA1OCAgIDQxQjRENDAwICAgICAgICAgZGxkICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA1QyAgIEUwMDAwMDAwIAotICAgICAgIDE4IDAwMDAwMDYwICAgNDFCNEY0MDAgICAgICAgICBkbGQuZCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDY0ICAgRTAwMDAwMDAgCi0gICAgICAgMTkgMDAwMDAwNjggICA0MUI1ODQwNCAgICAgICAgIGRsZC51YiAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMjAgMDAwMDAwNkMgICA0MUI1QTQwNCAgICAgICAgIGRsZC51aCAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMjEgMDAwMDAwNzAgICA0MUI1OTQwMCAgICAgICAgIGRsZC51YiAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwNzQgICBFMDAwMDAwMCAKLSAgICAgICAyMiAwMDAwMDA3OCAgIDQxQjVCNDAwICAgICAgICAgZGxkLnVoICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDA3QyAgIEUwMDAwMDAwIAotICAgICAgIDIzIDAwMDAwMDgwICAgNDFCNjg0MDQgICAgICAgICBkc3QuYiAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDI0IDAwMDAwMDg0ICAgNDFCNkE0MDQgICAgICAgICBkc3QuaCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDI1IDAwMDAwMDg4ICAgNDFCNkM0MDQgICAgICAgICBkc3QgICAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDI2IDAwMDAwMDhDICAgNDFCNkU0MDQgICAgICAgICBkc3QuZCAgIHI0KHI2Om0pLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDI3IDAwMDAwMDkwICAgNDFCNjk0MDAgICAgICAgICBkc3QuYiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMDk0ICAgRTAwMDAwMDAgCi0gICAgICAgMjggMDAwMDAwOTggICA0MUI2QjQwMCAgICAgICAgIGRzdC5oICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwOUMgICBFMDAwMDAwMCAKLSAgICAgICAyOSAwMDAwMDBBMCAgIDQxQjZENDAwICAgICAgICAgZHN0ICAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDBBNCAgIEUwMDAwMDAwIAotICAgICAgIDMwIDAwMDAwMEE4ICAgNDFCNkY0MDAgICAgICAgICBkc3QuZCAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEFDICAgRTAwMDAwMDAgCi0gICAgICAgMzEgMDAwMDAwQjAgICA0MUI0ODAwNCAgICAgICAgIGxkLmIgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMzIgMDAwMDAwQjQgICA0MUI0QTAwNCAgICAgICAgIGxkLmggICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMzMgMDAwMDAwQjggICA0MUI0QzAwNCAgICAgICAgIGxkICAgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMzQgMDAwMDAwQkMgICA0MUI0RTAwNCAgICAgICAgIGxkLmQgICAgcjQocjY6bSkscjggICAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMzUgMDAwMDAwQzAgICA0MTkyN0ZGMCAgICAgICAgIGxkLmIgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDM2IDAwMDAwMEM0ICAgNDE5MkZGRjAgICAgICAgICBsZC5oICAgIC0xNihyNjptKSxyOCAgICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAzNyAwMDAwMDBDOCAgIDQxOTM3RkYwICAgICAgICAgbGQgICAgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgMzggMDAwMDAwQ0MgICA0MTkzRkZGMCAgICAgICAgIGxkLmQgICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDM5IDAwMDAwMEQwICAgNDFCNDkwMDAgICAgICAgICBsZC5iICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEQ0ICAgRTAwMDAwMDAgCi0gICAgICAgNDAgMDAwMDAwRDggICA0MUI0QjAwMCAgICAgICAgIGxkLmggICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0MTVZQIE1QIE1hY3JvIEFzc2VtYmxlciAgICAgVmVyc2lvbiAxLjEzICAgICBXZWQgRmViIDI2IDE0OjMyOjE0IDE5OTcKLUNvcHlyaWdodCAoYykgMTk5My0xOTk1ICAgIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAKLQotcmVnb3BzMi5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRSAgICAyCi0KLSAgICAgICAgICAwMDAwMDBEQyAgIEUwMDAwMDAwIAotICAgICAgIDQxIDAwMDAwMEUwICAgNDFCNEQwMDAgICAgICAgICBsZCAgICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMEU0ICAgRTAwMDAwMDAgCi0gICAgICAgNDIgMDAwMDAwRTggICA0MUI0RjAwMCAgICAgICAgIGxkLmQgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAwRUMgICBFMDAwMDAwMCAKLSAgICAgICA0MyAwMDAwMDBGMCAgIDQxQjU4MDA0ICAgICAgICAgbGQudWIgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA0NCAwMDAwMDBGNCAgIDQxQjVBMDA0ICAgICAgICAgbGQudWggICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA0NSAwMDAwMDBGOCAgIDQxOTY3RkYwICAgICAgICAgbGQudWIgICAtMTYocjY6bSkscjggICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNDYgMDAwMDAwRkMgICA0MTk2RkZGMCAgICAgICAgIGxkLnVoICAgLTE2KHI2Om0pLHI4ICAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDQ3IDAwMDAwMTAwICAgNDFCNTkwMDAgICAgICAgICBsZC51YiAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTA0ICAgRTAwMDAwMDAgCi0gICAgICAgNDggMDAwMDAxMDggICA0MUI1QjAwMCAgICAgICAgIGxkLnVoICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxMEMgICBFMDAwMDAwMCAKLSAgICAgICA0OSAwMDAwMDExMCAgIDQxQjY4MDA0ICAgICAgICAgc3QuYiAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA1MCAwMDAwMDExNCAgIDQxQjZBMDA0ICAgICAgICAgc3QuaCAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA1MSAwMDAwMDExOCAgIDQxQjZDMDA0ICAgICAgICAgc3QgICAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA1MiAwMDAwMDExQyAgIDQxQjZFMDA0ICAgICAgICAgc3QuZCAgICByNChyNjptKSxyOCAgICAgICAgICAgICA7IFJlZ2lzdGVyIGZvcm0KLSAgICAgICA1MyAwMDAwMDEyMCAgIDQxOUE3RjAwICAgICAgICAgc3QuYiAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNTQgMDAwMDAxMjQgICA0MTlBRkYwMCAgICAgICAgIHN0LmggICAgLTI1NihyNjptKSxyOCAgICAgICAgICAgOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotICAgICAgIDU1IDAwMDAwMTI4ICAgNDE5QjdGMDAgICAgICAgICBzdCAgICAgIC0yNTYocjY6bSkscjggICAgICAgICAgIDsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLSAgICAgICA1NiAwMDAwMDEyQyAgIDQxOUJGRjAwICAgICAgICAgc3QuZCAgICAtMjU2KHI2Om0pLHI4ICAgICAgICAgICA7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0gICAgICAgNTcgMDAwMDAxMzAgICA0MUI2OTAwMCAgICAgICAgIHN0LmIgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxMzQgICBFMDAwMDAwMCAKLSAgICAgICA1OCAwMDAwMDEzOCAgIDQxQjZCMDAwICAgICAgICAgc3QuaCAgICAweEUwMDAwMDAwKHI2Om0pLHI4ICAgICA7IExvbmcgSW1tZWRpYXRlIGZvcm0KLSAgICAgICAgICAwMDAwMDEzQyAgIEUwMDAwMDAwIAotICAgICAgIDU5IDAwMDAwMTQwICAgNDFCNkQwMDAgICAgICAgICBzdCAgICAgIDB4RTAwMDAwMDAocjY6bSkscjggICAgIDsgTG9uZyBJbW1lZGlhdGUgZm9ybQotICAgICAgICAgIDAwMDAwMTQ0ICAgRTAwMDAwMDAgCi0gICAgICAgNjAgMDAwMDAxNDggICA0MUI2RjAwMCAgICAgICAgIHN0LmQgICAgMHhFMDAwMDAwMChyNjptKSxyOCAgICAgOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0gICAgICAgICAgMDAwMDAxNEMgICBFMDAwMDAwMCAKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzU1YjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotCWRjYWNoZWMJcjgocjEwOm0pCQk7IFJlZ2lzdGVyIGZvcm0gKG1vZGlmaWVkKQotCWRjYWNoZWMJNChyMTA6bSkJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWMJLTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVjCTB4MTIzNDU2NzgocjEwOm0pCTsgTG9uZyBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlYwkweERFQURCRUVGKHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWYJcjgocjEwOm0pCQk7IFJlZ2lzdGVyIGZvcm0gKG1vZGlmaWVkKQotCWRjYWNoZWYJNChyMTA6bSkJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0gKHBvc2l0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRjYWNoZWYJLTQocjEwOm0pCQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtIChuZWdhdGl2ZSBvZmZzZXQpIChtb2RpZmllZCkKLQlkY2FjaGVmCTB4MTIzNDU2NzgocjEwOm0pCTsgTG9uZyBJbW1lZGlhdGUgZm9ybSAocG9zaXRpdmUgb2Zmc2V0KSAobW9kaWZpZWQpCi0JZGNhY2hlZgkweERFQURCRUVGKHIxMDptKQk7IExvbmcgSW1tZWRpYXRlIGZvcm0gKG5lZ2F0aXZlIG9mZnNldCkgKG1vZGlmaWVkKQotCWRsZC5iCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuaAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkbGQuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZC5kCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JZGxkLnViCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWgJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51YgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRsZC51aAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRzdC5iCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuaAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0CXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuZAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlkc3QuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRzdAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWRzdC5kCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuaAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmIJLTE2KHI2Om0pLHI4CQk7IFNob3J0IEltbWVkaWF0ZSBmb3JtCi0JbGQuaAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC5kCS0xNihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCWxkLmIJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlsZC5oCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQJMHhFMDAwMDAwMChyNjptKSxyOAk7IExvbmcgSW1tZWRpYXRlIGZvcm0KLQlsZC5kCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0JbGQudWIJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnVoCXI0KHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC51YgktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC51aAktMTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlsZC51YgkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCWxkLnVoCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0Jc3QuYglyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuaAlyNChyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmQJcjQocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmIJLTI1NihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCXN0LmgJLTI1NihyNjptKSxyOAkJOyBTaG9ydCBJbW1lZGlhdGUgZm9ybQotCXN0CS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdC5kCS0yNTYocjY6bSkscjgJCTsgU2hvcnQgSW1tZWRpYXRlIGZvcm0KLQlzdC5iCTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0Jc3QuaAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQotCXN0CTB4RTAwMDAwMDAocjY6bSkscjgJOyBMb25nIEltbWVkaWF0ZSBmb3JtCi0Jc3QuZAkweEUwMDAwMDAwKHI2Om0pLHI4CTsgTG9uZyBJbW1lZGlhdGUgZm9ybQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmEzMDEyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMuZAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHJlZ2lzdGVyIG9wZXJhbmRzIHdpdGggOnMgbW9kaWZpZXIKLQotLio6ICtmaWxlIGZvcm1hdCAuKnRpYzgwLioKLQotRGlzYXNzZW1ibHkgb2Ygc2VjdGlvbiAudGV4dDoKLQotMDAwMDAwMDAgPC50ZXh0PjoKLSAgIDA6CTA0IDBjIGI0IDQxLioKLSAgIDQ6CTA0IDJjIGI0IDQxLioKLSAgIDg6CTA0IDRjIGI0IDQxLioKLSAgIGM6CTA0IDZjIGI0IDQxLioKLSAgMTA6CTA0IDBjIGI1IDQxLioKLSAgMTQ6CTA0IDJjIGI1IDQxLioKLSAgMTg6CTA0IDBjIGI2IDQxLioKLSAgMWM6CTA0IDJjIGI2IDQxLioKLSAgMjA6CTA0IDRjIGI2IDQxLioKLSAgMjQ6CTA0IDZjIGI2IDQxLioKLSAgMjg6CTA0IDA4IGI0IDQxLioKLSAgMmM6CTA0IDI4IGI0IDQxLioKLSAgMzA6CTA0IDQ4IGI0IDQxLioKLSAgMzQ6CTA0IDY4IGI0IDQxLioKLSAgMzg6CTA0IDA4IGI1IDQxLioKLSAgM2M6CTA0IDI4IGI1IDQxLioKLSAgNDA6CTA0IDA4IGI2IDQxLioKLSAgNDQ6CTA0IDI4IGI2IDQxLioKLSAgNDg6CTA0IDQ4IGI2IDQxLioKLSAgNGM6CTA0IDY4IGI2IDQxLioKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMubHN0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTgwM2YuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzMy5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFdlZCBGZWIgMjYgMTQ6MzI6MTkgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWdvcHMzLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxIDAwMDAwMDAwICAgNDFCNDBDMDQgICAgICAgICBkbGQuYiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAyIDAwMDAwMDA0ICAgNDFCNDJDMDQgICAgICAgICBkbGQuaCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICAzIDAwMDAwMDA4ICAgNDFCNDRDMDQgICAgICAgICBkbGQgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA0IDAwMDAwMDBDICAgNDFCNDZDMDQgICAgICAgICBkbGQuZCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA1IDAwMDAwMDEwICAgNDFCNTBDMDQgICAgICAgICBkbGQudWIgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA2IDAwMDAwMDE0ICAgNDFCNTJDMDQgICAgICAgICBkbGQudWggIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA3IDAwMDAwMDE4ICAgNDFCNjBDMDQgICAgICAgICBkc3QuYiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA4IDAwMDAwMDFDICAgNDFCNjJDMDQgICAgICAgICBkc3QuaCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgICA5IDAwMDAwMDIwICAgNDFCNjRDMDQgICAgICAgICBkc3QgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEwIDAwMDAwMDI0ICAgNDFCNjZDMDQgICAgICAgICBkc3QuZCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDExIDAwMDAwMDI4ICAgNDFCNDA4MDQgICAgICAgICBsZC5iICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEyIDAwMDAwMDJDICAgNDFCNDI4MDQgICAgICAgICBsZC5oICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDEzIDAwMDAwMDMwICAgNDFCNDQ4MDQgICAgICAgICBsZCAgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE0IDAwMDAwMDM0ICAgNDFCNDY4MDQgICAgICAgICBsZC5kICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE1IDAwMDAwMDM4ICAgNDFCNTA4MDQgICAgICAgICBsZC51YiAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE2IDAwMDAwMDNDICAgNDFCNTI4MDQgICAgICAgICBsZC51aCAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE3IDAwMDAwMDQwICAgNDFCNjA4MDQgICAgICAgICBzdC5iICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE4IDAwMDAwMDQ0ICAgNDFCNjI4MDQgICAgICAgICBzdC5oICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDE5IDAwMDAwMDQ4ICAgNDFCNjQ4MDQgICAgICAgICBzdCAgICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotICAgICAgIDIwIDAwMDAwMDRDICAgNDFCNjY4MDQgICAgICAgICBzdC5kICAgIHI0OnMocjYpLHI4ICAgICAgICAgICAgIDsgUmVnaXN0ZXIgZm9ybQotCi0gTm8gRXJyb3JzLCAgTm8gV2FybmluZ3MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkODdkNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHMzLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JZGxkLmIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5oCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC5kCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQudWIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51aAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5oCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRzdC5kCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5oCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWIJcjQ6cyhyNikscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLnVoCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5iCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5oCXI0OnMocjYpLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuZAlyNDpzKHI2KSxyOAkJOyBSZWdpc3RlciBmb3JtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjA3YzkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5kCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgcmVnaXN0ZXIgb3BlcmFuZHMgd2l0aCBib3RoIDptIGFuZCA6cyBtb2RpZmllcgotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8LnRleHQ+OgotICAgMDoJMDQgOGMgYjQgNDEuKgotICAgNDoJMDQgYWMgYjQgNDEuKgotICAgODoJMDQgY2MgYjQgNDEuKgotICAgYzoJMDQgZWMgYjQgNDEuKgotICAxMDoJMDQgOGMgYjUgNDEuKgotICAxNDoJMDQgYWMgYjUgNDEuKgotICAxODoJMDQgOGMgYjYgNDEuKgotICAxYzoJMDQgYWMgYjYgNDEuKgotICAyMDoJMDQgY2MgYjYgNDEuKgotICAyNDoJMDQgZWMgYjYgNDEuKgotICAyODoJMDQgODggYjQgNDEuKgotICAyYzoJMDQgYTggYjQgNDEuKgotICAzMDoJMDQgYzggYjQgNDEuKgotICAzNDoJMDQgZTggYjQgNDEuKgotICAzODoJMDQgODggYjUgNDEuKgotICAzYzoJMDQgYTggYjUgNDEuKgotICA0MDoJMDQgODggYjYgNDEuKgotICA0NDoJMDQgYTggYjYgNDEuKgotICA0ODoJMDQgYzggYjYgNDEuKgotICA0YzoJMDQgZTggYjYgNDEuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmM2M5YS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWdvcHM0LmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgV2VkIEZlYiAyNiAxNDozMjoyNSAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlZ29wczQucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgMDAwMDAwMDAgICA0MUI0OEMwNCAgICAgICAgIGRsZC5iICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDIgMDAwMDAwMDQgICA0MUI0QUMwNCAgICAgICAgIGRsZC5oICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDMgMDAwMDAwMDggICA0MUI0Q0MwNCAgICAgICAgIGRsZCAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDQgMDAwMDAwMEMgICA0MUI0RUMwNCAgICAgICAgIGRsZC5kICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDUgMDAwMDAwMTAgICA0MUI1OEMwNCAgICAgICAgIGRsZC51YiAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDYgMDAwMDAwMTQgICA0MUI1QUMwNCAgICAgICAgIGRsZC51aCAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDcgMDAwMDAwMTggICA0MUI2OEMwNCAgICAgICAgIGRzdC5iICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDggMDAwMDAwMUMgICA0MUI2QUMwNCAgICAgICAgIGRzdC5oICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgIDkgMDAwMDAwMjAgICA0MUI2Q0MwNCAgICAgICAgIGRzdCAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTAgMDAwMDAwMjQgICA0MUI2RUMwNCAgICAgICAgIGRzdC5kICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTEgMDAwMDAwMjggICA0MUI0ODgwNCAgICAgICAgIGxkLmIgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTIgMDAwMDAwMkMgICA0MUI0QTgwNCAgICAgICAgIGxkLmggICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTMgMDAwMDAwMzAgICA0MUI0QzgwNCAgICAgICAgIGxkICAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTQgMDAwMDAwMzQgICA0MUI0RTgwNCAgICAgICAgIGxkLmQgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTUgMDAwMDAwMzggICA0MUI1ODgwNCAgICAgICAgIGxkLnViICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTYgMDAwMDAwM0MgICA0MUI1QTgwNCAgICAgICAgIGxkLnVoICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTcgMDAwMDAwNDAgICA0MUI2ODgwNCAgICAgICAgIHN0LmIgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTggMDAwMDAwNDQgICA0MUI2QTgwNCAgICAgICAgIHN0LmggICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMTkgMDAwMDAwNDggICA0MUI2QzgwNCAgICAgICAgIHN0ICAgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0gICAgICAgMjAgMDAwMDAwNEMgICA0MUI2RTgwNCAgICAgICAgIHN0LmQgICAgcjQ6cyhyNjptKSxyOCAgICAgICAgICAgOyBSZWdpc3RlciBmb3JtCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVnb3BzNC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE3N2U5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlZ29wczQucworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLQlkbGQuYglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkbGQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLmQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZGxkLnViCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWRsZC51aAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuYglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QuaAlyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlkc3QJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JZHN0LmQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQuYglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlsZC5oCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCWxkLmQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWIJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0JbGQudWgJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCi0Jc3QuYglyNDpzKHI2Om0pLHI4CQk7IFJlZ2lzdGVyIGZvcm0KLQlzdC5oCXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0CXI0OnMocjY6bSkscjgJCTsgUmVnaXN0ZXIgZm9ybQotCXN0LmQJcjQ6cyhyNjptKSxyOAkJOyBSZWdpc3RlciBmb3JtCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZjA0YjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotZXh0ZXJuIGludCB4ZnVuYyAoaW50IHkpOwotCi1zdGF0aWMgaW50IHNmdW5jIChpbnQgeSkKLXsKLSAgeGZ1bmMgKHkpOwotfQotCi1pbnQgZ2Z1bmMgKGludCB5KQotewotICBzZnVuYyAoeSk7Ci19Ci0KLWludCBicmFuY2hlcyAoaW50IHkpCi17Ci0gIGludCB6OwotCi0gIGZvciAoeiA9IHk7IHogPCB5ICsgMTA7IHorKykKLSAgICB7Ci0gICAgICBpZiAoeiAmIDB4MSkKLQl7Ci0JICBnZnVuYyAoeik7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHhmdW5jICh6KTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGNhNmM5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEuZAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSNvYmpkdW1wOiAtZAotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIGdsb2JhbC9sb2NhbCBmdW5jcyAmIGJyYW5jaGVzIChjb2RlKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8X3NmdW5jPjoKLSAgIDA6CWYwIGZmIDZjIDA4LioKLSAgIDQ6CTBjIDAwIDU5IGY4LioKLSAgIDg6CTAwIDAwIDU5IDEwLioKLSAgIGM6CTAwIDkwIDM4IGY4IDAwIDAwIDAwIDAwLioKLSAgMTQ6CTAwIDAwIDUxIDEwLioKLSAgMTg6CTBjIDAwIDUxIGY4LioKLSAgMWM6CTFmIDgwIDM4IDAwLioKLSAgMjA6CTEwIDgwIDZjIDA4LioKLQotMDAwMDAwMjQgPF9nZnVuYz46Ci0gIDI0OglmMCBmZiA2YyAwOC4qCi0gIDI4OgkwYyAwMCA1OSBmOC4qCi0gIDJjOgkwMCAwMCA1OSAxMC4qCi0gIDMwOgkwMCA5MCAzOCBmOCAwMCAwMCAwMCAwMC4qCi0gIDM4OgkwMCAwMCA1MSAxMC4qCi0gIDNjOgkwYyAwMCA1MSBmOC4qCi0gIDQwOgkxZiA4MCAzOCAwMC4qCi0gIDQ0OgkxMCA4MCA2YyAwOC4qCi0KLTAwMDAwMDQ4IDxfYnJhbmNoZXM+OgotICA0ODoJZjAgZmYgNmMgMDguKgotICA0YzoJMGMgMDAgNTkgZjguKgotICA1MDoJMDAgMDAgNTkgMTAuKgotICA1NDoJMDAgMDAgNTEgMTAuKgotICA1ODoJMDQgMDAgNTkgMTAuKgotICA1YzoJMDAgMDAgNTEgMTAuKgotICA2MDoJMDQgMDAgNTEgMTguKgotICA2NDoJMGEgODAgYWMgMTAuKgotICA2ODoJMDMgMDAgYmEgMTAuKgotICA2YzoJMTIgODAgYTUgMzAuKgotICA3MDoJMDQgMDAgNTEgMTAuKgotICA3NDoJMDUgODAgYTQgZjguKgotICA3ODoJMDAgOTAgMzggZjggMjQgMDAgMDAgMDAuKgotICA4MDoJMDQgMDAgNTEgMTAuKgotICA4NDoJMDQgODAgMjQgMDAuKgotICA4ODoJMDAgOTAgMzggZjggMDAgMDAgMDAgMDAuKgotICA5MDoJMDQgMDAgNTEgMTAuKgotICA5NDoJMDQgMDAgNTEgMTAuKgotICA5ODoJMDEgODAgYWMgMTAuKgotICA5YzoJMDQgMDAgNTkgMTAuKgotICBhMDoJMDAgMDAgNTEgMTguKgotICBhNDoJMDQgMDAgNTEgMTAuKgotICBhODoJMGEgODAgZWMgMTguKgotICBhYzoJMDIgMDAgZmEgMTAuKgotICBiMDoJZjAgZmYgYTUgMzguKgotICBiNDoJMGMgMDAgNTEgZjguKgotICBiODoJMWYgODAgMzggMDAuKgotICBiYzoJMTAgODAgNmMgMDguKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhZWIxYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLU1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU2F0IEZlYiAyMiAxMzoxOToyOCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlbG9jczEucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMQotCi0gICAgICAgIDEgICAgICAgICAgICAgICAgICAgICA7OyBUaGlzIGlzIHRoZSBoYW5kIGhhY2tlZCBvdXRwdXQgb2YgdGhlIFRJIEMgY29tcGlsZXIgZm9yIGEgc2ltcGxlCi0gICAgICAgIDIgICAgICAgICAgICAgICAgICAgICA7OyB0ZXN0IHByb2dyYW0gdGhhdCBjb250YWlucyBsb2NhbC9nbG9iYWwgZnVuY3Rpb25zLCBsb2NhbC9nbG9iYWwKLSAgICAgICAgMyAgICAgICAgICAgICAgICAgICAgIDs7IGZ1bmN0aW9uIGNhbGxzLCBhbmQgYW4gImlmIiBhbmQgImZvciIgc3RhdGVtZW50LgotICAgICAgICA0ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX3hmdW5jCi0gICAgICAgIDYgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNyAwMDAwMDAwMCAgICAgICAgICAgIF9zZnVuYzoKLSAgICAgICAgOCAwMDAwMDAwMCAgIDA4NkNGRkYwICAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAgOSAwMDAwMDAwNCAgIEY4NTkwMDBDICAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMTAgMDAwMDAwMDggICAxMDU5MDAwMCAgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAxMSAwMDAwMDAwQyAgIEY4Mzg5MDAwICAgICAgICAgIGpzciAgICAgICBfeGZ1bmMocjApLHIzMQotICAgICAgICAgIDAwMDAwMDEwICAgMDAwMDAwMDAgCi0gICAgICAgMTIgMDAwMDAwMTQgICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAxMyAwMDAwMDAxOCAgIEY4NTEwMDBDICAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMTQgMDAwMDAwMUMgICAwMDM4ODAxRiAgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgIDE1IDAwMDAwMDIwICAgMDg2QzgwMTAgICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0gICAgICAgMTYgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ2Z1bmMKLSAgICAgICAxOCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDE5IDAwMDAwMDI0ICAgICAgICAgICAgX2dmdW5jOgotICAgICAgIDIwIDAwMDAwMDI0ICAgMDg2Q0ZGRjAgICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgIDIxIDAwMDAwMDI4ICAgRjg1OTAwMEMgICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAyMiAwMDAwMDAyQyAgIDEwNTkwMDAwICAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgIDIzIDAwMDAwMDMwICAgRjgzODkwMDAgICAgICAgICAganNyICAgICAgIF9zZnVuYyhyMCkscjMxCi0gICAgICAgICAgMDAwMDAwMzQgICAwMDAwMDAwMCAKLSAgICAgICAyNCAwMDAwMDAzOCAgIDEwNTEwMDAwICAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgIDI1IDAwMDAwMDNDICAgRjg1MTAwMEMgICAgICAgICAgbGQgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAyNiAwMDAwMDA0MCAgIDAwMzg4MDFGICAgICAgICAgIGpzciAgICAgICByMzEocjApLHIwCi0gICAgICAgMjcgMDAwMDAwNDQgICAwODZDODAxMCAgICAgICAgICBhZGR1ICAgICAgMTYscjEscjEKLSAgICAgICAyOCAgICAgICAgICAgICAgICAgICAgIAotICAgICAgIDI5ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2JyYW5jaGVzCi0gICAgICAgMzEgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAzMiAwMDAwMDA0OCAgICAgICAgICAgIF9icmFuY2hlczoKLSAgICAgICAzMyAwMDAwMDA0OCAgIDA4NkNGRkYwICAgICAgICAgIGFkZHUgICAgICAtMTYscjEscjEKLSAgICAgICAzNCAwMDAwMDA0QyAgIEY4NTkwMDBDICAgICAgICAgIHN0ICAgICAgICAxMihyMSkscjMxCi0gICAgICAgMzUgMDAwMDAwNTAgICAxMDU5MDAwMCAgICAgICAgICBzdCAgICAgICAgMChyMSkscjIKLSAgICAgICAzNiAwMDAwMDA1NCAgIDEwNTEwMDAwICAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgIDM3IDAwMDAwMDU4ICAgMTA1OTAwMDQgICAgICAgICAgc3QgICAgICAgIDQocjEpLHIyCi0gICAgICAgMzggMDAwMDAwNUMgICAxMDUxMDAwMCAgICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAzOSAwMDAwMDA2MCAgIDE4NTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMwotICAgICAgIDQwIDAwMDAwMDY0ICAgMTBBQzgwMEEgICAgICAgICAgYWRkdSAgICAgIDEwLHIyLHIyCi0gICAgICAgNDEgMDAwMDAwNjggICAxMEJBMDAwMyAgICAgICAgICBjbXAgICAgICAgcjMscjIscjIKLSAgICAgICA0MiAwMDAwMDA2QyAgIDMwQTU4MDEyICAgICAgICAgIGJiby5hICAgICBMMTIscjIsZ2UudwotICAgICAgIDQzIDAwMDAwMDcwICAgICAgICAgICAgTDg6Ci0gICAgICAgNDQgMDAwMDAwNzAgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICA0NSAwMDAwMDA3NCAgIEY4QTQ4MDA1ICAgICAgICAgIGJiei5hICAgICBMMTAscjIsMAotICAgICAgIDQ2IDAwMDAwMDc4ICAgRjgzODkwMDAgICAgICAgICAganNyICAgICAgIF9nZnVuYyhyMCkscjMxCi0gICAgICAgICAgMDAwMDAwN0MgICAwMDAwMDAyNCAKLSAgICAgICA0NyAwMDAwMDA4MCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgIDQ4IDAwMDAwMDg0ICAgMDAyNDgwMDQgICAgICAgICAgYnIuYSAgICAgIEwxMQotICAgICAgIDQ5IDAwMDAwMDg4ICAgICAgICAgICAgTDEwOgotICAgICAgIDUwIDAwMDAwMDg4ICAgRjgzODkwMDAgICAgICAgICAganNyICAgICAgIF94ZnVuYyhyMCkscjMxCi0gICAgICAgICAgMDAwMDAwOEMgICAwMDAwMDAwMCAKLSAgICAgICA1MSAwMDAwMDA5MCAgIDEwNTEwMDA0ICAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU2F0IEZlYiAyMiAxMzoxOToyOCAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlbG9jczEucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgNTIgMDAwMDAwOTQgICAgICAgICAgICBMMTE6Ci0gICAgICAgNTMgMDAwMDAwOTQgICAxMDUxMDAwNCAgICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICA1NCAwMDAwMDA5OCAgIDEwQUM4MDAxICAgICAgICAgIGFkZHUgICAgICAxLHIyLHIyCi0gICAgICAgNTUgMDAwMDAwOUMgICAxMDU5MDAwNCAgICAgICAgICBzdCAgICAgICAgNChyMSkscjIKLSAgICAgICA1NiAwMDAwMDBBMCAgIDE4NTEwMDAwICAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMwotICAgICAgIDU3IDAwMDAwMEE0ICAgMTA1MTAwMDQgICAgICAgICAgbGQgICAgICAgIDQocjEpLHIyCi0gICAgICAgNTggMDAwMDAwQTggICAxOEVDODAwQSAgICAgICAgICBhZGR1ICAgICAgMTAscjMscjMKLSAgICAgICA1OSAwMDAwMDBBQyAgIDEwRkEwMDAyICAgICAgICAgIGNtcCAgICAgICByMixyMyxyMgotICAgICAgIDYwIDAwMDAwMEIwICAgMzhBNUZGRjAgICAgICAgICAgYmJvLmEgICAgIEw4LHIyLGx0LncKLSAgICAgICA2MSAwMDAwMDBCNCAgICAgICAgICAgIEwxMjoKLSAgICAgICA2MiAwMDAwMDBCNCAgIEY4NTEwMDBDICAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgNjMgMDAwMDAwQjggICAwMDM4ODAxRiAgICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgIDY0IDAwMDAwMEJDICAgMDg2QzgwMTAgICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0KLSBObyBFcnJvcnMsICBObyBXYXJuaW5ncwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDllMzk1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczEucworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTs7IFRoaXMgaXMgdGhlIGhhbmQgaGFja2VkIG91dHB1dCBvZiB0aGUgVEkgQyBjb21waWxlciBmb3IgYSBzaW1wbGUKLTs7IHRlc3QgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGxvY2FsL2dsb2JhbCBmdW5jdGlvbnMsIGxvY2FsL2dsb2JhbAotOzsgZnVuY3Rpb24gY2FsbHMsIGFuZCBhbiAiaWYiIGFuZCAiZm9yIiBzdGF0ZW1lbnQuCi0KLQkuZmlsZQkgICAicmVsb2NzMS5zIgotCi0JLmdsb2JhbAlfeGZ1bmMKLQotX3NmdW5jOgotICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgICAganNyICAgICAgIF94ZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgMChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAxMihyMSkscjMxCi0gICAgICAgICBqc3IgICAgICAgcjMxKHIwKSxyMAotICAgICAgICAgYWRkdSAgICAgIDE2LHIxLHIxCi0KLQkuZ2xvYmFsCV9nZnVuYwotCi1fZ2Z1bmM6Ci0gICAgICAgICBhZGR1ICAgICAgLTE2LHIxLHIxCi0gICAgICAgICBzdCAgICAgICAgMTIocjEpLHIzMQotICAgICAgICAgc3QgICAgICAgIDAocjEpLHIyCi0gICAgICAgICBqc3IgICAgICAgX3NmdW5jKHIwKSxyMzEKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgICAgbGQgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIGpzciAgICAgICByMzEocjApLHIwCi0gICAgICAgICBhZGR1ICAgICAgMTYscjEscjEKLQotCi0JLmdsb2JhbAlfYnJhbmNoZXMKLQotX2JyYW5jaGVzOgotICAgICAgICAgYWRkdSAgICAgIC0xNixyMSxyMQotICAgICAgICAgc3QgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIHN0ICAgICAgICAwKHIxKSxyMgotICAgICAgICAgbGQgICAgICAgIDAocjEpLHIyCi0gICAgICAgICBzdCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGxkICAgICAgICAwKHIxKSxyMgotICAgICAgICAgbGQgICAgICAgIDQocjEpLHIzCi0gICAgICAgICBhZGR1ICAgICAgMTAscjIscjIKLSAgICAgICAgIGNtcCAgICAgICByMyxyMixyMgotICAgICAgICAgYmJvLmEgICAgIEwxMixyMixnZS53Ci1MODoKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgICAgYmJ6LmEgICAgIEwxMCxyMiwwCi0gICAgICAgICBqc3IgICAgICAgX2dmdW5jKHIwKSxyMzEKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgICAgYnIuYSAgICAgIEwxMQotTDEwOgotICAgICAgICAganNyICAgICAgIF94ZnVuYyhyMCkscjMxCi0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLUwxMToKLSAgICAgICAgIGxkICAgICAgICA0KHIxKSxyMgotICAgICAgICAgYWRkdSAgICAgIDEscjIscjIKLSAgICAgICAgIHN0ICAgICAgICA0KHIxKSxyMgotICAgICAgICAgbGQgICAgICAgIDAocjEpLHIzCi0gICAgICAgICBsZCAgICAgICAgNChyMSkscjIKLSAgICAgICAgIGFkZHUgICAgICAxMCxyMyxyMwotICAgICAgICAgY21wICAgICAgIHIyLHIzLHIyCi0gICAgICAgICBiYm8uYSAgICAgTDgscjIsbHQudwotTDEyOgotICAgICAgICAgbGQgICAgICAgIDEyKHIxKSxyMzEKLSAgICAgICAgIGpzciAgICAgICByMzEocjApLHIwCi0gICAgICAgICBhZGR1ICAgICAgMTYscjEscjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczFiLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MxYi5kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWIzMTYxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczFiLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNzb3VyY2U6IHJlbG9jczEucwotI25hbWU6IFRJYzgwIHNpbXBsZSByZWxvY3MsIGdsb2JhbC9sb2NhbCBmdW5jcyAmIGJyYW5jaGVzIChyZWxvY3MpCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCi0wMDAwMDAxMCAzMiAgICAgICAgICAgICAgICBfeGZ1bmMKLTAwMDAwMDM0IDMyICAgICAgICAgICAgICAgIC50ZXh0Ci0wMDAwMDA3YyAzMiAgICAgICAgICAgICAgICAudGV4dAotMDAwMDAwOGMgMzIgICAgICAgICAgICAgICAgX3hmdW5jCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMTEyMGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotZXh0ZXJuIGNoYXIgeF9jaGFyOwotZXh0ZXJuIHNob3J0IHhfc2hvcnQ7Ci1zdGF0aWMgaW50IHhfaW50OwotZXh0ZXJuIGxvbmcgeF9sb25nOwotZXh0ZXJuIGZsb2F0IHhfZmxvYXQ7Ci1leHRlcm4gZG91YmxlIHhfZG91YmxlOwotZXh0ZXJuIGNoYXIgKnhfY2hhcl9wOwotCi1zdGF0aWMgY2hhciBzX2NoYXI7Ci1zdGF0aWMgc2hvcnQgc19zaG9ydDsKLXN0YXRpYyBpbnQgc19pbnQ7Ci1zdGF0aWMgbG9uZyBzX2xvbmc7Ci1zdGF0aWMgZmxvYXQgc19mbG9hdDsKLXN0YXRpYyBkb3VibGUgc19kb3VibGU7Ci1zdGF0aWMgY2hhciAqc19jaGFyX3A7Ci0KLWNoYXIgZ19jaGFyOwotc2hvcnQgZ19zaG9ydDsKLWludCBnX2ludDsKLWxvbmcgZ19sb25nOwotZmxvYXQgZ19mbG9hdDsKLWRvdWJsZSBnX2RvdWJsZTsKLWNoYXIgKmdfY2hhcl9wOwotCi1tYWluICgpCi17Ci0gIHhfY2hhciA9IHNfY2hhcjsKLSAgZ19jaGFyID0geF9jaGFyOwotICB4X3Nob3J0ID0gc19zaG9ydDsKLSAgZ19zaG9ydCA9IHhfc2hvcnQ7Ci0gIHhfaW50ID0gc19pbnQ7Ci0gIGdfaW50ID0geF9pbnQ7Ci0gIHhfbG9uZyA9IHNfbG9uZzsKLSAgZ19sb25nID0geF9sb25nOwotICB4X2Zsb2F0ID0gc19mbG9hdDsKLSAgZ19mbG9hdCA9IHhfZmxvYXQ7Ci0gIHhfZG91YmxlID0gc19kb3VibGU7Ci0gIGdfZG91YmxlID0geF9kb3VibGU7Ci0gIHhfY2hhcl9wID0gc19jaGFyX3A7Ci0gIGdfY2hhcl9wID0geF9jaGFyX3A7Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmM2U4N2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5kCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotI29iamR1bXA6IC1kCi0jbmFtZTogVEljODAgc2ltcGxlIHJlbG9jcywgc3RhdGljIGFuZCBnbG9iYWwgdmFyaWFibGVzIChjb2RlKQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qdGljODAuKgotCi1EaXNhc3NlbWJseSBvZiBzZWN0aW9uIC50ZXh0OgotCi0wMDAwMDAwMCA8X21haW4+OgotICAgMDoJMDAgMTAgMzQgMTAgMjQgMDIgMDAgMDAuKgotICAgODoJMDAgMTAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICAxMDoJMDAgMTAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICAxODoJMDAgMTAgMzYgMTAgMDQgMDIgMDAgMDAuKgotICAyMDoJMDAgMzAgMzQgMTAgMjQgMDMgMDAgMDAuKgotICAyODoJMDAgMzAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICAzMDoJMDAgMzAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICAzODoJMDAgMzAgMzYgMTAgMDQgMDMgMDAgMDAuKgotICA0MDoJMDAgNTAgMzQgMTAgMzQgMDIgMDAgMDAuKgotICA0ODoJMDAgNTAgMzYgMTAgMzQgMDMgMDAgMDAuKgotICA1MDoJMDAgNTAgMzQgMTAgMzQgMDMgMDAgMDAuKgotICA1ODoJMDAgNTAgMzYgMTAgMTQgMDIgMDAgMDAuKgotICA2MDoJMDAgNTAgMzQgMTAgZjQgMDEgMDAgMDAuKgotICA2ODoJMDAgNTAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICA3MDoJMDAgNTAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICA3ODoJMDAgNTAgMzYgMTAgZjQgMDAgMDAgMDAuKgotICA4MDoJMDAgNTAgMzQgMTAgZjQgMDIgMDAgMDAuKgotICA4ODoJMDAgNTAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICA5MDoJMDAgNTAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICA5ODoJMDAgNTAgMzYgMTAgMTQgMDMgMDAgMDAuKgotICBhMDoJMDAgNzAgMzQgMTAgZTQgMDEgMDAgMDAuKgotICBhODoJMDAgNzAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICBiMDoJMDAgNzAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICBiODoJMDAgNzAgMzYgMTAgZTQgMDIgMDAgMDAuKgotICBjMDoJMDAgNTAgMzQgMTAgNDQgMDMgMDAgMDAuKgotICBjODoJMDAgNTAgMzYgMTAgMDAgMDAgMDAgMDAuKgotICBkMDoJMDAgNTAgMzQgMTAgMDAgMDAgMDAgMDAuKgotICBkODoJMDAgNTAgMzYgMTAgZTQgMDAgMDAgMDAuKgotICBlMDoJMWYgYTAgMzggMDAuKgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5sc3QgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmxzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5MGE4Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi1NVlAgTVAgTWFjcm8gQXNzZW1ibGVyICAgICBWZXJzaW9uIDEuMTMgICAgIFN1biBGZWIgMjMgMTI6MTY6MzIgMTk5NwotQ29weXJpZ2h0IChjKSAxOTkzLTE5OTUgICAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIAotCi1yZWxvY3MyLnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFICAgIDEKLQotICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgOzsgVGhpcyBpcyB0aGUgaGFuZCBoYWNrZWQgb3V0cHV0IG9mIHRoZSBUSSBDIGNvbXBpbGVyIGZvciBhIHNpbXBsZQotICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgOzsgdGVzdCBwcm9ncmFtIHRoYXQgY29udGFpbnMgc3RhdGljLCBnbG9iYWwsIGFuZCBleHRlcm4gZGF0YSB2YXJpYWJsZXMuCi0gICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbGUgICAicmVsb2NzMi5zIgotICAgICAgICA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2NoYXIKLSAgICAgICAgNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9zaG9ydAotICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2xvbmcKLSAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfeF9mbG9hdAotICAgICAgICA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2RvdWJsZQotICAgICAgIDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF94X2NoYXJfcAotICAgICAgIDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXIKLSAgICAgICAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19zaG9ydAotICAgICAgIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2ludAotICAgICAgIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2xvbmcKLSAgICAgICAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19mbG9hdAotICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2RvdWJsZQotICAgICAgIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2NoYXJfcAotICAgICAgIDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9tYWluCi0gICAgICAgMTkgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAyMCAwMDAwMDAwMCAgICAgICAgICAgIF9tYWluOgotICAgICAgIDIxIDAwMDAwMDAwICAgMTAzNDEwMDAgICAgICAgICAgbGQuYiAgICAgIF9zX2NoYXIrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAwNCAgIDAwMDAwMDFDIAotICAgICAgIDIyIDAwMDAwMDA4ICAgMTAzNjEwMDAgICAgICAgICAgc3QuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAwQyAgIDAwMDAwMDAwIAotICAgICAgIDIzIDAwMDAwMDEwICAgMTAzNDEwMDAgICAgICAgICAgbGQuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAxNCAgIDAwMDAwMDAwIAotICAgICAgIDI0IDAwMDAwMDE4ICAgMTAzNjEwMDAgICAgICAgICAgc3QuYiAgICAgIF9nX2NoYXIrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAxQyAgIDAwMDAwMDE0IAotICAgICAgIDI1IDAwMDAwMDIwICAgMTAzNDMwMDAgICAgICAgICAgbGQuaCAgICAgIF9zX3Nob3J0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwMjQgICAwMDAwMDAzQyAKLSAgICAgICAyNiAwMDAwMDAyOCAgIDEwMzYzMDAwICAgICAgICAgIHN0LmggICAgICBfeF9zaG9ydCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDJDICAgMDAwMDAwMDAgCi0gICAgICAgMjcgMDAwMDAwMzAgICAxMDM0MzAwMCAgICAgICAgICBsZC5oICAgICAgX3hfc2hvcnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDAzNCAgIDAwMDAwMDAwIAotICAgICAgIDI4IDAwMDAwMDM4ICAgMTAzNjMwMDAgICAgICAgICAgc3QuaCAgICAgIF9nX3Nob3J0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwM0MgICAwMDAwMDAzNCAKLSAgICAgICAyOSAwMDAwMDA0MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfc19pbnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA0NCAgIDAwMDAwMDIwIAotICAgICAgIDMwIDAwMDAwMDQ4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF94X2ludCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDRDICAgMDAwMDAwNDAgCi0gICAgICAgMzEgMDAwMDAwNTAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3hfaW50KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwNTQgICAwMDAwMDA0MCAKLSAgICAgICAzMiAwMDAwMDA1OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfZ19pbnQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA1QyAgIDAwMDAwMDE4IAotICAgICAgIDMzIDAwMDAwMDYwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2xvbmcrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA2NCAgIDAwMDAwMDEwIAotICAgICAgIDM0IDAwMDAwMDY4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA2QyAgIDAwMDAwMDAwIAotICAgICAgIDM1IDAwMDAwMDcwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA3NCAgIDAwMDAwMDAwIAotICAgICAgIDM2IDAwMDAwMDc4ICAgMTAzNjUwMDAgICAgICAgICAgc3QgICAgICAgIF9nX2xvbmcrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA3QyAgIDAwMDAwMDA0IAotICAgICAgIDM3IDAwMDAwMDgwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF9zX2Zsb2F0KzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwODQgICAwMDAwMDAzMCAKLSAgICAgICAzOCAwMDAwMDA4OCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotDE1WUCBNUCBNYWNybyBBc3NlbWJsZXIgICAgIFZlcnNpb24gMS4xMyAgICAgU3VuIEZlYiAyMyAxMjoxNjozMiAxOTk3Ci1Db3B5cmlnaHQgKGMpIDE5OTMtMTk5NSAgICBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgCi0KLXJlbG9jczIucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0UgICAgMgotCi0gICAgICAgICAgMDAwMDAwOEMgICAwMDAwMDAwMCAKLSAgICAgICAzOSAwMDAwMDA5MCAgIDEwMzQ1MDAwICAgICAgICAgIGxkICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMDk0ICAgMDAwMDAwMDAgCi0gICAgICAgNDAgMDAwMDAwOTggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfZmxvYXQrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDA5QyAgIDAwMDAwMDM4IAotICAgICAgIDQxIDAwMDAwMEEwICAgMTAzNDcwMDAgICAgICAgICAgbGQuZCAgICAgIF9zX2RvdWJsZSswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEE0ICAgMDAwMDAwMDggCi0gICAgICAgNDIgMDAwMDAwQTggICAxMDM2NzAwMCAgICAgICAgICBzdC5kICAgICAgX3hfZG91YmxlKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQUMgICAwMDAwMDAwMCAKLSAgICAgICA0MyAwMDAwMDBCMCAgIDEwMzQ3MDAwICAgICAgICAgIGxkLmQgICAgICBfeF9kb3VibGUrMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBCNCAgIDAwMDAwMDAwIAotICAgICAgIDQ0IDAwMDAwMEI4ICAgMTAzNjcwMDAgICAgICAgICAgc3QuZCAgICAgIF9nX2RvdWJsZSswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEJDICAgMDAwMDAwMjggCi0gICAgICAgNDUgMDAwMDAwQzAgICAxMDM0NTAwMCAgICAgICAgICBsZCAgICAgICAgX3NfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwQzQgICAwMDAwMDA0NCAKLSAgICAgICA0NiAwMDAwMDBDOCAgIDEwMzY1MDAwICAgICAgICAgIHN0ICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgICAwMDAwMDBDQyAgIDAwMDAwMDAwIAotICAgICAgIDQ3IDAwMDAwMEQwICAgMTAzNDUwMDAgICAgICAgICAgbGQgICAgICAgIF94X2NoYXJfcCswKHIwKSxyMgotICAgICAgICAgIDAwMDAwMEQ0ICAgMDAwMDAwMDAgCi0gICAgICAgNDggMDAwMDAwRDggICAxMDM2NTAwMCAgICAgICAgICBzdCAgICAgICAgX2dfY2hhcl9wKzAocjApLHIyCi0gICAgICAgICAgMDAwMDAwREMgICAwMDAwMDAwMCAKLSAgICAgICA0OSAwMDAwMDBFMCAgIDAwMzhBMDFGICAgICAgICAgIGpzci5hICAgICByMzEocjApLHIwCi0gICAgICAgNTAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICA1MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19jaGFyX3AKLSAgICAgICA1MiAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfZ19jaGFyX3AsNCw0Ci0gICAgICAgNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfbG9uZwotICAgICAgIDU0IDAwMDAwMDA0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2xvbmcsNCw0Ci0gICAgICAgNTUgMDAwMDAwMDggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfZG91YmxlLDgsOAotICAgICAgIDU2IDAwMDAwMDEwICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2xvbmcsNCw0Ci0gICAgICAgNTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfY2hhcgotICAgICAgIDU4IDAwMDAwMDE0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2NoYXIsMSw0Ci0gICAgICAgNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nbG9iYWwgX2dfaW50Ci0gICAgICAgNjAgMDAwMDAwMTggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfaW50LDQsNAotICAgICAgIDYxIDAwMDAwMDFDICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2NoYXIsMSw0Ci0gICAgICAgNjIgMDAwMDAwMjAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3NfaW50LDQsNAotICAgICAgIDYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2RvdWJsZQotICAgICAgIDY0IDAwMDAwMDI4ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX2RvdWJsZSw4LDgKLSAgICAgICA2NSAwMDAwMDAzMCAgICAgICAgICAgICAgICAgICAgLmJzcyAgICBfc19mbG9hdCw0LDQKLSAgICAgICA2NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdsb2JhbCBfZ19zaG9ydAotICAgICAgIDY3IDAwMDAwMDM0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9nX3Nob3J0LDIsNAotICAgICAgIDY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2xvYmFsIF9nX2Zsb2F0Ci0gICAgICAgNjkgMDAwMDAwMzggICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX2dfZmxvYXQsNCw0Ci0gICAgICAgNzAgMDAwMDAwM0MgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3Nfc2hvcnQsMiw0Ci0gICAgICAgNzEgMDAwMDAwNDAgICAgICAgICAgICAgICAgICAgIC5ic3MgICAgX3hfaW50LDQsNAotICAgICAgIDcyIDAwMDAwMDQ0ICAgICAgICAgICAgICAgICAgICAuYnNzICAgIF9zX2NoYXJfcCw0LDQKLQotIE5vIEVycm9ycywgIE5vIFdhcm5pbmdzCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy90aWM4MC9yZWxvY3MyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MjU3ZGYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotOzsgVGhpcyBpcyB0aGUgaGFuZCBoYWNrZWQgb3V0cHV0IG9mIHRoZSBUSSBDIGNvbXBpbGVyIGZvciBhIHNpbXBsZQotOzsgdGVzdCBwcm9ncmFtIHRoYXQgY29udGFpbnMgc3RhdGljLCBnbG9iYWwsIGFuZCBleHRlcm4gZGF0YSB2YXJpYWJsZXMuCi0KLQkuZmlsZQkicmVsb2NzMi5zIgotCS5nbG9iYWwJX3hfY2hhcgotCS5nbG9iYWwJX3hfc2hvcnQKLQkuZ2xvYmFsCV94X2xvbmcKLQkuZ2xvYmFsCV94X2Zsb2F0Ci0JLmdsb2JhbAlfeF9kb3VibGUKLQkuZ2xvYmFsCV94X2NoYXJfcAotCS5nbG9iYWwJX2dfY2hhcgotCS5nbG9iYWwJX2dfc2hvcnQKLQkuZ2xvYmFsCV9nX2ludAotCS5nbG9iYWwJX2dfbG9uZwotCS5nbG9iYWwJX2dfZmxvYXQKLQkuZ2xvYmFsCV9nX2RvdWJsZQotCS5nbG9iYWwJX2dfY2hhcl9wCi0JLmdsb2JhbAlfbWFpbgotCi1fbWFpbjoKLSAgICAgICAgIGxkLmIgICAgICBfc19jaGFyKzAocjApLHIyCi0gICAgICAgICBzdC5iICAgICAgX3hfY2hhciswKHIwKSxyMgotICAgICAgICAgbGQuYiAgICAgIF94X2NoYXIrMChyMCkscjIKLSAgICAgICAgIHN0LmIgICAgICBfZ19jaGFyKzAocjApLHIyCi0gICAgICAgICBsZC5oICAgICAgX3Nfc2hvcnQrMChyMCkscjIKLSAgICAgICAgIHN0LmggICAgICBfeF9zaG9ydCswKHIwKSxyMgotICAgICAgICAgbGQuaCAgICAgIF94X3Nob3J0KzAocjApLHIyCi0gICAgICAgICBzdC5oICAgICAgX2dfc2hvcnQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfc19pbnQrMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfeF9pbnQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9pbnQrMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfZ19pbnQrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfc19sb25nKzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX3hfbG9uZyswKHIwKSxyMgotICAgICAgICAgbGQgICAgICAgIF94X2xvbmcrMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfZ19sb25nKzAocjApLHIyCi0gICAgICAgICBsZCAgICAgICAgX3NfZmxvYXQrMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfeF9mbG9hdCswKHIwKSxyMgotICAgICAgICAgbGQgICAgICAgIF94X2Zsb2F0KzAocjApLHIyCi0gICAgICAgICBzdCAgICAgICAgX2dfZmxvYXQrMChyMCkscjIKLSAgICAgICAgIGxkLmQgICAgICBfc19kb3VibGUrMChyMCkscjIKLSAgICAgICAgIHN0LmQgICAgICBfeF9kb3VibGUrMChyMCkscjIKLSAgICAgICAgIGxkLmQgICAgICBfeF9kb3VibGUrMChyMCkscjIKLSAgICAgICAgIHN0LmQgICAgICBfZ19kb3VibGUrMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfc19jaGFyX3ArMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgIGxkICAgICAgICBfeF9jaGFyX3ArMChyMCkscjIKLSAgICAgICAgIHN0ICAgICAgICBfZ19jaGFyX3ArMChyMCkscjIKLSAgICAgICAgIGpzci5hICAgICByMzEocjApLHIwCi0KLQkuZ2xvYmFsCV9nX2NoYXJfcAotCS5ic3MJX2dfY2hhcl9wLDQsNAotCS5nbG9iYWwJX2dfbG9uZwotCS5ic3MJX2dfbG9uZyw0LDQKLQkuYnNzCV9zX2RvdWJsZSw4LDgKLQkuYnNzCV9zX2xvbmcsNCw0Ci0JLmdsb2JhbAlfZ19jaGFyCi0JLmJzcwlfZ19jaGFyLDEsNAotCS5nbG9iYWwJX2dfaW50Ci0JLmJzcwlfZ19pbnQsNCw0Ci0JLmJzcwlfc19jaGFyLDEsNAotCS5ic3MJX3NfaW50LDQsNAotCS5nbG9iYWwJX2dfZG91YmxlCi0JLmJzcwlfZ19kb3VibGUsOCw4Ci0JLmJzcwlfc19mbG9hdCw0LDQKLQkuZ2xvYmFsCV9nX3Nob3J0Ci0JLmJzcwlfZ19zaG9ydCwyLDQKLQkuZ2xvYmFsCV9nX2Zsb2F0Ci0JLmJzcwlfZ19mbG9hdCw0LDQKLQkuYnNzCV9zX3Nob3J0LDIsNAotCS5ic3MJX3hfaW50LDQsNAotCS5ic3MJX3NfY2hhcl9wLDQsNApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMmIuZCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3JlbG9jczJiLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGY5OWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvcmVsb2NzMmIuZAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSNvYmpkdW1wOiAtcgotI3NvdXJjZTogcmVsb2NzMi5zCi0jbmFtZTogVEljODAgc2ltcGxlIHJlbG9jcywgc3RhdGljIGFuZCBnbG9iYWwgdmFyaWFibGVzIChyZWxvY3MpCi0KLS4qOiArZmlsZSBmb3JtYXQgLip0aWM4MC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICAgVFlQRSAgICAgICAgICAgICAgVkFMVUUgCi0wMDAwMDAwNCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDAwYyAzMiAgICAgICAgICAgICAgICBfeF9jaGFyCi0wMDAwMDAxNCAzMiAgICAgICAgICAgICAgICBfeF9jaGFyCi0wMDAwMDAxYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDAyNCAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0wMDAwMDAyYyAzMiAgICAgICAgICAgICAgICBfeF9zaG9ydAotMDAwMDAwMzQgMzIgICAgICAgICAgICAgICAgX3hfc2hvcnQKLTAwMDAwMDNjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDQ0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDRjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDU0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDVjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDY0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDZjIDMyICAgICAgICAgICAgICAgIF94X2xvbmcKLTAwMDAwMDc0IDMyICAgICAgICAgICAgICAgIF94X2xvbmcKLTAwMDAwMDdjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDg0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMDhjIDMyICAgICAgICAgICAgICAgIF94X2Zsb2F0Ci0wMDAwMDA5NCAzMiAgICAgICAgICAgICAgICBfeF9mbG9hdAotMDAwMDAwOWMgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwYTQgMzIgICAgICAgICAgICAgICAgLmJzc1wrMHhmZmZmZmYxYwotMDAwMDAwYWMgMzIgICAgICAgICAgICAgICAgX3hfZG91YmxlCi0wMDAwMDBiNCAzMiAgICAgICAgICAgICAgICBfeF9kb3VibGUKLTAwMDAwMGJjIDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGM0IDMyICAgICAgICAgICAgICAgIC5ic3NcKzB4ZmZmZmZmMWMKLTAwMDAwMGNjIDMyICAgICAgICAgICAgICAgIF94X2NoYXJfcAotMDAwMDAwZDQgMzIgICAgICAgICAgICAgICAgX3hfY2hhcl9wCi0wMDAwMDBkYyAzMiAgICAgICAgICAgICAgICAuYnNzXCsweGZmZmZmZjFjCi0KLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvdGljODAuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdGljODAvdGljODAuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWM0NjMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3RpYzgwL3RpYzgwLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgVEkgVE1TMzIwQzgwIHRlc3RzLgotIwotaWYgW2lzdGFyZ2V0IHRpYzgwKi0qLSpdIHRoZW4gewotCi0gICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlZ29wczIiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVnb3BzMyIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWdvcHM0IgotICAgIHJ1bl9kdW1wX3Rlc3QgImNyZWdvcHMiCi0gICAgcnVuX2R1bXBfdGVzdCAiZmxvYXQiCi0gICAgcnVuX2R1bXBfdGVzdCAiZW5kbWFzayIKLSAgICBydW5fZHVtcF90ZXN0ICJiaXRudW0iCi0gICAgcnVuX2R1bXBfdGVzdCAiY2NvZGUiCi0gICAgcnVuX2R1bXBfdGVzdCAiYWRkIgotICAgIHJ1bl9kdW1wX3Rlc3QgInJlbG9jczEiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMWIiCi0gICAgcnVuX2R1bXBfdGVzdCAicmVsb2NzMiIKLSAgICBydW5fZHVtcF90ZXN0ICJyZWxvY3MyYiIKLSAgICBydW5fZHVtcF90ZXN0ICJhbGlnbiIKLX0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYXJpdGgucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYXJpdGgucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcyMTQwZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2FyaXRoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgYXJpdGhfb3Bjb2RlcwotYXJpdGhfb3Bjb2RlczoKLQlhZGQgcjUscjYKLQlhZGQgNSxyNgotCWFkZGkgNyxyNSxyNgotCWRpdmggcjUscjYKLQltdWxoIHI1LHI2Ci0JbXVsaCA1LHI2Ci0JbXVsaGkgNyxyNSxyNgotCXNhciByNSxyNgotCXNhciAzMSxyNgotCXNhdGFkZCByNSxyNgotCXNhdGFkZCA1LHI2Ci0Jc2F0c3ViIHI1LHI2Ci0Jc2F0c3ViaSA3LHI1LHI2Ci0Jc2F0c3ViciByNSxyNgotCXNobCByNSxyNgotCXNobCAzMSxyNgotCXNociByNSxyNgotCXNociAzMSxyNgotCXN1YiByNSxyNgotCXN1YnIgcjUscjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYmFzaWMuZXhwIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iYXNpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNmE2MzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iYXNpYy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotIyBQbGVhc2UgZW1haWwgYW55IGJ1Z3MsIGNvbW1lbnRzLCBhbmQvb3IgYWRkaXRpb25zIHRvIHRoaXMgZmlsZSB0bzoKLSMgRGVqYUdudUBjeWdudXMuY29tCi0KLSMgV3JpdHRlbiBieSBDeWdudXMgU3VwcG9ydC4KLQotcHJvYyBkb19hcml0aCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJhcml0aC5zOiBBcml0aG1ldGljIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJhcml0aC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgIyAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNDg5QTAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgQzUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgNDUzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgMDUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDQ1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIEU1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEU1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBlIEU1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBFNTM3QTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTYgQkYzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggQzUzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWEgMjUzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWMgQTUzMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgNjUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDIyIDg1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI0IEU1MzdDMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyOCBERjMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYSBFNTM3ODAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMmUgOUYzMlxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgQTUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzIgODUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjBdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fYml0IHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImJpdC5zOiBiaXQgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImJpdC5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEM2QUYxMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBDNjZGMTAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggQzYyRjEwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBjIEM2RUYxMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT00XSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2JyYW5jaCB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJicmFuY2guczogYnJhbmNoIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJicmFuY2gucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCA4RjA1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiBGRUZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCBFNkZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNiBEN0ZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBDQkZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYSBCOUZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyBBMUZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSA5M0ZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCA4MkZEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMiBGQUY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBFMEY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNiBEOEY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxOCBDNEY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBCQ0Y1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYyBBMUY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxZSA5OUY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCA4MkY1XFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMiBGQUVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNCBFNUVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyNiBEREVEXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0yMF0gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19jb21wYXJlIHt9IHsKLSAgICBzZXQgdGVzdG5hbWUgImNvbXBhcmUuczogY29tcGFyZSBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAiY29tcGFyZS5zIiAiLWFsIgotCi0gICAgIyBJbnN0ZWFkIG9mIGhhdmluZyBhIHZhcmlhYmxlIGZvciBlYWNoIG1hdGNoIHN0cmluZyBqdXN0IGluY3JlbWVudCB0aGUKLSAgICAjIHRvdGFsIG51bWJlciBvZiBtYXRjaGVzIHNlZW4uICBUaGF0J3Mgc2ltcGxlciB3aGVuIHRlc3RpbmcgbGFyZ2UgbnVtYmVycwotICAgICMgb2YgaW5zdHJ1Y3Rpb25zIChhcyB0aGVzZSB0ZXN0cyB0bykuCi0gICAgd2hpbGUgMSB7Ci0JZXhwZWN0IHsKLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAwIEU1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDAyIDY1MzJcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IEUwMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCBFODJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgRTEyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDEwIEUxMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxNCBFOTJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTggRTkyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDFjIEUyMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyMCBFQTJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjQgRTMyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDI4IEVCMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAyYyBFNDJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMzAgRTQyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDM0IEVDMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAzOCBFQzJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwM2MgRTUyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDQwIEVEMkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA0NCBFNjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNDggRUUyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDRjIEU3MkYwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDA1MCBFRjJGMDAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwNTQgNjUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MjNdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fanVtcHMge30gewotICAgIHNldCB0ZXN0bmFtZSAianVtcHMuczoganVtcHMgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgImp1bXBzLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgODAyRjAwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDY1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IEJGMDdGQUZGXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXFteXG5cXSpcbiIJCQkJeyB9Ci0JICAgIHRpbWVvdXQJCQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkgICAgZW9mCQkJCQl7IGJyZWFrIH0KLQl9Ci0gICAgfQotCi0gICAgIyBUaGlzIHdhcyBpbnRlbmRlZCB0byBkbyBhbnkgY2xlYW51cCBuZWNlc3NhcnkuICBJdCBraW5kYSBsb29rcyBsaWtlIGl0Ci0gICAgIyBpc24ndCBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UsIHBsZWFzZSBrZWVwIGl0IGluIGZvciBub3cuCi0gICAgZ2FzX2ZpbmlzaAotCi0gICAgIyBEaWQgd2UgZmluZCB3aGF0IHdlIHdlcmUgbG9va2luZyBmb3I/ICBJZiBub3QsIGZsdW5rIGl0LgotICAgIGlmIFtleHByICR4PT0zXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1wcm9jIGRvX2xvZ2ljYWwge30gewotICAgIHNldCB0ZXN0bmFtZSAibG9naWNhbC5zOiBsb2dpY2FsIG9wZXJhdGlvbnMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJsb2dpY2FsLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgNDUzMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDIgQzUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA2IDI1MzBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IDA1MzFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDBhIDg1MzYwNzAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSAyNTMxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxMCBBNTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09N10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotcHJvYyBkb19tZW0ge30gewotICAgIHNldCB0ZXN0bmFtZSAibWVtLnM6IG1lbW9yeSBvcGVyYXRpb25zIgotICAgIHNldCB4IDAKLQotICAgIGdhc19zdGFydCAibWVtLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMDUzNzA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDI1MzcwNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCAyNTM3MDUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGMgNDAzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMGUgNDAzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTAgNDAzNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgNDYyRjA1MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IDY2MkYwNDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSA2NjJGMDUwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgQzAzM1xbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjAgQzAzNFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMjIgNDEzNVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09MTJdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbWlzYyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtaXNjLnM6IG1pc2Mgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1pc2MucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCBFMDA3NjAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDQgRTA4NzYwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA4IEUwMDcyMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwYyAwMDAwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwZSBFMDA3NDAwMVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMTIgRTAwNzAwMDFcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDE2IEZGMDcwMDAxXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAxYSBFNzJGMjAwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMWUgRTUzRjQwMDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTldIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9fbW92ZSB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJtb3ZlLnM6IG1vdmUgb3BlcmF0aW9ucyIKLSAgICBzZXQgeCAwCi0KLSAgICBnYXNfc3RhcnQgIm1vdmUucyIgIi1hbCIKLQotICAgICMgSW5zdGVhZCBvZiBoYXZpbmcgYSB2YXJpYWJsZSBmb3IgZWFjaCBtYXRjaCBzdHJpbmcganVzdCBpbmNyZW1lbnQgdGhlCi0gICAgIyB0b3RhbCBudW1iZXIgb2YgbWF0Y2hlcyBzZWVuLiAgVGhhdCdzIHNpbXBsZXIgd2hlbiB0ZXN0aW5nIGxhcmdlIG51bWJlcnMKLSAgICAjIG9mIGluc3RydWN0aW9ucyAoYXMgdGhlc2UgdGVzdHMgdG8pLgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMCAwNTMwXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwMiAwNTMyXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwNCAyNTM2MDcwMFxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDggNDUzNjA3MDBcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJcW15cblxdKlxuIgkJCQl7IH0KLQkgICAgdGltZW91dAkJCQl7IHBlcnJvciAidGltZW91dFxuIjsgYnJlYWsgfQotCSAgICBlb2YJCQkJCXsgYnJlYWsgfQotCX0KLSAgICB9Ci0KLSAgICAjIFRoaXMgd2FzIGludGVuZGVkIHRvIGRvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeS4gIEl0IGtpbmRhIGxvb2tzIGxpa2UgaXQKLSAgICAjIGlzbid0IG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZSwgcGxlYXNlIGtlZXAgaXQgaW4gZm9yIG5vdy4KLSAgICBnYXNfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTRdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLXByb2MgZG9faGlsbyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJoaWxvLnM6IGhpbG8gdGVzdHMiCi0gICAgc2V0IHggMAotCi0gICAgZ2FzX3N0YXJ0ICJoaWxvLnMiICItYWwiCi0KLSAgICAjIEluc3RlYWQgb2YgaGF2aW5nIGEgdmFyaWFibGUgZm9yIGVhY2ggbWF0Y2ggc3RyaW5nIGp1c3QgaW5jcmVtZW50IHRoZQotICAgICMgdG90YWwgbnVtYmVyIG9mIG1hdGNoZXMgc2Vlbi4gIFRoYXQncyBzaW1wbGVyIHdoZW4gdGVzdGluZyBsYXJnZSBudW1iZXJzCi0gICAgIyBvZiBpbnN0cnVjdGlvbnMgKGFzIHRoZXNlIHRlc3RzIHRvKS4KLSAgICB3aGlsZSAxIHsKLQlleHBlY3QgewotCSAgICAtcmUgIl4gK1xbMC05XF0rIDAwMDAgMjAwRUVGQkVcW15cblxdKlxuIgl7IHNldCB4IFtleHByICR4KzFdIH0KLQkgICAgLXJlICJeICtcWzAtOVxdKyAwMDA0IDQxMEVBRURFXFteXG5cXSpcbiIJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JICAgIC1yZSAiXiArXFswLTlcXSsgMDAwOCA0MTBFQURERVxbXlxuXF0qXG4iCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIGdhc19maW5pc2gKLQotICAgICMgRGlkIHdlIGZpbmQgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPyAgSWYgbm90LCBmbHVuayBpdC4KLSAgICBpZiBbZXhwciAkeD09M10gdGhlbiB7IHBhc3MgJHRlc3RuYW1lIH0gZWxzZSB7IGZhaWwgJHRlc3RuYW1lIH0KLX0KLQotCi1wcm9jIGRvX3NpbXBsZV9yZWxvY190ZXN0cyB7fSB7Ci0gICAgc2V0IHRlc3RuYW1lICJyZWxvYy5zOiBUZXN0IGZvciBwcm9wZXIgcmVsb2NhdGlvbnMgKHBhcnQgMikiCi0gICAgc2V0IHggMAotCi0gICAgaWYgW2dhc190ZXN0X29sZCAicmVsb2MucyIgIiIgIlRlc3QgZm9yIHByb3BlciByZWxvY2F0aW9uIChwYXJ0IDEpIl0gdGhlbiB7Ci0Jb2JqZHVtcF9zdGFydF9ub19zdWJkaXIgImEub3V0IiAiLXIiCi0KLQl3aGlsZSAxIHsKLQkgICAgZXhwZWN0IHsKLQkJLXJlICJeMDAwMDAwMDJcW15cblxdKlJfVjg1MF9MTzE2XFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAwNlxbXlxuXF0qUl9WODUwX0hJMTZfU1xbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMGFcW15cblxdKlJfVjg1MF9ISTE2XFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIl4wMDAwMDAwZVxbXlxuXF0qUl9WODUwX1pEQV8xNl8xNl9PRkZTRVRcW15cblxdKlxuIgotCQkJeyBzZXQgeCBbZXhwciAkeCsxXSB9Ci0JCS1yZSAiXjAwMDAwMDEyXFteXG5cXSpSX1Y4NTBfVERBXzE2XzE2X09GRlNFVFxbXlxuXF0qXG4iCi0JCQl7IHNldCB4IFtleHByICR4KzFdIH0KLQkJLXJlICJeMDAwMDAwMTZcW15cblxdKlJfVjg1MF9TREFfMTZfMTZfT0ZGU0VUXFteXG5cXSpcbiIKLQkJCXsgc2V0IHggW2V4cHIgJHgrMV0gfQotCQktcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCQl0aW1lb3V0CQkJeyBwZXJyb3IgInRpbWVvdXRcbiI7IGJyZWFrIH0KLQkJZW9mCQkJCXsgYnJlYWsgfQotCSAgICB9Ci0JfQotICAgIH0KLQotICAgICMgVGhpcyB3YXMgaW50ZW5kZWQgdG8gZG8gYW55IGNsZWFudXAgbmVjZXNzYXJ5LiAgSXQga2luZGEgbG9va3MgbGlrZSBpdAotICAgICMgaXNuJ3QgbmVlZGVkLCBidXQganVzdCBpbiBjYXNlLCBwbGVhc2Uga2VlcCBpdCBpbiBmb3Igbm93LgotICAgIG9iamR1bXBfZmluaXNoCi0KLSAgICAjIERpZCB3ZSBmaW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvcj8gIElmIG5vdCwgZmx1bmsgaXQuCi0gICAgaWYgW2V4cHIgJHg9PTZdIHRoZW4geyBwYXNzICR0ZXN0bmFtZSB9IGVsc2UgeyBmYWlsICR0ZXN0bmFtZSB9Ci19Ci0KLWlmIFtpc3RhcmdldCB2ODUwKi0qLSpdIHRoZW4gewotICAgICMgVGVzdCB0aGUgYmFzaWMgaW5zdHJ1Y3Rpb24gcGFyc2VyLgotICAgIGRvX2FyaXRoCi0gICAgZG9fYml0Ci0gICAgZG9fYnJhbmNoCi0gICAgZG9fY29tcGFyZQotICAgIGRvX2p1bXBzCi0gICAgZG9fbG9naWNhbAotICAgIGRvX21lbQotICAgIGRvX21pc2MKLSAgICBkb19tb3ZlCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBoYW5kbGUgbG8oKSBoaSgpIGFuZCBoaTAoKSBjb3JyZWN0bHkuCi0gICAgZG9faGlsbwotCi0gICAgIyBDaGVjayBmb3IgcHJvcGVyIHJlbG9jcyBvbiBsbywgaGksIGhpMCwgemRhb2ZmLCB0ZGFvZmYgYW5kIHNkYW9mZgotICAgICMgZXhwcmVzc2lvbnMKLSAgICBkb19zaW1wbGVfcmVsb2NfdGVzdHMKLQotICAgIGdhc190ZXN0ICJoaWxvMi5zIiAiIiAiIiAiaGkvbG8gcmVncmVzc2lvbiB0ZXN0IgotICAgIGdhc190ZXN0ICJmZXBzdy5zIiAiIiAiIiAiZXFzdyByZWdyZXNzaW9uIHRlc3QiCi0KLSAgICBnYXNfdGVzdF9lcnJvciAicmFuZ2UucyIgIi1td2Fybi1zaWduZWQtb3ZlcmZsb3ciICJDaGVjayBmb3IgcmFuZ2UgZXJyb3Igb24gYnl0ZSBsb2FkL3N0b3JlIgotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iaXQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYml0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMWFjMDUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9iaXQucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi0JLnRleHQKLQkuZ2xvYmFsIGJpdAotYml0OgotCWNscjEgNSwxNltyNl0KLQlub3QxIDUsMTZbcjZdCi0Jc2V0MSA1LDE2W3I2XQotCXRzdDEgNSwxNltyNl0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYnJhbmNoLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2JyYW5jaC5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWMxYjQyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvYnJhbmNoLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgYmNjCi1iY2M6Ci0JYmd0IGJjYwotCWJnZSBiY2MKLQlibHQgYmNjCi0JYmxlIGJjYwotCWJoIGJjYwotCWJubCBiY2MKLQlibCBiY2MKLQlibmggYmNjCi0JYmUgYmNjCi0JYm5lIGJjYwotCWJ2IGJjYwotCWJudiBiY2MKLQlibiBiY2MKLQlicCBiY2MKLQliYyBiY2MKLQlibmMgYmNjCi0JYnogYmNjCi0JYm56IGJjYwotCWJyIGJjYwotCWJzYSBiY2MKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvY29tcGFyZS5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9jb21wYXJlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MWM4YTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9jb21wYXJlLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgY29tcGFyZQotY29tcGFyZToKLQljbXAgcjUscjYKLQljbXAgNSxyNgotCXNldGYgdixyNQotCXNldGYgbnYscjUKLQlzZXRmIGMscjUKLQlzZXRmIGwscjUKLQlzZXRmIG5jLHI1Ci0Jc2V0ZiBubCxyNQotCXNldGYgeixyNQotCXNldGYgbnoscjUKLQlzZXRmIG5oLHI1Ci0Jc2V0ZiBoLHI1Ci0Jc2V0ZiBzLHI1Ci0Jc2V0ZiBuLHI1Ci0Jc2V0ZiBucyxyNQotCXNldGYgcCxyNQotCXNldGYgdCxyNQotCXNldGYgc2EscjUKLQlzZXRmIGx0LHI1Ci0Jc2V0ZiBnZSxyNQotCXNldGYgbGUscjUKLQlzZXRmIGd0LHI1Ci0JdHN0IHI1LHI2Ci0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2ZlcHN3LnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2ZlcHN3LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDMzM2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9mZXBzdy5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JLnRleHQKLQlsZHNyIHIxNyxmZXBzdwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2N2U1Ni4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8ucworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotCi0JLnRleHQKLQltb3ZlYSBsbygweGRlYWRiZWVmKSxyMCxyMQotCW1vdmhpIGhpKDB4ZGVhZGJlZWYpLHIxLHIxCi0JbW92aGkgaGkwKDB4ZGVhZGJlZWYpLHIxLHIxCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8yLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2hpbG8yLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MWQ1OTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9oaWxvMi5zCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0JLnRleHQKLQkub3JnIDB4MTAwMDAKLQltb3ZlYSBoaShibGFoKSxyMCxyMQotYmxhaDoKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvanVtcHMucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvanVtcHMucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTczMTY0Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL2p1bXBzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQotCS50ZXh0Ci0JLmdsb2JhbCBqdW1wcwotanVtcHM6Ci0JamFybCBqdW1wcyxyNQotCWptcCBbcjVdCi0JanIganVtcHMKLQkKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbG9naWNhbC5zIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9sb2dpY2FsLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDBiM2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9sb2dpY2FsLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbG9naWNhbHMKLWxvZ2ljYWxzOgotCWFuZCByNSxyNgotCWFuZGkgNyxyNSxyNgotCW5vdCByNSxyNgotCW9yIHI1LHI2Ci0Jb3JpIDcscjUscjYKLQl4b3IgcjUscjYKLQl4b3JpIDcscjUscjYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWVtLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21lbS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzY5Y2VhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbWVtLnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbWVtb3J5Ci1tZW1vcnk6Ci0JbGQuYiA1W3I1XSxyNgotCWxkLmggNFtyNV0scjYKLQlsZC53IDRbcjVdLHI2Ci0Jc2xkLmIgNjRbZXBdLHI2Ci0Jc2xkLmggMTI4W2VwXSxyNgotCXNsZC53IDEyOFtlcF0scjYKLQlzdC5iIHI1LDVbcjZdCi0Jc3QuaCByNSw0W3I2XQotCXN0LncgcjUsNFtyNl0KLQlzc3QuYiByNiw2NFtlcF0KLQlzc3QuaCByNiwxMjhbZXBdCi0Jc3N0LncgcjYsMTI4W2VwXQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9taXNjLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21pc2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjNGU0Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21pc2MucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotCS50ZXh0Ci0JLmdsb2JhbCBtaXNjCi1taXNjOgotCWRpCi0JZWkKLQloYWx0Ci0Jbm9wCi0JcmV0aQotCXRyYXAgMAotCXRyYXAgMzEKLQlsZHNyIHI3LHBzdwotCXN0c3IgcHN3LHI3CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL21vdmUucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbW92ZS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmE2ZmFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvbW92ZS5zCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0KLQkudGV4dAotCS5nbG9iYWwgbW92ZQotbW92ZToKLQltb3YgcjUscjYKLQltb3YgNSxyNgotCW1vdmVhIDcscjUscjYKLQltb3ZoaSA3LHI1LHI2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JhbmdlLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JhbmdlLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYWNjZjQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdjg1MC9yYW5nZS5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0JLnRleHQKLQlsZC5iIDB4ZmY2MltyMF0scjAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmVsb2MucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Y4NTAvcmVsb2MucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczOGQyNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92ODUwL3JlbG9jLnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLQkudGV4dAotCW1vdmVhIGxvKGZvbykscjAscjEKLQltb3ZoaSBoaShmb28pLHIxLHIxCi0JbW92aGkgaGkwKGZvbykscjEscjEKLQltb3ZlYSB6ZGFvZmYoX2ZvbykscjAscjEKLQltb3ZoaSB0ZGFvZmYoX2ZvbyksZXAscjEKLQltb3ZoaSBzZGFvZmYoX2ZvbyksZ3AscjEKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3NzBjNS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92YXgvcXVhZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1wcm9jIGRvX3F1YWQge30gewotICAgIHNldCB0ZXN0bmFtZSAicXVhZC5zOiBxdWFkd29yZCBpbW1lZGlhdGUgdmFsdWVzIgotICAgIHNldCB4MSAwCi0gICAgc2V0IHgyIDAKLSAgICBzZXQgeDMgMAotICAgIGdhc19zdGFydCAicXVhZC5zIiAiLWFsIgotICAgIHdoaWxlIDEgewotCWV4cGVjdCB7Ci0JICAgIC1yZSAiXiArMlxbIFx0XF0rMDAwMCsgN0Q4Rjc4NTZcWyBcdFxdK21vdnFcW15cblxdKlxuIiB7IHNldCB4MSAxIH0KLQkgICAgLXJlICJeICsyXFsgXHRcXSszNDEyRERDQ1xbXlxuXF0qXG4iCQkgICB7IHNldCB4MiAxIH0KLQkgICAgLXJlICJeICsyXFsgXHRcXStCQkFBNTAwMVxbIFx0XF0qXHJcbiIJCSAgIHsgc2V0IHgzIDEgfQotCSAgICAtcmUgIlxbXlxuXF0qXG4iCQkJCXsgfQotCSAgICB0aW1lb3V0CQkJCXsgcGVycm9yICJ0aW1lb3V0XG4iOyBicmVhayB9Ci0JICAgIGVvZgkJCQkJeyBicmVhayB9Ci0JfQotICAgIH0KLSAgICBnYXNfZmluaXNoCi0gICAgaWYgW2FsbF9vbmVzICR4MSAkeDIgJHgzXSB0aGVuIHsgcGFzcyAkdGVzdG5hbWUgfSBlbHNlIHsgZmFpbCAkdGVzdG5hbWUgfQotfQotCi1pZiBbaXN0YXJnZXQgdmF4LSotKl0gdGhlbiB7Ci0gICAgZG9fcXVhZAotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3ZheC9xdWFkLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWQ0YWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdmF4L3F1YWQucworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCS50ZXh0Ci0JbW92cSAkMHhhYWJiY2NkZDEyMzQ1Njc4LHIwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGJiOTkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogdnRhYmxlIGVudHJ5MAotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICtUWVBFICtWQUxVRSAKLTArMDAwMDAxMCBSXy4qX0dOVV9WVEVOVFJZICB2dGJsX2EKLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkwLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2Zjg5ZTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MC5zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0udGV4dAotLnZ0YWJsZV9lbnRyeSB2dGJsX2EsIDE2CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLmQgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYTZlNGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2VudHJ5MS5kCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI29iamR1bXA6IC1yCi0jbmFtZTogdnRhYmxlIGVudHJ5MQotCi0uKjogK2ZpbGUgZm9ybWF0IC4qCi0KLVJFTE9DQVRJT04gUkVDT1JEUyBGT1IgXFsudGV4dFxdOgotT0ZGU0VUICtUWVBFICtWQUxVRSAKLTArMDAwMDAwMCBSXy4qX0dOVV9WVEVOVFJZICB2dGJsX2EuKgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9lbnRyeTEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmODllMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvZW50cnkxLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLS50ZXh0Ci0udnRhYmxlX2VudHJ5IHZ0YmxfYSwgMTYKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MC5kIGIvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLmQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzk1YjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLmQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jb2JqZHVtcDogLXIKLSNuYW1lOiB2dGFibGUgaW5oZXJpdDAKLQotLio6ICtmaWxlIGZvcm1hdCAuKgotCi1SRUxPQ0FUSU9OIFJFQ09SRFMgRk9SIFxbLmRhdGFcXToKLU9GRlNFVCArVFlQRSArVkFMVUUgCi0wKzAwMDAwMDAgUl8uKl9HTlVfVlRJTkhFUklUICBcKkFCU1wqCi0wKzAwMDAwMTAgUl8uKl9HTlVfVlRJTkhFUklUICB2dGJsX2EKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQwLnMgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQzOGRmNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDAucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS5kYXRhCi0KLS50eXBlIHZ0YmxfYSxvYmplY3QKLXZ0YmxfYToKLQkuc3BhY2UgMTYKLS5zaXplIHZ0YmxfYSwxNgotLnZ0YWJsZV9pbmhlcml0IHZ0YmxfYSwgMAotCi0udHlwZSB2dGJsX2Isb2JqZWN0Ci12dGJsX2I6Ci0JLnNwYWNlIDE2Ci0uc2l6ZSB2dGJsX2IsMTYKLS52dGFibGVfaW5oZXJpdCB2dGJsX2IsIHZ0YmxfYQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL2luaGVyaXQxLmwgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkNjM1OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEubAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotLio6IEFzc2VtYmxlciBtZXNzYWdlczoKLS4qOjE6IEVycm9yOiBleHBlY3RlZCBgdnRibF9hJyB0byBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIC52dGFibGVfaW5oZXJpdAotLipHQVMuKgotCi0KLSArMS4qdnRhYmxlX2luaGVyaXQgdnRibF9hLCAwCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvaW5oZXJpdDEucyBiL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGQxZDI4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzL3Z0YWJsZS9pbmhlcml0MS5zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLnZ0YWJsZV9pbmhlcml0IHZ0YmxfYSwgMApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXMvdnRhYmxlL3Z0YWJsZS5leHAgYi9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvdnRhYmxlLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk3MDc3Mi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhcy92dGFibGUvdnRhYmxlLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMKLSMgdnRhYmxlIHRlc3RzCi0jCi1wcm9jIHJ1bl9saXN0X3Rlc3QgeyBuYW1lIG9wdHMgfSB7Ci0gICAgZ2xvYmFsIHNyY2RpciBzdWJkaXIKLSAgICBzZXQgdGVzdG5hbWUgInZ0YWJsZSAkbmFtZSIKLSAgICBzZXQgZmlsZSAkc3JjZGlyLyRzdWJkaXIvJG5hbWUKLSAgICBnYXNfcnVuICR7bmFtZX0ucyAkb3B0cyAiPiZkdW1wLm91dCIKLSAgICBpZiB7IFtyZWdleHBfZGlmZiAiZHVtcC5vdXQiICIke2ZpbGV9LmwiXSB9IHRoZW4gewotCWZhaWwgJHRlc3RuYW1lCi0JdmVyYm9zZSAib3V0cHV0IGlzIFtmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdIiAyCi0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLSMgVnRhYmxlIGJpdHMgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5IEVMRiB0YXJnZXRzLgotaWYgeyAoW2lzdGFyZ2V0ICIqLSotZWxmKiJdCQkKLSAgICAgIHx8IFtpc3RhcmdldCAiKi0qLWxpbnV4KiJdKQotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCphb3V0Kl0KLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqb2xkbGQqXSB9IHRoZW4gewotCi0gICAgIyBub3Qgc3VwcG9ydGVkIGJ5IEQzMFYKLSAgICBpZiB7W2lzdGFyZ2V0ICJkMzB2LSotKiJdfSB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICAjIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IGk5NjAKLSAgICBpZiB7W2lzdGFyZ2V0ICJpOTYwLSotKiJdfSB7Ci0gICAgICByZXR1cm4KLSAgICB9Ci0KLSAgICBydW5fZHVtcF90ZXN0ICJpbmhlcml0MCIgCi0gICAgcnVuX2xpc3RfdGVzdCAiaW5oZXJpdDEiICItYWwiCi0KLSAgICAjIFRoZSB2dGFibGUgZW50cnkgcmVzdWx0cyBhcmUgZGlmZmVyZW50IG9uIFJlbCBhbmQgUmVsYSB0YXJnZXRzLgotICAgIGlmIHtbaXN0YXJnZXQgImkqODYtKi0qIl0gfHwgW2lzdGFyZ2V0ICJtaXBzKi0qLSoiXX0gdGhlbiB7Ci0KLQlydW5fZHVtcF90ZXN0ICJlbnRyeTAiCi0KLSAgICB9IGVsc2UgewotCi0JcnVuX2R1bXBfdGVzdCAiZW50cnkxIgotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMxLkgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzczMjMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzEuSAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotRklMRSAxIEZJUlNUIExJTkUKLQkuSU5DTFVERQkiSU5DMi5IIgotRklMRSAxIExBU1QgTElORQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzIuSCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9JTkMyLkgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2MzZGMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL0lOQzIuSAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCUZJTEUgMiBGSVJTVCBMSU5FCi0JRklMRSAyIExBU1QgTElORQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2NjcxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotZm9vOgkuQVNTSUdOQwkiaGVsbG8iCi1CQVI6CS5BU1NJR05BCTEyKzM0Ci0KLQlcJmZvbydmb28KLQlcJmZvb1wmZm9vXCZmb28gCi0JXCZmb28gXCZmb28gXCZmb28gCi0JXCZCQVJcJmJhclwmQkFSCi0KLQotCi0JCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2Fzc2lnbi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzNzMzZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLmVycgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFzc2lnbi5hc206OCBDYW4ndCBmaW5kIHByZXByb2Nlc3NvciB2YXJpYWJsZSBiYXIuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvYXNzaWduLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24ub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTUwOWFlLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9hc3NpZ24ub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIQotCi0hZm9vOgkuQVNTSUdOQwkiaGVsbG8iCi0hQkFSOgkuQVNTSUdOQQkxMiszNAotIQotCi0hCVwmZm9vJ2ZvbwotCWhlbGxvZm9vCi0hCVwmZm9vXCZmb29cJmZvbyAKLQloZWxsb2hlbGxvaGVsbG8gCi0hCVwmZm9vIFwmZm9vIFwmZm9vIAotCWhlbGxvIGhlbGxvIGhlbGxvIAotIQlcJkJBUlwmYmFyXCZCQVIKLQk0NjQ2Ci0hCi0KLSEKLQotIQotCi0hCQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiZDlmMDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3MuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkxIEVRIDIKLQlCQUQKLQkuQUVMU0UKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAyCi0JQkFECi0JLkFFTFNFCi0JT0sKLQkuQUlGCTEgRVEgMgotCUJBRAotCS5BRUxTRQotCU9LCi0JLkFFTkRJCi0JLkFFTkRJCi0JLkFJRgkxIExUICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgTkUgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBMRSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEdUICAyCi0JQkFECi0JLkFFTkRJCi0JLkFJRgkzIEdFICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTMgTFQgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTMgRVEgIDIKLQlCQUQgCi0JLkFFTkRJCi0JLkFJRgkzIE5FICAyCi0JT0sKLQkuQUVOREkKLQkuQUlGCTMgTEUgIDIKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTMgR1QgIDIKLQlPSwotCS5BRU5ESQotCS5BSUYJMyBHRSAgMgotCU9LCi0JLkFFTkRJCi0JLkFJRgkiRk9PIiBFUSAiQkFSIgotCUJBRAotCS5BRU5ESQotCS5BSUYJIkZPTyIgRVEgIkZPTyIKLQlPSwotCS5BRU5ESQotCS5BSUYJIkZPTyIgTkUgIkJBUiIKLQlPSwotCS5BRU5ESQotCS5BSUYJIkZPTyIgRVEgIkZPTyIKLQlPSwotCS5BRU5ESQotCS5BSUYJMSBFUSAxCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFFTFNFCQotCUJBRAotCS5BRU5ESQotCS5BSUYJMSBFUSAwCi0JQkFECi0JLkFFTFNFCQotCU9LCi0JLkFFTkRJCi0JT0sKLQkuQUVOREkKLQkuQUlGCTEgRVEgMQotCU9LCi0JLkFJRgkxIEVRIDEKLQlPSwotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCS5BRUxTRQkKLQlCQUQKLQkuQUVOREkKLQkuQUlGCTEgRVEgMAotCUJBRAotCS5BRUxTRQkKLQlPSwotCS5BRU5ESQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY29uZGFzcy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NvbmRhc3Mub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVjZWY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jb25kYXNzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0hCS5BSUYJMSBFUSAxCi0hCU9LCi0JT0sKLSEJLkFFTFNFCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDIKLSEJQkFECi0hCS5BRUxTRQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMgotIQlCQUQKLSEJLkFFTFNFCi0hCU9LCi0JT0sKLSEJLkFJRgkxIEVRIDIKLSEJQkFECi0hCS5BRUxTRQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUVOREkKLSEJLkFJRgkxIExUICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMSBFUSAgMgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMSBORSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCTEgTEUgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEdUICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkzIEdFICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMyBMVCAgMgotIQlCQUQKLSEJLkFFTkRJCi0hCS5BSUYJMyBFUSAgMgotIQlCQUQgCi0hCS5BRU5ESQotIQkuQUlGCTMgTkUgIDIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkzIExFICAyCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkzIEdUICAyCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJMyBHRSAgMgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIEVRICJCQVIiCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkiRk9PIiBFUSAiRk9PIgotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUlGCSJGT08iIE5FICJCQVIiCi0hCU9LCi0JT0sKLSEJLkFFTkRJCi0hCS5BSUYJIkZPTyIgRVEgIkZPTyIKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDEKLSEJT0sKLQlPSwotIQkuQUlGCTEgRVEgMQotIQlPSwotCU9LCi0hCS5BRUxTRQkKLSEJQkFECi0hCS5BRU5ESQotIQkuQUlGCTEgRVEgMAotIQlCQUQKLSEJLkFFTFNFCQotIQlPSwotCU9LCi0hCS5BRU5ESQotIQkuQUVMU0UJCi0hCUJBRAotIQkuQUVOREkKLSEJLkFJRgkxIEVRIDAKLSEJQkFECi0hCS5BRUxTRQkKLSEJT0sKLQlPSwotIQkuQUVOREkKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MTBjYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotCVN0dWZmIHRvIHRyeSBhbmQgY3Jhc2ggaXQKLQotZm9vOgkuTUFDUk8JCi0JSEkKLWJhcjoJLk1BQ1JPCQotCVRIRVJFCi0JYmFyCi0JLkVORE0JCi0KLQotCS5FTkRNCi0JZm9vCi0JZm9vCi0JZm9vCi0JZm9vCi0JZm9vCi0JYmFyCi0KLQotCi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAwODgwMi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2guZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY3Jhc2guYXNtOjE4IFVucmVhc29uYWJsZSBleHBhbnNpb24gKC11IHR1cm5zIG9mZiBjaGVjaykuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5NDhhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzA1OSArMCwwIEBACi0hCi0KLSEJU3R1ZmYgdG8gdHJ5IGFuZCBjcmFzaCBpdAotCVN0dWZmIHRvIHRyeSBhbmQgY3Jhc2ggaXQKLSEKLQotIWZvbzoJLk1BQ1JPCQotIQlISQotIWJhcjoJLk1BQ1JPCQotIQlUSEVSRQotIQliYXIKLSEJLkVORE0JCi0hCi0hCi0hCS5FTkRNCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWZvbwotIQlISQotCUhJCi0hYmFyOgkuTUFDUk8JCi0hCVRIRVJFCi0hCWJhcgotIQkuRU5ETQkKLSEKLQotIQotCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgotIQlUSEVSRQotCVRIRVJFCi0hCWJhcgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiNmIzMC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotCi0JLk1BQ1JPIAlmb28gYSBiIGM9YQotCVxhIFxiIFxjIFxkCi0JLkVORE0KLQotCWZvbyAxIDIKLQlmb28gMSAyIDMgNAotCWZvbyAxCi0JZm9vIAotCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gxLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNWQwNzguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0hCi0KLSEKLQotIQkuTUFDUk8gCWZvbyBhIGIgYz1hCi0hCVxhIFxiIFxjIFxkCi0hCS5FTkRNCi0hCi0KLSEJZm9vIDEgMgotIQkxIDIgYSBcZAotCTEgMiBhIFxkCi0hCWZvbyAxIDIgMyA0Ci0hCWZvbyAxCi0hCTEgIGEgXGQKLQkxICBhIFxkCi0hCWZvbyAKLSEJICBhIFxkCi0JYSBcZAotIQotCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4YTAwMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQotZm9vOgkuQVNTSUdOQQkxCi0JXCZmb28rMQkKLQlcJmZvbysxCi1mb286CS5BU1NJR05DCSJmb28iCi0JXCZmb28rMQotCVwmZm9vKzEKLQlmb28KLQlmb28JZm9vCi0JZm9vCWZvbwotCWZvbwotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2NyYXNoMi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvY3Jhc2gyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDFhMmY3Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9jcmFzaDIub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEKLQotIWZvbzoJLkFTU0lHTkEJMQotIQlcJmZvbysxCQotCTErMQkKLSEJXCZmb28rMQotCTErMQotIWZvbzoJLkFTU0lHTkMJImZvbyIKLSEJXCZmb28rMQotCWZvbysxCi0hCVwmZm9vKzEKLQlmb28rMQotIQotCi0hZm9vOgkuQVNTSUdOQQkxCi0hCVwmZm9vKzEJCi0JMSsxCQotIQlcJmZvbysxCi0JMSsxCi0hZm9vOgkuQVNTSUdOQwkiZm9vIgotIQlcJmZvbysxCi0JZm9vKzEKLSEJXCZmb28rMQotCWZvbysxCi0hCi0KLSFmb286CS5BU1NJR05BCTEKLSEJXCZmb28rMQkKLQkxKzEJCi0hCVwmZm9vKzEKLQkxKzEKLSFmb286CS5BU1NJR05DCSJmb28iCi0hCVwmZm9vKzEKLQlmb28rMQotIQlcJmZvbysxCi0JZm9vKzEKLSEJZm9vCi0JZm9vCi0hCWZvbwlmb28KLQlmb28JZm9vCi0hCWZvbwlmb28KLQlmb28JZm9vCi0hCWZvbwotCWZvbwotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNmIwYTAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotCi1mb28JLkRBVEEJMSwyLDMKLWJhcgkuREFUQQkxLDIsMyw0LDUgLDYKLQkuREFUQS5CCTEyMzQ1LDEyLDIKLQkuREFUQS5XIDksMiwxMiwzLDEzKzQxLGZvbys5Ci0JLkRBVEEuTCAyfjk5Ci0KLQotCi0JLkRBVEFCCTEsMiwzCi0JLkRBVEFCCTEsMiwzCi0KLQotCi0KLQkuREFUQUIJMSw5KzMyCi0KLQkuREFUQUIuTAkxLEgnMTExMTExMTEKLQkuREFUQUIuVwkyLEgnMjIyMgotCS5EQVRBQi5CCTMsSCczMzMKLQotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9kYXRhLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZGF0YS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmUxZTUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2RhdGEub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIQotCi0hZm9vCS5EQVRBCTEsMiwzCi1mb286CS5sb25nCTEsMiwzCi0hYmFyCS5EQVRBCTEsMiwzLDQsNSAsNgotYmFyOgkubG9uZwkxLDIsMyw0LDUsNgotIQkuREFUQS5CCTEyMzQ1LDEyLDIKLQkuYnl0ZQkxMjM0NSwxMiwyCi0hCS5EQVRBLlcgOSwyLDEyLDMsMTMrNDEsZm9vKzkKLQkuc2hvcnQJOSwyLDEyLDMsNTQsZm9vKzkKLSEJLkRBVEEuTCAyfjk5Ci0JLmxvbmcJOTcKLSEKLQotIQotCi0hCi0KLSEJLkRBVEFCCTEsMiwzCi0JLmZpbGwJMSw0LDIKLSEJLkRBVEFCCTEsMiwzCi0JLmZpbGwJMSw0LDIKLSEKLQotIQotCi0hCi0KLSEKLQotIQkuREFUQUIJMSw5KzMyCi0JLmZpbGwJMSw0LDQxCi0hCi0KLSEJLkRBVEFCLkwJMSxIJzExMTExMTExCi0JLmZpbGwJMSw0LDI4NjMzMTE1MwotIQkuREFUQUIuVwkyLEgnMjIyMgotCS5maWxsCTIsMiw4NzM4Ci0hCS5EQVRBQi5CCTMsSCczMzMKLQkuZmlsbAkzLDEsODE5Ci0hCi0KLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDE2MDhhLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotCi07IHRlc3QgYWxsIG9wcwotCi1hMQkuRVFVCTQrMTAKLWEyCS5FUVUJNC0xMAotYTMJLkVRVQk0JjEwCi1hNAkuRVFVCTR8MgotYTUJLkVRVQk0fjIKLWE2CS5FUVUJNCoxMAotYTcJLkVRVQk0MC8xMAotYTgJLkVRVQkrNwotYTkJLkVRVQktNwotYTEwCS5FUVUJfjcKLQotCi0JYTEgYTIgYTMgYTQgYTUgYTYgYTcgYTggYTkgYTEwCi0KLTsgdGVzdCB0aGUgcHJpb3JpdGllcwotCi1iMQkuRVFVCTF8Mn4zJjQrNS04KjcvMgotYjIJLkVRVQkoMXwyfigzJig0KzUtKDgqKDcvMikpKSkpCi1iMwkuRVFVCTEwKjIvMyo0Ci1iNAkuRVFVCSgoKDEwKjIpLzMpKjQpCi1iNQkuRVFVCTEwKzItMys0Ci1iNgkuRVFVCSgoKDEwKzIpLTMpKzQpCi0KLQliMSBiMiBiMyBiNAotCi07IHRlc3QgYXNzb2NpYXRpb24KLQotYzEJLkVRVQktfjMKLWMyCS5FUVUJfi0zCi1jMwkuRVFVCS0ofjMpCi1jNAkuRVFVCX4oLTMpCi0KLQljMSBjMiBjMyBjNAotCi07IHRlc3QgcnVsZXMgZm9yIHN5bWJvbHMKLQotb2sxCS5FUVUJRk9PCi1vazIJLkVRVQlGT08rMTAKLW9rMwkuRVFVCTEwK0ZPTwotb2s0CS5FUVUJRk9PLTEwCi0KLQlvazEKLQlvazIgCi0Jb2szIAotCW9rNAotCi1vazUJLkVRVQlGT08rMys0KzUrNgotb2s2CS5FUVUJRk9PLUJBUgotCi0Jb2s1Ci0Jb2s2Ci0KLWJhZDEJLkVRVQlGT08rRk9PCi1iYWQyCS5FUVUJRk9PKjIKLWJhZDMJLkVRVQlGT08vMgotYmFkNAkuRVFVCUZPT3wyCi1iYWQ1CS5FUVUJRk9PJjIKLWJhZDYJLkVRVQlGT09+MgotYmFkNwkuRVFVCUZPTyoyCi0KLTsgdGVzdCBzcGFjaW5nCi0KLXNwYWNlMQkuRVFVCTEgKwkyCSszK0ZPTyArIDMKLXNwYWNlMgotCi07IGZyb20gdGhlIFNIIG1hbnVhbAotCi0JLkRBVEEuTAkxKygyLSgzKyg0LTUpKSksMQotCi0JLkRBVEEuTAktSCdmZmZmZmZmMStIJzAwMDAwMGYwKkgnMDAwMDAwMTB8SCcwMDAwMDBmMCZIJzAwMDBmZmZmLEgnMDAwMDBmZmYKLQotCS5EQVRBLkwJLX4tfkgnMDAwMDAwMGYsSCcwMAotCi0KLQkKLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9leHAuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MWZkNTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWV4cC5hc206NTYgY2FuJ3QgYWRkIHR3byByZWxvY2F0YWJsZSBleHByZXNzaW9ucwotZXhwLmFzbTo1NyB0aGUgKiBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo1OCB0aGUgLyBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo1OSB0aGUgfCBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo2MCB0aGUgJiBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo2MSB0aGUgfiBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgotZXhwLmFzbTo2MiB0aGUgKiBvcGVyYXRvciBjYW5ub3QgdGFrZSBub24tYWJzb2x1dGUgYXJndW1lbnRzLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2V4cC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjYjlhOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZXhwLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0hCi0KLSE7IHRlc3QgYWxsIG9wcwotCTsgdGVzdCBhbGwgb3BzCi0hCi0KLSFhMQkuRVFVCTQrMTAKLSFhMgkuRVFVCTQtMTAKLSFhMwkuRVFVCTQmMTAKLSFhNAkuRVFVCTR8MgotIWE1CS5FUVUJNH4yCi0hYTYJLkVRVQk0KjEwCi0hYTcJLkVRVQk0MC8xMAotIWE4CS5FUVUJKzcKLSFhOQkuRVFVCS03Ci0hYTEwCS5FUVUJfjcKLSEKLQotIQotCi0hCWExIGEyIGEzIGE0IGE1IGE2IGE3IGE4IGE5IGExMAotCTE0IC02IDAgNiA2IDQwIDQgNyAtNyAtOAotIQotCi0hOyB0ZXN0IHRoZSBwcmlvcml0aWVzCi0JOyB0ZXN0IHRoZSBwcmlvcml0aWVzCi0hCi0KLSFiMQkuRVFVCTF8Mn4zJjQrNS04KjcvMgotIWIyCS5FUVUJKDF8Mn4oMyYoNCs1LSg4Kig3LzIpKSkpKQotIWIzCS5FUVUJMTAqMi8zKjQKLSFiNAkuRVFVCSgoKDEwKjIpLzMpKjQpCi0hYjUJLkVRVQkxMCsyLTMrNAotIWI2CS5FUVUJKCgoMTArMiktMykrNCkKLSEKLQotIQliMSBiMiBiMyBiNAotCTIgMiAyNCAyNAotIQotCi0hOyB0ZXN0IGFzc29jaWF0aW9uCi0JOyB0ZXN0IGFzc29jaWF0aW9uCi0hCi0KLSFjMQkuRVFVCS1+MwotIWMyCS5FUVUJfi0zCi0hYzMJLkVRVQktKH4zKQotIWM0CS5FUVUJfigtMykKLSEKLQotIQljMSBjMiBjMyBjNAotCTQgMiA0IDIKLSEKLQotITsgdGVzdCBydWxlcyBmb3Igc3ltYm9scwotCTsgdGVzdCBydWxlcyBmb3Igc3ltYm9scwotIQotCi0hb2sxCS5FUVUJRk9PCi0hb2syCS5FUVUJRk9PKzEwCi0hb2szCS5FUVUJMTArRk9PCi0hb2s0CS5FUVUJRk9PLTEwCi0hCi0KLSEJb2sxCi0JRk9PCi0hCW9rMiAKLQlGT08rMTAgCi0hCW9rMyAKLQlGT08rMTAgCi0hCW9rNAotCUZPTystMTAKLSEKLQotIW9rNQkuRVFVCUZPTyszKzQrNSs2Ci0hb2s2CS5FUVUJRk9PLUJBUgotIQotCi0hCW9rNQotCUZPTysxOAotIQlvazYKLQlGT08tRk9PCi0hCi0KLSFiYWQxCS5FUVUJRk9PK0ZPTwotIWJhZDIJLkVRVQlGT08qMgotIWJhZDMJLkVRVQlGT08vMgotIWJhZDQJLkVRVQlGT098MgotIWJhZDUJLkVRVQlGT08mMgotIWJhZDYJLkVRVQlGT09+MgotIWJhZDcJLkVRVQlGT08qMgotIQotCi0hOyB0ZXN0IHNwYWNpbmcKLQk7IHRlc3Qgc3BhY2luZwotIQotCi0hc3BhY2UxCS5FUVUJMSArCTIJKzMrRk9PICsgMwotIXNwYWNlMgotc3BhY2UyOgotIQotCi0hOyBmcm9tIHRoZSBTSCBtYW51YWwKLQk7IGZyb20gdGhlIFNIIG1hbnVhbAotIQotCi0hCS5EQVRBLkwJMSsoMi0oMysoNC01KSkpLDEKLQkubG9uZwkxLDEKLSEKLQotIQkuREFUQS5MCS1IJ2ZmZmZmZmYxK0gnMDAwMDAwZjAqSCcwMDAwMDAxMHxIJzAwMDAwMGYwJkgnMDAwMGZmZmYsSCcwMDAwMGZmZgotCS5sb25nCTQwOTUsNDA5NQotIQotCi0hCS5EQVRBLkwJLX4tfkgnMDAwMDAwMGYsSCcwMAotCS5sb25nCTE3LDAKLSEKLQotIQotCi0hCQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9nYXNwLmV4cCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9nYXNwLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3MmE2ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvZ2FzcC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIFRlc3QgZ2FzcC4KLQotcHJvYyBnYXNwX3Rlc3QgeyBmaWxlbmFtZSB0ZXN0bmFtZSBvcHQgfSAgewotICAgIGdsb2JhbCBHQVNQCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNlbmRfbG9nICIkc3JjZGlyL2xpYi9ydW4gJEdBU1AgLUkkc3JjZGlyL2dhc3AgLXMgJG9wdCAkZmlsZW5hbWUuYXNtIC1vIGdhc3Aub3V0XG4iCi0gICAgY2F0Y2ggImV4ZWMgJHNyY2Rpci9saWIvcnVuICRHQVNQIC1JJHNyY2Rpci9nYXNwIC1zICRvcHQgJGZpbGVuYW1lLmFzbSAtbyBnYXNwLm91dCIgZXJycwotICAgIGNhdGNoICJleGVjIGRpZmYgZ2FzcC5vdXQgJGZpbGVuYW1lLm91dCIgZGlmZnMKLSAgICBzZXQgZGlmZnMgW3BydW5lX3dhcm5pbmdzICRkaWZmc10KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZGlmZnNdIHsKLQlzZW5kX2xvZyAiJGRpZmZzXG4iCi0JdmVyYm9zZSAkZGlmZnMKLQlmYWlsICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0KLQotfQotCi1mb3JlYWNoIHNyYyBbIGxzb3J0IFsgZ2xvYiAkc3JjZGlyL2dhc3AvKi5hc20gXSBdIHsKLSAgICByZWdzdWIgLWFsbCAiLmFzbSIgJHNyYyAiIiB0Ci0gICAgcmVnc3ViICJeLiovKFxbXi9cXSopJCIgJHQgImdhc3AgXFwxIiB0ZXN0bmFtZQotICAgIGdhc3BfdGVzdCAkdCAkdGVzdG5hbWUgIiIKLX0KLQotZm9yZWFjaCBzcmMgWyBsc29ydCBbIGdsb2IgJHNyY2Rpci9nYXNwL21yaS8qLmFzbSBdIF0gewotICAgIHJlZ3N1YiAtYWxsICIuYXNtIiAkc3JjICIiIHQKLSAgICByZWdzdWIgIl4uKi8oXFteL1xdKikkIiAkdCAiZ2FzcCBNUkkgXFwxIiB0ZXN0bmFtZQotICAgIGdhc3BfdGVzdCAkdCAkdGVzdG5hbWUgIi1NIgotfQotCi0jIEZJWE1FOiB0aGlzIGlzIGhlcmUgY2F1c2Ugb2YgYSBidWcgaW4gRGVqYUdudSAxLjEuMS4gV2hlbiBpdCBpcyBubyBsb25nZXIKLSMgICAgICAgIGluIHVzZSwgdGhlbiB0aGlzIGNhbiBiZSByZW1vdmVkLgotaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgdW5zZXQgZXJyb3JJbmZvCi19Ci0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllZDFkZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQlISQotCS5JTkNMVURFCSJJTkMxLkgiCi0JVEhFUkUKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2luY2x1ZGUuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9pbmNsdWRlLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3YTBkZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvaW5jbHVkZS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0hCUhJCi0JSEkKLSEJLklOQ0xVREUJIklOQzEuSCIKLSFGSUxFIDEgRklSU1QgTElORQotRklMRToJMSBGSVJTVCBMSU5FCi0hCS5JTkNMVURFCSJJTkMyLkgiCi0hCUZJTEUgMiBGSVJTVCBMSU5FCi0JRklMRSAyIEZJUlNUIExJTkUKLSEJRklMRSAyIExBU1QgTElORQotCUZJTEUgMiBMQVNUIExJTkUKLSFGSUxFIDEgTEFTVCBMSU5FCi1GSUxFOgkxIExBU1QgTElORQotIQlUSEVSRQotCVRIRVJFCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxNGNmYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0KLQotCS5IRUFESU5HCSIgIiJRVU9URSIiICIKLQkuUEFHRQotCS5QUklOVCBMSVNUCi0JZm9vCQkKLQkuUFJJTlQgTk9MSVNUCi0JZm9vCi0KLQotCS5GT1JNCUxJTj0xMgotCS5GT1JNCUNPTD05MAotCS5GT1JNCUxJTj0xMjMgQ09MPTIzCi0JCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3RpbmcuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9saXN0aW5nLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbGlzdGluZy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NWJkYTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL2xpc3Rpbmcub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotIQotCi0hCi0KLSEJLkhFQURJTkcJIiAiIlFVT1RFIiIgIgotCS50aXRsZQkiICJRVU9URSIgIgotIQkuUEFHRQotCS5lamVjdAotIQkuUFJJTlQgTElTVAotCS5saXN0Ci0hCWZvbwkJCi0JZm9vCQkKLSEJLlBSSU5UIE5PTElTVAotCS5ub2xpc3QKLSEJZm9vCi0JZm9vCi0hCi0KLSEKLQotIQkuRk9STQlMSU49MTIKLQkucHNpemUgMTIsMTMyCi0hCS5GT1JNCUNPTD05MAotCS5wc2l6ZSA2MCw5MAotIQkuRk9STQlMSU49MTIzIENPTD0yMwotCS5wc2l6ZSAxMjMsMjMKLSEJCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmIxNmJmLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotCS5NQUNSTwlTVU0gRlJPTT0wLCBUTz05Ci0JOyBcRlJPTSBcVE8KLQlNT1YJUlxGUk9NLFIxMAotQ09VTlQJLkFTU0lHTkEJXEZST00rMQotCS5BV0hJTEUJXCZDT1VOVCBMRSBcVE8KLQlNT1YJUlwmQ09VTlQsUjEwCi1DT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLQkuQUVORFcKLQkuRU5ETQotCi0JU1VNIDAsNQotCVNVTSAJVE89NQotCVNVTSAJRlJPTT0yLCBUTz01Ci0KLQotOyBoaSB0aGlzIGlzIGEgY29tbWVudAotCS5NQUNSTwlCQUNLX1NMQVNIX1NFVAotCVwoTU9WCSMiXCIsUjApIAotCS5FTkRNCi0JQkFDS19TTEFTSF9TRVQKLQkuTUFDUk8JQ09NTQotCWJhcgk7IHRoaXMgY29tbWVudCB3aWxsIGdldCBjb3BpZWQgb3V0Ci0JZm9vCVw7IHRoaXMgb25lIHdpbGwgZ2V0IGRyb3BwZWQKLQkuRU5ETQotCUNPTU0KLQlCQUNLX1NMQVNIX1NFVAotCS5NQUNSTwlQTFVTMgotCUFERAkjMSxSXCZWMQotCS5TREFUQQkiXCZWJzEiCi0JLkVORE0KLVYJLkFTU0lHTkMJIlIiCi1WMQkuQVNTSUdOQQkxCi0JUExVUzIKLQkuTUFDUk8JUExVUzEJUCxQMQotCUFERAkjMSxcUDEKLQkuU0RBVEEJIlxQJzEiCi0JLkVORE0KLQlQTFVTMQlSLFIxCi0KLQkuTUFDUk8JU1VNIFAxCi0JTU9WCVIwLFIxMAotCUFERAlSMSxSMTAKLQlBREQJUjIsUjEwCi0JXFAxCQotCUFERAlSMyxSMTAKLQkuRU5ETQotCi0JU1VNCS5FWElUTQotCi0JLk1BQ1JPIGZvbyBiYXI9YSBkZWZhdWx0PWIKLQlcYmFyCi0JXGRlZmF1bHQKLQliYXIKLQlkZWZhdWx0Ci0JLkVORE0KLQlmb28gZGVmYXVsdD1kb2cgYmFyPWNhdAotCWZvbyBYIFkKLQlmb28KLQlmb28gYmFyPWNhdCBkZWZhdWx0PWRvZwotCi0KLQkuTUFDUk8JZm9vIGJhcgotCUhJCi0JSEkgXGJhcgotCUhJCi0JLkVORE0KLQotCWZvbyAxCi0JZm9vIDEyMwotCWZvbyAxIDIgMyA0Ci0JZm9vCi0KLQkKLQkuTUFDUk8JUFVTSCBSbgotCU1PVi5MCVxSbixALXIxNQotCS5FTkRNCi0JUFVTSAlSMAotCVBVU0gJUjEKLQotCi0JLk1BQ1JPCVJFU19TVFIgU1RSLCBSbgotCU1PVi5MCSNzdHJcQCxcUm4KLQlCUkEJZW5kX3N0clxACi0JTk9QCi1zdHJcQAkuU0RBVEEgIlxTVFIiCi0JLkFMSUdOCTIKLWVuZF9zdHJcQAotCS5FTkRNCi0JCi0JUkVTX1NUUgkiT05FIixSMAkKLQlSRVNfU1RSCSJUV08iLFIxCi0JUkVTX1NUUgkiVEhSRUUiLFIyCi0KLQotCi0JUkVTX1NUUiBTVFI9ZG9ua2V5IFJuPVIxCi0JUkVTX1NUUiBkb25rZXksUjEKLSAJUkVTX1NUUiBkb25rZXkgUm49UjEKLQkuRU5ECi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21hY3JvLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8uZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWFjcm8ub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQwNzMyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tYWNyby5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotIQkuTUFDUk8JU1VNIEZST009MCwgVE89OQotIQk7IFxGUk9NIFxUTwotIQlNT1YJUlxGUk9NLFIxMAotIUNPVU5UCS5BU1NJR05BCVxGUk9NKzEKLSEJLkFXSElMRQlcJkNPVU5UIExFIFxUTwotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQkuRU5ETQotIQotCi0hCVNVTSAwLDUKLSEJOyAwIDUKLQk7IDAgNQotIQlNT1YJUjAsUjEwCi0JTU9WCVIwLFIxMAotIUNPVU5UCS5BU1NJR05BCTArMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIxLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIyLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIzLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI0LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI1LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlTVU0gCVRPPTUKLSEJOyAwIDUKLQk7IDAgNQotIQlNT1YJUjAsUjEwCi0JTU9WCVIwLFIxMAotIUNPVU5UCS5BU1NJR05BCTArMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIxLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIyLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVIzLFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI0LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlNT1YJUlwmQ09VTlQsUjEwCi0JTU9WCVI1LFIxMAotIUNPVU5UCS5BU1NJR05BCVwmQ09VTlQrMQotIQkuQVdISUxFCVwmQ09VTlQgTEUgNQotIQlNT1YJUlwmQ09VTlQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BRU5EVwotIQlTVU0gCUZST009MiwgVE89NQotIQk7IDIgNQotCTsgMiA1Ci0hCU1PVglSMixSMTAKLQlNT1YJUjIsUjEwCi0hQ09VTlQJLkFTU0lHTkEJMisxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjMsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjQsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCU1PVglSXCZDT1VOVCxSMTAKLQlNT1YJUjUsUjEwCi0hQ09VTlQJLkFTU0lHTkEJXCZDT1VOVCsxCi0hCS5BV0hJTEUJXCZDT1VOVCBMRSA1Ci0hCU1PVglSXCZDT1VOVCxSMTAKLSFDT1VOVAkuQVNTSUdOQQlcJkNPVU5UKzEKLSEJLkFFTkRXCi0hCi0KLSEKLQotITsgaGkgdGhpcyBpcyBhIGNvbW1lbnQKLQk7IGhpIHRoaXMgaXMgYSBjb21tZW50Ci0hCS5NQUNSTwlCQUNLX1NMQVNIX1NFVAotIQlcKE1PVgkjIlwiLFIwKSAKLSEJLkVORE0KLSEJQkFDS19TTEFTSF9TRVQKLSEJTU9WCSMiXCIsUjAgCi0JTU9WCSMiXCIsUjAgCi0hCS5NQUNSTwlDT01NCi0hCWJhcgk7IHRoaXMgY29tbWVudCB3aWxsIGdldCBjb3BpZWQgb3V0Ci0hCWZvbwlcOyB0aGlzIG9uZSB3aWxsIGdldCBkcm9wcGVkCi0hCS5FTkRNCi0hCUNPTU0KLSEJYmFyCTsgdGhpcyBjb21tZW50IHdpbGwgZ2V0IGNvcGllZCBvdXQKLQliYXIJOyB0aGlzIGNvbW1lbnQgd2lsbCBnZXQgY29waWVkIG91dAotIQlmb28JXDsgdGhpcyBvbmUgd2lsbCBnZXQgZHJvcHBlZAotCWZvbwlcOyB0aGlzIG9uZSB3aWxsIGdldCBkcm9wcGVkCi0hCUJBQ0tfU0xBU0hfU0VUCi0hCU1PVgkjIlwiLFIwIAotCU1PVgkjIlwiLFIwIAotIQkuTUFDUk8JUExVUzIKLSEJQURECSMxLFJcJlYxCi0hCS5TREFUQQkiXCZWJzEiCi0hCS5FTkRNCi0hVgkuQVNTSUdOQwkiUiIKLSFWMQkuQVNTSUdOQQkxCi0hCVBMVVMyCi0hCUFERAkjMSxSXCZWMQotCUFERAkjMSxSMQotIQkuU0RBVEEJIlwmVicxIgotCS5ieXRlCTgyLDQ5Ci0hCS5NQUNSTwlQTFVTMQlQLFAxCi0hCUFERAkjMSxcUDEKLSEJLlNEQVRBCSJcUCcxIgotIQkuRU5ETQotIQlQTFVTMQlSLFIxCi0hCUFERAkjMSxSMQotCUFERAkjMSxSMQotIQkuU0RBVEEJIlIxIgotCS5ieXRlCTgyLDQ5Ci0hCi0KLSEJLk1BQ1JPCVNVTSBQMQotIQlNT1YJUjAsUjEwCi0hCUFERAlSMSxSMTAKLSEJQURECVIyLFIxMAotIQlcUDEJCi0hCUFERAlSMyxSMTAKLSEJLkVORE0KLSEKLQotIQlTVU0JLkVYSVRNCi0hCU1PVglSMCxSMTAKLQlNT1YJUjAsUjEwCi0hCUFERAlSMSxSMTAKLQlBREQJUjEsUjEwCi0hCUFERAlSMixSMTAKLQlBREQJUjIsUjEwCi0hCS5FWElUTQkKLSEKLQotIQkuTUFDUk8gZm9vIGJhcj1hIGRlZmF1bHQ9YgotIQlcYmFyCi0hCVxkZWZhdWx0Ci0hCWJhcgotIQlkZWZhdWx0Ci0hCS5FTkRNCi0hCWZvbyBkZWZhdWx0PWRvZyBiYXI9Y2F0Ci0hCWNhdAotCWNhdAotIQlkb2cKLQlkb2cKLSEJYmFyCi0JYmFyCi0hCWRlZmF1bHQKLQlkZWZhdWx0Ci0hCWZvbyBYIFkKLSEJWAotCVgKLSEJWQotCVkKLSEJYmFyCi0JYmFyCi0hCWRlZmF1bHQKLQlkZWZhdWx0Ci0hCWZvbwotIQlhCi0JYQotIQliCi0JYgotIQliYXIKLQliYXIKLSEJZGVmYXVsdAotCWRlZmF1bHQKLSEJZm9vIGJhcj1jYXQgZGVmYXVsdD1kb2cKLSEJY2F0Ci0JY2F0Ci0hCWRvZwotCWRvZwotIQliYXIKLQliYXIKLSEJZGVmYXVsdAotCWRlZmF1bHQKLSEKLQotIQotCi0hCS5NQUNSTwlmb28gYmFyCi0hCUhJCi0hCUhJIFxiYXIKLSEJSEkKLSEJLkVORE0KLSEKLQotIQlmb28gMQotIQlISQotCUhJCi0hCUhJIDEKLQlISSAxCi0hCUhJCi0JSEkKLSEJZm9vIDEyMwotIQlISQotCUhJCi0hCUhJIDEyMwotCUhJIDEyMwotIQlISQotCUhJCi0hCWZvbyAxIDIgMyA0Ci0hCWZvbwotIQlISQotCUhJCi0hCUhJIAotCUhJIAotIQlISQotCUhJCi0hCi0KLSEJCi0hCS5NQUNSTwlQVVNIIFJuCi0hCU1PVi5MCVxSbixALXIxNQotIQkuRU5ETQotIQlQVVNICVIwCi0hCU1PVi5MCVIwLEAtcjE1Ci0JTU9WLkwJUjAsQC1yMTUKLSEJUFVTSAlSMQotIQlNT1YuTAlSMSxALXIxNQotCU1PVi5MCVIxLEAtcjE1Ci0hCi0KLSEKLQotIQkuTUFDUk8JUkVTX1NUUiBTVFIsIFJuCi0hCU1PVi5MCSNzdHJcQCxcUm4KLSEJQlJBCWVuZF9zdHJcQAotIQlOT1AKLSFzdHJcQAkuU0RBVEEgIlxTVFIiCi0hCS5BTElHTgkyCi0hZW5kX3N0clxACi0hCS5FTkRNCi0hCQotIQlSRVNfU1RSCSJPTkUiLFIwCQotIQlNT1YuTAkjc3RyMDAwMTgsUjAKLQlNT1YuTAkjc3RyMDAwMTgsUjAKLSEJQlJBCWVuZF9zdHIwMDAxOAotCUJSQQllbmRfc3RyMDAwMTgKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMTgJLlNEQVRBICJPTkUiCi1zdHIwMDAxODoJLmJ5dGUJNzksNzgsNjkKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAxOAotZW5kX3N0cjAwMDE4OgotIQlSRVNfU1RSCSJUV08iLFIxCi0hCU1PVi5MCSNzdHIwMDAxOSxSMQotCU1PVi5MCSNzdHIwMDAxOSxSMQotIQlCUkEJZW5kX3N0cjAwMDE5Ci0JQlJBCWVuZF9zdHIwMDAxOQotIQlOT1AKLQlOT1AKLSFzdHIwMDAxOQkuU0RBVEEgIlRXTyIKLXN0cjAwMDE5OgkuYnl0ZQk4NCw4Nyw3OQotIQkuQUxJR04JMgotCS5hbGlnbgkyCi0hZW5kX3N0cjAwMDE5Ci1lbmRfc3RyMDAwMTk6Ci0hCVJFU19TVFIJIlRIUkVFIixSMgotIQlNT1YuTAkjc3RyMDAwMjAsUjIKLQlNT1YuTAkjc3RyMDAwMjAsUjIKLSEJQlJBCWVuZF9zdHIwMDAyMAotCUJSQQllbmRfc3RyMDAwMjAKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMjAJLlNEQVRBICJUSFJFRSIKLXN0cjAwMDIwOgkuYnl0ZQk4NCw3Miw4Miw2OSw2OQotIQkuQUxJR04JMgotCS5hbGlnbgkyCi0hZW5kX3N0cjAwMDIwCi1lbmRfc3RyMDAwMjA6Ci0hCi0KLSEKLQotIQotCi0hCVJFU19TVFIgU1RSPWRvbmtleSBSbj1SMQotIQlNT1YuTAkjc3RyMDAwMjEsUjEKLQlNT1YuTAkjc3RyMDAwMjEsUjEKLSEJQlJBCWVuZF9zdHIwMDAyMQotCUJSQQllbmRfc3RyMDAwMjEKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMjEJLlNEQVRBICJkb25rZXkiCi1zdHIwMDAyMToJLmJ5dGUJMTAwLDExMSwxMTAsMTA3LDEwMSwxMjEKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAyMQotZW5kX3N0cjAwMDIxOgotIQlSRVNfU1RSIGRvbmtleSxSMQotIQlNT1YuTAkjc3RyMDAwMjIsUjEKLQlNT1YuTAkjc3RyMDAwMjIsUjEKLSEJQlJBCWVuZF9zdHIwMDAyMgotCUJSQQllbmRfc3RyMDAwMjIKLSEJTk9QCi0JTk9QCi0hc3RyMDAwMjIJLlNEQVRBICJkb25rZXkiCi1zdHIwMDAyMjoJLmJ5dGUJMTAwLDExMSwxMTAsMTA3LDEwMSwxMjEKLSEJLkFMSUdOCTIKLQkuYWxpZ24JMgotIWVuZF9zdHIwMDAyMgotZW5kX3N0cjAwMDIyOgotISAJUkVTX1NUUiBkb25rZXkgUm49UjEKLSEJTU9WLkwJI3N0cjAwMDIzLFIxCi0JTU9WLkwJI3N0cjAwMDIzLFIxCi0hCUJSQQllbmRfc3RyMDAwMjMKLQlCUkEJZW5kX3N0cjAwMDIzCi0hCU5PUAotCU5PUAotIXN0cjAwMDIzCS5TREFUQSAiZG9ua2V5Igotc3RyMDAwMjM6CS5ieXRlCTEwMCwxMTEsMTEwLDEwNywxMDEsMTIxCi0hCS5BTElHTgkyCi0JLmFsaWduCTIKLSFlbmRfc3RyMDAwMjMKLWVuZF9zdHIwMDAyMzoKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmI3N2I0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLQotCS5NQUNSTwlISQotCUEKLQlcISB0aGlzIGlzIGhpZGRlbgotCUIKLQkhIHRoaXMgaXMgbm90Ci0JQwotCS5FTkRNCi0JSGVsbG8gCi0JSEkKLQlFbWlseQotCQotCi0JSCcwZgotCTIwMCtIJzBGCi0KLVhYCS5BU1NJR05BCVEnMTAwCi0hIERlZmluaXRpb246Ci0JLk1BQ1JPCUdFVCBYPTEwMCxZLFoKLQlNT1YJI1xYK0gnMEYsQEIKLQlcWQotXFoJSk1QCUBNQUlOCi1MXEAJQUREIAkjMSxASEwKLQlNT1YJIzAsQEMJXCEgQ2xlYXIgQwotCUFERAkjMixAQwotCUFERAkjXCZYWCwgQEMKLQkuRU5ETQotCi0JTk9QCi0KLSFDYWxsOgkKLQlHRVQJMjAwLCJBREQgIzEsQEIiLCBFTlRSWQotCS5FTkQKLQotCTsgRGVmaW5pdGlvbjoKLQotCi0JTk9QCi0KLQk7Q2FsbDoJCi0JTU9WCSMyMDArMEYsQEIKLQlBREQgIzEsQEIKLUVOVFJZOglKTVAJQE1BSU4KLUwwMDAwMDoJQUREIAkjMSxASEwKLQlNT1YJIzAsQEMJCi0JQURECSMyLEBDCi0JQURECSMwLCBAQwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tZG91YmxlLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbWRvdWJsZS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWFkNjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21kb3VibGUub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotIQotCi0hCS5NQUNSTwlISQotIQlBCi0hCVwhIHRoaXMgaXMgaGlkZGVuCi0hCUIKLSEJISB0aGlzIGlzIG5vdAotIQlDCi0hCS5FTkRNCi0hCUhlbGxvIAotCUhlbGxvIAotIQlISQotIQlBCi0JQQotIQkKLSEJQgotCUIKLSEJISB0aGlzIGlzIG5vdAotCSEgdGhpcyBpcyBub3QKLSEJQwotCUMKLSEJRW1pbHkKLQlFbWlseQotIQkKLSEKLQotIQlIJzBmCi0JMTUKLSEJMjAwK0gnMEYKLQkyMDArMTUKLSEKLQotIVhYCS5BU1NJR05BCVEnMTAwCi0hISBEZWZpbml0aW9uOgotCSEgRGVmaW5pdGlvbjoKLSEJLk1BQ1JPCUdFVCBYPTEwMCxZLFoKLSEJTU9WCSNcWCtIJzBGLEBCCi0hCVxZCi0hXFoJSk1QCUBNQUlOCi0hTFxACUFERCAJIzEsQEhMCi0hCU1PVgkjMCxAQwlcISBDbGVhciBDCi0hCUFERAkjMixAQwotIQlBREQJI1wmWFgsIEBDCi0hCS5FTkRNCi0hCi0KLSEJTk9QCi0JTk9QCi0hCi0KLSEhQ2FsbDoJCi0JIUNhbGw6CQotIQlHRVQJMjAwLCJBREQgIzEsQEIiLCBFTlRSWQotIQlNT1YJIzIwMCtIJzBGLEBCCi0JTU9WCSMyMDArMTUsQEIKLSEJQUREICMxLEBCCi0JQUREICMxLEBCCi0hRU5UUlkJSk1QCUBNQUlOCi1FTlRSWToJSk1QCUBNQUlOCi0hTDAwMDAxCUFERCAJIzEsQEhMCi1MMDAwMDE6CUFERCAJIzEsQEhMCi0hCU1PVgkjMCxAQwkKLQlNT1YJIzAsQEMJCi0hCUFERAkjMixAQwotCUFERAkjMixAQwotIQlBREQJI1wmWFgsIEBDCi0JQURECSM2NCwgQEMKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiOGY3OC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2VtYmVkLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotZW1iZWQJbWFjcm8JbGFiZWwKLWFkZHImJmxhYmVsCWRjLmwJbGFiZWwKLQllbmRtCi0KLQllbWJlZAlmb28KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZW1iZWQub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDkyNWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9lbWJlZC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTtlbWJlZAltYWNybwlsYWJlbAotO2FkZHImJmxhYmVsCWRjLmwJbGFiZWwKLTsJZW5kbQotOwotCi07CWVtYmVkCWZvbwotO2FkZHJmb28JZGMubAlmb28KLWFkZHJmb286CWRjLmwJZm9vCi07ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzIyMGM2Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvZXhpc3RzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWV4aXN0cwltYWNybwlhcmcxLGFyZzIKLQlpZm5lCT09YXJnMgotCW1vdmUJYXJnMSxhcmcyCi0JZWxzZWMKLQlwdXNoCWFyZzEKLQllbmRjCi0JZW5kbQotCi0JZXhpc3RzCWZvbyxiYXIKLQlleGlzdHMJZm9vCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2V4aXN0cy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NTMzN2QuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9leGlzdHMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotO2V4aXN0cwltYWNybwlhcmcxLGFyZzIKLTsJaWZuZQk9PWFyZzIKLTsJbW92ZQlhcmcxLGFyZzIKLTsJZWxzZWMKLTsJcHVzaAlhcmcxCi07CWVuZGMKLTsJZW5kbQotOwotCi07CWV4aXN0cwlmb28sYmFyCi07CWlmbmUJLTEKLTsJbW92ZQlmb28sYmFyCi0JbW92ZQlmb28sYmFyCi07CWVsc2VjCi07CXB1c2gJZm9vCi07CWVuZGMKLTsJZXhpc3RzCWZvbwotOwlpZm5lCTAKLTsJbW92ZQlmb28sCi07CWVsc2VjCi07CXB1c2gJZm9vCi0JcHVzaAlmb28KLTsJZW5kYwotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhMjFkOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQlpcnAJcGFyYW0sYXJnMSxhcmcyLGFyZzMKLQlkYy5sCXBhcmFtCi0JZW5kcgotCWVuZAlxdWl0CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDU2MjAuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnAub3V0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi07CWlycAlwYXJhbSxhcmcxLGFyZzIsYXJnMwotOwlkYy5sCXBhcmFtCi07CWVuZHIKLQlkYy5sCWFyZzEKLQlkYy5sCWFyZzIKLQlkYy5sCWFyZzMKLTsJZW5kCXF1aXQKLQllbmQJcXVpdApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvaXJwYy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWQ2ODcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCWlycGMJZHVtbXksMTIzNAotCWRjLmwJZHVtbXkKLQllbmRyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9pcnBjLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmODgyNC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL2lycGMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi07CWlycGMJZHVtbXksMTIzNAotOwlkYy5sCWR1bW15Ci07CWVuZHIKLQlkYy5sCTEKLQlkYy5sCTIKLQlkYy5sCTMKLQlkYy5sCTQKLTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8uYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzExYmQwLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8uYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1nZXQJbWFjcm8JYXJnMSxhcmcyLGFyZzMKLQlkYy5sCWFyZzEKLQlhcmcyCi1hcmczCWRjLmwJXDQKLQltb3ZlLlwwCWQwLGQxCi0JZW5kbQotCi0JZ2V0LmIJMSw8ZGMubCAyPixsYWJlbCxmb3VyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL21hY3JvLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8ub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmVlYjk0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbWFjcm8ub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotO2dldAltYWNybwlhcmcxLGFyZzIsYXJnMwotOwlkYy5sCWFyZzEKLTsJYXJnMgotO2FyZzMJZGMubAlcNAotOwltb3ZlLlwwCWQwLGQxCi07CWVuZG0KLTsKLQotOwlnZXQuYgkxLDxkYy5sIDI+LGxhYmVsLGZvdXIKLTsJZGMubAkxCi0JZGMubAkxCi07CWRjLmwgMgotCWRjLmwgMgotO2xhYmVsCWRjLmwJZm91cgotbGFiZWw6CWRjLmwJZm91cgotOwltb3ZlLmIJZDAsZDEKLQltb3ZlLmIJZDAsZDEKLTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL25hcmcuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE0Yzk0MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL25hcmcuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1sb29wCW1hY3JvCWFyZzEsYXJnMixhcmczCi0JZGMubAlOQVJHCi0JaWZuZQlOQVJHCi0JZGMubAlhcmcxCi0JbG9vcAlhcmcyLGFyZzMKLQllbmRjCi0JZW5kbQotCi0JbG9vcAkxLDIsMwpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvbmFyZy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyM2ViYzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9uYXJnLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTtsb29wCW1hY3JvCWFyZzEsYXJnMixhcmczCi07CWRjLmwJTkFSRwotOwlpZm5lCU5BUkcKLTsJZGMubAlhcmcxCi07CWxvb3AJYXJnMixhcmczCi07CWVuZGMKLTsJZW5kbQotOwotCi07CWxvb3AJMSwyLDMKLTsJZGMubAkzCi0JZGMubAkzCi07CWlmbmUJMwotOwlkYy5sCTEKLQlkYy5sCTEKLTsJbG9vcAkyLDMKLTsJZGMubAkyCi0JZGMubAkyCi07CWlmbmUJMgotOwlkYy5sCTIKLQlkYy5sCTIKLTsJbG9vcAkzLAotOwlkYy5sCTEKLQlkYy5sCTEKLTsJaWZuZQkxCi07CWRjLmwJMwotCWRjLmwJMwotOwlsb29wCSwKLTsJZGMubAkwCi0JZGMubAkwCi07CWlmbmUJMAotOwlkYy5sCQotOwlsb29wCSwKLTsJZW5kYwotOwllbmRjCi07CWVuZGMKLTsJZW5kYwotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTYzYmIyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9tcmkvcmVwdC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQlyZXB0CTMKLQlkYy5sCTEKLQllbmRyCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL21yaS9yZXB0Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE0ZWQ2Yi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvbXJpL3JlcHQub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotOwlyZXB0CTMKLTsJZGMubAkxCi07CWVuZHIKLTsJZGMubAkxCi0JZGMubAkxCi07CVJFUFQJMgotOwlkYy5sCTEKLTsJRU5EUgotOwlkYy5sCTEKLQlkYy5sCTEKLTsJUkVQVAkxCi07CWRjLmwJMQotOwlFTkRSCi07CWRjLmwJMQotCWRjLmwJMQotOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOGJmZGUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0JCi0JLkFMVEVSTkFURQotCi1hbGxvYyAJTUFDUk8gdmFsMSx2YWwyCi0JREIJdmFsMQotCURCIAl2YWwyCi0JRU5ETQotCi0JYWxsb2MJInRoYXQncyIgJ3Nob3cgYml6JwotCWFsbG9jCTAsMQotCWFsbG9jCTAgMQotCWFsbG9jCTAJMQotCWFsbG9jCSwxCi0KLQotCQotCi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwxLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUzMzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDEub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODBmMTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0hCQotIQkuQUxURVJOQVRFCi0hCi0KLSFhbGxvYyAJTUFDUk8gdmFsMSx2YWwyCi0hCURCCXZhbDEKLSEJREIgCXZhbDIKLSEJRU5ETQotIQotCi0hCWFsbG9jCSJ0aGF0J3MiICdzaG93IGJpeicKLSEJREIJInRoYXQncyIKLQkuYnl0ZQkxMTYsMTA0LDk3LDExNiwzOSwxMTUKLSEJREIgCSJzaG93IGJpeiIKLQkuYnl0ZQkxMTUsMTA0LDExMSwxMTksMzIsOTgsMTA1LDEyMgotIQlhbGxvYwkwLDEKLSEJREIJMAotCS5ieXRlCTAKLSEJREIgCTEKLQkuYnl0ZQkxCi0hCWFsbG9jCTAgMQotIQlEQgkwCi0JLmJ5dGUJMAotIQlEQiAJMQotCS5ieXRlCTEKLSEJYWxsb2MJMAkxCi0hCURCCTAKLQkuYnl0ZQkwCi0hCURCIAkxCi0JLmJ5dGUJMQotIQlhbGxvYwksMQotIQlEQgkKLQkuYnl0ZQkKLSEJREIgCTEKLQkuYnl0ZQkxCi0hCi0KLSEKLQotIQkKLSEKLQotIQotCi0hCi0KLSEKLQotIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NzExMzcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0KLQotCS5BTFRFUk5BVEUKLQotCSEgb2sKLQkhISBhbHNvIG9rCi0KLWZvbwlNQUNSTwkKLQkhIHlvdSBjYW4gc2VlIG1lCi0JISEgYnV0IG5vdCBtZQotCSEgeW91IGNhbiBzZWUgbWUKLQkhISBidXQgbm90IG1lCi0JYnV0IHRoaXMgIlNIT1VMRCAhIUJFIE9LIgotCUVORE0KLQotCWZvbwotCi0KLWRlZmluZSAJTUFDUk8JdmFsMSx2YWwyCi0JREIgCXZhbDEJISB0aGlzIGNvbW1lbnQgd2lsbCBzaG93IHVwIAotCURCCXZhbDIJISEgdGhpcyBvbiB3b24ndAotCUVORE0KLQotCWRlZmluZQkwLDEKLQotCi0JRU5ECi0JCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwyLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDIub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYTZmYTMuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0hCi0KLSEKLQotIQkuQUxURVJOQVRFCi0hCi0KLSEJISBvawotCSEgb2sKLSEJISEgYWxzbyBvawotCSEhIGFsc28gb2sKLSEKLQotIWZvbwlNQUNSTwkKLSEJISB5b3UgY2FuIHNlZSBtZQotIQkhISBidXQgbm90IG1lCi0hCSEgeW91IGNhbiBzZWUgbWUKLSEJISEgYnV0IG5vdCBtZQotIQlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCi0hCUVORE0KLSEKLQotIQlmb28KLSEJISB5b3UgY2FuIHNlZSBtZQotCSEgeW91IGNhbiBzZWUgbWUKLSEJCi0hCSEgeW91IGNhbiBzZWUgbWUKLQkhIHlvdSBjYW4gc2VlIG1lCi0hCQotIQlidXQgdGhpcyAiU0hPVUxEICEhQkUgT0siCi0JYnV0IHRoaXMgIlNIT1VMRCAhIUJFIE9LIgotIQotCi0hCi0KLSFkZWZpbmUgCU1BQ1JPCXZhbDEsdmFsMgotIQlEQiAJdmFsMQkhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCi0hCURCCXZhbDIJISEgdGhpcyBvbiB3b24ndAotIQlFTkRNCi0hCi0KLSEJZGVmaW5lCTAsMQotIQlEQiAJMAkhIHRoaXMgY29tbWVudCB3aWxsIHNob3cgdXAgCi0JLmJ5dGUJMCEgdGhpcyBjb21tZW50IHdpbGwgc2hvdyB1cCAKLSEJREIJMQkKLQkuYnl0ZQkxCi0hCi0KLSEKLQotIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzFkY2MuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0JLkFMVEVSTkFURQotCi1mb28JTUFDUk8Jc3RyaW5nCi0JTE9DQUwJbGFiMSwgbGFiMgotbGFiMToJREFUQS5MCWxhYjIKLWxhYjI6CVNEQVRBCXN0cmluZwotCUVORE0KLQotCWZvbwkiQW4gZXhhbXBsZSIKLQlmb28JInVzaW5nIExPQ0FMIgotCi0hIHRlc3Qgb2YgTE9DQUwgZGlyZWN0aXZlCi0KLWNoa19lcnIJTUFDUk8JbGltaXQKLQlMT0NBTAkJc2tpcCAhISBmcm9iCi0JTE9DQUwJCXphcCxkb2csYmFyZgotYmFyZjoJY21wCQlheCxsaW1pdAkhISBjaGVjayB2YWx1ZSBhZ2FpbnN0Ci0JCQkJCSEhIGxpbWl0Ci0JamxlCQlza2lwCQkhISBza2lwIGNhbGwgaWYgT0sKLXNraXA6CWNhbGwJIAllcnJvcgotCWZvbwkJZG9nCi0JemFwCQlkb2cJCi0Jbm9wCi0JRU5ETQotCi0JY2hrX2VyciA1Ci0JY2hrX2VyciAxMAotCi0KLQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsMy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MTk0Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGwzLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLSEJLkFMVEVSTkFURQotIQotCi0hZm9vCU1BQ1JPCXN0cmluZwotIQlMT0NBTAlsYWIxLCBsYWIyCi0hbGFiMToJREFUQS5MCWxhYjIKLSFsYWIyOglTREFUQQlzdHJpbmcKLSEJRU5ETQotIQotCi0hCWZvbwkiQW4gZXhhbXBsZSIKLSEJCi0hTEwwMDAxOglEQVRBLkwJTEwwMDAyCi1MTDAwMDE6CS5sb25nCUxMMDAwMgotIUxMMDAwMjoJU0RBVEEJIkFuIGV4YW1wbGUiCi1MTDAwMDI6CS5ieXRlCTY1LDExMCwzMiwxMDEsMTIwLDk3LDEwOSwxMTIsMTA4LDEwMQotIQlmb28JInVzaW5nIExPQ0FMIgotIQkKLSFMTDAwMDM6CURBVEEuTAlMTDAwMDQKLUxMMDAwMzoJLmxvbmcJTEwwMDA0Ci0hTEwwMDA0OglTREFUQQkidXNpbmcgTE9DQUwiCi1MTDAwMDQ6CS5ieXRlCTExNywxMTUsMTA1LDExMCwxMDMsMzIsNzYsNzksNjcsNjUsNzYKLSEKLQotISEgdGVzdCBvZiBMT0NBTCBkaXJlY3RpdmUKLQkhIHRlc3Qgb2YgTE9DQUwgZGlyZWN0aXZlCi0hCi0KLSFjaGtfZXJyCU1BQ1JPCWxpbWl0Ci0hCUxPQ0FMCQlza2lwICEhIGZyb2IKLSEJTE9DQUwJCXphcCxkb2csYmFyZgotIWJhcmY6CWNtcAkJYXgsbGltaXQJISEgY2hlY2sgdmFsdWUgYWdhaW5zdAotIQkJCQkJISEgbGltaXQKLSEJamxlCQlza2lwCQkhISBza2lwIGNhbGwgaWYgT0sKLSFza2lwOgljYWxsCSAJZXJyb3IKLSEJZm9vCQlkb2cKLSEJemFwCQlkb2cJCi0hCW5vcAotIQlFTkRNCi0hCi0KLSEJY2hrX2VyciA1Ci0hCQotIQkKLSFMTDAwMDg6CWNtcAkJYXgsNQkKLUxMMDAwODoJY21wCQlheCw1CQotIQkJCQkJCi0hCWpsZQkJTEwwMDA1CQkKLQlqbGUJCUxMMDAwNQkJCi0hTEwwMDA1OgljYWxsCSAJZXJyb3IKLUxMMDAwNToJY2FsbAkgCWVycm9yCi0hCWZvbwkJTEwwMDA3Ci0hCQotIUxMMDAwOToJREFUQS5MCUxMMDAwYQotTEwwMDA5OgkubG9uZwlMTDAwMGEKLSFMTDAwMGE6CVNEQVRBCUxMMDAwNwotTEwwMDBhOgkuYnl0ZQk3Niw3Niw0OCw0OCw0OCw1NQotIQlMTDAwMDYJCUxMMDAwNwkKLQlMTDAwMDYJCUxMMDAwNwkKLSEJbm9wCi0Jbm9wCi0hCWNoa19lcnIgMTAKLSEJCi0hCQotIUxMMDAwZToJY21wCQlheCwxMAkKLUxMMDAwZToJY21wCQlheCwxMAkKLSEJCQkJCQotIQlqbGUJCUxMMDAwYgkJCi0JamxlCQlMTDAwMGIJCQotIUxMMDAwYjoJY2FsbAkgCWVycm9yCi1MTDAwMGI6CWNhbGwJIAllcnJvcgotIQlmb28JCUxMMDAwZAotIQkKLSFMTDAwMGY6CURBVEEuTAlMTDAwMTAKLUxMMDAwZjoJLmxvbmcJTEwwMDEwCi0hTEwwMDEwOglTREFUQQlMTDAwMGQKLUxMMDAxMDoJLmJ5dGUJNzYsNzYsNDgsNDgsNDgsMTAwCi0hCUxMMDAwYwkJTEwwMDBkCQotCUxMMDAwYwkJTEwwMDBkCQotIQlub3AKLQlub3AKLSEKLQotIQotCi0hCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFkZDNlOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQkuQUxURVJOQVRFCi0hIHRlc3Qgb2YgbWFjcm8gc3Vic3RpdHV0aW9uIGFyb3VuZCAmcwotCi0KLWZvbwlNQUNSTwlhLGIKLQl4JmEmYgotCUVORE0KLQotCWZvbyAzIDIgCi0JRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw0LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDQub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDEzOTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0hCS5BTFRFUk5BVEUKLSEhIHRlc3Qgb2YgbWFjcm8gc3Vic3RpdHV0aW9uIGFyb3VuZCAmcwotCSEgdGVzdCBvZiBtYWNybyBzdWJzdGl0dXRpb24gYXJvdW5kICZzCi0hCi0KLSEKLQotIWZvbwlNQUNSTwlhLGIKLSEJeCZhJmIKLSEJRU5ETQotIQotCi0hCWZvbyAzIDIgCi0hCXgzMgotCXgzMgotIQlFTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Yjk5OWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0hIHRlc3Qgb2YgbGl0ZXJhbCB0ZXh0IG9wZXJhdG9yCi0JLkFMVEVSTkFURQotZm9vcAlNQUNSTwlzdHIxLHN0cjIKLQlTREFUQQkic3RyMSIKLQlTREFUQQlzdHIyCi0JRU5ETQotCi0KLQkKLQlmb29wCXRoaXM8IGlzIGEgPHN0cmluZz4gd2l0aCBhbmdsZSBicmFja2V0cz4KLQlmb29wIAl0aGlzPCBpcyBhIHN0cmluZyB3aXRoIHNwYWNlcz4KLQlmb29wCXRoaXMgPCBpcyBhIHN0cmluZyB3aXRoIGEgIT4+Ci0KLQotCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1LmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw1Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE0ODhiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDUub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotISEgdGVzdCBvZiBsaXRlcmFsIHRleHQgb3BlcmF0b3IKLQkhIHRlc3Qgb2YgbGl0ZXJhbCB0ZXh0IG9wZXJhdG9yCi0hCS5BTFRFUk5BVEUKLSFmb29wCU1BQ1JPCXN0cjEsc3RyMgotIQlTREFUQQkic3RyMSIKLSEJU0RBVEEJc3RyMgotIQlFTkRNCi0hCi0KLSEKLQotIQkKLSEJZm9vcAl0aGlzPCBpcyBhIDxzdHJpbmc+IHdpdGggYW5nbGUgYnJhY2tldHM+Ci0hCVNEQVRBCSJ0aGlzIgotCS5ieXRlCTExNiwxMDQsMTA1LDExNQotIQlTREFUQQkiIGlzIGEgPHN0cmluZz4gd2l0aCBhbmdsZSBicmFja2V0cyIKLQkuYnl0ZQkzMiwxMDUsMTE1LDMyLDk3LDMyLDYwLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDYyLDMyLDExOSwxMDUsMTE2LDEwNCwzMiw5NywxMTAsMTAzLDEwOCwxMDEsMzIsOTgsMTE0LDk3LDk5LDEwNywxMDEsMTE2LDExNQotIQlmb29wIAl0aGlzPCBpcyBhIHN0cmluZyB3aXRoIHNwYWNlcz4KLSEJU0RBVEEJInRoaXMiCi0JLmJ5dGUJMTE2LDEwNCwxMDUsMTE1Ci0hCVNEQVRBCSIgaXMgYSBzdHJpbmcgd2l0aCBzcGFjZXMiCi0JLmJ5dGUJMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE1LDExMiw5Nyw5OSwxMDEsMTE1Ci0hCWZvb3AJdGhpcyA8IGlzIGEgc3RyaW5nIHdpdGggYSAhPj4KLSEJU0RBVEEJInRoaXMiCi0JLmJ5dGUJMTE2LDEwNCwxMDUsMTE1Ci0hCVNEQVRBCSIgaXMgYSBzdHJpbmcgd2l0aCBhID4iCi0JLmJ5dGUJMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywzMiwxMTksMTA1LDExNiwxMDQsMzIsOTcsMzIsNjIKLSEKLQotIQotCi0hCUVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYyZDYxNy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2LmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuQUxURVJOQVRFCi0hIHRlc3Qgb2YgZXhwcmVzc2lvbiBvcGVyYXRvcgotZGVmaW5lIAlNQUNSTyAJdmFsLCBzdHJpbmcKLQlTREFUQSAJdmFsCi0JU0RBVEEJc3RyaW5nCi0JRU5ETQotCWRlZmluZSAiMSIsIjk5JW9mMTAwIgkhIG5vdGljZSAlIHdpdGhpbiBzdHJpbmcKLQlkZWZpbmUgCSUxICsgMiwgIj0zIgotCi0KLQlkZWZpbmUgCSUgMSArIDIgJTMrNAotCi0JZGVmaW5lCSUzKjQtMiAgPD0xMD4KLQotCWRlZmluZQklMyo0LTIgIDUKLQotCWRlZmluZQklMSArIDIsPGlzIGVxdWFsIHRvICUxICsgMiwgcmlnaHQ/PgotCi0JISBoYXMgbm8gZWZmZWN0Ci0KLQllbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDYuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2Lm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkMTZjZi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw2Lm91dAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLSEJLkFMVEVSTkFURQotISEgdGVzdCBvZiBleHByZXNzaW9uIG9wZXJhdG9yCi0JISB0ZXN0IG9mIGV4cHJlc3Npb24gb3BlcmF0b3IKLSFkZWZpbmUgCU1BQ1JPIAl2YWwsIHN0cmluZwotIQlTREFUQSAJdmFsCi0hCVNEQVRBCXN0cmluZwotIQlFTkRNCi0hCWRlZmluZSAiMSIsIjk5JW9mMTAwIgkhIG5vdGljZSAlIHdpdGhpbiBzdHJpbmcKLSEJU0RBVEEgCSIxIgotCS5ieXRlCTQ5Ci0hCVNEQVRBCSI5OSVvZjEwMCIKLQkuYnl0ZQk1Nyw1NywzNywxMTEsMTAyLDQ5LDQ4LDQ4Ci0hCWRlZmluZSAJJTEgKyAyLCAiPTMiCi0hCVNEQVRBIAkzCi0JLmJ5dGUJNTEKLSEJU0RBVEEJIj0zIgotCS5ieXRlCTYxLDUxCi0hCi0KLSEKLQotIQlkZWZpbmUgCSUgMSArIDIgJTMrNAotIQlTREFUQSAJMwotCS5ieXRlCTUxCi0hCVNEQVRBCTcKLQkuYnl0ZQk1NQotIQotCi0hCWRlZmluZQklMyo0LTIgIDw9MTA+Ci0hCVNEQVRBIAkxMAotCS5ieXRlCTQ5LDQ4Ci0hCVNEQVRBCSI9MTAiCi0JLmJ5dGUJNjEsNDksNDgKLSEKLQotIQlkZWZpbmUJJTMqNC0yICA1Ci0hCVNEQVRBIAkxMAotCS5ieXRlCTQ5LDQ4Ci0hCVNEQVRBCTUKLQkuYnl0ZQk1MwotIQotCi0hCWRlZmluZQklMSArIDIsPGlzIGVxdWFsIHRvICUxICsgMiwgcmlnaHQ/PgotIQlTREFUQSAJMwotCS5ieXRlCTUxCi0hCVNEQVRBCSJpcyBlcXVhbCB0byAlMSArIDIsIHJpZ2h0PyIKLQkuYnl0ZQkxMDUsMTE1LDMyLDEwMSwxMTMsMTE3LDk3LDEwOCwzMiwxMTYsMTExLDMyLDM3LDQ5LDMyLDQzLDMyLDUwLDQ0LDMyLDExNCwxMDUsMTAzLDEwNCwxMTYsNjMKLSEKLQotIQkhIGhhcyBubyBlZmZlY3QKLQkhIGhhcyBubyBlZmZlY3QKLSEKLQotIQllbmQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTQwYWYuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0JLkFMVEVSTkFURQotISB0ZXN0IG9mIHN0cmluZyBvcGVyYXRvcnMKLWRlZmluZQlNQUNSTwlzdHIxLHN0cjIKLQlTREFUQQlzdHIxCi0JU0RBVEEJInN0cjIiCi1FTkRNCi0JZGVmaW5lCW9uZSIgd2F5IHRvIGdldCAic3BhY2VzLDAKLQlkZWZpbmUJImxvdCdzISBvZiA8c3BlY2lhbD4sY2hhcnMlIiwgMAotCi0KLQotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw3LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUzMzE4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDcub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTliMzQuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsNy5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0hCS5BTFRFUk5BVEUKLSEhIHRlc3Qgb2Ygc3RyaW5nIG9wZXJhdG9ycwotCSEgdGVzdCBvZiBzdHJpbmcgb3BlcmF0b3JzCi0hZGVmaW5lCU1BQ1JPCXN0cjEsc3RyMgotIQlTREFUQQlzdHIxCi0hCVNEQVRBCSJzdHIyIgotIUVORE0KLSEJZGVmaW5lCW9uZSIgd2F5IHRvIGdldCAic3BhY2VzLDAKLSEJU0RBVEEJb25lIiB3YXkgdG8gZ2V0ICJzcGFjZXMKLQkuYnl0ZQkxMTEsMTEwLDEwMSwzNCwzMiwxMTksOTcsMTIxLDMyLDExNiwxMTEsMzIsMTAzLDEwMSwxMTYsMzIsMzQsMTE1LDExMiw5Nyw5OSwxMDEsMTE1Ci0hCVNEQVRBCSIwIgotCS5ieXRlCTQ4Ci0hCWRlZmluZQkibG90J3MhIG9mIDxzcGVjaWFsPixjaGFycyUiLCAwCi0hCVNEQVRBCSJsb3QncyBvZiA8c3BlY2lhbD4sY2hhcnMlIgotCS5ieXRlCTEwOCwxMTEsMTE2LDM5LDExNSwzMiwxMTEsMTAyLDMyLDYwLDExNSwxMTIsMTAxLDk5LDEwNSw5NywxMDgsNjIsNDQsOTksMTA0LDk3LDExNCwxMTUsMzcKLSEJU0RBVEEJIjAiCi0JLmJ5dGUJNDgKLSEKLQotIQotCi0hCi0KLSEKLQotIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNWIxNzIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0KLQkuQUxURVJOQVRFCi0JU0RBVEEJJTErMiszIAotCVNEQVRBCSI1IgotCi0KLQotCU1BQ1JPCWZvbwotCVNEQVRBCSJISSIJISEgdGhpcyB3aWxsIGdvCi0JU0RBVEEJIlRIRVJFCSEgdGhpcyB3aWxsIHN0YXkKLQlFTkRNCi0KLQlmb28KLQotCi0JU0RBVEEJPCE8dGhpcyBpcyA8YSB3YWNreT4gZXhhbXBsZSE+ISE+Ci0JU0RBVEEJIjx0aGlzIGlzIDxhIHdhY2t5PiBleGFtcGxlPiEiCi0JRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcGw4LmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDguZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wbDgub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTA0MTIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3BsOC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0hCi0KLSEJLkFMVEVSTkFURQotIQlTREFUQQklMSsyKzMgCi0JLmJ5dGUJMzcsNDksNDMsNTAsNDMsNTEsMzIKLSEJU0RBVEEJIjUiCi0JLmJ5dGUJNTMKLSEKLQotIQotCi0hCi0KLSEJTUFDUk8JZm9vCi0hCVNEQVRBCSJISSIJISEgdGhpcyB3aWxsIGdvCi0hCVNEQVRBCSJUSEVSRQkhIHRoaXMgd2lsbCBzdGF5Ci0hCUVORE0KLSEKLQotIQlmb28KLSEJU0RBVEEJIkhJIgkKLQkuYnl0ZQk3Miw3MwotIQlTREFUQQkiVEhFUkUJISB0aGlzIHdpbGwgc3RheQotCS5ieXRlCTg0LDcyLDY5LDgyLDY5LDksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExOSwxMDUsMTA4LDEwOCwzMiwxMTUsMTE2LDk3LDEyMQotIQotCi0hCi0KLSEJU0RBVEEJPCE8dGhpcyBpcyA8YSB3YWNreT4gZXhhbXBsZSE+ISE+Ci0JLmJ5dGUJNjAsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsNjAsOTcsMzIsMTE5LDk3LDk5LDEwNywxMjEsNjIsMzIsMTAxLDEyMCw5NywxMDksMTEyLDEwOCwxMDEsNjIsMzMKLSEJU0RBVEEJIjx0aGlzIGlzIDxhIHdhY2t5PiBleGFtcGxlPiEiCi0JLmJ5dGUJNjAsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsNjAsOTcsMzIsMTE5LDk3LDk5LDEwNywxMjEsNjIsMzIsMTAxLDEyMCw5NywxMDksMTEyLDEwOCwxMDEsNjIsMzQKLSEJRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTdjYWY1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLSAgICAgLnNkYXRhICJ2MS4wMDAwIgotICAgICAuZW5kCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcHI3NTgzLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9wcjc1ODMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGYxZDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3ByNzU4My5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSEKLQotISAgICAgLnNkYXRhICJ2MS4wMDAwIgotCS5ieXRlCTExOCw0OSw0Niw0OCw0OCw0OCw0OAotISAgICAgLmVuZApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5hc20gYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0NjNlZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi0KLWZvbwkuUkVHCShyMSkKLQlhZGQJZm9vLGZvbwotCi1iYXIJLnJlZwkocjIpCi0JYWRkCWJhcixmb28KLQotCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZWcuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlZy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyNjhhMy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVnLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSEKLQotIQotCi0hZm9vCS5SRUcJKHIxKQotIQlhZGQJZm9vLGZvbwotCWFkZAlyMSxyMQotIQotCi0hYmFyCS5yZWcJKHIyKQotIQlhZGQJYmFyLGZvbwotCWFkZAlyMixyMQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyN2FjNDcuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0JLkFSRVBFQVQJNQotCUZJVkUKLQkuQVJFUEVBVAkyCi0JVFdPCi0JLkFFTkRSCi0JLkFSRVBFQVQJMwotCVRIUkVFCi0JLkFSRVBFQVQJMgotCVRXTwkKLQkuQUVORFIKLQkuQUVORFIKLQkuQUVORFIKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXAub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMGQwZTEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcC5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotIQkuQVJFUEVBVAk1Ci0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAk0Ci0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkzCi0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkyCi0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCUZJVkUKLSEJLkFSRVBFQVQJMgotIQlUV08KLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTMKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkFFTkRSCi0hCUZJVkUKLQlGSVZFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCi0hCS5BRU5EUgotIQlUV08KLQlUV08KLSEJLkFSRVBFQVQJMQotIQlUV08KLSEJLkFFTkRSCi0hCVRXTwotCVRXTwotIQkuQVJFUEVBVAkzCi0hCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJLkFFTkRSCi0hCVRIUkVFCi0JVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuQVJFUEVBVAkxCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTIKLSEJVEhSRUUKLSEJLkFSRVBFQVQJMgotIQlUV08JCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEhSRUUKLQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCVRXTwkKLQlUV08JCi0hCS5BUkVQRUFUCTEKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUSFJFRQotIQkuQVJFUEVBVAkyCi0hCVRXTwkKLSEJLkFFTkRSCi0hCS5BRU5EUgotIQlUSFJFRQotCVRIUkVFCi0hCS5BUkVQRUFUCTIKLSEJVFdPCQotIQkuQUVORFIKLSEJVFdPCQotCVRXTwkKLSEJLkFSRVBFQVQJMQotIQlUV08JCi0hCS5BRU5EUgotIQlUV08JCi0JVFdPCQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTg1ZGEzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotCi0JLkFSRVBFQVQJMTAKLQlURU4KLQkuQVJFUEVBVAkyCQotCVRXRU5UWQotCS5BRU5EUgotCS5BRU5EUgotCi0JLkFSRVBFQVQJMwotCVJPVENMCVIyCi0JRElWMQlSMCxSMQotCS5BRU5EUgotCi0JLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVhdC5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0LmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZWF0Lm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDVkOGQ4Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlYXQub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLSEKLQotIQkuQVJFUEVBVAkxMAotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJOQotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJOAotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJNwotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJNgotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJNQotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJNAotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMwotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMgotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEJLkFSRVBFQVQJMQotIQlURU4KLSEJLkFSRVBFQVQJMgkKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJVEVOCi0JVEVOCi0hCS5BUkVQRUFUCTIJCi0hCVRXRU5UWQotIQkuQUVORFIKLSEJVFdFTlRZCi0JVFdFTlRZCi0hCS5BUkVQRUFUCTEKLSEJVFdFTlRZCi0hCS5BRU5EUgotIQlUV0VOVFkKLQlUV0VOVFkKLSEKLQotIQkuQVJFUEVBVAkzCi0hCVJPVENMCVIyCi0hCURJVjEJUjAsUjEKLSEJLkFFTkRSCi0hCVJPVENMCVIyCi0JUk9UQ0wJUjIKLSEJRElWMQlSMCxSMQotCURJVjEJUjAsUjEKLSEJLkFSRVBFQVQJMgotIQlST1RDTAlSMgotIQlESVYxCVIwLFIxCi0hCS5BRU5EUgotIQlST1RDTAlSMgotCVJPVENMCVIyCi0hCURJVjEJUjAsUjEKLQlESVYxCVIwLFIxCi0hCS5BUkVQRUFUCTEKLSEJUk9UQ0wJUjIKLSEJRElWMQlSMCxSMQotIQkuQUVORFIKLSEJUk9UQ0wJUjIKLQlST1RDTAlSMgotIQlESVYxCVIwLFIxCi0JRElWMQlSMCxSMQotIQotCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwODgyYjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5hc20KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotCS5SRVBFQVQJMTAKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExZTMzMTguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5lcnIKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1FTkQgbWlzc2luZyBmcm9tIGVuZCBvZiBmaWxlLgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVyci5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5ZjhjNi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotIQotCi0hCS5SRVBFQVQJMTAKLQkuUkVQRUFUCTEwCi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDk4N2U0Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi0JLkFSRVBFQVQJMTAKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjU0NWIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjEuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRW5kIG9mIGZpbGUgd2hpbHN0IGluc2lkZSBBUkVQRUFULCBzdGFydGVkIG9uIGxpbmUgMy4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIxLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4Mjg4MC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSEKLQotIQkuQVJFUEVBVAkxMAotIQkuRU5ECi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTA2YTcxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotCi0JLkFSRVBFQVQJNQotCS5BRU5EUgkJCi0JLkFFTkRSCi0JLkVORAotCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGNjYzUuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjIuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotcmVwZXJyMi5hc206NCBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIyLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3YTg0ZC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0hCi0KLSEJLkFSRVBFQVQJNQotIQkuQUVORFIJCQotIQkuQVJFUEVBVAk0Ci0hCS5BRU5EUgotIQkuQVJFUEVBVAkzCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkyCi0hCS5BRU5EUgotIQkuQVJFUEVBVAkxCi0hCS5BRU5EUgotIQkuQUVORFIKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuYXNtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjRiYzc5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9yZXBlcnIzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLQkuQVJFUEVBVAk0Ci0JLkFSRVBFQVQJNAotCS5BUkVQRUFUCTQKLQkuQVJFUEVBVAk0Ci0Jc3R1ZmYKLQkuQUVORFIJCQotCXdoaWNoCi0JLkFFTkRSCQotCXdpbGwKLQkuQUVORFIJCi0JZ2V0Ci0JLkFFTkRSCQotCXJlcGV0YWVkCi0JLkFFTkRSCQotCi0JLkFFTkRSCQotCS5BRU5EUgkKLQkuQUVORFIJCi0JLkFFTkRSCQotCS5BRU5EUgkKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTBkY2UuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMuZXJyCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1yZXBlcnIzLmFzbToxNCBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KLXJlcGVycjMuYXNtOjE2IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgotcmVwZXJyMy5hc206MTcgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCi1yZXBlcnIzLmFzbToxOCBBRU5EUiB3aXRob3V0IGEgQVJFUEVBVC4KLXJlcGVycjMuYXNtOjE5IEFFTkRSIHdpdGhvdXQgYSBBUkVQRUFULgotcmVwZXJyMy5hc206MjAgQUVORFIgd2l0aG91dCBhIEFSRVBFQVQuCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvcmVwZXJyMy5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzUxM2IuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3JlcGVycjMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsMjAzNSArMCwwIEBACi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJZ2V0Ci0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJZ2V0Ci0JZ2V0Ci0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJZ2V0Ci0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQlnZXQKLQlnZXQKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCQotIQlnZXQKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCWdldAotCWdldAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIJCi0hCWdldAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQl3aWxsCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkzCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMQotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQl3aWxsCi0Jd2lsbAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCXdpbGwKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIJCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTMKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkxCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCXdpbGwKLQl3aWxsCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJd2lsbAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgkKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJLkFSRVBFQVQJMwotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXdoaWNoCi0hCS5BRU5EUgotIQkuQVJFUEVBVAk0Ci0hCXN0dWZmCi0hCS5BRU5EUgkJCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMwotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkyCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTEKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJd2hpY2gKLQl3aGljaAotIQkuQVJFUEVBVAkyCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJd2hpY2gKLSEJLkFFTkRSCi0hCS5BUkVQRUFUCTQKLSEJc3R1ZmYKLSEJLkFFTkRSCQkKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkzCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTIKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMQotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQl3aGljaAotCXdoaWNoCi0hCS5BUkVQRUFUCTEKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQl3aGljaAotIQkuQUVORFIKLSEJLkFSRVBFQVQJNAotIQlzdHVmZgotIQkuQUVORFIJCQotIQlzdHVmZgotCXN0dWZmCi0hCS5BUkVQRUFUCTMKLSEJc3R1ZmYKLSEJLkFFTkRSCi0hCXN0dWZmCi0Jc3R1ZmYKLSEJLkFSRVBFQVQJMgotIQlzdHVmZgotIQkuQUVORFIKLSEJc3R1ZmYKLQlzdHVmZgotIQkuQVJFUEVBVAkxCi0hCXN0dWZmCi0hCS5BRU5EUgotIQlzdHVmZgotCXN0dWZmCi0hCXdoaWNoCi0Jd2hpY2gKLSEJd2lsbAotCXdpbGwKLSEJZ2V0Ci0JZ2V0Ci0hCXJlcGV0YWVkCi0JcmVwZXRhZWQKLSEJLkFFTkRSCQotIQotCi0hCS5BRU5EUgkKLSEJLkFFTkRSCQotIQkuQUVORFIJCi0hCS5BRU5EUgkKLSEJLkFFTkRSCQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZiZDIzYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotCi0KLQkuU0RBVEEJIkhJIiwiU1RFVkUiCi0JLlNEQVRBCSJISSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KLQotCS5TREFUQQkiSCIiSSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KLQotCi0KLQkuU0RBVEEJIlNIT1VMRCBOT1QgRkFJTCIgIkhFUkUiIAotCS5TREFUQQkiU0hPVUxEIEZBSUwiICBmb28gIkhFUkUiIAotCi0JLlNEQVRBQgk4LCJCT0lOSyIKLQotCTsgZXhhbXBsZXMgZnJvbSBib29rCi0KLQkuU0RBVEFCCTIsIkFBQUFBIgotCS5TREFUQUIJMiwiIiJCQkIiIiIKLQkuU0RBVEFCCTIsIkFBQkIiPEgnMDc+Ci0KLQotYTE6CS5TREFUQVoJIkhJIgotYTI6CS5TREFUQUMgIkhJIgotYTM6CS5TREFUQQkiSEkiCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NkYXRhLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0NGNjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEuZXJyCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zZGF0YS5hc206MTkgQ2hhcmFjdGVyIGNvZGUgaW4gc3RyaW5nIG11c3QgYmUgYWJzb2x1dGUgZXhwcmVzc2lvbi4KLXNkYXRhLmFzbToxOSBNaXNzaW5nID4gZm9yIGNoYXJhY3RlciBjb2RlLgotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3Avc2RhdGEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjg5ZDM1Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZGF0YS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0hCi0KLSEKLQotIQkuU0RBVEEJIkhJIiwiU1RFVkUiCi0JLmJ5dGUJNzIsNzMsODMsODQsNjksODYsNjkKLSEJLlNEQVRBCSJISSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KLQkuYnl0ZQk3Miw3Myw4Myw4NCw2OSw4Niw2OSw3Miw3Myw4Myw2OSw4Niw2OQotIQotCi0hCS5TREFUQQkiSCIiSSIgLCAiU1RFVkUiICwgPDcyPiw8NzM+LDw4Mz48Njk+PDg2Pjw2OT4KLQkuYnl0ZQk3MiwzNCw3Myw4Myw4NCw2OSw4Niw2OSw3Miw3Myw4Myw2OSw4Niw2OQotIQotCi0hCi0KLSEKLQotIQkuU0RBVEEJIlNIT1VMRCBOT1QgRkFJTCIgIkhFUkUiIAotCS5ieXRlCTgzLDcyLDc5LDg1LDc2LDY4LDMyLDc4LDc5LDg0LDMyLDcwLDY1LDczLDc2LDcyLDY5LDgyLDY5Ci0hCS5TREFUQQkiU0hPVUxEIEZBSUwiICBmb28gIkhFUkUiIAotCS5ieXRlCTgzLDcyLDc5LDg1LDc2LDY4LDMyLDcwLDY1LDczLDc2LDEwMiwxMTEsMTExLDMyLDM0LDcyLDY5LDgyLDY5LDM0LDMyCi0hCi0KLSEJLlNEQVRBQgk4LCJCT0lOSyIKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0JLmJ5dGUJNjYsNzksNzMsNzgsNzUKLQkuYnl0ZQk2Niw3OSw3Myw3OCw3NQotCS5ieXRlCTY2LDc5LDczLDc4LDc1Ci0hCi0KLSEJOyBleGFtcGxlcyBmcm9tIGJvb2sKLQk7IGV4YW1wbGVzIGZyb20gYm9vawotIQotCi0hCS5TREFUQUIJMiwiQUFBQUEiCi0JLmJ5dGUJNjUsNjUsNjUsNjUsNjUKLQkuYnl0ZQk2NSw2NSw2NSw2NSw2NQotIQkuU0RBVEFCCTIsIiIiQkJCIiIiCi0JLmJ5dGUJMzQsNjYsNjYsNjYsMzQKLQkuYnl0ZQkzNCw2Niw2Niw2NiwzNAotIQkuU0RBVEFCCTIsIkFBQkIiPEgnMDc+Ci0JLmJ5dGUJNjUsNjUsNjYsNjYsMAotCS5ieXRlCTY1LDY1LDY2LDY2LDAKLSEKLQotIQotCi0hYTE6CS5TREFUQVoJIkhJIgotYTE6CS5ieXRlCTcyLDczLDAKLSFhMjoJLlNEQVRBQyAiSEkiCi1hMjoJLmJ5dGUJMiw3Miw3MwotIWEzOgkuU0RBVEEJIkhJIgotYTM6CS5ieXRlCTcyLDczCi0hClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTk0OWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLQotCS5NQUNSTwlSRVNFUlZFX1NUUiBQMT0wIFAyCi0JLlNEQVRBCS5TVUJTVFIoIkFCQ0RFRkciLFxQMSxcUDIpCi0JLkVORE0KLQotCVJFU0VSVkVfU1RSCTIsMgotCVJFU0VSVkVfU1RSCSwzCi0KLQotCS5NQUNSTyBGSU5EX1NUUiBQMQotCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiXFAxIiwgMCkKLQkuRU5ETQotCi0JRklORF9TVFIJQ0RFCi0JRklORF9TVFIJSAotCi0JLk1BQ1JPCVJFU0VSVkVfTEVOR1RIIFAxCi0JLkFMSUdOCTQKLQkuU1JFUwkuTEVOKCJcUDEiKQotCS5FTkRNCi0KLQlSRVNFUlZFX0xFTkdUSAlBQkNERUYKLQlSRVNFUlZFX0xFTkdUSAlBQkMKLQotCS5FTkQKLQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmVyciBiL2dhcy90ZXN0c3VpdGUvZ2FzcC9zZnVuYy5lcnIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLmVycgorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMub3V0IGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3NmdW5jLm91dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmNjk0Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avc2Z1bmMub3V0CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotIQotCi0hCS5NQUNSTwlSRVNFUlZFX1NUUiBQMT0wIFAyCi0hCS5TREFUQQkuU1VCU1RSKCJBQkNERUZHIixcUDEsXFAyKQotIQkuRU5ETQotIQotCi0hCVJFU0VSVkVfU1RSCTIsMgotIQkuU0RBVEEJLlNVQlNUUigiQUJDREVGRyIsMiwyKQotCS5ieXRlCTY3LDY4Ci0hCVJFU0VSVkVfU1RSCSwzCi0hCS5TREFUQQkuU1VCU1RSKCJBQkNERUZHIiwwLDMpCi0JLmJ5dGUJNjUsNjYsNjcKLSEKLQotIQotCi0hCS5NQUNSTyBGSU5EX1NUUiBQMQotIQkuREFUQS5XCS5JTlNUUigiQUJDREVGRyIsIlxQMSIsIDApCi0hCS5FTkRNCi0hCi0KLSEJRklORF9TVFIJQ0RFCi0hCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiQ0RFIiwgMCkKLQkuc2hvcnQJMgotIQlGSU5EX1NUUglICi0hCS5EQVRBLlcJLklOU1RSKCJBQkNERUZHIiwiSCIsIDApCi0JLnNob3J0CS0xCi0hCi0KLSEJLk1BQ1JPCVJFU0VSVkVfTEVOR1RIIFAxCi0hCS5BTElHTgk0Ci0hCS5TUkVTCS5MRU4oIlxQMSIpCi0hCS5FTkRNCi0hCi0KLSEJUkVTRVJWRV9MRU5HVEgJQUJDREVGCi0hCS5BTElHTgk0Ci0JLmFsaWduCTQKLSEJLlNSRVMJLkxFTigiQUJDREVGIikKLQkuc3BhY2UJMjQKLSEJUkVTRVJWRV9MRU5HVEgJQUJDCi0hCS5BTElHTgk0Ci0JLmFsaWduCTQKLSEJLlNSRVMJLkxFTigiQUJDIikKLQkuc3BhY2UJMTIKLSEKLQotIQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1NGM2Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0KLQl0ZXN0IGZvciBlb2YgaW4gbWlkZGxlIG9mIGxpbmUKLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QxLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDEuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDEub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIzMGUxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90MS5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSEKLQotIQl0ZXN0IGZvciBlb2YgaW4gbWlkZGxlIG9mIGxpbmUKLQl0ZXN0IGZvciBlb2YgaW4gbWlkZGxlIG9mIGxpbmUKLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTM1MWEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCi0KLQl0ZXN0Ci0rIGNvbnRpbnVlZAotKyBsaW5lcwotCi0KLQkuRU5ECmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QyLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDIuZXJyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDIub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQ0ZThiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90Mi5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0hCi0KLSEKLQotIQl0ZXN0Ci0hK2NvbnRpbnVlZAotIStsaW5lcwotCXRlc3Rjb250aW51ZWRsaW5lcwotIQotCi0hCi0KLSEJLkVORApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmFzbSBiL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzAyZGIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLQotCXRlc3QgYmFzZSBjb252ZXJ0aW9ucwotCi0JQicxMDAxMDAwCi0JUScyMTAKLQlEJzEzNgotCUgnODgKLQotCUZPT0InMTAwMTAwMEJBUgotCUZPT1EnMjEwQkFSCi0JRk9PRCcxMzZCQVIKLQlGT09IJzg4QkFSCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuZXJyIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3QzLmVycgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlMzMxOC4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3AvdDMuZXJyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotRU5EIG1pc3NpbmcgZnJvbSBlbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5vdXQgYi9nYXMvdGVzdHN1aXRlL2dhc3AvdDMub3V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWQxNTBiLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC90My5vdXQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0hCi0KLSEJdGVzdCBiYXNlIGNvbnZlcnRpb25zCi0JdGVzdCBiYXNlIGNvbnZlcnRpb25zCi0hCi0KLSEJQicxMDAxMDAwCi0JNzIKLSEJUScyMTAKLQkxMzYKLSEJRCcxMzYKLQkxMzYKLSEJSCc4OAotCTEzNgotIQotCi0hCUZPT0InMTAwMTAwMEJBUgotCUZPT0InMTAwMTAwMEJBUgotIQlGT09RJzIxMEJBUgotCUZPT1EnMjEwQkFSCi0hCUZPT0QnMTM2QkFSCi0JRk9PRCcxMzZCQVIKLSEJRk9PSCc4OEJBUgotCUZPT0gnODhCQVIKLSEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuYXNtIGIvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLmFzbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNDNjYy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuYXNtCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotCWRvbmtleQotYmFyCS5BU1NJR05BCTAKLQkuQVdISUxFCVwmYmFyIExUIDUJCi0JSEkgQkFSIElTIFwmYmFyCi1mb28JLkFTU0lHTkEJMAotCS5BV0hJTEUJXCZmb28gTFQgMgotCUhJIEJFRk9SRQotCS5BUkVQRUFUCTIKLQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQkuQUVORFIKLQlISSBBRlRFUgotZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLQkuQUVORFcKLWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0JQU5EIElUUyBOT1cgXCZiYXIKLQkuQUVORFcKLQkuRU5ECi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5lcnIgYi9nYXMvdGVzdHN1aXRlL2dhc3Avd2hpbGUuZXJyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5lcnIKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLm91dCBiL2dhcy90ZXN0c3VpdGUvZ2FzcC93aGlsZS5vdXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyOGFlYjEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9nYXNwL3doaWxlLm91dAorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0hCWRvbmtleQotCWRvbmtleQotIWJhcgkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZiYXIgTFQgNQkKLSEJSEkgQkFSIElTIFwmYmFyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotIQkuQUVORFcKLSEJSEkgQkFSIElTIFwmYmFyCi0JSEkgQkFSIElTIDAKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDAKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDAKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMAotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMAotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotCUFORCBJVFMgTk9XIDEKLSEJLkFXSElMRQlcJmJhciBMVCA1CQotIQlISSBCQVIgSVMgXCZiYXIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0hCS5BRU5EVwotIQlISSBCQVIgSVMgXCZiYXIKLQlISSBCQVIgSVMgMQotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMQotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgMQotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAxCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSAxCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0JQU5EIElUUyBOT1cgMgotIQkuQVdISUxFCVwmYmFyIExUIDUJCi0hCUhJIEJBUiBJUyBcJmJhcgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLSEJLkFFTkRXCi0hCUhJIEJBUiBJUyBcJmJhcgotCUhJIEJBUiBJUyAyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAyCi0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMCAyCi0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDIKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkxIDIKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLQlBTkQgSVRTIE5PVyAzCi0hCS5BV0hJTEUJXCZiYXIgTFQgNQkKLSEJSEkgQkFSIElTIFwmYmFyCi0hZm9vCS5BU1NJR05BCTAKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotIQkuQUVORFcKLSEJSEkgQkFSIElTIFwmYmFyCi0JSEkgQkFSIElTIDMKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIQlISSBCRUZPUkUKLQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDMKLSEJLkFSRVBFQVQJMQotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotCUhJIE1FRElVTQkwIDMKLSEJSEkgQUZURVIKLQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMwotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTEgMwotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSFiYXIJLkFTU0lHTkEJXCZiYXIgKyAxCQotIQlBTkQgSVRTIE5PVyBcJmJhcgotCUFORCBJVFMgTk9XIDQKLSEJLkFXSElMRQlcJmJhciBMVCA1CQotIQlISSBCQVIgSVMgXCZiYXIKLSFmb28JLkFTU0lHTkEJMAotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0hCS5BRU5EVwotIQlISSBCQVIgSVMgXCZiYXIKLQlISSBCQVIgSVMgNAotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hCUhJIEJFRk9SRQotCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgNAotIQkuQVJFUEVBVAkxCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0JSEkgTUVESVVNCTAgNAotIQlISSBBRlRFUgotCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFXSElMRQlcJmZvbyBMVCAyCi0hCUhJIEJFRk9SRQotIQkuQVJFUEVBVAkyCi0hCUhJIE1FRElVTQlcJmZvbyBcJmJhcgotIQkuQUVORFIKLSEJSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQUVORFcKLSEJSEkgQkVGT1JFCi0JSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSA0Ci0hCS5BUkVQRUFUCTEKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLQlISSBNRURJVU0JMSA0Ci0hCUhJIEFGVEVSCi0JSEkgQUZURVIKLSFmb28JLkFTU0lHTkEJXCZmb28gKyAxCQotIQkuQVdISUxFCVwmZm9vIExUIDIKLSEJSEkgQkVGT1JFCi0hCS5BUkVQRUFUCTIKLSEJSEkgTUVESVVNCVwmZm9vIFwmYmFyCi0hCS5BRU5EUgotIQlISSBBRlRFUgotIWZvbwkuQVNTSUdOQQlcJmZvbyArIDEJCi0hCS5BRU5EVwotIWJhcgkuQVNTSUdOQQlcJmJhciArIDEJCi0hCUFORCBJVFMgTk9XIFwmYmFyCi0JQU5EIElUUyBOT1cgNQotIQkuQVdISUxFCVwmYmFyIExUIDUJCi0hCUhJIEJBUiBJUyBcJmJhcgotIWZvbwkuQVNTSUdOQQkwCi0hCS5BV0hJTEUJXCZmb28gTFQgMgotIQlISSBCRUZPUkUKLSEJLkFSRVBFQVQJMgotIQlISSBNRURJVU0JXCZmb28gXCZiYXIKLSEJLkFFTkRSCi0hCUhJIEFGVEVSCi0hZm9vCS5BU1NJR05BCVwmZm9vICsgMQkKLSEJLkFFTkRXCi0hYmFyCS5BU1NJR05BCVwmYmFyICsgMQkKLSEJQU5EIElUUyBOT1cgXCZiYXIKLSEJLkFFTkRXCi0hCS5FTkQKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvYm90aCBiL2dhcy90ZXN0c3VpdGUvbGliL2RvYm90aApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYmNiODM3Yy4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb2JvdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIS9iaW4vc2gKLQoteD0kMSA7IHNoaWZ0Ci15PSQxIDsgc2hpZnQKLQotcm0gdG1wLjAgPiAvZGV2L251bGwgMj4mMQotbG4gLXMgJHggdG1wLjAKLSQqIHRtcC4wID4gdG1wLjEKLQotcm0gdG1wLjAKLWxuIC1zICR5IHRtcC4wCi0kKiB0bXAuMCA+IHRtcC4yCi0KLXJtIHRtcC4wCi0KLWRpZmYgLWMgdG1wLjEgdG1wLjIKLWV4aXQKLQotI2VvZgpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG9vYmpjbXAgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb29iamNtcApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzVjMzJkYS4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9kb29iamNtcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBjb21wYXJlIHR3byBvYmplY3QgZmlsZXMsIGluIGRlcHRoLgotCi14PSQxCi15PSQyCi1CT1RIPSIkMSAkMiIKLQotCi0jIGlmIHRoZXkgY21wLCB3ZSdyZSBmaW5lLgotaWYgKGNtcCAkQk9USCA+IC9kZXYvbnVsbCkKLXRoZW4KLQlleGl0IDAKLWZpCi0KLSMgb3RoZXJ3aXNlLCB3ZSBtdXN0IGxvb2sgY2xvc2VyLgotaWYgKGRvYm90aCAkQk9USCBzaXplKQotdGhlbgotCWVjaG8gU2l6ZXMgb2suCi1lbHNlCi0JZWNobyBTaXplcyBkaWZmZXI6Ci0Jc2l6ZSAkQk9USAotIwlleGl0IDEKLWZpCi0KLWlmIChkb2JvdGggJEJPVEggb2JqZHVtcCAraGVhZGVyKQotdGhlbgotCWVjaG8gSGVhZGVycyBvay4KLWVsc2UKLQllY2hvIEhlYWRlciBkaWZmZXJlbmNlcy4KLSMJZXhpdCAxCi1maQotCi1pZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgK3RleHQgPiAvZGV2L251bGwpCi10aGVuCi0JZWNobyBUZXh0IG9rLgotZWxzZQotCWVjaG8gVGV4dCBkaWZmZXJlbmNlcy4KLSMJZG9ib3RoICRCT1RIIG9iamR1bXAgK3RleHQKLSMJZXhpdCAxCi1maQotCi1pZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgK2RhdGEgPiAvZGV2L251bGwpCi10aGVuCi0JZWNobyBEYXRhIG9rLgotZWxzZQotCWVjaG8gRGF0YSBkaWZmZXJlbmNlcy4KLSMJZG9ib3RoICRCT1RIIG9iamR1bXAgK2RhdGEKLSMJZXhpdCAxCi1maQotCi1pZiAoZG9ib3RoICRCT1RIIG9iamR1bXAgK3N5bWJvbHMgPiAvZGV2L251bGwpCi10aGVuCi0JZWNobyBTeW1ib2xzIG9rLgotZWxzZQotCWVjaG8gLW4gU3ltYm9sIGRpZmZlcmVuY2VzLi4uCi0KLQlpZiAoZG9ib3RoICRCT1RIIGRvdW5zb3J0c3ltYm9scykKLQl0aGVuCi0JCWVjaG8gYnV0IHN5bWJvbHMgYXJlIHNpbXBseSBvcmRlcmVkIGRpZmZlcmVudGx5LgotIwkJZWNobyBOb3cgd2hhdCB0byBkbyBhYm91dCByZWxvY3MnPycKLSMJCWV4aXQgMQotCWVsc2UKLQkJZWNobyBhbmQgc3ltYm9scyBkaWZmZXIgaW4gY29udGVudC4KLQkJZXhpdCAxCi0JZmkKLWZpCi0KLSMgb2YgY291cnNlLCBpZiB0aGVyZSB3ZXJlIHN5bWJvbCBkaWZmcywgdGhlbiB0aGUgcmVsb2Mgc3ltYm9sIGluZGV4ZXMKLSMgd2lsbCBiZSBvZmYuCi0KLWlmIChkb2JvdGggJEJPVEggb2JqZHVtcCAtciA+IC9kZXYvbnVsbCkKLXRoZW4KLQllY2hvIFJlbG9jIG9rLgotZWxzZQotCWVjaG8gLW4gUmVsb2MgZGlmZmVyZW5jZXMuLi4KLQotCWlmIChkb2JvdGggJEJPVEggZG91bnNvcnRyZWxvYykKLQl0aGVuCi0JCWVjaG8gYnV0IHJlbG9jcyBhcmUgc2ltcGx5IG9yZGVyZWQgZGlmZmVyZW50bHkuCi0JZWxzZQotCQllY2hvIGFuZCByZWxvY3MgZGlmZmVyIGluIGNvbnRlbnQuCi0JCWV4aXQgMQotCWZpCi1maQotCi1leGl0Ci0KLSMgZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3N0cmlwdGVzdCBiL2dhcy90ZXN0c3VpdGUvbGliL2Rvc3RyaXB0ZXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzYTUxNzAxLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2Rvc3RyaXB0ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyEvYmluL3NoCi0KLXg9c3RyaXB0ZXN0Lnh4LiQkCi15PXN0cmlwdGVzdC55eS4kJAotCi1jcCAkMSAkeAotc3RyaXAgJHgKLWNwICQyICR5Ci1zdHJpcCAkeQotCi1kb29iamNtcCAkeCAkeQotZXhpdAotCi0jZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Rlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE3NjhhMjIuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZG90ZXN0CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyEvYmluL3NoCi0jIGFkIGhvYyBkZWJ1ZyB0b29sCi0KLXg9JDEKLXk9JDIKLQoteG91dD1gYmFzZW5hbWUgJHhgLnh4eC4kJAoteW91dD1gYmFzZW5hbWUgJHhgLnl5eS4kJAotCi1ta2RpciAkeG91dAotbWtkaXIgJHlvdXQKLQotZm9yIGkgaW4gKi5zCi1kbwotCWVjaG8gVGVzdGluZyAkaS4uLgotCW9iamVjdD1gYmFzZW5hbWUgJGkgLnNgLm8KLQkkeCAkaSAtbyAkeG91dC8kb2JqZWN0Ci0JJHkgJGkgLW8gJHlvdXQvJG9iamVjdAotCi0jIGlmIHRoZXkgY21wLCB3ZSdyZSBvay4gIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGxvb2sgY2xvc2VyLgotCi0JaWYgKGNtcCAkeG91dC8kb2JqZWN0ICR5b3V0LyRvYmplY3QpCi0JdGhlbgotCQllY2hvICRpIGlzIG9rLgotCWVsc2UKLQkJaWYgKGRvb2JqY21wICR4b3V0LyRvYmplY3QgJHlvdXQvJG9iamVjdCkKLQkJdGhlbgotCQkJZWNobyBOb3QgdGhlIHNhbWUgYnV0IG9iamNtcCBvay4KLQkJZWxzZQotCQkJZXhpdCAxCi0JCWZpCi0JZmkKLQotCWVjaG8KLWRvbmUKLQotcm0gLXJmICR4b3V0ICR5b3V0Ci0KLWV4aXQgMAotCi0jIEVPRgotCi0KZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MgYi9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3JlbG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZDY5NTMzLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zcmVsb2MKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSMhL2Jpbi9zaAotIyBvYmpkdW1wIHRoZSByZWxvYyB0YWJsZSwgYnV0IHN0cmlwIG9mZiB0aGUgaGVhZGluZ3MgYW5kIHJlbG9jCi0jIG51bWJlcnMgYW5kIHNvcnQgdGhlIHJlc3VsdC4gIEludGVuZGVkIGZvciB1c2UgaW4gY29tcGFyaW5nIHJlbG9jCi0jIHRhYmxlcyB0aGF0IG1heSBub3QgYmUgaW4gdGhlIHNhbWUgb3JkZXIuCi0KLW9iamR1bXAgK3JlbG9jICtvbWl0LXJlbG9jYXRpb24tbnVtYmVycyArb21pdC1zeW1ib2wtbnVtYmVycyAkMSBcCi0JfCBzb3J0Ci0jZW9mCmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9kb3Vuc3N5bSBiL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNDRkYTYyLi4wMDAwMDAwCi0tLSBhL2dhcy90ZXN0c3VpdGUvbGliL2RvdW5zc3ltCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jIS9iaW4vc2gKLSMgb2JqZHVtcCB0aGUgc3ltYm9sIHRhYmxlLCBidXQgc3RyaXAgb2ZmIHRoZSBoZWFkaW5ncyBhbmQgc3ltYm9sCi0jIG51bWJlcnMgYW5kIHNvcnQgdGhlIHJlc3VsdC4gIEludGVuZGVkIGZvciB1c2UgaW4gY29tcGFyaW5nIHN5bWJvbAotIyB0YWJsZXMgdGhhdCBtYXkgbm90IGJlIGluIHRoZSBzYW1lIG9yZGVyLgotCi1vYmpkdW1wICtzeW1ib2xzICtvbWl0LXN5bWJvbC1udW1iZXJzICQxIFwKLQl8IHNvcnQKLSNlb2YKZGlmZiAtLWdpdCBhL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cCBiL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZWZzLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU3NzE4Zi4uMDAwMDAwMAotLS0gYS9nYXMvdGVzdHN1aXRlL2xpYi9nYXMtZGVmcy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzQgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCi0KLSMgUGxlYXNlIGVtYWlsIGFueSBidWdzLCBjb21tZW50cywgYW5kL29yIGFkZGl0aW9ucyB0byB0aGlzIGZpbGUgdG86Ci0jIERlamFHbnVAY3lnbnVzLmNvbQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBLZW4gUmFlYnVybiAocmFlYnVybkBjeWdudXMuY29tKS4KLQotcHJvYyBnYXNfdmVyc2lvbiB7fSB7Ci0gICAgZ2xvYmFsIEFTCi0gICAgY2F0Y2ggImV4ZWMgJEFTIC12ZXJzaW9uIDwgL2Rldi9udWxsIiB0bXAKLSAgICAjIFNob3VsZCBmaW5kIGEgd2F5IHRvIGRpc2NhcmQgY29uc3RhbnQgcGFydHMsIGtlZXAgd2hhdGV2ZXIncwotICAgICMgbGVmdCwgc28gdGhlIHZlcnNpb24gc3RyaW5nIGNvdWxkIGJlIGFsbW9zdCBhbnl0aGluZyBhdCBhbGwuLi4KLSAgICByZWdleHAgIlxbXlxuXF0qIChjeWdudXMtfCkoXFstMC05LmEtekEtWi1cXSspXFtcclxuXF0uKiIgJHRtcCB2ZXJzaW9uIGN5ZyBudW1iZXIKLSAgICBpZiAhW2luZm8gZXhpc3RzIG51bWJlcl0gdGhlbiB7Ci0gICAgICAgIHJldHVybiAiW3doaWNoICRBU10gKG5vIHZlcnNpb24gbnVtYmVyKVxuIgotICAgIH0KLSAgICBjbG9uZV9vdXRwdXQgIlt3aGljaCAkQVNdICRudW1iZXJcbiIKLSAgICB1bnNldCB2ZXJzaW9uCi19Ci0KLXByb2MgZ2FzX3J1biB7IHByb2cgYXNfb3B0cyByZWRpciB9IHsKLSAgICBnbG9iYWwgQVMKLSAgICBnbG9iYWwgQVNGTEFHUwotICAgIGdsb2JhbCBjb21wX291dHB1dAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgdmVyYm9zZSAiRXhlY3V0aW5nICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJGFzX29wdHMgJHNyY2Rpci8kc3ViZGlyLyRwcm9nICRyZWRpciIKLSAgICBjYXRjaCAiZXhlYyAkc3JjZGlyL2xpYi9ydW4gJEFTICRBU0ZMQUdTICRhc19vcHRzICRzcmNkaXIvJHN1YmRpci8kcHJvZyAkcmVkaXIiIGNvbXBfb3V0cHV0Ci0gICAgc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0gICAgdmVyYm9zZSAib3V0cHV0IHdhcyAkY29tcF9vdXRwdXQiCi0gICAgcmV0dXJuIFtsaXN0ICRjb21wX291dHB1dCAiIl07Ci19Ci0KLXByb2MgYWxsX29uZXMgeyBhcmdzIH0gewotICAgIGZvcmVhY2ggeCAkYXJncyB7IGlmIFtleHByICR4IT0xXSB7IHJldHVybiAwIH0gfQotICAgIHJldHVybiAxCi19Ci0KLXByb2MgZ2FzX3N0YXJ0IHsgcHJvZyBhc19vcHRzIH0gewotICAgIGdsb2JhbCBBUwotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIHZlcmJvc2UgIlN0YXJ0aW5nICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkcHJvZyIgMgotICAgIGNhdGNoIHsKLQlzcGF3biAtbm9lY2hvIC1ub3R0eWNvcHkgJHNyY2Rpci9saWIvcnVuICRBUyAkQVNGTEFHUyAkYXNfb3B0cyAkc3JjZGlyLyRzdWJkaXIvJHByb2cKLSAgICB9IGZvbwotICAgIGlmICFbcmVnZXhwIHteWzAtOV0rfSAkZm9vXSB0aGVuIHsKLQlwZXJyb3IgIkNhbid0IHJ1biAkc3ViZGlyLyRwcm9nOiAkZm9vIgotICAgIH0KLX0KLQotcHJvYyBnYXNfZmluaXNoIHsgfSB7Ci0gICAgZ2xvYmFsIHNwYXduX2lkCi0KLSAgICBjYXRjaCAiY2xvc2UiCi0gICAgY2F0Y2ggIndhaXQiCi19Ci0KLXByb2Mgd2FudF9ub19vdXRwdXQgeyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCXZlcmJvc2UgIiRjb21wX291dHB1dCIgMwotICAgIH0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAiJHRlc3RuYW1lIgotCXJldHVybiAxCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkdGVzdG5hbWUiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLXByb2MgZ2FzX3Rlc3Rfb2xkIHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0gewotICAgIGdhc19ydW4gJGZpbGUgJGFzX29wdHMgIiIKLSAgICByZXR1cm4gW3dhbnRfbm9fb3V0cHV0ICR0ZXN0bmFtZV0KLX0KLQotcHJvYyBnYXNfdGVzdCB7IGZpbGUgYXNfb3B0cyB2YXJfb3B0cyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIHNldCBpIDAKLSAgICBmb3JlYWNoIHdvcmQgJHZhcl9vcHRzIHsKLQlzZXQgaWdub3JlX3N0ZG91dCgkaSkgW3N0cmluZyBtYXRjaCAiKj4iICR3b3JkXQotCXNldCBvcHQoJGkpIFtzdHJpbmcgdHJpbSAkd29yZCB7Pn1dCi0JaW5jciBpCi0gICAgfQotICAgIHNldCBtYXggW2V4cHIgMTw8JGldCi0gICAgZm9yIHtzZXQgaSAwfSB7W2V4cHIgJGk8JG1heF19IHtpbmNyIGl9IHsKLQlzZXQgbWF5YmVfaWdub3JlX3N0ZG91dCAiIgotCXNldCBleHRyYV9vcHRzICIiCi0JZm9yIHtzZXQgYml0IDB9IHsoMTw8JGJpdCk8JG1heH0ge2luY3IgYml0fSB7Ci0JICAgIHNldCBudW0gW2V4cHIgMTw8JGJpdF0KLQkgICAgaWYgW2V4cHIgJGkmJG51bV0gdGhlbiB7Ci0JCXNldCBleHRyYV9vcHRzICIkZXh0cmFfb3B0cyAkb3B0KCRiaXQpIgotCQlpZiAkaWdub3JlX3N0ZG91dCgkYml0KSB0aGVuIHsKLQkJICAgIHNldCBtYXliZV9pZ25vcmVfc3Rkb3V0ICI+L2Rldi9udWxsIgotCQl9Ci0JICAgIH0KLQl9Ci0Jc2V0IGV4dHJhX29wdHMgW3N0cmluZyB0cmltICRleHRyYV9vcHRzXQotCWdhc19ydW4gJGZpbGUgIiRhc19vcHRzICRleHRyYV9vcHRzIiAkbWF5YmVfaWdub3JlX3N0ZG91dAotCi0JIyBTaG91bGQgSSBiZSBhYmxlIHRvIHVzZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaGVyZT8KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleHRyYV9vcHRzXSB0aGVuIHsKLQkgICAgd2FudF9ub19vdXRwdXQgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgd2FudF9ub19vdXRwdXQgIiR0ZXN0bmFtZSAoJGV4dHJhX29wdHMpIgotCX0KLSAgICB9Ci0gICAgaWYgW2luZm8gZXhpc3RzIGVycm9ySW5mb10gdGhlbiB7Ci0gICAgICAgIHVuc2V0IGVycm9ySW5mbwotICAgIH0KLX0KLQotcHJvYyBnYXNfdGVzdF9pZ25vcmVfc3Rkb3V0IHsgZmlsZSBhc19vcHRzIHRlc3RuYW1lIH0gewotICAgIGdsb2JhbCBjb21wX291dHB1dAotCi0gICAgZ2FzX3J1biAkZmlsZSAkYXNfb3B0cyAiPi9kZXYvbnVsbCIKLSAgICB3YW50X25vX291dHB1dCAkdGVzdG5hbWUKLX0KLQotcHJvYyBnYXNfdGVzdF9lcnJvciB7IGZpbGUgYXNfb3B0cyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgY29tcF9vdXRwdXQKLQotICAgIGdhc19ydW4gJGZpbGUgJGFzX29wdHMgIj4vZGV2L251bGwiCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGNvbXBfb3V0cHV0IiAzCi0gICAgfQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGNvbXBfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICIkdGVzdG5hbWUiCi0gICAgfSBlbHNlIHsKLQlwYXNzICIkdGVzdG5hbWUiCi0gICAgfQotfQotCi1wcm9jIGdhc19leGl0IHt9IHt9Ci0KLXByb2MgZ2FzX2luaXQgeyBhcmdzIH0gewotICAgIGdsb2JhbCB0YXJnZXRfY3B1Ci0gICAgZ2xvYmFsIHRhcmdldF9jcHVfZmFtaWx5Ci0gICAgZ2xvYmFsIHRhcmdldF9mYW1pbHkKLSAgICBnbG9iYWwgdGFyZ2V0X3ZlbmRvcgotICAgIGdsb2JhbCB0YXJnZXRfb3MKLSAgICBnbG9iYWwgc3Rkb3B0bGlzdAotCi0gICAgY2FzZSAiJHRhcmdldF9jcHUiIGluIHsKLQkibTY4Pz8/IgkJeyBzZXQgdGFyZ2V0X2NwdV9mYW1pbHkgbTY4ayB9Ci0JImlbMzRdODYiCQl7IHNldCB0YXJnZXRfY3B1X2ZhbWlseSBpMzg2IH0KLQlkZWZhdWx0CQkJeyBzZXQgdGFyZ2V0X2NwdV9mYW1pbHkgJHRhcmdldF9jcHUgfQotICAgIH0KLQotICAgIHNldCB0YXJnZXRfZmFtaWx5ICIkdGFyZ2V0X2NwdV9mYW1pbHktJHRhcmdldF92ZW5kb3ItJHRhcmdldF9vcyIKLSAgICBzZXQgc3Rkb3B0bGlzdCAiLWE+IgotCi0gICAgaWYgIVtpc3RhcmdldCAiKi0qLSoiXSB7Ci0JcGVycm9yICJUYXJnZXQgbmFtZSBbaXN0YXJnZXRdIGlzIG5vdCBhIHRyaXBsZS4iCi0gICAgfQotICAgICMgTmVlZCB0byByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotICAgIHJldHVybgotfQotCi0KLSMgcnVuX2R1bXBfdGVzdCBGSUxFIAotIwotIyBBc3NlbWJsZSBhIC5zIGZpbGUsIHRoZW4gcnVuIHNvbWUgdXRpbGl0eSBvbiBpdCBhbmQgY2hlY2sgdGhlIG91dHB1dC4KLSMgCi0jIFRoZXJlIHNob3VsZCBiZSBhbiBhc3NlbWJseSBsYW5ndWFnZSBmaWxlIG5hbWVkIEZJTEUucyBpbiB0aGUgdGVzdAotIyBzdWl0ZSBkaXJlY3RvcnksIGFuZCBhIHBhdHRlcm4gZmlsZSBjYWxsZWQgRklMRS5kLiAgYHJ1bl9kdW1wX3Rlc3QnCi0jIHdpbGwgYXNzZW1ibGUgRklMRS5zLCBydW4gc29tZSB0b29sIGxpa2UgYG9iamR1bXAnLCBgb2JqY29weScsIG9yCi0jIGBubScgb24gdGhlIC5vIGZpbGUgdG8gcHJvZHVjZSB0ZXh0dWFsIG91dHB1dCwgYW5kIHRoZW4gYW5hbHl6ZSB0aGF0Ci0jIHdpdGggcmVnZXhwcy4gIFRoZSBGSUxFLmQgZmlsZSBzcGVjaWZpZXMgd2hhdCBwcm9ncmFtIHRvIHJ1biwgYW5kCi0jIHdoYXQgdG8gZXhwZWN0IGluIGl0cyBvdXRwdXQuCi0jCi0jIFRoZSBGSUxFLmQgZmlsZSBiZWdpbnMgd2l0aCB6ZXJvIG9yIG1vcmUgb3B0aW9uIGxpbmVzLCB3aGljaCBzcGVjaWZ5Ci0jIGZsYWdzIHRvIHBhc3MgdG8gdGhlIGFzc2VtYmxlciwgdGhlIHByb2dyYW0gdG8gcnVuIHRvIGR1bXAgdGhlCi0jIGFzc2VtYmxlcidzIG91dHB1dCwgYW5kIHRoZSBvcHRpb25zIGl0IHdhbnRzLiAgVGhlIG9wdGlvbiBsaW5lcyBoYXZlCi0jIHRoZSBzeW50YXg6Ci0jIAotIyAgICAgICAgICMgT1BUSU9OOiBWQUxVRQotIyAKLSMgT1BUSU9OIGlzIHRoZSBuYW1lIG9mIHNvbWUgb3B0aW9uLCBsaWtlICJuYW1lIiBvciAib2JqZHVtcCIsIGFuZAotIyBWQUxVRSBpcyBPUFRJT04ncyB2YWx1ZS4gIFRoZSB2YWxpZCBvcHRpb25zIGFyZSBkZXNjcmliZWQgYmVsb3cuCi0jIFdoaXRlc3BhY2UgaXMgaWdub3JlZCBldmVyeXdoZXJlLCBleGNlcHQgd2l0aGluIFZBTFVFLiAgVGhlIG9wdGlvbgotIyBsaXN0IGVuZHMgd2l0aCB0aGUgZmlyc3QgbGluZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIGFib3ZlIHN5bnRheAotIyAoaG1tLCBub3QgZ3JlYXQgZm9yIGVycm9yIGRldGVjdGlvbikuCi0jCi0jIFRoZSBpbnRlcmVzdGluZyBvcHRpb25zIGFyZToKLSMgCi0jICAgbmFtZTogVEVTVC1OQU1FCi0jCVRoZSBuYW1lIG9mIHRoaXMgdGVzdCwgcGFzc2VkIHRvIERlamFHTlUncyBgcGFzcycgYW5kIGBmYWlsJwotIyAgICAgICBjb21tYW5kcy4gIElmIG9taXR0ZWQsIHRoaXMgZGVmYXVsdHMgdG8gRklMRSwgdGhlIHJvb3Qgb2YgdGhlCi0jICAgICAgIC5zIGFuZCAuZCBmaWxlcycgbmFtZXMuCi0jIAotIyAgIGFzOiBGTEFHUwotIwlXaGVuIGFzc2VtYmxpbmcgRklMRS5zLCBwYXNzIEZMQUdTIHRvIHRoZSBhc3NlbWJsZXIuCi0jIAotIyAgIFBST0c6IFBST0dSQU0tTkFNRQotIyAgICAgICBUaGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB0byBydW4gdG8gYW5hbHl6ZSB0aGUgLm8gZmlsZSBwcm9kdWNlZAotIyAgICAgICBieSB0aGUgYXNzZW1ibGVyLiAgVGhpcyBjYW4gYmUgb21pdHRlZDsgcnVuX2R1bXBfdGVzdCB3aWxsIGd1ZXNzCi0jICAgICAgIHdoaWNoIHByb2dyYW0gdG8gcnVuIGJ5IHNlZWluZyB3aGljaCBvZiB0aGUgZmxhZ3Mgb3B0aW9ucyBiZWxvdwotIwlpcyBwcmVzZW50LgotIyAKLSMgICBvYmpkdW1wOiBGTEFHUwotIyAgIG5tOiBGTEFHUwotIyAgIG9iamNvcHk6IEZMQUdTCi0jCVVzZSB0aGUgc3BlY2lmaWVkIHByb2dyYW0gdG8gYW5hbHl6ZSB0aGUgLm8gZmlsZSwgYW5kIHBhc3MgaXQKLSMJRkxBR1MsIGluIGFkZGl0aW9uIHRvIHRoZSAubyBmaWxlIG5hbWUuCi0jCi0jICAgc291cmNlOiBTT1VSQ0UKLSMJQXNzZW1ibGUgdGhlIGZpbGUgU09VUkNFLnMuICBJZiBvbWl0dGVkLCB0aGlzIGRlZmF1bHRzIHRvIEZJTEUucy4KLSMgICAgICAgVGhpcyBpcyB1c2VmdWwgaWYgc2V2ZXJhbCAuZCBmaWxlcyB3YW50IHRvIHNoYXJlIGEgLnMgZmlsZS4KLSMKLSMgRWFjaCBvcHRpb24gbWF5IG9jY3VyIGF0IG1vc3Qgb25jZS4KLSMKLSMgQWZ0ZXIgdGhlIG9wdGlvbiBsaW5lcyBjb21lIHJlZ2V4cCBsaW5lcy4gIGBydW5fZHVtcF90ZXN0JyBjYWxscwotIyBgcmVnZXhwX2RpZmYnIHRvIGNvbXBhcmUgdGhlIG91dHB1dCBvZiB0aGUgZHVtcGluZyB0b29sIGFnYWluc3QgdGhlCi0jIHJlZ2V4cHMgaW4gRklMRS5kLiAgYHJlZ2V4cF9kaWZmJyBpcyBkZWZpbmVkIGxhdGVyIGluIHRoaXMgZmlsZTsgc2VlCi0jIGZ1cnRoZXIgY29tbWVudHMgdGhlcmUuCi0KLXByb2MgcnVuX2R1bXBfdGVzdCB7IG5hbWUgfSB7Ci0gICAgZ2xvYmFsIHN1YmRpciBzcmNkaXIKLSAgICBnbG9iYWwgT0JKRFVNUCBOTSBBUyBPQkpDT1BZCi0gICAgZ2xvYmFsIE9CSkRVTVBGTEFHUyBOTUZMQUdTIEFTRkxBR1MgT0JKQ09QWUZMQUdTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiKi8qIiAkbmFtZV0gewotCXNldCBmaWxlICRuYW1lCi0Jc2V0IG5hbWUgW2ZpbGUgdGFpbCAkbmFtZV0KLSAgICB9IGVsc2UgewotCXNldCBmaWxlICIkc3JjZGlyLyRzdWJkaXIvJG5hbWUiCi0gICAgfQotICAgIHNldCBvcHRfYXJyYXkgW3NsdXJwX29wdGlvbnMgIiR7ZmlsZX0uZCJdCi0gICAgaWYgeyAkb3B0X2FycmF5ID09IC0xIH0gewotCXVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCXJldHVybgotICAgIH0KLSAgICBzZXQgb3B0cyhhcykge30KLSAgICBzZXQgb3B0cyhvYmpkdW1wKSB7fQotICAgIHNldCBvcHRzKG5tKSB7fQotICAgIHNldCBvcHRzKG9iamNvcHkpIHt9Ci0gICAgc2V0IG9wdHMobmFtZSkge30KLSAgICBzZXQgb3B0cyhQUk9HKSB7fQotICAgIHNldCBvcHRzKHNvdXJjZSkge30KLQotICAgIGZvcmVhY2ggaSAkb3B0X2FycmF5IHsKLQlzZXQgb3B0X25hbWUgW2xpbmRleCAkaSAwXQotCXNldCBvcHRfdmFsIFtsaW5kZXggJGkgMV0KLQlpZiAhW2luZm8gZXhpc3RzIG9wdHMoJG9wdF9uYW1lKV0gewotCSAgICBwZXJyb3IgInVua25vd24gb3B0aW9uICRvcHRfbmFtZSBpbiBmaWxlICRmaWxlLmQiCi0JICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCSAgICByZXR1cm4KLQl9Ci0JaWYgW3N0cmluZyBsZW5ndGggJG9wdHMoJG9wdF9uYW1lKV0gewotCSAgICBwZXJyb3IgIm9wdGlvbiAkb3B0X25hbWUgbXVsdGlwbHkgc2V0IGluICRmaWxlLmQiCi0JICAgIHVucmVzb2x2ZWQgJHN1YmRpci8kbmFtZQotCSAgICByZXR1cm4KLQl9Ci0Jc2V0IG9wdHMoJG9wdF9uYW1lKSAkb3B0X3ZhbAotICAgIH0KLQotICAgIGlmIHskb3B0cyhQUk9HKSAhPSAiIn0gewotCXN3aXRjaCAtLSAkb3B0cyhQUk9HKSB7Ci0JICAgIG9iamR1bXAKLQkJeyBzZXQgcHJvZ3JhbSBvYmpkdW1wIH0KLQkgICAgbm0KLQkJeyBzZXQgcHJvZ3JhbSBubSB9Ci0JICAgIG9iamNvcHkKLQkJeyBzZXQgcHJvZ3JhbSBvYmpjb3B5IH0KLQkgICAgZGVmYXVsdAotCQl7IHBlcnJvciAidW5yZWNvZ25pemVkIHByb2dyYW0gb3B0aW9uICRvcHRzKFBST0cpIGluICRmaWxlLmQiCi0JCSAgdW5yZXNvbHZlZCAkc3ViZGlyLyRuYW1lCi0JCSAgcmV0dXJuIH0KLQl9Ci0gICAgfSBlbHNlIHsKLQkjIEd1ZXNzIHdoaWNoIHByb2dyYW0gdG8gcnVuLCBieSBzZWVpbmcgd2hpY2ggb3B0aW9uIHdhcyBzcGVjaWZpZWQuCi0Jc2V0IHByb2dyYW0gIiIKLQlmb3JlYWNoIHAge29iamR1bXAgb2JqY29weSBubX0gewotCSAgICBpZiB7JG9wdHMoJHApICE9ICIifSB7Ci0JCWlmIHskcHJvZ3JhbSAhPSAiIn0gewotCQkgICAgcGVycm9yICJhbWJpZ3VvdXMgZHVtcCBwcm9ncmFtIGluICRmaWxlLmQiCi0JCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkJICAgIHJldHVybgotCQl9IGVsc2UgewotCQkgICAgc2V0IHByb2dyYW0gJHAKLQkJfQotCSAgICB9Ci0JfQotCWlmIHskcHJvZ3JhbSA9PSAiIn0gewotCSAgICBwZXJyb3IgImR1bXAgcHJvZ3JhbSB1bnNwZWNpZmllZCBpbiAkZmlsZS5kIgotCSAgICB1bnJlc29sdmVkICRzdWJkaXIvJG5hbWUKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLQotICAgIHNldCBwcm9nb3B0czEgJG9wdHMoJHByb2dyYW0pCi0gICAgZXZhbCBzZXQgcHJvZ29wdHMgXCRbc3RyaW5nIHRvdXBwZXIgJHByb2dyYW1dRkxBR1MKLSAgICBldmFsIHNldCBiaW5hcnkgXCRbc3RyaW5nIHRvdXBwZXIgJHByb2dyYW1dCi0gICAgaWYgeyAkb3B0cyhuYW1lKSA9PSAiIiB9IHsKLQlzZXQgdGVzdG5hbWUgIiRzdWJkaXIvJG5hbWUiCi0gICAgfSBlbHNlIHsKLQlzZXQgdGVzdG5hbWUgJG9wdHMobmFtZSkKLSAgICB9Ci0KLSAgICBpZiB7ICRvcHRzKHNvdXJjZSkgPT0gIiIgfSB7Ci0Jc2V0IHNvdXJjZWZpbGUgJHtmaWxlfS5zCi0gICAgfSBlbHNlIHsKLQlzZXQgc291cmNlZmlsZSAkc3JjZGlyLyRzdWJkaXIvJG9wdHMoc291cmNlKQotICAgIH0KLQotICAgIHNlbmRfbG9nICIkQVMgJEFTRkxBR1MgJG9wdHMoYXMpIC1vIGR1bXAubyAkc291cmNlZmlsZVxuIgotICAgIGNhdGNoICJleGVjICRzcmNkaXIvbGliL3J1biAkQVMgJEFTRkxBR1MgJG9wdHMoYXMpIC1vIGR1bXAubyAkc291cmNlZmlsZSIgY29tcF9vdXRwdXQKLSAgICBzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRjb21wX291dHB1dF0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRjb21wX291dHB1dFxuIgotCXZlcmJvc2UgIiRjb21wX291dHB1dCIgMwotCWZhaWwgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyBbd2hpY2ggJGJpbmFyeV0gPT0gMCB9IHsKLQl1bnRlc3RlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiB7ICRwcm9nb3B0czEgPT0gIiIgfSB7IHNldCAkcHJvZ29wdHMxICItciIgfQotICAgIHZlcmJvc2UgInJ1bm5pbmcgJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSIgMwotCi0gICAgIyBPYmpjb3B5LCB1bmxpa2UgdGhlIG90aGVyIHR3bywgd29uJ3Qgc2VuZCBpdHMgb3V0cHV0IHRvIHN0ZG91dCwKLSAgICAjIHNvIHdlIGhhdmUgdG8gcnVuIGl0IHNwZWNpYWxseS4KLSAgICBpZiB7ICRwcm9ncmFtID09ICJvYmpjb3B5IiB9IHsKLQlzZW5kX2xvZyAiJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gZHVtcC5vdXRcbiIKLQljYXRjaCAiZXhlYyAkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIGR1bXAubyBkdW1wLm91dCIgY29tcF9vdXRwdXQKLQlzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkYmluYXJ5ICRwcm9nb3B0cyAkcHJvZ29wdHMxIGR1bXAubyA+IGR1bXAub3V0XG4iCi0JY2F0Y2ggImV4ZWMgJGJpbmFyeSAkcHJvZ29wdHMgJHByb2dvcHRzMSBkdW1wLm8gPiBkdW1wLm91dCIgY29tcF9vdXRwdXQKLQlzZXQgY29tcF9vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRjb21wX291dHB1dF0KLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkY29tcF9vdXRwdXRdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiJGNvbXBfb3V0cHV0XG4iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICB2ZXJib3NlX2V2YWwge1tmaWxlX2NvbnRlbnRzICJkdW1wLm91dCJdfSAzCi0gICAgaWYgeyBbcmVnZXhwX2RpZmYgImR1bXAub3V0IiAiJHtmaWxlfS5kIl0gfSB0aGVuIHsKLQlmYWlsICR0ZXN0bmFtZQotCXZlcmJvc2UgIm91dHB1dCBpcyBbZmlsZV9jb250ZW50cyAiZHVtcC5vdXQiXSIgMgotCXJldHVybgotICAgIH0KLQotICAgIHBhc3MgJHRlc3RuYW1lCi19Ci0KLXByb2Mgc2x1cnBfb3B0aW9ucyB7IGZpbGUgfSB7Ci0gICAgaWYgW2NhdGNoIHsgc2V0IGYgW29wZW4gJGZpbGUgcl0gfSB4XSB7Ci0JI3BlcnJvciAiY291bGRuJ3Qgb3BlbiBgJGZpbGUnOiAkeCIKLQlwZXJyb3IgIiR4IgotCXJldHVybiAtMQotICAgIH0KLSAgICBzZXQgb3B0X2FycmF5IHt9Ci0gICAgIyB3aGl0ZXNwYWNlIGV4cHJlc3Npb24KLSAgICBzZXQgd3MgIHtbIAldKn0KLSAgICBzZXQgbndzIHtbXiAJXSp9Ci0gICAgIyB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQgYW55d2hlcmUgZXhjZXB0IHdpdGhpbiB0aGUgb3B0aW9ucyBsaXN0OwotICAgICMgb3B0aW9uIG5hbWVzIGFyZSBhbHBoYWJldGljIG9ubHkKLSAgICBzZXQgcGF0ICJeIyR7d3N9KFxbYS16QS1aXF0qKSR3czoke3dzfSguKikkd3NcJCIKLSAgICB3aGlsZSB7IFtnZXRzICRmIGxpbmVdICE9IC0xIH0gewotCXNldCBsaW5lIFtzdHJpbmcgdHJpbSAkbGluZV0KLQkjIFdoaXRlc3BhY2UgaGVyZSBpcyBzcGFjZS10YWIuCi0JaWYgW3JlZ2V4cCAkcGF0ICRsaW5lIHh4eCBvcHRfbmFtZSBvcHRfdmFsXSB7Ci0JICAgICMgbWF0Y2ghCi0JICAgIGxhcHBlbmQgb3B0X2FycmF5IFtsaXN0ICRvcHRfbmFtZSAkb3B0X3ZhbF0KLQl9IGVsc2UgewotCSAgICBicmVhawotCX0KLSAgICB9Ci0gICAgY2xvc2UgJGYKLSAgICByZXR1cm4gJG9wdF9hcnJheQotfQotCi1wcm9jIG9iamR1bXAgeyBvcHRzIH0gewotICAgIGdsb2JhbCBPQkpEVU1QCi0gICAgZ2xvYmFsIGNvbXBfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgY2F0Y2ggImV4ZWMgJE9CSkRVTVAgJG9wdHMiIGNvbXBfb3V0cHV0Ci0gICAgc2V0IGNvbXBfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkY29tcF9vdXRwdXRdCi0gICAgdmVyYm9zZSAib2JqZHVtcCBvdXRwdXQ9JGNvbXBfb3V0cHV0XG4iIDMKLX0KLQotcHJvYyBvYmpkdW1wX3N0YXJ0X25vX3N1YmRpciB7IHByb2cgb3B0cyB9IHsKLSAgICBnbG9iYWwgT0JKRFVNUAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIHZlcmJvc2UgIlN0YXJ0aW5nICRPQkpEVU1QICRvcHRzICRwcm9nIiAyCi0gICAgY2F0Y2ggewotCXNwYXduIC1ub2VjaG8gLW5vdHR5aW5pdCAkc3JjZGlyL2xpYi9ydW4gJE9CSkRVTVAgJG9wdHMgJHByb2cKLSAgICB9IGZvbwotICAgIGlmICFbcmVnZXhwIHteWzAtOV0rfSAkZm9vXSB0aGVuIHsKLQlwZXJyb3IgIkNhbid0IHJ1biAkcHJvZzogJGZvbyIKLSAgICB9Ci19Ci0KLXByb2Mgb2JqZHVtcF9maW5pc2ggeyB9IHsKLSAgICBnbG9iYWwgc3Bhd25faWQKLQotICAgIGNhdGNoICJjbG9zZSIKLSAgICBjYXRjaCAid2FpdCIKLX0KLQotIyBEZWZhdWx0IHRpbWVvdXQgaXMgMTAgc2Vjb25kcywgbG9zZXMgb24gYSBzbG93IG1hY2hpbmUuICBCdXQgc29tZQotIyBjb25maWd1cmF0aW9ucyBvZiBkZWphZ251IG1heSBvdmVycmlkZSBpdC4KLWlmIHskdGltZW91dDwxMjB9IHRoZW4geyBzZXQgdGltZW91dCAxMjAgfQotCi1leHBlY3RfYWZ0ZXIgLWkgewotICAgIHRpbWVvdXQJCQl7IHBlcnJvciAidGltZW91dCIgfQotICAgICJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiCXsgcGVycm9yICJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiIH0KLSAgICBidWZmZXJfZnVsbAkJCXsgcGVycm9yICJidWZmZXIgZnVsbCIgfQotICAgIGVvZgkJCQl7IHBlcnJvciAiZW9mIiB9Ci19Ci0KLSMgcmVnZXhwX2RpZmYsIGJhc2VkIG9uIHNpbXBsZV9kaWZmIHRha2VuIGZyb20gbGQgdGVzdCBzdWl0ZQotIwljb21wYXJlcyB0d28gZmlsZXMgbGluZS1ieS1saW5lCi0jCWZpbGUxIGNvbnRhaW5zIHN0cmluZ3MsIGZpbGUyIGNvbnRhaW5zIHJlZ2V4cHMgYW5kICMtY29tbWVudHMKLSMJYmxhbmsgbGluZXMgYXJlIGlnbm9yZWQgaW4gZWl0aGVyIGZpbGUKLSMJcmV0dXJucyBub24temVybyBpZiBkaWZmZXJlbmNlcyBleGlzdAotIwotcHJvYyByZWdleHBfZGlmZiB7IGZpbGVfMSBmaWxlXzIgfSB7Ci0KLSAgICBzZXQgZW9mIC0xCi0gICAgc2V0IGVuZF8xIDAKLSAgICBzZXQgZW5kXzIgMAotICAgIHNldCBkaWZmZXJlbmNlcyAwCi0gICAgc2V0IGRpZmZfcGFzcyAwCi0KLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7Ci0Jc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCi0gICAgfSBlbHNlIHsKLQl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCi0JcmV0dXJuIDEKLSAgICB9Ci0KLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMl0gdGhlbiB7Ci0Jc2V0IGZpbGVfYiBbb3BlbiAkZmlsZV8yIHJdCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkZmlsZV8yIGRvZXNuJ3QgZXhpc3QiCi0JY2xvc2UgJGZpbGVfYQotCXJldHVybiAxCi0gICAgfQotCi0gICAgdmVyYm9zZSAiIFJlZ2V4cC1kaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yIiAyCi0KLSAgICB3aGlsZSB7IDEgfSB7Ci0Jc2V0IGxpbmVfYSAiIgotCXNldCBsaW5lX2IgIiIKLQl3aGlsZSB7IFtzdHJpbmcgbGVuZ3RoICRsaW5lX2FdID09IDAgfSB7Ci0JICAgIGlmIHsgW2dldHMgJGZpbGVfYSBsaW5lX2FdID09ICRlb2YgfSB7Ci0JCXNldCBlbmRfMSAxCi0JCWJyZWFrCi0JICAgIH0KLQl9Ci0Jd2hpbGUgeyBbc3RyaW5nIGxlbmd0aCAkbGluZV9iXSA9PSAwIHx8IFtzdHJpbmcgbWF0Y2ggIiMqIiAkbGluZV9iXSB9IHsKLQkgICAgaWYgWyBzdHJpbmcgbWF0Y2ggIiNwYXNzIiAkbGluZV9iIF0gewotCQlzZXQgZW5kXzIgMQotCQlzZXQgZGlmZl9wYXNzIDEKLQkJYnJlYWsKLQkgICAgfQotCSAgICBpZiB7IFtnZXRzICRmaWxlX2IgbGluZV9iXSA9PSAkZW9mIH0gewotCQlzZXQgZW5kXzIgMQotCQlicmVhawotCSAgICB9Ci0JfQotCi0gICAgICAgIGlmIHsgJGRpZmZfcGFzcyB9IHsgCi0gICAgICAgICAgICBicmVhayAKLSAgICAgICAgfSBlbHNlaWYgeyAkZW5kXzEgJiYgJGVuZF8yIH0geyAKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZWlmIHsgJGVuZF8xIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzFcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImV4dHJhIHJlZ2V4cHMgaW4gJGZpbGVfMiBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2IkXCJcbkVPRiBmcm9tICRmaWxlXzEiIDMKLSAgICAgICAgICAgIHNldCBkaWZmZXJlbmNlcyAxCi0gICAgICAgICAgICBicmVhawotICAgICAgICB9IGVsc2VpZiB7ICRlbmRfMiB9IHsKLSAgICAgICAgICAgIHNlbmRfbG9nICJleHRyYSBsaW5lcyBpbiAkZmlsZV8xIHN0YXJ0aW5nIHdpdGggXCJeJGxpbmVfYSRcIlxuRU9GIGZyb20gJGZpbGVfMlxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZXh0cmEgbGluZXMgaW4gJGZpbGVfMSBzdGFydGluZyB3aXRoIFwiXiRsaW5lX2EkXCJcbkVPRiBmcm9tICRmaWxlXzJcbiIgMwotICAgICAgICAgICAgc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZXJib3NlICJyZWdleHAgXCJeJGxpbmVfYiRcIlxubGluZSAgIFwiJGxpbmVfYVwiIiAzCi0gICAgICAgICAgICBpZiAhW3JlZ2V4cCAiXiRsaW5lX2IkIiAiJGxpbmVfYSJdIHsKLQkJc2VuZF9sb2cgInJlZ2V4cF9kaWZmIG1hdGNoIGZhaWx1cmVcbiIKLQkJc2VuZF9sb2cgInJlZ2V4cCBcIl4kbGluZV9iJFwiXG5saW5lICAgXCIkbGluZV9hXCJcbiIKLQkJc2V0IGRpZmZlcmVuY2VzIDEKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgeyAkZGlmZmVyZW5jZXMgPT0gMCAmJiAhJGRpZmZfcGFzcyAmJiBbZW9mICRmaWxlX2FdICE9IFtlb2YgJGZpbGVfYl0gfSB7Ci0Jc2VuZF9sb2cgIiRmaWxlXzEgYW5kICRmaWxlXzIgYXJlIGRpZmZlcmVudCBsZW5ndGhzXG4iCi0JdmVyYm9zZSAiJGZpbGVfMSBhbmQgJGZpbGVfMiBhcmUgZGlmZmVyZW50IGxlbmd0aHMiIDMKLQlzZXQgZGlmZmVyZW5jZXMgMQotICAgIH0KLQotICAgIGNsb3NlICRmaWxlX2EKLSAgICBjbG9zZSAkZmlsZV9iCi0KLSAgICByZXR1cm4gJGRpZmZlcmVuY2VzCi19Ci0KLXByb2MgZmlsZV9jb250ZW50cyB7IGZpbGVuYW1lIH0gewotICAgIHNldCBmaWxlIFtvcGVuICRmaWxlbmFtZSByXQotICAgIHNldCBjb250ZW50cyBbcmVhZCAkZmlsZV0KLSAgICBjbG9zZSAkZmlsZQotICAgIHJldHVybiAkY29udGVudHMKLX0KLQotcHJvYyB2ZXJib3NlX2V2YWwgeyBleHByIHsgbGV2ZWwgMSB9IH0gewotICAgIGdsb2JhbCB2ZXJib3NlCi0gICAgaWYgJHZlcmJvc2U+JGxldmVsIHRoZW4geyBldmFsIHZlcmJvc2UgIiRleHByIiAkbGV2ZWwgfQotfQotCi0jIFRoaXMgZGVmaW5pdGlvbiBpcyB0YWtlbiBmcm9tIGFuIHVucmVsZWFzZWQgdmVyc2lvbiBvZiBEZWphR251LiAgT25jZQotIyB0aGF0IHZlcnNpb24gZ2V0cyByZWxlYXNlZCwgYW5kIGhhcyBiZWVuIG91dCBpbiB0aGUgd29ybGQgZm9yIGEgZmV3Ci0jIG1vbnRocyBhdCBsZWFzdCwgaXQgbWF5IGJlIHNhZmUgdG8gZGVsZXRlIHRoaXMgY29weS4KLWlmICFbc3RyaW5nIGxlbmd0aCBbaW5mbyBwcm9jIHBydW5lX3dhcm5pbmdzXV0gewotICAgICMKLSAgICAjIHBydW5lX3dhcm5pbmdzIC0tIGRlbGV0ZSB2YXJpb3VzIHN5c3RlbSB2ZXJib3NpdGllcyBmcm9tIFRFWFQuCi0gICAgIwotICAgICMgQW4gZXhhbXBsZSBpczoKLSAgICAjIGxkLnNvOiB3YXJuaW5nOiAvdXNyL2xpYi9saWJjLnNvLjEuOC4xIGhhcyBvbGRlciByZXZpc2lvbiB0aGFuIGV4cGVjdGVkIDkKLSAgICAjCi0gICAgIyBTaXRlcyB3aXRoIHBhcnRpY3VsYXIgdmVyYm9zZSBvcydzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gc2l0ZS5leHAuCi0gICAgIwotICAgIHByb2MgcHJ1bmVfd2FybmluZ3MgeyB0ZXh0IH0gewotCSMgVGhpcyBpcyBmcm9tIHN1bjQncy4gIERvIGl0IGZvciBhbGwgbWFjaGluZXMgZm9yIG5vdy4KLQkjIFRoZSAiXFwxIiBpcyB0byB0cnkgdG8gcHJlc2VydmUgYSAiXG4iIGJ1dCBvbmx5IGlmIG5lY2Vzc2FyeS4KLQlyZWdzdWIgLWFsbCAiKF58XG4pKGxkLnNvOiB3YXJuaW5nOlxbXlxuXF0qXG4/KSsiICR0ZXh0ICJcXDEiIHRleHQKLQotCSMgSXQgbWlnaHQgYmUgdGVtcHRpbmcgdG8gZ2V0IGNhcnJpZWQgYXdheSBhbmQgZGVsZXRlIGJsYW5rIGxpbmVzLCBldGMuCi0JIyBKdXN0IGRlbGV0ZSAqZXhhY3RseSogd2hhdCB3ZSdyZSBhc2sgdG8sIGFuZCB0aGF0J3MgaXQuCi0JcmV0dXJuICR0ZXh0Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRnLmV4cCBiL2dhcy90ZXN0c3VpdGUvbGliL2dhcy1kZy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjdmMzEuLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvZ2FzLWRnLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSMgRGVmaW5lIGdhcyBjYWxsYmFja3MgZm9yIGRnLmV4cC4KLQotbG9hZF9saWIgZGcuZXhwCi0KLSMgVGhlIHVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHN0aWxsIGluIGEgYml0IG9mIGZsdXguCi0jIEl0IHNob3VsZCBiZSB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIGFzc2VtYmxlLCBsaW5rLCBhbmQgcnVuIGEgZmlsZQotIyBidXQgd2UgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgdGhhdC4gIEFzc2VtYmxlciB0ZXN0Y2FzZXMgYXJlbid0IHVzdWFsbHkKLSMgdGhhdCBlbGFib3JhdGUgYW55d2F5LiAgOi0pCi0KLXByb2MgZ2FzLWRnLXRlc3QgeyBwcm9nIGRvX3doYXQgdG9vbF9mbGFncyB9IHsKLSAgICAjIEZJWE1FOiB0aGUgZ2FzIHRlc3RzdWl0ZSBkb2Vzbid0IGRlZmluZSB0bXBkaXIuICBVc2Ugb3V0ZGlyPwotICAgIHNldCBvdXRwdXRfZmlsZSAiLi9hLm91dCIKLQotICAgIHN3aXRjaCAkZG9fd2hhdCB7Ci0JInByZXByb2Nlc3MiIHsKLQl9Ci0JImFzc2VtYmxlIiB7Ci0JfQotCSJsaW5rIiB7Ci0JfQotCSJydW4iIHsKLQkgICAgIyBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHdlIGNhcmUgaWYgYW4gZXhlY3V0YWJsZSB3YXMKLQkgICAgIyBjcmVhdGVkIG9yIG5vdC4gIElmIGl0IHdhcywgZGcuZXhwIHdpbGwgdHJ5IHRvIHJ1biBpdC4KLQkgICAgY2F0Y2ggImV4ZWMgcm0gLWYgJG91dHB1dF9maWxlIgotCX0KLQlkZWZhdWx0IHsKLQkgICAgcGVycm9yICIkZG9fd2hhdDogbm90IGEgdmFsaWQgZGctZG8ga2V5d29yZCIKLQkgICAgcmV0dXJuICIiCi0JfQotICAgIH0KLQotICAgICMgZ2FzX3N0YXJ0IHByZXBlbmRzICRzcmNkaXIvJHN1YmRpciBzbyB3ZSBtdXN0IHJlbW92ZSBpdCBmcm9tIFBST0cKLSAgICAjIGlmIHByZXNlbnQuICBGaXJzdCByZW1vdmUgZXh0cmFuZW91cyAvLydzLgotICAgIGdsb2JhbCBzcmNkaXIgc3ViZGlyCi0gICAgc2V0IGRpciAiJHNyY2Rpci8kc3ViZGlyIgotICAgIHJlZ3N1YiAtYWxsICIvLyIgJGRpciAiLyIgZGlyCi0gICAgcmVnc3ViIC1hbGwgIi8vIiAkcHJvZyAiLyIgcHJvZwotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiRkaXIvKiIgJHByb2ddIHsKLQlyZWdzdWIgIiRkaXIiICRwcm9nICIiIHByb2cKLSAgICB9Ci0KLSAgICAjIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBnYXNfc3RhcnQgYnV0IGl0IGRvZXNuJ3Qgc2V0IGNvbXBfb3V0cHV0LgotICAgIHJldHVybiBbZ2FzX3J1biAkcHJvZyAkdG9vbF9mbGFncyAiIl0KLX0KLQotcHJvYyBnYXMtZGctcHJ1bmUgeyBzeXN0ZW0gdGV4dCB9IHsKLSAgICAjc2VuZF91c2VyICJCZWZvcmU6JHRleHRcbiIKLSAgICByZWdzdWIgLWFsbCAiKF58XG4pXFteXG5cXSo6IEFzc2VtYmxlciBtZXNzYWdlczpcW15cblxdKiIgJHRleHQgIiIgdGV4dAotICAgIHJlZ3N1YiAtYWxsICIoXnxcbilcW15cblxdKjogRW5kIG9mIGZpbGUgbm90IGF0IGVuZFxbXlxuXF0qTmV3bGluZSBpbnNlcnRlZC4iICR0ZXh0ICIiIHRleHQKLSAgICAjc2VuZF91c2VyICJBZnRlcjokdGV4dFxuIgotCi0gICAgcmV0dXJuICR0ZXh0Ci19CmRpZmYgLS1naXQgYS9nYXMvdGVzdHN1aXRlL2xpYi9ydW4gYi9nYXMvdGVzdHN1aXRlL2xpYi9ydW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0MTUwZjguLjAwMDAwMDAKLS0tIGEvZ2FzL3Rlc3RzdWl0ZS9saWIvcnVuCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jIS9iaW4vc2gKLWV2YWwgZXhlYyAkQApkaWZmIC0tZ2l0IGEvZ2FzL3Ztc2NvbmYuc2ggYi9nYXMvdm1zY29uZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0NTM4YS4uMDAwMDAwMAotLS0gYS9nYXMvdm1zY29uZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0jIS9iaW4vc2gKLQotY2F0IDw8ICdFT0YnCi0kIW1ha2UtZ2FzLmNvbQotJCEgU2V0IHRoZSBkZWYgZGlyIHRvIHByb3BlciBwbGFjZSBmb3IgdXNlIGluIGJhdGNoLiBXb3JrcyBmb3IgaW50ZXJhY3RpdmUgdG8uCi0kZmxubSA9IGYkZW52aXJvbWVudCgiUFJPQ0VEVVJFIikgICAgICEgZ2V0IGN1cnJlbnQgcHJvY2VkdXJlIG5hbWUKLSRzZXQgZGVmYXVsdCAnZiRwYXJzZShmbG5tLCwsIkRFVklDRSIpJydmJHBhcnNlKGZsbm0sLCwiRElSRUNUT1JZIiknCi0kdiA9ICdmJHZlcmlmeSgwKScKLSQhCi0kIQlDb21tYW5kIGZpbGUgdG8gYnVpbGQgYSBHTlUgYXNzZW1ibGVyIG9uIFZNUwotJCEKLSQhCUlmIHlvdSBhcmUgdXNpbmcgYSB2ZXJzaW9uIG9mIEdDQyB0aGF0IHN1cHBvcnRzIGdsb2JhbCBjb25zdGFudHMKLSQhCXlvdSBzaG91bGQgcmVtb3ZlIHRoZSBkZWZpbmU9ImNvbnN0PSIgZnJvbSB0aGUgZ2NjIGxpbmVzLgotJCEKLSQhCUNhdXRpb246ICBWZXJzaW9ucyAxLjM4LjEgYW5kIGVhcmxpZXIgaGFkIGEgYnVnIGluIHRoZSBoYW5kbGluZyBvZgotJCEJc29tZSBzdGF0aWMgY29uc3RhbnRzLiBJZiB5b3UgYXJlIHVzaW5nIHN1Y2ggYSB2ZXJzaW9uIG9mIHRoZQotJCEJYXNzZW1ibGVyLCBhbmQgeW91IHdpc2ggdG8gY29tcGlsZSB3aXRob3V0IHRoZSAiY29uc3Q9IiBoYWNrLAotJCEJeW91IHNob3VsZCBmaXJzdCBidWlsZCB0aGlzIHZlcnNpb24gKndpdGgqIHRoZSAiY29uc3Q9IgotJCEJZGVmaW5pdGlvbiwgYW5kIHRoZW4gdXNlIHRoYXQgYXNzZW1ibGVyIHRvIHJlYnVpbGQgaXQgd2l0aG91dCB0aGUKLSQhCSJjb25zdD0iIGRlZmluaXRpb24uICBGYWlsdXJlIHRvIGRvIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gYXNzZW1ibGVyCi0kIQl0aGF0IHdpbGwgbXVuZyBmbG9hdGluZyBwb2ludCBjb25zdGFudHMuCi0kIQotJCEJTm90ZTogVGhlIHZlcnNpb24gb2YgZ2FzIHNoaXBwZWQgb24gdGhlIEdDQyBWTVMgdGFwZXMgaGFzIGJlZW4gcGF0Y2hlZAotJCEJdG8gZml4IHRoZSBhYm92ZSBtZW50aW9uZWQgYnVnLgotJCEKLSQJIVRoZSBnY2Mtdm1zIGRyaXZlciB3YXMgbW9kaWZpZWQgdG8gdXNlIGAtMScgcXVpdGUgc29tZSB0aW1lIGFnbywKLSQJIXNvIGRvbid0IGVjaG8gdGhpcyB0ZXh0IGFueSBtb3JlLi4uCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJJZiB0aGlzIGFzc2VtYmxlciBpcyBnb2luZyB0byBiZSB1c2VkIHdpdGggR0NDIDEubiwgeW91IgotJCAhd3JpdGUgc3lzJG91dHB1dCAibmVlZCB0byBtb2RpZnkgdGhlIGRyaXZlciB0byBzdXBwbHkgdGhlIC0xIHN3aXRjaCB0byBnYXMuIgotJCAhd3JpdGUgc3lzJG91dHB1dCAiVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIGEgc21hbGwgY2hhbmdlIGluIGhvdyBnbG9iYWwiCi0kICF3cml0ZSBzeXMkb3V0cHV0ICJjb25zdGFudCB2YXJpYWJsZXMgYXJlIGhhbmRsZWQuICBGYWlsdXJlIHRvIGluY2x1ZGUgdGhpcyIKLSQgIXdyaXRlIHN5cyRvdXRwdXQgIndpbGwgcmVzdWx0IGluIGxpbmtlciB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0IG1pc21hdGNoZWQKLSQgIXdyaXRlIHN5cyRvdXRwdXQgInBzZWN0IGF0dHJpYnV0ZXMuIgotJCEKLSQgZ2FzX2hvc3Q9InZtcyIKLSQgYXJjaF9pbmR4ID0gMSArICgoZiRnZXRzeWkoIkNQVSIpLmdlLjEyOCkuYW5kLjEpCSEgdmF4PT0xLCBhbHBoYT09MgotJCBhcmNoID0gZiRlbGVtZW50KGFyY2hfaW5keCwifCIsInxWQVh8QWxwaGF8IikKLSQgaWYgYXJjaC5lcXMuIlZBWCIKLSQgdGhlbgotJCAgY3B1X3R5cGU9InZheCIKLSQgIG9ial9mb3JtYXQ9InZtcyIKLSQgIGF0b2Y9InZheCIKLSQgZWxzZQotJCAgY3B1X3R5cGU9ImFscGhhIgotJCAgb2JqX2Zvcm1hdD0iZXZheCIKLSQgIGF0b2Y9ImllZWUiCi0kIGVuZGlmCi0kIGVtdWxhdGlvbj0iZ2VuZXJpYyIKLSQhCi0kCUNPUFkJPSAiY29weS9ub0xvZyIKLSQhCi0kIENfREVGUyA6PSIiIlZNUyIiIgotJCEgQ19ERUZTIDo9IiIiVk1TIiIiLCIiImNvbnN0PSIiIgotJCBDX0lOQ0xVREVTCT0gIi9JbmNsdWRlPShbXSxbLmNvbmZpZ10sWy0uaW5jbHVkZV0sWy0uaW5jbHVkZS5hb3V0XSkiCi0kIENfRkxBR1MJPSAiL25vVmVyYm9zZS9EZWJ1ZyIgKyBjX2luY2x1ZGVzCi0kIQotJCEKLSQgb24gZXJyb3IgdGhlbiAgZ290byBiYWlsCi0kIGlmIGYkc2VhcmNoKCJbLS5saWJpYmVydHldbGliZXJ0eS5vbGIiKS5lcXMuIiIKLSQgdGhlbglAWy0ubGliaWJlcnR5XXZtc2J1aWxkLmNvbQotJAl3cml0ZSBzeXMkb3V0cHV0ICJOb3cgYnVpbGRpbmcgZ2FzLiIKLSQgZW5kaWYKLSQgaWYgIicncDEnIiAuZXFzLiAiTElOSyIgdGhlbiBnb3RvIExpbmsKLSQhCi0kISAgVGhpcyBoZWxwcyBnY2MgMS5ubiBmaW5kIHRoZSBhb3V0LyogZmlsZXMuCi0kIQotJCBhb3V0X2RldiA9IGYkcGFyc2UoZmxubSwsLCJERVZJQ0UiKQotJCB0bXAgPSBhb3V0X2RldiAtICI6IgotJGlmIGYkdHJubG5tKHRtcCkubmVzLiIiIHRoZW4gYW91dF9kZXYgPSBmJHRybmxubSh0bXApCi0kIGFvdXRfZGlyID0gYW91dF9kZXYrZiRwYXJzZShmbG5tLCwsIkRJUkVDVE9SWSIpJyAtCi0JLSAiR0FTXSIgKyAiSU5DTFVERS5BT1VULl0iIC0gIl1bIgotJGFzc2lnbiAnYW91dF9kaXInIGFvdXQvdHJhbj1jb25jCi0kIG9wY29kZV9kaXIgPSBhb3V0X2RlditmJHBhcnNlKGZsbm0sLCwiRElSRUNUT1JZIiknIC0KLQktICJHQVNdIiArICJJTkNMVURFLk9QQ09ERS5dIiAtICJdWyIKLSRhc3NpZ24gJ29wY29kZV9kaXInIG9wY29kZS90cmFuPWNvbmMKLSQhCi0kIHNldCB2ZXJpZnkKLSQhCi0kIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykvT2JqZWN0PVtddGMtJ2NwdV90eXBlJy5vYmogWy5jb25maWdddGMtJ2NwdV90eXBlJy5jCi0kIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykvT2JqZWN0PVtdb2JqLSdvYmpfZm9ybWF0Jy5vYmogWy5jb25maWddb2JqLSdvYmpfZm9ybWF0Jy5jCi0kIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykvT2JqZWN0PVtdYXRvZi0nYXRvZicub2JqIFsuY29uZmlnXWF0b2YtJ2F0b2YnLmMKLUVPRgotCi1jZmlsZXM9ImBlY2hvICQqIHwgc2VkIC1lICdzL1wuby8uYy9nJyAtZSAncyEuLi9cKFteIC9dKlwpL1woW14gL10qXC5jXCkhWy0uXDFdXDIhZydgIgotCi1mb3IgY2ZpbGUgaW4gJGNmaWxlcyA7IGRvCi0gIGNhc2UgJGNmaWxlIGluCi0gICAgIlstLiIqKQotCWJhc2U9YGVjaG8gJGNmaWxlIHwgc2VkIC1lICdzL1xbLipcXS8vJyAtZSAncy9cLmMkLy8nYAotCWVjaG8gIlwkIGdjYyAnY19mbGFncycvRGVmaW5lPSgnQ19ERUZTJykvT2JqZWN0PVtdJGJhc2Uub2JqICRjZmlsZSIKLQk7OwotICAgICopCi0JZWNobyAiXCQgZ2NjICdjX2ZsYWdzJy9EZWZpbmU9KCdDX0RFRlMnKSAkY2ZpbGUiCi0JOzsKLSAgZXNhYwotZG9uZQotCi1jYXQgPDwgJ0VPRicKLSRsaW5rOgotJCEnZiR2ZXJpZnkoMCknCi0kIGlmIGYkdHJubG5tKCJJRklMRSQiKS5uZXMuIiIgdGhlbiAgY2xvc2Uvbm9Mb2cgaWZpbGUkCi0kIGNyZWF0ZSBnY2MtYXMub3B0Ci0hCi0hCUxpbmtlciBvcHRpb25zIGZpbGUgZm9yIEdOVSBhc3NlbWJsZXIKLSEKLSQgb3Blbi9BcHBlbmQgaWZpbGUkIGdjYy1hcy5vcHQKLSQgd3JpdGUgaWZpbGUkICJ0Yy0nJ2NwdV90eXBlJy5vYmoiCi0kIHdyaXRlIGlmaWxlJCAib2JqLScnb2JqX2Zvcm1hdCcub2JqIgotJCB3cml0ZSBpZmlsZSQgImF0b2YtJydhdG9mJy5vYmoiCi0kIENPUFkgc3lzJGlucHV0OiBpZmlsZSQ6Ci1FT0YKLQotZm9yIG9iaiBpbiAkKiA7IGRvCi0gICMgQ2hhbmdlICJmb28ubyIgaW50byAiZm9vLm9iaiIuCi0gIGVjaG8gJHtvYmp9YmosLSB8IHNlZCAncyEuKi8hIWcnCi1kb25lCi0KLWNhdCA8PCAnRU9GJwotWy0ubGliaWJlcnR5XWxpYmVydHkub2xiL0xpYgotZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9MaWIsc3lzJGxpYnJhcnk6dmF4Y3J0bC5vbGIvTGliCi0hIFRlbGwgbGlua2VyIGV4YWN0bHkgd2hhdCBwc2VjdCBhdHRyaWJ1dGVzIHdlIHdhbnQgLS0gbWF0Y2ggVkFYQ1JUTC4KLXBzZWN0X2F0dHI9RU5WSVJPTixsb25nLHBpYyxvdnIscmVsLGdibCxub3Nocixub2V4ZSxyZCx3cnQKLSQgY2xvc2UgaWZpbGUkCi0kIHNldCB2ZXJpZnk9KFByb2Msbm9JbWFnKQotJCBsaW5rL25vTWFwL0V4ZWM9Z2NjLWFzLmV4ZSBnY2MtYXMub3B0L09wdCx2ZXJzaW9uLm9wdC9PcHQKLSQhCi0kYmFpbDogZXhpdCAkc3RhdHVzICsgMCpmJHZlcmlmeSh2KQkhJ2YkdmVyaWZ5KDApJwotRU9GCmRpZmYgLS1naXQgYS9nYXMvd3JpdGUuYyBiL2dhcy93cml0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGE5YWM2Li4wMDAwMDAwCi0tLSBhL2dhcy93cml0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg3NyArMCwwIEBACi0vKiB3cml0ZS5jIC0gZW1pdCAubyBmaWxlCi0gICBDb3B5cmlnaHQgKEMpIDE5ODYsIDg3LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotICAgR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyB0aGluZyBzaG91bGQgYmUgc2V0IHVwIHRvIGRvIGJ5dGVvcmRlcmluZyBjb3JyZWN0bHkuICBCdXQuLi4gKi8KLQotI2luY2x1ZGUgImFzLmgiCi0jaW5jbHVkZSAic3Vic2Vncy5oIgotI2luY2x1ZGUgIm9ic3RhY2suaCIKLSNpbmNsdWRlICJvdXRwdXQtZmlsZS5oIgotCi0vKiBUaGlzIGxvb2tzIGxpa2UgYSBnb29kIGlkZWEuICBMZXQncyB0cnkgdHVybmluZyBpdCBvbiBhbHdheXMsIGZvciBub3cuICAqLwotI3VuZGVmICBCRkRfRkFTVF9TRUNUSU9OX0ZJTEwKLSNkZWZpbmUgQkZEX0ZBU1RfU0VDVElPTl9GSUxMCi0KLS8qIFRoZSBOT1BfT1BDT0RFIGlzIGZvciB0aGUgYWxpZ25tZW50IGZpbGwgdmFsdWUuICBGaWxsIGl0IHdpdGggYSBub3AKLSAgIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciBkb2VzIG5vdCBjaG9rZSBvbiBpdC4gICovCi0jaWZuZGVmIE5PUF9PUENPREUKLSNkZWZpbmUgTk9QX09QQ09ERSAweDAwCi0jZW5kaWYKLQotI2lmbmRlZiBUQ19BREpVU1RfUkVMT0NfQ09VTlQKLSNkZWZpbmUgVENfQURKVVNUX1JFTE9DX0NPVU5UKEZJWFAsQ09VTlQpCi0jZW5kaWYKLQotI2lmbmRlZiBUQ19GT1JDRV9SRUxPQ0FUSU9OCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT04oRklYUCkgMAotI2VuZGlmCi0KLSNpZm5kZWYgVENfRk9SQ0VfUkVMT0NBVElPTl9TRUNUSU9OCi0jZGVmaW5lIFRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTihGSVhQLFNFRykgVENfRk9SQ0VfUkVMT0NBVElPTihGSVhQKQotI2VuZGlmCi0KLSNpZm5kZWYJTURfUENSRUxfRlJPTV9TRUNUSU9OCi0jZGVmaW5lIE1EX1BDUkVMX0ZST01fU0VDVElPTihGSVhQLCBTRUMpIG1kX3BjcmVsX2Zyb20oRklYUCkKLSNlbmRpZgotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLWV4dGVybiBDT05TVCBpbnQgbWRfc2hvcnRfanVtcF9zaXplOwotZXh0ZXJuIENPTlNUIGludCBtZF9sb25nX2p1bXBfc2l6ZTsKLSNlbmRpZgotCi1pbnQgc3ltYm9sX3RhYmxlX2Zyb3plbjsKLXZvaWQgcHJpbnRfZml4dXAgUEFSQU1TICgoZml4UyAqKSk7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgdm9pZCByZW51bWJlcl9zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci0KLS8qIFdlIGdlbmVyYWxseSBhdHRhY2ggcmVsb2NzIHRvIGZyYWcgY2hhaW5zLiAgSG93ZXZlciwgYWZ0ZXIgd2UgaGF2ZQotICAgY2hhaW5lZCB0aGVzZSBhbGwgdG9nZXRoZXIgaW50byBhIHNlZ21lbnQsIGFueSByZWxvY3Mgd2UgYWRkIGFmdGVyCi0gICB0aGF0IG11c3QgYmUgYXR0YWNoZWQgdG8gYSBzZWdtZW50LiAgVGhpcyB3aWxsIGluY2x1ZGUgcmVsb2NzIGFkZGVkCi0gICBpbiBtZF9lc3RpbWF0ZV9zaXplX2Zvcl9yZWxheCwgZm9yIGV4YW1wbGUuICAqLwotc3RhdGljIGludCBmcmFnc19jaGFpbmVkID0gMDsKLSNlbmRpZgotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLQotI2lmbmRlZiBNQU5ZX1NFR01FTlRTCi1zdHJ1Y3QgZnJhZyAqdGV4dF9mcmFnX3Jvb3Q7Ci1zdHJ1Y3QgZnJhZyAqZGF0YV9mcmFnX3Jvb3Q7Ci1zdHJ1Y3QgZnJhZyAqYnNzX2ZyYWdfcm9vdDsKLQotc3RydWN0IGZyYWcgKnRleHRfbGFzdF9mcmFnOwkvKiBMYXN0IGZyYWcgaW4gc2VnbWVudC4gKi8KLXN0cnVjdCBmcmFnICpkYXRhX2xhc3RfZnJhZzsJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi1zdGF0aWMgc3RydWN0IGZyYWcgKmJzc19sYXN0X2ZyYWc7CS8qIExhc3QgZnJhZyBpbiBzZWdtZW50LiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgQkZECi1zdGF0aWMgb2JqZWN0X2hlYWRlcnMgaGVhZGVyczsKLSNlbmRpZgotCi1sb25nIHN0cmluZ19ieXRlX2NvdW50OwotY2hhciAqbmV4dF9vYmplY3RfZmlsZV9jaGFyUDsJLyogVHJhY2tzIG9iamVjdCBmaWxlIGJ5dGVzLiAqLwotCi0jaWZuZGVmIE9CSl9WTVMKLWludCBtYWdpY19udW1iZXJfZm9yX29iamVjdF9maWxlID0gREVGQVVMVF9NQUdJQ19OVU1CRVJfRk9SX09CSkVDVF9GSUxFOwotI2VuZGlmCi0KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLXN0YXRpYyBpbnQgbl9maXh1cHM7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi1zdGF0aWMgZml4UyAqZml4X25ld19pbnRlcm5hbCBQQVJBTVMgKChmcmFnUyAqLCBpbnQgd2hlcmUsIGludCBzaXplLAotCQkJCSAgICAgICBzeW1ib2xTICphZGQsIHN5bWJvbFMgKnN1YiwKLQkJCQkgICAgICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwKLQkJCQkgICAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZSkpOwotI2Vsc2UKLXN0YXRpYyBmaXhTICpmaXhfbmV3X2ludGVybmFsIFBBUkFNUyAoKGZyYWdTICosIGludCB3aGVyZSwgaW50IHNpemUsCi0JCQkJICAgICAgIHN5bWJvbFMgKmFkZCwgc3ltYm9sUyAqc3ViLAotCQkJCSAgICAgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLAotCQkJCSAgICAgICBpbnQgcl90eXBlKSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKE9CSl9WTVMpKQotc3RhdGljIGxvbmcgZml4dXBfc2VnbWVudCBQQVJBTVMgKChmaXhTICogZml4UCwgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZSkpOwotI2VuZGlmCi1zdGF0aWMgcmVsYXhfYWRkcmVzc1QgcmVsYXhfYWxpZ24gUEFSQU1TICgocmVsYXhfYWRkcmVzc1QgYWRkciwgaW50IGFsaWduKSk7Ci0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgISBkZWZpbmVkIChCRkQpCi1zdGF0aWMgZnJhZ1MgKmNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgUEFSQU1TICgoc2VnVCwgc3RydWN0IGZyY2hhaW4gKikpOwotI2VuZGlmCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQgY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIgUEFSQU1TICgoYmZkICosIHNlZ1QsIFBUUikpOwotc3RhdGljIHZvaWQgY3Z0X2ZyYWdfdG9fZmlsbCBQQVJBTVMgKChzZWdULCBmcmFnUyAqKSk7Ci1zdGF0aWMgdm9pZCByZWxheF9hbmRfc2l6ZV9zZWcgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgYWRqdXN0X3JlbG9jX3N5bXMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotc3RhdGljIHZvaWQgd3JpdGVfcmVsb2NzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHdyaXRlX2NvbnRlbnRzIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHNldF9zeW10YWIgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgKCEgZGVmaW5lZCAoQkZEKSAmJiAhIGRlZmluZWQgKE9CSl9BT1VUKSkKLXN0YXRpYyB2b2lkIG1lcmdlX2RhdGFfaW50b190ZXh0IFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotI2lmICEgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgISBkZWZpbmVkIChCRkQpCi1zdGF0aWMgdm9pZCBjdnRfZnJhZ190b19maWxsIFBBUkFNUyAoKG9iamVjdF9oZWFkZXJzICosIHNlZ1QsIGZyYWdTICopKTsKLXN0YXRpYyB2b2lkIHJlbW92ZV9zdWJzZWdzIFBBUkFNUyAoKGZyY2hhaW5TICosIGludCwgZnJhZ1MgKiosIGZyYWdTICoqKSk7Ci1zdGF0aWMgdm9pZCByZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi0KLS8qCi0gKgkJCWZpeF9uZXcoKQotICoKLSAqIENyZWF0ZSBhIGZpeFMgaW4gb2JzdGFjayAnbm90ZXMnLgotICovCi1zdGF0aWMgZml4UyAqCi1maXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgc3ViX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwKLQkJICByX3R5cGUpCi0gICAgIGZyYWdTICpmcmFnOwkJLyogV2hpY2ggZnJhZz8gKi8KLSAgICAgaW50IHdoZXJlOwkJCS8qIFdoZXJlIGluIHRoYXQgZnJhZz8gKi8KLSAgICAgaW50IHNpemU7CQkJLyogMSwgMiwgb3IgNCB1c3VhbGx5LiAqLwotICAgICBzeW1ib2xTICphZGRfc3ltYm9sOwkvKiBYX2FkZF9zeW1ib2wuICovCi0gICAgIHN5bWJvbFMgKnN1Yl9zeW1ib2w7CS8qIFhfb3Bfc3ltYm9sLiAqLwotICAgICBvZmZzZXRUIG9mZnNldDsJCS8qIFhfYWRkX251bWJlci4gKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2Vsc2UKLSAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2VuZGlmCi17Ci0gIGZpeFMgKmZpeFA7Ci0KLSAgbl9maXh1cHMrKzsKLQotICBmaXhQID0gKGZpeFMgKikgb2JzdGFja19hbGxvYyAoJm5vdGVzLCBzaXplb2YgKGZpeFMpKTsKLQotICBmaXhQLT5meF9mcmFnID0gZnJhZzsKLSAgZml4UC0+Znhfd2hlcmUgPSB3aGVyZTsKLSAgZml4UC0+Znhfc2l6ZSA9IHNpemU7Ci0gIC8qIFdlJ3ZlIG1hZGUgZnhfc2l6ZSBhIG5hcnJvdyBmaWVsZDsgY2hlY2sgdGhhdCBpdCdzIHdpZGUgZW5vdWdoLiAgKi8KLSAgaWYgKGZpeFAtPmZ4X3NpemUgIT0gc2l6ZSkKLSAgICB7Ci0gICAgICBhc19iYWQgKF8oImZpZWxkIGZ4X3NpemUgdG9vIHNtYWxsIHRvIGhvbGQgJWQiKSwgc2l6ZSk7Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0gIGZpeFAtPmZ4X2FkZHN5ID0gYWRkX3N5bWJvbDsKLSAgZml4UC0+Znhfc3Vic3kgPSBzdWJfc3ltYm9sOwotICBmaXhQLT5meF9vZmZzZXQgPSBvZmZzZXQ7Ci0gIGZpeFAtPmZ4X3BjcmVsID0gcGNyZWw7Ci0gIGZpeFAtPmZ4X3BsdCA9IDA7Ci0jaWYgZGVmaW5lZChORUVEX0ZYX1JfVFlQRSkgfHwgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgZml4UC0+Znhfcl90eXBlID0gcl90eXBlOwotI2VuZGlmCi0gIGZpeFAtPmZ4X2ltX2Rpc3AgPSAwOwotICBmaXhQLT5meF9wY3JlbF9hZGp1c3QgPSAwOwotICBmaXhQLT5meF9iaXRfZml4UCA9IDA7Ci0gIGZpeFAtPmZ4X2FkZG51bWJlciA9IDA7Ci0gIGZpeFAtPmZ4X3RjYml0ID0gMDsKLSAgZml4UC0+ZnhfZG9uZSA9IDA7Ci0gIGZpeFAtPmZ4X25vX292ZXJmbG93ID0gMDsKLSAgZml4UC0+Znhfc2lnbmVkID0gMDsKLQotI2lmZGVmIFVTSU5HX0NHRU4KLSAgZml4UC0+ZnhfY2dlbi5pbnNuID0gTlVMTDsKLSAgZml4UC0+ZnhfY2dlbi5vcGluZm8gPSAwOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19GSVhfVFlQRQotICBUQ19JTklUX0ZJWF9EQVRBKGZpeFApOwotI2VuZGlmCi0KLSAgYXNfd2hlcmUgKCZmaXhQLT5meF9maWxlLCAmZml4UC0+ZnhfbGluZSk7Ci0KLSAgLyogVXN1YWxseSwgd2Ugd2FudCByZWxvY3Mgc29ydGVkIG51bWVyaWNhbGx5LCBidXQgd2hpbGUKLSAgICAgY29tcGFyaW5nIHRvIG9sZGVyIHZlcnNpb25zIG9mIGdhcyB0aGF0IGhhdmUgcmVsb2NzCi0gICAgIHJldmVyc2Ugc29ydGVkLCBpdCBpcyBjb252ZW5pZW50IHRvIGhhdmUgdGhpcyBjb21waWxlCi0gICAgIHRpbWUgb3B0aW9uLiAgeG94b3JpY2guICovCi0KLSAgewotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgIGZpeFMgKipzZWdfZml4X3Jvb3RQID0gKGZyYWdzX2NoYWluZWQKLQkJCSAgICA/ICZzZWdfaW5mbyAobm93X3NlZyktPmZpeF9yb290Ci0JCQkgICAgOiAmZnJjaGFpbl9ub3ctPmZpeF9yb290KTsKLSAgICBmaXhTICoqc2VnX2ZpeF90YWlsUCA9IChmcmFnc19jaGFpbmVkCi0JCQkgICAgPyAmc2VnX2luZm8gKG5vd19zZWcpLT5maXhfdGFpbAotCQkJICAgIDogJmZyY2hhaW5fbm93LT5maXhfdGFpbCk7Ci0jZW5kaWYKLQotI2lmZGVmIFJFVkVSU0VfU09SVF9SRUxPQ1MKLQotICAgIGZpeFAtPmZ4X25leHQgPSAqc2VnX2ZpeF9yb290UDsKLSAgICAqc2VnX2ZpeF9yb290UCA9IGZpeFA7Ci0KLSNlbHNlIC8qIFJFVkVSU0VfU09SVF9SRUxPQ1MgKi8KLQotICAgIGZpeFAtPmZ4X25leHQgPSBOVUxMOwotCi0gICAgaWYgKCpzZWdfZml4X3RhaWxQKQotICAgICAgKCpzZWdfZml4X3RhaWxQKS0+ZnhfbmV4dCA9IGZpeFA7Ci0gICAgZWxzZQotICAgICAgKnNlZ19maXhfcm9vdFAgPSBmaXhQOwotICAgICpzZWdfZml4X3RhaWxQID0gZml4UDsKLQotI2VuZGlmIC8qIFJFVkVSU0VfU09SVF9SRUxPQ1MgKi8KLQotICB9Ci0KLSAgcmV0dXJuIGZpeFA7Ci19Ci0KLS8qIENyZWF0ZSBhIGZpeHVwIHJlbGF0aXZlIHRvIGEgc3ltYm9sIChwbHVzIGEgY29uc3RhbnQpLiAgKi8KLQotZml4UyAqCi1maXhfbmV3IChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwgb2Zmc2V0LCBwY3JlbCwgcl90eXBlKQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgc3ltYm9sUyAqYWRkX3N5bWJvbDsJLyogWF9hZGRfc3ltYm9sLiAqLwotICAgICBvZmZzZXRUIG9mZnNldDsJCS8qIFhfYWRkX251bWJlci4gKi8KLSAgICAgaW50IHBjcmVsOwkJCS8qIFRSVUUgaWYgUEMtcmVsYXRpdmUgcmVsb2NhdGlvbi4gKi8KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByX3R5cGU7IC8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2Vsc2UKLSAgICAgaW50IHJfdHlwZTsJCS8qIFJlbG9jYXRpb24gdHlwZSAqLwotI2VuZGlmCi17Ci0gIHJldHVybiBmaXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkX3N5bWJvbCwKLQkJCSAgIChzeW1ib2xTICopIE5VTEwsIG9mZnNldCwgcGNyZWwsIHJfdHlwZSk7Ci19Ci0KLS8qIENyZWF0ZSBhIGZpeHVwIGZvciBhbiBleHByZXNzaW9uLiAgQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBmaXh1cHMKLSAgIGZvciBkaWZmZXJlbmNlIGV4cHJlc3Npb25zLiAgVGhhdCBpcyBpdHNlbGYgbW9yZSB0aGFuIG1vc3Qgb2JqZWN0Ci0gICBmaWxlIGZvcm1hdHMgc3VwcG9ydCBhbnlob3cuICAqLwotCi1maXhTICoKLWZpeF9uZXdfZXhwIChmcmFnLCB3aGVyZSwgc2l6ZSwgZXhwLCBwY3JlbCwgcl90eXBlKQotICAgICBmcmFnUyAqZnJhZzsJCS8qIFdoaWNoIGZyYWc/ICovCi0gICAgIGludCB3aGVyZTsJCQkvKiBXaGVyZSBpbiB0aGF0IGZyYWc/ICovCi0gICAgIGludCBzaXplOwkJCS8qIDEsIDIsIG9yIDQgdXN1YWxseS4gKi8KLSAgICAgZXhwcmVzc2lvblMgKmV4cDsJCS8qIEV4cHJlc3Npb24uICAqLwotICAgICBpbnQgcGNyZWw7CQkJLyogVFJVRSBpZiBQQy1yZWxhdGl2ZSByZWxvY2F0aW9uLiAqLwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZTsgLyogUmVsb2NhdGlvbiB0eXBlICovCi0jZWxzZQotICAgICBpbnQgcl90eXBlOwkJLyogUmVsb2NhdGlvbiB0eXBlICovCi0jZW5kaWYKLXsKLSAgc3ltYm9sUyAqYWRkID0gTlVMTDsKLSAgc3ltYm9sUyAqc3ViID0gTlVMTDsKLSAgb2Zmc2V0VCBvZmYgPSAwOwotCi0gIHN3aXRjaCAoZXhwLT5YX29wKQotICAgIHsKLSAgICBjYXNlIE9fYWJzZW50OgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fYWRkOgotICAgICAgLyogVGhpcyBjb21lcyB1cCB3aGVuIF9HTE9CQUxfT0ZGU0VUX1RBQkxFXysoLi1MMCkgaXMgcmVhZCwgaWYKLQkgdGhlIGRpZmZlcmVuY2UgZXhwcmVzc2lvbiBjYW5ub3QgaW1tZWRpYXRlbHkgYmUgcmVkdWNlZC4gICovCi0gICAgICB7Ci0Jc3ltYm9sUyAqc3RtcCA9IG1ha2VfZXhwcl9zeW1ib2wgKGV4cCk7Ci0JZXhwLT5YX29wID0gT19zeW1ib2w7Ci0JZXhwLT5YX29wX3N5bWJvbCA9IDA7Ci0JZXhwLT5YX2FkZF9zeW1ib2wgPSBzdG1wOwotCWV4cC0+WF9hZGRfbnVtYmVyID0gMDsKLQlyZXR1cm4gZml4X25ld19leHAgKGZyYWcsIHdoZXJlLCBzaXplLCBleHAsIHBjcmVsLCByX3R5cGUpOwotICAgICAgfQotCi0gICAgY2FzZSBPX3N5bWJvbF9ydmE6Ci0gICAgICBhZGQgPSBleHAtPlhfYWRkX3N5bWJvbDsKLSAgICAgIG9mZiA9IGV4cC0+WF9hZGRfbnVtYmVyOwotCi0jaWYgZGVmaW5lZChCRkRfQVNTRU1CTEVSKQotICAgICAgcl90eXBlID0gQkZEX1JFTE9DX1JWQTsKLSNlbHNlCi0jaWYgZGVmaW5lZChUQ19SVkFfUkVMT0MpCi0gICAgICByX3R5cGUgPSBUQ19SVkFfUkVMT0M7Ci0jZWxzZQotICAgICAgYXNfZmF0YWwoXygicnZhIG5vdCBzdXBwb3J0ZWQiKSk7Ci0jZW5kaWYKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9fdW1pbnVzOgotICAgICAgc3ViID0gZXhwLT5YX2FkZF9zeW1ib2w7Ci0gICAgICBvZmYgPSBleHAtPlhfYWRkX251bWJlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPX3N1YnRyYWN0OgotICAgICAgc3ViID0gZXhwLT5YX29wX3N5bWJvbDsKLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBPX3N5bWJvbDoKLSAgICAgIGFkZCA9IGV4cC0+WF9hZGRfc3ltYm9sOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgICovCi0gICAgY2FzZSBPX2NvbnN0YW50OgotICAgICAgb2ZmID0gZXhwLT5YX2FkZF9udW1iZXI7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhZGQgPSBtYWtlX2V4cHJfc3ltYm9sIChleHApOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBmaXhfbmV3X2ludGVybmFsIChmcmFnLCB3aGVyZSwgc2l6ZSwgYWRkLCBzdWIsIG9mZiwKLQkJCSAgIHBjcmVsLCByX3R5cGUpOwotfQotCi0vKiBBcHBlbmQgYSBzdHJpbmcgb250byBhbm90aGVyIHN0cmluZywgYnVtcGluZyB0aGUgcG9pbnRlciBhbG9uZy4gICovCi12b2lkCi1hcHBlbmQgKGNoYXJQUCwgZnJvbVAsIGxlbmd0aCkKLSAgICAgY2hhciAqKmNoYXJQUDsKLSAgICAgY2hhciAqZnJvbVA7Ci0gICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotewotICAvKiBEb24ndCB0cnVzdCBtZW1jcHkoKSBvZiAwIGNoYXJzLiAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuOwotCi0gIG1lbWNweSAoKmNoYXJQUCwgZnJvbVAsIGxlbmd0aCk7Ci0gICpjaGFyUFAgKz0gbGVuZ3RoOwotfQotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLWludCBzZWN0aW9uX2FsaWdubWVudFtTRUdfTUFYSU1VTV9PUkRJTkFMXTsKLSNlbmRpZgotCi0vKgotICogVGhpcyByb3V0aW5lIHJlY29yZHMgdGhlIGxhcmdlc3QgYWxpZ25tZW50IHNlZW4gZm9yIGVhY2ggc2VnbWVudC4KLSAqIElmIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQgaXMgYWxpZ25lZCBvbiB0aGUgd29yc3QtY2FzZQotICogYm91bmRhcnksIGFsbCBvZiB0aGUgb3RoZXIgYWxpZ25tZW50cyB3aXRoaW4gaXQgd2lsbCB3b3JrLiAgQXQKLSAqIGxlYXN0IG9uZSBvYmplY3QgZm9ybWF0IHJlYWxseSB1c2VzIHRoaXMgaW5mby4KLSAqLwotdm9pZAotcmVjb3JkX2FsaWdubWVudCAoc2VnLCBhbGlnbikKLSAgICAgLyogU2VnbWVudCB0byB3aGljaCBhbGlnbm1lbnQgcGVydGFpbnMgKi8KLSAgICAgc2VnVCBzZWc7Ci0gICAgIC8qIEFsaWdubWVudCwgYXMgYSBwb3dlciBvZiAyIChlLmcuLCAxID0+IDItYnl0ZSBib3VuZGFyeSwgMiA9PiA0LWJ5dGUKLQlib3VuZGFyeSwgZXRjLikgICovCi0gICAgIGludCBhbGlnbjsKLXsKLSAgaWYgKHNlZyA9PSBhYnNvbHV0ZV9zZWN0aW9uKQotICAgIHJldHVybjsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGlmICgodW5zaWduZWQgaW50KSBhbGlnbiA+IGJmZF9nZXRfc2VjdGlvbl9hbGlnbm1lbnQgKHN0ZG91dHB1dCwgc2VnKSkKLSAgICBiZmRfc2V0X3NlY3Rpb25fYWxpZ25tZW50IChzdGRvdXRwdXQsIHNlZywgYWxpZ24pOwotI2Vsc2UKLSAgaWYgKGFsaWduID4gc2VjdGlvbl9hbGlnbm1lbnRbKGludCkgc2VnXSkKLSAgICBzZWN0aW9uX2FsaWdubWVudFsoaW50KSBzZWddID0gYWxpZ247Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotLyogUmVzZXQgdGhlIHNlY3Rpb24gaW5kaWNlcyBhZnRlciByZW1vdmluZyB0aGUgZ2FzIGNyZWF0ZWQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotcmVudW1iZXJfc2VjdGlvbnMgKGFiZmQsIHNlYywgY291bnRwYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBjb3VudHBhcmc7Ci17Ci0gIGludCAqY291bnRwID0gKGludCAqKSBjb3VudHBhcmc7Ci0KLSAgc2VjLT5pbmRleCA9ICpjb3VudHA7Ci0gICsrKmNvdW50cDsKLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpICovCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhIGRlZmluZWQgKEJGRCkKLQotc3RhdGljIGZyYWdTICoKLWNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyXzEgKHNlY3Rpb24sIGZyY2hwKQotICAgICBzZWdUIHNlY3Rpb247Ci0gICAgIHN0cnVjdCBmcmNoYWluICpmcmNocDsKLXsKLSAgZnJhZ1MgZHVtbXksICpwcmV2X2ZyYWcgPSAmZHVtbXk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmaXhTIGZpeF9kdW1teSwgKnByZXZfZml4ID0gJmZpeF9kdW1teTsKLSNlbmRpZgotCi0gIGZvciAoOyBmcmNocCAmJiBmcmNocC0+ZnJjaF9zZWcgPT0gc2VjdGlvbjsgZnJjaHAgPSBmcmNocC0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIHByZXZfZnJhZy0+ZnJfbmV4dCA9IGZyY2hwLT5mcmNoX3Jvb3Q7Ci0gICAgICBwcmV2X2ZyYWcgPSBmcmNocC0+ZnJjaF9sYXN0OwotICAgICAgYXNzZXJ0IChwcmV2X2ZyYWctPmZyX3R5cGUgIT0gMCk7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAgICAgaWYgKGZyY2hwLT5maXhfcm9vdCAhPSAoZml4UyAqKSBOVUxMKQotCXsKLQkgIGlmIChzZWdfaW5mbyAoc2VjdGlvbiktPmZpeF9yb290ID09IChmaXhTICopIE5VTEwpCi0JICAgIHNlZ19pbmZvIChzZWN0aW9uKS0+Zml4X3Jvb3QgPSBmcmNocC0+Zml4X3Jvb3Q7Ci0JICBwcmV2X2ZpeC0+ZnhfbmV4dCA9IGZyY2hwLT5maXhfcm9vdDsKLQkgIHNlZ19pbmZvIChzZWN0aW9uKS0+Zml4X3RhaWwgPSBmcmNocC0+Zml4X3RhaWw7Ci0JICBwcmV2X2ZpeCA9IGZyY2hwLT5maXhfdGFpbDsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0gIGFzc2VydCAocHJldl9mcmFnLT5mcl90eXBlICE9IDApOwotICBwcmV2X2ZyYWctPmZyX25leHQgPSAwOwotICByZXR1cm4gcHJldl9mcmFnOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQotc3RhdGljIHZvaWQKLWNoYWluX2ZyY2hhaW5zX3RvZ2V0aGVyIChhYmZkLCBzZWN0aW9uLCB4eHgpCi0gICAgIGJmZCAqYWJmZDsJCQkvKiB1bnVzZWQgKi8KLSAgICAgc2VnVCBzZWN0aW9uOwotICAgICBQVFIgeHh4OwkJCS8qIHVudXNlZCAqLwotewotICBzZWdtZW50X2luZm9fdHlwZSAqaW5mbzsKLQotICAvKiBCRkQgbWF5IGhhdmUgaW50cm9kdWNlZCBpdHMgb3duIHNlY3Rpb25zIHdpdGhvdXQgdXNpbmcKLSAgICAgc3Vic2VnX25ldywgc28gaXQgaXMgcG9zc2libGUgdGhhdCBzZWdfaW5mbyBpcyBOVUxMLiAgKi8KLSAgaW5mbyA9IHNlZ19pbmZvIChzZWN0aW9uKTsKLSAgaWYgKGluZm8gIT0gKHNlZ21lbnRfaW5mb190eXBlICopIE5VTEwpCi0gICBpbmZvLT5mcmNoYWluUC0+ZnJjaF9sYXN0Ci0gICAgID0gY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSAoc2VjdGlvbiwgaW5mby0+ZnJjaGFpblApOwotCi0gIC8qIE5vdyB0aGF0IHdlJ3ZlIGNoYWluZWQgdGhlIGZyYWdzIHRvZ2V0aGVyLCB3ZSBtdXN0IGFkZCBuZXcgZml4dXBzCi0gICAgIHRvIHRoZSBzZWdtZW50LCBub3QgdG8gdGhlIGZyYWcgY2hhaW4uICAqLwotICBmcmFnc19jaGFpbmVkID0gMTsKLX0KLQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLQotc3RhdGljIHZvaWQKLXJlbW92ZV9zdWJzZWdzIChoZWFkLCBzZWcsIHJvb3QsIGxhc3QpCi0gICAgIGZyY2hhaW5TICpoZWFkOwotICAgICBpbnQgc2VnOwotICAgICBmcmFnUyAqKnJvb3Q7Ci0gICAgIGZyYWdTICoqbGFzdDsKLXsKLSAgKnJvb3QgPSBoZWFkLT5mcmNoX3Jvb3Q7Ci0gICpsYXN0ID0gY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXJfMSAoc2VnLCBoZWFkKTsKLX0KLQotI2VuZGlmIC8qIEJGRCAqLwotCi0jaWYgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkKLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkCi1jdnRfZnJhZ190b19maWxsIChzZWMsIGZyYWdQKQotICAgICBzZWdUIHNlYzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotI2Vsc2UKLXN0YXRpYyB2b2lkCi1jdnRfZnJhZ190b19maWxsIChoZWFkZXJzUCwgc2VjLCBmcmFnUCkKLSAgICAgb2JqZWN0X2hlYWRlcnMgKmhlYWRlcnNQOwotICAgICBzZWdUIHNlYzsKLSAgICAgZnJhZ1MgKmZyYWdQOwotI2VuZGlmCi17Ci0gIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCi0gICAgewotICAgIGNhc2UgcnNfYWxpZ246Ci0gICAgY2FzZSByc19hbGlnbl9jb2RlOgotICAgIGNhc2UgcnNfb3JnOgotICAgIGNhc2UgcnNfc3BhY2U6Ci0jaWZkZWYgSEFORExFX0FMSUdOCi0gICAgICBIQU5ETEVfQUxJR04gKGZyYWdQKTsKLSNlbmRpZgotICAgICAga25vdyAoZnJhZ1AtPmZyX25leHQgIT0gTlVMTCk7Ci0gICAgICBmcmFnUC0+ZnJfb2Zmc2V0ID0gKGZyYWdQLT5mcl9uZXh0LT5mcl9hZGRyZXNzCi0JCQkgIC0gZnJhZ1AtPmZyX2FkZHJlc3MKLQkJCSAgLSBmcmFnUC0+ZnJfZml4KSAvIGZyYWdQLT5mcl92YXI7Ci0gICAgICBpZiAoZnJhZ1AtPmZyX29mZnNldCA8IDApCi0JewotCSAgYXNfYmFkIChfKCJhdHRlbXB0IHRvIC5vcmcvLnNwYWNlIGJhY2t3YXJkcz8gKCVsZCkiKSwKLQkJICAobG9uZykgZnJhZ1AtPmZyX29mZnNldCk7Ci0JfQotICAgICAgZnJhZ1AtPmZyX3R5cGUgPSByc19maWxsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIHJzX2ZpbGw6Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgcnNfbGViMTI4OgotICAgICAgewotCXZhbHVlVCB2YWx1ZSA9IFNfR0VUX1ZBTFVFIChmcmFnUC0+ZnJfc3ltYm9sKTsKLQlpbnQgc2l6ZTsKLQotCXNpemUgPSBvdXRwdXRfbGViMTI4IChmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXgsIHZhbHVlLAotCQkJICAgICAgZnJhZ1AtPmZyX3N1YnR5cGUpOwotCi0JZnJhZ1AtPmZyX2ZpeCArPSBzaXplOwotCWZyYWdQLT5mcl90eXBlID0gcnNfZmlsbDsKLQlmcmFnUC0+ZnJfdmFyID0gMDsKLQlmcmFnUC0+ZnJfb2Zmc2V0ID0gMDsKLQlmcmFnUC0+ZnJfc3ltYm9sID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByc19jZmE6Ci0gICAgICBlaF9mcmFtZV9jb252ZXJ0X2ZyYWcgKGZyYWdQKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gICAgICBtZF9jb252ZXJ0X2ZyYWcgKHN0ZG91dHB1dCwgc2VjLCBmcmFnUCk7Ci0jZWxzZQotICAgICAgbWRfY29udmVydF9mcmFnIChoZWFkZXJzUCwgc2VjLCBmcmFnUCk7Ci0jZW5kaWYKLQotICAgICAgYXNzZXJ0IChmcmFnUC0+ZnJfbmV4dCA9PSBOVUxMCi0JICAgICAgfHwgKChvZmZzZXRUKSAoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnUC0+ZnJfYWRkcmVzcykKLQkJICA9PSBmcmFnUC0+ZnJfZml4KSk7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBBZnRlciBtZF9jb252ZXJ0X2ZyYWcsIHdlIG1ha2UgdGhlIGZyYWcgaW50byBhICIuc3BhY2UgMCIuCi0gICAgICAgKiBNZF9jb252ZXJ0X2ZyYWcoKSBzaG91bGQgc2V0IHVwIGFueSBmaXhTcyBhbmQgY29uc3RhbnRzCi0gICAgICAgKiByZXF1aXJlZC4KLSAgICAgICAqLwotICAgICAgZnJhZ193YW5lIChmcmFnUCk7Ci0gICAgICBicmVhazsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0gICAgY2FzZSByc19icm9rZW5fd29yZDoKLSAgICAgIHsKLQlzdHJ1Y3QgYnJva2VuX3dvcmQgKmxpZTsKLQotCWlmIChmcmFnUC0+ZnJfc3VidHlwZSkKLQkgIHsKLQkgICAgZnJhZ1AtPmZyX2ZpeCArPSBtZF9zaG9ydF9qdW1wX3NpemU7Ci0JICAgIGZvciAobGllID0gKHN0cnVjdCBicm9rZW5fd29yZCAqKSAoZnJhZ1AtPmZyX3N5bWJvbCk7Ci0JCSBsaWUgJiYgbGllLT5kaXNwZnJhZyA9PSBmcmFnUDsKLQkJIGxpZSA9IGxpZS0+bmV4dF9icm9rZW5fd29yZCkKLQkgICAgICBpZiAobGllLT5hZGRlZCA9PSAxKQotCQlmcmFnUC0+ZnJfZml4ICs9IG1kX2xvbmdfanVtcF9zaXplOwotCSAgfQotCWZyYWdfd2FuZSAoZnJhZ1ApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgfHwgIWRlZmluZWQgKEJGRCkgKi8KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLXN0YXRpYyB2b2lkCi1yZWxheF9hbmRfc2l6ZV9zZWcgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHg7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBmcmFnUyAqZnJhZ3A7Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvOwotICBpbnQgeDsKLSAgdmFsdWVUIHNpemUsIG5ld3NpemU7Ci0KLSAgc3Vic2VnX2NoYW5nZSAoc2VjLCAwKTsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLQotICBzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGlmIChzZWdpbmZvICYmIHNlZ2luZm8tPmZyY2hhaW5QKQotICAgIHsKLSAgICAgIHJlbGF4X3NlZ21lbnQgKHNlZ2luZm8tPmZyY2hhaW5QLT5mcmNoX3Jvb3QsIHNlYyk7Ci0gICAgICBmb3IgKGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsgZnJhZ3A7IGZyYWdwID0gZnJhZ3AtPmZyX25leHQpCi0JY3Z0X2ZyYWdfdG9fZmlsbCAoc2VjLCBmcmFncCk7Ci0gICAgICBmb3IgKGZyYWdwID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLQkgICBmcmFncC0+ZnJfbmV4dDsKLQkgICBmcmFncCA9IGZyYWdwLT5mcl9uZXh0KQotCS8qIHdhbGsgdG8gbGFzdCBlbHQgKi87Ci0gICAgICBzaXplID0gZnJhZ3AtPmZyX2FkZHJlc3MgKyBmcmFncC0+ZnJfZml4OwotICAgIH0KLSAgZWxzZQotICAgIHNpemUgPSAwOwotCi0gIGlmIChzaXplID4gMCAmJiAhIHNlZ2luZm8tPmJzcykKLSAgICBmbGFncyB8PSBTRUNfSEFTX0NPTlRFTlRTOwotCi0gIC8qIEBAIFRoaXMgaXMganVzdCBhbiBhcHByb3hpbWF0aW9uLiAgKi8KLSAgaWYgKHNlZ2luZm8gJiYgc2VnaW5mby0+Zml4X3Jvb3QpCi0gICAgZmxhZ3MgfD0gU0VDX1JFTE9DOwotICBlbHNlCi0gICAgZmxhZ3MgJj0gflNFQ19SRUxPQzsKLSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjLCBmbGFncyk7Ci0gIGFzc2VydCAoeCA9PSB0cnVlKTsKLQotICBuZXdzaXplID0gbWRfc2VjdGlvbl9hbGlnbiAoc2VjLCBzaXplKTsKLSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBzZWMsIG5ld3NpemUpOwotICBhc3NlcnQgKHggPT0gdHJ1ZSk7Ci0KLSAgLyogSWYgdGhlIHNpemUgaGFkIHRvIGJlIHJvdW5kZWQgdXAsIGFkZCBzb21lIHBhZGRpbmcgaW4gdGhlIGxhc3QKLSAgICAgbm9uLWVtcHR5IGZyYWcuICAqLwotICBhc3NlcnQgKG5ld3NpemUgPj0gc2l6ZSk7Ci0gIGlmIChzaXplICE9IG5ld3NpemUpCi0gICAgewotICAgICAgZnJhZ1MgKmxhc3QgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9sYXN0OwotICAgICAgZnJhZ3AgPSBzZWdpbmZvLT5mcmNoYWluUC0+ZnJjaF9yb290OwotICAgICAgd2hpbGUgKGZyYWdwLT5mcl9uZXh0ICE9IGxhc3QpCi0JZnJhZ3AgPSBmcmFncC0+ZnJfbmV4dDsKLSAgICAgIGxhc3QtPmZyX2FkZHJlc3MgPSBzaXplOwotICAgICAgZnJhZ3AtPmZyX29mZnNldCArPSBuZXdzaXplIC0gc2l6ZTsKLSAgICB9Ci0KLSNpZmRlZiB0Y19mcm9iX3NlY3Rpb24KLSAgdGNfZnJvYl9zZWN0aW9uIChzZWMpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2Jfc2VjdGlvbgotICBvYmpfZnJvYl9zZWN0aW9uIChzZWMpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBERUJVRzIKLXN0YXRpYyB2b2lkCi1kdW1wX3NlY3Rpb25fcmVsb2NzIChhYmZkLCBzZWMsIHN0cmVhbV8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgY2hhciAqc3RyZWFtXzsKLXsKLSAgRklMRSAqc3RyZWFtID0gKEZJTEUgKikgc3RyZWFtXzsKLSAgc2VnbWVudF9pbmZvX3R5cGUgKnNlZ2luZm8gPSBzZWdfaW5mbyAoc2VjKTsKLSAgZml4UyAqZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OwotCi0gIGlmICghZml4cCkKLSAgICByZXR1cm47Ci0KLSAgZnByaW50ZiAoc3RyZWFtLCAic2VjICVzIHJlbG9jczpcbiIsIHNlYy0+bmFtZSk7Ci0gIHdoaWxlIChmaXhwKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnMgPSBmaXhwLT5meF9hZGRzeTsKLSAgICAgIGlmIChzKQotCXsKLQkgIGZwcmludGYgKHN0cmVhbSwgIiAgJTA4eDogJXMoJXMiLCBmaXhwLCBTX0dFVF9OQU1FIChzKSwKLQkJICAgcy0+YnN5bS0+c2VjdGlvbi0+bmFtZSk7Ci0JICBpZiAocy0+YnN5bS0+ZmxhZ3MgJiBCU0ZfU0VDVElPTl9TWU0pCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdHJlYW0sICIgc2VjdGlvbiBzeW0iKTsKLQkgICAgICBpZiAoU19HRVRfVkFMVUUgKHMpKQotCQlmcHJpbnRmIChzdHJlYW0sICIrJXgiLCBTX0dFVF9WQUxVRSAocykpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZwcmludGYgKHN0cmVhbSwgIisleCIsIFNfR0VUX1ZBTFVFIChzKSk7Ci0JICBmcHJpbnRmIChzdHJlYW0sICIpKyV4XG4iLCBmaXhwLT5meF9vZmZzZXQpOwotCX0KLSAgICAgIGVsc2UKLQlmcHJpbnRmIChzdHJlYW0sICIgICUwOHg6IHR5cGUgJWQgbm8gc3ltXG4iLCBmaXhwLCBmaXhwLT5meF9yX3R5cGUpOwotICAgICAgZml4cCA9IGZpeHAtPmZ4X25leHQ7Ci0gICAgfQotfQotI2Vsc2UKLSNkZWZpbmUgZHVtcF9zZWN0aW9uX3JlbG9jcyhBQkZELFNFQyxTVFJFQU0pCSgodm9pZCkgMCkKLSNlbmRpZgotCi0jaWZuZGVmIEVNSVRfU0VDVElPTl9TWU1CT0xTCi0jZGVmaW5lIEVNSVRfU0VDVElPTl9TWU1CT0xTIDEKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotYWRqdXN0X3JlbG9jX3N5bXMgKGFiZmQsIHNlYywgeHh4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiB4eHg7Ci17Ci0gIHNlZ21lbnRfaW5mb190eXBlICpzZWdpbmZvID0gc2VnX2luZm8gKHNlYyk7Ci0gIGZpeFMgKmZpeHA7Ci0KLSAgaWYgKHNlZ2luZm8gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZHVtcF9zZWN0aW9uX3JlbG9jcyAoYWJmZCwgc2VjLCBzdGRlcnIpOwotCi0gIGZvciAoZml4cCA9IHNlZ2luZm8tPmZpeF9yb290OyBmaXhwOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLSAgICBpZiAoZml4cC0+ZnhfZG9uZSkKLSAgICAgIC8qIGlnbm9yZSBpdCAqLzsKLSAgICBlbHNlIGlmIChmaXhwLT5meF9hZGRzeSkKLSAgICAgIHsKLQlzeW1ib2xTICpzeW07Ci0JYXNlY3Rpb24gKnN5bXNlYzsKLQotI2lmZGVmIERFQlVHNQotCWZwcmludGYgKHN0ZGVyciwgIlxuXG5hZGp1c3RpbmcgZml4dXA6XG4iKTsKLQlwcmludF9maXh1cCAoZml4cCk7Ci0jZW5kaWYKLQotCXN5bSA9IGZpeHAtPmZ4X2FkZHN5OwotCi0JLyogQWxsIHN5bWJvbHMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlc29sdmVkIGF0IHRoaXMKLQkgICBwb2ludC4gIEl0IGlzIHBvc3NpYmxlIHRvIHNlZSB1bnJlc29sdmVkIGV4cHJlc3Npb24KLQkgICBzeW1ib2xzLCB0aG91Z2gsIHNpbmNlIHRoZXkgYXJlIG5vdCBpbiB0aGUgcmVndWxhciBzeW1ib2wKLQkgICB0YWJsZS4gICovCi0JaWYgKHN5bSAhPSBOVUxMKQotCSAgcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKHN5bSwgMSk7Ci0JCi0JaWYgKGZpeHAtPmZ4X3N1YnN5ICE9IE5VTEwpCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoZml4cC0+Znhfc3Vic3ksIDEpOwotCi0JLyogSWYgdGhpcyBzeW1ib2wgaXMgZXF1YXRlZCB0byBhbiB1bmRlZmluZWQgc3ltYm9sLCBjb252ZXJ0Ci0gICAgICAgICAgIHRoZSBmaXh1cCB0byBiZWluZyBhZ2FpbnN0IHRoYXQgc3ltYm9sLiAgKi8KLQlpZiAoc3ltICE9IE5VTEwgJiYgc3ltYm9sX2VxdWF0ZWRfcCAoc3ltKQotCSAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCSAgewotCSAgICBmaXhwLT5meF9vZmZzZXQgKz0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW0pLT5YX2FkZF9udW1iZXI7Ci0JICAgIHN5bSA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfc3ltYm9sOwotCSAgICBmaXhwLT5meF9hZGRzeSA9IHN5bTsKLQkgIH0KLQotCWlmIChzeW0gIT0gTlVMTCAmJiBzeW1ib2xfbXJpX2NvbW1vbl9wIChzeW0pKQotCSAgewotCSAgICAvKiBUaGVzZSBzeW1ib2xzIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBpbiBmaXh1cF9zZWdtZW50LiAgKi8KLQkgICAgZ290byBkb25lOwotCSAgfQotCi0Jc3ltc2VjID0gU19HRVRfU0VHTUVOVCAoc3ltKTsKLQotCWlmIChzeW1zZWMgPT0gTlVMTCkKLQkgIGFib3J0ICgpOwotCQotCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKHN5bXNlYykpCi0JICB7Ci0JICAgIC8qIFRoZSBmaXh1cF9zZWdtZW50IHJvdXRpbmUgd2lsbCBub3QgdXNlIHRoaXMgc3ltYm9sIGluIGEKLSAgICAgICAgICAgICAgIHJlbG9jYXRpb24gdW5sZXNzIFRDX0ZPUkNFX1JFTE9DQVRJT04gcmV0dXJucyAxLiAgKi8KLQkgICAgaWYgKFRDX0ZPUkNFX1JFTE9DQVRJT04gKGZpeHApKQotCSAgICAgIHsKLQkJc3ltYm9sX21hcmtfdXNlZF9pbl9yZWxvYyAoZml4cC0+ZnhfYWRkc3kpOwotI2lmZGVmIFVOREVGSU5FRF9ESUZGRVJFTkNFX09LCi0JCWlmIChmaXhwLT5meF9zdWJzeSAhPSBOVUxMKQotCQkgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X3N1YnN5KTsKLSNlbmRpZgotCSAgICAgIH0KLQkgICAgZ290byBkb25lOwotCSAgfQotCi0JLyogSWYgaXQncyBvbmUgb2YgdGhlc2Ugc2VjdGlvbnMsIGFzc3VtZSB0aGUgc3ltYm9sIGlzCi0JICAgZGVmaW5pdGVseSBnb2luZyB0byBiZSBvdXRwdXQuICBUaGUgY29kZSBpbgotCSAgIG1kX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IGluIHRjLW1pcHMuYyB1c2VzIHRoaXMgdGVzdAotCSAgIGFzIHdlbGwsIHNvIGlmIHlvdSBjaGFuZ2UgdGhpcyBjb2RlIHlvdSBzaG91bGQgbG9vayBhdCB0aGF0Ci0JICAgY29kZS4gICovCi0JaWYgKGJmZF9pc191bmRfc2VjdGlvbiAoc3ltc2VjKQotCSAgICB8fCBiZmRfaXNfY29tX3NlY3Rpb24gKHN5bXNlYykpCi0JICB7Ci0JICAgIHN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLSNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSwotCSAgICAvKiBXZSBoYXZlIHRoZSBkaWZmZXJlbmNlIG9mIGFuIHVuZGVmaW5lZCBzeW1ib2wgYW5kIHNvbWUKLQkgICAgICAgb3RoZXIgc3ltYm9sLiAgTWFrZSBzdXJlIHRvIG1hcmsgdGhlIG90aGVyIHN5bWJvbCBhcyB1c2VkCi0JICAgICAgIGluIGEgcmVsb2NhdGlvbiBzbyB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIG91dHB1dC4gICovCi0JICAgIGlmIChmaXhwLT5meF9zdWJzeSkKLQkgICAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9zdWJzeSk7Ci0jZW5kaWYKLQkgICAgZ290byBkb25lOwotCSAgfQotCi0JLyogRG9uJ3QgdHJ5IHRvIHJlZHVjZSByZWxvY3Mgd2hpY2ggcmVmZXIgdG8gbm9uLWxvY2FsIHN5bWJvbHMKLSAgICAgICAgICAgaW4gLmxpbmtvbmNlIHNlY3Rpb25zLiAgSXQgY2FuIGxlYWQgdG8gY29uZnVzaW9uIHdoZW4gYQotICAgICAgICAgICBkZWJ1Z2dpbmcgc2VjdGlvbiByZWZlcnMgdG8gYSAubGlua29uY2Ugc2VjdGlvbi4gIEkgaG9wZQotICAgICAgICAgICB0aGlzIHdpbGwgYWx3YXlzIGJlIGNvcnJlY3QuICAqLwotCWlmIChzeW1zZWMgIT0gc2VjICYmICEgU19JU19MT0NBTCAoc3ltKSkKLQkgIHsKLQkgICAgYm9vbGVhbiBsaW5rb25jZTsKLQotCSAgICBsaW5rb25jZSA9IGZhbHNlOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHN0ZG91dHB1dCwgc3ltc2VjKSAmIFNFQ19MSU5LX09OQ0UpCi0JCSE9IDApCi0JICAgICAgbGlua29uY2UgPSB0cnVlOwotI2VuZGlmCi0jaWZkZWYgT0JKX0VMRgotCSAgICAvKiBUaGUgR05VIHRvb2xjaGFpbiB1c2VzIGFuIGV4dGVuc2lvbiBmb3IgRUxGOiBhIHNlY3Rpb24KLSAgICAgICAgICAgICAgIGJlZ2lubmluZyB3aXRoIHRoZSBtYWdpYyBzdHJpbmcgLmdudS5saW5rb25jZSBpcyBhCi0gICAgICAgICAgICAgICBsaW5rb25jZSBzZWN0aW9uLiAgKi8KLQkgICAgaWYgKHN0cm5jbXAgKHNlZ21lbnRfbmFtZSAoc3ltc2VjKSwgIi5nbnUubGlua29uY2UiLAotCQkJIHNpemVvZiAiLmdudS5saW5rb25jZSIgLSAxKSA9PSAwKQotCSAgICAgIGxpbmtvbmNlID0gdHJ1ZTsKLSNlbmRpZgotCi0JICAgIGlmIChsaW5rb25jZSkKLQkgICAgICB7Ci0JCXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLSNpZmRlZiBVTkRFRklORURfRElGRkVSRU5DRV9PSwotCQlpZiAoZml4cC0+Znhfc3Vic3kgIT0gTlVMTCkKLQkJICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9zdWJzeSk7Ci0jZW5kaWYKLQkJZ290byBkb25lOwotCSAgICAgIH0KLQkgIH0KLQotCS8qIFNpbmNlIHdlJ3JlIHJlZHVjaW5nIHRvIHNlY3Rpb24gc3ltYm9scywgZG9uJ3QgYXR0ZW1wdCB0byByZWR1Y2UKLQkgICBhbnl0aGluZyB0aGF0J3MgYWxyZWFkeSB1c2luZyBvbmUuICAqLwotCWlmIChzeW1ib2xfc2VjdGlvbl9wIChzeW0pKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLQotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkvKiBXZSBjYW4gbmV2ZXIgYWRqdXN0IGEgcmVsb2MgYWdhaW5zdCBhIHdlYWsgc3ltYm9sLiAgSWYgd2UKLSAgICAgICAgICAgZGlkLCBhbmQgdGhlIHdlYWsgc3ltYm9sIHdhcyBvdmVycmlkZGVuIGJ5IGEgcmVhbCBzeW1ib2wKLSAgICAgICAgICAgc29tZXdoZXJlIGVsc2UsIHRoZW4gb3VyIHJlbG9jYXRpb24gd291bGQgYmUgcG9pbnRpbmcgYXQKLSAgICAgICAgICAgdGhlIHdyb25nIGFyZWEgb2YgbWVtb3J5LiAgKi8KLQlpZiAoU19JU19XRUFLIChzeW0pKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLSNlbmRpZgotCi0JLyogSXMgdGhlcmUgc29tZSBvdGhlciByZWFzb24gd2UgY2FuJ3QgYWRqdXN0IHRoaXMgb25lPyAgKEUuZy4sCi0JICAgY2FsbC9iYWwgbGlua3MgaW4gaTk2MC1ib3V0IHN5bWJvbHMuKSAgKi8KLSNpZmRlZiBvYmpfZml4X2FkanVzdGFibGUKLQlpZiAoISBvYmpfZml4X2FkanVzdGFibGUgKGZpeHApKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLSNlbmRpZgotCi0JLyogSXMgdGhlcmUgc29tZSBvdGhlciAodGFyZ2V0IGNwdSBkZXBlbmRlbnQpIHJlYXNvbiB3ZSBjYW4ndCBhZGp1c3QKLQkgICB0aGlzIG9uZT8gIChFLmcuIHJlbG9jYXRpb25zIGludm9sdmluZyBmdW5jdGlvbiBhZGRyZXNzZXMgb24KLQkgICB0aGUgUEEuICAqLwotI2lmZGVmIHRjX2ZpeF9hZGp1c3RhYmxlCi0JaWYgKCEgdGNfZml4X2FkanVzdGFibGUgKGZpeHApKQotCSAgewotCSAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhwLT5meF9hZGRzeSk7Ci0JICAgIGdvdG8gZG9uZTsKLQkgIH0KLSNlbmRpZgotCi0JLyogSWYgdGhlIHNlY3Rpb24gc3ltYm9sIGlzbid0IGdvaW5nIHRvIGJlIG91dHB1dCwgdGhlIHJlbG9jcwotCSAgIGF0IGxlYXN0IHNob3VsZCBzdGlsbCB3b3JrLiAgSWYgbm90LCBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KLQkgICB3aGVuIHdlIHJ1biBpbnRvIHRoYXQgY2FzZS4KLQotCSAgIFdlIHJlZmV0Y2ggdGhlIHNlZ21lbnQgd2hlbiBjYWxsaW5nIHNlY3Rpb25fc3ltYm9sLCByYXRoZXIKLQkgICB0aGFuIHVzaW5nIHN5bXNlYywgYmVjYXVzZSBTX0dFVF9WQUxVRSBtYXkgd2luZCB1cCBjaGFuZ2luZwotCSAgIHRoZSBzZWN0aW9uIHdoZW4gaXQgY2FsbHMgcmVzb2x2ZV9zeW1ib2xfdmFsdWUuICovCi0JZml4cC0+Znhfb2Zmc2V0ICs9IFNfR0VUX1ZBTFVFIChzeW0pOwotCWZpeHAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKFNfR0VUX1NFR01FTlQgKHN5bSkpOwotCXN5bWJvbF9tYXJrX3VzZWRfaW5fcmVsb2MgKGZpeHAtPmZ4X2FkZHN5KTsKLQotICAgICAgZG9uZToKLQk7Ci0gICAgICB9Ci0jaWYgMS8qZGVmIFJFTE9DX1JFUVVJUkVTX1NZTUJPTCovCi0gICAgZWxzZQotICAgICAgewotCS8qIFRoZXJlIHdhcyBubyBzeW1ib2wgcmVxdWlyZWQgYnkgdGhpcyByZWxvY2F0aW9uLiAgSG93ZXZlciwKLQkgICBCRkQgZG9lc24ndCByZWFsbHkgaGFuZGxlIHJlbG9jYXRpb25zIHdpdGhvdXQgc3ltYm9scyB3ZWxsLgotCSAgIChBdCBsZWFzdCwgdGhlIENPRkYgc3VwcG9ydCBkb2Vzbid0LikgIFNvIGZvciBub3cgd2UgZmFrZSB1cAotCSAgIGEgbG9jYWwgc3ltYm9sIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLiAgKi8KLQotCWZpeHAtPmZ4X2FkZHN5ID0gc2VjdGlvbl9zeW1ib2wgKGFic29sdXRlX3NlY3Rpb24pOwotLyoJZml4cC0+ZnhfYWRkc3ktPnN5X3VzZWRfaW5fcmVsb2MgPSAxOyAqLwotICAgICAgfQotI2VuZGlmCi0KLSAgZHVtcF9zZWN0aW9uX3JlbG9jcyAoYWJmZCwgc2VjLCBzdGRlcnIpOwotfQotCi1zdGF0aWMgdm9pZAotd3JpdGVfcmVsb2NzIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICBpbnQgaTsKLSAgdW5zaWduZWQgaW50IG47Ci0gIGFyZWxlbnQgKipyZWxvY3M7Ci0gIGZpeFMgKmZpeHA7Ci0gIGNoYXIgKmVycjsKLQotICAvKiBJZiBzZWdpbmZvIGlzIE5VTEwsIHdlIGRpZCBub3QgY3JlYXRlIHRoaXMgc2VjdGlvbjsgZG9uJ3QgZG8KLSAgICAgYW55dGhpbmcgd2l0aCBpdC4gICovCi0gIGlmIChzZWdpbmZvID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIGZpeHVwX3NlZ21lbnQgKHNlZ2luZm8tPmZpeF9yb290LCBzZWMpOwotCi0gIG4gPSAwOwotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cDsgZml4cCA9IGZpeHAtPmZ4X25leHQpCi0gICAgbisrOwotCi0jaWZuZGVmIFJFTE9DX0VYUEFOU0lPTl9QT1NTSUJMRQotICAvKiBTZXQgdXAgcmVsb2MgaW5mb3JtYXRpb24gYXMgd2VsbC4gICovCi0gIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChuICogc2l6ZW9mIChhcmVsZW50ICopKTsKLSAgbWVtc2V0ICgoY2hhciopcmVsb2NzLCAwLCBuICogc2l6ZW9mIChhcmVsZW50KikpOwotCi0gIGkgPSAwOwotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cCAhPSAoZml4UyAqKSBOVUxMOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICpyZWxvYzsKLSAgICAgIGJmZF9yZWxvY19zdGF0dXNfdHlwZSBzOwotICAgICAgc3ltYm9sUyAqc3ltOwotCi0gICAgICBpZiAoZml4cC0+ZnhfZG9uZSkKLQl7Ci0JICBuLS07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIElmIHRoaXMgaXMgYW4gdW5kZWZpbmVkIHN5bWJvbCB3aGljaCB3YXMgZXF1YXRlZCB0byBhbm90aGVyCi0gICAgICAgICBzeW1ib2wsIHRoZW4gdXNlIGdlbmVyYXRlIHRoZSByZWxvYyBhZ2FpbnN0IHRoZSBsYXR0ZXIgc3ltYm9sCi0gICAgICAgICByYXRoZXIgdGhhbiB0aGUgZm9ybWVyLiAgKi8KLSAgICAgIHN5bSA9IGZpeHAtPmZ4X2FkZHN5OwotICAgICAgd2hpbGUgKHN5bWJvbF9lcXVhdGVkX3AgKHN5bSkKLQkgICAgICYmICghIFNfSVNfREVGSU5FRCAoc3ltKSB8fCBTX0lTX0NPTU1PTiAoc3ltKSkpCi0JewotCSAgc3ltYm9sUyAqbjsKLQotCSAgLyogV2UgbXVzdCBhdm9pZCBsb29waW5nLCBhcyB0aGF0IGNhbiBvY2N1ciB3aXRoIGEgYmFkbHkKLQkgICAgIHdyaXR0ZW4gcHJvZ3JhbS4gICovCi0JICBuID0gc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChzeW0pLT5YX2FkZF9zeW1ib2w7Ci0JICBpZiAobiA9PSBzeW0pCi0JICAgIGJyZWFrOwotCSAgZml4cC0+Znhfb2Zmc2V0ICs9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfbnVtYmVyOwotCSAgc3ltID0gbjsKLQl9Ci0gICAgICBmaXhwLT5meF9hZGRzeSA9IHN5bTsKLQotICAgICAgcmVsb2MgPSB0Y19nZW5fcmVsb2MgKHNlYywgZml4cCk7Ci0gICAgICBpZiAoIXJlbG9jKQotCXsKLQkgIG4tLTsKLQkgIGNvbnRpbnVlOwotCX0KLQotI2lmIDAKLSAgICAgIC8qIFRoaXMgdGVzdCBpcyB0cmlnZ2VyZWQgaW5hcHByb3ByaWF0ZWx5IGZvciB0aGUgU0guICAqLwotICAgICAgaWYgKGZpeHAtPmZ4X3doZXJlICsgZml4cC0+Znhfc2l6ZQotCSAgPiBmaXhwLT5meF9mcmFnLT5mcl9maXggKyBmaXhwLT5meF9mcmFnLT5mcl9vZmZzZXQpCi0JYWJvcnQgKCk7Ci0jZW5kaWYKLQotICAgICAgcyA9IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKHN0ZG91dHB1dCwgcmVsb2MsCi0JCQkJICBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsLAotCQkJCSAgZml4cC0+ZnhfZnJhZy0+ZnJfYWRkcmVzcywKLQkJCQkgIHNlYywgJmVycik7Ci0gICAgICBzd2l0Y2ggKHMpCi0JewotCWNhc2UgYmZkX3JlbG9jX29rOgotCSAgYnJlYWs7Ci0JY2FzZSBiZmRfcmVsb2Nfb3ZlcmZsb3c6Ci0JICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsIF8oInJlbG9jYXRpb24gb3ZlcmZsb3ciKSk7Ci0JICBicmVhazsKLQljYXNlIGJmZF9yZWxvY19vdXRvZnJhbmdlOgotCSAgYXNfYmFkX3doZXJlIChmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lLCBfKCJyZWxvY2F0aW9uIG91dCBvZiByYW5nZSIpKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBhc19mYXRhbCAoXygiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uOiAleCIpLAotCQkgICAgZml4cC0+ZnhfZmlsZSwgZml4cC0+ZnhfbGluZSwgcyk7Ci0JfQotICAgICAgcmVsb2NzW2krK10gPSByZWxvYzsKLSAgICB9Ci0jZWxzZQotICBuID0gbiAqIE1BWF9SRUxPQ19FWFBBTlNJT047Ci0gIC8qIFNldCB1cCByZWxvYyBpbmZvcm1hdGlvbiBhcyB3ZWxsLiAgKi8KLSAgcmVsb2NzID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKG4gKiBzaXplb2YgKGFyZWxlbnQgKikpOwotCi0gIGkgPSAwOwotICBmb3IgKGZpeHAgPSBzZWdpbmZvLT5maXhfcm9vdDsgZml4cCAhPSAoZml4UyAqKSBOVUxMOyBmaXhwID0gZml4cC0+ZnhfbmV4dCkKLSAgICB7Ci0gICAgICBhcmVsZW50ICoqcmVsb2M7Ci0gICAgICBjaGFyICpkYXRhOwotICAgICAgYmZkX3JlbG9jX3N0YXR1c190eXBlIHM7Ci0gICAgICBzeW1ib2xTICpzeW07Ci0gICAgICBpbnQgajsKLQotICAgICAgaWYgKGZpeHAtPmZ4X2RvbmUpCi0JewotCSAgbi0tOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hpY2ggd2FzIGVxdWF0ZWQgdG8gYW5vdGhlcgotICAgICAgICAgc3ltYm9sLCB0aGVuIHVzZSBnZW5lcmF0ZSB0aGUgcmVsb2MgYWdhaW5zdCB0aGUgbGF0dGVyIHN5bWJvbAotICAgICAgICAgcmF0aGVyIHRoYW4gdGhlIGZvcm1lci4gICovCi0gICAgICBzeW0gPSBmaXhwLT5meF9hZGRzeTsKLSAgICAgIHdoaWxlIChzeW1ib2xfZXF1YXRlZF9wIChzeW0pCi0JICAgICAmJiAoISBTX0lTX0RFRklORUQgKHN5bSkgfHwgU19JU19DT01NT04gKHN5bSkpKQotCXN5bSA9IHN5bWJvbF9nZXRfdmFsdWVfZXhwcmVzc2lvbiAoc3ltKS0+WF9hZGRfc3ltYm9sOwotICAgICAgZml4cC0+ZnhfYWRkc3kgPSBzeW07Ci0KLSAgICAgIHJlbG9jID0gdGNfZ2VuX3JlbG9jIChzZWMsIGZpeHApOwotCi0gICAgICBmb3IgKGogPSAwOyByZWxvY1tqXTsgaisrKQotCXsKLSAgICAgICAgICByZWxvY3NbaSsrXSA9IHJlbG9jW2pdOwotICAgICAgICAgIGFzc2VydChpIDw9IG4pOwotCX0KLSAgICAgIGRhdGEgPSBmaXhwLT5meF9mcmFnLT5mcl9saXRlcmFsICsgZml4cC0+Znhfd2hlcmU7Ci0gICAgICBpZiAoZml4cC0+Znhfd2hlcmUgKyBmaXhwLT5meF9zaXplCi0JICA+IGZpeHAtPmZ4X2ZyYWctPmZyX2ZpeCArIGZpeHAtPmZ4X2ZyYWctPmZyX29mZnNldCkKLQlhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCSAgICAgIF8oImludGVybmFsIGVycm9yOiBmaXh1cCBub3QgY29udGFpbmVkIHdpdGhpbiBmcmFnIikpOwotICAgICAgZm9yIChqID0gMDsgcmVsb2Nbal07IGorKykKLSAgICAgICAgewotCSAgcyA9IGJmZF9pbnN0YWxsX3JlbG9jYXRpb24gKHN0ZG91dHB1dCwgcmVsb2Nbal0sCi0JCQkJICAgICAgZml4cC0+ZnhfZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCQkgICAgICBmaXhwLT5meF9mcmFnLT5mcl9hZGRyZXNzLAotCQkJCSAgICAgIHNlYywgJmVycik7Ci0gICAgICAgICAgc3dpdGNoIChzKQotCSAgICB7Ci0JICAgIGNhc2UgYmZkX3JlbG9jX29rOgotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIGJmZF9yZWxvY19vdmVyZmxvdzoKLQkgICAgICBhc19iYWRfd2hlcmUgKGZpeHAtPmZ4X2ZpbGUsIGZpeHAtPmZ4X2xpbmUsCi0JCQkgICAgXygicmVsb2NhdGlvbiBvdmVyZmxvdyIpKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhc19mYXRhbCAoXygiJXM6JXU6IGJhZCByZXR1cm4gZnJvbSBiZmRfaW5zdGFsbF9yZWxvY2F0aW9uIiksCi0JCQlmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLQkgICAgfQotICAgICAgICB9Ci0gICAgfQotICBuID0gaTsKLSNlbmRpZgotCi0jaWZkZWYgREVCVUc0Ci0gIHsKLSAgICBpbnQgaSwgaiwgbnN5bXM7Ci0gICAgYXN5bWJvbCAqKnN5bXBwOwotICAgIHN5bXBwID0gYmZkX2dldF9vdXRzeW1ib2xzIChzdGRvdXRwdXQpOwotICAgIG5zeW1zID0gYmZkX2dldF9zeW1jb3VudCAoc3Rkb3V0cHV0KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgaWYgKCgoKnJlbG9jc1tpXS0+c3ltX3B0cl9wdHIpLT5mbGFncyAmIEJTRl9TRUNUSU9OX1NZTSkgPT0gMCkKLQl7Ci0JICBmb3IgKGogPSAwOyBqIDwgbnN5bXM7IGorKykKLQkgICAgaWYgKHN5bXBwW2pdID09ICpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyKQotCSAgICAgIGJyZWFrOwotCSAgaWYgKGogPT0gbnN5bXMpCi0JICAgIGFib3J0ICgpOwotCX0KLSAgfQotI2VuZGlmCi0KLSAgaWYgKG4pCi0gICAgYmZkX3NldF9yZWxvYyAoc3Rkb3V0cHV0LCBzZWMsIHJlbG9jcywgbik7Ci0gIGVsc2UKLSAgICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywKLQkJCSAgIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykKLQkJCSAgICAmIChmbGFnd29yZCkgflNFQ19SRUxPQykpOwotCi0jaWZkZWYgREVCVUczCi0gIHsKLSAgICBpbnQgaTsKLSAgICBhcmVsZW50ICpyOwotICAgIGFzeW1ib2wgKnM7Ci0gICAgZnByaW50ZiAoc3RkZXJyLCAicmVsb2NzIGZvciBzZWMgJXNcbiIsIHNlYy0+bmFtZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICAgIHsKLQlyID0gcmVsb2NzW2ldOwotCXMgPSAqci0+c3ltX3B0cl9wdHI7Ci0JZnByaW50ZiAoc3RkZXJyLCAiICByZWxvYyAlMmQgQCUwOHggb2ZmICU0eCA6IHN5bSAlLTEwcyBhZGRlbmQgJXhcbiIsCi0JCSBpLCByLCByLT5hZGRyZXNzLCBzLT5uYW1lLCByLT5hZGRlbmQpOwotICAgICAgfQotICB9Ci0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQKLXdyaXRlX2NvbnRlbnRzIChhYmZkLCBzZWMsIHh4eCkKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBQVFIgeHh4OwotewotICBzZWdtZW50X2luZm9fdHlwZSAqc2VnaW5mbyA9IHNlZ19pbmZvIChzZWMpOwotICB1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7Ci0gIGZyYWdTICpmOwotCi0gIC8qIFdyaXRlIG91dCB0aGUgZnJhZ3MuICAqLwotICBpZiAoc2VnaW5mbyA9PSBOVUxMCi0gICAgICB8fCAhIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfSEFTX0NPTlRFTlRTKSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChmID0gc2VnaW5mby0+ZnJjaGFpblAtPmZyY2hfcm9vdDsKLSAgICAgICBmOwotICAgICAgIGYgPSBmLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIGludCB4OwotICAgICAgdW5zaWduZWQgbG9uZyBmaWxsX3NpemU7Ci0gICAgICBjaGFyICpmaWxsX2xpdGVyYWw7Ci0gICAgICBsb25nIGNvdW50OwotCi0gICAgICBhc3NlcnQgKGYtPmZyX3R5cGUgPT0gcnNfZmlsbCk7Ci0gICAgICBpZiAoZi0+ZnJfZml4KQotCXsKLQkgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQlmLT5mcl9saXRlcmFsLCAoZmlsZV9wdHIpIG9mZnNldCwKLQkJCQkJKGJmZF9zaXplX3R5cGUpIGYtPmZyX2ZpeCk7Ci0JICBpZiAoeCA9PSBmYWxzZSkKLQkgICAgewotCSAgICAgIGJmZF9wZXJyb3IgKHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IHdyaXRlICVzIiksIHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCSAgICAgIGV4aXQgKEVYSVRfRkFJTFVSRSk7Ci0JICAgIH0KLQkgIG9mZnNldCArPSBmLT5mcl9maXg7Ci0JfQotICAgICAgZmlsbF9saXRlcmFsID0gZi0+ZnJfbGl0ZXJhbCArIGYtPmZyX2ZpeDsKLSAgICAgIGZpbGxfc2l6ZSA9IGYtPmZyX3ZhcjsKLSAgICAgIGNvdW50ID0gZi0+ZnJfb2Zmc2V0OwotICAgICAgYXNzZXJ0IChjb3VudCA+PSAwKTsKLSAgICAgIGlmIChmaWxsX3NpemUgJiYgY291bnQpCi0JewotCSAgY2hhciBidWZbMjU2XTsKLQkgIGlmIChmaWxsX3NpemUgPiBzaXplb2YoYnVmKSkKLQkgICAgewotCSAgICAgIC8qIERvIGl0IHRoZSBvbGQgd2F5LiBDYW4gdGhpcyBldmVyIGhhcHBlbj8gKi8KLQkgICAgICB3aGlsZSAoY291bnQtLSkKLQkJewotCQkgIHggPSBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKHN0ZG91dHB1dCwgc2VjLAotCQkJCQkJZmlsbF9saXRlcmFsLAotCQkJCQkJKGZpbGVfcHRyKSBvZmZzZXQsCi0JCQkJCQkoYmZkX3NpemVfdHlwZSkgZmlsbF9zaXplKTsKLQkJICBpZiAoeCA9PSBmYWxzZSkKLQkJICAgIHsKLQkJICAgICAgYmZkX3BlcnJvciAoc3Rkb3V0cHV0LT5maWxlbmFtZSk7Ci0JCSAgICAgIGFzX3BlcnJvciAoXygiRkFUQUw6IENhbid0IHdyaXRlICVzIiksIHN0ZG91dHB1dC0+ZmlsZW5hbWUpOwotCQkgICAgICBleGl0IChFWElUX0ZBSUxVUkUpOwotCQkgICAgfQotCQkgIG9mZnNldCArPSBmaWxsX3NpemU7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogQnVpbGQgYSBidWZmZXIgZnVsbCBvZiBmaWxsIG9iamVjdHMgYW5kIG91dHB1dCBpdCBhcwotCQkgb2Z0ZW4gYXMgbmVjZXNzYXJ5LiBUaGlzIHNhdmVzIG9uIHRoZSBvdmVyaGVhZCBvZgotCQkgcG90ZW50aWFsbHkgbG90cyBvZiBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgY2FsbHMuICAqLwotCSAgICAgIGludCBuX3Blcl9idWYsIGk7Ci0JICAgICAgaWYgKGZpbGxfc2l6ZSA9PSAxKQotCQl7Ci0JCSAgbl9wZXJfYnVmID0gc2l6ZW9mIChidWYpOwotCQkgIG1lbXNldCAoYnVmLCAqZmlsbF9saXRlcmFsLCBuX3Blcl9idWYpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY2hhciAqYnVmcDsKLQkJICBuX3Blcl9idWYgPSBzaXplb2YoYnVmKS9maWxsX3NpemU7Ci0JCSAgZm9yIChpID0gbl9wZXJfYnVmLCBidWZwID0gYnVmOyBpOyBpLS0sIGJ1ZnAgKz0gZmlsbF9zaXplKQotCQkgICAgbWVtY3B5KGJ1ZnAsIGZpbGxfbGl0ZXJhbCwgZmlsbF9zaXplKTsKLQkJfQotCSAgICAgIGZvciAoOyBjb3VudCA+IDA7IGNvdW50IC09IG5fcGVyX2J1ZikKLQkJewotCQkgIG5fcGVyX2J1ZiA9IG5fcGVyX2J1ZiA+IGNvdW50ID8gY291bnQgOiBuX3Blcl9idWY7Ci0JCSAgeCA9IGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoc3Rkb3V0cHV0LCBzZWMsCi0JCQkJCQlidWYsIChmaWxlX3B0cikgb2Zmc2V0LAotCQkJCQkJKGJmZF9zaXplX3R5cGUpIG5fcGVyX2J1ZiAqIGZpbGxfc2l6ZSk7Ci0JCSAgaWYgKHggIT0gdHJ1ZSkKLQkJICAgIGFzX2ZhdGFsIChfKCJDYW5ub3Qgd3JpdGUgdG8gb3V0cHV0IGZpbGUuIikpOwotCQkgIG9mZnNldCArPSBuX3Blcl9idWYgKiBmaWxsX3NpemU7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikgfHwgKCFkZWZpbmVkIChCRkQpICYmICFkZWZpbmVkKE9CSl9BT1VUKSkKLXN0YXRpYyB2b2lkCi1tZXJnZV9kYXRhX2ludG9fdGV4dCAoKQotewotI2lmIGRlZmluZWQoQkZEX0FTU0VNQkxFUikgfHwgZGVmaW5lZChNQU5ZX1NFR01FTlRTKQotICBzZWdfaW5mbyAodGV4dF9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfbGFzdC0+ZnJfbmV4dCA9Ci0gICAgc2VnX2luZm8gKGRhdGFfc2VjdGlvbiktPmZyY2hhaW5QLT5mcmNoX3Jvb3Q7Ci0gIHNlZ19pbmZvICh0ZXh0X3NlY3Rpb24pLT5mcmNoYWluUC0+ZnJjaF9sYXN0ID0KLSAgICBzZWdfaW5mbyAoZGF0YV9zZWN0aW9uKS0+ZnJjaGFpblAtPmZyY2hfbGFzdDsKLSAgc2VnX2luZm8gKGRhdGFfc2VjdGlvbiktPmZyY2hhaW5QID0gMDsKLSNlbHNlCi0gIGZpeFMgKnRtcDsKLQotICB0ZXh0X2xhc3RfZnJhZy0+ZnJfbmV4dCA9IGRhdGFfZnJhZ19yb290OwotICB0ZXh0X2xhc3RfZnJhZyA9IGRhdGFfbGFzdF9mcmFnOwotICBkYXRhX2xhc3RfZnJhZyA9IE5VTEw7Ci0gIGRhdGFfZnJhZ19yb290ID0gTlVMTDsKLSAgaWYgKHRleHRfZml4X3Jvb3QpCi0gICAgewotICAgICAgZm9yICh0bXAgPSB0ZXh0X2ZpeF9yb290OyB0bXAtPmZ4X25leHQ7IHRtcCA9IHRtcC0+ZnhfbmV4dCk7OwotICAgICAgdG1wLT5meF9uZXh0ID0gZGF0YV9maXhfcm9vdDsKLSAgICAgIHRleHRfZml4X3RhaWwgPSBkYXRhX2ZpeF90YWlsOwotICAgIH0KLSAgZWxzZQotICAgIHRleHRfZml4X3Jvb3QgPSBkYXRhX2ZpeF9yb290OwotICBkYXRhX2ZpeF9yb290ID0gTlVMTDsKLSNlbmRpZgotfQotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgfHwgKCEgQkZEICYmICEgT0JKX0FPVVQpICovCi0KLSNpZiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikgJiYgIWRlZmluZWQgKEJGRCkKLXN0YXRpYyB2b2lkCi1yZWxheF9hbmRfc2l6ZV9hbGxfc2VnbWVudHMgKCkKLXsKLSAgZnJhZ1MgKmZyYWdQOwotCi0gIHJlbGF4X3NlZ21lbnQgKHRleHRfZnJhZ19yb290LCBTRUdfVEVYVCk7Ci0gIHJlbGF4X3NlZ21lbnQgKGRhdGFfZnJhZ19yb290LCBTRUdfREFUQSk7Ci0gIHJlbGF4X3NlZ21lbnQgKGJzc19mcmFnX3Jvb3QsIFNFR19CU1MpOwotICAvKgotICAgKiBOb3cgdGhlIGFkZHJlc3NlcyBvZiBmcmFncyBhcmUgY29ycmVjdCB3aXRoaW4gdGhlIHNlZ21lbnQuCi0gICAqLwotCi0gIGtub3cgKHRleHRfbGFzdF9mcmFnLT5mcl90eXBlID09IHJzX2ZpbGwgJiYgdGV4dF9sYXN0X2ZyYWctPmZyX29mZnNldCA9PSAwKTsKLSAgSF9TRVRfVEVYVF9TSVpFICgmaGVhZGVycywgdGV4dF9sYXN0X2ZyYWctPmZyX2FkZHJlc3MpOwotICB0ZXh0X2xhc3RfZnJhZy0+ZnJfYWRkcmVzcyA9IEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpOwotCi0gIC8qCi0gICAqIEpvaW4gdGhlIDIgc2VnbWVudHMgaW50byAxIGh1Z2Ugc2VnbWVudC4KLSAgICogVG8gZG8gdGhpcywgcmUtY29tcHV0ZSBldmVyeSBybl9hZGRyZXNzIGluIHRoZSBTRUdfREFUQSBmcmFncy4KLSAgICogVGhlbiBqb2luIHRoZSBkYXRhIGZyYWdzIGFmdGVyIHRoZSB0ZXh0IGZyYWdzLgotICAgKgotICAgKiBEZXRlcm1pbmUgYV9kYXRhIFtsZW5ndGggb2YgZGF0YSBzZWdtZW50XS4KLSAgICovCi0gIGlmIChkYXRhX2ZyYWdfcm9vdCkKLSAgICB7Ci0gICAgICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBzbGlkZTsKLQotICAgICAga25vdyAoKHRleHRfbGFzdF9mcmFnLT5mcl90eXBlID09IHJzX2ZpbGwpICYmICh0ZXh0X2xhc3RfZnJhZy0+ZnJfb2Zmc2V0ID09IDApKTsKLQotICAgICAgSF9TRVRfREFUQV9TSVpFICgmaGVhZGVycywgZGF0YV9sYXN0X2ZyYWctPmZyX2FkZHJlc3MpOwotICAgICAgZGF0YV9sYXN0X2ZyYWctPmZyX2FkZHJlc3MgPSBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKTsKLSAgICAgIHNsaWRlID0gSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyk7CS8qICYgaW4gZmlsZSBvZiB0aGUgZGF0YSBzZWdtZW50LiAqLwotI2lmZGVmIE9CSl9CT1VUCi0jZGVmaW5lIFJvdW5kVXAoTixTKSAoKChOKSsoUyktMSkmLShTKSkKLSAgICAgIC8qIEZvciBiLm91dDogSWYgdGhlIGRhdGEgc2VjdGlvbiBoYXMgYSBzdHJpY3QgYWxpZ25tZW50Ci0JIHJlcXVpcmVtZW50LCBpdHMgbG9hZCBhZGRyZXNzIGluIHRoZSAubyBmaWxlIHdpbGwgYmUKLQkgcm91bmRlZCB1cCBmcm9tIHRoZSBzaXplIG9mIHRoZSB0ZXh0IHNlY3Rpb24uICBUaGVzZQotCSB0d28gdmFsdWVzIGFyZSAqbm90KiB0aGUgc2FtZSEgIFNpbWlsYXJseSBmb3IgdGhlIGJzcwotCSBzZWN0aW9uLi4uLiAgKi8KLSAgICAgIHNsaWRlID0gUm91bmRVcCAoc2xpZGUsIDEgPDwgc2VjdGlvbl9hbGlnbm1lbnRbU0VHX0RBVEFdKTsKLSNlbmRpZgotCi0gICAgICBmb3IgKGZyYWdQID0gZGF0YV9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCXsKLQkgIGZyYWdQLT5mcl9hZGRyZXNzICs9IHNsaWRlOwotCX0JCQkvKiBmb3IgZWFjaCBkYXRhIGZyYWcgKi8KLQotICAgICAga25vdyAodGV4dF9sYXN0X2ZyYWcgIT0gMCk7Ci0gICAgICB0ZXh0X2xhc3RfZnJhZy0+ZnJfbmV4dCA9IGRhdGFfZnJhZ19yb290OwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIEhfU0VUX0RBVEFfU0laRSAoJmhlYWRlcnMsIDApOwotICAgIH0KLQotI2lmZGVmIE9CSl9CT1VUCi0gIC8qIFNlZSBhYm92ZSBjb21tZW50cyBvbiBiLm91dCBkYXRhIHNlY3Rpb24gYWRkcmVzcy4gICovCi0gIHsKLSAgICBsb25nIGJzc192bWE7Ci0gICAgaWYgKGRhdGFfbGFzdF9mcmFnID09IDApCi0gICAgICBic3Nfdm1hID0gSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycyk7Ci0gICAgZWxzZQotICAgICAgYnNzX3ZtYSA9IGRhdGFfbGFzdF9mcmFnLT5mcl9hZGRyZXNzOwotICAgIGJzc192bWEgPSBSb3VuZFVwIChic3Nfdm1hLCAxIDw8IHNlY3Rpb25fYWxpZ25tZW50W1NFR19CU1NdKTsKLSAgICBic3NfYWRkcmVzc19mcmFnLmZyX2FkZHJlc3MgPSBic3Nfdm1hOwotICB9Ci0jZWxzZSAvKiAhIE9CSl9CT1VUICovCi0gIGJzc19hZGRyZXNzX2ZyYWcuZnJfYWRkcmVzcyA9IChIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArCi0JCQkJIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpKTsKLQotI2VuZGlmIC8qICEgT0JKX0JPVVQgKi8KLQotICAvKiBTbGlkZSBhbGwgdGhlIGZyYWdzICovCi0gIGlmIChic3NfZnJhZ19yb290KQotICAgIHsKLSAgICAgIHJlbGF4X2FkZHJlc3NUIHNsaWRlID0gYnNzX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzOwotCi0gICAgICBmb3IgKGZyYWdQID0gYnNzX2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0JewotCSAgZnJhZ1AtPmZyX2FkZHJlc3MgKz0gc2xpZGU7Ci0JfQkJCS8qIGZvciBlYWNoIGJzcyBmcmFnICovCi0gICAgfQotCi0gIGlmIChic3NfbGFzdF9mcmFnKQotICAgIEhfU0VUX0JTU19TSVpFICgmaGVhZGVycywKLQkJICAgIGJzc19sYXN0X2ZyYWctPmZyX2FkZHJlc3MgLSBic3NfZnJhZ19yb290LT5mcl9hZGRyZXNzKTsKLSAgZWxzZQotICAgIEhfU0VUX0JTU19TSVpFICgmaGVhZGVycywgMCk7Ci19Ci0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICYmICEgQkZEICovCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAhZGVmaW5lZCAoQkZEKQotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotc3RhdGljIHZvaWQKLXNldF9zeW10YWIgKCkKLXsKLSAgaW50IG5zeW1zOwotICBhc3ltYm9sICoqYXN5bXBwOwotICBzeW1ib2xTICpzeW1wOwotICBib29sZWFuIHJlc3VsdDsKLSAgZXh0ZXJuIFBUUiBiZmRfYWxsb2MgUEFSQU1TICgoYmZkICosIHNpemVfdCkpOwotCi0gIC8qIENvdW50IHN5bWJvbHMuICBXZSBjYW4ndCByZWx5IG9uIGEgY291bnQgbWFkZSBieSB0aGUgbG9vcCBpbgotICAgICB3cml0ZV9vYmplY3RfZmlsZSwgYmVjYXVzZSAqX2Zyb2JfZmlsZSBtYXkgYWRkIGEgbmV3IHN5bWJvbCBvcgotICAgICB0d28uICAqLwotICBuc3ltcyA9IDA7Ci0gIGZvciAoc3ltcCA9IHN5bWJvbF9yb290UDsgc3ltcDsgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKLSAgICBuc3ltcysrOwotCi0gIGlmIChuc3ltcykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgYXN5bXBwID0gKGFzeW1ib2wgKiopIGJmZF9hbGxvYyAoc3Rkb3V0cHV0LAotCQkJCSAgICAgICBuc3ltcyAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gICAgICBzeW1wID0gc3ltYm9sX3Jvb3RQOwotICAgICAgZm9yIChpID0gMDsgaSA8IG5zeW1zOyBpKyssIHN5bXAgPSBzeW1ib2xfbmV4dCAoc3ltcCkpCi0JewotCSAgYXN5bXBwW2ldID0gc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApOwotCSAgc3ltYm9sX21hcmtfd3JpdHRlbiAoc3ltcCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGFzeW1wcCA9IDA7Ci0gIHJlc3VsdCA9IGJmZF9zZXRfc3ltdGFiIChzdGRvdXRwdXQsIGFzeW1wcCwgbnN5bXMpOwotICBhc3NlcnQgKHJlc3VsdCA9PSB0cnVlKTsKLSAgc3ltYm9sX3RhYmxlX2Zyb3plbiA9IDE7Ci19Ci0jZW5kaWYKLQotLyogRmluaXNoIHRoZSBzdWJzZWdtZW50cy4gIEFmdGVyIGV2ZXJ5IHN1Yi1zZWdtZW50LCB3ZSBmYWtlIGFuCi0gICAiLmFsaWduIC4uLiIuICBUaGlzIGNvbmZvcm1zIHRvIEJTRDQuMiBicmFuZS1kYW1hZ2UuICBXZSB0aGVuIGZha2UKLSAgICIuZmlsbCAwIiBiZWNhdXNlIHRoYXQgaXMgdGhlIGtpbmQgb2YgZnJhZyB0aGF0IHJlcXVpcmVzIGxlYXN0Ci0gICB0aG91Z2h0LiAgIi5hbGlnbiIgZnJhZ3MgbGlrZSB0byBoYXZlIGEgZm9sbG93aW5nIGZyYWcgc2luY2UgdGhhdAotICAgbWFrZXMgY2FsY3VsYXRpbmcgdGhlaXIgaW50ZW5kZWQgbGVuZ3RoIHRyaXZpYWwuICAqLwotCi0jaWZuZGVmIFNVQl9TRUdNRU5UX0FMSUdOCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2RlZmluZSBTVUJfU0VHTUVOVF9BTElHTihTRUcpICgwKQotI2Vsc2UKLSNkZWZpbmUgU1VCX1NFR01FTlRfQUxJR04oU0VHKSAoMikKLSNlbmRpZgotI2VuZGlmCi0KLXZvaWQKLXN1YnNlZ3NfZmluaXNoICgpCi17Ci0gIHN0cnVjdCBmcmNoYWluICpmcmNoYWluUDsKLQotICBmb3IgKGZyY2hhaW5QID0gZnJjaGFpbl9yb290OyBmcmNoYWluUDsgZnJjaGFpblAgPSBmcmNoYWluUC0+ZnJjaF9uZXh0KQotICAgIHsKLSAgICAgIHN1YnNlZ19zZXQgKGZyY2hhaW5QLT5mcmNoX3NlZywgZnJjaGFpblAtPmZyY2hfc3Vic2VnKTsKLQotICAgICAgLyogVGhpcyBub3cgZ2V0cyBjYWxsZWQgZXZlbiBpZiB3ZSBoYWQgZXJyb3JzLiAgSW4gdGhhdCBjYXNlLAotICAgICAgICAgYW55IGFsaWdubWVudCBpcyBtZWFuaW5nbGVzcywgYW5kLCBtb3Jlb3Zlciwgd2lsbCBsb29rIHdlaXJkCi0gICAgICAgICBpZiB3ZSBhcmUgZ2VuZXJhdGluZyBhIGxpc3RpbmcuICAqLwotICAgICAgZnJhZ19hbGlnbiAoaGFkX2Vycm9ycyAoKSA/IDAgOiBTVUJfU0VHTUVOVF9BTElHTiAobm93X3NlZyksCi0JCSAgc3Vic2VnX3RleHRfcCAobm93X3NlZykgPyBOT1BfT1BDT0RFIDogMCwKLQkJICAwKTsKLQotICAgICAgLyogZnJhZ19hbGlnbiB3aWxsIGhhdmUgbGVmdCBhIG5ldyBmcmFnLgotCSBVc2UgdGhpcyBsYXN0IGZyYWcgZm9yIGFuIGVtcHR5ICIuZmlsbCIuCi0KLQkgRm9yIHRoaXMgc2VnbWVudCAuLi4KLQkgQ3JlYXRlIGEgbGFzdCBmcmFnLiBEbyBub3QgbGVhdmUgYSAiYmVpbmcgZmlsbGVkIGluIGZyYWciLiAgKi8KLQotICAgICAgZnJhZ193YW5lIChmcmFnX25vdyk7Ci0gICAgICBmcmFnX25vdy0+ZnJfZml4ID0gMDsKLSAgICAgIGtub3cgKGZyYWdfbm93LT5mcl9uZXh0ID09IE5VTEwpOwotICAgIH0KLX0KLQotLyogV3JpdGUgdGhlIG9iamVjdCBmaWxlLiAgKi8KLQotdm9pZAotd3JpdGVfb2JqZWN0X2ZpbGUgKCkKLXsKLSNpZiAhIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICEgZGVmaW5lZCAoV09SS0lOR19ET1RfV09SRCkKLSAgZnJhZ1MgKmZyYWdQOwkJCS8qIFRyYWNrIGFsb25nIGFsbCBmcmFncy4gKi8KLSNlbmRpZgotCi0gIC8qIERvIHdlIHJlYWxseSB3YW50IHRvIHdyaXRlIGl0PyAgKi8KLSAgewotICAgIGludCBuX3dhcm5zLCBuX2VycnM7Ci0gICAgbl93YXJucyA9IGhhZF93YXJuaW5ncyAoKTsKLSAgICBuX2VycnMgPSBoYWRfZXJyb3JzICgpOwotICAgIC8qIFRoZSAtWiBmbGFnIGluZGljYXRlcyB0aGF0IGFuIG9iamVjdCBmaWxlIHNob3VsZCBiZSBnZW5lcmF0ZWQsCi0gICAgICAgcmVnYXJkbGVzcyBvZiB3YXJuaW5ncyBhbmQgZXJyb3JzLiAgKi8KLSAgICBpZiAoZmxhZ19hbHdheXNfZ2VuZXJhdGVfb3V0cHV0KQotICAgICAgewotCWlmIChuX3dhcm5zIHx8IG5fZXJycykKLQkgIGFzX3dhcm4gKF8oIiVkIGVycm9yJXMsICVkIHdhcm5pbmclcywgZ2VuZXJhdGluZyBiYWQgb2JqZWN0IGZpbGUuXG4iKSwKLQkJICAgbl9lcnJzLCBuX2VycnMgPT0gMSA/ICIiIDogInMiLAotCQkgICBuX3dhcm5zLCBuX3dhcm5zID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotCWlmIChuX2VycnMpCi0JICBhc19mYXRhbCAoXygiJWQgZXJyb3IlcywgJWQgd2FybmluZyVzLCBubyBvYmplY3QgZmlsZSBnZW5lcmF0ZWQuXG4iKSwKLQkJICAgIG5fZXJycywgbl9lcnJzID09IDEgPyAiIiA6ICJzIiwKLQkJICAgIG5fd2FybnMsIG5fd2FybnMgPT0gMSA/ICIiIDogInMiKTsKLSAgICAgIH0KLSAgfQotCi0jaWZkZWYJT0JKX1ZNUwotICAvKiBVbmRlciBWTVMgd2UgdHJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBWQVgtMTEgIkMiLiAgVGh1cywgd2UgY2FsbAotICAgICBhIHJvdXRpbmUgdG8gY2hlY2sgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcm9jZWR1cmUgIl9tYWluIiwKLSAgICAgYW5kIGlmIHNvIC0tIGZpeCBpdCB1cCBzbyB0aGF0IGl0IGNhbiBiZSBwcm9ncmFtIGVudHJ5IHBvaW50LiAqLwotICB2bXNfY2hlY2tfZm9yX21haW4gKCk7Ci0jZW5kaWYgLyogT0JKX1ZNUyAqLwotCi0gIC8qIEZyb20gbm93IG9uLCB3ZSBkb24ndCBjYXJlIGFib3V0IHN1Yi1zZWdtZW50cy4gIEJ1aWxkIG9uZSBmcmFnIGNoYWluCi0gICAgIGZvciBlYWNoIHNlZ21lbnQuIExpbmtlZCB0aHJ1IGZyX25leHQuICAqLwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICAvKiBSZW1vdmUgdGhlIHNlY3Rpb25zIGNyZWF0ZWQgYnkgZ2FzIGZvciBpdHMgb3duIHB1cnBvc2VzLiAgKi8KLSAgewotICAgIGFzZWN0aW9uICoqc2VjbGlzdCwgKnNlYzsKLSAgICBpbnQgaTsKLQotICAgIHNlY2xpc3QgPSAmc3Rkb3V0cHV0LT5zZWN0aW9uczsKLSAgICB3aGlsZSAoc2VjbGlzdCAmJiAqc2VjbGlzdCkKLSAgICAgIHsKLQlzZWMgPSAqc2VjbGlzdDsKLQl3aGlsZSAoc2VjID09IHJlZ19zZWN0aW9uIHx8IHNlYyA9PSBleHByX3NlY3Rpb24pCi0JICB7Ci0JICAgIHNlYyA9IHNlYy0+bmV4dDsKLQkgICAgKnNlY2xpc3QgPSBzZWM7Ci0JICAgIHN0ZG91dHB1dC0+c2VjdGlvbl9jb3VudC0tOwotCSAgICBpZiAoIXNlYykKLQkgICAgICBicmVhazsKLQkgIH0KLQlpZiAoKnNlY2xpc3QpCi0JICBzZWNsaXN0ID0gJigqc2VjbGlzdCktPm5leHQ7Ci0gICAgICB9Ci0gICAgaSA9IDA7Ci0gICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIHJlbnVtYmVyX3NlY3Rpb25zLCAmaSk7Ci0gIH0KLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgY2hhaW5fZnJjaGFpbnNfdG9nZXRoZXIsIChjaGFyICopIDApOwotI2Vsc2UKLSAgcmVtb3ZlX3N1YnNlZ3MgKGZyY2hhaW5fcm9vdCwgU0VHX1RFWFQsICZ0ZXh0X2ZyYWdfcm9vdCwgJnRleHRfbGFzdF9mcmFnKTsKLSAgcmVtb3ZlX3N1YnNlZ3MgKGRhdGEwX2ZyY2hhaW5QLCBTRUdfREFUQSwgJmRhdGFfZnJhZ19yb290LCAmZGF0YV9sYXN0X2ZyYWcpOwotICByZW1vdmVfc3Vic2VncyAoYnNzMF9mcmNoYWluUCwgU0VHX0JTUywgJmJzc19mcmFnX3Jvb3QsICZic3NfbGFzdF9mcmFnKTsKLSNlbmRpZgotCi0gIC8qIFdlIGhhdmUgdHdvIHNlZ21lbnRzLiBJZiB1c2VyIGdhdmUgLVIgZmxhZywgdGhlbiB3ZSBtdXN0IHB1dCB0aGUKLSAgICAgZGF0YSBmcmFncyBpbnRvIHRoZSB0ZXh0IHNlZ21lbnQuIERvIHRoaXMgYmVmb3JlIHJlbGF4aW5nIHNvCi0gICAgIHdlIGtub3cgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgLVIgYW5kIG1ha2Ugc2hvcnRlciBhZGRyZXNzZXMuICAqLwotI2lmICFkZWZpbmVkIChPQkpfQU9VVCkgfHwgZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAgaWYgKGZsYWdfcmVhZG9ubHlfZGF0YV9pbl90ZXh0KQotICAgIHsKLSAgICAgIG1lcmdlX2RhdGFfaW50b190ZXh0ICgpOwotICAgIH0KLSNlbmRpZgotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgcmVsYXhfYW5kX3NpemVfc2VnLCAoY2hhciAqKSAwKTsKLSNlbHNlCi0gIHJlbGF4X2FuZF9zaXplX2FsbF9zZWdtZW50cyAoKTsKLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotICAvKgotICAgKgotICAgKiBDcmF3bCB0aGUgc3ltYm9sIGNoYWluLgotICAgKgotICAgKiBGb3IgZWFjaCBzeW1ib2wgd2hvc2UgdmFsdWUgZGVwZW5kcyBvbiBhIGZyYWcsIHRha2UgdGhlIGFkZHJlc3Mgb2YKLSAgICogdGhhdCBmcmFnIGFuZCBzdWJzdW1lIGl0IGludG8gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wuCi0gICAqIEFmdGVyIHRoaXMsIHRoZXJlIGlzIGp1c3Qgb25lIHdheSB0byBsb29rdXAgYSBzeW1ib2wgdmFsdWUuCi0gICAqIFZhbHVlcyBhcmUgbGVmdCBpbiB0aGVpciBmaW5hbCBzdGF0ZSBmb3Igb2JqZWN0IGZpbGUgZW1pc3Npb24uCi0gICAqIFdlIGFkanVzdCB0aGUgdmFsdWVzIG9mICdMJyBsb2NhbCBzeW1ib2xzLCBldmVuIGlmIHdlIGRvCi0gICAqIG5vdCBpbnRlbmQgdG8gZW1pdCB0aGVtIHRvIHRoZSBvYmplY3QgZmlsZSwgYmVjYXVzZSB0aGVpciB2YWx1ZXMKLSAgICogYXJlIG5lZWRlZCBmb3IgZml4LXVwcy4KLSAgICoKLSAgICogVW5sZXNzIHdlIHNhdyBhIC1MIGZsYWcsIHJlbW92ZSBhbGwgc3ltYm9scyB0aGF0IGJlZ2luIHdpdGggJ0wnCi0gICAqIGZyb20gdGhlIHN5bWJvbCBjaGFpbi4gIChUaGV5IGFyZSBzdGlsbCBwb2ludGVkIHRvIGJ5IHRoZSBmaXhlcy4pCi0gICAqCi0gICAqIENvdW50IHRoZSByZW1haW5pbmcgc3ltYm9scy4KLSAgICogQXNzaWduIGEgc3ltYm9sIG51bWJlciB0byBlYWNoIHN5bWJvbC4KLSAgICogQ291bnQgdGhlIG51bWJlciBvZiBzdHJpbmctdGFibGUgY2hhcnMgd2Ugd2lsbCBlbWl0LgotICAgKiBQdXQgdGhpcyBpbmZvIGludG8gdGhlIGhlYWRlcnMgYXMgYXBwcm9wcmlhdGUuCi0gICAqCi0gICAqLwotICBrbm93ICh6ZXJvX2FkZHJlc3NfZnJhZy5mcl9hZGRyZXNzID09IDApOwotICBzdHJpbmdfYnl0ZV9jb3VudCA9IHNpemVvZiAoc3RyaW5nX2J5dGVfY291bnQpOwotCi0gIG9ial9jcmF3bF9zeW1ib2xfY2hhaW4gKCZoZWFkZXJzKTsKLQotICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPT0gc2l6ZW9mIChzdHJpbmdfYnl0ZV9jb3VudCkpCi0gICAgc3RyaW5nX2J5dGVfY291bnQgPSAwOwotCi0gIEhfU0VUX1NUUklOR19TSVpFICgmaGVhZGVycywgc3RyaW5nX2J5dGVfY291bnQpOwotCi0gIC8qCi0gICAqIEFkZHJlc3NlcyBvZiBmcmFncyBub3cgcmVmbGVjdCBhZGRyZXNzZXMgd2UgdXNlIGluIHRoZSBvYmplY3QgZmlsZS4KLSAgICogU3ltYm9sIHZhbHVlcyBhcmUgY29ycmVjdC4KLSAgICogU2NhbiB0aGUgZnJhZ3MsIGNvbnZlcnRpbmcgYW55ICIub3JnInMgYW5kICIuYWxpZ24icyB0byAiLmZpbGwicy4KLSAgICogQWxzbyBjb252ZXJ0aW5nIGFueSBtYWNoaW5lLWRlcGVuZGVudCBmcmFncyB1c2luZyBtZF9jb252ZXJ0X2ZyYWcoKTsKLSAgICovCi0gIHN1YnNlZ19jaGFuZ2UgKFNFR19URVhULCAwKTsKLQotICBmb3IgKGZyYWdQID0gdGV4dF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotICAgIHsKLSAgICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBsaW5rZWQgYWxsIHRoZSBmcmFncyBpbnRvIGEgc2luZ2xlCi0gICAgICAgICBjaGFpbi4gIEhvd2V2ZXIsIGN2dF9mcmFnX3RvX2ZpbGwgbWF5IGNhbGwgbWRfY29udmVydF9mcmFnCi0gICAgICAgICB3aGljaCBtYXkgY2FsbCBmaXhfbmV3LiAgV2UgbmVlZCB0byBlbnN1cmUgdGhhdCBmaXhfbmV3IGFkZHMKLSAgICAgICAgIHRoZSBmaXh1cCB0byB0aGUgcmlnaHQgc2VjdGlvbi4gICovCi0gICAgICBpZiAoZnJhZ1AgPT0gZGF0YV9mcmFnX3Jvb3QpCi0Jc3Vic2VnX2NoYW5nZSAoU0VHX0RBVEEsIDApOwotCi0gICAgICBjdnRfZnJhZ190b19maWxsICgmaGVhZGVycywgU0VHX1RFWFQsIGZyYWdQKTsKLQotICAgICAgLyogU29tZSBhc3NlcnQgbWFjcm9zIGRvbid0IHdvcmsgd2l0aCAjIGRpcmVjdGl2ZXMgbWl4ZWQgaW4uICAqLwotI2lmbmRlZiBOREVCVUcKLSAgICAgIGlmICghKGZyYWdQLT5mcl9uZXh0ID09IE5VTEwKLSNpZmRlZiBPQkpfQk9VVAotCSAgICB8fCBmcmFnUC0+ZnJfbmV4dCA9PSBkYXRhX2ZyYWdfcm9vdAotI2VuZGlmCi0JICAgIHx8ICgoZnJhZ1AtPmZyX25leHQtPmZyX2FkZHJlc3MgLSBmcmFnUC0+ZnJfYWRkcmVzcykKLQkJPT0gKGZyYWdQLT5mcl9maXggKyBmcmFnUC0+ZnJfb2Zmc2V0ICogZnJhZ1AtPmZyX3ZhcikpKSkKLQlhYm9ydCAoKTsKLSNlbmRpZgotICAgIH0KLSNlbmRpZiAvKiAhIEJGRF9BU1NFTUJMRVIgKi8KLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0gIHsKLSAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKmxpZTsKLSAgICBzdHJ1Y3QgYnJva2VuX3dvcmQgKipwcmV2UDsKLQotICAgIHByZXZQID0gJmJyb2tlbl93b3JkczsKLSAgICBmb3IgKGxpZSA9IGJyb2tlbl93b3JkczsgbGllOyBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0gICAgICBpZiAoIWxpZS0+YWRkZWQpCi0JewotCSAgZXhwcmVzc2lvblMgZXhwOwotCi0JICBzdWJzZWdfY2hhbmdlIChsaWUtPnNlZywgbGllLT5zdWJzZWcpOwotCSAgZXhwLlhfb3AgPSBPX3N1YnRyYWN0OwotCSAgZXhwLlhfYWRkX3N5bWJvbCA9IGxpZS0+YWRkOwotCSAgZXhwLlhfb3Bfc3ltYm9sID0gbGllLT5zdWI7Ci0JICBleHAuWF9hZGRfbnVtYmVyID0gbGllLT5hZGRudW07Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotI2lmZGVmIFRDX0NPTlNfRklYX05FVwotCSAgVENfQ09OU19GSVhfTkVXIChsaWUtPmZyYWcsCi0JCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkgICAgICAgMiwgJmV4cCk7Ci0jZWxzZQotCSAgZml4X25ld19leHAgKGxpZS0+ZnJhZywKLQkJICAgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAyLCAmZXhwLCAwLCBCRkRfUkVMT0NfMTYpOwotI2VuZGlmCi0jZWxzZQotI2lmIGRlZmluZWQoVENfU1BBUkMpIHx8IGRlZmluZWQoVENfQTI5SykgfHwgZGVmaW5lZChORUVEX0ZYX1JfVFlQRSkKLQkgIGZpeF9uZXdfZXhwIChsaWUtPmZyYWcsCi0JCSAgICAgICBsaWUtPndvcmRfZ29lc19oZXJlIC0gbGllLT5mcmFnLT5mcl9saXRlcmFsLAotCQkgICAgICAgMiwgJmV4cCwgMCwgTk9fUkVMT0MpOwotI2Vsc2UKLSNpZmRlZiBUQ19OUzMySwotCSAgZml4X25ld19uczMya19leHAgKGxpZS0+ZnJhZywKLQkJCSAgICAgbGllLT53b3JkX2dvZXNfaGVyZSAtIGxpZS0+ZnJhZy0+ZnJfbGl0ZXJhbCwKLQkJCSAgICAgMiwgJmV4cCwgMCwgMCwgMiwgMCwgMCk7Ci0jZWxzZQotCSAgZml4X25ld19leHAgKGxpZS0+ZnJhZywKLQkJICAgICAgIGxpZS0+d29yZF9nb2VzX2hlcmUgLSBsaWUtPmZyYWctPmZyX2xpdGVyYWwsCi0JCSAgICAgICAyLCAmZXhwLCAwLCAwKTsKLSNlbmRpZiAvKiBUQ19OUzMySyAqLwotI2VuZGlmIC8qIFRDX1NQQVJDfFRDX0EyOUt8TkVFRF9GWF9SX1RZUEUgKi8KLSNlbmRpZiAvKiBCRkRfQVNTRU1CTEVSICovCi0JICAqcHJldlAgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQ7Ci0JfQotICAgICAgZWxzZQotCXByZXZQID0gJihsaWUtPm5leHRfYnJva2VuX3dvcmQpOwotCi0gICAgZm9yIChsaWUgPSBicm9rZW5fd29yZHM7IGxpZTspCi0gICAgICB7Ci0Jc3RydWN0IGJyb2tlbl93b3JkICp1bnRydXRoOwotCWNoYXIgKnRhYmxlX3B0cjsKLQlhZGRyZXNzVCB0YWJsZV9hZGRyOwotCWFkZHJlc3NUIGZyb21fYWRkciwgdG9fYWRkcjsKLQlpbnQgbiwgbTsKLQotCXN1YnNlZ19jaGFuZ2UgKGxpZS0+c2VnLCBsaWUtPnN1YnNlZyk7Ci0JZnJhZ1AgPSBsaWUtPmRpc3BmcmFnOwotCi0JLyogRmluZCBvdXQgaG93IG1hbnkgYnJva2VuX3dvcmRzIGdvIGhlcmUuICAqLwotCW4gPSAwOwotCWZvciAodW50cnV0aCA9IGxpZTsgdW50cnV0aCAmJiB1bnRydXRoLT5kaXNwZnJhZyA9PSBmcmFnUDsgdW50cnV0aCA9IHVudHJ1dGgtPm5leHRfYnJva2VuX3dvcmQpCi0JICBpZiAodW50cnV0aC0+YWRkZWQgPT0gMSkKLQkgICAgbisrOwotCi0JdGFibGVfcHRyID0gbGllLT5kaXNwZnJhZy0+ZnJfb3Bjb2RlOwotCXRhYmxlX2FkZHIgPSBsaWUtPmRpc3BmcmFnLT5mcl9hZGRyZXNzICsgKHRhYmxlX3B0ciAtIGxpZS0+ZGlzcGZyYWctPmZyX2xpdGVyYWwpOwotCS8qIENyZWF0ZSB0aGUganVtcCBhcm91bmQgdGhlIGxvbmcganVtcHMuICBUaGlzIGlzIGEgc2hvcnQKLQkgICBqdW1wIGZyb20gdGFibGVfcHRyKzAgdG8gdGFibGVfcHRyK24qbG9uZ19qdW1wX3NpemUuICAqLwotCWZyb21fYWRkciA9IHRhYmxlX2FkZHI7Ci0JdG9fYWRkciA9IHRhYmxlX2FkZHIgKyBtZF9zaG9ydF9qdW1wX3NpemUgKyBuICogbWRfbG9uZ19qdW1wX3NpemU7Ci0JbWRfY3JlYXRlX3Nob3J0X2p1bXAgKHRhYmxlX3B0ciwgZnJvbV9hZGRyLCB0b19hZGRyLCBsaWUtPmRpc3BmcmFnLCBsaWUtPmFkZCk7Ci0JdGFibGVfcHRyICs9IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQl0YWJsZV9hZGRyICs9IG1kX3Nob3J0X2p1bXBfc2l6ZTsKLQotCWZvciAobSA9IDA7IGxpZSAmJiBsaWUtPmRpc3BmcmFnID09IGZyYWdQOyBtKyssIGxpZSA9IGxpZS0+bmV4dF9icm9rZW5fd29yZCkKLQkgIHsKLQkgICAgaWYgKGxpZS0+YWRkZWQgPT0gMikKLQkgICAgICBjb250aW51ZTsKLQkgICAgLyogUGF0Y2ggdGhlIGp1bXAgdGFibGUgKi8KLQkgICAgLyogVGhpcyBpcyB0aGUgb2Zmc2V0IGZyb20gPz8/IHRvIHRhYmxlX3B0ciswICovCi0JICAgIHRvX2FkZHIgPSB0YWJsZV9hZGRyIC0gU19HRVRfVkFMVUUgKGxpZS0+c3ViKTsKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgIHRvX2FkZHIgLT0gc3ltYm9sX2dldF9mcmFnIChsaWUtPnN1YiktPmZyX2FkZHJlc3M7Ci0jZW5kaWYKLQkgICAgbWRfbnVtYmVyX3RvX2NoYXJzIChsaWUtPndvcmRfZ29lc19oZXJlLCB0b19hZGRyLCAyKTsKLQkgICAgZm9yICh1bnRydXRoID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkOyB1bnRydXRoICYmIHVudHJ1dGgtPmRpc3BmcmFnID09IGZyYWdQOyB1bnRydXRoID0gdW50cnV0aC0+bmV4dF9icm9rZW5fd29yZCkKLQkgICAgICB7Ci0JCWlmICh1bnRydXRoLT51c2VfanVtcCA9PSBsaWUpCi0JCSAgbWRfbnVtYmVyX3RvX2NoYXJzICh1bnRydXRoLT53b3JkX2dvZXNfaGVyZSwgdG9fYWRkciwgMik7Ci0JICAgICAgfQotCi0JICAgIC8qIEluc3RhbGwgdGhlIGxvbmcganVtcCAqLwotCSAgICAvKiB0aGlzIGlzIGEgbG9uZyBqdW1wIGZyb20gdGFibGVfcHRyKzAgdG8gdGhlIGZpbmFsIHRhcmdldCAqLwotCSAgICBmcm9tX2FkZHIgPSB0YWJsZV9hZGRyOwotCSAgICB0b19hZGRyID0gU19HRVRfVkFMVUUgKGxpZS0+YWRkKSArIGxpZS0+YWRkbnVtOwotI2lmZGVmIEJGRF9BU1NFTUJMRVIKLQkgICAgdG9fYWRkciArPSBzeW1ib2xfZ2V0X2ZyYWcgKGxpZS0+YWRkKS0+ZnJfYWRkcmVzczsKLSNlbmRpZgotCSAgICBtZF9jcmVhdGVfbG9uZ19qdW1wICh0YWJsZV9wdHIsIGZyb21fYWRkciwgdG9fYWRkciwgbGllLT5kaXNwZnJhZywgbGllLT5hZGQpOwotCSAgICB0YWJsZV9wdHIgKz0gbWRfbG9uZ19qdW1wX3NpemU7Ci0JICAgIHRhYmxlX2FkZHIgKz0gbWRfbG9uZ19qdW1wX3NpemU7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLSNlbmRpZiAvKiBub3QgV09SS0lOR19ET1RfV09SRCAqLwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLSNpZm5kZWYJT0JKX1ZNUwotICB7CQkJCS8qIG5vdCB2bXMgKi8KLSAgICBjaGFyICp0aGVfb2JqZWN0X2ZpbGU7Ci0gICAgbG9uZyBvYmplY3RfZmlsZV9zaXplOwotICAgIC8qCi0gICAgICogU2NhbiBldmVyeSBGaXhTIHBlcmZvcm1pbmcgZml4dXBzLiBXZSBoYWQgdG8gd2FpdCB1bnRpbCBub3cgdG8gZG8KLSAgICAgKiB0aGlzIGJlY2F1c2UgbWRfY29udmVydF9mcmFnKCkgbWF5IGhhdmUgbWFkZSBzb21lIGZpeFNzLgotICAgICAqLwotICAgIGludCB0cnNpemUsIGRyc2l6ZTsKLQotICAgIHN1YnNlZ19jaGFuZ2UgKFNFR19URVhULCAwKTsKLSAgICB0cnNpemUgPSBtZF9yZWxvY19zaXplICogZml4dXBfc2VnbWVudCAodGV4dF9maXhfcm9vdCwgU0VHX1RFWFQpOwotICAgIHN1YnNlZ19jaGFuZ2UgKFNFR19EQVRBLCAwKTsKLSAgICBkcnNpemUgPSBtZF9yZWxvY19zaXplICogZml4dXBfc2VnbWVudCAoZGF0YV9maXhfcm9vdCwgU0VHX0RBVEEpOwotICAgIEhfU0VUX1JFTE9DQVRJT05fU0laRSAoJmhlYWRlcnMsIHRyc2l6ZSwgZHJzaXplKTsKLQotICAgIC8qIEZJWE1FIG1vdmUgdGhpcyBzdHVmZiBpbnRvIHRoZSBwcmUtd3JpdGUtaG9vayAqLwotICAgIEhfU0VUX01BR0lDX05VTUJFUiAoJmhlYWRlcnMsIG1hZ2ljX251bWJlcl9mb3Jfb2JqZWN0X2ZpbGUpOwotICAgIEhfU0VUX0VOVFJZX1BPSU5UICgmaGVhZGVycywgMCk7Ci0KLSAgICBvYmpfcHJlX3dyaXRlX2hvb2sgKCZoZWFkZXJzKTsJLyogZXh0cmEgY29mZiBzdHVmZiAqLwotCi0gICAgb2JqZWN0X2ZpbGVfc2l6ZSA9IEhfR0VUX0ZJTEVfU0laRSAoJmhlYWRlcnMpOwotICAgIG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgPSB0aGVfb2JqZWN0X2ZpbGUgPSB4bWFsbG9jIChvYmplY3RfZmlsZV9zaXplKTsKLQotICAgIG91dHB1dF9maWxlX2NyZWF0ZSAob3V0X2ZpbGVfbmFtZSk7Ci0KLSAgICBvYmpfaGVhZGVyX2FwcGVuZCAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsICZoZWFkZXJzKTsKLQotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSBIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCBjb2RlLgotICAgICAqLwotICAgIGZvciAoZnJhZ1AgPSB0ZXh0X2ZyYWdfcm9vdDsgZnJhZ1A7IGZyYWdQID0gZnJhZ1AtPmZyX25leHQpCi0gICAgICB7Ci0JcmVnaXN0ZXIgbG9uZyBjb3VudDsKLQlyZWdpc3RlciBjaGFyICpmaWxsX2xpdGVyYWw7Ci0JcmVnaXN0ZXIgbG9uZyBmaWxsX3NpemU7Ci0KLQlQUk9HUkVTUyAoMSk7Ci0Ja25vdyAoZnJhZ1AtPmZyX3R5cGUgPT0gcnNfZmlsbCk7Ci0JYXBwZW5kICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgZnJhZ1AtPmZyX2xpdGVyYWwsICh1bnNpZ25lZCBsb25nKSBmcmFnUC0+ZnJfZml4KTsKLQlmaWxsX2xpdGVyYWwgPSBmcmFnUC0+ZnJfbGl0ZXJhbCArIGZyYWdQLT5mcl9maXg7Ci0JZmlsbF9zaXplID0gZnJhZ1AtPmZyX3ZhcjsKLQlrbm93IChmcmFnUC0+ZnJfb2Zmc2V0ID49IDApOwotCi0JZm9yIChjb3VudCA9IGZyYWdQLT5mcl9vZmZzZXQ7IGNvdW50OyBjb3VudC0tKQotCSAgewotCSAgICBhcHBlbmQgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBmaWxsX2xpdGVyYWwsICh1bnNpZ25lZCBsb25nKSBmaWxsX3NpemUpOwotCSAgfQkJCS8qIGZvciBlYWNoICAqLwotCi0gICAgICB9CQkJCS8qIGZvciBlYWNoIGNvZGUgZnJhZy4gKi8KLQotICAgIGtub3cgKChuZXh0X29iamVjdF9maWxlX2NoYXJQIC0gdGhlX29iamVjdF9maWxlKSA9PSAoSF9HRVRfSEVBREVSX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfREFUQV9TSVpFICgmaGVhZGVycykpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCByZWxvY2F0aW9ucy4KLSAgICAgKi8KLSAgICBvYmpfZW1pdF9yZWxvY2F0aW9ucyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIHRleHRfZml4X3Jvb3QsIChyZWxheF9hZGRyZXNzVCkgMCk7Ci0gICAga25vdyAoKG5leHRfb2JqZWN0X2ZpbGVfY2hhclAgLSB0aGVfb2JqZWN0X2ZpbGUpID09IChIX0dFVF9IRUFERVJfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX1RFWFRfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykpKTsKLSNpZmRlZiBUQ19JOTYwCi0gICAgLyogTWFrZSBhZGRyZXNzZXMgaW4gZGF0YSByZWxvY2F0aW9uIGRpcmVjdGl2ZXMgcmVsYXRpdmUgdG8gYmVnaW5uaW5nIG9mCi0gICAgICogZmlyc3QgZGF0YSBmcmFnbWVudCwgbm90IGVuZCBvZiBsYXN0IHRleHQgZnJhZ21lbnQ6ICBhbGlnbm1lbnQgb2YgdGhlCi0gICAgICogc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCBtYXkgcGxhY2UgYSBnYXAgYmV0d2VlbiB0aGUgc2VnbWVudHMuCi0gICAgICovCi0gICAgb2JqX2VtaXRfcmVsb2NhdGlvbnMgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQLCBkYXRhX2ZpeF9yb290LCBkYXRhMF9mcmNoYWluUC0+ZnJjaF9yb290LT5mcl9hZGRyZXNzKTsKLSNlbHNlIC8qIFRDX0k5NjAgKi8KLSAgICBvYmpfZW1pdF9yZWxvY2F0aW9ucyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGRhdGFfZml4X3Jvb3QsIHRleHRfbGFzdF9mcmFnLT5mcl9hZGRyZXNzKTsKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykpKTsKLQotICAgIC8qCi0gICAgICogRW1pdCBsaW5lIG51bWJlciBlbnRyaWVzLgotICAgICAqLwotICAgIE9CSl9FTUlUX0xJTkVOTyAoJm5leHRfb2JqZWN0X2ZpbGVfY2hhclAsIGxpbmVub19yb290UCwgdGhlX29iamVjdF9maWxlKTsKLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9MSU5FTk9fU0laRSAoJmhlYWRlcnMpKSk7Ci0KLSAgICAvKgotICAgICAqIEVtaXQgc3ltYm9scy4KLSAgICAgKi8KLSAgICBvYmpfZW1pdF9zeW1ib2xzICgmbmV4dF9vYmplY3RfZmlsZV9jaGFyUCwgc3ltYm9sX3Jvb3RQKTsKLSAgICBrbm93ICgobmV4dF9vYmplY3RfZmlsZV9jaGFyUCAtIHRoZV9vYmplY3RfZmlsZSkgPT0gKEhfR0VUX0hFQURFUl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfVEVYVF9SRUxPQ0FUSU9OX1NJWkUgKCZoZWFkZXJzKSArIEhfR0VUX0RBVEFfUkVMT0NBVElPTl9TSVpFICgmaGVhZGVycykgKyBIX0dFVF9MSU5FTk9fU0laRSAoJmhlYWRlcnMpICsgSF9HRVRfU1lNQk9MX1RBQkxFX1NJWkUgKCZoZWFkZXJzKSkpOwotCi0gICAgLyoKLSAgICAgKiBFbWl0IHN0cmluZ3MuCi0gICAgICovCi0KLSAgICBpZiAoc3RyaW5nX2J5dGVfY291bnQgPiAwKQotICAgICAgewotCW9ial9lbWl0X3N0cmluZ3MgKCZuZXh0X29iamVjdF9maWxlX2NoYXJQKTsKLSAgICAgIH0JCQkJLyogb25seSBpZiB3ZSBoYXZlIGEgc3RyaW5nIHRhYmxlICovCi0KLSNpZmRlZiBCRkRfSEVBREVSUwotICAgIGJmZF9zZWVrIChzdGRvdXRwdXQsIDAsIDApOwotICAgIGJmZF93cml0ZSAodGhlX29iamVjdF9maWxlLCAxLCBvYmplY3RfZmlsZV9zaXplLCBzdGRvdXRwdXQpOwotI2Vsc2UKLQotICAgIC8qIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSBmaWxlICovCi0gICAgb3V0cHV0X2ZpbGVfYXBwZW5kICh0aGVfb2JqZWN0X2ZpbGUsIG9iamVjdF9maWxlX3NpemUsIG91dF9maWxlX25hbWUpOwotICAgIGZyZWUgKHRoZV9vYmplY3RfZmlsZSk7Ci0jZW5kaWYKLSAgfQkJCQkvKiBub24gdm1zIG91dHB1dCAqLwotI2Vsc2UgLyogT0JKX1ZNUyAqLwotICAvKgotICAgKglOb3cgZG8gdGhlIFZNUy1kZXBlbmRlbnQgcGFydCBvZiB3cml0aW5nIHRoZSBvYmplY3QgZmlsZQotICAgKi8KLSAgdm1zX3dyaXRlX29iamVjdF9maWxlIChIX0dFVF9URVhUX1NJWkUgKCZoZWFkZXJzKSwKLQkJCSBIX0dFVF9EQVRBX1NJWkUgKCZoZWFkZXJzKSwKLQkJCSBIX0dFVF9CU1NfU0laRSAoJmhlYWRlcnMpLAotCQkJIHRleHRfZnJhZ19yb290LCBkYXRhX2ZyYWdfcm9vdCk7Ci0jZW5kaWYgLyogT0JKX1ZNUyAqLwotI2Vsc2UgLyogQkZEX0FTU0VNQkxFUiAqLwotCi0gIC8qIFJlc29sdmUgc3ltYm9sIHZhbHVlcy4gIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgcHJvY2Vzc2luZwotICAgICB0aGUgcmVsb2NhdGlvbnMuICAqLwotICBpZiAoc3ltYm9sX3Jvb3RQKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bXA7Ci0KLSAgICAgIGZvciAoc3ltcCA9IHN5bWJvbF9yb290UDsgc3ltcDsgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKLQlyZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltcCwgMSk7Ci0gICAgfQotICByZXNvbHZlX2xvY2FsX3N5bWJvbF92YWx1ZXMgKCk7Ci0KLSAgUFJPR1JFU1MgKDEpOwotCi0jaWZkZWYgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLSAgdGNfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKCk7Ci0jZW5kaWYKLSNpZmRlZiBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKLSAgb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICgpOwotI2VuZGlmCi0KLSAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChzdGRvdXRwdXQsIGFkanVzdF9yZWxvY19zeW1zLCAoY2hhciAqKTApOwotCi0gIC8qIFNldCB1cCBzeW1ib2wgdGFibGUsIGFuZCB3cml0ZSBpdCBvdXQuICAqLwotICBpZiAoc3ltYm9sX3Jvb3RQKQotICAgIHsKLSAgICAgIHN5bWJvbFMgKnN5bXA7Ci0KLSAgICAgIGZvciAoc3ltcCA9IHN5bWJvbF9yb290UDsgc3ltcDsgc3ltcCA9IHN5bWJvbF9uZXh0IChzeW1wKSkKLQl7Ci0JICBpbnQgcHVudCA9IDA7Ci0JICBjb25zdCBjaGFyICpuYW1lOwotCi0JICBpZiAoc3ltYm9sX21yaV9jb21tb25fcCAoc3ltcCkpCi0JICAgIHsKLQkgICAgICBpZiAoU19JU19FWFRFUk5BTCAoc3ltcCkpCi0JCWFzX2JhZCAoXygiJXM6IGdsb2JhbCBzeW1ib2xzIG5vdCBzdXBwb3J0ZWQgaW4gY29tbW9uIHNlY3Rpb25zIiksCi0JCQlTX0dFVF9OQU1FIChzeW1wKSk7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltcCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgbmFtZSA9IFNfR0VUX05BTUUgKHN5bXApOwotCSAgaWYgKG5hbWUpCi0JICAgIHsKLQkgICAgICBjb25zdCBjaGFyICpuYW1lMiA9IGRlY29kZV9sb2NhbF9sYWJlbF9uYW1lICgoY2hhciAqKVNfR0VUX05BTUUgKHN5bXApKTsKLQkgICAgICAvKiBUaGV5IG9ubHkgZGlmZmVyIGlmIGBuYW1lJyBpcyBhIGZiIG9yIGRvbGxhciBsb2NhbAotCQkgbGFiZWwgbmFtZS4gICovCi0JICAgICAgaWYgKG5hbWUyICE9IG5hbWUgJiYgISBTX0lTX0RFRklORUQgKHN5bXApKQotCQlhc19iYWQgKF8oImxvY2FsIGxhYmVsICVzIGlzIG5vdCBkZWZpbmVkIiksIG5hbWUyKTsKLQkgICAgfQotCi0JICAvKiBEbyBpdCBhZ2FpbiwgYmVjYXVzZSBhZGp1c3RfcmVsb2Nfc3ltcyBtaWdodCBpbnRyb2R1Y2UKLQkgICAgIG1vcmUgc3ltYm9scy4gIFRoZXknbGwgcHJvYmFibHkgb25seSBiZSBzZWN0aW9uIHN5bWJvbHMsCi0JICAgICBidXQgdGhleSdsbCBzdGlsbCBuZWVkIHRvIGhhdmUgdGhlIHZhbHVlcyBjb21wdXRlZC4gICovCi0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ltcCwgMSk7Ci0KLQkgIC8qIFNraXAgc3ltYm9scyB3aGljaCB3ZXJlIGVxdWF0ZWQgdG8gdW5kZWZpbmVkIG9yIGNvbW1vbgotICAgICAgICAgICAgIHN5bWJvbHMuICAqLwotCSAgaWYgKHN5bWJvbF9lcXVhdGVkX3AgKHN5bXApCi0JICAgICAgJiYgKCEgU19JU19ERUZJTkVEIChzeW1wKSB8fCBTX0lTX0NPTU1PTiAoc3ltcCkpKQotCSAgICB7Ci0JICAgICAgc3ltYm9sX3JlbW92ZSAoc3ltcCwgJnN5bWJvbF9yb290UCwgJnN5bWJvbF9sYXN0UCk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogU28gZmFyLCBjb21tb24gc3ltYm9scyBoYXZlIGJlZW4gdHJlYXRlZCBsaWtlIHVuZGVmaW5lZCBzeW1ib2xzLgotCSAgICAgUHV0IHRoZW0gaW4gdGhlIGNvbW1vbiBzZWN0aW9uIG5vdy4gICovCi0JICBpZiAoU19JU19ERUZJTkVEIChzeW1wKSA9PSAwCi0JICAgICAgJiYgU19HRVRfVkFMVUUgKHN5bXApICE9IDApCi0JICAgIFNfU0VUX1NFR01FTlQgKHN5bXAsIGJmZF9jb21fc2VjdGlvbl9wdHIpOwotI2lmIDAKLQkgIHByaW50ZiAoInN5bWJvbCBgJXMnXG5cdEAleDogdmFsdWU9JWQgZmxhZ3M9JXggc2VnPSVzXG4iLAotCQkgIFNfR0VUX05BTUUgKHN5bXApLCBzeW1wLAotCQkgIFNfR0VUX1ZBTFVFIChzeW1wKSwKLQkJICBzeW1ib2xfZ2V0X2JmZHN5bSAoc3ltcCktPmZsYWdzLAotCQkgIHNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoc3ltcCkpKTsKLSNlbmRpZgotCi0jaWZkZWYgb2JqX2Zyb2Jfc3ltYm9sCi0JICBvYmpfZnJvYl9zeW1ib2wgKHN5bXAsIHB1bnQpOwotI2VuZGlmCi0jaWZkZWYgdGNfZnJvYl9zeW1ib2wKLQkgIGlmICghIHB1bnQgfHwgc3ltYm9sX3VzZWRfaW5fcmVsb2NfcCAoc3ltcCkpCi0JICAgIHRjX2Zyb2Jfc3ltYm9sIChzeW1wLCBwdW50KTsKLSNlbmRpZgotCi0JICAvKiBJZiB3ZSBkb24ndCB3YW50IHRvIGtlZXAgdGhpcyBzeW1ib2wsIHNwbGljZSBpdCBvdXQgb2YKLQkgICAgIHRoZSBjaGFpbiBub3cuICBJZiBFTUlUX1NFQ1RJT05fU1lNQk9MUyBpcyAwLCB3ZSBuZXZlcgotCSAgICAgd2FudCBzZWN0aW9uIHN5bWJvbHMuICBPdGhlcndpc2UsIHdlIHNraXAgbG9jYWwgc3ltYm9scwotCSAgICAgYW5kIHN5bWJvbHMgdGhhdCB0aGUgZnJvYl9zeW1ib2wgbWFjcm9zIHRvbGQgdXMgdG8gcHVudCwKLQkgICAgIGJ1dCB3ZSBrZWVwIHN1Y2ggc3ltYm9scyBpZiB0aGV5IGFyZSB1c2VkIGluIHJlbG9jcy4gICovCi0JICBpZiAoKCEgRU1JVF9TRUNUSU9OX1NZTUJPTFMKLQkgICAgICAgJiYgc3ltYm9sX3NlY3Rpb25fcCAoc3ltcCkpCi0JICAgICAgLyogTm90ZSB0aGF0IFNfSVNfRVhURVJOIGFuZCBTX0lTX0xPQ0FMIGFyZSBub3QgYWx3YXlzCi0JCSBvcHBvc2l0ZXMuICBTb21ldGltZXMgdGhlIGZvcm1lciBjaGVja3MgZmxhZ3MgYW5kIHRoZQotCQkgbGF0dGVyIGV4YW1pbmVzIHRoZSBuYW1lLi4uICAqLwotCSAgICAgIHx8ICghU19JU19FWFRFUk4gKHN5bXApCi0JCSAgJiYgKFNfSVNfTE9DQUwgKHN5bXApIHx8IHB1bnQpCi0JCSAgJiYgISBzeW1ib2xfdXNlZF9pbl9yZWxvY19wIChzeW1wKSkpCi0JICAgIHsKLQkgICAgICBzeW1ib2xfcmVtb3ZlIChzeW1wLCAmc3ltYm9sX3Jvb3RQLCAmc3ltYm9sX2xhc3RQKTsKLQkgICAgICAvKiBBZnRlciBzeW1ib2xfcmVtb3ZlLCBzeW1ib2xfbmV4dChzeW1wKSBzdGlsbCByZXR1cm5zCi0JCSB0aGUgb25lIHRoYXQgY2FtZSBhZnRlciBpdCBpbiB0aGUgY2hhaW4uICBTbyB3ZSBkb24ndAotCQkgbmVlZCB0byBkbyBhbnkgZXh0cmEgY2xlYW51cCB3b3JrIGhlcmUuICAqLwotCi0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQotCSAgLyogTWFrZSBzdXJlIHdlIHJlYWxseSBnb3QgYSB2YWx1ZSBmb3IgdGhlIHN5bWJvbC4gICovCi0JICBpZiAoISBzeW1ib2xfcmVzb2x2ZWRfcCAoc3ltcCkpCi0JICAgIHsKLQkgICAgICBhc19iYWQgKF8oImNhbid0IHJlc29sdmUgdmFsdWUgZm9yIHN5bWJvbCBcIiVzXCIiKSwKLQkJICAgICAgU19HRVRfTkFNRSAoc3ltcCkpOwotCSAgICAgIHN5bWJvbF9tYXJrX3Jlc29sdmVkIChzeW1wKTsKLQkgICAgfQotCi0JICAvKiBTZXQgdGhlIHZhbHVlIGludG8gdGhlIEJGRCBzeW1ib2wuICBVcCB0aWwgbm93IHRoZSB2YWx1ZQotCSAgICAgaGFzIG9ubHkgYmVlbiBrZXB0IGluIHRoZSBnYXMgc3ltYm9sUyBzdHJ1Y3QuICAqLwotCSAgc3ltYm9sX2dldF9iZmRzeW0gKHN5bXApLT52YWx1ZSA9IFNfR0VUX1ZBTFVFIChzeW1wKTsKLQl9Ci0gICAgfQotCi0gIFBST0dSRVNTICgxKTsKLQotICAvKiBOb3cgZG8gYW55IGZvcm1hdC1zcGVjaWZpYyBhZGp1c3RtZW50cyB0byB0aGUgc3ltYm9sIHRhYmxlLCBzdWNoCi0gICAgIGFzIGFkZGluZyBmaWxlIHN5bWJvbHMuICAqLwotI2lmZGVmIHRjX2FkanVzdF9zeW10YWIKLSAgdGNfYWRqdXN0X3N5bXRhYiAoKTsKLSNlbmRpZgotI2lmZGVmIG9ial9hZGp1c3Rfc3ltdGFiCi0gIG9ial9hZGp1c3Rfc3ltdGFiICgpOwotI2VuZGlmCi0KLSAgLyogTm93IHRoYXQgYWxsIHRoZSBzaXplcyBhcmUga25vd24sIGFuZCBjb250ZW50cyBjb3JyZWN0LCB3ZSBjYW4KLSAgICAgc3RhcnQgd3JpdGluZyB0byB0aGUgZmlsZS4gICovCi0gIHNldF9zeW10YWIgKCk7Ci0KLSAgLyogSWYgKl9mcm9iX2ZpbGUgY2hhbmdlcyB0aGUgc3ltYm9sIHZhbHVlIGF0IHRoaXMgcG9pbnQsIGl0IGlzCi0gICAgIHJlc3BvbnNpYmxlIGZvciBtb3ZpbmcgdGhlIGNoYW5nZWQgdmFsdWUgaW50byBzeW1wLT5ic3ltLT52YWx1ZQotICAgICBhcyB3ZWxsLiAgSG9wZWZ1bGx5IGFsbCBzeW1ib2wgdmFsdWUgY2hhbmdpbmcgY2FuIGJlIGRvbmUgaW4KLSAgICAgKl9mcm9iX3N5bWJvbC4gICovCi0jaWZkZWYgdGNfZnJvYl9maWxlCi0gIHRjX2Zyb2JfZmlsZSAoKTsKLSNlbmRpZgotI2lmZGVmIG9ial9mcm9iX2ZpbGUKLSAgb2JqX2Zyb2JfZmlsZSAoKTsKLSNlbmRpZgotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoc3Rkb3V0cHV0LCB3cml0ZV9yZWxvY3MsIChjaGFyICopIDApOwotCi0jaWZkZWYgdGNfZnJvYl9maWxlX2FmdGVyX3JlbG9jcwotICB0Y19mcm9iX2ZpbGVfYWZ0ZXJfcmVsb2NzICgpOwotI2VuZGlmCi0jaWZkZWYgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MKLSAgb2JqX2Zyb2JfZmlsZV9hZnRlcl9yZWxvY3MgKCk7Ci0jZW5kaWYKLQotICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHN0ZG91dHB1dCwgd3JpdGVfY29udGVudHMsIChjaGFyICopIDApOwotI2VuZGlmIC8qIEJGRF9BU1NFTUJMRVIgKi8KLX0KLSNlbmRpZiAvKiAhIEJGRCAqLwotCi0vKgotICoJCQlyZWxheF9zZWdtZW50KCkKLSAqCi0gKiBOb3cgd2UgaGF2ZSBhIHNlZ21lbnQsIG5vdCBhIGNyb3dkIG9mIHN1Yi1zZWdtZW50cywgd2UgY2FuIG1ha2UgZnJfYWRkcmVzcwotICogdmFsdWVzLgotICoKLSAqIFJlbGF4IHRoZSBmcmFncy4KLSAqCi0gKiBBZnRlciB0aGlzLCBhbGwgZnJhZ3MgaW4gdGhpcyBzZWdtZW50IGhhdmUgYWRkcmVzc2VzIHRoYXQgYXJlIGNvcnJlY3QKLSAqIHdpdGhpbiB0aGUgc2VnbWVudC4gU2luY2Ugc2VnbWVudHMgbGl2ZSBpbiBkaWZmZXJlbnQgZmlsZSBhZGRyZXNzZXMsCi0gKiB0aGVzZSBmcmFnIGFkZHJlc3NlcyBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIGZpbmFsIG9iamVjdC1maWxlIGFkZHJlc3Nlcy4KLSAqLwotCi0jaWZkZWYgVENfR0VORVJJQ19SRUxBWF9UQUJMRQotCi1zdGF0aWMgaW50IGlzX2RucmFuZ2UgUEFSQU1TICgoZnJhZ1MgKiwgZnJhZ1MgKikpOwotCi0vKiBTdWJyb3V0aW5lcyBvZiByZWxheF9zZWdtZW50LiAgKi8KLXN0YXRpYyBpbnQKLWlzX2RucmFuZ2UgKGYxLCBmMikKLSAgICAgZnJhZ1MgKmYxOwotICAgICBmcmFnUyAqZjI7Ci17Ci0gIGZvciAoOyBmMTsgZjEgPSBmMS0+ZnJfbmV4dCkKLSAgICBpZiAoZjEtPmZyX25leHQgPT0gZjIpCi0gICAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFJlbGF4IGEgZnJhZ21lbnQgYnkgc2Nhbm5pbmcgVENfR0VORVJJQ19SRUxBWF9UQUJMRS4gICovCi0KLWxvbmcKLXJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKQotICAgICBmcmFnUyAqZnJhZ1A7Ci0gICAgIGxvbmcgc3RyZXRjaDsKLXsKLSAgY29uc3QgcmVsYXhfdHlwZVMgKnRoaXNfdHlwZTsKLSAgY29uc3QgcmVsYXhfdHlwZVMgKnN0YXJ0X3R5cGU7Ci0gIHJlbGF4X3N1YnN0YXRlVCBuZXh0X3N0YXRlOwotICByZWxheF9zdWJzdGF0ZVQgdGhpc19zdGF0ZTsKLSAgbG9uZyBhaW0sIHRhcmdldCwgZ3Jvd3RoOwotICBzeW1ib2xTICpzeW1ib2xQID0gZnJhZ1AtPmZyX3N5bWJvbDsKLSAgbG9uZyBvZmZzZXQgPSBmcmFnUC0+ZnJfb2Zmc2V0OwotICAvKiBSZWNvbXB1dGUgd2FzX2FkZHJlc3MgYnkgdW5kb2luZyAiKz0gc3RyZXRjaCIgZG9uZSBieSByZWxheF9zZWdtZW50LiAgKi8KLSAgdW5zaWduZWQgbG9uZyB3YXNfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzIC0gc3RyZXRjaDsKLSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3M7Ci0gIGNvbnN0IHJlbGF4X3R5cGVTICp0YWJsZSA9IFRDX0dFTkVSSUNfUkVMQVhfVEFCTEU7Ci0KLSAgdGhpc19zdGF0ZSA9IGZyYWdQLT5mcl9zdWJ0eXBlOwotICBzdGFydF90eXBlID0gdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOwotICB0YXJnZXQgPSBvZmZzZXQ7Ci0KLSAgaWYgKHN5bWJvbFApCi0gICAgewotI2lmbmRlZiBESUZGX0VYUFJfT0sKLSNpZiAhZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0gICAgICBrbm93ICgoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0FCU09MVVRFKQotCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0RBVEEpCi0JICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQlNTKQotCSAgICB8fCAoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX1RFWFQpKTsKLSNlbmRpZgotICAgICAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyk7Ci0jZW5kaWYKLSAgICAgIGtub3cgKCEoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkgICAgfHwgc3ltYm9sUC0+c3lfZnJhZyA9PSAmemVyb19hZGRyZXNzX2ZyYWcpOwotICAgICAgdGFyZ2V0ICs9CVNfR0VUX1ZBTFVFIChzeW1ib2xQKSArIHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX2FkZHJlc3M7Ci0KLSAgICAgIC8qIElmIGZyYWcgaGFzIHlldCB0byBiZSByZWFjaGVkIG9uIHRoaXMgcGFzcywKLQkgYXNzdW1lIGl0IHdpbGwgbW92ZSBieSBTVFJFVENIIGp1c3QgYXMgd2UgZGlkLgotCSBJZiB0aGlzIGlzIG5vdCBzbywgaXQgd2lsbCBiZSBiZWNhdXNlIHNvbWUgZnJhZwotCSBiZXR3ZWVuIGdyb3dzLCBhbmQgdGhhdCB3aWxsIGZvcmNlIGFub3RoZXIgcGFzcy4KLQotCSBCZXdhcmUgemVyby1sZW5ndGggZnJhZ3MuCi0KLQkgVGhlcmUgc2hvdWxkIGJlIGEgZmFzdGVyIHdheSB0byBkbyB0aGlzLiAgKi8KLQotICAgICAgaWYgKHN5bWJvbF9nZXRfZnJhZyAoc3ltYm9sUCktPmZyX2FkZHJlc3MgPj0gd2FzX2FkZHJlc3MKLQkgICYmIGlzX2RucmFuZ2UgKGZyYWdQLCBzeW1ib2xfZ2V0X2ZyYWcgKHN5bWJvbFApKSkKLQl7Ci0JICB0YXJnZXQgKz0gc3RyZXRjaDsKLQl9Ci0gICAgfQotCi0gIGFpbSA9IHRhcmdldCAtIGFkZHJlc3MgLSBmcmFnUC0+ZnJfZml4OwotI2lmZGVmIFRDX1BDUkVMX0FESlVTVAotICAvKiBDdXJyZW50bHkgb25seSB0aGUgbnMzMmsgZmFtaWx5IG5lZWRzIHRoaXMgKi8KLSAgYWltICs9IFRDX1BDUkVMX0FESlVTVChmcmFnUCk7Ci0vKiNlbHNlKi8KLSAgLyogVGhpcyBtYWNoaW5lIGRvZXNuJ3Qgd2FudCB0byB1c2UgcGNyZWxfYWRqdXN0LgotICAgICBJbiB0aGF0IGNhc2UsIHBjcmVsX2FkanVzdCBzaG91bGQgYmUgemVyby4gICovCi0vKiAgYXNzZXJ0IChmcmFnUC0+ZnJfdGFyZy5uczMyay5wY3JlbF9hZGp1c3QgPT0gMCk7Ki8KLSNlbmRpZgotI2lmZGVmIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiAvKiBmb3JtZXJseSBjYWxsZWQgTTY4S19BSU1fS0xVREdFICovCi0gIG1kX3ByZXBhcmVfcmVsYXhfc2NhbiAoZnJhZ1AsIGFkZHJlc3MsIGFpbSwgdGhpc19zdGF0ZSwgdGhpc190eXBlKTsKLSNlbmRpZgotCi0gIGlmIChhaW0gPCAwKQotICAgIHsKLSAgICAgIC8qIExvb2sgYmFja3dhcmRzLiAqLwotICAgICAgZm9yIChuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsgbmV4dF9zdGF0ZTspCi0JaWYgKGFpbSA+PSB0aGlzX3R5cGUtPnJseF9iYWNrd2FyZCkKLQkgIG5leHRfc3RhdGUgPSAwOwotCWVsc2UKLQkgIHsKLQkgICAgLyogR3JvdyB0byBuZXh0IHN0YXRlLiAqLwotCSAgICB0aGlzX3N0YXRlID0gbmV4dF9zdGF0ZTsKLQkgICAgdGhpc190eXBlID0gdGFibGUgKyB0aGlzX3N0YXRlOwotCSAgICBuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsKLQkgIH0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMb29rIGZvcndhcmRzLiAqLwotICAgICAgZm9yIChuZXh0X3N0YXRlID0gdGhpc190eXBlLT5ybHhfbW9yZTsgbmV4dF9zdGF0ZTspCi0JaWYgKGFpbSA8PSB0aGlzX3R5cGUtPnJseF9mb3J3YXJkKQotCSAgbmV4dF9zdGF0ZSA9IDA7Ci0JZWxzZQotCSAgewotCSAgICAvKiBHcm93IHRvIG5leHQgc3RhdGUuICovCi0JICAgIHRoaXNfc3RhdGUgPSBuZXh0X3N0YXRlOwotCSAgICB0aGlzX3R5cGUgPSB0YWJsZSArIHRoaXNfc3RhdGU7Ci0JICAgIG5leHRfc3RhdGUgPSB0aGlzX3R5cGUtPnJseF9tb3JlOwotCSAgfQotICAgIH0KLQotICBncm93dGggPSB0aGlzX3R5cGUtPnJseF9sZW5ndGggLSBzdGFydF90eXBlLT5ybHhfbGVuZ3RoOwotICBpZiAoZ3Jvd3RoICE9IDApCi0gICAgZnJhZ1AtPmZyX3N1YnR5cGUgPSB0aGlzX3N0YXRlOwotICByZXR1cm4gZ3Jvd3RoOwotfQotCi0jZW5kaWYgLyogZGVmaW5lZCAoVENfR0VORVJJQ19SRUxBWF9UQUJMRSkgKi8KLQotLyogUmVsYXhfYWxpZ24uIEFkdmFuY2UgbG9jYXRpb24gY291bnRlciB0byBuZXh0IGFkZHJlc3MgdGhhdCBoYXMgJ2FsaWdubWVudCcKLSAgIGxvd2VzdCBvcmRlciBiaXRzIGFsbCAwcywgcmV0dXJuIHNpemUgb2YgYWRqdXN0bWVudCBtYWRlLiAgKi8KLXN0YXRpYyByZWxheF9hZGRyZXNzVAotcmVsYXhfYWxpZ24gKGFkZHJlc3MsIGFsaWdubWVudCkKLSAgICAgcmVnaXN0ZXIgcmVsYXhfYWRkcmVzc1QgYWRkcmVzczsJLyogQWRkcmVzcyBub3cuICovCi0gICAgIHJlZ2lzdGVyIGludCBhbGlnbm1lbnQ7CS8qIEFsaWdubWVudCAoYmluYXJ5KS4gKi8KLXsKLSAgcmVsYXhfYWRkcmVzc1QgbWFzazsKLSAgcmVsYXhfYWRkcmVzc1QgbmV3X2FkZHJlc3M7Ci0KLSAgbWFzayA9IH4oKH4wKSA8PCBhbGlnbm1lbnQpOwotICBuZXdfYWRkcmVzcyA9IChhZGRyZXNzICsgbWFzaykgJiAofm1hc2spOwotI2lmZGVmIExJTktFUl9SRUxBWElOR19TSFJJTktTX09OTFkKLSAgaWYgKGxpbmtyZWxheCkKLSAgICAvKiBXZSBtdXN0IHByb3ZpZGUgbG90cyBvZiBwYWRkaW5nLCBzbyB0aGUgbGlua2VyIGNhbiBkaXNjYXJkIGl0Ci0gICAgICAgd2hlbiBuZWVkZWQuICBUaGUgbGlua2VyIHdpbGwgbm90IGFkZCBleHRyYSBzcGFjZSwgZXZlci4gICovCi0gICAgbmV3X2FkZHJlc3MgKz0gKDEgPDwgYWxpZ25tZW50KTsKLSNlbmRpZgotICByZXR1cm4gKG5ld19hZGRyZXNzIC0gYWRkcmVzcyk7Ci19Ci0KLXZvaWQKLXJlbGF4X3NlZ21lbnQgKHNlZ21lbnRfZnJhZ19yb290LCBzZWdtZW50KQotICAgICBzdHJ1Y3QgZnJhZyAqc2VnbWVudF9mcmFnX3Jvb3Q7Ci0gICAgIHNlZ1Qgc2VnbWVudDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IGZyYWcgKmZyYWdQOwotICByZWdpc3RlciByZWxheF9hZGRyZXNzVCBhZGRyZXNzOwotI2lmICFkZWZpbmVkIChNQU5ZX1NFR01FTlRTKSAmJiAhZGVmaW5lZCAoQkZEX0FTU0VNQkxFUikKLSAga25vdyAoc2VnbWVudCA9PSBTRUdfREFUQSB8fCBzZWdtZW50ID09IFNFR19URVhUIHx8IHNlZ21lbnQgPT0gU0VHX0JTUyk7Ci0jZW5kaWYKLSAgLyogSW4gY2FzZSBtZF9lc3RpbWF0ZV9zaXplX2JlZm9yZV9yZWxheCgpIHdhbnRzIHRvIG1ha2UgZml4U3MuICovCi0gIHN1YnNlZ19jaGFuZ2UgKHNlZ21lbnQsIDApOwotCi0gIC8qIEZvciBlYWNoIGZyYWcgaW4gc2VnbWVudDogY291bnQgYW5kIHN0b3JlICAoYSAxc3QgZ3Vlc3Mgb2YpCi0gICAgIGZyX2FkZHJlc3MuICAqLwotICBhZGRyZXNzID0gMDsKLSAgZm9yIChmcmFnUCA9IHNlZ21lbnRfZnJhZ19yb290OyBmcmFnUDsgZnJhZ1AgPSBmcmFnUC0+ZnJfbmV4dCkKLSAgICB7Ci0gICAgICBmcmFnUC0+ZnJfYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICBhZGRyZXNzICs9IGZyYWdQLT5mcl9maXg7Ci0KLSAgICAgIHN3aXRjaCAoZnJhZ1AtPmZyX3R5cGUpCi0JewotCWNhc2UgcnNfZmlsbDoKLQkgIGFkZHJlc3MgKz0gZnJhZ1AtPmZyX29mZnNldCAqIGZyYWdQLT5mcl92YXI7Ci0JICBicmVhazsKLQotCWNhc2UgcnNfYWxpZ246Ci0JY2FzZSByc19hbGlnbl9jb2RlOgotCSAgewotCSAgICBhZGRyZXNzVCBvZmZzZXQgPSByZWxheF9hbGlnbiAoYWRkcmVzcywgKGludCkgZnJhZ1AtPmZyX29mZnNldCk7Ci0KLQkgICAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlICE9IDAgJiYgb2Zmc2V0ID4gZnJhZ1AtPmZyX3N1YnR5cGUpCi0JICAgICAgb2Zmc2V0ID0gMDsKLQotCSAgICBpZiAob2Zmc2V0ICUgZnJhZ1AtPmZyX3ZhciAhPSAwKQotCSAgICAgIHsKLQkJYXNfYmFkIChfKCJhbGlnbm1lbnQgcGFkZGluZyAoJWx1IGJ5dGVzKSBub3QgYSBtdWx0aXBsZSBvZiAlbGQiKSwKLQkJCSh1bnNpZ25lZCBsb25nKSBvZmZzZXQsIChsb25nKSBmcmFnUC0+ZnJfdmFyKTsKLQkJb2Zmc2V0IC09IChvZmZzZXQgJSBmcmFnUC0+ZnJfdmFyKTsKLQkgICAgICB9Ci0KLQkgICAgYWRkcmVzcyArPSBvZmZzZXQ7Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgcnNfb3JnOgotCWNhc2UgcnNfc3BhY2U6Ci0JICAvKiBBc3N1bWUgLm9yZyBpcyBudWdhdG9yeS4gSXQgd2lsbCBncm93IHdpdGggMXN0IHJlbGF4LiAgKi8KLQkgIGJyZWFrOwotCi0JY2FzZSByc19tYWNoaW5lX2RlcGVuZGVudDoKLQkgIGFkZHJlc3MgKz0gbWRfZXN0aW1hdGVfc2l6ZV9iZWZvcmVfcmVsYXggKGZyYWdQLCBzZWdtZW50KTsKLQkgIGJyZWFrOwotCi0jaWZuZGVmIFdPUktJTkdfRE9UX1dPUkQKLQkgIC8qIEJyb2tlbiB3b3JkcyBkb24ndCBjb25jZXJuIHVzIHlldCAqLwotCWNhc2UgcnNfYnJva2VuX3dvcmQ6Ci0JICBicmVhazsKLSNlbmRpZgotCi0JY2FzZSByc19sZWIxMjg6Ci0JICAvKiBJbml0aWFsIGd1ZXNzIGlzIGFsd2F5cyAxOyBkb2luZyBvdGhlcndpc2UgY2FuIHJlc3VsdCBpbiAKLQkgICAgIHN0YWJsZSBzb2x1dGlvbnMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0uICAqLwotCSAgYWRkcmVzcyArPSBmcmFnUC0+ZnJfb2Zmc2V0ID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSByc19jZmE6Ci0JICBhZGRyZXNzICs9IGVoX2ZyYW1lX2VzdGltYXRlX3NpemVfYmVmb3JlX3JlbGF4IChmcmFnUCk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOwotCSAgYnJlYWs7Ci0JfQkJCS8qIHN3aXRjaChmcl90eXBlKSAqLwotICAgIH0JCQkJLyogZm9yIGVhY2ggZnJhZyBpbiB0aGUgc2VnbWVudCAqLwotCi0gIC8qIERvIHJlbGF4KCkuICAqLwotICB7Ci0gICAgbG9uZyBzdHJldGNoOwkvKiBNYXkgYmUgYW55IHNpemUsIDAgb3IgbmVnYXRpdmUuICovCi0gICAgLyogQ3VtdWxhdGl2ZSBudW1iZXIgb2YgYWRkcmVzc2VzIHdlIGhhdmUgKi8KLSAgICAvKiByZWxheGVkIHRoaXMgcGFzcy4gKi8KLSAgICAvKiBXZSBtYXkgaGF2ZSByZWxheGVkIG1vcmUgdGhhbiBvbmUgYWRkcmVzcy4gKi8KLSAgICBsb25nIHN0cmV0Y2hlZDsJLyogSGF2ZSB3ZSBzdHJldGNoZWQgb24gdGhpcyBwYXNzPyAqLwotICAgIC8qIFRoaXMgaXMgJ2N1eiBzdHJldGNoIG1heSBiZSB6ZXJvLCB3aGVuLCBpbiBmYWN0IHNvbWUgcGllY2Ugb2YgY29kZQotICAgICAgIGdyZXcsIGFuZCBhbm90aGVyIHNocmFuay4gIElmIGEgYnJhbmNoIGluc3RydWN0aW9uIGRvZXNuJ3QgZml0IGFueW1vcmUsCi0gICAgICAgd2UgY291bGQgYmUgc2Nyb2QuICAqLwotCi0gICAgZG8KLSAgICAgIHsKLQlzdHJldGNoID0gc3RyZXRjaGVkID0gMDsKLQlmb3IgKGZyYWdQID0gc2VnbWVudF9mcmFnX3Jvb3Q7IGZyYWdQOyBmcmFnUCA9IGZyYWdQLT5mcl9uZXh0KQotCSAgewotCSAgICBsb25nIGdyb3d0aCA9IDA7Ci0JICAgIGFkZHJlc3NUIHdhc19hZGRyZXNzOwotCSAgICBvZmZzZXRUIG9mZnNldDsKLQkgICAgc3ltYm9sUyAqc3ltYm9sUDsKLQotCSAgICB3YXNfYWRkcmVzcyA9IGZyYWdQLT5mcl9hZGRyZXNzOwotCSAgICBhZGRyZXNzID0gZnJhZ1AtPmZyX2FkZHJlc3MgKz0gc3RyZXRjaDsKLQkgICAgc3ltYm9sUCA9IGZyYWdQLT5mcl9zeW1ib2w7Ci0JICAgIG9mZnNldCA9IGZyYWdQLT5mcl9vZmZzZXQ7Ci0KLQkgICAgc3dpdGNoIChmcmFnUC0+ZnJfdHlwZSkKLQkgICAgICB7Ci0JICAgICAgY2FzZSByc19maWxsOgkvKiAuZmlsbCBuZXZlciByZWxheGVzLiAqLwotCQlncm93dGggPSAwOwotCQlicmVhazsKLQotI2lmbmRlZiBXT1JLSU5HX0RPVF9XT1JECi0JCS8qIEpGOiAgVGhpcyBpcyBSTVMncyBpZGVhLiAgSSBkbyAqTk9UKiB3YW50IHRvIGJlIGJsYW1lZAotCQkgICBmb3IgaXQgSSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdC4gIEkgZG8gbm90IHdhbnQgdG8gaGF2ZQotCQkgICBhbnl0aGluZyB0byBkbyB3aXRoIGl0LiAgVGhpcyBpcyBub3QgdGhlIHByb3BlciB3YXkgdG8KLQkJICAgaW1wbGVtZW50IHRoaXMgbWlzZmVhdHVyZS4gICovCi0JICAgICAgY2FzZSByc19icm9rZW5fd29yZDoKLQkJewotCQkgIHN0cnVjdCBicm9rZW5fd29yZCAqbGllOwotCQkgIHN0cnVjdCBicm9rZW5fd29yZCAqdW50cnV0aDsKLQotCQkgIC8qIFllcyB0aGlzIGlzIHVnbHkgKHN0b3JpbmcgdGhlIGJyb2tlbl93b3JkIHBvaW50ZXIKLQkJICAgICBpbiB0aGUgc3ltYm9sIHNsb3QpLiAgU3RpbGwsIHRoaXMgd2hvbGUgY2h1bmsgb2YKLQkJICAgICBjb2RlIGlzIHVnbHksIGFuZCBJIGRvbid0IGZlZWwgbGlrZSBkb2luZyBhbnl0aGluZwotCQkgICAgIGFib3V0IGl0LiAgVGhpbmsgb2YgaXQgYXMgc3R1YmJvcm5uZXNzIGluIGFjdGlvbi4gICovCi0JCSAgZ3Jvd3RoID0gMDsKLQkJICBmb3IgKGxpZSA9IChzdHJ1Y3QgYnJva2VuX3dvcmQgKikgKGZyYWdQLT5mcl9zeW1ib2wpOwotCQkgICAgICAgbGllICYmIGxpZS0+ZGlzcGZyYWcgPT0gZnJhZ1A7Ci0JCSAgICAgICBsaWUgPSBsaWUtPm5leHRfYnJva2VuX3dvcmQpCi0JCSAgICB7Ci0KLQkJICAgICAgaWYgKGxpZS0+YWRkZWQpCi0JCQljb250aW51ZTsKLQotCQkgICAgICBvZmZzZXQgPSAoc3ltYm9sX2dldF9mcmFnIChsaWUtPmFkZCktPmZyX2FkZHJlc3MKLQkJCQkrIFNfR0VUX1ZBTFVFIChsaWUtPmFkZCkKLQkJCQkrIGxpZS0+YWRkbnVtCi0JCQkJLSAoc3ltYm9sX2dldF9mcmFnIChsaWUtPnN1YiktPmZyX2FkZHJlc3MKLQkJCQkgICArIFNfR0VUX1ZBTFVFIChsaWUtPnN1YikpKTsKLQkJICAgICAgaWYgKG9mZnNldCA8PSAtMzI3NjggfHwgb2Zmc2V0ID49IDMyNzY3KQotCQkJewotCQkJICBpZiAoZmxhZ193YXJuX2Rpc3BsYWNlbWVudCkKLQkJCSAgICB7Ci0JCQkgICAgICBjaGFyIGJ1Zls1MF07Ci0JCQkgICAgICBzcHJpbnRfdmFsdWUgKGJ1ZiwgKGFkZHJlc3NUKSBsaWUtPmFkZG51bSk7Ci0JCQkgICAgICBhc193YXJuIChfKCIud29yZCAlcy0lcyslcyBkaWRuJ3QgZml0IiksCi0JCQkJICAgICAgIFNfR0VUX05BTUUgKGxpZS0+YWRkKSwKLQkJCQkgICAgICAgU19HRVRfTkFNRSAobGllLT5zdWIpLAotCQkJCSAgICAgICBidWYpOwotCQkJICAgIH0KLQkJCSAgbGllLT5hZGRlZCA9IDE7Ci0JCQkgIGlmIChmcmFnUC0+ZnJfc3VidHlwZSA9PSAwKQotCQkJICAgIHsKLQkJCSAgICAgIGZyYWdQLT5mcl9zdWJ0eXBlKys7Ci0JCQkgICAgICBncm93dGggKz0gbWRfc2hvcnRfanVtcF9zaXplOwotCQkJICAgIH0KLQkJCSAgZm9yICh1bnRydXRoID0gbGllLT5uZXh0X2Jyb2tlbl93b3JkOwotCQkJICAgICAgIHVudHJ1dGggJiYgdW50cnV0aC0+ZGlzcGZyYWcgPT0gbGllLT5kaXNwZnJhZzsKLQkJCSAgICAgICB1bnRydXRoID0gdW50cnV0aC0+bmV4dF9icm9rZW5fd29yZCkKLQkJCSAgICBpZiAoKHN5bWJvbF9nZXRfZnJhZyAodW50cnV0aC0+YWRkKQotCQkJCSA9PSBzeW1ib2xfZ2V0X2ZyYWcgKGxpZS0+YWRkKSkKLQkJCQkmJiAoU19HRVRfVkFMVUUgKHVudHJ1dGgtPmFkZCkKLQkJCQkgICAgPT0gU19HRVRfVkFMVUUgKGxpZS0+YWRkKSkpCi0JCQkgICAgICB7Ci0JCQkJdW50cnV0aC0+YWRkZWQgPSAyOwotCQkJCXVudHJ1dGgtPnVzZV9qdW1wID0gbGllOwotCQkJICAgICAgfQotCQkJICBncm93dGggKz0gbWRfbG9uZ19qdW1wX3NpemU7Ci0JCQl9Ci0JCSAgICB9Ci0KLQkJICBicmVhazsKLQkJfQkJLyogY2FzZSByc19icm9rZW5fd29yZCAqLwotI2VuZGlmCi0JICAgICAgY2FzZSByc19hbGlnbjoKLQkgICAgICBjYXNlIHJzX2FsaWduX2NvZGU6Ci0JCXsKLQkJICBhZGRyZXNzVCBvbGRvZmYsIG5ld29mZjsKLQotCQkgIG9sZG9mZiA9IHJlbGF4X2FsaWduICh3YXNfYWRkcmVzcyArIGZyYWdQLT5mcl9maXgsCi0JCQkJCShpbnQpIG9mZnNldCk7Ci0JCSAgbmV3b2ZmID0gcmVsYXhfYWxpZ24gKGFkZHJlc3MgKyBmcmFnUC0+ZnJfZml4LAotCQkJCQkoaW50KSBvZmZzZXQpOwotCi0JCSAgaWYgKGZyYWdQLT5mcl9zdWJ0eXBlICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChvbGRvZmYgPiBmcmFnUC0+ZnJfc3VidHlwZSkKLQkJCW9sZG9mZiA9IDA7Ci0JCSAgICAgIGlmIChuZXdvZmYgPiBmcmFnUC0+ZnJfc3VidHlwZSkKLQkJCW5ld29mZiA9IDA7Ci0JCSAgICB9Ci0KLQkJICBncm93dGggPSBuZXdvZmYgLSBvbGRvZmY7Ci0JCX0KLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHJzX29yZzoKLQkJewotCQkgIGxvbmcgdGFyZ2V0ID0gb2Zmc2V0OwotCQkgIGxvbmcgYWZ0ZXI7Ci0KLQkJICBpZiAoc3ltYm9sUCkKLQkJICAgIHsKLSNpZiAhZGVmaW5lZCAoTUFOWV9TRUdNRU5UUykgJiYgIWRlZmluZWQgKEJGRF9BU1NFTUJMRVIpCi0JCSAgICAgIGtub3cgKChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQUJTT0xVVEUpCi0JCQkgICAgfHwgKFNfR0VUX1NFR01FTlQgKHN5bWJvbFApID09IFNFR19EQVRBKQotCQkJICAgIHx8IChTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfVEVYVCkKLQkJCSAgICB8fCBTX0dFVF9TRUdNRU5UIChzeW1ib2xQKSA9PSBTRUdfQlNTKTsKLQkJICAgICAga25vdyAoc3ltYm9sUC0+c3lfZnJhZyk7Ci0JCSAgICAgIGtub3cgKCEoU19HRVRfU0VHTUVOVCAoc3ltYm9sUCkgPT0gU0VHX0FCU09MVVRFKQotCQkJICAgIHx8IChzeW1ib2xQLT5zeV9mcmFnID09ICZ6ZXJvX2FkZHJlc3NfZnJhZykpOwotI2VuZGlmCi0JCSAgICAgIHRhcmdldCArPSAoU19HRVRfVkFMVUUgKHN5bWJvbFApCi0JCQkJICsgc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKS0+ZnJfYWRkcmVzcyk7Ci0JCSAgICB9CQkvKiBpZiB3ZSBoYXZlIGEgc3ltYm9sICovCi0KLQkJICBrbm93IChmcmFnUC0+ZnJfbmV4dCk7Ci0JCSAgYWZ0ZXIgPSBmcmFnUC0+ZnJfbmV4dC0+ZnJfYWRkcmVzczsKLQkJICBncm93dGggPSB0YXJnZXQgLSBhZnRlcjsKLQkJICBpZiAoZ3Jvd3RoIDwgMCkKLQkJICAgIHsKLQkJICAgICAgLyogR3Jvd3RoIG1heSBiZSBuZWdhdGl2ZSwgYnV0IHZhcmlhYmxlIHBhcnQgb2YgZnJhZwotCQkJIGNhbm5vdCBoYXZlIGZld2VyIHRoYW4gMCBjaGFycy4gIFRoYXQgaXMsIHdlIGNhbid0Ci0JCQkgLm9yZyBiYWNrd2FyZHMuICovCi0JCSAgICAgIGFzX2JhZCAoXygiYXR0ZW1wdCB0byAub3JnIGJhY2t3YXJkcyBpZ25vcmVkIikpOwotCQkgICAgICBncm93dGggPSAwOwotCQkgICAgfQotCi0JCSAgZ3Jvd3RoIC09IHN0cmV0Y2g7CS8qIFRoaXMgaXMgYW4gYWJzb2x1dGUgZ3Jvd3RoIGZhY3RvciAqLwotCQkgIGJyZWFrOwotCQl9Ci0KLQkgICAgICBjYXNlIHJzX3NwYWNlOgotCQlpZiAoc3ltYm9sUCkKLQkJICB7Ci0JCSAgICBncm93dGggPSBTX0dFVF9WQUxVRSAoc3ltYm9sUCk7Ci0JCSAgICBpZiAoc3ltYm9sX2dldF9mcmFnIChzeW1ib2xQKSAhPSAmemVyb19hZGRyZXNzX2ZyYWcKLQkJCXx8IFNfSVNfQ09NTU9OIChzeW1ib2xQKQotCQkJfHwgISBTX0lTX0RFRklORUQgKHN5bWJvbFApKQotCQkgICAgICBhc19iYWRfd2hlcmUgKGZyYWdQLT5mcl9maWxlLCBmcmFnUC0+ZnJfbGluZSwKLQkJCQkgICAgXygiLnNwYWNlIHNwZWNpZmllcyBub24tYWJzb2x1dGUgdmFsdWUiKSk7Ci0JCSAgICBmcmFnUC0+ZnJfc3ltYm9sID0gMDsKLQkJICAgIGlmIChncm93dGggPCAwKQotCQkgICAgICB7Ci0JCQlhc193YXJuIChfKCIuc3BhY2Ugb3IgLmZpbGwgd2l0aCBuZWdhdGl2ZSB2YWx1ZSwgaWdub3JlZCIpKTsKLQkJCWdyb3d0aCA9IDA7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICBncm93dGggPSAwOwotCQlicmVhazsKLQotCSAgICAgIGNhc2UgcnNfbWFjaGluZV9kZXBlbmRlbnQ6Ci0jaWZkZWYgbWRfcmVsYXhfZnJhZwotCQlncm93dGggPSBtZF9yZWxheF9mcmFnIChmcmFnUCwgc3RyZXRjaCk7Ci0jZWxzZQotI2lmZGVmIFRDX0dFTkVSSUNfUkVMQVhfVEFCTEUKLQkJLyogVGhlIGRlZmF1bHQgd2F5IHRvIHJlbGF4IGEgZnJhZyBpcyB0byBsb29rIHRocm91Z2gKLQkJICAgVENfR0VORVJJQ19SRUxBWF9UQUJMRS4gICovCi0JCWdyb3d0aCA9IHJlbGF4X2ZyYWcgKGZyYWdQLCBzdHJldGNoKTsKLSNlbmRpZiAvKiBUQ19HRU5FUklDX1JFTEFYX1RBQkxFICovCi0jZW5kaWYKLQkJYnJlYWs7Ci0KLQkgICAgICBjYXNlIHJzX2xlYjEyODoKLQkJewotCQkgIHZhbHVlVCB2YWx1ZTsKLQkJICBpbnQgc2l6ZTsKLQotCQkgIHZhbHVlID0gcmVzb2x2ZV9zeW1ib2xfdmFsdWUgKGZyYWdQLT5mcl9zeW1ib2wsIDApOwotCQkgIHNpemUgPSBzaXplb2ZfbGViMTI4ICh2YWx1ZSwgZnJhZ1AtPmZyX3N1YnR5cGUpOwotCQkgIGdyb3d0aCA9IHNpemUgLSBmcmFnUC0+ZnJfb2Zmc2V0OwotCQkgIGZyYWdQLT5mcl9vZmZzZXQgPSBzaXplOwotCQl9Ci0JCWJyZWFrOwotCi0JICAgICAgY2FzZSByc19jZmE6Ci0JCWdyb3d0aCA9IGVoX2ZyYW1lX3JlbGF4X2ZyYWcgKGZyYWdQKTsKLQkJYnJlYWs7Ci0KLQkgICAgICBkZWZhdWx0OgotCQlCQURfQ0FTRSAoZnJhZ1AtPmZyX3R5cGUpOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIGlmIChncm93dGgpCi0JICAgICAgewotCQlzdHJldGNoICs9IGdyb3d0aDsKLQkJc3RyZXRjaGVkKys7Ci0JICAgICAgfQotCSAgfQkJCS8qIEZvciBlYWNoIGZyYWcgaW4gdGhlIHNlZ21lbnQuICovCi0gICAgICB9Ci0gICAgd2hpbGUgKHN0cmV0Y2hlZCk7CQkvKiBVbnRpbCBub3RoaW5nIGZ1cnRoZXIgdG8gcmVsYXguICovCi0gIH0JCQkJLyogZG9fcmVsYXggKi8KLQotICAvKgotICAgKiBXZSBub3cgaGF2ZSB2YWxpZCBmcl9hZGRyZXNzJ2VzIGZvciBlYWNoIGZyYWcuCi0gICAqLwotCi0gIC8qCi0gICAqIEFsbCBmcl9hZGRyZXNzJ3MgYXJlIGNvcnJlY3QsIHJlbGF0aXZlIHRvIHRoZWlyIG93biBzZWdtZW50LgotICAgKiBXZSBoYXZlIG1hZGUgYWxsIHRoZSBmaXhTIHdlIHdpbGwgZXZlciBtYWtlLgotICAgKi8KLX0JCQkJLyogcmVsYXhfc2VnbWVudCgpICovCi0KLSNpZiBkZWZpbmVkIChCRkRfQVNTRU1CTEVSKSB8fCAoIWRlZmluZWQgKEJGRCkgJiYgIWRlZmluZWQgKE9CSl9WTVMpKQotCi0jaWZuZGVmIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUAotI2RlZmluZSBUQ19SRUxPQ19SVFNZTV9MT0NfRklYVVAoWCkgKDEpCi0jZW5kaWYKLQotLyogZml4dXBfc2VnbWVudCgpCi0KLSAgIEdvIHRocm91Z2ggYWxsIHRoZSBmaXhTJ3MgaW4gYSBzZWdtZW50IGFuZCBzZWUgd2hpY2ggb25lcyBjYW4gYmUKLSAgIGhhbmRsZWQgbm93LiAgKFRoZXNlIGNvbnNpc3Qgb2YgZml4UyB3aGVyZSB3ZSBoYXZlIHNpbmNlIGRpc2NvdmVyZWQKLSAgIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCwgb3IgdGhlIGFkZHJlc3Mgb2YgdGhlIGZyYWcgaW52b2x2ZWQuKQotICAgRm9yIGVhY2ggb25lLCBjYWxsIG1kX2FwcGx5X2ZpeCB0byBwdXQgdGhlIGZpeCBpbnRvIHRoZSBmcmFnIGRhdGEuCi0KLSAgIFJlc3VsdCBpcyBhIGNvdW50IG9mIGhvdyBtYW55IHJlbG9jYXRpb24gc3RydWN0cyB3aWxsIGJlIG5lZWRlZCB0bwotICAgaGFuZGxlIHRoZSByZW1haW5pbmcgZml4UydzIHRoYXQgd2UgY291bGRuJ3QgY29tcGxldGVseSBoYW5kbGUgaGVyZS4KLSAgIFRoZXNlIHdpbGwgYmUgb3V0cHV0IGxhdGVyIGJ5IGVtaXRfcmVsb2NhdGlvbnMoKS4gICovCi0KLXN0YXRpYyBsb25nCi1maXh1cF9zZWdtZW50IChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSkKLSAgICAgcmVnaXN0ZXIgZml4UyAqZml4UDsKLSAgICAgc2VnVCB0aGlzX3NlZ21lbnRfdHlwZTsJLyogTl9UWVBFIGJpdHMgZm9yIHNlZ21lbnQuICovCi17Ci0gIGxvbmcgc2VnX3JlbG9jX2NvdW50ID0gMDsKLSAgc3ltYm9sUyAqYWRkX3N5bWJvbFA7Ci0gIHN5bWJvbFMgKnN1Yl9zeW1ib2xQOwotICB2YWx1ZVQgYWRkX251bWJlcjsKLSAgaW50IHNpemU7Ci0gIGNoYXIgKnBsYWNlOwotICBsb25nIHdoZXJlOwotICBpbnQgcGNyZWwsIHBsdDsKLSAgZnJhZ1MgKmZyYWdQOwotICBzZWdUIGFkZF9zeW1ib2xfc2VnbWVudCA9IGFic29sdXRlX3NlY3Rpb247Ci0KLSAgLyogSWYgdGhlIGxpbmtlciBpcyBkb2luZyB0aGUgcmVsYXhpbmcsIHdlIG11c3Qgbm90IGRvIGFueSBmaXh1cHMuCi0KLSAgICAgV2VsbCwgc3RyaWN0bHkgc3BlYWtpbmcgdGhhdCdzIG5vdCB0cnVlIC0tIHdlIGNvdWxkIGRvIGFueSB0aGF0IGFyZQotICAgICBQQy1yZWxhdGl2ZSBhbmQgZG9uJ3QgY3Jvc3MgcmVnaW9ucyB0aGF0IGNvdWxkIGNoYW5nZSBzaXplLiAgQW5kIGZvciB0aGUKLSAgICAgaTk2MCAodGhlIG9ubHkgbWFjaGluZSBmb3Igd2hpY2ggd2UndmUgZ290IGEgcmVsYXhpbmcgbGlua2VyIHJpZ2h0IG5vdyksCi0gICAgIHdlIG1pZ2h0IGJlIGFibGUgdG8gdHVybiBjYWxseC9jYWxsaiBpbnRvIGJhbCBhbnl3YXlzIGluIGNhc2VzIHdoZXJlIHdlCi0gICAgIGtub3cgdGhlIG1heGltdW0gZGlzcGxhY2VtZW50LiAgKi8KLSAgaWYgKGxpbmtyZWxheCkKLSAgICB7Ci0gICAgICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0Jc2VnX3JlbG9jX2NvdW50Kys7Ci0gICAgICBUQ19BREpVU1RfUkVMT0NfQ09VTlQgKGZpeFAsIHNlZ19yZWxvY19jb3VudCk7Ci0gICAgICByZXR1cm4gc2VnX3JlbG9jX2NvdW50OwotICAgIH0KLQotICBmb3IgKDsgZml4UDsgZml4UCA9IGZpeFAtPmZ4X25leHQpCi0gICAgewotCi0jaWZkZWYgREVCVUc1Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbnByb2Nlc3NpbmcgZml4dXA6XG4iKTsKLSAgICAgIHByaW50X2ZpeHVwIChmaXhQKTsKLSNlbmRpZgotCi0KLSAgICAgIGZyYWdQID0gZml4UC0+ZnhfZnJhZzsKLSAgICAgIGtub3cgKGZyYWdQKTsKLSAgICAgIHdoZXJlID0gZml4UC0+Znhfd2hlcmU7Ci0gICAgICBwbGFjZSA9IGZyYWdQLT5mcl9saXRlcmFsICsgd2hlcmU7Ci0gICAgICBzaXplID0gZml4UC0+Znhfc2l6ZTsKLSAgICAgIGFkZF9zeW1ib2xQID0gZml4UC0+ZnhfYWRkc3k7Ci0jaWZkZWYgVENfVkFMSURBVEVfRklYCi0gICAgICBUQ19WQUxJREFURV9GSVggKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlLCBza2lwKTsKLSNlbmRpZgotICAgICAgc3ViX3N5bWJvbFAgPSBmaXhQLT5meF9zdWJzeTsKLSAgICAgIGFkZF9udW1iZXIgPSBmaXhQLT5meF9vZmZzZXQ7Ci0gICAgICBwY3JlbCA9IGZpeFAtPmZ4X3BjcmVsOwotICAgICAgcGx0ID0gZml4UC0+ZnhfcGx0OwotCi0gICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTAotCSAgJiYgc3ltYm9sX21yaV9jb21tb25fcCAoYWRkX3N5bWJvbFApKQotCXsKLQkgIGtub3cgKGFkZF9zeW1ib2xQLT5zeV92YWx1ZS5YX29wID09IE9fc3ltYm9sKTsKLQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgIGZpeFAtPmZ4X29mZnNldCA9IGFkZF9udW1iZXI7Ci0JICBhZGRfc3ltYm9sUCA9IGZpeFAtPmZ4X2FkZHN5ID0KLQkgICAgc3ltYm9sX2dldF92YWx1ZV9leHByZXNzaW9uIChhZGRfc3ltYm9sUCktPlhfYWRkX3N5bWJvbDsKLQl9Ci0KLSAgICAgIGlmIChhZGRfc3ltYm9sUCkKLQlhZGRfc3ltYm9sX3NlZ21lbnQgPSBTX0dFVF9TRUdNRU5UIChhZGRfc3ltYm9sUCk7Ci0KLSAgICAgIGlmIChzdWJfc3ltYm9sUCkKLQl7Ci0JICByZXNvbHZlX3N5bWJvbF92YWx1ZSAoc3ViX3N5bWJvbFAsIDEpOwotCSAgaWYgKGFkZF9zeW1ib2xQID09IE5VTEwgfHwgYWRkX3N5bWJvbF9zZWdtZW50ID09IGFic29sdXRlX3NlY3Rpb24pCi0JICAgIHsKLQkgICAgICBpZiAoYWRkX3N5bWJvbFAgIT0gTlVMTCkKLQkJewotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkJICBhZGRfc3ltYm9sUCA9IE5VTEw7Ci0JCSAgZml4UC0+ZnhfYWRkc3kgPSBOVUxMOwotCQl9Ci0KLQkgICAgICAvKiBJdCdzIGp1c3QgLXN5bSAqLwotCSAgICAgIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikKLQkJewotCQkgIGFkZF9udW1iZXIgLT0gU19HRVRfVkFMVUUgKHN1Yl9zeW1ib2xQKTsKLQkJICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChwY3JlbAotCQkgICAgICAgJiYgU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IHRoaXNfc2VnbWVudF90eXBlKQotCQl7Ci0JCSAgLyogU2hvdWxkIHRyeSBjb252ZXJ0aW5nIHRvIGEgY29uc3RhbnQuICAqLwotCQkgIGdvdG8gYmFkX3N1Yl9yZWxvYzsKLQkJfQotCSAgICAgIGVsc2UKLQkgICAgICBiYWRfc3ViX3JlbG9jOgotCQlhc19iYWRfd2hlcmUgKGZpeFAtPmZ4X2ZpbGUsIGZpeFAtPmZ4X2xpbmUsCi0JCQkgICAgICBfKCJOZWdhdGl2ZSBvZiBub24tYWJzb2x1dGUgc3ltYm9sICVzIiksCi0JCQkgICAgICBTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCkpOwotCSAgICB9Ci0JICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWRkX3N5bWJvbF9zZWdtZW50Ci0JCSAgICYmIFNFR19OT1JNQUwgKGFkZF9zeW1ib2xfc2VnbWVudCkpCi0JICAgIHsKLQkgICAgICAvKiBEaWZmZXJlbmNlIG9mIDIgc3ltYm9scyBmcm9tIHNhbWUgc2VnbWVudC4KLQkJIENhbid0IG1ha2UgZGlmZmVyZW5jZSBvZiAyIHVuZGVmaW5lZHM6ICd2YWx1ZScgbWVhbnMKLQkJIHNvbWV0aGluZyBkaWZmZXJlbnQgZm9yIE5fVU5ERi4gKi8KLSNpZmRlZiBUQ19JOTYwCi0JICAgICAgLyogTWFrZXMgbm8gc2Vuc2UgdG8gdXNlIHRoZSBkaWZmZXJlbmNlIG9mIDIgYXJiaXRyYXJ5IHN5bWJvbHMKLQkJIGFzIHRoZSB0YXJnZXQgb2YgYSBjYWxsIGluc3RydWN0aW9uLiAgKi8KLQkgICAgICBpZiAoZml4UC0+ZnhfdGNiaXQpCi0JCWFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCSAgICAgIF8oImNhbGxqIHRvIGRpZmZlcmVuY2Ugb2YgMiBzeW1ib2xzIikpOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQkgICAgICBhZGRfbnVtYmVyICs9IFNfR0VUX1ZBTFVFIChhZGRfc3ltYm9sUCkgLQotCQlTX0dFVF9WQUxVRSAoc3ViX3N5bWJvbFApOwotCi0JICAgICAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCSAgICAgIHBjcmVsID0gMDsJLyogTm8gZnVydGhlciBwY3JlbCBwcm9jZXNzaW5nLiAqLwotCi0JICAgICAgLyogTGV0IHRoZSB0YXJnZXQgbWFjaGluZSBtYWtlIHRoZSBmaW5hbCBkZXRlcm1pbmF0aW9uCi0JCSBhcyB0byB3aGV0aGVyIG9yIG5vdCBhIHJlbG9jYXRpb24gd2lsbCBiZSBuZWVkZWQgdG8KLQkJIGhhbmRsZSB0aGlzIGZpeHVwLiAgKi8KLQkgICAgICBpZiAoIVRDX0ZPUkNFX1JFTE9DQVRJT05fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpKQotCQl7Ci0JCSAgZml4UC0+ZnhfcGNyZWwgPSAwOwotCQkgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICBmaXhQLT5meF9zdWJzeSA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRGlmZmVyZW50IHNlZ21lbnRzIGluIHN1YnRyYWN0aW9uLiAqLwotCSAgICAgIGtub3cgKCEoU19JU19FWFRFUk5BTCAoc3ViX3N5bWJvbFApCi0JCSAgICAgICYmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gYWJzb2x1dGVfc2VjdGlvbikpKTsKLQotCSAgICAgIGlmICgoU19HRVRfU0VHTUVOVCAoc3ViX3N5bWJvbFApID09IGFic29sdXRlX3NlY3Rpb24pKQotCQlhZGRfbnVtYmVyIC09IFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCk7Ci0KLSNpZmRlZiBESUZGX0VYUFJfT0sKLQkgICAgICBlbHNlIGlmIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkgPT0gdGhpc19zZWdtZW50X3R5cGUKLSNpZiAwIC8qIERvIHRoaXMgZXZlbiBpZiBpdCdzIGFscmVhZHkgZGVzY3JpYmVkIGFzIHBjLXJlbGF0aXZlLiAgRm9yIGV4YW1wbGUsCi0JIG9uIHRoZSBtNjhrLCBhbiBvcGVyYW5kIG9mICJwY0AoZm9vLS4tMikiIHNob3VsZCBhZGRyZXNzICJmb28iIGluIGEKLQkgcGMtcmVsYXRpdmUgbW9kZS4gICovCi0JCSAgICAgICAmJiBwY3JlbAotI2VuZGlmCi0JCSAgICAgICApCi0JCXsKLQkJICAvKiBNYWtlIGl0IHBjLXJlbGF0aXZlLiAgKi8KLQkJICBhZGRfbnVtYmVyICs9IChNRF9QQ1JFTF9GUk9NX1NFQ1RJT04gKGZpeFAsIHRoaXNfc2VnbWVudF90eXBlKQotCQkJCSAtIFNfR0VUX1ZBTFVFIChzdWJfc3ltYm9sUCkpOwotCQkgIHBjcmVsID0gMTsKLQkJICBmaXhQLT5meF9wY3JlbCA9IDE7Ci0JCSAgc3ViX3N5bWJvbFAgPSAwOwotCQkgIGZpeFAtPmZ4X3N1YnN5ID0gMDsKLQkJfQotI2VuZGlmCi0jaWZkZWYgVU5ERUZJTkVEX0RJRkZFUkVOQ0VfT0sKLQkgICAgICAvKiBUaGUgUEEgbmVlZHMgdGhpcyBmb3IgUElDIGNvZGUgZ2VuZXJhdGlvbi4gIFdlIGJhc2ljYWxseQotCQkgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyBpZiB3ZSBoYXZlIHRoZSBkaWZmZXJlbmNlIG9mIHR3bwotCQkgc3ltYm9scyBhdCB0aGlzIHBvaW50LiAgKi8KLQkgICAgICBlbHNlIGlmICgxKQotCQl7Ci0JCSAgLyogTGVhdmUgaXQgYWxvbmUuICAqLwotCQl9Ci0jZW5kaWYKLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgICAgZWxzZSBpZiAoZml4UC0+Znhfcl90eXBlID09IEJGRF9SRUxPQ19HUFJFTDMyCi0JCSAgICAgICB8fCBmaXhQLT5meF9yX3R5cGUgPT0gQkZEX1JFTE9DX0dQUkVMMTYpCi0JCXsKLQkJICAvKiBMZWF2ZSBpdCBhbG9uZS4gICovCi0JCX0KLSNlbmRpZgotCSAgICAgIGVsc2UKLQkJewotCQkgIGNoYXIgYnVmWzUwXTsKLQkJICBzcHJpbnRfdmFsdWUgKGJ1ZiwgZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSk7Ci0JCSAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJCV8oIlN1YnRyYWN0aW9uIG9mIHR3byBzeW1ib2xzIGluIGRpZmZlcmVudCBzZWN0aW9ucyBcIiVzXCIgeyVzIHNlY3Rpb259IC0gXCIlc1wiIHslcyBzZWN0aW9ufSBhdCBmaWxlIGFkZHJlc3MgJXMuIiksCi0JCQkJU19HRVRfTkFNRSAoYWRkX3N5bWJvbFApLAotCQkJCXNlZ21lbnRfbmFtZSAoU19HRVRfU0VHTUVOVCAoYWRkX3N5bWJvbFApKSwKLQkJCQlTX0dFVF9OQU1FIChzdWJfc3ltYm9sUCksCi0JCQkJc2VnbWVudF9uYW1lIChTX0dFVF9TRUdNRU5UIChzdWJfc3ltYm9sUCkpLAotCQkJCWJ1Zik7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGFkZF9zeW1ib2xQKQotCXsKLQkgIGlmIChhZGRfc3ltYm9sX3NlZ21lbnQgPT0gdGhpc19zZWdtZW50X3R5cGUgJiYgcGNyZWwgJiYgIXBsdAotCSAgICAgICYmIFRDX1JFTE9DX1JUU1lNX0xPQ19GSVhVUCAoZml4UCkpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIFRoaXMgZml4dXAgd2FzIG1hZGUgd2hlbiB0aGUgc3ltYm9sJ3Mgc2VnbWVudCB3YXMKLQkgICAgICAgKiBTRUdfVU5LTk9XTiwgYnV0IGl0IGlzIG5vdyBpbiB0aGUgbG9jYWwgc2VnbWVudC4KLQkgICAgICAgKiBTbyB3ZSBrbm93IGhvdyB0byBkbyB0aGUgYWRkcmVzcyB3aXRob3V0IHJlbG9jYXRpb24uCi0JICAgICAgICovCi0jaWZkZWYgVENfSTk2MAotCSAgICAgIC8qIHJlbG9jX2NhbGxqKCkgbWF5IHJlcGxhY2UgYSAnY2FsbCcgd2l0aCBhICdjYWxscycgb3IgYQotCQkgJ2JhbCcsIGluIHdoaWNoIGNhc2VzIGl0IG1vZGlmaWVzICpmaXhQIGFzIGFwcHJvcHJpYXRlLgotCQkgSW4gdGhlIGNhc2Ugb2YgYSAnY2FsbHMnLCBubyBmdXJ0aGVyIHdvcmsgaXMgcmVxdWlyZWQsCi0JCSBhbmQgKmZpeFAgaGFzIGJlZW4gc2V0IHVwIHRvIG1ha2UgdGhlIHJlc3Qgb2YgdGhlIGNvZGUKLQkJIGJlbG93IGEgbm8tb3AuICovCi0JICAgICAgcmVsb2NfY2FsbGogKGZpeFApOwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotCSAgICAgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQkgICAgICBhZGRfbnVtYmVyIC09IE1EX1BDUkVMX0ZST01fU0VDVElPTiAoZml4UCwgdGhpc19zZWdtZW50X3R5cGUpOwotCSAgICAgIHBjcmVsID0gMDsJLyogTGllLiBEb24ndCB3YW50IGZ1cnRoZXIgcGNyZWwgcHJvY2Vzc2luZy4gKi8KLQotCSAgICAgIC8qIExldCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWFrZSB0aGUgZmluYWwgZGV0ZXJtaW5hdGlvbgotCQkgYXMgdG8gd2hldGhlciBvciBub3QgYSByZWxvY2F0aW9uIHdpbGwgYmUgbmVlZGVkIHRvCi0JCSBoYW5kbGUgdGhpcyBmaXh1cC4gICovCi0JICAgICAgaWYgKCFUQ19GT1JDRV9SRUxPQ0FUSU9OIChmaXhQKSkKLQkJewotCQkgIGZpeFAtPmZ4X3BjcmVsID0gMDsKLQkJICBmaXhQLT5meF9hZGRzeSA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKGFkZF9zeW1ib2xfc2VnbWVudCA9PSBhYnNvbHV0ZV9zZWN0aW9uCi0JCSAgJiYgISBwY3JlbCkKLQkJewotI2lmZGVmIFRDX0k5NjAKLQkJICAvKiBTZWUgY29tbWVudCBhYm91dCByZWxvY19jYWxsaigpIGFib3ZlLiAgKi8KLQkJICByZWxvY19jYWxsaiAoZml4UCk7Ci0jZW5kaWYgLyogVENfSTk2MCAqLwotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLQotCQkgIC8qIExldCB0aGUgdGFyZ2V0IG1hY2hpbmUgbWFrZSB0aGUgZmluYWwgZGV0ZXJtaW5hdGlvbgotCQkgICAgIGFzIHRvIHdoZXRoZXIgb3Igbm90IGEgcmVsb2NhdGlvbiB3aWxsIGJlIG5lZWRlZCB0bwotCQkgICAgIGhhbmRsZSB0aGlzIGZpeHVwLiAgKi8KLQotCQkgIGlmICghVENfRk9SQ0VfUkVMT0NBVElPTiAoZml4UCkpCi0JCSAgICB7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgYWRkX3N5bWJvbFAgPSBOVUxMOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAoYWRkX3N5bWJvbF9zZWdtZW50ID09IHVuZGVmaW5lZF9zZWN0aW9uCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCQkgICAgICAgfHwgYmZkX2lzX2NvbV9zZWN0aW9uIChhZGRfc3ltYm9sX3NlZ21lbnQpCi0jZW5kaWYKLQkJICAgICAgICkKLQkJewotI2lmZGVmIFRDX0k5NjAKLQkJICBpZiAoKGludCkgZml4UC0+ZnhfYml0X2ZpeFAgPT0gMTMpCi0JCSAgICB7Ci0JCSAgICAgIC8qIFRoaXMgaXMgYSBDT0JSIGluc3RydWN0aW9uLiAgVGhleSBoYXZlIG9ubHkgYQotCQkgICAgICAgKiAxMy1iaXQgZGlzcGxhY2VtZW50IGFuZCBhcmUgb25seSB0byBiZSB1c2VkCi0JCSAgICAgICAqIGZvciBsb2NhbCBicmFuY2hlczogZmxhZyBhcyBlcnJvciwgZG9uJ3QgZ2VuZXJhdGUKLQkJICAgICAgICogcmVsb2NhdGlvbi4KLQkJICAgICAgICovCi0JCSAgICAgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQkgICAgXygiY2FuJ3QgdXNlIENPQlIgZm9ybWF0IHdpdGggZXh0ZXJuYWwgbGFiZWwiKSk7Ci0JCSAgICAgIGZpeFAtPmZ4X2FkZHN5ID0gTlVMTDsKLQkJICAgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0JCSAgICAgIGNvbnRpbnVlOwotCQkgICAgfQkJLyogQ09CUiAqLwotI2VuZGlmIC8qIFRDX0k5NjAgKi8KLQotI2lmZGVmIE9CSl9DT0ZGCi0jaWZkZWYgVEVfSTM4NkFJWAotCQkgIGlmIChTX0lTX0NPTU1PTiAoYWRkX3N5bWJvbFApKQotCQkgICAgYWRkX251bWJlciArPSBTX0dFVF9WQUxVRSAoYWRkX3N5bWJvbFApOwotI2VuZGlmIC8qIFRFX0kzODZBSVggKi8KLSNlbmRpZiAvKiBPQkpfQ09GRiAqLwotCQkgICsrc2VnX3JlbG9jX2NvdW50OwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc2VnX3JlbG9jX2NvdW50Kys7Ci0jaWYgIShkZWZpbmVkIChUQ19WODUwKSAmJiBkZWZpbmVkIChPQkpfRUxGKSkKLSNpZiAhKGRlZmluZWQgKFRDX002OEspICYmIGRlZmluZWQgKE9CSl9FTEYpKQotI2lmICEoZGVmaW5lZCAoVENfQVJNKSAgJiYgZGVmaW5lZCAoT0JKX0VMRikpCi0jaWYgIShkZWZpbmVkIChUQ19JOTYwKSAmJiBkZWZpbmVkIChPQkpfRUxGKSkKLSNpZiAhZGVmaW5lZCAoVENfSTM4NikgfHwgIShkZWZpbmVkIChPQkpfRUxGKSB8fCBkZWZpbmVkIChPQkpfQ09GRikpIHx8IGRlZmluZWQgKFRFX1BFKQotCQkgIGFkZF9udW1iZXIgKz0gU19HRVRfVkFMVUUgKGFkZF9zeW1ib2xQKTsKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKHBjcmVsKQotCXsKLQkgIGFkZF9udW1iZXIgLT0gTURfUENSRUxfRlJPTV9TRUNUSU9OIChmaXhQLCB0aGlzX3NlZ21lbnRfdHlwZSk7Ci0JICBpZiAoYWRkX3N5bWJvbFAgPT0gMCkKLQkgICAgewotI2lmbmRlZiBCRkRfQVNTRU1CTEVSCi0JICAgICAgZml4UC0+ZnhfYWRkc3kgPSAmYWJzX3N5bWJvbDsKLSNlbHNlCi0JICAgICAgZml4UC0+ZnhfYWRkc3kgPSBzZWN0aW9uX3N5bWJvbCAoYWJzb2x1dGVfc2VjdGlvbik7Ci0jZW5kaWYKLQkgICAgICBzeW1ib2xfbWFya191c2VkX2luX3JlbG9jIChmaXhQLT5meF9hZGRzeSk7Ci0JICAgICAgKytzZWdfcmVsb2NfY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghZml4UC0+ZnhfZG9uZSkKLQl7Ci0jaWZkZWYgTURfQVBQTFlfRklYMwotCSAgbWRfYXBwbHlfZml4MyAoZml4UCwgJmFkZF9udW1iZXIsIHRoaXNfc2VnbWVudF90eXBlKTsKLSNlbHNlCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotCSAgbWRfYXBwbHlfZml4IChmaXhQLCAmYWRkX251bWJlcik7Ci0jZWxzZQotCSAgbWRfYXBwbHlfZml4IChmaXhQLCBhZGRfbnVtYmVyKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgVENfSEFORExFU19GWF9ET05FCi0JICAvKiBJZiB0aGUgdGMtKiBmaWxlcyBoYXZlbid0IGJlZW4gY29udmVydGVkLCBhc3N1bWUgaXQncyBoYW5kbGluZwotCSAgICAgaXQgdGhlIG9sZCB3YXksIHdoZXJlIGEgbnVsbCBmeF9hZGRzeSBtZWFucyB0aGF0IHRoZSBmaXggaGFzCi0JICAgICBiZWVuIGFwcGxpZWQgY29tcGxldGVseSwgYW5kIG5vIGZ1cnRoZXIgd29yayBpcyBuZWVkZWQuICAqLwotCSAgaWYgKGZpeFAtPmZ4X2FkZHN5ID09IDAgJiYgZml4UC0+ZnhfcGNyZWwgPT0gMCkKLQkgICAgZml4UC0+ZnhfZG9uZSA9IDE7Ci0jZW5kaWYKLQl9Ci0KLSAgICAgIGlmICghZml4UC0+ZnhfYml0X2ZpeFAgJiYgIWZpeFAtPmZ4X25vX292ZXJmbG93ICYmIHNpemUgPiAwKQotCXsKLQkgIGlmICgoc2l6ZV90KSBzaXplIDwgc2l6ZW9mICh2YWx1ZVQpKQotCSAgICB7Ci0JICAgICAgdmFsdWVUIG1hc2ssIGhpYml0OwotCi0JICAgICAgLyogc2V0IGFsbCBiaXRzIHRvIG9uZSAqLwotCSAgICAgIG1hc2sgPSAwOwotCSAgICAgIG1hc2stLTsKLQkgICAgICAvKiBUZWNobmljYWxseSwgY29tYmluaW5nIHRoZXNlIHByb2R1Y2VzIGFuIHVuZGVmaW5lZCByZXN1bHQKLQkJIGlmIHNpemUgaXMgc2l6ZW9mICh2YWx1ZVQpLCB0aG91Z2ggSSB0aGluayB0aGVzZSB0d28KLQkJIGhhbGYtd2F5IG9wZXJhdGlvbnMgc2hvdWxkIGJvdGggYmUgZGVmaW5lZC4gIEFuZCB0aGUKLQkJIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIGNvbWJpbmUgdGhlbSBpZiBpdCdzIHZhbGlkIG9uCi0JCSB0aGUgaG9zdCBhcmNoaXRlY3R1cmUuICAqLwotCSAgICAgIG1hc2sgPDw9IHNpemUgKiA0OwotCSAgICAgIG1hc2sgPDw9IHNpemUgKiA0OwotCSAgICAgIGhpYml0ID0gKHZhbHVlVCkgMSA8PCAoc2l6ZSAqIDggLSAxKTsKLQkgICAgICBpZiAoKChhZGRfbnVtYmVyICYgbWFzaykgIT0gMAotCQkgICB8fCAoZml4UC0+Znhfc2lnbmVkCi0JCSAgICAgICAmJiAoYWRkX251bWJlciAmIGhpYml0KSAhPSAwKSkKLQkJICAmJiAoKGFkZF9udW1iZXIgJiBtYXNrKSAhPSBtYXNrCi0JCSAgICAgIHx8IChhZGRfbnVtYmVyICYgaGliaXQpID09IDApKQotCQl7Ci0JCSAgY2hhciBidWZbNTBdLCBidWYyWzUwXTsKLQkJICBzcHJpbnRfdmFsdWUgKGJ1ZiwgZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSk7Ci0JCSAgaWYgKGFkZF9udW1iZXIgPiAxMDAwKQotCQkgICAgc3ByaW50X3ZhbHVlIChidWYyLCBhZGRfbnVtYmVyKTsKLQkJICBlbHNlCi0JCSAgICBzcHJpbnRmIChidWYyLCAiJWxkIiwgKGxvbmcpIGFkZF9udW1iZXIpOwotCQkgIGFzX2JhZF93aGVyZSAoZml4UC0+ZnhfZmlsZSwgZml4UC0+ZnhfbGluZSwKLQkJCQlfKCJWYWx1ZSBvZiAlcyB0b28gbGFyZ2UgZm9yIGZpZWxkIG9mICVkIGJ5dGVzIGF0ICVzIiksCi0JCQkJYnVmMiwgc2l6ZSwgYnVmKTsKLQkJfSAvKiBnZW5lcmljIGVycm9yIGNoZWNraW5nICovCi0JICAgIH0KLSNpZmRlZiBXQVJOX1NJR05FRF9PVkVSRkxPV19XT1JECi0JICAvKiBXYXJuIGlmIGEgLndvcmQgdmFsdWUgaXMgdG9vIGxhcmdlIHdoZW4gdHJlYXRlZCBhcyBhIHNpZ25lZAotCSAgICAgbnVtYmVyLiAgV2UgYWxyZWFkeSBrbm93IGl0IGlzIG5vdCB0b28gbmVnYXRpdmUuICBUaGlzIGlzIHRvCi0JICAgICBjYXRjaCBvdmVyLWxhcmdlIHN3aXRjaGVzIGdlbmVyYXRlZCBieSBnY2Mgb24gdGhlIDY4ay4gICovCi0JICBpZiAoIWZsYWdfc2lnbmVkX292ZXJmbG93X29rCi0JICAgICAgJiYgc2l6ZSA9PSAyCi0JICAgICAgJiYgYWRkX251bWJlciA+IDB4N2ZmZikKLQkgICAgYXNfYmFkX3doZXJlIChmaXhQLT5meF9maWxlLCBmaXhQLT5meF9saW5lLAotCQkJICBfKCJTaWduZWQgLndvcmQgb3ZlcmZsb3c7IHN3aXRjaCBtYXkgYmUgdG9vIGxhcmdlOyAlbGQgYXQgMHglbHgiKSwKLQkJCSAgKGxvbmcpIGFkZF9udW1iZXIsCi0JCQkgICh1bnNpZ25lZCBsb25nKSAoZnJhZ1AtPmZyX2FkZHJlc3MgKyB3aGVyZSkpOwotI2VuZGlmCi0JfQkJCS8qIG5vdCBhIGJpdCBmaXggKi8KLQotI2lmZGVmIFRDX1ZBTElEQVRFX0ZJWAotICAgIHNraXA6IDsKLSNlbmRpZgotI2lmZGVmIERFQlVHNQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAicmVzdWx0OlxuIik7Ci0gICAgICBwcmludF9maXh1cCAoZml4UCk7Ci0jZW5kaWYKLSAgICB9CQkJCS8qIEZvciBlYWNoIGZpeFMgaW4gdGhpcyBzZWdtZW50LiAqLwotCi0gIFRDX0FESlVTVF9SRUxPQ19DT1VOVCAoZml4UCwgc2VnX3JlbG9jX2NvdW50KTsKLSAgcmV0dXJuIHNlZ19yZWxvY19jb3VudDsKLX0KLQotI2VuZGlmIC8qIGRlZmluZWQgKEJGRF9BU1NFTUJMRVIpIHx8ICghZGVmaW5lZCAoQkZEKSAmJiAhZGVmaW5lZCAoT0JKX1ZNUykpICovCi0KLXZvaWQKLW51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBpZiAoKHNpemVfdCkgbiA+IHNpemVvZiAodmFsKSB8fCBuIDw9IDApCi0gICAgYWJvcnQgKCk7Ci0gIHdoaWxlIChuLS0pCi0gICAgewotICAgICAgYnVmW25dID0gdmFsICYgMHhmZjsKLSAgICAgIHZhbCA+Pj0gODsKLSAgICB9Ci19Ci0KLXZvaWQKLW51bWJlcl90b19jaGFyc19saXR0bGVlbmRpYW4gKGJ1ZiwgdmFsLCBuKQotICAgICBjaGFyICpidWY7Ci0gICAgIHZhbHVlVCB2YWw7Ci0gICAgIGludCBuOwotewotICBpZiAoKHNpemVfdCkgbiA+IHNpemVvZiAodmFsKSB8fCBuIDw9IDApCi0gICAgYWJvcnQgKCk7Ci0gIHdoaWxlIChuLS0pCi0gICAgewotICAgICAgKmJ1ZisrID0gdmFsICYgMHhmZjsKLSAgICAgIHZhbCA+Pj0gODsKLSAgICB9Ci19Ci0KLXZvaWQKLXdyaXRlX3ByaW50X3N0YXRpc3RpY3MgKGZpbGUpCi0gICAgIEZJTEUgKmZpbGU7Ci17Ci0gIGZwcmludGYgKGZpbGUsICJmaXh1cHM6ICVkXG4iLCBuX2ZpeHVwcyk7Ci19Ci0KLS8qIGZvciBkZWJ1Z2dpbmcgKi8KLWV4dGVybiBpbnQgaW5kZW50X2xldmVsOwotCi12b2lkCi1wcmludF9maXh1cCAoZml4cCkKLSAgICAgZml4UyAqZml4cDsKLXsKLSAgaW5kZW50X2xldmVsID0gMTsKLSAgZnByaW50ZiAoc3RkZXJyLCAiZml4ICVseCAlczolZCIsIChsb25nKSBmaXhwLCBmaXhwLT5meF9maWxlLCBmaXhwLT5meF9saW5lKTsKLSAgaWYgKGZpeHAtPmZ4X3BjcmVsKQotICAgIGZwcmludGYgKHN0ZGVyciwgIiBwY3JlbCIpOwotICBpZiAoZml4cC0+ZnhfcGNyZWxfYWRqdXN0KQotICAgIGZwcmludGYgKHN0ZGVyciwgIiBwY3JlbF9hZGp1c3Q9JWQiLCBmaXhwLT5meF9wY3JlbF9hZGp1c3QpOwotICBpZiAoZml4cC0+ZnhfaW1fZGlzcCkKLSAgICB7Ci0jaWZkZWYgVENfTlMzMksKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiBpbV9kaXNwPSVkIiwgZml4cC0+ZnhfaW1fZGlzcCk7Ci0jZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIGltX2Rpc3AiKTsKLSNlbmRpZgotICAgIH0KLSAgaWYgKGZpeHAtPmZ4X3RjYml0KQotICAgIGZwcmludGYgKHN0ZGVyciwgIiB0Y2JpdCIpOwotICBpZiAoZml4cC0+ZnhfZG9uZSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgZG9uZSIpOwotICBmcHJpbnRmIChzdGRlcnIsICJcbiAgICBzaXplPSVkIGZyYWc9JWx4IHdoZXJlPSVsZCBvZmZzZXQ9JWx4IGFkZG51bWJlcj0lbHgiLAotCSAgIGZpeHAtPmZ4X3NpemUsIChsb25nKSBmaXhwLT5meF9mcmFnLCAobG9uZykgZml4cC0+Znhfd2hlcmUsCi0JICAgKGxvbmcpIGZpeHAtPmZ4X29mZnNldCwgKGxvbmcpIGZpeHAtPmZ4X2FkZG51bWJlcik7Ci0jaWZkZWYgQkZEX0FTU0VNQkxFUgotICBmcHJpbnRmIChzdGRlcnIsICJcbiAgICAlcyAoJWQpIiwgYmZkX2dldF9yZWxvY19jb2RlX25hbWUgKGZpeHAtPmZ4X3JfdHlwZSksCi0JICAgZml4cC0+Znhfcl90eXBlKTsKLSNlbHNlCi0jaWZkZWYgTkVFRF9GWF9SX1RZUEUKLSAgZnByaW50ZiAoc3RkZXJyLCAiIHJfdHlwZT0lZCIsIGZpeHAtPmZ4X3JfdHlwZSk7Ci0jZW5kaWYKLSNlbmRpZgotICBpZiAoZml4cC0+ZnhfYWRkc3kpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4gICArPCIpOwotICAgICAgcHJpbnRfc3ltYm9sX3ZhbHVlXzEgKHN0ZGVyciwgZml4cC0+ZnhfYWRkc3kpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiPiIpOwotICAgIH0KLSAgaWYgKGZpeHAtPmZ4X3N1YnN5KQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuICAgLTwiKTsKLSAgICAgIHByaW50X3N5bWJvbF92YWx1ZV8xIChzdGRlcnIsIGZpeHAtPmZ4X3N1YnN5KTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIj4iKTsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0jaWZkZWYgVENfRklYX0RBVEFfUFJJTlQKLSAgVENfRklYX0RBVEFfUFJJTlQgKHN0ZGVyciwgZml4cCk7Ci0jZW5kaWYKLX0KLQotLyogZW5kIG9mIHdyaXRlLmMgKi8KZGlmZiAtLWdpdCBhL2dhcy93cml0ZS5oIGIvZ2FzL3dyaXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmQyYWQuLjAwMDAwMDAKLS0tIGEvZ2FzL3dyaXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyogd3JpdGUuaAotICAgQ29weXJpZ2h0IChDKSAxOTg3LCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0KLSAgIEdBUyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdBUyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX193cml0ZV9oX18KLSNkZWZpbmUgX193cml0ZV9oX18KLQotI2lmbmRlZiBUQ19JOTYwCi0jaWZkZWYgaHB1eAotI2RlZmluZSBFWEVDX01BQ0hJTkVfVFlQRSBIUDkwMDBTMjAwX0lECi0jZW5kaWYKLSNlbmRpZiAvKiBUQ19JOTYwICovCi0KLSNpZm5kZWYgQkZEX0FTU0VNQkxFUgotCi0jaWZuZGVmIExPQ0FMX0xBQkVMCi0jZGVmaW5lIExPQ0FMX0xBQkVMKG5hbWUpIChuYW1lIFswXSA9PSAnTCcgKQotI2VuZGlmCi0KLSNkZWZpbmUgU19MT0NBTF9OQU1FKHMpIChMT0NBTF9MQUJFTCAoU19HRVRfTkFNRSAocykpKQotCi0jZW5kaWYgLyogISBCRkRfQVNTRU1CTEVSICovCi0KLS8qIFRoaXMgaXMgdGhlIG5hbWUgb2YgYSBmYWtlIHN5bWJvbCB3aGljaCB3aWxsIG5ldmVyIGFwcGVhciBpbiB0aGUKLSAgIGFzc2VtYmxlciBvdXRwdXQuICBTX0lTX0xPQ0FMIGRldGVjdHMgaXQgYmVjYXVzZSBvZiB0aGUgXDAwMS4gICovCi0jZGVmaW5lIEZBS0VfTEFCRUxfTkFNRSAiTDBcMDAxIgotCi0jaW5jbHVkZSAiYml0X2ZpeC5oIgotCi0vKgotICogRml4U3MgbWF5IGJlIGJ1aWx0IHVwIGluIGFueSBvcmRlci4KLSAqLwotCi1zdHJ1Y3QgZml4Ci17Ci0gIC8qIFRoZXNlIHNtYWxsIGZpZWxkcyBhcmUgZ3JvdXBlZCB0b2dldGhlciBmb3IgY29tcGFjdG5lc3Mgb2YKLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBlZmZpY2llbmN5IG9mIGFjY2VzcyBvbiBzb21lIGFyY2hpdGVjdHVyZXMuICAqLwotCi0gIC8qIHBjLXJlbGF0aXZlIG9mZnNldCBhZGp1c3QgKG9ubHkgdXNlZCBieSBtNjhrKSAqLwotICBjaGFyIGZ4X3BjcmVsX2FkanVzdDsKLQotICAvKiBIb3cgbWFueSBieXRlcyBhcmUgaW52b2x2ZWQ/ICovCi0gIHVuc2lnbmVkIGNoYXIgZnhfc2l6ZTsKLQotICAvKiBJcyB0aGlzIGEgcGMtcmVsYXRpdmUgcmVsb2NhdGlvbj8gICovCi0gIHVuc2lnbmVkIGZ4X3BjcmVsIDogMTsKLQotICAvKiBJcyB0aGlzIGEgcmVsb2NhdGlvbiB0byBhIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlIGVudHJ5PyAgSWYgc28sCi0gICAgIHNvbWUgb2YgdGhlIHJlZHVjdGlvbnMgd2UgdHJ5IHRvIGFwcGx5IGFyZSBpbnZhbGlkLiAgQSBiZXR0ZXIgd2F5Ci0gICAgIG1pZ2h0IGJlIHRvIHJlcHJlc2VudCBQTFQgZW50cmllcyB3aXRoIGRpZmZlcmVudCBraW5kcyBvZgotICAgICBzeW1ib2xzLCBhbmQgdXNlIG5vcm1hbCByZWxvY2F0aW9ucyAod2l0aCB1bmRlZmluZWQgc3ltYm9scyk7Ci0gICAgIGxvb2sgaW50byBpdCBmb3IgdmVyc2lvbiAyLjYuICAqLwotICB1bnNpZ25lZCBmeF9wbHQgOiAxOwotCi0gIC8qIElzIHRoaXMgdmFsdWUgYW4gaW1tZWRpYXRlIGRpc3BsYWNlbWVudD8gICovCi0gIC8qIE9ubHkgdXNlZCBvbiBpOTYwIGFuZCBuczMyazsgbWVyZ2UgaXQgaW50byBUQ19GSVhfVFlQRSBzb21ldGltZS4gICovCi0gIHVuc2lnbmVkIGZ4X2ltX2Rpc3AgOiAyOwotCi0gIC8qIEEgYml0IGZvciB0aGUgQ1BVIHNwZWNpZmljIGNvZGUuCi0gICAgIFRoaXMgcHJvYmFibHkgY2FuIGJlIGZvbGRlZCBpbnRvIHRjX2ZpeF9kYXRhLCBiZWxvdy4gICovCi0gIHVuc2lnbmVkIGZ4X3RjYml0IDogMTsKLQotICAvKiBIYXMgdGhpcyByZWxvY2F0aW9uIGFscmVhZHkgYmVlbiBhcHBsaWVkPyAgKi8KLSAgdW5zaWduZWQgZnhfZG9uZSA6IDE7Ci0KLSAgLyogU3VwcHJlc3Mgb3ZlcmZsb3cgY29tcGxhaW50cyBvbiBsYXJnZSBhZGRlbmRzLiAgVGhpcyBpcyB1c2VkCi0gICAgIGluIHRoZSBQb3dlclBDIEVMRiBjb25maWcgdG8gYWxsb3cgbGFyZ2UgYWRkZW5kcyBvbiB0aGUKLSAgICAgQkZEX1JFTE9DX3tMTzE2LEhJMTYsSEkxNl9TfSByZWxvY2F0aW9ucy4KLQotICAgICBAQCBDYW4gdGhpcyBiZSBkZXRlcm1pbmVkIGZyb20gQkZEPyAgKi8KLSAgdW5zaWduZWQgZnhfbm9fb3ZlcmZsb3cgOiAxOwotCi0gIC8qIFRoZSB2YWx1ZSBpcyBzaWduZWQgd2hlbiBjaGVja2luZyBmb3Igb3ZlcmZsb3cuICAqLwotICB1bnNpZ25lZCBmeF9zaWduZWQgOiAxOwotCi0gIC8qIFdoaWNoIGZyYWcgZG9lcyB0aGlzIGZpeCBhcHBseSB0bz8gICovCi0gIGZyYWdTICpmeF9mcmFnOwotCi0gIC8qIFdoZXJlIGlzIHRoZSBmaXJzdCBieXRlIHRvIGZpeCB1cD8gICovCi0gIGxvbmcgZnhfd2hlcmU7Ci0KLSAgLyogTlVMTCBvciBTeW1ib2wgd2hvc2UgdmFsdWUgd2UgYWRkIGluLiAqLwotICBzeW1ib2xTICpmeF9hZGRzeTsKLQotICAvKiBOVUxMIG9yIFN5bWJvbCB3aG9zZSB2YWx1ZSB3ZSBzdWJ0cmFjdC4gKi8KLSAgc3ltYm9sUyAqZnhfc3Vic3k7Ci0KLSAgLyogQWJzb2x1dGUgbnVtYmVyIHdlIGFkZCBpbi4gKi8KLSAgdmFsdWVUIGZ4X29mZnNldDsKLQotICAvKiBOZXh0IGZpeFMgaW4gbGlua2VkIGxpc3QsIG9yIE5VTEwuICAqLwotICBzdHJ1Y3QgZml4ICpmeF9uZXh0OwotCi0gIC8qIElmIE5VTEwsIG5vIGJpdGZpeCdzIHRvIGRvLiAgKi8KLSAgLyogT25seSBpOTYwLWNvZmYgYW5kIG5zMzJrIHVzZSB0aGlzLCBhbmQgaTk2MC1jb2ZmIHN0b3JlcyBhbgotICAgICBpbnRlZ2VyLiAgVGhpcyBjYW4gcHJvYmFibHkgYmUgZm9sZGVkIGludG8gdGNfZml4X2RhdGEsIGJlbG93LgotICAgICBAQCBBbHBoYSBhbHNvIHVzZXMgaXQsIGJ1dCBvbmx5IHRvIGRpc2FibGUgY2VydGFpbiByZWxvY2F0aW9uCi0gICAgIHByb2Nlc3NpbmcuICAqLwotICBiaXRfZml4UyAqZnhfYml0X2ZpeFA7Ci0KLSNpZmRlZiBCRkRfQVNTRU1CTEVSCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSBmeF9yX3R5cGU7Ci0jZWxzZQotI2lmZGVmIE5FRURfRlhfUl9UWVBFCi0gIC8qIEhhY2sgZm9yIG1hY2hpbmVzIHdoZXJlIHRoZSB0eXBlIG9mIHJlbG9jIGNhbid0IGJlCi0gICAgIHdvcmtlZCBvdXQgYnkgbG9va2luZyBhdCBob3cgYmlnIGl0IGlzLiAgKi8KLSAgaW50IGZ4X3JfdHlwZTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgLyogVGhpcyBmaWVsZCBpcyBzb3J0IG9mIG1pc25hbWVkLiAgSXQgYXBwZWFycyB0byBiZSBhIHNvcnQgb2YgcmFuZG9tCi0gICAgIHNjcmF0Y2ggZmllbGQsIGZvciB1c2UgYnkgdGhlIGJhY2sgZW5kcy4gIFRoZSBtYWluIGdhcyBjb2RlIGRvZXNuJ3QKLSAgICAgZG8gYW55dGhpbmcgYnV0IGluaXRpYWxpemUgaXQgdG8gemVyby4gIFRoZSB1c2Ugb2YgaXQgZG9lcyBuZWVkIHRvCi0gICAgIGJlIGNvb3JkaW5hdGVkIGJldHdlZW4gdGhlIGNwdSBhbmQgZm9ybWF0IGZpbGVzLCB0aG91Z2guICBFLmcuLCBzb21lCi0gICAgIGNvZmYgdGFyZ2V0cyBwYXNzIHRoZSBgYWRkZW5kJyBmaWVsZCBmcm9tIHRoZSBjcHUgZmlsZSB2aWEgdGhpcwotICAgICBmaWVsZC4gIEkgZG9uJ3Qga25vdyB3aHkgdGhlIGBmeF9vZmZzZXQnIGZpZWxkIGFib3ZlIGNhbid0IGJlIHVzZWQKLSAgICAgZm9yIHRoYXQ7IGludmVzdGlnYXRlIGxhdGVyIGFuZCBkb2N1bWVudC4gS1IgICovCi0gIHZhbHVlVCBmeF9hZGRudW1iZXI7Ci0KLSAgLyogVGhlIGxvY2F0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBjcmVhdGVkIHRoZSByZWxvYywgdXNlZAotICAgICBpbiBlcnJvciBtZXNzYWdlcy4gICovCi0gIGNoYXIgKmZ4X2ZpbGU7Ci0gIHVuc2lnbmVkIGZ4X2xpbmU7Ci0KLSNpZmRlZiBVU0lOR19DR0VOCi0gIHN0cnVjdCB7Ci0gICAgLyogQ0dFTl9JTlNOIGVudHJ5IGZvciB0aGlzIGluc3RydWN0aW9uLiAgKi8KLSAgICBjb25zdCBzdHJ1Y3QgY2dlbl9pbnNuICppbnNuOwotICAgIC8qIFRhcmdldCBzcGVjaWZpYyBkYXRhLCB1c3VhbGx5IHJlbG9jIG51bWJlci4gICovCi0gICAgaW50IG9waW5mbzsKLSAgfSBmeF9jZ2VuOwotI2VuZGlmCi0KLSNpZmRlZiBUQ19GSVhfVFlQRQotICAvKiBMb2NhdGlvbiB3aGVyZSBhIGJhY2tlbmQgY2FuIGF0dGFjaCBhZGRpdGlvbmFsIGRhdGEKLSAgICAgbmVlZGVkIHRvIHBlcmZvcm0gZml4dXBzLiAgKi8KLSAgVENfRklYX1RZUEUgdGNfZml4X2RhdGE7Ci0jZW5kaWYKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGZpeCBmaXhTOwotCi0jaWZuZGVmIEJGRF9BU1NFTUJMRVIKLWV4dGVybiBjaGFyICpuZXh0X29iamVjdF9maWxlX2NoYXJQOwotCi0jaWZuZGVmIE1BTllfU0VHTUVOVFMKLUNPTU1PTiBmaXhTICp0ZXh0X2ZpeF9yb290LCAqdGV4dF9maXhfdGFpbDsJLyogQ2hhaW5zIGZpeFNzLiAqLwotQ09NTU9OIGZpeFMgKmRhdGFfZml4X3Jvb3QsICpkYXRhX2ZpeF90YWlsOwkvKiBDaGFpbnMgZml4U3MuICovCi1DT01NT04gZml4UyAqYnNzX2ZpeF9yb290LCAqYnNzX2ZpeF90YWlsOwkvKiBDaGFpbnMgZml4U3MuICovCi1leHRlcm4gc3RydWN0IGZyYWcgKnRleHRfbGFzdF9mcmFnOwkJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi1leHRlcm4gc3RydWN0IGZyYWcgKmRhdGFfbGFzdF9mcmFnOwkJLyogTGFzdCBmcmFnIGluIHNlZ21lbnQuICovCi0jZW5kaWYKLUNPTU1PTiBmaXhTICoqc2VnX2ZpeF9yb290UCwgKipzZWdfZml4X3RhaWxQOwkvKiAtPiBvbmUgb2YgYWJvdmUuICovCi0jZW5kaWYKLQotZXh0ZXJuIGxvbmcgc3RyaW5nX2J5dGVfY291bnQ7Ci1leHRlcm4gaW50IHNlY3Rpb25fYWxpZ25tZW50W107Ci0KLWV4dGVybiBiaXRfZml4UyAqYml0X2ZpeF9uZXcKLSAgUEFSQU1TICgoaW50IHNpemUsIGludCBvZmZzZXQsIGxvbmcgYmFzZV90eXBlLCBsb25nIGJhc2VfYWRqLCBsb25nIG1pbiwKLQkgICBsb25nIG1heCwgbG9uZyBhZGQpKTsKLWV4dGVybiB2b2lkIGFwcGVuZCBQQVJBTVMgKChjaGFyICoqY2hhclBQLCBjaGFyICpmcm9tUCwgdW5zaWduZWQgbG9uZyBsZW5ndGgpKTsKLWV4dGVybiB2b2lkIHJlY29yZF9hbGlnbm1lbnQgUEFSQU1TICgoc2VnVCBzZWcsIGludCBhbGlnbikpOwotZXh0ZXJuIHZvaWQgc3Vic2Vnc19maW5pc2ggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgd3JpdGVfb2JqZWN0X2ZpbGUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGxvbmcgcmVsYXhfZnJhZyBQQVJBTVMgKChmcmFnUyAqLCBsb25nKSk7Ci1leHRlcm4gdm9pZCByZWxheF9zZWdtZW50Ci0gIFBBUkFNUyAoKHN0cnVjdCBmcmFnICogc2VnX2ZyYWdfcm9vdCwgc2VnVCBzZWdfdHlwZSkpOwotCi1leHRlcm4gdm9pZCBudW1iZXJfdG9fY2hhcnNfbGl0dGxlZW5kaWFuIFBBUkFNUyAoKGNoYXIgKiwgdmFsdWVULCBpbnQpKTsKLWV4dGVybiB2b2lkIG51bWJlcl90b19jaGFyc19iaWdlbmRpYW4gICAgUEFSQU1TICgoY2hhciAqLCB2YWx1ZVQsIGludCkpOwotCi0jaWZkZWYgQkZEX0FTU0VNQkxFUgotZXh0ZXJuIGZpeFMgKmZpeF9uZXcKLSAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBzeW1ib2xTICogYWRkX3N5bWJvbCwKLQkgICBvZmZzZXRUIG9mZnNldCwgaW50IHBjcmVsLCBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcl90eXBlKSk7Ci1leHRlcm4gZml4UyAqZml4X25ld19leHAKLSAgUEFSQU1TICgoZnJhZ1MgKiBmcmFnLCBpbnQgd2hlcmUsIGludCBzaXplLCBleHByZXNzaW9uUyAqZXhwLCBpbnQgcGNyZWwsCi0JICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJfdHlwZSkpOwotI2Vsc2UKLWV4dGVybiBmaXhTICpmaXhfbmV3Ci0gIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgc3ltYm9sUyAqIGFkZF9zeW1ib2wsCi0JICAgb2Zmc2V0VCBvZmZzZXQsIGludCBwY3JlbCwgaW50IHJfdHlwZSkpOwotZXh0ZXJuIGZpeFMgKmZpeF9uZXdfZXhwCi0gIFBBUkFNUyAoKGZyYWdTICogZnJhZywgaW50IHdoZXJlLCBpbnQgc2l6ZSwgZXhwcmVzc2lvblMgKmV4cCwgaW50IHBjcmVsLAotCSAgIGludCByX3R5cGUpKTsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCB3cml0ZV9wcmludF9zdGF0aXN0aWNzIFBBUkFNUyAoKEZJTEUgKikpOwotCi0jZW5kaWYgLyogX193cml0ZV9oX18gKi8KLS8qIGVuZCBvZiB3cml0ZS5oICovCmRpZmYgLS1naXQgYS9nZGIvYy1leHAudGFiLmMgYi9nZGIvYy1leHAudGFiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Mzk1ZmEuLjAwMDAwMDAKLS0tIGEvZ2RiL2MtZXhwLnRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc5NiArMCwwIEBACi0KLS8qICBBIEJpc29uIHBhcnNlciwgbWFkZSBmcm9tIGMtZXhwLnkKLSBieSAgR05VIEJpc29uIHZlcnNpb24gMS4yNQotICAqLwotCi0jZGVmaW5lIFlZQklTT04gMSAgLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KLQotI2RlZmluZQlJTlQJMjU4Ci0jZGVmaW5lCUZMT0FUCTI1OQotI2RlZmluZQlTVFJJTkcJMjYwCi0jZGVmaW5lCU5BTUUJMjYxCi0jZGVmaW5lCVRZUEVOQU1FCTI2MgotI2RlZmluZQlOQU1FX09SX0lOVAkyNjMKLSNkZWZpbmUJU1RSVUNUCTI2NAotI2RlZmluZQlDTEFTUwkyNjUKLSNkZWZpbmUJVU5JT04JMjY2Ci0jZGVmaW5lCUVOVU0JMjY3Ci0jZGVmaW5lCVNJWkVPRgkyNjgKLSNkZWZpbmUJVU5TSUdORUQJMjY5Ci0jZGVmaW5lCUNPTE9OQ09MT04JMjcwCi0jZGVmaW5lCVRFTVBMQVRFCTI3MQotI2RlZmluZQlFUlJPUgkyNzIKLSNkZWZpbmUJU0lHTkVEX0tFWVdPUkQJMjczCi0jZGVmaW5lCUxPTkcJMjc0Ci0jZGVmaW5lCVNIT1JUCTI3NQotI2RlZmluZQlJTlRfS0VZV09SRAkyNzYKLSNkZWZpbmUJQ09OU1RfS0VZV09SRAkyNzcKLSNkZWZpbmUJVk9MQVRJTEVfS0VZV09SRAkyNzgKLSNkZWZpbmUJRE9VQkxFX0tFWVdPUkQJMjc5Ci0jZGVmaW5lCVZBUklBQkxFCTI4MAotI2RlZmluZQlBU1NJR05fTU9ESUZZCTI4MQotI2RlZmluZQlUSElTCTI4MgotI2RlZmluZQlUUlVFS0VZV09SRAkyODMKLSNkZWZpbmUJRkFMU0VLRVlXT1JECTI4NAotI2RlZmluZQlBQk9WRV9DT01NQQkyODUKLSNkZWZpbmUJT1JPUgkyODYKLSNkZWZpbmUJQU5EQU5ECTI4NwotI2RlZmluZQlFUVVBTAkyODgKLSNkZWZpbmUJTk9URVFVQUwJMjg5Ci0jZGVmaW5lCUxFUQkyOTAKLSNkZWZpbmUJR0VRCTI5MQotI2RlZmluZQlMU0gJMjkyCi0jZGVmaW5lCVJTSAkyOTMKLSNkZWZpbmUJVU5BUlkJMjk0Ci0jZGVmaW5lCUlOQ1JFTUVOVAkyOTUKLSNkZWZpbmUJREVDUkVNRU5UCTI5NgotI2RlZmluZQlBUlJPVwkyOTcKLSNkZWZpbmUJQkxPQ0tOQU1FCTI5OAotI2RlZmluZQlGSUxFTkFNRQkyOTkKLQotI2xpbmUgMzggImMtZXhwLnkiCi0KLQotI2luY2x1ZGUgImRlZnMuaCIKLSNpbmNsdWRlICJnZGJfc3RyaW5nLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlICJleHByZXNzaW9uLmgiCi0jaW5jbHVkZSAidmFsdWUuaCIKLSNpbmNsdWRlICJwYXJzZXItZGVmcy5oIgotI2luY2x1ZGUgImxhbmd1YWdlLmgiCi0jaW5jbHVkZSAiYy1sYW5nLmgiCi0jaW5jbHVkZSAiYmZkLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLwotI2luY2x1ZGUgInN5bWZpbGUuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCi0jaW5jbHVkZSAib2JqZmlsZXMuaCIgLyogRm9yIGhhdmVfZnVsbF9zeW1ib2xzIGFuZCBoYXZlX3BhcnRpYWxfc3ltYm9scyAqLwotCi0vKiBGbGFnIGluZGljYXRpbmcgd2UncmUgZGVhbGluZyB3aXRoIEhQLWNvbXBpbGVkIG9iamVjdHMgKi8gCi1leHRlcm4gaW50IGhwX3NvbV9zb21fb2JqZWN0X3ByZXNlbnQ7Ci0KLS8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLCBldGMpLAotICAgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMsIHNvIHdlIGNhbiBoYXZlIG11bHRpcGxlCi0gICB5YWNjIGdlbmVyYXRlZCBwYXJzZXJzIGluIGdkYi4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSB0aGUgdmFyaWFibGVzCi0gICBwcm9kdWNlZCBieSB5YWNjLiAgSWYgb3RoZXIgcGFyc2VyIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlCi0gICBhZGRpdGlvbmFsIGdsb2JhbCBuYW1lcyB0aGF0IGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIKLSAgIGdlbmVyYXRvcnMgbmVlZCB0byBiZSBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCi0KLSNkZWZpbmUJeXltYXhkZXB0aCBjX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJY19wYXJzZQotI2RlZmluZQl5eWxleAljX2xleAotI2RlZmluZQl5eWVycm9yCWNfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCWNfbHZhbAotI2RlZmluZQl5eWNoYXIJY19jaGFyCi0jZGVmaW5lCXl5ZGVidWcJY19kZWJ1ZwotI2RlZmluZQl5eXBhY3QJY19wYWN0CQotI2RlZmluZQl5eXIxCWNfcjEJCQkKLSNkZWZpbmUJeXlyMgljX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCWNfZGVmCQkKLSNkZWZpbmUJeXljaGsJY19jaGsJCQotI2RlZmluZQl5eXBnbwljX3BnbwkJCi0jZGVmaW5lCXl5YWN0CWNfYWN0CQkKLSNkZWZpbmUJeXlleGNhCWNfZXhjYQotI2RlZmluZSB5eWVycmZsYWcgY19lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJY19uZXJycwotI2RlZmluZQl5eXBzCWNfcHMKLSNkZWZpbmUJeXlwdgljX3B2Ci0jZGVmaW5lCXl5cwljX3MKLSNkZWZpbmUJeXlfeXlzCWNfeXlzCi0jZGVmaW5lCXl5c3RhdGUJY19zdGF0ZQotI2RlZmluZQl5eXRtcAljX3RtcAotI2RlZmluZQl5eXYJY192Ci0jZGVmaW5lCXl5X3l5dgljX3l5dgotI2RlZmluZQl5eXZhbAljX3ZhbAotI2RlZmluZQl5eWxsb2MJY19sbG9jCi0jZGVmaW5lIHl5cmVkcwljX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwljX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5bGhzCWNfeXlsaHMKLSNkZWZpbmUgeXlsZW4JY195eWxlbgotI2RlZmluZSB5eWRlZnJlZCBjX3l5ZGVmcmVkCi0jZGVmaW5lIHl5ZGdvdG8JY195eWRnb3RvCi0jZGVmaW5lIHl5c2luZGV4IGNfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggY195eXJpbmRleAotI2RlZmluZSB5eWdpbmRleCBjX3l5Z2luZGV4Ci0jZGVmaW5lIHl5dGFibGUJIGNfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBjX3l5Y2hlY2sKLQotI2lmbmRlZiBZWURFQlVHCi0jZGVmaW5lCVlZREVCVUcJMAkJLyogRGVmYXVsdCB0byBubyB5eWRlYnVnIHN1cHBvcnQgKi8KLSNlbmRpZgotCi1pbnQKLXl5cGFyc2UgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgaW50Ci15eWxleCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXZvaWQKLXl5ZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7Ci0KLQotI2xpbmUgMTIwICJjLWV4cC55IgotdHlwZWRlZiB1bmlvbgotICB7Ci0gICAgTE9OR0VTVCBsdmFsOwotICAgIHN0cnVjdCB7Ci0gICAgICBMT05HRVNUIHZhbDsKLSAgICAgIHN0cnVjdCB0eXBlICp0eXBlOwotICAgIH0gdHlwZWRfdmFsX2ludDsKLSAgICBzdHJ1Y3QgewotICAgICAgRE9VQkxFU1QgZHZhbDsKLSAgICAgIHN0cnVjdCB0eXBlICp0eXBlOwotICAgIH0gdHlwZWRfdmFsX2Zsb2F0OwotICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKLSAgICBzdHJ1Y3QgdHlwZSAqdHZhbDsKLSAgICBzdHJ1Y3Qgc3Rva2VuIHN2YWw7Ci0gICAgc3RydWN0IHR0eXBlIHRzeW07Ci0gICAgc3RydWN0IHN5bXRva2VuIHNzeW07Ci0gICAgaW50IHZvaWR2YWw7Ci0gICAgc3RydWN0IGJsb2NrICpidmFsOwotICAgIGVudW0gZXhwX29wY29kZSBvcGNvZGU7Ci0gICAgc3RydWN0IGludGVybmFsdmFyICppdmFyOwotCi0gICAgc3RydWN0IHR5cGUgKip0dmVjOwotICAgIGludCAqaXZlYzsKLSAgfSBZWVNUWVBFOwotI2xpbmUgMTQ1ICJjLWV4cC55IgotCi0vKiBZWVNUWVBFIGdldHMgZGVmaW5lZCBieSAldW5pb24gKi8KLXN0YXRpYyBpbnQKLXBhcnNlX251bWJlciBQQVJBTVMgKChjaGFyICosIGludCwgaW50LCBZWVNUWVBFICopKTsKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0jaWZuZGVmIF9fU1REQ19fCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNlbmRpZgotCi0KLQotI2RlZmluZQlZWUZJTkFMCQkyMTQKLSNkZWZpbmUJWVlGTEFHCQktMzI3NjgKLSNkZWZpbmUJWVlOVEJBU0UJNjkKLQotI2RlZmluZSBZWVRSQU5TTEFURSh4KSAoKHVuc2lnbmVkKSh4KSA8PSAyOTkgPyB5eXRyYW5zbGF0ZVt4XSA6IDkxKQotCi1zdGF0aWMgY29uc3QgY2hhciB5eXRyYW5zbGF0ZVtdID0geyAgICAgMCwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgIDYyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA1MiwgICAgMzgsICAgICAyLCAgICA1OSwKLSAgICA2NSwgICAgNTAsICAgIDQ4LCAgICAzMCwgICAgNDksICAgIDU3LCAgICA1MSwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgNjgsICAgICAyLCAgICA0MSwKLSAgICAzMiwgICAgNDIsICAgIDMzLCAgICA0NywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICA1OCwgICAgIDIsICAgIDY0LCAgICAzNywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgIDY2LCAgICAzNiwgICAgNjcsICAgIDYzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwKLSAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzEsICAgIDM0LCAgICAzNSwgICAgMzksICAgIDQwLCAgICA0MywKLSAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNjAsICAgIDYxCi19OwotCi0jaWYgWVlERUJVRyAhPSAwCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwcmhzW10gPSB7ICAgICAwLAotICAgICAwLCAgICAgMiwgICAgIDQsICAgICA2LCAgICAgOCwgICAgMTIsICAgIDE1LCAgICAxOCwgICAgMjEsICAgIDI0LAotICAgIDI3LCAgICAzMCwgICAgMzMsICAgIDM2LCAgICAzOSwgICAgNDIsICAgIDQ2LCAgICA1MCwgICAgNTUsICAgIDU5LAotICAgIDYzLCAgICA2OCwgICAgNzMsICAgIDc0LCAgICA4MCwgICAgODIsICAgIDgzLCAgICA4NSwgICAgODksICAgIDkxLAotICAgIDk1LCAgIDEwMCwgICAxMDUsICAgMTA5LCAgIDExMywgICAxMTcsICAgMTIxLCAgIDEyNSwgICAxMjksICAgMTMzLAotICAgMTM3LCAgIDE0MSwgICAxNDUsICAgMTQ5LCAgIDE1MywgICAxNTcsICAgMTYxLCAgIDE2NSwgICAxNjksICAgMTczLAotICAgMTc3LCAgIDE4MSwgICAxODUsICAgMTkxLCAgIDE5NSwgICAxOTksICAgMjAxLCAgIDIwMywgICAyMDUsICAgMjA3LAotICAgMjA5LCAgIDIxNCwgICAyMTYsICAgMjE4LCAgIDIyMCwgICAyMjIsICAgMjI0LCAgIDIyNiwgICAyMzAsICAgMjM0LAotICAgMjM4LCAgIDI0MywgICAyNDUsICAgMjQ4LCAgIDI1MCwgICAyNTIsICAgMjU1LCAgIDI1OCwgICAyNjEsICAgMjY1LAotICAgMjY5LCAgIDI3MSwgICAyNzQsICAgMjc2LCAgIDI3OSwgICAyODEsICAgMjg1LCAgIDI4OCwgICAyOTAsICAgMjkzLAotICAgMjk1LCAgIDI5OCwgICAzMDIsICAgMzA1LCAgIDMwOSwgICAzMTEsICAgMzE1LCAgIDMxNywgICAzMTksICAgMzIxLAotICAgMzIzLCAgIDMyNiwgICAzMzAsICAgMzMzLCAgIDMzNywgICAzNDEsICAgMzQ2LCAgIDM0OSwgICAzNTMsICAgMzU1LAotICAgMzU4LCAgIDM2MSwgICAzNjQsICAgMzY3LCAgIDM3MCwgICAzNzMsICAgMzc1LCAgIDM3OCwgICAzODAsICAgMzg2LAotICAgMzg5LCAgIDM5MiwgICAzOTQsICAgMzk2LCAgIDM5OCwgICA0MDAsICAgNDAyLCAgIDQwNiwgICA0MDgsICAgNDEwLAotICAgNDEyLCAgIDQxNCwgICA0MTYKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXJoc1tdID0geyAgICA3MSwKLSAgICAgMCwgICAgNzAsICAgICAwLCAgICA4NSwgICAgIDAsICAgIDcyLCAgICAgMCwgICAgNzEsICAgIDMwLCAgICA3MiwKLSAgICAgMCwgICAgNTAsICAgIDcyLCAgICAgMCwgICAgMzgsICAgIDcyLCAgICAgMCwgICAgNDksICAgIDcyLCAgICAgMCwKLSAgICA2MiwgICAgNzIsICAgICAwLCAgICA2MywgICAgNzIsICAgICAwLCAgICA1NCwgICAgNzIsICAgICAwLCAgICA1NSwKLSAgICA3MiwgICAgIDAsICAgIDcyLCAgICA1NCwgICAgIDAsICAgIDcyLCAgICA1NSwgICAgIDAsICAgIDEzLCAgICA3MiwKLSAgICAgMCwgICAgNzIsICAgIDU2LCAgICA4OSwgICAgIDAsICAgIDcyLCAgICA1NiwgICAgNzksICAgICAwLCAgICA3MiwKLSAgICA1NiwgICAgNTAsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDU3LCAgICA4OSwgICAgIDAsICAgIDcyLCAgICA1NywKLSAgICA3OSwgICAgIDAsICAgIDcyLCAgICA1NywgICAgNTAsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDU4LCAgICA3MSwKLSAgICA2NCwgICAgIDAsICAgICAwLCAgICA3MiwgICAgNTksICAgIDczLCAgICA3NSwgICAgNjUsICAgICAwLCAgICA2NiwKLSAgICAgMCwgICAgIDAsICAgIDcyLCAgICAgMCwgICAgNzUsICAgIDMwLCAgICA3MiwgICAgIDAsICAgIDY3LCAgICAgMCwKLSAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzQsICAgIDg1LCAgICA3NiwgICAgNzIsICAgICAwLCAgICA1OSwKLSAgICA4NSwgICAgNjUsICAgIDcyLCAgICAgMCwgICAgNTksICAgIDcxLCAgICA2NSwgICAgIDAsICAgIDcyLCAgICA0NywKLSAgICA3MiwgICAgIDAsICAgIDcyLCAgICA1MCwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNTEsICAgIDcyLCAgICAgMCwKLSAgICA3MiwgICAgNTIsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDQ4LCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA0OSwKLSAgICA3MiwgICAgIDAsICAgIDcyLCAgICA0NSwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNDYsICAgIDcyLCAgICAgMCwKLSAgICA3MiwgICAgMzksICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDQwLCAgICA3MiwgICAgIDAsICAgIDcyLCAgICA0MywKLSAgICA3MiwgICAgIDAsICAgIDcyLCAgICA0NCwgICAgNzIsICAgICAwLCAgICA3MiwgICAgNDEsICAgIDcyLCAgICAgMCwKLSAgICA3MiwgICAgNDIsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDM4LCAgICA3MiwgICAgIDAsICAgIDcyLCAgICAzNywKLSAgICA3MiwgICAgIDAsICAgIDcyLCAgICAzNiwgICAgNzIsICAgICAwLCAgICA3MiwgICAgMzUsICAgIDcyLCAgICAgMCwKLSAgICA3MiwgICAgMzQsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDMzLCAgICA3MiwgICAgNjgsICAgIDcyLCAgICAgMCwKLSAgICA3MiwgICAgMzIsICAgIDcyLCAgICAgMCwgICAgNzIsICAgIDI2LCAgICA3MiwgICAgIDAsICAgICAzLCAgICAgMCwKLSAgICAgOCwgICAgIDAsICAgICA0LCAgICAgMCwgICAgNzgsICAgICAwLCAgICAyNSwgICAgIDAsICAgIDEzLCAgICA1OSwKLSAgICA4NSwgICAgNjUsICAgICAwLCAgICAgNSwgICAgIDAsICAgIDI3LCAgICAgMCwgICAgMjgsICAgICAwLCAgICAyOSwKLSAgICAgMCwgICAgNjAsICAgICAwLCAgICA2MSwgICAgIDAsICAgIDc3LCAgICAxNSwgICAgODksICAgICAwLCAgICA3NywKLSAgICAxNSwgICAgODksICAgICAwLCAgICA4NiwgICAgMTUsICAgIDg5LCAgICAgMCwgICAgODYsICAgIDE1LCAgICA2MywKLSAgICA4OSwgICAgIDAsICAgIDc5LCAgICAgMCwgICAgMTUsICAgIDg5LCAgICAgMCwgICAgOTAsICAgICAwLCAgICA4NiwKLSAgICAgMCwgICAgODYsICAgIDIyLCAgICAgMCwgICAgODYsICAgIDIzLCAgICAgMCwgICAgODYsICAgIDgxLCAgICAgMCwKLSAgICA4NiwgICAgMjIsICAgIDgxLCAgICAgMCwgICAgODYsICAgIDIzLCAgICA4MSwgICAgIDAsICAgIDUwLCAgICAgMCwKLSAgICA1MCwgICAgODEsICAgICAwLCAgICAzOCwgICAgIDAsICAgIDM4LCAgICA4MSwgICAgIDAsICAgIDgyLCAgICAgMCwKLSAgICA1OSwgICAgODEsICAgIDY1LCAgICAgMCwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODMsICAgICAwLCAgICA4MiwKLSAgICA4NCwgICAgIDAsICAgIDg0LCAgICAgMCwgICAgNTgsICAgIDY0LCAgICAgMCwgICAgNTgsICAgICAzLCAgICA2NCwKLSAgICAgMCwgICAgNTksICAgIDY1LCAgICAgMCwgICAgNTksICAgIDg4LCAgICA2NSwgICAgIDAsICAgIDgwLCAgICAgMCwKLSAgICA4NiwgICAgMTUsICAgIDUwLCAgICAgMCwgICAgIDcsICAgICAwLCAgICAyMSwgICAgIDAsICAgIDE5LCAgICAgMCwKLSAgICAyMCwgICAgIDAsICAgIDE5LCAgICAyMSwgICAgIDAsICAgIDE0LCAgICAxOSwgICAgMjEsICAgICAwLCAgICAxOSwKLSAgICAxOSwgICAgIDAsICAgIDE5LCAgICAxOSwgICAgMjEsICAgICAwLCAgICAxNCwgICAgMTksICAgIDE5LCAgICAgMCwKLSAgICAxNCwgICAgMTksICAgIDE5LCAgICAyMSwgICAgIDAsICAgIDIwLCAgICAyMSwgICAgIDAsICAgIDE0LCAgICAyMCwKLSAgICAyMSwgICAgIDAsICAgIDI0LCAgICAgMCwgICAgMTksICAgIDI0LCAgICAgMCwgICAgIDksICAgIDg5LCAgICAgMCwKLSAgICAxMCwgICAgODksICAgICAwLCAgICAxMSwgICAgODksICAgICAwLCAgICAxMiwgICAgODksICAgICAwLCAgICAxNCwKLSAgICA4NywgICAgIDAsICAgIDE0LCAgICAgMCwgICAgMTgsICAgIDg3LCAgICAgMCwgICAgMTgsICAgICAwLCAgICAxNiwKLSAgICA4OSwgICAgNDEsICAgIDg1LCAgICA0MiwgICAgIDAsICAgIDIyLCAgICA4NiwgICAgIDAsICAgIDIzLCAgICA4NiwKLSAgICAgMCwgICAgIDcsICAgICAwLCAgICAyMSwgICAgIDAsICAgIDE5LCAgICAgMCwgICAgMjAsICAgICAwLCAgICA4NSwKLSAgICAgMCwgICAgODgsICAgIDMwLCAgICA4NSwgICAgIDAsICAgICA2LCAgICAgMCwgICAgNjAsICAgICAwLCAgICAgNywKLSAgICAgMCwgICAgIDgsICAgICAwLCAgICAgNiwgICAgIDAsICAgIDYwLCAgICAgMAotfTsKLQotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLXN0YXRpYyBjb25zdCBzaG9ydCB5eXJsaW5lW10gPSB7IDAsCi0gICAyMzAsICAgMjMxLCAgIDIzNCwgICAyNDEsICAgMjQyLCAgIDI0NywgICAyNTAsICAgMjUzLCAgIDI1NywgICAyNjEsCi0gICAyNjUsICAgMjY5LCAgIDI3MywgICAyNzcsICAgMjgxLCAgIDI4NSwgICAyOTEsICAgMjk5LCAgIDMwMywgICAzMDksCi0gICAzMTcsICAgMzIxLCAgIDMyNSwgICAzMjksICAgMzM1LCAgIDMzOSwgICAzNDIsICAgMzQ2LCAgIDM1MCwgICAzNTMsCi0gICAzNjAsICAgMzY2LCAgIDM3MiwgICAzNzgsICAgMzgyLCAgIDM4NiwgICAzOTAsICAgMzk0LCAgIDM5OCwgICA0MDIsCi0gICA0MDYsICAgNDEwLCAgIDQxNCwgICA0MTgsICAgNDIyLCAgIDQyNiwgICA0MzAsICAgNDM0LCAgIDQzOCwgICA0NDIsCi0gICA0NDYsICAgNDUwLCAgIDQ1NCwgICA0NTgsICAgNDYyLCAgIDQ2OCwgICA0NzUsICAgNDg2LCAgIDQ5MywgICA0OTYsCi0gICA1MDAsICAgNTA4LCAgIDUzMywgICA1MzgsICAgNTQ1LCAgIDU1NCwgICA1NjIsICAgNTY4LCAgIDU3OSwgICA1OTUsCi0gICA2MDgsICAgNjMyLCAgIDYzMywgICA2NjcsICAgNzI1LCAgIDczMSwgICA3MzIsICAgNzMzLCAgIDczNSwgICA3MzcsCi0gICA3NDEsICAgNzQzLCAgIDc0NSwgICA3NDcsICAgNzQ5LCAgIDc1MiwgICA3NTQsICAgNzU5LCAgIDc2NiwgICA3NjgsCi0gICA3NzIsICAgNzc0LCAgIDc3OCwgICA3ODAsICAgNzkyLCAgIDc5MywgICA3OTgsICAgODAwLCAgIDgwMiwgICA4MDQsCi0gICA4MDYsICAgODA4LCAgIDgxMCwgICA4MTIsICAgODE0LCAgIDgxNiwgICA4MTgsICAgODIwLCAgIDgyMiwgICA4MjQsCi0gICA4MjYsICAgODI5LCAgIDgzMiwgICA4MzUsICAgODM4LCAgIDg0MCwgICA4NDIsICAgODQ0LCAgIDg0OSwgICA4NTYsCi0gICA4NTcsICAgODYwLCAgIDg2MSwgICA4NjcsICAgODczLCAgIDg4MiwgICA4ODcsICAgODk0LCAgIDg5NSwgICA4OTYsCi0gICA4OTcsICAgOTAwLCAgIDkwMQotfTsKLSNlbmRpZgotCi0KLSNpZiBZWURFQlVHICE9IDAgfHwgZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHl5dG5hbWVbXSA9IHsgICAiJCIsImVycm9yIiwiJHVuZGVmaW5lZC4iLCJJTlQiLCJGTE9BVCIsCi0iU1RSSU5HIiwiTkFNRSIsIlRZUEVOQU1FIiwiTkFNRV9PUl9JTlQiLCJTVFJVQ1QiLCJDTEFTUyIsIlVOSU9OIiwiRU5VTSIsIlNJWkVPRiIsCi0iVU5TSUdORUQiLCJDT0xPTkNPTE9OIiwiVEVNUExBVEUiLCJFUlJPUiIsIlNJR05FRF9LRVlXT1JEIiwiTE9ORyIsIlNIT1JUIiwiSU5UX0tFWVdPUkQiLAotIkNPTlNUX0tFWVdPUkQiLCJWT0xBVElMRV9LRVlXT1JEIiwiRE9VQkxFX0tFWVdPUkQiLCJWQVJJQUJMRSIsIkFTU0lHTl9NT0RJRlkiLAotIlRISVMiLCJUUlVFS0VZV09SRCIsIkZBTFNFS0VZV09SRCIsIicsJyIsIkFCT1ZFX0NPTU1BIiwiJz0nIiwiJz8nIiwiT1JPUiIsIkFOREFORCIsCi0iJ3wnIiwiJ14nIiwiJyYnIiwiRVFVQUwiLCJOT1RFUVVBTCIsIic8JyIsIic+JyIsIkxFUSIsIkdFUSIsIkxTSCIsIlJTSCIsIidAJyIsCi0iJysnIiwiJy0nIiwiJyonIiwiJy8nIiwiJyUnIiwiVU5BUlkiLCJJTkNSRU1FTlQiLCJERUNSRU1FTlQiLCJBUlJPVyIsIicuJyIsCi0iJ1snIiwiJygnIiwiQkxPQ0tOQU1FIiwiRklMRU5BTUUiLCInISciLCInficiLCInXSciLCInKSciLCIneyciLCInfSciLCInOiciLAotInN0YXJ0IiwidHlwZV9leHAiLCJleHAxIiwiZXhwIiwiQDEiLCJsY3VybHkiLCJhcmdsaXN0IiwicmN1cmx5IiwiYmxvY2siLCJ2YXJpYWJsZSIsCi0icXVhbGlmaWVkX25hbWUiLCJwdHlwZSIsImFic19kZWNsIiwiZGlyZWN0X2Fic19kZWNsIiwiYXJyYXlfbW9kIiwiZnVuY19tb2QiLAotInR5cGUiLCJ0eXBlYmFzZSIsInR5cGVuYW1lIiwibm9uZW1wdHlfdHlwZWxpc3QiLCJuYW1lIiwibmFtZV9ub3RfdHlwZW5hbWUiLCBOVUxMCi19OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXIxW10gPSB7ICAgICAwLAotICAgIDY5LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MSwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLAotICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLAotICAgIDcyLCAgICA3MiwgICAgNzMsICAgIDcyLCAgICA3NCwgICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzYsICAgIDcyLAotICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLAotICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLAotICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLAotICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzcsICAgIDc3LCAgICA3NywgICAgNzgsICAgIDc5LAotICAgIDc5LCAgICA3OCwgICAgNzgsICAgIDc4LCAgICA4MCwgICAgODAsICAgIDgwLCAgICA4MCwgICAgODAsICAgIDgwLAotICAgIDgxLCAgICA4MSwgICAgODEsICAgIDgxLCAgICA4MSwgICAgODIsICAgIDgyLCAgICA4MiwgICAgODIsICAgIDgyLAotICAgIDgzLCAgICA4MywgICAgODQsICAgIDg0LCAgICA4NSwgICAgODUsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LAotICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LAotICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDg2LAotICAgIDg2LCAgICA4NywgICAgODcsICAgIDg3LCAgICA4NywgICAgODgsICAgIDg4LCAgICA4OSwgICAgODksICAgIDg5LAotICAgIDg5LCAgICA5MCwgICAgOTAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXIyW10gPSB7ICAgICAwLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgNCwgICAgIDMsICAgICAzLAotICAgICA0LCAgICAgNCwgICAgIDAsICAgICA1LCAgICAgMSwgICAgIDAsICAgICAxLCAgICAgMywgICAgIDEsICAgICAzLAotICAgICA0LCAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLAotICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLAotICAgICAzLCAgICAgMywgICAgIDUsICAgICAzLCAgICAgMywgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICA0LCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDMsICAgICAzLAotICAgICA0LCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAzLAotICAgICAxLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAxLAotICAgICAyLCAgICAgMywgICAgIDIsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICAyLCAgICAgMywgICAgIDIsICAgICAzLCAgICAgMywgICAgIDQsICAgICAyLCAgICAgMywgICAgIDEsICAgICAyLAotICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDUsICAgICAyLAotICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICAxLCAgICAgMSwgICAgIDEKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0geyAgICAgMCwKLSAgICA1NiwgICAgNTgsICAgIDYyLCAgIDEzMiwgICAgOTcsICAgIDU3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAxMTYsICAgICAwLCAgICAgMCwgICAxMTgsICAgIDk5LCAgIDEwMCwgICAgOTgsICAgICAwLCAgICAgMCwKLSAgIDEwOSwgICAgNjAsICAgIDYzLCAgICA2NCwgICAgNjUsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAxMzMsICAgIDY3LCAgICAgMCwgICAgIDAsICAgIDI1LCAgICAgMiwgICAgIDEsICAgICA0LCAgICAyNiwKLSAgICAgMCwgICAgNTksICAgIDcyLCAgICA5NSwgICAgIDMsICAgIDc1LCAgICA3NCwgICAxMjgsICAgMTMwLCAgIDEzMSwKLSAgIDEyOSwgICAxMTEsICAgMTEyLCAgIDExMywgICAxMTQsICAgICAwLCAgICAxNSwgICAgIDAsICAgMTIyLCAgIDEyNCwKLSAgIDEyNSwgICAxMjMsICAgMTE1LCAgICA3MywgICAgIDAsICAgMTI0LCAgIDEyNSwgICAxMTcsICAgMTAzLCAgIDEwMSwKLSAgIDExMCwgICAxMDcsICAgMTIwLCAgIDEyMSwgICAgIDcsICAgICA4LCAgICAgNiwgICAgMTEsICAgIDEyLCAgICAgMCwKLSAgICAgMCwgICAgIDksICAgIDEwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxMywgICAgMTQsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgMjMsICAgIDI3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNzYsICAgIDc3LCAgICA4MywKLSAgICA4MSwgICAgIDAsICAgICAwLCAgICA3OCwgICAgODUsICAgIDg4LCAgICA5MCwgICAgIDAsICAgICAwLCAgIDEwNSwKLSAgIDEwMiwgICAxMDgsICAgICAwLCAgIDEwNCwgICAgMzMsICAgICAwLCAgICAgNSwgICAgNTUsICAgIDU0LCAgICAgMCwKLSAgICA1MiwgICAgNTEsICAgIDUwLCAgICA0OSwgICAgNDgsICAgIDQyLCAgICA0MywgICAgNDYsICAgIDQ3LCAgICA0NCwKLSAgICA0NSwgICAgNDAsICAgIDQxLCAgICAzNCwgICAgMzgsICAgIDM5LCAgICAzNSwgICAgMzYsICAgIDM3LCAgIDEzMCwKLSAgICAgMCwgICAgMTcsICAgIDE2LCAgICAgMCwgICAgMjAsICAgIDE5LCAgICAgMCwgICAgMjYsICAgICAwLCAgICAyOSwKLSAgICAzMCwgICAgIDAsICAgIDY5LCAgICA5NiwgICAgIDAsICAgIDcwLCAgICA3OSwgICAgODAsICAgIDg0LCAgICA4MiwKLSAgICAgMCwgICAgOTEsICAgIDkzLCAgICAgMCwgICAxMjYsICAgIDc1LCAgICAgMCwgICAgIDAsICAgIDg3LCAgICA4OSwKLSAgICA2MSwgICAxMDYsICAgICAwLCAgICAzMiwgICAgIDAsICAgIDE4LCAgICAyMSwgICAgMjIsICAgICAwLCAgICAyOCwKLSAgICAzMSwgICAgNzEsICAgIDkyLCAgICA4NiwgICAgIDAsICAgICAwLCAgICA5NCwgICAxMTksICAgIDUzLCAgICAyNCwKLSAgIDEyNywgICAgIDAsICAgICAwLCAgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmZ290b1tdID0geyAgIDIxMiwKLSAgICAzNywgICAgODAsICAgIDM5LCAgIDE2OCwgICAgNDAsICAgMTE0LCAgIDE3MSwgICAgNDEsICAgIDQyLCAgICA0MywKLSAgICA0NCwgICAxMjQsICAgMTI1LCAgIDEyNiwgICAxMjcsICAgMTg1LCAgICA1OCwgICAgNjMsICAgMTg3LCAgIDE3NiwKLSAgICA0NwotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0geyAgIDIwNSwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA0NiwgICAgNDYsICAgIDQ2LCAgICA0NiwKLSAgIDI2OSwgICAgNTcsICAgIDQ2LCAgICA0NiwgICAxMDAsICAgMTM0LCAgIC0xNCwtMzI3NjgsICAgMjI4LCAgIDIyOCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwKLSAgIDIwNSwgICAgMjEsLTMyNzY4LCAgIDIwNSwgICAyMDUsLTMyNzY4LC0zMjc2OCwgICAtMTYsICAgNTA0LCAgIDIwNSwKLSAgICAyMiwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMTA3LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMjA1LCAgICAxNCwgICAgMjMsLTMyNzY4LCAgICAgNywKLSAgICAyNCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgMTAsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDM0LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgMTQsICAgIDE0LCAgICAxNCwgICAgMTQsICAgIDE0LCAgIC0yNiwKLSAgIC0yMSwgICAgMTQsICAgIDE0LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwKLSAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwKLSAgIDIwNSwgICAyMDUsICAgMjA1LCAgIDIwNSwgICAyMDUsICAgMjA1LC0zMjc2OCwtMzI3NjgsICAgNDE5LCAgIDQzOCwKLSAgIDIwNSwtMzI3NjgsICAgNTA0LCAgIC0yNSwgICAgLTIsICAgIDQ2LCAgICA1MywgICAgIDgsICAgICA4LCAgICAgOCwKLSAgICAgOCwgICAgLTEsICAgMzU5LC0zMjc2OCwgICAtNDEsLTMyNzY4LC0zMjc2OCwgICAgIDksICAgIDQyLCAgICA1NCwKLS0zMjc2OCwtMzI3NjgsICAgMjI4LC0zMjc2OCwtMzI3NjgsICAgMjA1LCAgIDUwNCwgICA1MDQsICAgNTA0LCAgIDQ2NywKLSAgIDU1NiwgICA1ODAsICAgNjAzLCAgIDYyNSwgICA2NDYsICAgNjY1LCAgIDY2NSwgICAyNTQsICAgMjU0LCAgIDI1NCwKLSAgIDI1NCwgICAxMjQsICAgMTI0LCAgIDM1NiwgICA0MTYsICAgNDE2LCAgICAxNCwgICAgMTQsICAgIDE0LCAgICA4OSwKLSAgIDIwNSwtMzI3NjgsLTMyNzY4LCAgIDIwNSwtMzI3NjgsLTMyNzY4LCAgIC0xNywgICAyMDUsICAgMjA1LC0zMjc2OCwKLS0zMjc2OCwgICAyMDUsICAgIDkzLC0zMjc2OCwgICAgNDYsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLSAgICA0NSwtMzI3NjgsLTMyNzY4LCAgICA1MCwtMzI3NjgsICAgMTQ2LCAgIC0yMiwgICAxMjgsLTMyNzY4LC0zMjc2OCwKLSAgIDMzMywtMzI3NjgsICAgIDY4LCAgICAxNCwgICAyMDUsICAgIDE0LCAgICAxNCwtMzI3NjgsICAgIC0zLCAgIDUwNCwKLSAgICAxNCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgNjcsICAgMjI4LC0zMjc2OCwtMzI3NjgsICAgNTMxLC0zMjc2OCwKLS0zMjc2OCwgICAxMjUsICAgMTI2LC0zMjc2OAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGdvdG9bXSA9IHstMzI3NjgsCi0tMzI3NjgsICAgICAzLCAgICAtNSwtMzI3NjgsLTMyNzY4LCAgIC00NCwgICAgMTIsLTMyNzY4LC0zMjc2OCwgICAtNzYsCi0tMzI3NjgsICAgIDc5LC0zMjc2OCwgICAgMTEsICAgIDE2LCAgICAgMSwgICAgIDAsICAgMTEzLC0zMjc2OCwgICAgIDIsCi0tMzI3NjgKLX07Ci0KLQotI2RlZmluZQlZWUxBU1QJCTcyNAotCi0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPSB7ICAgIDQ2LAotICAgIDQ1LCAgIDE4MSwgICAgMzgsICAgIDg0LCAgIDE2OSwgICAgNTcsICAgIDcyLCAgIDIwNiwgICAgNTIsICAgIDUzLAotICAgIDU0LCAgICA1NSwgICAgODQsICAgIDg0LCAgICA2NCwgICAgNjUsICAgMTIyLCAgIDE4OCwgICAgNzMsICAgIDc0LAotICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OSwgICAxMzAsICAgMTY5LCAgIDEzMSwgICAgODIsICAgIDgzLAotICAgIDQ2LCAgICA4MSwgICAxNjIsICAgMTY1LCAgIDExMywgICAtNjYsICAgMTE2LCAgIDEyOSwgICAxMzUsICAgIDQ2LAotICAgMTE1LCAgIDE3MCwgICAyMDcsICAgMTM2LCAgIDEzMiwgICAxMjAsICAgMTk4LCAgICA0OCwgICAgNDksICAgIDUwLAotICAgMTMzLCAgICA0OCwgICAgNDksICAgIDUwLCAgIDEzNCwgICAgNDYsICAgMTI4LCAgIDEyMSwgICAgNDgsICAgIDQ5LAotICAgIDUwLCAgIDIxMCwgICAxODIsICAgIDU5LCAgIDE3MCwgICAxMjIsICAgMTIzLCAgIDEwNywgICAxMDgsICAgMTA5LAotICAgMTEwLCAgIDExMSwgICAxMTIsICAgMTkxLCAgIDE5MiwgICAgNjAsICAgIDYxLCAgICA2MiwgICAxMzcsICAgMTM4LAotICAgMTM5LCAgIDE0MCwgICAxNDEsICAgMTQyLCAgIDE0MywgICAxNDQsICAgMTQ1LCAgIDE0NiwgICAxNDcsICAgMTQ4LAotICAgMTQ5LCAgIDE1MCwgICAxNTEsICAgMTUyLCAgIDE1MywgICAxNTQsICAgMTU1LCAgIDE1NiwgICAxNTcsICAgMTU4LAotICAgMTU5LCAgICA1MSwgICAxNzQsICAgLTk3LCAgIDE3NSwgICAgNTEsICAgIDU5LCAgIC02OCwgICAyMDMsICAgMjA4LAotICAgMTYzLCAgIDE2NiwgICAgNTEsICAgMTY3LCAgIDIwNCwgICAxNzUsICAgMTc0LCAgIDE3MywgICAgNjYsICAgIDY3LAotICAgIDYyLCAgIDExNywgICAxODYsICAgMTk5LCAgIDIxMywgICAyMTQsICAgMTcyLCAgICA2OCwgICAxMTgsICAgMTE5LAotICAgMTk0LCAgICAgMCwgICAxODYsICAgMTkzLCAgICAgNSwgICAxODksICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAotICAgMTkwLCAgICAxMiwgICAgIDAsICAgIDE0LCAgIDEyMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAotICAgIDIwLCAgICAyMSwgICAgNjksICAgICAwLCAgICA3MCwgICAxOTYsICAgMTIxLCAgICA3MSwgICAxOTcsICAgICAwLAotICAgMjA1LCAgICAgMCwgICAxMTMsICAgMjAwLCAgIDEyMiwgICAxMjMsICAgMjAxLCAgIDExOCwgICAxMTksICAgICAwLAotICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgMjAyLCAgIDEwNywgICAxMDgsICAgMTA5LAotICAgMTEwLCAgIDExMSwgICAxMTIsICAgMTIwLCAgICAgMCwgICAxOTQsICAgICAwLCAgIDE4NiwgICAgIDAsICAgMjA5LAotICAgICAwLCAgICAgMCwgICAxODMsICAgICAwLCAgICAgMCwgICAxMjEsICAgMTc3LCAgIDE3OCwgICAxNzksICAgMTgwLAotICAgICAwLCAgIDE4NCwgICAgIDAsICAgMTIyLCAgIDEyMywgICAxODYsICAgMjExLCAgICAgMSwgICAgIDIsICAgICAzLAotICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAotICAgIDE0LCAgICAgMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAotICAgICAwLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAgNSwgICAgIDAsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAotICAgICAwLCAgICAxMiwgICAgMjYsICAgIDE0LCAgICAgMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAotICAgIDIwLCAgICAyMSwgICAgIDAsICAgIDI3LCAgICAyOCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjksICAgIDMwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM0LCAgICAzNSwgICAgIDAsICAgICAwLAotICAgIDM2LCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAotICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAotICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgMCwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgOTksICAgMTAwLAotICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgIDI2LCAgIDEwNywgICAxMDgsICAgMTA5LAotICAgMTEwLCAgIDExMSwgICAxMTIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyNywgICAgMjgsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgMjksICAgIDMwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA1NiwgICAgMzIsICAgIDMzLAotICAgIDM0LCAgICAzNSwgICAgIDAsICAgICAwLCAgICAzNiwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgICAwLAotICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDIzLAotICAgIDI0LCAgICAyNSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDUsICAgICAwLCAgICAgNywgICAgIDgsICAgICA5LAotICAgIDEwLCAgICAgMCwgICAgMTIsICAgICAwLCAgICAxNCwgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAotICAgIDE5LCAgICAyMCwgICAgMjEsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI5LCAgICAzMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgMTIwLCAgICAgMCwgICAgMzYsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxMjEsICAgMTA3LAotICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAgIDAsICAgMTIyLCAgIDEyMywgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgMTgzLCAgICA0OCwgICAxNjAsICAgIDUwLCAgICAgNywgICAgIDgsICAgICA5LAotICAgIDEwLCAgICAgMCwgICAgMTIsICAgICAwLCAgICAxNCwgICAgIDAsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAotICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDQ4LCAgIDE2MCwgICAgNTAsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAotICAgICAwLCAgICAxMiwgICAgIDAsICAgIDE0LCAgICAgMCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAotICAgIDIwLCAgICAyMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxNjEsICAgMTA3LAotICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNTEsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE2NCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgODUsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA1MSwgICAgODYsICAgIDg3LAotICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LAotICAgIDk4LCAgICA5OSwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgICAwLAotICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDg1LAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE5NSwgICAgODYsICAgIDg3LCAgICA4OCwgICAgODksICAgIDkwLAotICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLAotICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMDYsICAgICAwLCAgIDEwNywgICAxMDgsICAgMTA5LAotICAgMTEwLCAgIDExMSwgICAxMTIsICAgIDg3LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLAotICAgIDk0LCAgICA5NSwgICAgOTYsICAgIDk3LCAgICA5OCwgICAgOTksICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLAotICAgMTA0LCAgIDEwNSwgICAxMDYsICAgICAwLCAgIDEwNywgICAxMDgsICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLAotICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LAotICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAgIDAsICAgMTA3LAotICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk0LAotICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LCAgICA5OSwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LAotICAgMTA1LCAgIDEwNiwgICAgIDAsICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgIDkxLAotICAgIDkyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LCAgICA5OSwgICAxMDAsICAgMTAxLAotICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAgIDAsICAgMTA3LCAgIDEwOCwgICAxMDksICAgMTEwLAotICAgMTExLCAgIDExMiwgICAgOTIsICAgIDkzLCAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LAotICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAgMCwgICAxMDcsICAgMTA4LAotICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAgOTcsICAgIDk4LAotICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAgIDAsICAgMTA3LAotICAgMTA4LCAgIDEwOSwgICAxMTAsICAgMTExLCAgIDExMiwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LAotICAgMTAwLCAgIDEwMSwgICAxMDIsICAgMTAzLCAgIDEwNCwgICAxMDUsICAgMTA2LCAgICAgMCwgICAxMDcsICAgMTA4LAotICAgMTA5LCAgIDExMCwgICAxMTEsICAgMTEyCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXljaGVja1tdID0geyAgICAgMCwKLSAgICAgMCwgICAgIDMsICAgICAwLCAgICAzMCwgICAgMzAsICAgIDExLCAgICAyMSwgICAgMzAsICAgICA3LCAgICAgOCwKLSAgICAgOSwgICAgMTAsICAgIDMwLCAgICAzMCwgICAgMTMsICAgIDE0LCAgICA1OCwgICAgNTksICAgIDE5LCAgICAyMCwKLSAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDE5LCAgICAzMCwgICAgMjEsICAgIDM0LCAgICAzNSwKLSAgICAzMSwgICAgMzEsICAgMTA5LCAgIDExMCwgICAgNDAsICAgIDE1LCAgICAxNSwgICAgMTUsICAgIDY1LCAgICA0MCwKLSAgICA0MCwgICAgNjcsICAgIDY1LCAgICA2NSwgICAgMjEsICAgIDM4LCAgICA2NCwgICAgIDYsICAgICA3LCAgICAgOCwKLSAgICA0MSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgMjEsICAgIDU2LCAgICA1NiwgICAgNTAsICAgICA2LCAgICAgNywKLSAgICAgOCwgICAgNjUsICAgIDY0LCAgICAgNywgICAgNjcsICAgIDU4LCAgICA1OSwgICAgNTQsICAgIDU1LCAgICA1NiwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICA2NSwgICAgMjEsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDg0LCAgICA4NSwKLSAgICA4NiwgICAgODcsICAgIDg4LCAgICA4OSwgICAgOTAsICAgIDkxLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwKLSAgICA5NiwgICAgOTcsICAgIDk4LCAgICA5OSwgICAxMDAsICAgMTAxLCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwKLSAgIDEwNiwgICAgNjAsICAgIDUwLCAgICAxNSwgICAgNjMsICAgIDYwLCAgICAgNywgICAgMTUsICAgIDY0LCAgICA0MiwKLSAgIDEwOSwgICAxMTAsICAgIDYwLCAgIDExMSwgICAgNjUsICAgIDYzLCAgICA1MCwgICAxMTYsICAgIDE5LCAgICAyMCwKLSAgICAyMSwgICAgMTUsICAgMTIzLCAgIDE2OCwgICAgIDAsICAgICAwLCAgIDExNSwgICAgMTUsICAgIDIyLCAgICAyMywKLSAgIDEzNiwgICAgLTEsICAgMTMzLCAgIDEzMywgICAgIDcsICAgMTI1LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKLSAgIDEyNSwgICAgMTQsICAgIC0xLCAgICAxNiwgICAgMzgsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwKLSAgICAyMywgICAgMjQsICAgIDE5LCAgICAtMSwgICAgMjEsICAgMTYxLCAgICA1MCwgICAgMjQsICAgMTY0LCAgICAtMSwKLSAgICAxNSwgICAgLTEsICAgMTY4LCAgIDE2OSwgICAgNTgsICAgIDU5LCAgIDE3MiwgICAgMjIsICAgIDIzLCAgICAtMSwKLSAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgIDE3NSwgICAgNTQsICAgIDU1LCAgICA1NiwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICAzOCwgICAgLTEsICAgMTkxLCAgICAtMSwgICAxODgsICAgIC0xLCAgIDE5NSwKLSAgICAtMSwgICAgLTEsICAgIDY1LCAgICAtMSwgICAgLTEsICAgIDUwLCAgIDExOCwgICAxMTksICAgMTIwLCAgIDEyMSwKLSAgICAtMSwgICAxMjMsICAgIC0xLCAgICA1OCwgICAgNTksICAgMjA2LCAgIDIwNiwgICAgIDMsICAgICA0LCAgICAgNSwKLSAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwKLSAgICAxNiwgICAgLTEsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwKLSAgICAtMSwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgIDcsICAgIC0xLCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKLSAgICAtMSwgICAgMTQsICAgIDM4LCAgICAxNiwgICAgLTEsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwKLSAgICAyMywgICAgMjQsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDU0LCAgICA1NSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIC0xLCAgICAtMSwKLSAgICA2NiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKLSAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIC0xLCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwKLSAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgLTEsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDQ1LCAgICA0NiwKLSAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAzOCwgICAgNTQsICAgIDU1LCAgICA1NiwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDksICAgIDUwLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTksICAgIDYwLCAgICA2MSwKLSAgICA2MiwgICAgNjMsICAgIC0xLCAgICAtMSwgICAgNjYsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywKLSAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAtMSwKLSAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIC0xLCAgICAyNywKLSAgICAyOCwgICAgMjksICAgIC0xLCAgICAtMSwgICAgLTEsICAgICA3LCAgICAtMSwgICAgIDksICAgIDEwLCAgICAxMSwKLSAgICAxMiwgICAgLTEsICAgIDE0LCAgICAtMSwgICAgMTYsICAgIC0xLCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwKLSAgICAyMiwgICAgMjMsICAgIDI0LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICAzOCwgICAgLTEsICAgIDY2LCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUwLCAgICA1NCwKLSAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIC0xLCAgICA1OCwgICAgNTksICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKLSAgICAxMiwgICAgLTEsICAgIDE0LCAgICAtMSwgICAgMTYsICAgIC0xLCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwKLSAgICAyMiwgICAgMjMsICAgIDI0LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKLSAgICAtMSwgICAgMTQsICAgIC0xLCAgICAxNiwgICAgLTEsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwKLSAgICAyMywgICAgMjQsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUwLCAgICA1NCwKLSAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDYwLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTAsICAgIC0xLCAgICAtMSwKLSAgICAtMSwgICAgLTEsICAgIDI2LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjAsICAgIDMyLCAgICAzMywKLSAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywKLSAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAtMSwKLSAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAyNiwKLSAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjgsICAgIDMyLCAgICAzMywgICAgMzQsICAgIDM1LCAgICAzNiwKLSAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwKLSAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgNTQsICAgIDU1LCAgICA1NiwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICAzMywgICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwKLSAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwKLSAgICA1MCwgICAgNTEsICAgIDUyLCAgICAtMSwgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwKLSAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKLSAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIC0xLCAgICA1NCwKLSAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwKLSAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MCwKLSAgICA1MSwgICAgNTIsICAgIC0xLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICAzNywKLSAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywKLSAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIC0xLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywKLSAgICA1OCwgICAgNTksICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwKLSAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIDU0LCAgICA1NSwKLSAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwKLSAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIC0xLCAgICA1NCwKLSAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwKLSAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgLTEsICAgIDU0LCAgICA1NSwKLSAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OQotfTsKLS8qIC0qLUMtKi0gIE5vdGUgc29tZSBjb21waWxlcnMgY2hva2Ugb24gY29tbWVudHMgb24gYCNsaW5lJyBsaW5lcy4gICovCi0jbGluZSAzICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotCi0vKiBTa2VsZXRvbiBvdXRwdXQgcGFyc2VyIGZvciBiaXNvbiwKLSAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKLSAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCi0gICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLwotCi0jaWZuZGVmIGFsbG9jYQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZSAvKiBub3QgR05VIEMuICAqLwotI2lmICghZGVmaW5lZCAoX19TVERDX18pICYmIGRlZmluZWQgKHNwYXJjKSkgfHwgZGVmaW5lZCAoX19zcGFyY19fKSB8fCBkZWZpbmVkIChfX3NwYXJjKSB8fCBkZWZpbmVkIChfX3NnaSkKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLSNlbHNlIC8qIG5vdCBzcGFyYyAqLwotI2lmIGRlZmluZWQgKE1TRE9TKSAmJiAhZGVmaW5lZCAoX19UVVJCT0NfXykKLSNlbHNlIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLwotI2lmIGRlZmluZWQoX0FJWCkKLSAjcHJhZ21hIGFsbG9jYQotI2Vsc2UgLyogbm90IE1TRE9TLCBfX1RVUkJPQ19fLCBvciBfQUlYICovCi0jaWZkZWYgX19ocHV4Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotdm9pZCAqYWxsb2NhICh1bnNpZ25lZCBpbnQpOwotfTsKLSNlbHNlIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotdm9pZCAqYWxsb2NhICgpOwotI2VuZGlmIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2VuZGlmIC8qIF9faHB1eCAqLwotI2VuZGlmIC8qIG5vdCBfQUlYICovCi0jZW5kaWYgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCi0jZW5kaWYgLyogbm90IHNwYXJjLiAgKi8KLSNlbmRpZiAvKiBub3QgR05VIEMuICAqLwotI2VuZGlmIC8qIGFsbG9jYSBub3QgZGVmaW5lZC4gICovCi0KLS8qIFRoaXMgaXMgdGhlIHBhcnNlciBjb2RlIHRoYXQgaXMgd3JpdHRlbiBpbnRvIGVhY2ggYmlzb24gcGFyc2VyCi0gIHdoZW4gdGhlICVzZW1hbnRpY19wYXJzZXIgZGVjbGFyYXRpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZ3JhbW1hci4KLSAgSXQgd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgaGFpcnkgcGFyc2VyCi0gIHVzZWQgd2hlbiAlc2VtYW50aWNfcGFyc2VyIGlzIHNwZWNpZmllZC4gICovCi0KLS8qIE5vdGU6IHRoZXJlIG11c3QgYmUgb25seSBvbmUgZG9sbGFyIHNpZ24gaW4gdGhpcyBmaWxlLgotICAgSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGxpc3Qgb2YgYWN0aW9ucywgZWFjaCBhY3Rpb24KLSAgIGFzIG9uZSBjYXNlIG9mIHRoZSBzd2l0Y2guICAqLwotCi0jZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCi0jZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKLSNkZWZpbmUgWVlFTVBUWQkJLTIKLSNkZWZpbmUgWVlFT0YJCTAKLSNkZWZpbmUgWVlBQ0NFUFQJcmV0dXJuKDApCi0jZGVmaW5lIFlZQUJPUlQgCXJldHVybigxKQotI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQotLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuCi0gICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseSB0byBlYXNlIHRoZQotICAgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KLSAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KLSNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCi0jZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKLSNkZWZpbmUgWVlCQUNLVVAodG9rZW4sIHZhbHVlKSBcCi1kbwkJCQkJCQkJXAotICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAotICAgIHsgeXljaGFyID0gKHRva2VuKSwgeXlsdmFsID0gKHZhbHVlKTsJCQlcCi0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKLSAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAotICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotICBlbHNlCQkJCQkJCQlcCi0gICAgeyB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpOyBZWUVSUk9SOyB9CVwKLXdoaWxlICgwKQotCi0jZGVmaW5lIFlZVEVSUk9SCTEKLSNkZWZpbmUgWVlFUlJDT0RFCTI1NgotCi0jaWZuZGVmIFlZUFVSRQotI2RlZmluZSBZWUxFWAkJeXlsZXgoKQotI2VuZGlmCi0KLSNpZmRlZiBZWVBVUkUKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSNpZmRlZiBZWUxFWF9QQVJBTQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYywgWVlMRVhfUEFSQU0pCi0jZWxzZQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYykKLSNlbmRpZgotI2Vsc2UgLyogbm90IFlZTFNQX05FRURFRCAqLwotI2lmZGVmIFlZTEVYX1BBUkFNCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCBZWUxFWF9QQVJBTSkKLSNlbHNlCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsKQotI2VuZGlmCi0jZW5kaWYgLyogbm90IFlZTFNQX05FRURFRCAqLwotI2VuZGlmCi0KLS8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlICovCi0KLSNpZm5kZWYgWVlQVVJFCi0KLWludAl5eWNoYXI7CQkJLyogIHRoZSBsb29rYWhlYWQgc3ltYm9sCQkqLwotWVlTVFlQRQl5eWx2YWw7CQkJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUJCSovCi0JCQkJLyogIGxvb2thaGVhZCBzeW1ib2wJCQkqLwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi1ZWUxUWVBFIHl5bGxvYzsJCQkvKiAgbG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZAkqLwotCQkJCS8qICBzeW1ib2wJCQkJKi8KLSNlbmRpZgotCi1pbnQgeXluZXJyczsJCQkvKiAgbnVtYmVyIG9mIHBhcnNlIGVycm9ycyBzbyBmYXIgICAgICAgKi8KLSNlbmRpZiAgLyogbm90IFlZUFVSRSAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi1pbnQgeXlkZWJ1ZzsJCQkvKiAgbm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZQkqLwotLyogU2luY2UgdGhpcyBpcyB1bmluaXRpYWxpemVkLCBpdCBkb2VzIG5vdCBzdG9wIG11bHRpcGxlIHBhcnNlcnMKLSAgIGZyb20gY29leGlzdGluZy4gICovCi0jZW5kaWYKLQotLyogIFlZSU5JVERFUFRIIGluZGljYXRlcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MJKi8KLQotI2lmbmRlZglZWUlOSVRERVBUSAotI2RlZmluZSBZWUlOSVRERVBUSCAyMDAKLSNlbmRpZgotCi0vKiAgWVlNQVhERVBUSCBpcyB0aGUgbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8KLSAgICAoZWZmZWN0aXZlIG9ubHkgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuICAqLwotCi0jaWYgWVlNQVhERVBUSCA9PSAwCi0jdW5kZWYgWVlNQVhERVBUSAotI2VuZGlmCi0KLSNpZm5kZWYgWVlNQVhERVBUSAotI2RlZmluZSBZWU1BWERFUFRIIDEwMDAwCi0jZW5kaWYKLQotLyogUHJldmVudCB3YXJuaW5nIGlmIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi1pbnQgeXlwYXJzZSAodm9pZCk7Ci0jZW5kaWYKLQwKLSNpZiBfX0dOVUNfXyA+IDEJCS8qIEdOVSBDIGFuZCBHTlUgQysrIGRlZmluZSB0aGlzLiAgKi8KLSNkZWZpbmUgX195eV9tZW1jcHkoVE8sRlJPTSxDT1VOVCkJX19idWlsdGluX21lbWNweShUTyxGUk9NLENPVU5UKQotI2Vsc2UJCQkJLyogbm90IEdOVSBDIG9yIEMrKyAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotCi0vKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcwotICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLwotc3RhdGljIHZvaWQKLV9feXlfbWVtY3B5ICh0bywgZnJvbSwgY291bnQpCi0gICAgIGNoYXIgKnRvOwotICAgICBjaGFyICpmcm9tOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOwotICByZWdpc3RlciBjaGFyICp0ID0gdG87Ci0gIHJlZ2lzdGVyIGludCBpID0gY291bnQ7Ci0KLSAgd2hpbGUgKGktLSA+IDApCi0gICAgKnQrKyA9ICpmKys7Ci19Ci0KLSNlbHNlIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCi0gICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCi1zdGF0aWMgdm9pZAotX195eV9tZW1jcHkgKGNoYXIgKnRvLCBjaGFyICpmcm9tLCBpbnQgY291bnQpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOwotICByZWdpc3RlciBjaGFyICp0ID0gdG87Ci0gIHJlZ2lzdGVyIGludCBpID0gY291bnQ7Ci0KLSAgd2hpbGUgKGktLSA+IDApCi0gICAgKnQrKyA9ICpmKys7Ci19Ci0KLSNlbmRpZgotI2VuZGlmCi0MCi0jbGluZSAxOTYgIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0KLS8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKLSAgIGludG8geXlwYXJzZS4gIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSB0eXBlIHZvaWQgKi4KLSAgIEl0IHNob3VsZCBhY3R1YWxseSBwb2ludCB0byBhbiBvYmplY3QuCi0gICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAotICAgdG8gdGhlIHByb3BlciBwb2ludGVyIHR5cGUuICAqLwotCi0jaWZkZWYgWVlQQVJTRV9QQVJBTQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQgKllZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgdm9pZCAqWVlQQVJTRV9QQVJBTTsKLSNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNlbHNlIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAotI2VuZGlmIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCi0KLWludAoteXlwYXJzZShZWVBBUlNFX1BBUkFNX0FSRykKLSAgICAgWVlQQVJTRV9QQVJBTV9ERUNMCi17Ci0gIHJlZ2lzdGVyIGludCB5eXN0YXRlOwotICByZWdpc3RlciBpbnQgeXluOwotICByZWdpc3RlciBzaG9ydCAqeXlzc3A7Ci0gIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOwotICBpbnQgeXllcnJzdGF0dXM7CS8qICBudW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkICovCi0gIGludCB5eWNoYXIxID0gMDsJCS8qICBsb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlciAqLwotCi0gIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzdGF0ZSBzdGFjawkJCSovCi0gIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHNlbWFudGljIHZhbHVlIHN0YWNrCQkqLwotCi0gIHNob3J0ICp5eXNzID0geXlzc2E7CQkvKiAgcmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzICovCi0gIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsJLyogIHRvIGFsbG93IHl5b3ZlcmZsb3cgdG8geHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUgKi8KLQotI2lmZGVmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBsb2NhdGlvbiBzdGFjawkJCSovCi0gIFlZTFRZUEUgKnl5bHMgPSB5eWxzYTsKLSAgWVlMVFlQRSAqeXlsc3A7Ci0KLSNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tLCB5eWxzcC0tKQotI2Vsc2UKLSNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tKQotI2VuZGlmCi0KLSAgaW50IHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7Ci0KLSNpZmRlZiBZWVBVUkUKLSAgaW50IHl5Y2hhcjsKLSAgWVlTVFlQRSB5eWx2YWw7Ci0gIGludCB5eW5lcnJzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bGxvYzsKLSNlbmRpZgotI2VuZGlmCi0KLSAgWVlTVFlQRSB5eXZhbDsJCS8qICB0aGUgdmFyaWFibGUgdXNlZCB0byByZXR1cm4JCSovCi0JCQkJLyogIHNlbWFudGljIHZhbHVlcyBmcm9tIHRoZSBhY3Rpb24JKi8KLQkJCQkvKiAgcm91dGluZXMJCQkJKi8KLQotICBpbnQgeXlsZW47Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIik7Ci0jZW5kaWYKLQotICB5eXN0YXRlID0gMDsKLSAgeXllcnJzdGF0dXMgPSAwOwotICB5eW5lcnJzID0gMDsKLSAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCi0KLSAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KLSAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCi0gICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KLSAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLwotCi0gIHl5c3NwID0geXlzcyAtIDE7Ci0gIHl5dnNwID0geXl2czsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgPSB5eWxzOwotI2VuZGlmCi0KLS8qIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluICB5eXN0YXRlICAuICAqLwotLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKLSAgIGhhdmUganVzdCBiZWVuIHB1c2hlZC4gc28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4gICovCi15eW5ld3N0YXRlOgotCi0gICorK3l5c3NwID0geXlzdGF0ZTsKLQotICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKLSAgICB7Ci0gICAgICAvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8geHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCi0gICAgICAvKiBVc2UgY29waWVzIG9mIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8gbWVtb3J5LiAqLwotICAgICAgWVlTVFlQRSAqeXl2czEgPSB5eXZzOwotICAgICAgc2hvcnQgKnl5c3MxID0geXlzczsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIFlZTFRZUEUgKnl5bHMxID0geXlsczsKLSNlbmRpZgotCi0gICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KLSAgICAgIGludCBzaXplID0geXlzc3AgLSB5eXNzICsgMTsKLQotI2lmZGVmIHl5b3ZlcmZsb3cKLSAgICAgIC8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mCi0JIHRoZSBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gICovCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsCi0JIGJ1dCB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLwotICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICZ5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKLQkJICZ5eXN0YWNrc2l6ZSk7Ci0jZWxzZQotICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICZ5eXN0YWNrc2l6ZSk7Ci0jZW5kaWYKLQotICAgICAgeXlzcyA9IHl5c3MxOyB5eXZzID0geXl2czE7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzID0geXlsczE7Ci0jZW5kaWYKLSNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLSAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLwotICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCi0JewotCSAgeXllcnJvcigicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgICB5eXN0YWNrc2l6ZSAqPSAyOwotICAgICAgaWYgKHl5c3RhY2tzaXplID4gWVlNQVhERVBUSCkKLQl5eXN0YWNrc2l6ZSA9IFlZTUFYREVQVEg7Ci0gICAgICB5eXNzID0gKHNob3J0ICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eXNzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXlzcywgKGNoYXIgKil5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7Ci0gICAgICB5eXZzID0gKFlZU1RZUEUgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXZzLCAoY2hhciAqKXl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApKTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHMgPSAoWVlMVFlQRSAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXlsc3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5bHMsIChjaGFyICopeXlsczEsIHNpemUgKiBzaXplb2YgKCp5eWxzcCkpOwotI2VuZGlmCi0jZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLwotCi0gICAgICB5eXNzcCA9IHl5c3MgKyBzaXplIC0gMTsKLSAgICAgIHl5dnNwID0geXl2cyArIHNpemUgLSAxOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlsc3AgPSB5eWxzICsgc2l6ZSAtIDE7Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlZFxuIiwgeXlzdGFja3NpemUpOwotI2VuZGlmCi0KLSAgICAgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotCVlZQUJPUlQ7Ci0gICAgfQotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpOwotI2VuZGlmCi0KLSAgZ290byB5eWJhY2t1cDsKLSB5eWJhY2t1cDoKLQotLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCi0vKiBSZWFkIGEgbG9va2FoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLS8qIHl5cmVzdW1lOiAqLwotCi0gIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLQotICAvKiB5eWNoYXIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0YKLSAgICAgb3IgYSB2YWxpZCB0b2tlbiBpbiBleHRlcm5hbCBmb3JtLiAgKi8KLQotICBpZiAoeXljaGFyID09IFlZRU1QVFkpCi0gICAgewotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpOwotI2VuZGlmCi0gICAgICB5eWNoYXIgPSBZWUxFWDsKLSAgICB9Ci0KLSAgLyogQ29udmVydCB0b2tlbiB0byBpbnRlcm5hbCBmb3JtIChpbiB5eWNoYXIxKSBmb3IgaW5kZXhpbmcgdGFibGVzIHdpdGggKi8KLQotICBpZiAoeXljaGFyIDw9IDApCQkvKiBUaGlzIG1lYW5zIGVuZCBvZiBpbnB1dC4gKi8KLSAgICB7Ci0gICAgICB5eWNoYXIxID0gMDsKLSAgICAgIHl5Y2hhciA9IFlZRU9GOwkJLyogRG9uJ3QgY2FsbCBZWUxFWCBhbnkgbW9yZSAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIk5vdyBhdCBlbmQgb2YgaW5wdXQuXG4iKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSh5eWNoYXIpOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJOZXh0IHRva2VuIGlzICVkICglcyIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0JICAvKiBHaXZlIHRoZSBpbmRpdmlkdWFsIHBhcnNlciBhIHdheSB0byBwcmludCB0aGUgcHJlY2lzZSBtZWFuaW5nCi0JICAgICBvZiBhIHRva2VuLCBmb3IgZnVydGhlciBkZWJ1Z2dpbmcgaW5mby4gICovCi0jaWZkZWYgWVlQUklOVAotCSAgWVlQUklOVCAoc3RkZXJyLCB5eWNoYXIsIHl5bHZhbCk7Ci0jZW5kaWYKLQkgIGZwcmludGYgKHN0ZGVyciwgIilcbiIpOwotCX0KLSNlbmRpZgotICAgIH0KLQotICB5eW4gKz0geXljaGFyMTsKLSAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSB5eWNoYXIxKQotICAgIGdvdG8geXlkZWZhdWx0OwotCi0gIHl5biA9IHl5dGFibGVbeXluXTsKLQotICAvKiB5eW4gaXMgd2hhdCB0byBkbyBmb3IgdGhpcyB0b2tlbiB0eXBlIGluIHRoaXMgc3RhdGUuCi0gICAgIE5lZ2F0aXZlID0+IHJlZHVjZSwgLXl5biBpcyBydWxlIG51bWJlci4KLSAgICAgUG9zaXRpdmUgPT4gc2hpZnQsIHl5biBpcyBuZXcgc3RhdGUuCi0gICAgICAgTmV3IHN0YXRlIGlzIGZpbmFsIHN0YXRlID0+IGRvbid0IGJvdGhlciB0byBzaGlmdCwKLSAgICAgICBqdXN0IHJldHVybiBzdWNjZXNzLgotICAgICAwLCBvciBtb3N0IG5lZ2F0aXZlIG51bWJlciA9PiBlcnJvci4gICovCi0KLSAgaWYgKHl5biA8IDApCi0gICAgewotICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCi0JZ290byB5eWVycmxhYjsKLSAgICAgIHl5biA9IC15eW47Ci0gICAgICBnb3RvIHl5cmVkdWNlOwotICAgIH0KLSAgZWxzZSBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycmxhYjsKLQotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyB0b2tlbiAlZCAoJXMpLCAiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotI2VuZGlmCi0KLSAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KLSAgaWYgKHl5Y2hhciAhPSBZWUVPRikKLSAgICB5eWNoYXIgPSBZWUVNUFRZOwotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIC8qIGNvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3Igc3RhdHVzLiAgKi8KLSAgaWYgKHl5ZXJyc3RhdHVzKSB5eWVycnN0YXR1cy0tOwotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLQotLyogRG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gICovCi15eWRlZmF1bHQ6Ci0KLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0vKiBEbyBhIHJlZHVjdGlvbi4gIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCi15eXJlZHVjZToKLSAgeXlsZW4gPSB5eXIyW3l5bl07Ci0gIGlmICh5eWxlbiA+IDApCi0gICAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsgLyogaW1wbGVtZW50IGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbiAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJSZWR1Y2luZyB2aWEgcnVsZSAlZCAobGluZSAlZCksICIsCi0JICAgICAgIHl5biwgeXlybGluZVt5eW5dKTsKLQotICAgICAgLyogUHJpbnQgdGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZCwgYW5kIHRoZWlyIHJlc3VsdC4gICovCi0gICAgICBmb3IgKGkgPSB5eXByaHNbeXluXTsgeXlyaHNbaV0gPiAwOyBpKyspCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1tpXV0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVzXG4iLCB5eXRuYW1lW3l5cjFbeXluXV0pOwotICAgIH0KLSNlbmRpZgotCi0KLSAgc3dpdGNoICh5eW4pIHsKLQotY2FzZSAzOgotI2xpbmUgMjM1ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlKHl5dnNwWzBdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTs7Ci0gICAgYnJlYWs7fQotY2FzZSA1OgotI2xpbmUgMjQzICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQ09NTUEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2OgotI2xpbmUgMjQ4ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9JTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3OgotI2xpbmUgMjUxICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9BRERSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODoKLSNsaW5lIDI1NCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTkVHKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOToKLSNsaW5lIDI1OCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTE9HSUNBTF9OT1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDoKLSNsaW5lIDI2MiAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ09NUExFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDExOgotI2xpbmUgMjY2ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QUkVJTkNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjoKLSNsaW5lIDI3MCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUFJFREVDUkVNRU5UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTM6Ci0jbGluZSAyNzQgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BPU1RJTkNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNDoKLSNsaW5lIDI3OCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfUE9TVERFQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE1OgotI2xpbmUgMjgyICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9TSVpFT0YpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNjoKLSNsaW5lIDI4NiAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1BUUik7Ci0JCQkgIHdyaXRlX2V4cF9zdHJpbmcgKHl5dnNwWzBdLnN2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTc6Ci0jbGluZSAyOTIgImMtZXhwLnkiCi17IC8qIGV4cC0+dHlwZTo6bmFtZSBiZWNvbWVzIGV4cC0+KigmdHlwZTo6bmFtZSkgKi8KLQkJCSAgLyogTm90ZTogdGhpcyBkb2Vzbid0IHdvcmsgaWYgbmFtZSBpcyBhCi0JCQkgICAgIHN0YXRpYyBtZW1iZXIhICBGSVhNRSAqLwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9BRERSKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX01QVFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxODoKLSNsaW5lIDMwMCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX01QVFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxOToKLSNsaW5lIDMwNCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1NUUlVDVCk7Ci0JCQkgIHdyaXRlX2V4cF9zdHJpbmcgKHl5dnNwWzBdLnN2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjA6Ci0jbGluZSAzMTAgImMtZXhwLnkiCi17IC8qIGV4cC50eXBlOjpuYW1lIGJlY29tZXMgZXhwLiooJnR5cGU6Om5hbWUpICovCi0JCQkgIC8qIE5vdGU6IHRoaXMgZG9lc24ndCB3b3JrIGlmIG5hbWUgaXMgYQotCQkJICAgICBzdGF0aWMgbWVtYmVyISAgRklYTUUgKi8KLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQUREUik7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9NRU1CRVIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMToKLSNsaW5lIDMxOCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX01FTUJFUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIyOgotI2xpbmUgMzIyICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCU0NSSVBUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjM6Ci0jbGluZSAzMjggImMtZXhwLnkiCi17IHN0YXJ0X2FyZ2xpc3QgKCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI0OgotI2xpbmUgMzMwICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRlVOQ0FMTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIGVuZF9hcmdsaXN0ICgpKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0ZVTkNBTEwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNToKLSNsaW5lIDMzNiAiYy1leHAueSIKLXsgc3RhcnRfYXJnbGlzdCAoKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjc6Ci0jbGluZSAzNDMgImMtZXhwLnkiCi17IGFyZ2xpc3RfbGVuID0gMTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjg6Ci0jbGluZSAzNDcgImMtZXhwLnkiCi17IGFyZ2xpc3RfbGVuKys7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI5OgotI2xpbmUgMzUxICJjLWV4cC55IgoteyB5eXZhbC5sdmFsID0gZW5kX2FyZ2xpc3QgKCkgLSAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMDoKLSNsaW5lIDM1NCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0FSUkFZKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgMCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIHl5dnNwWzBdLmx2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMToKLSNsaW5lIDM2MSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUVNVkFMKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFstMl0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX01FTVZBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMyOgotI2xpbmUgMzY3ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFstMl0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMzoKLSNsaW5lIDM3MyAiYy1leHAueSIKLXsgOwotICAgIGJyZWFrO30KLWNhc2UgMzQ6Ci0jbGluZSAzNzkgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRVBFQVQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNToKLSNsaW5lIDM4MyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX01VTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM2OgotI2xpbmUgMzg3ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRElWKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzc6Ci0jbGluZSAzOTEgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SRU0pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzODoKLSNsaW5lIDM5NSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FERCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM5OgotI2xpbmUgMzk5ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfU1VCKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDA6Ci0jbGluZSA0MDMgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MU0gpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MToKLSNsaW5lIDQwNyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JTSCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQyOgotI2xpbmUgNDExICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MzoKLSNsaW5lIDQxNSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX05PVEVRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDQ6Ci0jbGluZSA0MTkgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MRVEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NToKLSNsaW5lIDQyMyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dFUSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ2OgotI2xpbmUgNDI3ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVTUyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ3OgotI2xpbmUgNDMxICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR1RSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDg6Ci0jbGluZSA0MzUgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX0FORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ5OgotI2xpbmUgNDM5ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9YT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1MDoKLSNsaW5lIDQ0MyAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfSU9SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTE6Ci0jbGluZSA0NDcgImMtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MT0dJQ0FMX0FORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUyOgotI2xpbmUgNDUxICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9PUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUzOgotI2xpbmUgNDU1ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVEVSTk9QX0NPTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NDoKLSNsaW5lIDQ1OSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU1OgotI2xpbmUgNDYzICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOX01PRElGWSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlICh5eXZzcFstMV0ub3Bjb2RlKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTl9NT0RJRlkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NjoKLSNsaW5lIDQ2OSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWzBdLnR5cGVkX3ZhbF9pbnQudHlwZSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpKHl5dnNwWzBdLnR5cGVkX3ZhbF9pbnQudmFsKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTc6Ci0jbGluZSA0NzYgImMtZXhwLnkiCi17IFlZU1RZUEUgdmFsOwotCQkJICBwYXJzZV9udW1iZXIgKHl5dnNwWzBdLnNzeW0uc3Rva2VuLnB0ciwgeXl2c3BbMF0uc3N5bS5zdG9rZW4ubGVuZ3RoLCAwLCAmdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHZhbC50eXBlZF92YWxfaW50LnR5cGUpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKXZhbC50eXBlZF92YWxfaW50LnZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDU4OgotI2xpbmUgNDg3ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFswXS50eXBlZF92YWxfZmxvYXQudHlwZSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfZGJsY3N0ICh5eXZzcFswXS50eXBlZF92YWxfZmxvYXQuZHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MToKLSNsaW5lIDUwMSAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQpOwotCQkJICBDSEVDS19UWVBFREVGICh5eXZzcFstMV0udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIFRZUEVfTEVOR1RIICh5eXZzcFstMV0udHZhbCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYyOgotI2xpbmUgNTA5ICJjLWV4cC55IgoteyAvKiBDIHN0cmluZ3MgYXJlIGNvbnZlcnRlZCBpbnRvIGFycmF5IGNvbnN0YW50cyB3aXRoCi0JCQkgICAgIGFuIGV4cGxpY2l0IG51bGwgYnl0ZSBhZGRlZCBhdCB0aGUgZW5kLiAgVGh1cwotCQkJICAgICB0aGUgYXJyYXkgdXBwZXIgYm91bmQgaXMgdGhlIHN0cmluZyBsZW5ndGguCi0JCQkgICAgIFRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgaW4gQyBhcyBhIGNvbXBsZXRlbHkgZW1wdHkKLQkJCSAgICAgc3RyaW5nLiAqLwotCQkJICBjaGFyICpzcCA9IHl5dnNwWzBdLnN2YWwucHRyOyBpbnQgY291bnQgPSB5eXZzcFswXS5zdmFsLmxlbmd0aDsKLQkJCSAgd2hpbGUgKGNvdW50LS0gPiAwKQotCQkJICAgIHsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2NoYXIpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkoKnNwKyspKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgICB9Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfY2hhcik7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpJ1wwJyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0FSUkFZKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgMCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpICh5eXZzcFswXS5zdmFsLmxlbmd0aCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQVJSQVkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MzoKLSNsaW5lIDUzNCAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY0OgotI2xpbmUgNTM5ICJjLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2Jvb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NToKLSNsaW5lIDU0NiAiYy1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9ib29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjY6Ci0jbGluZSA1NTUgImMtZXhwLnkiCi17Ci0JCQkgIGlmICh5eXZzcFswXS5zc3ltLnN5bSkKLQkJCSAgICB5eXZhbC5idmFsID0gU1lNQk9MX0JMT0NLX1ZBTFVFICh5eXZzcFswXS5zc3ltLnN5bSk7Ci0JCQkgIGVsc2UKLQkJCSAgICBlcnJvciAoIk5vIGZpbGUgb3IgZnVuY3Rpb24gXCIlc1wiLiIsCi0JCQkJICAgY29weV9uYW1lICh5eXZzcFswXS5zc3ltLnN0b2tlbikpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNjc6Ci0jbGluZSA1NjMgImMtZXhwLnkiCi17Ci0JCQkgIHl5dmFsLmJ2YWwgPSB5eXZzcFswXS5idmFsOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNjg6Ci0jbGluZSA1NjkgImMtZXhwLnkiCi17IHN0cnVjdCBzeW1ib2wgKnRlbQotCQkJICAgID0gbG9va3VwX3N5bWJvbCAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwgeXl2c3BbLTJdLmJ2YWwsCi0JCQkJCSAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAotCQkJCQkgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKLQkJCSAgaWYgKCF0ZW0gfHwgU1lNQk9MX0NMQVNTICh0ZW0pICE9IExPQ19CTE9DSykKLQkJCSAgICBlcnJvciAoIk5vIGZ1bmN0aW9uIFwiJXNcIiBpbiBzcGVjaWZpZWQgY29udGV4dC4iLAotCQkJCSAgIGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCkpOwotCQkJICB5eXZhbC5idmFsID0gU1lNQk9MX0JMT0NLX1ZBTFVFICh0ZW0pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2OToKLSNsaW5lIDU4MCAiYy1leHAueSIKLXsgc3RydWN0IHN5bWJvbCAqc3ltOwotCQkJICBzeW0gPSBsb29rdXBfc3ltYm9sIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLCB5eXZzcFstMl0uYnZhbCwKLQkJCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsIChpbnQgKikgTlVMTCwKLQkJCQkJICAgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKLQkJCSAgaWYgKHN5bSA9PSAwKQotCQkJICAgIGVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBzcGVjaWZpZWQgY29udGV4dC4iLAotCQkJCSAgIGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCkpOwotCi0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAvKiBibG9ja19mb3VuZCBpcyBzZXQgYnkgbG9va3VwX3N5bWJvbC4gICovCi0JCQkgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKGJsb2NrX2ZvdW5kKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9zeW0gKHN5bSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3MDoKLSNsaW5lIDU5NiAiYy1leHAueSIKLXsKLQkJCSAgc3RydWN0IHR5cGUgKnR5cGUgPSB5eXZzcFstMl0udHZhbDsKLQkJCSAgaWYgKFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX1NUUlVDVAotCQkJICAgICAgJiYgVFlQRV9DT0RFICh0eXBlKSAhPSBUWVBFX0NPREVfVU5JT04pCi0JCQkgICAgZXJyb3IgKCJgJXMnIGlzIG5vdCBkZWZpbmVkIGFzIGFuIGFnZ3JlZ2F0ZSB0eXBlLiIsCi0JCQkJICAgVFlQRV9OQU1FICh0eXBlKSk7Ci0KLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NDT1BFKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh0eXBlKTsKLQkJCSAgd3JpdGVfZXhwX3N0cmluZyAoeXl2c3BbMF0uc3ZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TQ09QRSk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA3MToKLSNsaW5lIDYwOSAiYy1leHAueSIKLXsKLQkJCSAgc3RydWN0IHR5cGUgKnR5cGUgPSB5eXZzcFstM10udHZhbDsKLQkJCSAgc3RydWN0IHN0b2tlbiB0bXBfdG9rZW47Ci0JCQkgIGlmIChUWVBFX0NPREUgKHR5cGUpICE9IFRZUEVfQ09ERV9TVFJVQ1QKLQkJCSAgICAgICYmIFRZUEVfQ09ERSAodHlwZSkgIT0gVFlQRV9DT0RFX1VOSU9OKQotCQkJICAgIGVycm9yICgiYCVzJyBpcyBub3QgZGVmaW5lZCBhcyBhbiBhZ2dyZWdhdGUgdHlwZS4iLAotCQkJCSAgIFRZUEVfTkFNRSAodHlwZSkpOwotCi0JCQkgIHRtcF90b2tlbi5wdHIgPSAoY2hhciopIGFsbG9jYSAoeXl2c3BbMF0uc3ZhbC5sZW5ndGggKyAyKTsKLQkJCSAgdG1wX3Rva2VuLmxlbmd0aCA9IHl5dnNwWzBdLnN2YWwubGVuZ3RoICsgMTsKLQkJCSAgdG1wX3Rva2VuLnB0clswXSA9ICd+JzsKLQkJCSAgbWVtY3B5ICh0bXBfdG9rZW4ucHRyKzEsIHl5dnNwWzBdLnN2YWwucHRyLCB5eXZzcFswXS5zdmFsLmxlbmd0aCk7Ci0JCQkgIHRtcF90b2tlbi5wdHJbdG1wX3Rva2VuLmxlbmd0aF0gPSAwOwotCi0JCQkgIC8qIENoZWNrIGZvciB2YWxpZCBkZXN0cnVjdG9yIG5hbWUuICAqLwotCQkJICBkZXN0cnVjdG9yX25hbWVfcCAodG1wX3Rva2VuLnB0ciwgdHlwZSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TQ09QRSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodHlwZSk7Ci0JCQkgIHdyaXRlX2V4cF9zdHJpbmcgKHRtcF90b2tlbik7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TQ09QRSk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA3MzoKLSNsaW5lIDYzNCAiYy1leHAueSIKLXsKLQkJCSAgY2hhciAqbmFtZSA9IGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCk7Ci0JCQkgIHN0cnVjdCBzeW1ib2wgKnN5bTsKLQkJCSAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOwotCi0JCQkgIHN5bSA9Ci0JCQkgICAgbG9va3VwX3N5bWJvbCAobmFtZSwgKGNvbnN0IHN0cnVjdCBibG9jayAqKSBOVUxMLAotCQkJCQkgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsCi0JCQkJCSAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKLQkJCSAgaWYgKHN5bSkKLQkJCSAgICB7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKE5VTEwpOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9zeW0gKHN5bSk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVkFSX1ZBTFVFKTsKLQkJCSAgICAgIGJyZWFrOwotCQkJICAgIH0KLQotCQkJICBtc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sIChuYW1lLCBOVUxMLCBOVUxMKTsKLQkJCSAgaWYgKG1zeW1ib2wgIT0gTlVMTCkKLQkJCSAgICB7Ci0JCQkgICAgICB3cml0ZV9leHBfbXN5bWJvbCAobXN5bWJvbCwKLQkJCQkJCSBsb29rdXBfZnVuY3Rpb25fdHlwZSAoYnVpbHRpbl90eXBlX2ludCksCi0JCQkJCQkgYnVpbHRpbl90eXBlX2ludCk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgaWYgKCFoYXZlX2Z1bGxfc3ltYm9scyAoKSAmJiAhaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCi0JCQkgICAgICBlcnJvciAoIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuICBVc2UgdGhlIFwiZmlsZVwiIGNvbW1hbmQuIik7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLCBuYW1lKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDc0OgotI2xpbmUgNjY4ICJjLWV4cC55IgoteyBzdHJ1Y3Qgc3ltYm9sICpzeW0gPSB5eXZzcFswXS5zc3ltLnN5bTsKLQotCQkJICBpZiAoc3ltKQotCQkJICAgIHsKLQkJCSAgICAgIGlmIChzeW1ib2xfcmVhZF9uZWVkc19mcmFtZSAoc3ltKSkKLQkJCQl7Ci0JCQkJICBpZiAoaW5uZXJtb3N0X2Jsb2NrID09IDAgfHwKLQkJCQkgICAgICBjb250YWluZWRfaW4gKGJsb2NrX2ZvdW5kLCAKLQkJCQkJCSAgICBpbm5lcm1vc3RfYmxvY2spKQotCQkJCSAgICBpbm5lcm1vc3RfYmxvY2sgPSBibG9ja19mb3VuZDsKLQkJCQl9Ci0KLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAgICAgLyogV2Ugd2FudCB0byB1c2UgdGhlIHNlbGVjdGVkIGZyYW1lLCBub3QKLQkJCQkgYW5vdGhlciBtb3JlIGlubmVyIGZyYW1lIHdoaWNoIGhhcHBlbnMgdG8KLQkJCQkgYmUgaW4gdGhlIHNhbWUgYmxvY2suICAqLwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAgIH0KLQkJCSAgZWxzZSBpZiAoeXl2c3BbMF0uc3N5bS5pc19hX2ZpZWxkX29mX3RoaXMpCi0JCQkgICAgewotCQkJICAgICAgLyogQysrOiBpdCBoYW5ncyBvZmYgb2YgYHRoaXMnLiAgTXVzdAotCQkJICAgICAgICAgbm90IGluYWR2ZXJ0ZW50bHkgY29udmVydCBmcm9tIGEgbWV0aG9kIGNhbGwKLQkJCQkgdG8gZGF0YSByZWYuICAqLwotCQkJICAgICAgaWYgKGlubmVybW9zdF9ibG9jayA9PSAwIHx8IAotCQkJCSAgY29udGFpbmVkX2luIChibG9ja19mb3VuZCwgaW5uZXJtb3N0X2Jsb2NrKSkKLQkJCQlpbm5lcm1vc3RfYmxvY2sgPSBibG9ja19mb3VuZDsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9QVFIpOwotCQkJICAgICAgd3JpdGVfZXhwX3N0cmluZyAoeXl2c3BbMF0uc3N5bS5zdG9rZW4pOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1BUUik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOwotCQkJICAgICAgcmVnaXN0ZXIgY2hhciAqYXJnID0gY29weV9uYW1lICh5eXZzcFswXS5zc3ltLnN0b2tlbik7Ci0KLQkJCSAgICAgIG1zeW1ib2wgPQotCQkJCWxvb2t1cF9taW5pbWFsX3N5bWJvbCAoYXJnLCBOVUxMLCBOVUxMKTsKLQkJCSAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCi0JCQkJewotCQkJCSAgd3JpdGVfZXhwX21zeW1ib2wgKG1zeW1ib2wsCi0JCQkJCQkgICAgIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKLQkJCQkJCSAgICAgYnVpbHRpbl90eXBlX2ludCk7Ci0JCQkJfQotCQkJICAgICAgZWxzZSBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKLQkJCQllcnJvciAoIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuICBVc2UgdGhlIFwiZmlsZVwiIGNvbW1hbmQuIik7Ci0JCQkgICAgICBlbHNlCi0JCQkJZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLAotCQkJCSAgICAgICBjb3B5X25hbWUgKHl5dnNwWzBdLnNzeW0uc3Rva2VuKSk7Ci0JCQkgICAgfQotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNzg6Ci0jbGluZSA3MzQgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBmb2xsb3dfdHlwZXMgKHl5dnNwWy0xXS50dmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzk6Ci0jbGluZSA3MzYgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBmb2xsb3dfdHlwZXMgKHl5dnNwWy0yXS50dmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODA6Ci0jbGluZSA3MzggImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBmb2xsb3dfdHlwZXMgKHl5dnNwWy0yXS50dmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODE6Ci0jbGluZSA3NDIgImMtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfcG9pbnRlcik7IHl5dmFsLnZvaWR2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MjoKLSNsaW5lIDc0NCAiYy1leHAueSIKLXsgcHVzaF90eXBlICh0cF9wb2ludGVyKTsgeXl2YWwudm9pZHZhbCA9IHl5dnNwWzBdLnZvaWR2YWw7IDsKLSAgICBicmVhazt9Ci1jYXNlIDgzOgotI2xpbmUgNzQ2ICJjLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX3JlZmVyZW5jZSk7IHl5dmFsLnZvaWR2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4NDoKLSNsaW5lIDc0OCAiYy1leHAueSIKLXsgcHVzaF90eXBlICh0cF9yZWZlcmVuY2UpOyB5eXZhbC52b2lkdmFsID0geXl2c3BbMF0udm9pZHZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgODY6Ci0jbGluZSA3NTMgImMtZXhwLnkiCi17IHl5dmFsLnZvaWR2YWwgPSB5eXZzcFstMV0udm9pZHZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgODc6Ci0jbGluZSA3NTUgImMtZXhwLnkiCi17Ci0JCQkgIHB1c2hfdHlwZV9pbnQgKHl5dnNwWzBdLmx2YWwpOwotCQkJICBwdXNoX3R5cGUgKHRwX2FycmF5KTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDg4OgotI2xpbmUgNzYwICJjLWV4cC55IgotewotCQkJICBwdXNoX3R5cGVfaW50ICh5eXZzcFswXS5sdmFsKTsKLQkJCSAgcHVzaF90eXBlICh0cF9hcnJheSk7Ci0JCQkgIHl5dmFsLnZvaWR2YWwgPSAwOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgODk6Ci0jbGluZSA3NjcgImMtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfZnVuY3Rpb24pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5MDoKLSNsaW5lIDc2OSAiYy1leHAueSIKLXsgcHVzaF90eXBlICh0cF9mdW5jdGlvbik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDkxOgotI2xpbmUgNzczICJjLWV4cC55IgoteyB5eXZhbC5sdmFsID0gLTE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDkyOgotI2xpbmUgNzc1ICJjLWV4cC55IgoteyB5eXZhbC5sdmFsID0geXl2c3BbLTFdLnR5cGVkX3ZhbF9pbnQudmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5MzoKLSNsaW5lIDc3OSAiYy1leHAueSIKLXsgeXl2YWwudm9pZHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk0OgotI2xpbmUgNzgxICJjLWV4cC55IgoteyBmcmVlICgoUFRSKXl5dnNwWy0xXS50dmVjKTsgeXl2YWwudm9pZHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk2OgotI2xpbmUgNzk0ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX21lbWJlcl90eXBlIChidWlsdGluX3R5cGVfaW50LCB5eXZzcFstMl0udHZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk3OgotI2xpbmUgNzk5ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0geXl2c3BbMF0udHN5bS50eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA5ODoKLSNsaW5lIDgwMSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9pbnQ7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk5OgotI2xpbmUgODAzICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2xvbmc7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwMDoKLSNsaW5lIDgwNSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9zaG9ydDsgOwotICAgIGJyZWFrO30KLWNhc2UgMTAxOgotI2xpbmUgODA3ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2xvbmc7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwMjoKLSNsaW5lIDgwOSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDM6Ci0jbGluZSA4MTEgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfbG9uZ19sb25nOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDQ6Ci0jbGluZSA4MTMgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfbG9uZ19sb25nOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDU6Ci0jbGluZSA4MTUgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZ19sb25nOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDY6Ci0jbGluZSA4MTcgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfbG9uZ19sb25nOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDc6Ci0jbGluZSA4MTkgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfc2hvcnQ7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwODoKLSNsaW5lIDgyMSAiYy1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9zaG9ydDsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA5OgotI2xpbmUgODIzICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2RvdWJsZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTEwOgotI2xpbmUgODI1ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2xvbmdfZG91YmxlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTE6Ci0jbGluZSA4MjcgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfc3RydWN0IChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLAotCQkJCQkgICAgICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2spOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTI6Ci0jbGluZSA4MzAgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfc3RydWN0IChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLAotCQkJCQkgICAgICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2spOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTM6Ci0jbGluZSA4MzMgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfdW5pb24gKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksCi0JCQkJCSAgICAgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE0OgotI2xpbmUgODM2ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX2VudW0gKGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCksCi0JCQkJCSAgICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2spOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTU6Ci0jbGluZSA4MzkgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfdW5zaWduZWRfdHlwZW5hbWUgKFRZUEVfTkFNRSh5eXZzcFswXS50c3ltLnR5cGUpKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE2OgotI2xpbmUgODQxICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2ludDsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE3OgotI2xpbmUgODQzICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0gbG9va3VwX3NpZ25lZF90eXBlbmFtZSAoVFlQRV9OQU1FKHl5dnNwWzBdLnRzeW0udHlwZSkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTg6Ci0jbGluZSA4NDUgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfaW50OyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTk6Ci0jbGluZSA4NTAgImMtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBsb29rdXBfdGVtcGxhdGVfdHlwZShjb3B5X25hbWUoeXl2c3BbLTNdLnN2YWwpLCB5eXZzcFstMV0udHZhbCwKLQkJCQkJCSAgICBleHByZXNzaW9uX2NvbnRleHRfYmxvY2spOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgMTIwOgotI2xpbmUgODU2ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0geXl2c3BbMF0udHZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgMTIxOgotI2xpbmUgODU3ICJjLWV4cC55IgoteyB5eXZhbC50dmFsID0geXl2c3BbMF0udHZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgMTIzOgotI2xpbmUgODYyICJjLWV4cC55IgotewotCQkgIHl5dmFsLnRzeW0uc3Rva2VuLnB0ciA9ICJpbnQiOwotCQkgIHl5dmFsLnRzeW0uc3Rva2VuLmxlbmd0aCA9IDM7Ci0JCSAgeXl2YWwudHN5bS50eXBlID0gYnVpbHRpbl90eXBlX2ludDsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgMTI0OgotI2xpbmUgODY4ICJjLWV4cC55IgotewotCQkgIHl5dmFsLnRzeW0uc3Rva2VuLnB0ciA9ICJsb25nIjsKLQkJICB5eXZhbC50c3ltLnN0b2tlbi5sZW5ndGggPSA0OwotCQkgIHl5dmFsLnRzeW0udHlwZSA9IGJ1aWx0aW5fdHlwZV9sb25nOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjU6Ci0jbGluZSA4NzQgImMtZXhwLnkiCi17Ci0JCSAgeXl2YWwudHN5bS5zdG9rZW4ucHRyID0gInNob3J0IjsKLQkJICB5eXZhbC50c3ltLnN0b2tlbi5sZW5ndGggPSA1OwotCQkgIHl5dmFsLnRzeW0udHlwZSA9IGJ1aWx0aW5fdHlwZV9zaG9ydDsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgMTI2OgotI2xpbmUgODgzICJjLWV4cC55IgoteyB5eXZhbC50dmVjID0gKHN0cnVjdCB0eXBlICoqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCB0eXBlICopICogMik7Ci0JCSAgeXl2YWwuaXZlY1swXSA9IDE7CS8qIE51bWJlciBvZiB0eXBlcyBpbiB2ZWN0b3IgKi8KLQkJICB5eXZhbC50dmVjWzFdID0geXl2c3BbMF0udHZhbDsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgMTI3OgotI2xpbmUgODg4ICJjLWV4cC55IgoteyBpbnQgbGVuID0gc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSAqICgrKyh5eXZzcFstMl0uaXZlY1swXSkgKyAxKTsKLQkJICB5eXZhbC50dmVjID0gKHN0cnVjdCB0eXBlICoqKSB4cmVhbGxvYyAoKGNoYXIgKikgeXl2c3BbLTJdLnR2ZWMsIGxlbik7Ci0JCSAgeXl2YWwudHZlY1t5eXZhbC5pdmVjWzBdXSA9IHl5dnNwWzBdLnR2YWw7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDEyODoKLSNsaW5lIDg5NCAiYy1leHAueSIKLXsgeXl2YWwuc3ZhbCA9IHl5dnNwWzBdLnNzeW0uc3Rva2VuOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjk6Ci0jbGluZSA4OTUgImMtZXhwLnkiCi17IHl5dmFsLnN2YWwgPSB5eXZzcFswXS5zc3ltLnN0b2tlbjsgOwotICAgIGJyZWFrO30KLWNhc2UgMTMwOgotI2xpbmUgODk2ICJjLWV4cC55IgoteyB5eXZhbC5zdmFsID0geXl2c3BbMF0udHN5bS5zdG9rZW47IDsKLSAgICBicmVhazt9Ci1jYXNlIDEzMToKLSNsaW5lIDg5NyAiYy1leHAueSIKLXsgeXl2YWwuc3ZhbCA9IHl5dnNwWzBdLnNzeW0uc3Rva2VuOyA7Ci0gICAgYnJlYWs7fQotfQotICAgLyogdGhlIGFjdGlvbiBmaWxlIGdldHMgY29waWVkIGluIGluIHBsYWNlIG9mIHRoaXMgZG9sbGFyc2lnbiAqLwotI2xpbmUgNDk4ICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotDAotICB5eXZzcCAtPSB5eWxlbjsKLSAgeXlzc3AgLT0geXlsZW47Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwIC09IHl5bGVuOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnNzcDEgPSB5eXNzIC0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInN0YXRlIHN0YWNrIG5vdyIpOwotICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCi0JZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi0gICorK3l5dnNwID0geXl2YWw7Ci0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3ArKzsKLSAgaWYgKHl5bGVuID09IDApCi0gICAgewotICAgICAgeXlsc3AtPmZpcnN0X2xpbmUgPSB5eWxsb2MuZmlyc3RfbGluZTsKLSAgICAgIHl5bHNwLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MuZmlyc3RfY29sdW1uOwotICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcC0xKS0+bGFzdF9saW5lOwotICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwLTEpLT5sYXN0X2NvbHVtbjsKLSAgICAgIHl5bHNwLT50ZXh0ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2xpbmU7Ci0gICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfY29sdW1uOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIE5vdyAic2hpZnQiIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4KLSAgICAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUgdGhhdCBnb2VzIHRvLAotICAgICBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8KLSAgICAgYW5kIHRoZSBydWxlIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KLQotICB5eW4gPSB5eXIxW3l5bl07Ci0KLSAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVEJBU0VdICsgKnl5c3NwOwotICBpZiAoeXlzdGF0ZSA+PSAwICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQotICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOwotICBlbHNlCi0gICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UQkFTRV07Ci0KLSAgZ290byB5eW5ld3N0YXRlOwotCi15eWVycmxhYjogICAvKiBoZXJlIG9uIGRldGVjdGluZyBlcnJvciAqLwotCi0gIGlmICghIHl5ZXJyc3RhdHVzKQotICAgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLwotICAgIHsKLSAgICAgICsreXluZXJyczsKLQotI2lmZGVmIFlZRVJST1JfVkVSQk9TRQotICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotCi0gICAgICBpZiAoeXluID4gWVlGTEFHICYmIHl5biA8IFlZTEFTVCkKLQl7Ci0JICBpbnQgc2l6ZSA9IDA7Ci0JICBjaGFyICptc2c7Ci0JICBpbnQgeCwgY291bnQ7Ci0KLQkgIGNvdW50ID0gMDsKLQkgIC8qIFN0YXJ0IFggYXQgLXl5biBpZiBuZWMgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbiB5eWNoZWNrLiAgKi8KLQkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOwotCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQotCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQotCSAgICAgIHNpemUgKz0gc3RybGVuKHl5dG5hbWVbeF0pICsgMTUsIGNvdW50Kys7Ci0JICBtc2cgPSAoY2hhciAqKSB4bWFsbG9jKHNpemUgKyAxNSk7Ci0JICBpZiAobXNnICE9IDApCi0JICAgIHsKLQkgICAgICBzdHJjcHkobXNnLCAicGFyc2UgZXJyb3IiKTsKLQotCSAgICAgIGlmIChjb3VudCA8IDUpCi0JCXsKLQkJICBjb3VudCA9IDA7Ci0JCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7Ci0JCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQotCQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKLQkJICAgICAgewotCQkJc3RyY2F0KG1zZywgY291bnQgPT0gMCA/ICIsIGV4cGVjdGluZyBgIiA6ICIgb3IgYCIpOwotCQkJc3RyY2F0KG1zZywgeXl0bmFtZVt4XSk7Ci0JCQlzdHJjYXQobXNnLCAiJyIpOwotCQkJY291bnQrKzsKLQkJICAgICAgfQotCQl9Ci0JICAgICAgeXllcnJvcihtc2cpOwotCSAgICAgIGZyZWUobXNnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhjZWVkZWQiKTsKLQl9Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCi0JeXllcnJvcigicGFyc2UgZXJyb3IiKTsKLSAgICB9Ci0KLSAgZ290byB5eWVycmxhYjE7Ci15eWVycmxhYjE6ICAgLyogaGVyZSBvbiBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24gKi8KLQotICBpZiAoeXllcnJzdGF0dXMgPT0gMykKLSAgICB7Ci0gICAgICAvKiBpZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KLQotICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCi0gICAgICBpZiAoeXljaGFyID09IFlZRU9GKQotCVlZQUJPUlQ7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLSNlbmRpZgotCi0gICAgICB5eWNoYXIgPSBZWUVNUFRZOwotICAgIH0KLQotICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbgotICAgICBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IgdG9rZW4uICAqLwotCi0gIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLwotCi0gIGdvdG8geXllcnJoYW5kbGU7Ci0KLXl5ZXJyZGVmYXVsdDogIC8qIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIGVycm9yIHRva2VuLiAqLwotCi0jaWYgMAotICAvKiBUaGlzIGlzIHdyb25nOyBvbmx5IHN0YXRlcyB0aGF0IGV4cGxpY2l0bHkgd2FudCBlcnJvciB0b2tlbnMKLSAgICAgc2hvdWxkIHNoaWZ0IHRoZW0uICAqLwotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsgIC8qIElmIGl0cyBkZWZhdWx0IGlzIHRvIGFjY2VwdCBhbnkgdG9rZW4sIG9rLiAgT3RoZXJ3aXNlIHBvcCBpdC4qLwotICBpZiAoeXluKSBnb3RvIHl5ZGVmYXVsdDsKLSNlbmRpZgotCi15eWVycnBvcDogICAvKiBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbiAqLwotCi0gIGlmICh5eXNzcCA9PSB5eXNzKSBZWUFCT1JUOwotICB5eXZzcC0tOwotICB5eXN0YXRlID0gKi0teXlzc3A7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwLS07Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6IHN0YXRlIHN0YWNrIG5vdyIpOwotICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCi0JZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi15eWVycmhhbmRsZToKLQotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlGTEFHKQotICAgIGdvdG8geXllcnJkZWZhdWx0OwotCi0gIHl5biArPSBZWVRFUlJPUjsKLSAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSBZWVRFUlJPUikKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0gIGlmICh5eW4gPCAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQotCWdvdG8geXllcnJwb3A7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJwb3A7Ci0KLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpOwotI2VuZGlmCi0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgZ290byB5eW5ld3N0YXRlOwotfQotI2xpbmUgOTExICJjLWV4cC55IgotCi0KLS8qIFRha2UgY2FyZSBvZiBwYXJzaW5nIGEgbnVtYmVyIChhbnl0aGluZyB0aGF0IHN0YXJ0cyB3aXRoIGEgZGlnaXQpLgotICAgU2V0IHl5bHZhbCBhbmQgcmV0dXJuIHRoZSB0b2tlbiB0eXBlOyB1cGRhdGUgbGV4cHRyLgotICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBpdC4gICovCi0KLS8qKiogTmVlZHMgc29tZSBlcnJvciBjaGVja2luZyBmb3IgdGhlIGZsb2F0IGNhc2UgKioqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9udW1iZXIgKHAsIGxlbiwgcGFyc2VkX2Zsb2F0LCBwdXRpdGhlcmUpCi0gICAgIHJlZ2lzdGVyIGNoYXIgKnA7Ci0gICAgIHJlZ2lzdGVyIGludCBsZW47Ci0gICAgIGludCBwYXJzZWRfZmxvYXQ7Ci0gICAgIFlZU1RZUEUgKnB1dGl0aGVyZTsKLXsKLSAgLyogRklYTUU6IFNob3VsZG4ndCB0aGVzZSBiZSB1bnNpZ25lZD8gIFdlIGRvbid0IGRlYWwgd2l0aCBuZWdhdGl2ZSB2YWx1ZXMKLSAgICAgaGVyZSwgYW5kIHdlIGRvIGtpbmQgb2Ygc2lsbHkgdGhpbmdzIGxpa2UgY2FzdCB0byB1bnNpZ25lZC4gICovCi0gIHJlZ2lzdGVyIExPTkdFU1QgbiA9IDA7Ci0gIHJlZ2lzdGVyIExPTkdFU1QgcHJldm4gPSAwOwotICBVTE9OR0VTVCB1bjsKLQotICByZWdpc3RlciBpbnQgaSA9IDA7Ci0gIHJlZ2lzdGVyIGludCBjOwotICByZWdpc3RlciBpbnQgYmFzZSA9IGlucHV0X3JhZGl4OwotICBpbnQgdW5zaWduZWRfcCA9IDA7Ci0KLSAgLyogTnVtYmVyIG9mICJMIiBzdWZmaXhlcyBlbmNvdW50ZXJlZC4gICovCi0gIGludCBsb25nX3AgPSAwOwotCi0gIC8qIFdlIGhhdmUgZm91bmQgYSAiTCIgb3IgIlUiIHN1ZmZpeC4gICovCi0gIGludCBmb3VuZF9zdWZmaXggPSAwOwotCi0gIFVMT05HRVNUIGhpZ2hfYml0OwotICBzdHJ1Y3QgdHlwZSAqc2lnbmVkX3R5cGU7Ci0gIHN0cnVjdCB0eXBlICp1bnNpZ25lZF90eXBlOwotCi0gIGlmIChwYXJzZWRfZmxvYXQpCi0gICAgewotICAgICAgLyogSXQncyBhIGZsb2F0IHNpbmNlIGl0IGNvbnRhaW5zIGEgcG9pbnQgb3IgYW4gZXhwb25lbnQuICAqLwotICAgICAgY2hhciBjOwotICAgICAgaW50IG51bSA9IDA7CS8qIG51bWJlciBvZiB0b2tlbnMgc2Nhbm5lZCBieSBzY2FuZiAqLwotICAgICAgY2hhciBzYXZlZF9jaGFyID0gcFtsZW5dOwotCi0gICAgICBwW2xlbl0gPSAwOwkvKiBudWxsLXRlcm1pbmF0ZSB0aGUgdG9rZW4gKi8KLSAgICAgIGlmIChzaXplb2YgKHB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwpIDw9IHNpemVvZiAoZmxvYXQpKQotCW51bSA9IHNzY2FuZiAocCwgIiVnJWMiLCAoZmxvYXQgKikgJnB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwsJmMpOwotICAgICAgZWxzZSBpZiAoc2l6ZW9mIChwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsKSA8PSBzaXplb2YgKGRvdWJsZSkpCi0JbnVtID0gc3NjYW5mIChwLCAiJWxnJWMiLCAoZG91YmxlICopICZwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsLCZjKTsKLSAgICAgIGVsc2UKLQl7Ci0jaWZkZWYgU0NBTkZfSEFTX0xPTkdfRE9VQkxFCi0JICBudW0gPSBzc2NhbmYgKHAsICIlTGclYyIsICZwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsLCZjKTsKLSNlbHNlCi0JICAvKiBTY2FuIGl0IGludG8gYSBkb3VibGUsIHRoZW4gYXNzaWduIGl0IHRvIHRoZSBsb25nIGRvdWJsZS4KLQkgICAgIFRoaXMgYXQgbGVhc3Qgd2lucyB3aXRoIHZhbHVlcyByZXByZXNlbnRhYmxlIGluIHRoZSByYW5nZQotCSAgICAgb2YgZG91Ymxlcy4gKi8KLQkgIGRvdWJsZSB0ZW1wOwotCSAgbnVtID0gc3NjYW5mIChwLCAiJWxnJWMiLCAmdGVtcCwmYyk7Ci0JICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC5kdmFsID0gdGVtcDsKLSNlbmRpZgotCX0KLSAgICAgIHBbbGVuXSA9IHNhdmVkX2NoYXI7CS8qIHJlc3RvcmUgdGhlIGlucHV0IHN0cmVhbSAqLwotICAgICAgaWYgKG51bSAhPSAxKSAJCS8qIGNoZWNrIHNjYW5mIGZvdW5kIE9OTFkgYSBmbG9hdCAuLi4gKi8KLQlyZXR1cm4gRVJST1I7Ci0gICAgICAvKiBTZWUgaWYgaXQgaGFzIGBmJyBvciBgbCcgc3VmZml4IChmbG9hdCBvciBsb25nIGRvdWJsZSkuICAqLwotCi0gICAgICBjID0gdG9sb3dlciAocFtsZW4gLSAxXSk7Ci0KLSAgICAgIGlmIChjID09ICdmJykKLQlwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC50eXBlID0gYnVpbHRpbl90eXBlX2Zsb2F0OwotICAgICAgZWxzZSBpZiAoYyA9PSAnbCcpCi0JcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQudHlwZSA9IGJ1aWx0aW5fdHlwZV9sb25nX2RvdWJsZTsKLSAgICAgIGVsc2UgaWYgKGlzZGlnaXQgKGMpIHx8IGMgPT0gJy4nKQotCXB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LnR5cGUgPSBidWlsdGluX3R5cGVfZG91YmxlOwotICAgICAgZWxzZQotCXJldHVybiBFUlJPUjsKLQotICAgICAgcmV0dXJuIEZMT0FUOwotICAgIH0KLQotICAvKiBIYW5kbGUgYmFzZS1zd2l0Y2hpbmcgcHJlZml4ZXMgMHgsIDB0LCAwZCwgMCAqLwotICBpZiAocFswXSA9PSAnMCcpCi0gICAgc3dpdGNoIChwWzFdKQotICAgICAgewotICAgICAgY2FzZSAneCc6Ci0gICAgICBjYXNlICdYJzoKLQlpZiAobGVuID49IDMpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgYmFzZSA9IDE2OwotCSAgICBsZW4gLT0gMjsKLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSAndCc6Ci0gICAgICBjYXNlICdUJzoKLSAgICAgIGNhc2UgJ2QnOgotICAgICAgY2FzZSAnRCc6Ci0JaWYgKGxlbiA+PSAzKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGJhc2UgPSAxMDsKLQkgICAgbGVuIC09IDI7Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYmFzZSA9IDg7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgd2hpbGUgKGxlbi0tID4gMCkKLSAgICB7Ci0gICAgICBjID0gKnArKzsKLSAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKLQljICs9ICdhJyAtICdBJzsKLSAgICAgIGlmIChjICE9ICdsJyAmJiBjICE9ICd1JykKLQluICo9IGJhc2U7Ci0gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JewotCSAgaWYgKGZvdW5kX3N1ZmZpeCkKLQkgICAgcmV0dXJuIEVSUk9SOwotCSAgbiArPSBpID0gYyAtICcwJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJhc2UgPiAxMCAmJiBjID49ICdhJyAmJiBjIDw9ICdmJykKLQkgICAgewotCSAgICAgIGlmIChmb3VuZF9zdWZmaXgpCi0JCXJldHVybiBFUlJPUjsKLQkgICAgICBuICs9IGkgPSBjIC0gJ2EnICsgMTA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGMgPT0gJ2wnKQotCSAgICB7Ci0JICAgICAgKytsb25nX3A7Ci0JICAgICAgZm91bmRfc3VmZml4ID0gMTsKLQkgICAgfQotCSAgZWxzZSBpZiAoYyA9PSAndScpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZF9wID0gMTsKLQkgICAgICBmb3VuZF9zdWZmaXggPSAxOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHJldHVybiBFUlJPUjsJLyogQ2hhciBub3QgYSBkaWdpdCAqLwotCX0KLSAgICAgIGlmIChpID49IGJhc2UpCi0JcmV0dXJuIEVSUk9SOwkJLyogSW52YWxpZCBkaWdpdCBpbiB0aGlzIGJhc2UgKi8KLQotICAgICAgLyogUG9ydGFibHkgdGVzdCBmb3Igb3ZlcmZsb3cgKG9ubHkgd29ya3MgZm9yIG5vbnplcm8gdmFsdWVzLCBzbyBtYWtlCi0JIGEgc2Vjb25kIGNoZWNrIGZvciB6ZXJvKS4gIEZJWE1FOiBDYW4ndCB3ZSBqdXN0IG1ha2UgbiBhbmQgcHJldm4KLQkgdW5zaWduZWQgYW5kIGF2b2lkIHRoaXM/ICAqLwotICAgICAgaWYgKGMgIT0gJ2wnICYmIGMgIT0gJ3UnICYmIChwcmV2biA+PSBuKSAmJiBuICE9IDApCi0JdW5zaWduZWRfcCA9IDE7CQkvKiBUcnkgc29tZXRoaW5nIHVuc2lnbmVkICovCi0KLSAgICAgIC8qIFBvcnRhYmx5IHRlc3QgZm9yIHVuc2lnbmVkIG92ZXJmbG93LgotCSBGSVhNRTogVGhpcyBjaGVjayBpcyB3cm9uZzsgZm9yIGV4YW1wbGUgaXQgZG9lc24ndCBmaW5kIG92ZXJmbG93Ci0JIG9uIDB4MTIzNDU2Nzg5IHdoZW4gTE9OR0VTVCBpcyAzMiBiaXRzLiAgKi8KLSAgICAgIGlmIChjICE9ICdsJyAmJiBjICE9ICd1JyAmJiBuICE9IDApCi0JewkKLQkgIGlmICgodW5zaWduZWRfcCAmJiAoVUxPTkdFU1QpIHByZXZuID49IChVTE9OR0VTVCkgbikpCi0JICAgIGVycm9yICgiTnVtZXJpYyBjb25zdGFudCB0b28gbGFyZ2UuIik7Ci0JfQotICAgICAgcHJldm4gPSBuOwotICAgIH0KLQotICAvKiBBbiBpbnRlZ2VyIGNvbnN0YW50IGlzIGFuIGludCwgYSBsb25nLCBvciBhIGxvbmcgbG9uZy4gIEFuIEwKLSAgICAgc3VmZml4IGZvcmNlcyBpdCB0byBiZSBsb25nOyBhbiBMTCBzdWZmaXggZm9yY2VzIGl0IHRvIGJlIGxvbmcKLSAgICAgbG9uZy4gIElmIG5vdCBmb3JjZWQgdG8gYSBsYXJnZXIgc2l6ZSwgaXQgZ2V0cyB0aGUgZmlyc3QgdHlwZSBvZgotICAgICB0aGUgYWJvdmUgdGhhdCBpdCBmaXRzIGluLiAgVG8gZmlndXJlIG91dCB3aGV0aGVyIGl0IGZpdHMsIHdlCi0gICAgIHNoaWZ0IGl0IHJpZ2h0IGFuZCBzZWUgd2hldGhlciBhbnl0aGluZyByZW1haW5zLiAgTm90ZSB0aGF0IHdlCi0gICAgIGNhbid0IHNoaWZ0IHNpemVvZiAoTE9OR0VTVCkgKiBIT1NUX0NIQVJfQklUIGJpdHMgb3IgbW9yZSBpbiBvbmUKLSAgICAgb3BlcmF0aW9uLCBiZWNhdXNlIG1hbnkgY29tcGlsZXJzIHdpbGwgd2FybiBhYm91dCBzdWNoIGEgc2hpZnQKLSAgICAgKHdoaWNoIGFsd2F5cyBwcm9kdWNlcyBhIHplcm8gcmVzdWx0KS4gIFNvbWV0aW1lcyBUQVJHRVRfSU5UX0JJVAotICAgICBvciBUQVJHRVRfTE9OR19CSVQgd2lsbCBiZSB0aGF0IGJpZywgc29tZXRpbWVzIG5vdC4gIFRvIGRlYWwgd2l0aAotICAgICB0aGUgY2FzZSB3aGVyZSBpdCBpcyB3ZSBqdXN0IGFsd2F5cyBzaGlmdCB0aGUgdmFsdWUgbW9yZSB0aGFuCi0gICAgIG9uY2UsIHdpdGggZmV3ZXIgYml0cyBlYWNoIHRpbWUuICAqLwotCi0gIHVuID0gKFVMT05HRVNUKW4gPj4gMjsKLSAgaWYgKGxvbmdfcCA9PSAwCi0gICAgICAmJiAodW4gPj4gKFRBUkdFVF9JTlRfQklUIC0gMikpID09IDApCi0gICAgewotICAgICAgaGlnaF9iaXQgPSAoKFVMT05HRVNUKTEpIDw8IChUQVJHRVRfSU5UX0JJVC0xKTsKLQotICAgICAgLyogQSBsYXJnZSBkZWNpbWFsIChub3QgaGV4IG9yIG9jdGFsKSBjb25zdGFudCAoYmV0d2VlbiBJTlRfTUFYCi0JIGFuZCBVSU5UX01BWCkgaXMgYSBsb25nIG9yIHVuc2lnbmVkIGxvbmcsIGFjY29yZGluZyB0byBBTlNJLAotCSBuZXZlciBhbiB1bnNpZ25lZCBpbnQsIGJ1dCB0aGlzIGNvZGUgdHJlYXRzIGl0IGFzIHVuc2lnbmVkCi0JIGludC4gIFRoaXMgcHJvYmFibHkgc2hvdWxkIGJlIGZpeGVkLiAgR0NDIGdpdmVzIGEgd2FybmluZyBvbgotCSBzdWNoIGNvbnN0YW50cy4gICovCi0KLSAgICAgIHVuc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfdW5zaWduZWRfaW50OwotICAgICAgc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfaW50OwotICAgIH0KLSAgZWxzZSBpZiAobG9uZ19wIDw9IDEKLQkgICAmJiAodW4gPj4gKFRBUkdFVF9MT05HX0JJVCAtIDIpKSA9PSAwKQotICAgIHsKLSAgICAgIGhpZ2hfYml0ID0gKChVTE9OR0VTVCkxKSA8PCAoVEFSR0VUX0xPTkdfQklULTEpOwotICAgICAgdW5zaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nOwotICAgICAgc2lnbmVkX3R5cGUgPSBidWlsdGluX3R5cGVfbG9uZzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbnQgc2hpZnQ7Ci0gICAgICBpZiAoc2l6ZW9mIChVTE9OR0VTVCkgKiBIT1NUX0NIQVJfQklUIDwgVEFSR0VUX0xPTkdfTE9OR19CSVQpCi0JLyogQSBsb25nIGxvbmcgZG9lcyBub3QgZml0IGluIGEgTE9OR0VTVC4gICovCi0Jc2hpZnQgPSAoc2l6ZW9mIChVTE9OR0VTVCkgKiBIT1NUX0NIQVJfQklUIC0gMSk7Ci0gICAgICBlbHNlCi0Jc2hpZnQgPSAoVEFSR0VUX0xPTkdfTE9OR19CSVQgLSAxKTsKLSAgICAgIGhpZ2hfYml0ID0gKFVMT05HRVNUKSAxIDw8IHNoaWZ0OwotICAgICAgdW5zaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9sb25nX2xvbmc7Ci0gICAgICBzaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV9sb25nX2xvbmc7Ci0gICAgfQotCi0gICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9pbnQudmFsID0gbjsKLQotICAgLyogSWYgdGhlIGhpZ2ggYml0IG9mIHRoZSB3b3JrZWQgb3V0IHR5cGUgaXMgc2V0IHRoZW4gdGhpcyBudW1iZXIKLSAgICAgIGhhcyB0byBiZSB1bnNpZ25lZC4gKi8KLQotICAgaWYgKHVuc2lnbmVkX3AgfHwgKG4gJiBoaWdoX2JpdCkpIAotICAgICB7Ci0gICAgICAgcHV0aXRoZXJlLT50eXBlZF92YWxfaW50LnR5cGUgPSB1bnNpZ25lZF90eXBlOwotICAgICB9Ci0gICBlbHNlIAotICAgICB7Ci0gICAgICAgcHV0aXRoZXJlLT50eXBlZF92YWxfaW50LnR5cGUgPSBzaWduZWRfdHlwZTsKLSAgICAgfQotCi0gICByZXR1cm4gSU5UOwotfQotCi1zdHJ1Y3QgdG9rZW4KLXsKLSAgY2hhciAqb3BlcmF0b3I7Ci0gIGludCB0b2tlbjsKLSAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gdG9rZW50YWIzW10gPQotICB7Ci0gICAgeyI+Pj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9SU0h9LAotICAgIHsiPDw9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfTFNIfQotICB9OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRva2VuIHRva2VudGFiMltdID0KLSAgewotICAgIHsiKz0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9BRER9LAotICAgIHsiLT0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9TVUJ9LAotICAgIHsiKj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9NVUx9LAotICAgIHsiLz0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9ESVZ9LAotICAgIHsiJT0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9SRU19LAotICAgIHsifD0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9CSVRXSVNFX0lPUn0sCi0gICAgeyImPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0JJVFdJU0VfQU5EfSwKLSAgICB7Il49IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQklUV0lTRV9YT1J9LAotICAgIHsiKysiLCBJTkNSRU1FTlQsIEJJTk9QX0VORH0sCi0gICAgeyItLSIsIERFQ1JFTUVOVCwgQklOT1BfRU5EfSwKLSAgICB7Ii0+IiwgQVJST1csIEJJTk9QX0VORH0sCi0gICAgeyImJiIsIEFOREFORCwgQklOT1BfRU5EfSwKLSAgICB7Inx8IiwgT1JPUiwgQklOT1BfRU5EfSwKLSAgICB7Ijo6IiwgQ09MT05DT0xPTiwgQklOT1BfRU5EfSwKLSAgICB7Ijw8IiwgTFNILCBCSU5PUF9FTkR9LAotICAgIHsiPj4iLCBSU0gsIEJJTk9QX0VORH0sCi0gICAgeyI9PSIsIEVRVUFMLCBCSU5PUF9FTkR9LAotICAgIHsiIT0iLCBOT1RFUVVBTCwgQklOT1BfRU5EfSwKLSAgICB7Ijw9IiwgTEVRLCBCSU5PUF9FTkR9LAotICAgIHsiPj0iLCBHRVEsIEJJTk9QX0VORH0KLSAgfTsKLQotLyogUmVhZCBvbmUgdG9rZW4sIGdldHRpbmcgY2hhcmFjdGVycyB0aHJvdWdoIGxleHB0ci4gICovCi0KLXN0YXRpYyBpbnQKLXl5bGV4ICgpCi17Ci0gIGludCBjOwotICBpbnQgbmFtZWxlbjsKLSAgdW5zaWduZWQgaW50IGk7Ci0gIGNoYXIgKnRva3N0YXJ0OwotICBjaGFyICp0b2twdHI7Ci0gIGludCB0ZW1wYnVmaW5kZXg7Ci0gIHN0YXRpYyBjaGFyICp0ZW1wYnVmOwotICBzdGF0aWMgaW50IHRlbXBidWZzaXplOwotICBzdHJ1Y3Qgc3ltYm9sICogc3ltX2NsYXNzID0gTlVMTDsKLSAgY2hhciAqIHRva2VuX3N0cmluZyA9IE5VTEw7Ci0gIGludCBjbGFzc19wcmVmaXggPSAwOwotICBpbnQgdW5xdW90ZWRfZXhwcjsKLSAgIAotIHJldHJ5OgotCi0gIHVucXVvdGVkX2V4cHIgPSAxOwotCi0gIHRva3N0YXJ0ID0gbGV4cHRyOwotICAvKiBTZWUgaWYgaXQgaXMgYSBzcGVjaWFsIHRva2VuIG9mIGxlbmd0aCAzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiB0b2tlbnRhYjMgLyBzaXplb2YgdG9rZW50YWIzWzBdOyBpKyspCi0gICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsIHRva2VudGFiM1tpXS5vcGVyYXRvciwgMykpCi0gICAgICB7Ci0JbGV4cHRyICs9IDM7Ci0JeXlsdmFsLm9wY29kZSA9IHRva2VudGFiM1tpXS5vcGNvZGU7Ci0JcmV0dXJuIHRva2VudGFiM1tpXS50b2tlbjsKLSAgICAgIH0KLQotICAvKiBTZWUgaWYgaXQgaXMgYSBzcGVjaWFsIHRva2VuIG9mIGxlbmd0aCAyLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiB0b2tlbnRhYjIgLyBzaXplb2YgdG9rZW50YWIyWzBdOyBpKyspCi0gICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsIHRva2VudGFiMltpXS5vcGVyYXRvciwgMikpCi0gICAgICB7Ci0JbGV4cHRyICs9IDI7Ci0JeXlsdmFsLm9wY29kZSA9IHRva2VudGFiMltpXS5vcGNvZGU7Ci0JcmV0dXJuIHRva2VudGFiMltpXS50b2tlbjsKLSAgICAgIH0KLQotICBzd2l0Y2ggKGMgPSAqdG9rc3RhcnQpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAnICc6Ci0gICAgY2FzZSAnXHQnOgotICAgIGNhc2UgJ1xuJzoKLSAgICAgIGxleHB0cisrOwotICAgICAgZ290byByZXRyeTsKLQotICAgIGNhc2UgJ1wnJzoKLSAgICAgIC8qIFdlIGVpdGhlciBoYXZlIGEgY2hhcmFjdGVyIGNvbnN0YW50ICgnMCcgb3IgJ1wxNzcnIGZvciBleGFtcGxlKQotCSBvciB3ZSBoYXZlIGEgcXVvdGVkIHN5bWJvbCByZWZlcmVuY2UgKCdmb28oaW50LGludCknIGluIEMrKwotCSBmb3IgZXhhbXBsZSkuICovCi0gICAgICBsZXhwdHIrKzsKLSAgICAgIGMgPSAqbGV4cHRyKys7Ci0gICAgICBpZiAoYyA9PSAnXFwnKQotCWMgPSBwYXJzZV9lc2NhcGUgKCZsZXhwdHIpOwotICAgICAgZWxzZSBpZiAoYyA9PSAnXCcnKQotCWVycm9yICgiRW1wdHkgY2hhcmFjdGVyIGNvbnN0YW50LiIpOwotCi0gICAgICB5eWx2YWwudHlwZWRfdmFsX2ludC52YWwgPSBjOwotICAgICAgeXlsdmFsLnR5cGVkX3ZhbF9pbnQudHlwZSA9IGJ1aWx0aW5fdHlwZV9jaGFyOwotCi0gICAgICBjID0gKmxleHB0cisrOwotICAgICAgaWYgKGMgIT0gJ1wnJykKLQl7Ci0JICBuYW1lbGVuID0gc2tpcF9xdW90ZWQgKHRva3N0YXJ0KSAtIHRva3N0YXJ0OwotCSAgaWYgKG5hbWVsZW4gPiAyKQotCSAgICB7Ci0JICAgICAgbGV4cHRyID0gdG9rc3RhcnQgKyBuYW1lbGVuOwotICAgICAgICAgICAgICB1bnF1b3RlZF9leHByID0gMDsKLQkgICAgICBpZiAobGV4cHRyWy0xXSAhPSAnXCcnKQotCQllcnJvciAoIlVubWF0Y2hlZCBzaW5nbGUgcXVvdGUuIik7Ci0JICAgICAgbmFtZWxlbiAtPSAyOwotCSAgICAgIHRva3N0YXJ0Kys7Ci0JICAgICAgZ290byB0cnluYW1lOwotCSAgICB9Ci0JICBlcnJvciAoIkludmFsaWQgY2hhcmFjdGVyIGNvbnN0YW50LiIpOwotCX0KLSAgICAgIHJldHVybiBJTlQ7Ci0KLSAgICBjYXNlICcoJzoKLSAgICAgIHBhcmVuX2RlcHRoKys7Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnKSc6Ci0gICAgICBpZiAocGFyZW5fZGVwdGggPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIHBhcmVuX2RlcHRoLS07Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnLCc6Ci0gICAgICBpZiAoY29tbWFfdGVybWluYXRlcyAmJiBwYXJlbl9kZXB0aCA9PSAwKQotCXJldHVybiAwOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJy4nOgotICAgICAgLyogTWlnaHQgYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICAqLwotICAgICAgaWYgKGxleHB0clsxXSA8ICcwJyB8fCBsZXhwdHJbMV0gPiAnOScpCi0JZ290byBzeW1ib2w7CQkvKiBOb3BlLCBtdXN0IGJlIGEgc3ltYm9sLiAqLwotICAgICAgLyogRkFMTCBUSFJVIGludG8gbnVtYmVyIGNhc2UuICAqLwotCi0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICB7Ci0JLyogSXQncyBhIG51bWJlci4gICovCi0JaW50IGdvdF9kb3QgPSAwLCBnb3RfZSA9IDAsIHRva3R5cGU7Ci0JcmVnaXN0ZXIgY2hhciAqcCA9IHRva3N0YXJ0OwotCWludCBoZXggPSBpbnB1dF9yYWRpeCA+IDEwOwotCi0JaWYgKGMgPT0gJzAnICYmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJykpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgaGV4ID0gMTsKLQkgIH0KLQllbHNlIGlmIChjID09ICcwJyAmJiAocFsxXT09J3QnIHx8IHBbMV09PSdUJyB8fCBwWzFdPT0nZCcgfHwgcFsxXT09J0QnKSkKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBoZXggPSAwOwotCSAgfQotCi0JZm9yICg7OyArK3ApCi0JICB7Ci0JICAgIC8qIFRoaXMgdGVzdCBpbmNsdWRlcyAhaGV4IGJlY2F1c2UgJ2UnIGlzIGEgdmFsaWQgaGV4IGRpZ2l0Ci0JICAgICAgIGFuZCB0aHVzIGRvZXMgbm90IGluZGljYXRlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdoZW4KLQkgICAgICAgdGhlIHJhZGl4IGlzIGhleC4gICovCi0JICAgIGlmICghaGV4ICYmICFnb3RfZSAmJiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykpCi0JICAgICAgZ290X2RvdCA9IGdvdF9lID0gMTsKLQkgICAgLyogVGhpcyB0ZXN0IGRvZXMgbm90IGluY2x1ZGUgIWhleCwgYmVjYXVzZSBhICcuJyBhbHdheXMgaW5kaWNhdGVzCi0JICAgICAgIGEgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVnYXJkbGVzcyBvZiB0aGUgcmFkaXguICAqLwotCSAgICBlbHNlIGlmICghZ290X2RvdCAmJiAqcCA9PSAnLicpCi0JICAgICAgZ290X2RvdCA9IDE7Ci0JICAgIGVsc2UgaWYgKGdvdF9lICYmIChwWy0xXSA9PSAnZScgfHwgcFstMV0gPT0gJ0UnKQotCQkgICAgICYmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSkKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBzaWduIG9mIHRoZSBleHBvbmVudCwgbm90IHRoZSBlbmQgb2YgdGhlCi0JCSBudW1iZXIuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICAvKiBXZSB3aWxsIHRha2UgYW55IGxldHRlcnMgb3IgZGlnaXRzLiAgcGFyc2VfbnVtYmVyIHdpbGwKLQkgICAgICAgY29tcGxhaW4gaWYgcGFzdCB0aGUgcmFkaXgsIG9yIGlmIEwgb3IgVSBhcmUgbm90IGZpbmFsLiAgKi8KLQkgICAgZWxzZSBpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKQotCQkgICAgICYmICgoKnAgPCAnYScgfHwgKnAgPiAneicpCi0JCQkJICAmJiAoKnAgPCAnQScgfHwgKnAgPiAnWicpKSkKLQkgICAgICBicmVhazsKLQkgIH0KLQl0b2t0eXBlID0gcGFyc2VfbnVtYmVyICh0b2tzdGFydCwgcCAtIHRva3N0YXJ0LCBnb3RfZG90fGdvdF9lLCAmeXlsdmFsKTsKLSAgICAgICAgaWYgKHRva3R5cGUgPT0gRVJST1IpCi0JICB7Ci0JICAgIGNoYXIgKmVycl9jb3B5ID0gKGNoYXIgKikgYWxsb2NhIChwIC0gdG9rc3RhcnQgKyAxKTsKLQotCSAgICBtZW1jcHkgKGVycl9jb3B5LCB0b2tzdGFydCwgcCAtIHRva3N0YXJ0KTsKLQkgICAgZXJyX2NvcHlbcCAtIHRva3N0YXJ0XSA9IDA7Ci0JICAgIGVycm9yICgiSW52YWxpZCBudW1iZXIgXCIlc1wiLiIsIGVycl9jb3B5KTsKLQkgIH0KLQlsZXhwdHIgPSBwOwotCXJldHVybiB0b2t0eXBlOwotICAgICAgfQotCi0gICAgY2FzZSAnKyc6Ci0gICAgY2FzZSAnLSc6Ci0gICAgY2FzZSAnKic6Ci0gICAgY2FzZSAnLyc6Ci0gICAgY2FzZSAnJSc6Ci0gICAgY2FzZSAnfCc6Ci0gICAgY2FzZSAnJic6Ci0gICAgY2FzZSAnXic6Ci0gICAgY2FzZSAnfic6Ci0gICAgY2FzZSAnISc6Ci0gICAgY2FzZSAnQCc6Ci0gICAgY2FzZSAnPCc6Ci0gICAgY2FzZSAnPic6Ci0gICAgY2FzZSAnWyc6Ci0gICAgY2FzZSAnXSc6Ci0gICAgY2FzZSAnPyc6Ci0gICAgY2FzZSAnOic6Ci0gICAgY2FzZSAnPSc6Ci0gICAgY2FzZSAneyc6Ci0gICAgY2FzZSAnfSc6Ci0gICAgc3ltYm9sOgotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJyInOgotCi0gICAgICAvKiBCdWlsZCB0aGUgZ2RiIGludGVybmFsIGZvcm0gb2YgdGhlIGlucHV0IHN0cmluZyBpbiB0ZW1wYnVmLAotCSB0cmFuc2xhdGluZyBhbnkgc3RhbmRhcmQgQyBlc2NhcGUgZm9ybXMgc2Vlbi4gIE5vdGUgdGhhdCB0aGUKLQkgYnVmZmVyIGlzIG51bGwgYnl0ZSB0ZXJtaW5hdGVkICpvbmx5KiBmb3IgdGhlIGNvbnZlbmllbmNlIG9mCi0JIGRlYnVnZ2luZyBnZGIgaXRzZWxmIGFuZCBwcmludGluZyB0aGUgYnVmZmVyIGNvbnRlbnRzIHdoZW4KLQkgdGhlIGJ1ZmZlciBjb250YWlucyBubyBlbWJlZGRlZCBudWxscy4gIEdkYiBkb2VzIG5vdCBkZXBlbmQKLQkgdXBvbiB0aGUgYnVmZmVyIGJlaW5nIG51bGwgYnl0ZSB0ZXJtaW5hdGVkLCBpdCB1c2VzIHRoZSBsZW5ndGgKLQkgc3RyaW5nIGluc3RlYWQuICBUaGlzIGFsbG93cyBnZGIgdG8gaGFuZGxlIEMgc3RyaW5ncyAoYXMgd2VsbAotCSBhcyBzdHJpbmdzIGluIG90aGVyIGxhbmd1YWdlcykgd2l0aCBlbWJlZGRlZCBudWxsIGJ5dGVzICovCi0KLSAgICAgIHRva3B0ciA9ICsrdG9rc3RhcnQ7Ci0gICAgICB0ZW1wYnVmaW5kZXggPSAwOwotCi0gICAgICBkbyB7Ci0JLyogR3JvdyB0aGUgc3RhdGljIHRlbXAgYnVmZmVyIGlmIG5lY2Vzc2FyeSwgaW5jbHVkaW5nIGFsbG9jYXRpbmcKLQkgICB0aGUgZmlyc3Qgb25lIG9uIGRlbWFuZC4gKi8KLQlpZiAodGVtcGJ1ZmluZGV4ICsgMSA+PSB0ZW1wYnVmc2l6ZSkKLQkgIHsKLQkgICAgdGVtcGJ1ZiA9IChjaGFyICopIHhyZWFsbG9jICh0ZW1wYnVmLCB0ZW1wYnVmc2l6ZSArPSA2NCk7Ci0JICB9Ci0Jc3dpdGNoICgqdG9rcHRyKQotCSAgewotCSAgY2FzZSAnXDAnOgotCSAgY2FzZSAnIic6Ci0JICAgIC8qIERvIG5vdGhpbmcsIGxvb3Agd2lsbCB0ZXJtaW5hdGUuICovCi0JICAgIGJyZWFrOwotCSAgY2FzZSAnXFwnOgotCSAgICB0b2twdHIrKzsKLQkgICAgYyA9IHBhcnNlX2VzY2FwZSAoJnRva3B0cik7Ci0JICAgIGlmIChjID09IC0xKQotCSAgICAgIHsKLQkJY29udGludWU7Ci0JICAgICAgfQotCSAgICB0ZW1wYnVmW3RlbXBidWZpbmRleCsrXSA9IGM7Ci0JICAgIGJyZWFrOwotCSAgZGVmYXVsdDoKLQkgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXgrK10gPSAqdG9rcHRyKys7Ci0JICAgIGJyZWFrOwotCSAgfQotICAgICAgfSB3aGlsZSAoKCp0b2twdHIgIT0gJyInKSAmJiAoKnRva3B0ciAhPSAnXDAnKSk7Ci0gICAgICBpZiAoKnRva3B0cisrICE9ICciJykKLQl7Ci0JICBlcnJvciAoIlVudGVybWluYXRlZCBzdHJpbmcgaW4gZXhwcmVzc2lvbi4iKTsKLQl9Ci0gICAgICB0ZW1wYnVmW3RlbXBidWZpbmRleF0gPSAnXDAnOwkvKiBTZWUgbm90ZSBhYm92ZSAqLwotICAgICAgeXlsdmFsLnN2YWwucHRyID0gdGVtcGJ1ZjsKLSAgICAgIHl5bHZhbC5zdmFsLmxlbmd0aCA9IHRlbXBidWZpbmRleDsKLSAgICAgIGxleHB0ciA9IHRva3B0cjsKLSAgICAgIHJldHVybiAoU1RSSU5HKTsKLSAgICB9Ci0KLSAgaWYgKCEoYyA9PSAnXycgfHwgYyA9PSAnJCcKLQl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpKQotICAgIC8qIFdlIG11c3QgaGF2ZSBjb21lIGFjcm9zcyBhIGJhZCBjaGFyYWN0ZXIgKGUuZy4gJzsnKS4gICovCi0gICAgZXJyb3IgKCJJbnZhbGlkIGNoYXJhY3RlciAnJWMnIGluIGV4cHJlc3Npb24uIiwgYyk7Ci0KLSAgLyogSXQncyBhIG5hbWUuICBTZWUgaG93IGxvbmcgaXQgaXMuICAqLwotICBuYW1lbGVuID0gMDsKLSAgZm9yIChjID0gdG9rc3RhcnRbbmFtZWxlbl07Ci0gICAgICAgKGMgPT0gJ18nIHx8IGMgPT0gJyQnIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykKLQl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwgYyA9PSAnPCcpOykKLSAgICB7Ci0gICAgICAvKiBUZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdHMgYXJlIHBhcnQgb2YgdGhlIG5hbWUuCi0JIEZJWE1FOiBUaGlzIG1pc2hhbmRsZXMgYHByaW50ICRhPDQmJiRhPjMnLiAgKi8KLQotICAgICAgaWYgKGMgPT0gJzwnKQotCXsgCi0gICAgICAgICAgIGlmIChocF9zb21fc29tX29iamVjdF9wcmVzZW50KQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8qIFNjYW4gYWhlYWQgdG8gZ2V0IHJlc3Qgb2YgdGhlIHRlbXBsYXRlIHNwZWNpZmljYXRpb24uICBOb3RlCi0gICAgICAgICAgICAgICAgICB0aGF0IHdlIGxvb2sgYWhlYWQgb25seSB3aGVuIHRoZSAnPCcgYWRqb2lucyBub24td2hpdGVzcGFjZQotICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyczsgZm9yIGNvbXBhcmlzb24gZXhwcmVzc2lvbnMsIGUuZy4gImEgPCBiID4gYyIsCi0gICAgICAgICAgICAgICAgICB0aGVyZSBtdXN0IGJlIHNwYWNlcyBiZWZvcmUgdGhlICc8JywgZXRjLiAqLwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICBjaGFyICogcCA9IGZpbmRfdGVtcGxhdGVfbmFtZV9lbmQgKHRva3N0YXJ0ICsgbmFtZWxlbik7Ci0gICAgICAgICAgICAgICBpZiAocCkKLSAgICAgICAgICAgICAgICAgbmFtZWxlbiA9IHAgLSB0b2tzdGFydDsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgIHsgCi0JICAgICAgIGludCBpID0gbmFtZWxlbjsKLQkgICAgICAgaW50IG5lc3RpbmdfbGV2ZWwgPSAxOwotCSAgICAgICB3aGlsZSAodG9rc3RhcnRbKytpXSkKLQkJIHsKLQkJICAgaWYgKHRva3N0YXJ0W2ldID09ICc8JykKLQkJICAgICBuZXN0aW5nX2xldmVsKys7Ci0JCSAgIGVsc2UgaWYgKHRva3N0YXJ0W2ldID09ICc+JykKLQkJICAgICB7Ci0JCSAgICAgICBpZiAoLS1uZXN0aW5nX2xldmVsID09IDApCi0JCQkgYnJlYWs7Ci0JCSAgICAgfQotCQkgfQotCSAgICAgICBpZiAodG9rc3RhcnRbaV0gPT0gJz4nKQotCQkgbmFtZWxlbiA9IGk7Ci0JICAgICAgIGVsc2UKLQkJIGJyZWFrOwotCSAgICAgfQotCX0KLSAgICAgIGMgPSB0b2tzdGFydFsrK25hbWVsZW5dOwotICAgIH0KLQotICAvKiBUaGUgdG9rZW4gImlmIiB0ZXJtaW5hdGVzIHRoZSBleHByZXNzaW9uIGFuZCBpcyBOT1QgCi0gICAgIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KLSAgaWYgKG5hbWVsZW4gPT0gMiAmJiB0b2tzdGFydFswXSA9PSAnaScgJiYgdG9rc3RhcnRbMV0gPT0gJ2YnKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBsZXhwdHIgKz0gbmFtZWxlbjsKLQotICB0cnluYW1lOgotCi0gIC8qIENhdGNoIHNwZWNpZmljIGtleXdvcmRzLiAgU2hvdWxkIGJlIGRvbmUgd2l0aCBhIGRhdGEgc3RydWN0dXJlLiAgKi8KLSAgc3dpdGNoIChuYW1lbGVuKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInVuc2lnbmVkIiwgOCkpCi0JcmV0dXJuIFVOU0lHTkVEOwotICAgICAgaWYgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzCi0JICAmJiBTVFJFUU4gKHRva3N0YXJ0LCAidGVtcGxhdGUiLCA4KSkKLQlyZXR1cm4gVEVNUExBVEU7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInZvbGF0aWxlIiwgOCkpCi0JcmV0dXJuIFZPTEFUSUxFX0tFWVdPUkQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInN0cnVjdCIsIDYpKQotCXJldHVybiBTVFJVQ1Q7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInNpZ25lZCIsIDYpKQotCXJldHVybiBTSUdORURfS0VZV09SRDsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAic2l6ZW9mIiwgNikpICAgICAgCi0JcmV0dXJuIFNJWkVPRjsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZG91YmxlIiwgNikpICAgICAgCi0JcmV0dXJuIERPVUJMRV9LRVlXT1JEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgaWYgKGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJmYWxzZSIsIDUpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFS0VZV09SRDsKLSAgICAgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImNsYXNzIiwgNSkpCi0gICAgICAgICAgICByZXR1cm4gQ0xBU1M7Ci0gICAgICAgIH0KLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAidW5pb24iLCA1KSkKLQlyZXR1cm4gVU5JT047Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInNob3J0IiwgNSkpCi0JcmV0dXJuIFNIT1JUOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJjb25zdCIsIDUpKQotCXJldHVybiBDT05TVF9LRVlXT1JEOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJlbnVtIiwgNCkpCi0JcmV0dXJuIEVOVU07Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImxvbmciLCA0KSkKLQlyZXR1cm4gTE9ORzsKLSAgICAgIGlmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInRydWUiLCA0KSkKLSAgICAgICAgICAgICAgcmV0dXJuIFRSVUVLRVlXT1JEOwotCi0gICAgICAgICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInRoaXMiLCA0KSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHRoaXNfbmFtZVtdID0KLSAgICAgICAgICAgICAgICB7IENQTFVTX01BUktFUiwgJ3QnLCAnaCcsICdpJywgJ3MnLCAnXDAnIH07Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxvb2t1cF9zeW1ib2wgKHRoaXNfbmFtZSwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBUSElTOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJpbnQiLCAzKSkKLQlyZXR1cm4gSU5UX0tFWVdPUkQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHl5bHZhbC5zdmFsLnB0ciA9IHRva3N0YXJ0OwotICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBuYW1lbGVuOwotCi0gIGlmICgqdG9rc3RhcnQgPT0gJyQnKQotICAgIHsKLSAgICAgIHdyaXRlX2RvbGxhcl92YXJpYWJsZSAoeXlsdmFsLnN2YWwpOwotICAgICAgcmV0dXJuIFZBUklBQkxFOwotICAgIH0KLSAgCi0gIC8qIExvb2sgYWhlYWQgYW5kIHNlZSBpZiB3ZSBjYW4gY29uc3VtZSBtb3JlIG9mIHRoZSBpbnB1dAotICAgICBzdHJpbmcgdG8gZ2V0IGEgcmVhc29uYWJsZSBjbGFzcy9uYW1lc3BhY2Ugc3BlYyBvciBhCi0gICAgIGZ1bGx5LXF1YWxpZmllZCBuYW1lLiAgVGhpcyBpcyBhIGtsdWRnZSB0byBnZXQgYXJvdW5kIHRoZQotICAgICBIUCBhQ0MgY29tcGlsZXIncyBnZW5lcmF0aW9uIG9mIHN5bWJvbCBuYW1lcyB3aXRoIGVtYmVkZGVkCi0gICAgIGNvbG9ucyBmb3IgbmFtZXNwYWNlIGFuZCBuZXN0ZWQgY2xhc3Nlcy4gKi8gCi0gIGlmICh1bnF1b3RlZF9leHByKQotICAgIHsKLSAgICAgIC8qIE9ubHkgZG8gaXQgaWYgbm90IGluc2lkZSBzaW5nbGUgcXVvdGVzICovIAotICAgICAgc3ltX2NsYXNzID0gcGFyc2VfbmVzdGVkX2NsYXNzZXNfZm9yX2hwYWNjICh5eWx2YWwuc3ZhbC5wdHIsIHl5bHZhbC5zdmFsLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRva2VuX3N0cmluZywgJmNsYXNzX3ByZWZpeCwgJmxleHB0cik7Ci0gICAgICBpZiAoc3ltX2NsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgLyogUmVwbGFjZSB0aGUgY3VycmVudCB0b2tlbiB3aXRoIHRoZSBiaWdnZXIgb25lIHdlIGZvdW5kICovIAotICAgICAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRva2VuX3N0cmluZzsKLSAgICAgICAgICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBzdHJsZW4gKHRva2VuX3N0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gIAotICAvKiBVc2UgdG9rZW4tdHlwZSBCTE9DS05BTUUgZm9yIHN5bWJvbHMgdGhhdCBoYXBwZW4gdG8gYmUgZGVmaW5lZCBhcwotICAgICBmdW5jdGlvbnMgb3Igc3ltdGFicy4gIElmIHRoaXMgaXMgbm90IHNvLCB0aGVuIC4uLgotICAgICBVc2UgdG9rZW4tdHlwZSBUWVBFTkFNRSBmb3Igc3ltYm9scyB0aGF0IGhhcHBlbiB0byBiZSBkZWZpbmVkCi0gICAgIGN1cnJlbnRseSBhcyBuYW1lcyBvZiB0eXBlczsgTkFNRSBmb3Igb3RoZXIgc3ltYm9scy4KLSAgICAgVGhlIGNhbGxlciBpcyBub3QgY29uc3RyYWluZWQgdG8gY2FyZSBhYm91dCB0aGUgZGlzdGluY3Rpb24uICAqLwotICB7Ci0gICAgY2hhciAqdG1wID0gY29weV9uYW1lICh5eWx2YWwuc3ZhbCk7Ci0gICAgc3RydWN0IHN5bWJvbCAqc3ltOwotICAgIGludCBpc19hX2ZpZWxkX29mX3RoaXMgPSAwOwotICAgIGludCBoZXh0eXBlOwotCi0gICAgc3ltID0gbG9va3VwX3N5bWJvbCAodG1wLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCi0JCQkgVkFSX05BTUVTUEFDRSwKLQkJCSBjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cwotCQkJID8gJmlzX2FfZmllbGRfb2ZfdGhpcyA6IChpbnQgKikgTlVMTCwKLQkJCSAoc3RydWN0IHN5bXRhYiAqKikgTlVMTCk7Ci0gICAgLyogQ2FsbCBsb29rdXBfc3ltdGFiLCBub3QgbG9va3VwX3BhcnRpYWxfc3ltdGFiLCBpbiBjYXNlIHRoZXJlIGFyZQotICAgICAgIG5vIHBzeW10YWJzIChjb2ZmLCB4Y29mZiwgb3Igc29tZSBmdXR1cmUgY2hhbmdlIHRvIGJsb3cgYXdheSB0aGUKLSAgICAgICBwc3ltdGFicyBvbmNlIG9uY2Ugc3ltYm9scyBhcmUgcmVhZCkuICAqLwotICAgIGlmIChzeW0gJiYgU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19CTE9DSykKLSAgICAgIHsKLQl5eWx2YWwuc3N5bS5zeW0gPSBzeW07Ci0JeXlsdmFsLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzID0gaXNfYV9maWVsZF9vZl90aGlzOwotCXJldHVybiBCTE9DS05BTUU7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoIXN5bSkKLSAgICAgIHsJCQkJLyogU2VlIGlmIGl0J3MgYSBmaWxlIG5hbWUuICovCi0Jc3RydWN0IHN5bXRhYiAqc3ltdGFiOwotCi0Jc3ltdGFiID0gbG9va3VwX3N5bXRhYiAodG1wKTsKLQotCWlmIChzeW10YWIpCi0JICB7Ci0JICAgIHl5bHZhbC5idmFsID0gQkxPQ0tWRUNUT1JfQkxPQ0sgKEJMT0NLVkVDVE9SIChzeW10YWIpLCBTVEFUSUNfQkxPQ0spOwotCSAgICByZXR1cm4gRklMRU5BTUU7Ci0JICB9Ci0gICAgICB9Ci0KLSAgICBpZiAoc3ltICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfVFlQRURFRikKLSAgICAgICAgewotI2lmIDEKLQkgIC8qIERlc3BpdGUgdGhlIGZvbGxvd2luZyBmbGF3LCB3ZSBuZWVkIHRvIGtlZXAgdGhpcyBjb2RlIGVuYWJsZWQuCi0JICAgICBCZWNhdXNlIHdlIGNhbiBnZXQgY2FsbGVkIGZyb20gY2hlY2tfc3R1Yl9tZXRob2QsIGlmIHdlIGRvbid0Ci0JICAgICBoYW5kbGUgbmVzdGVkIHR5cGVzIHRoZW4gaXQgc2NyZXdzIG1hbnkgb3BlcmF0aW9ucyBpbiBhbnkKLQkgICAgIHByb2dyYW0gd2hpY2ggdXNlcyBuZXN0ZWQgdHlwZXMuICAqLwotCSAgLyogSW4gIkE6OngiLCBpZiB4IGlzIGEgbWVtYmVyIGZ1bmN0aW9uIG9mIEEgYW5kIHRoZXJlIGhhcHBlbnMKLQkgICAgIHRvIGJlIGEgdHlwZSAobmVzdGVkIG9yIG5vdCwgc2luY2UgdGhlIHN0YWJzIGRvbid0IG1ha2UgdGhhdAotCSAgICAgZGlzdGluY3Rpb24pIG5hbWVkIHgsIHRoZW4gdGhpcyBjb2RlIGluY29ycmVjdGx5IHRoaW5rcyB3ZQotCSAgICAgYXJlIGRlYWxpbmcgd2l0aCBuZXN0ZWQgdHlwZXMgcmF0aGVyIHRoYW4gYSBtZW1iZXIgZnVuY3Rpb24uICAqLwotCi0JICBjaGFyICpwOwotCSAgY2hhciAqbmFtZXN0YXJ0OwotCSAgc3RydWN0IHN5bWJvbCAqYmVzdF9zeW07Ci0KLQkgIC8qIExvb2sgYWhlYWQgdG8gZGV0ZWN0IG5lc3RlZCB0eXBlcy4gIFRoaXMgcHJvYmFibHkgc2hvdWxkIGJlCi0JICAgICBkb25lIGluIHRoZSBncmFtbWFyLCBidXQgdHJ5aW5nIHNlZW1lZCB0byBpbnRyb2R1Y2UgYSBsb3QKLQkgICAgIG9mIHNoaWZ0L3JlZHVjZSBhbmQgcmVkdWNlL3JlZHVjZSBjb25mbGljdHMuICBJdCdzIHBvc3NpYmxlCi0JICAgICB0aGF0IGl0IGNvdWxkIGJlIGRvbmUsIHRob3VnaC4gIE9yIHBlcmhhcHMgYSBub24tZ3JhbW1hciwgYnV0Ci0JICAgICBsZXNzIGFkIGhvYywgYXBwcm9hY2ggd291bGQgd29yayB3ZWxsLiAgKi8KLQotCSAgLyogU2luY2Ugd2UgZG8gbm90IGN1cnJlbnRseSBoYXZlIGFueSB3YXkgb2YgZGlzdGluZ3Vpc2hpbmcKLQkgICAgIGEgbmVzdGVkIHR5cGUgZnJvbSBhIG5vbi1uZXN0ZWQgb25lICh0aGUgc3RhYnMgZG9uJ3QgdGVsbAotCSAgICAgdXMgd2hldGhlciBhIHR5cGUgaXMgbmVzdGVkKSwgd2UganVzdCBpZ25vcmUgdGhlCi0JICAgICBjb250YWluaW5nIHR5cGUuICAqLwotCi0JICBwID0gbGV4cHRyOwotCSAgYmVzdF9zeW0gPSBzeW07Ci0JICB3aGlsZSAoMSkKLQkgICAgewotCSAgICAgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcbicpCi0JCSsrcDsKLQkgICAgICBpZiAoKnAgPT0gJzonICYmIHBbMV0gPT0gJzonKQotCQl7Ci0JCSAgLyogU2tpcCB0aGUgYDo6Jy4gICovCi0JCSAgcCArPSAyOwotCQkgIC8qIFNraXAgd2hpdGVzcGFjZS4gICovCi0JCSAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnIHx8ICpwID09ICdcbicpCi0JCSAgICArK3A7Ci0JCSAgbmFtZXN0YXJ0ID0gcDsKLQkJICB3aGlsZSAoKnAgPT0gJ18nIHx8ICpwID09ICckJyB8fCAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykKLQkJCSB8fCAoKnAgPj0gJ2EnICYmICpwIDw9ICd6JykKLQkJCSB8fCAoKnAgPj0gJ0EnICYmICpwIDw9ICdaJykpCi0JCSAgICArK3A7Ci0JCSAgaWYgKHAgIT0gbmFtZXN0YXJ0KQotCQkgICAgewotCQkgICAgICBzdHJ1Y3Qgc3ltYm9sICpjdXJfc3ltOwotCQkgICAgICAvKiBBcyBiaWcgYXMgdGhlIHdob2xlIHJlc3Qgb2YgdGhlIGV4cHJlc3Npb24sIHdoaWNoIGlzCi0JCQkgYXQgbGVhc3QgYmlnIGVub3VnaC4gICovCi0JCSAgICAgIGNoYXIgKm5jb3B5ID0gYWxsb2NhIChzdHJsZW4gKHRtcCkrc3RybGVuIChuYW1lc3RhcnQpKzMpOwotCQkgICAgICBjaGFyICp0bXAxOwotCi0JCSAgICAgIHRtcDEgPSBuY29weTsKLQkJICAgICAgbWVtY3B5ICh0bXAxLCB0bXAsIHN0cmxlbiAodG1wKSk7Ci0JCSAgICAgIHRtcDEgKz0gc3RybGVuICh0bXApOwotCQkgICAgICBtZW1jcHkgKHRtcDEsICI6OiIsIDIpOwotCQkgICAgICB0bXAxICs9IDI7Ci0JCSAgICAgIG1lbWNweSAodG1wMSwgbmFtZXN0YXJ0LCBwIC0gbmFtZXN0YXJ0KTsKLQkJICAgICAgdG1wMVtwIC0gbmFtZXN0YXJ0XSA9ICdcMCc7Ci0JCSAgICAgIGN1cl9zeW0gPSBsb29rdXBfc3ltYm9sIChuY29weSwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAotCQkJCQkgICAgICAgVkFSX05BTUVTUEFDRSwgKGludCAqKSBOVUxMLAotCQkJCQkgICAgICAgKHN0cnVjdCBzeW10YWIgKiopIE5VTEwpOwotCQkgICAgICBpZiAoY3VyX3N5bSkKLQkJCXsKLQkJCSAgaWYgKFNZTUJPTF9DTEFTUyAoY3VyX3N5bSkgPT0gTE9DX1RZUEVERUYpCi0JCQkgICAgewotCQkJICAgICAgYmVzdF9zeW0gPSBjdXJfc3ltOwotCQkJICAgICAgbGV4cHRyID0gcDsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICBicmVhazsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCSAgZWxzZQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlCi0JCWJyZWFrOwotCSAgICB9Ci0KLQkgIHl5bHZhbC50c3ltLnR5cGUgPSBTWU1CT0xfVFlQRSAoYmVzdF9zeW0pOwotI2Vsc2UgLyogbm90IDAgKi8KLQkgIHl5bHZhbC50c3ltLnR5cGUgPSBTWU1CT0xfVFlQRSAoc3ltKTsKLSNlbmRpZiAvKiBub3QgMCAqLwotCSAgcmV0dXJuIFRZUEVOQU1FOwotICAgICAgICB9Ci0gICAgaWYgKCh5eWx2YWwudHN5bS50eXBlID0gbG9va3VwX3ByaW1pdGl2ZV90eXBlbmFtZSAodG1wKSkgIT0gMCkKLQlyZXR1cm4gVFlQRU5BTUU7Ci0KLSAgICAvKiBJbnB1dCBuYW1lcyB0aGF0IGFyZW4ndCBzeW1ib2xzIGJ1dCBBUkUgdmFsaWQgaGV4IG51bWJlcnMsCi0gICAgICAgd2hlbiB0aGUgaW5wdXQgcmFkaXggcGVybWl0cyB0aGVtLCBjYW4gYmUgbmFtZXMgb3IgbnVtYmVycwotICAgICAgIGRlcGVuZGluZyBvbiB0aGUgcGFyc2UuICBOb3RlIHdlIHN1cHBvcnQgcmFkaXhlcyA+IDE2IGhlcmUuICAqLwotICAgIGlmICghc3ltICYmIAotICAgICAgICAoKHRva3N0YXJ0WzBdID49ICdhJyAmJiB0b2tzdGFydFswXSA8ICdhJyArIGlucHV0X3JhZGl4IC0gMTApIHx8Ci0gICAgICAgICAodG9rc3RhcnRbMF0gPj0gJ0EnICYmIHRva3N0YXJ0WzBdIDwgJ0EnICsgaW5wdXRfcmFkaXggLSAxMCkpKQotICAgICAgewotIAlZWVNUWVBFIG5ld2x2YWw7CS8qIEl0cyB2YWx1ZSBpcyBpZ25vcmVkLiAgKi8KLQloZXh0eXBlID0gcGFyc2VfbnVtYmVyICh0b2tzdGFydCwgbmFtZWxlbiwgMCwgJm5ld2x2YWwpOwotCWlmIChoZXh0eXBlID09IElOVCkKLQkgIHsKLQkgICAgeXlsdmFsLnNzeW0uc3ltID0gc3ltOwotCSAgICB5eWx2YWwuc3N5bS5pc19hX2ZpZWxkX29mX3RoaXMgPSBpc19hX2ZpZWxkX29mX3RoaXM7Ci0JICAgIHJldHVybiBOQU1FX09SX0lOVDsKLQkgIH0KLSAgICAgIH0KLQotICAgIC8qIEFueSBvdGhlciBraW5kIG9mIHN5bWJvbCAqLwotICAgIHl5bHZhbC5zc3ltLnN5bSA9IHN5bTsKLSAgICB5eWx2YWwuc3N5bS5pc19hX2ZpZWxkX29mX3RoaXMgPSBpc19hX2ZpZWxkX29mX3RoaXM7Ci0gICAgcmV0dXJuIE5BTUU7Ci0gIH0KLX0KLQotdm9pZAoteXllcnJvciAobXNnKQotICAgICBjaGFyICptc2c7Ci17Ci0gIGVycm9yICgiQSAlcyBpbiBleHByZXNzaW9uLCBuZWFyIGAlcycuIiwgKG1zZyA/IG1zZyA6ICJlcnJvciIpLCBsZXhwdHIpOwotfQpkaWZmIC0tZ2l0IGEvZ2RiL2NvbmZpZy9pMzg2L3dpbmRvd3MubWggYi9nZGIvY29uZmlnL2kzODYvd2luZG93cy5taApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzM2E2ZS4uMDAwMDAwMAotLS0gYS9nZGIvY29uZmlnL2kzODYvd2luZG93cy5taAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMgZ2Rid2luLm8gYW5kIHNlci13aW4zMnMuYyBoYXZlIHRvIGJlIG5hbWVkIGJlY2F1c2UgdGhleSBoYXZlCi0jICAgX2luaXRpYWxpemUgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBmb3VuZCBieSBpbml0LmMKLSMgZ3VpLm9yZXMgaGFzIHRvIGJlIG5hbWVkLCBvciBlbHNlIG1zdmMgd29uJ3QgbGluayBpdCBpbi4KLVhERVBGSUxFUyA9IFwKLQltc3dpbi9nZGJ3aW4ubyBcCi0JbXN3aW4vc2VyLXdpbjMycy5vIFwKLQltc3dpbi9ndWkub3JlcyBcCi0JbXN3aW4vbGlid2luZ2RiLmEKLQotJChYREVQRklMRVMpOgotCXJvb3RtZT1gcHdkYCA7IGV4cG9ydCByb290bWUgOyBcCi0JKCBjZCBtc3dpbiA7IFwKLQkgICQoTUFLRSkgJChGTEFHU19UT19QQVNTKSBhbGwgKQotCi1YTV9GSUxFPXhtLXdpbmRvd3MuaAotTU1BTExPQz0KLVNFUl9IQVJEV0lSRSA9CmRpZmYgLS1naXQgYS9nZGIvZG9jL0dEQnZuLnRleGkgYi9nZGIvZG9jL0dEQnZuLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzIyYmQuLjAwMDAwMDAKLS0tIGEvZ2RiL2RvYy9HREJ2bi50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQHNldCBHREJWTiA0LjE4CmRpZmYgLS1naXQgYS9nZGIvZi1leHAudGFiLmMgYi9nZGIvZi1leHAudGFiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmN2QyNWUuLjAwMDAwMDAKLS0tIGEvZ2RiL2YtZXhwLnRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA4NiArMCwwIEBACi0KLS8qICBBIEJpc29uIHBhcnNlciwgbWFkZSBmcm9tIGYtZXhwLnkKLSBieSAgR05VIEJpc29uIHZlcnNpb24gMS4yNQotICAqLwotCi0jZGVmaW5lIFlZQklTT04gMSAgLyogSWRlbnRpZnkgQmlzb24gb3V0cHV0LiAgKi8KLQotI2RlZmluZQlJTlQJMjU4Ci0jZGVmaW5lCUZMT0FUCTI1OQotI2RlZmluZQlTVFJJTkdfTElURVJBTAkyNjAKLSNkZWZpbmUJQk9PTEVBTl9MSVRFUkFMCTI2MQotI2RlZmluZQlOQU1FCTI2MgotI2RlZmluZQlUWVBFTkFNRQkyNjMKLSNkZWZpbmUJTkFNRV9PUl9JTlQJMjY0Ci0jZGVmaW5lCVNJWkVPRgkyNjUKLSNkZWZpbmUJRVJST1IJMjY2Ci0jZGVmaW5lCUlOVF9LRVlXT1JECTI2NwotI2RlZmluZQlJTlRfUzJfS0VZV09SRAkyNjgKLSNkZWZpbmUJTE9HSUNBTF9TMV9LRVlXT1JECTI2OQotI2RlZmluZQlMT0dJQ0FMX1MyX0tFWVdPUkQJMjcwCi0jZGVmaW5lCUxPR0lDQUxfS0VZV09SRAkyNzEKLSNkZWZpbmUJUkVBTF9LRVlXT1JECTI3MgotI2RlZmluZQlSRUFMX1M4X0tFWVdPUkQJMjczCi0jZGVmaW5lCVJFQUxfUzE2X0tFWVdPUkQJMjc0Ci0jZGVmaW5lCUNPTVBMRVhfUzhfS0VZV09SRAkyNzUKLSNkZWZpbmUJQ09NUExFWF9TMTZfS0VZV09SRAkyNzYKLSNkZWZpbmUJQ09NUExFWF9TMzJfS0VZV09SRAkyNzcKLSNkZWZpbmUJQk9PTF9BTkQJMjc4Ci0jZGVmaW5lCUJPT0xfT1IJMjc5Ci0jZGVmaW5lCUJPT0xfTk9UCTI4MAotI2RlZmluZQlDSEFSQUNURVIJMjgxCi0jZGVmaW5lCVZBUklBQkxFCTI4MgotI2RlZmluZQlBU1NJR05fTU9ESUZZCTI4MwotI2RlZmluZQlBQk9WRV9DT01NQQkyODQKLSNkZWZpbmUJRVFVQUwJMjg1Ci0jZGVmaW5lCU5PVEVRVUFMCTI4NgotI2RlZmluZQlMRVNTVEhBTgkyODcKLSNkZWZpbmUJR1JFQVRFUlRIQU4JMjg4Ci0jZGVmaW5lCUxFUQkyODkKLSNkZWZpbmUJR0VRCTI5MAotI2RlZmluZQlMU0gJMjkxCi0jZGVmaW5lCVJTSAkyOTIKLSNkZWZpbmUJVU5BUlkJMjkzCi0KLSNsaW5lIDQzICJmLWV4cC55IgotCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiZ2RiX3N0cmluZy5oIgotI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKLSNpbmNsdWRlICJ2YWx1ZS5oIgotI2luY2x1ZGUgInBhcnNlci1kZWZzLmgiCi0jaW5jbHVkZSAibGFuZ3VhZ2UuaCIKLSNpbmNsdWRlICJmLWxhbmcuaCIKLSNpbmNsdWRlICJiZmQuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCi0jaW5jbHVkZSAic3ltZmlsZS5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KLSNpbmNsdWRlICJvYmpmaWxlcy5oIiAvKiBGb3IgaGF2ZV9mdWxsX3N5bWJvbHMgYW5kIGhhdmVfcGFydGlhbF9zeW1ib2xzICovCi0KLS8qIFJlbWFwIG5vcm1hbCB5YWNjIHBhcnNlciBpbnRlcmZhY2UgbmFtZXMgKHl5cGFyc2UsIHl5bGV4LCB5eWVycm9yLCBldGMpLAotICAgYXMgd2VsbCBhcyBncmF0dWl0aW91c2x5IGdsb2JhbCBzeW1ib2wgbmFtZXMsIHNvIHdlIGNhbiBoYXZlIG11bHRpcGxlCi0gICB5YWNjIGdlbmVyYXRlZCBwYXJzZXJzIGluIGdkYi4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSB0aGUgdmFyaWFibGVzCi0gICBwcm9kdWNlZCBieSB5YWNjLiAgSWYgb3RoZXIgcGFyc2VyIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlCi0gICBhZGRpdGlvbmFsIGdsb2JhbCBuYW1lcyB0aGF0IGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIKLSAgIGdlbmVyYXRvcnMgbmVlZCB0byBiZSBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCi0KLSNkZWZpbmUJeXltYXhkZXB0aCBmX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJZl9wYXJzZQotI2RlZmluZQl5eWxleAlmX2xleAotI2RlZmluZQl5eWVycm9yCWZfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCWZfbHZhbAotI2RlZmluZQl5eWNoYXIJZl9jaGFyCi0jZGVmaW5lCXl5ZGVidWcJZl9kZWJ1ZwotI2RlZmluZQl5eXBhY3QJZl9wYWN0CQotI2RlZmluZQl5eXIxCWZfcjEJCQkKLSNkZWZpbmUJeXlyMglmX3IyCQkJCi0jZGVmaW5lCXl5ZGVmCWZfZGVmCQkKLSNkZWZpbmUJeXljaGsJZl9jaGsJCQotI2RlZmluZQl5eXBnbwlmX3BnbwkJCi0jZGVmaW5lCXl5YWN0CWZfYWN0CQkKLSNkZWZpbmUJeXlleGNhCWZfZXhjYQotI2RlZmluZSB5eWVycmZsYWcgZl9lcnJmbGFnCi0jZGVmaW5lIHl5bmVycnMJZl9uZXJycwotI2RlZmluZQl5eXBzCWZfcHMKLSNkZWZpbmUJeXlwdglmX3B2Ci0jZGVmaW5lCXl5cwlmX3MKLSNkZWZpbmUJeXlfeXlzCWZfeXlzCi0jZGVmaW5lCXl5c3RhdGUJZl9zdGF0ZQotI2RlZmluZQl5eXRtcAlmX3RtcAotI2RlZmluZQl5eXYJZl92Ci0jZGVmaW5lCXl5X3l5dglmX3l5dgotI2RlZmluZQl5eXZhbAlmX3ZhbAotI2RlZmluZQl5eWxsb2MJZl9sbG9jCi0jZGVmaW5lIHl5cmVkcwlmX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5dG9rcwlmX3Rva3MJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lIHl5bGhzCWZfeXlsaHMKLSNkZWZpbmUgeXlsZW4JZl95eWxlbgotI2RlZmluZSB5eWRlZnJlZCBmX3l5ZGVmcmVkCi0jZGVmaW5lIHl5ZGdvdG8JZl95eWRnb3RvCi0jZGVmaW5lIHl5c2luZGV4IGZfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggZl95eXJpbmRleAotI2RlZmluZSB5eWdpbmRleCBmX3l5Z2luZGV4Ci0jZGVmaW5lIHl5dGFibGUJIGZfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBmX3l5Y2hlY2sKLQotI2lmbmRlZiBZWURFQlVHCi0jZGVmaW5lCVlZREVCVUcJMQkJLyogRGVmYXVsdCB0byBubyB5eWRlYnVnIHN1cHBvcnQgKi8KLSNlbmRpZgotCi1pbnQgeXlwYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBpbnQgeXlsZXggUEFSQU1TICgodm9pZCkpOwotCi12b2lkIHl5ZXJyb3IgUEFSQU1TICgoY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkIGdyb3didWZfYnlfc2l6ZSBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGludCBtYXRjaF9zdHJpbmdfbGl0ZXJhbCBQQVJBTVMgKCh2b2lkKSk7Ci0KLQotI2xpbmUgMTIyICJmLWV4cC55IgotdHlwZWRlZiB1bmlvbgotICB7Ci0gICAgTE9OR0VTVCBsdmFsOwotICAgIHN0cnVjdCB7Ci0gICAgICBMT05HRVNUIHZhbDsKLSAgICAgIHN0cnVjdCB0eXBlICp0eXBlOwotICAgIH0gdHlwZWRfdmFsOwotICAgIERPVUJMRVNUIGR2YWw7Ci0gICAgc3RydWN0IHN5bWJvbCAqc3ltOwotICAgIHN0cnVjdCB0eXBlICp0dmFsOwotICAgIHN0cnVjdCBzdG9rZW4gc3ZhbDsKLSAgICBzdHJ1Y3QgdHR5cGUgdHN5bTsKLSAgICBzdHJ1Y3Qgc3ltdG9rZW4gc3N5bTsKLSAgICBpbnQgdm9pZHZhbDsKLSAgICBzdHJ1Y3QgYmxvY2sgKmJ2YWw7Ci0gICAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWx2YXIgKml2YXI7Ci0KLSAgICBzdHJ1Y3QgdHlwZSAqKnR2ZWM7Ci0gICAgaW50ICppdmVjOwotICB9IFlZU1RZUEU7Ci0jbGluZSAxNDQgImYtZXhwLnkiCi0KLS8qIFlZU1RZUEUgZ2V0cyBkZWZpbmVkIGJ5ICV1bmlvbiAqLwotc3RhdGljIGludCBwYXJzZV9udW1iZXIgUEFSQU1TICgoY2hhciAqLCBpbnQsIGludCwgWVlTVFlQRSAqKSk7Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotCi0KLSNkZWZpbmUJWVlGSU5BTAkJMTI1Ci0jZGVmaW5lCVlZRkxBRwkJLTMyNzY4Ci0jZGVmaW5lCVlZTlRCQVNFCTU1Ci0KLSNkZWZpbmUgWVlUUkFOU0xBVEUoeCkgKCh1bnNpZ25lZCkoeCkgPD0gMjkzID8geXl0cmFuc2xhdGVbeF0gOiA3MSkKLQotc3RhdGljIGNvbnN0IGNoYXIgeXl0cmFuc2xhdGVbXSA9IHsgICAgIDAsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgNDksICAgIDM1LCAgICAgMiwgICAgNTEsCi0gICAgNTIsICAgIDQ3LCAgICA0NSwgICAgMjksICAgIDQ2LCAgICAgMiwgICAgNDgsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDU0LCAgICAgMiwgICAgIDIsCi0gICAgMzEsICAgICAyLCAgICAzMiwgICAgNDQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgMzQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgMzMsICAgICAyLCAgICA1MywgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsCi0gICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsCi0gICAgMjYsICAgIDI3LCAgICAyOCwgICAgMzAsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsCi0gICAgNDIsICAgIDQzLCAgICA1MAotfTsKLQotI2lmIFlZREVCVUcgIT0gMAotc3RhdGljIGNvbnN0IHNob3J0IHl5cHJoc1tdID0geyAgICAgMCwKLSAgICAgMCwgICAgIDIsICAgICA0LCAgICAgNiwgICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTksICAgIDIyLCAgICAyNSwKLSAgICAyOCwgICAgMjksICAgIDM1LCAgICAzNiwgICAgMzgsICAgIDQwLCAgICA0NCwgICAgNDgsICAgIDUyLCAgICA1NiwKLSAgICA2MSwgICAgNjUsICAgIDY5LCAgICA3MywgICAgNzcsICAgIDgxLCAgICA4NSwgICAgODksICAgIDkzLCAgICA5NywKLSAgIDEwMSwgICAxMDUsICAgMTA5LCAgIDExMywgICAxMTcsICAgMTIxLCAgIDEyNSwgICAxMjksICAgMTMzLCAgIDEzNywKLSAgIDE0MSwgICAxNDUsICAgMTQ3LCAgIDE0OSwgICAxNTEsICAgMTUzLCAgIDE1NSwgICAxNjAsICAgMTYyLCAgIDE2NCwKLSAgIDE2NiwgICAxNjgsICAgMTcwLCAgIDE3MywgICAxNzUsICAgMTc4LCAgIDE4MCwgICAxODMsICAgMTg1LCAgIDE4OSwKLSAgIDE5MiwgICAxOTQsICAgMTk3LCAgIDIwMSwgICAyMDMsICAgMjA1LCAgIDIwNywgICAyMDksICAgMjExLCAgIDIxMywKLSAgIDIxNSwgICAyMTcsICAgMjE5LCAgIDIyMSwgICAyMjMsICAgMjI1LCAgIDIyNywgICAyMjksICAgMjMxLCAgIDIzNSwKLSAgIDIzNywgICAyMzksICAgMjQxCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyaHNbXSA9IHsgICAgNTcsCi0gICAgIDAsICAgIDU2LCAgICAgMCwgICAgNjMsICAgICAwLCAgICA1MSwgICAgNTcsICAgIDUyLCAgICAgMCwgICAgNDcsCi0gICAgNTcsICAgICAwLCAgICAzNSwgICAgNTcsICAgICAwLCAgICA0NiwgICAgNTcsICAgICAwLCAgICAyNSwgICAgNTcsCi0gICAgIDAsICAgIDUzLCAgICA1NywgICAgIDAsICAgIDEwLCAgICA1NywgICAgIDAsICAgICAwLCAgICA1NywgICAgNTEsCi0gICAgNTgsICAgIDU5LCAgICA1MiwgICAgIDAsICAgICAwLCAgICA1NywgICAgIDAsICAgIDYwLCAgICAgMCwgICAgNTksCi0gICAgMjksICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDU0LCAgICA1NywgICAgIDAsICAgIDU3LCAgICAyOSwgICAgNTcsCi0gICAgIDAsICAgIDUxLCAgICA2MSwgICAgNTIsICAgICAwLCAgICA1MSwgICAgNjMsICAgIDUyLCAgICA1NywgICAgIDAsCi0gICAgNTcsICAgIDQ0LCAgICA1NywgICAgIDAsICAgIDU3LCAgICA0NywgICAgNTcsICAgICAwLCAgICA1NywgICAgNDgsCi0gICAgNTcsICAgICAwLCAgICA1NywgICAgNDksICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDQ1LCAgICA1NywgICAgIDAsCi0gICAgNTcsICAgIDQ2LCAgICA1NywgICAgIDAsICAgIDU3LCAgICA0MiwgICAgNTcsICAgICAwLCAgICA1NywgICAgNDMsCi0gICAgNTcsICAgICAwLCAgICA1NywgICAgMzYsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDM3LCAgICA1NywgICAgIDAsCi0gICAgNTcsICAgIDQwLCAgICA1NywgICAgIDAsICAgIDU3LCAgICA0MSwgICAgNTcsICAgICAwLCAgICA1NywgICAgMzgsCi0gICAgNTcsICAgICAwLCAgICA1NywgICAgMzksICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDM1LCAgICA1NywgICAgIDAsCi0gICAgNTcsICAgIDM0LCAgICA1NywgICAgIDAsICAgIDU3LCAgICAzMywgICAgNTcsICAgICAwLCAgICA1NywgICAgMjMsCi0gICAgNTcsICAgICAwLCAgICA1NywgICAgMjQsICAgIDU3LCAgICAgMCwgICAgNTcsICAgIDMxLCAgICA1NywgICAgIDAsCi0gICAgNTcsICAgIDI4LCAgICA1NywgICAgIDAsICAgICAzLCAgICAgMCwgICAgIDksICAgICAwLCAgICAgNCwgICAgIDAsCi0gICAgNjIsICAgICAwLCAgICAyNywgICAgIDAsICAgIDEwLCAgICA1MSwgICAgNjMsICAgIDUyLCAgICAgMCwgICAgIDYsCi0gICAgIDAsICAgICA1LCAgICAgMCwgICAgNzAsICAgICAwLCAgICA2NCwgICAgIDAsICAgIDY4LCAgICAgMCwgICAgNjgsCi0gICAgNjUsICAgICAwLCAgICA0NywgICAgIDAsICAgIDQ3LCAgICA2NSwgICAgIDAsICAgIDM1LCAgICAgMCwgICAgMzUsCi0gICAgNjUsICAgICAwLCAgICA2NiwgICAgIDAsICAgIDUxLCAgICA2NSwgICAgNTIsICAgICAwLCAgICA2NiwgICAgNjcsCi0gICAgIDAsICAgIDY3LCAgICAgMCwgICAgNTEsICAgIDUyLCAgICAgMCwgICAgNTEsICAgIDY5LCAgICA1MiwgICAgIDAsCi0gICAgIDgsICAgICAwLCAgICAxMiwgICAgIDAsICAgIDEzLCAgICAgMCwgICAgMjYsICAgICAwLCAgICAxNiwgICAgIDAsCi0gICAgMTUsICAgICAwLCAgICAxNCwgICAgIDAsICAgIDE3LCAgICAgMCwgICAgMTgsICAgICAwLCAgICAxOSwgICAgIDAsCi0gICAgMjAsICAgICAwLCAgICAyMSwgICAgIDAsICAgIDIyLCAgICAgMCwgICAgIDgsICAgICAwLCAgICA2MywgICAgIDAsCi0gICAgNjksICAgIDI5LCAgICA2MywgICAgIDAsICAgICA3LCAgICAgMCwgICAgIDgsICAgICAwLCAgICAgOSwgICAgIDAsCi0gICAgIDcsICAgICAwCi19OwotCi0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotc3RhdGljIGNvbnN0IHNob3J0IHl5cmxpbmVbXSA9IHsgMCwKLSAgIDIyMSwgICAyMjIsICAgMjI1LCAgIDIzMSwgICAyMzYsICAgMjM5LCAgIDI0MiwgICAyNDYsICAgMjUwLCAgIDI1NCwKLSAgIDI2MywgICAyNjUsICAgMjcxLCAgIDI3NCwgICAyNzgsICAgMjgxLCAgIDI4NSwgICAyOTAsICAgMjk0LCAgIDI5OCwKLSAgIDMwNiwgICAzMTAsICAgMzE0LCAgIDMxOCwgICAzMjIsICAgMzI2LCAgIDMzMCwgICAzMzQsICAgMzM4LCAgIDM0MiwKLSAgIDM0NiwgICAzNTAsICAgMzU0LCAgIDM1OCwgICAzNjIsICAgMzY2LCAgIDM3MCwgICAzNzQsICAgMzc5LCAgIDM4MywKLSAgIDM4NywgICAzOTMsICAgNDAwLCAgIDQwOSwgICA0MTYsICAgNDE5LCAgIDQyMiwgICA0MzAsICAgNDM3LCAgIDQ0NSwKLSAgIDQ4OSwgICA0OTIsICAgNDkzLCAgIDUzNiwgICA1MzgsICAgNTQwLCAgIDU0MiwgICA1NDQsICAgNTQ3LCAgIDU0OSwKLSAgIDU1MSwgICA1NTUsICAgNTU3LCAgIDU2MiwgICA1NjQsICAgNTY2LCAgIDU2OCwgICA1NzAsICAgNTcyLCAgIDU3NCwKLSAgIDU3NiwgICA1NzgsICAgNTgwLCAgIDU4MiwgICA1ODQsICAgNTg2LCAgIDU5MCwgICA1OTQsICAgNTk5LCAgIDYwNiwKLSAgIDYwOCwgICA2MTAsICAgNjE0Ci19OwotI2VuZGlmCi0KLQotI2lmIFlZREVCVUcgIT0gMCB8fCBkZWZpbmVkIChZWUVSUk9SX1ZFUkJPU0UpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeXl0bmFtZVtdID0geyAgICIkIiwiZXJyb3IiLCIkdW5kZWZpbmVkLiIsIklOVCIsIkZMT0FUIiwKLSJTVFJJTkdfTElURVJBTCIsIkJPT0xFQU5fTElURVJBTCIsIk5BTUUiLCJUWVBFTkFNRSIsIk5BTUVfT1JfSU5UIiwiU0laRU9GIiwKLSJFUlJPUiIsIklOVF9LRVlXT1JEIiwiSU5UX1MyX0tFWVdPUkQiLCJMT0dJQ0FMX1MxX0tFWVdPUkQiLCJMT0dJQ0FMX1MyX0tFWVdPUkQiLAotIkxPR0lDQUxfS0VZV09SRCIsIlJFQUxfS0VZV09SRCIsIlJFQUxfUzhfS0VZV09SRCIsIlJFQUxfUzE2X0tFWVdPUkQiLCJDT01QTEVYX1M4X0tFWVdPUkQiLAotIkNPTVBMRVhfUzE2X0tFWVdPUkQiLCJDT01QTEVYX1MzMl9LRVlXT1JEIiwiQk9PTF9BTkQiLCJCT09MX09SIiwiQk9PTF9OT1QiLAotIkNIQVJBQ1RFUiIsIlZBUklBQkxFIiwiQVNTSUdOX01PRElGWSIsIicsJyIsIkFCT1ZFX0NPTU1BIiwiJz0nIiwiJz8nIiwiJ3wnIiwKLSInXiciLCInJiciLCJFUVVBTCIsIk5PVEVRVUFMIiwiTEVTU1RIQU4iLCJHUkVBVEVSVEhBTiIsIkxFUSIsIkdFUSIsIkxTSCIsIlJTSCIsCi0iJ0AnIiwiJysnIiwiJy0nIiwiJyonIiwiJy8nIiwiJyUnIiwiVU5BUlkiLCInKCciLCInKSciLCInficiLCInOiciLCJzdGFydCIsCi0idHlwZV9leHAiLCJleHAiLCJAMSIsImFyZ2xpc3QiLCJzdWJzdHJpbmciLCJjb21wbGV4bnVtIiwidmFyaWFibGUiLCJ0eXBlIiwicHR5cGUiLAotImFic19kZWNsIiwiZGlyZWN0X2Fic19kZWNsIiwiZnVuY19tb2QiLCJ0eXBlYmFzZSIsIm5vbmVtcHR5X3R5cGVsaXN0IiwibmFtZV9ub3RfdHlwZW5hbWUiLCBOVUxMCi19OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXIxW10gPSB7ICAgICAwLAotICAgIDU1LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LAotICAgIDU4LCAgICA1NywgICAgNTksICAgIDU5LCAgICA1OSwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNTcsICAgIDU3LAotICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LAotICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LAotICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU3LCAgICA1NywgICAgNTcsICAgIDYyLAotICAgIDYzLCAgICA2NCwgICAgNjQsICAgIDY1LCAgICA2NSwgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjYsICAgIDY2LAotICAgIDY2LCAgICA2NywgICAgNjcsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LAotICAgIDY4LCAgICA2OCwgICAgNjgsICAgIDY4LCAgICA2OCwgICAgNjgsICAgIC0xLCAgICA2OSwgICAgNjksICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgNzAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXIyW10gPSB7ICAgICAwLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAotICAgICAwLCAgICAgNSwgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICA0LAotICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLAotICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLAotICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICA0LCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICAxLCAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAyLAotICAgICAxLCAgICAgMiwgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLAotICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLAotICAgICAxLCAgICAgMSwgICAgIDEKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0geyAgICAgMCwKLSAgICA0MiwgICAgNDQsICAgIDQ5LCAgICA0OCwgICAgODMsICAgIDY0LCAgICA0MywgICAgIDAsICAgIDY1LCAgICA2NiwKLSAgICA3MCwgICAgNjksICAgIDY4LCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwKLSAgICA2NywgICAgNDYsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDIsICAgICAxLCAgICA0NSwKLSAgICAgMywgICAgNTEsICAgIDUyLCAgICA1MCwgICAgIDAsICAgIDEwLCAgICAgOCwgICAgIDYsICAgICA3LCAgICAgNSwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgOSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDExLCAgICA1NiwgICAgNTQsICAgICAwLCAgICA1MywKLSAgICA1OCwgICAgNjEsICAgICAwLCAgICAgMCwgICAgIDQsICAgIDE5LCAgICAgMCwgICAgMzgsICAgIDM5LCAgICA0MSwKLSAgICA0MCwgICAgMzcsICAgIDM2LCAgICAzNSwgICAgMjksICAgIDMwLCAgICAzMywgICAgMzQsICAgIDMxLCAgICAzMiwKLSAgICAyNywgICAgMjgsICAgIDIxLCAgICAyNSwgICAgMjYsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDEzLCAgICA1NywKLSAgICA1NSwgICAgNjIsICAgIDc4LCAgICAgMCwgICAgIDAsICAgICAwLCAgICA2MCwgICAgNDcsICAgIDE4LCAgICAyMCwKLSAgICAxNCwgICAgIDAsICAgIDE1LCAgICA1OSwgICAgIDAsICAgIDYzLCAgICAgMCwgICAgIDAsICAgIDEyLCAgICA3OSwKLSAgICAxNywgICAgMTYsICAgICAwLCAgICAgMCwgICAgIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmdvdG9bXSA9IHsgICAxMjMsCi0gICAgMjgsICAgIDQxLCAgICA5OSwgICAxMTIsICAgMTEzLCAgICA0MiwgICAgMzAsICAgMTAzLCAgICAzMiwgICAgNzAsCi0gICAgNzEsICAgIDcyLCAgICAzMywgICAxMDUsICAgIDM0Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwYWN0W10gPSB7ICAgIDc1LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDEyNiwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMTM1LAotLTMyNzY4LC0zMjc2OCwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAgNzUsICAgMTM1LC0zMjc2OCwgICAzMDksLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwgICAtMzQsLTMyNzY4LCAgICA3NSwgICAtNDksICAgLTQ5LCAgIC00OSwgICAtNDksICAgLTQ5LAotICAgMjc5LCAgIC00NiwgICAtNDUsICAgLTQ5LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LAotICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LAotICAgMTM1LCAgIDEzNSwgICAxMzUsICAgMTM1LCAgIDEzNSwtMzI3NjgsICAgLTM0LCAgIC0zNCwgICAyMDYsLTMyNzY4LAotICAgLTQyLC0zMjc2OCwgICAtMzYsICAgMTM1LC0zMjc2OCwtMzI3NjgsICAgMTM1LCAgIDM1NSwgICAzMzYsICAgMzA5LAotICAgMzA5LCAgIDM5MCwgICA0MDcsICAgMTYxLCAgIDIyMSwgICAyMjEsICAgLTExLCAgIC0xMSwgICAtMTEsICAgLTExLAotICAgIDIyLCAgICAyMiwgICAgNTgsICAgLTM3LCAgIC0zNywgICAtNDksICAgLTQ5LCAgIC00OSwgICAxMzUsLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgLTMzLCAgIC0yNiwgICAyMzAsLTMyNzY4LCAgIDE4NiwgICAzMDksICAgLTQ5LAotICAgMjUwLCAgIC0yNCwtMzI3NjgsLTMyNzY4LCAgIDM5NywtMzI3NjgsICAgMTM1LCAgIDEzNSwtMzI3NjgsLTMyNzY4LAotICAgMzA5LCAgIDMwOSwgICAgMTUsICAgIDE4LC0zMjc2OAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGdvdG9bXSA9IHstMzI3NjgsCi0tMzI3NjgsICAgICAwLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgICA0LC0zMjc2OCwgICAtMjUsCi0tMzI3NjgsICAgLTUwLC0zMjc2OCwtMzI3NjgsLTMyNzY4Ci19OwotCi0KLSNkZWZpbmUJWVlMQVNUCQk0NTgKLQotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXl0YWJsZVtdID0geyAgICAyOSwKLSAgICA2NywgICAgNjYsICAgMTE1LCAgICAzMSwgICAxMTgsICAgIDc2LCAgICA3NywgICAgMzYsICAgMTA2LCAgICA2MywKLSAgICA2NCwgICAgNjUsICAgIDY4LCAgICA2NiwgICAxMjQsICAgMTA4LCAgICA2OSwgICAxMjUsICAgMTE0LCAgICAzNywKLSAgIDEwNywgICAgIDAsICAgIDM4LCAgICAzOSwgICAgNDAsICAgMTE2LCAgICA0NCwgICAxMTksICAgICAwLCAgICA0MywKLSAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDczLCAgICA2NiwKLSAgICAgMCwgICAxMDAsICAgMTAxLCAgIDEwNCwgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywKLSAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgODgsICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MywKLSAgICA5NCwgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwKLSAgICA2NSwgICAgIDAsICAgIDY2LCAgIDEwOSwgICAgIDAsICAgICAwLCAgIDExMCwgICAgIDEsICAgICAyLCAgICAgMywKLSAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICAwLCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwKLSAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgIDAsICAgMTExLCAgICAyMCwKLSAgICAyMSwgICAgMjIsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAxMTAsICAgIDY2LCAgICAyMywKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDEyMSwgICAxMjIsICAgMTIwLCAgICAgMCwKLSAgICAyNCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI2LCAgICAgMCwgICAgMjcsICAgICAxLCAgICAgMiwKLSAgICAgMywgICAgIDQsICAgICA1LCAgICAgMCwgICAgIDcsICAgICA4LCAgICAgMCwgICAgIDEsICAgICAyLCAgICAgMywKLSAgICAgNCwgICAgIDUsICAgICAwLCAgICAgNywgICAgIDgsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAyMCwgICAgIDAsICAgIDIyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyMCwKLSAgICAyMywgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyMywKLSAgICAgMCwgICAgMjQsICAgIDI1LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAzNSwgICAgIDAsICAgIDI3LCAgICAgMCwKLSAgICAyNCwgICAgMjUsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI2LCAgICAgMCwgICAgMjcsICAgICAxLCAgICAgMiwKLSAgICAgMywgICAgIDQsICAgICA1LCAgICAgMCwgICAgIDcsICAgICA4LCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwKLSAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwKLSAgICAyMCwgICAgNjYsICAgIDIyLCAgICAgNiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDksICAgIDEwLCAgICAxMSwKLSAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgMjEsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyNiwgICAgIDYsICAgIDI3LCAgICAgMCwKLSAgICA2NywgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywKLSAgICAxOCwgICAgMTksICAgIDY4LCAgICAgMCwgICAgIDAsICAgIDIxLCAgICA2OSwgICAxMDIsICAgIDU0LCAgICA1NSwKLSAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwKLSAgICAgMCwgICAgNjYsICAgIDQ1LCAgICA0NiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDcsICAgICAwLCAgICAgMCwKLSAgICA0OCwgICAxMDIsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICAgMCwKLSAgICA2NiwgICAgNDUsICAgIDQ2LCAgIDExNywgICAgIDAsICAgICAwLCAgICA0NywgICAgNzQsICAgICAwLCAgICA0OCwKLSAgICAgMCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywKLSAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgICAwLCAgICA2NiwKLSAgICA3NSwgICAgNDUsICAgIDQ2LCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0NywgICAgIDAsICAgICAwLCAgICA0OCwKLSAgICAgMCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywKLSAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDQ1LCAgICA2NiwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ5LCAgICA1MCwKLSAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwKLSAgICA2MSwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgICAwLCAgICA2NiwgICAgNDksICAgIDUwLCAgICA1MSwKLSAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwKLSAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgIDYsICAgIDY2LCAgICAgMCwgICAgIDAsICAgICA5LCAgICAxMCwKLSAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgIDIxLCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwKLSAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICAgMCwKLSAgICA2NiwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU4LCAgICA1OSwKLSAgICA2MCwgICAgNjEsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICAgMCwgICAgNjYKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPSB7ICAgICAwLAotICAgIDM1LCAgICA1MSwgICAgMjksICAgICAwLCAgICAyOSwgICAgNTIsICAgIDUyLCAgICAgOCwgICAgNTEsICAgIDQ3LAotICAgIDQ4LCAgICA0OSwgICAgNDcsICAgIDUxLCAgICAgMCwgICAgNTIsICAgIDUxLCAgICAgMCwgICAgNTIsICAgIDIwLAotICAgIDcxLCAgICAtMSwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgNTIsICAgIDI3LCAgICA1MiwgICAgLTEsICAgIDI2LAotICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgMzUsICAgIDUxLAotICAgIC0xLCAgICA2NywgICAgNjgsICAgIDY5LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIDUwLAotICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLAotICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LAotICAgIDQ5LCAgICAtMSwgICAgNTEsICAgIDc0LCAgICAtMSwgICAgLTEsICAgIDc3LCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgLTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LAotICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAtMSwgICAgOTksICAgIDI1LAotICAgIDI2LCAgICAyNywgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgIDEwOCwgICAgNTEsICAgIDM1LAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgMTE3LCAgIDExOCwgICAxMTUsICAgIC0xLAotICAgIDQ2LCAgICA0NywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTEsICAgIC0xLCAgICA1MywgICAgIDMsICAgICA0LAotICAgICA1LCAgICAgNiwgICAgIDcsICAgIC0xLCAgICAgOSwgICAgMTAsICAgIC0xLCAgICAgMywgICAgIDQsICAgICA1LAotICAgICA2LCAgICAgNywgICAgLTEsICAgICA5LCAgICAxMCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAotICAgIDI1LCAgICAtMSwgICAgMjcsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDI1LAotICAgIDM1LCAgICAyNywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDM1LAotICAgIC0xLCAgICA0NiwgICAgNDcsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDUxLCAgICAtMSwgICAgNTMsICAgIC0xLAotICAgIDQ2LCAgICA0NywgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNTEsICAgIC0xLCAgICA1MywgICAgIDMsICAgICA0LAotICAgICA1LCAgICAgNiwgICAgIDcsICAgIC0xLCAgICAgOSwgICAgMTAsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LAotICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LAotICAgIDI1LCAgICA1MSwgICAgMjcsICAgICA4LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAxMiwgICAgMTMsICAgIDE0LAotICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAyNiwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDUxLCAgICAgOCwgICAgNTMsICAgIC0xLAotICAgIDM1LCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAotICAgIDIxLCAgICAyMiwgICAgNDcsICAgIC0xLCAgICAtMSwgICAgMjYsICAgIDUxLCAgICA1MiwgICAgMzgsICAgIDM5LAotICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LAotICAgIC0xLCAgICA1MSwgICAgMjMsICAgIDI0LCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAyOCwgICAgLTEsICAgIC0xLAotICAgIDMxLCAgICA1MiwgICAgMzMsICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLAotICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIC0xLAotICAgIDUxLCAgICAyMywgICAgMjQsICAgIDU0LCAgICAtMSwgICAgLTEsICAgIDI4LCAgICAyOSwgICAgLTEsICAgIDMxLAotICAgIC0xLCAgICAzMywgICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLAotICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgLTEsICAgIDUxLAotICAgIDUyLCAgICAyMywgICAgMjQsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDI4LCAgICAtMSwgICAgLTEsICAgIDMxLAotICAgIC0xLCAgICAzMywgICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLAotICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgMjMsICAgIDUxLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzMsICAgIDM0LAotICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAotICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgLTEsICAgIDUxLCAgICAzMywgICAgMzQsICAgIDM1LAotICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LAotICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ5LCAgICAgOCwgICAgNTEsICAgIC0xLCAgICAtMSwgICAgMTIsICAgIDEzLAotICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgMjYsICAgIDM0LCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLAotICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIC0xLAotICAgIDUxLCAgICAzNSwgICAgMzYsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLAotICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAgNDksICAgIC0xLCAgICA1MQotfTsKLS8qIC0qLUMtKi0gIE5vdGUgc29tZSBjb21waWxlcnMgY2hva2Ugb24gY29tbWVudHMgb24gYCNsaW5lJyBsaW5lcy4gICovCi0jbGluZSAzICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotCi0vKiBTa2VsZXRvbiBvdXRwdXQgcGFyc2VyIGZvciBiaXNvbiwKLSAgIENvcHlyaWdodCAoQykgMTk4NCwgMTk4OSwgMTk5MCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLS8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHdoZW4gdGhpcyBmaWxlIGlzIGNvcGllZCBieSBCaXNvbiBpbnRvIGEKLSAgIEJpc29uIG91dHB1dCBmaWxlLCB5b3UgbWF5IHVzZSB0aGF0IG91dHB1dCBmaWxlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCi0gICBUaGlzIHNwZWNpYWwgZXhjZXB0aW9uIHdhcyBhZGRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0gICBpbiB2ZXJzaW9uIDEuMjQgb2YgQmlzb24uICAqLwotCi0jaWZuZGVmIGFsbG9jYQotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZSAvKiBub3QgR05VIEMuICAqLwotI2lmICghZGVmaW5lZCAoX19TVERDX18pICYmIGRlZmluZWQgKHNwYXJjKSkgfHwgZGVmaW5lZCAoX19zcGFyY19fKSB8fCBkZWZpbmVkIChfX3NwYXJjKSB8fCBkZWZpbmVkIChfX3NnaSkKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLSNlbHNlIC8qIG5vdCBzcGFyYyAqLwotI2lmIGRlZmluZWQgKE1TRE9TKSAmJiAhZGVmaW5lZCAoX19UVVJCT0NfXykKLSNlbHNlIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLwotI2lmIGRlZmluZWQoX0FJWCkKLSAjcHJhZ21hIGFsbG9jYQotI2Vsc2UgLyogbm90IE1TRE9TLCBfX1RVUkJPQ19fLCBvciBfQUlYICovCi0jaWZkZWYgX19ocHV4Ci0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotdm9pZCAqYWxsb2NhICh1bnNpZ25lZCBpbnQpOwotfTsKLSNlbHNlIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotdm9pZCAqYWxsb2NhICgpOwotI2VuZGlmIC8qIG5vdCBfX2NwbHVzcGx1cyAqLwotI2VuZGlmIC8qIF9faHB1eCAqLwotI2VuZGlmIC8qIG5vdCBfQUlYICovCi0jZW5kaWYgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCi0jZW5kaWYgLyogbm90IHNwYXJjLiAgKi8KLSNlbmRpZiAvKiBub3QgR05VIEMuICAqLwotI2VuZGlmIC8qIGFsbG9jYSBub3QgZGVmaW5lZC4gICovCi0KLS8qIFRoaXMgaXMgdGhlIHBhcnNlciBjb2RlIHRoYXQgaXMgd3JpdHRlbiBpbnRvIGVhY2ggYmlzb24gcGFyc2VyCi0gIHdoZW4gdGhlICVzZW1hbnRpY19wYXJzZXIgZGVjbGFyYXRpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZ3JhbW1hci4KLSAgSXQgd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgaGFpcnkgcGFyc2VyCi0gIHVzZWQgd2hlbiAlc2VtYW50aWNfcGFyc2VyIGlzIHNwZWNpZmllZC4gICovCi0KLS8qIE5vdGU6IHRoZXJlIG11c3QgYmUgb25seSBvbmUgZG9sbGFyIHNpZ24gaW4gdGhpcyBmaWxlLgotICAgSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGxpc3Qgb2YgYWN0aW9ucywgZWFjaCBhY3Rpb24KLSAgIGFzIG9uZSBjYXNlIG9mIHRoZSBzd2l0Y2guICAqLwotCi0jZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCi0jZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKLSNkZWZpbmUgWVlFTVBUWQkJLTIKLSNkZWZpbmUgWVlFT0YJCTAKLSNkZWZpbmUgWVlBQ0NFUFQJcmV0dXJuKDApCi0jZGVmaW5lIFlZQUJPUlQgCXJldHVybigxKQotI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQotLyogTGlrZSBZWUVSUk9SIGV4Y2VwdCBkbyBjYWxsIHl5ZXJyb3IuCi0gICBUaGlzIHJlbWFpbnMgaGVyZSB0ZW1wb3JhcmlseSB0byBlYXNlIHRoZQotICAgdHJhbnNpdGlvbiB0byB0aGUgbmV3IG1lYW5pbmcgb2YgWVlFUlJPUiwgZm9yIEdDQy4KLSAgIE9uY2UgR0NDIHZlcnNpb24gMiBoYXMgc3VwcGxhbnRlZCB2ZXJzaW9uIDEsIHRoaXMgY2FuIGdvLiAgKi8KLSNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCi0jZGVmaW5lIFlZUkVDT1ZFUklORygpICAoISF5eWVycnN0YXR1cykKLSNkZWZpbmUgWVlCQUNLVVAodG9rZW4sIHZhbHVlKSBcCi1kbwkJCQkJCQkJXAotICBpZiAoeXljaGFyID09IFlZRU1QVFkgJiYgeXlsZW4gPT0gMSkJCQkJXAotICAgIHsgeXljaGFyID0gKHRva2VuKSwgeXlsdmFsID0gKHZhbHVlKTsJCQlcCi0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CQkJCVwKLSAgICAgIFlZUE9QU1RBQ0s7CQkJCQkJXAotICAgICAgZ290byB5eWJhY2t1cDsJCQkJCQlcCi0gICAgfQkJCQkJCQkJXAotICBlbHNlCQkJCQkJCQlcCi0gICAgeyB5eWVycm9yICgic3ludGF4IGVycm9yOiBjYW5ub3QgYmFjayB1cCIpOyBZWUVSUk9SOyB9CVwKLXdoaWxlICgwKQotCi0jZGVmaW5lIFlZVEVSUk9SCTEKLSNkZWZpbmUgWVlFUlJDT0RFCTI1NgotCi0jaWZuZGVmIFlZUFVSRQotI2RlZmluZSBZWUxFWAkJeXlsZXgoKQotI2VuZGlmCi0KLSNpZmRlZiBZWVBVUkUKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSNpZmRlZiBZWUxFWF9QQVJBTQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYywgWVlMRVhfUEFSQU0pCi0jZWxzZQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgJnl5bGxvYykKLSNlbmRpZgotI2Vsc2UgLyogbm90IFlZTFNQX05FRURFRCAqLwotI2lmZGVmIFlZTEVYX1BBUkFNCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsLCBZWUxFWF9QQVJBTSkKLSNlbHNlCi0jZGVmaW5lIFlZTEVYCQl5eWxleCgmeXlsdmFsKQotI2VuZGlmCi0jZW5kaWYgLyogbm90IFlZTFNQX05FRURFRCAqLwotI2VuZGlmCi0KLS8qIElmIG5vbnJlZW50cmFudCwgZ2VuZXJhdGUgdGhlIHZhcmlhYmxlcyBoZXJlICovCi0KLSNpZm5kZWYgWVlQVVJFCi0KLWludAl5eWNoYXI7CQkJLyogIHRoZSBsb29rYWhlYWQgc3ltYm9sCQkqLwotWVlTVFlQRQl5eWx2YWw7CQkJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBvZiB0aGUJCSovCi0JCQkJLyogIGxvb2thaGVhZCBzeW1ib2wJCQkqLwotCi0jaWZkZWYgWVlMU1BfTkVFREVECi1ZWUxUWVBFIHl5bGxvYzsJCQkvKiAgbG9jYXRpb24gZGF0YSBmb3IgdGhlIGxvb2thaGVhZAkqLwotCQkJCS8qICBzeW1ib2wJCQkJKi8KLSNlbmRpZgotCi1pbnQgeXluZXJyczsJCQkvKiAgbnVtYmVyIG9mIHBhcnNlIGVycm9ycyBzbyBmYXIgICAgICAgKi8KLSNlbmRpZiAgLyogbm90IFlZUFVSRSAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi1pbnQgeXlkZWJ1ZzsJCQkvKiAgbm9uemVybyBtZWFucyBwcmludCBwYXJzZSB0cmFjZQkqLwotLyogU2luY2UgdGhpcyBpcyB1bmluaXRpYWxpemVkLCBpdCBkb2VzIG5vdCBzdG9wIG11bHRpcGxlIHBhcnNlcnMKLSAgIGZyb20gY29leGlzdGluZy4gICovCi0jZW5kaWYKLQotLyogIFlZSU5JVERFUFRIIGluZGljYXRlcyB0aGUgaW5pdGlhbCBzaXplIG9mIHRoZSBwYXJzZXIncyBzdGFja3MJKi8KLQotI2lmbmRlZglZWUlOSVRERVBUSAotI2RlZmluZSBZWUlOSVRERVBUSCAyMDAKLSNlbmRpZgotCi0vKiAgWVlNQVhERVBUSCBpcyB0aGUgbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8KLSAgICAoZWZmZWN0aXZlIG9ubHkgaWYgdGhlIGJ1aWx0LWluIHN0YWNrIGV4dGVuc2lvbiBtZXRob2QgaXMgdXNlZCkuICAqLwotCi0jaWYgWVlNQVhERVBUSCA9PSAwCi0jdW5kZWYgWVlNQVhERVBUSAotI2VuZGlmCi0KLSNpZm5kZWYgWVlNQVhERVBUSAotI2RlZmluZSBZWU1BWERFUFRIIDEwMDAwCi0jZW5kaWYKLQotLyogUHJldmVudCB3YXJuaW5nIGlmIC1Xc3RyaWN0LXByb3RvdHlwZXMuICAqLwotI2lmZGVmIF9fR05VQ19fCi1pbnQgeXlwYXJzZSAodm9pZCk7Ci0jZW5kaWYKLQwKLSNpZiBfX0dOVUNfXyA+IDEJCS8qIEdOVSBDIGFuZCBHTlUgQysrIGRlZmluZSB0aGlzLiAgKi8KLSNkZWZpbmUgX195eV9tZW1jcHkoVE8sRlJPTSxDT1VOVCkJX19idWlsdGluX21lbWNweShUTyxGUk9NLENPVU5UKQotI2Vsc2UJCQkJLyogbm90IEdOVSBDIG9yIEMrKyAqLwotI2lmbmRlZiBfX2NwbHVzcGx1cwotCi0vKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcwotICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLwotc3RhdGljIHZvaWQKLV9feXlfbWVtY3B5ICh0bywgZnJvbSwgY291bnQpCi0gICAgIGNoYXIgKnRvOwotICAgICBjaGFyICpmcm9tOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOwotICByZWdpc3RlciBjaGFyICp0ID0gdG87Ci0gIHJlZ2lzdGVyIGludCBpID0gY291bnQ7Ci0KLSAgd2hpbGUgKGktLSA+IDApCi0gICAgKnQrKyA9ICpmKys7Ci19Ci0KLSNlbHNlIC8qIF9fY3BsdXNwbHVzICovCi0KLS8qIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIGF2b2lkIGluY29tcGF0aWJpbGl0aWVzCi0gICBpbiBhdmFpbGFibGUgYnVpbHQtaW4gZnVuY3Rpb25zIG9uIHZhcmlvdXMgc3lzdGVtcy4gICovCi1zdGF0aWMgdm9pZAotX195eV9tZW1jcHkgKGNoYXIgKnRvLCBjaGFyICpmcm9tLCBpbnQgY291bnQpCi17Ci0gIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOwotICByZWdpc3RlciBjaGFyICp0ID0gdG87Ci0gIHJlZ2lzdGVyIGludCBpID0gY291bnQ7Ci0KLSAgd2hpbGUgKGktLSA+IDApCi0gICAgKnQrKyA9ICpmKys7Ci19Ci0KLSNlbmRpZgotI2VuZGlmCi0MCi0jbGluZSAxOTYgIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0KLS8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKLSAgIGludG8geXlwYXJzZS4gIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSB0eXBlIHZvaWQgKi4KLSAgIEl0IHNob3VsZCBhY3R1YWxseSBwb2ludCB0byBhbiBvYmplY3QuCi0gICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAotICAgdG8gdGhlIHByb3BlciBwb2ludGVyIHR5cGUuICAqLwotCi0jaWZkZWYgWVlQQVJTRV9QQVJBTQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQgKllZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCi0jZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgdm9pZCAqWVlQQVJTRV9QQVJBTTsKLSNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNlbHNlIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAotI2VuZGlmIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCi0KLWludAoteXlwYXJzZShZWVBBUlNFX1BBUkFNX0FSRykKLSAgICAgWVlQQVJTRV9QQVJBTV9ERUNMCi17Ci0gIHJlZ2lzdGVyIGludCB5eXN0YXRlOwotICByZWdpc3RlciBpbnQgeXluOwotICByZWdpc3RlciBzaG9ydCAqeXlzc3A7Ci0gIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOwotICBpbnQgeXllcnJzdGF0dXM7CS8qICBudW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkICovCi0gIGludCB5eWNoYXIxID0gMDsJCS8qICBsb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlciAqLwotCi0gIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzdGF0ZSBzdGFjawkJCSovCi0gIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHNlbWFudGljIHZhbHVlIHN0YWNrCQkqLwotCi0gIHNob3J0ICp5eXNzID0geXlzc2E7CQkvKiAgcmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzICovCi0gIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsJLyogIHRvIGFsbG93IHl5b3ZlcmZsb3cgdG8geHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUgKi8KLQotI2lmZGVmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bHNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBsb2NhdGlvbiBzdGFjawkJCSovCi0gIFlZTFRZUEUgKnl5bHMgPSB5eWxzYTsKLSAgWVlMVFlQRSAqeXlsc3A7Ci0KLSNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tLCB5eWxzcC0tKQotI2Vsc2UKLSNkZWZpbmUgWVlQT1BTVEFDSyAgICh5eXZzcC0tLCB5eXNzcC0tKQotI2VuZGlmCi0KLSAgaW50IHl5c3RhY2tzaXplID0gWVlJTklUREVQVEg7Ci0KLSNpZmRlZiBZWVBVUkUKLSAgaW50IHl5Y2hhcjsKLSAgWVlTVFlQRSB5eWx2YWw7Ci0gIGludCB5eW5lcnJzOwotI2lmZGVmIFlZTFNQX05FRURFRAotICBZWUxUWVBFIHl5bGxvYzsKLSNlbmRpZgotI2VuZGlmCi0KLSAgWVlTVFlQRSB5eXZhbDsJCS8qICB0aGUgdmFyaWFibGUgdXNlZCB0byByZXR1cm4JCSovCi0JCQkJLyogIHNlbWFudGljIHZhbHVlcyBmcm9tIHRoZSBhY3Rpb24JKi8KLQkJCQkvKiAgcm91dGluZXMJCQkJKi8KLQotICBpbnQgeXlsZW47Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIik7Ci0jZW5kaWYKLQotICB5eXN0YXRlID0gMDsKLSAgeXllcnJzdGF0dXMgPSAwOwotICB5eW5lcnJzID0gMDsKLSAgeXljaGFyID0gWVlFTVBUWTsJCS8qIENhdXNlIGEgdG9rZW4gdG8gYmUgcmVhZC4gICovCi0KLSAgLyogSW5pdGlhbGl6ZSBzdGFjayBwb2ludGVycy4KLSAgICAgV2FzdGUgb25lIGVsZW1lbnQgb2YgdmFsdWUgYW5kIGxvY2F0aW9uIHN0YWNrCi0gICAgIHNvIHRoYXQgdGhleSBzdGF5IG9uIHRoZSBzYW1lIGxldmVsIGFzIHRoZSBzdGF0ZSBzdGFjay4KLSAgICAgVGhlIHdhc3RlZCBlbGVtZW50cyBhcmUgbmV2ZXIgaW5pdGlhbGl6ZWQuICAqLwotCi0gIHl5c3NwID0geXlzcyAtIDE7Ci0gIHl5dnNwID0geXl2czsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgPSB5eWxzOwotI2VuZGlmCi0KLS8qIFB1c2ggYSBuZXcgc3RhdGUsIHdoaWNoIGlzIGZvdW5kIGluICB5eXN0YXRlICAuICAqLwotLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKLSAgIGhhdmUganVzdCBiZWVuIHB1c2hlZC4gc28gcHVzaGluZyBhIHN0YXRlIGhlcmUgZXZlbnMgdGhlIHN0YWNrcy4gICovCi15eW5ld3N0YXRlOgotCi0gICorK3l5c3NwID0geXlzdGF0ZTsKLQotICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKLSAgICB7Ci0gICAgICAvKiBHaXZlIHVzZXIgYSBjaGFuY2UgdG8geHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCi0gICAgICAvKiBVc2UgY29waWVzIG9mIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8gbWVtb3J5LiAqLwotICAgICAgWVlTVFlQRSAqeXl2czEgPSB5eXZzOwotICAgICAgc2hvcnQgKnl5c3MxID0geXlzczsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIFlZTFRZUEUgKnl5bHMxID0geXlsczsKLSNlbmRpZgotCi0gICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KLSAgICAgIGludCBzaXplID0geXlzc3AgLSB5eXNzICsgMTsKLQotI2lmZGVmIHl5b3ZlcmZsb3cKLSAgICAgIC8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mCi0JIHRoZSBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gICovCi0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsCi0JIGJ1dCB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLwotICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICZ5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKLQkJICZ5eXN0YWNrc2l6ZSk7Ci0jZWxzZQotICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKLQkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKLQkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKLQkJICZ5eXN0YWNrc2l6ZSk7Ci0jZW5kaWYKLQotICAgICAgeXlzcyA9IHl5c3MxOyB5eXZzID0geXl2czE7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzID0geXlsczE7Ci0jZW5kaWYKLSNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLSAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLwotICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCi0JewotCSAgeXllcnJvcigicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7Ci0JICByZXR1cm4gMjsKLQl9Ci0gICAgICB5eXN0YWNrc2l6ZSAqPSAyOwotICAgICAgaWYgKHl5c3RhY2tzaXplID4gWVlNQVhERVBUSCkKLQl5eXN0YWNrc2l6ZSA9IFlZTUFYREVQVEg7Ci0gICAgICB5eXNzID0gKHNob3J0ICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eXNzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXlzcywgKGNoYXIgKil5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7Ci0gICAgICB5eXZzID0gKFlZU1RZUEUgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXZzLCAoY2hhciAqKXl5dnMxLCBzaXplICogc2l6ZW9mICgqeXl2c3ApKTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHMgPSAoWVlMVFlQRSAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXlsc3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5bHMsIChjaGFyICopeXlsczEsIHNpemUgKiBzaXplb2YgKCp5eWxzcCkpOwotI2VuZGlmCi0jZW5kaWYgLyogbm8geXlvdmVyZmxvdyAqLwotCi0gICAgICB5eXNzcCA9IHl5c3MgKyBzaXplIC0gMTsKLSAgICAgIHl5dnNwID0geXl2cyArIHNpemUgLSAxOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlsc3AgPSB5eWxzICsgc2l6ZSAtIDE7Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJTdGFjayBzaXplIGluY3JlYXNlZCB0byAlZFxuIiwgeXlzdGFja3NpemUpOwotI2VuZGlmCi0KLSAgICAgIGlmICh5eXNzcCA+PSB5eXNzICsgeXlzdGFja3NpemUgLSAxKQotCVlZQUJPUlQ7Ci0gICAgfQotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiRW50ZXJpbmcgc3RhdGUgJWRcbiIsIHl5c3RhdGUpOwotI2VuZGlmCi0KLSAgZ290byB5eWJhY2t1cDsKLSB5eWJhY2t1cDoKLQotLyogRG8gYXBwcm9wcmlhdGUgcHJvY2Vzc2luZyBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZS4gICovCi0vKiBSZWFkIGEgbG9va2FoZWFkIHRva2VuIGlmIHdlIG5lZWQgb25lIGFuZCBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLS8qIHl5cmVzdW1lOiAqLwotCi0gIC8qIEZpcnN0IHRyeSB0byBkZWNpZGUgd2hhdCB0byBkbyB3aXRob3V0IHJlZmVyZW5jZSB0byBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWRlZmF1bHQ7Ci0KLSAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KLQotICAvKiB5eWNoYXIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0YKLSAgICAgb3IgYSB2YWxpZCB0b2tlbiBpbiBleHRlcm5hbCBmb3JtLiAgKi8KLQotICBpZiAoeXljaGFyID09IFlZRU1QVFkpCi0gICAgewotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJSZWFkaW5nIGEgdG9rZW46ICIpOwotI2VuZGlmCi0gICAgICB5eWNoYXIgPSBZWUxFWDsKLSAgICB9Ci0KLSAgLyogQ29udmVydCB0b2tlbiB0byBpbnRlcm5hbCBmb3JtIChpbiB5eWNoYXIxKSBmb3IgaW5kZXhpbmcgdGFibGVzIHdpdGggKi8KLQotICBpZiAoeXljaGFyIDw9IDApCQkvKiBUaGlzIG1lYW5zIGVuZCBvZiBpbnB1dC4gKi8KLSAgICB7Ci0gICAgICB5eWNoYXIxID0gMDsKLSAgICAgIHl5Y2hhciA9IFlZRU9GOwkJLyogRG9uJ3QgY2FsbCBZWUxFWCBhbnkgbW9yZSAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQlmcHJpbnRmKHN0ZGVyciwgIk5vdyBhdCBlbmQgb2YgaW5wdXQuXG4iKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5Y2hhcjEgPSBZWVRSQU5TTEFURSh5eWNoYXIpOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gICAgICBpZiAoeXlkZWJ1ZykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICJOZXh0IHRva2VuIGlzICVkICglcyIsIHl5Y2hhciwgeXl0bmFtZVt5eWNoYXIxXSk7Ci0JICAvKiBHaXZlIHRoZSBpbmRpdmlkdWFsIHBhcnNlciBhIHdheSB0byBwcmludCB0aGUgcHJlY2lzZSBtZWFuaW5nCi0JICAgICBvZiBhIHRva2VuLCBmb3IgZnVydGhlciBkZWJ1Z2dpbmcgaW5mby4gICovCi0jaWZkZWYgWVlQUklOVAotCSAgWVlQUklOVCAoc3RkZXJyLCB5eWNoYXIsIHl5bHZhbCk7Ci0jZW5kaWYKLQkgIGZwcmludGYgKHN0ZGVyciwgIilcbiIpOwotCX0KLSNlbmRpZgotICAgIH0KLQotICB5eW4gKz0geXljaGFyMTsKLSAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSB5eWNoYXIxKQotICAgIGdvdG8geXlkZWZhdWx0OwotCi0gIHl5biA9IHl5dGFibGVbeXluXTsKLQotICAvKiB5eW4gaXMgd2hhdCB0byBkbyBmb3IgdGhpcyB0b2tlbiB0eXBlIGluIHRoaXMgc3RhdGUuCi0gICAgIE5lZ2F0aXZlID0+IHJlZHVjZSwgLXl5biBpcyBydWxlIG51bWJlci4KLSAgICAgUG9zaXRpdmUgPT4gc2hpZnQsIHl5biBpcyBuZXcgc3RhdGUuCi0gICAgICAgTmV3IHN0YXRlIGlzIGZpbmFsIHN0YXRlID0+IGRvbid0IGJvdGhlciB0byBzaGlmdCwKLSAgICAgICBqdXN0IHJldHVybiBzdWNjZXNzLgotICAgICAwLCBvciBtb3N0IG5lZ2F0aXZlIG51bWJlciA9PiBlcnJvci4gICovCi0KLSAgaWYgKHl5biA8IDApCi0gICAgewotICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCi0JZ290byB5eWVycmxhYjsKLSAgICAgIHl5biA9IC15eW47Ci0gICAgICBnb3RvIHl5cmVkdWNlOwotICAgIH0KLSAgZWxzZSBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycmxhYjsKLQotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSAgLyogU2hpZnQgdGhlIGxvb2thaGVhZCB0b2tlbi4gICovCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyB0b2tlbiAlZCAoJXMpLCAiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotI2VuZGlmCi0KLSAgLyogRGlzY2FyZCB0aGUgdG9rZW4gYmVpbmcgc2hpZnRlZCB1bmxlc3MgaXQgaXMgZW9mLiAgKi8KLSAgaWYgKHl5Y2hhciAhPSBZWUVPRikKLSAgICB5eWNoYXIgPSBZWUVNUFRZOwotCi0gICorK3l5dnNwID0geXlsdmFsOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAqKyt5eWxzcCA9IHl5bGxvYzsKLSNlbmRpZgotCi0gIC8qIGNvdW50IHRva2VucyBzaGlmdGVkIHNpbmNlIGVycm9yOyBhZnRlciB0aHJlZSwgdHVybiBvZmYgZXJyb3Igc3RhdHVzLiAgKi8KLSAgaWYgKHl5ZXJyc3RhdHVzKSB5eWVycnN0YXR1cy0tOwotCi0gIHl5c3RhdGUgPSB5eW47Ci0gIGdvdG8geXluZXdzdGF0ZTsKLQotLyogRG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gICovCi15eWRlZmF1bHQ6Ci0KLSAgeXluID0geXlkZWZhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gMCkKLSAgICBnb3RvIHl5ZXJybGFiOwotCi0vKiBEbyBhIHJlZHVjdGlvbi4gIHl5biBpcyB0aGUgbnVtYmVyIG9mIGEgcnVsZSB0byByZWR1Y2Ugd2l0aC4gICovCi15eXJlZHVjZToKLSAgeXlsZW4gPSB5eXIyW3l5bl07Ci0gIGlmICh5eWxlbiA+IDApCi0gICAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsgLyogaW1wbGVtZW50IGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFjdGlvbiAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmcHJpbnRmIChzdGRlcnIsICJSZWR1Y2luZyB2aWEgcnVsZSAlZCAobGluZSAlZCksICIsCi0JICAgICAgIHl5biwgeXlybGluZVt5eW5dKTsKLQotICAgICAgLyogUHJpbnQgdGhlIHN5bWJvbHMgYmVpbmcgcmVkdWNlZCwgYW5kIHRoZWlyIHJlc3VsdC4gICovCi0gICAgICBmb3IgKGkgPSB5eXByaHNbeXluXTsgeXlyaHNbaV0gPiAwOyBpKyspCi0JZnByaW50ZiAoc3RkZXJyLCAiJXMgIiwgeXl0bmFtZVt5eXJoc1tpXV0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIC0+ICVzXG4iLCB5eXRuYW1lW3l5cjFbeXluXV0pOwotICAgIH0KLSNlbmRpZgotCi0KLSAgc3dpdGNoICh5eW4pIHsKLQotY2FzZSAzOgotI2xpbmUgMjI2ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlKHl5dnNwWzBdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDoKLSNsaW5lIDIzMiAiZi1leHAueSIKLXsgOwotICAgIGJyZWFrO30KLWNhc2UgNToKLSNsaW5lIDIzNyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjoKLSNsaW5lIDI0MCAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQUREUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDc6Ci0jbGluZSAyNDMgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX05FRyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg6Ci0jbGluZSAyNDcgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0xPR0lDQUxfTk9UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOToKLSNsaW5lIDI1MSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ09NUExFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwOgotI2xpbmUgMjU1ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9TSVpFT0YpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMToKLSNsaW5lIDI2NCAiZi1leHAueSIKLXsgc3RhcnRfYXJnbGlzdCAoKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTI6Ci0jbGluZSAyNjYgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9GNzdfVU5ERVRFUk1JTkVEX0FSR0xJU1QpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBlbmRfYXJnbGlzdCAoKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9GNzdfVU5ERVRFUk1JTkVEX0FSR0xJU1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNDoKLSNsaW5lIDI3NSAiZi1leHAueSIKLXsgYXJnbGlzdF9sZW4gPSAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNToKLSNsaW5lIDI3OSAiZi1leHAueSIKLXsgYXJnbGlzdF9sZW4gPSAyOzsKLSAgICBicmVhazt9Ci1jYXNlIDE2OgotI2xpbmUgMjgyICJmLWV4cC55IgoteyBhcmdsaXN0X2xlbisrOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxNzoKLSNsaW5lIDI4NiAiZi1leHAueSIKLXsgOwotICAgIGJyZWFrO30KLWNhc2UgMTg6Ci0jbGluZSAyOTEgImYtZXhwLnkiCi17IDsKLSAgICBicmVhazt9Ci1jYXNlIDE5OgotI2xpbmUgMjk1ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShPUF9DT01QTEVYKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjA6Ci0jbGluZSAyOTkgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWy0yXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIxOgotI2xpbmUgMzA3ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVQRUFUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjI6Ci0jbGluZSAzMTEgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9NVUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMzoKLSNsaW5lIDMxNSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0RJVik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI0OgotI2xpbmUgMzE5ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUkVNKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjU6Ci0jbGluZSAzMjMgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BREQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNjoKLSNsaW5lIDMyNyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI3OgotI2xpbmUgMzMxICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTFNIKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjg6Ci0jbGluZSAzMzUgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9SU0gpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyOToKLSNsaW5lIDMzOSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0VRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzA6Ci0jbGluZSAzNDMgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9OT1RFUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDMxOgotI2xpbmUgMzQ3ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTEVRKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzI6Ci0jbGluZSAzNTEgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HRVEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMzoKLSNsaW5lIDM1NSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFU1MpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNDoKLSNsaW5lIDM1OSAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dUUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM1OgotI2xpbmUgMzYzICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9BTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNjoKLSNsaW5lIDM2NyAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0JJVFdJU0VfWE9SKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzc6Ci0jbGluZSAzNzEgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9CSVRXSVNFX0lPUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM4OgotI2xpbmUgMzc1ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9BTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzOToKLSNsaW5lIDM4MCAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MDoKLSNsaW5lIDM4NCAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQxOgotI2xpbmUgMzg4ICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOX01PRElGWSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlICh5eXZzcFstMV0ub3Bjb2RlKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FTU0lHTl9NT0RJRlkpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0MjoKLSNsaW5lIDM5NCAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWzBdLnR5cGVkX3ZhbC50eXBlKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkoeXl2c3BbMF0udHlwZWRfdmFsLnZhbCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQzOgotI2xpbmUgNDAxICJmLWV4cC55IgoteyBZWVNUWVBFIHZhbDsKLQkJCSAgcGFyc2VfbnVtYmVyICh5eXZzcFswXS5zc3ltLnN0b2tlbi5wdHIsIHl5dnNwWzBdLnNzeW0uc3Rva2VuLmxlbmd0aCwgMCwgJnZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh2YWwudHlwZWRfdmFsLnR5cGUpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKXZhbC50eXBlZF92YWwudmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NDoKLSNsaW5lIDQxMCAiZi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2ZfcmVhbF9zOCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfZGJsY3N0ICh5eXZzcFswXS5kdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ3OgotI2xpbmUgNDIzICJmLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2ZfaW50ZWdlcik7Ci0JCQkgIENIRUNLX1RZUEVERUYgKHl5dnNwWy0xXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgVFlQRV9MRU5HVEggKHl5dnNwWy0xXS50dmFsKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDg6Ci0jbGluZSA0MzEgImYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9CT09MKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgeXl2c3BbMF0ubHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9CT09MKTsKLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDQ5OgotI2xpbmUgNDM4ICJmLWV4cC55IgotewotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU1RSSU5HKTsKLQkJCSAgd3JpdGVfZXhwX3N0cmluZyAoeXl2c3BbMF0uc3ZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TVFJJTkcpOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNTA6Ci0jbGluZSA0NDYgImYtZXhwLnkiCi17IHN0cnVjdCBzeW1ib2wgKnN5bSA9IHl5dnNwWzBdLnNzeW0uc3ltOwotCi0JCQkgIGlmIChzeW0pCi0JCQkgICAgewotCQkJICAgICAgaWYgKHN5bWJvbF9yZWFkX25lZWRzX2ZyYW1lIChzeW0pKQotCQkJCXsKLQkJCQkgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fAotCQkJCSAgICAgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIAotCQkJCQkJICAgIGlubmVybW9zdF9ibG9jaykpCi0JCQkJICAgIGlubmVybW9zdF9ibG9jayA9IGJsb2NrX2ZvdW5kOwotCQkJCX0KLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAgICAgLyogV2Ugd2FudCB0byB1c2UgdGhlIHNlbGVjdGVkIGZyYW1lLCBub3QKLQkJCQkgYW5vdGhlciBtb3JlIGlubmVyIGZyYW1lIHdoaWNoIGhhcHBlbnMgdG8KLQkJCQkgYmUgaW4gdGhlIHNhbWUgYmxvY2suICAqLwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9ibG9jayAoTlVMTCk7Ci0JCQkgICAgICB3cml0ZV9leHBfZWx0X3N5bSAoc3ltKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAgICAgYnJlYWs7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOwotCQkJICAgICAgcmVnaXN0ZXIgY2hhciAqYXJnID0gY29weV9uYW1lICh5eXZzcFswXS5zc3ltLnN0b2tlbik7Ci0KLQkJCSAgICAgIG1zeW1ib2wgPQotCQkJCWxvb2t1cF9taW5pbWFsX3N5bWJvbCAoYXJnLCBOVUxMLCBOVUxMKTsKLQkJCSAgICAgIGlmIChtc3ltYm9sICE9IE5VTEwpCi0JCQkJewotCQkJCSAgd3JpdGVfZXhwX21zeW1ib2wgKG1zeW1ib2wsCi0JCQkJCQkgICAgIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKLQkJCQkJCSAgICAgYnVpbHRpbl90eXBlX2ludCk7Ci0JCQkJfQotCQkJICAgICAgZWxzZSBpZiAoIWhhdmVfZnVsbF9zeW1ib2xzICgpICYmICFoYXZlX3BhcnRpYWxfc3ltYm9scyAoKSkKLQkJCQllcnJvciAoIk5vIHN5bWJvbCB0YWJsZSBpcyBsb2FkZWQuICBVc2UgdGhlIFwiZmlsZVwiIGNvbW1hbmQuIik7Ci0JCQkgICAgICBlbHNlCi0JCQkJZXJyb3IgKCJObyBzeW1ib2wgXCIlc1wiIGluIGN1cnJlbnQgY29udGV4dC4iLAotCQkJCSAgICAgICBjb3B5X25hbWUgKHl5dnNwWzBdLnNzeW0uc3Rva2VuKSk7Ci0JCQkgICAgfQotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNTM6Ci0jbGluZSA0OTQgImYtZXhwLnkiCi17Ci0JCSAgLyogVGhpcyBpcyB3aGVyZSB0aGUgaW50ZXJlc3Rpbmcgc3R1ZmYgaGFwcGVucy4gICovCi0JCSAgaW50IGRvbmUgPSAwOwotCQkgIGludCBhcnJheV9zaXplOwotCQkgIHN0cnVjdCB0eXBlICpmb2xsb3dfdHlwZSA9IHl5dnNwWy0xXS50dmFsOwotCQkgIHN0cnVjdCB0eXBlICpyYW5nZV90eXBlOwotCQkgIAotCQkgIHdoaWxlICghZG9uZSkKLQkJICAgIHN3aXRjaCAocG9wX3R5cGUgKCkpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSB0cF9lbmQ6Ci0JCQlkb25lID0gMTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIHRwX3BvaW50ZXI6Ci0JCQlmb2xsb3dfdHlwZSA9IGxvb2t1cF9wb2ludGVyX3R5cGUgKGZvbGxvd190eXBlKTsKLQkJCWJyZWFrOwotCQkgICAgICBjYXNlIHRwX3JlZmVyZW5jZToKLQkJCWZvbGxvd190eXBlID0gbG9va3VwX3JlZmVyZW5jZV90eXBlIChmb2xsb3dfdHlwZSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSB0cF9hcnJheToKLQkJCWFycmF5X3NpemUgPSBwb3BfdHlwZV9pbnQgKCk7Ci0JCQlpZiAoYXJyYXlfc2l6ZSAhPSAtMSkKLQkJCSAgewotCQkJICAgIHJhbmdlX3R5cGUgPQotCQkJICAgICAgY3JlYXRlX3JhbmdlX3R5cGUgKChzdHJ1Y3QgdHlwZSAqKSBOVUxMLAotCQkJCQkJIGJ1aWx0aW5fdHlwZV9mX2ludGVnZXIsIDAsCi0JCQkJCQkgYXJyYXlfc2l6ZSAtIDEpOwotCQkJICAgIGZvbGxvd190eXBlID0KLQkJCSAgICAgIGNyZWF0ZV9hcnJheV90eXBlICgoc3RydWN0IHR5cGUgKikgTlVMTCwKLQkJCQkJCSBmb2xsb3dfdHlwZSwgcmFuZ2VfdHlwZSk7Ci0JCQkgIH0KLQkJCWVsc2UKLQkJCSAgZm9sbG93X3R5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlIChmb2xsb3dfdHlwZSk7Ci0JCQlicmVhazsKLQkJICAgICAgY2FzZSB0cF9mdW5jdGlvbjoKLQkJCWZvbGxvd190eXBlID0gbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGZvbGxvd190eXBlKTsKLQkJCWJyZWFrOwotCQkgICAgICB9Ci0JCSAgeXl2YWwudHZhbCA9IGZvbGxvd190eXBlOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA1NDoKLSNsaW5lIDUzNyAiZi1leHAueSIKLXsgcHVzaF90eXBlICh0cF9wb2ludGVyKTsgeXl2YWwudm9pZHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU1OgotI2xpbmUgNTM5ICJmLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX3BvaW50ZXIpOyB5eXZhbC52b2lkdmFsID0geXl2c3BbMF0udm9pZHZhbDsgOwotICAgIGJyZWFrO30KLWNhc2UgNTY6Ci0jbGluZSA1NDEgImYtZXhwLnkiCi17IHB1c2hfdHlwZSAodHBfcmVmZXJlbmNlKTsgeXl2YWwudm9pZHZhbCA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU3OgotI2xpbmUgNTQzICJmLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX3JlZmVyZW5jZSk7IHl5dmFsLnZvaWR2YWwgPSB5eXZzcFswXS52b2lkdmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1OToKLSNsaW5lIDU0OCAiZi1leHAueSIKLXsgeXl2YWwudm9pZHZhbCA9IHl5dnNwWy0xXS52b2lkdmFsOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MDoKLSNsaW5lIDU1MCAiZi1leHAueSIKLXsgcHVzaF90eXBlICh0cF9mdW5jdGlvbik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYxOgotI2xpbmUgNTUyICJmLWV4cC55IgoteyBwdXNoX3R5cGUgKHRwX2Z1bmN0aW9uKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjI6Ci0jbGluZSA1NTYgImYtZXhwLnkiCi17IHl5dmFsLnZvaWR2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MzoKLSNsaW5lIDU1OCAiZi1leHAueSIKLXsgZnJlZSAoKFBUUil5eXZzcFstMV0udHZlYyk7IHl5dmFsLnZvaWR2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NDoKLSNsaW5lIDU2MyAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IHl5dnNwWzBdLnRzeW0udHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjU6Ci0jbGluZSA1NjUgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9pbnRlZ2VyOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NjoKLSNsaW5lIDU2NyAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2ludGVnZXJfczI7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY3OgotI2xpbmUgNTY5ICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfY2hhcmFjdGVyOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2ODoKLSNsaW5lIDU3MSAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX2xvZ2ljYWw7OwotICAgIGJyZWFrO30KLWNhc2UgNjk6Ci0jbGluZSA1NzMgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9sb2dpY2FsX3MyOzsKLSAgICBicmVhazt9Ci1jYXNlIDcwOgotI2xpbmUgNTc1ICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfbG9naWNhbF9zMTs7Ci0gICAgYnJlYWs7fQotY2FzZSA3MToKLSNsaW5lIDU3NyAiZi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGJ1aWx0aW5fdHlwZV9mX3JlYWw7OwotICAgIGJyZWFrO30KLWNhc2UgNzI6Ci0jbGluZSA1NzkgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9yZWFsX3M4OzsKLSAgICBicmVhazt9Ci1jYXNlIDczOgotI2xpbmUgNTgxICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfcmVhbF9zMTY7OwotICAgIGJyZWFrO30KLWNhc2UgNzQ6Ci0jbGluZSA1ODMgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9jb21wbGV4X3M4OzsKLSAgICBicmVhazt9Ci1jYXNlIDc1OgotI2xpbmUgNTg1ICJmLWV4cC55IgoteyB5eXZhbC50dmFsID0gYnVpbHRpbl90eXBlX2ZfY29tcGxleF9zMTY7OwotICAgIGJyZWFrO30KLWNhc2UgNzY6Ci0jbGluZSA1ODcgImYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBidWlsdGluX3R5cGVfZl9jb21wbGV4X3MzMjs7Ci0gICAgYnJlYWs7fQotY2FzZSA3ODoKLSNsaW5lIDU5NSAiZi1leHAueSIKLXsgeXl2YWwudHZlYyA9IChzdHJ1Y3QgdHlwZSAqKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSAqIDIpOwotCQkgIHl5dmFsLml2ZWNbMF0gPSAxOwkvKiBOdW1iZXIgb2YgdHlwZXMgaW4gdmVjdG9yICovCi0JCSAgeXl2YWwudHZlY1sxXSA9IHl5dnNwWzBdLnR2YWw7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDc5OgotI2xpbmUgNjAwICJmLWV4cC55IgoteyBpbnQgbGVuID0gc2l6ZW9mIChzdHJ1Y3QgdHlwZSAqKSAqICgrKyh5eXZzcFstMl0uaXZlY1swXSkgKyAxKTsKLQkJICB5eXZhbC50dmVjID0gKHN0cnVjdCB0eXBlICoqKSB4cmVhbGxvYyAoKGNoYXIgKikgeXl2c3BbLTJdLnR2ZWMsIGxlbik7Ci0JCSAgeXl2YWwudHZlY1t5eXZhbC5pdmVjWzBdXSA9IHl5dnNwWzBdLnR2YWw7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDgwOgotI2xpbmUgNjA3ICJmLWV4cC55IgoteyB5eXZhbC5zdmFsID0geXl2c3BbMF0uc3N5bS5zdG9rZW47IDsKLSAgICBicmVhazt9Ci1jYXNlIDgxOgotI2xpbmUgNjA5ICJmLWV4cC55IgoteyB5eXZhbC5zdmFsID0geXl2c3BbMF0udHN5bS5zdG9rZW47IDsKLSAgICBicmVhazt9Ci1jYXNlIDgyOgotI2xpbmUgNjExICJmLWV4cC55IgoteyB5eXZhbC5zdmFsID0geXl2c3BbMF0uc3N5bS5zdG9rZW47IDsKLSAgICBicmVhazt9Ci19Ci0gICAvKiB0aGUgYWN0aW9uIGZpbGUgZ2V0cyBjb3BpZWQgaW4gaW4gcGxhY2Ugb2YgdGhpcyBkb2xsYXJzaWduICovCi0jbGluZSA0OTggIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0MCi0gIHl5dnNwIC09IHl5bGVuOwotICB5eXNzcCAtPSB5eWxlbjsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgLT0geXlsZW47Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAic3RhdGUgc3RhY2sgbm93Iik7Ci0gICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKLQlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLSAgKisreXl2c3AgPSB5eXZhbDsKLQotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCsrOwotICBpZiAoeXlsZW4gPT0gMCkKLSAgICB7Ci0gICAgICB5eWxzcC0+Zmlyc3RfbGluZSA9IHl5bGxvYy5maXJzdF9saW5lOwotICAgICAgeXlsc3AtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy5maXJzdF9jb2x1bW47Ci0gICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwLTEpLT5sYXN0X2xpbmU7Ci0gICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AtMSktPmxhc3RfY29sdW1uOwotICAgICAgeXlsc3AtPnRleHQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfbGluZTsKLSAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9jb2x1bW47Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogTm93ICJzaGlmdCIgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLgotICAgICBEZXRlcm1pbmUgd2hhdCBzdGF0ZSB0aGF0IGdvZXMgdG8sCi0gICAgIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0bwotICAgICBhbmQgdGhlIHJ1bGUgbnVtYmVyIHJlZHVjZWQgYnkuICAqLwotCi0gIHl5biA9IHl5cjFbeXluXTsKLQotICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UQkFTRV0gKyAqeXlzc3A7Ci0gIGlmICh5eXN0YXRlID49IDAgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCi0gICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07Ci0gIGVsc2UKLSAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRCQVNFXTsKLQotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLXl5ZXJybGFiOiAgIC8qIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yICovCi0KLSAgaWYgKCEgeXllcnJzdGF0dXMpCi0gICAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCi0gICAgewotICAgICAgKyt5eW5lcnJzOwotCi0jaWZkZWYgWVlFUlJPUl9WRVJCT1NFCi0gICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0KLSAgICAgIGlmICh5eW4gPiBZWUZMQUcgJiYgeXluIDwgWVlMQVNUKQotCXsKLQkgIGludCBzaXplID0gMDsKLQkgIGNoYXIgKm1zZzsKLQkgIGludCB4LCBjb3VudDsKLQotCSAgY291bnQgPSAwOwotCSAgLyogU3RhcnQgWCBhdCAteXluIGlmIG5lYyB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluIHl5Y2hlY2suICAqLwotCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7Ci0JICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCi0JICAgIGlmICh5eWNoZWNrW3ggKyB5eW5dID09IHgpCi0JICAgICAgc2l6ZSArPSBzdHJsZW4oeXl0bmFtZVt4XSkgKyAxNSwgY291bnQrKzsKLQkgIG1zZyA9IChjaGFyICopIHhtYWxsb2Moc2l6ZSArIDE1KTsKLQkgIGlmIChtc2cgIT0gMCkKLQkgICAgewotCSAgICAgIHN0cmNweShtc2csICJwYXJzZSBlcnJvciIpOwotCi0JICAgICAgaWYgKGNvdW50IDwgNSkKLQkJewotCQkgIGNvdW50ID0gMDsKLQkJICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKLQkJICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCi0JCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQotCQkgICAgICB7Ci0JCQlzdHJjYXQobXNnLCBjb3VudCA9PSAwID8gIiwgZXhwZWN0aW5nIGAiIDogIiBvciBgIik7Ci0JCQlzdHJjYXQobXNnLCB5eXRuYW1lW3hdKTsKLQkJCXN0cmNhdChtc2csICInIik7Ci0JCQljb3VudCsrOwotCQkgICAgICB9Ci0JCX0KLQkgICAgICB5eWVycm9yKG1zZyk7Ci0JICAgICAgZnJlZShtc2cpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHl5ZXJyb3IgKCJwYXJzZSBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGNlZWRlZCIpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KLQl5eWVycm9yKCJwYXJzZSBlcnJvciIpOwotICAgIH0KLQotICBnb3RvIHl5ZXJybGFiMTsKLXl5ZXJybGFiMTogICAvKiBoZXJlIG9uIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IGFuIGFjdGlvbiAqLwotCi0gIGlmICh5eWVycnN0YXR1cyA9PSAzKQotICAgIHsKLSAgICAgIC8qIGlmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4gZXJyb3IsIGRpc2NhcmQgaXQuICAqLwotCi0gICAgICAvKiByZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQgKi8KLSAgICAgIGlmICh5eWNoYXIgPT0gWVlFT0YpCi0JWVlBQk9SVDsKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJEaXNjYXJkaW5nIHRva2VuICVkICglcykuXG4iLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotI2VuZGlmCi0KLSAgICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0gICAgfQotCi0gIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuCi0gICAgIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvciB0b2tlbi4gICovCi0KLSAgeXllcnJzdGF0dXMgPSAzOwkJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzICovCi0KLSAgZ290byB5eWVycmhhbmRsZTsKLQoteXllcnJkZWZhdWx0OiAgLyogY3VycmVudCBzdGF0ZSBkb2VzIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGUgZXJyb3IgdG9rZW4uICovCi0KLSNpZiAwCi0gIC8qIFRoaXMgaXMgd3Jvbmc7IG9ubHkgc3RhdGVzIHRoYXQgZXhwbGljaXRseSB3YW50IGVycm9yIHRva2VucwotICAgICBzaG91bGQgc2hpZnQgdGhlbS4gICovCi0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOyAgLyogSWYgaXRzIGRlZmF1bHQgaXMgdG8gYWNjZXB0IGFueSB0b2tlbiwgb2suICBPdGhlcndpc2UgcG9wIGl0LiovCi0gIGlmICh5eW4pIGdvdG8geXlkZWZhdWx0OwotI2VuZGlmCi0KLXl5ZXJycG9wOiAgIC8qIHBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuICovCi0KLSAgaWYgKHl5c3NwID09IHl5c3MpIFlZQUJPUlQ7Ci0gIHl5dnNwLS07Ci0gIHl5c3RhdGUgPSAqLS15eXNzcDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AtLTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogc3RhdGUgc3RhY2sgbm93Iik7Ci0gICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKLQlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLXl5ZXJyaGFuZGxlOgotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluICs9IFlZVEVSUk9SOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IFlZVEVSUk9SKQotICAgIGdvdG8geXllcnJkZWZhdWx0OwotCi0gIHl5biA9IHl5dGFibGVbeXluXTsKLSAgaWYgKHl5biA8IDApCi0gICAgewotICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCi0JZ290byB5eWVycnBvcDsKLSAgICAgIHl5biA9IC15eW47Ci0gICAgICBnb3RvIHl5cmVkdWNlOwotICAgIH0KLSAgZWxzZSBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycnBvcDsKLQotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIik7Ci0jZW5kaWYKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgKisreXlsc3AgPSB5eWxsb2M7Ci0jZW5kaWYKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci19Ci0jbGluZSA2MjQgImYtZXhwLnkiCi0KLQotLyogVGFrZSBjYXJlIG9mIHBhcnNpbmcgYSBudW1iZXIgKGFueXRoaW5nIHRoYXQgc3RhcnRzIHdpdGggYSBkaWdpdCkuCi0gICBTZXQgeXlsdmFsIGFuZCByZXR1cm4gdGhlIHRva2VuIHR5cGU7IHVwZGF0ZSBsZXhwdHIuCi0gICBMRU4gaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGl0LiAgKi8KLQotLyoqKiBOZWVkcyBzb21lIGVycm9yIGNoZWNraW5nIGZvciB0aGUgZmxvYXQgY2FzZSAqKiovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX251bWJlciAocCwgbGVuLCBwYXJzZWRfZmxvYXQsIHB1dGl0aGVyZSkKLSAgICAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgICAgcmVnaXN0ZXIgaW50IGxlbjsKLSAgICAgaW50IHBhcnNlZF9mbG9hdDsKLSAgICAgWVlTVFlQRSAqcHV0aXRoZXJlOwotewotICByZWdpc3RlciBMT05HRVNUIG4gPSAwOwotICByZWdpc3RlciBMT05HRVNUIHByZXZuID0gMDsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIHJlZ2lzdGVyIGludCBjOwotICByZWdpc3RlciBpbnQgYmFzZSA9IGlucHV0X3JhZGl4OwotICBpbnQgdW5zaWduZWRfcCA9IDA7Ci0gIGludCBsb25nX3AgPSAwOwotICBVTE9OR0VTVCBoaWdoX2JpdDsKLSAgc3RydWN0IHR5cGUgKnNpZ25lZF90eXBlOwotICBzdHJ1Y3QgdHlwZSAqdW5zaWduZWRfdHlwZTsKLQotICBpZiAocGFyc2VkX2Zsb2F0KQotICAgIHsKLSAgICAgIC8qIEl0J3MgYSBmbG9hdCBzaW5jZSBpdCBjb250YWlucyBhIHBvaW50IG9yIGFuIGV4cG9uZW50LiAgKi8KLSAgICAgIC8qIFtkRF0gaXMgbm90IHVuZGVyc3Rvb2QgYXMgYW4gZXhwb25lbnQgYnkgYXRvZiwgY2hhbmdlIGl0IHRvICdlJy4gICovCi0gICAgICBjaGFyICp0bXAsICp0bXAyOwotCi0gICAgICB0bXAgPSBzdHJzYXZlIChwKTsKLSAgICAgIGZvciAodG1wMiA9IHRtcDsgKnRtcDI7ICsrdG1wMikKLQlpZiAoKnRtcDIgPT0gJ2QnIHx8ICp0bXAyID09ICdEJykKLQkgICp0bXAyID0gJ2UnOwotICAgICAgcHV0aXRoZXJlLT5kdmFsID0gYXRvZiAodG1wKTsKLSAgICAgIGZyZWUgKHRtcCk7Ci0gICAgICByZXR1cm4gRkxPQVQ7Ci0gICAgfQotCi0gIC8qIEhhbmRsZSBiYXNlLXN3aXRjaGluZyBwcmVmaXhlcyAweCwgMHQsIDBkLCAwICovCi0gIGlmIChwWzBdID09ICcwJykKLSAgICBzd2l0Y2ggKHBbMV0pCi0gICAgICB7Ci0gICAgICBjYXNlICd4JzoKLSAgICAgIGNhc2UgJ1gnOgotCWlmIChsZW4gPj0gMykKLQkgIHsKLQkgICAgcCArPSAyOwotCSAgICBiYXNlID0gMTY7Ci0JICAgIGxlbiAtPSAyOwotCSAgfQotCWJyZWFrOwotCQotICAgICAgY2FzZSAndCc6Ci0gICAgICBjYXNlICdUJzoKLSAgICAgIGNhc2UgJ2QnOgotICAgICAgY2FzZSAnRCc6Ci0JaWYgKGxlbiA+PSAzKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGJhc2UgPSAxMDsKLQkgICAgbGVuIC09IDI7Ci0JICB9Ci0JYnJlYWs7Ci0JCi0gICAgICBkZWZhdWx0OgotCWJhc2UgPSA4OwotCWJyZWFrOwotICAgICAgfQotICAKLSAgd2hpbGUgKGxlbi0tID4gMCkKLSAgICB7Ci0gICAgICBjID0gKnArKzsKLSAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKLQljICs9ICdhJyAtICdBJzsKLSAgICAgIGlmIChjICE9ICdsJyAmJiBjICE9ICd1JykKLQluICo9IGJhc2U7Ci0gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JbiArPSBpID0gYyAtICcwJzsKLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoYmFzZSA+IDEwICYmIGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotCSAgICBuICs9IGkgPSBjIC0gJ2EnICsgMTA7Ci0JICBlbHNlIGlmIChsZW4gPT0gMCAmJiBjID09ICdsJykgCi0gICAgICAgICAgICBsb25nX3AgPSAxOwotCSAgZWxzZSBpZiAobGVuID09IDAgJiYgYyA9PSAndScpCi0JICAgIHVuc2lnbmVkX3AgPSAxOwotCSAgZWxzZQotCSAgICByZXR1cm4gRVJST1I7CS8qIENoYXIgbm90IGEgZGlnaXQgKi8KLQl9Ci0gICAgICBpZiAoaSA+PSBiYXNlKQotCXJldHVybiBFUlJPUjsJCS8qIEludmFsaWQgZGlnaXQgaW4gdGhpcyBiYXNlICovCi0gICAgICAKLSAgICAgIC8qIFBvcnRhYmx5IHRlc3QgZm9yIG92ZXJmbG93IChvbmx5IHdvcmtzIGZvciBub256ZXJvIHZhbHVlcywgc28gbWFrZQotCSBhIHNlY29uZCBjaGVjayBmb3IgemVybykuICAqLwotICAgICAgaWYgKChwcmV2biA+PSBuKSAmJiBuICE9IDApCi0JdW5zaWduZWRfcD0xOwkJLyogVHJ5IHNvbWV0aGluZyB1bnNpZ25lZCAqLwotICAgICAgLyogSWYgcmFuZ2UgY2hlY2tpbmcgZW5hYmxlZCwgcG9ydGFibHkgdGVzdCBmb3IgdW5zaWduZWQgb3ZlcmZsb3cuICAqLwotICAgICAgaWYgKFJBTkdFX0NIRUNLICYmIG4gIT0gMCkKLQl7Ci0JICBpZiAoKHVuc2lnbmVkX3AgJiYgKHVuc2lnbmVkKXByZXZuID49ICh1bnNpZ25lZCluKSkKLQkgICAgcmFuZ2VfZXJyb3IoIk92ZXJmbG93IG9uIG51bWVyaWMgY29uc3RhbnQuIik7CSAKLQl9Ci0gICAgICBwcmV2biA9IG47Ci0gICAgfQotICAKLSAgLyogSWYgdGhlIG51bWJlciBpcyB0b28gYmlnIHRvIGJlIGFuIGludCwgb3IgaXQncyBnb3QgYW4gbCBzdWZmaXgKLSAgICAgdGhlbiBpdCdzIGEgbG9uZy4gIFdvcmsgb3V0IGlmIHRoaXMgaGFzIHRvIGJlIGEgbG9uZyBieQotICAgICBzaGlmdGluZyByaWdodCBhbmQgYW5kIHNlZWluZyBpZiBhbnl0aGluZyByZW1haW5zLCBhbmQgdGhlCi0gICAgIHRhcmdldCBpbnQgc2l6ZSBpcyBkaWZmZXJlbnQgdG8gdGhlIHRhcmdldCBsb25nIHNpemUuCi0gICAgIAotICAgICBJbiB0aGUgZXhwcmVzc2lvbiBiZWxvdywgd2UgY291bGQgaGF2ZSB0ZXN0ZWQKLSAgICAgKG4gPj4gVEFSR0VUX0lOVF9CSVQpCi0gICAgIHRvIHNlZSBpZiBpdCB3YXMgemVybywKLSAgICAgYnV0IHRvbyBtYW55IGNvbXBpbGVycyB3YXJuIGFib3V0IHRoYXQsIHdoZW4gaW50cyBhbmQgbG9uZ3MKLSAgICAgYXJlIHRoZSBzYW1lIHNpemUuICBTbyB3ZSBzaGlmdCBpdCB0d2ljZSwgd2l0aCBmZXdlciBiaXRzCi0gICAgIGVhY2ggdGltZSwgZm9yIHRoZSBzYW1lIHJlc3VsdC4gICovCi0gIAotICBpZiAoKFRBUkdFVF9JTlRfQklUICE9IFRBUkdFVF9MT05HX0JJVCAKLSAgICAgICAmJiAoKG4gPj4gMikgPj4gKFRBUkdFVF9JTlRfQklULTIpKSkgICAvKiBBdm9pZCBzaGlmdCB3YXJuaW5nICovCi0gICAgICB8fCBsb25nX3ApCi0gICAgewotICAgICAgaGlnaF9iaXQgPSAoKFVMT05HRVNUKTEpIDw8IChUQVJHRVRfTE9OR19CSVQtMSk7Ci0gICAgICB1bnNpZ25lZF90eXBlID0gYnVpbHRpbl90eXBlX3Vuc2lnbmVkX2xvbmc7Ci0gICAgICBzaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV9sb25nOwotICAgIH0KLSAgZWxzZSAKLSAgICB7Ci0gICAgICBoaWdoX2JpdCA9ICgoVUxPTkdFU1QpMSkgPDwgKFRBUkdFVF9JTlRfQklULTEpOwotICAgICAgdW5zaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV91bnNpZ25lZF9pbnQ7Ci0gICAgICBzaWduZWRfdHlwZSA9IGJ1aWx0aW5fdHlwZV9pbnQ7Ci0gICAgfSAgICAKLSAgCi0gIHB1dGl0aGVyZS0+dHlwZWRfdmFsLnZhbCA9IG47Ci0gIAotICAvKiBJZiB0aGUgaGlnaCBiaXQgb2YgdGhlIHdvcmtlZCBvdXQgdHlwZSBpcyBzZXQgdGhlbiB0aGlzIG51bWJlcgotICAgICBoYXMgdG8gYmUgdW5zaWduZWQuICovCi0gIAotICBpZiAodW5zaWduZWRfcCB8fCAobiAmIGhpZ2hfYml0KSkgCi0gICAgcHV0aXRoZXJlLT50eXBlZF92YWwudHlwZSA9IHVuc2lnbmVkX3R5cGU7Ci0gIGVsc2UgCi0gICAgcHV0aXRoZXJlLT50eXBlZF92YWwudHlwZSA9IHNpZ25lZF90eXBlOwotICAKLSAgcmV0dXJuIElOVDsKLX0KLQotc3RydWN0IHRva2VuCi17Ci0gIGNoYXIgKm9wZXJhdG9yOwotICBpbnQgdG9rZW47Ci0gIGVudW0gZXhwX29wY29kZSBvcGNvZGU7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRva2VuIGRvdF9vcHNbXSA9Ci17Ci0gIHsgIi5hbmQuIiwgQk9PTF9BTkQsIEJJTk9QX0VORCB9LAotICB7ICIuQU5ELiIsIEJPT0xfQU5ELCBCSU5PUF9FTkQgfSwKLSAgeyAiLm9yLiIsIEJPT0xfT1IsIEJJTk9QX0VORCB9LAotICB7ICIuT1IuIiwgQk9PTF9PUiwgQklOT1BfRU5EIH0sCi0gIHsgIi5ub3QuIiwgQk9PTF9OT1QsIEJJTk9QX0VORCB9LAotICB7ICIuTk9ULiIsIEJPT0xfTk9ULCBCSU5PUF9FTkQgfSwKLSAgeyAiLmVxLiIsIEVRVUFMLCBCSU5PUF9FTkQgfSwKLSAgeyAiLkVRLiIsIEVRVUFMLCBCSU5PUF9FTkQgfSwKLSAgeyAiLmVxdi4iLCBFUVVBTCwgQklOT1BfRU5EIH0sCi0gIHsgIi5ORVFWLiIsIE5PVEVRVUFMLCBCSU5PUF9FTkQgfSwKLSAgeyAiLm5lcXYuIiwgTk9URVFVQUwsIEJJTk9QX0VORCB9LAotICB7ICIuRVFWLiIsIEVRVUFMLCBCSU5PUF9FTkQgfSwKLSAgeyAiLm5lLiIsIE5PVEVRVUFMLCBCSU5PUF9FTkQgfSwKLSAgeyAiLk5FLiIsIE5PVEVRVUFMLCBCSU5PUF9FTkQgfSwKLSAgeyAiLmxlLiIsIExFUSwgQklOT1BfRU5EIH0sCi0gIHsgIi5MRS4iLCBMRVEsIEJJTk9QX0VORCB9LAotICB7ICIuZ2UuIiwgR0VRLCBCSU5PUF9FTkQgfSwKLSAgeyAiLkdFLiIsIEdFUSwgQklOT1BfRU5EIH0sCi0gIHsgIi5ndC4iLCBHUkVBVEVSVEhBTiwgQklOT1BfRU5EIH0sCi0gIHsgIi5HVC4iLCBHUkVBVEVSVEhBTiwgQklOT1BfRU5EIH0sCi0gIHsgIi5sdC4iLCBMRVNTVEhBTiwgQklOT1BfRU5EIH0sCi0gIHsgIi5MVC4iLCBMRVNTVEhBTiwgQklOT1BfRU5EIH0sCi0gIHsgTlVMTCwgMCwgMCB9Ci19OwotCi1zdHJ1Y3QgZjc3X2Jvb2xlYW5fdmFsIAotewotICBjaGFyICpuYW1lOwotICBpbnQgdmFsdWU7Ci19OyAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmNzdfYm9vbGVhbl92YWwgYm9vbGVhbl92YWx1ZXNbXSAgPSAKLXsKLSAgeyAiLnRydWUuIiwgMSB9LAotICB7ICIuVFJVRS4iLCAxIH0sCi0gIHsgIi5mYWxzZS4iLCAwIH0sCi0gIHsgIi5GQUxTRS4iLCAwIH0sCi0gIHsgTlVMTCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRva2VuIGY3N19rZXl3b3Jkc1tdID0gCi17Ci0gIHsgImNvbXBsZXhfMTYiLCBDT01QTEVYX1MxNl9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyAiY29tcGxleF8zMiIsIENPTVBMRVhfUzMyX0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJjaGFyYWN0ZXIiLCBDSEFSQUNURVIsIEJJTk9QX0VORCB9LAotICB7ICJpbnRlZ2VyXzIiLCBJTlRfUzJfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgImxvZ2ljYWxfMSIsIExPR0lDQUxfUzFfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgImxvZ2ljYWxfMiIsIExPR0lDQUxfUzJfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgImNvbXBsZXhfOCIsIENPTVBMRVhfUzhfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgImludGVnZXIiLCBJTlRfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgImxvZ2ljYWwiLCBMT0dJQ0FMX0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJyZWFsXzE2IiwgUkVBTF9TMTZfS0VZV09SRCwgQklOT1BfRU5EIH0sCi0gIHsgImNvbXBsZXgiLCBDT01QTEVYX1M4X0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJzaXplb2YiLCBTSVpFT0YsIEJJTk9QX0VORCB9LAotICB7ICJyZWFsXzgiLCBSRUFMX1M4X0tFWVdPUkQsIEJJTk9QX0VORCB9LAotICB7ICJyZWFsIiwgUkVBTF9LRVlXT1JELCBCSU5PUF9FTkQgfSwKLSAgeyBOVUxMLCAwLCAwIH0KLX07IAotCi0vKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGR5bmFtaWNhbGx5IGV4cGFuZGFibGUgYnVmZmVyIGZvciBwcm9jZXNzaW5nIGlucHV0Ci0gICBjaGFyYWN0ZXJzIGFjcXVpcmVkIHRocm91Z2ggbGV4cHRyIGFuZCBidWlsZGluZyBhIHZhbHVlIHRvIHJldHVybiBpbgotICAgeXlsdmFsLiBSaXBwZWQgb2ZmIGZyb20gY2gtZXhwLnkgKi8gCi0KLXN0YXRpYyBjaGFyICp0ZW1wYnVmOwkJLyogQ3VycmVudCBidWZmZXIgY29udGVudHMgKi8KLXN0YXRpYyBpbnQgdGVtcGJ1ZnNpemU7CQkvKiBTaXplIG9mIGFsbG9jYXRlZCBidWZmZXIgKi8KLXN0YXRpYyBpbnQgdGVtcGJ1ZmluZGV4OwkvKiBDdXJyZW50IGluZGV4IGludG8gYnVmZmVyICovCi0KLSNkZWZpbmUgR1JPV0JZX01JTl9TSVpFIDY0CS8qIE1pbmltdW0gYW1vdW50IHRvIGdyb3cgYnVmZmVyIGJ5ICovCi0KLSNkZWZpbmUgQ0hFQ0tCVUYoc2l6ZSkgXAotICBkbyB7IFwKLSAgICBpZiAodGVtcGJ1ZmluZGV4ICsgKHNpemUpID49IHRlbXBidWZzaXplKSBcCi0gICAgICB7IFwKLQlncm93YnVmX2J5X3NpemUgKHNpemUpOyBcCi0gICAgICB9IFwKLSAgfSB3aGlsZSAoMCk7Ci0KLQotLyogR3JvdyB0aGUgc3RhdGljIHRlbXAgYnVmZmVyIGlmIG5lY2Vzc2FyeSwgaW5jbHVkaW5nIGFsbG9jYXRpbmcgdGhlIGZpcnN0IG9uZQotICAgb24gZGVtYW5kLiAqLwotCi1zdGF0aWMgdm9pZAotZ3Jvd2J1Zl9ieV9zaXplIChjb3VudCkKLSAgICAgaW50IGNvdW50OwotewotICBpbnQgZ3Jvd2J5OwotCi0gIGdyb3dieSA9IG1heCAoY291bnQsIEdST1dCWV9NSU5fU0laRSk7Ci0gIHRlbXBidWZzaXplICs9IGdyb3dieTsKLSAgaWYgKHRlbXBidWYgPT0gTlVMTCkKLSAgICB0ZW1wYnVmID0gKGNoYXIgKikgeG1hbGxvYyAodGVtcGJ1ZnNpemUpOwotICBlbHNlCi0gICAgdGVtcGJ1ZiA9IChjaGFyICopIHhyZWFsbG9jICh0ZW1wYnVmLCB0ZW1wYnVmc2l6ZSk7Ci19Ci0KLS8qIEJsYXRhbnRseSByaXBwZWQgb2ZmIGZyb20gY2gtZXhwLnkuIFRoaXMgcm91dGluZSByZWNvZ25pemVzIEY3NyAKLSAgIHN0cmluZy1saXRlcmFscy4gCi0gICAKLSAgIFJlY29nbml6ZSBhIHN0cmluZyBsaXRlcmFsLiAgQSBzdHJpbmcgbGl0ZXJhbCBpcyBhIG5vbnplcm8gc2VxdWVuY2UKLSAgIG9mIGNoYXJhY3RlcnMgZW5jbG9zZWQgaW4gbWF0Y2hpbmcgc2luZ2xlIHF1b3RlcywgZXhjZXB0IHRoYXQKLSAgIGEgc2luZ2xlIGNoYXJhY3RlciBpbnNpZGUgc2luZ2xlIHF1b3RlcyBpcyBhIGNoYXJhY3RlciBsaXRlcmFsLCB3aGljaAotICAgd2UgcmVqZWN0IGFzIGEgc3RyaW5nIGxpdGVyYWwuICBUbyBlbWJlZCB0aGUgdGVybWluYXRvciBjaGFyYWN0ZXIgaW5zaWRlCi0gICBhIHN0cmluZywgaXQgaXMgc2ltcGx5IGRvdWJsZWQgKEkuRS4gJ3RoaXMnJ2lzJydvbmUnJ3N0cmluZycpICovCi0KLXN0YXRpYyBpbnQKLW1hdGNoX3N0cmluZ19saXRlcmFsICgpCi17Ci0gIGNoYXIgKnRva3B0ciA9IGxleHB0cjsKLQotICBmb3IgKHRlbXBidWZpbmRleCA9IDAsIHRva3B0cisrOyAqdG9rcHRyICE9ICdcMCc7IHRva3B0cisrKQotICAgIHsKLSAgICAgIENIRUNLQlVGICgxKTsKLSAgICAgIGlmICgqdG9rcHRyID09ICpsZXhwdHIpCi0JewotCSAgaWYgKCoodG9rcHRyICsgMSkgPT0gKmxleHB0cikKLQkgICAgdG9rcHRyKys7Ci0JICBlbHNlCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gKnRva3B0cjsKLSAgICB9Ci0gIGlmICgqdG9rcHRyID09ICdcMCcJCQkJCS8qIG5vIHRlcm1pbmF0b3IgKi8KLSAgICAgIHx8IHRlbXBidWZpbmRleCA9PSAwKQkJCQkvKiBubyBzdHJpbmcgKi8KLSAgICByZXR1cm4gMDsKLSAgZWxzZQotICAgIHsKLSAgICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4XSA9ICdcMCc7Ci0gICAgICB5eWx2YWwuc3ZhbC5wdHIgPSB0ZW1wYnVmOwotICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gdGVtcGJ1ZmluZGV4OwotICAgICAgbGV4cHRyID0gKyt0b2twdHI7Ci0gICAgICByZXR1cm4gU1RSSU5HX0xJVEVSQUw7Ci0gICAgfQotfQotCi0vKiBSZWFkIG9uZSB0b2tlbiwgZ2V0dGluZyBjaGFyYWN0ZXJzIHRocm91Z2ggbGV4cHRyLiAgKi8KLQotc3RhdGljIGludAoteXlsZXggKCkKLXsKLSAgaW50IGM7Ci0gIGludCBuYW1lbGVuOwotICB1bnNpZ25lZCBpbnQgaSx0b2tlbjsKLSAgY2hhciAqdG9rc3RhcnQ7Ci0gIAotIHJldHJ5OgotICAKLSAgdG9rc3RhcnQgPSBsZXhwdHI7Ci0gIAotICAvKiBGaXJzdCBvZiBhbGwsIGxldCB1cyBtYWtlIHN1cmUgd2UgYXJlIG5vdCBkZWFsaW5nIHdpdGggdGhlIAotICAgICBzcGVjaWFsIHRva2VucyAudHJ1ZS4gYW5kIC5mYWxzZS4gd2hpY2ggZXZhbHVhdGUgdG8gMSBhbmQgMC4gICovCi0gIAotICBpZiAoKmxleHB0ciA9PSAnLicpCi0gICAgeyAKLSAgICAgIGZvciAoaSA9IDA7IGJvb2xlYW5fdmFsdWVzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCXsKLQkgIGlmIFNUUkVRTiAodG9rc3RhcnQsIGJvb2xlYW5fdmFsdWVzW2ldLm5hbWUsCi0JCSAgICBzdHJsZW4gKGJvb2xlYW5fdmFsdWVzW2ldLm5hbWUpKQotCSAgICB7Ci0JICAgICAgbGV4cHRyICs9IHN0cmxlbiAoYm9vbGVhbl92YWx1ZXNbaV0ubmFtZSk7IAotCSAgICAgIHl5bHZhbC5sdmFsID0gYm9vbGVhbl92YWx1ZXNbaV0udmFsdWU7IAotCSAgICAgIHJldHVybiBCT09MRUFOX0xJVEVSQUw7Ci0JICAgIH0KLQl9Ci0gICAgfQotICAKLSAgLyogU2VlIGlmIGl0IGlzIGEgc3BlY2lhbCAuZm9vLiBvcGVyYXRvciAqLwotICAKLSAgZm9yIChpID0gMDsgZG90X29wc1tpXS5vcGVyYXRvciAhPSBOVUxMOyBpKyspCi0gICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsIGRvdF9vcHNbaV0ub3BlcmF0b3IsIHN0cmxlbiAoZG90X29wc1tpXS5vcGVyYXRvcikpKQotICAgICAgewotCWxleHB0ciArPSBzdHJsZW4gKGRvdF9vcHNbaV0ub3BlcmF0b3IpOwotCXl5bHZhbC5vcGNvZGUgPSBkb3Rfb3BzW2ldLm9wY29kZTsKLQlyZXR1cm4gZG90X29wc1tpXS50b2tlbjsKLSAgICAgIH0KLSAgCi0gIHN3aXRjaCAoYyA9ICp0b2tzdGFydCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDA7Ci0gICAgICAKLSAgICBjYXNlICcgJzoKLSAgICBjYXNlICdcdCc6Ci0gICAgY2FzZSAnXG4nOgotICAgICAgbGV4cHRyKys7Ci0gICAgICBnb3RvIHJldHJ5OwotICAgICAgCi0gICAgY2FzZSAnXCcnOgotICAgICAgdG9rZW4gPSBtYXRjaF9zdHJpbmdfbGl0ZXJhbCAoKTsKLSAgICAgIGlmICh0b2tlbiAhPSAwKQotCXJldHVybiAodG9rZW4pOwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlICcoJzoKLSAgICAgIHBhcmVuX2RlcHRoKys7Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotICAgICAgCi0gICAgY2FzZSAnKSc6Ci0gICAgICBpZiAocGFyZW5fZGVwdGggPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIHBhcmVuX2RlcHRoLS07Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotICAgICAgCi0gICAgY2FzZSAnLCc6Ci0gICAgICBpZiAoY29tbWFfdGVybWluYXRlcyAmJiBwYXJlbl9kZXB0aCA9PSAwKQotCXJldHVybiAwOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLSAgICAgIAotICAgIGNhc2UgJy4nOgotICAgICAgLyogTWlnaHQgYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICAqLwotICAgICAgaWYgKGxleHB0clsxXSA8ICcwJyB8fCBsZXhwdHJbMV0gPiAnOScpCi0JZ290byBzeW1ib2w7CQkvKiBOb3BlLCBtdXN0IGJlIGEgc3ltYm9sLiAqLwotICAgICAgLyogRkFMTCBUSFJVIGludG8gbnVtYmVyIGNhc2UuICAqLwotICAgICAgCi0gICAgY2FzZSAnMCc6Ci0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICB7Ci0gICAgICAgIC8qIEl0J3MgYSBudW1iZXIuICAqLwotCWludCBnb3RfZG90ID0gMCwgZ290X2UgPSAwLCBnb3RfZCA9IDAsIHRva3R5cGU7Ci0JcmVnaXN0ZXIgY2hhciAqcCA9IHRva3N0YXJ0OwotCWludCBoZXggPSBpbnB1dF9yYWRpeCA+IDEwOwotCQotCWlmIChjID09ICcwJyAmJiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGhleCA9IDE7Ci0JICB9Ci0JZWxzZSBpZiAoYyA9PSAnMCcgJiYgKHBbMV09PSd0JyB8fCBwWzFdPT0nVCcgfHwgcFsxXT09J2QnIHx8IHBbMV09PSdEJykpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgaGV4ID0gMDsKLQkgIH0KLQkKLQlmb3IgKDs7ICsrcCkKLQkgIHsKLQkgICAgaWYgKCFoZXggJiYgIWdvdF9lICYmICgqcCA9PSAnZScgfHwgKnAgPT0gJ0UnKSkKLQkgICAgICBnb3RfZG90ID0gZ290X2UgPSAxOwotCSAgICBlbHNlIGlmICghaGV4ICYmICFnb3RfZCAmJiAoKnAgPT0gJ2QnIHx8ICpwID09ICdEJykpCi0JICAgICAgZ290X2RvdCA9IGdvdF9kID0gMTsKLQkgICAgZWxzZSBpZiAoIWhleCAmJiAhZ290X2RvdCAmJiAqcCA9PSAnLicpCi0JICAgICAgZ290X2RvdCA9IDE7Ci0JICAgIGVsc2UgaWYgKCgoZ290X2UgJiYgKHBbLTFdID09ICdlJyB8fCBwWy0xXSA9PSAnRScpKQotCQkgICAgIHx8IChnb3RfZCAmJiAocFstMV0gPT0gJ2QnIHx8IHBbLTFdID09ICdEJykpKQotCQkgICAgICYmICgqcCA9PSAnLScgfHwgKnAgPT0gJysnKSkKLQkgICAgICAvKiBUaGlzIGlzIHRoZSBzaWduIG9mIHRoZSBleHBvbmVudCwgbm90IHRoZSBlbmQgb2YgdGhlCi0JCSBudW1iZXIuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICAvKiBXZSB3aWxsIHRha2UgYW55IGxldHRlcnMgb3IgZGlnaXRzLiAgcGFyc2VfbnVtYmVyIHdpbGwKLQkgICAgICAgY29tcGxhaW4gaWYgcGFzdCB0aGUgcmFkaXgsIG9yIGlmIEwgb3IgVSBhcmUgbm90IGZpbmFsLiAgKi8KLQkgICAgZWxzZSBpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKQotCQkgICAgICYmICgoKnAgPCAnYScgfHwgKnAgPiAneicpCi0JCQkgJiYgKCpwIDwgJ0EnIHx8ICpwID4gJ1onKSkpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JdG9rdHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIHAgLSB0b2tzdGFydCwgZ290X2RvdHxnb3RfZXxnb3RfZCwKLQkJCQkmeXlsdmFsKTsKLSAgICAgICAgaWYgKHRva3R5cGUgPT0gRVJST1IpCi0gICAgICAgICAgewotCSAgICBjaGFyICplcnJfY29weSA9IChjaGFyICopIGFsbG9jYSAocCAtIHRva3N0YXJ0ICsgMSk7Ci0JICAgIAotCSAgICBtZW1jcHkgKGVycl9jb3B5LCB0b2tzdGFydCwgcCAtIHRva3N0YXJ0KTsKLQkgICAgZXJyX2NvcHlbcCAtIHRva3N0YXJ0XSA9IDA7Ci0JICAgIGVycm9yICgiSW52YWxpZCBudW1iZXIgXCIlc1wiLiIsIGVycl9jb3B5KTsKLQkgIH0KLQlsZXhwdHIgPSBwOwotCXJldHVybiB0b2t0eXBlOwotICAgICAgfQotICAgICAgCi0gICAgY2FzZSAnKyc6Ci0gICAgY2FzZSAnLSc6Ci0gICAgY2FzZSAnKic6Ci0gICAgY2FzZSAnLyc6Ci0gICAgY2FzZSAnJSc6Ci0gICAgY2FzZSAnfCc6Ci0gICAgY2FzZSAnJic6Ci0gICAgY2FzZSAnXic6Ci0gICAgY2FzZSAnfic6Ci0gICAgY2FzZSAnISc6Ci0gICAgY2FzZSAnQCc6Ci0gICAgY2FzZSAnPCc6Ci0gICAgY2FzZSAnPic6Ci0gICAgY2FzZSAnWyc6Ci0gICAgY2FzZSAnXSc6Ci0gICAgY2FzZSAnPyc6Ci0gICAgY2FzZSAnOic6Ci0gICAgY2FzZSAnPSc6Ci0gICAgY2FzZSAneyc6Ci0gICAgY2FzZSAnfSc6Ci0gICAgc3ltYm9sOgotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLSAgICB9Ci0gIAotICBpZiAoIShjID09ICdfJyB8fCBjID09ICckJwotCXx8IChjID49ICdhJyAmJiBjIDw9ICd6JykgfHwgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSkpCi0gICAgLyogV2UgbXVzdCBoYXZlIGNvbWUgYWNyb3NzIGEgYmFkIGNoYXJhY3RlciAoZS5nLiAnOycpLiAgKi8KLSAgICBlcnJvciAoIkludmFsaWQgY2hhcmFjdGVyICclYycgaW4gZXhwcmVzc2lvbi4iLCBjKTsKLSAgCi0gIG5hbWVsZW4gPSAwOwotICBmb3IgKGMgPSB0b2tzdGFydFtuYW1lbGVuXTsKLSAgICAgICAoYyA9PSAnXycgfHwgYyA9PSAnJCcgfHwgKGMgPj0gJzAnICYmIGMgPD0gJzknKSAKLQl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpOyAKLSAgICAgICBjID0gdG9rc3RhcnRbKytuYW1lbGVuXSk7Ci0gIAotICAvKiBUaGUgdG9rZW4gImlmIiB0ZXJtaW5hdGVzIHRoZSBleHByZXNzaW9uIGFuZCBpcyBOT1QgCi0gICAgIHJlbW92ZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiAgKi8KLSAgCi0gIGlmIChuYW1lbGVuID09IDIgJiYgdG9rc3RhcnRbMF0gPT0gJ2knICYmIHRva3N0YXJ0WzFdID09ICdmJykKLSAgICByZXR1cm4gMDsKLSAgCi0gIGxleHB0ciArPSBuYW1lbGVuOwotICAKLSAgLyogQ2F0Y2ggc3BlY2lmaWMga2V5d29yZHMuICAqLwotICAKLSAgZm9yIChpID0gMDsgZjc3X2tleXdvcmRzW2ldLm9wZXJhdG9yICE9IE5VTEw7IGkrKykKLSAgICBpZiAoU1RSRVFOKHRva3N0YXJ0LCBmNzdfa2V5d29yZHNbaV0ub3BlcmF0b3IsCi0gICAgICAgICAgICAgICBzdHJsZW4oZjc3X2tleXdvcmRzW2ldLm9wZXJhdG9yKSkpCi0gICAgICB7Ci0JLyogCWxleHB0ciArPSBzdHJsZW4oZjc3X2tleXdvcmRzW2ldLm9wZXJhdG9yKTsgKi8gCi0JeXlsdmFsLm9wY29kZSA9IGY3N19rZXl3b3Jkc1tpXS5vcGNvZGU7Ci0JcmV0dXJuIGY3N19rZXl3b3Jkc1tpXS50b2tlbjsKLSAgICAgIH0KLSAgCi0gIHl5bHZhbC5zdmFsLnB0ciA9IHRva3N0YXJ0OwotICB5eWx2YWwuc3ZhbC5sZW5ndGggPSBuYW1lbGVuOwotICAKLSAgaWYgKCp0b2tzdGFydCA9PSAnJCcpCi0gICAgewotICAgICAgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlICh5eWx2YWwuc3ZhbCk7Ci0gICAgICByZXR1cm4gVkFSSUFCTEU7Ci0gICAgfQotICAKLSAgLyogVXNlIHRva2VuLXR5cGUgVFlQRU5BTUUgZm9yIHN5bWJvbHMgdGhhdCBoYXBwZW4gdG8gYmUgZGVmaW5lZAotICAgICBjdXJyZW50bHkgYXMgbmFtZXMgb2YgdHlwZXM7IE5BTUUgZm9yIG90aGVyIHN5bWJvbHMuCi0gICAgIFRoZSBjYWxsZXIgaXMgbm90IGNvbnN0cmFpbmVkIHRvIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uLiAgKi8KLSAgewotICAgIGNoYXIgKnRtcCA9IGNvcHlfbmFtZSAoeXlsdmFsLnN2YWwpOwotICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKLSAgICBpbnQgaXNfYV9maWVsZF9vZl90aGlzID0gMDsKLSAgICBpbnQgaGV4dHlwZTsKLSAgICAKLSAgICBzeW0gPSBsb29rdXBfc3ltYm9sICh0bXAsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKLQkJCSBWQVJfTkFNRVNQQUNFLAotCQkJIGN1cnJlbnRfbGFuZ3VhZ2UtPmxhX2xhbmd1YWdlID09IGxhbmd1YWdlX2NwbHVzCi0JCQkgPyAmaXNfYV9maWVsZF9vZl90aGlzIDogTlVMTCwKLQkJCSBOVUxMKTsKLSAgICBpZiAoc3ltICYmIFNZTUJPTF9DTEFTUyAoc3ltKSA9PSBMT0NfVFlQRURFRikKLSAgICAgIHsKLQl5eWx2YWwudHN5bS50eXBlID0gU1lNQk9MX1RZUEUgKHN5bSk7Ci0JcmV0dXJuIFRZUEVOQU1FOwotICAgICAgfQotICAgIGlmICgoeXlsdmFsLnRzeW0udHlwZSA9IGxvb2t1cF9wcmltaXRpdmVfdHlwZW5hbWUgKHRtcCkpICE9IDApCi0gICAgICByZXR1cm4gVFlQRU5BTUU7Ci0gICAgCi0gICAgLyogSW5wdXQgbmFtZXMgdGhhdCBhcmVuJ3Qgc3ltYm9scyBidXQgQVJFIHZhbGlkIGhleCBudW1iZXJzLAotICAgICAgIHdoZW4gdGhlIGlucHV0IHJhZGl4IHBlcm1pdHMgdGhlbSwgY2FuIGJlIG5hbWVzIG9yIG51bWJlcnMKLSAgICAgICBkZXBlbmRpbmcgb24gdGhlIHBhcnNlLiAgTm90ZSB3ZSBzdXBwb3J0IHJhZGl4ZXMgPiAxNiBoZXJlLiAgKi8KLSAgICBpZiAoIXN5bQotCSYmICgodG9rc3RhcnRbMF0gPj0gJ2EnICYmIHRva3N0YXJ0WzBdIDwgJ2EnICsgaW5wdXRfcmFkaXggLSAxMCkKLQkgICAgfHwgKHRva3N0YXJ0WzBdID49ICdBJyAmJiB0b2tzdGFydFswXSA8ICdBJyArIGlucHV0X3JhZGl4IC0gMTApKSkKLSAgICAgIHsKLSAJWVlTVFlQRSBuZXdsdmFsOwkvKiBJdHMgdmFsdWUgaXMgaWdub3JlZC4gICovCi0JaGV4dHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIG5hbWVsZW4sIDAsICZuZXdsdmFsKTsKLQlpZiAoaGV4dHlwZSA9PSBJTlQpCi0JICB7Ci0JICAgIHl5bHZhbC5zc3ltLnN5bSA9IHN5bTsKLQkgICAgeXlsdmFsLnNzeW0uaXNfYV9maWVsZF9vZl90aGlzID0gaXNfYV9maWVsZF9vZl90aGlzOwotCSAgICByZXR1cm4gTkFNRV9PUl9JTlQ7Ci0JICB9Ci0gICAgICB9Ci0gICAgCi0gICAgLyogQW55IG90aGVyIGtpbmQgb2Ygc3ltYm9sICovCi0gICAgeXlsdmFsLnNzeW0uc3ltID0gc3ltOwotICAgIHl5bHZhbC5zc3ltLmlzX2FfZmllbGRfb2ZfdGhpcyA9IGlzX2FfZmllbGRfb2ZfdGhpczsKLSAgICByZXR1cm4gTkFNRTsKLSAgfQotfQotCi12b2lkCi15eWVycm9yIChtc2cpCi0gICAgIGNoYXIgKm1zZzsKLXsKLSAgZXJyb3IgKCJBICVzIGluIGV4cHJlc3Npb24sIG5lYXIgYCVzJy4iLCAobXNnID8gbXNnIDogImVycm9yIiksIGxleHB0cik7Ci19CmRpZmYgLS1naXQgYS9nZGIvanYtZXhwLnRhYi5jIGIvZ2RiL2p2LWV4cC50YWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5MjBjYS4uMDAwMDAwMAotLS0gYS9nZGIvanYtZXhwLnRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM1MSArMCwwIEBACi0KLS8qICBBIEJpc29uIHBhcnNlciwgbWFkZSBmcm9tIGp2LWV4cC55Ci0gYnkgIEdOVSBCaXNvbiB2ZXJzaW9uIDEuMjUKLSAgKi8KLQotI2RlZmluZSBZWUJJU09OIDEgIC8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCi0KLSNkZWZpbmUJSU5URUdFUl9MSVRFUkFMCTI1OAotI2RlZmluZQlGTE9BVElOR19QT0lOVF9MSVRFUkFMCTI1OQotI2RlZmluZQlJREVOVElGSUVSCTI2MAotI2RlZmluZQlTVFJJTkdfTElURVJBTAkyNjEKLSNkZWZpbmUJQk9PTEVBTl9MSVRFUkFMCTI2MgotI2RlZmluZQlUWVBFTkFNRQkyNjMKLSNkZWZpbmUJTkFNRV9PUl9JTlQJMjY0Ci0jZGVmaW5lCUVSUk9SCTI2NQotI2RlZmluZQlMT05HCTI2NgotI2RlZmluZQlTSE9SVAkyNjcKLSNkZWZpbmUJQllURQkyNjgKLSNkZWZpbmUJSU5UCTI2OQotI2RlZmluZQlDSEFSCTI3MAotI2RlZmluZQlCT09MRUFOCTI3MQotI2RlZmluZQlET1VCTEUJMjcyCi0jZGVmaW5lCUZMT0FUCTI3MwotI2RlZmluZQlWQVJJQUJMRQkyNzQKLSNkZWZpbmUJQVNTSUdOX01PRElGWQkyNzUKLSNkZWZpbmUJVEhJUwkyNzYKLSNkZWZpbmUJU1VQRVIJMjc3Ci0jZGVmaW5lCU5FVwkyNzgKLSNkZWZpbmUJT1JPUgkyNzkKLSNkZWZpbmUJQU5EQU5ECTI4MAotI2RlZmluZQlFUVVBTAkyODEKLSNkZWZpbmUJTk9URVFVQUwJMjgyCi0jZGVmaW5lCUxFUQkyODMKLSNkZWZpbmUJR0VRCTI4NAotI2RlZmluZQlMU0gJMjg1Ci0jZGVmaW5lCVJTSAkyODYKLSNkZWZpbmUJSU5DUkVNRU5UCTI4NwotI2RlZmluZQlERUNSRU1FTlQJMjg4Ci0KLSNsaW5lIDM4ICJqdi1leHAueSIKLQotCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImV4cHJlc3Npb24uaCIKLSNpbmNsdWRlICJ2YWx1ZS5oIgotI2luY2x1ZGUgInBhcnNlci1kZWZzLmgiCi0jaW5jbHVkZSAibGFuZ3VhZ2UuaCIKLSNpbmNsdWRlICJqdi1sYW5nLmgiCi0jaW5jbHVkZSAiYmZkLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLwotI2luY2x1ZGUgInN5bWZpbGUuaCIgLyogUmVxdWlyZWQgYnkgb2JqZmlsZXMuaC4gICovCi0jaW5jbHVkZSAib2JqZmlsZXMuaCIgLyogRm9yIGhhdmVfZnVsbF9zeW1ib2xzIGFuZCBoYXZlX3BhcnRpYWxfc3ltYm9scyAqLwotCi0vKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwgZXRjKSwKLSAgIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzLCBzbyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZQotICAgeWFjYyBnZW5lcmF0ZWQgcGFyc2VycyBpbiBnZGIuICBOb3RlIHRoYXQgdGhlc2UgYXJlIG9ubHkgdGhlIHZhcmlhYmxlcwotICAgcHJvZHVjZWQgYnkgeWFjYy4gIElmIG90aGVyIHBhcnNlciBnZW5lcmF0b3JzIChiaXNvbiwgYnlhY2MsIGV0YykgcHJvZHVjZQotICAgYWRkaXRpb25hbCBnbG9iYWwgbmFtZXMgdGhhdCBjb25mbGljdCBhdCBsaW5rIHRpbWUsIHRoZW4gdGhvc2UgcGFyc2VyCi0gICBnZW5lcmF0b3JzIG5lZWQgdG8gYmUgZml4ZWQgaW5zdGVhZCBvZiBhZGRpbmcgdGhvc2UgbmFtZXMgdG8gdGhpcyBsaXN0LiAqLwotCi0jZGVmaW5lCXl5bWF4ZGVwdGggamF2YV9tYXhkZXB0aAotI2RlZmluZQl5eXBhcnNlCWphdmFfcGFyc2UKLSNkZWZpbmUJeXlsZXgJamF2YV9sZXgKLSNkZWZpbmUJeXllcnJvcglqYXZhX2Vycm9yCi0jZGVmaW5lCXl5bHZhbAlqYXZhX2x2YWwKLSNkZWZpbmUJeXljaGFyCWphdmFfY2hhcgotI2RlZmluZQl5eWRlYnVnCWphdmFfZGVidWcKLSNkZWZpbmUJeXlwYWN0CWphdmFfcGFjdAkKLSNkZWZpbmUJeXlyMQlqYXZhX3IxCQkJCi0jZGVmaW5lCXl5cjIJamF2YV9yMgkJCQotI2RlZmluZQl5eWRlZglqYXZhX2RlZgkJCi0jZGVmaW5lCXl5Y2hrCWphdmFfY2hrCQkKLSNkZWZpbmUJeXlwZ28JamF2YV9wZ28JCQotI2RlZmluZQl5eWFjdAlqYXZhX2FjdAkJCi0jZGVmaW5lCXl5ZXhjYQlqYXZhX2V4Y2EKLSNkZWZpbmUgeXllcnJmbGFnIGphdmFfZXJyZmxhZwotI2RlZmluZSB5eW5lcnJzCWphdmFfbmVycnMKLSNkZWZpbmUJeXlwcwlqYXZhX3BzCi0jZGVmaW5lCXl5cHYJamF2YV9wdgotI2RlZmluZQl5eXMJamF2YV9zCi0jZGVmaW5lCXl5X3l5cwlqYXZhX3l5cwotI2RlZmluZQl5eXN0YXRlCWphdmFfc3RhdGUKLSNkZWZpbmUJeXl0bXAJamF2YV90bXAKLSNkZWZpbmUJeXl2CWphdmFfdgotI2RlZmluZQl5eV95eXYJamF2YV95eXYKLSNkZWZpbmUJeXl2YWwJamF2YV92YWwKLSNkZWZpbmUJeXlsbG9jCWphdmFfbGxvYwotI2RlZmluZSB5eXJlZHMJamF2YV9yZWRzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eXRva3MJamF2YV90b2tzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eWxocwlqYXZhX3l5bGhzCi0jZGVmaW5lIHl5bGVuCWphdmFfeXlsZW4KLSNkZWZpbmUgeXlkZWZyZWQgamF2YV95eWRlZnJlZAotI2RlZmluZSB5eWRnb3RvCWphdmFfeXlkZ290bwotI2RlZmluZSB5eXNpbmRleCBqYXZhX3l5c2luZGV4Ci0jZGVmaW5lIHl5cmluZGV4IGphdmFfeXlyaW5kZXgKLSNkZWZpbmUgeXlnaW5kZXggamF2YV95eWdpbmRleAotI2RlZmluZSB5eXRhYmxlCSBqYXZhX3l5dGFibGUKLSNkZWZpbmUgeXljaGVjawkgamF2YV95eWNoZWNrCi0KLSNpZm5kZWYgWVlERUJVRwotI2RlZmluZQlZWURFQlVHCTAJCS8qIERlZmF1bHQgdG8gbm8geXlkZWJ1ZyBzdXBwb3J0ICovCi0jZW5kaWYKLQotaW50Ci15eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGludAoteXlsZXggUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi15eWVycm9yIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgc3RydWN0IHR5cGUgKiBqYXZhX3R5cGVfZnJvbV9uYW1lIFBBUkFNUyAoKHN0cnVjdCBzdG9rZW4pKTsKLXN0YXRpYyB2b2lkIHB1c2hfZXhwcmVzc2lvbl9uYW1lIFBBUkFNUyAoKHN0cnVjdCBzdG9rZW4pKTsKLXN0YXRpYyB2b2lkIHB1c2hfZmllbGRuYW1lcyBQQVJBTVMgKChzdHJ1Y3Qgc3Rva2VuKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwcmVzc2lvbiAqY29weV9leHAgUEFSQU1TICgoc3RydWN0IGV4cHJlc3Npb24gKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBpbnNlcnRfZXhwIFBBUkFNUyAoKGludCwgc3RydWN0IGV4cHJlc3Npb24gKikpOwotCi0KLSNsaW5lIDEyNCAianYtZXhwLnkiCi10eXBlZGVmIHVuaW9uCi0gIHsKLSAgICBMT05HRVNUIGx2YWw7Ci0gICAgc3RydWN0IHsKLSAgICAgIExPTkdFU1QgdmFsOwotICAgICAgc3RydWN0IHR5cGUgKnR5cGU7Ci0gICAgfSB0eXBlZF92YWxfaW50OwotICAgIHN0cnVjdCB7Ci0gICAgICBET1VCTEVTVCBkdmFsOwotICAgICAgc3RydWN0IHR5cGUgKnR5cGU7Ci0gICAgfSB0eXBlZF92YWxfZmxvYXQ7Ci0gICAgc3RydWN0IHN5bWJvbCAqc3ltOwotICAgIHN0cnVjdCB0eXBlICp0dmFsOwotICAgIHN0cnVjdCBzdG9rZW4gc3ZhbDsKLSAgICBzdHJ1Y3QgdHR5cGUgdHN5bTsKLSAgICBzdHJ1Y3Qgc3ltdG9rZW4gc3N5bTsKLSAgICBzdHJ1Y3QgYmxvY2sgKmJ2YWw7Ci0gICAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWx2YXIgKml2YXI7Ci0gICAgaW50ICppdmVjOwotICB9IFlZU1RZUEU7Ci0jbGluZSAxNDYgImp2LWV4cC55IgotCi0vKiBZWVNUWVBFIGdldHMgZGVmaW5lZCBieSAldW5pb24gKi8KLXN0YXRpYyBpbnQKLXBhcnNlX251bWJlciBQQVJBTVMgKChjaGFyICosIGludCwgaW50LCBZWVNUWVBFICopKTsKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi0jaWZuZGVmIF9fU1REQ19fCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLSNlbmRpZgotCi0KLQotI2RlZmluZQlZWUZJTkFMCQkyMDgKLSNkZWZpbmUJWVlGTEFHCQktMzI3NjgKLSNkZWZpbmUJWVlOVEJBU0UJNTcKLQotI2RlZmluZSBZWVRSQU5TTEFURSh4KSAoKHVuc2lnbmVkKSh4KSA8PSAyODggPyB5eXRyYW5zbGF0ZVt4XSA6IDExMikKLQotc3RhdGljIGNvbnN0IGNoYXIgeXl0cmFuc2xhdGVbXSA9IHsgICAgIDAsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICA1NSwgICAgIDIsICAgICAyLCAgICAgMiwgICAgNDQsICAgIDMxLCAgICAgMiwgICAgNDksCi0gICAgNTAsICAgIDQyLCAgICA0MCwgICAgMjQsICAgIDQxLCAgICA0NywgICAgNDMsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDU2LCAgICAgMiwgICAgMzQsCi0gICAgMjUsICAgIDM1LCAgICAyNiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgNDgsICAgICAyLCAgICA1MywgICAgMzAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICA1MSwgICAgMjksICAgIDUyLCAgICA1NCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsCi0gICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNywgICAgMjgsCi0gICAgMzIsICAgIDMzLCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDUsICAgIDQ2Ci19OwotCi0jaWYgWVlERUJVRyAhPSAwCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlwcmhzW10gPSB7ICAgICAwLAotICAgICAwLCAgICAgMiwgICAgIDQsICAgICA2LCAgICAgOCwgICAgMTAsICAgIDEyLCAgICAxNCwgICAgMTYsICAgIDE4LAotICAgIDIwLCAgICAyMiwgICAgMjQsICAgIDI2LCAgICAyOCwgICAgMzAsICAgIDMyLCAgICAzNCwgICAgMzYsICAgIDM4LAotICAgIDQwLCAgICA0MiwgICAgNDQsICAgIDQ2LCAgICA0OCwgICAgNTEsICAgIDU0LCAgICA1NiwgICAgNTgsICAgIDYwLAotICAgIDYyLCAgICA2NCwgICAgNjYsICAgIDcwLCAgICA3MiwgICAgNzYsICAgIDc4LCAgICA4MCwgICAgODIsICAgIDg0LAotICAgIDg4LCAgICA5MCwgICAgOTIsICAgIDk0LCAgICA5NiwgICAxMDAsICAgMTAyLCAgIDEwNCwgICAxMTAsICAgMTEyLAotICAgMTE2LCAgIDExNywgICAxMTksICAgMTI0LCAgIDEyOSwgICAxMzEsICAgMTM0LCAgIDEzOCwgICAxNDEsICAgMTQ1LAotICAgMTQ3LCAgIDE0OCwgICAxNTIsICAgMTU2LCAgIDE2MSwgICAxNjgsICAgMTc1LCAgIDE4MCwgICAxODUsICAgMTkwLAotICAgMTkyLCAgIDE5NCwgICAxOTYsICAgMTk4LCAgIDIwMCwgICAyMDMsICAgMjA2LCAgIDIwOCwgICAyMTAsICAgMjEzLAotICAgMjE2LCAgIDIxOSwgICAyMjEsICAgMjI0LCAgIDIyNywgICAyMjksICAgMjMyLCAgIDIzNSwgICAyMzcsICAgMjQzLAotICAgMjQ4LCAgIDI1NCwgICAyNTYsICAgMjYwLCAgIDI2NCwgICAyNjgsICAgMjcwLCAgIDI3NCwgICAyNzgsICAgMjgwLAotICAgMjg0LCAgIDI4OCwgICAyOTAsICAgMjk0LCAgIDI5OCwgICAzMDIsICAgMzA2LCAgIDMwOCwgICAzMTIsICAgMzE2LAotICAgMzE4LCAgIDMyMiwgICAzMjQsICAgMzI4LCAgIDMzMCwgICAzMzQsICAgMzM2LCAgIDM0MCwgICAzNDIsICAgMzQ2LAotICAgMzQ4LCAgIDM1NCwgICAzNTYsICAgMzU4LCAgIDM2MiwgICAzNjYsICAgMzY4LCAgIDM3MCwgICAzNzIsICAgMzc0Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyaHNbXSA9IHsgICAgNzMsCi0gICAgIDAsICAgIDU4LCAgICAgMCwgICAgNTksICAgICAwLCAgICA2MiwgICAgIDAsICAgIDY4LCAgICAgMCwgICAgIDYsCi0gICAgIDAsICAgICAzLCAgICAgMCwgICAgIDksICAgICAwLCAgICAgNCwgICAgIDAsICAgICA3LCAgICAgMCwgICAgNjAsCi0gICAgIDAsICAgIDYzLCAgICAgMCwgICAgMTYsICAgICAwLCAgICA2NCwgICAgIDAsICAgIDY1LCAgICAgMCwgICAgMTMsCi0gICAgIDAsICAgIDEyLCAgICAgMCwgICAgMTQsICAgICAwLCAgICAxMSwgICAgIDAsICAgIDE1LCAgICAgMCwgICAgMTgsCi0gICAgIDAsICAgIDE3LCAgICAgMCwgICAgNjksICAgICAwLCAgICA2NiwgICAgIDAsICAgIDYyLCAgICA4NCwgICAgIDAsCi0gICAgNjksICAgIDg0LCAgICAgMCwgICAgIDUsICAgICAwLCAgICA3MiwgICAgIDAsICAgIDcxLCAgICAgMCwgICAgNzIsCi0gICAgIDAsICAgICA1LCAgICAgMCwgICAgIDksICAgICAwLCAgICA2OSwgICAgNDcsICAgIDcxLCAgICAgMCwgICAxMTEsCi0gICAgIDAsICAgIDczLCAgICAyNCwgICAxMTEsICAgICAwLCAgICA3NSwgICAgIDAsICAgIDgxLCAgICAgMCwgICAgNjEsCi0gICAgIDAsICAgIDIxLCAgICAgMCwgICAgNDksICAgMTExLCAgICA1MCwgICAgIDAsICAgIDc4LCAgICAgMCwgICAgODYsCi0gICAgIDAsICAgIDg3LCAgICAgMCwgICAgODgsICAgICAwLCAgICA3NiwgICAgNzksICAgIDc3LCAgICAgMCwgICAgNTEsCi0gICAgIDAsICAgIDUyLCAgICAgMCwgICAgMjMsICAgIDY3LCAgICA0OSwgICAgODAsICAgIDUwLCAgICAgMCwgICAxMTEsCi0gICAgIDAsICAgIDc5LCAgICAyNCwgICAxMTEsICAgICAwLCAgICAgMCwgICAgNzksICAgICAwLCAgICAyMywgICAgNjIsCi0gICAgODIsICAgIDg1LCAgICAgMCwgICAgMjMsICAgIDY2LCAgICA4MiwgICAgODUsICAgICAwLCAgICA4MywgICAgIDAsCi0gICAgODIsICAgIDgzLCAgICAgMCwgICAgNDgsICAgMTExLCAgICA1MywgICAgIDAsICAgIDQ4LCAgICA1MywgICAgIDAsCi0gICAgODQsICAgIDQ4LCAgICA1MywgICAgIDAsICAgIDg0LCAgICAgMCwgICAgIDAsICAgIDc0LCAgICA0NywgICAgNzEsCi0gICAgIDAsICAgIDE5LCAgICA0NywgICAgNzEsICAgICAwLCAgICA2OSwgICAgNDksICAgIDgwLCAgICA1MCwgICAgIDAsCi0gICAgNzQsICAgIDQ3LCAgICA3MSwgICAgNDksICAgIDgwLCAgICA1MCwgICAgIDAsICAgIDIyLCAgICA0NywgICAgNzEsCi0gICAgNDksICAgIDgwLCAgICA1MCwgICAgIDAsICAgIDY5LCAgICA0OCwgICAxMTEsICAgIDUzLCAgICAgMCwgICAgMTksCi0gICAgNDgsICAgMTExLCAgICA1MywgICAgIDAsICAgIDc1LCAgICA0OCwgICAxMTEsICAgIDUzLCAgICAgMCwgICAgNzQsCi0gICAgIDAsICAgIDY5LCAgICAgMCwgICAgMTksICAgICAwLCAgICA5MCwgICAgIDAsICAgIDkxLCAgICAgMCwgICAgODksCi0gICAgNDUsICAgICAwLCAgICA4OSwgICAgNDYsICAgICAwLCAgICA5MywgICAgIDAsICAgIDk0LCAgICAgMCwgICAgNDAsCi0gICAgOTIsICAgICAwLCAgICA0MSwgICAgOTIsICAgICAwLCAgICA0MiwgICAgOTIsICAgICAwLCAgICA5NSwgICAgIDAsCi0gICAgNDUsICAgIDkyLCAgICAgMCwgICAgNDYsICAgIDkyLCAgICAgMCwgICAgODksICAgICAwLCAgICA1NCwgICAgOTIsCi0gICAgIDAsICAgIDU1LCAgICA5MiwgICAgIDAsICAgIDk2LCAgICAgMCwgICAgNDksICAgIDYyLCAgICA4NSwgICAgNTAsCi0gICAgOTIsICAgICAwLCAgICA0OSwgICAxMTEsICAgIDUwLCAgICA5NSwgICAgIDAsICAgIDQ5LCAgICA2OSwgICAgODQsCi0gICAgNTAsICAgIDk1LCAgICAgMCwgICAgOTIsICAgICAwLCAgICA5NywgICAgNDIsICAgIDkyLCAgICAgMCwgICAgOTcsCi0gICAgNDMsICAgIDkyLCAgICAgMCwgICAgOTcsICAgIDQ0LCAgICA5MiwgICAgIDAsICAgIDk3LCAgICAgMCwgICAgOTgsCi0gICAgNDAsICAgIDk3LCAgICAgMCwgICAgOTgsICAgIDQxLCAgICA5NywgICAgIDAsICAgIDk4LCAgICAgMCwgICAgOTksCi0gICAgMzgsICAgIDk4LCAgICAgMCwgICAgOTksICAgIDM5LCAgICA5OCwgICAgIDAsICAgIDk5LCAgICAgMCwgICAxMDAsCi0gICAgMzQsICAgIDk5LCAgICAgMCwgICAxMDAsICAgIDM1LCAgICA5OSwgICAgIDAsICAgMTAwLCAgICAzNiwgICAgOTksCi0gICAgIDAsICAgMTAwLCAgICAzNywgICAgOTksICAgICAwLCAgIDEwMCwgICAgIDAsICAgMTAxLCAgICAzMiwgICAxMDAsCi0gICAgIDAsICAgMTAxLCAgICAzMywgICAxMDAsICAgICAwLCAgIDEwMSwgICAgIDAsICAgMTAyLCAgICAzMSwgICAxMDEsCi0gICAgIDAsICAgMTAyLCAgICAgMCwgICAxMDMsICAgIDMwLCAgIDEwMiwgICAgIDAsICAgMTAzLCAgICAgMCwgICAxMDQsCi0gICAgMjksICAgMTAzLCAgICAgMCwgICAxMDQsICAgICAwLCAgIDEwNSwgICAgMjgsICAgMTA0LCAgICAgMCwgICAxMDUsCi0gICAgIDAsICAgMTA2LCAgICAyNywgICAxMDUsICAgICAwLCAgIDEwNiwgICAgIDAsICAgMTA2LCAgICAyNiwgICAxMTEsCi0gICAgNTYsICAgMTA3LCAgICAgMCwgICAxMDcsICAgICAwLCAgIDEwOSwgICAgIDAsICAgMTEwLCAgICAyNSwgICAxMDcsCi0gICAgIDAsICAgMTEwLCAgICAyMCwgICAxMDcsICAgICAwLCAgICA3MCwgICAgIDAsICAgIDE5LCAgICAgMCwgICAgODYsCi0gICAgIDAsICAgIDg4LCAgICAgMCwgICAxMDgsICAgICAwCi19OwotCi0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotc3RhdGljIGNvbnN0IHNob3J0IHl5cmxpbmVbXSA9IHsgMCwKLSAgIDIwMywgICAyMDQsICAgMjA3LCAgIDIxNSwgICAyMTcsICAgMjIwLCAgIDIyOSwgICAyMzUsICAgMjQzLCAgIDI0OCwKLSAgIDI1MywgICAyNjMsICAgMjY1LCAgIDI2OSwgICAyNzEsICAgMjc0LCAgIDI3NywgICAyNzksICAgMjgxLCAgIDI4MywKLSAgIDI4NywgICAyOTAsICAgMzAxLCAgIDMwNiwgICAzMTAsICAgMzEzLCAgIDMxNywgICAzMTksICAgMzIyLCAgIDMyNCwKLSAgIDMyNywgICAzMjksICAgMzMyLCAgIDM1NiwgICAzNTcsICAgMzYxLCAgIDM2MywgICAzNjYsICAgMzY4LCAgIDM3MSwKLSAgIDM3MiwgICAzNzMsICAgMzc0LCAgIDM3NSwgICAzNzYsICAgMzgzLCAgIDM4OCwgICAzOTMsICAgMzk4LCAgIDQwMSwKLSAgIDQwNSwgICA0MDgsICAgNDExLCAgIDQxNCwgICA0MTgsICAgNDIwLCAgIDQyMywgICA0MjcsICAgNDMwLCAgIDQzNCwKLSAgIDQzNiwgICA0NDAsICAgNDQzLCAgIDQ0OCwgICA0NTEsICAgNDUzLCAgIDQ1NywgICA0NzUsICAgNDc3LCAgIDQ4MSwKLSAgIDQ4MywgICA0ODUsICAgNDg3LCAgIDQ4OCwgICA0OTEsICAgNDk2LCAgIDUwMSwgICA1MDMsICAgNTA0LCAgIDUwNSwKLSAgIDUwNywgICA1MDksICAgNTEyLCAgIDUxNywgICA1MjIsICAgNTI0LCAgIDUyNiwgICA1MjgsICAgNTMxLCAgIDUzNiwKLSAgIDU1NywgICA1NjQsICAgNTY2LCAgIDU2OCwgICA1NzAsICAgNTc0LCAgIDU3NiwgICA1NzgsICAgNTgyLCAgIDU4NCwKLSAgIDU4NiwgICA1OTEsICAgNTkzLCAgIDU5NSwgICA1OTcsICAgNTk5LCAgIDYwNCwgICA2MDYsICAgNjA4LCAgIDYxMiwKLSAgIDYxNCwgICA2MTgsICAgNjIwLCAgIDYyMywgICA2MjUsICAgNjI5LCAgIDYzMSwgICA2MzUsICAgNjM3LCAgIDY0MSwKLSAgIDY0MywgICA2NDcsICAgNjQ5LCAgIDY1MiwgICA2NTUsICAgNjYxLCAgIDY2NCwgICA2NjYsICAgNjY3LCAgIDY3MQotfTsKLSNlbmRpZgotCi0KLSNpZiBZWURFQlVHICE9IDAgfHwgZGVmaW5lZCAoWVlFUlJPUl9WRVJCT1NFKQotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHl5dG5hbWVbXSA9IHsgICAiJCIsImVycm9yIiwiJHVuZGVmaW5lZC4iLCJJTlRFR0VSX0xJVEVSQUwiLAotIkZMT0FUSU5HX1BPSU5UX0xJVEVSQUwiLCJJREVOVElGSUVSIiwiU1RSSU5HX0xJVEVSQUwiLCJCT09MRUFOX0xJVEVSQUwiLCJUWVBFTkFNRSIsCi0iTkFNRV9PUl9JTlQiLCJFUlJPUiIsIkxPTkciLCJTSE9SVCIsIkJZVEUiLCJJTlQiLCJDSEFSIiwiQk9PTEVBTiIsIkRPVUJMRSIsCi0iRkxPQVQiLCJWQVJJQUJMRSIsIkFTU0lHTl9NT0RJRlkiLCJUSElTIiwiU1VQRVIiLCJORVciLCInLCciLCInPSciLCInPyciLCJPUk9SIiwKLSJBTkRBTkQiLCInfCciLCInXiciLCInJiciLCJFUVVBTCIsIk5PVEVRVUFMIiwiJzwnIiwiJz4nIiwiTEVRIiwiR0VRIiwiTFNIIiwKLSJSU0giLCInKyciLCInLSciLCInKiciLCInLyciLCInJSciLCJJTkNSRU1FTlQiLCJERUNSRU1FTlQiLCInLiciLCInWyciLCInKCciLAotIicpJyIsIid7JyIsIid9JyIsIiddJyIsIid+JyIsIichJyIsIic6JyIsInN0YXJ0IiwidHlwZV9leHAiLCJQcmltaXRpdmVPckFycmF5VHlwZSIsCi0iU3RyaW5nTGl0ZXJhbCIsIkxpdGVyYWwiLCJQcmltaXRpdmVUeXBlIiwiTnVtZXJpY1R5cGUiLCJJbnRlZ3JhbFR5cGUiLCJGbG9hdGluZ1BvaW50VHlwZSIsCi0iQ2xhc3NPckludGVyZmFjZVR5cGUiLCJDbGFzc1R5cGUiLCJBcnJheVR5cGUiLCJOYW1lIiwiRm9yY2VkTmFtZSIsIlNpbXBsZU5hbWUiLAotIlF1YWxpZmllZE5hbWUiLCJleHAxIiwiUHJpbWFyeSIsIlByaW1hcnlOb05ld0FycmF5IiwibGN1cmx5IiwicmN1cmx5IiwiQ2xhc3NJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiIsCi0iQXJndW1lbnRMaXN0IiwiQXJndW1lbnRMaXN0X29wdCIsIkFycmF5Q3JlYXRpb25FeHByZXNzaW9uIiwiRGltRXhwcnMiLCJEaW1FeHByIiwKLSJEaW1zIiwiRGltc19vcHQiLCJGaWVsZEFjY2VzcyIsIk1ldGhvZEludm9jYXRpb24iLCJBcnJheUFjY2VzcyIsIlBvc3RmaXhFeHByZXNzaW9uIiwKLSJQb3N0SW5jcmVtZW50RXhwcmVzc2lvbiIsIlBvc3REZWNyZW1lbnRFeHByZXNzaW9uIiwiVW5hcnlFeHByZXNzaW9uIiwiUHJlSW5jcmVtZW50RXhwcmVzc2lvbiIsCi0iUHJlRGVjcmVtZW50RXhwcmVzc2lvbiIsIlVuYXJ5RXhwcmVzc2lvbk5vdFBsdXNNaW51cyIsIkNhc3RFeHByZXNzaW9uIiwiTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIiwKLSJBZGRpdGl2ZUV4cHJlc3Npb24iLCJTaGlmdEV4cHJlc3Npb24iLCJSZWxhdGlvbmFsRXhwcmVzc2lvbiIsIkVxdWFsaXR5RXhwcmVzc2lvbiIsCi0iQW5kRXhwcmVzc2lvbiIsIkV4Y2x1c2l2ZU9yRXhwcmVzc2lvbiIsIkluY2x1c2l2ZU9yRXhwcmVzc2lvbiIsIkNvbmRpdGlvbmFsQW5kRXhwcmVzc2lvbiIsCi0iQ29uZGl0aW9uYWxPckV4cHJlc3Npb24iLCJDb25kaXRpb25hbEV4cHJlc3Npb24iLCJBc3NpZ25tZW50RXhwcmVzc2lvbiIsIkFzc2lnbm1lbnQiLAotIkxlZnRIYW5kU2lkZSIsIkV4cHJlc3Npb24iLCBOVUxMCi19OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXIxW10gPSB7ICAgICAwLAotICAgIDU3LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MSwgICAgNjEsICAgIDYxLAotICAgIDYxLCAgICA2MiwgICAgNjIsICAgIDYzLCAgICA2MywgICAgNjQsICAgIDY0LCAgICA2NCwgICAgNjQsICAgIDY0LAotICAgIDY1LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjgsICAgIDY5LCAgICA2OSwgICAgNzAsICAgIDcwLAotICAgIDcxLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3MywgICAgNzQsICAgIDc0LCAgICA3NSwgICAgNzUsICAgIDc1LAotICAgIDc1LCAgICA3NSwgICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDc5LAotICAgIDgwLCAgICA4MCwgICAgODEsICAgIDgxLCAgICA4MiwgICAgODIsICAgIDgzLCAgICA4NCwgICAgODQsICAgIDg1LAotICAgIDg1LCAgICA4NiwgICAgODYsICAgIDg3LCAgICA4NywgICAgODcsICAgIDg4LCAgICA4OCwgICAgODgsICAgIDg5LAotICAgIDg5LCAgICA4OSwgICAgODksICAgIDg5LCAgICA5MCwgICAgOTEsICAgIDkyLCAgICA5MiwgICAgOTIsICAgIDkyLAotICAgIDkyLCAgICA5MiwgICAgOTMsICAgIDk0LCAgICA5NSwgICAgOTUsICAgIDk1LCAgICA5NSwgICAgOTYsICAgIDk2LAotICAgIDk2LCAgICA5NywgICAgOTcsICAgIDk3LCAgICA5NywgICAgOTgsICAgIDk4LCAgICA5OCwgICAgOTksICAgIDk5LAotICAgIDk5LCAgIDEwMCwgICAxMDAsICAgMTAwLCAgIDEwMCwgICAxMDAsICAgMTAxLCAgIDEwMSwgICAxMDEsICAgMTAyLAotICAgMTAyLCAgIDEwMywgICAxMDMsICAgMTA0LCAgIDEwNCwgICAxMDUsICAgMTA1LCAgIDEwNiwgICAxMDYsICAgMTA3LAotICAgMTA3LCAgIDEwOCwgICAxMDgsICAgMTA5LCAgIDEwOSwgICAxMTAsICAgMTEwLCAgIDExMCwgICAxMTAsICAgMTExCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0geyAgICAgMCwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKLSAgICAgMSwgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMywKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDUsICAgICAxLCAgICAgMywKLSAgICAgMCwgICAgIDEsICAgICA0LCAgICAgNCwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDIsICAgICAzLCAgICAgMSwKLSAgICAgMCwgICAgIDMsICAgICAzLCAgICAgNCwgICAgIDYsICAgICA2LCAgICAgNCwgICAgIDQsICAgICA0LCAgICAgMSwKLSAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwKLSAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDEsICAgICA1LCAgICAgNCwKLSAgICAgNSwgICAgIDEsICAgICAzLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMywKLSAgICAgMywgICAgIDEsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMSwKLSAgICAgMywgICAgIDEsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMSwKLSAgICAgNSwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMQotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmYWN0W10gPSB7ICAgICAwLAotICAgICA3LCAgICAgOSwgICAgMjcsICAgICA2LCAgICAxMCwgICAgIDgsICAgIDE5LCAgICAxNywgICAgMTYsICAgIDE4LAotICAgIDIwLCAgICAxMywgICAgMjIsICAgIDIxLCAgICA3MiwgICAgMzksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0NiwgICAgIDAsICAgICAwLCAgICAgMiwgICAgIDMsICAgIDExLAotICAgIDM4LCAgICAgNCwgICAgMTIsICAgIDE0LCAgICAxNSwgICAgIDUsICAgIDcxLCAgIDEyNiwgICAgMjksICAgIDI4LAotICAgICAxLCAgICA3MCwgICAgMzYsICAgICAwLCAgICA0MSwgICAgMzcsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDg1LAotICAgIDczLCAgICA3NCwgICAgOTIsICAgIDc3LCAgICA3OCwgICAgODIsICAgIDg4LCAgICA5NiwgICAgOTksICAgMTAyLAotICAgMTA3LCAgIDExMCwgICAxMTIsICAgMTE0LCAgIDExNiwgICAxMTgsICAgMTIwLCAgIDEyMiwgICAxMzAsICAgMTIzLAotICAgICAwLCAgICAzNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjcsICAgICAwLCAgICAyNCwgICAgIDAsICAgIDIzLAotICAgIDI4LCAgICAgOCwgICAgNzIsICAgIDcxLCAgICA0MiwgICAgNDQsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgzLAotICAgIDg0LCAgICA2MSwgICAgNzEsICAgICAwLCAgICA4NiwgICAgODcsICAgICAwLCAgICAyNSwgICAgIDAsICAgICAwLAotICAgIDUxLCAgICAyNiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ5LCAgICA3NSwgICAgNzYsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgIDMxLCAgICAzMiwgICAgNjMsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDYxLCAgICA1NSwgICAgNjEsICAgIDUxLAotICAgICAwLCAgICA2MCwgICAgIDAsICAgICAwLCAgICA0MCwgICAgNTgsICAgICAwLCAgICAzMywgICAgIDAsICAgIDUyLAotICAgICAwLCAgICAzNSwgICAgNjIsICAgICAwLCAgICAgMCwgICAgNDcsICAgIDQ1LCAgICA5MywgICAgOTQsICAgIDk1LAotICAgIDk3LCAgICA5OCwgICAxMDAsICAgMTAxLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxMDgsICAgMTA5LAotICAgMTExLCAgIDExMywgICAxMTUsICAgMTE3LCAgICAgMCwgICAxMTksICAgMTI1LCAgIDEyNCwgICAgNjgsICAgIDUxLAotICAgICAwLCAgICAgMCwgICAgNTYsICAgIDUzLCAgICA1NCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTAsICAgIDU5LAotICAgIDY3LCAgICA2NCwgICAgNTEsICAgIDY5LCAgICA1MCwgICAgIDAsICAgICAwLCAgICA1NywgICAgNDgsICAgIDg5LAotICAgIDkxLCAgICAgMCwgICAxMjEsICAgIDY2LCAgICA2NSwgICAgIDAsICAgICAwLCAgICAgMAotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmZ290b1tdID0geyAgIDIwNiwKLSAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDc4LCAgICA3OSwKLSAgICAzNiwgICAgODQsICAgIDM4LCAgICAzOSwgICAgODEsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgIDE1NywKLSAgICA0NSwgICAxNTAsICAgMTUxLCAgICA0NiwgICAxMzcsICAgMTM4LCAgIDE0MiwgICAxNDMsICAgIDg1LCAgICA0OCwKLSAgICA4NiwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwKLSAgICA1OSwgICAgNjAsICAgIDYxLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY3LCAgICA2OCwKLSAgICA2OSwgICAgNzAsICAgIDcxLCAgIDEwNwotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0geyAgIDIwNiwKLS0zMjc2OCwtMzI3NjgsICAgIC01LC0zMjc2OCwtMzI3NjgsICAgIC0zLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgIDEsLTMyNzY4LCAgIC0zNCwgICAyMjUsICAgMzEyLCAgIDMxMiwKLSAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDIwNiwtMzI3NjgsICAgMzEyLCAgIDMxMiwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwgICAtMjMsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAzNCwtMzI3NjgsLTMyNzY4LCAgICAgNywKLSAgICAgNCwgICAtMjgsICAgLTE3LCAgIDM2NSwtMzI3NjgsLTMyNzY4LCAgICAxNSwtMzI3NjgsICAgIDIxLCAgICA3NCwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgNDUsICAgIDQ0LCAgICA4NiwKLSAgICAzNSwgICAgOTYsICAgICAzLCAgICAyMywgICAgIDgsICAgIDUxLCAgIDEwNCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLSAgICAzMiwtMzI3NjgsICAgIDQ2LCAgIDM2NSwgICAgNDYsLTMyNzY4LCAgICAyNSwgICAgMjUsICAgIDE0LCAgICA1NSwKLS0zMjc2OCwtMzI3NjgsICAgIDg3LCAgICA0NywtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwgICAtMjMsICAgIDM0LCAgICA0MCwtMzI3NjgsLTMyNzY4LCAgICA1NywgICAgNTAsICAgIDQ2LCAgIDI1OSwKLSAgIDM2NSwgICAgNTAsICAgMzY1LCAgICA0NiwgICAzNjUsICAgLTEzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDMxMiwKLSAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwKLSAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDMxMiwgICAzMTIsICAgMzEyLCAgIDM2NSwgICAzMTIsICAgMzEyLCAgIDMxMiwKLS0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA2MSwgICAgNTksICAgMzY1LCAgICA1NiwtMzI3NjgsICAgIDU2LCAgIDM2NSwKLSAgIDM2NSwgICAgNTAsICAgIDY2LCAgICA0MywgICAzNzIsLTMyNzY4LCAgICA2OSwtMzI3NjgsICAgIDczLCAgIDEwOCwKLSAgIDEwNiwtMzI3NjgsICAgMTExLCAgIDEwOSwgICAzNjUsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLSAgICA0NSwgICAgNDUsICAgIDQ0LCAgICA0NCwgICAgODYsICAgIDg2LCAgICA4NiwgICAgODYsICAgIDM1LCAgICAzNSwKLSAgICA5NiwgICAgIDMsICAgIDIzLCAgICAgOCwgICAxMDcsICAgIDUxLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDM2NSwKLSAgIDExMiwgICAyNTksLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMTE0LCAgIDMxMiwgICAzNzIsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwtMzI3NjgsICAgMzY1LC0zMjc2OCwtMzI3NjgsICAgMzEyLCAgIDExNiwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKLS0zMjc2OCwgICAxMTgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMTY5LCAgIDE3MCwtMzI3NjgKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPSB7LTMyNzY4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAtOCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LCAgICAgNSwtMzI3NjgsICAgLTY2LCAgICAgMCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LCAgIDEyNywgIC0xMjYsLTMyNzY4LCAgICA5NCwgICAtOTQsICAgLTI5LCAgIC00MCwgICAgIDYsLTMyNzY4LAotICAgIDEyLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAzOSwtMzI3NjgsLTMyNzY4LCAgLTE0MSwtMzI3NjgsICAgIDI0LAotICAgIDI4LCAgIC00MiwgICAgMzYsICAgIDUyLCAgICA1MywgICAgNDksICAgIDU4LCAgICA0OCwtMzI3NjgsICAtMTI4LAotLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgIDE4Ci19OwotCi0KLSNkZWZpbmUJWVlMQVNUCQk0MjcKLQotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXl0YWJsZVtdID0geyAgICA0MCwKLSAgIDE3NywgICAxNzgsICAgIDk4LCAgIDE4OSwgICAgMzcsICAgIDQ3LCAgIDEzMywgICAxMDIsICAgMTM1LCAgICA3NywKLSAgIDE1NSwgICAgNDksICAgIDc1LCAgIDE4NiwgICAtMzEsICAgIDkyLCAgIC0zMiwgICAgNzIsICAgMTA0LCAgIC0zMSwKLSAgLTEyNywgICAtMzIsICAgIDgwLCAgICA0MCwgICAgOTcsICAtMTI3LCAgIC0zMCwgICAxMDMsICAgIDkzLCAgICA0NywKLSAgIDEwNSwgICAtMzAsICAgMTQ4LCAgIDEyMywgIC0xMjgsICAgIDQ5LCAgIDEyNSwgICAxNTMsICAgMTU2LCAgLTEyOCwKLSAgLTEyOSwgICAgOTQsICAgMTgzLCAgICA0MCwgICAxODMsICAtMTI5LCAgIDIwMSwgICAgNzMsICAgIDc0LCAgICA0NywKLSAgIDEzMSwgICAxMjksICAgMTI0LCAgIDE5NywgICAxMzIsICAgIDQ5LCAgIDEzMCwgICAgODcsICAgIDg4LCAgICA4OSwKLSAgICA5MCwgICAgOTEsICAgMTQwLCAgIDE0NCwgICAgOTUsICAgIDk2LCAgIDIwMiwgICAyMDMsICAgMTE3LCAgIDExOCwKLSAgIDExOSwgICAxMjAsICAgMTM2LCAgICA0MCwgICAxNjUsICAgMTY2LCAgIDE2NywgICAxNjgsICAgMTI2LCAgICA0NywKLSAgICA5OSwgICAxMDAsICAgMTAxLCAgIDExMywgICAxMTQsICAgIDQ5LCAgIDExMCwgICAxMTEsICAgMTEyLCAgIDE0NSwKLSAgIDE0NywgICAxMzQsICAgMTg4LCAgICA5OSwgICAxNDEsICAgMTAxLCAgIDE4NCwgICAxNDcsICAgMTg1LCAgICA0MCwKLSAgICA0MCwgICAgOTksICAgIDQwLCAgIDE4MiwgICAgNDAsICAgIDQ3LCAgICA0NywgICAxODAsICAgIDQ3LCAgIDE0NiwKLSAgICA0NywgICAgNDksICAgIDQ5LCAgIDE3OSwgICAgNDksICAgMTg3LCAgICA0OSwgICAxNDksICAgMTA4LCAgIDEwOSwKLSAgIDE1MiwgICAxOTAsICAgMTU0LCAgIDExNSwgICAxMTYsICAgMTkxLCAgICA0MCwgICAxMjEsICAgMTIyLCAgIDEyNywKLSAgIDEyOCwgICAxNTUsICAgIDQ3LCAgICA3MywgICAgNzQsICAgIDQwLCAgIDE2MSwgICAxNjIsICAgIDQ5LCAgICA0MCwKLSAgICA0MCwgICAgNDcsICAgMTYzLCAgIDE2NCwgICAxNzUsICAgIDQ3LCAgICA0NywgICAgNDksICAgMTU4LCAgIDE1OSwKLSAgIDE2MCwgICAgNDksICAgIDQ5LCAgIDE4MSwgICAgNDAsICAgMTkyLCAgIDE2OSwgICAxNzAsICAgMTQ5LCAgIDE5MywKLSAgICA0NywgICAxOTQsICAgMTk2LCAgIDE5OSwgICAxOTgsICAgMjA0LCAgICA0OSwgICAyMDUsICAgMjA3LCAgIDIwOCwKLSAgIDEwNiwgICAxMzksICAgMTk1LCAgIDE3MywgICAxNzEsICAgMTc2LCAgIDE3MiwgICAgIDAsICAgICAwLCAgICA0MCwKLSAgICAgMCwgICAgNDAsICAgICAwLCAgIDE3NCwgICAgIDAsICAgIDQ3LCAgICAgMCwgICAgNDcsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgNDksICAgIDQwLCAgICA0OSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDQ3LCAgIDE4MSwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNDksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAxLCAgICAgMiwKLSAgICAgMywgICAgIDQsICAgICA1LCAgICAgMCwgICAgIDYsICAgICAwLCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwKLSAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgMjAwLCAgICAxNiwgICAgMTcsICAgIDE4LCAgICA3NiwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKLSAgICAxMiwgICAgMTMsICAgIDE0LCAgICAgMCwgICAgIDAsICAgIDE5LCAgICAyMCwgICAgMjEsICAgICAwLCAgICAgMCwKLSAgICAyMiwgICAgMjMsICAgICAwLCAgICAgMCwgICAgMjQsICAgICAwLCAgICAyNSwgICAgIDAsICAgICAwLCAgICAyNiwKLSAgICAyNywgICAgIDEsICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgMCwgICAgIDYsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTUsICAgICAwLCAgICAxNiwKLSAgICAxNywgICAgMTgsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE5LCAgICAyMCwKLSAgICAyMSwgICAgIDAsICAgICAwLCAgICAyMiwgICAgMjMsICAgICAwLCAgICAgMCwgICAgMjQsICAgICAwLCAgICAyNSwKLSAgICAgMCwgICAxNDYsICAgIDI2LCAgICAyNywgICAgIDEsICAgICAyLCAgICA3NiwgICAgIDQsICAgICA1LCAgICAgMCwKLSAgICA4MiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICA4MywgICAgIDAsICAgIDE2LCAgICAxNywgICAgMTgsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgIDAsICAgICAwLCAgICAyMiwgICAgMjMsICAgICAwLCAgICAgMCwKLSAgICAyNCwgICAgIDAsICAgIDI1LCAgICAgMCwgICAgIDAsICAgIDI2LCAgICAyNywgICAgIDEsICAgICAyLCAgICAgMywKLSAgICAgNCwgICAgIDUsICAgICAwLCAgICAgNiwgICAgIDEsICAgICAyLCAgICA3NiwgICAgIDQsICAgICA1LCAgICAgMCwKLSAgICA4MiwgICAgIDAsICAgICAwLCAgICAxNSwgICAgIDAsICAgIDE2LCAgICAxNywgICAgMTgsICAgICAwLCAgICAgMCwKLSAgICA4MywgICAgIDAsICAgIDE2LCAgICAxNywgICAgMTgsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKLSAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgIDAsICAgICAwLCAgICAyMiwKLSAgICAyMywgICAgIDAsICAgICAwLCAgICAyNCwgICAgIDAsICAgIDI1LCAgICAgMCwgICAgIDAsICAgIDI2LCAgICAyNywKLSAgICAyNCwgICAgIDAsICAgIDI1LCAgICAgMCwgICAgIDAsICAgIDI2LCAgICAyNwotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5Y2hlY2tbXSA9IHsgICAgIDAsCi0gICAxMjksICAgMTMwLCAgICAzMiwgICAxNDUsICAgICAwLCAgICAgMCwgICAgNzMsICAgIDM3LCAgICA3NSwgICAgMTgsCi0gICAgMjQsICAgICAwLCAgICA0NywgICAxNDAsICAgIDIwLCAgICAyNCwgICAgMjAsICAgICAwLCAgICA0NywgICAgMjUsCi0gICAgMjAsICAgIDI1LCAgICAxOCwgICAgMjQsICAgIDQ4LCAgICAyNSwgICAgMjAsICAgIDI0LCAgICAyNCwgICAgMjQsCi0gICAgNDgsICAgIDI1LCAgICA5OSwgICAgMzEsICAgIDIwLCAgICAyNCwgICAgMjksICAgMTA0LCAgICA1MiwgICAgMjUsCi0gICAgMjAsICAgIDI0LCAgIDEzNywgICAgNDQsICAgMTM5LCAgICAyNSwgICAxODgsICAgIDQ3LCAgICA0OCwgICAgNDQsCi0gICAgIDUsICAgIDIwLCAgICAzMCwgICAxODAsICAgICA5LCAgICA0NCwgICAgMjUsICAgIDE5LCAgICAyMCwgICAgMjEsCi0gICAgMjIsICAgIDIzLCAgICA0OSwgICAgOTMsICAgIDI2LCAgICAyNywgICAxOTMsICAgMTk2LCAgICAzNCwgICAgMzUsCi0gICAgMzYsICAgIDM3LCAgICA0OCwgICAgNzQsICAgMTE3LCAgIDExOCwgICAxMTksICAgMTIwLCAgICAyOCwgICAgNzQsCi0gICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNDAsICAgIDQxLCAgICA3NCwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNTAsCi0gICAgNDgsICAgIDc0LCAgICA1MCwgICAgNDcsICAgIDQ4LCAgICA0OSwgICAxMzcsICAgIDQ4LCAgIDEzOSwgICAxMDAsCi0gICAxMDEsICAgIDQ3LCAgIDEwMywgICAgNDgsICAgMTA1LCAgIDEwMCwgICAxMDEsICAgIDQ5LCAgIDEwMywgICAgNTMsCi0gICAxMDUsICAgMTAwLCAgIDEwMSwgICAgNTMsICAgMTAzLCAgICA1MCwgICAxMDUsICAgMTAwLCAgICA0NSwgICAgNDYsCi0gICAxMDMsICAgIDUzLCAgIDEwNSwgICAgMzgsICAgIDM5LCAgICA1MywgICAxMjcsICAgIDMyLCAgICAzMywgICAgMjYsCi0gICAgMjcsICAgIDI0LCAgIDEyNywgICAgNDcsICAgIDQ4LCAgIDEzNiwgICAxMTMsICAgMTE0LCAgIDEyNywgICAxNDAsCi0gICAxNDEsICAgMTM2LCAgIDExNSwgICAxMTYsICAgMTI3LCAgIDE0MCwgICAxNDEsICAgMTM2LCAgIDExMCwgICAxMTEsCi0gICAxMTIsICAgMTQwLCAgIDE0MSwgICAxMzYsICAgMTU1LCAgICA1MCwgICAxMjEsICAgMTIyLCAgIDE0MSwgICAgNDksCi0gICAxNTUsICAgIDUzLCAgICA1NiwgICAgNTAsICAgIDUzLCAgICA1MCwgICAxNTUsICAgIDUwLCAgICAgMCwgICAgIDAsCi0gICAgNDQsICAgIDc4LCAgIDE1NSwgICAxMjUsICAgMTIzLCAgIDEyOCwgICAxMjQsICAgIC0xLCAgICAtMSwgICAxODAsCi0gICAgLTEsICAgMTgyLCAgICAtMSwgICAxMjYsICAgIC0xLCAgIDE4MCwgICAgLTEsICAgMTgyLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgMTgwLCAgIDE5MywgICAxODIsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgIDE5MywgICAxODIsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgMTkzLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAgMywgICAgIDQsCi0gICAgIDUsICAgICA2LCAgICAgNywgICAgLTEsICAgICA5LCAgICAtMSwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsCi0gICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgIDE4NywgICAgMjEsICAgIDIyLCAgICAyMywgICAgIDUsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsCi0gICAgMTYsICAgIDE3LCAgICAxOCwgICAgLTEsICAgIC0xLCAgICA0MCwgICAgNDEsICAgIDQyLCAgICAtMSwgICAgLTEsCi0gICAgNDUsICAgIDQ2LCAgICAtMSwgICAgLTEsICAgIDQ5LCAgICAtMSwgICAgNTEsICAgIC0xLCAgICAtMSwgICAgNTQsCi0gICAgNTUsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgLTEsICAgICA5LCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDE5LCAgICAtMSwgICAgMjEsCi0gICAgMjIsICAgIDIzLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA0MCwgICAgNDEsCi0gICAgNDIsICAgIC0xLCAgICAtMSwgICAgNDUsICAgIDQ2LCAgICAtMSwgICAgLTEsICAgIDQ5LCAgICAtMSwgICAgNTEsCi0gICAgLTEsICAgIDUzLCAgICA1NCwgICAgNTUsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgLTEsCi0gICAgIDksICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgMTksICAgIC0xLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIDQwLCAgICA0MSwgICAgNDIsICAgIC0xLCAgICAtMSwgICAgNDUsICAgIDQ2LCAgICAtMSwgICAgLTEsCi0gICAgNDksICAgIC0xLCAgICA1MSwgICAgLTEsICAgIC0xLCAgICA1NCwgICAgNTUsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAtMSwgICAgIDksICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgLTEsCi0gICAgIDksICAgIC0xLCAgICAtMSwgICAgMTksICAgIC0xLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAtMSwgICAgLTEsCi0gICAgMTksICAgIC0xLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsCi0gICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICA0MSwgICAgNDIsICAgIC0xLCAgICAtMSwgICAgNDUsCi0gICAgNDYsICAgIC0xLCAgICAtMSwgICAgNDksICAgIC0xLCAgICA1MSwgICAgLTEsICAgIC0xLCAgICA1NCwgICAgNTUsCi0gICAgNDksICAgIC0xLCAgICA1MSwgICAgLTEsICAgIC0xLCAgICA1NCwgICAgNTUKLX07Ci0vKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLwotI2xpbmUgMyAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQotLyogU2tlbGV0b24gb3V0cHV0IHBhcnNlciBmb3IgYmlzb24sCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0vKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCi0gICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgotICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KLQotI2lmbmRlZiBhbGxvY2EKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UgLyogbm90IEdOVSBDLiAgKi8KLSNpZiAoIWRlZmluZWQgKF9fU1REQ19fKSAmJiBkZWZpbmVkIChzcGFyYykpIHx8IGRlZmluZWQgKF9fc3BhcmNfXykgfHwgZGVmaW5lZCAoX19zcGFyYykgfHwgZGVmaW5lZCAoX19zZ2kpCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci0jZWxzZSAvKiBub3Qgc3BhcmMgKi8KLSNpZiBkZWZpbmVkIChNU0RPUykgJiYgIWRlZmluZWQgKF9fVFVSQk9DX18pCi0jZWxzZSAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KLSNpZiBkZWZpbmVkKF9BSVgpCi0gI3ByYWdtYSBhbGxvY2EKLSNlbHNlIC8qIG5vdCBNU0RPUywgX19UVVJCT0NfXywgb3IgX0FJWCAqLwotI2lmZGVmIF9faHB1eAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLXZvaWQgKmFsbG9jYSAodW5zaWduZWQgaW50KTsKLX07Ci0jZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KLXZvaWQgKmFsbG9jYSAoKTsKLSNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNlbmRpZiAvKiBfX2hwdXggKi8KLSNlbmRpZiAvKiBub3QgX0FJWCAqLwotI2VuZGlmIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLwotI2VuZGlmIC8qIG5vdCBzcGFyYy4gICovCi0jZW5kaWYgLyogbm90IEdOVSBDLiAgKi8KLSNlbmRpZiAvKiBhbGxvY2Egbm90IGRlZmluZWQuICAqLwotCi0vKiBUaGlzIGlzIHRoZSBwYXJzZXIgY29kZSB0aGF0IGlzIHdyaXR0ZW4gaW50byBlYWNoIGJpc29uIHBhcnNlcgotICB3aGVuIHRoZSAlc2VtYW50aWNfcGFyc2VyIGRlY2xhcmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGdyYW1tYXIuCi0gIEl0IHdhcyB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIGhhaXJ5IHBhcnNlcgotICB1c2VkIHdoZW4gJXNlbWFudGljX3BhcnNlciBpcyBzcGVjaWZpZWQuICAqLwotCi0vKiBOb3RlOiB0aGVyZSBtdXN0IGJlIG9ubHkgb25lIGRvbGxhciBzaWduIGluIHRoaXMgZmlsZS4KLSAgIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBsaXN0IG9mIGFjdGlvbnMsIGVhY2ggYWN0aW9uCi0gICBhcyBvbmUgY2FzZSBvZiB0aGUgc3dpdGNoLiAgKi8KLQotI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQotI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCi0jZGVmaW5lIFlZRU1QVFkJCS0yCi0jZGVmaW5lIFlZRU9GCQkwCi0jZGVmaW5lIFlZQUNDRVBUCXJldHVybigwKQotI2RlZmluZSBZWUFCT1JUIAlyZXR1cm4oMSkKLSNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycmxhYjEKLS8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLgotICAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkgdG8gZWFzZSB0aGUKLSAgIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCi0gICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCi0jZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgotI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCi0jZGVmaW5lIFlZQkFDS1VQKHRva2VuLCB2YWx1ZSkgXAotZG8JCQkJCQkJCVwKLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKLSAgICB7IHl5Y2hhciA9ICh0b2tlbiksIHl5bHZhbCA9ICh2YWx1ZSk7CQkJXAotICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCi0gICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKLSAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAotICAgIH0JCQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJXAotICAgIHsgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTsgWVlFUlJPUjsgfQlcCi13aGlsZSAoMCkKLQotI2RlZmluZSBZWVRFUlJPUgkxCi0jZGVmaW5lIFlZRVJSQ09ERQkyNTYKLQotI2lmbmRlZiBZWVBVUkUKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCkKLSNlbmRpZgotCi0jaWZkZWYgWVlQVVJFCi0jaWZkZWYgWVlMU1BfTkVFREVECi0jaWZkZWYgWVlMRVhfUEFSQU0KLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MpCi0jZW5kaWYKLSNlbHNlIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KLSNpZmRlZiBZWUxFWF9QQVJBTQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCi0jZWxzZQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCkKLSNlbmRpZgotI2VuZGlmIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KLSNlbmRpZgotCi0vKiBJZiBub25yZWVudHJhbnQsIGdlbmVyYXRlIHRoZSB2YXJpYWJsZXMgaGVyZSAqLwotCi0jaWZuZGVmIFlZUFVSRQotCi1pbnQJeXljaGFyOwkJCS8qICB0aGUgbG9va2FoZWFkIHN5bWJvbAkJKi8KLVlZU1RZUEUJeXlsdmFsOwkJCS8qICB0aGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlCQkqLwotCQkJCS8qICBsb29rYWhlYWQgc3ltYm9sCQkJKi8KLQotI2lmZGVmIFlZTFNQX05FRURFRAotWVlMVFlQRSB5eWxsb2M7CQkJLyogIGxvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rYWhlYWQJKi8KLQkJCQkvKiAgc3ltYm9sCQkJCSovCi0jZW5kaWYKLQotaW50IHl5bmVycnM7CQkJLyogIG51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyICAgICAgICovCi0jZW5kaWYgIC8qIG5vdCBZWVBVUkUgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotaW50IHl5ZGVidWc7CQkJLyogIG5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UJKi8KLS8qIFNpbmNlIHRoaXMgaXMgdW5pbml0aWFsaXplZCwgaXQgZG9lcyBub3Qgc3RvcCBtdWx0aXBsZSBwYXJzZXJzCi0gICBmcm9tIGNvZXhpc3RpbmcuICAqLwotI2VuZGlmCi0KLS8qICBZWUlOSVRERVBUSCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzCSovCi0KLSNpZm5kZWYJWVlJTklUREVQVEgKLSNkZWZpbmUgWVlJTklUREVQVEggMjAwCi0jZW5kaWYKLQotLyogIFlZTUFYREVQVEggaXMgdGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvCi0gICAgKGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLiAgKi8KLQotI2lmIFlZTUFYREVQVEggPT0gMAotI3VuZGVmIFlZTUFYREVQVEgKLSNlbmRpZgotCi0jaWZuZGVmIFlZTUFYREVQVEgKLSNkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAotI2VuZGlmCi0KLS8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotaW50IHl5cGFyc2UgKHZvaWQpOwotI2VuZGlmCi0MCi0jaWYgX19HTlVDX18gPiAxCQkvKiBHTlUgQyBhbmQgR05VIEMrKyBkZWZpbmUgdGhpcy4gICovCi0jZGVmaW5lIF9feXlfbWVtY3B5KFRPLEZST00sQ09VTlQpCV9fYnVpbHRpbl9tZW1jcHkoVE8sRlJPTSxDT1VOVCkKLSNlbHNlCQkJCS8qIG5vdCBHTlUgQyBvciBDKysgKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLQotLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKLSAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1fX3l5X21lbWNweSAodG8sIGZyb20sIGNvdW50KQotICAgICBjaGFyICp0bzsKLSAgICAgY2hhciAqZnJvbTsKLSAgICAgaW50IGNvdW50OwotewotICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKLSAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOwotICByZWdpc3RlciBpbnQgaSA9IGNvdW50OwotCi0gIHdoaWxlIChpLS0gPiAwKQotICAgICp0KysgPSAqZisrOwotfQotCi0jZWxzZSAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcwotICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLwotc3RhdGljIHZvaWQKLV9feXlfbWVtY3B5IChjaGFyICp0bywgY2hhciAqZnJvbSwgaW50IGNvdW50KQotewotICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKLSAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOwotICByZWdpc3RlciBpbnQgaSA9IGNvdW50OwotCi0gIHdoaWxlIChpLS0gPiAwKQotICAgICp0KysgPSAqZisrOwotfQotCi0jZW5kaWYKLSNlbmRpZgotDAotI2xpbmUgMTk2ICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotCi0vKiBUaGUgdXNlciBjYW4gZGVmaW5lIFlZUEFSU0VfUEFSQU0gYXMgdGhlIG5hbWUgb2YgYW4gYXJndW1lbnQgdG8gYmUgcGFzc2VkCi0gICBpbnRvIHl5cGFyc2UuICBUaGUgYXJndW1lbnQgc2hvdWxkIGhhdmUgdHlwZSB2b2lkICouCi0gICBJdCBzaG91bGQgYWN0dWFsbHkgcG9pbnQgdG8gYW4gb2JqZWN0LgotICAgR3JhbW1hciBhY3Rpb25zIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlIGJ5IGNhc3RpbmcgaXQKLSAgIHRvIHRoZSBwcm9wZXIgcG9pbnRlciB0eXBlLiAgKi8KLQotI2lmZGVmIFlZUEFSU0VfUEFSQU0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAotI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIFlZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMIHZvaWQgKllZUEFSU0VfUEFSQU07Ci0jZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZWxzZSAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSNlbmRpZiAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLwotCi1pbnQKLXl5cGFyc2UoWVlQQVJTRV9QQVJBTV9BUkcpCi0gICAgIFlZUEFSU0VfUEFSQU1fREVDTAotewotICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKLSAgcmVnaXN0ZXIgaW50IHl5bjsKLSAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOwotICByZWdpc3RlciBZWVNUWVBFICp5eXZzcDsKLSAgaW50IHl5ZXJyc3RhdHVzOwkvKiAgbnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZCAqLwotICBpbnQgeXljaGFyMSA9IDA7CQkvKiAgbG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIgKi8KLQotICBzaG9ydAl5eXNzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc3RhdGUgc3RhY2sJCQkqLwotICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjawkJKi8KLQotICBzaG9ydCAqeXlzcyA9IHl5c3NhOwkJLyogIHJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycyAqLwotICBZWVNUWVBFICp5eXZzID0geXl2c2E7CS8qICB0byBhbGxvdyB5eW92ZXJmbG93IHRvIHhyZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlICovCi0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgbG9jYXRpb24gc3RhY2sJCQkqLwotICBZWUxUWVBFICp5eWxzID0geXlsc2E7Ci0gIFlZTFRZUEUgKnl5bHNwOwotCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSwgeXlsc3AtLSkKLSNlbHNlCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSkKLSNlbmRpZgotCi0gIGludCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOwotCi0jaWZkZWYgWVlQVVJFCi0gIGludCB5eWNoYXI7Ci0gIFlZU1RZUEUgeXlsdmFsOwotICBpbnQgeXluZXJyczsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxsb2M7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIFlZU1RZUEUgeXl2YWw7CQkvKiAgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmV0dXJuCQkqLwotCQkJCS8qICBzZW1hbnRpYyB2YWx1ZXMgZnJvbSB0aGUgYWN0aW9uCSovCi0JCQkJLyogIHJvdXRpbmVzCQkJCSovCi0KLSAgaW50IHl5bGVuOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpOwotI2VuZGlmCi0KLSAgeXlzdGF0ZSA9IDA7Ci0gIHl5ZXJyc3RhdHVzID0gMDsKLSAgeXluZXJycyA9IDA7Ci0gIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwotCi0gIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCi0gICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawotICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCi0gICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLQotICB5eXNzcCA9IHl5c3MgLSAxOwotICB5eXZzcCA9IHl5dnM7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwID0geXlsczsKLSNlbmRpZgotCi0vKiBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiAgeXlzdGF0ZSAgLiAgKi8KLS8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCi0gICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuICAqLwoteXluZXdzdGF0ZToKLQotICAqKyt5eXNzcCA9IHl5c3RhdGU7Ci0KLSAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0gICAgewotICAgICAgLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHhyZWFsbG9jYXRlIHRoZSBzdGFjayAqLwotICAgICAgLyogVXNlIGNvcGllcyBvZiB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvIG1lbW9yeS4gKi8KLSAgICAgIFlZU1RZUEUgKnl5dnMxID0geXl2czsKLSAgICAgIHNob3J0ICp5eXNzMSA9IHl5c3M7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICBZWUxUWVBFICp5eWxzMSA9IHl5bHM7Ci0jZW5kaWYKLQotICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCi0gICAgICBpbnQgc2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7Ci0KLSNpZmRlZiB5eW92ZXJmbG93Ci0gICAgICAvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZgotCSB0aGUgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICAqLwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLAotCSBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KLSAgICAgIHl5b3ZlcmZsb3coInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCi0JCSAmeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAmeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAmeXlsczEsIHNpemUgKiBzaXplb2YgKCp5eWxzcCksCi0JCSAmeXlzdGFja3NpemUpOwotI2Vsc2UKLSAgICAgIHl5b3ZlcmZsb3coInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCi0JCSAmeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAmeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAmeXlzdGFja3NpemUpOwotI2VuZGlmCi0KLSAgICAgIHl5c3MgPSB5eXNzMTsgeXl2cyA9IHl5dnMxOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlscyA9IHl5bHMxOwotI2VuZGlmCi0jZWxzZSAvKiBubyB5eW92ZXJmbG93ICovCi0gICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+PSBZWU1BWERFUFRIKQotCXsKLQkgIHl5ZXJyb3IoInBhcnNlciBzdGFjayBvdmVyZmxvdyIpOwotCSAgcmV0dXJuIDI7Ci0JfQotICAgICAgeXlzdGFja3NpemUgKj0gMjsKLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+IFlZTUFYREVQVEgpCi0JeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOwotICAgICAgeXlzcyA9IChzaG9ydCAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXlzc3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5c3MsIChjaGFyICopeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCkpOwotICAgICAgeXl2cyA9IChZWVNUWVBFICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eXZzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXl2cywgKGNoYXIgKil5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzID0gKFlZTFRZUEUgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eWxzLCAoY2hhciAqKXl5bHMxLCBzaXplICogc2l6ZW9mICgqeXlsc3ApKTsKLSNlbmRpZgotI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLQotICAgICAgeXlzc3AgPSB5eXNzICsgc2l6ZSAtIDE7Ci0gICAgICB5eXZzcCA9IHl5dnMgKyBzaXplIC0gMTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHNwID0geXlscyArIHNpemUgLSAxOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWRcbiIsIHl5c3RhY2tzaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKLQlZWUFCT1JUOwotICAgIH0KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKTsKLSNlbmRpZgotCi0gIGdvdG8geXliYWNrdXA7Ci0geXliYWNrdXA6Ci0KLS8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLwotLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0vKiB5eXJlc3VtZTogKi8KLQotICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KLQotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlGTEFHKQotICAgIGdvdG8geXlkZWZhdWx0OwotCi0gIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0KLSAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCi0gICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCi0KLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQotICAgIHsKLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKTsKLSNlbmRpZgotICAgICAgeXljaGFyID0gWVlMRVg7Ci0gICAgfQotCi0gIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCi0KLSAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCi0gICAgewotICAgICAgeXljaGFyMSA9IDA7Ci0gICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUoeXljaGFyKTsKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UgbWVhbmluZwotCSAgICAgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLwotI2lmZGVmIFlZUFJJTlQKLQkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOwotI2VuZGlmCi0JICBmcHJpbnRmIChzdGRlcnIsICIpXG4iKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgeXluICs9IHl5Y2hhcjE7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0KLSAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgotICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCi0gICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgotICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCi0gICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KLSAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLwotCi0gIGlmICh5eW4gPCAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQotCWdvdG8geXllcnJsYWI7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0KLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCi0gIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLSNlbmRpZgotCi0gIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCi0gIGlmICh5eWNoYXIgIT0gWVlFT0YpCi0gICAgeXljaGFyID0gWVlFTVBUWTsKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgKisreXlsc3AgPSB5eWxsb2M7Ci0jZW5kaWYKLQotICAvKiBjb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yIHN0YXR1cy4gICovCi0gIGlmICh5eWVycnN0YXR1cykgeXllcnJzdGF0dXMtLTsKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLS8qIERvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICAqLwoteXlkZWZhdWx0OgotCi0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycmxhYjsKLQotLyogRG8gYSByZWR1Y3Rpb24uICB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLwoteXlyZWR1Y2U6Ci0gIHl5bGVuID0geXlyMlt5eW5dOwotICBpZiAoeXlsZW4gPiAwKQotICAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07IC8qIGltcGxlbWVudCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb24gKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAotCSAgICAgICB5eW4sIHl5cmxpbmVbeXluXSk7Ci0KLSAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLwotICAgICAgZm9yIChpID0geXlwcmhzW3l5bl07IHl5cmhzW2ldID4gMDsgaSsrKQotCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbaV1dKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKLSAgICB9Ci0jZW5kaWYKLQotCi0gIHN3aXRjaCAoeXluKSB7Ci0KLWNhc2UgMzoKLSNsaW5lIDIwOCAianYtZXhwLnkiCi17Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF90eXBlKHl5dnNwWzBdLnR2YWwpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA2OgotI2xpbmUgMjIyICJqdi1leHAueSIKLXsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU1RSSU5HKTsKLQkJICB3cml0ZV9leHBfc3RyaW5nICh5eXZzcFswXS5zdmFsKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfU1RSSU5HKTsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgNzoKLSNsaW5lIDIzMSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWzBdLnR5cGVkX3ZhbF9pbnQudHlwZSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkoeXl2c3BbMF0udHlwZWRfdmFsX2ludC52YWwpKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg6Ci0jbGluZSAyMzYgImp2LWV4cC55IgoteyBZWVNUWVBFIHZhbDsKLQkJICBwYXJzZV9udW1iZXIgKHl5dnNwWzBdLnN2YWwucHRyLCB5eXZzcFswXS5zdmFsLmxlbmd0aCwgMCwgJnZhbCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodmFsLnR5cGVkX3ZhbF9pbnQudHlwZSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCl2YWwudHlwZWRfdmFsX2ludC52YWwpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgOToKLSNsaW5lIDI0NCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbMF0udHlwZWRfdmFsX2Zsb2F0LnR5cGUpOwotCQkgIHdyaXRlX2V4cF9lbHRfZGJsY3N0ICh5eXZzcFswXS50eXBlZF92YWxfZmxvYXQuZHZhbCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0RPVUJMRSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwOgotI2xpbmUgMjQ5ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoamF2YV9ib29sZWFuX3R5cGUpOwotCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpeXl2c3BbMF0ubHZhbCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMzoKLSNsaW5lIDI2NiAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2Jvb2xlYW5fdHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTY6Ci0jbGluZSAyNzYgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9ieXRlX3R5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE3OgotI2xpbmUgMjc4ICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfc2hvcnRfdHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTg6Ci0jbGluZSAyODAgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9pbnRfdHlwZTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTk6Ci0jbGluZSAyODIgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9sb25nX3R5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIwOgotI2xpbmUgMjg0ICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfY2hhcl90eXBlOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMToKLSNsaW5lIDI4OSAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2Zsb2F0X3R5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIyOgotI2xpbmUgMjkxICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfZG91YmxlX3R5cGU7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIzOgotI2xpbmUgMzAzICJqdi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGphdmFfdHlwZV9mcm9tX25hbWUgKHl5dnNwWzBdLnN2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNToKLSNsaW5lIDMxMiAianYtZXhwLnkiCi17IHl5dmFsLnR2YWwgPSBqYXZhX2FycmF5X3R5cGUgKHl5dnNwWy0xXS50dmFsLCB5eXZzcFswXS5sdmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjY6Ci0jbGluZSAzMTQgImp2LWV4cC55IgoteyB5eXZhbC50dmFsID0gamF2YV9hcnJheV90eXBlIChqYXZhX3R5cGVfZnJvbV9uYW1lICh5eXZzcFstMV0uc3ZhbCksIHl5dnNwWzBdLmx2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzMzoKLSNsaW5lIDMzNCAianYtZXhwLnkiCi17IHl5dmFsLnN2YWwubGVuZ3RoID0geXl2c3BbLTJdLnN2YWwubGVuZ3RoICsgeXl2c3BbMF0uc3ZhbC5sZW5ndGggKyAxOwotCQkgIGlmICh5eXZzcFstMl0uc3ZhbC5wdHIgKyB5eXZzcFstMl0uc3ZhbC5sZW5ndGggKyAxID09IHl5dnNwWzBdLnN2YWwucHRyCi0JCSAgICAgICYmIHl5dnNwWy0yXS5zdmFsLnB0clt5eXZzcFstMl0uc3ZhbC5sZW5ndGhdID09ICcuJykKLQkJICAgIHl5dmFsLnN2YWwucHRyID0geXl2c3BbLTJdLnN2YWwucHRyOyAgLyogT3B0aW1pemF0aW9uLiAqLwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgeXl2YWwuc3ZhbC5wdHIgPSAoY2hhciAqKSB4bWFsbG9jICh5eXZhbC5zdmFsLmxlbmd0aCArIDEpOwotCQkgICAgICBtYWtlX2NsZWFudXAgKGZyZWUsIHl5dmFsLnN2YWwucHRyKTsKLQkJICAgICAgc3ByaW50ZiAoeXl2YWwuc3ZhbC5wdHIsICIlLipzLiUuKnMiLAotCQkJICAgICAgIHl5dnNwWy0yXS5zdmFsLmxlbmd0aCwgeXl2c3BbLTJdLnN2YWwucHRyLCB5eXZzcFswXS5zdmFsLmxlbmd0aCwgeXl2c3BbMF0uc3ZhbC5wdHIpOwotCQl9IDsKLSAgICBicmVhazt9Ci1jYXNlIDM1OgotI2xpbmUgMzU4ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0NPTU1BKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzk6Ci0jbGluZSAzNjkgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfVEhJUyk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1RISVMpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NToKLSNsaW5lIDM3NyAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9BUlJBWSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgMCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgeXl2c3BbMF0ubHZhbCk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0FSUkFZKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDY6Ci0jbGluZSAzODUgImp2LWV4cC55IgoteyBzdGFydF9hcmdsaXN0ICgpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NzoKLSNsaW5lIDM5MCAianYtZXhwLnkiCi17IHl5dmFsLmx2YWwgPSBlbmRfYXJnbGlzdCAoKSAtIDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ4OgotI2xpbmUgMzk1ICJqdi1leHAueSIKLXsgZXJyb3IgKCJGSVhNRSAtIENsYXNzSW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24iKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDk6Ci0jbGluZSA0MDAgImp2LWV4cC55IgoteyBhcmdsaXN0X2xlbiA9IDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUwOgotI2xpbmUgNDAyICJqdi1leHAueSIKLXsgYXJnbGlzdF9sZW4rKzsgOwotICAgIGJyZWFrO30KLWNhc2UgNTE6Ci0jbGluZSA0MDcgImp2LWV4cC55IgoteyBhcmdsaXN0X2xlbiA9IDA7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUzOgotI2xpbmUgNDEzICJqdi1leHAueSIKLXsgZXJyb3IgKCJGSVhNRSAtIEFycmF5Q3JlYXRpaW9uRXhwcmVzc2lvbiIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NDoKLSNsaW5lIDQxNSAianYtZXhwLnkiCi17IGVycm9yICgiRklYTUUgLSBBcnJheUNyZWF0aWlvbkV4cHJlc3Npb24iKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTg6Ci0jbGluZSA0MjkgImp2LWV4cC55IgoteyB5eXZhbC5sdmFsID0gMTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTk6Ci0jbGluZSA0MzEgImp2LWV4cC55IgoteyB5eXZhbC5sdmFsID0geXl2c3BbLTJdLmx2YWwgKyAxOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MToKLSNsaW5lIDQzNyAianYtZXhwLnkiCi17IHl5dmFsLmx2YWwgPSAwOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MjoKLSNsaW5lIDQ0MiAianYtZXhwLnkiCi17IHB1c2hfZmllbGRuYW1lcyAoeXl2c3BbMF0uc3ZhbCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYzOgotI2xpbmUgNDQ0ICJqdi1leHAueSIKLXsgcHVzaF9maWVsZG5hbWVzICh5eXZzcFswXS5zdmFsKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjQ6Ci0jbGluZSA0NTAgImp2LWV4cC55IgoteyBlcnJvciAoIm1ldGhvZCBpbnZvY2F0aW9uIG5vdCBpbXBsZW1lbnRlZCIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2NToKLSNsaW5lIDQ1MiAianYtZXhwLnkiCi17IGVycm9yICgibWV0aG9kIGludm9jYXRpb24gbm90IGltcGxlbWVudGVkIik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY2OgotI2xpbmUgNDU0ICJqdi1leHAueSIKLXsgZXJyb3IgKCJtZXRob2QgaW52b2NhdGlvbiBub3QgaW1wbGVtZW50ZWQiKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjc6Ci0jbGluZSA0NTkgImp2LWV4cC55IgotewotICAgICAgICAgICAgICAgICAgLyogRW1pdCBjb2RlIGZvciB0aGUgTmFtZSBub3csIHRoZW4gZXhjaGFuZ2UgaXQgaW4gdGhlCi0JCSAgICAgZXhwb3V0IGFycmF5IHdpdGggdGhlIEV4cHJlc3Npb24ncyBjb2RlLiAgV2UgY291bGQKLQkJICAgICBpbnRyb2R1Y2UgYSBPUF9TV0FQIGNvZGUgb3IgYSByZXZlcnNlZCB2ZXJzaW9uIG9mCi0JCSAgICAgQklOT1BfU1VCU0NSSVBULCBidXQgdGhhdCBtYWtlcyB0aGUgcmVzdCBvZiBHREIgcGF5Ci0JCSAgICAgZm9yIG91ciBwYXJzaW5nIGtsdWRnZXMuICAqLwotCQkgIHN0cnVjdCBleHByZXNzaW9uICpuYW1lX2V4cHI7Ci0KLQkJICBwdXNoX2V4cHJlc3Npb25fbmFtZSAoeXl2c3BbLTNdLnN2YWwpOwotCQkgIG5hbWVfZXhwciA9IGNvcHlfZXhwIChleHBvdXQsIGV4cG91dF9wdHIpOwotCQkgIGV4cG91dF9wdHIgLT0gbmFtZV9leHByLT5uZWx0czsKLQkJICBpbnNlcnRfZXhwIChleHBvdXRfcHRyLWxlbmd0aF9vZl9zdWJleHAgKGV4cG91dCwgZXhwb3V0X3B0ciksCi0JCQkgICAgICBuYW1lX2V4cHIpOwotCQkgIGZyZWUgKG5hbWVfZXhwcik7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQlNDUklQVCk7Ci0JCTsKLSAgICBicmVhazt9Ci1jYXNlIDY4OgotI2xpbmUgNDc2ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQlNDUklQVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY5OgotI2xpbmUgNDc4ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQlNDUklQVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDcxOgotI2xpbmUgNDg0ICJqdi1leHAueSIKLXsgcHVzaF9leHByZXNzaW9uX25hbWUgKHl5dnNwWzBdLnN2YWwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3NToKLSNsaW5lIDQ5MyAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BPU1RJTkNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3NjoKLSNsaW5lIDQ5OCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BPU1RERUNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4MDoKLSNsaW5lIDUwNiAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX05FRyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDgxOgotI2xpbmUgNTA4ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfSU5EKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODM6Ci0jbGluZSA1MTQgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9QUkVJTkNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4NDoKLSNsaW5lIDUxOSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1BSRURFQ1JFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg2OgotI2xpbmUgNTI1ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ09NUExFTUVOVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDg3OgotI2xpbmUgNTI3ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTE9HSUNBTF9OT1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA4OToKLSNsaW5lIDUzMyAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoamF2YV9hcnJheV90eXBlICh5eXZzcFstM10udHZhbCwgeXl2c3BbLTJdLmx2YWwpKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgOTA6Ci0jbGluZSA1MzcgImp2LWV4cC55IgotewotCQkgIGludCBleHBfc2l6ZSA9IGV4cG91dF9wdHI7Ci0JCSAgaW50IGxhc3RfZXhwX3NpemUgPSBsZW5ndGhfb2Zfc3ViZXhwKGV4cG91dCwgZXhwb3V0X3B0cik7Ci0JCSAgc3RydWN0IHR5cGUgKnR5cGU7Ci0JCSAgaW50IGk7Ci0JCSAgaW50IGJhc2UgPSBleHBvdXRfcHRyIC0gbGFzdF9leHBfc2l6ZSAtIDM7Ci0JCSAgaWYgKGJhc2UgPCAwIHx8IGV4cG91dC0+ZWx0c1tiYXNlKzJdLm9wY29kZSAhPSBPUF9UWVBFKQotCQkgICAgZXJyb3IgKCJpbnZhbGlkIGNhc3QgZXhwcmVzc2lvbiIpOwotCQkgIHR5cGUgPSBleHBvdXQtPmVsdHNbYmFzZSsxXS50eXBlOwotCQkgIC8qIFJlbW92ZSB0aGUgJ0V4cHJlc3Npb24nIGFuZCBzbGlkZSB0aGUKLQkJICAgICBVbmFyeUV4cHJlc3Npb25Ob3RQbHVzTWludXMgZG93biB0byByZXBsYWNlIGl0LiAqLwotCQkgIGZvciAoaSA9IDA7ICBpIDwgbGFzdF9leHBfc2l6ZTsgIGkrKykKLQkJICAgIGV4cG91dC0+ZWx0c1tiYXNlICsgaV0gPSBleHBvdXQtPmVsdHNbYmFzZSArIGkgKyAzXTsKLQkJICBleHBvdXRfcHRyIC09IDM7Ci0JCSAgaWYgKFRZUEVfQ09ERSAodHlwZSkgPT0gVFlQRV9DT0RFX1NUUlVDVCkKLQkJICAgIHR5cGUgPSBsb29rdXBfcG9pbnRlcl90eXBlICh0eXBlKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKLQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHR5cGUpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOwotCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA5MToKLSNsaW5lIDU1OCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoamF2YV9hcnJheV90eXBlIChqYXZhX3R5cGVfZnJvbV9uYW1lICh5eXZzcFstM10uc3ZhbCksIHl5dnNwWy0yXS5sdmFsKSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQ0FTVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDkzOgotI2xpbmUgNTY3ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX01VTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk0OgotI2xpbmUgNTY5ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0RJVik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk1OgotI2xpbmUgNTcxICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFTSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk3OgotI2xpbmUgNTc3ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FERCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDk4OgotI2xpbmUgNTc5ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwMDoKLSNsaW5lIDU4NSAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MU0gpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDE6Ci0jbGluZSA1ODcgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfUlNIKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTAzOgotI2xpbmUgNTk0ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFU1MpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDQ6Ci0jbGluZSA1OTYgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfR1RSKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTA1OgotI2xpbmUgNTk4ICJqdi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFUSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEwNjoKLSNsaW5lIDYwMCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HRVEpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDg6Ci0jbGluZSA2MDcgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfRVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMDk6Ci0jbGluZSA2MDkgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTk9URVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTE6Ci0jbGluZSA2MTUgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9BTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTM6Ci0jbGluZSA2MjEgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9YT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTU6Ci0jbGluZSA2MjYgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQklUV0lTRV9JT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTc6Ci0jbGluZSA2MzIgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9BTkQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMTk6Ci0jbGluZSA2MzggImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTE9HSUNBTF9PUik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyMToKLSNsaW5lIDY0NCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChURVJOT1BfQ09ORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEyNDoKLSNsaW5lIDY1NCAianYtZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR04pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjU6Ci0jbGluZSA2NTYgImp2LWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfQVNTSUdOX01PRElGWSk7Ci0JCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKHl5dnNwWy0xXS5vcGNvZGUpOwotCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR05fTU9ESUZZKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTI2OgotI2xpbmUgNjYzICJqdi1leHAueSIKLXsgcHVzaF9leHByZXNzaW9uX25hbWUgKHl5dnNwWzBdLnN2YWwpOyA7Ci0gICAgYnJlYWs7fQotfQotICAgLyogdGhlIGFjdGlvbiBmaWxlIGdldHMgY29waWVkIGluIGluIHBsYWNlIG9mIHRoaXMgZG9sbGFyc2lnbiAqLwotI2xpbmUgNDk4ICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotDAotICB5eXZzcCAtPSB5eWxlbjsKLSAgeXlzc3AgLT0geXlsZW47Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwIC09IHl5bGVuOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgewotICAgICAgc2hvcnQgKnNzcDEgPSB5eXNzIC0gMTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgInN0YXRlIHN0YWNrIG5vdyIpOwotICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCi0JZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi0gICorK3l5dnNwID0geXl2YWw7Ci0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3ArKzsKLSAgaWYgKHl5bGVuID09IDApCi0gICAgewotICAgICAgeXlsc3AtPmZpcnN0X2xpbmUgPSB5eWxsb2MuZmlyc3RfbGluZTsKLSAgICAgIHl5bHNwLT5maXJzdF9jb2x1bW4gPSB5eWxsb2MuZmlyc3RfY29sdW1uOwotICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcC0xKS0+bGFzdF9saW5lOwotICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwLTEpLT5sYXN0X2NvbHVtbjsKLSAgICAgIHl5bHNwLT50ZXh0ID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2xpbmU7Ci0gICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfY29sdW1uOwotICAgIH0KLSNlbmRpZgotCi0gIC8qIE5vdyAic2hpZnQiIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4KLSAgICAgRGV0ZXJtaW5lIHdoYXQgc3RhdGUgdGhhdCBnb2VzIHRvLAotICAgICBiYXNlZCBvbiB0aGUgc3RhdGUgd2UgcG9wcGVkIGJhY2sgdG8KLSAgICAgYW5kIHRoZSBydWxlIG51bWJlciByZWR1Y2VkIGJ5LiAgKi8KLQotICB5eW4gPSB5eXIxW3l5bl07Ci0KLSAgeXlzdGF0ZSA9IHl5cGdvdG9beXluIC0gWVlOVEJBU0VdICsgKnl5c3NwOwotICBpZiAoeXlzdGF0ZSA+PSAwICYmIHl5c3RhdGUgPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXlzdGF0ZV0gPT0gKnl5c3NwKQotICAgIHl5c3RhdGUgPSB5eXRhYmxlW3l5c3RhdGVdOwotICBlbHNlCi0gICAgeXlzdGF0ZSA9IHl5ZGVmZ290b1t5eW4gLSBZWU5UQkFTRV07Ci0KLSAgZ290byB5eW5ld3N0YXRlOwotCi15eWVycmxhYjogICAvKiBoZXJlIG9uIGRldGVjdGluZyBlcnJvciAqLwotCi0gIGlmICghIHl5ZXJyc3RhdHVzKQotICAgIC8qIElmIG5vdCBhbHJlYWR5IHJlY292ZXJpbmcgZnJvbSBhbiBlcnJvciwgcmVwb3J0IHRoaXMgZXJyb3IuICAqLwotICAgIHsKLSAgICAgICsreXluZXJyczsKLQotI2lmZGVmIFlZRVJST1JfVkVSQk9TRQotICAgICAgeXluID0geXlwYWN0W3l5c3RhdGVdOwotCi0gICAgICBpZiAoeXluID4gWVlGTEFHICYmIHl5biA8IFlZTEFTVCkKLQl7Ci0JICBpbnQgc2l6ZSA9IDA7Ci0JICBjaGFyICptc2c7Ci0JICBpbnQgeCwgY291bnQ7Ci0KLQkgIGNvdW50ID0gMDsKLQkgIC8qIFN0YXJ0IFggYXQgLXl5biBpZiBuZWMgdG8gYXZvaWQgbmVnYXRpdmUgaW5kZXhlcyBpbiB5eWNoZWNrLiAgKi8KLQkgIGZvciAoeCA9ICh5eW4gPCAwID8gLXl5biA6IDApOwotCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQotCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQotCSAgICAgIHNpemUgKz0gc3RybGVuKHl5dG5hbWVbeF0pICsgMTUsIGNvdW50Kys7Ci0JICBtc2cgPSAoY2hhciAqKSB4bWFsbG9jKHNpemUgKyAxNSk7Ci0JICBpZiAobXNnICE9IDApCi0JICAgIHsKLQkgICAgICBzdHJjcHkobXNnLCAicGFyc2UgZXJyb3IiKTsKLQotCSAgICAgIGlmIChjb3VudCA8IDUpCi0JCXsKLQkJICBjb3VudCA9IDA7Ci0JCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7Ci0JCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQotCQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKLQkJICAgICAgewotCQkJc3RyY2F0KG1zZywgY291bnQgPT0gMCA/ICIsIGV4cGVjdGluZyBgIiA6ICIgb3IgYCIpOwotCQkJc3RyY2F0KG1zZywgeXl0bmFtZVt4XSk7Ci0JCQlzdHJjYXQobXNnLCAiJyIpOwotCQkJY291bnQrKzsKLQkJICAgICAgfQotCQl9Ci0JICAgICAgeXllcnJvcihtc2cpOwotCSAgICAgIGZyZWUobXNnKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhjZWVkZWQiKTsKLQl9Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCi0JeXllcnJvcigicGFyc2UgZXJyb3IiKTsKLSAgICB9Ci0KLSAgZ290byB5eWVycmxhYjE7Ci15eWVycmxhYjE6ICAgLyogaGVyZSBvbiBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24gKi8KLQotICBpZiAoeXllcnJzdGF0dXMgPT0gMykKLSAgICB7Ci0gICAgICAvKiBpZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KLQotICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCi0gICAgICBpZiAoeXljaGFyID09IFlZRU9GKQotCVlZQUJPUlQ7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLSNlbmRpZgotCi0gICAgICB5eWNoYXIgPSBZWUVNUFRZOwotICAgIH0KLQotICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbgotICAgICBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IgdG9rZW4uICAqLwotCi0gIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLwotCi0gIGdvdG8geXllcnJoYW5kbGU7Ci0KLXl5ZXJyZGVmYXVsdDogIC8qIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIGVycm9yIHRva2VuLiAqLwotCi0jaWYgMAotICAvKiBUaGlzIGlzIHdyb25nOyBvbmx5IHN0YXRlcyB0aGF0IGV4cGxpY2l0bHkgd2FudCBlcnJvciB0b2tlbnMKLSAgICAgc2hvdWxkIHNoaWZ0IHRoZW0uICAqLwotICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsgIC8qIElmIGl0cyBkZWZhdWx0IGlzIHRvIGFjY2VwdCBhbnkgdG9rZW4sIG9rLiAgT3RoZXJ3aXNlIHBvcCBpdC4qLwotICBpZiAoeXluKSBnb3RvIHl5ZGVmYXVsdDsKLSNlbmRpZgotCi15eWVycnBvcDogICAvKiBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbiAqLwotCi0gIGlmICh5eXNzcCA9PSB5eXNzKSBZWUFCT1JUOwotICB5eXZzcC0tOwotICB5eXN0YXRlID0gKi0teXlzc3A7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwLS07Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6IHN0YXRlIHN0YWNrIG5vdyIpOwotICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCi0JZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSNlbmRpZgotCi15eWVycmhhbmRsZToKLQotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlGTEFHKQotICAgIGdvdG8geXllcnJkZWZhdWx0OwotCi0gIHl5biArPSBZWVRFUlJPUjsKLSAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSBZWVRFUlJPUikKLSAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKLQotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0gIGlmICh5eW4gPCAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQotCWdvdG8geXllcnJwb3A7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJwb3A7Ci0KLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpOwotI2VuZGlmCi0KLSAgKisreXl2c3AgPSB5eWx2YWw7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICorK3l5bHNwID0geXlsbG9jOwotI2VuZGlmCi0KLSAgeXlzdGF0ZSA9IHl5bjsKLSAgZ290byB5eW5ld3N0YXRlOwotfQotI2xpbmUgNjc1ICJqdi1leHAueSIKLQotLyogVGFrZSBjYXJlIG9mIHBhcnNpbmcgYSBudW1iZXIgKGFueXRoaW5nIHRoYXQgc3RhcnRzIHdpdGggYSBkaWdpdCkuCi0gICBTZXQgeXlsdmFsIGFuZCByZXR1cm4gdGhlIHRva2VuIHR5cGU7IHVwZGF0ZSBsZXhwdHIuCi0gICBMRU4gaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGl0LiAgKi8KLQotLyoqKiBOZWVkcyBzb21lIGVycm9yIGNoZWNraW5nIGZvciB0aGUgZmxvYXQgY2FzZSAqKiovCi0KLXN0YXRpYyBpbnQKLXBhcnNlX251bWJlciAocCwgbGVuLCBwYXJzZWRfZmxvYXQsIHB1dGl0aGVyZSkKLSAgICAgcmVnaXN0ZXIgY2hhciAqcDsKLSAgICAgcmVnaXN0ZXIgaW50IGxlbjsKLSAgICAgaW50IHBhcnNlZF9mbG9hdDsKLSAgICAgWVlTVFlQRSAqcHV0aXRoZXJlOwotewotICByZWdpc3RlciBVTE9OR0VTVCBuID0gMDsKLSAgVUxPTkdFU1QgbGltaXQsIGxpbWl0X2Rpdl9iYXNlOwotCi0gIHJlZ2lzdGVyIGludCBjOwotICByZWdpc3RlciBpbnQgYmFzZSA9IGlucHV0X3JhZGl4OwotCi0gIHN0cnVjdCB0eXBlICp0eXBlOwotCi0gIGlmIChwYXJzZWRfZmxvYXQpCi0gICAgewotICAgICAgLyogSXQncyBhIGZsb2F0IHNpbmNlIGl0IGNvbnRhaW5zIGEgcG9pbnQgb3IgYW4gZXhwb25lbnQuICAqLwotICAgICAgY2hhciBjOwotICAgICAgaW50IG51bSA9IDA7CS8qIG51bWJlciBvZiB0b2tlbnMgc2Nhbm5lZCBieSBzY2FuZiAqLwotICAgICAgY2hhciBzYXZlZF9jaGFyID0gcFtsZW5dOwotCi0gICAgICBwW2xlbl0gPSAwOwkvKiBudWxsLXRlcm1pbmF0ZSB0aGUgdG9rZW4gKi8KLSAgICAgIGlmIChzaXplb2YgKHB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwpIDw9IHNpemVvZiAoZmxvYXQpKQotCW51bSA9IHNzY2FuZiAocCwgIiVnJWMiLCAoZmxvYXQgKikgJnB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwsICZjKTsKLSAgICAgIGVsc2UgaWYgKHNpemVvZiAocHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCkgPD0gc2l6ZW9mIChkb3VibGUpKQotCW51bSA9IHNzY2FuZiAocCwgIiVsZyVjIiwgKGRvdWJsZSAqKSAmcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCwgJmMpOwotICAgICAgZWxzZQotCXsKLSNpZmRlZiBTQ0FORl9IQVNfTE9OR19ET1VCTEUKLQkgIG51bSA9IHNzY2FuZiAocCwgIiVMZyVjIiwgJnB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LmR2YWwsICZjKTsKLSNlbHNlCi0JICAvKiBTY2FuIGl0IGludG8gYSBkb3VibGUsIHRoZW4gYXNzaWduIGl0IHRvIHRoZSBsb25nIGRvdWJsZS4KLQkgICAgIFRoaXMgYXQgbGVhc3Qgd2lucyB3aXRoIHZhbHVlcyByZXByZXNlbnRhYmxlIGluIHRoZSByYW5nZQotCSAgICAgb2YgZG91Ymxlcy4gKi8KLQkgIGRvdWJsZSB0ZW1wOwotCSAgbnVtID0gc3NjYW5mIChwLCAiJWxnJWMiLCAmdGVtcCwgJmMpOwotCSAgcHV0aXRoZXJlLT50eXBlZF92YWxfZmxvYXQuZHZhbCA9IHRlbXA7Ci0jZW5kaWYKLQl9Ci0gICAgICBwW2xlbl0gPSBzYXZlZF9jaGFyOwkvKiByZXN0b3JlIHRoZSBpbnB1dCBzdHJlYW0gKi8KLSAgICAgIGlmIChudW0gIT0gMSkgCQkvKiBjaGVjayBzY2FuZiBmb3VuZCBPTkxZIGEgZmxvYXQgLi4uICovCi0JcmV0dXJuIEVSUk9SOwotICAgICAgLyogU2VlIGlmIGl0IGhhcyBgZicgb3IgYGQnIHN1ZmZpeCAoZmxvYXQgb3IgZG91YmxlKS4gICovCi0KLSAgICAgIGMgPSB0b2xvd2VyIChwW2xlbiAtIDFdKTsKLQotICAgICAgaWYgKGMgPT0gJ2YnIHx8IGMgPT0gJ0YnKQotCXB1dGl0aGVyZS0+dHlwZWRfdmFsX2Zsb2F0LnR5cGUgPSBidWlsdGluX3R5cGVfZmxvYXQ7Ci0gICAgICBlbHNlIGlmIChpc2RpZ2l0IChjKSB8fCBjID09ICcuJyB8fCBjID09ICdkJyB8fCBjID09ICdEJykKLQlwdXRpdGhlcmUtPnR5cGVkX3ZhbF9mbG9hdC50eXBlID0gYnVpbHRpbl90eXBlX2RvdWJsZTsKLSAgICAgIGVsc2UKLQlyZXR1cm4gRVJST1I7Ci0KLSAgICAgIHJldHVybiBGTE9BVElOR19QT0lOVF9MSVRFUkFMOwotICAgIH0KLQotICAvKiBIYW5kbGUgYmFzZS1zd2l0Y2hpbmcgcHJlZml4ZXMgMHgsIDB0LCAwZCwgMCAqLwotICBpZiAocFswXSA9PSAnMCcpCi0gICAgc3dpdGNoIChwWzFdKQotICAgICAgewotICAgICAgY2FzZSAneCc6Ci0gICAgICBjYXNlICdYJzoKLQlpZiAobGVuID49IDMpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgYmFzZSA9IDE2OwotCSAgICBsZW4gLT0gMjsKLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSAndCc6Ci0gICAgICBjYXNlICdUJzoKLSAgICAgIGNhc2UgJ2QnOgotICAgICAgY2FzZSAnRCc6Ci0JaWYgKGxlbiA+PSAzKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGJhc2UgPSAxMDsKLQkgICAgbGVuIC09IDI7Ci0JICB9Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JYmFzZSA9IDg7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgYyA9IHBbbGVuLTFdOwotICBsaW1pdCA9IChVTE9OR0VTVCkweGZmZmZmZmZmOwotICBpZiAoYyA9PSAnbCcgfHwgYyA9PSAnTCcpCi0gICAgewotICAgICAgdHlwZSA9IGphdmFfbG9uZ190eXBlOwotICAgICAgbGVuLS07Ci0gICAgICAvKiBBIHBhcmFub2lkIGNhbGN1bGF0aW9uIG9mICgxPDw2NCktMS4gKi8KLSAgICAgIGxpbWl0ID0gKChsaW1pdCA8PCAxNikgPDwgMTYpIHwgbGltaXQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgdHlwZSA9IGphdmFfaW50X3R5cGU7Ci0gICAgfQotICBsaW1pdF9kaXZfYmFzZSA9IGxpbWl0IC8gKFVMT05HRVNUKSBiYXNlOwotCi0gIHdoaWxlICgtLWxlbiA+PSAwKQotICAgIHsKLSAgICAgIGMgPSAqcCsrOwotICAgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQotCWMgLT0gJzAnOwotICAgICAgZWxzZSBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpCi0JYyAtPSAnQScgLSAxMDsKLSAgICAgIGVsc2UgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQotCWMgLT0gJ2EnIC0gMTA7Ci0gICAgICBlbHNlCi0JcmV0dXJuIEVSUk9SOwkvKiBDaGFyIG5vdCBhIGRpZ2l0ICovCi0gICAgICBpZiAoYyA+PSBiYXNlKQotCXJldHVybiBFUlJPUjsKLSAgICAgIGlmIChuID4gbGltaXRfZGl2X2Jhc2UKLQkgIHx8IChuICo9IGJhc2UpID4gbGltaXQgLSBjKQotCWVycm9yICgiTnVtZXJpYyBjb25zdGFudCB0b28gbGFyZ2UuIik7Ci0gICAgICBuICs9IGM7Ci0JfQotCi0gICBwdXRpdGhlcmUtPnR5cGVkX3ZhbF9pbnQudmFsID0gbjsKLSAgIHB1dGl0aGVyZS0+dHlwZWRfdmFsX2ludC50eXBlID0gdHlwZTsKLSAgIHJldHVybiBJTlRFR0VSX0xJVEVSQUw7Ci19Ci0KLXN0cnVjdCB0b2tlbgotewotICBjaGFyICpvcGVyYXRvcjsKLSAgaW50IHRva2VuOwotICBlbnVtIGV4cF9vcGNvZGUgb3Bjb2RlOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0b2tlbiB0b2tlbnRhYjNbXSA9Ci0gIHsKLSAgICB7Ij4+PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1JTSH0sCi0gICAgeyI8PD0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9MU0h9Ci0gIH07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rZW4gdG9rZW50YWIyW10gPQotICB7Ci0gICAgeyIrPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0FERH0sCi0gICAgeyItPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1NVQn0sCi0gICAgeyIqPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX01VTH0sCi0gICAgeyIvPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0RJVn0sCi0gICAgeyIlPSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX1JFTX0sCi0gICAgeyJ8PSIsIEFTU0lHTl9NT0RJRlksIEJJTk9QX0JJVFdJU0VfSU9SfSwKLSAgICB7IiY9IiwgQVNTSUdOX01PRElGWSwgQklOT1BfQklUV0lTRV9BTkR9LAotICAgIHsiXj0iLCBBU1NJR05fTU9ESUZZLCBCSU5PUF9CSVRXSVNFX1hPUn0sCi0gICAgeyIrKyIsIElOQ1JFTUVOVCwgQklOT1BfRU5EfSwKLSAgICB7Ii0tIiwgREVDUkVNRU5ULCBCSU5PUF9FTkR9LAotICAgIHsiJiYiLCBBTkRBTkQsIEJJTk9QX0VORH0sCi0gICAgeyJ8fCIsIE9ST1IsIEJJTk9QX0VORH0sCi0gICAgeyI8PCIsIExTSCwgQklOT1BfRU5EfSwKLSAgICB7Ij4+IiwgUlNILCBCSU5PUF9FTkR9LAotICAgIHsiPT0iLCBFUVVBTCwgQklOT1BfRU5EfSwKLSAgICB7IiE9IiwgTk9URVFVQUwsIEJJTk9QX0VORH0sCi0gICAgeyI8PSIsIExFUSwgQklOT1BfRU5EfSwKLSAgICB7Ij49IiwgR0VRLCBCSU5PUF9FTkR9Ci0gIH07Ci0KLS8qIFJlYWQgb25lIHRva2VuLCBnZXR0aW5nIGNoYXJhY3RlcnMgdGhyb3VnaCBsZXhwdHIuICAqLwotCi1zdGF0aWMgaW50Ci15eWxleCAoKQotewotICBpbnQgYzsKLSAgaW50IG5hbWVsZW47Ci0gIHVuc2lnbmVkIGludCBpOwotICBjaGFyICp0b2tzdGFydDsKLSAgY2hhciAqdG9rcHRyOwotICBpbnQgdGVtcGJ1ZmluZGV4OwotICBzdGF0aWMgY2hhciAqdGVtcGJ1ZjsKLSAgc3RhdGljIGludCB0ZW1wYnVmc2l6ZTsKLSAgCi0gcmV0cnk6Ci0KLSAgdG9rc3RhcnQgPSBsZXhwdHI7Ci0gIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgdG9rZW4gb2YgbGVuZ3RoIDMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRva2VudGFiMyAvIHNpemVvZiB0b2tlbnRhYjNbMF07IGkrKykKLSAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgdG9rZW50YWIzW2ldLm9wZXJhdG9yLCAzKSkKLSAgICAgIHsKLQlsZXhwdHIgKz0gMzsKLQl5eWx2YWwub3Bjb2RlID0gdG9rZW50YWIzW2ldLm9wY29kZTsKLQlyZXR1cm4gdG9rZW50YWIzW2ldLnRva2VuOwotICAgICAgfQotCi0gIC8qIFNlZSBpZiBpdCBpcyBhIHNwZWNpYWwgdG9rZW4gb2YgbGVuZ3RoIDIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIHRva2VudGFiMiAvIHNpemVvZiB0b2tlbnRhYjJbMF07IGkrKykKLSAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgdG9rZW50YWIyW2ldLm9wZXJhdG9yLCAyKSkKLSAgICAgIHsKLQlsZXhwdHIgKz0gMjsKLQl5eWx2YWwub3Bjb2RlID0gdG9rZW50YWIyW2ldLm9wY29kZTsKLQlyZXR1cm4gdG9rZW50YWIyW2ldLnRva2VuOwotICAgICAgfQotCi0gIHN3aXRjaCAoYyA9ICp0b2tzdGFydCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlICcgJzoKLSAgICBjYXNlICdcdCc6Ci0gICAgY2FzZSAnXG4nOgotICAgICAgbGV4cHRyKys7Ci0gICAgICBnb3RvIHJldHJ5OwotCi0gICAgY2FzZSAnXCcnOgotICAgICAgLyogV2UgZWl0aGVyIGhhdmUgYSBjaGFyYWN0ZXIgY29uc3RhbnQgKCcwJyBvciAnXDE3NycgZm9yIGV4YW1wbGUpCi0JIG9yIHdlIGhhdmUgYSBxdW90ZWQgc3ltYm9sIHJlZmVyZW5jZSAoJ2ZvbyhpbnQsaW50KScgaW4gQysrCi0JIGZvciBleGFtcGxlKS4gKi8KLSAgICAgIGxleHB0cisrOwotICAgICAgYyA9ICpsZXhwdHIrKzsKLSAgICAgIGlmIChjID09ICdcXCcpCi0JYyA9IHBhcnNlX2VzY2FwZSAoJmxleHB0cik7Ci0gICAgICBlbHNlIGlmIChjID09ICdcJycpCi0JZXJyb3IgKCJFbXB0eSBjaGFyYWN0ZXIgY29uc3RhbnQuIik7Ci0KLSAgICAgIHl5bHZhbC50eXBlZF92YWxfaW50LnZhbCA9IGM7Ci0gICAgICB5eWx2YWwudHlwZWRfdmFsX2ludC50eXBlID0gYnVpbHRpbl90eXBlX2NoYXI7Ci0KLSAgICAgIGMgPSAqbGV4cHRyKys7Ci0gICAgICBpZiAoYyAhPSAnXCcnKQotCXsKLQkgIG5hbWVsZW4gPSBza2lwX3F1b3RlZCAodG9rc3RhcnQpIC0gdG9rc3RhcnQ7Ci0JICBpZiAobmFtZWxlbiA+IDIpCi0JICAgIHsKLQkgICAgICBsZXhwdHIgPSB0b2tzdGFydCArIG5hbWVsZW47Ci0JICAgICAgaWYgKGxleHB0clstMV0gIT0gJ1wnJykKLQkJZXJyb3IgKCJVbm1hdGNoZWQgc2luZ2xlIHF1b3RlLiIpOwotCSAgICAgIG5hbWVsZW4gLT0gMjsKLQkgICAgICB0b2tzdGFydCsrOwotCSAgICAgIGdvdG8gdHJ5bmFtZTsKLQkgICAgfQotCSAgZXJyb3IgKCJJbnZhbGlkIGNoYXJhY3RlciBjb25zdGFudC4iKTsKLQl9Ci0gICAgICByZXR1cm4gSU5URUdFUl9MSVRFUkFMOwotCi0gICAgY2FzZSAnKCc6Ci0gICAgICBwYXJlbl9kZXB0aCsrOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJyknOgotICAgICAgaWYgKHBhcmVuX2RlcHRoID09IDApCi0JcmV0dXJuIDA7Ci0gICAgICBwYXJlbl9kZXB0aC0tOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJywnOgotICAgICAgaWYgKGNvbW1hX3Rlcm1pbmF0ZXMgJiYgcGFyZW5fZGVwdGggPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICcuJzoKLSAgICAgIC8qIE1pZ2h0IGJlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiAgKi8KLSAgICAgIGlmIChsZXhwdHJbMV0gPCAnMCcgfHwgbGV4cHRyWzFdID4gJzknKQotCWdvdG8gc3ltYm9sOwkJLyogTm9wZSwgbXVzdCBiZSBhIHN5bWJvbC4gKi8KLSAgICAgIC8qIEZBTEwgVEhSVSBpbnRvIG51bWJlciBjYXNlLiAgKi8KLQotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgewotCS8qIEl0J3MgYSBudW1iZXIuICAqLwotCWludCBnb3RfZG90ID0gMCwgZ290X2UgPSAwLCB0b2t0eXBlOwotCXJlZ2lzdGVyIGNoYXIgKnAgPSB0b2tzdGFydDsKLQlpbnQgaGV4ID0gaW5wdXRfcmFkaXggPiAxMDsKLQotCWlmIChjID09ICcwJyAmJiAocFsxXSA9PSAneCcgfHwgcFsxXSA9PSAnWCcpKQotCSAgewotCSAgICBwICs9IDI7Ci0JICAgIGhleCA9IDE7Ci0JICB9Ci0JZWxzZSBpZiAoYyA9PSAnMCcgJiYgKHBbMV09PSd0JyB8fCBwWzFdPT0nVCcgfHwgcFsxXT09J2QnIHx8IHBbMV09PSdEJykpCi0JICB7Ci0JICAgIHAgKz0gMjsKLQkgICAgaGV4ID0gMDsKLQkgIH0KLQotCWZvciAoOzsgKytwKQotCSAgewotCSAgICAvKiBUaGlzIHRlc3QgaW5jbHVkZXMgIWhleCBiZWNhdXNlICdlJyBpcyBhIHZhbGlkIGhleCBkaWdpdAotCSAgICAgICBhbmQgdGh1cyBkb2VzIG5vdCBpbmRpY2F0ZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aGVuCi0JICAgICAgIHRoZSByYWRpeCBpcyBoZXguICAqLwotCSAgICBpZiAoIWhleCAmJiAhZ290X2UgJiYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpKQotCSAgICAgIGdvdF9kb3QgPSBnb3RfZSA9IDE7Ci0JICAgIC8qIFRoaXMgdGVzdCBkb2VzIG5vdCBpbmNsdWRlICFoZXgsIGJlY2F1c2UgYSAnLicgYWx3YXlzIGluZGljYXRlcwotCSAgICAgICBhIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlZ2FyZGxlc3Mgb2YgdGhlIHJhZGl4LiAgKi8KLQkgICAgZWxzZSBpZiAoIWdvdF9kb3QgJiYgKnAgPT0gJy4nKQotCSAgICAgIGdvdF9kb3QgPSAxOwotCSAgICBlbHNlIGlmIChnb3RfZSAmJiAocFstMV0gPT0gJ2UnIHx8IHBbLTFdID09ICdFJykKLQkJICAgICAmJiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykpCi0JICAgICAgLyogVGhpcyBpcyB0aGUgc2lnbiBvZiB0aGUgZXhwb25lbnQsIG5vdCB0aGUgZW5kIG9mIHRoZQotCQkgbnVtYmVyLiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgICAgLyogV2Ugd2lsbCB0YWtlIGFueSBsZXR0ZXJzIG9yIGRpZ2l0cy4gIHBhcnNlX251bWJlciB3aWxsCi0JICAgICAgIGNvbXBsYWluIGlmIHBhc3QgdGhlIHJhZGl4LCBvciBpZiBMIG9yIFUgYXJlIG5vdCBmaW5hbC4gICovCi0JICAgIGVsc2UgaWYgKCgqcCA8ICcwJyB8fCAqcCA+ICc5JykKLQkJICAgICAmJiAoKCpwIDwgJ2EnIHx8ICpwID4gJ3onKQotCQkJCSAgJiYgKCpwIDwgJ0EnIHx8ICpwID4gJ1onKSkpCi0JICAgICAgYnJlYWs7Ci0JICB9Ci0JdG9rdHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIHAgLSB0b2tzdGFydCwgZ290X2RvdHxnb3RfZSwgJnl5bHZhbCk7Ci0gICAgICAgIGlmICh0b2t0eXBlID09IEVSUk9SKQotCSAgewotCSAgICBjaGFyICplcnJfY29weSA9IChjaGFyICopIGFsbG9jYSAocCAtIHRva3N0YXJ0ICsgMSk7Ci0KLQkgICAgbWVtY3B5IChlcnJfY29weSwgdG9rc3RhcnQsIHAgLSB0b2tzdGFydCk7Ci0JICAgIGVycl9jb3B5W3AgLSB0b2tzdGFydF0gPSAwOwotCSAgICBlcnJvciAoIkludmFsaWQgbnVtYmVyIFwiJXNcIi4iLCBlcnJfY29weSk7Ci0JICB9Ci0JbGV4cHRyID0gcDsKLQlyZXR1cm4gdG9rdHlwZTsKLSAgICAgIH0KLQotICAgIGNhc2UgJysnOgotICAgIGNhc2UgJy0nOgotICAgIGNhc2UgJyonOgotICAgIGNhc2UgJy8nOgotICAgIGNhc2UgJyUnOgotICAgIGNhc2UgJ3wnOgotICAgIGNhc2UgJyYnOgotICAgIGNhc2UgJ14nOgotICAgIGNhc2UgJ34nOgotICAgIGNhc2UgJyEnOgotICAgIGNhc2UgJzwnOgotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJ1snOgotICAgIGNhc2UgJ10nOgotICAgIGNhc2UgJz8nOgotICAgIGNhc2UgJzonOgotICAgIGNhc2UgJz0nOgotICAgIGNhc2UgJ3snOgotICAgIGNhc2UgJ30nOgotICAgIHN5bWJvbDoKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICciJzoKLQotICAgICAgLyogQnVpbGQgdGhlIGdkYiBpbnRlcm5hbCBmb3JtIG9mIHRoZSBpbnB1dCBzdHJpbmcgaW4gdGVtcGJ1ZiwKLQkgdHJhbnNsYXRpbmcgYW55IHN0YW5kYXJkIEMgZXNjYXBlIGZvcm1zIHNlZW4uICBOb3RlIHRoYXQgdGhlCi0JIGJ1ZmZlciBpcyBudWxsIGJ5dGUgdGVybWluYXRlZCAqb25seSogZm9yIHRoZSBjb252ZW5pZW5jZSBvZgotCSBkZWJ1Z2dpbmcgZ2RiIGl0c2VsZiBhbmQgcHJpbnRpbmcgdGhlIGJ1ZmZlciBjb250ZW50cyB3aGVuCi0JIHRoZSBidWZmZXIgY29udGFpbnMgbm8gZW1iZWRkZWQgbnVsbHMuICBHZGIgZG9lcyBub3QgZGVwZW5kCi0JIHVwb24gdGhlIGJ1ZmZlciBiZWluZyBudWxsIGJ5dGUgdGVybWluYXRlZCwgaXQgdXNlcyB0aGUgbGVuZ3RoCi0JIHN0cmluZyBpbnN0ZWFkLiAgVGhpcyBhbGxvd3MgZ2RiIHRvIGhhbmRsZSBDIHN0cmluZ3MgKGFzIHdlbGwKLQkgYXMgc3RyaW5ncyBpbiBvdGhlciBsYW5ndWFnZXMpIHdpdGggZW1iZWRkZWQgbnVsbCBieXRlcyAqLwotCi0gICAgICB0b2twdHIgPSArK3Rva3N0YXJ0OwotICAgICAgdGVtcGJ1ZmluZGV4ID0gMDsKLQotICAgICAgZG8gewotCS8qIEdyb3cgdGhlIHN0YXRpYyB0ZW1wIGJ1ZmZlciBpZiBuZWNlc3NhcnksIGluY2x1ZGluZyBhbGxvY2F0aW5nCi0JICAgdGhlIGZpcnN0IG9uZSBvbiBkZW1hbmQuICovCi0JaWYgKHRlbXBidWZpbmRleCArIDEgPj0gdGVtcGJ1ZnNpemUpCi0JICB7Ci0JICAgIHRlbXBidWYgPSAoY2hhciAqKSB4cmVhbGxvYyAodGVtcGJ1ZiwgdGVtcGJ1ZnNpemUgKz0gNjQpOwotCSAgfQotCXN3aXRjaCAoKnRva3B0cikKLQkgIHsKLQkgIGNhc2UgJ1wwJzoKLQkgIGNhc2UgJyInOgotCSAgICAvKiBEbyBub3RoaW5nLCBsb29wIHdpbGwgdGVybWluYXRlLiAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgJ1xcJzoKLQkgICAgdG9rcHRyKys7Ci0JICAgIGMgPSBwYXJzZV9lc2NhcGUgKCZ0b2twdHIpOwotCSAgICBpZiAoYyA9PSAtMSkKLQkgICAgICB7Ci0JCWNvbnRpbnVlOwotCSAgICAgIH0KLQkgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXgrK10gPSBjOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIHRlbXBidWZbdGVtcGJ1ZmluZGV4KytdID0gKnRva3B0cisrOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIH0gd2hpbGUgKCgqdG9rcHRyICE9ICciJykgJiYgKCp0b2twdHIgIT0gJ1wwJykpOwotICAgICAgaWYgKCp0b2twdHIrKyAhPSAnIicpCi0JewotCSAgZXJyb3IgKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIGluIGV4cHJlc3Npb24uIik7Ci0JfQotICAgICAgdGVtcGJ1Zlt0ZW1wYnVmaW5kZXhdID0gJ1wwJzsJLyogU2VlIG5vdGUgYWJvdmUgKi8KLSAgICAgIHl5bHZhbC5zdmFsLnB0ciA9IHRlbXBidWY7Ci0gICAgICB5eWx2YWwuc3ZhbC5sZW5ndGggPSB0ZW1wYnVmaW5kZXg7Ci0gICAgICBsZXhwdHIgPSB0b2twdHI7Ci0gICAgICByZXR1cm4gKFNUUklOR19MSVRFUkFMKTsKLSAgICB9Ci0KLSAgaWYgKCEoYyA9PSAnXycgfHwgYyA9PSAnJCcKLQl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpKQotICAgIC8qIFdlIG11c3QgaGF2ZSBjb21lIGFjcm9zcyBhIGJhZCBjaGFyYWN0ZXIgKGUuZy4gJzsnKS4gICovCi0gICAgZXJyb3IgKCJJbnZhbGlkIGNoYXJhY3RlciAnJWMnIGluIGV4cHJlc3Npb24uIiwgYyk7Ci0KLSAgLyogSXQncyBhIG5hbWUuICBTZWUgaG93IGxvbmcgaXQgaXMuICAqLwotICBuYW1lbGVuID0gMDsKLSAgZm9yIChjID0gdG9rc3RhcnRbbmFtZWxlbl07Ci0gICAgICAgKGMgPT0gJ18nCi0JfHwgYyA9PSAnJCcKLQl8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JfHwgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQotCXx8IChjID49ICdBJyAmJiBjIDw9ICdaJykKLQl8fCBjID09ICc8Jyk7Ci0gICAgICAgKQotICAgIHsKLSAgICAgIGlmIChjID09ICc8JykKLQl7Ci0JICBpbnQgaSA9IG5hbWVsZW47Ci0JICB3aGlsZSAodG9rc3RhcnRbKytpXSAmJiB0b2tzdGFydFtpXSAhPSAnPicpOwotCSAgaWYgKHRva3N0YXJ0W2ldID09ICc+JykKLQkgICAgbmFtZWxlbiA9IGk7Ci0JfQotICAgICAgIGMgPSB0b2tzdGFydFsrK25hbWVsZW5dOwotICAgICB9Ci0KLSAgLyogVGhlIHRva2VuICJpZiIgdGVybWluYXRlcyB0aGUgZXhwcmVzc2lvbiBhbmQgaXMgTk9UIAotICAgICByZW1vdmVkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gICovCi0gIGlmIChuYW1lbGVuID09IDIgJiYgdG9rc3RhcnRbMF0gPT0gJ2knICYmIHRva3N0YXJ0WzFdID09ICdmJykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgbGV4cHRyICs9IG5hbWVsZW47Ci0KLSAgdHJ5bmFtZToKLQotICAvKiBDYXRjaCBzcGVjaWZpYyBrZXl3b3Jkcy4gIFNob3VsZCBiZSBkb25lIHdpdGggYSBkYXRhIHN0cnVjdHVyZS4gICovCi0gIHN3aXRjaCAobmFtZWxlbikKLSAgICB7Ci0gICAgY2FzZSA3OgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJib29sZWFuIiwgNykpCi0JcmV0dXJuIEJPT0xFQU47Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImRvdWJsZSIsIDYpKSAgICAgIAotCXJldHVybiBET1VCTEU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInNob3J0IiwgNSkpCi0JcmV0dXJuIFNIT1JUOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJmYWxzZSIsIDUpKQotCXsKLQkgIHl5bHZhbC5sdmFsID0gMDsKLQkgIHJldHVybiBCT09MRUFOX0xJVEVSQUw7Ci0JfQotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJzdXBlciIsIDUpKQotCXJldHVybiBTVVBFUjsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiZmxvYXQiLCA1KSkKLQlyZXR1cm4gRkxPQVQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgImxvbmciLCA0KSkKLQlyZXR1cm4gTE9ORzsKLSAgICAgIGlmIChTVFJFUU4gKHRva3N0YXJ0LCAiYnl0ZSIsIDQpKQotCXJldHVybiBCWVRFOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJjaGFyIiwgNCkpCi0JcmV0dXJuIENIQVI7Ci0gICAgICBpZiAoU1RSRVFOICh0b2tzdGFydCwgInRydWUiLCA0KSkKLQl7Ci0JICB5eWx2YWwubHZhbCA9IDE7Ci0JICByZXR1cm4gQk9PTEVBTl9MSVRFUkFMOwotCX0KLSAgICAgIGlmIChjdXJyZW50X2xhbmd1YWdlLT5sYV9sYW5ndWFnZSA9PSBsYW5ndWFnZV9jcGx1cwotCSAgJiYgU1RSRVFOICh0b2tzdGFydCwgInRoaXMiLCA0KSkKLQl7Ci0JICBzdGF0aWMgY29uc3QgY2hhciB0aGlzX25hbWVbXSA9Ci0JCQkJIHsgQ1BMVVNfTUFSS0VSLCAndCcsICdoJywgJ2knLCAncycsICdcMCcgfTsKLQotCSAgaWYgKGxvb2t1cF9zeW1ib2wgKHRoaXNfbmFtZSwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAotCQkJICAgICBWQVJfTkFNRVNQQUNFLCAoaW50ICopIE5VTEwsCi0JCQkgICAgIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKSkKLQkgICAgcmV0dXJuIFRISVM7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJpbnQiLCAzKSkKLQlyZXR1cm4gSU5UOwotICAgICAgaWYgKFNUUkVRTiAodG9rc3RhcnQsICJuZXciLCAzKSkKLQlyZXR1cm4gTkVXOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICB5eWx2YWwuc3ZhbC5wdHIgPSB0b2tzdGFydDsKLSAgeXlsdmFsLnN2YWwubGVuZ3RoID0gbmFtZWxlbjsKLQotICBpZiAoKnRva3N0YXJ0ID09ICckJykKLSAgICB7Ci0gICAgICB3cml0ZV9kb2xsYXJfdmFyaWFibGUgKHl5bHZhbC5zdmFsKTsKLSAgICAgIHJldHVybiBWQVJJQUJMRTsKLSAgICB9Ci0KLSAgLyogSW5wdXQgbmFtZXMgdGhhdCBhcmVuJ3Qgc3ltYm9scyBidXQgQVJFIHZhbGlkIGhleCBudW1iZXJzLAotICAgICB3aGVuIHRoZSBpbnB1dCByYWRpeCBwZXJtaXRzIHRoZW0sIGNhbiBiZSBuYW1lcyBvciBudW1iZXJzCi0gICAgIGRlcGVuZGluZyBvbiB0aGUgcGFyc2UuICBOb3RlIHdlIHN1cHBvcnQgcmFkaXhlcyA+IDE2IGhlcmUuICAqLwotICBpZiAoKCh0b2tzdGFydFswXSA+PSAnYScgJiYgdG9rc3RhcnRbMF0gPCAnYScgKyBpbnB1dF9yYWRpeCAtIDEwKSB8fAotICAgICAgICh0b2tzdGFydFswXSA+PSAnQScgJiYgdG9rc3RhcnRbMF0gPCAnQScgKyBpbnB1dF9yYWRpeCAtIDEwKSkpCi0gICAgewotICAgICAgWVlTVFlQRSBuZXdsdmFsOwkvKiBJdHMgdmFsdWUgaXMgaWdub3JlZC4gICovCi0gICAgICBpbnQgaGV4dHlwZSA9IHBhcnNlX251bWJlciAodG9rc3RhcnQsIG5hbWVsZW4sIDAsICZuZXdsdmFsKTsKLSAgICAgIGlmIChoZXh0eXBlID09IElOVEVHRVJfTElURVJBTCkKLQlyZXR1cm4gTkFNRV9PUl9JTlQ7Ci0gICAgfQotICByZXR1cm4gSURFTlRJRklFUjsKLX0KLQotdm9pZAoteXllcnJvciAobXNnKQotICAgICBjaGFyICptc2c7Ci17Ci0gIGVycm9yICgiQSAlcyBpbiBleHByZXNzaW9uLCBuZWFyIGAlcycuIiwgKG1zZyA/IG1zZyA6ICJlcnJvciIpLCBsZXhwdHIpOwotfQotCi1zdGF0aWMgc3RydWN0IHR5cGUgKgotamF2YV90eXBlX2Zyb21fbmFtZSAobmFtZSkKLSAgICAgc3RydWN0IHN0b2tlbiBuYW1lOwotIAotewotICBjaGFyICp0bXAgPSBjb3B5X25hbWUgKG5hbWUpOwotICBzdHJ1Y3QgdHlwZSAqdHlwID0gamF2YV9sb29rdXBfY2xhc3MgKHRtcCk7Ci0gIGlmICh0eXAgPT0gTlVMTCB8fCBUWVBFX0NPREUgKHR5cCkgIT0gVFlQRV9DT0RFX1NUUlVDVCkKLSAgICBlcnJvciAoIk5vIGNsYXNzIG5hbWVkICVzLiIsIHRtcCk7Ci0gIHJldHVybiB0eXA7Ci19Ci0KLS8qIElmIE5BTUUgaXMgYSB2YWxpZCB2YXJpYWJsZSBuYW1lIGluIHRoaXMgc2NvcGUsIHB1c2ggaXQgYW5kIHJldHVybiAxLgotICAgT3RoZXJ3aXNlLCByZXR1cm4gMC4gKi8KLQotc3RhdGljIGludAotcHVzaF92YXJpYWJsZSAobmFtZSkKLSAgICAgc3RydWN0IHN0b2tlbiBuYW1lOwotIAotewotICBjaGFyICp0bXAgPSBjb3B5X25hbWUgKG5hbWUpOwotICBpbnQgaXNfYV9maWVsZF9vZl90aGlzID0gMDsKLSAgc3RydWN0IHN5bWJvbCAqc3ltOwotICBzeW0gPSBsb29rdXBfc3ltYm9sICh0bXAsIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywgVkFSX05BTUVTUEFDRSwKLQkJICAgICAgICZpc19hX2ZpZWxkX29mX3RoaXMsIChzdHJ1Y3Qgc3ltdGFiICoqKSBOVUxMKTsKLSAgaWYgKHN5bSAmJiBTWU1CT0xfQ0xBU1MgKHN5bSkgIT0gTE9DX1RZUEVERUYpCi0gICAgewotICAgICAgaWYgKHN5bWJvbF9yZWFkX25lZWRzX2ZyYW1lIChzeW0pKQotCXsKLQkgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fAotCSAgICAgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIGlubmVybW9zdF9ibG9jaykpCi0JICAgIGlubmVybW9zdF9ibG9jayA9IGJsb2NrX2ZvdW5kOwotCX0KLQotICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0gICAgICAvKiBXZSB3YW50IHRvIHVzZSB0aGUgc2VsZWN0ZWQgZnJhbWUsIG5vdCBhbm90aGVyIG1vcmUgaW5uZXIgZnJhbWUKLQkgd2hpY2ggaGFwcGVucyB0byBiZSBpbiB0aGUgc2FtZSBibG9jay4gICovCi0gICAgICB3cml0ZV9leHBfZWx0X2Jsb2NrIChOVUxMKTsKLSAgICAgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOwotICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChpc19hX2ZpZWxkX29mX3RoaXMpCi0gICAgewotICAgICAgLyogaXQgaGFuZ3Mgb2ZmIG9mIGB0aGlzJy4gIE11c3Qgbm90IGluYWR2ZXJ0ZW50bHkgY29udmVydCBmcm9tIGEKLQkgbWV0aG9kIGNhbGwgdG8gZGF0YSByZWYuICAqLwotICAgICAgaWYgKGlubmVybW9zdF9ibG9jayA9PSAwIHx8IAotCSAgY29udGFpbmVkX2luIChibG9ja19mb3VuZCwgaW5uZXJtb3N0X2Jsb2NrKSkKLQlpbm5lcm1vc3RfYmxvY2sgPSBibG9ja19mb3VuZDsKLSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsKLSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9USElTKTsKLSAgICAgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9QVFIpOwotICAgICAgd3JpdGVfZXhwX3N0cmluZyAobmFtZSk7Ci0gICAgICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfUFRSKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIEFzc3VtaW5nIGEgcmVmZXJlbmNlIGV4cHJlc3Npb24gaGFzIGJlZW4gcHVzaGVkLCBlbWl0IHRoZQotICAgU1RSVUNUT1BfU1RSVUNUIG9wcyB0byBhY2Nlc3MgdGhlIGZpZWxkIG5hbWVkIE5BTUUuICBJZiBOQU1FIGlzIGEKLSAgIHF1YWxpZmllZCBuYW1lIChoYXMgJy4nKSwgZ2VuZXJhdGUgYSBmaWVsZCBhY2Nlc3MgZm9yIGVhY2ggcGFydC4gKi8KLQotc3RhdGljIHZvaWQKLXB1c2hfZmllbGRuYW1lcyAobmFtZSkKLSAgICAgc3RydWN0IHN0b2tlbiBuYW1lOwotewotICBpbnQgaTsKLSAgc3RydWN0IHN0b2tlbiB0b2tlbjsKLSAgdG9rZW4ucHRyID0gbmFtZS5wdHI7Ci0gIGZvciAoaSA9IDA7ICA7ICBpKyspCi0gICAgewotICAgICAgaWYgKGkgPT0gbmFtZS5sZW5ndGggfHwgbmFtZS5wdHJbaV0gPT0gJy4nKQotCXsKLQkgIC8qIHRva2VuLnB0ciBpcyBzdGFydCBvZiBjdXJyZW50IGZpZWxkIG5hbWUuICovCi0JICB0b2tlbi5sZW5ndGggPSAmbmFtZS5wdHJbaV0gLSB0b2tlbi5wdHI7Ci0JICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsKLQkgIHdyaXRlX2V4cF9zdHJpbmcgKHRva2VuKTsKLQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChTVFJVQ1RPUF9TVFJVQ1QpOwotCSAgdG9rZW4ucHRyICs9IHRva2VuLmxlbmd0aCArIDE7Ci0JfQotICAgICAgaWYgKGkgPj0gbmFtZS5sZW5ndGgpCi0JYnJlYWs7Ci0gICAgfQotfQotCi0vKiBIZWxwZXIgcm91dGluZSBmb3IgcHVzaF9leHByZXNzaW9uX25hbWUuCi0gICBIYW5kbGUgYSBxdWFsaWZpZWQgbmFtZSwgd2hlcmUgRE9UX0lOREVYIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgJy4nICovCi0KLXN0YXRpYyB2b2lkCi1wdXNoX3F1YWxpZmllZF9leHByZXNzaW9uX25hbWUgKG5hbWUsIGRvdF9pbmRleCkKLSAgICAgc3RydWN0IHN0b2tlbiBuYW1lOwotICAgICBpbnQgZG90X2luZGV4OwotewotICBzdHJ1Y3Qgc3Rva2VuIHRva2VuOwotICBjaGFyICp0bXA7Ci0gIHN0cnVjdCB0eXBlICp0eXA7Ci0KLSAgdG9rZW4ucHRyID0gbmFtZS5wdHI7Ci0gIHRva2VuLmxlbmd0aCA9IGRvdF9pbmRleDsKLQotICBpZiAocHVzaF92YXJpYWJsZSAodG9rZW4pKQotICAgIHsKLSAgICAgIHRva2VuLnB0ciA9IG5hbWUucHRyICsgZG90X2luZGV4ICsgMTsKLSAgICAgIHRva2VuLmxlbmd0aCA9IG5hbWUubGVuZ3RoIC0gZG90X2luZGV4IC0gMTsKLSAgICAgIHB1c2hfZmllbGRuYW1lcyAodG9rZW4pOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICB0b2tlbi5wdHIgPSBuYW1lLnB0cjsKLSAgZm9yICg7OykKLSAgICB7Ci0gICAgICB0b2tlbi5sZW5ndGggPSBkb3RfaW5kZXg7Ci0gICAgICB0bXAgPSBjb3B5X25hbWUgKHRva2VuKTsKLSAgICAgIHR5cCA9IGphdmFfbG9va3VwX2NsYXNzICh0bXApOwotICAgICAgaWYgKHR5cCAhPSBOVUxMKQotCXsKLQkgIGlmIChkb3RfaW5kZXggPT0gbmFtZS5sZW5ndGgpCi0JICAgIHsKLQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLQkgICAgICB3cml0ZV9leHBfZWx0X3R5cGUodHlwKTsKLQkgICAgICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGRvdF9pbmRleCsrOyAgLyogU2tpcCAnLicgKi8KLQkgIG5hbWUucHRyICs9IGRvdF9pbmRleDsKLQkgIG5hbWUubGVuZ3RoIC09IGRvdF9pbmRleDsKLQkgIGRvdF9pbmRleCA9IDA7Ci0JICB3aGlsZSAoZG90X2luZGV4IDwgbmFtZS5sZW5ndGggJiYgbmFtZS5wdHJbZG90X2luZGV4XSAhPSAnLicpIAotCSAgICBkb3RfaW5kZXgrKzsKLQkgIHRva2VuLnB0ciA9IG5hbWUucHRyOwotCSAgdG9rZW4ubGVuZ3RoID0gZG90X2luZGV4OwotCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1NDT1BFKTsKLQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAodHlwKTsKLQkgIHdyaXRlX2V4cF9zdHJpbmcgKHRva2VuKTsKLQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9TQ09QRSk7IAotCSAgaWYgKGRvdF9pbmRleCA8IG5hbWUubGVuZ3RoKQotCSAgICB7Ci0JICAgICAgZG90X2luZGV4Kys7Ci0JICAgICAgbmFtZS5wdHIgKz0gZG90X2luZGV4OwotCSAgICAgIG5hbWUubGVuZ3RoIC09IGRvdF9pbmRleDsKLQkgICAgICBwdXNoX2ZpZWxkbmFtZXMgKG5hbWUpOwotCSAgICB9Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoZG90X2luZGV4ID49IG5hbWUubGVuZ3RoKQotCWJyZWFrOwotICAgICAgZG90X2luZGV4Kys7ICAvKiBTa2lwICcuJyAqLwotICAgICAgd2hpbGUgKGRvdF9pbmRleCA8IG5hbWUubGVuZ3RoICYmIG5hbWUucHRyW2RvdF9pbmRleF0gIT0gJy4nKQotCWRvdF9pbmRleCsrOwotICAgIH0KLSAgZXJyb3IgKCJ1bmtub3duIHR5cGUgYCUuKnMnIiwgbmFtZS5sZW5ndGgsIG5hbWUucHRyKTsKLX0KLQotLyogSGFuZGxlIE5hbWUgaW4gYW4gZXhwcmVzc2lvbiAob3IgTEhTKS4KLSAgIEhhbmRsZSBWQVIsIFRZUEUsIFRZUEUuRklFTEQxLi4uLkZJRUxETiBhbmQgVkFSLkZJRUxEMS4uLi5GSUVMRE4uICovCi0KLXN0YXRpYyB2b2lkCi1wdXNoX2V4cHJlc3Npb25fbmFtZSAobmFtZSkKLSAgICAgc3RydWN0IHN0b2tlbiBuYW1lOwotewotICBjaGFyICp0bXA7Ci0gIHN0cnVjdCB0eXBlICp0eXA7Ci0gIGNoYXIgKnB0cjsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgIGkgPCBuYW1lLmxlbmd0aDsgIGkrKykKLSAgICB7Ci0gICAgICBpZiAobmFtZS5wdHJbaV0gPT0gJy4nKQotCXsKLQkgIC8qIEl0J3MgYSBRdWFsaWZpZWQgRXhwcmVzc2lvbiBOYW1lLiAqLwotCSAgcHVzaF9xdWFsaWZpZWRfZXhwcmVzc2lvbl9uYW1lIChuYW1lLCBpKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotCi0gIC8qIEl0J3MgYSBTaW1wbGUgRXhwcmVzc2lvbiBOYW1lLiAqLwotICAKLSAgaWYgKHB1c2hfdmFyaWFibGUgKG5hbWUpKQotICAgIHJldHVybjsKLSAgdG1wID0gY29weV9uYW1lIChuYW1lKTsKLSAgdHlwID0gamF2YV9sb29rdXBfY2xhc3MgKHRtcCk7Ci0gIGlmICh0eXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLSAgICAgIHdyaXRlX2V4cF9lbHRfdHlwZSh0eXApOwotICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoT1BfVFlQRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOwotCi0gICAgICBtc3ltYm9sID0gbG9va3VwX21pbmltYWxfc3ltYm9sICh0bXAsIE5VTEwsIE5VTEwpOwotICAgICAgaWYgKG1zeW1ib2wgIT0gTlVMTCkKLQl7Ci0JICB3cml0ZV9leHBfbXN5bWJvbCAobXN5bWJvbCwKLQkJCSAgICAgbG9va3VwX2Z1bmN0aW9uX3R5cGUgKGJ1aWx0aW5fdHlwZV9pbnQpLAotCQkJICAgICBidWlsdGluX3R5cGVfaW50KTsKLQl9Ci0gICAgICBlbHNlIGlmICghaGF2ZV9mdWxsX3N5bWJvbHMgKCkgJiYgIWhhdmVfcGFydGlhbF9zeW1ib2xzICgpKQotCWVycm9yICgiTm8gc3ltYm9sIHRhYmxlIGlzIGxvYWRlZC4gIFVzZSB0aGUgXCJmaWxlXCIgY29tbWFuZC4iKTsKLSAgICAgIGVsc2UKLQllcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gY3VycmVudCBjb250ZXh0LiIsIHRtcCk7Ci0gICAgfQotCi19Ci0KLQotLyogVGhlIGZvbGxvd2luZyB0d28gcm91dGluZXMsIGNvcHlfZXhwIGFuZCBpbnNlcnRfZXhwLCBhcmVuJ3Qgc3BlY2lmaWMgdG8KLSAgIEphdmEsIHNvIHRoZXkgY291bGQgZ28gaW4gcGFyc2UuYywgYnV0IHRoZWlyIG9ubHkgcHVycG9zZSBpcyB0byBzdXBwb3J0Ci0gICB0aGUgcGFyc2luZyBrbHVkZ2VzIHdlIHVzZSBpbiB0aGlzIGZpbGUsIHNvIG1heWJlIGl0J3MgYmVzdCB0byBpc29sYXRlCi0gICB0aGVtIGhlcmUuICAqLwotCi0vKiBDb3B5IHRoZSBleHByZXNzaW9uIHdob3NlIGxhc3QgZWxlbWVudCBpcyBhdCBpbmRleCBFTkRQT1MgLSAxIGluIEVYUFIKLSAgIGludG8gYSBmcmVzaGx5IHhtYWxsb2MnZWQgc3RydWN0IGV4cHJlc3Npb24uICBJdHMgbGFuZ3VhZ2VfZGVmbiBpcyBzZXQKLSAgIHRvIG51bGwuICAqLwotc3RhdGljIHN0cnVjdCBleHByZXNzaW9uICoKLWNvcHlfZXhwIChleHByLCBlbmRwb3MpCi0gICAgIHN0cnVjdCBleHByZXNzaW9uICpleHByOwotICAgICBpbnQgZW5kcG9zOwotewotICBpbnQgbGVuID0gbGVuZ3RoX29mX3N1YmV4cCAoZXhwciwgZW5kcG9zKTsKLSAgc3RydWN0IGV4cHJlc3Npb24gKm5ldwotICAgID0gKHN0cnVjdCBleHByZXNzaW9uICopIHhtYWxsb2MgKHNpemVvZiAoKm5ldykgKyBFWFBfRUxFTV9UT19CWVRFUyAobGVuKSk7Ci0gIG5ldy0+bmVsdHMgPSBsZW47Ci0gIG1lbWNweSAobmV3LT5lbHRzLCBleHByLT5lbHRzICsgZW5kcG9zIC0gbGVuLCBFWFBfRUxFTV9UT19CWVRFUyAobGVuKSk7Ci0gIG5ldy0+bGFuZ3VhZ2VfZGVmbiA9IDA7Ci0KLSAgcmV0dXJuIG5ldzsKLX0KLQotLyogSW5zZXJ0IHRoZSBleHByZXNzaW9uIE5FVyBpbnRvIHRoZSBjdXJyZW50IGV4cHJlc3Npb24gKGV4cG91dCkgYXQgUE9TLiAgKi8KLXN0YXRpYyB2b2lkCi1pbnNlcnRfZXhwIChwb3MsIG5ldykKLSAgICAgaW50IHBvczsKLSAgICAgc3RydWN0IGV4cHJlc3Npb24gKm5ldzsKLXsKLSAgaW50IG5ld2xlbiA9IG5ldy0+bmVsdHM7Ci0KLSAgLyogR3JvdyBleHBvdXQgaWYgbmVjZXNzYXJ5LiAgSW4gdGhpcyBmdW5jdGlvbidzIG9ubHkgdXNlIGF0IHByZXNlbnQsCi0gICAgIHRoaXMgc2hvdWxkIG5ldmVyIGJlIG5lY2Vzc2FyeS4gICovCi0gIGlmIChleHBvdXRfcHRyICsgbmV3bGVuID4gZXhwb3V0X3NpemUpCi0gICAgewotICAgICAgZXhwb3V0X3NpemUgPSBtYXggKGV4cG91dF9zaXplICogMiwgZXhwb3V0X3B0ciArIG5ld2xlbiArIDEwKTsKLSAgICAgIGV4cG91dCA9IChzdHJ1Y3QgZXhwcmVzc2lvbiAqKQotCXhyZWFsbG9jICgoY2hhciAqKSBleHBvdXQsIChzaXplb2YgKHN0cnVjdCBleHByZXNzaW9uKQotCQkJCSAgICArIEVYUF9FTEVNX1RPX0JZVEVTIChleHBvdXRfc2l6ZSkpKTsKLSAgICB9Ci0KLSAgewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gZXhwb3V0X3B0ciAtIDE7IGkgPj0gcG9zOyBpLS0pCi0gICAgICBleHBvdXQtPmVsdHNbaSArIG5ld2xlbl0gPSBleHBvdXQtPmVsdHNbaV07Ci0gIH0KLSAgCi0gIG1lbWNweSAoZXhwb3V0LT5lbHRzICsgcG9zLCBuZXctPmVsdHMsIEVYUF9FTEVNX1RPX0JZVEVTIChuZXdsZW4pKTsKLSAgZXhwb3V0X3B0ciArPSBuZXdsZW47Ci19CmRpZmYgLS1naXQgYS9nZGIvbTItZXhwLnRhYi5jIGIvZ2RiL20yLWV4cC50YWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmYzY4MS4uMDAwMDAwMAotLS0gYS9nZGIvbTItZXhwLnRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA4OSArMCwwIEBACi0KLS8qICBBIEJpc29uIHBhcnNlciwgbWFkZSBmcm9tIG0yLWV4cC55Ci0gYnkgIEdOVSBCaXNvbiB2ZXJzaW9uIDEuMjUKLSAgKi8KLQotI2RlZmluZSBZWUJJU09OIDEgIC8qIElkZW50aWZ5IEJpc29uIG91dHB1dC4gICovCi0KLSNkZWZpbmUJSU5UCTI1OAotI2RlZmluZQlIRVgJMjU5Ci0jZGVmaW5lCUVSUk9SCTI2MAotI2RlZmluZQlVSU5UCTI2MQotI2RlZmluZQlNMl9UUlVFCTI2MgotI2RlZmluZQlNMl9GQUxTRQkyNjMKLSNkZWZpbmUJQ0hBUgkyNjQKLSNkZWZpbmUJRkxPQVQJMjY1Ci0jZGVmaW5lCVNUUklORwkyNjYKLSNkZWZpbmUJTkFNRQkyNjcKLSNkZWZpbmUJQkxPQ0tOQU1FCTI2OAotI2RlZmluZQlJREVOVAkyNjkKLSNkZWZpbmUJVkFSTkFNRQkyNzAKLSNkZWZpbmUJVFlQRU5BTUUJMjcxCi0jZGVmaW5lCVNJWkUJMjcyCi0jZGVmaW5lCUNBUAkyNzMKLSNkZWZpbmUJT1JECTI3NAotI2RlZmluZQlISUdICTI3NQotI2RlZmluZQlBQlMJMjc2Ci0jZGVmaW5lCU1JTl9GVU5DCTI3NwotI2RlZmluZQlNQVhfRlVOQwkyNzgKLSNkZWZpbmUJRkxPQVRfRlVOQwkyNzkKLSNkZWZpbmUJVkFMCTI4MAotI2RlZmluZQlDSFIJMjgxCi0jZGVmaW5lCU9ERAkyODIKLSNkZWZpbmUJVFJVTkMJMjgzCi0jZGVmaW5lCUlOQwkyODQKLSNkZWZpbmUJREVDCTI4NQotI2RlZmluZQlJTkNMCTI4NgotI2RlZmluZQlFWENMCTI4NwotI2RlZmluZQlDT0xPTkNPTE9OCTI4OAotI2RlZmluZQlJTlRFUk5BTF9WQVIJMjg5Ci0jZGVmaW5lCUFCT1ZFX0NPTU1BCTI5MAotI2RlZmluZQlBU1NJR04JMjkxCi0jZGVmaW5lCUxFUQkyOTIKLSNkZWZpbmUJR0VRCTI5MwotI2RlZmluZQlOT1RFUVVBTAkyOTQKLSNkZWZpbmUJSU4JMjk1Ci0jZGVmaW5lCU9ST1IJMjk2Ci0jZGVmaW5lCUxPR0lDQUxfQU5ECTI5NwotI2RlZmluZQlESVYJMjk4Ci0jZGVmaW5lCU1PRAkyOTkKLSNkZWZpbmUJVU5BUlkJMzAwCi0jZGVmaW5lCURPVAkzMDEKLSNkZWZpbmUJTk9UCTMwMgotI2RlZmluZQlRSUQJMzAzCi0KLSNsaW5lIDQwICJtMi1leHAueSIKLQotCi0jaW5jbHVkZSAiZGVmcy5oIgotI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSNpbmNsdWRlICJleHByZXNzaW9uLmgiCi0jaW5jbHVkZSAibGFuZ3VhZ2UuaCIKLSNpbmNsdWRlICJ2YWx1ZS5oIgotI2luY2x1ZGUgInBhcnNlci1kZWZzLmgiCi0jaW5jbHVkZSAibTItbGFuZy5oIgotI2luY2x1ZGUgImJmZC5oIiAvKiBSZXF1aXJlZCBieSBvYmpmaWxlcy5oLiAgKi8KLSNpbmNsdWRlICJzeW1maWxlLmgiIC8qIFJlcXVpcmVkIGJ5IG9iamZpbGVzLmguICAqLwotI2luY2x1ZGUgIm9iamZpbGVzLmgiIC8qIEZvciBoYXZlX2Z1bGxfc3ltYm9scyBhbmQgaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKi8KLQotLyogUmVtYXAgbm9ybWFsIHlhY2MgcGFyc2VyIGludGVyZmFjZSBuYW1lcyAoeXlwYXJzZSwgeXlsZXgsIHl5ZXJyb3IsIGV0YyksCi0gICBhcyB3ZWxsIGFzIGdyYXR1aXRpb3VzbHkgZ2xvYmFsIHN5bWJvbCBuYW1lcywgc28gd2UgY2FuIGhhdmUgbXVsdGlwbGUKLSAgIHlhY2MgZ2VuZXJhdGVkIHBhcnNlcnMgaW4gZ2RiLiAgTm90ZSB0aGF0IHRoZXNlIGFyZSBvbmx5IHRoZSB2YXJpYWJsZXMKLSAgIHByb2R1Y2VkIGJ5IHlhY2MuICBJZiBvdGhlciBwYXJzZXIgZ2VuZXJhdG9ycyAoYmlzb24sIGJ5YWNjLCBldGMpIHByb2R1Y2UKLSAgIGFkZGl0aW9uYWwgZ2xvYmFsIG5hbWVzIHRoYXQgY29uZmxpY3QgYXQgbGluayB0aW1lLCB0aGVuIHRob3NlIHBhcnNlcgotICAgZ2VuZXJhdG9ycyBuZWVkIHRvIGJlIGZpeGVkIGluc3RlYWQgb2YgYWRkaW5nIHRob3NlIG5hbWVzIHRvIHRoaXMgbGlzdC4gKi8KLQotI2RlZmluZQl5eW1heGRlcHRoIG0yX21heGRlcHRoCi0jZGVmaW5lCXl5cGFyc2UJbTJfcGFyc2UKLSNkZWZpbmUJeXlsZXgJbTJfbGV4Ci0jZGVmaW5lCXl5ZXJyb3IJbTJfZXJyb3IKLSNkZWZpbmUJeXlsdmFsCW0yX2x2YWwKLSNkZWZpbmUJeXljaGFyCW0yX2NoYXIKLSNkZWZpbmUJeXlkZWJ1ZwltMl9kZWJ1ZwotI2RlZmluZQl5eXBhY3QJbTJfcGFjdAotI2RlZmluZQl5eXIxCW0yX3IxCi0jZGVmaW5lCXl5cjIJbTJfcjIKLSNkZWZpbmUJeXlkZWYJbTJfZGVmCi0jZGVmaW5lCXl5Y2hrCW0yX2NoawotI2RlZmluZQl5eXBnbwltMl9wZ28KLSNkZWZpbmUJeXlhY3QJbTJfYWN0Ci0jZGVmaW5lCXl5ZXhjYQltMl9leGNhCi0jZGVmaW5lCXl5ZXJyZmxhZyBtMl9lcnJmbGFnCi0jZGVmaW5lCXl5bmVycnMJbTJfbmVycnMKLSNkZWZpbmUJeXlwcwltMl9wcwotI2RlZmluZQl5eXB2CW0yX3B2Ci0jZGVmaW5lCXl5cwltMl9zCi0jZGVmaW5lCXl5X3l5cwltMl95eXMKLSNkZWZpbmUJeXlzdGF0ZQltMl9zdGF0ZQotI2RlZmluZQl5eXRtcAltMl90bXAKLSNkZWZpbmUJeXl2CW0yX3YKLSNkZWZpbmUJeXlfeXl2CW0yX3l5dgotI2RlZmluZQl5eXZhbAltMl92YWwKLSNkZWZpbmUJeXlsbG9jCW0yX2xsb2MKLSNkZWZpbmUJeXlyZWRzCW0yX3JlZHMJCS8qIFdpdGggWVlERUJVRyBkZWZpbmVkICovCi0jZGVmaW5lCXl5dG9rcwltMl90b2tzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eWxocwltMl95eWxocwotI2RlZmluZSB5eWxlbgltMl95eWxlbgotI2RlZmluZSB5eWRlZnJlZCBtMl95eWRlZnJlZAotI2RlZmluZSB5eWRnb3RvCW0yX3l5ZGdvdG8KLSNkZWZpbmUgeXlzaW5kZXggbTJfeXlzaW5kZXgKLSNkZWZpbmUgeXlyaW5kZXggbTJfeXlyaW5kZXgKLSNkZWZpbmUgeXlnaW5kZXggbTJfeXlnaW5kZXgKLSNkZWZpbmUgeXl0YWJsZQkgbTJfeXl0YWJsZQotI2RlZmluZSB5eWNoZWNrCSBtMl95eWNoZWNrCi0KLSNpZm5kZWYgWVlERUJVRwotI2RlZmluZQlZWURFQlVHCTAJCS8qIERlZmF1bHQgdG8gbm8geXlkZWJ1ZyBzdXBwb3J0ICovCi0jZW5kaWYKLQotaW50Ci15eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGludAoteXlsZXggUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi15eWVycm9yIFBBUkFNUyAoKGNoYXIgKikpOwotCi0jaWYgMAotc3RhdGljIGNoYXIgKgotbWFrZV9xdWFsbmFtZSBQQVJBTVMgKChjaGFyICosIGNoYXIgKikpOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLXBhcnNlX251bWJlciBQQVJBTVMgKChpbnQpKTsKLQotLyogVGhlIHNpZ24gb2YgdGhlIG51bWJlciBiZWluZyBwYXJzZWQuICovCi1zdGF0aWMgaW50IG51bWJlcl9zaWduID0gMTsKLQotLyogVGhlIGJsb2NrIHRoYXQgdGhlIG1vZHVsZSBzcGVjaWZpZWQgYnkgdGhlIHF1YWxpZmVyIG9uIGFuIGlkZW50aWZlciBpcwotICAgY29udGFpbmVkIGluLCAqLwotI2lmIDAKLXN0YXRpYyBzdHJ1Y3QgYmxvY2sgKm1vZGJsb2NrPTA7Ci0jZW5kaWYKLQotCi0jbGluZSAxMzUgIm0yLWV4cC55IgotdHlwZWRlZiB1bmlvbgotICB7Ci0gICAgTE9OR0VTVCBsdmFsOwotICAgIFVMT05HRVNUIHVsdmFsOwotICAgIERPVUJMRVNUIGR2YWw7Ci0gICAgc3RydWN0IHN5bWJvbCAqc3ltOwotICAgIHN0cnVjdCB0eXBlICp0dmFsOwotICAgIHN0cnVjdCBzdG9rZW4gc3ZhbDsKLSAgICBpbnQgdm9pZHZhbDsKLSAgICBzdHJ1Y3QgYmxvY2sgKmJ2YWw7Ci0gICAgZW51bSBleHBfb3Bjb2RlIG9wY29kZTsKLSAgICBzdHJ1Y3QgaW50ZXJuYWx2YXIgKml2YXI7Ci0KLSAgICBzdHJ1Y3QgdHlwZSAqKnR2ZWM7Ci0gICAgaW50ICppdmVjOwotICB9IFlZU1RZUEU7Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmbmRlZiBfX2NwbHVzcGx1cwotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotCi0KLSNkZWZpbmUJWVlGSU5BTAkJMTgxCi0jZGVmaW5lCVlZRkxBRwkJLTMyNzY4Ci0jZGVmaW5lCVlZTlRCQVNFCTY4Ci0KLSNkZWZpbmUgWVlUUkFOU0xBVEUoeCkgKCh1bnNpZ25lZCkoeCkgPD0gMzAzID8geXl0cmFuc2xhdGVbeF0gOiA4MikKLQotc3RhdGljIGNvbnN0IGNoYXIgeXl0cmFuc2xhdGVbXSA9IHsgICAgIDAsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDQ0LCAgICAgMiwgICAgIDIsICAgIDQ4LCAgICAgMiwgICAgNjAsCi0gICAgNjQsICAgIDUyLCAgICA1MCwgICAgMzUsICAgIDUxLCAgICAgMiwgICAgNTMsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgMzgsCi0gICAgNDIsICAgIDM5LCAgICAgMiwgICAgNDksICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgNTksICAgICAyLCAgICA2NywgICAgNTcsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICA2NSwgICAgIDIsICAgIDY2LCAgICA2MiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCi0gICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDUsCi0gICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsCi0gICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsCi0gICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzYsCi0gICAgMzcsICAgIDQwLCAgICA0MSwgICAgNDMsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIDU0LCAgICA1NSwgICAgNTYsCi0gICAgNTgsICAgIDYxLCAgICA2MwotfTsKLQotI2lmIFlZREVCVUcgIT0gMAotc3RhdGljIGNvbnN0IHNob3J0IHl5cHJoc1tdID0geyAgICAgMCwKLSAgICAgMCwgICAgIDIsICAgICA0LCAgICAgNiwgICAgIDksICAgIDEwLCAgICAxNCwgICAgMTcsICAgIDIwLCAgICAyMiwKLSAgICAyNCwgICAgMjksICAgIDM0LCAgICAzOSwgICAgNDQsICAgIDQ5LCAgICA1NCwgICAgNTksICAgIDY2LCAgICA3MSwKLSAgICA3NiwgICAgODEsICAgIDg0LCAgICA4OSwgICAgOTYsICAgMTAxLCAgIDEwOCwgICAxMTIsICAgMTE0LCAgIDExOCwKLSAgIDEyNSwgICAxMzIsICAgMTM2LCAgIDE0MSwgICAxNDIsICAgMTQ4LCAgIDE0OSwgICAxNTUsICAgMTU2LCAgIDE1OCwKLSAgIDE2MiwgICAxNjQsICAgMTY4LCAgIDE3MywgICAxNzgsICAgMTgyLCAgIDE4NiwgICAxOTAsICAgMTk0LCAgIDE5OCwKLSAgIDIwMiwgICAyMDYsICAgMjEwLCAgIDIxNCwgICAyMTgsICAgMjIyLCAgIDIyNiwgICAyMzAsICAgMjM0LCAgIDIzOCwKLSAgIDI0MiwgICAyNDYsICAgMjUwLCAgIDI1MiwgICAyNTQsICAgMjU2LCAgIDI1OCwgICAyNjAsICAgMjYyLCAgIDI2NCwKLSAgIDI2OSwgICAyNzEsICAgMjczLCAgIDI3NSwgICAyNzksICAgMjgxLCAgIDI4MywgICAyODcsICAgMjg5Ci19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlyaHNbXSA9IHsgICAgNzAsCi0gICAgIDAsICAgIDY5LCAgICAgMCwgICAgODEsICAgICAwLCAgICA3MCwgICAgNTcsICAgICAwLCAgICAgMCwgICAgNTEsCi0gICAgNzEsICAgIDcwLCAgICAgMCwgICAgNTAsICAgIDcwLCAgICAgMCwgICAgNzIsICAgIDcwLCAgICAgMCwgICAgNjEsCi0gICAgIDAsICAgIDYyLCAgICAgMCwgICAgMTgsICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLCAgICAxOSwgICAgNjAsCi0gICAgNzAsICAgIDY0LCAgICAgMCwgICAgMjEsICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLCAgICAyMCwgICAgNjAsCi0gICAgNzAsICAgIDY0LCAgICAgMCwgICAgMjIsICAgIDYwLCAgICA4MSwgICAgNjQsICAgICAwLCAgICAyMywgICAgNjAsCi0gICAgODEsICAgIDY0LCAgICAgMCwgICAgMjQsICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLCAgICAyNSwgICAgNjAsCi0gICAgODEsICAgIDM1LCAgICA3MCwgICAgNjQsICAgICAwLCAgICAyNiwgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsCi0gICAgMjcsICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLCAgICAyOCwgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsCi0gICAgMTcsICAgIDcwLCAgICAgMCwgICAgMjksICAgIDYwLCAgICA3MCwgICAgNjQsICAgICAwLCAgICAyOSwgICAgNjAsCi0gICAgNzAsICAgIDM1LCAgICA3MCwgICAgNjQsICAgICAwLCAgICAzMCwgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsCi0gICAgMzAsICAgIDYwLCAgICA3MCwgICAgMzUsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDcwLCAgICA1OCwgICAgMTIsCi0gICAgIDAsICAgIDczLCAgICAgMCwgICAgNzAsICAgIDQ1LCAgICA3MywgICAgIDAsICAgIDMxLCAgICA2MCwgICAgNzAsCi0gICAgMzUsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDMyLCAgICA2MCwgICAgNzAsICAgIDM1LCAgICA3MCwgICAgNjQsCi0gICAgIDAsICAgIDY1LCAgICA3NiwgICAgNjYsICAgICAwLCAgICA4MSwgICAgNjUsICAgIDc2LCAgICA2NiwgICAgIDAsCi0gICAgIDAsICAgIDcwLCAgICA1OSwgICAgNzQsICAgIDc3LCAgICA2NywgICAgIDAsICAgICAwLCAgICA3MCwgICAgNjAsCi0gICAgNzUsICAgIDc2LCAgICA2NCwgICAgIDAsICAgICAwLCAgICA3MCwgICAgIDAsICAgIDc2LCAgICAzNSwgICAgNzAsCi0gICAgIDAsICAgIDcwLCAgICAgMCwgICAgNzcsICAgIDM1LCAgICA3MCwgICAgIDAsICAgIDY1LCAgICA4MSwgICAgNjYsCi0gICAgNzAsICAgICAwLCAgICA4MSwgICAgNjAsICAgIDcwLCAgICA2NCwgICAgIDAsICAgIDYwLCAgICA3MCwgICAgNjQsCi0gICAgIDAsICAgIDcwLCAgICA0OSwgICAgNzAsICAgICAwLCAgICA3MCwgICAgNTIsICAgIDcwLCAgICAgMCwgICAgNzAsCi0gICAgNTMsICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDU0LCAgICA3MCwgICAgIDAsICAgIDcwLCAgICA1NSwgICAgNzAsCi0gICAgIDAsICAgIDcwLCAgICA1MCwgICAgNzAsICAgICAwLCAgICA3MCwgICAgNTEsICAgIDcwLCAgICAgMCwgICAgNzAsCi0gICAgNDIsICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDQzLCAgICA3MCwgICAgIDAsICAgIDcwLCAgICA0NCwgICAgNzAsCi0gICAgIDAsICAgIDcwLCAgICA0MCwgICAgNzAsICAgICAwLCAgICA3MCwgICAgNDEsICAgIDcwLCAgICAgMCwgICAgNzAsCi0gICAgMzgsICAgIDcwLCAgICAgMCwgICAgNzAsICAgIDM5LCAgICA3MCwgICAgIDAsICAgIDcwLCAgICA0NywgICAgNzAsCi0gICAgIDAsICAgIDcwLCAgICA0NiwgICAgNzAsICAgICAwLCAgICA3MCwgICAgMzcsICAgIDcwLCAgICAgMCwgICAgIDcsCi0gICAgIDAsICAgICA4LCAgICAgMCwgICAgIDMsICAgICAwLCAgICAgNiwgICAgIDAsICAgICA5LCAgICAgMCwgICAgMTAsCi0gICAgIDAsICAgIDgwLCAgICAgMCwgICAgMTcsICAgIDYwLCAgICA4MSwgICAgNjQsICAgICAwLCAgICAxMSwgICAgIDAsCi0gICAgNzksICAgICAwLCAgICAxMywgICAgIDAsICAgIDc4LCAgICAzMywgICAgMTMsICAgICAwLCAgICA3OSwgICAgIDAsCi0gICAgMzQsICAgICAwLCAgICA3OCwgICAgMzMsICAgIDEyLCAgICAgMCwgICAgMTIsICAgICAwLCAgICAxNiwgICAgIDAKLX07Ci0KLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlybGluZVtdID0geyAwLAotICAgMjA0LCAgIDIwNSwgICAyMDgsICAgMjE3LCAgIDIyMCwgICAyMjIsICAgMjI3LCAgIDIzMSwgICAyMzUsICAgMjM2LAotICAgMjM5LCAgIDI0MywgICAyNDcsICAgMjUxLCAgIDI1NSwgICAyNjEsICAgMjY3LCAgIDI3MSwgICAyNzcsICAgMjgxLAotICAgMjg1LCAgIDI4OSwgICAyOTQsICAgMjk4LCAgIDMwNCwgICAzMDgsICAgMzE0LCAgIDMyMCwgICAzMjMsICAgMzI3LAotICAgMzMxLCAgIDMzNCwgICAzMzYsICAgMzQyLCAgIDM0NywgICAzNTMsICAgMzU3LCAgIDM2MywgICAzNjYsICAgMzcwLAotICAgMzc1LCAgIDM4MCwgICAzODUsICAgMzkxLCAgIDM5NywgICA0MDUsICAgNDA5LCAgIDQxMywgICA0MTcsICAgNDIxLAotICAgNDI1LCAgIDQyOSwgICA0MzMsICAgNDM3LCAgIDQzOSwgICA0NDMsICAgNDQ3LCAgIDQ1MSwgICA0NTUsICAgNDU5LAotICAgNDYzLCAgIDQ2NywgICA0NzQsICAgNDgwLCAgIDQ4NiwgICA0OTMsICAgNTAyLCAgIDUxMCwgICA1MTcsICAgNTIwLAotICAgNTI3LCAgIDUzNCwgICA1MzgsICAgNTQ3LCAgIDU1OSwgICA1NjcsICAgNTcxLCAgIDU4NywgICA2MzgKLX07Ci0jZW5kaWYKLQotCi0jaWYgWVlERUJVRyAhPSAwIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB5eXRuYW1lW10gPSB7ICAgIiQiLCJlcnJvciIsIiR1bmRlZmluZWQuIiwiSU5UIiwiSEVYIiwKLSJFUlJPUiIsIlVJTlQiLCJNMl9UUlVFIiwiTTJfRkFMU0UiLCJDSEFSIiwiRkxPQVQiLCJTVFJJTkciLCJOQU1FIiwiQkxPQ0tOQU1FIiwKLSJJREVOVCIsIlZBUk5BTUUiLCJUWVBFTkFNRSIsIlNJWkUiLCJDQVAiLCJPUkQiLCJISUdIIiwiQUJTIiwiTUlOX0ZVTkMiLCJNQVhfRlVOQyIsCi0iRkxPQVRfRlVOQyIsIlZBTCIsIkNIUiIsIk9ERCIsIlRSVU5DIiwiSU5DIiwiREVDIiwiSU5DTCIsIkVYQ0wiLCJDT0xPTkNPTE9OIiwKLSJJTlRFUk5BTF9WQVIiLCInLCciLCJBQk9WRV9DT01NQSIsIkFTU0lHTiIsIic8JyIsIic+JyIsIkxFUSIsIkdFUSIsIic9JyIsIk5PVEVRVUFMIiwKLSInIyciLCJJTiIsIk9ST1IiLCJMT0dJQ0FMX0FORCIsIicmJyIsIidAJyIsIicrJyIsIictJyIsIicqJyIsIicvJyIsIkRJViIsIk1PRCIsCi0iVU5BUlkiLCInXiciLCJET1QiLCInWyciLCInKCciLCJOT1QiLCInficiLCJRSUQiLCInKSciLCIneyciLCInfSciLCInXSciLCJzdGFydCIsCi0idHlwZV9leHAiLCJleHAiLCJAMSIsIm5vdF9leHAiLCJzZXQiLCJAMiIsIkAzIiwiYXJnbGlzdCIsIm5vbl9lbXB0eV9hcmdsaXN0IiwKLSJibG9jayIsImZibG9jayIsInZhcmlhYmxlIiwidHlwZSIsIE5VTEwKLX07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cjFbXSA9IHsgICAgIDAsCi0gICAgNjgsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MiwgICAgNzIsCi0gICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsCi0gICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsCi0gICAgNzAsICAgIDczLCAgICA3MywgICAgNzQsICAgIDcwLCAgICA3NSwgICAgNzAsICAgIDc2LCAgICA3NiwgICAgNzYsCi0gICAgNzcsICAgIDc3LCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsCi0gICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsCi0gICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsICAgIDcwLCAgICA3MCwgICAgNzAsCi0gICAgNzAsICAgIDc4LCAgICA3OSwgICAgNzksICAgIDgwLCAgICA4MCwgICAgODAsICAgIDgwLCAgICA4MQotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5cjJbXSA9IHsgICAgIDAsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAwLCAgICAgMywgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDEsCi0gICAgIDQsICAgICA0LCAgICAgNCwgICAgIDQsICAgICA0LCAgICAgNCwgICAgIDQsICAgICA2LCAgICAgNCwgICAgIDQsCi0gICAgIDQsICAgICAyLCAgICAgNCwgICAgIDYsICAgICA0LCAgICAgNiwgICAgIDMsICAgICAxLCAgICAgMywgICAgIDYsCi0gICAgIDYsICAgICAzLCAgICAgNCwgICAgIDAsICAgICA1LCAgICAgMCwgICAgIDUsICAgICAwLCAgICAgMSwgICAgIDMsCi0gICAgIDEsICAgICAzLCAgICAgNCwgICAgIDQsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCi0gICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMywgICAgIDMsCi0gICAgIDMsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDQsCi0gICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMQotfTsKLQotc3RhdGljIGNvbnN0IHNob3J0IHl5ZGVmYWN0W10gPSB7ICAgICAwLAotICAgIDY1LCAgICA2NiwgICAgNjMsICAgIDY0LCAgICA2NywgICAgNjgsICAgIDcxLCAgICA3OCwgICAgNzMsICAgIDc5LAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDc2LCAgICAgMCwgICAgIDUsICAgICAwLAotICAgICA5LCAgICAxMCwgICAgMzgsICAgICAyLCAgICAgMSwgICAgIDAsICAgIDI4LCAgICAgMCwgICAgNzUsICAgIDY5LAotICAgICAzLCAgICAgMCwgICAgMjIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICA3LAotICAgICAwLCAgICAgMCwgICAgMzksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICA0LCAgICAgMCwgICAgMzQsICAgIDM2LCAgICAgOCwgICAgIDAsICAgICAwLAotICAgIDM4LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgNiwgICAgNDUsICAgICAwLAotICAgIDMyLCAgICAgMCwgICAgNjIsICAgIDU4LCAgICA1OSwgICAgNTYsICAgIDU3LCAgICA1MywgICAgNTQsICAgIDU1LAotICAgIDM4LCAgICAyOSwgICAgIDAsICAgIDYxLCAgICA2MCwgICAgNDYsICAgIDUxLCAgICA1MiwgICAgNDcsICAgIDQ4LAotICAgIDQ5LCAgICA1MCwgICAgMjcsICAgICAwLCAgICAzOCwgICAgNzcsICAgIDc0LCAgICAgMCwgICAgIDAsICAgIDcwLAotICAgIDExLCAgICAxMiwgICAgMTQsICAgIDEzLCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAgMCwgICAgMTksICAgIDIwLAotICAgIDIxLCAgICAgMCwgICAgMjMsICAgICAwLCAgICAyNSwgICAgIDAsICAgICAwLCAgICA0MCwgICAgNDMsICAgIDQxLAotICAgICAwLCAgICAgMCwgICAgNDQsICAgIDMzLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgIDM1LCAgICAzNywgICAgMTgsICAgIDI0LCAgICAyNiwgICAgMzAsICAgIDMxLCAgICA0MiwgICAgIDAsICAgICAwLAotICAgICAwCi19OwotCi1zdGF0aWMgY29uc3Qgc2hvcnQgeXlkZWZnb3RvW10gPSB7ICAgMTc5LAotICAgIDM0LCAgICA2MywgICAgNjEsICAgIDM2LCAgICAzNywgICAxMzQsICAgMTM1LCAgICA2NCwgICAxNjEsICAgIDM4LAotICAgIDM5LCAgICA0MCwgICAgNDQKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXBhY3RbXSA9IHsgICAxNTUsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsCi0gICAyMTUsICAgLTI3LCAgIC0yMiwgICAtMjAsICAgLTE5LCAgICAxNCwgICAgMjQsICAgIDI2LCAgICAyNywgICAgMjgsCi0gICAgMjksICAgIDMxLCAgICAzMiwgICAgMzMsICAgIDM1LCAgICAzNiwtMzI3NjgsICAgMTU1LC0zMjc2OCwgICAxNTUsCi0tMzI3NjgsLTMyNzY4LCAgIDE1NSwtMzI3NjgsICAgNzQyLCAgIDE1NSwtMzI3NjgsICAgIC02LCAgICAtNCwtMzI3NjgsCi0gICAtMzQsICAgMTU1LCAgICAgNSwgICAtMzQsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgICA0NCwgICAgNDQsCi0gICAxNTUsICAgIDQ0LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAgIDUsCi0gICAxNTUsICAgMjcyLCAgIDc0MiwgICAtMzEsICAgLTQxLCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsCi0gICAxNTUsICAgMTU1LCAgIDE1NSwgICAtMTUsICAgMTU1LCAgIDE1NSwgICAxNTUsICAgMTU1LCAgIDE1NSwgICAxNTUsCi0gICAxNTUsICAgMTU1LCAgIDE1NSwtMzI3NjgsICAgIDg1LC0zMjc2OCwtMzI3NjgsICAgICA1LCAgICAtNSwgICAxNTUsCi0gICAxNTUsICAgLTIxLCAgIDMwMCwgICAzMjgsICAgMzU2LCAgIDM4NCwgICAgMzQsICAgIDM5LCAgIDQxMiwgICAgNjQsCi0gICA0NDAsICAgNDY4LCAgIDQ5NiwgICAgNzgsICAgMjQ0LCAgIDY5MiwgICA3MTgsICAgICA1LC0zMjc2OCwgICAxNTUsCi0tMzI3NjgsICAgMTU1LCAgIDc2NiwgICAtMzcsICAgLTM3LCAgIC0zNywgICAtMzcsICAgLTM3LCAgIC0zNywgICAtMzcsCi0gICAxNTUsLTMyNzY4LCAgICA0MCwgICAxNDEsICAgMjAxLCAgIDc3NywgICA3ODYsICAgNzg2LCAgICAgNSwgICAgIDUsCi0gICAgIDUsICAgICA1LC0zMjc2OCwgICAxNTUsICAgMTU1LC0zMjc2OCwtMzI3NjgsICAgNTI0LCAgIC0yOSwtMzI3NjgsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgMTU1LC0zMjc2OCwtMzI3NjgsCi0tMzI3NjgsICAgMTU1LC0zMjc2OCwgICAxNTUsLTMyNzY4LCAgIDE1NSwgICAxNTUsICAgNzQyLCAgICAgNSwgICA3NDIsCi0gICAtMzMsICAgLTMyLC0zMjc2OCwtMzI3NjgsICAgNTUyLCAgIDU4MCwgICA2MDgsICAgNjM2LCAgIDY2NCwgICAxNTUsCi0tMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsICAgNzQyLCAgIDEwMCwgICAxMDYsCi0tMzI3NjgKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPSB7LTMyNzY4LAotLTMyNzY4LCAgICAgMCwtMzI3NjgsLTMyNzY4LCAgICAzNywtMzI3NjgsLTMyNzY4LCAgIC04NiwtMzI3NjgsLTMyNzY4LAotLTMyNzY4LC0zMjc2OCwgICAgNTIKLX07Ci0KLQotI2RlZmluZQlZWUxBU1QJCTg0NgotCi0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPSB7ICAgIDM1LAotICAgIDEwLCAgIDE3MCwgICAxMTAsICAgMTEwLCAgIDEzOSwgICAxMTAsICAgMTM2LCAgIDEzNywgICAgNzUsICAgIDc2LAotICAgIDQzLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgOTAsICAgIDg0LAotICAgIDg1LCAgICA4NiwgICAgODcsICAgIDkxLCAgIDExMiwgICAgOTAsICAgIDg5LCAgICA2MCwgICAtNzIsICAgIDYyLAotICAgIDkxLCAgIDE3MiwgICAgNDUsICAgMTcxLCAgIDExMSwgICAgODgsICAgMTY0LCAgICA0NiwgICAgOTAsICAgIDQ3LAotICAgIDQ4LCAgICA2MiwgICAxNDAsICAgIDkxLCAgICA5MywgICAgOTQsICAgIDk1LCAgICA5NiwgICAxNjIsICAgMTIxLAotICAgIDk5LCAgICA0MSwgICAxMDEsICAgMTAyLCAgIDEwMywgICAxMDQsICAgMTA1LCAgIDEwNiwgICAxMDcsICAgIDEwLAotICAgMTA4LCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAxMTMsICAgMTE0LCAgIDExNSwgICAxMTYsICAgMTE3LAotICAgMTE4LCAgIDExOSwgICAxMjAsICAgIDQ5LCAgIDEyNCwgICAxMjUsICAgMTI2LCAgIDEyNywgICAxMjgsICAgMTI5LAotICAgMTMwLCAgIDEzMSwgICAxMzIsICAgIDUwLCAgICA2NSwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgMTM4LAotICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDkyLCAgICA1OCwgICAgNTksICAgMTMzLCAgIDE0NSwgICAxNDgsICAgMTgwLAotICAgIDk3LCAgICA5OCwgICAxNDYsICAgMTAwLCAgICA5MSwgICAxODEsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTU4LAotICAgMTIyLCAgIDE1OSwgICAxNTIsICAgICAwLCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLAotICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAxMjMsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLAotICAgIDgxLCAgICA4MiwgICAgODMsICAgMTYwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLAotICAgICAwLCAgIDE1MywgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE2NSwgICAgIDAsICAgICAwLAotICAgICAwLCAgIDE2NiwgICAgIDAsICAgMTY3LCAgICAgMCwgICAxNjgsICAgMTY5LCAgICAgMSwgICAgIDAsICAgICAwLAotICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDAsICAgMTc4LAotICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAotICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICA3NiwgICAgMjcsICAgIDc3LAotICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LAotICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyOCwgICAgMjksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAgMSwgICAgIDAsICAgIDMzLAotICAgICAyLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgIDAsICAgICAwLAotICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAotICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAgMCwgICAgMjcsICAgIDc3LAotICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LAotICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgICAyOCwgICAgMjksICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAotICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICA0MiwgICAgMzEsICAgIDMyLCAgICAgMCwgICAxNTQsICAgIDMzLAotICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LAotICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLAotICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE1NSwgICAgNjYsICAgIDY3LAotICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLAotICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LAotICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxMDksICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LAotICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LAotICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LAotICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQxLCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLAotICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLAotICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLAotICAgICAwLCAgIDE0MiwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLAotICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLAotICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQzLAotICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LAotICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLAotICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE0NCwgICAgNjYsICAgIDY3LAotICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLAotICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LAotICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxNDcsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LAotICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LAotICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LAotICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQ5LCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLAotICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLAotICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLAotICAgICAwLCAgIDE1MCwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLAotICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLAotICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTUxLAotICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LAotICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLAotICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE2MywgICAgNjYsICAgIDY3LAotICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLAotICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LAotICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLCAgICAgMCwgICAxNzMsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LAotICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwgICAgNzUsICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LAotICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LAotICAgICAwLCAgICAgMCwgICAgIDAsICAgMTc0LCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLAotICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLAotICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgIDAsICAgICAwLAotICAgICAwLCAgIDE3NSwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLAotICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLAotICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTc2LAotICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LAotICAgIDc2LCAgICAgMCwgICAgNzcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLAotICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICAgMCwgICAgIDAsICAgMTU2LCAgIDE3NywgICAgNjYsICAgIDY3LAotICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLAotICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LAotICAgIDg2LCAgICA4NywgICAxNTcsICAgICAwLCAgICA2NiwgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLAotICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgIDAsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLAotICAgIDgxLCAgICA4MiwgICAgODMsICAgICAwLCAgICA4NCwgICAgODUsICAgIDg2LCAgICA4NywgICAgNjYsICAgIDY3LAotICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLAotICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLCAgICA4MSwgICAgODIsICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LAotICAgIDg2LCAgICA4NywtMzI3NjgsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLAotICAgIDc0LCAgICA3NSwgICAgNzYsICAgICAwLCAgICA3NywgICAgNzgsICAgIDc5LCAgICA4MCwgICAgODEsICAgIDgyLAotICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcsICAgIDc4LCAgICA3OSwgICAgODAsICAgIDgxLAotICAgIDgyLCAgICA4MywgICAgIDAsICAgIDg0LCAgICA4NSwgICAgODYsICAgIDg3LCAgICA4MCwgICAgODEsICAgIDgyLAotICAgIDgzLCAgICAgMCwgICAgODQsICAgIDg1LCAgICA4NiwgICAgODcKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPSB7ICAgICAwLAotICAgIDE2LCAgICAzNSwgICAgMzUsICAgIDM1LCAgICA5MSwgICAgMzUsICAgIDEyLCAgICAxMywgICAgNDYsICAgIDQ3LAotICAgIDExLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNjAsICAgIDU3LAotICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDY1LCAgICA2NiwgICAgNjAsICAgIDMzLCAgICAyOCwgICAgMzMsICAgIDMwLAotICAgIDY1LCAgICA2NCwgICAgNjAsICAgIDY3LCAgICA2NiwgICAgMzYsICAgIDY2LCAgICA2MCwgICAgNjAsICAgIDYwLAotICAgIDYwLCAgICA0MiwgICAgNjQsICAgIDY1LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICA0OCwgICAxMzUsICAgIDY1LAotICAgIDUxLCAgICAgMCwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDE2LAotICAgIDYxLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgNjYsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLAotICAgIDcxLCAgICA3MiwgICAgNzMsICAgIDYwLCAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDgwLAotICAgIDgxLCAgICA4MiwgICAgODMsICAgIDYwLCAgICAzMywgICAgNjAsICAgIDYwLCAgICA2MCwgICAgNjAsICAgIDkwLAotICAgIDYwLCAgICA2MCwgICAgNjAsICAgIDQyLCAgICA2MCwgICAgNjAsICAgIDEyLCAgICA2NCwgICAgMzUsICAgICAwLAotICAgIDQ5LCAgICA1MCwgICAgNjQsICAgIDUyLCAgICA2NSwgICAgIDAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgMTEwLAotICAgIDc0LCAgIDExMiwgICAgMzUsICAgIC0xLCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLAotICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgNzQsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLAotICAgIDUzLCAgICA1NCwgICAgNTUsICAgMTM0LCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICA2NCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgIDE0OCwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgIDE1MiwgICAgLTEsICAgMTU0LCAgICAtMSwgICAxNTYsICAgMTU3LCAgICAgMywgICAgLTEsICAgIC0xLAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgLTEsICAgMTcwLAotICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LAotICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICA0NywgICAgMzQsICAgIDQ5LAotICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LAotICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1MCwgICAgNTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2MCwgICAgNjEsICAgIDYyLCAgICAgMywgICAgLTEsICAgIDY1LAotICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgLTEsICAgIC0xLAotICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LAotICAgIDI2LCAgICAyNywgICAgMjgsICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAtMSwgICAgMzQsICAgIDQ5LAotICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LAotICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA1MCwgICAgNTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2MCwgICAgNjEsICAgIDYyLCAgICAtMSwgICAgMzUsICAgIDY1LAotICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LAotICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LAotICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLAotICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LAotICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLAotICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLAotICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLAotICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLAotICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAotICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LAotICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LAotICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LAotICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LAotICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLAotICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LAotICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLAotICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLAotICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLAotICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLAotICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAotICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LAotICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LAotICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LAotICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LAotICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLAotICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LAotICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNjQsICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLAotICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LCAgICA0NSwgICAgNDYsICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLAotICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLAotICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLAotICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLAotICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgLTEsICAgIC0xLAotICAgIC0xLCAgICA2NCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAotICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LAotICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDY0LAotICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LAotICAgIDQ3LCAgICAtMSwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLAotICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICAtMSwgICAgLTEsICAgIDM1LCAgICA2NCwgICAgMzcsICAgIDM4LAotICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLAotICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LAotICAgIDU5LCAgICA2MCwgICAgMzUsICAgIC0xLCAgICAzNywgICAgMzgsICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLAotICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywgICAgLTEsICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLAotICAgIDUzLCAgICA1NCwgICAgNTUsICAgIC0xLCAgICA1NywgICAgNTgsICAgIDU5LCAgICA2MCwgICAgMzcsICAgIDM4LAotICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLAotICAgIDQ5LCAgICA1MCwgICAgNTEsICAgIDUyLCAgICA1MywgICAgNTQsICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LAotICAgIDU5LCAgICA2MCwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQ0LAotICAgIDQ1LCAgICA0NiwgICAgNDcsICAgIC0xLCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LAotICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLAotICAgIDU0LCAgICA1NSwgICAgLTEsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA1MiwgICAgNTMsICAgIDU0LAotICAgIDU1LCAgICAtMSwgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAKLX07Ci0vKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLwotI2xpbmUgMyAiL3N0b25lL2ppbWIvbWFpbi05OHIyL3NoYXJlL2Jpc29uLnNpbXBsZSIKLQotLyogU2tlbGV0b24gb3V0cHV0IHBhcnNlciBmb3IgYmlzb24sCi0gICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuICAqLwotCi0vKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCi0gICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgotICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KLQotI2lmbmRlZiBhbGxvY2EKLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UgLyogbm90IEdOVSBDLiAgKi8KLSNpZiAoIWRlZmluZWQgKF9fU1REQ19fKSAmJiBkZWZpbmVkIChzcGFyYykpIHx8IGRlZmluZWQgKF9fc3BhcmNfXykgfHwgZGVmaW5lZCAoX19zcGFyYykgfHwgZGVmaW5lZCAoX19zZ2kpCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci0jZWxzZSAvKiBub3Qgc3BhcmMgKi8KLSNpZiBkZWZpbmVkIChNU0RPUykgJiYgIWRlZmluZWQgKF9fVFVSQk9DX18pCi0jZWxzZSAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18gKi8KLSNpZiBkZWZpbmVkKF9BSVgpCi0gI3ByYWdtYSBhbGxvY2EKLSNlbHNlIC8qIG5vdCBNU0RPUywgX19UVVJCT0NfXywgb3IgX0FJWCAqLwotI2lmZGVmIF9faHB1eAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLXZvaWQgKmFsbG9jYSAodW5zaWduZWQgaW50KTsKLX07Ci0jZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KLXZvaWQgKmFsbG9jYSAoKTsKLSNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KLSNlbmRpZiAvKiBfX2hwdXggKi8KLSNlbmRpZiAvKiBub3QgX0FJWCAqLwotI2VuZGlmIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLwotI2VuZGlmIC8qIG5vdCBzcGFyYy4gICovCi0jZW5kaWYgLyogbm90IEdOVSBDLiAgKi8KLSNlbmRpZiAvKiBhbGxvY2Egbm90IGRlZmluZWQuICAqLwotCi0vKiBUaGlzIGlzIHRoZSBwYXJzZXIgY29kZSB0aGF0IGlzIHdyaXR0ZW4gaW50byBlYWNoIGJpc29uIHBhcnNlcgotICB3aGVuIHRoZSAlc2VtYW50aWNfcGFyc2VyIGRlY2xhcmF0aW9uIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGdyYW1tYXIuCi0gIEl0IHdhcyB3cml0dGVuIGJ5IFJpY2hhcmQgU3RhbGxtYW4gYnkgc2ltcGxpZnlpbmcgdGhlIGhhaXJ5IHBhcnNlcgotICB1c2VkIHdoZW4gJXNlbWFudGljX3BhcnNlciBpcyBzcGVjaWZpZWQuICAqLwotCi0vKiBOb3RlOiB0aGVyZSBtdXN0IGJlIG9ubHkgb25lIGRvbGxhciBzaWduIGluIHRoaXMgZmlsZS4KLSAgIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBsaXN0IG9mIGFjdGlvbnMsIGVhY2ggYWN0aW9uCi0gICBhcyBvbmUgY2FzZSBvZiB0aGUgc3dpdGNoLiAgKi8KLQotI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQotI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCi0jZGVmaW5lIFlZRU1QVFkJCS0yCi0jZGVmaW5lIFlZRU9GCQkwCi0jZGVmaW5lIFlZQUNDRVBUCXJldHVybigwKQotI2RlZmluZSBZWUFCT1JUIAlyZXR1cm4oMSkKLSNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycmxhYjEKLS8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLgotICAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkgdG8gZWFzZSB0aGUKLSAgIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCi0gICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCi0jZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgotI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCi0jZGVmaW5lIFlZQkFDS1VQKHRva2VuLCB2YWx1ZSkgXAotZG8JCQkJCQkJCVwKLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKLSAgICB7IHl5Y2hhciA9ICh0b2tlbiksIHl5bHZhbCA9ICh2YWx1ZSk7CQkJXAotICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCi0gICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKLSAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAotICAgIH0JCQkJCQkJCVwKLSAgZWxzZQkJCQkJCQkJXAotICAgIHsgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTsgWVlFUlJPUjsgfQlcCi13aGlsZSAoMCkKLQotI2RlZmluZSBZWVRFUlJPUgkxCi0jZGVmaW5lIFlZRVJSQ09ERQkyNTYKLQotI2lmbmRlZiBZWVBVUkUKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCkKLSNlbmRpZgotCi0jaWZkZWYgWVlQVVJFCi0jaWZkZWYgWVlMU1BfTkVFREVECi0jaWZkZWYgWVlMRVhfUEFSQU0KLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQotI2Vsc2UKLSNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MpCi0jZW5kaWYKLSNlbHNlIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KLSNpZmRlZiBZWUxFWF9QQVJBTQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCi0jZWxzZQotI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCkKLSNlbmRpZgotI2VuZGlmIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KLSNlbmRpZgotCi0vKiBJZiBub25yZWVudHJhbnQsIGdlbmVyYXRlIHRoZSB2YXJpYWJsZXMgaGVyZSAqLwotCi0jaWZuZGVmIFlZUFVSRQotCi1pbnQJeXljaGFyOwkJCS8qICB0aGUgbG9va2FoZWFkIHN5bWJvbAkJKi8KLVlZU1RZUEUJeXlsdmFsOwkJCS8qICB0aGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlCQkqLwotCQkJCS8qICBsb29rYWhlYWQgc3ltYm9sCQkJKi8KLQotI2lmZGVmIFlZTFNQX05FRURFRAotWVlMVFlQRSB5eWxsb2M7CQkJLyogIGxvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rYWhlYWQJKi8KLQkJCQkvKiAgc3ltYm9sCQkJCSovCi0jZW5kaWYKLQotaW50IHl5bmVycnM7CQkJLyogIG51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyICAgICAgICovCi0jZW5kaWYgIC8qIG5vdCBZWVBVUkUgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotaW50IHl5ZGVidWc7CQkJLyogIG5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UJKi8KLS8qIFNpbmNlIHRoaXMgaXMgdW5pbml0aWFsaXplZCwgaXQgZG9lcyBub3Qgc3RvcCBtdWx0aXBsZSBwYXJzZXJzCi0gICBmcm9tIGNvZXhpc3RpbmcuICAqLwotI2VuZGlmCi0KLS8qICBZWUlOSVRERVBUSCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzCSovCi0KLSNpZm5kZWYJWVlJTklUREVQVEgKLSNkZWZpbmUgWVlJTklUREVQVEggMjAwCi0jZW5kaWYKLQotLyogIFlZTUFYREVQVEggaXMgdGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvCi0gICAgKGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLiAgKi8KLQotI2lmIFlZTUFYREVQVEggPT0gMAotI3VuZGVmIFlZTUFYREVQVEgKLSNlbmRpZgotCi0jaWZuZGVmIFlZTUFYREVQVEgKLSNkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAotI2VuZGlmCi0KLS8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KLSNpZmRlZiBfX0dOVUNfXwotaW50IHl5cGFyc2UgKHZvaWQpOwotI2VuZGlmCi0MCi0jaWYgX19HTlVDX18gPiAxCQkvKiBHTlUgQyBhbmQgR05VIEMrKyBkZWZpbmUgdGhpcy4gICovCi0jZGVmaW5lIF9feXlfbWVtY3B5KFRPLEZST00sQ09VTlQpCV9fYnVpbHRpbl9tZW1jcHkoVE8sRlJPTSxDT1VOVCkKLSNlbHNlCQkJCS8qIG5vdCBHTlUgQyBvciBDKysgKi8KLSNpZm5kZWYgX19jcGx1c3BsdXMKLQotLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKLSAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KLXN0YXRpYyB2b2lkCi1fX3l5X21lbWNweSAodG8sIGZyb20sIGNvdW50KQotICAgICBjaGFyICp0bzsKLSAgICAgY2hhciAqZnJvbTsKLSAgICAgaW50IGNvdW50OwotewotICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKLSAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOwotICByZWdpc3RlciBpbnQgaSA9IGNvdW50OwotCi0gIHdoaWxlIChpLS0gPiAwKQotICAgICp0KysgPSAqZisrOwotfQotCi0jZWxzZSAvKiBfX2NwbHVzcGx1cyAqLwotCi0vKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcwotICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLwotc3RhdGljIHZvaWQKLV9feXlfbWVtY3B5IChjaGFyICp0bywgY2hhciAqZnJvbSwgaW50IGNvdW50KQotewotICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKLSAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOwotICByZWdpc3RlciBpbnQgaSA9IGNvdW50OwotCi0gIHdoaWxlIChpLS0gPiAwKQotICAgICp0KysgPSAqZisrOwotfQotCi0jZW5kaWYKLSNlbmRpZgotDAotI2xpbmUgMTk2ICIvc3RvbmUvamltYi9tYWluLTk4cjIvc2hhcmUvYmlzb24uc2ltcGxlIgotCi0vKiBUaGUgdXNlciBjYW4gZGVmaW5lIFlZUEFSU0VfUEFSQU0gYXMgdGhlIG5hbWUgb2YgYW4gYXJndW1lbnQgdG8gYmUgcGFzc2VkCi0gICBpbnRvIHl5cGFyc2UuICBUaGUgYXJndW1lbnQgc2hvdWxkIGhhdmUgdHlwZSB2b2lkICouCi0gICBJdCBzaG91bGQgYWN0dWFsbHkgcG9pbnQgdG8gYW4gb2JqZWN0LgotICAgR3JhbW1hciBhY3Rpb25zIGNhbiBhY2Nlc3MgdGhlIHZhcmlhYmxlIGJ5IGNhc3RpbmcgaXQKLSAgIHRvIHRoZSBwcm9wZXIgcG9pbnRlciB0eXBlLiAgKi8KLQotI2lmZGVmIFlZUEFSU0VfUEFSQU0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRyB2b2lkICpZWVBBUlNFX1BBUkFNCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAotI2Vsc2UgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIFlZUEFSU0VfUEFSQU0KLSNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMIHZvaWQgKllZUEFSU0VfUEFSQU07Ci0jZW5kaWYgLyogbm90IF9fY3BsdXNwbHVzICovCi0jZWxzZSAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0FSRwotI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wKLSNlbmRpZiAvKiBub3QgWVlQQVJTRV9QQVJBTSAqLwotCi1pbnQKLXl5cGFyc2UoWVlQQVJTRV9QQVJBTV9BUkcpCi0gICAgIFlZUEFSU0VfUEFSQU1fREVDTAotewotICByZWdpc3RlciBpbnQgeXlzdGF0ZTsKLSAgcmVnaXN0ZXIgaW50IHl5bjsKLSAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOwotICByZWdpc3RlciBZWVNUWVBFICp5eXZzcDsKLSAgaW50IHl5ZXJyc3RhdHVzOwkvKiAgbnVtYmVyIG9mIHRva2VucyB0byBzaGlmdCBiZWZvcmUgZXJyb3IgbWVzc2FnZXMgZW5hYmxlZCAqLwotICBpbnQgeXljaGFyMSA9IDA7CQkvKiAgbG9va2FoZWFkIHRva2VuIGFzIGFuIGludGVybmFsICh0cmFuc2xhdGVkKSB0b2tlbiBudW1iZXIgKi8KLQotICBzaG9ydAl5eXNzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgc3RhdGUgc3RhY2sJCQkqLwotICBZWVNUWVBFIHl5dnNhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjawkJKi8KLQotICBzaG9ydCAqeXlzcyA9IHl5c3NhOwkJLyogIHJlZmVyIHRvIHRoZSBzdGFja3MgdGhydSBzZXBhcmF0ZSBwb2ludGVycyAqLwotICBZWVNUWVBFICp5eXZzID0geXl2c2E7CS8qICB0byBhbGxvdyB5eW92ZXJmbG93IHRvIHhyZWFsbG9jYXRlIHRoZW0gZWxzZXdoZXJlICovCi0KLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxzYVtZWUlOSVRERVBUSF07CS8qICB0aGUgbG9jYXRpb24gc3RhY2sJCQkqLwotICBZWUxUWVBFICp5eWxzID0geXlsc2E7Ci0gIFlZTFRZUEUgKnl5bHNwOwotCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSwgeXlsc3AtLSkKLSNlbHNlCi0jZGVmaW5lIFlZUE9QU1RBQ0sgICAoeXl2c3AtLSwgeXlzc3AtLSkKLSNlbmRpZgotCi0gIGludCB5eXN0YWNrc2l6ZSA9IFlZSU5JVERFUFRIOwotCi0jaWZkZWYgWVlQVVJFCi0gIGludCB5eWNoYXI7Ci0gIFlZU1RZUEUgeXlsdmFsOwotICBpbnQgeXluZXJyczsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgWVlMVFlQRSB5eWxsb2M7Ci0jZW5kaWYKLSNlbmRpZgotCi0gIFlZU1RZUEUgeXl2YWw7CQkvKiAgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmV0dXJuCQkqLwotCQkJCS8qICBzZW1hbnRpYyB2YWx1ZXMgZnJvbSB0aGUgYWN0aW9uCSovCi0JCQkJLyogIHJvdXRpbmVzCQkJCSovCi0KLSAgaW50IHl5bGVuOwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpOwotI2VuZGlmCi0KLSAgeXlzdGF0ZSA9IDA7Ci0gIHl5ZXJyc3RhdHVzID0gMDsKLSAgeXluZXJycyA9IDA7Ci0gIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLwotCi0gIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCi0gICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjawotICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCi0gICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KLQotICB5eXNzcCA9IHl5c3MgLSAxOwotICB5eXZzcCA9IHl5dnM7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gIHl5bHNwID0geXlsczsKLSNlbmRpZgotCi0vKiBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiAgeXlzdGF0ZSAgLiAgKi8KLS8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCi0gICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuICAqLwoteXluZXdzdGF0ZToKLQotICAqKyt5eXNzcCA9IHl5c3RhdGU7Ci0KLSAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCi0gICAgewotICAgICAgLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHhyZWFsbG9jYXRlIHRoZSBzdGFjayAqLwotICAgICAgLyogVXNlIGNvcGllcyBvZiB0aGVzZSBzbyB0aGF0IHRoZSAmJ3MgZG9uJ3QgZm9yY2UgdGhlIHJlYWwgb25lcyBpbnRvIG1lbW9yeS4gKi8KLSAgICAgIFlZU1RZUEUgKnl5dnMxID0geXl2czsKLSAgICAgIHNob3J0ICp5eXNzMSA9IHl5c3M7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICBZWUxUWVBFICp5eWxzMSA9IHl5bHM7Ci0jZW5kaWYKLQotICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHVzZWQgc2l6ZSBvZiB0aGUgdGhyZWUgc3RhY2tzLCBpbiBlbGVtZW50cy4gICovCi0gICAgICBpbnQgc2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7Ci0KLSNpZmRlZiB5eW92ZXJmbG93Ci0gICAgICAvKiBFYWNoIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyBpcyBmb2xsb3dlZCBieSB0aGUgc2l6ZSBvZgotCSB0aGUgZGF0YSBpbiB1c2UgaW4gdGhhdCBzdGFjaywgaW4gYnl0ZXMuICAqLwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgLyogVGhpcyB1c2VkIHRvIGJlIGEgY29uZGl0aW9uYWwgYXJvdW5kIGp1c3QgdGhlIHR3byBleHRyYSBhcmdzLAotCSBidXQgdGhhdCBtaWdodCBiZSB1bmRlZmluZWQgaWYgeXlvdmVyZmxvdyBpcyBhIG1hY3JvLiAgKi8KLSAgICAgIHl5b3ZlcmZsb3coInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCi0JCSAmeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAmeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAmeXlsczEsIHNpemUgKiBzaXplb2YgKCp5eWxzcCksCi0JCSAmeXlzdGFja3NpemUpOwotI2Vsc2UKLSAgICAgIHl5b3ZlcmZsb3coInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCi0JCSAmeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCksCi0JCSAmeXl2czEsIHNpemUgKiBzaXplb2YgKCp5eXZzcCksCi0JCSAmeXlzdGFja3NpemUpOwotI2VuZGlmCi0KLSAgICAgIHl5c3MgPSB5eXNzMTsgeXl2cyA9IHl5dnMxOwotI2lmZGVmIFlZTFNQX05FRURFRAotICAgICAgeXlscyA9IHl5bHMxOwotI2VuZGlmCi0jZWxzZSAvKiBubyB5eW92ZXJmbG93ICovCi0gICAgICAvKiBFeHRlbmQgdGhlIHN0YWNrIG91ciBvd24gd2F5LiAgKi8KLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+PSBZWU1BWERFUFRIKQotCXsKLQkgIHl5ZXJyb3IoInBhcnNlciBzdGFjayBvdmVyZmxvdyIpOwotCSAgcmV0dXJuIDI7Ci0JfQotICAgICAgeXlzdGFja3NpemUgKj0gMjsKLSAgICAgIGlmICh5eXN0YWNrc2l6ZSA+IFlZTUFYREVQVEgpCi0JeXlzdGFja3NpemUgPSBZWU1BWERFUFRIOwotICAgICAgeXlzcyA9IChzaG9ydCAqKSBhbGxvY2EgKHl5c3RhY2tzaXplICogc2l6ZW9mICgqeXlzc3ApKTsKLSAgICAgIF9feXlfbWVtY3B5ICgoY2hhciAqKXl5c3MsIChjaGFyICopeXlzczEsIHNpemUgKiBzaXplb2YgKCp5eXNzcCkpOwotICAgICAgeXl2cyA9IChZWVNUWVBFICopIGFsbG9jYSAoeXlzdGFja3NpemUgKiBzaXplb2YgKCp5eXZzcCkpOwotICAgICAgX195eV9tZW1jcHkgKChjaGFyICopeXl2cywgKGNoYXIgKil5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7Ci0jaWZkZWYgWVlMU1BfTkVFREVECi0gICAgICB5eWxzID0gKFlZTFRZUEUgKikgYWxsb2NhICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7Ci0gICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eWxzLCAoY2hhciAqKXl5bHMxLCBzaXplICogc2l6ZW9mICgqeXlsc3ApKTsKLSNlbmRpZgotI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KLQotICAgICAgeXlzc3AgPSB5eXNzICsgc2l6ZSAtIDE7Ci0gICAgICB5eXZzcCA9IHl5dnMgKyBzaXplIC0gMTsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgICAgIHl5bHNwID0geXlscyArIHNpemUgLSAxOwotI2VuZGlmCi0KLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWRcbiIsIHl5c3RhY2tzaXplKTsKLSNlbmRpZgotCi0gICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKLQlZWUFCT1JUOwotICAgIH0KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKTsKLSNlbmRpZgotCi0gIGdvdG8geXliYWNrdXA7Ci0geXliYWNrdXA6Ci0KLS8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLwotLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0vKiB5eXJlc3VtZTogKi8KLQotICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KLQotICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0gIGlmICh5eW4gPT0gWVlGTEFHKQotICAgIGdvdG8geXlkZWZhdWx0OwotCi0gIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCi0KLSAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCi0gICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCi0KLSAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQotICAgIHsKLSNpZiBZWURFQlVHICE9IDAKLSAgICAgIGlmICh5eWRlYnVnKQotCWZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKTsKLSNlbmRpZgotICAgICAgeXljaGFyID0gWVlMRVg7Ci0gICAgfQotCi0gIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCi0KLSAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCi0gICAgewotICAgICAgeXljaGFyMSA9IDA7Ci0gICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIik7Ci0jZW5kaWYKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUoeXljaGFyKTsKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UgbWVhbmluZwotCSAgICAgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLwotI2lmZGVmIFlZUFJJTlQKLQkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOwotI2VuZGlmCi0JICBmcHJpbnRmIChzdGRlcnIsICIpXG4iKTsKLQl9Ci0jZW5kaWYKLSAgICB9Ci0KLSAgeXluICs9IHl5Y2hhcjE7Ci0gIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKLSAgICBnb3RvIHl5ZGVmYXVsdDsKLQotICB5eW4gPSB5eXRhYmxlW3l5bl07Ci0KLSAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgotICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCi0gICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgotICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCi0gICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KLSAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLwotCi0gIGlmICh5eW4gPCAwKQotICAgIHsKLSAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQotCWdvdG8geXllcnJsYWI7Ci0gICAgICB5eW4gPSAteXluOwotICAgICAgZ290byB5eXJlZHVjZTsKLSAgICB9Ci0gIGVsc2UgaWYgKHl5biA9PSAwKQotICAgIGdvdG8geXllcnJsYWI7Ci0KLSAgaWYgKHl5biA9PSBZWUZJTkFMKQotICAgIFlZQUNDRVBUOwotCi0gIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLwotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKLSNlbmRpZgotCi0gIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCi0gIGlmICh5eWNoYXIgIT0gWVlFT0YpCi0gICAgeXljaGFyID0gWVlFTVBUWTsKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgKisreXlsc3AgPSB5eWxsb2M7Ci0jZW5kaWYKLQotICAvKiBjb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yIHN0YXR1cy4gICovCi0gIGlmICh5eWVycnN0YXR1cykgeXllcnJzdGF0dXMtLTsKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLS8qIERvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICAqLwoteXlkZWZhdWx0OgotCi0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOwotICBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycmxhYjsKLQotLyogRG8gYSByZWR1Y3Rpb24uICB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLwoteXlyZWR1Y2U6Ci0gIHl5bGVuID0geXlyMlt5eW5dOwotICBpZiAoeXlsZW4gPiAwKQotICAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07IC8qIGltcGxlbWVudCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb24gKi8KLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAotCSAgICAgICB5eW4sIHl5cmxpbmVbeXluXSk7Ci0KLSAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLwotICAgICAgZm9yIChpID0geXlwcmhzW3l5bl07IHl5cmhzW2ldID4gMDsgaSsrKQotCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbaV1dKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKLSAgICB9Ci0jZW5kaWYKLQotCi0gIHN3aXRjaCAoeXluKSB7Ci0KLWNhc2UgMzoKLSNsaW5lIDIwOSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKE9QX1RZUEUpOwotCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSh5eXZzcFswXS50dmFsKTsKLQkJICB3cml0ZV9leHBfZWx0X29wY29kZShPUF9UWVBFKTsKLQkJOwotICAgIGJyZWFrO30KLWNhc2UgNDoKLSNsaW5lIDIxOCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0lORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU6Ci0jbGluZSAyMjEgIm0yLWV4cC55IgoteyBudW1iZXJfc2lnbiA9IC0xOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2OgotI2xpbmUgMjIzICJtMi1leHAueSIKLXsgbnVtYmVyX3NpZ24gPSAxOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9ORUcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3OgotI2xpbmUgMjI4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoVU5PUF9QTFVTKTsgOwotICAgIGJyZWFrO30KLWNhc2UgODoKLSNsaW5lIDIzMiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0xPR0lDQUxfTk9UKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTE6Ci0jbGluZSAyNDAgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVApOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAxMjoKLSNsaW5lIDI0NCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX09SRCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDEzOgotI2xpbmUgMjQ4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfQUJTKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTQ6Ci0jbGluZSAyNTIgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9ISUdIKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTU6Ci0jbGluZSAyNTYgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NSU4pOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWy0xXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUlOKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTY6Ci0jbGluZSAyNjIgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NQVgpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWy0xXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUlOKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTc6Ci0jbGluZSAyNjggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9GTE9BVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDE4OgotI2xpbmUgMjcyICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1ZBTCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoeXl2c3BbLTNdLnR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfVkFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMTk6Ci0jbGluZSAyNzggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DSFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMDoKLSNsaW5lIDI4MiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX09ERCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIxOgotI2xpbmUgMjg2ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfVFJVTkMpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyMjoKLSNsaW5lIDI5MCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX1NJWkVPRik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDIzOgotI2xpbmUgMjk1ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUoVU5PUF9QUkVJTkNSRU1FTlQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAyNDoKLSNsaW5lIDI5OSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlKEJJTk9QX0FTU0lHTl9NT0RJRlkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9BREQpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9BU1NJR05fTU9ESUZZKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjU6Ci0jbGluZSAzMDUgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShVTk9QX1BSRURFQ1JFTUVOVCk7OwotICAgIGJyZWFrO30KLWNhc2UgMjY6Ci0jbGluZSAzMDkgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShCSU5PUF9BU1NJR05fTU9ESUZZKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoQklOT1BfU1VCKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUoQklOT1BfQVNTSUdOX01PRElGWSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDI3OgotI2xpbmUgMzE1ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFNUUlVDVE9QX1NUUlVDVCk7Ci0JCQkgIHdyaXRlX2V4cF9zdHJpbmcgKHl5dnNwWzBdLnN2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoU1RSVUNUT1BfU1RSVUNUKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMjk6Ci0jbGluZSAzMjQgIm0yLWV4cC55IgoteyBlcnJvcigiU2V0cyBhcmUgbm90IGltcGxlbWVudGVkLiIpOzsKLSAgICBicmVhazt9Ci1jYXNlIDMwOgotI2xpbmUgMzI4ICJtMi1leHAueSIKLXsgZXJyb3IoIlNldHMgYXJlIG5vdCBpbXBsZW1lbnRlZC4iKTs7Ci0gICAgYnJlYWs7fQotY2FzZSAzMToKLSNsaW5lIDMzMiAibTItZXhwLnkiCi17IGVycm9yKCJTZXRzIGFyZSBub3QgaW1wbGVtZW50ZWQuIik7OwotICAgIGJyZWFrO30KLWNhc2UgMzI6Ci0jbGluZSAzMzUgIm0yLWV4cC55IgoteyBlcnJvcigiU2V0cyBhcmUgbm90IGltcGxlbWVudGVkLiIpOzsKLSAgICBicmVhazt9Ci1jYXNlIDMzOgotI2xpbmUgMzM3ICJtMi1leHAueSIKLXsgZXJyb3IoIlNldHMgYXJlIG5vdCBpbXBsZW1lbnRlZC4iKTs7Ci0gICAgYnJlYWs7fQotY2FzZSAzNDoKLSNsaW5lIDM0NiAibTItZXhwLnkiCi17IHN0YXJ0X2FyZ2xpc3QoKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzU6Ci0jbGluZSAzNDggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoTVVMVElfU1VCU0NSSVBUKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgZW5kX2FyZ2xpc3QoKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChNVUxUSV9TVUJTQ1JJUFQpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSAzNjoKLSNsaW5lIDM1NiAibTItZXhwLnkiCi17IHN0YXJ0X2FyZ2xpc3QgKCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDM3OgotI2xpbmUgMzU4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0ZVTkNBTEwpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSBlbmRfYXJnbGlzdCAoKSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9GVU5DQUxMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgMzk6Ci0jbGluZSAzNjcgIm0yLWV4cC55IgoteyBhcmdsaXN0X2xlbiA9IDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQwOgotI2xpbmUgMzcxICJtMi1leHAueSIKLXsgYXJnbGlzdF9sZW4rKzsgOwotICAgIGJyZWFrO30KLWNhc2UgNDE6Ci0jbGluZSAzNzYgIm0yLWV4cC55IgoteyBhcmdsaXN0X2xlbiA9IDE7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQyOgotI2xpbmUgMzgxICJtMi1leHAueSIKLXsgYXJnbGlzdF9sZW4rKzsgOwotICAgIGJyZWFrO30KLWNhc2UgNDM6Ci0jbGluZSAzODYgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9NRU1WQUwpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKHl5dnNwWy0yXS50dmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKFVOT1BfTUVNVkFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNDQ6Ci0jbGluZSAzOTIgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoVU5PUF9DQVNUKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlICh5eXZzcFstM10udHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChVTk9QX0NBU1QpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA0NToKLSNsaW5lIDM5OCAibTItZXhwLnkiCi17IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ2OgotI2xpbmUgNDA2ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFUEVBVCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ3OgotI2xpbmUgNDEwICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX01VTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ4OgotI2xpbmUgNDE0ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0RJVik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDQ5OgotI2xpbmUgNDE4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0lOVERJVik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUwOgotI2xpbmUgNDIyICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1JFTSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUxOgotI2xpbmUgNDI2ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0FERCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUyOgotI2xpbmUgNDMwICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX1NVQik7IDsKLSAgICBicmVhazt9Ci1jYXNlIDUzOgotI2xpbmUgNDM0ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0VRVUFMKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNTQ6Ci0jbGluZSA0MzggIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoQklOT1BfTk9URVFVQUwpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1NToKLSNsaW5lIDQ0MCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9OT1RFUVVBTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU2OgotI2xpbmUgNDQ0ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFUSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU3OgotI2xpbmUgNDQ4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0dFUSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDU4OgotI2xpbmUgNDUyICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xFU1MpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA1OToKLSNsaW5lIDQ1NiAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9HVFIpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MDoKLSNsaW5lIDQ2MCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9MT0dJQ0FMX0FORCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDYxOgotI2xpbmUgNDY0ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKEJJTk9QX0xPR0lDQUxfT1IpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MjoKLSNsaW5lIDQ2OCAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChCSU5PUF9BU1NJR04pOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2MzoKLSNsaW5lIDQ3NSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9CT09MKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgeXl2c3BbMF0udWx2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfQk9PTCk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY0OgotI2xpbmUgNDgxICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0JPT0wpOwotCQkJICB3cml0ZV9leHBfZWx0X2xvbmdjc3QgKChMT05HRVNUKSB5eXZzcFswXS51bHZhbCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9CT09MKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNjU6Ci0jbGluZSA0ODcgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX20yX2ludCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIHl5dnNwWzBdLmx2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDY2OgotI2xpbmUgNDk0ICJtMi1leHAueSIKLXsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9tMl9jYXJkKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9sb25nY3N0ICgoTE9OR0VTVCkgeXl2c3BbMF0udWx2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQk7Ci0gICAgYnJlYWs7fQotY2FzZSA2NzoKLSNsaW5lIDUwMyAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9MT05HKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF90eXBlIChidWlsdGluX3R5cGVfbTJfY2hhcik7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIHl5dnNwWzBdLnVsdmFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX0xPTkcpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA2ODoKLSNsaW5lIDUxMSAibTItZXhwLnkiCi17IHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9ET1VCTEUpOwotCQkJICB3cml0ZV9leHBfZWx0X3R5cGUgKGJ1aWx0aW5fdHlwZV9tMl9yZWFsKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9kYmxjc3QgKHl5dnNwWzBdLmR2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfRE9VQkxFKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzA6Ci0jbGluZSA1MjEgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfdHlwZSAoYnVpbHRpbl90eXBlX2ludCk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfbG9uZ2NzdCAoKExPTkdFU1QpIFRZUEVfTEVOR1RIICh5eXZzcFstMV0udHZhbCkpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTE9ORyk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDcxOgotI2xpbmUgNTI4ICJtMi1leHAueSIKLXsgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX00yX1NUUklORyk7Ci0JCQkgIHdyaXRlX2V4cF9zdHJpbmcgKHl5dnNwWzBdLnN2YWwpOwotCQkJICB3cml0ZV9leHBfZWx0X29wY29kZSAoT1BfTTJfU1RSSU5HKTsgOwotICAgIGJyZWFrO30KLWNhc2UgNzI6Ci0jbGluZSA1MzUgIm0yLWV4cC55IgoteyB5eXZhbC5idmFsID0gU1lNQk9MX0JMT0NLX1ZBTFVFKHl5dnNwWzBdLnN5bSk7IDsKLSAgICBicmVhazt9Ci1jYXNlIDczOgotI2xpbmUgNTM5ICJtMi1leHAueSIKLXsgc3RydWN0IHN5bWJvbCAqc3ltCi0JCQkgICAgPSBsb29rdXBfc3ltYm9sIChjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpLCBleHByZXNzaW9uX2NvbnRleHRfYmxvY2ssCi0JCQkJCSAgICAgVkFSX05BTUVTUEFDRSwgMCwgTlVMTCk7Ci0JCQkgIHl5dmFsLnN5bSA9IHN5bTs7Ci0gICAgYnJlYWs7fQotY2FzZSA3NDoKLSNsaW5lIDU0OCAibTItZXhwLnkiCi17IHN0cnVjdCBzeW1ib2wgKnRlbQotCQkJICAgID0gbG9va3VwX3N5bWJvbCAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwgeXl2c3BbLTJdLmJ2YWwsCi0JCQkJCSAgICAgVkFSX05BTUVTUEFDRSwgMCwgTlVMTCk7Ci0JCQkgIGlmICghdGVtIHx8IFNZTUJPTF9DTEFTUyAodGVtKSAhPSBMT0NfQkxPQ0spCi0JCQkgICAgZXJyb3IgKCJObyBmdW5jdGlvbiBcIiVzXCIgaW4gc3BlY2lmaWVkIGNvbnRleHQuIiwKLQkJCQkgICBjb3B5X25hbWUgKHl5dnNwWzBdLnN2YWwpKTsKLQkJCSAgeXl2YWwuc3ltID0gdGVtOwotCQkJOwotICAgIGJyZWFrO30KLWNhc2UgNzU6Ci0jbGluZSA1NjAgIm0yLWV4cC55IgoteyB3cml0ZV9leHBfZWx0X29wY29kZShPUF9WQVJfVkFMVUUpOwotCQkJICB3cml0ZV9leHBfZWx0X2Jsb2NrIChOVUxMKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9zeW0gKHl5dnNwWzBdLnN5bSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3NzoKLSNsaW5lIDU3MiAibTItZXhwLnkiCi17IHN0cnVjdCBzeW1ib2wgKnN5bTsKLQkJCSAgc3ltID0gbG9va3VwX3N5bWJvbCAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwgeXl2c3BbLTJdLmJ2YWwsCi0JCQkJCSAgICAgICBWQVJfTkFNRVNQQUNFLCAwLCBOVUxMKTsKLQkJCSAgaWYgKHN5bSA9PSAwKQotCQkJICAgIGVycm9yICgiTm8gc3ltYm9sIFwiJXNcIiBpbiBzcGVjaWZpZWQgY29udGV4dC4iLAotCQkJCSAgIGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCkpOwotCi0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOwotCQkJICAvKiBibG9ja19mb3VuZCBpcyBzZXQgYnkgbG9va3VwX3N5bWJvbC4gICovCi0JCQkgIHdyaXRlX2V4cF9lbHRfYmxvY2sgKGJsb2NrX2ZvdW5kKTsKLQkJCSAgd3JpdGVfZXhwX2VsdF9zeW0gKHN5bSk7Ci0JCQkgIHdyaXRlX2V4cF9lbHRfb3Bjb2RlIChPUF9WQVJfVkFMVUUpOyA7Ci0gICAgYnJlYWs7fQotY2FzZSA3ODoKLSNsaW5lIDU4OCAibTItZXhwLnkiCi17IHN0cnVjdCBzeW1ib2wgKnN5bTsKLQkJCSAgaW50IGlzX2FfZmllbGRfb2ZfdGhpczsKLQotIAkJCSAgc3ltID0gbG9va3VwX3N5bWJvbCAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwKLQkJCQkJICAgICAgIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywKLQkJCQkJICAgICAgIFZBUl9OQU1FU1BBQ0UsCi0JCQkJCSAgICAgICAmaXNfYV9maWVsZF9vZl90aGlzLAotCQkJCQkgICAgICAgTlVMTCk7Ci0JCQkgIGlmIChzeW0pCi0JCQkgICAgewotCQkJICAgICAgaWYgKHN5bWJvbF9yZWFkX25lZWRzX2ZyYW1lIChzeW0pKQotCQkJCXsKLQkJCQkgIGlmIChpbm5lcm1vc3RfYmxvY2sgPT0gMCB8fAotCQkJCSAgICAgIGNvbnRhaW5lZF9pbiAoYmxvY2tfZm91bmQsIAotCQkJCQkJICAgIGlubmVybW9zdF9ibG9jaykpCi0JCQkJICAgIGlubmVybW9zdF9ibG9jayA9IGJsb2NrX2ZvdW5kOwotCQkJCX0KLQotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgICAgICAvKiBXZSB3YW50IHRvIHVzZSB0aGUgc2VsZWN0ZWQgZnJhbWUsIG5vdAotCQkJCSBhbm90aGVyIG1vcmUgaW5uZXIgZnJhbWUgd2hpY2ggaGFwcGVucyB0bwotCQkJCSBiZSBpbiB0aGUgc2FtZSBibG9jay4gICovCi0JCQkgICAgICB3cml0ZV9leHBfZWx0X2Jsb2NrIChOVUxMKTsKLQkJCSAgICAgIHdyaXRlX2V4cF9lbHRfc3ltIChzeW0pOwotCQkJICAgICAgd3JpdGVfZXhwX2VsdF9vcGNvZGUgKE9QX1ZBUl9WQUxVRSk7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgc3RydWN0IG1pbmltYWxfc3ltYm9sICptc3ltYm9sOwotCQkJICAgICAgcmVnaXN0ZXIgY2hhciAqYXJnID0gY29weV9uYW1lICh5eXZzcFswXS5zdmFsKTsKLQotCQkJICAgICAgbXN5bWJvbCA9Ci0JCQkJbG9va3VwX21pbmltYWxfc3ltYm9sIChhcmcsIE5VTEwsIE5VTEwpOwotCQkJICAgICAgaWYgKG1zeW1ib2wgIT0gTlVMTCkKLQkJCQl7Ci0JCQkJICB3cml0ZV9leHBfbXN5bWJvbAotCQkJCSAgICAobXN5bWJvbCwKLQkJCQkgICAgIGxvb2t1cF9mdW5jdGlvbl90eXBlIChidWlsdGluX3R5cGVfaW50KSwKLQkJCQkgICAgIGJ1aWx0aW5fdHlwZV9pbnQpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UgaWYgKCFoYXZlX2Z1bGxfc3ltYm9scyAoKSAmJiAhaGF2ZV9wYXJ0aWFsX3N5bWJvbHMgKCkpCi0JCQkJZXJyb3IgKCJObyBzeW1ib2wgdGFibGUgaXMgbG9hZGVkLiAgVXNlIHRoZSBcInN5bWJvbC1maWxlXCIgY29tbWFuZC4iKTsKLQkJCSAgICAgIGVsc2UKLQkJCQllcnJvciAoIk5vIHN5bWJvbCBcIiVzXCIgaW4gY3VycmVudCBjb250ZXh0LiIsCi0JCQkJICAgICAgIGNvcHlfbmFtZSAoeXl2c3BbMF0uc3ZhbCkpOwotCQkJICAgIH0KLQkJCTsKLSAgICBicmVhazt9Ci1jYXNlIDc5OgotI2xpbmUgNjM5ICJtMi1leHAueSIKLXsgeXl2YWwudHZhbCA9IGxvb2t1cF90eXBlbmFtZSAoY29weV9uYW1lICh5eXZzcFswXS5zdmFsKSwKLQkJCQkJCWV4cHJlc3Npb25fY29udGV4dF9ibG9jaywgMCk7IDsKLSAgICBicmVhazt9Ci19Ci0gICAvKiB0aGUgYWN0aW9uIGZpbGUgZ2V0cyBjb3BpZWQgaW4gaW4gcGxhY2Ugb2YgdGhpcyBkb2xsYXJzaWduICovCi0jbGluZSA0OTggIi9zdG9uZS9qaW1iL21haW4tOThyMi9zaGFyZS9iaXNvbi5zaW1wbGUiCi0MCi0gIHl5dnNwIC09IHl5bGVuOwotICB5eXNzcCAtPSB5eWxlbjsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AgLT0geXlsZW47Ci0jZW5kaWYKLQotI2lmIFlZREVCVUcgIT0gMAotICBpZiAoeXlkZWJ1ZykKLSAgICB7Ci0gICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAic3RhdGUgc3RhY2sgbm93Iik7Ci0gICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKLQlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLSAgKisreXl2c3AgPSB5eXZhbDsKLQotI2lmZGVmIFlZTFNQX05FRURFRAotICB5eWxzcCsrOwotICBpZiAoeXlsZW4gPT0gMCkKLSAgICB7Ci0gICAgICB5eWxzcC0+Zmlyc3RfbGluZSA9IHl5bGxvYy5maXJzdF9saW5lOwotICAgICAgeXlsc3AtPmZpcnN0X2NvbHVtbiA9IHl5bGxvYy5maXJzdF9jb2x1bW47Ci0gICAgICB5eWxzcC0+bGFzdF9saW5lID0gKHl5bHNwLTEpLT5sYXN0X2xpbmU7Ci0gICAgICB5eWxzcC0+bGFzdF9jb2x1bW4gPSAoeXlsc3AtMSktPmxhc3RfY29sdW1uOwotICAgICAgeXlsc3AtPnRleHQgPSAwOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AreXlsZW4tMSktPmxhc3RfbGluZTsKLSAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9jb2x1bW47Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogTm93ICJzaGlmdCIgdGhlIHJlc3VsdCBvZiB0aGUgcmVkdWN0aW9uLgotICAgICBEZXRlcm1pbmUgd2hhdCBzdGF0ZSB0aGF0IGdvZXMgdG8sCi0gICAgIGJhc2VkIG9uIHRoZSBzdGF0ZSB3ZSBwb3BwZWQgYmFjayB0bwotICAgICBhbmQgdGhlIHJ1bGUgbnVtYmVyIHJlZHVjZWQgYnkuICAqLwotCi0gIHl5biA9IHl5cjFbeXluXTsKLQotICB5eXN0YXRlID0geXlwZ290b1t5eW4gLSBZWU5UQkFTRV0gKyAqeXlzc3A7Ci0gIGlmICh5eXN0YXRlID49IDAgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCi0gICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07Ci0gIGVsc2UKLSAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRCQVNFXTsKLQotICBnb3RvIHl5bmV3c3RhdGU7Ci0KLXl5ZXJybGFiOiAgIC8qIGhlcmUgb24gZGV0ZWN0aW5nIGVycm9yICovCi0KLSAgaWYgKCEgeXllcnJzdGF0dXMpCi0gICAgLyogSWYgbm90IGFscmVhZHkgcmVjb3ZlcmluZyBmcm9tIGFuIGVycm9yLCByZXBvcnQgdGhpcyBlcnJvci4gICovCi0gICAgewotICAgICAgKyt5eW5lcnJzOwotCi0jaWZkZWYgWVlFUlJPUl9WRVJCT1NFCi0gICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07Ci0KLSAgICAgIGlmICh5eW4gPiBZWUZMQUcgJiYgeXluIDwgWVlMQVNUKQotCXsKLQkgIGludCBzaXplID0gMDsKLQkgIGNoYXIgKm1zZzsKLQkgIGludCB4LCBjb3VudDsKLQotCSAgY291bnQgPSAwOwotCSAgLyogU3RhcnQgWCBhdCAteXluIGlmIG5lYyB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluIHl5Y2hlY2suICAqLwotCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7Ci0JICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCi0JICAgIGlmICh5eWNoZWNrW3ggKyB5eW5dID09IHgpCi0JICAgICAgc2l6ZSArPSBzdHJsZW4oeXl0bmFtZVt4XSkgKyAxNSwgY291bnQrKzsKLQkgIG1zZyA9IChjaGFyICopIHhtYWxsb2Moc2l6ZSArIDE1KTsKLQkgIGlmIChtc2cgIT0gMCkKLQkgICAgewotCSAgICAgIHN0cmNweShtc2csICJwYXJzZSBlcnJvciIpOwotCi0JICAgICAgaWYgKGNvdW50IDwgNSkKLQkJewotCQkgIGNvdW50ID0gMDsKLQkJICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKLQkJICAgICAgIHggPCAoc2l6ZW9mKHl5dG5hbWUpIC8gc2l6ZW9mKGNoYXIgKikpOyB4KyspCi0JCSAgICBpZiAoeXljaGVja1t4ICsgeXluXSA9PSB4KQotCQkgICAgICB7Ci0JCQlzdHJjYXQobXNnLCBjb3VudCA9PSAwID8gIiwgZXhwZWN0aW5nIGAiIDogIiBvciBgIik7Ci0JCQlzdHJjYXQobXNnLCB5eXRuYW1lW3hdKTsKLQkJCXN0cmNhdChtc2csICInIik7Ci0JCQljb3VudCsrOwotCQkgICAgICB9Ci0JCX0KLQkgICAgICB5eWVycm9yKG1zZyk7Ci0JICAgICAgZnJlZShtc2cpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHl5ZXJyb3IgKCJwYXJzZSBlcnJvcjsgYWxzbyB2aXJ0dWFsIG1lbW9yeSBleGNlZWRlZCIpOwotCX0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBZWUVSUk9SX1ZFUkJPU0UgKi8KLQl5eWVycm9yKCJwYXJzZSBlcnJvciIpOwotICAgIH0KLQotICBnb3RvIHl5ZXJybGFiMTsKLXl5ZXJybGFiMTogICAvKiBoZXJlIG9uIGVycm9yIHJhaXNlZCBleHBsaWNpdGx5IGJ5IGFuIGFjdGlvbiAqLwotCi0gIGlmICh5eWVycnN0YXR1cyA9PSAzKQotICAgIHsKLSAgICAgIC8qIGlmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4gZXJyb3IsIGRpc2NhcmQgaXQuICAqLwotCi0gICAgICAvKiByZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQgKi8KLSAgICAgIGlmICh5eWNoYXIgPT0gWVlFT0YpCi0JWVlBQk9SVDsKLQotI2lmIFlZREVCVUcgIT0gMAotICAgICAgaWYgKHl5ZGVidWcpCi0JZnByaW50ZihzdGRlcnIsICJEaXNjYXJkaW5nIHRva2VuICVkICglcykuXG4iLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOwotI2VuZGlmCi0KLSAgICAgIHl5Y2hhciA9IFlZRU1QVFk7Ci0gICAgfQotCi0gIC8qIEVsc2Ugd2lsbCB0cnkgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuCi0gICAgIGFmdGVyIHNoaWZ0aW5nIHRoZSBlcnJvciB0b2tlbi4gICovCi0KLSAgeXllcnJzdGF0dXMgPSAzOwkJLyogRWFjaCByZWFsIHRva2VuIHNoaWZ0ZWQgZGVjcmVtZW50cyB0aGlzICovCi0KLSAgZ290byB5eWVycmhhbmRsZTsKLQoteXllcnJkZWZhdWx0OiAgLyogY3VycmVudCBzdGF0ZSBkb2VzIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGUgZXJyb3IgdG9rZW4uICovCi0KLSNpZiAwCi0gIC8qIFRoaXMgaXMgd3Jvbmc7IG9ubHkgc3RhdGVzIHRoYXQgZXhwbGljaXRseSB3YW50IGVycm9yIHRva2VucwotICAgICBzaG91bGQgc2hpZnQgdGhlbS4gICovCi0gIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOyAgLyogSWYgaXRzIGRlZmF1bHQgaXMgdG8gYWNjZXB0IGFueSB0b2tlbiwgb2suICBPdGhlcndpc2UgcG9wIGl0LiovCi0gIGlmICh5eW4pIGdvdG8geXlkZWZhdWx0OwotI2VuZGlmCi0KLXl5ZXJycG9wOiAgIC8qIHBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuICovCi0KLSAgaWYgKHl5c3NwID09IHl5c3MpIFlZQUJPUlQ7Ci0gIHl5dnNwLS07Ci0gIHl5c3RhdGUgPSAqLS15eXNzcDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgeXlsc3AtLTsKLSNlbmRpZgotCi0jaWYgWVlERUJVRyAhPSAwCi0gIGlmICh5eWRlYnVnKQotICAgIHsKLSAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvcjogc3RhdGUgc3RhY2sgbm93Iik7Ci0gICAgICB3aGlsZSAoc3NwMSAhPSB5eXNzcCkKLQlmcHJpbnRmIChzdGRlcnIsICIgJWQiLCAqKytzc3AxKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7Ci0gICAgfQotI2VuZGlmCi0KLXl5ZXJyaGFuZGxlOgotCi0gIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKLSAgaWYgKHl5biA9PSBZWUZMQUcpCi0gICAgZ290byB5eWVycmRlZmF1bHQ7Ci0KLSAgeXluICs9IFlZVEVSUk9SOwotICBpZiAoeXluIDwgMCB8fCB5eW4gPiBZWUxBU1QgfHwgeXljaGVja1t5eW5dICE9IFlZVEVSUk9SKQotICAgIGdvdG8geXllcnJkZWZhdWx0OwotCi0gIHl5biA9IHl5dGFibGVbeXluXTsKLSAgaWYgKHl5biA8IDApCi0gICAgewotICAgICAgaWYgKHl5biA9PSBZWUZMQUcpCi0JZ290byB5eWVycnBvcDsKLSAgICAgIHl5biA9IC15eW47Ci0gICAgICBnb3RvIHl5cmVkdWNlOwotICAgIH0KLSAgZWxzZSBpZiAoeXluID09IDApCi0gICAgZ290byB5eWVycnBvcDsKLQotICBpZiAoeXluID09IFlZRklOQUwpCi0gICAgWVlBQ0NFUFQ7Ci0KLSNpZiBZWURFQlVHICE9IDAKLSAgaWYgKHl5ZGVidWcpCi0gICAgZnByaW50ZihzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIik7Ci0jZW5kaWYKLQotICAqKyt5eXZzcCA9IHl5bHZhbDsKLSNpZmRlZiBZWUxTUF9ORUVERUQKLSAgKisreXlsc3AgPSB5eWxsb2M7Ci0jZW5kaWYKLQotICB5eXN0YXRlID0geXluOwotICBnb3RvIHl5bmV3c3RhdGU7Ci19Ci0jbGluZSA2NDQgIm0yLWV4cC55IgotCi0KLSNpZiAwICAvKiBGSVhNRSEgKi8KLWludAotb3ZlcmZsb3coYSxiKQotICAgbG9uZyBhLGI7Ci17Ci0gICByZXR1cm4gKE1BWF9PRl9UWVBFKGJ1aWx0aW5fdHlwZV9tMl9pbnQpIC0gYikgPCBhOwotfQotCi1pbnQKLXVvdmVyZmxvdyhhLGIpCi0gICB1bnNpZ25lZCBsb25nIGEsYjsKLXsKLSAgIHJldHVybiAoTUFYX09GX1RZUEUoYnVpbHRpbl90eXBlX20yX2NhcmQpIC0gYikgPCBhOwotfQotI2VuZGlmIC8qIEZJWE1FICovCi0KLS8qIFRha2UgY2FyZSBvZiBwYXJzaW5nIGEgbnVtYmVyIChhbnl0aGluZyB0aGF0IHN0YXJ0cyB3aXRoIGEgZGlnaXQpLgotICAgU2V0IHl5bHZhbCBhbmQgcmV0dXJuIHRoZSB0b2tlbiB0eXBlOyB1cGRhdGUgbGV4cHRyLgotICAgTEVOIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBpdC4gICovCi0KLS8qKiogTmVlZHMgc29tZSBlcnJvciBjaGVja2luZyBmb3IgdGhlIGZsb2F0IGNhc2UgKioqLwotCi1zdGF0aWMgaW50Ci1wYXJzZV9udW1iZXIgKG9sZW4pCi0gICAgIGludCBvbGVuOwotewotICByZWdpc3RlciBjaGFyICpwID0gbGV4cHRyOwotICByZWdpc3RlciBMT05HRVNUIG4gPSAwOwotICByZWdpc3RlciBMT05HRVNUIHByZXZuID0gMDsKLSAgcmVnaXN0ZXIgaW50IGMsaSxpc2NoYXI9MDsKLSAgcmVnaXN0ZXIgaW50IGJhc2UgPSBpbnB1dF9yYWRpeDsKLSAgcmVnaXN0ZXIgaW50IGxlbiA9IG9sZW47Ci0gIGludCB1bnNpZ25lZF9wID0gbnVtYmVyX3NpZ24gPT0gMSA/IDEgOiAwOwotCi0gIGlmKHBbbGVuLTFdID09ICdIJykKLSAgewotICAgICBiYXNlID0gMTY7Ci0gICAgIGxlbi0tOwotICB9Ci0gIGVsc2UgaWYocFtsZW4tMV0gPT0gJ0MnIHx8IHBbbGVuLTFdID09ICdCJykKLSAgewotICAgICBiYXNlID0gODsKLSAgICAgaXNjaGFyID0gcFtsZW4tMV0gPT0gJ0MnOwotICAgICBsZW4tLTsKLSAgfQotCi0gIC8qIFNjYW4gdGhlIG51bWJlciAqLwotICBmb3IgKGMgPSAwOyBjIDwgbGVuOyBjKyspCi0gIHsKLSAgICBpZiAocFtjXSA9PSAnLicgJiYgYmFzZSA9PSAxMCkKLSAgICAgIHsKLQkvKiBJdCdzIGEgZmxvYXQgc2luY2UgaXQgY29udGFpbnMgYSBwb2ludC4gICovCi0JeXlsdmFsLmR2YWwgPSBhdG9mIChwKTsKLQlsZXhwdHIgKz0gbGVuOwotCXJldHVybiBGTE9BVDsKLSAgICAgIH0KLSAgICBpZiAocFtjXSA9PSAnLicgJiYgYmFzZSAhPSAxMCkKLSAgICAgICBlcnJvcigiRmxvYXRpbmcgcG9pbnQgbnVtYmVycyBtdXN0IGJlIGJhc2UgMTAuIik7Ci0gICAgaWYgKGJhc2UgPT0gMTAgJiYgKHBbY10gPCAnMCcgfHwgcFtjXSA+ICc5JykpCi0gICAgICAgZXJyb3IoIkludmFsaWQgZGlnaXQgXCclY1wnIGluIG51bWJlci4iLHBbY10pOwotIH0KLQotICB3aGlsZSAobGVuLS0gPiAwKQotICAgIHsKLSAgICAgIGMgPSAqcCsrOwotICAgICAgbiAqPSBiYXNlOwotICAgICAgaWYoIGJhc2UgPT0gOCAmJiAoYyA9PSAnOCcgfHwgYyA9PSAnOScpKQotCSBlcnJvcigiSW52YWxpZCBkaWdpdCBcJyVjXCcgaW4gb2N0YWwgbnVtYmVyLiIsYyk7Ci0gICAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JaSA9IGMgLSAnMCc7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGJhc2UgPT0gMTYgJiYgYyA+PSAnQScgJiYgYyA8PSAnRicpCi0JICAgIGkgPSBjIC0gJ0EnICsgMTA7Ci0JICBlbHNlCi0JICAgICByZXR1cm4gRVJST1I7Ci0JfQotICAgICAgbis9aTsKLSAgICAgIGlmKGkgPj0gYmFzZSkKLQkgcmV0dXJuIEVSUk9SOwotICAgICAgaWYoIXVuc2lnbmVkX3AgJiYgbnVtYmVyX3NpZ24gPT0gMSAmJiAocHJldm4gPj0gbikpCi0JIHVuc2lnbmVkX3A9MTsJCS8qIFRyeSBzb21ldGhpbmcgdW5zaWduZWQgKi8KLSAgICAgIC8qIERvbid0IGRvIHRoZSByYW5nZSBjaGVjayBpZiBuPT1pIGFuZCBpPT0wLCBzaW5jZSB0aGF0IHNwZWNpYWwKLQkgY2FzZSB3aWxsIGdpdmUgYW4gb3ZlcmZsb3cgZXJyb3IuICovCi0gICAgICBpZihSQU5HRV9DSEVDSyAmJiBuIT1pICYmIGkpCi0gICAgICB7Ci0JIGlmKCh1bnNpZ25lZF9wICYmICh1bnNpZ25lZClwcmV2biA+PSAodW5zaWduZWQpbikgfHwKLQkgICAgKCghdW5zaWduZWRfcCAmJiBudW1iZXJfc2lnbj09LTEpICYmIC1wcmV2biA8PSAtbikpCi0JICAgIHJhbmdlX2Vycm9yKCJPdmVyZmxvdyBvbiBudW1lcmljIGNvbnN0YW50LiIpOwotICAgICAgfQotCSBwcmV2bj1uOwotICAgIH0KLQotICBsZXhwdHIgPSBwOwotICBpZigqcCA9PSAnQicgfHwgKnAgPT0gJ0MnIHx8ICpwID09ICdIJykKLSAgICAgbGV4cHRyKys7CQkJLyogQWR2YW5jZSBwYXN0IEIsQyBvciBIICovCi0KLSAgaWYgKGlzY2hhcikKLSAgewotICAgICB5eWx2YWwudWx2YWwgPSBuOwotICAgICByZXR1cm4gQ0hBUjsKLSAgfQotICBlbHNlIGlmICggdW5zaWduZWRfcCAmJiBudW1iZXJfc2lnbiA9PSAxKQotICB7Ci0gICAgIHl5bHZhbC51bHZhbCA9IG47Ci0gICAgIHJldHVybiBVSU5UOwotICB9Ci0gIGVsc2UgaWYoKHVuc2lnbmVkX3AgJiYgKG48MCkpKSB7Ci0gICAgIHJhbmdlX2Vycm9yKCJPdmVyZmxvdyBvbiBudW1lcmljIGNvbnN0YW50IC0tIG51bWJlciB0b28gbGFyZ2UuIik7Ci0gICAgIC8qIEJ1dCwgdGhpcyBjYW4gcmV0dXJuIGlmIHJhbmdlX2NoZWNrID09IHJhbmdlX3dhcm4uICAqLwotICB9Ci0gIHl5bHZhbC5sdmFsID0gbjsKLSAgcmV0dXJuIElOVDsKLX0KLQotCi0vKiBTb21lIHRva2VucyAqLwotCi1zdGF0aWMgc3RydWN0Ci17Ci0gICBjaGFyIG5hbWVbMl07Ci0gICBpbnQgdG9rZW47Ci19IHRva2VudGFiMltdID0KLXsKLSAgICB7IHsnPCcsICc+J30sICAgIE5PVEVRVUFMIAl9LAotICAgIHsgeyc6JywgJz0nfSwgICAgQVNTSUdOCX0sCi0gICAgeyB7JzwnLCAnPSd9LCAgICBMRVEJfSwKLSAgICB7IHsnPicsICc9J30sICAgIEdFUQl9LAotICAgIHsgeyc6JywgJzonfSwgICAgQ09MT05DT0xPTiB9LAotCi19OwotCi0vKiBTb21lIHNwZWNpZmljIGtleXdvcmRzICovCi0KLXN0cnVjdCBrZXl3b3JkIHsKLSAgIGNoYXIga2V5d1sxMF07Ci0gICBpbnQgdG9rZW47Ci19OwotCi1zdGF0aWMgc3RydWN0IGtleXdvcmQga2V5dGFiW10gPQotewotICAgIHsiT1IiICwgICBPUk9SCSB9LAotICAgIHsiSU4iLCAgICBJTiAgICAgICAgIH0sLyogTm90ZSBzcGFjZSBhZnRlciBJTiAqLwotICAgIHsiQU5EIiwgICBMT0dJQ0FMX0FORH0sCi0gICAgeyJBQlMiLCAgIEFCUwkgfSwKLSAgICB7IkNIUiIsICAgQ0hSCSB9LAotICAgIHsiREVDIiwgICBERUMJIH0sCi0gICAgeyJOT1QiLCAgIE5PVAkgfSwKLSAgICB7IkRJViIsICAgRElWICAgIAkgfSwKLSAgICB7IklOQyIsICAgSU5DCSB9LAotICAgIHsiTUFYIiwgICBNQVhfRlVOQwkgfSwKLSAgICB7Ik1JTiIsICAgTUlOX0ZVTkMJIH0sCi0gICAgeyJNT0QiLCAgIE1PRAkgfSwKLSAgICB7Ik9ERCIsICAgT0RECSB9LAotICAgIHsiQ0FQIiwgICBDQVAJIH0sCi0gICAgeyJPUkQiLCAgIE9SRAkgfSwKLSAgICB7IlZBTCIsICAgVkFMCSB9LAotICAgIHsiRVhDTCIsICBFWENMCSB9LAotICAgIHsiSElHSCIsICBISUdIICAgICAgIH0sCi0gICAgeyJJTkNMIiwgIElOQ0wJIH0sCi0gICAgeyJTSVpFIiwgIFNJWkUgICAgICAgfSwKLSAgICB7IkZMT0FUIiwgRkxPQVRfRlVOQyB9LAotICAgIHsiVFJVTkMiLCBUUlVOQwkgfSwKLX07Ci0KLQotLyogUmVhZCBvbmUgdG9rZW4sIGdldHRpbmcgY2hhcmFjdGVycyB0aHJvdWdoIGxleHB0ci4gICovCi0KLS8qIFRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGFuZ3VhZ2UgYW5kIHRoZSBvcGVyYXRvcnMgdXNlZCBhcmUKLSAgIGNvbXBhdGlibGUgICovCi0KLXN0YXRpYyBpbnQKLXl5bGV4ICgpCi17Ci0gIHJlZ2lzdGVyIGludCBjOwotICByZWdpc3RlciBpbnQgbmFtZWxlbjsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIHJlZ2lzdGVyIGNoYXIgKnRva3N0YXJ0OwotICByZWdpc3RlciBjaGFyIHF1b3RlOwotCi0gcmV0cnk6Ci0KLSAgdG9rc3RhcnQgPSBsZXhwdHI7Ci0KLQotICAvKiBTZWUgaWYgaXQgaXMgYSBzcGVjaWFsIHRva2VuIG9mIGxlbmd0aCAyICovCi0gIGZvciggaSA9IDAgOyBpIDwgKGludCkgKHNpemVvZiB0b2tlbnRhYjIgLyBzaXplb2YgdG9rZW50YWIyWzBdKSA7IGkrKykKLSAgICAgaWYoU1RSRVFOKHRva2VudGFiMltpXS5uYW1lLCB0b2tzdGFydCwgMikpCi0gICAgIHsKLQlsZXhwdHIgKz0gMjsKLQlyZXR1cm4gdG9rZW50YWIyW2ldLnRva2VuOwotICAgICB9Ci0KLSAgc3dpdGNoIChjID0gKnRva3N0YXJ0KQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgJyAnOgotICAgIGNhc2UgJ1x0JzoKLSAgICBjYXNlICdcbic6Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIGdvdG8gcmV0cnk7Ci0KLSAgICBjYXNlICcoJzoKLSAgICAgIHBhcmVuX2RlcHRoKys7Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnKSc6Ci0gICAgICBpZiAocGFyZW5fZGVwdGggPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIHBhcmVuX2RlcHRoLS07Ci0gICAgICBsZXhwdHIrKzsKLSAgICAgIHJldHVybiBjOwotCi0gICAgY2FzZSAnLCc6Ci0gICAgICBpZiAoY29tbWFfdGVybWluYXRlcyAmJiBwYXJlbl9kZXB0aCA9PSAwKQotCXJldHVybiAwOwotICAgICAgbGV4cHRyKys7Ci0gICAgICByZXR1cm4gYzsKLQotICAgIGNhc2UgJy4nOgotICAgICAgLyogTWlnaHQgYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuICAqLwotICAgICAgaWYgKGxleHB0clsxXSA+PSAnMCcgJiYgbGV4cHRyWzFdIDw9ICc5JykKLQlicmVhazsJCQkvKiBGYWxscyBpbnRvIG51bWJlciBjb2RlLiAgKi8KLSAgICAgIGVsc2UKLSAgICAgIHsKLQkgbGV4cHRyKys7Ci0JIHJldHVybiBET1Q7Ci0gICAgICB9Ci0KLS8qIFRoZXNlIGFyZSBjaGFyYWN0ZXIgdG9rZW5zIHRoYXQgYXBwZWFyIGFzLWlzIGluIHRoZSBZQUNDIGdyYW1tYXIgKi8KLSAgICBjYXNlICcrJzoKLSAgICBjYXNlICctJzoKLSAgICBjYXNlICcqJzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICdeJzoKLSAgICBjYXNlICc8JzoKLSAgICBjYXNlICc+JzoKLSAgICBjYXNlICdbJzoKLSAgICBjYXNlICddJzoKLSAgICBjYXNlICc9JzoKLSAgICBjYXNlICd7JzoKLSAgICBjYXNlICd9JzoKLSAgICBjYXNlICcjJzoKLSAgICBjYXNlICdAJzoKLSAgICBjYXNlICd+JzoKLSAgICBjYXNlICcmJzoKLSAgICAgIGxleHB0cisrOwotICAgICAgcmV0dXJuIGM7Ci0KLSAgICBjYXNlICdcJycgOgotICAgIGNhc2UgJyInOgotICAgICAgcXVvdGUgPSBjOwotICAgICAgZm9yIChuYW1lbGVuID0gMTsgKGMgPSB0b2tzdGFydFtuYW1lbGVuXSkgIT0gcXVvdGUgJiYgYyAhPSAnXDAnOyBuYW1lbGVuKyspCi0JaWYgKGMgPT0gJ1xcJykKLQkgIHsKLQkgICAgYyA9IHRva3N0YXJ0WysrbmFtZWxlbl07Ci0JICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQkgICAgICB7Ci0JCWMgPSB0b2tzdGFydFsrK25hbWVsZW5dOwotCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0JCSAgYyA9IHRva3N0YXJ0WysrbmFtZWxlbl07Ci0JICAgICAgfQotCSAgfQotICAgICAgaWYoYyAhPSBxdW90ZSkKLQkgZXJyb3IoIlVudGVybWluYXRlZCBzdHJpbmcgb3IgY2hhcmFjdGVyIGNvbnN0YW50LiIpOwotICAgICAgeXlsdmFsLnN2YWwucHRyID0gdG9rc3RhcnQgKyAxOwotICAgICAgeXlsdmFsLnN2YWwubGVuZ3RoID0gbmFtZWxlbiAtIDE7Ci0gICAgICBsZXhwdHIgKz0gbmFtZWxlbiArIDE7Ci0KLSAgICAgIGlmKG5hbWVsZW4gPT0gMikgIAkvKiBTaW5nbGUgY2hhcmFjdGVyICovCi0gICAgICB7Ci0JICAgeXlsdmFsLnVsdmFsID0gdG9rc3RhcnRbMV07Ci0JICAgcmV0dXJuIENIQVI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0JIHJldHVybiBTVFJJTkc7Ci0gICAgfQotCi0gIC8qIElzIGl0IGEgbnVtYmVyPyAgKi8KLSAgLyogTm90ZTogIFdlIGhhdmUgYWxyZWFkeSBkZWFsdCB3aXRoIHRoZSBjYXNlIG9mIHRoZSB0b2tlbiAnLicuCi0gICAgIFNlZSBjYXNlICcuJyBhYm92ZS4gICovCi0gIGlmICgoYyA+PSAnMCcgJiYgYyA8PSAnOScpKQotICAgIHsKLSAgICAgIC8qIEl0J3MgYSBudW1iZXIuICAqLwotICAgICAgaW50IGdvdF9kb3QgPSAwLCBnb3RfZSA9IDA7Ci0gICAgICByZWdpc3RlciBjaGFyICpwID0gdG9rc3RhcnQ7Ci0gICAgICBpbnQgdG9rdHlwZTsKLQotICAgICAgZm9yICgrK3AgOzsgKytwKQotCXsKLQkgIGlmICghZ290X2UgJiYgKCpwID09ICdlJyB8fCAqcCA9PSAnRScpKQotCSAgICBnb3RfZG90ID0gZ290X2UgPSAxOwotCSAgZWxzZSBpZiAoIWdvdF9kb3QgJiYgKnAgPT0gJy4nKQotCSAgICBnb3RfZG90ID0gMTsKLQkgIGVsc2UgaWYgKGdvdF9lICYmIChwWy0xXSA9PSAnZScgfHwgcFstMV0gPT0gJ0UnKQotCQkgICAmJiAoKnAgPT0gJy0nIHx8ICpwID09ICcrJykpCi0JICAgIC8qIFRoaXMgaXMgdGhlIHNpZ24gb2YgdGhlIGV4cG9uZW50LCBub3QgdGhlIGVuZCBvZiB0aGUKLQkgICAgICAgbnVtYmVyLiAgKi8KLQkgICAgY29udGludWU7Ci0JICBlbHNlIGlmICgoKnAgPCAnMCcgfHwgKnAgPiAnOScpICYmCi0JCSAgICgqcCA8ICdBJyB8fCAqcCA+ICdGJykgJiYKLQkJICAgKCpwICE9ICdIJykpICAvKiBNb2R1bGEtMiBoZXhhZGVjaW1hbCBudW1iZXIgKi8KLQkgICAgYnJlYWs7Ci0JfQotCXRva3R5cGUgPSBwYXJzZV9udW1iZXIgKHAgLSB0b2tzdGFydCk7Ci0gICAgICAgIGlmICh0b2t0eXBlID09IEVSUk9SKQotCSAgewotCSAgICBjaGFyICplcnJfY29weSA9IChjaGFyICopIGFsbG9jYSAocCAtIHRva3N0YXJ0ICsgMSk7Ci0KLQkgICAgbWVtY3B5IChlcnJfY29weSwgdG9rc3RhcnQsIHAgLSB0b2tzdGFydCk7Ci0JICAgIGVycl9jb3B5W3AgLSB0b2tzdGFydF0gPSAwOwotCSAgICBlcnJvciAoIkludmFsaWQgbnVtYmVyIFwiJXNcIi4iLCBlcnJfY29weSk7Ci0JICB9Ci0JbGV4cHRyID0gcDsKLQlyZXR1cm4gdG9rdHlwZTsKLSAgICB9Ci0KLSAgaWYgKCEoYyA9PSAnXycgfHwgYyA9PSAnJCcKLQl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpKQotICAgIC8qIFdlIG11c3QgaGF2ZSBjb21lIGFjcm9zcyBhIGJhZCBjaGFyYWN0ZXIgKGUuZy4gJzsnKS4gICovCi0gICAgZXJyb3IgKCJJbnZhbGlkIGNoYXJhY3RlciAnJWMnIGluIGV4cHJlc3Npb24uIiwgYyk7Ci0KLSAgLyogSXQncyBhIG5hbWUuICBTZWUgaG93IGxvbmcgaXQgaXMuICAqLwotICBuYW1lbGVuID0gMDsKLSAgZm9yIChjID0gdG9rc3RhcnRbbmFtZWxlbl07Ci0gICAgICAgKGMgPT0gJ18nIHx8IGMgPT0gJyQnIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykKLQl8fCAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykpOwotICAgICAgIGMgPSB0b2tzdGFydFsrK25hbWVsZW5dKQotICAgIDsKLQotICAvKiBUaGUgdG9rZW4gImlmIiB0ZXJtaW5hdGVzIHRoZSBleHByZXNzaW9uIGFuZCBpcyBOT1QKLSAgICAgcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uICAqLwotICBpZiAobmFtZWxlbiA9PSAyICYmIHRva3N0YXJ0WzBdID09ICdpJyAmJiB0b2tzdGFydFsxXSA9PSAnZicpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGxleHB0ciArPSBuYW1lbGVuOwotCi0gIC8qICBMb29rdXAgc3BlY2lhbCBrZXl3b3JkcyAqLwotICBmb3IoaSA9IDAgOyBpIDwgKGludCkgKHNpemVvZihrZXl0YWIpIC8gc2l6ZW9mKGtleXRhYlswXSkpIDsgaSsrKQotICAgICBpZihuYW1lbGVuID09IHN0cmxlbihrZXl0YWJbaV0ua2V5dykgJiYgU1RSRVFOKHRva3N0YXJ0LGtleXRhYltpXS5rZXl3LG5hbWVsZW4pKQotCSAgIHJldHVybiBrZXl0YWJbaV0udG9rZW47Ci0KLSAgeXlsdmFsLnN2YWwucHRyID0gdG9rc3RhcnQ7Ci0gIHl5bHZhbC5zdmFsLmxlbmd0aCA9IG5hbWVsZW47Ci0KLSAgaWYgKCp0b2tzdGFydCA9PSAnJCcpCi0gICAgewotICAgICAgd3JpdGVfZG9sbGFyX3ZhcmlhYmxlICh5eWx2YWwuc3ZhbCk7Ci0gICAgICByZXR1cm4gSU5URVJOQUxfVkFSOwotICAgIH0KLQotICAvKiBVc2UgdG9rZW4tdHlwZSBCTE9DS05BTUUgZm9yIHN5bWJvbHMgdGhhdCBoYXBwZW4gdG8gYmUgZGVmaW5lZCBhcwotICAgICBmdW5jdGlvbnMuICBJZiB0aGlzIGlzIG5vdCBzbywgdGhlbiAuLi4KLSAgICAgVXNlIHRva2VuLXR5cGUgVFlQRU5BTUUgZm9yIHN5bWJvbHMgdGhhdCBoYXBwZW4gdG8gYmUgZGVmaW5lZAotICAgICBjdXJyZW50bHkgYXMgbmFtZXMgb2YgdHlwZXM7IE5BTUUgZm9yIG90aGVyIHN5bWJvbHMuCi0gICAgIFRoZSBjYWxsZXIgaXMgbm90IGNvbnN0cmFpbmVkIHRvIGNhcmUgYWJvdXQgdGhlIGRpc3RpbmN0aW9uLiAgKi8KLSB7Ci0KLQotICAgIGNoYXIgKnRtcCA9IGNvcHlfbmFtZSAoeXlsdmFsLnN2YWwpOwotICAgIHN0cnVjdCBzeW1ib2wgKnN5bTsKLQotICAgIGlmIChsb29rdXBfcGFydGlhbF9zeW10YWIgKHRtcCkpCi0gICAgICByZXR1cm4gQkxPQ0tOQU1FOwotICAgIHN5bSA9IGxvb2t1cF9zeW1ib2wgKHRtcCwgZXhwcmVzc2lvbl9jb250ZXh0X2Jsb2NrLAotCQkJIFZBUl9OQU1FU1BBQ0UsIDAsIE5VTEwpOwotICAgIGlmIChzeW0gJiYgU1lNQk9MX0NMQVNTIChzeW0pID09IExPQ19CTE9DSykKLSAgICAgIHJldHVybiBCTE9DS05BTUU7Ci0gICAgaWYgKGxvb2t1cF90eXBlbmFtZSAoY29weV9uYW1lICh5eWx2YWwuc3ZhbCksIGV4cHJlc3Npb25fY29udGV4dF9ibG9jaywgMSkpCi0gICAgICByZXR1cm4gVFlQRU5BTUU7Ci0KLSAgICBpZihzeW0pCi0gICAgewotICAgICAgIHN3aXRjaChzeW0tPmFjbGFzcykKLSAgICAgICB7Ci0gICAgICAgY2FzZSBMT0NfU1RBVElDOgotICAgICAgIGNhc2UgTE9DX1JFR0lTVEVSOgotICAgICAgIGNhc2UgTE9DX0FSRzoKLSAgICAgICBjYXNlIExPQ19SRUZfQVJHOgotICAgICAgIGNhc2UgTE9DX1JFR1BBUk06Ci0gICAgICAgY2FzZSBMT0NfUkVHUEFSTV9BRERSOgotICAgICAgIGNhc2UgTE9DX0xPQ0FMOgotICAgICAgIGNhc2UgTE9DX0xPQ0FMX0FSRzoKLSAgICAgICBjYXNlIExPQ19CQVNFUkVHOgotICAgICAgIGNhc2UgTE9DX0JBU0VSRUdfQVJHOgotICAgICAgIGNhc2UgTE9DX0NPTlNUOgotICAgICAgIGNhc2UgTE9DX0NPTlNUX0JZVEVTOgotICAgICAgIGNhc2UgTE9DX09QVElNSVpFRF9PVVQ6Ci0JICByZXR1cm4gTkFNRTsKLQotICAgICAgIGNhc2UgTE9DX1RZUEVERUY6Ci0JICByZXR1cm4gVFlQRU5BTUU7Ci0KLSAgICAgICBjYXNlIExPQ19CTE9DSzoKLQkgIHJldHVybiBCTE9DS05BTUU7Ci0KLSAgICAgICBjYXNlIExPQ19VTkRFRjoKLQkgIGVycm9yKCJpbnRlcm5hbDogIFVuZGVmaW5lZCBjbGFzcyBpbiBtMmxleCgpIik7Ci0KLSAgICAgICBjYXNlIExPQ19MQUJFTDoKLSAgICAgICBjYXNlIExPQ19VTlJFU09MVkVEOgotCSAgZXJyb3IoImludGVybmFsOiAgVW5mb3JzZWVuIGNhc2UgaW4gbTJsZXgoKSIpOwotICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAvKiBCdWlsdC1pbiBCT09MRUFOIHR5cGUuICBUaGlzIGlzIHNvcnQgb2YgYSBoYWNrLiAqLwotICAgICAgIGlmKFNUUkVRTih0b2tzdGFydCwiVFJVRSIsNCkpCi0gICAgICAgewotCSAgeXlsdmFsLnVsdmFsID0gMTsKLQkgIHJldHVybiBNMl9UUlVFOwotICAgICAgIH0KLSAgICAgICBlbHNlIGlmKFNUUkVRTih0b2tzdGFydCwiRkFMU0UiLDUpKQotICAgICAgIHsKLQkgIHl5bHZhbC51bHZhbCA9IDA7Ci0JICByZXR1cm4gTTJfRkFMU0U7Ci0gICAgICAgfQotICAgIH0KLQotICAgIC8qIE11c3QgYmUgYW5vdGhlciB0eXBlIG9mIG5hbWUuLi4gKi8KLSAgICByZXR1cm4gTkFNRTsKLSB9Ci19Ci0KLSNpZiAwCQkvKiBVbnVzZWQgKi8KLXN0YXRpYyBjaGFyICoKLW1ha2VfcXVhbG5hbWUobW9kLGlkZW50KQotICAgY2hhciAqbW9kLCAqaWRlbnQ7Ci17Ci0gICBjaGFyICpuZXcgPSB4bWFsbG9jKHN0cmxlbihtb2QpK3N0cmxlbihpZGVudCkrMik7Ci0KLSAgIHN0cmNweShuZXcsbW9kKTsKLSAgIHN0cmNhdChuZXcsIi4iKTsKLSAgIHN0cmNhdChuZXcsaWRlbnQpOwotICAgcmV0dXJuIG5ldzsKLX0KLSNlbmRpZiAgLyogMCAqLwotCi12b2lkCi15eWVycm9yIChtc2cpCi0gICAgIGNoYXIgKm1zZzsKLXsKLSAgZXJyb3IgKCJBICVzIGluIGV4cHJlc3Npb24sIG5lYXIgYCVzJy4iLCAobXNnID8gbXNnIDogImVycm9yIiksIGxleHB0cik7Ci19CmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL1JFQURNRSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTZmYzc1Li4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotSW5mb3JtYXRpb24gYWJvdXQgdGhlIHZhcmlvdXMgZXhlY3V0YWJsZXMgZm91bmQgaW4gdGhpcyB0ZXN0OgotCi0gICAgICAgICAgICAgQkZEICAgICAgICAgICAgICBDUFUgICAgIE9iamZpbGUKLUV4ZWN1dGFibGUgICBUYXJnZXQgICAgICAgICAgIFR5cGUgICAgVHlwZSAgICAgSW5mbyBhYm91dCBjb21waWxhdGlvbiBtYWNoaW5lCi0tLS0tLS0tLS0tICAgLS0tLS0tICAgICAgICAgICAtLS0tICAgIC0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWk0ODYtZWxmICAgICBlbGYtbGl0dGxlICAgICAgIGk0ODYgICAgRUxGICAgICAgTkNSIDMwMDAsIC91c3IvY2NzL0FUVC9jYwotaTg2MC1lbGYgICAgIGVsZi1iaWcgICAgICAgICAgaTg2MCAgICBFTEYgICAgICBTdHJhdHVzCi1tNjhrLWVsZiAgICAgZWxmLWJpZyAgICAgICAgICBtNjhrICAgIEVMRiAgICAgIEFtaWdhIDMwMDAgVVgsIC91c3IvY2NzL2Jpbi9jYwotbTY4ay1hb3V0ICAgIGEub3V0LW5ld3NvczMgICAgbTY4ayAgICBhLm91dCAgICBTb255IE5FV1MKLW02OGstYW91dDIgICBhLm91dC1zdW5vcy1iaWcgIG02OGsgICAgYS5vdXQgICAgU3VuT1MgNC4xLCBnY2MgY3lnbnVzLTIuMC4xCi1zcGFyYy1hb3V0ICAgYS5vdXQtc3Vub3MtYmlnICBzcGFyYyAgIGEub3V0ICAgIFN1biA0LCBTdW5PUyA0LjEuMSwgZ2NjIDIuMQotc3BhcmMtZWxmICAgIGVsZi1iaWcgICAgICAgICAgc3BhcmMgICBFTEYgICAgICBTdW4gNCwgU29sYXJpcyAxLjAsIGdjYyAyLjAuMgotbWlwcy1lY29mZiAgIGVjb2ZmLWJpZ21pcHMgICAgbWlwcyAgICBlY29mZiAgICBJUklYIDQuMC4xCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Nyb3NzbG9hZC5leHAgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2Nyb3NzbG9hZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmI3YTEuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9jcm9zc2xvYWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gIAotCi0jIFBsZWFzZSBlbWFpbCBhbnkgYnVncywgY29tbWVudHMsIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhpcyBmaWxlIHRvOgotIyBidWctZ2RiQHByZXAuYWkubWl0LmVkdQotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBGcmVkIEZpc2guIChmbmZAY3lnbnVzLmNvbSkKLSMgUm9iIFNhdm95ZSBjaGFuZ2VkIGl0IHRvIHVzZSBnZGJfdGVzdCAocm9iQGN5Z251cy5jb20pCi0KLWlmICR0cmFjZWxldmVsIHRoZW4gewotCXN0cmFjZSAkdHJhY2VsZXZlbAotfQotCi1zZXQgcHJtc19pZCAwCi1zZXQgYnVnX2lkIDAKLQotIyBGSVhNRTogVGhlIGNvbmZpZ3VyZS5pbiBmb3IgdGhpcyB0ZXN0IHNob3VsZCBsb29rIGZvciAtLXdpdGgtdGFyZ2V0cwotIyBhbmQgZGVhbCBhY2NvcmRpbmdseS4gIFVudGlsIHRoYXQgaGFzIGJlZW4gZG9uZSwgc2tpcCB0aGUgd2hvbGUgdGhpbmcuCi0jIFdpdGggYSBtaW5pbWFsIGJmZCAodGhlIGRlZmF1bHQpLCBmZXcgaWYgYW55IG9mIHRoZXNlIHRlc3RzIHdvcmsuCi0KLXZlcmJvc2UgIkZJWE1FOiBhbGwgdGhlIGNyb3NzbG9hZCB0ZXN0cyBpZ25vcmVkIgotcmV0dXJuCi0KLWZvcmVhY2ggaSAibTY4ay1lbGYgbTY4ay1hb3V0IG02OGstYW91dDIgbWlwcy1lY29mZiBpNDg2LWVsZiBzcGFyYy1hb3V0IGk4NjAtZWxmIHNwYXJjLWVsZiIgewotICAgIHJlbW90ZV9leGVjIGJ1aWxkICJjZCAke29iamRpcn0vJHtzdWJkaXJ9IDsgdXVkZWNvZGUgJHtzcmNkaXJ9LyR7c3ViZGlyfS8kaS51ICIKLX0KLQotIyBGSVhNRTogVGhlc2UgdGVzdHMgZG9uJ3Qgd29yayBmb3IgdGhlIGk5NjAsIGJlY2F1c2UKLSMgYmZkL2NvbmZpZy9pOTYwLWJvdXQubXQgc2V0cyBTRUxFQ1RfVkVDUy4gIEkgY291bGQgdXNlIHNldHVwX3hmYWlsCi0jIGZvciBlYWNoIHRlc3QsIGJ1dCByZWJvb3RpbmcgdGhlIGJvYXJkIGJldHdlZW4gZWFjaCBvbmUgdGFrZXMgYSBsb25nCi0jIHRpbWUgc28gSSdtIGp1c3QgcHVudGluZyB0aGUgd2hvbGUgZmlsZS4KLWlmIFtpc3RhcmdldCAiaTk2MC0qLSoiXSB0aGVuIHsKLSAgICBpZiAkdmVyYm9zZT4xIHRoZW4gewotCXdhcm5pbmcgIkZJWE1FOiBjcm9zc2xvYWQgdGVzdCBjYXNlIGRvZXNuJ3QgcnVuIG9uIHRoZSBpOTYwLiIKLSAgICB9Ci0gICAgY29udGludWUKLX0KLQotIyBGSVhNRTogVGhlc2UgdGVzdHMgZG9uJ3Qgd29yayBmb3IgdGhlIGEyOWssIGJlY2F1c2UgU0VMRUNUX1ZFQ1MgaXMKLSMgdXNlZCB3aGVuIGNvbXBpbGluZyBiZmQuICBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoZXJlIHdlcmUgc29tZSBiZXR0ZXIKLSMgd2F5IG9mIGRldGVjdGluZyB0aGlzIGNhc2UuCi1pZiBbaXN0YXJnZXQgImEyOWstKi0qIl0gdGhlbiB7Ci0gICAgaWYgJHZlcmJvc2U+MSB0aGVuIHsKLQl3YXJuaW5nICJGSVhNRTogY3Jvc3Nsb2FkIHRlc3QgY2FzZSBkb2Vzbid0IHJ1biBvbiB0aGUgYTI5ay4iCi0gICAgfQotICAgIGNvbnRpbnVlCi19Ci0KLSMgVGVzdCBpZiBnZGIgY2FuIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZSBiZmQgZm9ybWF0IG9mIGFuCi0jIGV4ZWN1dGFibGUgYW5kIHJlYWQgaXQncyBzeW1ib2xzLgotCi1wcm9jIGJmZGRlZmF1bHQge30gewotICAgIGdsb2JhbCBHREIKLSAgICBnbG9iYWwgR0RCRkxBR1MKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBvYmpkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGZpbGVfbG9hZGVkCi0KLSAgICBnZGJfdW5sb2FkCi0gICAgc2V0IGZpbGVfbG9hZGVkIDAKLSAgICBzZW5kX2dkYiAiZmlsZSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcbiIKLSAgICBnZGJfZXhwZWN0IHsKLQktcmUgIkEgcHJvZ3JhbSBpcyBiZWluZyBkZWJ1Z2dlZCBhbHJlYWR5LiAgS2lsbCBpdC4qeSBvciBuLiIgewotCSAgICBzZW5kX2dkYiAieVxuIgotCSAgICBleHBfY29udGludWUKLQl9Ci0JLXJlICJSZWFkaW5nIHN5bWJvbHMgZnJvbSAkb2JqZGlyLyRzdWJkaXIvJGJpbmZpbGVcWy5cXStkb25lXC4uKiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IgotCX0KLQktcmUgIlJlYWRpbmcgc3ltYm9scyBmcm9tICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZVxbLlxdKy5ubyBkZWJ1Z2dpbmcgc3ltYm9scyBmb3VuZC5cWy5cXStkb25lXC4uKiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IChidXQgbm8gc3ltYm9scyBmb3VuZCkiCi0JfQotCS1yZSAiRmlsZSBmb3JtYXQgbm90IHJlY29nbml6ZWQuKiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IChmb3JtYXQgbm90IHJlY29nbml6ZWQpIgotCSAgICByZXR1cm4KLQl9Ci0JLXJlICJGaWxlIGZvcm1hdCBpcyBhbWJpZ3VvdXMuKiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGF1dG8gZm9ybWF0IChmb3JtYXQgaXMgYW1iaWd1b3VzKSIKLQkgICAgcmV0dXJuCi0JfQotCS1yZSAiJGdkYl9wcm9tcHQgJCIgewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgYXV0byBmb3JtYXQiCi0JICAgIHJldHVybgotCX0KLQl0aW1lb3V0IHsKLQkgICAgZmFpbCAiKHRpbWVvdXQpICRiaW5maWxlICgkYmZkZm9ybWF0KSBhdXRvIGZvcm1hdCIKLQkgICAgcmV0dXJuCi0JfQkKLSAgICB9Ci0KLSAgICBpZiBbZ2RiX3Rlc3QgImluZm8gdGFyZ2V0IiAiLipmaWxlIHR5cGUgJGJmZGZvcm1hdCIgIiJdPT0wIHRoZW4gewotCXNldCBmaWxlX2xvYWRlZCAxCi0gICAgfSBlbHNlIHsKLQlmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgd3JvbmcgZm9ybWF0IGZvdW5kIgotICAgIH0KLX0KLQotIyBUZXN0IGlmIGdkYiBjYW4gcmVhZCBzeW1ib2xzIGZyb20gYW4gZXhlY3V0YWJsZSB3aGVuIHRoZSBiZmQgZm9ybWF0Ci0jIGlzIGV4cGxpY2l0bHkgc2V0IHZpYSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgR05VVEFSR0VULgotCi1wcm9jIGJmZGV4cGxpY2l0IHt9IHsKLSAgICBnbG9iYWwgR0RCCi0gICAgZ2xvYmFsIEdEQkZMQUdTCi0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIG9iamRpcgotICAgIGdsb2JhbCBkZXRfZmlsZQotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBmaWxlX2xvYWRlZAotCi0gICAgZ2RiX3VubG9hZAotICAgIHNldCBmaWxlX2xvYWRlZCAwCi0KLSAgICAjIE9uY2UgR0RCIDQuMTAgKHRoZSBsYXN0IHRvIGxhY2sgYHNldCBnbnV0YXJnZXQnKSBpcyBmb3Jnb3R0ZW4sCi0gICAgIyBjaGFuZ2UgdGhpcyB0byB1c2Ugc2V0IGdudXRhcmdldC4KLSAgIGlmIFtnZGJfdGVzdCAic2V0IGVudiBHTlVUQVJHRVQ9JGJmZGZvcm1hdCIgIiIgIiJdIT0wIHRoZW4gewotICAgICAgIGZhaWwgInNldHRpbmcgR05VVEFSR0VUPSRiZmRmb3JtYXQgaW4gZW52aXJvbm1lbnQiCi0gICAgICAgcmV0dXJuCi0gICAgfQotCi0gICAgc2VuZF9nZGIgImZpbGUgJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXG4iCi0gICAgZ2RiX2V4cGVjdCB7Ci0JLXJlICJBIHByb2dyYW0gaXMgYmVpbmcgZGVidWdnZWQgYWxyZWFkeS4gIEtpbGwgaXQuKnkgb3Igbi4iIHsKLQkgICAgc2VuZF9nZGIgInlcbiIKLQkgICAgZXhwX2NvbnRpbnVlCi0JfQotCS1yZSAiUmVhZGluZyBzeW1ib2xzIGZyb20gJG9iamRpci8kc3ViZGlyLyRiaW5maWxlXFsuXF0rZG9uZVwuLiokZ2RiX3Byb21wdCAkIiB7Ci0JICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBleHBsaWNpdCBmb3JtYXQiCi0JfQotCS1yZSAiSW52YWxpZCB0YXJnZXQuKiRnZGJfcHJvbXB0ICQiIHsKLQkgICAgZmFpbCAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIGV4cGxpY2l0IGZvcm1hdCAoaW52YWxpZCB0YXJnZXQpIgotCSAgICByZXR1cm4KLQl9Ci0JLXJlICIkZ2RiX3Byb21wdCAkIiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBleHBsaWNpdCBmb3JtYXQiCi0JICAgIHJldHVybgotCX0KLQl0aW1lb3V0IHsKLQkgICAgZmFpbCAiKHRpbWVvdXQpICRiaW5maWxlICgkYmZkZm9ybWF0KSBleHBsaWNpdCBmb3JtYXQiCi0JICAgIHJldHVybgotCX0JCi0gICAgfQotCi0gICAgc2V0IGZpbGVfbG9hZGVkIDEKLX0KLQotcHJvYyB0ZXN0X3B0eXBlX2Z1bmN0aW9ucyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLSAgICBzZW5kX2dkYiAicHR5cGUgbWFpblxuIgotICAgIGdkYl9leHBlY3QgewotCS1yZSAidHlwZSA9IGludCBcWykoXF0rXHJcbiRnZGJfcHJvbXB0ICQiIHt9Ci0JdGltZW91dCB7IGZhaWwgIih0aW1lb3V0KSAkYmluZmlsZSAoJGJmZGZvcm1hdCkgZnVuY3Rpb24gbWFpbiIgOyByZXR1cm4gfQotICAgIH0KLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfY2hhcl9mdW5jIiAidHlwZSA9KFwgdW5zaWduZWRcIHxcIHNpZ25lZFwgfFwgKWNoYXIgXFspKFxdKyIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfc2hvcnRfZnVuYyIgInR5cGUgPSAoc2hvcnR8c2hvcnQgaW50KSBcWykoXF0rIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2ludF9mdW5jIiAidHlwZSA9IGludCBcWykoXF0rIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2xvbmdfZnVuYyIgInR5cGUgPSAobG9uZ3xsb25nIGludHxpbnQpIFxbKShcXSsiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZmxvYXRfZnVuYyIgInR5cGUgPSBmbG9hdCBcWykoXF0rIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2RvdWJsZV9mdW5jIiAidHlwZSA9IGRvdWJsZSBcWykoXF0rIiB9IF0KLQotICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7Ci0JaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBmdW5jdGlvbiB0eXBlcyIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgZnVuY3Rpb24gdHlwZXMiCi19Ci0KLSMgTm90ZSB0aGF0IHBsYWluIGNoYXJzIGNhbiBiZSBlaXRoZXIgc2lnbmVkIG9yIHVuc2lnbmVkLgotCi1wcm9jIHRlc3RfcHR5cGVfcGxhaW5fdHlwZXMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X2NoYXIiICJ0eXBlID0oXCB1bnNpZ25lZFwgfFwgc2lnbmVkXCB8XCApY2hhciIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfc2hvcnQiICJ0eXBlID0gc2hvcnQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfaW50IiAidHlwZSA9IGludCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9sb25nIiAidHlwZSA9IGxvbmciIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZmxvYXQiICJ0eXBlID0gZmxvYXQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZG91YmxlIiAidHlwZSA9IGRvdWJsZSIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgcGxhaW4gQyB0eXBlcyIKLQkgICAgcmV0dXJuCi0gICAgfQotICAgIH0KLSAgICBwYXNzICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgcHR5cGUgcGxhaW4gQyB0eXBlcyIKLX0KLQotIyBOb3RlIHRoYXQgaWYgY29tcGlsZWQgd2l0aCBwcmUtQU5TSSBjb21waWxlcnMsIHRoZSAic2lnbmVkIiBrZXl3b3JkcyBhcmUKLSMgZGVmaW5lZCBhd2F5IGFuZCB0aGUgdmFyaWFibGVzIGRlZmF1bHQgdG8gcGxhaW4gdHlwZXMuICBTbyBhY2NlcHQgZWl0aGVyLgotCi1wcm9jIHRlc3RfcHR5cGVfc2lnbmVkX3R5cGVzIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBkZXRfZmlsZQotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9zaWduZWRfY2hhciIgInR5cGUgPShcIHNpZ25lZFwgfFwgKWNoYXIiIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3NpZ25lZF9zaG9ydCIgICJ0eXBlID0oXCBzaWduZWRcIHxcIClzaG9ydCIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9zaWduZWRfaW50IiAidHlwZSA9KFwgc2lnbmVkXCB8XCApaW50IiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X3NpZ25lZF9sb25nIiAidHlwZSA9KFwgc2lnbmVkXCB8XCApbG9uZyIgfSBdCi0KLSAgICBmb3JlYWNoIGkgJGNvbW1hbmQgewotCWlmIFtnZGJfdGVzdCBbbGluZGV4ICRpIDBdIFtsaW5kZXggJGkgMV0gIiJdIHRoZW4gewotCSAgICBpZiBbZXhwciBbc3RyaW5nIG1hdGNoICJlY29mZi1iaWdtaXBzIiAkYmZkZm9ybWF0XStbc3RyaW5nIG1hdGNoICJwdHlwZSB2X3NpZ25lZF9jaGFyIiBbbGluZGV4ICRpIDBdXV09PTIgdGhlbiB7Ci0JCXNldHVwX3hmYWlsICIqLSotKiIKLQkgICAgfQotCSAgICBmYWlsICIkYmluZmlsZSAoJGJmZGZvcm1hdCkgXCJbbGluZGV4ICRpIDBdXCIgc2lnbmVkIEMgdHlwZXMiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIHNpZ25lZCBDIHR5cGVzIgotfQotCi1wcm9jIHRlc3RfcHR5cGVfdW5zaWduZWRfdHlwZXMge30gewotICAgIGdsb2JhbCBnZGJfcHJvbXB0Ci0gICAgZ2xvYmFsIGJpbmZpbGUKLSAgICBnbG9iYWwgYmZkZm9ybWF0Ci0gICAgZ2xvYmFsIGRldF9maWxlCi0KLSAgICAjIHNldCB1cCBhIGxpc3Qgb2YgbGlzdHMgb2YgY29tbWFuZCBhbmQgcGF0dGVybnMKLSAgICBzZXQgY29tbWFuZCBbbGlzdCB7ICJwdHlwZSB2X3Vuc2lnbmVkX2NoYXIiICJ0eXBlID0gdW5zaWduZWQgY2hhciIgfVwKLQkgICAgICAgIHsgInB0eXBlIHZfdW5zaWduZWRfc2hvcnQiIFwKLQkJICAidHlwZSA9ICh1bnNpZ25lZCBzaG9ydHxzaG9ydCB1bnNpZ25lZCBpbnQpIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X3Vuc2lnbmVkX2ludCIgInR5cGUgPSB1bnNpZ25lZCBpbnQiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfdW5zaWduZWRfbG9uZyIgXAotCQkgICJ0eXBlID0gKHVuc2lnbmVkIGxvbmd8bG9uZyB1bnNpZ25lZCBpbnQpIiB9IF0KLQotICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7Ci0JaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiB1bnNpZ25lZCBDIHR5cGVzIgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSB1bnNpZ25lZCBDIHR5cGVzIgotfQotCi0jIE5vdGUgdGhhdCBwbGFpbiBjaGFycyBjYW4gYmUgZWl0aGVyIHNpZ25lZCBvciB1bnNpZ25lZC4KLQotcHJvYyB0ZXN0X3B0eXBlX2FycmF5X3R5cGVzIHt9IHsKLSAgICBnbG9iYWwgZ2RiX3Byb21wdAotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBkZXRfZmlsZQotCi0gICAgIyBzZXQgdXAgYSBsaXN0IG9mIGxpc3RzIG9mIGNvbW1hbmQgYW5kIHBhdHRlcm5zCi0gICAgc2V0IGNvbW1hbmQgW2xpc3QgeyAicHR5cGUgdl9jaGFyX2FycmF5IiAidHlwZSA9KFwgdW5zaWduZWRcIHxcIHNpZ25lZFwgfFwgKWNoYXIgXFxcWzJcXFxdIiB9XAotCSAgICAgICAgeyAicHR5cGUgdl9zaG9ydF9hcnJheSIgIFwKLQkJICAidHlwZSA9IChzaG9ydHxzaG9ydCBpbnQpIFxcXFsyXFxcXSIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9pbnRfYXJyYXkiICJ0eXBlID0gaW50IFxcXFsyXFxcXSIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9sb25nX2FycmF5IiAidHlwZSA9IChsb25nfGxvbmcgaW50KSBcXFxbMlxcXF0iIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZmxvYXRfYXJyYXkiICJ0eXBlID0gZmxvYXQgXFxcWzJcXFxdIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2RvdWJsZV9hcnJheSIgInR5cGUgPSBkb3VibGUgXFxcWzJcXFxdIiB9IF0KLQotICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7Ci0JaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBDIGFycmF5IHR5cGVzIgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIHBhc3MgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBwdHlwZSBDIGFycmF5IHR5cGVzIgotfQotCi1wcm9jIHRlc3RfcHR5cGVfcG9pbnRlcl90eXBlcyB7fSB7Ci0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgYmluZmlsZQotICAgIGdsb2JhbCBiZmRmb3JtYXQKLSAgICBnbG9iYWwgZGV0X2ZpbGUKLQotICAgICMgc2V0IHVwIGEgbGlzdCBvZiBsaXN0cyBvZiBjb21tYW5kIGFuZCBwYXR0ZXJucwotICAgIHNldCBjb21tYW5kIFtsaXN0IHsgInB0eXBlIHZfY2hhcl9wb2ludGVyIiAidHlwZSA9KFwgdW5zaWduZWRcIHxcIHNpZ25lZFwgfFwgKWNoYXIgXCoiIH1cCi0JICAgICAgICB7ICJwdHlwZSB2X3Nob3J0X3BvaW50ZXIiICAidHlwZSA9IChzaG9ydHxzaG9ydCBpbnQpIFwqIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2ludF9wb2ludGVyIiAidHlwZSA9IGludCBcKiIgfSBcCi0gICAgICAgICAgICAgICAgeyAicHR5cGUgdl9sb25nX3BvaW50ZXIiICJ0eXBlID0gKGxvbmd8bG9uZyBpbnQpIFwqIiB9IFwKLSAgICAgICAgICAgICAgICB7ICJwdHlwZSB2X2Zsb2F0X3BvaW50ZXIiICJ0eXBlID0gZmxvYXQgXCoiIH0gXAotICAgICAgICAgICAgICAgIHsgInB0eXBlIHZfZG91YmxlX3BvaW50ZXIiICJ0eXBlID0gZG91YmxlIFwqIiB9IF0KLQotICAgIGZvcmVhY2ggaSAkY29tbWFuZCB7Ci0JaWYgW2dkYl90ZXN0IFtsaW5kZXggJGkgMF0gW2xpbmRleCAkaSAxXSAiIl0gdGhlbiB7Ci0JICAgIGZhaWwgIiRiaW5maWxlICgkYmZkZm9ybWF0KSBcIltsaW5kZXggJGkgMF1cIiBDIHBvaW50ZXIgdHlwZXMiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0gICAgcGFzcyAiJGJpbmZpbGUgKCRiZmRmb3JtYXQpIHB0eXBlIEMgcG9pbnRlciB0eXBlcyIKLX0KLQotcHJvYyBsb2FkYW5kdGVzdCB7IGFyZ3MgfSB7Ci0gICAgZ2xvYmFsIHZlcmJvc2UKLSAgICBnbG9iYWwgR0RCCi0gICAgZ2xvYmFsIEdEQkZMQUdTCi0gICAgZ2xvYmFsIGdkYl9wcm9tcHQKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIG9iamRpcgotICAgIGdsb2JhbCBiaW5maWxlCi0gICAgZ2xvYmFsIGJmZGZvcm1hdAotICAgIGdsb2JhbCBmaWxlX2xvYWRlZAotCi0gICAgc2V0IGJpbmZpbGUgWyBsaW5kZXggJGFyZ3MgMCBdCi0gICAgc2V0IGJmZGZvcm1hdCBbIGxpbmRleCAkYXJncyAxIF0KLSAgICBzZXQgZml4bWUgWyBsaW5kZXggJGFyZ3MgMiBdCi0KLSAgICBpZiAhW2ZpbGUgZXhpc3RzICRvYmpkaXIvJHN1YmRpci8kYmluZmlsZV0gdGhlbiB7Ci0gICAgICAgIHBlcnJvciAiJG9iamRpci8kc3ViZGlyLyRiaW5maWxlIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotICAgIGdkYl9leGl0Ci0gICAgZ2RiX3N0YXJ0Ci0gICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLSAgICBiZmRkZWZhdWx0Ci0gICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICRiZmRmb3JtYXQgImVsZi1iaWciXSB0aGVuIHsKLQlpZiBbc3RyaW5nIG1hdGNoICRiaW5maWxlICJpODYwLWVsZiJdIHRoZW4gewotCSAgICBzZXR1cF94ZmFpbCAiKi0qLSoiCi0JfQotICAgIH0KLSAgICBiZmRleHBsaWNpdAotICAgIGlmICRmaWxlX2xvYWRlZD09MSB0aGVuIHsKLQl0ZXN0X3B0eXBlX2Z1bmN0aW9ucwotICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotCXRlc3RfcHR5cGVfcGxhaW5fdHlwZXMKLSAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLQl0ZXN0X3B0eXBlX3NpZ25lZF90eXBlcwotICAgICAgICBpZiAkZml4bWUgdGhlbiB7IHNldHVwX3hmYWlsICIqLSotKiIgfQotCXRlc3RfcHR5cGVfdW5zaWduZWRfdHlwZXMKLSAgICAgICAgaWYgJGZpeG1lIHRoZW4geyBzZXR1cF94ZmFpbCAiKi0qLSoiIH0KLQl0ZXN0X3B0eXBlX2FycmF5X3R5cGVzCi0gICAgICAgIGlmICRmaXhtZSB0aGVuIHsgc2V0dXBfeGZhaWwgIiotKi0qIiB9Ci0JdGVzdF9wdHlwZV9wb2ludGVyX3R5cGVzCi0gICAgfQotfQotCi0jIFJ1biB0ZXN0cyBmb3IgZWFjaCBvZiB0aGUgdGVzdCBleGVjdXRhYmxlcy4KLSMgSWYgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIDEsIHRoZSB0ZXN0cyB3aWxsIGJlIGV4cGVjdGVkIHRvIGZhaWwuCi0jIFdlIHNob3VsZCBleHRyYWN0IHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgdGVzdHMgYW5kIGJmZCBmb3JtYXRzCi0jIGZyb20gdGhlIG1ha2VmaWxlIG9yIHNvbWUgb3RoZXIgY29udHJvbCBmaWxlIChGSVhNRSkuCi0KLWxvYWRhbmR0ZXN0IG02OGstZWxmCSJlbGYzMi1tNjhrIgkJMAotCi0jIEknbSBnZXR0aW5nIGFuIFhQQVNTIGZvciBleHBsaWNpdCBmb3JtYXQgb24gdGhpcyBvbmUKLWxvYWRhbmR0ZXN0IG02OGstYW91dAkiYS5vdXQtbmV3c29zMyIJCTEKLQotbG9hZGFuZHRlc3QgbTY4ay1hb3V0MgkiYS5vdXQtc3Vub3MtYmlnIgkwCi1sb2FkYW5kdGVzdCBtaXBzLWVjb2ZmCSJlY29mZi1iaWdtaXBzIgkJMAotbG9hZGFuZHRlc3QgaTQ4Ni1lbGYJImVsZjMyLWkzODYiCQkwCi1sb2FkYW5kdGVzdCBzcGFyYy1hb3V0CSJhLm91dC1zdW5vcy1iaWciCTAKLWxvYWRhbmR0ZXN0IHNwYXJjLWVsZgkiZWxmMzItc3BhcmMiCQkwCi0KLSNGSVhNRTogIGk4NjAgc3VwcG9ydCBpcyB1bmxpa2VseSB0byBiZSB3b3JraW5nIGluIHRoZSBuZWFyIGZ1dHVyZQotIyBzbyBzdXBwcmVzcyB0aGlzIHRlc3QgdW50aWwgaXQgaXMgd29ya2luZy4gIC1mbmYKLSNsb2FkYW5kdGVzdCBpODYwLWVsZgkiZWxmMzItaTg2MCIJCTAKLQotZ2RiX3Rlc3QgInNldCBnbnV0YXJnZXQgYXV0byIgIiIKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTQ4Ni1lbGYudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTQ4Ni1lbGYudQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyMzM4Yi4uMDAwMDAwMAotLS0gYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL2k0ODYtZWxmLnUKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotYmVnaW4gNzc3IGk0ODYtZWxmCi1NP1Q1LDFAJCEgMCAgICAgICAgICAgICggIFAgISAgICBXKCgkIiMwICAgIVwrQCAgICAgICAjMCAoICAlCi1NICJAICUwIDEgIDggICAgVCAgICAtKCAkIiAgICAgIkAgICAgSCAgICAgNCAgICAgICAgICBQICAgLTAgCi1NICAgICAgICAgICAgICEsICAgICAgICAgISAgICAgICAgICAhICAgIC0gICAgIzIgISBAICAgICAqIDggCi1NICJAJiAgICUgICAgICEgICAgJCAgICE8IUAgIDcpOCQiICAgICAiNCAgICAyICggICA8ICAgICAkICAgCi1NIEAgICAoICYgICIgRUAwKCAgICAgJyAgICAgICAgICAhUCAgICAgICAgIE89Ny1SK1ZRSThCXUw6NilDCi1NK0ctTytDJCAgICwgICAgLCAgICAhQCAgICBMICAgICogICAgICAgICAgICAgICAhICAgICAgICAgICggCi1NICAgJCAgICAgICAgICA0ICAgICMgICAgIiAgICAgRCAgICAnICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAkICAgIjxAQDAoJyAgICAhKCAgICAqICAgIEkpQCQiICAgICAgMSAvJ18jUCAgICYiNiEgQCQgICAgCi1NJDAgKyAhQCAgICE8QUAwKCAgICAgISQgXD9cPyAgICBLKCgkIiQgICAgIDIgICAgKUAgICAvIjYhIEAgCi1NICAgICQwI1FfUlQgICAjLEBAMCggICAgICEoICAgIFIgICAgLyg4JCIgMCAgICAxICBIIC9QICAgK1IiCi1NISBAICAgICAkQCAgICREICAgIURFQDAoICAgICAhJCBcP10/ICAgIEApOCQiICAgICAgMSAvJ18gJV1DCi1NOyY1QTtHNVAgJV1FO0YwIDdWNU49RkVSO1ZYIDdWNVQ5N0FUICYlVDk3QUk9ICE/OTYxQT0mJCA5N0FJCi1NPSAhPzsmRUI3VzlFPEctSTtWWCA3VV1GPCctVDg3KVQgJV0nMyRdIjA0UT8zVDkmNFQ1NDdVMSEwRFElCi1NN1AhPzElRS4wNFUpMFAgTz03LVIrVlFJOEJdTDo2KUMrRy1PK0MkICAnIjYhIEAnIDAgID0pOCQiIDwlCi1NICAhWEVAMCghUEQgICdSNiEgQCchUCAgUFAgICAvXFU6KTgkIi9cRTspOCQiICAgICAjXyk3IjYhIEFICi1NICAgICAuR0BfX19fX1I1VEVAMCg6IEAgICAjSVQvX19fX1xFPik4JCImQDAgICAgWjwjX19fX18pN1I2Ci1NISBBSCYgICAgLkZQX19fXzpAIUogKE9MNEtCPEBAMChBPCFUIzZCPEBAMChaKztfX19eI1EgMlhAKTgkCi1NIig3ID0gN0hJP19fX1ZAWEFAMChaKU9fX19eKzEwQi01KDQwQjE1QEVAMCg0SFU1IyUpMFolX19fX19ICi1NQ09fX19eQCEgMCAgQFwwLDQuQjBfX19fOkAiWCAwICAgKUggICAgICFQI1RQXkwmLFwjSyAsRyM1OE9MCi1NWl82MEQpI0shQy8gWlAjKVBVNitbLk9VRCkiMFpQOFNQLkwgUjwtNUJeU0tdOSIwRC5MJixcI0sgLEcjCi1NNThPTFpfNjBEKSNLIUMvIFpQIylQVTYrWy5PVUQpIjBaUDhTUC5MIFI8LTVCXlNLXTkiMEQuTCYsXCNLCi1NICxHIzU4T0xaXzYwRCkjSyFDLyBaUCMpUFU2K1suT1VEKSIwWlA4U1AuTCBSPC01Ql5TS105IjBELkwmCi1NLFwjSyAsRyM1OE9MWl82MEQpI0shQy8gWlAjKVBVNitbLk9VRCkiMFpQOFNQLkwgUjwtNUJeU0tdOSIwCi1NRC5MKlcwNSBBQDAoWlAjKVBVNitbLk9RRCkiMFpQSz0hNEImISBDSyAsRyM1OE9MWl8mMEQpI0lcUCQgCi1NICkjJiE/QjchIEAgUUA1VEVQMCggPDglLkk8JCIgKUZRUDVMRVAwKCBQIUZRUDU8RVAwKCEgIUZRUDQkCi1NRVAwKCEwIychMSI3ISBAJiAgICBRUDdQRUAwKCFQICAgLDwlXSk4JCIgQCAgICMnITZCNyEgQCkgICAgCi1NUVA3XEVAMCgiQCAgICw8JT4pPCQiIEwgICAiQTQoOCQiKixcRVAwKEg1QiYhIEJDIyk8JCIqJTRBQDAoCi1NSFBCNyEgQkBeKTwkIiorNEVQMChIJzI3ISBCQi4pPCQiKiBaRVAwKEhPQjYhIEFGSDZSNyEgQUZIV1I3Ci1NISBBRkg1UjchIEFGSFRCNyEgQUZIMDI3ISBBRkhYIjchIEJBJCk8JCIqLDxFUDAoSD8iNiEgQkNDKTwkCi1NIionVEVAMChIVSI3ISBCQTopPCQiKi9QRVAwKEg/UjYhIEJDMCk8JCIqJVhFUDAoSFYiNyEgQkEvKTwkCi1NIiovQEVQMChIMFI3ISBCQyspPCQiKiQoRVAwKEhSQjchIEMnITgyNyEgQ1hFUDAoUVA3TEVQMCg9KTwkCi1NIiw8JUIpPCQiI0o3ISBDJyE+QjchIEFMRVAwKFFQNjxFUDAoNyk8JCIsPCUgKTwkIiAyNyEgQychNFI3Ci1NISBAMEVQMChRUDY0RVAwKFwpOCQiLDwlNik8JCIvMjYhIEMnITciNyEgQUhFUDAoUVA3PEVQMChfKTgkCi1NIiw8JSYpPCQiJ0I3ISBDJyE9QjchIEBcRVAwKFFQNkBFUDAoIik8JCIsPCUpKTwkIiAoICAgIychMTI3Ci1NISBAIiAgICBRUDYwRiAwKCAwICAgLDwlXyk8JCIgJCAgICJBRik8JCIqLCBGIDAoOUomPEYgMCg5Si40Ci1NRiAwKFI8LTVCXlNJIU9bX19ZICAgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLEEiCi1NICAgICAgICA6NCAgICAgICAgICAgKCI2ISBAICAgICAgICAgICoqIiEgQlJAQDAoUEgoJCItKiIhIEAhCi1NICAgIDogICAgIFAgICAiKEBAMCgjMCAgICNCJiEgQCQgICAgWiggJCIgNCAgICNMQDAwKCFAICAgIlIhCi1NISBAKiAgICA+UCAgICBMICAgIDAgICAgJTAgICAgICAgICAjICAgIDkpOCQiICggICAgQCAgICAlICAgCi1NICEkICAgIDcgICAgOigoJCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkICAgICAgICAgCi1NICAgICAgMCBcP1wgICAgIFUoICQiICAgICAgIyAgJCAgICAgIC5CICEgQCAgICAgIFAgIiAgICAgICBMCi1NQDAwKCAgICAgICwgIFAgICAgICBbKCQkIiAgICAgICMgIDAgICAgICAmQiIhIEAgICAgICBQICUgICAgCi1NICAiKEBAMCggICAgICAsICFAICAgICAgQygoJCIgICAgICAjICA8ICAgICAgLVIiISBAICAgICAgUCAoCi1NICAgICAgIFhBQDAoICAgICAgLCAiMCAgICAgIC8oOCQiICAgICAgIyAgSCAgICAgICVSNiEgQCAgICAgCi1NIFAgKyAgICAgICFERUAwKCAgICAgICwgIyAgICAgICBAKTgkIiAgICAgICMgIFQgICAgICAvIjYhIEAgCi1NICAgICBQIC4gICAgICAgICAgICAgICAgICAsICNQICAgICAgICAgICAgICAgICAjICEgICAgICAgICAgCi1NICAgICAgICAgUCAxICAgICAgICAgICAgICAgICAgLCAkQCAgICAgICAgICAgICAgICAgIyAhLCAgICAgCi1NICAgICAgICAgICAgIFAgNCAgSCAgICAgICAgICAgICAgIDAgXD9cMSAgICAgICAgICAgICAgICQgLydfCi1NJiAgICAgICAgICAgICAgICEgI1FfUjAgICAgICAgICAgICAgICAwIFw/XEwgICAgICAgICAgICAgICAkCi1NIC8nXy1AICAgICAgICAgICAgICAhICNRX1NUICAgISxAUDAoIzAgICAhKCAiICEpICAgIFwpOCQiIDAgCi1NICAgMSAgWCA1QCAgIC8yNiEgQCQgICAgJDAgLiAmNCAgICBYQUAwKCAgICAgISggIjAhSyAgICBeKTgkCi1NIiAoICAgIDEgIFggQDAgICAjMiQhIEAhIEAgICRAICggKDggICAjXEVAMCghICAgICEkICNAIjQgICAgCi1NICk8JCIgMCAgICAxICBYIEswICAgKVIiISBAPCAgICAkQCAgICs4ICAgIkRGIDAoICAgICAhJCBcP15bCi1NICAgICEpPCQiICggICAgMSAgWCBTICAgIClSIyEgQC0gICAgJEAgKCAuKCAgICAoRVAwKCIgICAgISQgCi1NI0AjSyAgICAkKTwkIiAwICAgIDEgIFggXDAgICAtUiIhIEAgICAgICRAICggL0AgICAgNEVQMCghICAgCi1NICEkICNAICMgMCAgOCk4JCIgMCAgICAxICBMICMgJCAgIUI3ISBAJCAgICAkMCAuICIwISAgIDxFUDAoCi1NIiAgICAhJCAjQCBQIDAgICkpPCQiIDAgICAgMSAgWCAuICQgICVSIyEgQC0gICAgJEAgKCAkTCEgICBICi1NRVAwKCQgICAgISQgI0AhOiAwICA3KDgkIiAgICAgIDEgLydfODAkICAjQjchIEAiICAgICQwIC4gJzQhCi1NICAgWkVQMCggMCAgICEkICNAIiUgMCAgLyk8JCIgMCAgICAxICBYIEMwJCAgJCI3ISBAKCAgICAkMCAuCi1NICokISAgIkxAQDAoMCAgICAhKCAgICJIIDAgIDgpOCQiIDAgICAgQSAgTCBMICQgIC1SIyEgQC0gICAgCi1NJEAgKCArUCEgICNcQFAwKCMwICAgISggIiAjMSAwICAyKTwkIiAwICAgIDEgIFggWUAkICAkUjchIEAkCi1NICAgICQwIC4gLzAhICAjUEVAMCggICAgICEkIFw/X1sgMCAgPygsJCIgVCAgICAyICBAICIgKCAgJSI3Ci1NISBAKCAgICAkMCAuICFUIiAgIThFUDAoISAgICAhJCAjQCBUIEAgIEsoLCQiIFQgICAgMiAgQCAvUCggCi1NICVSNyEgQCIgICAgJDAgLiAkWCIgICAsQSAwKCQwICAgISggIiAhOyBAICBTKCgkIiAgICAgIDIgICAgCi1NOCAoICAmIjchIEAoICAgICQwIC4gJzgiICAhSEVQMCghICAgICEkICNAIV0gQCAgOyk8JCIgKCAgICAxCi1NICBYIEEwKCAgJyI3ISBAJCAgICAkMCAuICkwIiAgIVRFUDAoIDAgICAhJCAjQCJCIEAgID4pPCQiIDAgCi1NICAgMSAgWCBMQCggICdSNyEgQCQgICAgJDAgLiAsICIgICIgRVAwKCEgICAgISQgI0AjNyBAICAvKDgkCi1NIiAwICAgIDEgIEggWSAoICAkTiMhIEAgICAgICRAICggLlAiICAiJEVQMCghICAgICEkICNAI1sgQCAgCi1NQik8JCIgMCAgICAxICBYICRQLCAgKFI3ISBAKCAgICAkMCAuICI4IyAgIlxAQDAoICAgICAhKCAgICBQCi1NIFAgIEUpPCQiIDAgICAgMSAgWCAxMCwgIClCNyEgQCQgICAgJDAgLiAkUCMgICFERUAwKCAgICAgISQgCi1NXD9dQiBQICBHKTwkIiAwICAgIDEgIFggPjAsICAqIjchIEAkICAgICQwIC4gKEgjICAhPEVAMCghICAgCi1NICEkICJQIjwgUCAgSSk8JCIhQCAgICAxICBYIElALCAgK1I3ISBAOCAgICAkMCAuICsgIyAgIzRFUDAoCi1NIEAgICAhJCAjQCJdIFAgIFYpPCQiIDAgICAgMSAgWCBTMCwgIC1SNyEgQCQgICAgJDAgLiAuLCMgICBACi1NQSAwKCQwICAgISggIiAjUSBQICBPKCwkIiBUICAgIDIgIEAgIFAwICAoIjYhIEAgICAgICQwI1FfUFAkCi1NICAjQEVQMCgiICAgICEkICNAIDohICAgWik8JCIgMCAgICAxICBYICpAMCAgLlIjISBALSAgICAkQCAoCi1NICNUJCAgI0xFUDAoISAgICAhJCAjQCEzISAgIFwpPCQiIEAgICAgMSAgWCA4IDAgIChCIiEgQCAgICAgCi1NJEAgJiAmOCQgICNYRVAwKCAwICAgISQgI0AhTSEgICBfKTwkIiAwICAgIDEgIFggPTAwICAmUiMhIEAtCi1NICAgICRAICggKEgkICAgIEYgMChEICAgICEkICNAIjEhICAgQygsJCIgVCAgICAyICBAIEkwMCAgKSI4Ci1NISBAJCAgICAkMCAuICpcJCAgIjRGIDAoIiAgICAhJCAjQCJYISAgIFMoLCQiIFQgICAgMiAgQCBTIDAgCi1NIClSOCEgQCggICAgJDAgLiAgIUktI0BWK0Y1TDlAIUM8RzBRK0csIDhXKVQ6MllTICc5QTsnNUU8UlU4Ci1NPSJZQyAmPUQ4RlVFK0YsIDxWQT85JiVUODJZQyAmLVI9JlhOPFAhVjdWLUg4Nyk/OUc1TjhQIVY3Vy1JCi1NOVZZRTklXUk7RzAgPUVdVTtHLUk5VllFOSVdSTtHMCA3VjlJO0ZEID1FXVU7Ry1JOVZZRTklXUM6JiVSCi1NN1YlUjxGJVkgJlVBOjZYID1FXVM6Nj1OOTYxPzsmXU45UCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPCi1NOjZZVDk3KCA3Vi1MOTYlTj03ICA3VjVOOSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUICc5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzE/OUc1TjhQIVY3VjFPPTYpTDkwIVY3VkVOPSAhPzxXMUE8RzAgO0ZdTjwnKUk7NiVSCi1NPjAhPzk2WVY6NylPO0AhVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1ZFTj0lXUE8RylBCi1NPjAhUDxGRU04NylZICc5PzxWRUc7RjVEN1YtSDg3KT85RzVOOFAhVjdWMU89NilMOTVdQTxHKUE+MCE/Ci1NOTcxRT4nMCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1YtSDg3KCA9RV1GCi1NOyZdQT0gIVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJiVUOTdBST0gIUU7RzlJPEZdTiAnOT87Jl1OCi1NOVVdRj02WUMgJzk/PTZZUzo2PU45NjE/OyZdTjlVXUY9NllDICc5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSCi1NPEYlWSAnOT86NllUN1chTzo2WVQ5NyggN1Y1RDg3MUEgJzk/PFZBTzxHMT85RzVOOFAhVjdXNU48VkVHCi1NO0Y1RDdWRU49JV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3VkVOPSVdUDtWRU49JjVSICc5Pzo2WVQ3VjlVCi1NO0YsID1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdRjsmXUE9JV1GPTZZQyAmNVg6NzAgPUVdVTtHLUk5VllFCi1NOSVdTDtWWUc3ViVSPEYlWSAnOT87Jl1OOVAhVjdXLUg7VylUICc5PzsmXU45VV1QO1ZFTj0mNVIgJzk/Ci1NPFZFRztGNUQ3Vi1IODcoID1FXVU7Ry1JOVZZRTklXUw7VllHICc5PzxWQU88RzE/ODcpUjg3RCA9RV1VCi1NO0ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjAhPzsmRUI3VzlFPEctSTtWWCA3VlVDO1c1Tj0gIVY3Vi1ICi1NODcpPzwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8QCFWN1ctSTlWWUU5JV1JCi1NO0cxPzg3KVI4N0QgN1VdRjwnLVQ4NylUICc5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnLT87JkVOCi1NOlAhPzFUUS8wRCUsN1RdJjFFLSU1JV00MDQpLDE1XCA9RV1TOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFCi1NPEAhVjdWMU89NilMOTVdUDtWRU49JjVSICVdPzsmXU45VjFPPTYpTDk1XVU8VjVEICc5PzxXMVI9Ni1UCi1NLDAhVjdXLVQ8RzVDPSMoID1FXUM6JiVSN1YlUjxGJVkgJzk/OUZRTzg3MT88Jl1JO0cxRTxAIVY3Vy1JCi1NOVZZRTklXUw7VllHN1chTzo2WVQ5NyggPUVdRDtXNUI7JjU/OUc1TjhQIVY3Vy1JOVZZRTklXUk7RzE/Ci1NOUc1TjhQIT8xJUUuMDRVKTBQIVY3VjlMO1YlVDdWJVI8RiVZICc5PzxWQU88RzE/PCZdSTtHMUU8QCFWCi1NN1ctSTlWWUU5JV1MO1ZZRzdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAnOT87Jl1OCi1NOVVdQTxHKUE+MCE/OjZZST0gIVY3Vi1IODcoIDhWUVU7Rk1FPEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/Ci1NOUc1TjhQIVU3VlFJO0ZMID1FXVM6Nj1OOTYxPzxWQU88RzE/OUc1TjhQIVM8Jl1SPSctQzg3KCA9RV1VCi1NO0ZFTztDKCA9RV1VO0ctSTlWWUU5JV1JO0cxPzlHNU44UCFWN1c1Tjo2XU4gICBOOjZZVDk3KVAgIllICi1NODctSCAiWUQ+NllTPjZUICtGMVk7Ry1UPEAgTjxGNUwrRyFMPSAgTjo2WUk9ICBOPCZRVCAiWVQ5N0FUCi1NICJZRjo2WUkgIllSO1YxQT0mJCArRjFBPSYkICtGPU89ICBOOSdFTjg2VUk4UCBOOEctUyAiWVM+NlVUCi1NODYoICtHLVQ8RzFBOEAgTjxWQVM9JylUODYoICtGLU87NlVFO0cwICtGMUU4RzVHICJZTDo2WUUgJCBICi1NKFJFTDo2KUMrNkRTLiM4WjsmRUI4UlVJLFNAVitWLVM9Ml1DPEcwUStHLCksMlhRLiAhQTxTSEAqJS0jCi1NMSQ0SSgjNE4sIiBALCMwTywzRE8uMyAgMCJAQyo2UUk4RixNOjMsWC1DSUM8VzRPOFcpVDoyWVMiMyROCi1NLEAhQTxTSEAqJS0jMSQ0SSgjNE4sIiBALCMwTywzRE8uMyAgMCJAQyo2UUk4RixNPCZdUj0jSUc5NlhPCi1NPUYlTD02NVMrNUFUK0YsKSwyWFMgJCBIKFJFTDo2KUMuRkVOOFJdUz42WU87R0VNPFJZSCIzJE4sUywgCi1NMCJAQyo2QUU4NjBaOzYlVDoiWUgiMyhOLDMkTiwyWFItUCFBOFZdTTwjSEAqJS0jMSQ0SSgjNE4sIiBACi1NLCMwTywzRE8uMyAgO1chVDo2VFooIkEzMFQxJSoyIFUrQyBAKCMgVCtTJFkrU0RQICYlUy5CIEg0VC0kCi1NMTJEQC0yWFAoIiBQLSJcUS4yXFksICFBOFZdTTwjSEAqJS0jMSQ0SSgjNE4sIiBALCMwTywzRE8uMyAgCi1NODcsWigiQTMwVDElKjIgVStDIEAoIyBUK1MkWStTRFAgJCBIKFJFTDo2KUMrNkRTLiM4WjlWNU4rVy1ICi1NN1YxQT0mJE44UERRK0MsIDg2LU87NyBaKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZK1NEUCAmXVA9JkVNCi1NLkIgSDRULSQxMkRALTJYUCgiIFAtIlxRLjJcWSwgIUE8U0hAKiUtIzEkNEkoIzROLCIgQCwjME8sM0RPCi1NLjMgIDAiQEMqNlFJOEYsTTozLFgtQ0lMOjYpQys2RFMuIzhPOFctVStWLVI9JlhOPFBEUStDNCA4NyxaCi1NKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZK1NEUCAiIUw5IiBaKCJBMzBUMSUqMiBVK0MgQCgjIFQrUyRZCi1NK1NEUCAgICArQCAgICEkICRAIVAlQCAgLiAhRzkmKU05MllDICM4ISAwICAgISQhMygsJCIiJCEtODgkCi1NIiA4ISAgICAgIVQgICAgMyAhKCAzQCQgICNAID0lXVM9JylVOFcwIE1AIDggICAgKkAgICAgVCAkQCFVCi1NICAgIC4gIVY3Vi1IODcpPzs2NU04RjVSICU0ICAwIEMgIDggISAgICAgICcqUCAgICBUICRAIkAgICAgCi1NLiAhVjdXLUg7VylUN1ZVRTs2KUU8QCE1ICAwIChQICYgIDAiICAgICFSRCAgICAtICEoIFIwICAgI0AgCi1NPUVdSTtHMT87NjVNOEY1UiAlNCAhUCBDICA4ICEgMCAgICAnKkAgICAgVCAkQCNTICAgIC4gIVY3VlFPCi1NO0Y9Pzs2NU04RjVSICU0ICJAIEMgIDggISBAICAgICcqUCAgICBUICRAID4gMCAgLiAhVjdWOUw7ViVUCi1NN1ZVRTs2KUU8QCE1ICBYIChQICYgIDAsICAgICFSUCAgICAtICEoIDJAJCAgI0AgPUVdRDtXNUI7JjU/Ci1NOzY1TThGNVIgJTQgI1AgQyAgOCAhISAgICAgJyEgICAgIUwgICAgMyAhKCA7ICggICNAICtDIUY4Nk1FCi1NICs4ICYgICAgIkggICAgLSAhKCBEUCQgICNAID1FXUM6JiVSN1ZVRTs2KUU8QCE1ICAkIChQICYgIDAgCi1NICAgICFSTCAgICAtICEoIE9AJCAgI0AgPUVdUzomXVI9JV1NOTZVQjk3KCA1MCAkICIsICFAICQgQCAgCi1NICA8SSAgICAjMCAyIC48ISAgIFggJzk/OjZZVDdWVUU7NilFPEAhNSAgPCAoUCAmICAwJCAgICAhUkggCi1NICAgLSAhKCAkMCggICNAID1FXUw7VllHN1ZVRTs2KUU8QCE1ICBIIChQICYgIDAoICAgICFSTCAgICAtCi1NICEoIC8gKCAgI0AgPUVdRjsmXUE9JV1NOTZVQjk3KCA1MCAuICIsICFAICQjICAgICA8TCAgICAjMCAyCi1NICZAIiAgIFggJzk/OSZdVThGUUU3VlVFOzYpRTxAITUgIFwgKFAgJiAgMDAgICAgIVAwICAgIDwgICAgCi1NJVAgMiAoTCMgICBYICcxPz02WUk7VlggTUAgKCAgICAqQCAgICBUICRAIlIgQCAgLiAhVjdWLUg4Nyk/Ci1NOzY1TThGNVIgJTQgIDAgQyAgOCAhICAgICAgJypQICAgIFQgJEAjPSBAICAuICFWN1ctSDtXKVQ3VlVFCi1NOzYpRTxAITUgIDAgKFAgJiAgMCAgICAgIVJEICAgIC0gISggIUAsICAjQCA9RV1JO0cxPzs2NU04RjVSCi1NICU0ICFQIEMgIDggISAgICAgICcqQCAgICBUICRAIFAgUCAgLiAhVjdWUU87Rj0/OzY1TThGNVIgJTQgCi1NIkAgQyAgOCAhICAgICAgJypQICAgIFQgJEAhOyBQICAuICFWN1Y5TDtWJVQ3VlVFOzYpRTxAITUgIFggCi1NKFAgJiAgMCAgICAgIVJQICAgIC0gISggQVAsICAjQCA9RV1EO1c1QjsmNT87NjVNOEY1UiAlNCAjUCBDCi1NICA4ICEgICAgICAnISAgICAhTCAgICA3ICEoIEowMCAgI0AgK0MlRjg2TUUgKzggIiAgICAiSCAgICAtCi1NICEoIFQgLCAgI0AgPUVdQzomJVI3VlVFOzYpRTxAITUgICQgKFAgJiAgMCAgICAgIVJMICAgIC0gISggCi1NXlAsICAjQCA9RV1TOiZdUj0lXU05NlVCOTcoIDUwICQgIiwgIUAgJCAgICAgIDxJICAgICMwIDIgIjAkCi1NICAgWCAnOT86NllUN1ZVRTs2KUU8QCE1ICA8IChQICYgIDAgICAgICFSSCAgICAtICEoIDNAMCAgI0AgCi1NPUVdTDtWWUc3VlVFOzYpRTxAITUgIEggKFAgJiAgMCAgICAgIVJMICAgIC0gISggPjAwICAjQCA9RV1GCi1NOyZdQT0lXU05NlVCOTcoIDUwIC4gIiwgIUAgJCAgICAgIDxMICAgICMwIDIgKjQkICAgWCAnOT85Jl1VCi1NOEZRRTdWVUU7NilFPEAhNSAgXCAoUCAmICAwICAgICAhUDAgICAgSiAgICAhQCAyIC08JCAgIFggJzk/Ci1NOFZBQTxFXUY9NllDICU0ICAwIDEgNFIjISBAQSA1RiMhIEAkICAgICwwICAgIDggJEAgLCEwICAuICFWCi1NN1ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgNTAgIiAhJCE3KCwkIiIkITo4LCQiIDAgICAgUyAgICAhQCAyCi1NICQsJSAgIFggJzk/PTZZUzo2PU45NjE/OFZBQTxFXUY9NllDICU0ICBQIDEgNlIjISBAQSA3RiMhIEAkCi1NICAgICpQICAgIDggJEAhUiEwICAuICFWN1ctSDtXKVQ3VjlVO0YsIDUwICQgISQhPygsJCIiJCFCOCwkCi1NIiAwICAgIFIgICAgIUAgMiAqQCUgICBYICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIDUwICUgISQhCi1NQygsJCIiJCFGOCwkIiAwICAgIFQgICAgIUAgMiAuICUgICBYICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/Ci1NOUc1TjhQITUgIDggJDAmPEBQMCgoMCZJQFAwKCEgICAgIkQgICAgJiAhKCAjMDggICNAID1FXUk7RzE/Ci1NOUc1TjhQITUgIDwgJDAmTEBQMCgoMCZZQFAwKCEgICAgIyAgICAgJiAhKCAwMDggICNAID1FXVM6Nj1OCi1NOTYxPzo2WVQ3VjlVO0YsIDUwICggISQhTygsJCIiJCFSOCwkIiAwICAgIFIgICAgIUAgMiAnPCYgICBYCi1NICc5Pz02WVM6Nj1OOTYxPzo2WVQ3VjlVO0YsIDUwICkgISQhUygsJCIiJCFWOCwkIiAwICAgIEogICAgCi1NIUAgMiAqNCYgICBYICc5PzsmXU45VV1GPTZZQyAlNCAiQCAxID1SIyEgQEEgPkYjISBAJCAgICAsMCAgCi1NICA4ICRAIzohQCAgLiAhVjdXLUk5VllFOSVdTDtWWUc3VjlVO0YsIDUwICsgISQhWygsJCIiJCFeOCwkCi1NIiAwICAgIFMgICAgIUAgMiAhJCcgICBYICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAlNCAjICAxCi1NID9SIyEgQEEgMEYkISBAJCAgICAqUCAgICA4ICRAISAhUCAgLiAhVjdWOUw7ViVUN1Y5VTtGLCA1MCAuCi1NICEkISMoMCQiIiQhJzgwJCIgMCAgICBMICAgICFAIDIgJyAnICAgWCAnOT85Jl1VOEZRRTdWOVU7RiwgCi1NNTAgLyAhJCEoKDAkIiIkISw4MCQiIDAgICAgNSAgICAlMCAyICpYJyAgIiMgIDQgID5IJyAgIDUgICAgCi1NITAgMiApSCcgICIjICA0ICA+SCcgICAwICAgICEwIDIgKkgnICAhNSAgPCAhICAgICNQICAgICEgISggCi1NWkA8ICApNCAgICJDICJAICAgQCAgICAgICAgICAgICAiICAgICAgICAwICAgICAoICAgICAgICIgICAgCi1NIicoICtAICAgIUQgICAgMyAhKCA+UEAgICNAIDsmRU46UCJWIClAICAgIEYgICAgIzAgMiAiRCggICBYCi1NICZZRT4nMCBAUCAlICAnSiFQICAoUCAmICAwICAgICAhUkggICAgLSAhKCA0UEAgICNAIDsmRU46VjlVCi1NO0YsIEBQICUgICVQIVAgIChQICYgIDAkICAgICFSMCAgICAtICEoID1QQCAgI0AgPFcxVTlGOCA8QCJOCi1NIVAgIChQICYgIDAoICAgICFQMCAgICA1ICAgICUwIDIgK0QoICAiIyAgNCAgPkgnICAgNSAgICAhMCAyCi1NICo0KCAgIiMgIDQgID5IJyAgIDAgICAgITAgMiArNCggICE1ICA8ICEgICAgI1AgICAgISAhKCBdMEAgCi1NICk0ICAgIkMgIkAgICBAICAgICAgICAgICAgICIgICAgICAgIDAgICAgICggICAgICAgIiAgICAiJyggCi1NK0AgICAhUCAgICA3ICEoIEIwRCAgI0AgPSc1PzsmRU46UCJWICkgICAgIEYgICAgIzAgMiAjPCkgICBYCi1NICZZRT4nMCBAUCAlICAnSiFQICAoUCAmICAwICAgICAhUkggICAgLSAhKCA4MEQgICNAIDsmRU46VjlVCi1NO0YsIEBQICUgICVbIiAgIChQICYgIDAgICAgICFSMCAgICAtICEoIEEwRCAgI0AgPFcxVTlGOCA8QCJZCi1NIiAgIChQICYgIDAgICAgICFQMCAgICBaICAgICEgIDIgLDwpICAgWCAiWFI5RiVLOTAiViAgMCAgICNTCi1NICFMICBAICAgJilMPTY0ICAwICAgJj1SOTY1TiAgICAgICFSOTYwICEgICAgI1ggICAgJCAhKCAiMEggCi1NICNAIDhWXUw7VylTICs4ICEgICAgLywgJ1AgIiAgICA8JkVOOlAgISAgICA8JzVSPCZRRSAgICAgICFZCi1NOTZRTDtXPCAhICAgICMoICAgICQgISggL1BIICAjQCArQy1GODZNRSArOCAhICAgIC8sICRQICEgICAgCi1NOUZdUjkgICAgICAgOFZBRT1HRCAhICAgICMkICAgICQgISggPSBIICAjQCA4ViVSPFAiViAgMCAgICNTCi1NICEwICAwICAgJyFPPEctQzomNCAgICAgICYpTT1QICQgICAgLEAgICAgMCAkQCJKIkAgIC4gIE4tJjlBCi1NOlY0IE1AICQgICAgXFAgMyAgJCAgICE0NEU1JSAgICAgICEmMDRRMzEwICQgICAgJyAgICAhOCAkQCMmCi1NIkAgIC4gIUI7Vl1MOTYlTiAnKCA9IEggICMkICAgICQgISggXlBIICAjQCA4RzlBOycsIE1AICQgICAgCi1NXFAgMyAgJCAgICFUPEc1RSAgICAgICFGODZRUzkwICQgICAgJzAgICAhOCAkQCA4IlAgIC4gIUI7Vl1MCi1NOTYlTixAIVIgLDgqICAhJiAgICAhICAyICYoKyAgIFggJlVJPFZdUjkmNVI5NjAgTUAgJCAgICBcUCBDCi1NICAsICAgIVQ6JylFOTAgICAgICA+RjVSO1AgISAgICA7VllFICAoICAgIVQ9VlwgISAgICAiLCAgICAmCi1NICEoIEIwTCAgI0AgOzYlSTtAITUgIDwgJDAkVEEgMCgoMCRVQUAwKCEgICAgIjwgICAgJyAhKCBMIEwgCi1NICNAIDxXIU88RzFTOFYlUiAnKCAvUEggICIsICEwICNEKUAkIiI0ICAgICcgISggVTBMICAjQCA4VlFVCi1NO0ZNRTxAIVIgIEQqICAgQyAgNCAgX1I3ISBASCAgICAhUCAyIC9UKyAgIFggJllPO0chUjo2VUE8R0QgCi1NPEAjJyIwICAoUCAlICAsNEVQMCgpMCAgICA8ICRAIEIjICAgLiAhUDxGRU04NylZICcoIEIwRCAgIiwgCi1NITAgIykpPCQiIjAgICAgJyAhKCAxQFAgICNAID01XUw6NllLICcoIF0wQCAgIiwgITAgIyApQCQiIjwgCi1NICAgJyAhKCA7MFAgICNAIDxVXUw6NllLICgsICEwICFaQDwgICIsICEwICNGKTwkIiI4ICAgICcgISggCi1NRFBQICAjQCA9RV1VO0ZFTztDKCA8QCIrIFAgIChQICUgIC40RiAwKCkwICAgIDwgJEAiWCMgICAuICFWCi1NN1c1Tjo2XU4gJyggOyAoICAiLCAhMCAjRylAJCIiPCAgICAnICEoIFdQUCAgI0AgPUVdUz0nKVU4VzBSCi1NICcoIDNAJCAgIiwgITAgI08pPCQiIjwgICAgJyAhKCAhQFQgICNAID1FXVM9JylVOFcwUSAnKCArQCAgCi1NICIsICEwICNJKTwkIiJcICAgICcgISggLTBUICAjQCA9RV1EO1c1QjsmNT88Jl1JO0cxRTxAIUMgICwgCi1NIDBcIChQICUgIC5ARVAwKCtAICAgIDwgJEAhQyMwICAuICFWN1Y5TDtWJVQ3VyFPOjZZVDk3KCA4UCAjCi1NICAkLiAiLCAhMCAjVik8JCIjOCAgICAnICEoIEYwVCAgI0AgPUVdVTtHLUk5VllFOSVdTDtWWUc3VyFPCi1NOjZZVDk3KCA4UCAjICAkLCAiLCAhMCAjJik8JCIjMCAgICAnICEoIFMwVCAgI0AgPUVdUzo2PU45NjE/Ci1NOyZdTjlVXVA7VkVOPSY1UiAmLCAgUCAhIlAgQyAgNCAgXVI3ISBATSAgICAhUCAyIC9ILSAgIFggJzk/Ci1NOyZdTjlVXVA7VkVOPSY1UiAmLCAgUCAhIkAgQyAgNCAgVyI3ISBAVSAgICAhUCAyICJcLiAgIFggJzk/Ci1NPTZZUzo2PU45NjE/OjZZVDdXIU86NllUOTcoIDhQICMgICQpICIsICEwICM2KTwkIiMsICAgICcgISggCi1NOEBYICAjQCA9RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyggOFAgIyAgJCggIiwgITAgI0UpPCQiIlAgCi1NICAgJyAhKCBDQFggICNAID1FXUk7RzE/PCZdSTtHMUU8QCFDICAsICAwPCAoUCAlICAtLEVQMCgtUCAgCi1NICA8ICRAIyUjQCAgLiAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyggOFAgIyAgJCYgIiwgCi1NITAgIyApPCQiIzQgICAgJyAhKCBeQFggICNAID1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCFDCi1NICAsICAwNCAoUCAlICAuPEVQMCgrQCAgICA8ICRAIEgjUCAgLiAhVjdXLUg7VylUN1chTzo2WVQ5NyggCi1NOFAgIyAgJCQgIiwgITAgI1opPCQiIzggICAgJyAhKCA3QFwgICNAID1FXVU7Ry1JOVZZRTklXUM6JiVSCi1NN1chTzo2WVQ5NyggOFAgIyAgJCMgIiwgITAgI0IpPCQiIzAgICAgJyAhKCBEQFwgICNAID1FXVM6Nj1OCi1NOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJiwgIFAgISBAIEMgIDQgIF5SNyEgQE0gICAgIVAgMiArXC8gICBYCi1NICc5PzhWQUE8RV1QO1ZFTj0mNVIgJiwgIFAgISAwIEMgIDQgIFgyNyEgQEQgICAgIDAgMiAuLC8gICI1Ci1NICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICNQIEwgICAgIVAgMiAgXDAgICBYICc5PzkmXVU4RlFFCi1NN1YlUjxGJVkgJyggT1BcICAiLCAhMCAjKik8JCIiMCAgICAhICEoICxRICAgKTQgICAiQyAhICAgIEAgCi1NICAgICAgJCAgICAoNTAgLiAiTCAgICAnICEoIDdBICAgI0AgPUVdRjsmXUE9JV1BPEcpQT4wIVIgIFwwCi1NICAgQyAgNCAgXiI3ISBARCAgICAgMCAyICgoMCAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgCi1NIyAgUyAgICAhUCAyICs0MCAgIFggJzk/PTZZUzo2PU45NjE/OyZdTjlVXUE8RylBPjAhUiAlWDAgICBDCi1NICA0ICBWIjchIEBEICAgICAwIDIgLUQwICAiNSAgICBIUCAwICAgKCAgICAgICAhICAgICIlNCAiUCBRCi1NICAgICFQIDIgIEgxICAgWCAnOT88VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA8QCJVJCAgIChQICUgIC0gCi1NRVAwKCkgICAgICQgJEAgTiQwICBFMCAgICosICQgICAiICAgICAgICAwICAgIEE1ICBIICpAICAgIDwgCi1NJEAhOCQwICAuICFWN1ZRTztGPT84NylSODdEIDxAICokMCAgKFAgJSAgL1BFUDAoKSAgICAgJCAkQCFcCi1NJDAgIEUwICAgKiwgJCAgICIgICAgICAgIDAgICAgQTUgIEQgLEAgICAgPCAkQCJOJDAgIC4gIVY3VzVOCi1NPFZFRztGNUQ3VkVOPSVdQTxHKUE+MCFSICVAMSAgIEMgIDQgIFUiNyEgQEQgICAgIDAgMiAtKDEgICI1Ci1NICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICIgIFAgICAgIVAgMiAgKDIgICBYICc5PzxWRUc7RjVECi1NN1ZFTj0lXUE8RylBPjAhUiAqWDEgICBDICA0ICBYUjchIEBEICAgICAwIDIgIjgyICAiNSAgICBIUCAwCi1NICAgKCAgICAgICAhICAgICIlNCAhUCBJICAgICFQIDIgJFwyICAgWCAnOT86NllUN1YlUjxGJVkgJyggCi1NIEEoICAiLCAhMCAjJyk8JCIiMCAgICAhICEoIDxRKCAgKTQgICAiQyAhICAgIEAgICAgICAgJCAgICAoCi1NNTAgJiAjMCAgICAnICEoIElRKCAgI0AgPUVdVTtHLUk5VllFOSVdUzomXVI9JV1BPEcpQT4wIVIgJFwyCi1NICAgQyAgNCAgWCI3ISBARCAgICAgMCAyICxMMiAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgCi1NITAgUiAgICAhUCAyIC9UMiAgIFggJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICcoIElRKCAgIiwgCi1NITAgIzIpPCQiIjAgICAgISAhKCAoMSwgICk0ICAgIkMgISAgICBAICAgICAgICQgICAgKDUwICQgIkwgCi1NICAgJyAhKCAzISwgICNAID1FXVM6Jl1SPSVdQTxHKUE+MCFSIC9UMiAgIEMgIDQgIFdSNyEgQEQgICAgCi1NIDAgMiAnIDMgICI1ICAgIEhQIDAgICAoICAgICAgICEgICAgIiU0ICBQIFMgICAgIVAgMiAqLDMgICBYCi1NICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVIgJFAzICAgQyAgNCAgX0I2ISBARCAgICAgMCAyCi1NICw8MyAgIjUgICAgSFAgMCAgICggICAgICAgISAgICAiJTQgIEAgUSAgICAhUCAyIC9AMyAgIFggJzk/Ci1NPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0QgPEAiQyRQICAoUCAlICAsWEVQMCgpICAgICAkICRAIDwlICAgCi1NRTAgICAqLCAkICAgIiAgICAgICAgMCAgICBBNSAgJCAqQCAgICA8ICRAISYlICAgLiAhVjdWLUg4Nyk/Ci1NODcpUjg3RCA8QCNYJFAgIChQICUgIC80RVAwKCkgICAgIDwgJEAhSiUgICAuICFWN1YxTz02KUw5MCE1Ci1NICBcIChQICUgICwoRVAwKChQICAgIDwgJEAiLSUgICAuICFWN1Y5TDtWJVQgJTQgI0AgQyAgNCAgU1I3Ci1NISBASyAgICAhUCAyICtANCAgIFggJzk/PTZZUzo2PU45NjE/OyZdTjlQITUgIFAgKFAgJSAgLVhFUDAoCi1NKjAgICAgPCAkQCNBJSAgIC4gIVY3Vy1JOVZZRTklXUw7VllHICU0ICJQIEMgIDQgIF9SNiEgQEIgICAgCi1NIVAgMiAgLDUgICBYICc5PzsmXU45UCE1ICBIIChQICUgIC1IRVAwKCpAICAgIDwgJEAgTSUwICAuICFWCi1NN1c1TjxWRUc7RjVEN1ZFTj0gITUgIEQgKFAgJSAgL1RFQDAoKiAgICAgPCAkQCE1JTAgIC4gIVY3Vy1JCi1NOVZZRTklXUk7RzAgNTAgKCAiLCAhMCAjXCk4JCIiJCAgICAnICEoID1BNCAgI0AgPUVdSTtHMCA1MCAnCi1NICIsICEwICMkKTwkIiJQICAgICcgISggSEE0ICAjQCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0gITUgIDggCi1NKFAgJSAgLCRFUDAoKkAgICAgPCAkQCMsJTAgIC4gIVY3Vy1JOVZZRTklXVM6Jl1SPSAhNSAgNCAoUCAlCi1NICAtPEVQMCgoUCAgICA8ICRAI08lMCAgLiAhVjdXLUg7VylUICU0ICEgIEMgIDQgIFZSNyEgQEsgICAgCi1NIVAgMiAhSDYgICBYICc5Pz02WVM6Nj1OOTYxPzhWQUE8QCE1ICAsIChQICUgICxaRVAwKCowICAgIDwgCi1NJEAhIyVAICAuICFWN1ctSTlWWUU5JV1DOiYlUiAlNCAgQCBDICA0ICBXMjchIEBCICAgICFQIDIgJjQ2Ci1NICAgWCAnOT84VkFBPEAhNSAgJCAoUCAlICAvWEVQMCghICAgICA8ICAgICAgICIyIEAgIDMoLCQiJ0QgCi1NICAjX19QICAgICFaICAgIF9fXDAgICAgPlAgICAvX18oICAgICdUICAgI19fUyAgICAhXiAgICBfX10gCi1NICAgID9QICAgL19fNCAgICAoJCAgICNfX1YgICAgIiIgICAgX19dUCAgICBAUCAgIC9fX0AgICAgKDQgCi1NICAjX19ZICAgICImICAgIF9fXkAgICAgQVAgICAvX19MICAgIChEICAgI19fXCAgICAiKiAgICBfX180Ci1NICAgIExAICAgL19fWiAgICArNCAgICNfX15YICAgIlYgICAgX19fVSAgICBNUCAgIC9fX18gICAgK0QgCi1NICAjX19QLCEgICJaICAgIF9fXCwgMCAgTlAgICAvX18lMCQgICtUICAgI19fUVghICAiXiAgICBfX1xICi1NIDAgIE9QICAgL19fLEAkICAsJCAgICNfX1NQISAgIyIgICAgX19dJiAwICBQUCAgIC9fXzQgJCAgLDQgCi1NICAjX19VSCEgICMmICAgIF9fXUQgMCAgUjAgICAvX18+ICQgICxIICAgI19fWCghICAjKyAgICBfX14sCi1NIDAgIFMwICAgL19fRUAkICAsWCAgICNfX1ooISAgIy8gICAgX19eTiAwICBUMCAgIC9fX05AJCAgLSggCi1NICAjX19cMCEgICMzICAgIF9fXy4gMCAgVTAgICAvX19WICQgIC04ICAgI19fXighICAjNyAgICBfX19MCi1NIDAgIFYwICAgL19fXUAkICAtSCAgICNfX1AgIiAgIzwgICAgX19cNCBAICBXMCAgIC9fXydAKCAgLVggCi1NICAjX19SQCIgICNAICAgIF9fXFIgQCAgWDAgICAvX18vICggIC4oICAgI19fVDgiICAjRCAgICBfX10wCi1NIEAgIFkwICAgL19fNkAoICAuOCAgICNfX1YwIiAgI0ggICAgX19dTiBAICBaMCAgIC9fXz4gKCAgLkggCi1NICAjX19YKCIgICNMICAgIF9fXiwgQCAgWzAgICAvX19FQCggIC5cICAgI19fWiAiICAjUCAgICBfX15KCi1NIEAgIFwwICAgL19fTSAoICAvKCAgICNfX1tYIiAgI1QgICAgX19fKCBAICBdQCAgIC9fX1RAKCAgLzwgCi1NICAjX19dWCIgICAgICAgIF9fX0kgQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgMCAgICAkICAgICIgICAgVSggJCItMCAgICAzICAgICAgICAgICAgCi1NICAgISAgICAgICAgICBEICAgICUgICAgIEAgICAuQiAhIENIICAgIDEgICAgICwgICAgICAgICAhICAgCi1NICAwICAgIC8gICAgIlAgICAgKCAgICBMQDAwKCsgJCAgLCAgICAgJCAgICAgMCAgICAwICAgIDAgICAgCi1NJVAgICAgLCAgICAiICAgIFsoJCQiLlAhICAhWyAgICAgICAgICAgICAgICEgICAgICAgICAhXCAgICApCi1NICAgICBAICAgJkIiISBBSCBAICAoICAgICAsICAgICcgICAgISAgICAgQCAgICBIICAgICAwICAgIDggCi1NICAiKEBAMChCICggICAkICAgICAgICAgICAgICAgMCAgICAgICAgICtAICAgICQgICAgJiAgICBDKCgkCi1NIihQIiAgITAgICAgICAgICAgICAgICAkICAgICEgICAgIywgICAgISAgICAhQCAgIC1SIiEgQzwgQCAgCi1NNjAsICAgICAgICAgICAgICEgICAgICAgICAgWSAgICAgMCAgICA4ICAgIFhBQDAoLiA4ICAgJCAgICAgCi1NICAgICAgICAgIDAgICAgICAgICAvUCAgICAkICAgICIgICAgLyg4JCIjUCYgICBAICAgICAgICAgICAgCi1NICAgJCAgICAgICAgICQ8ICAgICEgICAgIFAgICAlUjYhIEE8IUAgICIgICAgICAgICAgICAgICAhICAgCi1NICAgICAgIS0gICAgIDAgICAgLCAgICFERUAwKDkgOCAgIVAgICAgICAgICAgICAgICAwICAgICQgICAgCi1NNEAgICAgOCAgICAjICAgIEApOCQiKCAmICAhUCAgICAhICAgICAgICAgICQgICAgIiAgICAlTCAgICAoCi1NICAgICBQICAgLyI2ISBDUCFAICBNICQgICAgICAgICAgICAgISAgICAgICAgICFAICAgICBAICAgICAgCi1NICAgICAgICBcIDggICAgJyAgIDAgICAgJyAgICAgMCAgICAwICAgIDogICAgICwgICAgICAgICAgICAgCi1NIC8gLSAgIzQhICAgICAgICAgICAgICAhICAgICAgICAgJyAgICAgIyAgICAgICAgICAgICAgIyQkQCAgCi1NRCAgICAgICAgICAgICAgICAwICAgICAgICAhWiAgICAgMCAgICAgICAgICAgICAgNSEsICAiKCIgICAgCi1NICAgICAgICAgICQgICAgICAgICBAUCAgICAkICAgICAgICAgICAgICAnQDUgICFQJUAgICAgICAgICAgCi1NICAgJCAgICAgICAgIChIICAgICEgICAgICAgICAgICAgICNIKlAgIERAKCAgICAgICAgICAgICAgMCAgCi0lICAgICAgICAKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pODYwLWVsZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9pODYwLWVsZi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTZlODNiLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvaTg2MC1lbGYudQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi1iZWdpbiA3NzUgaTg2MC1lbGYKLU0/VDUsMUAkIiAwICAgICAgICAgICAgICIgIDwgICAgISAgIDMyICAgICMwICAjLTQgICAgICAgVCAiICAKLU0hMCBIICE0ICQwICAgIDggICAgVCAgIDAtICAgICAgICAgIkAgICAgSCAgICAgNCAgICAgICAgICBQICAKLU0gLTAgICAgICAgICAgICAgICEsICAgICAgICAgISAgICAgICAgICAhICAgIC0gICAkIzAgICAgICAgICgKLU1cICAgIi8gICAgICUgICAwICAgICAgJCAgIEREICAgSSkgICAgICAgICAiOCAgICI3ICAgICA4ICAhICAKLU0gICAgIEAgICI0UCAgIkUsICAgICAgICAgJyAgICAgICAgICAhUCAgICAgTz03LVIrVlFJOEJdTDo2KUMKLU0rRy1PK0MkICAgICAgICwgICAgLCAgICAhUCAgICBQICAgICsgICAgICAgICAgICAgICAgICAgICBAICAKLU0gICAgICAgIyAgICAhMCAgICAgICAgICYgICAgISAgICAgRCAgICAqICAgICIgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAhICAgICAwICAkTSAgICAhLCRAICAgICAgICBIICAiTiAKLU0gICAgICEkIF9fJCAgICAvICAgSSogICAgIDAxICAgKyAgICAmICAgJjIwICAgICAkMCNfXDAgICAhXCAKLU0gIStMICAgIEYhKCAgICAgICAgRiAgIElPICAgICAgMSAvX1EgICAgKzAgICRSMCAgICAgJEAgICAgICAKLU0gIyggICFEMCAgICAhISQgICBIICAgIF8gICAzIiAgICAgIDIgICAgICAgIDIwICAqMyAgICAgICQwI18KLU1cMCAgICVcICAiRSwgICAgICEkIF9fJCA3Vi1MOTYlTj03ICA3VjVOOSAhPzk2WVY6NylPO0AhPzk3MUUKLU0+JzAgODcxRT4mRVQgJV1FOSYlVDgwIUU+JkVUICVdTDo2KT89RjVSPFZFTztAIT83VjlQPFcxQTxHMCAKLU03VD0sM1QpITMlXS8xRDkzMTUxPzUkJSIzJDU/ICVdJDY0WSEzNEUjICJdVTxXKE87JkVCK1ZRSThGLE4KLU08VlxOLDAgICAgIEkvICAgIEAwICAgICAgICBJMCAgICFAMCAgICAgICAgSTEgICAiQDAgICAgICAgIEkKLU0yICAgIiAwICAgICAgICAgICogICAgISAgIEAgSCAgICAqICAgICA3X1JEWVshXCAgIT8+KjM1ICAvQCAKLU0lX1xJLz5QPyAgI0QnMCAgMCAjWCAmT19fXztPTzAgIFshXCAgLlA+ICAhICAvQCAlX1xJMD5eXSAgI0QKLU0nMCAsWyFYICAmT19fXlw3X1JFJVshXCAgLjA9ICFBICAvQCA6X19fWi5eXSAgI0wnUCAgWyFYICAkICAKLU1eICA3X1JFKVtbVCAgLjA9ICIzTCdAICA6X19fWDogICAgIyggICA0JyQgICA4MSJfXyJAMFAgICckICAKLU0hPlAwICAjNDBAIC82QCAgIE44MCRNIkAgICAgO19fX1guPz8qNFNMJ0AgIDtfX19WVU9AICArTCQgICAKLU1IKSAgIC44MCYwIU9fX184SCAgICAmX19fXD5AICAgIDtfX19WWjgyICAoNDwgIDFBRSggJigpMiYgID8KLU1ZOSRJWyFcICAmUCAgKUokPDAgNDtfX19VWiAgICAiQCQgICBIICAgICQ/QF4gIiQnUCAhSFwkICAqIF8KLU0gICJAICAgIDAgI1ggKiAgICAiQCAgICBIICAgICxAICAgUDwwIUAhQSQrX1wqIDAgICIkMFAgICUmLCAKLU0gODFfICEiR1hAICAwICAoICogICAgIyggICAsJyQgOCA4MSJfXyJAJCAgIEEkLCAgITFDICAmJD9QIDAKLU1JXiggICQgICIgIkAgICAgUiAgICMhUSAmICYkME9fUEghICAgKDEjICAgNDhQICFBJ1wgJCo/QiAgISAKLU0gIEAgSCAgICAsQCAgIFA8MCFAIUEkK19cKiAwICAiJDBQICAlJiwgIDgxXyAhIkdYQCAgMCAgKCAqICAKLU0gICMoICAgLCckIDggODEiX18iQCQgICBBJCwgICExQyAgJiQ/UCAwSV4oICAkICAiICJAICAgIFIgICAKLU0jIVEgJiAmJDBPX1BIISAgICgxIyAgIDQ4UCAhQSdcICQqP0IgICEgICBAIEggICAgLEAgICBQPDAhQCEKLU1BJCtfXCogMCAgIiQwUCAgJSYsICA4MV8gISJHWEAgIDAgICggKiAgICAjKCAgICwnJCA4IDgxIl9fIkAKLU0kICAgQSQsICAhMUMgICYkP1AgMEleKCAgJCAgIiAiQCAgICBSICAgIyFRICYgJiQwT19QSCEgICAoMSMKLU0gICA0OFAgIUEnXCAkKj9CICAhICAgQCBIICAgICxAICAgUDwwIUAhQSQrX1wqIDAgICIkMFAgICUmLCAKLU0gODFfICEiR1hAICAwICAoICogICAgIyggICAsJyQgOCA4MSJfXyJAJCAgIEEkLCAgITFDICAmJD9QIDAKLU1JXiggICQgICIgIkAgICAgUiAgICMhUSAmICYkME9fUEghICAgKDEjICAgNDhQICFBJ1wgJCo/QiAgISAKLU0gIEAgSCAgICAsQCAgIFA8MCFAIUEkK19cJEAoIDxGJDBQICAlJiwgIDgxXyAhIkdYQCAgMCAgKCAqICAKLU0gICMoICAgLCckIDggODEiX18hKCIgJylBJCwgICExQyAgJiQ/UCAwSV4oICAkICAiICJAICAgIFIgICAKLU0jIVEgJiAmJDBPX1BbIVwgICgxIyAgIjQnICAhI140IlMgX0VYRDNMJ1AgIFshXCAgKTA8ICAqNCcgICMKLU0jXjdCIkFfRVhDU0wnUCAgWyFcICApMDwgIDI0JyAgJSdeN0IrIV9FWD0zTCdQICBbIVwgICkwPCAgOjQKLU0nICAnJ143QVgxX0VYPDdMJ1AgIFshXCAgKTA8ICBCNCcgICknXjdBUDFfRVhDR0wnUCAgWyFcICApMDwKLU0gIEo0JyAgKydeN0FTMV9FWERHTCdQICApXyA5KE5QPyAgIE9cIkguWyFcICAiP1AmMUNMJ1AgICtfIEkKLU1WLlA/ICAgJ18iSyxbIVwgICBfRVhKQ0wnUCAgIV9QSjEuUD8gICAvWT4oKFshXCAgID9cKkBLTCdQICAKLU0jXjdBUi5QPyAgIDdfIkhcWyFcICAhX0VYRFNMJ1AgICVfUEorLlA/ICAgP1k+KDhbIVwgICE/XCo9M0wKLU0nUCAgJ143QjQuUD8gICA3XyJHQVshXCAgIV9FWD5XTCdQICAlX1BJUT5QPyAgID9ZPik9WyFcICAhP1wKLU0qPCdMJ1AgICdeN0IoPlA/ICAgN18iSFlbIVwgICFfRVhMN0wnUCAgJV9QSVM+UD8gICA/WT4oMVshXCAKLU0gIT9cKkRHTCdQICAnXjdCLD5QPyAgIEdcIkguWyFcICAiX1AqSztMJ1AgIClfIElWLlA/ICAgT1wiR1gKLU1bIVwgIC4/XCpMU0wnUCAgJ143QjU+UD8gICNHXyJJJFshXCAgIV9FWEwnTCdQICBZX1BKIk5QPyAgID8KLU1ZPik5WyFcICAuP1wqQ1NMJ1AgICdeN0JPPlA/ICAjR18iSExbIVwgICFfRVhGV0wnUCAgWV9QSVUuUD8KLU0gICA/WT4nMVshXCAgLj9cKj4jTCdQICAnXjdCJz5QPyAgI0dfIkckWyFcICAhX0VYRjdMJ1AgIFlfUEkKLU1QLlA/ICAgP1k+KElbIVwgIC4/XCpDQ0wnUCAgJ143QjA+UD8gICNHXyJHLFshXCAgIV9FWEsnTCdQICAKLU1ZX1BKMi5QPyAgID9ZPidJWyFcICAuP1wqQFNMJ1AgICdeN0JLPlA/ICAjR18iRzhbIVwgICFfRVhHJ0wKLU0nUCAgWyFcICApMDwgICo0JyAgIideN0FdMV9FWD43TCdQICBbIVwgICkwPCAgJjQnICAhJ143QzoxX0UKLU1YTSdMJ1AgICVfUEo6PlA/ICAgP1k+KzlbIVwgICE/XCpXQ0wnUCAgJ143QzwuUD8gICA0OFAgIUEnXCAKLU0kKj9CICAhICAgQCBIICAgICQgICIgIkAgICAgSCAgICAgICAgICAgICAgIDAmRCAgICAgICAhIlIgICAKLU0gICAgICAgICAgICAgICAgICAgSTMgICAgICAgICAgICAgIDJXICAgJE9AICAhLDQgICAzLCAgICAgJCAKLU0gICFIICAgICMgICAkSyAgICAgLSAgIDkgICAgICAwICAhI0ggICAgITAgICRAICAgICAmICAgMSwgICAKLU0gIEggICAhWyAgICAiUCAgICEgICAgIDUgICAgICAgICAgLCAgIkRQICAgICBAICAgIyAgICAgNCAgICAKLU0hUCAgICE8ICAhKVwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkICAgICAKLU0gICAgICAwIF9fJCAgICAgICAgMFUgICAgICAjICAgISAgICAgICAgJC5AICAgICAgUCAgIEAgICAgICAKLU0gISRQICAgICAgLCAgICwgICAgICAgIDIgICAgICAgIyAgICQgICAgICAgICRHUCAgICAgIFAgICEwICAKLU0gICAgICEqUCAgICAgICwgICA4ICAgICAgICAyUCAgICAgICMgICAnICAgICAgICAkVCAgICAgICBQICAKLU0iICAgICAgICAhRCAgICAgICAsICAgRCAgICAgICAgOSQgICAgICAjICAgKiAgICAgICAgKjIwICAgICAKLU0gUCAgIlAgICAgICAgIkRQICAgICAgLCAgIFAgICAgICAgIEkzICAgICAgIyAgIC0gICAgICAgICo8ICAKLU0gICAgIFAgICNAICAgICAgICAgICAgICAgICwgICBcICAgICAgICAgICAgICAgICMgICAwICAgICAgICAKLU0gICAgICAgICBQICAkMCAgICAgICAgICAgICAgICAsICAhKCAgICAgICAgICAgICAgICAjICAgMyAgICAKLU0gICAgICAgICAgICAgUCAgJSAgICAgPCAgICAgICAgICAgMCBfXyQgICAgLiAgICAgICAgICAgJCAvX1EKLU0gICAgJTAgICAgICAgICAgISAjX1wwICAgIiQgICAgICAgICAgIDAgX18kICAgIEkgICAgICAgICAgICQKLU0gL19RICAgICxQICAgICAgICAgICEgI19cMCAgICNIICAiRyAgICAgISEkICAgWCAgICEpICAgSVEgICAKLU0gIDAxICAgLiAgICA1QCAgJF9AICAgIEAkQCAgIiAgICAmKCAgIUQgICAgICAhKCAgIEQgICAhSCAgIEkKLU1SICAgICAoMSAgIC4gICAgP0AgICVCQCAgICs4JEAgICIgICAgKCwgICJHLCAgICAhISQgICBYICAgIjEKLU0gICBJVCAgICAgMDEgICAuICAgIEpAICAkWCAgICAhLCRAICAgICAgICssICAiTiAgICAgICEkIF9fJCAKLU0gICJYICAgSVUgICAgICgxICAgLiAgICBSMCAgJSwgICAgIEAkQCAgIiAgICAtXCAgIkc4ICAgICIhJCAKLU0gIFggICAjSCAgIElYICAgICAwMSAgIC4gICAgW0AgICRUQCAgICAgJEAgICIgICAgLzQgICJHRCAgICAKLU0hISQgICBYICAgJCAgICBJKiAgICAgMDEgICArICAgISIwICAqPkAgICAgJCQwICAjQCAgIDIkICAiR0wKLU0gICAgIiEkICAgWCAgICRNICAgSV0gICAgIDAxICAgLiAgICEtMCAgJSIgICAgIEAkQCAgIiAgICA0QCAKLU0gIkdYICAgICQhJCAgIFggICAlNyAgIDkpICAgICAgMSAvX1EgICAhN0AgICpAQCAgICAiJDAgICNAICAKLU0gNyggICJIKiAgICAgMSQgICBYICAgJiIgICBKIyAgICAgMDEgICAuICAgIUJAICAqQSAgICAgKCQwICAKLU0jQCAgIDlYICAhMzAgICAgRiEoICAgICAgICZFICAgSSogICAgIDBBICAgKyAgICFLMCAgJTYgICAgIEAKLU0kQCAgIiAgICA7RCAgIkg4ICAgICEhJCAgIFggICAnLiAgIDVMICAgICIgMiAgICggICAhWFAgICpBUCAKLU0gICAkJDAgICNAICAgPyQgICJGXCAgICAgISQgX18kICAgJ1ggICA0PCAgICAiIDIgICAoICAgIiEwICAKLU0qQiAgICAgKCQwICAjQCAgIEFIICAiSEggICAgISEkICAgWCAgIChRICAgNFogICAgIiAyICAgKCAgICIKLU0vICAgKkJQICAgICIkMCAgI0AgICBETCAgITc4ICAgICghKCAgIEAgICApOCAgIDc8ICAgICAgMiAgICAKLU0gICAiNzAgICpDICAgICAoJDAgICNAICAgRywgICJIWCAgICAhISQgICBYICAgKVogICBKLyAgICAgKDEKLU0gICAuICAgIkBAICAqRCAgICAgJCQwICAjQCAgIEkkICAiSSQgICAgIDEkICAgWCAgICo/ICAgSjIgICAKLU0gIDAxICAgLiAgICJLUCAgKkRQICAgICQkMCAgI0AgICBLVCAgIkkwICAgICEhJCAgIFggICArNCAgIDkKLU0kICAgICAwMSAgICogICAiWDAgICRdQCAgICAgJEAgICIgICAgTkQgICJJNCAgICAhISQgICBYICAgK1gKLU0gICBKNiAgICAgMDEgICAuICAgIyQgICAqRVAgICAgKCQwICAjQCAgIFIsICAhOEAgICAgICEoICAgICAKLU0gICxNICAgSjkgICAgIDAxICAgLiAgICMwQCAgKkZAICAgICQkMCAgI0AgICBURCAgIkRQICAgICAhJCAKLU1fXyQgICAtPyAgIEo7ICAgICAwMSAgIC4gICAjPUAgICpHICAgICAkJDAgICNAICAgWDwgICJERCAgICAKLU0hISQgICBMICAgLjkgICBKPiAgICAhQDEgICAuICAgI0hQICAqSSAgICAgOCQwICAjQCAgIFpUICAiSkgKLU0gICAgIEEkICAgWCAgIC5aICAgSksgICAgIDAxICAgLiAgICNSQCAgKksgICAgICQkMCAgI0AgICBeICAKLU0gITggICAgICghKCAgIEAgICAvTiAgIDUkICAgICIgMiAgICggICAkICAgICo0UCAgICAgJDAjX1wwICAKLU0hIEQgICJKVCAgICAiISQgICBYICAgMDcgICBKTyAgICAgMDEgICAuICAgJClQICAlOEAgICAgQCRAICAKLU0iICAgISNIICAiSyAgICAgISEkICAgWCAgIDEwICAgSlEgICAgIEAxICAgLiAgICQ3MCAgJEsgICAgICAKLU0kQCAgIUAgICEmLCAgIkssICAgICAxJCAgIFggICAxSiAgIEpUICAgICAwMSAgIC4gICAkPEAgICUkQCAKLU0gICBAJEAgICIgICAhKDwgICJLOCAgICBEISQgICBYICAgMi4gICBLOiAgICAgMDEgICAuICAgJEYgICAKLU0lKUAgICAgQCRAICAiICAgISpQICAiTVAgICAgIiEkICAgWCAgIDJVICAgSz4gICAgIEAxICAgLiAgICQKLU1PMCAgJTNAICAgIEAkQCAgIiAhRzkmKU05MCFDPEcwUStHLCA4VylUOjJZUyAnOUE7JzVFPFJVOD0iWUMKLU0gJj1EOEZVRStGLCA8VkE/OSYlVDgyWUMgJi1SPSZYTjxQIVY3VzVOPFZFRztGNUQ3VkVOPSAhVjdXLUkKLU05VllFOSVdSTtHMCA9RV1DOiYlUjdWOVU7RiwgN1Y5STtGRCA9RV1VO0ctSTlWWUU5JV1DOiYlUjdWJVIKLU08RiVZICZVQTo2WCA9RV1TOjY9Tjk2MT87Jl1OOVAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQKLU05NyggN1YtTDk2JU49NyAgN1Y1TjkgIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVCAnOT89NllTOjY9Tjk2MT8KLU08VkFPPEcxPzlHNU44UCFWN1YxTz02KUw5MCFWN1ZFTj0gIT88VzFBPEcwIDtGXU48JylJOzYlUj4wIT8KLU05NllWOjcpTztAIVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdWRU49JV1BPEcpQT4wIVAKLU08RkVNODcpWSAnOT88VkVHO0Y1RDdWLUg4Nyk/OUc1TjhQIVY3VjFPPTYpTDk1XUE8RylBPjAhPzk3MUUKLU0+JzAgPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdWLUg4NyggPUVdRjsmXUEKLU09ICFWN1ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZICYlVDk3QUk9ICFFO0c5STxGXU4gJzk/OyZdTjlVXUYKLU09NllDICc5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAnOT89NllTOjY9Tjk2MT87Jl1OOVVdRj02WUMKLU0gJzk/OjZZVDdXIU86NllUOTcoIDdWNUQ4NzFBICc5PzxWQU88RzE/OUc1TjhQIVY3VzVOPFZFRztGNUQKLU03VkVOPSVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAnOT86NllUN1Y5VTtGLCAKLU09RV1TOjY9Tjk2MT88VkFPPEcwID1FXUY7Jl1BPSVdRj02WUMgJjVYOjcwID1FXVU7Ry1JOVZZRTklXUwKLU07VllHN1YlUjxGJVkgJzk/OyZdTjlQIVY3Vy1IO1cpVCAnOT87Jl1OOVVdUDtWRU49JjVSICc5PzxWRUcKLU07RjVEN1YtSDg3KCA9RV1VO0ctSTlWWUU5JV1MO1ZZRyAnOT88VkFPPEcxPzg3KVI4N0QgPUVdVTtHLUkKLU05VllFOSVdUzomXVI9JV1BPEcpQT4wIT87JkVCN1c5RTxHLUk7VlggN1ZVQztXNU49ICFWN1YtSDg3KT8KLU08Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAhVjdXLUk5VllFOSVdSTtHMT8KLU04NylSODdEIDdVXUY8Jy1UODcpVCAnOT88VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJy0/OyZFTjpQIT8KLU0xVFEvMEQlLDdUXSYxRS0lNSVdNDA0KSwxNVwgPUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIVYKLU03VjFPPTYpTDk1XVA7VkVOPSY1UiAlXT87Jl1OOVYxTz02KUw5NV1VPFY1RCAnOT88VzFSPTYtVCwwIVYKLU03Vy1UPEc1Qz0jKCA9RV1DOiYlUjdWJVI8RiVZICc5PzlGUU84NzE/PCZdSTtHMUU8QCFWN1ctSTlWWUUKLU05JV1MO1ZZRzdXIU86NllUOTcoID1FXUQ7VzVCOyY1PzlHNU44UCFWN1ctSTlWWUU5JV1JO0cxPzlHNU4KLU04UCE/MSVFLjA0VSkwUCFWN1Y5TDtWJVQ3ViVSPEYlWSAnOT88VkFPPEcxPzwmXUk7RzFFPEAhVjdXLUkKLU05VllFOSVdTDtWWUc3VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJzk/OyZdTjlVXUEKLU08RylBPjAhPzo2WUk9ICFWN1YtSDg3KCA4VlFVO0ZNRTxAIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzlHNU4KLU04UCFVN1ZRSTtGTCA8VyFPPEcxUzhWJVIgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgPUVdVTtGRU8KLU07QyggPUVdVTtGRU87QCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDICAgTjo2WVQ5NylQICJZSDg3LUgKLU0gIllEPjZZUz42VCArRjFZO0ctVDxAIE48RjVMODJZUDsnMCArRkVOOjcwICtHIUw9ICBOPSY1WD0gIE4KLU05RkVOOjAgTjxGXUQ4NzFBICJZRDg3MUEgIllHO1cwICtGMVk7RiVNOjYsICtGKVM8UCBOPFdFTT0mJUIKLU0gIllTPScpVDg2KCArRy1IPFcxUj0mJUIgIllDO1ZVTTk2WVQgIllEOTYpVTlQIE47JkVOOTAgRDImNUEKLU05JjVSLkIgTzwiXTIwVSxPPTcxSTsjKE0sQlhRK1c1UzxCXVM8RixPOyZFQitWUUk4RixPOjNAViwiXUMKLU08VzRPOFcpVCwyWVMrJzhALEJYUSgjRFIrUyBVK1MkVCgjIFcuQyRWLkMoUCgmMUE9RkVEO1Y5RigkNVgKLU08IiBEICQgSChSRSY1JUBALEJYUStDIE4sMiFTOFYxRS5CXVU8VyhPOFYtUytWUUk4Ql1DPEcwUStGXCAKLU0pJEFFODYxRTxDSEArVyBPNEQtMytXNVQ6NlBSKzMoTiwyXVU8VyhPPFcpQytWUUk4Ql1MOjYpQytWRFgKLU0tQyBPOFctVStWLVI9JkROPFJRVigjKE4sMiBZLEJcUC0yXFEtIiBQLVNIUS1DSFIsMiFEODc5STkmXUYKLU05QiElPicgQCkgISAqIixJMUUxOCgjKE4sMlhQK0MkQDxWLUQ5M0hPPTctUitWLUM8Ul1MOjYoTzhXKVQKLU06MllPICIxKDk2JUQ5NyhaKCJdUCtVKSM0Ul1VPSZFTCxCVFIrQyRPPTctUitXLVI4Ul1MOjYoTzsmRUIKLU04Ul1QO1cpVCtWPUU7Ql1WODZRVTk3LE02JzBOOFJRVigjKE4sMiBZLEJcUC0yXFEtIiBQLVNIUi1TSFAKLU0sQiFEODc5STkmXUY5QiElPicgQCkgIEQyJjVBOSY1Ui5CIE88Il0yMFUsTz03MUk7IyhNLEJYUStXNVMKLU08Ql1TPEYsTzsmRUIrVlFJOEYsTzo2WUMrVy1ZO0ZdTj42VVMrRkBMPUIgUitDJEAuMyhPLCM0TywzMEAKLU0sIzxaLEMoWiwzREA5JiVWOjYxTzlGOEAxN0FQKCIwICkkQUU4NjFFPENIQCtXIE80RC0zK1c1VDo2UFIKLU0rMyhOLDJdVTxXKE88VylDK1ZBRTg2ME87NiVUOiJZSCsnOEAsQlhRKCNEUitTIFUrUyRUKCMgVy5DJFIKLU0uQzRXKCYxQT1GRUQ7VjlGKCQ1WDwiIEQgJiVDO1ZVUC5CIEg0VC0kMTJEQC0yWFAoIyRSK1MgWCtTQFkKLU0gJiVTLkIgSDRULSQxMkRALTJYUCgjJFIrUyBYK1NAWSAkIEgoUkUmNSVAQCxCWFErQyBOLDIhUzhWMUUKLU0uQl1VPFcoTzhWLVMrVlFJOEJdVjg2UVU5NyxNNicwTjtQIUE4Vl1NPCNIQColLSMxJDRJKCM0TiwiIFEKLU0sQlxQLiJcWC4wIUE8U0hAKiUtIzEkNEkoIzROLCIgUSxCXFAuIlxYLjAgRDImNUE5JjVSLkIgTzwiXTIKLU0wVSxPPTcxSTsjKE0sQlhRK1c1UzxCXVM8RixPOyZFQitWUUk4RixPOjNAViwiXUc5NlhPPFZBPzkmJVQKLU04MllDKyc4QCxCWFEoI0RSK1MgVStTJFQoIyBXLkMkVy5DNFQoJjFBPUZFRDtWOUYoJDVYPCIgRCAmJUMKLU07VlVQLkIgSDRULSQxMkRALTJYUCgjJFIrUyBYK1NAWSAmJVMuQiBINFQtJDEyREAtMlhQKCMkUitTIFgKLU0rU0BZICQgSChSRSY1JUBALEJYUStDIE4sMiFTOFYxRS5CXVU8VyhPOFYtUytWUUk4Ql1MOjYpQytHLU8KLU0gIjEoOTYlRDk3KFooIl1QK1UpIzRSXVU9JkVMLEJUUitDJE89Ny1SK1ctUjhSXUw6NihPOyZFQjhSXUkKLU0uIzhQK1YtUz0yXUM8RzFOK0csTD1CIFIrQyRALjMoTywjNE8sMzBALCM8WiwzOFosQyhAOSYlVjo2MU8KLU05RjhAMTdBUCgiMCAwIkBDKjQ5NDYiIFIrQyROLCJYUSgnLUM5JjRaK1c1UzxCXUM4VyxPOyZFQitWLVIKLU09JlhOO1AgQDsmMEAuQiBINFQtJDEyREAtMlhQKCMkUitTIFgrU0BZICAgICAiWCAkMCAyICAgNjwgIFgKLU05VjFCOzY0TjhQICEtQCAgICAkISQwICAkXyAhKDAgICYwICEhQCAgICAgICAgID0gISwgJEAgICA0WCAKLU0uJzE/PFcxUj02LVQgICJWICAgICYgICAgIkggIzAgMiAgICA9MCBYPUVdQzomJVI3VlVFOzYpRTxAICAKLU01MCAhICIsICFAMCAgICAgIVAgICAiTCAjMCAyICAgIEggIFg9RV1TOiZdUj0lXU05NlVCOTcoICAlNCAKLU0hICBDICA4JCAgICAgQDwgICAgSSAgVCAkQCAgICxEIC4nOT86NllUN1ZVRTs2KUU8QCAgNTAgJyAiLCAKLU0hQDAgICAgJCFQICAgIkggIzAgMiAgICBcUCBYPUVdTDtWWUc3VlVFOzYpRTxAICA1MCAqICIsICFAMCAKLU0gICAoIVAgICAiTCAjMCAyICAgISdAIFg9RV1GOyZdQT0lXU05NlVCOTcoICAlNCAjQCBDICA4JCAgICAKLU0jIDwgICAgTCAgVCAkQCAgIDRIIC4nOT85Jl1VOEZRRTdWVUU7NilFPEAgIDUwIC8gIiwgIUAwICAgIDAKLU0hUCAgICAwICAgIDsgISwgJEAgICBGUCAuIlhQOUYlSzkwICBNQCAgICFAICAgIEogIFQgJEAgICA5LCAKLU0uJzk/OFZBQTxFXU05NlVCOTcoICAlNCAgMCBDICA4JCAgICAgIDwgICAgSyAgVCAkQCAgIDtYIC4nOT8KLU08VkFPPEcxPzs2NU04RjVSICAhNSAgMCAoUCAmISAgICAgKCcgICAgKjAgLSAhKCAgICdHICNBVjdWRU4KLU09JV1NOTZVQjk3KCAgJTQgIVAgQyAgOCQgICAgISA8ICAgIEogIFQgJEAgICBBJCAuJzk/OyZdTjlVXU0KLU05NlVCOTcoICAlNCAiQCBDICA4JCAgICAiIDwgICAgSyAgVCAkQCAgIENQIC4nOT85RlFPODcxPzs2NU0KLU04RjVSICAhNSAgWCAoUCAmISAgICAgUCcgICAgKyAgLSAhKCAgIClIICNBVjdWMU89NilMOTVdTTk2VUIKLU05NyggICU0ICNQIEMgIDgkICAgICQgPCAgICAkICAgICcgIDcgISggICAuKyAjQVQ3VzVOOjZdTiAgIlYKLU0gICAgIiAgICAiSCAjMCAyICAgIkxAIFg9RV1DOiYlUjdWVUU7NilFPEAgIDUwICEgIiwgIUAwICAgICAKLU0hUCAgICJMICMwIDIgICAiVzAgWD1FXVM6Jl1SPSVdTTk2VUI5NyggICU0ICEgIEMgIDgkICAgICAgPCAKLU0gICBJICBUICRAICAgUDggLic5Pzo2WVQ3VlVFOzYpRTxAICA1MCAnICIsICFAMCAgICAgIVAgICAiSCAKLU0jMCAyICAgIywgIFg9RV1MO1ZZRzdWVUU7NilFPEAgIDUwICogIiwgIUAwICAgICAhUCAgICJMICMwIDIKLU0gICAjNlAgWD1FXUY7Jl1BPSVdTTk2VUI5NyggICU0ICNAIEMgIDgkICAgICAgPCAgICBMICBUICRAICAKLU0gWDwgLic5PzkmXVU4RlFFN1ZVRTs2KUU8QCAgNTAgLyAiLCAhQDAgICAgICFQICAgIDAgICAgOyAhPCAKLU0kQCAgISpEIC4iWFE5RiVLOTAgIE1AICAgIEAgICAgSiAgVCAkQCAgIF0gIC4nOT84VkFBPEVdTTk2VUIKLU05NyggICU0ICAwIEMgIDgkICAgICAgPCAgICBLICBUICRAICAgX0wgLic5PzxWQU88RzE/OzY1TThGNVIKLU0gICE1ICAwIChQICYhICAgICAgJyAgICAqMCAtICEoICAgMEQgI0FWN1ZFTj0lXU05NlVCOTcoICAlNCAKLU0hUCBDICA4JCAgICAgIDwgICAgSiAgVCAkQCAgISRYIC4nOT87Jl1OOVVdTTk2VUI5NyggICU0ICJAIEMKLU0gIDgkICAgICAgPCAgICBLICBUICRAICAhJ0QgLic5PzlGUU84NzE/OzY1TThGNVIgICE1ICBYIChQICYKLU0hICAgICAgJyAgICArICAtICEoICAgMkUgI0FWN1YxTz02KUw5NV1NOTZVQjk3KCAgJTQgI1AgQyAgOCQKLU0gICAgICA8ICAgICQgICAgKkAgJiAhKCAgIDM3ICNBVjdWLUg4Nyk/OUc1TjhQICA1MCAhIDEkICAhL1gKLU0gMiQgICEwOCAgICAhICAgICMkICFAIDIgICAlIyAgWD1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAgITUKLU0gICghJDAgICUiICEoMCAgJSQgICAgICQgICAgLFAgJiAhKCAgIDUjICNBVjdXNU48VkVHO0Y1RDdWLUgKLU04Nyk/OUc1TjhQICA1MCAjIDEkICAhMSggMiQgICExSCAgICAhICAgICJMICFAIDIgICAlPEAgWD1FXVMKLU06Jl1SPSVdRj02WUMgICE1ICAwISQwICAlJyAhKDAgICUpICAgICAkICAgICxAICYgISggICA2SCAjQVYKLU03Vy1JOVZZRTklXVM6Jl1SPSVdRj02WUMgICE1ICA0ISQwICAlKUAhKDAgICUrQCAgICAkICAgIC0gICYKLU0gISggICA3QCAjQVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgICU0ICFAJDEgICA0UCAkQSAgIDQKLU1YICAgICAwICAgIEkgIDggJEAgICFAVCAuJzk/OjZZVDdWOVU7RiwgICU0ICFQJDEgICA0WiAkQSAgIDUKLU0iICAgICAwICAgIFAgIDggJEAgICFEJCAuJzk/PFZFRztGNUQ3VkVOPSVdRj02WUMgICE1ICBAISQwICAKLU0lMSAhKDAgICUzICAgICAkICAgICxAICYgISggICA5VyAjQVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMKLU0gICE1ICBEISQwICAlM0AhKDAgICU1QCAgICAkICAgICpAICYgISggICA6RSAjQVY3VlFPO0Y9PzlHNU4KLU04UCAgNTAgKiAxJCAgITVAIDIkICAhNiAgICAgISAgICAjJCAhQCAyICAgJlZAIFg9RV1TOjY9Tjk2MT8KLU07Jl1OOVVdRj02WUMgICE1ICBMISQwICAlOEAhKDAgICU6QCAgICAkICAgICxQICYgISggICA8MSAjQVYKLU03VzVOPFZFRztGNUQ3VlFPO0Y9PzlHNU44UCAgNTAgLCAxJCAgITZQIDIkICAhNzAgICAgISAgICAiTCAKLU0hQCAyICAgJzAgIFg9RV1GOyZdQT0lXUY9NllDICAhNSAgWCEkMCAgJT1AISgwICAlP0AgICAgJCAgICAKLU0rICAmICEoICAgPVAgI0FWN1YxTz02KUw5NV1GPTZZQyAgITUgIFwhJDAgICVAICEoMCAgJUIgICAgICQKLU0gICAgJTAgNSAhKCAgID5OICgsICEwJCAgID9KICAgICUwICUgISggICA+OiAoLCAhMCQgICA/SiAgICAKLU0kICAlICEoICAgPkogJTQgIVAgICAgMCAgICBcICAkICRAICAhXkggRTAgICAqLCAqICAgIiAgICAgICAKLU0gICAgICAgKCAgICAgICAgICAkICAgQCAgICAgICAgICBAQCA8QCAgICJYICAgIDkgISwgJEAgICInTCAKLU0uJlFJO0ZMICArOCAgICI4ICAgIClAIC0gISggICBASSAjQU45N0FUICAiIyAgNCEgICAnWkAgQyAgOCQKLU0gICAgICA8ICAgIEogIFQgJEAgICIlLCAuJlFJO0ZNRj02WUMgICIjICA0ISAgICc8ICBDICA4JCAgICAKLU0hIDwgICAgRCAgVCAkQCAgIic8IC4nLVQ9NjlGICAhUiAgICdLQCBDICA4JCAgICAiIDwgICAgJCAgICAKLU0lMCA1ICEoICAgQlkgKCwgITAkICAgP0ogICAgJTAgJSAhKCAgIEJFICgsICEwJCAgID9KICAgICQgICUKLU0gISggICBCVSAlNCAhUCAgICAwICAgIFwgICQgJEAgICIvNCBFMCAgICosICogICAiICAgICAgICAgICAKLU0gICAoICAgICAgICAgICQgICBAICAgICAgICAgIEBAIDxAICAgIlggICAgPCAhPCAkQCAgIjhEIC4nMVUKLU03VlFJO0ZMICArOCAgICIwICAgIClAIC0gISggICBEVyAjQU45N0FUICAiIyAgNCEgICAnWkAgQyAgOCQKLU0gICAgICA8ICAgIEogIFQgJEAgICI2JCAuJlFJO0ZNRj02WUMgICIjICA0ISAgICg+UCBDICA4JCAgICAKLU0gIDwgICAgRCAgVCAkQCAgIjg0IC4nLVQ9NjlGICAhUiAgIChOMCBDICA4JCAgICAgIDwgICAgJCAgICAKLU0uQCAkICEoICAgRycgI0BOLEY5QTpWNCAgKzggICAgJCAvLCAmUCAgICApQjsnNUUgICAgICAlRzxGNUUKLU07QCAgICAgIDxGNUQgICAgICAwICAgIF4gIDAgJEAgICJARCAuJi1POyZdUjxQICBNQCAgICAwIFxQID8KLU0gICAgIEchSTtGTCAgICAgIDchVTxHIUw5MCAgICAgID42NUw7Jl1XICAgICAgMCAgICBSICAwICRAICAKLU0iQ1wgLiJYUzlGJUs5MCAgTUAgICAgMCBcUCAzICAgICA2OU88RjAgICAgICAmLUg5NzlZICAgICAgMCAKLU0gICBRICAwICRAICAiRzAgLiYtQTxHLCAgKzggICAgJCAvLCAlICAgICAlUDtXKVM4VkFFICAgICAgIUIKLU07NzwgICAgICEgICAgIyggISAgMiAgICpKQCBYK0MxRjg2TUUgICJWICAgICEgI1MgISwgICAgITUlKTUKLU0xMCAgICAgIDFEJSw0VDQgICAgICEgICAgIVAgJUAgMiAgICpRQCBYOEZdTzsmNUE7QCAgPEAgICJHMCAKLU0gICBRICAwICRAICAiT0wgLiYpVjg2UVMgICJWICAgICEgI1MgISwgICAgIT0nKVU5MCAgICAgIDlGJUwKLU08VjQgICAgICEgICAgIVQgJUAgMiAgICsmICBYOEZdTzsmNUE7QyggICcoICAgSyYgICAgMUAgJCAhKCAKLU0gIE1CICNBTTo3LU88RjFFPEY1RCAgIlYgICAgISAjUyAiLCAgICAjPSZBUjk2NCAgICAgICdJRTxGXCAKLU0gICAgIDZdTjkwICAgICAiPSc9TyAgICAgIDAgICAgQyAgOCAkQCAgIlhEIC4mVUE6NlggICU0ICFQJDEKLU0gICA2KiAkQSAgIDkgICAgICAwICAgIEcgIDwgJEAgICJbICAuJy1QO1cpVDxWLUE8QCAgPEAgICJDXCAKLU0oUCAlIFAgICpWQCAgICBFICA8ICRAICAiXTQgLiYtTD02WUs5NyggICcoICAgSCkgIiwgITAsICAiSzAKLU0gICAgKiAgJyAhKCAgIE9dICNBTjtWWVA8RkVNODcpWSAgIVIgICApUVAgQyAgNCMgICBJWSAgICAiNCAKLU0hUCAyICAgLChAIFg8JylJOzYlUj4wICA8QCAgIjhEIChQICUgUCAgKj8wICAgIEQgIDwgJEAgICMkOCAKLU0uJzU/OyZFTjpQICA8QCAgIi80IChQICUgUCAgKk1AICAgIEcgIDwgJEAgICMmVCAuJy0/OyZFTjpQICAKLU1AUCAlIDAgICFeSCAoUCAlIFAgICpGQCAgICBGICA8ICRAICAjKSwgLic5Pz02WUk7VlhSICAhUiAgICMKLU1CUCBDICA0IyAgIEs8ICAgICI0ICFQIDIgICAsTiAgWD1FXVU7RkVPO0AgIDxAICAgRlAgKFAgJSBQICAKLU0qV0AgICAgRyAgPCAkQCAgIy1cIC4nOT88VzFSPTYtVCxAICA8QCAgIDRYIChQICUgUCAgKkkgICAgIEcKLU0gIDwgJEAgICMwOCAuJzk/PFcxUj02LVQsMCAgPEAgICAiWCAoUCAlIFAgICpHQCAgICBPICA8ICRAICAKLU0jMzQgLic5PzkmXVU4RlFFN1chTzo2WVQ5NyggICYsICBQJCAjUCBDICA0IyAgIEo8ICAgICJYICFQIDIKLU0gICAtOFAgWD1FXUY7Jl1BPSVdUDtWRU49JjVSICAhQyAgLCEgIFggKFAgJSBQICAqSlAgICAgViAgPCAKLU0kQCAgIzlEIC4nOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICAhQyAgLCEgIFAgKFAgJSBQICAKLU0qPkAgICAgVCAgPCAkQCAgIzxUIC4nOT88VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCAgOFAgIyAwICsKLU0gIiwgITAsICAiSlAgICAgKzAgJyAhKCAgIFdaICNBVjdWUU87Rj0/PCZdSTtHMUU8QCAgOFAgIyAwICoKLU0gIiwgITAsICAiSSAgICAgLTAgJyAhKCAgIFhPICNBVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIKLU0gICFDICAsISAgRCAoUCAlIFAgICpCQCAgICBTICA8ICRAICAjRiggLic5PzxWRUc7RjVEN1ZFTj0lXVAKLU07VkVOPSY1UiAgIUMgICwhICBAIChQICUgUCAgKkYwICAgIEwgIDwgJEAgICNIWCAuJzk/OjZZVDdXIU8KLU06NllUOTcoICAmLCAgUCQgIVAgQyAgNCMgICBKJyAgICAjPCAhUCAyICAgLlEwIFg9RV1VO0ctSTlWWUUKLU05JV1TOiZdUj0lXVA7VkVOPSY1UiAgIUMgICwhICA4IChQICUgUCAgKj0gICAgIFUgIDwgJEAgICNPSCAKLU0uJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoICAmLCAgUCQgITAgQyAgNCMgICBKOyAgICAiWCAKLU0hUCAyICAgLyogIFg9RV1TOiZdUj0lXVA7VkVOPSY1UiAgIUMgICwhICAwIChQICUgUCAgKktQICAgIFYKLU0gIDwgJEAgICNVWCAuJzk/PTZZUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAgIUMgICwhICAsIChQICUKLU0gUCAgKkVAICAgIFQgIDwgJEAgICNZKCAuJzk/PFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFPEAgIDhQICMKLU0gMCAiICIsICEwLCAgIksgICAgICswICcgISggICBeXyAjQVY3Vi1IODcpPzwmXUk7RzFFPEAgIDhQICMKLU0gMCAhICIsICEwLCAgIkk0ICAgICkgICEgISggICBfQyApNCAgICJDICEgICAgQCAgICAgICAgICAwQCAKLU01MCAvICAgICsgICcgISggICEgLyAjQVY3VjFPPTYpTDk1XUE8RylBPjAgIDxAICAjW1wgKFAgJSBQICAKLU0qP0AgICAgRCAgJCAkQCAgJCMsIEUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIFggICAgSyAgPCAKLU0kQCAgJCVYIC4nOT85RlFPODcxPzg3KVI4N0QgICcoICAhIC8gIiwgITAsICAiSlQgICAgKSAgISAhKCAKLU0gISIiICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICwgICAgLFAgJyAhKCAgISJVICNBVjdXNU4KLU08VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCAgJyggICEhPiAiLCAhMCwgICJIUCAgICApICAhICEoICAhIzkKLU0gKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgKyAgICAsMCAnICEoICAhJCogI0FWN1ctSTlWWUUKLU05JV1MO1ZZRzdWJVI8RiVZICAhUiAgIDBNMCBDICA0IyAgIEokICAgICIwICAwIDIgICAxK0AiNSAgICAKLU1IUCAwICAgKCAgICAgICAgICAkKCAlNCAiQCAgICJIICFQIDIgICAxNiAgWD1FXUw7VllHN1YlUjxGJVkKLU0gICFSICAgMSJAIEMgIDQjICAgSlEgICAgIjAgIDAgMiAgIDE/ICI1ICAgIEhQIDAgICAoICAgICAgICAKLU0gICQoICU0ICIwICAgIyggIVAgMiAgIDFLQCBYPUVdVTtHLUk5VllFOSVdSTtHMT84NylSODdEICAnKCAKLU0gISU4ICIsICEwLCAgIkhAICAgICkgICEgISggICEnMiApNCAgICJDICEgICAgQCAgICAgICAgICAwQCAKLU01MCAoICAgICwgICcgISggICEoIiAjQVY3Vy1JOVZZRTklXUk7RzE/ODcpUjg3RCAgJyggICEmTiAiLCAKLU0hMCwgICJJPCAgICApICAhICEoICAhKEYgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgJyAgICAKLU0qMCAnICEoICAhKS8gI0FWN1ZFTj0lXUE8RylBPjAgIDxAICAkQCggKFAgJSBQICAqPlAgICAgRCAgJCAKLU0kQCAgJEcsIEUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIDggICAgVCAgPCAkQCAgJEo8IC4nOT8KLU09NllTOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgICcoICAhKS8gIiwgITAsICAiSTAgICAgKSAgISAhKCAKLU0gISsrICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICUgICAgLEAgJyAhKCAgIStdICNBVjdXLUkKLU05VllFOSVdUzomXVI9JV1BPEcpQT4wICA8QCAgJEo8IChQICUgUCAgKkFAICAgIEQgICQgJEAgICRSJCAKLU1FMCAgICosICQgICAiICAgICAgICAgICEiICE1ICAwICAgIEsgIDwgJEAgICRUUCAuJzk/PFZBTzxHMT8KLU04NylSODdEICAnKCAgIStdICIsICEwLCAgIkksICAgICkgICEgISggICEtUCApNCAgICJDICEgICAgQCAKLU0gICAgICAgICAwQCA1MCAjICAgICxQICcgISggICEuQyAjQVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVIKLU04N0QgICcoICAhLSwgIiwgITAsICAiRyggICAgKSAgISAhKCAgIS8nICk0ICAgIkMgISAgICBAICAgICAKLU0gICAgIDBAIDUwICIgICAgLDAgJyAhKCAgIS9YICNBVjdXLUk5VllFOSVdQzomJVI3ViVSPEYlWSAgIVIKLU0gICAzSFAgQyAgNCMgICBKIiAgICAiMCAgMCAyICAgNCcgIjUgICAgSFAgMCAgICggICAgICAgICAgJCgKLU0gJTQgIDAgICAiSCAhUCAyICAgNDFAIFg9RV1DOiYlUjdWJVI8RiVZICAhUiAgIDNeICBDICA0IyAgIEoKLU1KICAgICIwICFQIDIgICA0OkAgWD1FXUQ7VzVCOyY0ICAlNCAjUCBDICA0IyAgIElWICAgICIsICFQIDIKLU0gICA0QzAgWD1FXUY7Jl1BPSAgIDUwIC4gIiwgITAsICAiSCwgICAgKlAgJyAhKCAgITJYICNBVjdXNU4KLU08VkVHO0Y1RDdWUU87RjwgICU0ICMgIEMgIDQjICAgSjIgICAgIkQgIVAgMiAgIDRYMCBYPUVdUzo2PU4KLU05NjE/OyZdTjlQICA1MCArICIsICEwLCAgIkcsICAgIChAICcgISggICE0IyAjQVY3VlFPO0Y8ICAlNCAKLU0iQCBDICA0IyAgIEouICAgICJIICFQIDIgICA1KzAgWD1FXVU7Ry1JOVZZRTklXUk7RzAgICU0ICIwIEMKLU0gIDQjICAgSVAgICAgIkAgIVAgMiAgIDU1MCBYPUVdUzo2PU45NjE/OjZZVCAgITUgIEAgKFAgJSBQICAKLU0qPDAgICAgQSAgPCAkQCAgJTc4IC4nOT86NllUICAhNSAgPCAoUCAlIFAgICo+ICAgICBMICA8ICRAICAKLU0lOiggLic5Pz02WVM6Nj1OOTYxPzxWQU88RzAgICU0ICFAIEMgIDQjICAgSVUgICAgIkggIVAgMiAgIDUKLU1TICBYPUVdUzo2PU45NjE/PFZBTzxHMCAgJTQgITAgQyAgNCMgICBKKyAgICAiLCAhUCAyICAgNVtQIFgKLU09RV1TOiZdUj0gICA1MCAkICIsICEwLCAgIkhcICAgICpQICcgISggICE4OiAjQVY3VzVOPFZFRztGNUQKLU03Vi1IODcoICAlNCAgUCBDICA0IyAgIEoiQCAgICJEICFQIDIgICA2MFAgWD1FXVM6Nj1OOTYxPzhWQUEKLU08QCAgNTAgIiAiLCAhMCwgICJJJCAgICAoQCAnICEoICAhOUUgI0FWN1YtSDg3KCAgJTQgIDAgQyAgNCMKLU0gICBKUyAgICAgMCAgICAnICAgICAgICJEQCAgJF8gICAgIVlfX1wgICAgKCAgICA+T19fICAgICwgICAKLU0gJ09fX1AgICAlQCAgICFdX19cICAgIiAgICAgP09fXyAgICBKICAgICdfX19QICAgLSAgICAiIV9fXCAKLU0gICNYICAgIEBPX18gICAhKCAgICAoL19fUCAgIDRAICAgIiVfX1wgICAlUCAgICBBT19fICAgIUYgICAKLU0gKD9fX1AgICA8ICAgICIpX19cICAgJ0ggICAgQk9fXyAgICIkICAgICsrX19QICAgQ0AgICAiVV9fXCAKLU0gICkkICAgIE1PX18gICAiMyAgICArP19fUCAgIEVAICAgIllfX1wgICApRCAgICBOT19fICAgIjwgICAKLU0gK09fX1AgICBHUCAgICJdX19cICAgKiggICAgT09fXyAgICJFICAgICtfX19QICAgSiAgICAjIV9fXCAKLU0gICpMICAgIFBPX18gICAiTiAgICAsL19fUCAgIEwwICAgIyVfX1wgICArMCAgICBRT19fICAgIlggICAKLU0gLEdfX1AgICBPICAgICMqX19cICAgLCAgICAgUl9fXyAgICMkICAgICxXX19QICAgUiAgICAjLl9fXCAKLU0gICxQICAgIFNfX18gICAjMCAgICAtJ19fUCAgIFUgICAgIzJfX1wgICAtQCAgICBUX19fICAgIzwgICAKLU0gLTdfX1AgICBYICAgICM2X19cICAgLjAgICAgVV9fXyAgICNIICAgIC1HX19QICAgWyAgICAjOl9fXCAKLU0gIC8gICAgIFcvX18gICAjVCAgICAtV19fUCAgIF4gICAgIz5fX1wgICAvUCAgICBYL19fICAgJCAgICAKLU0gLidfX1AgICEhICAgICNCX19cICAgMEAgICAgWS9fXyAgICQsICAgIC43X19QICAhJCAgICAjRl9fXCAKLU0gIDEwICAgIFovX18gICAkOCAgICAuR19fUCAgIScgICAgI0pfX1wgICAyICAgICBbL19fICAgJEQgICAKLU0gLldfX1AgICEqICAgICNPX19cICAgMlAgICAgXC9fXyAgICRPICAgIC8nX19QICAhLEAgICAjUl9fXCAKLU0gIDM0ICAgIF0vX18gICAkWCAgICAvO19fUCAgIS8gICAgI1dfX1wgICAzUCAgICAgL19fICAgJSQgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCAKLU0gICAhICAgICBAICAkLTAgICAjNCAgICAkUCAgICAgICAgICAgICAgIDAgICAgICAgICApICAgICEwICAKLU0gICggICEjSCAgICBaICAgICRAICAgICMgICAgICAgICAgMCAgICAkICAgICNQICAgIEwgICAgIiAgIDEKLU0sICAgIDMgICAgIzAgICAgISAgICAgKCAgICAkICAgICQgICAgITwgICAgIyAgICAgQCAgJEAgICAgKCAKLU0gICAgPlAgICAgICAgICAgICAgICAwICAgICAgICAgPyAgICAhICAgICAoICAhKVwgICAiPyAgICAjICAKLU0gICAjICAgICFQICAgIDAgICAgLCAgICAqMCAgICBQICAgICYgICAyTCAgICBLICAgICAwICAgICAgICAKLU0gICAgICAgMCAgICAiICAgICJcICAgICwgICAgIUAgICRMICAgICsgICAgIEAgICAgICAgICAgICAgICAKLU0kICAgICBAICAgIFQgICAgIyAgICAgOCAgIS0gICAgIzAgICAhPCAgICAgICAgICAgICAgICEgICAgICgKLU0gICAgLkAgICAgUCAgICAmICAgOSAgICAiMCAgICAgMCAgICAgICAgICAgICAgIDAgICAgIiAgICAkICAKLU0gICAhICAgICBAICAmMSAgICBEMCAgICAlICAgICAgICAgICAgICAgIiAgICAgICAgICEoICAgICAwICAKLU0gICwgICJERCAgICkpICAgICBAICAgICAgICAgICAgICAgMCAgICAgICAgIDNAICAgICQgICAgIyAgIEkKLU0sICAgIjMgICAgIDwgICAgICAgICAgICAgICAwICAgICEgICAgJSwgICAgJiAgICAgUCAgKjRQICAgRSwKLU0gICAgPCAgICAgMCAgICAgICAgICEgICAgIEAgICAhPCAgICAiICAgICAsICAiRyAgICApUCAgICA8ICAKLU0gICAgICAgICAgICAgIEAgICAgICAgICA4MCAgICAoICAgICAgICAgICAgICI8ICAgIDwgICAgICQgICAKLU0gIVAgICAgJCAgICAkICAgICZEICAgICMgICAgICAgICAgICAgISMgICAgJFQwICAgICAgICAgICAgICAKLU0gMCAgICAgICAgIVEgICAgIFAgICAgICAgICAgICAgNUQwICAgKSQgICAgICAgICAgICAgICAkICAgICAKLU0gICAgPlAgICAgJCAgICAgICAgICAgICAlQiggICAwTiAgICAgICAgICAgICAgICEgICAgICAgICAoMCAKLU0gICAhICAgICAgICAgICAgICFJMCAgIDY8ICAgICAgICAgICAgICAgISAgICAgICAgICIrICAgICAwICAKLT4gICAgICAgICAgIFBQICAgIEkoICAgICAgICAgICAgICAgJCAgICAgCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0LnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstYW91dC51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDk1ZmMwLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0LnUKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotYmVnaW4gNzc3IG02OGstYW91dAotTSAgICEiUCAgJCAgICAhICAgICAgICAgICMkQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAkWTZfXyEoVVNCIDJeWCAhJEdNICAwRjMkSjw5T1JZVFY0IjY4UENTICAgJCAwTy4wICAkIDBPIlJcNQotTTg/XCAgICUiV09QICMiXCA4P1wgICAtLjYoXSxbQ0IgX18hLjdEWVUzRTggICRZPjNHNCAgJEAuICAgIAotTSAkQzcgICFQICYgICAgKS43RFlVMiBYICAgICAyLTwgICcgIDggICAgRFk+M0c1KCNAICAgICEoVVAgIAotTTwgIUAgICAiM0VZLj00QC4gICAgICRDNyAgIVAgJiAgICApLjdEWVUyIFggICAgIDItPCAgJyAgOCAgIAotTSBEWT4zRzUoI0AgICAgIShVUCAgPCAhQCAgICIzRVkuPTRALiAgICAgJEM3ICAhIkAmICAgICkuN0RZVQotTTIgWCAgICAgMi08ICAkKiA4ICAgIERZPjNHNSgjQCAgICAhKFVQICAwSCFAICAgIjNFWS49NEAuICAgIAotTSAkQzcgICEiQCYgICAgKS43RFlVMiBYICAgICAyLTwgICQqIDggICAgRFk+M0c1KCNAICAgICEoVVAgIAotTTBIIUAgICAiM0VZLj00QC4gICAgICRDNyAgI1IgJVAvOCAgICBEWT4zRzUoI0AgICAgIShVUCAgXEAhPAotTSNWICAgICkuN0RZVTIgWCAgICAgMi08ICAkKFkgICAwLSEvXCAgJCAgISBWJF9QICBAICAkI0BTXyAgIwotTSAgIDAuQy9cICAwICAhIFwsX1AgITAgICQjWVAhQi8gICAgMDAnICcoXCAgICEhJDwgQENQICAgJCRBUAotTSIyLyAgICAwMycgKihcICAgISEwPCBMQ1AgICAkJTBDXyQrKCAgICAgISE4KF9RIDowICAgICAwNyIvXAotTSAgICAgICAgJCYgM14wICAkIzAgICEhRCRfRCAgISBWICAgMDlBL1kgICAwLiAgICQmQFNeMCAgJCNIIAotTSAhIUwsX0QgICEgXCAgIDA8Iy9ZICAgMC9AICAkJzBDXjAgICQkICAgISFcKF9EICAhISQgICAwQSIvWQotTSAgIDAyICAgJChQQ14wICAkJFAgICEiNChfRCAgISEwICAgMEciL1kgICAwNSAgICQqMENeMCAgJCVAIAotTSAhIkwoX0QgICEhPCAgIDBNIi9ZICAgMDggICAkK0BDXyAgICQjMCAgISMkKF9QICAhIFYgICAwUiIvXAotTSAgIDAuICAgJCxQQ18gICAkI0ggICEjMChfUCAgISBcICAgMFUiL1wgICAwL0AgICQtQENfICAgJCQgIAotTSAhIzwoX1AgICEhJCAgIDBYIi9cICAgMDIgICAkLjBDXyAgICQkUCAgISNIKF9QICAhITAgICAwWyIvXAotTSAgIDA1ICAgJC8gQ18gICAkJUAgICEjVChfUCAgISE8ICAgMF4nICIoXCAgICEnNDwgKENQICAgJD1BUAotTSAyLyAgICAxWCcgIShcICAgISc8KF9EICAhJFwgICAxMSMvWSAgIDErICAgJDMxLjdEWVUwIkBDKjYxQgotTT4nQVgrRywpLTJYUigiQSI5NylLOTZRRT4yREAtUlxRLEJcWC0wICAyJ0QgICEnSCgnRCAgISdEM0khOAotTUNUWVIiSFEuNUAgIDg/XCAgICA2K1JYICImJ18gICAgJSVCLzNFWS49MCAgM0U4ICAkWT4zRzUuNUAgIAotTTwgJS4wIi8gICAgM1knI18zRVkuPTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgISAsICAgICAkWVUgICEgKiIsSThXKVQsIllDIjMwTi1CIEgwRjVSOlY1TDk3REkoIyxPLFMgTwotTS4jLCAgICAgICAgISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgISAwICAmMCAgICAgICAgICJQMCAgKSggICAhNCAgICAkVjAgICAgICAgITQgICAgJlggIAotTSAgICAgICAgICAgIC84ICAgICAgICAgICAgICAzWCAgICAgICAgICAgICAgPEggICAgICAgICAgICAgIAotTUMoICAgICAgICAgICAgICBJWCAgICAgICAgICAgICAgUTggICAgICAgICAgICAgIFdYICAgICAgICAgIAotTSAgICBeKCAgICAgICAgICAgICAhIjggICAgICAgICAgICAgIScoICAgICAgICAgICAgICEqKCAgICAgIAotTSAgICAgICAhLEIgICAgJCAgICAgICAgIS8iICAgICQgICAgICAgICEzMiAgICAkICAgICAgICAhOCIgIAotTSAgKCAgICAgICAgITpSICAgICggICAgICAgICE/MiAgICAoICAgICAgICAhRDIgICAgMCAgICAgICAgIQotTUZCICAgIDAgICAgICAgICFKQiAgICAwICAgICAgICAhTyIgICAgMCAgICAgICAgIVFCICAgIDAgICAgIAotTSAgICFVUiAgICAwICAgICAgICAhWkIgICAgMCAgICAgICAgIV0yICAgIEAgICAgICAgICIgQiAgICAkIAotTSAgICAgICAiJzIgICAgJCAgICAgICAgIi0yICAgICQgICAgICAgICI2MiAgICAoICAgICAgICAiPTIgIAotTSAgKCAgICAgICAgIkNCICAgICggICAgICAgICJMUiAgICAwICAgICAgICAiUzIgICAgMCAgICAgICAgIgotTVkiICAgIDAgICAgICAgICMhUiAgICAwICAgICAgICAjJiIgICAgMCAgICAgICAgIywiICAgIDAgICAgIAotTSAgICMyQiAgICAwICAgICAgICAjOUIgICAgQCAgICAgICAgI0EiICAgICQgICAgICAgICNGQiAgICAkIAotTSAgICAgICAjTSIgICAgJCAgICAgICAgI1RSICAgICggICAgICAgICNaQiAgICAoICAgICAgICAkITIgIAotTSAgKCAgICAgICAgJCkyICAgIDAgICAgICAgICQuQiAgICAwICAgICAgICAkNFIgICAgMCAgICAgICAgJAotTTwyICAgIDAgICAgICAgICRBIiAgICAwICAgICAgICAkR0IgICAgMCAgICAgICAgJE5CICAgIDAgICAgIAotTSAgICRUMiAgICBAICAgICAgICAkWkggICAhQ19fX0wlICAgJUBSICAgIUAgICAgICAgICVEMiAgICFAIAotTSAgICAgICAmKlggICAgQ19fX0wlICAgJk8iICAgIEAgICAgICAgICZSIiAgICBAICAgICAgICAnNkIwIAotTSAgJCAgICE0ICAgICAkMCAgJ0QgICAhPiAgICc6MjAgICAkICAgIUggICAgICQwICAnSCAgICFSICAgJwotTT9SMCAgICQgICAhXCAgICAgJDAgICdMICAgIiYgICAnRVIwICAgKCAgICIwICAgICAkMCAgJ1QgICAiOgotTSAgICdJUjAgICAoICAgIkQgICAgICQwICAnWCAgICJOICAgJ09CMCAgICggICAiWCAgICAgJDAgICdcIAotTSAgIyIgICAnVVIwICAgMCAgICMsICAgICAkMCAgKCQgICAjNiAgICdZMjAgICAwICAgI0AgICAgICQwIAotTSAoKCAgICNKICAgJ15CMCAgIDAgICAjVCAgICAgJDAgICgsICAgI14gICAoJDIwICAgMCAgICQoICAgIAotTSAkMCAgKDQgICAkMiAgICgoIjAgICAwICAgJDwgICAgICQwICAoOCAgICRGICAgKC1CMCAgIDAgICAkUAotTSAgICAgJDAgICg8ICAgJFogICAoM0IwICAgMCAgICUkICAgICAkMCAgKEQgICAlLiAgICg3QjAgICBAIAotTSAgJTogICAgICQwICAoSCAgICVEICAgKDwoICAgKUNfX19MJSAgIChXIiAgIClAICAgICAgICAoWVggIAotTSApI19fX0wlICAgKSlSICAgKSAgICAgICAgICksQiAgICAwICAgICAgICApNUggICAgM19fX0wlICAgKQotTT8yICAgIDAgICAgICAgIClDIiAgICAwICAgICAgICApSkggICAgM19fX0wlICAgKVFCICAgIDAgICAgIAotTSAgIClVKCAgICAzX19fTCUgICApXEggICAgM19fX0wlICAgKiNIICAgIDNfX19MJSAgIComWCAgICAzXwotTV9fTCUgICAqMiIwICAgMCAgICVQICAgICAkMCAgKyggICAlWiAgICAgJDAgICssICAgJVogICAgICQwIAotTSArMCAgICVaICAgICAkMCAgKzQgICAlWiAgICAgJDAgICs4ICAgJiAgICAgICQwICArPCAgICYoICAgIAotTSAkMCAgK0AgICAmMCAgICAgJDAgICtEICAgJjAgICAgICQwICArSCAgICY4ICAgICAkMCAgK0wgICAmQAotTSAgICAgJDAgICtQICAgJkggICAgICQwICArVCAgICZIICAgICAkMCAgK1ggICAmUCAgICAgJDAgICtcIAotTSAgJlggICAgICQwICAsICAgICcgICAgICAkMCAgLCQgICAnICAgICAgJDAgICwoICAgJyggICAgICQwIAotTSAsLCAgICcwICAgICAkMCAgLDAgICAnOCAgICAgJDAgICw0ICAgJzggICAgICQwICAsOCAgICdCICAgIAotTSAkMCAgLDwgICAnViAgICAgJDAgICxAICAgJ1YgICAgICQwICAsRCAgICdWICAgICAkMCAgLEggICAoIAotTSAgICAgJDAgICxMICAgKCogICAgICQwICAsUCAgICg0ICAgICAkMCAgLFQgICAoNCAgICAgJDAgICxYIAotTSAgKD4gICAgICQwICAsXCAgIChIICAgICAkMCAgLSAgICAoUiAgICAgJDAgIC0kICAgKFIgICAgICQwIAotTSAtKCAgIChcICAgICAkMCAgLSwgICApJiAgICAgJDAgIC0wICAgKTAgICAgICQwICAtNCAgICkwICAgIAotTSAkMCAgLTggICApOiAgICAgJDAgIC08ICAgKUQgICAgICQwICAtQCAgIClOICAgICAkMCAgLUQgICApTgotTSAgICAgJDAgIC1IICAgKVggICAgICQwICAtTCAgICosICAgICAkMCAgLVAgICAqLCAgICAgJDAgIC1UIAotTSAgKjYgICAgICQwICAtWCAgICpAICAgICAkMCAgLVwgICAqSiAgICAgJDAgIC4gICAgKkogICAgICQwIAotTSAuJCAgICpUICAgICAkMCAgLiggICAqXiAgICAgJDAgIC4sICAgKyggICAgICQwICAuMCAgICsoICAgIAotTSAkMCAgLjQgICArMiAgICAgJDAgIC44ICAgKzwgICAgICQwICAuPCAgICtGICAgICAkMCAgLkAgICArRgotTSAgICAgJDAgIC5EICAgK1AgICAgICQwICAuSCAgICtaICAgICAkMCAgLkwgICAsJCAgICAgJDAgIC5QIAotTSAgLCQgICAgICQwICAuVCAgICwuICAgICAkMCAgLlggICAsOCAgICAgJDAgIC5cICAgLDggICAgICQwIAotTSAvICAgICxAICAgICAkMCAgLyQgICAsSCAgICAgJDAgIC8oICAgLFAgICAgICQwICAvLCAgICxYICAgIAotTSAkMCAgLzAgICAsWCAgICAgJDAgIC80ICAgLSIgICAgICQwICAvOCAgIC0iICAgICAkMCAgLzwgICAtLAotTSAgICo0IDAgIC88ICAgLTAgICAqNSAwICAgICAgIC0wICAgKjcgMCAgICAgICAuKCAgICo4UDAgIU4oIAotTSAgLkQgICAqOlAwICBZOCAgIC5MICAgKjxQMCAhTiggICAuVCAgICo/IDwgITcoICAhICQgICAqQTA0IAotTSEwWCAgICAgICAgKkJQNCAgV1ggICAlUCAgICpEMDQgIFogICAgLiggICAqRVA0ICFCWCAgICEqICAgKgotTUhQPCAgKSggICEgKCAgICpKQEQgIVQ4ICAhIFQgICAqTEBEICFeWCAgISBWICAgKlAwRCAhJjggICEgWAotTSAgICpUQEQgIVlIICAhIFogICAqVlBEICAkUCAgISBcICAgKlpQRCAgPUggICEgXiAgICpfMEQgIV8gIAotTSAhISAgICArISBEICIkMCAgISEkICAgKyRARCAhSCAgICEhKCAgICsoQEQgIVtEICAhISwgICArKkBEIAotTSImJCAgISEwICAgKy4wRCAhLUQgICEhNCAgICsyQEQgIUxAICAhITggICArNFBEICE2TCAgISE8ICAgKwotTTcwRCAhVywgICEhRCAgICs6UEQgIUVUICAhIUYgICArQCBEICEmRCAgISFIICAgK0VQRCAgSUQgICEhTAotTSAgICtJQEQgICZUICAhIVAgICArTyBEICEyLCAgISFUICAgK1UgRCAhTVQgICEhXCAgICtYMEQgIEAsIAotTSAhIiQgICArXTBEICAwRCAgISIsICAgLCJQRCAgO0wgICEiNCAgICwmMEQgICo0ICAhIjwgICAsK0BEIAotTSFUXCAgISJEICAgLDEwRCAgPFQgICEiTCAgICw1IEQgICtEICAhIlQgICAsOSBEICIlKCAgISMkICAgLAotTT0gRCAgX0ggICEjKCAgICxCUEQgISxAICAhIywgICAsSSBEICFCOCAgISMwICAgLE0wRCAhQTAgICEjNAotTSAgICxTMEQgIVpQICAhIzggICAsWVBEICE/SCAgISM8ICAgLF1ARCAgXFggICEjQCAgIC0jIEQgIigwIAotTSAhI0QgICAtKSBEICBKWCAgISNIICAgLS0gRCAhTzAgICEjTCAgIC0yUEQgIVwoICAhI1AgICAtOSBEIAotTSBPOCAgISNUICAgLT0wRCAhVDAgICEjWCAgIC1BUEQgIVJMICAhI1wgICAtREBEICFSUCAgISQ0ICAgLQotTUcwRCAhXDggICEkTCAgIC1JQEQgIVIgICAhJFQgICAtTCA0ICBaTCAgICE0ICAgLU8wNCAhVlwgICAhSAotTSAgIC1UMDQgIUc0ICAgIVwgICAtWVA0ICE4VCAgICIwICAgLV0wNCAhJzwgICAiRCAgIC4iQDQgIEgsIAotTSAgIlggICAuKDA0ICFaXCAgICMsICAgLiswNCAgLywgICAjQCAgIC4wIDQgISw0ICAgI1QgICAuNTA0IAotTSAsXCAgICQoICAgLjhANCAhKSwgICAkPCAgIC49QDQgIFlEICAgJFAgICAuQyA0ICEyPCAgICUkICAgLgotTUZANCAhKVQgICAlOiAgIC5KMEQgIVQ0ICAhJFwgICAuTDBEICFYNCAgISUkICAgLk4wRCAhXFwgICEnNAotTSAgIC5QQEQgIEc8ICAhJzggICAuU0BEICEpWCAgISc8ICAgLlVQRCAgT0AgICEnQCAgIC5YQEQgIDI8IAotTSAhJ0QgICAuWlA0ICA6RCAgIC1UICAgLl0gNCAgOzAgICAuJCAgIC5fMDwgISw4ICAhIFAgICAvIVA0IAotTSBZOCAgIC5EICAgLyQwNCAhTiggICAuTCAgIC8mIDQgIiFQICAgLlQgICAvJ1BEICFZPCAgIS9EICAgLwotTSlGLVI9IyBOO1AhRzkmKU05MllPICY9RDhGVUUrRiwgOjZZVC5HMFEvNyhRLlJUUiwzMFctI0BTLUMwWAotTS5TKFEtIzxULiMsVi0jPFsgJi1IODcoWj0jKF08QyhbLCNMUSxDPFsgJlFPO0Y8Wj0jLF08QyRbKzMoUQotTS0jPFQuIyxWLSNAWyxDJFQtUzBYLFM4VC1TTCA8VkFPPEcwWj0jMF08QyRbKzMsUi1TOFguUyxSLVM4VwotTS5QIVU7Ry1JOVZZRTkiIUM6JiVSLkcwVS83KFEuUyBbLEM0VS5QIVU7Ry1JOVZZRTkiIVM6Jl1SPSNJVAotTS1DVVIsM0xQLlM4VS0zLFUuUCFVO0ctSTlWWUU5IiFMO1ZZRy5HMFcvNyhRLlMgWyszJFsgJzVOPFZFRwotTTtGNUQoJkVOPSNJVC4jVVIsM0xQLlJUUS5QIUY7Jl1BPSNJVC4zVVIsM0xULlMgWyAmMU89NilMOTNJVAotTSwzIF08QyRbLiNMUC5QIVY7VkVELkcwUSwzVFEsMCBfL1NcWj0jJFIvMyQgPUVdQzomJVIuRDxSICc5PwotTTxWRUc7RjVEN1YtSDg3KFoxUyggPUVdVTtHLUk5VllFOSVdQzomJVIuRDxVICc5PzxWQU88RzBaMVMwIAotTT1FXVM6Nj1OOTYxPzxWQU88RzBaMVMwID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSNJJy1AIVY3VkVOPSNJJwotTSwwIVY3Vy1JOVZZRTklXUk7RzBaMVMkID1FXVU7Ry1JOVZZRTklXUk7RzBaMVNAID1FXUw7VllHLkQ8UQotTSAnOT88VkVHO0Y1RDdWUU87RjxaMVMkID1FXVU7Ry1JOVZZRTklXUw7VllHLkQ8WCAnOT85RlFPODcwWgotTTFTRCA9RV1EO1c1QjsmNFoxUyRQICc5PzhWQUE8RV1BPEcpQT4zSScsMyxdODcoUS5TIFssM0xSICc5PwotTTxWRUc7RjVEN1YtSDg3KT84NylSODdEWjFTJFMgJzk/PTZZUzo2PU45NjE/OFZBQTxFXUE8RylBPjNJJwotTSwzMF04NyhRLlMgWywzTFUgJzk/PFZBTzxHMT84NylSODdEWjFTJFUvNiVSLDNMUC5TJFstICFWN1ctSQotTTlWWUU5JV1TOiZdUj0lXUE8RylBPjNJJywzNCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUE8RylBPjNJJwotTSwzOF04NyhRLlMgWywzTFYgJzk/OjZZVDdWJVI8RiVZLkQ8US1TVUE8QyRbLCNMUS5TJCA9RV1TOjY9TgotTTk2MT86NllUN1YlUjxGJVkuRDxRLVAhVjdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQT4zSScsM0BdODcoUQotTS5TIFssM0xYICc5PzsmXU45VV1BPEcpQT4zSScsMzwgPUVdUzo2PU45NjE/OyZdTjlVXUE8RylBPjNJJwotTSwzPCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZLkQ8US4gIVY3VjlMO1YlVDdWJVI8RiVZLkQ8UQotTS4zVUE8QyRbLCNMUS5TRCA9RV1EO1c1QjsmNT84NylSODdEWjFTKFAvNiVSLDNMUC5TJFssMyAgPUVdQwotTTomJVI3VyFPOjZZVDk3KFoxUyhRLzJIUiAnOT88VkVHO0Y1RDdWLUg4Nyk/PCZdSTtHMUU8Q0knLEMkIAotTT1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyhaMVMoUi8ySFUgJzk/PFZBTzxHMT88Jl1JO0cxRQotTTxDSScsQyxdKkMwID1FXVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8Q0knLEMsID1FXVU7Ry1JOVZZRQotTTklXVM6Jl1SPSVdUDtWRU49JjVSLkQ8Ui0jVEotQCFWN1ZFTj0lXVA7VkVOPSY1Ui5EPFItM1RKLDAhVgotTTdXLUk5VllFOSVdSTtHMT88Jl1JO0cxRTxDSScsQzQgPUVdVTtHLUk5VllFOSVdSTtHMT88Jl1JO0cxRQotTTxDSScsQzhdKkNAID1FXUw7VllHN1chTzo2WVQ5NyhaMVMoVSAnOT88VkVHO0Y1RDdWUU87Rj0/PCZdSQotTTtHMUU8Q0knLEM0ID1FXVU7Ry1JOVZZRTklXUw7VllHN1chTzo2WVQ5NyhaMVMoViAnOT85RlFPODcxPwotTTwmXUk7RzFFPENJJyxDPF0qQ0QgPUVdRDtXNUI7JjU/PCZdSTtHMUU8Q0knLENAXSpDJFAgJzE/PFcxUgotTT02LVQuRTBSLjNVUyxDMVY3Vi1IODcpPzs2NU04RjVSLkMoTCwiUFguVzk/PFZBTzxHMT87NjVNOEY1UgotTS5DMEwsMzhMLDM4Wz1FXUk7RzE/OzY1TThGNVIuQyRMLFMoTCxTKFs9RV1MO1ZZRzdWVUU7NilFPENIUQotTSsjOFQrIyxSLlc5PzlGUU84NzE/OzY1TThGNVIuQ0RMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1UgotTS5DJFArIyRSLiJQVi0jTFsgJzk/PFcxUj02LVQsM0knLENEID1FXVM9JylVOFcwUi5EPFMsI1VTLEMxVgotTTdWLUg4Nyk/OzY1TThGNVIuQyhMLCJQWC5XOT88VkFPPEcxPzs2NU04RjVSLkMwTCwzOEwsMzhbPUVdSQotTTtHMT87NjVNOEY1Ui5DJEwsUyhMLFMoWz1FXUw7VllHN1ZVRTs2KUU8Q0hRKyM4VCsjLFIuVzk/OUZRTwotTTg3MT87NjVNOEY1Ui5DREwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSLkMkUCsjJFIuIlBWLSNMWwotTSAnMT89NllJO1ZYWjUjLFEvNzRYPUVdQzomJVI3VlVFOzYpRTxDSFIrIyBMLiNNVjdXLUg7VylUN1ZVRQotTTs2KUU8Q0hUKyMgTCwzOFs9RV1JO0cxPzs2NU04RjVSLkMkTCwiUFMsQ01WN1ZRTztGPT87NjVNOEY1UgotTS5DJEwsIlBTLENNVjdWOUw7ViVUN1ZVRTs2KUU8Q0hZKyMgTCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1UgotTS5DJFArIyBMLUMwWy5QIVY3VzVOOjZdTi5EPFMsMCFWN1c1Tjo2XU4sQ0knLFMoXT0zQVY3Vi1IODcpPwotTTs2NU04RjVSLkMoTCwiUFguVzk/PFZBTzxHMT87NjVNOEY1Ui5DMEwsIlBRLUNNVjdWRU49JV1NOTZVQgotTTk3KFosMlBQKyMsUi5XOT87Jl1OOVVdTTk2VUI5NyhaLDJQUCsjLFIuVzk/OUZRTzg3MT87NjVNOEY1UgotTS5DREwsIlBTLENNVjdWMU89NilMOTVdTTk2VUI5NyhaLDMgTCwiUFYtI0xbICc5PzhWQUE8RV1GPTZZQwotTS5EOFIgJzk/PFZFRztGNUQ3Vi1IODcpPzlHNU44U0kmLEAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TgotTThTSSYtMCFWN1ctSDtXKVQ3VjlVO0YsWjFDMCA9RV1TOjY9Tjk2MT88VkFPPEcxPzlHNU44U0kmLSAhVgotTTdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLFoxQzggPUVdSTtHMT85RzVOOFNJJiwwIVY3Vy1JOVZZRQotTTklXUk7RzE/OUc1TjhTSSYsMCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDLkQ4WCAnOT87Jl1OOVVdRgotTT02WUMuRDhRICc5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFNJJiwwIVY3VzVOPFZFRztGNUQ3VlFPO0Y9PwotTTlHNU44U0kmLiAhVjdWOUw7ViVUN1Y5VTtGLFoxQ0QgPUVdRDtXNUI7JjU/OUc1TjhTSSYsMyAgOyZFTgotTTpTSTQsUyxdPFMkVSxGWUU+JzBaLFMwXSpDLFMrIyBMLFMoWzsmRU46VjlVO0YsWixTNF0qQyxWLzY4UwotTS0iUFMsQlBTLENNUz0nNUY5Q0hTLVNVQTxDJFssI0xQLlMsWC82JVIsM0xQLlMkWyxTRF04NyhRLlMgWwotTSxDTFIuMlBWLSJQUSwzNFIuU0wgPFVdTDo2WUsuRDxTLSAhVD01XUw6NllLLkUwVCwjVVUsMzBUO0Y1WAotTT0jSFMtIlBQKyMsUi5WUUk7Rk1GPTZZQy5DLFUrIyBMLFMoWzxXMVU5RjhaLFM8TCwiUFEsMzRSLlNMIAotTT01XUw6NllLLkQ8VCwgIVA8RkVNODcpWS5EPFQsM1VFPEY1RC5DIEw5VylFOTZYWiwyUUI7JzVFLkMoTAotTS5QIUM7VlFPPEcsWjUjMFIvNjVZOTZRTDtXPFosIlFQPTcpUDsmNFosMlFQOjZZSy5DKEwuUCFOO1ZZUAotTTxGRU04NylZLkQ8VCxAIUM7JzVOOlY1Ui5EPFQsU1VFOFZBRT1HRFosIlFGO1cpRC5DJEwuUCFDODcpUwotTS5FMFQtI1VFOEZVVy5DIEw8Jl1SPFYtSDkzSFErI0wgPFchTzxHMVM4ViVSLkQ8VC0gIUI7Vl1MOTYlTgotTS5HMFQtM1VFMUQlLDRUNFosIlE0NEU1JS5DJEwuUCFCPUYlTDxTSTQtIzhdOTY5QTsnLUUuQyBMPScpVQotTTkzSFErI0wgOEZdTzsmNUE7QyhaPSMwViAmVUk8Vl1SOSY1Ujk2MFo1IzBXLzY1VD1WXFosQlFPO0Y0WgotTSwyUVo5NylPLkMgTD0mQVI5NjRaLFJQWyAmVUE6NlhaMUMkICs2UUcgJV1TOFYtUzo2MCA5N0FJPSJZTwotTSAmOUE6Vi1VK0ZcIDdWNVg6NzBOO1AhQzk3KVI7VyhOO1AhPzk2WVY6NylPO0AhUz0mJVI9ICE/OzYlSQotTTtAIT85N0FJPSAhPzs2XU44Vl1OPScpTzsgIU04Vl1VO0cwIDdXOT84VkFBPEAhPz1FXVM6Nj1OOTYxPwotTThWQUE8QCE/PUVdVTtHLUk5VllFOSVdQzomJVIgJV1WN1ctSDtXKVQgJV1WN1ctSTlWWUU5JV1TOiZdUgotTT0gIT89RV1VO0ctSTlWWUU5JV1TOiZdUj0gIT89RV1JO0cwIDdXOT88VkVHO0Y1RDdWRU49ICE/PUVdVQotTTtHLUk5VllFOSVdSTtHMCA3Vzk/OyZdTjlQIT89RV1TOjY9Tjk2MT87Jl1OOVAhPz1FXVU7Ry1JOVZZRQotTTklXUw7VllHICVdVjdWOUw7ViVUICVdVjdWMU89NilMOTAhPz1FXUM6JiVSN1YlUjxGJVkgJV1WN1ctSQotTTlWWUU5JV1DOiYlUjdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RCA3Vzk/PFZBTwotTTxHMT84NylSODdEIDdXOT88VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ctSAotTTtXKVQ3ViVSPEYlWSAlXVY3VkVOPSVdQTxHKUE+MCE/PUVdUzo2PU45NjE/OjZZVDdWJVI8RiVZICVdVgotTTdXNU48VkVHO0Y1RDdWRU49JV1BPEcpQT4wIT89RV1MO1ZZRzdWJVI8RiVZICVdVjdXLUk5VllFOSVdTAotTTtWWUc3ViVSPEYlWSAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgN1c5PzlGUU84NzE/ODcpUgotTTg3RCA3Vzk/OSZdVThGUUU3ViVSPEYlWSAlXVY3Vi1IODcpPzwmXUk7RzFFPEAhPz1FXVM6Nj1OOTYxPwotTThWQUE8RV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAIT89RV1TOiZdUgotTT0lXVA7VkVOPSY1UiAlXVY3Vy1JOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RAotTTdXLUg7VylUN1chTzo2WVQ5NyggN1c5Pzo2WVQ3VyFPOjZZVDk3KCA3Vzk/PFZFRztGNUQ3VkVOPSVdUAotTTtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJV1WN1ZRTztGPT88Jl1JO0cxRQotTTxAIT89RV1TOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/PCZdSQotTTtHMUU8QCE/PUVdRjsmXUE9JV1QO1ZFTj0mNVIgJV1WN1YxTz02KUw5NV1QO1ZFTj0mNVIgJV1WN1ctVAotTTxHNUM9IyQgN1c5PzxXMVI9Ni1ULEAhPz1FXVU7RkVPO0AhPz1FXVU7RkVPO0MoIDdXOT84VkFBPEVdRgotTT02WUMgJV1WN1ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgN1c5Pz02WVM6Nj1OOTYxPzhWQUE8RV1GPTZZQwotTSAlXVY3Vy1IO1cpVDdWOVU7RiwgN1c5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIDdXOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzlHNU44UCE/PUVdSTtHMT85RzVOOFAhPz1FXVM6Nj1OOTYxPzo2WVQ3VjlVO0YsIAotTTdXOT89NllTOjY9Tjk2MT86NllUN1Y5VTtGLCA3Vzk/OyZdTjlVXUY9NllDICVdVjdXLUk5VllFOSVdTAotTTtWWUc3VjlVO0YsIDdXOT89NllTOjY9Tjk2MT87Jl1OOVVdRj02WUMgJV1WN1Y5TDtWJVQ3VjlVO0YsIAotTTdXOT85Jl1VOEZRRTdWOVU7RiwgN1ctPzsmRU46UCE/PTVdTDo2WUsgJV1QPEZFTTg3KVkgJV1OO1ZZUAotTTxGRU04NylZICVdQzsnNU46VjVSICVdUzwmXVI9Jy1DODcoIDdVXUQ4RiVSOVcsIDdVXUQ4Ry1VOEYsIAotTTdVXUQ4Ry1VOEZYIDdVXUw5VV1GOyYlRyAlXT84VlFFODZZVTwgIT83VjVYOjcwIDhWNVI8Rl1SICVdRQotTTxHKU47UCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotJSAgICAgICAgCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbTY4ay1hb3V0Mi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQyLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjA5NjEuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWFvdXQyLnUKKysrIC9kZXYvbnVsbApAQCAtMSwyMjA4ICswLDAgQEAKLWJlZ2luIDc3NyBtNjhrLWFvdXQyCi1NIDAoISJQICBAICAgICwgICAgICAgICAgJ0IwICAiIEAgICAgICAgICAgIS1eICAgKSE9J1tQICQoQCtFCi1NQDRHUyYgMENTICAiICAhKk4wICAoQDlHICAgJjgwICAqREE0MiUsTyBEWlkgICBCRiRaWSAgIEM5TVtcCi1NICBQTyAkWlkgICBGMCVCLytQIS5OMCAgKU1BLjVPXygyLjxQICRBWiA6USg+ICAgMidIIUJEWlogMzs/Ci1NXyAgICAgQE0wL19QMidAICgkQU5fXEBPICRaWiAzUz9fICAgICEgLEAgICAgIiFHIiQnWiA3OUAgICRUCi1NIyZYISJfXyo5TyBELyAgICdfXzRLT18sIEgrX19AICAhSCggIEAgICggKzBLT18wVCpbX1UkQVogNikoCi1NPiAgICtSW19cIlxaIDlATy5AJkArUCEoPiAgIDNLSCBTLV9cICAgICYiVSBfXkBPK09fLCtSW19cIlxaCi1NIDdATy5AJVgrUltfVCIgIlQqW19aIlwgM0tIIEhNX1wgICAgJiI4IEUqW19TIlwiKCJbX1otIk5fXFBPCi1NICRaWiApIz9fICAgICBRKD5AJEIyJ0AgICRBWiAsRS5OQCFGNChcTTAvX0wySltfVSY4JDYoXUAoREFYCi1NICAgTyAiXFogMUBPLkAkOCtSW19VLTpOX10gTyBUWlogJDM/XyAgICAhUSFeT1soKzRDX18iVVkgICggCi1NIC9fWCs3SCA7L19UMiZbX1okQVggICRAO09fSFQ+W19XJFowNChdLFdQICwzRVkuPTIhTyAgUSg+ICAlCi1NOCFQQDtQIDwyJ0AgMVYgMigmXCAjJEFYICRFQCIiIU8gISEoPiAgIzNEIUUgRFlVK1FBKDQkQVggICkoCi1NPiAgIDInQCAhJFkgK1dQICAgIV8gIDEoPiAgITNEICAgICAgK1c1UzxCXUw6NihPOyYwTjxWXCArVjFFCi1NPUJdWjk3KU8gICAgICAgODhXKVQsI0hAO0ZcQCtXNVM8Ql1MOjYoTzsmME48VlwqICAgICk2LVI9IyBaCi1NKCJdVTxXKE87JkVCK1ZRRCtHLU8oJlVBPCchSTtGPEA5RiVJOyc1UjkwSCAgICAgJFYtUj0jIFooJllPCi1NKCJdRDk3OE8+RjVSO1BIIEAgICAgSCAgICEoICAgICcgICAgITAgICAgICAgJFtZICAgRVIgICAzRTggCi1NICQqIDggICAgRFk+M0c1LjVAICAwSCFAICAgIjNFWS49NFk2ICAhIkAmICAgICkuN0RZVTNFOCAgJCogCi1NOCAgICBEWT4zRzUuNUAgIDBIIUAgICAiM0VZLj00WTYgICEiQCYgICAgKS43RFlVM0U4ICAkKiA4ICAgCi1NIERZPjNHNS41QCAgMEghQCAgICIzRVkuPTRZNiAgISJAJiAgICApLjdEWVUzRTggICQqIDggICAgRFk+Ci1NM0c1LjVAICAwSCFAICAgIjNFWS49NFk2ICAhIkAmICAgICkuN0RZVTNFOCAgJyAgOCAgICBEWT4zRzUuCi1NNUAgIDwgIVIgJiAgICApLjdEWVUzRTggICYnXyAgICIwRChZICAqUDQhL1wgICQgIEshMiRfUCAgQCAiCi1NTCUwU18gICMgICpQNUMvXCAgMCAgSyE4LF9QICEwICJMJUlQIUIvICAgKlA3JyAnKFwgICBLIUA8IEBDCi1NUCAgIkwmMVAiMi8gICAqUDonICooXCAgIEshTDwgTENQICAiTCcgQ18kKyggICAgIEshVChfUSA6MCAgCi1NICAqUD4kKlkgICpQPyEvWSAgKlA0ICAiTCggM14wICJMJSggIEsiIiRfRCAgSyE0ICAqUEEjL1kgICpQCi1NNUAgIkwoQFNeMCAiTCVAICBLIiwsX0QgIEshOiAgKlBEIi9ZICAqUDcgICJMKUBDXjAgIkwmICAgSyJACi1NKF9EICBLIUQgICpQSiIvWSAgKlA6ICAiTCsgQ14wICJMJlAgIEsiWChfRCAgSyFQICAqUFAiL1kgICpQCi1NPSAgIkwsQENeMCAiTCdAICBLIzAoX0QgIEshXCAgKlBVIi9cICAqUDQgICJMLiBDXyAgIkwlKCAgSyNECi1NKF9QICBLITQgICpQWiIvXCAgKlA1QCAiTC5QQ18gICJMJUAgIEsjUChfUCAgSyE6ICAqUF0iL1wgICpQCi1NNyAgIkwvQENfICAiTCYgICBLI1woX1AgIEshRCAgKlEgIi9cICAqUDogICJMMDBDXyAgIkwmUCAgSyQoCi1NKF9QICBLIVAgICpRIyIvXCAgKlA9ICAiTDEgQ18gICJMJ0AgIEskNDwgKENQICAiTDFAQ1AgICJMMVFQCi1NIDIvICAgKlEoIi8gICAqUSkiL1kgICpRKiAgIkwzIFNeMCAiTDwgICBLJygzRVkuPTAgIDNFOCAgIlwrCi1NK1BJIkAkJ1kgICpSIyRKMDlQQTgyJSogMkkhRl4kSiA7UTEnXjAgIkxAQSVcUFAgKCUpLkQlRSpNXElNCi1NXUIxTl9fQEY7T19cM0VZLj00WTYgICBPIkQ3WSAgKlIlJEoyOVBAQDZEWjAySSlGXiQqRzInRCAgIjUgCi1NOD9cICAgI0YpJltfXyRZPjNHNS41QCAgMktEICBAIFw5QElQIDIvICAgKCAvJiZcM0VZLj00Q0dALCEuCi1NTjAgICpcQSowJjwsM0tEICAiTUgzLVwjIDRZVTInQCAvNEFaICE5KD4gICIzS0QgICI7LjInQCA4VFpZCi1NICAgRlYkVSMtQ0BYLiMkQDlGUU84NzFJO0Y8QDwmXUk7RzBAO0ZdVCgmJVY4NkVMODYpTDkyIE0rMiFQCi1NPEZdRzxGJU0oJylFPDc1STxGNVMoJkVUIkAgICAgICAgJFk2X19BKFVSIiArQlggIiYgNCheVCAiICAiCi1NTEFATyswICQrUDxANTRaMDQkXEo+MCAiTEFBKkM2O0IzS0QgICI7UCtQPS5OMCAgKU1BODNUU04oKCNfCi1NXiRZPjNHNCAgJFk2X19QTkM0QVggIFEuTjAgICtQQTgzUkkgMkhVRiEnI184IUhKS0AgKCpWWCAjICAkCi1NKldEICBLKDggIEBDUzAgIkxBQVAgIklOX19RLjdEWVUgICEuXjAgIClOISg+ICAkM0QhRVxEWVUyJ0AgCi1NIDRZICAgIENQICAiICQxUF9UWVUgICAgICAgIDNFOCAgJEFZICAgRyFEWlkgICBXKCVBLzNFWS49NFk2Ci1NX19BKFVSIiAqRlggIidbXzJIVUc8IyBNICEgIkAgICAgMC1HLkMgTSAhICggICAmOUMgUCswIDAiICAgCi1NIEY8JD9AIUAjJEE1M0tEICAiPjQ2JFxOICEgTSAhKSlQIlwgM0tEICAjQVY2JF0qQCZQIj9PXFArMCAwCi1NIiAgICBWPDArUlQgIiRaWSAgIFAnRUEvMEpUICIkKU0gISEiRTJNTSAgQCAhJCpNICBQQCFUU04oKCNfCi1NXiRZPjNHNS41T19cK0hUSjtAICgsIlQgJCBAICAgJUYpRiBcLCJUICQgQCAgICVHKSRKTSAgQUcnQiBNCi1NICAyUEswICg4UTEoNTRaWSAgIEk4RUEvLCJUICQgQCAgIClHVEMgTSAhICggICAlOVAxUF9WICI8ICBKCi1NO09fXDNFWS49NFk2X15RKFVSIyAqRlggIyFQTiAgTFArMCAwIEggICAgIjIjKCAgICAiIjlDUEArMCAoCi1NVCpUICMrIk0gIDFDICAiXCgmVCAhJSkoKlRAICEhJSZfX1wsIUAgKjlAICEnREE1M0tEICAiRUI2JF1eCi1NX1siJzlAICEjJiAgIDAwUCswIDA/QTsgQVdYJkwoPUYsIVUmX19dIkU0QVggICUoO09fXyQiVCAkREcgCi1NK1AhLk4wICApTFleIDsiJzlQICBVQCFNICIgICQnI184ICAgU0MgTSAhIV4kTCInP0AqUEFWOEAySlQgCi1NIiY8OigiVCAhKyJNICBBRikkSjU5QiBQKzAgMCBIICAgICIkOUExKDU0WlkgICBJWUVBLzJIIUchRyNfCi1NOCAgIEMjIE0gISAiQCAgICAoMUYgL1xGMiU1Lk4wICAqNik4M1UuNTsxIEA7MCAkNERASzIgICQkNDtfCi1NX1YhLCwiVCAkIEAgICA9RyxCIDUxKCJQSzAgLDsiQEA7MCAkJCg4LCFAICo5USBAOzAgJDREQEsyICAkCi1NJCJDX19WIDwyJTRAOzAgJDwgIDAkJiAmMiU1UCAhICYrUCEuTjAgIClfITAzUyBNICEgKCAgICU5UDFQCi1NX1YgJDwgIDAhRFNOKCwjX1skWT4zRzUuNU9fUDItPFBQIklOICBASDswICgrIlQgISlSLCpUUCAhIyBNCi1NICEgIkAgICAgKDFHISdYIDggME4rMCAsKkg9KkU2UCQ/QCFAIEJYNSgiVCAiLSJNICBSMEswICRMKD1MCi1NIkRBNTNLRCAgIk0gNiRdKkFGXEArUDkoNSEgTSAhKSlQIlwgM0tEICAiOy5PKCFHIkAhTSAiICAkJyNfCi1NOCApUCAkU04sLCNfXCRZPjNHNS41T19YMi08QEAiSU4gIEBQKzAgMD9BKyBBV1giTCg9RydDIE0gISAiCi1NQCAgICAwKUYhJyNfOCZBUFtcIU0gISFSIEghIS5UICAkIyBNICEgKCAgICY5RFkqSzAgKDlASSg1NFpZCi1NICAgSkBFQS8oIlQgISsiTSAgQUYtIyBNICEgIkAgICAgKDFGKiJKTSAgUSpFNlAkP0AhQCBCWDUoIlQgCi1NIi0iTSAgUjBLMCAkTCg9TCJEQTUzS0QgICJNIDYkXVAgJFNOKCgjX14kWT4zRzUuNU9eVDItPEBQIklOCi1NICBAMCswIDIyPCBMICMgTSAhICggICAiOVE4QD4wICIgSTEhXCZYICpUQCAiJ1goKlQ8ICMmIVorUDkuCi1NTjAgIC03ITgzVEogOVBYIDswIiAgISBOLyAgICAoIUAnREFOX1wwTyFEWlkgICBYQUUhLzJIIU0hQlhOCi1NX18hTiFCWFwgICAkICIgJzQoIE8gJFpZICAgTyIlQS8qVCAgIiY8LCAmVCAiICAwKlQ8ICMmIEAoJ0QgCi1NIEAqNDA/IU4gIk0oICBBXiIiTScgIFAiOz9dXyAhICA7MCAkICEgSzswICggIDEsW0IjIF9bMS43RFlVCi1NM0U7X10iKU4gIEBAOjAgKFQ+RCAjIiAoRCpEICEmSCYoVEAgISYgJkwpJUwgQiogM0VZLj00Q0dQLCBACi1NLjAgIiAkUCwwICAkOUA4UC8gIDI4IjAsMCAgIzlAOFAvICAuOCFALDAgICI5QDhQLyAgKjggUCwwICAhCi1NOUA4UC8gICYzRyUhXjAgIkpaUUAhQi1RICAgICBCKThMX1AgICAgIDlPIS4wRFM/IFAtLj0wICAgICAgCi1NICRbWSAgIEtaICAgM0U4ICAnKCEoXCQgIEsoPCgmWCAkJVJIICBRLjdEWVUzRTtfWSJaJzJLRCAgQCE4Ci1NOVFILE4wICAgICggIEAhODlAICBRJ1gjKFw8ICBAISw4ICAgTiJVXCAgIEtUL19UMEpbX14kKk5fX1EoCi1NO09fSDImW19dJEFYICA9Lk4wICAtWiEvW1AgLDBLRCAgSyg8M0tEICAjSDgyJltfXSRBTl9eQSg+ICAnCi1NM0tEICAjPkAzXlwgIyRKWSAgKlInJjwkP0AlQCBHWCIoXDwgIEAhOCMrRCAgICAiICAoIDYmOS4/QCxDCi1NUVAgIiAkUS5OMCAgLkMhKkAmOFYyJ0QgICJTQDInRCAgQCskM0tEICAjRVA0JF0oPjAgICsyISg+MCAiCi1NIEwxLk4wICAuNyEwM1RBWSAgKCJRJFpZICAgR0UlQS8zS0QgICNIOCMrRCAgICAiICAoIDYmOCQ8ICVACi1NIEcgICtCW19ZJFk+M0c0KiglIUw5NiVTOTIhTjtXMUUuQiEtMFM4WC4jQFEoJzVQOVcpQTkmNEA9JlxACi1NMDNEUzNCIU04Ny1LKCZVQT4yIUI5MiFBOSc5STxWJUI7JjROKCBIIDRWNUUoJDlMO1YlVDo2WUcrNSFPCi1NOjZZVCglIVI7Vj1SODZVTTk3KEc8UiEnPTZFRDkyWCogJFk2X15RKFVTI0AqJ1AgIEAiUCpFMEorQCAsCi1NKyJYICImIDBPKlQgIiYwJCokVUAhJEdNICAwSjUkSi05QDFeICYgJCtCVCAjK1olOS4hLk4wICAtKDBOCi1NICY9JCooPEAxVCowMEpAICEiJSYgIEBBMTAgLCgkOEBBMkEnNig9KkM2PD5PKlQgIiYsLCooVSlbMCAkCi1NKkZUICEmICgoJDxAQzJYLSpFNSpDNjtCRlxUQDFSIi0qKFUsW0MjQF9eUS43RFlVM0U7X1okQzcsLyBKCi1NO0AgKColNEwlJjgkPiAhQCFCISYqIkAgIyJYTCAgMUYhJ0ggOCA4QDFSSEggIFJcQVY9VE4oNUUuJEomCi1NOVZBKkEmODooJDhAKiAgKDYoIE8gJEFZICAoIFwkWlkgICBVNyUhLzgkWEpBRUImKkQ4TCU2OCQ+ICFACi1NLyIhJioiQCAjJiBUMkg9RywkSiU5QUhAMVIgSCAgQThAIlwgMidEICBAJCQzS0QgICM1PDQkXUAlQkonCi1NKkQ8TiU2OCQ+QCFAIUIhJypCQCAjK1InOUhRIkU0QTQzS0QgICM1IjYkXSxbQyNQX15BLjdEWVUzRTtfCi1NWSRDNywoIEo7QCAoKCU1KkImOCQ8ICFAISIgSCAgUEg0IilIICAxKkMmOCQ/QCFAKUJYTCAgUUAoK1ohCi1NOTE4SkMkT0wgIDBINTRKLDlAMV4gJiA4K0JQICMmIDIqSERKMjIpNTJIRUYhJyggOCAwQiowICxPSCFCCi1NVCsqIDhMUEpCIiIsKDREICEkU04sKCNfWSRZPjNHNS41T19EMi08UF4iQE4gIEE4QSdYKE4oPUQhJ0AoCi1NOCA5NkEuMixZOFEqTjAgIiArIUYhJ0ggOCBIQD4wICIgKyBKKiAgLE5IMUQlIlwkM0tEICAjLyg2JF0qCi1NQCY4JjwgIUAgICMiKidQICBAIlAqRTFAKCtaJjhAUl5BJjA0Mj5UICEiSSM4ISJcQSY0KDI+VCAhIkkjCi1NOCAwSDMySSUqQTRGKzAgJDJINUYhJ1ggOCA4QDEyWEggIFEqQFY4JD8gIUAhQiEjKyJAICMrWiQ5K0pcCi1NQSYyVigiVCAjKSIkP0BCUEFWKDAqQlQgIiRBNDNLRCAgIlc6NiRdQCtCSE0gIEBOIT1aJCgkNEYkKTokCi1NKlQsICMiIScoKC0yTjAgIiAnMEsxUCAoMiUxLk4wICArSTE4M1IhJSgoMEAxMiAwVDtEICBAIkQ0S0QgCi1NIEAiSE4rRCAgQCI4OSA5Mk4wICIgJ0E4QTIgJTMuWFBeL19EM0VZLj00WTZfXiEoVVMjXCkiWCAiISAiCi1NP0AvIEFWPDYrUCkoPjAgIiAxQS5OMCAgLTVRMDNXICA4ICAgXCsyWSAgKCBNJjQoTStEICBAIlg4UFleCi1NJUIvJyAgKCAxJyAgOCAgIFRCUCI2ODhAMUJAMEY7RCAgQCJENFtEICBAIkgqJ1AgIEAiUCpFMSpDNjwgCi1NICooTiswICgpQlQgIytSJzkjQEohTUokTkg9RiUtQiM0W0QgIEAhVDIlMS5OMCAgKz1JODNWIVBOSD1DCi1NJSJcJytQOSg+MCAiIDU9Lk4wICAtNVFQICYhTiokVUA1K1InOFNQSiFdSiNOSDlGJUJQJ1YoLTNOMCAiCi1NICcxKDUkWlkgICBNVkVBLzgjKlpBRiw0K1ApKD4wICIgNzkuTjAgIC01UTAzVyAgOCMhKVswICQ4ITBPCi1NIERBWSAgKCFGJFpZICAgVTclIS88ICFAJUJJNDJIVUYgL11CK1AwTyFEWlkgICBNMiUhLzwgJSxbQyNcCi1NX14hLjdEWVUzRTtfXCRDNywsIEg7QCAoKyJYICQiWE4gIFI+QUcoKE9IJUUoJE9UOiAgSkFSQiY0S0QgCi1NIEAhVDRLRCAgQCJIMiZUICEkWlkgICBQJ0VBLzYkUEAjJFNOLCwjX1wkWT4zRzUuNU9fQDItPFheIklOCi1NICBAQCM3WCNQKD1GJCtPWSAgKCBNJjQoTl9EICBAIlg4UTkoNTRBWSAgKCFORFpZICAgVTclIS88ICFACi1NICAjVDFeV19fIkAzMD8tKCAiUCgyJ0AgIDJcJDIlLS5OMCAgLEwhL1tQICw/T15QQVY4JjwgIUAgICMqCi1NK0JYICMlQic+QEJeQTYwJD1AQUAiJTonWShfRUNSOCdOKC1FJCJcIytQMSg0VFpZICAgUTAmICAgKVpcCi1NTjAgIiArQUQ4QkFcICAoIEwiSTQoJDhKJCYgKjI+VCAhJiAiKiRUSjUkSi05QDFeICYgJCtCVCAjK1olCi1NOTNITiswIChPKD1FWStSJzhNSE4hLVolT0gtRSlEQTQzS0QgICJXOjYkXTNOMCAiICczO04wICIgKjBGCi1NQVJcIytQPSg0VFpZICAgUTAmIFIrUlggIyRaWSAgIE8iJUEvKkQhKkM2PD42JE05QSJcJDIlNSg0VFpZCi1NICAgXSIkX08gIFEoNFRaWSAgIFAnRUEvKCBVLFtDQ1hfXiEuN0RZVTNFO19ZJEM3Ly4gSitAICwrIlggCi1NIiIxJlU8NEY/ICAiICshQCIiOS04IDEnWzAgJCpFLSpDNjgkP0AhQCEiWE0gIFJeQTY0ICAsOEg7MCAoCi1NTyhRRickQTMzS0QgICJXOjYkXztOMCAiICoxMk4wICIgKkFQIDYgICAqMlxDJjZcK0BTPkUrUic5K0JVCi1NUVYsOjJKWCAkJjwwK1A5KD4wICIgRD0uTjAgIC01UTAzVyNfOCdCVVFWOE4yJS0uTjAgICs9STgzVSpZCi1NICAoID0tTlkgICggSSUyWSAgKCBKKU40MiZQICEkWlkgICBQJ0VBLzwgJUAxREEzM0tEICAiVzo2JF00Ci1NTjAgIiAnMEAlLSZZICAoIEklOlkgICggSiIgJ0QoOjFFKVoqKSg9KDsgICQzS0QgICMgPjYkXSg6QCAkCi1NM0tEICAjID42JF1QIDYgIjwgISxbQ1NAX14xLjdEWVUzRTtfXSRDNygsISpOMCAiICZRRihEWlkgICBYCi1NSUIvICAgKCA7JFpZICAgVEEiSSAySFVHLkRBNTNLRCAgIzUiNiRcTi4wICIgJlEzQV1aTiAgQSw+NyAnCi1NICAoIDskUFk8IDwgIEAhTCsgPE8hRFpZICAgWFglQS8qRCFSX1tPITlAMVAgJiEsMktEICBAIlQ5QDhDCi1NUzAgIiArMSFdNkAgKFxAICBAIlgqSDxALjAgIiArQjBOMCAiICswQ1AgICIgJyM/TjAgIiAqMTJOMCAiCi1NICcxMk4wICIgKkEoOzAgJDNLRCAgIyA+NiRdUCA0U04oLCNfXSRZPjNHNS41T19YMi08QEAkSlkgICggCi1NUSY8NipHRCAgQCMkKCdEICBAIyQoXSAgIEAjJDggICBDREpZICAoIFAmWVArQ1AgICIgJCtQPS5OMCAgCi1NLi4hODNSSSA8T15QQDY4MjInRCAgQClZM0tEICAjNTw2JF1QICYhPDJLRCAgQCJUOUA4Q1MwICIgKzBKCi1NQVQnTSAgMENSICAiICtQQ18gICAgQCAgIEAjIDA/NVggIi8oICAoIE4iIFkgICggTikiWSAgKCBNIi8gCi1NICAoIDwtXlkgICggSyUuWSAgKCBQIklZICAoIE8nWDBXW0QgIEAiXCggVSxbQiIgX19BLjdEWVUzRTggCi1NICIhTiAgQEBOMCAiICwwQ1tAICggICggUSRZPjNHNS41QCAgPEE4Q1AwICIgJDEuN0RZVSAgICAgJFk2Ci1NX15ATkFSWFkgICggMSRBTl9eUSg+NCAyNSAkTytAICgzS0QgICNCVjJIIUwiQi8nICAoIDEnICA4IClQCi1NIDJYTl9eQS43RFlVM0U7X18iWi0yS0QgIEpaTDlDQEo/ICAiIElQUCswIDAgSCAgICAkIzlAMEAjNiFICi1NMl5UICUrT1wgICglJyY3RDNLRCAgIzhcMkghRiMnKCwoXCQgIEAhJDwgIUAxQklZICAqTkskSjU5UjBACi1NNTMgSCAhICJAICAgIDAtRyVFQS1OX0QgIEpaUDk+MVImIi8hICAoIDEnICA4IUEqRTY4MjInQCAlJEFYCi1NICAlLk4wICAvOSEwM1JKICghNEo7T19cM0VZLj00WTZfX0EoVVIiIDNLRCAgI0I2K0AhKD4gICQrUD0uCi1NTjAgIC85ITAzUi8gICAqTkskSlkgICpOSyY4JDwgIUA3IiAnWVggTyAkWlkgICBPIiVBLyhcICAgQCo0Ci1NOUFATy4wICJLSlEuTjAgICwhWTgzVCpZICAqTksnICA4IlhAPjAgIktKUSFcJ1AgKFxAICBKWlArQ1AgCi1NIEAqPCpHRCAgSlpMOCA4SlFXKDRXSCQsQVAgIiExUUVcRyAhMy5YQEAvX1gzRVkuPTRZNl9fUE5DNEpZCi1NICAqTksmOCozS0QgICM4XDJIIUcrQklZICAqTksrT1kgICpOTCYwQDJJNUYkREFYICExKD4gICEzS0QgCi1NICNWMDQkXEpAJUEtTl9EICBKWlA5PiBKO09fXDNFWS49NFk2X19QTkM0Sk4gIEFHOURKWSAgKk5LJjhKCi1NKkdQICBAKjwsIlQgJCAqICAgICEgVjwqMiU0QDtAICgzSSE4M1RPTSAhMltfICAiITFRRC1GIzwqR0QgCi1NIEpaTE5fRCAgSlpQOSI5KkU2PDgoJTRQKiAgMCBIICAgICQjOVBITyUyIU4gIEEuRCVBLzYkVlteMCAiCi1NS0shRVZCSU5fX1EuN0RZVSAgICAgICAgM0U7X1YkQzcvLiBOK0AgKDtQOVwoK1omOzA5XiVGICAgKjhECi1NO0AgMCsiWCAjIiAnNFghUiA+JkErUCUuTjAgIC4sOTgzUkggMl9EICBLKEAyXzVcICI5NTIlKE8hQlwnCi1NM0tEICAjRUYzXlwgIyRKIDpVOSpBRjxWMD5bX10iKSYoLURAVjIjOTI+W19dIlA0OVBZUiA7UiE5UEBKCi1NQUJCXCAgIFkmJCpHMiUwTyFUWlkgICBZOURfTyAgUSpAJkw8MkhJRyJAUjIgICBZJiY4IikoTE8hNFpZCi1NICAgWFVFQS88ICFAJkJYWSAgKCAxIlwlM0tEICAjQzY2JFxKQlIvJyAgKCAxJyNfMy5YXFgvXzgzRVkuCi1NPTRbWSAgIEZYJEFYICA5LjAmN1IzRzUuXjAgIClOISg+ICBeM0QhRVxEWVUzT0QgICI7QDInQCA2NFkgCi1NOT8pLj00W1kgICBGWCRBWCAkIS4wJjdSM0c1Ll4wICApTiEoPiAgVjNEIUVcRFlVM09EICAiO0AyJ0AgCi1NOzRZIDk/KS49NFtZICAgRlgkQVggJlkuMCY3UjNHNEArUCAkNUghUl8sIiFUK0QgIEA0PCtUICAhJEFYCi1NICElLjAmNDAoI0QgIEA0PCheXCAhICAiITFRLj00W1kgICBGWCAgICAgICAgJENHUCwhLk4wICAuRyBACi1NK1AkMFk4QEA/ICAiTEIgQDwgQCArUlwhJyJcTyAxUE8rUCQ8K1JcISckWjBXX1AgICAgMDNLRCAgI0pYCi1NMy1cIyBdX1wgICAgIiRBWCAoTS4wJFtZICAgRlgkQVggJlEuMCY3UjNHNS41T09YMi08QEAiSU4gIEEhCi1NW0AgMCtAQFArMCAwIiAgICA2ODYsIlQgJCBAICAgQUciICFNICAoICQmICQ8L11AOkMgTSAhICggICAiCi1NOVRYIjs/X1sgISEhW09QICpUQCAiJCdOXyAgSzIgICQqV1AgICAwICAgUSg1MlwnK1JYICMkWlkgICBdCi1NWCRfTyAgUE4gJEE1M0tEICAiPjQ2JFwgOzAgJCAhISJLMCAoMEpUICMkKjU4ISEoNTJcJytSWCAjJFpZCi1NICAgXVgiWCAoID0sW0IiIF5fQS43RFlVICAjUi5JUCAgIDEuPTAgICAgICAgICAgICAgICAgICAgICNSCi1NLkUwNCAiQ1IgJjAgIyggRUAgICA5QTtSLkUwICAhW1IgJjAgIyggIEAgICA5QDFQIDYgIjBIIS49M19QCi1NICAgICAgICEuIF9fX19YICAgICAgICAgR19QICAgI1wrUlwgXyQnTyAgMEAqICQwKCwgLDAgICg5UlBACi1NLjAgIiAkUEBQIFEgICAxRiIkWlkgICBbWUYgNiMkICAgVjgoM0tEICAjS1o4IEAsMCAgIjlAKUE2RFlVCi1NMD5cICEiIDgjJCAgIiY8SighQCwwICAkOUBBLk4wICAvJiFAJkBRICAgLUYiJFpZICAgWyFGICwjJCAgCi1NIEY4JjNLRCAgI01WK1U8ISAtX1wgICAhICRZVVxBI1BQLyhITyAgICYkWVVcQUMwUC8oMEcgIS49MilZCi1NICAoJVUjIElfX1goICAgLjlQQFE/ISFDICIhQChESUlfX1lKWiRBSCAiIE8vJCAiICAgTy4wICJMSiEuCi1NTjAgIC4rOz9fICAgICBQUz8hIUNfX1BTPyEhIF9fUEBEMiUxICAwQTQwICgoNSQgIyIlMSAhIEE0MCA0Ci1NKDUkICYiJTEgIVEuPTIpWSAgKCVVIyBJX19YKCAgIC45UClAKERJSV9fWUpbREFIICIwTy8kICIgICBPCi1NLjAgIkxKIS5OMCAgLis7P18gICAgIFBTPyEhQ19fUFM/ISEhX19QQkQiKkggIDBCSiAgKChKQCAjIipICi1NICEgQkogIDQoSkAgJiIqSCAhUFAqP19eIiAgICNGP1YsVkAgKC9fXDNHN1IkLyMgVD9QICAgIDhcQUJcCi1NICIpXFggIC8lIiM5KC1EQFYyIzkoLURAVjIjOSgtREBWMiM5KC1EQ18gICAgICNAICBeJChHU0AgIFggCi1NKC1EQFYyIzkoLURAVjIjOSgtREBWMilcWCAgICAiLVwgICAgICBcPChXUCAgICAgI1EwQz8gICAgICgoCi1NVC8oXEIgICAgICAgXENSMCAgICAgICEuPTIvXCAgICAgLiAgI1gzUiYtIyBcQUI8IC0nXCAgICArIilcCi1NWCAgLCAiKzgoTUBCViIrOChNQEJWIis4KE1CMV8gICAgJFBCPy4gICNRMEJWIis4KE1AQj8uICAgICBACi1NKiAgOCBIICAgICAvKFQgKFQiLUggIVApNiItXCAgICAgIEckKCEhIVogICgzS0QgICNTPigiQ19fJCdICi1NICBBLk4wICAvLVkuPTRBICIgICAjVjg6IEQgP18iLjAgICEoMCBAICAgXUYiQCkgJ19QQ0ogICQgICEuCi1NPTAgICAgICAgIiFPICAwQjtQICgoIlwgIyZdLChARjJCJlAgICAxJEA7KiA7MCAgMCMoKCIgJCAgJjwkCi1NJE1BM0AiKCkiICQgICY4PihAI0RCJiAiKE1BMVIvX1wwRCEzQCYzVCggJCJAICAgICAtQCBBKzg0PENfCi1NXyQpIDRYIURdJFlVTFxBTiQmICIkTUExUi9fXDBEITNAJjNUM0c3MVAtLyA4ICgzKCUnKF9fUSIwJS4gCi1NOS8xLj0wICAgICEuNU9fWDItPCBQIlBOICBBLCtGICYgIFBPIURaWSAgIE8iJUEvK0AhRiEnICA4IFhPCi1NIUJcJzNLRCAgJF9YNCRcQCFUU04gLCNfXiRZPjNHNS41QCAgK1JYICIkWlkgICBQJ0VBLzNFWS49NFk2Ci1NXUghKFVTU1wzS0QgICVYVigkIEA0IVUwX19dIktPX1g/QCRNMV9fVDBKW19cIlVOICBTX1kiVU5fXjNfCi1NWiJVTl9eQ19bIlVOX15TX1giSU4gIEA8JzY9JilGWCAkIyBLICEhXiRMIic/QCpQQVY4QDJKTCAiJjw6Ci1NKCJMICErIksgIEFGKkRKMzlCOFAqUCAwIEggICAgIiQ5QUkoNFRaWSAgIElZRUEvMkghRyMnI184ICAuCi1NPicgIDggIC48RzAgKSZMICEiWDMwPltWUSJVKF1LISFbTzskKzRDVk0kJ05dTDBNMi87NCMgOCApNjwgCi1NIEJBM0FWSEwsIkwgJCAqICAgICBBJjwqKCA9JEArIksgIFFNJUI9KiAgMSg0VFpZICAgSThFQS8pJkwgCi1NISJYMzRYPDRRRSoiOCAgLU5CIU5fXkBINCVCTl9eQSpDJjgmKidEICBANEQnIVFHICBWQDRYPUorIyBLCi1NICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsOzE4RzJAICQyJS0uTjAgICo2KTgzUjFLICAwTiRVLiclLDkyCi1NQEYjJCgmW19aIiAwJyAhOEtPX0g0WD1KKyMgSyAhICJAICAgICgxRyJCICcxKCJQSlAgLDsxOEcyQCAkCi1NMiUtLk4wICAqNik4M1IxSyAgME4kVS4nJSw5MkBGICAjMjhAO09fSCshIThLT19IMkg5SjElLic6QlBQCi1NKlAgMCBIICAgICIkOVBIQCFUMiBMKkwgIyZUNilUSCAhJEEzM0tEICAiRUI2JFxEOlAgJCtBLTNBUTNcCi1NICJVMkBEMiY4IEhAO09fSCshIThLT19IKidEICBANEgyPltbV1JIWSAgKCUqIiAmMydQICAwICAgIEhACi1NMTFEUCYgISw/JiAmICAgICJGO0Y4ICAgQiJIWSAgKCUrIiFOX15ATCQlQk5fXkEpW09PPzJIOUcgICJYCi1NMkg5RzonIC9QKDhAMTFEUCIgI0hDRjtSOCVASi4wICIhMkBAO09fSCshIThLT19IMj5bW1dUSiY5UCAgCi1NQkRKJjlTSVAjXCImKCQ0OSwgQCBaKFlGXEYgSipDRCAgQDRIKCZbX1oiUDA2KltfWiRHTl5dXSpBRj08Ci1NMkg5RyNHICdQKDhAMTFEUCIgI0ZDRjtSMD5bW1dSOChOPC1EICBQNCchUTNBVkhMLCJMICQgKiAgICAgCi1NQSY8KiggPSRAKyJLICBRTSVCPSogIDEoNFRaWSAgIEk4RUEvKSZMICEiWDM0WDw0UUUqIk48LUVRRiAgCi1NIl05XCwmICBfRzE1MzYhLigkVTIzMSAwMjwhXD4rIiY4TlkhXkAgUDxAVlAmJTMpX19RRlgjIFskQDkuCi1NXlAgIl9IK183T1sqX1ArXi9PWiJfXVNeQE9fPF9VW18sL1dOX0xLXywnQVU8VyFPOyZFSDkmLTg1NF0kCi1NMEJbW1RUKE5eXSkiK09PMTBCW1tUJChOXlxdIitPTy44Ijg9PyAgIV5dKUAnQVVcICAnW1Q2IDYnN1AgCi1NID9PMDggWD0/ICAhXlxdQCFBVVwgICdbU0UpLSQhNSlQJ1BATCg5R1dHUENMKDlHWCdQS0woOUdQR1BNCi1NTCg5R1EnUFBMKDlHVUYhPDJKW19dJjw6MiZbWyAiXE5fXjBPK0AgKDNLRCAgJFNKM15cICMkKk5fXzAsCi1NS0AgICAjK19cJlg0KCJbX1wkL1YjMiNaXyJVKV1KSE00P19IOCFQTTtPTyRfXkBPK09fUDImW19aIlxOCi1NICBBLk4wICAzR1kvW1AgLDREVCwlMCBKOUAgIEhFKS0yJltbUiRBNTNLRCAgJF4+NCRcSiAmPVQySltfCi1NXSY8OjImW1sgIlxOX14wTytAICgzS0QgICRTSjNeXCAjJCpOX18wLEtAICAgIytbUiZYNCgiW1tSJC9WCi1NIzIjWl8iVSldSkhNND9fQDghUE07T08kX14gTytPTygyJltfWCJcTiAgQS5OMCAgM0dZL1tQICwoJltfCi1NWCJQMDYqW19YJEomOkBBJEFBVVwgICdbVDJJJTgkQEA7T19IKyEhOEtPX0gySDlKLkQyJic3UCAgP08xCi1NOCMhXCAkKk5fXyFAJUEgPTI8IVosKSIlVyg4QiFONiFXKCc8QCJVJl9fIDAlNEIgMD9EICBANz0iIyAgCi1NIEAgIDlNQCwlMCBOOUAgIE8lKS0jITQgKkY4ICAoSTIzNEFOXk9RKDU0WlkgICEvR0UhLyogIUc6JEpOCi1NX18xRyZEQU5eUCBPK09fRCtSWCAiJFpZICAhLFpEX08gIFEiS09fVCMqWCAgICBSXk9RTiUiIE5eT1EjCi1NXUBUQF5PUE0yPzpKKzUnX1smIDwrNltbUS9fTCtSW1pfJEFOX15QTytAICgzS0QgICRZXjNeXCAjIiFOCi1NX15QSiQlQk5fXlBKMSYgVigmW19aIkgwNipbX1omIEo+QCAwJTRCIDA/RCAgQDc9IiMgICBAICA5UTgwCi1NJzRHID4jIjBBLUolKEA3RUA9SiFWSCFAVkdLXyMhNCApJjwgX0ApIktPS1grN1AgIEA1JF5PMSJLT0tQCi1NKzdQICBANSReTlFAICA5SCc3UCAgP08zOCAgJjdBVVwgIEtaWlYgLic3UCAiL0tLOCA4PT8gIDBeTk0qCi1NQTZQIj5AJEA7T19IKiEhOEtPX0gjIlggOS9LSjlRICwrQCEkXk5JRyIgUE4gJkdaWkY4TjJIMUwjIlVcCi1NICAoJTE/S1QxKDFAJ0RITl5dKUciQlVcICAoJTFfS1Q4IFkqK09PMDlQQE0/ICAiITRHWl0kSE5eXFlHCi1NJUJcTl5PMS5OMCAgNCkhODNSQSZGPCJZUTZcIipAUCwrQCE4Xk5JRiIiOFkgICglKyYgJilDRCAgQDRICi1NMj5bW1dRIE5eTk0pUCcoKEwoJUciJygwTCglRyVGISAySDFHMCcgJ1AoMEAwUURQIiAjRkMmO1I4IyEqCi1NQSY8TDwgXyBBIiEjJjMgKCAuQiw5TylAJyIgJDMnUCAgMCAgICBIQDBRRFAmICEsPyQgJCAgICAiREokCi1NOU4xIVtPTz8pQEBAIykiI1QoNE0wL0tYMkJbW1NWPCAhOzpZUFY4UjggICVLQFJOICAgICA/S1g7ICAlCi1NSEdIISs0N1peJiAgITlATT8gICIhNE9aXSYgICE4UE0/ICAiITRbWl0mICAhOCAwK09LSjI8IVo2KyIlCi1NOV5BWjtbIiU5XCFaPisiJTldIUAgIDVEMkg1TCBHSCYyQltbVFY4WCgmW19aIlUwXk4gTTogICReTjEwCi1NS09fSDImW1ZWJEFOXk1BKDtPSzwoIDUyQCJcICtSW1pZIlxOXk4hLk4wICA4P0EvW1AgODgjOEg7Tzs0Ci1NPUEjNkMiIU5fXkBIVCVCTl9eQllQVjdSMiZbVlYkQU5eTUEoO09LPCggNTJAIlwgMiZbVlEkWlkgICIoCi1NPCRfTyAhMEgwJEpOXk1BRyJCVVwgICglND9LVDghWSorT08yOVBITT8gICIhNS9aXSYgLjJCW1tUJjwoCi1NKzdQICBANTVeTzAsK0AgWV1NQU8lREdOXU1BIVsgICEpQEBAMFRIMDlQICBTRSojOC8xIVtPTzQpQEEqCi1NJSY8JCYhUUAgR0BQKCQsMEElKiMySDVGIURITl5cXUciIiEjJCpbX19VKiMrNDdaXCYgLjJBMUckJS5OCi1NXk8gQDBRIjw0SC0qS09LUDtOUSlbT080IyJYICwvOzg5UThKK09LPDRYNUokJDIlOCBRIVtPOyAqQEFYCi1NISYgWD5AISg7TzpePCAgUCEyXCAzS0QgICdCMDQkXSIrTzsiPiYyWkEmVzgjKDQgICAvSDsgSSFbTzpfCi1NKkBBWCE2ICgwPltWT0JIKD4gOE0xLzpYNFg0SCE0Sk5eTVFOIiBQTiAjI1ZWJjgkPkJNQCBHSE0oJDAwCi1NQTUuJCs0M1pbIiEkJCpbWlpESE5eXSVGISdIITggKVogISBOXlxZKVAsIiU5UCAjTyJcTl5PMS5OMCAgCi1NNCkhODNUJ05eXTBCIFkqKFQoJzBLT0tQVCpbVk4iKCZESCBNMD9LWDggICNEREolOyApWiFESE5eXS1GCi1NLSIhTl9eQE00L0tAKzZAICEvS0Q0KltfWiRBTl1NQSg7T0s4MiZbWlciXCUrUltaWSJcTl5OIS5OMCAgCi1NOExZL1tQIDg4IyhIO086VD1BIzZDIiFOX15ASFQlQk5fXkJZUFY3UjImW1ZWJEFOXk1BKDtPSzwrUDUoCi1NO087JDNLRCAgKEUmM15cICUiQSAySltaViY8Kis3UCAgQDU3Xk8xQCdESE5eXSlHIkJVXCAgKCU2P0tUCi1NOCBZKitPTzA5UEBNPyAgIiE1T1pdIFBOICNHVlYmXDYyPltWViQnTCAgJEYiIiEjMkEhRyAgKzY0SC1ACi1NXSQnTl5dMEYiIkBOXk1RTiJCISMkK1AgLCUqIzghOSolJjgoKCQsME8gIFA4IDBAMFEiPDRILTNBJjtKCi1NMkJbW1NWOCQySDVPIiIhIyQqW19fVSojKiA0QCE5IiUrNCNaXCYgPDRKW1pXJEpOXk1RTyEkSDQ5QEBACi1NMFEiXCAjIUAhIiEjJClRMkBVLiQ6TiEqK09PMTlAOFg/ICAhOCAqOVMhIE5eXFkpUCIoLFAoJUcoQlxOCi1NXk8xLk4wICA0KSE4M1QnTl5dMEIgWSooVCgnMEtPS1AoQDoyQCJVIV5PQSlbT080OCAgIikkSiU7IDFaCi1NIUYgJjJINUYgR0ghMkJbW1RWOFQoJltfWiJVMF5OIE06ICAkXk4xMEtPX0gyJltWViEgTl5cXSlQIlwgCi1NK1A0TytPS0QrUltaWCRaWSAgIUVLRF9PICExQCxCQU5dSyFWJC06LCgmW19aIkMwNipbX1orRyM5PykoCi1NO087OCQiW1tTVEcgK1AgTyE0QU5dTDEuTjAgIEJDUS9bUCAwMj5bVlYgUE4gIldWViY4LCs3UCAgQDU9Ci1NXk8xMjMmID4yQltbVEY8Kis3UCAgQDU/Xk8xQCNESE5eXSFHIiJVXCAgKCU4P0tUJCJbWlpEQiAwP0QgCi1NIEA3PSIjICAgICAgOVJIRiMmICooJCwsJCAhRTlQQTJAUiEjMkEhRlwiISMjISAgOTY4JCQrUCAxMiEjCi1NMkEhRyQlKiM4LzhGIyYgIjRILEAwVEgwOU9BIktPS1AyQltbVDY4JD5AJUAgR0ggJCJbW1NERyBQKDVHCi1NICAkLitSW1pdJFpZICAhMEQlQS8oQC4yQy0iIShAOjJAIlUhXk9BQCAgI1AoJltfWiIgMCc0I1tVJUJOCi1NX15BKVtPTzQwPlAgIDI4KDggICBVIiFOX15ASDQlQk5fXkEqQTZIJipDUV9fX19fMkhRRiFCQVkgICglCi1NKSdAIDggOlhBNlAoNEgwPTcvOk85TzEqK09PMTlAMVogNiAiPkAgMCtPTy4yPCMgQTY8KCggOjBBIlUgCi1NXk9BMzMiOCxGPDFAP0dIISs0N19eJiFWMj5bWlpEJ0wgICRGIiYhSigkVTIzMVUwXk5IMCtPS0oyPCFYCi1NPisiJDhOISFeQCBePEEyUCYlMylfX1FGVEMgWyRAOS5eUCAiIEcjWT5PSz5fQVtZPC9GIl43S1lCT10yCi1NXjdLWldPUlBfQVtfVU9FWl9dO19QT0YiX1ZbWT5PRio+JzVTO1ZZTDo2QUc5RjVEOFVBNTNUUScxNDAgCi1NICRKTl5PIUwhJ0ggOCAwSitPS1AySltaXiZQJD4gIUAhIkBOXk9ATytPS1QzS0QgICUiMDYkXE0wLzpKCi1NK1JbWlskWlkgICEwRCVBL0coNjxAIiAjRChSPEApUiRHKltWSkRITl5dJUY+RiBWNFg9SisjIEsgISAiCi1NQCAgICAoMUciQiAnMSgiUEpQICw7MThHMkAgJDIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUvUCAoJSoiCi1NNFg5SlFGIFw0WD1KKyMgSyAhICJAICAgICgxRyJCICcxKCJQSlAgLDsxOEcyQCAkMiUtLk4wICAqNik4Ci1NM1IxSyAgME4kVS4nKCZbWl0hMzA0SCkyS09LVCgmW1pdJEgwOUtRQC1FLic6QlBQKlAgMCBIICAgICIkCi1NOVBIQCFUMiBMKkwgIyZUNilUSCAhJEEzM0tEICAiRUI2JFxEOlAgJCtBLTNBUTNcICMhMkBFLk5eT0FKCi1NUStHIzknITNBVkhMLCJMICQgKiAgICAgQSY8KiggPSRAKyJLICBRTSVCPSogIDEoNFRaWSAgIEk4RUEvCi1NKSZMICEiWDM0WDw0VyUqIk48LUVSJiBWNFg9SisjIEsgISAiQCAgICAoMUciQiAnMSgiUEpQICw7MThHCi1NMkAgJDIlLS5OMCAgKjYpODNSMUsgIDBOJFUuJyUvUCAsJSoiNFpbWlwmSyQ4I1EzQVZITCwiTCAkICogCi1NICAgIEEmPCooID0kQCsiSyAgUU0lQj0qICAxKDRUWlkgICBJOEVBLykmTCAhIlgzNFg8QDtPS0wlLSEyCi1NQEUqTl5OUEA7T0tMMkEhRk8kSE5eXSVHLyYgVjRYPUorIyBLICEgIkAgICAgKDFHIkIgJzEoIlBKUCAsCi1NOzE4RzJAICQyJS0uTjAgICo2KTgzUjFLICAwTiRVLiclL1AgKCUqIjRYOUpRQFJOICAgICA/X1g5QSBACi1NO09fSCglIThLT19IKCgpIktPX1gnIVVGIC8oJClUSCAhIjonLCJMICQgKiAgICAgQSY8UCwiTCAkIEAgCi1NICApRicpN0sgIEBPIkRBWCAgSE8qUCAoM0tEICAlKigzXlwgIyRKIDlQSSg0VFpZICAgSThFQS8sIkwgCi1NJCBAICAgNUchJyNfOCAoQCBEU04vL1NWQCRZPjNHNS41T1w8Mi08XFgkQVggLEEiSVRBTl9TQS5OMCAgCi1NNCNBL1tQICw+T11cICJBTiAgQSg+ICBFMiUxLk4wICA4MEEwM1JYIDlQICBfRSonKiQ8Ty4wICIhMyEoCi1NNSRaWSAgIUE2JSEvK0AgLC0gIEQ+ICFGJERBNDNLRCAgJSJQNiRdM0AiUCA0SD85UVdYICggO0VAJD9WCi1NIjIjXy4iXFkgICglLSRBNDNLRCAgJiU4NCRfOVAiMSw0RFAwJERHIDxHLlBANilAMD9IIDpHKCpMIUE0Ci1NUj9fXDlFKFAuUSgmM09MICBPXVogIVAgKUAgRiAiOCApQCBGICE4IC4gIFIgIlAgIVAgITgqWCAhUCAiCi1NLkdQICA2IFwuR1AgISYgVi5HUCAgViBQLkdQICFGIEoiIDwgICY8Ji5HUCAhViA+LkdQICImIDgiIDwgCi1NICY/MC5HUCAgRiAsPFchTjsmPUY5ND0lKkI0IDJIOU0jRyhSTyglTCIiOi1OSDlMIEJIJjRIOTgyUEAnCi1NICAlRyAvW1wiSDwgICAgIjggI18wR1ggMkg1TTQkT05fU0BMK0AgMChEOEJLQCAsMkk1RiRHKCEqSCVACi1NIyUiTiAgUUAqJUJOICBRQChCIDU0WCFSIVsiIThBQFAuUEgmM09MICBPX0hfXkNfWi9fQl9eK19aL19ICi1NX15BMkFVQiY2JFZeQTZeWDMuWFxYL1w8M0VZLj00WTZfXVEoVVNTWCkmWCAiJ0hSKyA0SjtAICwpQlggCi1NJCYgLE5ILUcgICNSNik1MkE1KiYqJElYICYgIjRIOlpAVjwgIC1BKD4gIEUyJTEuTjAgIDgwQTAzUlggCi1NOVAgIFElKicqJDxPLjAgIiEzQSg1JFpZICAhQTYlIS8rQCAsLSAgRD4gIUYkJEE0M0tEICAlIlA2JFxMCi1NICUqJ1Y8PlpBRjpSPiAlXiAiXFkgICglLyRBNDNLRCAgJiU4NCRfOVAiOSw0RFAwJFRHIDxHLlBANikiCi1NMD9IIDInKCpMIUE0Uj9fXDlDMFAuUSgmM09MICBPXVYgIVAgKSAgRCAiMCApICBEICE4ICsgIEAgIiAgCi1NIVAgITgqWCAhUCAiNik1QCcgQCcgICEwRTYgNCIgPCAgJUI1OCBRUzwmWUw5VjlFMVQ0SikwITJBNSomCi1NIiA8ICA2PCBfUyAqQVAgICAgKUAgL11WMkgxRyAvXCwySDFGIC9cMjMuWFxeL188M0VZLj00WTZfXzEoCi1NVVAjID9AIVwgIilOICBBQCUlKiZXSDxCIV42IVdIJDImNEchV0glUiwpWiEkISUoQCQnWSAgKCVXMEBQCi1NICAoICAmOzoySDlHJEBQMSAiMUYjIiFOICBQQEFVKSkoIEVAIEcgIDMuWCBQL19UM0VZLj0yKU8gIDBACi1NK1AgKDtTKSJAMEBPICAgICFWPCQkTCUzQCIhIFkoQUAgQishNDxDX18kKSA0WCFEXSIgKCIgICAgNjwiCi1NLEwkKCAgICA5UCgyUDRZVSAgIEIrUCAoOVBYMCA+JikkQCNBQjEoIFg4RDIgIilPICAwQCtQICw7UyAoCi1NK1AgICAgPUchISshNFggQDAuMig4IChCUDUnKF9fUSIwJS4gOS8wQCIgQCAgICVHIEMrISIgICAgJjwiCi1NJEwkQCtQICQzRzQgICAgICgmXCAhIikoPE9dKiY1PylfX1FGIC9fWDRYRjNSIiApM0c0ICAgICAgICEuCi1NNU9fUDItPCBQIilOICBBUiAhIDEyPCBOICQnWSAgKCVXMEBQICApWCAmOSQwP0QgIEA3PSIjICAgV0AgCi1NOVE5MjIxIDEyPCBOICYjSDxAJTIyMSAxMjwgTiAmIC4oID1cKlsiJjleWVwrOyImOV45IV4wICIhPVQoCi1NLCAgIj4gIUYhJyAgOCMpXCwpUic4IFs8QUIgJlk4IzxAJyBQRCg/PEAlKSkkISUpUCJYIDA/RCAgQDc9Ci1NIiMgICBHQCA5TVEqQDY4IjEoOEAhRFNOICwjX1wkWT4zRzQgICAgICAgIS41T19cMD9EICBANz1UPlggCi1NIiEgMDxALyBANFk+M0c1LjVPX1wwP0QgIEA3PVQ+WCAiISAwPEAnIEA0WT4zRzUuNU9fXDA/RCAgQDc9Ci1NVD5YICIhIDA8QCsgQDRZPjNHNS41T19cMD9EICBANz1UPlggIiEgMDxAMyBANFk+M0c1LjVPX1wwP0QgCi1NIEA3PVQ+WCAiISAwPEQjIEA0WT4zRzUuNU9fXDA/RCAgQDc9VD5YICIhIDA8QEMgQDRZPjNHNS41T19cCi1NMD9EICBANz1UPlggIiEgMDxBIyBANFk+M0c1LjVPX1wwP0QgIEA3PVQ+WCAiISAwPEA/IEA0WT4zRzUuCi1NNU9fXDA/RCAgQDc9VD5YICIhIDAgSCAgICAiNzNFWS49NFk2X19RIV4wICIhPVcxW0AgKCQhIVIlXCIhCi1NM0VZLj00WTZfX1EhXjAgIiE9VzFbQCAoJCEhUigsIiEzRVkuPTRZNl9fUVAgIFJOICAgID9QICg0XCEkCi1NICRZPjNHNS41T19cKCJYICInKV9QKCUuN0RZVTNFO19cJEM3ICwgQDtAICgkQlggI1JYTiAhITNBVkwsCi1NJyFCXCA2O1Y0VEBAIiYgIjwgISxbQCMgX18hLjdEWVUzRTtdTyRDNyAvISouMCAiTE0hRiFEWlkgICFACi1NREJATiAgQEorQCAsOUAgJCBESiQ5QCAgRUdAID9AIEwvICAiTE0gSi8gICJMTVxPITJcJjNLRCAgJiRICi1NNCRdKkAmODI0SD1SI11KIVcoJVIhS1ohOz4pKkEmPTgyJ0QgIEsrMDInRCAgSlskM0tEICAoT1g0JF1eCi1NI1A6JyAgKlJUIlBcICAqUy40QVkgICgoNSRBWSAgKk5RJFpZICAiK1QlIS8rUD0oPjAgIktMMS5OMCAgCi1NQl0hMDNXSC9XSDZeQUY3NCgjUCAgSlskOCAgI0dCIFwgICpSVCYgICBZMEAhIiggWjglJEAtIiEhSCAgCi1NIEsrITggICNAJEFYICJcTyE0WlkgICFBIiUhLzJIIUcgICRWK1A1Lk4wICA0KSE4M1dZWEwoPU4gICw4Ci1NK1A1KD4wICJLTDEuTjAgIEJfQTAzUlhcICAqTlEnUCAyJ0QgIEBBNitQPS5OMCAgODkhMDNSWCA5QCAgCi1NTUcgIDggICMpQlwnMidAICA0WlkgICEyTiUhLzJIIUYgICJaPCAhQCAgLCwrUD0oPiAgIjNLRCAgJSpYCi1NNCRdKkAmOCAgKiFQICYgICBPKE8hVEFYICAtLk4wICA0S0EwM1RKIDlAICBBRyAgOCAgIlYiXCcyJ0AgCi1NISRaWSAgITJOJSEvMkghRjsnICA4ICAiUCJcJzInQCAhNFpZICAhMk4lIS8ySCFGNScgIDggICJKIlwnCi1NMidAICFEWlkgICEyTiUhLzJIIUYvJyAgOCAgIkQiXCcyJ0AgIVRaWSAgITJOJSEvMkghRiknICA4ICAiCi1NPiIgJjxAOlBANig2LCNMKiFEW1sgICtfME9dPF9XO19EL15IX1wjX1YnWCA0SDlSIVtSITswI18jREFZCi1NICAoKDYkKkczS0QgICYmMDQkXSpAJjggIC4pKD4wICJMTSEoO09XXCtQNS5OMCAgNVEhL1tQICwvQCFNCi1NICAnOjJEPUcsJEFYIDAlKDtPV1wyJ0QgIEA3PDNLRCAgKE0gM15cICMkQVggMCUoO09bXTInRCAgQDwgCi1NM0tEICAoTSAzXlwgIyRKJDlAICFVREFZICAqUldUQU5fPFBPITRaWSAgITc8RF9PICBQTiAmPVAoJD0qCi1NJCY9JDJLRCAgQEEoOVBYTy4wICIiJEEuTjAgICwhWTgzUi8nICAoKDIkQVggIyEhW09XLDNeX19UIikvCi1NLCNQICJSKzg0PENfXyJcWSAgKCgxJFpZICAiKzAkX08gI0EqQSY4ICA2USg+MCAiTE5YTyE0QVggIC0oCi1NPjAgIiIlSS5OMCAgNlk5L1tQIDAvQCFMIUcgIDggICE0REknOVBRKFFSXCczS0QgICNBVjYkXSpBJjggCi1NIDMhKD4wICJMT1UoO09XLCtQNS5OMCAgNiYxL1tQICwrQCFHICAjPigkPSokJjxUMktEICBAQSw5UFhPCi1NLjAgIiIkUS5OMCAgLCFZODNSLycgICgoMyRBWCAjISg7T1csK1NEICBAQSQzS0QgIChNIDNeXCAjJEokCi1NOUAgIFUkQVkgICpTIyJcJTInQCAhNEFZICAoKDhEWlkgICE7RURfTyAhIF4gJlAsMEdEICBAQDI8ICFACi1NICAiVDJEPUckRClZICAoKCREQycrUD0uTjAgIC4nOTgzVEokOUAgIEMkQVkgICpTJlJcJTInQCAhREFZCi1NICAoKDpUWlkgICE7RURfTyAhIF4gJlRUMkQ9RyMkQycrUD0uTjAgIC4nOTgzVEokOUU5KD4wICJMUkhPCi1NITRBWCAgPSg+MCAiIic5Lk4wICA2WTkvW1AgMC9AIUwhJyAgOCNZKjFWPE4yLDxPIVRaWSAgIFg9RUEvCi1NOCIgQCEnWCdMKD1CJiMgWyJAOS5eUCAiXylbXVlPWFxfSjteWE9cXl9YO19ORCpHK1AxLk4wICA0S0EwCi1NM1RTTiAvI11PJFk+M0c1LjVPX1wrSDxPK0AgMCtSWCAiJEFYICAlKD4wICIiKCkuTjAgIDZZOS9bUCAwCi1NK0AhTyxEQVggQChPK0AgLCtQPS5OMCAgQkk5L1tQICwjKCAgICAoIjlQUE8hVFpZICAgWD1FQS8/T1xPCi1NIVRaWSAgIFg9RUEvKCA8TitPX1wzRVkuPTRZNl9bMShVUiNAK1JYICQiXE4gIEEoPiAgIjInRCAgQEIrCi1NM0tEICAlTjYzXlwgJCJIIDswICBPREolOUBIQC8gICIiKTlAICAiUjImW19RIlwlM0tEICAjQiY0JF0qCi1NQCY4ICApUEArT180NSggTyAkWlkgICBPIiVBLytAIUcgICImK1JbX1UiXCcrUDUuTjAgIEJJOS9bUCAsCi1NTCpbX1UmOUIqRlggIyJQJ1cqW19VIiEmJCtQICJFKiYoJDkiJCRBNStQPS5OMCAgNkMpMDNSUCA5UykoCi1NOzAgJCtQOS5OMCAgNkMpMDNSUCA5UiEoOzAgKCtQOS5OMCAgNkZBMDNUSiA5UFhPITRaWSAgIFg9RUEvCi1NKCA9QCVCXCUzS0QgICNBVjYkXE8hVFpZICAgUCdFQS88ICEsW0IjQF9bMS43RFlVM0U7X00kQzcoLiBPCi1NK0AgMCtSWCAiJEFYICAxKD4wICIiKT0uTjAgIDZZOS9bUCAwKyAhTSAgJjoySDlGIkIgXCAgKChIViAgCi1NIDhZKDtPXyQrUDkuTjAgIC4oOTAzVEogOUAgIT4iIE5fXTE0QCJcIDNLRCAgIlwoNiRcSiAmPCAgNihPCi1NK09fNCtQNE8hRFpZICAiKkVEX08gIFJQS09fNDlAICEvQklOICBQTiE9Wk5fXTBAMVEiXCAgSTJBUiEnCi1NMEEhKDswICwrUDUuTjAgIDZDKTAzUlggOVAgISJEQU0gISBPIVRaWSAgITosRSEvK0AhRyAgI1YyJlQgCi1NJSJcJzNLRCAgJUhSNCRcTiAmPCAgLikoOzAgOCtQPS5OMCAgNkMpMDNSWCA5UCAgU0RBTSAhUE8hVFpZCi1NICAhOjolIS8rQCFHICAiWjImVCAoIlwnM0tEICAlSFI0JFxOICY8ICAqOSg7MCBEK1A9Lk4wICA2QykwCi1NM1JYIDlQICBEREFNICJETyFUWlkgICE6TiUhLytAIUc/REFNICJITyFUWlkgICE7JyUhLytAIUc7JEFNCi1NICJMTyFUWlkgICE7JyUhLytAIUc2REFNICJQTyFUWlkgICE7JyUhLytAIUcyJEFNICJUTyFUWlkgICE7Ci1NJyUhLytAIUctREFNICJYTyFUWlkgICE6TiUhLytAIUcpJEFNICJcTyFUWlkgICE6TiUhLzJIIUckQlwmCi1NM0tEICAjQVY2JFxALyAgIkxPVUAlQlwmM0tEICAjQVY2JFxPITRaWSAgIFAnRUEvPCAhLFtCI0BfWzEuCi1NN0RZVTNFO19fIlonK0JYICIiIU4gIFBAQVRBWCAgSE8hVFpZICAhQSIlIS8rQCFGIScgIDggQEAxVCgwCi1NNEg8QCFSWE5fX1EuN0RZVTNFO19eIlonKEZYICIkSDE5UFBAO0AgLCgoRUAoREonOUAxUCAmIEo8QyJeCi1NQDZULjxDRl5ANlgoPEMiPkAxKic4IDAyTyAhXzRERDAkNEcgK0AhUiJLWiE5TSkiJjIgKStCW19eJFk+Ci1NM0c1LjVPX1QyLTwgUCIpTiAgQSokNjxAIyEkICJGOCooJlggIyEiXCAnXUAtR1AgOCIhUiwrWiE7MDlSCi1NLjtaITtQMVAgJiBGVyg4QiFONiFXKCc8QVdYUEcoPTIyMSAxMjwgTiAnKCpPSCVGVSIhTiAgUDBBRCg5Ci1NKCBFLFtAIyBfXzEuN0RZVTNFO19dIlotKkZYICIkSDU5VVBAO0AgLCMhNCAiRjgwJCtQID9WITAkK1AgCi1NIDYhIDBBIUAvIiktNERUMCQ0RyA8RDpQQDY/TjxEWlBANj9IPEUyUEA2Pzw8RUZQQDY/NjxGOlBANj82Ci1NPEZaUEA2PzA8RzJQQDY/JDxHRlBANj5ePCAhQCNAUDUgIElHIScgIDggMSInMiAtKkZbX10kWT4zRzUuCi1NNU9PPDItPEBQIklOICBATitAIDAoJD0qJCY5SjIlNS5OMCAgQychODNSWCA5UDhAMVRIMDlFOSg+MCAiCi1NIioxLk4wICBDJyE4M1JYIDlQOEAxVEgwOUNZKi4wICJLSzFGLCRBWSAgKChKNFpZICAiLDwlQS8rQCFHCi1NIUIhJzJBIUYiJEFZICAoKE0mICIrUD0oPjAgIktLMS5OMCAgQl9BMDNSWFwgICpOTSIgTiAgUEIgLkYhCi1NMSgjMEAwOiAgICpSUDJcICtQPS5OMCAgODJBMDNUSiA5QTBPIVJcTiAhMS5OMCAgQl9BMDNXICA4ICAhCi1NUiJcJzNLRCAgJSIwNiRdXCNLIiY7UDlQX1YgICA7KSg+MCAiIis5KDtPUCAzS0QgIChPWDQkXSg1NEFOCi1NXyAhLk4wICBCXSEwM1RBWSAgKChQVEFOXyAhLk4wICBCXSEwM1JcJzImW1wgJFpZICAiK1QlIS8wSj0oCi1NO09QIDNLRCAgKExWNCRcTCAmUTwjK0QgICAgIiAgKCAxJjkwMidEICBAQyUyJltcICRaWSAgIiteJSEvCi1NMiU1KDtPUCAzS0QgIChPMDQkXSg+MCAiIi1RKDtPUCAzS0QgIChPMDQkXE8hVEFOXyAhLk4wICBCXSEwCi1NM1QqRzImW1wgJFpZICAiKy1FIS8rICEqQUZULitQPE8rQCA0M0tEICAoT1g0JFwsS0AgICAgJCAjJjggCi1NIC4xKD4wICIiLVkoO09QIDNLRCAgKE8wNCRdIklUQU5fICEuTjAgIEJTOTAzUlggPE9eXkA2OCozS0QgCi1NICYhLjggICBMREFYICFBKDtPT0grUD0uTjAgIEJJOS9bUCAsPEFCUEA2PDYzS0QgICYhLitQPS5OMCAgCi1NLic5ODNXI184ICAgQSRBTl5eQSg+MCAiIU4xLk4wICBCX0EwM1IvTl5fQCAgQDtUMktEICBAO1g5UFhPCi1NLjAgIiFPQS5OMCAgLCFZODNUSk5eX1FPNUJcTl5fUS5OMCAgK1BBODNSSSArUltbXyRBNStQPS5OMCAgCi1NQkk5L1tQICxMKltbXyY8NCtQPS5OMCAgLic5ODNUWlkgICFAM0cjXzghKENTMCAiIU9ATyFUWlkgICBYCi1NPUVBLyggOSxbQiMgXl1RLjdEWVUwS0QgIEA7WCtQPS5OMCAgLic5ODNUWlkgICFAM0cjXzgtUS41T19cCi1NKCNEICBAQSQzRVkuPTRZNl9fIShVUiMgKyNQICBAQ0IrQ1AgIEBFSCpHUCAgQEZdMktEICBAQCI5QCAhCi1NViRBWCArIS5OMCAgK1BBODNSLyAgICgoIERKWSAgKCggRj1aK1A5Lk4wICA0KSE4M1UqICtQIS5OMCAgCi1NK1BBODNSLyAgICgoIUY9PCtQOE8uMCAiIiA5Lk4wICBCX0EwM1JcJzNLRCAgJSIwNiRdMkAiXCAzS0QgCi1NICJcKDYkXENQICAiIiBJRytCXCcrU0QgIEBAKjNLRCAgKE9YNCRdKDU0WlkgICEwRCVBLzRIIE8gJFpZCi1NICAgTyIlQS8oXCAgIEBALjlAOVAgJiAgIDQxKDUyXFkgICgoI0RaWSAgIiteJSEvKyNEICBAQCY/QCBACi1NPjAgIiIgKSg8JzAgK1A5Lk4wICA2QykwM1JQIDREPCwxUCAsOz4pXiAiIVkgICgoIERBUD0jIE8hRFpZCi1NICAhOixFIS8rICEyMVBRJyAgUU1YQlBZICAoKCJHWCAoJ0QgIEBAIjInIVQ4IlwmM0tEICAlSFI0JFxMCi1NICUpJyMkPCAhVldCP0AgQD4wICIiICkoPCcxXCtQOS5OMCAgNkMpMDNSUCA0RDwsMVAgJzs+KEwuMCAiCi1NIiBYQC4wICIiICgmQCAgICApQE8gIlwmM0tEICAlSFI0JFxMICIgWSAgKCggQDogICAgIEciXCArUDkuCi1NTjAgIDZDKTAzUlAgKCNEICBAQCIhSCAgICAiQCtQIE8hRFpZICAhOixFIS8rICBALjAgIiIgKCZAICAgCi1NICowTyAiXCYzS0QgICVIUjQkXEwgIiBZICAoKCBAOiAgICAgSiJcICtQOS5OMCAgNkMpMDNSUCAoI0QgCi1NIEBAIiFIICAgICJMK1AgTyFEWlkgICE6LEUhLygjRCAgQEAiMy5YQFAvX1AzRVkuPTRZNiAgISg+MCAiCi1NS0sxKD4wICIhTjEuTjAgIEJfQTAzVCpZICAoJl0kSlkgICgmXiY8LitTRCAgQDtYM0tEICAjID42JF0iCi1NTjAgIiFPQSJOMCAiIU9RLjdEWVUzRTtfXyJaJz9AISg+MCAiIj84UCFUQyAoQCNJQDQyIFQoJCZAICAiCi1NTE0gTyAkWlkgICIrXiUhLzREPCwxUCAnOz05KD4wICIiP0EoPjAgIiFOMS5OMCAgQl9BMDNUQVkgICgqCi1NICRBWSAgKlJQJFpZICAiK14lIS8oX1AgIEBIIiAgKlJMIi9cICAoKiFAICJMSzBOK09fXDNFWS49NFk2Ci1NX18wQDtAICgkQlggI1soMDlAMEAiJiAmMkFBRl0nICAzRVkuPTAgIDNFO19dIlonKCZYICMiKU4gIEA+Ci1NJitYMTlAQSomNjtWPCAhQCJBIDEyPCAyKCRHIUQoJE4rT19UM0VZLj0wICAzRTtfXSJaLShGWCAiIiFOCi1NICBRQCVCSSg4IEAwJTsgMTlQOTIzNEg1OU8xKiU2PCY0REUqJDY7RkReWCAiIiApKkZbX10kWT4zRzUuCi1NNU9fWDItPEBAIlhOICBBRiFCWFkgICpPMSRKJzlROE8rQCAsK1A9Lk4wICA4NUEwM10iJypEISolNjgkCi1NPCAhQCoiXE4gIFEoNTRaWSAgIi0iJSEvK0AhRiIkKlkgICpPMSYgLCgkPSIkJSonKFw8ICBKXSQoIFUsCi1NW0IiIF9fQS43RFlVICAgICAkWTZfPEEoVVMjQCsiWCAkIlVZICAqUy8vX1Q/QCRNMV9fWCs0O19fJEFOCi1NXz1RKDtPV0AyJltfXSRBTiAgQS5OMCAgPEU4QDtAIDgoKltdWSJJTiAhMEorQCA8KCJbXVgnWCVMKD1CCi1NPyMgWyJAOS5eUCAiICJYICMgICwgJDggNiAhOCgiW11aLSImKkghKkFGXTYyXltdWyJBJTA/OUkoL1dMCi1NK0BAOFc7Tyc5P0lAMCdYISpIPSpBRlxYKkQ0SDFNRyUmT1AgLCtPLDk/QUAqJCo1K0NEICBASEA8QEJcCi1NQDZULD8gQUAiRCo1K0NEICBASDw/ICxKMVJBJVdIODhXO08nOT9IQDE0KFA6ICBAITRTTiwuI11SJFk+Ci1NM0c1LjVPVygyLTxAXCJITiAhIE0+MCAiTFNTX10kKk5fX0BNMT9fXDImW11XJEFOXz4hKDtPX1QyJlggCi1NIiRaWSAgIVI1QiFOICFAQEtPV0QqIlggJyJYTiAhMEArT1dAPyA2UEFGKCAgKyhQLlBIJjNPTCAgQCEkCi1NICBQICMgIVIgKDggQURKJTswUEAxUiBOX18iMEEyIiA4IDhAMVIiTl9fIV4gJE9OXz5QTCEmICgoJDgwCi1NRzUqJzRIOl5LT19QOz8oQDEtJ05fXyEiJCYhRCgkPSJEIiEkJCtQICwjSVwgICZaQzZcNj9AJz5BLUokCi1NKyA0QDFRIlwgIyEyMzUqJ09IOUVcRChVMiAhQC1CIScwSSBMLjAgIiJCIV4iK0onOzBZWiImICwoJD0iCi1NRCJQWSAgKConJ0gjK0A4SjEtUiUoJDw6VCUqJ09IOUVdQiEkMEMhOCAiICQzLlhAXC9XKDNFWS49NFk2Ci1NX14hKFVTU0AqJlggIyJYTiAhMS5OMCAgN0M4QDAiITAnISBKMVRKTCAgMUcgICYgKCQ8ME8gIE00SDxKCi1NMVYgICA3KDpfICBQMkg1RyAgJi4mTDo5UyUtKitASllRVlAgIDggOl8gIFA0RFFAXEdYKE08PUwiIkFZCi1NICAoKi4mIC4qJ0QgIEBIVDggOEg+MCAiIkNRKiUmPCAgNTg6VyYjVjJKUCAiJlguKCBJNkAkMiBMKlAgCi1NIiZcICApSDpbICAsJkw4Vj8gICE/QCVAIUFLMjRETTJBVDdUPiBRKiRGO1IySDVGIyBQRSAjIUdeS1A1Ci1NOVApMjMxS1wgJjRIOyAgKFY8TTMzJEosOlA4Ol8gIEs4IEg6XyAgTSggUSRAIkEgMiZbX18nICAsIFBPCi1NICRaWSAgIVhEJSEvP0AhKVtPX1w4IDEyQVUpLCMhMCAsJj9WPyAqXkFGXCQ/QClAIidQI09IOU4gICJcCi1NMj85WF8kJ05fX1E2MiJYKCZNUllRVi9aOCAgIElHICFEKEpQSyAgKDtDOV4gIjknOCBAOl0rQCw0SD0yCi1NMlIgKlQqUCAiK1ogOz5YOlFCOScyQzJYIyY9IE9ISUwvIlgrKURIOl0nQCw0SD5eQlZXVjgiUDpfICBQCi1NJkw5XiAmICYmT1AgLCUqJygiUCAiLSIqMSgiXkAmV04/QCFAISFLMzRIPSddJ0AsMkEtRl0kSiU5QzAsCi1NKTAgUDlfSlwlNjxKNERVQClCMU4gIEBKK0AgMCghMV4hOyInOEAjXlFDIFsiQDkuXlAgIl9HO15PL1pcCi1NX0k7XksvWkwwQTUsW0NTQF9eIS43RFlVM0U7XVciVVkgICpTLy9fVDxAJE0wP19YKzZYICQvX1wyJltdCi1NVyRBTl8+ISg7T19UMiZYICIkWlkgICFSNURfTyAhIE8rQCA4K1JYICUkQU5fPiBPK0AgMDNLRCAgJi84Ci1NKCJYICYkWT4zRzUuNU9fXCtSWCAlJCpHK1JYICQiXE4gIFBPK0AgKDNLRCAgJjZOM0VZLj0wICAzRTtfCi1NXCRDNygsIEo7QCAsKyJYICYhWE4gITwsIVAgUDlAOSpBRjwgICxYQjtAIDA8QCYjRDIhTiAgQEAkJygjCi1NTCglQjdDIFsiQDkuXlAgIiAgQCBMICEwICRALCFQIFU7MCAgSEBQJyAjNU4wJEomOUNRKkswKDA7UCAgCi1NRCQnTSAgUEArMCgwJCMgKF9URyA/QyIwQVcoITJIIUwiJDIgUCglJEAmICJQKCUqQCYgLDJKVCAhJjlCCi1NOCA5KkswICQ5VUhOKzAoMDRYPEwhViAsMkg9TSRBKlwgIyEzQVUuJjBfNUgjIFAxICNFR1pESic7MDkyCi1NLTdALDgkKDs/ICBRICBQQDtAICgjKkAgICAgISAgMUYhRSpNICBBQCokSk0gQSFPIkIgTSBBIDtPICBQCi1NIiBRMkswKDA4ISkqSzAoMDtAUDs/ICBQICBRXiAyTScgQSBAKzAoMDBDNCgjJFNOKCwjX1wkWT4zRzUuCi1NNU9MTDItPFhQI1VcIDAjXV4jVVwgMCNbXCRBTl5eUSg7T1dYK1JYICIkWlkgICFeQkRfTyAgUSpLT09MCi1NOkIhKDtPT0ooIltbWyQyICBIICAgL19fK1AhKDtPV1gzS0QgICdSVjNeXCAjJEFOXl8hKDtPV1gzS0QgCi1NICdfKjQkXSpLT09MO0BJIVtPT1ArNENbWSYhVDImW1tZIlxOICBQTytPT0wyJ0AgIERBTl5fIS5OMCAgCi1NQDMpL1tQIDQoIltbWSY8SD9AJlBBVjkqK1JbW1skQVkgICgqNyRBTl5ZMS5OMCAgQk8hL1tQICwyJltbCi1NRSRBWCAiKUAoIlxOXl5RKD4wICIiRyUoO09NJDNLRCAgKEtQM15cICMkQU5eVDEoPiAgLDNLRCAgKCNOCi1NNCRdKDtPTSAoJltbWScgICwiQCAgRCdQIkA5UCAjIEhfX1hPICRaWSAgIVhEJSEvP0AhK1tPTSA4IDEyCi1NQVUpLSMhNCAsJj9WKUZYICQpTy0/IC5eQUZYPjA/OVkoL00gK0BASDJUJ05eVCE2MiJQKCgkPDhUJSonCi1NNERWXkFGL1QoJltbWScgICwiQCAgRTYgK0AhTSlOLicwPy84ICJQKCtQOEA7T09EPCAgUCwnQCYrUCEuCi1NTjAgID4pITAzVUEtNig5NUFWS0IwQy84ICIhTiAhQEBDMiFOXl4wUCogICQyLCBAO0AgNCgoISFbT09QCi1NKCJbW1krIig5UEhPICRaWSAgIiBURUEvMy5YWFAvTEwzRVkuPTRZNl5SMShVUiNcKkZYICUiSE4gISBMCi1NK0AgLCtCWCAiIiFOICFBIkQiIScySkAgISY4VD9AIEgjNiAqKCQwME8gIFA0SD0yQStaJThfKSFdN0AgCi1NKkBBQCJCISUkK1AgLCUqJzRINl5BRi9SKCZYICciIic4ICAiPUNVXCAwI11eI1VcIDAjW1wkQU5eXlEoCi1NO09XWCtQPS5OMCAgP0hJL1tQICwvNltbW09XXD0hJjRLT09MPEAgUitPV1paOEY0QDRQXCggKCAgJFQxCi1NPEEjQkpNMiZNKDVEIEIwJStANlxBViwiK0A5LC8nQCcgIC0yOkA6JyAgOkRVJygwWEo9MkFUMicyJltbCi1NWiJcJytQKSg+ICAqMiZbXV4kWlkgICIhLERfTyAhMEArT09IOVI5XiA7Iic5RDhPIERBWSAgKCpBREFOCi1NXllBLk4wICBCTyEvW1AgLDImW1tGJEFYICIpQCdCXCIyJ0QgIEBKPDImW1syJFpZICAiKlwkX08gIFEoCi1NO09NKDInQCAjJFpZICAiIFtFIS8oJltbWiBRSF9fICAhJllWLCJAICEkQyAxKCFKISdYL1QoP0hAIkAgCi1NP0AhXCAmIC4oJltbWiRJUDogOUYiJSonNSg6XkEmV05PSDFMIkIhTl5eQCA8ICAhMkA4TiEiUCRYWDhKCi1NIS4uJSggOjBBMkggOCEgQDtPT0gsOyFIIUVAJjRIPTRBNTImKCZbW1onICAsIkAgIEtaIDk+Kjk6ICAiCi1NKCZbW1ouRiRWNkAgISIhTl5eQSo6ICAkOyMhKDtPTSYsIkAgISRDIDEoICJAICAgX19cTyAiXCgzS0QgCi1NICdSVjNeXCAjJElOXlQ5RyJCIU5eXkAgOiAgISAgOSg7T09QK1JbW1okWlkgICFfUkUhLz9AIF4rT09SCi1NNFg8TCFeLiYwPzlJKC9PVisgQUAhJS4nNTg4QDFESTA5XzkoO09NIDwgIFAtR0xAXl84TyAkWlkgICFYCi1NRCUhLz5AISFbT00gKyBBQCElKiU0SDhAMUBQMCAjIUddJ1AgPiAuWkEmWEIwPzk5KC9NICpAQEgjNCdOCi1NXlQhNjIiOCgoJDBCMTEiMTRINTJBRSokTkgtQ1wlLic6UytDQVQnVj4yI1tdQlgoMD81SCAiSCgwPltbCi1NXUJAKCtQNEAxVyAgLCEgTyAkWlkgICFYRCUhLzYoOThBNTYnT0gxRFkkKFU6ICBAO0AgPCgoOEA7QCA4Ci1NRSg4QEBEJ05fP0BAK09PSEwoQUciQlwgM0tEICAoIzI2JF0sW0IjXF5SMS43RFlVM0U7SjAkQzcuL1BGCi1NO0AgMCtCWCAiJzhQMEpbX18iIScpVSAgISI6SCAgMCxKICAgICAoICEmPCwjKkAgICAgISAgMUYgIDk+Ci1NKiZYICMgUkwgICAiICAgKDshMCxLICAgICAkICEmODYjKlAgICAgISAgQUwjIiFOICExXiIoXjA4ICAmCi1NLCQnTl9dUEIxUyBcICA8QFY1JyhfX1EhW09fPDBeW19PIyBcICA8QlYlJyhfX1AsS09fX19fX19ZJlgoCi1NMEpbX1gmICAgMlAsS0AgICApX19ZJlQoMEpbX1AmICAgLVhAK09fRDxBXSpAJlAoMSgjIEA0MiA4ICsgCi1NQDdYP0woPUYxIiBOX14xMkAmSCJUKD9KQCJQID9AIStbT18oOCAxIkc1KidPSDlFXidQJU9IOUwgICIyCi1NWTg9IV1HQ0grQEEhW09fSDA+QCAlIlAoKCQ9IkQlQidPSDlFXUYhUigiW19ZJSogOkAxXiddIidaSCBMCi1NICdYIDJeW19SJiAkMElVMkFbWiY5P0BAK09fRDxBXSpAJlAoMSgjIEA0MiA4ICsgQDcoP0RIIVAgPi5ACi1NNFggTiFONidQOzlYUiQ6IFA7OVhaJSomK0A5XCE7WiY7IVNFQVQnVj4uQE4iJCdOX15BIVogIDQrIEBACi1NMVQqMDYoPl5BRjdWMiZbX08kWlkgICFTOiVBLzJKW19YJjxWIypQICAgICEgIDFGIiJYTCAgQTJBViAmCi1NK0NQICAhLSQyJltMPCRBTlsnMSg7TlFYK1A9KDtPXzwzS0QgICY8UDNeXCAlJiAoMEpbTDwkKk5bJzBECi1NK05RUFUqW0w9J0AgMkpQICEmOCYySlAgIiZQNCMqUCAgICAhICAxRjpCIEwgIEEyQCsiIjtWICxLICAgCi1NICAkICEmODorQlAgIiUyJ0dIKCxBUCAgIEAhQyFCWFwgICAiICdQITghOV4gIlBMICBBNEFAUiYgICAiCi1NICYsJisjUCAgICggMiZbSjokQU5aRlEoO05JUCtQOE8hVEFOX1tRLk4wICA6LikvW1AgOCoiW0o7LUJOCi1NWkZALEsgICAgICQgISY4ICBAIEorTlFQTkpQICImXCQqQlAgIidYIDJINU8nJE9LICBRIVtOUVgrIEEhCi1NW05RWFZIQEAxQUswNEg9MkFLUiU5PzBKO05RUFZeW0w9K09MICBBTyEiSUwgIEJeQzZQODA+TCAjIlAnCi1NVyhDO1IiISYkK1AgLCUqJzRIOlxDNjdST0pQICImOCAgKjBHMVAoMCggKjBBUj0gICBCXkBGUSxPSltMCi1NPCYwKiVDOVkoLlFYNEg9QCBHOFAwPzlZKC5RWCsgQUAiS1pOWychRCMlKic0SDhAMUBQMCAjIUdbS1pOCi1NWychRCFHWCErND9fXyRKTl9cIUcgICROP0AkTTFfX1w4ICAhKSRKTl9cIUcgICQ8MkpbSjsmXCY9QyFcCi1NICYgJiVCW0o8J1AhK0A5IV1GREBaRyBMIiYgKE9IMUwjJSonNEg4QDFAUDAgIyFHXCtaJDsgICBaJ1ghCi1NKzQ/X18mICAgLVhKKyAgKEZIPSpBVjg+PyAhK1tOSVA4IDEyQUUpLSMhNCAsJj9WVkg7OktOSUxXKltKCi1NOyYgIj8gIlpBJlwiKkAwQCE0MiApVCAgIitKTlpGUU8hQkBOWkZRQCBCQCVPKDFMJERPSyAgUztRUUtcCi1NICMhMkFVKiZPKDFNXStSJTshSStaUCAsVlw8QCFJIk5aRlA6XUBEQFpHITJBVSomTyg1TVspUk5aRlJcCi1NS05JSDsjSSpBRlAkPUMhQCFBOFY6MiNKPCUqJjpAKVwgJE9WOjIjSjwmICpPKltKOiZQKjRIOTIzMFA1Ci1NICMhR1wrUk5aRkFMKEdQISs0O19fJiA6MD5MICMiUChXKD1AIkIhJiQrUCAsJSonNEg6XksgICg7PyBHCi1NMVAoMCtSW19fJEcjK1AsTytAIDQyJS0oNSRaWSAgIUYoJiAgIEM5KksgICg7MCAhJ0IgIlQqUCAiIFIgCi1NICAgIiAmUCBeXjFeICRPSyAgUSFbTlFYKyBBQCIiISYmTSEyQVUqJk9KW0w8JjdST0gpTCZET0sgIFEhCi1NXTdAICsgQztQQiEmJCtQICwlKic0SDpcQzY3UipAMlhLICAoO1AwSisgIChOSltKOyZcJioiW0o7JiAiCi1NKiA1XCAkSiQ7USkrWlAgLFZcPDpfICBQNEg9MkFLUiQ7PzJcQTZQOjJeTCAjLU8nKCA6MEtOSUwmTzgpCi1NKC5JUDRIPTJBS1IlOz5RK1pQICxWXD1AIiFLXCAjITJBVSomTypQICImV1IpVDwiJCkyJylUKCAiKVJOCi1NWkZQTiFLWk5aRkFMLyRKJzsgMVYsJiAmJUM5WSguSVA0SD1KIEdYIDA/OVkoLklQKyBBQCJLWk5aRkFMCi1NIyUqJzRIOEAxQFAwICMhR1tLWk5aRkFMIUdYISs0P19fIlxOX19RKVBSXCMrUlggJSRBMzIlMS5OMCAgCi1NOUIhQCAgJDIrIlAgIiQyJiMoKCAgICggOyAjWlIgUiYgICAiICZQIF5LWlRBRlhaTSg5RiIhOE5bJ0FeCi1NIDYgJD1DIV4gJE9WPjIjTD4mICpPSltMPCYwKjRIPTIzMFA1ICMhR1wrWk5bJyFEIUdYISs0P19fJCpLCi1NIEEhQDtHWCAwPkwgIyJAJjJeW0w+IkgoOCBAQDExIj00SD0yQTIgTlsnIjBBK1ogOT5ZXiAkT0sgIFI0Ci1NQUJIIjggODpfICBQNEg+XkE2V1YpVDwiJCtaTlsnIUQrIThWPjIjTD4lKicyXzlZKC5RWDggSl5LTlFQCi1NOSBJMkFVKS0jITQgLCY/UE9KW0w8JjAmP0AkTTFfX1wySltfUCY8Jj9AJE0xX19cK1JbX18kRyMrUCxPCi1NK0AgNDIlLSg1JFpZICAhRigiWEsgQSEpWlAgLFY8PUAhQUNcICMhMkFSIEsgQSMwQUtaIDs/ISJKUCAoCi1NKVQ8IiQkKFM+IFEsW0NDXFpEIS43RFlVM0U7X1UiWi0qRlggJCIhTiAhMSJEIiFOICBATTQvX1grNkAgCi1NIS9fXFo+WCAgP19YKlQgICEiXE4gIEEuTjAgID0sITgzUkogKCE1UiE7IiE4QTBQLlBIJjNPTCAgQCBQCi1NICBQICMgIFAgIyAgLCRBTl9fQSg7T184M0tEICAnNVg0JFxPK0AgNDIlNE8rQCAsMiZbX1YkWlkgICFLCi1NTkJJTl9dMS43RFlVM0U7X08kQzcuLCBIO0AgKCgmWCAlJCowP0AhK1tPX1AwPltfXCQnSCAhIEwiIktUCi1NPiAhOEFbTyY5PzlAJSMgWyJAOS5eUCAiICUgICtAIE4gJSAgNCAhMClGWCAkLkdOICAnX1wiPSAgIDEoCi1NNSRaWSAgIVZIRUEvKUggQCRXWCVMKD1DUkRBNDImW19UJFpZICAhVzElIS8rUlggJSRBMytSWCAjJEFOCi1NX10hLk4wICA6W0ksW0NDIF9bUS43RFlVICAgICAkWTZfXUEoVVAjWCgmWCAiIFJIICAgICBAICQ5QCAhCi1NKEdYIDggQCwxUCAlOSBRMjFXICAsID0qTCBQLDleWCwxUCAlOTBBIkogICQ4ICAgX0RJJzlVSSJLT19cCi1NPkAgWiFXQCVGKDYzUjYgLlcoNEFMJlAsRiBRMktPX1w2JERMK09fXE8oMUVaQFJOICAgICE/X1w7IVNFCi1NQUJVJl9fMEArT19UMEsgKCMlQk5fXzAsS0AgICAhM19dJldKPCAgUCFeTihEOkAgIiYgIjREPVAgIyAnCi1NPEAyMkAiKSEySyI8IyY/TjBGW19eQlhIICBQLEFQICBfX11CIicgMFg6XF0wL19aIyg8IF9fX184QDtBCi1NQ1UhTl9fSCxBUF9fX19dQiFORi82JltfXkBSJy9fX19fVigmWThdNDtPX1ojKD1fX19fXzhAMTI7T19aCi1NPCAgUCtPX1pEOkAgIiBRTiAgJ19eRjROPyAhKkI2VEg8ICBQK09fWj1CIjZAIlgpWTg9I1wnQCwqQSRSCi1NK09fWlhaVEgkPjpMQyg0QkFCUCQ2OD1KWURTTiAvQ19WJFk+M0c1LjVAICA8ICRSK0AgKlhaIiFOMCAiCi1NTFQxLjdEWVUzRTtfXSIhTiAgQE00L19YKzZAICEvX1wsIltfXiApID9fIUYmQiBOX19AIkAgIC9fX11GCi1NIkRKTl9fUUYhJyAgOCQxUCA2ISAsIltfXiApID9fICwwJ19QOUMgQCtPX1ggSCAgI19fXzlASSpLT19cCi1NOUAxUCBWIDwoIltfXiAqICAgX19fUFIgICAwICAmNCQ8IDFAIUcgJTggKVAgRFk+M0c1LjVPX0QyLTwgCi1NXCdQIChCWCAjIiBOICBBXiMtIic+IiI4QDMhXCAhIzFQIlgwWFpcSiQuQk1DKDxAQUJQJTY0QlFQJjNMCi1NMy5YIFwvX0QzRVkuPTRZNl9fIShVUiIgKkZYICIiIU4gIFBNNC9fWCs2QCAhL19cWj5YICA/X1gqSCBLCi1NO09fXCAhIV4iJCpVPiBROEFXKDRPSCVNXSMgTl9fQCIwJ19QOVZQUCtPX1ggRCFfXCBRID9fIUcgICIyCi1NWj5YIDJfX1ghKCAgICAvXypUICAiJ1giKlQ8ICEiIE5fX0AiQCAgL19fXCBAICAwICAgSzAgICwyJ0AgCi1NIlRBNTNLRCAgJzRaNCRdQCYkSk5fX1FGNydYIypUPCAhJiAqMkpbX18mODowSlQgISRTTigoI19cJFk+Ci1NM0c0QCtPX1ggSCAgI19fXzleIV4gQk0nICAwSz8vX19fIFQgIiIgTl9fQCJAICAvX19cSzAgICwyJTUuCi1NTjAgIDxWQTgzViMiKCJbX14gKiAgIF9fX1Y+PigiW19eICogICBfX19QQCAgIS1HIidYJCpUPCAhJiAyCi1NP0AwSzFQICQyJ0AgISRaWSAgIVRKRUEvKCJbX14gKiAgIF9fX1AiICAgQCAgJiAgX1RZLjVPX0AyLTwgCi1NUCIpTiAgQVwgJCdOX18gTiIkJ05fXyEhWiAgMChAQEAxUiJROiAhOEFFQidPSCVFXEMgTl9fICIwJ19fCi1NOVRIUCtPX1AgRCFfX1BRID9fXUcxRyAiOCJZUCEmIEoySltfXSY4XjJKW19eJjhYMkpbX18mOFI8IC1ACi1NJSRKTl9fMUYnREpOX19BRiYkSk5fX1FGJEcgIDMuWCBQL19AM0VZLj00SU5fXylHVycgITguUSo7T19SCi1NOVtRUCAjIE5fXygsQCAgIEAgIURKRyAlOC0xLjVPXzwyLTxQWCJBTiAgUVwgJCdOX18gTiIkJ05fXyEhCi1NWiAgMCpAQEAxUiJUOiAhOEFFQidPSDVFXEJJTiAgQ0lbQCAhX18gSkAiTU5fXzAgJCJNTl9fQCAlIk1OCi1NX19QICYnWDAwSzVYIyVCJz8hMl5BRldULCJbX1wgKSA/X11HOCMgTl9fICIwJ19fIyQhX19WPCAgKElQCi1NICMgTl9fICIwJ19fISggICAjX18qVCAgIidYIipUPCAhJyAgLCJbX1xAIiAgICQgICJNICAgUSg+ICAvCi1NMiU1Lk4wICA9M0kwM1YgLD9ALEsxUCAkOCAxIkswICQzLlhQWC9fPDNFWS49NyAgLCJbX1xIIk5fXzIgCi1NS09fWEAqW19fJj8+P0AoSzFQICQqV1NfX1wgMSAgQVAgIyBOX18oSzAgICwyJTUuTjAgIDxWQTgzViJeCi1NPCAgUCtPX1JAKltfXSgiTl9fQiBLT19cOVlYKCtAICdfXylHIidYJCpUPCAhJiAyP0AwSzFQICQyJ0AgCi1NISRaWSAgIVRKRUEvPCAgUCtPX1IgJCIgICJNICAgUSg+ICAwOCAjXzcgICAgICAgICRZNl9fMShVUCMgCi1NPyAsQDtAICwvQlggIkcgICwgPE4gJFFcICAkICAgICo8IyMyQCEmITggISw/JyAnICAgICJFJy5fXiEsCi1NW0AjIF9fMS43RFlVM0U7X1ckQzcuL1FcICdAID5AIEg7QCAwPUAgVitAICopIC0zQEJJTiAgUUAsIlwmCi1NKCAqMEFTIFQiQCAiQCAgIF9fXE8gJyAgLCE0TyAkWlkgICFZXiRfTyAgUE4gK1omOSApMjEiUCc0SDU0Ci1NMzJYJU9ILUVSQjlOICEwUC8vX19QJDhWQCcoMFhKWFcxQCAiLVQwICEkU04uL1NfVyRZPjNHNS41T188Ci1NMi08WF8nWCA+ICFcICJBTiAhIVYgIzhOICBIRCBVLiIqRlggIyYgWCtQPEAgSSIlLCMwKiAgKiAgICNfCi1NX1JcIDwgIFAlMlwgM0tEICAnR1gzXlwgIyJYICMoPlJUJVggOTBBMjEgMidMTSE+ICUqJjUkVEohS0ojCi1NOTwoRjtAIDQoID0sPyAgISAgIEckIzohMydRUCFQICApUSBAIVRRXCAgJCAgIjwwLVQkICBEUVw8IDwgCi1NICI8MDwgIFAhJDIgWThAQiAtKiFUKCcwQVM9ICAgMSxbQ0NcX11RLjdEWVUgICAgICRZNl9fUFArQCAqCi1NUC5YICNNIk4gISEuN0RZVTNFO19eJEM3ICgxXiAjWE4gIEs+S0AgLCggPSw/ICAgICAgRyQnKDBYWkEsCi1NPycgIiAgIEckKCIiMy5YIEEvX1gzRVkuPTRZNl9fQE5BUlhOICBBRyYiIU4gIFFQICMgMFdIIFAvL19fCi1NUCQ8UFAnKDBYSl1GWyJYTl9fQS43RFlVM0U7X14kQzcoKCBOK0AgKDlSMEo7QCAsK1A9UCAjIDUrUCEuCi1NTjAgID5AUTAzUlggLCNTX19cIScuTCFSJC4qTzlOISxbQiIgX19BLjdEWVUzRTtfXiRDNyAoMFArQCAqCi1NUC5YICNNIk4gISBOICRRXCAgICAgIjwwPEEjQ0okUVw8ICggICI8MEAoKSxbQCIkX19BLjdEWVUzRTtfCi1NXyMgTiAgSyBbQCAuM0VZLj00WTZfX0EoVVAiJCwiWCAiTCNOICBYTiAkUVwgICAgICI8MDxBI0NKJFFcCi1NPCAoICAiPDBAKCksW0AiJF9fQS43RFlVM0U7X14kQzcgKDBeK0AgLjwgIFArQCAqW1pDMEtAIDArQCEsCi1NPyAgICAgIEckJygwWFpBLD8nICIgICBHJCgiIjMuWCBBL19YM0VZLj00WTZfX1BQK0AgKlAvUEckLSJOCi1NICBRLjdEWVUzRTtfXiRDNyAoMV4gI1hOICBJUiQuLk9XSlggIyIgJzMnUCAgICAgKVEhUiQuLkgzJ1FQCi1NIEAgIClRIiBARFNOICgzX14kWT4zRzUuNU9fWDItPCBBIlhOICBAQCFUUVwgICAgICI8MDxBI0NKJFFcCi1NPCAoICAiPDBAKCksW0AiJF9fQS43RFlVM0U7X1kkQzcsLyBIO0AgKC4iUCAgR1ggPyAhK1sgICY+QCBaCi1NK0AgLjwgIFAhIkAgOCIwTyFSXCU8ICBQJTJcIDNLRCAgJ0xAM15cICMiWCAsI1NfX1whJy5MIVIkLipHCi1NNEg6XEEmNzgySD1HKURPTCAgOEohTi4lVlw0TyFUWlkgICFbSUVBLytAIFAvL19fUCQ8WlAlKiY8QSNCCi1NSVY7RC40OCAgRFNOLC8jX1kkWT4zRzUuNU9fRDItPCBeIiFOICBAXiogICI+QCFcICM4TiAgWSNaICAmCi1NPiAgWCFWIDg/QCBeJD4+T1dINFAvL19fUCQ8UlAnKDBYSlxKIVUqJk8oMUVZJEolOVBQUC8vX19QJDRRCi1NQCZIJjRIOFExQCAiMy5YIF4vX0QzRVkuPTRZNl9eQShVUCNUKEZYICInUCA+QCBaKjAgIjRYNUsuJVEpCi1NK0BFUCAjIE4gIFlYJClCIFhYNzpBUiklKkA9XiAjWDFaOl1UJC42TldIOEAhVygwWEpAUkAgKicgICNfCi1NX1JQJzU0RlNRNjM+KCZYICQjIiYzLlggXS9fSDNFWS49NFk2X15BKFVTI0A/QCFcICJBTiAgQStbICAmCi1NPkAgWitAIC44IjBPIVJcJTwgIFAlMlwgM0tEICAnSkgzXlwgIyJYICwjU19fXCEnLkwhUiQuKkc0SDlQCi1NICMgTCAgKlxAJjcyMkg9RylET0wgIDhKIU4uJVZcNE8hVFpZICAhW0lFQS8rQCBQLy9fX1AkPFpQJSomCi1NPEEjQklWO0QuNDggIERTTiwuI19aJFk+M0c1LjVPX0QyLTxQXiJBTiAgQF4rICAiPyAgSitAIDAyXlAgCi1NIUdAIC4iWCAjRzggLUA9QCkiXCUrUDFQICMgNStQIS5OMCAgPj9BL1tQICwqQCBQLy9fX1AkNFpQJygwCi1NWEpVMkFLUiM5PUEqQTY8LCwjU19fXCElLjghSiFFKiYuNDggIERTTiwvQ19ZJFk+M0c1LjVPX0QyLTxQCi1NXCJBTiAgQFgrICAiP0AhXCAkT0wgIDlaICNITiAgWVAgIyAkKiAhQCkiXCcrUDVQICMgNStQIS5OMCAgCi1NPlIhL1tQICwrQCBQLy9fX1AkPFpQJygwWEpdMkFLUiQ5PUEqQVY8RjJeUCAhQkgmWFg3O1EyXCczS0QgCi1NICdORjYkXE4gIyBcX19fIDFTSyA0SDlSJC4qTzlOMFkxQCAiMy5YUFwvX0QzRVkuPTRZNl9dQShVU0MgCi1NP0AsQjtAICgyXkQgIydQLCs0O19fLU8mOCAxM0FVRS0ySTVHXiI5TiAgUSpBVlUgMD5EICMkKk5fXzBACi1NIV4uIEQqW19dIlUgX19ASjIiUCdZODs8QiIgTl9fQSlcUEgmKCE0IkAgICBfX1xYQCIgPTxBI0JKI0UgCi1NICApNUtPX1hOXDlDVy4uJzUoPFcxUCAiMkZMICFGOEguJ1AgIDNJXCAgKUAjRCdLICA4UUxdQCZWL1kyCi1NMyUxLSggUVIgIyhLICAqUEA2N0Y0VkwgIEIgSSAgQTJAJyggLEJMICBORilEKCRAO0AgMCgoISI6UCAkCi1NMy5YWFAvXzgzRVkuPTRZNl9eUShVUyNAPyAgSDtAICgrQlggIyRPTCAgOUAoIlwnPCAgUCUyXCAzS0QgCi1NICdNTjQkXE4gIyBcX19fIDFTSyA8QSNCS1UqJjwgIFArICAiTyghRVVESic5UjkrWyAgJipAO0NBPU8lCi1NK1A9Lk4wICA+Wjk4M1JYICwjU19fXCEnLkwhMkFHKDBYSl1GWSNFJiAgKSxbQyNAX15RLjdEWVUzRTtfCi1NXCRDNywsIEg7QCAoKkZYICMkJ0wgIDhMIicgICwiUCAgQiEmLCMgKl9AKiAgICNfX1gjXClRISgwI00gCi1NICA5UCAjIEwgIChSKzAgJkxHICpfRjgoLldQICAwICI4IiBbPyAgIiAgKVAgIyBMICAoQDFDIFAiT1giCi1NQCAgIF9fXiBfIjwwLlQgICInWCAvQlAgIEU2JzpRU0NBXVomKCQ9UCAjIDArUCEoNTRaWSAgIV80JSEvCi1NNTg+XkFGM0g/QCFAJCQqRzIlNS5OMCAgP1UhMDNXUDBXSDhQKyAgJDIsIVwkKSImT0ghT1hDIEwgIDEoCi1NUCsiJztRSFArICAkMiwiMEFQKiAgICNfX1JcIDIlNS5OMCAgPl0xMDNUKU0gIDEsW0MjIF9fIS43RFlVCi1NICAhLjVPX1AsIlggJEcoIDJEIUckIiFOICBQQjtAICgsTUEyMDspIDk/QS43RFlVM0U7X18iWi0qRlggCi1NIiRBNTNLRCAgIyA+NiRcSjtPX1wzRVkuPTRZNl9WIENbQCAoICAoIDEiXE4gIFEoPiAgTzInRCAgQEs+Ci1NMidEICBASlQyJltfOCRaWSAgIipcJF9PICExKDtPXUAzS0QgIChTQDYkXS5OMCAgQyEhLjdEWVUzRTtfCi1NOiRDNy8vUEo7QCAoKiJYICUkKU5fX1hNMz9fWDJIMU0iR1tfKzQ/X10mICAgLzEkQSQqTl9fMUAgICNKCi1NLzdQICJPX1IvN0QgIEc5Ll9eUF0+MCAiQk0jX1tDVVkgIChQU09fUCs3UCAgRzkwX14gTT8gICJCTStfCi1NWSJVXCAgKFBUL19IMEpbX1UkKk5fXUEiS09fPCs3UCAgRzlWX1xATT8gICJIPTtfUyJVXCAgKVYiL18wCi1NKCAxMkAmSCI1SCNEQCUyIC80I19RRiAgICkgXT8gICJfXyhdPjAgIj1CU19bI1VZICApVkZPX04vN0QgCi1NIEBNNF9fIE0/ICAiPUJbX1giVVwgIClWRy9fRCs3UCAgQE02X15ATT8gICI9Q0NfUiJVXCAgKik4T18sCi1NKzdQICBDIjBfXSBNPyAgIj1EM19VIlVcICAqKiZPXzgrN1AgIEMiUF9dUEAhJSogOkAxXiNdIidaKCE0Ci1NQCNVIF9cOUAlIiBOICBRXiBLIic5UCNfI0dYKkwoPUcgL11UKyJYICQkJ05fXlBOIiQnTl9bQEoiJCdOCi1NX15RPDIiQCgoJD1QICMgMChAOSwwISAgKCQ0UEAiISc8ICBQJCRRIDggOTRBNTInT0gxRVdHWCIrND9fCi1NTSdAJDA/OShOIkAoOCBQQDEkSTA5QFEzS09eVDU4MSpLT15UOy5ZKkFGXFIrUDlQICMgTl9bUE8gJyAgCi1NLCJbX05CXCA8ICBQK09eWCtQISg+MCAiIk4xLk4wICBCSiBAO0AgOD9AJEBBViAgITc4XCswICIwPltfCi1NTiJYKDA+W19SIkgoMD5bX04lUSgqIEBAMVcgICwhIEAxMiEwMD8gKiAiKSc8ICBQJDIpJShFJSNcMEggCi1NLCJEICBJITBXJCE0QVVCJU9IMUVVK1FOX1w5RCEjVSZfXDpcNTYoKCgmWCAmIiItOCchWCAjQCYhKDAgCi1NICAkIFhYUCZBICAgIEA4TyEkWlkgICBPIiVBLyogIUYiQiFOICFBIkQmICAhLyhAO0AgOCgoMVAgIyBNCi1NICAoTyAkQU0gIDhAO0AgOCghITxAIlwgM0tEICAoIlAzXlwgIyIhTiAhQEA0IyVNICAoICBCIU4gIUBACi1NNCMlTSAgMCAhIiFOICFASjQjSiYwSltfUCRKTl9bMUsgIDEmPCAgUCtPX1IrNCNfRCcgICwiW19RQlUgCi1NX1ohIVtPX0ArNENfRiQ/Tl9bQSVbT18oMD5bX1UiVShfWTEqNFY8ICBfQVAgIyAzKCUoUCwgSCIgSCAgCi1NIC9fXzxAIFIkUiEyLEMgOiAgKiEgICNfX1kiISs0I19MJyAgLCJUICBCVSBfWlEqS09fVDsiUUAuQyBNCi1NICAxKFAkMiA6QDFeI10iJ1ooIE0wL19UOCIwUCswICQyLCEkQCZIIjVII0RAIlUgX18xQCQiIE5fWSFeCi1NIEsiJzlcUV4iSyInOV1QLDtAICJfXylGKkcgICwhLEA7T140KCUhIVwgSCAsISMxO09fXjwgIFAkUiFOCi1NX1kwQDQkJ1AiQCBQJC5FKFQ2VCAhIFJOICAgICA/XlA5VVAsS0AgICAgJ19LJj1GKCJbX0QnWCJMKD1HCi1NICAjMD9ASlBBVjwgICxZQCAgIzA8ICBQJFJcIDIlNS5OMCAgP0AxMDNWICAgUTEiSVcgICwhLEA7T144Ci1NKCUhIVwgSCA8ICBQJCJcIDIlNS5OMCAgPzlBL1tQICw4ICAiW0IgTl9ZIV4gSyInOV0hXiJLIic5WzlACi1NICArOi8iVCAhQlxOX1shUCAjIDMoJShQLCBIICBIICAgL19fKCZbX0YiITAyJyAqICRBTSAgOS5OMCAgCi1NQCshL1tQICwuVltfTEAgIigiW19EJ1giTCg9RycnWCpMKD1GICAqMjwgIFAhQlwgMiU1Lk4wICA/MTkwCi1NM1YgICBHWSJJVyAgLCA4TyAkQTUzS0QgICdWODNeXCAjJiAgIEY5IjtPXko4IDhdPyI8MF9aSEArT15MCi1NTCpbX0wmNCQoIltfTCU6IEQ2W19KQkBOX1pTOEtPXlAwPzUqIUQpSF9fWEwhJTYmOlAgIU0nICAsIltfCi1NX0IoTl9fMjJAIlUhX1lQViEiME5fWlEzQEJAJlhYME4hSVpOX1shMkFSSCI8ICBQJFIhMiwjICogICogCi1NICAjX19SQU5fWUBINSRHVCJAIlxARlAiKkA5KkFWUCAgLSleICYgICAsUSg7T15EKCA6MEE0QVQiQCEoCi1NPTdIJkZIPTJBMColICAjX19SXCUzS0QgICdDLjNeXCAkJElOX1pBRyYkJ1UyIDkoOiAgJDwgIFArT15ICi1NK1AhLk4wICA+RCEwM1RJTl9aOUcgICIyMD81KCFEQUggIClQICMgTl9aOE8gJFpZICAhWjAlIS84JzkoCi1NO09eRCggOjBBNEFUIkAhKD03SCZGSD0yQTAqJSAgI19fUlwlM0tEICAnRSgzXlwgJCRJTl9aQUcmJCdVCi1NMiA5KDogICQ8ICBQK09eSCtQIS5OMCAgPkZRMDNUSU5fWjlHKyQnVTIgOSg6ICAiPCAgUCtPXkYrUCEuCi1NTjAgID5GUTAzViAyKCJbX0QnKCJMKCVHIC9cTDxASlBANj4qMj81KCFDQk5fWjBeIFcgICwgLSFdMEgmCi1NMkZDX19GOCQvQC0zMVtZTl9cOUMjJyAgLCA+MEtPXkAuQCFAIEdIICgiW19QKyJOX1sxRjAiWCY1KD1QCi1NICMgJU9IIUItIyBMICAqUDtPXko4QklQICMgTCAgKVIgIyg0QCglRycjSCcySltfXSZUJk9KW19HJlguCi1NPCAgUCEwIVUgICQqIUNQJTggUTNBRTYkMkg5SiAvWUw/ICBAK09eTFQqW19MI00gICApUCAjIE0gICkhCi1NXTBIJjJGQ19fRjgoNFZUICBGICI0RDlQICMgJjA/NCohQlgoMkUhR1wkSSY5VClYICNAJjwgIFArMCAiCi1NRCgwTyAiXCcyJlQgIURaWSAgIiBMJF9PICBSPTswICIoIltfRCdYIkwoPUciJ1gqTCg9RyImIC4oIDNJCi1NQiYgJCggM0VCLSVNICAxMktPXyA1JE04S09eNDYkSThLT144KCJbX1ArIk5fWzFPIC9PSigiW19eKyItCi1NOVUoQDAjIE0gICpQNCYpKCgmW19eIyVNICAoICBCIU5fX0BROzAgJCAgMVAgIyBNICAoTyAkQU0gIDhACi1NK09fWDcoIE8gJFpZICAiIEwkX08gIFBAO0AgOCtRIS5OMCAgQC0pODNSIU4gIUBAS09fWDMuWFxfL11ICi1NM0VZLj0wICAzRTtdUiRDNywuIEwrQCAsKzdEICBLLFxfXzFeIDJVJ19fQE0xT19cMiZbXVckQU5fPiEoCi1NO09fVCtSWCAiJFpZICAhUlUiIU4gITBAS09XRCpGWCAkIkhOICFAQCtPV0A/QDZQQVYpXCwjTCohRFtbCi1NICAoICtAICwgIFAgMUAhOCAlQEArT1dIVCg4SkAkSiY7VTkrW09XTCokNSFdRkRAXz5QTiIhQz1OXD1FCi1NXkYhID9AJEpBVEomO1NASjEyQSZWPDQ6XyAgUE5cUUVeJiBIMEk0Ti4wICIiUkFSIitSITswUVwiJiAqCi1NMEk0Ti4wICIiUjFcIFJJJyokNz5BQUM9Tlw9RV5CISUwQyFIICIgJTMuWFBYL1coM0VZLj00WTZfPFEoCi1NVVIjQCsiWCAjIlVZICAqUy8vX1QwSltfXiJVJl9fUSg7T1c8MiZbXVgkQU5fXzBPK0AgKDNLRCAgJys0Ci1NKCZYICUiIk5fPjBKK0AgOCtCWCAkIiBOXz4hUiE7IiE4QCAgR0MgWyJAOS5eUCAiICQwICMgICwgJyAgCi1NQkAiKjJIOU0jIiEnKCJbX1wpIiYoKCFAIUIhJygqW19cJ1ggMl5bXVsiUCU4IEBAMUEiPTRIPTJBS1pOCi1NX18hTVxCISVUPltfXCQoMDglIEAxVCowKCQ0ME8gIFAuR1AgIDtSLTtRMV4gPVolVyg0QDFRIlwgIyEyCi1NMzUqJ09IOUVcRChVNiAhQCkiIScwSSFeIitSJzsgQEovICAiIlNFQCRCSFwgICgrLzYgKigkPSJEIkhcCi1NICAoKzFCICUzLlhAWC9XLDNFWS49NFk2Xz1QTT4wICJMU1NfXScoISs0J19eIlVOICBTX18kQU5fPVEoCi1NO09XQDImW19dIlxOICBBLk4wICA8TTEvW1AgMCtSWCAlIlxOICEhKDtPV0ArUlggIyRaWSAgIUNWIiBOCi1NICExLjdEWVUgICAgICRbWSAgIEZYJEFYICAtLjAmN1IzRzUuNU9fXCtIPSFbQCAsK0BAUC4wICIgTCAoCi1NICAgITlBSFAuMCAiIEwgKCAgICg5UEggPjAgIiAgKCJQJiAkPC9dQCREQVkgICgiTCJcJytSWCAiJFpZCi1NICAgXVgiWE5fX1EuN0RZVSAgICAgJFk2X15ATT8nX19fX19fWyJVTiAgQ19cIlVOX18jX10jVVwgJCtfCi1NXyRBTl9eUSg7QCAwK1JYICMkWlkgICBdWCIhTl9fISIkIiBOICBBLjdEWVUgICEuXjAgIClOISg+ICAlCi1NM0QhRVxEWVUoRlwgISIhTyAgQEArUCAsO1RQQiI5Kig7ICAgISQyIUxIIU0gICEkLEBAKCAwICA5UDAyCi1NViUuIChARCggMCAgOUFYQiAuMig4IChCViUnKF9fUSIwJS4gOS8wQCAwKiAgICAgIFYgIiRNQTFSL19cCi1NMEQhM0AmM1QoIlwgISRZVUxcQU4lJiAiJE1BMVIvX1wwRCEzQCYzVCgiXCAhJFlVVDwjM1AmICIkUiExCi1NUi9fXDBEITNAJjNUKCJcICEkWVUoJlwgISIpTyAgQEAiJytfMkFBN1I/X1w5QCNfXiUuKDxPXDBWNT8pCi1NX19RRiAvX1gzRzQgICIhTyAgMEI7UCAoKCBBUl9RIzk1XEdfXyY4IF9fQS49NFk2X19QTkFUKkcyJ0AgCi1NIURaWSAgIi00JSEvK0AhRyQiXCcyJ0AgIURaWSAgIi00JSEvOCFBMk4wICIiVFAsTjAgICAgJCAgQE0sCi1NOUA5Lk4wICApTyEoPiAgJjNLRCAgKFUmK1AhLk4wICBDPlkwM1JYTl9fUS43RFlVICAgICAkWTZfXzEoCi1NVVMiICpHRCAgQCAgMkhVRyciQU4gIEEqRTY8NCtRVSg1JFpZICAiLEpFIS8rQCFHWyIgJzggKVAgJFNOCi1NLCgjX10kWT4zRzUuNU9fVCgmWCAjIilOICBAMiYrKDE5QEgsJjAgXTlPMEAiJiAyMkElRiMgUEggI1dfCi1NX1Y4JCggQUAgRyAgM0VZLj0wICAgICEuNUAgIDInRCAgQCskM0tEICAiPjQ2JFxPK0AgKDNLRCAgKFdYCi1NNiRdLjdEWVUgICAgICAgIDNFO19cIlotKCZYICMiKU4gIEBKMiYgKCQhNlAkNjwmNERVKiU2O1QyQTVHCi1NISIgKTggOSomNjtEPCAgSjtPX1AzRVkuPTAgICAgIS5eMCAgKU4hKD4gIDQzRCFFXERZVTNFO19XJEM3Ci1NLCggTitAICgrNlggIy9fVCggP0VAIkkgIUggICBKXSwqJCBNNS9fWFZfUCAgSl8sKzU3X18kQU5fXkEoCi1NO09fVCtQPS5OMCAgLVohL1tQICwySCFLMCIgTl9fQlBLT19MOUBIQCtPX1xMKltfXCY8UCs2W19bL19YCi1NKipbX14iIE5fXyFSXlwiISs0I19fIkpOX19RIklUQU5fXzBPIVRaWSAgIFdIJEogOyAxUF9WICQoIltfCi1NWiRTTiwoI19XJFk+M0c1Ll4wICApTiEoPiAgRTNEIUVcRFlVM0U7X1YkQzcsICBIO0AgKDJeW19YJEosCi1NOVIxKiUmPEAqSFEoNSRaWSAgITBEJUEvKlQgICElIS0qS1AgIEopTDxAKEswMCAkNCRUQC4wICIgJDJQCi1NTjAgIkhfIUQkQiBZICAoIDEkJ1kgICpCQSJBUCMgIUAhQkFcICAqQjtSSiwrUTUuTjAgIDQpITgzUk0gCi1NICAxMDMySlwgICpCPzcoISpUJCAhJCdOX14gQCM5IihZSCEyQCJcIDImW19YJEFYICApLk4wICBDSjksCi1NW0MgIF9dQS43RFlVICAgICAgICAzT0QgICI7QDInQCA+NFkgOT8pLj0wICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgJCBIKFJFLThXKVQsMllTKCMkTi1CIFguIlxQLEJcUC4iISM7VyFZCi1NPEIgUS4zQFUoJS1VO0IhLTo2LVI7UCAgICAgIiAkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUQgICAgISAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUk7Ry1FPEcwWigmKUE5IiFCCi1NOyZdQzpSIVM6N0lFKCJARTkiREA4NzBAKTItWCJAIUI7Jl1DOlctST5GNF0sIiFBPSIgRShXQCogJilMCi1NO1YtSzxWRVo5M1RQKCYlVCgiNEM+IEggOUcpRTkzSEA6NlFMOTY9QTsiIUE5JjFSOTctUygiQEUoV0BJCi1NIkAhRjxGNUUuQiFCODYwQDhGUU84VkxAPFZFWjkyIEgpNjBJKCYlVCgiNEM+IEggOUcpRTkzSEA4RlFPCi1NOFZNUygiNEM+IlBAKTItWCgmXVY5NylMODcgKiAmOVI5NjRaKCYpTDtWLUsoIjRDPiIhVzg3LEA4NlFSCi1NOTYlRD4yIUY8RjVFIkAhRjxGNUUuQiFCOyZdQzpSIEUoV0BAPVYlUygmJUw8RjVBOSdEQDlHKUU5MEggCi1NPEY1QTsmUU84U0hAOjZRTDk2PUE7IiFBOSYxUjk3LVMoIkBFKFdASSJAIVI5NiVMOyZdQy5CIUI4NjBACi1NOEZRTzhWTEA8VkVaOTIgSCk2MEkoJiVUKCI0Qz4gSCA8RjVBOyZRTzhTSEA4RiVEKCYpTDtWLUs8VkVaCi1NOTJARTkiREA4NzBAKTItWCJAIVI5NiVMOyZdQy5CIUI4NjBAOEZRTzhWTEA8VkVaOTIgSCk2MEkoJiVUCi1NKCI0Qz4gSCA8RjVBOyZRTzhTSEA4RlFPOFZMQCkyLVgoJy1UPEYlRDkmUUU8UiFGPEY1RSgmKUw7Vi1LCi1NKCYpTz02WUQ4NylZIkAhRzk3MUY8RjVFOiYxUi5CIU89NzBAO1Y4QDs2NU07VylZICAgICBKVkwgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIiAwICAgICAgCi1NICAgICAgICAgICAgICAgICAgOCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICBLLSwgICAgICAgIiE6MCAgQDZLICAoJU8gICIhNiwgIEA1TyAgKCVAQCAiCi1NIThYICAgICAgIlQgKlAgQCAjIVggIyE4ICJUICpQIEAgIlQgKlAgQCAiVCAqUCBAICMgUSxDLFQtMzhXCi1NLiNEUCAiLEAqUlROLCMkUixTMFUtQzxYLjZBLCkgIFAsMyhTLSM0Vi1TQFksICBDKCJMTStDIFEsQyxUCi1NLTM4Vy4jRUgpICAgICAgIComWVU7JlBJICMgUSxDLFQtMzhXLiNFQThGLUQ5NjggLCMkUixTMFUtQzxYCi1NLjQlIjBUMSUxQCAgICAgICAgICAgICAgICAgICAgICAoIiBAKCIgQCgiIEAqIkBIKiJAQCgiIEAoIiBACi1NKCIgQCgiIEAoIiBAKCIiKCQhIDAkISAwJCEgMCQhIDAkISAwMSQxJDEkMSQxJDEkMSEgMCQhIDAkISEhCi1NMDQlITA0JCEgMCQhIDAkISAwJCEgMCQhIDAkISAwJCEgMSAwJCEgMCQkKSIwRCkiMEAoIiBAKCIgQCgiCi1NIEAoIiBAKCIgQCgiIEAoIiQhIDAkIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgISBALCQhMDgnIiBEKiJQUC0jQFwwJDEoMyUhNDYlUUA5JkFMPCcxWD8oIiRCKFIwRSlCPEgqMkhLCi1NKyJUTitTIFEsQyxULTM4Vy4jRFouU1BdL0NdIDg2KUM5JjVGOVZBSTpGTUw7NllPPCclUjxXMVU9Rz1YCi1NPjdJOzclVT43ViEhMEQtJDE0OScyJEUqMlRRLTNEXTA0NSkzNSU1NjVVQTk2R01cPzdZXyAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICEgICgqIyAgIiJAWCAgQEgvICAoKiQgICIiQSQgIEBIMiAgKCokUCAiIkEwICBASDUgICgqCi1NJUddXz9XXV8/V11fICAoKCUgICAgICAgICAgICAgICAgIlwgK1AgTyAkUSM3VTEpMzQ0IDMkJS4xVEUuCi1NMURcIDMkLT8wVF0sMyQlNDEwISwwVV0tMTUtMzA0PSU0UCEsMFVdIzUlRTAxMCEsMFVdLjU0VSU0REUjCi1NICAhLDBVXS0zVFklNSQlMjYwICAzJCUuMVAhLDBVXUQ5NjlBPTZRVCAkLCArVjVUOFJdTDtWLUE7JjRPCi1NICJcICtXNVM8Ql1TOiYlUjkyXUw6NihPOyZdQzg2UUUrUCBPICJZQzowISo4NlgqMUY1QiJEVUE8QEkhCi1NPCcoKjM2JVkiRElVO0BJKj02UCowNzVHIkUtRTwgSS84VzAqM0ZdViJEMUU4UEkqODZZVTg3KVkiRDlFCi1NOEcpVTg3KVkiRFVBPEYtSCJEJVA8RkVMIkRVQT4wSSo9NllFIkRJVTsnRCowNzVHPTctVCJFLUU8JzFFCi1NOzYpRTxASS84VzFPOEY1UiJEWU89RjVNOEY1UiJEMUU4VjVNOEY1UiAlLVU7QEktO1ZYKjUnNUUiRT1FCi1NOSBJNDonNCoxRylJIkUtQT0gSTM9NllEODdEKjM2XU45JiVZIkUxVTk3LUQ4N0QqNVY1RDtGNVM5JiVZCi1NIkUxSD03KVM5JiVZIkQ5Ujo2MUE+MEkzODcxVTxGMUE+MCBFMiNIRTMzSEU0UEhFOzJcRTkiXEU+MEhFCi1NODIgRThCIEU5MiBFNSIgRTZCIEU2MEkhMzBJMDMwSEUwMlBAKTQoQCk2NEwoIjU5IkAhIyAmMUU5RiVVCi1NOycwIDBQIVk5NywgO0ZcICAgICArQCAgICAgICAgICAgICAgICAgICAgICIiQjAgIEBISDNGJS4gJEVOCi1NOUZFTjo3MVkgICAgICAgIiJEMCAgQEktICAoKjQwICAgICEpO0Y5STtGRVQ+MCEpO0Y4IDNGJS4gICAgCi1NICAgICAgIEA4RkVOODcpWSgmNVg8Jl1OOTZZVCgiNUQoICBAOEZFTjg3KVkoJjVYPCZdTjk2WVQoIjVECi1NKCAgQDkmNUM6NlVBOyIhRT4nIU87RjVOPSIgRTkiICAoJjFFOFZFTTg2UEA5N0FQO1ZZRTtHMEApNjBACi1NICAgICgmUUk4RixAOEYlUzkyIUM7VllWOTcpUzo2XU4oJjlJOyY0QCk3LEA7JkVOOTIgRTkjSEApNywgCi1NN1VBOCtGLCAiQiE/PSZFTTk3LT88Jl1XOTcoQDlGJUk7JjVEKCYxVTkyIVQ7UiFFPichTztGNU49IiBFCi1NOSIgRTkiIEU5IiFMOTY5VDtXOUU8Q0hAKTYwQCJAICAgICAiIlJQICBATFAzRiUuICRFTjlGRU46NzFZCi1NICRFTjlAISk7RjlJO0ZFVD4wIS44NFggICAgICAgICAgICAgICAzTCAgJUEgJj5QIkFLMiA+JyBUIDVTCi1NLl1MMitDXkNHWVdCODsrPFhCSUMhK1I0KU02Ozg3IEVFTCtDPTtENCJSUEEnUVVKOCtAMy5aKilUR1VTCi1NOC8nN1dcOypXUkwmOjg8VykrQCZbNjozO05MOTI9TU9EWFYiPTVZVEZDOyU7SzxRLUkhIlE8QEg+OFhECi1NS0BbPkEsJDtEXC1HUDU/I1JaO1dNOSNAW0JQVjMtRlI3UFQwRU0xPUwrPVhUJiwmOTJQUkZJJEw+OzZSCi1NMjMkIF9CJEhSUSZPOSc6RFg0OCAoUEVXNFFXLiAkNVdDTCs+SzxcIis/MiVCSUBXPFg1Wz48WjRCSVA2Ci1NWUknM00sVC1YJCwuNzRQXl5fRTReTVI9Kj5MOUIyRk9HPzFIPydXVT5EXidEMClFX0lLPTQuPDNSTzA1Ci1NJzkqSzomKkRAJkFDNCQ2UzI1TVAqLFdRK1FWMERULD4yMCJCV0I4MFBEIUolIFA0R08iXjtUQCFSXCIjCi1NMDVbXlgmQ11fJjpCMFwiWilKJlldPjlbK1ZKXSRFVE0vP0pBTjI8LFFAIz0oMCMwXzY7QT5PJj9fOVpXCi1NT1BXMFQ1I18uSzA2Rz0uMS4kTzZJLjNUMDNfTiE5KEgtO100Q1NZWCddWTMyTCtcUU0sSSEvIUpfMkFBCi1NLTtMNjYgXD45Jzk1TFYwT045PjFXSF1RJSI6XkkqX10hQjkyUjcxOVMlNSMpLzRTNDtcQkEmLyc5KSJLCi1NOE8wJSAtUissMkJePElRM0pTNEMgQ1JKXFNdJ0ohSCEzKEZOUj42Q0dNUytYJ14xLEpVXCE9V1FLIzYwCi1NJ04mKk1dI1k2IFMsJTY7RSo+ICJHM0VOMFUxLSwgVVxSQCVGKDtZLCA9TDknJCQ0RlwsQVQqMiU3SCBbCi1NRFErXzNXSC9BNEJWMi4iMTNTQVVMRl8mNFAlWDw5VlVLKjBAIEhVPVkmKCojSl4qKEZYIDs0OzAnNiZbCi1NMD4oXkRJUzVBUEgxKFUxOEI2LyEqQFEqQ1FNPCIoLkFTQTgzOUVdJjI8MTBFTDQtPj5aWzQ0PktZNyJCCi1NLFlcPlo8XSMkODJdViQsKkI+JDJFXCA2Sj8/SyVBOyw+Mj03U1lbSFVILCAjKUYhPCdVLDQiVDleQF8tCi1NO1M4VFlCRTxAQD8iV0lVJzMlKzlAXSctMFw/SiJNWStFQT89RDM3MT5AT0ghOzc5SzxCSTFHLzJMNDYmCi1NQE4/JkArOiFLXk9DIUZGPTdPQlJRKj40XUpRIFAiV1dMXFw6QTtDUSBVSkpLJjRRJl5NUlYmXChVJFcrCi1NTT5RXl1PND4xPEosJlJBREhHLFY0IDpTQighITozMSkwPUVVLy1dMlRHWlkvSjtMSSpVKSlBM087TkE1Ci1NSjdDPTg7VTkuOFFCPS82OzBVIzk3KVFaMU0kIUM8Kjg6XktLLiYrOkUtWElbKEowRks8Xyk/LyomWllLCi1NOiwvTkhYRldMWkpbI1hfW1MtJ0s7QVQjOlo4SlkhPSc6Qio9TE4sSkZYWVw0PD8jW18/JDVWRik/VTdVCi1NWFolS0lZU0siPkBbXkxcTj9VPEA5Sk1JJk5IMCIpSFUjNUBXRV9DRFk0SEJJVltDSiU5Tj0sKypLJTtGCi1NI1ZYLiRTOFguMSlTOE83NzUnQlpZLU1TLTU0KiA/IThGRSM6XUdJUkRaMUMxOUE8WlpDLiIlPkBSXkhECi1NTkIuMlBYQ0IwQycwMDtKJyVVI04zLEVQOS9HPE4+XUlAPSM3VlwxLUJNWlc2REkuLkY6NCUkQFQyTDxRCi1NOiJbJSdDUF4yXiFWJUNVMlsiVSYvQFNCQ0dHVi1eI0ooSVBCIS44NC42M0BNKjZPNis9XDo4R0pJMF5eCi1NT01fQSAgOzleTThKTlxXSVdRSllCQyZOX0xLLF9EMk1MSiI9OiQrRDY8ID5STkZVKTxaW0FKPDFBJE9GCi1NWDlRJ0BZJ1UpQykwJz41KjJKMiJaVzpcLjVfNSdLRF9URl9IVj5cOyNELUJGWTI9SiBRKilEKVFDIj1LCi1NPy0oSjswIk4pTiFVSUkzUilTSUldTVE8R14+WCJJOD45V0RdVUw0PFhRWzFYNlw9QVFETkEtNE0xQUxGCi1NKTJPXCNeT0Y6KSMoIzErQj1OJEE6KVZBPy5aJiMqRk5ZO0JNODQmJSVUQ1E7Lkw3UlQiRzs/OEBLLyZACi1NXzIwSzRMOTkyMisvV11KRFpSIlE0NS9fLkw/KCA1K1AjRyE5PkcvTkNXN1VcPUBBTCkuLF4/ISwxSU1TCi1NMVY7OjQ3XDQ8IC5OUyRcJSwxUCEwIT07VVZVQjstNjkmWF41PEZDLiBHTiVZVEsrJCo6MCVBTlkuQVpOCi1NKk9LRVFeQlJEJTU2IF47T0hZSTAuUC1NUUhOMk5JOzZKWkZdTC1EXys7PyomLVEwVCNFJ0M+MjZFRyFUCi1NVE5LOksxSlYhJEs+XEpPLThDS1NbREQzTVVCTS46LSkwW0VMPjQkVz0qMk41PSAtKzpdU1dWTlk6RjRECi1NW0kpVD4wIFZfIC1MIT4gICE7PVI9KVFUMDxGRkReQTIuXikgTkE9XksgRSpOVyhcUFZfN1A6XDJORiJSCi1NR1AuWEFSJ0wpREohJEVcL1okWi9VTCxPRCghRDsyPyIhIS9AI01fIykhMlAjOUUzTkdeJFw+VFhCQ1VMCi1NKjY7WSMyICtYL0YrXlhPUVUpNEgqTjg/TTUsPFwuQjxXITUzSzRLQUdHKiY3R14jT0VQKVMgRkNFJltcCi1NOy41KExYOFI+PF1JXFxIQDAjX0UjMTtYOkhFLCNHR1c4SFM5VFo0KyUzWSE0Pks/VysvJlJQOU4xLCchCi1NNFhSPTotREVLMS5HNEAmLl9bLVFMSFQ1WTAvOT8zJD48ViRfW1hVUjskUSQhJD4gLUAtLjhGSU8gU0wvCi1NVkooODNRPylJIDBaR0U1MkooPV00JEpLVS4+KUE9RzhNQCIhK1A8Xk09N10qSipYS148KCxQLCBbXVxVCi1NN0BeRjkkUi4yRSZHQiIuPkwwUFE9Qz88Ny08L0NfVkA3LVZbVk5fSUteKVpWMitYLShPJCcyLk0hRDlSCi1NOFQlT1NCXUVARkkiXlwgPyooUy1fWE0nPDFIP1klTCpCL1QjWU1cTj5DWFIhU0RVQCREQVJPS0s9KCUgCi1NLTMqJCpQLltVPElYKDo/KScsX1AlXUMhVSM/RVQnNlIuJlVKXVBHRFssWEIvJklfNDRFUV0iR1o6VjUqCi1NMkUtKyJJTylMQzYvMVgnXVdPJls8WUVVVSkjLlBfSSUvX1BbOFU0QT1aOkJITUlCRyk1MVkvRjBdKzwyCi1NSD48UEkqI1FNRkItQE4uNCZJQ01DMFZXSSkwKUglJDcxJFxHUyNORi1bSUQiPiw5WERMKEcxREtEQzxQCi1NPT43PUBANSBPMztXJUtRIEQ+Njw+VSctX0RIUFFAPlZDJSZQJF0yXFY1Pyg2QCdbKUxOTTVaSCFCJkFUCi1NSiMkTjUjQDRdXEhcI0NGVDtfWkFWMD5WVFZJIkVMOlZZLTg1JUQzXlcyWzBOPEcjKEdLJVxWTDdZR1lbCi1NW0BPPy5XRCchNz8hXEo5XFciUjEzI15UVDw9Ml4xOyksQUkhO1wySywpV1A7RSVLLispJjVLNEY8OUhaCi1NKUg+Ok45XEhFTDZAKjZfKEAiOTJYUiVPXUJTPi1QPV4zQSRFMSJEWkpYLyVNWTtJXDtWWEBeTSxcLyxUCi1NMi5NVEZRVjErIlU0T0JHIVZIRVFKTFsgXlcqTD4kJDFXUDJJSkYmNlwkMCgmQFw8MCZMUzlSOkMmIUZGCi1NOTRLVExURTpUUSFWIjBPIlkhN1c2Jzo6QitBLDJDK0BSQ080OyI1JyNfKE5OMlk7TDldVjBZRjZHXUBCCi1NWkYuI1grJy0nLitJN05BPjZGSFw/JVs7Iys/MExKXFcoLSA3ICoyQSArNSZZW0tPTjxEWDQ4QiIwKi1YCi1NSlQiWT00MTlWRjAoTi1DLEQpUyoxNT5MRENQPFsgTVFYO1RdWD8gJ0JHO1EuODI0ND5aPEFHWE83RjYrCi1NKVklNSpJIF5eUT8hJCItUzUgPTAoMllNJUkvNTcvW1RLMDU1JjdGOyhbLltaSlREQEw9Mkg/JEZBOlktCi1NNV1bXD4jVD0nMCNQMzEoMjZISiRXMiUmUCovQiEoIV8wWU8+WSZYWDpKJ05GOFVHWjdaTixWWz5VT0hQCi1NWS5YXCM7KyY7WTQhVSc/Vl9FIzdMM0BHXEBTJjg6Kz4wV0tDMVhJXjwsSl5AQk9WKD46Iz0iRVFEW14hCi1NJCtJWTMjTT1bJzRESTdUM1EkR08hRiFMQVcuVE4qNyNUKi1cPyk4W0coO09VJEk8PTNRO0xAWEAzMUxECi1NP1ZLTDcuPzFESShZWVZCNF0qITlMJiBCJTxFOEFNVi5RQ19IOzI0PSQoRDxVQktdNlM6TSRRSzJCXSxACi1NQlcwSitGQDchLz8hJjYyMFRGKVlSQ0knIFpFVUddRCBZNVUjQUkjOUInSEYkNiRBTFEmJikqQzg2Izw3Ci1NOV9UODA/WyZPJD0gXVMkM0osO15LJSY3QThdM1IsLEI4QzIuVyJZXyIvICdCWjtXPCkkNlE8XDY2STBXCi1NWyFLKUFaRSleTENcQD4nVU07Qi1YOlozJVVDMktYID4yJz1XTyQvOD1ATSVQV1w5SllaTjEqQjpWRzw7Ci1NU0pXKSAxMSI8RFMjWjQ2MzgjNSxeMU0gRExBITc5RyhSOVBHRFQiOFVOVlE1WUUyKlI2K180JzctJDZaCi1NMl03MURPJj02I0BWXURFO0g7QVFbJUpbTjpJQihRKzApUiIhKzBPVVFQOFtVNT4mJF1fKSNcTDI1Jz8yCi1NSS1VOTQkNzY/MzMwRz9ANylOMSIgISsmWzFdX0JKSF1ZPEo/Jzc9MCo2UyhPVFE/Ty5aX006Sig+QjxACi1NW1I8KUE0QkxYIitJJzY6Oj8jSTBVLSJVXyNZMClARVlISSdBN08uOE5RVCBDSDVcJTZGXEg9IFksNz4xCi1NVSs8NSApIy4mSEdTLFBOQjM/Ry4qIilHQlMrVFsyLVtGJFtaKlBQN1MnRjVNUl4/IEMvVUA+JFdLQzVeCi1NLVY6TERUSFoqTEZEV0BNQFtLQTIjSzlMS18kVVcpMUBbTCwrOi0qNjVFPlZRWE1LOVo7RytRR0VFOFI8Ci1NUzgwKUwhRj5BTz0oKUMyODBJIlBAVVJEKzFWQiZGMUlcLDtbMT0mJUVKQShZIzYtW1U6XERGNCAiNywhCi1NKSA2TEQmQSRbOllcOVcmQjhPTiw2RSVMJ1ZNJS82NScsXkFfIjFeXlFFPk9JQ1AhKSVPXFoxVlw4K1FTCi1NWTMzU1FLIk05W08zWSxWRi8uXDReXVROVEo8RlJcWkdSLFxHVF9ZLy9CKSA1VDdPST9EPi1QI0tVTzQ7Ci1NJy5JQkFWVjRNT1pXQSImQShXOiMyPSQhQicqIFInPV1AITJKQFNJWzE2Xz88UyAqXE9VJFZCNyg+XE9WCi1NXCwpJkdFVDkgRTdVPVdMUl9CQTk/KiAsOSM0VkxSKlRXMkNALltVJiY0MiBcNTs/Q1k2OEw1UjUvJDsrCi1NPDA4KSlJL1kqRjldN1EtW1ZOSUVAIixbTFIoODcrMElMNC0pPkY4X1EmSTJZXC1LLEVXXyohPEVRLF5LCi1NP1owMy5WNDNZOiEtW0AmRzgyVCItUiRbRSZSMD8gQCpOV19PODg8TkpMSU5BKVdOST0xIFtcJk5ILD1fCi1NUzFSL0AoUj4/LVVeRCk5Mz01PjpZUl9PVCY4K1JGRlBTI1gwRDBGRSwyXz8+ITZDWikrP09cQzQkMF8nCi1NXk87WElXX0BOUTc5RCBMLEVJIC4oSCtFVjw4UDVDQCswX0xWPiYoSiBRXVA6VFVePyAkPzk3SEJZJUFOCi1NSShPNUdZMiRUUVokWkBGXzQ0XFNbXlI3MUdWNSVGSlw2XzNOQTQ5Q0hFMSs8JSs1MVssMDE4VENDM09WCi1NQkAyOiQ+K0ArMkZYXysgLylbVllBMEJaXTJTRzNFP0o3UikxMDsuW1chMjtGQE9TVlJZSFY8Jj1MRTtVCi1NNks6MVk2L1tLKj5bLiIpW0ElOEk4JzMlWUMnOSFfMF4jPTFQPlsrLEtDRVc1VVU8TkwqXDNZMj5MWkc2Ci1NSVo2WERFLUcyP0hTRyBUXiA7UVkxTkYiODdJPE1JR0E+KTwlOFhQKyomUz9YSEFdVElNPzpRPyImMydGCi1NRlBfMyJCKjNeRFJRKEc7SCRVSkssXkMkOVVKKUsxQiQpSEksRUQqOylXNkdaUyxIX0EkTVpOTDRHXFRACi1NPzxWXkEsQ0pcJVQnXydESixTOiFIUTctQF1IVjMmRVM1UD87WzlaVCMyWi0wR0RCXSFBUEpUKVZJPk1YCi1NODdXRCtOPE9WI1tCXUZBOSg1Li8sPz9eLTBQMyBIQExeXSEjRkpGJUUiIF1dTj4pIzI/Klk1TEJITzpWCi1NSzQ1MlU7LSo+RCpUPUxYKFMvPTkrRUROLSdENF1CVE8gJE9VMVBRSldVSCouXzAtSFs5Q1IyLi9cKCYoCi1NLDI3VzYtVjUhUVZLTilQXTIzMl5JOi1SN0NAXiRNOlhVXUtRLzgiOSkyJzg2NEM3TyJVR0klRTIiNT9LCi1NQzBfKjkiQCldNF9eUjoqQ1VTWF1QTk5DRiw5WSc7NFpTOlo0OiQsMUYtWDJULiwiUCxKQVtSUVIjTDpJCi1NJiA1SEkgPyMxMiZARyFTKTZTXzExJCpWVF4rPU5YWS84MCIoMFRLJFJQOSwzQCdNUyVcUyc6UF5USyxWCi1NPVUrLTE0VFIiNCpbTlA+TD4oUTJHVSgzWiInSCkjWk4yKTlIQ0RDKDg7R1AkPyQxS0AiNVlaKkxCWl5ECi1NOD86M1ojNS5dRF9DP0kwRkJQKEk6IFYoU1gpTlQ0MlkjUFFTKj5HJDpRIUowLUxJXkZaXFMsMCQzOVZaCi1NIz1DNl1FK1gzM0s0PVorWTwtUyZNLjI7MDYhU0NEMzpGOFM/XU1XTVYsX0AwLDkyMTdKIj8uJjxPTz1XCi1NKkNCPFknNlVKVEBJQjk0JS1bWzE9KFI8Jy0lWTYjPTg7IEBAPCIzOU84TSglOE1EWj9GUzcmJiwuXVQoCi1NKkY4QDkgSVtDN140RTk5OlRENkhPRVclRkohXE40NVtYKDNBMzUnVS47JSJLJDhCIycvOSpTSEEqRTI1Ci1NX11HNSgoQlNMSllTUVtGUT8mPyZMXFg5NTdGMzs8NiNTNiUtRCxEWCdAU0RNJTFKXiFQU1dSQ0Y5NjE5Ci1NIkNTJ0RPJlpIMz1WWkA+NSArUEVJX0wnMkNSSzxNM1c4ITVFTS4sPF8vPFopQlUiMTYjNlo2OzgxWkBVCi1NR1BWOyVXUVEtRUhKNDIxRk02MkNASC5dIkg2XDszWUVGOzwlOj5QXyddXi9FSkouX11NVlwoWiUtTDxfCi1NID1UVSpRVFlBXVVXW1JARyhPJ0QwSF9FTzw/SSZVSFZSODxBK1hIWVYkIy5JUks0VUVIJ0dLM0EoXCRYCi1NTi8jPSFIV11KMzY7J0hVJlBCOkhDTDZcUlNIUCRDSFQ4KF1fLDVOTVciT0MuNzA1XThQNyZHOVZEJDw6Ci1NXiJFL0ZGQks/WyElTEAtMURSRjJQUTMiXEs6JUBQMFwwXTgyNyIoOSVINF47ViVAOC0/JFlaMSZNUV4nCi1NIDU+VkcqXjtLSl5UXjsnLl8gLzFNPCRSV1k9SSpfRSlQVFggNEtQQlAoIixTPFgiVV5bK0M4XFM7X0MzCi1NXkkgLydJViJdOT9ISkcsLSs3TjNGLlEvJi5dQk9OKkglNFIuQjckXEJXNDRSPCpVJCQwTDpMJkE0XlsgCi1NSEBPVyQ6LTJFQi9YTFlQI1U9NDlOUz9KIllEUydRO1BVWyc7LF8xOUsoIyI9OjVAQF5NViJHSEMjXCZHCi1NU0UxTEg1Pic1UDwyPC42QjNJVDErP0QxWkU6RjlYODY1Vz5QKytQUEU1MEgiVDNWJjBBLEJbPyc5VlUiCi1NLSkjS188SUpZKj5aWkhaSj5XWzAlLFczIjokRTo+Jz1BWixZXCE7QTxWIzNGXClUTj9eWEc3NlBcSU9CCi1NMldHVkVHQUVCQFtPLzZNIEhULjlQQyZINlxGOkgtLTw6SDcoLS1dNVlaSSw5VEtDLCVSLyM9QidWRDlfCi1NTFM1JztFXENRXTlIXV4wNDldOlpQSiQzJlkoSF1ZXiRSRkkvQ1xYRyVGQiIkLk5eW0YyITo1OUwiP0Y/Ci1NQ0wkMj0/OkBdR1JCIi1ROzNWO1s5NV1CW1UtTiRQQzA9Ti9YWC42OyElOlwuJlo7MCBISiVNJ0YlWCZZCi1NMDdcR1hfIFcoLkokMFAiJTdKMD4wQFNVRjYqPy5GVFxAODM+WDkvIzI5Ll8xSyxOWVg4JSJeQlBUN1w8Ci1NJj1OVjRZLCJYQSQ3Ni00WzNVUlFRWCs7UUBBIy1cJDteWzdHUkcvI0oyPEdWSFQgXTAyJzBIVygzSlMiCi1NUjwiK0Q2LkUkMyxbSz45KCJPIV8rOUVHKSxdQUYpQ0RXUCU6O1BPVlFIW0dGUC1DU1ZUO01UUjtCXS5ACi1NOSI3Kk5WJFEgOT86PD5UTF4qJFBeJVVRXCxdTzUgJjg1WC5FVFdMRVMpMDxUNTMjODFFU0kpKClZKFZcCi1NRV0iTVUhJVJWLk8mMFNSNCApKU81ST4nNStBSF88TkVVQU1SPyVfMDQvWSQgLCEmOVVNJCA/VFUkJkI5Ci1NMU9XMz0uJiM2WEojRCMzKTtYI1AhRVA4QV0xTD07NDcsJCtTUz5eVlhaPUVIUUFbLiA2VlhAJkxbMTJKCi1NLD1POFMpTjg6RUZcXC8nQkcvIj0zQTFGIlpFSFpVNjM0PitXSU04T1taMExRRkQqSlMrJCQ+SiJQX1pZCi1NQVxRIStMLkc6MiMhOiNRPDoyQitVTTI+I1YxXDU0I0I8RFRNMlZNR1goNEVZLlQ6PkVSSVIjUVBKQTJQCi1NLFY6WlMwLS8wPCNNN0lXSyNQJVBPVFtIIScoLkQ1RiBNKUojXSolIUZWJiotQUY2Vi9WTyBdOyhIPlEuCi1NLjteNC5bRjhRRyM7LD4sRitDICc0QCIvJklcIVw8SENWRi5PNUtPJC8iRVUlO11LQjMxLSBRWjxEXUldCi1NPF4yRE1LWk1YPig2Lz5cLzg1NioxTTxJOzhQSk1AJ0pLV0pRK15STTUzIDgzXlc2VkhMXSUkPDosNlJXCi1NRjguUyFPQEkmQFJSNj4rMEtTK0UuMTRYXU9fOFFfJEElRkBZXVYrX0Q3Wj1RXiFdLy0rV1pOTSRdPSI/Ci1NJ19WJytPI1gtQUoqQ1ZQI0QoV1AuXUNGVloiQkAuSiggVUZFL1k0LEUsNk5TVCNBVTEiNjFTPjonV1FZCi1NQD9BJicmNVk3OSErSTwkVilJVlBEL11FIC9XWTQkNi4hP04tMTMiNktcKi1aK1k1XTlXWDJeMykiVClSCi1NQ0RbRVlQRjQiSD5OKSsvUT4pR0s9XTo3QTpBOEleMlFPM0BaSkZTTzclN1YyUSZWLSQrKURZVSFTN1AiCi1NTFxHUy86STRXIy8+VkFGTURHQi1SJTw3IjI+Q1k+QjRVMz82MTk+WyAmW0kvQSkxUC84KkldKz4uQC8zCi1NLzQmWi45QCpDL1NBNU9RN0BWJU5MSEFGWCdHIlI0QUBVMUM+UyFRTCpbW0EnRUQlL0kkRzJVSyU1KyZCCi1NLSs4Uzg4Jkw8W1xMXFtIO1lSMkkqUjteJS4oNldUQlhVKyYlIktbRFlCNiNJPTlXWUxNOzxBOScnKVNNCi1NOSMgNz9PIFlXSC1FUC4lWyhIO1I+IlRSLDtWLE5HSyojUCJXQlgkPSBUIywwPlJNRy9MSVBaXz1YKD4qCi1NJipRUCsoXSkvJSBZREwiNC9IXiddPCpcTy1BWyBQMSJVWkhMJikqP04pNjNHXUUwUitRL0kuRjY5UCs6Ci1NIlA5NltaQiFIV0NDVUVRVi5QNDROKSRDS1gjI09KXC4hM0VZUldMP1QnRSApOkgrNzdWUU84LCYuLTJDCi1NKkEzMTggTi0wUy9EOUJJSTheMVBVVS1KJDhMWTMvOVVZJiY8Wi5PICIoUF1TU1VIRVteRktbRjtCVi5ACi1NQCY7JTtPQi9dPF1dN0AlLjRKS1JYWVMoLFQxTDcyOjQjJVVTXDZQQj1RMjcjUSo+Tz8oUkg2QidUITg5Ci1NPEQkQDFBQEtJPTBFMkJNLVEvKzZVVVddSFg5XTJaXj0iJUE6LEZBKUtdS0NRO1RBUVEsUlctLyxbJDdUCi1NRSswRS81WDIrVkc7PTxPISE3Tko7SStRTiFFWioiXjgqJC5CL04oLCAnSEEgIk8wJTVENEEjNVtdM0VACi1NNS9BUis9W1leRj5FJiM7W1E/U1ouSlhNKi4qLyE0KkgwMyVePEcuQlcpVzUrTixFVU4tNFI1LDNQNDIzCi1NTlQoVCM7SjsyJl5MIjFTK0lXR11NSTRNTVsqPj9AKDlNVjswI1VNWTQhLFEzTzhdNSpKXFQhMVxLR11YCi1NNyU6MyhVIEQpX18wSEZBJztHSE9FKkouRiA7UUhDTV1ZWy4xXDVMNCpUWClITixaPkctTlErWz9dNVkyCi1NVyowSS8xQk4kXVUsODMjN0pCJkNMQDdGMVBBSDAtPDAmM0hCIFJRPi1SJEVOQjRbRTE1LEBLNSQ3NFVbCi1NLzYzOz5JLzFRI1MySz1IRTkyJkJERik8SCopQ0kwJ1NFUFFFTzAyKSpTOF48RSRTRElLTDBWV0EgXSQlCi1NPUJQK1o3TE5JJFRHUEI9OEkpNSwyUTYoNT9NLzc+VkBMS0k9LTIpQydVQEQ1IV9dVzU1K145UigqKU8qCi1NOiskLTUoSj5KMSRNR1dfMTsgWig6LCE1VywlLjMzXU9PV0JbM1lTR0I/Ti5WWj5bQzgjICVYVFlAVC42Ci1NJyk/OCQkIDk7MCRIMFUiWDlFJiI3Vy5NTiFEOkw9XEtFPTc8IEc5LzREVVNQRDIpVSMqVilOQFg6PV9WCi1NU0c5Ok9TJjtWWDhNLVdIRl5CMEgrNkUmOFpaPD5WMEVbNCpLIjsgSS1cUEZaLkg2NVVBMyJQVllJISovCi1NW1gsJElGXk5HUzMjUSAvKEZUV0g4ICI4KjY4RTBaMUlBSEEzNEhOSVggR185TlxQTkxJK1khLD0kK1BPCi1NKiJGOTw8PicjNCUtSStLTThSKV0hKVc1SychXF8zMEMtT1tRPlZOUz8+NVsvREUvRjUvQ1o4MyY9TCQjCi1NUiM+MCozIi4zVF4mXjtDPjU3U1c4Q1spUVNENVMyOCc+KDpJQEY/MjxPIyMySFQkNyUpMTI/SShbU08rCi1NNyczOUBVXF9KJ1pVJixXLiMzVTRGTDJVL1VeSSY1LSUpQSQ0UCguJFEtX1k2Pk8lVFEkLCFQUClOTSBVCi1NVi1AXCA+KU1KNE8vLjUjPz1PV15IQDxdR100Vkk3W11fPzs+VDheJUlFJEhPKCZRIjJeSlwgJyIyIkwwCi1NLSldSiFCOlBEPTg7KT4hJzAhIlkgUllQJ1ZPXlE0TkdXVzgvLSkwSjkvJzpFUixRTVpfUlQ2NzMiPjtYCi1NLjtMTCRbL1AsLUZKSTVNOi4rQVJLQSgzSyU3NlY4NFwmJicgSVRFOFA0XkVROFA7I1UmXkxPJDAjTUA+Ci1NQi1TIyE9PVI8IigpQyAiSjxWQlgsVFBfOjBHISMqJk8sK1AwVD1QJzlASydeJlVVIy87WUo1Ozw9RzMiCi1NXkRUKDIrIy0kMSxZUEonXjEjSzc9N1s3XSFaNDxFTU8iV1NBKyo+NyNbMzE0UFNWTldcNCo3VD0+ISczCi1NLVBHXVFAJy9cSFUvSCAlXUsgXSUyRENQTjg0Xy1UIUE6JCggXTYoUDUuQSEhVVwiQT9AUTBfICQ2TC1XCi1NIkdaJVJSNyo1LCBTSylRRFU7SlhNQEImNUgiTzEnUC43MzRNITUzQiNFJUgiLi8oPzQiIlxXOFtHVV4vCi1NPS04IEUuNDQ1IixYXkxVIkBbUldAW1ZEVC48OkpOTi47Ql5dKEI/WTRUJi47RSIhKl0jIl8nRSFPLSdQCi1NMURaMS1bSDxYRSAnKiFGIC4+RlUyMD5ZMElaLTdTRykxN0pBTjcqNC1ASDg4LkhDOF5RITU8LVNKTSIkCi1NN0hGLTVNNUEnOTxfIl5cK10+KjAlXlZDQSdIQVAsMlYiUjhEQyI1VVQsJCImW1JaT1JHPiU6JlBaOFVECi1NP0RPWzc/JCQlVVQ5XjFDJiJQOy1RNTtORjdbQyJIUTU1UjgmMFNJOEldWFE0J0hZIS8oSkgyITJEViciCi1NJjk1VjdYPzkoUUwhUShFVkA9SClfPTJBQ0xLRCogKSs0IzM7NzkoXVdbO1EhRFpWRko+LFk3Ok5KSlssCi1NNk0oKjwwSUVXLi0zNzIrXiAgPixAP19XM1coT1RNWyY6VU0xTzhAUkUmT1QiMDRSL0g9SSRYQlFUQCxWCi1NSEZEJF9XQzo3Ml1KVERcQTBbIk5EMElYJDlXUTArXldbOl9KJSs5TktdWk01WkBJPl49WiZMVkInLys3Ci1NWD8wMCk4T182K0FKLioyXk1KKUggLl1aWklUUEQyPikmKkYzTyE9V1tQIFQzVixHT1g+NyMqR1EuTyddCi1NWEEsLypTWTg5UUBfX11dTVVIXSdDJSkwSSk7LkAjREQkPU02IUJfJ0YrJEhaRlAoMFotSFssTVMrJjIzCi1NWjUvJClYKVkpQyYiMyEnIUgtV0tVQ1UqQjE/WTlBIEwoKDBWNCtYKUJIID9NKjJNUSFaPD9bLFAnOl0qCi1NJEtUQUZMRStOMVAvRjc1Q0E3Uk5BMUwrRzRdMCNRVj9SUUIrVCI1NC89ODAjIU9XPVRPRCIuT0dTMjwsCi1NTydSXktNMSk1SDk0OzlUKkpWMjgoL1E8JjotWSRAR1lLVzJGODcpUkQqWlBQMkwxTyRURElUKDZEXVVeCi1NRkdLMDxDT0tYWD9IVFQ0PDwvU0kmJipGTU1FRSdQWz4qMSxGU0YySz4wKV8pJCNKOis4Oz8wTUFePE1MCi1NPDM+WFJPJi4zJF0/RCoqVTkvLkoqO1k1SDFeT0lNIFZKUjg8UVIzUi1CVVpdIyc/VjJJWDovRl8pPiA6Ci1NIldTX1FMVzdQSj5BMyJAUjQtNThEUyJYMzNWPkkmTl1OWiNFV0RKTCk0UEZbXkZaIlwnOlMqJStaT19HCi1NMDswKjRcLDdCNFZIQSBVT19YXDwzSFpfKUpALV9CPkU2XEIqVTBINisgNkYpWls/UF5DUicpSilXMiYwCi1NUTIiLkwkSFckKVU2LlBLIS9dV0gvMSM0Qz9JQ002Li48XSJLKkEwTSA6STxfMDEvMlxUOjE1MjpEPk8tCi1NNFAuJVsiRixLIkFJJissQUpHPT5fTyczJ0w6IlozVCBdQD5ULiFSMTUiTjE6WzZHODFSXUk1NEY1VDhXCi1NLFU4MVMjP1FIM15XUVJWLkEtUy03UkcqJklCJ0srNVcxPC5AUyYtIC07OykkTltVXihQNkpXJCpZVDpfCi1NL1A6MD46SC4hSCgrRkMhLUVCIDo+Ol4hLEdCJ09BMDYgLl5KQkowVy47QikpQjU3TCIjMD0pNzpJPVJICi1NW0IjVS9KIi0gPT45N0Y/SUQhXj1DPCI0XyE+SD9JJCQ+JCY9N1lJO0JJMSo9NictXT1MTlheMi9QRiNcCi1NTzhFK1U2MTJMVUggLVJePklNR0tYVCc0XiZFS1VdPzw7KUs0U1coIyhCUiYsITFZTD0zSkRAJjVNRyJACi1NNUY9TUxUL0o9TEsgQFROTEsnPVRaRjEpNVdZNDtcWlFYS141XVg9OkxcP0BJXjpATC8+Uj4+VkhJOS0+Ci1NMlE5Uk5KVVIzIj06QCMhMjBTQF1KS0VVOytRLTxGXF0lRT0+IFEvP0I+RSIjVSNfVF8kMkE1S0ktX1IxCi1NJlQ7X0xDWj4tViVWMUwkQ0tSND01M1RRKUJOI104OCFUIyQ8WCUwVFZWXF0yJUhJKzY+KU5EUzBXVjIzCi1NVEE4VFohX1ZMUy5bX106RDxKQSUuKkEnMkYnUlpfVSZBICJYKDtfUEU/Vlw9UEhLPU1HKFE2JVU9XkU3Ci1NOE0nJDU5S18jRzcgQUopQTAyNVggKVlAKSM1QUVcT0Q2NVZfR1hVKlQjOlw0TVE4VDhYTygnLVAzIEAsCi1NJzo1IzgwJUpITVBBSSxJS1k/NDE5XF4zNS5GMVVRN1hZSCouWFhVX0QkMSRCISA5SCRBTisqX0tdWDlGCi1NUzFQI0BcTDErXyJGWEE1NSAuXygzNkwoNTUpVUFdRUQ7JUE1TUZCTCUsR142XyElU1dXKyhQOkEwRUFBCi1NM1BUX1ZVQEUjVjlDX0tBKiNKX1gxJUYmXFM/J0hCUCYjU1szPTExVlk9XC0nPkpWOzlePyMyLFNFKEAkCi1NKkRARyIyLEQ8WVc8IVo9OCsrKkJUJj4vJzdLQisrMVc2XFtJPTkoJTFMJ1MwISM4WE8iVCdbJCtVOUUoCi1NRjUxPUJeT1Q3SSxfNzJVRVVMV1Q4QiQpWDg7UCo4KDdUS009PjI/Ujw6TjVdTlRMKiFDQydIJ0VCVi1fCi1NRyxSLURcXTIqVz0iX1BZL05IJl5BKD9IXVxEVlVbR01YV18pVjghN0ZUR1ZRTTc4UlQ+RkE+Jl0nM0szCi1NIVQhPUU0O0Q6QU9BICRPTD08Xj0yP0UzQVc2XjooSVJLTElKIDJHKFBYTyImLUQvTlk1SlRTIidTRk8tCi1NOFFER00jT0JNL0Y3UTVEKjNYTEEuT1YqJ1xPVUEsW1wlPkxTOElXMytGSEooMUlIUzJDJTMuXCQmRis/Ci1NKiEoPycoSzdHXE1FKkRFXCQwSV1ETl4uPlJTJycjIEdNTVtfMTMsOE9ZX0wpISYySkpOUlshKjxPMiRICi1NOTwiSVclL0g2Ii9VXTVaOUgnWDhCW0A8RDZdJjpBQVlYJkRWTSonQDtVWj4vNzsoXzkqX1dfNjRMK1wxCi1NXCVJSEhKTlkrVDY8UFs4TytIWkY6OCEgW1VePjlaWCk5TTNHPF0rQlEyQi5VKFJaWCZCITFdUkRTPkYxCi1NIEI+Ric7KFIiMDpIPUlTX0dSUFBLPDBGIi9IPiJeV0YvR0dbJlJULjNLOzA1XE0sNUxLQ1E4R1lJW1leCi1NWVNBOlQuLzMnWi4jQiUlWVpLJzQxWFc1LVFZWUUoS0xLSjtIMV0tNj9ZSys8KEcmOlxUKVYxWVgvKFhbCi1NN1dPJC8/MkhcOE02NzpRSThAO1JZSCZbNkkmQSkuS004MV1fXlpCLl0tKzklKzRdKVM3VFNYSkVPM10wCi1NK1Q9LVMpLVtTWjdXQ0FJT01CTyYmWCs0MiUrMUVZJj4lX0lRSlQrUCZITyc5SkErPy00QkpbNjs/US0oCi1NRyFBOFQlOFZdQTE7PEg+JFgsVUYpLlhcKylQJS43LzU1JjREMSREI1YrVyQ/Iz1YNCQmWyg2WF9FT15LCi1NRzQuVFksOClHI0crMz1OSU43RVlOMCYkVCheMkFeTzEoLD4nXjhYJSA8SzImKlg4QFEwVkBLX14kWyc1Ci1NLi5OMDRBWkMvKFZFSERXXkZZWT1RWzxGRlUtT0AlVThKU0ElRlo5REsvPF4wPVY6XDQmU0AgVF8kRF4pCi1NUC1CXkkyWDIyJktGTCtSOkInXF1fVlwqU15ITjNbJjY9OlNNTyZWNykjLkgjOzAuSUhaN1VANElWJyIwCi1NSksuK0hYWjZCXk1PSFdBVjNaV1QvK0FIQClOK0g3KU9dR1k0QkBaUFQsXlVGT0BVLlQhR04xKz1bX00yCi1NRTc3OFw4LV8pME8pLE1eVV42Q1ZSMSpbRjMqQDA2WUNOQEE7T0c/KScmQCsjSUshKitGV00+XitdPTZNCi1NTzc0V0ogUys7N0AlRUIvQSlEIS46OyNdVyQiVlE2RTAjMjpSNF8ySz1QJVZLPi89UDIgP08vUj8uIz5RCi1NRk5CJzFKJSUuWFtTUltLME8tIjAsMU0gMCgjQTxKNSktSU5bViAgXDg1I1MgVldXQlpCLzc8LiQ4IktGCi1NXyRcPywtJ0ksRy4pUjckUV9KMzZUQVk8JERWQ1xBKEosK1BQOCBUOls3TVxYMjBJPEc5KjVMPkteJ0g/Ci1NQU06T1xXWlQrXjpWSzxWMC9cJDAkTjsvVT1fICMpLlxeQFFLK0Y0LypcMFtORkUxRUAhMSVfTFwpOTdaCi1NJSs8XTQtLy1JWCkkKzNBIkpDOl9QOVo+Nk9CUC5GITBTWUJCOTAiNT8rTCE9UkQlVkkjRy02VEQzJz5TCi1NUClIK0ZIPVM5XUgxPUM4WlxEKkZFU0RaPzstW1svQFQmMTpSJStbUy9SXSQxUVxOUig8Lj41XV83UDkzCi1NXjxSMzg+OUEvQ1lVIyI3Jk8mSSAoPEFdS0RYRShAX09BSTk6ICc3QlpbKVk3QDY8JVc9LyJDQ1xcLzJICi1NMC9cLjg6WlUpUFIpLCokKU5EIVsyMCRPWCcwVDQjVy8uJC5dOlJASD09M1lATFwuRTRFVEdXKTg4ISg+Ci1NKzRFWVgoKzg9PjcjUyIsQT9GWkolPl5bLDJUVyEzRjM3ND5OM043STJBU0tWL088Oi0zLik9LVcoQSwsCi1NKzMkQVJBUDwhXFk3JyFFKFRASSlfIiI5Iyc8Ly0oUTU+UChdQE9CSzJMIj5DWUAnJ1AtKUQhKDhSNU9DCi1NPTZLKzhZRCZGXD5CIDEvUFBLUDlOXig6IT9GWFhLNUgwITs/KypTTyFaXT1JWTdNQSo2KzozRE0lVVM6Ci1NL0gjIlhFPkZYRygvI09WXSM7XjxPVFhCTCgmOi9YR0JVXV5VWkInTVZCQipaJE5dOyNMUyBHI0QvREA+Ci1NIikiPUZYPVVbSlxeNyJaKUc/NUQiWzEvWzs+IChSRUxZW1IsTSkvIEo8JE5eNktRKV04KklZTTwkVjs+Ci1NVDk7XzQmLjEmNDMxS0o6U1NNS0giQSIrXVdBQTpbV11bVClITUwnPSlCQkVDPSw9KU0kT0IpLEAkQD85Ci1NOkAxQ19UP0spKyQoVl9ZV09EW0tAOyZCWDpYTjc1M15fNS0vOSxXUEwuMkQoSUlQLFMzT0tcMTlSO1BECi1NMF9GXj5PP0cqOj4/PSpSOydATjBPIDhJICAgICAgICEgIzggR1AkXSBAWCMlIDEuITtUJzdQRFYiVCQtCi1NQDBfVCRJUCAgICAgICE4ICswISMgJUggPCAiJyApVCBNICMqIC4kIF1QJC4gMjAgICAwOiAgJDFYITMyCi1NIkYsKjJASiwgLyQiWCE/RiJWODExISJHIFQoPlFRWSYkOUwsJDI0LSk+VDxWIFlbIylYLSYhWEkkWkQpCi1NOUIuMyMpUDsnMilTITJUM1ciMikpLkQpQFFIUCkuNDBJMFE6JTlARTMhK1UlOlw7XDImWiZJICgjQCBTCi1NIkFcMSwgTV8hJEw0OVAqOycjOC9BQjIjJjk4L0ggTl8gQlAlSlAuKChGUD1VUD1MJEssLTVRJj8lXkAkCi1NIzBOVSAmJCFEUU9cI19UNDggUk4lIFhBKCFCMyhLJC8/IjA2IjdMICNCOFAiLFRCXEFGViQwWCRTQT1ECi1NJVZIMz5ARDwjI1RFUyEnJSU/VDFWIi87Il1QQ1sxUCEjIlxGOSE4JiNNMDIiMUQ1JVY4RSZQKCslJSwoCi1NOiFRWiZNXEY1MSU5JVI0IydBUSQjWyw4SFIjLiApVClVIT9fKDw4PTEiNU8pTSg0KCFKXydUOCJKUCNUCi1NJ1Q4JEsgWk4pM1AhUSAmMSVWQD0mQDc1IE8kRjhQMUYiUSw2OkFYXSM3LCM8MEJcIUxUMEIxMj8jRTwrCi1NPyEyTidNSEY/IVUwKDNQLzwwRz8jPUgqRiBMPyJeQDxfIFs3JkcsQCJBJCInISg/X0EnOiYyQDVBUiVFCi1NJSIkNTxBW04gRlA0PlE2RyNSJDhVIi1WJTBIJi1RTyckI1wpJCIgJCY6RDdMICRCKU9IIE5SLDAoQSgyCi1NK1AnQidaXC9ZQCEsIlQsRURRUFEmVyw2S0BTOSc3RDwyQiJBIkUwQSEgOjAhJiw/WDErUCg7TCNWUTk+Ci1NKFZcLCVARiQmNEAlJVBCUCcoRCVOIExHKUsoJU0gMy4mNSRDREApVyMmWCNRQjgkI1kwPj5BNDskNVQoCi1NS0BKSCM6JEE+UCMqJFcgISYxPVwgISRCQ1EqXCMvQEY8ICVHI1tcMEpCIEAkWyBDLEFHLigqSC8nQEtTCi1NITEsKllBNyUoMyA9IDBUISZVQCFcME1OIlQ4NkxRUUMkPzBDMVFBWCNPUDJAUExPIzZAMTQiLU0iN1wrCi1NK1EjNyJLWDIgMD0sKUZYQSJQJUshUSQqJTE2ICFeQDhGQThKKF1QMj0yJEYnPzAqRTAkQSMyICEkUEg5Ci1NIilUMCIwSzInUDAyOEInLSQvTDtcQFk8JjskITUhRF8iJEQqPCFCQSdVOD5IITdCKTYsMFYgVionVTAnCi1NPyBfRiJaUC1AMUQwKUUwKD9CK0IoXTQ3TyIhWCBVRCQyIDI8IEZQMl5QIjghJDA9MFEqKSNTJC8vIEhHCi1NJDMkLjshJCwiSyAwXTA7QSZELDUqUVJTIyc4NzkyMlQiXFQjRUFeMyciQDU1MDEqJlA0P0FRN1AnQkg7Ci1NUSIyVCJSXCU0Qi4pKT4gNyIgIkQoTFQiKlAmUigvVDM2MUwpIjQgIScwOUkmQ0Q6NiI8JSZRKEY+QEZLCi1NICQ8My8xMlMkMlBDJiBeWigrNCVdUC5MJUwgNFYxTFkkKFArRzBDOyI/WDo/ICJaIidUND8hSC8jT0RFCi1NRVEkNyYrPDhQUVw9JV1IKj5CLEspQEwlKEAgUiNdQDEoMVwqITk4N1QyN1IgPCQ6IFE7NCFKTDY+UEBcCi1NIlo0LlwgQ1koRjwzLiE1PSBTXCs6Qi9JIikoQDoxP0ciIkArWTFHUSRXJCpUMVFSJE8gODpQNyUhS1RGCi1NRyBVKCAnTDFCMihLKSxYKz1AQ1YpTiguOyIiWSFCKC9KUVBUIzVMMlJBNSkiLCggIDAnWydSJDRdIVo7Ci1NKExcQCNCKUohPkxETjEtLCMgXDVVIEc4IlREIEwgIzUiQlxGVFAlNSZJPDNbQEI/KDggRk1BNkUhTVAsCi1NJyE7WSJMWCZWQU9dIEo4QDEgSFElKCQwJVAuLyJSNDcuID5DJ0U4MStBVCElWSgrNUA6JiUoVDo4IidYCi1NKEw0IlRQQC0hKiQxIjAzJCYpPEQ/QFpBIk0oKFEyNE0oOkAiIVAlJiRSOClTQCNQIlAkN1khUUMlRCA2Ci1NKjEqNiA5ID5dIEYhIk0gO1JSOkEnV0AzIiBUUyYsTCBPIE00I0JQIlNASEkgQ0QxQzIzXydEPDozQSIlCi1NJys4MVZAVzMpTlA8RUBNTScnNDNNIC4uISkoOl1CNCclTTgxWlBAMik/OCdaIjVeKUNIOkxCOFwgVlhBCi1NMFAnPyNPLD4pMEZDJE9YOFFBRD0hTUxBP1I2VSc+SDdMIiRUI0lMOiwyN00oQTw8JSBdMCBILC1UQi9MCi1NIV9QKVQgXl4kSDhCRkBLTiUyVERaMSYtJ08sPkBRXSApL0gjPzBGMyI6ICI0UCooJEZARVUwME0mMiA2Ci1NNCIyNiIvLEA3MjcpIFwsIycwWk8oQUhGLlBQTiYhXDpaIVJMJUpQJl5RJjMpI0g1WCImTyFdICtRIVVFCi1NI0tQNlIiKSgoIkRCPFEhOihIPCRWUFpNJjxMIClCLDwhSURFIFBJQCQtMCpRMDkxKDIsPF5RJTAgOjgtCi1NLFIyQydQNDJYIUNdJFAgIEEhKigkWUgoUjBRUidQTEIhUTg9Jl4gJ0cyOUMkIjw9Q0AhSiFPRDhSIUReCi1NJVBQRTVQOy8oQzxGNVBLLiJKOEJOMDI6JVlIJS4wREggTzgoVUI5XSlIWCEwIF4tIk48LkVQMkgnUiw4Ci1NLkA/UCQ3WD4oIVlfI108JFtBUjYkKkwiKVBFRSczQC4yMDI3JCI0IjlBLVcjQjgiVjA4MSMnKCNdUDFOCi1NJjJULDgyOjEkTTQgJFBOIyMvKCQsQEIvI0YsRS9CO1khL0g4IyEvWCFVWDNUMVxcJEokNVQhIiwhXlw7Ci1NWyBPMidIQC5cUTBSJyYkPE0iOE8mSkg3WTIiIiUwVCJUUFxHJ0U4KDggOUolNkAwUFFCPiEyNDEhITE+Ci1NJkJAJUdALCAoQiA5QSBMQCkjMCU+UDEvKTUsKFhBLVwhLzg3VlE2KyhLLClSUCQzJ19MMi9ALy8gKjQ6Ci1NVSA+VSBYOEciUDYtICRYOUFBWCggKkwkP1AgJCUwICsoIFA5JzM4RTsxKj8gQzA8XiBNLik0OCJVQEdHCi1NJjpAOShBOi8oKFg6ISFeTSBQIDEnMVwsIFQgRV9RSTAkMSw+IUIlJiA0UCBLMiBRKDMoICEhRkIjOjQsCi1NKiEuJiBJMCVdIUpHJiYoOTJRX1InT0RAOkIzPyhcRCgkMS49IzNQOllRRU8mQUwwLVAyWCdUNDAoQFlMCi1NJlIwKEMwLEUhKCggQTEhKSY+XCckUC8+JTgwQU0wJEwiMDgtT0EuOSUuWDZWQic/JjpUICwxNjAlOUA/Ci1NQCBVUSVSXDRbIT0rJUAgNyhCMSciOlgmLlIpWyErUEY6UStQIkBUQkVBQk0oJlA7WiBRWSYlICheMUIzCi1NIiJYRC5AW1UpIiguJiIwKCYoWC1ZUU5JJSA4PisgTEEnLVhFJyBEIyJVUCJAMTdeIS88KD0xVkQkT1RECi1NWDFONiIgWC8jQCQjJTBcJVEwUUglTEAtJVBbIyM6PDdRMjgvISJQMC0wWjopQEQqUjFDWyFCPDdeIjVCCi1NIDosQlQhKicgKEwzXEIzNSYtKDlbUD9AICIgOTlQSiAgL1QsICIjViFRJC4lMVQlJjA8LVBQUVojLjQtCi1NNVFeMycxKCAjMUNII0AsRj8gUj4gWSw4UiFeQiheQDAnUDUvI0gkNj5BS0AiRkwvQzA6MSApTCpaMUUhCi1NJitYPk1QRz4jXkwqICEuRyEpKCAzMURfIVU0NSxRXEoiSEwhKzEsPiIwUDovIjojIC5MOEsiOUolVFQxCi1NQDItWyYpLEE7QjIyJ1hMRlMhRCUmTzguXTE+SCI+JCJMUUlSIU4kLDxSKkonJyw3UCFTXCVDVDFFMDZfCi1NKUZEOFdBKSckSCQsXUE6WyUmVDRHUUgjKUgoIUohJFogIiwiQTFfXykiXDYpIEcxJScgM1hRX1khXChCCi1NIyE5Nic6JCwrIEpMIiQ4PDNQWyEmLzw0KzE0TSghXC9QMFtVJUNERUkxLCMkSUQ2WCEkKikoQDcjIV0lCi1NIkAgLFAhXyMlTEgpWVIiVyNYPCI0MUdUJUw8JioxJSwoLygkTTIqUCNIIC9fMTo+ICRINj5RM0wgOjQmCi1NITAqLCBJUDYsUD03I08kID5CKlcmNjRFVSAsXSEzPCZeIFknJkc8K1ExVkAoUExCW1EnMiM0WDJSIE46Ci1NI180O1shN1klVUwrRDA1ViJfTCo1MEcuISJYKllALTIoP0gtTEAzJSckQCJKUEpcI09QNkVAXFEkLkBBCi1NI0E3OiZCMCpFIU0nJSBcOkcgU1klS1gnPlBAXSA/MDU9MTtbJltcLzpQLSkoRVw9WzApSSJWRChRUCFdCi1NJkY4QFdQPUUiIChDUiFbWydKOEJZMCxbIzg4PyBCKiolQjxAOFBDIiA4TD9GQDtCJ1kkQEkxSz0hTlwvCi1NRUBJSSQpMC1UQjo1JTVUMDYxUCshWjBCPSElOiEgSCNNQS8oJSpIICsxJzMhTFw9JiBeWShYLEZcUTtVCi1NJ0hMLzggXUQlXUQgLkApIChRUCJGIF0vKSs0QU4xWzwlQCQjIkAnQSFWICRNIS9NJ0s4PUkyL0cpPlgqCi1NQDEmJSFQUDhRUSNLIyAoQEkxOlUjK1hGIFBZISIiICssIThKICRUQz5BQikgXTQrV1EmXCUhSCY9QSA/Ci1NIydcJT1BMV8hTzxDUlExISBMKCpPQiNOKUpAKVxQS18iPFQtMyBJTSNIJCpIQDwnIChII0dCLj4oNFQxCi1NOUInPCYsIEYqQidNKTRQI1kxOzYnODxFIlIiSiFIJCpTMi4lKCNUJk8yOTIgLTQ+UzBMRSE4LChZIUNQCi1NKChEMzoxMkUiLEw5XFI5SSJaOEQlUC4/Jj80JUwhXE4oPyA3TFFaUiIhUDdWITFBIEgwLU8xPFMmXTg9Ci1NRFErWiQ/SCsvQjIyJkI4JFYgIFIoLjw3WDE0KihWVDlXQEE7IUJAJSRQWyMjXjw6P1EhICRWXCNdUFIwCi1NJTo0MlVASyAnNjQiJSAvVyM2UDdYIUxUISIkNFZANkklPDwgP1FVLiY9ND1BITNBIScgMi1AOy0iOVQzCi1NXSIqUCNeMD1RQjpWIVVQOlxAVlolOCAvIjEsOCFPMEZBMDQ4IzM4J1UxUjMhRFg+Q0EyOyk0JCQ3QFtWCi1NIVYkLSNCJDImMCAgX0BIWik7NDkyQS1AIDhUKiQhVFwpI0xAKiAjJyg3OCBIMUM4JjpUNUowPkYiX0w0Ci1NQ1AoTyRVWCEuUDgyKElEPCRCJk4jTDg+LyBTLiFQKDw5IEkoJTdURURCKEIjQ0w4QTE9XCNBSCEoISFOCi1NJUowLURRUCYkUyBCLUFCUyNUJENQIVwxJDBEMTtQUDcjPigmRFE+LiFYRDxTUUFSIiZAOUhBOzYjLVwvCi1NMEApTSNXXDVCIUxSJSQgPzkwR1smJSQ7R1FVICErUDMoQEZJJyogLkEhOyEpPEBFSVFPMCA7TD1PIiQxCi1NJV4oP1BROyEjKCA+MSIwWiQtPERDQShcJygwQiggXU0gREBEVVE8QiZGRDZSUDVaKUo4O0wgRjoiJCA0Ci1NN1A7UiY7UEchUjtEKFtQOjMxMjIjPUA5KTI2PyFFKDUwQF1bIiwkOT8xL0kmSEBCLzE3XyNcOCZSIFJYCi1NKClcNFBCO1smTjA3P1AxQiUnPEEtMTowJj9EM15BS0AgPFAhVlA0USJNRD84IUZCJ0o4OzpCOkUpKlwuCi1NVDI5SiQmPC8gUClTKT1EKDkwIkAhMlxFUkIlUCklLEMhMVJVJ19MN0AxTjwnWVQ2PzFWViI3PCBBUCVUCi1NJilYMV8wP0soXSwlKyE2JyhYTEJEQixCKCJAMT1BXEwnVDQ8LCEmIiVeUCEqMDA5JlQwRUUwJFcoTzxCCi1NTFE9OiNeVEU7MEcsJEY8MTMgVC0jPEwiIlIuVicuRD8wUC5WIy1cIUhRWCUiTkQyJSA2WikoICZHQjgwCi1NIEUgLy8xVyglKzAiN1BMLicqLCxfIVNUKSdcI1pCMVYgOSAhWTI7QiEuRCAtIU1fIygoKjBBLi8jLUwwCi1NQzIzRCZMUDRWUVU0ISk8RCMhLFEoW0QlLyAkUiIlJEZRIV5QIF1cO1NBOEsmT0g4UyBGTCEvND89MCoqCi1NIz9IPjMwPTUnOFgiNyAwLCdfJD9aMDtRJzooL1VQOzEiSFA/MTAgISA3MCMyUFI9JU1MNjIgWkgiNkRACi1NSSErRiBaKC9aUV81IkNQOUlQU0YmVFBAM0ArVSMsTC8uUVo4ID5APEFCM08iPFBCI0FVPSg8WDsjMFdHCi1NKDpENzUxXjkoVyQ3IjE9XiJdXC9RQFBbKFEsQlUhWFsiOiAxMiFZQSBUKDZEIjM3ID9ML0UiKT8lRTxDCi1NLyBQOyc2LC9SMEs1J05EQThBPyomNkQ4TSAqRiUyQDVPQjBTJVAsKiBAIUohWigzRkBOMylBRCQvQCheCi1NKSIgQSIxWjklIVxFMDBWUilGNDw6IC44KDhQM0oiOCspN0BCVTIiLSgtVD5NIFglKDdYK1ghWiUkMiggCi1NJyA4WSQySCUzQS1ZKEo8Q0IhVEYgVDAtQEIwUSkiWCxTUC4wIDIoJVYxJSwlUVwwLEBeQyVPKEFRUCJHCi1NKCpQKUxRTDQkWFQ5PVBIQCBBQCpKUCMhJy44K0AxWVogUSQvX0EhOCErVEJFIDo2JDtUOSEwVD0mMTwlCi1NWEE/KSErVCQ7MS9eIzU8JC0wPkYmQSw8X1FAKSZXSDZRUDRaISJIJ0NQKScgJiBCMzBQJCRMIDxBQDQ+Ci1NJkxIN01CLz4jVEAtOiEwPSBKND0zMC9JI0ZMJVUgTCAmV0QvXFEwSyJcWCdaIT0gI1kkQT8gSEMlViQ0Ci1NVTAjNCQ6UCo7UTRIJylcQkFQSyImSkhAQ1FINCVBNERUQDJBIVcwJkMxTUYpMTQ6R0A/PyQkSD04Ii4pCi1NIkE0PCMxXz8oIFAlSyFLMCkvTDRYUjlGJDMsNlggUC8lWUw8RCEgMyBdWCM+MiJEJ08sPicgUEMoJjxCCi1NSjEtUCVJJC5dUSE8IFQsQClQWUojPDBES0FNTyFVMDwxISUrIEAoOFNBLjggQDwgRVAxPyFYIDtfMCIpCi1NJUZARC8wRz4nVCAyJ0FXWyMnVD8yQVEkKFQsK1sgJk0kKUwiOzEpLyBEMEVRQic0J0pQOERSI1kkVkQpCi1NOVAnLCcqTDo6MUVEKU9cIykwLjMoP0AxNzAgWCklPDpfIF0tKCYwN1YiOFMjPlwiTSAzSyAyMCMwMFFWCi1NKStYLkcgJDMhJEwlUkFLJSEjQEE7UV8rITcwMylATFopOFQ2TEAjTCgvTDUqIiMpKEJcLiggIUYmKyAvCi1NSTAsSSIyVDw3QDBEIFlcODEgPFUiMDQ5UjAjSiZWXCQjMV4sJCs4QjRQMTciTiQ0WFIvNiRQKEE3UD5bCi1NKT40Ql1QTishRDwhLzAnXCQ/XEVOQSkgJktAJzogM0spRkA8WUAiUCAzVCw8MTcxIlIgJUVQKEEoNChECi1NKyItPiRFLDI8QEU8I18gJUdBT1kgIjgpMTBAQSA2PDYgQiM8Jyw4JjQwMDIpRyghWyAmSiU1IERWITsnCi1NJik0LT9QLV8pICghLFBdTyAhKDxNQD0iIVBUITghXjUjPlhGUDBbXyhQWD0zMFhSKDEsQExBIVEjKkgiCi1NOjAgRiVTTC0sIUdOIUA8MFNRQVIhXUBDITE3RyRKRDY3MSxMJC1ANTshQiQkVEwrRjA/JSdeICkkUFg9Ci1NJU8gOCxQMDsiNCA0IkEvWiQjVEJHMFZRKDFMNEBQNEApPVhGMlFEQCA1WDtNIiRbJjFUMyghIkAgW0Q2Ci1NWzErNCVXODRDIiUrIFhEKDohWE8iU0QwSUI7NyI6MDlSQCRLIVs8LkgyMVQkOzwwPzEiUSZeQCEqMF5JCi1NKDU8IVBQWl0iWDA3KEE9JCNeXDVFUCpPKSJMRCNBSzQkVzg/WDA4NyVSSEJGUFpBKSgoLU1QWU4hQlA4Ci1NJjAlIyU7OC5FUiooKCtEOlogN1gjNixFTCFPVic5MEI9MFAtIUA4NCFRJS4mSkg8WkIxKyBDKCRXQiZQCi1NIk5IODwhV0chI0xCPkEkXiE7MChZQVpVKCk0LjcwTkgkRSwhUFBXSCFCUD1HUUVNI1xUPykgJSEkOiAmCi1NP0IvQiA3LD5bUDM4KFE4I1kwPEwpMTA0XCE1KCVYRDAzQS4jIzkoPyhAQTshWVw8XlIrTiZCRDE1QFdHCi1NIiFQQk0wQzAmPiwiJ1AiRCVNVDJeIVtCIiUkJk8gWyooNTQsL1BXMyIvUDsoMVEsJC84L1hQLVonQSRFCi1NOyFYICAjVDc9UipGJ0EwQykhSFsjMkgnUiAtWSNRMDlPQTdDIV4wRUowO0EiVVwiMCEqJiQtVCdVUTtUCi1NIk1IQk1QTEwiI0AnU0IoXSMhOCInIFFbKSpUNU0gVzIkU1gsPUFUUCBGJDVEQjtOKUQ8NicgPUEgICQjCi1NVCEtUyJeIENdQC5bJDI8KyAwLkohJUA1RFE0KyExSDcwQD5VKFRQQSshPSkoViQwWzEjLSBEPDBCUFZVCi1NKFVMI0YgSiUlMVgjUDE8WSJTUDc1MiNAITQkISIyLTchLUQtKDI2WSVCTDwkQUIsJENARVpRMFooQEgrCi1NW1IzMCdeIC1VIENNIltAIDRRLiMkISgoIDBSVygnWDgoQDVSIUVIP1AhNSogXkA8RzAuWiMiPENBUUA/Ci1NIUY4PCpBLiQlMlgoSEI4SCAoJCNOIU1bIyE8KVwwISQiJEQ3IVE7MCdWODg2MiQmJE0sICoyNlsgTzA0Ci1NK0ElQyYhTCMvIUxdIDdUNScyJSwlSVA/OiE3WClNVC9bUV01KUs0NS5CMj4pNFQxSVBTUylHLCtbMC5ICi1NIissJiZSLDskMzgsQUBZOCVCLDMvUFkmIyQ8QExQXCAjSjw3UTE+UScsTCsyUTQvIDUwKyAxITUoIywqCi1NIiEiVCRaVDVSUF9XKUlELDUhVyIgTigxVDA9XSU2LCE5IiFIIEFUI0pQXkkkVSQ9WUIsViUkOCdJQihaCi1NKDVAKVRRPjkhOThAX1FbOCRXIDc1QDxYIiBUIzQgQTAoWEBARCE6KCEvMCpOIEYtIVxUIihRMjIiISgqCi1NWDFEWSZXTDReIVciITZUJSYhIDcgWCwxUVBcRSMkMC8pUFdMI1AwK15AQ0cnRSwwL1BaIidLPDdeUCgkCi1NI15MLlkwJjsmSzQ9REAtPyYvVCkgQjdNJVQ0JzZQRjwhKFA+WFIkLiYoOCk1UDJVKTkoQUchT0QlRlg2Ci1NXyI6PyM9LEYnIUlVIU88LEhBTzgiLlQ8R1EzVChTXDA9IC9NIVIsMldBTTAmQTwqUjIkMShNTDoqMEE7Ci1NJ1ZEJ05CKjkiXkgvJUEqICdCXERDIU1MJ1ggIzIhUTciNlwjRzE6Kig6XEJCUDpaJl8gM1EwMkklTzgxCi1NQFInLiVHVEMwMC9GJ1gsOD4wLSAjXFwsRTFFIiIuXEVSQTYwITBUPSggViIlSDwiXFBaSCYxIDxcUUQqCi1NIUlULTdSL1YnS0A3ICImRiQ0RDIkUTg/JUlAOV9QKiMjJjAnQjImMyA6MDlOQU0pIl1QOTghQyolJygkCi1NQlI7OSAyUCMoIVgkJ1dQOjgxSVokP0A5PUBNUSU1UC9bMTsgIDpcPjlALSkiWUAkIiFYRCkqWEcgUEA1Ci1NIiU8MjFAIVEnKDAtLiIpPiQgVCcsMUgtJkIkNi1QLDskTjBCRlIuSiEnJCIrMFc/JCZUL09ASUQlUEAnCi1NVUFHIyEsQDhGMEhbJStIMUpAKEYiTUA2UyI4UiEjMC0mUUMiKD1YPVNAWiEnMzAkWSE+Rik0MDVNQEtTCi1NKCxQLzshNy4gJkQrVEI1MyAoSCY9QVlMKUVMRjcwWEIgRDg5VUA0TSdDVCIkQEZcIzNMI01AVUAkTTw9Ci1NJEI6KSk/KCchIS9LIlkwMiEwWSQkTDw6IFFVJiQnXEIzQV87IUYwKEQgPDIiRSguMzIuKCglUD49IjQqCi1NKUwgOylRQzMoUVAhN0BWOCFcICMgITlTJDUsKzRCIUAgXDwnMkElQyhCTD1SQFlEJjRQMkQhRywgQlgpCi1NNDIsSSI5WDQnQTIrJj1AKTVBITgpMzg3LTBRIiNRNC1GQCAzJiw0Oz8hQ0EgLiw1UkI4USQmQCImQUheCi1NIkwgJS5BIi0iICA2RjE8KyRCQCpQUEwjKTEwRFpCNUIhQlQjTkBTTyNGTEUpQSk3KUNYMypQRyYmPDRACi1NSzEkTCMmKCA3IFFBKStcIzlCLzAmXDAgNkEvTyQrMDRYISxYJlg0JkNQN1AmWExCTzFMXSZKKClUICheCi1NJiIsNVxAI0EhRlArQVA0QilKVCVWUEg2I044KU0yKCIjNkRFUTBcUyA9NDhVUiJeJTRcNUlBSUIkMVAhCi1NI1BeTiBWLD9HUUkhIFkoKTogQTUnJyxEPiE5Myk+VChOMFYwI1IkRkhRPDYlNVw4UkAjPidfJEUyUDgnCi1NJyssJDlBLVIiPkA7NEE7VShRNERRMDgmKVBAPTIhUismPkwjL1FCXCNLRCFCQD01ICI0MVAwTkYlL1g+Ci1NVSItPSY6KChFMUNMKDNYKFRQPkAiWFBATkA3LiY8PC8lIDA+IDdUIkMwXUooPiBCODI7SCVFRCtVIUlJCi1NJU8gJihAQVUiMFw5LFFZTCAwRDUoITNZICQsQisgQjomMDQzXkBJRyQ1JDg8QFxLKThcL1ohVkQjXUwpCi1NO1EiLigiTCogMjVOJCsoMCsxODghVVxCVkIkJCFQICFcQUgnIkhENyRRQV4pMVg8MVAvPCUhUDVWMi0pCi1NJkosKkAhUEwoPSAwVFBCJydYPDMjQC1fJS8gOUZQI0EmSFA7OFA0NSEwJDxLQDBAJlBQODFCMVwgISA4Ci1NKCFEPiZbMDAiMigwJUVMNzcyOlYlKyQwI0BZIyRXUDZPMSgoJEc8NjlBXUopMUAlPTEiSicwRCFBUCtCCi1NI1ZEMV1BIk8nOUgiJDAnOCZBVEYvUUoyIylIPFYxV04mSTgnP1I0VSZERD8mQTwgKTw0KjMhVlcnNVBCCi1NMyFAWiNXVCA8IDJZJTcsKjRQRj4lVEwpVFAzLiQhRC9VQE1cIEQ4ND4iIDIhI0BEIDAwKSBFSD0kMEAxCi1NJlU4LSxQJ0kgSSg9MzFANyMqSCpMMjU0IUEoIFxARDMjMUQjIlEyOiMhJDhRMCA4ITMgQF4wMyEiVTRGCi1NTFIuKSNMPC8gMFIsITAsNFUhW1YkOlwwIVA4XScjNDReMi8kJCxUQlFAXU8pTVg5P1BBNCZDXCohQTRTCi1NIj1YMyYgPS0hT0QsK1E4LClLWCZdUS5fIllMODBAR0gmUywsXUA+MiFVUDcpIiwxIjdQQD1QUjkhK0grCi1NJ0EsNCcvJDRKITwhIyFcLlAgV1YnSUAmIkAqSCk9KEZLMDIpJChQIz8yLFQpQ1AtIVApTCY7NCNLMidWCi1NIDxYLVBRR14hPERGPTFULyczMDZPMFtLKFRYJD4hRScpTyw1R1ItOCNXVEREMDc4IlwkOy4wSiUlR0wpCi1NJkFKOiIzICVaIEc7KT88PSohWTsoLlwrVjArTydOIDxaQShUIkxENFswSFklUyQqWSEwQSRGXEJTQF9OCi1NIi00Qk8iJl4gQEw7KCBLLCQrJEApQFs0KC4gOSgxVlAmJFwtRTIwJigoSEE5UCBdKF08PSRAX0woRzxGCi1NSUEgISdfTEZEMjVFIzNcMTowQEwiMyhGREFAQiYlOEFCUCknJCE8KEUiIyYpMVxAQyIvWyFDUCxaQVQpCi1NKSs0IFlRWywpNSwgNFEqKyQtJDUoIFtDJE8oJlsgRUYhVTQtXkFAPSdJRCAjQiIoIkIwNzVRMSAlO0ghCi1NQFE6KCMpOCc1MEZNJ1ggNlRBQSAkSiw7KyE2Ric1RERJMVpEIzxMKk5ROUUgTEQoITBJPyczIDNCISxHCi1NKEcsMDxSOyojW1glLzBMMyFFOCAjIiYmJSNIQFAhQTgkQSBELzAyOickIDJcMC1XISBUMl5CJV8mRzA3Ci1NNyFRXycxREYnQjoqIEw0L0ZALD8hN0ApNzFYOydNWCROIFIkJ1Y8QUkhVz0hUkxCXyE4OSIiQCBPMEQsCi1NJidcIFZBQCklM1AgIDAjIiJKOEUvUSU5I0EsLTFSMyQkT1hBQ1I7WCE8WCgmMFc3IjBQIzIxLjgjXkQ3Ci1NP0FIQSNUQDxJMi1LKU04QjchWSEpLlA/VDBCPyVPIC5EUjIpKU1QQ1hRRigoLkRCPzFIQCVdMC9NQjI+Ci1NJFFUNj4gIC0lQ0woTjEjTiU/WDg5QCZSISw0PSkwRVolQEgyOUBLXCEgRDEhIFAxIUMsJ1IxRy8kVCw9Ci1NVFAxKiRYNCAlUEQ9JUc8PCtQRyclRDwhKTAySiFWTCFKUTdfISNELjcgKEwpQjQ0QiFXICcwPEJZUTVVCi1NIEhQNz8yNlsjRkw5XyA7QCQsSClXICtWJkQsRVAwUiUpJlRGSEFYOShIRCwoQSA0IzEwK0RRUSIgI1wuCi1NNVEhRiFJTDQ6UjwhJjA0QisgLF4mLFA0WjBPMCRaQD1AIVdFIU5AKkQhQl8kPzwgXFIiLCNBKENIIi4kCi1NJCQsJjRCNVcoVUA0ISE/JChZVDdYQSdNIDxYIloxUVYmOCA7WFFDKyFSJCNJIDBLIDI0IU5RSDcgJCQuCi1NUSEjXyBOXEVAUignJTggQlMhWSQoNVQwRkFbMSkmNDw0QEEgIyY0MEpRPUIkTDAkKkEqWCcjXCVUICo1Ci1NKTQoMDQyLVIgSSApKEEyUCFUXDBeUiMiKCdEKzEhM1olJjA9R0BLTSg4KD88MThKI1hERVcwRF4gQiQjCi1NOTFKSChAKC5dQEFUJF4kKUogSSQgXlAqQzA5RiZcRD9JMSosIFokQjFSMFghQUBCNTE4QCgkKEVDMTVOCi1NJEA0RkFSLE0kX0AnIVEjWSg8NCIuQjtPJjYwIzAiJjAgVDhDMVFaUCVRLCE/MEsrJ11EQFNAL0MlSkQ4Ci1NUkAyXiRYXDRRIUwwIDogMlYxPFghMSQ9PzA3OyBUPCdCITtWJUckLFIgSCwlKCAlTSBdISQsIDpIQEU0Ci1NJ0ssRCogMkEiKDQtKFFdUigrUEZIUCZXJTwgPzBROzwhLFRFQEFaRyVVJEM4MTY1IFxIJEkgJVQkVCApCi1NKiI2XiheOCQ/UitPJSZIJFMgRyYoOiRGUEIgKShBMD1YUF8uKT1MRkwgN18oI0gvS1E9KylDSDlNMiEoCi1NJCg4PlpAQiopISw4RVEjXiJOSCxRUFdAJzVMODNQQTwkLUgoUkA+VyBHLDE7QThaIzU0LihRJFkoNigqCi1NXkFEUydWSDsxMTs3JkBYQUshPkkiWkQiIiBcLiUmTENVUVcwIjpcKllCNVooQERGMiFAXCBSMEAtICghCi1NIEhIQSYgUD8oSCQrWDAyKiEvLD5TIV5SJUAgPDIwXTEpPVwpKjArVCk/UEUhMEwkJlVQK0pQN0smLiw8Ci1NRUFVJydeWCVVIDc+IiNMRjwyNkYnPUhGQ1ImTSZUXCkrQSteKSlQJlMyODcjUDAyOSI7NSBaWCM4MEs9Ci1NJTQ8ICNQKDAjQyA2XUAlPyAgICU8MV08JEUgPzRBViAlSjgsMDA9OyAvJCU4ISdKIyI4P0swLE0iNlQ8Ci1NU0ElSyc8XEJcQSVGIjksIkwhO0soIygtKDIqICQ1NDVDUE9VIDZQL0siIjUkKDxASiE5PCVaPCdIUVReCi1NKDFAKSYiNjEhNyxAJFBIIiNSRCMpIThUIUJQNV1AI10iJDA8UDFCJyhIWEUkQFAkJkNIIzZRLFkgPTgmCi1NKCBdKiM8WDZZMCEkIi0wRjtAOzEmRDRFUlBRXSA3JEQ0UUwvJk4oJ1NRIz8hXEg5UyFfLSI4QCkqMVQzCi1NIDwkIFJAXyAgPkg0VkIpICcmJDNFIidAJVBQNUkxLDslXSAxJ1FCUyVOWCVdIVc2IzRAOFdBQSUgOlAnCi1NNCEvUyYiSCk9MTcoIVVEQjkiNUQnQzgvKjI1WyJEMD40IS8iJ08wNUwxMEQkIChDWEAkLSdfVC1fMiBJCi1NJiUgKzJRWCAjNzg/UkFWMClHLEAjID8iJV5YLUMiL04oLDAlKSIjIykmJC5EIUtJKUU0MSUgPk8oNyQ3Ci1NVFFeSiQgMDRIMFw1KSlcQ0IyN0gnI0AnSjBIKSNGLDkxIEFZIjJENjVCJ1QlMEQ7RCBRKyFbSERZMSo6Ci1NJTBYOUMxSCcoNEhCMVIgVSBfWCAhIVQ7IUU8MTJBNFciSFAtRUAjOChARENOQi8gKTQ8KSsgIyklKzw3Ci1NIUE2TyM+UCckUCI0JFlINkVQVTciRVgxKFE8SickRCMtQCRQJSogMyJCJksjUVw5SzA8MidbRDdXMDNECi1NKEswRFwwVT4mXCwyRCE4XCNETCgvUCY2JlA0OV9COk4lIzwkNlFOQSU0QERXICldIl08MiBAQkUoOEA5Ci1NVCIgPSZVPDZHMjQ7ICc8MSZSKC8iO1xEVjExXSYkTDlOMDZeJ0tAICQxXyUhRTwwWlIuQCc7JCpZISoxCi1NISVELFoiNz8iLlREMjI6RiZRKC4jIFdBKCg8Lj1CJSggW0A5KTA8IikoMCkxMV1KKTk8MjNQLTQnQVgrCi1NI0ArKCZSNDM4QVYsIFRUITEyJjYlUUw+SUAiJiNfUEBAIEhCIzIkLUdAQUQjUigkQ1FYSSJbNDJHQVw0Ci1NIlpYLj5BQTYmXzgoV0FTNyZfMCBXICctJDI0OjowVF8nPzQtUzEhMyQ2MCdPUCFAJE9UMzowPkMhTCg2Ci1NSyBKIiA+IDVEMiFTKStcNERRMUglPTQhOEFfSyFYTEQtQTM6JjQ0LC9AQ1YnNTQ3UyFaUCRNJEVXQjsyCi1NIUw4IE1QUC4oSDwlOEA6QCZFVDQxMUhNITkkOScwTk0mKSwxUzBGKSgrXCxJQSlIKStUKz1ARE8lNkA8Ci1NI1BHUCdSXDxPQSEnIUpYLkVQWiYoQiQ+MUBOSSEhID41QEsjJkZYOE5SLiclWVw1UyE1XSYqJCZEQjQiCi1NIDxUL0VBJSooQVgqIEBdRilBMDsmUCI2Ji08PiBAVFMhMyA/UCE9NCZOUDJfIEBbIzAoLj4gMlUgJyw2Ci1NJCIhICMuUCE9QixTKEM4M01BMEIkXjA2MEFKOiZfMEUvMFBJI04kL0ghLUQnLiw6SCA0Iik4OERfUjlGCi1NKU0kLVtSJ18iNEA6WzExQicnVCxDUFUmKDY0KU9AOFMjTVArKkIsWyVVID5GUTpdJzNMO1QwKEAoVCBACi1NU1FVNiQ9TCgrQFcyIUJEO1ZBOl4hXFAlUlA6RCU5PCIuQCw3IkEoLCIhLEckSiw8RiA4KSkuWD08USNLCi1NI1FARjJBSzgoNSAvRyFPNSVGMEU4UCw2JzJYRVAwIzsnKEwoRVBEJyg9VDREIV8iJTdEOExBTyEgQ0wrCi1NOiIhMSchKEYvMF0gJF0oKk5AOCQoVVghQlBWMCMvJChYITdAIVswNF9BMyMnM1wvK1IrNyE2LDMgUjpXCi1NIClcJltQRyYlKVg/XzA7NyBIRDJWUTgkJVIoP0UxXEojUjAjTjAhOyUpJCIyQiJRITMsLCAxNSEiRiAiCi1NXSBaRiRcRC06ITdBIlZUMFkgUEUhQyAwRSI5VyZIMDVKIUlcIFZMK0dANV8kWigpTTBZXCIoLDZVQT45Ci1NJiYsRSRRJTkoOEgkXlFATSg+KCAqISlAJUBIRjBQITgjNiQ3PkIlPSUhPD8oMjE3JkksKjcxMj0hLDAqCi1NKUA3RyBGRDc3IiNWIDpQKUFSLi4kTFQiJUAyPiheKEA6UjUqJkEsJCVRSjQhSSAqPkBSXSdUQDo8QVZCCi1NIlokMS9CM1QgOyg9N1ApRyhWUDQuQVtLIkZILzohLFwnSlwoS1IlXCUrKCYkIiMlJCpcPFtBQzsnPVhACi1NU0FfQCIhNCImUS5JJzswJUchMjsgPigwX1IuVSdTXDk2QD0gI0xQMzshMDMkMDw6RVAzQigqNC0nUFkhCi1NJkYoO0MyKTUjPkguVDEgUiAjUDc7QVxLKDdcIjQhJ0gkIEgtMyFXISZOJCpCMFEwKDJAOE4wT0MmU0hECi1NJCA9PSMjSDJeUUBMI1JUJCUgLFYoMyg5IiA+ISZFJEIpUCZPJjA0PEshTyEhLTg6KVIuLCQ3LDQiISRHCi1NJDsgNSdAMEgoLjAiXEBQXyA2PCI+QTA6JzBcJyNQMVIlUzQgLSA4MighOEEvME9BI1tMMD9AMS4iOzQsCi1NTkBcQCc4KDpPIFFPI0RQNz9QQUYhKUwvXUBOXiVBICQrQVo/KSsoIUgxJVwlUUgsNDFfNyhDKDFVQVJaCi1NIi1IKihSNyspR0QqIDBcIyNMPDEwMDEjJkxQPDFQLCgoRzg5UVA8JCRWMDlYQDpOJE4gJlIxLVkpP1AhCi1NXSIpWCRQODFTMFQ9IkQ8JzpCJzMlWjw3S1A1MCNSQDdcMUErIixALThQW0spRkgiJDInViRcXDI6MjcyCi1NJl0gJT4gNUkiXUREUiFcNyAuQDtcQDQoJFwwMjNBRjYpOigzQDBSTCMoNCo7ISpAJ0MwM1pQNk0oUTAhCi1NJjAiMCU9VC9YQTlSIipQKyVCOTogWFguPyE2XSgwXEA0MEpWI1ZIISwhRCYhIDBDXFBBPCNGTCk5QD06Ci1NIDpIKzpAPkEjNkw5TCAjVSYtMDZcUEVWKTwoOE8wLlcgKTgoODFUVSVUWCVAQEsrIDMsRFshOkolRiQlCi1NLlBSWiIgXEZcQUBAIU1IMkUwU0EgXDhBN1IqXiAnNDgxMENCJC1EQihQVTwgSyw3NjEmOSI+QCtNMFxJCi1NIz8gJVlBOUAmR1RDSUFZNyFDREMuMVpYIVtALkhBWlYlKUQ0QjBTRSg2PCpXUEU7Jz1UIS5RRE8nMDQpCi1NQiAuTyM+XCdBUShJKExcQy1BUCQhXEg4IzEgTyhDNCldUFkgKT1ENi1RQ1MpKFgvKUBYUCNZIDwxMEdTCi1NKT4wI1gwQ0YlSjwoLSA7NCctREVRMVlPJ104OEtQQlEpSFhFVkAtVCJHNC5XIE03IidcNTMhUl4oUCQ9Ci1NJTAoIykyLCs8UU9DKFZIISUgWSkkViwnPFA/XCBFTDQhIVAnJlc8PighJUEpSEQ0Q0E7OShVJC4+MUEqCi1NI19QJFlQPzcpPFguKiEwXCM9KEIwUV8uJF1cQi0xSkEjIEguTjFRLCRRLDIiUSEnIUosQ0ZSLz4hNDArCi1NNkFNLyUwOC1BMiZUJlcwRDswWCMnITAxJ1I7TidHOCA6ME4rJzcoK0FAXjQoWzg6QjEzPCM+LCQ3MTFCCi1NJixUOzdAWykpMEBGO1EqWycyQEVUQU0+I11IMCNAX0UhKjgwUCBFXigwOCwhIDVTJjwoQ1JRVFcnWCQyCi1NRFEsKiBIPDguIFMmJElEJVMyKjwkT1QpNlA2SCgoPCMiIjpLKCU0RCEgVFYiTVgsLFExKiNIKDNBMDgiCi1NIkMsQ1FCMT8oSUQpTFEhViJfODMkIVpGKEQwP0cgWU8nNzRDQjAqOydHWDY3UEM1JF4oNTdSLiMjNFghCi1NSUBeOiZPODQ7IDMgIVpUIT1QSyUgXjAwLlA1OyRdMD1dIC5MIi88QiciLUMoRkA4VUBKUSdfLDRYISUiCi1NJlcsLitRTzkhT1QgOCFQOCEtWCM+UihEIjIgMzIgQkUhODg+PDBPQSgiPDlAIU5GIDJMPD8wOjMoISA/Ci1NSDA6JiY/LDxRQTA6KTlURl0gTkEpPTAlSTBEPic0KCQ0IUc1JkdIKFVAKCUkOygxLlFdVCJUTDZFQFdeCi1NJ0c0KjZBTygpJlA3TzAwLCAtRCNVITlZKFdIJF5RSU4iWlQ4M1BIUyIvJEciUCAgJlVcLlRAVlMpK0Q8Ci1NIEFeISc1JDUtMV5MICNEMlQhQkQgUUw0LSI5JyBAKEBMMUctIiRUQShBK1clQ1w7UyBKRiY8MDUyMC9aCi1NJyEsQVVRQ08lM0g1OCAhTyEmVD0uUChcIkUoPFNAWTgmOygmMDEuTiFYXD9LIV5QIC1MNCQyOjshK0AxCi1NKVAtSCRYNEVOQUAsJCNAIF1RTU4hS0AtOlBZNSBXUC0gIF0iKUE4RVNQUFohJEAqKUFeLSVAUEQoUSpWCi1NJlo8MlYgI1gmVSAgIzEiTyA4JCpAQExbJ1MsOVsyMEAmOyxGSCEgUyUwIDFYQV9KKSJUPDhCOCslOTgsCi1NSlAzVyYoQCBBQENWISkkN09QKVUiPlQiLlAwUiNeLDgyUT9dI11MPjtRQV0kMSghXiBAWiQmUCAjICYsCi1NKCZAOlBRMlMhW1AoRzE/Myc2OEFKMDNbJyhAMFRAUCcnITQ8UlE7NiFVUCQzMiBFICREMTYgKDMlQSQzCi1NL1ItRyY4JDhUIDJPJE88JE8iMjUhWSwyJUIiIiEuMEQmQENYJig0LU0hTFkoPFw0VkIpLCclXCI2UjNYCi1NJyggNU5SO04jViQ7ODAoMSg2VCpQIT1EKFUgJzQgKD0oJjwwLCBFUiNBLCEjMio6KSkoKTIgPTogLiQ9Ci1NJiBFLSFYTCFKQEArIzBEPysxQS0oPUQ1WFBARSBITDpRMDwmJVE4QjdQXFAhV1QzVFFSIyIiPDE0MTdNCi1NIDs0Qk8wVE4lOiA/XSBFTSNNVDJLQTNLJz0oIzAwLFwkLVg3TTA+NyZSRC0gUjdXISFcPy0yKlInS1AsCi1NN1A+NSVFLERCQicmJjlEQVBQSDUjKkQ6IjBdQCVCVCMiIiwhIkIwJT8iJCAjOEhATUFEJyk0MC4mIiZGCi1NJVg0Ii8wLlUoLiA7WlImTSJILDknMidTJz0oIyEgITkiTig8IDFKRykwWD4/UDgyITk0QDVAWUglLkAyCi1NLEIqNChTNENSUTdYIjNMQyghVFgoWEw1LTFeLyEtLCRGMiNZKS4sQkIwN1YgWCwyNEFcKyk3WCBUQV1dCi1NJS8sQU4iJzQjTFw7V1E5UCNWLDQxQSszKCYsJVpRWy4jIkg7KiBHIiVHWCBdMDEwJVlcKCIgVFMnUzw7Ci1NNDFYSCFNKDE2IVlYIydIKVQhIygjICBBVUA+KSdAIC9cIS4nJyU0OixAISEnXSA1T1BQWyM6UD84IFIqCi1NKEEkRiEwI1YjMDw/UlBIJCIwLDQiQVglJV9cKkBBLUMoVDAvP1IjISYzOCtTIFwkIVY0KzIxNkUoM0AhCi1NPUFYKSIhMDA5UUdIJVcsMDAxVCMlLzguXzFUWSQlQC9WUUgtIlo4OUshXCYmTlAsJEIuVyNdMCNXIixECi1NJzUwKT9AT04mLFQvS0EtNSYhTCo2IjstISBYK1lCK1sjSkgwJlBRRyNWKCo+QFtXKTJEJE8wJiogUFwzCi1NWUFdSyRWOCwuUT4iKFxYOz1RT0MlOFgzPTEwWyg6WCpRMjBOI0MsKzRRL0UpIThDI1BFJiQpMEI7QCA/Ci1NJkwsKUUxVzYgQSA3RzBXISREWDUpUUhBJC84MiUwPigiKDgjUiBUMCc+ODdSITIrKTNMKDJCIjokJFQiCi1NV1IvJyQ7ND0xMUk5IkRMOE9BW0MnTlAqIyAnPidXXCo9USpJISkgNSUxNiohR1wqJFFHNyFaUEFEMTVaCi1NJVkwPSlSKU8hK0AzUzExUiBGJEMhQScoISg0KCxQIEwgXkRETDIgXiAsMCVbMCFRIz40NyFBSDwlWDAqCi1NNCBXTSBKIDZSQiosIypULzIhIjIgPiAvOSBZVCkjSDEwIEdeJE5YMlchNz8oWFQ5JFA2PyUiUDQ4UE9QCi1NIkNMNUFBVTkiMiwrQiFVUyJKQDpYIEE8IDk4K1YhMyIiQiA6WjEmKiJLUEJJUF48IygoOT1QRjwnTzxACi1NQSBDIicsVEUvQVcqJz1EMzkwXiQlL0QvMCBAJShCQEFNQCFcITk8JjpRM1gnQygmVzBIVScvOCBYMi8mCi1NJ0JYIFEwSTgpM0w7RUBELihQUCFMMCcqJ0xMQkAgSUYjLyg/RlFJPCVEPDQhIVQ3J1RARCUxSEgnTEAgCi1NJyInNyBAVCs2QVVBIjhIPDMxWFooTVggISA7UCQnJCA6UisrJUw0QDhQWzAmXjBBXEE5QSFbUEBDMUMnCi1NJEdEMyZRRzUhVTA7VCBMSSQ1JDE3MTI7JyAsICwiMUknSjA7VFBMQycgREI2UjgwKTo8KUwwSCEkMlhCCi1NWkE9VSNBLEUwUStTJi5QOFohNUYoVjgoVEFePSQpKC4mQUNDISYgQzYwJlAoODBGPSAmWyQ/ODM7MC0tCi1NJVQ4M1ExXCwpMkBDTjIjIiciUCA/QDooISlAREExKE4kP0gjK0FQNyFdQDE6UTlRJzY4IkFBPU8pTkxBCi1NOUI4XydGSCElMUcmJzsgI0EwVDgnWEgsNTBZLSY0OCNCMFkpJCRUMlEhSDspSCQxIDAxQygmNCJHMUs/Ci1NIEUoITgwNjQjM0w2KFFeNSEpPDBEUCYpJiVYIVAxPEsjVCwlRCBSRCAsVCtTUUA7ICtQPipSLichNFwnCi1NOEA7XygsKCFPICJCIjxULkswVDoiTDQgWVFIKCZRJDkmQi0hIFpEJEVRWiclISg1KSItOihNREZJUC5VCi1NIkdII0MyNjYlKVwnITFRSiQsLC5NIFdXKSQoOTEwTkQjKlQyXEFKXyNGSDRLMTVHKCpIISIiLDciSyglCi1NV1FKPiFBNCpHUjBFJScsREFQL1UoOzw9QkFSPiJANDRXUFU4I1IwKk8xNSgpQyAtVyBESSdZXDVNMT1KCi1NIF5EIFIxPiwkUjw0RjEsKyMzTEY/QT0gKCJcIiUhLDwkO1BGLlA1LSJXPD09IVE2IDI8K1MhIFEpPVQsCi1NUiElJyY4ID5EIi40KCtcOVgwUTQlMzA/RlA9KyZBSDs+QVYiIFcsMExQK1sjX1QiTSFXQSQ6TComUiNbCi1NIiEkNEoyMkkmIzg8QyE0LCQhJC5IQEJGJDJUMSxBQSIkL0ggUVAvXSlKTDRfUT1GKFQsO0wwVColKTgmCi1NIDI2NiFWICVVQjQlJ1UwLTtBKCYlMDhHICIgOCQ1WC1ZIFVSITRILEJBOl8lSkA6Q0BURiJZQCZPQU1JCi1NJT8wNi0xWTkhVTg9MyFLWiNTVDkjQTVHIkwgIlFQL0woQDAwXEI5XihDQCQhUFEuIE48I1FQKkwnUlg1Ci1NK0E/KSdHRCNeMFFWIUowNydRNUsmPDw+XEBHIiMrWDMjMEBIITVYL01BXzchSiQpRiFNNSdTVDwmMShWCi1NJllQOS9QVi4oPTAsP1FUKyU0VCQtICZDIkNMJT9BRiUpSzw3OyI6NSRXKD1eIDQ4IFM4MlJRVFIpNzwlCi1NREIuRSlOLCVdMTsqJURINzdAVl4lMlw4OyAwSCJOLCI3MC9dJDcgJkoxK0YpOFghL1BEMygsUC1WUCBVCi1NJVpERjxRIE4pM1w/PTBCTyVPPEBfQiBMJFpQP1IyLVEiOSBBLEFDJiYsREQjUSg/KU9YJFAxO0IhVjBDCi1NUFIsNSEzLDVFQiNNJys0Q0MiKlUjTUBDPkE8MihAPEEsUTQ2IjFUKVBQNS4lMTAxUUE7TigyMDVPIjEuCi1NKUQgOkBAPEwmQlgmQ1I3IiAoPDxfQTdaJik8PkUhTkgjMSQgTjBZVyVcKClPUipMJSQgLltBVUwoNzAqCi1NPzA5OCU4TEYrUCRUKSo8QicwUCUnJzA8QUAgQyk2VDMvUVRGJE5ULSBROF0kRkhBMkBCMCBcMD84MEFBCi1NIE1QNkgiLUogVUAqKjApISg0XDVFQT0vKCw8K10hI1ggVTQsW1FMJigrKDZHUUlDKSJIJ0sgXDYnKVgqCi1NUFA4SCFITCA9UCYiIkBMP18wVEogS1QsVDArJihLNDdeUjtJKE1IP1tCIlclX0hGPVErViVJJEE5UVtaCi1NJy5ELUAwUSchPjA2PjBZTiVWRDQ7ITVIIj0sOjpSIi8oWCAzPFFcUyVIICtXUTomJU5QJ0MgVUsoJSgmCi1NQFIhUSk8WDY7MTEpKSZIRlZARiEgWiAtX0IjVSUjJD04MjokKUBUIzIgIDonLDAqLyFTLSElSD1MMU4oCi1NJSpEQUogTCApPjwuIlBALCRdWCo8MFcqITRcJzExIVwjRzAjQFA1KCU6XCNfITlfKDIsI1giIFopLCwsCi1NOyFHSiBVQDg7QUBSI1RURDQiLSsiMlBDVUFbICMyWEJDMF0kIyhIQCNAXF0hI0wpQkFHQic3KCVbUD8yCi1NJS9cJE5RJ1UhICxCVDBOOiUsMCddUFtUKTNIQVggNComJixAU0FXViBEQEE6QjhWJEUkKSRAXFMlPCgpCi1NQjBYRCJbLD0nMVUlJzYwQ1owPFAoNyg7S1IqUCFJUERLQEEoJio4JEhAWzgkOyAqRzBaIyQlUCM0IFxFCi1NIFxUQVwgIksjQUgnJUEiIideQDElQCogIUcwQ08wPl8nRiA2NyFeNSc9SDI/ISUgJidINDIhRTkkIzw2Ci1NNjA7UiJJMDhJQidaKEwgJzghX0sjVlgyRSEjJCFdNDFBUUw8Il0sQVohIlgnXkQ8WiImRyBVIDIzQSQyCi1NITFMJlwhUkgmJCA2WSFERCBLPClDIEk/IjE4MCwhOU0jVSA2XDEtUydFQDU/UVBDIi5MPjsgP1UoWkwrCi1NOSIoNCRJKEA9IEU7JkUsIVkxXiknSzQkSVAvNSFcWDBNMEQiJTg0KyswKkQkWlwxSFFLVCIiNDxbUE4kCi1NJExIPDJRXkslXlAvPFBWXSEgLCVOUV5GJCFELkpCNEYiWFArVFAuUChLREBRIEM9KERUQlswJ1chQzA9Ci1NJyI4IyZYNEM/QipfICVILDIhNyEhODwvRyIqQiRCIC1TMFhSJERYQyAxMz4oJCxBRyItWSkpQD5dUT9FCi1NJzU0QlFQUlgmViAsJlBWVCMsREVbMjI9ITVYQlwgWFcoM0QvUkAgLCBBKEQuMSshIE9EMywxRy4mRSw1Ci1NWTE4JSBMXDsyIDFKISM4QjchJFsnIjBBVyExSSFDUEI4IV4zJT8wI0NBXTYoQyQ1KUBROylENClPIEBdCi1NKS4gRiIwWSsiWEAjRDEjKSNQXDpaUUszJTEgRicyMjEkLUA1KVBXLSVWSCIgMFI4IzlYITZBIFYiTCA3Ci1NIVBSTyIuLDQkMTRQJkw4Rk9AQ0EnMEg5X1BDPSk/QC8yUjhZKDlQLlVRPlEjXjgoRyBBQSRHJDo1UiU1Ci1NJDlAMUgiJUMoIDxBLkBRUCJQVEFAQT0rKTlULF1QNiMgUSBDUiBdNSIkNEAmIV88JSZYI18yJDQpT0wgCi1NUVE/VCQ8UC0vISU/IT1cQ1xQXlwkQUQxTjI5ViZcICNRQjhaIjYoOEIiIykjO0guNlEvKiAiVDU7IV9ZCi1NJi5AOCFQWl0nWjRASlFROSInMC1XIDJfJENMIitQJ18lREw2RlFWICY7VEJZUEIjISQgKF4wP1EhJlQiCi1NL0IrICMsJCo+MFVAIiJIPykhJjkhNFQ7USIlPykxUC1fIDE8JTFAIFshVTgkKDRCVUAyTiBCIDspUDk1Ci1NIy1IQFVBP1chN0AgM0IuJiEwREY+MSI+Iz40Ik4gJ0MlMUApN1BKLyA5RCVbQDAzKDNEJzUxPkwjOUxECi1NIFAuMiQ0IChCMURIJy40J1hRLDkoWzw6TEBPVygqMC5bMU1bIVswQD4gNzYkSjhFMDIqJSVAVChSIi4xCi1NIjAsQUUyJiwhKjg+XkIgXShHODpRMCElJlQgPDsiKjohLDRGJjEvPCQ2NCZUQEgkJStIJisiNUEhOUQ5Ci1NKiIyJiEyICBIUEhPJlswQz5RKDAoIExCVVFZJSM3IDpJUUBGIV5cPT8hNkskQVAzTkE5XidPLDIrUC9SCi1NKVAsIyEhVCYnLjRCOzBFPigjTClOIEhLICc4JSNAI0MpKiBGV1BcPCEjLDRPUVtHJDZUQCggJDIiVTxECi1NLUBUPyJLSC41UEcnJzo8Oi9BJCUoUiwzIjBDXSFdRD40USZBJFREL0YgMyEjQVg7U0E4RSUwKCRcMDVDCi1NJltYPl0wNEchTkAsSEIoVSIxXCwqMDpaJk8gIixRVEUkLURDQ0AxPShZWEVQQUhfITVEMVcwVy4jISgtCi1NSkFaOiJXXEEkQjMjJjY0RChQSEwgV1AhVEEoUiY5RC87MCVZIkJIIScgIUMiRyxEWTBCLyU5IDUrUFBeCi1NJl1MQVMxLCIgMVA3OEIxQSM+NCUhQDkiISVQKikhMiEmSFxBVVA4LScjKD87MTNYKDpQIDUyIVEnXSA5Ci1NXzEsUSBRUDYpICc3KEk0PVYhNFQjMFQyLEFYQCVKRC0zMFlTICxcOkkwUDEjVzw3JzA0SiciWCFNQVchCi1NIUBMMSlQIlckVjQ0LSIrRSRJICFXUjglIFs4PkBBOFEjP1QwMEBfMSM/MC8rIDJbJzxMN1RRJFonOTA+Ci1NTyAjRSM3UCZDUUVUIFBYQzohL0kjXUA0TyAmSCBUXEBfUDJeJD0sIl5RT14oM0gnPiEqXCJNPC8hUCBDCi1NJTVcKCUwVyUjL0QyOTIhUCJcPC4sMDAjKTAsL1wwIC8pKyw9MVEyTSE2RCJQUSZfJDs0ICNQQ0olXCA5Ci1NLiFaQyhEQCguITtSI0UoLyFBQEInNVRDLTA0IiUjRC5EQS8sIkAoJFpAJCokQiBEOiBCSSEjOEA6UFErCi1NJTQwKFRBPz4lPiwyXSEiTCgrSCU0IVk2I09IKyQwTjYgPygnJUEzLCg1PC9AISpOJVk4NFkhNCIoLTw7Ci1NNyBdPiVPWDk7MSVcIj04I0tAJiMnTEAhLUBCMiBRNEUtIF46JjYoMjEgQjImVzQlT1FYLihfWDM/MCxHCi1NKU44K0JQNiApPiRERjBfKyBLKEBeMFM4KC80JTghLVghMExCOiImKSlEIEFFUVxRIlQsQTlSNiAoOjA/Ci1NVDFePSUvMD1HMUpJIFdQQ1IxUlklKiw7LEEqPyRDREFPMiRfKClcRUJQUywoV0QwWTBQWCckIEMtQjlECi1NJlpMKEYgVS4kVyAuL0EqICReUCRbUVtPITVAIDRRU0UnVSwiPEAyPSg2SEYiQjMhJUg4Ri8hSyomUFQ5Ci1NWDI4VyVOUDleUF4vKDg4KVgiLl0gK0g/KiAkRyQjWDAjQFsnISgsJ09RICEiRjwuNDEuWSgnOCkuMToyCi1NKFI0JUxARiUjVUglTFBSWihNLDY8MixTISNAQjNATTAkUFQtUEFTKCdXTERKUSwnIzVEQ0dBQCUlPEgrCi1NK1AlJSQ2VD41QFhDJkxIOlAwL1kpUDQ9JkA5QyVGVDdHQV85IUpEPEowNF8kOVArPyBCISgmLC41IF40Ci1NJyNYRiMyMFwhPTBDOSE7JyFXTDBYUFNfJSIwPVRBOEMgJVQmM1FPSiA4ICU+UVQ6IEhAIUMwVFQoI0AlCi1NVCIiWyIrNENcUCdBKFwkQCwwKyEpM1Q9NDBPJyhWWCA/MSdbKC5ENCJSKk8iUTwwKyE/UCVDQCYkUEosCi1NJV9ARVoiIF4kRDgjVTAkKCkrRDw1UFcyJ1swKSUgJDgmVlAwI1EyUikmLCw0UF5MKDFQKjsgTi8gQVw/Ci1NODA1TSNAQDZeMF4iIVM0JDBQMCglOCRERCFONCBJTDk4QjwiJVhQN0pQRlkmLkA6PFImJyQnRC9CQUYpCi1NIjxQRCMiOUYiVzQpRlIjSyFKSEMoUTdeJE5ENDdRQ1gmLDg2QkEuJikhPDg3Ii0kJUhYN1hAUVglPzQqCi1NPUBDKiNSRCohUi5EKTY0JkMgRCghNUA7LSBSQiQmLEYjIS8nKSYkQDpQKUMkQyQ5ISA0XydMXEI9QiAlCi1NJUcoPj8hNTchXyQsJ0E+TyIuQDlbMDA7IjpIMk0gQ08nUCRGNUBWSycoVCY5MVA5Jk9QNTJQUlkiVzwuCi1NRjBSJig1REZAME1LIElMJFBAUSYpJ0A3MiIsQyc2PCggMVVCKCFcNllAMyYpMUAoQSBcOigwIDogQjNHCi1NIFMsRUMxNyYpJjQnIkBQWyJdOEIuUF9II15QPUtCJzsjViQmPyEuTiArTDVWIC0oKC9cRltRKDspITQ9Ci1NS0I5WCJFVCtaMFpGJUQsIV0wWDQiOUBBU0IzUyNKOCpLMVBWJU9MNE5BMFcoQTwpQEEoWihMWD4tIEZTCi1NISZAQFgiITQkU0A0O0ArPCAwQDIjQSooJD9cJlkxUFImKVQ0SSE7NykkWEY4UU9QJSVQPypRVl8gNUhECi1NVVIyTiZLWDFcIF4zKFMoN1YxTUkiMDQmQSIoPCdPIDMsUCJdJCYwKighRT0mL1Q9K0IjVyA/MDwqIS9CCi1NJ0hELTRAMD8jLVRAI1FNOCNUQCI8UCcxJVEkOTJASEQiPlgjIkAkTCVPPCFIISVAIC0kOCRBXV8jSkw8Ci1NJiE6LyM7LClWIjlOJ088ITVRVEsnVUAvIiA9OyUjODYsIisjJ0I8MiJRNVsmSUg6MSFPMyYpKCZTIiVKCi1NJSU8JlIwK1UoQVAmKUA7MSEuMCA6US8jIE88OTNQRyspODw4PlFJSykwVCcmQDo0KCpAOEchJyknSFgqCi1NKTA8XiFbPDBDQVIyKCIgOiwyICckRzw+KFBMRyZAMCZSUFUuJjg8ICpQMzogMkA+MjA/OSUqTCMtMCAyCi1NITQwOiwhMUogOzQsRTA+SiQ7ICcwQCQ8JlwoIiwgRDwgOiA5SEFEQyJHTDNPUDctIztIRUZQMl8mI1QlCi1NUTFGOyREXCxOQFpDKUVIRihAPyInJUwgJyBGXSlIWEM3IDpYKDw0JyIhMy8nNTwiREBIXSZVSD9dMipCCi1NISQgNUNQIzEhTFA+PDBPJiEpPDQ0UF5XJjlIKFdBMS8gVUgkM1AyNylCRCMwME1FJlVcKjRQSy8oIigvCi1NWjFBKiVbSCRNUUxFI1skOVshODcnWiBDN1BHSCheKEJCUDUzJSYwLFpQRiglV0RFRSE+QiElTDIxIFsvCi1NIF0kRk0xUyMoTVw4PCAgXiBCXDRUMUFFJUNQNUNQRU4lLFBBM0FATikvSC8nUUQ+JTwoQTFAUCQkOzBBCi1NOSAyKSNUUEUpUCVEIT0sJzUxMF8lWzQzJ0IyXSNHTDkgUio3JVxUOSVCN0goPzwtSUBNOSFcMC4jUC5RCi1NIEdMMjRQUU8iXSBFT0AtIyZQVCtQUF0kIV4kNEdSIEAkICBGIkAuJSEyQCg9QDNPKUJUJjVBN0olUjAzCi1NK1FXTyU+SCIjIUgiJTQkIExQK00kJkwvSTE4QyknRCAoMiFZIDA4KS1SNjcoNVA+VTInNyZYPEI0QScmCi1NI0VYLT1QNiAnKShANzBRXyFSTDY6MVYkJydYQV9RXyAoViRAVFEgOyZCUDo3UDcrKS5EIVYxIjQoTEw4Ci1NVVE2WiFbOCtaQiNeKE00IF5RRzYnTVQkVlI2QyMmVEFJUTIgJSEwREFBMDYgJFA5WjFdNiRHSCc/QUcvCi1NJ1EwPiAxXi0hJVAhI1E3JyNSOCFdIEZIJlVENlpBUTEhUDRGLFE/IyZRSDg5IT45JUVUMVwiOTAgNUg9Ci1NNkImJyQuNDEhMENfJzgkKCIxWyEgTUwuLEEtJyY9MCNYMCU1I148Q1gyOjwkRFgnQSAnRyIkSC1XUV89Ci1NJCo0NksiLE8jWVw7REBNUSNONDg+QjBAI0kwPiogTVQkTlhDLDE2KSA4KDZaQUhVISosK18xPFsgXyQmCi1NQjEwOSBeIChAICNYIT8gJzhQJF0kJEwiXTIkNiBIUDtKUiIyJjVUMFRSIjMhPFRANEI0LiUxSD8gUCJFCi1NJlxERUtATU8mITQ3MFI2NCheLDElMUpXIT4oOTYiIEUkUCQ6NzE0SyBfUDs3IiwsIypYPFsgLkciUUgnCi1NMCIzOSIhLDhTQjEwID5QRD4hXUQnMiAzOkBUSiZFQEQyUDRbIlxcRSwhTDogPkw9JyIiRykoNDpdIi5FCi1NJChIMEUxLDYoJzwoJDIvRShPQCErUT0mJyZIN1IgRCkkOlw+PlBBXSMrTEBEIVoyIkZUITtQMEAkKlg2Ci1NJyI3OyRSJC8nMVxIICJEJDVQSz0mWyQyIDInLCAqMD8iIi0nIUEsNTxQWCEiWzwvIyIjRCdFUCNSMV5YCi1NJF5YMS1AMVAhOVQrUCBBRSBFPDtIQjpEJTxMRiNROysoS0wzQ0E3IiIsLCFAIUcxISZUPDtSKygiUlwrCi1NXkA/PihCUDE7MEk6IVRIISghTTYlOFAvLjAyLilENEE0UiBaJ0k8LjwgLUYmVlwhQTFWJiFcXEAwQD9eCi1NJzVEKl5SIE4hKTQ0IiAhWiRELDwxMV9WKS1ILEoiIDwnN0hASUI4Iik/KEIzQE5QKCgwQywyN14mViBHCi1NIzE4PSFfJCRKICtZI1s0PkwyLCQmKVAsIUEoNyNSVEI/MTREKDU0MzNSOyUgPzwyKUAkSCg6PCclQExICi1NJzMsN1VCK1UgOihFMSBGUCIlJDxdQjpLJDNcKT0gRSYoP0RBICIjJSZcLCRZMDM8JVM8PjFRPC8hXjQlCi1NUEFXMicoNCJTQFFRKEI0KlAwSD0mXDw6KlBJIiIxOC4rIjUvKUwsKC0hIzknNTBGVDAtOSEpTCcvUClVCi1NIVFAM0VRJ1ciSFwpLyEwPSI3ID1JIiNeKUhARiRQLTQhWjg4XUIvWyBGNC9GIEtQICRcOlVBOlcnSFRCCi1NJzI6WSRCXC05QTldIF1IQUsxU04oOzQ9WjIvOCk6ICZPMDU7IjBUP1IgT0kmUUQyMyI4JSFKWDZJMTBaCi1NIyw0IE8wQE8jMDwzPTE0NCQyJDJUMDZdIi8kL15QSiYnRlg/XiBZMyRWXDpZQjBQIExYQVYwJiQgTEAoCi1NVFA9MiJdPDYjIjZcKD5MQSohLzQpOkxFJzA9QCRdRCY8USdcJDE4P0wgRU4mPTBGUjFBQSU9UCQ6IEBXCi1NJCEoOyVAWDIhUVwoR1E2OiJaMCo4QTghJkEoPjghL00oNSgnQ1FZICE5IEAnIV8gJFQsJTJRWkUmIUhGCi1NQlFGWCZRPDpCUTBLJz1UPk5RI1kgNUAkIEBIVyJEJD9VMS5aJklMPEBSLDsnLUhBOjFVXSJWODJDIC5WCi1NKC4oKTUxVUIiLTQgX1IrTidFPDc+UCxUKE80NUMwJ0olL1QjIzI6TSYiJC07USk/IU4kNCAxVU4nKVwyCi1NJzEqUyQtRCwmMFIiIURIKlMgWkYkMkhAIzA+KyEjNDQnUDI7JDw0NEdSJSokRjwsXFEoQiVUUDsnIU0nCi1NJlAwM1MiMjchKDBFWUFHMCBJWCBQUDM/IDRAPCUgXkIlTEg0TlAqTChQKCpSQVpWJFhcRVVSOysnUjA4Ci1NUDEiISU/LDM5IiU1JiZAPCQxIzgmJ0Q2XEFDJCRZSDlfIiQqJU8gIyBAKEohMTgvVkIgWCQwODIrIT4oCi1NIFdIMyJQSjElPSA9PEAvMCU8LCE6IDw8IzUwN0VBQkspJiw5SDEhRSRFKERTQjg4I0k0PCEiNTQiXigyCi1NKVEzOiY2RDQgMEJLJj8gQDQwMFYoR0woKlApTyZMNDdZMjUmKDNANywwQDYoTDgvVlIlOyg7ID9LMSdOCi1NIUVQOD8iM1UmX1RFJFBfISQnUEBaQCYsIkc8Jy5SJlQjVCQkNEEuIiIuNDo8MSU0IzsoNDhCKjsnMDA7Ci1NVUEhQSY7UCVcQUgiIic8MU0wSSgoIighVSEwVygtREMwIjU8IVQ8MUYiLz4iKTRBVDIlMSFASDBKIixWCi1NJkpAIDpBM00oITRDIFBULCBHWCY+IjtAJDtUJChCKUEpQVwoS0BNSCFMPDZeQCUhIUQoKkFSKFwiNFxECi1NQzFEMCY8OCsxQSIhI1AgKUowQTwiXzg/KEFeKSkuNCgwIis1IkIwIEpRNzMgQFBAJ0E/WyNTPEYpUEYmCi1NIjc4J1UxNiEkVSwyO0EyTiI+PD8rIC5XKFFAJT9QNkAjPTgoNUBTVSRKKCBAIiQiIVlMJU0gVUAlQCQqCi1NJUAqKSBAPEAjUT9JJV9MRklCO1whSlhGKjExSSAxUD4lUEkgKCZMQlpQWCwmQCArPiEqQiApLCpMUD40Ci1NKEosMjVCNE4gViwrXzIyWykoMClOQDIxKDNQIzUxXVIgKCwuVjBPNCY2SDUyIEM0KExYNydQKj4hK0AkCi1NUEAjRCVdSCldQjZKJiZUJSRBTEEpRlw9WTBeLShUMDFdMSkjJFFYRCshSEwoVCQ3LiEmXSUjKC8sID9KCi1NIUZcQFkhIVciRUwlNkE6TSc/MEVKMiFEJEckNDtSIiAgICxAXyBAViFCVCtdMDAqJTVII0NCN1UpR1A6Ci1NO1AkXSJQSDMvQjZDITc4RFIgMVMmQ0QkMiIyISZFJCIpIU80JDMsKUFSKUYpKTQzRzI0WCk4VDgpMSg5Ci1NKThIKi4yOUQjJ0wsWkIwNCFHKCQzUTklIiUsKz8xNiUlOzAnLzAzPyJaPDQiMiolIkNcRj8xXlclSShGCi1NIFEvUiZLSD8uUCRNJkowKC9BUy0oNUwuI1FLICVLVDRQQE9dKUFENClSJjgnQyQ3LCAuPCMlQDM7MFwpCi1NJFhYLUtCNS8lLVQmMDAxJCA7JCYpITxaJVk4LVYxMyoiNkxGSDFXOShMMDgsIjoiISEsMlJQU0wnRiwpCi1NXDFcOyY5WCAyQiw7JUVIM0hATSEkRlwzVyIwWiU3JCUsQDo2KS8wMTUyI14iIUwyTiFBKyk9NCI5ITlTCi1NJDhILzZROSkjP1wySVE1KSFJXDkqUiI4KDNUQ14xRUciWTQ7K1BKRiFFUCEqIEYvITlYJz5BNCooKkgwCi1NLSEtUykrQEBXQjE0KCooPTpSOz4lIDRCRDBNWyFTPD8mQDFEIFUsKz9SOjAlQTwjJzEnKCdGJD4qUiQ8Ci1NJS4oI1QwWFwoWiA8USErQyg9VENRMjcoJ0hIQVNCLUwnM0gmOkFGUidTWCc6QjM+IF88QD5RTzwhTjBACi1NIkE3ViE7MEIwIFYhICZcQjYxS1goPCQkTyFIQyU8PCpZIVonIEg4K1ZAUT8hQDQuJ0AiQiZWXCxEMiZCCi1NJENUITZCODMkIiA8XFAgVSFTMClFQTYoJDFENUsyL00iWlA2SiFQXiYnWEZHUSU3ISMkKkQyN0AkQjg7Ci1NUFIwQiRMOEU/QUZRITFYRD5SI0IoNDw3JzBEViEkNEchMV0kIzJQN14hI0EkQyQ3PCE4XSI5WC8kIF9ZCi1NIj1IOCAiISsjMyBGUFIxUCU8WCpNIiNNIl48IV9SMSQmJjg2LUFPPyRXICRFUSA4KFw0QTMxT1YkITxACi1NSjA8MiQ9OCJGQUFBI1NAMj8wWVApOEg0XTI5XChDXCUlMTtPKDVMIkpBLiIhI1g+QTAtMyVVTCo2IFEiCi1NKVBMMVtQJCclJzBCLDFTJCNZXCFTMEg5JlwwISxBMEAiSzQmVkEmXykkQCZCIEAqJiRUMkwwOyUgWFQ3Ci1NUSFQSCc8JCJIME9UKD00MTAwQlkoKThFOFFEXCZORCpEQF05JSJcI1FRTFYpS1A5SlFBJiYgJENcIC9SCi1NIik4Qz1QTCUmWEQ6XjIgSyYzVDM2MicpIFhEIUVSN08iMSwqOkBASyEgJDUjUDM5JkUkRCgiMTIoMChECi1NOVA2VihbWCYxUSEqJjhUPjkwNlsoLjA1ICAjIiY/TDxdUCghIz9IKzIxSlMkSkAvXTAoOiddTCw+QjNbCi1NIiNEQS4xUykkS0QwPjI3VihLTC4qQDtLKEEkID0hNkQnKVgvM0FLTidUUDA1IU9CJScwNE1QSEojPlBDCi1NK1E4PiRHRDsuMSYtJFQkJVdBO0EoPlwgODBdKCQ6PEAmITVaJCc4Pz9QOzIoOSBFWUIsWSE/TCRRUSI3Ci1NIFMwMD5AMkIjQCxGXTA7JiExJEA0UD9IKUwgN01RPDQkLEgjP1BcXiJDTCddUiVPIjlYITMhXyEiSEA7Ci1NXSEuMSVFWDEjQiksIkVYKkhRLCcgLzAjXVI8IyFPNDAqICAhICAgICAgICEgJTggX1AnXCBUWCRdIDtOCi1NIjNUK1ggWzckQig1UEFGVic/WEJGUCAgICAgICEgICEgIEggOSAvSCAgICAgICAhICAoICBQICQgICAgCi1NICAgICAgICAgICAgICEgICAwICIgIDAgIiAgMCAiICAwICIgIDAgIiAgMCAiICAwICIgICYvICAgMEswCi1NICAsICAgICAgICQgIEAgIyAgMCAhMCAmICA8ICIgICkgIEggIlAgLCAgVCAjQCAwICEoICAgITogICRHCi1NJC4kICE/NDAgLTJFIC5BT1A4O1IgIi1DJCVYTTpcPCAhOiQgUy5UO1NNLyIkICAiODNYRVNFWEAzXl4hCi1NQTpRITZSVU0hLlo/JCstKyFRNVtSOT8uICwhQSArR1VPWk08SS8nIzhSRCAnMSAgIDFURCQuLV9XVSo2Ci1NPFdPUSAgMV8wOyRLRUciNVVAWSNDMDZPKj1MMExRSjIiIFk0LCBWNT80PDQmS0hBICRELTxdMydCL1dfCi1NOkIyNCNQUVghITAwICkjOUUmNSIrLT1CMTAmOihCODczUjwgR1FcIU9WS005JlhYRV5XOklfR1RaM10vCi1NIFAgOCVRIEE2Ul1VQ1tGSkgzKj5bKVUzJFhDJ004WCAgXiQgXUMzLzlDJy0xT1k1WjtSKS5ES0onMF5eCi1NRC4wMCAnJjVJPyVXPTJFWVomNlRKUD1EJTs0MUY8UkclQU8uUDI9RDhaKDhSTl5EPlI3LVQ+XVA6XVxeCi1NJ1lXSiBVXTMkLScsW0IpQVRfSCg+PiMmVkI5R1ZXRks5OFg6UVBAIEBaJCAvNlBQKFY6JllWV0QpSzhYCi1NLTw8TDsjSy1cPD5eK0FOLiAhMDAgJi0xOChfOU4iJVQrWyAuNCxEXjBPM05FVzlIIjwxV1kxJVQgIC4uCi1NQD4kN0xDT0Q+LSA6JyQ4KCNXR1VdKj1CWVhJMThMVzVCVz85Q1EiSCtELChKSyg6PyhYQVNEI1NCTFgrCi1NQSwwKylXU0tFLC5NKTEpKTgwIjpNKChJVFVKRVJeVDpOOl0+JisrOTFbIldMSVVDJSNeLCBVV1sgTEgwCi1NICI4LT4yT18/JkdPWC5RSCc6NzUyTk1GMkowMCFTP1RdI0EmLEBUIF1QIU03RCRFP05YXStOTDJaQFxCCi1NWCMuNF87OC5QKU9NPidROTRcIEQ5S0AzSD80ICQsTDBGJCRUQi4gKlZcQEMgTElfXzA2OUZcKVcvLi1YCi1NUyhbWVcyPUtPOFlGQjs4ICBCJCBCQFA3TlhaRDVKXj9KMDknTEM5PTJVX0BALVJKIk8jXlY0IkhDSCMwCi1NOlFJQyhRICA+PEQtUC5HPyo7LyZSRFcsN0U1PFgyUFxIJiRaMj1PMj4sNSwhTTpYTlQ+N0FQXEAvQCROCi1NRTlEKSBdXFhfMFw1WSJcQz0vN0xUXF88IiwwJEwtSlxTN1w5SUMsRiBeRD8gRFgnJCo3Jl1KTS4yMU1HCi1NKzApTi8wODE2IkdLPUFDMV89LUFCIissVzVcW0UuWiw0K1BKPEAhOlgwIic8WSNbKjMtUzhCKS4tOlgoCi1NWEwpXU9NLidfMDdZXVNNL0g1MF85UD0lVV0wRiQ3JyImQCAtJCAgPkE2JTs7RFxKOjFBW1hBUCQ0IzBLCi1NK11UR1tGLTA8OUZGUj5ENkNESE4qITwoO0ZcOjIxRU4gIChNUD89OF8sSlY5JExIOjdSN0AtIThMLDcoCi1NKzZMNz1bPDxZMDMzM0MkMC1KXitUVy80OjVTQjRAJSMkLjFbTiVXKFROOTRBUzwoJigyPitRSVhSNSNbCi1NOyw/I0UnOjg2TFEpM0JASVVPRUVUVVIpNTNQLEBaJCAjTk8zSzo9ITNeM1dFM1hBNzFTW1cjKl83UVhJCi1NUl03OUtVPzJWKDJaUytdREwqK11NUUYlV0xIUSA+QDAgLTEhRiE5WzctLyUuKCAuVVFcWzNfNUs3SE4+Ci1NRiMtUlwlPDEsJCchUy9EUC5DVyorNUVOMl0gTj85NTogJEhNQD9PI1QvMTIoQkEwTVBfUlxVPDMlIS88Ci1NMEVVXVVDRDlGP0E5LiFQIERBMzZBSy1XTjdKRV9GJDJNViVKICBNXyQnQEE4OklQIEwmKFAhOTAnR00iCi1NLFdHNSwgMUsoLTApMCFBWFpaNS9LXj1WTFVWXyc9XjRPXDhTMCNdW08oVCAgNiQgRycsMl0lVCdYOT1YCi1NWVskT1NFRlk3Sks6TSM9OVslRCJULkdBIlw/RD84QiQoN0BOSEZFKD8xJSNPKCktP1QvNSQgITpfNyw/Ci1NWSUwSEg+JzwzRiovRjA9PF9eRl5AOlhfWl1COyktVjA3KTpPICVQV0YwRFdZSk44NSNeOFBEVlNPIiwqCi1NNjNVIV4tKEJUIy9HSV8vVkVFMiVDWkVeS1s4PEZAJyAlRShcWCpTJStPWEAvUi9dSEleWVpAP1cnQjtaCi1NLVdcQyJVJSUgOTJbJCkxWCBPPVRQKFA7NzAiUFwsOVVKPU5ZJS4rOTxNXUUjVE0sPVJDQCVGV1ZEPCkxCi1NMFxHLylZNks1PTtCWUI+PEorJkYgI1RBICpQK1lRPiw8XyIgWTYiTSwlNS8mL0JXKlVDLTI4Vks9VUBLCi1NRT9VTUNHTjFOTj0/OzMpNjJRTk42TzkkPSNGJUdHUSc6PkwgIjEgIDxLRCxMJl1TRzZYOkxEOCA+JVVECi1NQSAtX1hcLEE3Li5JKj1HWDEpJyJYLD9SMkpZNDM+XzY3Sjw1Vk1IOChXVjxKPS1eSUZeWSAgJT0gOlIhCi1NP0FeSVg+JEU5ISpbP0c6PUgkO1FOI1IgX0o/LzMuOkJUICVTSzhTTFVDQUJCPC8kUTA3XSdPQjRINls1Ci1NNkRZKS8+LFgnLzwwPzQiVTBPQS5TU0xBPk9ERTw2TyA+M09UOy4pREpaXjstXCUqMDs2LVUmOCEgIkEgCi1NKVREUStYJ1AuXV9eU0IxISkhWV8oTFxRIihfQSArRlI9M1IiQiE6M1MzXFo6WEZUQV1YKEdENSY6JFZGCi1NIy9XO0RZJz8pLlAzLCZBJClZRlQwPlpWQDxLIzYgKTFcPUVIKTopXT1HJi0gNFgwIC1NVUUhN1I4Xig6Ci1NPCYkMyAxIEo5Li5QRl9eUDJGJSRKRTAmPUxSJFEsQFwgSDRaVFEmRj4lMDknV1QpWzEjQz83TCAqNFM3Ci1NJ0o7VCIjLCAsWFMhRTxRMVIjUjxbWSFILTZOJlk6PlYlLjdSRSEsW14zMzpDOShaOCtQIkI9VzJERlU5Ci1NNF8lPTMjLUU1ITFGXy0qVi5YMCorO1AzODpHKTwgICcsUSImLkpNO0ZDS1IvW0s9LEQ7O1YpISo2LkEpCi1NMUw0SEMsOD8sJU46JVBBRUAnUElBKyQmT1c2L0lYUTUlXiI0XTE7VDlIO0RJW1dWMEs3RiwiUCAgOiQgCi1NMDZKRypZLyVVJ0FdUU5LQ0syTUwqX1IkMl8hVUtBMVU2J0xUOEs5WlZYLDEjJTQiRjJcQl1dWlBbICJCCi1NLlxWRF08NS9CRU1FQltCLVxdKiErRkQwICU0USI6TThUSjgsKUxNNjg4Lic6QVNUUDc2J1onOEwxJD8vCi1NMDogJUdMRCghQ1pATkxDSFlcXyA1PidaMSsrTyA3WlApIiBFPF0lUl44J0ROIDZOIVE3LEA7Mk9DKUUiCi1NMzcsJixPTzZHT0cxUFQgLlIpLS8wW0AsTDgzVT0+Lyk2XzIsOEkvXyFCMjcmWl0yXjhOOyg4Tz8+IzU0Ci1NWDstWlVFXCU+OStfUUo0TSAxMU8kISxELSIrVTEiMV0/Q1YjSVkzLyZBWiIyVCBRNj9LLDk6MF8hV0YkCi1NSztNWUxYI0k6RyU5Ojg0QlI2LTk2T1UkR0QtOTolLUlULDguWTlcWFslMzctRzAgKkYkIE9TKVMiW0BUCi1NPiNQVDg7WlNaQDkqRSk2TEM/Jl86UzwqXyIjX0daO1MuTFs0Rl1AI1IiV0xGXU5JUj1ZKV4mRyJTUEBUCi1NPUVTS0RQNlEqKjcpJVFcQCxHI08gIDgwIClfTV5NUiBTPC87J1ZAWCtKPVk2LzY6KDpTRjY1QDNVOklGCi1NNjZCOywyQTlbWkQ1SCdbJkEzTj1KSSVEQURUVTozQkM4Lz5DTDAlXTAuXDZGJDBcSSo9XFY/TjsnJCUqCi1NKVZYN0tFP0w4SEZKW1IrW1c7OkJbXjA3WDtXUixWOihAIz5UKyNaX04tWjEmOlFEIi0zVDpEWFVfVkguCi1NOVU6WSUkIzsuXElYKklNSDpTKyVWPzZPOjtQRjkqTDBFW11NUCM8XFNLSkRMMzRBQzRUXkNNOD5aOksgCi1NUS1VOyNdP1wlI1k/IkQgPTQ/IlY/JkoqQFo9PjIyQysnOV4uSzAyJls4UiVcO15AVTZDNj8uTEIoJjRdCi1NTEYoJVZSJCBLUEhTKVpBXzJAVUFGVyhRRV5OQDtfVUtINEwrWV0gOlgjOy9KSDVGOzgwTUgsRzkkNUpQCi1NKy1UIlEgREdeO0c+QSlCRC1BX0YyRiZFLFNfSkpaXDUjWjAlKFkrNVogI0QkICFbSjNYRVorWlVBPCdcCi1NSi8xPScgPD4vIk5INlBALF43JT0oICs2ICEgKEZUSlZMWDtKOytFRS4wJyEyOFFZPT9GLVcpJjsoNllRCi1NW0IuKU89NU1MKzBCIUg6MClbT01aTiwgKEdQIUYiWic2W1szR1crOFYyXickQTUwUUZPPjtHIy8yTUAvCi1NVTk1UTtCOlI5SyJNUUM4RCcxNzM2Q1EiNSBZQ19XLyBTJTdPJVY3WSovKTVPLD9XQC1TTVcvMU5bXFk/Ci1NVyUvVyAgN0ckKT8rOj5ARlVXKF5NLjJKQUVOMC4yKjwsUD1VMldLSUQyVSdeNz46O0QjRyVAT1hRIFIyCi1NXCEjUjdWUDEpPC4rMExHWUQ5VVMiV1JPIT9cTUE7ISM9NkRNKlgwTElFP08kLSA/WDAiLFwwVkkvSUY7Ci1NUzFOTis/SyMhPFg4RC49Qik0WyNOWTMpJFtdOENPITcgIT43OllUTSU3K0tQWSVdIlImTVFeLkNTUi5BCi1NXF5CJT80T1YnI0kgKEchVTw5S11JK0o6PkYnPzpBXyEkICJIOTpcMS5KNCE3NTJGXj1HWjRaPSE3Tis7Ci1NOysgSTQ0MjJTV1BORyMqJVNYPlZKJkQ0TlAqMTg5RjtBWENEJiUvRDwtSC5GXl4oIVRWXkkzPFQ7TjA5Ci1NSCxDR0U0OTNCOERPMyg0RyEtQ0tQOichWiA5KVBJMjVON0lQM1glIj06NFkuRiwrQlInIjVNTSY9IStdCi1NUTRHKkZEN0I4RCxZOi8xODUmJ1svUS06TU42WzIzNkkuXipBUCRQQiUxQjBJVFkkViJWJkBETj1PJEpHCi1NMj0kIE8yLDBJUEYjI0RWJyFZJSQzIkhdLFQuMSI3TjNZRk8oKyUyOj8gPEBFPyQmQjVAUkRCTkohMU8lCi1NQEYlIzpCS0UoVltfWUg/KTc5TztSTipbNScmRz9DLTpHVFwnMy4mOEhJLkEsWCVfPS4oMyAhUkEgLTNJCi1NOyVRXTtZT0RWPj9ZLlZeQT1WKFQ0PDorNj5DPipdWThTU1NfNiIpJj8hNkg1VzU5KU49RzRRPVdNVi9LCi1NWUBJP1hfVFk6My9ISCM2SCE7RiddQyQvMFIkPzBdTzg2TzY2SlFMOUhGQF8gIDAwIC44QVpDUzA+KFVDCi1NWVNGUVtaPDc9MkJOMVlWSyUsTV06Jl1GLjpVXSdfNTZeOEs5N09YX0w1PEAnWkBUQ0wzRDZUK05TJjZYCi1NNjldIidDTTtQRCwzXUVdLlAsVSRHW1UlXkUxQ10iRUIuUiM5SyJBS0A+Sz08U1QqX1NAQ0pTQC1FSC9fCi1NUVUgIjFVJl9MOlIzQEA7L0RbViI9XDAvIz8uPiZXVFtVP11UKU4nSi4nQjNOIy4mLFwgPjA/Q10zS1BECi1NLC5ETDQ5PFwxLjhCQz9dRVc4WVAxPyRLQz1eIyZEMT8kJkRXSEo6OkE9Qz0xISMtQCFMIk4yMDNWMzUpCi1NNlNEQS8gUVIhXUk+XllXOCBBSCBUPkMwMyBMTSFdOTlcP0EsJztDSkBdUzJdMV1NTTtaPyBUUSUvQDBMCi1NTFlFMlcgVD4+QDorKlxQXj8vLzUoRUgkIEYkICBPJiQ7QDBBNCYzMiVWKUInN0wyN1ZDMD1JPUpMNDZLCi1NKkMqVUFCV0JUX1hPTT4xQi8xXjEtTlQqXlZYKC0lJlwwI1c9XVk5TkxAITJKWCNLN1kuJ1hRRkYmPyszCi1NLTlcU0ZFOzFPXSlOTj1AIFUpLT4gKVAwIC8zPSI1KT0xNCtBS0swVCtKLlNIVlxfUzdJTk0iQVddVE8hCi1NUi0hR1RPQ0BLSkBbOVpXKTVLLUxSKVQrRTlXISAlTShCQ1UqT0M7VDRNR0gzNyc7KDw3WScoJCkyRDc4Ci1NOk0+SjMnUChYOjY8PTlOKCAuMFwgIT9bMDNBXDYrUiMyViVUN1hCKClDQ0o0LCFSRyZUTi5eVFU3REIvCi1NRjwyXVVaQVlAQTokSCxKVDQ7Si4yNVMmKU0zKVxfUl1MTz5GSVQzUjMnMj4oQyJPVk4+NURDTCBNXzYhCi1NSTxSSFgrTD8mQF9VRD8pXEAqNSMgIC47JCkoNi4lWk8uTT0oT1VZOlxURUY1Kl9aJE45PFpHQlEhJUg0Ci1NQFUqVVlBLidFMTZdVjJNXEQoWDAiIFA2UVZCSicrNkBdUCNWT0Q6LT88NDtSTFAxWU1WWEFMOzJWVSE5Ci1NODc5KEleSClaRTwvX1hdPjEpUE9DRjxBICksKVtCSzIuODxcOitHMThSWSBfUi1MIlhfSCRKOzAhXEEiCi1NUC1ZXDo+NFFBVEgjM1tCWEw4KS5DQVcyNCVAJCs9L1VCWzojRCBFVlpBMjVUJVEtLV8sNUZIPSggVTleCi1NQVZIQy1KUT4vW01TU1NBRy9PSTJLVDA1TkEgIEUpRT8jXztHTV0vLyxDTEpQXy0uL0kyPjlPUio1MTEoCi1NTD1bXjtOK11XME89RiUqNEUgJCIzWjdWWVFRUiMiSDJETy41TVNZMUk3Lk5MMyJXRUpSMjE9QEk7XE1ECi1NISdHUiJHWk5cSDUnMkkmOCZANV4sTiVWPExRPiBVIjsgNSI8Sz8nJ1cqVEwuI1UtLVcvJjldI0o7OkAmCi1NNDlPUl4sMCNYOipANEIsWlVRIVNKNDIlVjtLLyRBQCM8KDxaRlUrPDROQ0VMT00uIVE+RitbWS1VXiQqCi1NSl5VL0MmK0w+XFpZMCInNDlILCBIMTVVWUxTQyo/KiQrUCIhVVEjRTlKKTwnJEpFL15EXC8wMVIqI1pKCi1NNDo+Lik9ITMgXy86MF44KEk4VEIlTjlAJkYiPF1PUDRUJUA0UilUOjVdTlpMOSxEQTw6WVshQyhDMDZZCi1NKl4oOVYqIz9ELUE1RkFMXkkyQjtWQkUwOiVBLUAvMVUrOVFDPEU7Iy5QIDNYMCAhLCRTIShWO1EwPSNWCi1NQ105I1NeKCtFL14xUTtfQDhfRzlSS0ctXU5GNEhATFM6Mj0tOU40U0RfO0QyTEsrXEpCTz1cSlxHLS5HCi1NKjIjPkVRQFUtIFMxIyggKiNJSU1XWyhEVFMgX1lcK19SNFA0MitFIT8+VDE1U1EiKEAvWiAgLDAgKDU1Ci1NLFNbLCVAIVZLQyJXME1PQlYgQSs7MzgsLSNZK1VXJ0FeMEwpWjFXLUNNWiUpNyFLKF9fPDY6JFNPKDdBCi1NPDNVVjpIODEnXEVeXjYkPkBVOS5LIlkpXSwzKDBVQFBMKTEySEhYMT8rW01dJD8mKlJXSDxAWltbJVVPCi1NN1s9VVJUSyFOQ0BDLDIiJCxRKjxNJEA2VkBVUlFEISJPQV4mOiciQjNRISNEIUUzUSZQKycmQCEqQT06Ci1NI09HLyheQUpVLy8mJlwjOyw8UVw+XFgjLzROKFRAT0VBPF8oTlg7RTFMSi1YOCQ0QzBRWyxJKDRdRTJdCi1NMj4nJCldUjxaSyU4MkEnWSRRIFZaLDlaKjlbVCVDXCpcVEZGU1c+RShaLkRPRU4iUyopUitTNDAxJ15eCi1NRzEuWEosKFIzTEUsLFpWXEdPWlo9SlBBLEJZLFMzKF4kWSZUPC9bOS1LTTxFWDUiJSFLXTFMUz1eLjhYCi1NQV0pSSFdJDcmQCtRX0NaVUpaWyNOPllPJyBAIk9KJCBSNkAmICxISUg7RjtXRVROJlBeVlEiJVEwVSI/Ci1NMFg4NjpSRzI7KkQoV1QtQEUxVEIoKiBQOzsyJ1hcKT45XDY+UFNNXVQnQFBZN14wTi1AO1dJVzpZLT9GCi1NMSVZJFk4Mz5MRFQtN0lZIU1CRkI9QFgnVT1CQy8kOVFBLCtNUzFTQShCPCA6USAgQVElXk5eKVo6NkJICi1NQz5SSCIiPSw4NkdTOkFIUz09Lk0hQDZLJk5COzBPSz44MFs8O0cqRlJOIzNZOk5aLCdJJzNNPkpSTjhSCi1NUFQ4VkErMyVdPEYsLVpHJk4tJFtPQklDXSE5IyUsVDpOOzRdKlBIWjFaMVg4OztYWS1cTCQzRTklXUE4Ci1NWUAgMCJIJV0zLSNWRDBYM1k3UFhFWFIuM0pfN0lcSDpAKVZKMFlSSEJUIys6MVpXMikuTjFWMSM+RE5DCi1NQj9YNiJZJzlQMUFeSVFMTyA4IkIjJT5BJVI1KVw9TyU/Pz8qJFwxLUg9PUI/TSc8MzlNXCFIK1U9XF03Ci1NX0RHPjhNTVpfIk0pO0QiPCBXWjAgICkvJCZJOkcnWTJQQz1SM0hHP00tV19VIjk9PSQmOlEqTDVTTCAhCi1NJFY8TVBXUipWLT8oUi1CJEY3TT06QipeK15XL1A3Q0ZbVC48KT8zWiY8REJLVUY4UklCQV4pRUgnSjdcCi1NOScqMUwsPjZNOzhXRTNQOVpUMEg/NFY1XTIrNVlFMkpGRDgiXCxZQTtQICAgICAgIDAgIiAgMCAhUCAqCi1NICBYICRAIDcgIVAgKEAgSSAjJCAuICEgICREIDRQIT0gJkAgPFAhXyAoTCBGICJGICs0IFBQIzIgLiggCi1NXFAkJCAxOCEqICRbIDRYIThAJVcgOFQhSEAmWCA8XCFZUCdfIEFAIiwwKSsgRjQiQCAqPCBLRCJVMCtSCi1NIFEgIytQLS4gVlgjQ0AuTyBdICNcQDA1ISNAJDZQMV8hKjAkUkAzUCExOCUvMDVFIThUJU1AN0AhQEgmCi1NLSA5PyFITCZOIDtFIVEoJzAgPU8hWVgnU0A/XyIjICg4MEIzIiw4KF5ARE4iNiggICAgICAgICAgICAgCi1NICAkICAwICEgICQgIEAgIiAgKCAgQCAjICAsICBQICMgIDAgISAgJCAgMCAhMCAlICA0ICEwICYgIDggCi1NIUAgJiAgPCAhUCAnICA8ICIgICggIEAgIiAgKSAgRCAiMCApICBIICJAICogIEggIlAgKyAgTCAiUCAsCi1NICBQICMgICwgIFQgIzAgLSAgVCAjQCAuICBYICNAIC8gIFwgI1AgLyAhICAkICAwICEgICQwIDEgISQgCi1NJDAgMiAhKCAkQCAyICEsICRQIDMgISwgJSAgNCAhMCAlICA1ICE0ICUwIDUgITggJUAgICAkOCAgMTZACi1NICA4PEAiNDggIkgiRCFXVyRIVCEmMDkwIFtMIlgxSTghUzA4KCFUTiYpLEVDQEg1IiJEICAwJTAkMkw3Ci1NK1EjUSE5KCY2MjAsICA8IDggTUokVixBNEBLKiUuMDpSQjAtICMsJUwhSkUkLVQxX1FDISRBSCNKQUhECi1NIlA8ITUgJkAgRTguJ1BJOCFSLDRbMFElIl84J1AwK0kiKzgrSCBSViY5XCtSUDk8KCg8LjkgPDwoVDQ8Ci1NSEAiQyRAPCAgMTAwI0NcJ0dRQDsiNVRCW1IvTCk8MDkyMV1VIDlMRVwxOjQgIEQrNCBVWyRCIDUxICNLCi1NJCQkPVxARDAnTTguXlFeLCNRSCZRUVg+ICNYKFQgWiMpO0hAUkFHUCZLPDg5MFpSJi9EKF1QXEIkXyQhCi1NKzBdPSNLJCFGUjAgISAgJCMgRlEjXUQwQDFPSCcsLDhIQU1LIT4wOiNCOSIkXDw6I1I7OiJIPEYsIjBNCi1NIV1QJjFBOlQmIlQ6VlIjJSglKEEwUSMjJFhcLFgwTi4jUCwySkEpQic/MCAgMjswIlksQ0pQXkclR1ghCi1NQkAoVCY6MEY9QFMlIFEkOldRLjAmW0gwQlFAUyNJLCM/ITpAICBMNjAiITwoPCAqKEBHWihNSDMmMD8wCi1NID1IJkxRUDYnJ0hERkFSWCE8QCxTUTRKIkA8IToiKjcgJEwrXCFWISUtNDs5ITxdKE4sL0IgXy4nIDg8Ci1NTFEvNyQ9JCA5IEBEITtQKFIhNkImMTRGLkBYWCMqICFcMV0wIzZMK0swVFspOTQjW1I3JiRGWCZdQCAqCi1NJTdIK0pAVkYnQCghXjEnJiMhVCtBUVM0JSNEODEwSC8jK0w5TCInVSk5MCAlQF83J0dYRV8wQk0lW1g7Ci1NQDFNMiY3XCktICckJVhMKDBBTEsmWTQzRzIgTyhYUDcoIidfITRcICBBKiAnN0AsV0ErSyg7OCIzQihYCi1NKF5IKTAyKUokVCxEOCE3OydCMEBcUEhKJkUoNEcwR0cjWlgmL0BLKyg6LCFTUjwgICBUQSwhKC0kWiwpCi1NQiFTXSJPIEQkITQxJFssPiJROVojPiQzNUBGMSZETEZZIiZRJzxcQEZRXlgiUSw5KlImPCk4KDE7UVNHCi1NICVMLyQhVU8pQiQjJFInKiktTDosQUAoIzQ0IUsxJycmXSg5NiAhSihKNCIkMFJUIU0sQywhTVMnRjA7Ci1NPiBeIiJfPCA5MCFXIi1UIjYxSkAoVDg4QVAsRiFBUEJEMUFOITkoN1hBUEomXlQ8LDEiNSknUEUiQUgrCi1NJjkgKkQiOCsgP0w3XkAiLyNaSCpZQi9cKS48J0pQPzYjVjAtLCEqLSk/XCw4UFgmKCdIIEIxMzAmMzQyCi1NJTEgNyAqQD1RQF9AIz5UIkRQNCMiK0wrIzApIyMuJCc0QCRNIUtANydSLCUoV1Q/RUEtWyVLWCAgQjUgCi1NIkFQRjEyIzUkWixGOjBNSCZDPEIlMiNVIyMwO0ExRT8oI1wpS0A4ViZWJCU2IT1II1JUNzkhPlcoOkwvCi1NLTIqOChUPCxdIFhZISA4LFQiMC4gISAlJCI2XyMlODBPUScxKC84RTcgMzYlPFwxMCI4QiFDWClPIEMqCi1NIjBAQSkwQyUoXVwiSjFHRiRaQEA7MSc+J1xEKSdAWSkmOjxAPjE8VyROIEIyIi1LICZYMiwgTE0lWCAtCi1NU0FZUSJGNCYxQUFMJT48LVswNUAgP0w4K1BEPCNYTD9MMF04IVBYIFFRXzUgRUg8RUE+VCYwVDEgMCclCi1NKEsgLldRLSQoTEQ1WUBFXSgsLCJVQTdQKFMkLSAgWSQlJVApMEIhJCFDWCUrQEg+IFg8NkMhSEsgQFQrCi1NVVI2Tig4LC5MUFZOJCREN08xQ14gOTwoNyAjUCYsMCo2UFpEKDNMIUUgUUsjRkQ4VEEgJiRJTCBMIClVCi1NIlI0RDIhVi8kN1wrM1AqNiErWDskUT0+KT5cLUhQJFIiXzQgPiFGQiggNCZSQEdJKTdQQ1EhLz0pPlwqCi1NOiI5NiczVDhIMjFEIi9EJi8wUSIpTCghLlErVyEsJCAgUSNQIy4kQEJBTjkhTzw0VzE+XiNNXDNNIVxECi1NIU5cRDYiOT0mTzA+JVEkPCdVMCYvITJMJiUsIDRQJ1ogQ0wtOFA4LSdFRCRfQFc0JEVUPDQxPkMiOCxCCi1NLUIqQikoOENKMSdKICEwMCAgKUAmNUg5KDFNMikvRCpeUTQsKDVEN0hCJygoODQgJ1BLMShUSD9ZQVQlCi1NJ1UoOzAhUlogMlAmWSEkNCU+WD4qUjFZJVIsNk8hXCAhL0g2VUI5PCAvREU5QjdNKS0kPl4wLCwgKDg1Ci1NNCBKSyJELDVdMC5TI18gLkRBQ1wmICBCK1EtViEkPD5MQjJQIDcoOClQJzImLDAmRVFUSyhSPD0sQS04Ci1NJ0RUJSpAI1kgWVBARVA8USRQVCckQDxJIlBALFlAO0ggOyw6L0AgUSZRVCM7QSUgJD1QI1MxLzIpLTwsCi1NJDE+IyJIXDNbUTpNJ0FIMVdSLUslPkhGRSA3TiAyRCUkQCwuKCswPFohLlQjK0w0NkIzNyZdUDpcIE03Ci1NJjM0JD1AQSspKEQ2KzIiXCkkREYlIFlTJSpMNjExPzAlR1g7MCI0XCY1VDdGUFMlIj0oJUZAUlgnTzhGCi1NUSIkLidBRDMoUUNQIDMsQE1RIFInP0w9WkBHNSEvLCgpQSw1I1UkMDBBJzIiW0g4L0BMNSQzMCFIIEEqCi1NKF0kQk5CKVolSyQmJEExSCUyNDJVMUFCJ0NMICBSLlAkUDQ+KjFHLiZIPEJYUS9NJEA8RVJQMlkgSiwhCi1NNVA1NSNVXCU8MT4gJl44NzYhLV0kLSAiOSFEISZXPEFXUUYjIjxYQyMhPywmKiRDTSA8TyAnRC1IUTArCi1NKFJMOTFQL1sgL1AiNzEmVicoWC9LQVJCICFAOlwhKFElL0wlQlIhMiY3VD1dQEA7ISFAOSgxKVkjLEBCCi1NTiBQQScwVC4+UVVTKU1EQDQiNksmJiRGVzE2XShCKClDQV9HJTQ0MCQhJFogNlAiOCA9WiZTSD9HQSIsCi1NIjlULiNAOzogWjAwNzFbIiksNDQxQC4oICooODwhQykkMVAjJEEhJyY+JC8rUVROJS0sRlkwPU8kSzA1Ci1NKUFVSiFDKCJNMCMrJFQoQyMhWlkjMyRBPlBPRSAiVEBBMiVDJlgwRV4wKycjWkBANSI6QCgwXC9XUFc5Ci1NIVQ4MixQWi0hIUQ5IzFbTSFbNC1TQiVTIkw8JClAUjAmUDxELEAgJCNFKCxbMDxcKSs4JTcxS04gMERCCi1NQ0BTMyFBUERaIUpeKClYLlhANDUpLig5VzAySCMtVEM+MVUoIE5YJjBQOTkpRSArQjBCOyQnIDc1UiBNCi1NIU1AJFxRJS0iJTgmQ1IwPSBBUDEwMU9XJ09ERlYhUjYmUyQuUCEoVCFYKCsuQS4wIkVEMSIiM1siPTwwCi1NNyBCTSMnVCo5MjlBJDFMJTdQJzgmTjw8Q0IzQCVGPCkhMVpYI1lUPFJQMUsoWkA5OjFYWiIiODQrUjsnCi1NJSNIQ1ogT1ElPVw8NCBMQihOMCUrICA9JVpEJERQPSghWiA9UUBfPSU/QCAhIF1AIjxIIldAT1cjIzA+Ci1NIUEjQydMXDwvMDQiIlVALDNAQykoPCQ5QUArICFdOEUtQFM+J0Q8Iy9AIzcgLyBCWFBAJykzNCAmIDc+Ci1NICxUQjshX1spQDwhVSAtNSNNMDdWIDk3JF8gODZCICopIEgmU0BETyZHWEEqIV9ZIUcgJC5SLEwgIVRFCi1NWCIsUilHRCYqUSZaICpMKVEwLCAhOUwxTTEtNicwQCQ1MDRFKEk8IEpCOUooV0g/M0AxSSVCXDYtICBRCi1NI0A0M0RAXEElKkA0PFEpUyQ+ICNVQUc8JEJQNEgwI1YmPVgzMTFDUCRQSDtWQipcJCUwOUdAKFAjWyA+Ci1NO1FMXiYpNCxKQjUxICwsO0QgTTcjIlg3IiBKQiYvVDogUV1GKF5IL18gTTwlVkw/UTFfWClLPENQIEE/Ci1NIjYgM0lASU4mLFAvIEIlJihUMEJMIFpTKUFENVwwLScjRlA4UiEqNiZMRDdWUUUkIF5cKU1BIF0kLSQuCi1NKkBMOihDPClNUFElJiZIPD9SLkUjSlRCX0FIIiIlICUhID9AJyUoISUwKlQnPSgmOEFAJSFdUCJGQFdTCi1NJTg8PFUgV1opTEAjSVAmTiNDJCFQQDwyI184ICcwLjQgU1wyWEIqMyAqRDw6UjY/IT8kMS9BJ0QhVEgmCi1NIEBTPSZNTDtaIi4rKS4wRV8gOzcmWjhBIFE0XCRRICIyQT8iI04wQTtBP0MnLjQwRVBBXiguICIwIi9cCi1NIF1IKkshQzclTVgmKjIoOyAqNC03QENbIVA8OCgxK10hLEg5VUEvUiRZJCwpUD5GJylMJEQhRDMmNDgjCi1NLCBYKSU4RDMnMFRSJU84LlggIyImPEAgQCA4TiQpKEJNUDkzI1dIPDkxMkkhJixDPzA0PiVcJC5UUFAzCi1NIiFIQiYiOjApSSAsJzExSiUiMCAhMihAITdYQkkgLFMhMyREUyInICUiKCJFITI/KT1IMFshV08gXShDCi1NKTBRJSAqKCxWUTMuKUk8K0QwXykjKkxHISI4VSYjPC1OUFskIkc4Kk8yNiwoTlxCSjA9JShFTC9bUUE5Ci1NISAwMEYhT04nN0AmLkA+IyFKMCtPUiwtJj9IJ0BQPCooOSQ3U0A8TyE7RD5OUDchICIwKVAgLUQiOjAoCi1NLUBKPSdJOCpVUi81Jzc4QkoiI1QlNSwiXyElLyNNWD08UVNeICI8OEghLlomS0ghQFI4JSRNPCwgUDtLCi1NKTxAQ0dQIlYlWCQgLDA2Qyk0PCJCUDRKKFFAKjAwPSMjRTQgXCAmXSNPNDgoUFs7J004MEJQUicpJixBCi1NJ0BJQiJIUCJBUENYITIoN1FCK1ogLlA+TCA5JSg1SCsnQS9BJERcLkEiOl8iRDQyVjI5VCYqTDRJMS5CCi1NKFVcIzQxVlIkPDRDXSFeUSA5TDw6USUsI1RIMlNBJFslSkA4JlFSOCExWCJOMiklKTIgOTMwTFAjX0AjCi1NO0ImWSNLQCo/QS9HIDAwJ11AXSElXVw6KiA6TyhJUDRCICNfJEEkRSQhLEEpKDwiUSIwLiUjUCYkICxQCi1NJkZUOlpQNiMhNSQiMjBHICVTMENPUiNTJ1Q4MSEiLyAoN1wlQzIzIiAvJCwjMFE5I1MoQSVRTlohI1Q7Ci1NJCE9JSBUXD4nUCo9I1dYIEIhUC4hVkAmOVIsIyc4NEZVMVNIJ1ZQODQxJEsjPDQqUCBfSyE5UDdSMi4zCi1NJVVYIEwxMkIlXyw2KkE7ViFbPEQkUCwlIVg4Oy5BOyEgKlggIDFTMCYvLCs3UURdI0osPS4gOjogLDhCCi1NSEE/VyY2NDw+MF5YISlUKypQUCYlTTggRDI0SiVHVCNNUCBOIyBMIiJQVDwnVjAuMEEgNyAqNEJOICZdCi1NIy9QNytCOlYkLDArNlA4MiAlPDBYQDdRIyg8P1whUSUmMCw/TTFBUSVZPEM+MEQrJUxAJUlRWVUiJFQ+Ci1NWFI5WycuXEE3QExfITosOiYgICYjPSA6PFFPVicgRDY6IFwgJE9cPCogVjIhO0BGJSEmQCRBVDEqITBOCi1NKDYkLiswMCogPEgsJ1BGRyBXUD47QTY8Iiw0RDJCLUomQzQhTSEuXCFOQDFaQEVIIEhMNTVANCYhXFgnCi1NJkFPWyg4MC80QFQ6JzwgMTYxV18hWVwrOFA/LSUuVCQ6MilOI0VYM1pRTksmUlBFXSFONCQiJDxGMjsyCi1NJlUoICpRMlAnMDQkKiIpMyE/XDZTIUkxJS8gRDYxVFMkOlApIzAgKCQ5QD40QiwyJiAsPzMgQzohK0hGCi1NMCEjMyEwPDgvMSdDJCNQISEgJl0nPzgiVzArVSk9OCJZUjdYIVZMM1kiMi8nNzg4QlE7ICguSC0/ISBfCi1NJSpIIC0wMEggLjwxRDIzQSUoMCZKQi80IidUMypRK0YjMjw+R1ElIiVeQDJDMF0uI1MoISdCJzAhRyxDCi1NKEA8MSUuLD9YMSJXJlxMPU5QSDgjUSg5STI0IyQmNEZXMFAnKDtMMjxBTk8jNTw5KlFYTSJfQEQ5MCApCi1NJzxUOVFRMUojXDA/VkE2WCZAJDoxQSpbJjo0JlhRKlwjUEgoMjBMPSQ5UDU+IUskIkhIP0NQKi4lSVQ6Ci1NXkErTyZSLEJCMVMvKUZYRE1BMy8hOFRCMTIzLykjWCIvQDI3IE0gQjYgPTQpOSA6IVA5KSM/ICspMSNTCi1NIV5cOiggMUckUlAyVlIuRSY+KDooUTBXIEIwLVYxVkAkPjwnOCAtISdJLCs9QixFIFc0MDwwQC0kMjA9Ci1NPzFNNSNBIEU+UiheKF8sNEUgTlMiKjgzSiFOUiNOWDMxQTQ5KD80JCMgTzYjOjAoRFI1MygjWCE6MjE7Ci1NJVNAJVhAPC8hVFQmKTFHVCMpPDJIIiQ6KDc8LikhUF8jJSwoXyAgISQlIERKUDEoIls0PUoiMlsiIDQ/Ci1NRDBNNydYWDE1MVc1ITNQMlFAST4nPVxCIkIhICEqQCdWIFw4JUYwLzNRR0EoKDA6SzFRUCU2NCAlQSwkCi1NJTUwJVswNlQlKFwvP0ErUiYrXCY/UFIzJFwwRVMgQ0EpRzwoVzAtSyFCKDEtUC1DJkZUKihRPEMmVCg4Ci1NKCBVQSg7LCE+MDc2JVs8Oj1AU1EiOSg5MUEnISM4XC1GMClDICBAQEQgWzcoUSRBQSIrWSRJUDs/Ijo0Ci1NI1ggQkFBQD0nNUxAOSErIiNcRCRJICxVIjFEK1QhICkkKkA9XyBRLyFJPDNXIjpMJks8QFBBWCopKyxBCi1NI0BcWSI8RDVIMCQsJT1MKSpRWzAhMDgsTjI0OyZFPD5VQTk2KEpQPDVRVDEoOSg6MSAjXyZFLEMwQT5WCi1NIS9cJVxAWDwjK1BCQ1AqKyUiWDMtIF4qIzwsND9AV04lK1xAOUAgVCdaIDchQDhGJ0IoICpQQigiPUxFCi1NTEA4RyMmTCY8UFZNI0s4QCZQRjMjKzgrJyIoNSVeXDNaUEVIIi5MMEUiOj8lXCRFXVE3Myk/SDpEQDFCCi1NJyJARClAUjgpIixGVCE4Tyk7TC0mIC9AKF4kPkAwNz4lMDQ5TkEuNiFTVCNIITBCIDg4Nj4iKSsiIzAqCi1NPTAlKiQlKDc9UDAoKCo8Jz8wUlAoSCAxMyIyWSRVKDY/QS8tIDhAKE1QJTopLyAoUDBDWCRZXEFGUC4uCi1NIUZEQlogRispI0AjIEBEViE/JDNSUEhKIC0wNjNQI1AmJlhAJ1EgLCQ3QEYkUEMmKF9YMERAVCInO1RFCi1NPTE9NyBUVDxVUigrJENYOE0wX0IpLkBGXiBZRSRDPCMsUUFPKFZANFwwKj0hIyBFNFImUiJQJDVfUiBQCi1NIyQkLi4hJSkhQjAoNTBHOiIoXDw/QFZIJSc8JSJQTjEiRlRCISI3WiMwPC0vICEtIi1UQFghXzIlLjApCi1NMiIuSCQiXCIoMCcjIlwwNkwgVj4oTlA2MzAtUSdMQCJLUVRfJVssLkIgVlolSTgvM1InXidDQC05MSAiCi1NIkdYPFhBJ1YgO1w7SyFaNSRBJCBbUTpTIFNYIyJSLUElOkBBMyEnISJeSEQ0MVs9KEEsQyRQVlEmIFAlCi1NSjA6MyM9RCFNMDkkIEkkJi5CJjElSEw3JDBdSCFHTDdBIDRAIEMgMz9BLVUnV1g4QVFaNigxVCZGQSwmCi1NICAkI1QgNiMpS1xBQzFfViU1WDBNMCRWJy1QKyJRRkEkRSQuJ1EoPCkvJDMiQEdLJVVMLjkxWy8iKDwtCi1NRVI7RyM8PC4wIixNJjlIIyUwTkskR0hGWSFZOSUsIC02UDNRIlksPyxRKFEgWlA0NFFNKiQ+XD9dUC1CCi1NIjBIMy0gR0IiQiAnVkFGXCYgOClIMEhSJz8gQVxANC4kPVA+WEBJXiAkTD1KUEldKENIQD1BVT4jUjgtCi1NLUFdQylQOCU9UDVZJzFUICIwUSAnQFAjL1BZXiFTPDVKUFNdJCYkJ1RCJ1IgLiwlJiBUTig4WDBcISU8Ci1NJ0pQOFxCMiEmO0Q6PkBfNyVMJCJZMiQhJT00J0owLT4hKzwyXiFTWCQ1KD9WMEVBJTRIJU0hNSsjOkQxCi1NIzI7Uyg5KCYmQDI8J0dcNzggIi0oJkw3IVEjXCQvOEU6IUY0JF9YM0RBXiQgQUxDPUFWOyE+PCpeIUQtCi1NI1VYL1AwOFAkISg+UlFfSyNVODxBICUzJF88QydCJzwgI1wjQCBWKCBTUC9KUjE6IDJILVhBIjIgQkQjCi1NUFBYSCA7NDs4QUMwIDhEIUVBWVckMDQ2RCE6TyYhRCs2IFsjIDYkQTMhPlsiSkQzJVFWUiBNODpEMTFMCi1NI148NF5BTDwoJTg4SFEvXCc4RD9AIDskIz5AKkhBUVYoOFBGMTEhPyhZMENTQTpSISpIKU4hQDcoTEQ8Ci1NPSFJXSkoJDpNMSc7JFgsIyBQKi4iOkg1NDE1TyclKDhMIVsyKDU4MVBRSSIiJTwzOiE3LCA6KCEgIEgwCi1NJjZYITEhIy8gTFg6XVFNOyhfSDJOQiknIlo4IFhAKUUnJyQgUFFbVSE7PDFDUTRAKTpQOzAiNUsoUFwkCi1NRlFONyc4SCkkIUhNKE9cM1pBSVshMkgzQlEuSyI7VEYzUFZaISxQJzBQMlUpMlApJFBRISBZPClLUTczCi1NKSkgKjshIiwnWCglPSFKQigzJComUVJeKCpQIztSOi0iLkAjWEE3QCA1WDglQDwkIVpMM0swJy8lUyA/Ci1NTzBLTCM1QDpPIFVPIEZQKk1RUFAiNlQ4OEFCWSM8XCtaIjdUI1A8KUZSOzspRVw2WUAqTCRbTCY4MVElCi1NI18oJDQwXSknXSwyJSBERiRcUEBPMTooKDMwRSwgUCohWUQjSzAzPiFaQCtTQTI8JjkwMEYhWzUnRiAkCi1NVlI0IiJfPEEmQEZcIUdYP1QiOEglTzgtXiA1USdTLCQ8QDFAI0EoL1pRUjogVFwlK1AvIyBCODo5QVhUCi1NJ1ssMFMhUUkiX0RCW0FYMSYiLDI/MismIVcsRDYwLCQjJTwyX0IxQSdSQCAgMVlAJUFIJV5CIF0hLUQ6Ci1NXFFZKSBJUEAsQEo1JSw4OSNBLlcmSjgtL0EqISUwNC9RIjYsJzBQL0hBOC8hUDwhS1FGUSNNWEBbMSNbCi1NJ0JQKDMgXlgoQTgqMzFYXiQtKEY9IFZDKTwoKEkxQScoSUQoN1AzQScgJDdPMixdJEEwNEQhLz8lIkwpCi1NIiFZRydUUCpdQDQ0JlQwJyhSOikhJTw3ITInISUsMD8sUDdJJTgsK05SL0wnLiApNFBGXiU3PDM9USpGCi1NIy1EOjNSJlkmIVA+QTAgKydQIC4wIU9dKDtYMElQL0olS1hCR0BATiEgXEAjUEslIis4RVIgOzcmJlQhCi1NIUIlVCgyNEFcUFtCJ1VAOEBBWiEjIUQsK1FbMyAuSEE7Qi1eIFEwLU0xN1UmVTxCLFEoICBLMC8lMSZFCi1NIE5ULCMgOkEoNCg2QkIwRyAlOEYhIDxPJV80NjMwT18hUyw1MCFGICUkSEYyMCAwJEBINCcgLkclJFQ3Ci1NPjAtTCgnTDokICpbKEIwKTMgTSIiOCA6IkA9TSE/MENaQUVVJjFQMkkwUjYiIzwgMzBZUCcqRERCIUwuCi1NJjs4M0VRT1knX0whVDE4ISBPSDlCQFQ5KEZAOyJRXjkhODAnWjItXShRUENIQTsuJTRQJlRBQD0mWlQzCi1NRkFPRCg7KDgpMD1fIF4oIzUwU0gjPiA8OTAxPChUSCVBUT5VJ09cMlBRKDMoNDgtSlFJQSZQRDFAUSNaCi1NJSYoQSZATkEnTyAyLSFJUSI0TCpeUTNPKTdARkshSSIpSUxCVVFWQCBKVC0wUjApIlhYIThQRikoTTA9Ci1NUVIxTidSMEBLQV5bJTUoQDUgU14gI0AhXkAwQCFTWCJdQFhOIzEwOCkhQDYgKjQ+VlFSTCUuMERFMS5fCi1NIl9ILT9BPyApR0BFTkFaNyZcMEA7MitbIEFEJi1BMFYiXEA3USI7KiA0TDFSISAhJS8wQiRRRiYlOTQxCi1NPCE6WCk0OCo1MVE/J09YJUFBRjolVTg4REFVWChNKCxMMiooJS0wOD1RQSIkQUxFUEBaMCQ5UDw+UTs3Ci1NJjIoRCwxWyYmLEwhOTBWOiFUUENfQDxZJVNMMi9ROSgkVlRERDInWyQhLDkmUFpQKEFAJktBTSEhUUgmCi1NLDBTVCVYICJGIiNXIEhAQD9BJSclNjwvIzI7PSVXODInIjc9JU4kOTtANkAhPlhATiAzLyVFNCRPUC48Ci1NKSQ4JV0hOiUjRjAhWTAsOSIzKD0yMD9fIFNAJ0kxOFQpKyhEIkIrNCY+SCoxQTIqJStQIFgiOlEiKjwzCi1NRjApMyRMSDxNISw3KTQoNl9RTCUpOEAgLzA1LCFBOCJVQEc6JkdEOyhQUikjMCxBTFFcMCg/PC9YUC5UCi1NJjMoMjpRVy8nUTw+WiEvQihTPD1ZUUpdJzNIKykwWlIlT1AgSzFFLydFMCZRICAiICAgICAgICEgICwgCi1NIUAgKiAgXCAlQCA+ICI8ICwwIFwgJEQgNVAhRiAnOCBBUCI6ICpYIFBQIzkgLyAhIjAkQyAzWCE2QCVXCi1NIDk4IU1AJzcgP0QiJyApISBGPCJDQCpWIE1cIyJALFYgViwjRDAvICBfJCQoUDE2IShIJE9QM1YhMlglCi1NOVA2QSE9VCYmQDk4IUk8JlVQPDkhVVAnSCA/RSIiTCg8UEJcIjA4KTQwRj0iPkwqLkBKKiJNTCsrME4hCi1NICAgICAgICAgICBaKCAhNTtGTU47Vz1OKCY1UjxGXVIgIEggICAgICAgICAgSi9UICAqQ18gICJJIDggCi1NIEowQCAgKkQsICAiSSRAICBKMTIgICpEOyAgIkknWCAgSjIwICAqREggICJJKlAgIEoyXiAgKkRUICAiCi1NSS4oICBKM04gICpFISAgIkkxICAgSjQ8ICAqRStAICJJM1QgIEo1LSAgKkU3ICAiSTZUICBKNiEgICpFCi1NRTAgIkk7MCAgSjcjICAqRVRAICJJPkggIEo3VyAgKkYjMCAiSUFQICBKOEggICpGLlAgIklEUCAgSjlCCi1NICAqRj8gICJJSUggIEo6WSAgKkZVQCAiSU48ICBKPCYgICpHKVAgIklTWCAgSj04ICAqRz5AICJJWUAgCi1NIEo/KCAgKkdXUCAiSV9YICBKQC4gICpIKTAgIkokRCAgSkFKICAqSEBQICJKKVQgIEpCWSAgKkhUMCAiCi1NSi8oICBKRDQgICpJKjAgIkozUCAgSkU+ICAqSTwwICJKN1ggIEpGMiAgKklJQCAiSjtEICBKRyggICpJCi1NVyAgIko/KCAgSkg0ICAqSiogICJKQzggIEpJLiAgKko6MCAiSkdQICBKSi8gICpKTFAgIkpMVCAgSktLCi1NICAqSl8gICJKUSggIEpMQyAgKkssQCAiSlRYICBKTT0gICpLPCAgIkpXUCAgSk4zICAgIDZUNVI8Rl1SCi1NKCMgIDNGXVQoJl1XO0Y1UiAkWU8oJy1VOFZAQDlGRUw5MiFPPEIhRDo3KUU4VzFPPEdEIDNGXEA8VzVDCi1NOiIhUDxGXUM5Ny1TICRFTj0mNVI8RzVQPSY1RCgnLVk8VzFFOzIhQzg2UUwgJERPM1IhRTxHKU88QCEuCi1NO1IhUz02LUgoJjFFPUZFQzkyIU88QiFBOSYxUjk3LVMgJCVSOVIhTDo3LVQoJzFPO1IhTDtWWUcgJDVYCi1NOTYsQDlGXVI7NiVUKCY1UjxGXVIgJClBOSIhRjo2UUUoJllVOzYpRTxAIS47UiFDOiZFTDknKUU7QCEuCi1NO1IhTTtXKUUoJyFSO1YtRTxXLUU8UCEuO1cwQDk2WU89Nj1IKCZVRTs2XVI+MCEwOTcpTTo3LVM6Nl1OCi1NKCYxRTtGRUU5ICEiODYwQDg2MUQ8RjVTPFAhIjsmXUM6UiFEOTc5SThWNEA8RjVRPTZFUjk2MCAxJjVWCi1NOjYtRSgmKVU8V0QgMUZFTDkyIUU+JkVTPScsIDBXKU88VyxNOSY1Vjo2LUUoJlFJO0ZMIDNGXEA8VzVDCi1NOiIhRDk3OUk4VjQgM0ZdVCgmJEA5JkVSOTYtVDtXKVkgJEVTKCYkQDkmRVI5Ni1UO1cpWSAkRU49RiVMCi1NOjYwQDg3KUc9NlVFO0cwIDFGRUw5MiFUODYpTDkyIU89RjVSOUZRTz1QITQ7VlxAOzYlTj4yIU88JjVOCi1NKCY5STsmNVMgJEVOODchUDxGXVA8RkVBPSY0QDo2XUM9JlBAOUZdUigmMUU9RkVDOTAhNDk3QVQoJjlJCi1NOyY0QDhHNVM+MCEmOjZRRSgnMU87UiFMODcpRzkwIS47UiFTPCYlQzkyIUw5NjlUKCZdTigmMUU9RkVDCi1NOTAhKTsmUUU5ViVMKCctRTk2TCA0RjVBOSJVTztGUVkoJjlJOyY0QDxXRVM9JjVNICUxTztSIU04NllZCi1NKCZRSTtGTVMgJClSO1ZNRTtCIVA6NyFFICQlUjlXNU05NllUKCcxTztSIUw4NylHOTAhMjk3LVU7JzBACi1NPSZdTygmUUE8Rj1FICRdUDk3KUE9JkVPO0IhVztXNUw5IiFCOyZdQzpQIS88JjVSODcxSTtWWEA7Rl1XCi1NKCZFTignIVI7Vj1SOTctUyAkXVA5NylBPSZFTztCIUE7JylFODYxWSgmRU4oJyFSO1Y9Ujk3LVMgJS1PCi1NOFZNRT0iIU88JjVSODcxSTtWWEA7VlhAO0ZdTis3LU84Vk1FPSAhJDk3LVQ6NllBPSZFTztCIUE5JjFSCi1NOTctUygnKUU8NzVJPEY1RCAkVUU8Vy1BOVY0QD0mXU8oJlFPO0Y8IDQnKU89Jl1DO1ZQQD1XKU87RjxACi1NPSdFUDkyIUY7VyhAPFZdQzpWNVQgJF1QPSZFTztCIU47VzBAPFc1UDwmXVI9JjVEKCYpWSgnIVI7VzFPCi1NOFZdTCAlIVI7VzFPOFZdTCgmWU89IiFTPTchUDtXKVQ5NjAgNFZdQzpWNVQoJzFZPCY0QDtGXVQoJy1VCi1NPCchTzxHMUU5ICEvPCY1Ujg3MUk7VlhAO0ZdVCgnLVU8JyFPPEcxRTkiIU87QiFTO1YtSzk3MCA0JylPCi1NPSZdQztWUEA5RiVNOjZRWSgmWU89IiFTPTchUDtXKVQ5NjAgMDYxRDxGNVM8UiFGODZVSTsnREA7Rl1UCi1NKCctVTwnIU88RzFFOSIhQj4yIVA8Rl1UO1YtTzsiIUY4NlVJOydEIDA2MUQ8RjVTPFIhQTsnKUU4NjFZCi1NKCZFTignNVM5MCEjODZYRz0iIUE8Vy1JOVZYQDxGNVE9NjVTPSY1RCgmJUQ5JylFPFcsIDNGNVQ9Vl1SCi1NOlIhSTxSIUQ7Vz1OICRZRT0nPU88RkxAOjcsQD02WVI5NiVDOiYlQjsmNCAzRjVUPVZdUjpSIUQ8Rl1QCi1NPCY1RCgmLU87RllFOFcxSTtWWEA7VlhAPEY1Uzk3MCA0Vl1GPSc9QTxGNEA4ViVVPFY1RCgmLU87RllFCi1NOFcxSTtWWEA4NilPPEcwIDBWXU47RjVDPSZFTztCIVI5Ny1FPSIhQj4yIVA5NjVSICRZTygmKVU5RjlFCi1NPEIhUzwmJUM5MiFBPUYlSTsmJUI7JjQgNFZdQzpWNVQoJkVTKCYlTDxGNUE5J0RAOFZdTjtGNUM9JjVECi1NICUtTzhWTUU9IiFJPFIhTjtXMEA4Vl1OO0Y1Qz0mNUQgJC1BO0I9VCgnLUU7RjBAODY5VDk3KEA8Vl1DCi1NOlY1VCgnLUg9NzFEO1c9TiAlMU87UiFNODZZWSgnKUU5RjVSOTZZQzk3LFooJi1BO0I9VCgnLVA7JkVDCi1NOTAhIztWWU45Ni1UOjZdTignMUk7NjVEKCZdVT0gISM7VllOOTYtVDo2XU4oJylFOUc1Uzk2MCA1Jl1PCi1NKCZVQTtHREA7JjVWOTZRUygmXUYoJy1ZOzYpTzsmRUMoJlFJO0ZNUyAkOUk7JjRAO0YlTTkyIVQ7VlxACi1NOyZdTjlQISg7Vy1UKCZFUygmMU89VlggMiZdUz0iIUk8UiFVO0cpRTg2LUg4NilMOTAhJDo3KUU4VzFPCi1NPEdEQDtGXVQoJjVNPCcxWSAlMU87UiFNODZZWSgnIVI7Vi1FPFctRTxQITQ7VlxAOzYlTj4yIVU8VjVSCi1NPFAhJDo3LUMoJyVVO1cxQSgmNVg4VjVFOSY1RCAlLVQ4NlFFKCRZJjRSIUY6NlFFKCZBQTtGMUw5MCE0Ci1NO1ZcQDs2JU4+MiFMOTc5RTsnLEA7VjhAPEY1TTtXMUUoJkVOKCchQT0mQCAzRl1UKCYkQDxXMVI5NiVNCi1NKCYxRT1GRUM5MCE0OjZVRTxCIUU+JyFJPEY1RCAkXVU9IiFPOUIhUz0nKUU4NlRAPEY1UztXNVI4VjVTCi1NICRZTygmVUU8Vy1BOVY0QDtWOEA5JjVTOjcpRTkiIVQ+NyFFICRZTz0iIUEoJjFBPSYkQDs2NVM8ViVHCi1NOTAhKTkmNU49JkVGOjY1UignKUU7Nl1WOTYwIDEmNUE5JlFPOFZMQDxWRVQ9NiVUOjZdTigmMUU9JjVDCi1NPSY1RCtWJVY7VkVEOTYwIDNGXEA8RjVDO1cpRCgmUU84Vk1TKCYlVjg2RUw4NilMOTAhLTg2LUg6NllFCi1NKCZFUygmWU89IiFPO0IhVDomNEA7RjVUPVZdUjpQIS84RklFOFcwQDo3LEA8RjVNO1cxRSAkUUk7RkxACi1NOiYlUygmKUU5NlhAPFY1Vjk3KUU5ICEhOSc5RTxHMUk8VjRAOTcpUjtXKEAgJS1SOzZdVTtHMEA5NylSCi1NO1coQCAkLU87NlVVO0ZFQzg3MUk7VlhAOTcpUjtXKEA7VlhAPFY1TjkgITA8Rl1UO1YtTzsiIUU8RylPCi1NPEAhLT02UVQ6NkFPPCIhQT0nMUU7NyFUOTYwIDE0MS81JDEvNSIkQSgyJCA0RjVNO1cxRSgmJUQ5JylFCi1NPFcsQDhWQUE7Rj1FOSAhJj02WUM9JkVPO0IhTjtXMEA6NlVQOyY1TTk2WVQ5NjAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQhICAgICAgICgiICAgICAwISAgICAgICAoSUAgCi1NICAgPSEgICAgICAgKEogICAgIEUhICAgICAgIChKICAgICBUOSAgICAgICAoSiAgICAhNzkgICAgICAgCi1NKEogICAgIT9AICAgICAgICAgICAgICIhQCAgICAgICAgICAgICAiM0AgICAgICAgICAgICAgIlpAICAgCi1NICAgICAgICAgICMzQCAgICAgICAgICAgICAjUUAgICAgICAgICAgICAgJC9AICAgICAgICAgICAgICRJCi1NQCAgICAgICAgICAgICAlK0AgICAgICAgICAgICAgJU5AICAgICAgICAgICAgICYrQCAgICAgICAgICAgCi1NICAmR0AgICAgICAgICAgICAgJllAICAgICAgICAgICAgICcsQCAgICAgICAgICAgICAnREAgICAgICAgCi1NICAgICAgJ1BAICAgICAgICAgICAgIChNQCAgICAgICAgICAgICApOkAgICAgICAgICAgICAgKi5AICAgCi1NICAgICAgICAgICsoQCAgICAgICAgICAgICArU0AgICAgICAgICAgICAgICAxICAgPjAgIChKICAgICAgCi1NMSAgID4wICAoSjAgICAgIDEgICA+MCAgKEpIICAgLEQpICAgICAgIChKICAgICAgMSAgID5AICAoSlggCi1NICAgIDEgICA+QCAgKEsoICAgICAxICAgPkAgIChLQCAgICxTKSAgICAgICAoSlggICAgIDEgICA+UCAgCi1NKEtQICAgICAxICAgPlAgIChMICAgICAgMSAgID5QICAoTDggICAtKikgICAgICAgKEtQICAgICAxICAgCi1NPzAgIChMSCAgICAgMSAgID8wICAoTFggICAgIDEgICA/MCAgKE0wICAgLUMpICAgICAgIChMSCAgICAgCi1NMSAgID9AICAoTUAgICAgIDEgICA/QCAgKE1QICAgICAxICAgP0AgIChOKCAgIC1TKSAgICAgICAoTUAgCi1NICAgIDEgICA/UCAgKE44ICAgICAxICAgP1AgIChOSCAgICAgMSAgID9QICAoTyAgICAuKikgICAgICAgCi1NKE44ICAgICAxICAgQDAgIChPMCAgICAgMSAgIEAwICAoT0AgICAgIDEgICBAMCAgKE9YICAgLkMpICAgCi1NICAgIChPMCAgICAgMSAgIEBAICAoUCggICAgIDEgICBAQCAgKFA4ICAgICAxICAgQEAgIChQUCAgIC5RCi1NKSAgICAgICAoUCggICAgIDEgICBAUCAgKFEgICAgICAxICAgQFAgIChRMCAgICAgMSAgIEBQICAoUUggCi1NICAvJikgICAgICAgKFEgICAgICAxICAgQTAgIChRWCAgICAgMSAgIEEwICAoUiggICAgIDEgICBBMCAgCi1NKFJAICAgLz0pICAgICAgIChRWCAgICAgMSAgIEFAICAoUlAgICAgIDEgICBBQCAgKFMgICAgICAxICAgCi1NQUAgIChTOCAgIC9MKSAgICAgICAoUlAgICAgIDEgICBBUCAgKFNIICAgICAxICAgQVAgIChTWCAgICAgCi1NMSAgIEFQICAoVDAgICAwIikgICAgICAgKFNIICAgICAxICAgQjAgIChUQCAgICAgMSAgIEIwICAoVFAgCi1NICAgIDEgICBCMCAgKFUoICAgMDopICAgICAgIChUQCAgICAgMSAgIEJAICAoVTggICAgIDEgICBCQCAgCi1NKFVIICAgICAxICAgQkAgIChWKCAgIDBLKSAgICAgICAoVTggICAwXUAgICAgICAgICAgICAgMVdAICAgCi1NICAgICAgICAgIDJLQCAgICAgICAgICAgICAzO0AgICAgICAgICAgICAgM01AICAgICAgICAgICAgIDQ0Ci1NQCAgICAgICAgICAgICA0UEAgICAgICAgICAgICAgNS5AICAgICAgICAgICAgIDVKQCAgICAgICAgICAgCi1NICA1V0AgICAgICAgICAgICAgICAxICAgTEAgIChWOCAgICAgMSAgIE0wICAoVyAgICAgIDEgICBNQCAgCi1NKFc4ICAgICAxICAgTVAgIChXWCAgICAgMSAgIE4wICAoWDggICAgIDEgICBOQCAgKFhYICAgICAxICAgCi1NTlAgIChZOCAgICAgMSAgIE8wICAoWVggICAgIDEgICBPQCAgKFo4ICAgICAxICAgT1AgIChaWCAgICAgCi1NMSAgIFAwICAoWzggICAgIDEgICBQQCAgKFtYICAgICAxICAgUFAgIChcOCAgICAgMSAgIFEwICAoXFggCi1NICAgIDEgICBRQCAgKF1AICAgICAxICAgUjAgICheQCAgICAgMSAgIFJAICAoXyggICAgIDEgICBSUCAgCi1NKF9QICAgICAxICAgUzAgICkgOCAgICAgMSAgIFNAICApISAgICAgIDEgICBTUCAgKSFIICAgICAxICAgCi1NVDAgICkiMCAgICAgMSAgIFRAICApIlggICAgIDEgICBUUCAgKSNAICAgICAxICAgVTAgICkkKCAgICAgCi1NMSAgIFVAICApJFAgICAgIDEgICBVUCAgKSU4ICAgICAxICAgVjAgICkmICAgICAgMSAgIFZAICApJkggCi1NICAgIDEgICBXICAgKSdYICAgICAxICAgVzAgICkoQCAgICAgMSAgIFdAICApKSggICAgIDEgICBYICAgCi1NKSlQICAgICAxICAgWDAgICkqOCAgICAgMSAgIFhAICApKyAgICAgIDEgICBZICAgKStIICAgICAxICAgCi1NWTAgICksMCAgICAgMSAgIFlAICApLFggICAgIDEgICBaICAgKS1AICAgICAxICAgWjAgICkuKCAgICAgCi1NMSAgIFpAICApLlAgICAgIDEgICBbICAgKS84ICAgICAxICAgWzAgICkwICAgICAgMSAgIFtQICApMEggCi1NICAgIDEgICBcICAgKTEoICAgICAxICAgXDAgICkxQCAgICAgMSAgIFxAICApMiAgICAgIDEgICBdICAgCi1NKTI4ICAgICAxICAgXUAgICkzICAgICAgMSAgIF1QICApM0ggICAgIDEgICBdUCAgKTNIICAgNkQpICAgCi1NICAgIChWOCAgIDZMKCAgICAgICAgICAgICA2ViggICAgICAgICAgICAgNygoICAgICAgICAgICAgIDc8Ci1NKCAgICAgICAgICAgICA3RyggICAgICAgICAgICAgN1koICAgICAgICAgICAgIDgtKCAgICAgICAgICAgCi1NICA4NiggICAgICAgICAgICAgOEYoICAgICAgICAgICAgIDhYKCAgICAgICAgICAgICA5IiggICAgICAgCi1NICAgICAgOTMoICAgICAgICAgICAgIDlGKCAgICAgICAgICAgICA5UiggICAgICAgICAgICAgOV8oICAgCi1NICAgICAgICAgIDo6KCAgICAgICAgICAgICA6XSggICAgICAgICAgICAgO0IoICAgICAgICAgICAgIDteCi1NKCAgICAgICAgICAgICA8NyggICAgICAgICAgICAgPFwoICAgICAgICAgICAgID02KCAgICAgICAgICAgCi1NICA9TSggICAgICAgICAgICAgPjAoICAgICAgICAgICAgID5LKCAgICAgICAgICAgICA/IyggICAgICAgCi1NICAgICAgP0coICAgICAgICAgICAgIEAkKCAgICAgICAgICAgICBAQiggICAgICAgICAgICAgQFgoICAgCi1NICAgICAgICAgIEE2KCAgICAgICAgICAgICBBViggICAgICAgICAgICAgQi0oICAgICAgICAgICAgIEJICi1NKCAgICAgICAgICAgICBDKCggICAgICAgICAgICAgQz0oICAgICAgICAgICAgIENWKCAgICAgICAgICAgCi1NICBENCggICAgICAgICAgICAgREooICAgICAgICAgICAgIEUkKCAgICAgICAgICAgICBFQyggICAgICAgCi1NICAgICAgRVsoICAgICAgICAgICAgIEY0KCAgICAgICAgICAgICBGQiggICAgICAgICAgICAgR0AoICAgCi1NICAgICAgICAgIEgtKCAgICAgICAgICAgICBJISggICAgICAgICAgICAgSS0oICAgICAgICAgICAgIEooCi1NKCAgICAgICAgICAgICBKUyggICAgICAgICAgICAgS0QoICAgICAgICAgICAgIEtPKCAgICAgICAgICAgCi1NICBLWiggICAgICAgICAgICAgTD4oICAgICAgICAgICAgIExNKCAgICAgICAgICAgICBNKyggICAgICAgCi1NICAgICAgTTkhICAgICAgICk0ICAgIE1CISAgICAgICApNCAgICBNUTkgICAgICAgKTQgICAgTjo5ICAgCi1NICAgICk0ICAgIE5TQCAgICAgICAgICAgICBPNUAgICAgICAgICAgICAgT0dAICAgICAgICAgICAgIFAuCi1NQCAgICAgICAgICAgICBQR0AgICAgICAgICAgICAgUSVAICAgICAgICAgICAgIFFDQCAgICAgICAgICAgCi1NICBRXUAgICAgICAgICAgICAgUj9AICAgICAgICAgICAgIFMiQCAgICAgICAgICAgICBTP0AgICAgICAgCi1NICAgICAgU1tAICAgICAgICAgICAgIFQtQCAgICAgICAgICAgICBUQEAgICAgICAgICAgICAgVFhAICAgCi1NICAgICAgICAgIFUkQCAgICAgICAgICAgICBWIkAgICAgICAgICAgICAgVyZAICAgICAgICAgICAgIFg0Ci1NQCAgICAgICAgICAgICBZK0AgICAgICAgICAgICAgWThAICAgICAgICAgICAgIFlCQCAgICAgICAgICAgCi1NICBZTUAgICAgICAgICAgICAgWjZAICAgICAgICAgICAgIFpcQCAgICAgICAgICAgICBbMSkgICAgICAgCi1NKTQgICAgW0coICAgICAgICAgICAgIFteKSAgICAgICApOCAgICBcNCFAICAgICAiICNQICAgXEMpICAgCi1NICAgICk6WCAgIFxOISAgICAgICApPEAgICBcViEgICAgICAgKTxAICAgXSU5ICAgICAgICk8QCAgIF1OCi1NOSAgICAgICApPEAgICBeJ0AgICAgICAgICAgICAgXklAICAgICAgICAgICAgIF5bQCAgICAgICAgICAgCi1NICBfQkAgICAgICAgICAgICAgX1tAICAgICAgICAgICAgISA5QCAgICAgICAgICAgICEgV0AgICAgICAgCi1NICAgICAhITFAICAgICAgICAgICAgISFTQCAgICAgICAgICAgICEiNkAgICAgICAgICAgICAhIlNAICAgCi1NICAgICAgICAgISMvQCAgICAgICAgICAgICEjQUAgICAgICAgICAgICAhI1RAICAgICAgICAgICAgISQsCi1NQCAgICAgICAgICAgICEkOEAgICAgICAgICAgICAhJTZAICAgICAgICAgICAgISY6QCAgICAgICAgICAgCi1NICEnSEAgICAgICAgICAgICAhKD9AICAgICAgICAgICAgIShMQCAgICAgICAgICAgICEoVkAgICAgICAgCi1NICAgICAhKSFAICAgICAgICAgICAgISlKQCAgICAgICAgICAgICEqMEAgICAgICAgICAgICAhKkUoICAgCi1NICAgICAgICAgISpZKCAgICAgICAgICAgICErNiggICAgICAgICAgICAhK0ghICAgICAgICk8QCAgIStMCi1NOSAgICAgICApPEAgICAgIDEgI19fUCAgKTxAICAhK1MhICAgICAgICk8QCAgIStdISAgICAgICApRCAgCi1NICEsJCEgICAgICAgKUhAICAhLC4hICAgICAgIClMQCAgISw2ISAgICAgICApTEAgICEsOiEgICAgICAgCi1NKU1AICAhLEIhICAgICAgIClOICAgISxLISAgICAgICApTyAgICEsUyEgICAgICAgKU8gICAhLFwhICAgCi1NICAgICpWQCAgIS0rISAgICAgICAqXEAgICEtMyEgICAgICAgKl0gICAhLUAhICAgICAgICpdICAgIS1KCi1NISAgICAgICArNEAgICEtUyEgICAgICAgLTcgICAhLVwhICAgICAgIC06QCAgIS4mISAgICAgICAtWiAgCi1NICEuLCEgICAgICAgLVogICAhLjUhICAgICAgIC4nICAgIS49ISAgICAgICAuJyAgICEuQSEgICAgICAgCi1NLiggICAhLkkhICAgICAgIC4oICAgIS5NISAgICAgICAuKSAgICEuXSEgICAgICAgLikgICAhLyEhICAgCi1NICAgIC4qICAgIS8vISAgICAgICAuKiAgICEvMyEgICAgICAgLisgICAhLzshICAgICAgIC4rICAgIS8/Ci1NISAgICAgICAuLCAgICEvSiEgICAgICAgLiwgICAhL04hICAgICAgIC4tICAgIS9bISAgICAgICAuLSAgCi1NICEvXyEgICAgICAgLi4gICAhMCYhICAgICAgIC4xQCAgITAxISAgICAgICAuNiAgICEwOyEgICAgICAgCi1NLjcgICAhMEUhICAgICAgIC5BQCAgITBQISAgICAgICAuQyAgICEwWCEgICAgICAgLkcgICAhMSIhICAgCi1NICAgIC8wQCAgITEqISAgICAgICAvOSAgICExMyEgICAgICAgLz4gICAhMTwhICAgICAgIDNfQCAgITFJCi1NISAgICAgICAzX0AgICExUSEgICAgICAgNCNAICAhMVohICAgICAgIDQpICAgITIjISAgICAgICA0KyAgCi1NICEyKiEgICAgICAgNDVAICAhMjMhICAgICAgIDRIQCAgITI8ISAgICAgICA0S0AgICEySCEgICAgICAgCi1NODBAICAhMlEhICAgICAgIDgyQCAgITJaISAgICAgICA4NUAgICEzIyEgICAgICAgODkgICAhMywhICAgCi1NICAgIDg/QCAgITM3ISAgICAgICA4XUAgICEzQiEgICAgICAgOUIgICAhM1EhICAgICAgIDxWQCAgITQgCi1NISAgICAgICA+KSAgICE0KiEgICAgICAgPj9AICAhNDUhICAgICAgID5KQCAgITREISAgICAgICBAKyAgCi1NICE0UyEgICAgICAgQicgICAhNF8hICAgICAgIEJJICAgITUmISAgICAgICBCSSAgICE1KiEgICAgICAgCi1NQkogICAhNTMhICAgICAgIEJPICAgITU9ISAgICAgICBCUyAgICE1RCEgICAgICAgQlMgICAhNUghICAgCi1NICAgIEJUICAgITVRISAgICAgICBCXSAgICE1WiEgICAgICAgQl9AICAhNiMhICAgICAgIEMhICAgITYrCi1NISAgICAgICBDJyAgICE2NCEgICAgICAgQy4gICAhNj0hICAgICAgIEMwQCAgITZHISAgICAgICBDNCAgCi1NICE2VCEgICAgICAgQzQgICAhNyMhICAgICAgIEM0ICAgITcsISAgICAgICBDNCAgICE3MCEgICAgICAgCi1NQzUgICAhNzkhICAgICAgIEM+QCAgITdAISAgICAgICBDPkAgICE3RCEgICAgICAgQz9AICAhN04hICAgCi1NICAgIENKICAgITdXISAgICAgICBDSiAgICE4ICEgICAgICAgQ0ogICAhOCQhICAgICAgIENLICAgITgoCi1NOSAgICAgICBDSyAgICAgIDEgI19fUCAgQ0sgICAhOC8hMCAjSCAgIClEICAgITg1IFAgICAgICAgICAgCi1NICE4PyEwICUjQCAgKCIgICAhOEUhMCAgICAgIChWOCAgIThLITAgIzhAICAoSUAgICE4VyEwICZYQCAgCi1NKU1AICAhOF4hUCAlPEAgIiAgICAgITknITAgJDAgICApPEAgICE5LyEwICNJICAgKElAICAhOTshMCAgCi1NICAgIChKICAgITlIITAgICAgICAoSlggICE5XCEwICAgICAgKEtQICAhOjIhMCAgICAgIChMSCAgITpACi1NITAgICAgICAoTUAgICE6VSEwICAgICAgKE44ICAhOywhMCAgICAgIChPMCAgITs4ITAgICAgICAoUCggCi1NICE7SyEwICAgICAgKFEgICAhPCAhMCAgICAgIChRWCAgITwtITAgICAgICAoUlAgICE8QSEwICAgICAgCi1NKFNIICAhPFchMCAgICAgIChUQCAgIT0lITAgICAgICAoVTggICE9NCEwICAgICAgKTpYICAhPTwiMCAgCi1NICAgIkwlICAgIT1EIjAgICAgICJMJSggICE9UyIwICAgICAiTCUwICAhPiQiMCAgICAgIkwlOCAgIT4tCi1NIjAgICAgICJMJUAgICE+PSIwICAgICAiTCVIICAhPk8iMCAgICAgIkwlUCAgIT5WIjAgICAgICJMJiAgCi1NICE/JCIwICAgICAiTCYwICAhPzQiMCAgICAgIkwmQCAgIT88IjAgICAgICJMJlAgICE/SyIwICAgICAiCi1NTCcgICAhP1wiMCAgICAgIkwnMCAgIUAlIjAgICAgICJMJ0AgICFALyIwICAgICAiTCggICAhQD0iMCAgCi1NICAgIkwoKCAgIUBSIjAgICAgICJMKDAgICFBKSIwICAgICAiTChAICAhQTgiMCAgICAgIkwoUCAgIUFOCi1NIjAgICAgICJMKSAgICFCJiIwICAgICAiTClAICAhQjMiMCAgICAgIkwqICAgIUJHIjAgICAgICJMKkAgCi1NICFCXSIwICAgICAiTCsgICAhQysiMCAgICAgIkwrQCAgIUNAIjAgICAgICJMLCAgICFDVyIwICAgICAiCi1NTCxAICAhRCYiMCAgICAgIkwtICAgIUQ2IjAgICAgICJMLiAgICFERiIwICAgICAiTC4wICAhRF0iMCAgCi1NICAgIkwuQCAgIUU2IjAgICAgICJMLlAgICFFRyIwICAgICAiTC8gICAhRV8iMCAgICAgIkwvMCAgIUY5Ci1NIjAgICAgICJML0AgICFGSCIwICAgICAiTC9QICAhRl4iMCAgICAgIkwwICAgIUc2IjAgICAgICJMMDAgCi1NICFHRiIwICAgICAiTDBAICAhR10iMCAgICAgIkwwUCAgIUg2IjAgICAgICJMMSAgICFIRyIwICAgICAiCi1NTDEwICAhSFkiMCAgICAgIkwxQCAgIUkiIjAgICAgICJMMVAgICFJLiIwICAgICAiTDIgICAhSTkiMCAgCi1NICAgIkwyMCAgIUlCIjAgICAgICJMMkAgICFJSiIwICAgICAiTDMgICAhSVIiMCAgICAgIkw8ICAgIUlbCi1NIjAgICAgICJMPEAgICFKJSIwICAgICAiTD0gICAhSjAiMCAgICAgIkw/ICAgIUo7ITAgICAgICApNCAgCi1NICFKTiIwICAgICAiTEBAICAhSl0hUCAgICAgIiAjQCAgIUsuIVAgICAgICIgJCAgICFLQCEwICAgICAgCi1NKTggICAhS1MiMCAgICAgIkxBICAgIUwiITAgJj0gICApSEAgICFMKyEwICAgICAgKUxYICAhTDIhMCAmCi1NWTAgICk8QCAgIUw+ITAgIj4gICAqXEAgICFMRCEwICUmQCAgKlZAICAhTFEhMCAjRUAgIClPICAgIUxbCi1NIjAgJ0IwICJMQUAgICFNKyEwICZKUCAgK1BAICAhTTMhMCAoJyAgIClOICAgIU06IVAgJ0VQICIgJDAgCi1NICFNQSEwICRXMCAgKj44ICAhTUohMCAiOUAgIClfICAgIU1TITAgIz4wICAsIVggICFNWSFQICVeQCAiCi1NIEkwICAhTiEhMCAmMyAgIClZMCAgIU4pITAgJDkgICAqSCggICFOMyEwICAvQCAgKjYoICAhTj0hMCAgCi1NICAgIC4oOCAgIU5EITAgJSlQICAqVCAgICFOTiEwICAgICAgLic4ICAhTlUhMCAnLFAgIC03ICAgIU5dCi1NITAgJiAwICApUDggICFPJSEwICU6MCAgLVIgICAhTy0iMCAjKCAgIkpaUCAgIU8zIVAgIzxAICIgJFAgCi1NICFPPiEwICQ1MCAgKl5AICAhT0ghUCAmQFAgIiAlQCAgIU9aIVAgJTUwICIgJiAgICFQISFQICZKMCAiCi1NICYwICAhUCohUCAjUlAgIiAlUCAgIVA7IVAgIz9AICIgJTAgICFQTCFQICY7UCAiICUgICAhUF8hMCAnCi1NVVAgIC1aICAgIVEnITAgIy4gICAqXSAgICFRMyEwICVJICAgLjcgICAhUTwhMCAkKjAgIC5DICAgIVFECi1NITAgIkxAICAuQUAgICFRTiIwICNKICAiTEFQICAhUVwhUCAjK0AgIiBJUCAgIVIiITAgJi1QICAsOEggCi1NICFSKyEwICNQMCAgLi4gICAhUjEhMCAgICAgIC4qOCAgIVI+ITAgJlwwICAvMEAgICFSRSFQICNQQCAiCi1NICtAICAhUk4hUCAjMzAgIiAnICAgIVJaIVAgJyxAICIgKyAgICFTISFQICJIQCAiICswICAhUyohMCAgCi1NICAgIC4rOCAgIVMxITAgJD9AICAtOkAgICFTOyEwICAgICAgLik4ICAhU0ohMCAiSFAgIC1DUCAgIVNYCi1NITAgJDVQICAtTSggICFUJCEwICU6UCAgLzkgICAhVCwiMCAnP1AgIkxCICAgIVQ2ITAgICAgICAuLTggCi1NICFUQiEwICc+ICAgLjFAICAhVE0hMCAjSFAgIC42OCAgIVRWITAgICAgICAuLDggICFVICIwICAgICAiCi1NTFRQICAhVSUhUCAgLzAgIiExUCAgIVUsITAgICowICAuRyAgICFVNCEwICRVMCAgLktAICAhVT8hMCAiCi1NP0AgIC8+ICAgIVVIIjAgI15AICJMSiAgICFVUSFQICg+UCAiIT0wICAhVVshMCAnPlAgIDNfQCAgIVYiCi1NITAgJl5QICAvPFAgICFWKSEwICM8MCAgNCsgICAhVi8hMCAgNUAgIDg1QCAgIVY3IVAgIlFQICIhPVAgCi1NICFWQCEwICZUICAgNEhAICAhVkghMCAnIyAgIDQjQCAgIVZQITAgISZAICBCNDggICFWWyEwIChCICAgCi1NOExYICAhVyUhMCAgIkAgIDgwQCAgIVctITAgJTQgICA3QzggICFXOSEwICNfICAgMy5IICAhV0QhMCAgCi1NKSAgIDQpICAgIVdMITAgJVFQICA+KSAgICFXXiEwICFGQCAgQkNQICAhWCkhMCAgOkAgIDk6WCAgIVgzCi1NITAgIEZAICBCJyAgICFYPiEwICgiICAgOD9AICAhWEghMCAiJTAgIDNHWCAgIVhRIFAgJDZeICAgICAgCi1NICFYWyEwICZcICAgND5AICAhWSQhMCAmKEAgIDRDKCAgIVktITAgJVEwICA0RiggICFZNiEwICghMCAgCi1NNEdAICAhWT8iMCAkU0AgIkxKMCAgIVlMITAgJT4gICA0O0AgICFZViEwICZNMCAgND0gICAhWV8hMCAlCi1NVTAgIDRAICAgIVooITAgJyhAICA0NyAgICFaMSEwICYlQCAgNERIICAhWjohMCAmVkAgIDRBQCAgIVpDCi1NITAgJU1QICA0NUAgICFaTCEwICVQICAgNDogICAhWlUhMCAmSUAgIDQ4QCAgIVpeITAgICAgICBCSTggCi1NICFbJCFQICdCQCAiIiQwICAhWyshMCAlUDAgIDVRICAgIVs8IjAgIVkwICJMSyAgICFbRyEwICJfICAgCi1NN0QwICAhW1QhMCAoRyAgIEJdICAgIVtcIjAgJ09QICJMTCAgICFcJiEwICVRUCAgNEtAICAhXDEhMCAgCi1NNTAgIDg5ICAgIVw5ITAgJj4wICA4KSggICFcRyEwICA2UCAgNVcoICAhXFohMCAmWVAgIEJUICAgIV0iCi1NIjAgJVwwICJMTSAgICFdLCEwICAkQCAgODJAICAhXTQhMCAgICAgIEJTOCAgIV06ITAgKDEwICA2WTggCi1NICFdRiEwICAoMCAgQl9AICAhXU4hUCAmWiAgIiFOMCAgIV1eIVAgI1UgICIhUCAgICFeKSEwICY4ICAgCi1NQycgICAhXjEhUCAiNyAgIiIgKCAgIV46ITAgIFNQICBDMEAgICFeQyIwICBIQCAiTFNQICAhXlEiMCAnCi1NPSAgIkxUICAgIV8oIjAgIEgwICJMVDAgICFfQCIwICNEICAiTFRAICAhX1chMCAkRUAgIDxFOCAgIiAqCi1NITAgIz1AICA5P1ggICIgMCEwICZOICAgOF1AICAiIDchMCAoQiAgIDlTICAgIiBSITAgJTcwICA/KzggCi1NICIhKSEwICdeICAgOUIgICAiITghMCAkSCAgIEAzKCAgIiFQITAgJjRAICA6LiggICIiLCEwICNUUCAgCi1NPFZAICAiIjshMCAgMUAgIEJPICAgIiJEITAgITMgICBALSggICIiVSEwICYgICAgP0hIICAiIy0hMCAnCi1NKCAgIEAuWCAgIiNFITAgJVBQICA9N0AgICIjVSEwICQ2UCAgPSwgICAiJCQhMCAlRyAgIDxNMCAgIiQ6Ci1NITAgJ08gICA6W0ggICIkUCEwICZDICAgP1xIICAiJSwhMCAgWFAgID1UMCAgIiU/ITAgJldQICA9SiggCi1NICIlUSEwICQuICAgPTNIICAiJiAhMCAiRyAgID0qSCAgIiYzITAgJyUwICA+P0AgICImOiEwICIqICAgCi1NPixYICAiJlUhMCAgWSAgID40QCAgIicwITAgIUEwICA+RCAgICInRiEwICE4ICAgPkZQICAiJ1whMCAgCi1NMiAgID5AUCAgIiguITAgIDcgICA+SkAgICIoPSEwICMwMCAgPzlAICAiKFEhMCAmKjAgID8lSCAgIiknCi1NITAgKCtQICA/QDAgICIpQiEwICMnICAgPzE4ICAiKVYhMCAmISAgID5dMCAgIiosITAgJSsgICA+VUggCi1NICIqQCEwICVFICAgPk1YICAiKk4hMCAhLiAgID5aOCAgIishITAgIyFAICA+VlggICIrNSEwICYqQCAgCi1NPlIgICAiK0UhMCAkXyAgID5OWCAgIitTITAgJU8gICA/VSAgICIsJCEwICgmICAgQkogICAiLCwhUCAnCi1NWUAgIiwrICAgIixLIVAgI0ogICJCQUggICItLCFQICc4ICAiPUQwICAiLUwhUCAoPEAgIiwpICAgIi4jCi1NIVAgJVggICJCNiggICIuPCFQICg/ICAiPUNAICAiLlQhUCAhTUAgIiJVOCAgIi8lIVAgJFJAICI9SVAgCi1NICIvOCFQICNIQCAiPUJYICAiL0ohUCAmU0AgIiJVMCAgIi9fIVAgJ1tAICI9SUggICIwNiFQICUtICAiCi1NPUJQICAiMEwhMCAjWDAgIEArICAgIjEkITAgJlYgICBDISAgICIxKyFQIChFUCAiPUBAICAiMUIhUCAmCi1NITAgIkg9OCAgIjFbIVAgICBQICI9RzggICIyMyFQICFWUCAiLC0gICAiMkQhUCAkW1AgIkJNKCAgIjJXCi1NIVAgI1FQICI9RSAgICIzKSFQICZcUCAiLCxYICAiMz4hUCAoJFAgIkJNICAgIjNVIVAgJTYwICI9RFggCi1NICI0KyEwICdIQCAgQy4gICAiNDMhMCAgICAgIEM+WCAgIjQ5ITAgJ04gICBDNSAgICI0QSEwICAgICAgCi1NQzQ4ICAiNEkhMCAjO0AgIEM/QCAgIjRSIVAgJVBAICJISDAgICI0XyEwICAgICAgQ0o4ICAiNSchUCAiCi1NRkAgIkhfICAgIjUxITAgICAgICIgICAgICI1OCFQICAgICAiSlpQICAiNT8iMCAgICAgIkxUUCAgIjVFCi1NK1ZRSThCXUM8RzBQK0ZcICtWUUk4Ql0tOFcpVCwyWU8gJj1EOEZVRStGXCA5Vi1DLEVdQztWVVA6NlFFCi1NOSJYICtWLVk5VkVOPSJdUDsmJVkrVjlOOUJdRDk3OU8rVj1EOEcxRTxXME89IyRQK1AhRzkmKU05MllDCi1NICZFTj0jSVQsM1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcuUCFDOiYlUi5HMFIvNyhSCi1NLlMgWywzKFcuUCFMO1ZZRygmRU49I0lULFNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXCi1NLlAhVTtHLUk5VllFOSIhSTtHMFo9IzBdPEMkWywjTE0sM0wgOyZdTjlSIVU7Ry1JOVZZRTkiIUk7RzBaCi1NPSM0XTxDJFssI0xNLDNMIDxWQU88RzBAOjZZVC5HMFYvNyhRLlJUUyxDPFYuI0xTLEM8Vi1TTCA7Jl1OCi1NOVIhTDtWWUcoJkVOPSNJVC1TVVIsM0xQLlJUUS5QIVM6Jl1SPSIhVTtHLUk5VllFOSIhSTtHMFo9I0BdCi1NPEMkWywjTFYtMzRTLTNMIDsmXU45UiFMO1ZZRygnNU48VkVHO0Y1RCgmRU49I0lULjNVUiwzTFAuUlRRCi1NLlAhUzo2PU45NjBAOFZBQTxDSVQsMyBdPEMkWyszJFIuI0xRLEM8WyAnNU48VkVHO0Y1RCgmLUg4NyhaCi1NPSMkUS83KFEuUyBbLEM0VS5QIUY7Jl1BPSNJVCwzKF08QyRbLSNMUC5QIUQ7VzVCOyY0Wj0jJFMvNyhRCi1NLlNAWywjTCA7Jl1OOVIhRDtXNUI7JjRaPSMkVC83KFEuU0BbLCNMID1GXUk5I0lULDM0XSwzNCA9JV1TCi1NPScpVThXMFo1IyRWLzcsUi0nOT84VkFBPEVdTTk2VUI5NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCCi1NOTcoWi1CUFEtQlBRLUNNPCAnOT86NllUN1ZVRTs2KUU8Q0hRKyMsUisjLFIuVzk/OyZdTjlVXU05NlVCCi1NOTcoWixSUFYtIlBTLENNPCAnOT85RlFPODcxPzs2NU04RjVSLkMkUisjRFYrIyxSLlc5PzkmXVU4RlFFCi1NN1ZVRTs2KUU8Q0hRLFJQUSxDQEwtQzBbLlAhVDdXNU46Nl1OLkUwUS1TVVUuJzk/OFZBQTxFXU05NlVCCi1NOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFotQlBQKyMkVi5VUCA9RV1JO0cxPzs2NU04RjVSCi1NLkMkTCwiUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwsIlBTLENNPCAnOT85RlFPODcxPzs2NU04RjVSCi1NLkMkUisjIEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIuQyRTKyMgTC1DMFsuUCFWN1YtSDg3KT85RzVOCi1NOFNJJixAIVY3Vy1JOVZZRTklXUM6JiVSN1Y5VTtGLFoxQyRQICc5Pz02WVM6Nj1OOTYxPzhWQUE8RV1GCi1NPTZZQy5EOFEsMCFWN1ctSDtXKVQ3VjlVO0YsWjFDOCA9RV1TOjY9Tjk2MT88VkFPPEcxPzlHNU44U0kmCi1NLUAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLFoxQ0AgPUVdSTtHMT85RzVOOFNJJiwwIVY3Vy1JCi1NOVZZRTklXUk7RzE/OUc1TjhTSSYsMCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDLkQ4VCAnOT87Jl1OCi1NOVVdRj02WUMuRDhTICc5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFNJJixQIVY3VzVOPFZFRztGNUQ3VlFPCi1NO0Y9PzlHNU44U0kmLTAhVjdWOUw7ViVUN1Y5VTtGLFoxQyRSICc5PzkmXVU4RlFFN1Y5VTtGLFoxQyRTCi1NICZRSTtGTFo1IyRYLzcsUS0zKU45N0FULkMkWS8ySFEuIlBQKyMsUi5WUUk7Rk1GPTZZQy5DKFAvMkhSCi1NLDNVRiwzREwsUyhMLFMoWzcgIVM9JzVGOUNIUixDVUE8QyRbLCNMUC5TKFMvNiVSLDNMUC5TJFssQzBdCi1NODcoUS5TIFssQ0xRLUJQVi0iUFEsMzRSLlNMID0nNT87JkVOOlNJNCxDNF09MyRULSZZRT4nMFosM0RMCi1NLCJQUyxDTUw6NllLOUc1TjhTSFIsIlBQKyMsUi5VUCA8VzFVOUY4WixDKEwsIlBRLDM0Ui5TTCA4Vl1MCi1NO1cpUy5FMFItQ1VFPjY1TDsmXVcuQyBMPCc1UjwmUUUuQyRMPCZFTjpTSFIrI0wgOFYlUjxTSTQsQzxdCi1NOTYpTT1TSFArJyFPPEctQzomNFosMlBbICYpTztWUUU4NlhaPSMoWC82NSYwNFEzMTNIUCslMTI1NDRaCi1NLDJQWyAmKVY4NlFTLkUwUi4zVUU5RiVMPFY0WiwiUVQ8RzVFLkMkTC5QIUI7Vl1MOTYlTixDSVQsQ0QgCi1NOzZFUztXKUQ5NylFOSNJNCxTIF05NzFXO1NIUismXU45M0hRKydJRTxGXFosIlFUOicpRTkzSFMrI0wgCi1NOzYlSTtDSSYsMCFWN1YtSDg3KFoxUyggPUVdUzo2PU45NjE/OFZBQTxDSScsMyAgPUVdVTtHLUk5VllFCi1NOSVdQzomJVIuRDxRLDAhVjdXLUg7VylULkQ8ViAnOT88VkVHO0Y1RDdXLUg7VylULkQ8ViAnOT89NllTCi1NOjY9Tjk2MT88VkFPPEcwWjFTQCA9RV1JO0cwWjFTJCA9RV1TOjY9Tjk2MT86NllULkQ8USAnOT89NllTCi1NOjY9Tjk2MT86NllULkQ8VCAnOT87Jl1OOVNJJyxQIVY3Vy1JOVZZRTklXUw7VllHLkQ8UyAnOT89NllTCi1NOjY9Tjk2MT87Jl1OOVNJJy0wIVY3VjlMO1YlVC5EPFEsQCFWN1YxTz02KUw5M0knLDMsID1FXUM6JiVSCi1NN1YlUjxGJVkuRDxTLDNVQTxDJFssI0xRLlMoID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4zSScsUyhdCi1NODcoUS5TIFssM0xRLCAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RFoxUyxTLzYlUiwzTFAuUyRbCi1NLDMkID1FXVM6Jl1SPSVdQTxHKUE+M0knLFMwXTg3KFEuUyBbLDNMViAnOT88VkVHO0Y1RDdXLUg7VylUCi1NN1YlUjxGJVkuRDxTLSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkuRDxTLTNVQTxDJFssI0xRCi1NLlNAID1FXUk7RzE/ODcpUjg3RFoxUyxWLzYlUiwzTFAuUyRbLDAhVjdXLUk5VllFOSVdSTtHMT84NylSCi1NODdEWjFTLFYgJzk/PTZZUzo2PU45NjE/OjZZVDdWJVI8RiVZLkQ8Uy1TVUE8QyRbLCNMUS5TMCA9RV1MCi1NO1ZZRzdWJVI8RiVZLkQ8Uy4jVUE8QyRbLCNMUS5TLCA9RV1TOjY9Tjk2MT87Jl1OOVVdQTxHKUE+M0knCi1NLFNAID1FXVU7Ry1JOVZZRTklXUw7VllHN1YlUjxGJVkuRDxTLjNVQTxDJFssI0xRLlM0ID1FXUY7Jl1BCi1NPSVdQTxHKUE+M0knLSMgXTg3KFEuUyBbLDNMUSxAIVY3VjFPPTYpTDk1XUE8RylBPjNJJy0jJF04NyhRCi1NLlMgWywzTFEsUCFWN1YtSDg3KT88Jl1JO0cxRTxDSSctIyhdKkMoID1FXVM6Nj1OOTYxPzhWQUE8RV1QCi1NO1ZFTj0mNVIuRDxULFNUSiwzICA9RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoWjFTMFQvMkhRCi1NLDAhVjdXLUg7VylUN1chTzo2WVQ5NyhaMVMwVS8ySFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUCi1NOTcoWjFTMFUgJzk/PTZZUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxDSSctIzhdKkNAID1FXUk7RzE/Ci1NPCZdSTtHMUU8Q0knLSM8XSpDJCA9RV1TOjY9Tjk2MT86NllUN1chTzo2WVQ5NyhaMVMwVyAnOT89NllTCi1NOjY9Tjk2MT86NllUN1chTzo2WVQ5NyhaMVMwWC8ySFQgJzk/OyZdTjlVXVA7VkVOPSY1Ui5EPFQuM1RKCi1NLFAhVjdXLUk5VllFOSVdTDtWWUc3VyFPOjZZVDk3KFoxUzBZICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QCi1NO1ZFTj0mNVIuRDxVLCNUSi0wIVY3VjlMO1YlVDdXIU86NllUOTcoWjFTNFEvMkhRLEAhVjdWMU89NilMCi1NOTVdUDtWRU49JjVSLkQ8VSxDVEosMywgPUVdUz0nKVU4VzBRLkQ8US1AIVY3Vy1UPEc1Qz0jKFoxUzRTCi1NLzcsUi0nOT84VkFBPEVdTTk2VUI5NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWi1CUFEtQlBRCi1NLUNNPCAnOT86NllUN1ZVRTs2KUU8Q0hRKyMsUisjLFIuVzk/OyZdTjlVXU05NlVCOTcoWixSUFYtIlBTCi1NLENNPCAnOT85RlFPODcxPzs2NU04RjVSLkMkUisjRFYrIyxSLlc5PzkmXVU4RlFFN1ZVRTs2KUU8Q0hRCi1NLFJQUSxDQEwtQzBbLlAhVjdXNU46Nl1OLkQ8US1QIVY3VzVOOjZdTixDSSctMzBdPTNBVjdWLUg4Nyk/Ci1NOzY1TThGNVIuQyhMLCJQWC5XOT88VkFPPEcxPzs2NU04RjVSLkM4TCwiUFEtQ008ICc5Pzo2WVQ3VlVFCi1NOzYpRTxDSFErIyBMLFMoWz1FXUw7VllHN1ZVRTs2KUU8Q0hTKyMgTCxTKFs3ICFWN1Y5TDtWJVQ3VlVFCi1NOzYpRTxDSFEsQlBQKyMsUi5XOT85Jl1VOEZRRTdWVUU7NilFPENIUSxSUFArIzhULlNMIDxVXUw6NllLCi1NLkQ8US4wIVU3VlFJO0ZMWjFTKFUgJyFSOjZVQTxHRFoxUzRVLzY1Ujk2MFosIlFHPEY1RTtDSFErJilMCi1NPTY0WixCUFsgJllPO0chUjo2VUE8R0RaMVMoViAmLUw9NllLOTcoWjFTNFYvNjVDOiY1Vj4zSFArJjlPCi1NPEYwWiwyUFsgJy1QO1cpVDxWLUE8Q0knLEM8IDdVXU04NkVOK0ZcIDlWLUMsRV1DO1ZVUDo2UUU5IlggCi1NK1ctRTtGMUE6Ml1BOEYsTzxGRUM6Il1MODcxRTxXME87VilKOSZFUis3LVU7QyxPOVYtQytQIE4rQlxOCi1NK0JdRDk3OU8rVj1DOFJdTDo2KUc4VixSK0YsIDo2WVQuRzBRLzcoUS5SVFIsMzBXLSNAUy1DMFguUyhRCi1NLSM8VC4jLFYtIzxbICYtSDg3KFo9IyhdPEMoWywjTFEsQzxbICZRTztGPEA6NllULkcwUy83KFEuUlRSCi1NLDMwVy0jQFMtQzBYLlMoUS0jPFQuIyxWLSM8WyAnNU48VkVHO0Y1RCgmRU49I0lULSNVUiwzTFAuUlRRCi1NLlAhTDtWWUcoJzVOPFZFRztGNUQoJkVOPSNJVC0zVVIsM0xQLlJUUS5QIVM6Jl1SPSIhSTtHMFo9IzhdCi1NPEMkWyszLFItUzhYLlMsUi1TOFcuUCFMO1ZZRygmUU87RjxAOjZZVC5HMFcvNyhRLlMgWyszJFsgJy1ICi1NO1cpVCgnNU48VkVHO0Y1RCgmRU49I0lULiNVUiwzTFAuUzhVLTMsVS5QIUw7VllHKCZRTztGPEA9NllTCi1NOjY9Tjk2MEA6NllULkcwWS83KFEuUyBbKzMkWyAnLUk5VllFOSIhQzomJVIuRzBRLCNVUiwzTE0sMyhYCi1NLlMkUi1TTCA9NllTOjY9Tjk2MEA4VkFBPENJVCwzJF08QyRbLCNMUi0zNFsgJjlMO1YlVC5HMFEsQ1VSCi1NLDNMVC5TIFsgJjFPPTYpTDkzSVQsMyxdPEMkWy4jTFAuUCFMO1ZZRygmMU89NilMOTNJVCwzMF08QyRbCi1NLiNMUC5QIVY7VkVELkcwUS0zVFEtMCFSOTY9PzhWUUE8VyxaNSMkVi82NS4zVV0yMTQ9My5DIEwzJF0/Ci1NMUUhITdVKSUxVSxaLDJRJjQkJT80RDUnNFNIUiskOTA3VSklMVUsWixSUTwgJDkwN1RdMjdUOTAwNV0yCi1NMTQ9My5DMEwxJCU0MDVdMjE0PTMuQzRMMSQlNDA1XS80RV0mNCQlPzRENSc0U0hWKyQxITUkJT8zVSk/Ci1NMUUhPzRENSc0U0hXKyVQIDEkJTQwNV0vNEVdJjQlXS80RV0mNCQlPzRENSc0U0hYKyQlJDElKT80RDUnCi1NNFNIWSskPSUzRDUyMDRRPzRENSc0U0hRLCJRJzE0WSU0RCUsN1RdMjdUOTAwNV0yMTQ9My5DJFErJVAgCi1NMVQ1LjE1KSEzJV0vNEVdJjQlXTIxND0zLkMkUiskJSwzJV0yMTQ9My5DJFMrJFEpMzVdMjE0PT8wVFEhCi1NNFUtJTRTSFEtIlBbICchVDxGMUk5Rjk/PSNJVCwwIVM6N0lFN1cwWj0jJCA9Vi1IODcpPz0jSVQuICFMCi1NO1ZZRzsmXU45U0k0LDM8XTxTQUg6Nj1ILkMsTCwiUFMsQ01MO1c8WixSUFMsQlBTLENMWyAmUU87Rj0/Ci1NOyZdTjlTSVQsM0BdPTNBUy5DJFcrIyBMLUMwWzsmUFotUlBQKyM4VC5TTCA5RzVOOFVdUD0nKFo9IyRZCi1NLzJIUiwjVUYsMzQgN1VdRDtVXUc7Jl1CODZRPzknMU88RyxaMUMkVSAlXUU+JkVUN1YxVTs2VVk3VylFCi1NOUNJJyxDJF0qQyQgN1VdRDtVXUc7Jl1CODZRPzhXMU88RyxaMUMkVSAlXUk7RkVUOjYlTDo3SUU5IlhQCi1NICVdPzs2JUk7Q0kmLDM0IDdWNVg6NzBOO1AhRzhWLFI3Vi1POzchSTsmNUQrQCBPPFY1TjkmJUkrViVCCi1NOFJdUjo2LUgrVlFBPSY1Uz0iXU84RklEOjcoTTxXNU4sUl1HOFYsTyAiWE4rUlhOK1YxRT1GXE85Vi1DCi1NK1ZRSThGPUM4UyhOOFAhSTtHMFo9IyRdPEMkWyszKFEtIzxULiMsVi0jQFssQyRULVMwWCxTOFQtU0wgCi1NOFZBQTxDSVQsQ1VSLENMUC5TJFItU0wgOyZdTjlSIUk7RzBaPSMsXTxDJFsrMyhRLSM8VC4jLFYtI0BbCi1NLEMkVC1TMFgsUzhULVNMID02WVM6Nj1OOTYwQDo2WVQuRzBULzcoUS5TIFsrMyRbICZRTztGPEA9NllTCi1NOjY9Tjk2MEA6NllULkcwVS83KFEuUyBbKzMkWyAnLUg7VylUKCZFTj0jSVQtQ1VSLDNMTSxTKFctQ0BbCi1NLFMoVy1DPFsgJlFPO0Y8QDsmXU45UiFJO0cwWj0jPF08QyRbLCNMTSwzTCA8VkFPPEcwQD02WVM6Nj1OCi1NOTYwQDo2WVQuRzBYLzcoUS5TIFstQzRVLFM0WyAmUU87RjxAOyZdTjlSIVU7Ry1JOVZZRTkiIUk7RzBaCi1NPSNEXTxDJFssI0xNLDNMIDxWRUc7RjVEKCYtSDg3KFo9IyRQLzcoUS5SVFEsQ0BbLDMoVy5QIVU7Ry1JCi1NOVZZRTkiIUM6JiVSLkcwUSwzVVIsM0xQLlMoVS0zTCA5RlFPODcwWj0jJFIvNyhRLlMwWywjTCA5Jl1VCi1NOEZRRS5HMFEsU1VSLDNMWC5TIFsgJlFPO0Y8QDkmXVU4RlFFLkcwUS0jVVIsM0xYLlMgWyAnOU86NjBaCi1NPSMkVS8zJFUgJylFOVVdQzsmJVM8U0k0LDM4XTk0WS83VSklMVUsWiwiUSwzVV0mNCQlPzRENSc0U0hRCi1NKyQ5MDA1XTIxND0zLkMoTDFFIT80RDUnNFNIUyslUCAxRSE/M1UpPzFFISE3VSklMVUsWi0iUSQwNTEhCi1NN1UpJTFVLFotMlEkMDUxITdUXTI3VDkwMDVdMjE0PTMuQzhMMSQlNDA1XS80RV0mNCVdMjE0PTMuQzxMCi1NNyAhJDA1MSE3VF0yN1Q5MDdUXTI3VDkwMDVdMjE0PTMuQ0BMMDQxJDRFXTIxND0zLkNETDFUNS4xNSkhCi1NMyVdMjE0PTMuQyRQKyQ9JTNENTIwNFE/M1UpPzFFISE3VSklMVUsWiwzJEw3ICEnMTRZJTREJSw3VF0yCi1NN1Q5MDdVKSUxVSxaLDMoTDA0USw3VSklMVUsWiwzLEwzJEUtN1UpJTFVXSMzJCUzNFQ1My5DJFQrI0wgCi1NPCcxUjkmRUY5RV1ULkcwUSAnLUk+RjU/PSNJVCwwIVc4VkFBPEVdVC5HMFggJlFPO0Y9TDtWWUcuRTBRCi1NLVNVUy4mQUk5VkBaLFJQUCsjLFIuVlFPPVNIUysjLFIrIyxSLlNMIDsmXU45VV1MO1ZZRy5HMFEuI1VVCi1NLicsWiwzPEwsIlBWLSNNTDsjSFcrIyBMLUMwWy5QIUY9NllDN1chVDxDSVQsM0RdKkMoUC82OFEtMCE/Ci1NOTdBST0lXUQ9NlVNPjVdRDk2LUwuRDxRICVdPzBVMS80RV0sMjUtNDdVXFoxUyhRLzYlUiwzTFAuUyRbCi1NLDNEIDdVXSQ1JF0yN1RRKTRVMT83U0knLEMkICs2UUcgJlFJOEY8TjxQIS08Vz1JPSYtSCtGXCA5N0FJCi1NPSJZTyAmXU43VjVYOjcwTjtQIVc8RkVUOTJZTyAmNVI8QCE/OTdBST0iWU8gJi1FPEcpTzxCWU8gJjVSCi1NPEZZTytGXCA5RlFTOEc1RitGXCA5RlFPODcxPzxXPUk9Ji1IK0ZcIDM2RU46NzBOO1AhRjwlXUc7Jl1CCi1NODZRUytGXCA7NkVOOjcxRjwiWU8gJlVBOyZRTzhSWU8gJkVTODcxVD4yWU8gJjlJO0YxSTtXIE47UCFJCi1NO1YoTjtQIVM6Nj1WOTYsTjtQIUM7Jl1TOTJZTyAmNVI8QCFGPFcxQT0iWU8gJjVSPEAhRzk3MUQ9JiVCCi1NOyY1Uzo3SUUrRlwgOTcpUiAmPUU9JyFBOVY1Uzo3SUUrRlwgOTcpUiAmRU84VzFMK0ZcIDk3KVIgJy1JCi1NOVYpTDtWLUsrRlwgOTcpUiAnLUk5Vy1FPSZVQTxWTE47UCFFPEcoIDxWKVI6UllPICctSTlXMVI4NlVQCi1NK0ZcIDdXLUk5VzlFOFJZTyAmOVA8RkVOPSY4TjtQIS05JjVGODc1TD0iWU8gJlVBLjMtTitGXCA5RyE/Ci1NPFYlVjkyWU8gJilDO1chWStGXCA4ViVMOyZdQytGXCA5Jl1QPEZZVCtGXCA5RyE/OFZdTTs2XU48UllPCi1NICYpWjk3KU8rRlwgOzY1TTxWNVQrRlwgPFcxUjsmNU4rRlwgODcxTzoyWU8gJi1UPjchRTdSWU8gJlVFCi1NOzYtSDxCWU8gJy1FPSZRTzhWJUw5MllPICctVDxGLUg8QllPICctVDxGLU08IllPICctVDxHLVA7QllPCi1NICctVDxHMU86UllPICY1QztWWVY5NylUK0ZcIDlWLU87RzlFPEcwTjtQIUQ7VzVCOyY1PzkmNUM6NlROCi1NO1AhPz02WVA4Ni1LN1YxQjsmNE47UCE/OEYlUzk1XTMrRlwgN1YpQTxWNT86NlBOO1AhPzxXIVI6NllUCi1NOUVdUz03IE47UCE/PSZFTTk3LT88Jl1XOTcoTjtQIVE5Ni1PO0c5RTxHME47UCFSOTYlRCtGXCA5NylSCi1NICchUjo2WVQ5QllPICctUDxGRU49JjhOO1AhTzwmNU4rRlwgOTcpUiAmVUU7Ni1QPjJZTyAnLVQ8Ri1BCi1NPSJZTyAnLVQ8Ri1QPjJZTyAmJUI7VylUK0ZcIDlWNVQ5NllWK0ZcIDwmNVI8Rl1SK0ZcIDxXMVI8JilSCi1NOlJZTyAlXUI6Nj0/PCZdVzk3KE47UCE/PFZVQTsmUT88Jl1XOTcoTjtQIUc5NzFQOjYwTjtQIUU8RyggCi1NPFZFRztGJUwrRlwgOlZFTDsiWU8gJjVSPEAhPzwmNVI8Rl1SK0ZcIDk3KVI7Jy1UK0ZcID1XKUk9JjVWCi1NK0ZcIDk3KVIgIlVMOVAhTDo2KUcrRywgN1Y1WDo3MCA3VV0kNjRZITM0RSMgJy1UODcpVCAlXU04NkVOCi1NICctVDg3KVQ3VjlMO1YlVCAlXT85N0FJPSAhPzk2WVY6NylPO0AhLTxXPUk9Ji1IICY4Vi4jQFgsNV1VCi1NPFY1RCAlXVY3Vi1IODcpPzlHNU44UCE/PUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICVdVjdXNU48VkVHCi1NO0Y1RDdWLUg4Nyk/OUc1TjhQIT89RV1TOiZdUj0lXUY9NllDICVdVjdXLUk5VllFOSVdUzomXVI9JV1GCi1NPTZZQyAlXVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgN1c5Pzo2WVQ3VjlVO0YsIDdXOT88VkVHCi1NO0Y1RDdWRU49JV1GPTZZQyAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdRj02WUMgJV1WN1ZRTztGPT85RzVOCi1NOFAhPz1FXVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzlHNU44UCE/Ci1NPUVdRjsmXUE9JV1GPTZZQyAlXVY3VjFPPTYpTDk1XUY9NllDICVdPzdWVUE6NlggN1c5PzhWQUE8QCE/Ci1NPUVdUzo2PU45NjE/OFZBQTxAIT89RV1VO0ctSTlWWUU5JV1DOiYlUiAlXVY3Vy1IO1cpVCAlXVY3Vy1JCi1NOVZZRTklXVM6Jl1SPSAhPz1FXVU7Ry1JOVZZRTklXVM6Jl1SPSAhPz1FXUk7RzAgN1c5PzxWRUc7RjVECi1NN1ZFTj0gIT89RV1VO0ctSTlWWUU5JV1JO0cwIDdXOT87Jl1OOVAhPz1FXVM6Nj1OOTYxPzsmXU45UCE/Ci1NPUVdVTtHLUk5VllFOSVdTDtWWUcgJV1WN1Y5TDtWJVQgJV1WN1YxTz02KUw5MCE/PUVdQzomJVI3ViVSCi1NPEYlWSAlXVY3Vy1JOVZZRTklXUM6JiVSN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1YtSDg3KT84NylSCi1NODdEIDdXOT88VkFPPEcxPzg3KVI4N0QgN1c5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXVY3VzVOCi1NPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICVdVjdWRU49JV1BPEcpQT4wIT89RV1TOjY9Tjk2MT86NllUCi1NN1YlUjxGJVkgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhPz1FXUw7VllHN1YlUjxGJVkgJV1WCi1NN1ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA3Vzk/Ci1NOUZRTzg3MT84NylSODdEIDdXOT85Jl1VOEZRRTdWJVI8RiVZICVdVjdWLUg4Nyk/PCZdSTtHMUU8QCE/Ci1NPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UiAlXVY3VzVOPFZFRztGNUQ3Vi1IODcpPzwmXUk7RzFFCi1NPEAhPz1FXVM6Jl1SPSVdUDtWRU49JjVSICVdVjdXLUk5VllFOSVdUzomXVI9JV1QO1ZFTj0mNVIgJV1WCi1NN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCA3Vzk/OjZZVDdXIU86NllUOTcoIDdXOT88VkVHCi1NO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAlXVY3VlFPCi1NO0Y9PzwmXUk7RzFFPEAhPz1FXVM6Nj1OOTYxPzsmXU45VV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVECi1NN1ZRTztGPT88Jl1JO0cxRTxAIT89RV1GOyZdQT0lXVA7VkVOPSY1UiAlXVY3VjFPPTYpTDk1XVA7VkVOCi1NPSY1UiAlXVA8RkVNODcpWSAlXU47VllQPEZFTTg3KVkgJV1TPCZdUj0nLUM4NyggN1YtTD02WUs5NyggCi1NN1ctPzsmRU46UCE/PTVdTDo2WUsgJV1WN1c1Tjo2XU4gJV1WN1c1Tjo2XU4sQCE/PUVdUz0nKVU4VzBRCi1NICVdVjdXLVQ8RzVDPSMoIDdVXT85Jl0/OVZRTzhGJUw3VjFUO1cpUyAlXT83VDE0M1UpPzMkRTM1JV0/Ci1NICVdPzk3QUk9JV1EPTZVTT41XVI5NjggN1VdRT4mRVQ3VjFVOzZVWTdWMUU4VlAgN1VdPzkmXT85VlFPCi1NOEYlTDdWLVQ7VylTICVdPzdULTQzVSk/MyRFMzUlXT8gJV1PO0VdRT4mRVQgJV1XPEZFVDkwIT87Ny1XCi1NOjcxQzomOVA3UCEtOjZZST0gIUY7Jl1BPSVdUz1WRVQ4VkAgN1VdQzsmNUE7RzVQICVdPzk3QUk9JV1ICi1NODZZRDsmNVI8UCE/OzYlTDsmXUMgJi1FPEcpTzxAIT85NylSO0ZcIDdVXVc8RzFDOiZMIDdVXUY7Jy1CCi1NPTY4IDdWOVI5NjQgN1VdUzs2KVU5QCE/OUY5TD03LUggJV0/OUZFTjkmKVU5QCE/N1dBRjsnLUI9NjggCi1NN1Y5Uz0mJVQgJV0/OEc1RjxXRU44UCE/OFZRTzxWNCA3VkVTODcxVD4wIT85Ri1MO1ctRSAlXT85Rz1BCi1NOyZMIDVGUUk8VzAgN1Y5UDdXLVc6NzFDOiAhPzs2RU46NzFGPCVcIDdWOVA3Vy1UODcxRTdWVUMtQ0BYCi1NLiMkIDdUOU07VjFFICVdJjxXMUE9JzVTICVdRjwlXVM9JiVUOTVdUz02WUY8JiQgN1Y5UDdXLVQ4NzFFCi1NN1ctSz42OUY8ICE/OUchPzxXMUE9JjU/PFZdRj0nPUE8RjQgN1ctSTlXOUU4UCE/MTRVNDRXIUU4VkVBCi1NOyAhPzlHIVI6NllUOUAhPzs2JFksVlk/ICVdLTkmNUY4NzVMPSAhPzE0VTQ0VkVHO0YlTDsmNUQgJV0/Ci1NOjZdQiAlXVI5NiVMOyZdQyAlXVM4RylLICVdRzk3MVA4Nj1FPFZFWjkwIT84Ri1PPCdEIDdVXVU4Rl1VCi1NO0YwIDdVXT87NiVMOyZFTjlGXCA3VV1SO1ZdVCAlXT87JilPPTZZRCAlXUk7Vi1UOyAhPzdWOUk7RjFJCi1NO1cgIDdWPUU9JjFUODYpTDk3LUk+RjQgN1VdRjdWVU88RjVGOjZRRTxQIT85RV1QPEY1QTsmUU84UCE/Ci1NOFYlTDsmXUMgJV0/PFZFRzlHNU44UCE/PFZFRzxWNVQ7NiVTOlAhPzdXLUk5VzFSODZVUCAlXT88VkVHCi1NPUY1QyAlXVM6Nj1COyZdQzpQIT85NllEICYtVTxGKVI6UCFGPCVdUzg3OUUgJjlQN1cpRTxXMU88RjQgCi1NN1VdRDtXIVI7RzAgN1VdUzpXRT85RjAgN1VdUzpXRUI4Ny1FICVdQj5GNVI7UCE/OFY5Ujk2NCA3ViVUCi1NO1ZEIDdXLVQ8Ry1QO0AhPzdWLVQ+NyFFN1AhPzs2NU04VkFSICVdTTk2VVM5NzAgN1clRjhWXU49RjVSCi1NPSAhPzlGLU87RzlFPEcwIDdXLVQ8Ri1IPEAhPzsmXUM4NlFFOFZdTj1AIT83VlVLODcpRzsnLVQgJV1TCi1NPScpTDk2WCA3VV1GO1c1UjkmRUc6NzFTPDc1SThWTCA3VyVHOFZdTj1GNVI9ICE/OVYtTztHOUU8RzAgCi1NN1clRThWXU49RjVSPSAhPzk2LU87RzlFPEcwIDdVXUc5NzFBPEY8IDdVXUY8JiVCODctRSAlXUk8VyFVCi1NO0YtVCAlXUk8Vj1SODchSCAlXUk8ViVTOFZFSSAlXVQ7ViVTOFZFSSAlXT87Nik/OFc1UjdWVUE+ICE/Ci1NOjctWDkmRUc6NzAgN1ZFUzxXIUE4VjQgN1ZFUzg2UU49NlQgN1ZFUz03IVA5NyggN1ZFUzhWWVQ8RlAgCi1NN1ZFUzwnKUk7RzAgN1ZFUzg2UVA6JiQgN1ZFUzkmRUc6NzAgN1ZFUzsmXVc5NyggN1cpRTg2MCA3VlFDCi1NO1ZZViAlXUc5NzFMO1YtQTsmNT84VzFZPCY0IDdVXUw4NllHOjZZRjtQIT87Jl1DODZRRD0mLU87RzggCi1NN1ctVDxGLUE9ICE/N1ZVWTdXMUk7NjQgN1ctRT0mUU84ViVMOTAhPzxXMVI9Jl1LICVdSTtGRVQ3Vy1UCi1NODcxSThXLCA3Vj1FPSZRTzhWJUw5NV1OPTZVRTxGRUMgJV1NOTZVQzwnRCA3VV1MO1YtQTsmNVMgJV1TCi1NPScpQzs3ICA3Vl1QOTZYIDdWXVA5NllMO1YtQTsmNCA3Vy1UPEYtUD4wIT83Vi1POSY1PzxWNVQ3VkVOCi1NOUZcIDdVXUM9J0VQOTVdVTsgIT85VjVUOTZZViAlXT85JzFDO1ZZViAlXVM9JylQOEcpSyAlXUY8JV1ECi1NOjcpRThXMUk7VlggN1VdRjwlXUM9NylSOTZZVDdWMUk8RjVDPSZFTztAIT83VjlQN1YtVTxHKUU7RzE/Ci1NOTdBQzk3IVQ6Nl1OPFAhPzdWOVA3Vi1VPEcpRTtHMT88JylFOFZFUzo2XU4gJV1EO1c1QjsmNT89Jl0/Ci1NOSY1Qzo2VUE7ICE/OVYtVj0gIT83Vj1DPUcwIDdWKUk7RiVSPjVdVDtVXUQ5Ni1JOzYlTDdWRU49JjVHCi1NOTcoIDdVXVI6Nj1IPSVdUzomRUY9JV1CODctRTdXMVc7UCE/OSY1Qzo2VUE7JV1SO1c1TjkgIT83VilJCi1NOVVdRjsmXUE9JV1UOjZVRTxVXVA7Vz1FPEAhPzhGRU44NylZN1cxTzdWMUU4VkVNODZRPzlHKUE4VzFJCi1NO1ZYIDdVXUY8JV1OO1cpTTg2UUk+RjQgN1ctUDxGRU49JjggN1VdRjxGNUU3VilJOVVdRjsmXUE9ICE/Ci1NN1c1TjwmJUM6VjVEN1cxTzdWKUk5VV1GOyZdQT0gIT83VilBPFY1PzhWXU49RjVSPFZFTztFXUE4Rl1SCi1NPSAhPzdXNU48JiVDOlVdRDtXNUI7JjQgN1VdQzsmJVM8VV1EO1c1QjsmNCA3VyVVODYxUj03IUw5NV1UCi1NO1VdRDk2LUk7NiVMICVdPz02WVA4Ni1LOTYxPz0mXT85JjVDOjZVQTsgIT83VilJOVVdQjo2WUE8R0U/Ci1NPSZdPzhGRUc3VjFFOFZFTTg2UCA3VV1VO0chQThWTT88NzVBOScpVTwmUUUgJV0/OFZRQTxXLT88NzVBCi1NOScpVTwmUUUgJV0/OUchPzsmNUY9Jy1IOjY5VCAlXT85RyE/PFY1VDdWNVg4VjVQPSZFTztAIT83VzVNCi1NODYsIDdVXU09NlFUOjchTD41XUI4Ny1FN1cxVztVXVY5Ni1UO1coIDdVXU09NlFUOjchTD41XUI4Ny1FCi1NN1cxRTtFXVY5Ni1UO1coIDdVXUM4NylSPjVdUDxGXVA4Nj1BPSY1Pz0nPU8gJV0/OFYlUjxHRT88JylPCi1NPCYlRzg3MUU3VzFFO0AhPzdWLUE8RylZN1ZFTjdWKFEsIyBQLCAhPzdXIVI7VjFDN1YoUSwjIFAsICE/Ci1NN1ZVVTsnMUk8JlFZN1YpQTxWNT89Jz1PICVdPzsmNUY9JV1TOiZFRj0lXUI4Ny1FN1cxVztQIT83VlVVCi1NOycxSTwmUVk3VilBPFY1Pz0mNU43VilZN1cxVztQIT83VlVVOycxSTwmUVk3VilBPFY1Pz0mNU4gJV0/Ci1NOyY1Rj0lXVM6JkVGPSVdQjg3LUU3VzFFO0AhPzdXIVI7VjE/LDMgUCwjIT84QzhVLTMsViAlXT88JylPCi1NOSVdQi1DNFUsUzggN1VdQzg3KVI+NV1PPTcxPzhDJFAsIyBQICVdPzwnKU85JVxWLTM0Uy1FXUIsMyBQCi1NLCMgIDdVXUw8VkFJOUcxPzhDJFAsIyBQICVdPzwnKU85JV1CLDMgUCwjICA3VV1NPTZRPy1DNFUsUzlTCi1NOiZdUj0gIT88JylJO0cxRiAlXT87JjVBOSZFTjlVXVo5NylPPFVdQjo2PT88Jl1XOTcpUzdXMUU7QCE/Ci1NN1ZRRTg2MUk7Rj0/PkY1UjtXLT88VlVBOyZRPzwmXVc5NylTN1cxRTtAIT83VlFFODYxSTtGPT8+RjVSCi1NO1ctPz0mRU4+NV1QO1c9RTxHLT89JjVOICVdPzxXMUE8RzE/OEZFRzdXIU89VjVSPFVdVDk2WCA3VV1TCi1NPSYlUj0lXVM7NiVMOyVdUDtXPUU8Ry0/PSY1TiAlXT88VzFBPEcxPz0mRU4+NV1QO1c9RTxHLT89JjVOCi1NICVdPzhGRUc3VyFPPVY1UjxVXVQ5NlggN1VdUzs2JUw7JV1QO1c9RTxHLT89JjVOICVdPz0mRU4+NV1QCi1NO1c9RTxHLT89JjVOICVdPzs2JVg3VilJOVVdUDtXPUU8Ry0/PSY1TiAlXT87NiVYN1ctTTg2UUw3VyFPCi1NPVY1UjxVXVQ5NlggN1VdTTg3QT89JkVOPjVdUDtXPUU8Ry0/PSY1TiAlXT84Vl1QPjVdQjo2PT85RlFPCi1NODcxPzkmRUc6NzFTICVdQThGXVI9ICE/N1ctVDg3KVQ3VilJOVVdUDtXPUU8Ry0/PSc9TyAlXT88VzFBCi1NPEcxPzxWVUE7JlE/PCZdVzk3KVM3VzFXO1AhPzdXLVQ4NylUN1cxSTtHRT88Jl1XOTcpUzdXMVc7UCE/Ci1NN1YpSTlVXVA7Vz1FPEctPz0nPU8gJV0/PFZVQTsmUT88Jl1XOTcpUzdXMVc7UCE/N1cxSTtHRT88Jl1XCi1NOTcpUzdXMVc7UCE/N1ZVQT4lXUI6Nj0/PCZdVzk3KVM3VzFXO1AhPzdWVUE+JV1TOzYlTDslXVA7Vz1FCi1NPEctPz0nPU8gJV0/OzYlWDdXMUk7R0U/PCZdVzk3KVM3VzFXO1AhPzwmNVI8Rl1SICVdSzo2UUwgJV1TCi1NOjY9Tjg2UCA3Vj1FPSchSTkgIT83VyFFPEcpTzxAIT88V0VTN1Y1UjxGUUk8VzAgN1c9Ujo3MUU9QCE/Ci09PFdFUzdWWUU8RyggN1Y1VDk3QVQgJV1FOSYlVDgwIT83VjVOOSAhUgotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstZWxmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL202OGstZWxmLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDA1ZTcuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9tNjhrLWVsZi51CisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLWJlZ2luIDc3NyBtNjhrLWVsZgotTT9UNSwxQCQiIDAgICAgICAgICAgICAgIiAgMCAgICAhQCAgJD4gICAgIzAgICMiMCAgICAgICBUICIgIAotTSEwIEggITQgJDAgICAgOCAgICBUQCAgIC0gICAgICAgICAiQCAgICBIICAgICA0ICAgICAgICAgIFAgIAotTSAtMCAgICAgICAgICAgICAgISwgICAgICAgICAhICAgICAgICAgICEgICAgLSggICAjMCAgICAgICAgKQotTUMgICAiOFAgICAgJSAgIEAgICAgICAkICAgRyBAICBJUCAgICAgICAgICI0ICAgIjYgICAgIDwgICIgIAotTSAgICAgQCAgIj4yICAiR0QgICAgICAgICAnICAgICAgICAgICFQICAgICBPPTctUitWUUk4Ql1MOjYpQwotTStHLU8rQyQgICAgICAmJCAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgNCAgICAgICAgICBQICAgICAgICAgICAgICAhUCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgKyAgICAgICAgICAgICAgICAgICAgISAgICAgICAgICAgICAgICBAICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQCAgICAgICAgICAgICAgICAgIAotTSAgICAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSFAICAgICAgICAgICAgICAgICAgICAgICAgICEgICAgICAgICAiMDIgICAgICAgICJIICArIUAgICAgIAotTSQwI19cMCAgICBeICAiRyQgICAgISEkICAgSCAgICA4QCAgKVAgICAgICAxIC9fUSAgICAnUCAgICAgIAotTSAgITokQCAgICAgICAiOiAgIkk0ICAgICAhJCBfXyQgICAgTSAgICAgICAgICAgMiAgICAgICAgLEggIAotTSEtQCAgICAkJDAgICIgICAgI1wgICAgICAgICAgISggICAgICAgISlAICBJUiAgICAgIDEgL19RICAgIAotTTdYICAqPjAgICAgICQwI19cMCE/OFZRRTg2WVU8ICE/OTZZRCAlXUU7RzlJPEZdTiAlXUU9JjVYPSAhQQotTT0mNVg6NzAgN1Y1RDg3MUEgJjVYOjcwIDdWUUk4RV1WOTcpUzo2XU4gJV0/OUchUz0mJVI9ICE/MVRRLwotTTBEJSw3VF0mMUUtJTUlXTQwNCksMTVcIDdUMTkzRCUtMjQsICtXNVM8Ql1MOjYoTzsmRUI4UllTO1JYUQotTSAgIiAgIkc0ICAgJSUwICAgICIgICJHOCAgICElMCAgICAiICAiRzwgICApJTAgICAgIiAgIkdAICAgJwotTSUwICAgICEuPTRZUStTTCE8ICAgKTs5Ll5QJVEgICBFTEAgICAgIS5eUCVRICAgRUpCXFwgICAgICYjXwotTV9fX19XJFtbIDckICAiNjorU1AgICAgLDgvX19fX18oM09MITwwICApOEhPLyAgICAhQUBfX19fX1sxLgotTV5QJVEgICBFPkJcXCAgICApJiNfX19fX0giXFxAICApTyRaWUAgICQqJUEvKCNSICAgMFw5X1wgICAgLgotTStQIS5OOCAgISJBODNZX1wgICAgIyJaNjA+WCAhIl0oICAxKkYmO1woXEIgICJHJCtUQCAiJFpZQCAgJAotTSQkWllAICAkNCRaWUAgICdLIlogM0tGICAgMUQzRzUuPDAgICAgISgjT19fX19RKFtQICAgIDNSLV8gIAotTSA3ICAgICAkPCAhQF9QICAgIDNSLV0gICA3ICAgICAkMy5cICAgICQzRVkuPTRALl9fX19fJENPICAgIAotTSEvKFdcICAhPCAgICAgMVAgJiNfICAgICEvKFdUICAhPCAgICAgMSxbUCAgICAxLjdEWVUyIFtfX19fXAotTTIuXCAgICAkXEM/UCAgJVAgICAgIScgIDgvXCAgICAkXEM/MCAgJVAgICAgISRTTyAgICAhJFk+M0c1KAotTSNPX19fX1EoW1AgICAgM1ItXyAgIDcgICAgICQ8ICFAX1AgICAgM1ItXSAgIDcgICAgICQzLlwgICAgJAotTTNFWS49NEAuX19fX18kQ08gICAgIS8oV1wgICE8ICAgICAxUCAmI18gICAgIS8oV1QgICE8ICAgICAxLAotTVtQICAgIDEuN0RZVTIgW19fX19cMi5cICAgICRcQz9QICAlUCAgICAhJyAgOC9cICAgICRcQz8wICAlUAotTSAgICAhJFNPICAgICEkWT4zRzUoI09fX19fUShbUCAgICAzUi1fICAgNyAgICAgJDwgIUBfUCAgICAzUgotTS1dICAgNyAgICAgJDMuXCAgICAkM0VZLj00QC5fX19fXyRDTyAgICAhLyhXXCAgITwgICAgIDFQICYjXwotTSAgICAhLyhXVCAgITwgICAgIDEsW1AgICAgMS43RFlVMiBbX19fX1wyLlwgICAgJFxDP1AgICVQICAgIAotTSEnICA4L1wgICAgJFxDPzAgICVQICAgICEkU08gICAgISRZPjNHNSgjT19fX19RKFtQICAgIDNSLV8gIAotTSA3ICAgICAkPCAhQF9QICAgIDNSLV0gICA3ICAgICAkMy5cICAgICQzRVkuPTRALl9fX19fJENPICAgIAotTSEvKFdcICAhPCAgICAgMVAgJiNfICAgICEvKFdUICAhPCAgICAgMSxbUCAgICAxLjdEWVUyIFtfX19fXAotTTIuXCAgICAkXEM/UCAgJVAgICAgIScgIDgvXCAgICAkXEM/MCAgJVAgICAgISRTTyAgICAhJFk+M0c1KAotTSNPX19fX1EoW1AgICAgM1ItXyAgIDcgICAgICRcQ1E0ICAgICAgICAgICAgOC9cICAgICRcQz8wICAlUAotTSAgICAhJFNPICAgICEkWT4zRzUoI09fX19fUShbUCAgICAzUi1fICAgNyAgICAgJFxDUTQgICAgICAgIAotTSAgICA4L1wgICAgJFxDPzAgICVQICAgICEkU08gICAgISRZPjNHNSgjT19fX19RKFtQICAgIDNSLV8gIAotTSA3ICAgICAkMENGICAiTUQkX1AgIDggICpOIDNfICAiQCAgSkkjL1wgIC4gICJLOCxfUCAhKCAgKkxAUwotTV8gICVAICBKOyIvXCAgICAhSCAgKkdAQ18gICAgID4gICJJOChfUCAgICAoQCAgSjciL1wgICAgIjggIAotTSpNMENfICAgICBKICAiSUQoX1AgICAgK0AgIEpZIi9cMExAICAoICAqSkBDXyQhSSAgIiAgIklQKF9QIAotTSAgICBAICBKPSEvWUAgIEs5KCAgKlQgM144ICAqTiIgICJKQCRfRiAgIkpEQCAgSjgjL1lAICBKViggIAotTSpOQFNeOCAgKkxCICAiSlQsX0YgICJJTEAgIEpbIi9ZQCAgSj4oICAqSDBDXjggICpFQiAgIktYKF9GIAotTSAiSTxAICBKTyIvWUAgIEpVKCAgKlVQQ144ICAqRjIgICJKTChfRiAgIktEQCAgSlMiL1lAICBKSiggIAotTSpUUENeOCAgKkciICAiSjAoX0YgICJJVEAgIEpFIi9cQCAgSzkoICAqTyBDXyggICpOIiAgIk04KF9SIAotTSAiSkRAICBKXSIvXEAgIEpWKCAgKlUwQ18oICAqTEIgICJMKChfUiAgIklMQCAgSjoiL1xAICBKPiggIAotTSpLQENfKCAgKkVCICAiTCAoX1IgICJJPEAgIEpRIi9cQCAgSlUoICAqTVBDXyggICpGMiAgIk0oKF9SIAotTSAiS0RAICBKQCIvXEAgIEpKKCAgKlQwQ18oICAqRyIgICJMLChfUCAgICAiQCAgSkMiL1wgICAgIEggIAotTSpHUENfICAgICAmICAiUCAoX1AgICAgIUAgIEs6Ii9ZQCAgSyEoICAqVyBTXjggICshIiAgIlAoXEM/MAotTSAgJVAgICAgISRTTyAgICAhJFk+M0c1Lj00WVEgICAgICAgICAgIiAgIkdEICAgICAgICAgICIgICAwUAotTUAgICQxKCAgISVCICAgMUwgICAgIDAgICAmQCAgICAsQCAgJCQgICAgIFYgICBGXCAgICAhKCAgIC5AIAotTSAgICVAICAjOSAgICAgOiAgICpEICAgICJAICAgJ0wgICAgKyAgICAkICAgICE0ICAgICAgICAgIFggIAotTSo8QCAgICAiICAgICwgICAgITAgICAgJyAgICAlWCAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgMCAgICAgICAgICAhICNfXDAgICAgIiAgICM0ICAgICAgLCAgICQgICAgIAotTUAgICBaICAgICAgIyAgICIgICAgICggICBKMCAgICAgIFAgICBQICAgICIgICAtRCAgICAgICwgICAwIAotTSAgICBAICAjWCAgICAgICMgICAlICAgICAoICAhISAgICAgICBQICAhQCAgICAiICAgMDQgICAgICAsIAotTSAgPCAgICAgQCAgJD4gICAgICAjICAgKCAgICAgKCAgIjtQICAgICAgUCAgIjAgICAgIiAgIkcgICAgIAotTSAgLCAgIEggICAgIEAgIElSICAgICAgIyAgICsgICAgICggICo+MCAgICAgIFAgICMgICAgICIgICJJOAotTSAgICAgICwgICBUICAgICAgICAgICAgICAgICMgICAuICAgICAgICAgICAgICAgICBQICAjUCAgICAgIAotTSAgICAgICAgICAsICAhICAgICAgICAgICAgICAgICAjICAgMSAgICAgICAgICAgICAgICAgUCAgJEAgIAotTSAgICAgICAgICAgICAgLCAgISwgICAgICAgICAgICAgICAgIyAgIDQgICAgIkAgICAgICAgICAgISAjXwotTVwwICAgISQgICAgICAgICAgIDAgX18kICAgIDggICAgICAgICAgICQgL19RICAgICkgICAgICAgICAgIAotTSEgI19cMCAgICJQICAgICAgICAgICAwIF9fJCAgICBWICAgICAgICAgICAkIC9fUSAgICAvOCAgIS1QIAotTSAgIFIkQCAgIiAgICAkRiAgIkk4ICAgICEhJCAgIFQgICAhNkAgIEo3ICAgICAwMSAgIC0gICAgOTggIAotTSI7UCAgICAgJEAgICIwICAgJk4gICJJQCAgICAgQSQgICBUICAgIiFAICAnSyAgICBBIDIgICAoICAgIAotTUFIICAqRjAgICAgJCQwICAjMCAgICkyICAiSUggICAgISEkICAgVCAgICJNQCAgJC8gICAgIjAyICAgIAotTSAgICBNSCAgKyFAICAgICAkMCNfXDAgICArTiAgIklMICAgICBBJCAgIFQgICAjLEAgICVVQCAgICMoMgotTSAgICggICAgWEggICpHICAgICAoJDAgICMwICAgLk4gICJJWCAgICAhISQgICBUICAgI1FAICAkPiAgIAotTSAgIDIgICAoICAgIF4oICAqR1AgICAgJCQwICAjMCAgIDAuICAiRyQgICAgISEkICAgSCAgICQsQCAgSgotTUAgICAgIDAxICAgLSAgICEpKCAgKkgwICAgICgkMCAgIzAgICAzIiAgIkosICAgICEhJCAgIFQgICAkWAotTUAgICUjQCAgICMoMiAgICggICAhMlggICpJICAgICAwJDAgICMwICAgNUogICBHICAgICAgISQgX18kIAotTSAgJUFAICBKSCAgICAgKDEgICAtICAgIT04ICAqSjAgICAgISQwICAjMCAgIDg2ICAiSkggICAgISEkIAotTSAgVCAgICYtQCAgSksgICAgIEAxICAgLSAgICFIOCAgISJAICAgITokQCAgICAgICA6QiAgIkckICAgIAotTSEiJCAgIEggICAmUEAgICZHQCAgICMoMiAgICggICAhTyggICFQKCAgICBSJEAgICIgICAgPSYgICJKVAotTSAgICAhISQgICBUICAgJ0ZAICBKTiAgICAgMDEgICAtICAgIV0oICAqRTAgICAgICQwI19cMCAgID9OIAotTSAgNVIgICAgLEEoICAgQCAgICgoQCAgSk8gICAgIEAxICAgLSAgICInOCAgKkwwICAgICQkMCAgIzAgIAotTSBDMiAgIDgoICAgICxBKCAgIEAgICAoX0AgIEpSICAgICAoMSAgIC0gICAiM0ggICFTMCAgICBcJEAgIAotTSIgICAgRU4gICAxRCAgICAgISggICAgICAgKUBAICBKUyAgICAgQDEgICAtICAgIj1IICAqTTAgICAgJAotTSQwICAjMCAgIEdWICAiSzggICAgIEEkICAgVCAgIColQCAgSlcgICAgIDAxICAgLSAgICJFKCAgKk4gIAotTSAgICEkMCAgIzAgICBKKiAgIktEICAgICEhJCAgIFQgICAqUkAgIEpaICAgICAwMSAgIC0gICAiUCggIAotTSpOUCAgICAkJDAgICMwICAgTT4gICAzOCAgICAhISQgICBAICAgK0RAICAkVSAgICAgIDIgICAoICAgIgotTVsoICAqTyAgICAgJCQwICAjMCAgIE9OICAiS1QgICAgISEkICAgVCAgICwzQCAgSl4gICAgIEAxICAgLQotTSAgICMpSCAgISUgICAgICAkQCAgICAgICBTIiAgIkwgICAgICEhJCAgIFQgICAtJUAgIEshICAgICAwMQotTSAgIC0gICAjMyggICo8QCAgICAgJDAjX1wwICAgViogICJMKCAgICAhISQgICBUICAgLVlAICBLIyAgIAotTSAgMDEgICAtICAgI0JIICAqPCAgICAgJCQwICAiQCAgIFlSICAiTDAgICAgJiEkICAgVCAgIC5GQCAgSwotTSogICAgIUAxICAgLSAgICNMKCAgKlQgICAgICIkMCAgIzAgICBbViAgIk0kICAgICEhJCAgIFQgICAvLQotTUAgIEsyICAgICAwMSAgIC0gICAjWFggICFXICAgICBcJEAgICIgICAgXyYgICA4WiAgICAsQSggICBAIAotTSAgMCNAICBJWSAgICAgIDEgL19RICAgJCMoICAqVFAgICAgKCQwICAjMCAgISFKICAiTTQgICAgISEkIAotTSAgVCAgIDBKQCAgJlQgICAgIygyICAgKCAgICQvOCAgKlVAICAgICQkMCAgIzAgICElLiAgIk08ICAgIAotTSIhJCAgIFQgICAxQEAgICQkICAgICAgMiAgICYgICAkOUggICpWMCAgICAhJDAgICMwICAhJlYgICJNSAotTSAgICAhISQgICBUICAgMVVAICAlMCAgICAjKDIgICAoICAgJEJIICAqVyAgICAiMCQwICAjMCAgISkmIAotTSAgNkQgICAgLEEoICAgQCAgIDJFQCAgTCAgICAgIDAxICAgLSAgICRLWCAgKyBAICAgICgkMCAgIzAgIAotTSErQiAgIDlMICAgICxBKCAgIEAgICAzLEAgIEwkICAgICBAMSAgIC0gJlRWLiZMTjk2UUYgJi1SPSMkTgotTTxQIUM8RzFJK0csID1GJUw9NjVTKzVBVCtGLCA5VjFCOzY0TjhQIVM6JV1EODcxQStGLCA4VylUO0JZUwotTSAnOT84VkFBPEVdRj02WUMgJzk/PFZFRztGNUQ3VkVOPSAhVjdXNU48VkVHO0Y1RDdWRU49ICE/OUZFTgotTTowIVY3VzVOPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0QgOzYlSTtAIVY3Vy1JOVZZRTklXUw7VllHICc5PwotTT02WVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCE/OFZRRTg2WVU8ICE/OTZZRCAnOT89NllTOjY9TgotTTk2MT88VkFPPEcwID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdRj02WUMgJzk/OSZdVThGUUUgJzk/OjZZVAotTSAlXVM9JiVSPSAhTjtWWVA8RkVNODcpWSAlXUU7RzlJPEZdTiAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUAotTTtWRU49JjVSICc5Pzo2WVQ3ViVSPEYlWSAnIVI6NlVBPEdEID1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQwotTSAnOT85Jl1VOEZRRTdWJVI8RiVZICVdRT0mNVg9ICFWN1ctSTlWWUU5JV1DOiYlUjdWJVI8RiVZICc5PwotTT02WVM6Nj1OOTYxPzhWQUE8QCFWN1Y5TDtWJVQgJzk/PFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgODcxRQotTT4mRVQgJjVOPUZFUjtWWCA9RV1MO1ZZRzdWOVU7RiwgPUVdVTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsIAotTT1FXVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCA9RV1JO0cxPzwmXUk7RzFFPEAhPzk2MUE9JiQgPUVdUwotTTomXVI9JV1GPTZZQyAnOT89NllTOjY9Tjk2MT86NllUN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/OjZZVAotTTdXIU86NllUOTcoID1FXUk7RzE/OUc1TjhQIVY3Vy1JOVZZRTklXVM6Jl1SPSAhVjdWOUw7ViVUN1Y5VQotTTtGLCA5N0FJPSAhVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCA9RV1MO1ZZRyAnOT88VkFPPEcwIAotTT1FXUw7VllHN1chTzo2WVQ5NyggPUVdUzo2PU45NjE/OFZBQTxAIVY3VzVOPFZFRztGNUQ3VlFPO0Y8IAotTT1FXVM6Jl1SPSVdQTxHKUE+MCFWN1c1TjxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWSAlXUw6Nik/PUY1UgotTTxWRU87QCE/OzYtTz02WVQgJzk/OFZBQTxFXVA7VkVOPSY1UiAnOT89NllTOjY9Tjk2MT84VkFBPEVdUAotTTtWRU49JjVSICc5PzxWRUc7RjVEN1ZFTj0lXUE8RylBPjAhPzdWOVA8VzFBPEcwID1FXVM6Nj1OOTYxPwotTTo2WVQ3VyFPOjZZVDk3KCA8VV1MOjZZSyAlXSczJF0iMDRRPzNUOSY0VDU0N1UxITBEUSU3UCFWN1ctSQotTTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAnOT85Jl1VOEZRRTdXIU86NllUOTcoIDdVXUw7VllHOSZdVQotTThGUUU3VzVTOTYwID1FXVM9JylVOFcwUSAnOT88VzFSPTYtVCxAIVY3Vi1IODcpPzg3KVI4N0QgPUVdRgotTTsmXUE9JV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhVjdWMU89NilMOTVdRgotTT02WUMgJzk/PFZFRztGNUQ3VkVOPSVdRj02WUMgJV0kNjRZITM0RSMgJzk/OUZRTzg3MT84NylSODdEIAotTT1FXVM6Jl1SPSVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ZRTztGPT85RzVOOFAhVjdXLUk5VllFOSVdQwotTTomJVI3VyFPOjZZVDk3KCA9RV1MO1ZZRzdWJVI8RiVZICVdSTtGRVQgJzk/OFZBQTxAIUM7JzVOOlY1UgotTSAnOT89NllTOjY9Tjk2MT84VkFBPEVdRj02WUMgJzU/OyZFTjpQIVY3Vy1JOVZZRTklXVM6Jl1SPSVdRgotTT02WUMgJy1QO1cpVDxWLUE8QCFWN1c1Tjo2XU4sQCFWN1c1TjxWRUc7RjVEN1ZFTj0lXUY9NllDICc5PwotTT02WUk7VlggICJZSTtHMUU8RyAgK0ZBQTxWQCArRjFZO0ctWTswIE45J0VOPFcxUiAiWVI5NlFBK0chTAotTT0gIE46NllJPSAgTjwmUVQgIllUOTdBVCAiWUY6NllJICJZRDg3MUEgIllHO1cwICtGMVk7RiVNOjYsIAotTStGKVM8UCBOPFdFTT0mJUIgIllTPScpVDg2KCArRyFFPFY1TCAiWVM6Jy1UPEcxQThAIE44Vl1NOzY1TgotTT0gIE45JjVCPTY8ICtGUUk7RjQgMCJAQyo2UUk4RixNOzMsUi5GVFQrRjFFOUBEUStDMCAwIkBDKjZRSQotTThGLE07MyxSLkYtUz0yXUM8RzBRK0csKSwyWFEuICAgICAhICoiLEk7JkVCOFJVTSxTKFo7MzBOOSY1RgotTSIzJE4tICEgKiIsSTsmRUI4UlVNLFMoWjhXLVUrVi1SPSZETjxQRFErQywgODcsWigiQSMxJSxJKCM0TgotTSwiIFErUyhPLjMgICAgICAwIkBDKjZRSThGLE07MyxSLkZUVCtGMUU5QERRK0MwIDAiQEMqNlFJOEYsTQotTTszLFIuRi1TPTJdQzxHMU4rRywpLDJYViAiIUw5IiBaKCJBIzElLEkoIzROLCIgUStTKE8uMyAgICAgIAotTSAiWCAkMCAyICAgNjwgIFg5VjFCOzY0TjhQICEtQCAgICAkISQ4ICAhLVAhKDggICI7UCEhQCAgICAgIAotTSAgID0gISwgJEAgICA0WCAuJzE/PFcxUj02LVQgICJWICAgICYgICAgIkggIzAgMiAgICA9MCBYPUVdQwotTTomJVI3VlVFOzYpRTxAICA1MCAhICIsICFAMCAgICAgIVAgICAiTCAjMCAyICAgIEggIFg9RV1TOiZdUgotTT0lXU05NlVCOTcoICAlNCAhICBDICA4JCAgICAgQDwgICAgSSAgVCAkQCAgICxEIC4nOT86NllUN1ZVRQotTTs2KUU8QCAgNTAgJyAiLCAhQDAgICAgJCFQICAgIkggIzAgMiAgICBcUCBYPUVdTDtWWUc3VlVFOzYpRQotTTxAICA1MCAqICIsICFAMCAgICAoIVAgICAiTCAjMCAyICAgISdAIFg9RV1GOyZdQT0lXU05NlVCOTcoIAotTSAlNCAjQCBDICA4JCAgICAjIDwgICAgTCAgVCAkQCAgIDRIIC4nOT85Jl1VOEZRRTdWVUU7NilFPEAgIAotTTUwIC8gIiwgIUAwICAgIDAhUCAgICAwICAgIDsgISwgJEAgICBGUCAuJ1hQOUYlSzkwICBNQCAgICFAIAotTSAgIEogIFQgJEAgICA5LCAuJzk/OFZBQTxFXU05NlVCOTcoICAlNCAgMCBDICA4JCAgICAgIDwgICAgSwotTSAgVCAkQCAgIDtYIC4nOT88VkFPPEcxPzs2NU04RjVSICAhNSAgMCAoUCAmISAgICAgKCcgICAgKjAgLQotTSAhKCAgICdHICNBVjdWRU49JV1NOTZVQjk3KCAgJTQgIVAgQyAgOCQgICAgISA8ICAgIEogIFQgJEAgIAotTSBBJCAuJzk/OyZdTjlVXU05NlVCOTcoICAlNCAiQCBDICA4JCAgICAiIDwgICAgSyAgVCAkQCAgIENQIAotTS4nOT85RlFPODcxPzs2NU04RjVSICAhNSAgWCAoUCAmISAgICAgUCcgICAgKyAgLSAhKCAgIClIICNBVgotTTdWMU89NilMOTVdTTk2VUI5NyggICU0ICNQIEMgIDgkICAgICQgPCAgICAkICAgICcgIDcgISggICAuKwotTSAjQVQ3VzVOOjZdTiAgIlYgICAgIiAgICAiSCAjMCAyICAgIkxAIFg9RV1DOiYlUjdWVUU7NilFPEAgIAotTTUwICEgIiwgIUAwICAgICAhUCAgICJMICMwIDIgICAiVzAgWD1FXVM6Jl1SPSVdTTk2VUI5NyggICU0IAotTSEgIEMgIDgkICAgICAgPCAgICBJICBUICRAICAgUDggLic5Pzo2WVQ3VlVFOzYpRTxAICA1MCAnICIsIAotTSFAMCAgICAgIVAgICAiSCAjMCAyICAgIywgIFg9RV1MO1ZZRzdWVUU7NilFPEAgIDUwICogIiwgIUAwIAotTSAgICAhUCAgICJMICMwIDIgICAjNlAgWD1FXUY7Jl1BPSVdTTk2VUI5NyggICU0ICNAIEMgIDgkICAgIAotTSAgPCAgICBMICBUICRAICAgWDwgLic5PzkmXVU4RlFFN1ZVRTs2KUU8QCAgNTAgLyAiLCAhQDAgICAgIAotTSFQICAgIDAgICAgOyAhPCAkQCAgISpEIC4nWFE5RiVLOTAgIE1AICAgIEAgICAgSiAgVCAkQCAgIF0gIAotTS4nOT84VkFBPEVdTTk2VUI5NyggICU0ICAwIEMgIDgkICAgICAgPCAgICBLICBUICRAICAgX0wgLic5PwotTTxWQU88RzE/OzY1TThGNVIgICE1ICAwIChQICYhICAgICAgJyAgICAqMCAtICEoICAgMEQgI0FWN1ZFTgotTT0lXU05NlVCOTcoICAlNCAhUCBDICA4JCAgICAgIDwgICAgSiAgVCAkQCAgISRYIC4nOT87Jl1OOVVdTQotTTk2VUI5NyggICU0ICJAIEMgIDgkICAgICAgPCAgICBLICBUICRAICAhJ0QgLic5PzlGUU84NzE/OzY1TQotTThGNVIgICE1ICBYIChQICYhICAgICAgJyAgICArICAtICEoICAgMkUgI0FWN1YxTz02KUw5NV1NOTZVQgotTTk3KCAgJTQgI1AgQyAgOCQgICAgICA8ICAgICQgICAgKkAgJiAhKCAgIDM3ICNBVjdWLUg4Nyk/OUc1TgotTThQICA1MCAhIDEmICAgMzwgMiYgICA0LiAgICAhICAgICMkICFAIDIgICAlIyAgWD1FXVM6Nj1OOTYxPwotTThWQUE8RV1GPTZZQyAgITUgICghJDggICEwWCEoOCAgITQgICAgICQgICAgLFAgJiAhKCAgIDUjICNBVgotTTdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TjhQICA1MCAjIDEmICAgNSAgMiYgICA1UiAgICAhICAgICJMIAotTSFAIDIgICAlPEAgWD1FXVM6Jl1SPSVdRj02WUMgICE1ICAwISQ4ICAhNyghKDggICE6MCAgICAkICAgIAotTSxAICYgISggICA2SCAjQVY3Vy1JOVZZRTklXVM6Jl1SPSVdRj02WUMgICE1ICA0ISQ4ICAhOjAhKDggIAotTSE9OCAgICAkICAgIC0gICYgISggICA3QCAjQVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgICU0IAotTSFAJDFAICAlVUAkQUAgICYiICAgICAwICAgIEkgIDggJEAgICFAVCAuJzk/OjZZVDdWOVU7RiwgICU0IAotTSFQJDFAICAmIiAkQUAgICYuQCAgICAwICAgIFAgIDggJEAgICFEJCAuJzk/PFZFRztGNUQ3VkVOPSVdRgotTT02WUMgICE1ICBAISQ4ICAhQ0ghKDggICFGUCAgICAkICAgICxAICYgISggICA5VyAjQVY3VzVOPFZFRwotTTtGNUQ3VkVOPSVdRj02WUMgICE1ICBEISQ4ICAhRlAhKDggICFJWCAgICAkICAgICpAICYgISggICA6RQotTSAjQVY3VlFPO0Y9PzlHNU44UCAgNTAgKiAxJiAgIDo+IDImICAgOzAgICAgISAgICAjJCAhQCAyICAgJgotTVZAIFg9RV1TOjY9Tjk2MT87Jl1OOVVdRj02WUMgICE1ICBMISQ4ICAhTSAhKDggICFQKCAgICAkICAgIAotTSxQICYgISggICA8MSAjQVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzlHNU44UCAgNTAgLCAxJiAgIDwiIDImIAotTSAgPFQgICAgISAgICAiTCAhQCAyICAgJzAgIFg9RV1GOyZdQT0lXUY9NllDICAhNSAgWCEkOCAgIVMwIQotTSg4ICAhVyAgICAgJCAgICArICAmICEoICAgPVAgI0FWN1YxTz02KUw5NV1GPTZZQyAgITUgIFwhJDggIAotTSFXICEoOCAgIVpQICAgICQgICAgJTAgNSAhKCAgID5OICgsICEwJCAgID9KICAgICUwICUgISggICA+OgotTSAoLCAhMCQgICA/SiAgICAkICAlICEoICAgPkogJTQgIVAgICAgMCAgICBcICAkICRAICAhXkggRTAgIAotTSAqLCAqICAgIiAgICAgICAgICAgICAgKCAgICAgICAgICAkICAgQCAgICAgICAgICBAQCA8QCAgICJYIAotTSAgIDkgISwgJEAgICInTCAuJlFJO0ZMICArOCAgICI4ICAgIClAIC0gISggICBASSAjQU45N0FUICAiIwotTSAgNCEgICAnWkAgQyAgOCQgICAgICA8ICAgIEogIFQgJEAgICIlLCAuJlFJO0ZNRj02WUMgICIjICA0IQotTSAgICc8ICBDICA4JCAgICAhIDwgICAgRCAgVCAkQCAgIic8IC4nLVQ9NjlGICAhUiAgICdLQCBDICA4JAotTSAgICAiIDwgICAgJCAgICAlMCA1ICEoICAgQlkgKCwgITAkICAgP0ogICAgJTAgJSAhKCAgIEJFICgsIAotTSEwJCAgID9KICAgICQgICUgISggICBCVSAlNCAhUCAgICAwICAgIFwgICQgJEAgICIvNCBFMCAgICosIAotTSogICAiICAgICAgICAgICAgICAoICAgICAgICAgICQgICBAICAgICAgICAgIEBAIDxAICAgIlggICAgPAotTSAhPCAkQCAgIjhEIC4nMVU3VlFJO0ZMICArOCAgICIwICAgIClAIC0gISggICBEVyAjQU45N0FUICAiIwotTSAgNCEgICAnWkAgQyAgOCQgICAgICA8ICAgIEogIFQgJEAgICI2JCAuJlFJO0ZNRj02WUMgICIjICA0IQotTSAgICg+UCBDICA4JCAgICAgIDwgICAgRCAgVCAkQCAgIjg0IC4nLVQ9NjlGICAhUiAgIChOMCBDICA4JAotTSAgICAgIDwgICAgJCAgICAuQCAkICEoICAgRycgI0FeLEY5QTpWNCAgKzggICAgJCAvLCAmUCAgICApQgotTTsnNUUgICAgICAlRzxGNUU7QCAgICAgIDxGNUQgICAgICAwICAgIF4gIDAgJEAgICJARCAuJi1POyZdUgotTTxQICBNQCAgICAwIFxQID8gICAgIEchSTtGTCAgICAgIDchVTxHIUw5MCAgICAgID42NUw7Jl1XICAgIAotTSAgMCAgICBSICAwICRAICAiQ1wgLidYUzlGJUs5MCAgTUAgICAgMCBcUCAzICAgICA2OU88RjAgICAgIAotTSAmLUg5NzlZICAgICAgMCAgICBRICAwICRAICAiRzAgLiYtQTxHLCAgKzggICAgJCAvLCAlICAgICAlUAotTTtXKVM4VkFFICAgICAgIUI7NzwgICAgICEgICAgIyggISAgMiAgICpKQCBYP0MxRjg2TUUgICJWICAgIAotTSEgI1MgISwgICAgITUlKTUxMCAgICAgIDFEJSw0VDQgICAgICEgICAgIVAgJUAgMiAgICpRQCBYOEZdTwotTTsmNUE7QCAgPEAgICJHMCAgICBRICAwICRAICAiT0wgLiYpVjg2UVMgICJWICAgICEgI1MgISwgICAgIQotTT0nKVU5MCAgICAgIDlGJUw8VjQgICAgICEgICAgIVQgJUAgMiAgICsmICBYOEZdTzsmNUE7QyggICcoIAotTSAgSyYgICAgMUAgJCAhKCAgIE1CICNBTTo3LU88RjFFPEY1RCAgIlYgICAgISAjUyAiLCAgICAjPSZBUgotTTk2NCAgICAgICdJRTxGXCAgICAgIDZdTjkwICAgICAiPSc9TyAgICAgIDAgICAgQyAgOCAkQCAgIlhEIAotTS4mVUE6NlggICU0ICFQJDFAICAnSyAkQUAgIClPICAgICAwICAgIEcgIDwgJEAgICJbICAuJy1QO1cpVAotTTxWLUE8QCAgPEAgICJDXCAoUCAlIFggICsgICAgICBFICA8ICRAICAiXTQgLiYtTD02WUs5NyggICcoIAotTSAgSCkgIiwgITAuICAiTUggICAgKiAgJyAhKCAgIE9dICNBTjtWWVA8RkVNODcpWSAgIVIgICApUVAgQwotTSAgNCNAICBKPyAgICAiNCAhUCAyICAgLChAIFg8JylJOzYlUj4wICA8QCAgIjhEIChQICUgWCAgKkhQIAotTSAgIEQgIDwgJEAgICMkOCAuJzU/OyZFTjpQICA8QCAgIi80IChQICUgWCAgKlcgICAgIEcgIDwgJEAgIAotTSMmVCAuJy0/OyZFTjpQICBAUCAlIDAgICFeSCAoUCAlIFggICpQMCAgICBGICA8ICRAICAjKSwgLic5PwotTT02WUk7VlhSICAhUiAgICNCUCBDICA0I0AgIEwiICAgICI0ICFQIDIgICAsTiAgWD1FXVU7RkVPO0AgIAotTTxAICAgRlAgKFAgJSBYICArISAgICAgRyAgPCAkQCAgIy1cIC4nOT88VzFSPTYtVCxAICA8QCAgIDRYIAotTShQICUgWCAgKlJAICAgIEcgIDwgJEAgICMwOCAuJzk/PFcxUj02LVQsMCAgPEAgICAiWCAoUCAlIFggIAotTSpRICAgICBPICA8ICRAICAjMzQgLic5PzkmXVU4RlFFN1chTzo2WVQ5NyggICYsICBQJCAjUCBDICA0IwotTUAgIEsjICAgICJYICFQIDIgICAtOFAgWD1FXUY7Jl1BPSVdUDtWRU49JjVSICAhQyAgLCEgIFggKFAgJQotTSBYICAqVDAgICAgViAgPCAkQCAgIzlEIC4nOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICAhQwotTSAgLCEgIFAgKFAgJSBYICAqSCAgICAgVCAgPCAkQCAgIzxUIC4nOT88VkVHO0Y1RDdWUU87Rj0/PCZdSQotTTtHMUU8QCAgOFAgIyAwICsgIiwgITAuICAiTSggICAgKzAgJyAhKCAgIFdaICNBVjdWUU87Rj0/PCZdSQotTTtHMUU8QCAgOFAgIyAwICogIiwgITAuICAiSzwgICAgLTAgJyAhKCAgIFhPICNBVjdXNU48VkVHO0Y1RAotTTdWRU49JV1QO1ZFTj0mNVIgICFDICAsISAgRCAoUCAlIFggICpMMCAgICBTICA8ICRAICAjRiggLic5PwotTTxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UiAgIUMgICwhICBAIChQICUgWCAgKlAgICAgIEwgIDwgJEAgIAotTSNIWCAuJzk/OjZZVDdXIU86NllUOTcoICAmLCAgUCQgIVAgQyAgNCNAICBKTiAgICAjPCAhUCAyICAgLgotTVEwIFg9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXVA7VkVOPSY1UiAgIUMgICwhICA4IChQICUgWCAgKkZAIAotTSAgIFUgIDwgJEAgICNPSCAuJzk/PFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoICAmLCAgUCQgITAgQwotTSAgNCNAICBLIiAgICAiWCAhUCAyICAgLyogIFg9RV1TOiZdUj0lXVA7VkVOPSY1UiAgIUMgICwhICAwIAotTShQICUgWCAgKlUwICAgIFYgIDwgJEAgICNVWCAuJzk/PTZZUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1UgotTSAgIUMgICwhICAsIChQICUgWCAgKk8wICAgIFQgIDwgJEAgICNZKCAuJzk/PFZFRztGNUQ3Vi1IODcpPwotTTwmXUk7RzFFPEAgIDhQICMgMCAiICIsICEwLiAgIk04ICAgICswICcgISggICBeXyAjQVY3Vi1IODcpPwotTTwmXUk7RzFFPEAgIDhQICMgMCAhICIsICEwLiAgIktQICAgICkgICEgISggICBfQyApNCAgICJDICEgIAotTSAgQCAgICAgICAgICAwQCA1MCAvICAgICsgICcgISggICEgLyAjQVY3VjFPPTYpTDk1XUE8RylBPjAgIAotTTxAICAjW1wgKFAgJSBYICAqSSAgICAgRCAgJCAkQCAgJCMsIEUwICAgKiwgJCAgICIgICAgICAgICAgIQotTSIgITUgIFggICAgSyAgPCAkQCAgJCVYIC4nOT85RlFPODcxPzg3KVI4N0QgICcoICAhIC8gIiwgITAuIAotTSAiTSwgICAgKSAgISAhKCAgISIiICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICwgICAgLFAgJwotTSAhKCAgISJVICNBVjdXNU48VkVHO0Y1RDdWUU87Rj0/ODcpUjg3RCAgJyggICEhPiAiLCAhMC4gICJLLAotTSAgICApICAhICEoICAhIzkgKTQgICAiQyAhICAgIEAgICAgICAgICAgMEAgNTAgKyAgICAsMCAnICEoIAotTSAhJCogI0FWN1ctSTlWWUU5JV1MO1ZZRzdWJVI8RiVZICAhUiAgIDBNMCBDICA0I0AgIEpLICAgICIwIAotTSAwIDIgICAxK0AiNSAgICBIUCAwICAgKCAgICAgICAgICAkKCAlNCAiQCAgICJIICFQIDIgICAxNiAgWAotTT1FXUw7VllHN1YlUjxGJVkgICFSICAgMSJAIEMgIDQjQCAgSzcgICAgIjAgIDAgMiAgIDE/ICI1ICAgIAotTUhQIDAgICAoICAgICAgICAgICQoICU0ICIwICAgIyggIVAgMiAgIDFLQCBYPUVdVTtHLUk5VllFOSVdSQotTTtHMT84NylSODdEICAnKCAgISU4ICIsICEwLiAgIkpcICAgICkgICEgISggICEnMiApNCAgICJDICEgIAotTSAgQCAgICAgICAgICAwQCA1MCAoICAgICwgICcgISggICEoIiAjQVY3Vy1JOVZZRTklXUk7RzE/ODcpUgotTTg3RCAgJyggICEmTiAiLCAhMC4gICJLWCAgICApICAhICEoICAhKEYgKTQgICAiQyAhICAgIEAgICAgIAotTSAgICAgMEAgNTAgJyAgICAqMCAnICEoICAhKS8gI0FWN1ZFTj0lXUE8RylBPjAgIDxAICAkQCggKFAgJQotTSBYICAqSDAgICAgRCAgJCAkQCAgJEcsIEUwICAgKiwgJCAgICIgICAgICAgICAgISIgITUgIDggICAgVAotTSAgPCAkQCAgJEo8IC4nOT89NllTOjY9Tjk2MT88VkFPPEcxPzg3KVI4N0QgICcoICAhKS8gIiwgITAuIAotTSAiS0wgICAgKSAgISAhKCAgISsrICk0ICAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICUgICAgLEAgJwotTSAhKCAgIStdICNBVjdXLUk5VllFOSVdUzomXVI9JV1BPEcpQT4wICA8QCAgJEo8IChQICUgWCAgKkswIAotTSAgIEQgICQgJEAgICRSJCBFMCAgICosICQgICAiICAgICAgICAgICEiICE1ICAwICAgIEsgIDwgJEAgIAotTSRUUCAuJzk/PFZBTzxHMT84NylSODdEICAnKCAgIStdICIsICEwLiAgIktIICAgICkgICEgISggICEtUAotTSApNCAgICJDICEgICAgQCAgICAgICAgICAwQCA1MCAjICAgICxQICcgISggICEuQyAjQVY3VzVOPFZFRwotTTtGNUQ3Vi1IODcpPzg3KVI4N0QgICcoICAhLSwgIiwgITAuICAiSUAgICAgKSAgISAhKCAgIS8nICk0IAotTSAgIkMgISAgICBAICAgICAgICAgIDBAIDUwICIgICAgLDAgJyAhKCAgIS9YICNBVjdXLUk5VllFOSVdQwotTTomJVI3ViVSPEYlWSAgIVIgICAzSFAgQyAgNCNAICBKSCAgICAiMCAgMCAyICAgNCcgIjUgICAgSFAgMAotTSAgICggICAgICAgICAgJCggJTQgIDAgICAiSCAhUCAyICAgNDFAIFg9RV1DOiYlUjdWJVI8RiVZICAhUgotTSAgIDNeICBDICA0I0AgIEswICAgICIwICFQIDIgICA0OkAgWD1FXUQ7VzVCOyY0ICAlNCAjUCBDICA0IwotTUAgIEo8ICAgICIsICFQIDIgICA0QzAgWD1FXUY7Jl1BPSAgIDUwIC4gIiwgITAuICAiSkggICAgKlAgJwotTSAhKCAgITJYICNBVjdXNU48VkVHO0Y1RDdWUU87RjwgICU0ICMgIEMgIDQjQCAgSlkgICAgIkQgIVAgMgotTSAgIDRYMCBYPUVdUzo2PU45NjE/OyZdTjlQICA1MCArICIsICEwLiAgIklEICAgIChAICcgISggICE0IwotTSAjQVY3VlFPO0Y8ICAlNCAiQCBDICA0I0AgIEpVICAgICJIICFQIDIgICA1KzAgWD1FXVU7Ry1JOVZZRQotTTklXUk7RzAgICU0ICIwIEMgIDQjQCAgSjcgICAgIkAgIVAgMiAgIDU1MCBYPUVdUzo2PU45NjE/OjZZVAotTSAgITUgIEAgKFAgJSBYICAqRUAgICAgQSAgPCAkQCAgJTc4IC4nOT86NllUICAhNSAgPCAoUCAlIFggIAotTSpHQCAgICBMICA8ICRAICAlOiggLic5Pz02WVM6Nj1OOTYxPzxWQU88RzAgICU0ICFAIEMgIDQjQCAgSgotTTsgICAgIkggIVAgMiAgIDVTICBYPUVdUzo2PU45NjE/PFZBTzxHMCAgJTQgITAgQyAgNCNAICBKUiAgIAotTSAiLCAhUCAyICAgNVtQIFg9RV1TOiZdUj0gICA1MCAkICIsICEwLiAgIks4ICAgICpQICcgISggICE4OgotTSAjQVY3VzVOPFZFRztGNUQ3Vi1IODcoICAlNCAgUCBDICA0I0AgIEpJICAgICJEICFQIDIgICA2MFAgWAotTT1FXVM6Nj1OOTYxPzhWQUE8QCAgNTAgIiAiLCAhMC4gICJLQCAgICAoQCAnICEoICAhOUUgI0FWN1YtSAotTTg3KCAgJTQgIDAgQyAgNCNAICBLOSAgICAgMCAgICAnICAgICAgICJESCAgIS1QICAgIVlfX1wgICAgIAotTSAgICA+T19fICAgICxAICAgJ09fX1AgICAmMCAgICFdX19cICAgIjYgICAgP09fXyAgICBSICAgICdfXwotTV9QICAgL0ggICAiIV9fXCAgICRMICAgIEBPX18gICAhN0AgICAoL19fUCAgIDkgICAgIiVfX1wgICAnIgotTSAgICBBT19fICAgIV0gICAgKD9fX1AgICBCOCAgICIpX19cICAgKTggICAgQk9fXyAgICJFICAgICsrXwotTV9QICAgTSAgICAiVV9fXCAgICtGICAgIE1PX18gICAiWyAgICArP19fUCAgIE8wICAgIllfX1wgICArXAotTSAgICBOT19fICAgIyEgICAgK09fX1AgICBQUCAgICJdX19cICAgLDQgICAgT09fXyAgICMnQCAgICtfXwotTV9QICAgUkAgICAjIV9fXCAgICxSICAgIFBPX18gICAjLyAgICAsL19fUCAgIFQ4ICAgIyVfX1wgICAtMAotTSAgICBRT19fICAgIzZAICAgLEdfX1AgICBWWCAgICMqX19cICAgLVggICAgUl9fXyAgICNAQCAgICxXXwotTV9QICAgWFAgICAjLl9fXCAgIC42ICAgIFNfX18gICAjSCAgICAtJ19fUCAgIFpIICAgIzJfX1wgICAuVAotTSAgICBUX19fICAgI09AICAgLTdfX1AgICBcQCAgICM2X19cICAgLzIgICAgVV9fXyAgICNXICAgIC1HXwotTV9QICAgXjggICAjOl9fXCAgIC9QICAgIFcvX18gICAkISAgICAtV19fUCAgISBYICAgIz5fX1wgICAwOAotTSAgICBYL19fICAgJChAICAgLidfX1AgICEiUCAgICNCX19cICAgMFYgICAgWS9fXyAgICQwICAgIC43XwotTV9QICAhJEggICAjRl9fXCAgIDE0ICAgIFovX18gICAkN0AgICAuR19fUCAgISZAICAgI0pfX1wgICAxUgotTSAgICBbL19fICAgJD8gICAgLldfX1AgICEoOCAgICNPX19cICAgMjAgICAgXC9fXyAgICRGQCAgIC8nXwotTV9QICAhKjAgICAjUl9fXCAgIDJOICAgIF0vX18gICAkTiAgICAvO19fUCAgISwoICAgI1dfX1wgICAzLAotTSAgICAgL19fICAgJFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgJCAgICAhICAgICBIICAgLTAgICAjNCAgICAkUCAgICAgICAgICAgICAgIDAgIAotTSAgICAgICApICAgICEwICAgICogICAjSCAgICBaICAgIDtQICAgICMgICAgICAgICAgMCAgICAkICAgIAotTSNQICAgIEwgICAgIkAgICJJICAgIEowICAgIyAgICAgISAgICAgJCAgICAkICAgICQgICAgITwgICAgIwotTSAgICAgSCAgIFYwICAgLUQgICAgPlAgICAgICAgICAgICAgICAwICAgICAgICAgPyAgICAhICAgICAqIAotTSAgL0AgICAjWCAgICAjICAgICAjICAgICFQICAgIDAgICAgLCAgICAqMCAgICAkICAgICZAICAkJCAgIAotTSEhICAgICAkICAgICAgICAgICAgICAgJCAgICAgICAgICJcICAgICEgICAgIUggICEhMCAgIDA0ICAgIAotTTkgICAgICAgICAgICAgICAhICAgICEwICAgIFQgICAgIDAgICAgOiAgIDFYICAgJD4gICAhNDAgICAgIAotTSAgICAgICAgICAwICAgICAgICAgLkAgICAgJCAgICAmQCAgKU8gICAiO1AgICAgJCAgICAgICAgICAgIAotTSAgICQgICAgICAgICAkICAgICAhICAgICBYICAqPCAgICBHICAgICAiICAgICAgICAgICAgICAgISAgIAotTSAgICAgICEmICAgICAwICAgIC4gICJHKCAgIClSICAgICFQICAgICAgICAgICAgICAgMCAgICAkICAgIAotTTJQICAgIDggICAgI0AgIElZICAgIj4wICAgIVAgICAgISAgICAgICAgICAkICAgICIgICAgJTAgICAgKAotTSAgICAgWCAgKkVAICAgSTggICAhUCAgICAgICAgICAgICAgICIgICAgICAgICAhOSAgICAgQCAgICAgIAotTSAgICAgICAqNiAgICFQICAgICAvICAgICcgICAgIDAgICAgMCAgICA4MCAgICAsICAgICAgICAgICAgIAotTSQ1QCAgIDM0ICAgICAgICAgICAgICAgISAgICAgICAgICZEICAgICMgICAgICAgICAgICAgIThMICAgIAotTSAgICAgICAgICAgICAgICAhICAgICAgICAgIVAgICAgIFAgICAgICAgICAgICAgNisgICAgKSAgICAgIAotTSAgICAgICAgICAkICAgICAgICAgPkAgICAgJCAgICAgICAgICAgICAlS1AgICAjLyAgICAgICAgICAgIAotTSAgICQgICAgICAgICAoLCAgICAhICAgICAgICAgICAgICE+LCAgIDY8ICAgICAgICAgICAgICAgISAgIAotSiAgICAgICIqICAgICAwICAgICAgICAgICAgIE1fICAgIEkwICAgICAgICAgICAgICAgMCAgICAgCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2UvbWlwcy1lY29mZi51IGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9taXBzLWVjb2ZmLnUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZjY1NmEuLjAwMDAwMDAKLS0tIGEvZ2RiL3Rlc3RzdWl0ZS9nZGIuYmFzZS9taXBzLWVjb2ZmLnUKKysrIC9kZXYvbnVsbApAQCAtMSw2NzEgKzAsMCBAQAotYmVnaW4gNzc3IG1pcHMtZWNvZmYKLU0gNiAgIjJHPF8lMCAgIyAgICAgIDggIFggIDwhIlAoKiAgIEAgICAgJCAgICApPSAgJCAhUCAhICAgIDAKLU0gICAgJCAgMCAvL19fX1ggICAgICAgIC1UICAgICAgICAgICAkICIqQCJZVDk3QVQgICAgICQgIVAgISAKLU0gPCAgICFFMCAgICFQICAgICAgICAgICAgICAgICAgICAiIE46NllJPSAgICAgISAmUSAgMCFMMCAgICAKLU0oICAgJlEgICAgICAgICAgICAgICAgIiAgICAgK0YxQT0mJCAgICAwICAgICQgICAgICAgIkkgICAiICAKLU0gICAgICAgICAgICAgICAgICAgIDAiWUw6NzBYICAgICQgICpEISAgIkkgICAgIDAgICBKRCAgICAgICAKLU0gICAgICAgICAgQCAgICBOOyZFVC0gICAgISAgIkogMCAgSkAgICAgJCAgICpKICAgICAgICAgICAgICAKLU0gICAwICAgICtHLUQ4NzFBICAgMCAgSlAkICAqTCAgICAmICAgIkpQICAgICAgICAsICAgICAgICAgICIKLU0gIllTOEctUyAgICAkICArJCEgICJRICAgICUgICAgICAgICAgICAgICMgICAgICAgICAgISAgTjhHLVMKLU0gICAgICEgICMlIDAgIFEwICAiOlwgICAgICAgICAgICAgICAgICAgICAgICAgIiA8Ry1SOFAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAoXkQKLU0gICBcJyEgISlaNCAhIj48QkggRElAICQgIDAwQCpeJUA5MCBQQyBBKVtXX1oqXiZAIyJPSCAgNCAgI1AKLU0oMFAwIUw+T0EoJjAjISAhOSAgICAgICwkICVIICAgQCg4XiRAOSIvQTgmNENYOiAsIFAwIC5MICAgICAKLU0jISAhSSAhICgiJCAgICAtIF4gICIgICAgICBHTzAgKCBeICAiICBAXiIkI1ggICggICAgICAgICAgICAKLU0gICAgICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAKLU0gICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAKLU0iICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEKLU0gXiAgIiAgICAgICNYICAoICAgICAgL0AgIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAKLU0gISBBIF4gICIgICAgICAjWCAgKCAgICAgIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAgL0AKLU0gIEAgICEgQSBeICAiICAgICAgI1ggICggICAgICAvQCAgQCAgISBBIF4gICIgICAgICAjWCAgKCAgICAKLU0gIC9AICBAICAhIEEgXiAgIiAgICAgICNYICAoICAgICAkMiAgICAjWCAgKCAgICAgIC9AICBAICAgICAKLU0gXiAgIiAgICAgISRAICAgMSggKCAgL0AgIEAgICAgICBeICAiICAgICAgI1ggICggICAgICouIEApIEQKLU0jQCAhSFhaIEQyMC8gICpDQ1giMikhQCAgWj44QCkwRCYwICRJWUYgRUIwKCAgNkdCKCI4KSBEICFKXikKLU1AKVBEIkAgJ0tYSiBIIjArICBCT0JYIkQpIFAgIjpeLEAqQEQjMCAqS1hWIEsiMC4gIE5PQ0giUFFYMiAKLU0oICAgICAjR0EoIlRRWD4gJCw+JkAhM0dBWCJYWVg6IE8pLi9AKSAgICAgIEhYXiBQKS44QCkkICAgICAKLU1IWUIgUEkuOUApKCAgICAgSFlGIFEoPihAKTAgICAgIElYQiBSKD4pQCk4ICAgICBJWEYgUyk+KkApQCAKLU0gICAgSVhKIFQoXitAKVAgICAgIEtYTiBWKF4sQCogICAgICBLWFIgWCheLUAqMCAgICAgS1hWIFooXi4KLU1AKkAgICAgIEtYWiBcKF4vQCpQICAgICBLWF4gXiheOEArICAgICAgS1lCISAsPihAKzAgICAgIFlYQiEKLU0iLD4rQCtDJ0JIIlwvICQwIC4wSzhfI0QqRi9UKVlGIEQqXjlAMSBHQigiMUtYQiElIj4pQCkqT0I4JDgKLU0pWEogRSpeKkAxUEdCWCI2S1hOISgiPixAKUJPQygkRClYViBHKl4tQDJAR0NIIkBLWFohKyI+L0AqMk8KLU1DWCRQKVlCIEoqXjhAMzBHRjgiTEtZRiEuIj4oQCsiT0IoJFwpWEYgTSpeKUA0IEdCSCJYS1hKITEiMCsKLU0gICpPQlglPCkgUCAgSl4sQDYgRCMwICFLWFYhOiIwLiAgJk9DSCVEQ1heITYjUCEkICJMK1YsUEFZQiEKLU0yICAgICAiR0YoJTAgXiAgIiAgICQiJCNYICAoICAgICAgICAgICAjWCAgKCAgICAgICAgICAgICAgICAKLU0pW1ddNCAiICYiJEQjT19fS1tcICchMUAgISZPS0AgRC8gMDAgIFAwIDswREEgKCQkJCAgITAhICYiJjAKLU0zUCAgICAgICAhN0AgIEAgICAgIERZQiAwICAgICAgMyAgICMgICAgICEgICAiLCAgISBBKVguIDEjUCUKLU0kICJDQCghICkqNCIkIj5EIEMgLCQgJ1RLWiwiTCheQyBLIEdJICheIyEgIV0gIUAqIiRHSSAoUCMhICIKLU0oICAgKiIkJDAgIDEgJCBAKDI+RSAiUEQhQCgiIyEgIioqXkQgIkBEIDAoIiUkJCAiKF5EICJAXCEhICAKLU0pKDAgICI+RSAiUCwkIChQKSA4IiBKXkAgIjIvSSAgSCMhICJdICAgICAiL0hAIEQgICAgICheXyAhUEcKLU1PMCpQIF4gICIgICAgICAgICAgIClbV19YKl5fICFQLCQgLC5LWjAgKCBQMCBSQCAgICAgQ1owICggUDAKLU0hNFAgICAgIENbXCAnIj5dICIgI1ggICggICAgICAgICAgICAgICAgICAgICAiPl1fXiIvQEggUEtbJCAKLU0mKl5QICEwIEAoQEFLW1wgJyExICAgLCAwKCBBJCAgICUwICAkIiYvQ0ggUCAgICAgKFcvICAgICAgICAKLU0kPiAgI1AgICQiJi4hMCAgICAgICAgKEAoIiQsJCAnNylBICAhISEgICAsIDAhQEEkICAgIUAhQCQiJi4KLU0hMCAgICAgICAhMkBfXzwiKCIgQSAgIDAoOF5fICFSL0wgIDRDWyQgJiAvQCAgQEdPMCBARCooICApIiMKLU0gICBESTAgISQkLCAhIjAmICNUMCAgICwpIDggLzIwJiAjVCA4ISBBJSQ4ICBSMiQgICQjWCAgKCAqIDAKLU0oOSJCICAiMEBQICApKjQgIDEhI19fQCA4ISBBJSYgICIgICAkIiYwS09fXyAgICAgITMuICAwICAhIEEKLU0gXiAgIiAiQCQiJCAgISBBIF4gICIgICAgICAgQCEgQUAqQCAgIzItICAsMSAgIEQgOjFQKEgiSSAgJCAKLU1LR0BAJDIgICdQICAgICIgSkAgIiAgICAgISUgICFKKEsgICBAKkwgIFlCTCAgLDE4ICA0SihQICAiJkQKLU1fX1YhWiAgISg+XCAhISQgICEsQEEgICRAPkdfX0AgICAgIDEoICAuICAgICAoJ0pfX1wgICAgICQ0ICAKLU0iOEdMX19WIVpQICBGPlAgICE1QF9fJkxDICAgIF4gICIgICAgICAjWCAgKE4oUCAgWiIqICAqQEIwICEKLU0gXiAgIioiKCAgICAgICAgICAgICAiMCIgXlQgICAgLCQuICAgUCAgICAgKCQgNTAgICAgICAvQCAgQCAKLU0gICAgKSAoI1pQICAgIFAwWCAgIyAgICAgIEAwITUgICAgICAgXiAgIiAgICAgIDBQICA6ICggWCgxIkQKLU0gIUAgQTBASiUiICAiIkMhICEgIElBIEAgKCgoKkEgQCAgMEhQMCAwJCAgIDZSQyEgISBIUDAgMCUiICAKLU0hMCAgICAgUEhAICMsKCwgIFEhIyAgTCAgICAgJCwgICFQICAgICAgSUFAQUAqKCAgIjJFICAkREEgICEKLU0lKi9fXyoiIl9fXCNYICAoIC4gMCgxISAgIUBEIDAgISQkJCAjUjAhICAoMDAwICcgICAgICgiQiAgIEQKLU1JMCAhKSgwICAyMyZfX1wwICAgLkgoK19fWDJCICAgREkwICIpKDAgIEIzJl9fWDAgICAoSSgrX19IIkIKLU0gICIkSFAgIUgoKCAgIjJFICAsREEgICMpLDtfXzoyI19fWEhQMCBAJSIgICVCQyEgISIsSEAgIEMqLCAKLU0hKFJIICBCLEowICxDKkggJChSSyAhMixLICA4QypUICcqUiIgICJMQFAgJEsoQCAiKlIpICBSTEJAIDAKLU1LKEwgJSpSLCAhQERJMCBAKSgwICgiMyZfXiAwIC9fSksoV19fIkMhICEgNCggIC4qLCQgIShSQiAgIiwKLU1IUCAkQypAICIoUkkgIFJMQEAgIEsoLCAhKlIoICBAREkwIDApKDAgJCIzJl9fIDAgL19SSyhHX18iQyEKLU0gIDA0KC9eVSAgICAgKFJCICAgREkwICQpKDAgISIzJl9fUDAgL19YSygrX18iQyEgISAgSUJAQCUiICAKLU0hMCImKCIgUEhAICMsKCwgIFEhIyAgVCAgICAgJCwjX0swICAgICBEST9fXykoM19fUCJGJiIuIEhAICAKLU0pKjdfX1IyJF9fXDRIX19cSCgoICAwL0AgIEAgWCEgQSQkICAmIjAhICAsMDAwIC8pICQgIEEhISAgPCAKLU0gICAgQCorX19SMkVfX1xEQS9fXyksO19fUSAgICBaQEBAICBBKitfX0IyRV9fWERBL19eKSw7X19BICAKLU0gIEJEQEAgIEAqK19fWDJDX19WQEBPX18pKjdfXzIyJF9fVERRT19dSSgsICAiQyEgIiA0KCAgNiosJCAKLU0kKFJCX19SLEhfX1hDKkNfXShSSV9fIixKT19MQypPX1ooUkxfXjIsSz9fQEsoK19fKlIjX19CTEIvX1QKLU1LKEdfXCpSKl9eUkxCX19ISyhTX1kiMkVfXiBEQS9fQCksO19YISAgX15KTEMwICAqLCQgJCEwQCAgWEgKLU1QMCAkQyorX18oUkNfX0IsSi9fVEMqR19cKlIiX19STEBfX1hLKENfXSIyRV9fIERBL19QKSw7X1whICAKLU1fXypMQjAgICosJCAhITBAX1ssICAgICBDKitfXyIyRV9fUERBL19cKSw7X18hICBfX0JMQEAgICAgICAKLU0gICAgICAgICAgICApICgjW0AgICAgUDBYICAjICAgICAgQDAhNSAgICAgICBeICAiICAgJCIkMEAgIC8KLU0pICggIDheI0AmICAgICAgKiYkICghIEAgIEhEIEAgISAgLVBAI1AhJCAgICtAQEEpJiwgIDpQRCBCIk8KLU1AWCFAIF4gICIgICAkIiREIEAgISBeICAiICAgICAiL0BYIUApW1dfWCpeXyAhUk9MMCA4S1sgICUhQUAKLU0gIFxEOE9fXy8gXDAgIjdPIEIgICBHIiAvISQwICI4USBCICFTWCBBQ0FAICAgICAgICAjIC9AKSAgICAKLU0gIjgwX19QIiQwQEskIiNfXjAgICAgIi9PUCA8Q1sgICUoXlEgIUAjWCAgKClbVCAoKF4uQCcgR08/X0AKLU0vIFwwICpeUCAhQEVbUDBVLyEgMCAgJy8iIk5PT1AgPCUiICAkMjgwISMwXCYhICBDUUArICAgICAgIDMKLU0gICAlICAgICAgUDAgVzgiICIgQSQgICAgUCAgICAgLCQgLSYgQCBAKDheOUAnIEYkICAwIEFEKCpRMEAKLU1fXyQgICAgIENbXCAnKF5QICFAI1ggICgpW1QgKCI+XV9dQk9MICA4ICgiICg6Xl8gIVA2ICAgIykgL18KLU1fUSAgICI0RCBPX19EQCggIyAgICAgIFAzQCIjJDwgICUjITggIEBQM1AgJikgJCAgQTdBICA4ICAhQEEKLU0jISAjPUAoICgiJDAgICAiICQgOCgwICAmIiYyISAgLSMhICJdKl5DICIyL0hQIEQhJCQgIEAgICAgIEQKLU0gX19fREAoICMgICAgICBQNiAgKCRQICAhQCAgICAiLiEgICgjISAmJkpeQyAiMi9IUCBES0AgICIoWDkKLU0gIEJCICAgLEtAICAgICFAJCImTiYwICRDW1wgJyheUCAhQCNYICAoKVtUICoiPl1fXiJPTCAgOCAoIiAKLU0oMTggICEuT09QIDxDWFogPCNQLyQgIEVbUDBVLyEgMCAgJy8iIkw0KCAgKilBICQtISggICAsICAgICAKLU0jISAjPUAoICgiJi9GKCFQKUEgICQgKDgiIkw0KC9fWCAgICAgISAgICNAICAhIEFEQCwgIyAgICAgIFAKLU04QCAiJSQgICMjIUggIDIuITAgIERAMCAjMjAmICAkLCQgOVAgIDRIKFhYOSAgQk4gICAgICAgMCgxICAKLU0gIkZOJjAgJCwmQCAhITQgICIgUDswIEAkJCAgJ0MhTSAiIi4gQCAoICAgICAhISAgIUhQOzAgQENARCAKLU0hICAgICAgIDIwQEskIiAgJTMhTSAiICwkIDE0IEAgQCg5KCMgIFAgICAgICwmSCAhITUgICBYUDswIEAKLU0sJkwgIEElQCAgTFA7MCBAQ0AoICIgICAgICAwMCAgJywmVCAoKFgsICAwICAgICAgJFAoKlEwQF9eWCAKLU0gICAgLCZUICghJkAgIDAgICFAQSQgICAgQjAjX19cICAhQEEgJiAwKDheXyAhUi9MICA4IF4gICIiPl0KLU0gIiBHTz9eUEtbICAnKl5fICJST0xQIEggKiIgKDpeUiAiMk9MMCBAS1owIDQpKCMgIFBEJDAhIikhKCAKLU0hQjAzICAoUDtAITIlQlggKTMhTCAhOjIjUCAtLyFEMCAgIC9QKCAjLixAQUNTRCJIKFgiICAwICAgICAKLU0gJUQoKlEgQCAkXCAgICAgQ1pAIDQiMCEgIEpAMiAgIENARCAhICAgICAgRSpAICFLQEggISkuSyAlLCAKLU0gICAgJDYkICEgICAgICIvSEAhMCQgICA4KF5fICJQLCQgMTQgQCBAKDIwIV9fXDQwMCAkQ1osIDQhICAKLU0gICxEIF9fX0NaLCA0ICAgICAgMCAgITQgJiAwKDMhTCAhODYzICA0LCdAICRIXk0gJSBHSTAhLEhaVCAKLU0zKSgkICBWTiAgICAjISAmPiIwJiAgJEQgMCAhJSQkICEgICAgICIvSEAhMCQgICAxOF5fICJSMiNAICwKLU0pICtfX1M3LyAiIDAgICBfSEBcICMjIVggISg2PiAgMCAgICAgKFgiICBAICAgICAkJCAgIyAgICAgIi4KLU0mMCAkICAgICAhMTkgIFAgICAgIENAQCAgICAgICAgNSAgICggICAgICMhSSAkMDUoICAmICAgOCgwUDAKLU0hKUgiICIgQSQgICAgQCEgJiIkICAhQEEkJiAgIFAgICAgIDAgICBEKSArX19ZKCMgIFAgICAgICwmSCAKLU0xITUgX1o8UDtAITIjISAkNSAoICgiJi4gQCAgICAgICAiMSJfX1wkMDAgJktAKCAgKS5EICUsLCQgLygKLU0gQCBIKDEgICAgSjIjUCAsQ1pMIDQoWCwgIDAgICAgIEg4TCAgKFgtICAwICAgICApOlggIDpYLiAgMjIKLU0jUCAsICAgICAjJ1ggIiAzICAgJENaLCA0ISAgICAsRCBfX19DWiwgNCAgICAgICA4ISBBQ1tcICsoXlAKLU0gIVIvTDAgQENbKCApKF5TICJAI1ggICgpW1QgNCI+XV9eIk9PUCA0ICggWCg4U0MgIEIwW1AgLEMuWCAKLU0hICFAKiIkUV4gISRLLjQgISEsICAgQCFRMyBDRC9EICMzUCkkICBFKjAqQCAhRSBAICQpKCIkMCAgICoKLU1LLiAgICkjSiAgVFwjISAgKThQIkggICo2KCAhOyIgQUMoVCAgICAgICAgIUhRIENLLiggIChTQiAgICAKLU0gICAgISQkICEgISAmIiQwICAgIiAgIDgoMCEgJiImLENAICBDLlwgISAgICAgICFTXCBDIFAsKCpBIEAKLU0gIEggICAgIEtaNCAnKl5GICFAIFgiIEEjISAlLUpeRyAiIi9JMCA8Q1o4ICYoXkcgIiAgICAgICYsICAKLU0jUCAgJCImMFkgIC1LWjwgKCBQMCFHQk9JQCA4Q1o4ICYoXkcgIiAwUEAgJyAgIDAoOSNZICBQRCBPX18KLU0tUkAgKCEgICAgKkBaICAsICAgMCg4Xl8gITBHTzAgQCBeICAiICAgICAgR08/X0hLW1wgJSkiIiAgUEQKLU0gMCAiLCRYICRBJyEgIFAgICAgICwkXCBAQTdAICA4RCA/X08jISAmQFIwJCAgRDAgICBSKSArX19SMCEKLU1fXlwgMDwgRC1RRCAgSiI5ICBSLEBQICggICAgICExQCAgPCAgICAgIyEgJFc6XkQgIUIvSSAgOCAgICAKLU0gKFIjICBAICAgICBDKEAgISAgICAgIDQ6ICBAICAgMCg5IikgIFAgICAgICwySCAxITUgICFMICAhIEEKLU1EKEwgIzNQLSQgIEVLMCpAICBNQEAgJi0qIiYsS0AgICAgICAgICcjPiIuTENQICBDKCggICAgICAgICQKLU0wMCAkICQgOCgxICAgICggICFAQSAkIDgoOFJYICAiLEYwICQgICAgICAsOTAiLCEgUEBKJCIgICEgICAKLU0kIiQsJCA0ViAgICAgICAgJCImL09QIDQpW1QgJiAvQCAgQCAgICAgKVtXX1gqXl8gITAgQCJAQUQqWCAKLU0jKSJDICBUUVNQICQkPiAgIyAhQCwiJFwmMSAgKVNFQCIgICZQLCAjJjEgQSAgLShAI1AhJCAgICowQEEKLU1LKiggIiIxKCAgQDAgICBUSyJAIkgiQyEgICgwKCAgMyAgICAgITMgICA4ICAgICAvICwwICIxQyQgIkwKLU1IUCAoJCAgICEwIUAkIiRcIFEgICkmLSAgKlJDICBAIDghIEFEKkwgIzNQISQgICAiViIgICJQKCgyMSoKLU0oICAwICAgP0siSCJIKl5FICIgRCEiICgjISAlNSpeRiAhUi9JMCBAQ1o4ICchISAgIFJMSEAgKEQqVCAKLU0jKSJZICBWLEtQICgvICQwICM2TiAgQCAmNCIgSCpYICMgIEgiIiRFXiIgICQgICAjKlBYIEogXCJRICAKLU1EKlAgIzI1SzggQCAhREMgIDJMMCgzUCEkICAgIyZCICAiVCgoOlJCICBARDJAIChLIkgiSChSTiAgQCAKLU1QIiBBSypYICEgUDAhSEJPSTAgQENaNCAoISEgICBGL09QIDREKiggIyAgICAgIFAzUCAkJT4gICEoXl8KLU0gITBUNjAhIEgrRCAjKF5fICEwR08wIEAgXiAgIiAgICAgIjBDQCAtLyAsMCAgIC4+KCAgO1FAQUMmLCIKLU1IKFI4ICAwICAgICAgJ0AwKFAxISAgLCAgICAgIF4gICIqUiMgIDIsRjAgICAgICAgICE5IiJIMCggICIKLU0gICAgICpSIiAgICNYICAoICAgICAgICAgICAgICAgICkgKCNaMCAgICBQI1ggICggICAgICNQISQgIkwKLU0oQFA4IF4gICIiMCJfX1xHTz9eSEtbOCArKl5SICFST09QIFRLWzwgLCpeVSAiQi9DSCVQS1swICkqXlMKLU0gIiJPTDAgOCAoIjAoOl5QICEwMVAgICQgICJQKDheJUA4MDAgICArKVk2ITwiPiJANzBHRTglUEtYKiEKLU0/IzEvICAmT0NYJVAtS0AgIDAqQC4iJk9GKCVUICQgSCg6XidAN0IvQVglWCkhP19fUjA0X19YIFgoQEEKLU0gICBQKDhYQyAgICAgICAgICYgMCgzITkgICQ3KCAgPSBCIiAoMCFAQCImLiBAICApRDAgIVAgJCgoKFAKLU0yICAhJTAgICNAICQoKCAiKCNAQUtYPiE+ITJQICAqTihAICAgQiBIKDhYQyAgICAgICAgICYiICg4WCIKLU0gICAgICAgICwkRCAgMSRAX184ICAgICAgQjAwKDAoIiIiTDQoICAjICUkKCpRIEAgJkggICAgICAmIDAKLU0oMChAQCIkIDUoQEQgQSQoKlEwQF9dTCAgICAgQ1hKIT8gICAgICAyIkAgIyAgICAgISAgICAyT0E4JiQKLU0kQzQgITIzJiAgJk9BOCYkJCAgIDpQICAkIiREUUAgISssJCAgQTBAX1xQICAgICApRCwgIVAgIyYoKk8KLU1IUCBYICoiKCgwICAoIiQsJCA6QEtYNiFBKF4rQDdSL0hQIFgpNlAgISEhLCAgUCAwKCBBKSY4J19QICYKLU0sTChQMSAgIyQoICAkICAmLFQgRCMwICQgOjA4KFAhQEwiJCAwWCBBJCAgICJAIzYsIiYvQTgmJENYWiEKLU0/ICAgICAgIVE3QEMgIF8gQFAhWCwiLERRQEAgICA4UlBAICYsVCAiIUxAQSBTICgqUSBAICAwXCA3X18KLU0kICAgMDAgICQiJFwgN19fLSInQCAwIyEiIkw0KCAgLSAsIjgoM1AkP19cVEEuICAjISAmSCpeRiAkQi8KLU1JQCEoJSU8ICEjUCFAICAwICAgUyAgIDAoM1AhQCAgVCgyICAgLCRQKDBQMCFKICBQIiBBJSU8ICEwICAKLU0gICAsJCA6TCBAIEAoMSAgICJAICAhIEFDWEIhPyAoMzIiJCEtRSBDKTRPX18qVDAgICJOIlAgIENYUiEKLU0/ICggKiIkRUMwICQkQFQgITM6QiAgJi1DQCAgICAgICAjNy8gICZNQ1AgIENBQCAgICAgICAiT0YoJVwKLU1DWUYhPyEgIF9XPk8oQCAgICQgWCgwI1AiIkwwKCAgJi0uRCAgOFNIICAgICAgICBLWEIhQCpTQyAgIFQKLU1aMCAhJCskICEqWEkgICJPQVglWCQgICAhKl4lQDgwIFgiQEFLWDYhQSpeJ0A3QEYoQCAkQ1tcIC0oXlAKLU0gITIvTDAgOENbKCAnKF5TICIiL00gIERDWzQgKiheViAiUi9NUCBQIF4gICIiPl0gJUAwQCAgLSAoIDAKLU0oMjIiX19ST0BIJVhDJFggICIwIV9fWCFQN0BESyRcICAoUTkgICIvRiglXCAgICAgITw5ICAoICAgICAKLU1LWCohQSAvQCAgQCAgICAgKVtXX1IqXlAgIUAgQCggQSRAICAuKl5fICFSLiBPX1wgICAgICMhLiAgJDEKLU1QICAoICUgOChQKCAoIiQsJCA4OktaNCAvKF5FICNSLiBPX1wgICAgICAhMCYiLCAgUUIjS1osICkgIkAKLU0oIiQsJCA1NEtaNCAvKF5DICIyL0kwIFwkJCAgITAhICgiJDA0ICAjICAgICAhMkAgIDBESVAgIyQgICAKLU0oMCIgJCIkRElQICMgIDxYQEAjQyIiTDAoICAiICAgICAgI0AmIiZPSSAgVCBAIEgoMCAjLCggLCQgKFAKLU1LWjwgKCheRCAjMi9JUCBAICUgKCpRIEAgISAgICAgICAgPVhAICEvJiIkIDwgQEslIiAgIlAgICAgICAKLU08LEBDICFFIEBYXjhAOCAgIiRCICAkRTAoMSAgICAyTTYgICAjISAlNSAiQCgiJCAwIiBBICggMCg4Xl8KLU0gIVIvTCAgOCBeICAiIj5dICNAICAgICAgICAgICIwIiBfTCAgICAsJC4gICBQICAgICAoJCA1MCAgICAKLU0gIC9AICBAICAgICApICgjWyAgICAgUDBYICAjICAgICAgQDAhNSAgICAgICBeICAiICAgICAiL0BIJjgKLU0gXiAgIiAgICAgIk9BKCY4IF4gICIgIiAkIiQgICAgICAgICAgIj5dX1siT09QIDwjISAmQCpeRCAlIi8KLU1JICEwS1ooICkiMCU1IEAsJCA6XClaOCAqIDEhICA8RCBAICFDWjAgKSBQMCFILCAgICAgJCAgICBAICAKLU0kIiREIEAgIUNbXCAnIj5dICUgI1ggICggICAgICAgICAgICAgICAgICAgICAjUCMkICIsOFBKJCkgKCMKLU1eMCIjKCIkICAgICwlLiAgISNQISQgICA4ISBBIF4gICIqUEQiSDAoJCA1MCAgICAgI1AiJCAiLDBASiAKLU0gICAgICAiIiIiTDAoICAiICAgICAgISAoIiREIEAvWSAgICAjITNAX18wXCAxICBLIjAqQSAvQCAgQCAKLU0gISBBICAgICAgICAgICBEIEAwPiAgICAjISNAICAsICAgICAiISAlNCAgICAgICNYICAoICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgI1ggICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgKCIgQCgiIEAoIiBAKiJASCoiQEAoIiBAKCIgQCgiIEAoIiBAKCIgQCgiISgkISAwJCEgMCQhIDAKLU0kISAwJCEgMEEoMiRBKDIkQSgyJEEhIDAkISAwJCEiIUA4JiFAOCQhIDAkISAwJCEgMCQhIDAkISAwJCEKLU0gMCQhIDEgMCQhIDAkKCoiQEgqIkBAKCIgQCgiIEAoIiBAKCIgQCgiIEAoIiBAKCIkISAwJCIgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCgjISA0JiFQQCkKLU0iQEwsIzBYLyQhJDIkUTA1JUE8OCYxSDsnIVQ+J1IgQShCLEQpMjhHKiJESipSUE0rQlxQLDMoUy0jNFYKLU0tU0BZLkNMXC8zWF8wJiVCOFYxRTlGPUg6NklLOyZVTjtXIVE8Ry1UPTc5Vz4nRVo2VVE9N0VdQDA0KSMKLU0xJDUmMVRBKTJETSwzNFkvNCUlMjRVMTU1RT04NjVJWz8nVV4/UCAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIzIlKSMzJCUzNFAgICAgIE87JkVCK1YtSDxGLUwKLU04Ny1TK1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAhICA4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICQgICAgICAgICAgICAgICAgICAgICIgMCAgICAgICAhICA4IUAwICYgOCFAKCAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKj0gJCAiRzAgICAKLU0gICAgICAgIDAmRCAgICAgICAgICAgICAgICAgICQrKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgMCAgICYlUzhWRUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgJCAgKj0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLU0gICAgPCBEIiJAICAhRCAgICArICAgIFA4ICAgICAgICAgICAgICAgLSAgICxSICAgICRZICAgXUwgICAKLU0gICAgICAgICAgICIkUCAgMyVQICAgQSwgICE0SiAgICFCMCAgJVNUICAgICdAICA4UUAgICAhPCAgIUsKLU1CICAgICg8ICAmU1gsLyBAWCMgMDAtISBUJCAwKCoiISAhOSBcIyAwJCElQFAlIEEoISAwKDA0JSEwNCUKLU0hMDQlITA0JSEwOCcsISQxKDEkMSgxJDEoMSQxKEEsUiRBKEIkQShCJEEoQiRBKEIlIiQxJDIkMSQyJDEKLU0kMiQxJDIkMSgxJDEkMihCJFAkISwtIiAgIEJQNigsICIxJDAsLyA0JEEwRjUhIEIpMCYgICBaIF9fKiEKLU0gIFwyJFA0UFgjJDclISQ4ICE8MiQxQCEkMSkwOCEgMCQhIDAkISAwJCEgMCQhIDAkISBQJCEgMCQhIDAKLU0kISAwJCEgMCQhIDAkISBQJCIgMCQhICAkISQxJDAgMCQxJDEwLyBBLEEgMiQ4KCAiQSAwJDckMCghIEAKLU0kLiEgXCgkICJBKDIsISBAJCEjMDwhIEAkISMwPCEgQFwjIDBYKCggIyEgMCQhIDAkISAwKCEgMCQhIDAKLU0kKSIgICBEMCQtIVIkISAwJCIgMCQtITAkISMwPEEgMCghIDBUKCAgJCwhIFQkIDAkNyQwJCEgQCQiIDAKLU1YJCNQQDAgKiRBKFAkIiAwJC0hUCQiIDAkLSFQJCIjUCwhI0BAQCAsJCEgMCQhIDAkISBAJCEgMCQhIDAKLU1EKCAgIjEgMFQnKDAkISAwKCEgMFQlIDAkLSFSJCEgQCQhIzAgISAxJDIkNiUhKEIhIjw3JSMjMCwtIFIKLU1UIyYkICBIMywxMDMgVCMwMDEwQyRSIDUkIiQyJFEhIFghIEBcISwiLC0hViRSOFQpIiNQKD8hKCEhQCgKLU0gIUAhIiApMiYgIEggMSg4IDMoMCguIEBcITAyJCEjUCQvIUgiIDgxJSMkOCIiQCcgRCBAWDIjUCQuIEgKLU0hQUAoISFAICQhI1AkLyBUIDEwMiQxJEMoUTQ4JiFAJikgKSBUIycwMiEjUCxCQCgtUiAyXCEjUCQxI1AKLU0uICRAJC8gOCAhJDMuICAxJSEgMSAhKUE8LyAlPCkxUFQjMFBYMSBAWCMgMTBBIDUmJCNQJCE8NighIDAKLU0kQkBBJFElIFwhKDBcISdQPDEnUChBIFBYIiBXKFElI1wiODEoQiwxJDQhIlAkIDBEJygzJEEgQFgkIEIKLU0kQSBAKC4gRSYgKSBUJyRTJTMkIkAgIClAL19XQSAgKyUxJDUoLiBDJDIwMCVBPDQkLyBSJSAgMCQxJDEKLU0gISAxJDElIjAiJCEwLCEwXCEwQiQyMEEoLyBAJDIjUCQyJDMkIiAwJDEkMSAhIDEkMSQgICAgICAgICAKLU0gQCAgICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgIUAgJzAgICAgICAuICAgICY8ICAgICAKLU0gICAgOiAgICAgMCAgICA6ICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAoKCAKLU0gICIkICAgICZAICAgJyAgICAgJiAgICAnICAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0KLU0gIVwgICAiLyAgICBEUCAgICFMICAgIVwgICAgIiAgICAhXCAgICAgICAgICAvX19fX1wgICAgICAgICAKLU0gICAgICAgICcwID8gICAgR0AgICAqICAgICA+ICAgICAgICAgIiQgICAgICAgICAgICAgICAjX19fX18KLU0gICAgICAgICAgICAgICAgICFUICdQICAgJ0QgICAhWSAgICAgICAgICFAICAgIEUgICAgIUAgICAgICAKLU0gICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIVogICAgPkAgICAgJCAgICBQICAgICowICAKLU0gIFAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgID5QICAgJ0wgICAgIiAgICAKLU0yICAgICJUICAgIDIgICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICdUICAgIV0KLU0gICAgIFAgICAmICAgICBRICAgICYgICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAKLU0gICFeICAgID9AICAgIDAgICAhWCAgICAtMCAgICFYICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAKLU0gICAgJzAgPyAgICA/UCAgICdcICAgICUgICAgRCAgICAjRCAgICBEICAgICAgICAgICNfX19fXyAgICAKLU0gICAgICAgICAgICAgIVQgJ1AgICAoJCAgICIhICAgICFAICAgKkAgICAgXSAgICAqQCAgICAgICAgICAKLU1fX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAiIiAgICBAQCAgICA8ICAgIyAgICAgMDAgICAjICAKLU0gICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgQFAgICAoLCAgICAoICAgIFYgICAKLU0gJDQgICAgViAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAgKDQgICAiJSAgICAKLU0iMCAgIC8gICAgISkgICAgLyAgICAgICAgICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIiYKLU0gICAgQUAgICAgSCAgICQoICAgIDMwICAgJCggICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAKLU0nMCA/ICAgIEFQICAgKDwgICAgKyAgICEoICAgICUkICAgISggICAgICAgICAgI19fX19fICAgICAgICAKLU0gICAgICAgICAhVCAnUCAgIChEICAgIikgICAgIyAgICAzUCAgICE1ICAgIDNQICAgICAgICAgIF9fX18KLU1fUCAgICAgICAgICAgICAgICAgPSAhXCAgICIqICAgIEJAICAgIFQgICAlPCAgICBBMCAgICU8ICAgICAKLU0gICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICBMQCAgIC88ICAgIC4gICAgICAgICAgJCAKLU0gICAgICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAgKCAgICAiICAgICAgICAKLU0gICAgICAgIiAgICAgKCAgICAjX19fVUxfX19fX1AgICAgICAgICAgICAgIkwgID0gIVwgICAhPyAgICAKLU1AUCAgICAgICAgICAgICAgIDAgICAgIiAgICAgX19fX18vX19fX1wgICAgICAgICAgICAgICIgICcwID8KLU0gICAgJzAgICAiWCAgICAgICAgICAgICAgICQgICAgIEAgLCAgL19fX19TX19fX18gICAgICAgICAgICAKLU0gICBAICFUICdQICAgIVggICAgRiAgICAgICAgIChQICAgICMgICAgKFAgICAgICAgICAgX19fX19QICAKLU0gICAgICAgICAgICAgICA9ICFcICAgIFMgICAgLjAgICAgRCAgICAgICAgICAwICAgICAgICAgICAgICAKLU0gL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgIDhAICAgKUggICAgICAgICAgICAgICAkICAgICAKLU0gICAgICAgICAgI19fX19fICAgICAgICAgICAgICAgICAhVCAnUCAgICBYICAgIDIgICAgICAgICAgICAKLU0gICAhICAgICAgICAgICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICAuICAgICRAICAKLU0gICAgICAgICAgICAgMCAgICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICAKLU0qICAgIDJYICAgICAgICAgICAgICAgJCAgICAgICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAKLU0gIVQgJ1AgICAgWCAgICAzICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICBfX19fX1AgICAgICAKLU0gICAgICAgICAgID0gIVwgICAgNyAgICAnICAgICAgICAgISggICAgITAgICAhKiAgUCAgX19fX18vX18KLU1fX1wgICAgICAgICAgICAgICIgICcwID8gICAgKDAgICAiNCAgICAkICAgICAgICAgICQgICAgIEAgJCAKLU0gL19fX19TX19fX18gICAgICAgICAgICAgICBAICFUICdQICAgIkggICAgXSAgICAgICAgICdAICAgICMKLU0gICAgJ0ggISAgI19fX19UX19fX19QICAgICAgICAgICAgICAqICA9ICFcICAgIS4gICAgOTAgICAgWCAKLU0gICRYICAgICEwICAgJFogIDAgIF9fX19fL19fX19cICAgICAgICAgICAgICAiICAnMCA/ICAgIDxAICAKLU0gKEQgICAgQiAgICJAICAgICA8ICAgIkBAIFwgIC9fX19dU19fX19fICAgICAgICAgICAgICAhMCAhVCAKLU0nUCAgIClIICAgIlogICAgLTAgICErICAgICApICAgISsoICAgICNfX19fVF9fX19fUCAgICAgICAgICAKLU0gICAgKCAgPSAhXCAgICMyICAgIFdAICAgJTggICA3KCAgICAiUCAgIDcqICAgICBfX19fXy9fX19fXCAKLU0gICAgICAgICAgICAgIUAgJzAgPyAgICBaQCAgIC9AICAgIUsgICAmVSAgICAgVCAgICZVQCAgICAvX18KLU1fXzNfX19fXyAgICAgICAgICAgICAgIEAgIVQgJ1AgICAwLCAgICQ7ICAgID4gICAiI0AgICAgLyAgICIKLU0jQCAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0gIVwgICAkSSAgICEsICAgICk0ICAgICAKLU0gICAgIDAgICAgICAgICAgICAgICAvX19fX1wgICAgICAgICAgICAgICAgICcwID8gICAgI0AgICAgXCAKLU0gICAgICAgICAgICAgICQgICAgICAgICAgICAgICAjX19fX18gICAgICAgICAgICAgICAgICFUICdQICAKLU0gISQgICAgPiAgICAgICAgICAgICAgICYgICAgICgjXyAgI19fX188X19fX19QICAgICAgICAgICAgICAKLU02ICA9ICFcICAgIUQgICAgUTAgICAgICAgICw4ICAgICIgICAgLDwgICAgICAgICAgL19fX19cICAgICAKLU0gICAgICAgICAgICAnMCA/ICAgIFMgICAgLUwgICAhLiAgICM2ICAgICBIICAgIzdAICQgIC9fX19eM18KLU1fX19fICAgICAgICAgICAgICAgWCAhVCAnUCAgIC44ICAgJCEgICAgNSAgICAgICAgICAhICAgICAgICAKLU0gICAgICAgIF9fX19fUCAgICAgICAgICAgICAgICAgPSAhXCAgICAuICAgICRAICAgICAgICAgICAgICAKLU0gMCAgICAgICAgICAgICAgIC9fX19fXCAgICAgICAgICAgICAgICAgJzAgPyAgICAjQCAgICEoICAgICAKLU0gICAgICAgICAgJCAgICAgICAgICAgICAgICNfX19fXyAgICAgICAgICAgICAgICAgIVQgJ1AgICAhXCAKLU0gICBDICAgICAgICAgIFAgICAgIyAgICAgUCAgICAgICAgICBfX19fX1AgICAgICAgICAgICAgICAgID0KLU0gIVwgICAgSiAgICAsICAgICAkICAgICAgICAgIDAgICAgIiAgICAgX19fX1MvX19fX1wgICAgICAgICAKLU0gICAgICUgICcwID8gICAgJ0AgICAiQCAgICAgICAgICAgICAgICQgICAgICAgICAgICAgICAjX19fX18KLU0gICAgICAgICAgICAgICAgICFUICdQICAgITwgICAgPyAgICAgICAgICMgICAgICQgICAgIlAgICAgICAKLU0gICAgX19fX19QICAgICAgICAgICAgICAgICA9ICFcICAgIEUgICAgK1AgICAgQCAgICAgICAgICAwICAKLU0gICAgICAgICAgICAgL19fX19cICAgICAgICAgICAgICAgICAnMCA/ICAgICNAICAgISggICAgICAgICAKLU0gMCAgICAgTCggICsgICAgIyAgICAgIChLX19fICAgICUwISAgPCA4KCAgIiAgICAlMCAgICZAQCggICIKLU0gICAgJzAhICBCQDgoICAmICAgICcwICAgIEBAKCAgJCAgICAqMCEgIEMgOCggICogICAgKjAgICAgUEAKLU0oICAmICAgICwwISAgQ1A4KCAgLiAgICAsMCAgICBAQCggICggICAgIDAgICAgIEAoICAgICAgICAwICAKLU0gICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAiICAgICAwICAgICBAKCAgICAgICAKLU0gMCAgICAgTCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAiKiAgICAwQCAgICFBSTggICkKLU0gICAgMlAgICAgIEU4ICAoICAgIDYwICAgISBFOCAgIyAgICA6ICAgICIgRTggICQgICAgPTAgICAkIEUKLU04ICAlICAgIEBQICAgJiBFOCAgJiAgICBEQCAgICggRTggICcgICAgICAgICAgIEE4ICAhICAgIEhAICAKLU0gIUFJOCAgMSAgICBJUCAgICAgRTggICggICAgTTAgICAhIEU4ICAjICAgIFEgICAgIiBFOCAgJCAgICAKLU1UMCAgICQgRTggICUgICAgV1AgICAmIEU4ICAmICAgIFtAICAgKCBFOCAgJyAgICAgICAgICAgQTggICkKLU0gICAgX0AgICAgQU04ICA5ICAgISFAICAgICBFOCAgKCAgICElICAgICAgRTggICMgICAhKFAgICAgIEUKLU04ICAkICAgISwgICAgICBFOCAgJSAgICEvQCAgICAgRTggICYgICAhMzAgICAgIEU4ICAnICAgICAgICAKLU0gICBBOCAgMSAgICE3MCAgICBBTTggIEEgICAhOEAgICAgIEU4ICAoICAgITwgICAgICBFOCAgIyAgICEKLU0/UCAgICAgRTggICQgICAhQyAgICAgIEU4ICAlICAgIUZAICAgICBFOCAgJiAgICFKMCAgICAgRTggICcKLU0gICAgICAgICAgIEE4ICA5ICAgIU4wISAgRSA4KCAiJyAgICAgICAgICAgPCggIEQgICAgICAgICAgQEAKLU0oICBCICAgIU4wICAgIUBAKCAgQSAgICFRMCEgIEZAOCggIikgICAgICAgICAgIDwoICBIICAgICAgICAKLU0gIEBAKCAgRiAgICFRMCAgICFAQCggIEUgICAhViAhICBIIDgoICIrICAgICAgICAgICA8KCAgTCAgICAKLU0gICAgICBAQCggIEogICAhViAgICAhQEAoICBJICAgIVswISAgSUA4KCAiLSAgICAgICAgICAgPCggIFAKLU0gICAgICAgICAgQEAoICBOICAgIVswICAgIUBAKCAgTSAgICFeQCEgIEsgOCggIi8gICAgICAgICAgIDwKLU0oICBUICAgICAgICAgIEBAKCAgUiAgICFeQCAgICFAQCggIFEgICAiI0AhICBMQDgoICIxICAgICAgICAKLU0gICA8KCAgWCAgICAgICAgICBAQCggIFYgICAiI0AgICAhQEAoICBVICAgIikgISAgTiA4KCAiMyAgICAKLU0gICAgICAgPCggIFwgICAgICAgICAgQEAoICBaICAgIikgICAgIUBAKCAgWSAgICIrUCEgIE9AOCggIjUKLU0gICAgICAgICAgIDwoICEgICAgICAgICAgIEBAKCAgXiAgICIrUCAgICFAQCggIF0gICAiMDAhICBRIDgKLU0oICI3ICAgICAgICAgICA8KCAhJCAgICAgICAgICBAQCggISIgICAiMDAgICAhQEAoICEhICAgIjUwISAKLU0gUkA4KCAiOSAgICAgICAgICAgPCggISggICAgICAgICAgQEAoICEmICAgIjUwICAgIUBAKCAhJSAgICIKLU04MCEgIFQgOCggIjsgICAgICAgICAgIDwoICEsICAgICAgICAgIEBAKCAhKiAgICI4MCAgICFAQCggISkKLU0gICAiPSAhICBVQDgoICI9ICAgICAgICAgICA8KCAhMCAgICAgICAgICBAQCggIS4gICAiPSAgICAhQEAKLU0oICEtICAgIkIwISAgVyA4KCAiPyAgICAgICAgICAgPCggITQgICAgICAgICAgUEAoICEyICAgIkIwICAKLU0gIVBAKCAhMSAgICJFQCEgIFhQOCggIkEgICAgICAgICAgIDwoICE4ICAgICAgICAgISBAKCAhNiAgICIKLU1FQCAgICIgQCggITUgICAiSSAgICApQUk4ICE+ICAgIkowICAgICBFOCAiRiAgICJLQCAgICIgRTggIkkKLU0gICAiTVAgICAkIEU4ICJMICAgICAgICAgICBBOCAhOSAgICJPMCAgICkhTTggIUMgICAiUTAgICAgIEUKLU04ICMkICAgIlJAICAgICBFOCAjJyAgICJUUCAgICAgRTggIyogICAgICAgICAgIEE4ICE+ICAgIlYwICAKLU0gIDFROCAhSCAgICJXQCAgICAgRTggI0IgICAiWEAgICAgJEU4ICNDICAgIlogICAgIChFOCAjRCAgICAKLU0gICAgICAgQTggIUMgICAiWzAgICAgMVE4ICFNICAgIl0gICAgICBFOCAjSyAgICJeUCAgICAkRTggI0wKLU0gICAjIEAgICAgKEU4ICNNICAgICAgICAgICBBOCAhSCAgICMhUCAgICAxUTggIVEgICAjIyAgICAgIEUKLU04ICNUICAgIyRAICAgICRFOCAjVSAgICAgICAgICAgQTggIU0gICAjJVAgICAgMVE4ICFVICAgIycgICAKLU0gICBFOCAjXCAgICMoICAgICAkRTggI10gICAgICAgICAgIEE4ICFRICAgIyogICAgIDFROCAhWSAgICMKLU0rMCAgICAgRTggJCQgICAjLFAgICAgJEU4ICQlICAgICAgICAgICBBOCAhVSAgICMuICAgICAgSTggJCYKLU0gICAjMCAgICAgMVE4ICFeICAgIzFAICAgICBFOCAkLCAgICMzICAgICAkRTggJC0gICAgICAgICAgIEEKLU04ICFaICAgIzQwICAgICBJOCAkLiAgICM2QCAgICAxUTggIiUgICAjOTAgICAgKEU4ICQ0ICAgIzowICAKLU0gICRFOCAkNSAgICM7MCAgICAgRTggJDYgICAjPEAgICAgLEU4ICQ3ICAgICAgICAgICBBOCAhXyAgICMKLU0+ICEgIFpQOCggJDggICAgICAgICAgIDwoICIoICAgICAgICAgPSBAKCAiJiAgICM+ICAgID4gQCggIiUKLU0gICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAlICEgITkgOCggIC0gICAgJSAgICAgQEAKLU0oICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICUgICAgIjEgICJMIClLX19fICAgICUgISAKLU0hOiA4KCAgLSAgICAlICAgIC5QQCggICIgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAKLU0jQCEgIUkgOCggIC0gICAgI0AgICAjMEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICYKLU0gICAgIkAhICFNIDgoICAtICAgICJAICAgKFBAKCAgISAgICAkMCEgIVVQWCggIC8gICAgJDAgICAnMEAKLU0oICAjICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICkgICAgI0AhICFdIDgoICAiICAgICUwISAKLU0iIUA0K19fXyAgICAoQCEgIiYgNCtfX18gICAgKjAhICImQDQrX19fICAgICwgISAiJlA0K19fXyAgICAKLU0tUCEgIicgNCtfX18gICAgI0AgICAqQEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICUKLU0gICAgIzAhICIoIDgoICAiICAgICRQISAiKUA0K19fXyAgICAjMCAgICIgQCggICEgICAgIDAgICAgIEAKLU0oICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAiICAgICAwICAKLU0gICBAKCAgICAgICAgMCAgICAgTCggICUgICAgIzAhICIqIDgoICAiICAgICRQISAiK0A0K19fXyAgICAKLU0jMCAgICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgOSAgICAjMCEgIiwgOCggICIKLU0gICAgJSAhICIvIDQrX19fICAgICdQISAiMFA0K19fXyAgICAsMCEgIjFANCtfX18gICAgL1AhICIyUDQKLU0rX19fICAgIDBQISAiMzA0K19fXyAgICA0MCEgIjYwNCtfX18gICAgNyAhICI3UDQrX19fICAgIDlQISAKLU0iOUA0K19fXyAgICA8ICEgIjlANCtfX18gICAgPyAhICI/MDQrX19fICAgIEIgISAiQyA0K19fXyAgICAKLU1EUCEgIkUwNCtfX18gICAgR1AhICJHMDQrX19fICAgIExAISAiSEA0K19fXyAgICBQICEgIkowNCtfX18KLU0gICAgU0AhICJNMDQrX19fICAgIFYwISAiTlA0K19fXyAgICBZICEgIlBANCtfX18gICAgW0AhICJQQDQKLU0rX19fICAgIF5QISAiVjA0K19fXyAgICEiICEgIlogNCtfX18gICAgIzAgICBQMEAoICAhICAgICAwICAKLU0gICBAKCAgICAgICAgMCAgICAgTCggICUgICAgI0AhICJdIDgoICAiICAgICUwISAiXkA0K19fXyAgICAKLU0jQCAgICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgKCAgICAiQSAgIk4gKUtfX18KLU0gICAgJFEgICBCICgzX19fICAgICdAISAiXyA4KCAgLSAgICAnQCAgICRAQCggICMgICAgKTAhICMjQDgKLU0oICAvICAgICkwICAgJkBAKCAgJSAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAyICAgICJAISAKLU0jKiA4KCAgLSAgICAiQCAgICdAQCggICEgICAgJFAhICMxQDgoICAvICAgICRQICAgLCBAKCAgIyAgICAKLU0mQCEgIz1AOCggIDEgICAgJkAgICA0QEAoICAlICAgICgwISAjUiA4KCAgMyAgICAoMCAgIEMgQCggICcKLU0gICAgKjAhICQ1IDgoICA1ICAgICowICAgMUBAKCAgKSAgICAsQCEgJEZAOCggIDcgICAgLEAgICAwUEAKLU0oICArICAgIC5AISAkVzA4KCAgOSAgICAuQCAgIDYwQCggIC0gICAgMFAhICUtQDgoICA7ICAgIDBQICAKLU0gJSBAKCAgLyAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAkICAgICMgISAlMyA4KCAgIiAgICAKLU0jICAgICEgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAgICBMKCAgJCAgICAjQCEgJTQgOCggICIKLU0gICAgI0AgICAhIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICIgICAgIDAgICAgIEAKLU0oICAgICAgICAwICAgICBMKCAgIiAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAtICAgICJBICAKLU0iXyApU19fXyAgICAkMSAgIl9AKVNfX18gICAgJiEgICJfUClTX19fICAgICdRICAjICApU19fXyAgICAKLU0pQSAgIyAwKVNfX18gICAgK1AhICU1IDgoICAtICAgICtQICAgUUBAKCAgJiAgICAtQCEgJiZAOCggIC8KLU0gICAgLUAgICAkIEAoICAoICAgIC5QISAmKkA4KCAgMSAgICAuUCAgIDEgQCggICogICAgIDAgICAgIEAKLU0oICAgICAgICAwICAgICBMKCAgJSAgICAjQCEgJjwgOCggICIgICAgJTAhICY9QDQrX19fICAgICNAICAKLU0gIiBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAlICAgICNAISAmPiA4KCAgIiAgICAKLU0lMCEgJj9ANCtfX18gICAgI0AgICAiIEAoICAhICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICYKLU0gICAgIyAhICZAIDgoICAtICAgICMgICAgIFBAKCAgISAgICAlMCEgJkBQOCggIC8gICAgJTAgICAgUEAKLU0oICAjICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICQgICAgIlAhICZCIDgoICAtICAgICJQICAKLU0gJTBAKCAgISAgICAgMCAgICAgQCggICAgICAgIDAgICAgIEwoICAoICAgICMwISAmSCA4KCAgIiAgICAKLU0jMCAgICJAQCggICEgICAgJFAhICZKQDQrX19fICAgICVQISAmSyA4KCAgJiAgICAnICEgJkxQNCtfX18KLU0gICAgJVAgICAjQEAoICAkICAgICAwICAgICBAKCAgICAgICAgMCAgICAgTCggICUgICAgI0AhICZPIDgKLU0oICAiICAgICUwISAmUEA0K19fXyAgICAjQCAgICIgQCggICEgICAgIDAgICAgIEAoICAgICAgICAwICAKLU0gICBMKCAgIiAgICAgMCAgICAgQCggICBfX19fX1AgICAgICAgICAkICAgICAvX19fX1wgICAgICAgICAKLU0hQCAgICAjX19fX18gICAgICAgICAgQCAgICAgX19fX19QICAgICAgICAgKiAgICAgICAgICAgJiAgICAKLU0gQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgICBQICAgIDQgICAgJyAgICAiMCAgICFIICAgICMKLU0gIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICBAIyAjICBfXyAgISAgICAgICAgICAgICAgICAwICAKLU0gIEAjICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAgQCQgIyAgX18gICEgICAgICAgICAgICAgICAKLU0gMCAgICEgJCAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgISAlICMgIF9fICAhICAgICAgICAgICAKLU0gICAgIDAgICAhICYgIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICIgJiAjICBfXyAgISAgICAgICAKLU0gICAgICAgICAwICAgIiAnICMgIF9fICAhICAgICAgICAgICAgICAgIDAgICAiICggIyAgX18gICEgICAKLU0gICAgICAgICAgICAgMCAgICIgKCAjICBfXyAgISAgICAgICAgICAgICAgICAwICAgIiApICMgIF9fICAKLU0hICAgICAgICAgICAgICAgIDAgICAiICogIyAgX18gICEgICAgICAgICAgICAgICAgMCAgICIgKyAjICAKLU1fXyAgISAgICAgICAgICAgICAgICAwICAgJCAjICEgICBQIDAgICwgJCAgJCAhICAhICAwICA0ICQgICYKLU0gISAgIUAgMCAgPCAkICAoICEgICIgIDAgIEQgJCAgKiAhICAiUCAwICBQICAgI19fX19fX19fX19QUCAKLU0gICNfXCAgISAgICAgIFAgICAjX19fX19fX19fX1BQICAgI19cICApICAgICAgVCAgICNfX19fX19fX18KLU1fUFQgICAjX1wgIDEgICAgICBUICAgI19fX19fX19fX19QVCAgICNfXCAgOSAgICAgICAgICI0IyAgICAKLU0gICAgKjAsICAgICAgICBNIFAgICAgICAgIyQkICAgICAgICAtMDAgICAgICAgIFkhMCAgICAgICAjVCYKLU0gICAgICAgIDAwOCAgICAgICAhJSFQICAgICAgICREKCAgICAgICAgMzBAICAgICAgICExIjAgICAgICAKLU0gJTQqICAgICAgICA2MEwgICAgLCAgICBfX19fX19fX19fXCwgISAgX18gIDYwICAgICAsICEoMF9fICAKLU02MCAgICAgLCAjLFBfXyAgIDAgICAgI19cICAkICAgICAgICAgICAgICAgIiAgICBQL19QICAwICAgICAKLU0gICAgICAgICAgJCAgICkgX18gICEgICAgICAgICAgICAgICAgICAgISggLCAhICBfXyAgNjAgICAgIC0KLU0gICAgX19fX19fX19fX1wsICEgIF9fICA2MCAgICAgLCAhKDBfXyAgNjAgICAgICwgIyxQX18gICAwICAKLU0gICNfXCAgJCAgICAgICAgICAgICAgICIgICAgUC9fUCAgMCAgICAgICAgICAgICAgICQgICApIF9fICAKLU0hICAgICAgICAgICAgICAgICAgICEoIC0gICAgX18gIDdAICAgICAuICAgIF9fX19fX19fX19cICAgICAKLU0gICAgICAgICAgIC4gICAgX18gIDhQICAgICAuICAgIF9fX19fX19fX19cICAgICAgICAgICAgICAgIC4KLU0gICAgX18gIDogICAgICAuICAgIF9fX19fX19fX19cICAgICAgICAgICBYICAgI19cICFNICAgICAgWCAKLU0gICNfX19fX19fX19fUCAgICAgICAgICAjQCAgIC9fUCAnJCAgICAgI0AgICAvX19fX19fX19fXyAgICAKLU0gICAgICAgLiAgICBfXyAgPTAgICAgIC4gICAgX19fX19fX19fX1wgICAgICAgICAgIFggICAjX1wgIVoKLU0gICAgICBYICAgI19fX19fX19fX19QICAgICAgICAgICAgICAgICAgICAgICAgIikhQCAgICAgICAgICYKLU0gICAgIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAKLU0gICAgICAgIyFAICAgICAgICAgJiAgICAgQCAgICAwICAgICYgICAgIiAgICAgSCAgICArICAgICBQICAKLU0gIDQgICAgJyAgICAiMCAgICFIICAgICAgICAkIUAgICAgICAgICAmICAgICBAICAgIDAgICAgJiAgICAKLU0iICAgICBIICAgICsgICAgIFAgICAgNCAgICAnICAgICIwICAgIUggICAgICAgICMhQCAgICAgICAgICYKLU0gICAgIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAKLU0gICAgICAgIyBQIDAgICAgICA0IyAhICBfX19fX1AgICAgICAgICAoICAgICAvX19fX1wgICAgICAgICAKLU0hICAgICAjX19fX18gICAgICAgICAgMCAgICAgX19fX19QICAgICAgICAgOCAgICAgL19fX19cICAgICAKLU0gICAgISAgICAgICAgICAgIUAgICAgKCAgICAkICAgICFAICAgIEAgICAgKiAgICAiUCAgICAsICAgICUKLU0gICAgIVAgICAgRCAgICA6ICAgICAgICAhMDggICAgICAgICcmQCAgICAgICAgICYgICAgIEAgICAgMCAKLU0gICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgIyZAICAKLU0gICAgICA0JiAgICAgICAgIVA4ICAgICAgICApIUAgICAgICAgIEwmICAgICAgICAjMDggICAgICAgIC8KLU0hQCAgICAgICAhJCYgICAgX19fX19QICAgICAgICAgIyAgICAgL19fX19cICAgICAgICAgIFAgICAgICAKLU0gICAgIUAgICAgKCAgICAkICAgICFAICAgIEAgICAgKiAgICAiUCAgICAsICAgICUgICAgIVAgICAgRCAKLU0gICA6ICAgICAgICAgIDggICAgIiAgICAhICAgICA4ICAgICggICAgIkAgICAgTCAgICAjICAgICEwICAKLU0gIDwgICAgKSAgICAmQCAgICAgICAgICYgICAgIEAgICAgMCAgICAmICAgICIgICAgIEggICAgKyAgICAKLU0gUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgKCZAIDAgICAgICBIOiAgICAgICAgIyFIICQgI18KLU1fX19fICAgICAgICAgIDAgICAgIF9fX19fUCAgICAgICAgICQgICAgICAgICAgICYgICAgIEAgICAgMCAKLU0gICAmICAgICIgICAgIEggICAgKyAgICAgUCAgICA0ICAgICcgICAgIjAgICAhSCAgICAgICAgIyFAICAKLU0gICAgICA0JiAgICAgICAgICA4ICAgICIgICAgISAgICAgOCAgICAoICAgICJAICAgIEwgICAgIyAgICAKLU0hMCAgICA8ICAgICkgICAgJkAgICAgICAgICwmICAgIF9fX19fUCAgICAgICAgICMgICAgIC9fX19fXCAKLU0gICAgICAgICFQICAgICNfX19fXyAgICAgICAgICAwICAgICAgJi1SPSMlVDk3QVQrRywgNFUxITRFMSYKLU00RFQgN1VdUz0mJVI9ICE/OzZdTjhWXU49JylPOyAhPzs2LU89NllUICVdUzwnKU84VlVPO0ctVDg3KVQKLU0gICBPOEYlQjgyXUM+NyFSOTctUytXNVM8Ql1JO0YtTD02MUUrVylFOVYxRTlCWUggICBPOEYlQjgyXUMKLU0+NyFSOTctUytXNVM8Ql1JO0YtTD02MUUrViVTOzJZSCAgIUM8RzBRPSZFTjo3ME48UCAgOVYxQjs2NE4KLU04UCBcK1MxJDk2KVU5UlxeICchVTwmRUwuQl1DPjY9STtHME88JlFBPjJdRjtGOE85VjFCOzY0TjhQIFcKLU0sIyhTLSNAUy1DRCAtMyxYLUAhVDdXLVQ8RzVDPSAhVjdWLUg4Nyk/OzY1TThGNVIgJzk/PFZBTzxHMT8KLU07NjVNOEY1UiAnOT86NllUN1ZVRTs2KUU8QCFWN1ZRTztGPT87NjVNOEY1UiAnOT85RlFPODcxPzs2NU0KLU04RjVSICc5PzkmXVU4RlFFN1ZVRTs2KUU8QCBOMUMkUSAnOT84VkFBPEVdTTk2VUI5NyggPUVdUzomXVIKLU09JV1NOTZVQjk3KCA9RV1JO0cxPzs2NU04RjVSICc5PzsmXU45VV1NOTZVQjk3KCA9RV1GOyZdQT0lXU0KLU05NlVCOTcoID1FXUQ7VzVCOyY1Pzs2NU04RjVSICcxPz02WUk7VlggPUVdQzomJVI3VlVFOzYpRTxAIVYKLU03Vy1IO1cpVDdWVUU7NilFPEAhVjdWRU49JV1NOTZVQjk3KCA9RV1MO1ZZRzdWVUU7NilFPEAhVjdWOUwKLU07ViVUN1ZVRTs2KUU8QCFWN1YxTz02KUw5NV1NOTZVQjk3KCArRDhRLFAhVjdWLUg4Nyk/OzY1TThGNVIKLU0gJzk/PFZBTzxHMT87NjVNOEY1UiAnOT86NllUN1ZVRTs2KUU8QCFWN1ZRTztGPT87NjVNOEY1UiAnOT8KLU05RlFPODcxPzs2NU04RjVSICc5PzkmXVU4RlFFN1ZVRTs2KUU8QCFWN1YtSDg3KT85RzVOOFAhVjdXLUkKLU05VllFOSVdQzomJVI3VjlVO0YsID1FXVU7Ry1JOVZZRTklXUM6JiVSN1Y5VTtGLCA9RV1TOiZdUj0lXUYKLU09NllDICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdRj02WUMKLU0gJzk/OjZZVDdWOVU7RiwgPUVdUzo2PU45NjE/OjZZVDdWOVU7RiwgPUVdVTtHLUk5VllFOSVdSTtHMT8KLU05RzVOOFAhVjdWUU87Rj0/OUc1TjhQIVY3Vy1JOVZZRTklXUw7VllHN1Y5VTtGLCA9RV1VO0ctSTlWWUUKLU05JV1MO1ZZRzdWOVU7RiwgPUVdRjsmXUE9JV1GPTZZQyAnOT85Jl1VOEZRRTdWOVU7RiwgOyZFTjpQIU4KLU05N0FUICZRSTtGTUY9NllDICctVD02OUYgJzFVN1ZRSTtGTCA7RjVYPSAhTDo2WUs5RzVOOFAhUz0nNUYKLU05QCBOMUMoWSAnKUU5ICFHPEY1RTtAIUI7JzVFICYtTzsmXVI8UCFZOTZRTDtXPCA8JzVSPCZRRSAnIUkKLU07RkwgK0Q4UywwIUM6JjVWPjAhRjtXKUQgJi1BPEcsIDhGVVcgJyFPPEctQzomNCArRDhTLFAhJjA0UTMKLU0xMCE0NEU1JSAmKU87VlFFODZYIDhHOUE7JywgOUYlTDxWNCA9JylVOTAhQjtWXUw5NiVOLEAhTTo3LU8KLU08RjFFPEY1RCAnMVc7UCFPO0Y0ID5GNVI7UCFUOicpRTkwIU04NkVOICAhRzk2WE88VzFVOEY5UDk3LVQKLU04NylUK0YsIDdVXVI5NiVEOTZZVjdXLUk5VjlQOTAgIDhXMVk8JjROOFAhRjo3KVM9JV1DODZRTCAlXVMKLU05NzFDOicpQzsmJVM8UCAgOVY1TitWLVU5N0FJPSJZQyAmNVg6NzAgICY9RT0mNU49QllDICY9RT0mNU4KLU09QCFOPUZVQT0mLUggICFHOTZYTzxXMVI4VyFZK0csIDxXMVI4VyFZICMkRCwjIFAsIyBQLCMgUCwgIEQKLU05Jl1DOiMsICkmMU84VkBSICIxRDtWLUgsMCBEOSZdQzojICAgJy1ZPFJdPztXIUU7QllTICVdTzwmNU4KLU0gI0RELCMgUCwjIFAsIyBQLCAgICtWKUE4RiRPOFdFUDxGNVM8Ul1VPFcoTzo2WUM7JzVEOTJdUz43LE4KLU08UCAgK1YpQThGJE84V0VQPEY1UzxSXVU8VyhPOjZZQzsnNUQ5Ml1TPjcsTzxXRVM4ViVMOyJZSCAgIVMKLU0+NyxPN1cpRTg2ME48UCE/PEY1QTkgIFkpIyBQLCMgUCwjIFAsIyAgICY9RTtCXUI4Vl1QPjJZUyAmVUUKLU07Ni1QPjAhRztWOU88Rz1BPEYxUyAmOU88Rz1BPEYxUzdWKVk9JjVDO1chWSAjRFkpIyBQLCMgUCwjIFAKLU0sIyAgPEY1VCAmOU88Rz1BOyZFRztGJUI7JjQgOUZdUj1VXUM7VyFZLEAhRjtXKVc3Vi1PPCdEUyAmOU8KLU08Rz1BPEYxUyAmOU88Rz1BPEYxUzdTLFIgJjlPPEc9QTxGMVM3UyRWICY5TzxHPUE8RjFTN1MwIDlWXUIKLU04Ni1LPVYlUjknLCA4RiVDOlc9QTxGMVM3VilZPSY1QztXIVkgI0RZKSMgUCwjIFAsIyBQLCMkIDhGJUMKLU06ViVMOjY9Tjg2KUw5MCFCODYtSzdWLU88J0RSICYpQThWTT84Vl1QPjMsIDhGJUM6Vz1BPEYxUyAmKUEKLU04Vk1XODcpRDxVXFMsQCFCODYtSz1WJVI5Jy0/LDM4IDhGJUM6Vz1BPEYxUzdTMCAgJy1ZPFJdPzhWUU8KLU08VjROPFAhPzhWUU88VjQgLjIwUCwjIFAsIyBQLCMgUCAgIUE9JjVYOjcwTjhQIT83VllFPicxRjtAIT8KLU03VjVYOjcxPzlGWVMgJiVUOTdBST0gIT83Vi1BOyZRPzk3QUk9JjlOPFAgIDlGUVM4RzVGK0YsIDdWLUwKLU05NiVOPTcgIDlGLUw7Vy1FICY5RjsnNVM6ICE/OUZRUzhHNUYgJV1YOUZRUzhHNUYgJV1XPEcxQzomTCAKLU03VjlJO0YxQj02OCA3VilVOUctWTtGLCAgJy1ZPFJdRT4mRVQrRywgN1Y1WDo3MCAgJi1SPSJdQzk3KVIKLU07VyhOPFAhPzhWNVI8Rl1SICAhRDg3MUErRiwgICZVUDdWMUU5QllDICAhTTg2UUw7VixOOFAhQTsmUU8KLU04VywgODZRTDtWLVAgJiVMOyZdQz0gIUE7JlFPOFdAIDg2UUw7Vi1FO0YwIDs2JUw7Jl1DICY5Ujk2NCAKLU08RjVBOyZRTzhQICA8V0VTK1VdTDxWNUU6UllTICVdTDxWNUU6UCBZKSMgUCwjIFAsIyBQLCMgICAnLVkKLU08Ul0/PVcpST0mNE48UCE/PVcpST0mNCAuMjBQLCMgUCwjIFAsIyBQICAhPztXLUU8RylPPEJZQyAlXU8KLU08VjVSPEZdUiAlXVM5NzFPPFY1UjxGXVIgICE/OjctQT0nMVkrRiwgN1ZFUzg3MVQ+MCAgPFdFUytVXVMKLU04RylLK0csIDdXLUI8RkwgOTcpUiAlXUI8RkwgLDIwUCwjIFAsIyBQLCMgUCAgIVM+NyxPN1ZFTzhXMUwKLU0rRywgN1ZFTzhXMUwgI0RELCMgUCwjIFAsIyBQLCAgIDhXKVQ7RkVOOjcwTjxQICA3VjVOPUZFUjtWWCAKLU05NllWOjcpTztAIT83VCVSOVYsIDdVXSE8Rj1WICY1UjxGWU8gJV0/PFcxQTxHMCA3Vj1QICVdPzo3LVQKLU04NylUICVdPzxGNUE5JjVOPUVdUzo2PUY8JjQgN1ctRT0mLUg8Ri1MODctUyAmVUE6NlggOTdBST0gIT8KLU07Nl1OOFZdTj0nKU87ICE/OzYtTz02WVQgJV1TPCcpTzhWVU87Ry1UODcpVCAnOT84VkFBPEAhVjdXLUkKLU05VllFOSVdQzomJVIgJzk/PTZZUzo2PU45NjE/OFZBQTxAIVY3Vy1IO1cpVCAnOT88VkVHO0Y1RDdXLUgKLU07VylUICc5Pz02WVM6Nj1OOTYxPzxWQU88RzAgPUVdSTtHMCA9RV1TOjY9Tjk2MT86NllUICc5Pz02WVMKLU06Nj1OOTYxPzo2WVQgJzk/OyZdTjlQIVY3Vy1JOVZZRTklXUw7VllHICc5Pz02WVM6Nj1OOTYxPzsmXU4KLU05UCFWN1Y5TDtWJVQgJzk/OSZdVThGUUUgJzk/OFZBQTxFXUE8RylBPjAhVjdXLUk5VllFOSVdQzomJVIKLU03ViVSPEYlWSAnOT89NllTOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1ctSDtXKVQ3ViVSPEYlWSAnOT8KLU08VkVHO0Y1RDdXLUg7VylUN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/PFZBTzxHMT84NylSODdEID1FXUkKLU07RzE/ODcpUjg3RCA9RV1TOjY9Tjk2MT86NllUN1YlUjxGJVkgJzk/PTZZUzo2PU45NjE/OjZZVDdWJVIKLU08RiVZICc5PzsmXU45VV1BPEcpQT4wIVY3Vy1JOVZZRTklXUw7VllHN1YlUjxGJVkgJzk/PTZZUzo2PU4KLU05NjE/OyZdTjlVXUE8RylBPjAhVjdWOUw7ViVUN1YlUjxGJVkgJzk/OSZdVThGUUU3ViVSPEYlWSAnOT8KLU04VkFBPEVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1YtSDg3KT88Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQKLU03Vi1IODcpPzwmXUk7RzFFPEAhVjdXLUg7VylUN1chTzo2WVQ5NyggPUVdUzo2PU45NjE/PFZBTzxHMT8KLU08Jl1JO0cxRTxAIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdXIU86NllUOTcoID1FXUk7RzE/PCZdSTtHMUUKLU08QCFWN1ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFPEAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIKLU0gJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT88VkVHO0Y1RDdWUU87Rj0/PCZdSTtHMUU8QCFWN1c1TjxWRUcKLU07RjVEN1ZRTztGPT88Jl1JO0cxRTxAIVY3VjlMO1YlVDdXIU86NllUOTcoID1FXUQ7VzVCOyY1PzwmXUkKLU07RzFFPEAhVjdXLVQ8RzVDPSMkID1FXVM9JylVOFcwUiAnOT89NllJO1ZYID1FXVU7RkVPO0MoID1FXUMKLU06JiVSN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdRj02WUMgJzk/PTZZUzo2PU45NjE/OFZBQTxFXUYKLU09NllDICc5PzxWQU88RzE/OUc1TjhQIVY3Vy1JOVZZRTklXVM6Jl1SPSVdRj02WUMgJzk/PTZZUzo2PU4KLU05NjE/PFZBTzxHMT85RzVOOFAhVjdWRU49JV1GPTZZQyAnOT88VkVHO0Y1RDdWRU49JV1GPTZZQyAnOT8KLU09NllTOjY9Tjk2MT86NllUN1Y5VTtGLCA9RV1MO1ZZRzdWOVU7RiwgPUVdUzo2PU45NjE/OyZdTjlVXUYKLU09NllDICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1GPTZZQyAnOT85RlFPODcxPzlHNU44UCFWN1YxTz02KUwKLU05NV1GPTZZQyAnLT87JkVOOlAhVTdWUUk7RkwgPCcpSTs2JVI+MCFOO1ZZUDxGRU04NylZICYtTD02WUsKLU05NyggPFchTzxHMVM4ViVSICVdQz0nRVA5MCFHOTcxRTtHOCA8VzFSOFchWSAlXU88JjVOICVdUjk2JUQKLU0gJlVFOzYtUD4wIT84VlFPPFY0IDdVXVQ8RiVQN1Y5UDk1XU89RjVSPEZFRDkwIT83Vi1BOyZRPzk3QUkKLU09JjlOPFAhPzhWUUU4NllVPCAhPzk3QUk9ICE/OFY1UjxGXVIgJiVUOTdBST0gIT84RzVGOTZZRD0mJUIKLU0gJV1JO1YoIDdXLVA8Rl1DOTYwIDdWUUE8VzFCPTY4IDdXLUk4RzVGICVdUztWKVU5QCE/PFZVQj02OCAKLU05RjlMPTctSCAmOUM7Jl1TOTAhRjxGNUUgJV1MPFY1RTpQIT8+JjlMPFYpVTlAIT85RlFTOEc1RiAlXVcKLU08RkVUOTAhPz1XKVQ4VkFLICVdQj02OVM+NllDICVdUzk3MU88VjVSPEZdUiAlXUY6NllEOEc1RiAmVUEKLU07JlFPOFAhPzo3LUE9JzFZICVdTDtWLUsgJV1VOyZdQzpQIT87RlFPOFZMIDdWRUw7Vi1LICVdRjsmXUMKLU06UCE/PVZRTzhWTCA3Vi1MO1YtSyAlXVQ7Jl1DOlAhPzhXMUw7Vi1LICVdRDsmXUM6UCE/OFYlUyAlXVUKLU08VV1SPFcxSDxGNUE5JV1TPSYxSTtQIT88VilSOlAhPzhHKUsgJylFODZRTDtWLCA3Vl1TOTcpUjtXKCAKLU03VkVPOFcxTCAmNU45ICE/OzZFTjhHKUsgJV1DPTcpQjxGTCA3VjVOOSAgICAkICFQICAgICAkICAgICAKLU0gICAgMCAgICAgICAgICArICAgICAgICAgIiQgICAgICAgICAgICAgICAwICAgICAgICAgJCAgICAgICAKLU0gICAlJjggICAgICAgICAgICAgPyAkICFQICAgICAkICAgISAgICAgKSAgICAgTCAgICAiICAgICAgICAKLU0gICAgICAgICAgICAgICAkICAgICAgIDAgICAgICAgICAgNCAgICAlJzggICAgICAgICAgICAgICAkICEKLU1QICAgICAkICAgIUQgICAgKDAgICAgVCAgICAiICAgICAgICAgICAgICAgICAgICAgICAkICAgICAgIDAKLU0gICAgICAgICAgSCAgICAlJzggICAgICAgICAgICAgICAkICFQICAgICAkICAgIiUgICAgIzAgICAgXCAKLU0gICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAhJzggICAgICAKLU0gICAgICAgICAkICI0ICAgICAkICAgIjIgICAjPzAgICAhJCAgICIqICAgICgwICAgLFwgICAgICAgICAKLU0gICAkICBcICAgIDAgICAhJkAgICAhICAgICAhIDAgICAgICAgIVwgICAgXyAkICVEICAgICAkICAgMC8KLU0gICAgKTAgICApTCAgICAkICAgIFwgICAgICggICAgICAgICAgICAzICAkICAgJEogICAgI1AgICAhJCAKLU0gICAhIDggICAgICAgJVggICAgISAkICVIICAgICAkICAgMFQgICAgKDAgICApXCAgICAlICAgIFxAICAKLU0gI0wgICAgICAgICAgICA0ICAkICAgJFkgICAgI1AgICAhKCAgICAhIDggICAgICAgJVwgICAgNyAkICYKLU1EICAgICAkICAgMTUgICAgJFAgICAqMCAgICAkICAgISswICAgIFQgICAgICAgICAgICA1ICAkICAgJSgKLU0gICAgI1AgICAhLCAgICAhIDggICAgICAgJzggICAgLCAkICZUICAgICAkICAgMUggICAgJjAgICAqQCAKLU0gICAmICAgIS5AICAgJCAgICAgICAgICAgICA2ICAoICAgJTcgICAgJDAgICAhMCAgICAhIDggICAgICAKLU0gKCggICAgMCAkICdUICAgICAkICAgMiEgICAgL0AgICAqWCAgICApICAgIT5AICAgIkggICAgICAgICAKLU0gICA4ICAkICAgJUggICAgISAgICAhNCAgICAlJjggICAgICAgKSggICAgSiAkIChAICAgICAkICAgMl8KLU0gICAgKCAgICArPCAgICAlICAgIUkgICAgIEAgICAgICAgICAgICA5ICAkICAgJUwgICAgISAgICAhSCAKLU0gICAlJjggICAgICAgK1AgICAgJSAkIChAICAgICAkICAgMz8gICAgKDAgICArUCAgICAiICAgICAgICAKLU0gICAgICAgICAgICAgICAhICAgICAgICQgICAgICAgICAhXCAgICAlJzggICAgICAgICAgICAgICAkICgKLU1AICAgICAkICAgNCAgICAgKjAgICArWCAgICAiICAgICAgICAgICAgICAgICAgICAgICAhICAgICAgICQKLU0gICAgICAgICAiMCAgICAlJzggICAgICAgICAgICAgICAkIChIICAgICAkICAgNEkgICAgKCAgICAsICAKLU0gICAlICAgIUsgICAgIEAgICAgICAgICAgICA6ICAkICAgJVAgICAgISAgICAiRCAgICAlJjggICAgICAKLU0gLCQgICAgJSAkIChQICAgICAkICAgNSkgICAhJSAgICAsNCAgICA5ICAgIU0gICAgLDggICAgICAgICAKLU0gICA7ICAkICAgJVQgICAgISAgICAiWCAgICAlJjggICAgICAgLDggICAiVCAkICtUICAgICAkICAgOT0KLU0gICAgKEAgICAtWCAgICAlICAgIj5AICAgIEAgICAgICAgICAgICA8ICAkICAgJVggICAgISAgICAjLCAKLU0gICAlJjggICAgICAgN0ggICAgJSAkICtcICAgICAkICAgOV8gICAgLSAgICAuLCAgICAoICAgIkBAICAKLU0gIlAgICAgICAgICAgICA9ICAoICAgJVwgICAgJDAgICAjQCAgICAhIDggICAgICAgN1wgICAgKCAkICwKLU1IICAgICAkICAgOlMgICAgMyAgICAuTCAgICAyICAgIktAICAgQiggICAgICAgICAgICA/ICBAICAgJi0KLU0gICAgJzAgICAjRCAgICAhIDggICAgICAgODwgICAiOyAkIDUsICAgICAkICAgO18gICAgJEAgICAvVCAKLU0gICAkICAgJFQgICAgIDAgICAgICAgICAgICBHICAkICAgJkogICAgISAgICAjSCAgICAlJjggICAgICAKLU0gQiggICAgIiAkIDUwICAgICAkICAgPDEgICAgJUAgICAwJCAgICAkICAgJFUgICAgIDAgICAgICAgICAKLU0gICBIICAkICAgJk4gICAgISAgICAjXCAgICAjJjggICAgICAgQjAgICAgIyAkIDU0ICAgICAkICAgPEcKLU0gICAgIiAgICAwNCAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlIgICAgIzAgICAkKCAKLU0gICAhIDggICAgICAgICAgICAgICAkIDU0ICAgICAkICAgPE8gICAgIkAgICAwPCAgICAiICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAgJl8gICAgIzAgICAkLCAgICAhIDggICAgICAgICAgICAgICAkIDUKLU00ICAgICAkICAgPFkgICAgMFAgICAwRCAgICAtICAgJFYgICAgMUwgICAgICAgICAgICBJICAsICAgJywKLU0gICAgJFAgICAkMCAgICAhIDggICAgICAgQjwgICAhTiAkIDlQICAgICAkICAgPVwgICAgKEAgICAxOCAKLU0gICAlICAgJVxQICAgIEAgICAgICAgICAgICBMICAkICAgJz8gICAgISAgICAkNCAgICAlJjggICAgICAKLU0gSTQgICAgJSAkIDlYICAgICAkICAgPj4gICAgKEAgICAxTCAgICAlICAgJV5QICAgIEAgICAgICAgICAKLU0gICBNICAkICAgJ0MgICAgISAgICAkSCAgICAlJjggICAgICAgSUggICAgJSAkIDogICAgICAkICAgPyAKLU0gICAgKDAgICAyICAgICAmICAgJiBQICAgIDggICAgICAgICAgICBOICAoICAgJ0cgICAgJDAgICAkXCAKLU0gICAhIDggICAgICAgSVwgICAgIyAkIDooICAgICAkICAgP0EgICAgJFAgICAyOCAgICAkICAgJiIwICAKLU0gITQgICAgICAgICAgICBQICAkICAgJ1ggICAgI1AgICAlICAgICAhIDggICAgICAgSiggICAgKSAkIDoKLU1AICAgICAkICAgP1QgICAgKjAgICAySCAgICAoICAgJidAICAgIUggICAgICAgICAgICBRICAoICAgKCcKLU0gICAgIiAgICAlJCAgICAlJjggICAgICAgSkwgICAgMCAkIDpcICAgICAkICAgQD0gICAgKEAgICAzKCAKLU0gICAlICAgJi4gICAgIEAgICAgICAgICAgICBTICAkICAgKC8gICAgISAgICAlOCAgICAlJjggICAgICAKLU0gS0wgICAgJSQkIDskICAgICAkICAgQF8gICAgIyAgICAzPCAgICAiICAgICAgICAgICAgICAgICAgICAKLU0gICAgICAgICAgICAgICAgICAgICAlTCAgICAhJzggICAgICAgICAgICAgICAgICAgICAgICAkICAgICEKLU0gICAgIEAgICAgKCAgICAgICAgICAwICAgICQgICAgIiAgICAgQCAgICAgICAgICEgICAgIDAgICAgKCAKLU0gICAiICAgICBQICAgIDAgICAgJSAgICAhQCAgICA8ICAgICggICAgIjAgICAgKCAgICAiICAgICAwICAKLU0gICQgICAgKiAgICAgMCAgICAoICAgICsgICAgIyAgICAgSCAgICAhICAgICBAICAgIEwgICAgLCAgICAKLU0iQCAgICAkICAgICIgICAgIlAgICAgUCAgICAtICAgICAwICAgICggICAgKyAgICAjICAgICBYICAgICIKLU0gICAgIEAgICAgJCAgICAhICAgICNQICAgICQgICAgIiAgICAiUCAgICBQICAgIDAgICAgJDAgICAhKCAKLU0gICAhICAgICBAICAgIEwgICAgLCAgICAkUCAgICAkICAgICIgICAgJSAgICAhNCAgICA2ICAgICVQICAKLU0gICQgICAgIiAgICAiUCAgICBQICAgIDggICAgIDAgICAgKCAgICArICAgICMgICAgIUQgICAgOiAgICAKLU0mUCAgICAkICAgICIgICAgIlAgICAgUCAgICA8ICAgICAwICAgICggICAgKyAgICAjICAgICFUICAgICAKLU0gICAgICEgICJLICVLX19fICAgICAgICAgIEQwICBKUCE6X19fUCAgICAgICAgIDEkICAsJCA3L19fXCAKLU0gICAgICAgICYhICAjITAlU19fXyAgICAgICAgICFcMCAgUDghPF9fX1AgICAgICAgICBFICQgIVAhQEAKLU0gICggICAgICAgICArMSAgQkggNEtfX18gICAgIFAgICAjJCAwIUw8JUxfX19QICAgIDQgICAgWiAkICUKLU1EIUBAICAkICAgICYgICAgMlAhICE6IDgoICAiICAgICEgICAgJUAgMCAuTCYiICBBMCAgICA8ICAgIT0KLU0gJCAmRCFAQCAgJCAgICAgICAgIDhAISAgQkA4KCAgJCAgICAgICAgICZYIDAgKFAmIiAgIUAgICAgICAKLU0gICFWICQgIi8hQEAgIEAgICAgJCAgICBBMSAgIlEgJVAgICggICAgISAgICAoUDAgIEwxITwgICIgICAKLU0gIDAgICAiOiQgICskQDcgICBAICAgICQgICAgSkEgICJRMCVQICAjICAgICEgICAgKygwICBMNiE8ICAKLU0gUCAgICAwICAgIyEkICArJiA3ICAgRCAgICAkICAgIFRBICAiUVAlUCAgJCAgICAhICAgIC1AMCAgTEAKLU0hPCAgISAgICAgMCAgICNFJCAgKykgNyAgIEggICAgJCAgICBdISAgIlJAJVAgICUgICAgISAgICAvTDAKLU0gIExMITwgICEwICAgIDAgICAkKSQgICssIDcgICBMICAgICQgICAhJjEgICJTMCVQICAmICAgICEgICAKLU0gMiQwICBMWCE8ICAhUCAgICAwICAgJEokICArMCA3ICAgVCAgICAkICAgIS1RICAiVCglUCAgMyAgICAKLU0hICAgIDRMMCAgTSQhPCAgJjAgICAgMCAgICVBJCAgKzIgNyAgIVwgICAgJCAgICE7USAgIlRQJVAgIEUKLU0gICAgISAgICA4MDAgIE0wITwgICpQICAgIDAgICAmOyQgICs2IDcgICMkICAgICQgICAhSVEgICJWICUKLU1QICBXICAgICEgICAgO0gwICBNSCE8ICAvMCAgICAwICAgJy8kICArPCA3ICAkLCAgICAkICAgIVchICAKLU0iV0AlUCAhKSAgICAhICAgID8gMCAgTiAhPCAgM1AgICAgMCAgICgmJCAgK0IgNyAgJTQgICAgJCAgICIKLU0lISAgOF8gJDggITsgICAgISAgICBCLDAgIE4wITwgIDgwICAgIDAgICAoUiQgICtFIDcgICYoICAgICQKLU0gICAiMiEgICJZQCVQICFDICAgICEgICAgRiAwICBOPCE8ICA5ICAgICAwICAgKVAkICArSCA3ICAmNCAKLU0gICAkICAgIkFRICAiWjAlUCAhRiAgICAhICAgIEogMCAgTkghPCAgOVAgICAgMCAgICpOJCAgK0sgNyAKLU0gJkAgICAgJCAgICJQUSAgIlsgJVAgIUkgICAgISAgICBNSDAgIE5UITwgIDpAICAgIDAgICArSSQgICsKLU1OIDcgICZMICAgICQgICAiX1EgICJbUCVQICFMICAgICEgICAgUTwwICBPICE8ICA7MCAgICAwICAgLEcKLU0kICArUSA3ICAmWCAgICAkICAgIy4hICA4XCAkOCAhUiAgICAhICAgIFQoMCAmLzghJiAgPiAgICAgMCAKLU0gIC0sJCAgK1IgNyAgJ1ggICAgJCAgICM1ISAgIl0gJVAgIiQgICAgISAgICBVVCAwICkwJiIgICgwICAKLU0gIDAgICAtSSAkICI6IUBAICI0ICAgICQgICAjPyAhICBIIDgoICBJICAgICEgICAgWSQgMCAqOCYiICAKLU0rMCAgICAwICAgLj4gJCAiTCFAQCAjJCAgICAkICAgI0xAISAgTEA4KCAgVSAgICAhICAgIFxAIDAgK0AKLU0mIiAgLjAgICAgMCAgIC8zICQgIl4hQEAgI1QgICAgJCAgICNZMCEgIFEgOCggISEgICAgISAgICBfRCAKLU0wICxIJiIgIDEwICAgIDAgICAwJSAkICMwIUBAICREICAgICQgICAkJiAhICBVQDgoICEtICAgICEgICAKLU0hIlQgMCAtUCYiICA0MCAgICAwICAgMFogJCAjQyFAQCAlNCAgICAkICAgJDIhICAiXUAlUCAiXiAgICAKLU0hICAgISRcMCAmLFAhJiAgVyAgICAgMCAgIDE2JCAgK1cgNyAgLjQgICAgJCAgICQ3QSAgIl4gJVAgI04KLU0gICAgISAgICEmRDAgIE9EITwgIF1AICAgIDAgICAxUSQgICtaIDcgIC9YICAgICYgICAkPlEgICAgICQKLU0zX19fICAgICIgICAhKCggMCA7MCYiICAgMCAgICBEICAgMikgJCAnVCFAQCAgJCAgICAqICAgJEQgISAKLU0iKCA4KCAgISAgICAjMCAgISk4IDAgQkAmIiAgIDAgICAgWCAgIDI8ICQgKFAhQEAgICQgICAgLyAgICQKLU1IUCEgIl0gOCggICEgICAgIVAgICEqSDAgIEswITpfX19QICAgISAgICAyXiAkICwuIUBAICA0ICAgIDEKLU0gICAkUzAhICMqIDgoICAhICAgICRAICAhLTggMCE0UCYiICAgMCAgICEsICAgMzwgJCA1MCFAQCAgJCAKLU0gICAwICAgJFkgISAiXyA4KCAgIyAgICAlICAgIS5MMCAgKkAhJF9fX1AgICAhMCAgIDNWJCAgJC0gMS8KLU1fX1wgICAgNSAgICReUSAgIlAgJUtfX18gICAgJSAgICEwMDAgIEtQITpfX19QICAgITAgICA0LSQgIDAKLU0gIDFPX19cICAgIDQgICAlJSEgIDAgICQ7X19fICAgICUgICAhMUwwICYgKCEmX19fUCAgICEkICAgNEIKLU0gJCAtViFAQCAgNCAgICAxICAgJSowISAjMUA4KCAgIyAgICAlQCAgITMgIDAhQUgmIiAgIiAgICAhPCAKLU0gIDRVICQgOVAhQEAgICQgICAgMSAgICUvICEgJDUgOCggICkgICAgJDAgICE0NCAwIFxAJiIgICFQICAKLU0gIUAgICA1LSAkIDlYIUBAICAkICAgIDEgICAlNSAhICRGQDgoICArICAgICQwICAhNVAgMCEzOCYiICAKLU0jUCAgICFEICAgNUUgJCA6IyFAQCAgLCAgICAxICAgJTwwISAkVzA4KCAgLSAgICAlQCAgITdIIDAhNTAKLU0mIiAgIUAgICAhSCAgIDYhICQgOighQEAgICQgICAgNSAgICVCMSAgIyFQJVNfX18gICAgJTAgICE4XDAKLU0gIFBAITxfX19QICAgITQgICA2NiQgICwpIDcvX19cICAgIDUgICAlRzEgICMiQCVTX19fICAgICUwICAKLU0hOjAwICBQTCE8X19fUCAgICE0ICAgNkskICAsLCA3L19fXCAgICA1ICAgJUxBICAjIzAlU19fXyAgICAKLU0lMCAgITtEMCAgUFghPF9fX1AgICAhNCAgIDcgJCAgLC8gNy9fX1wgICAgNSAgICVSISAgIyQgJVNfX18KLU0gICAgJTAgICE8XDAgIFEkITxfX19QICAgITQgICA3NCQgICshIDZPX19cICAgIDsgICAlWVAhICZIIDgKLU0oICAhICAgICZQICAhPlQgMCFKUCYiICAhICAgICE4ICAgN1IgJCA4SiFAQCAgSCAgICA5ICAgJV5AISAKLU0mQCA4KCAgISAgICAnICAgIUAsIDAhS1AmIiAgIDAgICAhTCAgIDgqJCAiRzAhMU9fX1wgICAgOyAgICYKLUkjQSAgIkggJDNfX18gICAgJlAgICFBODAgIEokISRfX19QICBfX1wgICA4PiQgIkcwITFPX19cOwotIAotZW5kCmRpZmYgLS1naXQgYS9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWFvdXQudSBiL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtYW91dC51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRlZWY5Li4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtYW91dC51CisrKyAvZGV2L251bGwKQEAgLTEsNzMyICswLDAgQEAKLWJlZ2luIDc3NyBzcGFyYy1hb3V0Ci1NQDAsISJQICAoICAgICIgICAgICAgICAgI1lQICAiIEAgICAgICAgICAgIlwkIiAgVCAuQDApKCNIJDI1Ci1NKkIgIkUgKkAhKTAiMCBINyAgIDBVIitASCAsICAgQyIgJigoQCkgICAwKiAgIDAhICAgIDAgICAiQCQgCi1NICAhICAgQCQgMCAgICQgICAtNjwoWiBAMCAgKCBQJCAgICEgICBAJCAwICAgKVdDT1ZATyAgIChLQTdCCi1NKiEkICAgQjAkQigsMCAgIDJZKDAoICJMJCAgKERALkA3JCAgICRONCQiIEBAKihAKCEqICAkXCEgICAgCi1NUEEuQDdIIkA4MEwyQCAhKyAwICAgLkAjSCYjIiBaIURYQC5AOiowJSAgJjIhKCAxK1AgICIqWDVYREIwCi1NJCIgIEUhIEAhMTxAICAiNiROICJGISAgJUQgICAjMjokIiAgSUEgICIpICIgITMyIFohREUhIEAhUTxACi1NICAiNiROIDJGISAgJUQgICAiTjokICA0K1AgICIqWDVYRzAxICAgKEQhKEImVCAgICIuMiQiICBKQSAgCi1NIiwoI0gmQiBEICAhIEggICJSXCAgIEJOJT4pKEQgMyAkSSgwICEmNCQiICclUiAgICk4MlghKjgkICA1Ci1NMCAgICVZSDAoICMiIFohUEggMyAgPjhDSCdTSihaIiBbIi5AQSAsICAgQyIgJigoUEIuQEIgLCAgISMiCi1NICYiQFBCLkBDICwgICBCIiQmIURQQi5ARCkgMCggJj9RICAgREEgQD8oJydYIEIhWiAgICQoICAhSCgwCi1NKCA0MEAgICRAQSBAMVEiICAgKiIkIiAjRD0gQCAgSiAgIDAhICAgIEA8L0AiICQgICAiMCQiICJEQDdACi1NIS0wJVAgIiIkIiAkRD0gQCApIDAoJ14iJCIgIUQ9IEAgICAgMCAgTz03LVIrVlFJOEJdTDkiWVM7UCBPCi1NOSY1VitXSUU8RlwgICAgICAgICAmNi1SPSMgWigmWU8oIl1VPFcoTzsmRUIrVlFEK0ctTyJAICAgICAgCi1NICAgRjhXKVQsI0hAK1c1UzxCXUw6NihPOyYwTjxWXEA7NiVQPCZFTjlSIUY4NkVMPTcpRSJAICAgICAgCi1NICExQzxHMFAuQiFOO1IgTzkmNVYrV0lFPEZcKiAgICAgICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgCi1NIClXQ09ZIlAkIiAgLCggICA4JydYIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgIj1YW14wCi1NTCEgQCAjIiAgICYhUV4gKEA+QCAgKVdDT1kiUCQiICAsKCAgIDgnJ1ggQiFaICAgRz4uX0QrIDAoICBQCi1NQCAgIUA8P0AiKCdIICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AICApV0NPWSJQJCIgICwoICAgOCcnCi1NWCBCIVogICBHPi5fRCsgMCggIFBAICAhQDw/QCIoJ0ggICI9WFteMEwhIEAgIyIgICAmIVFeIChAPkAgCi1NIClXQ09ZIlAkIiAgLCggICA4JydYIEIhWiAgIEc+Ll9EKyAwKCAgUEAgICFAPD9AIignSCAgICAgICAgCi1NRz4uX0QhJCAgIEMhIEIuICwoICAgOCcnWCBCIVogICBHPi5fRCEkICAhIyEmQiJILCggICA4JydYIEIhCi1NWiAgIDBMQCAgKVdDT1dBICAgI0QgMCAgICEkICAhIyAqQiwwJDAgICQpKDAoICcyKkIpOCQwICAkKSgwCi1NKCArMipCJVgkMCAgJCkoMCggLzIsQiRQJDAgICQpKDAoIDMyLEIkKCQwICAkKSgwKCA3MixCJ0AkMCAgCi1NJCkoMCggOzIoQicoJDAgICQpKDAoID8yKEImQCQwICAkKSgwKCBDMihCJCAkMCAgJCkoMCggRzIoQiwoCi1NJDAgICQpKDAoIEsyKEIpKCQwICAkKSgwKCBPMihCJUAkMCAgJCEsICAgQzQgRi5UVSIoQSohJCAgISAzCi1NICAgMFUhSUBMLTBaKDhAMSAgIDAkUCAgJC0wKjhRIzQqQiZQJDAgICQhLCAgISM0IkYpOFUiSEFGISQgCi1NICEgMyAgIDBVIElBPi0wSiguQDEgICAwJFAgICQtMDI4MyM0LEIpSCQwICAkISwgICEjNCRGJChVIyhCCi1NLCEkICAhIDMgICAwVSEpQVgtMFIoNUAxICAgMCRQICAkLTAiODxDNChCJSAkMCAgJCEsICAhIzQgRiZACi1NVSIoQS4hJCAgISAzICAgMFUgKUEgLTBCKEJAMSAgIDAkUCAgJC0wIjhQQzQoQiZIJDAgICQhLCAgISM0Ci1NIEYpKFUiKEFEISQgICEgMyAgIDBVIClBOC0wQiguIDEgICAwJFAgICQtMCI4MkM0KEIpQCQwICAkISwgCi1NICEjNCZGJihVI0hBJCEkICAhIDUgICAwREEqQyQtKEIoL0AxICAgMCUwICAkKSgySEVDMihCIzgkMCAgCi1NJCE0ICAhIjIkSiVYVEIoQVAhJCAgISA1ICAgMERBKkEsLShCKDcgMSAgIDAlMCAgJCkoMkgwQzIoQiUwCi1NJDAgICQhNCAgISIyJEonQFRCKEMgISQgICEgNSAgIDBEQSpBUi0oQihFIDEgICAwJTAgICQpKDJIOiMyCi1NKEIoQCQwICAkITQgICEiMiRKJCBUQihBMiEkICAhIDUgICAwREEqQyItKEIoLyAxICAgMCUwICAkKSgyCi1NSERDMihCIzAkMCAgJCE0ICAhIjIkSiVAVEIoQU4hJCAgISA1ICAgMERBKkEqLShCKDZAMSAgIDAlMCAgCi1NJCkoMkg4QzIoQic4JDAgICQpKDAoICsyKEIjKCQwICAkKSgwKCArMihCKFgkMCAgJCkoMCggJzIoQicwCi1NJDAgICQpKDAoICcyKEInSCQwICAkISwgICEjNCBGKSBVIihCPCEkICAhIDMgICAwVSEpQSgtMFIoOCIhCi1NUV4gKEA+QCAgKVdDT1kgMSAgIDBVIChDKCgiQk9fXDJAICAtREEoQygtICI4IDIgSEIgICBIICAiOTAwCi1NKCAiNiBGICREQSBAICkoIjggMzAgRCArQCooQCAhKl9fX1Y0IEogIURJKiAgIDIgICBIMSAgIDBIQShDCi1NKCokSjggKzAhICAxR1woICAqICQvX1IgSSIgIC0rX19fPSAkICEmIVFeIChAPkAgIClXQ09ZIDEgICAwCi1NVEAoQycoIkI4ICAiQCAgKUghKEMnLSAkICAiP1BAICBIIDBAIS0gJCAgIiBIQiAgJEtfX15QJCAgICAxCi1NICAgKUQhKEJCJCAgIUU2MiQiICBAPD9AIignSCAgIj1YW14wJFAgICQtICI4K1IgSEIgICRIICAhKSAwCi1NKCAlX19fX0dUIilATygnJ1ggQiFaICAgICAgICAgICAwJlAgICAyNl9fX19RICAgMCdAICAgRjZfX19fCi1NTSAgIDAoMCAgIDY2X19fX0sgICAwKSAgICRWNl9fX18zICAgICA0ICAgIDYgICAgMkAgICAgICAgICAgCi1NICAgICYgICAgIEggICAgNyAgICAhICAgICFEICAgICkgICAgNTAgICAgVCAgICBBICAgIChAICAgIlQgCi1NICAgRyAgICAxX19fX19cICAgICAgICAgLUAgICAgI19fX19fICAgICAgICAgJCQgICAgICAgICAhQCAgCi1NICNYICAgICIgICAgJTAgICAgUCAgICBSICAgICpAICAgICAgICAgSyAgICAsUCAgICIwICAgIFUgICAgCi1NIVAgICAiMCAgICAhICAgICggICAgICwgICAgOiAgICAiICAgICNAICAgICsgICAgLCAgICAgWCAgICA8Ci1NICAgICNQICAgIUwgICAgMCAgICApMCAgICEkICAgID0gICAgJEAgICAhWCAgICAzICAgICdQICAgITAgCi1NICAgWSAgICAlMCAgICIoICAgIDYgICAgKlAgICAhPCAgICEmICAgICYgICAgIiwgICAgOSAgICAsMCAgCi1NICFIICAgIEcgICAgJlAgICAiOCAgICA8ICAgICogICAgIVQgICAgSiAgICAnQCAgICJEICAgID8gICAgCi1NL1AgICAiICAgICEhICAgICgwICAgIlAgICAgQyAgICArUCAgICI0ICAgIE4gICAgKUAgICAgICAgICBICi1NICAgICAgICAgIkQgICAgWyAgICArICAgICM4ICAgIE0gICAgLVAgICAiWCAgICBUICAgICtQICAgI1QgCi1NICAgUCAgICAuQCAgICMkICAgIS8gICAgLEAgICAgICAgICBTICAgIDBAICAgIzAgICAgICAgICAtMCAgCi1NICQ0ICAgIFcgICAgLyAgICAjQCAgICEgICAgIC4wICAgICAgICAgWiAgICAgICAgICNMICAgITQgICAgCi1NLyAgICAlKCAgICBdICAgIDBQICAgI1ggICAhJCAgICAvUCAgICREICAgISAgICAgMiAgICAkKCAgICAgCi1NICAgIDBQICAgICAgICAhJCAgICAzMCAgICQ0ICAgISogICAgMUAgICAkUCAgICEnICAgIDJQICAgJEAgCi1NICAhMCAgICAyMCAgICRYICAgISsgICAgNDAgICAkUCAgICEzICAgIDMwICAgICAgICAhLiAgICAgICAgCi1NICRcICAgICAgICAgNCAgICAgICAgICExICAgICAgICAgJSggICAgICAgICA0UCAgICAgICAgICAhMCAnCi1NQyAgICxbQCAgICAnIVAgJlgwICAwLEAgICAgLiIwICVTICAgMFJAICAgIDMhMCAlI0AgICgiICAgICA5Ci1NIDAgIzhAICAgICAgICAgRSAwICZYQCAgICAgICAgIEwhMCAjP0AgIChbQCAgICBSIVAgJTxAICAwKiAgCi1NICAgWyFQICcuMCAgMCAgICAgISUgMCAjSCAgICAgICAgICErITAgIFxQICAoUVAgICAhPiEwICdLUCAgCi1NKFBAICAgIUoiMCAnU1AgIDAsQCAgICFTITAgIkBQICAoTzAgICAiKiIwICZdICAgMC0gICAgIkEiMCAjCi1NXkAgIDAtQCAgICJYIjAgJzNQICAwLiAgICAjLyIwICQ6MCAgMC5AICAgI0YiMCAiS0AgIDAvICAgICNWCi1NIjAgKDRAICAwL0AgICAkJiIwICZAICAgMDAgICAgJDYiMCAgMyAgIDAwQCAgICRGIjAgIE4wICAwMSAgCi1NICAkViIwICdRQCAgMDIgICAgJF8iMCAmUiAgIDAyQCAgICUoIjAgJ0ZAICAwMyAgICAlMSEwICREUCAgCi1NKFVAICAgJUUhMCAnO1AgIChKMCAgICVZIjAgIiBQICAwM0AgICAmLSEwICBTUCAgKFQwICAgJjohMCAjCi1NSlAgIChJICAgICZHIjAgJlcwICAwNCAgICAmVCEwICRJQCAgKVRQICAgJlwiMCAoQSAgIDA0QCAgICc0Ci1NIjAgJiUgICAwNSAgICAnTCIwICUoUCAgMDVAICAgKCQiMCAkVjAgIDA2ICAgICg1IjAgIl1AICAwNkAgCi1NICAoRiIwICYpQCAgMDcgICAgKFciMCAkOUAgIDA3QCAgICkoIjAgJyggICAwOCAgICApMiIwICU6UCAgCi1NMDhAICAgKTwhMCAkUTAgIChTICAgIClRITAgJD1QICAoTiAgICAqJiIwICBJMCAgMDkgICAgKjsiMCAmCi1NNzAgIDA5QCAgICpQITAgJSlQICAoWDAgICAqXiEwICVDMCAgKExQICAgKywiMCAoMSAgIDA6ICAgICs6Ci1NIjAgIU5QICAwOkAgICArSCIwICc8UCAgMDsgICAgK1YiMCAnUEAgIDA7QCAgICwvIjAgJFIgICAwPCAgCi1NICAsSCIwICdcICAgMDxAICAgLE8iMCAiXiAgIDA9ICAgICxaIjAgJzEgICAwPUAgICAtLCIwICFWQCAgCi1NMD4gICAgLT4iMCAkR0AgIDA+QCAgIC1HIjAgJypQICAwPyAgICAtUiIwICcrICAgMEBAICAgLV0hMCAjCi1NRjAgIChWUCAgIC4zITAgJj0wICAoS0AgICAuSSIwICNTQCAgMEIgICAgLl8iMCAhIjAgIDBCQCAgIC81Ci1NIjAgIDswICAwQyAgICAvSyIwICI9UCAgMENAICAgL1ciMCAnMTAgIDBEICAgIC9fITAgJEcwICAoWVAgCi1NICAwLiIwICg4MCAgMERAICAgMD0iMCAlXkAgIDBFICAgIDBMIjAgJ1tAICAwRUAgICAwWyIwICFTMCAgCi1NMEYgICAgMSoiMCAiRjAgIDBGQCAgIDE5IjAgJ0EwICAwRyAgICAxQSIwICdLICAgMFAgICAgMVsiMCAnCi1NTjAgIDBQQCAgIDIjIjAgJzFAICAwUSAgICAyKyAwICY9ICAgICAgICAgMjQhUCAiRiAgIDAsICAgIDJGCi1NIjAgJzwwICAwUUAgICAyVSIwICJUUCAgMFIgICAgMyQhMCAmPjAgIClQICAgIDM3ITAgJkIwICApSEAgCi1NICAzSiFQICVIICAgMCtBPzk3MUU+JzAgN1Y1RDg3MUEgJV1FO0YwIDxXMUE8RzAgPFcxQTxHMT85RlFPCi1NODcwIDdVXUU+JkVUICVdTTg2RU4gJV1FO0c5STxGXU4gJV0/MSVFLjA0VSkwUCE/OTdBST0gIT89RV1TCi1NOjY9Tjk2MT86NllUN1Y5VTtGLCA3Vzk/OjZZVDdWOVU7RiwgN1chUjo2VUE8R0QgN1c5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzE/OUc1TjhQIT89RV1TOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICVdVjdXLUk5VllFCi1NOSVdQzomJVI3VyFPOjZZVDk3KCA3Vzk/PTZZUzo2PU45NjE/OyZdTjlVXUE8RylBPjAhPz1FXVU7Ry1JCi1NOVZZRTklXUM6JiVSN1YlUjxGJVkgJV1WN1ZRTztGPT88Jl1JO0cxRTxAIT89RV1DOiYlUjdXIU86NllUCi1NOTcoIDdXOT89NllTOjY9Tjk2MT86NllUICVdVjdXLUk5VllFOSVdUzomXVI9ICE/PUVdRDtXNUI7JjU/Ci1NODcpUjg3RCA3Vzk/PTZZSTtWWCA3Vzk/OUZRTzg3MCA3Vzk/PFZBTzxHMCA3Vzk/PFZFRztGNUQ3VlFPCi1NO0Y9PzlHNU44UCE/PUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICVdVjdXLUk5VllFOSVdSTtHMT84NylSCi1NODdEIDdXOT87Jl1OOVVdRj02WUMgJV1WN1YtSDg3KT85RzVOOFAhPz1FXUk7RzE/ODcpUjg3RCA3VV0/Ci1NOzYlSTtAIT89RV1VO0ctSTlWWUU5JV1JO0cxPzwmXUk7RzFFPEAhPz1FXVM6Nj1OOTYxPzxWQU88RzE/Ci1NPCZdSTtHMUU8QCE/PUVdVTtHLUk5VllFOSVdUzomXVI9JV1BPEcpQT4wIT89RV1VO0ctSTlWWUU5JV1MCi1NO1ZZRyAlXVY3VjlMO1YlVDdXIU86NllUOTcoIDdXOT88VkFPPEcxPzwmXUk7RzFFPEAhPz1FXVU7Ry1JCi1NOVZZRTklXUM6JiVSICVdVjdXNU46Nl1OLEAhPz1FXUQ7VzVCOyY0IDdXOT89NllTOjY9Tjk2MT86NllUCi1NN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RiwgN1c5PzxWRUc7RjVEN1ZRTztGPT84NylSCi1NODdEIDdXOT88VkVHO0Y1RDdWLUg4Nyk/ODcpUjg3RCA3Vzk/OUZRTzg3MT85RzVOOFAhPz1FXVM6Jl1SCi1NPSVdRj02WUMgJV1WN1ctSTlWWUU5JV1JO0cwIDdXOT87Jl1OOVVdQTxHKUE+MCE/PUVdQzomJVI3ViVSCi1NPEYlWSAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzwmXUk7RzFFPEAhPz1FXVU7Ry1JOVZZRTklXUM6JiVSCi1NN1chTzo2WVQ5NyggN1c5Pzo2WVQgJV1TPCZdUj0nLUM4NyggN1c5PzkmXVU4RlFFN1chTzo2WVQ5NyggCi1NN1c5Pz02WVM6Nj1OOTYxPzxWQU88RzAgN1YtTD02WUs5NyggN1c5PzxXMVI9Ni1ULDAhPz1FXVM9JylVCi1NOFcwUiAlXVY3VzVOPFZFRztGNUQ3VlFPO0Y9PzlHNU44UCE/PUVdVTtHLUk5VllFOSVdQzomJVI3VjlVCi1NO0YsIDdXOT88VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJV1WN1c1TjxWRUc7RjVEN1ZFTj0lXUE8RylBCi1NPjAhPz1FXVM6Nj1OOTYxPzxWQU88RzE/ODcpUjg3RCA3VllPO0chUjo2VUE8R0QgN1ctPzsmRU46UCE/Ci1NPUVdRDtXNUI7JjU/OUc1TjhQIT89RV1TOjY9Tjk2MT87Jl1OOVAhPz1FXUk7RzE/PCZdSTtHMUU8QCE/Ci1NPUVdUzo2PU45NjE/OFZBQTxAIT89RV1GOyZdQT0lXUE8RylBPjAhPz1FXVM6Jl1SPSVdQTxHKUE+MCE/Ci1NPTVdTDo2WUsgJV1WN1c1TjxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KCA3Vzk/OyZdTjlQIT89RV1DCi1NOiYlUiAlXU87RV1FPiZFVCAlXT85N0FJPSVdRD02VU0+NV1EOTYtTCAlXT83VC00M1UpPzMkRTM1JV0/Ci1NICVdPzdUMTQzVSk/MyRFMzUlXT8gJV0/N1YxTzdWPUw7VilBOyVdQz0mXVI8UCE/N1VdRDtVXUc7Jl1CCi1NODZRPzknMU88RywgN1VdRT4mRVQ3VjFVOzZVWTdXKUU5QCAgICAgICAiXVU8VyhPOyZdQzg2UE87JkVCCi1NK1Y9QzhSVUw6NihPPFc1Ti0iXFIrQyRPLkJdVTxXKE87Jl1DODZQTzsmRUIrUCAgICAgICAgICAgICAzCi1NRCggICAgICAgMCAmICAgICAmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICMgICEgIyAgIDAiMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCi1NQCAgICRUQCAgJCE8ICAhIDggICAhV0AgICA+SCAgICo2ICAgICAgICAgIDUgICAuMiAgICEwICAgIiAgCi1NICAgIC8gICAwICAjICAgIEA8IUAgICQgICAiPVhbXkA/X19fXyAkICAgIj1YW15AP19fX14wJCAgICY9Ci1NWFteQD9fX19dQCQgICAqPVhbXkA/X19fXFAkICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgJCFJCi1NICAgICAgICAgICEgUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgIDAmICAgICAgISAgICAgICBYJCAgICAgICBAKCAgICAhNCQgICAgICAgQkQgICAgIVQkCi1NICAgICAgIEJEICAgICJRRCAgICAgICBCRCAgICAlNUQgICAgICAgQkQgICAgJVYgICAgICAgICAgICAgCi1NICdeICAgICAgICAgICAgICApJiAgICAgICAgICAgICAgK0IgICAgICAgICAgICAgIC0mICAgICAgICAgCi1NICAgICAuXiAgICAgICAgICAgICAgMFYgICAgICAgICAgICAgIDI+ICAgICAgICAgICAgICA0RiAgICAgCi1NICAgICAgICAgNlIgICAgICAgICAgICAgIDhGICAgICAgICAgICAgICA6NiAgICAgICAgICAgICAgOz4gCi1NICAgICAgICAgICAgIDxKICAgICAgICAgICAgICA+KiAgICAgICAgICAgICAgPlogICAgICAgICAgICAgCi1NIEhCICAgICAgICAgICAgICAgISQgICFZICAgQkQgICAgICEkICAhWSAgIEJFICAgICAhJCAgIVkgICBCCi1NRyAgICBRSEQgICAgICAgQkQgICAgICEkICAhWiAgIEJJICAgICAhJCAgIVogICBCSiAgICAgISQgICFaCi1NICAgQkwgICAgUkREICAgICAgIEJJICAgICAhJCAgIVsgICBCTiAgICAgISQgICFbICAgQk8gICAgICEkCi1NICAhWyAgIEJRICAgIFQgRCAgICAgICBCTiAgICAgISQgICFdICAgQlMgICAgICEkICAhXSAgIEJUICAgCi1NICAhJCAgIV0gICBCViAgICBVREQgICAgICAgQlMgICAgICEkICAhXiAgIEJYICAgICAhJCAgIV4gICBCCi1NWSAgICAgISQgICFeICAgQlsgICAgVkREICAgICAgIEJYICAgICAhJCAgIV8gICBCXSAgICAgISQgICFfCi1NICAgQl4gICAgICEkICAhXyAgIEMgICAgIFggRCAgICAgICBCXSAgICAgISQgICIhICAgQyIgICAgICEkCi1NICAiISAgIEMjICAgICAhJCAgIiEgICBDJSAgICBZREQgICAgICAgQyIgICAgICEkICAiIiAgIEMnICAgCi1NICAhJCAgIiIgICBDKCAgICAgISQgICIiICAgQyogICAgWjxEICAgICAgIEMnICAgICAhJCAgIiMgICBDCi1NLCAgICAgISQgICIjICAgQy0gICAgICEkICAiIyAgIEMvICAgIFtQRCAgICAgICBDLCAgICAgISQgICIlCi1NICAgQzEgICAgICEkICAiJSAgIEMyICAgICAhJCAgIiUgICBDNCAgICBdLEQgICAgICAgQzEgICAgICEkCi1NICAiJiAgIEM2ICAgICAhJCAgIiYgICBDNyAgICAgISQgICImICAgQzkgICAgXihEICAgICAgIEM2ICAgCi1NICAhJCAgIicgICBDOyAgICAgISQgICInICAgQzwgICAgICEkICAiJyAgIEM+ICAgIF9ARCAgICAgICBDCi1NOyAgICAgISQgICIpICAgQ0EgICAgICEkICAiKSAgIENCICAgICAhJCAgIikgICBDRSAgICEhIEQgICAgCi1NICAgQ0EgICAgICEkICAiKiAgIENHICAgICAhJCAgIiogICBDSCAgICAgISQgICIqICAgQ0sgICAhIiRECi1NICAgICAgIENHICAgISMuICAgICAgICAgICAgICEpXiAgICAgICAgICAgICAhLV4gICAgICAgICAgICAgCi1NITA6ICAgICAgICAgICAgICEyKiAgICAgICAgICAgICAhNCIgICAgICAgICAgICAgITVSICAgICAgICAgCi1NICAgICE2RiAgICAgICAgICAgICAgICEkICAiUiAgIENOICAgICAhJCAgIlUgICBDUSAgICAgISQgICJWCi1NICAgQ1MgICAgICEkICAiVyAgIENWICAgICAhJCAgIlkgICBDWSAgICAgISQgICJaICAgQ1wgICAgICEkCi1NICAiWyAgIENfICAgICAhJCAgIl0gICBEIiAgICAgISQgICJeICAgRCUgICAgICEkICAiXyAgIEQoICAgCi1NICAhJCAgIyEgICBEKyAgICAgISQgICMiICAgRC4gICAgICEkICAjIyAgIEQxICAgICAhJCAgIyUgICBECi1NNCAgICAgISQgICMmICAgRDggICAgICEkICAjKSAgIEQ8ICAgICAhJCAgIyogICBEQCAgICAgISQgICMrCi1NICAgREQgICAgICEkICAjLSAgIERIICAgICAhJCAgIy4gICBETCAgICAgISQgICMvICAgRFAgICAgICEkCi1NICAjMSAgIERUICAgICAhJCAgIzIgICBEWCAgICAgISQgICMzICAgRFwgICAgICEkICAjNSAgIEUgICAgCi1NICAhJCAgIzYgICBFJCAgICAgISQgICM3ICAgRSggICAgICEkICAjOSAgIEUsICAgICAhJCAgIzogICBFCi1NMCAgICAgISQgICM8ICAgRTQgICAgICEkICAjPSAgIEU4ICAgICAhJCAgIz4gICBFPCAgICAgISQgICNACi1NICAgRUAgICAgICEkICAjQSAgIEVEICAgICAhJCAgI0IgICBFSCAgICAgISQgICNEICAgRUwgICAgICEkCi1NICAjRSAgIEVQICAgICAhJCAgI0YgICBFVCAgICAgISQgICNIICAgRVggICAgICEkICAjSSAgIEVcICAgCi1NICAhJCAgI0ogICBGICAgICAgISQgICNMICAgRiQgICAgICEkICAjTSAgIEYoICAgICAhJCAgI08gICBGCi1NLCAgICAgISQgICNQICAgRi8gICAgICEkICAjUSAgIEYyICAgICAhJCAgI1IgICBGNSAgICAgISQgICNUCi1NICAgRjggICAgICEkICAjViAgIEY8ICAgICAhJCAgI1cgICBGQCAgICAgISQgICNXICAgRkAgICAhOThECi1NICAgICAgIENOICAgITlYQCAgICAgICAgICAgICE6QEAgICAgICAgICAgICAhO0hAICAgICAgICAgICAgCi1NITxYQCAgICAgICAgICAgICE9REAgICAgICAgICAgICAhPkxAICAgICAgICAgICAgIT9cQCAgICAgICAgCi1NICAgICFAQEAgICAgICAgICAgICAhQUBAICAgICAgICAgICAgIUJIQCAgICAgICAgICAgICFDMEAgICAgCi1NICAgICAgICAhRDRAICAgICAgICAgICAgIUVAQCAgICAgICAgICAgICFGMEAgICAgICAgICAgICAhRyRACi1NICAgICAgICAgICAgIUhQQCAgICAgICAgICAgICFKXEAgICAgICAgICAgICAhTTBAICAgICAgICAgICAgCi1NIU8gQCAgICAgICAgICAgICFQREAgICAgICAgICAgICAhUlhAICAgICAgICAgICAgIVRAQCAgICAgICAgCi1NICAgICFVXEAgICAgICAgICAgICAhWChAICAgICAgICAgICAgIVlUQCAgICAgICAgICAgICFbNEAgICAgCi1NICAgICAgICAhXURAICAgICAgICAgICAgIV84QCAgICAgICAgICAgICIhMEAgICAgICAgICAgICAiIkhACi1NICAgICAgICAgICAgIiRAQCAgICAgICAgICAgICImQEAgICAgICAgICAgICAiJ1xAICAgICAgICAgICAgCi1NIilIQCAgICAgICAgICAgICIrSEAgICAgICAgICAgICAiLFxAICAgICAgICAgICAgIi5AQCAgICAgICAgCi1NICAgICIwOEAgICAgICAgICAgICAiMVBAICAgICAgICAgICAgIjM4QCAgICAgICAgICAgICI1NEAgICAgCi1NICAgICAgICAiNlRAICAgICAgICAgICAgIjg4QCAgICAgICAgICAgICI5MEAgICAgICAgICAgICAiQlxACi1NICAgICAgICAgICAgIkNMQCAgICAgICAgICAgICJMWEAgICAgICAgICAgICAiTURAICAgICAgICAgICAgCi1NIk4wQCAgICAgICAgICAgICJQQEAgICAgICAgICAgICAiUTxAICAgICAgICAgICAgIlM0QCAgICAgICAgCi1NICAgICJULCQgICAgICAgRkIgICAiVFAkICAgICAgIEZCICAgIlVMJiAgICAgICEgTyAgICJWSUQgICAgCi1NICAgRkIgICAiV1VEICAgICAgIEZCICAgIlhGICAgICAgICAgICAgICJaTiAgICAgICAgICAgICAiW1YgCi1NICAgICAgICAgICAgIl4yICAgICAgICAgICAgICJfViAgICAgICAgICAgICAjIU4gICAgICAgICAgICAgCi1NIyNGICAgICAgICAgICAgICMlLiAgICAgICAgICAgICAjJzYgICAgICAgICAgICAgIylCICAgICAgICAgCi1NICAgICMrNiAgICAgICAgICAgICAjLSYgICAgICAgICAgICAgIy4uICAgICAgICAgICAgICMvOiAgICAgCi1NICAgICAgICAjMFogICAgICAgICAgICAgIzFKICAgICAgICAgICAgICM2TiAgICAgICAgICAgICAjN0IgCi1NICAgICAgICAgICAgIzgqICAgICAgICAgICAgICM4ViAgICAgICAgICAgICAjOzogICAgICAgICAgICAgCi1NIz1SICAgICAgICAgICAgICM/JEQgICAgICAgRkIgICAjQDxAICAgICAgICAgICAgI0FYRCAgICAgICBHCi1NICAgICNDMEQgICAgICAgRzMgICAjQ1wkICAgICAgIEc+ICAgI0Q8JCAgICAgICBHPiAgICNFOUQgICAgCi1NICAgRz4gICAjRkVEICAgICAgIEc+ICAgI0c2ICAgICAgICAgICAgICNJPiAgICAgICAgICAgICAjSkYgCi1NICAgICAgICAgICAgI00iICAgICAgICAgICAgICNORiAgICAgICAgICAgICAjUD4gICAgICAgICAgICAgCi1NI1I2ICAgICAgICAgICAgICNTXiAgICAgICAgICAgICAjViYgICAgICAgICAgICAgI1gyICAgICAgICAgCi1NICAgICNaJiAgICAgICAgICAgICAjW1YgICAgICAgICAgICAgI1xeICAgICAgICAgICAgICNeKiAgICAgCi1NICAgICAgICAjX0ogICAgICAgICAgICAgJCA6ICAgICAgICAgICAgICQlPiAgICAgICAgICAgICAkJjIgCi1NICAgICAgICAgICAgJCZaICAgICAgICAgICAgICQnRiAgICAgICAgICAgICAkKiogICAgICAgICAgICAgCi1NJCxCICAgICAgICAgICAgICQtVEAgICAgICAgICAgICAkLyRAICAgICAgICAgICAgJDBYQCAgICAgICAgCi1NICAgICQyICQgICAgICAgRz4gICAkMjFEICAgICAgIEc+ICAgICAhJCAvX18gICBHPiAgICQyTCUgID4sCi1NICAgU04gICAkMygnICA7QSAgISBSICAgJDNEKSAgNywgICEjKiAgICQzWCUgIDQuICAgQCggICAkNDAlCi1NICAtXiAgIENOICAgJDRIJyAgNVIgICEgSCAgICQ1LCUgICNTICAgQycgICAkNjglICA+TyAgIEMiICAgCi1NJDcoKSAgPy8gICEgUiAgICQ3TCUgICojICAgQl0gICAkOSgpICA7VCAgISBUICAgJDpEKSAgL1ogICEgCi1NViAgICQ8ICkgID0vICAhIFggICAkPTwpICAxSSAgISBaICAgJD5YKSAgKk4gICEgXCAgICQ/WCkgIEEyCi1NICAhIF4gICAkQFgpICA6ICAgISEgICAgJEFYKSAgISwgICEhIiAgICRCWCkgICJZICAhISQgICAkQ1gpCi1NICA/JiAgISEoICAgJEQ8KSAgOyggICEhKiAgICRFICkgID46ICAhISwgICAkRUQlICAyMyAgIEM2ICAgCi1NJEZUJSAgPU8gICBCSSAgICRIJCkgICgjICAhIS4gICAkSTQlICAjLyAgIEMxICAgJEooJSAgLksgICBCCi1NRCAgICRKXCkgIDs9ICAhITAgICAkS1AlICAyRiAgIEczICAgJEwwKSAgQiQgICEhMiAgICRNUCkgIDg0Ci1NICAhITQgICAkTzApICA0QyAgISE2ICAgJFBQKSAgMzkgICEhOCAgICRRVCkgICtWICAhITogICAkUlgpCi1NICA4RiAgISE8ICAgJFNcKSAgMUYgICEhPiAgICRVICkgIDxAICAhIUAgICAkVUgpICA1SyAgISFCICAgCi1NJFYwJSAgMyUgICBDLCAgICRXRCUgIDFXICAgQlggICAkWFgpICAiRSAgISFEICAgJFosKSAgOT0gICEhCi1NRiAgICRbQCUgIDRHICAgQ0EgICAkXDglICA2LSAgIEJTICAgJF0wKSAgQSQgICEhSCAgICReKCkgICZbCi1NICAhIUogICAkXyApICA9UyAgISFMICAgJF9YKSAgPyIgICEhTiAgICUhPCkgIDMoICAhIVAgICAlIyApCi1NICA/UCAgISFSICAgJSM8KSAgK1ggICEhVCAgICUkKCkgID0kICAhIVYgICAlJTApICAnOiAgISFYICAgCi1NJSY4KSAgMj4gICEhWiAgICUmXCkgIDxLICAhIVwgICAlJ0gpICA8TCAgISIiICAgJSg0JSAgLjkgICBDCi1NOyAgICUpTCUgIDlVICAgQk4gICAlKyQpICAvLiAgISIoICAgJSw8KSAgJCkgICEiKiAgICUtVCkgICFNCi1NICAhIiwgICAlLywpICApVyAgISIuICAgJS9cKSAgPSUgICEiMCAgICUwPCUgIDI9ICAgQ0cgICAlMTgpCi1NICBBQSAgISIyICAgJTI0KSAgN1ogICEiNCAgICUzMCkgID9OICAhIjYgICAlNCwpICAnLSAgISI4ICAgCi1NJTUoKSAgKjkgICEiOiAgICU2JCkgID4lICAhIjwgICAlNkQpICA+TCAgISMgICAgJTgsKSAgPlkgICEjCi1NIiAgICU4TCkgID0mICAhIyQgICAlOSwnICAqOCAgISBQICAgJTo0KSAgPVEgICEjJiAgICU7MCkgICszCi1NICAhIyggICAlPCwlICA5WSAgIEcgICAgJT04JSAgOikgICBGQiAgICU+RCcgIDZAICAhIE4gICAlP0k/Ci1NN1QxOTNEJS0yNCwgOFcpVCwiWU8gJj1EOEZVRStGXCA5Vi1DLEVdQztWVVA6NlFFOSJYICtWQU87NjRPCi1NOVZZVStWPUQ4Ql1XO1cpSytWWUU9Ul1EOTc5TytWPUQ4RzFFPFcwTz0jJFArUCFHOSYpTTkyWUMgJkVOCi1NPSNJVCwzVVIsM0xNLEMkVC1TMFgsUzhULiNMUiwzMFctI0BTLUMwVy5QIUM6JiVSLkcwUi83KFIuUyBbCi1NLDMoVy5QIUw7VllHKCZFTj0jSVQsU1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcuUCFVCi1NO0ctSTlWWUU5IiFJO0cwWj0jMF08QyRbLCNMTSwzTCA7Jl1OOVIhVTtHLUk5VllFOSIhSTtHMFo9IzRdCi1NPEMkWywjTE0sM0wgPFZBTzxHMEA6NllULkcwVi83KFEuUlRTLEM8Vi4jTFMsQzxWLVNMIDsmXU45UiFMCi1NO1ZZRygmRU49I0lULVNVUiwzTFAuUlRRLlAhUzomXVI9IiFVO0ctSTlWWUU5IiFJO0cwWj0jQF08QyRbCi1NLCNMVi0zNFMtM0wgOyZdTjlSIUw7VllHKCc1TjxWRUc7RjVEKCZFTj0jSVQuM1VSLDNMUC5SVFEuUCFTCi1NOjY9Tjk2MEA4VkFBPENJVCwzIF08QyRbKzMkUi4jTFEsQzxbICc1TjxWRUc7RjVEKCYtSDg3KFo9IyRRCi1NLzcoUS5TIFssQzRVLlAhRjsmXUE9I0lULDMoXTxDJFstI0xQLlAhRDtXNUI7JjRaPSMkUy83KFEuU0BbCi1NLCNMIDsmXU45UiFEO1c1QjsmNFo9IyRULzcoUS5TQFssI0wgPUZdSTkjSVQsMzRdLDM0ID0lXVM9JylVCi1NOFcwWjUjJFYvNyxSLSc5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaCi1NLUJQUS1CUFEtQ01WN1ZFTj0lXU05NlVCOTcoWiwyUFMsQlBTLENNVjdWUU87Rj0/OzY1TThGNVIuQyxMCi1NLUMwTCxTKFs9RV1GOyZdQT0lXU05NlVCOTcoWiwzKEwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSCi1NLkMkUysjJFIuIlBWLSNMWyAnMT89NllJO1ZYWjUjJFcvNzRYPUVdQzomJVI3VlVFOzYpRTxDSFIrIyBMCi1NLiNNVjdXLUg7VylUN1ZVRTs2KUU8Q0hWKyMgTCwzOFs9RV1JO0cxPzs2NU04RjVSLkMkTCwiUFMsQ01WCi1NN1ZRTztGPT87NjVNOEY1Ui5DLEwsIlBTLENNVjdWOUw7ViVUN1ZVRTs2KUU8Q0hRLEJQUCsjLFIuVzk/Ci1NOSZdVThGUUU3VlVFOzYpRTxDSFEsUlBQKyM4VC5TTCA9RV1DOiYlUjdWOVU7RixaMUMoID1FXVM6Nj1OCi1NOTYxPzhWQUE8RV1GPTZZQy5EOFEsICFWN1c1TjxWRUc7RjVEN1YtSDg3KT85RzVOOFNJJiwzJCA9RV1TCi1NOiZdUj0lXUY9NllDLkQ4ViAnOT88VkVHO0Y1RDdXLUg7VylUN1Y5VTtGLFoxQzggPUVdVTtHLUk5VllFCi1NOSVdUzomXVI9JV1GPTZZQy5EOFggJzk/OjZZVDdWOVU7RixaMUMkID1FXVM6Nj1OOTYxPzo2WVQ3VjlVCi1NO0YsWjFDJCA9RV1VO0ctSTlWWUU5JV1JO0cxPzlHNU44U0kmLSAhVjdWUU87Rj0/OUc1TjhTSSYsUCFWCi1NN1ctSTlWWUU5JV1MO1ZZRzdWOVU7RixaMUMsID1FXVU7Ry1JOVZZRTklXUw7VllHN1Y5VTtGLFoxQzQgCi1NPUVdRjsmXUE9JV1GPTZZQy5EOFEsQCFWN1YxTz02KUw5NV1GPTZZQy5EOFEsUCFMOjZZSy5FMFEuI1VTCi1NLDM0UjtGNVg9I0hRLjNUSiwzQEwsIlBTLENNTDo2WUs5RzVOOFNIUiwjVEosQyRdOUMkWSsjLFIrIyxSCi1NLlctVD02OUYuQyhSLzYlUiwzTFAuUyBbLEMsXTg3KFEuUyBbLDNMUi0jVUE8QyRbLCNMUi5TJFYrIzhUCi1NKyMkUS0zKFsuUCFUPTVdTDo2WUsuRTBSLTNVVSwzMFQ7RjVYPSNIUS4yUFArIyxSLlZRSTtGTUY9NllDCi1NLkMoUCsjIEwsUyhbPFcxVTlGOFosQyhMLCJQUSwzNFIuU0wgOFZdTDtXKVMuRTBSLUNVRT42NUw7Jl1XCi1NLkMgTDwnNVI8JlFFLkMkTDwmRU46U0hSKyNMIDhWJVI8U0k0LEM8XTk2KU09U0hQKychTzxHLUM6JjRaCi1NLDJQWyAmKU87VlFFODZYWj0jKFgvNjUmMDRRMzEzSFArJTEyNTQ0WiwyUFsgJilWODZRUy5FMFIuM1VFCi1NOUYlTDxWNFosIlFUPEc1RS5DJEwuUCFCO1ZdTDk2JU4sQ0lULENEIDs2RVM7VylEOTcpRTkjSTQsUyBdCi1NOTcxVztTSFIrJl1OOTNIUSsnSUU8RlxaLCJRVDonKUU5M0hTKyNMIDs2JUk7Q0kmLDAhVjdWLUg4NyhaCi1NMVMoID1FXVM6Nj1OOTYxPzhWQUE8Q0knLDMgID1FXVU7Ry1JOVZZRTklXUM6JiVSLkQ8USwwIVY3Vy1ICi1NO1cpVC5EPFYgJzk/PFZFRztGNUQ3Vy1IO1cpVC5EPFYgJzk/PTZZUzo2PU45NjE/PFZBTzxHMFoxU0AgCi1NPUVdSTtHMFoxUyQgPUVdUzo2PU45NjE/OjZZVC5EPFEgJzk/PTZZUzo2PU45NjE/OjZZVC5EPFQgJzk/Ci1NOyZdTjlTSScsUCFWN1ctSTlWWUU5JV1MO1ZZRy5EPFMgJzk/PTZZUzo2PU45NjE/OyZdTjlTSSctMCFWCi1NN1Y5TDtWJVQuRDxRLEAhVjdWMU89NilMOTNJJywzLCA9RV1DOiYlUjdWJVI8RiVZLkQ8UywzVUE8QyRbCi1NLCNMUS5TKCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+M0knLFMoXTg3KFEuUyBbLDNMUSwgIVY3VzVOCi1NPFZFRztGNUQ3Vi1IODcpPzg3KVI4N0RaMVMsUy82JVIsM0xQLlMkWywzJCA9RV1TOiZdUj0lXUE8RylBCi1NPjNJJyxTMF04NyhRLlMgWywzTFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZLkQ8Uy0gIVY3VzVOCi1NPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZLkQ8Uy0zVUE8QyRbLCNMUS5TQCA9RV1JO0cxPzg3KVI4N0RaCi1NMVMsVi82JVIsM0xQLlMkWywwIVY3Vy1JOVZZRTklXUk7RzE/ODcpUjg3RFoxUyxWICc5Pz02WVM6Nj1OCi1NOTYxPzo2WVQ3ViVSPEYlWS5EPFMtU1VBPEMkWywjTFEuUzAgPUVdTDtWWUc3ViVSPEYlWS5EPFMuI1VBCi1NPEMkWywjTFEuUywgPUVdUzo2PU45NjE/OyZdTjlVXUE8RylBPjNJJyxTQCA9RV1VO0ctSTlWWUU5JV1MCi1NO1ZZRzdWJVI8RiVZLkQ8Uy4zVUE8QyRbLCNMUS5TNCA9RV1GOyZdQT0lXUE8RylBPjNJJy0jIF04NyhRCi1NLlMgWywzTFEsQCFWN1YxTz02KUw5NV1BPEcpQT4zSSctIyRdODcoUS5TIFssM0xRLFAhVjdWLUg4Nyk/Ci1NPCZdSTtHMUU8Q0knLSMoXSpDKCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSLkQ8VCxTVEosMyAgCi1NPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KFoxUzBULzJIUSwwIVY3Vy1IO1cpVDdXIU86NllUCi1NOTcoWjFTMFUvMkhWICc5PzxWRUc7RjVEN1ctSDtXKVQ3VyFPOjZZVDk3KFoxUzBVICc5Pz02WVM6Nj1OCi1NOTYxPzxWQU88RzE/PCZdSTtHMUU8Q0knLSM4XSpDQCA9RV1JO0cxPzwmXUk7RzFFPENJJy0jPF0qQyQgCi1NPUVdUzo2PU45NjE/OjZZVDdXIU86NllUOTcoWjFTMFcgJzk/PTZZUzo2PU45NjE/OjZZVDdXIU86NllUCi1NOTcoWjFTMFgvMkhUICc5PzsmXU45VV1QO1ZFTj0mNVIuRDxULjNUSixQIVY3Vy1JOVZZRTklXUw7VllHCi1NN1chTzo2WVQ5NyhaMVMwWSAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSLkQ8VSwjVEotMCFWCi1NN1Y5TDtWJVQ3VyFPOjZZVDk3KFoxUzRRLzJIUSxAIVY3VjFPPTYpTDk1XVA7VkVOPSY1Ui5EPFUsQ1RKCi1NLDMsID1FXVM9JylVOFcwUS5EPFEtQCFWN1ctVDxHNUM9IyhaMVM0Uy83LFItJzk/OFZBQTxFXU05NlVCCi1NOTcoWixCUFArI0BbPUVdUzomXVI9JV1NOTZVQjk3KFotQlBRLUJQUS1DTVY3VkVOPSVdTTk2VUI5NyhaCi1NLDJQUyxCUFMsQ01WN1ZRTztGPT87NjVNOEY1Ui5DLEwtQzBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaCi1NLDMoTC4zOEwsUyhbPUVdRDtXNUI7JjU/OzY1TThGNVIuQyRTKyMkUi4iUFYtI0xbICc5Pz02WUk7VlhaCi1NMVMkVyAnOT89NllJO1ZYUi5EPFUtI1VVLic5PzhWQUE8RV1NOTZVQjk3KFosQlBQKyNAWz1FXVM6Jl1SCi1NPSVdTTk2VUI5NyhaLUJQUCsjJFYuVzk/OjZZVDdWVUU7NilFPENIUSsjIEwsUyhbPUVdTDtWWUc3VlVFCi1NOzYpRTxDSFMrIyBMLFMoWz1FXUY7Jl1BPSVdTTk2VUI5NyhaLDMoTCwiUFMsQ01WN1YxTz02KUw5NV1NCi1NOTZVQjk3KFosMyxMLCJQVi0jTFsgJy0/OyZFTjpTSScsM0QgPTVdTDo2WUsuRDxSLTAhUDxGRU04NylZCi1NLkQ8VS0zVUU8RjVELkMgTDlXKUU5NlhaLDJRQjsnNUUuQyhMLlAhTjtWWVA8RkVNODcpWS5EPFItQCFDCi1NOyc1TjpWNVIuRDxVLUNVRThWQUU9R0RaLCJRRjtXKUQuQyRMLlAhUzwmXVI9Jy1DODcoWjFTKFcgJV0/Ci1NOzYlSTtCWU8gJj1DOFMpPzhWXU08JkVMOTYwTiAlXUk7RkVUOjYlTDo3SUU5IlhQICJdRztHNE85Vi1DCi1NK1Y9QzhTKE88VylDK1AgTitWUUk4Rj1DOFMoTjhQIUk7RzBaPSMkXTxDJFsrMyhRLSM8VC4jLFYtI0BbCi1NLEMkVC1TMFgsUzhULVNMIDhWQUE8Q0lULENVUixDTFAuUyRSLVNMIDsmXU45UiFJO0cwWj0jLF08QyRbCi1NKzMoUS0jPFQuIyxWLSNAWyxDJFQtUzBYLFM4VC1TTCA9NllTOjY9Tjk2MEA6NllULkcwVC83KFEuUyBbCi1NKzMkWyAmUU87RjxAPTZZUzo2PU45NjBAOjZZVC5HMFUvNyhRLlMgWyszJFsgJy1IO1cpVCgmRU49I0lUCi1NLUNVUiwzTE0sUyhXLUNAWyxTKFctQzxbICZRTztGPEA7Jl1OOVIhSTtHMFo9IzxdPEMkWywjTE0sM0wgCi1NPFZBTzxHMEA9NllTOjY9Tjk2MEA6NllULkcwWC83KFEuUyBbLUM0VSxTNFsgJlFPO0Y8QDsmXU45UiFVCi1NO0ctSTlWWUU5IiFJO0cwWj0jRF08QyRbLCNMTSwzTCA8VkVHO0Y1RCgmLUg4NyhaPSMkUC83KFEuUlRRCi1NLENAWywzKFcuUCFVO0ctSTlWWUU5IiFDOiYlUi5HMFEsM1VSLDNMUC5TKFUtM0wgOUZRTzg3MFo9IyRSCi1NLzcoUS5TMFssI0wgOSZdVThGUUUuRzBRLFNVUiwzTFguUyBbICZRTztGPEA5Jl1VOEZRRS5HMFEtI1VSCi1NLDNMWC5TIFsgJzlPOjYwWj0jJFUvMyRVICcpRTlVXUM7JiVTPFNJNCwzOF05NFkvN1UpJTFVLFosIlEnCi1NMTRZJTREJSw3VSklMVUsWiwyUSY0JV0yMTQ9My5DKEwwNFEsN1UpJTFVLFosUlEsMjRVPzRENSc3VC0sCi1NMDUtMzE1LFotIlBbICchVDxGMUk5Rjk/PSNJVCwwIVM6N0lFN1cwWj0jJCA9Vi1IODcpPz0jSVQuICFMCi1NO1ZZRzsmXU45U0k0LDM8XTxTQUg6Nj1ILkMsTCwiUFMsQ01MO1c8WixSUFMsQlBTLENMWyAmUU87Rj0/Ci1NOyZdTjlTSVQsM0BdPTNBUy5DJFcrIyBMLUMwWzsmUFotUlBQKyM4VC5TTCA5RzVOOFVdUD0nKFo9IyRZCi1NLzJIUiwjVUYsMzQgN1VdRDtVXUc7Jl1CODZRPzknMU88RyxaMUMkVSAlXUU+JkVUN1YxVTs2VVk3VylFCi1NOUNJJyxDJF0qQyQgN1VdRDtVXUc7Jl1CODZRPzhXMU88RyxaMUMkVSAlXT87NiVJO0NJJiwzNCA3VjVYCi1NOjcwTjtQIUc4VixSN1YtTzs3IUk7JjVEK0AgTzlWWVUrVj1DOFJdRzhWLFIrVy1SOFJcICtCXUw6NilHCi1NOFYsUitGLCA6NllULkcwUS83KFEuUlRSLDMwVy0jQFMtQzBYLlMoUS0jPFQuIyxWLSM8WyAmLUg4NyhaCi1NPSMoXTxDKFssI0xRLEM8WyAmUU87RjxAOjZZVC5HMFMvNyhRLlJUUiwzMFctI0BTLUMwWC5TKFEtIzxUCi1NLiMsVi0jPFsgJzVOPFZFRztGNUQoJkVOPSNJVC0jVVIsM0xQLlJUUS5QIUw7VllHKCc1TjxWRUc7RjVECi1NKCZFTj0jSVQtM1VSLDNMUC5SVFEuUCFTOiZdUj0iIUk7RzBaPSM4XTxDJFsrMyxSLVM4WC5TLFItUzhXCi1NLlAhTDtWWUcoJlFPO0Y8QDo2WVQuRzBXLzcoUS5TIFsrMyRbICctSDtXKVQoJzVOPFZFRztGNUQoJkVOCi1NPSNJVC4jVVIsM0xQLlM4VS0zLFUuUCFMO1ZZRygmUU87RjxAPTZZUzo2PU45NjBAOjZZVC5HMFkvNyhRCi1NLlMgWyszJFsgJy1JOVZZRTkiIUM6JiVSLkcwUSwjVVIsM0xNLDMoWC5TJFItU0wgPTZZUzo2PU45NjBACi1NOFZBQTxDSVQsMyRdPEMkWywjTFItMzRbICY5TDtWJVQuRzBRLENVUiwzTFQuUyBbICYxTz02KUw5M0lUCi1NLDMsXTxDJFsuI0xQLlAhTDtWWUcoJjFPPTYpTDkzSVQsMzBdPEMkWy4jTFAuUCFWO1ZFRC5HMFEtM1RRCi1NLTAhUjk2PT84VlFBPFcsWjUjJFYvNjUuM1VdMjE0PTMuQyBMMVQ1LjE1KSEzJV0yMTQ9My5DJEwxRSE/Ci1NNEQ1JzRTSFIrJCUsMyVdMjE0PTMuQyxMMyRFLTdVKSUxVV0jMyQlMzRUNTMuQzBMLlAhUD0nKUQ6NjlGCi1NN1cwWj0jJCA8VkVaOTVdVC5HMFEgJz1DOiYlUjdXMFo9I0AgOyZdTjlWUU87RjxaNSMkVy83LFg6JkVHCi1NOiNIUysjIEwsUyhbOyZdVy5DLEwsUyhMLFMoWy5QIUw7VllHN1ZRTztGPFo9IyRYLzc0WDxTSFEtUlBQCi1NKyM4VC5WUUwuQzxMLCJQVi0jTFsgJjlVO0YtPzwnMVIuRzBRLjNUSixDIF05QyRVICVdRT4mRVQ3VjFVCi1NOzZVWTdWMUU4VlBaMVMkIDdVXSM1JF0yN1RRKTRVMT83U0knLEMkXTg3KFEuUyBbLDNMUS4wIT83VDE0Ci1NM1UpPzMkRTM1JV0/LkQ8UiwwIE07JjwgOyZFQjlSWVMgJV1FPSY1WD0gIT85NjFBPSYkIDdWNU45ICFTCi1NPSYlUj0gIT87NiVJO0AhPzk2WVY6NylPO0AhPz1FXVM6Nj1OOTYxPzo2WVQ3VjlVO0YsIDdXOT86NllUCi1NN1Y5VTtGLCA3VyFSOjZVQTxHRCA3Vzk/PTZZUzo2PU45NjE/PFZBTzxHMT85RzVOOFAhPz1FXVM6Nj1OCi1NOTYxPzsmXU45VV1QO1ZFTj0mNVIgJV1WN1ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoIDdXOT89NllTCi1NOjY9Tjk2MT87Jl1OOVVdQTxHKUE+MCE/PUVdVTtHLUk5VllFOSVdQzomJVI3ViVSPEYlWSAlXVY3VlFPCi1NO0Y9PzwmXUk7RzFFPEAhPz1FXUM6JiVSN1chTzo2WVQ5NyggN1c5Pz02WVM6Nj1OOTYxPzo2WVQgJV1WCi1NN1ctSTlWWUU5JV1TOiZdUj0gIT89RV1EO1c1QjsmNT84NylSODdEIDdXOT89NllJO1ZYIDdXOT85RlFPCi1NODcwIDdXOT88VkFPPEcwIDdXOT88VkVHO0Y1RDdWUU87Rj0/OUc1TjhQIT89RV1TOjY9Tjk2MT84VkFBCi1NPEVdRj02WUMgJV1WN1ctSTlWWUU5JV1JO0cxPzg3KVI4N0QgN1c5PzsmXU45VV1GPTZZQyAlXVY3Vi1ICi1NODcpPzlHNU44UCE/PUVdSTtHMT84NylSODdEIDdVXT87NiVJO0AhPz1FXVU7Ry1JOVZZRTklXUk7RzE/Ci1NPCZdSTtHMUU8QCE/PUVdUzo2PU45NjE/PFZBTzxHMT88Jl1JO0cxRTxAIT89RV1VO0ctSTlWWUU5JV1TCi1NOiZdUj0lXUE8RylBPjAhPz1FXVU7Ry1JOVZZRTklXUw7VllHICVdVjdWOUw7ViVUN1chTzo2WVQ5NyggCi1NN1c5PzxWQU88RzE/PCZdSTtHMUU8QCE/PUVdVTtHLUk5VllFOSVdQzomJVIgJV1WN1c1Tjo2XU4sQCE/Ci1NPUVdRDtXNUI7JjQgN1c5Pz02WVM6Nj1OOTYxPzo2WVQ3VjlVO0YsIDdXOT88VkVHO0Y1RDdXLUg7VylUCi1NN1Y5VTtGLCA3Vzk/PFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgN1c5PzxWRUc7RjVEN1YtSDg3KT84NylSCi1NODdEIDdXOT85RlFPODcxPzlHNU44UCE/PUVdUzomXVI9JV1GPTZZQyAlXVY3Vy1JOVZZRTklXUk7RzAgCi1NN1c5PzsmXU45VV1BPEcpQT4wIT89RV1DOiYlUjdWJVI8RiVZICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/Ci1NPCZdSTtHMUU8QCE/PUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KCA3Vzk/OjZZVCAlXVM8Jl1SCi1NPSctQzg3KCA3Vzk/OSZdVThGUUU3VyFPOjZZVDk3KCA3Vzk/PTZZUzo2PU45NjE/PFZBTzxHMCA3Vi1MCi1NPTZZSzk3KCA3Vzk/PFcxUj02LVQsMCE/PUVdUz0nKVU4VzBSICVdVjdXNU48VkVHO0Y1RDdWUU87Rj0/Ci1NOUc1TjhQIT89RV1VO0ctSTlWWUU5JV1DOiYlUjdWOVU7RiwgN1c5PzxWRUc7RjVEN1ZFTj0lXVA7VkVOCi1NPSY1UiAlXVY3VzVOPFZFRztGNUQ3VkVOPSVdQTxHKUE+MCE/PUVdUzo2PU45NjE/PFZBTzxHMT84NylSCi1NODdEIDdWWU87RyFSOjZVQTxHRCA3Vy0/OyZFTjpQIT89RV1EO1c1QjsmNT85RzVOOFAhPz1FXVM6Nj1OCi1NOTYxPzsmXU45UCE/PUVdSTtHMT88Jl1JO0cxRTxAIT89RV1TOjY9Tjk2MT84VkFBPEAhPz1FXUY7Jl1BCi1NPSVdQTxHKUE+MCE/PUVdUzomXVI9JV1BPEcpQT4wIT89NV1MOjZZSyAlXVY3VzVOPFZFRztGNUQ3Vy1ICi1NO1cpVDdXIU86NllUOTcoIDdXOT87Jl1OOVAhPz1FXUM6JiVSICVdPzk3QUk9JV1EPTZVTT41XUQ5Ni1MCi1NICVdPzdULTQzVSk/MyRFMzUlXT8gJV0/N1QxNDNVKT8zJEUzNSVdPyAlXT83VjFPN1Y9TDtWKUE7JV1DCi1NPSZdUjxQIT83VV1EO1VdRzsmXUI4NlE/OScxTzxHLCA3VV1FPiZFVDdWMVU7NlVZN1cpRTlAICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0oICAgICAgICAgICAgCi0gCi1lbmQKZGlmZiAtLWdpdCBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtZWxmLnUgYi9nZGIvdGVzdHN1aXRlL2dkYi5iYXNlL3NwYXJjLWVsZi51CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzIwYzBmLi4wMDAwMDAwCi0tLSBhL2dkYi90ZXN0c3VpdGUvZ2RiLmJhc2Uvc3BhcmMtZWxmLnUKKysrIC9kZXYvbnVsbApAQCAtMSwzMzYgKzAsMCBAQAotYmVnaW4gNzc3IHNwYXJjLWVsZgotTT9UNSwxQCQiIDAgICAgICAgICAgICAgIiAgKCAgICAhICAkLyUgICAgIzAgICM7MCAgICAgICBUICIgIAotTSEwIEggITwgJFAgICAgOCAgICBUICAkIC0gICAgICAgICAiQCAgICBIICAgICA0ICAgICAgICAgIFAgIAotTSAtMCAgICAgICAgICAgICAgISQgICAgICAgICAhICAgICAgICAgICEgICAgLSAgISAjMCAgICAgICAgMwotTT0gICAkVzAgICAgJSAgJCAgICAgICAkICAhLkggICgzSiAgICAgICAgICNMICAgIk0gICAgIDwgIDAgIAotTSAgICAgQCAgJSBQICBBMCwgICAgICAgICAoQCAgICAgICAgICFQICAgICBPPTctUitWUUk4Ql1MOSJZUwotTTtSWFEgICAgICAgICAlLCAgICFIICAgIDJQICAgICAgICAgICAgICAuQCAgICYoICAgIFcgICAgNSAgIAotTSAgICAgICAgICAgIDRQICAgJVwgICAhRCAgICA0ICAgICQgICAgISogICAgNVAgICAjOCAgICAgICAgIAotTTIwICAgIywgICAgTSAgICAvUCAgICVYICAgICAgICAgICAgICAiNCAgICA8ICAgIDBQICAgICAgICAhMQotTSAgICAqICAgICAgICAgISIgICAgICAgICAiMCAgICE7ICAgICwgICAgIyQgICAgUiAgICAxUCAgICQ0IAotTSAgIS4gICAgOCAgICAgICAgICBDICAgICtAICAgJUAgICAgICAgICAvMCAgICAgICAgICAgICAgKCAgIAotTSAkMCAgICE8ICAgIDIgICAgICAgICAgICAgICArICAgICAgICAgIS8gICAgICAgICAgICAgICE2ICAgIAotTSAgICAgJjwgICAhOiAgICA2MCAgICY4ICAgICAgICAgLlAgICAgICAgICAgICAgICAgICAgJVQgICAgIAotTSAgICArUCAgICAgICAgIUUgICAgICAgICAgICAgICFBICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpAICAgIkQgICAgICAgICAgICAgICAgIAotTSAgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUCAgICAgICAgICAgICAgICAgIAotTSAiOCAgICA7ICAgICAgICAgIVQgICAgICAgICAgICAgICFIICAgIF4gICAgMDAgICAiTCAgICBVICAgIAotTSAgICAgICAgICAgNyAgICAgICAgICAgICAgICAgICAgICAgICAiKCAgICAgICAgICAgICAgJFAgICAgIAotTSAgICAgICAgICQ4ICAgIFggICAgNEAgICAjMCAgICEtICAgICAgICAgI1AgICAgICAgICAgICAgICAgIAotTSAgIEcgICAgICAgICAlNCAgICAgICAgICAgICAgIUAgICAgPiAgICAgICAgICAgICAgIFkgICAgOFAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgJCBVICAgICAgIyAgICEgICAgICAgISAuQCAgICAgIFAgIAotTSBAICAgICAgIDAvPCAgICAgICwgICAsICAgICAgICQqNyAgICAgICMgICAkICAgICAgICEjTUAgICAgIAotTSBQICAhMCAgICAgICAwW0QgICAgICAsICAgOCAgICAgICAkLyIgICAgICAjICAgJyAgICAgICAhI1EwIAotTSAgICAgUCAgIiAgICAgICAgMS1QICAgICAgLCAgIEQgICAgICAgJDNAICAgICAgIyAgICogICAgICAgIgotTSRaQCAgICAgIFAgICJQICAgICAgIEEwICAgICAgICwgICBQICAgICAgICg0IyAgICAgICMgICAtICAgIAotTSAgICIlKUAgICAgICBQICAjQCAgICAgICAgICAgICAgICAsICAgXCAgICAgICAgICAgICAgICAjICAgMAotTSAgICAgICAgICAgICAgICAgUCAgJDAgICAgICAgICAgICAgICAgLCAgISggICAgICAgICAgICAgICAgIwotTSAgIDMgICAgICAgICAgICAgICAgIFAgICUgICAgICAgICAgICAgICAgICwgICE0ICAgICAgICAgICAgIAotTSAgICMgICA2ICAgICAwICIlKUAgICAgKCQwICAjQCAgICBEICAxLVAgICAgICEoICAgRCAgICAvICAoNAotTUggICAgIDAxICAgLiAgICAlQCAiJSpAICAgIjAkMCAgI0AgICAhVCAgQTRYICAgICEhJCAgIFggICAgVAotTSAgKDUvICAgICAwMSAgIC4gICAgLkAgIiU0ICAgICAhJDAgICNAICAgJEAgIEE1JCAgICAhISQgICBYIAotTSAgITYgICg1MiAgICAgQDEgICAuICAgIDdQICIlNSAgICAgKCQwICAjQCAgICc0ICBBNTggICAgIiEkIAotTSAgWCAgICIqICAoNTggICAgIDAxICAgLiAgICBHUCAiJTYwICAgICQkMCAgI0AgICAqPCAgQTVIICAgIAotTSEhJCAgIFggICAiVCAgJDA5ICAgICEwMiAgICggICAgUjAgISNYQCAgICA0JEAgICIgICAgLTQgIEE1UAotTSAgICAiISQgICBYICAgIz4gICg1PiAgICAgMDEgICAuICAgIFogICIlN1AgICAgIiQwICAjQCAgIC9YIAotTSBBNV4gICAgIEEkICAgWCAgICQvICAoNUAgICAgIEAxICAgLiAgICEoUCAhI1BAICAgICAkQCAgIVAgIAotTSAyRCAgQTYoICAgICBBJCAgIFggICAkWCAgJC9RICAgICEwMiAgICggICAhMTAgIiU4UCAgICAkJDAgIAotTSNAICAgNFQgIEE2MCAgICAgQSQgICBYICAgJTogICg1RiAgICAhQDEgICAuICAgITkgICIlOyAgICAgOAotTSQwICAjQCAgIDZYICBBNyggICAgISEkICAgWCAgICVVICAoNVMgICAgIDAxICAgLiAgICFBICAiJT0gIAotTSAgICQkMCAgI0AgICA5UCAgMSEwICAgICUhKCAgIEAgICAmTyAgKDVVICAgICAwMSAgIC4gICAhUUAgIgotTSU9QCAgICAiJDAgICNAICAgPFggIDBfTCAgICAlISggICBAICAgJ0QgICg0IyAgICAgIDEgL19RICAgIQotTVswICEkKkAgICArKCRAICAiICAgID8oICAxLiAgICAgISEkICAgSCAgICdfICAkMEQgICAgIUAyICAgKAotTSAgICIjMCAiJT1IICAgICIkMCAgI0AgICBCJCAgMSA0ICAgICUhKCAgIEAgICAoUyAgKDVXICAgICAwMQotTSAgIC4gICAiMFAgIiU+ICAgICAkJDAgICNAICAgRSggIEE3SCAgICAkISQgICBYICAgKUEgICQvJSAgIAotTSAnMDIgICAoICAgIjogICIlKTAgICAgICQwI19cMCAgIEZcICAxIEggICAgJSEoICAgQCAgICojICAoNQotTV4gICAgIEAxICAgLiAgICJDUCAiJUAgICAgICQkMCAgI0AgICBJPCAgMSFYICAgICYhKCAgIEAgICAqRAotTSAgJDAvICAgICEwMiAgICggICAiTCAgIiVAMCAgICAoJDAgICNAICAgTCwgIEE5MCAgICAhIiQgICBYIAotTSAgKysgICg2IyAgICAgMDEgICAuICAgIlcgICIlQSAgICAgJCQwICAjQCAgIE8oICAwXzggICAgJSEoIAotTSAgQCAgICwmICAoNiUgICAgIDAxICAgLiAgICMlMCAiJUFAICAgICQkMCAgI0AgICBSVCAgMF5QICAgIAotTSUhKCAgIEAgICAtIiAgKDY3ICAgICAgMSAvX1EgICAjMVAgIiVBUCAgICAkJDAgICNAICAgVVggIEE4QAotTSAgICAhISQgICBYICAgLUwgICg2KSAgICAgJDEgICAuICAgIz8gICIlQkAgICAgJCQwICAjQCAgIFhQIAotTSBBOEwgICAgISEkICAgWCAgIC48ICAkM0ogICAgICAxIC9fUSAgICNIUCAiJUMgICAgICgkMCAgI0AgIAotTSBbJCAgQThYICAgICEhJCAgIFggICAvJiAgKDQgICAgICAgMSAvX1EgICAjVyAgISQgICAgICA0JEAgIAotTSIgICAgXjwgIDBePCAgICAlISggICBAICAgL1ogICg2LyAgICAgMDEgICAuICAgJCIgICIlRCAgICAgIQotTSQwICAjQCAgISBcICBBOSQgICAgISEkICAgWCAgIDA6ICAoNjIgICAgIEAxICAgLiAgICQpUCAiJF4wIAotTSAgIDAkQCAgICAgICEiUCAgQS84ICAgIDYhKCAgICAgICAwUyAgKDNcICAgICBAMiAgICAgICAkLjAgIgotTSVFICAgICAkJDAgICNAICAhJCggIEE5NCAgICAhISQgICBYICAgMTsgICg2NiAgICAgMDEgICAuICc5PwotTT02WUk7VlggN1Y5STtGRCA8VV1MOjZZSyAnNT87JkVOOlAhVjdXLUk5VllFOSVdUzomXVI9JV1QO1ZFTgotTT0mNVIgJzk/OjZZVCAnOT88VkVHO0Y1RDdWLUg4NyggPUVdSTtHMT88Jl1JO0cxRTxAIVY3VjFPPTYpTAotTTkwIVY3VzVOPFZFRztGNUQ3VlFPO0Y9Pzg3KVI4N0QgPUVdVTtHLUk5VllFOSVdSTtHMT84NylSODdEIAotTT1FXVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KCA4VlFVO0ZNRTxAIVY3Vy1JOVZZRTklXUk7RzAgPUVdVQotTTtHLUk5VllFOSVdTDtWWUc3VjlVO0YsID1FXUM6JiVSN1Y5VTtGLCA9RV1VO0ZFTztDKCA8VyFPPEcxUwotTThWJVIgJzk/PTZZUzo2PU45NjE/OFZBQTxFXUE8RylBPjAhVjdXNU48VkVHO0Y1RDdXLUg7VylUICc5PwotTTxWRUc7RjVEN1ZRTztGPT84NylSODdEIDdWRU46NzAgPUVdUzo2PU45NjE/PFZBTzxHMCA9RV1TOiZdUgotTT0lXUY9NllDICc5PzlGUU84NzAgPUVdQzomJVI3ViVSPEYlWSAnOT88VzFSPTYtVCwwIVY3Vy1UPEc1QwotTT0jKCA9RV1MO1ZZRyAnOT87Jl1OOVVdUDtWRU49JjVSICc5Pz02WVM6Nj1OOTYxPzsmXU45VV1QO1ZFTgotTT0mNVIgJzk/PFZFRztGNUQ3VlFPO0Y9PzlHNU44UCFWN1c1TjxWRUc7RjVEN1ZFTj0lXVA7VkVOPSY1UgotTSAnOT88VkFPPEcwID1FXVU7Ry1JOVZZRTklXVM6Jl1SPSVdRj02WUMgJV0kNjRZITM0RSMgJlVBOjZYIAotTTdWUUk4RV1WOTcpUzo2XU4gJzk/OSZdVThGUUU3VjlVO0YsID1FXVM6Nj1OOTYxPzhWQUE8RV1BPEcpQQotTT4wIVY3Vy1JOVZZRTklXUk7RzE/OUc1TjhQIVY3VzVOPFZFRztGNUQ3VlFPO0Y8ID1FXVU7Ry1JOVZZRQotTTklXUk7RzAgPUVdRDtXNUI7JjU/ODcpUjg3RCA3Vy1UODcpVCAlXUU5JiVUODAhVjdXNU48VkVHO0Y1RAotTTdWRU49JV1GPTZZQyAnOT86NllUN1YlUjxGJVkgJyFSOjZVQTxHRCA9RV1GOyZdQT0lXUY9NllDICc5PwotTTsmXU45VV1GPTZZQyAnOT88VkVHO0Y1RDdWRU49JV1BPEcpQT4wIUU7RzlJPEZdTiAnOT85Jl1VOEZRRQotTTdXIU86NllUOTcoID1FXVM6Nj1OOTYxPzhWQUE8RV1QO1ZFTj0mNVIgJzk/PFZFRztGNUQ3Vy1IO1cpVAotTTdWOVU7RiwgPUVdQzomJVI3VyFPOjZZVDk3KCA9RV1VO0ctSTlWWUU5JV1DOiYlUjdXIU86NllUOTcoIAotTT1FXVU7Ry1JOVZZRTklXUM6JiVSN1Y5VTtGLCA3VjVOOSAhVjdXNU48VkVHO0Y1RDdXLUg7VylUN1YlUgotTTxGJVkgJzk/PFZFRztGNUQ3VlFPO0Y8ID1FXVU7Ry1JOVZZRTklXUM6JiVSICc5PzxWQU88RzE/PCZdSQotTTtHMUU8QCFWN1Y5TDtWJVQ3VyFPOjZZVDk3KCA3VjVUOTdBVCAnOT85RlFPODcxPzg3KVI4N0QgPUVdUwotTTo2PU45NjE/PFZBTzxHMT84NylSODdEIDdUPSwzVCkhMyVdLzFEOTMxNTE/NSQlIjMkNT8gJzk/OjZZVAotTTdWOVU7RiwgPUVdUzo2PU45NjE/OFZBQTxFXUY9NllDICc5PzxWQU88RzE/ODcpUjg3RCA9RV1DOiYlUgotTSAmWU87RyFSOjZVQTxHRCA9RV1MO1ZZRzdWJVI8RiVZICY1WDo3MCA4NzFFPiZFVCAlXUU+JkVUICVdRQotTTtHOUk8Rl1OICc5Pz02WVM6Nj1OOTYxPzxWQU88RzE/PCZdSTtHMUU8QCFWN1ctSTlWWUU5JV1MO1ZZRwotTTdXIU86NllUOTcoIDsmRUI4UllTO1JYUSAgICAgQTkwICAhRSRQICAgICAgIEEvOCAgIUMlMCAgICAgIAotTSBBL0QgICFCJTAgICAgICAgQS9QICAhRCUwICAgICI9WFteQEA8P0AiKCdIICAiXCQiICBYIC5AMCooIwotTUgkMjwoWiBAQCkgICAwKiAgIDIwJCAgITAgISEqQCQgICAgMSAgISREIShDPCQgIDAyOCEgICAgP19fXwotTVwgJCAgICIwJCAgMERBICAkOTRMKCAqNCBKICRFIDEgIkE8ICAoNjYkTikwVSIrICAkICAgJFghICAgIAotTTAgISEmUCQgICAhICAkJDwgMCAgIClXQ09ZIlAkIiAgLCggICA4JydYIEIhWiAgIEc+Ll9EKyAwKCAgUAotTUAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAgKVdDT1kiUCQiICAsKCAgIDgnJwotTVggQiFaICAgRz4uX0QrIDAoICBQQCAgIUA8P0AiKCdIICAiPVhbXjBMISBAICMiICAgJiFRXiAoQD5AIAotTSApV0NPWSJQJCIgICwoICAgOCcnWCBCIVogICBHPi5fRCsgMCggIFBAICAhQDw/QCIoJ0ggICI9WFteMAotTUwhIEAgIyIgICAmIVFeIChAPkAgIClXQ09ZIlAkIiAgLCggICA4JydYIEIhWiAgIEc+Ll9EKyAwKCAgUAotTUAgICFAPD9AIignSCAgIj1YW14wTCEgQCAjIiAgICYhUV4gKEA+QCAgKVdDT1kgMSAgISRQMChDQiMiIAotTSAgJiFRXiAoQD5AICApV0NPWSAxICAhJFAxSENEIyIgICAmIVFeIChAPkAgIClXQ09ZIDEgICIlUCJIQgotTTAhJCAgKDYyJCIgIVRCSEEwISQgICg2MiQiICJUQkhCKSEkICAoNjIkIiAjVEMoQVYhJCAgKDYyJCIgJAotTVRDKEFCISQgICg2MiQiICVUQyhBP0EkICAoNjIkIiAmVEIoQS8hJCAgKDYyJCIgJ1RCKEE6ISQgICg2MgotTSQiIChUQihBWCEkICAoNjIkIiApVEIoQVIhJCAgKDYyJCIgKlRCKEIoISQgICg2MiQiICtUQihBVyEkIAotTSAoNDMgICEkVSApQ0YtMEIoOFAxICAiJSRQICAxLTA6OFojNC5CJSgkMCAgQTEsICAoNzQiRikgVSJIQQotTUQhJCAgKDQzICAiJVUgSUEwLTBKKD1IMSAgIiUkUCAgQT0wKjhCMzQqQiVcJDAgIEExLCAgKDc0JEYnOAotTVUjKEIvISQgICg0MyAgIiVVISlBQi0wUihDQDEgICIlJFAgIEE9MDI4N1s0LEIoPCQwICBBMSwgICg3NAotTSBGJFxVIihBXiEkICAoNDMgICIlVSApQTotMEIoQDAxICAiJSRQICBBPTAiOD4jNChCJTgkMCAgQTEsIAotTSAoNzQgRicoVSIoQjIhJCAgKDQzICAiJVUgKUIoLTBCKDggMSAgIiUkUCAgQT0wIjg9UzQoQiUwJDAgIAotTUExLCAgKDc0IEYmLFUiKEIsISQgICg0MyAgIiVVIUlBMi0wWig+QDEgICIlJTAgIEE5KDJIRCMyKEIoNAotTSQwICBBMTQgICg2MiRKJSBUQihCJCEkICAoNDUgICIlREEqQiktKEIoQUAxICAiJSUwICBBOSgySD1DMgotTShCKEgkMCAgQTE0ICAoNjIkSiYoVEIoQS4hJCAgKDQ1ICAiJURBKkE/TShCKEUwMSAgIiUlMCAgQTkoMgotTUgzUzIoQiUkJDAgIEExNCAgKDYyJEolSFRCKEE4ISQgICg0NSAgIiVEQSpBWC0oQig9MDEgICIlJTAgIAotTUE5KDJIPEMyKEInLCQwICBBMTQgICg2MiRKKEBUQihCNiEkICAoNDUgICIlREEqQVctKEIoPSAxICAiJQotTSUwICBBOSgySDhTMihCKEwkMCAgQTE0ICAoNjIkSiUoVEIoQiMhJCAgKDYyJCIgIlRCKEIgISQgICg2MgotTSQiICJUQihCMSEkICAoNjIkIiAhVEIoQT4hJCAgKDYyJCIgIVRCKEE5ISQgICg0MyAgIiVVIClASC0wQgotTSgqQDEgICIlJFAgIEE9MDI4KUM0LEIlUEA8P0AiKCdIICAiPVhbXkBAPD9AIignSCAgICAgICAgICAgIAotTSAwICAgICAgICAgICAgICAgICAgICAgICAgICAwTEAgICAgICAgISA6MCAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgICMgUAotTU9fX1MgMCAgICAsICAjUFBPX19QIDAgICAgLCAgJEBQT19fTSAwICAgICQgICAgICBBMCwgICAgICAgIAotTSAgICAgICAhICAgJDwwICAgIFAgIDBcKCAgICAjMCAhJFcgICAgICQgICQgWiAgICAgNCAgMEk8ICAgIAotTSFAICEgXVAgICAgKiAgICQ+UCAgICBMICAgIDAgICAgJTAgICAgICAgICAjICAoM0ogICAgICggICAgRAotTSAgICAlICAgICA8ICAgIDcgICQuWSAgICAgPCAgMFs4ICAgICIgICAgIyAgICAgKSAgICAjICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISAgICAgICAgICAgJCAvX1EgICAgICAgIQotTSAtMCAgICAgIFAgICAwICAgICAgIDAjSCAgICAgICwgICAoICAgICAgICQjVyAgICAgICMgICAjICAgIAotTSAgICEiRVAgICAgICBQICAhICAgICAgICAwWzggICAgICAsICAgNCAgICAgICAkLlkgICAgICAjICAgJgotTSAgICAgICAhI1BAICAgICAgUCAgIVAgICAgICAgMFw0ICAgICAgLCAgIEAgICAgICAgJDM8ICAgICAgIwotTSAgICkgICAgICAgISRYICAgICAgIFAgICJAICAgICAgIEEuSCAgICAgICwgICBMICAgICAgICg0ICAgIAotTSAgICMgICAsICAgICAgICIlIFAgICAgICBQICAjMCAgICAgICBBMjggICAgICAsICAgWCAgICAgICAgIAotTSAgICAgICAjICAgLyAgICAgICAgICAgICAgICAgUCAgJCAgICAgICAgICAgICAgICAgLCAgISQgICAgIAotTSAgICAgICAgICAgIyAgIDIgICAgICAgICAgICAgICAgIFAgICRQICAgICAgICAgICAgICAgICwgICEwIAotTSAgICAgICAgICAgICAgICMgICA1ICAgICAgICAgICAgICAgICBQICAlQCAgICA8ICAgICAgICAgICAwIAotTV9fJCAgICAuICAgICAgICAgICAkIC9fUSAgICAmQCAgICAgICAgICAhICNfXDAgICAiKCAgICAgICAgIAotTSAgMCBfXyQgICAgSSAgKDRGICAgICBAMSAgIC4gICAgLDAgISRXICAgICAgJEAgICIwICAgIzwgIEEyQAotTSAgICAhISQgICBYICAgIF4gICg0SiAgICApIDEgICAuICAgIDEwICIlM0AgICAgJCQwICAjQCAgICVQIAotTSBBNFwgICAgISEkICAgWCAgICFCICAoNTAgICAgICQxICAgLiAgICA8ICAiJTQwICAgICQkMCAgI0AgIAotTSAnWCAgQTUoICAgICIhJCAgIFggICAiJyAgKDU0ICAgICBAMSAgIC4gICAgRzAgIiU1QCAgICAoJDAgIAotTSNAICAgKyggIEE1QCAgICAhISQgICBYICAgIycgICg1OSAgICAgMDEgICAuICAgIFNQICIlNkAgICAgJAotTSQwICAjQCAgIC1QICAxIUQgICAgJSEoICAgQCAgICNRICAkL0IgICAgITAyICAgKCAgICBfMCAiJTcgIAotTSAgICgkMCAgI0AgICAwOCAgQTVYICAgICEhJCAgIFggICAkMCAgKDU/ICAgICAoMSAgIC4gICAhKUAgIgotTSU3WCAgICAiJDAgICNAICAgMzwgIEE2ICAgICAiISQgICBYICAgJSsgICQvIiAgICAgIDIgICAnICAgIQotTTQwICIlOEAgICAgIiQwICAjQCAgIDYgICAwXyQgICAgJSEoICAgQCAgICVNICAoNUMgICAgIDAxICAgLgotTSAgICE9MCAiJTkgICAgICIkMCAgI0AgICA4KCAgQTY4ICAgICYhJCAgIFggICAmLCAgKDVMICAgICFAMQotTSAgIC4gICAhRUAgIiU8QCAgICAkJDAgICNAICAgOVQgIEE3LCAgICAhISQgICBYICAgJkwgICg1VCAgIAotTSAgMDEgICAuICAgIVEgICEkJSAgICAgNCRAICAiICAgID08ICBBNzQgICAgISEkICAgWCAgICdOICAoNQotTVYgICAgICgxICAgLiAgICFdQCAhI15QICAgIDQkQCAgIiAgICBAUCAgQTAsICAgICAhJCBfXyQgICAoNQotTSAgJDBKICAgIExAMiAgICggICAiJkAgISRYICAgICAkJDAgICJAICAgQjwgIDEiMCAgICAmISggICBAIAotTSAgKFUgICg1VkAgICAgKDEgICAuICAgIjIwICEkITAgICAgNCRAICAiICAgIEVMICBBNzwgICAgISEkIAotTSAgWCAgIClLICAoNVggICAgIDAxICAgLiAgICI+QCAiJT5AICAgIDAkMCAgI0AgICBIRCAgMFw0ICAgIAotTT0hKCAgIEAgICAqMCAgKDRFICAgICAgMSAvX1EgICAiRVAgISQiQCAgICA0JEAgICIgICAgSkwgIEE3WAotTSAgICAiISQgICBYICAgKlcgICg2ICAgICAgMDEgICAuICAgIk9QICEkJ0AgICAgOCRAICAiICAgIExQIAotTSAxIFwgICAgJSEoICAgQCAgICs4ICAoNiEgICAgIEAxICAgLiAgICJaUCAiJUUgICAgICQoMCAgI0AgIAotTSBPLCAgQTgsICAgICEhJCAgIFggICAsJCAgKDYkICAgICAwMSAgIC4gICAjJkAgISNdQCAgICA0JEAgIAotTSIgICAgUlggIEE4NCAgICAhISQgICBYICAgLF0gICg2JiAgICAgMDEgICAuICAgIzUwICEjWyAgICAgNAotTSRAICAiICAgIFZIICBBOTwgICAgICEkIF9fJCAgIC1PICAoNicgICAgIDAxICAgLiAgICNBQCAiJUIgIAotTSAgICQkMCAgI0AgICBZMCAgQThEICAgICAxJCAgIFggICAuRCAgKDYqICAgICAwMSAgIC4gICAjTSAgIgotTSVCUCAgICAkJDAgICNAICAgXDAgIDEuSCAgICAgISQgX18kICAgLysgICg2LCAgICAgQDEgICAuICAgIwotTVYwICIlQ0AgICAgJCQwICAjQCAgIF5YICBBMCAgICAgICEkIF9fJCAgIDAkICAkMCAgICAgITAyICAgKAotTSAgICQjUCAhI1lQICAgIDQkQCAgIiAgICEiKCAgQThcICAgICEhJCAgIFggICAwUCAgKDYwICAgICAkMQotTSAgIC4gICAkLVAgIiVEMCAgICAkJDAgICNAICAhJCggIEE5KCAgICAiISQgICBYICAgMS8gICgzWSAgIAotTSAhIDIgICAgICAgJDUgICIkXUAgICAhOCRAICAgICAgISVMICBBL1AgICAgIiEoICAgICAgIDFBICAoNgotTTQgICAgIDAxICAgLiAgICQ6QCAiJUUwICAgICQkMCAgI0AgICEoLCAgQTk4ICAgICEhJCAgIFggOVYxQgotTTs2NCA4VylUOjJZUyAnOUE7JzVFPFJVODgyWUMgJj1EOEZVRStGLCA4VylUO0JZUyAnOT89NllJO1ZYIAotTTdWOUk7RkQgPFVdTDo2WUsgJzU/OyZFTjpQIVY3Vy1JOVZZRTklXVM6Jl1SPSVdUDtWRU49JjVSICc5PwotTTo2WVQgJzk/PFZFRztGNUQ3Vi1IODcoID1FXUk7RzE/PCZdSTtHMUU8QCFWN1YxTz02KUw5MCFWN1c1TgotTTxWRUc7RjVEN1ZRTztGPT84NylSODdEID1FXVU7Ry1JOVZZRTklXUk7RzE/ODcpUjg3RCA9RV1TOjY9TgotTTk2MT86NllUN1chTzo2WVQ5NyggOFZRVTtGTUU8QCFWN1ctSTlWWUU5JV1JO0cwID1FXVU7Ry1JOVZZRQotTTklXUw7VllHN1Y5VTtGLCA9RV1DOiYlUjdWOVU7RiwgPUVdVTtGRU87QyggPFchTzxHMVM4ViVSICc5PwotTT02WVM6Nj1OOTYxPzhWQUE8RV1BPEcpQT4wIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVCAnOT88VkVHO0Y1RAotTTdWUU87Rj0/ODcpUjg3RCA3VkVOOjcwID1FXVM6Nj1OOTYxPzxWQU88RzAgPUVdUzomXVI9JV1GPTZZQwotTSAnOT85RlFPODcwID1FXUM6JiVSN1YlUjxGJVkgJzk/PFcxUj02LVQsMCFWN1ctVDxHNUM9IyggPUVdTAotTTtWWUcgJzk/OyZdTjlVXVA7VkVOPSY1UiAnOT89NllTOjY9Tjk2MT87Jl1OOVVdUDtWRU49JjVSICc5PwotTTxWRUc7RjVEN1ZRTztGPT85RzVOOFAhVjdXNU48VkVHO0Y1RDdWRU49JV1QO1ZFTj0mNVIgJzk/PFZBTwotTTxHMCA9RV1VO0ctSTlWWUU5JV1TOiZdUj0lXUY9NllDICVdJDY0WSEzNEUjICZVQTo2WCA3VlFJOEVdVgotTTk3KVM6Nl1OICc5PzkmXVU4RlFFN1Y5VTtGLCA9RV1TOjY9Tjk2MT84VkFBPEVdQTxHKUE+MCFWN1ctSQotTTlWWUU5JV1JO0cxPzlHNU44UCFWN1c1TjxWRUc7RjVEN1ZRTztGPCA9RV1VO0ctSTlWWUU5JV1JO0cwIAotTT1FXUQ7VzVCOyY1Pzg3KVI4N0QgN1ctVDg3KVQgJV1FOSYlVDgwIVY3VzVOPFZFRztGNUQ3VkVOPSVdRgotTT02WUMgJzk/OjZZVDdWJVI8RiVZICchUjo2VUE8R0QgPUVdRjsmXUE9JV1GPTZZQyAnOT87Jl1OOVVdRgotTT02WUMgJzk/PFZFRztGNUQ3VkVOPSVdQTxHKUE+MCFFO0c5STxGXU4gJzk/OSZdVThGUUU3VyFPOjZZVAotTTk3KCA9RV1TOjY9Tjk2MT84VkFBPEVdUDtWRU49JjVSICc5PzxWRUc7RjVEN1ctSDtXKVQ3VjlVO0YsIAotTT1FXUM6JiVSN1chTzo2WVQ5NyggPUVdVTtHLUk5VllFOSVdQzomJVI3VyFPOjZZVDk3KCA9RV1VO0ctSQotTTlWWUU5JV1DOiYlUjdWOVU7RiwgN1Y1TjkgIVY3VzVOPFZFRztGNUQ3Vy1IO1cpVDdWJVI8RiVZICc5PwotTTxWRUc7RjVEN1ZRTztGPCA9RV1VO0ctSTlWWUU5JV1DOiYlUiAnOT88VkFPPEcxPzwmXUk7RzFFPEAhVgotTTdWOUw7ViVUN1chTzo2WVQ5NyggN1Y1VDk3QVQgJzk/OUZRTzg3MT84NylSODdEID1FXVM6Nj1OOTYxPwotTTxWQU88RzE/ODcpUjg3RCA3VD0sM1QpITMlXS8xRDkzMTUxPzUkJSIzJDU/ICc5Pzo2WVQ3VjlVO0YsIAotTT1FXVM6Nj1OOTYxPzhWQUE8RV1GPTZZQyAnOT88VkFPPEcxPzg3KVI4N0QgPUVdQzomJVIgJllPO0chUgotTTo2VUE8R0QgPUVdTDtWWUc3ViVSPEYlWSAmNVg6NzAgODcxRT4mRVQgJV1FPiZFVCAlXUU7RzlJPEZdTgotTSAnOT89NllTOjY9Tjk2MT88VkFPPEcxPzwmXUk7RzFFPEAhVjdXLUk5VllFOSVdTDtWWUc3VyFPOjZZVAotTTk3KCAgJzlBOyc1RTxSVTg4MllDICJdRDo3OUUrVylFOyY1QTxWNE84QlVTPjctSTlGRVgrVzVTPEJdUwotTTxGLE87JkVCK1ZRSThGLE8gJyFPPEcwTzlWNU4rVzlBOyc1RTxSVTg4MllDICAgIDYnMEAuUiE2LzMoTgotTSwgIU04NkVOICVdTDo2KT89RjVSPFZFTztAIE89JlVQICJdVTxXKE84Vi1TK1ZRSThCXVY4NlFVOTcsTQotTTYmJE47UCAgOVYxQjs2NE44UCBPPSZVUCtQIUc5JilNOTJZQyAmPUM4Uyk/OFZdTTwmRUw5NjBOICZFTgotTT0jSVQsM1VSLDNMTSxDJFQtUzBYLFM4VC4jTFIsMzBXLSNAUy1DMFcuUCFDOiYlUi5HMFIvNyhSLlMgWwotTSwzKFcuUCFMO1ZZRygmRU49I0lULFNVUiwzTE0sQyRULVMwWCxTOFQuI0xSLDMwVy0jQFMtQzBXLlAhVQotTTtHLUk5VllFOSIhSTtHMFo9IzBdPEMkWywjTE0sM0wgOyZdTjlSIVU7Ry1JOVZZRTkiIUk7RzBaPSM0XQotTTxDJFssI0xNLDNMIDxWQU88RzBAOjZZVC5HMFYvNyhRLlJUUyxDPFYuI0xTLEM8Vi1TTCA7Jl1OOVIhTAotTTtWWUcoJkVOPSNJVC1TVVIsM0xQLlJUUS5QIVM6Jl1SPSIhVTtHLUk5VllFOSIhSTtHMFo9I0BdPEMkWwotTSwjTFYtMzRTLTNMIDsmXU45UiFMO1ZZRygnNU48VkVHO0Y1RCgmRU49I0lULjNVUiwzTFAuUlRRLlAhUwotTTo2PU45NjBAOFZBQTxDSVQsMyBdPEMkWyszJFIuI0xRLEM8WyAnNU48VkVHO0Y1RCgmLUg4NyhaPSMkUQotTS83KFEuUyBbLEM0VS5QIUY7Jl1BPSNJVCwzKF08QyRbLSNMUC5QIUQ7VzVCOyY0Wj0jJFMvNyhRLlNAWwotTSwjTCA7Jl1OOVIhRDtXNUI7JjRaPSMkVC83KFEuU0BbLCNMID1GXUk5I0lULDM0XSwzNCA9JV1TPScpVQotTThXMFo1IyRWLzcsUi0nOT84VkFBPEVdTTk2VUI5NyhaLEJQUCsjQFs9RV1TOiZdUj0lXU05NlVCOTcoWgotTS1CUFEtQlBRLUNNVjdWRU49JV1NOTZVQjk3KFosMlBTLEJQUyxDTVY3VlFPO0Y9Pzs2NU04RjVSLkMsTAotTS1DMEwsUyhbPUVdRjsmXUE9JV1NOTZVQjk3KFosMyhMLjM4TCxTKFs9RV1EO1c1QjsmNT87NjVNOEY1UgotTS5DJFMrIyRSLiJQVi0jTFsgJzE/PTZZSTtWWFo1IyRXLzc0WD1FXUM6JiVSN1ZVRTs2KUU8Q0hSKyMgTAotTS4jTVY3Vy1IO1cpVDdWVUU7NilFPENIVisjIEwsMzhbPUVdSTtHMT87NjVNOEY1Ui5DJEwsIlBTLENNVgotTTdWUU87Rj0/OzY1TThGNVIuQyxMLCJQUyxDTVY3VjlMO1YlVDdWVUU7NilFPENIUSxCUFArIyxSLlc5PwotTTkmXVU4RlFFN1ZVRTs2KUU8Q0hRLFJQUCsjOFQuU0wgPUVdQzomJVI3VjlVO0YsWjFDKCA9RV1TOjY9TgotTTk2MT84VkFBPEVdRj02WUMuRDhRLCAhVjdXNU48VkVHO0Y1RDdWLUg4Nyk/OUc1TjhTSSYsMyQgPUVdUwotTTomXVI9JV1GPTZZQy5EOFYgJzk/PFZFRztGNUQ3Vy1IO1cpVDdWOVU7RixaMUM4ID1FXVU7Ry1JOVZZRQotTTklXVM6Jl1SPSVdRj02WUMuRDhYICc5Pzo2WVQ3VjlVO0YsWjFDJCA9RV1TOjY9Tjk2MT86NllUN1Y5VQotTTtGLFoxQyQgPUVdVTtHLUk5VllFOSVdSTtHMT85RzVOOFNJJi0gIVY3VlFPO0Y9PzlHNU44U0kmLFAhVgotTTdXLUk5VllFOSVdTDtWWUc3VjlVO0YsWjFDLCA9RV1VO0ctSTlWWUU5JV1MO1ZZRzdWOVU7RixaMUM0IAotTT1FXUY7Jl1BPSVdRj02WUMuRDhRLEAhVjdWMU89NilMOTVdRj02WUMuRDhRLFAhTDo2WUsuRTBRLiNVUwotTSwzNFI7RjVYPSNIUS4zVEosM0BMLCJQUyxDTUw6NllLOUc1TjhTSFIsI1RKLEMkXTlDJFkrIyxSKyMsUgotTS5XLVQ9NjlGLkMoUi82JVIsM0xQLlMgWyxDLF04NyhRLlMgWywzTFItI1VBPEMkWywjTFIuUyRWKyM4VAotTSsjJFEtMyhbLlAhVD01XUw6NllLLkUwUi0zVVUsMzBUO0Y1WD0jSFEuMlBQKyMsUi5WUUk7Rk1GPTZZQwotTS5DKFArIyBMLFMoWzxXMVU5RjhaLEMoTCwiUFEsMzRSLlNMIDhWXUw7VylTLkUwUi1DVUU+NjVMOyZdVwotTS5DIEw8JzVSPCZRRS5DJEw8JkVOOlNIUisjTCA4ViVSPFNJNCxDPF05NilNPVNIUCsnIU88Ry1DOiY0WgotTSwyUFsgJilPO1ZRRTg2WFo9IyhYLzY1JjA0UTMxM0hQKyUxMjU0NFosMlBbICYpVjg2UVMuRTBSLjNVRQotTTlGJUw8VjRaLCJRVDxHNUUuQyRMLlAhQjtWXUw5NiVOLENJVCxDRCA7NkVTO1cpRDk3KUU5I0k0LFMgXQotTTk3MVc7U0hSKyZdTjkzSFErJ0lFPEZcWiwiUVQ6JylFOTNIUysjTCA7NiVJO0NJJiwwIVY3Vi1IODcoWgotTTFTKCA9RV1TOjY9Tjk2MT84VkFBPENJJywzICA9RV1VO0ctSTlWWUU5JV1DOiYlUi5EPFEsMCFWN1ctSAotTTtXKVQuRDxWICc5PzxWRUc7RjVEN1ctSDtXKVQuRDxWICc5Pz02WVM6Nj1OOTYxPzxWQU88RzBaMVNAIAotTT1FXUk7RzBaMVMkID1FXVM6Nj1OOTYxPzo2WVQuRDxRICc5Pz02WVM6Nj1OOTYxPzo2WVQuRDxUICc5PwotTTsmXU45U0knLFAhVjdXLUk5VllFOSVdTDtWWUcuRDxTICc5Pz02WVM6Nj1OOTYxPzsmXU45U0knLTAhVgotTTdWOUw7ViVULkQ8USxAIVY3VjFPPTYpTDkzSScsMywgPUVdQzomJVI3ViVSPEYlWS5EPFMsM1VBPEMkWwotTSwjTFEuUyggPUVdUzo2PU45NjE/OFZBQTxFXUE8RylBPjNJJyxTKF04NyhRLlMgWywzTFEsICFWN1c1TgotTTxWRUc7RjVEN1YtSDg3KT84NylSODdEWjFTLFMvNiVSLDNMUC5TJFssMyQgPUVdUzomXVI9JV1BPEcpQQotTT4zSScsUzBdODcoUS5TIFssM0xWICc5PzxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWS5EPFMtICFWN1c1TgotTTxWRUc7RjVEN1ctSDtXKVQ3ViVSPEYlWS5EPFMtM1VBPEMkWywjTFEuU0AgPUVdSTtHMT84NylSODdEWgotTTFTLFYvNiVSLDNMUC5TJFssMCFWN1ctSTlWWUU5JV1JO0cxPzg3KVI4N0RaMVMsViAnOT89NllTOjY9TgotTTk2MT86NllUN1YlUjxGJVkuRDxTLVNVQTxDJFssI0xRLlMwID1FXUw7VllHN1YlUjxGJVkuRDxTLiNVQQotTTxDJFssI0xRLlMsID1FXVM6Nj1OOTYxPzsmXU45VV1BPEcpQT4zSScsU0AgPUVdVTtHLUk5VllFOSVdTAotTTtWWUc3ViVSPEYlWS5EPFMuM1VBPEMkWywjTFEuUzQgPUVdRjsmXUE9JV1BPEcpQT4zSSctIyBdODcoUQotTS5TIFssM0xRLEAhVjdWMU89NilMOTVdQTxHKUE+M0knLSMkXTg3KFEuUyBbLDNMUSxQIVY3Vi1IODcpPwotTTwmXUk7RzFFPENJJy0jKF0qQyggPUVdUzo2PU45NjE/OFZBQTxFXVA7VkVOPSY1Ui5EPFQsU1RKLDMgIAotTT1FXVU7Ry1JOVZZRTklXUM6JiVSN1chTzo2WVQ5NyhaMVMwVC8ySFEsMCFWN1ctSDtXKVQ3VyFPOjZZVAotTTk3KFoxUzBVLzJIViAnOT88VkVHO0Y1RDdXLUg7VylUN1chTzo2WVQ5NyhaMVMwVSAnOT89NllTOjY9TgotTTk2MT88VkFPPEcxPzwmXUk7RzFFPENJJy0jOF0qQ0AgPUVdSTtHMT88Jl1JO0cxRTxDSSctIzxdKkMkIAotTT1FXVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVDk3KFoxUzBXICc5Pz02WVM6Nj1OOTYxPzo2WVQ3VyFPOjZZVAotTTk3KFoxUzBYLzJIVCAnOT87Jl1OOVVdUDtWRU49JjVSLkQ8VC4zVEosUCFWN1ctSTlWWUU5JV1MO1ZZRwotTTdXIU86NllUOTcoWjFTMFkgJzk/PTZZUzo2PU45NjE/OyZdTjlVXVA7VkVOPSY1Ui5EPFUsI1RKLTAhVgotTTdWOUw7ViVUN1chTzo2WVQ5NyhaMVM0US8ySFEsQCFWN1YxTz02KUw5NV1QO1ZFTj0mNVIuRDxVLENUSgotTSwzLCA9RV1TPScpVThXMFEuRDxRLUAhVjdXLVQ8RzVDPSMoWjFTNFMvNyxSLSc5PzhWQUE8RV1NOTZVQgotTTk3KFosQlBQKyNAWz1FXVM6Jl1SPSVdTTk2VUI5NyhaLUJQUS1CUFEtQ01WN1ZFTj0lXU05NlVCOTcoWgotTSwyUFMsQlBTLENNVjdWUU87Rj0/OzY1TThGNVIuQyxMLUMwTCxTKFs9RV1GOyZdQT0lXU05NlVCOTcoWgotTSwzKEwuMzhMLFMoWz1FXUQ7VzVCOyY1Pzs2NU04RjVSLkMkUysjJFIuIlBWLSNMWyAnOT89NllJO1ZYWgotTTFTJFcgJzk/PTZZSTtWWFIuRDxVLSNVVS4nOT84VkFBPEVdTTk2VUI5NyhaLEJQUCsjQFs9RV1TOiZdUgotTT0lXU05NlVCOTcoWi1CUFArIyRWLlc5Pzo2WVQ3VlVFOzYpRTxDSFErIyBMLFMoWz1FXUw7VllHN1ZVRQotTTs2KUU8Q0hTKyMgTCxTKFs9RV1GOyZdQT0lXU05NlVCOTcoWiwzKEwsIlBTLENNVjdWMU89NilMOTVdTQotTTk2VUI5NyhaLDMsTCwiUFYtI0xbICctPzsmRU46U0knLDNEID01XUw6NllLLkQ8Ui0wIVA8RkVNODcpWQotTS5EPFUtM1VFPEY1RC5DIEw5VylFOTZYWiwyUUI7JzVFLkMoTC5QIU47VllQPEZFTTg3KVkuRDxSLUAhQwotTTsnNU46VjVSLkQ8VS1DVUU4VkFFPUdEWiwiUUY7VylELkMkTC5QIVM8Jl1SPSctQzg3KFoxUyhXICAgTgotTTo2WVQ5NylQICJZSDg3LUggIllEPjZZUz42VCArRjFZO0ctVDxAIE48RjVMODJZQjxXLCArRylFOyYkTgotTTwmUVQgIllJO0ZFVCAiWVQ5N0FUICJZRjo2WUkgIllSO1YxQT0mJCArRyFMPSAgTjlWXVQgIllEPjZZQQotTTs2RUMgIllCPFcsICtHLVk7NzFBOEAgTjxXMVI9JiVCICJZUz0mJUIrRkVOOSY1WDxXMVIgIllTPSYlQgotTTxXMVIgIllTOictVDxHMUE4QCBOOFZdTTs2NU49ICBOPFcxQThCWUk7RjFFPiAgTjxXMUE4QCAgODcsWgotTSgkLEAxJjVWOTZRTzwmVUU7RzBANFY1VCgiIEgwVDEzKjIhMzQkJTIwVl1NPCZFTDk3KVMoIyhOLCIgUQotTS4iIS04N0RALDNEWSxASCAgJiVTLkIhIygkMUU9RjVMO1chTTk2WVQoJS1FPSIgQCokLSQ0UkRANFUhIQotTTRELU87NyFJOyY1UjxSIFIrQyBALDNAQDM2JVkoIyRZLjMoKiAgISAqIixJNFc1TjNVLEAtMlhQKCY5QwotTTxSWEAoJElVO0Y0QCwzRFksQCAgODcsWigkLEAxJjVWOTZRTzwmVUU7RzBANFY1VCgiIEgwVDEzKjIhMwotTTQkJTIwVl1NPCZFTDk3KVMoIyhOLCIgUS4iIS04N0RALDNEWSxASCAxVC0jLkIgSDFUWTUqMiFDPjY9TgotTT03LE0sQlhQK0MoICAmJVMuQiEjKCQxRT1GNUw7VyFNOTZZVCglLUU9IiBAKiQtJDRSREA0VSEhNEQtTwotTTs3IUk7JjVSPFIgUitDIEAsM0BAMzYlWSgjJFkuMygqICZRRC5CIEg0VD01KjIhMz02WS80Ul0zNUUoVAotTSgiQSwyUlRRK0MgSSAgICAgICAgICAkICAgICcgICAgQjAgICAgVUQgICAgICAgICAgICAgIz1EICAgIwotTSAgICAgICAgICZMWCAgICAgICAgICAgICAnIFggICAgICAgICAgICAgJFhcICAgICpBPTYhQCAgICVESgotTSAgICAgICAgICAgICAlWEAgICAgICAgICAgICAgICQgICAiXCAgICsjICAgICBFRCAgICAgICQvQiAgIAotTSAgXUQgICAgICAkL0IgICAgITxcICAgICAgICAgICAgICI6ICAgICAgICAgICAgICAkQiAgICAgICAgIAotTSAgICAgJUogICAgICAgICAgICAgICgmICAgICAgICAgICAgICApSiAgICAgICAgICAgICAgK0IgICAgIAotTSAgICAgICAgIC06ICAgICAgICAgICAgICAvIiAgICAgICAgICAgICAgMSogICAgICAgICAgICAgIDM2IAotTSAgICAgICAgICAgICA1KiAgICAgICAgICAgICAgNlogICAgICAgICAgICAgIDgiICAgICAgICAgICAgIAotTSA5LiAgICAgICAgICAgICAgOk4gICAgICAgICAgICAgIDs+ICAgICAgICAgICAgICBFJiAgICAgICAgIAotTSAgICAgTixEICAgICAgJC9CICAgICAhJCAgIVkgICAgICAgICAgISQgICFZICAgICEgICAgICEkICAhWQotTSAgICAjICAgIE8oRCAgICAgICQvRyAgICAgISQgICFaICAgICAgICAgICEkICAhWiAgICAhICAgICAhJAotTSAgIVogICAgIyAgICBQREQgICAgICAkL0wgICAgICEkICAhWyAgICAgICAgICAhJCAgIVsgICAgISAgIAotTSAgISQgICFbICAgICMgICAgUihEICAgICAgJC9RICAgICAhJCAgIV0gICAgICAgICAgISQgICFdICAgIAotTSEgICAgICEkICAhXSAgICAjICAgIFMoRCAgICAgICQvViAgICAgISQgICFeICAgICAgICAgICEkICAhXgotTSAgICAhICAgICAhJCAgIV4gICAgIyAgICBUREQgICAgICAkL1sgICAgICEkICAhXyAgICAgICAgICAhJAotTSAgIV8gICAgISAgICAgISQgICFfICAgICMgICAgVihEICAgICAgJDAgICAgICAhJCAgIiEgICAgICAgIAotTSAgISQgICIhICAgICEgICAgICEkICAiISAgICAjICAgIFcgRCAgICAgICQwJSAgICAgISQgICIiICAgIAotTSAgICAgICEkICAiIiAgICAhICAgICAhJCAgIiIgICAgIyAgICBYNEQgICAgICAkMCogICAgICEkICAiIwotTSAgICAgICAgICAhJCAgIiMgICAgISAgICAgISQgICIjICAgICMgICAgWVBEICAgICAgJDAvICAgICAhJAotTSAgIiUgICAgICAgICAgISQgICIlICAgICEgICAgICEkICAiJSAgICAjICAgIFpMRCAgICAgICQwNCAgIAotTSAgISQgICImICAgICAgICAgICEkICAiJiAgICAhICAgICAhJCAgIiYgICAgIyAgICBcJEQgICAgICAkMAotTTkgICAgICEkICAiJyAgICAgICAgICAhJCAgIicgICAgISAgICAgISQgICInICAgICMgICAgXUREICAgIAotTSAgJDA+ICAgICAhJCAgIikgICAgICAgICAgISQgICIpICAgICEgICAgICEkICAiKSAgICAkICAgIF5IRAotTSAgICAgICQwRCAgICAgISQgICIqICAgICAgICAgICEkICAiKiAgICAhICAgICAhJCAgIiogICAgJCAgIAotTSBfUiAgICAgICAgICAgICAhJkIgICAgICAgICAgICAgISpCICAgICAgICAgICAgICEsXiAgICAgICAgIAotTSAgICAhLk4gICAgICAgICAgICAgITBGICAgICAgICAgICAgICEyNiAgICAgICAgICAgICAhMyogICAgIAotTSAgICAgICAgITVcRCAgICAgICQwSiAgICAgISQgICJSICAgICAgICAgICEkICAiVSAgICAhICAgICAhJAotTSAgIlYgICAgIyAgICAgISQgICJXICAgICYgICAgICEkICAiWSAgICApICAgICAhJCAgIlogICAgLCAgIAotTSAgISQgICJbICAgIC8gICAgICEkICAiXSAgICAyICAgICAhJCAgIl4gICAgNSAgICAgISQgICJfICAgIAotTTggICAgICEkICAjISAgICA7ICAgICAhJCAgIyIgICAgPiAgICAgISQgICMjICAgIEEgICAgICEkICAjJQotTSAgICBEICAgICAhJCAgIyYgICAgSCAgICAgISQgICMpICAgIEwgICAgICEkICAjKiAgICBQICAgICAhJAotTSAgIysgICAgVCAgICAgISQgICMtICAgIFggICAgICEkICAjLiAgICBcICAgICAhJCAgIy8gICAhICAgIAotTSAgISQgICMxICAgISQgICAgICEkICAjMiAgICEoICAgICAhJCAgIzMgICAhLCAgICAgISQgICM1ICAgIQotTTAgICAgICEkICAjNiAgICE0ICAgICAhJCAgIzcgICAhOCAgICAgISQgICM5ICAgITwgICAgICEkICAjOgotTSAgICFAICAgICAhJCAgIzwgICAhRCAgICAgISQgICM9ICAgIUggICAgICEkICAjPiAgICFMICAgICAhJAotTSAgI0AgICAhUCAgICAgISQgICNBICAgIVQgICAgICEkICAjQiAgICFYICAgICAhJCAgI0QgICAhXCAgIAotTSAgISQgICNFICAgIiAgICAgICEkICAjRiAgICIkICAgICAhJCAgI0ggICAiKCAgICAgISQgICNJICAgIgotTSwgICAgICEkICAjSiAgICIwICAgICAhJCAgI0wgICAiNCAgICAgISQgICNNICAgIjggICAgICEkICAjTwotTSAgICI8ICAgICAhJCAgI1AgICAiPyAgICAgISQgICNRICAgIkIgICAgICEkICAjUiAgICJFICAgICAhJAotTSAgI1QgICAiSCAgICAgISQgICNWICAgIkwgICAgICEkICAjVyAgICJQICAgICAhJCAgI1cgICAiUCAgIAotTSE2PEAgICAgICAgICAgICAhNyRAICAgICAgICAgICAgITgsQCAgICAgICAgICAgICE5PEAgICAgICAgIAotTSAgICAhOihAICAgICAgICAgICAgITswQCAgICAgICAgICAgICE8QEAgICAgICAgICAgICAhPSRAICAgIAotTSAgICAgICAgIT4kQCAgICAgICAgICAgICE/LEAgICAgICAgICAgICAhP1RAICAgICAgICAgICAgIUBYQAotTSAgICAgICAgICAgICFCJEAgICAgICAgICAgICAhQlRAICAgICAgICAgICAgIUNIQCAgICAgICAgICAgIAotTSFFNEAgICAgICAgICAgICAhR0BAICAgICAgICAgICAgIUlUQCAgICAgICAgICAgICFLREAgICAgICAgIAotTSAgICAhTShAICAgICAgICAgICAgIU88QCAgICAgICAgICAgICFRJEAgICAgICAgICAgICAhUkBAICAgIAotTSAgICAgICAgIVRMQCAgICAgICAgICAgICFWOEAgICAgICAgICAgICAhV1hAICAgICAgICAgICAgIVooQAotTSAgICAgICAgICAgICFbXEAgICAgICAgICAgICAhXVRAICAgICAgICAgICAgIV8sQCAgICAgICAgICAgIAotTSIhJEAgICAgICAgICAgICAiIyRAICAgICAgICAgICAgIiRAQCAgICAgICAgICAgICImLEAgICAgICAgIAotTSAgICAiKCxAICAgICAgICAgICAgIilAQCAgICAgICAgICAgICIrJEAgICAgICAgICAgICAiLFxAICAgIAotTSAgICAgICAgIi40QCAgICAgICAgICAgICIvXEAgICAgICAgICAgICAiMVhAICAgICAgICAgICAgIjM4QAotTSAgICAgICAgICAgICI0XEAgICAgICAgICAgICAiNVRAICAgICAgICAgICAgIj9AQCAgICAgICAgICAgIAotTSJAMEAgICAgICAgICAgICAiSTxAICAgICAgICAgICAgIkooQCAgICAgICAgICAgICJKVEAgICAgICAgIAotTSAgICAiTSRAICAgICAgICAgICAgIk4gQCAgICAgICAgICAgICJPWEAgICAgICAgICAgICAgICAgICAgIAotTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISAgICAgMCAgICAoIAotTSAwIzQgICAgVSAgICAhJCAgICAgICAgICAgICAgICQgICAgICAgICAiMCAgICA0ICAgICIgICQgWiAgIAotTSAuQCAgICtUICAgICBQICAgICAgICAgJCAgICAhICAgICBcICAgICsgICAgIEAgISBdUCAgIC88ICAgJgotTUAgICAgIDAgICAgNyAgICAhICAgICEgICAgIDcgICAgIFAgICAgKCAgMEk8ICAgKjcgICAhJ0wgICAgIAotTSAgICAgICAgICAkICAgICAgICAgJ1AgICAgMCAgICAiICAkLlYgICAjTUAgICAgLCAgICAgUCAgICBYIAotTSAgICQgICAgIyAgICAiRCAgICAkICAgICBAICEjTjAgICBbRCAgICApICAgICAsICAgICsgICAgISAgIAotTSAgUCAgICBTICAgICAwICAgIDggIDBcKCAgIC8iICAgICBQICAgICAgICAgICAgICAgMCAgICAgICAgIAotTS4wICAgICQgICAgJiAgJC8lICAgI1EwICAgMTwgICAgICAgICAgICAgICAkICAgICAgICAgI1wgICAgIQotTSAgICAhQCAhJFcgICAhLVAgICAgIyAgICAgICAgICAgICAgICEgICAgICAgICAhJSAgICAgMCAgICAoIAotTSAxLiAgICAzQCAgICAiQCAgICAgICAgICAgICAgIEAgICAgICAgICAzMCAgICAkICAgICcgICgzSiAgIAotTSRaQCAgICE4ICAgICAgICAgICAgICAgJCAgICAhICAgICUoICAgICEgICAgIFAgIiUgICAgITAgICAgIAotTSMgICAgICAgICAgICAgICAhICAgICAwICAgITcgICAgIUAgICAgLCAgQTAsICAgNCMgICAgKEAgICAgJAotTSAgICAgICAgICAwICAgICggICAgOCAgICAgQCAgICAjICAoNEYgICAlKUAgICAnJCAgICAgICAgICAgIAotTSAgICggICAgICAgICAmNCAgICAiICAgICAgICAgICAgICEyOCAgICZUICAgICEgICAgIDwgICAgISAgIAotTSAhICAgICFNICAgICBQICAgICAgICAgICAgIDs6ICAgISlEICAgICAgICAgICAgICAgJCAgICAgICAgIAotTT0wICAgICwgICAgICAgICAgICAgKCAkICAgIikgICAgICAgICAgICAgICAhICAgICAgICAgKDAgICAgIwotTSAgICAgICAgICAgICAiIiogICArIyAgICAgICAgICAgICAgICAwICAgICAgICAiLSAgICAgUCAgICAgIAotTSAgICAgICBLRUAgICArKCAgICAgICAgICAgICAgICQgICAgICAgICBFUCAgICAkICAgICAgICAgICAgIAotTSskQCAgICUpICAgICAgICAgICAgICAgISAgICAgICAgICogICAgICEgICAgICAgICAgICAgIlY0ICAgIAotTTggICAgICAgICAgICAgICAhICAgICBQICAgIkwgICAgIDAgICAgICAgICAgICAgTV0gICAiLVAgICAgIAotLCAgICAgICAgICAwICAgICwKLSAKLWVuZApkaWZmIC0tZ2l0IGEvZ2RiL3R1aS9NYWtlZmlsZSBiL2dkYi90dWkvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODljNmUuLjAwMDAwMDAKLS0tIGEvZ2RiL3R1aS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUuaW4gYnkgY29uZmlndXJlLgotIyBDb3B5cmlnaHQgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1hbGw6IGxpYnR1aS5hCi0KLXNyY2Rpcj0uCi0KLVNIRUxMID0gL2Jpbi9zaAotCi1DQz1nY2MKLUNGTEFHUz0tZyAtTzIKLUFSPWFyCi1SQU5MSUI9cmFubGliCi0KLSMgSG9zdCBhbmQgdGFyZ2V0LWRlcGVuZGVudCBtYWtlZmlsZSBmcmFnbWVudHMgY29tZSBpbiBoZXJlLgotCi0jIEhvc3Q6IFN1biA0IG9yIFNwYXJjc3RhdGlvbiwgcnVubmluZyBTdW5PUyA0Ci1YREVQRklMRVM9IHNlci10Y3AubwotWE1fRklMRT0geG0tc3VuNG9zNC5oCi1OQVRfRklMRT0gbm0tc3VuNG9zNC5oCi1OQVRERVBGSUxFUz0gZm9yay1jaGlsZC5vIGluZnB0cmFjZS5vIGluZnRhcmcubyBjb3JlbG93Lm8gc3BhcmMtbmF0Lm8KLUhPU1RfSVBDPS1EQlNEX0lQQwotR0RCU0VSVkVSX0RFUEZJTEVTPSBsb3ctc3BhcmMubwotIyBTZXR0aW5nIFhNX0NMSUJTPS1scmVzb2x2IHdvdWxkIGxldCB1cyB1c2UgdGhlIEROUywgYnV0IHRoYXQgd291bGQgc2NyZXcKLSMgYW55b25lIHdobyB3YW50cyB0byB1c2UgTklTLCB3aGljaCBpbmNsdWRlcyBhdCBsZWFzdCBvbmUgQ3lnbnVzIGN1c3RvbWVyCi0jIChQUiAzNTkzKS4gIFNvIGxlYXZlIGl0IHRoaXMgd2F5IHVudGlsL3VubGVzcyB3ZSBmaW5kIGEgcmVzb2x2ZXIgd2hpY2ggY2FuCi0jIGdldCBuYW1lcyBmcm9tIGVpdGhlciBETlMgb3IgTklTIGZyb20gdGhlIHNhbWUgR0RCIGJpbmFyeS4KLQotIyBUYXJnZXQ6IFN1biA0IG9yIFNwYXJjc3RhdGlvbiwgcnVubmluZyBTdW5PUyA0Ci1UREVQRklMRVM9IHNwYXJjLXRkZXAubyBzb2xpYi5vCi1UTV9GSUxFPSB0bS1zdW40b3M0LmgKLSMgRW5kIG9mIGhvc3QgYW5kIHRhcmdldC1kZXBlbmRlbnQgbWFrZWZpbGUgZnJhZ21lbnRzCi0KLSMgV2hlcmUgaXMgb3VyICJpbmNsdWRlIiBkaXJlY3Rvcnk/ICBUeXBpY2FsbHkgJChzcmNkaXIpLy4uL2luY2x1ZGUuCi0jIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIGhlYWRlciBmaWxlIGRpcmVjdG9yeSBmb3IgdGhlIGxpYnJhcnkKLSMgcm91dGluZXMgaW4gbGliaWJlcnR5LgotSU5DTFVERV9ESVIgPSAgJChzcmNkaXIpLy4uLy4uL2luY2x1ZGUKLUlOQ0xVREVfQ0ZMQUdTID0gLUkkKElOQ0xVREVfRElSKQotCi0jIENvbmZpZ3VyZWQgYnkgdGhlIC0td2l0aC1tbWFsbG9jIG9wdGlvbiB0byBjb25maWd1cmUuCi1NTUFMTE9DID0gCi1NTUFMTE9DX0NGTEFHUyA9IAotCi0jIFdoZXJlIGlzIHRoZSBCRkQgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi9iZmQuCi1CRkRfRElSID0gLi4vLi4vYmZkCi1CRkRfU1JDID0gJChzcmNkaXIpLyQoQkZEX0RJUikKLUJGRF9DRkxBR1MgPSAtSSQoQkZEX0RJUikgLUkkKEJGRF9TUkMpCi0KLSMgV2hlcmUgaXMgdGhlIFJFQURMSU5FIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vcmVhZGxpbmUuCi1SRUFETElORV9ESVIgPSAuLi8uLi9yZWFkbGluZQotUkVBRExJTkVfU1JDID0gJChzcmNkaXIpLyQoUkVBRExJTkVfRElSKQotUkVBRExJTkVfQ0ZMQUdTID0gLUkkKFJFQURMSU5FX1NSQykKLQotIyBXaGVyZSBpcyB0aGUgSU5UTCBsaWJyYXJ5PyAgVHlwaWNhbGx5IGluIC4uL2ludGwuCi1JTlRMX0RJUiA9IC4uLy4uL2ludGwKLUlOVExfU1JDID0gJChzcmNkaXIpLyQoSU5UTF9ESVIpCi1JTlRMX0NGTEFHUyA9IC1JJChJTlRMX0RJUikgLUkkKElOVExfU1JDKQotCi0jIFdoZXJlIGlzIHRoZSBUQ0wgbGlicmFyeT8gIFR5cGljYWxseSBpbiAuLi90Y2wuCi1UQ0xfQ0ZMQUdTID0gQFRDTEhESVJACi0KLSMgV2hlcmUgaXMgdGhlIFRLIGxpYnJhcnk/ICBUeXBpY2FsbHkgaW4gLi4vdGsuCi1US19DRkxBR1MgPSBAVEtIRElSQCBAVEtfQlVJTERfSU5DTFVERVNACi0KLSMgV2hlcmUgaXMgSXRjbD8gIFR5cGljYWxseSBpbiAuLi9pdGNsLgotSVRDTF9DRkxBR1MgPSBASVRDTEhESVJACi0KLSMgV2hlcmUgaXMgVGl4PyAgVHlwaWNhbGx5IGluIC4uL3RpeC4KLVRJWF9DRkxBR1MgPSBAVElYSERJUkAKLQotWDExX0NGTEFHUyA9IEBUS19YSU5DTFVERVNACi0KLUVOQUJMRV9JREU9IEBFTkFCTEVfSURFQAotCi1HVUlfQ0ZMQUdTX1ggPSAtSSQoc3JjZGlyKS8uLi8uLi9saWJndWkvc3JjCi0KLUlERV9DRkxBR1NfWCA9IC1JJChzcmNkaXIpLy4uLy4uL2xpYmlkZXRjbC9zcmMgLUkkKHNyY2RpcikvLi4vLi4vbGliaWRlL3NyYyBcCi0gIGBpZiBbIHgiJChFTkFCTEVfSURFKSIgIT0geCBdIDsgdGhlbiBcCi0gICAgZWNobyAtRElERSAtSSQoc3JjZGlyKS8uLi8uLi9pbHUvcnVudGltZS9tYWlubG9vcDtcCi0gIGZpYAotCi1JREVfQ0ZMQUdTPSQoR1VJX0NGTEFHU19YKSAkKElERV9DRkxBR1NfWCkKLQotRU5BQkxFX0NGTEFHUz0gCi0KLSMgLUkuIGZvciBjb25maWcgZmlsZXMuCi0jIC1JJChzcmNkaXIpIGZvciBnZGIgaW50ZXJuYWwgaGVhZGVycyBhbmQgcG9zc2libHkgZm9yIGdudS1yZWdleC5oIGFsc28uCi0jIC1JJChzcmNkaXIpL2NvbmZpZyBmb3IgbW9yZSBnZW5lcmljIGNvbmZpZyBmaWxlcy4KLQotIyBJdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgeW91IHdpbGwgbmVlZCB0byBhZGQgLUkvdXNyL2luY2x1ZGUvc3lzIGlmCi0jIHlvdXIgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBmY250bC5oIGluIC91c3IvaW5jbHVkZSAod2hpY2ggaXMgd2hlcmUgaXQKLSMgc2hvdWxkIGJlIGFjY29yZGluZyB0byBQb3NpeCkuCi1ERUZTID0gLURIQVZFX0NPTkZJR19ICi1HREJfQ0ZMQUdTID0gLUkuIC1JLi4gLUkkKHNyY2RpcikgLUkkKHNyY2RpcikvLi4gLUkkKHNyY2RpcikvLi4vY29uZmlnICQoREVGUykKLQotIyBNe0gsVH1fQ0ZMQUdTLCBpZiBkZWZpbmVkLCBoYXZlIGhvc3QtIGFuZCB0YXJnZXQtZGVwZW5kZW50IENGTEFHUwotIyBmcm9tIHRoZSBjb25maWcgZGlyZWN0b3J5LgotR0xPQkFMX0NGTEFHUyA9ICQoTVRfQ0ZMQUdTKSAkKE1IX0NGTEFHUykKLSNQUk9GSUxFX0NGTEFHUyA9IC1wZwotCi0jIElOVEVSTkFMX0NGTEFHUyBpcyB0aGUgYWdncmVnYXRlIG9mIGFsbCBvdGhlciAqQ0ZMQUdTIG1hY3Jvcy4KLUlOVEVSTkFMX0NGTEFHUyA9ICQoQ0ZMQUdTKSAkKEdMT0JBTF9DRkxBR1MpICQoUFJPRklMRV9DRkxBR1MpIFwKLQkkKEdEQl9DRkxBR1MpICQoUkVBRExJTkVfQ0ZMQUdTKSAkKEJGRF9DRkxBR1MpIFwKLQkkKE1NQUxMT0NfQ0ZMQUdTKSAkKElOQ0xVREVfQ0ZMQUdTKSAkKElOVExfQ0ZMQUdTKSBcCi0JJChFTkFCTEVfQ0ZMQUdTKQotCi1IRUFERVJTID0gdHVpSU8uaCB0dWlEYXRhLmggdHVpR2VuZXJhbFdpbi5oIHR1aUxheW91dC5oIHR1aVN0YWNrLmggXAotCSAgdHVpU291cmNlLmggdHVpQ29tbWFuZC5oIHR1aVdpbi5oIHR1aURpc2Fzc2VtLmggXAotCSAgdHVpU291cmNlV2luLmggdHVpUmVncy5oIHR1aURhdGFXaW4uaAotCi1TT1VSQ0VTID0gdHVpLmMgdHVpRGF0YS5jIHR1aVNvdXJjZS5jIHR1aVN0YWNrLmMgdHVpSU8uYyBcCi0JICB0dWlHZW5lcmFsV2luLmMgdHVpTGF5b3V0LmMgdHVpV2luLmMgdHVpQ29tbWFuZC5jIFwKLQkgIHR1aURpc2Fzc2VtLmMgdHVpU291cmNlV2luLmMgdHVpUmVncy5jIHR1aURhdGFXaW4uYwotCi1PQkpFQ1RTID0gdHVpLm8gdHVpRGF0YS5vIHR1aVNvdXJjZS5vIHR1aVN0YWNrLm8gdHVpSU8ubyBcCi0JICB0dWlHZW5lcmFsV2luLm8gdHVpTGF5b3V0Lm8gdHVpV2luLm8gdHVpQ29tbWFuZC5vIFwKLQkgIHR1aURpc2Fzc2VtLm8gdHVpU291cmNlV2luLm8gdHVpUmVncy5vIHR1aURhdGFXaW4ubyBcCi0JICB0dWlJbml0Lm8KLQotCi0jIFByZXZlbnQgU3VuIG1ha2UgZnJvbSBwdXR0aW5nIGluIHRoZSBtYWNoaW5lIHR5cGUuICBTZXR0aW5nCi0jIFRBUkdFVF9BUkNIIHRvIG5vdGhpbmcgd29ya3MgZm9yIFN1bk9TIDMsIDQuMCwgYnV0IG5vdCBmb3IgNC4xLgotLmMubzoKLQkkKENDKSAtYyAkKElOVEVSTkFMX0NGTEFHUykgJDwKLS5TVUZGSVhFUzogLmNwcAotLmMuY3BwOgotCSQoQ0MpIC1FICQoSU5URVJOQUxfQ0ZMQUdTKSAkPCA+ICRACi0KLWxpYnR1aS5hOiAkKE9CSkVDVFMpCi0Jcm0gLWYgbGlidHVpLmEKLQkkKEFSKSByYyBsaWJ0dWkuYSAkKE9CSkVDVFMpCi0JJChSQU5MSUIpIGxpYnR1aS5hCi0KLXR1aS5vOiB0dWkuYyB0dWkuaCB0dWlEYXRhLmggdHVpTGF5b3V0LmggdHVpSU8uaCB0dWlSZWdzLmggdHVpV2luLmgKLXR1aUNvbW1hbmQubzogdHVpLmggdHVpRGF0YS5oIHR1aVdpbi5oIHR1aUlPLmgKLXR1aURhdGEubzogdHVpLmggdHVpRGF0YS5oCi10dWlEYXRhV2luLm86IHR1aS5oIHR1aURhdGEuaCB0dWlSZWdzLmgKLXR1aURpc2Fzc2VtLm86IHR1aS5oIHR1aURhdGEuaCB0dWlMYXlvdXQuaCB0dWlTb3VyY2VXaW4uaCB0dWlTdGFjay5oCi10dWlHZW5lcmFsV2luLm86IHR1aS5oIHR1aURhdGEuaCB0dWlHZW5lcmFsV2luLmgKLXR1aUlPLm86IHR1aS5oIHR1aURhdGEuaCB0dWlJTy5oIHR1aUNvbW1hbmQuaCB0dWlXaW4uaAotdHVpTGF5b3V0Lm86IHR1aS5oIHR1aURhdGEuaCB0dWlHZW5lcmFsV2luLmggdHVpU3RhY2suaCB0dWlSZWdzLmggXAotCXR1aURpc2Fzc2VtLmgKLXR1aVJlZ3MubzogdHVpLmggdHVpRGF0YS5oIHR1aUxheW91dC5oIHR1aVdpbi5oCi10dWlTb3VyY2UubzogdHVpLmggdHVpRGF0YS5oIHR1aVN0YWNrLmggdHVpU291cmNlV2luLmggdHVpU291cmNlLmgKLXR1aVNvdXJjZVdpbi5vOiB0dWkuaCB0dWlEYXRhLmggdHVpU3RhY2suaCB0dWlTb3VyY2VXaW4uaCB0dWlTb3VyY2UuaCBcCi0JdHVpRGlzYXNzZW0uaAotdHVpU3RhY2subzogdHVpLmggdHVpRGF0YS5oIHR1aVN0YWNrLmggdHVpU291cmNlV2luLmgKLXR1aVdpbi5vOiB0dWkuaCB0dWlEYXRhLmggdHVpR2VuZXJhbFdpbi5oIHR1aVN0YWNrLmggdHVpU291cmNlV2luLmggXAotCXR1aURhdGFXaW4uaAotCi10dWlJbml0Lm86IHR1aUluaXQuYwotdHVpSW5pdC5jOiAkKFNPVVJDRVMpCi0JQGVjaG8gTWFraW5nIHR1aUluaXQuYwotCUBybSAtZiBpbml0LmMtdG1wCi0JQGVjaG8gJy8qIERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlLiAgKi8nID5pbml0LmMtdG1wCi0JQGVjaG8gJy8qIEl0IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgTWFrZWZpbGUuCSovJz4+aW5pdC5jLXRtcAotCUBlY2hvICcjaW5jbHVkZSAiYW5zaWRlY2wuaCInID4+aW5pdC5jLXRtcAotCUBlY2hvICdleHRlcm4gdm9pZCBpbml0aWFsaXplX3R1aV9maWxlcyBQQVJBTVMgKCh2b2lkKSk7JyA+PmluaXQuYy10bXAKLQlAZWNobyAndm9pZCBpbml0aWFsaXplX3R1aV9maWxlcyBQQVJBTVMgKCh2b2lkKSkgeycgPj5pbml0LmMtdG1wCi0JQC0oIGNkICQoc3JjZGlyKSA7IGdyZXAgJ15faW5pdGlhbGl6ZV9bYS16XzAtOUEtWl0qICooJyAkKFNPVVJDRVMpICkgMj4vZGV2L251bGwgXAotCXwgc2VkIC1lICdzL14uKjovLycgLWUgJ3MvXlwoW2Etel8wLTlBLVpdKlwpLiovICB7ZXh0ZXJuIHZvaWQgXDEgUEFSQU1TICgodm9pZCkpOyBcMSAoKTt9LycgPj5pbml0LmMtdG1wCi0JQGVjaG8gJ30nID4+aW5pdC5jLXRtcAotCUBtdiBpbml0LmMtdG1wIHR1aUluaXQuYwotCi1jbGVhbjoKLQlybSAtZiAqLm8gKi5hCmRpZmYgLS1naXQgYS9nZGIvd2luZG93cy1uYXQuYyBiL2dkYi93aW5kb3dzLW5hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTE5Nzk3Li4wMDAwMDAwCi0tLSBhL2dkYi93aW5kb3dzLW5hdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1MCArMCwwIEBACi0vKiBUYXJnZXQtdmVjdG9yIG9wZXJhdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHdpbjMyIGNoaWxkIHByb2Nlc3NlcywgZm9yIEdEQi4KLSAgIENvcHlyaWdodCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlIG50aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotKi8KLQotLyogYnkgU3RldmUgQ2hhbWJlcmxhaW4sIHNhY0BjeWdudXMuY29tICovCi0KLS8qIFdlIGFzc3VtZSB3ZSdyZSBiZWluZyBidWlsdCB3aXRoIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGN5Z3dpbi4gICovCi0KLSNpbmNsdWRlICJkZWZzLmgiCi0jaW5jbHVkZSAiZnJhbWUuaCIJCS8qIHJlcXVpcmVkIGJ5IGluZmVyaW9yLmggKi8KLSNpbmNsdWRlICJpbmZlcmlvci5oIgotI2luY2x1ZGUgInRhcmdldC5oIgotI2luY2x1ZGUgIndhaXQuaCIKLSNpbmNsdWRlICJnZGJjb3JlLmgiCi0jaW5jbHVkZSAiY29tbWFuZC5oIgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgIndpbmRlZnMuaCIKLSNlbHNlIC8qIG90aGVyIFdJTjMyIGNvbXBpbGVyICovCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJidWlsZHN5bS5oIgotI2luY2x1ZGUgInN5bWZpbGUuaCIKLSNpbmNsdWRlICJvYmpmaWxlcy5oIgotI2luY2x1ZGUgImdkYl9zdHJpbmcuaCIKLSNpbmNsdWRlICJnZGJ0aHJlYWQuaCIKLSNpbmNsdWRlICJnZGJjbWQuaCIKLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotLyogVGhlIHVpJ3MgZXZlbnQgbG9vcC4gKi8KLWV4dGVybiBpbnQgKCp1aV9sb29wX2hvb2spIFBBUkFNUyAoKGludCBzaWdubykpOwotCi0vKiBJZiB3ZSdyZSBub3QgdXNpbmcgdGhlIG9sZCBDeWd3aW4gaGVhZGVyIGZpbGUgc2V0LCBkZWZpbmUgdGhlCi0gICBmb2xsb3dpbmcgd2hpY2ggbmV2ZXIgc2hvdWxkIGhhdmUgYmVlbiBpbiB0aGUgZ2VuZXJpYyBXaW4zMiBBUEkKLSAgIGhlYWRlcnMgaW4gdGhlIGZpcnN0IHBsYWNlIHNpbmNlIHRoZXkgd2VyZSBvdXIgb3duIGludmVudGlvbi4uLiAqLwotI2lmbmRlZiBfR05VX0hfV0lORE9XU19ICi0jZGVmaW5lIEZMQUdfVFJBQ0VfQklUIDB4MTAwCi0jZGVmaW5lIENPTlRFWFRfREVCVUdHRVIgKENPTlRFWFRfRlVMTCB8IENPTlRFWFRfRkxPQVRJTkdfUE9JTlQpCi0jZW5kaWYKLQotLyogVGhlIHN0cmluZyBzZW50IGJ5IGN5Z3dpbiB3aGVuIGl0IHByb2Nlc3NlcyBhIHNpZ25hbC4KLSAgIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBpbiBhIGN5Z3dpbiBpbmNsdWRlIGZpbGUuICovCi0jZGVmaW5lIENZR1dJTl9TSUdOQUxfU1RSSU5HICJjeWd3aW46IHNpZ25hbCIKLQotI2RlZmluZSBDSEVDSyh4KSAJY2hlY2sgKHgsIF9fRklMRV9fLF9fTElORV9fKQotI2RlZmluZSBERUJVR19FWEVDKHgpCWlmIChkZWJ1Z19leGVjKQkJcHJpbnRmIHgKLSNkZWZpbmUgREVCVUdfRVZFTlRTKHgpCWlmIChkZWJ1Z19ldmVudHMpCXByaW50ZiB4Ci0jZGVmaW5lIERFQlVHX01FTSh4KQlpZiAoZGVidWdfbWVtb3J5KQlwcmludGYgeAotI2RlZmluZSBERUJVR19FWENFUFQoeCkJaWYgKGRlYnVnX2V4Y2VwdGlvbnMpCXByaW50ZiB4Ci0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KLWV4dGVybiBzdHJ1Y3QgdGFyZ2V0X29wcyBjaGlsZF9vcHM7Ci0KLXN0YXRpYyB2b2lkIGNoaWxkX3N0b3AgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB3aW4zMl9jaGlsZF90aHJlYWRfYWxpdmUgUEFSQU1TICgoaW50KSk7Ci12b2lkIGNoaWxkX2tpbGxfaW5mZXJpb3IgUEFSQU1TICgodm9pZCkpOwotCi1zdGF0aWMgaW50IGxhc3Rfc2lnID0gMDsJLyogU2V0IGlmIGEgc2lnbmFsIHdhcyByZWNlaXZlZCBmcm9tIHRoZQotCQkJCSAgIGRlYnVnZ2VkIHByb2Nlc3MgKi8KLQotLyogVGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdHVyZSB1c2VkIHRvIHRyYWNrIGluZm9ybWF0aW9uIHRoYXQgaXMKLSAgIG5vdCBhdmFpbGFibGUgaW4gZ2RiJ3MgdGhyZWFkIHN0cnVjdHVyZS4gKi8KLXR5cGVkZWYgc3RydWN0IHRocmVhZF9pbmZvX3N0cnVjdAotewotICBzdHJ1Y3QgdGhyZWFkX2luZm9fc3RydWN0ICpuZXh0OwotICBEV09SRCBpZDsKLSAgSEFORExFIGg7Ci0gIGNoYXIgKm5hbWU7Ci0gIGludCBzdXNwZW5kX2NvdW50OwotICBDT05URVhUIGNvbnRleHQ7Ci19IHRocmVhZF9pbmZvOwotCi1zdGF0aWMgdGhyZWFkX2luZm8gdGhyZWFkX2hlYWQgPSB7TlVMTH07Ci0KLS8qIFRoZSBwcm9jZXNzIGFuZCB0aHJlYWQgaGFuZGxlcyBmb3IgdGhlIGFib3ZlIGNvbnRleHQuICovCi0KLXN0YXRpYyBERUJVR19FVkVOVCBjdXJyZW50X2V2ZW50OwkvKiBUaGUgY3VycmVudCBkZWJ1ZyBldmVudCBmcm9tCi0JCQkJCSAgIFdhaXRGb3JEZWJ1Z0V2ZW50ICovCi1zdGF0aWMgSEFORExFIGN1cnJlbnRfcHJvY2Vzc19oYW5kbGU7CS8qIEN1cnJlbnRseSBleGVjdXRpbmcgcHJvY2VzcyAqLwotc3RhdGljIHRocmVhZF9pbmZvICpjdXJyZW50X3RocmVhZDsJLyogSW5mbyBvbiBjdXJyZW50bHkgc2VsZWN0ZWQgdGhyZWFkICovCi1zdGF0aWMgRFdPUkQgbWFpbl90aHJlYWRfaWQ7CQkvKiBUaHJlYWQgSUQgb2YgdGhlIG1haW4gdGhyZWFkICovCi0KLS8qIENvdW50cyBvZiB0aGluZ3MuICovCi1zdGF0aWMgaW50IGV4Y2VwdGlvbl9jb3VudCA9IDA7Ci1zdGF0aWMgaW50IGV2ZW50X2NvdW50ID0gMDsKLQotLyogVXNlciBvcHRpb25zLiAqLwotc3RhdGljIGludCBuZXdfY29uc29sZSA9IDA7Ci1zdGF0aWMgaW50IG5ld19ncm91cCA9IDA7Ci1zdGF0aWMgaW50IGRlYnVnX2V4ZWMgPSAwOwkJLyogc2hvdyBleGVjdXRpb24gKi8KLXN0YXRpYyBpbnQgZGVidWdfZXZlbnRzID0gMDsJCS8qIHNob3cgZXZlbnRzIGZyb20ga2VybmVsICovCi1zdGF0aWMgaW50IGRlYnVnX21lbW9yeSA9IDA7CQkvKiBzaG93IHRhcmdldCBtZW1vcnkgYWNjZXNzZXMgKi8KLXN0YXRpYyBpbnQgZGVidWdfZXhjZXB0aW9ucyA9IDA7CS8qIHNob3cgdGFyZ2V0IGV4Y2VwdGlvbnMgKi8KLQotLyogVGhpcyB2ZWN0b3IgbWFwcyBHREIncyBpZGVhIG9mIGEgcmVnaXN0ZXIncyBudW1iZXIgaW50byBhbiBhZGRyZXNzCi0gICBpbiB0aGUgd2luMzIgZXhjZXB0aW9uIGNvbnRleHQgdmVjdG9yLgotCi0gICBJdCBhbHNvIGNvbnRhaW5zIHRoZSBiaXQgbWFzayBuZWVkZWQgdG8gbG9hZCB0aGUgcmVnaXN0ZXIgaW4gcXVlc3Rpb24uCi0KLSAgIE9uZSBkYXkgd2UgY291bGQgcmVhZCBhIHJlZywgd2UgY291bGQgaW5zcGVjdCB0aGUgY29udGV4dCB3ZQotICAgYWxyZWFkeSBoYXZlIGxvYWRlZCwgaWYgaXQgZG9lc24ndCBoYXZlIHRoZSBiaXQgc2V0IHRoYXQgd2UgbmVlZCwKLSAgIHdlIHJlYWQgdGhhdCBzZXQgb2YgcmVnaXN0ZXJzIGluIHVzaW5nIEdldFRocmVhZENvbnRleHQuICBJZiB0aGUKLSAgIGNvbnRleHQgYWxyZWFkeSBjb250YWlucyB3aGF0IHdlIG5lZWQsIHdlIGp1c3QgdW5wYWNrIGl0LiBUaGVuIHRvCi0gICB3cml0ZSBhIHJlZ2lzdGVyLCBmaXJzdCB3ZSBoYXZlIHRvIGVuc3VyZSB0aGF0IHRoZSBjb250ZXh0IGNvbnRhaW5zCi0gICB0aGUgb3RoZXIgcmVncyBvZiB0aGUgZ3JvdXAsIGFuZCB0aGVuIHdlIGNvcHkgdGhlIGluZm8gaW4gYW5kIHNldAotICAgb3V0IGJpdC4gKi8KLQotI2RlZmluZSBjb250ZXh0X29mZnNldCh4KSAoKGludCkmKCgoQ09OVEVYVCAqKU5VTEwpLT54KSkKLXN0YXRpYyBjb25zdCBpbnQgbWFwcGluZ3NbXSA9Ci17Ci0gIGNvbnRleHRfb2Zmc2V0KEVheCksCi0gIGNvbnRleHRfb2Zmc2V0KEVjeCksCi0gIGNvbnRleHRfb2Zmc2V0KEVkeCksCi0gIGNvbnRleHRfb2Zmc2V0KEVieCksCi0gIGNvbnRleHRfb2Zmc2V0KEVzcCksCi0gIGNvbnRleHRfb2Zmc2V0KEVicCksCi0gIGNvbnRleHRfb2Zmc2V0KEVzaSksCi0gIGNvbnRleHRfb2Zmc2V0KEVkaSksCi0gIGNvbnRleHRfb2Zmc2V0KEVpcCksCi0gIGNvbnRleHRfb2Zmc2V0KEVGbGFncyksCi0gIGNvbnRleHRfb2Zmc2V0KFNlZ0NzKSwKLSAgY29udGV4dF9vZmZzZXQoU2VnU3MpLAotICBjb250ZXh0X29mZnNldChTZWdEcyksCi0gIGNvbnRleHRfb2Zmc2V0KFNlZ0VzKSwKLSAgY29udGV4dF9vZmZzZXQoU2VnRnMpLAotICBjb250ZXh0X29mZnNldChTZWdHcyksCi0gIGNvbnRleHRfb2Zmc2V0KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbMCAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbMSAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbMiAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbMyAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbNCAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbNSAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbNiAqIDEwXSksCi0gIGNvbnRleHRfb2Zmc2V0KEZsb2F0U2F2ZS5SZWdpc3RlckFyZWFbNyAqIDEwXSksCi19OwotCi0vKiBUaGlzIHZlY3RvciBtYXBzIHRoZSB0YXJnZXQncyBpZGVhIG9mIGFuIGV4Y2VwdGlvbiAoZXh0cmFjdGVkCi0gICBmcm9tIHRoZSBERUJVR19FVkVOVCBzdHJ1Y3R1cmUpIHRvIEdEQidzIGlkZWEuICovCi0KLXN0cnVjdCB4bGF0ZV9leGNlcHRpb24KLSAgewotICAgIGludCB0aGVtOwotICAgIGVudW0gdGFyZ2V0X3NpZ25hbCB1czsKLSAgfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB4bGF0ZV9leGNlcHRpb24KLSAgeGxhdGVbXSA9Ci17Ci0gIHtFWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiwgVEFSR0VUX1NJR05BTF9TRUdWfSwKLSAge1NUQVRVU19TVEFDS19PVkVSRkxPVywgVEFSR0VUX1NJR05BTF9TRUdWfSwKLSAge0VYQ0VQVElPTl9CUkVBS1BPSU5ULCBUQVJHRVRfU0lHTkFMX1RSQVB9LAotICB7REJHX0NPTlRST0xfQywgVEFSR0VUX1NJR05BTF9JTlR9LAotICB7RVhDRVBUSU9OX1NJTkdMRV9TVEVQLCBUQVJHRVRfU0lHTkFMX1RSQVB9LAotICB7LTEsIC0xfX07Ci0KLS8qIEZpbmQgYSB0aHJlYWQgcmVjb3JkIGdpdmVuIGEgdGhyZWFkIGlkLgotICAgSWYgZ2V0X2NvbnRleHQgdGhlbiBhbHNvIHJldHJpZXZlIHRoZSBjb250ZXh0IGZvciB0aGlzCi0gICB0aHJlYWQuICovCi1zdGF0aWMgdGhyZWFkX2luZm8gKgotdGhyZWFkX3JlYyAoRFdPUkQgaWQsIGludCBnZXRfY29udGV4dCkKLXsKLSAgdGhyZWFkX2luZm8gKnRoOwotCi0gIGZvciAodGggPSAmdGhyZWFkX2hlYWQ7ICh0aCA9IHRoLT5uZXh0KSAhPSBOVUxMOyApCi0gICAgaWYgKHRoLT5pZCA9PSBpZCkKLSAgICAgIHsKLQlpZiAoIXRoLT5zdXNwZW5kX2NvdW50ICYmIGdldF9jb250ZXh0KQotCSAgewotCSAgICBpZiAoZ2V0X2NvbnRleHQgPiAwKQotCSAgICAgIHRoLT5zdXNwZW5kX2NvdW50ID0gU3VzcGVuZFRocmVhZCAodGgtPmgpICsgMTsKLQkgICAgZWxzZSBpZiAoZ2V0X2NvbnRleHQgPCAwKQotCSAgICAgIHRoLT5zdXNwZW5kX2NvdW50ID0gLTE7Ci0KLQkgICAgdGgtPmNvbnRleHQuQ29udGV4dEZsYWdzID0gQ09OVEVYVF9ERUJVR0dFUjsKLQkgICAgR2V0VGhyZWFkQ29udGV4dCAodGgtPmgsICZ0aC0+Y29udGV4dCk7Ci0JICB9Ci0JcmV0dXJuIHRoOwotICAgICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBBZGQgYSB0aHJlYWQgdG8gdGhlIHRocmVhZCBsaXN0ICovCi1zdGF0aWMgdGhyZWFkX2luZm8gKgotY2hpbGRfYWRkX3RocmVhZChEV09SRCBpZCwgSEFORExFIGgpCi17Ci0gIHRocmVhZF9pbmZvICp0aDsKLQotICBpZiAoKHRoID0gdGhyZWFkX3JlYyAoaWQsIEZBTFNFKSkpCi0gICAgcmV0dXJuIHRoOwotCi0gIHRoID0gKHRocmVhZF9pbmZvICopIHhtYWxsb2MgKHNpemVvZiAoKnRoKSk7Ci0gIG1lbXNldCh0aCwgMCwgc2l6ZW9mICgqdGgpKTsKLSAgdGgtPmlkID0gaWQ7Ci0gIHRoLT5oID0gaDsKLSAgdGgtPm5leHQgPSB0aHJlYWRfaGVhZC5uZXh0OwotICB0aHJlYWRfaGVhZC5uZXh0ID0gdGg7Ci0gIGFkZF90aHJlYWQgKGlkKTsKLSAgcmV0dXJuIHRoOwotfQotCi0vKiBDbGVhciBvdXQgYW55IG9sZCB0aHJlYWQgbGlzdCBhbmQgcmVpbnRpYWxpemUgaXQgdG8gYQotICAgcHJpc3RpbmUgc3RhdGUuICovCi1zdGF0aWMgdm9pZAotY2hpbGRfaW5pdF90aHJlYWRfbGlzdCAoKQotewotICB0aHJlYWRfaW5mbyAqdGggPSAmdGhyZWFkX2hlYWQ7Ci0KLSAgREVCVUdfRVZFTlRTICgoImdkYjogY2hpbGRfaW5pdF90aHJlYWRfbGlzdFxuIikpOwotICBpbml0X3RocmVhZF9saXN0ICgpOwotICB3aGlsZSAodGgtPm5leHQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICB0aHJlYWRfaW5mbyAqaGVyZSA9IHRoLT5uZXh0OwotICAgICAgdGgtPm5leHQgPSBoZXJlLT5uZXh0OwotICAgICAgKHZvaWQpIENsb3NlSGFuZGxlIChoZXJlLT5oKTsKLSAgICAgIGZyZWUgKGhlcmUpOwotICAgIH0KLX0KLQotLyogRGVsZXRlIGEgdGhyZWFkIGZyb20gdGhlIGxpc3Qgb2YgdGhyZWFkcyAqLwotc3RhdGljIHZvaWQKLWNoaWxkX2RlbGV0ZV90aHJlYWQgKERXT1JEIGlkKQotewotICB0aHJlYWRfaW5mbyAqdGg7Ci0KLSAgaWYgKGluZm9fdmVyYm9zZSkKLSAgICBwcmludGZfdW5maWx0ZXJlZCAoIltEZWxldGluZyAlc11cbiIsIHRhcmdldF9waWRfdG9fc3RyIChpZCkpOwotICBkZWxldGVfdGhyZWFkIChpZCk7Ci0KLSAgZm9yICh0aCA9ICZ0aHJlYWRfaGVhZDsKLSAgICAgICB0aC0+bmV4dCAhPSBOVUxMICYmIHRoLT5uZXh0LT5pZCAhPSBpZDsKLSAgICAgICB0aCA9IHRoLT5uZXh0KQotICAgIGNvbnRpbnVlOwotCi0gIGlmICh0aC0+bmV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHRocmVhZF9pbmZvICpoZXJlID0gdGgtPm5leHQ7Ci0gICAgICB0aC0+bmV4dCA9IGhlcmUtPm5leHQ7Ci0gICAgICBDbG9zZUhhbmRsZSAoaGVyZS0+aCk7Ci0gICAgICBmcmVlIChoZXJlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1jaGVjayAoQk9PTCBvaywgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGlmICghb2spCi0gICAgcHJpbnRmX2ZpbHRlcmVkICgiZXJyb3IgcmV0dXJuICVzOiVkIHdhcyAlZFxuIiwgZmlsZSwgbGluZSwgR2V0TGFzdEVycm9yICgpKTsKLX0KLQotc3RhdGljIHZvaWQKLWRvX2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCi17Ci0gIGlmIChyID49IDApCi0gICAgc3VwcGx5X3JlZ2lzdGVyIChyLCAoKGNoYXIgKikgJmN1cnJlbnRfdGhyZWFkLT5jb250ZXh0KSArIG1hcHBpbmdzW3JdKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGZvciAociA9IDA7IHIgPCBOVU1fUkVHUzsgcisrKQotCWRvX2NoaWxkX2ZldGNoX2luZmVyaW9yX3JlZ2lzdGVycyAocik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikKLXsKLSAgY3VycmVudF90aHJlYWQgPSB0aHJlYWRfcmVjIChpbmZlcmlvcl9waWQsIFRSVUUpOwotICBkb19jaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOwotfQotCi1zdGF0aWMgdm9pZAotZG9fY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChpbnQgcikKLXsKLSAgaWYgKHIgPj0gMCkKLSAgICByZWFkX3JlZ2lzdGVyX2dlbiAociwgKChjaGFyICopICZjdXJyZW50X3RocmVhZC0+Y29udGV4dCkgKyBtYXBwaW5nc1tyXSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3IgKHIgPSAwOyByIDwgTlVNX1JFR1M7IHIrKykKLQlkb19jaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnMgKHIpOwotICAgIH0KLX0KLQotLyogU3RvcmUgYSBuZXcgcmVnaXN0ZXIgdmFsdWUgaW50byB0aGUgY3VycmVudCB0aHJlYWQgY29udGV4dCAqLwotc3RhdGljIHZvaWQKLWNoaWxkX3N0b3JlX2luZmVyaW9yX3JlZ2lzdGVycyAoaW50IHIpCi17Ci0gIGN1cnJlbnRfdGhyZWFkID0gdGhyZWFkX3JlYyAoaW5mZXJpb3JfcGlkLCBUUlVFKTsKLSAgZG9fY2hpbGRfc3RvcmVfaW5mZXJpb3JfcmVnaXN0ZXJzIChyKTsKLX0KLQotLyogV2FpdCBmb3IgY2hpbGQgdG8gZG8gc29tZXRoaW5nLiAgUmV0dXJuIHBpZCBvZiBjaGlsZCwgb3IgLTEgaW4gY2FzZQotICAgb2YgZXJyb3I7IHN0b3JlIHN0YXR1cyB0aHJvdWdoIGFyZ3VtZW50IHBvaW50ZXIgT1VSU1RBVFVTLiAgKi8KLQotc3RhdGljIGludAotaGFuZGxlX2xvYWRfZGxsIChQVFIgZHVtbXkpCi17Ci0gIExPQURfRExMX0RFQlVHX0lORk8gKiBldmVudCA9ICZjdXJyZW50X2V2ZW50LnUuTG9hZERsbDsKLSAgRFdPUkQgZGxsX25hbWVfcHRyOwotICBEV09SRCBkb25lOwotICBjaGFyIGRsbF9idWZbTUFYX1BBVEggKyAxXTsKLSAgY2hhciAqcCwgKmRsbF9uYW1lID0gTlVMTCwgKmRsbF9iYXNlbmFtZTsKLSAgc3RydWN0IG9iamZpbGUgKm9iamZpbGU7Ci0gIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtaW5mbzsKLQotICBkbGxfYnVmWzBdID0gZGxsX2J1ZltzaXplb2YoZGxsX2J1ZikgLSAxXSA9ICdcMCc7Ci0KLSAgLyogVGhlIGZvbGxvd2luZyBjb2RlIGF0dGVtcHRzIHRvIGZpbmQgdGhlIG5hbWUgb2YgdGhlIGRsbCBieSByZWFkaW5nIHRoZQotICAgICBuYW1lIGZyb20gdGhlIHByb2Nlc3NlcyBtZW1vcnkuICBVbmZvcnR1bmF0ZWx5IGl0IGRvZXNuJ3Qgd29yayByaWdodC4KLSAgICAgRG9pbmcgdGhpcyB0aGUgInJpZ2h0IHdheSIgZm9yIFdpbmRvd3MgaXMgdmVyeSBkaWZmaWN1bHQuICBGSVhNRSAqLwotI2lmZGVmIERPRVNOVF9XT1JLCi0gIG1lbXNldCAoJm1pbmZvLCAwLCBzaXplb2YgbWluZm8pOwotICBpZiAoVmlydHVhbFF1ZXJ5RXggKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsIChMUENWT0lEKSBldmVudC0+bHBCYXNlT2ZEbGwsCi0JCSAgICAgICZtaW5mbywgc2l6ZW9mKG1pbmZvKSkgJiYgbWluZm8uQmFzZUFkZHJlc3MpIHsKLSAgICAgIERXT1JEIGxlbjsKLSAgICAgIElNQUdFX0RPU19IRUFERVIgKmhtbTAgPSAoSU1BR0VfRE9TX0hFQURFUiAqKSBtaW5mby5CYXNlQWRkcmVzczsKLSAgICAgIEhNT0RVTEUgaG1tID0gKEhNT0RVTEUpICgoKERXT1JEKSBobW0wKSArIGhtbTAtPmVfbGZhbmV3KTsKLQotICAgICAgaWYgKChsZW4gPSBHZXRNb2R1bGVGaWxlTmFtZSAoaG1tLCBkbGxfYnVmLCBNQVhfUEFUSCkpKQotCXsKLQkgIGRsbF9uYW1lID0gZGxsX2J1ZjsKLQkgIGRsbF9uYW1lW2xlbl0gPSAnXDAnOwotCX0KLSAgfQotI2VuZGlmCi0KLSAgLyogQXR0ZW1wdCB0byByZWFkIHRoZSBuYW1lIG9mIHRoZSBkbGwgdGhhdCB3YXMgZGV0ZWN0ZWQuCi0gICAgIFRoaXMgaXMgZG9jdW1lbnRlZCB0byB3b3JrIG9ubHkgd2hlbiBhY3RpdmVseSBkZWJ1Z2dpbmcKLSAgICAgYSBwcm9ncmFtLiAgSXQgd2lsbCBub3Qgd29yayBmb3IgYXR0YWNoZWQgcHJvY2Vzc2VzLiAqLwotICBpZiAoZGxsX25hbWUgPT0gTlVMTCB8fCAqZGxsX25hbWUgPT0gJ1wwJykKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IGV2ZW50LT5mVW5pY29kZSA/IHNpemVvZiAoV0NIQVIpIDogc2l6ZW9mIChjaGFyKTsKLSAgICAgIGludCBsZW4gPSAwOwotICAgICAgY2hhciBiWzJdOwotCi0gICAgICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCSAoTFBDVk9JRCkgZXZlbnQtPmxwSW1hZ2VOYW1lLAotCQkJIChjaGFyICopICZkbGxfbmFtZV9wdHIsCi0JCQkgc2l6ZW9mIChkbGxfbmFtZV9wdHIpLCAmZG9uZSk7Ci0KLSAgICAgIC8qIFNlZSBpZiB3ZSBjb3VsZCByZWFkIHRoZSBhZGRyZXNzIG9mIGEgc3RyaW5nLCBhbmQgdGhhdCB0aGUKLQkgYWRkcmVzcyBpc24ndCBudWxsLiAqLwotCi0gICAgICBpZiAoZG9uZSAhPSBzaXplb2YgKGRsbF9uYW1lX3B0cikgfHwgIWRsbF9uYW1lX3B0cikKLQlyZXR1cm4gMTsKLQotICAgICAgZG8KLQl7Ci0JICBSZWFkUHJvY2Vzc01lbW9yeSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSwKLQkJCSAgICAgKExQQ1ZPSUQpIChkbGxfbmFtZV9wdHIgKyBsZW4gKiBzaXplKSwKLQkJCSAgICAgJmIsCi0JCQkgICAgIHNpemUsCi0JCQkgICAgICZkb25lKTsKLQkgIGxlbisrOwotCX0KLSAgICAgIHdoaWxlICgoYlswXSAhPSAwIHx8IGJbc2l6ZSAtIDFdICE9IDApICYmIGRvbmUgPT0gc2l6ZSk7Ci0KLSAgICAgIGRsbF9uYW1lID0gYWxsb2NhIChsZW4pOwotCi0gICAgICBpZiAoZXZlbnQtPmZVbmljb2RlKQotCXsKLQkgIFdDSEFSICp1bmljb2RlX2RsbF9uYW1lID0gKFdDSEFSICopIGFsbG9jYSAobGVuICogc2l6ZW9mIChXQ0hBUikpOwotCSAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsCi0JCQkgICAgIChMUENWT0lEKSBkbGxfbmFtZV9wdHIsCi0JCQkgICAgIHVuaWNvZGVfZGxsX25hbWUsCi0JCQkgICAgIGxlbiAqIHNpemVvZiAoV0NIQVIpLAotCQkJICAgICAmZG9uZSk7Ci0KLQkgIFdpZGVDaGFyVG9NdWx0aUJ5dGUgKENQX0FDUCwgMCwKLQkJCSAgICAgICB1bmljb2RlX2RsbF9uYW1lLCBsZW4sCi0JCQkgICAgICAgZGxsX25hbWUsIGxlbiwgMCwgMCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIFJlYWRQcm9jZXNzTWVtb3J5IChjdXJyZW50X3Byb2Nlc3NfaGFuZGxlLAotCQkJICAgICAoTFBDVk9JRCkgZGxsX25hbWVfcHRyLAotCQkJICAgICBkbGxfbmFtZSwKLQkJCSAgICAgbGVuLAotCQkJICAgICAmZG9uZSk7Ci0JfQotICAgIH0KLQotICBpZiAoIWRsbF9uYW1lKQotICAgIHJldHVybiAxOwotCi0gIHdoaWxlICgocCA9IHN0cmNociAoZGxsX25hbWUsICdcXCcpKSkKLSAgICAqcCA9ICcvJzsKLQotICAvKiBGSVhNRSEhIEl0IHdvdWxkIGJlIG5pY2UgdG8gZGVmaW5lIG9uZSBzeW1ib2wgd2hpY2ggcG9pbnRlZCB0byB0aGUKLSAgICAgZnJvbnQgb2YgdGhlIGRsbCBpZiB3ZSBjYW4ndCBmaW5kIGFueSBzeW1ib2xzLiAqLwotCi0gIGlmICghKGRsbF9iYXNlbmFtZSA9IHN0cnJjaHIoZGxsX25hbWUsICcvJykpKQotICAgIGRsbF9iYXNlbmFtZSA9IGRsbF9uYW1lOwotICBlbHNlCi0gICAgZGxsX2Jhc2VuYW1lKys7Ci0KLSAgQUxMX09CSkZJTEVTKG9iamZpbGUpCi0gICAgewotICAgICAgY2hhciAqb2JqZmlsZV9iYXNlbmFtZTsKLSAgICAgIG9iamZpbGVfYmFzZW5hbWUgPSBzdHJyY2hyKG9iamZpbGUtPm5hbWUsICcvJyk7Ci0KLSAgICAgIGlmIChvYmpmaWxlX2Jhc2VuYW1lICYmCi0JICBzdHJjbXAoZGxsX2Jhc2VuYW1lLCBvYmpmaWxlX2Jhc2VuYW1lICsgMSkgPT0gMCkKLQl7Ci0JICBwcmludGZfdW5maWx0ZXJlZCAoIiV4OiVzIChzeW1ib2xzIHByZXZpb3VzbHkgbG9hZGVkKVxuIiwKLQkJCSAgICAgZXZlbnQtPmxwQmFzZU9mRGxsLCBkbGxfbmFtZSk7Ci0JICBnb3RvIG91dDsKLQl9Ci0gIH0KLQotICAvKiBUaGUgc3ltYm9scyBpbiBhIGRsbCBhcmUgb2Zmc2V0IGJ5IDB4MTAwMCwgd2hpY2ggaXMgdGhlCi0gICAgIHRoZSBvZmZzZXQgZnJvbSAwIG9mIHRoZSBmaXJzdCBieXRlIGluIGFuIGltYWdlIC0gYmVjYXVzZQotICAgICBvZiB0aGUgZmlsZSBoZWFkZXIgYW5kIHRoZSBzZWN0aW9uIGFsaWdubWVudC4KLQotICAgICBGSVhNRTogSXMgdGhpcyB0aGUgcmVhbCByZWFzb24gdGhhdCB3ZSBuZWVkIHRoZSAweDEwMDAgPyAqLwotCi0gIHByaW50Zl91bmZpbHRlcmVkICgiJXg6JXMiLCBldmVudC0+bHBCYXNlT2ZEbGwsIGRsbF9uYW1lKTsKLSAgc3ltYm9sX2ZpbGVfYWRkIChkbGxfbmFtZSwgMCwgKGludCkgZXZlbnQtPmxwQmFzZU9mRGxsICsgMHgxMDAwLCAwLCAwLCAwLCAwLCAxKTsKLSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcbiIpOwotCi1vdXQ6Ci0gIHJldHVybiAxOwotfQotCi0vKiBIYW5kbGUgREVCVUdfU1RSSU5HIG91dHB1dCBmcm9tIGNoaWxkIHByb2Nlc3MuCi0gICBDeWd3aW4gcHJlcGVuZHMgaXRzIG1lc3NhZ2VzIHdpdGggYSAiY3lnd2luOiIuICBJbnRlcnByZXQgdGhpcyBhcwotICAgYSBDeWd3aW4gc2lnbmFsLiAgT3RoZXJ3aXNlIGp1c3QgcHJpbnQgdGhlIHN0cmluZyBhcyBhIHdhcm5pbmcuICovCi1zdGF0aWMgaW50Ci1oYW5kbGVfb3V0cHV0X2RlYnVnX3N0cmluZyAoc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCi17Ci0gIGNoYXIgKnM7Ci0gIGludCBnb3Rhc2lnID0gRkFMU0U7Ci0KLSAgaWYgKCF0YXJnZXRfcmVhZF9zdHJpbmcKLSAgICAgICgoQ09SRV9BRERSKSBjdXJyZW50X2V2ZW50LnUuRGVidWdTdHJpbmcubHBEZWJ1Z1N0cmluZ0RhdGEsICZzLCAxMDI0LCAwKQotICAgICAgfHwgIXMgfHwgISpzKQotICAgIHJldHVybiBnb3Rhc2lnOwotCi0gIGlmIChzdHJuY21wKHMsIENZR1dJTl9TSUdOQUxfU1RSSU5HLCBzaXplb2YoQ1lHV0lOX1NJR05BTF9TVFJJTkcpIC0gMSkpCi0gICAgewotICAgICAgd2FybmluZyAocyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqcDsKLSAgICAgIC8qbGFzdF9zaWcgPSAqL3N0cnRvbChzICsgc2l6ZW9mKENZR1dJTl9TSUdOQUxfU1RSSU5HKSAtIDEsICZwLCAwKTsKLSAgICAgIGdvdGFzaWcgPSB0YXJnZXRfc2lnbmFsX2Zyb21faG9zdCAobGFzdF9zaWcpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBnb3Rhc2lnOwotICAgICAgaWYgKGdvdGFzaWcpCi0Jb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX1NUT1BQRUQ7Ci0gICAgfQotCi0gIGZyZWUgKHMpOwotICByZXR1cm4gZ290YXNpZzsKLX0KLQotc3RhdGljIGludAotaGFuZGxlX2V4Y2VwdGlvbiAoc3RydWN0IHRhcmdldF93YWl0c3RhdHVzICpvdXJzdGF0dXMpCi17Ci0gIGludCBpOwotICBpbnQgZG9uZSA9IDA7Ci0gIHRocmVhZF9pbmZvICp0aDsKLQotICBvdXJzdGF0dXMtPmtpbmQgPSBUQVJHRVRfV0FJVEtJTkRfU1RPUFBFRDsKLQotICAvKiBSZWNvcmQgdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgdGhyZWFkICovCi0gIHRoID0gdGhyZWFkX3JlYyAoY3VycmVudF9ldmVudC5kd1RocmVhZElkLCAtMSk7Ci0KLSAgc3dpdGNoIChjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25Db2RlKQotICAgIHsKLSAgICBjYXNlIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBBQ0NFU1NfVklPTEFUSU9OIGF0IDB4JTA4eFxuIiwKLQkJICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfU0VHVjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RBVFVTX1NUQUNLX09WRVJGTE9XOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBTVEFDS19PVkVSRkxPVyBhdCAweCUwOHhcbiIsCi0JCSAgICAgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQWRkcmVzcykpOwotICAgICAgb3Vyc3RhdHVzLT52YWx1ZS5zaWcgPSBUQVJHRVRfU0lHTkFMX1NFR1Y7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEVYQ0VQVElPTl9CUkVBS1BPSU5UOgotICAgICAgREVCVUdfRVhDRVBUICgoImdkYjogVGFyZ2V0IGV4Y2VwdGlvbiBCUkVBS1BPSU5UIGF0IDB4JTA4eFxuIiwKLQkJICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREJHX0NPTlRST0xfQzoKLSAgICAgIERFQlVHX0VYQ0VQVCAoKCJnZGI6IFRhcmdldCBleGNlcHRpb24gQ09OVFJPTF9DIGF0IDB4JTA4eFxuIiwKLQkJICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfSU5UOwotICAgICAgLyogVXNlciB0eXBlZCBDVFJMLUMuICBDb250aW51ZSB3aXRoIHRoaXMgc3RhdHVzICovCi0gICAgICBsYXN0X3NpZyA9IFNJR0lOVDsJLyogRklYTUUgLSBzaG91bGQgY2hlY2sgcGFzcyBzdGF0ZSAqLwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBFWENFUFRJT05fU0lOR0xFX1NURVA6Ci0gICAgICBERUJVR19FWENFUFQgKCgiZ2RiOiBUYXJnZXQgZXhjZXB0aW9uIFNJTkdMRV9TVEVQIGF0IDB4JTA4eFxuIiwKLQkJICAgICBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKSk7Ci0gICAgICBvdXJzdGF0dXMtPnZhbHVlLnNpZyA9IFRBUkdFVF9TSUdOQUxfVFJBUDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGlzIG1heSBiZSBhIHN0cnVjdHVyZWQgZXhjZXB0aW9uIGhhbmRsaW5nIGV4Y2VwdGlvbi4gIEluCi0JIHRoYXQgY2FzZSwgd2Ugd2FudCB0byBsZXQgdGhlIHByb2dyYW0gdHJ5IHRvIGhhbmRsZSBpdCwgYW5kCi0JIG9ubHkgYnJlYWsgaWYgd2Ugc2VlIHRoZSBleGNlcHRpb24gYSBzZWNvbmQgdGltZS4gICovCi0gICAgICBpZiAoY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5kd0ZpcnN0Q2hhbmNlKQotCXJldHVybiAwOwotCi0gICAgICBwcmludGZfdW5maWx0ZXJlZCAoImdkYjogdW5rbm93biB0YXJnZXQgZXhjZXB0aW9uIDB4JTA4eCBhdCAweCUwOHhcbiIsCi0JCQkgY3VycmVudF9ldmVudC51LkV4Y2VwdGlvbi5FeGNlcHRpb25SZWNvcmQuRXhjZXB0aW9uQ29kZSwKLQkJCSBjdXJyZW50X2V2ZW50LnUuRXhjZXB0aW9uLkV4Y2VwdGlvblJlY29yZC5FeGNlcHRpb25BZGRyZXNzKTsKLSAgICAgIG91cnN0YXR1cy0+dmFsdWUuc2lnID0gVEFSR0VUX1NJR05BTF9VTktOT1dOOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBleGNlcHRpb25fY291bnQrKzsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFJlc3VtZSBhbGwgYXJ0aWZpY2lhbGx5IHN1c3BlbmRlZCB0aHJlYWRzIGlmIHdlIGFyZSBjb250aW51aW5nCi0gICBleGVjdXRpb24gKi8KLXN0YXRpYyBCT09MCi1jaGlsZF9jb250aW51ZSAoRFdPUkQgY29udGludWVfc3RhdHVzLCBpbnQgaWQpCi17Ci0gIGludCBpOwotICB0aHJlYWRfaW5mbyAqdGg7Ci0gIEJPT0wgcmVzOwotCi0gIERFQlVHX0VWRU5UUyAoKCJDb250aW51ZURlYnVnRXZlbnQgKGNwaWQ9JWQsIGN0aWQ9JWQsIERCR19DT05USU5VRSk7XG4iLAotCQkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkKSk7Ci0gIHJlcyA9IENvbnRpbnVlRGVidWdFdmVudCAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJCSAgICBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgY29udGludWVfc3RhdHVzKTsKLSAgaWYgKHJlcykKLSAgICBmb3IgKHRoID0gJnRocmVhZF9oZWFkOyAodGggPSB0aC0+bmV4dCkgIT0gTlVMTDsgKQotICAgICAgaWYgKCgoaWQgPT0gLTEpIHx8IChpZCA9PSB0aC0+aWQpKSAmJiB0aC0+c3VzcGVuZF9jb3VudCkKLQl7Ci0JICBmb3IgKGkgPSAwOyBpIDwgdGgtPnN1c3BlbmRfY291bnQ7IGkrKykKLQkgICAgKHZvaWQpIFJlc3VtZVRocmVhZCAodGgtPmgpOwotCSAgdGgtPnN1c3BlbmRfY291bnQgPSAwOwotCX0KLQotICByZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50Ci1jaGlsZF93YWl0IChpbnQgcGlkLCBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgKm91cnN0YXR1cykKLXsKLSAgLyogV2UgbG9vcCB3aGVuIHdlIGdldCBhIG5vbi1zdGFuZGFyZCBleGNlcHRpb24gcmF0aGVyIHRoYW4gcmV0dXJuCi0gICAgIHdpdGggYSBTUFVSSU9VUyBiZWNhdXNlIHJlc3VtZSBjYW4gdHJ5IGFuZCBzdGVwIG9yIG1vZGlmeSB0aGluZ3MsCi0gICAgIHdoaWNoIG5lZWRzIGEgY3VycmVudF90aHJlYWQtPmguICBCdXQgc29tZSBvZiB0aGVzZSBleGNlcHRpb25zIG1hcmsKLSAgICAgdGhlIGJpcnRoIG9yIGRlYXRoIG9mIHRocmVhZHMsIHdoaWNoIG1lYW4gdGhhdCB0aGUgY3VycmVudCB0aHJlYWQKLSAgICAgaXNuJ3QgbmVjZXNzYXJpbHkgd2hhdCB5b3UgdGhpbmsgaXQgaXMuICovCi0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgRFdPUkQgY29udGludWVfc3RhdHVzOwotICAgICAgQk9PTCBkZWJ1Z19ldmVudCA9IFdhaXRGb3JEZWJ1Z0V2ZW50ICgmY3VycmVudF9ldmVudCwgMjApOwotICAgICAgY2hhciAqcDsKLSAgICAgIHRocmVhZF9pbmZvICp0aDsKLSAgICAgIGludCBzaWc7Ci0KLSAgICAgIGlmIChkZWJ1Z19ldmVudCkKLQl7Ci0JICBldmVudF9jb3VudCsrOwotCi0JICBjb250aW51ZV9zdGF0dXMgPSBEQkdfQ09OVElOVUU7Ci0KLQkgIHN3aXRjaCAoY3VycmVudF9ldmVudC5kd0RlYnVnRXZlbnRDb2RlKQotCSAgICB7Ci0JICAgIGNhc2UgQ1JFQVRFX1RIUkVBRF9ERUJVR19FVkVOVDoKLQkgICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JXggY29kZT0lcylcbiIsCi0JCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICAgIkNSRUFURV9USFJFQURfREVCVUdfRVZFTlQiKSk7Ci0JICAgICAgLyogUmVjb3JkIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyB0aHJlYWQgKi8KLQkgICAgICBjaGlsZF9hZGRfdGhyZWFkIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkJY3VycmVudF9ldmVudC51LkNyZWF0ZVRocmVhZC5oVGhyZWFkKTsKLQkgICAgICBpZiAoaW5mb192ZXJib3NlKQotCQlwcmludGZfdW5maWx0ZXJlZCAoIltOZXcgJXNdXG4iLAotCQkJCSAgIHRhcmdldF9waWRfdG9fc3RyIChjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIEVYSVRfVEhSRUFEX0RFQlVHX0VWRU5UOgotCSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgICAiRVhJVF9USFJFQURfREVCVUdfRVZFTlQiKSk7Ci0JICAgICAgY2hpbGRfZGVsZXRlX3RocmVhZCAoY3VycmVudF9ldmVudC5kd1RocmVhZElkKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIENSRUFURV9QUk9DRVNTX0RFQlVHX0VWRU5UOgotCSAgICAgIERFQlVHX0VWRU5UUyAoKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZCBjb2RlPSVzKVxuIiwKLQkJCSAgICAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwgY3VycmVudF9ldmVudC5kd1RocmVhZElkLAotCQkJICAgICAiQ1JFQVRFX1BST0NFU1NfREVCVUdfRVZFTlQiKSk7Ci0JICAgICAgY3VycmVudF9wcm9jZXNzX2hhbmRsZSA9IGN1cnJlbnRfZXZlbnQudS5DcmVhdGVQcm9jZXNzSW5mby5oUHJvY2VzczsKLQotCSAgICAgIG1haW5fdGhyZWFkX2lkID0gaW5mZXJpb3JfcGlkID0gY3VycmVudF9ldmVudC5kd1RocmVhZElkOwotCSAgICAgIC8qIEFkZCB0aGUgbWFpbiB0aHJlYWQgKi8KLQkgICAgICBjdXJyZW50X3RocmVhZCA9IGNoaWxkX2FkZF90aHJlYWQgKGluZmVyaW9yX3BpZCwKLQkJCQkJCSBjdXJyZW50X2V2ZW50LnUuQ3JlYXRlUHJvY2Vzc0luZm8uaFRocmVhZCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBFWElUX1BST0NFU1NfREVCVUdfRVZFTlQ6Ci0JICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkJICAgICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgICJFWElUX1BST0NFU1NfREVCVUdfRVZFTlQiKSk7Ci0JICAgICAgb3Vyc3RhdHVzLT5raW5kID0gVEFSR0VUX1dBSVRLSU5EX0VYSVRFRDsKLQkgICAgICBvdXJzdGF0dXMtPnZhbHVlLmludGVnZXIgPSBjdXJyZW50X2V2ZW50LnUuRXhpdFByb2Nlc3MuZHdFeGl0Q29kZTsKLQkgICAgICBDbG9zZUhhbmRsZSAoY3VycmVudF9wcm9jZXNzX2hhbmRsZSk7Ci0JICAgICAgcmV0dXJuIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQ7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBMT0FEX0RMTF9ERUJVR19FVkVOVDoKLQkgICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICAgIkxPQURfRExMX0RFQlVHX0VWRU5UIikpOwotCSAgICAgIGNhdGNoX2Vycm9ycyAoaGFuZGxlX2xvYWRfZGxsLCBOVUxMLCAiIiwgUkVUVVJOX01BU0tfQUxMKTsKLQkgICAgICByZWdpc3RlcnNfY2hhbmdlZCgpOyAgICAgICAgICAvKiBtYXJrIGFsbCByZWdzIGludmFsaWQgKi8KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFVOTE9BRF9ETExfREVCVUdfRVZFTlQ6Ci0JICAgICAgREVCVUdfRVZFTlRTICgoImdkYjoga2VybmVsIGV2ZW50IGZvciBwaWQ9JWQgdGlkPSVkIGNvZGU9JXMpXG4iLAotCQkJICAgICBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBjdXJyZW50X2V2ZW50LmR3VGhyZWFkSWQsCi0JCQkgICAgICJVTkxPQURfRExMX0RFQlVHX0VWRU5UIikpOwotCSAgICAgIGJyZWFrOwkvKiBGSVhNRTogZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUgKi8KLQotCSAgICBjYXNlIEVYQ0VQVElPTl9ERUJVR19FVkVOVDoKLQkgICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICAgIkVYQ0VQVElPTl9ERUJVR19FVkVOVCIpKTsKLQkgICAgICBpZiAoaGFuZGxlX2V4Y2VwdGlvbiAob3Vyc3RhdHVzKSkKLQkJcmV0dXJuIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZDsKLQkgICAgICBjb250aW51ZV9zdGF0dXMgPSBEQkdfRVhDRVBUSU9OX05PVF9IQU5ETEVEOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgT1VUUFVUX0RFQlVHX1NUUklOR19FVkVOVDogLyogbWVzc2FnZSBmcm9tIHRoZSBrZXJuZWwgKi8KLQkgICAgICBERUJVR19FVkVOVFMgKCgiZ2RiOiBrZXJuZWwgZXZlbnQgZm9yIHBpZD0lZCB0aWQ9JWQgY29kZT0lcylcbiIsCi0JCQkgICAgIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQsIGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwKLQkJCSAgICAgIk9VVFBVVF9ERUJVR19TVFJJTkdfRVZFTlQiKSk7Ci0JICAgICAgaWYgKGhhbmRsZV9vdXRwdXRfZGVidWdfc3RyaW5nIChvdXJzdGF0dXMpKQotCQlyZXR1cm4gbWFpbl90aHJlYWRfaWQ7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJnZGI6IGtlcm5lbCBldmVudCBmb3IgcGlkPSVkIHRpZD0lZFxuIiwKLQkJCQkgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCwKLQkJCQkgY3VycmVudF9ldmVudC5kd1RocmVhZElkKTsKLQkgICAgICBwcmludGZfdW5maWx0ZXJlZCAoIiAgICAgICAgICAgICAgICAgdW5rbm93biBldmVudCBjb2RlICVkXG4iLAotCQkJCSBjdXJyZW50X2V2ZW50LmR3RGVidWdFdmVudENvZGUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIENIRUNLIChjaGlsZF9jb250aW51ZSAoY29udGludWVfc3RhdHVzLCAtMSkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpbnQgZGV0YWNoID0gMDsKLQotCSAgaWYgKHVpX2xvb3BfaG9vayAhPSBOVUxMKQotCSAgICBkZXRhY2ggPSB1aV9sb29wX2hvb2sgKDApOwotCi0JICBpZiAoZGV0YWNoKQotCSAgICBjaGlsZF9raWxsX2luZmVyaW9yICgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEF0dGFjaCB0byBwcm9jZXNzIFBJRCwgdGhlbiBpbml0aWFsaXplIGZvciBkZWJ1Z2dpbmcgaXQuICAqLwotCi1zdGF0aWMgdm9pZAotY2hpbGRfYXR0YWNoIChhcmdzLCBmcm9tX3R0eSkKLSAgICAgY2hhciAqYXJnczsKLSAgICAgaW50IGZyb21fdHR5OwotewotICBCT09MIG9rOwotCi0gIGlmICghYXJncykKLSAgICBlcnJvcl9ub19hcmcgKCJwcm9jZXNzLWlkIHRvIGF0dGFjaCIpOwotCi0gIGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQgPSBzdHJ0b3VsIChhcmdzLCAwLCAwKTsKLQotICBvayA9IERlYnVnQWN0aXZlUHJvY2VzcyAoY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCk7Ci0KLSAgaWYgKCFvaykKLSAgICBlcnJvciAoIkNhbid0IGF0dGFjaCB0byBwcm9jZXNzLiIpOwotCi0gIGV4Y2VwdGlvbl9jb3VudCA9IDA7Ci0gIGV2ZW50X2NvdW50ID0gMDsKLQotICBpZiAoZnJvbV90dHkpCi0gICAgewotICAgICAgY2hhciAqZXhlY19maWxlID0gKGNoYXIgKikgZ2V0X2V4ZWNfZmlsZSAoMCk7Ci0KLSAgICAgIGlmIChleGVjX2ZpbGUpCi0JcHJpbnRmX3VuZmlsdGVyZWQgKCJBdHRhY2hpbmcgdG8gcHJvZ3JhbSBgJXMnLCAlc1xuIiwgZXhlY19maWxlLAotCQkJICAgdGFyZ2V0X3BpZF90b19zdHIgKGN1cnJlbnRfZXZlbnQuZHdQcm9jZXNzSWQpKTsKLSAgICAgIGVsc2UKLQlwcmludGZfdW5maWx0ZXJlZCAoIkF0dGFjaGluZyB0byAlc1xuIiwKLQkJCSAgIHRhcmdldF9waWRfdG9fc3RyIChjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKSk7Ci0KLSAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7Ci0gICAgfQotCi0gIHB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX2RldGFjaCAoYXJncywgZnJvbV90dHkpCi0gICAgIGNoYXIgKmFyZ3M7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgaWYgKGZyb21fdHR5KQotICAgIHsKLSAgICAgIGNoYXIgKmV4ZWNfZmlsZSA9IGdldF9leGVjX2ZpbGUgKDApOwotICAgICAgaWYgKGV4ZWNfZmlsZSA9PSAwKQotCWV4ZWNfZmlsZSA9ICIiOwotICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKCJEZXRhY2hpbmcgZnJvbSBwcm9ncmFtOiAlcyAlc1xuIiwgZXhlY19maWxlLAotCQkJIHRhcmdldF9waWRfdG9fc3RyIChpbmZlcmlvcl9waWQpKTsKLSAgICAgIGdkYl9mbHVzaCAoZ2RiX3N0ZG91dCk7Ci0gICAgfQotICBpbmZlcmlvcl9waWQgPSAwOwotICB1bnB1c2hfdGFyZ2V0ICgmY2hpbGRfb3BzKTsKLX0KLQotLyogUHJpbnQgc3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgd2UncmUgYWNjZXNzaW5nLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoaWxkX2ZpbGVzX2luZm8gKGlnbm9yZSkKLSAgICAgc3RydWN0IHRhcmdldF9vcHMgKmlnbm9yZTsKLXsKLSAgcHJpbnRmX3VuZmlsdGVyZWQgKCJcdFVzaW5nIHRoZSBydW5uaW5nIGltYWdlIG9mICVzICVzLlxuIiwKLSAgICAgIGF0dGFjaF9mbGFnID8gImF0dGFjaGVkIiA6ICJjaGlsZCIsIHRhcmdldF9waWRfdG9fc3RyIChpbmZlcmlvcl9waWQpKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1jaGlsZF9vcGVuIChhcmcsIGZyb21fdHR5KQotICAgICBjaGFyICphcmc7Ci0gICAgIGludCBmcm9tX3R0eTsKLXsKLSAgZXJyb3IgKCJVc2UgdGhlIFwicnVuXCIgY29tbWFuZCB0byBzdGFydCBhIFVuaXggY2hpbGQgcHJvY2Vzcy4iKTsKLX0KLQotLyogU3RhcnQgYW4gaW5mZXJpb3Igd2luMzIgY2hpbGQgcHJvY2VzcyBhbmQgc2V0cyBpbmZlcmlvcl9waWQgdG8gaXRzIHBpZC4KLSAgIEVYRUNfRklMRSBpcyB0aGUgZmlsZSB0byBydW4uCi0gICBBTExBUkdTIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbS4KLSAgIEVOViBpcyB0aGUgZW52aXJvbm1lbnQgdmVjdG9yIHRvIHBhc3MuICBFcnJvcnMgcmVwb3J0ZWQgd2l0aCBlcnJvcigpLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoaWxkX2NyZWF0ZV9pbmZlcmlvciAoZXhlY19maWxlLCBhbGxhcmdzLCBlbnYpCi0gICAgIGNoYXIgKmV4ZWNfZmlsZTsKLSAgICAgY2hhciAqYWxsYXJnczsKLSAgICAgY2hhciAqKmVudjsKLXsKLSAgY2hhciByZWFsX3BhdGhbTUFYUEFUSExFTl07Ci0gIGNoYXIgKndpbmVudjsKLSAgY2hhciAqdGVtcDsKLSAgaW50ICBlbnZsZW47Ci0gIGludCBpOwotCi0gIFNUQVJUVVBJTkZPIHNpOwotICBQUk9DRVNTX0lORk9STUFUSU9OIHBpOwotICBzdHJ1Y3QgdGFyZ2V0X3dhaXRzdGF0dXMgZHVtbXk7Ci0gIEJPT0wgcmV0OwotICBEV09SRCBmbGFnczsKLSAgY2hhciAqYXJnczsKLQotICBpZiAoIWV4ZWNfZmlsZSkKLSAgICB7Ci0gICAgICBlcnJvciAoIk5vIGV4ZWN1dGFibGUgc3BlY2lmaWVkLCB1c2UgYHRhcmdldCBleGVjJy5cbiIpOwotICAgIH0KLQotICBtZW1zZXQgKCZzaSwgMCwgc2l6ZW9mIChzaSkpOwotICBzaS5jYiA9IHNpemVvZiAoc2kpOwotCi0gIGN5Z3dpbjMyX2NvbnZfdG9fd2luMzJfcGF0aCAoZXhlY19maWxlLCByZWFsX3BhdGgpOwotCi0gIGZsYWdzID0gREVCVUdfT05MWV9USElTX1BST0NFU1M7Ci0KLSAgaWYgKG5ld19ncm91cCkKLSAgICBmbGFncyB8PSBDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVA7Ci0KLSAgaWYgKG5ld19jb25zb2xlKQotICAgIGZsYWdzIHw9IENSRUFURV9ORVdfQ09OU09MRTsKLQotICBhcmdzID0gYWxsb2NhIChzdHJsZW4gKHJlYWxfcGF0aCkgKyBzdHJsZW4gKGFsbGFyZ3MpICsgMik7Ci0KLSAgc3RyY3B5IChhcmdzLCByZWFsX3BhdGgpOwotCi0gIHN0cmNhdCAoYXJncywgIiAiKTsKLSAgc3RyY2F0IChhcmdzLCBhbGxhcmdzKTsKLQotICAvKiBQcmVwYXJlIHRoZSBlbnZpcm9ubWVudCB2YXJzIGZvciBDcmVhdGVQcm9jZXNzLiAgKi8KLSAgewotICAgIC8qIFRoaXMgY29kZSB1c2UgdG8gYXNzdW1lIGFsbCBlbnYgdmFycyB3ZXJlIGZpbGUgbmFtZXMgYW5kIHdvdWxkCi0gICAgICAgdHJhbnNsYXRlIHRoZW0gYWxsIHRvIHdpbjMyIHN0eWxlLiAgVGhhdCBvYnZpb3VzbHkgZG9lc24ndCB3b3JrIGluIHRoZQotICAgICAgIGdlbmVyYWwgY2FzZS4gIFRoZSBjdXJyZW50IHJ1bGUgaXMgdGhhdCB3ZSBvbmx5IHRyYW5zbGF0ZSBQQVRILgotICAgICAgIFdlIG5lZWQgdG8gaGFuZGxlIFBBVEggYmVjYXVzZSB3ZSdyZSBhYm91dCB0byBjYWxsIENyZWF0ZVByb2Nlc3MgYW5kCi0gICAgICAgaXQgdXNlcyBQQVRIIHRvIGZpbmQgRExMJ3MuICBGb3J0dW5hdGVseSBQQVRIIGhhcyBhIHdlbGwtZGVmaW5lZCB2YWx1ZQotICAgICAgIGluIGJvdGggcG9zaXggYW5kIHdpbjMyIGVudmlyb25tZW50cy4gIGN5Z3dpbi5kbGwgd2lsbCBjaGFuZ2UgaXQgYmFjawotICAgICAgIHRvIHBvc2l4IHN0eWxlIGlmIG5lY2Vzc2FyeS4gICovCi0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29udl9wYXRoX25hbWVzW10gPQotICAgICAgewotCSJQQVRIPSIsCi0JMAotICAgICAgfTsKLQotICAgIC8qIENyZWF0ZVByb2Nlc3MgdGFrZXMgdGhlIGVudmlyb25tZW50IGxpc3QgYXMgYSBudWxsIHRlcm1pbmF0ZWQgc2V0IG9mCi0gICAgICAgc3RyaW5ncyAoaS5lLiB0d28gbnVsbHMgdGVybWluYXRlIHRoZSBsaXN0KS4gICovCi0KLSAgICAvKiBHZXQgdG90YWwgc2l6ZSBmb3IgZW52IHN0cmluZ3MuICAqLwotICAgIGZvciAoZW52bGVuID0gMCwgaSA9IDA7IGVudltpXSAmJiAqZW52W2ldOyBpKyspCi0gICAgICB7Ci0JaW50IGosIGxlbjsKLQotCWZvciAoaiA9IDA7IGNvbnZfcGF0aF9uYW1lc1tqXTsgaisrKQotCSAgewotCSAgICBsZW4gPSBzdHJsZW4gKGNvbnZfcGF0aF9uYW1lc1tqXSk7Ci0JICAgIGlmIChzdHJuY21wIChjb252X3BhdGhfbmFtZXNbal0sIGVudltpXSwgbGVuKSA9PSAwKQotCSAgICAgIHsKLQkJaWYgKGN5Z3dpbjMyX3Bvc2l4X3BhdGhfbGlzdF9wIChlbnZbaV0gKyBsZW4pKQotCQkgIGVudmxlbiArPSBsZW4KLQkJICAgICsgY3lnd2luMzJfcG9zaXhfdG9fd2luMzJfcGF0aF9saXN0X2J1Zl9zaXplIChlbnZbaV0gKyBsZW4pOwotCQllbHNlCi0JCSAgZW52bGVuICs9IHN0cmxlbiAoZW52W2ldKSArIDE7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLQlpZiAoY29udl9wYXRoX25hbWVzW2pdID09IE5VTEwpCi0JICBlbnZsZW4gKz0gc3RybGVuIChlbnZbaV0pICsgMTsKLSAgICAgIH0KLQotICAgIHdpbmVudiA9IGFsbG9jYSAoZW52bGVuICsgMSk7Ci0KLSAgICAvKiBDb3B5IGVudiBzdHJpbmdzIGludG8gbmV3IGJ1ZmZlci4gICovCi0gICAgZm9yICh0ZW1wID0gd2luZW52LCBpID0gMDsgZW52W2ldICYmICplbnZbaV07IGkrKykKLSAgICAgIHsKLQlpbnQgaiwgbGVuOwotCi0JZm9yIChqID0gMDsgY29udl9wYXRoX25hbWVzW2pdOyBqKyspCi0JICB7Ci0JICAgIGxlbiA9IHN0cmxlbiAoY29udl9wYXRoX25hbWVzW2pdKTsKLQkgICAgaWYgKHN0cm5jbXAgKGNvbnZfcGF0aF9uYW1lc1tqXSwgZW52W2ldLCBsZW4pID09IDApCi0JICAgICAgewotCQlpZiAoY3lnd2luMzJfcG9zaXhfcGF0aF9saXN0X3AgKGVudltpXSArIGxlbikpCi0JCSAgewotCQkgICAgbWVtY3B5ICh0ZW1wLCBlbnZbaV0sIGxlbik7Ci0JCSAgICBjeWd3aW4zMl9wb3NpeF90b193aW4zMl9wYXRoX2xpc3QgKGVudltpXSArIGxlbiwgdGVtcCArIGxlbik7Ci0JCSAgfQotCQllbHNlCi0JCSAgc3RyY3B5ICh0ZW1wLCBlbnZbaV0pOwotCQlicmVhazsKLQkgICAgICB9Ci0JICB9Ci0JaWYgKGNvbnZfcGF0aF9uYW1lc1tqXSA9PSBOVUxMKQotCSAgc3RyY3B5ICh0ZW1wLCBlbnZbaV0pOwotCi0JdGVtcCArPSBzdHJsZW4gKHRlbXApICsgMTsKLSAgICAgIH0KLQotICAgIC8qIEZpbmFsIG5pbCBzdHJpbmcgdG8gdGVybWluYXRlIG5ldyBlbnYuICAqLwotICAgICp0ZW1wID0gMDsKLSAgfQotCi0gIHJldCA9IENyZWF0ZVByb2Nlc3MgKDAsCi0JCSAgICAgICBhcmdzLCAJLyogY29tbWFuZCBsaW5lICovCi0JCSAgICAgICBOVUxMLAkvKiBTZWN1cml0eSAqLwotCQkgICAgICAgTlVMTCwJLyogdGhyZWFkICovCi0JCSAgICAgICBUUlVFLAkvKiBpbmhlcml0IGhhbmRsZXMgKi8KLQkJICAgICAgIGZsYWdzLAkvKiBzdGFydCBmbGFncyAqLwotCQkgICAgICAgd2luZW52LAotCQkgICAgICAgTlVMTCwJLyogY3VycmVudCBkaXJlY3RvcnkgKi8KLQkJICAgICAgICZzaSwKLQkJICAgICAgICZwaSk7Ci0gIGlmICghcmV0KQotICAgIGVycm9yICgiRXJyb3IgY3JlYXRpbmcgcHJvY2VzcyAlcywgKGVycm9yICVkKVxuIiwgZXhlY19maWxlLCBHZXRMYXN0RXJyb3IoKSk7Ci0KLSAgZXhjZXB0aW9uX2NvdW50ID0gMDsKLSAgZXZlbnRfY291bnQgPSAwOwotCi0gIGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUgPSBwaS5oUHJvY2VzczsKLSAgY3VycmVudF9ldmVudC5kd1Byb2Nlc3NJZCA9IHBpLmR3UHJvY2Vzc0lkOwotICBtZW1zZXQgKCZjdXJyZW50X2V2ZW50LCAwLCBzaXplb2YgKGN1cnJlbnRfZXZlbnQpKTsKLSAgaW5mZXJpb3JfcGlkID0gY3VycmVudF9ldmVudC5kd1RocmVhZElkID0gcGkuZHdUaHJlYWRJZDsKLSAgcHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOwotICBjaGlsZF9pbml0X3RocmVhZF9saXN0ICgpOwotICBpbml0X3dhaXRfZm9yX2luZmVyaW9yICgpOwotICBjbGVhcl9wcm9jZWVkX3N0YXR1cyAoKTsKLSAgdGFyZ2V0X3Rlcm1pbmFsX2luaXQgKCk7Ci0gIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlvciAoKTsKLQotICAvKiBJZ25vcmUgdGhlIGZpcnN0IHRyYXAgKi8KLSAgY2hpbGRfd2FpdCAoaW5mZXJpb3JfcGlkLCAmZHVtbXkpOwotCi0gIHByb2NlZWQgKChDT1JFX0FERFIpIC0gMSwgVEFSR0VUX1NJR05BTF8wLCAwKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX21vdXJuX2luZmVyaW9yICgpCi17Ci0gICh2b2lkKSBjaGlsZF9jb250aW51ZSAoREJHX0NPTlRJTlVFLCAtMSk7Ci0gIHVucHVzaF90YXJnZXQgKCZjaGlsZF9vcHMpOwotICBnZW5lcmljX21vdXJuX2luZmVyaW9yICgpOwotfQotCi0vKiBTZW5kIGEgU0lHSU5UIHRvIHRoZSBwcm9jZXNzIGdyb3VwLiAgVGhpcyBhY3RzIGp1c3QgbGlrZSB0aGUgdXNlciB0eXBlZCBhCi0gICBeQyBvbiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuICovCi0KLXN0YXRpYyB2b2lkCi1jaGlsZF9zdG9wICgpCi17Ci0gIERFQlVHX0VWRU5UUyAoKCJnZGI6IEdlbmVyYXRlQ29uc29sZUN0cmxFdmVudCAoQ1RSTENfRVZFTlQsIDApXG4iKSk7Ci0gIENIRUNLIChHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQgKENUUkxfQ19FVkVOVCwgMCkpOwotICByZWdpc3RlcnNfY2hhbmdlZCgpOwkJLyogcmVmcmVzaCByZWdpc3RlciBzdGF0ZSAqLwotfQotCi1pbnQKLWNoaWxkX3hmZXJfbWVtb3J5IChDT1JFX0FERFIgbWVtYWRkciwgY2hhciAqb3VyLCBpbnQgbGVuLAotCQkgICBpbnQgd3JpdGUsIHN0cnVjdCB0YXJnZXRfb3BzICp0YXJnZXQpCi17Ci0gIERXT1JEIGRvbmU7Ci0gIGlmICh3cml0ZSkKLSAgICB7Ci0gICAgICBERUJVR19NRU0gKCgiZ2RiOiB3cml0ZSB0YXJnZXQgbWVtb3J5LCAlZCBieXRlcyBhdCAweCUwOHhcbiIsCi0JCSAgbGVuLCBtZW1hZGRyKSk7Ci0gICAgICBXcml0ZVByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsIChMUFZPSUQpIG1lbWFkZHIsIG91ciwKLQkJCSAgbGVuLCAmZG9uZSk7Ci0gICAgICBGbHVzaEluc3RydWN0aW9uQ2FjaGUgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsIChMUENWT0lEKSBtZW1hZGRyLCBsZW4pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIERFQlVHX01FTSAoKCJnZGI6IHJlYWQgdGFyZ2V0IG1lbW9yeSwgJWQgYnl0ZXMgYXQgMHglMDh4XG4iLAotCQkgIGxlbiwgbWVtYWRkcikpOwotICAgICAgUmVhZFByb2Nlc3NNZW1vcnkgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsIChMUENWT0lEKSBtZW1hZGRyLCBvdXIsIGxlbiwKLQkJCSAmZG9uZSk7Ci0gICAgfQotICByZXR1cm4gZG9uZTsKLX0KLQotdm9pZAotY2hpbGRfa2lsbF9pbmZlcmlvciAodm9pZCkKLXsKLSAgQ0hFQ0sgKFRlcm1pbmF0ZVByb2Nlc3MgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUsIDApKTsKLQotICBmb3IgKDs7KQotICAgIHsKLSAgICAgIGlmICghY2hpbGRfY29udGludWUgKERCR19DT05USU5VRSwgLTEpKQotCWJyZWFrOwotICAgICAgaWYgKCFXYWl0Rm9yRGVidWdFdmVudCAoJmN1cnJlbnRfZXZlbnQsIElORklOSVRFKSkKLQlicmVhazsKLSAgICAgIGlmIChjdXJyZW50X2V2ZW50LmR3RGVidWdFdmVudENvZGUgPT0gRVhJVF9QUk9DRVNTX0RFQlVHX0VWRU5UKQotCWJyZWFrOwotICAgIH0KLQotICBDSEVDSyAoQ2xvc2VIYW5kbGUgKGN1cnJlbnRfcHJvY2Vzc19oYW5kbGUpKTsKLQotICAvKiB0aGlzIG1heSBmYWlsIGluIGFuIGF0dGFjaGVkIHByb2Nlc3Mgc28gZG9uJ3QgY2hlY2suICovCi0gICh2b2lkKSBDbG9zZUhhbmRsZSAoY3VycmVudF90aHJlYWQtPmgpOwotICB0YXJnZXRfbW91cm5faW5mZXJpb3IoKTsJLyogb3IganVzdCBjaGlsZF9tb3Vybl9pbmZlcmlvcj8gKi8KLX0KLQotdm9pZAotY2hpbGRfcmVzdW1lIChpbnQgcGlkLCBpbnQgc3RlcCwgZW51bSB0YXJnZXRfc2lnbmFsIHNpZykKLXsKLSAgaW50IGk7Ci0gIHRocmVhZF9pbmZvICp0aDsKLSAgRFdPUkQgY29udGludWVfc3RhdHVzID0gbGFzdF9zaWcgPiAwICYmIGxhc3Rfc2lnIDwgTlNJRyA/Ci0JCQkgIERCR19FWENFUFRJT05fTk9UX0hBTkRMRUQgOiBEQkdfQ09OVElOVUU7Ci0KLSAgREVCVUdfRVhFQyAoKCJnZGI6IGNoaWxkX3Jlc3VtZSAocGlkPSVkLCBzdGVwPSVkLCBzaWc9JWQpO1xuIiwKLQkgICAgICAgcGlkLCBzdGVwLCBzaWcpKTsKLQotICAvKiBHZXQgY29udGV4dCBmb3IgY3VycmVudGx5IHNlbGVjdGVkIHRocmVhZCAqLwotICB0aCA9IHRocmVhZF9yZWMgKGN1cnJlbnRfZXZlbnQuZHdUaHJlYWRJZCwgRkFMU0UpOwotICBpZiAoc3RlcCkKLSAgICB7Ci0jaWZkZWYgaTM4NgotICAgICAgLyogU2luZ2xlIHN0ZXAgYnkgc2V0dGluZyB0IGJpdCAqLwotICAgICAgY2hpbGRfZmV0Y2hfaW5mZXJpb3JfcmVnaXN0ZXJzIChQU19SRUdOVU0pOwotICAgICAgdGgtPmNvbnRleHQuRUZsYWdzIHw9IEZMQUdfVFJBQ0VfQklUOwotI2VuZGlmCi0gICAgfQotCi0gIGlmICh0aC0+Y29udGV4dC5Db250ZXh0RmxhZ3MpCi0gICAgewotICAgICAgQ0hFQ0sgKFNldFRocmVhZENvbnRleHQgKHRoLT5oLCAmdGgtPmNvbnRleHQpKTsKLSAgICAgIHRoLT5jb250ZXh0LkNvbnRleHRGbGFncyA9IDA7Ci0gICAgfQotCi0gIC8qIEFsbG93IGNvbnRpbnVpbmcgd2l0aCB0aGUgc2FtZSBzaWduYWwgdGhhdCBpbnRlcnJ1cHRlZCB1cy4KLSAgICAgT3RoZXJ3aXNlIGNvbXBsYWluLiAqLwotICBpZiAoc2lnICYmIHNpZyAhPSBsYXN0X3NpZykKLSAgICBmcHJpbnRmX3VuZmlsdGVyZWQgKGdkYl9zdGRlcnIsICJDYW4ndCBzZW5kIHNpZ25hbHMgdG8gdGhlIGNoaWxkLiAgc2lnbmFsICVkXG4iLCBzaWcpOwotCi0gIGxhc3Rfc2lnID0gMDsKLSAgY2hpbGRfY29udGludWUgKGNvbnRpbnVlX3N0YXR1cywgcGlkKTsKLX0KLQotc3RhdGljIHZvaWQKLWNoaWxkX3ByZXBhcmVfdG9fc3RvcmUgKCkKLXsKLSAgLyogRG8gbm90aGluZywgc2luY2Ugd2UgY2FuIHN0b3JlIGluZGl2aWR1YWwgcmVncyAqLwotfQotCi1zdGF0aWMgaW50Ci1jaGlsZF9jYW5fcnVuICgpCi17Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotY2hpbGRfY2xvc2UgKCkKLXsKLSAgREVCVUdfRVZFTlRTICgoImdkYjogY2hpbGRfY2xvc2UsIGluZmVyaW9yX3BpZD0lZFxuIiwgaW5mZXJpb3JfcGlkKSk7Ci19Ci0KLXN0cnVjdCB0YXJnZXRfb3BzIGNoaWxkX29wcyA7Ci0KLXN0YXRpYyB2b2lkIAotaW5pdF9jaGlsZF9vcHModm9pZCkKLXsKLSAgY2hpbGRfb3BzLnRvX3Nob3J0bmFtZSA9ICAgImNoaWxkIjsKLSAgY2hpbGRfb3BzLnRvX2xvbmduYW1lID0gICAiV2luMzIgY2hpbGQgcHJvY2VzcyI7Ci0gIGNoaWxkX29wcy50b19kb2MgPSAgICJXaW4zMiBjaGlsZCBwcm9jZXNzIChzdGFydGVkIGJ5IHRoZSBcInJ1blwiIGNvbW1hbmQpLiI7Ci0gIGNoaWxkX29wcy50b19vcGVuID0gICBjaGlsZF9vcGVuOwotICBjaGlsZF9vcHMudG9fY2xvc2UgPSAgIGNoaWxkX2Nsb3NlOwotICBjaGlsZF9vcHMudG9fYXR0YWNoID0gICBjaGlsZF9hdHRhY2g7Ci0gIGNoaWxkX29wcy50b19kZXRhY2ggPSAgIGNoaWxkX2RldGFjaDsKLSAgY2hpbGRfb3BzLnRvX3Jlc3VtZSA9ICAgY2hpbGRfcmVzdW1lOwotICBjaGlsZF9vcHMudG9fd2FpdCAgPSAgIGNoaWxkX3dhaXQ7Ci0gIGNoaWxkX29wcy50b19mZXRjaF9yZWdpc3RlcnMgID0gICBjaGlsZF9mZXRjaF9pbmZlcmlvcl9yZWdpc3RlcnM7Ci0gIGNoaWxkX29wcy50b19zdG9yZV9yZWdpc3RlcnMgID0gICBjaGlsZF9zdG9yZV9pbmZlcmlvcl9yZWdpc3RlcnM7Ci0gIGNoaWxkX29wcy50b19wcmVwYXJlX3RvX3N0b3JlID0gICBjaGlsZF9wcmVwYXJlX3RvX3N0b3JlOwotICBjaGlsZF9vcHMudG9feGZlcl9tZW1vcnkgID0gICBjaGlsZF94ZmVyX21lbW9yeTsKLSAgY2hpbGRfb3BzLnRvX2ZpbGVzX2luZm8gID0gICBjaGlsZF9maWxlc19pbmZvOwotICBjaGlsZF9vcHMudG9faW5zZXJ0X2JyZWFrcG9pbnQgPSAgIG1lbW9yeV9pbnNlcnRfYnJlYWtwb2ludDsKLSAgY2hpbGRfb3BzLnRvX3JlbW92ZV9icmVha3BvaW50ID0gICBtZW1vcnlfcmVtb3ZlX2JyZWFrcG9pbnQ7Ci0gIGNoaWxkX29wcy50b190ZXJtaW5hbF9pbml0ICA9ICAgdGVybWluYWxfaW5pdF9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX2luZmVyaW9yID0gICB0ZXJtaW5hbF9pbmZlcmlvcjsKLSAgY2hpbGRfb3BzLnRvX3Rlcm1pbmFsX291cnNfZm9yX291dHB1dCA9ICAgdGVybWluYWxfb3Vyc19mb3Jfb3V0cHV0OwotICBjaGlsZF9vcHMudG9fdGVybWluYWxfb3VycyAgPSAgIHRlcm1pbmFsX291cnM7Ci0gIGNoaWxkX29wcy50b190ZXJtaW5hbF9pbmZvICA9ICAgY2hpbGRfdGVybWluYWxfaW5mbzsKLSAgY2hpbGRfb3BzLnRvX2tpbGwgID0gICBjaGlsZF9raWxsX2luZmVyaW9yOwotICBjaGlsZF9vcHMudG9fbG9hZCAgPSAgIDA7Ci0gIGNoaWxkX29wcy50b19sb29rdXBfc3ltYm9sID0gICAwOwotICBjaGlsZF9vcHMudG9fY3JlYXRlX2luZmVyaW9yID0gICBjaGlsZF9jcmVhdGVfaW5mZXJpb3I7Ci0gIGNoaWxkX29wcy50b19tb3Vybl9pbmZlcmlvciA9ICAgY2hpbGRfbW91cm5faW5mZXJpb3I7Ci0gIGNoaWxkX29wcy50b19jYW5fcnVuICA9ICAgY2hpbGRfY2FuX3J1bjsKLSAgY2hpbGRfb3BzLnRvX25vdGljZV9zaWduYWxzID0gICAwOwotICBjaGlsZF9vcHMudG9fdGhyZWFkX2FsaXZlICA9ICAgd2luMzJfY2hpbGRfdGhyZWFkX2FsaXZlOwotICBjaGlsZF9vcHMudG9fc3RvcCAgPSAgIGNoaWxkX3N0b3A7Ci0gIGNoaWxkX29wcy50b19zdHJhdHVtID0gICBwcm9jZXNzX3N0cmF0dW07Ci0gIGNoaWxkX29wcy5ET05UX1VTRSA9ICAgMDsKLSAgY2hpbGRfb3BzLnRvX2hhc19hbGxfbWVtb3J5ID0gICAxOwotICBjaGlsZF9vcHMudG9faGFzX21lbW9yeSA9ICAgMTsKLSAgY2hpbGRfb3BzLnRvX2hhc19zdGFjayA9ICAgMTsKLSAgY2hpbGRfb3BzLnRvX2hhc19yZWdpc3RlcnMgPSAgIDE7Ci0gIGNoaWxkX29wcy50b19oYXNfZXhlY3V0aW9uID0gICAxOwotICBjaGlsZF9vcHMudG9fc2VjdGlvbnMgPSAgIDA7Ci0gIGNoaWxkX29wcy50b19zZWN0aW9uc19lbmQgPSAgIDA7Ci0gIGNoaWxkX29wcy50b19tYWdpYyA9ICAgT1BTX01BR0lDOwotfQotCi12b2lkCi1faW5pdGlhbGl6ZV9pbmZ0YXJnICgpCi17Ci0gIHN0cnVjdCBjbWRfbGlzdF9lbGVtZW50ICpjOwotICBpbml0X2NoaWxkX29wcygpIDsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoIm5ldy1jb25zb2xlIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJm5ld19jb25zb2xlLAotCQkgICJTZXQgY3JlYXRpb24gb2YgbmV3IGNvbnNvbGUgd2hlbiBjcmVhdGluZyBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF9zaG93X2Zyb21fc2V0Ci0gICAgKGFkZF9zZXRfY21kICgibmV3LWdyb3VwIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJm5ld19ncm91cCwKLQkJICAiU2V0IGNyZWF0aW9uIG9mIG5ldyBncm91cCB3aGVuIGNyZWF0aW5nIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V4ZWMiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmZGVidWdfZXhlYywKLQkJICAiU2V0IHdoZXRoZXIgdG8gZGlzcGxheSBleGVjdXRpb24gaW4gY2hpbGQgcHJvY2Vzcy4iLAotCQkgICZzZXRsaXN0KSwKLSAgICAgJnNob3dsaXN0KTsKLQotICBhZGRfc2hvd19mcm9tX3NldAotICAgIChhZGRfc2V0X2NtZCAoImRlYnVnZXZlbnRzIiwgY2xhc3Nfc3VwcG9ydCwgdmFyX2Jvb2xlYW4sCi0JCSAgKGNoYXIgKikgJmRlYnVnX2V2ZW50cywKLQkJICAiU2V0IHdoZXRoZXIgdG8gZGlzcGxheSBrZXJuZWwgZXZlbnRzIGluIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z21lbW9yeSIsIGNsYXNzX3N1cHBvcnQsIHZhcl9ib29sZWFuLAotCQkgIChjaGFyICopICZkZWJ1Z19tZW1vcnksCi0JCSAgIlNldCB3aGV0aGVyIHRvIGRpc3BsYXkgbWVtb3J5IGFjY2Vzc2VzIGluIGNoaWxkIHByb2Nlc3MuIiwKLQkJICAmc2V0bGlzdCksCi0gICAgICZzaG93bGlzdCk7Ci0KLSAgYWRkX3Nob3dfZnJvbV9zZXQKLSAgICAoYWRkX3NldF9jbWQgKCJkZWJ1Z2V4Y2VwdGlvbnMiLCBjbGFzc19zdXBwb3J0LCB2YXJfYm9vbGVhbiwKLQkJICAoY2hhciAqKSAmZGVidWdfZXhjZXB0aW9ucywKLQkJICAiU2V0IHdoZXRoZXIgdG8gZGlzcGxheSBrZXJuZWwgZXhjZXB0aW9ucyBpbiBjaGlsZCBwcm9jZXNzLiIsCi0JCSAgJnNldGxpc3QpLAotICAgICAmc2hvd2xpc3QpOwotCi0gIGFkZF90YXJnZXQgKCZjaGlsZF9vcHMpOwotfQotCi0vKiBEZXRlcm1pbmUgaWYgdGhlIHRocmVhZCByZWZlcmVuY2VkIGJ5ICJwaWQiIGlzIGFsaXZlCi0gICBieSAicG9sbGluZyIgaXQuICBJZiBXYWl0Rm9yU2luZ2xlT2JqZWN0IHJldHVybnMgV0FJVF9PQkpFQ1RfMAotICAgaXQgbWVhbnMgdGhhdCB0aGUgcGlkIGhhcyBkaWVkLiAgT3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdG8gYmUgYWxpdmUuICovCi1zdGF0aWMgaW50Ci13aW4zMl9jaGlsZF90aHJlYWRfYWxpdmUgKGludCBwaWQpCi17Ci0gIHJldHVybiBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZF9yZWMgKHBpZCwgRkFMU0UpLT5oLCAwKSA9PSBXQUlUX09CSkVDVF8wID8KLQkgRkFMU0UgOiBUUlVFOwotfQotCi0vKiBDb252ZXJ0IHBpZCB0byBwcmludGFibGUgZm9ybWF0LiAqLwotY2hhciAqCi1jeWd3aW5fcGlkX3RvX3N0ciAoaW50IHBpZCkKLXsKLSAgc3RhdGljIGNoYXIgYnVmWzgwXTsKLSAgaWYgKHBpZCA9PSBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkKQotICAgIHNwcmludGYgKGJ1ZiwgInByb2Nlc3MgJWQiLCBwaWQpOwotICBlbHNlCi0gICAgc3ByaW50ZiAoYnVmLCAidGhyZWFkICVkLjB4JXgiLCBjdXJyZW50X2V2ZW50LmR3UHJvY2Vzc0lkLCBwaWQpOwotICByZXR1cm4gYnVmOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvLmdkYmluaXQgYi9ncHJvZi8uZ2RiaW5pdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUxOTQ3Mi4uMDAwMDAwMAotLS0gYS9ncHJvZi8uZ2RiaW5pdAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWRpciAuLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvQ2hhbmdlTG9nIGIvZ3Byb2YvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGY5ZTE4Li4wMDAwMDAwCi0tLSBhL2dwcm9mL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDEzMzEgKzAsMCBAQAotTW9uIEp1biAxNCAxMDozNToyOCAxOTk5ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGdwcm9mLnRleGk6IEZpeCB0eXBvLgotCi0xOTk5LTA2LTEzICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCUZyb20gQm9iIEJ5cm5lcyA8YnlybmVzQGN1cmwuY29tPjoKLQkqIGNnX2Rmbi5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIKLQkoREZOX0lOQ1JfREVQVEgpOiBEZWZpbmUgaW5zdGVhZCBvZiBERk5fREVQVEguCi0JKGRmbl9zdGFjayk6IERlZmluZSBhcyBwb2ludGVyIHJhdGhlciB0aGFuIGFycmF5LgotCShwcmVfdmlzaXQpOiBSZWFsbG9jYXRlIGRmbl9zdGFjayBhcyBuZWVkZWQuCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTA2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogZ3Byb2YuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0JKiBncHJvZi5jIChtYWluKTogRG9uJ3QgcGFzcyBMQ19NRVNTQUdFUyB0byBzZXRsb2NhbGUgaWYgdGhlCi0Jc3lzdGVtIGRvZXMgbm90IGRlZmluZSBpdC4KLQotMTk5OS0wNC0wNSAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb3JlZmlsZS5jIChjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBEb24ndCB1c2UgZml4ZWQgc2l6ZSBhcnJheQotCWZvciBwcmV2X25hbWUgYW5kIHByZXZfZmlsZW5hbWUuCi0KLTE5OTktMDQtMDQgIE1pY2hhZWwgSG9obXV0aCAgPGhvaG11dGhAaW5ub2NlbnQuY29tPgotCi0JKiBncHJvZi5oIChGRl9CU0Q0NCk6IERlZmluZS4KLQkqIGdtb24uaCAoc3RydWN0IHJhd19waGRyKTogQWRkIHZlcnNpb24sIHByb2ZyYXRlLCBhbmQgc3BhcmUKLQlmaWVsZHMgdW5jb25kaXRpb25hbGx5LgotCShzdHJ1Y3Qgb2xkX3Jhd19waGRyKTogTmV3IHN0cnVjdC4KLQkqIGdwcm9mLmMgKG1haW4pOiBIYW5kbGUgLU8gNC40YnNkLgotCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogSGFuZGxlIEJTRCA0LjQgZm9ybWF0LCBlaXRoZXIKLQlhdXRvbWF0aWNhbGx5IG9yIGJ5IHVzZXIgc3BlY2lmaWNhdGlvbi4KLQkoZ21vbl9vdXRfd3JpdGUpOiBIYW5kbGUgQlNEIDQuNCBmb3JtYXQuCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBCU0Q0NF9GT1JNQVQuCi0JKiBncHJvZi50ZXhpIChNaXNjZWxsYW5lb3VzIE9wdGlvbnMpOiBEb2N1bWVudCAtTyA0LjRic2QuCi0JKiBjb25maWd1cmUsIGdjb25maWcuaW46IFJlYnVpbGQuCi0KLVR1ZSBGZWIgMTYgMTc6MDE6MzMgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBBQ19QUkVSRVEgdG8gMi4xMy4gIENoYW5nZSBBTV9QUk9HX0lOU1RBTEwKLQl0byBBQ19QUk9HX0lOU1RBTEwuICBSZW1vdmUgQU1fQ1lHV0lOMzIuICBDaGFuZ2UgQU1fRVhFRVhUIHRvCi0JQUNfRVhFRVhULiAgQWRkIGNvbW1lbnQgdG8gQUNfREVGSU5FLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogZ2NvbmZpZy5pbjogUmVidWlsZC4KLQotU3VuIERlYyAgNiAyMTo1Nzo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLnRleGkgKFN5bXNwZWNzKTogTWVudGlvbiB0aGF0IHlvdSBoYXZlIHRvIGFkZCBhbnkKLQl1bmRlcnNjb3JlIHlvdXJzZWxmIHdoZW4gbmFtaW5nIGEgc3ltYm9sLgotCi1Nb24gTm92ICAyIDE1OjA1OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGRldGVjdCBjeWd3aW4qIGluc3RlYWQgb2YgY3lnd2luMzIqCi0gICAgICAgICogY29uZmlndXJlOiByZWdlbmVyYXRlCi0KLVdlZCBBdWcgMTIgMTQ6NTk6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQXZvaWQgc29tZSBvdmVyZmxvdyBjYXNlczoKLQkqIGJhc2ljX2Jsb2Nrcy5oIChiYl9taW5fY2FsbHMpOiBDaGFuZ2UgdG8gdW5zaWduZWQgbG9uZy4KLQkqIGNhbGxfZ3JhcGguaCAoY2dfdGFsbHkpOiBDaGFuZ2UgY291bnQgcGFyYW1ldGVyIHRvIHVuc2lnbmVkCi0JbG9uZy4KLQkqIGNnX2FyY3MuaCAoQXJjKTogQ2hhbmdlIGNvdW50IGZpZWxkIHRvIHVuc2lnbmVkIGxvbmcuCi0JKGFyY19hZGQpOiBDaGFuZ2UgY291bnQgcGFyYW1ldGVyIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBzb3VyY2UuaCAoU291cmNlX0ZpbGUpOiBDaGFuZ2UgbmNhbGxzIGZpZWxkIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBzeW10YWIuaCAoU3ltKTogQ2hhbmdlIGZpZWxkcyBuY2FsbHMsIGJiX2NhbGxzLCBhbmQKLQljZy5zZWxmX2NhbGxzIHRvIHVuc2lnbmVkIGxvbmcuCi0JKiBNYW55IGZpbGVzOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQgd2l0aCBjdXJyZW50IHRvb2xzLgotCi1GcmkgSnVsIDEwIDE3OjI5OjQ5IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoQlNENDRfRk9STUFUKTogRGVmaW5lIGZvciBjeWd3aW4zMiwgd2luMzIsIG1pbmd3MzIKLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEp1biAxMiAxMzo0MDowNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKGFsbC15ZXMpOiBJZiBtYWludGFpbmVyIG1vZGUsIGRlcGVuZCBvbiAucG90IGZpbGUuCi0JKCQoUEFDS0FHRSkucG90KTogVW5jb25kaXRpb25hbGx5IGRlcGVuZCBvbiBQT1RGSUxFUy4KLQotU3VuIE1heSAxMCAyMjozNTozMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHBvL01ha2UtaW4gKGluc3RhbGwtaW5mbyk6IE5ldyB0YXJnZXQuCi0KLVR1ZSBNYXkgIDUgMTg6Mjg6NDAgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBncHJvZi5oIChfKTogVW5kZWZpbmUgQkZEJ3MgdmVyc2lvbi4KLQotVHVlIEFwciAyOCAxOToxNzozMyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKG1haW4pOiBDb25kaXRpb25hbGx5IGNhbGwgc2V0bG9jYWxlLgotCSogZ3Byb2YuaDogSW5jbHVkZSA8bG9jYWxlLmg+IGlmIEhBVkVfTE9DQUxFX0guCi0JKExDX01FU1NBR0VTKTogTm93IGNhbiBiZSBkZWZpbmVkIGV2ZW4gd2hlbiBFTkFCTEVfTkxTLgotCi1UdWUgQXByIDI4IDE5OjUwOjA5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29yZWZpbGUuYzogUmVuYW1lIGZyb20gY29yZS5jLgotCSogY29yZWZpbGUuaDogUmVuYW1lIGZyb20gY29yZS5oLgotCSogTWFueSAuYyBmaWxlczogSW5jbHVkZSBjb3JlZmlsZS5oIHJhdGhlciB0aGFuIGNvcmUuaC4KLQkqIE1ha2VmaWxlLmFtIChzb3VyY2VzKTogQ2hhbmdlIGNvcmUuYyB0byBjb3JlZmlsZS5jLgotCShub2luc3RfSEVBREVSUyk6IENoYW5nZSBjb3JlLmggdG8gY29yZWZpbGUuaC4KLQkoJChPQkpFQ1RTKSk6IERlcGVuZCB1cG9uIGNvcmVmaWxlLmggcmF0aGVyIHRoYW4gY29yZS5oLgotCShjb3JlZmlsZS5vKTogUmVuYW1lIHRhcmdldCBmcm9tIGNvcmUubywgZGVwZW5kIHVwb24gY29yZWZpbGUuYy4KLQkqIE1ha2VmaWxlLmluLCBwby9QT1RGSUxFUy5pbjogUmVidWlsZC4KLQotTW9uIEFwciAyNyAxNjo1MDo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOS40Ci0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBBcHIgMjIgMTY6MDE6MTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChNS0lOU1RBTExESVJTKTogRG9uJ3QgbG9vayBpbiAkKHRvcF9zcmNkaXIpLgotCi1XZWQgQXByIDIyIDAwOjAwOjIyIDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAc2NyaWJibGVzLmN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmg6IEFkZGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzIGZvciBnZXR0ZXh0LgotCSogY29uZmlndXJlLmluIChBTExfTElOR1VBUyk6IE5ldyBtYWNyby4KLQlDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZCBwby9NYWtlZmlsZS4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogZ3Byb2YuYyAobWFpbik6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgdGV4dGRvbWFpbi4KLQkqIE1ha2VmaWxlLmFtIChTVUJESVJTKTogTmV3IG1hY3JvLgotCShJTkNMVURFUyk6IExvb2sgaW4gaW50bCBkaXJzIGZvciBoZWFkZXJzLiAgRGVmaW5lIExPQ0FMRURJUi4KLQkoZ3Byb2ZfREVQRU5ERU5DSUVTKTogQWRkZWQgSU5UTERFUFMuCi0JKGdwcm9mX0xEQUREKTogQWRkZWQgSU5UTExMSUJTLgotCShQT1RGSUxFUyk6IE5ldyBtYWNyby4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCSogTWFueSBmaWxlczogV3JhcCB1c2VyLXZpc2libGUgc3RyaW5ncyB3aXRoIGdldHRleHQgaW52b2NhdGlvbi4KLQotVHVlIEFwciAgNyAxMjo0MzozNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIGhqbEBsdWNvbi5vcmcgPEguSi4gTHU+OgotCSogTWFrZWZpbGUuYW0gKGRpc3RzdHVmZik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIE1hciAzMCAxMjo0Nzo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IHZlcnNpb24gdG8gMi45LjEuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIEJyYW5jaGVkIGJpbnV0aWxzIDIuOS4KLQotU2F0IE1hciAyOCAyMzowOTowOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGaXggc29tZSBnY2MgLVdhbGwgd2FybmluZ3M6Ci0JKiBjZ19hcmNzLmMgKG51bV9jeWNsZXMpOiBDaGFuZ2UgdG8gdW5zaWduZWQgaW50LgotCShudW1hcmNzKTogTGlrZXdpc2UuCi0JKGFyY19hZGQpOiBDaGFuZ2UgbWF4YXJjcyB0byB1bnNpZ25lZCBpbnQuCi0JKGNnX2Fzc2VtYmxlKTogQ2hhbmdlIGluZGV4IHRvIHVuc2lnbmVkIGludC4KLQkqIGNnX2FyY3MuaCAobnVtX2N5Y2xlcywgbnVtYXJjcyk6IFVwZGF0ZSBkZWNsYXJhdGlvbnMuCi0JKiBjZ19wcmludC5jIChjZ19wcmludCk6IENoYW5nZSBpbmRleCB0byB1bnNpZ25lZCBpbnQuCi0JKGNnX3ByaW50X2luZGV4KTogQ2hhbmdlIGluZGV4LCBubmFtZXMsIHRvZG8sIGksIGFuZCBqIHRvIHVuc2lnbmVkCi0JaW50LgotCShjZ19wcmludF9maWxlX29yZGVyaW5nKTogQ2hhbmdlIHN5bWJvbF9jb3VudCBhbmQgaW5kZXgyIHRvCi0JdW5zaWduZWQgaW50LgotCSogY29yZS5jIChzeW1ib2xfbWFwX2NvdW50KTogQ2hhbmdlIHRvIHVuc2lnbmVkIGludC4KLQkoY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyk6IENoYW5nZSBqIHRvIHVuc2lnbmVkIGludC4KLQkoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkqIGhpc3QuYyAoaGlzdF9hc3NpZ25fc2FtcGxlcyk6IENoYW5nZSBqIHRvIHVuc2lnbmVkIGludC4KLQkoaGlzdF9wcmludCk6IENoYW5nZSBpbmRleCB0byB1bnNpZ25lZCBpIG50LiAgQWRkIGNhc3QgdG8gYXZvaWQKLQl3YXJuaW5nLgotCSogc3ltX2lkcy5jIChwYXJzZV9zcGVjKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmcuCi0JKiBzeW10YWIuYyAoc3ltdGFiX2ZpbmFsaXplKTogQ2hhbmdlIGogdG8gdW5zaWduZWQgaW50LgotCShzeW1fbG9va3VwKTogVXBkYXRlIHByaW50ZiBmb3JtYXQgc3RyaW5ncy4KLQkqIHN5bXRhYi5oIChTeW1fVGFibGUpOiBDaGFuZ2UgbGVuIHRvIHVuc2lnbmVkIGludC4KLQkqIHRhaG9lLmMgKHRhaG9lX3JlbGFkZHIpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLVR1ZSBNYXIgMjQgMTk6MDA6MTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQWRkIC0tZGVtYW5nbGUgYW5kIC0tbm8tZGVtYW5nbGUgb3B0aW9uczoKLQkqIGdwcm9mLmggKGRlbWFuZ2xlKTogRGVjbGFyZS4KLQkqIGdwcm9mLmMgKGRlbWFuZ2xlKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoT1BUSU9OX0RFTUFOR0xFLCBPUFRJT05fTk9fREVNQU5HTEUpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiZGVtYW5nbGUiIGFuZCAibm8tZGVtYW5nbGUiLgotCSh1c2FnZSk6IE1lbnRpb24gLS1kZW1hbmdsZSBhbmQgLS1uby1kZW1hbmdsZS4KLQkobWFpbik6IEhhbmRsZSBPUFRJT05fREVNQU5HTEUgYW5kIE9QVElPTl9OT19ERU1BTkdMRS4KLQkqIHV0aWxzLmMgKHByaW50X25hbWVfb25seSk6IE9ubHkgZGVtYW5nbGUgc3ltYm9sIG5hbWUgaWYgZGVtYW5nbGUKLQlpcyB0cnVlLgotCSogZ3Byb2YudGV4aSAoT3V0cHV0IE9wdGlvbnMpOiBEb2N1bWVudCBuZXcgb3B0aW9ucy4KLQotRnJpIE1hciAyMCAxOToyMTo1NiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UaHUgRmViIDEyIDE0OjM2OjA1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAodXNhZ2UpOiBVcGRhdGUgYnVnLWdudS11dGlscyBhZGRyZXNzLgotCi1TYXQgRmViICA3IDE1OjQzOjEyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLUZyaSBGZWIgIDYgMTI6MDI6MjggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5jIChhbHBoYV9JbnN0cnVjdGlvbik6IFVzZSBpbnQsIG5vdCBzaWduZWQuCi0KLUZyaSBGZWIgIDYgMDI6MDA6MTkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBjb3JlLmMgKGNvcmVfaW5pdCk6IEFkZGluZyBtaXNzaW5nICJicmVhayIuCi0KLVRodSBGZWIgIDUgMTI6NDk6MzcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVR1ZSBGZWIgIDMgMTQ6MjU6MjUgMTk5OCAgQnJlbnQgQmFjY2FsYSAgPGJhY2NhbGFAZnJlZXNvZnQub3JnPgotCi0JKiBiYmNvbnYucGw6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEVYVFJBX0RJU1QpOiBBZGQgYmJjb252LnBsLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGdwcm9mLnRleGk6IEV4dGVuc2l2ZSBhZGRpdGlvbnMgdG8gZG9jdW1lbnQgYWxsIGFyZ3VtZW50cyBhbmQKLQlvdXRwdXQgZm9ybWF0cy4KLQotCSogc3ltdGFiLmMgKHN5bXRhYl9maW5hbGl6ZSk6IFByZWZlciBmdW5jdGlvbiBzeW1ib2xzIG92ZXIgbGluZQotCXN5bWJvbHMuCi0JKGRiZ19zeW1fbG9va3VwKTogQ29ycmVjdCBkZWJ1Z2dpbmcgbWVzc2FnZXMuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiAtLXN1bSBpbXBsaWVzIC0tbGluZS4KLQotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnQpOiBXaGVuIGRvaW5nIGxpbmUgYnkgbGluZSBwcm9maWxpbmcsIGRvbid0Ci0JdXNlIGEgbm9uLWZ1bmN0aW9uIGFzIGEgbWFpbiBsaXN0aW5nIGl0ZW0uCi0KLQkqIGNhbGxfZ3JhcGguYyAoY2dfdGFsbHkpOiBXaGVuIHVzaW5nIGxpbmUgYnkgbGluZSBwcm9maWxpbmcsIHVzZQotIAl0aGUgZnVuY3Rpb24gc3ltYm9sIGFzIHRoZSBjaGlsZC4KLQotCSogc3ltdGFiLmggKE5CQlMpOiBEZWZpbmUuCi0JKFN5bSk6IEFkZCBiYl9hZGRyIGFuZCBiYl9jYWxscyBmaWVsZHMuCi0JKiBiYXNpY19ibG9ja3MuYyAoYmJfcmVhZF9yZWMpOiBTYXZlIG11bHRpcGxlIGJhc2ljIGJsb2NrcyBwZXIKLQlzeW1ib2wuCi0JKGJiX3dyaXRlX2Jsb2Nrcyk6IEFkanVzdCBmb3IgbXVsdGlwbGUgYmFzaWMgYmxvY2tzIHBlciBzeW1ib2wuCi0JKHByaW50X2V4ZWNfY291bnRzKTogRG9uJ3QgY2hlY2sgd2hldGhlciBhIHN5bWJvbCBpcyB0aGUgc3RhcnQgb2YKLQlhIGJhc2ljIGJsb2NrLiAgUHJpbnQgYWxsIGJhc2ljIGJsb2NrcyBmb3IgYSBzeW1ib2wuCi0JKGFubm90YXRlX3dpdGhfY291bnQpOiBSZXdyaXRlIHRvIHByaW50IGFsbCBiYXNpYyBibG9jayBjb3VudHMgYW5kCi0JdG8gcGF5IGF0dGVudGlvbiB0byB3aWR0aCBhcmd1bWVudC4KLQkocHJpbnRfYW5ub3RhdGVkX3NvdXJjZSk6IERvbid0IGNoZWNrIHdoZXRoZXIgc3ltYm9sIGlzIHRoZSBzdGFydAotCW9mIGEgYmFzaWMgYmxvY2suCi0KLQlNYWtlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIGEgY3Jvc3MgZ3Byb2YsIGFsdGhvdWdoIGEgZmV3IGNhc2VzIGFyZQotCXN0aWxsIG5vdCBoYW5kbGVkOgotCSogY29uZmlndXJlLmluOiBEb24ndCBzZXQgTVlfVEFSR0VULgotCSogZ3Byb2YuaDogRG9uJ3QgaW5jbHVkZSBNQUNISU5FX0guICBEb24ndCBkZWZpbmUgRk9QRU5fUkIgb3IKLQlGT1BFTl9XQjsganVzdCBnZXQgdGhlbSBmcm9tIHN5c2RlcC5oLgotCSogY29yZS5oIChtaW5faW5zbl9zaXplLCBvZmZzZXRfdG9fY29kZSk6IERlY2xhcmUuCi0JKiBjb3JlLmMgKE1JTl9JTlNOX1NJWkUpOiBEb24ndCBkZWZpbmUuCi0JKG1pbl9pbnNuX3NpemUsIG9mZnNldF90b19jb2RlKTogTmV3IHZhcmlhYmxlcy4KLQkoY29yZV9pbml0KTogSW5pdGlhbGl6ZSBtaW5faW5zbl9zaXplIGFuZCBvZmZzZXRfdG9fY29kZS4KLQkoZmluZF9jYWxsKTogTmV3IGZ1bmN0aW9uLgotCShjb3JlX2NyZWF0ZV9saW5lX3N5bXMpOiBEb24ndCB1c2UgbWluX2Rpc3QuICBTZXQgaXNfc3RhdGljIGluCi0JcGFzcyAyLgotCSogaGlzdC5jIChVTklUU19UT19DT0RFKTogRGVmaW5lLgotCSogZ3Byb2YuYyAoZGVmYXVsdF9leGNsdWRlZF9saXN0KTogQWRkICJfX21jb3VudF9pbnRlcm5hbCIuCi0JKiBnbW9uLmg6IENoYW5nZSBUQVJHRVRfYWxwaGEgdG8gX19hbHBoYV9fLgotCSogaGVydHouaDogSWZkZWYgTUFDSCwgZGVmaW5lIGhlcnR6IGFzIEhaLgotCSogYWxwaGEuYyAoYWxwaGFfSW5zdHJ1Y3Rpb24pOiBSZW5hbWUgZnJvbSBJbnN0cnVjdGlvbi4gIENoYW5nZQotCWFsbCByZWZlcmVuY2VzLgotCShhbHBoYV9maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuCi0JKiBhbHBoYS5oOiBSZW1vdmUuCi0JKiBkdW1teS5jLCBkdW1teS5oOiBSZW1vdmUuCi0JKiBpMzg2LmMgKGkzODZfaXNjYWxsKTogUmVuYW1lIGZyb20gaXNjYWxsLiAgQ2hhbmdlIGFsbAotCXJlZmVyZW5jZXMuICBDaGVjayBmb3IgY2FsbCBpbnN0cnVjdGlvbiwgbm90IGp1bXAgb3IgbGNhbGwuCi0JKGkzODZfZmluZF9jYWxsKTogUmVuYW1lIGZyb20gZmluZF9jYWxsLiAgQ29ycmVjdCBmb3IgVk1BLgotCUNvcnJlY3QgY2FsbCBkZXN0aW5hdGlvbiBjb21wdXRhdGlvbi4gIERvbid0IGRlcmVmZXJlbmNlIHN5bWJvbCBpZgotCWl0IGlzIE5VTEwuCi0JKiBpMzg2Lmg6IFJlbW92ZS4KLQkqIG5zNTMyLmMsIG5zNTMyLmg6IFJlbW92ZS4KLQkqIHNwYXJjLmMgKENBTEwpOiBEZWZpbmUuCi0JKHNwYXJjX2ZpbmRfY2FsbCk6IFJlbmFtZSBmcm9tIGZpbmRfY2FsbC4KLQkqIHNwYXJjLmg6IFJlbW92ZS4KLQkqIHRhaG9lLmM6IEluY2x1ZGUgY2dfYXJjcy5oLCBjb3JlLmgsIGhpc3QuaCwgYW5kIHN5bXRhYi5oLiAgRG9uJ3QKLQlpbmNsdWRlIHRpbWVfaG9zdC5oLgotCShDQUxMRiwgUEMpOiBEZWZpbmUuCi0JKGVudW0gdGFob2Vfb3Blcm1vZGVzLCB0YWhvZV9vcGVyYW5kZW51bSk6IERlZmluZS4gIFJlbmFtZSBhbGwKLQlyZWZlcmVuY2VzIHRvIG9wZXJtb2RlcyBvciBvcGVyYW5kZW51bSB0byB0aGVzZS4KLQkodGFob2Vfb3BlcmFuZG1vZGUpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbW9kZS4gIENhbGwgYWJvcnQgaWYKLQlzd2l0Y2ggZG9lcyBub3QgcmV0dXJuLgotCSh0YWhvZV9vcGVyYW5kbmFtZSk6IFJlbmFtZSBmcm9tIG9wZXJhbmRuYW1lLiAgQ2FsbCBhYm9ydCBpZgotCXN3aXRjaCBkb2VzIG5vdCByZXR1cm4uCi0JKHRhaG9lX29wZXJhbmRsZW5ndGgpOiBSZW5hbWUgZnJvbSBvcGVyYW5kbGVuZ3RoLiAgQ2FsbCBhYm9ydCBpZgotCXN3aXRjaCBkb2VzIG5vdCByZXR1cm4uCi0JKHRhaG9lX3JlbGFkZHIpOiBSZW5hbWUgZnJvbSByZWxhZGRyLgotCSh0YWhvZV9maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuICBVc2UgY29yZV90ZXh0X3NwYWNlCi0JcmF0aGVyIHRoYW4gdGV4dHNwYWNlLgotCSogdGFob2UuaDogUmVtb3ZlLgotCSogdmF4LmMgKENBTExTLCBQQyk6IERlZmluZS4KLQkoZW51bSBvcGVybW9kZXMsIG9wZXJhbmRlbnVtLCBzdHJ1Y3QgbW9kZWJ5dGUpOiBEZWZpbmUuCi0JKHZheF9vcGVyYW5kbW9kZSk6IFJlbmFtZSBmcm9tIG9wZXJhbmRtb2RlLiAgQ2FsbCBhYm9ydCBpZiBzd2l0Y2gKLQlkb2VzIG5vdCByZXR1cm4uCi0JKHZheF9vcGVyYW5kbmFtZSk6IFJlbmFtZSBmcm9tIG9wZXJhbmRuYW1lLiAgQ2FsbCBhYm9ydCBpZiBzd2l0Y2gKLQlkb2VzIG5vdCByZXR1cm4uCi0JKHZheF9vcGVyYW5kbGVuZ3RoKTogUmVuYW1lIGZyb20gb3BlcmFuZGxlbmd0aC4gIENhbGwgYWJvcnQgaWYKLQlzd2l0Y2ggZG9lcyBub3QgcmV0dXJuLgotCSh2YXhfcmVsYWRkcik6IFJlbmFtZSBmcm9tIHJlbGFkZHIuCi0JKHZheF9maW5kX2NhbGwpOiBSZW5hbWUgZnJvbSBmaW5kX2NhbGwuCi0JKiB2YXguaDogUmVtb3ZlLgotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBTZXQgdG8gY3lnbnVzLgotCShNWV9UQVJHRVQpOiBSZW1vdmUuCi0JKElOQ0xVREVTKTogUmVtb3ZlIC1EVEFSR0VUXyQoTVlfVEFSR0VUKSBhbmQgLURNQUNISU5FX0g9Ci0JXCIkKE1ZX1RBUkdFVCkuaFwiLgotCShncHJvZl9TT1VSQ0VTKTogQWRkIGkzODYuYywgYWxwaGEuYywgdmF4LmMsIHRhaG9lLmMsIHNwYXJjLmMuCi0JKGdwcm9mX0RFUEVOREVOQ0lFUyk6IFJlbW92ZSAkKE1ZX1RBUkdFVCkuby4KLQkoZ3Byb2ZfTERBREQpOiBMaWtld2lzZS4KLQkobm9pbnN0X0hFQURFUlMpOiBSZW1vdmUgYWxwaGEuaCwgaTM4Ni5oLCBuczUzMi5oLCBzcGFyYy5oLAotCXRhaG9lLmgsIHZheC5oLCBkdW1teS5oLgotCShFWFRSQV9ESVNUKTogUmVtb3ZlIGFscGhhLmMsIGkzODYuYywgbnM1MzIuYywgc3BhcmMuYywgdGFob2UuYywKLQl2YXguYywgZHVtbXkuYy4KLQkoJChPQkpFQ1RTKSk6IERvbid0IGRlcGVuZCB1cG9uICQoTVlfVEFSR0VUKS5oLgotCSgkKE1ZX1RBUkdFVCkubyk6IFJlbW92ZSB0YXJnZXQuCi0JKGkzODYubywgYWxwaGEubywgdmF4Lm8sIHRhaG9lLm8sIHNwYXJjLm8pOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZSwgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0KLU1vbiBEZWMgMjkgMTQ6MTc6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmMgKGNvcmVfc3ltX2NsYXNzKTogVHJlYXQgd2VhayBzeW1ib2xzIGFzIHRleHQgc3ltYm9scy4KLQlGcm9tIERlYW4gR2F1ZGV0IDxkZ2F1ZGV0QGFyY3RpYy5vcmc+LgotCi1XZWQgU2VwIDI0IDExOjM1OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgd2l0aCBjdXJyZW50IGF1dG9tYWtlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1TYXQgQXVnICA5IDE2OjI1OjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgdmVyc2lvbiBudW1iZXIgdG8gMi44LjIuICBDYWxsCi0JQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlIHNoYXJlZCBsaWJyYXJ5IGhhbmRsaW5nOyBub3cgaGFuZGxlZCBieQotCWxpYnRvb2wuICBBZGQgQU1fQ09ORklHX0hFQURFUi4gIENoYW5nZSBBQ19QUk9HX0lOU1RBTEwgdG8KLQlBTV9QUk9HX0lOU1RBTEwuICBBZGQgQU1fRVhFRVhULgotCSogTWFrZWZpbGUuYW0gKExJTkspOiBSZW1vdmUuCi0JKGdwcm9mX0xERkxBR1MpOiBSZW1vdmUKLQkoZ3Byb2ZfREVQRU5ERU5DSUVTKTogQ2hhbmdlIGxpYmJmZC5hIHRvIGxpYmJmZC5sYS4KLQkoZ3Byb2ZfTERBREQpOiBMaWtld2lzZS4KLQkoJChPQkpFQ1RTKSk6IERlcGVuZCB1cG9uIGdjb25maWcuaCBhbmQgLi4vYmZkL2NvbmZpZy5oLgotCSogZ3Byb2YuaDogVW5kZWZpbmUgUEFDS0FHRSBhbmQgVkVSU0lPTiBhZnRlciBpbmNsdWRpbmcgQkZECi0Jc3lzZGVwLmggZmlsZSwgdGhlbiBpbmNsdWRlIG5ldyBnY29uZmlnLmggZmlsZS4KLQkqIGdwcm9mLmMgKFZFUlNJT04pOiBEb24ndCBkZWZpbmUuCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIHN0YW1wLWguaW46IE5ldyBmaWxlLgotCSogZ2NvbmZpZy5pbjogTmV3IGZpbGUsIGNyZWF0ZWQgYnkgYXV0b2hlYWRlci4KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUsIGFjbG9jYWwubTQ6IFJlYnVpbGQuCi0KLVNhdCBKdW4gMjggMjM6MjA6NDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yLgotCi1Nb24gSnVuIDE2IDE1OjMxOjM5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKElOQ0xVREVTKTogQWRkIC1EREVCVUcuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVHVlIEFwciAxNSAxNDoxOTozMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlDaGFuZ2UgdG8gdXNlIGF1dG9tYWtlOgotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluOiBSdW4gQU1fSU5JVF9BVVRPTUFLRSwgQU1fTUFJTlRBSU5FUl9NT0RFLCBhbmQKLQlBTV9DWUdXSU4zMi4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLCBjcmVhdGVkIGJ5IGFjbG9jYWwuCi0JKiBNYWtlZmlsZS5pbjogUmVwbGFjZSB3aXRoIGZpbGUgY3JlYXRlZCBieSBhdXRvbWFrZSAtLWN5Z251cy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IEFwciAgMyAxMzoyMToyNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdwcm9mLmMgKFZFUlNJT04pOiBEZWZpbmUgYXMgIjIuOC4xIi4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi44LgotCi1UaHUgTWFyIDI3IDE3OjE1OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAobWFpbik6IENvcnJlY3QgY29weXJpZ2h0IG1lc3NhZ2UuCi0KLU1vbiBNYXIgMjQgMTE6MTI6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IERlZmluZSBUQVJHRVRfJChNWV9UQVJHRVQpIHdoZW4gY29tcGlsaW5nLgotICAJKiBnbW9uLmg6IFVzZSBieXRlcyBjb3VudHMgcmF0aGVyIHRoYW4gc2l6ZW9mIGluIHN0cnVjdCByYXdfcGhkcgotIAlhbmQgc3RydWN0IHJhd19hcmMuCi0KLU1vbiBNYXIgMTcgMTA6NTQ6NDcgMTk5NyAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogY2dfYXJjcy5jIChhcmNfYWRkKTogbWVtc2V0KCkgbmV3bHkgYWxsb2NlZCBhcmMgdG8gZW5zdXJlCi0JYWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQgd2l0aCAwLgotCi1TYXQgTWFyIDE1IDE5OjE3OjMxIDE5OTcgIEguSi4gTHUgIDxoamxAbHVjb24ub3JnPgotCi0JKiBzeW10YWIuaCAoZmluZF9jYWxsKTogRGVjbGFyZS4KLQkqIGNnX2FyY3MuYyAoY2dfYXNzZW1ibGUpOiBEb24ndCBkZWNsYXJlIGZpbmRfY2FsbC4KLQkqIGhpc3QuYyAoc2NhbGVfYW5kX2FsaWduX2VudHJpZXMpOiBEZWNsYXJlLgotCi1UaHUgRmViIDI3IDEyOjQ2OjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEZWZpbmUgQlNENDRfRk9STUFUIGlmIHRoZSB0YXJnZXQgbG9va3MgbGlrZSBhCi0JQlNENC40IGRlcml2ZWQgc3lzdGVtLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBBZGQgQERFRlNALgotCSogZ21vbl9pby5jIChnbW9uX291dF9yZWFkKTogSW4gQlNENDRfRk9STUFUIGNvZGUsIGdldCBwcm9mcmF0ZQotCWZyb20gcHJvZnJhdGUgZmllbGQsIG5vdCB2ZXJzaW9uIGZpZWxkLgotCi1UaHUgSmFuIDE2IDE3OjQyOjU0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZHVtbXkuYyAoZmluZF9jYWxsKTogQ2xlYXIgaWdub3JlX2RpcmVjdF9jYWxscy4KLQotVHVlIERlYyAzMSAxNTo0NDoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICguYy5vKTogQWRkIC1EX0dOVV9TT1VSQ0UuICBQdXQgJChDRkxBR1MpIGF0IHRoZQotCWVuZC4KLQkoZ3Byb2YpOiBQdXQgJChDRkxBR1MpIGFmdGVyIHRoZSBvdGhlciBvcHRpb25zLgotCi1UdWUgTm92IDI2IDE3OjA4OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotV2VkIE9jdCAgMiAxNToyMzoxNiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmMgKGZpbmRfY2FsbCk6IEFsaWduIHBfbG93cGMgdG8gYXZvaWQgYnVzIGVycm9yLgotCi1UdWUgT2N0ICAxIDE1OjU4OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAodXNhZ2UpOiBQcmludCBidWcgcmVwb3J0IGFkZHJlc3MuCi0JKG1haW4pOiBDaGFuZ2UgdmVyc2lvbiBwcmludGluZyB0byBtYXRjaCBjdXJyZW50IEdOVSBzdGFuZGFyZHMuCi0KLUZyaSBBdWcgMzAgMTI6MTY6MTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnbW9uLmg6IFJlcGxhY2UgI2VsaWYgd2l0aCAjZWxzZS8jZW5kaWYuCi0KLVRodSBBdWcgMjkgMTc6MDQ6MTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEF1ZyAyMiAxNzoxMjozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIEhMREVOVi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChITERFTlYpOiBOZXcgdmFyaWFibGUuCi0JKGdwcm9mKTogVXNlICQoSExERU5WKS4KLQotV2VkIEF1ZyAgNyAxNDo0Mzo1MSAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb3JlLmMgKHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MpOiBDYXN0IHhtYWxsb2MgcmV0dXJuLgotCi1UaHUgSnVsICA0IDEyOjAxOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAoVkVSU0lPTik6IERlZmluZSBhcyAiMi43LjEiLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLQkqIGJiX2V4aXRfZnVuYy5jOiBSZW5hbWUgZnJvbSBfX2JiX2V4aXRfZnVuYy5jLCBzbyB0aGF0IGl0IGNhbiBiZQotCXN0b3JlZCBvbiBhIFN5c3RlbSBWIGZpbGUgc3lzdGVtLgotCi1UaHUgSnVuIDI3IDExOjM2OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0lTQ19QT1NJWC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChncHJvZik6IFBhc3MgJChDRkxBR1MpIGR1cmluZyBsaW5rLgotCSogaGVydHouYzogRG9uJ3QgaW5jbHVkZSA8c3lzL3RpbWUuaD47IGxldCBzeXNkZXAuaCBoYW5kbGUgdGhhdC4KLQlJZiBIQVZFX1NFVElUSU1FUiBpcyBub3QgZGVmaW5lZCwgdHJ5IHVzaW5nIHN5c2NvbmYuCi0KLU1vbiBKdW4gMjQgMTg6Mjc6MjggMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKGV4ZWNfcHJlZml4LCBiaW5kaXIsIGxpYmRpciwgbWFuZGlyLCBpbmZvZGlyLCBkYXRhZGlyLAotCUlOU1RBTExfUFJPR1JBTSwgSU5TVEFMTF9EQVRBKTogVXNlIGF1dG9jb25mLXNldCB2YWx1ZXMuCi0JKiBjb25maWd1cmUuaW4gKEFDX1BSRVJFUSk6IGF1dG9jb25mIDIuNSBvciBoaWdoZXIuCi0JKEFDX1BST0dfSU5TVEFMTCk6IGFkZGVkLgotCSogY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gSnVuIDI0IDEyOjAzOjA5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBPbiBhbHBoYSotKi1vc2YqLCBsaW5rIGFnYWluc3QgbGliYmZkLmEgaWYgbm90Ci0JdXNpbmcgc2hhcmVkIGxpYnJhcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0KLVR1ZSBKdW4gMTggMTc6MzU6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6IFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQkqIHNvdXJjZS5jIChzb3VyY2VfZmlsZV9sb29rdXBfcGF0aCk6IExpa2V3aXNlLgotCi1Nb24gQXByICA4IDE0OjQ0OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBQZXJtaXQgLS1lbmFibGUtc2hhcmVkIHRvIHNwZWNpZnkgYSBsaXN0IG9mCi0JZGlyZWN0b3JpZXMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBNYXIgMjEgMTc6MTg6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBNb3ZlIGZpbGVuYW1lIGFuZCBmdW5jX25hbWUKLQlpbnNpZGUgaWZkZWYgd2hlcmUgdGhleSBhcmUgdXNlZC4KLQotCSogY29yZS5jIChjb3JlX3N5bV9jbGFzcyk6IFBhcmVudGhlc2l6ZSAmJiB3aXRoaW4gfHwuCi0JKiBzeW10YWIuYyAoc3ltdGFiX2ZpbmFsaXplKTogQ29ycmVjdCBwYXJlbnRoZXNpemF0aW9uLgotCi0JKiBjZ19wcmludC5oIChjZ19wcmludF9maWxlX29yZGVyaW5nKTogRGVjbGFyZS4KLQkoY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcpOiBEZWNsYXJlLgotCi0JKiBfX2JiX2V4aXRfZnVuYy5jIChfX2JiX2V4aXRfZnVuYyk6IFJlcGxhY2UgYmNvcHkgd2l0aCBtZW1jcHkuCi0JKiBjZ19hcmNzLmMgKGFyY19hZGQpOiBMaWtld2lzZS4KLQkqIGNnX3ByaW50LmMgKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjEgMTc6MDI6MDIgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZ3Byb2YuYyAoZGVmYXVsdF9leGNsdWRlZF9saXN0KTogQWRkICJfX21jb3VudCIuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiBDaGFuZ2UgaWZkZWYgX19vc2ZfXyB0byBfX2FscGhhX18uCi0KLQkqIGdtb25faW8uYyAoZ21vbl9vdXRfcmVhZCk6IElmIEJTRDQ0X0ZPUk1BVCBpcyBkZWZpbmVkLCBnZXQgdGhlCi0JcHJvZmlsaW5nIHJhdGUgZnJvbSB0aGUgaGVhZGVyLgotCi0JKiBnbW9uLmggKHN0cnVjdCByYXdfcGhkcik6IE9ubHkgaW5jbHVkZSBwYWQgaWYgYm90aCBfX2FscGhhX18gYW5kCi0JX19vc2ZfXyBhcmUgZGVmaW5lZC4gIEFkZCBuZXcgZmllbGRzIGlmIEJTRDQ0X0ZPUk1BVCBpcyBkZWZpbmVkLgotCi0JKiBhbHBoYS5oIChNSU5fSU5TTl9TSVpFKTogRGVmaW5lLgotCSogY29yZS5jIChNSU5fSU5TTl9TSVpFKTogSWYgbm90IGRlZmluZWQsIGRlZmluZSBhcyAxLgotCShjb3JlX3N5bV9jbGFzcyk6IElnbm9yZSBkZWJ1Z2dpbmcgc3ltYm9scy4KLQkoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogVXNlIE1JTl9JTlNOX1NJWkUgd2hlbiBnYXRoZXJpbmcgbGluZQotCWluZm9ybWF0aW9uLgotCi1XZWQgTWFyIDIwIDE4OjE1OjQ3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjZ19wcmludC5jIChjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyk6IEZpeCBfX0dOVUNfXyBtaXNzcGVsbGVkCi0JYXMgX19HTlVfQ19fLgotCShvcmRlcl9hbmRfZHVtcF9mdW5jdGlvbnNfYnlfYXJjcyk6IExpa2V3aXNlLgotCi1UdWUgTWFyIDEyIDEyOjE5OjUwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi44LgotCi1TdW4gRmViIDE4IDE1OjA2OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayBmb3IgJ2RvIG5vdCBtaXgnIGZyb20gbmF0aXZlIGxpbmtlciBiZWZvcmUKLSAJdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVR1ZSBGZWIgMTMgMTU6MzI6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVdlZCBGZWIgIDcgMTQ6MDM6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IERvbid0IHNldCBDQy4gIExvb2sgZm9yIC0tZW5hYmxlLXNoYXJlZC4gIFNldAotCUJGRExJQiBhbmQgSExERkxBR1MgYW5kIHN1YnN0aXR1dGUgdGhlbS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChMSUJTKTogVXNlIEBCRkRMSUJALgotCShITERGTEFHUyk6IE5ldyB2YXJpYWJsZS4KLQkoZ3Byb2YpOiBVc2UgJChITERGTEFHUykuCi0KLU1vbiBGZWIgIDUgMTY6MzQ6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JU3VwcG9ydCBmb3IgYnVpbGRpbmcgYmZkIGFuZCBvcGNvZGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMsIGJhc2VkIG9uCi0JcGF0Y2hlcyBmcm9tIEFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIE1ha2VmaWxlLmluIChMSUJERVBTKTogTmV3IHZhcmlhYmxlLgotCShMSUJTKTogVXNlIC1MLi4vYmZkIC1sYmZkLgotCShncHJvZik6IERlcGVuZCB1cG9uICQoTElCREVQUykgcmF0aGVyIHRoYW4gJChMSUJTKS4KLQotU2F0IERlYyAzMCAxMDoxMTowMyAxOTk1ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKGxvbmdfb3B0aW9ucyk6IEFkZCAiLS1mdW5jdGlvbi1vcmRlcmluZyIgYW5kCi0JIi0tZmlsZS1vcmRlcmluZyIgb3B0aW9ucy4KLQkodXNhZ2UpOiBBZGQgbmV3IG9wdGlvbnMgdG8gdXNhZ2UgbWVzc2FnZS4KLQkobWFpbik6IEhhbmRsZSBuZXcgb3B0aW9ucy4KLQkqIGdwcm9mLmggKFNUWUxFX0ZVTkNUSU9OX09SREVSKTogRGVmaW5lLgotCShTVFlMRV9GSUxFX09SREVSKTogRGVmaW5lLgotCShmdW5jdGlvbl9tYXBwaW5nX2ZpbGUpOiBEZWNsYXJlLgotCSogY2dfYXJjcy5jIChhcmNzLCBudW1hcmNzKTogTmV3IGdsb2JhbHMuCi0JKGFyY19hZGQpOiBQdXQgbmV3IGFyY3MgaW50byB0aGUgYXJjIGFycmF5IHNvIHRoZSBmdW5jdGlvbi9maWxlCi0Jb3JkZXJpbmcgY29kZSBjYW4gZXhhbWluZSB0aGVtLgotCSogY2dfYXJjcy5oIChzdHJ1Y3QgYXJjKTogTmV3IGZpZWxkICJoYXNfYmVlbl9wbGFjZWQiLgotCShhcmNzLCBudW1hcmNzKTogRGVjbGFyZSBuZXcgZ2xvYmFscy4KLQkqIGNvcmUuYyAoc3ltYm9sX21hcCwgc3ltYm9sX21hcF9jb3VudCk6IE5ldyBnbG9iYWxzLgotCShyZWFkX2Z1bmN0aW9uX21hcHBpbmdzKTogTmV3IGZ1bmN0aW9uIHRvIHJlYWQgaW4gYSBmdW5jdGlvbgotCXRvIG9iamVjdCBtYXAgZmlsZS4KLQkoY29yZV9pbml0KTogQ2FsbCByZWFkX2Z1bmN0aW9uX21hcHBpbmdzIGlmIGEgZnVuY3Rpb24gbWFwcGluZwotCWZpbGUgZXhpc3RzLgotCShjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogSGFuZGxlIGZ1bmN0aW9uIHRvIG9iamVjdCBmaWxlCi0JbWFwcGluZ3MuCi0JKiBzeW10YWIuaCAoc3RydWN0IHN5bSk6IE5ldyBmaWVsZHMgIm1hcHBlZCIsICJoYXNfYmVlbl9wbGFjZWQiLAotCSJudXNlcyIsICJwcmV2Ii4KLQkqIGNnX3ByaW50LmMgKGNtcF9hcmNfY291bnQpOiBOZXcgZnVuY3Rpb24gZm9yIHNvcnRpbmcgYXJjcy4KLQkoY21wX2Z1bl9udXNlcyk6IExpa2V3aXNlIGZvciBmdW5jdGlvbnMuCi0JKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKTogTmV3IGZ1bmN0aW9uIHRvIHByaW50IGEgc3VnZ2VzdGVkCi0JZnVuY3Rpb24gb3JkZXJpbmcuCi0JKGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcpOiBMaWtld2lzZSBmb3Igb3JkZXJpbmcgLm8gZmlsZXMuCi0JKG9yZGVyX2FuZF9kdW1wX2Z1bmN0aW9uc19ieV9hcmNzKTogSGVscGVyIGZ1bmN0aW9uIGZvciBmdW5jdGlvbgotCWFuZCBvYmplY3QgZmlsZSBvcmRlcmluZyBjb2RlLgotCi1TdW4gRGVjIDI0IDIxOjMyOjI3IDE5OTUgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29yZS5jIChjb3JlX3N5bV9jbGFzcyk6IElnbm9yZSBzeW1ib2xzIHdpdGhvdXQgQlNGX0ZVTkNUSU9OCi0Jc2V0IGlmIGlnbm9yZV9ub25fZnVuY3Rpb24gaXMgc2V0LgotCSogZ3Byb2YuaCAoaWdub3JlX25vbl9mdW5jdGlvbnMpOiBEZWNsYXJlLgotCSogZ3Byb2YuYyAoaWdub3JlX25vbl9mdW5jdGlvbnMpOiBEZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCAiaWdub3JlLW5vbi1mdW5jdGlvbnMiLgotCSh1c2FnZSk6IEFkZCBuZXcgb3B0aW9ucy4KLQkobWFpbik6IFJlY29nbml6ZSAiLUQiIGFuZCAiLS1pZ25vcmUtbm9uLWZ1bmN0aW9ucyIgb3B0aW9uLgotCi1UdWUgTm92IDIxIDEzOjI0OjM5IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLm0uYyk6IFN0cmlwIG91dCBkaXJlY3RvcnkgbmFtZSBmcm9tIGZ1bmN0aW9uCi0JbmFtZS4KLQotCSogaGlzdC5jIChzY2FsZV9hbmRfYWxpZ25fZW50cmllcyk6IERvbid0IHVzZSBERUZVTl9WT0lELiAgRG8KLQlVTklUU19UT19DT0RFIGFkanVzdG1lbnQgdW5jb25kaXRpb25hbGx5OyBjb21waWxlciBjYW4gb3B0aW1pemUKLQlhd2F5IHplcm8tb2Zmc2V0IGNhc2UuICBSZWZlciB0byBzY2FsZWRfYWRkciwgbm90IGFsaWduZWRfYWRkci4KLQotCSogdmF4LmM6IERvbid0IGluY2x1ZGUgdmF4LmggaGVyZS4KLQotVGh1IE5vdiAxNiAwMzo0MTozNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCVZlcnNpb24gMi42IHJlbGVhc2VkLgotCi1XZWQgTm92ICA4IDExOjQwOjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZ3Byb2YuYyAobWFpbik6IENhc3QgZ2V0ZW52IHJldHVybiB2YWx1ZS4KLQotTW9uIE5vdiAgNiAxNTowNTowMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBOZXcgdGFyZ2V0LgotCi1XZWQgTm92ICAxIDEyOjUxOjIxIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVFNUVUZGKTogIFJlbmFtZSB0byBHRU5fRklMRVMsIHRvIGF2b2lkIGNvbmZ1c2lvbi4KLQkoYWxsKTogIERlcGVuZCBvbiAkKEdFTl9GSUxFUyksIG5vdCBkaXN0c3R1ZmYgKHdoaWNoIGFsc28gZGVwZW5kcwotCW9uIGluZm8pLgotCi1XZWQgTm92ICAxIDE1OjIzOjE1IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBzeW1faWRzLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCi1XZWQgT2N0IDI1IDEzOjI0OjMxIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIEFsc28gbWFrZSBpbmZvLgotCShtb3N0bHljbGVhbik6ICBEb24ndCByZW1vdmUgZ3Byb2YuaW5mbyouCi0JKG1haW50YWluZXItY2xlYW4gcmVhbGNsZWFuKTogIEFsc28gcmVtb3ZlICouaW5mbyouCi0KLUZyaSBPY3QgIDYgMTY6MjU6MzIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNb24gU2VwIDI1IDIyOjQ5OjMyIDE5OTUgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVjaWVzIGZvciAkKE9CSlMpIG9uIGhlYWRlciBmaWxlcy4KLQotCSogY2dfcHJpbnQuYyAocHJpbnRfY3ljbGUsIHByaW50X21lbWJlcnMsIGNnX3ByaW50X2luZGV4KTogRml4IG5ldwotCXN0eWxlIG91dHB1dCBmb3JtYXQgdG8gbWFrZSBpdCBjb25zaXN0ZW50LgotCSogZHVtbXkuYyAoZmluZF9jYWxsKTogRml4IHR5cG8gaW4gZXJyb3IgbWVzc2FnZS4KLQotV2VkIFNlcCAyMCAxMzoyMTowMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChtYWludGFpbmVyLWNsZWFuKTogTmV3IHRhcmdldCwgc3lub255bSBmb3IKLQlyZWFsY2xlYW4uCi0KLUZyaSBTZXAgIDggMTQ6Mzg6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgaW4gJCh0b29sZGlyKS4KLQotRnJpIEF1ZyAyNSAxNTozMDowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU5TMzJLIGNoYW5nZXMgZnJvbSBJYW4gRGFsbDoKLQkqIGNvbmZpZ3VyZS5pbjogVXNlIG5zMzJrLCBub3QgbnM1MzIuCi0JKiBuczUzMi5jOiBJbmNsdWRlIHN5bXRhYi5oLgotCShmaW5kX2NhbGwpOiBSZW5hbWVkIGZyb20gZmluZGNhbGwuICBQcmludCBhIG1lc3NhZ2UuCi0JKiBuczUzMi5oOiBSZW1vdmUgZHVtbXkuaCBjb21tZW50cy4KLQotVHVlIEF1ZyAyMiAxMDowMDo0NSAxOTk1ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgImJyb2tlbnNlZCIgaGFjaywgdW5uZWNlc3Nhcnkgbm93Ci0JdGhhdCB3ZSdyZSB1c2luZyBhdXRvY29uZi4KLQotV2VkIEp1bCAxOSAxODo0NjoxMyAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogY29yZS5jIChnZXRfc3JjX2luZm8pOiBDYXN0IGFyZyA3IG9mIGJmZF9maW5kX25lYXJlc3RfbGluZQotCXRvIHByb3BlciB0eXBlIG9mICJ1bnNpZ25lZCBpbnQgKiIuCi0KLUZyaSBKdW4gMTYgMTU6Mjk6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgY2hhbmdlcXVvdGUgYXJvdW5kIHVzZSBvZiBbXS4KLQotTW9uIEp1biAxMiAxMjoxNDo1MiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4sIHJlYWxjbGVhbik6IFJlbW92ZSBjb25maWcuY2FjaGUgYW5kCi0JICBjb25maWcubG9nLgotCi1XZWQgTWF5IDE3IDE3OjU2OjUzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1ha2VmaWxlKTogQWRkZWQgY29uZmlnLnN0YXR1cyB0byBkZXBlbmRlbmN5IGxpc3QuCi0JICAoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0JICAoU0hFTEwpOiBOZXcgZGVmaW5pdGlvbi4KLQotVHVlIEFwciAyNSAyMToxMToxMiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERlcGVuZCBvbiAiYWxsIi4KLQotVGh1IEFwciAyMCAxNzoyOTowNyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFsbCByZWZlcmVuY2VzIHRvIE1ZX01BQ0hJTkUgdG8gTVlfVEFSR0VULAotCXRvIG1hdGNoIGNvbmZpZ3VyZSBzY3JpcHQuCi0KLVdlZCBBcHIgMTkgMTE6MTk6MzcgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBnZW4tYy1wcm9nLmF3azogQ2hhbmdlZCByZWZlcmVuY2UgdG8gIm1ha2UtYy1wcm9nLmF3ayIgaW4KLQkgIGNvbW1lbnQgZW1pdHRlZCBieSB0aGlzIHNjcmlwdCB0byBnZW4tYy1wcm9nLmF3ay4KLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQ29udmVydGVkIHRvIHVzZSBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogTmV3IGZpbGUsIGdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMy4KLQkqIGNvbmZpZy97bXQtYWxwaGEsIG10LWR1bW15LCBtdC1pMzg2LCBtdC1uczUzMiwgbXQtc3BhcmMsCi0JICBtdC10YWhvZSwgbXQtdmF4fTogUmVtb3ZlZC4KLQotTW9uIE1hciAxMyAyMTo0NDoyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBfX2JiX2V4aXRfZnVuYy5jOiBOZXcgZmlsZSwgZnJvbSBEYXZpZCBNb3NiZXJnZXItVGFuZy4KLQotCVRodSBGZWIgIDkgMTY6NTY6MDcgMTk5NSAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBBbGwgKi5jOiBNb3JlIGNsZWFudXAgdG93YXJkcyBHTlUgZm9ybWF0LgotCi0JKiBnbW9uX291dC5oIChzdHJ1Y3QgZ21vbl9oaXN0X2hkciwgc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZCk6IAotCXJlcGxhY2VkIHNpemVvZiAoYmZkX3ZtYSkgYnkgc2l6ZSAoY2hhciopIGJlY2F1c2UgS2VuIHRlbGxzIG1lCi0JdGhhdCBiZmRfdm1hIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSBhdCBsZWFzdCBhcyBiaWcgYXMgYSBwb2ludGVyLgotCi0JKEdNT05fUmVjb3JkX3RhZyk6IGFkZGVkIGV4cGxpY2l0IGVudW1lcmF0aW9uIHZhbHVlcyB0byBlbnN1cmUKLQljb21wYXRpYmlsaXR5IGFjcm9zcyBjb21waWxlcnMuCi0KLQkqIGdtb25faW8uYyAoZ2V0X3ZtYSwgcHV0X3ZtYSk6IHJlcGxhY2VkIHNpemVvZihiZmRfdm1hKSBieQotCXNpemVvZihjaGFyKikuCi0KLVR1ZSBGZWIgIDcgMTc6MjQ6MTIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogQWxsICouYyBhbmQgKi5oIGZpbGVzOiBSYW4gImluZGVudCAtZ251Ii4gIENsZWFuZWQgdXAgYSBjb3VwbGUKLQlvZiBjb25zdHJ1Y3RzIEdOVSBpbmRlbnQgY291bGRuJ3QgaGFuZGxlLiAgQmxvY2sgY29tbWVudHMgbm90IHlldAotCXJld3JpdHRlbiBpbiBHTlUgZm9ybWF0LgotCi0JKiBncHJvZi5jIChWRVJTSU9OKTogQ2hhbmdlZCB0byAyLjYsIHRvIGdldCBpbiBzeW5jIGZvciBuZXh0Ci0JYmludXRpbHMgcmVsZWFzZS4KLQotU3VuIEZlYiAgNSAxNjoxOTo0NiAxOTk1ICBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHU+Ci0KLQkqIHN5bXRhYi5jIChzeW10YWJfZmluYWxpemUpOiBlbnN1cmUgZ2xvYmFscyBzeW1ib2xzIHJlYWxseQotCWFyZSBmYXZvcmVkIG92ZXIgc3RhdGljIG9uZXMtLS1ldmVuIGlmIHRoZWlyIG5hbWUgbG9va3MgbGVzcwotCXByZWZlcmFibGU7IHRoaXMgaXMgaW1wb3J0YW50IGZvciBIUC1VWDsgZm9yIGV4YW1wbGUsIHRoZXJlCi0JaXMgYSBzdGF0aWMgbGFiZWwgTHRleHRfc29tZXRoaW5nIHRoYXQgYWxpYXNlcyB0aGUgZ2xvYmFsCi0Jc3ltYm9sIF9zdGFydAotCi0JKiBoaXN0LmMgKGhpc3RfcHJpbnQpOiBhdXRvLXNjYWxpbmcgaXMgbm93IGluIGVmZmVjdCBmb3IgRlNGLXN0eWxlCi0Jb3V0cHV0IG9ubHk7IGFsc28sIGF1dG8tc2NhbGluZyBpcyBub3cgcGVyZm9ybWVkIGJhc2VkIG9uCi0JcGVyLWNhbGwsIHJhdGhlciB0aGFuIHRvdGFsIGV4ZWN1dGlvbiB0aW1lLCB3aGljaCBpcyB3aGF0IGl0IHdhcwotCW1lYW50IHRvIGJlLgotCi0JKiBncHJvZi5oIChGaWxlX0Zvcm1hdCk6IG5ldyB0eXBlLgotCi0JKiBncHJvZi5jIChWRVJTSU9OKTogdXBwZWQgdG8gMi43LS0tc2VlbXMgdG8gYmUgY29tcGxldGVseSBvdXQgb2YKLQlzeW5jIHdpdGggQ3lnbnVzIHZlcnNpb24gbnVtYmVycyB0aG91Z2guLi4KLQotCShsb25nX29wdGlvbnMpOiByZW5hbWVkIC0tZ21vbi1pbmZvIHRvIC0tZmlsZS1pbmZvLCAtLXdpZHRoIGFkZGVkLAotCXJlbmFtZWQgLS1vbGQtZmlsZS1mb3JtYXQgdG8gLS1maWxlLWZvcm1hdAotCShtYWluKTogZGl0bzsgYWxzbyBhZGRlZCBzdXBwb3J0IHRvIHJlYWQgcHJvZiBmaWxlcywgYnV0IGFzCi0JbW9uX291dF9yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkLCBpdCdzICNpZmRlZidkIG91dCBmb3Igbm93Ci0KLQkodXNhZ2UpOiB1cGRhdGUgdG8gcmVmbGVjdCBuZXcgb3B0aW9ucy4KLQotCSogZ21vbl9pby5jOiByZXBsYWNlZCAib2xkX2ZpbGVfZm9ybWF0IiBieSBtb3JlIGdlbmVyYWwKLSAgICAgICAgImZpbGVfZm9ybWF0IiBvcHRpb24KLQotCSogZ21vbi5oIChzdHJ1Y3QgcmF3X3BoZHIpOiBmaXhlZCBkZWNsYXJhdGlvbiBmb3IgT1NGLzEuCi0KLQkqIGNvcmUuYyAoY29yZV9zeW1fY2xhc3MpOiBhZGRlZCBiYWNrIGNoZWNrIGZvciBfX2dudV9jb21waWxlZCBhbmQKLQlfX19nbnVfY29tcGlsZWQgZm9yIHRoZSBiZW5lZml0IG9mIHN5c3RlbXMgd2l0aG91dAotCWJmZF9maW5kX25lYXJlc3RfbGluZSgpIHN1cHBvcnQKLQotCShnZXRfc3JjX2luZm8pOiBub3cgdGhlIGxpYmJmZCBpcyBmaXhlZCwgaW52b2tlIGJmZF9maW5kX25lYXJlc3RfbGluZSgpCi0Jd2l0aCBzZWN0aW9uLXJlbGF0aXZlIGFkZHJlc3NlcwotCi0JKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMpOiBnZXRfc3JjX2luZm8oKSBjYWxscyBhcmUgY3VycmVudGx5Ci0JZW5hYmxlZCBmb3IgT1NGLzEgb25seS4gIEl0IGFwcGVhcnMgdG8gd29yayBhbGxyaWdodCBmb3IgU3VuT1MKLSAgICAgICAgNC4xLnggYXMgd2VsbCwgYnV0IG9uIFNQQVJDcyBpdCBnZXRzIHBhaW5mdWxseSBzbG93IHdpdGggdGhlCi0gICAgICAgIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgYW91dF8zMl9maW5kX25lYXJlc3RfbGluZSgpOwotICAgICAgICB1bmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHRoYXQgc3RhdGljIGZ1bmN0aW9ucyB3aWxsIG5vdCBoYXZlIHRoZWlyCi0JZmlsZW5hbWUgcHJpbnRlZCBpbiB0aGUgY2FsbC1ncmFwaCBmdW5jdGlvbiBpbmRleDsgbGluZS1sZXZlbAotCXByb2ZpbGluZyBzaG91bGQgc3RpbGwgd29yaywgYnV0IHJlcXVpcmVzIHNvbWUgcGF0aWVuY2UKLQotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnRfaW5kZXgpOiBzYW5pdGlzZWQgcHJpbnRpbmcgb2YgaW5kZXggd2hlbgotCXVzaW5nIEZTRi1zdHlsZSBvdXRwdXQ7IGluIHBhcnRpY3VsYXIsIG91dHB1dCB3aWR0aCBpcyBub3cgY29udHJvbGxlZAotCXZpYSBvcHRpb24gLS13aWR0aCBhbmQgdGhlIGZ1bmN0aW9uIHRyaWVzIGhhcmQgdG8ga2VlcCBjb2x1bW5zCi0JYWxpZ25lZCBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiAob2NjYXNpb25hbCkgbG9uZyBuYW1lcwotCi0JKiBOT1RFUzogYSBmaXJzdCBzaG90IGF0IHVwZGF0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgotCi1XZWQgRmViICAxIDE5OjA3OjQ0IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogY29yZS5jIChjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zKTogZml4ZWQgY29tcHV0YXRpb24gb2YgbWluX3ZtYQotCWFuZCBtYXhfdm1hLgotCi0JKiAqLmM6IHJlbW92ZWQgcmNzaWQuCi0KLVR1ZSBKYW4gMzEgMTY6MTg6MTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTG90cyBvZiBjaGFuZ2VzIGZyb20gRGF2aWQgTW9zYmVyZ2VyLVRhbmc6Ci0KLQlUdWUgT2N0IDI1IDE5OjIwOjE0IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCTxkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1PgotCi0JKiBncHJvZi5jIChtYWluKTogcHV0IHBhcmVudGhlc2VzIGFyb3VuZCAmIHdpdGhpbiAmJi4KLQotCSogYmFzaWNfYmxvY2tzLmMgKGJiX3JlYWRfcmVjKTogcHJpbnQgd2FybmluZyBtZXNzYWdlIChvbmNlKSB3aGVuCi0JaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cy4KLQotCSogc291cmNlLmMgKHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lKTogY29ycmVjdGVkIHNlY29uZCBhcmd1bWVudCB0bwotCXN0cmNtcCgpLgotCi0JKiBoaXN0LmMgKHByaW50X2hlYWRlcik6IG1lcmdlZCBGcmkgT2N0IDIxIDE4OjU4OjAyIDE5OTQgY2hhbmdlIGJ5Ci0JS2VuIFJhZWJ1cm4gPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPiBmcm9tIGJpbnV0aWxzLTIuNS4xLgotCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiB0aGUgb3V0cHV0IHN0dWxlIFNUWUxFX0dNT05fSU5GTyBpcyBub3cKLQlzdXBwb3J0ZWQgYm90aCBmb3Igb2xkIGFuZCBuZXcgKHZlcnNpb25lZCkgZ21vbi5vdXQgZmlsZXMuICBPbGQKLQlmaWxlcyBhcmUgaWRlbnRpZmllZCBhcyB2ZXJzaW9uIDAuCi0KLQkqIGdtb24uaCAoc3RydWN0IHJhd19hcmMpOiBjb3VudCBmaWVsZCBpcyBub3cgc2l6ZW9mKGxvbmcpIGJ5dGVzCi0JbG9uZyAoaW5zdGVhZCBvZiA0KSBiZWNhdXNlIHRoYXQgaXMgd2hhdCBPU0YvMSB2My4wIHVzZXMuCi0KLQkqIGNvcmUuYzogbWlub3IgZml4ZXMgYW5kIGRlYnVnZ2luZyBpbmZvIGNoYW5nZXMuCi0KLQlTdW4gU2VwIDExIDE4OjQ3OjQ3IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBjb3JlLmMgKGNvcmVfaW5pdCk6IGlmIC50ZXh0IGNhbm5vdCBiZSBmb3VuZCwgdHJ5ICRDT0RFJCAodGhlCi0JbmFtZSBvZiB0aGUgdGV4dC1zZWN0aW9uIHVuZGVyIEhQLVVYKS4KLQotCSogaGlzdC5jIChoaXN0X2Fzc2lnbl9zYW1wbGVzKTogZml4ZWQgb2ZmLWJ5LW9uZSBidWc6IGhpZ2hwYwotCXBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBzYW1wbGluZyBiaW4sIHNvIGhpc3Rfc2NhbGUgc2hvdWxkIGJlCi0JY29tcHV0ZWQgYXMgImhpc3Rfc2NhbGUgLz0gaGlzdF9udW1fYmlucyIsIG5vdCAiaGlzdF9zY2FsZSAvPQotCWhpc3RfbnVtX2JpbnMgLSAxIi4KLQotCSogZ21vbl9pby5jLCBoaXN0LmMsIGhpc3QuaDogcmVuYW1lZCBoaXN0X251bV9zYW1wbGVzIHRvCi0JaGlzdF9udW1fYmlucy4KLQotCSogY29uZmlndXJlLmluOiBhZGRlZCBhbHBoYS0qLSopIGZvciBwZXItdGFyZ2V0IGNvbmZpZy4KLQotCSogYWxwaGEuYywgYWxwaGEuaDogY3JlYXRlZC4KLQotCSogZ3Byb2YuYyAoZGVmYXVsdF9leGNsdWRlZF9saXN0KTogPGxvY29yZT4sIDxoaWNvcmU+IGFkZGVkLgotCi0JKiBjb3JlLmMgKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMsIGNvcmVfY3JlYXRlX2xpbmVfc3ltcyk6Ci0JZXhwbGljaXRseSBrZWVwIHR3byBzZW50aW5lbHMgIjxsb2NvcmU+IiBhbmQgIjxoaWNvcmU+IiB0aGF0IGNhdGNoCi0JYWxsIGFkZHJlc3NlcyBvdXRzaWRlIHRoZSB0ZXh0LXNwYWNlLiAgVGh1cywgc3ltX2xvb2t1cCgmc3ltdGFiLAotCWFkZHIpIGNvbnRpbnVlcyB0byBndWFyYW50ZWUgbm90IHRvIHJldHVybiAwIG9uIGFueSBhZGRyZXNzLiAgSXQKLQlhbHNvIGF2b2lkcyBpbmNvcnJlY3RseSBjcmVkaXRpbmcgdGhlIGZpcnN0L2xhc3Qgc3ltYm9sIGluIHRoZQotCXRleHQtc3BhY2UuCi0KLQkqIGNvcmUuYyAoY29yZV9jcmVhdGVfbGluZV9zeW1zKTogYWx3YXlzIGNyZWF0ZSBmdW5jdGlvbiBzeW1ib2xzCi0JZmlyc3QsIHRoZW4gbWVyZ2UgaW4gbGluZSBzeW1ib2xzOyB0aGlzIGlzIHNvIHRoYXQgaWYgcGFydHMgb2YgdGhlCi0JcHJvZ3JhbSB3ZXJlIGNvbXBpbGVkIHdpdGhvdXQgLWcsIGZ1bmN0aW9uLWxldmVsIHN5bWJvbHMgYXJlCi0JYXZhaWxhYmxlIHN0aWxsLgotCi0JKiB1dGlscy5jIChwcmludF9uYW1lX29ubHkpOiBzdXBwb3J0IGZvciBwcmludF9wYXRoIGFkZGVkLgotCi0JKiBzeW10YWIuYyAoY21wX2FkZHIpOiBhbHNvIHVzZSBpc19mdW5jIGZsYWcgaW4gY29tcGFyaXNvbi4KLQkoc3ltdGFiX2ZpbmFsaXplKTogcmV0dXJuIGltbWVkaWF0ZWx5IHdoZW4gdGFibGUgZW1wdHk7IG5vdwotCW1vcmUgY2FyZWZ1bCBhYm91dCBnZXR0aW5nIHJpZCBvZiB0aGUgcmlnaHQgZHVwbGljYXRlIHN5bWJvbC4KLQotCSogc3BhcmMuYyAoZmluZF9jYWxsKTogbWFueSBmaXhlcy0tLXRoaXMgZnVuY3Rpb24gd2FzIHJhdGhlcgotCWJvdGNoZWQgaW4gYmludXRpbHMtMi40IGFscmVhZHk7IGl0IHNob3VsZCB3b3JrIGFnYWluLgotCi0JKiBzb3VyY2UuYyAoc291cmNlX2ZpbGVfbG9va3VwX3BhdGgpOiBQQVRIIGlzIG5vdyBzdHJkdXAnZWQgKGl0IGlzCi0Jbm90IGdvb2QgdG8gcmVseSBvbiBnZXRfc3JjX2luZm8oKSB0byByZXR1cm4gZGlzdGluY3Qgc3RyaW5nCi0JcG9pbnRlcnMpLgotCi0JKiBzZWFyY2hfbGlzdC5jIChzZWFyY2hfbGlzdF9hcHBlbmQpOiBhZGRlZCBjYXN0IGZvciB4bWFsbG9jKCkuCi0KLQkqIGhpc3QuYzogYWRkZWQgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gdG8gc29tZSBvZiB0aGUgZ2xvYmFsCi0JdmFyaWFibGVzOyBmaXhlZCBTSXRhYiAoc2NhbGVzIHdlcmUgb2ZmIGJ5IGEgZmFjdG9yIG9mIDEwKS4KLQotCSogaGlzdC5oOiBpbmNsdWRlIG9mIGJmZC5oIGFkZGVkLgotCi0JKiBncHJvZi5jLCBncHJvZi5oIChwcmludF9wYXRoKTogYWRkZWQuCi0KLQkqIGdwcm9mLmggKE1BWCk6IGZpeGVkLgotCi0JKiBnbW9uX291dC5oOiByZW5hbWVkIGdtb25fdGltZV9oaXN0X2hkciB0byBnbW9uX2hpc3RfaGRyLgotCi0JKiBnbW9uX2lvLmM6IGFkZGVkIHNvbWUgY2FzdHMgdG8gKGxvbmcpIHNvIHdlIGNhbiBhbHdheXMgcHJpbnQgYXMgJWx4Ci0KLQkqIGNvcmUuYyAoY29yZV9nZXRfdGV4dF9zcGFjZSk6IGZpeGVkIHRvIG1ha2UgaXQgd29yay4KLQotCSogY2dfcHJpbnQuYyAoY2dfcHJpbnRfaW5kZXgpOiBhZGRlZCBzdXBwb3J0IGZvciBwcmludF9wYXRoIG9wdGlvbi4KLQotCSogY2dfZGZuLmggKGNnX2Rmbik6IHdyYXAgcHJvdG90eXBlIGluIFBBUkFNUygpLgotCi0JKiBjYWxsX2dyYXBoLmMsIGdtb25faW8uYywgaGlzdC5jOiBhdm9pZCB0YWtpbmcgYWRkcmVzcyBvZiBhcnJheQotCWFzIHNvbWUgY29tcGlsZXJzIGNvbXBsYWluIChlLmcuLCBERUMncyBPU0YvMSBjb21waWxlcikKLQotCSogYmFzaWNfYmxvY2tzLmMsIGdtb25faW8uYywgaGlzdC5jLCBzb3VyY2UuYywgc3ltX2lkcy5jLAotCXN5bXRhYi5jOiBjYWxscyB0byBtZW1zZXQoKSBoYWQgMm5kIGFuZCAzcmQgYXJncyByZXZlcnNlZC4KLQotCVNhdCBTZXAgMTAgMjE6NTM6MTMgMTk5NCAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcJKGRhdmlkbUBwaXN0b24uY3MuYXJpem9uYS5lZHUpCi0KLQkqIGdwcm9mLmM6IGFkZGVkICJfbWNvdW50IiB0byBkZWZhdWx0X2V4Y2x1ZGVkX2xpc3QuCi0JKG1haW4pOiBpZiBvdXRwdXRfc3R5bGU9PTAgYW5kIHRoZXJlIGlzIGVpdGhlciBhIGhpc3RvZ3JhbSBvciBhCi0JY2FsbC1ncmFwaCwgYWx3YXlzIGdlbmVyYXRlIGZsYXQgYW5kIGNhbGwtZ3JhcGgsIG5vIG1hdHRlciB3aGF0Ci0JbGluZV9ncmFudWxhcml0eSBpcyBzZXQgdG8uCi0KLQkqIHNvdXJjZS5jIChzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSk6IGlmIHNlYXJjaGluZyBmb3Igc2YtPm5hbWUKLQlmYWlscywgdHJ5IGFnYWluIHdpdGggZmlsZW5hbWUgb2J0YWluZWQgYWZ0ZXIgc3RyaXBwaW5nIG9mZiBhbnkKLQlwYXJ0aWFsIHBhdGggZnJvbSBzZi0+bmFtZS4KLQotCSogZ3Byb2YuaCAoU1JDREVCVUcpOiBhZGRlZC4KLQotCSogc2VhcmNoX2xpc3QuYyAoc2VhcmNoX2xpc3RfYXBwZW5kKTogZGlyZWN0b3JpZXMgd2VyZSBhZGRlZCBpbiB3cm9uZwotCW9yZGVyLgotCi0JKiByZWltcGxlbWVudGVkIHNlbGVjdGlvbiBtZWNoYW5pc20gZnJvbSBncm91bmQgdXA7IGl0IGlzIG5vdyBwb3NzaWJsZQotCXRvIGFjY3VyYXRlbHkgY29udHJvbCB3aGF0IGdldHMgaW5jbHVkZWQvZXhjbHVkZWQgaW4gZWFjaCBvZiB0aGUKLQlvdXRwdXQgc3R5bGVzOwlhICJzeW1ib2wtc3BlY2lmaWNhdGlvbiIgKHNwZWMpIGlzIHRoZSBiYXNpYyBtZWFucwotCXRvIHNlbGVjdCBhIHNldCBvZiBzeW1ib2xzOyBhIHNwZWMgaGFzIHRoZSBzeW50YXg6Ci0KLQkgIHNwZWMgPT0gKEZJTEVOQU1FOihGVU5DTkFNRXxMSU5FX05VTSkgfCBOQU1FKS4KLQkgIGFyYyA9PSBzcGVjL3NwZWMuCi0KLQlhbnkgb2YgdGhlIHRlcm1pbmFsIHN5bWJvbHMgY2FuIGJlIGVtcHR5LCBpbiB3aGljaCBjYXNlIHRoZXkKLQltYXRjaCBhbnl0aGluZyAod2lsZGNhcmRzKS4gIE5BTUUgaXMgaW50ZXJwcmV0ZWQgYXMgYSBGSUxFTkFNRQotCWlmIGl0IGNvbnRhaW5zIGEgZG90IChlLmcuLCBmb28uYyksIGFzIExJTkVfTlVNIGlmIGl0IHN0YXJ0cwotCXdpdGggYSBkaWdpdCwgYW5kIGFzIEZVTkNOQU1FIG90aGVyd2lzZS4KLQotCUZvciBleGFtcGxlLCB0byBnZXQgYSBjYWxsLWdyYXBoIGRpc3BsYXkgdGhhdCBpZ25vcmVzIGFyY3MKLQlmcm9tIGZvbygpIHRvIGJhcigpLCB5b3UnZCBzYXkgIi0tbm8tZ3JhcGg9Zm9vL2JhciI7IHRvCi0Jc2hvdyBvbmx5IGFyY3MgaW50byBiYXIoKSAobm8gbWF0dGVyIHdoYXQgdGhlIGNhbGxlciksCi0JeW91J2Qgc2F5ICItLWdyYXBoPS9iYXIiOyBhbmQgdG8gZ2V0IGEgY2FsbC1ncmFwaCB3aXRob3V0Ci0JYW55IGFyYyBpbmZvLCB5b3UnZCBzYXkgIi0tZ3JhcGg9LyI7ICBzaW1pbGFybHksIHRvCi0JZ2V0IGEgZmxhdCBwcm9maWxlIHdpdGhvdXQgbWNvdW50LCB5b3UnZCBzYXkgIi0tbm8tZmxhdD1tY291bnQiCi0JYW5kIHRvIGdldCBhIGZsYXQgcHJvZmlsZSB0aGF0IHNob3dzIGluY2x1ZGVzIGFsbCBmdW5jdGlvbnMKLQl5b3UnZCBzYXkgIi0tZmxhdD0iIiIgKGkuZS4sIGFuIGVtcHR5IHNwZWMpCi0KLQkqIGhpc3QuYyAoaGlzdF9wcmludCk6IHRvcF90aW1lIHdhc24ndCBpbml0aWFsaXplZCB0byAwLjAuCi0KLQlGcmkgU2VwCSA5IDAxOjEwOjIxIDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBnbW9uX291dC5oOiBhbGwgaGVhZGVycyBub3cgZGVjbGFyZWQgaW4gdGVybXMgb2YgY2hhcmFjdGVycwotCSAgdG8gYXZvaWQgZ2V0dGluZyBpbnRvIHRyb3VibGUgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXJzIGludHJvZHVjaW5nCi0JICBkaWZmZXJlbnQgYW1vdW50IG9mIHBhZGRpbmc7IHRoZSBjb2RlIGFscmVhZHkgYWNjZXNzZWQgdGhlIGZpZWxkcwotCSAgdGhyb3VnaCBiZmQgZnVuY3Rpb25zLCBzbyB0aGF0IGRpZG4ndCBoYXZlIHRvIGNoYW5nZS4KLQotCSogaGlzdC5jIChoaXN0X3JlYWRfcmVjLCBoaXN0X3dyaXRlX3JlYyk6IGFkZGVkIHN1cHBvcnQgZm9yCi0JICBjb2xsZWN0aW9uIHBjIGhpc3RvZ3JhbXMgbWVhc3VyaW5nIHF1YW50aXRpZXMgb3RoZXIgdGhhbiB0aW1lOwotCSAgdGhlIGhpc3RvZ3JhbSBoZWFkZXIgbm93IGluY2x1ZGVzIGEgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhlCi0JICBkaW1lbnNpb24gb2YgdGhlIHF1YW50aXR5IG1lYXN1cmVkIGJ5IHRoZSBoaXN0b2dyYW0gYmlucwotCSAgKG5vcm1hbGx5LCB0aGlzIGlzICJzZWNvbmRzIiwgYnV0IG90aGVyIG1lYW5pbmdmdWwgZGltZW5zaW9ucwotCSAgIGluY2x1ZGUgc3VjaCB0aGluZ3MgYXMgIkktY2FjaGUgbWlzc2VzIiwgImluc3RydWN0aW9uIGlzc3VlIHN0YWxscyIKLQkgICBldGMuKTsgdGhlcmUgaXMgYWxzbyBhIGZpZWxkIHRvIHNwZWNpZnkgYSBvbmUtY2hhcmFjdGVyCi0JICBhYmJyZXZpYXRpb24gZm9yIHRoZSBkaW1lbnNpb247IGluIHRoZSBjYXNlIG9mIHRpbWUsIHRoaXMgd291bGQKLQkgIGJlICdzJzsgaW4gbW9zdCBvdGhlciBjYXNlcyBpdCBwcm9iYWJseSB3b3VsZCBiZSAnMScgKG5vdCBhIHBoeXNpY2FsCi0JICBkaW1lbnNpb24pLgotCi0JVGh1IFNlcAkgOCAxNjowNTowOCAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYywgZ21vbl9pby5bY2hdOiBCU0RfQ09NUEFUSUJMRSBpcyBnb25lIGFuZCBuZXdfZmlsZV92ZXJzaW9uCi0JICBoYXMgYmVjb21lIG9sZF9maWxlX3ZlcnNpb247IGdtb25faW8uYyBub3cgYWx3YXlzIHN1cHBvcnRzIG9sZC1zdHlsZQotCSAgZ21vbi5vdXQgZmlsZXM7IGl0IGZpcnN0IHRyaWVzIHRvIHJlYWQgZ21vbi5vdXQgYXMgYSBuZXcgdmVyc2lvbgotCSAgZmlsZSwgaWYgdGhhdCBmYWlscywgaXQgdHJpZXMgdG8gcmVhZCBpdCBpbiB0aGUgb2xkIGZvcm1hdDsKLQkgIGFsdGhvdWdoIG5vdCB2ZXJ5IGxpa2VseSwgaXQgaXMgcG9zc2libGUgZm9yIGdwcm9mIHRvIG1pc3Rha2UgYW4KLQkgIG9sZC1zdHlsZSBmaWxlIGFzIGEgbmV3IG9uZSAodGhlIGZpcnN0IDQgYnl0ZXMgd291bGQgaGF2ZSB0bwotCSAgYmUgImdtb24iLS0taW5jbHVkaW5nIHRoZSB0cmFpbGluZyAnXDAnKTsgaW4gdGhhdCBjYXNlLCBpdCBpcwotCSAgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgLS1vbGQtZmlsZS12ZXJzaW9uCi0KLQkqIGdwcm9mLmg6IHJlbW92ZWQgZGVwZW5kZW5jeSBvbiBTWVNWOyB0aGUgY29kZSBub3cgYWx3YXlzIHVzZXMKLQkgIHN0cnJjaHIoKSwgbWVtc2V0KCksIGFuZCBtZW1jcHkoKSBhbmQgZG9lcyBub3QgaW5jbHVkZSBlaXRoZXIKLQkgIG9mIHN0cmluZy5oIG9yIHN0cmluZ3MuaDsgdGhpcyBzaG91bGQgbWFrZSBncHJvZiBjb21waWxlIG9uCi0JICBhbnkgKFVuaXgpIHN5c3RlbSB3aXRob3V0IGNvbmZpZ3VyYXRpb24gKHBlciBzdWdnZXN0aW9uIG9mCi0JICByYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGdwcm9mLmMgKHVzYWdlKTogZml4ZWQgbG9jYXRpb24gb2YgLS1uZXctZmlsZS1mb3JtYXQgb3B0aW9uLgotCi0JKiBjZ19hcmNzLmMgKHByb3BhZ2F0ZV9mbGFncyk6IGZpeGVkIHR5cG8gaW4gZGVjbGFyYXRpb24uCi0KLQkqIGZsYXRfYmwubTogcmVtb3ZlZCBmb3JtZmVlZCBhdCBlbmQgb2YgZmlsZTsgdGhlIGZvcm0tZmVlZAotCSAgaXMgbm93IHByaW50ZWQgY2dfcHJpbnQuYyBvbmx5IHdoZW4gbmVjZXNzYXJ5LgotCi0JKiBtYWpvciByZXdyaXRlIG9mIGdwcm9mLS0tdG9vIG1hbnkgY2hhbmdlcyB0byBtZW50aW9uIGFsbCBvZgotCSAgdGhlbS4JIG5ldyBmZWF0dXJlczoKLQotCSsgLWwgbm93IHJlcXVlc3RzIHByb2ZpbGluZyBhdCB0aGUgbGluZSBsZXZlbCAoYXMgb3Bwb3NlZAotCSAgdG8gZnVuY3Rpb24gbGV2ZWwpOyBpbiB0aGlzIG1vZGUsIGdwcm9mIGNyZWF0ZXMgYSAic3ltYm9sIgotCSAgKGFrYSBuYW1lLWxpc3QgZW50cnkpIGZvciBlYWNoIGxpbmUgb2Ygc291cmNlIGNvZGUsIGluc3RlYWQKLQkgICBvZiBvbmUgcGVyIGZ1bmN0aW9uKQotCi0JKyBzdXBwb3J0IGZvciBhIG5ldyBnbW9uLm91dCBmaWxlIGZvcm1hdDsgdGhlIG5ldyBmb3JtYXQgCi0JICBjb25zaXN0cyBvZiBhIGhlYWRlciB3aXRoIGEgbWFnaWMgYW5kIGEgdmVyc2lvbiBudW1iZXIsCi0JICBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIG9mIHByb2ZpbGUgZGF0YTsgcHJvZmlsZSBkYXRhCi0JICBjYW4gYW55IG9mOiAoYSkgUEMgaGlzdG9ncmFtLCAoYikgY2FsbC1ncmFwaCBhcmNzLCBvcgotCSAgKGMpIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHM7IHRoZSB2ZXJzaW9uIG51bWJlciBtYWtlcwotCSAgaXQgcG9zc2libGUgdG8gZXh0ZW5kIGdtb24ub3V0IGluIGEgYmFja3dhcmRzIGNvbXBhdGlibGUKLQkgIGZhc2hpb24KLQotCSsgc3VwcG9ydCBmb3IgdGNvdiBzdHlsZSBhbm5vdGF0ZWQgb3V0cHV0OiBpZiB0aGUgZ21vbi5vdXQgZmlsZQotCSAgY29udGFpbnMgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cywgdGhlIHVzZXIgY2FuIHJlcXVlc3QKLQkgIHRoZSBnZW5lcmF0aW9uIG9mIGFubm90YXRlZCBzb3VyY2UgZmlsZXMsIG11Y2ggbGlrZSBTdW4ncwotCSAgdGNvdiB1c2VkIHRvIGRvCi0KLQkrIGxvbmcgb3B0aW9ucwotCi0JKyBuZXcgc2NoZW1lIHRvIHN1cHByZXNzIHN5bWJvbHMgdGhhdCBhcmVuJ3QgZnVuY3Rpb24gbmFtZXMKLQkgIChlLmcuLCBhdm9pZHMgbWlzdGFraW5nIGEgZ290byBsYWJlbCBhcyBhIGZ1bmN0aW9uKQotCi0JKyByZW9yZ2FuaXplZCBzb3VyY2UgY29kZSB0byBtYWtlIGl0IG1vcmUgbWFuYWdhYmxlOyBhcyBhCi0JICBzaWRlIGVmZmVjdCwgZ3Byb2Ygbm93IGNvbXBpbGVzIGNsZWFubHkgd2l0aCAiZ2NjIC1XYWxsIgotCi0JVGh1IFNlcAkgMSAxNTo0Njo0OSAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYyAoZnVuY3N5bWJvbCk6IGJmZF9maW5kX25lYXJlc3RfbGluZSgpIGlzIG5vdyB1c2VkIGFzIGEKLQlmaW5hbCBjcm9zcy1jaGVjayB0byBkZXRlcm1pbmUgd2hldGhlciBhIHN0YXRpYyBzeW1ib2wgc2hvdWxkIGJlCi0JY29uc2lkZXJlZCBhcyBhIGZ1bmN0aW9uLW5hbWUuCi0KLQlGcmkgQXVnCSA1IDE5OjMyOjM2IDE5OTQgIERhdmlkIE1vc2Jlcmdlci1UYW5nCShkYXZpZG1AcGlzdG9uLmNzLmFyaXpvbmEuZWR1KQotCi0JKiBnbW9uX2lvLmMgKGdtb25fb3V0X3JlYWQpOiByZWNvZ25pemUgIi0iIGFzIHRoZSBmaWxlbmFtZSBmb3IKLQlzdGRpbjsgdGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbm5hIGtlZXAgZ21vbi5vdXQgZmlsZXMgY29tcHJlc3NlZDsKLQl0aGlzIHdheSB5b3UgY2FuICJnemNhdCIgdGhlIGNvbXByZXNzZWQgZmlsZSBpbnRvIGdwcm9mLgotCi0JKiBncHJvZi5jOiBmbGFnX21pbl9jb3VudCBub3cgaW5pdGlhbGl6ZWQgd2l0aCAxIGluc3RlYWQgb2YgMC4KLQotCSogYmFzaWNfYmxvY2tzLmMgKGJiX2Fubm90YXRlX3NvdXJjZSk6IGFkZGVkIHN1cHBvcnQgZm9yIGNyZWF0aW5nCi0JLnRjb3YgZmlsZXMgd2hlbiBvcHRpb24gZmxhZ19hbm5vdGF0ZV9tYWtlX2ZpbGVzIGlzIFRSVUUuCi0JKGFubm90YXRlX3dpdGhfY291bnQpOiBhbGwgY291bnRzIGxlc3MgdGhhbiB0aGUgbWluaW11bSBjb3VudAotCXNwZWNpZmllZCBieSAtbSBhcmUgbm93IGFubm90YXRlZCB3aXRoIGhhc2gtbWFya3MuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiAtQSBpcyBub3cgZm9sbG93ZWQgYnkgYSBzdHJpbmcgb2Ygb3B0aW9uIGNoYXJzLgotCi0JKiBiYXNpY19ibG9ja3MuYyAoYW5ub3RhdGVfd2l0aF9jb3VudCk6IHJlcGxhY2VkIGItPmNvdW50IHdpdGgKLQljbnQuCi0KLQkqIHNvdXJjZS5jOiBmbGFnX2Fubm90YXRlX3NvdXJjZSByZXBsYWNlZCBieSBzb3VyY2VfbG9ja19tYXAuCi0KLQkqIHNvdXJjZS5oOiBzb3VyY2VfbG9ja19tYXAgYWRkZWQuCi0KLQkqIGdwcm9mLmMgKG1haW4pOiBuZXcgY29tbWFuZC1saW5lIHN5bnRheDogLVMgc2ltcGx5IHNwZWNpZmllcwotCXdoaWNoIHNvdXJjZS1maWxlcyB1c2VyIGlzIGludGVyZXN0ZWQgaW47IC1BIHJlcXVlc3RzIGFubm90YXRlZAotCXNvdXJjZSBmaWxlcyBhbmQgLUFBIHJlcXVlc3RzIHRoYXQgYWxsIGxpbmVzIGluIGEgc291cmNlIGZpbGUKLQlhcmUgYW5ub3RhdGVkLgotCi0JVGh1IEF1ZwkgNCAyMzoyNzowMyAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogYmFzaWNfYmxvY2tzLmMgKFBBVEhfTUFYKTogaWYgdW5kZWZpbmVkLCBkZWZpbmUgYXMgMTAyNC4KLQotCSogc3BhcmMuYywgaTM4Ni5jLCB0YWhvZS5jLCB2YXguYzogYWRkZWQgaW5jbHVkZSBvZiAidGltZV9oaXN0LmgiCi0Jc28gc19sb3dwYyBldGMuIGdldCBkZWNsYXJlZC4KLQotCSogYXJjcy5oIChkb2FyY3MpOiBjcmVhdGVkLgotCi0JKiBhcmNzLmM6IHJlb3JkZXJlZCBzdGF0aWMgZnVuY3Rpb25zIHN1Y2ggdGhhdCB0aGV5IGdldCBkZWZpbmVkCi0JYmVmb3JlIHVzZS4KLQotCSogZ3Byb2YuYyAobWFpbik6IGFkZGVkIG9wdGlvbnM6Ci0JICAgLUE6IHJlcXVlc3QgYW5ub3RhdGlvbiBvZiBhbGwgc291cmNlIGxpbmVzICh3aXRoIC1TKQotCSAgIC1tOiBtaW5pbXVtIGV4ZWN1dGlvbiBjb3VudCAod2l0aCBkZWZhdWx0IGJhc2ljLWJsb2NrIGRpc3BsYXkpCi0JICAgLU46IGZvcmNlIG5ldyBmaWxlIGZvcm1hdCAob25seSBpZiBCU0RfQ09NUEFUSUJMRSBpcyBkZWZpbmVkKQotCSAgIC1TOiBhbm5vdGF0ZSBzb3VyY2UgZmlsZQotCSAgIC10OiBzZXQgdGFibGUgbGVuZ3RoICh3aXRoIC1TKQotCi0JKiBNYWtlZmlsZSAoT0JKUyk6IGFkZGVkIGJhc2ljX2Jsb2Nrcy5vIGNhbGxfZ3JhcGgubyBnbW9uX2lvLm8KLQlzb3VyY2UubyB0aW1lX2hpc3QubwotCi0JRnJpIEp1bAkgMSAxNToyMzo1MCAxOTk0ICBEYXZpZCBNb3NiZXJnZXItVGFuZwkoZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdSkKLQotCSogZ3Byb2YuYyAoYXNnbnNhbXBsZXMpOiBjb21wdXRhdGlvbiBvZiAicGNsIiBhbmQgInBjaCIgZGVwZW5kZWQKLQlvbiB0aGUgZmFjdCBiZWluZyBhYmxlIHRvIHN0b3JlIGEgbG9uZyBpbiBhIGRvdWJsZSB3aXRob3V0IGxvc3Mgb2YKLQlwcmVjaXNpb247IHRoaXMgZG9lcyBub3QgaG9sZCBvbiBtYWNoaW5lcyB3aXRoIDY0IGJpdCBsb25ncyBhbmQgNjQKLQliaXQgZG91Ymxlcy4KLQotRnJpIE9jdCAyMSAxODo1ODowMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBwcmludGdwcm9mLmMgKGZsYXRwcm9maGVhZGVyKTogQWx3YXlzIHNldCB0b3RpbWUgdG8gMS4wIGlmIG5vdAotCWdyZWF0ZXIgdGhhbiAwLjAuICBTdWdnZXN0ZWQgYnkgSGFyb2xkIEFzc2luawotCTxjYXJsb0BzZy50bi50dWRlbGZ0Lm5sPi4KLQotRnJpIFNlcCAyMyAxNTowNjo0NSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBwcmludGdwcm9mLmMgKHByaW50cHJvZik6IFVzZSBmcmVlLCBub3QgY2ZyZWUuCi0JKHByaW50Z3Byb2YsIHByaW50aW5kZXgpOiBEaXR0by4KLQotVGh1IFNlcCAgMSAxMDo0MDo0NSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZ3Byb2YuaCAoa2Zyb21saXN0LCBrdG9saXN0LCBmbGlzdCwgRmxpc3QsIGVsaXN0LCBFbGlzdCk6IE1ha2UKLQlkZWNscyBleHRlcm4gdG8ga2VlcCBuYXRpdmUgSFAgY29tcGlsZXIgcXVpZXQuCi0KLVR1ZSBBdWcgMzAgMTE6MTI6MTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogSWdub3JlIF9fX2dudV9jb21waWxlZCBhcyB3ZWxsIGFzCi0JX19nbnVfY29tcGlsZWQsIGZvciB0aGUgYmVuZWZpdCBvZiBzeXN0ZW1zIHdoaWNoIGFkZCBhIGxlYWRpbmcKLQl1bmRlcnNjb3JlLgotCi1XZWQgQXVnIDI0IDEyOjQ5OjEzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaTM4Ni0qLSogdG8gaVszNDVdODYtKi0qLgotCi1TdW4gSnVsIDEwIDAwOjM1OjMxIDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBuczUzMi5jLCBuczUzMi5oOiBOZXcgRmlsZXMuIG5zNTMyIHN1cHBvcnQuCi0KLQkqIGNvbmZpZy9tdC1uczUzMjogTmV3IEZpbGUuIG5zNTMyIHN1cHBvcnQuCi0KLQkqIGdwcm9mLmM6IHVzZXIgcmVnaXN0ZXIgaW50IGkgaW5zdGVhZCBvZiBkZWZhdWx0aW5nIHRoZSBpbnQuCi0JQWxsb3dzIGNvbXBpbGF0aW9uIHdpdGggLURyZWdpc3Rlcj0gZm9yIGRlYnVnZ2luZy4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbnM1MzIgc3VwcG9ydC4KLQotVGh1IEp1biAyMyAxMToyMjo0MSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGdwcm9mKTogRGVwZW5kIG9uICQoTElCUykuCi0KLUZyaSBNYXkgMjcgMTI6MjQ6NTcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCUZyb20gYmludXRpbHMtMi40IHJlbGVhc2U6Ci0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogW25ld10gYnVpbGQgbWFrZWZpbGUgZnJvbSBtYWtlZmlsZS5pbiAoZG9zKQotCSogaGVydHouYzogYWxsb3cgc3RhdGljIEhFUlRaIChtc2RvcyBuZWVkcyBpdCkKLQkqIGdwcm9mLmM6IGFsbG93IHRhcmdldCB0byBzZWxlY3QgInIiIG9yICJyYiIgZm9yIGZvcGVuCi0JKiBncHJvZi5jOiBpZ25vcmUgX19nbnVfY29tcGlsZWQgc3ltYm9scwotCSogaTM4Ni5oOiBkZmluZSBGT1BFTl9SQiB0byAicmIiIGZvciBkb3MuCi0KLVR1ZSBNYXkgMTcgMTU6MzA6MjIgMTk5NCAgRS4gTWljaGFlbCBTbWl0aCAoZW1zQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluICgubS5jOik6ICBBZGRlZCAuU1VGRklYRVMgOiAubSAKLQlzbyBmbGF0X2JsLmMgd291bGQgbWFrZSBmcm9tIGZsYXRfYmwubSBmaWxlLgotCi1UaHUgTWF5ICA1IDE5OjIzOjI0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLWluZm8pOiBDaGVjayBmb3IgZ3Byb2YuaW5mbyBpbiBidWlsZCBkaXIsCi0JZmFsbCBiYWNrIHRvIHNyY2Rpci4gIERlcGVuZCBvbiBpdC4KLQotCSogZ3Byb2YuaCAoVFJVRSwgRkFMU0UpOiBBbHdheXMgdXNlIHVuZGVmIGJlZm9yZSBkZWZpbmluZyB0aGVtLgotCi1Nb24gQXByICA0IDIzOjQ3OjMwIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBNYWtlZmlsZS5pbiAoTVlfTUFDSElORSk6IFJlbmFtZWQgZnJvbSBNQUNISU5FIHRvIGF2b2lkIGxvc2luZwotCW1ha2VzIChvc2YxKSBpbiB3aGljaCB0aGUgdmFsdWUgb2YgTUFDSElORSBjYW4gbm90IGJlIGNoYW5nZWQuCi0JKiBjb25maWcvKi5tdDogQ2hhbmdlZCBhcHByb3ByaWF0ZWx5LgotCi1XZWQgTWFyIDMwIDE2OjEyOjQwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoZ2V0c3ltdGFiKTogQ2hhbmdlIG5vc3ltcyB0byBsb25nLiAgUmVuYW1lCi0JZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCB0byBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZC4gIENoZWNrIGZvcgotCWVycm9ycyBmcm9tIGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIGFuZAotCWJmZF9jYW5vbmljYWxpemVfc3ltdGFiLgotCi1UdWUgTWFyIDIyIDEwOjUwOjUyIDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogVXNlIGJmZF9nZXRfc3ltYm9sX2luZm8gaW5zdGVhZCBvZgotCWJmZF9kZWNvZGVfc3ltY2xhc3MuCi0KLVN1biBNYXIgMjAgMTU6NDA6MjEgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIE1ha2VmaWxlLmluOiBBdm9pZCBidWcgaW4gaHB1eCBzZWQuCi0KLVdlZCBEZWMgMTUgMjA6MTY6NDAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBncHJvZi50ZXhpIChJbnZva2luZyk6IGFkZCB0ZXh0IGFib3V0IC12IGZsYWcKLQotCSogZ3Byb2YuMTogYWRkIHRleHQgYWJvdXQgLXYgZmxhZwotCi1XZWQgRGVjICA4IDE2OjU1OjA2IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuYyAoVkVSU0lPTik6IGRlZmluZWQgYSB2ZXJzaW9uIG1hY3JvLCBwcmludCB0aGUgdmFsdWUgCi0Jd2hlbiB0aGUgLXYgb3B0aW9uIGlzIHVzZWQKLQotVHVlIEp1bCAgNiAxMDoxMTo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogSW5zdGFsbCBjb3JyZWN0bHkuCi0KLVRodSBKdW4gMjQgMTQ6NDM6MjIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChtYWluKTogR2V0IHdob2FtaSBmcm9tIGFyZ3YsIGluc3RlYWQgb2YgaGFyZGNvZGluZy4KLQlVc2UgaXQgaW4gdXNhZ2UgbWVzc2FnZS4gIFNwbGl0IHVzYWdlIG1lc3NhZ2UgdG8gZml0IGluIDgwIGNvbHMuCi0KLVN1biBKdW4gMjAgMjA6NTg6MDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBVbmRvIDE1IEp1bmUgY2hhbmdlLgotCi1XZWQgSnVuIDE2IDEyOjU0OjUzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGdtb24uaCwgZ3Byb2YuaDogc3RydWN0cyBvZiBjaGFycyB1c2VkIHRvIGhvbGQgZXh0ZXJuYWwKLQlyZXByZXNlbnRhdGlvbnMuCi0JKiBncHJvZi5jIChnZXRwZmlsZSwgb3BlbnBmaWxlLCByZWFkc2FtcGxlcyk6IFN3YXAgZGF0YSBpbiB1c2luZwotCW5ldyBzdHJ1Y3R1cmVzLgotCi1UdWUgSnVuIDE1IDIzOjA5OjE3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBMb29rIGluIC4uL2luY2x1ZGUsIG5vdCAuLi9iZmQsIGZvciBiZmQuaC4KLQotTW9uIEp1biAxNCAxNjoyMjo1OSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgcGFyZW50ZGlyIHN1cHBvcnQKLQotTW9uIEp1biAgNyAxMjo1NjoxNyAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6ICBBZGQgLUkuLi9iZmQgZm9yIHN5c2RlcC5oIGFuZCBiZmQuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIHRvIGNvbmZpZ3VyZSB0byBnZXQgc3lzZGVwLmguCi0KLVR1ZSBNYXkgMTggMjE6NDQ6MTEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IHNob3VsZCBub3QgZGVwZW5kIG9uIGluc3RhbGwtaW5mbwotCi1Nb24gQXByIDI2IDEyOjM3OjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuaDogSW5jbHVkZSBhbnNpZGVjbC5oIGJlZm9yZSBzeXNkZXAuaC4gIFVuZGVmaW5lIGh6LgotCi1UdWUgQXByIDEzIDE2OjE0OjAzIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNIE1ha2VmaWxlLmluOiAgQWRkIC1nIHRvIENGTEFHUy4KLQlBZHMgTERGTEFHUyBhbmQgdXNlIGluIHBsYWNlIG9mIENGTEFHUyB3aGVyZSBhcHByb3ByaWF0ZS4KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgYSBzeXNkZXAuaGxpbmsgaW4gdGhlIHNhbWUgd2F5IG90aGVyCi0JYmZkLWJhc2VkIGRpcmVjdG9yaWVzIGRvLgotCSogZ3Byb2YuaCAoVU5JVCk6ICBSZXBsYWNlIG5vbi1zdGFuZGFyZCAndV9zaG9ydCcgYnkgJ3Vuc2lnbmVkCi0Jc2hvcnQnLgotCSogZ3Byb2YuaDogICNpbmNsdWRlIHN5c2RlcC5oIGluc3RlYWQgb2YgYSBidW5jaCBvZiBzdHVmZi4KLQkqIGdwcm9mLmMgKG1haW4pOiAgRml4IHR5cG8gZ3Byb2ZmLT5ncHJvZi4KLQotVGh1IE1hciAyNSAxOTowMDozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGdwcm9mLnRleGk6IGFkZCBJTkZPLURJUi1FTlRSWQotCi1UdWUgTWFyIDIzIDAwOjAzOjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgdGFyZ2V0Ci0KLVNhdCBGZWIgMjcgMTg6MTc6MTAgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBncHJvZi5jIChmdW5jc3ltYm9sKTogIEludmVydCB0ZXN0IGZvciBhZmxhZy4KLQotVGh1IEZlYiAyNSAxNjowMTo1MCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHByaW50Z3Byb2YgKHhtYWxsb2MsIHhyZWFsbG9jKTogIENhc3QgcmVzdWx0cyBvZiBtYWxsb2MKLQlhbmQgcmVhbGxvYyB0byBQVFIuCi0KLVdlZCBGZWIgIDMgMTM6NTU6MzMgMTk5MyAgSmVmZnJleSBPc2llciAgKGplZmZyZXlAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGNyZWF0ZWQgaW5mbywgaW5zdGFsbC1pbmZvLCBkdmkKLQotV2VkIEphbiAgNiAwMDo1ODowOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBmaXggaW5zdGFsbCBydWxlIGZvciAkKFBST0cpCi0KLUZyaSBPY3QgIDkgMTE6MjU6NDEgMTk5MiAgTWFyayBFaWNoaW4gIChlaWNoaW5AY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuMTogdXBkYXRlZCBTWU5PUFNJUyB0byBtYXRjaCBhY3R1YWwgYmVoYXZpb3IuCi0KLU1vbiBPY3QgIDUgMTc6NTA6MTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGdlbi1jLXByb2cuYXdrOiAgTmV3IGF3ayBzY3JpcHQsIGxpZ2h0bHkgY2hhbmdlZCBmcm9tCi0JcHJldmlvdXNseSBkZWxldGVkIG1ha2UtYy1wcm9nLmF3ay4gIENvbnZlcnRzIGEgdGV4dCBmaWxlCi0JdG8gYSBjIGZ1bmN0aW9uIHRoYXQgcHJpbnRzIHRoYXQgdGV4dC4KLQkqIGZsYXRfYmwubSwgZnNmX2NhbGxnX2JsLm0sIGJzZF9jYWxsZ19ibC5tOiAgTmV3IGZpbGVzLgotCUlucHV0cyB0byBnZW4tYy1wcm9nLmF3aywgY29udGFpbmluZyB0ZXh0IGRlc2NyaWJpbmcKLQlncHJvZiBvdXRwdXQuCi0JKiBibHVyYnMuYzogIFJlbW92ZWQuICBVc2UgKl9ibC5jIGluc3RlYWQuCi0JKiBNYWtlZmlsZS5pbjogVXNlIGdlbi1jcHJvZy5hd2sgdG8gZ2VuZXJhdGUgKl9ibC5jIGZpbGVzCi0JZnJvbSAqX2JsLm0gZmlsZXMuICBBbHNvLCBpbXByb3ZlICpjbGVhbiBydWxlcy4KLQkqIHByaW50Z3Byb2YuYyAocHJpbnRncHJvZik6ICBVc3cgbmV3IGZ1bmN0aW9uIG5hbWVzIGZyb20gKl9ibC5jLgotCQotCi1TdW4gQXVnIDMwIDE5OjU0OjUzIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogZ3Byb2YuaCwgZ3Byb2YuYywgcHJpbnRmZ3Byb2YuYzogIEFkZCBzdXBwb3J0IGZvciB0d28KLQlvdXRwdXQgc3R5bGVzOiAgVGhlIGRlZmF1bHQgaXMgc2ltaWxhciB0byB0aGUgb2xkIEZTRiBncHJvZiwKLQl3aGlsZSAtVCBzZXRzIHRoZSB2YXJpYWJsZSBic2Rfc3R5bGVfb3V0cHV0LCB3aGljaCBjYXVzZXMKLQlvdXRwdXQgbWF0Y2hpbmcgQmVya2VsZXkncyBncHJvZi4gIFRoZSBiaWdnZXN0IGRpZmZlcmVuY2VzCi0JYXJlIHRoYXQgd2l0aCB0aGUgRlNGIHN0eWxlIG91dHB1dCwgdGhlIGZsYXQgcHJvZmlsZSBjb21lcwotCWJlZm9yZSB0aGUgY2FsbCBncmFwaDsgbnVtYmVycyBjb21lIGJlZm9yZSBleHBsYW5hdGlvbnM7Ci0JYW5kIHRoZXJlIGlzIGxlc3MgZ3JhdHVpdG91cyB3aGl0ZSBzcGFjZS4KLQkqIGdwcm9mLmgsIGdwcm9mLmMsIHByaW50Zmdwcm9mLmM6ICBOZXcgZGlzY2FyZF91bmRlcnNjb3JlcwotCXZhcmlhYmxlIGNhdXNlcyBkaXNjYXJkaW5nIG9mIGluaXRpYWwgdW5kZXJzY29yZXMgd2hlbgotCXByaW50aW5nIHN5bWJvbCBuYW1lcy4gIEl0IGlzIHNldCB1bmxlc3MgdGhlcmUgaXMgYSAibWFpbiIKLQlzeW1ib2wgKHdpdGhvdXQgYW4gdW5kZXJzY29yZSkuCi0JKiBwcmludGZncHJvZi5jOiAgTmV3IGZ1bmN0aW9uIHByaW50bmFtZW9ubHkoKSwgY2FsbGVkCi0JYnkgcHJpbnRuYW1lKCkuICBJdCBoYW5kbGVzIHN0cmlwcGluZyBvZiBpbml0aWFsICdfJywKLQlhcyB3ZWxsIGFzIEMrKyBuYW1lLWRlbWFuZ2xpbmcuCi0JKiBncHJvZi5jYWxsZywgZ3Byb2YuZmxhdCwgbWFrZS1jLXByb2cuYXdrOiAgUmVtb3ZlZC4KLQlJdCBpcyBqdXN0IGFzIGNvbnZlbmllbnQgdG8gZWRpdCBibHVyYnMuYyBkaXJlY3RseS4KLQkqIE1ha2VmaWxlLmluOiAgUmVtb3ZlZCBydWxlIGZvciBtYWtpbmcgYmx1cmJzLmMuCi0JKiBibHVyYnMuYzogIFRoaXMgaXMgbm93IGEgdHJ1ZSBzb3VyY2UgZmlsZSAoYXMgb3Bwb3NlZAotCXRvIGJlaW5nIGdlbmVyYXRlZCBmcm9tIGdwcm9mLmNhbGxnIGFuZCBncHJvZi5mbGF0KS4KLQlDaGFuZ2Ugc3R5bGUgdG8gdXNlIG9uZSBsb25nIHN0cmluZyBsaXRlcmFsLCBpbnN0ZWFkIG9mCi0Jb25lIGxpdGVyYWwgcGVyIG91dHB1dCBsaW5lLiAgQWRkIEZTRi1zdHlsZSBibHVyYiBmb3IgY2FsbCBncmFwaC4KLQotV2VkIEF1ZyAxOSAxNDozNjozOSAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhbHdheXMgY3JlYXRlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcmllcy4KLQotV2VkIEF1ZyAxMiAxNToxNDoxNCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2hhbmdlICR7TUFDSElORX0gdG8gJChNQUNISU5FKS4KLQotU3VuIEp1bCAxOSAxNzozNDowMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgcmVtb3ZlZCBpbnN0YWxsYXRpb24gb2YgdGhlIG5vdyB1c2VsZXNzCi0JY2FsbC57ZmxhZyxjYWxsZ30gZmlsZXMuICAKLQotCSogZ3Byb2YuMTogbm93IHVzZXMgdGhlIHN0YW5kYXJkIG1hbiBtYWNyb3MgaW5zdGVhZCBvZiB0aGUgbmV3IEJTRAotCW1hbmRvYyBtYWNyb3MuIAotCi1TdW4gSnVsIDEyIDE5OjA2OjAwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZW1vdmUgaG9zdCBzZWN0aW9uLCBleHBhbmQgdGFyZ2V0IHNlY3Rpb24uCi0JKiBjb25maWcvbXQte3RhaG9lLHZheH06ICBBZGQsIHRvIG1hdGNoIGV4aXN0aW5nIHN1cHBvcnQgZmlsZXMuCi0JKiBjb25maWcvdG1ha2UtKjogIFJlbW92ZSBsZWZ0b3ZlciBjcnVkLgotCi0JKiBibHVyYnMuYzogIE5ldyBmaWxlLCBjcmVhdGVkIGZyb20gZ3Byb2YuZmxhdCBhbmQgZ3Byb2YuY2FsbGcgYnkKLQkqIG1ha2UtYy1wcm9nLmF3azogIHdoaWNoIHByb2Nlc3NlcyB0ZXh0IGZpbGVzIGludG8gQyBwcm9ncmFtcy4KLQkqIHByaW50Z3Byb2YuYyAoZmxhdHByb2ZoZWFkZXIsIGdwcm9maGVhZGVyKTogIENhbGwgbmV3IGZ1bmN0aW9ucwotCXRvIHByaW50IGJsdXJicy4KLQkocHJpbnRibHVyYik6ICBSZW1vdmUuCi0JKiBNYWtlZmlsZS5pbjogIEluZnJhc3RydWN0dXJlIHRvIGJ1aWxkIGJsdXJicy4KLQkqIHBhdGhuYW1lcy5oOiAgaGFzIGJlZW4gcmVtb3ZlZC4gIEdwcm9mIG5vdyBoYXMgbm8gZmlsZW5hbWUKLQlkZXBlbmRlbmNpZXMgaW4gaXQuCi0JKiBncHJvZi5jOiAgTGludC4KLQotU2F0IEp1bCAxMSAxODowNzoyMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBkZWZpbmUgbWFuMWRpciBhbmQgaW5zdGFsbCB0aGUgbWFuIHBhZ2UKLQotRnJpIEp1bCAxMCAyMToxNDowOCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgZHVtbXkgaW5mbyBhbmQgaW5zdGFsbC1pbmZvIHRhcmdldHMKLQotVGh1IEp1biAgNCAxMTozNDowMiAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBsb29rdXAuYzogZml4ZWQgZmVuY2Vwb3N0IGluIG5sbG9va3VwIGFuZCBhZGRlZCBkYmdfbmxsb29rdXAgZm9yCi0JaGVscCBpbiBkZWJ1Z2dpbmcgdGhlIHByb2JsZW0gKHdpdGggLURERUJVRykKLQkqIGdwcm9mLmM6IHN5bWJvbCB2YWx1ZXMgYXJlIG5vdyByZWFsIHZhbHVlcywgZG9uJ3QgYWRkIHRoZSB2bWEKLQlhbnltb3JlLiAoZG9uZSBmb3Igc29sYXJpczsgc2hvdWxkIHZlcmlmeSB0aGlzIG9uIG90aGVyIHBsYXRmb3JtcykKLQkqIENoYW5nZUxvZzogY3JlYXRlZC4KZGlmZiAtLWdpdCBhL2dwcm9mL01ha2VmaWxlLmFtIGIvZ3Byb2YvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZTE0OTIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIyBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9tYWtlIHRvIGdlbmVyYXRlIE1ha2VmaWxlLmluCi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMKLQotU1VGRklYRVMgPSAubQotCi1TVUJESVJTID0gcG8KLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1EREVCVUcgLUkuLi9iZmQgLUkkKHNyY2RpcikvLi4vaW5jbHVkZSAtSSQoc3JjZGlyKS8uLi9iZmQgLUkkKHNyY2RpcikvLi4vaW50bCAtSS4uL2ludGwgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1iaW5fUFJPR1JBTVMgPSBncHJvZgotCi0jIyBDb252ZW5pZW5jZSB2YXIgbGlzdGluZyBwdXJlIHNvdXJjZXMuCi1zb3VyY2VzID0gYmFzaWNfYmxvY2tzLmMgY2FsbF9ncmFwaC5jIGNnX2FyY3MuYyBjZ19kZm4uYyBcCi0JY2dfcHJpbnQuYyBjb3JlZmlsZS5jIGdtb25faW8uYyBncHJvZi5jIGhlcnR6LmMgaGlzdC5jIHNvdXJjZS5jIFwKLQlzZWFyY2hfbGlzdC5jIHN5bXRhYi5jIHN5bV9pZHMuYyB1dGlscy5jIFwKLQlpMzg2LmMgYWxwaGEuYyB2YXguYyB0YWhvZS5jIHNwYXJjLmMKLWdwcm9mX1NPVVJDRVMgPSAkKHNvdXJjZXMpIGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYwotZ3Byb2ZfREVQRU5ERU5DSUVTID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLWdwcm9mX0xEQUREID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLQotbm9pbnN0X0hFQURFUlMgPSBcCi0JYmFzaWNfYmxvY2tzLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19kZm4uaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb24uaCBnbW9uX2lvLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKLQlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oCi0KLUVYVFJBX0RJU1QgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMgYmJjb252LnBsCi0KLUJVSUxUX1NPVVJDRVMgPSBmbGF0X2JsLmMgYnNkX2NhbGxnX2JsLmMgZnNmX2NhbGxnX2JsLmMKLQotZGlzdHN0dWZmOiAkKEJVSUxUX1NPVVJDRVMpIGluZm8KLQotLm0uYzoKLQlhd2sgLWYgJChzcmNkaXIpL2dlbi1jLXByb2cuYXdrID4gLi8kKi5jIFwKLQkgICAgRlVOQ1RJT049YChlY2hvICQqfHNlZCAtZSAncywuKi8sLGcnIC1lICdzL19ibC8vJylgX2JsdXJiIFwKLQkgICAgRklMRT0kKi5tICQoc3JjZGlyKS8kKi5tCi0KLVBPVEZJTEVTID0gJChzb3VyY2VzKSAkKG5vaW5zdF9IRUFERVJTKQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotaW5mb19URVhJTkZPUyA9IGdwcm9mLnRleGkKLW1hbl9NQU5TID0gZ3Byb2YuMQotCi0jIERlcGVuZGVuY2llcy4KLSQoT0JKRUNUUyk6IC4uL2JmZC9iZmQuaCBjYWxsX2dyYXBoLmggY2dfYXJjcy5oIGNnX3ByaW50LmggXAotCWNvcmVmaWxlLmggZ21vbl9pby5oIGdtb25fb3V0LmggZ3Byb2YuaCBoZXJ0ei5oIGhpc3QuaCBcCi0Jc2VhcmNoX2xpc3QuaCBzb3VyY2UuaCBzeW1faWRzLmggc3ltdGFiLmggdXRpbHMuaCBcCi0JJChzcmNkaXIpLy4uL2luY2x1ZGUvbGliaWJlcnR5LmggJChzcmNkaXIpLy4uL2JmZC9zeXNkZXAuaCBcCi0JZ2NvbmZpZy5oIC4uL2JmZC9jb25maWcuaAotYmFzaWNfYmxvY2tzLm86IGJhc2ljX2Jsb2Nrcy5jCi1ic2RfY2FsbF9ibC5vOiBic2RfY2FsbF9ibC5jCi1jYWxsX2dyYXBoLm86IGNhbGxfZ3JhcGguYwotY2dfYXJjcy5vOiBjZ19hcmNzLmMKLWNnX2Rmbi5vOiBjZ19kZm4uYwotY2dfcHJpbnQubzogY2dfcHJpbnQuYwotY29yZWZpbGUubzogY29yZWZpbGUuYwotZmxhdF9ibC5vOiBmbGF0X2JsLmMKLWZzZl9jYWxsZ19ibC5vOiBmc2ZfY2FsbGdfYmwuYwotZ21vbl9pby5vOiBnbW9uX2lvLmMKLWdwcm9mLm86IGdwcm9mLmMKLWhlcnR6Lm86IGhlcnR6LmMKLWhpc3QubzogaGlzdC5jCi1zZWFyY2hfbGlzdC5vOiBzZWFyY2hfbGlzdC5jCi1zb3VyY2Uubzogc291cmNlLmMKLXN5bXRhYi5vOiBzeW10YWIuYwotc3ltX2lkcy5vOiBzeW1faWRzLmMKLXV0aWxzLm86IHV0aWxzLmMKLWkzODYubzogaTM4Ni5jCi1hbHBoYS5vOiBhbHBoYS5jCi12YXgubzogdmF4LmMKLXRhaG9lLm86IHRhaG9lLmMKLXNwYXJjLm86IHNwYXJjLmMKZGlmZiAtLWdpdCBhL2dwcm9mL01ha2VmaWxlLmluIGIvZ3Byb2YvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYWRkODguLjAwMDAwMDAKLS0tIGEvZ3Byb2YvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3MjYgKzAsMCBAQAotIyBNYWtlZmlsZS5pbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhdXRvbWFrZSAxLjQgZnJvbSBNYWtlZmlsZS5hbQotCi0jIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBUaGlzIE1ha2VmaWxlLmluIGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLSMgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotIyBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi0jIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLURFU1RESVIgPQotCi1wa2dkYXRhZGlyID0gJChkYXRhZGlyKS9AUEFDS0FHRUAKLXBrZ2xpYmRpciA9ICQobGliZGlyKS9AUEFDS0FHRUAKLXBrZ2luY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL0BQQUNLQUdFQAotCi10b3BfYnVpbGRkaXIgPSAuCi0KLUFDTE9DQUwgPSBAQUNMT0NBTEAKLUFVVE9DT05GID0gQEFVVE9DT05GQAotQVVUT01BS0UgPSBAQVVUT01BS0VACi1BVVRPSEVBREVSID0gQEFVVE9IRUFERVJACi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfUFJPR1JBTSA9IEBJTlNUQUxMX1BST0dSQU1AICQoQU1fSU5TVEFMTF9QUk9HUkFNX0ZMQUdTKQotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLUlOU1RBTExfU0NSSVBUID0gQElOU1RBTExfU0NSSVBUQAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi0KLU5PUk1BTF9JTlNUQUxMID0gOgotUFJFX0lOU1RBTEwgPSA6Ci1QT1NUX0lOU1RBTEwgPSA6Ci1OT1JNQUxfVU5JTlNUQUxMID0gOgotUFJFX1VOSU5TVEFMTCA9IDoKLVBPU1RfVU5JTlNUQUxMID0gOgotYnVpbGRfYWxpYXMgPSBAYnVpbGRfYWxpYXNACi1idWlsZF90cmlwbGV0ID0gQGJ1aWxkQAotaG9zdF9hbGlhcyA9IEBob3N0X2FsaWFzQAotaG9zdF90cmlwbGV0ID0gQGhvc3RACi10YXJnZXRfYWxpYXMgPSBAdGFyZ2V0X2FsaWFzQAotdGFyZ2V0X3RyaXBsZXQgPSBAdGFyZ2V0QAotQVMgPSBAQVNACi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1DQyA9IEBDQ0AKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRVhFRVhUID0gQEVYRUVYVEAKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotR01TR0ZNVCA9IEBHTVNHRk1UQAotR1RfTk8gPSBAR1RfTk9ACi1HVF9ZRVMgPSBAR1RfWUVTQAotSU5DTFVERV9MT0NBTEVfSCA9IEBJTkNMVURFX0xPQ0FMRV9IQAotSU5TVE9CSkVYVCA9IEBJTlNUT0JKRVhUQAotSU5UTERFUFMgPSBASU5UTERFUFNACi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLUlOVExPQkpTID0gQElOVExPQkpTQAotTEQgPSBATERACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1NQUlOVCA9IEBNQUlOVEAKLU1BS0VJTkZPID0gQE1BS0VJTkZPQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotTVNHRk1UID0gQE1TR0ZNVEAKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLVNVRkZJWEVTID0gLm0KLQotU1VCRElSUyA9IHBvCi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtRERFQlVHIC1JLi4vYmZkIC1JJChzcmNkaXIpLy4uL2luY2x1ZGUgLUkkKHNyY2RpcikvLi4vYmZkIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsIC1ETE9DQUxFRElSPSJcIiQocHJlZml4KS9zaGFyZS9sb2NhbGVcIiIKLQotYmluX1BST0dSQU1TID0gZ3Byb2YKLQotc291cmNlcyA9IGJhc2ljX2Jsb2Nrcy5jIGNhbGxfZ3JhcGguYyBjZ19hcmNzLmMgY2dfZGZuLmMgXAotCWNnX3ByaW50LmMgY29yZWZpbGUuYyBnbW9uX2lvLmMgZ3Byb2YuYyBoZXJ0ei5jIGhpc3QuYyBzb3VyY2UuYyBcCi0Jc2VhcmNoX2xpc3QuYyBzeW10YWIuYyBzeW1faWRzLmMgdXRpbHMuYyBcCi0JaTM4Ni5jIGFscGhhLmMgdmF4LmMgdGFob2UuYyBzcGFyYy5jCi0KLWdwcm9mX1NPVVJDRVMgPSAkKHNvdXJjZXMpIGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYwotZ3Byb2ZfREVQRU5ERU5DSUVTID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMREVQUykKLWdwcm9mX0xEQUREID0gLi4vYmZkL2xpYmJmZC5sYSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEgJChJTlRMTElCUykKLQotbm9pbnN0X0hFQURFUlMgPSBcCi0JYmFzaWNfYmxvY2tzLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19kZm4uaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb24uaCBnbW9uX2lvLmggZ21vbl9vdXQuaCBncHJvZi5oIGhlcnR6LmggaGlzdC5oIFwKLQlzZWFyY2hfbGlzdC5oIHNvdXJjZS5oIHN5bV9pZHMuaCBzeW10YWIuaCB1dGlscy5oCi0KLQotRVhUUkFfRElTVCA9IGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYyBiYmNvbnYucGwKLQotQlVJTFRfU09VUkNFUyA9IGZsYXRfYmwuYyBic2RfY2FsbGdfYmwuYyBmc2ZfY2FsbGdfYmwuYwotCi1QT1RGSUxFUyA9ICQoc291cmNlcykgJChub2luc3RfSEVBREVSUykKLQotaW5mb19URVhJTkZPUyA9IGdwcm9mLnRleGkKLW1hbl9NQU5TID0gZ3Byb2YuMQotQUNMT0NBTF9NNCA9ICQodG9wX3NyY2RpcikvYWNsb2NhbC5tNAotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvLi4vbWtpbnN0YWxsZGlycwotQ09ORklHX0hFQURFUiA9IGdjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1iaW5fUFJPR1JBTVMgPSAgZ3Byb2YkKEVYRUVYVCkKLVBST0dSQU1TID0gICQoYmluX1BST0dSQU1TKQotCi0KLURFRlMgPSBAREVGU0AgLUkuIC1JJChzcmNkaXIpIC1JLgotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi1MREZMQUdTID0gQExERkxBR1NACi1MSUJTID0gQExJQlNACi1ncHJvZl9PQkpFQ1RTID0gIGJhc2ljX2Jsb2Nrcy5vIGNhbGxfZ3JhcGgubyBjZ19hcmNzLm8gY2dfZGZuLm8gXAotY2dfcHJpbnQubyBjb3JlZmlsZS5vIGdtb25faW8ubyBncHJvZi5vIGhlcnR6Lm8gaGlzdC5vIHNvdXJjZS5vIFwKLXNlYXJjaF9saXN0Lm8gc3ltdGFiLm8gc3ltX2lkcy5vIHV0aWxzLm8gaTM4Ni5vIGFscGhhLm8gdmF4Lm8gdGFob2UubyBcCi1zcGFyYy5vIGZsYXRfYmwubyBic2RfY2FsbGdfYmwubyBmc2ZfY2FsbGdfYmwubwotZ3Byb2ZfTERGTEFHUyA9IAotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1URVhJMkRWSSA9IGBpZiB0ZXN0IC1mICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby91dGlsL3RleGkyZHZpOyB0aGVuIGVjaG8gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IGVsc2UgZWNobyB0ZXhpMmR2aTsgZmlgCi1URVhJTkZPX1RFWCA9ICQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleAotSU5GT19ERVBTID0gZ3Byb2YuaW5mbwotRFZJUyA9IGdwcm9mLmR2aQotVEVYSU5GT1MgPSBncHJvZi50ZXhpCi1tYW4xZGlyID0gJChtYW5kaXIpL21hbjEKLU1BTlMgPSAkKG1hbl9NQU5TKQotCi1OUk9GRiA9IG5yb2ZmCi1IRUFERVJTID0gICQobm9pbnN0X0hFQURFUlMpCi0KLURJU1RfQ09NTU9OID0gIC4vc3RhbXAtaC5pbiBDaGFuZ2VMb2cgTWFrZWZpbGUuYW0gTWFrZWZpbGUuaW4gVE9ETyBcCi1hY2xvY2FsLm00IGNvbmZpZ3VyZSBjb25maWd1cmUuaW4gZ2NvbmZpZy5pbgotCi0KLURJU1RGSUxFUyA9ICQoRElTVF9DT01NT04pICQoU09VUkNFUykgJChIRUFERVJTKSAkKFRFWElORk9TKSAkKEVYVFJBX0RJU1QpCi0KLVRBUiA9IHRhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGdwcm9mX1NPVVJDRVMpCi1PQkpFQ1RTID0gJChncHJvZl9PQkpFQ1RTKQotCi1hbGw6IGFsbC1yZWRpcmVjdAotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuUyAuYyAuZHZpIC5pbmZvIC5sbyAubSAubyAucHMgLnMgLnRleGkgLnRleGluZm8gLnR4aQotJChzcmNkaXIpL01ha2VmaWxlLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIE1ha2VmaWxlLmFtICQodG9wX3NyY2RpcikvY29uZmlndXJlLmluICQoQUNMT0NBTF9NNCkgCi0JY2QgJCh0b3Bfc3JjZGlyKSAmJiAkKEFVVE9NQUtFKSAtLWN5Z251cyBNYWtlZmlsZQotCi1NYWtlZmlsZTogJChzcmNkaXIpL01ha2VmaWxlLmluICAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0kKEFDTE9DQUxfTTQpOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAIGNvbmZpZ3VyZS5pbiAKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoQ09ORklHX1NUQVRVU19ERVBFTkRFTkNJRVMpCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWdjb25maWcuaDogc3RhbXAtaAotCUBpZiB0ZXN0ICEgLWYgJEA7IHRoZW4gXAotCQlybSAtZiBzdGFtcC1oOyBcCi0JCSQoTUFLRSkgc3RhbXAtaDsgXAotCWVsc2UgOjsgZmkKLXN0YW1wLWg6ICQoc3JjZGlyKS9nY29uZmlnLmluICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0gQ09ORklHX0hFQURFUlM9Z2NvbmZpZy5oOmdjb25maWcuaW4gXAotCSAgICAgJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0JQGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaCAyPiAvZGV2L251bGwKLSQoc3JjZGlyKS9nY29uZmlnLmluOiBATUFJTlRBSU5FUl9NT0RFX1RSVUVAJChzcmNkaXIpL3N0YW1wLWguaW4KLQlAaWYgdGVzdCAhIC1mICRAOyB0aGVuIFwKLQkJcm0gLWYgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQkJJChNQUtFKSAkKHNyY2Rpcikvc3RhbXAtaC5pbjsgXAotCWVsc2UgOjsgZmkKLSQoc3JjZGlyKS9zdGFtcC1oLmluOiAkKHRvcF9zcmNkaXIpL2NvbmZpZ3VyZS5pbiAkKEFDTE9DQUxfTTQpIAotCWNkICQodG9wX3NyY2RpcikgJiYgJChBVVRPSEVBREVSKQotCUBlY2hvIHRpbWVzdGFtcCA+ICQoc3JjZGlyKS9zdGFtcC1oLmluIDI+IC9kZXYvbnVsbAotCi1tb3N0bHljbGVhbi1oZHI6Ci0KLWNsZWFuLWhkcjoKLQotZGlzdGNsZWFuLWhkcjoKLQktcm0gLWYgZ2NvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUzoKLQotY2xlYW4tYmluUFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQoYmluX1BST0dSQU1TKSIgfHwgcm0gLWYgJChiaW5fUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1iaW5QUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUzoKLQotaW5zdGFsbC1iaW5QUk9HUkFNUzogJChiaW5fUFJPR1JBTVMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChiaW5kaXIpCi0JQGxpc3Q9JyQoYmluX1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKERFU1RESVIpJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgJ3MvJChFWEVFWFQpJCQvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2AiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChERVNURElSKSQoYmluZGlyKS9gZWNobyAkJHB8c2VkICdzLyQoRVhFRVhUKSQkLy8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtYmluUFJPR1JBTVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGJpbl9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJtIC1mICQoREVTVERJUikkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAncy8kKEVYRUVYVCkkJC8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYDsgXAotCWRvbmUKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotZ3Byb2YkKEVYRUVYVCk6ICQoZ3Byb2ZfT0JKRUNUUykgJChncHJvZl9ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGdwcm9mJChFWEVFWFQpCi0JJChMSU5LKSAkKGdwcm9mX0xERkxBR1MpICQoZ3Byb2ZfT0JKRUNUUykgJChncHJvZl9MREFERCkgJChMSUJTKQotCi1ncHJvZi5pbmZvOiBncHJvZi50ZXhpCi1ncHJvZi5kdmk6IGdwcm9mLnRleGkKLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgZ3Byb2YuYXV4IGdwcm9mLmNwIGdwcm9mLmNwcyBncHJvZi5kdmkgZ3Byb2YuZm4gZ3Byb2YuZm5zIFwKLQkgIGdwcm9mLmt5IGdwcm9mLmt5cyBncHJvZi5wcyBncHJvZi5sb2cgZ3Byb2YucGcgZ3Byb2YudG9jIFwKLQkgIGdwcm9mLnRwIGdwcm9mLnRwcyBncHJvZi52ciBncHJvZi52cnMgZ3Byb2Yub3AgZ3Byb2YudHIgXAotCSAgZ3Byb2YuY3YgZ3Byb2YuY24KLQotY2xlYW4tYW1pbmZvOgotCi1kaXN0Y2xlYW4tYW1pbmZvOgotCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKLQlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKLQkgIHJtIC1mICQkaTsgXAotCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCi0JICAgIHJtIC1mICQkaS1bMC05XSo7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCi0KLWluc3RhbGwtbWFuMToKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbjFkaXIpCi0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKLQkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLQotdW5pbnN0YWxsLW1hbjE6Ci0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi1pbnN0YWxsLW1hbjogJChNQU5TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtbWFuMQotdW5pbnN0YWxsLW1hbjoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1tYW4xCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBnY29uZmlnLmluICQoVEFHU19ERVBFTkRFTkNJRVMpICQoTElTUCkKLQl0YWdzPTsgXAotCWhlcmU9YHB3ZGA7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLSAgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWYgJCRzdWJkaXIvVEFHUyAmJiB0YWdzPSIkJHRhZ3MgLWkgJCRoZXJlLyQkc3ViZGlyL1RBR1MiOyBcCi0gICBmaTsgXAotCWRvbmU7IFwKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JdGVzdCAteiAiJChFVEFHU19BUkdTKWdjb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgZ2NvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGdjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWJpblBST0dSQU1TCi1pbnN0YWxsLWV4ZWM6IGluc3RhbGwtZXhlYy1yZWN1cnNpdmUKLQotaW5zdGFsbC1kYXRhLWFtOiBpbnN0YWxsLW1hbgotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtYmluUFJPR1JBTVMgdW5pbnN0YWxsLW1hbgotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoUFJPR1JBTVMpICQoTUFOUykgJChIRUFERVJTKSBnY29uZmlnLmgKLWFsbC1yZWRpcmVjdDogYWxsLXJlY3Vyc2l2ZS1hbQotaW5zdGFsbC1zdHJpcDoKLQkkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1M9LXMgaW5zdGFsbAotaW5zdGFsbGRpcnM6IGluc3RhbGxkaXJzLXJlY3Vyc2l2ZQotaW5zdGFsbGRpcnMtYW06Ci0JJChta2luc3RhbGxkaXJzKSAgJChERVNURElSKSQoYmluZGlyKSAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCi1jbGVhbi1nZW5lcmljOgotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQlVJTFRfU09VUkNFUykiIHx8IHJtIC1mICQoQlVJTFRfU09VUkNFUykKLW1vc3RseWNsZWFuLWFtOiAgbW9zdGx5Y2xlYW4taGRyIG1vc3RseWNsZWFuLWJpblBST0dSQU1TIFwKLQkJbW9zdGx5Y2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIFwKLQkJbW9zdGx5Y2xlYW4tYW1pbmZvIG1vc3RseWNsZWFuLXRhZ3MgbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLWJpblBST0dSQU1TIGNsZWFuLWNvbXBpbGUgY2xlYW4tbGlidG9vbCBcCi0JCWNsZWFuLWFtaW5mbyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgbW9zdGx5Y2xlYW4tYW0KLQotY2xlYW46IGNsZWFuLXJlY3Vyc2l2ZQotCi1kaXN0Y2xlYW4tYW06ICBkaXN0Y2xlYW4taGRyIGRpc3RjbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1hbWluZm8gZGlzdGNsZWFuLXRhZ3MgXAotCQlkaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1hbQotCS1ybSAtZiBsaWJ0b29sCi0KLWRpc3RjbGVhbjogZGlzdGNsZWFuLXJlY3Vyc2l2ZQotCS1ybSAtZiBjb25maWcuc3RhdHVzCi0KLW1haW50YWluZXItY2xlYW4tYW06ICBtYWludGFpbmVyLWNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWJpblBST0dSQU1TIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBcCi0JCW1haW50YWluZXItY2xlYW4tYW1pbmZvIG1haW50YWluZXItY2xlYW4tdGFncyBcCi0JCW1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBkaXN0Y2xlYW4tYW0KLQlAZWNobyAiVGhpcyBjb21tYW5kIGlzIGludGVuZGVkIGZvciBtYWludGFpbmVycyB0byB1c2U7IgotCUBlY2hvICJpdCBkZWxldGVzIGZpbGVzIHRoYXQgbWF5IHJlcXVpcmUgc3BlY2lhbCB0b29scyB0byByZWJ1aWxkLiIKLQotbWFpbnRhaW5lci1jbGVhbjogbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUKLQktcm0gLWYgY29uZmlnLnN0YXR1cwotCi0uUEhPTlk6IG1vc3RseWNsZWFuLWhkciBkaXN0Y2xlYW4taGRyIGNsZWFuLWhkciBtYWludGFpbmVyLWNsZWFuLWhkciBcCi1tb3N0bHljbGVhbi1iaW5QUk9HUkFNUyBkaXN0Y2xlYW4tYmluUFJPR1JBTVMgY2xlYW4tYmluUFJPR1JBTVMgXAotbWFpbnRhaW5lci1jbGVhbi1iaW5QUk9HUkFNUyB1bmluc3RhbGwtYmluUFJPR1JBTVMgaW5zdGFsbC1iaW5QUk9HUkFNUyBcCi1tb3N0bHljbGVhbi1jb21waWxlIGRpc3RjbGVhbi1jb21waWxlIGNsZWFuLWNvbXBpbGUgXAotbWFpbnRhaW5lci1jbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgZGlzdGNsZWFuLWxpYnRvb2wgXAotY2xlYW4tbGlidG9vbCBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgaW5zdGFsbC1pbmZvLWFtIHVuaW5zdGFsbC1pbmZvIFwKLW1vc3RseWNsZWFuLWFtaW5mbyBkaXN0Y2xlYW4tYW1pbmZvIGNsZWFuLWFtaW5mbyBcCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbyBpbnN0YWxsLW1hbjEgdW5pbnN0YWxsLW1hbjEgaW5zdGFsbC1tYW4gXAotdW5pbnN0YWxsLW1hbiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgXAotYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi1kaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCi1tb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLWRpc3RzdHVmZjogJChCVUlMVF9TT1VSQ0VTKSBpbmZvCi0KLS5tLmM6Ci0JYXdrIC1mICQoc3JjZGlyKS9nZW4tYy1wcm9nLmF3ayA+IC4vJCouYyBcCi0JICAgIEZVTkNUSU9OPWAoZWNobyAkKnxzZWQgLWUgJ3MsLiovLCxnJyAtZSAncy9fYmwvLycpYF9ibHVyYiBcCi0JICAgIEZJTEU9JCoubSAkKHNyY2RpcikvJCoubQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotIyBEZXBlbmRlbmNpZXMuCi0kKE9CSkVDVFMpOiAuLi9iZmQvYmZkLmggY2FsbF9ncmFwaC5oIGNnX2FyY3MuaCBjZ19wcmludC5oIFwKLQljb3JlZmlsZS5oIGdtb25faW8uaCBnbW9uX291dC5oIGdwcm9mLmggaGVydHouaCBoaXN0LmggXAotCXNlYXJjaF9saXN0Lmggc291cmNlLmggc3ltX2lkcy5oIHN5bXRhYi5oIHV0aWxzLmggXAotCSQoc3JjZGlyKS8uLi9pbmNsdWRlL2xpYmliZXJ0eS5oICQoc3JjZGlyKS8uLi9iZmQvc3lzZGVwLmggXAotCWdjb25maWcuaCAuLi9iZmQvY29uZmlnLmgKLWJhc2ljX2Jsb2Nrcy5vOiBiYXNpY19ibG9ja3MuYwotYnNkX2NhbGxfYmwubzogYnNkX2NhbGxfYmwuYwotY2FsbF9ncmFwaC5vOiBjYWxsX2dyYXBoLmMKLWNnX2FyY3MubzogY2dfYXJjcy5jCi1jZ19kZm4ubzogY2dfZGZuLmMKLWNnX3ByaW50Lm86IGNnX3ByaW50LmMKLWNvcmVmaWxlLm86IGNvcmVmaWxlLmMKLWZsYXRfYmwubzogZmxhdF9ibC5jCi1mc2ZfY2FsbGdfYmwubzogZnNmX2NhbGxnX2JsLmMKLWdtb25faW8ubzogZ21vbl9pby5jCi1ncHJvZi5vOiBncHJvZi5jCi1oZXJ0ei5vOiBoZXJ0ei5jCi1oaXN0Lm86IGhpc3QuYwotc2VhcmNoX2xpc3Qubzogc2VhcmNoX2xpc3QuYwotc291cmNlLm86IHNvdXJjZS5jCi1zeW10YWIubzogc3ltdGFiLmMKLXN5bV9pZHMubzogc3ltX2lkcy5jCi11dGlscy5vOiB1dGlscy5jCi1pMzg2Lm86IGkzODYuYwotYWxwaGEubzogYWxwaGEuYwotdmF4Lm86IHZheC5jCi10YWhvZS5vOiB0YWhvZS5jCi1zcGFyYy5vOiBzcGFyYy5jCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSB0byBub3QgZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dwcm9mL05PVEVTIGIvZ3Byb2YvTk9URVMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMWFmMzAuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvTk9URVMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotU3VuIEZlYiAgNSAxNjowOToxNiAxOTk1Ci0KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGNoYW5nZXMgYW5kIG5ldyBmZWF0dXJlcyBhdmFpbGFibGUgd2l0aCB0aGlzCi12ZXJzaW9uIG9mIEdOVSBncHJvZi4KLQotKiBOZXcgRmVhdHVyZXMKLQotIG8gTG9uZyBvcHRpb25zCi0KLSBvIFN1cHBvcnRzIGdlbmVyYWxpemVkIGZpbGUgZm9ybWF0LCB3aXRob3V0IGJyZWFraW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6Ci0gICBuZXcgZmlsZSBmb3JtYXQgc3VwcG9ydHMgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBhbmQgbm9uLXJlYWx0aW1lCi0gICBoaXN0b2dyYW1zIChzZWUgYmVsb3cpCi0KLSBvIFN1cHBvcnRzIHByb2ZpbGluZyBhdCB0aGUgbGluZSBsZXZlbDogZmxhdCBwcm9maWxlcywgY2FsbC1ncmFwaCBwcm9maWxlcywKLSAgIGFuZCBleGVjdXRpb24tY291bnRzIGNhbiBhbGwgYmUgZGlzcGxheWVkIGF0IGEgbGV2ZWwgdGhhdCBpZGVudGlmaWVzCi0gICBpbmRpdmlkdWFsIGxpbmVzIHJhdGhlciB0aGFuIGp1c3QgZnVuY3Rpb25zCi0KLSBvIFRlc3QtY292ZXJhZ2Ugc3VwcG9ydCAoc2ltaWxhciB0byBTdW4gdGNvdiBwcm9ncmFtKTogc291cmNlIGZpbGVzCi0gICBjYW4gYmUgYW5ub3RhdGVkIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBhIGZ1bmN0aW9uIHdhcyBpbnZva2VkCi0gICBvciB3aXRoIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCBiYXNpYy1ibG9jayBpbiBhIGZ1bmN0aW9uIHdhcwotICAgZXhlY3V0ZWQKLQotIG8gR2VuZXJhbGl6ZWQgaGlzdG9ncmFtczogbm90IGp1c3QgZXhlY3V0aW9uLXRpbWUsIGJ1dCBhcmJpdHJhcnkKLSAgIGhpc3RvZ3JhbXMgYXJlIHN1cHBvcnQgKGZvciBleGFtcGxlLCBwZXJmb3JtYW5jZSBjb3VudGVyIGJhc2VkCi0gICBwcm9maWxlcykKLQotIG8gUG93ZXJmdWwgbWVjaGFuaXNtIHRvIHNlbGVjdCBkYXRhIHRvIGJlIGluY2x1ZGVkL2V4Y2x1ZGVkIGZyb20KLSAgIGFuYWx5c2lzIGFuZC9vciBvdXRwdXQKLQotIG8gU3VwcG9ydCBmb3IgREVDIE9TRi8xIHYzLjAKLQotIG8gRnVsbCBjcm9zcy1wbGF0Zm9ybSBwcm9maWxpbmcgc3VwcG9ydDogZ3Byb2YgdXNlcyBCRkQgdG8gc3VwcG9ydAotICAgYXJiaXRyYXJ5LCBub24tbmF0aXZlIG9iamVjdCBmaWxlIGZvcm1hdHMgYW5kIG5vbi1uYXRpdmUgYnl0ZS1vcmRlcnMKLSAgICh0aGlzIGZlYXR1cmUgaGFzIG5vdCBiZWVuIHRlc3RlZCB5ZXQpCi0KLSBvIEluIHRoZSBjYWxsLWdyYXBoIGZ1bmN0aW9uIGluZGV4LCBzdGF0aWMgZnVuY3Rpb24gbmFtZXMgYXJlIG5vdwotICAgcHJpbnRlZCB0b2dldGhlciB3aXRoIHRoZSBmaWxlbmFtZSBpbiB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQKLSAgIChyZXF1aXJlZCBiZmRfZmluZF9uZWFyZXN0X2xpbmUoKSBzdXBwb3J0IGFuZCBzeW1ib2xpYyBkZWJ1Z2dpbmcKLSAgICBpbmZvcm1hdGlvbiB0byBiZSBwcmVzZW50IGluIHRoZSBleGVjdXRhYmxlIGZpbGUpCi0KLSBvIE1ham9yIG92ZXJoYXVsIG9mIHNvdXJjZSBjb2RlIChjb21waWxlcyBjbGVhbmx5IHdpdGggLVdhbGwsIGV0Yy4pCi0KLSogU3VwcG9ydGVkIFBsYXRmb3JtcwotCi1UaGUgY3VycmVudCB2ZXJzaW9uIGlzIGtub3duIHRvIHdvcmsgb246Ci0KLSBvIERFQyBPU0YvMSB2My4wCi0JQWxsIGZlYXR1cmVzIHN1cHBvcnRlZC4KLQotIG8gU3VuT1MgNC4xLngKLQlBbGwgZmVhdHVyZXMgc3VwcG9ydGVkLgotCi0gbyBTb2xhcmlzIDIuMwotCUxpbmUtbGV2ZWwgcHJvZmlsaW5nIHVuc3VwcG9ydGVkIGJlY2F1c2UgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkKLQlpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgZm9yIEVsZiBiaW5hcmllcy4KLQotIG8gSFAtVVggOS4wMQotCUxpbmUtbGV2ZWwgcHJvZmlsaW5nIHVuc3VwcG9ydGVkIGJlY2F1c2UgYmZkX2ZpbmRfbmVhcmVzdF9saW5lKCkKLQlpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgZm9yIFNPTSBiaW5hcmllcy4KLQotKiBEZXRhaWxlZCBEZXNjcmlwdGlvbgotCi0qKiBVc2VyIEludGVyZmFjZSBDaGFuZ2VzCi0KLVRoZSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggZWFybGllcgotdmVyc2lvbnMgb2YgR05VIGdwcm9mIGFuZCBCZXJrZWxleSBncHJvZi4gIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcwotdGhlIG9wdGlvbiB0byBkZWxldGUgYXJjcyBmcm9tIHRoZSBjYWxsIGdyYXBoLiAgVGhlIG9sZCBzeW50YXgKLXdhczoKLQotCS1rIGZyb21uYW1lIHRvbmFtZQotCi13aGlsZSB0aGUgbmV3IHN5bnRheCBpczoKLQotCS1rIGZyb21uYW1lL3RvbmFtZQotCi1UaGlzIGNoYW5nZSB3YXMgbmVjZXNzYXJ5IHRvIGJlIGNvbXBhdGlibGUgd2l0aCBsb25nLW9wdGlvbiBwYXJzaW5nLgotQWxzbywgImZyb21uYW1lIiBhbmQgInRvbmFtZSIgY2FuIG5vdyBiZSBhcmJpdHJhcnkgc3ltc3BlY3MgcmF0aGVyCi10aGFuIGp1c3QgZnVuY3Rpb24gbmFtZXMgKHNlZSBiZWxvdyBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygc3ltc3BlY3MpLgotRm9yIGV4YW1wbGUsIG9wdGlvbiAiLWsgZ3Byb2YuYy8iIHN1cHByZXNzZXMgYWxsIGFyY3MgZHVlIHRvIGNhbGxzIG91dAotb2YgZmlsZSAiZ3Byb2YuYyIuCi0KLSoqKiBTeW0gU3BlY3MKLQotSXQgaXMgb2Z0ZW4gbmVjZXNzYXJ5IHRvIGFwcGx5IGdwcm9mIG9ubHkgdG8gc3BlY2lmaWMgcGFydHMgb2YgYQotcHJvZ3JhbS4gIEdOVSBncHJvZiBoYXMgYSBzaW1wbGUgYnV0IHBvd2VyZnVsIG1lY2hhbmlzbSB0byBhY2hpZXZlCi10aGlzLiAgU28gY2FsbGVkIHtcZW0gc3ltc3BlY3NcL30gcHJvdmlkZSB0aGUgZm91bmRhdGlvbiBmb3IgdGhpcwotbWVjaGFuaXNtLiAgQSBzeW1zcGVjIHNlbGVjdHMgdGhlIHBhcnRzIG9mIGEgcHJvZmlsZWQgcHJvZ3JhbSB0byB3aGljaAotYW4gb3BlcmF0aW9uIHNob3VsZCBiZSBhcHBsaWVkIHRvLiAgVGhlIHN5bnRheCBvZiBhIHN5bXNwZWMgaXMKLXNpbXBsZToKLQotCSAgZmlsZW5hbWVfY29udGFpbmluZ19hX2RvdAotCXwgZnVuY25hbWVfbm90X2NvbnRhaW5pbmdfYV9kb3QKLQl8IGxpbmVudW1iZXIKLQl8ICggWyBhbnlfZmlsZW5hbWUgXSBgOicgKCBhbnlfZnVuY25hbWUgfCBsaW5lbnVtYmVyICkgKQotCi1IZXJlIGFyZSBzb21lIGV4YW1wbGVzOgotCi0JbWFpbi5jCQkJU2VsZWN0cyBldmVyeXRoaW5nIGluIGZpbGUgIm1haW4uYyItLS10aGUKLQkJCQlkb3QgaW4gdGhlIHN0cmluZyB0ZWxscyBncHJvZiB0byBpbnRlcnByZXQKLQkJCQl0aGUgc3RyaW5nIGFzIGEgZmlsZW5hbWUsIHJhdGhlciB0aGFuIGFzCi0JCQkJYSBmdW5jdGlvbiBuYW1lLiAgVG8gc2VsZWN0IGEgZmlsZSB3aG9zZQotCQkJCW5hbWUgZG9lcyBjb250YWluIGEgZG90LCBhIHRyYWlsaW5nIGNvbG9uCi0JCQkJc2hvdWxkIGJlIHNwZWNpZmllZC4gIEZvciBleGFtcGxlLCAib2RkOiIgaXMKLQkJCQlpbnRlcnByZXRlZCBhcyB0aGUgZmlsZSBuYW1lZCAib2RkIi4KLQotCW1haW4JCQlTZWxlY3RzIGFsbCBmdW5jdGlvbnMgbmFtZWQgIm1haW4iLiAgTm90aWNlCi0JCQkJdGhhdCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZQotCQkJCXNhbWUgZnVuY3Rpb24gbmFtZSBiZWNhdXNlIHNvbWUgb2YgdGhlCi0JCQkJZGVmaW5pdGlvbnMgbWF5IGJlIGxvY2FsIChpLmUuLCBzdGF0aWMpLgotCQkJCVVubGVzcyBhIGZ1bmN0aW9uIG5hbWUgaXMgdW5pcXVlIGluIGEgcHJvZ3JhbSwKLQkJCQl5b3UgbXVzdCB1c2UgdGhlIGNvbG9uIG5vdGF0aW9uIGV4cGxhaW5lZAotCQkJCWJlbG93IHRvIHNwZWNpZnkgYSBmdW5jdGlvbiBmcm9tIGEgc3BlY2lmaWMKLQkJCQlzb3VyY2UgZmlsZS4gIFNvbWV0aW1lcywgZnVuY3Rpb25uYW1lcyBjb250YWluCi0JCQkJZG90cy4gIEluIHN1Y2ggY2FzZXMsIGl0IGlzIG5lY2Vzc2FyIHRvCi0JCQkJYWRkIGEgbGVhZGluZyBjb2xvbiB0byB0aGUgbmFtZS4gIEZvciBleGFtcGxlLAotCQkJCSI6Lm11bCIgc2VsZWN0cyBmdW5jdGlvbiAiLm11bCIuCi0JCQkJCi0JbWFpbi5jOm1haW4JCVNlbGVjdHMgZnVuY3Rpb24gIm1haW4iIGluIGZpbGUgIm1haW4uYyIuCi0KLQltYWluLmM6MTM0CQlTZWxlY3RzIGxpbmUgMTM0IGluIGZpbGUgIm1haW4uYyIuCi0KLUlNUExFTUVOVEFUSU9OIE5PVEU6IFRoZSBzb3VyY2UgY29kZSB1c2VzIHRoZSB0eXBlIHN5bV9pZCBmb3Igc3ltc3BlY3MuCi1BdCBzb21lIHBvaW50LCB0aGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGNoYW5nZWQgdG8gInN5bV9zcGVjIiB0byBtYWtlCi1yZWFkaW5nIHRoZSBjb2RlIGVhc2llci4KLQotKioqIExvbmcgb3B0aW9ucwotCi1HTlUgZ3Byb2Ygbm93IHN1cHBvcnRzIGxvbmcgb3B0aW9ucy4gIFRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIGFsbAotc3VwcG9ydGVkIG9wdGlvbnMuICBPcHRpb25zIHRoYXQgYXJlIGxpc3RlZCB3aXRob3V0IGRlc2NyaXB0aW9uCi1vcGVyYXRlIGluIHRoZSBzYW1lIG1hbm5lciBhcyB0aGUgY29ycmVzcG9uZGluZyBvcHRpb24gaW4gb2xkZXIKLXZlcnNpb25zIG9mIGdwcm9mLgotCi1TaG9ydCBGb3JtOglMb25nIEZvcm06Ci0tLS0tLS0tLS0tLQktLS0tLS0tLS0tCi0tbAkJLS1saW5lCi0JCQlSZXF1ZXN0IHByb2ZpbGluZyBhdCB0aGUgbGluZS1sZXZlbCByYXRoZXIKLQkJCXRoYW4ganVzdCBhdCB0aGUgZnVuY3Rpb24gbGV2ZWwuICBTb3VyY2UKLQkJCWxpbmVzIGFyZSBpZGVudGlmaWVkIGJ5IHN5bWJvbHMgb2YgdGhlIGZvcm06Ci0KLQkJCQlmdW5jIChmaWxlOmxpbmUpCi0KLQkJCXdoZXJlICJmdW5jIiBpcyB0aGUgZnVuY3Rpb24gbmFtZSwgImZpbGUiIGlzIHRoZQotCQkJZmlsZSBuYW1lIGFuZCAibGluZSIgaXMgdGhlIGxpbmUtbnVtYmVyIHRoYXQKLQkJCWNvcnJlc3BvbmRzIHRvIHRoZSBsaW5lLgotCi0JCQlUbyB3b3JrIHByb3Blcmx5LCB0aGUgYmluYXJ5IG11c3QgY29udGFpbiBzeW1ib2xpYwotCQkJZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBzb3VyY2UKLQkJCWhhdmUgdG8gYmUgdHJhbnNsYXRlZCB3aXRoIG9wdGlvbiAiLWciIHNwZWNpZmllZC4KLQkJCUZ1bmN0aW9ucyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gc3ltYm9saWMgZGVidWdnaW5nCi0JCQlpbmZvcm1hdGlvbiBhdmFpbGFibGUgYXJlIHRyZWF0ZWQgYXMgaWYgIi0tbGluZSIKLQkJCWhhZCBub3QgYmVlbiBzcGVjaWZpZWQuICBIb3dldmVyLCB0aGUgbGluZSBudW1iZXIKLQkJCXByaW50ZWQgd2l0aCBzdWNoIHN5bWJvbHMgaXMgdXN1YWxseSBpbmNvcnJlY3QKLQkJCWFuZCBzaG91bGQgYmUgaWdub3JlZC4KLQotLWEJCS0tbm8tc3RhdGljCi0tQVtzeW1zcGVjXQktLWFubm90YXRlZC1zb3VyY2VbPXN5bXNwZWNdCi0JCQlSZXF1ZXN0IG91dHB1dCBpbiB0aGUgZm9ybSBvZiBhbm5vdGF0ZWQgc291cmNlCi0JCQlmaWxlcy4gIElmICJzeW1zcGVjIiBpcyBzcGVjaWZpZWQsIHByaW50IG91dHB1dCBvbmx5Ci0JCQlmb3Igc3ltYm9scyBzZWxlY3RlZCBieSAic3ltc3BlYyIuICBJZiB0aGUgb3B0aW9uCi0JCQlpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIGFubm90YXRlZCBvdXRwdXQgaXMKLQkJCWdlbmVyYXRlZCBmb3IgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotCQkJRXhhbXBsZXM6Ci0KLQkJCSAgLUEJCVByaW50cyBhbm5vdGF0ZWQgc291cmNlIGZvciBhbGwKLQkJCQkJc291cmNlIGZpbGVzLgotCQkJICAtQWdwcm9mLmMJUHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZm9yIGZpbGUKLQkJCQkJZ3Byb2YuYy4KLQkJCSAgLUFmb29iYXIJUHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZm9yIGZpbGVzCi0JCQkJCWNvbnRhaW5pbmcgYSBmdW5jdGlvbiBuYW1lZCAiZm9vYmFyIi4KLQkJCQkJVGhlIGVudGlyZSBmaWxlIHdpbGwgYmUgcHJpbnRlZCwgYnV0Ci0JCQkJCW9ubHkgdGhlIGZ1bmN0aW9uIGl0c2VsZiB3aWxsIGJlCi0JCQkJCWFubm90YXRlZCB3aXRoIHByb2ZpbGUgZGF0YS4KLQotLUpbc3ltc3BlY10JLS1uby1hbm5vdGF0ZWQtc291cmNlWz1zeW1zcGVjXQotCQkJU3VwcHJlc3MgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQuICBJZiBzcGVjaWZpZWQKLQkJCXdpdGhvdXQgYXJndW1lbnQsIGFubm90YXRlZCBvdXRwdXQgaXMgc3VwcHJlc3NlZAotCQkJY29tcGxldGVseS4gIFdpdGggYW4gYXJndW1lbnQsIGFubm90YXRlZCBvdXRwdXQKLQkJCWlzIHN1cHByZXNzZWQgb25seSBmb3IgdGhlIHN5bWJvbHMgc2VsZWN0ZWQgYnkKLQkJCSJzeW1zcGVjIi4gIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlCi0JCQl0aW1lcywgYW5ub3RhdGVkIG91dHB1dCBpcyBzdXBwcmVzc2VkIGZvciB0aGUKLQkJCXVuaW9uIG9mIGFsbCBzeW1zcGVjcy4gIFRoaXMgb3B0aW9uIGhhcyBsb3dlcgotCQkJcHJlY2VkZW5jZSB0aGFuIC0tYW5ub3RhdGVkLXNvdXJjZQotCi0tcFtzeW1zcGVjXQktLWZsYXQtcHJvZmlsZVs9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGEgZmxhdCBwcm9maWxlCi0JCQkodW5sZXNzIGFueSBvdGhlciBvdXRwdXQtc3R5bGUgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCSB0aGlzIG9wdGlvbiBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCkuICBJZgotCQkJInN5bXNwZWMiIGlzIHNwZWNpZmllZCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMKLQkJCXNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBpbiBmbGF0IHByb2ZpbGUuICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBmbGF0Ci0JCQlwcm9maWxlIGluY2x1ZGVzIHN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uCi0JCQlvZiBhbGwgc3ltc3BlY3MuCi0JCQkKLS1QW3N5bXNwZWNdCS0tbm8tZmxhdC1wcm9maWxlWz1zeW1zcGVjXQotCQkJU3VwcHJlc3Mgb3V0cHV0IGluIHRoZSBmbGF0IHByb2ZpbGUuICBJZiBnaXZlbgotCQkJd2l0aG91dCBhbiBhcmd1bWVudCwgdGhlIGZsYXQgcHJvZmlsZSBpcyBzdXBwcmVzc2VkCi0JCQljb21wbGV0ZWx5LiAgSWYgInN5bXNwZWMiIGlzIHNwZWNpZmllZCwgc3VwcHJlc3MKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGluIHRoZSBmbGF0IHByb2ZpbGUuICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbiBvZgotCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgaXMgc3VwcHJlc3NlZC4gIFRoaXMgb3B0aW9uCi0JCQloYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIC0tZmxhdC1wcm9maWxlLgotCi0tcVtzeW1zcGVjXQktLWdyYXBoWz1zeW1zcGVjXQotCQkJUmVxdWVzdCBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBjYWxsLWdyYXBoCi0JCQkodW5sZXNzIGFueSBvdGhlciBvdXRwdXQtc3R5bGUgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCSB0aGlzIG9wdGlvbiBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdCkuICBJZiAic3ltc3BlYyIKLQkJCWlzIHNwZWNpZmllZCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMgc2VsZWN0ZWQgYnkKLQkJCSJzeW1zcGVjIiBpbiB0aGUgY2FsbC1ncmFwaC4gIElmIHRoZSBvcHRpb24gaXMKLQkJCXNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgdGhlIGNhbGwtZ3JhcGggaW5jbHVkZXMKLQkJCXN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotLVFbc3ltc3BlY10JLS1uby1ncmFwaFs9c3ltc3BlY10KLQkJCVN1cHByZXNzIG91dHB1dCBpbiB0aGUgY2FsbC1ncmFwaC4gIElmIGdpdmVuIHdpdGhvdXQKLQkJCWFuIGFyZ3VtZW50LCB0aGUgY2FsbC1ncmFwaCBpcyBzdXBwcmVzc2VkIGNvbXBsZXRlbHkuCi0JCQlXaXRoIGEgInN5bXNwZWMiLCBzdXBwcmVzcyB0aGUgc2VsZWN0ZWQgc3ltYm9scwotCQkJZnJvbSB0aGUgY2FsbC1ncmFwaC4gIElmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkCi0JCQltdWx0aXBsZSB0aW1lcywgdGhlIHVuaW9uIG9mIHRoZSBzZWxlY3RlZCBzeW1ib2xzCi0JCQlpcyBzdXBwcmVzc2VkLiAgVGhpcyBvcHRpb24gaGFzIGxvd2VyIHByZWNlZGVuY2UKLQkJCXRoYW4gLS1ncmFwaC4KLQotLUNbc3ltc3BlY10JLS1leGVjLWNvdW50c1s9c3ltc3BlY10KLQkJCVJlcXVlc3Qgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGV4ZWN1dGlvbiBjb3VudHMuCi0JCQlJZiAic3ltc3BlYyIgaXMgcHJlc2VudCwgaW5jbHVkZSBvbmx5IHN5bWJvbHMKLQkJCXNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBpbiB0aGUgZXhlY3V0aW9uIGNvdW50Ci0JCQlsaXN0aW5nLiAgSWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUKLQkJCXRpbWVzLCB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcgaW5jbHVkZXMKLQkJCXN5bWJvbHMgc2VsZWN0ZWQgYnkgdGhlIHVuaW9uIG9mIGFsbCBzeW1zcGVjcy4KLQotLVpbc3ltc3BlY10JLS1uby1leGVjLWNvdW50c1s9c3ltc3BlY10KLQkJCVN1cHByZXNzIG91dHB1dCBpbiB0aGUgZXhlY3V0aW9uIGNvdW50IGxpc3RpbmcuCi0JCQlJZiBnaXZlbiB3aXRob3V0IGFuIGFyZ3VtZW50LCB0aGUgbGlzdGluZyBpcwotCQkJc3VwcHJlc3NlZCBjb21wbGV0ZWx5LiAgV2l0aCBhICJzeW1zcGVjIiwgc3VwcHJlc3MKLQkJCXRoZSBzZWxlY3RlZCBzeW1ib2xzIGZyb20gdGhlIGNhbGwtZ3JhcGguICBJZiB0aGUKLQkJCW9wdGlvbiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMsIHRoZSB1bmlvbiBvZgotCQkJdGhlIHNlbGVjdGVkIHN5bWJvbHMgaXMgc3VwcHJlc3NlZC4gIFRoaXMgb3B0aW9uCi0JCQloYXMgbG93ZXIgcHJlY2VkZW5jZSB0aGFuIC0tZXhlYy1jb3VudHMuCi0KLS1pCQktLWZpbGUtaW5mbwotCQkJUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2ZpbGUgZmlsZXMgdGhhdAotCQkJYXJlIHJlYWQuICBUaGUgaW5mb3JtYXRpb24gY29uc2lzdHMgb2YgdGhlCi0JCQludW1iZXIgYW5kIHR5cGVzIG9mIHJlY29yZHMgcHJlc2VudCBpbiB0aGUKLQkJCXByb2ZpbGUgZmlsZS4gIEN1cnJlbnRseSwgYSBwcm9maWxlIGZpbGUgY2FuCi0JCQljb250YWluIGFueSBudW1iZXIgYW5kIGFueSBjb21iaW5hdGlvbiBvZiBoaXN0b2dyYW0sCi0JCQljYWxsLWdyYXBoLCBvciBiYXNpYy1ibG9jayBjb3VudCByZWNvcmRzLgotCi0tcwkJLS1zdW0KLQotLXgJCS0tYWxsLWxpbmVzCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlCeSBkZWZhdWx0LCBvbmx5IHRoZSBsaW5lcyBhdCB0aGUgYmVnaW5uaW5nIG9mCi0JCQlhIGJhc2ljLWJsb2NrIGFyZSBhbm5vdGF0ZWQuICBJZiB0aGlzIG9wdGlvbiBpcwotCQkJc3BlY2lmaWVkLCBldmVyeSBsaW5lIGluIGEgYmFzaWMtYmxvY2sgaXMgYW5ub3RhdGVkCi0JCQlieSByZXBlYXRpbmcgdGhlIGFubm90YXRpb24gZm9yIHRoZSBmaXJzdCBsaW5lLgotCQkJVGhpcyBvcHRpb24gaXMgaWRlbnRpY2FsIHRvIHRjb3YncyAiLWEiLgotCi0tSSBkaXJzCQktLWRpcmVjdG9yeS1wYXRoPWRpcnMKLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLQkJCVNwZWNpZmllcyB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBiZSBzZWFyY2hlZAotCQkJZm9yIHNvdXJjZSBmaWxlcy4gIFRoZSBhcmd1bWVudCAiZGlycyIgaXMgYSBjb2xvbgotCQkJc2VwYXJhdGVkIGxpc3Qgb2YgZGlyZWN0b3JpZXMuICBCeSBkZWZhdWx0LCBncHJvZgotCQkJc2VhcmNoZXMgZm9yIHNvdXJjZSBmaWxlcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudAotCQkJd29ya2luZyBkaXJlY3Rvcnkgb25seS4KLQotLXoJCS0tZGlzcGxheS11bnVzZWQtZnVuY3Rpb25zCi0KLS1tIG51bQkJLS1taW4tY291bnQ9bnVtCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2UgYW5kIGV4ZWN1dGlvbgotCQkJY291bnQgb3V0cHV0IG9ubHkuICBTeW1ib2xzIHRoYXQgYXJlIGV4ZWN1dGVkCi0JCQlsZXNzIHRoYW4gIm51bSIgdGltZXMgYXJlIHN1cHByZXNzZWQuICBGb3IgYW5ub3RhdGVkCi0JCQlzb3VyY2Ugb3V0cHV0LCBzdXBwcmVzc2VkIHN5bWJvbHMgYXJlIG1hcmtlZAotCQkJYnkgZml2ZSBoYXNoLW1hcmtzICgjIyMjIykuICBJbiBhbiBleGVjdXRpb24gY291bnQKLQkJCW91dHB1dCwgc3VwcHJlc3NlZCBzeW1ib2xzIGRvIG5vdCBhcHBlYXIgYXQgYWxsLgotCi0tTAkJLS1wcmludC1wYXRoCi0JCQlOb3JtYWxseSwgc291cmNlIGZpbGVuYW1lcyBhcmUgcHJpbnRlZCB3aXRoIHRoZSBwYXRoCi0JCQljb21wb25lbnQgc3VwcHJlc3NlZC4gIFdpdGggdGhpcyBvcHRpb24sIGdwcm9mCi0JCQljYW4gYmUgZm9yY2VkIHRvIHByaW50IHRoZSBmdWxsIHBhdGhuYW1lIG9mCi0JCQlzb3VyY2UgZmlsZW5hbWVzLiAgVGhlIGZ1bGwgcGF0aG5hbWUgaXMgZGV0ZXJtaW5lZAotCQkJZnJvbSBzeW1ib2xpYyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGltYWdlIGZpbGUKLQkJCWFuZCBpcyByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlcgotCQkJd2FzIGludm9rZWQuCi0KLS15CQktLXNlcGFyYXRlLWZpbGVzCi0JCQlUaGlzIG9wdGlvbiBhZmZlY3RzIGFubm90YXRlZCBzb3VyY2Ugb3V0cHV0IG9ubHkuCi0JCQlOb3JtYWxseSwgZ3Byb2YgcHJpbnRzIGFubm90YXRlZCBzb3VyY2UgZmlsZXMKLQkJCXRvIHN0YW5kYXJkLW91dHB1dC4gIElmIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwKLQkJCWFubm90YXRlZCBzb3VyY2UgZm9yIGEgZmlsZSBuYW1lZCAicGF0aC9maWxlbmFtZSIKLQkJCWlzIGdlbmVyYXRlZCBpbiB0aGUgZmlsZSAiZmlsZW5hbWUtYW5uIi4gIFRoYXQgaXMsCi0JCQlhbm5vdGF0ZWQgb3V0cHV0IGlzIHtcZW0gYWx3YXlzXC99IGdlbmVyYXRlZCBpbgotCQkJZ3Byb2YncyBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiAgQ2FyZSBoYXMgdG8KLQkJCWJlIHRha2VuIGlmIGEgcHJvZ3JhbSBjb25zaXN0cyBvZiBmaWxlcyB0aGF0IGhhdmUKLQkJCWlkZW50aWNhbCBmaWxlbmFtZXMsIGJ1dCBkaXN0aW5jdCBwYXRocy4KLQotLWMJCS0tc3RhdGljLWNhbGwtZ3JhcGgKLQotLXQgbnVtCQktLXRhYmxlLWxlbmd0aD1udW0KLQkJCVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLQkJCUFmdGVyIGFubm90YXRpbmcgYSBzb3VyY2UgZmlsZSwgZ3Byb2YgZ2VuZXJhdGVzCi0JCQlhbiBleGVjdXRpb24gY291bnQgc3VtbWFyeSBjb25zaXN0aW5nIG9mIGEgdGFibGUKLQkJCW9mIGxpbmVzIHdpdGggdGhlIHRvcCBleGVjdXRpb24gY291bnRzLiAgQnkKLQkJCWRlZmF1bHQsIHRoaXMgdGFibGUgaXMgdGVuIGVudHJpZXMgbG9uZy4KLQkJCVRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgdGFibGUgbGVuZ3RoCi0JCQlvciwgYnkgc3BlY2lmeWluZyBhbiBhcmd1bWVudCB2YWx1ZSBvZiAwLCBpdCBjYW4gYmUKLQkJCXN1cHByZXNzZWQgY29tcGxldGVseS4KLQotLW4gc3ltc3BlYwktLXRpbWU9c3ltc3BlYwotCQkJT25seSBzeW1ib2xzIHNlbGVjdGVkIGJ5ICJzeW1zcGVjIiBhcmUgY29uc2lkZXJlZAotCQkJaW4gdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0JCQlIb3dldmVyLCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgcGVyY2VudGFnZSB0aW1lCi0JCQljb21wdXRhdGlvbiBmb3IgdGhlIGZsYXQgcHJvZmlsZS4KLQkJCUlmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLCB0aGUgdW5pb24KLQkJCW9mIGFsbCBzZWxlY3RlZCBzeW1ib2xzIGlzIHVzZWQgaW4gdGltZSBjb21wdXRhdGlvbnMuCi0KLS1OCQktLW5vLXRpbWU9c3ltc3BlYwotCQkJRXhjbHVkZSB0aGUgc3ltYm9scyBzZWxlY3RlZCBieSAic3ltc3BlYyIgZnJvbQotCQkJdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0JCQlIb3dldmVyLCB0aGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgcGVyY2VudGFnZSB0aW1lCi0JCQljb21wdXRhdGlvbiBmb3IgdGhlIGZsYXQgcHJvZmlsZS4KLQkJCVRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgaWYgYW55IC0tdGltZSBvcHRpb25zIGFyZQotCQkJc3BlY2lmaWVkLgotCi0tdyBudW0JCS0td2lkdGg9bnVtCi0JCQlTZXRzIHRoZSBvdXRwdXQgbGluZSB3aWR0aC4gIEN1cnJlbnRseSwgdGhpcyBvcHRpb24KLQkJCWFmZmVjdHMgdGhlIHByaW50aW5nIG9mIHRoZSBjYWxsLWdyYXBoIGZ1bmN0aW9uIGluZGV4Ci0JCQlvbmx5LgotCi0tZQkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLUUJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1mCQk8bm8gbG9uZyBmb3JtLS0tZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHk+Ci0tRgkJPG5vIGxvbmcgZm9ybS0tLWZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5PgotLWsJCTxubyBsb25nIGZvcm0tLS1mb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seT4KLS1iCQktLWJyaWVmCi0tZG51bQkJLS1kZWJ1Z1s9bnVtXQotCi0taAkJLS1oZWxwCi0JCQlQcmludHMgYSB1c2FnZSBtZXNzYWdlLgotCi0tTyBuYW1lCQktLWZpbGUtZm9ybWF0PW5hbWUKLQkJCVNlbGVjdHMgdGhlIGZvcm1hdCBvZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGVzLgotCQkJUmVjb2duaXplZCBmb3JtYXRzIGFyZSAiYXV0byIsICJic2QiLCAibWFnaWMiLAotCQkJYW5kICJwcm9mIi4gIFRoZSBsYXN0IG9uZSBpcyBub3QgeWV0IHN1cHBvcnRlZC4KLQkJCUZvcm1hdCAiYXV0byIgYXR0ZW1wdHMgdG8gZGV0ZWN0IHRoZSBmaWxlIGZvcm1hdAotCQkJYXV0b21hdGljYWxseSAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuCi0JCQlJdCBhdHRlbXB0cyB0byByZWFkIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMgYXMKLQkJCSJtYWdpYyIgZmlsZXMgYW5kIGlmIHRoaXMgZmFpbHMsIGZhbGxzIGJhY2sgdG8KLQkJCXRoZSAiYnNkIiBmb3JtYXQuICAiYnNkIiBmb3JjZXMgZ3Byb2YgdG8gcmVhZAotCQkJdGhlIGRhdGEgZmlsZXMgaW4gdGhlIEJTRCBmb3JtYXQuICAibWFnaWMiIGZvcmNlcwotCQkJZ3Byb2YgdG8gcmVhZCB0aGUgZGF0YSBmaWxlcyBpbiB0aGUgIm1hZ2ljIiBmb3JtYXQuCi0KLS1UCQktLXRyYWRpdGlvbmFsCi0tdgkJLS12ZXJzaW9uCi0KLSoqIEZpbGUgRm9ybWF0IENoYW5nZXMKLQotVGhlIG9sZCBCU0QtZGVyaXZlZCBmb3JtYXQgdXNlZCBmb3IgcHJvZmlsZSBkYXRhIGRvZXMgbm90IGNvbnRhaW4gYQotbWFnaWMgY29va2llIHRoYXQgYWxsb3dzIHRvIGNoZWNrIHdoZXRoZXIgYSBkYXRhIGZpbGUgcmVhbGx5IGlzIGEKLWdwcm9mIGZpbGUuICBGdXJ0aGVybW9yZSwgaXQgZG9lcyBub3QgcHJvdmlkZSBhIHZlcnNpb24gbnVtYmVyLCB0aHVzCi1yZW5kZXJpbmcgY2hhbmdlcyB0byB0aGUgZmlsZSBmb3JtYXQgYWxtb3N0IGltcG9zc2libGUuICBHTlUgZ3Byb2YKLXVzZXMgYSBuZXcgZmlsZSBmb3JtYXQgdGhhdCBwcm92aWRlcyB0aGVzZSBmZWF0dXJlcy4gIEZvciBiYWNrd2FyZAotY29tcGF0aWJpbGl0eSwgR05VIGdwcm9mIGNvbnRpbnVlcyB0byBzdXBwb3J0IHRoZSBvbGQgQlNELWRlcml2ZWQKLWZvcm1hdCwgYnV0IG5vdCBhbGwgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZCB3aXRoIGl0LiAgRm9yIGV4YW1wbGUsCi1iYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGNhbm5vdCBiZSBhY2NvbW1vZGF0ZWQgYnkgdGhlIG9sZCBmaWxlCi1mb3JtYXQuCi0KLVRoZSBuZXcgZmlsZSBmb3JtYXQgaXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZSBcZmlsZXtnbW9uX291dC5ofS4gIEl0Ci1jb25zaXN0cyBvZiBhIGhlYWRlciBjb250YWluaW5nIHRoZSBtYWdpYyBjb29raWUgYW5kIGEgdmVyc2lvbiBudW1iZXIsCi1hcyB3ZWxsIGFzIHNvbWUgc3BhcmUgYnl0ZXMgYXZhaWxhYmxlIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4gIEFsbCBkYXRhCi1pbiBhIHByb2ZpbGUgZGF0YSBmaWxlIGlzIGluIHRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZSBob3N0IG9uIHdoaWNoCi10aGUgcHJvZmlsZSB3YXMgY29sbGVjdGVkLiAgR05VIGdwcm9mIGFkYXB0cyBhdXRvbWF0aWNhbGx5IHRvIHRoZQotYnl0ZS1vcmRlciBpbiB1c2UuCi0KLUluIHRoZSBuZXcgZmlsZSBmb3JtYXQsIHRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZgotcmVjb3Jkcy4gIEN1cnJlbnRseSwgdGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCByZWNvcmQgdHlwZXM6IGhpc3RvZ3JhbQotcmVjb3JkcywgY2FsbC1ncmFwaCBhcmMgcmVjb3JkcywgYW5kIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudAotcmVjb3Jkcy4gIEVhY2ggZmlsZSBjYW4gY29udGFpbiBhbnkgbnVtYmVyIG9mIGVhY2ggcmVjb3JkIHR5cGUuICBXaGVuCi1yZWFkaW5nIGEgZmlsZSwgR05VIGdwcm9mIHdpbGwgZW5zdXJlIHJlY29yZHMgb2YgdGhlIHNhbWUgdHlwZSBhcmUKLWNvbXBhdGlibGUgd2l0aCBlYWNoIG90aGVyIGFuZCBjb21wdXRlIHRoZSB1bmlvbiBvZiBhbGwgcmVjb3Jkcy4gIEZvcgotZXhhbXBsZSwgZm9yIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMsIHRoZSB1bmlvbiBpcyBzaW1wbHkgdGhlIHN1bQotb2YgYWxsIGV4ZWN1dGlvbiBjb3VudHMgZm9yIGVhY2ggYmFzaWMtYmxvY2suCi0KLSoqKiBIaXN0b2dyYW0gUmVjb3JkcwotCi1IaXN0b2dyYW0gcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIHRoYXQgaXMgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YKLWJpbnMuICBUaGUgaGVhZGVyIGNvbnRhaW5zIHRoZSB0ZXh0LXNlZ21lbnQgcmFuZ2UgdGhhdCB0aGUgaGlzdG9ncmFtCi1zcGFucywgdGhlIHNpemUgb2YgdGhlIGhpc3RvZ3JhbSBpbiBieXRlcyAodW5saWtlIGluIHRoZSBvbGQgQlNECi1mb3JtYXQsIHRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyKSwgdGhlIHJhdGUgb2YgdGhlCi1wcm9maWxpbmcgY2xvY2ssIGFuZCB0aGUgcGh5c2ljYWwgZGltZW5zaW9uIHRoYXQgdGhlIGJpbiBjb3VudHMKLXJlcHJlc2VudCBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlIHByb2ZpbGluZyBjbG9jayByYXRlLiAgVGhlCi1waHlzaWNhbCBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHR3byBwYXJ0czogYSBsb25nIG5hbWUgb2YgdXAgdG8gMTUKLWNoYXJhY3RlcnMgYW5kIGEgc2luZ2xlIGNoYXJhY3RlciBhYmJyZXZpYXRpb24uICBGb3IgZXhhbXBsZSwgYQotaGlzdG9ncmFtIHJlcHJlc2VudGluZyByZWFsLXRpbWUgd291bGQgc3BlY2lmeSB0aGUgbG9uZyBuYW1lIGFzCi0ic2Vjb25kcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24gYXMgInMiLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IKLWFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IHBlcmZvcm1hbmNlIG1vbml0b3IgaGFyZHdhcmUgKHdoaWNoLAotZm9ydHVuYXRlbHksIGlzIGJlY29taW5nIGluY3JlYXNpbmdseSBjb21tb24pLiAgRm9yIGV4YW1wbGUsIHVuZGVyIERFQwotT1NGLzEsIHRoZSAidXByb2ZpbGUiIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZSBhIGhpc3RvZ3JhbSBvZiwKLXNheSwgaW5zdHJ1Y3Rpb24gY2FjaGUgbWlzc2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGltZW5zaW9uIGluIHRoZQotaGlzdG9ncmFtIGhlYWRlciBjb3VsZCBiZSBzZXQgdG8gImktY2FjaGUgbWlzc2VzIiBhbmQgdGhlIGFiYnJldmlhdGlvbgotY291bGQgYmUgc2V0IHRvICIxIiAoYmVjYXVzZSBpdCBpcyBzaW1wbHkgYSBjb3VudCwgbm90IGEgcGh5c2ljYWwKLWRpbWVuc2lvbikuICBBbHNvLCB0aGUgcHJvZmlsaW5nIHJhdGUgd291bGQgaGF2ZSB0byBiZSBzZXQgdG8gMSBpbgotdGhpcyBjYXNlLgotCi1IaXN0b2dyYW0gYmlucyBhcmUgMTYtYml0IG51bWJlcnMgYW5kIGVhY2ggYmluIHJlcHJlc2VudCBhbiBlcXVhbAotYW1vdW50IG9mIHRleHQtc3BhY2UuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRleHQtc2VnbWVudCBpcyBvbmUKLXRob3VzYW5kIGJ5dGVzIGxvbmcgYW5kIGlmIHRoZXJlIGFyZSB0ZW4gYmlucyBpbiB0aGUgaGlzdG9ncmFtLCBlYWNoCi1iaW4gcmVwcmVzZW50cyBvbmUgaHVuZHJlZCBieXRlcy4KLQotCi0qKiogQ2FsbC1HcmFwaCBSZWNvcmRzCi0KLUNhbGwtZ3JhcGggcmVjb3JkcyBoYXZlIGEgZm9ybWF0IHRoYXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgdXNlZCBpbgotdGhlIEJTRC1kZXJpdmVkIGZpbGUgZm9ybWF0LiAgSXQgY29uc2lzdHMgb2YgYW4gYXJjIGluIHRoZSBjYWxsIGdyYXBoCi1hbmQgYSBjb3VudCBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFyYyB3YXMgdHJhdmVyc2VkCi1kdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24uICBBcmNzIGFyZSBzcGVjaWZpZWQgYnkgYSBwYWlyIG9mIGFkZHJlc3NlczoKLXRoZSBmaXJzdCBtdXN0IGJlIHdpdGhpbiBjYWxsZXIncyBmdW5jdGlvbiBhbmQgdGhlIHNlY29uZCBtdXN0IGJlCi13aXRoaW4gdGhlIGNhbGxlZSdzIGZ1bmN0aW9uLiAgV2hlbiBwZXJmb3JtaW5nIHByb2ZpbGluZyBhdCB0aGUKLWZ1bmN0aW9uIGxldmVsLCB0aGVzZSBhZGRyZXNzZXMgY2FuIHBvaW50IGFueXdoZXJlIHdpdGhpbiB0aGUKLXJlc3BlY3RpdmUgZnVuY3Rpb24uICBIb3dldmVyLCB3aGVuIHByb2ZpbGluZyBhdCB0aGUgbGluZS1sZXZlbCwgaXQgaXMKLWJldHRlciBpZiB0aGUgYWRkcmVzc2VzIGFyZSBhcyBjbG9zZSB0byB0aGUgY2FsbC1zaXRlL2VudHJ5LXBvaW50IGFzCi1wb3NzaWJsZS4gIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgbGluZS1sZXZlbCBjYWxsLWdyYXBoIGlzIGFibGUgdG8KLWlkZW50aWZ5IGV4YWN0bHkgd2hpY2ggbGluZSBvZiBzb3VyY2UgY29kZSBwZXJmb3JtZWQgY2FsbHMgdG8gYQotZnVuY3Rpb24uCi0KLSoqKiBCYXNpYy1CbG9jayBFeGVjdXRpb24gQ291bnQgUmVjb3JkcwotCi1CYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQgcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIGZvbGxvd2VkIGJ5IGEKLXNlcXVlbmNlIG9mIGFkZHJlc3MvY291bnQgcGFpcnMuICBUaGUgaGVhZGVyIHNpbXBseSBzcGVjaWZpZXMgdGhlCi1sZW5ndGggb2YgdGhlIHNlcXVlbmNlLiAgSW4gYW4gYWRkcmVzcy9jb3VudCBwYWlyLCB0aGUgYWRkcmVzcwotaWRlbnRpZmllcyBhIGJhc2ljLWJsb2NrIGFuZCB0aGUgY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGltZXMKLXRoYXQgYmFzaWMtYmxvY2sgd2FzIGV4ZWN1dGVkLiAgQW55IGFkZHJlc3Mgd2l0aGluIHRoZSBiYXNpYy1hZGRyZXNzIGNhbgotYmUgdXNlZC4KLQotSU1QTEVNRU5UQVRJT04gTk9URTogZ2NjIC1hIGNhbiBiZSB1c2VkIHRvIGluc3RydW1lbnQgYSBwcm9ncmFtIHRvCi1yZWNvcmQgYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cy4gIEhvd2V2ZXIsIHRoZSBfX2JiX2V4aXRfZnVuYygpCi10aGF0IGlzIGN1cnJlbnRseSBwcmVzZW50IGluIGxpYmdjYzIuYyBkb2VzIG5vdCBnZW5lcmF0ZSBhIGdtb24ub3V0Ci1maWxlIGluIGEgc3VpdGVhYmxlIGZvcm1hdC4gIFRoaXMgc2hvdWxkIGJlIGZpeGVkIGZvciBmdXR1cmUgcmVsZWFzZXMKLW9mIGdjYy4gIEluIHRoZSBtZWFudGltZSwgY29udGFjdCBkYXZpZG1AY3MuYXJpem9uYS5lZHUgZm9yIGEgdmVyc2lvbgotb2YgX19iYl9leGl0X2Z1bmMoKSB0byBpcyBhcHByb3ByaWF0ZS4KZGlmZiAtLWdpdCBhL2dwcm9mL1RFU1QgYi9ncHJvZi9URVNUCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGE5MDMwLi4wMDAwMDAwCi0tLSBhL2dwcm9mL1RFU1QKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLS0gY2hlY2sgd2hldGhlciBvbGQgZmlsZSBmb3JtYXQgaXMgcHJvcGVybHkgcmVhZCB3aGVuIGlucHV0IGNvbWVzIGZyb20KLSAgc3RkaW4KLQotLSBjaGVjayB3aGV0aGVyIHVuZGVyc2NvcmVzIGFyZSBwcm9wZXJseSBkZWFsdCB3aXRoIChib3RoLCBvbiBzeXN0ZW1zCi0gIHRoYXQgcHJlcGVuZCB0aGVtIHRvIGVhY2ggQyBuYW1lIGFuZCBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QpCi0KLS0gZW5zdXJlIGdwcm9mIGZhaWxzIGdyYWNlZnVsbHkgd2hlbiBubyBkZWJ1Z2dpbmcgaW5mbyBhdmFpbGFibGUKZGlmZiAtLWdpdCBhL2dwcm9mL1RPRE8gYi9ncHJvZi9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDExMWM2Li4wMDAwMDAwCi0tLSBhL2dwcm9mL1RPRE8KKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0KLS0gZ21vbl9pby5jIGNhbm5vdCBkZWFsIHdpdGggdGFyZ2V0IGFyY2hpdGVjdHVyZSB0aGF0IGhhdmUgYSBwb2ludGVyIHNpemUKLSAgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgaG9zdCBhcmNoaXRlY3R1cmVzIHBvaW50ZXIgc2l6ZS0tLWZpeCB0aGlzCi0gIChnbW9uX291dC5oLCBhbmQgZ21vbl9pby5jKQotLSBhZGQgc3VwcG9ydCBmb3IgcHJvZiBmaWxlIGZvcm1hdCBzbyB0aGF0IHByb2YgZmlsZXMgY2FuIGJlIGRpc3BsYXllZAotICBhdCB0aGUgbGluZS1sZXZlbCAodGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB1cHJvZmlsZSB0b29sIHVuZGVyIERFQydzCi0gIE9TRi8xKQotLSB0YWtlIGEgaGFyZCBsb29rIGF0IC0tZmlsZS1vcmRlcmluZyAoYnJva2VuKSBhbmQgLS1mdW5jdGlvbi1vcmRlcmluZwotCi0rIGRvY3VtZW50YXRpb24KLSsgb3B0aW1pemUgYmZkX2ZpbmRfbmVhcmVzdF9saW5lX251bSgpIChvciByZXBsYWNlIGJ5IGRpZmZlcmVudCBpbnRlcmZhY2UpCi0rIGNsZWFudXAgX2JmZF9lY29mZl9maW5kX25lYXJlc3RfbGluZV9udW0oKSBmaXhlcyAmIGRlc2NyaXB0aW9uCi0rIGVuc3VyZSAiY2MgLXBnIiBwcm9kdWNlcyBnb29kIGZpbGVzIHVuZGVyIE9TRi8xIHYzLjAKLSsgbWFrZSBzdXJlIGdwcm9mIHdvcmtzIHRvZ2V0aGVyIHdpdGggT1NGLzEgdjMuMCdzIHByb2ZpbGluZyBsaWJyYXJpZXMKLSsgaW1wbGVtZW50IHN5bXRhYl9wYXJzZSgpOyBtb2RpZnkgc3ltX2xvb2t1cCgpIHRvIGNvbnNpZGVyIGFkZHJfaGlnaAotKyBjaGFuZ2UgZ3Byb2YuYyB0byBjb2xsZWN0IGxpc3RzLCB0aGVuIGludm9rZSBzeW10YWJfcGFyc2UoKSBmb3IKLSAgZWFjaCBsaXN0Ci0rIFF1ZXN0aW9uczoKLQlvIGlzIC1jICgtLXN0YXRpYy1jYWxsLWdyYXBoKSB1c2VmdWwgYXQgYWxsPyAgaSBjYW4ndCBzZWUKLQkgIGhvdzsgaWYgaXQgd2VyZSBkZWxldGVkLCBncHJvZiB3b3VsZCBiZSBjb21wbGV0ZWx5IG1hY2hpbmUKLQkgIGluZGVwZW5kZW50ID0+IHl1cCwgaXQgaXMKLQlvIGFyZSAobG9uZykgb3B0aW9uIG5hbWVzIGFwcHJvcHJpYXRlPwotCW8gLWsgKC0tZXhjbHVkZS1hcmMpIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCB3aXRoIGdldG9wdCgpOwotCSAgaXMgbmV3IHN5bnRheCAoLWsgZnJvbS90bykgYWNjZXB0YWJsZT8gIElmIG5vdCwgaG93IHRvCi0JICBmaXggaXQ/Ci0JbyBpbiB0aGUgRlNGIG91dHB1dCwgdGhlIGNhbGwtZ3JhcGggaW5kZXggbm93IHByaW50cwotCSAgdGhlIGZpbGVuYW1lIG9mIHN0YXRpYyBmdW5jdGlvbnMgaW4gcGFyZW50aGVzZXM7IGUuZy4sCi0JICBzdGF0aWMgZnVuY3Rpb24gZm9vKCkgdGhhdCBpcyBkZWZpbmVkIGluIGZpbGUgYmFyLmMKLQkgIHdvdWxkIGJlIHByaW50ZWQgYXM6Ci0KLQkJCVs0XSBmb28gKGJhci5jKQotCi0JICBpcyB0aGlzIGFjY2VwdGFibGU/ICBzaG91bGQgaXQgYmUgZG9uZSBvbmx5IG9wdGlvbmFsbHk/Ci0JbyBzeW1ib2xzIHdpdGggYWRkcmVzc2VzIHRoYXQgbWFwIGJhY2sgdG8gYSBkaWZmZXJlbnQKLQkgIG5hbWUgYXJlIHN1cHByZXNzZWQgKGhhcHBlbnMgd2l0aCBsYWJlbHMsIGZvciBleGFtcGxlKTsKLQkgIGlzIHRoaXMgYWNjZXB0YWJsZT8gIHNob3VsZCBpdCBiZSBkb25lIG9ubHkgb3B0aW9uYWxseT8KLSsgZ2VuZXJhbGl6ZSB0byBhbGxvdyBhcmJpdHJhcnkgaGlzdG9ncmFtcyAobm90IGp1c3QgdGltZSBoaXN0b2dyYW1zKQotKyBiYXNpYy1ibG9jayBpbmZvcm1hdGlvbiBjdXJyZW50bHkgcmVwbGFjZXMgYWxsIHN5bWJvbHMgY3JlYXRlZCBmcm9tCi0gIHRoZSBjb3JlIGJlY2F1c2Ugb2YgYW4gdWdseSBvcmRlcmluZyBjb25mbGljdC0tLWZvciBub3csIHRoZSBjdXJyZW50Ci0gIHNvbHV0aW9uIHdvcmtzLCBidXQgc29tZXRoaW5nIGNsZWFuZXIgaXMgZGVzaXJhYmxlID09PiBjbGVhbmVkIHVwLAotICBidXQgaXQncyBzbG93ZXIgbm93Ci0rIGNvbnZlcnQgdG8gdmVyeSBuZXcgZmlsZSBmb3JtYXQgKGJhY2sgdG8gdHJpdmlhbCBmb3JtYXQsIHRoYXQgaXMgOikKLSsgcmVwbGFjZSAiZHVtbXkuaCIgZm9yIEFscGhhIChpZiB0aGVyZSBpcyBhbnkgdXNlIHRvIGl0KQotKyBhZGQgc3VwcG9ydCBmb3IgZXhlY3V0aW9uIHRpbWUgcHJvZmlsaW5nIGF0IGEgYmFzaWMtYmxvY2sgbGV2ZWwKLSsgZml4IGZpbGVuYW1lLW9mZi1ieS1vbmUgYnVnIGZvciBBbHBoYSAoc2VlIH4vdG1wL2QuW2NoXSktLS1ubyBsb25nZXIKLSAgcmVsZXZhbnQKLSsgIi1wZyAtYSIgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkIGJlY2F1c2UgbWNsZWFudXAoKSB3aWxsIG92ZXJ3cml0ZQotICB0aGUgZmlsZSBnZW5lcmF0ZWQgYnkgX19iYl9leGl0X2Z1bmMoKSAob3IgdmljZSB2ZXJzYSkKLSsgZmlyc3QgYmFzaWMtYmxvY2sgb2YgZmFjKCkgc2VlbXMgdG8gZ2V0IGNyZWRpdGVkIHRvIGxhc3QgYmFzaWMtYmxvY2sKLSAgb2YgcHJldmlvdXMgZnVuY3Rpb24gPT4gYnVnIGluIGJhc2ljX2Jsb2Nrcy5jCi0rIGZsYXQgcHJvZmlsZSBzaG91bGQgcHJvdmlkZSBhdXRvbWF0aWMgc2NhbGluZyBmb3IgcGVyLWNhbGwgdGltZXMgYmVjYXVzZQotICBvdGhlcndpc2UgdGhleSdsbCBhbHdheXMgYmUgemVybyBvbiBhIGZhc3QgbWFjaGluZSB3aXRoIHRvbnMgb2Ygc21hbGwKLSAgZnVuY3Rpb25zCi0rIG1ha2UgIi1hIiBpbXBseSB0byByZXRhaW4gbGluZSBudW1iZXIgaW5mbyAod2l0aG91dCBhY3R1YWxseSBnZW5lcmF0aW5nCi0gIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gKHVubGVzcyAtZyBpcyBzcGVjaWZpZWQpLS0tbm8sIHRoaXMgaXMgYQotICBiYWQgaWRlYSwgYmVjYXVzZSBpdCBpcyBub3QgY2xlYXIgd2hhdCBsZXZlbCBvZiBkZWJ1Z2dpbmcgaW5mbyBzaG91bGQKLSAgYmUgcmVxdWVzdGVkIChlLmcuLCAtZyB2cy4gLWczKTsgbGVhdmluZyBpdCB1cCB0byB0aGUgdXNlciBzZWVtcyBiZXN0Ci0rIGFkZCBsb25nIG9wdGlvbnMgc3VwcG9ydCAob3IgYXQgbGVhc3QgdXNlIGdldG9wdCBpbnN0ZWFkIG9mIGFkLWhvYwotICBpbXBsZW1lbnRhdGlvbikKLSsgc3BsaXQgaW50byBmaWxlcyBhY2NvcmRpbmcgdG8gYWJzdHJhY3Qgb2JqZWN0cyB0aGF0IGFyZSBtYW5pcHVsYXRlZAotKyByZXBsYWNlIHNjY3NpZCBieSByY3NpZCAmIGFkZCAiZW5kIG9mIC4uLiIgdG8gZXZlcnkgLmMgZmlsZQotKyB1c2UgREJHKCkgZXZlcnl3aGVyZQotKyBmaXggc3BhY2luZyAoIiAsIiAtPiAiLCIgZXRjLikKLSsgdXNlIERFRlVOcyBldmVyeXdoZXJlCi0rIG1ha2UgY29tcGlsZSBjbGVhbmx5IHdpdGggLVdhbGwKLSsgImdjYyAtcGcgLU8yIiBkb2Vzbid0IHdvcmsgb24gdGVjYy5jIHVubGVzcyAtZm5vLW9taXQtZnJhbWUtcG9pbnRlciBpcwotICBzcGVjaWZpZWQ7IGZpbmQgb3V0IHdoeQotKyBtYWtlIHRoaW5ncyBwb3J0YWJsZSAocHJvdG90eXBlcywgY29uc3QsIGV0Yy4pCi0rIGlmIE5FV19HTU9OX09VVCBpcyBub3QgZGVmaW5lZCwgaGF2ZSBhIGZsYWcgdGhhdCB3aWxsIGFsbG93IHRvCi0gIHJlYWQgbmV3IGdtb24ub3V0IHN0eWxlIGZpbGVzLiAgVGhlIGlkZWEgYmVpbmcgdGhhdCBldmVyeW9uZQotICB3aWxsIHVzZSB0aGUgbmV3IGZvcm1hdCBmb3IgYmFzaWMtYmxvY2sgc3R5bGUgcHJvZmlsaW5nIGJ1dAotICB0aGUgb2xkIGZvcm1hdCBmb3IgcmVndWxhciBncHByb2ZpbGluZwpkaWZmIC0tZ2l0IGEvZ3Byb2YvYWNsb2NhbC5tNCBiL2dwcm9mL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjAxMjIuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMDkgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgMzUgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotQUNfQ0FDSEVfTE9BRAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotXSkKLQotQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKLVtBQ19QUkVSRVEoMi4xMylkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nXSwKLW5lZWRfbG9ja3M9JGVuYWJsZXZhbCwKLW5lZWRfbG9ja3M9eWVzKQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLV0pCi0KLSMgQUNfTElCVE9PTF9ETE9QRU4gLSBjaGVjayBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbbHRfZGxvcGVuPXllc10pCi0KLSMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwKLVtBQ19FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywKLVtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywKLVtBQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLAotW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwKLVtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1NVQlNUKExEKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBQ19TWVNfTk1fUEFSU0UgLSBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQKLSMgYnkgQyBzeW1ib2wgbmFtZSBmcm9tIG5tLgotQUNfREVGVU4oQUNfU1lTX05NX1BBUlNFLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlLAotWyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotY2hhbmdlcXVvdGUoLClkbmwKLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRhY19zeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotY2hhbmdlcXVvdGUoLClkbmwKLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotY2hhbmdlcXVvdGUoWyxdKWRubAotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotQUNfTVNHX1JFU1VMVCgkYWNfcmVzdWx0KQotXSkKLQotIyBBQ19TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFDX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUgLSBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiB1bmRlcnNjb3JlPwotQUNfREVGVU4oQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSwKLVthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotZmkKLXJtIC1yZiBjb25mdGVzdCoKLV0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCi1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci1BQ19TVUJTVChVU0VfU1lNQk9MX1VOREVSU0NPUkUpZG5sCi1dKQotCi0jIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihBQ19DSEVDS19MSUJNLCBbCi1BQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsKQotQUNfQ0hFQ0tfTElCKG0sIGNvcykKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgWwotICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgWwotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwgTElCTFRETD0iLWxsdGRsIiwgWwotICAgIGNhc2UgIiRlbmFibGVfbHRkbF9pbnN0YWxsIiBpbgotICAgIG5vKSBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkgOzsKLSAgICAiIikgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiIDs7Ci0gICAgZXNhYwotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHgibm8iOyB0aGVuCi0gICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKLSAgZmkKLV0pCi0KLWRubCBvbGQgbmFtZXMKLUFDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19OTV9QQVJTRSwgW2luZGlyKFtBQ19TWVNfTk1fUEFSU0VdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfU1lNQk9MX1VOREVSU0NPUkUsIFtpbmRpcihbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLCBbaW5kaXIoW0FDX1NZU19MSUJUT09MX0NZR1dJTl0pXSlkbmwKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotIyBBZGQgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9wdGlvbiB0byBjb25maWd1cmUuCi0jIEZyb20gSmltIE1leWVyaW5nCi0KLSMgc2VyaWFsIDEKLQotQUNfREVGVU4oQU1fTUFJTlRBSU5FUl9NT0RFLAotW0FDX01TR19DSEVDS0lORyhbd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXNdKQotICBkbmwgbWFpbnRhaW5lci1tb2RlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgQUNfQVJHX0VOQUJMRShtYWludGFpbmVyLW1vZGUsCi1bICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXJdLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT0kZW5hYmxldmFsLAotICAgICAgVVNFX01BSU5UQUlORVJfTU9ERT1ubykKLSAgQUNfTVNHX1JFU1VMVCgkVVNFX01BSU5UQUlORVJfTU9ERSkKLSAgQU1fQ09ORElUSU9OQUwoTUFJTlRBSU5FUl9NT0RFLCB0ZXN0ICRVU0VfTUFJTlRBSU5FUl9NT0RFID0geWVzKQotICBNQUlOVD0kTUFJTlRBSU5FUl9NT0RFX1RSVUUKLSAgQUNfU1VCU1QoTUFJTlQpZG5sCi1dCi0pCi0KLSMgRGVmaW5lIGEgY29uZGl0aW9uYWwuCi0KLUFDX0RFRlVOKEFNX0NPTkRJVElPTkFMLAotW0FDX1NVQlNUKCQxX1RSVUUpCi1BQ19TVUJTVCgkMV9GQUxTRSkKLWlmICQyOyB0aGVuCi0gICQxX1RSVUU9Ci0gICQxX0ZBTFNFPScjJwotZWxzZQotICAkMV9UUlVFPScjJwotICAkMV9GQUxTRT0KLWZpXSkKLQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYWxwaGEuYyBiL2dwcm9mL2FscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNGYyMmUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYWxwaGEuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk4IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0vKgotICogT3Bjb2RlcyBvZiB0aGUgY2FsbCBpbnN0cnVjdGlvbnM6Ci0gKi8KLSNkZWZpbmUgT1BfSnh4CTB4MWEKLSNkZWZpbmUJT1BfQlNSCTB4MzQKLQotI2RlZmluZSBKeHhfRlVOQ19KTVAJCTAKLSNkZWZpbmUgSnh4X0ZVTkNfSlNSCQkxCi0jZGVmaW5lIEp4eF9GVU5DX1JFVAkJMgotI2RlZmluZSBKeHhfRlVOQ19KU1JfQ09ST1VUSU5FCTMKLQotdHlwZWRlZiB1bmlvbgotICB7Ci0gICAgc3RydWN0Ci0gICAgICB7Ci0JdW5zaWduZWQgb3RoZXI6MjY7Ci0JdW5zaWduZWQgb3BfY29kZTo2OwotICAgICAgfQotICAgIGE7CQkJCS8qIGFueSBmb3JtYXQgKi8KLSAgICBzdHJ1Y3QKLSAgICAgIHsKLQlpbnQgZGlzcDoyMTsKLQl1bnNpZ25lZCByYTo1OwotCXVuc2lnbmVkIG9wX2NvZGU6NjsKLSAgICAgIH0KLSAgICBiOwkJCQkvKiBicmFuY2ggZm9ybWF0ICovCi0gICAgc3RydWN0Ci0gICAgICB7Ci0JaW50IGhpbnQ6MTQ7Ci0JdW5zaWduZWQgZnVuYzoyOwotCXVuc2lnbmVkIHJiOjU7Ci0JdW5zaWduZWQgcmE6NTsKLQl1bnNpZ25lZCBvcF9jb2RlOjY7Ci0gICAgICB9Ci0gICAgajsJCQkJLyoganVtcCBmb3JtYXQgKi8KLSAgfQotYWxwaGFfSW5zdHJ1Y3Rpb247Ci0KLXN0YXRpYyBTeW0gaW5kaXJlY3RfY2hpbGQ7Ci0KLQotLyoKLSAqIE9uIHRoZSBBbHBoYSB3ZSBjYW4gb25seSBkZXRlY3QgUEMgcmVsYXRpdmUgY2FsbHMsIHdoaWNoIGFyZQotICogdXN1YWxseSBnZW5lcmF0ZWQgZm9yIGNhbGxzIHRvIGZ1bmN0aW9ucyB3aXRoaW4gdGhlIHNhbWUKLSAqIG9iamVjdCBmaWxlIG9ubHkuICBUaGlzIGlzIHN0aWxsIGJldHRlciB0aGFuIG5vdGhpbmcsIGhvd2V2ZXIuCi0gKiAoSW4gcGFydGljdWxhciBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gZmluZCBmdW5jdGlvbnMgdGhhdAotICogIHBvdGVudGlhbGx5IGNhbGwgaW50ZWdlciBkaXZpc2lvbiByb3V0aW5lcywgZm9yIGV4YW1wbGUuKQotICovCi12b2lkCi1hbHBoYV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHN0YXRpYyBiZmRfdm1hIGRlbHRhID0gMDsKLSAgYmZkX3ZtYSBkZXN0X3BjOwotICBhbHBoYV9JbnN0cnVjdGlvbiAqcGM7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgaWYgKCFkZWx0YSkKLSAgICB7Ci0gICAgICBkZWx0YSA9IChiZmRfdm1hKSBjb3JlX3RleHRfc3BhY2UgLSBjb3JlX3RleHRfc2VjdC0+dm1hOwotCi0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0X2NoaWxkKTsKLSAgICAgIGluZGlyZWN0X2NoaWxkLm5hbWUgPSBfKCI8aW5kaXJlY3QgY2hpbGQ+Iik7Ci0gICAgICBpbmRpcmVjdF9jaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RfY2hpbGQuY2cuY3ljLmhlYWQgPSAmaW5kaXJlY3RfY2hpbGQ7Ci0gICAgfQotCi0gIGlmICghY29yZV90ZXh0X3NwYWNlKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChwX2xvd3BjIDwgc19sb3dwYykKLSAgICB7Ci0gICAgICBwX2xvd3BjID0gc19sb3dwYzsKLSAgICB9Ci0gIGlmIChwX2hpZ2hwYyA+IHNfaGlnaHBjKQotICAgIHsKLSAgICAgIHBfaGlnaHBjID0gc19oaWdocGM7Ci0gICAgfQotICBEQkcgKENBTExERUJVRywgcHJpbnRmIChfKCJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIpLAotCQkJICBwYXJlbnQtPm5hbWUsIHBfbG93cGMsIHBfaGlnaHBjKSk7Ci0gIGZvciAocGMgPSAoYWxwaGFfSW5zdHJ1Y3Rpb24gKikgKHBfbG93cGMgKyBkZWx0YSk7Ci0gICAgICAgcGMgPCAoYWxwaGFfSW5zdHJ1Y3Rpb24gKikgKHBfaGlnaHBjICsgZGVsdGEpOwotICAgICAgICsrcGMpCi0gICAgewotICAgICAgc3dpdGNoIChwYy0+YS5vcF9jb2RlKQotCXsKLQljYXNlIE9QX0p4eDoKLQkgIC8qCi0JICAgKiBUaGVyZSBpcyBubyBzaW1wbGUgYW5kIHJlbGlhYmxlIHdheSB0byBkZXRlcm1pbmUgdGhlCi0JICAgKiB0YXJnZXQgb2YgYSBqc3IgKHRoZSBoaW50IGJpdHMgaGVscCwgYnV0IHRoZXJlIGFyZW4ndAotCSAgICogZW5vdWdoIGJpdHMgdG8gZ2V0IGEgc2F0aXNmYWN0b3J5IGhpdCByYXRlKS4gIEluc3RlYWQsCi0JICAgKiBmb3IgYW55IGluZGlyZWN0IGp1bXAgd2Ugc2ltcGx5IGFkZCBhbiBhcmMgZnJvbSBQQVJFTlQKLQkgICAqIHRvIElORElSRUNUX0NISUxELS0tdGhhdCB3YXkgdGhlIHVzZXIgaXQgYXQgbGVhc3QgYWJsZQotCSAgICogdG8gc2VlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGNhbGxzIGFzIHdlbGwuCi0JICAgKi8KLQkgIGlmIChwYy0+ai5mdW5jID09IEp4eF9GVU5DX0pTUgotCSAgICAgIHx8IHBjLT5qLmZ1bmMgPT0gSnh4X0ZVTkNfSlNSX0NPUk9VVElORSkKLQkgICAgewotCSAgICAgIERCRyAoQ0FMTERFQlVHLAotCQkgICBwcmludGYgKF8oIltmaW5kX2NhbGxdIDB4JWx4OiBqc3IlcyA8aW5kaXJlY3RfY2hpbGQ+XG4iKSwKLQkJCSAgIChiZmRfdm1hKSBwYyAtIGRlbHRhLAotCQkJICAgcGMtPmouZnVuYyA9PSBKeHhfRlVOQ19KU1IgPyAiIiA6ICJfY29yb3V0aW5lIikpOwotCSAgICAgIGFyY19hZGQgKHBhcmVudCwgJmluZGlyZWN0X2NoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBPUF9CU1I6Ci0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmIChfKCJbZmluZF9jYWxsXSAweCVseDogYnNyIiksIChiZmRfdm1hKSBwYyAtIGRlbHRhKSk7Ci0JICAvKgotCSAgICogUmVndWxhciBQQyByZWxhdGl2ZSBhZGRyZXNzaW5nLiAgQ2hlY2sgdGhhdCB0aGlzIGlzIHRoZQotCSAgICogYWRkcmVzcyBvZiBhIGZ1bmN0aW9uLiAgVGhlIGxpbmtlciBzb21ldGltZXMgcmVkaXJlY3RzCi0JICAgKiB0aGUgZW50cnkgcG9pbnQgYnkgOCBieXRlcyB0byBza2lwIGxvYWRpbmcgdGhlIGdsb2JhbAotCSAgICogcG9pbnRlciwgc28gd2UgYWxsIGZvciBlaXRoZXIgYWRkcmVzczoKLQkgICAqLwotCSAgZGVzdF9wYyA9ICgoYmZkX3ZtYSkgKHBjICsgMSArIHBjLT5iLmRpc3ApKSAtIGRlbHRhOwotCSAgaWYgKGRlc3RfcGMgPj0gc19sb3dwYyAmJiBkZXN0X3BjIDw9IHNfaGlnaHBjKQotCSAgICB7Ci0JICAgICAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0X3BjKTsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmICgiIDB4JWx4XHQ7IG5hbWU9JXMsIGFkZHI9MHglbHgiLAotCQkJICAgZGVzdF9wYywgY2hpbGQtPm5hbWUsIGNoaWxkLT5hZGRyKSk7Ci0JICAgICAgaWYgKGNoaWxkLT5hZGRyID09IGRlc3RfcGMgfHwgY2hpbGQtPmFkZHIgPT0gZGVzdF9wYyAtIDgpCi0JCXsKLQkJICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXG4iKSk7Ci0JCSAgLyogYSBoaXQ6ICAqLwotCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICB9Ci0JICAvKgotCSAgICogU29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvYmFzaWNfYmxvY2tzLmMgYi9ncHJvZi9iYXNpY19ibG9ja3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiNmY4ZC4uMDAwMDAwMAotLS0gYS9ncHJvZi9iYXNpY19ibG9ja3MuYworKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0vKgotICogQmFzaWMtYmxvY2sgbGV2ZWwgcmVsYXRlZCBjb2RlOiByZWFkaW5nL3dyaXRpbmcgb2YgYmFzaWMtYmxvY2sgaW5mbwotICogdG8vZnJvbSBnbW9uLm91dDsgY29tcHV0aW5nIGFuZCBmb3JtYXR0aW5nIG9mIGJhc2ljLWJsb2NrIHJlbGF0ZWQKLSAqIHN0YXRpc3RpY3MuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgImJhc2ljX2Jsb2Nrcy5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzb3VyY2UuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLQotLyoKLSAqIERlZmF1bHQgb3B0aW9uIHZhbHVlczoKLSAqLwotYm9vbCBiYl9hbm5vdGF0ZV9hbGxfbGluZXMgPSBGQUxTRTsKLXVuc2lnbmVkIGxvbmcgYmJfbWluX2NhbGxzID0gMTsKLWludCBiYl90YWJsZV9sZW5ndGggPSAxMDsKLQotLyoKLSAqIFZhcmlhYmxlcyB1c2VkIHRvIGNvbXB1dGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIHN0YXRzOgotICovCi1zdGF0aWMgbG9uZyBudW1fZXhlY3V0YWJsZV9saW5lczsKLXN0YXRpYyBsb25nIG51bV9saW5lc19leGVjdXRlZDsKLQotCi0vKgotICogSGVscGVyIGZvciBzb3J0aW5nLiAgQ29tcGFyZXMgdHdvIHN5bWJvbHMgYW5kIHJldHVybnMgcmVzdWx0Ci0gKiBzdWNoIHRoYXQgc29ydGluZyB3aWxsIGJlIGluY3JlYXNpbmcgYWNjb3JkaW5nIHRvIGZpbGVuYW1lLCBsaW5lCi0gKiBudW1iZXIsIGFuZCBhZGRyZXNzIChpbiB0aGF0IG9yZGVyKS4KLSAqLwotCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2JiLCAobHAsIHJwKSwgY29uc3Qgdm9pZCAqbHAgQU5EIGNvbnN0IHZvaWQgKnJwKQotewotICBpbnQgcjsKLSAgY29uc3QgU3ltICpsZWZ0ID0gKihjb25zdCBTeW0gKiopIGxwOwotICBjb25zdCBTeW0gKnJpZ2h0ID0gKihjb25zdCBTeW0gKiopIHJwOwotCi0gIGlmIChsZWZ0LT5maWxlICYmIHJpZ2h0LT5maWxlKQotICAgIHsKLSAgICAgIHIgPSBzdHJjbXAgKGxlZnQtPmZpbGUtPm5hbWUsIHJpZ2h0LT5maWxlLT5uYW1lKTsKLSAgICAgIGlmIChyKQotCXsKLQkgIHJldHVybiByOwotCX0KLQotICAgICAgaWYgKGxlZnQtPmxpbmVfbnVtICE9IHJpZ2h0LT5saW5lX251bSkKLQl7Ci0JICByZXR1cm4gbGVmdC0+bGluZV9udW0gLSByaWdodC0+bGluZV9udW07Ci0JfQotICAgIH0KLQotICBpZiAobGVmdC0+YWRkciA8IHJpZ2h0LT5hZGRyKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlZnQtPmFkZHIgPiByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIEhlbHBlciBmb3Igc29ydGluZy4gIE9yZGVyIGJhc2ljIGJsb2NrcyBpbiBkZWNyZWFzaW5nIG51bWJlciBvZgotICogY2FsbHMsIHRpZXMgYXJlIGJyb2tlbiBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIGxpbmUgbnVtYmVycy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9uY2FsbHMsIChscCwgcnApLCBjb25zdCB2b2lkICpscCBBTkQgY29uc3Qgdm9pZCAqcnApCi17Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLQotICBpZiAoIWxlZnQpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBlbHNlIGlmICghcmlnaHQpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAobGVmdC0+bmNhbGxzIDwgcmlnaHQtPm5jYWxscykKLSAgICByZXR1cm4gMTsKLSAgZWxzZSBpZiAobGVmdC0+bmNhbGxzID4gcmlnaHQtPm5jYWxscykKLSAgICByZXR1cm4gLTE7Ci0KLSAgcmV0dXJuIGxlZnQtPmxpbmVfbnVtIC0gcmlnaHQtPmxpbmVfbnVtOwotfQotCi0KLS8qCi0gKiBTa2lwIG92ZXIgdmFyaWFibGUgbGVuZ3RoIHN0cmluZy4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChmc2tpcF9zdHJpbmcsIChmcCksIEZJTEUgKiBmcCkKLXsKLSAgaW50IGNoOwotCi0gIHdoaWxlICgoY2ggPSBmZ2V0YyAoZnApKSAhPSBFT0YpCi0gICAgewotICAgICAgaWYgKGNoID09ICdcMCcpCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogUmVhZCBhIGJhc2ljLWJsb2NrIHJlY29yZCBmcm9tIGZpbGUgSUZQLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUKLSAqIG9mIGZpbGUgSUZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcyBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoYmJfcmVhZF9yZWMsIChpZnAsIGZpbGVuYW1lKSwgRklMRSAqIGlmcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGludCBuYmxvY2tzLCBiOwotICBiZmRfdm1hIGFkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwotICBTeW0gKnN5bTsKLQotICBpZiAoZnJlYWQgKCZuYmxvY2tzLCBzaXplb2YgKG5ibG9ja3MpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLCB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBuYmxvY2tzID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIG5ibG9ja3MpOwotICBpZiAoZ21vbl9maWxlX3ZlcnNpb24gPT0gMCkKLSAgICB7Ci0gICAgICBmc2tpcF9zdHJpbmcgKGlmcCk7Ci0gICAgfQotCi0gIGZvciAoYiA9IDA7IGIgPCBuYmxvY2tzOyArK2IpCi0gICAgewotICAgICAgaWYgKGdtb25fZmlsZV92ZXJzaW9uID09IDApCi0JewotCSAgaW50IGxpbmVfbnVtOwotCSAgLyoKLQkgICAqIFZlcnNpb24gMCBoYWQgbG90cyBvZiBleHRyYSBzdHVmZiB0aGF0IHdlIGRvbid0Ci0JICAgKiBjYXJlIGFib3V0IGFueW1vcmUuCi0JICAgKi8KLQkgIGlmICgoZnJlYWQgKCZuY2FsbHMsIHNpemVvZiAobmNhbGxzKSwgMSwgaWZwKSAhPSAxKQotCSAgICAgIHx8IChmcmVhZCAoJmFkZHIsIHNpemVvZiAoYWRkciksIDEsIGlmcCkgIT0gMSkKLQkgICAgICB8fCAoZnNraXBfc3RyaW5nIChpZnApLCBGQUxTRSkKLQkgICAgICB8fCAoZnNraXBfc3RyaW5nIChpZnApLCBGQUxTRSkKLQkgICAgICB8fCAoZnJlYWQgKCZsaW5lX251bSwgc2l6ZW9mIChsaW5lX251bSksIDEsIGlmcCkgIT0gMSkpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZnJlYWQgKCZhZGRyLCBzaXplb2YgKGFkZHIpLCAxLCBpZnApICE9IDEKLQkgICAgICB8fCBmcmVhZCAoJm5jYWxscywgc2l6ZW9mIChuY2FsbHMpLCAxLCBpZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyoKLSAgICAgICAqIEJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgYXJlIG1lYW5pbmdmdWwgb25seSBpZiB3ZSdyZQotICAgICAgICogcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWJ5LWxpbmUgbGV2ZWw6Ci0gICAgICAgKi8KLSAgICAgIGlmIChsaW5lX2dyYW51bGFyaXR5KQotCXsKLQotCSAgLyogY29udmVydCBmcm9tIHRhcmdldCB0byBob3N0IGVuZGlhbm5lc3M6ICovCi0KLQkgIGFkZHIgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICYgYWRkcik7Ci0JICBuY2FsbHMgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZuY2FsbHMpOwotCi0JICBzeW0gPSBzeW1fbG9va3VwICgmc3ltdGFiLCBhZGRyKTsKLQotCSAgaWYgKHN5bSkKLQkgICAgewotCSAgICAgIGludCBpOwotCi0JICAgICAgREJHIChCQkRFQlVHLAotCQkgICBwcmludGYgKCJbYmJfcmVhZF9yZWNdIDB4JWx4LT4weCVseCAoJXM6JWQpIGNudD0lbHVcbiIsCi0JCQkgICBhZGRyLCBzeW0tPmFkZHIsIHN5bS0+bmFtZSwgc3ltLT5saW5lX251bSwgbmNhbGxzKSk7Ci0KLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUzsgaSsrKQotCQl7Ci0JCSAgaWYgKCEgc3ltLT5iYl9hZGRyW2ldIHx8IHN5bS0+YmJfYWRkcltpXSA9PSBhZGRyKQotCQkgICAgewotCQkgICAgICBzeW0tPmJiX2FkZHJbaV0gPSBhZGRyOwotCQkgICAgICBzeW0tPmJiX2NhbGxzW2ldICs9IG5jYWxsczsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdGF0aWMgYm9vbCB1c2VyX3dhcm5lZCA9IEZBTFNFOwotCi0JICBpZiAoIXVzZXJfd2FybmVkKQotCSAgICB7Ci0JICAgICAgdXNlcl93YXJuZWQgPSBUUlVFOwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiB3YXJuaW5nOiBpZ25vcmluZyBiYXNpYy1ibG9jayBleGVjIGNvdW50cyAodXNlIC1sIG9yIC0tbGluZSlcbiIpLAotCQkgICAgICAgd2hvYW1pKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybjsKLX0KLQotCi0vKgotICogV3JpdGUgYWxsIGJhc2ljLWJsb2NrcyB3aXRoIG5vbi16ZXJvIGNvdW50cyB0byBmaWxlIE9GUC4gIEZJTEVOQU1FCi0gKiBpcyB0aGUgbmFtZSBvZiBPRlAgYW5kIGlzIHByb3ZpZGVkIGZvciBwcm9kdWNpbmcgZXJyb3ItbWVzc2FnZXMKLSAqIG9ubHkuCi0gKi8KLXZvaWQKLURFRlVOIChiYl93cml0ZV9ibG9ja3MsIChvZnAsIGZpbGVuYW1lKSwgRklMRSAqIG9mcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFnID0gR01PTl9UQUdfQkJfQ09VTlQ7Ci0gIGludCBuYmxvY2tzID0gMDsKLSAgYmZkX3ZtYSBhZGRyOwotICB1bnNpZ25lZCBsb25nIG5jYWxsczsKLSAgU3ltICpzeW07Ci0gIGludCBpOwotCi0gIC8qIGNvdW50IGhvdyBtYW55IG5vbi16ZXJvIGJsb2NrcyB3aXRoIGhhdmU6ICovCi0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUyAmJiBzeW0tPmJiX2FkZHJbaV07IGkrKykKLQk7Ci0gICAgICBuYmxvY2tzICs9IGk7Ci0gICAgfQotCi0gIC8qIHdyaXRlIGhlYWRlcjogKi8KLSAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIG5ibG9ja3MsIChiZmRfYnl0ZSAqKSAmIG5ibG9ja3MpOwotICBpZiAoZndyaXRlICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIG9mcCkgIT0gMQotICAgICAgfHwgZndyaXRlICgmbmJsb2Nrcywgc2l6ZW9mIChuYmxvY2tzKSwgMSwgb2ZwKSAhPSAxKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIHdyaXRlIGNvdW50czogKi8KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgTkJCUyAmJiBzeW0tPmJiX2FkZHJbaV07IGkrKykKLQl7Ci0JICBwdXRfdm1hIChjb3JlX2JmZCwgc3ltLT5iYl9hZGRyW2ldLCAoYmZkX2J5dGUgKikgJiBhZGRyKTsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBzeW0tPmJiX2NhbGxzW2ldLCAoYmZkX2J5dGUgKikgJiBuY2FsbHMpOwotCi0JICBpZiAoZndyaXRlICgmYWRkciwgc2l6ZW9mIChhZGRyKSwgMSwgb2ZwKSAhPSAxCi0JICAgICAgfHwgZndyaXRlICgmbmNhbGxzLCBzaXplb2YgKG5jYWxscyksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogT3V0cHV0IGJhc2ljLWJsb2NrIHN0YXRpc3RpY3MgaW4gYSBmb3JtYXQgdGhhdCBpcyBlYXNpbHkgcGFyc2VhYmxlLgotICogQ3VycmVudCB0aGUgZm9ybWF0IGlzOgotICoKLSAqICAgICAgPGZpbGVuYW1lPjo8bGluZS1udW1iZXI+OiAoPGZ1bmN0aW9uLW5hbWU+OjxiYi1hZGRyKTogPG5jYWxscz4KLSAqLwotdm9pZAotREVGVU5fVk9JRCAocHJpbnRfZXhlY19jb3VudHMpCi17Ci0gIFN5bSAqKnNvcnRlZF9iYnMsICpzeW07Ci0gIGludCBpLCBqLCBsZW47Ci0KLSAgaWYgKGZpcnN0X291dHB1dCkKLSAgICB7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJcZlxuIik7Ci0gICAgfQotCi0gIC8qIHNvcnQgYmFzaWMtYmxvY2tzIGFjY29yZGluZyB0byBmdW5jdGlvbiBuYW1lIGFuZCBsaW5lIG51bWJlcjogKi8KLQotICBzb3J0ZWRfYmJzID0gKFN5bSAqKikgeG1hbGxvYyAoc3ltdGFiLmxlbiAqIHNpemVvZiAoc29ydGVkX2Jic1swXSkpOwotICBsZW4gPSAwOwotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBBY2NlcHQgc3ltYm9sIGlmIGl0J3MgaW4gdGhlIElOQ0xfRVhFQyB0YWJsZQotICAgICAgICogb3IgdGhlcmUgaXMgbm8gSU5DTF9FWEVDIHRhYmxlCi0gICAgICAgKiAgICBhbmQgaXQgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBFWENMX0VYRUMgdGFibGUuCi0gICAgICAgKi8KLSAgICAgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0VYRUNdLCBzeW0tPmFkZHIpCi0JICB8fCAoc3ltc1tJTkNMX0VYRUNdLmxlbiA9PSAwCi0JICAgICAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfRVhFQ10sIHN5bS0+YWRkcikpKQotCXsKLQkgIHNvcnRlZF9iYnNbbGVuKytdID0gc3ltOwotCX0KLSAgICB9Ci0gIHFzb3J0IChzb3J0ZWRfYmJzLCBsZW4sIHNpemVvZiAoc29ydGVkX2Jic1swXSksIGNtcF9iYik7Ci0KLSAgLyogb3V0cHV0IGJhc2ljLWJsb2NrczogKi8KLQotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCi0gICAgewotICAgICAgaWYgKHN5bS0+bmNhbGxzID4gMCB8fCAhIGlnbm9yZV96ZXJvcykKLQl7Ci0JICBwcmludGYgKF8oIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iKSwKLQkJICBzeW0tPmZpbGUgPyBzeW0tPmZpbGUtPm5hbWUgOiBfKCI8dW5rbm93bj4iKSwgc3ltLT5saW5lX251bSwKLQkJICBzeW0tPm5hbWUsIHN5bS0+YWRkciwgc3ltLT5uY2FsbHMpOwotCX0KLSAgICAgIGZvciAoaiA9IDA7IGogPCBOQkJTICYmIHN5bS0+YmJfYWRkcltqXTsgaiArKykKLQl7Ci0JICBpZiAoc3ltLT5iYl9jYWxsc1tqXSA+IDAgfHwgISBpZ25vcmVfemVyb3MpCi0JICAgIHsKLQkgICAgICBwcmludGYgKF8oIiVzOiVkOiAoJXM6MHglbHgpICVsdSBleGVjdXRpb25zXG4iKSwKLQkJICAgICAgc3ltLT5maWxlID8gc3ltLT5maWxlLT5uYW1lIDogXygiPHVua25vd24+IiksIHN5bS0+bGluZV9udW0sCi0JCSAgICAgIHN5bS0+bmFtZSwgc3ltLT5iYl9hZGRyW2pdLCBzeW0tPmJiX2NhbGxzW2pdKTsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGZyZWUgKHNvcnRlZF9iYnMpOwotfQotCi0vKgotICogSGVscGVyIGZvciBiYl9hbm5vdGF0ZWRfc291cmNlOiBmb3JtYXQgYW5ub3RhdGlvbiBjb250YWluaW5nCi0gKiBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zLiAgRGVwZW5kcyBvbiBiZWluZyBjYWxsZWQgb24gZWFjaAotICogbGluZSBvZiBhIGZpbGUgaW4gc2VxdWVudGlhbCBvcmRlci4KLSAqCi0gKiBHbG9iYWwgdmFyaWFibGUgYmJfYW5ub3RhdGVfYWxsX2xpbmVzIGVuYWJsZXMgZXhlY3V0aW9uIGNvdW50Ci0gKiBjb21wcmVzc2lvbiAoY291bnRzIGFyZSBzdXByZXNzZWQgaWYgaWRlbnRpY2FsIHRvIHRoZSBsYXN0IG9uZSkKLSAqIGFuZCBwcmludHMgY291bnRzIG9uIGFsbCBleGVjdXRlZCBsaW5lcy4gIE90aGVyd2lzZSwgcHJpbnQKLSAqIGFsbCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzIGV4YWN0bHkgb25jZSBvbiB0aGUgbGluZQotICogdGhhdCBzdGFydHMgdGhlIGJhc2ljLWJsb2NrLgotICovCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAoYW5ub3RhdGVfd2l0aF9jb3VudCwgKGJ1Ziwgd2lkdGgsIGxpbmVfbnVtLCBhcmcpLAotICAgICAgIGNoYXIgKmJ1ZiBBTkQgaW50IHdpZHRoIEFORCBpbnQgbGluZV9udW0gQU5EIHZvaWQgKmFyZykKLXsKLSAgU291cmNlX0ZpbGUgKnNmID0gYXJnOwotICBTeW0gKmI7Ci0gIGludCBpOwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0X2NvdW50OwotICB1bnNpZ25lZCBsb25nIGxhc3RfcHJpbnQgPSAodW5zaWduZWQgbG9uZykgLTE7Ci0KLSAgYiA9IE5VTEw7Ci0gIGlmIChsaW5lX251bSA8PSBzZi0+bnVtX2xpbmVzKQotICAgIHsKLSAgICAgIGIgPSBzZi0+bGluZVtsaW5lX251bSAtIDFdOwotICAgIH0KLSAgaWYgKCFiKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQotCWJ1ZltpXSA9ICcgJzsKLSAgICAgIGJ1Zlt3aWR0aF0gPSAnXDAnOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgdG1wYnVmW05CQlMgKiAzMF07Ci0gICAgICBjaGFyICpwOwotICAgICAgdW5zaWduZWQgbG9uZyBuY2FsbHM7Ci0gICAgICBpbnQgbmNhbGxzX3NldDsKLSAgICAgIGludCBsZW47Ci0KLSAgICAgICsrbnVtX2V4ZWN1dGFibGVfbGluZXM7Ci0KLSAgICAgIHAgPSB0bXBidWY7Ci0gICAgICAqcCA9ICdcMCc7Ci0KLSAgICAgIG5jYWxscyA9IDA7Ci0gICAgICBuY2FsbHNfc2V0ID0gMDsKLQotICAgICAgLyogSWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGVudHJ5IHBvaW50LCBsYWJlbCB0aGUgbGluZSBubyBtYXR0ZXIgd2hhdC4KLSAgICAgICAqIE90aGVyd2lzZSwgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIGZ1bmN0aW9uLCBzbyBjaGVjayB0byBzZWUKLSAgICAgICAqIGlmIHRoZSBmaXJzdCBiYXNpYy1ibG9jayBhZGRyZXNzIGlzIGxhcmdlciB0aGFuIHRoZSBzdGFydGluZwotICAgICAgICogYWRkcmVzcyBvZiB0aGUgbGluZS4gIElmIHNvLCB0aGVuIHRoaXMgbGluZSBiZWdpbnMgd2l0aCBhCi0gICAgICAgKiBhIHBvcnRpb24gb2YgdGhlIHByZXZpb3VzIGJhc2ljLWJsb2NrLCBzbyBwcmludCB0aGF0IHByaW9yCi0gICAgICAgKiBleGVjdXRpb24gY291bnQgKGlmIGJiX2Fubm90YXRlX2FsbF9saW5lcyBpcyBzZXQpLgotICAgICAgICovCi0KLSAgICAgIGlmIChiLT5pc19mdW5jKQotCXsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBiLT5uY2FsbHMpOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgbGFzdF9jb3VudCA9IGItPm5jYWxsczsKLQkgIGxhc3RfcHJpbnQgPSBsYXN0X2NvdW50OwotCSAgbmNhbGxzID0gYi0+bmNhbGxzOwotCSAgbmNhbGxzX3NldCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzCi0JICAgICAgICYmIGItPmJiX2FkZHJbMF0gJiYgYi0+YmJfYWRkclswXSA+IGItPmFkZHIpCi0JewotCSAgc3ByaW50ZiAocCwgIiVsdSIsIGxhc3RfY291bnQpOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgbGFzdF9wcmludCA9IGxhc3RfY291bnQ7Ci0JICBuY2FsbHMgPSBsYXN0X2NvdW50OwotCSAgbmNhbGxzX3NldCA9IDE7Ci0JfQotCi0gICAgICAvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoaXMgbGluZSdzIGJhc2ljLWJsb2Nrcy4gIEZvciBlYWNoIG9uZSwKLSAgICAgICAqIHVwZGF0ZSBsYXN0X2NvdW50LCB0aGVuIGNvbXByZXNzIHNlcXVlbnRpYWwgaWRlbnRpY2FsIGNvdW50cwotICAgICAgICogKGlmIGJiX2Fubm90YXRlX2FsbF9saW5lcykgYW5kIHByaW50IHRoZSBleGVjdXRpb24gY291bnQuCi0gICAgICAgKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IE5CQlMgJiYgYi0+YmJfYWRkcltpXTsgaSsrKQotCXsKLQkgIGxhc3RfY291bnQgPSBiLT5iYl9jYWxsc1tpXTsKLQkgIGlmICghIG5jYWxsc19zZXQpCi0JICAgIHsKLQkgICAgICBuY2FsbHMgPSAwOwotCSAgICAgIG5jYWxsc19zZXQgPSAxOwotCSAgICB9Ci0JICBuY2FsbHMgKz0gbGFzdF9jb3VudDsKLQotCSAgaWYgKGJiX2Fubm90YXRlX2FsbF9saW5lcyAmJiBsYXN0X2NvdW50ID09IGxhc3RfcHJpbnQpCi0JICAgIHsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCi0JICBpZiAocCA+IHRtcGJ1ZikKLQkgICAgKnArKyA9ICcsJzsKLQkgIHNwcmludGYgKHAsICIlbHUiLCBsYXN0X2NvdW50KTsKLQkgIHAgKz0gc3RybGVuIChwKTsKLQotCSAgbGFzdF9wcmludCA9IGxhc3RfY291bnQ7Ci0JfQotCi0gICAgICAvKiBXZSdyZSBkb25lLiAgSWYgbm90aGluZyBoYXMgYmVlbiBwcmludGVkIG9uIHRoaXMgbGluZSwKLSAgICAgICAqIHByaW50IHRoZSBsYXN0IGV4ZWN1dGlvbiBjb3VudCAoYmJfYW5ub3RhdGVfYWxsX2xpbmVzKSwKLSAgICAgICAqIHdoaWNoIGNvdWxkIGJlIGZyb20gZWl0aGVyIGEgcHJldmlvdXMgbGluZSAoaWYgdGhlcmUgd2VyZQotICAgICAgICogbm8gQkJzIG9uIHRoaXMgbGluZSksIG9yIGZyb20gdGhpcyBsaW5lIChpZiBhbGwgb3VyIEJCCi0gICAgICAgKiBjb3VudHMgd2VyZSBjb21wcmVzc2VkIG91dCBiZWNhdXNlIHRoZXkgd2VyZSBpZGVudGljYWwpLgotICAgICAgICovCi0KLSAgICAgIGlmIChiYl9hbm5vdGF0ZV9hbGxfbGluZXMgJiYgcCA9PSB0bXBidWYpCi0JewotCSAgc3ByaW50ZiAocCwgIiVsdSIsIGxhc3RfY291bnQpOwotCSAgcCArPSBzdHJsZW4gKHApOwotCSAgbmNhbGxzID0gbGFzdF9jb3VudDsKLQkgIG5jYWxsc19zZXQgPSAxOwotCX0KLQotICAgICAgaWYgKCEgbmNhbGxzX3NldCkKLQl7Ci0JICBpbnQgYzsKLQotCSAgZm9yIChjID0gMDsgYyA8IHdpZHRoOyBjKyspCi0JICAgIGJ1ZltjXSA9ICcgJzsKLQkgIGJ1Zlt3aWR0aF0gPSAnXDAnOwotCSAgcmV0dXJuOwotCX0KLQotICAgICAgKytudW1fbGluZXNfZXhlY3V0ZWQ7Ci0KLSAgICAgIGlmIChuY2FsbHMgPCBiYl9taW5fY2FsbHMpCi0JewotCSAgc3RyY3B5ICh0bXBidWYsICIjIyMjIyIpOwotCSAgcCA9IHRtcGJ1ZiArIDU7Ci0JfQotCi0gICAgICBzdHJjcHkgKHAsICIgLT4gIik7Ci0gICAgICBwICs9IDQ7Ci0KLSAgICAgIGxlbiA9IHAgLSB0bXBidWY7Ci0gICAgICBpZiAobGVuID49IHdpZHRoKQotCXsKLQkgIHN0cm5jcHkgKGJ1ZiwgdG1wYnVmLCB3aWR0aCk7Ci0JICBidWZbd2lkdGhdID0gJ1wwJzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaW50IGM7Ci0KLQkgIHN0cmNweSAoYnVmICsgd2lkdGggLSBsZW4sIHRtcGJ1Zik7Ci0JICBmb3IgKGMgPSAwOyBjIDwgd2lkdGggLSBsZW47ICsrYykKLQkgICAgYnVmW2NdID0gJyAnOwotCX0KLSAgICB9Ci19Ci0KLS8qCi0gKiBBbm5vdGF0ZSB0aGUgZmlsZXMgbmFtZWQgaW4gU09VUkNFX0ZJTEVTIHdpdGggYmFzaWMtYmxvY2sgc3RhdGlzdGljcwotICogKGV4ZWN1dGlvbiBjb3VudHMpLiAgQWZ0ZXIgZWFjaCBzb3VyY2UgZmlsZXMsIGEgZmV3IHN0YXRpc3RpY3MKLSAqIHJlZ2FyZGluZyB0aGF0IHNvdXJjZSBmaWxlIGFyZSBwcmludGVkLgotICovCi12b2lkCi1ERUZVTl9WT0lEIChwcmludF9hbm5vdGF0ZWRfc291cmNlKQotewotICBTeW0gKnN5bSwgKmxpbmVfc3RhdHMsICpuZXdfbGluZTsKLSAgU291cmNlX0ZpbGUgKnNmOwotICBpbnQgaSwgdGFibGVfbGVuOwotICBGSUxFICpvZnA7Ci0KLSAgLyoKLSAgICogRmluZCBtYXhpbXVtIGxpbmUgbnVtYmVyIGZvciBlYWNoIHNvdXJjZSBmaWxlIHRoYXQgdXNlciBpcwotICAgKiBpbnRlcmVzdGVkIGluOgotICAgKi8KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQWNjZXB0IHN5bWJvbCBpZiBpdCdzIGZpbGUgaXMga25vd24sIGl0cyBsaW5lIG51bWJlciBpcwotICAgICAgICogYmlnZ2VyIHRoYW4gYW55dGhpbmcgd2UgaGF2ZSBzZWVuIGZvciB0aGF0IGZpbGUgc28gZmFyIGFuZAotICAgICAgICogaWYgaXQncyBpbiB0aGUgSU5DTF9BTk5PIHRhYmxlIG9yIHRoZXJlIGlzIG5vIElOQ0xfQU5OTwotICAgICAgICogdGFibGUgYW5kIGl0IGRvZXMgbm90IGFwcGVhciBpbiB0aGUgRVhDTF9BTk5PIHRhYmxlLgotICAgICAgICovCi0gICAgICBpZiAoc3ltLT5maWxlICYmIHN5bS0+bGluZV9udW0gPiBzeW0tPmZpbGUtPm51bV9saW5lcwotCSAgJiYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfQU5OT10sIHN5bS0+YWRkcikKLQkgICAgICB8fCAoc3ltc1tJTkNMX0FOTk9dLmxlbiA9PSAwCi0JCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfQU5OT10sIHN5bS0+YWRkcikpKSkKLQl7Ci0JICBzeW0tPmZpbGUtPm51bV9saW5lcyA9IHN5bS0+bGluZV9udW07Ci0JfQotICAgIH0KLQotICAvKiBhbGxvY2F0ZSBsaW5lIGRlc2NyaXB0b3JzOiAqLwotCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgaWYgKHNmLT5udW1fbGluZXMgPiAwKQotCXsKLQkgIHNmLT5saW5lID0gKHZvaWQgKikgeG1hbGxvYyAoc2YtPm51bV9saW5lcyAqIHNpemVvZiAoc2YtPmxpbmVbMF0pKTsKLQkgIG1lbXNldCAoc2YtPmxpbmUsIDAsIHNmLT5udW1fbGluZXMgKiBzaXplb2YgKHNmLT5saW5lWzBdKSk7Ci0JfQotICAgIH0KLQotICAvKiBjb3VudCBleGVjdXRpb25zIHBlciBsaW5lOiAqLwotCi0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgaWYgKHN5bS0+ZmlsZSAmJiBzeW0tPmZpbGUtPm51bV9saW5lcwotCSAgJiYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfQU5OT10sIHN5bS0+YWRkcikKLQkgICAgICB8fCAoc3ltc1tJTkNMX0FOTk9dLmxlbiA9PSAwCi0JCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfQU5OT10sIHN5bS0+YWRkcikpKSkKLQl7Ci0JICBzeW0tPmZpbGUtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKLQkgIGxpbmVfc3RhdHMgPSBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdOwotCSAgaWYgKCFsaW5lX3N0YXRzKQotCSAgICB7Ci0JICAgICAgLyogY29tbW9uIGNhc2UgaGFzIGF0IG1vc3Qgb25lIGJhc2ljLWJsb2NrIHBlciBzb3VyY2UgbGluZTogKi8KLQkgICAgICBzeW0tPmZpbGUtPmxpbmVbc3ltLT5saW5lX251bSAtIDFdID0gc3ltOwotCSAgICB9Ci0JICBlbHNlIGlmICghbGluZV9zdGF0cy0+YWRkcikKLQkgICAgewotCSAgICAgIC8qIHN5bSBpcyB0aGUgM3JkIC4uIG50aCBiYXNpYyBibG9jayBmb3IgdGhpcyBsaW5lOiAqLwotCSAgICAgIGxpbmVfc3RhdHMtPm5jYWxscyArPSBzeW0tPm5jYWxsczsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogc3ltIGlzIHRoZSBzZWNvbmQgYmFzaWMgYmxvY2sgZm9yIHRoaXMgbGluZSAqLwotCSAgICAgIG5ld19saW5lID0gKFN5bSAqKSB4bWFsbG9jIChzaXplb2YgKCpuZXdfbGluZSkpOwotCSAgICAgICpuZXdfbGluZSA9ICpsaW5lX3N0YXRzOwotCSAgICAgIG5ld19saW5lLT5hZGRyID0gMDsKLQkgICAgICBuZXdfbGluZS0+bmNhbGxzICs9IHN5bS0+bmNhbGxzOwotCSAgICAgIHN5bS0+ZmlsZS0+bGluZVtzeW0tPmxpbmVfbnVtIC0gMV0gPSBuZXdfbGluZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogcGxvZCBvdmVyIHNvdXJjZSBmaWxlcywgYW5ub3RhdGluZyB0aGVtOiAqLwotCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgaWYgKCFzZi0+bnVtX2xpbmVzIHx8IChpZ25vcmVfemVyb3MgJiYgc2YtPm5jYWxscyA9PSAwKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzID0gbnVtX2xpbmVzX2V4ZWN1dGVkID0gMDsKLSAgICAgIG9mcCA9IGFubm90YXRlX3NvdXJjZSAoc2YsIDE2LCBhbm5vdGF0ZV93aXRoX2NvdW50LCBzZik7Ci0gICAgICBpZiAoIW9mcCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChiYl90YWJsZV9sZW5ndGggPiAwKQotCXsKLQkgIGZwcmludGYgKG9mcCwgXygiXG5cblRvcCAlZCBMaW5lczpcblxuICAgICBMaW5lICAgICAgQ291bnRcblxuIiksCi0JCSAgIGJiX3RhYmxlX2xlbmd0aCk7Ci0KLQkgIC8qIGFidXNlIGxpbmUgYXJyYXlzLS0taXQncyBub3QgbmVlZGVkIGFueW1vcmU6ICovCi0JICBxc29ydCAoc2YtPmxpbmUsIHNmLT5udW1fbGluZXMsIHNpemVvZiAoc2YtPmxpbmVbMF0pLCBjbXBfbmNhbGxzKTsKLQkgIHRhYmxlX2xlbiA9IGJiX3RhYmxlX2xlbmd0aDsKLQkgIGlmICh0YWJsZV9sZW4gPiBzZi0+bnVtX2xpbmVzKQotCSAgICB7Ci0JICAgICAgdGFibGVfbGVuID0gc2YtPm51bV9saW5lczsKLQkgICAgfQotCSAgZm9yIChpID0gMDsgaSA8IHRhYmxlX2xlbjsgKytpKQotCSAgICB7Ci0JICAgICAgc3ltID0gc2YtPmxpbmVbaV07Ci0JICAgICAgaWYgKCFzeW0gfHwgc3ltLT5uY2FsbHMgPT0gMCkKLQkJewotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZnByaW50ZiAob2ZwLCAiJTlkICUxMGx1XG4iLCBzeW0tPmxpbmVfbnVtLCBzeW0tPm5jYWxscyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGZyZWUgKHNmLT5saW5lKTsKLSAgICAgIHNmLT5saW5lID0gMDsKLQotICAgICAgZnByaW50ZiAob2ZwLCBfKCJcbkV4ZWN1dGlvbiBTdW1tYXJ5OlxuXG4iKSk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5bGQgICBFeGVjdXRhYmxlIGxpbmVzIGluIHRoaXMgZmlsZVxuIiksCi0JICAgICAgIG51bV9leGVjdXRhYmxlX2xpbmVzKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiJTlsZCAgIExpbmVzIGV4ZWN1dGVkXG4iKSwgbnVtX2xpbmVzX2V4ZWN1dGVkKTsKLSAgICAgIGZwcmludGYgKG9mcCwgXygiJTkuMmYgICBQZXJjZW50IG9mIHRoZSBmaWxlIGV4ZWN1dGVkXG4iKSwKLQkgICAgICAgbnVtX2V4ZWN1dGFibGVfbGluZXMKLQkgICAgICAgPyAxMDAuMCAqIG51bV9saW5lc19leGVjdXRlZCAvIChkb3VibGUpIG51bV9leGVjdXRhYmxlX2xpbmVzCi0JICAgICAgIDogMTAwLjApOwotICAgICAgZnByaW50ZiAob2ZwLCBfKCJcbiU5bHUgICBUb3RhbCBudW1iZXIgb2YgbGluZSBleGVjdXRpb25zXG4iKSwKLQkgICAgICAgc2YtPm5jYWxscyk7Ci0gICAgICBmcHJpbnRmIChvZnAsIF8oIiU5LjJmICAgQXZlcmFnZSBleGVjdXRpb25zIHBlciBsaW5lXG4iKSwKLQkgICAgICAgbnVtX2V4ZWN1dGFibGVfbGluZXMKLQkgICAgICAgPyAoZG91YmxlKSBzZi0+bmNhbGxzIC8gKGRvdWJsZSkgbnVtX2V4ZWN1dGFibGVfbGluZXMKLQkgICAgICAgOiAwLjApOwotICAgICAgaWYgKG9mcCAhPSBzdGRvdXQpCi0JewotCSAgZmNsb3NlIChvZnApOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9iYXNpY19ibG9ja3MuaCBiL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlY2ExLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2Jhc2ljX2Jsb2Nrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotI2lmbmRlZiBiYXNpY19ibG9ja3NfaAotI2RlZmluZSBiYXNpY19ibG9ja3NfaAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0vKgotICogT3B0aW9uczoKLSAqLwotZXh0ZXJuIGJvb2wgYmJfYW5ub3RhdGVfYWxsX2xpbmVzOwkvKiBmb3JjZSBhbm5vdGF0aW9uIG9mIGFsbCBsaW5lcz8gKi8KLWV4dGVybiBpbnQgYmJfdGFibGVfbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIG1vc3QtdXNlZCBiYiB0YWJsZSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYmJfbWluX2NhbGxzOwkvKiBtaW5pbXVtIGV4ZWN1dGlvbiBjb3VudCAqLwotCi1leHRlcm4gdm9pZCBiYl9yZWFkX3JlYyBQQVJBTVMgKChGSUxFICogaWZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgYmJfd3JpdGVfYmxvY2tzIFBBUkFNUyAoKEZJTEUgKiBvZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBiYl9jcmVhdGVfc3ltcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLWV4dGVybiB2b2lkIHByaW50X2Fubm90YXRlZF9zb3VyY2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgcHJpbnRfZXhlY19jb3VudHMgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogYmFzaWNfYmxvY2tzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2JiX2V4aXRfZnVuYy5jIGIvZ3Byb2YvYmJfZXhpdF9mdW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzMyMTUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYmJfZXhpdF9mdW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTk0IERhdmlkIE1vc2Jlcmdlci1UYW5nLgotICoKLSAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogX19iYl9leGl0X2Z1bmMoKSBkdW1wcyBhbGwgdGhlIGJhc2ljLWJsb2NrIHN0YXRpc3RpY3MgbGlua2VkIGludG8KLSAqIHRoZSBiYl9oZWFkIGNoYWluIHRvIC5kIGZpbGVzLgotICovCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ21vbl9vdXQuaCIKLQotLyogc3RydWN0dXJlIGVtaXR0ZWQgYnkgLWEgKi8KLXN0cnVjdCBiYiB7Ci0gICAgbG9uZwkJemVyb193b3JkOwotICAgIGNvbnN0IGNoYXIJCSpmaWxlbmFtZTsKLSAgICBsb25nCQkqY291bnRzOwotICAgIGxvbmcJCW5jb3VudHM7Ci0gICAgc3RydWN0IGJiCQkqbmV4dDsKLSAgICBjb25zdCB1bnNpZ25lZCBsb25nCSphZGRyZXNzZXM7Ci19OwotCi1zdHJ1Y3QgYmIgKl9fYmJfaGVhZCA9IChzdHJ1Y3QgYmIgKikwOwotCi0KLXZvaWQKLV9fYmJfZXhpdF9mdW5jICh2b2lkKQotewotICAgIGNvbnN0IGludCB2ZXJzaW9uID0gR01PTl9WRVJTSU9OOwotICAgIHN0cnVjdCBnbW9uX2hkciBnaGRyOwotICAgIHN0cnVjdCBiYiAqcHRyOwotICAgIEZJTEUgKmZwOwotICAgIC8qCi0gICAgICogR0VOX0dNT05fQ05UX0ZJTEUgc2hvdWxkIGJlIGRlZmluZWQgb24gc3lzdGVtcyB3aXRoIG1jbGVhbnVwKCkKLSAgICAgKiBmdW5jdGlvbnMgdGhhdCBkbyBub3Qgd3JpdGUgYmFzaWMtYmxvY2sgdG8gZ21vbi5vdXQuICBJbiBzdWNoCi0gICAgICogY2FzZXMgcHJvZmlsaW5nIHdpdGggIi1wZyAtYSIgd291bGQgcmVzdWx0IGluIGEgZ21vbi5vdXQgZmlsZQotICAgICAqIHdpdGhvdXQgYmFzaWMtYmxvY2sgaW5mbyAoYmVjYXVzZSB0aGUgZmlsZSB3cml0dGVuIGhlcmUgd291bGQKLSAgICAgKiBiZSBvdmVyd3JpdHRlbi4gIFRodXMsIGEgc2VwYXJhdGUgZmlsZSBpcyBnZW5lcmF0ZWQgaW5zdGVhZC4KLSAgICAgKiBUaGUgdHdvIGZpbGVzIGNhbiBlYXNpbHkgYmUgY29tYmluZWQgYnkgc3BlY2lmeWluZyB0aGVtCi0gICAgICogb24gZ3Byb2YncyBjb21tYW5kIGxpbmUgKGFuZCBwb3NzaWJseSBnZW5lcmF0aW5nIGEgZ21vbi5zdW0KLSAgICAgKiBmaWxlIHdpdGggImdwcm9mIC1zIikuCi0gICAgICovCi0jaWZuZGVmIEdFTl9HTU9OX0NOVF9GSUxFCi0jICAgZGVmaW5lIE9VVF9OQU1FCSJnbW9uLm91dCIKLSNlbHNlCi0jICAgZGVmaW5lIE9VVF9OQU1FCSJnbW9uLmNudCIKLSNlbmRpZgotICAgIGZwID0gZm9wZW4oT1VUX05BTUUsICJ3YiIpOwotICAgIGlmICghZnApIHsKLQlwZXJyb3IoT1VUX05BTUUpOwotCXJldHVybjsKLSAgICB9IC8qIGlmICovCi0gICAgbWVtY3B5KCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCk7Ci0gICAgbWVtY3B5KCZnaGRyLnZlcnNpb24sICZ2ZXJzaW9uLCBzaXplb2YodmVyc2lvbikpOwotICAgIGZ3cml0ZSgmZ2hkciwgc2l6ZW9mKGdoZHIpLCAxLCBmcCk7Ci0KLSAgICBmb3IgKHB0ciA9IF9fYmJfaGVhZDsgcHRyICE9IDA7IHB0ciA9IHB0ci0+bmV4dCkgewotCXVfaW50IG5jb3VudHMgPSBwdHItPm5jb3VudHM7Ci0JdV9jaGFyIHRhZzsKLQl1X2ludCBpOwotCi0JdGFnID0gR01PTl9UQUdfQkJfQ09VTlQ7Ci0JZndyaXRlKCZ0YWcsIHNpemVvZih0YWcpLCAxLCBmcCk7Ci0JZndyaXRlKCZuY291bnRzLCBzaXplb2YobmNvdW50cyksIDEsIGZwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBuY291bnRzOyArK2kpIHsKLQkgICAgZndyaXRlKCZwdHItPmFkZHJlc3Nlc1tpXSwgc2l6ZW9mKHB0ci0+YWRkcmVzc2VzWzBdKSwgMSwgZnApOwotCSAgICBmd3JpdGUoJnB0ci0+Y291bnRzW2ldLCBzaXplb2YocHRyLT5jb3VudHNbMF0pLCAxLCBmcCk7Ci0JfSAvKiBmb3IgKi8KLSAgICB9IC8qIGZvciAqLwotICAgIGZjbG9zZSAoZnApOwotfSAvKiBfX2JiX2V4aXRfZnVuYyAqLwotCi0JCQkvKioqIGVuZCBvZiBfX2JiX2V4aXRfZnVuYy5jICoqKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2JiY29udi5wbCBiL2dwcm9mL2JiY29udi5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzMxMmY1MS4uMDAwMDAwMAotLS0gYS9ncHJvZi9iYmNvbnYucGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0jISAvdXNyL2Jpbi9wZXJsCi0KLSMgVGhpcyBzY3JpcHQgY29udmVydHMgYSAiYmIub3V0IiBmaWxlIGludG8gYSBmb3JtYXQKLSMgc3VpdGFibGUgZm9yIHByb2Nlc3NpbmcgYnkgZ3Byb2YKLQotIyBXcml0ZSBhIG5ldy1zdHlsZSBnbW9uIGhlYWRlcgotCi1wcmludCBwYWNrKCJBNEl4MTIiLCAiZ21vbiIsIDEpOwotCi0KLSMgVGhlIGlucHV0IGZpbGUgZm9ybWF0IGNvbnRhaW5zIGhlYWRlciBsaW5lcyBhbmQgZGF0YSBsaW5lcy4KLSMgSGVhZGVyIGxpbmVzIGNvbnRhaW4gYSBjb3VudCBvZiBob3cgbWFueSBkYXRhIGxpbmVzIGZvbGxvdyBiZWZvcmUKLSMgdGhlIG5leHQgaGVhZGVyIGxpbmUuICAkYmxvY2tjb3VudCBpcyBzZXQgdG8gdGhlIGNvdW50IHRoYXQKLSMgYXBwZWFycyBpbiBlYWNoIGhlYWRlciBsaW5lLCB0aGVuIGRlY3JlbWVudGVkIGF0IGVhY2ggZGF0YSBsaW5lLgotIyAkYmxvY2tjb3VudCBzaG91bGQgYWx3YXlzIGJlIHplcm8gYXQgdGhlIHN0YXJ0IG9mIGEgaGVhZGVyIGxpbmUsCi0jIGFuZCBzaG91bGQgbmV2ZXIgYmUgemVybyBhdCB0aGUgc3RhcnQgb2YgYSBkYXRhIGxpbmUuCi0KLSRibG9ja2NvdW50PTA7Ci0KLXdoaWxlICg8PikgewotICAgIGlmICgvXkZpbGUgLiosIChbMC05XSspIGJhc2ljIGJsb2Nrcy8pIHsKLQlwcmludCBTVERFUlIgIk1pc2NvdW50OiBsaW5lICQuXG4iIGlmICgkYmxvY2tjb3VudCAhPSAwKTsKLQkkYmxvY2tjb3VudCA9ICQxOwotCi0JcHJpbnQgcGFjaygiY0kiLCAyLCAkYmxvY2tjb3VudCk7Ci0gICAgfQotICAgIGlmICgvQmxvY2suKmV4ZWN1dGVkKFsgMC05XSspIHRpbWUuKiBhZGRyZXNzPSAweChbMC05YS1mQS1GXSopLykgewotCXByaW50IFNUREVSUiAiTWlzY291bnQ6IGxpbmUgJC5cbiIgaWYgKCRibG9ja2NvdW50ID09IDApOwotCSRibG9ja2NvdW50LS0gaWYgKCRibG9ja2NvdW50ID4gMCk7Ci0KLQkkY291bnQgPSAkMTsKLQkkYWRkciA9IGhleCAkMjsKLQotCXByaW50IHBhY2soIklJIiwkYWRkciwkY291bnQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2JzZF9jYWxsZ19ibC5tIGIvZ3Byb2YvYnNkX2NhbGxnX2JsLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2M5NmMuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvYnNkX2NhbGxnX2JsLm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotCi0KLQotY2FsbCBncmFwaCBwcm9maWxlOgotICAgICAgICAgIFRoZSBzdW0gb2Ygc2VsZiBhbmQgZGVzY2VuZGVudHMgaXMgdGhlIG1ham9yIHNvcnQKLSAgICAgICAgICBmb3IgdGhpcyBsaXN0aW5nLgotCi0gICAgICAgICAgZnVuY3Rpb24gZW50cmllczoKLQotaW5kZXggICAgIHRoZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gaW4gdGhlIGNhbGwgZ3JhcGgKLSAgICAgICAgICBsaXN0aW5nLCBhcyBhbiBhaWQgdG8gbG9jYXRpbmcgaXQgKHNlZSBiZWxvdykuCi0KLSV0aW1lICAgICB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgdGltZSBvZiB0aGUgcHJvZ3JhbQotICAgICAgICAgIGFjY291bnRlZCBmb3IgYnkgdGhpcyBmdW5jdGlvbiBhbmQgaXRzCi0gICAgICAgICAgZGVzY2VuZGVudHMuCi0KLXNlbGYgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc3BlbnQgaW4gdGhpcyBmdW5jdGlvbgotICAgICAgICAgIGl0c2VsZi4KLQotZGVzY2VuZGVudHMKLSAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc3BlbnQgaW4gdGhlIGRlc2NlbmRlbnRzIG9mCi0gICAgICAgICAgdGhpcyBmdW5jdGlvbiBvbiBiZWhhbGYgb2YgdGhpcyBmdW5jdGlvbi4KLQotY2FsbGVkICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgKG90aGVyCi0gICAgICAgICAgdGhhbiByZWN1cnNpdmUgY2FsbHMpLgotCi1zZWxmICAgICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIGNhbGxzIGl0c2VsZgotICAgICAgICAgIHJlY3Vyc2l2ZWx5LgotCi1uYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLCB3aXRoIGFuIGluZGljYXRpb24gb2YKLSAgICAgICAgICBpdHMgbWVtYmVyc2hpcCBpbiBhIGN5Y2xlLCBpZiBhbnkuCi0KLWluZGV4ICAgICB0aGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSBjYWxsIGdyYXBoCi0gICAgICAgICAgbGlzdGluZywgYXMgYW4gYWlkIHRvIGxvY2F0aW5nIGl0LgotCi0KLQotICAgICAgICAgIHBhcmVudCBsaXN0aW5nczoKLQotc2VsZiogICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGZ1bmN0aW9uJ3Mgc2VsZiB0aW1lCi0gICAgICAgICAgd2hpY2ggaXMgZHVlIHRvIGNhbGxzIGZyb20gdGhpcyBwYXJlbnQuCi0KLWRlc2NlbmRlbnRzKgotICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBvZiB0aGlzIGZ1bmN0aW9uJ3MKLSAgICAgICAgICBkZXNjZW5kZW50IHRpbWUgd2hpY2ggaXMgZHVlIHRvIGNhbGxzIGZyb20gdGhpcwotICAgICAgICAgIHBhcmVudC4KLQotY2FsbGVkKiogIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkKLSAgICAgICAgICB0aGlzIHBhcmVudC4gIFRoaXMgaXMgdGhlIG51bWVyYXRvciBvZiB0aGUKLSAgICAgICAgICBmcmFjdGlvbiB3aGljaCBkaXZpZGVzIHVwIHRoZSBmdW5jdGlvbidzIHRpbWUgdG8KLSAgICAgICAgICBpdHMgcGFyZW50cy4KLQotdG90YWwqICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIGJ5Ci0gICAgICAgICAgYWxsIG9mIGl0cyBwYXJlbnRzLiAgVGhpcyBpcyB0aGUgZGVub21pbmF0b3Igb2YKLSAgICAgICAgICB0aGUgcHJvcGFnYXRpb24gZnJhY3Rpb24uCi0KLXBhcmVudHMgICB0aGUgbmFtZSBvZiB0aGlzIHBhcmVudCwgd2l0aCBhbiBpbmRpY2F0aW9uIG9mIHRoZQotICAgICAgICAgIHBhcmVudCdzIG1lbWJlcnNoaXAgaW4gYSBjeWNsZSwgaWYgYW55LgotCi1pbmRleCAgICAgdGhlIGluZGV4IG9mIHRoaXMgcGFyZW50IGluIHRoZSBjYWxsIGdyYXBoCi0gICAgICAgICAgbGlzdGluZywgYXMgYW4gYWlkIGluIGxvY2F0aW5nIGl0LgotCi0KLQotICAgICAgICAgIGNoaWxkcmVuIGxpc3RpbmdzOgotCi1zZWxmKiAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoaXMgY2hpbGQncyBzZWxmIHRpbWUKLSAgICAgICAgICB3aGljaCBpcyBkdWUgdG8gYmVpbmcgY2FsbGVkIGJ5IHRoaXMgZnVuY3Rpb24uCi0KLWRlc2NlbmRlbnQqCi0gICAgICAgICAgdGhlIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoaXMgY2hpbGQncyBkZXNjZW5kZW50J3MKLSAgICAgICAgICB0aW1lIHdoaWNoIGlzIGR1ZSB0byBiZWluZyBjYWxsZWQgYnkgdGhpcwotICAgICAgICAgIGZ1bmN0aW9uLgotCi1jYWxsZWQqKiAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGNoaWxkIGlzIGNhbGxlZCBieSB0aGlzCi0gICAgICAgICAgZnVuY3Rpb24uICBUaGlzIGlzIHRoZSBudW1lcmF0b3Igb2YgdGhlCi0gICAgICAgICAgcHJvcGFnYXRpb24gZnJhY3Rpb24gZm9yIHRoaXMgY2hpbGQuCi0KLXRvdGFsKiAgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgY2hpbGQgaXMgY2FsbGVkIGJ5IGFsbAotICAgICAgICAgIGZ1bmN0aW9ucy4gIFRoaXMgaXMgdGhlIGRlbm9taW5hdG9yIG9mIHRoZQotICAgICAgICAgIHByb3BhZ2F0aW9uIGZyYWN0aW9uLgotCi1jaGlsZHJlbiAgdGhlIG5hbWUgb2YgdGhpcyBjaGlsZCwgYW5kIGFuIGluZGljYXRpb24gb2YgaXRzCi0gICAgICAgICAgbWVtYmVyc2hpcCBpbiBhIGN5Y2xlLCBpZiBhbnkuCi0KLWluZGV4ICAgICB0aGUgaW5kZXggb2YgdGhpcyBjaGlsZCBpbiB0aGUgY2FsbCBncmFwaCBsaXN0aW5nLAotICAgICAgICAgIGFzIGFuIGFpZCB0byBsb2NhdGluZyBpdC4KLQotCi0KLSAgICAgICAgICAqIHRoZXNlIGZpZWxkcyBhcmUgb21pdHRlZCBmb3IgcGFyZW50cyAob3IKLSAgICAgICAgICBjaGlsZHJlbikgaW4gdGhlIHNhbWUgY3ljbGUgYXMgdGhlIGZ1bmN0aW9uLiAgSWYKLSAgICAgICAgICB0aGUgZnVuY3Rpb24gKG9yIGNoaWxkKSBpcyBhIG1lbWJlciBvZiBhIGN5Y2xlLAotICAgICAgICAgIHRoZSBwcm9wYWdhdGVkIHRpbWVzIGFuZCBwcm9wYWdhdGlvbiBkZW5vbWluYXRvcgotICAgICAgICAgIHJlcHJlc2VudCB0aGUgc2VsZiB0aW1lIGFuZCBkZXNjZW5kZW50IHRpbWUgb2YgdGhlCi0gICAgICAgICAgY3ljbGUgYXMgYSB3aG9sZS4KLQotICAgICAgICAgICoqIHN0YXRpYy1vbmx5IHBhcmVudHMgYW5kIGNoaWxkcmVuIGFyZSBpbmRpY2F0ZWQKLSAgICAgICAgICBieSBhIGNhbGwgY291bnQgb2YgMC4KLQotCi0KLSAgICAgICAgICBjeWNsZSBsaXN0aW5nczoKLSAgICAgICAgICB0aGUgY3ljbGUgYXMgYSB3aG9sZSBpcyBsaXN0ZWQgd2l0aCB0aGUgc2FtZQotICAgICAgICAgIGZpZWxkcyBhcyBhIGZ1bmN0aW9uIGVudHJ5LiAgQmVsb3cgaXQgYXJlIGxpc3RlZAotICAgICAgICAgIHRoZSBtZW1iZXJzIG9mIHRoZSBjeWNsZSwgYW5kIHRoZWlyIGNvbnRyaWJ1dGlvbnMKLSAgICAgICAgICB0byB0aGUgdGltZSBhbmQgY2FsbCBjb3VudHMgb2YgdGhlIGN5Y2xlLgotDApkaWZmIC0tZ2l0IGEvZ3Byb2YvY2FsbF9ncmFwaC5jIGIvZ3Byb2YvY2FsbF9ncmFwaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjEyY2JkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NhbGxfZ3JhcGguYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNhbGxfZ3JhcGguaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotZXh0ZXJuIHZvaWQKLURFRlVOIChjZ190YWxseSwgKGZyb21fcGMsIHNlbGZfcGMsIGNvdW50KSwKLSAgICAgICBiZmRfdm1hIGZyb21fcGMgQU5EIGJmZF92bWEgc2VsZl9wYyBBTkQgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLSAgU3ltICpwYXJlbnQ7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgcGFyZW50ID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgZnJvbV9wYyk7Ci0gIGNoaWxkID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgc2VsZl9wYyk7Ci0KLSAgaWYgKGNoaWxkID09IE5VTEwgfHwgcGFyZW50ID09IE5VTEwpCi0gICAgcmV0dXJuOwotCi0gIC8qIElmIHdlJ3JlIGRvaW5nIGxpbmUtYnktbGluZSBwcm9maWxpbmcsIGJvdGggdGhlIHBhcmVudCBhbmQgdGhlCi0gICAgIGNoaWxkIHdpbGwgcHJvYmFibHkgcG9pbnQgdG8gbGluZSBzeW1ib2xzIGluc3RlYWQgb2YgZnVuY3Rpb24KLSAgICAgc3ltYm9scy4gIEZvciB0aGUgcGFyZW50IHRoaXMgaXMgZmluZSwgc2luY2UgdGhpcyBpZGVudGlmaWVzIHRoZQotICAgICBsaW5lIG51bWJlciBpbiB0aGUgY2FsbGluZyByb3V0aW5nLCBidXQgdGhlIGNoaWxkIHNob3VsZCBhbHdheXMKLSAgICAgcG9pbnQgdG8gYSBmdW5jdGlvbiBlbnRyeSBwb2ludCwgc28gd2UgYmFjayB1cCBpbiB0aGUgc3ltYm9sCi0gICAgIHRhYmxlIHVudGlsIHdlIGZpbmQgaXQuCi0gICAKLSAgICAgRm9yIG5vcm1hbCBwcm9maWxpbmcsIGlzX2Z1bmMgd2lsbCBiZSBzZXQgb24gYWxsIHN5bWJvbHMsIHNvIHRoaXMKLSAgICAgY29kZSB3aWxsIGRvIG5vdGhpbmcuICAqLwotCi0gIHdoaWxlIChjaGlsZCA+PSBzeW10YWIuYmFzZSAmJiAhIGNoaWxkLT5pc19mdW5jKQotICAgIC0tY2hpbGQ7Ci0KLSAgaWYgKGNoaWxkIDwgc3ltdGFiLmJhc2UpCi0gICAgcmV0dXJuOwotCi0gIC8qCi0gICAqIEtlZXAgYXJjIGlmIGl0IGlzIG9uIElOQ0xfQVJDUyB0YWJsZSBvciBpZiB0aGUgSU5DTF9BUkNTIHRhYmxlCi0gICAqIGlzIGVtcHR5IGFuZCBpdCBpcyBub3QgaW4gdGhlIEVYQ0xfQVJDUyB0YWJsZS4KLSAgICovCi0gIGlmIChzeW1faWRfYXJjX2lzX3ByZXNlbnQgKCZzeW1zW0lOQ0xfQVJDU10sIHBhcmVudCwgY2hpbGQpCi0gICAgICB8fCAoc3ltc1tJTkNMX0FSQ1NdLmxlbiA9PSAwCi0JICAmJiAhc3ltX2lkX2FyY19pc19wcmVzZW50ICgmc3ltc1tFWENMX0FSQ1NdLCBwYXJlbnQsIGNoaWxkKSkpCi0gICAgewotICAgICAgY2hpbGQtPm5jYWxscyArPSBjb3VudDsKLSAgICAgIERCRyAoVEFMTFlERUJVRywKLQkgICBwcmludGYgKF8oIltjZ190YWxseV0gYXJjIGZyb20gJXMgdG8gJXMgdHJhdmVyc2VkICVsdSB0aW1lc1xuIiksCi0JCSAgIHBhcmVudC0+bmFtZSwgY2hpbGQtPm5hbWUsIGNvdW50KSk7Ci0gICAgICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCBjb3VudCk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBSZWFkIGEgcmVjb3JkIGZyb20gZmlsZSBJRlAgZGVzY3JpYmluZyBhbiBhcmMgaW4gdGhlIGZ1bmN0aW9uCi0gKiBjYWxsLWdyYXBoIGFuZCB0aGUgY291bnQgb2YgaG93IG1hbnkgdGltZXMgdGhlIGFyYyBoYXMgYmVlbgotICogdHJhdmVyc2VkLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUgb2YgZmlsZSBJRlAgYW5kIGlzIHByb3ZpZGVkCi0gKiBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcyBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoY2dfcmVhZF9yZWMsIChpZnAsIGZpbGVuYW1lKSwgRklMRSAqIGlmcCBBTkQgQ09OU1QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGJmZF92bWEgZnJvbV9wYywgc2VsZl9wYzsKLSAgc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZCBhcmM7Ci0gIHVuc2lnbmVkIGxvbmcgY291bnQ7Ci0KLSAgaWYgKGZyZWFkICgmYXJjLCBzaXplb2YgKGFyYyksIDEsIGlmcCkgIT0gMSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotICBmcm9tX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBhcmMuZnJvbV9wYyk7Ci0gIHNlbGZfcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGFyYy5zZWxmX3BjKTsKLSAgY291bnQgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGFyYy5jb3VudCk7Ci0gIERCRyAoU0FNUExFREVCVUcsCi0gICAgICAgcHJpbnRmICgiW2NnX3JlYWRfcmVjXSBmcm9tcGMgMHglbHggc2VsZnBjIDB4JWx4IGNvdW50ICVsdVxuIiwKLQkgICAgICAgZnJvbV9wYywgc2VsZl9wYywgY291bnQpKTsKLSAgLyogYWRkIHRoaXMgYXJjOiAqLwotICBjZ190YWxseSAoZnJvbV9wYywgc2VsZl9wYywgY291bnQpOwotfQotCi0KLS8qCi0gKiBXcml0ZSBhbGwgdGhlIGFyY3MgaW4gdGhlIGNhbGwtZ3JhcGggdG8gZmlsZSBPRlAuICBGSUxFTkFNRSBpcwotICogdGhlIG5hbWUgb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcwotICogb25seS4KLSAqLwotdm9pZAotREVGVU4gKGNnX3dyaXRlX2FyY3MsIChvZnAsIGZpbGVuYW1lKSwgRklMRSAqIG9mcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFnID0gR01PTl9UQUdfQ0dfQVJDOwotICBzdHJ1Y3QgZ21vbl9jZ19hcmNfcmVjb3JkIHJhd19hcmM7Ci0gIEFyYyAqYXJjOwotICBTeW0gKnN5bTsKLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7IHN5bSsrKQotICAgIHsKLSAgICAgIGZvciAoYXJjID0gc3ltLT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0JewotCSAgcHV0X3ZtYSAoY29yZV9iZmQsIGFyYy0+cGFyZW50LT5hZGRyLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5mcm9tX3BjKTsKLQkgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPmNoaWxkLT5hZGRyLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5zZWxmX3BjKTsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBhcmMtPmNvdW50LCAoYmZkX2J5dGUgKikgcmF3X2FyYy5jb3VudCk7Ci0JICBpZiAoZndyaXRlICgmdGFnLCBzaXplb2YgKHRhZyksIDEsIG9mcCkgIT0gMQotCSAgICAgIHx8IGZ3cml0ZSAoJnJhd19hcmMsIHNpemVvZiAocmF3X2FyYyksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBEQkcgKFNBTVBMRURFQlVHLAotCSAgICAgcHJpbnRmICgiW2NnX3dyaXRlX2FyY3NdIGZyb21wYyAweCVseCBzZWxmcGMgMHglbHggY291bnQgJWx1XG4iLAotCQkgICAgIGFyYy0+cGFyZW50LT5hZGRyLCBhcmMtPmNoaWxkLT5hZGRyLCBhcmMtPmNvdW50KSk7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2NhbGxfZ3JhcGguaCBiL2dwcm9mL2NhbGxfZ3JhcGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MTM5Yi4uMDAwMDAwMAotLS0gYS9ncHJvZi9jYWxsX2dyYXBoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jaWZuZGVmIGNhbGxfZ3JhcGhfaAotI2RlZmluZSBjYWxsX2dyYXBoX2gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotZXh0ZXJuIHZvaWQgY2dfdGFsbHkgUEFSQU1TICgoYmZkX3ZtYSBmcm9tX3BjLCBiZmRfdm1hIHNlbGZfcGMsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KSk7Ci1leHRlcm4gdm9pZCBjZ19yZWFkX3JlYyBQQVJBTVMgKChGSUxFICogaWZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgY2dfd3JpdGVfYXJjcyBQQVJBTVMgKChGSUxFICogb2ZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0jZW5kaWYgLyogY2FsbF9ncmFwaF9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19hcmNzLmMgYi9ncHJvZi9jZ19hcmNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDIzMTcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfYXJjcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNnX2Rmbi5oIgotI2luY2x1ZGUgImNnX3ByaW50LmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0KLVN5bSAqY3ljbGVfaGVhZGVyOwotdW5zaWduZWQgaW50IG51bV9jeWNsZXM7Ci1BcmMgKiphcmNzOwotdW5zaWduZWQgaW50IG51bWFyY3M7Ci0KLS8qCi0gKiBSZXR1cm4gVFJVRSBpZmYgUEFSRU5UIGhhcyBhbiBhcmMgdG8gY292ZXJzIHRoZSBhZGRyZXNzCi0gKiByYW5nZSBjb3ZlcmVkIGJ5IENISUxELgotICovCi1BcmMgKgotREVGVU4gKGFyY19sb29rdXAsIChwYXJlbnQsIGNoaWxkKSwgU3ltICogcGFyZW50IEFORCBTeW0gKiBjaGlsZCkKLXsKLSAgQXJjICphcmM7Ci0KLSAgaWYgKCFwYXJlbnQgfHwgIWNoaWxkKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlthcmNfbG9va3VwXSBwYXJlbnQgPT0gMCB8fCBjaGlsZCA9PSAwXG4iKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgREJHIChMT09LVVBERUJVRywgcHJpbnRmICgiW2FyY19sb29rdXBdIHBhcmVudCAlcyBjaGlsZCAlc1xuIiwKLQkJCSAgICBwYXJlbnQtPm5hbWUsIGNoaWxkLT5uYW1lKSk7Ci0gIGZvciAoYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsgYXJjOyBhcmMgPSBhcmMtPm5leHRfY2hpbGQpCi0gICAgewotICAgICAgREJHIChMT09LVVBERUJVRywgcHJpbnRmICgiW2FyY19sb29rdXBdXHQgcGFyZW50ICVzIGNoaWxkICVzXG4iLAotCQkJCWFyYy0+cGFyZW50LT5uYW1lLCBhcmMtPmNoaWxkLT5uYW1lKSk7Ci0gICAgICBpZiAoY2hpbGQtPmFkZHIgPj0gYXJjLT5jaGlsZC0+YWRkcgotCSAgJiYgY2hpbGQtPmVuZF9hZGRyIDw9IGFyYy0+Y2hpbGQtPmVuZF9hZGRyKQotCXsKLQkgIHJldHVybiBhcmM7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIEFkZCAob3IganVzdCBpbmNyZW1lbnQpIGFuIGFyYzoKLSAqLwotdm9pZAotREVGVU4gKGFyY19hZGQsIChwYXJlbnQsIGNoaWxkLCBjb3VudCksCi0gICAgICAgU3ltICogcGFyZW50IEFORCBTeW0gKiBjaGlsZCBBTkQgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLSAgc3RhdGljIHVuc2lnbmVkIGludCBtYXhhcmNzID0gMDsKLSAgQXJjICphcmMsICoqbmV3YXJjczsKLQotICBEQkcgKFRBTExZREVCVUcsIHByaW50ZiAoIlthcmNfYWRkXSAlbHUgYXJjcyBmcm9tICVzIHRvICVzXG4iLAotCQkJICAgY291bnQsIHBhcmVudC0+bmFtZSwgY2hpbGQtPm5hbWUpKTsKLSAgYXJjID0gYXJjX2xvb2t1cCAocGFyZW50LCBjaGlsZCk7Ci0gIGlmIChhcmMpCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEEgaGl0OiBqdXN0IGluY3JlbWVudCB0aGUgY291bnQuCi0gICAgICAgKi8KLSAgICAgIERCRyAoVEFMTFlERUJVRywgcHJpbnRmICgiW3RhbGx5XSBoaXQgJWx1ICs9ICVsdVxuIiwKLQkJCSAgICAgICBhcmMtPmNvdW50LCBjb3VudCkpOwotICAgICAgYXJjLT5jb3VudCArPSBjb3VudDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGFyYyA9IChBcmMgKikgeG1hbGxvYyAoc2l6ZW9mICgqYXJjKSk7Ci0gIG1lbXNldCAoYXJjLCAwLCBzaXplb2YgKCphcmMpKTsKLSAgYXJjLT5wYXJlbnQgPSBwYXJlbnQ7Ci0gIGFyYy0+Y2hpbGQgPSBjaGlsZDsKLSAgYXJjLT5jb3VudCA9IGNvdW50OwotCi0gIC8qIElmIHRoaXMgaXNuJ3QgYW4gYXJjIGZvciBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHBhcmVudCwgdGhlbiBhZGQgaXQKLSAgICAgdG8gdGhlIGFycmF5IG9mIGFyY3MuICAqLwotICBpZiAocGFyZW50ICE9IGNoaWxkKQotICAgIHsKLSAgICAgIC8qIElmIHdlJ3ZlIGV4aGF1c3RlZCBzcGFjZSBpbiBvdXIgY3VycmVudCBhcnJheSwgZ2V0IGEgbmV3IG9uZQotCSBhbmQgY29weSB0aGUgY29udGVudHMuICAgV2UgbWlnaHQgd2FudCB0byB0aHJvdHRsZSB0aGUgZG91YmxpbmcKLQkgZmFjdG9yIG9uZSBkYXkuICAqLwotICAgICAgaWYgKG51bWFyY3MgPT0gbWF4YXJjcykKLQl7Ci0JICAvKiBEZXRlcm1pbmUgaG93IG11Y2ggc3BhY2Ugd2Ugd2FudCB0byBhbGxvY2F0ZS4gICovCi0JICBpZiAobWF4YXJjcyA9PSAwKQotCSAgICBtYXhhcmNzID0gMTsKLQkgIG1heGFyY3MgKj0gMjsKLQkKLQkgIC8qIEFsbG9jYXRlIHRoZSBuZXcgYXJyYXkuICAqLwotCSAgbmV3YXJjcyA9IChBcmMgKiopeG1hbGxvYyhzaXplb2YgKEFyYyAqKSAqIG1heGFyY3MpOwotCi0JICAvKiBDb3B5IHRoZSBvbGQgYXJyYXkncyBjb250ZW50cyBpbnRvIHRoZSBuZXcgYXJyYXkuICAqLwotCSAgbWVtY3B5IChuZXdhcmNzLCBhcmNzLCBudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotCi0JICAvKiBGcmVlIHVwIHRoZSBvbGQgYXJyYXkuICAqLwotCSAgZnJlZSAoYXJjcyk7Ci0KLQkgIC8qIEFuZCBtYWtlIHRoZSBuZXcgYXJyYXkgYmUgdGhlIGN1cnJlbnQgYXJyYXkuICAqLwotCSAgYXJjcyA9IG5ld2FyY3M7Ci0JfQotCi0gICAgICAvKiBQbGFjZSB0aGlzIGFyYyBpbiB0aGUgYXJjIGFycmF5LiAgKi8KLSAgICAgIGFyY3NbbnVtYXJjcysrXSA9IGFyYzsKLSAgICB9Ci0KLSAgLyogcHJlcGVuZCB0aGlzIGNoaWxkIHRvIHRoZSBjaGlsZHJlbiBvZiB0aGlzIHBhcmVudDogKi8KLSAgYXJjLT5uZXh0X2NoaWxkID0gcGFyZW50LT5jZy5jaGlsZHJlbjsKLSAgcGFyZW50LT5jZy5jaGlsZHJlbiA9IGFyYzsKLQotICAvKiBwcmVwZW5kIHRoaXMgcGFyZW50IHRvIHRoZSBwYXJlbnRzIG9mIHRoaXMgY2hpbGQ6ICovCi0gIGFyYy0+bmV4dF9wYXJlbnQgPSBjaGlsZC0+Y2cucGFyZW50czsKLSAgY2hpbGQtPmNnLnBhcmVudHMgPSBhcmM7Ci19Ci0KLQotc3RhdGljIGludAotREVGVU4gKGNtcF90b3BvLCAobHAsIHJwKSwgY29uc3QgUFRSIGxwIEFORCBjb25zdCBQVFIgcnApCi17Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLQotICByZXR1cm4gbGVmdC0+Y2cudG9wX29yZGVyIC0gcmlnaHQtPmNnLnRvcF9vcmRlcjsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHByb3BhZ2F0ZV90aW1lLCAocGFyZW50KSwgU3ltICogcGFyZW50KQotewotICBBcmMgKmFyYzsKLSAgU3ltICpjaGlsZDsKLSAgZG91YmxlIHNoYXJlLCBwcm9wX3NoYXJlOwotCi0gIGlmIChwYXJlbnQtPmNnLnByb3AuZnJhY3QgPT0gMC4wKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogZ2F0aGVyIHRpbWUgZnJvbSBjaGlsZHJlbiBvZiB0aGlzIHBhcmVudDogKi8KLQotICBmb3IgKGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotICAgIHsKLSAgICAgIGNoaWxkID0gYXJjLT5jaGlsZDsKLSAgICAgIGlmIChhcmMtPmNvdW50ID09IDAgfHwgY2hpbGQgPT0gcGFyZW50IHx8IGNoaWxkLT5jZy5wcm9wLmZyYWN0ID09IDApCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSBjaGlsZCkKLQl7Ci0JICBpZiAocGFyZW50LT5jZy5jeWMubnVtID09IGNoaWxkLT5jZy5jeWMubnVtKQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGlmIChwYXJlbnQtPmNnLnRvcF9vcmRlciA8PSBjaGlsZC0+Y2cudG9wX29yZGVyKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3Byb3BhZ2F0ZV0gdG9wb3JkZXIgYm90Y2hlc1xuIik7Ci0JICAgIH0KLQkgIGNoaWxkID0gY2hpbGQtPmNnLmN5Yy5oZWFkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAocGFyZW50LT5jZy50b3Bfb3JkZXIgPD0gY2hpbGQtPmNnLnRvcF9vcmRlcikKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIltwcm9wYWdhdGVdIHRvcG9yZGVyIGJvdGNoZXNcbiIpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGNoaWxkLT5uY2FsbHMgPT0gMCkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIGRpc3RyaWJ1dGUgdGltZSBmb3IgdGhpcyBhcmM6ICovCi0gICAgICBhcmMtPnRpbWUgPSBjaGlsZC0+aGlzdC50aW1lICogKCgoZG91YmxlKSBhcmMtPmNvdW50KQotCQkJCSAgICAgIC8gKChkb3VibGUpIGNoaWxkLT5uY2FsbHMpKTsKLSAgICAgIGFyYy0+Y2hpbGRfdGltZSA9IGNoaWxkLT5jZy5jaGlsZF90aW1lCi0JKiAoKChkb3VibGUpIGFyYy0+Y291bnQpIC8gKChkb3VibGUpIGNoaWxkLT5uY2FsbHMpKTsKLSAgICAgIHNoYXJlID0gYXJjLT50aW1lICsgYXJjLT5jaGlsZF90aW1lOwotICAgICAgcGFyZW50LT5jZy5jaGlsZF90aW1lICs9IHNoYXJlOwotCi0gICAgICAvKiAoMSAtIGNnLnByb3AuZnJhY3QpIGdldHMgbG9zdCBhbG9uZyB0aGUgd2F5OiAqLwotICAgICAgcHJvcF9zaGFyZSA9IHBhcmVudC0+Y2cucHJvcC5mcmFjdCAqIHNoYXJlOwotCi0gICAgICAvKiBmaXggdGhpbmdzIGZvciBwcmludGluZzogKi8KLSAgICAgIHBhcmVudC0+Y2cucHJvcC5jaGlsZCArPSBwcm9wX3NoYXJlOwotICAgICAgYXJjLT50aW1lICo9IHBhcmVudC0+Y2cucHJvcC5mcmFjdDsKLSAgICAgIGFyYy0+Y2hpbGRfdGltZSAqPSBwYXJlbnQtPmNnLnByb3AuZnJhY3Q7Ci0KLSAgICAgIC8qIGFkZCB0aGlzIHNoYXJlIHRvIHRoZSBwYXJlbnQncyBjeWNsZSBoZWFkZXIsIGlmIGFueTogKi8KLSAgICAgIGlmIChwYXJlbnQtPmNnLmN5Yy5oZWFkICE9IHBhcmVudCkKLQl7Ci0JICBwYXJlbnQtPmNnLmN5Yy5oZWFkLT5jZy5jaGlsZF90aW1lICs9IHNoYXJlOwotCSAgcGFyZW50LT5jZy5jeWMuaGVhZC0+Y2cucHJvcC5jaGlsZCArPSBwcm9wX3NoYXJlOwotCX0KLSAgICAgIERCRyAoUFJPUERFQlVHLAotCSAgIHByaW50ZiAoIltwcm9wX3RpbWVdIGNoaWxkIFx0Iik7Ci0JICAgcHJpbnRfbmFtZSAoY2hpbGQpOwotCSAgIHByaW50ZiAoIiB3aXRoICVmICVmICVsdS8lbHVcbiIsIGNoaWxkLT5oaXN0LnRpbWUsCi0JCSAgIGNoaWxkLT5jZy5jaGlsZF90aW1lLCBhcmMtPmNvdW50LCBjaGlsZC0+bmNhbGxzKTsKLQkgICBwcmludGYgKCJbcHJvcF90aW1lXSBwYXJlbnRcdCIpOwotCSAgIHByaW50X25hbWUgKHBhcmVudCk7Ci0JICAgcHJpbnRmICgiXG5bcHJvcF90aW1lXSBzaGFyZSAlZlxuIiwgc2hhcmUpKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIENvbXB1dGUgdGhlIHRpbWUgb2YgYSBjeWNsZSBhcyB0aGUgc3VtIG9mIHRoZSB0aW1lcyBvZiBhbGwKLSAqIGl0cyBtZW1iZXJzLgotICovCi1zdGF0aWMgdm9pZAotREVGVU5fVk9JRCAoY3ljbGVfdGltZSkKLXsKLSAgU3ltICptZW1iZXIsICpjeWM7Ci0KLSAgZm9yIChjeWMgPSAmY3ljbGVfaGVhZGVyWzFdOyBjeWMgPD0gJmN5Y2xlX2hlYWRlcltudW1fY3ljbGVzXTsgKytjeWMpCi0gICAgewotICAgICAgZm9yIChtZW1iZXIgPSBjeWMtPmNnLmN5Yy5uZXh0OyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgaWYgKG1lbWJlci0+Y2cucHJvcC5mcmFjdCA9PSAwLjApCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIEFsbCBtZW1iZXJzIGhhdmUgdGhlIHNhbWUgcHJvcGZyYWN0aW9uIGV4Y2VwdCB0aG9zZQotCSAgICAgICAqIHRoYXQgd2VyZSBleGNsdWRlZCB3aXRoIC1FLgotCSAgICAgICAqLwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBjeWMtPmhpc3QudGltZSArPSBtZW1iZXItPmhpc3QudGltZTsKLQl9Ci0gICAgICBjeWMtPmNnLnByb3Auc2VsZiA9IGN5Yy0+Y2cucHJvcC5mcmFjdCAqIGN5Yy0+aGlzdC50aW1lOwotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU5fVk9JRCAoY3ljbGVfbGluaykKLXsKLSAgU3ltICpzeW0sICpjeWMsICptZW1iZXI7Ci0gIEFyYyAqYXJjOwotICBpbnQgbnVtOwotCi0gIC8qIGNvdW50IHRoZSBudW1iZXIgb2YgY3ljbGVzLCBhbmQgaW5pdGlhbGl6ZSB0aGUgY3ljbGUgbGlzdHM6ICovCi0KLSAgbnVtX2N5Y2xlcyA9IDA7Ci0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgLyogdGhpcyBpcyBob3cgeW91IGZpbmQgdW5hdHRhY2hlZCBjeWNsZXM6ICovCi0gICAgICBpZiAoc3ltLT5jZy5jeWMuaGVhZCA9PSBzeW0gJiYgc3ltLT5jZy5jeWMubmV4dCkKLQl7Ci0JICArK251bV9jeWNsZXM7Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBjeWNsZV9oZWFkZXIgaXMgaW5kZXhlZCBieSBjeWNsZSBudW1iZXI6IGkuZS4gaXQgaXMgb3JpZ2luIDEsCi0gICAqIG5vdCBvcmlnaW4gMC4KLSAgICovCi0gIGN5Y2xlX2hlYWRlciA9IChTeW0gKikgeG1hbGxvYyAoKG51bV9jeWNsZXMgKyAxKSAqIHNpemVvZiAoU3ltKSk7Ci0KLSAgLyoKLSAgICogTm93IGxpbmsgY3ljbGVzIHRvIHRydWUgY3ljbGUtaGVhZHMsIG51bWJlciB0aGVtLCBhY2N1bXVsYXRlCi0gICAqIHRoZSBkYXRhIGZvciB0aGUgY3ljbGUuCi0gICAqLwotICBudW0gPSAwOwotICBjeWMgPSBjeWNsZV9oZWFkZXI7Ci0gIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0gICAgewotICAgICAgaWYgKCEoc3ltLT5jZy5jeWMuaGVhZCA9PSBzeW0gJiYgc3ltLT5jZy5jeWMubmV4dCAhPSAwKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICArK251bTsKLSAgICAgICsrY3ljOwotICAgICAgc3ltX2luaXQgKGN5Yyk7Ci0gICAgICBjeWMtPmNnLnByaW50X2ZsYWcgPSBUUlVFOwkvKiBzaG91bGQgdGhpcyBiZSBwcmludGVkPyAqLwotICAgICAgY3ljLT5jZy50b3Bfb3JkZXIgPSBERk5fTkFOOwkvKiBncmFwaCBjYWxsIGNoYWluIHRvcC1zb3J0IG9yZGVyICovCi0gICAgICBjeWMtPmNnLmN5Yy5udW0gPSBudW07CS8qIGludGVybmFsIG51bWJlciBvZiBjeWNsZSBvbiAqLwotICAgICAgY3ljLT5jZy5jeWMuaGVhZCA9IGN5YzsJLyogcG9pbnRlciB0byBoZWFkIG9mIGN5Y2xlICovCi0gICAgICBjeWMtPmNnLmN5Yy5uZXh0ID0gc3ltOwkvKiBwb2ludGVyIHRvIG5leHQgbWVtYmVyIG9mIGN5Y2xlICovCi0gICAgICBEQkcgKENZQ0xFREVCVUcsIHByaW50ZiAoIltjeWNsZV9saW5rXSAiKTsKLQkgICBwcmludF9uYW1lIChzeW0pOwotCSAgIHByaW50ZiAoIiBpcyB0aGUgaGVhZCBvZiBjeWNsZSAlZFxuIiwgbnVtKSk7Ci0KLSAgICAgIC8qIGxpbmsgbWVtYmVycyB0byBjeWNsZSBoZWFkZXI6ICovCi0gICAgICBmb3IgKG1lbWJlciA9IHN5bTsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIG1lbWJlci0+Y2cuY3ljLm51bSA9IG51bTsKLQkgIG1lbWJlci0+Y2cuY3ljLmhlYWQgPSBjeWM7Ci0JfQotCi0gICAgICAvKgotICAgICAgICogQ291bnQgY2FsbHMgZnJvbSBvdXRzaWRlIHRoZSBjeWNsZSBhbmQgdGhvc2UgYW1vbmcgY3ljbGUKLSAgICAgICAqIG1lbWJlcnM6Ci0gICAgICAgKi8KLSAgICAgIGZvciAobWVtYmVyID0gc3ltOyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgZm9yIChhcmMgPSBtZW1iZXItPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gYXJjLT5uZXh0X3BhcmVudCkKLQkgICAgewotCSAgICAgIGlmIChhcmMtPnBhcmVudCA9PSBtZW1iZXIpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIGlmIChhcmMtPnBhcmVudC0+Y2cuY3ljLm51bSA9PSBudW0pCi0JCXsKLQkJICBjeWMtPmNnLnNlbGZfY2FsbHMgKz0gYXJjLT5jb3VudDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGN5Yy0+bmNhbGxzICs9IGFyYy0+Y291bnQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIENoZWNrIGlmIGFueSBwYXJlbnQgb2YgdGhpcyBjaGlsZCAob3Igb3V0c2lkZSBwYXJlbnRzIG9mIHRoaXMKLSAqIGN5Y2xlKSBoYXZlIHRoZWlyIHByaW50IGZsYWdzIG9uIGFuZCBzZXQgdGhlIHByaW50IGZsYWcgb2YgdGhlCi0gKiBjaGlsZCAoY3ljbGUpIGFwcHJvcHJpYXRlbHkuICBTaW1pbGFybHksIGRlYWwgd2l0aCBwcm9wYWdhdGlvbgotICogZnJhY3Rpb25zIGZyb20gcGFyZW50cy4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChpbmhlcml0X2ZsYWdzLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgU3ltICpoZWFkLCAqcGFyZW50LCAqbWVtYmVyOwotICBBcmMgKmFyYzsKLQotICBoZWFkID0gY2hpbGQtPmNnLmN5Yy5oZWFkOwotICBpZiAoY2hpbGQgPT0gaGVhZCkKLSAgICB7Ci0gICAgICAvKiBqdXN0IGEgcmVndWxhciBjaGlsZCwgY2hlY2sgaXRzIHBhcmVudHM6ICovCi0gICAgICBjaGlsZC0+Y2cucHJpbnRfZmxhZyA9IEZBTFNFOwotICAgICAgY2hpbGQtPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0gICAgICBmb3IgKGFyYyA9IGNoaWxkLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQpCi0JewotCSAgcGFyZW50ID0gYXJjLT5wYXJlbnQ7Ci0JICBpZiAoY2hpbGQgPT0gcGFyZW50KQotCSAgICB7Ci0JICAgICAgY29udGludWU7Ci0JICAgIH0KLQkgIGNoaWxkLT5jZy5wcmludF9mbGFnIHw9IHBhcmVudC0+Y2cucHJpbnRfZmxhZzsKLQkgIC8qCi0JICAgKiBJZiB0aGUgY2hpbGQgd2FzIG5ldmVyIGFjdHVhbGx5IGNhbGxlZCAoZS5nLiwgdGhpcyBhcmMKLQkgICAqIGlzIHN0YXRpYyAoYW5kIGFsbCBvdGhlcnMgYXJlLCB0b28pKSBubyB0aW1lIHByb3BhZ2F0ZXMKLQkgICAqIGFsb25nIHRoaXMgYXJjLgotCSAgICovCi0JICBpZiAoY2hpbGQtPm5jYWxscyAhPSAwKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByb3AuZnJhY3QgKz0gcGFyZW50LT5jZy5wcm9wLmZyYWN0Ci0JCSogKCgoZG91YmxlKSBhcmMtPmNvdW50KSAvICgoZG91YmxlKSBjaGlsZC0+bmNhbGxzKSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEl0cyBhIG1lbWJlciBvZiBhIGN5Y2xlLCBsb29rIGF0IGFsbCBwYXJlbnRzIGZyb20gb3V0c2lkZQotICAgICAgICogdGhlIGN5Y2xlLgotICAgICAgICovCi0gICAgICBoZWFkLT5jZy5wcmludF9mbGFnID0gRkFMU0U7Ci0gICAgICBoZWFkLT5jZy5wcm9wLmZyYWN0ID0gMC4wOwotICAgICAgZm9yIChtZW1iZXIgPSBoZWFkLT5jZy5jeWMubmV4dDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotCXsKLQkgIGZvciAoYXJjID0gbWVtYmVyLT5jZy5wYXJlbnRzOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9wYXJlbnQpCi0JICAgIHsKLQkgICAgICBpZiAoYXJjLT5wYXJlbnQtPmNnLmN5Yy5oZWFkID09IGhlYWQpCi0JCXsKLQkJICBjb250aW51ZTsKLQkJfQotCSAgICAgIHBhcmVudCA9IGFyYy0+cGFyZW50OwotCSAgICAgIGhlYWQtPmNnLnByaW50X2ZsYWcgfD0gcGFyZW50LT5jZy5wcmludF9mbGFnOwotCSAgICAgIC8qCi0JICAgICAgICogSWYgdGhlIGN5Y2xlIHdhcyBuZXZlciBhY3R1YWxseSBjYWxsZWQgKGUuZy4gdGhpcwotCSAgICAgICAqIGFyYyBpcyBzdGF0aWMgKGFuZCBhbGwgb3RoZXJzIGFyZSwgdG9vKSkgbm8gdGltZQotCSAgICAgICAqIHByb3BhZ2F0ZXMgYWxvbmcgdGhpcyBhcmMuCi0JICAgICAgICovCi0JICAgICAgaWYgKGhlYWQtPm5jYWxscyAhPSAwKQotCQl7Ci0JCSAgaGVhZC0+Y2cucHJvcC5mcmFjdCArPSBwYXJlbnQtPmNnLnByb3AuZnJhY3QKLQkJICAgICogKCgoZG91YmxlKSBhcmMtPmNvdW50KSAvICgoZG91YmxlKSBoZWFkLT5uY2FsbHMpKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZm9yIChtZW1iZXIgPSBoZWFkOyBtZW1iZXI7IG1lbWJlciA9IG1lbWJlci0+Y2cuY3ljLm5leHQpCi0JewotCSAgbWVtYmVyLT5jZy5wcmludF9mbGFnID0gaGVhZC0+Y2cucHJpbnRfZmxhZzsKLQkgIG1lbWJlci0+Y2cucHJvcC5mcmFjdCA9IGhlYWQtPmNnLnByb3AuZnJhY3Q7Ci0JfQotICAgIH0KLX0KLQotCi0vKgotICogSW4gb25lIHRvcC10by1ib3R0b20gcGFzcyBvdmVyIHRoZSB0b3BvbG9naWNhbGx5IHNvcnRlZCBzeW1ib2xzCi0gKiBwcm9wYWdhdGU6Ci0gKiAgICAgIGNnLnByaW50X2ZsYWcgYXMgdGhlIHVuaW9uIG9mIHBhcmVudHMnIHByaW50X2ZsYWdzCi0gKiAgICAgIHByb3BmcmFjdGlvbiBhcyB0aGUgc3VtIG9mIGZyYWN0aW9uYWwgcGFyZW50cycgcHJvcGZyYWN0aW9ucwotICogYW5kIHdoaWxlIHdlJ3JlIGhlcmUsIHN1bSB0aW1lIGZvciBmdW5jdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJvcGFnYXRlX2ZsYWdzLCAoc3ltYm9scyksIFN5bSAqKiBzeW1ib2xzKQotewotICBpbnQgaW5kZXg7Ci0gIFN5bSAqb2xkX2hlYWQsICpjaGlsZDsKLQotICBvbGRfaGVhZCA9IDA7Ci0gIGZvciAoaW5kZXggPSBzeW10YWIubGVuIC0gMTsgaW5kZXggPj0gMDsgLS1pbmRleCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IHN5bWJvbHNbaW5kZXhdOwotICAgICAgLyoKLSAgICAgICAqIElmIHdlIGhhdmVuJ3QgZG9uZSB0aGlzIGZ1bmN0aW9uIG9yIGN5Y2xlLCBpbmhlcml0IHRoaW5ncwotICAgICAgICogZnJvbSBwYXJlbnQuICBUaGlzIHdheSwgd2UgYXJlIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGFyY3MKLSAgICAgICAqIHNpbmNlIHdlIGRvIGFsbCBtZW1iZXJzIG9mIGEgY3ljbGUgKGFuZCB0aGUgY3ljbGUgaXRzZWxmKQotICAgICAgICogYXMgd2UgaGl0IHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGN5Y2xlLgotICAgICAgICovCi0gICAgICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IG9sZF9oZWFkKQotCXsKLQkgIG9sZF9oZWFkID0gY2hpbGQtPmNnLmN5Yy5oZWFkOwotCSAgaW5oZXJpdF9mbGFncyAoY2hpbGQpOwotCX0KLSAgICAgIERCRyAoUFJPUERFQlVHLAotCSAgIHByaW50ZiAoIltwcm9wX2ZsYWdzXSAiKTsKLQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICAgcHJpbnRmICgiaW5oZXJpdHMgcHJpbnQtZmxhZyAlZCBhbmQgcHJvcC1mcmFjdCAlZlxuIiwKLQkJICAgY2hpbGQtPmNnLnByaW50X2ZsYWcsIGNoaWxkLT5jZy5wcm9wLmZyYWN0KSk7Ci0gICAgICBpZiAoIWNoaWxkLT5jZy5wcmludF9mbGFnKQotCXsKLQkgIC8qCi0JICAgKiBQcmludGZsYWcgaXMgb2ZmLiBJdCBnZXRzIHR1cm5lZCBvbiBieSBiZWluZyBpbiB0aGUKLQkgICAqIElOQ0xfR1JBUEggdGFibGUsIG9yIHRoZXJlIGJlaW5nIGFuIGVtcHR5IElOQ0xfR1JBUEgKLQkgICAqIHRhYmxlIGFuZCBub3QgYmVpbmcgaW4gdGhlIEVYQ0xfR1JBUEggdGFibGUuCi0JICAgKi8KLQkgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX0dSQVBIXSwgY2hpbGQtPmFkZHIpCi0JICAgICAgfHwgKHN5bXNbSU5DTF9HUkFQSF0ubGVuID09IDAKLQkJICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9HUkFQSF0sIGNoaWxkLT5hZGRyKSkpCi0JICAgIHsKLQkgICAgICBjaGlsZC0+Y2cucHJpbnRfZmxhZyA9IFRSVUU7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyoKLQkgICAqIFRoaXMgZnVuY3Rpb24gaGFzIHByaW50aW5nIHBhcmVudHM6IG1heWJlIHNvbWVvbmUgd2FudHMKLQkgICAqIHRvIHNodXQgaXQgdXAgYnkgcHV0dGluZyBpdCBpbiB0aGUgRVhDTF9HUkFQSCB0YWJsZS4KLQkgICAqIChCdXQgZmF2b3IgSU5DTF9HUkFQSCBvdmVyIEVYQ0xfR1JBUEguKQotCSAgICovCi0JICBpZiAoIXN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfR1JBUEhdLCBjaGlsZC0+YWRkcikKLQkgICAgICAmJiBzeW1fbG9va3VwICgmc3ltc1tFWENMX0dSQVBIXSwgY2hpbGQtPmFkZHIpKQotCSAgICB7Ci0JICAgICAgY2hpbGQtPmNnLnByaW50X2ZsYWcgPSBGQUxTRTsKLQkgICAgfQotCX0KLSAgICAgIGlmIChjaGlsZC0+Y2cucHJvcC5mcmFjdCA9PSAwLjApCi0JewotCSAgLyoKLQkgICAqIE5vIHBhcmVudHMgdG8gcGFzcyB0aW1lIHRvLiAgQ29sbGVjdCB0aW1lIGZyb20gY2hpbGRyZW4KLQkgICAqIGlmIGl0cyBpbiB0aGUgSU5DTF9USU1FIHRhYmxlLCBvciB0aGVyZSBpcyBhbiBlbXB0eQotCSAgICogSU5DTF9USU1FIHRhYmxlIGFuZCBpdHMgbm90IGluIHRoZSBFWENMX1RJTUUgdGFibGUuCi0JICAgKi8KLQkgIGlmIChzeW1fbG9va3VwICgmc3ltc1tJTkNMX1RJTUVdLCBjaGlsZC0+YWRkcikKLQkgICAgICB8fCAoc3ltc1tJTkNMX1RJTUVdLmxlbiA9PSAwCi0JCSAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfVElNRV0sIGNoaWxkLT5hZGRyKSkpCi0JICAgIHsKLQkgICAgICBjaGlsZC0+Y2cucHJvcC5mcmFjdCA9IDEuMDsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKgotCSAgICogSXQgaGFzIHBhcmVudHMgdG8gcGFzcyB0aW1lIHRvLCBidXQgbWF5YmUgc29tZW9uZSB3YW50cwotCSAgICogdG8gc2h1dCBpdCB1cCBieSBwdXR0dGluZyBpdCBpbiB0aGUgRVhDTF9USU1FIHRhYmxlLgotCSAgICogKEJ1dCBmYXZvciBiZWluZyBpbiBJTkNMX1RJTUUgdGFiZSBvdmVyIGJlaW5nIGluCi0JICAgKiBFWENMX1RJTUUgdGFibGUuKQotCSAgICovCi0JICBpZiAoIXN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfVElNRV0sIGNoaWxkLT5hZGRyKQotCSAgICAgICYmIHN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfVElNRV0sIGNoaWxkLT5hZGRyKSkKLQkgICAgewotCSAgICAgIGNoaWxkLT5jZy5wcm9wLmZyYWN0ID0gMC4wOwotCSAgICB9Ci0JfQotICAgICAgY2hpbGQtPmNnLnByb3Auc2VsZiA9IGNoaWxkLT5oaXN0LnRpbWUgKiBjaGlsZC0+Y2cucHJvcC5mcmFjdDsKLSAgICAgIHByaW50X3RpbWUgKz0gY2hpbGQtPmNnLnByb3Auc2VsZjsKLSAgICAgIERCRyAoUFJPUERFQlVHLAotCSAgIHByaW50ZiAoIltwcm9wX2ZsYWdzXSAiKTsKLQkgICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICAgcHJpbnRmICgiIGVuZHMgdXAgd2l0aCBwcmludGZsYWcgJWQgYW5kIHByb3AtZnJhY3QgJWZcbiIsCi0JCSAgIGNoaWxkLT5jZy5wcmludF9mbGFnLCBjaGlsZC0+Y2cucHJvcC5mcmFjdCk7Ci0JICAgcHJpbnRmICgiW3Byb3BfZmxhZ3NdIHRpbWUgJWYgcHJvcHNlbGYgJWYgcHJpbnRfdGltZSAlZlxuIiwKLQkJICAgY2hpbGQtPmhpc3QudGltZSwgY2hpbGQtPmNnLnByb3Auc2VsZiwgcHJpbnRfdGltZSkpOwotICAgIH0KLX0KLQotCi0vKgotICogQ29tcGFyZSBieSBkZWNyZWFzaW5nIHByb3BhZ2F0ZWQgdGltZS4gIElmIHRpbWVzIGFyZSBlcXVhbCwgYnV0IG9uZQotICogaXMgYSBjeWNsZSBoZWFkZXIsIHNheSB0aGF0J3MgZmlyc3QgKGUuZy4gbGVzcywgaS5lLiAtMSkuICBJZiBvbmUncwotICogbmFtZSBkb2Vzbid0IGhhdmUgYW4gdW5kZXJzY29yZSBhbmQgdGhlIG90aGVyIGRvZXMsIHNheSB0aGF0IG9uZSBpcwotICogZmlyc3QuICBBbGwgZWxzZSBiZWluZyBlcXVhbCwgY29tcGFyZSBieSBuYW1lcy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF90b3RhbCwgKGxwLCBycCksIGNvbnN0IFBUUiBscCBBTkQgY29uc3QgUFRSIHJwKQotewotICBjb25zdCBTeW0gKmxlZnQgPSAqKGNvbnN0IFN5bSAqKikgbHA7Ci0gIGNvbnN0IFN5bSAqcmlnaHQgPSAqKGNvbnN0IFN5bSAqKikgcnA7Ci0gIGRvdWJsZSBkaWZmOwotCi0gIGRpZmYgPSAobGVmdC0+Y2cucHJvcC5zZWxmICsgbGVmdC0+Y2cucHJvcC5jaGlsZCkKLSAgICAtIChyaWdodC0+Y2cucHJvcC5zZWxmICsgcmlnaHQtPmNnLnByb3AuY2hpbGQpOwotICBpZiAoZGlmZiA8IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGlmIChkaWZmID4gMC4wKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmICghbGVmdC0+bmFtZSAmJiBsZWZ0LT5jZy5jeWMubnVtICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaWYgKCFyaWdodC0+bmFtZSAmJiByaWdodC0+Y2cuY3ljLm51bSAhPSAwKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKCFsZWZ0LT5uYW1lKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmICghcmlnaHQtPm5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAobGVmdC0+bmFtZVswXSAhPSAnXycgJiYgcmlnaHQtPm5hbWVbMF0gPT0gJ18nKQotICAgIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGlmIChsZWZ0LT5uYW1lWzBdID09ICdfJyAmJiByaWdodC0+bmFtZVswXSAhPSAnXycpCi0gICAgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBpZiAobGVmdC0+bmNhbGxzID4gcmlnaHQtPm5jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAobGVmdC0+bmNhbGxzIDwgcmlnaHQtPm5jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIHJldHVybiBzdHJjbXAgKGxlZnQtPm5hbWUsIHJpZ2h0LT5uYW1lKTsKLX0KLQotCi0vKgotICogVG9wb2xvZ2ljYWxseSBzb3J0IHRoZSBncmFwaCAoY29sbGFwc2luZyBjeWNsZXMpLCBhbmQgcHJvcGFnYXRlcwotICogdGltZSBib3R0b20gdXAgYW5kIGZsYWdzIHRvcCBkb3duLgotICovCi1TeW0gKioKLURFRlVOX1ZPSUQgKGNnX2Fzc2VtYmxlKQotewotICBTeW0gKnBhcmVudCwgKip0aW1lX3NvcnRlZF9zeW1zLCAqKnRvcF9zb3J0ZWRfc3ltczsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBBcmMgKmFyYzsKLQotICAvKgotICAgKiBpbml0aWFsaXplIHZhcmlvdXMgdGhpbmdzOgotICAgKiAgICAgIHplcm8gb3V0IGNoaWxkIHRpbWVzLgotICAgKiAgICAgIGNvdW50IHNlbGYtcmVjdXJzaXZlIGNhbGxzLgotICAgKiAgICAgIGluZGljYXRlIHRoYXQgbm90aGluZyBpcyBvbiBjeWNsZXMuCi0gICAqLwotICBmb3IgKHBhcmVudCA9IHN5bXRhYi5iYXNlOyBwYXJlbnQgPCBzeW10YWIubGltaXQ7IHBhcmVudCsrKQotICAgIHsKLSAgICAgIHBhcmVudC0+Y2cuY2hpbGRfdGltZSA9IDAuMDsKLSAgICAgIGFyYyA9IGFyY19sb29rdXAgKHBhcmVudCwgcGFyZW50KTsKLSAgICAgIGlmIChhcmMgJiYgcGFyZW50ID09IGFyYy0+Y2hpbGQpCi0JewotCSAgcGFyZW50LT5uY2FsbHMgLT0gYXJjLT5jb3VudDsKLQkgIHBhcmVudC0+Y2cuc2VsZl9jYWxscyA9IGFyYy0+Y291bnQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHBhcmVudC0+Y2cuc2VsZl9jYWxscyA9IDA7Ci0JfQotICAgICAgcGFyZW50LT5jZy5wcm9wLmZyYWN0ID0gMC4wOwotICAgICAgcGFyZW50LT5jZy5wcm9wLnNlbGYgPSAwLjA7Ci0gICAgICBwYXJlbnQtPmNnLnByb3AuY2hpbGQgPSAwLjA7Ci0gICAgICBwYXJlbnQtPmNnLnByaW50X2ZsYWcgPSBGQUxTRTsKLSAgICAgIHBhcmVudC0+Y2cudG9wX29yZGVyID0gREZOX05BTjsKLSAgICAgIHBhcmVudC0+Y2cuY3ljLm51bSA9IDA7Ci0gICAgICBwYXJlbnQtPmNnLmN5Yy5oZWFkID0gcGFyZW50OwotICAgICAgcGFyZW50LT5jZy5jeWMubmV4dCA9IDA7Ci0gICAgICBpZiAoaWdub3JlX2RpcmVjdF9jYWxscykKLQl7Ci0JICBmaW5kX2NhbGwgKHBhcmVudCwgcGFyZW50LT5hZGRyLCAocGFyZW50ICsgMSktPmFkZHIpOwotCX0KLSAgICB9Ci0gIC8qCi0gICAqIFRvcG9sb2dpY2FsbHkgb3JkZXIgdGhpbmdzLiAgSWYgYW55IG5vZGUgaXMgdW5udW1iZXJlZCwgbnVtYmVyCi0gICAqIGl0IGFuZCBhbnkgb2YgaXRzIGRlc2NlbmRlbnRzLgotICAgKi8KLSAgZm9yIChwYXJlbnQgPSBzeW10YWIuYmFzZTsgcGFyZW50IDwgc3ltdGFiLmxpbWl0OyBwYXJlbnQrKykKLSAgICB7Ci0gICAgICBpZiAocGFyZW50LT5jZy50b3Bfb3JkZXIgPT0gREZOX05BTikKLQl7Ci0JICBjZ19kZm4gKHBhcmVudCk7Ci0JfQotICAgIH0KLQotICAvKiBsaW5rIHRvZ2V0aGVyIG5vZGVzIG9uIHRoZSBzYW1lIGN5Y2xlOiAqLwotICBjeWNsZV9saW5rICgpOwotCi0gIC8qIHNvcnQgdGhlIHN5bWJvbCB0YWJsZSBpbiByZXZlcnNlIHRvcG9sb2dpY2FsIG9yZGVyOiAqLwotICB0b3Bfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgIHsKLSAgICAgIHRvcF9zb3J0ZWRfc3ltc1tpbmRleF0gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotICAgIH0KLSAgcXNvcnQgKHRvcF9zb3J0ZWRfc3ltcywgc3ltdGFiLmxlbiwgc2l6ZW9mIChTeW0gKiksIGNtcF90b3BvKTsKLSAgREJHIChERk5ERUJVRywKLSAgICAgICBwcmludGYgKCJbY2dfYXNzZW1ibGVdIHRvcG9sb2dpY2FsIHNvcnQgbGlzdGluZ1xuIik7Ci0gICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICAgICB7Ci0gICAgICAgcHJpbnRmICgiW2NnX2Fzc2VtYmxlXSAiKTsKLSAgICAgICBwcmludGYgKCIlZDoiLCB0b3Bfc29ydGVkX3N5bXNbaW5kZXhdLT5jZy50b3Bfb3JkZXIpOwotICAgICAgIHByaW50X25hbWUgKHRvcF9zb3J0ZWRfc3ltc1tpbmRleF0pOwotICAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgICAgfQotICApOwotICAvKgotICAgKiBTdGFydGluZyBmcm9tIHRoZSB0b3BvbG9naWNhbCB0b3AsIHByb3BhZ2F0ZSBwcmludCBmbGFncyB0bwotICAgKiBjaGlsZHJlbi4gIGFsc28sIGNhbGN1bGF0ZSBwcm9wYWdhdGlvbiBmcmFjdGlvbnMuICB0aGlzIGhhcHBlbnMKLSAgICogYmVmb3JlIHRpbWUgcHJvcGFnYXRpb24gc2luY2UgdGltZSBwcm9wYWdhdGlvbiB1c2VzIHRoZQotICAgKiBmcmFjdGlvbnMuCi0gICAqLwotICBwcm9wYWdhdGVfZmxhZ3MgKHRvcF9zb3J0ZWRfc3ltcyk7Ci0KLSAgLyoKLSAgICogU3RhcnRpbmcgZnJvbSB0aGUgdG9wb2xvZ2ljYWwgYm90dG9tLCBwcm9wb2dhdGUgY2hpbGRyZW4gdGltZXMKLSAgICogdXAgdG8gcGFyZW50cy4KLSAgICovCi0gIGN5Y2xlX3RpbWUgKCk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0gICAgewotICAgICAgcHJvcGFnYXRlX3RpbWUgKHRvcF9zb3J0ZWRfc3ltc1tpbmRleF0pOwotICAgIH0KLQotICBmcmVlICh0b3Bfc29ydGVkX3N5bXMpOwotCi0gIC8qCi0gICAqIE5vdywgc29ydCBieSBDRy5QUk9QLlNFTEYgKyBDRy5QUk9QLkNISUxELiAgU29ydGluZyBib3RoIHRoZSByZWd1bGFyCi0gICAqIGZ1bmN0aW9uIG5hbWVzIGFuZCBjeWNsZSBoZWFkZXJzLgotICAgKi8KLSAgdGltZV9zb3J0ZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKChzeW10YWIubGVuICsgbnVtX2N5Y2xlcykgKiBzaXplb2YgKFN5bSAqKSk7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47IGluZGV4KyspCi0gICAgewotICAgICAgdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotICAgIH0KLSAgZm9yIChpbmRleCA9IDE7IGluZGV4IDw9IG51bV9jeWNsZXM7IGluZGV4KyspCi0gICAgewotICAgICAgdGltZV9zb3J0ZWRfc3ltc1tzeW10YWIubGVuICsgaW5kZXggLSAxXSA9ICZjeWNsZV9oZWFkZXJbaW5kZXhdOwotICAgIH0KLSAgcXNvcnQgKHRpbWVfc29ydGVkX3N5bXMsIHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzLCBzaXplb2YgKFN5bSAqKSwKLQkgY21wX3RvdGFsKTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbiArIG51bV9jeWNsZXM7IGluZGV4KyspCi0gICAgewotICAgICAgdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0tPmNnLmluZGV4ID0gaW5kZXggKyAxOwotICAgIH0KLSAgcmV0dXJuIHRpbWVfc29ydGVkX3N5bXM7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9jZ19hcmNzLmggYi9ncHJvZi9jZ19hcmNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTAxOTcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfYXJjcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotI2lmbmRlZiBjZ19hcmNzX2gKLSNkZWZpbmUgY2dfYXJjc19oCi0KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi0vKgotICogQXJjIHN0cnVjdHVyZSBmb3IgY2FsbC1ncmFwaC4KLSAqCi0gKiBXaXRoIHBvaW50ZXJzIHRvIHRoZSBzeW1ib2xzIG9mIHRoZSBwYXJlbnQgYW5kIHRoZSBjaGlsZCwgYSBjb3VudAotICogb2YgaG93IG1hbnkgdGltZXMgdGhpcyBhcmMgd2FzIHRyYXZlcnNlZCwgYW5kIHBvaW50ZXJzIHRvIHRoZSBuZXh0Ci0gKiBwYXJlbnQgb2YgdGhpcyBjaGlsZCBhbmQgdGhlIG5leHQgY2hpbGQgb2YgdGhpcyBwYXJlbnQuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGFyYwotICB7Ci0gICAgU3ltICpwYXJlbnQ7CQkvKiBzb3VyY2UgdmVydGljZSBvZiBhcmMgKi8KLSAgICBTeW0gKmNoaWxkOwkJCS8qIGRlc3QgdmVydGljZSBvZiBhcmMgKi8KLSAgICB1bnNpZ25lZCBsb25nIGNvdW50OwkvKiAjIG9mIGNhbGxzIGZyb20gcGFyZW50IHRvIGNoaWxkICovCi0gICAgZG91YmxlIHRpbWU7CQkvKiB0aW1lIGluaGVyaXRlZCBhbG9uZyBhcmMgKi8KLSAgICBkb3VibGUgY2hpbGRfdGltZTsJCS8qIGNoaWxkLXRpbWUgaW5oZXJpdGVkIGFsb25nIGFyYyAqLwotICAgIHN0cnVjdCBhcmMgKm5leHRfcGFyZW50OwkvKiBuZXh0IHBhcmVudCBvZiBDSElMRCAqLwotICAgIHN0cnVjdCBhcmMgKm5leHRfY2hpbGQ7CS8qIG5leHQgY2hpbGQgb2YgUEFSRU5UICovCi0gICAgaW50IGhhc19iZWVuX3BsYWNlZDsJLyogaGF2ZSB0aGlzIGFyYydzIGZ1bmN0aW9ucyBiZWVuIHBsYWNlZD8gKi8KLSAgfQotQXJjOwotCi1leHRlcm4gdW5zaWduZWQgaW50IG51bV9jeWNsZXM7CS8qIG51bWJlciBvZiBjeWNsZXMgZGlzY292ZXJlZCAqLwotZXh0ZXJuIFN5bSAqY3ljbGVfaGVhZGVyOwkvKiBjeWNsZSBoZWFkZXJzICovCi0KLWV4dGVybiB2b2lkIGFyY19hZGQgUEFSQU1TICgoU3ltICogcGFyZW50LCBTeW0gKiBjaGlsZCwgdW5zaWduZWQgbG9uZyBjb3VudCkpOwotZXh0ZXJuIEFyYyAqYXJjX2xvb2t1cCBQQVJBTVMgKChTeW0gKiBwYXJlbnQsIFN5bSAqIGNoaWxkKSk7Ci1leHRlcm4gU3ltICoqY2dfYXNzZW1ibGUgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIEFyYyAqKmFyY3M7Ci1leHRlcm4gdW5zaWduZWQgaW50IG51bWFyY3M7Ci0KLSNlbmRpZiAvKiBjZ19hcmNzX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2NnX2Rmbi5jIGIvZ3Byb2YvY2dfZGZuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZDY0ZTcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfZGZuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNnX2Rmbi5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0KLSNkZWZpbmUJREZOX0lOQ1JfREVQVEggKDEyOCkKLQotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIFN5bSAqc3ltOwotICAgIGludCBjeWNsZV90b3A7Ci0gIH0KLURGTl9TdGFjazsKLQotREZOX1N0YWNrICpkZm5fc3RhY2sgPSBOVUxMOwotaW50IGRmbl9tYXhkZXB0aCA9IDA7Ci1pbnQgZGZuX2RlcHRoID0gMDsKLWludCBkZm5fY291bnRlciA9IERGTl9OQU47Ci0KLQotLyoKLSAqIElzIENISUxEIGFscmVhZHkgbnVtYmVyZWQ/Ci0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAoaXNfbnVtYmVyZWQsIChjaGlsZCksIFN5bSAqIGNoaWxkKQotewotICByZXR1cm4gY2hpbGQtPmNnLnRvcF9vcmRlciAhPSBERk5fTkFOICYmIGNoaWxkLT5jZy50b3Bfb3JkZXIgIT0gREZOX0JVU1k7Ci19Ci0KLQotLyoKLSAqIElzIENISUxEIGFscmVhZHkgYnVzeT8KLSAqLwotc3RhdGljIGJvb2wKLURFRlVOIChpc19idXN5LCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgaWYgKGNoaWxkLT5jZy50b3Bfb3JkZXIgPT0gREZOX05BTikKLSAgICB7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogQ0hJTEQgaXMgcGFydCBvZiBhIGN5Y2xlLiAgRmluZCB0aGUgdG9wIGNhbGxlciBpbnRvIHRoaXMgY3ljbGUKLSAqIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIGN5Y2xlIGFuZCBtYWtlIGFsbCBmdW5jdGlvbnMgaW4gY3ljbGUKLSAqIG1lbWJlcnMgb2YgdGhhdCBjeWNsZSAodG9wIGNhbGxlciA9PSBjYWxsZXIgd2l0aCBzbWFsbGVzdAotICogZGVwdGgtZmlyc3QgbnVtYmVyKS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChmaW5kX2N5Y2xlLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgU3ltICpoZWFkID0gMDsKLSAgU3ltICp0YWlsOwotICBpbnQgY3ljbGVfdG9wOwotICBpbnQgaW5kZXg7Ci0KLSAgZm9yIChjeWNsZV90b3AgPSBkZm5fZGVwdGg7IGN5Y2xlX3RvcCA+IDA7IC0tY3ljbGVfdG9wKQotICAgIHsKLSAgICAgIGhlYWQgPSBkZm5fc3RhY2tbY3ljbGVfdG9wXS5zeW07Ci0gICAgICBpZiAoY2hpbGQgPT0gaGVhZCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoY2hpbGQtPmNnLmN5Yy5oZWFkICE9IGNoaWxkICYmIGNoaWxkLT5jZy5jeWMuaGVhZCA9PSBoZWFkKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmIChjeWNsZV90b3AgPD0gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbZmluZF9jeWNsZV0gY291bGRuJ3QgZmluZCBoZWFkIG9mIGN5Y2xlXG4iKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLSNpZmRlZiBERUJVRwotICBpZiAoZGVidWdfbGV2ZWwgJiBERk5ERUJVRykKLSAgICB7Ci0gICAgICBwcmludGYgKCJbZmluZF9jeWNsZV0gZGZuX2RlcHRoICVkIGN5Y2xlX3RvcCAlZCAiLAotCSAgICAgIGRmbl9kZXB0aCwgY3ljbGVfdG9wKTsKLSAgICAgIGlmIChoZWFkKQotCXsKLQkgIHByaW50X25hbWUgKGhlYWQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCI8dW5rbm93bj4iKTsKLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLSNlbmRpZgotICBpZiAoY3ljbGVfdG9wID09IGRmbl9kZXB0aCkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogVGhpcyBpcyBwcmV2aW91cyBmdW5jdGlvbiwgZS5nLiB0aGlzIGNhbGxzIGl0c2VsZi4gIFNvcnQgb2YKLSAgICAgICAqIGJvcmluZy4KLSAgICAgICAqCi0gICAgICAgKiBTaW5jZSB3ZSBhcmUgdGFraW5nIG91dCBzZWxmLWN5Y2xlcyBlbHNld2hlcmUgbm8gbmVlZCBmb3IKLSAgICAgICAqIHRoZSBzcGVjaWFsIGNhc2UsIGhlcmUuCi0gICAgICAgKi8KLSAgICAgIERCRyAoREZOREVCVUcsCi0JICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdICIpOwotCSAgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgICBwcmludGYgKCJcbiIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogR2xvbSBpbnRlcnZlbmluZyBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgYWxyZWFkeSBnbG9tbWVkIGludG8KLSAgICAgICAqIHRoaXMgY3ljbGUuICBUaGluZ3MgaGF2ZSBiZWVuIGdsb21tZWQgd2hlbiB0aGVpciBjeWNsZWhlYWQKLSAgICAgICAqIGZpZWxkIHBvaW50cyB0byB0aGUgaGVhZCBvZiB0aGUgY3ljbGUgdGhleSBhcmUgZ2xvbW1lZAotICAgICAgICogaW50by4KLSAgICAgICAqLwotICAgICAgZm9yICh0YWlsID0gaGVhZDsgdGFpbC0+Y2cuY3ljLm5leHQ7IHRhaWwgPSB0YWlsLT5jZy5jeWMubmV4dCkKLQl7Ci0JICAvKiB2b2lkOiBjaGFzZSBkb3duIHRvIHRhaWwgb2YgdGhpbmdzIGFscmVhZHkgZ2xvbW1lZCAqLwotCSAgREJHIChERk5ERUJVRywKLQkgICAgICAgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIHRhaWwgIik7Ci0JICAgICAgIHByaW50X25hbWUgKHRhaWwpOwotCSAgICAgICBwcmludGYgKCJcbiIpKTsKLQl9Ci0gICAgICAvKgotICAgICAgICogSWYgd2hhdCB3ZSB0aGluayBpcyB0aGUgdG9wIG9mIHRoZSBjeWNsZSBoYXMgYSBjeWNsZWhlYWQKLSAgICAgICAqIGZpZWxkLCB0aGVuIGl0J3Mgbm90IHJlYWxseSB0aGUgaGVhZCBvZiB0aGUgY3ljbGUsIHdoaWNoIGlzCi0gICAgICAgKiByZWFsbHkgd2hhdCB3ZSB3YW50LgotICAgICAgICovCi0gICAgICBpZiAoaGVhZC0+Y2cuY3ljLmhlYWQgIT0gaGVhZCkKLQl7Ci0JICBoZWFkID0gaGVhZC0+Y2cuY3ljLmhlYWQ7Ci0JICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZmluZF9jeWNsZV0gbmV3IGN5Y2xlaGVhZCAiKTsKLQkgICAgICAgcHJpbnRfbmFtZSAoaGVhZCk7Ci0JICAgICAgIHByaW50ZiAoIlxuIikpOwotCX0KLSAgICAgIGZvciAoaW5kZXggPSBjeWNsZV90b3AgKyAxOyBpbmRleCA8PSBkZm5fZGVwdGg7ICsraW5kZXgpCi0JewotCSAgY2hpbGQgPSBkZm5fc3RhY2tbaW5kZXhdLnN5bTsKLQkgIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgPT0gY2hpbGQpCi0JICAgIHsKLQkgICAgICAvKgotCSAgICAgICAqIE5vdCB5ZXQgZ2xvbW1lZCBhbnl3aGVyZSwgZ2xvbSBpdCBhbmQgZml4IGFueQotCSAgICAgICAqIGNoaWxkcmVuIGl0IGhhcyBnbG9tbWVkLgotCSAgICAgICAqLwotCSAgICAgIHRhaWwtPmNnLmN5Yy5uZXh0ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPmNnLmN5Yy5oZWFkID0gaGVhZDsKLQkgICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJbZmluZF9jeWNsZV0gZ2xvbW1pbmcgIik7Ci0JCSAgIHByaW50X25hbWUgKGNoaWxkKTsKLQkJICAgcHJpbnRmICgiIG9udG8gIik7Ci0JCSAgIHByaW50X25hbWUgKGhlYWQpOwotCQkgICBwcmludGYgKCJcbiIpKTsKLQkgICAgICBmb3IgKHRhaWwgPSBjaGlsZDsgdGFpbC0+Y2cuY3ljLm5leHQ7IHRhaWwgPSB0YWlsLT5jZy5jeWMubmV4dCkKLQkJewotCQkgIHRhaWwtPmNnLmN5Yy5uZXh0LT5jZy5jeWMuaGVhZCA9IGhlYWQ7Ci0JCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2ZpbmRfY3ljbGVdIGFuZCBpdHMgdGFpbCAiKTsKLQkJICAgICAgIHByaW50X25hbWUgKHRhaWwtPmNnLmN5Yy5uZXh0KTsKLQkJICAgICAgIHByaW50ZiAoIiBvbnRvICIpOwotCQkgICAgICAgcHJpbnRfbmFtZSAoaGVhZCk7Ci0JCSAgICAgICBwcmludGYgKCJcbiIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChjaGlsZC0+Y2cuY3ljLmhlYWQgIT0gaGVhZCAvKiBmaXJld2FsbCAqLyApCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsICJbZmluZF9jeWNsZV0gZ2xvbW1lZCwgYnV0IG5vdCB0byBoZWFkXG4iKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIFByZXBhcmUgZm9yIHZpc2l0aW5nIHRoZSBjaGlsZHJlbiBvZiBQQVJFTlQuICBQdXNoIGEgcGFyZW50IG9udG8KLSAqIHRoZSBzdGFjayBhbmQgbWFyayBpdCBidXN5LgotICovCi1zdGF0aWMgdm9pZAotREVGVU4gKHByZV92aXNpdCwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgKytkZm5fZGVwdGg7Ci0KLSAgaWYgKGRmbl9kZXB0aCA+PSBkZm5fbWF4ZGVwdGgpCi0gICAgewotICAgICAgZGZuX21heGRlcHRoICs9IERGTl9JTkNSX0RFUFRIOwotICAgICAgZGZuX3N0YWNrID0geHJlYWxsb2MgKGRmbl9zdGFjaywgZGZuX21heGRlcHRoICogc2l6ZW9mICpkZm5fc3RhY2spOwotICAgIH0KLQotICBkZm5fc3RhY2tbZGZuX2RlcHRoXS5zeW0gPSBwYXJlbnQ7Ci0gIGRmbl9zdGFja1tkZm5fZGVwdGhdLmN5Y2xlX3RvcCA9IGRmbl9kZXB0aDsKLSAgcGFyZW50LT5jZy50b3Bfb3JkZXIgPSBERk5fQlVTWTsKLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3ByZV92aXNpdF1cdFx0JWQ6IiwgZGZuX2RlcHRoKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIlxuIikpOwotfQotCi0KLS8qCi0gKiBEb25lIHdpdGggdmlzaXRpbmcgbm9kZSBQQVJFTlQuICBQb3AgUEFSRU5UIG9mZiBkZm5fc3RhY2sKLSAqIGFuZCBudW1iZXIgZnVuY3Rpb25zIGlmIFBBUkVOVCBpcyBoZWFkIG9mIGEgY3ljbGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocG9zdF92aXNpdCwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgU3ltICptZW1iZXI7Ci0KLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3Bvc3RfdmlzaXRdXHQlZDogIiwgZGZuX2RlcHRoKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIlxuIikpOwotICAvKgotICAgKiBOdW1iZXIgZnVuY3Rpb25zIGFuZCB0aGluZ3MgaW4gdGhlaXIgY3ljbGVzIHVubGVzcyB0aGUgZnVuY3Rpb24KLSAgICogaXMgaXRzZWxmIHBhcnQgb2YgYSBjeWNsZToKLSAgICovCi0gIGlmIChwYXJlbnQtPmNnLmN5Yy5oZWFkID09IHBhcmVudCkKLSAgICB7Ci0gICAgICArK2Rmbl9jb3VudGVyOwotICAgICAgZm9yIChtZW1iZXIgPSBwYXJlbnQ7IG1lbWJlcjsgbWVtYmVyID0gbWVtYmVyLT5jZy5jeWMubmV4dCkKLQl7Ci0JICBtZW1iZXItPmNnLnRvcF9vcmRlciA9IGRmbl9jb3VudGVyOwotCSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW3Bvc3RfdmlzaXRdXHRcdG1lbWJlciAiKTsKLQkgICAgICAgcHJpbnRfbmFtZSAobWVtYmVyKTsKLQkgICAgICAgcHJpbnRmICgiLT4gY2cudG9wX29yZGVyID0gJWRcbiIsIGRmbl9jb3VudGVyKSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIERCRyAoREZOREVCVUcsIHByaW50ZiAoIltwb3N0X3Zpc2l0XVx0XHRpcyBwYXJ0IG9mIGEgY3ljbGVcbiIpKTsKLSAgICB9Ci0gIC0tZGZuX2RlcHRoOwotfQotCi0KLS8qCi0gKiBHaXZlbiB0aGlzIFBBUkVOVCwgZGVwdGggZmlyc3QgbnVtYmVyIGl0cyBjaGlsZHJlbi4KLSAqLwotdm9pZAotREVGVU4gKGNnX2RmbiwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgQXJjICphcmM7Ci0KLSAgREJHIChERk5ERUJVRywgcHJpbnRmICgiW2Rmbl0gZGZuKCAiKTsKLSAgICAgICBwcmludF9uYW1lIChwYXJlbnQpOwotICAgICAgIHByaW50ZiAoIilcbiIpKTsKLSAgLyoKLSAgICogSWYgd2UncmUgYWxyZWFkeSBudW1iZXJlZCwgbm8gbmVlZCB0byBsb29rIGFueSBmdXJ0aGVyOgotICAgKi8KLSAgaWYgKGlzX251bWJlcmVkIChwYXJlbnQpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qCi0gICAqIElmIHdlJ3JlIGFscmVhZHkgYnVzeSwgbXVzdCBiZSBhIGN5Y2xlOgotICAgKi8KLSAgaWYgKGlzX2J1c3kgKHBhcmVudCkpCi0gICAgewotICAgICAgZmluZF9jeWNsZSAocGFyZW50KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIHByZV92aXNpdCAocGFyZW50KTsKLSAgLyoKLSAgICogUmVjdXJzaXZlbHkgdmlzaXQgY2hpbGRyZW46Ci0gICAqLwotICBmb3IgKGFyYyA9IHBhcmVudC0+Y2cuY2hpbGRyZW47IGFyYzsgYXJjID0gYXJjLT5uZXh0X2NoaWxkKQotICAgIHsKLSAgICAgIGNnX2RmbiAoYXJjLT5jaGlsZCk7Ci0gICAgfQotICBwb3N0X3Zpc2l0IChwYXJlbnQpOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfZGZuLmggYi9ncHJvZi9jZ19kZm4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMzAzMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9jZ19kZm4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNpZm5kZWYgY2dfZGZuX2gKLSNkZWZpbmUgY2dfZGZuX2gKLQotLyoKLSAqIEZsYWdzIHdoaWNoIG1hcmsgYSBzeW1ib2wgYXMgdG9wb2xvZ2ljYWxseSBgYGJ1c3knJyBvciBhcwotICogdG9wb2xvZ2ljYWxseSBgYG5vdF9udW1iZXJlZCcnOgotICovCi0jZGVmaW5lCURGTl9CVVNZCS0xCi0jZGVmaW5lCURGTl9OQU4JCTAKLQotLyoKLSAqIERlcHRoLWZpcnN0IG51bWJlcmluZyBvZiBhIGNhbGwtZ3JhcGguCi0gKi8KLQotZXh0ZXJuIHZvaWQgY2dfZGZuIFBBUkFNUyAoKFN5bSAqIHJvb3QpKTsKLQotI2VuZGlmIC8qIGNnX2Rmbl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9jZ19wcmludC5jIGIvZ3Byb2YvY2dfcHJpbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY0NWJjNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9jZ19wcmludC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI3NiArMCwwIEBACi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgImNnX3ByaW50LmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInV0aWxzLmgiCi0KLS8qCi0gKiBSZXR1cm4gdmFsdWUgb2YgY29tcGFyaXNvbiBmdW5jdGlvbnMgdXNlZCB0byBzb3J0IHRhYmxlczoKLSAqLwotI2RlZmluZQlMRVNTVEhBTgktMQotI2RlZmluZQlFUVVBTFRPCQkwCi0jZGVmaW5lCUdSRUFURVJUSEFOCTEKLQotc3RhdGljIHZvaWQgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgUEFSQU1TICgoQXJjICoqLCB1bnNpZ25lZCBsb25nLAotCQkJCQkJICAgICAgaW50LCBBcmMgKiosCi0JCQkJCQkgICAgICB1bnNpZ25lZCBsb25nICopKTsKLS8qIGRlY2xhcmF0aW9ucyBvZiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmdW5jdGlvbnMgdG8gb3V0cHV0IGJsdXJiczogKi8KLWV4dGVybiB2b2lkIGJzZF9jYWxsZ19ibHVyYiBQQVJBTVMgKChGSUxFICogZnApKTsKLWV4dGVybiB2b2lkIGZzZl9jYWxsZ19ibHVyYiBQQVJBTVMgKChGSUxFICogZnApKTsKLQotZG91YmxlIHByaW50X3RpbWUgPSAwLjA7Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOX1ZPSUQgKHByaW50X2hlYWRlcikKLXsKLSAgaWYgKGZpcnN0X291dHB1dCkKLSAgICB7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCJcZlxuIik7Ci0gICAgfQotICBpZiAoIWJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucykKLQl7Ci0JICBwcmludGYgKF8oIlx0XHQgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpXG5cbiIpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmIChfKCJcdFx0XHRDYWxsIGdyYXBoXG5cbiIpKTsKLQl9Ci0gICAgfQotICBwcmludGYgKF8oIlxuZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgJWxkIGJ5dGUocykiKSwKLQkgIChsb25nKSBoaXN0X3NjYWxlICogc2l6ZW9mIChVTklUKSk7Ci0gIGlmIChwcmludF90aW1lID4gMC4wKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiIGZvciAlLjJmJSUgb2YgJS4yZiBzZWNvbmRzXG5cbiIpLAotCSAgICAgIDEwMC4wIC8gcHJpbnRfdGltZSwgcHJpbnRfdGltZSAvIGh6KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIiBubyB0aW1lIHByb3BhZ2F0ZWRcblxuIikpOwotICAgICAgLyoKLSAgICAgICAqIFRoaXMgZG9lc24ndCBodXJ0LCBzaW5jZSBhbGwgdGhlIG51bWVyYXRvcnMgd2lsbCBiZSAwLjA6Ci0gICAgICAgKi8KLSAgICAgIHByaW50X3RpbWUgPSAxLjA7Ci0gICAgfQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzLyUtNy43cyAgICAgJS04LjhzXG4iLAotCSAgICAgICIiLCAiIiwgIiIsICIiLCBfKCJjYWxsZWQiKSwgXygidG90YWwiKSwgXygicGFyZW50cyIpKTsKLSAgICAgIHByaW50ZiAoIiUtNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzKyUtNy43cyAlLTguOHNcdCU1LjVzXG4iLAotCSAgICAgIF8oImluZGV4IiksIF8oIiV0aW1lIiksIF8oInNlbGYiKSwgXygiZGVzY2VuZGVudHMiKSwKLQkgICAgICBfKCJjYWxsZWQiKSwgXygic2VsZiIpLCBfKCJuYW1lIiksIF8oImluZGV4IikpOwotICAgICAgcHJpbnRmICgiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlNy43cy8lLTcuN3MgICAgICUtOC44c1xuIiwKLQkgICAgICAiIiwgIiIsICIiLCAiIiwgXygiY2FsbGVkIiksIF8oInRvdGFsIiksIF8oImNoaWxkcmVuIikpOwotICAgICAgcHJpbnRmICgiXG4iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKF8oImluZGV4ICUlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gICAgY2FsbGVkICAgICBuYW1lXG4iKSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBQcmludCBhIGN5Y2xlIGhlYWRlci4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9jeWNsZSwgKGN5YyksIFN5bSAqIGN5YykKLXsKLSAgY2hhciBidWZbQlVGU0laXTsKLQotICBzcHJpbnRmIChidWYsICJbJWRdIiwgY3ljLT5jZy5pbmRleCk7Ci0gIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCSAgPyAiJS02LjZzICU1LjFmICU3LjJmICUxMS4yZiAlN2x1IgotCSAgOiAiJS02LjZzICU1LjFmICU3LjJmICU3LjJmICU3bHUiLCBidWYsCi0JICAxMDAgKiAoY3ljLT5jZy5wcm9wLnNlbGYgKyBjeWMtPmNnLnByb3AuY2hpbGQpIC8gcHJpbnRfdGltZSwKLQkgIGN5Yy0+Y2cucHJvcC5zZWxmIC8gaHosIGN5Yy0+Y2cucHJvcC5jaGlsZCAvIGh6LCBjeWMtPm5jYWxscyk7Ci0gIGlmIChjeWMtPmNnLnNlbGZfY2FsbHMgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIrJS03bHUiLCBjeWMtPmNnLnNlbGZfY2FsbHMpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIiAlNy43cyIsICIiKTsKLSAgICB9Ci0gIHByaW50ZiAoXygiIDxjeWNsZSAlZCBhcyBhIHdob2xlPiBbJWRdXG4iKSwgY3ljLT5jZy5jeWMubnVtLCBjeWMtPmNnLmluZGV4KTsKLX0KLQotCi0vKgotICogQ29tcGFyZSBMRUZUIGFuZCBSSUdIVCBtZW1ibWVyLiAgTWFqb3IgY29tcGFyaXNvbiBrZXkgaXMKLSAqIENHLlBST1AuU0VMRitDRy5QUk9QLkNISUxELCBzZWNvbmRhcnkga2V5IGlzIE5DQUxMUytDRy5TRUxGX0NBTExTLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX21lbWJlciwgKGxlZnQsIHJpZ2h0KSwgU3ltICogbGVmdCBBTkQgU3ltICogcmlnaHQpCi17Ci0gIGRvdWJsZSBsZWZ0X3RpbWUgPSBsZWZ0LT5jZy5wcm9wLnNlbGYgKyBsZWZ0LT5jZy5wcm9wLmNoaWxkOwotICBkb3VibGUgcmlnaHRfdGltZSA9IHJpZ2h0LT5jZy5wcm9wLnNlbGYgKyByaWdodC0+Y2cucHJvcC5jaGlsZDsKLSAgdW5zaWduZWQgbG9uZyBsZWZ0X2NhbGxzID0gbGVmdC0+bmNhbGxzICsgbGVmdC0+Y2cuc2VsZl9jYWxsczsKLSAgdW5zaWduZWQgbG9uZyByaWdodF9jYWxscyA9IHJpZ2h0LT5uY2FsbHMgKyByaWdodC0+Y2cuc2VsZl9jYWxsczsKLQotICBpZiAobGVmdF90aW1lID4gcmlnaHRfdGltZSkKLSAgICB7Ci0gICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0gICAgfQotICBpZiAobGVmdF90aW1lIDwgcmlnaHRfdGltZSkKLSAgICB7Ci0gICAgICByZXR1cm4gTEVTU1RIQU47Ci0gICAgfQotCi0gIGlmIChsZWZ0X2NhbGxzID4gcmlnaHRfY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIEdSRUFURVJUSEFOOwotICAgIH0KLSAgaWYgKGxlZnRfY2FsbHMgPCByaWdodF9jYWxscykKLSAgICB7Ci0gICAgICByZXR1cm4gTEVTU1RIQU47Ci0gICAgfQotICByZXR1cm4gRVFVQUxUTzsKLX0KLQotCi0vKgotICogU29ydCBtZW1iZXJzIG9mIGEgY3ljbGUuCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAoc29ydF9tZW1iZXJzLCAoY3ljKSwgU3ltICogY3ljKQotewotICBTeW0gKnRvZG8sICpkb2luZywgKnByZXY7Ci0gIC8qCi0gICAqIERldGFjaCBjeWNsZSBtZW1iZXJzIGZyb20gY3ljbGVoZWFkLCBhbmQgaW5zZXJ0aW9uIHNvcnQgdGhlbQotICAgKiBiYWNrIG9uLgotICAgKi8KLSAgdG9kbyA9IGN5Yy0+Y2cuY3ljLm5leHQ7Ci0gIGN5Yy0+Y2cuY3ljLm5leHQgPSAwOwotICBmb3IgKGRvaW5nID0gdG9kbzsgZG9pbmcgJiYgZG9pbmctPmNnLmN5Yy5uZXh0OyBkb2luZyA9IHRvZG8pCi0gICAgewotICAgICAgdG9kbyA9IGRvaW5nLT5jZy5jeWMubmV4dDsKLSAgICAgIGZvciAocHJldiA9IGN5YzsgcHJldi0+Y2cuY3ljLm5leHQ7IHByZXYgPSBwcmV2LT5jZy5jeWMubmV4dCkKLQl7Ci0JICBpZiAoY21wX21lbWJlciAoZG9pbmcsIHByZXYtPmNnLmN5Yy5uZXh0KSA9PSBHUkVBVEVSVEhBTikKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgZG9pbmctPmNnLmN5Yy5uZXh0ID0gcHJldi0+Y2cuY3ljLm5leHQ7Ci0gICAgICBwcmV2LT5jZy5jeWMubmV4dCA9IGRvaW5nOwotICAgIH0KLX0KLQotCi0vKgotICogUHJpbnQgdGhlIG1lbWJlcnMgb2YgYSBjeWNsZS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9tZW1iZXJzLCAoY3ljKSwgU3ltICogY3ljKQotewotICBTeW0gKm1lbWJlcjsKLQotICBzb3J0X21lbWJlcnMgKGN5Yyk7Ci0gIGZvciAobWVtYmVyID0gY3ljLT5jZy5jeWMubmV4dDsgbWVtYmVyOyBtZW1iZXIgPSBtZW1iZXItPmNnLmN5Yy5uZXh0KQotICAgIHsKLSAgICAgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCSAgICAgID8gIiU2LjZzICU1LjVzICU3LjJmICUxMS4yZiAlN2x1IgotCSAgICAgIDogIiU2LjZzICU1LjVzICU3LjJmICU3LjJmICU3bHUiLAotCSAgICAgICIiLCAiIiwgbWVtYmVyLT5jZy5wcm9wLnNlbGYgLyBoeiwgbWVtYmVyLT5jZy5wcm9wLmNoaWxkIC8gaHosCi0JICAgICAgbWVtYmVyLT5uY2FsbHMpOwotICAgICAgaWYgKG1lbWJlci0+Y2cuc2VsZl9jYWxscyAhPSAwKQotCXsKLQkgIHByaW50ZiAoIislLTdsdSIsIG1lbWJlci0+Y2cuc2VsZl9jYWxscyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHByaW50ZiAoIiAlNy43cyIsICIiKTsKLQl9Ci0gICAgICBwcmludGYgKCIgICAgICIpOwotICAgICAgcHJpbnRfbmFtZSAobWVtYmVyKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDb21wYXJlIHR3byBhcmNzIHRvL2Zyb20gdGhlIHNhbWUgY2hpbGQvcGFyZW50LgotICogICAgICAtIGlmIG9uZSBhcmMgaXMgYSBzZWxmIGFyYywgaXQncyBsZWFzdC4KLSAqICAgICAgLSBpZiBvbmUgYXJjIGlzIHdpdGhpbiBhIGN5Y2xlLCBpdCdzIGxlc3MgdGhhbi4KLSAqICAgICAgLSBpZiBib3RoIGFyY3MgYXJlIHdpdGhpbiBhIGN5Y2xlLCBjb21wYXJlIGFyYyBjb3VudHMuCi0gKiAgICAgIC0gaWYgbmVpdGhlciBhcmMgaXMgd2l0aGluIGEgY3ljbGUsIGNvbXBhcmUgd2l0aAotICogICAgICAgICAgICAgIHRpbWUgKyBjaGlsZF90aW1lIGFzIG1ham9yIGtleQotICogICAgICAgICAgICAgIGFyYyBjb3VudCBhcyBtaW5vciBrZXkKLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9hcmMsIChsZWZ0LCByaWdodCksIEFyYyAqIGxlZnQgQU5EIEFyYyAqIHJpZ2h0KQotewotICBTeW0gKmxlZnRfcGFyZW50ID0gbGVmdC0+cGFyZW50OwotICBTeW0gKmxlZnRfY2hpbGQgPSBsZWZ0LT5jaGlsZDsKLSAgU3ltICpyaWdodF9wYXJlbnQgPSByaWdodC0+cGFyZW50OwotICBTeW0gKnJpZ2h0X2NoaWxkID0gcmlnaHQtPmNoaWxkOwotICBkb3VibGUgbGVmdF90aW1lLCByaWdodF90aW1lOwotCi0gIERCRyAoVElNRURFQlVHLAotICAgICAgIHByaW50ZiAoIltjbXBfYXJjXSAiKTsKLSAgICAgICBwcmludF9uYW1lIChsZWZ0X3BhcmVudCk7Ci0gICAgICAgcHJpbnRmICgiIGNhbGxzICIpOwotICAgICAgIHByaW50X25hbWUgKGxlZnRfY2hpbGQpOwotICAgICAgIHByaW50ZiAoIiAlZiArICVmICVsdS8lbHVcbiIsIGxlZnQtPnRpbWUsIGxlZnQtPmNoaWxkX3RpbWUsCi0JICAgICAgIGxlZnQtPmNvdW50LCBsZWZ0X2NoaWxkLT5uY2FsbHMpOwotICAgICAgIHByaW50ZiAoIltjbXBfYXJjXSAiKTsKLSAgICAgICBwcmludF9uYW1lIChyaWdodF9wYXJlbnQpOwotICAgICAgIHByaW50ZiAoIiBjYWxscyAiKTsKLSAgICAgICBwcmludF9uYW1lIChyaWdodF9jaGlsZCk7Ci0gICAgICAgcHJpbnRmICgiICVmICsgJWYgJWx1LyVsdVxuIiwgcmlnaHQtPnRpbWUsIHJpZ2h0LT5jaGlsZF90aW1lLAotCSAgICAgICByaWdodC0+Y291bnQsIHJpZ2h0X2NoaWxkLT5uY2FsbHMpOwotICAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgKTsKLSAgaWYgKGxlZnRfcGFyZW50ID09IGxlZnRfY2hpbGQpCi0gICAgewotICAgICAgcmV0dXJuIExFU1NUSEFOOwkJLyogbGVmdCBpcyBhIHNlbGYgY2FsbCAqLwotICAgIH0KLSAgaWYgKHJpZ2h0X3BhcmVudCA9PSByaWdodF9jaGlsZCkKLSAgICB7Ci0gICAgICByZXR1cm4gR1JFQVRFUlRIQU47CS8qIHJpZ2h0IGlzIGEgc2VsZiBjYWxsICovCi0gICAgfQotCi0gIGlmIChsZWZ0X3BhcmVudC0+Y2cuY3ljLm51bSAhPSAwICYmIGxlZnRfY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotICAgICAgJiYgbGVmdF9wYXJlbnQtPmNnLmN5Yy5udW0gPT0gbGVmdF9jaGlsZC0+Y2cuY3ljLm51bSkKLSAgICB7Ci0gICAgICAvKiBsZWZ0IGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLwotICAgICAgaWYgKHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSAhPSAwICYmIHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtICE9IDAKLQkgICYmIHJpZ2h0X3BhcmVudC0+Y2cuY3ljLm51bSA9PSByaWdodF9jaGlsZC0+Y2cuY3ljLm51bSkKLQl7Ci0JICAvKiByaWdodCBpcyBhIGNhbGwgd2l0aGluIHRoZSBjeWNsZSwgdG9vICovCi0JICBpZiAobGVmdC0+Y291bnQgPCByaWdodC0+Y291bnQpCi0JICAgIHsKLQkgICAgICByZXR1cm4gTEVTU1RIQU47Ci0JICAgIH0KLQkgIGlmIChsZWZ0LT5jb3VudCA+IHJpZ2h0LT5jb3VudCkKLQkgICAgewotCSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKLQkgICAgfQotCSAgcmV0dXJuIEVRVUFMVE87Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHJpZ2h0IGlzbid0IGEgY2FsbCB3aXRoaW4gdGhlIGN5Y2xlICovCi0JICByZXR1cm4gTEVTU1RIQU47Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGxlZnQgaXNuJ3QgYSBjYWxsIHdpdGhpbiBhIGN5Y2xlICovCi0gICAgICBpZiAocmlnaHRfcGFyZW50LT5jZy5jeWMubnVtICE9IDAgJiYgcmlnaHRfY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotCSAgJiYgcmlnaHRfcGFyZW50LT5jZy5jeWMubnVtID09IHJpZ2h0X2NoaWxkLT5jZy5jeWMubnVtKQotCXsKLQkgIC8qIHJpZ2h0IGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLwotCSAgcmV0dXJuIEdSRUFURVJUSEFOOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBuZWl0aGVyIGlzIGEgY2FsbCB3aXRoaW4gYSBjeWNsZSAqLwotCSAgbGVmdF90aW1lID0gbGVmdC0+dGltZSArIGxlZnQtPmNoaWxkX3RpbWU7Ci0JICByaWdodF90aW1lID0gcmlnaHQtPnRpbWUgKyByaWdodC0+Y2hpbGRfdGltZTsKLQkgIGlmIChsZWZ0X3RpbWUgPCByaWdodF90aW1lKQotCSAgICB7Ci0JICAgICAgcmV0dXJuIExFU1NUSEFOOwotCSAgICB9Ci0JICBpZiAobGVmdF90aW1lID4gcmlnaHRfdGltZSkKLQkgICAgewotCSAgICAgIHJldHVybiBHUkVBVEVSVEhBTjsKLQkgICAgfQotCSAgaWYgKGxlZnQtPmNvdW50IDwgcmlnaHQtPmNvdW50KQotCSAgICB7Ci0JICAgICAgcmV0dXJuIExFU1NUSEFOOwotCSAgICB9Ci0JICBpZiAobGVmdC0+Y291bnQgPiByaWdodC0+Y291bnQpCi0JICAgIHsKLQkgICAgICByZXR1cm4gR1JFQVRFUlRIQU47Ci0JICAgIH0KLQkgIHJldHVybiBFUVVBTFRPOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChzb3J0X3BhcmVudHMsIChjaGlsZCksIFN5bSAqIGNoaWxkKQotewotICBBcmMgKmFyYywgKmRldGFjaGVkLCBzb3J0ZWQsICpwcmV2OwotCi0gIC8qCi0gICAqIFVubGluayBwYXJlbnRzIGZyb20gY2hpbGQsIHRoZW4gaW5zZXJ0aW9uIHNvcnQgYmFjayBvbiB0bwotICAgKiBzb3J0ZWQncyBwYXJlbnRzLgotICAgKiAgICAgICphcmMgICAgICAgIHRoZSBhcmMgeW91IGhhdmUgZGV0YWNoZWQgYW5kIGFyZSBpbnNlcnRpbmcuCi0gICAqICAgICAgKmRldGFjaGVkICAgdGhlIHJlc3Qgb2YgdGhlIGFyY3MgdG8gYmUgc29ydGVkLgotICAgKiAgICAgIHNvcnRlZCAgICAgIGFyYyBsaXN0IG9udG8gd2hpY2ggeW91IGluc2VydGlvbiBzb3J0LgotICAgKiAgICAgICpwcmV2ICAgICAgIGFyYyBiZWZvcmUgdGhlIGFyYyB5b3UgYXJlIGNvbXBhcmluZy4KLSAgICovCi0gIHNvcnRlZC5uZXh0X3BhcmVudCA9IDA7Ci0gIGZvciAoYXJjID0gY2hpbGQtPmNnLnBhcmVudHM7IGFyYzsgYXJjID0gZGV0YWNoZWQpCi0gICAgewotICAgICAgZGV0YWNoZWQgPSBhcmMtPm5leHRfcGFyZW50OwotCi0gICAgICAvKiBjb25zaWRlciAqYXJjIGFzIGRpc2Nvbm5lY3RlZDsgaW5zZXJ0IGl0IGludG8gc29ydGVkOiAqLwotICAgICAgZm9yIChwcmV2ID0gJnNvcnRlZDsgcHJldi0+bmV4dF9wYXJlbnQ7IHByZXYgPSBwcmV2LT5uZXh0X3BhcmVudCkKLQl7Ci0JICBpZiAoY21wX2FyYyAoYXJjLCBwcmV2LT5uZXh0X3BhcmVudCkgIT0gR1JFQVRFUlRIQU4pCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGFyYy0+bmV4dF9wYXJlbnQgPSBwcmV2LT5uZXh0X3BhcmVudDsKLSAgICAgIHByZXYtPm5leHRfcGFyZW50ID0gYXJjOwotICAgIH0KLQotICAvKiByZWF0dGFjaCBzb3J0ZWQgYXJjcyB0byBjaGlsZDogKi8KLSAgY2hpbGQtPmNnLnBhcmVudHMgPSBzb3J0ZWQubmV4dF9wYXJlbnQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9wYXJlbnRzLCAoY2hpbGQpLCBTeW0gKiBjaGlsZCkKLXsKLSAgU3ltICpwYXJlbnQ7Ci0gIEFyYyAqYXJjOwotICBTeW0gKmN5Y2xlX2hlYWQ7Ci0KLSAgaWYgKGNoaWxkLT5jZy5jeWMuaGVhZCAhPSAwKQotICAgIHsKLSAgICAgIGN5Y2xlX2hlYWQgPSBjaGlsZC0+Y2cuY3ljLmhlYWQ7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY3ljbGVfaGVhZCA9IGNoaWxkOwotICAgIH0KLSAgaWYgKCFjaGlsZC0+Y2cucGFyZW50cykKLSAgICB7Ci0gICAgICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkgICAgICA/IF8oIiU2LjZzICU1LjVzICU3LjdzICUxMS4xMXMgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIpCi0JICAgICAgOiBfKCIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlNy43cyAlNy43cyAgICAgPHNwb250YW5lb3VzPlxuIiksCi0JICAgICAgIiIsICIiLCAiIiwgIiIsICIiLCAiIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBzb3J0X3BhcmVudHMgKGNoaWxkKTsKLSAgZm9yIChhcmMgPSBjaGlsZC0+Y2cucGFyZW50czsgYXJjOyBhcmMgPSBhcmMtPm5leHRfcGFyZW50KQotICAgIHsKLSAgICAgIHBhcmVudCA9IGFyYy0+cGFyZW50OwotICAgICAgaWYgKGNoaWxkID09IHBhcmVudCB8fCAoY2hpbGQtPmNnLmN5Yy5udW0gIT0gMAotCQkJICAgICAgJiYgcGFyZW50LT5jZy5jeWMubnVtID09IGNoaWxkLT5jZy5jeWMubnVtKSkKLQl7Ci0JICAvKiBzZWxmY2FsbCBvciBjYWxsIGFtb25nIHNpYmxpbmdzOiAqLwotCSAgcHJpbnRmIChic2Rfc3R5bGVfb3V0cHV0Ci0JCSAgPyAiJTYuNnMgJTUuNXMgJTcuN3MgJTExLjExcyAlN2x1ICU3LjdzICAgICAiCi0JCSAgOiAiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTdsdSAlNy43cyAgICAgIiwKLQkJICAiIiwgIiIsICIiLCAiIiwKLQkJICBhcmMtPmNvdW50LCAiIik7Ci0JICBwcmludF9uYW1lIChwYXJlbnQpOwotCSAgcHJpbnRmICgiXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogcmVndWxhciBwYXJlbnQgb2YgY2hpbGQ6ICovCi0JICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkJICA/ICIlNi42cyAlNS41cyAlNy4yZiAlMTEuMmYgJTdsdS8lLTdsdSAgICAgIgotCQkgIDogIiU2LjZzICU1LjVzICU3LjJmICU3LjJmICU3bHUvJS03bHUgICAgICIsCi0JCSAgIiIsICIiLAotCQkgIGFyYy0+dGltZSAvIGh6LCBhcmMtPmNoaWxkX3RpbWUgLyBoeiwKLQkJICBhcmMtPmNvdW50LCBjeWNsZV9oZWFkLT5uY2FsbHMpOwotCSAgcHJpbnRfbmFtZSAocGFyZW50KTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHNvcnRfY2hpbGRyZW4sIChwYXJlbnQpLCBTeW0gKiBwYXJlbnQpCi17Ci0gIEFyYyAqYXJjLCAqZGV0YWNoZWQsIHNvcnRlZCwgKnByZXY7Ci0gIC8qCi0gICAqIFVubGluayBjaGlsZHJlbiBmcm9tIHBhcmVudCwgdGhlbiBpbnNlcnRpb24gc29ydCBiYWNrIG9uIHRvCi0gICAqIHNvcnRlZCdzIGNoaWxkcmVuLgotICAgKiAgICAgICphcmMgICAgICAgIHRoZSBhcmMgeW91IGhhdmUgZGV0YWNoZWQgYW5kIGFyZSBpbnNlcnRpbmcuCi0gICAqICAgICAgKmRldGFjaGVkICAgdGhlIHJlc3Qgb2YgdGhlIGFyY3MgdG8gYmUgc29ydGVkLgotICAgKiAgICAgIHNvcnRlZCAgICAgIGFyYyBsaXN0IG9udG8gd2hpY2ggeW91IGluc2VydGlvbiBzb3J0LgotICAgKiAgICAgICpwcmV2ICAgICAgIGFyYyBiZWZvcmUgdGhlIGFyYyB5b3UgYXJlIGNvbXBhcmluZy4KLSAgICovCi0gIHNvcnRlZC5uZXh0X2NoaWxkID0gMDsKLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGRldGFjaGVkKQotICAgIHsKLSAgICAgIGRldGFjaGVkID0gYXJjLT5uZXh0X2NoaWxkOwotCi0gICAgICAvKiBjb25zaWRlciAqYXJjIGFzIGRpc2Nvbm5lY3RlZDsgaW5zZXJ0IGl0IGludG8gc29ydGVkOiAqLwotICAgICAgZm9yIChwcmV2ID0gJnNvcnRlZDsgcHJldi0+bmV4dF9jaGlsZDsgcHJldiA9IHByZXYtPm5leHRfY2hpbGQpCi0JewotCSAgaWYgKGNtcF9hcmMgKGFyYywgcHJldi0+bmV4dF9jaGlsZCkgIT0gTEVTU1RIQU4pCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGFyYy0+bmV4dF9jaGlsZCA9IHByZXYtPm5leHRfY2hpbGQ7Ci0gICAgICBwcmV2LT5uZXh0X2NoaWxkID0gYXJjOwotICAgIH0KLQotICAvKiByZWF0dGFjaCBzb3J0ZWQgY2hpbGRyZW4gdG8gcGFyZW50OiAqLwotICBwYXJlbnQtPmNnLmNoaWxkcmVuID0gc29ydGVkLm5leHRfY2hpbGQ7Ci19Ci0KLQotc3RhdGljIHZvaWQKLURFRlVOIChwcmludF9jaGlsZHJlbiwgKHBhcmVudCksIFN5bSAqIHBhcmVudCkKLXsKLSAgU3ltICpjaGlsZDsKLSAgQXJjICphcmM7Ci0KLSAgc29ydF9jaGlsZHJlbiAocGFyZW50KTsKLSAgYXJjID0gcGFyZW50LT5jZy5jaGlsZHJlbjsKLSAgZm9yIChhcmMgPSBwYXJlbnQtPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLSAgICB7Ci0gICAgICBjaGlsZCA9IGFyYy0+Y2hpbGQ7Ci0gICAgICBpZiAoY2hpbGQgPT0gcGFyZW50IHx8IChjaGlsZC0+Y2cuY3ljLm51bSAhPSAwCi0JCQkgICAgICAmJiBjaGlsZC0+Y2cuY3ljLm51bSA9PSBwYXJlbnQtPmNnLmN5Yy5udW0pKQotCXsKLQkgIC8qIHNlbGYgY2FsbCBvciBjYWxsIHRvIHNpYmxpbmc6ICovCi0JICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkJICA/ICIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3bHUgJTcuN3MgICAgICIKLQkJICA6ICIlNi42cyAlNS41cyAlNy43cyAlNy43cyAlN2x1ICU3LjdzICAgICAiLAotCQkgICIiLCAiIiwgIiIsICIiLCBhcmMtPmNvdW50LCAiIik7Ci0JICBwcmludF9uYW1lIChjaGlsZCk7Ci0JICBwcmludGYgKCJcbiIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiByZWd1bGFyIGNoaWxkIG9mIHBhcmVudDogKi8KLQkgIHByaW50ZiAoYnNkX3N0eWxlX291dHB1dAotCQkgID8gIiU2LjZzICU1LjVzICU3LjJmICUxMS4yZiAlN2x1LyUtN2x1ICAgICAiCi0JCSAgOiAiJTYuNnMgJTUuNXMgJTcuMmYgJTcuMmYgJTdsdS8lLTdsdSAgICAgIiwKLQkJICAiIiwgIiIsCi0JCSAgYXJjLT50aW1lIC8gaHosIGFyYy0+Y2hpbGRfdGltZSAvIGh6LAotCQkgIGFyYy0+Y291bnQsIGNoaWxkLT5jZy5jeWMuaGVhZC0+bmNhbGxzKTsKLQkgIHByaW50X25hbWUgKGNoaWxkKTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JfQotICAgIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHByaW50X2xpbmUsIChucCksIFN5bSAqIG5wKQotewotICBjaGFyIGJ1ZltCVUZTSVpdOwotCi0gIHNwcmludGYgKGJ1ZiwgIlslZF0iLCBucC0+Y2cuaW5kZXgpOwotICBwcmludGYgKGJzZF9zdHlsZV9vdXRwdXQKLQkgID8gIiUtNi42cyAlNS4xZiAlNy4yZiAlMTEuMmYiCi0JICA6ICIlLTYuNnMgJTUuMWYgJTcuMmYgJTcuMmYiLCBidWYsCi0JICAxMDAgKiAobnAtPmNnLnByb3Auc2VsZiArIG5wLT5jZy5wcm9wLmNoaWxkKSAvIHByaW50X3RpbWUsCi0JICBucC0+Y2cucHJvcC5zZWxmIC8gaHosIG5wLT5jZy5wcm9wLmNoaWxkIC8gaHopOwotICBpZiAoKG5wLT5uY2FsbHMgKyBucC0+Y2cuc2VsZl9jYWxscykgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIgJTdsdSIsIG5wLT5uY2FsbHMpOwotICAgICAgaWYgKG5wLT5jZy5zZWxmX2NhbGxzICE9IDApCi0JewotCSAgcHJpbnRmICgiKyUtN2x1ICIsIG5wLT5jZy5zZWxmX2NhbGxzKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcHJpbnRmICgiICU3LjdzICIsICIiKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiICU3LjdzICU3LjdzICIsICIiLCAiIik7Ci0gICAgfQotICBwcmludF9uYW1lIChucCk7Ci0gIHByaW50ZiAoIlxuIik7Ci19Ci0KLQotLyoKLSAqIFByaW50IGR5bmFtaWMgY2FsbCBncmFwaC4KLSAqLwotdm9pZAotREVGVU4gKGNnX3ByaW50LCAodGltZXNvcnRzeW0pLCBTeW0gKiogdGltZXNvcnRzeW0pCi17Ci0gIHVuc2lnbmVkIGludCBpbmRleDsKLSAgU3ltICpwYXJlbnQ7Ci0KLSAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucyAmJiBic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGJzZF9jYWxsZ19ibHVyYiAoc3Rkb3V0KTsKLSAgICB9Ci0KLSAgcHJpbnRfaGVhZGVyICgpOwotCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW4gKyBudW1fY3ljbGVzOyArK2luZGV4KQotICAgIHsKLSAgICAgIHBhcmVudCA9IHRpbWVzb3J0c3ltW2luZGV4XTsKLSAgICAgIGlmICgoaWdub3JlX3plcm9zICYmIHBhcmVudC0+bmNhbGxzID09IDAKLQkgICAmJiBwYXJlbnQtPmNnLnNlbGZfY2FsbHMgPT0gMCAmJiBwYXJlbnQtPmNnLnByb3Auc2VsZiA9PSAwCi0JICAgJiYgcGFyZW50LT5jZy5wcm9wLmNoaWxkID09IDApCi0JICB8fCAhcGFyZW50LT5jZy5wcmludF9mbGFnCi0JICB8fCAobGluZV9ncmFudWxhcml0eSAmJiAhIHBhcmVudC0+aXNfZnVuYykpCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKCFwYXJlbnQtPm5hbWUgJiYgcGFyZW50LT5jZy5jeWMubnVtICE9IDApCi0JewotCSAgLyogY3ljbGUgaGVhZGVyOiAqLwotCSAgcHJpbnRfY3ljbGUgKHBhcmVudCk7Ci0JICBwcmludF9tZW1iZXJzIChwYXJlbnQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludF9wYXJlbnRzIChwYXJlbnQpOwotCSAgcHJpbnRfbGluZSAocGFyZW50KTsKLQkgIHByaW50X2NoaWxkcmVuIChwYXJlbnQpOwotCX0KLSAgICAgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotCXByaW50ZiAoIlxuIik7Ci0gICAgICBwcmludGYgKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLQlwcmludGYgKCJcbiIpOwotICAgIH0KLSAgZnJlZSAodGltZXNvcnRzeW0pOwotICBpZiAocHJpbnRfZGVzY3JpcHRpb25zICYmICFic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGZzZl9jYWxsZ19ibHVyYiAoc3Rkb3V0KTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGludAotREVGVU4gKGNtcF9uYW1lLCAobGVmdCwgcmlnaHQpLCBjb25zdCBQVFIgbGVmdCBBTkQgY29uc3QgUFRSIHJpZ2h0KQotewotICBjb25zdCBTeW0gKipucHAxID0gKGNvbnN0IFN5bSAqKikgbGVmdDsKLSAgY29uc3QgU3ltICoqbnBwMiA9IChjb25zdCBTeW0gKiopIHJpZ2h0OwotCi0gIHJldHVybiBzdHJjbXAgKCgqbnBwMSktPm5hbWUsICgqbnBwMiktPm5hbWUpOwotfQotCi0KLXZvaWQKLURFRlVOX1ZPSUQgKGNnX3ByaW50X2luZGV4KQotewotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0gIHVuc2lnbmVkIGludCBubmFtZXMsIHRvZG8sIGksIGo7Ci0gIGludCBjb2wsIHN0YXJ0aW5nX2NvbDsKLSAgU3ltICoqbmFtZV9zb3J0ZWRfc3ltcywgKnN5bTsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgYnVmWzIwXTsKLSAgaW50IGNvbHVtbl93aWR0aCA9IChvdXRwdXRfd2lkdGggLSAxKSAvIDM7CS8qIGRvbid0IHdyaXRlIGluIGxhc3QgY29sISAqLwotICAvKgotICAgKiBOb3csIHNvcnQgcmVndWxhciBmdW5jdGlvbiBuYW1lIGFscGhhYmV0aWNhbGx5IHRvIGNyZWF0ZSBhbgotICAgKiBpbmRleDoKLSAgICovCi0gIG5hbWVfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jICgoc3ltdGFiLmxlbiArIG51bV9jeWNsZXMpICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMCwgbm5hbWVzID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmIChpZ25vcmVfemVyb3MgJiYgc3ltdGFiLmJhc2VbaW5kZXhdLm5jYWxscyA9PSAwCi0JICAmJiBzeW10YWIuYmFzZVtpbmRleF0uaGlzdC50aW1lID09IDApCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgbmFtZV9zb3J0ZWRfc3ltc1tubmFtZXMrK10gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotICAgIH0KLSAgcXNvcnQgKG5hbWVfc29ydGVkX3N5bXMsIG5uYW1lcywgc2l6ZW9mIChTeW0gKiksIGNtcF9uYW1lKTsKLSAgZm9yIChpbmRleCA9IDEsIHRvZG8gPSBubmFtZXM7IGluZGV4IDw9IG51bV9jeWNsZXM7IGluZGV4KyspCi0gICAgewotICAgICAgbmFtZV9zb3J0ZWRfc3ltc1t0b2RvKytdID0gJmN5Y2xlX2hlYWRlcltpbmRleF07Ci0gICAgfQotICBwcmludGYgKCJcZlxuIik7Ci0gIHByaW50ZiAoXygiSW5kZXggYnkgZnVuY3Rpb24gbmFtZVxuXG4iKSk7Ci0gIGluZGV4ID0gKHRvZG8gKyAyKSAvIDM7Ci0gIGZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQotICAgIHsKLSAgICAgIGNvbCA9IDA7Ci0gICAgICBzdGFydGluZ19jb2wgPSAwOwotICAgICAgZm9yIChqID0gaTsgaiA8IHRvZG87IGogKz0gaW5kZXgpCi0JewotCSAgc3ltID0gbmFtZV9zb3J0ZWRfc3ltc1tqXTsKLQkgIGlmIChzeW0tPmNnLnByaW50X2ZsYWcpCi0JICAgIHsKLQkgICAgICBzcHJpbnRmIChidWYsICJbJWRdIiwgc3ltLT5jZy5pbmRleCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHNwcmludGYgKGJ1ZiwgIiglZCkiLCBzeW0tPmNnLmluZGV4KTsKLQkgICAgfQotCSAgaWYgKGogPCBubmFtZXMpCi0JICAgIHsKLQkgICAgICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLQkJewotCQkgIHByaW50ZiAoIiU2LjZzICUtMTkuMTlzIiwgYnVmLCBzeW0tPm5hbWUpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgY29sICs9IHN0cmxlbiAoYnVmKTsKLQkJICBmb3IgKDsgY29sIDwgc3RhcnRpbmdfY29sICsgNTsgKytjb2wpCi0JCSAgICB7Ci0JCSAgICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgICB9Ci0JCSAgcHJpbnRmICgiICVzICIsIGJ1Zik7Ci0JCSAgY29sICs9IHByaW50X25hbWVfb25seSAoc3ltKTsKLQkJICBpZiAoIWxpbmVfZ3JhbnVsYXJpdHkgJiYgc3ltLT5pc19zdGF0aWMgJiYgc3ltLT5maWxlKQotCQkgICAgewotCQkgICAgICBmaWxlbmFtZSA9IHN5bS0+ZmlsZS0+bmFtZTsKLQkJICAgICAgaWYgKCFwcmludF9wYXRoKQotCQkJewotCQkJICBmaWxlbmFtZSA9IHN0cnJjaHIgKGZpbGVuYW1lLCAnLycpOwotCQkJICBpZiAoZmlsZW5hbWUpCi0JCQkgICAgewotCQkJICAgICAgKytmaWxlbmFtZTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBmaWxlbmFtZSA9IHN5bS0+ZmlsZS0+bmFtZTsKLQkJCSAgICB9Ci0JCQl9Ci0JCSAgICAgIHByaW50ZiAoIiAoJXMpIiwgZmlsZW5hbWUpOwotCQkgICAgICBjb2wgKz0gc3RybGVuIChmaWxlbmFtZSkgKyAzOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotCQl7Ci0JCSAgcHJpbnRmICgiJTYuNnMgIiwgYnVmKTsKLQkJICBzcHJpbnRmIChidWYsIF8oIjxjeWNsZSAlZD4iKSwgc3ltLT5jZy5jeWMubnVtKTsKLQkJICBwcmludGYgKCIlLTE5LjE5cyIsIGJ1Zik7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBjb2wgKz0gc3RybGVuIChidWYpOwotCQkgIGZvciAoOyBjb2wgPCBzdGFydGluZ19jb2wgKyA1OyArK2NvbCkKLQkJICAgIHB1dGNoYXIgKCcgJyk7Ci0JCSAgcHJpbnRmICgiICVzICIsIGJ1Zik7Ci0JCSAgc3ByaW50ZiAoYnVmLCBfKCI8Y3ljbGUgJWQ+IiksIHN5bS0+Y2cuY3ljLm51bSk7Ci0JCSAgcHJpbnRmICgiJXMiLCBidWYpOwotCQkgIGNvbCArPSBzdHJsZW4gKGJ1Zik7Ci0JCX0KLQkgICAgfQotCSAgc3RhcnRpbmdfY29sICs9IGNvbHVtbl93aWR0aDsKLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLSAgZnJlZSAobmFtZV9zb3J0ZWRfc3ltcyk7Ci19Ci0KLS8qIENvbXBhcmUgdHdvIGFyY3MgYmFzZWQgb24gdGhlaXIgdXNhZ2UgY291bnRzLiAgV2Ugd2FudCB0byBzb3J0Ci0gICBpbiBkZXNjZW5kaW5nIG9yZGVyLiAgKi8KLXN0YXRpYyBpbnQKLURFRlVOIChjbXBfYXJjX2NvdW50LCAobGVmdCwgcmlnaHQpLCBjb25zdCBQVFIgbGVmdCBBTkQgY29uc3QgUFRSIHJpZ2h0KQotewotICBjb25zdCBBcmMgKipucHAxID0gKGNvbnN0IEFyYyAqKikgbGVmdDsKLSAgY29uc3QgQXJjICoqbnBwMiA9IChjb25zdCBBcmMgKiopIHJpZ2h0OwotCi0gIGlmICgoKm5wcDEpLT5jb3VudCA+ICgqbnBwMiktPmNvdW50KQotICAgIHJldHVybiAtMTsKLSAgZWxzZSBpZiAoKCpucHAxKS0+Y291bnQgPCAoKm5wcDIpLT5jb3VudCkKLSAgICByZXR1cm4gMTsKLSAgZWxzZQotICAgIHJldHVybiAwOwotfQotCi0vKiBDb21wYXJlIHR3byBmdW50aW9ucyBiYXNlZCBvbiB0aGVpciB1c2FnZSBjb3VudHMuICBXZSB3YW50IHRvIHNvcnQKLSAgIGluIGRlc2NlbmRpbmcgb3JkZXIuICAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF9mdW5fbnVzZXMsIChsZWZ0LCByaWdodCksIGNvbnN0IFBUUiBsZWZ0IEFORCBjb25zdCBQVFIgcmlnaHQpCi17Ci0gIGNvbnN0IFN5bSAqKm5wcDEgPSAoY29uc3QgU3ltICoqKSBsZWZ0OwotICBjb25zdCBTeW0gKipucHAyID0gKGNvbnN0IFN5bSAqKikgcmlnaHQ7Ci0KLSAgaWYgKCgqbnBwMSktPm51c2VzID4gKCpucHAyKS0+bnVzZXMpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmICgoKm5wcDEpLT5udXNlcyA8ICgqbnBwMiktPm51c2VzKQotICAgIHJldHVybiAxOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFByaW50IGEgc3VnZ2VzdGVkIGZ1bmN0aW9uIG9yZGVyaW5nIGJhc2VkIG9uIHRoZSBwcm9maWxpbmcgZGF0YS4KLQotICAgV2UgcGVyZm9ybSA0IG1ham9yIHN0ZXBzIHdoZW4gb3JkZXJpbmcgZnVuY3Rpb25zOgotCi0JKiBHcm91cCB1bnVzZWQgZnVuY3Rpb25zIHRvZ2V0aGVyIGFuZCBwbGFjZSB0aGVtIGF0IHRoZQotCWVuZCBvZiB0aGUgZnVuY3Rpb24gb3JkZXIuCi0KLQkqIFNlYXJjaCB0aGUgaGlnaGVzdCB1c2UgYXJjcyAodGhvc2Ugd2hpY2ggYWNjb3VudCBmb3IgOTAlIG9mCi0JdGhlIHRvdGFsIGFyYyBjb3VudCkgZm9yIGZ1bmN0aW9ucyB3aGljaCBoYXZlIHNldmVyYWwgcGFyZW50cy4KLQotCUdyb3VwIHRob3NlIHdpdGggdGhlIG1vc3QgY2FsbCBzaXRlcyB0b2dldGhlciAoY3VycmVudGx5IHRoZQotCXRvcCAxLjI1JSB3aGljaCBoYXZlIGF0IGxlYXN0IGZpdmUgZGlmZmVyZW50IGNhbGwgc2l0ZXMpLgotCi0JVGhlc2UgYXJlIGVtaXR0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBvcmRlci4KLQotCSogVXNlIGEgZ3JlZWR5IHBsYWNlbWVudCBhbGdvcml0aG0gdG8gcGxhY2UgZnVuY3Rpb25zIHdoaWNoCi0Jb2NjdXIgaW4gdGhlIHRvcCA5OSUgb2YgdGhlIGFyY3MgaW4gdGhlIHByb2ZpbGUuICBTb21lIHByb3Zpc2lvbnMKLQlhcmUgbWFkZSB0byBoYW5kbGUgaGlnaCB1c2FnZSBhcmNzIHdoZXJlIHRoZSBwYXJlbnQgYW5kL29yCi0JY2hpbGQgaGFzIGFscmVhZHkgYmVlbiBwbGFjZWQuCi0KLQkqIFJ1biB0aGUgc2FtZSBncmVlZHkgcGxhY2VtZW50IGFsZ29yaXRobSBvbiB0aGUgcmVtYWluaW5nCi0JYXJjcyB0byBwbGFjZSB0aGUgbGVmdG92ZXIgZnVuY3Rpb25zLgotCi0KLSAgIFRoZSB2YXJpb3VzICJtYWdpYyBudW1iZXJzIiBzaG91bGQgKG9uZSBkYXkpIGJlIHR1bmVhYmxlIGJ5IGNvbW1hbmQKLSAgIGxpbmUgb3B0aW9ucy4gIFRoZXkgd2VyZSBhcnJpdmVkIGF0IGJ5IGJlbmNobWFya2luZyBhIGZldyBhcHBsaWNhdGlvbnMKLSAgIHdpdGggdmFyaW91cyB2YWx1ZXMgdG8gc2VlIHdoaWNoIHZhbHVlcyBwcm9kdWNlZCBiZXR0ZXIgb3ZlcmFsbCBmdW5jdGlvbgotICAgb3JkZXJpbmdzLgotCi0gICBPZiBjb3Vyc2UsIHByb2ZpbGluZyBlcnJvcnMsIG1hY2hpbmUgbGltaXRhdGlvbnMgKFBBIGxvbmcgY2FsbHMpLCBhbmQKLSAgIHBvb3IgY3V0b2ZmIHZhbHVlcyBmb3IgdGhlIHBsYWNlbWVudCBhbGdvcml0aG0gbWF5IGxpbWl0IHRoZSB1c2VmdWxsbmVzcwotICAgb2YgdGhlIHJlc3VsdGluZyBmdW5jdGlvbiBvcmRlci4gIEltcHJvdmVtZW50cyB3b3VsZCBiZSBncmVhdGx5IGFwcHJlY2lhdGVkLgotICAgCi0gICBTdWdnZXN0aW9uczoKLQotCSogUGxhY2UgdGhlIGZ1bmN0aW9ucyB3aXRoIG1hbnkgY2FsbGVycyBuZWFyIHRoZSBtaWRkbGUgb2YgdGhlCi0JbGlzdCB0byByZWR1Y2UgbG9uZyBjYWxscy4KLQotCSogUHJvcGFnYXRlIGFyYyB1c2FnZSBjaGFuZ2VzIGFzIGZ1bmN0aW9ucyBhcmUgcGxhY2VkLiAgSWUgaWYKLQlmdW5jMSBhbmQgZnVuYzIgYXJlIHBsYWNlZCB0b2dldGhlciwgYXJjcyB0by9mcm9tIHRob3NlIGFyY3MKLQl0byB0aGUgc2FtZSBwYXJlbnQvY2hpbGQgc2hvdWxkIGJlIGNvbWJpbmVkLCB0aGVuIHJlc29ydCB0aGUKLQlhcmNzIHRvIGNob29zZSB0aGUgbmV4dCBvbmUuCi0KLQkqIEltcGxlbWVudCBzb21lIGdsb2JhbCBwb3NpdGlvbmluZyBhbGdvcml0aG0gdG8gcGxhY2UgdGhlCi0JY2hhaW5zIG1hZGUgYnkgdGhlIGdyZWVkeSBsb2NhbCBwb3NpdGlvbmluZyBhbGdvcml0aG0uICBQcm9iYWJseQotCWJ5IGV4YW1pbmluZyBhcmNzIHdoaWNoIGhhdmVuJ3QgYmVlbiBwbGFjZWQgeWV0IHRvIHRpZSB0d28KLQljaGFpbnMgdG9nZXRoZXIuCi0KLQkqIFRha2UgYSBmdW5jdGlvbidzIHNpemUgYW5kIHRpbWUgaW50byBhY2NvdW50IGluIHRoZSBhbGdvcml0aG07Ci0Jc2l6ZSBpbiBwYXJ0aWN1bGFyIGlzIGltcG9ydGFudCBvbiB0aGUgUEEgKGxvbmcgY2FsbHMpLiAgUGxhY2luZwotCW1hbnkgc21hbGwgZnVuY3Rpb25zIG9udG8gdGhlaXIgb3duIHBhZ2UgbWF5IGJlIHdpc2UuCi0KLQkqIFVzZSBiZXR0ZXIgcHJvZmlsaW5nIGluZm9ybWF0aW9uOyBtYW55IHB1Ymxpc2hlZCBhbGdvcml0aG1zCi0JYXJlIGJhc2VkIG9uIGNhbGwgc2VxdWVuY2VzIHRocm91Z2ggdGltZSwgcmF0aGVyIHRoYW4ganVzdAotCWFyYyBjb3VudHMuCi0KLQkqIFByb2RlY3VyZSBjbG9uaW5nIGNvdWxkIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBhIHNtYWxsIG51bWJlcgotCW9mIGFyY3MgYWNjb3VudCBmb3IgbW9zdCBvZiB0aGUgY2FsbHMgdG8gYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLgotCi0JKiBVc2UgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byBhdm9pZCBtb3ZpbmcgdW51c2VkIGZ1bmN0aW9ucwotCWNvbXBsZXRlbHkgb3V0IG9mIHRoZSBjb2RlIHN0cmVhbTsgdGhpcyB3b3VsZCBhdm9pZCBzZXZlcmUgbG9zc2FnZQotCXdoZW4gdGhlIHByb2ZpbGUgZGF0YSBiZWFycyBsaXR0bGUgcmVzZW1ibGFuY2UgdG8gYWN0dWFsIHJ1bnMuCi0KLQkqIFByb3BhZ2F0aW9uIG9mIGFyYyB1c2FnZXMgc2hvdWxkIGFsc28gaW1wcm92ZSAubyBsaW5rIGxpbmUKLQlvcmRlcmluZyB3aGljaCBzaGFyZXMgdGhlIHNhbWUgYXJjIHBsYWNlbWVudCBhbGdvcml0aG0gd2l0aAotCXRoZSBmdW5jdGlvbiBvcmRlcmluZyBjb2RlIChpbiBmYWN0IGl0IGlzIGEgZGVnZW5lcmF0ZSBjYXNlCi0Jb2YgZnVuY3Rpb24gb3JkZXJpbmcpLiAgKi8KLQkKLXZvaWQKLURFRlVOX1ZPSUQgKGNnX3ByaW50X2Z1bmN0aW9uX29yZGVyaW5nKQotewotICB1bnNpZ25lZCBsb25nIGluZGV4LCB1c2VkLCB1bnVzZWQsIHNjcmF0Y2hfaW5kZXg7Ci0gIHVuc2lnbmVkIGxvbmcgIHVucGxhY2VkX2FyY19jb3VudCwgaGlnaF9hcmNfY291bnQsIHNjcmF0Y2hfYXJjX2NvdW50OwotI2lmZGVmIF9fR05VQ19fCi0gIHVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9hcmNzLCB0bXBfYXJjc19jb3VudDsKLSNlbHNlCi0gIHVuc2lnbmVkIGxvbmcgdG90YWxfYXJjcywgdG1wX2FyY3NfY291bnQ7Ci0jZW5kaWYKLSAgU3ltICoqdW51c2VkX3N5bXMsICoqdXNlZF9zeW1zLCAqKnNjcmF0Y2hfc3ltczsKLSAgQXJjICoqdW5wbGFjZWRfYXJjcywgKipoaWdoX2FyY3MsICoqc2NyYXRjaF9hcmNzOwotCi0gIGluZGV4ID0gMDsKLSAgdXNlZCA9IDA7Ci0gIHVudXNlZCA9IDA7Ci0gIHNjcmF0Y2hfaW5kZXggPSAwOwotICB1bnBsYWNlZF9hcmNfY291bnQgPSAwOwotICBoaWdoX2FyY19jb3VudCA9IDA7Ci0gIHNjcmF0Y2hfYXJjX2NvdW50ID0gMDsKLQotICAvKiBGaXJzdCBncm91cCBhbGwgdGhlIHVudXNlZCBmdW5jdGlvbnMgdG9nZXRoZXIuICAqLwotICB1bnVzZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIHVzZWRfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIHNjcmF0Y2hfc3ltcyA9IChTeW0gKiopIHhtYWxsb2MgKHN5bXRhYi5sZW4gKiBzaXplb2YgKFN5bSAqKSk7Ci0gIGhpZ2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0gIHNjcmF0Y2hfYXJjcyA9IChBcmMgKiopIHhtYWxsb2MgKG51bWFyY3MgKiBzaXplb2YgKEFyYyAqKSk7Ci0gIHVucGxhY2VkX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotCi0gIC8qIFdhbGsgdGhyb3VnaCBhbGwgdGhlIGZ1bmN0aW9uczsgbWFyayB0aG9zZSB3aGljaCBhcmUgbmV2ZXIKLSAgICAgY2FsbGVkIGFzIHBsYWNlZCAod2UnbGwgZW1pdCB0aGVtIGFzIGEgZ3JvdXAgbGF0ZXIpLiAgKi8KLSAgZm9yIChpbmRleCA9IDAsIHVzZWQgPSAwLCB1bnVzZWQgPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47IGluZGV4KyspCi0gICAgewotICAgICAgaWYgKHN5bXRhYi5iYXNlW2luZGV4XS5uY2FsbHMgPT0gMCkKLQl7Ci0JICAvKiBGaWx0ZXIgb3V0IGdwcm9mIGdlbmVyYXRlZCBuYW1lcy4gICovCi0JICBpZiAoc3RyY21wIChzeW10YWIuYmFzZVtpbmRleF0ubmFtZSwgIjxsb2NvcmU+IikKLQkgICAgICAmJiBzdHJjbXAgKHN5bXRhYi5iYXNlW2luZGV4XS5uYW1lLCAiPGhpY29yZT4iKSkKLQkgICAgewotCSAgICAgIHVudXNlZF9zeW1zW3VudXNlZCsrXSA9ICZzeW10YWIuYmFzZVtpbmRleF07Ci0JICAgICAgc3ltdGFiLmJhc2VbaW5kZXhdLmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgdXNlZF9zeW1zW3VzZWQrK10gPSAmc3ltdGFiLmJhc2VbaW5kZXhdOwotCSAgc3ltdGFiLmJhc2VbaW5kZXhdLmhhc19iZWVuX3BsYWNlZCA9IDA7Ci0JICBzeW10YWIuYmFzZVtpbmRleF0ubmV4dCA9IDA7Ci0JICBzeW10YWIuYmFzZVtpbmRleF0ucHJldiA9IDA7Ci0JICBzeW10YWIuYmFzZVtpbmRleF0ubnVzZXMgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogU29ydCB0aGUgYXJjcyBmcm9tIG1vc3QgdXNlZCB0byBsZWFzdCB1c2VkLiAgKi8KLSAgcXNvcnQgKGFyY3MsIG51bWFyY3MsIHNpemVvZiAoQXJjICopLCBjbXBfYXJjX2NvdW50KTsKLQotICAvKiBDb21wdXRlIHRoZSB0b3RhbCBhcmMgY291bnQuICBBbHNvIG1hcmsgYXJjcyBhcyB1bnBsYWNlZC4KLQotICAgICBOb3RlIHdlIGRvbid0IGNvbXBlbnNhdGUgZm9yIG92ZXJmbG93IGlmIHRoYXQgaGFwcGVucyEKLSAgICAgT3ZlcmZsb3cgaXMgbXVjaCBsZXNzIGxpa2VseSB3aGVuIHRoaXMgZmlsZSBpcyBjb21waWxlZAotICAgICB3aXRoIEdDQyBhcyBpdCBjYW4gZG91YmxlLXdpZGUgaW50ZWdlcnMgdmlhIGxvbmcgbG9uZy4gICovCi0gIHRvdGFsX2FyY3MgPSAwOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIHRvdGFsX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OwotICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDA7Ci0gICAgfQotCi0gIC8qIFdlIHdhbnQgdG8gcHVsbCBvdXQgdGhvc2UgZnVuY3Rpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VkCi0gICAgIGJ5IG1hbnkgaGlnaGx5IHVzZWQgYXJjcyBhbmQgZW1pdCB0aGVtIGFzIGEgZ3JvdXAuICBUaGlzCi0gICAgIGNvdWxkIHByb2JhYmx5IHVzZSBzb21lIHR1bmluZy4gICovCi0gIHRtcF9hcmNzX2NvdW50ID0gMDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICB0bXBfYXJjc19jb3VudCArPSBhcmNzW2luZGV4XS0+Y291bnQ7Ci0KLSAgICAgIC8qIENvdW50IGhvdyBtYW55IHRpbWVzIGVhY2ggcGFyZW50IGFuZCBjaGlsZCBhcmUgdXNlZCB1cAotCSB0byBvdXIgdGhyZXNoaG9sZCBvZiBhcmNzICg5MCUpLiAgKi8KLSAgICAgIGlmICgoZG91YmxlKXRtcF9hcmNzX2NvdW50IC8gKGRvdWJsZSl0b3RhbF9hcmNzID4gMC45MCkKLQlicmVhazsKLQotICAgICAgYXJjc1tpbmRleF0tPmNoaWxkLT5udXNlcysrOwotICAgIH0KLQotICAvKiBOb3cgc29ydCBhIHRlbXBvcmFyeSBzeW1ib2wgdGFibGUgYmFzZWQgb24gdGhlIG51bWJlciBvZgotICAgICB0aW1lcyBlYWNoIGZ1bmN0aW9uIHdhcyB1c2VkIGluIHRoZSBoaWdoZXN0IHVzZWQgYXJjcy4gICovCi0gIG1lbWNweSAoc2NyYXRjaF9zeW1zLCB1c2VkX3N5bXMsIHVzZWQgKiBzaXplb2YgKFN5bSAqKSk7Ci0gIHFzb3J0IChzY3JhdGNoX3N5bXMsIHVzZWQsIHNpemVvZiAoU3ltICopLCBjbXBfZnVuX251c2VzKTsKLQotICAvKiBOb3cgcGljayBvdXQgdGhvc2Ugc3ltYm9scyB3ZSdyZSBnb2luZyB0byBlbWl0IGFzCi0gICAgIGEgZ3JvdXAuICBXZSB0YWtlIHVwIHRvIDEuMjUlIG9mIHRoZSB1c2VkIHN5bWJvbHMuICAqLwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1c2VkIC8gODA7IGluZGV4KyspCi0gICAgewotICAgICAgU3ltICpzeW0gPSBzY3JhdGNoX3N5bXNbaW5kZXhdOwotICAgICAgQXJjICphcmM7Ci0KLSAgICAgIC8qIElmIHdlIGhpdCBzeW1ib2xzIHRoYXQgYXJlbid0IHVzZWQgZnJvbSBtYW55IGNhbGwgc2l0ZXMsCi0JIHRoZW4gd2UgY2FuIHF1aXQuICBXZSBjaG9vc2UgZml2ZSBhcyB0aGUgbG93IGxpbWl0IGZvcgotCSBubyBwYXJ0aWN1bGFyIHJlYXNvbi4gICovCi0gICAgICBpZiAoc3ltLT5udXNlcyA9PSA1KQotCWJyZWFrOwotCi0gICAgICAvKiBXZSdyZSBnb2luZyB0byBuZWVkIHRoZSBhcmNzIGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zLgotCSBVbmZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBrbm93IGFsbCB0aGVzZSBmdW5jdGlvbnMKLQkgdW50aWwgd2UncmUgZG9uZS4gIFNvIHdlIGtlZXAgdHJhY2sgb2YgYWxsIHRoZSBhcmNzCi0JIHRvIHRoZSBmdW5jdGlvbnMgd2UgY2FyZSBhYm91dCwgdGhlbiBwcnVuZSBvdXQgdGhvc2UKLQkgd2hpY2ggYXJlIHVuaW50ZXJlc3RpbmcuIAotCi0JIEFuIGludGVyZXN0aW5nIHZhcmlhdGlvbiB3b3VsZCBiZSB0byBxdWl0IHdoZW4gd2UgZm91bmQKLQkgbXVsdGktY2FsbCBzaXRlIGZ1bmN0aW9ucyB3aGljaCBhY2NvdW50IGZvciBzb21lIHBlcmNlbnRhZ2UKLQkgb2YgdGhlIGFyY3MuICAqLwotCi0gICAgICBhcmMgPSBzeW0tPmNnLmNoaWxkcmVuOwotICAgICAgd2hpbGUgKGFyYykKLQl7Ci0JICBpZiAoYXJjLT5wYXJlbnQgIT0gYXJjLT5jaGlsZCkKLQkgICAgc2NyYXRjaF9hcmNzW3NjcmF0Y2hfYXJjX2NvdW50KytdID0gYXJjOwotCSAgYXJjLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgYXJjID0gYXJjLT5uZXh0X2NoaWxkOwotCX0KLQotICAgICAgYXJjID0gc3ltLT5jZy5wYXJlbnRzOwotICAgICAgd2hpbGUgKGFyYykKLQl7Ci0JICBpZiAoYXJjLT5wYXJlbnQgIT0gYXJjLT5jaGlsZCkKLQkgICAgc2NyYXRjaF9hcmNzW3NjcmF0Y2hfYXJjX2NvdW50KytdID0gYXJjOwotCSAgYXJjLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgYXJjID0gYXJjLT5uZXh0X3BhcmVudDsKLQl9Ci0KLSAgICAgIC8qIEtlZXAgdHJhY2sgb2YgaG93IG1hbnkgc3ltYm9scyB3ZSdyZSBnb2luZyB0byBwbGFjZS4gICovCi0gICAgICBzY3JhdGNoX2luZGV4ID0gaW5kZXg7Ci0KLSAgICAgIC8qIEEgbGllLCBidXQgaXQgbWFrZXMgaWRlbnRpZnlpbmcgdGhlc2UgZnVuY3Rpb25zIGVhc2llcgotCSBsYXRlci4gICovCi0gICAgICBzeW0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0gICAgfQotCi0gIC8qIE5vdyB3YWxrIHRocm91Z2ggdGhlIHRlbXBvcmFyeSBhcmNzIGFuZCBjb3B5IHRob3NlIHdlIGNhcmUgYWJvdXQKLSAgICAgaW50byB0aGUgaGlnaCBhcmNzIGFycmF5LiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2NyYXRjaF9hcmNfY291bnQ7IGluZGV4KyspCi0gICAgewotICAgICAgQXJjICphcmMgPSBzY3JhdGNoX2FyY3NbaW5kZXhdOwotCi0gICAgICAvKiBJZiB0aGlzIGFyYyByZWZlcnMgdG8gaGlnaGx5IHVzZWQgZnVuY3Rpb25zLCB0aGVuCi0JIHRoZW4gd2Ugd2FudCB0byBrZWVwIGl0LiAgKi8KLSAgICAgIGlmIChhcmMtPmNoaWxkLT5oYXNfYmVlbl9wbGFjZWQKLQkgICYmIGFyYy0+cGFyZW50LT5oYXNfYmVlbl9wbGFjZWQpCi0JewotCSAgaGlnaF9hcmNzW2hpZ2hfYXJjX2NvdW50KytdID0gc2NyYXRjaF9hcmNzW2luZGV4XTsKLQotCSAgLyogV2UgbmVlZCB0byB0dXJuIG9mIGhhc19iZWVuX3BsYWNlZCBzaW5jZSB3ZSdyZSBnb2luZyB0bwotCSAgICAgdXNlIHRoZSBtYWluIGFyYyBwbGFjZW1lbnQgYWxnb3JpdGhtIG9uIHRoZXNlIGFyY3MuICAqLwotCSAgYXJjLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkID0gMDsKLQkgIGFyYy0+cGFyZW50LT5oYXNfYmVlbl9wbGFjZWQgPSAwOwotCX0KLSAgICB9Ci0KLSAgLyogRHVtcCB0aGUgbXVsdGktc2l0ZSBoaWdoIHVzYWdlIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGdvaW5nCi0gICAgIHRvIGJlIG9yZGVyZWQgYnkgdGhlIG1haW4gb3JkZXJpbmcgYWxnb3JpdGhtLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2NyYXRjaF9pbmRleDsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoc2NyYXRjaF9zeW1zW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkKQotCXByaW50ZiAoIiVzXG4iLCBzY3JhdGNoX3N5bXNbaW5kZXhdLT5uYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGNhbiBvcmRlciB0aGUgbXVsdGktc2l0ZSBoaWdoIHVzZSBmdW5jdGlvbnMgYmFzZWQgb24gdGhlCi0gICAgIGFyY3MgYmV0d2VlbiB0aGVtLiAgKi8KLSAgcXNvcnQgKGhpZ2hfYXJjcywgaGlnaF9hcmNfY291bnQsIHNpemVvZiAoQXJjICopLCBjbXBfYXJjX2NvdW50KTsKLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGhpZ2hfYXJjcywgaGlnaF9hcmNfY291bnQsIDEsCi0JCQkJICAgIHVucGxhY2VkX2FyY3MsICZ1bnBsYWNlZF9hcmNfY291bnQpOwotCi0gIC8qIE9yZGVyIGFuZCBkdW1wIHRoZSBoaWdoIHVzZSBmdW5jdGlvbnMgbGVmdCwgdGhlc2UgdHlwaWNhbGx5Ci0gICAgIGhhdmUgb25seSBhIGZldyBjYWxsIHNpdGVzLiAgKi8KLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIDAsCi0JCQkJICAgIHVucGxhY2VkX2FyY3MsICZ1bnBsYWNlZF9hcmNfY291bnQpOwotCi0gIC8qIE5vdyBwbGFjZSB0aGUgcmFyZWx5IHVzZWQgZnVuY3Rpb25zLiAgKi8KLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKHVucGxhY2VkX2FyY3MsIHVucGxhY2VkX2FyY19jb3VudCwgMSwKLQkJCQkgICAgc2NyYXRjaF9hcmNzLCAmc2NyYXRjaF9hcmNfY291bnQpOwotCi0gIC8qIE91dHB1dCBhbnkgZnVuY3Rpb25zIG5vdCBlbWl0dGVkIGJ5IHRoZSBvcmRlcl9hbmRfZHVtcCBjYWxscy4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHVzZWQ7IGluZGV4KyspCi0gICAgaWYgKHVzZWRfc3ltc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9PSAwKQotICAgICAgcHJpbnRmKCIlc1xuIiwgdXNlZF9zeW1zW2luZGV4XS0+bmFtZSk7Ci0KLSAgLyogT3V0cHV0IHRoZSB1bnVzZWQgZnVuY3Rpb25zLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdW51c2VkOyBpbmRleCsrKQotICAgIHByaW50ZigiJXNcbiIsIHVudXNlZF9zeW1zW2luZGV4XS0+bmFtZSk7Ci0KLSAgdW51c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICB1c2VkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBzY3JhdGNoX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBoaWdoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICBzY3JhdGNoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICB1bnBsYWNlZF9hcmNzID0gKEFyYyAqKikgeG1hbGxvYyAobnVtYXJjcyAqIHNpemVvZiAoQXJjICopKTsKLQotICBmcmVlICh1bnVzZWRfc3ltcyk7Ci0gIGZyZWUgKHVzZWRfc3ltcyk7Ci0gIGZyZWUgKHNjcmF0Y2hfc3ltcyk7Ci0gIGZyZWUgKGhpZ2hfYXJjcyk7Ci0gIGZyZWUgKHNjcmF0Y2hfYXJjcyk7Ci0gIGZyZWUgKHVucGxhY2VkX2FyY3MpOwotfQotCi0vKiBQbGFjZSBmdW5jdGlvbnMgYmFzZWQgb24gdGhlIGFyY3MgaW4gQVJDUyB3aXRoIE5VTUFSQ1MgZW50cmllczsKLSAgIHBsYWNlIHVudXNlZCBhcmNzIGludG8gVU5QTEFDRURfQVJDUy9VTlBMQUNFRF9BUkNfQ09VTlQuCi0KLSAgIElmIEFMTCBpcyBub256ZXJvLCB0aGVuIHBsYWNlIGFsbCBmdW5jdGlvbnMgcmVmZXJlbmNlZCBieSBBUkNTLAotICAgZWxzZSBvbmx5IHBsYWNlIHRob3NlIHJlZmVyZW5jZWQgaW4gdGhlIHRvcCA5OSUgb2YgdGhlIGFyY3MgaW4gQVJDUy4gICovCi0KLSNkZWZpbmUgTU9TVCAwLjk5Ci1zdGF0aWMgdm9pZAotb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIGFsbCwKLQkJCQkgIHVucGxhY2VkX2FyY3MsIHVucGxhY2VkX2FyY19jb3VudCkKLSAgICAgQXJjICoqYXJjczsKLSAgICAgdW5zaWduZWQgbG9uZyBudW1hcmNzOwotICAgICBpbnQgYWxsOwotICAgICBBcmMgKip1bnBsYWNlZF9hcmNzOwotICAgICB1bnNpZ25lZCBsb25nICp1bnBsYWNlZF9hcmNfY291bnQ7Ci17Ci0jaWZkZWYgX19HTlVDX18KLSAgdW5zaWduZWQgbG9uZyBsb25nIHRtcF9hcmNzLCB0b3RhbF9hcmNzOwotI2Vsc2UKLSAgdW5zaWduZWQgbG9uZyB0bXBfYXJjcywgdG90YWxfYXJjczsKLSNlbmRpZgotICB1bnNpZ25lZCBpbnQgaW5kZXg7Ci0KLSAgLyogSWYgbmVlZGVkLCBjb21wdXRlIHRoZSB0b3RhbCBhcmMgY291bnQuCi0KLSAgICAgTm90ZSB3ZSBkb24ndCBjb21wZW5zYXRlIGZvciBvdmVyZmxvdyBpZiB0aGF0IGhhcHBlbnMhICAqLwotICBpZiAoISBhbGwpCi0gICAgewotICAgICAgdG90YWxfYXJjcyA9IDA7Ci0gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotCXRvdGFsX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OwotICAgIH0KLSAgZWxzZQotICAgIHRvdGFsX2FyY3MgPSAwOwotCi0gIHRtcF9hcmNzID0gMDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBTeW0gKnN5bTEsICpzeW0yOwotICAgICAgU3ltICpjaGlsZCwgKnBhcmVudDsKLQotICAgICAgdG1wX2FyY3MgKz0gYXJjc1tpbmRleF0tPmNvdW50OwotCi0gICAgICAvKiBJZ25vcmUgdGhpcyBhcmMgaWYgaXQncyBhbHJlYWR5IGJlZW4gcGxhY2VkLiAgKi8KLSAgICAgIGlmIChhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkKQotCWNvbnRpbnVlOwotCi0gICAgICBjaGlsZCA9IGFyY3NbaW5kZXhdLT5jaGlsZDsKLSAgICAgIHBhcmVudCA9IGFyY3NbaW5kZXhdLT5wYXJlbnQ7Ci0KLSAgICAgIC8qIElmIHdlJ3JlIG5vdCB1c2luZyBhbGwgYXJjcywgYW5kIHRoaXMgaXMgYSByYXJlbHkgdXNlZAotCSBhcmMsIHRoZW4gcHV0IGl0IG9uIHRoZSB1bnBsYWNlZF9hcmMgbGlzdC4gIFNpbWlsYXJseQotCSBpZiBib3RoIHRoZSBwYXJlbnQgYW5kIGNoaWxkIG9mIHRoaXMgYXJjIGhhdmUgYmVlbiBwbGFjZWQuICAqLwotICAgICAgaWYgKCghIGFsbCAmJiAoZG91YmxlKXRtcF9hcmNzIC8gKGRvdWJsZSl0b3RhbF9hcmNzID4gTU9TVCkKLQkgIHx8IGNoaWxkLT5oYXNfYmVlbl9wbGFjZWQgfHwgcGFyZW50LT5oYXNfYmVlbl9wbGFjZWQpCi0JewotCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgYWxsIHNsb3RzIGluIHRoZSBwYXJlbnQgYW5kIGNoaWxkIGFyZSBmdWxsLCB0aGVuIHRoZXJlIGlzbid0Ci0JIGFueXRoaW5nIHdlIGNhbiBkbyByaWdodCBub3cuICBXZSdsbCBwbGFjZSB0aGlzIGFyYyBvbiB0aGUKLQkgdW5wbGFjZWQgYXJjIGxpc3QgaW4gdGhlIGhvcGUgdGhhdCBhIGdsb2JhbCBwb3NpdGlvbmluZwotCSBhbGdvcml0aG0gY2FuIHVzZSBpdCB0byBwbGFjZSBmdW5jdGlvbiBjaGFpbnMuICAqLwotICAgICAgaWYgKHBhcmVudC0+bmV4dCAmJiBwYXJlbnQtPnByZXYgJiYgY2hpbGQtPm5leHQgJiYgY2hpbGQtPnByZXYpCi0JewotCSAgdW5wbGFjZWRfYXJjc1soKnVucGxhY2VkX2FyY19jb3VudCkrK10gPSBhcmNzW2luZGV4XTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogSWYgdGhlIHBhcmVudCBpcyB1bmF0dGFjaGVkLCB0aGVuIGZpbmQgdGhlIGNsb3Nlc3QKLQkgcGxhY2UgdG8gYXR0YWNoIGl0IG9udG8gY2hpbGQncyBjaGFpbi4gICBTaW1pbGFybHkKLQkgZm9yIHRoZSBvcHBvc2l0ZSBjYXNlLiAgKi8KLSAgICAgIGlmICghcGFyZW50LT5uZXh0ICYmICFwYXJlbnQtPnByZXYpCi0JewotCSAgaW50IG5leHRfY291bnQgPSAwOwotCSAgaW50IHByZXZfY291bnQgPSAwOwotCSAgU3ltICpwcmV2ID0gY2hpbGQ7Ci0JICBTeW0gKm5leHQgPSBjaGlsZDsKLQotCSAgLyogV2FsayB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIGNoaWxkJ3MgY2hhaW4uICAqLwotCSAgd2hpbGUgKG5leHQtPm5leHQpCi0JICAgIHsKLQkgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsKLQkgICAgICBuZXh0X2NvdW50Kys7Ci0JICAgIH0KLQotCSAgd2hpbGUgKHByZXYtPnByZXYpCi0JICAgIHsKLQkgICAgICBwcmV2ID0gcHJldi0+cHJldjsKLQkgICAgICBwcmV2X2NvdW50Kys7Ci0JICAgIH0KLQkgIAotCSAgLyogQ2hvb3NlIHRoZSBjbG9zZXN0LiAgKi8KLQkgIGNoaWxkID0gbmV4dF9jb3VudCA8IHByZXZfY291bnQgPyBuZXh0IDogcHJldjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCEgY2hpbGQtPm5leHQgJiYgIWNoaWxkLT5wcmV2KQotCXsKLQkgIGludCBuZXh0X2NvdW50ID0gMDsKLQkgIGludCBwcmV2X2NvdW50ID0gMDsKLQkgIFN5bSAqcHJldiA9IHBhcmVudDsKLQkgIFN5bSAqbmV4dCA9IHBhcmVudDsKLQotCSAgd2hpbGUgKG5leHQtPm5leHQpCi0JICAgIHsKLQkgICAgICBuZXh0ID0gbmV4dC0+bmV4dDsKLQkgICAgICBuZXh0X2NvdW50Kys7Ci0JICAgIH0KLQotCSAgd2hpbGUgKHByZXYtPnByZXYpCi0JICAgIHsKLQkgICAgICBwcmV2ID0gcHJldi0+cHJldjsKLQkgICAgICBwcmV2X2NvdW50Kys7Ci0JICAgIH0KLQotCSAgcGFyZW50ID0gcHJldl9jb3VudCA8IG5leHRfY291bnQgPyBwcmV2IDogbmV4dDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogQ291bGRuJ3QgZmluZCBhbnl3aGVyZSB0byBhdHRhY2ggdGhlIGZ1bmN0aW9ucywKLQkgICAgIHB1dCB0aGUgYXJjIG9uIHRoZSB1bnBsYWNlZCBhcmMgbGlzdC4gICovCi0JICB1bnBsYWNlZF9hcmNzWygqdW5wbGFjZWRfYXJjX2NvdW50KSsrXSA9IGFyY3NbaW5kZXhdOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgdGllIHR3byBlbmRzIHRvZ2V0aGVyLiAgKi8KLSAgICAgIHN5bTEgPSBwYXJlbnQ7Ci0gICAgICBpZiAoc3ltMS0+bmV4dCkKLQl3aGlsZSAoc3ltMS0+bmV4dCkKLQkgIHN5bTEgPSBzeW0xLT5uZXh0OwotICAgICAgZWxzZQotCXdoaWxlIChzeW0xLT5wcmV2KQotCSAgc3ltMSA9IHN5bTEtPnByZXY7Ci0KLSAgICAgIHN5bTIgPSBjaGlsZDsKLSAgICAgIGlmIChzeW0yLT5uZXh0KQotCXdoaWxlIChzeW0yLT5uZXh0KQotCSAgc3ltMiA9IHN5bTItPm5leHQ7Ci0gICAgICBlbHNlCi0Jd2hpbGUgKHN5bTItPnByZXYpCi0JICBzeW0yID0gc3ltMi0+cHJldjsKLQotICAgICAgaWYgKHN5bTEgPT0gY2hpbGQKLQkgICYmIHN5bTIgPT0gcGFyZW50KQotCXsKLQkgIC8qIFRoaXMgd291bGQgdGllIHR3byBlbmRzIHRvZ2V0aGVyLiAgKi8KLQkgIHVucGxhY2VkX2FyY3NbKCp1bnBsYWNlZF9hcmNfY291bnQpKytdID0gYXJjc1tpbmRleF07Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChwYXJlbnQtPm5leHQpCi0JewotCSAgLyogTXVzdCBhdHRhY2ggdG8gdGhlIHBhcmVudCdzIHByZXYgZmllbGQuICAqLwotCSAgaWYgKCEgY2hpbGQtPm5leHQpCi0JICAgIHsKLQkgICAgICAvKiBwYXJlbnQtcHJldiBhbmQgY2hpbGQtbmV4dCAqLwotCSAgICAgIHBhcmVudC0+cHJldiA9IGNoaWxkOwotCSAgICAgIGNoaWxkLT5uZXh0ID0gcGFyZW50OwotCSAgICAgIGFyY3NbaW5kZXhdLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAocGFyZW50LT5wcmV2KQotCXsKLQkgIC8qIE11c3QgYXR0YWNoIHRvIHRoZSBwYXJlbnQncyBuZXh0IGZpZWxkLiAgKi8KLQkgIGlmICghIGNoaWxkLT5wcmV2KQotCSAgICB7Ci0JICAgICAgLyogcGFyZW50LW5leHQgYW5kIGNoaWxkLXByZXYgKi8KLQkgICAgICBwYXJlbnQtPm5leHQgPSBjaGlsZDsKLQkgICAgICBjaGlsZC0+cHJldiA9IHBhcmVudDsKLQkgICAgICBhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBDYW4gYXR0YWNoIHRvIGVpdGhlciBmaWVsZCBpbiB0aGUgcGFyZW50LCBkZXBlbmRzCi0JICAgICBvbiB3aGVyZSB3ZSd2ZSBnb3Qgc3BhY2UgaW4gdGhlIGNoaWxkLiAgKi8KLQkgIGlmIChjaGlsZC0+cHJldikKLQkgICAgewotCSAgICAgIC8qIHBhcmVudC1wcmV2IGFuZCBjaGlsZC1uZXh0ICovCi0JICAgICAgcGFyZW50LT5wcmV2ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPm5leHQgPSBwYXJlbnQ7Ci0JICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHBhcmVudC1uZXh0IGFuZCBjaGlsZC1wcmV2ICovCi0JICAgICAgcGFyZW50LT5uZXh0ID0gY2hpbGQ7Ci0JICAgICAgY2hpbGQtPnByZXYgPSBwYXJlbnQ7Ci0JICAgICAgYXJjc1tpbmRleF0tPmhhc19iZWVuX3BsYWNlZCA9IDE7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIER1bXAgdGhlIGNoYWlucyBvZiBmdW5jdGlvbnMgd2UndmUgbWFkZS4gICovCi0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWFyY3M7IGluZGV4KyspCi0gICAgewotICAgICAgU3ltICpzeW07Ci0gICAgICBpZiAoYXJjc1tpbmRleF0tPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkCi0JICB8fCBhcmNzW2luZGV4XS0+Y2hpbGQtPmhhc19iZWVuX3BsYWNlZCkKLQljb250aW51ZTsKLQotICAgICAgc3ltID0gYXJjc1tpbmRleF0tPnBhcmVudDsKLQotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXNuJ3QgYXR0YWNoZWQgdG8gYW55IG90aGVyCi0JIHN5bWJvbHMsIHRoZW4gd2UndmUgZ290IGEgcmFyZWx5IHVzZWQgYXJjLgotCi0JIFNraXAgaXQgZm9yIG5vdywgd2UnbGwgZGVhbCB3aXRoIHRoZW0gbGF0ZXIuICAqLwotICAgICAgaWYgKHN5bS0+bmV4dCA9PSBOVUxMCi0JICAmJiBzeW0tPnByZXYgPT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgLyogR2V0IHRvIHRoZSBzdGFydCBvZiB0aGlzIGNoYWluLiAgKi8KLSAgICAgIHdoaWxlIChzeW0tPnByZXYpCi0Jc3ltID0gc3ltLT5wcmV2OwotCi0gICAgICB3aGlsZSAoc3ltKQotCXsKLQkgIC8qIE1hcmsgaXQgYXMgcGxhY2VkLiAgKi8KLQkgIHN5bS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLQkgIHByaW50ZiAoIiVzXG4iLCBzeW0tPm5hbWUpOwotCSAgc3ltID0gc3ltLT5uZXh0OwotCX0KLSAgICB9Ci0KLSAgLyogSWYgd2Ugd2FudCB0byBwbGFjZSBhbGwgdGhlIGFyY3MsIHRoZW4gb3V0cHV0IHRob3NlIHdoaWNoIHdlcmVuJ3QKLSAgICAgcGxhY2VkIGJ5IHRoZSBtYWluIGFsZ29yaXRobS4gICovCi0gIGlmIChhbGwpCi0gICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbnVtYXJjczsgaW5kZXgrKykKLSAgICAgIHsKLQlTeW0gKnN5bTsKLQlpZiAoYXJjc1tpbmRleF0tPnBhcmVudC0+aGFzX2JlZW5fcGxhY2VkCi0JICAgIHx8IGFyY3NbaW5kZXhdLT5jaGlsZC0+aGFzX2JlZW5fcGxhY2VkKQotCSAgY29udGludWU7Ci0KLQlzeW0gPSBhcmNzW2luZGV4XS0+cGFyZW50OwotCi0Jc3ltLT5oYXNfYmVlbl9wbGFjZWQgPSAxOwotCXByaW50ZiAoIiVzXG4iLCBzeW0tPm5hbWUpOwotICAgICAgfQotfQotCi0vKiBQcmludCBhIHN1Z2dlc3RlZCAubyBvcmRlcmluZyBmb3IgZmlsZXMgb24gYSBsaW5rIGxpbmUgYmFzZWQKLSAgIG9uIHByb2ZpbGluZyBpbmZvcm1hdGlvbi4gIFRoaXMgdXNlcyB0aGUgZnVuY3Rpb24gcGxhY2VtZW50Ci0gICBjb2RlIGZvciB0aGUgYnVsayBvZiBpdHMgd29yay4gICovCi0KLXN0cnVjdCBmdW5jdGlvbl9tYXAgewotICBjaGFyICpmdW5jdGlvbl9uYW1lOwotICBjaGFyICpmaWxlX25hbWU7Ci19OwotCi12b2lkCi1ERUZVTl9WT0lEIChjZ19wcmludF9maWxlX29yZGVyaW5nKQotewotICB1bnNpZ25lZCBsb25nIHNjcmF0Y2hfYXJjX2NvdW50LCBpbmRleDsKLSAgQXJjICoqc2NyYXRjaF9hcmNzOwotICBleHRlcm4gc3RydWN0IGZ1bmN0aW9uX21hcCAqc3ltYm9sX21hcDsKLSAgZXh0ZXJuIHVuc2lnbmVkIGludCBzeW1ib2xfbWFwX2NvdW50OwotICBjaGFyICpsYXN0OwotCi0gIHNjcmF0Y2hfYXJjX2NvdW50ID0gMDsKLQotICBzY3JhdGNoX2FyY3MgPSAoQXJjICoqKSB4bWFsbG9jIChudW1hcmNzICogc2l6ZW9mIChBcmMgKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBudW1hcmNzOyBpbmRleCsrKQotICAgIHsKLSAgICAgIGlmICghIGFyY3NbaW5kZXhdLT5wYXJlbnQtPm1hcHBlZAotCSAgfHwgISBhcmNzW2luZGV4XS0+Y2hpbGQtPm1hcHBlZCkKLQlhcmNzW2luZGV4XS0+aGFzX2JlZW5fcGxhY2VkID0gMTsKLSAgICB9Ci0KLSAgb3JkZXJfYW5kX2R1bXBfZnVuY3Rpb25zX2J5X2FyY3MgKGFyY3MsIG51bWFyY3MsIDAsCi0JCQkJICAgIHNjcmF0Y2hfYXJjcywgJnNjcmF0Y2hfYXJjX2NvdW50KTsKLQotICAvKiBPdXRwdXQgLm8ncyBub3QgaGFuZGxlZCBieSB0aGUgbWFpbiBwbGFjZW1lbnQgYWxnb3JpdGhtLiAgKi8KLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgaW5kZXgrKykKLSAgICB7Ci0gICAgICBpZiAoc3ltdGFiLmJhc2VbaW5kZXhdLm1hcHBlZAotCSAgJiYgISBzeW10YWIuYmFzZVtpbmRleF0uaGFzX2JlZW5fcGxhY2VkKQotCXByaW50ZiAoIiVzXG4iLCBzeW10YWIuYmFzZVtpbmRleF0ubmFtZSk7Ci0gICAgfQotCi0gIC8qIE5vdyBvdXRwdXQgYW55IC5vJ3MgdGhhdCBkaWRuJ3QgaGF2ZSBhbnkgdGV4dCBzeW1ib2xzLiAgKi8KLSAgbGFzdCA9IE5VTEw7Ci0gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bWJvbF9tYXBfY291bnQ7IGluZGV4KyspCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGluZGV4MjsKLQotICAgICAgLyogRG9uJ3QgYm90aGVyIHNlYXJjaGluZyBpZiB0aGlzIHN5bWJvbCBpcyB0aGUKLQkgc2FtZSBhcyB0aGUgcHJldmlvdXMgb25lLiAgKi8KLSAgICAgIGlmIChsYXN0ICYmICFzdHJjbXAgKGxhc3QsIHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZSkpCi0JY29udGludWU7Ci0KLSAgICAgIGZvciAoaW5kZXgyID0gMDsgaW5kZXgyIDwgc3ltdGFiLmxlbjsgaW5kZXgyKyspCi0JewotCSAgaWYgKCEgc3ltdGFiLmJhc2VbaW5kZXgyXS5tYXBwZWQpCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAoIXN0cmNtcCAoc3ltdGFiLmJhc2VbaW5kZXgyXS5uYW1lLCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpKQotCSAgICBicmVhazsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGRpZG4ndCBmaW5kIGl0IGluIHRoZSBzeW1ib2wgdGFibGUsIHRoZW4gaXQgbXVzdCBiZSBhIC5vCi0JIHdpdGggbm8gdGV4dCBzeW1ib2xzLiAgT3V0cHV0IGl0IGxhc3QuICAqLwotICAgICAgaWYgKGluZGV4MiA9PSBzeW10YWIubGVuKQotCXByaW50ZiAoIiVzXG4iLCBzeW1ib2xfbWFwW2luZGV4XS5maWxlX25hbWUpOwotICAgICAgbGFzdCA9IHN5bWJvbF9tYXBbaW5kZXhdLmZpbGVfbmFtZTsKLSAgICB9IAotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY2dfcHJpbnQuaCBiL2dwcm9mL2NnX3ByaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MmM0YWEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY2dfcHJpbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSNpZm5kZWYgY2dfcHJpbnRfaAotI2RlZmluZSBjZ19wcmludF9oCi0KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1leHRlcm4gZG91YmxlIHByaW50X3RpbWU7CS8qIHRvdGFsIG9mIHRpbWUgYmVpbmcgcHJpbnRlZCAqLwotCi1leHRlcm4gdm9pZCBjZ19wcmludCBQQVJBTVMgKChTeW0gKiogY2cpKTsKLWV4dGVybiB2b2lkIGNnX3ByaW50X2luZGV4IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgY2dfcHJpbnRfZnVuY3Rpb25fb3JkZXJpbmcgUEFSQU1TICgodm9pZCkpOwotCi0jZW5kaWYgLyogY2dfcHJpbnRfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlIGIvZ3Byb2YvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1ZmY1MTM3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1ubHMgICAgICAgICAgIGRvIG5vdCB1c2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlciIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9Z3Byb2YuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1OTA6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjExOiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2Mjk6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjY0OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcxNzogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NzQ6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWdwcm9mCi0KLVZFUlNJT049Mi45LjQKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MjA6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODMzOiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0NjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg1OTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4NzI6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NTg6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk4ODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTAxODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwNjk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMDE6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDExMTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNDM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQ4OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTU3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExNzY6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZ251LWxkIG9yIC0td2l0aG91dC1nbnUtbGQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2dudV9sZCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9nbnVfbGQiCi0gIHRlc3QgIiR3aXRodmFsIiA9IG5vIHx8IHdpdGhfZ251X2xkPXllcwotZWxzZQotICB3aXRoX2dudV9sZD1ubwotZmkKLQotYWNfcHJvZz1sZAotaWYgdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIGlmIGdjYyAtcHJpbnQtcHJvZy1uYW1lPWxkIGdpdmVzIGEgcGF0aC4KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjE5OiBjaGVja2luZyBmb3IgbGQgdXNlZCBieSBHQ0MiID4mNQotICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gIGNhc2UgIiRhY19wcm9nIiBpbgotICAgICMgQWNjZXB0IGFic29sdXRlIHBhdGhzLgotICAgIC8qIHwgW0EtWmEtel06W1xcL10qKQotICAgICAgcmVfZGlyZWx0PScvW14vXVteL10qL1wuXC4vJwotICAgICAgIyBDYW5vbmljYWxpemUgdGhlIHBhdGggb2YgbGQKLSAgICAgIGFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAncyVcXFxcJS8lZydgCi0gICAgICB3aGlsZSBlY2hvICRhY19wcm9nIHwgZ3JlcCAiJHJlX2RpcmVsdCIgPiAvZGV2L251bGwgMj4mMTsgZG8KLQlhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgInMlJHJlX2RpcmVsdCUvJSJgCi0gICAgICBkb25lCi0gICAgICB0ZXN0IC16ICIkTEQiICYmIExEPSIkYWNfcHJvZyIKLSAgICAgIDs7Ci0gICIiKQotICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmVuJ3QgdXNpbmcgR0NDLgotICAgIGFjX3Byb2c9bGQKLSAgICA7OwotICAqKQotICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICB3aXRoX2dudV9sZD11bmtub3duCi0gICAgOzsKLSAgZXNhYwotZWxpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNDM6IGNoZWNraW5nIGZvciBHTlUgbGQiID4mNQotZWxzZQotICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI0NjogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0xEJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpCi1maQotCi1MRD0iJGFjX2N2X3BhdGhfTEQiCi1pZiB0ZXN0IC1uICIkTEQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotdGVzdCAteiAiJExEIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgdGhlIGxpbmtlciAoJExEKSBpcyBHTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyODI6IGNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2dudV9sZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nbnVfbGQiIDE+JjYKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyOTg6IGNoZWNraW5nIGZvciBCU0QtY29tcGF0aWJsZSBubSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9OTScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmkKLWZpCi0KLU5NPSIkYWNfY3ZfcGF0aF9OTSIKLWVjaG8gIiRhY190IiIkTk0iIDE+JjYKLQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzM2OiBjaGVja2luZyBjb21tYW5kIHRvIHBhcnNlICROTSBvdXRwdXQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZXNlIGFyZSBzYW5lIGRlZmF1bHRzIHRoYXQgd29yayBvbiBhdCBsZWFzdCBhIGZldyBvbGQgc3lzdGVtcy4KLSMge1RoZXkgY29tZSBmcm9tIFVsdHJpeC4gIFdoYXQgY291bGQgYmUgb2xkZXIgdGhhbiBVbHRyaXg/ISEgOyl9Ci0KLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKiAJXCgkYWNfc3ltY29kZVwpIAkgCSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzk5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgCi0gICAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDAzOiBcIiROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdFwiKSAxPiY1OyAoZXZhbCAkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpIDI+JjU7IH0gJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17Ci1FT0YKLQlzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQljYXQgPDxcRU9GID4+IGNvbmZ0ZXN0LmMKLSAgezAsIChsdF9wdHJfdCkgMH0KLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1FT0YKLQkgICMgTm93IHRyeSBsaW5raW5nIHRoZSB0d28gZmlsZXMuCi0JICBtdiBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0bS4kYWNfb2JqZXh0Ci0JICBhY19zYXZlX0xJQlM9IiRMSUJTIgotCSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0JICBMSUJTPSJjb25mdGVzdG0uJGFjX29iamV4dCIKLQkgIENGTEFHUz0iJENGTEFHUyRub19idWlsdGluX2ZsYWciCi0JICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0NTU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotCSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLQkgIGZpCi0JICBMSUJTPSIkYWNfc2F2ZV9MSUJTIgotCSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRhY19ubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgICBjYXQgY29uZnRlc3QuYyA+JjUKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotCi0gICMgRG8gbm90IHVzZSB0aGUgZ2xvYmFsX3N5bWJvbF9waXBlIHVubGVzcyBpdCB3b3Jrcy4KLSAgaWYgdGVzdCAiJGFjX3BpcGVfd29ya3MiID0geWVzOyB0aGVuCi0gICAgaWYgdGVzdCB4IiRhY19zeW1wcmZ4IiA9IHgiXyI7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLSAgICBmaQotICAgIGJyZWFrCi0gIGVsc2UKLSAgICBhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotCi1maQotCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotZWNobyAiJGFjX3QiIiRhY19yZXN1bHQiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MDE6IGNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MTA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxMzogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBmaQotICBlbHNlCi0gICAgZWNobyAiY29uZmlndXJlOiBjYW5ub3QgcnVuICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIiA+JjUKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotcm0gLXJmIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSIgMT4mNgotVVNFX1NZTUJPTF9VTkRFUlNDT1JFPSR7YWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vfQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTM5OiBjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xOX1MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBybSAtZiBjb25mdGVzdGRhdGEKLWlmIGxuIC1zIFggY29uZnRlc3RkYXRhIDI+L2Rldi9udWxsCi10aGVuCi0gIHJtIC1mIGNvbmZ0ZXN0ZGF0YQotICBhY19jdl9wcm9nX0xOX1M9ImxuIC1zIgotZWxzZQotICBhY19jdl9wcm9nX0xOX1M9bG4KLWZpCi1maQotTE5fUz0iJGFjX2N2X3Byb2dfTE5fUyIKLWlmIHRlc3QgIiRhY19jdl9wcm9nX0xOX1MiID0gImxuIC1zIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0KLSMgQ2hlY2sgZm9yIGFueSBzcGVjaWFsIGZsYWdzIHRvIHBhc3MgdG8gbHRjb25maWcuCi1saWJ0b29sX2ZsYWdzPSItLWNhY2hlLWZpbGU9JGNhY2hlX2ZpbGUiCi10ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc2hhcmVkIgotdGVzdCAiJGVuYWJsZV9zdGF0aWMiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXN0YXRpYyIKLXRlc3QgIiRlbmFibGVfZmFzdF9pbnN0YWxsIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwiCi10ZXN0ICIkbHRfZGxvcGVuIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWVuYWJsZS1kbG9wZW4iCi10ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXNpbGVudCIKLXRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdjYyIKLXRlc3QgIiRhY19jdl9wcm9nX2dudV9sZCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS13aXRoLWdudS1sZCIKLQotIyBTb21lIGZsYWdzIG5lZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgY29tcGlsZXIgb3IgbGlua2VyIGZvciBnb29kCi0jIGxpYnRvb2wgc3VwcG9ydC4KLWNhc2UgIiRob3N0IiBpbgotKi0qLWlyaXg2KikKLSAgIyBGaW5kIG91dCB3aGljaCBBQkkgd2UgYXJlIHVzaW5nLgotICBlY2hvICcjbGluZSAxNTgxICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTgyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICAgY2FzZSAiYC91c3IvYmluL2ZpbGUgY29uZnRlc3Qub2AiIGluCi0gICAgKjMyLWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTMyIgotICAgICAgOzsKLSAgICAqTjMyKikKLSAgICAgIExEPSIke0xELWxkfSAtbjMyIgotICAgICAgOzsKLSAgICAqNjQtYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtNjQiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICA7OwotCi0qLSotc2NvMy4ydjUqKQotICAjIE9uIFNDTyBPcGVuU2VydmVyIDUsIHdlIG5lZWQgLWJlbGYgdG8gZ2V0IGZ1bGwtZmVhdHVyZWQgYmluYXJpZXMuCi0gIFNBVkVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9IiRDRkxBR1MgLWJlbGYiCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MDM6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGYiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2x0X2N2X2NjX25lZWRzX2JlbGYnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjA4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjE1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBsdF9jdl9jY19uZWVkc19iZWxmPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2NjX25lZWRzX2JlbGYiIDE+JjYKLSAgaWYgdGVzdCB4IiRsdF9jdl9jY19uZWVkc19iZWxmIiAhPSB4InllcyI7IHRoZW4KLSAgICAjIHRoaXMgaXMgcHJvYmFibHkgZ2NjIDIuOC4wLCBlZ2NzIDEuMCBvciBuZXdlcjsgbm8gbmVlZCBmb3IgLWJlbGYKLSAgICBDRkxBR1M9IiRTQVZFX0NGTEFHUyIKLSAgZmkKLSAgOzsKLQotKi0qLWN5Z3dpbiopCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1kbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTYzODogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iJHthY190b29sX3ByZWZpeH1kbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJkbGx0b29sIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBkbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9ImRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiICYmIGFjX2N2X3Byb2dfRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBETExUT09MPSJmYWxzZSIKLWZpCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcwNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSIke2FjX3Rvb2xfcHJlZml4fWFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBhczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzM3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9ImFzIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyIgJiYgYWNfY3ZfcHJvZ19BUz0iZmFsc2UiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgQVM9ImZhbHNlIgotZmkKLWZpCi0KLQotICA7OwotCi1lc2FjCi0KLSMgZW5hYmxlIHRoZSAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHN3aXRjaAotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbGlidG9vbC1sb2NrIG9yIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbGlidG9vbF9sb2NrK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9saWJ0b29sX2xvY2siCi0gIG5lZWRfbG9ja3M9JGVuYWJsZXZhbAotZWxzZQotICBuZWVkX2xvY2tzPXllcwotZmkKLQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLQotCi0jIFNhdmUgY2FjaGUsIHNvIHRoYXQgbHRjb25maWcgY2FuIGxvYWQgaXQKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLQotIyBBY3R1YWxseSBjb25maWd1cmUgbGlidG9vbC4gIGFjX2F1eF9kaXIgaXMgd2hlcmUgaW5zdGFsbC1zaCBpcyBmb3VuZC4KLUNDPSIkQ0MiIENGTEFHUz0iJENGTEFHUyIgQ1BQRkxBR1M9IiRDUFBGTEFHUyIgXAotTEQ9IiRMRCIgTk09IiROTSIgUkFOTElCPSIkUkFOTElCIiBMTl9TPSIkTE5fUyIgXAotRExMVE9PTD0iJERMTFRPT0wiIEFTPSIkQVMiIFwKLSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19hdXhfZGlyL2x0Y29uZmlnIC0tbm8tcmVleGVjIFwKLSRsaWJ0b29sX2ZsYWdzIC0tbm8tdmVyaWZ5ICRhY19hdXhfZGlyL2x0bWFpbi5zaCAkaG9zdCBcCi18fCB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxpYnRvb2wgY29uZmlndXJlIGZhaWxlZCIgMT4mMjsgZXhpdCAxOyB9Ci0KLSMgUmVsb2FkIGNhY2hlLCB0aGF0IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQgYnkgbHRjb25maWcKLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi0KLSMgVGhpcyBjYW4gYmUgdXNlZCB0byByZWJ1aWxkIGxpYnRvb2wgd2hlbiBuZWVkZWQKLUxJQlRPT0xfREVQUz0iJGFjX2F1eF9kaXIvbHRjb25maWcgJGFjX2F1eF9kaXIvbHRtYWluLnNoIgotCi0jIEFsd2F5cyB1c2Ugb3VyIG93biBsaWJ0b29sLgotTElCVE9PTD0nJChTSEVMTCkgJCh0b3BfYnVpbGRkaXIpL2xpYnRvb2wnCi0KLSMgUmVkaXJlY3QgdGhlIGNvbmZpZy5sb2cgb3V0cHV0IGFnYWluLCBzbyB0aGF0IHRoZSBsdGNvbmZpZyBsb2cgaXMgbm90Ci0jIGNsb2JiZXJlZCBieSB0aGUgbmV4dCBtZXNzYWdlLgotZXhlYyA1Pj4uL2NvbmZpZy5sb2cKLQotCi0KLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3NTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkwNTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NTY6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0gOzsKLSAgICBlc2FjCi0gIGZpCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5ODg6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIgPiY1Ci0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDwgRU9GCi0KLSNsaW5lIDE5OTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY193b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY193b3JrcyA9IG5vOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMzA6IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiA+JjUKLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19jcm9zcyIgMT4mNgotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDM1OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDQ0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgYWNfY3ZfcHJvZ19nY2M9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfZ2NjPW5vCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2djYyIgMT4mNgotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1lbHNlCi0gIEdDQz0KLWZpCi0KLWFjX3Rlc3RfQ0ZMQUdTPSIke0NGTEFHUytzZXR9IgotYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi1DRkxBR1M9Ci1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNjM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19jY19nJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgZWNobyAndm9pZCBmKCl7fScgPiBjb25mdGVzdC5jCi1pZiB0ZXN0IC16ICJgJHtDQy1jY30gLWcgLWMgY29uZnRlc3QuYyAyPiYxYCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY19nPXllcwotZWxzZQotICBhY19jdl9wcm9nX2NjX2c9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2ciIDE+JjYKLWlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgQ0ZMQUdTPSIkYWNfc2F2ZV9DRkxBR1MiCi1lbGlmIHRlc3QgJGFjX2N2X3Byb2dfY2NfZyA9IHllczsgdGhlbgotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLWcgLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPSItZyIKLSAgZmkKLWVsc2UKLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0KLSAgZmkKLWZpCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjEwNjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE2MDogY2hlY2tpbmcgZm9yIFBPU0lYaXplZCBJU0MiID4mNQotaWYgdGVzdCAtZCAvZXRjL2NvbmYva2NvbmZpZy5kICYmCi0gIGdyZXAgX1BPU0lYX1ZFUlNJT04gL3Vzci9pbmNsdWRlL3N5cy91bmlzdGQuaCA+L2Rldi9udWxsIDI+JjEKLXRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBJU0M9eWVzICMgSWYgbGF0ZXIgdGVzdHMgd2FudCB0byBjaGVjayBmb3IgSVNDLgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgX1BPU0lYX1NPVVJDRSAxCi1FT0YKLQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENDPSIkQ0MgLXBvc2l4IgotICBlbHNlCi0gICAgQ0M9IiRDQyAtWHAiCi0gIGZpCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotICBJU0M9Ci1maQotCi0KLUFMTF9MSU5HVUFTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxODM6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKLSMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCi1pZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgotICBDUFA9Ci1maQotaWYgdGVzdCAteiAiJENQUCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NQUCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgIyBUaGlzIG11c3QgYmUgaW4gZG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZSBxdW90ZXMsIGJlY2F1c2UgQ1BQIG1heSBnZXQKLSAgIyBzdWJzdGl0dXRlZCBpbnRvIHRoZSBNYWtlZmlsZSBhbmQgIiR7Q0MtY2N9IiB3aWxsIGNvbmZ1c2UgbWFrZS4KLSAgQ1BQPSIke0NDLWNjfSAtRSIKLSAgIyBPbiB0aGUgTmVYVCwgY2MgLUUgcnVucyB0aGUgY29kZSB0aHJvdWdoIHRoZSBjb21waWxlcidzIHBhcnNlciwKLSAgIyBub3QganVzdCB0aHJvdWdoIGNwcC4KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIwNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIxNSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIyMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjIzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIzODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI2MzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjI3NjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjkzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgOgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KLWlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIDoKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjMzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzQzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzNjc6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM3MiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNDIxOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NDI6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjQ0OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NTY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNDgyOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDg3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKW9mZl90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfb2ZmX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfb2ZmX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgb2ZmX3QgbG9uZwotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzaXplX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1MTU6IGNoZWNraW5nIGZvciBzaXplX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfc2l6ZV90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUyMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlzaXplX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX3NpemVfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3NpemVfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9zaXplX3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkCi1FT0YKLQotZmkKLQotIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU1MDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU2MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1ODM6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjU4OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjE2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY0ODogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjc4OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjgzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3MDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjczMzogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc2MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzg1OiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc5NTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZvciBhY19mdW5jIGluIGdldHBhZ2VzaXplCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyODI0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI4NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Nzc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1tYXAiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4ODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0vKiBUaGFua3MgdG8gTWlrZSBIYWVydGVsIGFuZCBKaW0gQXZlcmEgZm9yIHRoaXMgdGVzdC4KLSAgIEhlcmUgaXMgYSBtYXRyaXggb2YgbW1hcCBwb3NzaWJpbGl0aWVzOgotCW1tYXAgcHJpdmF0ZSBub3QgZml4ZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLQltbWFwIHNoYXJlZCBub3QgZml4ZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0gICBGb3IgcHJpdmF0ZSBtYXBwaW5ncywgd2Ugc2hvdWxkIHZlcmlmeSB0aGF0IGNoYW5nZXMgY2Fubm90IGJlIHJlYWQoKQotICAgYmFjayBmcm9tIHRoZSBmaWxlLCBub3IgbW1hcCdzIGJhY2sgZnJvbSB0aGUgZmlsZSBhdCBhIGRpZmZlcmVudAotICAgYWRkcmVzcy4gIChUaGVyZSBoYXZlIGJlZW4gc3lzdGVtcyB3aGVyZSBwcml2YXRlIHdhcyBub3QgY29ycmVjdGx5Ci0gICBpbXBsZW1lbnRlZCBsaWtlIHRoZSBpbmZhbW91cyBpMzg2IHN2cjQuMCwgYW5kIHN5c3RlbXMgd2hlcmUgdGhlCi0gICBWTSBwYWdlIGNhY2hlIHdhcyBub3QgY29oZXJlbnQgd2l0aCB0aGUgZmlsZXN5c3RlbSBidWZmZXIgY2FjaGUKLSAgIGxpa2UgZWFybHkgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgcG9zc2libHkgY29udGVtcG9yYXJ5IE5ldEJTRC4pCi0gICBGb3Igc2hhcmVkIG1hcHBpbmdzLCB3ZSBzaG91bGQgY29udmVyc2VseSB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGdldAotICAgcHJvcG9nYXRlZCBiYWNrIHRvIGFsbCB0aGUgcGxhY2VzIHRoZXkncmUgc3VwcG9zZWQgdG8gYmUuCi0KLSAgIEdyZXAgd2FudHMgcHJpdmF0ZSBmaXhlZCBhbHJlYWR5IG1hcHBlZC4KLSAgIFRoZSBtYWluIHRoaW5ncyBncmVwIG5lZWRzIHRvIGtub3cgYWJvdXQgbW1hcCBhcmU6Ci0gICAqIGRvZXMgaXQgZXhpc3QgYW5kIGlzIGl0IHNhZmUgdG8gd3JpdGUgaW50byB0aGUgbW1hcCdkIGFyZWEKLSAgICogaG93IHRvIHVzZSBpdCAoQlNEIHZhcmlhbnRzKSAgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLS8qIFRoaXMgbWVzcyB3YXMgY29waWVkIGZyb20gdGhlIEdOVSBnZXRwYWdlc2l6ZS5oLiAgKi8KLSNpZm5kZWYgSEFWRV9HRVRQQUdFU0laRQotIyBpZmRlZiBIQVZFX1VOSVNURF9ICi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSMgZW5kaWYKLQotLyogQXNzdW1lIHRoYXQgYWxsIHN5c3RlbXMgdGhhdCBjYW4gcnVuIGNvbmZpZ3VyZSBoYXZlIHN5cy9wYXJhbS5oLiAgKi8KLSMgaWZuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgIGRlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKLSMgZW5kaWYKLQotIyBpZmRlZiBfU0NfUEFHRVNJWkUKLSMgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIHN5c2NvbmYoX1NDX1BBR0VTSVpFKQotIyBlbHNlIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotIyAgaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotIyAgIGlmZGVmIEVYRUNfUEFHRVNJWkUKLSMgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgRVhFQ19QQUdFU0laRQotIyAgIGVsc2UgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgICBpZmRlZiBOQlBHCi0jICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBHICogQ0xTSVpFCi0jICAgICBpZm5kZWYgQ0xTSVpFCi0jICAgICAgZGVmaW5lIENMU0laRSAxCi0jICAgICBlbmRpZiAvKiBubyBDTFNJWkUgKi8KLSMgICAgZWxzZSAvKiBubyBOQlBHICovCi0jICAgICBpZmRlZiBOQlBDCi0jICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQQwotIyAgICAgZWxzZSAvKiBubyBOQlBDICovCi0jICAgICAgaWZkZWYgUEFHRVNJWkUKLSMgICAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgUEFHRVNJWkUKLSMgICAgICBlbmRpZiAvKiBQQUdFU0laRSAqLwotIyAgICAgZW5kaWYgLyogbm8gTkJQQyAqLwotIyAgICBlbmRpZiAvKiBubyBOQlBHICovCi0jICAgZW5kaWYgLyogbm8gRVhFQ19QQUdFU0laRSAqLwotIyAgZWxzZSAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgODE5MgkvKiBwdW50IHRvdGFsbHkgKi8KLSMgIGVuZGlmIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgZW5kaWYgLyogbm8gX1NDX1BBR0VTSVpFICovCi0KLSNlbmRpZiAvKiBubyBIQVZFX0dFVFBBR0VTSVpFICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7IHZvaWQgKm1hbGxvYyh1bnNpZ25lZCk7IH0KLSNlbHNlCi1jaGFyICptYWxsb2MoKTsKLSNlbmRpZgotCi1pbnQKLW1haW4oKQotewotCWNoYXIgKmRhdGEsICpkYXRhMiwgKmRhdGEzOwotCWludCBpLCBwYWdlc2l6ZTsKLQlpbnQgZmQ7Ci0KLQlwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7Ci0KLQkvKgotCSAqIEZpcnN0LCBtYWtlIGEgZmlsZSB3aXRoIHNvbWUga25vd24gZ2FyYmFnZSBpbiBpdC4KLQkgKi8KLQlkYXRhID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YSArIGkpID0gcmFuZCgpOwotCXVtYXNrKDApOwotCWZkID0gY3JlYXQoImNvbmZ0ZXN0bW1hcCIsIDA2MDApOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JaWYgKHdyaXRlKGZkLCBkYXRhLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCi0JLyoKLQkgKiBOZXh0LCB0cnkgdG8gbW1hcCB0aGUgZmlsZSBhdCBhIGZpeGVkIGFkZHJlc3Mgd2hpY2gKLQkgKiBhbHJlYWR5IGhhcyBzb21ldGhpbmcgZWxzZSBhbGxvY2F0ZWQgYXQgaXQuICBJZiB3ZSBjYW4sCi0JICogYWxzbyBtYWtlIHN1cmUgdGhhdCB3ZSBzZWUgdGhlIHNhbWUgZ2FyYmFnZS4KLQkgKi8KLQlmZCA9IG9wZW4oImNvbmZ0ZXN0bW1hcCIsIE9fUkRXUik7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlkYXRhMiA9IG1hbGxvYygyICogcGFnZXNpemUpOwotCWlmICghZGF0YTIpCi0JCWV4aXQoMSk7Ci0JZGF0YTIgKz0gKHBhZ2VzaXplIC0gKChpbnQpIGRhdGEyICYgKHBhZ2VzaXplIC0gMSkpKSAmIChwYWdlc2l6ZSAtIDEpOwotCWlmIChkYXRhMiAhPSBtbWFwKGRhdGEyLCBwYWdlc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKLQkgICAgTUFQX1BSSVZBVEUgfCBNQVBfRklYRUQsIGZkLCAwTCkpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEyICsgaSkpCi0JCQlleGl0KDEpOwotCi0JLyoKLQkgKiBGaW5hbGx5LCBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWQgYXJlYQotCSAqIGRvIG5vdCBwZXJjb2xhdGUgYmFjayB0byB0aGUgZmlsZSBhcyBzZWVuIGJ5IHJlYWQoKS4KLQkgKiAoVGhpcyBpcyBhIGJ1ZyBvbiBzb21lIHZhcmlhbnRzIG9mIGkzODYgc3ZyNC4wLikKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhMiArIGkpID0gKihkYXRhMiArIGkpICsgMTsKLQlkYXRhMyA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMykKLQkJZXhpdCgxKTsKLQlpZiAocmVhZChmZCwgZGF0YTMsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTMgKyBpKSkKLQkJCWV4aXQoMSk7Ci0JY2xvc2UoZmQpOwotCXVubGluaygiY29uZnRlc3RtbWFwIik7Ci0JZXhpdCgwKTsKLX0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMwMjU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9NTUFQIDEKLUVPRgotCi1maQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgIGZvciBhY19oZHIgaW4gYXJnei5oIGxpbWl0cy5oIGxvY2FsZS5oIG5sX3R5cGVzLmggbWFsbG9jLmggc3RyaW5nLmggXAotdW5pc3RkLmggdmFsdWVzLmggc3lzL3BhcmFtLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDUzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA2MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZvciBhY19mdW5jIGluIGdldGN3ZCBtdW5tYXAgcHV0ZW52IHNldGVudiBzZXRsb2NhbGUgc3RyY2hyIHN0cmNhc2VjbXAgXAotX19hcmd6X2NvdW50IF9fYXJnel9zdHJpbmdpZnkgX19hcmd6X25leHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwOTM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwOTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzEyMTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5K3NldH0iICE9ICJzZXQiOyB0aGVuCi0gICAgIGZvciBhY19mdW5jIGluIHN0cGNweQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzE1MDogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE1NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1RQQ1BZIDEKLUVPRgotCi0gICBmaQotCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyMTI6IGNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYW1fY3ZfdmFsX0xDX01FU1NBR0VTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzIxNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiBMQ19NRVNTQUdFUwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyIgMT4mNgotICAgIGlmIHRlc3QgJGFtX2N2X3ZhbF9MQ19NRVNTQUdFUyA9IHllczsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTENfTUVTU0FHRVMgMQotRU9GCi0KLSAgICBmaQotICBmaQotICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMjQ1OiBjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbmxzIG9yIC0tZGlzYWJsZS1ubHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbmxzK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9ubHMiCi0gIFVTRV9OTFM9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTkxTPXllcwotZmkKLQotICAgIGVjaG8gIiRhY190IiIkVVNFX05MUyIgMT4mNgotICAgIAotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgICAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEVOQUJMRV9OTFMgMQotRU9GCi0KLSAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyNjU6IGNoZWNraW5nIHdoZXRoZXIgaW5jbHVkZWQgZ2V0dGV4dCBpcyByZXF1ZXN0ZWQiID4mNQotICAgICAgIyBDaGVjayB3aGV0aGVyIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IG9yIC0td2l0aG91dC1pbmNsdWRlZC1nZXR0ZXh0IHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9pbmNsdWRlZF9nZXR0ZXh0K3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX2luY2x1ZGVkX2dldHRleHQiCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwKLWVsc2UKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubwotZmkKLQotICAgICAgZWNobyAiJGFjX3QiIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAxPiY2Ci0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAJCW5sc19jdl9oZWFkZXJfaW50bD0KLQlubHNfY3ZfaGVhZGVyX2xpYmd0PQotCUNBVE9CSkVYVD1OT05FCi0KLQlhY19zYWZlPWBlY2hvICJsaWJpbnRsLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpYmludGwuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI4NDogY2hlY2tpbmcgZm9yIGxpYmludGwuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzI4OSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjk0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMxMTogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMzIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzMzk6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzQ3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM1ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM3NDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzc5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM4NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0MTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0NDg6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0NTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzQ3NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzUwMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1Mzk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU3MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzU3OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmUKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ0FUT0JKRVhUPS5tbwotCQkgICBEQVRBRElSTkFNRT1saWIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLQkJSU5TVE9CSkVYVD0ubW8KLQkgICAgICBmaQotCSAgICBmaQotCQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotCSAgICAgICAgCi0gICAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIk5PTkUiOyB0aGVuCi0JICAJICAJICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PXllcwotICAgICAgICBmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJG5sc19jdl91c2VfZ251X2dldHRleHQiID0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2MTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibXNnZm10IgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjQ1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY4MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAKLQlVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICAgICAgQ0FUT0JKRVhUPS5nbW8KLSAgICAgICAgSU5TVE9CSkVYVD0ubW8KLSAgICAgICAgREFUQURJUk5BTUU9c2hhcmUKLQlJTlRMREVQUz0nJCh0b3BfYnVpbGRkaXIpLy4uL2ludGwvbGliaW50bC5hJwotCUlOVExMSUJTPSRJTlRMREVQUwotCUxJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWUgJ3MvLWxpbnRsLy8nYAotICAgICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkWEdFVFRFWFQiICE9ICI6IjsgdGhlbgotCQkJaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgZWNobyAiJGFjX3QiImZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdCIgMT4mNgotCSAgWEdFVFRFWFQ9IjoiCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgV2UgbmVlZCB0byBwcm9jZXNzIHRoZSBwby8gZGlyZWN0b3J5LgotICAgICAgUE9TVUI9cG8KLSAgICBlbHNlCi0gICAgICBEQVRBRElSTkFNRT1zaGFyZQotICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICBmaQotCi0gICAgIyBJZiB0aGlzIGlzIHVzZWQgaW4gR05VIGdldHRleHQgd2UgaGF2ZSB0byBzZXQgVVNFX05MUyB0byBgeWVzJwotICAgICMgYmVjYXVzZSBzb21lIG9mIHRoZSBzb3VyY2VzIGFyZSBvbmx5IGJ1aWx0IGZvciB0aGlzIGdvYWwuCi0gICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gZ2V0dGV4dDsgdGhlbgotICAgICAgVVNFX05MUz15ZXMKLSAgICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgIGZpCi0KLSAgICAgICAgICAgICAgICBmb3IgbGFuZyBpbiAkQUxMX0xJTkdVQVM7IGRvCi0gICAgICBHTU9GSUxFUz0iJEdNT0ZJTEVTICRsYW5nLmdtbyIKLSAgICAgIFBPRklMRVM9IiRQT0ZJTEVTICRsYW5nLnBvIgotICAgIGRvbmUKLQotICAgICAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgICAKLSAgCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc3MTogY2hlY2tpbmcgZm9yIGNhdGFsb2dzIHRvIGJlIGluc3RhbGxlZCIgPiY1Ci0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBlY2hvICIkYWNfdCIiJExJTkdVQVMiIDE+JjYKLSAgICAgZmkKLQotICAgICAgICAgIGlmIHRlc3QgLW4gIiRMSU5HVUFTIjsgdGhlbgotICAgICAgIGZvciBsYW5nIGluICRMSU5HVUFTOyBkbyBDQVRBTE9HUz0iJENBVEFMT0dTICRsYW5nJENBVE9CSkVYVCI7IGRvbmUKLSAgICAgZmkKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgICBJTkNMVURFX0xPQ0FMRV9IPSIjaW5jbHVkZSA8bG9jYWxlLmg+IgotICAgZWxzZQotICAgICBJTkNMVURFX0xPQ0FMRV9IPSJcCi0vKiBUaGUgc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgdGhlIGhlYWRlciA8bG9jYWxlLmg+LiAgVGFrZSBjYXJlIHlvdXJzZWxmLiAgKi8iCi0gICBmaQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBhY19zYWZlPWBlY2hvICJsaW51eC92ZXJzaW9uLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzc5OTogY2hlY2tpbmcgZm9yIGxpbnV4L3ZlcnNpb24uaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzgwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozODA5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4NzI6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODk1OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTExOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTI4OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5MzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTQwOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5NTk6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGdjb25maWcuaDpnY29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9UUlVFQCUkTUFJTlRBSU5FUl9NT0RFX1RSVUUlZwotcyVATUFJTlRBSU5FUl9NT0RFX0ZBTFNFQCUkTUFJTlRBSU5FUl9NT0RFX0ZBTFNFJWcKLXMlQE1BSU5UQCUkTUFJTlQlZwotcyVARVhFRVhUQCUkRVhFRVhUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9Imdjb25maWcuaDpnY29uZmlnLmluIgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1maQotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19IRUFERVJTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAkYWNfZmlsZQotCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gY29uZnRlc3Qub3V0Ci0gIGFjX2ZpbGVfaW5wdXRzPWBlY2hvICRhY19maWxlX2lufHNlZCAtZSAicyVeJSRhY19naXZlbl9zcmNkaXIvJSIgLWUgInMlOiUgJGFjX2dpdmVuX3NyY2Rpci8lZyJgCi0gIGNhdCAkYWNfZmlsZV9pbnB1dHMgPiBjb25mdGVzdC5pbgotCi1FT0YKLQotIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGEgc2VkIHNjcmlwdCBjb25mdGVzdC52YWxzIHRoYXQgc3Vic3RpdHV0ZXMKLSMgdGhlIHByb3BlciB2YWx1ZXMgaW50byBjb25maWcuaC5pbiB0byBwcm9kdWNlIGNvbmZpZy5oLiAgQW5kIGZpcnN0OgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpICpcKC4qXCklJHthY19kQX1cMSR7YWNfZEJ9XDEke2FjX2RDfVwyJHthY19kRH0lZ3AKLXMlYWNfZCVhY191JWdwCi1zJWFjX3UlYWNfZSVncAotRU9GCi1zZWQgLW4gLWYgY29uZnRlc3QuaGRyIGNvbmZkZWZzLmggPiBjb25mdGVzdC52YWxzCi1ybSAtZiBjb25mdGVzdC5oZHIKLQotIyBUaGlzIHNlZCBjb21tYW5kIHJlcGxhY2VzICN1bmRlZiB3aXRoIGNvbW1lbnRzLiAgVGhpcyBpcyBuZWNlc3NhcnksIGZvcgotIyBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAotIyBvbiBzb21lIHN5c3RlbXMgd2hlcmUgY29uZmlndXJlIHdpbGwgbm90IGRlY2lkZSB0byBkZWZpbmUgaXQuCi1jYXQgPj4gY29uZnRlc3QudmFscyA8PFxFT0YKLXMlXlsgCV0qI1sgCV0qdW5kZWZbIAldWyAJXSpbYS16QS1aX11bYS16QS1aXzAtOV0qJS8qICYgKi8lCi1FT0YKLQotIyBCcmVhayB1cCBjb25mdGVzdC52YWxzIGJlY2F1c2Ugc29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9uCi0jIHRoZSBzaXplIG9mIGhlcmUgZG9jdW1lbnRzLCBhbmQgb2xkIHNlZHMgaGF2ZSBzbWFsbCBsaW1pdHMgdG9vLgotCi1ybSAtZiBjb25mdGVzdC50YWlsCi13aGlsZSA6Ci1kbwotICBhY19saW5lcz1gZ3JlcCAtYyAuIGNvbmZ0ZXN0LnZhbHNgCi0gICMgZ3JlcCAtYyBnaXZlcyBlbXB0eSBvdXRwdXQgZm9yIGFuIGVtcHR5IGZpbGUgb24gc29tZSBBSVggc3lzdGVtcy4KLSAgaWYgdGVzdCAteiAiJGFjX2xpbmVzIiB8fCB0ZXN0ICIkYWNfbGluZXMiIC1lcSAwOyB0aGVuIGJyZWFrOyBmaQotICAjIFdyaXRlIGEgbGltaXRlZC1zaXplIGhlcmUgZG9jdW1lbnQgdG8gY29uZnRlc3QuZnJhZy4KLSAgZWNobyAnICBjYXQgPiBjb25mdGVzdC5mcmFnIDw8Q0VPRicgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkICR7YWNfbWF4X2hlcmVfbGluZXN9cSBjb25mdGVzdC52YWxzID4+ICRDT05GSUdfU1RBVFVTCi0gIGVjaG8gJ0NFT0YKLSAgc2VkIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaW4gPiBjb25mdGVzdC5vdXQKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgbXYgY29uZnRlc3Qub3V0IGNvbmZ0ZXN0LmluCi0nID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAxLCR7YWNfbWF4X2hlcmVfbGluZXN9ZCBjb25mdGVzdC52YWxzID4gY29uZnRlc3QudGFpbAotICBybSAtZiBjb25mdGVzdC52YWxzCi0gIG12IGNvbmZ0ZXN0LnRhaWwgY29uZnRlc3QudmFscwotZG9uZQotcm0gLWYgY29uZnRlc3QudmFscwotCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi0gIHJtIC1mIGNvbmZ0ZXN0LmZyYWcgY29uZnRlc3QuaAotICBlY2hvICIvKiAkYWNfZmlsZS4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4gICovIiA+IGNvbmZ0ZXN0LmgKLSAgY2F0IGNvbmZ0ZXN0LmluID4+IGNvbmZ0ZXN0LmgKLSAgcm0gLWYgY29uZnRlc3QuaW4KLSAgaWYgY21wIC1zICRhY19maWxlIGNvbmZ0ZXN0LmggMj4vZGV2L251bGw7IHRoZW4KLSAgICBlY2hvICIkYWNfZmlsZSBpcyB1bmNoYW5nZWQiCi0gICAgcm0gLWYgY29uZnRlc3QuaAotICBlbHNlCi0gICAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gICAgICBhY19kaXI9YGVjaG8gJGFjX2ZpbGV8c2VkICdzJS9bXi9dW14vXSokJSUnYAotICAgICAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgICAjIFRoZSBmaWxlIGlzIGluIGEgc3ViZGlyZWN0b3J5LgotICAgICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBmaQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXRlc3QgLXogIiRDT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oCi1zZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGUKLWV4aXQgMAotRU9GCi1jaG1vZCAreCAkQ09ORklHX1NUQVRVUwotcm0gLWZyIGNvbmZkZWZzKiAkYWNfY2xlYW5fZmlsZXMKLXRlc3QgIiRub19jcmVhdGUiID0geWVzIHx8ICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRDT05GSUdfU1RBVFVTIHx8IGV4aXQgMQotCmRpZmYgLS1naXQgYS9ncHJvZi9jb25maWd1cmUuYmF0IGIvZ3Byb2YvY29uZmlndXJlLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJlZjM3ZS4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb25maWd1cmUuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotQGVjaG8gb2ZmDQotZWNobyBDb25maWd1cmluZyBncHJvZiBmb3IgZ28zMg0KLXJlbSBUaGlzIGJhdGNoIGZpbGUgYXNzdW1lcyBhIHVuaXgtdHlwZSAic2VkIiBwcm9ncmFtDQotDQotZWNobyAjIE1ha2VmaWxlIGdlbmVyYXRlZCBieSAiY29uZmlndXJlLmJhdCI+IE1ha2VmaWxlDQotDQotaWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9eIyMjJC8gaVwJCQkJIj4+Y29uZmlnLnNlZA0KLWVjaG8gIk1ZX01BQ0hJTkU9aTM4NlwJCQkJIj4+Y29uZmlnLnNlZA0KLWVjaG8gIkNDPWdjYwkJCQkJIj4+Y29uZmlnLnNlZA0KLQ0KLWVjaG8gIyA+PiBjb25maWcuc2VkDQotDQotc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KLXNlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZQ0KLWRlbCBjb25maWcuc2VkDQotZGVsIGNvbmZpZzIuc2VkDQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29uZmlndXJlLmluIGIvZ3Byb2YvY29uZmlndXJlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTBiNTVkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotQUNfUFJFUkVRKDIuMTMpCi1BQ19JTklUKGdwcm9mLmMpCi0KLUFDX0NBTk9OSUNBTF9TWVNURU0KLQotQU1fSU5JVF9BVVRPTUFLRShncHJvZiwgMi45LjQpCi0KLUFNX1BST0dfTElCVE9PTAotCi1kbmwgRm9yIHNpbXBsaWNpdHksIHdlIHVzZSB0aGUgQkZEIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgbW9zdAotZG5sIHRoaW5ncy4gIEhvd2V2ZXIsIHdlIGFsc28gbmVlZCBvdXIgb3duIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IKLWRubCB0aGUgYXV0b21ha2UgUEFDS0FHRSBhbmQgVkVSU0lPTiBtYWNyb3MuICBXZSBkb24ndCBuYW1lIGl0Ci1kbmwgY29uZmlnLmgsIHRvIGF2b2lkIGFueSBwb3NzaWJsZSBjb25mdXNpb24gd2l0aCB0aGUgYmZkIGNvbmZpZy5oLgotQU1fQ09ORklHX0hFQURFUihnY29uZmlnLmg6Z2NvbmZpZy5pbikKLQotQUNfUFJPR19DQwotQUNfUFJPR19JTlNUQUxMCi0KLUFDX0lTQ19QT1NJWAotCi1BTExfTElOR1VBUz0KLUNZX0dOVV9HRVRURVhUCi0KLUFNX01BSU5UQUlORVJfTU9ERQotQUNfRVhFRVhUCi0KLUFDX09VVFBVVChNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9ncHJvZi9jb3JlZmlsZS5jIGIvZ3Byb2YvY29yZWZpbGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlNmY4My4uMDAwMDAwMAotLS0gYS9ncHJvZi9jb3JlZmlsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYyICswLDAgQEAKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLWJmZCAqY29yZV9iZmQ7Ci1pbnQgY29yZV9udW1fc3ltczsKLWFzeW1ib2wgKipjb3JlX3N5bXM7Ci1hc2VjdGlvbiAqY29yZV90ZXh0X3NlY3Q7Ci1QVFIgY29yZV90ZXh0X3NwYWNlOwotCi1pbnQgbWluX2luc25fc2l6ZTsKLWludCBvZmZzZXRfdG9fY29kZTsKLQotLyogRm9yIG1hcHBpbmcgc3ltYm9scyB0byBzcGVjaWZpYyAubyBmaWxlcyBkdXJpbmcgZmlsZSBvcmRlcmluZy4gICovCi1zdHJ1Y3QgZnVuY3Rpb25fbWFwIHsKLSAgY2hhciAqZnVuY3Rpb25fbmFtZTsKLSAgY2hhciAqZmlsZV9uYW1lOwotfTsKLQotc3RydWN0IGZ1bmN0aW9uX21hcCAqc3ltYm9sX21hcDsKLXVuc2lnbmVkIGludCBzeW1ib2xfbWFwX2NvdW50OwotCi1leHRlcm4gdm9pZCBpMzg2X2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgYWxwaGFfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCB2YXhfZmluZF9jYWxsIFBBUkFNUyAoKFN5bSAqLCBiZmRfdm1hLCBiZmRfdm1hKSk7Ci1leHRlcm4gdm9pZCB0YWhvZV9maW5kX2NhbGwgUEFSQU1TICgoU3ltICosIGJmZF92bWEsIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIHNwYXJjX2ZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgdm9pZAotREVGVU4gKHJlYWRfZnVuY3Rpb25fbWFwcGluZ3MsIChmaWxlbmFtZSksIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBGSUxFICpmaWxlID0gZm9wZW4gKGZpbGVuYW1lLCAiciIpOwotICBjaGFyIGR1bW15WzEwMjRdOwotICBpbnQgY291bnQgPSAwOwotCi0gIGlmICghZmlsZSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjb3VsZCBub3Qgb3BlbiAlcy5cbiIpLCB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBGaXJzdCBwYXJzZSB0aGUgbWFwcGluZyBmaWxlIHNvIHdlIGtub3cgaG93IGJpZyB3ZSBuZWVkIHRvCi0gICAgIG1ha2Ugb3VyIHRhYmxlcy4gIFdlIGFsc28gZG8gc29tZSBzYW5pdHkgY2hlY2tzIGF0IHRoaXMKLSAgICAgdGltZS4gICovCi0gIHdoaWxlICghZmVvZiAoZmlsZSkpCi0gICAgewotICAgICAgaW50IG1hdGNoZXM7Ci0KLSAgICAgIG1hdGNoZXMgPSBmc2NhbmYgKGZpbGUsICIlW15cbjpdIiwgZHVtbXkpOwotICAgICAgaWYgKCFtYXRjaGVzKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVuYWJsZSB0byBwYXJzZSBtYXBwaW5nIGZpbGUgJXMuXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIEp1c3Qgc2tpcCBtZXNzYWdlcyBhYm91dCBmaWxlcyB3aXRoIG5vIHN5bWJvbHMuICAqLwotICAgICAgaWYgKCFzdHJuY21wIChkdW1teSwgIk5vIHN5bWJvbHMgaW4gIiwgMTQpKQotCXsKLQkgIGZzY2FuZiAoZmlsZSwgIlxuIik7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIERvbid0IGNhcmUgd2hhdCBlbHNlIGlzIG9uIHRoaXMgbGluZSBhdCB0aGlzIHBvaW50LiAgKi8KLSAgICAgIGZzY2FuZiAoZmlsZSwgIiVbXlxuXVxuIiwgZHVtbXkpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0KLSAgLyogTm93IHdlIGtub3cgaG93IGJpZyB3ZSBuZWVkIHRvIG1ha2Ugb3VyIHRhYmxlLiAgKi8KLSAgc3ltYm9sX21hcCA9ICgoc3RydWN0IGZ1bmN0aW9uX21hcCAqKQotCQl4bWFsbG9jIChjb3VudCAqIHNpemVvZiAoc3RydWN0IGZ1bmN0aW9uX21hcCkpKTsKLQotICAvKiBSZXdpbmQgdGhlIGlucHV0IGZpbGUgc28gd2UgY2FuIHJlYWQgaXQgYWdhaW4uICAqLwotICByZXdpbmQgKGZpbGUpOwotCi0gIC8qIFJlYWQgZWFjaCBlbnRyeSBhbmQgcHV0IGl0IGludG8gdGhlIHRhYmxlLiAgKi8KLSAgY291bnQgPSAwOwotICB3aGlsZSAoIWZlb2YgKGZpbGUpKQotICAgIHsKLSAgICAgIGludCBtYXRjaGVzOwotICAgICAgY2hhciAqdG1wOwotCi0gICAgICBtYXRjaGVzID0gZnNjYW5mIChmaWxlLCAiJVteXG46XSIsIGR1bW15KTsKLSAgICAgIGlmICghbWF0Y2hlcykKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiB1bmFibGUgdG8gcGFyc2UgbWFwcGluZyBmaWxlICVzLlxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotCi0gICAgICAvKiBKdXN0IHNraXAgbWVzc2FnZXMgYWJvdXQgZmlsZXMgd2l0aCBubyBzeW1ib2xzLiAgKi8KLSAgICAgIGlmICghc3RybmNtcCAoZHVtbXksICJObyBzeW1ib2xzIGluICIsIDE0KSkKLQl7Ci0JICBmc2NhbmYgKGZpbGUsICJcbiIpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBkdW1teSBoYXMgdGhlIGZpbGVuYW1lLCBnbyBhaGVhZCBhbmQgY29weSBpdC4gICovCi0gICAgICBzeW1ib2xfbWFwW2NvdW50XS5maWxlX25hbWUgPSB4bWFsbG9jIChzdHJsZW4gKGR1bW15KSArIDEpOwotICAgICAgc3RyY3B5IChzeW1ib2xfbWFwW2NvdW50XS5maWxlX25hbWUsIGR1bW15KTsKLQotICAgICAgLyogTm93IHdlIG5lZWQgdGhlIGZ1bmN0aW9uIG5hbWUuICAqLwotICAgICAgZnNjYW5mIChmaWxlLCAiJVteXG5dXG4iLCBkdW1teSk7Ci0gICAgICB0bXAgPSBzdHJyY2hyIChkdW1teSwgJyAnKSArIDE7Ci0gICAgICBzeW1ib2xfbWFwW2NvdW50XS5mdW5jdGlvbl9uYW1lID0geG1hbGxvYyAoc3RybGVuICh0bXApICsgMSk7Ci0gICAgICBzdHJjcHkgKHN5bWJvbF9tYXBbY291bnRdLmZ1bmN0aW9uX25hbWUsIHRtcCk7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLQotICAvKiBSZWNvcmQgdGhlIHNpemUgb2YgdGhlIG1hcCB0YWJsZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4gICovCi0gIHN5bWJvbF9tYXBfY291bnQgPSBjb3VudDsKLX0KLQotdm9pZAotREVGVU4gKGNvcmVfaW5pdCwgKGFfb3V0X25hbWUpLCBjb25zdCBjaGFyICphX291dF9uYW1lKQotewotICBjb3JlX2JmZCA9IGJmZF9vcGVuciAoYV9vdXRfbmFtZSwgMCk7Ci0KLSAgaWYgKCFjb3JlX2JmZCkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGFfb3V0X25hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICghYmZkX2NoZWNrX2Zvcm1hdCAoY29yZV9iZmQsIGJmZF9vYmplY3QpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6ICVzOiBub3QgaW4gYS5vdXQgZm9ybWF0XG4iKSwgd2hvYW1pLCBhX291dF9uYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBnZXQgY29yZSdzIHRleHQgc2VjdGlvbjogKi8KLSAgY29yZV90ZXh0X3NlY3QgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoY29yZV9iZmQsICIudGV4dCIpOwotICBpZiAoIWNvcmVfdGV4dF9zZWN0KQotICAgIHsKLSAgICAgIGNvcmVfdGV4dF9zZWN0ID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGNvcmVfYmZkLCAiJENPREUkIik7Ci0gICAgICBpZiAoIWNvcmVfdGV4dF9zZWN0KQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGNhbid0IGZpbmQgLnRleHQgc2VjdGlvbiBpbiAlc1xuIiksCi0JCSAgIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgfQotCi0gIC8qIHJlYWQgY29yZSdzIHN5bWJvbCB0YWJsZTogKi8KLQotICAvKiB0aGlzIHdpbGwgcHJvYmFibHkgZ2l2ZSB1cyBtb3JlIHRoYW4gd2UgbmVlZCwgYnV0IHRoYXQncyBvazogICovCi0gIGNvcmVfbnVtX3N5bXMgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoY29yZV9iZmQpOwotICBpZiAoY29yZV9udW1fc3ltcyA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgd2hvYW1pLCBhX291dF9uYW1lLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgY29yZV9zeW1zID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKGNvcmVfbnVtX3N5bXMpOwotICBjb3JlX251bV9zeW1zID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGNvcmVfYmZkLCBjb3JlX3N5bXMpOwotICBpZiAoY29yZV9udW1fc3ltcyA8IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICVzOiAlc1xuIiwgd2hvYW1pLCBhX291dF9uYW1lLAotCSAgICAgICBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgbWluX2luc25fc2l6ZSA9IDE7Ci0gIG9mZnNldF90b19jb2RlID0gMDsKLQotICBzd2l0Y2ggKGJmZF9nZXRfYXJjaCAoY29yZV9iZmQpKQotICAgIHsKLSAgICBjYXNlIGJmZF9hcmNoX3ZheDoKLSAgICBjYXNlIGJmZF9hcmNoX3RhaG9lOgotICAgICAgb2Zmc2V0X3RvX2NvZGUgPSAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX2FscGhhOgotICAgICAgbWluX2luc25fc2l6ZSA9IDQ7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKGZ1bmN0aW9uX21hcHBpbmdfZmlsZSkKLSAgICByZWFkX2Z1bmN0aW9uX21hcHBpbmdzIChmdW5jdGlvbl9tYXBwaW5nX2ZpbGUpOwotfQotCi0KLS8qCi0gKiBSZWFkIGluIHRoZSB0ZXh0IHNwYWNlIG9mIGFuIGEub3V0IGZpbGUKLSAqLwotdm9pZAotREVGVU4gKGNvcmVfZ2V0X3RleHRfc3BhY2UsIChjb3JlX2JmZCksIGJmZCAqIGNvcmVfYmZkKQotewotICBjb3JlX3RleHRfc3BhY2UgPSAoUFRSKSBtYWxsb2MgKGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpOwotCi0gIGlmICghY29yZV90ZXh0X3NwYWNlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHJhbiBvdXQgcm9vbSBmb3IgJWxkIGJ5dGVzIG9mIHRleHQgc3BhY2VcbiIpLAotCSAgICAgICB3aG9hbWksIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoY29yZV9iZmQsIGNvcmVfdGV4dF9zZWN0LCBjb3JlX3RleHRfc3BhY2UsCi0JCQkJIDAsIGNvcmVfdGV4dF9zZWN0LT5fcmF3X3NpemUpKQotICAgIHsKLSAgICAgIGJmZF9wZXJyb3IgKCJiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMiKTsKLSAgICAgIGZyZWUgKGNvcmVfdGV4dF9zcGFjZSk7Ci0gICAgICBjb3JlX3RleHRfc3BhY2UgPSAwOwotICAgIH0KLSAgaWYgKCFjb3JlX3RleHRfc3BhY2UpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogY2FuJ3QgZG8gLWNcbiIpLCB3aG9hbWkpOwotICAgIH0KLX0KLQotCi12b2lkCi1ERUZVTiAoZmluZF9jYWxsLCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyksCi0gICAgICAgU3ltICogcGFyZW50IEFORCBiZmRfdm1hIHBfbG93cGMgQU5EIGJmZF92bWEgcF9oaWdocGMpCi17Ci0gIHN3aXRjaCAoYmZkX2dldF9hcmNoIChjb3JlX2JmZCkpCi0gICAgewotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIGkzODZfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIGFscGhhX2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICAgdmF4X2ZpbmRfY2FsbCAocGFyZW50LCBwX2xvd3BjLCBwX2hpZ2hwYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hfc3BhcmM6Ci0gICAgICBzcGFyY19maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGJmZF9hcmNoX3RhaG9lOgotICAgICAgdGFob2VfZmluZF9jYWxsIChwYXJlbnQsIHBfbG93cGMsIHBfaGlnaHBjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IC1jIG5vdCBzdXBwb3J0ZWQgb24gYXJjaGl0ZWN0dXJlICVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCBiZmRfcHJpbnRhYmxlX25hbWUoY29yZV9iZmQpKTsKLQotICAgICAgLyogRG9uJ3QgZ2l2ZSB0aGUgZXJyb3IgbW9yZSB0aGFuIG9uY2UuICAqLwotICAgICAgaWdub3JlX2RpcmVjdF9jYWxscyA9IEZBTFNFOwotICAgIH0KLX0KLQotLyoKLSAqIFJldHVybiBjbGFzcyBvZiBzeW1ib2wgU1lNLiAgVGhlIHJldHVybmVkIGNsYXNzIGNhbiBiZSBhbnkgb2Y6Ci0gKiAgICAgIDAgICAtPiBzeW1ib2wgaXMgbm90IGludGVyZXN0aW5nIHRvIHVzCi0gKiAgICAgICdUJyAtPiBzeW1ib2wgaXMgYSBnbG9iYWwgbmFtZQotICogICAgICAndCcgLT4gc3ltYm9sIGlzIGEgbG9jYWwgKHN0YXRpYykgbmFtZQotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY29yZV9zeW1fY2xhc3MsIChzeW0pLCBhc3ltYm9sICogc3ltKQotewotICBzeW1ib2xfaW5mbyBzeW1pbmZvOwotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyIHN5bV9wcmVmaXg7Ci0gIGludCBpOwotCi0gIGlmIChzeW0tPnNlY3Rpb24gPT0gTlVMTCB8fCAoc3ltLT5mbGFncyAmIEJTRl9ERUJVR0dJTkcpICE9IDApCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIC8qCi0gICAqIE11c3QgYmUgYSB0ZXh0IHN5bWJvbCwgYW5kIHN0YXRpYyB0ZXh0IHN5bWJvbHMgZG9uJ3QgcXVhbGlmeSBpZgotICAgKiBpZ25vcmVfc3RhdGljX2Z1bmNzIHNldC4KLSAgICovCi0gIGlmIChpZ25vcmVfc3RhdGljX2Z1bmNzICYmIChzeW0tPmZsYWdzICYgQlNGX0xPQ0FMKSkKLSAgICB7Ci0gICAgICBEQkcgKEFPVVRERUJVRywgcHJpbnRmICgiW2NvcmVfc3ltX2NsYXNzXSAlczogbm90IGEgZnVuY3Rpb25cbiIsCi0JCQkgICAgICBzeW0tPm5hbWUpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBiZmRfZ2V0X3N5bWJvbF9pbmZvIChjb3JlX2JmZCwgc3ltLCAmc3ltaW5mbyk7Ci0gIGkgPSBzeW1pbmZvLnR5cGU7Ci0KLSAgaWYgKGkgPT0gJ1QnKQotICAgIHsKLSAgICAgIHJldHVybiBpOwkJCS8qIGl0J3MgYSBnbG9iYWwgc3ltYm9sICovCi0gICAgfQotCi0gIGlmIChpID09ICdXJykKLSAgICB7Ci0gICAgICAvKiBUcmVhdCB3ZWFrIHN5bWJvbHMgYXMgdGV4dCBzeW1ib2xzLiAgRklYTUU6IGEgd2VhayBzeW1ib2wgbWF5Ci0gICAgICAgICBhbHNvIGJlIGEgZGF0YSBzeW1ib2wuICAqLwotICAgICAgcmV0dXJuICdUJzsKLSAgICB9Ci0KLSAgaWYgKGkgIT0gJ3QnKQotICAgIHsKLSAgICAgIC8qIG5vdCBhIHN0YXRpYyB0ZXh0IHN5bWJvbCAqLwotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX3N5bV9jbGFzc10gJXMgaXMgb2YgY2xhc3MgJWNcbiIsCi0JCQkgICAgICBzeW0tPm5hbWUsIGkpKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBkbyBzb21lIG1vcmUgZmlsdGVyaW5nIG9uIHN0YXRpYyBmdW5jdGlvbi1uYW1lczogKi8KLQotICBpZiAoaWdub3JlX3N0YXRpY19mdW5jcykKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIC8qCi0gICAqIENhbid0IHplcm8tbGVuZ3RoIG5hbWUgb3IgZnVubnkgY2hhcmFjdGVycyBpbiBuYW1lLCB3aGVyZQotICAgKiBgZnVubnknIGluY2x1ZGVzOiBgLicgKC5vIGZpbGUgbmFtZXMpIGFuZCBgJCcgKFBhc2NhbCBsYWJlbHMpLgotICAgKi8KLSAgaWYgKCFzeW0tPm5hbWUgfHwgc3ltLT5uYW1lWzBdID09ICdcMCcpCi0gICAgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGZvciAobmFtZSA9IHN5bS0+bmFtZTsgKm5hbWU7ICsrbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoKm5hbWUgPT0gJy4nIHx8ICpuYW1lID09ICckJykKLQl7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotICAvKgotICAgKiBPbiBzeXN0ZW1zIHdoZXJlIHRoZSBDIGNvbXBpbGVyIGFkZHMgYW4gdW5kZXJzY29yZSB0byBhbGwKLSAgICogbmFtZXMsIHN0YXRpYyBuYW1lcyB3aXRob3V0IHVuZGVyc2NvcmVzIHNlZW0gdXN1YWxseSB0byBiZQotICAgKiBsYWJlbHMgaW4gaGFuZCB3cml0dGVuIGFzc2VtYmxlciBpbiB0aGUgbGlicmFyeS4gIFdlIGRvbid0IHdhbnQKLSAgICogdGhlc2UgbmFtZXMuICBUaGlzIGlzIGNlcnRhaW5seSBuZWNlc3Nhcnkgb24gYSBTcGFyYyBydW5uaW5nCi0gICAqIFN1bk9TIDQuMSAodHJ5IHByb2ZpbGluZyBhIHByb2dyYW0gdGhhdCBkb2VzIGEgbG90IG9mCi0gICAqIGRpdmlzaW9uKS4gSSBkb24ndCBrbm93IHdoZXRoZXIgaXQgaGFzIGhhcm1mdWwgc2lkZSBlZmZlY3RzIG9uCi0gICAqIG90aGVyIHN5c3RlbXMuICBQZXJoYXBzIGl0IHNob3VsZCBiZSBtYWRlIGNvbmZpZ3VyYWJsZS4KLSAgICovCi0gIHN5bV9wcmVmaXggPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGNvcmVfYmZkKTsKLSAgaWYgKChzeW1fcHJlZml4ICYmIHN5bV9wcmVmaXggIT0gc3ltLT5uYW1lWzBdKQotICAvKgotICAgKiBHQ0MgbWF5IGFkZCBzcGVjaWFsIHN5bWJvbHMgdG8gaGVscCBnZGIgZmlndXJlIG91dCB0aGUgZmlsZQotICAgKiBsYW5ndWFnZS4gIFdlIHdhbnQgdG8gaWdub3JlIHRoZXNlLCBzaW5jZSBzb21ldGltZXMgdGhleSBtYXNrCi0gICAqIHRoZSByZWFsIGZ1bmN0aW9uLiAgKGRqQGN0cm9uKQotICAgKi8KLSAgICAgIHx8ICFzdHJuY21wIChzeW0tPm5hbWUsICJfX2dudV9jb21waWxlZCIsIDE0KQotICAgICAgfHwgIXN0cm5jbXAgKHN5bS0+bmFtZSwgIl9fX2dudV9jb21waWxlZCIsIDE1KSkKLSAgICB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgLyogSWYgdGhlIG9iamVjdCBmaWxlIHN1cHBvcnRzIG1hcmtpbmcgb2YgZnVuY3Rpb24gc3ltYm9scywgdGhlbiB3ZSBjYW4KLSAgICAgemFwIGFueXRoaW5nIHRoYXQgZG9lc24ndCBoYXZlIEJTRl9GVU5DVElPTiBzZXQuICAqLwotICBpZiAoaWdub3JlX25vbl9mdW5jdGlvbnMgJiYgKHN5bS0+ZmxhZ3MgJiBCU0ZfRlVOQ1RJT04pID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuICd0JzsJCQkvKiBpdCdzIGEgc3RhdGljIHRleHQgc3ltYm9sICovCi19Ci0KLQotLyoKLSAqIEdldCB3aGF0ZXZlciBzb3VyY2UgaW5mbyB3ZSBjYW4gZ2V0IHJlZ2FyZGluZyBhZGRyZXNzIEFERFI6Ci0gKi8KLXN0YXRpYyBib29sCi1ERUZVTiAoZ2V0X3NyY19pbmZvLCAoYWRkciwgZmlsZW5hbWUsIG5hbWUsIGxpbmVfbnVtKSwKLSAgICAgICBiZmRfdm1hIGFkZHIgQU5EIGNvbnN0IGNoYXIgKipmaWxlbmFtZSBBTkQgY29uc3QgY2hhciAqKm5hbWUKLSAgICAgICBBTkQgaW50ICpsaW5lX251bSkKLXsKLSAgY29uc3QgY2hhciAqZm5hbWUgPSAwLCAqZnVuY19uYW1lID0gMDsKLSAgaW50IGwgPSAwOwotCi0gIGlmIChiZmRfZmluZF9uZWFyZXN0X2xpbmUgKGNvcmVfYmZkLCBjb3JlX3RleHRfc2VjdCwgY29yZV9zeW1zLAotCQkJICAgICBhZGRyIC0gY29yZV90ZXh0X3NlY3QtPnZtYSwKLQkJCSAgICAgJmZuYW1lLCAmZnVuY19uYW1lLCAodW5zaWduZWQgaW50ICopICZsKQotICAgICAgJiYgZm5hbWUgJiYgZnVuY19uYW1lICYmIGwpCi0gICAgewotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltnZXRfc3JjX2luZm9dIDB4JWx4IC0+ICVzOiVkICglcylcbiIsCi0JCQkgICAgICBhZGRyLCBmbmFtZSwgbCwgZnVuY19uYW1lKSk7Ci0gICAgICAqZmlsZW5hbWUgPSBmbmFtZTsKLSAgICAgICpuYW1lID0gZnVuY19uYW1lOwotICAgICAgKmxpbmVfbnVtID0gbDsKLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIERCRyAoQU9VVERFQlVHLCBwcmludGYgKCJbZ2V0X3NyY19pbmZvXSBubyBpbmZvIGZvciAweCVseCAoJXM6JWQsJXMpXG4iLAotCQkJICAgICAgKGxvbmcpIGFkZHIsIGZuYW1lID8gZm5hbWUgOiAiPHVua25vd24+IiwgbCwKLQkJCSAgICAgIGZ1bmNfbmFtZSA/IGZ1bmNfbmFtZSA6ICI8dW5rbm93bj4iKSk7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBSZWFkIGluIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUuICBPbmUgc3ltYm9sIHBlciBmdW5jdGlvbiBpcwotICogZW50ZXJlZC4KLSAqLwotdm9pZAotREVGVU4gKGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMsIChjb3JlX2JmZCksIGJmZCAqIGNvcmVfYmZkKQotewotICBiZmRfdm1hIG1pbl92bWEgPSB+MCwgbWF4X3ZtYSA9IDA7Ci0gIGludCBjbGFzczsKLSAgbG9uZyBpLCBmb3VuZCwgc2tpcDsKLSAgdW5zaWduZWQgaW50IGo7Ci0KLSAgLyogcGFzcyAxIC0gZGV0ZXJtaW5lIHVwcGVyIGJvdW5kIG9uIG51bWJlciBvZiBmdW5jdGlvbiBuYW1lczogKi8KLSAgc3ltdGFiLmxlbiA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9zeW1zOyArK2kpCi0gICAgewotICAgICAgaWYgKCFjb3JlX3N5bV9jbGFzcyAoY29yZV9zeW1zW2ldKSkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBiaW5hcnkgc2VhcmNoIG9yIGhhc2hlZAotCSBzZWFyY2guICBHcm9zcy4gCi0KLQkgRG9uJ3QgY3JlYXRlIGEgc3ltdGFiIGVudHJ5IGZvciBhIGZ1bmN0aW9uIHRoYXQgaGFzCi0JIGEgbWFwcGluZyB0byBhIGZpbGUsIHVubGVzcyBpdCdzIHRoZSBmaXJzdCBmdW5jdGlvbgotCSBpbiB0aGUgZmlsZS4gICovCi0gICAgICBza2lwID0gMDsKLSAgICAgIGZvciAoaiA9IDA7IGogPCBzeW1ib2xfbWFwX2NvdW50OyBqKyspCi0JaWYgKCFzdHJjbXAgKGNvcmVfc3ltc1tpXS0+bmFtZSwgc3ltYm9sX21hcFtqXS5mdW5jdGlvbl9uYW1lKSkKLQkgIHsKLQkgICAgaWYgKGogPiAwICYmICEgc3RyY21wIChzeW1ib2xfbWFwIFtqXS5maWxlX25hbWUsCi0JCQkgCSAgIHN5bWJvbF9tYXAgW2ogLSAxXS5maWxlX25hbWUpKQotCSAgICAgIHNraXAgPSAxOwotCSAgICBicmVhazsKLQkgIH0KLSAgICAgIGlmICghc2tpcCkKLSAgICAgICAgKytzeW10YWIubGVuOwotICAgIH0KLQotICBpZiAoc3ltdGFiLmxlbiA9PSAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgYCVzJyBoYXMgbm8gc3ltYm9sc1xuIiksIHdob2FtaSwgYV9vdXRfbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogdGhlICIrIDIiIGlzIGZvciB0aGUgc2VudGluZWxzOiAqLwotICBzeW10YWIuYmFzZSA9IChTeW0gKikgeG1hbGxvYyAoKHN5bXRhYi5sZW4gKyAyKSAqIHNpemVvZiAoU3ltKSk7Ci0KLSAgLyogcGFzcyAyIC0gY3JlYXRlIHN5bWJvbHM6ICovCi0KLSAgc3ltdGFiLmxpbWl0ID0gc3ltdGFiLmJhc2U7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb3JlX251bV9zeW1zOyArK2kpCi0gICAgewotICAgICAgY2xhc3MgPSBjb3JlX3N5bV9jbGFzcyAoY29yZV9zeW1zW2ldKTsKLSAgICAgIGlmICghY2xhc3MpCi0JewotCSAgREJHIChBT1VUREVCVUcsCi0JICAgICAgIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zXSByZWplY3Rpbmc6IDB4JWx4ICVzXG4iLAotCQkgICAgICAgY29yZV9zeW1zW2ldLT52YWx1ZSwgY29yZV9zeW1zW2ldLT5uYW1lKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICAvKiBUaGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIGEgYmluYXJ5IHNlYXJjaCBvciBoYXNoZWQKLQkgc2VhcmNoLiAgR3Jvc3MuICAgKi8KLQotICAgICAgc2tpcCA9IDA7Ci0gICAgICBmb3VuZCA9IDA7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgc3ltYm9sX21hcF9jb3VudDsgaisrKQotCWlmICghc3RyY21wIChjb3JlX3N5bXNbaV0tPm5hbWUsIHN5bWJvbF9tYXBbal0uZnVuY3Rpb25fbmFtZSkpCi0JICB7Ci0JICAgIGlmIChqID4gMCAmJiAhIHN0cmNtcCAoc3ltYm9sX21hcCBbal0uZmlsZV9uYW1lLAotCQkJIAkgICBzeW1ib2xfbWFwIFtqIC0gMV0uZmlsZV9uYW1lKSkKLQkgICAgICBza2lwID0gMTsKLQkgICAgZWxzZQotCSAgICAgIGZvdW5kID0gajsKLQkgICAgYnJlYWs7Ci0JICB9Ci0KLSAgICAgIGlmIChza2lwKQotCWNvbnRpbnVlOwotCi0gICAgICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLQotICAgICAgLyogc3ltYm9sIG9mZnNldHMgYXJlIGFsd2F5cyBzZWN0aW9uLXJlbGF0aXZlOiAqLwotCi0gICAgICBzeW10YWIubGltaXQtPmFkZHIgPSBjb3JlX3N5bXNbaV0tPnZhbHVlICsgY29yZV9zeW1zW2ldLT5zZWN0aW9uLT52bWE7Ci0gICAgICBpZiAoc3ltYm9sX21hcF9jb3VudAotCSAgJiYgIXN0cmNtcCAoY29yZV9zeW1zW2ldLT5uYW1lLCBzeW1ib2xfbWFwW2ZvdW5kXS5mdW5jdGlvbl9uYW1lKSkKLQl7Ci0JICBzeW10YWIubGltaXQtPm5hbWUgPSBzeW1ib2xfbWFwW2ZvdW5kXS5maWxlX25hbWU7Ci0JICBzeW10YWIubGltaXQtPm1hcHBlZCA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHN5bXRhYi5saW1pdC0+bmFtZSA9IGNvcmVfc3ltc1tpXS0+bmFtZTsKLQkgIHN5bXRhYi5saW1pdC0+bWFwcGVkID0gMDsKLQl9Ci0KLSAgICAgIC8qIExvb2t1cCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIsIGlmIHdlIGNhbiAqLwotCi0gICAgICB7Ci0JY29uc3QgY2hhciAqZmlsZW5hbWUsICpmdW5jX25hbWU7Ci0JCi0JaWYgKGdldF9zcmNfaW5mbyAoc3ltdGFiLmxpbWl0LT5hZGRyLCAmZmlsZW5hbWUsICZmdW5jX25hbWUsCi0JCQkgICZzeW10YWIubGltaXQtPmxpbmVfbnVtKSkKLQkgIHsKLQkgICAgc3ltdGFiLmxpbWl0LT5maWxlID0gc291cmNlX2ZpbGVfbG9va3VwX3BhdGggKGZpbGVuYW1lKTsKLQotCSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgX19vc2ZfXyBoZXJlIGRvZXMgbm90IHdvcmsgd2l0aCBhIGNyb3NzCi0gICAgICAgICAgICAgICBncHJvZi4gICovCi0jaWZkZWYgX19vc2ZfXwotCSAgICAvKgotCSAgICAgKiBTdXBwcmVzcyBzeW1ib2xzIHRoYXQgYXJlIG5vdCBmdW5jdGlvbiBuYW1lcy4gIFRoaXMgaXMKLQkgICAgICogdXNlZnVsIHRvIHN1cHByZXNzIGNvZGUtbGFiZWxzIGFuZCBhbGlhc2VzLgotCSAgICAgKgotCSAgICAgKiBUaGlzIGlzIGtub3duIHRvIGJlIHVzZWZ1bCB1bmRlciBERUMncyBPU0YvMS4gIFVuZGVyIFN1bk9TIDQueCwKLQkgICAgICogbGFiZWxzIGRvIG5vdCBhcHBlYXIgaW4gdGhlIHN5bWJvbCB0YWJsZSBpbmZvLCBzbyB0aGlzIGlzbid0Ci0JICAgICAqIG5lY2Vzc2FyeS4KLQkgICAgICovCi0KLQkgICAgaWYgKHN0cmNtcCAoc3ltdGFiLmxpbWl0LT5uYW1lLCBmdW5jX25hbWUpICE9IDApCi0JICAgICAgewotCQkvKgotCQkgKiBUaGUgc3ltYm9sJ3MgYWRkcmVzcyBtYXBzIHRvIGEgZGlmZmVyZW50IG5hbWUsIHNvCi0JCSAqIGl0IGNhbid0IGJlIGEgZnVuY3Rpb24tZW50cnkgcG9pbnQuICBUaGlzIGhhcHBlbnMKLQkJICogZm9yIGxhYmVscywgZm9yIGV4YW1wbGUuCi0JCSAqLwotCQlEQkcgKEFPVVRERUJVRywKLQkJICAgICBwcmludGYgKCJbY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltczogcmVqICVzIChtYXBzIHRvICVzKVxuIiwKLQkJCSAgICAgc3ltdGFiLmxpbWl0LT5uYW1lLCBmdW5jX25hbWUpKTsKLQkJY29udGludWU7Ci0JICAgICAgfQotI2VuZGlmCi0JICB9Ci0gICAgICB9Ci0KLSAgICAgIHN5bXRhYi5saW1pdC0+aXNfZnVuYyA9IFRSVUU7Ci0gICAgICBzeW10YWIubGltaXQtPmlzX2JiX2hlYWQgPSBUUlVFOwotICAgICAgaWYgKGNsYXNzID09ICd0JykKLQl7Ci0JICBzeW10YWIubGltaXQtPmlzX3N0YXRpYyA9IFRSVUU7Ci0JfQotCi0gICAgICBtaW5fdm1hID0gTUlOIChzeW10YWIubGltaXQtPmFkZHIsIG1pbl92bWEpOwotICAgICAgbWF4X3ZtYSA9IE1BWCAoc3ltdGFiLmxpbWl0LT5hZGRyLCBtYXhfdm1hKTsKLQotICAgICAgLyoKLSAgICAgICAqIElmIHdlIHNlZSAibWFpbiIgd2l0aG91dCBhbiBpbml0aWFsICdfJywgd2UgYXNzdW1lIG5hbWVzCi0gICAgICAgKiBhcmUgKm5vdCogcHJlZml4ZWQgYnkgJ18nLgotICAgICAgICovCi0gICAgICBpZiAoc3ltdGFiLmxpbWl0LT5uYW1lWzBdID09ICdtJyAmJiBkaXNjYXJkX3VuZGVyc2NvcmVzCi0JICAmJiBzdHJjbXAgKHN5bXRhYi5saW1pdC0+bmFtZSwgIm1haW4iKSA9PSAwKQotCXsKLQkgIGRpc2NhcmRfdW5kZXJzY29yZXMgPSAwOwotCX0KLQotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zXSAlbGQgJXMgMHglbHhcbiIsCi0JCQkgICAgICAobG9uZykgKHN5bXRhYi5saW1pdCAtIHN5bXRhYi5iYXNlKSwKLQkJCSAgICAgIHN5bXRhYi5saW1pdC0+bmFtZSwgc3ltdGFiLmxpbWl0LT5hZGRyKSk7Ci0gICAgICArK3N5bXRhYi5saW1pdDsKLSAgICB9Ci0KLSAgLyogY3JlYXRlIHNlbnRpbmVsczogKi8KLQotICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gIjxsb2NvcmU+IjsKLSAgc3ltdGFiLmxpbWl0LT5hZGRyID0gMDsKLSAgc3ltdGFiLmxpbWl0LT5lbmRfYWRkciA9IG1pbl92bWEgLSAxOwotICArK3N5bXRhYi5saW1pdDsKLQotICBzeW1faW5pdCAoc3ltdGFiLmxpbWl0KTsKLSAgc3ltdGFiLmxpbWl0LT5uYW1lID0gIjxoaWNvcmU+IjsKLSAgc3ltdGFiLmxpbWl0LT5hZGRyID0gbWF4X3ZtYSArIDE7Ci0gIHN5bXRhYi5saW1pdC0+ZW5kX2FkZHIgPSB+MDsKLSAgKytzeW10YWIubGltaXQ7Ci0KLSAgc3ltdGFiLmxlbiA9IHN5bXRhYi5saW1pdCAtIHN5bXRhYi5iYXNlOwotICBzeW10YWJfZmluYWxpemUgKCZzeW10YWIpOwotfQotCi0KLS8qCi0gKiBSZWFkIGluIHN5bWJvbCB0YWJsZSBmcm9tIGNvcmUuICBPbmUgc3ltYm9sIHBlciBsaW5lIG9mIHNvdXJjZSBjb2RlCi0gKiBpcyBlbnRlcmVkLgotICovCi12b2lkCi1ERUZVTiAoY29yZV9jcmVhdGVfbGluZV9zeW1zLCAoY29yZV9iZmQpLCBiZmQgKiBjb3JlX2JmZCkKLXsKLSAgY2hhciAqcHJldl9uYW1lLCAqcHJldl9maWxlbmFtZTsKLSAgaW50IHByZXZfbmFtZV9sZW4sIHByZXZfZmlsZW5hbWVfbGVuOwotICBiZmRfdm1hIHZtYSwgbWluX3ZtYSA9IH4wLCBtYXhfdm1hID0gMDsKLSAgYmZkX3ZtYSBvZmZzZXQ7Ci0gIFN5bSAqcHJldiwgZHVtbXksICpzZW50aW5lbCwgKnN5bTsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGludCBwcmV2X2xpbmVfbnVtOwotICBTeW1fVGFibGUgbHRhYjsKLSAgLyoKLSAgICogQ3JlYXRlIHN5bWJvbHMgZm9yIGZ1bmN0aW9ucyBhcyB1c3VhbC4gIFRoaXMgaXMgbmVjZXNzYXJ5IGluCi0gICAqIGNhc2VzIHdoZXJlIHBhcnRzIG9mIGEgcHJvZ3JhbSB3ZXJlIG5vdCBjb21waWxlZCB3aXRoIC1nLiAgRm9yCi0gICAqIHRob3NlIHBhcnRzIHdlIHN0aWxsIHdhbnQgdG8gZ2V0IGluZm8gYXQgdGhlIGZ1bmN0aW9uIGxldmVsOgotICAgKi8KLSAgY29yZV9jcmVhdGVfZnVuY3Rpb25fc3ltcyAoY29yZV9iZmQpOwotCi0gIC8qIHBhc3MgMSAtIGNvdW50ZXIgbnVtYmVyIG9mIHN5bWJvbHM6ICovCi0KLSAgLyoKLSAgICogVG8gZmluZCBhbGwgbGluZSBpbmZvcm1hdGlvbiwgd2FsayB0aHJvdWdoIGFsbCBwb3NzaWJsZQotICAgKiB0ZXh0LXNwYWNlIGFkZHJlc3NlcyAob25lIGJ5IG9uZSEpIGFuZCBnZXQgdGhlIGRlYnVnZ2luZwotICAgKiBpbmZvIGZvciBlYWNoIGFkZHJlc3MuICBXaGVuIHRoZSBkZWJ1Z2dpbmcgaW5mbyBjaGFuZ2VzLAotICAgKiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSBhIG5ldyBzeW1ib2wuCi0gICAqCi0gICAqIE9mIGNvdXJzZSwgdGhpcyBpcyByYXRoZXIgc2xvdyBhbmQgaXQgd291bGQgYmUgYmV0dGVyIGlmCi0gICAqIGJmZCB3b3VsZCBwcm92aWRlIGFuIGl0ZXJhdG9yIGZvciBlbnVtZXJhdGluZyBhbGwgbGluZSBpbmZvcwotICAgKi8KLSAgcHJldl9uYW1lX2xlbiA9IFBBVEhfTUFYOwotICBwcmV2X2ZpbGVuYW1lX2xlbiA9IFBBVEhfTUFYOwotICBwcmV2X25hbWUgPSB4bWFsbG9jIChwcmV2X25hbWVfbGVuKTsKLSAgcHJldl9maWxlbmFtZSA9IHhtYWxsb2MgKHByZXZfZmlsZW5hbWVfbGVuKTsKLSAgbHRhYi5sZW4gPSAwOwotICBwcmV2X2xpbmVfbnVtID0gMDsKLSAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplOyBvZmZzZXQgKz0gbWluX2luc25fc2l6ZSkKLSAgICB7Ci0gICAgICBpbnQgbGVuOwotCi0gICAgICB2bWEgPSBjb3JlX3RleHRfc2VjdC0+dm1hICsgb2Zmc2V0OwotICAgICAgaWYgKCFnZXRfc3JjX2luZm8gKHZtYSwgJmZpbGVuYW1lLCAmZHVtbXkubmFtZSwgJmR1bW15LmxpbmVfbnVtKQotCSAgfHwgKHByZXZfbGluZV9udW0gPT0gZHVtbXkubGluZV9udW0KLQkgICAgICAmJiBwcmV2X25hbWUgIT0gTlVMTAotCSAgICAgICYmIHN0cmNtcCAocHJldl9uYW1lLCBkdW1teS5uYW1lKSA9PSAwCi0JICAgICAgJiYgc3RyY21wIChwcmV2X2ZpbGVuYW1lLCBmaWxlbmFtZSkgPT0gMCkpCi0JewotCSAgY29udGludWU7Ci0JfQotCi0gICAgICArK2x0YWIubGVuOwotICAgICAgcHJldl9saW5lX251bSA9IGR1bW15LmxpbmVfbnVtOwotCi0gICAgICBsZW4gPSBzdHJsZW4gKGR1bW15Lm5hbWUpOwotICAgICAgaWYgKGxlbiA+PSBwcmV2X25hbWVfbGVuKQotCXsKLQkgIHByZXZfbmFtZV9sZW4gPSBsZW4gKyAxMDI0OwotCSAgZnJlZSAocHJldl9uYW1lKTsKLQkgIHByZXZfbmFtZSA9IHhtYWxsb2MgKHByZXZfbmFtZV9sZW4pOwotCX0KLSAgICAgIHN0cmNweSAocHJldl9uYW1lLCBkdW1teS5uYW1lKTsKLQotICAgICAgbGVuID0gc3RybGVuIChmaWxlbmFtZSk7Ci0gICAgICBpZiAobGVuID49IHByZXZfZmlsZW5hbWVfbGVuKQotCXsKLQkgIHByZXZfZmlsZW5hbWVfbGVuID0gbGVuICsgMTAyNDsKLQkgIGZyZWUgKHByZXZfZmlsZW5hbWUpOwotCSAgcHJldl9maWxlbmFtZSA9IHhtYWxsb2MgKHByZXZfZmlsZW5hbWVfbGVuKTsKLQl9Ci0gICAgICBzdHJjcHkgKHByZXZfZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQotICAgICAgbWluX3ZtYSA9IE1JTiAodm1hLCBtaW5fdm1hKTsKLSAgICAgIG1heF92bWEgPSBNQVggKHZtYSwgbWF4X3ZtYSk7Ci0gICAgfQotCi0gIGZyZWUgKHByZXZfbmFtZSk7Ci0gIGZyZWUgKHByZXZfZmlsZW5hbWUpOwotCi0gIC8qIG1ha2Ugcm9vbSBmb3IgZnVuY3Rpb24gc3ltYm9scywgdG9vOiAqLwotICBsdGFiLmxlbiArPSBzeW10YWIubGVuOwotICBsdGFiLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKGx0YWIubGVuICogc2l6ZW9mIChTeW0pKTsKLSAgbHRhYi5saW1pdCA9IGx0YWIuYmFzZTsKLQotICAvKiBwYXNzIDIgLSBjcmVhdGUgc3ltYm9sczogKi8KLQotICAvKiBXZSBub3cgc2V0IGlzX3N0YXRpYyBhcyB3ZSBnbyBhbG9uZywgcmF0aGVyIHRoYW4gYnkgcnVubmluZwotICAgICB0aHJvdWdoIHRoZSBzeW1ib2wgdGFibGUgYXQgdGhlIGVuZC4KLQotICAgICBUaGUgb2xkIHdheSBjYWxsZWQgc3ltdGFiX2ZpbmFsaXplIGJlZm9yZSB0aGUgaXNfc3RhdGljIHBhc3MsCi0gICAgIGNhdXNpbmcgYSBwcm9ibGVtIHNpbmNlIHN5bXRhYl9maW5hbGl6ZSB1c2VzIGlzX3N0YXRpYyBhcyBwYXJ0IG9mCi0gICAgIGl0cyBhZGRyZXNzIGNvbmZsaWN0IHJlc29sdXRpb24gYWxnb3JpdGhtLiAgU2luY2UgZ2xvYmFsIHN5bWJvbHMKLSAgICAgd2VyZSBwcmVmZXJlZCBvdmVyIHN0YXRpYyBzeW1ib2xzLCBhbmQgYWxsIGxpbmUgc3ltYm9scyB3ZXJlCi0gICAgIGdsb2JhbCBhdCB0aGF0IHBvaW50LCBzdGF0aWMgZnVuY3Rpb24gbmFtZXMgdGhhdCBjb25mbGljdGVkIHdpdGgKLSAgICAgdGhlaXIgb3duIGxpbmUgbnVtYmVycyAoc3RhdGljLCBidXQgbGFiZWxlZCBhcyBnbG9iYWwpIHdlcmUKLSAgICAgcmVqZWN0ZWQgaW4gZmF2b3Igb2YgdGhlIGxpbmUgbnVtLgotCi0gICAgIFRoaXMgd2FzIG5vdCB0aGUgZGVzaXJlZCBmdW5jdGlvbmFsaXR5LiAgV2UgYWx3YXlzIHdhbnQgdG8ga2VlcAotICAgICBvdXIgZnVuY3Rpb24gc3ltYm9scyBhbmQgZGlzY2FyZCBhbnkgY29uZmxpY3RpbmcgbGluZSBzeW1ib2xzLgotICAgICBQZXJoYXBzIHN5bXRhYl9maW5hbGl6ZSBzaG91bGQgYmUgbW9kaWZpZWQgdG8gbWFrZSB0aGlzCi0gICAgIGRpc3RpbmN0aW9uIGFzIHdlbGwsIGJ1dCB0aGUgY3VycmVudCBmaXggd29ya3MgYW5kIHRoZSBjb2RlIGlzIGEKLSAgICAgbG90IGNsZWFuZXIgbm93LiAgKi8KLQotICBwcmV2ID0gMDsKLSAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplOyBvZmZzZXQgKz0gbWluX2luc25fc2l6ZSkKLSAgICB7Ci0gICAgICBzeW1faW5pdCAobHRhYi5saW1pdCk7Ci0gICAgICBpZiAoIWdldF9zcmNfaW5mbyAoY29yZV90ZXh0X3NlY3QtPnZtYSArIG9mZnNldCwgJmZpbGVuYW1lLAotCQkJICZsdGFiLmxpbWl0LT5uYW1lLCAmbHRhYi5saW1pdC0+bGluZV9udW0pCi0JICB8fCAocHJldiAmJiBwcmV2LT5saW5lX251bSA9PSBsdGFiLmxpbWl0LT5saW5lX251bQotCSAgICAgICYmIHN0cmNtcCAocHJldi0+bmFtZSwgbHRhYi5saW1pdC0+bmFtZSkgPT0gMAotCSAgICAgICYmIHN0cmNtcCAocHJldi0+ZmlsZS0+bmFtZSwgZmlsZW5hbWUpID09IDApKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogbWFrZSBuYW1lIHBvaW50ZXIgYSBtYWxsb2MnZWQgc3RyaW5nOiAqLwotICAgICAgbHRhYi5saW1pdC0+bmFtZSA9IHhzdHJkdXAgKGx0YWIubGltaXQtPm5hbWUpOwotICAgICAgbHRhYi5saW1pdC0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9wYXRoIChmaWxlbmFtZSk7Ci0KLSAgICAgIGx0YWIubGltaXQtPmFkZHIgPSBjb3JlX3RleHRfc2VjdC0+dm1hICsgb2Zmc2V0OwotCi0gICAgICAvKiBTZXQgaXNfc3RhdGljIGJhc2VkIG9uIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24sIHVzaW5nIGVpdGhlcjoKLSAgICAgICAqIDEpIHRoZSBwcmV2aW91cyBzeW1ib2wsIGlmIGl0J3MgZnJvbSB0aGUgc2FtZSBmdW5jdGlvbiwgb3IKLSAgICAgICAqIDIpIGEgc3ltdGFiIGxvb2t1cAotICAgICAgICovCi0KLSAgICAgIGlmIChwcmV2ICYmIGx0YWIubGltaXQtPmZpbGUgPT0gcHJldi0+ZmlsZSAmJgotCSAgc3RyY21wIChsdGFiLmxpbWl0LT5uYW1lLCBwcmV2LT5uYW1lKSA9PSAwKQotCXsKLQkgIGx0YWIubGltaXQtPmlzX3N0YXRpYyA9IHByZXYtPmlzX3N0YXRpYzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3ltID0gc3ltX2xvb2t1cCgmc3ltdGFiLCBsdGFiLmxpbWl0LT5hZGRyKTsKLQkgIGx0YWIubGltaXQtPmlzX3N0YXRpYyA9IHN5bS0+aXNfc3RhdGljOwotCX0KLQotICAgICAgcHJldiA9IGx0YWIubGltaXQ7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBJZiB3ZSBzZWUgIm1haW4iIHdpdGhvdXQgYW4gaW5pdGlhbCAnXycsIHdlIGFzc3VtZSBuYW1lcwotICAgICAgICogYXJlICpub3QqIHByZWZpeGVkIGJ5ICdfJy4KLSAgICAgICAqLwotICAgICAgaWYgKGx0YWIubGltaXQtPm5hbWVbMF0gPT0gJ20nICYmIGRpc2NhcmRfdW5kZXJzY29yZXMKLQkgICYmIHN0cmNtcCAobHRhYi5saW1pdC0+bmFtZSwgIm1haW4iKSA9PSAwKQotCXsKLQkgIGRpc2NhcmRfdW5kZXJzY29yZXMgPSAwOwotCX0KLQotICAgICAgREJHIChBT1VUREVCVUcsIHByaW50ZiAoIltjb3JlX2NyZWF0ZV9saW5lX3N5bXNdICVkICVzIDB4JWx4XG4iLAotCQkJICAgICAgbHRhYi5saW1pdCAtIGx0YWIuYmFzZSwgbHRhYi5saW1pdC0+bmFtZSwKLQkJCSAgICAgIGx0YWIubGltaXQtPmFkZHIpKTsKLSAgICAgICsrbHRhYi5saW1pdDsKLSAgICB9Ci0KLSAgLyogdXBkYXRlIHNlbnRpbmVsczogKi8KLQotICBzZW50aW5lbCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIDApOwotICBpZiAoc3RyY21wIChzZW50aW5lbC0+bmFtZSwgIjxsb2NvcmU+IikgPT0gMAotICAgICAgJiYgbWluX3ZtYSA8PSBzZW50aW5lbC0+ZW5kX2FkZHIpCi0gICAgewotICAgICAgc2VudGluZWwtPmVuZF9hZGRyID0gbWluX3ZtYSAtIDE7Ci0gICAgfQotCi0gIHNlbnRpbmVsID0gc3ltX2xvb2t1cCAoJnN5bXRhYiwgfjApOwotICBpZiAoc3RyY21wIChzZW50aW5lbC0+bmFtZSwgIjxoaWNvcmU+IikgPT0gMCAmJiBtYXhfdm1hID49IHNlbnRpbmVsLT5hZGRyKQotICAgIHsKLSAgICAgIHNlbnRpbmVsLT5hZGRyID0gbWF4X3ZtYSArIDE7Ci0gICAgfQotCi0gIC8qIGNvcHkgaW4gZnVuY3Rpb24gc3ltYm9sczogKi8KLSAgbWVtY3B5IChsdGFiLmxpbWl0LCBzeW10YWIuYmFzZSwgc3ltdGFiLmxlbiAqIHNpemVvZiAoU3ltKSk7Ci0gIGx0YWIubGltaXQgKz0gc3ltdGFiLmxlbjsKLQotICBpZiAoKHVuc2lnbmVkIGludCkgKGx0YWIubGltaXQgLSBsdGFiLmJhc2UpICE9IGx0YWIubGVuKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgXygiJXM6IHNvbWVib2R5IG1pc2NvdW50ZWQ6IGx0YWIubGVuPSVkIGluc3RlYWQgb2YgJWxkXG4iKSwKLQkgICAgICAgd2hvYW1pLCBsdGFiLmxlbiwgKGxvbmcpIChsdGFiLmxpbWl0IC0gbHRhYi5iYXNlKSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgLyogZmluYWxpemUgbHRhYiBhbmQgbWFrZSBpdCBzeW1ib2wgdGFibGU6ICovCi0KLSAgc3ltdGFiX2ZpbmFsaXplICgmbHRhYik7Ci0gIGZyZWUgKHN5bXRhYi5iYXNlKTsKLSAgc3ltdGFiID0gbHRhYjsKLQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvY29yZWZpbGUuaCBiL2dwcm9mL2NvcmVmaWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOTZmODUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvY29yZWZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSNpZm5kZWYgY29yZWZpbGVfaAotI2RlZmluZSBjb3JlZmlsZV9oCi0KLSNpbmNsdWRlICJiZmQuaCIKLQotZXh0ZXJuIGJmZCAqY29yZV9iZmQ7CQkvKiBiZmQgZm9yIGNvcmUtZmlsZSAqLwotZXh0ZXJuIGludCBjb3JlX251bV9zeW1zOwkvKiAjIG9mIGVudHJpZXMgaW4gc3ltYm9sLXRhYmxlICovCi1leHRlcm4gYXN5bWJvbCAqKmNvcmVfc3ltczsJLyogc3ltYm9sIHRhYmxlIGluIGEub3V0ICovCi1leHRlcm4gYXNlY3Rpb24gKmNvcmVfdGV4dF9zZWN0OwkvKiBjb3JlIHRleHQgc2VjdGlvbiAqLwotZXh0ZXJuIFBUUiBjb3JlX3RleHRfc3BhY2U7CS8qIHRleHQgc3BhY2Ugb2YgYS5vdXQgaW4gY29yZSAqLwotCi1leHRlcm4gaW50IG1pbl9pbnNuX3NpemU7CS8qIHNpemUgb2Ygc21hbGxlc3QgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzICovCi1leHRlcm4gaW50IG9mZnNldF90b19jb2RlOwkvKiBvZmZzZXQgKGluIGJ5dGVzKSBvZiBjb2RlIGZyb20gZW50cnkKLQkJCQkgICBhZGRyZXNzIG9mIHJvdXRpbmUgKi8KLQotZXh0ZXJuIHZvaWQgY29yZV9pbml0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFfb3V0X25hbWUpKTsKLWV4dGVybiB2b2lkIGNvcmVfZ2V0X3RleHRfc3BhY2UgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKLWV4dGVybiB2b2lkIGNvcmVfY3JlYXRlX2Z1bmN0aW9uX3N5bXMgUEFSQU1TICgoYmZkICogY29yZV9iZmQpKTsKLWV4dGVybiB2b2lkIGNvcmVfY3JlYXRlX2xpbmVfc3ltcyBQQVJBTVMgKChiZmQgKiBjb3JlX2JmZCkpOwotCi0jZW5kaWYgLyogY29yZWZpbGVfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZmxhdF9ibC5tIGIvZ3Byb2YvZmxhdF9ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjI4NzFhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2ZsYXRfYmwubQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLQotICUgICAgICAgICB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgcnVubmluZyB0aW1lIG9mIHRoZQotdGltZSAgICAgICBwcm9ncmFtIHVzZWQgYnkgdGhpcyBmdW5jdGlvbi4KLQotY3VtdWxhdGl2ZSBhIHJ1bm5pbmcgc3VtIG9mIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhY2NvdW50ZWQKLSBzZWNvbmRzICAgZm9yIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIHRob3NlIGxpc3RlZCBhYm92ZSBpdC4KLQotIHNlbGYgICAgICB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYWNjb3VudGVkIGZvciBieSB0aGlzCi1zZWNvbmRzICAgIGZ1bmN0aW9uIGFsb25lLiAgVGhpcyBpcyB0aGUgbWFqb3Igc29ydCBmb3IgdGhpcwotICAgICAgICAgICBsaXN0aW5nLgotCi1jYWxscyAgICAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiB3YXMgaW52b2tlZCwgaWYKLSAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBpcyBwcm9maWxlZCwgZWxzZSBibGFuay4KLSAKLSBzZWxmICAgICAgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1tcy9jYWxsICAgIGZ1bmN0aW9uIHBlciBjYWxsLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLAotCSAgIGVsc2UgYmxhbmsuCi0KLSB0b3RhbCAgICAgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1tcy9jYWxsICAgIGZ1bmN0aW9uIGFuZCBpdHMgZGVzY2VuZGVudHMgcGVyIGNhbGwsIGlmIHRoaXMgCi0JICAgZnVuY3Rpb24gaXMgcHJvZmlsZWQsIGVsc2UgYmxhbmsuCi0KLW5hbWUgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcyBpcyB0aGUgbWlub3Igc29ydAotICAgICAgICAgICBmb3IgdGhpcyBsaXN0aW5nLiBUaGUgaW5kZXggc2hvd3MgdGhlIGxvY2F0aW9uIG9mCi0JICAgdGhlIGZ1bmN0aW9uIGluIHRoZSBncHJvZiBsaXN0aW5nLiBJZiB0aGUgaW5kZXggaXMKLQkgICBpbiBwYXJlbnRoZXNpcyBpdCBzaG93cyB3aGVyZSBpdCB3b3VsZCBhcHBlYXIgaW4KLQkgICB0aGUgZ3Byb2YgbGlzdGluZyBpZiBpdCB3ZXJlIHRvIGJlIHByaW50ZWQuCmRpZmYgLS1naXQgYS9ncHJvZi9mc2ZfY2FsbGdfYmwubSBiL2dwcm9mL2ZzZl9jYWxsZ19ibC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE2ODIxLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2ZzZl9jYWxsZ19ibC5tCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotCi0gVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGNhbGwgdHJlZSBvZiB0aGUgcHJvZ3JhbSwgYW5kIHdhcyBzb3J0ZWQgYnkKLSB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gZWFjaCBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuLgotCi0gRWFjaCBlbnRyeSBpbiB0aGlzIHRhYmxlIGNvbnNpc3RzIG9mIHNldmVyYWwgbGluZXMuICBUaGUgbGluZSB3aXRoIHRoZQotIGluZGV4IG51bWJlciBhdCB0aGUgbGVmdCBoYW5kIG1hcmdpbiBsaXN0cyB0aGUgY3VycmVudCBmdW5jdGlvbi4KLSBUaGUgbGluZXMgYWJvdmUgaXQgbGlzdCB0aGUgZnVuY3Rpb25zIHRoYXQgY2FsbGVkIHRoaXMgZnVuY3Rpb24sCi0gYW5kIHRoZSBsaW5lcyBiZWxvdyBpdCBsaXN0IHRoZSBmdW5jdGlvbnMgdGhpcyBvbmUgY2FsbGVkLgotIFRoaXMgbGluZSBsaXN0czoKLSAgICAgaW5kZXgJQSB1bmlxdWUgbnVtYmVyIGdpdmVuIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgdGFibGUuCi0JCUluZGV4IG51bWJlcnMgYXJlIHNvcnRlZCBudW1lcmljYWxseS4KLQkJVGhlIGluZGV4IG51bWJlciBpcyBwcmludGVkIG5leHQgdG8gZXZlcnkgZnVuY3Rpb24gbmFtZSBzbwotCQlpdCBpcyBlYXNpZXIgdG8gbG9vayB1cCB3aGVyZSB0aGUgZnVuY3Rpb24gaW4gdGhlIHRhYmxlLgotCi0gICAgICUgdGltZQlUaGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBgdG90YWwnIHRpbWUgdGhhdCB3YXMgc3BlbnQKLQkJaW4gdGhpcyBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuLiAgTm90ZSB0aGF0IGR1ZSB0bwotCQlkaWZmZXJlbnQgdmlld3BvaW50cywgZnVuY3Rpb25zIGV4Y2x1ZGVkIGJ5IG9wdGlvbnMsIGV0YywKLQkJdGhlc2UgbnVtYmVycyB3aWxsIE5PVCBhZGQgdXAgdG8gMTAwJS4KLQotICAgICBzZWxmCVRoaXMgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIHRoaXMgZnVuY3Rpb24uCi0KLSAgICAgY2hpbGRyZW4JVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgcHJvcGFnYXRlZCBpbnRvIHRoaXMKLQkJZnVuY3Rpb24gYnkgaXRzIGNoaWxkcmVuLgotCi0gICAgIGNhbGxlZAlUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuCi0JCUlmIHRoZSBmdW5jdGlvbiBjYWxsZWQgaXRzZWxmIHJlY3Vyc2l2ZWx5LCB0aGUgbnVtYmVyCi0JCW9ubHkgaW5jbHVkZXMgbm9uLXJlY3Vyc2l2ZSBjYWxscywgYW5kIGlzIGZvbGxvd2VkIGJ5Ci0JCWEgYCsnIGFuZCB0aGUgbnVtYmVyIG9mIHJlY3Vyc2l2ZSBjYWxscy4KLQotICAgICBuYW1lCVRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgVGhlIGluZGV4IG51bWJlciBpcwotCQlwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIGZ1bmN0aW9uIGlzIGEgbWVtYmVyIG9mIGEKLQkJY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMgcHJpbnRlZCBiZXR3ZWVuIHRoZQotCQlmdW5jdGlvbidzIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi0KLQotIEZvciB0aGUgZnVuY3Rpb24ncyBwYXJlbnRzLCB0aGUgZmllbGRzIGhhdmUgdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKLQotICAgICBzZWxmCVRoaXMgaXMgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgd2FzIHByb3BhZ2F0ZWQgZGlyZWN0bHkKLQkJZnJvbSB0aGUgZnVuY3Rpb24gaW50byB0aGlzIHBhcmVudC4KLQotICAgICBjaGlsZHJlbglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGZyb20KLQkJdGhlIGZ1bmN0aW9uJ3MgY2hpbGRyZW4gaW50byB0aGlzIHBhcmVudC4KLQotICAgICBjYWxsZWQJVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgcGFyZW50IGNhbGxlZCB0aGUKLQkJZnVuY3Rpb24gYC8nIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uCi0JCXdhcyBjYWxsZWQuICBSZWN1cnNpdmUgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIGFyZSBub3QKLQkJaW5jbHVkZWQgaW4gdGhlIG51bWJlciBhZnRlciB0aGUgYC8nLgotCi0gICAgIG5hbWUJVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyZW50LiAgVGhlIHBhcmVudCdzIGluZGV4Ci0JCW51bWJlciBpcyBwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIHBhcmVudCBpcyBhCi0JCW1lbWJlciBvZiBhIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzIHByaW50ZWQgYmV0d2VlbgotCQl0aGUgbmFtZSBhbmQgdGhlIGluZGV4IG51bWJlci4KLQotIElmIHRoZSBwYXJlbnRzIG9mIHRoZSBmdW5jdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgdGhlIHdvcmQKLSBgPHNwb250YW5lb3VzPicgaXMgcHJpbnRlZCBpbiB0aGUgYG5hbWUnIGZpZWxkLCBhbmQgYWxsIHRoZSBvdGhlcgotIGZpZWxkcyBhcmUgYmxhbmsuCi0KLSBGb3IgdGhlIGZ1bmN0aW9uJ3MgY2hpbGRyZW4sIHRoZSBmaWVsZHMgaGF2ZSB0aGUgZm9sbG93aW5nIG1lYW5pbmdzOgotCi0gICAgIHNlbGYJVGhpcyBpcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCB3YXMgcHJvcGFnYXRlZCBkaXJlY3RseQotCQlmcm9tIHRoZSBjaGlsZCBpbnRvIHRoZSBmdW5jdGlvbi4KLQotICAgICBjaGlsZHJlbglUaGlzIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHdhcyBwcm9wYWdhdGVkIGZyb20gdGhlCi0JCWNoaWxkJ3MgY2hpbGRyZW4gdG8gdGhlIGZ1bmN0aW9uLgotCi0gICAgIGNhbGxlZAlUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIGNhbGxlZAotCQl0aGlzIGNoaWxkIGAvJyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBjaGlsZAotCQl3YXMgY2FsbGVkLiAgUmVjdXJzaXZlIGNhbGxzIGJ5IHRoZSBjaGlsZCBhcmUgbm90Ci0JCWxpc3RlZCBpbiB0aGUgbnVtYmVyIGFmdGVyIHRoZSBgLycuCi0KLSAgICAgbmFtZQlUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjaGlsZC4gIFRoZSBjaGlsZCdzIGluZGV4Ci0JCW51bWJlciBpcyBwcmludGVkIGFmdGVyIGl0LiAgSWYgdGhlIGNoaWxkIGlzIGEKLQkJbWVtYmVyIG9mIGEgY3ljbGUsIHRoZSBjeWNsZSBudW1iZXIgaXMgcHJpbnRlZAotCQliZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgaW5kZXggbnVtYmVyLgotCi0gSWYgdGhlcmUgYXJlIGFueSBjeWNsZXMgKGNpcmNsZXMpIGluIHRoZSBjYWxsIGdyYXBoLCB0aGVyZSBpcyBhbgotIGVudHJ5IGZvciB0aGUgY3ljbGUtYXMtYS13aG9sZS4gIFRoaXMgZW50cnkgc2hvd3Mgd2hvIGNhbGxlZCB0aGUKLSBjeWNsZSAoYXMgcGFyZW50cykgYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBjeWNsZSAoYXMgY2hpbGRyZW4uKQotIFRoZSBgKycgcmVjdXJzaXZlIGNhbGxzIGVudHJ5IHNob3dzIHRoZSBudW1iZXIgb2YgZnVuY3Rpb24gY2FsbHMgdGhhdAotIHdlcmUgaW50ZXJuYWwgdG8gdGhlIGN5Y2xlLCBhbmQgdGhlIGNhbGxzIGVudHJ5IGZvciBlYWNoIG1lbWJlciBzaG93cywKLSBmb3IgdGhhdCBtZW1iZXIsIGhvdyBtYW55IHRpbWVzIGl0IHdhcyBjYWxsZWQgZnJvbSBvdGhlciBtZW1iZXJzIG9mCi0gdGhlIGN5Y2xlLgotCmRpZmYgLS1naXQgYS9ncHJvZi9nY29uZmlnLmluIGIvZ3Byb2YvZ2NvbmZpZy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3ZThlMC4uMDAwMDAwMAotLS0gYS9ncHJvZi9nY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qIGdjb25maWcuaW4uICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGNvbmZpZ3VyZS5pbiBieSBhdXRvaGVhZGVyLiAgKi8KLQotLyogRGVmaW5lIGlmIHVzaW5nIGFsbG9jYS5jLiAgKi8KLSN1bmRlZiBDX0FMTE9DQQotCi0vKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCi0jdW5kZWYgY29uc3QKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAgKi8KLSN1bmRlZiBIQVZFX01NQVAKLQotLyogRGVmaW5lIGFzIF9faW5saW5lIGlmIHRoYXQncyB3aGF0IHRoZSBDIGNvbXBpbGVyIGNhbGxzIGl0LiAgKi8KLSN1bmRlZiBpbmxpbmUKLQotLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBvZmZfdAotCi0vKiBEZWZpbmUgaWYgeW91IG5lZWQgdG8gaW4gb3JkZXIgZm9yIHN0YXQgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAgKi8KLSN1bmRlZiBfUE9TSVhfU09VUkNFCi0KLS8qIERlZmluZSB0byBgdW5zaWduZWQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHNpemVfdAotCi0vKiBJZiB1c2luZyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBhbGxvY2EsIGRlZmluZSBpZiB5b3Uga25vdyB0aGUKLSAgIGRpcmVjdGlvbiBvZiBzdGFjayBncm93dGggZm9yIHlvdXIgc3lzdGVtOyBvdGhlcndpc2UgaXQgd2lsbCBiZQotICAgYXV0b21hdGljYWxseSBkZWR1Y2VkIGF0IHJ1bi10aW1lLgotIFNUQUNLX0RJUkVDVElPTiA+IDAgPT4gZ3Jvd3MgdG93YXJkIGhpZ2hlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPCAwID0+IGdyb3dzIHRvd2FyZCBsb3dlciBhZGRyZXNzZXMKLSBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93bgotICovCi0jdW5kZWYgU1RBQ0tfRElSRUNUSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgU1REQ19IRUFERVJTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCmRpZmYgLS1naXQgYS9ncHJvZi9nZW4tYy1wcm9nLmF3ayBiL2dwcm9mL2dlbi1jLXByb2cuYXdrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTljMWY4Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dlbi1jLXByb2cuYXdrCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotTlIgPT0gMQl7Ci0gICAgRlM9IlwiIjsKLSAgICBwcmludCAiLyogPT0+IERvIG5vdCBtb2RpZnkgdGhpcyBmaWxlISEgIEl0IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSIKLSAgICBwcmludGYgIiAgIGZyb20gJXMgdXNpbmcgdGhlIGdlbi1jLXByb2cuYXdrIHNjcmlwdC4gIDw9PSAqL1xuXG4iLCBGSUxFCi0gICAgcHJpbnQgIiNpbmNsdWRlIDxzdGRpby5oPiIKLX0KLQotCXsKLQkgIGlmIChjdXJmdW4gIT0gRlVOQ1RJT04pCi0JICAgIHsKLQkgICAgICBpZiAoY3VyZnVuKQotCQlwcmludCAifSIKLQkgICAgICBjdXJmdW4gPSBGVU5DVElPTgotCSAgICAgIHByaW50ICIiCi0JICAgICAgcHJpbnQgInZvaWQiOwotCSAgICAgIHByaW50ZiAiJXMgKGZpbGUpXG4iLCBGVU5DVElPTgotCSAgICAgIHByaW50ICIgICAgIEZJTEUgKmZpbGU7IjsKLQkgICAgICBwcmludCAieyI7Ci0JICAgIH0KLQkgIHByaW50ZiAiICBmcHV0cyAoXCIiOwotCSAgZm9yIChpID0gMTsgaSA8IE5GOyBpKyspCi0JICAgIHByaW50ZiAiJXNcXFwiIiwgJGk7Ci0JICBwcmludGYgIiVzXFxuXCIsIGZpbGUpO1xuIiwgJE5GOwotfQotCi1FTkQJeyBwcmludCAifSIgfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbi5oIGIvZ3Byb2YvZ21vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDFmYTRkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKi0KLSAqIENvcHlyaWdodCAoYykgMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQotICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgotICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgotICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAotICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCi0gKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKLSAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICoKLSAqCUAoIylnbW9uLmgJNS4yIChCZXJrZWxleSkgNS82LzkxCi0gKi8KLSNpZm5kZWYgZ21vbl9oCi0jZGVmaW5lIGdtb25faAotCi1zdHJ1Y3QgcmF3X3BoZHIKLSAgewotICAgIC8qIEZJWE1FOiBDaGVja2luZyBhIGhvc3QgY29tcGlsZXIgZGVmaW5lIG1lYW5zIHRoYXQgd2UgY2FuJ3QgdXNlCi0gICAgICAgYSBjcm9zcyBncHJvZiB0byB0aGUgYWxwaGEuICAqLwotI2lmZGVmIF9fYWxwaGFfXwotICAgIGNoYXIgbG93X3BjWzhdOwkJLyogYmFzZSBwYyBhZGRyZXNzIG9mIHNhbXBsZSBidWZmZXIgKi8KLSAgICBjaGFyIGhpZ2hfcGNbOF07CQkvKiBtYXggcGMgYWRkcmVzcyBvZiBzYW1wbGVkIGJ1ZmZlciAqLwotI2Vsc2UKLSAgICBjaGFyIGxvd19wY1s0XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzRdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbmRpZgotICAgIGNoYXIgbmNudFs0XTsJCS8qIHNpemUgb2Ygc2FtcGxlIGJ1ZmZlciAocGx1cyB0aGlzIGhlYWRlcikgKi8KLQotICAgIGNoYXIgdmVyc2lvbls0XTsJCS8qIHZlcnNpb24gbnVtYmVyICovCi0gICAgY2hhciBwcm9mcmF0ZVs0XTsJCS8qIHByb2ZpbGluZyBjbG9jayByYXRlICovCi0gICAgY2hhciBzcGFyZVszKjRdOwkJLyogcmVzZXJ2ZWQgKi8KLSAgfTsKLQotI2RlZmluZSBHTU9OVkVSU0lPTiAgICAgMHgwMDA1MTg3OQotCi1zdHJ1Y3Qgb2xkX3Jhd19waGRyCi0gIHsKLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgYSBob3N0IGNvbXBpbGVyIGRlZmluZSBtZWFucyB0aGF0IHdlIGNhbid0IHVzZQotICAgICAgIGEgY3Jvc3MgZ3Byb2YgdG8gdGhlIGFscGhhLiAgKi8KLSNpZmRlZiBfX2FscGhhX18KLSAgICBjaGFyIGxvd19wY1s4XTsJCS8qIGJhc2UgcGMgYWRkcmVzcyBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBoaWdoX3BjWzhdOwkJLyogbWF4IHBjIGFkZHJlc3Mgb2Ygc2FtcGxlZCBidWZmZXIgKi8KLSNlbHNlCi0gICAgY2hhciBsb3dfcGNbNF07CQkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1s0XTsJCS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0jZW5kaWYKLSAgICBjaGFyIG5jbnRbNF07CQkvKiBzaXplIG9mIHNhbXBsZSBidWZmZXIgKHBsdXMgdGhpcyBoZWFkZXIpICovCi0KLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgaG9zdCBjb21waWxlciBkZWZpbmVzIGhlcmUgbWVhbnMgdGhhdCB3ZSBjYW4ndAotICAgICAgIHVzZSBhIGNyb3NzIGdwcm9mIGFscGhhIE9TRi4gICovCi0jaWYgZGVmaW5lZCAoX19hbHBoYV9fKSAmJiBkZWZpbmVkIChfX29zZl9fKQotICAgIC8qCi0gICAgICogREVDJ3MgT1NGIHYzLjAgdXNlcyA0IGJ5dGVzIG9mIHBhZGRpbmcgdG8gYnJpbmcgdGhlIGhlYWRlciB0bwotICAgICAqIGEgc2l6ZSB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgOC4KLSAgICAgKi8KLSAgICBjaGFyIHBhZFs0XTsKLSNlbmRpZgotICB9OwotCi0vKgotICogSGlzdG9ncmFtIGNvdW50ZXJzIGFyZSB1bnNpZ25lZCBzaG9ydHM6Ci0gKi8KLSNkZWZpbmUJSElTVENPVU5URVIgdW5zaWduZWQgc2hvcnQKLQotLyoKLSAqIEZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGhpc3RvZ3JhbSBjb3VudGVycyBoZXJlLCAxLzI6Ci0gKi8KLSNkZWZpbmUJSElTVEZSQUNUSU9OCTIKLQotLyoKLSAqIEZyYWN0aW9uIG9mIHRleHQgc3BhY2UgdG8gYWxsb2NhdGUgZm9yIGZyb20gaGFzaCBidWNrZXRzLiAgVGhlCi0gKiB2YWx1ZSBvZiBIQVNIRlJBQ1RJT04gaXMgYmFzZWQgb24gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mCi0gKiBzZXBhcmF0aW9uIGJldHdlZW4gdHdvIHN1YnJvdXRpbmUgY2FsbCBwb2ludHMgaW4gdGhlIG9iamVjdCBjb2RlLgotICogR2l2ZW4gTUlOX1NVQlJfU0VQQVJBVElPTiBieXRlcyBvZiBzZXBhcmF0aW9uIHRoZSB2YWx1ZSBvZgotICogSEFTSEZSQUNUSU9OIGlzIGNhbGN1bGF0ZWQgYXM6Ci0gKgotICogICAgICBIQVNIRlJBQ1RJT04gPSBNSU5fU1VCUl9TRVBBUkFUSU9OIC8gKDIgKiBzaXplb2Yoc2hvcnQpIC0gMSk7Ci0gKgotICogRm9yIHRoZSBWQVgsIHRoZSBzaG9ydGVzdCB0d28gY2FsbCBzZXF1ZW5jZSBpczoKLSAqCi0gKiAgICAgIGNhbGxzICAgJDAsKHIwKQotICogICAgICBjYWxscyAgICQwLChyMCkKLSAqCi0gKiB3aGljaCBpcyBzZXBhcmF0ZWQgYnkgb25seSB0aHJlZSBieXRlcywgdGh1cyBIQVNIRlJBQ1RJT04gaXMgCi0gKiBjYWxjdWxhdGVkIGFzOgotICoKLSAqICAgICAgSEFTSEZSQUNUSU9OID0gMyAvICgyICogMiAtIDEpID0gMQotICoKLSAqIE5vdGUgdGhhdCB0aGUgZGl2aXNpb24gYWJvdmUgcm91bmRzIGRvd24sIHRodXMgaWYgTUlOX1NVQlJfRlJBQ1RJT04KLSAqIGlzIGxlc3MgdGhhbiB0aHJlZSwgdGhpcyBhbGdvcml0aG0gd2lsbCBub3Qgd29yayEKLSAqLwotI2RlZmluZQlIQVNIRlJBQ1RJT04gMQotCi0vKgotICogUGVyY2VudCBvZiB0ZXh0IHNwYWNlIHRvIGFsbG9jYXRlIGZvciB0b3N0cnVjdHMgd2l0aCBhIG1pbmltdW06Ci0gKi8KLSNkZWZpbmUgQVJDREVOU0lUWQkyCi0jZGVmaW5lIE1JTkFSQ1MJCTUwCi0KLXN0cnVjdCB0b3N0cnVjdAotICB7Ci0gICAgY2hhciAqc2VsZnBjOwotICAgIGludCBjb3VudDsKLSAgICB1bnNpZ25lZCBzaG9ydCBsaW5rOwotICB9OwotCi0vKgotICogQSByYXcgYXJjLCB3aXRoIHBvaW50ZXJzIHRvIHRoZSBjYWxsaW5nIHNpdGUgYW5kIHRoZSBjYWxsZWQgc2l0ZQotICogYW5kIGEgY291bnQuICBFdmVyeXRoaW5nIGlzIGRlZmluZWQgaW4gdGVybXMgb2YgY2hhcmFjdGVycyBzbwotICogYXMgdG8gZ2V0IGEgcGFja2VkIHJlcHJlc2VudGF0aW9uIChvdGhlcndpc2UsIGRpZmZlcmVudCBjb21waWxlcnMKLSAqIG1pZ2h0IGludHJvZHVjZSBkaWZmZXJlbnQgcGFkZGluZyk6Ci0gKi8KLXN0cnVjdCByYXdfYXJjCi0gIHsKLSAgICAvKiBGSVhNRTogQ2hlY2tpbmcgYSBob3N0IGNvbXBpbGVyIGRlZmluZSBtZWFucyB0aGF0IHdlIGNhbid0IHVzZQotICAgICAgIGEgY3Jvc3MgZ3Byb2YgdG8gdGhlIGFscGhhLiAgKi8KLSNpZmRlZiBfX2FscGhhX18KLSAgICBjaGFyIGZyb21fcGNbOF07Ci0gICAgY2hhciBzZWxmX3BjWzhdOwotICAgIGNoYXIgY291bnRbOF07Ci0jZWxzZQotICAgIGNoYXIgZnJvbV9wY1s0XTsKLSAgICBjaGFyIHNlbGZfcGNbNF07Ci0gICAgY2hhciBjb3VudFs0XTsKLSNlbmRpZgotICB9OwotCi0vKgotICogR2VuZXJhbCByb3VuZGluZyBmdW5jdGlvbnM6Ci0gKi8KLSNkZWZpbmUgUk9VTkRET1dOKHgseSkJKCgoeCkvKHkpKSooeSkpCi0jZGVmaW5lIFJPVU5EVVAoeCx5KQkoKCgoeCkrKHkpLTEpLyh5KSkqKHkpKQotCi0jZW5kaWYgLyogZ21vbl9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9nbW9uX2lvLmMgYi9ncHJvZi9nbW9uX2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjk0ZjUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbl9pby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8qCi0gKiBJbnB1dCBhbmQgb3V0cHV0IGZyb20vdG8gZ21vbi5vdXQgZmlsZXMuCi0gKi8KLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiYmFzaWNfYmxvY2tzLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJjYWxsX2dyYXBoLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImdtb25fb3V0LmgiCi0jaW5jbHVkZSAiZ21vbi5oIgkJLyogZmV0Y2ggaGVhZGVyIGZvciBvbGQgZm9ybWF0ICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJoZXJ0ei5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotaW50IGdtb25faW5wdXQgPSAwOwotaW50IGdtb25fZmlsZV92ZXJzaW9uID0gMDsJLyogMCA9PSBvbGQgKG5vbi12ZXJzaW9uZWQpIGZpbGUgZm9ybWF0ICovCi0KLS8qCi0gKiBUaGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGluIGxpYmJmZC4KLSAqLwotYmZkX3ZtYQotREVGVU4gKGdldF92bWEsIChhYmZkLCBhZGRyKSwgYmZkICogYWJmZCBBTkQgYmZkX2J5dGUgKiBhZGRyKQotewotICBzd2l0Y2ggKHNpemVvZiAoY2hhciopKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gYmZkX2dldF8zMiAoYWJmZCwgYWRkcik7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIGJmZF9nZXRfNjQgKGFiZmQsIGFkZHIpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCAobG9uZykgc2l6ZW9mIChjaGFyKikpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBUaGlzIHByb2JhYmx5IG91Z2h0IHRvIGJlIGluIGxpYmJmZC4KLSAqLwotdm9pZAotREVGVU4gKHB1dF92bWEsIChhYmZkLCB2YWwsIGFkZHIpLCBiZmQgKiBhYmZkIEFORCBiZmRfdm1hIHZhbCBBTkQgYmZkX2J5dGUgKiBhZGRyKQotewotICBzd2l0Y2ggKHNpemVvZiAoY2hhciopKQotICAgIHsKLSAgICBjYXNlIDQ6Ci0gICAgICBiZmRfcHV0XzMyIChhYmZkLCB2YWwsIGFkZHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgYmZkX3B1dF82NCAoYWJmZCwgdmFsLCBhZGRyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBiZmRfdm1hIGhhcyB1bmV4cGVjdGVkIHNpemUgb2YgJWxkIGJ5dGVzXG4iKSwKLQkgICAgICAgd2hvYW1pLCAobG9uZykgc2l6ZW9mIChjaGFyKikpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQotCi0KLXZvaWQKLURFRlVOIChnbW9uX291dF9yZWFkLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgRklMRSAqaWZwOwotICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLSAgdW5zaWduZWQgY2hhciB0YWc7Ci0gIGludCBuaGlzdCA9IDAsIG5hcmNzID0gMCwgbmJicyA9IDA7Ci0KLSAgLyogb3BlbiBnbW9uLm91dCBmaWxlOiAqLwotCi0gIGlmIChzdHJjbXAgKGZpbGVuYW1lLCAiLSIpID09IDApCi0gICAgewotICAgICAgaWZwID0gc3RkaW47Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWZwID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SQik7Ci0gICAgICBpZiAoIWlmcCkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICB9Ci0gIGlmIChmcmVhZCAoJmdoZHIsIHNpemVvZiAoc3RydWN0IGdtb25faGRyKSwgMSwgaWZwKSAhPSAxKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iKSwKLQkgICAgICAgZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmICgoZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMpIHx8Ci0gICAgICAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTyAmJiAhc3RybmNtcCAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KSkpCi0gICAgewotICAgICAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX01BR0lDICYmIHN0cm5jbXAgKCZnaGRyLmNvb2tpZVswXSwgR01PTl9NQUdJQywgNCkpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZmlsZSBgJXMnIGhhcyBiYWQgbWFnaWMgY29va2llXG4iKSwKLQkJICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0KLSAgICAgIC8qIHJpZ2h0IG1hZ2ljLCBzbyBpdCdzIHByb2JhYmx5IHJlYWxseSBhIG5ldyBnbW9uLm91dCBmaWxlICovCi0KLSAgICAgIGdtb25fZmlsZV92ZXJzaW9uID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBnaGRyLnZlcnNpb24pOwotICAgICAgaWYgKGdtb25fZmlsZV92ZXJzaW9uICE9IEdNT05fVkVSU0lPTiAmJiBnbW9uX2ZpbGVfdmVyc2lvbiAhPSAwKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgXygiJXM6IGZpbGUgYCVzJyBoYXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiAlZFxuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUsIGdtb25fZmlsZV92ZXJzaW9uKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogcmVhZCBpbiBhbGwgdGhlIHJlY29yZHM6ICovCi0gICAgICB3aGlsZSAoZnJlYWQgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgaWZwKSA9PSAxKQotCXsKLQkgIHN3aXRjaCAodGFnKQotCSAgICB7Ci0JICAgIGNhc2UgR01PTl9UQUdfVElNRV9ISVNUOgotCSAgICAgICsrbmhpc3Q7Ci0JICAgICAgZ21vbl9pbnB1dCB8PSBJTlBVVF9ISVNUT0dSQU07Ci0JICAgICAgaGlzdF9yZWFkX3JlYyAoaWZwLCBmaWxlbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBHTU9OX1RBR19DR19BUkM6Ci0JICAgICAgKytuYXJjczsKLQkgICAgICBnbW9uX2lucHV0IHw9IElOUFVUX0NBTExfR1JBUEg7Ci0JICAgICAgY2dfcmVhZF9yZWMgKGlmcCwgZmlsZW5hbWUpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgR01PTl9UQUdfQkJfQ09VTlQ6Ci0JICAgICAgKytuYmJzOwotCSAgICAgIGdtb25faW5wdXQgfD0gSU5QVVRfQkJfQ09VTlRTOwotCSAgICAgIGJiX3JlYWRfcmVjIChpZnAsIGZpbGVuYW1lKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiAlczogZm91bmQgYmFkIHRhZyAlZCAoZmlsZSBjb3JydXB0ZWQ/KVxuIiksCi0JCSAgICAgICB3aG9hbWksIGZpbGVuYW1lLCB0YWcpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQVVUTwotCSAgIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRAotCSAgIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQotICAgIHsKLSAgICAgIHN0cnVjdCBoZHIKLSAgICAgIHsKLQliZmRfdm1hIGxvd19wYzsKLQliZmRfdm1hIGhpZ2hfcGM7Ci0JaW50IG5jbnQ7Ci0gICAgICB9OwotICAgICAgaW50IGksIHNhbXBfYnl0ZXMsIGhlYWRlcl9zaXplOwotICAgICAgdW5zaWduZWQgbG9uZyBjb3VudDsKLSAgICAgIGJmZF92bWEgZnJvbV9wYywgc2VsZl9wYzsKLSAgICAgIHN0cnVjdCByYXdfYXJjIHJhd19hcmM7Ci0gICAgICBzdHJ1Y3QgcmF3X3BoZHIgcmF3OwotICAgICAgc3RhdGljIHN0cnVjdCBoZHIgaDsKLSAgICAgIFVOSVQgcmF3X2Jpbl9jb3VudDsKLSAgICAgIHN0cnVjdCBoZHIgdG1wOwotCi0gICAgICAvKgotICAgICAgICogSW5mb3JtYXRpb24gZnJvbSBhIGdtb24ub3V0IGZpbGUgaXMgaW4gdHdvIHBhcnRzOiBhbiBhcnJheSBvZgotICAgICAgICogc2FtcGxpbmcgaGl0cyB3aXRoaW4gcGMgcmFuZ2VzLCBhbmQgdGhlIGFyY3MuCi0gICAgICAgKi8KLSAgICAgIGdtb25faW5wdXQgPSBJTlBVVF9ISVNUT0dSQU0gfCBJTlBVVF9DQUxMX0dSQVBIOwotCi0gICAgICAvKgotICAgICAgICogVGhpcyBmc2VlaygpIG91Z2h0IHRvIHdvcmsgZXZlbiBvbiBzdGRpbiBhcyBsb25nIGFzIGl0J3MKLSAgICAgICAqIG5vdCBhbiBpbnRlcmFjdGl2ZSBkZXZpY2UgKGhlY2ssIGlzIHRoZXJlIGFueWJvZHkgd2hvIHdvdWxkCi0gICAgICAgKiB3YW50IHRvIHR5cGUgaW4gYSBnbW9uLm91dCBhdCB0aGUgdGVybWluYWw/KS4KLSAgICAgICAqLwotICAgICAgaWYgKGZzZWVrIChpZnAsIDAsIFNFRUtfU0VUKSA8IDApCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgICBpZiAoZnJlYWQgKCZyYXcsIDEsIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwgaWZwKQotCSAgIT0gc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGZpbGUgdG9vIHNob3J0IHRvIGJlIGEgZ21vbiBmaWxlXG4iKSwKLQkJICAgZmlsZW5hbWUpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgdG1wLmxvd19wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5sb3dfcGNbMF0pOwotICAgICAgdG1wLmhpZ2hfcGMgPSBnZXRfdm1hIChjb3JlX2JmZCwgKGJmZF9ieXRlICopICZyYXcuaGlnaF9wY1swXSk7Ci0gICAgICB0bXAubmNudCA9IGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy5uY250WzBdKTsKLQotICAgICAgaWYgKGJmZF9nZXRfMzIgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgJnJhdy52ZXJzaW9uWzBdKQotCSAgPT0gR01PTlZFUlNJT04pCi0JewotCSAgaW50IHByb2ZyYXRlOwotCi0JICAvKiA0LjRCU0QgZm9ybWF0IGhlYWRlci4gICovCi0KLQkgIHByb2ZyYXRlID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmcmF3LnByb2ZyYXRlWzBdKTsKLQkgIGlmICghc19oaWdocGMpCi0JICAgIGh6ID0gcHJvZnJhdGU7Ci0JICBlbHNlIGlmIChoeiAhPSBwcm9mcmF0ZSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBwcm9maWxpbmcgcmF0ZSBpbmNvbXBhdGlibGUgd2l0aCBmaXJzdCBnbW9uIGZpbGVcbiIpLAotCQkgICAgICAgZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0KLQkgIGhlYWRlcl9zaXplID0gc2l6ZW9mIChzdHJ1Y3QgcmF3X3BoZHIpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBvbGQgc3R5bGUgQlNEIGZvcm1hdC4gICovCi0JICBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNENDQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBmaWxlIGAlcycgaGFzIGJhZCBtYWdpYyBjb29raWVcbiIpLAotCQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0JICAgICAgZG9uZSAoMSk7Ci0JICAgIH0KLQotCSAgaWYgKGZzZWVrIChpZnAsIHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkciksIFNFRUtfU0VUKSA8IDApCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCi0JICBoZWFkZXJfc2l6ZSA9IHNpemVvZiAoc3RydWN0IG9sZF9yYXdfcGhkcik7Ci0JfQotCi0gICAgICBpZiAoc19oaWdocGMgJiYgKHRtcC5sb3dfcGMgIT0gaC5sb3dfcGMgfHwKLQkJICAgICAgIHRtcC5oaWdoX3BjICE9IGguaGlnaF9wYyB8fCB0bXAubmNudCAhPSBoLm5jbnQpKQotCXsKLQkgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIiksCi0JCSAgIGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLSAgICAgIGggPSB0bXA7Ci0gICAgICBzX2xvd3BjID0gKGJmZF92bWEpIGgubG93X3BjOwotICAgICAgc19oaWdocGMgPSAoYmZkX3ZtYSkgaC5oaWdoX3BjOwotICAgICAgbG93cGMgPSAoYmZkX3ZtYSkgaC5sb3dfcGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgaGlnaHBjID0gKGJmZF92bWEpIGguaGlnaF9wYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBzYW1wX2J5dGVzID0gaC5uY250IC0gaGVhZGVyX3NpemU7Ci0gICAgICBoaXN0X251bV9iaW5zID0gc2FtcF9ieXRlcyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBEQkcgKFNBTVBMRURFQlVHLAotCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBsb3dwYyAweCVseCBoaWdocGMgMHglbHggbmNudCAlZFxuIiwKLQkJICAgaC5sb3dfcGMsIGguaGlnaF9wYywgaC5uY250KTsKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICBzX2xvd3BjIDB4JWx4ICAgc19oaWdocGMgMHglbHhcbiIsCi0JCSAgIHNfbG93cGMsIHNfaGlnaHBjKTsKLQkgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gICAgIGxvd3BjIDB4JWx4ICAgICBoaWdocGMgMHglbHhcbiIsCi0JCSAgIGxvd3BjLCBoaWdocGMpOwotCSAgIHByaW50ZiAoIltnbW9uX291dF9yZWFkXSBzYW1wX2J5dGVzICVkIGhpc3RfbnVtX2JpbnMgJWRcbiIsCi0JCSAgIHNhbXBfYnl0ZXMsIGhpc3RfbnVtX2JpbnMpKTsKLQotICAgICAgaWYgKGhpc3RfbnVtX2JpbnMpCi0JewotCSAgKytuaGlzdDsKLQl9Ci0KLSAgICAgIGlmICghaGlzdF9zYW1wbGUpCi0JewotCSAgaGlzdF9zYW1wbGUgPQotCSAgICAoaW50ICopIHhtYWxsb2MgKGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0JICBtZW1zZXQgKGhpc3Rfc2FtcGxlLCAwLCBoaXN0X251bV9iaW5zICogc2l6ZW9mIChoaXN0X3NhbXBsZVswXSkpOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLQl7Ci0JICBpZiAoZnJlYWQgKHJhd19iaW5fY291bnQsIHNpemVvZiAocmF3X2Jpbl9jb3VudCksIDEsIGlmcCkgIT0gMSkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkLyVkIGJpbnNcbiIpLAotCQkgICAgICAgd2hvYW1pLCAtLWksIGhpc3RfbnVtX2JpbnMpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBoaXN0X3NhbXBsZVtpXSArPSBiZmRfZ2V0XzE2IChjb3JlX2JmZCwgKGJmZF9ieXRlICopIHJhd19iaW5fY291bnQpOwotCX0KLQotICAgICAgLyoKLSAgICAgICAqIFRoZSByZXN0IG9mIHRoZSBmaWxlIGNvbnNpc3RzIG9mIGEgYnVuY2ggb2YgPGZyb20sc2VsZixjb3VudD4KLSAgICAgICAqIHR1cGxlczoKLSAgICAgICAqLwotICAgICAgd2hpbGUgKGZyZWFkICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgaWZwKSA9PSAxKQotCXsKLQkgICsrbmFyY3M7Ci0JICBmcm9tX3BjID0gZ2V0X3ZtYSAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOwotCSAgc2VsZl9wYyA9IGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgcmF3X2FyYy5zZWxmX3BjKTsKLQkgIGNvdW50ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKLQkgIERCRyAoU0FNUExFREVCVUcsCi0JICAgICBwcmludGYgKCJbZ21vbl9vdXRfcmVhZF0gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JCSAgICAgZnJvbV9wYywgc2VsZl9wYywgY291bnQpKTsKLQkgIC8qIGFkZCB0aGlzIGFyYzogKi8KLQkgIGNnX3RhbGx5IChmcm9tX3BjLCBzZWxmX3BjLCBjb3VudCk7Ci0JfQotICAgICAgZmNsb3NlIChpZnApOwotCi0gICAgICBpZiAoaHogPT0gSFpfV1JPTkcpCi0JewotCSAgLyoKLQkgICAqIEhvdyBtYW55IHRpY2tzIHBlciBzZWNvbmQ/ICBJZiB3ZSBjYW4ndCB0ZWxsLCByZXBvcnQKLQkgICAqIHRpbWUgaW4gdGlja3MuCi0JICAgKi8KLQkgIGh6ID0gaGVydHogKCk7Ci0JICBpZiAoaHogPT0gSFpfV1JPTkcpCi0JICAgIHsKLQkgICAgICBoeiA9IDE7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJ0aW1lIGlzIGluIHRpY2tzLCBub3Qgc2Vjb25kc1xuIikpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBmaWxlIGZvcm1hdCAlZFxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZV9mb3JtYXQpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9HTU9OX0lORk8pCi0gICAgewotICAgICAgcHJpbnRmIChfKCJGaWxlIGAlcycgKHZlcnNpb24gJWQpIGNvbnRhaW5zOlxuIiksCi0JICAgICAgZmlsZW5hbWUsIGdtb25fZmlsZV92ZXJzaW9uKTsKLSAgICAgIHByaW50ZiAoXygiXHQlZCBoaXN0b2dyYW0gcmVjb3JkJXNcbiIpLAotCSAgICAgIG5oaXN0LCBuaGlzdCA9PSAxID8gIiIgOiAicyIpOwotICAgICAgcHJpbnRmIChfKCJcdCVkIGNhbGwtZ3JhcGggcmVjb3JkJXNcbiIpLAotCSAgICAgIG5hcmNzLCBuYXJjcyA9PSAxID8gIiIgOiAicyIpOwotICAgICAgcHJpbnRmIChfKCJcdCVkIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZCVzXG4iKSwKLQkgICAgICBuYmJzLCBuYmJzID09IDEgPyAiIiA6ICJzIik7Ci0gICAgICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLSAgICB9Ci19Ci0KLQotdm9pZAotREVGVU4gKGdtb25fb3V0X3dyaXRlLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgRklMRSAqb2ZwOwotICBzdHJ1Y3QgZ21vbl9oZHIgZ2hkcjsKLQotICBvZnAgPSBmb3BlbiAoZmlsZW5hbWUsIEZPUEVOX1dCKTsKLSAgaWYgKCFvZnApCi0gICAgewotICAgICAgcGVycm9yIChmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0FVVE8gfHwgZmlsZV9mb3JtYXQgPT0gRkZfTUFHSUMpCi0gICAgewotICAgICAgLyogd3JpdGUgZ21vbiBoZWFkZXI6ICovCi0KLSAgICAgIG1lbWNweSAoJmdoZHIuY29va2llWzBdLCBHTU9OX01BR0lDLCA0KTsKLSAgICAgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBHTU9OX1ZFUlNJT04sIChiZmRfYnl0ZSAqKSBnaGRyLnZlcnNpb24pOwotICAgICAgaWYgKGZ3cml0ZSAoJmdoZHIsIHNpemVvZiAoZ2hkciksIDEsIG9mcCkgIT0gMSkKLQl7Ci0JICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgIGRvbmUgKDEpOwotCX0KLQotICAgICAgLyogd3JpdGUgZXhlY3V0aW9uIHRpbWUgaGlzdG9ncmFtIGlmIHdlIGhhdmUgb25lOiAqLwotICAgICAgaWYgKGdtb25faW5wdXQgJiBJTlBVVF9ISVNUT0dSQU0pCi0JewotCSAgaGlzdF93cml0ZV9oaXN0IChvZnAsIGZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIGNhbGwgZ3JhcGggYXJjcyBpZiB3ZSBoYXZlIGFueTogKi8KLSAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQ0FMTF9HUkFQSCkKLQl7Ci0JICBjZ193cml0ZV9hcmNzIChvZnAsIGZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIHdyaXRlIGJhc2ljLWJsb2NrIGluZm8gaWYgd2UgaGF2ZSBpdDogKi8KLSAgICAgIGlmIChnbW9uX2lucHV0ICYgSU5QVVRfQkJfQ09VTlRTKQotCXsKLQkgIGJiX3dyaXRlX2Jsb2NrcyAob2ZwLCBmaWxlbmFtZSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZmlsZV9mb3JtYXQgPT0gRkZfQlNEIHx8IGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0KQotICAgIHsKLSAgICAgIHN0cnVjdCByYXdfYXJjIHJhd19hcmM7Ci0gICAgICBVTklUIHJhd19iaW5fY291bnQ7Ci0gICAgICBzdHJ1Y3QgcmF3X3BoZHIgaDsKLSAgICAgIGludCBpOwotICAgICAgQXJjICphcmM7Ci0gICAgICBTeW0gKnN5bTsKLQotICAgICAgbWVtc2V0ICgmaCwgMCwgc2l6ZW9mIGgpOwotICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfbG93cGMsIChiZmRfYnl0ZSAqKSAmaC5sb3dfcGMpOwotICAgICAgcHV0X3ZtYSAoY29yZV9iZmQsIHNfaGlnaHBjLCAoYmZkX2J5dGUgKikgJmguaGlnaF9wYyk7Ci0gICAgICBiZmRfcHV0XzMyIChjb3JlX2JmZCwKLQkJICBoaXN0X251bV9iaW5zICogc2l6ZW9mIChVTklUKSArIHNpemVvZiAoc3RydWN0IHJhd19waGRyKSwKLQkJICAoYmZkX2J5dGUgKikgJmgubmNudCk7Ci0KLSAgICAgIC8qIFdyaXRlIGhlYWRlci4gIFVzZSBuZXcgc3R5bGUgQlNEIGZvcm1hdCBpcyBleHBsaWNpdGx5Ci0gICAgICAgICBzcGVjaWZpZWQsIG9yIGlmIHRoZSBwcm9maWxpbmcgcmF0ZSBpcyBub24tc3RhbmRhcmQ7Ci0gICAgICAgICBvdGhlcndpc2UsIHVzZSB0aGUgb2xkIEJTRCBmb3JtYXQuICAqLwotICAgICAgaWYgKGZpbGVfZm9ybWF0ID09IEZGX0JTRDQ0Ci0JICB8fCBoeiAhPSBoZXJ0eiAoKSkKLQl7Ci0JICBiZmRfcHV0XzMyIChjb3JlX2JmZCwgR01PTlZFUlNJT04sIChiZmRfYnl0ZSAqKSAmaC52ZXJzaW9uKTsKLQkgIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoeiwgKGJmZF9ieXRlICopICZoLnByb2ZyYXRlKTsKLQkgIGlmIChmd3JpdGUgKCZoLCBzaXplb2YgKHN0cnVjdCByYXdfcGhkciksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChmd3JpdGUgKCZoLCBzaXplb2YgKHN0cnVjdCBvbGRfcmF3X3BoZHIpLCAxLCBvZnApICE9IDEpCi0JICAgIHsKLQkgICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLQkgICAgICBkb25lICgxKTsKLQkgICAgfQotCX0KLQotICAgICAgLyogZHVtcCB0aGUgc2FtcGxlczogKi8KLQotICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RfbnVtX2JpbnM7ICsraSkKLQl7Ci0JICBiZmRfcHV0XzE2IChjb3JlX2JmZCwgaGlzdF9zYW1wbGVbaV0sIChiZmRfYnl0ZSAqKSAmIHJhd19iaW5fY291bnRbMF0pOwotCSAgaWYgKGZ3cml0ZSAoJnJhd19iaW5fY291bnRbMF0sIHNpemVvZiAocmF3X2Jpbl9jb3VudCksIDEsIG9mcCkgIT0gMSkKLQkgICAgewotCSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBkdW1wIHRoZSBub3JtYWxpemVkIHJhdyBhcmMgaW5mb3JtYXRpb246ICovCi0KLSAgICAgIGZvciAoc3ltID0gc3ltdGFiLmJhc2U7IHN5bSA8IHN5bXRhYi5saW1pdDsgKytzeW0pCi0JewotCSAgZm9yIChhcmMgPSBzeW0tPmNnLmNoaWxkcmVuOyBhcmM7IGFyYyA9IGFyYy0+bmV4dF9jaGlsZCkKLQkgICAgewotCSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPnBhcmVudC0+YWRkciwKLQkJICAgICAgIChiZmRfYnl0ZSAqKSByYXdfYXJjLmZyb21fcGMpOwotCSAgICAgIHB1dF92bWEgKGNvcmVfYmZkLCBhcmMtPmNoaWxkLT5hZGRyLAotCQkgICAgICAgKGJmZF9ieXRlICopIHJhd19hcmMuc2VsZl9wYyk7Ci0JICAgICAgYmZkX3B1dF8zMiAoY29yZV9iZmQsIGFyYy0+Y291bnQsIChiZmRfYnl0ZSAqKSByYXdfYXJjLmNvdW50KTsKLQkgICAgICBpZiAoZndyaXRlICgmcmF3X2FyYywgc2l6ZW9mIChyYXdfYXJjKSwgMSwgb2ZwKSAhPSAxKQotCQl7Ci0JCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JCSAgZG9uZSAoMSk7Ci0JCX0KLQkgICAgICBEQkcgKFNBTVBMRURFQlVHLAotCQkgICBwcmludGYgKCJbZHVtcHN1bV0gZnJvbXBjIDB4JWx4IHNlbGZwYyAweCVseCBjb3VudCAlbHVcbiIsCi0JCQkgICBhcmMtPnBhcmVudC0+YWRkciwgYXJjLT5jaGlsZC0+YWRkciwgYXJjLT5jb3VudCkpOwotCSAgICB9Ci0JfQotICAgICAgZmNsb3NlIChvZnApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGRvbid0IGtub3cgaG93IHRvIGRlYWwgd2l0aCBmaWxlIGZvcm1hdCAlZFxuIiksCi0JICAgICAgIHdob2FtaSwgZmlsZV9mb3JtYXQpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9pby5oIGIvZ3Byb2YvZ21vbl9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjI1N2E0Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dtb25faW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSNpZm5kZWYgZ21vbl9pb19oCi0jZGVmaW5lIGdtb25faW9faAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ21vbi5oIgotCi0jZGVmaW5lIElOUFVUX0hJU1RPR1JBTQkJKDE8PDApCi0jZGVmaW5lIElOUFVUX0NBTExfR1JBUEgJKDE8PDEpCi0jZGVmaW5lIElOUFVUX0JCX0NPVU5UUwkJKDE8PDIpCi0KLWV4dGVybiBpbnQgZ21vbl9pbnB1dDsJCS8qIHdoYXQgaW5wdXQgZGlkIHdlIHNlZT8gKi8KLWV4dGVybiBpbnQgZ21vbl9maWxlX3ZlcnNpb247CS8qIGZpbGUgdmVyc2lvbiBhcmUgd2UgZGVhbGluZyB3aXRoICovCi0KLWV4dGVybiBiZmRfdm1hIGdldF92bWEgUEFSQU1TICgoYmZkICogYWJmZCwgYmZkX2J5dGUgKiBhZGRyKSk7Ci1leHRlcm4gdm9pZCBwdXRfdm1hIFBBUkFNUyAoKGJmZCAqIGFiZmQsIGJmZF92bWEgdmFsLCBiZmRfYnl0ZSAqIGFkZHIpKTsKLQotZXh0ZXJuIHZvaWQgZ21vbl9vdXRfcmVhZCBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotZXh0ZXJuIHZvaWQgZ21vbl9vdXRfd3JpdGUgUEFSQU1TICgoY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLQotI2VuZGlmIC8qIGdtb25faW9faCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ21vbl9vdXQuaCBiL2dwcm9mL2dtb25fb3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNDRmYjUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ21vbl9vdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgc3BlY2lmaWVzIHRoZSBmb3JtYXQgb2YgZ21vbi5vdXQgZmlsZXMuICBJdCBzaG91bGQgaGF2ZQotICogYXMgZmV3IGV4dGVybmFsIGRlcGVuZGVuY2llcyBhcyBwb3NzaWJsZSBhcyBpdCBpcyBnb2luZyB0byBiZQotICogaW5jbHVkZWQgaW4gbWFueSBkaWZmZXJlbnQgcHJvZ3JhbXMuICBUaGF0IGlzLCBtaW5pbWl6ZSB0aGUKLSAqIG51bWJlciBvZiAjaW5jbHVkZSdzLgotICoKLSAqIEEgZ21vbi5vdXQgZmlsZSBjb25zaXN0cyBvZiBhIGhlYWRlciAoZGVmaW5lZCBieSBnbW9uX2hkcikgZm9sbG93ZWQKLSAqIGJ5IGEgc2VxdWVuY2Ugb2YgcmVjb3Jkcy4gIEVhY2ggcmVjb3JkIHN0YXJ0cyB3aXRoIGEgb25lLWJ5dGUgdGFnCi0gKiBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiByZWNvcmRzLCBmb2xsb3dlZCBieSByZWNvcmRzIHNwZWNpZmljIGRhdGEuCi0gKi8KLSNpZm5kZWYgZ21vbl9vdXRfaAotI2RlZmluZSBnbW9uX291dF9oCi0KLSNkZWZpbmUJR01PTl9NQUdJQwkiZ21vbiIJLyogbWFnaWMgY29va2llICovCi0jZGVmaW5lIEdNT05fVkVSU0lPTgkxCS8qIHZlcnNpb24gbnVtYmVyICovCi0KLS8qCi0gKiBSYXcgaGVhZGVyIGFzIGl0IGFwcGVhcnMgb24gZmlsZSAod2l0aG91dCBwYWRkaW5nKToKLSAqLwotc3RydWN0IGdtb25faGRyCi0gIHsKLSAgICBjaGFyIGNvb2tpZVs0XTsKLSAgICBjaGFyIHZlcnNpb25bNF07Ci0gICAgY2hhciBzcGFyZVszICogNF07Ci0gIH07Ci0KLS8qIHR5cGVzIG9mIHJlY29yZHMgaW4gdGhpcyBmaWxlOiAqLwotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBHTU9OX1RBR19USU1FX0hJU1QgPSAwLCBHTU9OX1RBR19DR19BUkMgPSAxLCBHTU9OX1RBR19CQl9DT1VOVCA9IDIKLSAgfQotR01PTl9SZWNvcmRfVGFnOwotCi1zdHJ1Y3QgZ21vbl9oaXN0X2hkcgotICB7Ci0gICAgY2hhciBsb3dfcGNbc2l6ZW9mIChjaGFyKildOwkvKiBiYXNlIHBjIGFkZHJlc3Mgb2Ygc2FtcGxlIGJ1ZmZlciAqLwotICAgIGNoYXIgaGlnaF9wY1tzaXplb2YgKGNoYXIqKV07CS8qIG1heCBwYyBhZGRyZXNzIG9mIHNhbXBsZWQgYnVmZmVyICovCi0gICAgY2hhciBoaXN0X3NpemVbNF07CQkJLyogc2l6ZSBvZiBzYW1wbGUgYnVmZmVyICovCi0gICAgY2hhciBwcm9mX3JhdGVbNF07CQkJLyogcHJvZmlsaW5nIGNsb2NrIHJhdGUgKi8KLSAgICBjaGFyIGRpbWVuWzE1XTsJCQkvKiBwaHlzLiBkaW0uLCB1c3VhbGx5ICJzZWNvbmRzIiAqLwotICAgIGNoYXIgZGltZW5fYWJicmV2OwkJCS8qIHVzdWFsbHkgJ3MnIGZvciAic2Vjb25kcyIgKi8KLSAgfTsKLQotc3RydWN0IGdtb25fY2dfYXJjX3JlY29yZAotICB7Ci0gICAgY2hhciBmcm9tX3BjW3NpemVvZiAoY2hhciopXTsJLyogYWRkcmVzcyB3aXRoaW4gY2FsbGVyJ3MgYm9keSAqLwotICAgIGNoYXIgc2VsZl9wY1tzaXplb2YgKGNoYXIqKV07CS8qIGFkZHJlc3Mgd2l0aGluIGNhbGxlZSdzIGJvZHkgKi8KLSAgICBjaGFyIGNvdW50WzRdOwkJCS8qIG51bWJlciBvZiBhcmMgdHJhdmVyc2FscyAqLwotICB9OwotCi0jZW5kaWYgLyogZ21vbl9vdXRfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuMSBiL2dwcm9mL2dwcm9mLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzM0ZGEuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuMQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0uXCIgQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0uXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS5cIgotLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZCBwcm92aWRlZAotLlwiIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0IG5vdGljZSBhbmQKLS5cIiBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkgdGhlIGZvbGxvd2luZwotLlwiIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLS5cIiBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycgaW4gdGhlCi0uXCIgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIGFuZCBpbgotLlwiIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KLS5cIiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKLS5cIiBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0Ci0uXCIgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKLS5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0uXCIKLS5cIiAgICAgQCgjKWdwcm9mLjEJNi42IChCZXJrZWxleSkgNy8yNC85MAotLlwiCi0uVEggR1BST0YgMSAiSmFudWFyeSAyOSwgMTk5MyIKLS5TSCBOQU1FCi1ncHJvZiBcLSBkaXNwbGF5IGNhbGwgZ3JhcGggcHJvZmlsZSBkYXRhCi0uU0ggU1lOT1BTSVMKLS5CIGdwcm9mIFsgXC1hYmNzeiBdIFsgXC1lfFwtRQotLkkgbmFtZQotLkIgXSBbIFwtZnxcLUYgCi0uSSBuYW1lCi0uQiBdIAotLkIgWyBcLWsKLS5JIGZyb21uYW1lIHRvbmFtZQotLkIgXSBbIAotLkkgb2JqZmlsZQotLkIgWyAKLS5JIGdtb24ub3V0Ci0uQiBdIAotLkIgXSAKLS5TSCBERVNDUklQVElPTgotLkIgZ3Byb2YKLXByb2R1Y2VzIGFuIGV4ZWN1dGlvbiBwcm9maWxlIG9mIEMsIFBhc2NhbCwgb3IgRm9ydHJhbjc3IHByb2dyYW1zLgotVGhlIGVmZmVjdCBvZiBjYWxsZWQgcm91dGluZXMgaXMgaW5jb3Jwb3JhdGVkIGluIHRoZSBwcm9maWxlIG9mIGVhY2ggY2FsbGVyLgotVGhlIHByb2ZpbGUgZGF0YSBpcyB0YWtlbiBmcm9tIHRoZSBjYWxsIGdyYXBoIHByb2ZpbGUgZmlsZQotXCYoYGdtb24ub3V0JyBkZWZhdWx0KSB3aGljaCBpcyBjcmVhdGVkIGJ5IHByb2dyYW1zCi10aGF0IGFyZSBjb21waWxlZCB3aXRoIHRoZQotLkIgXC1wZwotb3B0aW9uIG9mCi0uQlIgY2MgKCAxICkgLAotLkJSIHBjICggMSApICwKLWFuZAotLkJSIGY3NyAoIDEgKSAuCi1UaGUKLS5CIFwtcGcKLW9wdGlvbiBhbHNvIGxpbmtzIGluIHZlcnNpb25zIG9mIHRoZSBsaWJyYXJ5IHJvdXRpbmVzCi10aGF0IGFyZSBjb21waWxlZCBmb3IgcHJvZmlsaW5nLgotLkIgR3Byb2YKLXJlYWRzIHRoZSBnaXZlbiBvYmplY3QgZmlsZSAodGhlIGRlZmF1bHQgaXMgYGEub3V0JykKLWFuZCBlc3RhYmxpc2hlcyB0aGUgcmVsYXRpb24gYmV0d2VlbiBpdHMgc3ltYm9sIHRhYmxlCi1hbmQgdGhlIGNhbGwgZ3JhcGggcHJvZmlsZSBmcm9tIGBnbW9uLm91dCcuCi1JZiBtb3JlIHRoYW4gb25lIHByb2ZpbGUgZmlsZSBpcyBzcGVjaWZpZWQsCi10aGUKLS5CIGdwcm9mCi1vdXRwdXQgc2hvd3MgdGhlIHN1bSBvZiB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBpbiB0aGUgZ2l2ZW4gcHJvZmlsZSBmaWxlcy4KLS5QUAotLkIgR3Byb2YKLWNhbGN1bGF0ZXMgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIGVhY2ggcm91dGluZS4KLU5leHQsIHRoZXNlIHRpbWVzIGFyZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBlZGdlcyBvZiB0aGUgY2FsbCBncmFwaC4KLUN5Y2xlcyBhcmUgZGlzY292ZXJlZCwgYW5kIGNhbGxzIGludG8gYSBjeWNsZSBhcmUgbWFkZSB0byBzaGFyZSB0aGUgdGltZQotb2YgdGhlIGN5Y2xlLgotVGhlIGZpcnN0IGxpc3Rpbmcgc2hvd3MgdGhlIGZ1bmN0aW9ucwotc29ydGVkIGFjY29yZGluZyB0byB0aGUgdGltZSB0aGV5IHJlcHJlc2VudAotaW5jbHVkaW5nIHRoZSB0aW1lIG9mIHRoZWlyIGNhbGwgZ3JhcGggZGVzY2VuZGFudHMuCi1CZWxvdyBlYWNoIGZ1bmN0aW9uIGVudHJ5IGlzIHNob3duIGl0cyAoZGlyZWN0KSBjYWxsIGdyYXBoIGNoaWxkcmVuLAotYW5kIGhvdyB0aGVpciB0aW1lcyBhcmUgcHJvcGFnYXRlZCB0byB0aGlzIGZ1bmN0aW9uLgotQSBzaW1pbGFyIGRpc3BsYXkgYWJvdmUgdGhlIGZ1bmN0aW9uIHNob3dzIGhvdyB0aGlzIGZ1bmN0aW9uJ3MgdGltZSBhbmQgdGhlCi10aW1lIG9mIGl0cyBkZXNjZW5kYW50cyBpcyBwcm9wYWdhdGVkIHRvIGl0cyAoZGlyZWN0KSBjYWxsIGdyYXBoIHBhcmVudHMuCi0uUFAKLUN5Y2xlcyBhcmUgYWxzbyBzaG93biwgd2l0aCBhbiBlbnRyeSBmb3IgdGhlIGN5Y2xlIGFzIGEgd2hvbGUgYW5kCi1hIGxpc3Rpbmcgb2YgdGhlIG1lbWJlcnMgb2YgdGhlIGN5Y2xlIGFuZCB0aGVpciBjb250cmlidXRpb25zIHRvIHRoZQotdGltZSBhbmQgY2FsbCBjb3VudHMgb2YgdGhlIGN5Y2xlLgotLlBQCi1TZWNvbmQsIGEgZmxhdCBwcm9maWxlIGlzIGdpdmVuLAotc2ltaWxhciB0byB0aGF0IHByb3ZpZGVkIGJ5Ci0uQlIgcHJvZiAoIDEgKSAgLgotVGhpcyBsaXN0aW5nIGdpdmVzIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZXMsIHRoZSBjYWxsIGNvdW50cywKLXRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGUgY2FsbCBzcGVudCBpbiB0aGUgcm91dGluZSBpdHNlbGYsIGFuZAotdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoZSBjYWxsIHNwZW50IGluIHRoZSByb3V0aW5lIGl0c2VsZiBpbmNsdWRpbmcKLWl0cyBkZXNjZW5kYW50cy4KLS5QUAotRmluYWxseSwgYW4gaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWVzIGlzIHByb3ZpZGVkLgotLlNIIE9QVElPTlMKLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgotLlRQCi0uQiBcLWEKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHN0YXRpY2FsbHkgZGVjbGFyZWQgZnVuY3Rpb25zLgotSWYgdGhpcyBvcHRpb24gaXMgZ2l2ZW4sIGFsbCByZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGljIGZ1bmN0aW9uCi0oZS5nLiwgdGltZSBzYW1wbGVzLCBjYWxscyB0byBvdGhlciBmdW5jdGlvbnMsIGNhbGxzIGZyb20gb3RoZXIgZnVuY3Rpb25zKQotYmVsb25ncyB0byB0aGUgZnVuY3Rpb24gbG9hZGVkIGp1c3QgYmVmb3JlIHRoZSBzdGF0aWMgZnVuY3Rpb24gaW4gdGhlCi1cJmBvYmpmaWxlJyBmaWxlLgotLlRQCi0uQiBcLWIKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIGEgZGVzY3JpcHRpb24gb2YgZWFjaCBmaWVsZCBpbiB0aGUgcHJvZmlsZS4KLS5UUAotLkIgXC1jCi10aGUgc3RhdGljIGNhbGwgZ3JhcGggb2YgdGhlIHByb2dyYW0gaXMgZGlzY292ZXJlZCBieSBhIGhldXJpc3RpYwotdGhhdCBleGFtaW5lcyB0aGUgdGV4dCBzcGFjZSBvZiB0aGUgb2JqZWN0IGZpbGUuCi1TdGF0aWMtb25seSBwYXJlbnRzIG9yIGNoaWxkcmVuIGFyZSBzaG93bgotd2l0aCBjYWxsIGNvdW50cyBvZiAwLgotLlRQCi0uQkkgIlwtZSAiIG5hbWUKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IGZvciByb3V0aW5lCi0uSSBuYW1lCi1hbmQgYWxsIGl0cyBkZXNjZW5kYW50cwotKHVubGVzcyB0aGV5IGhhdmUgb3RoZXIgYW5jZXN0b3JzIHRoYXQgYXJlbid0IHN1cHByZXNzZWQpLgotTW9yZSB0aGFuIG9uZQotLkIgXC1lCi1vcHRpb24gbWF5IGJlIGdpdmVuLgotT25seSBvbmUKLS5JIG5hbWUKLW1heSBiZSBnaXZlbiB3aXRoIGVhY2gKLS5CIFwtZQotb3B0aW9uLgotLlRQCi0uQkkgIlwtRSAiIG5hbWUKLXN1cHByZXNzZXMgdGhlIHByaW50aW5nIG9mIHRoZSBncmFwaCBwcm9maWxlIGVudHJ5IGZvciByb3V0aW5lCi0uSSBuYW1lCi0oYW5kIGl0cyBkZXNjZW5kYW50cykgYXMKLS5CIFwtZSAgLAotYWJvdmUsIGFuZCBhbHNvIGV4Y2x1ZGVzIHRoZSB0aW1lIHNwZW50IGluCi0uSSBuYW1lCi0oYW5kIGl0cyBkZXNjZW5kYW50cykgZnJvbSB0aGUgdG90YWwgYW5kIHBlcmNlbnRhZ2UgdGltZSBjb21wdXRhdGlvbnMuCi0oRm9yIGV4YW1wbGUsCi0uQkkgIlwtRSAiIG1jb3VudAotLkJJICJcLUUgIiBtY2xlYW51cAotaXMgdGhlIGRlZmF1bHQuKQotLlRQCi0uQkkgIlwtZiAiIG5hbWUKLXByaW50cyB0aGUgZ3JhcGggcHJvZmlsZSBlbnRyeSBvZiBvbmx5IHRoZSBzcGVjaWZpZWQgcm91dGluZQotLkkgbmFtZQotYW5kIGl0cyBkZXNjZW5kYW50cy4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtZgotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lCi0uSSBuYW1lCi1tYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLWYKLW9wdGlvbi4KLS5UUAotLkJJICJcLUYgIiBuYW1lCi1wcmludHMgdGhlIGdyYXBoIHByb2ZpbGUgZW50cnkgb2Ygb25seSB0aGUgcm91dGluZQotLkkgbmFtZQotYW5kIGl0cyBkZXNjZW5kYW50cyAoYXMKLS5CIFwtZiAsCi1hYm92ZSkgYW5kIGFsc28gdXNlcyBvbmx5IHRoZSB0aW1lcyBvZiB0aGUgcHJpbnRlZCByb3V0aW5lcwotaW4gdG90YWwgdGltZSBhbmQgcGVyY2VudGFnZSBjb21wdXRhdGlvbnMuCi1Nb3JlIHRoYW4gb25lCi0uQiBcLUYKLW9wdGlvbiBtYXkgYmUgZ2l2ZW4uCi1Pbmx5IG9uZQotLkkgbmFtZQotbWF5IGJlIGdpdmVuIHdpdGggZWFjaAotLkIgXC1GCi1vcHRpb24uCi1UaGUKLS5CIFwtRgotb3B0aW9uCi1vdmVycmlkZXMKLXRoZQotLkIgXC1FCi1vcHRpb24uCi0uVFAKLS5CSSAiXC1rICIgImZyb21uYW1lIHRvbmFtZSIKLXdpbGwgZGVsZXRlIGFueSBhcmNzIGZyb20gcm91dGluZQotLkkgZnJvbW5hbWUKLXRvIHJvdXRpbmUKLS5JUiB0b25hbWUgIC4KLVRoaXMgY2FuIGJlIHVzZWQgdG8gYnJlYWsgdW5kZXNpcmVkIGN5Y2xlcy4KLU1vcmUgdGhhbiBvbmUKLS5CIFwtawotb3B0aW9uIG1heSBiZSBnaXZlbi4KLU9ubHkgb25lIHBhaXIgb2Ygcm91dGluZSBuYW1lcyBtYXkgYmUgZ2l2ZW4gd2l0aCBlYWNoCi0uQiBcLWsKLW9wdGlvbi4KLS5UUAotLkIgXC1zCi1hIHByb2ZpbGUgZmlsZSBgZ21vbi5zdW0nIGlzIHByb2R1Y2VkIHRoYXQgcmVwcmVzZW50cwotdGhlIHN1bSBvZiB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBpbiBhbGwgdGhlIHNwZWNpZmllZCBwcm9maWxlIGZpbGVzLgotVGhpcyBzdW1tYXJ5IHByb2ZpbGUgZmlsZSBtYXkgYmUgZ2l2ZW4gdG8gbGF0ZXIKLWV4ZWN1dGlvbnMgb2YgZ3Byb2YgKHByb2JhYmx5IGFsc28gd2l0aCBhCi0uQlIgXC1zICApCi10byBhY2N1bXVsYXRlIHByb2ZpbGUgZGF0YSBhY3Jvc3Mgc2V2ZXJhbCBydW5zIG9mIGFuIGBvYmpmaWxlJyBmaWxlLgotLlRQCi0uQiAtdgotcHJpbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgZ3Byb2YsIGFuZCB0aGVuIGV4aXRzLgotLlRQCi0uQiAtegotZGlzcGxheXMgcm91dGluZXMgdGhhdCBoYXZlIHplcm8gdXNhZ2UgKGFzIHNob3duIGJ5IGNhbGwgY291bnRzCi1hbmQgYWNjdW11bGF0ZWQgdGltZSkuCi1UaGlzIGlzIHVzZWZ1bCB3aXRoIHRoZQotLkIgXC1jCi1vcHRpb24gZm9yIGRpc2NvdmVyaW5nIHdoaWNoIHJvdXRpbmVzIHdlcmUgbmV2ZXIgY2FsbGVkLgotLlBQCi0uU0ggRklMRVMKLS50YSBcdydnbW9uLnN1bSAndQotYS5vdXQJdGhlIG5hbWVsaXN0IGFuZCB0ZXh0IHNwYWNlLgotLmJyCi1nbW9uLm91dAlkeW5hbWljIGNhbGwgZ3JhcGggYW5kIHByb2ZpbGUuCi0uYnIKLWdtb24uc3VtIHN1bW1hcml6ZWQgZHluYW1pYyBjYWxsIGdyYXBoIGFuZCBwcm9maWxlLgotLlNIIFNFRSBBTFNPCi0uQlIgbW9uaXRvciAoIDMgKSAsCi0uQlIgcHJvZmlsICggMiApICwKLS5CUiBjYyAoIDEgKSAsCi0uQlIgcHJvZiAoIDEgKQotLnNwCi1gYEFuIEV4ZWN1dGlvbiBQcm9maWxlciBmb3IgTW9kdWxhciBQcm9ncmFtcycnLAotYnkgUy4gR3JhaGFtLCBQLiBLZXNzbGVyLCBNLiBNY0t1c2ljazsKLS5JCi1Tb2Z0d2FyZSBcLSBQcmFjdGljZSBhbmQgRXhwZXJpZW5jZSwKLVZvbC4gMTMsIHBwLiA2NzEtNjg1LCAxOTgzLgotLnNwCi1gYGdwcm9mOiBBIENhbGwgR3JhcGggRXhlY3V0aW9uIFByb2ZpbGVyJycsCi1ieSBTLiBHcmFoYW0sIFAuIEtlc3NsZXIsIE0uIE1jS3VzaWNrOwotLkkKLVByb2NlZWRpbmdzIG9mIHRoZSBTSUdQTEFOICc4MiBTeW1wb3NpdW0gb24gQ29tcGlsZXIgQ29uc3RydWN0aW9uLAotU0lHUExBTiBOb3RpY2VzLCBWb2wuIDE3LCBObyAgNiwgcHAuIDEyMC0xMjYsIEp1bmUgMTk4Mi4KLS5TSCBISVNUT1JZCi0uQiBHcHJvZgotYXBwZWFyZWQgaW4gNC4yIEJTRC4KLS5TSCBCVUdTCi1UaGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHNhbXBsaW5nIGlzIHNob3duLCBidXQgcmVtYWlucwotc3RhdGlzdGljYWwgYXQgYmVzdC4KLVdlIGFzc3VtZSB0aGF0IHRoZSB0aW1lIGZvciBlYWNoIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uCi1jYW4gYmUgZXhwcmVzc2VkIGJ5IHRoZSB0b3RhbCB0aW1lIGZvciB0aGUgZnVuY3Rpb24gZGl2aWRlZAotYnkgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLgotVGh1cyB0aGUgdGltZSBwcm9wYWdhdGVkIGFsb25nIHRoZSBjYWxsIGdyYXBoIGFyY3MgdG8gdGhlIGZ1bmN0aW9uJ3MKLXBhcmVudHMgaXMgZGlyZWN0bHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdAotYXJjIGlzIHRyYXZlcnNlZC4KLS5QUAotUGFyZW50cyB0aGF0IGFyZSBub3QgdGhlbXNlbHZlcyBwcm9maWxlZCB3aWxsIGhhdmUgdGhlIHRpbWUgb2YKLXRoZWlyIHByb2ZpbGVkIGNoaWxkcmVuIHByb3BhZ2F0ZWQgdG8gdGhlbSwgYnV0IHRoZXkgd2lsbCBhcHBlYXIKLXRvIGJlIHNwb250YW5lb3VzbHkgaW52b2tlZCBpbiB0aGUgY2FsbCBncmFwaCBsaXN0aW5nLCBhbmQgd2lsbAotbm90IGhhdmUgdGhlaXIgdGltZSBwcm9wYWdhdGVkIGZ1cnRoZXIuCi1TaW1pbGFybHksIHNpZ25hbCBjYXRjaGVycywgZXZlbiB0aG91Z2ggcHJvZmlsZWQsIHdpbGwgYXBwZWFyCi10byBiZSBzcG9udGFuZW91cyAoYWx0aG91Z2ggZm9yIG1vcmUgb2JzY3VyZSByZWFzb25zKS4KLUFueSBwcm9maWxlZCBjaGlsZHJlbiBvZiBzaWduYWwgY2F0Y2hlcnMgc2hvdWxkIGhhdmUgdGhlaXIgdGltZXMKLXByb3BhZ2F0ZWQgcHJvcGVybHksIHVubGVzcyB0aGUgc2lnbmFsIGNhdGNoZXIgd2FzIGludm9rZWQgZHVyaW5nCi10aGUgZXhlY3V0aW9uIG9mIHRoZSBwcm9maWxpbmcgcm91dGluZSwgaW4gd2hpY2ggY2FzZSBhbGwgaXMgbG9zdC4KLS5QUAotVGhlIHByb2ZpbGVkIHByb2dyYW0gbXVzdCBjYWxsCi0uQlIgZXhpdCAoIDIgKQotb3IgcmV0dXJuIG5vcm1hbGx5IGZvciB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uIHRvIGJlIHNhdmVkCi1pbiB0aGUgYGdtb24ub3V0JyBmaWxlLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuYyBiL2dwcm9mL2dwcm9mLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTA0ODcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTk4IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqLwotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAiYmFzaWNfYmxvY2tzLmgiCi0jaW5jbHVkZSAiY2FsbF9ncmFwaC5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjZ19wcmludC5oIgotI2luY2x1ZGUgImNvcmVmaWxlLmgiCi0jaW5jbHVkZSAiZ21vbl9pby5oIgotI2luY2x1ZGUgImhlcnR6LmgiCi0jaW5jbHVkZSAiaGlzdC5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotY29uc3QgY2hhciAqd2hvYW1pOwotY29uc3QgY2hhciAqZnVuY3Rpb25fbWFwcGluZ19maWxlOwotY29uc3QgY2hhciAqYV9vdXRfbmFtZSA9IEFfT1VUTkFNRTsKLWxvbmcgaHogPSBIWl9XUk9ORzsKLQotLyoKLSAqIERlZmF1bHQgb3B0aW9ucyB2YWx1ZXM6Ci0gKi8KLWludCBkZWJ1Z19sZXZlbCA9IDA7Ci1pbnQgb3V0cHV0X3N0eWxlID0gMDsKLWludCBvdXRwdXRfd2lkdGggPSA4MDsKLWJvb2wgYnNkX3N0eWxlX291dHB1dCA9IEZBTFNFOwotYm9vbCBkZW1hbmdsZSA9IFRSVUU7Ci1ib29sIGRpc2NhcmRfdW5kZXJzY29yZXMgPSBUUlVFOwotYm9vbCBpZ25vcmVfZGlyZWN0X2NhbGxzID0gRkFMU0U7Ci1ib29sIGlnbm9yZV9zdGF0aWNfZnVuY3MgPSBGQUxTRTsKLWJvb2wgaWdub3JlX3plcm9zID0gVFJVRTsKLWJvb2wgbGluZV9ncmFudWxhcml0eSA9IEZBTFNFOwotYm9vbCBwcmludF9kZXNjcmlwdGlvbnMgPSBUUlVFOwotYm9vbCBwcmludF9wYXRoID0gRkFMU0U7Ci1ib29sIGlnbm9yZV9ub25fZnVuY3Rpb25zID0gRkFMU0U7Ci1GaWxlX0Zvcm1hdCBmaWxlX2Zvcm1hdCA9IEZGX0FVVE87Ci0KLWJvb2wgZmlyc3Rfb3V0cHV0ID0gVFJVRTsKLQotY2hhciBjb3B5cmlnaHRbXSA9Ci0gTl8oIkAoIykgQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cblwKLSBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIik7Ci0KLXN0YXRpYyBjaGFyICpnbW9uX25hbWUgPSBHTU9OTkFNRTsJLyogcHJvZmlsZSBmaWxlbmFtZSAqLwotCi1iZmQgKmFiZmQ7Ci0KLS8qCi0gKiBGdW5jdGlvbnMgdGhhdCBnZXQgZXhjbHVkZWQgYnkgZGVmYXVsdDoKLSAqLwotc3RhdGljIGNoYXIgKmRlZmF1bHRfZXhjbHVkZWRfbGlzdFtdID0KLXsKLSAgIl9ncHJvZl9tY291bnQiLCAibWNvdW50IiwgIl9tY291bnQiLCAiX19tY291bnQiLCAiX19tY291bnRfaW50ZXJuYWwiLAotICAiX19tY2xlYW51cCIsCi0gICI8bG9jb3JlPiIsICI8aGljb3JlPiIsCi0gIDAKLX07Ci0KLS8qIENvZGVzIHVzZWQgZm9yIHRoZSBsb25nIG9wdGlvbnMgd2l0aCBubyBzaG9ydCBzeW5vbnltcy4gIDE1MCBpc24ndAotICAgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0RFTUFOR0xFCQkoMTUwKQotI2RlZmluZSBPUFRJT05fTk9fREVNQU5HTEUJKE9QVElPTl9ERU1BTkdMRSArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KLXsKLSAgeyJsaW5lIiwgbm9fYXJndW1lbnQsIDAsICdsJ30sCi0gIHsibm8tc3RhdGljIiwgbm9fYXJndW1lbnQsIDAsICdhJ30sCi0gIHsiaWdub3JlLW5vbi1mdW5jdGlvbnMiLCBub19hcmd1bWVudCwgMCwgJ0QnfSwKLQotICAgIC8qIG91dHB1dCBzdHlsZXM6ICovCi0KLSAgeyJhbm5vdGF0ZWQtc291cmNlIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdBJ30sCi0gIHsibm8tYW5ub3RhdGVkLXNvdXJjZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnSid9LAotICB7ImZsYXQtcHJvZmlsZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAncCd9LAotICB7Im5vLWZsYXQtcHJvZmlsZSIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnUCd9LAotICB7ImdyYXBoIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdxJ30sCi0gIHsibm8tZ3JhcGgiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ1EnfSwKLSAgeyJleGVjLWNvdW50cyIsIG9wdGlvbmFsX2FyZ3VtZW50LCAwLCAnQyd9LAotICB7Im5vLWV4ZWMtY291bnRzIiwgb3B0aW9uYWxfYXJndW1lbnQsIDAsICdaJ30sCi0gIHsiZnVuY3Rpb24tb3JkZXJpbmciLCBub19hcmd1bWVudCwgMCwgJ3InfSwKLSAgeyJmaWxlLW9yZGVyaW5nIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdSJ30sCi0gIHsiZmlsZS1pbmZvIiwgbm9fYXJndW1lbnQsIDAsICdpJ30sCi0gIHsic3VtIiwgbm9fYXJndW1lbnQsIDAsICdzJ30sCi0KLSAgICAvKiB2YXJpb3VzIG9wdGlvbnMgdG8gYWZmZWN0IG91dHB1dDogKi8KLQotICB7ImFsbC1saW5lcyIsIG5vX2FyZ3VtZW50LCAwLCAneCd9LAotICB7ImRlbWFuZ2xlIiwgbm9fYXJndW1lbnQsIDAsIE9QVElPTl9ERU1BTkdMRX0sCi0gIHsibm8tZGVtYW5nbGUiLCBub19hcmd1bWVudCwgMCwgT1BUSU9OX05PX0RFTUFOR0xFfSwKLSAgeyJkaXJlY3RvcnktcGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnSSd9LAotICB7ImRpc3BsYXktdW51c2VkLWZ1bmN0aW9ucyIsIG5vX2FyZ3VtZW50LCAwLCAneid9LAotICB7Im1pbi1jb3VudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbSd9LAotICB7InByaW50LXBhdGgiLCBub19hcmd1bWVudCwgMCwgJ0wnfSwKLSAgeyJzZXBhcmF0ZS1maWxlcyIsIG5vX2FyZ3VtZW50LCAwLCAneSd9LAotICB7InN0YXRpYy1jYWxsLWdyYXBoIiwgbm9fYXJndW1lbnQsIDAsICdjJ30sCi0gIHsidGFibGUtbGVuZ3RoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICd0J30sCi0gIHsidGltZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnbid9LAotICB7Im5vLXRpbWUiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ04nfSwKLSAgeyJ3aWR0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndyd9LAotICAgIC8qCi0gICAgICogVGhlc2UgYXJlIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBvbmx5LiAgVGhlaXIgZnVuY3Rpb25hbGl0eQotICAgICAqIGlzIHByb3ZpZGVkIGJ5IHRoZSBvdXRwdXQgc3R5bGUgb3B0aW9ucyBhbHJlYWR5OgotICAgICAqLwotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZSd9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRSd9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnZid9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRid9LAotICB7IiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnayd9LAotCi0gICAgLyogbWlzY2VsbGFuZW91czogKi8KLQotICB7ImJyaWVmIiwgbm9fYXJndW1lbnQsIDAsICdiJ30sCi0gIHsiZGVidWciLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ2QnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsiZmlsZS1mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ08nfSwKLSAgeyJ0cmFkaXRpb25hbCIsIG5vX2FyZ3VtZW50LCAwLCAnVCd9LAotICB7InZlcnNpb24iLCBub19hcmd1bWVudCwgMCwgJ3YnfSwKLSAgezAsIG5vX2FyZ3VtZW50LCAwLCAwfQotfTsKLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKHVzYWdlLCAoc3RyZWFtLCBzdGF0dXMpLCBGSUxFICogc3RyZWFtIEFORCBpbnQgc3RhdHVzKQotewotICBmcHJpbnRmIChzdHJlYW0sIF8oIlwKLVVzYWdlOiAlcyBbLVthYmNEaGlsTHNUdnd4eXpdXSBbLVtBQ2VFZkZKbk5PcFBxUVpdW25hbWVdXSBbLUkgZGlyc11cblwKLQlbLWRbbnVtXV0gWy1rIGZyb20vdG9dIFstbSBtaW4tY291bnRdIFstdCB0YWJsZS1sZW5ndGhdXG5cCi0JWy0tW25vLV1hbm5vdGF0ZWQtc291cmNlWz1uYW1lXV0gWy0tW25vLV1leGVjLWNvdW50c1s9bmFtZV1dXG5cCi0JWy0tW25vLV1mbGF0LXByb2ZpbGVbPW5hbWVdXSBbLS1bbm8tXWdyYXBoWz1uYW1lXV1cblwKLQlbLS1bbm8tXXRpbWU9bmFtZV0gWy0tYWxsLWxpbmVzXSBbLS1icmllZl0gWy0tZGVidWdbPWxldmVsXV1cblwKLQlbLS1mdW5jdGlvbi1vcmRlcmluZ10gWy0tZmlsZS1vcmRlcmluZ11cblwKLQlbLS1kaXJlY3RvcnktcGF0aD1kaXJzXSBbLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnNdXG5cCi0JWy0tZmlsZS1mb3JtYXQ9bmFtZV0gWy0tZmlsZS1pbmZvXSBbLS1oZWxwXSBbLS1saW5lXSBbLS1taW4tY291bnQ9bl1cblwKLQlbLS1uby1zdGF0aWNdIFstLXByaW50LXBhdGhdIFstLXNlcGFyYXRlLWZpbGVzXVxuXAotCVstLXN0YXRpYy1jYWxsLWdyYXBoXSBbLS1zdW1dIFstLXRhYmxlLWxlbmd0aD1sZW5dIFstLXRyYWRpdGlvbmFsXVxuXAotCVstLXZlcnNpb25dIFstLXdpZHRoPW5dIFstLWlnbm9yZS1ub24tZnVuY3Rpb25zXVxuXAotCVstLWRlbWFuZ2xlXSBbLS1uby1kZW1hbmdsZV1cblwKLQlbaW1hZ2UtZmlsZV0gW3Byb2ZpbGUtZmlsZS4uLl1cbiIpLAotCSAgIHdob2FtaSk7Ci0gIGlmIChzdGF0dXMgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sIF8oIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotICBkb25lIChzdGF0dXMpOwotfQotCi0KLWludAotREVGVU4gKG1haW4sIChhcmdjLCBhcmd2KSwgaW50IGFyZ2MgQU5EIGNoYXIgKiphcmd2KQotewotICBjaGFyICoqc3AsICpzdHI7Ci0gIFN5bSAqKmNnID0gMDsKLSAgaW50IGNoLCB1c2VyX3NwZWNpZmllZCA9IDA7Ci0KLSNpZiBkZWZpbmVkIChIQVZFX1NFVExPQ0FMRSkgJiYgZGVmaW5lZCAoSEFWRV9MQ19NRVNTQUdFUykKLSAgc2V0bG9jYWxlIChMQ19NRVNTQUdFUywgIiIpOwotI2VuZGlmCi0gIGJpbmR0ZXh0ZG9tYWluIChQQUNLQUdFLCBMT0NBTEVESVIpOwotICB0ZXh0ZG9tYWluIChQQUNLQUdFKTsKLQotICB3aG9hbWkgPSBhcmd2WzBdOwotICB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUgKHdob2FtaSk7Ci0KLSAgd2hpbGUgKChjaCA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LAotCSJhQTo6YkJjQ2REOjplOkU6ZjpGOmhpSTpKOjprOmxMbTpuOjpOOjpPOnA6OlA6OnE6OlE6OnN0OlR2dzp4eXpaOjoiLAotCQkJICAgIGxvbmdfb3B0aW9ucywgMCkpCi0JICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGNoKQotCXsKLQljYXNlICdhJzoKLQkgIGlnbm9yZV9zdGF0aWNfZnVuY3MgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0FOTk8pOwotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQU5OT1RBVEVEX1NPVVJDRTsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIHByaW50X2Rlc2NyaXB0aW9ucyA9IEZBTFNFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQic6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfQ0FMTF9HUkFQSDsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICBicmVhazsKLQljYXNlICdjJzoKLQkgIGlnbm9yZV9kaXJlY3RfY2FsbHMgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnQyc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0VYRUMpOwotCSAgICB9Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9FWEVDX0NPVU5UUzsKLQkgIGJyZWFrOwotCWNhc2UgJ2QnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIGRlYnVnX2xldmVsIHw9IGF0b2kgKG9wdGFyZyk7Ci0JICAgICAgZGVidWdfbGV2ZWwgfD0gQU5ZREVCVUc7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGRlYnVnX2xldmVsID0gfjA7Ci0JICAgIH0KLQkgIERCRyAoQU5ZREVCVUcsIHByaW50ZiAoIlttYWluXSBkZWJ1Zy1sZXZlbD0weCV4XG4iLCBkZWJ1Z19sZXZlbCkpOwotI2lmbmRlZiBERUJVRwotCSAgcHJpbnRmIChfKCIlczogZGVidWdnaW5nIG5vdCBzdXBwb3J0ZWQ7IC1kIGlnbm9yZWRcbiIpLCB3aG9hbWkpOwotI2VuZGlmCS8qIERFQlVHICovCi0JICBicmVhazsKLQljYXNlICdEJzoKLQkgIGlnbm9yZV9ub25fZnVuY3Rpb25zID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ0UnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX1RJTUUpOwotCWNhc2UgJ2UnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0dSQVBIKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0YnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX1RJTUUpOwotCWNhc2UgJ2YnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBJTkNMX0dSQVBIKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2cnOgotCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0ZMQVQpOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfRkxBVCk7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCWNhc2UgJ2knOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0dNT05fSU5GTzsKLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0dNT05fSU5GTzsKLQkgIGJyZWFrOwotCWNhc2UgJ0knOgotCSAgc2VhcmNoX2xpc3RfYXBwZW5kICgmc3JjX3NlYXJjaF9saXN0LCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnSic6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0FOTk8pOwotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9BTk5PVEFURURfU09VUkNFOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlICdrJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9BUkNTKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2wnOgotCSAgbGluZV9ncmFudWxhcml0eSA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICdMJzoKLQkgIHByaW50X3BhdGggPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAnbSc6Ci0JICBiYl9taW5fY2FsbHMgPSAodW5zaWduZWQgbG9uZykgc3RydG91bCAob3B0YXJnLCAoY2hhciAqKikgTlVMTCwgMTApOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfVElNRSk7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9USU1FKTsKLQkgIGJyZWFrOwotCWNhc2UgJ08nOgotCSAgc3dpdGNoIChvcHRhcmdbMF0pCi0JICAgIHsKLQkgICAgY2FzZSAnYSc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9BVVRPOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdtJzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX01BR0lDOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdiJzoKLQkgICAgICBmaWxlX2Zvcm1hdCA9IEZGX0JTRDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnNCc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9CU0Q0NDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncCc6Ci0JICAgICAgZmlsZV9mb3JtYXQgPSBGRl9QUk9GOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVua25vd24gZmlsZSBmb3JtYXQgJXNcbiIpLAotCQkgICAgICAgb3B0YXJnLCB3aG9hbWkpOwotCSAgICAgIGRvbmUgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdwJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIElOQ0xfRkxBVCk7Ci0JICAgIH0KLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICBicmVhazsKLQljYXNlICdQJzoKLQkgIGlmIChvcHRhcmcpCi0JICAgIHsKLQkgICAgICBzeW1faWRfYWRkIChvcHRhcmcsIEVYQ0xfRkxBVCk7Ci0JICAgICAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgb3V0cHV0X3N0eWxlICY9IH5TVFlMRV9GTEFUX1BST0ZJTEU7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0ZMQVRfUFJPRklMRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3EnOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIGlmIChzdHJjaHIgKG9wdGFyZywgJy8nKSkKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9BUkNTKTsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHN5bV9pZF9hZGQgKG9wdGFyZywgSU5DTF9HUkFQSCk7Ci0JCX0KLQkgICAgfQotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgYnJlYWs7Ci0JY2FzZSAncic6Ci0JICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRlVOQ1RJT05fT1JERVI7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GVU5DVElPTl9PUkRFUjsKLQkgIGJyZWFrOwotCWNhc2UgJ1InOgotCSAgb3V0cHV0X3N0eWxlIHw9IFNUWUxFX0ZJTEVfT1JERVI7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9GSUxFX09SREVSOwotCSAgZnVuY3Rpb25fbWFwcGluZ19maWxlID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSAnUSc6Ci0JICBpZiAob3B0YXJnKQotCSAgICB7Ci0JICAgICAgaWYgKHN0cmNociAob3B0YXJnLCAnLycpKQotCQl7Ci0JCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0FSQ1MpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3ltX2lkX2FkZCAob3B0YXJnLCBFWENMX0dSQVBIKTsKLQkJfQotCSAgICAgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9DQUxMX0dSQVBIOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBvdXRwdXRfc3R5bGUgJj0gflNUWUxFX0NBTExfR1JBUEg7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0NBTExfR1JBUEg7Ci0JICBicmVhazsKLQljYXNlICdzJzoKLQkgIG91dHB1dF9zdHlsZSB8PSBTVFlMRV9TVU1NQVJZX0ZJTEU7Ci0JICB1c2VyX3NwZWNpZmllZCB8PSBTVFlMRV9TVU1NQVJZX0ZJTEU7Ci0JICBicmVhazsKLQljYXNlICd0JzoKLQkgIGJiX3RhYmxlX2xlbmd0aCA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAoYmJfdGFibGVfbGVuZ3RoIDwgMCkKLQkgICAgewotCSAgICAgIGJiX3RhYmxlX2xlbmd0aCA9IDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ1QnOgotCSAgYnNkX3N0eWxlX291dHB1dCA9IFRSVUU7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKF8oIkdOVSBncHJvZiAlc1xuIiksIFZFUlNJT04pOwotCSAgcHJpbnRmIChfKCJCYXNlZCBvbiBCU0QgZ3Byb2YsIGNvcHlyaWdodCAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS5cbiIpKTsKLQkgIHByaW50ZiAoXygiXAotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICBkb25lICgwKTsKLQljYXNlICd3JzoKLQkgIG91dHB1dF93aWR0aCA9IGF0b2kgKG9wdGFyZyk7Ci0JICBpZiAob3V0cHV0X3dpZHRoIDwgMSkKLQkgICAgewotCSAgICAgIG91dHB1dF93aWR0aCA9IDE7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgJ3gnOgotCSAgYmJfYW5ub3RhdGVfYWxsX2xpbmVzID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgJ3knOgotCSAgY3JlYXRlX2Fubm90YXRpb25fZmlsZXMgPSBUUlVFOwotCSAgYnJlYWs7Ci0JY2FzZSAneic6Ci0JICBpZ25vcmVfemVyb3MgPSBGQUxTRTsKLQkgIGJyZWFrOwotCWNhc2UgJ1onOgotCSAgaWYgKG9wdGFyZykKLQkgICAgewotCSAgICAgIHN5bV9pZF9hZGQgKG9wdGFyZywgRVhDTF9FWEVDKTsKLQkgICAgICBvdXRwdXRfc3R5bGUgfD0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIG91dHB1dF9zdHlsZSAmPSB+U1RZTEVfRVhFQ19DT1VOVFM7Ci0JICAgIH0KLQkgIHVzZXJfc3BlY2lmaWVkIHw9IFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERU1BTkdMRToKLQkgIGRlbWFuZ2xlID0gVFJVRTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0RFTUFOR0xFOgotCSAgZGVtYW5nbGUgPSBGQUxTRTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICB1c2FnZSAoc3RkZXJyLCAxKTsKLQl9Ci0gICAgfQotCi0gIC8qIERvbid0IGFsbG93IGJvdGggb3JkZXJpbmcgb3B0aW9ucywgdGhleSBtb2RpZnkgdGhlIGFyYyBkYXRhIGluLXBsYWNlLiAgKi8KLSAgaWYgKCh1c2VyX3NwZWNpZmllZCAmIFNUWUxFX0ZVTkNUSU9OX09SREVSKQotICAgICAgJiYgKHVzZXJfc3BlY2lmaWVkICYgU1RZTEVfRklMRV9PUkRFUikpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLF8oIlwKLSVzOiBPbmx5IG9uZSBvZiAtLWZ1bmN0aW9uLW9yZGVyaW5nIGFuZCAtLWZpbGUtb3JkZXJpbmcgbWF5IGJlIHNwZWNpZmllZC5cbiIpLAotCSAgICAgICB3aG9hbWkpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIC8qIC0tc3VtIGltcGxpZXMgLS1saW5lLCBvdGhlcndpc2Ugd2UnZCBsb3NlIGItYiBjb3VudHMgaW4gZ21vbi5zdW0gKi8KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX1NVTU1BUllfRklMRSkKLSAgICB7Ci0gICAgICBsaW5lX2dyYW51bGFyaXR5ID0gMTsKLSAgICB9Ci0KLSAgLyogYXBwZW5kIHZhbHVlIG9mIEdQUk9GX1BBVEggdG8gc291cmNlIHNlYXJjaCBsaXN0IGlmIHNldDogKi8KLSAgc3RyID0gKGNoYXIgKikgZ2V0ZW52ICgiR1BST0ZfUEFUSCIpOwotICBpZiAoc3RyKQotICAgIHsKLSAgICAgIHNlYXJjaF9saXN0X2FwcGVuZCAoJnNyY19zZWFyY2hfbGlzdCwgc3RyKTsKLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgYV9vdXRfbmFtZSA9IGFyZ3Zbb3B0aW5kKytdOwotICAgIH0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgZ21vbl9uYW1lID0gYXJndltvcHRpbmQrK107Ci0gICAgfQotCi0gIC8qCi0gICAqIFR1cm4gb2ZmIGRlZmF1bHQgZnVuY3Rpb25zOgotICAgKi8KLSAgZm9yIChzcCA9ICZkZWZhdWx0X2V4Y2x1ZGVkX2xpc3RbMF07ICpzcDsgc3ArKykKLSAgICB7Ci0gICAgICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfVElNRSk7Ci0gICAgICBzeW1faWRfYWRkICgqc3AsIEVYQ0xfR1JBUEgpOwotI2lmZGVmIF9fYWxwaGFfXwotICAgICAgc3ltX2lkX2FkZCAoKnNwLCBFWENMX0ZMQVQpOwotI2VuZGlmCi0gICAgfQotCi0gIC8qCi0gICAqIEZvciBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCBhbHNvIHdhbnQgdG8ga2VlcCB0aG9zZQotICAgKiBmdW5jdGlvbnMgb2ZmIHRoZSBmbGF0IHByb2ZpbGU6Ci0gICAqLwotICBpZiAobGluZV9ncmFudWxhcml0eSkKLSAgICB7Ci0gICAgICBmb3IgKHNwID0gJmRlZmF1bHRfZXhjbHVkZWRfbGlzdFswXTsgKnNwOyBzcCsrKQotCXsKLQkgIHN5bV9pZF9hZGQgKCpzcCwgRVhDTF9GTEFUKTsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIFJlYWQgc3ltYm9sIHRhYmxlIGZyb20gY29yZSBmaWxlOgotICAgKi8KLSAgY29yZV9pbml0IChhX291dF9uYW1lKTsKLQotICAvKgotICAgKiBJZiB3ZSBzaG91bGQgaWdub3JlIGRpcmVjdCBmdW5jdGlvbiBjYWxscywgd2UgbmVlZCB0byBsb2FkCi0gICAqIHRvIGNvcmUncyB0ZXh0LXNwYWNlOgotICAgKi8KLSAgaWYgKGlnbm9yZV9kaXJlY3RfY2FsbHMpCi0gICAgewotICAgICAgY29yZV9nZXRfdGV4dF9zcGFjZSAoY29yZV9iZmQpOwotICAgIH0KLQotICAvKgotICAgKiBDcmVhdGUgc3ltYm9scyBmcm9tIGNvcmUgaW1hZ2U6Ci0gICAqLwotICBpZiAobGluZV9ncmFudWxhcml0eSkKLSAgICB7Ci0gICAgICBjb3JlX2NyZWF0ZV9saW5lX3N5bXMgKGNvcmVfYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb3JlX2NyZWF0ZV9mdW5jdGlvbl9zeW1zIChjb3JlX2JmZCk7Ci0gICAgfQotCi0gIC8qCi0gICAqIFRyYW5zbGF0ZSBzeW0gc3BlY3MgaW50byBzeW1zOgotICAgKi8KLSAgc3ltX2lkX3BhcnNlICgpOwotCi0gIGlmIChmaWxlX2Zvcm1hdCA9PSBGRl9QUk9GKQotICAgIHsKLSNpZmRlZiBQUk9GX1NVUFBPUlRfSU1QTEVNRU5URUQKLSAgICAgIC8qCi0gICAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgbW9uLm91dCBmaWxlKHMpOgotICAgICAgICovCi0gICAgICBkbwotCXsKLQkgIG1vbl9vdXRfcmVhZCAoZ21vbl9uYW1lKTsKLQkgIGlmIChvcHRpbmQgPCBhcmdjKQotCSAgICB7Ci0JICAgICAgZ21vbl9uYW1lID0gYXJndltvcHRpbmRdOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKG9wdGluZCsrIDwgYXJnYyk7Ci0jZWxzZQotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICBfKCIlczogc29ycnksIGZpbGUgZm9ybWF0IGBwcm9mJyBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIiksCi0JICAgICAgIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSNlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qCi0gICAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgZ21vbi5vdXQgZmlsZShzKToKLSAgICAgICAqLwotICAgICAgZG8KLQl7Ci0JICBnbW9uX291dF9yZWFkIChnbW9uX25hbWUpOwotCSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JICAgIHsKLQkgICAgICBnbW9uX25hbWUgPSBhcmd2W29wdGluZF07Ci0JICAgIH0KLQl9Ci0gICAgICB3aGlsZSAob3B0aW5kKysgPCBhcmdjKTsKLSAgICB9Ci0KLSAgLyoKLSAgICogSWYgdXNlciBkaWQgbm90IHNwZWNpZnkgb3V0cHV0IHN0eWxlLCB0cnkgdG8gZ3Vlc3Mgc29tZXRoaW5nCi0gICAqIHJlYXNvbmFibGU6Ci0gICAqLwotICBpZiAob3V0cHV0X3N0eWxlID09IDApCi0gICAgewotICAgICAgaWYgKGdtb25faW5wdXQgJiAoSU5QVVRfSElTVE9HUkFNIHwgSU5QVVRfQ0FMTF9HUkFQSCkpCi0JewotCSAgb3V0cHV0X3N0eWxlID0gU1RZTEVfRkxBVF9QUk9GSUxFIHwgU1RZTEVfQ0FMTF9HUkFQSDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgb3V0cHV0X3N0eWxlID0gU1RZTEVfRVhFQ19DT1VOVFM7Ci0JfQotICAgICAgb3V0cHV0X3N0eWxlICY9IH51c2VyX3NwZWNpZmllZDsKLSAgICB9Ci0KLSAgLyoKLSAgICogRHVtcCBhIGdtb24uc3VtIGZpbGUgaWYgcmVxdWVzdGVkIChiZWZvcmUgYW55IG90aGVyIHByb2Nlc3NpbmchKToKLSAgICovCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9TVU1NQVJZX0ZJTEUpCi0gICAgewotICAgICAgZ21vbl9vdXRfd3JpdGUgKEdNT05TVU0pOwotICAgIH0KLQotICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0hJU1RPR1JBTSkKLSAgICB7Ci0gICAgICBoaXN0X2Fzc2lnbl9zYW1wbGVzICgpOwotICAgIH0KLQotICBpZiAoZ21vbl9pbnB1dCAmIElOUFVUX0NBTExfR1JBUEgpCi0gICAgewotICAgICAgY2cgPSBjZ19hc3NlbWJsZSAoKTsKLSAgICB9Ci0KLSAgLyogZG8gc29tZSBzaW1wbGUgc2FuaXR5IGNoZWNrczogKi8KLQotICBpZiAoKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZMQVRfUFJPRklMRSkKLSAgICAgICYmICEoZ21vbl9pbnB1dCAmIElOUFVUX0hJU1RPR1JBTSkpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogZ21vbi5vdXQgZmlsZSBpcyBtaXNzaW5nIGhpc3RvZ3JhbVxuIiksIHdob2FtaSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKChvdXRwdXRfc3R5bGUgJiBTVFlMRV9DQUxMX0dSQVBIKSAmJiAhKGdtb25faW5wdXQgJiBJTlBVVF9DQUxMX0dSQVBIKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgIF8oIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgY2FsbC1ncmFwaCBkYXRhXG4iKSwgd2hvYW1pKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICAvKiBvdXRwdXQgd2hhdGV2ZXIgdXNlciB3aGlzaGVzIHRvIHNlZTogKi8KLQotICBpZiAoY2cgJiYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0NBTExfR1JBUEgpICYmIGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgY2dfcHJpbnQgKGNnKTsJCS8qIHByaW50IHRoZSBkeW5hbWljIHByb2ZpbGUgKi8KLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0ZMQVRfUFJPRklMRSkKLSAgICB7Ci0gICAgICBoaXN0X3ByaW50ICgpOwkJLyogcHJpbnQgdGhlIGZsYXQgcHJvZmlsZSAqLwotICAgIH0KLQotICBpZiAoY2cgJiYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0NBTExfR1JBUEgpKQotICAgIHsKLSAgICAgIGlmICghYnNkX3N0eWxlX291dHB1dCkKLQl7Ci0JICBjZ19wcmludCAoY2cpOwkvKiBwcmludCB0aGUgZHluYW1pYyBwcm9maWxlICovCi0JfQotICAgICAgY2dfcHJpbnRfaW5kZXggKCk7Ci0gICAgfQotCi0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9FWEVDX0NPVU5UUykKLSAgICB7Ci0gICAgICBwcmludF9leGVjX2NvdW50cyAoKTsKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9zdHlsZSAmIFNUWUxFX0FOTk9UQVRFRF9TT1VSQ0UpCi0gICAgewotICAgICAgcHJpbnRfYW5ub3RhdGVkX3NvdXJjZSAoKTsKLSAgICB9Ci0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GVU5DVElPTl9PUkRFUikKLSAgICB7Ci0gICAgICBjZ19wcmludF9mdW5jdGlvbl9vcmRlcmluZyAoKTsKLSAgICB9Ci0gIGlmIChvdXRwdXRfc3R5bGUgJiBTVFlMRV9GSUxFX09SREVSKQotICAgIHsKLSAgICAgIGNnX3ByaW50X2ZpbGVfb3JkZXJpbmcgKCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZAotZG9uZSAoc3RhdHVzKQotICAgICBpbnQgc3RhdHVzOwotewotICBleGl0IChzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvZ3Byb2YuaCBiL2dwcm9mL2dwcm9mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNjJhZWUuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvZ3Byb2YuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGRpc3RyaWJ1dGlvbnMgcmV0YWluIHRoaXMgZW50aXJlIGNvcHlyaWdodAotICogbm90aWNlIGFuZCBjb21tZW50LCBhbmQgKDIpIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyaWVzIGRpc3BsYXkKLSAqIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OiAgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUKLSAqIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycycnCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaW4gYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCi0gKiBzb2Z0d2FyZS4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgotICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAqCi0gKiAgICAgIEAoIylncHJvZi5oICAgICA1LjkgKEJlcmtlbGV5KSA2LzEvOTAKLSAqLwotI2lmbmRlZiBncHJvZl9oCi0jZGVmaW5lIGdwcm9mX2gKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIEluY2x1ZGUgdGhlIEJGRCBzeXNkZXAuaCBmaWxlLiAgKi8KLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotLyogVW5kZWZpbmUgdGhlIEJGRCBQQUNLQUdFIGFuZCBWRVJTSU9OIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nIHRoZQotICAgZ3Byb2YgY29uZmlnLmggZmlsZS4gICovCi0jdW5kZWYgUEFDS0FHRQotI3VuZGVmIFZFUlNJT04KLS8qIEFsc28gdW5kZWZpbmUgQkZEJ3MgYF8nIG1hY3JvOyB3ZSBoYXZlIG91ciBvd24gZGVmaW5pdGlvbi4gICovCi0jdW5kZWYgXwotCi0jaW5jbHVkZSAiZ2NvbmZpZy5oIgotCi0jaWZuZGVmIE1JTgotI2RlZmluZSBNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0jaWZuZGVmIE1BWAotI2RlZmluZSBNQVgoYSxiKQkoKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLS8qIEFJWCBkZWZpbmVzIGh6IGFzIGEgbWFjcm8uICAqLwotI3VuZGVmIGh6Ci0KLSNpZm5kZWYgUEFUSF9NQVgKLSNkZWZpbmUgUEFUSF9NQVgJMTAyNAotI2VuZGlmCi0KLSNkZWZpbmUJQV9PVVROQU1FCSJhLm91dCIJLyogZGVmYXVsdCBjb3JlIGZpbGVuYW1lICovCi0jZGVmaW5lCUdNT05OQU1FCSJnbW9uLm91dCIJLyogZGVmYXVsdCBwcm9maWxlIGZpbGVuYW1lICovCi0jZGVmaW5lCUdNT05TVU0JCSJnbW9uLnN1bSIJLyogcHJvZmlsZSBzdW1tYXJ5IGZpbGVuYW1lICovCi0KLSNpZmRlZiBIQVZFX0xPQ0FMRV9ICi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBnZXR0ZXh0IChTdHJpbmcpCi0jIGlmZGVmIGdldHRleHRfbm9vcAotIyAgZGVmaW5lIE5fKFN0cmluZykgZ2V0dGV4dF9ub29wIChTdHJpbmcpCi0jIGVsc2UKLSMgIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jIGVuZGlmCi0jZWxzZQotLyogU3R1YnMgdGhhdCBkbyBzb21ldGhpbmcgY2xvc2UgZW5vdWdoLiAgKi8KLSMgZGVmaW5lIHRleHRkb21haW4oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZ2V0dGV4dChTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBkZ2V0dGV4dChEb21haW4sTWVzc2FnZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWluLE1lc3NhZ2UsVHlwZSkgKE1lc3NhZ2UpCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW4sRGlyZWN0b3J5KSAoRG9tYWluKQotIyBkZWZpbmUgXyhTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBOXyhTdHJpbmcpIChTdHJpbmcpCi0jZW5kaWYKLQotCi0vKgotICogVGhlc2UgbWF5IGFscmVhZHkgYmUgZGVmaW5lZCBvbiBzb21lIHN5c3RlbXMuICBXZSBjb3VsZCBwcm9iYWJseQotICoganVzdCB1c2UgdGhlIEJGRCB2ZXJzaW9ucyBvZiB0aGVzZSwgc2luY2UgQkZEIGhhcyBhbHJlYWR5IGRlYWx0Ci0gKiB3aXRoIHRoaXMgcHJvYmxlbS4KLSAqLwotI3VuZGVmIEZBTFNFCi0jZGVmaW5lCUZBTFNFCTAKLSN1bmRlZiBUUlVFCi0jZGVmaW5lCVRSVUUJMQotCi0jZGVmaW5lIFNUWUxFX0ZMQVRfUFJPRklMRQkoMTw8MCkKLSNkZWZpbmUgU1RZTEVfQ0FMTF9HUkFQSAkoMTw8MSkKLSNkZWZpbmUgU1RZTEVfU1VNTUFSWV9GSUxFCSgxPDwyKQotI2RlZmluZSBTVFlMRV9FWEVDX0NPVU5UUwkoMTw8MykKLSNkZWZpbmUgU1RZTEVfQU5OT1RBVEVEX1NPVVJDRQkoMTw8NCkKLSNkZWZpbmUgU1RZTEVfR01PTl9JTkZPCQkoMTw8NSkKLSNkZWZpbmUgU1RZTEVfRlVOQ1RJT05fT1JERVIJKDE8PDYpCi0jZGVmaW5lIFNUWUxFX0ZJTEVfT1JERVIJKDE8PDcpCi0KLSNkZWZpbmUJQU5ZREVCVUcJKDE8PDApCS8qICAgIDEgKi8KLSNkZWZpbmUJREZOREVCVUcJKDE8PDEpCS8qICAgIDIgKi8KLSNkZWZpbmUJQ1lDTEVERUJVRwkoMTw8MikJLyogICAgNCAqLwotI2RlZmluZQlBUkNERUJVRwkoMTw8MykJLyogICAgOCAqLwotI2RlZmluZQlUQUxMWURFQlVHCSgxPDw0KQkvKiAgIDE2ICovCi0jZGVmaW5lCVRJTUVERUJVRwkoMTw8NSkJLyogICAzMiAqLwotI2RlZmluZQlTQU1QTEVERUJVRwkoMTw8NikJLyogICA2NCAqLwotI2RlZmluZQlBT1VUREVCVUcJKDE8PDcpCS8qICAxMjggKi8KLSNkZWZpbmUJQ0FMTERFQlVHCSgxPDw4KQkvKiAgMjU2ICovCi0jZGVmaW5lCUxPT0tVUERFQlVHCSgxPDw5KQkvKiAgNTEyICovCi0jZGVmaW5lCVBST1BERUJVRwkoMTw8MTApCS8qIDEwMjQgKi8KLSNkZWZpbmUgQkJERUJVRwkJKDE8PDExKQkvKiAyMDQ4ICovCi0jZGVmaW5lIElEREVCVUcJCSgxPDwxMikJLyogNDA5NiAqLwotI2RlZmluZSBTUkNERUJVRwkoMTw8MTMpCS8qIDgxOTIgKi8KLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyhsLHMpCWlmIChkZWJ1Z19sZXZlbCAmIChsKSkge3M7fQotI2Vsc2UKLSNkZWZpbmUgREJHKGwscykKLSNlbmRpZgotCi10eXBlZGVmIGVudW0KLSAgewotICAgIEZGX0FVVE8gPSAwLCBGRl9NQUdJQywgRkZfQlNELCBGRl9CU0Q0NCwgRkZfUFJPRgotICB9Ci1GaWxlX0Zvcm1hdDsKLQotdHlwZWRlZiBpbnQgYm9vbDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBVTklUWzJdOwkvKiB1bml0IG9mIHByb2ZpbGluZyAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqd2hvYW1pOwkvKiBjb21tYW5kLW5hbWUsIGZvciBlcnJvciBtZXNzYWdlcyAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX21hcHBpbmdfZmlsZTsgLyogZmlsZSBtYXBwaW5nIGZ1bmN0aW9ucyB0byBmaWxlcyAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFfb3V0X25hbWU7CS8qIGNvcmUgZmlsZW5hbWUgKi8KLWV4dGVybiBsb25nIGh6OwkJCS8qIHRpY2tzIHBlciBzZWNvbmQgKi8KLQotLyoKLSAqIENvbW1hbmQtbGluZSBvcHRpb25zOgotICovCi1leHRlcm4gaW50IGRlYnVnX2xldmVsOwkJLyogZGVidWcgbGV2ZWwgKi8KLWV4dGVybiBpbnQgb3V0cHV0X3N0eWxlOwotZXh0ZXJuIGludCBvdXRwdXRfd2lkdGg7CS8qIGNvbnRyb2xzIGNvbHVtbiB3aWR0aCBpbiBpbmRleCAqLwotZXh0ZXJuIGJvb2wgYnNkX3N0eWxlX291dHB1dDsJLyogYXMgb3Bwb3NlZCB0byBGU0Ygc3R5bGUgb3V0cHV0ICovCi1leHRlcm4gYm9vbCBkZW1hbmdsZTsJCS8qIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcz8gKi8KLWV4dGVybiBib29sIGRpc2NhcmRfdW5kZXJzY29yZXM7CS8qIGRpc2NhcmQgbGVhZGluZyB1bmRlcnNjb3Jlcz8gKi8KLWV4dGVybiBib29sIGlnbm9yZV9kaXJlY3RfY2FsbHM7CS8qIGRvbid0IGNvdW50IGRpcmVjdCBjYWxscyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX3N0YXRpY19mdW5jczsJLyogc3VwcHJlc3Mgc3RhdGljIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX3plcm9zOwkvKiBpZ25vcmUgdW51c2VkIHN5bWJvbHMvZmlsZXMgKi8KLWV4dGVybiBib29sIGxpbmVfZ3JhbnVsYXJpdHk7CS8qIGZ1bmN0aW9uIG9yIGxpbmUgZ3JhbnVsYXJpdHk/ICovCi1leHRlcm4gYm9vbCBwcmludF9kZXNjcmlwdGlvbnM7CS8qIG91dHB1dCBwcm9maWxlIGRlc2NyaXB0aW9uICovCi1leHRlcm4gYm9vbCBwcmludF9wYXRoOwkJLyogcHJpbnQgcGF0aCBvciBqdXN0IGZpbGVuYW1lPyAqLwotZXh0ZXJuIGJvb2wgaWdub3JlX25vbl9mdW5jdGlvbnM7LyogSWdub3JlIG5vbi1mdW5jdGlvbiBzeW1ib2xzLiAgKi8KLQotZXh0ZXJuIEZpbGVfRm9ybWF0IGZpbGVfZm9ybWF0OwkvKiByZXF1ZXN0ZWQgZmlsZSBmb3JtYXQgKi8KLQotZXh0ZXJuIGJvb2wgZmlyc3Rfb3V0cHV0OwkvKiBubyBvdXRwdXQgc28gZmFyPyAqLwotCi1leHRlcm4gdm9pZCBkb25lIFBBUkFNUyAoKGludCBzdGF0dXMpKTsKLQotI2VuZGlmIC8qIGdwcm9mX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2dwcm9mLnRleGkgYi9ncHJvZi9ncHJvZi50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDYwNmI0Li4wMDAwMDAwCi0tLSBhL2dwcm9mL2dwcm9mLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDI4ICswLDAgQEAKLVxpbnB1dCB0ZXhpbmZvIEBjIC0qLXRleGluZm8tKi0KLUBzZXRmaWxlbmFtZSBncHJvZi5pbmZvCi1Ac2V0dGl0bGUgR05VIGdwcm9mCi1Ac2V0Y2hhcHRlcm5ld3BhZ2Ugb2RkCi0KLUBpZmluZm8KLUBjIFRoaXMgaXMgYSBkaXIuaW5mbyBmcmFnbWVudCB0byBzdXBwb3J0IHNlbWktYXV0b21hdGVkIGFkZGl0aW9uIG9mCi1AYyBtYW51YWxzIHRvIGFuIGluZm8gdHJlZS4gIHpvb0BjeWdudXMuY29tIGlzIGRldmVsb3BpbmcgdGhpcyBmYWNpbGl0eS4KLUBmb3JtYXQKLVNUQVJULUlORk8tRElSLUVOVFJZCi0qIGdwcm9mOiAoZ3Byb2YpLiAgICAgICAgICAgICAgICBQcm9maWxpbmcgeW91ciBwcm9ncmFtJ3MgZXhlY3V0aW9uCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBncHJvZiBwcm9maWxlciBvZiB0aGUgR05VIHN5c3RlbS4KLQotQ29weXJpZ2h0IChDKSAxOTg4LCAxOTkyLCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gbWFrZSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YKLXRoaXMgbWFudWFsIHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlCi1hcmUgcHJlc2VydmVkIG9uIGFsbCBjb3BpZXMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIHRoYXQgdGhlIGVudGlyZQotcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYSBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCBpZmluZm8KLQotQGZpbmFsb3V0Ci1Ac21hbGxib29rCi0KLUB0aXRsZXBhZ2UKLUB0aXRsZSBHTlUgZ3Byb2YKLUBzdWJ0aXRsZSBUaGUgQHNje2dudX0gUHJvZmlsZXIgCi1AYXV0aG9yIEpheSBGZW5sYXNvbiBhbmQgUmljaGFyZCBTdGFsbG1hbgotCi1AcGFnZQotCi1UaGlzIG1hbnVhbCBkZXNjcmliZXMgdGhlIEBzY3tnbnV9IHByb2ZpbGVyLCBAY29kZXtncHJvZn0sIGFuZCBob3cgeW91Ci1jYW4gdXNlIGl0IHRvIGRldGVybWluZSB3aGljaCBwYXJ0cyBvZiBhIHByb2dyYW0gYXJlIHRha2luZyBtb3N0IG9mIHRoZQotZXhlY3V0aW9uIHRpbWUuICBXZSBhc3N1bWUgdGhhdCB5b3Uga25vdyBob3cgdG8gd3JpdGUsIGNvbXBpbGUsIGFuZAotZXhlY3V0ZSBwcm9ncmFtcy4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSB3YXMgd3JpdHRlbiBieSBKYXkgRmVubGFzb24uCi0KLVRoaXMgbWFudWFsIHdhcyBlZGl0ZWQgSmFudWFyeSAxOTkzIGJ5IEplZmZyZXkgT3NpZXIKLWFuZCB1cGRhdGVkIFNlcHRlbWJlciAxOTk3IGJ5IEJyZW50IEJhY2NhbGEuCi0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk4OCwgMTk5MiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1AaWdub3JlCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcHJvY2VzcyB0aGlzIGZpbGUgdGhyb3VnaCBUZVggYW5kIHByaW50IHRoZQotcmVzdWx0cywgcHJvdmlkZWQgdGhlIHByaW50ZWQgZG9jdW1lbnQgY2FycmllcyBjb3B5aW5nIHBlcm1pc3Npb24KLW5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGUgcmVtb3ZhbCBvZiB0aGlzIHBhcmFncmFwaAotKHRoaXMgcGFyYWdyYXBoIG5vdCBiZWluZyByZWxldmFudCB0byB0aGUgcHJpbnRlZCBtYW51YWwpLgotCi1AZW5kIGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZSBlbnRpcmUKLXJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMgbWFudWFsCi1pbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgYXMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotCi1AZW5kIHRpdGxlcGFnZQotCi1AaWZpbmZvCi1Abm9kZSBUb3AKLUB0b3AgUHJvZmlsaW5nIGEgUHJvZ3JhbTogV2hlcmUgRG9lcyBJdCBTcGVuZCBJdHMgVGltZT8KLQotVGhpcyBtYW51YWwgZGVzY3JpYmVzIHRoZSBAc2N7Z251fSBwcm9maWxlciwgQGNvZGV7Z3Byb2Z9LCBhbmQgaG93IHlvdQotY2FuIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hpY2ggcGFydHMgb2YgYSBwcm9ncmFtIGFyZSB0YWtpbmcgbW9zdCBvZiB0aGUKLWV4ZWN1dGlvbiB0aW1lLiAgV2UgYXNzdW1lIHRoYXQgeW91IGtub3cgaG93IHRvIHdyaXRlLCBjb21waWxlLCBhbmQKLWV4ZWN1dGUgcHJvZ3JhbXMuICBAc2N7Z251fSBAY29kZXtncHJvZn0gd2FzIHdyaXR0ZW4gYnkgSmF5IEZlbmxhc29uLgotCi1UaGlzIG1hbnVhbCB3YXMgdXBkYXRlZCBBdWd1c3QgMTk5NyBieSBCcmVudCBCYWNjYWxhLgotCi1AbWVudQotKiBJbnRyb2R1Y3Rpb246OiAgICAgICAgV2hhdCBwcm9maWxpbmcgbWVhbnMsIGFuZCB3aHkgaXQgaXMgdXNlZnVsLgotCi0qIENvbXBpbGluZzo6ICAgICAgICAgICBIb3cgdG8gY29tcGlsZSB5b3VyIHByb2dyYW0gZm9yIHByb2ZpbGluZy4KLSogRXhlY3V0aW5nOjogICAgICAgICAgIEV4ZWN1dGluZyB5b3VyIHByb2dyYW0gdG8gZ2VuZXJhdGUgcHJvZmlsZSBkYXRhCi0qIEludm9raW5nOjogICAgICAgICAgICBIb3cgdG8gcnVuIEBjb2Rle2dwcm9mfSwgYW5kIGl0cyBvcHRpb25zCi0KLSogT3V0cHV0OjoJCUludGVycHJldGluZyBAY29kZXtncHJvZn0ncyBvdXRwdXQKLQotKiBJbmFjY3VyYWN5OjogICAgICAgICAgUG90ZW50aWFsIHByb2JsZW1zIHlvdSBzaG91bGQgYmUgYXdhcmUgb2YKLSogSG93IGRvIEk/OjogICAgICAgICAgIEFuc3dlcnMgdG8gY29tbW9uIHF1ZXN0aW9ucwotKiBJbmNvbXBhdGliaWxpdGllczo6ICAgKGJldHdlZW4gQHNje2dudX0gQGNvZGV7Z3Byb2Z9IGFuZCBVbml4IEBjb2Rle2dwcm9mfS4pCi0qIERldGFpbHM6OiAgICAgICAgICAgICBEZXRhaWxzIG9mIGhvdyBwcm9maWxpbmcgaXMgZG9uZQotQGVuZCBtZW51Ci1AZW5kIGlmaW5mbwotCi1Abm9kZSBJbnRyb2R1Y3Rpb24KLUBjaGFwdGVyIEludHJvZHVjdGlvbiB0byBQcm9maWxpbmcKLQotUHJvZmlsaW5nIGFsbG93cyB5b3UgdG8gbGVhcm4gd2hlcmUgeW91ciBwcm9ncmFtIHNwZW50IGl0cyB0aW1lIGFuZCB3aGljaAotZnVuY3Rpb25zIGNhbGxlZCB3aGljaCBvdGhlciBmdW5jdGlvbnMgd2hpbGUgaXQgd2FzIGV4ZWN1dGluZy4gIFRoaXMKLWluZm9ybWF0aW9uIGNhbiBzaG93IHlvdSB3aGljaCBwaWVjZXMgb2YgeW91ciBwcm9ncmFtIGFyZSBzbG93ZXIgdGhhbiB5b3UKLWV4cGVjdGVkLCBhbmQgbWlnaHQgYmUgY2FuZGlkYXRlcyBmb3IgcmV3cml0aW5nIHRvIG1ha2UgeW91ciBwcm9ncmFtCi1leGVjdXRlIGZhc3Rlci4gIEl0IGNhbiBhbHNvIHRlbGwgeW91IHdoaWNoIGZ1bmN0aW9ucyBhcmUgYmVpbmcgY2FsbGVkIG1vcmUKLW9yIGxlc3Mgb2Z0ZW4gdGhhbiB5b3UgZXhwZWN0ZWQuICBUaGlzIG1heSBoZWxwIHlvdSBzcG90IGJ1Z3MgdGhhdCBoYWQKLW90aGVyd2lzZSBiZWVuIHVubm90aWNlZC4KLQotU2luY2UgdGhlIHByb2ZpbGVyIHVzZXMgaW5mb3JtYXRpb24gY29sbGVjdGVkIGR1cmluZyB0aGUgYWN0dWFsIGV4ZWN1dGlvbgotb2YgeW91ciBwcm9ncmFtLCBpdCBjYW4gYmUgdXNlZCBvbiBwcm9ncmFtcyB0aGF0IGFyZSB0b28gbGFyZ2Ugb3IgdG9vCi1jb21wbGV4IHRvIGFuYWx5emUgYnkgcmVhZGluZyB0aGUgc291cmNlLiAgSG93ZXZlciwgaG93IHlvdXIgcHJvZ3JhbSBpcyBydW4KLXdpbGwgYWZmZWN0IHRoZSBpbmZvcm1hdGlvbiB0aGF0IHNob3dzIHVwIGluIHRoZSBwcm9maWxlIGRhdGEuICBJZiB5b3UKLWRvbid0IHVzZSBzb21lIGZlYXR1cmUgb2YgeW91ciBwcm9ncmFtIHdoaWxlIGl0IGlzIGJlaW5nIHByb2ZpbGVkLCBubwotcHJvZmlsZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhhdCBmZWF0dXJlLgotCi1Qcm9maWxpbmcgaGFzIHNldmVyYWwgc3RlcHM6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1Zb3UgbXVzdCBjb21waWxlIGFuZCBsaW5rIHlvdXIgcHJvZ3JhbSB3aXRoIHByb2ZpbGluZyBlbmFibGVkLgotQHhyZWZ7Q29tcGlsaW5nfS4KLQotQGl0ZW0KLVlvdSBtdXN0IGV4ZWN1dGUgeW91ciBwcm9ncmFtIHRvIGdlbmVyYXRlIGEgcHJvZmlsZSBkYXRhIGZpbGUuCi1AeHJlZntFeGVjdXRpbmd9LgotCi1AaXRlbQotWW91IG11c3QgcnVuIEBjb2Rle2dwcm9mfSB0byBhbmFseXplIHRoZSBwcm9maWxlIGRhdGEuCi1AeHJlZntJbnZva2luZ30uCi1AZW5kIGl0ZW1pemUKLQotVGhlIG5leHQgdGhyZWUgY2hhcHRlcnMgZXhwbGFpbiB0aGVzZSBzdGVwcyBpbiBncmVhdGVyIGRldGFpbC4KLQotU2V2ZXJhbCBmb3JtcyBvZiBvdXRwdXQgYXJlIGF2YWlsYWJsZSBmcm9tIHRoZSBhbmFseXNpcy4KLQotVGhlIEBkZm57ZmxhdCBwcm9maWxlfSBzaG93cyBob3cgbXVjaCB0aW1lIHlvdXIgcHJvZ3JhbSBzcGVudCBpbiBlYWNoIGZ1bmN0aW9uLAotYW5kIGhvdyBtYW55IHRpbWVzIHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZC4gIElmIHlvdSBzaW1wbHkgd2FudCB0byBrbm93Ci13aGljaCBmdW5jdGlvbnMgYnVybiBtb3N0IG9mIHRoZSBjeWNsZXMsIGl0IGlzIHN0YXRlZCBjb25jaXNlbHkgaGVyZS4KLUB4cmVme0ZsYXQgUHJvZmlsZX0uCi0KLVRoZSBAZGZue2NhbGwgZ3JhcGh9IHNob3dzLCBmb3IgZWFjaCBmdW5jdGlvbiwgd2hpY2ggZnVuY3Rpb25zIGNhbGxlZCBpdCwgd2hpY2gKLW90aGVyIGZ1bmN0aW9ucyBpdCBjYWxsZWQsIGFuZCBob3cgbWFueSB0aW1lcy4gIFRoZXJlIGlzIGFsc28gYW4gZXN0aW1hdGUKLW9mIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50IGluIHRoZSBzdWJyb3V0aW5lcyBvZiBlYWNoIGZ1bmN0aW9uLiAgVGhpcyBjYW4KLXN1Z2dlc3QgcGxhY2VzIHdoZXJlIHlvdSBtaWdodCB0cnkgdG8gZWxpbWluYXRlIGZ1bmN0aW9uIGNhbGxzIHRoYXQgdXNlIGEKLWxvdCBvZiB0aW1lLiAgQHhyZWZ7Q2FsbCBHcmFwaH0uCi0KLVRoZSBAZGZue2Fubm90YXRlZCBzb3VyY2V9IGxpc3RpbmcgaXMgYSBjb3B5IG9mIHRoZSBwcm9ncmFtJ3MKLXNvdXJjZSBjb2RlLCBsYWJlbGVkIHdpdGggdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgb2YgdGhlCi1wcm9ncmFtIHdhcyBleGVjdXRlZC4gIEB4cmVme0Fubm90YXRlZCBTb3VyY2V9LgotCi1UbyBiZXR0ZXIgdW5kZXJzdGFuZCBob3cgcHJvZmlsaW5nIHdvcmtzLCB5b3UgbWF5IHdpc2ggdG8gcmVhZAotYSBkZXNjcmlwdGlvbiBvZiBpdHMgaW1wbGVtZW50YXRpb24uCi1AeHJlZntJbXBsZW1lbnRhdGlvbn0uCi0KLUBub2RlIENvbXBpbGluZwotQGNoYXB0ZXIgQ29tcGlsaW5nIGEgUHJvZ3JhbSBmb3IgUHJvZmlsaW5nCi0KLVRoZSBmaXJzdCBzdGVwIGluIGdlbmVyYXRpbmcgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgeW91ciBwcm9ncmFtIGlzCi10byBjb21waWxlIGFuZCBsaW5rIGl0IHdpdGggcHJvZmlsaW5nIGVuYWJsZWQuCi0KLVRvIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBmb3IgcHJvZmlsaW5nLCBzcGVjaWZ5IHRoZSBAc2FtcHstcGd9IG9wdGlvbiB3aGVuCi15b3UgcnVuIHRoZSBjb21waWxlci4gIChUaGlzIGlzIGluIGFkZGl0aW9uIHRvIHRoZSBvcHRpb25zIHlvdSBub3JtYWxseQotdXNlLikKLQotVG8gbGluayB0aGUgcHJvZ3JhbSBmb3IgcHJvZmlsaW5nLCBpZiB5b3UgdXNlIGEgY29tcGlsZXIgc3VjaCBhcyBAY29kZXtjY30KLXRvIGRvIHRoZSBsaW5raW5nLCBzaW1wbHkgc3BlY2lmeSBAc2FtcHstcGd9IGluIGFkZGl0aW9uIHRvIHlvdXIgdXN1YWwKLW9wdGlvbnMuICBUaGUgc2FtZSBvcHRpb24sIEBzYW1wey1wZ30sIGFsdGVycyBlaXRoZXIgY29tcGlsYXRpb24gb3IgbGlua2luZwotdG8gZG8gd2hhdCBpcyBuZWNlc3NhcnkgZm9yIHByb2ZpbGluZy4gIEhlcmUgYXJlIGV4YW1wbGVzOgotCi1AZXhhbXBsZQotY2MgLWcgLWMgbXlwcm9nLmMgdXRpbHMuYyAtcGcKLWNjIC1vIG15cHJvZyBteXByb2cubyB1dGlscy5vIC1wZwotQGVuZCBleGFtcGxlCi0KLVRoZSBAc2FtcHstcGd9IG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggYSBjb21tYW5kIHRoYXQgYm90aCBjb21waWxlcyBhbmQgbGlua3M6Ci0KLUBleGFtcGxlCi1jYyAtbyBteXByb2cgbXlwcm9nLmMgdXRpbHMuYyAtZyAtcGcKLUBlbmQgZXhhbXBsZQotCi1JZiB5b3UgcnVuIHRoZSBsaW5rZXIgQGNvZGV7bGR9IGRpcmVjdGx5IGluc3RlYWQgb2YgdGhyb3VnaCBhIGNvbXBpbGVyCi1zdWNoIGFzIEBjb2Rle2NjfSwgeW91IG1heSBoYXZlIHRvIHNwZWNpZnkgYSBwcm9maWxpbmcgc3RhcnR1cCBmaWxlCi1AZmlsZXtnY3J0MC5vfSBhcyB0aGUgZmlyc3QgaW5wdXQgZmlsZSBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBzdGFydHVwCi1maWxlIEBmaWxle2NydDAub30uICBJbiBhZGRpdGlvbiwgeW91IHdvdWxkIHByb2JhYmx5IHdhbnQgdG8KLXNwZWNpZnkgdGhlIHByb2ZpbGluZyBDIGxpYnJhcnksIEBmaWxle2xpYmNfcC5hfSwgYnkgd3JpdGluZwotQHNhbXB7LWxjX3B9IGluc3RlYWQgb2YgdGhlIHVzdWFsIEBzYW1wey1sY30uICBUaGlzIGlzIG5vdCBhYnNvbHV0ZWx5Ci1uZWNlc3NhcnksIGJ1dCBkb2luZyB0aGlzIGdpdmVzIHlvdSBudW1iZXItb2YtY2FsbHMgaW5mb3JtYXRpb24gZm9yCi1zdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9ucyBzdWNoIGFzIEBjb2Rle3JlYWR9IGFuZCBAY29kZXtvcGVufS4gIEZvcgotZXhhbXBsZToKLQotQGV4YW1wbGUKLWxkIC1vIG15cHJvZyAvbGliL2djcnQwLm8gbXlwcm9nLm8gdXRpbHMubyAtbGNfcAotQGVuZCBleGFtcGxlCi0KLUlmIHlvdSBjb21waWxlIG9ubHkgc29tZSBvZiB0aGUgbW9kdWxlcyBvZiB0aGUgcHJvZ3JhbSB3aXRoIEBzYW1wey1wZ30sIHlvdQotY2FuIHN0aWxsIHByb2ZpbGUgdGhlIHByb2dyYW0sIGJ1dCB5b3Ugd29uJ3QgZ2V0IGNvbXBsZXRlIGluZm9ybWF0aW9uIGFib3V0Ci10aGUgbW9kdWxlcyB0aGF0IHdlcmUgY29tcGlsZWQgd2l0aG91dCBAc2FtcHstcGd9LiAgVGhlIG9ubHkgaW5mb3JtYXRpb24KLXlvdSBnZXQgZm9yIHRoZSBmdW5jdGlvbnMgaW4gdGhvc2UgbW9kdWxlcyBpcyB0aGUgdG90YWwgdGltZSBzcGVudCBpbiB0aGVtOwotdGhlcmUgaXMgbm8gcmVjb3JkIG9mIGhvdyBtYW55IHRpbWVzIHRoZXkgd2VyZSBjYWxsZWQsIG9yIGZyb20gd2hlcmUuICBUaGlzCi13aWxsIG5vdCBhZmZlY3QgdGhlIGZsYXQgcHJvZmlsZSAoZXhjZXB0IHRoYXQgdGhlIEBjb2Rle2NhbGxzfSBmaWVsZCBmb3IKLXRoZSBmdW5jdGlvbnMgd2lsbCBiZSBibGFuayksIGJ1dCB3aWxsIGdyZWF0bHkgcmVkdWNlIHRoZSB1c2VmdWxuZXNzIG9mIHRoZQotY2FsbCBncmFwaC4KLQotSWYgeW91IHdpc2ggdG8gcGVyZm9ybSBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLAoteW91IHdpbGwgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIEBzYW1wey1nfSBvcHRpb24sCi1pbnN0cnVjdGluZyB0aGUgY29tcGlsZXIgdG8gaW5zZXJ0IGRlYnVnZ2luZyBzeW1ib2xzIGludG8gdGhlIHByb2dyYW0KLXRoYXQgbWF0Y2ggcHJvZ3JhbSBhZGRyZXNzZXMgdG8gc291cmNlIGNvZGUgbGluZXMuCi1AeHJlZntMaW5lLWJ5LWxpbmV9LgotCi1JbiBhZGRpdGlvbiB0byB0aGUgQHNhbXB7LXBnfSBhbmQgQHNhbXB7LWd9IG9wdGlvbnMsCi15b3UgbWF5IGFsc28gd2lzaCB0byBzcGVjaWZ5IHRoZSBAc2FtcHstYX0gb3B0aW9uIHdoZW4gY29tcGlsaW5nLgotVGhpcyB3aWxsIGluc3RydW1lbnQKLXRoZSBwcm9ncmFtIHRvIHBlcmZvcm0gYmFzaWMtYmxvY2sgY291bnRpbmcuICBBcyB0aGUgcHJvZ3JhbSBydW5zLAotaXQgd2lsbCBjb3VudCBob3cgbWFueSB0aW1lcyBpdCBleGVjdXRlZCBlYWNoIGJyYW5jaCBvZiBlYWNoIEBzYW1we2lmfQotc3RhdGVtZW50LCBlYWNoIGl0ZXJhdGlvbiBvZiBlYWNoIEBzYW1we2RvfSBsb29wLCBldGMuICBUaGlzIHdpbGwKLWVuYWJsZSBAY29kZXtncHJvZn0gdG8gY29uc3RydWN0IGFuIGFubm90YXRlZCBzb3VyY2UgY29kZQotbGlzdGluZyBzaG93aW5nIGhvdyBtYW55IHRpbWVzIGVhY2ggbGluZSBvZiBjb2RlIHdhcyBleGVjdXRlZC4KLQotQG5vZGUgRXhlY3V0aW5nCi1AY2hhcHRlciBFeGVjdXRpbmcgdGhlIFByb2dyYW0KLQotT25jZSB0aGUgcHJvZ3JhbSBpcyBjb21waWxlZCBmb3IgcHJvZmlsaW5nLCB5b3UgbXVzdCBydW4gaXQgaW4gb3JkZXIgdG8KLWdlbmVyYXRlIHRoZSBpbmZvcm1hdGlvbiB0aGF0IEBjb2Rle2dwcm9mfSBuZWVkcy4gIFNpbXBseSBydW4gdGhlIHByb2dyYW0KLWFzIHVzdWFsLCB1c2luZyB0aGUgbm9ybWFsIGFyZ3VtZW50cywgZmlsZSBuYW1lcywgZXRjLiAgVGhlIHByb2dyYW0gc2hvdWxkCi1ydW4gbm9ybWFsbHksIHByb2R1Y2luZyB0aGUgc2FtZSBvdXRwdXQgYXMgdXN1YWwuICBJdCB3aWxsLCBob3dldmVyLCBydW4KLXNvbWV3aGF0IHNsb3dlciB0aGFuIG5vcm1hbCBiZWNhdXNlIG9mIHRoZSB0aW1lIHNwZW50IGNvbGxlY3RpbmcgYW5kIHRoZQotd3JpdGluZyB0aGUgcHJvZmlsZSBkYXRhLgotCi1UaGUgd2F5IHlvdSBydW4gdGhlIHByb2dyYW0tLS10aGUgYXJndW1lbnRzIGFuZCBpbnB1dCB0aGF0IHlvdSBnaXZlCi1pdC0tLW1heSBoYXZlIGEgZHJhbWF0aWMgZWZmZWN0IG9uIHdoYXQgdGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gc2hvd3MuICBUaGUKLXByb2ZpbGUgZGF0YSB3aWxsIGRlc2NyaWJlIHRoZSBwYXJ0cyBvZiB0aGUgcHJvZ3JhbSB0aGF0IHdlcmUgYWN0aXZhdGVkIGZvcgotdGhlIHBhcnRpY3VsYXIgaW5wdXQgeW91IHVzZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgZmlyc3QgY29tbWFuZCB5b3UgZ2l2ZQotdG8geW91ciBwcm9ncmFtIGlzIHRvIHF1aXQsIHRoZSBwcm9maWxlIGRhdGEgd2lsbCBzaG93IHRoZSB0aW1lIHVzZWQgaW4KLWluaXRpYWxpemF0aW9uIGFuZCBpbiBjbGVhbnVwLCBidXQgbm90IG11Y2ggZWxzZS4KLQotWW91ciBwcm9ncmFtIHdpbGwgd3JpdGUgdGhlIHByb2ZpbGUgZGF0YSBpbnRvIGEgZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5vdXR9Ci1qdXN0IGJlZm9yZSBleGl0aW5nLiAgSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGZpbGUgY2FsbGVkIEBmaWxle2dtb24ub3V0fSwKLWl0cyBjb250ZW50cyBhcmUgb3ZlcndyaXR0ZW4uICBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIHRlbGwgdGhlCi1wcm9ncmFtIHRvIHdyaXRlIHRoZSBwcm9maWxlIGRhdGEgdW5kZXIgYSBkaWZmZXJlbnQgbmFtZSwgYnV0IHlvdSBjYW4gcmVuYW1lCi10aGUgZmlsZSBhZnRlcndhcmQgaWYgeW91IGFyZSBjb25jZXJuZWQgdGhhdCBpdCBtYXkgYmUgb3ZlcndyaXR0ZW4uCi0KLUluIG9yZGVyIHRvIHdyaXRlIHRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSBwcm9wZXJseSwgeW91ciBwcm9ncmFtIG11c3QgZXhpdAotbm9ybWFsbHk6IGJ5IHJldHVybmluZyBmcm9tIEBjb2Rle21haW59IG9yIGJ5IGNhbGxpbmcgQGNvZGV7ZXhpdH0uICBDYWxsaW5nCi10aGUgbG93LWxldmVsIGZ1bmN0aW9uIEBjb2Rle19leGl0fSBkb2VzIG5vdCB3cml0ZSB0aGUgcHJvZmlsZSBkYXRhLCBhbmQKLW5laXRoZXIgZG9lcyBhYm5vcm1hbCB0ZXJtaW5hdGlvbiBkdWUgdG8gYW4gdW5oYW5kbGVkIHNpZ25hbC4KLQotVGhlIEBmaWxle2dtb24ub3V0fSBmaWxlIGlzIHdyaXR0ZW4gaW4gdGhlIHByb2dyYW0ncyBAZW1waHtjdXJyZW50IHdvcmtpbmcKLWRpcmVjdG9yeX0gYXQgdGhlIHRpbWUgaXQgZXhpdHMuICBUaGlzIG1lYW5zIHRoYXQgaWYgeW91ciBwcm9ncmFtIGNhbGxzCi1AY29kZXtjaGRpcn0sIHRoZSBAZmlsZXtnbW9uLm91dH0gZmlsZSB3aWxsIGJlIGxlZnQgaW4gdGhlIGxhc3QgZGlyZWN0b3J5Ci15b3VyIHByb2dyYW0gQGNvZGV7Y2hkaXJ9J2QgdG8uICBJZiB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHdyaXRlIGluCi10aGlzIGRpcmVjdG9yeSwgdGhlIGZpbGUgaXMgbm90IHdyaXR0ZW4sIGFuZCB5b3Ugd2lsbCBnZXQgYW4gZXJyb3IgbWVzc2FnZS4KLQotT2xkZXIgdmVyc2lvbnMgb2YgdGhlIEBzY3tnbnV9IHByb2ZpbGluZyBsaWJyYXJ5IG1heSBhbHNvIHdyaXRlIGEgZmlsZQotY2FsbGVkIEBmaWxle2JiLm91dH0uICBUaGlzIGZpbGUsIGlmIHByZXNlbnQsIGNvbnRhaW5zIGFuIGh1bWFuLXJlYWRhYmxlCi1saXN0aW5nIG9mIHRoZSBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLiAgVW5mb3J0dW5hdGVseSwgdGhlCi1hcHBlYXJhbmNlIG9mIGEgaHVtYW4tcmVhZGFibGUgQGZpbGV7YmIub3V0fSBtZWFucyB0aGUgYmFzaWMtYmxvY2sKLWNvdW50cyBkaWRuJ3QgZ2V0IHdyaXR0ZW4gaW50byBAZmlsZXtnbW9uLm91dH0uCi1UaGUgUGVybCBzY3JpcHQgQGNvZGV7YmJjb252LnBsfSwgaW5jbHVkZWQgd2l0aCB0aGUgQGNvZGV7Z3Byb2Z9Ci1zb3VyY2UgZGlzdHJpYnV0aW9uLCB3aWxsIGNvbnZlcnQgYSBAZmlsZXtiYi5vdXR9IGZpbGUgaW50bwotYSBmb3JtYXQgcmVhZGFibGUgYnkgQGNvZGV7Z3Byb2Z9LgotCi1Abm9kZSBJbnZva2luZwotQGNoYXB0ZXIgQGNvZGV7Z3Byb2Z9IENvbW1hbmQgU3VtbWFyeQotCi1BZnRlciB5b3UgaGF2ZSBhIHByb2ZpbGUgZGF0YSBmaWxlIEBmaWxle2dtb24ub3V0fSwgeW91IGNhbiBydW4gQGNvZGV7Z3Byb2Z9Ci10byBpbnRlcnByZXQgdGhlIGluZm9ybWF0aW9uIGluIGl0LiAgVGhlIEBjb2Rle2dwcm9mfSBwcm9ncmFtIHByaW50cyBhCi1mbGF0IHByb2ZpbGUgYW5kIGEgY2FsbCBncmFwaCBvbiBzdGFuZGFyZCBvdXRwdXQuICBUeXBpY2FsbHkgeW91IHdvdWxkCi1yZWRpcmVjdCB0aGUgb3V0cHV0IG9mIEBjb2Rle2dwcm9mfSBpbnRvIGEgZmlsZSB3aXRoIEBzYW1wez59LgotCi1Zb3UgcnVuIEBjb2Rle2dwcm9mfSBsaWtlIHRoaXM6Ci0KLUBzbWFsbGV4YW1wbGUKLWdwcm9mIEB2YXJ7b3B0aW9uc30gW0B2YXJ7ZXhlY3V0YWJsZS1maWxlfSBbQHZhcntwcm9maWxlLWRhdGEtZmlsZXN9QGRvdHN7fV1dIFs+IEB2YXJ7b3V0ZmlsZX1dCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLUhlcmUgc3F1YXJlLWJyYWNrZXRzIGluZGljYXRlIG9wdGlvbmFsIGFyZ3VtZW50cy4KLQotSWYgeW91IG9taXQgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lLCB0aGUgZmlsZSBAZmlsZXthLm91dH0gaXMgdXNlZC4gIElmCi15b3UgZ2l2ZSBubyBwcm9maWxlIGRhdGEgZmlsZSBuYW1lLCB0aGUgZmlsZSBAZmlsZXtnbW9uLm91dH0gaXMgdXNlZC4gIElmCi1hbnkgZmlsZSBpcyBub3QgaW4gdGhlIHByb3BlciBmb3JtYXQsIG9yIGlmIHRoZSBwcm9maWxlIGRhdGEgZmlsZSBkb2VzIG5vdAotYXBwZWFyIHRvIGJlbG9uZyB0byB0aGUgZXhlY3V0YWJsZSBmaWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIHByaW50ZWQuCi0KLVlvdSBjYW4gZ2l2ZSBtb3JlIHRoYW4gb25lIHByb2ZpbGUgZGF0YSBmaWxlIGJ5IGVudGVyaW5nIGFsbCB0aGVpciBuYW1lcwotYWZ0ZXIgdGhlIGV4ZWN1dGFibGUgZmlsZSBuYW1lOyB0aGVuIHRoZSBzdGF0aXN0aWNzIGluIGFsbCB0aGUgZGF0YSBmaWxlcwotYXJlIHN1bW1lZCB0b2dldGhlci4KLQotVGhlIG9yZGVyIG9mIHRoZXNlIG9wdGlvbnMgZG9lcyBub3QgbWF0dGVyLgotCi1AbWVudQotKiBPdXRwdXQgT3B0aW9uczo6ICAgICAgQ29udHJvbGxpbmcgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0IHN0eWxlCi0qIEFuYWx5c2lzIE9wdGlvbnM6OiAgICBDb250cm9sbGluZyBob3cgQGNvZGV7Z3Byb2Z9IGFuYWx5c2VzIGl0cyBkYXRhCi0qIE1pc2NlbGxhbmVvdXMgT3B0aW9uczo6Ci0qIERlcHJpY2F0ZWQgT3B0aW9uczo6ICBPcHRpb25zIHlvdSBubyBsb25nZXIgbmVlZCB0byB1c2UsIGJ1dCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYmVlbiByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eQotKiBTeW1zcGVjczo6ICAgICAgICAgICAgU3BlY2lmeWluZyBmdW5jdGlvbnMgdG8gaW5jbHVkZSBvciBleGNsdWRlCi1AZW5kIG1lbnUKLQotQG5vZGUgT3V0cHV0IE9wdGlvbnMsQW5hbHlzaXMgT3B0aW9ucywsSW52b2tpbmcKLUBzZWN0aW9uIE91dHB1dCBPcHRpb25zCi0KLVRoZXNlIG9wdGlvbnMgc3BlY2lmeSB3aGljaCBvZiBzZXZlcmFsIG91dHB1dCBmb3JtYXRzCi1AY29kZXtncHJvZn0gc2hvdWxkIHByb2R1Y2UuCi0KLU1hbnkgb2YgdGhlc2Ugb3B0aW9ucyB0YWtlIGFuIG9wdGlvbmFsIEBkZm57c3ltc3BlY30gdG8gc3BlY2lmeQotZnVuY3Rpb25zIHRvIGJlIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkLiAgVGhlc2Ugb3B0aW9ucyBjYW4gYmUKLXNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcywgd2l0aCBkaWZmZXJlbnQgc3ltc3BlY3MsIHRvIGluY2x1ZGUKLW9yIGV4Y2x1ZGUgc2V0cyBvZiBzeW1ib2xzLiAgQHhyZWZ7U3ltc3BlY3N9LgotCi1TcGVjaWZ5aW5nIGFueSBvZiB0aGVzZSBvcHRpb25zIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCAoQHNhbXB7LXAgLXF9KSwKLXdoaWNoIHByaW50cyBhIGZsYXQgcHJvZmlsZSBhbmQgY2FsbCBncmFwaCBhbmFseXNpcwotZm9yIGFsbCBmdW5jdGlvbnMuCi0KLUB0YWJsZSBAY29kZQotCi1AaXRlbSAtQVtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tYW5ub3RhdGVkLXNvdXJjZVs9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstQX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYW5ub3RhdGVkIHNvdXJjZSBjb2RlLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIHByaW50IG91dHB1dCBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgotQHhyZWZ7QW5ub3RhdGVkIFNvdXJjZX0uCi0KLUBpdGVtIC1iCi1AaXRlbXggLS1icmllZgotSWYgdGhlIEBzYW1wey1ifSBvcHRpb24gaXMgZ2l2ZW4sIEBjb2Rle2dwcm9mfSBkb2Vzbid0IHByaW50IHRoZQotdmVyYm9zZSBibHVyYnMgdGhhdCB0cnkgdG8gZXhwbGFpbiB0aGUgbWVhbmluZyBvZiBhbGwgb2YgdGhlIGZpZWxkcyBpbgotdGhlIHRhYmxlcy4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBpbnRlbmQgdG8gcHJpbnQgb3V0IHRoZSBvdXRwdXQsIG9yCi1hcmUgdGlyZWQgb2Ygc2VlaW5nIHRoZSBibHVyYnMuCi0KLUBpdGVtIC1DW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1leGVjLWNvdW50c1s9QHZhcntzeW1zcGVjfV0KLVRoZSBAc2FtcHstQ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8KLXByaW50IGEgdGFsbHkgb2YgZnVuY3Rpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggd2FzIGNhbGxlZC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCB0YWxseSBvbmx5IGZvciBtYXRjaGluZyBzeW1ib2xzLgotCi1JZiB0aGUgcHJvZmlsZSBkYXRhIGZpbGUgY29udGFpbnMgYmFzaWMtYmxvY2sgY291bnQgcmVjb3Jkcywgc3BlY2lmaW5nCi10aGUgQHNhbXB7LWx9IG9wdGlvbiwgYWxvbmcgd2l0aCBAc2FtcHstQ30sIHdpbGwgY2F1c2UgYmFzaWMtYmxvY2sKLWV4ZWN1dGlvbiBjb3VudHMgdG8gYmUgdGFsbGllZCBhbmQgZGlzcGxheWVkLgotCi1AaXRlbSAtaQotQGl0ZW14IC0tZmlsZS1pbmZvCi1UaGUgQHNhbXB7LWl9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGRpc3BsYXkgc3VtbWFyeSBpbmZvcm1hdGlvbgotYWJvdXQgdGhlIHByb2ZpbGUgZGF0YSBmaWxlKHMpIGFuZCB0aGVuIGV4aXQuICBUaGUgbnVtYmVyIG9mIGhpc3RvZ3JhbSwKLWNhbGwgZ3JhcGgsIGFuZCBiYXNpYy1ibG9jayBjb3VudCByZWNvcmRzIGlzIGRpc3BsYXllZC4KLQotQGl0ZW0gLUkgQHZhcntkaXJzfQotQGl0ZW14IC0tZGlyZWN0b3J5LXBhdGg9QHZhcntkaXJzfQotVGhlIEBzYW1wey1JfSBvcHRpb24gc3BlY2lmaWVzIGEgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMgaW4KLXdoaWNoIHRvIGZpbmQgc291cmNlIGZpbGVzLiAgRW52aXJvbm1lbnQgdmFyaWFibGUgQHZhcntHUFJPRl9QQVRIfQotY2FuIGFsc28gYmUgdXNlZCB0byBjb252ZXJ5IHRoaXMgaW5mb3JtYXRpb24uCi1Vc2VkIG1vc3RseSBmb3IgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQuCi0KLUBpdGVtIC1KW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1hbm5vdGF0ZWQtc291cmNlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1KfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSBub3QgdG8KLXByaW50IGFubm90YXRlZCBzb3VyY2UgY29kZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGFubm90YXRlZCBzb3VyY2UsCi1idXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLUwKLUBpdGVteCAtLXByaW50LXBhdGgKLU5vcm1hbGx5LCBzb3VyY2UgZmlsZW5hbWVzIGFyZSBwcmludGVkIHdpdGggdGhlIHBhdGgKLWNvbXBvbmVudCBzdXBwcmVzc2VkLiAgVGhlIEBzYW1wey1MfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfQotdG8gcHJpbnQgdGhlIGZ1bGwgcGF0aG5hbWUgb2YKLXNvdXJjZSBmaWxlbmFtZXMsIHdoaWNoIGlzIGRldGVybWluZWQKLWZyb20gc3ltYm9saWMgZGVidWdnaW5nIGluZm9ybWF0aW9uIGluIHRoZSBpbWFnZSBmaWxlCi1hbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tcGlsZXIKLXdhcyBpbnZva2VkLgotCi1AaXRlbSAtcFtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tZmxhdC1wcm9maWxlWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1wfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBhIGZsYXQgcHJvZmlsZS4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBmbGF0IHByb2ZpbGUgb25seSBmb3IgbWF0Y2hpbmcgc3ltYm9scy4KLUB4cmVme0ZsYXQgUHJvZmlsZX0uCi0KLUBpdGVtIC1QW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby1mbGF0LXByb2ZpbGVbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LVB9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHByaW50aW5nIGEgZmxhdCBwcm9maWxlLgotSWYgQHZhcntzeW1zcGVjfSBpcyBzcGVjaWZpZWQsIEBjb2Rle2dwcm9mfSBwcmludHMgYSBmbGF0IHByb2ZpbGUsCi1idXQgZXhjbHVkZXMgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLXFbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLWdyYXBoWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1xfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCB0aGUgY2FsbCBncmFwaCBhbmFseXNpcy4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCBjYWxsIGdyYXBoIG9ubHkgZm9yIG1hdGNoaW5nIHN5bWJvbHMKLWFuZCB0aGVpciBjaGlsZHJlbi4KLUB4cmVme0NhbGwgR3JhcGh9LgotCi1AaXRlbSAtUVtAdmFye3N5bXNwZWN9XQotQGl0ZW14IC0tbm8tZ3JhcGhbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LVF9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1cHByZXNzIHByaW50aW5nIHRoZQotY2FsbCBncmFwaC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBAY29kZXtncHJvZn0gcHJpbnRzIGEgY2FsbCBncmFwaCwKLWJ1dCBleGNsdWRlcyBtYXRjaGluZyBzeW1ib2xzLgotCi1AaXRlbSAteQotQGl0ZW14IC0tc2VwYXJhdGUtZmlsZXMKLVRoaXMgb3B0aW9uIGFmZmVjdHMgYW5ub3RhdGVkIHNvdXJjZSBvdXRwdXQgb25seS4KLU5vcm1hbGx5LCBncHJvZiBwcmludHMgYW5ub3RhdGVkIHNvdXJjZSBmaWxlcwotdG8gc3RhbmRhcmQtb3V0cHV0LiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLAotYW5ub3RhdGVkIHNvdXJjZSBmb3IgYSBmaWxlIG5hbWVkIEBmaWxle3BhdGgvZmlsZW5hbWV9Ci1pcyBnZW5lcmF0ZWQgaW4gdGhlIGZpbGUgQGZpbGV7ZmlsZW5hbWUtYW5ufS4KLQotQGl0ZW0gLVpbQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLW5vLWV4ZWMtY291bnRzWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1afSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSBub3QgdG8KLXByaW50IGEgdGFsbHkgb2YgZnVuY3Rpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggd2FzIGNhbGxlZC4KLUlmIEB2YXJ7c3ltc3BlY30gaXMgc3BlY2lmaWVkLCBwcmludCB0YWxseSwgYnV0IGV4Y2x1ZGUgbWF0Y2hpbmcgc3ltYm9scy4KLQotQGl0ZW0gLS1mdW5jdGlvbi1vcmRlcmluZwotVGhlIEBzYW1wey0tZnVuY3Rpb24tb3JkZXJpbmd9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHByaW50IGEKLXN1Z2dlc3RlZCBmdW5jdGlvbiBvcmRlcmluZyBmb3IgdGhlIHByb2dyYW0gYmFzZWQgb24gcHJvZmlsaW5nIGRhdGEuCi1UaGlzIG9wdGlvbiBzdWdnZXN0cyBhbiBvcmRlcmluZyB3aGljaCBtYXkgaW1wcm92ZSBwYWdpbmcsIHRsYiBhbmQKLWNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJvZ3JhbSBvbiBzeXN0ZW1zIHdoaWNoIHN1cHBvcnQgYXJiaXRyYXJ5Ci1vcmRlcmluZyBvZiBmdW5jdGlvbnMgaW4gYW4gZXhlY3V0YWJsZS4KLQotVGhlIGV4YWN0IGRldGFpbHMgb2YgaG93IHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gcGxhY2UgZnVuY3Rpb25zCi1pbiBhIHBhcnRpY3VsYXIgb3JkZXIgaXMgc3lzdGVtIGRlcGVuZGVudCBhbmQgb3V0IG9mIHRoZSBzY29wZSBvZiB0aGlzCi1tYW51YWwuCi0KLUBpdGVtIC0tZmlsZS1vcmRlcmluZyBAdmFye21hcF9maWxlfQotVGhlIEBzYW1wey0tZmlsZS1vcmRlcmluZ30gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gcHJpbnQgYQotc3VnZ2VzdGVkIC5vIGxpbmsgbGluZSBvcmRlcmluZyBmb3IgdGhlIHByb2dyYW0gYmFzZWQgb24gcHJvZmlsaW5nIGRhdGEuCi1UaGlzIG9wdGlvbiBzdWdnZXN0cyBhbiBvcmRlcmluZyB3aGljaCBtYXkgaW1wcm92ZSBwYWdpbmcsIHRsYiBhbmQKLWNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJvZ3JhbSBvbiBzeXN0ZW1zIHdoaWNoIGRvIG5vdCBzdXBwb3J0IGFyYml0cmFyeQotb3JkZXJpbmcgb2YgZnVuY3Rpb25zIGluIGFuIGV4ZWN1dGFibGUuCi0KLVVzZSBvZiB0aGUgQHNhbXB7LWF9IGFyZ3VtZW50IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB3aXRoIHRoaXMgb3B0aW9uLgotCi1UaGUgQHZhcnttYXBfZmlsZX0gYXJndW1lbnQgaXMgYSBwYXRobmFtZSB0byBhIGZpbGUgd2hpY2ggcHJvdmlkZXMKLWZ1bmN0aW9uIG5hbWUgdG8gb2JqZWN0IGZpbGUgbWFwcGluZ3MuICBUaGUgZm9ybWF0IG9mIHRoZSBmaWxlIGlzIHNpbWlsYXIgdG8KLXRoZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gQGNvZGV7bm19LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWMtcGFyc2UubzowMDAwMDAwMCBUIHl5cGFyc2UKLWMtcGFyc2UubzowMDAwMDAwNCBDIHl5ZXJyZmxhZwotYy1sYW5nLm86MDAwMDAwMDAgVCBtYXliZV9vYmpjX21ldGhvZF9uYW1lCi1jLWxhbmcubzowMDAwMDAwMCBUIHByaW50X2xhbmdfc3RhdGlzdGljcwotYy1sYW5nLm86MDAwMDAwMDAgVCByZWNvZ25pemVfb2JqY19rZXl3b3JkCi1jLWRlY2wubzowMDAwMDAwMCBUIHByaW50X2xhbmdfaWRlbnRpZmllcgotYy1kZWNsLm86MDAwMDAwMDAgVCBwcmludF9sYW5nX3R5cGUKLUBkb3Rze30KLQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotR05VIEBjb2Rle25tfSBAc2FtcHstLWV4dGVybi1vbmx5fSBAc2FtcHstLWRlZmluZWQtb25seX0gQHNhbXB7LXZ9IEBzYW1wey0tcHJpbnQtZmlsZS1uYW1lfSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgQHZhcnttYXBfZmlsZX0uCi0KLUBpdGVtIC1UCi1AaXRlbXggLS10cmFkaXRpb25hbAotVGhlIEBzYW1wey1UfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCBpdHMgb3V0cHV0IGluCi1gYHRyYWRpdGlvbmFsJycgQlNEIHN0eWxlLgotCi1AaXRlbSAtdyBAdmFye3dpZHRofQotQGl0ZW14IC0td2lkdGg9QHZhcnt3aWR0aH0KLVNldHMgd2lkdGggb2Ygb3V0cHV0IGxpbmVzIHRvIEB2YXJ7d2lkdGh9LgotQ3VycmVudGx5IG9ubHkgdXNlZCB3aGVuIHByaW50aW5nIHRoZSBmdW5jdGlvbiBpbmRleCBhdCB0aGUgYm90dG9tCi1vZiB0aGUgY2FsbCBncmFwaC4KLQotQGl0ZW0gLXgKLUBpdGVteCAtLWFsbC1saW5lcwotVGhpcyBvcHRpb24gYWZmZWN0cyBhbm5vdGF0ZWQgc291cmNlIG91dHB1dCBvbmx5LgotQnkgZGVmYXVsdCwgb25seSB0aGUgbGluZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJhc2ljLWJsb2NrCi1hcmUgYW5ub3RhdGVkLiAgSWYgdGhpcyBvcHRpb24gaXMgc3BlY2lmaWVkLCBldmVyeSBsaW5lIGluCi1hIGJhc2ljLWJsb2NrIGlzIGFubm90YXRlZCBieSByZXBlYXRpbmcgdGhlIGFubm90YXRpb24gZm9yIHRoZQotZmlyc3QgbGluZS4gIFRoaXMgYmVoYXZpb3IgaXMgc2ltaWxhciB0byBAY29kZXt0Y292fSdzIEBzYW1wey1hfS4KLQotQGl0ZW0gLS1kZW1hbmdsZQotQGl0ZW14IC0tbm8tZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIEMrKyBzeW1ib2wgbmFtZXMgc2hvdWxkIGJlIGRlbWFuZ2xlZCB3aGVuCi1wcmludGluZyBvdXRwdXQuICBUaGUgZGVmYXVsdCBpcyB0byBkZW1hbmdsZSBzeW1ib2xzLiAgVGhlCi1AY29kZXstLW5vLWRlbWFuZ2xlfSBvcHRpb24gbWF5IGJlIHVzZWQgdG8gdHVybiBvZmYgZGVtYW5nbGluZy4KLQotQGVuZCB0YWJsZQotCi1Abm9kZSBBbmFseXNpcyBPcHRpb25zLE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxPdXRwdXQgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gQW5hbHlzaXMgT3B0aW9ucwotCi1AdGFibGUgQGNvZGUKLQotQGl0ZW0gLWEKLUBpdGVteCAtLW5vLXN0YXRpYwotVGhlIEBzYW1wey1hfSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBzdXBwcmVzcyB0aGUgcHJpbnRpbmcgb2YKLXN0YXRpY2FsbHkgZGVjbGFyZWQgKHByaXZhdGUpIGZ1bmN0aW9ucy4gIChUaGVzZSBhcmUgZnVuY3Rpb25zIHdob3NlCi1uYW1lcyBhcmUgbm90IGxpc3RlZCBhcyBnbG9iYWwsIGFuZCB3aGljaCBhcmUgbm90IHZpc2libGUgb3V0c2lkZSB0aGUKLWZpbGUvZnVuY3Rpb24vYmxvY2sgd2hlcmUgdGhleSB3ZXJlIGRlZmluZWQuKSAgVGltZSBzcGVudCBpbiB0aGVzZQotZnVuY3Rpb25zLCBjYWxscyB0by9mcm9tIHRoZW0sIGV0Yywgd2lsbCBhbGwgYmUgYXR0cmlidXRlZCB0byB0aGUKLWZ1bmN0aW9uIHRoYXQgd2FzIGxvYWRlZCBkaXJlY3RseSBiZWZvcmUgaXQgaW4gdGhlIGV4ZWN1dGFibGUgZmlsZS4KLUBjIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIFVuaXggQGNvZGV7Z3Byb2Z9LCBidXQgYSBiYWQgaWRlYS4gIAotVGhpcyBvcHRpb24gYWZmZWN0cyBib3RoIHRoZSBmbGF0IHByb2ZpbGUgYW5kIHRoZSBjYWxsIGdyYXBoLgotCi1AaXRlbSAtYwotQGl0ZW14IC0tc3RhdGljLWNhbGwtZ3JhcGgKLVRoZSBAc2FtcHstY30gb3B0aW9uIGNhdXNlcyB0aGUgY2FsbCBncmFwaCBvZiB0aGUgcHJvZ3JhbSB0byBiZQotYXVnbWVudGVkIGJ5IGEgaGV1cmlzdGljIHdoaWNoIGV4YW1pbmVzIHRoZSB0ZXh0IHNwYWNlIG9mIHRoZSBvYmplY3QKLWZpbGUgYW5kIGlkZW50aWZpZXMgZnVuY3Rpb24gY2FsbHMgaW4gdGhlIGJpbmFyeSBtYWNoaW5lIGNvZGUuCi1TaW5jZSBub3JtYWwgY2FsbCBncmFwaCByZWNvcmRzIGFyZSBvbmx5IGdlbmVyYXRlZCB3aGVuIGZ1bmN0aW9ucyBhcmUKLWVudGVyZWQsIHRoaXMgb3B0aW9uIGlkZW50aWZpZXMgY2hpbGRyZW4gdGhhdCBjb3VsZCBoYXZlIGJlZW4gY2FsbGVkLAotYnV0IG5ldmVyIHdlcmUuICBDYWxscyB0byBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5vdCBjb21waWxlZCB3aXRoCi1wcm9maWxpbmcgZW5hYmxlZCBhcmUgYWxzbyBpZGVudGlmaWVkLCBidXQgb25seSBpZiBzeW1ib2wgdGFibGUKLWVudHJpZXMgYXJlIHByZXNlbnQgZm9yIHRoZW0uCi1DYWxscyB0byBkeW5hbWljIGxpYnJhcnkgcm91dGluZXMgYXJlIHR5cGljYWxseSBAZW1waHtub3R9IGZvdW5kCi1ieSB0aGlzIG9wdGlvbi4KLVBhcmVudHMgb3IgY2hpbGRyZW4gaWRlbnRpZmllZCB2aWEgdGhpcyBoZXVyaXN0aWMKLWFyZSBpbmRpY2F0ZWQgaW4gdGhlIGNhbGwgZ3JhcGggd2l0aCBjYWxsIGNvdW50cyBvZiBAc2FtcHswfS4KLQotQGl0ZW0gLUQKLUBpdGVteCAtLWlnbm9yZS1ub24tZnVuY3Rpb25zCi1UaGUgQHNhbXB7LUR9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIGlnbm9yZSBzeW1ib2xzIHdoaWNoCi1hcmUgbm90IGtub3duIHRvIGJlIGZ1bmN0aW9ucy4gIFRoaXMgb3B0aW9uIHdpbGwgZ2l2ZSBtb3JlIGFjY3VyYXRlCi1wcm9maWxlIGRhdGEgb24gc3lzdGVtcyB3aGVyZSBpdCBpcyBzdXBwb3J0ZWQgKFNvbGFyaXMgYW5kIEhQVVggZm9yCi1leGFtcGxlKS4KLQotQGl0ZW0gLWsgQHZhcntmcm9tfS9AdmFye3RvfQotVGhlIEBzYW1wey1rfSBvcHRpb24gYWxsb3dzIHlvdSB0byBkZWxldGUgZnJvbSB0aGUgY2FsbCBncmFwaCBhbnkgYXJjcyBmcm9tCi1zeW1ib2xzIG1hdGNoaW5nIHN5bXNwZWMgQHZhcntmcm9tfSB0byB0aG9zZSBtYXRjaGluZyBzeW1zcGVjIEB2YXJ7dG99LgotCi1AaXRlbSAtbAotQGl0ZW14IC0tbGluZQotVGhlIEBzYW1wey1sfSBvcHRpb24gZW5hYmxlcyBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLCB3aGljaCBjYXVzZXMKLWhpc3RvZ3JhbSBoaXRzIHRvIGJlIGNoYXJnZWQgdG8gaW5kaXZpZHVhbCBzb3VyY2UgY29kZSBsaW5lcywKLWluc3RlYWQgb2YgZnVuY3Rpb25zLgotSWYgdGhlIHByb2dyYW0gd2FzIGNvbXBpbGVkIHdpdGggYmFzaWMtYmxvY2sgY291bnRpbmcgZW5hYmxlZCwKLXRoaXMgb3B0aW9uIHdpbGwgYWxzbyBpZGVudGlmeSBob3cgbWFueSB0aW1lcyBlYWNoIGxpbmUgb2YKLWNvZGUgd2FzIGV4ZWN1dGVkLgotV2hpbGUgbGluZS1ieS1saW5lIHByb2ZpbGluZyBjYW4gaGVscCBpc29sYXRlIHdoZXJlIGluIGEgbGFyZ2UgZnVuY3Rpb24KLWEgcHJvZ3JhbSBpcyBzcGVuZGluZyBpdHMgdGltZSwgaXQgYWxzbyBzaWduaWZpY2FudGx5IGluY3JlYXNlcwotdGhlIHJ1bm5pbmcgdGltZSBvZiBAY29kZXtncHJvZn0sIGFuZCBtYWduaWZpZXMgc3RhdGlzdGljYWwKLWluYWNjdXJhY2llcy4KLUB4cmVme1NhbXBsaW5nIEVycm9yfS4KLQotQGl0ZW0gLW0gQHZhcntudW19Ci1AaXRlbXggLS1taW4tY291bnQ9QHZhcntudW19Ci1UaGlzIG9wdGlvbiBhZmZlY3RzIGV4ZWN1dGlvbiBjb3VudCBvdXRwdXQgb25seS4KLVN5bWJvbHMgdGhhdCBhcmUgZXhlY3V0ZWQgbGVzcyB0aGFuIEB2YXJ7bnVtfSB0aW1lcyBhcmUgc3VwcHJlc3NlZC4KLQotQGl0ZW0gLW5bQHZhcntzeW1zcGVjfV0KLUBpdGVteCAtLXRpbWVbPUB2YXJ7c3ltc3BlY31dCi1UaGUgQHNhbXB7LW59IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9LCBpbiBpdHMgY2FsbCBncmFwaCBhbmFseXNpcywKLXRvIG9ubHkgcHJvcGFnYXRlIHRpbWVzIGZvciBzeW1ib2xzIG1hdGNoaW5nIEB2YXJ7c3ltc3BlY30uCi0KLUBpdGVtIC1OW0B2YXJ7c3ltc3BlY31dCi1AaXRlbXggLS1uby10aW1lWz1AdmFye3N5bXNwZWN9XQotVGhlIEBzYW1wey1ufSBvcHRpb24gY2F1c2VzIEBjb2Rle2dwcm9mfSwgaW4gaXRzIGNhbGwgZ3JhcGggYW5hbHlzaXMsCi1ub3QgdG8gcHJvcGFnYXRlIHRpbWVzIGZvciBzeW1ib2xzIG1hdGNoaW5nIEB2YXJ7c3ltc3BlY30uCi0KLUBpdGVtIC16Ci1AaXRlbXggLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnMKLUlmIHlvdSBnaXZlIHRoZSBAc2FtcHsten0gb3B0aW9uLCBAY29kZXtncHJvZn0gd2lsbCBtZW50aW9uIGFsbAotZnVuY3Rpb25zIGluIHRoZSBmbGF0IHByb2ZpbGUsIGV2ZW4gdGhvc2UgdGhhdCB3ZXJlIG5ldmVyIGNhbGxlZCwgYW5kCi10aGF0IGhhZCBubyB0aW1lIHNwZW50IGluIHRoZW0uICBUaGlzIGlzIHVzZWZ1bCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotQHNhbXB7LWN9IG9wdGlvbiBmb3IgZGlzY292ZXJpbmcgd2hpY2ggcm91dGluZXMgd2VyZSBuZXZlciBjYWxsZWQuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgTWlzY2VsbGFuZW91cyBPcHRpb25zLERlcHJpY2F0ZWQgT3B0aW9ucyxBbmFseXNpcyBPcHRpb25zLEludm9raW5nCi1Ac2VjdGlvbiBNaXNjZWxsYW5lb3VzIE9wdGlvbnMKLQotQHRhYmxlIEBjb2RlCi0KLUBpdGVtIC1kW0B2YXJ7bnVtfV0KLUBpdGVteCAtLWRlYnVnWz1AdmFye251bX1dCi1UaGUgQHNhbXB7LWQgQHZhcntudW19fSBvcHRpb24gc3BlY2lmaWVzIGRlYnVnZ2luZyBvcHRpb25zLgotSWYgQHZhcntudW19IGlzIG5vdCBzcGVjaWZpZWQsIGVuYWJsZSBhbGwgZGVidWdnaW5nLgotQHhyZWZ7RGVidWdnaW5nfS4KLQotQGl0ZW0gLU9AdmFye25hbWV9Ci1AaXRlbXggLS1maWxlLWZvcm1hdD1AdmFye25hbWV9Ci1TZWxlY3RzIHRoZSBmb3JtYXQgb2YgdGhlIHByb2ZpbGUgZGF0YSBmaWxlcy4gIFJlY29nbml6ZWQgZm9ybWF0cyBhcmUKLUBzYW1we2F1dG99ICh0aGUgZGVmYXVsdCksIEBzYW1we2JzZH0sIEBzYW1wezQuNGJzZH0sIEBzYW1we21hZ2ljfSwgYW5kCi1Ac2FtcHtwcm9mfSAobm90IHlldCBzdXBwb3J0ZWQpLgotCi1AaXRlbSAtcwotQGl0ZW14IC0tc3VtCi1UaGUgQHNhbXB7LXN9IG9wdGlvbiBjYXVzZXMgQGNvZGV7Z3Byb2Z9IHRvIHN1bW1hcml6ZSB0aGUgaW5mb3JtYXRpb24KLWluIHRoZSBwcm9maWxlIGRhdGEgZmlsZXMgaXQgcmVhZCBpbiwgYW5kIHdyaXRlIG91dCBhIHByb2ZpbGUgZGF0YQotZmlsZSBjYWxsZWQgQGZpbGV7Z21vbi5zdW19LCB3aGljaCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIGZyb20KLXRoZSBwcm9maWxlIGRhdGEgZmlsZXMgdGhhdCBAY29kZXtncHJvZn0gcmVhZCBpbi4gIFRoZSBmaWxlIEBmaWxle2dtb24uc3VtfQotbWF5IGJlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGlucHV0IGZpbGVzOyB0aGUgZWZmZWN0IG9mIHRoaXMgaXMgdG8KLW1lcmdlIHRoZSBkYXRhIGluIHRoZSBvdGhlciBpbnB1dCBmaWxlcyBpbnRvIEBmaWxle2dtb24uc3VtfS4KLQotRXZlbnR1YWxseSB5b3UgY2FuIHJ1biBAY29kZXtncHJvZn0gYWdhaW4gd2l0aG91dCBAc2FtcHstc30gdG8gYW5hbHl6ZSB0aGUKLWN1bXVsYXRpdmUgZGF0YSBpbiB0aGUgZmlsZSBAZmlsZXtnbW9uLnN1bX0uCi0KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1UaGUgQHNhbXB7LXZ9IGZsYWcgY2F1c2VzIEBjb2Rle2dwcm9mfSB0byBwcmludCB0aGUgY3VycmVudCB2ZXJzaW9uCi1udW1iZXIsIGFuZCB0aGVuIGV4aXQuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgRGVwcmljYXRlZCBPcHRpb25zLFN5bXNwZWNzLE1pc2NlbGxhbmVvdXMgT3B0aW9ucyxJbnZva2luZwotQHNlY3Rpb24gRGVwcmljYXRlZCBPcHRpb25zCi0KLUB0YWJsZSBAY29kZQotCi1UaGVzZSBvcHRpb25zIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIG5ld2VyIHZlcnNpb25zIHRoYXQgdXNlIHN5bXNwZWNzLgotCi1AaXRlbSAtZSBAdmFye2Z1bmN0aW9uX25hbWV9Ci1UaGUgQHNhbXB7LWUgQHZhcntmdW5jdGlvbn19IG9wdGlvbiB0ZWxscyBAY29kZXtncHJvZn0gdG8gbm90IHByaW50Ci1pbmZvcm1hdGlvbiBhYm91dCB0aGUgZnVuY3Rpb24gQHZhcntmdW5jdGlvbl9uYW1lfSAoYW5kIGl0cwotY2hpbGRyZW5AZG90c3t9KSBpbiB0aGUgY2FsbCBncmFwaC4gIFRoZSBmdW5jdGlvbiB3aWxsIHN0aWxsIGJlIGxpc3RlZAotYXMgYSBjaGlsZCBvZiBhbnkgZnVuY3Rpb25zIHRoYXQgY2FsbCBpdCwgYnV0IGl0cyBpbmRleCBudW1iZXIgd2lsbCBiZQotc2hvd24gYXMgQHNhbXB7W25vdCBwcmludGVkXX0uICBNb3JlIHRoYW4gb25lIEBzYW1wey1lfSBvcHRpb24gbWF5IGJlCi1naXZlbjsgb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaCBAc2FtcHstZX0KLW9wdGlvbi4gCi0KLUBpdGVtIC1FIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAY29kZXstRSBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHdvcmtzIGxpa2UgdGhlIEBjb2Rley1lfSBvcHRpb24sIGJ1dAotdGltZSBzcGVudCBpbiB0aGUgZnVuY3Rpb24gKGFuZCBjaGlsZHJlbiB3aG8gd2VyZSBub3QgY2FsbGVkIGZyb20KLWFueXdoZXJlIGVsc2UpLCB3aWxsIG5vdCBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHBlcmNlbnRhZ2VzLW9mLXRpbWUgZm9yCi10aGUgY2FsbCBncmFwaC4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LUV9IG9wdGlvbiBtYXkgYmUgZ2l2ZW47IG9ubHkgb25lCi1AdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1FfSBvcHRpb24uCi0KLUBpdGVtIC1mIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAc2FtcHstZiBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIGNhdXNlcyBAY29kZXtncHJvZn0gdG8gbGltaXQgdGhlCi1jYWxsIGdyYXBoIHRvIHRoZSBmdW5jdGlvbiBAdmFye2Z1bmN0aW9uX25hbWV9IGFuZCBpdHMgY2hpbGRyZW4gKGFuZAotdGhlaXIgY2hpbGRyZW5AZG90c3t9KS4gIE1vcmUgdGhhbiBvbmUgQHNhbXB7LWZ9IG9wdGlvbiBtYXkgYmUgZ2l2ZW47Ci1vbmx5IG9uZSBAdmFye2Z1bmN0aW9uX25hbWV9IG1heSBiZSBpbmRpY2F0ZWQgd2l0aCBlYWNoIEBzYW1wey1mfQotb3B0aW9uLiAgCi0KLUBpdGVtIC1GIEB2YXJ7ZnVuY3Rpb25fbmFtZX0KLVRoZSBAc2FtcHstRiBAdmFye2Z1bmN0aW9ufX0gb3B0aW9uIHdvcmtzIGxpa2UgdGhlIEBjb2Rley1mfSBvcHRpb24sIGJ1dAotb25seSB0aW1lIHNwZW50IGluIHRoZSBmdW5jdGlvbiBhbmQgaXRzIGNoaWxkcmVuIChhbmQgdGhlaXIKLWNoaWxkcmVuQGRvdHN7fSkgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0b3RhbC10aW1lIGFuZAotcGVyY2VudGFnZXMtb2YtdGltZSBmb3IgdGhlIGNhbGwgZ3JhcGguICBNb3JlIHRoYW4gb25lIEBzYW1wey1GfSBvcHRpb24KLW1heSBiZSBnaXZlbjsgb25seSBvbmUgQHZhcntmdW5jdGlvbl9uYW1lfSBtYXkgYmUgaW5kaWNhdGVkIHdpdGggZWFjaAotQHNhbXB7LUZ9IG9wdGlvbi4gIFRoZSBAc2FtcHstRn0gb3B0aW9uIG92ZXJyaWRlcyB0aGUgQHNhbXB7LUV9IG9wdGlvbi4KLQotQGVuZCB0YWJsZQotCi1Ob3RlIHRoYXQgb25seSBvbmUgZnVuY3Rpb24gY2FuIGJlIHNwZWNpZmllZCB3aXRoIGVhY2ggQGNvZGV7LWV9LAotQGNvZGV7LUV9LCBAY29kZXstZn0gb3IgQGNvZGV7LUZ9IG9wdGlvbi4gIFRvIHNwZWNpZnkgbW9yZSB0aGFuIG9uZQotZnVuY3Rpb24sIHVzZSBtdWx0aXBsZSBvcHRpb25zLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29tbWFuZDoKLQotQGV4YW1wbGUKLWdwcm9mIC1lIGJvcmluZyAtZiBmb28gLWYgYmFyIG15cHJvZ3JhbSA+IGdwcm9mLm91dHB1dAotQGVuZCBleGFtcGxlCi0KLUBub2luZGVudAotbGlzdHMgaW4gdGhlIGNhbGwgZ3JhcGggYWxsIGZ1bmN0aW9ucyB0aGF0IHdlcmUgcmVhY2hlZCBmcm9tIGVpdGhlcgotQGNvZGV7Zm9vfSBvciBAY29kZXtiYXJ9IGFuZCB3ZXJlIG5vdCByZWFjaGFibGUgZnJvbSBAY29kZXtib3Jpbmd9LgotCi1Abm9kZSBTeW1zcGVjcywsRGVwcmljYXRlZCBPcHRpb25zLEludm9raW5nCi1Ac2VjdGlvbiBTeW1zcGVjcwotCi1NYW55IG9mIHRoZSBvdXRwdXQgb3B0aW9ucyBhbGxvdyBmdW5jdGlvbnMgdG8gYmUgaW5jbHVkZWQgb3IgZXhjbHVkZWQKLXVzaW5nIEBkZm57c3ltc3BlY3N9IChzeW1ib2wgc3BlY2lmaWNhdGlvbnMpLCB3aGljaCBvYnNlcnZlIHRoZQotZm9sbG93aW5nIHN5bnRheDoKLQotQGV4YW1wbGUKLSAgZmlsZW5hbWVfY29udGFpbmluZ19hX2RvdAotfCBmdW5jbmFtZV9ub3RfY29udGFpbmluZ19hX2RvdAotfCBsaW5lbnVtYmVyCi18ICggWyBhbnlfZmlsZW5hbWUgXSBgOicgKCBhbnlfZnVuY25hbWUgfCBsaW5lbnVtYmVyICkgKQotQGVuZCBleGFtcGxlCi0KLUhlcmUgYXJlIHNvbWUgc2FtcGxlIHN5bXNwZWNzOgotCi1AdGFibGUgQHNhbXAKLUBpdGVtIG1haW4uYwotU2VsZWN0cyBldmVyeXRoaW5nIGluIGZpbGUgQGZpbGV7bWFpbi5jfS0tLXRoZQotZG90IGluIHRoZSBzdHJpbmcgdGVsbHMgZ3Byb2YgdG8gaW50ZXJwcmV0Ci10aGUgc3RyaW5nIGFzIGEgZmlsZW5hbWUsIHJhdGhlciB0aGFuIGFzCi1hIGZ1bmN0aW9uIG5hbWUuICBUbyBzZWxlY3QgYSBmaWxlIHdob3NlCi1uYW1lIGRvZXMgbm90IGNvbnRhaW4gYSBkb3QsIGEgdHJhaWxpbmcgY29sb24KLXNob3VsZCBiZSBzcGVjaWZpZWQuICBGb3IgZXhhbXBsZSwgQHNhbXB7b2RkOn0gaXMKLWludGVycHJldGVkIGFzIHRoZSBmaWxlIG5hbWVkIEBmaWxle29kZH0uCi0KLUBpdGVtIG1haW4KLVNlbGVjdHMgYWxsIGZ1bmN0aW9ucyBuYW1lZCBAc2FtcHttYWlufS4KLQotTm90ZSB0aGF0IHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgZnVuY3Rpb24gbmFtZQotYmVjYXVzZSBzb21lIG9mIHRoZSBkZWZpbml0aW9ucyBtYXkgYmUgbG9jYWwgKGkuZS4sIHN0YXRpYykuICBVbmxlc3MgYQotZnVuY3Rpb24gbmFtZSBpcyB1bmlxdWUgaW4gYSBwcm9ncmFtLCB5b3UgbXVzdCB1c2UgdGhlIGNvbG9uIG5vdGF0aW9uCi1leHBsYWluZWQgYmVsb3cgdG8gc3BlY2lmeSBhIGZ1bmN0aW9uIGZyb20gYSBzcGVjaWZpYyBzb3VyY2UgZmlsZS4KLQotU29tZXRpbWVzLCBmdW5jdGlvbiBuYW1lcyBjb250YWluIGRvdHMuICBJbiBzdWNoIGNhc2VzLCBpdCBpcyBuZWNlc3NhcnkKLXRvIGFkZCBhIGxlYWRpbmcgY29sb24gdG8gdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgQHNhbXB7Oi5tdWx9IHNlbGVjdHMKLWZ1bmN0aW9uIEBzYW1wey5tdWx9LgotCi1JbiBzb21lIG9iamVjdCBmaWxlIGZvcm1hdHMsIHN5bWJvbHMgaGF2ZSBhIGxlYWRpbmcgdW5kZXJzY29yZS4gIGdwcm9mCi13aWxsIG5vcm1hbGx5IG5vdCBwcmludCB0aGVzZSB1bmRlcnNjb3Jlcy4gIEhvd2V2ZXIsIHlvdSBtdXN0IHVzZSB0aGUKLXVuZGVyc2NvcmUgd2hlbiB5b3UgbmFtZSBhIHN5bWJvbCBpbiBhIHN5bXNwZWMuICBZb3UgY2FuIHVzZSB0aGUKLUBjb2Rle25tfSBwcm9ncmFtIHRvIHNlZSB3aGV0aGVyIHN5bWJvbHMgaGF2ZSB1bmRlcnNjb3JlcyBmb3IgdGhlIG9iamVjdAotZmlsZSBmb3JtYXQgeW91IGFyZSB1c2luZy4KLQotQGl0ZW0gbWFpbi5jOm1haW4KLVNlbGVjdHMgZnVuY3Rpb24gQHNhbXB7bWFpbn0gaW4gZmlsZSBAZmlsZXttYWluLmN9LgotCi1AaXRlbSBtYWluLmM6MTM0Ci1TZWxlY3RzIGxpbmUgMTM0IGluIGZpbGUgQGZpbGV7bWFpbi5jfS4KLUBlbmQgdGFibGUKLQotQG5vZGUgT3V0cHV0Ci1AY2hhcHRlciBJbnRlcnByZXRpbmcgQGNvZGV7Z3Byb2Z9J3MgT3V0cHV0Ci0KLUBjb2Rle2dwcm9mfSBjYW4gcHJvZHVjZSBzZXZlcmFsIGRpZmZlcmVudCBvdXRwdXQgc3R5bGVzLCB0aGUKLW1vc3QgaW1wb3J0YW50IG9mIHdoaWNoIGFyZSBkZXNjcmliZWQgYmVsb3cuICBUaGUgc2ltcGxlc3Qgb3V0cHV0Ci1zdHlsZXMgKGZpbGUgaW5mb3JtYXRpb24sIGV4ZWN1dGlvbiBjb3VudCwgYW5kIGZ1bmN0aW9uIGFuZCBmaWxlIG9yZGVyaW5nKQotYXJlIG5vdCBkZXNjcmliZWQgaGVyZSwgYnV0IGFyZSBkb2N1bWVudGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgb3B0aW9ucwotdGhhdCB0cmlnZ2VyIHRoZW0uCi1AeHJlZntPdXRwdXQgT3B0aW9uc30uCi0KLUBtZW51Ci0qIEZsYXQgUHJvZmlsZTo6ICAgICAgICBUaGUgZmxhdCBwcm9maWxlIHNob3dzIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW5nIGRpcmVjdGx5IGluIGVhY2ggZnVuY3Rpb24uCi0qIENhbGwgR3JhcGg6OiAgICAgICAgICBUaGUgY2FsbCBncmFwaCBzaG93cyB3aGljaCBmdW5jdGlvbnMgY2FsbGVkIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJzLCBhbmQgaG93IG11Y2ggdGltZSBlYWNoIGZ1bmN0aW9uIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGl0cyBzdWJyb3V0aW5lIGNhbGxzIGFyZSBpbmNsdWRlZC4KLSogTGluZS1ieS1saW5lOjogICAgICAgIEBjb2Rle2dwcm9mfSBjYW4gYW5hbHl6ZSBpbmRpdmlkdWFsIHNvdXJjZSBjb2RlIGxpbmVzCi0qIEFubm90YXRlZCBTb3VyY2U6OiAgICBUaGUgYW5ub3RhdGVkIHNvdXJjZSBsaXN0aW5nIGRpc3BsYXlzIHNvdXJjZSBjb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxlZCB3aXRoIGV4ZWN1dGlvbiBjb3VudHMKLUBlbmQgbWVudQotCi0KLUBub2RlIEZsYXQgUHJvZmlsZSxDYWxsIEdyYXBoLCxPdXRwdXQKLUBzZWN0aW9uIFRoZSBGbGF0IFByb2ZpbGUKLUBjaW5kZXggZmxhdCBwcm9maWxlCi0KLVRoZSBAZGZue2ZsYXQgcHJvZmlsZX0gc2hvd3MgdGhlIHRvdGFsIGFtb3VudCBvZiB0aW1lIHlvdXIgcHJvZ3JhbQotc3BlbnQgZXhlY3V0aW5nIGVhY2ggZnVuY3Rpb24uICBVbmxlc3MgdGhlIEBzYW1wey16fSBvcHRpb24gaXMgZ2l2ZW4sCi1mdW5jdGlvbnMgd2l0aCBubyBhcHBhcmVudCB0aW1lIHNwZW50IGluIHRoZW0sIGFuZCBubyBhcHBhcmVudCBjYWxscwotdG8gdGhlbSwgYXJlIG5vdCBtZW50aW9uZWQuICBOb3RlIHRoYXQgaWYgYSBmdW5jdGlvbiB3YXMgbm90IGNvbXBpbGVkCi1mb3IgcHJvZmlsaW5nLCBhbmQgZGlkbid0IHJ1biBsb25nIGVub3VnaCB0byBzaG93IHVwIG9uIHRoZSBwcm9ncmFtCi1jb3VudGVyIGhpc3RvZ3JhbSwgaXQgd2lsbCBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgZnVuY3Rpb24gdGhhdAotd2FzIG5ldmVyIGNhbGxlZC4KLQotVGhpcyBpcyBwYXJ0IG9mIGEgZmxhdCBwcm9maWxlIGZvciBhIHNtYWxsIHByb2dyYW06Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotRmxhdCBwcm9maWxlOgotCi1FYWNoIHNhbXBsZSBjb3VudHMgYXMgMC4wMSBzZWNvbmRzLgotICAlICAgY3VtdWxhdGl2ZSAgIHNlbGYgICAgICAgICAgICAgIHNlbGYgICAgIHRvdGFsICAgICAgICAgICAKLSB0aW1lICAgc2Vjb25kcyAgIHNlY29uZHMgICAgY2FsbHMgIG1zL2NhbGwgIG1zL2NhbGwgIG5hbWUgICAgCi0gMzMuMzQgICAgICAwLjAyICAgICAwLjAyICAgICA3MjA4ICAgICAwLjAwICAgICAwLjAwICBvcGVuCi0gMTYuNjcgICAgICAwLjAzICAgICAwLjAxICAgICAgMjQ0ICAgICAwLjA0ICAgICAwLjEyICBvZmZ0aW1lCi0gMTYuNjcgICAgICAwLjA0ICAgICAwLjAxICAgICAgICA4ICAgICAxLjI1ICAgICAxLjI1ICBtZW1jY3B5Ci0gMTYuNjcgICAgICAwLjA1ICAgICAwLjAxICAgICAgICA3ICAgICAxLjQzICAgICAxLjQzICB3cml0ZQotIDE2LjY3ICAgICAgMC4wNiAgICAgMC4wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWNvdW50Ci0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgMjM2ICAgICAwLjAwICAgICAwLjAwICB0enNldAotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgIDE5MiAgICAgMC4wMCAgICAgMC4wMCAgdG9sb3dlcgotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICA0NyAgICAgMC4wMCAgICAgMC4wMCAgc3RybGVuCi0gIDAuMDAgICAgICAwLjA2ICAgICAwLjAwICAgICAgIDQ1ICAgICAwLjAwICAgICAwLjAwICBzdHJjaHIKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgNTAuMDAgIG1haW4KLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgIDAuMDAgIG1lbWNweQotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICAxMC4xMSAgcHJpbnQKLSAgMC4wMCAgICAgIDAuMDYgICAgIDAuMDAgICAgICAgIDEgICAgIDAuMDAgICAgIDAuMDAgIHByb2ZpbAotICAwLjAwICAgICAgMC4wNiAgICAgMC4wMCAgICAgICAgMSAgICAgMC4wMCAgICA1MC4wMCAgcmVwb3J0Ci1AZG90c3t9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9pbmRlbnQKLVRoZSBmdW5jdGlvbnMgYXJlIHNvcnRlZCBieSBmaXJzdCBieSBkZWNyZWFzaW5nIHJ1bi10aW1lIHNwZW50IGluIHRoZW0sCi10aGVuIGJ5IGRlY3JlYXNpbmcgbnVtYmVyIG9mIGNhbGxzLCB0aGVuIGFscGhhYmV0aWNhbGx5IGJ5IG5hbWUuICBUaGUKLWZ1bmN0aW9ucyBAc2FtcHttY291bnR9IGFuZCBAc2FtcHtwcm9maWx9IGFyZSBwYXJ0IG9mIHRoZSBwcm9maWxpbmcKLWFwYXJhdHVzIGFuZCBhcHBlYXIgaW4gZXZlcnkgZmxhdCBwcm9maWxlOyB0aGVpciB0aW1lIGdpdmVzIGEgbWVhc3VyZSBvZgotdGhlIGFtb3VudCBvZiBvdmVyaGVhZCBkdWUgdG8gcHJvZmlsaW5nLgotCi1KdXN0IGJlZm9yZSB0aGUgY29sdW1uIGhlYWRlcnMsIGEgc3RhdGVtZW50IGFwcGVhcnMgaW5kaWNhdGluZwotaG93IG11Y2ggdGltZSBlYWNoIHNhbXBsZSBjb3VudGVkIGFzLgotVGhpcyBAZGZue3NhbXBsaW5nIHBlcmlvZH0gZXN0aW1hdGVzIHRoZSBtYXJnaW4gb2YgZXJyb3IgaW4gZWFjaCBvZiB0aGUgdGltZQotZmlndXJlcy4gIEEgdGltZSBmaWd1cmUgdGhhdCBpcyBub3QgbXVjaCBsYXJnZXIgdGhhbiB0aGlzIGlzIG5vdAotcmVsaWFibGUuICBJbiB0aGlzIGV4YW1wbGUsIGVhY2ggc2FtcGxlIGNvdW50ZWQgYXMgMC4wMSBzZWNvbmRzLAotc3VnZ2VzdGluZyBhIDEwMCBIeiBzYW1wbGluZyByYXRlLgotVGhlIHByb2dyYW0ncyB0b3RhbCBleGVjdXRpb24gdGltZSB3YXMgMC4wNgotc2Vjb25kcywgYXMgaW5kaWNhdGVkIGJ5IHRoZSBAc2FtcHtjdW11bGF0aXZlIHNlY29uZHN9IGZpZWxkLiAgU2luY2UKLWVhY2ggc2FtcGxlIGNvdW50ZWQgZm9yIDAuMDEgc2Vjb25kcywgdGhpcyBtZWFucyBvbmx5IHNpeCBzYW1wbGVzCi13ZXJlIHRha2VuIGR1cmluZyB0aGUgcnVuLiAgVHdvIG9mIHRoZSBzYW1wbGVzIG9jY3VyZWQgd2hpbGUgdGhlCi1wcm9ncmFtIHdhcyBpbiB0aGUgQHNhbXB7b3Blbn0gZnVuY3Rpb24sIGFzIGluZGljYXRlZCBieSB0aGUKLUBzYW1we3NlbGYgc2Vjb25kc30gZmllbGQuICBFYWNoIG9mIHRoZSBvdGhlciBmb3VyIHNhbXBsZXMKLW9jY3VyZWQgb25lIGVhY2ggaW4gQHNhbXB7b2ZmdGltZX0sIEBzYW1we21lbWNjcHl9LCBAc2FtcHt3cml0ZX0sCi1hbmQgQHNhbXB7bWNvdW50fS4KLVNpbmNlIG9ubHkgc2l4IHNhbXBsZXMgd2VyZSB0YWtlbiwgbm9uZSBvZiB0aGVzZSB2YWx1ZXMgY2FuCi1iZSByZWdhcmRlZCBhcyBwYXJ0aWN1bGFybHkgcmVsaWFibGUuCi1JbiBhbm90aGVyIHJ1biwKLXRoZSBAc2FtcHtzZWxmIHNlY29uZHN9IGZpZWxkIGZvcgotQHNhbXB7bWNvdW50fSBtaWdodCB3ZWxsIGJlIEBzYW1wezAuMDB9IG9yIEBzYW1wezAuMDJ9LgotQHhyZWZ7U2FtcGxpbmcgRXJyb3J9LCBmb3IgYSBjb21wbGV0ZSBkaXNjdXNzaW9uLgotCi1UaGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBpbiB0aGUgbGlzdGluZyAodGhvc2Ugd2hvc2UKLUBzYW1we3NlbGYgc2Vjb25kc30gZmllbGQgaXMgQHNhbXB7MC4wMH0pIGRpZG4ndCBhcHBlYXIKLWluIHRoZSBoaXN0b2dyYW0gc2FtcGxlcyBhdCBhbGwuICBIb3dldmVyLCB0aGUgY2FsbCBncmFwaAotaW5kaWNhdGVkIHRoYXQgdGhleSB3ZXJlIGNhbGxlZCwgc28gdGhlcmVmb3JlIHRoZXkgYXJlIGxpc3RlZCwKLXNvcnRlZCBpbiBkZWNyZWFzaW5nIG9yZGVyIGJ5IHRoZSBAc2FtcHtjYWxsc30gZmllbGQuCi1DbGVhcmx5IHNvbWUgdGltZSB3YXMgc3BlbnQgZXhlY3V0aW5nIHRoZXNlIGZ1bmN0aW9ucywKLWJ1dCB0aGUgcGF1Y2l0eSBvZiBoaXN0b2dyYW0gc2FtcGxlcyBwcmV2ZW50cyBhbnkKLWRldGVybWluYXRpb24gb2YgaG93IG11Y2ggdGltZSBlYWNoIHRvb2suCi0KLUhlcmUgaXMgd2hhdCB0aGUgZmllbGRzIGluIGVhY2ggbGluZSBtZWFuOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtICUgdGltZQotVGhpcyBpcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgdG90YWwgZXhlY3V0aW9uIHRpbWUgeW91ciBwcm9ncmFtIHNwZW50Ci1pbiB0aGlzIGZ1bmN0aW9uLiAgVGhlc2Ugc2hvdWxkIGFsbCBhZGQgdXAgdG8gMTAwJS4KLQotQGl0ZW0gY3VtdWxhdGl2ZSBzZWNvbmRzCi1UaGlzIGlzIHRoZSBjdW11bGF0aXZlIHRvdGFsIG51bWJlciBvZiBzZWNvbmRzIHRoZSBjb21wdXRlciBzcGVudAotZXhlY3V0aW5nIHRoaXMgZnVuY3Rpb25zLCBwbHVzIHRoZSB0aW1lIHNwZW50IGluIGFsbCB0aGUgZnVuY3Rpb25zCi1hYm92ZSB0aGlzIG9uZSBpbiB0aGlzIHRhYmxlLgotCi1AaXRlbSBzZWxmIHNlY29uZHMKLVRoaXMgaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIGFjY291bnRlZCBmb3IgYnkgdGhpcyBmdW5jdGlvbiBhbG9uZS4KLVRoZSBmbGF0IHByb2ZpbGUgbGlzdGluZyBpcyBzb3J0ZWQgZmlyc3QgYnkgdGhpcyBudW1iZXIuCi0KLUBpdGVtIGNhbGxzCi1UaGlzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdGltZXMgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQuICBJZiB0aGUKLWZ1bmN0aW9uIHdhcyBuZXZlciBjYWxsZWQsIG9yIHRoZSBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGNhbGxlZCBjYW5ub3QKLWJlIGRldGVybWluZWQgKHByb2JhYmx5IGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdhcyBub3QgY29tcGlsZWQgd2l0aAotcHJvZmlsaW5nIGVuYWJsZWQpLCB0aGUgQGRmbntjYWxsc30gZmllbGQgaXMgYmxhbmsuCi0KLUBpdGVtIHNlbGYgbXMvY2FsbAotVGhpcyByZXByZXNlbnRzIHRoZSBhdmVyYWdlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc3BlbnQgaW4gdGhpcwotZnVuY3Rpb24gcGVyIGNhbGwsIGlmIHRoaXMgZnVuY3Rpb24gaXMgcHJvZmlsZWQuICBPdGhlcndpc2UsIHRoaXMgZmllbGQKLWlzIGJsYW5rIGZvciB0aGlzIGZ1bmN0aW9uLgotCi1AaXRlbSB0b3RhbCBtcy9jYWxsCi1UaGlzIHJlcHJlc2VudHMgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzcGVudCBpbiB0aGlzCi1mdW5jdGlvbiBhbmQgaXRzIGRlc2NlbmRhbnRzIHBlciBjYWxsLCBpZiB0aGlzIGZ1bmN0aW9uIGlzIHByb2ZpbGVkLgotT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIGlzIGJsYW5rIGZvciB0aGlzIGZ1bmN0aW9uLgotVGhpcyBpcyB0aGUgb25seSBmaWVsZCBpbiB0aGUgZmxhdCBwcm9maWxlIHRoYXQgdXNlcyBjYWxsIGdyYXBoIGFuYWx5c2lzLgotCi1AaXRlbSBuYW1lCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4gICBUaGUgZmxhdCBwcm9maWxlIGlzIHNvcnRlZCBieSB0aGlzCi1maWVsZCBhbHBoYWJldGljYWxseSBhZnRlciB0aGUgQGRmbntzZWxmIHNlY29uZHN9IGFuZCBAZGZue2NhbGxzfQotZmllbGRzIGFyZSBzb3J0ZWQuCi1AZW5kIHRhYmxlCi0KLUBub2RlIENhbGwgR3JhcGgsTGluZS1ieS1saW5lLEZsYXQgUHJvZmlsZSxPdXRwdXQKLUBzZWN0aW9uIFRoZSBDYWxsIEdyYXBoCi1AY2luZGV4IGNhbGwgZ3JhcGgKLQotVGhlIEBkZm57Y2FsbCBncmFwaH0gc2hvd3MgaG93IG11Y2ggdGltZSB3YXMgc3BlbnQgaW4gZWFjaCBmdW5jdGlvbgotYW5kIGl0cyBjaGlsZHJlbi4gIEZyb20gdGhpcyBpbmZvcm1hdGlvbiwgeW91IGNhbiBmaW5kIGZ1bmN0aW9ucyB0aGF0LAotd2hpbGUgdGhleSB0aGVtc2VsdmVzIG1heSBub3QgaGF2ZSB1c2VkIG11Y2ggdGltZSwgY2FsbGVkIG90aGVyCi1mdW5jdGlvbnMgdGhhdCBkaWQgdXNlIHVudXN1YWwgYW1vdW50cyBvZiB0aW1lLgotCi1IZXJlIGlzIGEgc2FtcGxlIGNhbGwgZnJvbSBhIHNtYWxsIHByb2dyYW0uICBUaGlzIGNhbGwgY2FtZSBmcm9tIHRoZQotc2FtZSBAY29kZXtncHJvZn0gcnVuIGFzIHRoZSBmbGF0IHByb2ZpbGUgZXhhbXBsZSBpbiB0aGUgcHJldmlvdXMKLWNoYXB0ZXIuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgMiBieXRlKHMpIGZvciAyMC4wMCUgb2YgMC4wNSBzZWNvbmRzCi0KLWluZGV4ICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BvbnRhbmVvdXM+Ci1bMV0gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgICAgICAgICAgICBzdGFydCBbMV0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzIgICAgICAgICAgIG9uX2V4aXQgWzI4XQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICAxLzEgICAgICAgICAgIGV4aXQgWzU5XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBzdGFydCBbMV0KLVsyXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgcmVwb3J0IFszXQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICBtYWluIFsyXQotWzNdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgcmVwb3J0IFszXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMyAgICAgICA4LzggICAgICAgICAgIHRpbWVsb2NhbCBbNl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDEgICAgICAgMS8xICAgICAgICAgICBwcmludCBbOV0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDEgICAgICAgOS85ICAgICAgICAgICBmZ2V0cyBbMTJdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgMTIvMzQgICAgICAgICAgc3RybmNtcCA8Y3ljbGUgMT4gWzQwXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA4LzggICAgICAgICAgIGxvb2t1cCBbMjBdCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMSAgICAgICAgICAgZm9wZW4gWzIxXQotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA4LzggICAgICAgICAgIGNoZXd0aW1lIFsyNF0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgOC8xNiAgICAgICAgICBza2lwc3BhY2UgWzQ0XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVs0XSAgICAgNTkuOCAgICAwLjAxICAgICAgICAwLjAyICAgICAgIDgrNDcyICAgICA8Y3ljbGUgMiBhcyBhIHdob2xlPglbNF0KLSAgICAgICAgICAgICAgICAwLjAxICAgICAgICAwLjAyICAgICAyNDQrMjYwICAgICAgICAgb2ZmdGltZSA8Y3ljbGUgMj4gWzddCi0gICAgICAgICAgICAgICAgMC4wMCAgICAgICAgMC4wMCAgICAgMjM2KzEgICAgICAgICAgIHR6c2V0IDxjeWNsZSAyPiBbMjZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGxpbmVzIGZ1bGwgb2YgZGFzaGVzIGRpdmlkZSB0aGlzIHRhYmxlIGludG8gQGRmbntlbnRyaWVzfSwgb25lIGZvciBlYWNoCi1mdW5jdGlvbi4gIEVhY2ggZW50cnkgaGFzIG9uZSBvciBtb3JlIGxpbmVzLgotCi1JbiBlYWNoIGVudHJ5LCB0aGUgcHJpbWFyeSBsaW5lIGlzIHRoZSBvbmUgdGhhdCBzdGFydHMgd2l0aCBhbiBpbmRleCBudW1iZXIKLWluIHNxdWFyZSBicmFja2V0cy4gIFRoZSBlbmQgb2YgdGhpcyBsaW5lIHNheXMgd2hpY2ggZnVuY3Rpb24gdGhlIGVudHJ5IGlzCi1mb3IuICBUaGUgcHJlY2VkaW5nIGxpbmVzIGluIHRoZSBlbnRyeSBkZXNjcmliZSB0aGUgY2FsbGVycyBvZiB0aGlzCi1mdW5jdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBsaW5lcyBkZXNjcmliZSBpdHMgc3Vicm91dGluZXMgKGFsc28gY2FsbGVkCi1AZGZue2NoaWxkcmVufSB3aGVuIHdlIHNwZWFrIG9mIHRoZSBjYWxsIGdyYXBoKS4KLQotVGhlIGVudHJpZXMgYXJlIHNvcnRlZCBieSB0aW1lIHNwZW50IGluIHRoZSBmdW5jdGlvbiBhbmQgaXRzIHN1YnJvdXRpbmVzLgotCi1UaGUgaW50ZXJuYWwgcHJvZmlsaW5nIGZ1bmN0aW9uIEBjb2Rle21jb3VudH0gKEBweHJlZntGbGF0IFByb2ZpbGV9KQotaXMgbmV2ZXIgbWVudGlvbmVkIGluIHRoZSBjYWxsIGdyYXBoLgotCi1AbWVudQotKiBQcmltYXJ5OjogICAgICAgRGV0YWlscyBvZiB0aGUgcHJpbWFyeSBsaW5lJ3MgY29udGVudHMuCi0qIENhbGxlcnM6OiAgICAgICBEZXRhaWxzIG9mIGNhbGxlci1saW5lcycgY29udGVudHMuCi0qIFN1YnJvdXRpbmVzOjogICBEZXRhaWxzIG9mIHN1YnJvdXRpbmUtbGluZXMnIGNvbnRlbnRzLgotKiBDeWNsZXM6OiAgICAgICAgV2hlbiB0aGVyZSBhcmUgY3ljbGVzIG9mIHJlY3Vyc2lvbiwKLSAgICAgICAgICAgICAgICAgICBzdWNoIGFzIEBjb2Rle2F9IGNhbGxzIEBjb2Rle2J9IGNhbGxzIEBjb2Rle2F9QGRvdHN7fQotQGVuZCBtZW51Ci0KLUBub2RlIFByaW1hcnkKLUBzdWJzZWN0aW9uIFRoZSBQcmltYXJ5IExpbmUKLQotVGhlIEBkZm57cHJpbWFyeSBsaW5lfSBpbiBhIGNhbGwgZ3JhcGggZW50cnkgaXMgdGhlIGxpbmUgdGhhdAotZGVzY3JpYmVzIHRoZSBmdW5jdGlvbiB3aGljaCB0aGUgZW50cnkgaXMgYWJvdXQgYW5kIGdpdmVzIHRoZSBvdmVyYWxsCi1zdGF0aXN0aWNzIGZvciB0aGlzIGZ1bmN0aW9uLgotCi1Gb3IgcmVmZXJlbmNlLCB3ZSByZXBlYXQgdGhlIHByaW1hcnkgbGluZSBmcm9tIHRoZSBlbnRyeSBmb3IgZnVuY3Rpb24KLUBjb2Rle3JlcG9ydH0gaW4gb3VyIG1haW4gZXhhbXBsZSwgdG9nZXRoZXIgd2l0aCB0aGUgaGVhZGluZyBsaW5lIHRoYXQKLXNob3dzIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzOgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi1AZG90c3t9Ci1bM10gICAgMTAwLjAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEgICAgICAgICByZXBvcnQgWzNdCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1IZXJlIGlzIHdoYXQgdGhlIGZpZWxkcyBpbiB0aGUgcHJpbWFyeSBsaW5lIG1lYW46Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gaW5kZXgKLUVudHJpZXMgYXJlIG51bWJlcmVkIHdpdGggY29uc2VjdXRpdmUgaW50ZWdlcnMuICBFYWNoIGZ1bmN0aW9uCi10aGVyZWZvcmUgaGFzIGFuIGluZGV4IG51bWJlciwgd2hpY2ggYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0cwotcHJpbWFyeSBsaW5lLgotCi1FYWNoIGNyb3NzLXJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLCBhcyBhIGNhbGxlciBvciBzdWJyb3V0aW5lIG9mCi1hbm90aGVyLCBnaXZlcyBpdHMgaW5kZXggbnVtYmVyIGFzIHdlbGwgYXMgaXRzIG5hbWUuICBUaGUgaW5kZXggbnVtYmVyCi1ndWlkZXMgeW91IGlmIHlvdSB3aXNoIHRvIGxvb2sgZm9yIHRoZSBlbnRyeSBmb3IgdGhhdCBmdW5jdGlvbi4KLQotQGl0ZW0gJSB0aW1lCi1UaGlzIGlzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCB0aW1lIHRoYXQgd2FzIHNwZW50IGluIHRoaXMKLWZ1bmN0aW9uLCBpbmNsdWRpbmcgdGltZSBzcGVudCBpbiBzdWJyb3V0aW5lcyBjYWxsZWQgZnJvbSB0aGlzCi1mdW5jdGlvbi4KLQotVGhlIHRpbWUgc3BlbnQgaW4gdGhpcyBmdW5jdGlvbiBpcyBjb3VudGVkIGFnYWluIGZvciB0aGUgY2FsbGVycyBvZgotdGhpcyBmdW5jdGlvbi4gIFRoZXJlZm9yZSwgYWRkaW5nIHVwIHRoZXNlIHBlcmNlbnRhZ2VzIGlzIG1lYW5pbmdsZXNzLgotCi1AaXRlbSBzZWxmCi1UaGlzIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBzcGVudCBpbiB0aGlzIGZ1bmN0aW9uLiAgVGhpcwotc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGUgbnVtYmVyIHByaW50ZWQgaW4gdGhlIEBjb2Rle3NlY29uZHN9IGZpZWxkCi1mb3IgdGhpcyBmdW5jdGlvbiBpbiB0aGUgZmxhdCBwcm9maWxlLgotCi1AaXRlbSBjaGlsZHJlbgotVGhpcyBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgc3BlbnQgaW4gdGhlIHN1YnJvdXRpbmUgY2FsbHMgbWFkZSBieQotdGhpcyBmdW5jdGlvbi4gIFRoaXMgc2hvdWxkIGJlIGVxdWFsIHRvIHRoZSBzdW0gb2YgYWxsIHRoZSBAY29kZXtzZWxmfQotYW5kIEBjb2Rle2NoaWxkcmVufSBlbnRyaWVzIG9mIHRoZSBjaGlsZHJlbiBsaXN0ZWQgZGlyZWN0bHkgYmVsb3cgdGhpcwotZnVuY3Rpb24uCi0KLUBpdGVtIGNhbGxlZAotVGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLgotCi1JZiB0aGUgZnVuY3Rpb24gY2FsbGVkIGl0c2VsZiByZWN1cnNpdmVseSwgdGhlcmUgYXJlIHR3byBudW1iZXJzLAotc2VwYXJhdGVkIGJ5IGEgQHNhbXB7K30uICBUaGUgZmlyc3QgbnVtYmVyIGNvdW50cyBub24tcmVjdXJzaXZlIGNhbGxzLAotYW5kIHRoZSBzZWNvbmQgY291bnRzIHJlY3Vyc2l2ZSBjYWxscy4KLQotSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBmdW5jdGlvbiBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgb25jZSBmcm9tCi1AY29kZXttYWlufS4KLQotQGl0ZW0gbmFtZQotVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gIFRoZSBpbmRleCBudW1iZXIgaXMKLXJlcGVhdGVkIGFmdGVyIGl0LgotCi1JZiB0aGUgZnVuY3Rpb24gaXMgcGFydCBvZiBhIGN5Y2xlIG9mIHJlY3Vyc2lvbiwgdGhlIGN5Y2xlIG51bWJlciBpcwotcHJpbnRlZCBiZXR3ZWVuIHRoZSBmdW5jdGlvbidzIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIKLShAcHhyZWZ7Q3ljbGVzfSkuICBGb3IgZXhhbXBsZSwgaWYgZnVuY3Rpb24gQGNvZGV7Z251cnJ9IGlzIHBhcnQgb2YKLWN5Y2xlIG51bWJlciBvbmUsIGFuZCBoYXMgaW5kZXggbnVtYmVyIHR3ZWx2ZSwgaXRzIHByaW1hcnkgbGluZSB3b3VsZAotYmUgZW5kIGxpa2UgdGhpczoKLQotQGV4YW1wbGUKLWdudXJyIDxjeWNsZSAxPiBbMTJdCi1AZW5kIGV4YW1wbGUKLUBlbmQgdGFibGUKLQotQG5vZGUgQ2FsbGVycywgU3Vicm91dGluZXMsIFByaW1hcnksIENhbGwgR3JhcGgKLUBzdWJzZWN0aW9uIExpbmVzIGZvciBhIEZ1bmN0aW9uJ3MgQ2FsbGVycwotCi1BIGZ1bmN0aW9uJ3MgZW50cnkgaGFzIGEgbGluZSBmb3IgZWFjaCBmdW5jdGlvbiBpdCB3YXMgY2FsbGVkIGJ5LgotVGhlc2UgbGluZXMnIGZpZWxkcyBjb3JyZXNwb25kIHRvIHRoZSBmaWVsZHMgb2YgdGhlIHByaW1hcnkgbGluZSwgYnV0Ci10aGVpciBtZWFuaW5ncyBhcmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgdGhlIGRpZmZlcmVuY2UgaW4gY29udGV4dC4KLQotRm9yIHJlZmVyZW5jZSwgd2UgcmVwZWF0IHR3byBsaW5lcyBmcm9tIHRoZSBlbnRyeSBmb3IgdGhlIGZ1bmN0aW9uCi1AY29kZXtyZXBvcnR9LCB0aGUgcHJpbWFyeSBsaW5lIGFuZCBvbmUgY2FsbGVyLWxpbmUgcHJlY2VkaW5nIGl0LCB0b2dldGhlcgotd2l0aCB0aGUgaGVhZGluZyBsaW5lIHRoYXQgc2hvd3MgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHM6Ci0KLUBzbWFsbGV4YW1wbGUKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi1AZG90c3t9Ci0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjA1ICAgICAgIDEvMSAgICAgICAgICAgbWFpbiBbMl0KLVszXSAgICAxMDAuMCAgICAwLjAwICAgIDAuMDUgICAgICAgMSAgICAgICAgIHJlcG9ydCBbM10KLUBlbmQgc21hbGxleGFtcGxlCi0KLUhlcmUgYXJlIHRoZSBtZWFuaW5ncyBvZiB0aGUgZmllbGRzIGluIHRoZSBjYWxsZXItbGluZSBmb3IgQGNvZGV7cmVwb3J0fQotY2FsbGVkIGZyb20gQGNvZGV7bWFpbn06Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gc2VsZgotQW4gZXN0aW1hdGUgb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IGluIEBjb2Rle3JlcG9ydH0gaXRzZWxmIHdoZW4gaXQgd2FzCi1jYWxsZWQgZnJvbSBAY29kZXttYWlufS4KLQotQGl0ZW0gY2hpbGRyZW4KLUFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBzdWJyb3V0aW5lcyBvZiBAY29kZXtyZXBvcnR9Ci13aGVuIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LgotCi1UaGUgc3VtIG9mIHRoZSBAY29kZXtzZWxmfSBhbmQgQGNvZGV7Y2hpbGRyZW59IGZpZWxkcyBpcyBhbiBlc3RpbWF0ZQotb2YgdGhlIGFtb3VudCBvZiB0aW1lIHNwZW50IHdpdGhpbiBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20gQGNvZGV7bWFpbn0uCi0KLUBpdGVtIGNhbGxlZAotVHdvIG51bWJlcnM6IHRoZSBudW1iZXIgb2YgdGltZXMgQGNvZGV7cmVwb3J0fSB3YXMgY2FsbGVkIGZyb20gQGNvZGV7bWFpbn0sCi1mb2xsb3dlZCBieSB0aGUgdG90YWwgbnVtYmVyIG9mIG5vbnJlY3Vyc2l2ZSBjYWxscyB0byBAY29kZXtyZXBvcnR9IGZyb20KLWFsbCBpdHMgY2FsbGVycy4KLQotQGl0ZW0gbmFtZSBhbmQgaW5kZXggbnVtYmVyCi1UaGUgbmFtZSBvZiB0aGUgY2FsbGVyIG9mIEBjb2Rle3JlcG9ydH0gdG8gd2hpY2ggdGhpcyBsaW5lIGFwcGxpZXMsCi1mb2xsb3dlZCBieSB0aGUgY2FsbGVyJ3MgaW5kZXggbnVtYmVyLgotCi1Ob3QgYWxsIGZ1bmN0aW9ucyBoYXZlIGVudHJpZXMgaW4gdGhlIGNhbGwgZ3JhcGg7IHNvbWUKLW9wdGlvbnMgdG8gQGNvZGV7Z3Byb2Z9IHJlcXVlc3QgdGhlIG9taXNzaW9uIG9mIGNlcnRhaW4gZnVuY3Rpb25zLgotV2hlbiBhIGNhbGxlciBoYXMgbm8gZW50cnkgb2YgaXRzIG93biwgaXQgc3RpbGwgaGFzIGNhbGxlci1saW5lcwotaW4gdGhlIGVudHJpZXMgb2YgdGhlIGZ1bmN0aW9ucyBpdCBjYWxscy4KLQotSWYgdGhlIGNhbGxlciBpcyBwYXJ0IG9mIGEgcmVjdXJzaW9uIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzCi1wcmludGVkIGJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi1AZW5kIHRhYmxlCi0KLUlmIHRoZSBpZGVudGl0eSBvZiB0aGUgY2FsbGVycyBvZiBhIGZ1bmN0aW9uIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCBhCi1kdW1teSBjYWxsZXItbGluZSBpcyBwcmludGVkIHdoaWNoIGhhcyBAc2FtcHs8c3BvbnRhbmVvdXM+fSBhcyB0aGUKLWBgY2FsbGVyJ3MgbmFtZScnIGFuZCBhbGwgb3RoZXIgZmllbGRzIGJsYW5rLiAgVGhpcyBjYW4gaGFwcGVuIGZvcgotc2lnbmFsIGhhbmRsZXJzLgotQGMgV2hhdCBpZiBzb21lIGNhbGxzIGhhdmUgZGV0ZXJtaW5hYmxlIGNhbGxlcnMnIG5hbWVzIGJ1dCBub3QgYWxsPwotQGMgRklYTUUgLSBzdGlsbCByZWxldmFudD8KLQotQG5vZGUgU3Vicm91dGluZXMsIEN5Y2xlcywgQ2FsbGVycywgQ2FsbCBHcmFwaAotQHN1YnNlY3Rpb24gTGluZXMgZm9yIGEgRnVuY3Rpb24ncyBTdWJyb3V0aW5lcwotCi1BIGZ1bmN0aW9uJ3MgZW50cnkgaGFzIGEgbGluZSBmb3IgZWFjaCBvZiBpdHMgc3Vicm91dGluZXMtLS1pbiBvdGhlcgotd29yZHMsIGEgbGluZSBmb3IgZWFjaCBvdGhlciBmdW5jdGlvbiB0aGF0IGl0IGNhbGxlZC4gIFRoZXNlIGxpbmVzJwotZmllbGRzIGNvcnJlc3BvbmQgdG8gdGhlIGZpZWxkcyBvZiB0aGUgcHJpbWFyeSBsaW5lLCBidXQgdGhlaXIgbWVhbmluZ3MKLWFyZSBkaWZmZXJlbnQgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW5jZSBpbiBjb250ZXh0LgotCi1Gb3IgcmVmZXJlbmNlLCB3ZSByZXBlYXQgdHdvIGxpbmVzIGZyb20gdGhlIGVudHJ5IGZvciB0aGUgZnVuY3Rpb24KLUBjb2Rle21haW59LCB0aGUgcHJpbWFyeSBsaW5lIGFuZCBhIGxpbmUgZm9yIGEgc3Vicm91dGluZSwgdG9nZXRoZXIKLXdpdGggdGhlIGhlYWRpbmcgbGluZSB0aGF0IHNob3dzIHRoZSBuYW1lcyBvZiB0aGUgZmllbGRzOgotCi1Ac21hbGxleGFtcGxlCi1pbmRleCAgJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuIGNhbGxlZCAgICAgbmFtZQotQGRvdHN7fQotWzJdICAgIDEwMC4wICAgIDAuMDAgICAgMC4wNSAgICAgICAxICAgICAgICAgbWFpbiBbMl0KLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDUgICAgICAgMS8xICAgICAgICAgICByZXBvcnQgWzNdCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1IZXJlIGFyZSB0aGUgbWVhbmluZ3Mgb2YgdGhlIGZpZWxkcyBpbiB0aGUgc3Vicm91dGluZS1saW5lIGZvciBAY29kZXttYWlufQotY2FsbGluZyBAY29kZXtyZXBvcnR9OgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIHNlbGYKLUFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBkaXJlY3RseSB3aXRoaW4gQGNvZGV7cmVwb3J0fQotd2hlbiBAY29kZXtyZXBvcnR9IHdhcyBjYWxsZWQgZnJvbSBAY29kZXttYWlufS4KLQotQGl0ZW0gY2hpbGRyZW4KLUFuIGVzdGltYXRlIG9mIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBpbiBzdWJyb3V0aW5lcyBvZiBAY29kZXtyZXBvcnR9Ci13aGVuIEBjb2Rle3JlcG9ydH0gd2FzIGNhbGxlZCBmcm9tIEBjb2Rle21haW59LgotCi1UaGUgc3VtIG9mIHRoZSBAY29kZXtzZWxmfSBhbmQgQGNvZGV7Y2hpbGRyZW59IGZpZWxkcyBpcyBhbiBlc3RpbWF0ZQotb2YgdGhlIHRvdGFsIHRpbWUgc3BlbnQgaW4gY2FsbHMgdG8gQGNvZGV7cmVwb3J0fSBmcm9tIEBjb2Rle21haW59LgotCi1AaXRlbSBjYWxsZWQKLVR3byBudW1iZXJzLCB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIEBjb2Rle3JlcG9ydH0gZnJvbSBAY29kZXttYWlufQotZm9sbG93ZWQgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBub25yZWN1cnNpdmUgY2FsbHMgdG8gQGNvZGV7cmVwb3J0fS4KLVRoaXMgcmF0aW8gaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IG11Y2ggb2YgQGNvZGV7cmVwb3J0fSdzIEBjb2Rle3NlbGZ9Ci1hbmQgQGNvZGV7Y2hpbGRyZW59IHRpbWUgZ2V0cyBjcmVkaXRlZCB0byBAY29kZXttYWlufS4KLUB4cmVme0Fzc3VtcHRpb25zfS4KLQotQGl0ZW0gbmFtZQotVGhlIG5hbWUgb2YgdGhlIHN1YnJvdXRpbmUgb2YgQGNvZGV7bWFpbn0gdG8gd2hpY2ggdGhpcyBsaW5lIGFwcGxpZXMsCi1mb2xsb3dlZCBieSB0aGUgc3Vicm91dGluZSdzIGluZGV4IG51bWJlci4KLQotSWYgdGhlIGNhbGxlciBpcyBwYXJ0IG9mIGEgcmVjdXJzaW9uIGN5Y2xlLCB0aGUgY3ljbGUgbnVtYmVyIGlzCi1wcmludGVkIGJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSBpbmRleCBudW1iZXIuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEN5Y2xlcywsIFN1YnJvdXRpbmVzLCBDYWxsIEdyYXBoCi1Ac3Vic2VjdGlvbiBIb3cgTXV0dWFsbHkgUmVjdXJzaXZlIEZ1bmN0aW9ucyBBcmUgRGVzY3JpYmVkCi1AY2luZGV4IGN5Y2xlCi1AY2luZGV4IHJlY3Vyc2lvbiBjeWNsZQotCi1UaGUgZ3JhcGggbWF5IGJlIGNvbXBsaWNhdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBAZGZue2N5Y2xlcyBvZgotcmVjdXJzaW9ufSBpbiB0aGUgY2FsbCBncmFwaC4gIEEgY3ljbGUgZXhpc3RzIGlmIGEgZnVuY3Rpb24gY2FsbHMKLWFub3RoZXIgZnVuY3Rpb24gdGhhdCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgY2FsbHMgKG9yIGFwcGVhcnMgdG8KLWNhbGwpIHRoZSBvcmlnaW5hbCBmdW5jdGlvbi4gIEZvciBleGFtcGxlOiBpZiBAY29kZXthfSBjYWxscyBAY29kZXtifSwKLWFuZCBAY29kZXtifSBjYWxscyBAY29kZXthfSwgdGhlbiBAY29kZXthfSBhbmQgQGNvZGV7Yn0gZm9ybSBhIGN5Y2xlLgotCi1XaGVuZXZlciB0aGVyZSBhcmUgY2FsbCBwYXRocyBib3RoIHdheXMgYmV0d2VlbiBhIHBhaXIgb2YgZnVuY3Rpb25zLCB0aGV5Ci1iZWxvbmcgdG8gdGhlIHNhbWUgY3ljbGUuICBJZiBAY29kZXthfSBhbmQgQGNvZGV7Yn0gY2FsbCBlYWNoIG90aGVyIGFuZAotQGNvZGV7Yn0gYW5kIEBjb2Rle2N9IGNhbGwgZWFjaCBvdGhlciwgYWxsIHRocmVlIG1ha2Ugb25lIGN5Y2xlLiAgTm90ZSB0aGF0Ci1ldmVuIGlmIEBjb2Rle2J9IG9ubHkgY2FsbHMgQGNvZGV7YX0gaWYgaXQgd2FzIG5vdCBjYWxsZWQgZnJvbSBAY29kZXthfSwKLUBjb2Rle2dwcm9mfSBjYW5ub3QgZGV0ZXJtaW5lIHRoaXMsIHNvIEBjb2Rle2F9IGFuZCBAY29kZXtifSBhcmUgc3RpbGwKLWNvbnNpZGVyZWQgYSBjeWNsZS4KLQotVGhlIGN5Y2xlcyBhcmUgbnVtYmVyZWQgd2l0aCBjb25zZWN1dGl2ZSBpbnRlZ2Vycy4gIFdoZW4gYSBmdW5jdGlvbgotYmVsb25ncyB0byBhIGN5Y2xlLCBlYWNoIHRpbWUgdGhlIGZ1bmN0aW9uIG5hbWUgYXBwZWFycyBpbiB0aGUgY2FsbCBncmFwaAotaXQgaXMgZm9sbG93ZWQgYnkgQHNhbXB7PGN5Y2xlIEB2YXJ7bnVtYmVyfT59LgotCi1UaGUgcmVhc29uIGN5Y2xlcyBtYXR0ZXIgaXMgdGhhdCB0aGV5IG1ha2UgdGhlIHRpbWUgdmFsdWVzIGluIHRoZSBjYWxsCi1ncmFwaCBwYXJhZG94aWNhbC4gIFRoZSBgYHRpbWUgc3BlbnQgaW4gY2hpbGRyZW4nJyBvZiBAY29kZXthfSBzaG91bGQKLWluY2x1ZGUgdGhlIHRpbWUgc3BlbnQgaW4gaXRzIHN1YnJvdXRpbmUgQGNvZGV7Yn0gYW5kIGluIEBjb2Rle2J9J3MKLXN1YnJvdXRpbmVzLS0tYnV0IG9uZSBvZiBAY29kZXtifSdzIHN1YnJvdXRpbmVzIGlzIEBjb2Rle2F9ISAgSG93IG11Y2ggb2YKLUBjb2Rle2F9J3MgdGltZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNoaWxkcmVuIG9mIEBjb2Rle2F9LCB3aGVuCi1AY29kZXthfSBpcyBpbmRpcmVjdGx5IHJlY3Vyc2l2ZT8KLQotVGhlIHdheSBAY29kZXtncHJvZn0gcmVzb2x2ZXMgdGhpcyBwYXJhZG94IGlzIGJ5IGNyZWF0aW5nIGEgc2luZ2xlIGVudHJ5Ci1mb3IgdGhlIGN5Y2xlIGFzIGEgd2hvbGUuICBUaGUgcHJpbWFyeSBsaW5lIG9mIHRoaXMgZW50cnkgZGVzY3JpYmVzIHRoZQotdG90YWwgdGltZSBzcGVudCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb25zIG9mIHRoZSBjeWNsZS4gIFRoZQotYGBzdWJyb3V0aW5lcycnIG9mIHRoZSBjeWNsZSBhcmUgdGhlIGluZGl2aWR1YWwgZnVuY3Rpb25zIG9mIHRoZSBjeWNsZSwgYW5kCi1hbGwgb3RoZXIgZnVuY3Rpb25zIHRoYXQgd2VyZSBjYWxsZWQgZGlyZWN0bHkgYnkgdGhlbS4gIFRoZSBgYGNhbGxlcnMnJyBvZgotdGhlIGN5Y2xlIGFyZSB0aGUgZnVuY3Rpb25zLCBvdXRzaWRlIHRoZSBjeWNsZSwgdGhhdCBjYWxsZWQgZnVuY3Rpb25zIGluCi10aGUgY3ljbGUuCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBwb3J0aW9uIG9mIGEgY2FsbCBncmFwaCB3aGljaCBzaG93cyBhIGN5Y2xlIGNvbnRhaW5pbmcKLWZ1bmN0aW9ucyBAY29kZXthfSBhbmQgQGNvZGV7Yn0uICBUaGUgY3ljbGUgd2FzIGVudGVyZWQgYnkgYSBjYWxsIHRvCi1AY29kZXthfSBmcm9tIEBjb2Rle21haW59OyBib3RoIEBjb2Rle2F9IGFuZCBAY29kZXtifSBjYWxsZWQgQGNvZGV7Y30uCi0KLUBzbWFsbGV4YW1wbGUKLWluZGV4ICAlIHRpbWUgICAgc2VsZiAgY2hpbGRyZW4gY2FsbGVkICAgICBuYW1lCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBtYWluIFsyXQotWzNdICAgICA5MS43MSAgICAxLjc3ICAgICAgICAwICAgIDErNSAgICA8Y3ljbGUgMSBhcyBhIHdob2xlPiBbM10KLSAgICAgICAgICAgICAgICAgMS4wMiAgICAgICAgMCAgICAzICAgICAgICAgIGIgPGN5Y2xlIDE+IFs0XQotICAgICAgICAgICAgICAgICAwLjc1ICAgICAgICAwICAgIDIgICAgICAgICAgYSA8Y3ljbGUgMT4gWzVdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLVs0XSAgICAgNTIuODUgICAgMS4wMiAgICAgICAgMCAgICAwICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi1bNV0gICAgIDM4Ljg2ICAgIDAuNzUgICAgICAgIDAgICAgMSAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci0oVGhlIGVudGlyZSBjYWxsIGdyYXBoIGZvciB0aGlzIHByb2dyYW0gY29udGFpbnMgaW4gYWRkaXRpb24gYW4gZW50cnkgZm9yCi1AY29kZXttYWlufSwgd2hpY2ggY2FsbHMgQGNvZGV7YX0sIGFuZCBhbiBlbnRyeSBmb3IgQGNvZGV7Y30sIHdpdGggY2FsbGVycwotQGNvZGV7YX0gYW5kIEBjb2Rle2J9LikKLQotQHNtYWxsZXhhbXBsZQotaW5kZXggICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiBjYWxsZWQgICAgIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcG9udGFuZW91cz4KLVsxXSAgICAxMDAuMDAgICAgICAgMCAgICAgMS45MyAgICAwICAgICAgc3RhcnQgWzFdCi0gICAgICAgICAgICAgICAgIDAuMTYgICAgIDEuNzcgICAgMS8xICAgICAgICBtYWluIFsyXQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAwLjE2ICAgICAxLjc3ICAgIDEvMSAgICAgICAgc3RhcnQgWzFdCi1bMl0gICAgMTAwLjAwICAgIDAuMTYgICAgIDEuNzcgICAgMSAgICAgIG1haW4gWzJdCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgMS43NyAgICAgICAgMCAgICAxLzEgICAgICAgIG1haW4gWzJdCi1bM10gICAgIDkxLjcxICAgIDEuNzcgICAgICAgIDAgICAgMSs1ICAgIDxjeWNsZSAxIGFzIGEgd2hvbGU+IFszXQotICAgICAgICAgICAgICAgICAxLjAyICAgICAgICAwICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgIDAuNzUgICAgICAgIDAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICA2LzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLVs0XSAgICAgNTIuODUgICAgMS4wMiAgICAgICAgMCAgICAwICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLSAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgMCAgICAzLzYgICAgICAgIGMgWzZdCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICAgICAgIDEuNzcgICAgICAgIDAgICAgMS8xICAgICAgICBtYWluIFsyXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi1bNV0gICAgIDM4Ljg2ICAgIDAuNzUgICAgICAgIDAgICAgMSAgICAgIGEgPGN5Y2xlIDE+IFs1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBjIFs2XQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAwICAgICAgICAwICAgIDMvNiAgICAgICAgYiA8Y3ljbGUgMT4gWzRdCi0gICAgICAgICAgICAgICAgICAgIDAgICAgICAgIDAgICAgMy82ICAgICAgICBhIDxjeWNsZSAxPiBbNV0KLVs2XSAgICAgIDAuMDAgICAgICAgMCAgICAgICAgMCAgICA2ICAgICAgYyBbNl0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAY29kZXtzZWxmfSBmaWVsZCBvZiB0aGUgY3ljbGUncyBwcmltYXJ5IGxpbmUgaXMgdGhlIHRvdGFsIHRpbWUKLXNwZW50IGluIGFsbCB0aGUgZnVuY3Rpb25zIG9mIHRoZSBjeWNsZS4gIEl0IGVxdWFscyB0aGUgc3VtIG9mIHRoZQotQGNvZGV7c2VsZn0gZmllbGRzIGZvciB0aGUgaW5kaXZpZHVhbCBmdW5jdGlvbnMgaW4gdGhlIGN5Y2xlLCBmb3VuZAotaW4gdGhlIGVudHJ5IGluIHRoZSBzdWJyb3V0aW5lIGxpbmVzIGZvciB0aGVzZSBmdW5jdGlvbnMuCi0KLVRoZSBAY29kZXtjaGlsZHJlbn0gZmllbGRzIG9mIHRoZSBjeWNsZSdzIHByaW1hcnkgbGluZSBhbmQgc3Vicm91dGluZSBsaW5lcwotY291bnQgb25seSBzdWJyb3V0aW5lcyBvdXRzaWRlIHRoZSBjeWNsZS4gIEV2ZW4gdGhvdWdoIEBjb2Rle2F9IGNhbGxzCi1AY29kZXtifSwgdGhlIHRpbWUgc3BlbnQgaW4gdGhvc2UgY2FsbHMgdG8gQGNvZGV7Yn0gaXMgbm90IGNvdW50ZWQgaW4KLUBjb2Rle2F9J3MgQGNvZGV7Y2hpbGRyZW59IHRpbWUuICBUaHVzLCB3ZSBkbyBub3QgZW5jb3VudGVyIHRoZSBwcm9ibGVtIG9mCi13aGF0IHRvIGRvIHdoZW4gdGhlIHRpbWUgaW4gdGhvc2UgY2FsbHMgdG8gQGNvZGV7Yn0gaW5jbHVkZXMgaW5kaXJlY3QKLXJlY3Vyc2l2ZSBjYWxscyBiYWNrIHRvIEBjb2Rle2F9LgotCi1UaGUgQGNvZGV7Y2hpbGRyZW59IGZpZWxkIG9mIGEgY2FsbGVyLWxpbmUgaW4gdGhlIGN5Y2xlJ3MgZW50cnkgZXN0aW1hdGVzCi10aGUgYW1vdW50IG9mIHRpbWUgc3BlbnQgQGVtcGh7aW4gdGhlIHdob2xlIGN5Y2xlfSwgYW5kIGl0cyBvdGhlcgotc3Vicm91dGluZXMsIG9uIHRoZSB0aW1lcyB3aGVuIHRoYXQgY2FsbGVyIGNhbGxlZCBhIGZ1bmN0aW9uIGluIHRoZSBjeWNsZS4KLQotVGhlIEBjb2Rle2NhbGxzfSBmaWVsZCBpbiB0aGUgcHJpbWFyeSBsaW5lIGZvciB0aGUgY3ljbGUgaGFzIHR3byBudW1iZXJzOgotZmlyc3QsIHRoZSBudW1iZXIgb2YgdGltZXMgZnVuY3Rpb25zIGluIHRoZSBjeWNsZSB3ZXJlIGNhbGxlZCBieSBmdW5jdGlvbnMKLW91dHNpZGUgdGhlIGN5Y2xlOyBzZWNvbmQsIHRoZSBudW1iZXIgb2YgdGltZXMgdGhleSB3ZXJlIGNhbGxlZCBieQotZnVuY3Rpb25zIGluIHRoZSBjeWNsZSAoaW5jbHVkaW5nIHRpbWVzIHdoZW4gYSBmdW5jdGlvbiBpbiB0aGUgY3ljbGUgY2FsbHMKLWl0c2VsZikuICBUaGlzIGlzIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlIHVzdWFsIHNwbGl0IGludG8gbm9ucmVjdXJzaXZlIGFuZAotcmVjdXJzaXZlIGNhbGxzLgotCi1UaGUgQGNvZGV7Y2FsbHN9IGZpZWxkIG9mIGEgc3Vicm91dGluZS1saW5lIGZvciBhIGN5Y2xlIG1lbWJlciBpbiB0aGUKLWN5Y2xlJ3MgZW50cnkgc2F5cyBob3cgbWFueSB0aW1lIHRoYXQgZnVuY3Rpb24gd2FzIGNhbGxlZCBmcm9tIGZ1bmN0aW9ucyBpbgotdGhlIGN5Y2xlLiAgVGhlIHRvdGFsIG9mIGFsbCB0aGVzZSBpcyB0aGUgc2Vjb25kIG51bWJlciBpbiB0aGUgcHJpbWFyeSBsaW5lJ3MKLUBjb2Rle2NhbGxzfSBmaWVsZC4KLQotSW4gdGhlIGluZGl2aWR1YWwgZW50cnkgZm9yIGEgZnVuY3Rpb24gaW4gYSBjeWNsZSwgdGhlIG90aGVyIGZ1bmN0aW9ucyBpbgotdGhlIHNhbWUgY3ljbGUgY2FuIGFwcGVhciBhcyBzdWJyb3V0aW5lcyBhbmQgYXMgY2FsbGVycy4gIFRoZXNlIGxpbmVzIHNob3cKLWhvdyBtYW55IHRpbWVzIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGN5Y2xlIGNhbGxlZCBvciB3YXMgY2FsbGVkIGZyb20gZWFjaCBvdGhlcgotZnVuY3Rpb24gaW4gdGhlIGN5Y2xlLiAgVGhlIEBjb2Rle3NlbGZ9IGFuZCBAY29kZXtjaGlsZHJlbn0gZmllbGRzIGluIHRoZXNlCi1saW5lcyBhcmUgYmxhbmsgYmVjYXVzZSBvZiB0aGUgZGlmZmljdWx0eSBvZiBkZWZpbmluZyBtZWFuaW5ncyBmb3IgdGhlbQotd2hlbiByZWN1cnNpb24gaXMgZ29pbmcgb24uCi0KLUBub2RlIExpbmUtYnktbGluZSxBbm5vdGF0ZWQgU291cmNlLENhbGwgR3JhcGgsT3V0cHV0Ci1Ac2VjdGlvbiBMaW5lLWJ5LWxpbmUgUHJvZmlsaW5nCi0KLUBjb2Rle2dwcm9mfSdzIEBzYW1wey1sfSBvcHRpb24gY2F1c2VzIHRoZSBwcm9ncmFtIHRvIHBlcmZvcm0KLUBkZm57bGluZS1ieS1saW5lfSBwcm9maWxpbmcuICBJbiB0aGlzIG1vZGUsIGhpc3RvZ3JhbQotc2FtcGxlcyBhcmUgYXNzaWduZWQgbm90IHRvIGZ1bmN0aW9ucywgYnV0IHRvIGluZGl2aWR1YWwKLWxpbmVzIG9mIHNvdXJjZSBjb2RlLiAgVGhlIHByb2dyYW0gdXN1YWxseSBtdXN0IGJlIGNvbXBpbGVkCi13aXRoIGEgQHNhbXB7LWd9IG9wdGlvbiwgaW4gYWRkaXRpb24gdG8gQHNhbXB7LXBnfSwgaW4gb3JkZXIKLXRvIGdlbmVyYXRlIGRlYnVnZ2luZyBzeW1ib2xzIGZvciB0cmFja2luZyBzb3VyY2UgY29kZSBsaW5lcy4KLQotVGhlIGZsYXQgcHJvZmlsZSBpcyB0aGUgbW9zdCB1c2VmdWwgb3V0cHV0IHRhYmxlCi1pbiBsaW5lLWJ5LWxpbmUgbW9kZS4KLVRoZSBjYWxsIGdyYXBoIGlzbid0IGFzIHVzZWZ1bCBhcyBub3JtYWwsIHNpbmNlCi10aGUgY3VycmVudCB2ZXJzaW9uIG9mIEBjb2Rle2dwcm9mfSBkb2VzIG5vdCBwcm9wYWdhdGUKLWNhbGwgZ3JhcGggYXJjcyBmcm9tIHNvdXJjZSBjb2RlIGxpbmVzIHRvIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24uCi1UaGUgY2FsbCBncmFwaCBkb2VzLCBob3dldmVyLCBzaG93IGVhY2ggbGluZSBvZiBjb2RlCi10aGF0IGNhbGxlZCBlYWNoIGZ1bmN0aW9uLCBhbG9uZyB3aXRoIGEgY291bnQuCi0KLUhlcmUgaXMgYSBzZWN0aW9uIG9mIEBjb2Rle2dwcm9mfSdzIG91dHB1dCwgd2l0aG91dCBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nLgotTm90ZSB0aGF0IEBjb2Rle2N0X2luaXR9IGFjY291bnRlZCBmb3IgZm91ciBoaXN0b2dyYW0gaGl0cywgYW5kCi0xMzMyNyBjYWxscyB0byBAY29kZXtpbml0X2Jsb2NrfS4KLQotQHNtYWxsZXhhbXBsZQotRmxhdCBwcm9maWxlOgotCi1FYWNoIHNhbXBsZSBjb3VudHMgYXMgMC4wMSBzZWNvbmRzLgotICAlICAgY3VtdWxhdGl2ZSAgIHNlbGYgICAgICAgICAgICAgIHNlbGYgICAgIHRvdGFsICAgICAgICAgICAKLSB0aW1lICAgc2Vjb25kcyAgIHNlY29uZHMgICAgY2FsbHMgIHVzL2NhbGwgIHVzL2NhbGwgIG5hbWUgICAgCi0gMzAuNzcgICAgICAwLjEzICAgICAwLjA0ICAgICA2MzM1ICAgICA2LjMxICAgICA2LjMxICBjdF9pbml0Ci0KLQotCQkgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpCi0KLQotZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgNCBieXRlKHMpIGZvciA3LjY5JSBvZiAwLjEzIHNlY29uZHMKLQotaW5kZXggJSB0aW1lICAgIHNlbGYgIGNoaWxkcmVuICAgIGNhbGxlZCAgICAgbmFtZQotCi0gICAgICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMTM0OTYgICAgICAgbmFtZV90b29fbG9uZwotICAgICAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgIDQwLzEzNDk2ICAgICAgIGRlZmxhdGUKLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgIDEyOC8xMzQ5NiAgICAgICBkZWZsYXRlX2Zhc3QKLSAgICAgICAgICAgICAgICAwLjAwICAgIDAuMDAgICAxMzMyNy8xMzQ5NiAgICAgICBjdF9pbml0Ci1bN10gICAgICAwLjAgICAgMC4wMCAgICAwLjAwICAgMTM0OTYgICAgICAgICBpbml0X2Jsb2NrCi0KLUBlbmQgc21hbGxleGFtcGxlCi0KLU5vdyBsZXQncyBsb29rIGF0IHNvbWUgb2YgQGNvZGV7Z3Byb2Z9J3Mgb3V0cHV0IGZyb20gdGhlIHNhbWUgcHJvZ3JhbSBydW4sCi10aGlzIHRpbWUgd2l0aCBsaW5lLWJ5LWxpbmUgcHJvZmlsaW5nIGVuYWJsZWQuICBOb3RlIHRoYXQgQGNvZGV7Y3RfaW5pdH0ncwotZm91ciBoaXN0b2dyYW0gaGl0cyBhcmUgYnJva2VuIGRvd24gaW50byBmb3VyIGxpbmVzIG9mIHNvdXJjZSBjb2RlIC0gb25lIGhpdAotb2NjdXJlZCBvbiBlYWNoIG9mIGxpbmVzIDM0OSwgMzUxLCAzODIgYW5kIDM4NS4gIEluIHRoZSBjYWxsIGdyYXBoLAotbm90ZSBob3cKLUBjb2Rle2N0X2luaXR9J3MgMTMzMjcgY2FsbHMgdG8gQGNvZGV7aW5pdF9ibG9ja30gYXJlIGJyb2tlbiBkb3duCi1pbnRvIG9uZSBjYWxsIGZyb20gbGluZSAzOTYsIDMwNzEgY2FsbHMgZnJvbSBsaW5lIDM4NCwgMzczMCBjYWxscwotZnJvbSBsaW5lIDM4NSwgYW5kIDY1MjUgY2FsbHMgZnJvbSAzODcuCi0KLUBzbWFsbGV4YW1wbGUKLUZsYXQgcHJvZmlsZToKLQotRWFjaCBzYW1wbGUgY291bnRzIGFzIDAuMDEgc2Vjb25kcy4KLSAgJSAgIGN1bXVsYXRpdmUgICBzZWxmICAgICAgICAgICAgICAgICAgICAKLSB0aW1lICAgc2Vjb25kcyAgIHNlY29uZHMgICAgY2FsbHMgIG5hbWUgICAgCi0gIDcuNjkgICAgICAwLjEwICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM0OSkKLSAgNy42OSAgICAgIDAuMTEgICAgIDAuMDEgICAgICAgICAgIGN0X2luaXQgKHRyZWVzLmM6MzUxKQotICA3LjY5ICAgICAgMC4xMiAgICAgMC4wMSAgICAgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODIpCi0gIDcuNjkgICAgICAwLjEzICAgICAwLjAxICAgICAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NSkKLQotCi0JCSAgICAgQ2FsbCBncmFwaCAoZXhwbGFuYXRpb24gZm9sbG93cykKLQotCi1ncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyA0IGJ5dGUocykgZm9yIDcuNjklIG9mIDAuMTMgc2Vjb25kcwotCi0gICUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWUKLQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMTM0OTYgICAgICAgbmFtZV90b29fbG9uZyAoZ3ppcC5jOjE0NDApCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMS8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6NzYzKQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDEvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozOTYpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAgMi8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6NzI3KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgIDQvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjY4NikKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgICA1LzEzNDk2ICAgICAgIGRlZmxhdGUgKGRlZmxhdGUuYzo2NzUpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgICAxMi8xMzQ5NiAgICAgICBkZWZsYXRlIChkZWZsYXRlLmM6Njc5KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgICAgMTYvMTM0OTYgICAgICAgZGVmbGF0ZSAoZGVmbGF0ZS5jOjczMCkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAgMTI4LzEzNDk2ICAgICAgIGRlZmxhdGVfZmFzdCAoZGVmbGF0ZS5jOjY1NCkKLSAgICAgICAgICAgIDAuMDAgICAgMC4wMCAgICAzMDcxLzEzNDk2ICAgICAgIGN0X2luaXQgKHRyZWVzLmM6Mzg0KQotICAgICAgICAgICAgMC4wMCAgICAwLjAwICAgIDM3MzAvMTM0OTYgICAgICAgY3RfaW5pdCAodHJlZXMuYzozODUpCi0gICAgICAgICAgICAwLjAwICAgIDAuMDAgICAgNjUyNS8xMzQ5NiAgICAgICBjdF9pbml0ICh0cmVlcy5jOjM4NykKLVs2XSAgMC4wICAgIDAuMDAgICAgMC4wMCAgIDEzNDk2ICAgICAgICAgaW5pdF9ibG9jayAodHJlZXMuYzo0MDgpCi0KLUBlbmQgc21hbGxleGFtcGxlCi0KLQotQG5vZGUgQW5ub3RhdGVkIFNvdXJjZSwsTGluZS1ieS1saW5lLE91dHB1dAotQHNlY3Rpb24gVGhlIEFubm90YXRlZCBTb3VyY2UgTGlzdGluZwotCi1AY29kZXtncHJvZn0ncyBAc2FtcHstQX0gb3B0aW9uIHRyaWdnZXJzIGFuIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZywKLXdoaWNoIGxpc3RzIHRoZSBwcm9ncmFtJ3Mgc291cmNlIGNvZGUsIGVhY2ggZnVuY3Rpb24gbGFiZWxlZCB3aXRoIHRoZQotbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyBjYWxsZWQuICBZb3UgbWF5IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZQotQHNhbXB7LUl9IG9wdGlvbiwgaWYgQGNvZGV7Z3Byb2Z9IGNhbid0IGZpbmQgdGhlIHNvdXJjZSBjb2RlIGZpbGVzLgotCi1Db21waWxpbmcgd2l0aCBAc2FtcHtnY2MgQGRvdHN7fSAtZyAtcGcgLWF9IGF1Z21lbnRzIHlvdXIgcHJvZ3JhbQotd2l0aCBiYXNpYy1ibG9jayBjb3VudGluZyBjb2RlLCBpbiBhZGRpdGlvbiB0byBmdW5jdGlvbiBjb3VudGluZyBjb2RlLgotVGhpcyBlbmFibGVzIEBjb2Rle2dwcm9mfSB0byBkZXRlcm1pbmUgaG93IG1hbnkgdGltZXMgZWFjaCBsaW5lCi1vZiBjb2RlIHdhcyBleGV1Y3RlZC4KLUZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uLCB0YWtlbiBmcm9tIGd6aXAsCi13aXRoIGxpbmUgbnVtYmVycyBhZGRlZDoKLQotQHNtYWxsZXhhbXBsZQotIDEgdWxnIHVwZGNyYyhzLCBuKQotIDIgICAgIHVjaCAqczsKLSAzICAgICB1bnNpZ25lZCBuOwotIDQgQHsKLSA1ICAgICByZWdpc3RlciB1bGcgYzsKLSA2Ci0gNyAgICAgc3RhdGljIHVsZyBjcmMgPSAodWxnKTB4ZmZmZmZmZmZMOwotIDgKLSA5ICAgICBpZiAocyA9PSBOVUxMKSBAewotMTAgICAgICAgICBjID0gMHhmZmZmZmZmZkw7Ci0xMSAgICAgQH0gZWxzZSBAewotMTIgICAgICAgICBjID0gY3JjOwotMTMgICAgICAgICBpZiAobikgZG8gQHsKLTE0ICAgICAgICAgICAgIGMgPSBjcmNfMzJfdGFiWy4uLl07Ci0xNSAgICAgICAgIEB9IHdoaWxlICgtLW4pOwotMTYgICAgIEB9Ci0xNyAgICAgY3JjID0gYzsKLTE4ICAgICByZXR1cm4gYyBeIDB4ZmZmZmZmZmZMOwotMTkgQH0KLQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNvZGV7dXBkY3JjfSBoYXMgYXQgbGVhc3QgZml2ZSBiYXNpYy1ibG9ja3MuCi1PbmUgaXMgdGhlIGZ1bmN0aW9uIGl0c2VsZi4gIFRoZQotQGNvZGV7aWZ9IHN0YXRlbWVudCBvbiBsaW5lIDkgZ2VuZXJhdGVzIHR3byBtb3JlIGJhc2ljLWJsb2Nrcywgb25lCi1mb3IgZWFjaCBicmFuY2ggb2YgdGhlIEBjb2Rle2lmfS4gIEEgZm91cnRoIGJhc2ljLWJsb2NrIHJlc3VsdHMgZnJvbQotdGhlIEBjb2Rle2lmfSBvbiBsaW5lIDEzLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBAY29kZXtkb30gbG9vcCBmb3JtCi10aGUgZmlmdGggYmFzaWMtYmxvY2suICBUaGUgY29tcGlsZXIgbWF5IGFsc28gZ2VuZXJhdGUgYWRkaXRpb25hbAotYmFzaWMtYmxvY2tzIHRvIGhhbmRsZSB2YXJpb3VzIHNwZWNpYWwgY2FzZXMuCi0KLUEgcHJvZ3JhbSBhdWdtZW50ZWQgZm9yIGJhc2ljLWJsb2NrIGNvdW50aW5nIGNhbiBiZSBhbmFseXplZCB3aXRoCi1AY29kZXtncHJvZiAtbCAtQX0uICBJIGFsc28gc3VnZ2VzdCB1c2Ugb2YgdGhlIEBzYW1wey14fSBvcHRpb24sCi13aGljaCBlbnN1cmVzIHRoYXQgZWFjaCBsaW5lIG9mIGNvZGUgaXMgbGFiZWxlZCBhdCBsZWFzdCBvbmNlLgotSGVyZSBpcyBAY29kZXt1cGRjcmN9J3MKLWFubm90YXRlZCBzb3VyY2UgbGlzdGluZyBmb3IgYSBzYW1wbGUgQGNvZGV7Z3ppcH0gcnVuOgotCi1Ac21hbGxleGFtcGxlCi0gICAgICAgICAgICAgICAgdWxnIHVwZGNyYyhzLCBuKQotICAgICAgICAgICAgICAgICAgICB1Y2ggKnM7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG47Ci0gICAgICAgICAgICAyIC0+QHsKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgdWxnIGM7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpYyB1bGcgY3JjID0gKHVsZykweGZmZmZmZmZmTDsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIDIgLT4gICAgaWYgKHMgPT0gTlVMTCkgQHsKLSAgICAgICAgICAgIDEgLT4JYyA9IDB4ZmZmZmZmZmZMOwotICAgICAgICAgICAgMSAtPiAgICBAfSBlbHNlIEB7Ci0gICAgICAgICAgICAxIC0+CWMgPSBjcmM7Ci0gICAgICAgICAgICAxIC0+ICAgICAgICBpZiAobikgZG8gQHsKLSAgICAgICAgMjYzMTIgLT4gICAgICAgICAgICBjID0gY3JjXzMyX3RhYlsuLi5dOwotMjYzMTIsMSwyNjMxMSAtPiAgICAgICAgQH0gd2hpbGUgKC0tbik7Ci0gICAgICAgICAgICAgICAgICAgIEB9Ci0gICAgICAgICAgICAyIC0+ICAgIGNyYyA9IGM7Ci0gICAgICAgICAgICAyIC0+ICAgIHJldHVybiBjIF4gMHhmZmZmZmZmZkw7Ci0gICAgICAgICAgICAyIC0+QH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQgdHdpY2UsIHBhc3Npbmcgb25jZSB0aHJvdWdoCi1lYWNoIGJyYW5jaCBvZiB0aGUgQGNvZGV7aWZ9IHN0YXRlbWVudC4gIFRoZSBib2R5IG9mIHRoZSBAY29kZXtkb30KLWxvb3Agd2FzIGV4ZWN1dGVkIGEgdG90YWwgb2YgMjYzMTIgdGltZXMuICBOb3RlIGhvdyB0aGUgQGNvZGV7d2hpbGV9Ci1zdGF0ZW1lbnQgaXMgYW5ub3RhdGVkLiAgSXQgYmVnYW4gZXhlY3V0aW9uIDI2MzEyIHRpbWVzLCBvbmNlIGZvcgotZWFjaCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgbG9vcC4gIE9uZSBvZiB0aG9zZSB0aW1lcyAodGhlIGxhc3QgdGltZSkKLWl0IGV4aXRlZCwgd2hpbGUgaXQgYnJhbmNoZWQgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb29wIDI2MzExIHRpbWVzLgotCi1Abm9kZSBJbmFjY3VyYWN5Ci1AY2hhcHRlciBJbmFjY3VyYWN5IG9mIEBjb2Rle2dwcm9mfSBPdXRwdXQKLQotQG1lbnUKLSogU2FtcGxpbmcgRXJyb3I6OiAgICAgIFN0YXRpc3RpY2FsIG1hcmdpbnMgb2YgZXJyb3IKLSogQXNzdW1wdGlvbnM6OiAgICAgICAgIEVzdGltYXRpbmcgY2hpbGRyZW4gdGltZXMKLUBlbmQgbWVudQotCi1Abm9kZSBTYW1wbGluZyBFcnJvcixBc3N1bXB0aW9ucywsSW5hY2N1cmFjeQotQHNlY3Rpb24gU3RhdGlzdGljYWwgU2FtcGxpbmcgRXJyb3IKLQotVGhlIHJ1bi10aW1lIGZpZ3VyZXMgdGhhdCBAY29kZXtncHJvZn0gZ2l2ZXMgeW91IGFyZSBiYXNlZCBvbiBhIHNhbXBsaW5nCi1wcm9jZXNzLCBzbyB0aGV5IGFyZSBzdWJqZWN0IHRvIHN0YXRpc3RpY2FsIGluYWNjdXJhY3kuICBJZiBhIGZ1bmN0aW9uIHJ1bnMKLW9ubHkgYSBzbWFsbCBhbW91bnQgb2YgdGltZSwgc28gdGhhdCBvbiB0aGUgYXZlcmFnZSB0aGUgc2FtcGxpbmcgcHJvY2Vzcwotb3VnaHQgdG8gY2F0Y2ggdGhhdCBmdW5jdGlvbiBpbiB0aGUgYWN0IG9ubHkgb25jZSwgdGhlcmUgaXMgYSBwcmV0dHkgZ29vZAotY2hhbmNlIGl0IHdpbGwgYWN0dWFsbHkgZmluZCB0aGF0IGZ1bmN0aW9uIHplcm8gdGltZXMsIG9yIHR3aWNlLgotCi1CeSBjb250cmFzdCwgdGhlIG51bWJlci1vZi1jYWxscyBhbmQgYmFzaWMtYmxvY2sgZmlndXJlcwotYXJlIGRlcml2ZWQgYnkgY291bnRpbmcsIG5vdAotc2FtcGxpbmcuICBUaGV5IGFyZSBjb21wbGV0ZWx5IGFjY3VyYXRlIGFuZCB3aWxsIG5vdCB2YXJ5IGZyb20gcnVuIHRvIHJ1bgotaWYgeW91ciBwcm9ncmFtIGlzIGRldGVybWluaXN0aWMuCi0KLVRoZSBAZGZue3NhbXBsaW5nIHBlcmlvZH0gdGhhdCBpcyBwcmludGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZsYXQKLXByb2ZpbGUgc2F5cyBob3cgb2Z0ZW4gc2FtcGxlcyBhcmUgdGFrZW4uICBUaGUgcnVsZSBvZiB0aHVtYiBpcyB0aGF0IGEKLXJ1bi10aW1lIGZpZ3VyZSBpcyBhY2N1cmF0ZSBpZiBpdCBpcyBjb25zaWRlcmFibHkgYmlnZ2VyIHRoYW4gdGhlIHNhbXBsaW5nCi1wZXJpb2QuCi0KLVRoZSBhY3R1YWwgYW1vdW50IG9mIGVycm9yIGNhbiBiZSBwcmVkaWN0ZWQuCi1Gb3IgQHZhcntufSBzYW1wbGVzLCB0aGUgQGVtcGh7ZXhwZWN0ZWR9IGVycm9yCi1pcyB0aGUgc3F1YXJlLXJvb3Qgb2YgQHZhcntufS4gIEZvciBleGFtcGxlLAotaWYgdGhlIHNhbXBsaW5nIHBlcmlvZCBpcyAwLjAxIHNlY29uZHMgYW5kIEBjb2Rle2Zvb30ncyBydW4tdGltZSBpcyAxIHNlY29uZCwKLUB2YXJ7bn0gaXMgMTAwIHNhbXBsZXMgKDEgc2Vjb25kLzAuMDEgc2Vjb25kcyksIHNxcnQoQHZhcntufSkgaXMgMTAgc2FtcGxlcywgc28KLXRoZSBleHBlY3RlZCBlcnJvciBpbiBAY29kZXtmb299J3MgcnVuLXRpbWUgaXMgMC4xIHNlY29uZHMgKDEwKjAuMDEgc2Vjb25kcyksCi1vciB0ZW4gcGVyY2VudCBvZiB0aGUgb2JzZXJ2ZWQgdmFsdWUuCi1BZ2FpbiwgaWYgdGhlIHNhbXBsaW5nIHBlcmlvZCBpcyAwLjAxIHNlY29uZHMgYW5kIEBjb2Rle2Jhcn0ncyBydW4tdGltZSBpcwotMTAwIHNlY29uZHMsIEB2YXJ7bn0gaXMgMTAwMDAgc2FtcGxlcywgc3FydChAdmFye259KSBpcyAxMDAgc2FtcGxlcywgc28KLXRoZSBleHBlY3RlZCBlcnJvciBpbiBAY29kZXtiYXJ9J3MgcnVuLXRpbWUgaXMgMSBzZWNvbmQsCi1vciBvbmUgcGVyY2VudCBvZiB0aGUgb2JzZXJ2ZWQgdmFsdWUuCi1JdCBpcyBsaWtlbHkgdG8KLXZhcnkgdGhpcyBtdWNoIEBlbXBoe29uIHRoZSBhdmVyYWdlfSBmcm9tIG9uZSBwcm9maWxpbmcgcnVuIHRvIHRoZSBuZXh0LgotKEBlbXBoe1NvbWV0aW1lc30gaXQgd2lsbCB2YXJ5IG1vcmUuKQotCi1UaGlzIGRvZXMgbm90IG1lYW4gdGhhdCBhIHNtYWxsIHJ1bi10aW1lIGZpZ3VyZSBpcyBkZXZvaWQgb2YgaW5mb3JtYXRpb24uCi1JZiB0aGUgcHJvZ3JhbSdzIEBlbXBoe3RvdGFsfSBydW4tdGltZSBpcyBsYXJnZSwgYSBzbWFsbCBydW4tdGltZSBmb3Igb25lCi1mdW5jdGlvbiBkb2VzIHRlbGwgeW91IHRoYXQgdGhhdCBmdW5jdGlvbiB1c2VkIGFuIGluc2lnbmlmaWNhbnQgZnJhY3Rpb24gb2YKLXRoZSB3aG9sZSBwcm9ncmFtJ3MgdGltZS4gIFVzdWFsbHkgdGhpcyBtZWFucyBpdCBpcyBub3Qgd29ydGggb3B0aW1pemluZy4KLQotT25lIHdheSB0byBnZXQgbW9yZSBhY2N1cmFjeSBpcyB0byBnaXZlIHlvdXIgcHJvZ3JhbSBtb3JlIChidXQgc2ltaWxhcikKLWlucHV0IGRhdGEgc28gaXQgd2lsbCB0YWtlIGxvbmdlci4gIEFub3RoZXIgd2F5IGlzIHRvIGNvbWJpbmUgdGhlIGRhdGEgZnJvbQotc2V2ZXJhbCBydW5zLCB1c2luZyB0aGUgQHNhbXB7LXN9IG9wdGlvbiBvZiBAY29kZXtncHJvZn0uICBIZXJlIGlzIGhvdzoKLQotQGVudW1lcmF0ZQotQGl0ZW0KLVJ1biB5b3VyIHByb2dyYW0gb25jZS4KLQotQGl0ZW0KLUlzc3VlIHRoZSBjb21tYW5kIEBzYW1we212IGdtb24ub3V0IGdtb24uc3VtfS4KLQotQGl0ZW0KLVJ1biB5b3VyIHByb2dyYW0gYWdhaW4sIHRoZSBzYW1lIGFzIGJlZm9yZS4KLQotQGl0ZW0KLU1lcmdlIHRoZSBuZXcgZGF0YSBpbiBAZmlsZXtnbW9uLm91dH0gaW50byBAZmlsZXtnbW9uLnN1bX0gd2l0aCB0aGlzIGNvbW1hbmQ6Ci0KLUBleGFtcGxlCi1ncHJvZiAtcyBAdmFye2V4ZWN1dGFibGUtZmlsZX0gZ21vbi5vdXQgZ21vbi5zdW0KLUBlbmQgZXhhbXBsZQotCi1AaXRlbQotUmVwZWF0IHRoZSBsYXN0IHR3byBzdGVwcyBhcyBvZnRlbiBhcyB5b3Ugd2lzaC4KLQotQGl0ZW0KLUFuYWx5emUgdGhlIGN1bXVsYXRpdmUgZGF0YSB1c2luZyB0aGlzIGNvbW1hbmQ6Ci0KLUBleGFtcGxlCi1ncHJvZiBAdmFye2V4ZWN1dGFibGUtZmlsZX0gZ21vbi5zdW0gPiBAdmFye291dHB1dC1maWxlfQotQGVuZCBleGFtcGxlCi1AZW5kIGVudW1lcmF0ZQotCi1Abm9kZSBBc3N1bXB0aW9ucywsU2FtcGxpbmcgRXJyb3IsSW5hY2N1cmFjeQotQHNlY3Rpb24gRXN0aW1hdGluZyBAY29kZXtjaGlsZHJlbn0gVGltZXMKLQotU29tZSBvZiB0aGUgZmlndXJlcyBpbiB0aGUgY2FsbCBncmFwaCBhcmUgZXN0aW1hdGVzLS0tZm9yIGV4YW1wbGUsIHRoZQotQGNvZGV7Y2hpbGRyZW59IHRpbWUgdmFsdWVzIGFuZCBhbGwgdGhlIHRoZSB0aW1lIGZpZ3VyZXMgaW4gY2FsbGVyIGFuZAotc3Vicm91dGluZSBsaW5lcy4KLQotVGhlcmUgaXMgbm8gZGlyZWN0IGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIG1lYXN1cmVtZW50cyBpbiB0aGUgcHJvZmlsZQotZGF0YSBpdHNlbGYuICBJbnN0ZWFkLCBAY29kZXtncHJvZn0gZXN0aW1hdGVzIHRoZW0gYnkgbWFraW5nIGFuIGFzc3VtcHRpb24KLWFib3V0IHlvdXIgcHJvZ3JhbSB0aGF0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSB0cnVlLgotCi1UaGUgYXNzdW1wdGlvbiBtYWRlIGlzIHRoYXQgdGhlIGF2ZXJhZ2UgdGltZSBzcGVudCBpbiBlYWNoIGNhbGwgdG8gYW55Ci1mdW5jdGlvbiBAY29kZXtmb299IGlzIG5vdCBjb3JyZWxhdGVkIHdpdGggd2hvIGNhbGxlZCBAY29kZXtmb299LiAgSWYKLUBjb2Rle2Zvb30gdXNlZCA1IHNlY29uZHMgaW4gYWxsLCBhbmQgMi81IG9mIHRoZSBjYWxscyB0byBAY29kZXtmb299IGNhbWUKLWZyb20gQGNvZGV7YX0sIHRoZW4gQGNvZGV7Zm9vfSBjb250cmlidXRlcyAyIHNlY29uZHMgdG8gQGNvZGV7YX0ncwotQGNvZGV7Y2hpbGRyZW59IHRpbWUsIGJ5IGFzc3VtcHRpb24uCi0KLVRoaXMgYXNzdW1wdGlvbiBpcyB1c3VhbGx5IHRydWUgZW5vdWdoLCBidXQgZm9yIHNvbWUgcHJvZ3JhbXMgaXQgaXMgZmFyCi1mcm9tIHRydWUuICBTdXBwb3NlIHRoYXQgQGNvZGV7Zm9vfSByZXR1cm5zIHZlcnkgcXVpY2tseSB3aGVuIGl0cyBhcmd1bWVudAotaXMgemVybzsgc3VwcG9zZSB0aGF0IEBjb2Rle2F9IGFsd2F5cyBwYXNzZXMgemVybyBhcyBhbiBhcmd1bWVudCwgd2hpbGUKLW90aGVyIGNhbGxlcnMgb2YgQGNvZGV7Zm9vfSBwYXNzIG90aGVyIGFyZ3VtZW50cy4gIEluIHRoaXMgcHJvZ3JhbSwgYWxsIHRoZQotdGltZSBzcGVudCBpbiBAY29kZXtmb299IGlzIGluIHRoZSBjYWxscyBmcm9tIGNhbGxlcnMgb3RoZXIgdGhhbiBAY29kZXthfS4KLUJ1dCBAY29kZXtncHJvZn0gaGFzIG5vIHdheSBvZiBrbm93aW5nIHRoaXM7IGl0IHdpbGwgYmxpbmRseSBhbmQKLWluY29ycmVjdGx5IGNoYXJnZSAyIHNlY29uZHMgb2YgdGltZSBpbiBAY29kZXtmb299IHRvIHRoZSBjaGlsZHJlbiBvZgotQGNvZGV7YX0uCi0KLUBjIEZJWE1FIC0gaGFzIHRoaXMgYmVlbiBmaXhlZD8KLVdlIGhvcGUgc29tZSBkYXkgdG8gcHV0IG1vcmUgY29tcGxldGUgZGF0YSBpbnRvIEBmaWxle2dtb24ub3V0fSwgc28gdGhhdAotdGhpcyBhc3N1bXB0aW9uIGlzIG5vIGxvbmdlciBuZWVkZWQsIGlmIHdlIGNhbiBmaWd1cmUgb3V0IGhvdy4gIEZvciB0aGUKLW5vbmNlLCB0aGUgZXN0aW1hdGVkIGZpZ3VyZXMgYXJlIHVzdWFsbHkgbW9yZSB1c2VmdWwgdGhhbiBtaXNsZWFkaW5nLgotCi1Abm9kZSBIb3cgZG8gST8KLUBjaGFwdGVyIEFuc3dlcnMgdG8gQ29tbW9uIFF1ZXN0aW9ucwotCi1AdGFibGUgQGFzaXMKLUBpdGVtIEhvdyBkbyBJIGZpbmQgd2hpY2ggbGluZXMgaW4gbXkgcHJvZ3JhbSB3ZXJlIGV4ZWN1dGVkIHRoZSBtb3N0IHRpbWVzPwotCi1Db21waWxlIHlvdXIgcHJvZ3JhbSB3aXRoIGJhc2ljLWJsb2NrIGNvdW50aW5nIGVuYWJsZWQsIHJ1biBpdCwgdGhlbgotdXNlIHRoZSBmb2xsb3dpbmcgcGlwZWxpbmU6Ci0KLUBleGFtcGxlCi1ncHJvZiAtbCAtQyBAdmFye29iamZpbGV9IHwgc29ydCAtayAzIC1uIC1yCi1AZW5kIGV4YW1wbGUKLQotVGhpcyBsaXN0aW5nIHdpbGwgc2hvdyB5b3UgdGhlIGxpbmVzIGluIHlvdXIgY29kZSBleGVjdXRlZCBtb3N0IG9mdGVuLAotYnV0IG5vdCBuZWNlc3NhcmlseSB0aG9zZSB0aGF0IGNvbnN1bWVkIHRoZSBtb3N0IHRpbWUuCi0KLUBpdGVtIEhvdyBkbyBJIGZpbmQgd2hpY2ggbGluZXMgaW4gbXkgcHJvZ3JhbSBjYWxsZWQgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uPwotCi1Vc2UgQGNvZGV7Z3Byb2YgLWx9IGFuZCBsb29rdXAgdGhlIGZ1bmN0aW9uIGluIHRoZSBjYWxsIGdyYXBoLgotVGhlIGNhbGxlcnMgd2lsbCBiZSBicm9rZW4gZG93biBieSBmdW5jdGlvbiBhbmQgbGluZSBudW1iZXIuCi0KLUBpdGVtIEhvdyBkbyBJIGFuYWx5emUgYSBwcm9ncmFtIHRoYXQgcnVucyBmb3IgbGVzcyB0aGFuIGEgc2Vjb25kPwotCi1UcnkgdXNpbmcgYSBzaGVsbCBzY3JpcHQgbGlrZSB0aGlzIG9uZToKLQotQGV4YW1wbGUKLWZvciBpIGluIGBzZXEgMSAxMDBgOyBkbwotICBmYXN0cHJvZwotICBtdiBnbW9uLm91dCBnbW9uLm91dC4kaQotZG9uZQotCi1ncHJvZiAtcyBmYXN0cHJvZyBnbW9uLm91dC4qCi0KLWdwcm9mIGZhc3Rwcm9nIGdtb24uc3VtCi1AZW5kIGV4YW1wbGUKLQotSWYgeW91ciBwcm9ncmFtIGlzIGNvbXBsZXRlbHkgZGV0ZXJtaW5pc3RpYywgYWxsIHRoZSBjYWxsIGNvdW50cwotd2lsbCBiZSBzaW1wbGUgbXVsdGlwbGVzIG9mIDEwMCAoaS5lLiBhIGZ1bmN0aW9uIGNhbGxlZCBvbmNlIGluCi1lYWNoIHJ1biB3aWxsIGFwcGVhciB3aXRoIGEgY2FsbCBjb3VudCBvZiAxMDApLgotCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluY29tcGF0aWJpbGl0aWVzCi1AY2hhcHRlciBJbmNvbXBhdGliaWxpdGllcyB3aXRoIFVuaXggQGNvZGV7Z3Byb2Z9Ci0KLUBzY3tnbnV9IEBjb2Rle2dwcm9mfSBhbmQgQmVya2VsZXkgVW5peCBAY29kZXtncHJvZn0gdXNlIHRoZSBzYW1lIGRhdGEKLWZpbGUgQGZpbGV7Z21vbi5vdXR9LCBhbmQgcHJvdmlkZSBlc3NlbnRpYWxseSB0aGUgc2FtZSBpbmZvcm1hdGlvbi4gIEJ1dAotdGhlcmUgYXJlIGEgZmV3IGRpZmZlcmVuY2VzLgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotQHNje2dudX0gQGNvZGV7Z3Byb2Z9IHVzZXMgYSBuZXcsIGdlbmVyYWxpemVkIGZpbGUgZm9ybWF0IHdpdGggc3VwcG9ydAotZm9yIGJhc2ljLWJsb2NrIGV4ZWN1dGlvbiBjb3VudHMgYW5kIG5vbi1yZWFsdGltZSBoaXN0b2dyYW1zLiAgQSBtYWdpYwotY29va2llIGFuZCB2ZXJzaW9uIG51bWJlciBhbGxvd3MgQGNvZGV7Z3Byb2Z9IHRvIGVhc2lseSBpZGVudGlmeQotbmV3IHN0eWxlIGZpbGVzLiAgT2xkIEJTRC1zdHlsZSBmaWxlcyBjYW4gc3RpbGwgYmUgcmVhZC4KLUB4cmVme0ZpbGUgRm9ybWF0fS4KLQotQGl0ZW0KLUZvciBhIHJlY3Vyc2l2ZSBmdW5jdGlvbiwgVW5peCBAY29kZXtncHJvZn0gbGlzdHMgdGhlIGZ1bmN0aW9uIGFzIGEKLXBhcmVudCBhbmQgYXMgYSBjaGlsZCwgd2l0aCBhIEBjb2Rle2NhbGxzfSBmaWVsZCB0aGF0IGxpc3RzIHRoZSBudW1iZXIKLW9mIHJlY3Vyc2l2ZSBjYWxscy4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBvbWl0cyB0aGVzZSBsaW5lcyBhbmQgcHV0cwotdGhlIG51bWJlciBvZiByZWN1cnNpdmUgY2FsbHMgaW4gdGhlIHByaW1hcnkgbGluZS4KLQotQGl0ZW0KLVdoZW4gYSBmdW5jdGlvbiBpcyBzdXBwcmVzc2VkIGZyb20gdGhlIGNhbGwgZ3JhcGggd2l0aCBAc2FtcHstZX0sIEBzY3tnbnV9Ci1AY29kZXtncHJvZn0gc3RpbGwgbGlzdHMgaXQgYXMgYSBzdWJyb3V0aW5lIG9mIGZ1bmN0aW9ucyB0aGF0IGNhbGwgaXQuCi0KLUBpdGVtCi1Ac2N7Z251fSBAY29kZXtncHJvZn0gYWNjZXB0cyB0aGUgQHNhbXB7LWt9IHdpdGggaXRzIGFyZ3VtZW50Ci1pbiB0aGUgZm9ybSBAc2FtcHtmcm9tL3RvfSwgaW5zdGVhZCBvZiBAc2FtcHtmcm9tIHRvfS4KLQotQGl0ZW0KLUluIHRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcsCi1pZiB0aGVyZSBhcmUgbXVsdGlwbGUgYmFzaWMgYmxvY2tzIG9uIHRoZSBzYW1lIGxpbmUsCi1Ac2N7Z251fSBAY29kZXtncHJvZn0gcHJpbnRzIGFsbCBvZiB0aGVpciBjb3VudHMsIHNlcGVyYXRlZCBieSBjb21tYXMuCi0KLUBpZ25vcmUgLSBpdCBkb2VzIHRoaXMgbm93Ci1AaXRlbQotVGhlIGZ1bmN0aW9uIG5hbWVzIHByaW50ZWQgaW4gQHNje2dudX0gQGNvZGV7Z3Byb2Z9IG91dHB1dCBkbyBub3QgaW5jbHVkZQotdGhlIGxlYWRpbmcgdW5kZXJzY29yZXMgdGhhdCBhcmUgYWRkZWQgaW50ZXJuYWxseSB0byB0aGUgZnJvbnQgb2YgYWxsCi1DIGlkZW50aWZpZXJzIG9uIG1hbnkgb3BlcmF0aW5nIHN5c3RlbXMuCi1AZW5kIGlnbm9yZQotCi1AaXRlbQotVGhlIGJsdXJicywgZmllbGQgd2lkdGhzLCBhbmQgb3V0cHV0IGZvcm1hdHMgYXJlIGRpZmZlcmVudC4gIEBzY3tnbnV9Ci1AY29kZXtncHJvZn0gcHJpbnRzIGJsdXJicyBhZnRlciB0aGUgdGFibGVzLCBzbyB0aGF0IHlvdSBjYW4gc2VlIHRoZQotdGFibGVzIHdpdGhvdXQgc2tpcHBpbmcgdGhlIGJsdXJicy4KLUBlbmQgaXRlbWl6ZQotCi1Abm9kZSBEZXRhaWxzCi1AY2hhcHRlciBEZXRhaWxzIG9mIFByb2ZpbGluZwotCi1AbWVudQotKiBJbXBsZW1lbnRhdGlvbjo6ICAgICAgSG93IGEgcHJvZ3JhbSBjb2xsZXRzIHByb2ZpbGluZyBpbmZvcm1hdGlvbgotKiBGaWxlIEZvcm1hdDo6ICAgICAgICAgRm9ybWF0IG9mIEBzYW1we2dtb24ub3V0fSBmaWxlcwotKiBJbnRlcm5hbHM6OiAgICAgICAgICAgQGNvZGV7Z3Byb2Z9J3MgaW50ZXJuYWwgb3BlcmF0aW9uCi0qIERlYnVnZ2luZzo6ICAgICAgICAgICBVc2luZyBAY29kZXtncHJvZn0ncyBAc2FtcHstZH0gb3B0aW9uCi1AZW5kIG1lbnUKLQotQG5vZGUgSW1wbGVtZW50YXRpb24sRmlsZSBGb3JtYXQsLERldGFpbHMKLUBzZWN0aW9uIEltcGxlbWVudGF0aW9uIG9mIFByb2ZpbGluZwotCi1Qcm9maWxpbmcgd29ya3MgYnkgY2hhbmdpbmcgaG93IGV2ZXJ5IGZ1bmN0aW9uIGluIHlvdXIgcHJvZ3JhbSBpcyBjb21waWxlZAotc28gdGhhdCB3aGVuIGl0IGlzIGNhbGxlZCwgaXQgd2lsbCBzdGFzaCBhd2F5IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUKLWl0IHdhcyBjYWxsZWQgZnJvbS4gIEZyb20gdGhpcywgdGhlIHByb2ZpbGVyIGNhbiBmaWd1cmUgb3V0IHdoYXQgZnVuY3Rpb24KLWNhbGxlZCBpdCwgYW5kIGNhbiBjb3VudCBob3cgbWFueSB0aW1lcyBpdCB3YXMgY2FsbGVkLiAgVGhpcyBjaGFuZ2UgaXMgbWFkZQotYnkgdGhlIGNvbXBpbGVyIHdoZW4geW91ciBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggdGhlIEBzYW1wey1wZ30gb3B0aW9uLAotd2hpY2ggY2F1c2VzIGV2ZXJ5IGZ1bmN0aW9uIHRvIGNhbGwgQGNvZGV7bWNvdW50fQotKG9yIEBjb2Rle19tY291bnR9LCBvciBAY29kZXtfX21jb3VudH0sIGRlcGVuZGluZyBvbiB0aGUgT1MgYW5kIGNvbXBpbGVyKQotYXMgb25lIG9mIGl0cyBmaXJzdCBvcGVyYXRpb25zLgotCi1UaGUgQGNvZGV7bWNvdW50fSByb3V0aW5lLCBpbmNsdWRlZCBpbiB0aGUgcHJvZmlsaW5nIGxpYnJhcnksCi1pcyByZXNwb25zaWJsZSBmb3IgcmVjb3JkaW5nIGluIGFuIGluLW1lbW9yeSBjYWxsIGdyYXBoIHRhYmxlCi1ib3RoIGl0cyBwYXJlbnQgcm91dGluZSAodGhlIGNoaWxkKSBhbmQgaXRzIHBhcmVudCdzIHBhcmVudC4gIFRoaXMgaXMKLXR5cGljYWxseSBkb25lIGJ5IGV4YW1pbmluZyB0aGUgc3RhY2sgZnJhbWUgdG8gZmluZCBib3RoCi10aGUgYWRkcmVzcyBvZiB0aGUgY2hpbGQsIGFuZCB0aGUgcmV0dXJuIGFkZHJlc3MgaW4gdGhlIG9yaWdpbmFsIHBhcmVudC4KLVNpbmNlIHRoaXMgaXMgYSB2ZXJ5IG1hY2hpbmUtZGVwZW5kYW50IG9wZXJhdGlvbiwgQGNvZGV7bWNvdW50fQotaXRzZWxmIGlzIHR5cGljYWxseSBhIHNob3J0IGFzc2VtYmx5LWxhbmd1YWdlIHN0dWIgcm91dGluZQotdGhhdCBleHRyYWN0cyB0aGUgcmVxdWlyZWQKLWluZm9ybWF0aW9uLCBhbmQgdGhlbiBjYWxscyBAY29kZXtfX21jb3VudF9pbnRlcm5hbH0KLShhIG5vcm1hbCBDIGZ1bmN0aW9uKSB3aXRoIHR3byBhcmd1bWVudHMgLSBAY29kZXtmcm9tcGN9IGFuZCBAY29kZXtzZWxmcGN9LgotQGNvZGV7X19tY291bnRfaW50ZXJuYWx9IGlzIHJlc3BvbnNpYmxlIGZvciBtYWludGFpbmluZwotdGhlIGluLW1lbW9yeSBjYWxsIGdyYXBoLCB3aGljaCByZWNvcmRzIEBjb2Rle2Zyb21wY30sIEBjb2Rle3NlbGZwY30sCi1hbmQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIG9mIHRoZXNlIGNhbGwgYXJjcyB3YXMgdHJhbnN2ZXJzZWQuCi0KLUdDQyBWZXJzaW9uIDIgcHJvdmlkZXMgYSBtYWdpY2FsIGZ1bmN0aW9uIChAY29kZXtfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3N9KSwKLXdoaWNoIGFsbG93cyBhIGdlbmVyaWMgQGNvZGV7bWNvdW50fSBmdW5jdGlvbiB0byBleHRyYWN0IHRoZQotcmVxdWlyZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhY2sgZnJhbWUuICBIb3dldmVyLCBvbiBzb21lCi1hcmNoaXRlY3R1cmVzLCBtb3N0IG5vdGFibHkgdGhlIFNQQVJDLCB1c2luZyB0aGlzIGJ1aWx0aW4gY2FuIGJlCi12ZXJ5IGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUsIGFuZCBhbiBhc3NlbWJseSBsYW5ndWFnZSB2ZXJzaW9uCi1vZiBAY29kZXttY291bnR9IGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0KLU51bWJlci1vZi1jYWxscyBpbmZvcm1hdGlvbiBmb3IgbGlicmFyeSByb3V0aW5lcyBpcyBjb2xsZWN0ZWQgYnkgdXNpbmcgYQotc3BlY2lhbCB2ZXJzaW9uIG9mIHRoZSBDIGxpYnJhcnkuICBUaGUgcHJvZ3JhbXMgaW4gaXQgYXJlIHRoZSBzYW1lIGFzIGluCi10aGUgdXN1YWwgQyBsaWJyYXJ5LCBidXQgdGhleSB3ZXJlIGNvbXBpbGVkIHdpdGggQHNhbXB7LXBnfS4gIElmIHlvdQotbGluayB5b3VyIHByb2dyYW0gd2l0aCBAc2FtcHtnY2MgQGRvdHN7fSAtcGd9LCBpdCBhdXRvbWF0aWNhbGx5IHVzZXMgdGhlCi1wcm9maWxpbmcgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KLQotUHJvZmlsaW5nIGFsc28gaW52b2x2ZXMgd2F0Y2hpbmcgeW91ciBwcm9ncmFtIGFzIGl0IHJ1bnMsIGFuZCBrZWVwaW5nIGEKLWhpc3RvZ3JhbSBvZiB3aGVyZSB0aGUgcHJvZ3JhbSBjb3VudGVyIGhhcHBlbnMgdG8gYmUgZXZlcnkgbm93IGFuZCB0aGVuLgotVHlwaWNhbGx5IHRoZSBwcm9ncmFtIGNvdW50ZXIgaXMgbG9va2VkIGF0IGFyb3VuZCAxMDAgdGltZXMgcGVyIHNlY29uZCBvZgotcnVuIHRpbWUsIGJ1dCB0aGUgZXhhY3QgZnJlcXVlbmN5IG1heSB2YXJ5IGZyb20gc3lzdGVtIHRvIHN5c3RlbS4KLQotVGhpcyBpcyBkb25lIGlzIG9uZSBvZiB0d28gd2F5cy4gIE1vc3QgVU5JWC1saWtlIG9wZXJhdGluZyBzeXN0ZW1zCi1wcm92aWRlIGEgQGNvZGV7cHJvZmlsKCl9IHN5c3RlbSBjYWxsLCB3aGljaCByZWdpc3RlcnMgYSBtZW1vcnkKLWFycmF5IHdpdGggdGhlIGtlcm5lbCwgYWxvbmcgd2l0aCBhIHNjYWxlCi1mYWN0b3IgdGhhdCBkZXRlcm1pbmVzIGhvdyB0aGUgcHJvZ3JhbSdzIGFkZHJlc3Mgc3BhY2UgbWFwcwotaW50byB0aGUgYXJyYXkuCi1UeXBpY2FsIHNjYWxpbmcgdmFsdWVzIGNhdXNlIGV2ZXJ5IDIgdG8gOCBieXRlcyBvZiBhZGRyZXNzIHNwYWNlCi10byBtYXAgaW50byBhIHNpbmdsZSBhcnJheSBzbG90LgotT24gZXZlcnkgdGljayBvZiB0aGUgc3lzdGVtIGNsb2NrCi0oYXNzdW1pbmcgdGhlIHByb2ZpbGVkIHByb2dyYW0gaXMgcnVubmluZyksIHRoZSB2YWx1ZSBvZiB0aGUKLXByb2dyYW0gY291bnRlciBpcyBleGFtaW5lZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2xvdCBpbgotdGhlIG1lbW9yeSBhcnJheSBpcyBpbmNyZW1lbnRlZC4gIFNpbmNlIHRoaXMgaXMgZG9uZSBpbiB0aGUga2VybmVsLAotd2hpY2ggaGFkIHRvIGludGVycnVwdCB0aGUgcHJvY2VzcyBhbnl3YXkgdG8gaGFuZGxlIHRoZSBjbG9jawotaW50ZXJydXB0LCB2ZXJ5IGxpdHRsZSBhZGRpdGlvbmFsIHN5c3RlbSBvdmVyaGVhZCBpcyByZXF1aXJlZC4KLQotSG93ZXZlciwgc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgbW9zdCBub3RhYmx5IExpbnV4IDIuMCAoYW5kIGVhcmxpZXIpLAotZG8gbm90IHByb3ZpZGUgYSBAY29kZXtwcm9maWwoKX0gc3lzdGVtIGNhbGwuICBPbiBzdWNoIGEgc3lzdGVtLAotYXJyYW5nZW1lbnRzIGFyZSBtYWRlIGZvciB0aGUga2VybmVsIHRvIHBlcmlvZGljYWxseSBkZWxpdmVyCi1hIHNpZ25hbCB0byB0aGUgcHJvY2VzcyAodHlwaWNhbGx5IHZpYSBAY29kZXtzZXRpdGltZXIoKX0pLAotd2hpY2ggdGhlbiBwZXJmb3JtcyB0aGUgc2FtZSBvcGVyYXRpb24gb2YgZXhhbWluaW5nIHRoZQotcHJvZ3JhbSBjb3VudGVyIGFuZCBpbmNyZW1lbnRpbmcgYSBzbG90IGluIHRoZSBtZW1vcnkgYXJyYXkuCi1TaW5jZSB0aGlzIG1ldGhvZCByZXF1aXJlcyBhIHNpZ25hbCB0byBiZSBkZWxpdmVyZWQgdG8KLXVzZXIgc3BhY2UgZXZlcnkgdGltZSBhIHNhbXBsZSBpcyB0YWtlbiwgaXQgdXNlcyBjb25zaWRlcmFibHkKLW1vcmUgb3ZlcmhlYWQgdGhhbiBrZXJuZWwtYmFzZWQgcHJvZmlsaW5nLiAgQWxzbywgZHVlIHRvIHRoZQotYWRkZWQgZGVsYXkgcmVxdWlyZWQgdG8gZGVsaXZlciB0aGUgc2lnbmFsLCB0aGlzIG1ldGhvZCBpcwotbGVzcyBhY2N1cmF0ZSBhcyB3ZWxsLgotCi1BIHNwZWNpYWwgc3RhcnR1cCByb3V0aW5lIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoZSBoaXN0b2dyYW0gYW5kIAotZWl0aGVyIGNhbGxzIEBjb2Rle3Byb2ZpbCgpfSBvciBzZXRzIHVwCi1hIGNsb2NrIHNpZ25hbCBoYW5kbGVyLgotVGhpcyByb3V0aW5lIChAY29kZXttb25zdGFydHVwfSkgY2FuIGJlIGludm9rZWQgaW4gc2V2ZXJhbCB3YXlzLgotT24gTGludXggc3lzdGVtcywgYSBzcGVjaWFsIHByb2ZpbGluZyBzdGFydHVwIGZpbGUgQGNvZGV7Z2NydDAub30sCi13aGljaCBpbnZva2VzIEBjb2Rle21vbnN0YXJ0dXB9IGJlZm9yZSBAY29kZXttYWlufSwKLWlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBAY29kZXtjcnQwLm99LgotVXNlIG9mIHRoaXMgc3BlY2lhbCBzdGFydHVwIGZpbGUgaXMgb25lIG9mIHRoZSBlZmZlY3RzCi1vZiB1c2luZyBAc2FtcHtnY2MgQGRvdHN7fSAtcGd9IHRvIGxpbmsuCi1PbiBTUEFSQyBzeXN0ZW1zLCBubyBzcGVjaWFsIHN0YXJ0dXAgZmlsZXMgYXJlIHVzZWQuCi1SYXRoZXIsIHRoZSBAY29kZXttY291bnR9IHJvdXRpbmUsIHdoZW4gaXQgaXMgaW52b2tlZCBmb3IKLXRoZSBmaXJzdCB0aW1lICh0eXBpY2FsbHkgd2hlbiBAY29kZXttYWlufSBpcyBjYWxsZWQpLAotY2FsbHMgQGNvZGV7bW9uc3RhcnR1cH0uCi0KLUlmIHRoZSBjb21waWxlcidzIEBzYW1wey1hfSBvcHRpb24gd2FzIHVzZWQsIGJhc2ljLWJsb2NrIGNvdW50aW5nCi1pcyBhbHNvIGVuYWJsZWQuICBFYWNoIG9iamVjdCBmaWxlIGlzIHRoZW4gY29tcGlsZWQgd2l0aCBhIHN0YXRpYyBhcnJheQotb2YgY291bnRzLCBpbml0aWFsbHkgemVyby4KLUluIHRoZSBleGVjdXRhYmxlIGNvZGUsIGV2ZXJ5IHRpbWUgYSBuZXcgYmFzaWMtYmxvY2sgYmVnaW5zCi0oaS5lLiB3aGVuIGFuIEBjb2Rle2lmfSBzdGF0ZW1lbnQgYXBwZWFycyksIGFuIGV4dHJhIGluc3RydWN0aW9uCi1pcyBpbnNlcnRlZCB0byBpbmNyZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcgY291bnQgaW4gdGhlIGFycmF5LgotQXQgY29tcGlsZSB0aW1lLCBhIHBhaXJlZCBhcnJheSB3YXMgY29uc3RydWN0ZWQgdGhhdCByZWNvcmRlZAotdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgZWFjaCBiYXNpYy1ibG9jay4gIFRha2VuIHRvZ2V0aGVyLAotdGhlIHR3byBhcnJheXMgcmVjb3JkIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGV2ZXJ5IGJhc2ljLWJsb2NrLAotYWxvbmcgd2l0aCB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IHdhcyBleGVjdXRlZC4KLQotVGhlIHByb2ZpbGluZyBsaWJyYXJ5IGFsc28gaW5jbHVkZXMgYSBmdW5jdGlvbiAoQGNvZGV7bWNsZWFudXB9KSB3aGljaCBpcwotdHlwaWNhbGx5IHJlZ2lzdGVyZWQgdXNpbmcgQGNvZGV7YXRleGl0KCl9IHRvIGJlIGNhbGxlZCBhcyB0aGUKLXByb2dyYW0gZXhpdHMsIGFuZCBpcyByZXNwb25zaWJsZSBmb3Igd3JpdGluZyB0aGUgZmlsZSBAZmlsZXtnbW9uLm91dH0uCi1Qcm9maWxpbmcgaXMgdHVybmVkIG9mZiwgdmFyaW91cyBoZWFkZXJzIGFyZSBvdXRwdXQsIGFuZCB0aGUgaGlzdG9ncmFtCi1pcyB3cml0dGVuLCBmb2xsb3dlZCBieSB0aGUgY2FsbC1ncmFwaCBhcmNzIGFuZCB0aGUgYmFzaWMtYmxvY2sgY291bnRzLgotCi1UaGUgb3V0cHV0IGZyb20gQGNvZGV7Z3Byb2Z9IGdpdmVzIG5vIGluZGljYXRpb24gb2YgcGFydHMgb2YgeW91ciBwcm9ncmFtIHRoYXQKLWFyZSBsaW1pdGVkIGJ5IEkvTyBvciBzd2FwcGluZyBiYW5kd2lkdGguICBUaGlzIGlzIGJlY2F1c2Ugc2FtcGxlcyBvZiB0aGUKLXByb2dyYW0gY291bnRlciBhcmUgdGFrZW4gYXQgZml4ZWQgaW50ZXJ2YWxzIG9mIHRoZSBwcm9ncmFtJ3MgcnVuIHRpbWUuCi1UaGVyZWZvcmUsIHRoZQotdGltZSBtZWFzdXJlbWVudHMgaW4gQGNvZGV7Z3Byb2Z9IG91dHB1dCBzYXkgbm90aGluZyBhYm91dCB0aW1lIHRoYXQgeW91cgotcHJvZ3JhbSB3YXMgbm90IHJ1bm5pbmcuICBGb3IgZXhhbXBsZSwgYSBwYXJ0IG9mIHRoZSBwcm9ncmFtIHRoYXQgY3JlYXRlcwotc28gbXVjaCBkYXRhIHRoYXQgaXQgY2Fubm90IGFsbCBmaXQgaW4gcGh5c2ljYWwgbWVtb3J5IGF0IG9uY2UgbWF5IHJ1biB2ZXJ5Ci1zbG93bHkgZHVlIHRvIHRocmFzaGluZywgYnV0IEBjb2Rle2dwcm9mfSB3aWxsIHNheSBpdCB1c2VzIGxpdHRsZSB0aW1lLiAgT24KLXRoZSBvdGhlciBoYW5kLCBzYW1wbGluZyBieSBydW4gdGltZSBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IHRoZSBhbW91bnQgb2YKLWxvYWQgZHVlIHRvIG90aGVyIHVzZXJzIHdvbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUgb3V0cHV0IHlvdSBnZXQuCi0KLUBub2RlIEZpbGUgRm9ybWF0LEludGVybmFscyxJbXBsZW1lbnRhdGlvbixEZXRhaWxzCi1Ac2VjdGlvbiBQcm9maWxpbmcgRGF0YSBGaWxlIEZvcm1hdAotCi1UaGUgb2xkIEJTRC1kZXJpdmVkIGZpbGUgZm9ybWF0IHVzZWQgZm9yIHByb2ZpbGUgZGF0YSBkb2VzIG5vdCBjb250YWluIGEKLW1hZ2ljIGNvb2tpZSB0aGF0IGFsbG93cyB0byBjaGVjayB3aGV0aGVyIGEgZGF0YSBmaWxlIHJlYWxseSBpcyBhCi1ncHJvZiBmaWxlLiAgRnVydGhlcm1vcmUsIGl0IGRvZXMgbm90IHByb3ZpZGUgYSB2ZXJzaW9uIG51bWJlciwgdGh1cwotcmVuZGVyaW5nIGNoYW5nZXMgdG8gdGhlIGZpbGUgZm9ybWF0IGFsbW9zdCBpbXBvc3NpYmxlLiAgQHNje2dudX0gQGNvZGV7Z3Byb2Z9Ci11c2VzIGEgbmV3IGZpbGUgZm9ybWF0IHRoYXQgcHJvdmlkZXMgdGhlc2UgZmVhdHVyZXMuICBGb3IgYmFja3dhcmQKLWNvbXBhdGliaWxpdHksIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBjb250aW51ZXMgdG8gc3VwcG9ydCB0aGUgb2xkIEJTRC1kZXJpdmVkCi1mb3JtYXQsIGJ1dCBub3QgYWxsIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQgd2l0aCBpdC4gIEZvciBleGFtcGxlLAotYmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50cyBjYW5ub3QgYmUgYWNjb21tb2RhdGVkIGJ5IHRoZSBvbGQgZmlsZQotZm9ybWF0LgotCi1UaGUgbmV3IGZpbGUgZm9ybWF0IGlzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGUgQGZpbGV7Z21vbl9vdXQuaH0uICBJdAotY29uc2lzdHMgb2YgYSBoZWFkZXIgY29udGFpbmluZyB0aGUgbWFnaWMgY29va2llIGFuZCBhIHZlcnNpb24gbnVtYmVyLAotYXMgd2VsbCBhcyBzb21lIHNwYXJlIGJ5dGVzIGF2YWlsYWJsZSBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuICBBbGwgZGF0YQotaW4gYSBwcm9maWxlIGRhdGEgZmlsZSBpcyBpbiB0aGUgbmF0aXZlIGZvcm1hdCBvZiB0aGUgaG9zdCBvbiB3aGljaAotdGhlIHByb2ZpbGUgd2FzIGNvbGxlY3RlZC4gIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSBhZGFwdHMgYXV0b21hdGljYWxseSB0byB0aGUKLWJ5dGUtb3JkZXIgaW4gdXNlLgotCi1JbiB0aGUgbmV3IGZpbGUgZm9ybWF0LCB0aGUgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YKLXJlY29yZHMuICBDdXJyZW50bHksIHRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgcmVjb3JkIHR5cGVzOiBoaXN0b2dyYW0KLXJlY29yZHMsIGNhbGwtZ3JhcGggYXJjIHJlY29yZHMsIGFuZCBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnQKLXJlY29yZHMuICBFYWNoIGZpbGUgY2FuIGNvbnRhaW4gYW55IG51bWJlciBvZiBlYWNoIHJlY29yZCB0eXBlLiAgV2hlbgotcmVhZGluZyBhIGZpbGUsIEBzY3tnbnV9IEBjb2Rle2dwcm9mfSB3aWxsIGVuc3VyZSByZWNvcmRzIG9mIHRoZSBzYW1lIHR5cGUgYXJlCi1jb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlciBhbmQgY29tcHV0ZSB0aGUgdW5pb24gb2YgYWxsIHJlY29yZHMuICBGb3IKLWV4YW1wbGUsIGZvciBiYXNpYy1ibG9jayBleGVjdXRpb24gY291bnRzLCB0aGUgdW5pb24gaXMgc2ltcGx5IHRoZSBzdW0KLW9mIGFsbCBleGVjdXRpb24gY291bnRzIGZvciBlYWNoIGJhc2ljLWJsb2NrLgotCi1Ac3Vic2VjdGlvbiBIaXN0b2dyYW0gUmVjb3JkcwotCi1IaXN0b2dyYW0gcmVjb3JkcyBjb25zaXN0IG9mIGEgaGVhZGVyIHRoYXQgaXMgZm9sbG93ZWQgYnkgYW4gYXJyYXkgb2YKLWJpbnMuICBUaGUgaGVhZGVyIGNvbnRhaW5zIHRoZSB0ZXh0LXNlZ21lbnQgcmFuZ2UgdGhhdCB0aGUgaGlzdG9ncmFtCi1zcGFucywgdGhlIHNpemUgb2YgdGhlIGhpc3RvZ3JhbSBpbiBieXRlcyAodW5saWtlIGluIHRoZSBvbGQgQlNECi1mb3JtYXQsIHRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyKSwgdGhlIHJhdGUgb2YgdGhlCi1wcm9maWxpbmcgY2xvY2ssIGFuZCB0aGUgcGh5c2ljYWwgZGltZW5zaW9uIHRoYXQgdGhlIGJpbiBjb3VudHMKLXJlcHJlc2VudCBhZnRlciBiZWluZyBzY2FsZWQgYnkgdGhlIHByb2ZpbGluZyBjbG9jayByYXRlLiAgVGhlCi1waHlzaWNhbCBkaW1lbnNpb24gaXMgc3BlY2lmaWVkIGluIHR3byBwYXJ0czogYSBsb25nIG5hbWUgb2YgdXAgdG8gMTUKLWNoYXJhY3RlcnMgYW5kIGEgc2luZ2xlIGNoYXJhY3RlciBhYmJyZXZpYXRpb24uICBGb3IgZXhhbXBsZSwgYQotaGlzdG9ncmFtIHJlcHJlc2VudGluZyByZWFsLXRpbWUgd291bGQgc3BlY2lmeSB0aGUgbG9uZyBuYW1lIGFzCi0ic2Vjb25kcyIgYW5kIHRoZSBhYmJyZXZpYXRpb24gYXMgInMiLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IKLWFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IHBlcmZvcm1hbmNlIG1vbml0b3IgaGFyZHdhcmUgKHdoaWNoLAotZm9ydHVuYXRlbHksIGlzIGJlY29taW5nIGluY3JlYXNpbmdseSBjb21tb24pLiAgRm9yIGV4YW1wbGUsIHVuZGVyIERFQwotT1NGLzEsIHRoZSAidXByb2ZpbGUiIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gcHJvZHVjZSBhIGhpc3RvZ3JhbSBvZiwKLXNheSwgaW5zdHJ1Y3Rpb24gY2FjaGUgbWlzc2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGltZW5zaW9uIGluIHRoZQotaGlzdG9ncmFtIGhlYWRlciBjb3VsZCBiZSBzZXQgdG8gImktY2FjaGUgbWlzc2VzIiBhbmQgdGhlIGFiYnJldmlhdGlvbgotY291bGQgYmUgc2V0IHRvICIxIiAoYmVjYXVzZSBpdCBpcyBzaW1wbHkgYSBjb3VudCwgbm90IGEgcGh5c2ljYWwKLWRpbWVuc2lvbikuICBBbHNvLCB0aGUgcHJvZmlsaW5nIHJhdGUgd291bGQgaGF2ZSB0byBiZSBzZXQgdG8gMSBpbgotdGhpcyBjYXNlLgotCi1IaXN0b2dyYW0gYmlucyBhcmUgMTYtYml0IG51bWJlcnMgYW5kIGVhY2ggYmluIHJlcHJlc2VudCBhbiBlcXVhbAotYW1vdW50IG9mIHRleHQtc3BhY2UuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHRleHQtc2VnbWVudCBpcyBvbmUKLXRob3VzYW5kIGJ5dGVzIGxvbmcgYW5kIGlmIHRoZXJlIGFyZSB0ZW4gYmlucyBpbiB0aGUgaGlzdG9ncmFtLCBlYWNoCi1iaW4gcmVwcmVzZW50cyBvbmUgaHVuZHJlZCBieXRlcy4KLQotCi1Ac3Vic2VjdGlvbiBDYWxsLUdyYXBoIFJlY29yZHMKLQotQ2FsbC1ncmFwaCByZWNvcmRzIGhhdmUgYSBmb3JtYXQgdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSB1c2VkIGluCi10aGUgQlNELWRlcml2ZWQgZmlsZSBmb3JtYXQuICBJdCBjb25zaXN0cyBvZiBhbiBhcmMgaW4gdGhlIGNhbGwgZ3JhcGgKLWFuZCBhIGNvdW50IGluZGljYXRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYXJjIHdhcyB0cmF2ZXJzZWQKLWR1cmluZyBwcm9ncmFtIGV4ZWN1dGlvbi4gIEFyY3MgYXJlIHNwZWNpZmllZCBieSBhIHBhaXIgb2YgYWRkcmVzc2VzOgotdGhlIGZpcnN0IG11c3QgYmUgd2l0aGluIGNhbGxlcidzIGZ1bmN0aW9uIGFuZCB0aGUgc2Vjb25kIG11c3QgYmUKLXdpdGhpbiB0aGUgY2FsbGVlJ3MgZnVuY3Rpb24uICBXaGVuIHBlcmZvcm1pbmcgcHJvZmlsaW5nIGF0IHRoZQotZnVuY3Rpb24gbGV2ZWwsIHRoZXNlIGFkZHJlc3NlcyBjYW4gcG9pbnQgYW55d2hlcmUgd2l0aGluIHRoZQotcmVzcGVjdGl2ZSBmdW5jdGlvbi4gIEhvd2V2ZXIsIHdoZW4gcHJvZmlsaW5nIGF0IHRoZSBsaW5lLWxldmVsLCBpdCBpcwotYmV0dGVyIGlmIHRoZSBhZGRyZXNzZXMgYXJlIGFzIGNsb3NlIHRvIHRoZSBjYWxsLXNpdGUvZW50cnktcG9pbnQgYXMKLXBvc3NpYmxlLiAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBsaW5lLWxldmVsIGNhbGwtZ3JhcGggaXMgYWJsZSB0bwotaWRlbnRpZnkgZXhhY3RseSB3aGljaCBsaW5lIG9mIHNvdXJjZSBjb2RlIHBlcmZvcm1lZCBjYWxscyB0byBhCi1mdW5jdGlvbi4KLQotQHN1YnNlY3Rpb24gQmFzaWMtQmxvY2sgRXhlY3V0aW9uIENvdW50IFJlY29yZHMKLQotQmFzaWMtYmxvY2sgZXhlY3V0aW9uIGNvdW50IHJlY29yZHMgY29uc2lzdCBvZiBhIGhlYWRlciBmb2xsb3dlZCBieSBhCi1zZXF1ZW5jZSBvZiBhZGRyZXNzL2NvdW50IHBhaXJzLiAgVGhlIGhlYWRlciBzaW1wbHkgc3BlY2lmaWVzIHRoZQotbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4gIEluIGFuIGFkZHJlc3MvY291bnQgcGFpciwgdGhlIGFkZHJlc3MKLWlkZW50aWZpZXMgYSBiYXNpYy1ibG9jayBhbmQgdGhlIGNvdW50IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWVzCi10aGF0IGJhc2ljLWJsb2NrIHdhcyBleGVjdXRlZC4gIEFueSBhZGRyZXNzIHdpdGhpbiB0aGUgYmFzaWMtYWRkcmVzcyBjYW4KLWJlIHVzZWQuCi0KLUBub2RlIEludGVybmFscyxEZWJ1Z2dpbmcsRmlsZSBGb3JtYXQsRGV0YWlscwotQHNlY3Rpb24gQGNvZGV7Z3Byb2Z9J3MgSW50ZXJuYWwgT3BlcmF0aW9uCi0KLUxpa2UgbW9zdCBwcm9ncmFtcywgQGNvZGV7Z3Byb2Z9IGJlZ2lucyBieSBwcm9jZXNzaW5nIGl0cyBvcHRpb25zLgotRHVyaW5nIHRoaXMgc3RhZ2UsIGl0IG1heSBidWlsZGluZyBpdHMgc3ltc3BlYyBsaXN0Ci0oQGNvZGV7c3ltX2lkcy5jOnN5bV9pZF9hZGR9KSwgaWYKLW9wdGlvbnMgYXJlIHNwZWNpZmllZCB3aGljaCB1c2Ugc3ltc3BlY3MuCi1AY29kZXtncHJvZn0gbWFpbnRhaW5zIGEgc2luZ2xlIGxpbmtlZCBsaXN0IG9mIHN5bXNwZWNzLAotd2hpY2ggd2lsbCBldmVudHVhbGx5IGdldCB0dXJuZWQgaW50byAxMiBzeW1ib2wgdGFibGVzLAotb3JnYW5pemVkIGludG8gc2l4IGluY2x1ZGUvZXhjbHVkZSBwYWlycyAtIG9uZQotcGFpciBlYWNoIGZvciB0aGUgZmxhdCBwcm9maWxlIChJTkNMX0ZMQVQvRVhDTF9GTEFUKSwKLXRoZSBjYWxsIGdyYXBoIGFyY3MgKElOQ0xfQVJDUy9FWENMX0FSQ1MpLAotcHJpbnRpbmcgaW4gdGhlIGNhbGwgZ3JhcGggKElOQ0xfR1JBUEgvRVhDTF9HUkFQSCksCi10aW1pbmcgcHJvcGFnYXRpb24gaW4gdGhlIGNhbGwgZ3JhcGggKElOQ0xfVElNRS9FWENMX1RJTUUpLAotdGhlIGFubm90YXRlZCBzb3VyY2UgbGlzdGluZyAoSU5DTF9BTk5PL0VYQ0xfQU5OTyksCi1hbmQgdGhlIGV4ZWN1dGlvbiBjb3VudCBsaXN0aW5nIChJTkNMX0VYRUMvRVhDTF9FWEVDKS4KLQotQWZ0ZXIgb3B0aW9uIHByb2Nlc3NpbmcsIEBjb2Rle2dwcm9mfSBmaW5pc2hlcwotYnVpbGRpbmcgdGhlIHN5bXNwZWMgbGlzdCBieSBhZGRpbmcgYWxsIHRoZSBzeW1zcGVjcyBpbgotQGNvZGV7ZGVmYXVsdF9leGNsdWRlZF9saXN0fSB0byB0aGUgZXhjbHVkZSBsaXN0cwotRVhDTF9USU1FIGFuZCBFWENMX0dSQVBILCBhbmQgaWYgbGluZS1ieS1saW5lIHByb2ZpbGluZyBpcyBzcGVjaWZpZWQsCi1FWENMX0ZMQVQgYXMgd2VsbC4KLVRoZXNlIGRlZmF1bHQgZXhjbHVkZXMgYXJlIG5vdCBhZGRlZCB0byBFWENMX0FOTk8sIEVYQ0xfQVJDUywgYW5kIEVYQ0xfRVhFQy4KLQotTmV4dCwgdGhlIEJGRCBsaWJyYXJ5IGlzIGNhbGxlZCB0byBvcGVuIHRoZSBvYmplY3QgZmlsZSwKLXZlcmlmeSB0aGF0IGl0IGlzIGFuIG9iamVjdCBmaWxlLAotYW5kIHJlYWQgaXRzIHN5bWJvbCB0YWJsZSAoQGNvZGV7Y29yZS5jOmNvcmVfaW5pdH0pLAotdXNpbmcgQGNvZGV7YmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWJ9IGFmdGVyIG1hbGxvY2luZwotYW4gYXBwcm9waWF0ZSBzaXplZCBhcnJheSBvZiBhc3ltYm9scy4gIEF0IHRoaXMgcG9pbnQsCi1mdW5jdGlvbiBtYXBwaW5ncyBhcmUgcmVhZCAoaWYgdGhlIEBzYW1wey0tZmlsZS1vcmRlcmluZ30gb3B0aW9uCi1oYXMgYmVlbiBzcGVjaWZpZWQpLCBhbmQgdGhlIGNvcmUgdGV4dCBzcGFjZSBpcyByZWFkIGludG8KLW1lbW9yeSAoaWYgdGhlIEBzYW1wey1jfSBvcHRpb24gd2FzIGdpdmVuKS4KLQotQGNvZGV7Z3Byb2Z9J3Mgb3duIHN5bWJvbCB0YWJsZSwgYW4gYXJyYXkgb2YgU3ltIHN0cnVjdHVyZXMsCi1pcyBub3cgYnVpbHQuCi1UaGlzIGlzIGRvbmUgaW4gb25lIG9mIHR3byB3YXlzLCBieSBvbmUgb2YgdHdvIHJvdXRpbmVzLCBkZXBlbmRpbmcKLW9uIHdoZXRoZXIgbGluZS1ieS1saW5lIHByb2ZpbGluZyAoQHNhbXB7LWx9IG9wdGlvbikgaGFzIGJlZW4KLWVuYWJsZWQuCi1Gb3Igbm9ybWFsIHByb2ZpbGluZywgdGhlIEJGRCBjYW5vbmljYWwgc3ltYm9sIHRhYmxlIGlzIHNjYW5uZWQuCi1Gb3IgbGluZS1ieS1saW5lIHByb2ZpbGluZywgZXZlcnkKLXRleHQgc3BhY2UgYWRkcmVzcyBpcyBleGFtaW5lZCwgYW5kIGEgbmV3IHN5bWJvbCB0YWJsZSBlbnRyeQotZ2V0cyBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhlIGxpbmUgbnVtYmVyIGNoYW5nZXMuCi1JbiBlaXRoZXIgY2FzZSwgdHdvIHBhc3NlcyBhcmUgbWFkZSB0aHJvdWdoIHRoZSBzeW1ib2wKLXRhYmxlIC0gb25lIHRvIGNvdW50IHRoZSBzaXplIG9mIHRoZSBzeW1ib2wgdGFibGUgcmVxdWlyZWQsCi1hbmQgdGhlIG90aGVyIHRvIGFjdHVhbGx5IHJlYWQgdGhlIHN5bWJvbHMuICBJbiBiZXR3ZWVuIHRoZQotdHdvIHBhc3NlcywgYSBzaW5nbGUgYXJyYXkgb2YgdHlwZSBAY29kZXtTeW19IGlzIGNyZWF0ZWQgb2YKLXRoZSBhcHByb3BpYXRlIGxlbmd0aC4KLUZpbmFsbHksIEBjb2Rle3N5bXRhYi5jOnN5bXRhYl9maW5hbGl6ZX0KLWlzIGNhbGxlZCB0byBzb3J0IHRoZSBzeW1ib2wgdGFibGUgYW5kIHJlbW92ZSBkdXBsaWNhdGUgZW50cmllcwotKGVudHJpZXMgd2l0aCB0aGUgc2FtZSBtZW1vcnkgYWRkcmVzcykuCi0KLVRoZSBzeW1ib2wgdGFibGUgbXVzdCBiZSBhIGNvbnRpZ3VvdXMgYXJyYXkgZm9yIHR3byByZWFzb25zLgotRmlyc3QsIHRoZSBAY29kZXtxc29ydH0gbGlicmFyeSBmdW5jdGlvbiAod2hpY2ggc29ydHMgYW4gYXJyYXkpCi13aWxsIGJlIHVzZWQgdG8gc29ydCB0aGUgc3ltYm9sIHRhYmxlLgotQWxzbywgdGhlIHN5bWJvbCBsb29rdXAgcm91dGluZSAoQGNvZGV7c3ltdGFiLmM6c3ltX2xvb2t1cH0pLAotd2hpY2ggZmluZHMgc3ltYm9scwotYmFzZWQgb24gbWVtb3J5IGFkZHJlc3MsIHVzZXMgYSBiaW5hcnkgc2VhcmNoIGFsZ29yaXRobQotd2hpY2ggcmVxdWlyZXMgdGhlIHN5bWJvbCB0YWJsZSB0byBiZSBhIHNvcnRlZCBhcnJheS4KLUZ1bmN0aW9uIHN5bWJvbHMgYXJlIGluZGljYXRlZCB3aXRoIGFuIEBjb2Rle2lzX2Z1bmN9IGZsYWcuCi1MaW5lIG51bWJlciBzeW1ib2xzIGhhdmUgbm8gc3BlY2lhbCBmbGFncyBzZXQuCi1BZGRpdGlvbmFsbHksIGEgc3ltYm9sIGNhbiBoYXZlIGFuIEBjb2Rle2lzX3N0YXRpY30gZmxhZwotdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBhIGxvY2FsIHN5bWJvbC4KLQotV2l0aCB0aGUgc3ltYm9sIHRhYmxlIHJlYWQsIHRoZSBzeW1zcGVjcyBjYW4gbm93IGJlIHRyYW5zbGF0ZWQKLWludG8gU3ltcyAoQGNvZGV7c3ltX2lkcy5jOnN5bV9pZF9wYXJzZX0pLiAgUmVtZW1iZXIgdGhhdCBhIHNpbmdsZQotc3ltc3BlYyBjYW4gbWF0Y2ggbXVsdGlwbGUgc3ltYm9scy4KLUFuIGFycmF5IG9mIHN5bWJvbCB0YWJsZXMKLShAY29kZXtzeW1zfSkgaXMgY3JlYXRlZCwgZWFjaCBlbnRyeSBvZiB3aGljaCBpcyBhIHN5bWJvbCB0YWJsZQotb2YgU3ltcyB0byBiZSBpbmNsdWRlZCBvciBleGNsdWRlZCBmcm9tIGEgcGFydGljdWxhciBsaXN0aW5nLgotVGhlIG1hc3RlciBzeW1ib2wgdGFibGUgYW5kIHRoZSBzeW1zcGVjcyBhcmUgZXhhbWluZWQgYnkgbmVzdGVkCi1sb29wcywgYW5kIGV2ZXJ5IHN5bWJvbCB0aGF0IG1hdGNoZXMgYSBzeW1zcGVjIGlzIGluc2VydGVkCi1pbnRvIHRoZSBhcHByb3ByaWF0ZSBzeW1zIHRhYmxlLiAgVGhpcyBpcyBkb25lIHR3aWNlLCBvbmNlIHRvCi1jb3VudCB0aGUgc2l6ZSBvZiBlYWNoIHJlcXVpcmVkIHN5bWJvbCB0YWJsZSwgYW5kIGFnYWluIHRvIGJ1aWxkCi10aGUgdGFibGVzLCB3aGljaCBoYXZlIGJlZW4gbWFsbG9jZWQgYmV0d2VlbiBwYXNzZXMuCi1Gcm9tIG5vdyBvbiwgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBzeW1ib2wgaXMgb24gYW4gaW5jbHVkZQotb3IgZXhjbHVkZSBzeW1zcGVjIGxpc3QsIEBjb2Rle2dwcm9mfSBzaW1wbHkgdXNlcyBpdHMKLXN0YW5kYXJkIHN5bWJvbCBsb29rdXAgcm91dGluZSBvbiB0aGUgYXBwcm9wcmlhdGUgdGFibGUKLWluIHRoZSBAY29kZXtzeW1zfSBhcnJheS4KLQotTm93IHRoZSBwcm9maWxlIGRhdGEgZmlsZShzKSB0aGVtc2VsdmVzIGFyZSByZWFkCi0oQGNvZGV7Z21vbl9pby5jOmdtb25fb3V0X3JlYWR9KSwKLWZpcnN0IGJ5IGNoZWNraW5nIGZvciBhIG5ldy1zdHlsZSBAc2FtcHtnbW9uLm91dH0gaGVhZGVyLAotdGhlbiBhc3N1bWluZyB0aGlzIGlzIGFuIG9sZC1zdHlsZSBCU0QgQHNhbXB7Z21vbi5vdXR9Ci1pZiB0aGUgbWFnaWMgbnVtYmVyIHRlc3QgZmFpbGVkLgotCi1OZXctc3R5bGUgaGlzdG9ncmFtIHJlY29yZHMgYXJlIHJlYWQgYnkgQGNvZGV7aGlzdC5jOmhpc3RfcmVhZF9yZWN9LgotRm9yIHRoZSBmaXJzdCBoaXN0b2dyYW0gcmVjb3JkLCBhbGxvY2F0ZSBhIG1lbW9yeSBhcnJheSB0byBob2xkCi1hbGwgdGhlIGJpbnMsIGFuZCByZWFkIHRoZW0gaW4uCi1XaGVuIG11bHRpcGxlIHByb2ZpbGUgZGF0YSBmaWxlcyAob3IgZmlsZXMgd2l0aCBtdWx0aXBsZSBoaXN0b2dyYW0KLXJlY29yZHMpIGFyZSByZWFkLCB0aGUgc3RhcnRpbmcgYWRkcmVzcywgZW5kaW5nIGFkZHJlc3MsIG51bWJlcgotb2YgYmlucyBhbmQgc2FtcGxpbmcgcmF0ZSBtdXN0IG1hdGNoIGJldHdlZW4gdGhlIHZhcmlvdXMgaGlzdG9ncmFtcywKLW9yIGEgZmF0YWwgZXJyb3Igd2lsbCByZXN1bHQuCi1JZiBldmVyeXRoaW5nIG1hdGNoZXMsIGp1c3Qgc3VtIHRoZSBhZGRpdGlvbmFsIGhpc3RvZ3JhbXMgaW50bwotdGhlIGV4aXN0aW5nIGluLW1lbW9yeSBhcnJheS4KLQotQXMgZWFjaCBjYWxsIGdyYXBoIHJlY29yZCBpcyByZWFkIChAY29kZXtjYWxsX2dyYXBoLmM6Y2dfcmVhZF9yZWN9KSwKLXRoZSBwYXJlbnQgYW5kIGNoaWxkIGFkZHJlc3NlcwotYXJlIG1hdGNoZWQgdG8gc3ltYm9sIHRhYmxlIGVudHJpZXMsIGFuZCBhIGNhbGwgZ3JhcGggYXJjIGlzCi1jcmVhdGVkIGJ5IEBjb2Rle2NnX2FyY3MuYzphcmNfYWRkfSwgdW5sZXNzIHRoZSBhcmMgZmFpbHMgYSBzeW1zcGVjCi1jaGVjayBhZ2FpbnN0IElOQ0xfQVJDUy9FWENMX0FSQ1MuICBBcyBlYWNoIGFyYyBpcyBhZGRlZCwKLWEgbGlua2VkIGxpc3QgaXMgbWFpbnRhaW5lZCBvZiB0aGUgcGFyZW50J3MgY2hpbGQgYXJjcywgYW5kIG9mIHRoZSBjaGlsZCdzCi1wYXJlbnQgYXJjcy4KLUJvdGggdGhlIGNoaWxkJ3MgY2FsbCBjb3VudCBhbmQgdGhlIGFyYydzIGNhbGwgY291bnQgYXJlCi1pbmNyZW1lbnRlZCBieSB0aGUgcmVjb3JkJ3MgY2FsbCBjb3VudC4KLQotQmFzaWMtYmxvY2sgcmVjb3JkcyBhcmUgcmVhZCAoQGNvZGV7YmFzaWNfYmxvY2tzLmM6YmJfcmVhZF9yZWN9KSwKLWJ1dCBvbmx5IGlmIGxpbmUtYnktbGluZSBwcm9maWxpbmcgaGFzIGJlZW4gc2VsZWN0ZWQuCi1FYWNoIGJhc2ljLWJsb2NrIGFkZHJlc3MgaXMgbWF0Y2hlZCB0byBhIGNvcnJlc3BvbmRpbmcgbGluZQotc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUsIGFuZCBhbiBlbnRyeSBtYWRlIGluIHRoZSBzeW1ib2wncwotYmJfYWRkciBhbmQgYmJfY2FsbHMgYXJyYXlzLiAgQWdhaW4sIGlmIG11bHRpcGxlIGJhc2ljLWJsb2NrCi1yZWNvcmRzIGFyZSBwcmVzZW50IGZvciB0aGUgc2FtZSBhZGRyZXNzLCB0aGUgY2FsbCBjb3VudHMKLWFyZSBjdW11bGF0aXZlLgotCi1BIGdtb24uc3VtIGZpbGUgaXMgZHVtcGVkLCBpZiByZXF1ZXN0ZWQgKEBjb2Rle2dtb25faW8uYzpnbW9uX291dF93cml0ZX0pLgotCi1JZiBoaXN0b2dyYW1zIHdlcmUgcHJlc2VudCBpbiB0aGUgZGF0YSBmaWxlcywgYXNzaWduIHRoZW0gdG8gc3ltYm9scwotKEBjb2Rle2hpc3QuYzpoaXN0X2Fzc2lnbl9zYW1wbGVzfSkgYnkgaXRlcmF0aW5nIG92ZXIgYWxsIHRoZSBzYW1wbGUKLWJpbnMgYW5kIGFzc2lnbmluZyB0aGVtIHRvIHN5bWJvbHMuICBTaW5jZSB0aGUgc3ltYm9sIHRhYmxlCi1pcyBzb3J0ZWQgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIG1lbW9yeSBhZGRyZXNzZXMsIHdlIGNhbgotc2ltcGxlIGZvbGxvdyBhbG9uZyBpbiB0aGUgc3ltYm9sIHRhYmxlIGFzIHdlIG1ha2Ugb3VyIHBhc3MKLW92ZXIgdGhlIHNhbXBsZSBiaW5zLgotVGhpcyBzdGVwIGluY2x1ZGVzIGEgc3ltc3BlYyBjaGVjayBhZ2FpbnN0IElOQ0xfRkxBVC9FWENMX0ZMQVQuCi1EZXBlbmRpbmcgb24gdGhlIGhpc3RvZ3JhbQotc2NhbGUgZmFjdG9yLCBhIHNhbXBsZSBiaW4gbWF5IHNwYW4gbXVsdGlwbGUgc3ltYm9scywKLWluIHdoaWNoIGNhc2UgYSBmcmFjdGlvbiBvZiB0aGUgc2FtcGxlIGNvdW50IGlzIGFsbG9jYXRlZAotdG8gZWFjaCBzeW1ib2wsIHByb3BvcnRpb25hbCB0byB0aGUgZGVncmVlIG9mIG92ZXJsYXAuCi1UaGlzIGVmZmVjdCBpcyByYXJlIGZvciBub3JtYWwgcHJvZmlsaW5nLCBidXQgb3ZlcmxhcHMKLWFyZSBtb3JlIGNvbW1vbiBkdXJpbmcgbGluZS1ieS1saW5lIHByb2ZpbGluZywgYW5kIGNhbgotY2F1c2UgZWFjaCBvZiB0d28gYWRqYWNlbnQgbGluZXMgdG8gYmUgY3JlZGl0ZWQgd2l0aCBoYWxmCi1hIGhpdCwgZm9yIGV4YW1wbGUuCi0KLUlmIGNhbGwgZ3JhcGggZGF0YSBpcyBwcmVzZW50LCBAY29kZXtjZ19hcmNzLmM6Y2dfYXNzZW1ibGV9IGlzIGNhbGxlZC4KLUZpcnN0LCBpZiBAc2FtcHstY30gd2FzIHNwZWNpZmllZCwgYSBtYWNoaW5lLWRlcGVuZGFudAotcm91dGluZSAoQGNvZGV7ZmluZF9jYWxsfSkgc2NhbnMgdGhyb3VnaCBlYWNoIHN5bWJvbCdzIG1hY2hpbmUgY29kZSwKLWxvb2tpbmcgZm9yIHN1YnJvdXRpbmUgY2FsbCBpbnN0cnVjdGlvbnMsIGFuZCBhZGRpbmcgdGhlbQotdG8gdGhlIGNhbGwgZ3JhcGggd2l0aCBhIHplcm8gY2FsbCBjb3VudC4KLUEgdG9wb2xvZ2ljYWwgc29ydCBpcyBwZXJmb3JtZWQgYnkgZGVwdGgtZmlyc3QgbnVtYmVyaW5nCi1hbGwgdGhlIHN5bWJvbHMgKEBjb2Rle2NnX2Rmbi5jOmNnX2Rmbn0pLCBzbyB0aGF0Ci1jaGlsZHJlbiBhcmUgYWx3YXlzIG51bWJlcmVkIGxlc3MgdGhhbiB0aGVpciBwYXJlbnRzLAotdGhlbiBtYWtpbmcgYSBhcnJheSBvZiBwb2ludGVycyBpbnRvIHRoZSBzeW1ib2wgdGFibGUgYW5kIHNvcnRpbmcgaXQgaW50bwotbnVtZXJpY2FsIG9yZGVyLCB3aGljaCBpcyByZXZlcnNlIHRvcG9sb2dpY2FsCi1vcmRlciAoY2hpbGRyZW4gYXBwZWFyIGJlZm9yZSBwYXJlbnRzKS4KLUN5Y2xlcyBhcmUgYWxzbyBkZXRlY3RlZCBhdCB0aGlzIHBvaW50LCBhbGwgbWVtYmVycwotb2Ygd2hpY2ggYXJlIGFzc2lnbmVkIHRoZSBzYW1lIHRvcG9sb2dpY2FsIG51bWJlci4KLVR3byBwYXNzZXMgYXJlIG5vdyBtYWRlIHRocm91Z2ggdGhpcyBzb3J0ZWQgYXJyYXkgb2Ygc3ltYm9sIHBvaW50ZXJzLgotVGhlIGZpcnN0IHBhc3MsIGZyb20gZW5kIHRvIGJlZ2lubmluZyAocGFyZW50cyB0byBjaGlsZHJlbiksCi1jb21wdXRlcyB0aGUgZnJhY3Rpb24gb2YgY2hpbGQgdGltZSB0byBwcm9wb2dhdGUgdG8gZWFjaCBwYXJlbnQKLWFuZCBhIHByaW50IGZsYWcuCi1UaGUgcHJpbnQgZmxhZyByZWZsZWN0cyBzeW1zcGVjIGhhbmRsaW5nIG9mIElOQ0xfR1JBUEgvRVhDTF9HUkFQSCwKLXdpdGggYSBwYXJlbnQncyBpbmNsdWRlIG9yIGV4Y2x1ZGUgKHByaW50IG9yIG5vIHByaW50KSBwcm9wZXJ0eQotYmVpbmcgcHJvcGFnYXRlZCB0byBpdHMgY2hpbGRyZW4sIHVubGVzcyB0aGV5IHRoZW1zZWx2ZXMgZXhwbGljaXRseSBhcHBlYXIKLWluIElOQ0xfR1JBUEggb3IgRVhDTF9HUkFQSC4KLUEgc2Vjb25kIHBhc3MsIGZyb20gYmVnaW5uaW5nIHRvIGVuZCAoY2hpbGRyZW4gdG8gcGFyZW50cykgYWN0dWFsbHkKLXByb3BvZ2F0ZXMgdGhlIHRpbWluZ3MgYWxvbmcgdGhlIGNhbGwgZ3JhcGgsIHN1YmplY3QKLXRvIGEgY2hlY2sgYWdhaW5zdCBJTkNMX1RJTUUvRVhDTF9USU1FLgotV2l0aCB0aGUgcHJpbnQgZmxhZywgZnJhY3Rpb25zLCBhbmQgdGltaW5ncyBub3cgc3RvcmVkIGluIHRoZSBzeW1ib2wKLXN0cnVjdHVyZXMsIHRoZSB0b3BvbG9naWNhbCBzb3J0IGFycmF5IGlzIG5vdyBkaXNjYXJkZWQsIGFuZCBhCi1uZXcgYXJyYXkgb2YgcG9pbnRlcnMgaXMgYXNzZW1ibGVkLCB0aGlzIHRpbWUgc29ydGVkIGJ5IHByb3BhZ2F0ZWQgdGltZS4KLQotRmluYWxseSwgcHJpbnQgdGhlIHZhcmlvdXMgb3V0cHV0cyB0aGUgdXNlciByZXF1ZXN0ZWQsIHdoaWNoIGlzIG5vdyBmYWlybHkKLXN0cmFpZ2h0Zm9yd2FyZC4gIFRoZSBjYWxsIGdyYXBoIChAY29kZXtjZ19wcmludC5jOmNnX3ByaW50fSkgYW5kCi1mbGF0IHByb2ZpbGUgKEBjb2Rle2hpc3QuYzpoaXN0X3ByaW50fSkgYXJlIHJlZ3VyZ2l0YXRpb25zIG9mIHZhbHVlcwotYWxyZWFkeSBjb21wdXRlZC4gIFRoZSBhbm5vdGF0ZWQgc291cmNlIGxpc3RpbmcKLShAY29kZXtiYXNpY19ibG9ja3MuYzpwcmludF9hbm5vdGF0ZWRfc291cmNlfSkgdXNlcyBiYXNpYy1ibG9jawotaW5mb3JtYXRpb24sIGlmIHByZXNlbnQsIHRvIGxhYmVsIGVhY2ggbGluZSBvZiBjb2RlIHdpdGggY2FsbCBjb3VudHMsCi1vdGhlcndpc2Ugb25seSB0aGUgZnVuY3Rpb24gY2FsbCBjb3VudHMgYXJlIHByZXNlbnRlZC4KLQotVGhlIGZ1bmN0aW9uIG9yZGVyaW5nIGNvZGUgaXMgbWFyZ2luYWxseSB3ZWxsIGRvY3VtZW50ZWQKLWluIHRoZSBzb3VyY2UgY29kZSBpdHNlbGYgKEBjb2Rle2NnX3ByaW50LmN9KS4gIEJhc2ljYWxseSwKLXRoZSBmdW5jdGlvbnMgd2l0aCB0aGUgbW9zdCB1c2UgYW5kIHRoZSBtb3N0IHBhcmVudHMgYXJlCi1wbGFjZWQgZmlyc3QsIGZvbGxvd2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyB3aXRoIHRoZSBtb3N0IHVzZSwKLWZvbGxvd2VkIGJ5IGxvd2VyIHVzZSBmdW5jdGlvbnMsIGZvbGxvd2VkIGJ5IHVudXNlZCBmdW5jdGlvbnMKLWF0IHRoZSBlbmQuCi0KLUBub2RlIERlYnVnZ2luZywsSW50ZXJuYWxzLERldGFpbHMKLUBzdWJzZWN0aW9uIERlYnVnZ2luZyBAY29kZXtncHJvZn0KLQotSWYgQGNvZGV7Z3Byb2Z9IHdhcyBjb21waWxlZCB3aXRoIGRlYnVnZ2luZyBlbmFibGVkLAotdGhlIEBzYW1wey1kfSBvcHRpb24gdHJpZ2dlcnMgZGVidWdnaW5nIG91dHB1dAotKHRvIHN0ZG91dCkgd2hpY2ggY2FuIGJlIGhlbHBmdWwgaW4gdW5kZXJzdGFuZGluZyBpdHMgb3BlcmF0aW9uLgotVGhlIGRlYnVnZ2luZyBudW1iZXIgc3BlY2lmaWVkIGlzIGludGVycHJldGVkIGFzIGEgc3VtIG9mIHRoZSBmb2xsb3dpbmcKLW9wdGlvbnM6Ci0KLUB0YWJsZSBAYXNpcwotQGl0ZW0gMiAtIFRvcG9sb2dpY2FsIHNvcnQKLU1vbml0b3IgZGVwdGgtZmlyc3QgbnVtYmVyaW5nIG9mIHN5bWJvbHMgZHVyaW5nIGNhbGwgZ3JhcGggYW5hbHlzaXMKLUBpdGVtIDQgLSBDeWNsZXMKLVNob3dzIHN5bWJvbHMgYXMgdGhleSBhcmUgaWRlbnRpZmllZCBhcyBjeWNsZSBoZWFkcwotQGl0ZW0gMTYgLSBUYWxseWluZwotQXMgdGhlIGNhbGwgZ3JhcGggYXJjcyBhcmUgcmVhZCwgc2hvdyBlYWNoIGFyYyBhbmQgaG93Ci10aGUgdG90YWwgY2FsbHMgdG8gZWFjaCBmdW5jdGlvbiBhcmUgdGFsbGllZAotQGl0ZW0gMzIgLSBDYWxsIGdyYXBoIGFyYyBzb3J0aW5nCi1EZXRhaWxzIHNvcnRpbmcgaW5kaXZpZHVhbCBwYXJlbnRzL2NoaWxkcmVuIHdpdGhpbiBlYWNoIGNhbGwgZ3JhcGggZW50cnkKLUBpdGVtIDY0IC0gUmVhZGluZyBoaXN0b2dyYW0gYW5kIGNhbGwgZ3JhcGggcmVjb3JkcwotU2hvd3MgYWRkcmVzcyByYW5nZXMgb2YgaGlzdG9ncmFtcyBhcyB0aGV5IGFyZSByZWFkLCBhbmQgZWFjaAotY2FsbCBncmFwaCBhcmMKLUBpdGVtIDEyOCAtIFN5bWJvbCB0YWJsZQotUmVhZGluZywgY2xhc3NpZnlpbmcsIGFuZCBzb3J0aW5nIHRoZSBzeW1ib2wgdGFibGUgZnJvbSB0aGUgb2JqZWN0IGZpbGUuCi1Gb3IgbGluZS1ieS1saW5lIHByb2ZpbGluZyAoQHNhbXB7LWx9IG9wdGlvbiksIGFsc28gc2hvd3MgbGluZSBudW1iZXJzCi1iZWluZyBhc3NpZ25lZCB0byBtZW1vcnkgYWRkcmVzc2VzLgotQGl0ZW0gMjU2IC0gU3RhdGljIGNhbGwgZ3JhcGgKLVRyYWNlIG9wZXJhdGlvbiBvZiBAc2FtcHstY30gb3B0aW9uCi1AaXRlbSA1MTIgLSBTeW1ib2wgdGFibGUgYW5kIGFyYyB0YWJsZSBsb29rdXBzCi1EZXRhaWwgb3BlcmF0aW9uIG9mIGxvb2t1cCByb3V0aW5lcwotQGl0ZW0gMTAyNCAtIENhbGwgZ3JhcGggcHJvcGFnYXRpb24KLVNob3dzIGhvdyBmdW5jdGlvbiB0aW1lcyBhcmUgcHJvcGFnYXRlZCBhbG9uZyB0aGUgY2FsbCBncmFwaAotQGl0ZW0gMjA0OCAtIEJhc2ljLWJsb2NrcwotU2hvd3MgYmFzaWMtYmxvY2sgcmVjb3JkcyBhcyB0aGV5IGFyZSByZWFkIGZyb20gcHJvZmlsZSBkYXRhCi0ob25seSBtZWFuaW5nZnVsIHdpdGggQHNhbXB7LWx9IG9wdGlvbikKLUBpdGVtIDQwOTYgLSBTeW1zcGVjcwotU2hvd3Mgc3ltc3BlYy10by1zeW1ib2wgcGF0dGVybiBtYXRjaGluZyBvcGVyYXRpb24KLUBpdGVtIDgxOTIgLSBBbm5vdGF0ZSBzb3VyY2UKLVRyYWNrcyBvcGVyYXRpb24gb2YgQHNhbXB7LUF9IG9wdGlvbgotQGVuZCB0YWJsZQotCi1AY29udGVudHMKLUBieWUKLQotTkVFRFMgQU4gSU5ERVgKLQotLVQgLSAidHJhZGl0aW9uYWwgQlNEIHN0eWxlIjogSG93IGlzIGl0IGRpZmZlcmVudD8gIFNob3VsZCB0aGUKLWRpZmZlcmVuY2VzIGJlIGRvY3VtZW50ZWQ/Ci0KLWV4YW1wbGUgZmxhdCBmaWxlIGFkZHMgdXAgdG8gMTAwLjAxJS4uLgotCi1ub3RlOiB0aW1lIGVzdGltYXRlcyBub3cgb25seSBnbyBvdXQgdG8gb25lIGRlY2ltYWwgcGxhY2UgKDAuMCksIHdoZXJlCi10aGV5IHVzZWQgdG8gZXh0ZW5kIHR3byAoNzguNjcpLgpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGVydHouYyBiL2dwcm9mL2hlcnR6LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MzE0YWMuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvaGVydHouYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiaGVydHouaCIKLQotCi0jaWZkZWYgX19NU0RPU19fCi0jZGVmaW5lIEhFUlRaIDE4Ci0jZW5kaWYKLQotaW50Ci1oZXJ0eiAoKQotewotI2lmZGVmIEhFUlRaCi0gIHJldHVybiBIRVJUWjsKLSNlbHNlIC8qICEgZGVmaW5lZCAoSEVSVFopICovCi0jaWZkZWYgSEFWRV9TRVRJVElNRVIKLSAgc3RydWN0IGl0aW1lcnZhbCB0aW07Ci0KLSAgdGltLml0X2ludGVydmFsLnR2X3NlYyA9IDA7Ci0gIHRpbS5pdF9pbnRlcnZhbC50dl91c2VjID0gMTsKLSAgdGltLml0X3ZhbHVlLnR2X3NlYyA9IDA7Ci0gIHRpbS5pdF92YWx1ZS50dl91c2VjID0gMDsKLSAgc2V0aXRpbWVyIChJVElNRVJfUkVBTCwgJnRpbSwgMCk7Ci0gIHNldGl0aW1lciAoSVRJTUVSX1JFQUwsIDAsICZ0aW0pOwotICBpZiAodGltLml0X2ludGVydmFsLnR2X3VzZWMgPCAyKQotICAgIHsKLSAgICAgIHJldHVybiBIWl9XUk9ORzsKLSAgICB9Ci0gIHJldHVybiAxMDAwMDAwIC8gdGltLml0X2ludGVydmFsLnR2X3VzZWM7Ci0jZWxzZSAvKiAhIGRlZmluZWQgKEhBVkVfU0VUSVRJTUVSKSAqLwotI2lmIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgJiYgZGVmaW5lZCAoX1NDX0NMS19UQ0spCi0gIHJldHVybiBzeXNjb25mIChfU0NfQ0xLX1RDSyk7Ci0jZWxzZSAvKiAhIGRlZmluZWQgKEhBVkVfU1lTQ09ORikgfHwgISBkZWZpbmVkIChfU0NfQ0xLX1RDSykgKi8KLSAgcmV0dXJuIEhaX1dST05HOwotI2VuZGlmIC8qICEgZGVmaW5lZCAoSEFWRV9TWVNDT05GKSB8fCAhIGRlZmluZWQgKF9TQ19DTEtfVENLKSAqLwotI2VuZGlmIC8qICEgZGVmaW5lZCAoSEFWRV9TRVRJVElNRVIpICovCi0jZW5kaWYgLyogISBkZWZpbmVkIChIRVJUWikgKi8KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2hlcnR6LmggYi9ncHJvZi9oZXJ0ei5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWEwMWJhLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2hlcnR6LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jaWZuZGVmIGhlcnR6X2gKLSNkZWZpbmUgaGVydHpfaAotCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLQotI2RlZmluZQlIWl9XUk9ORyAwCQkvKiBpbXBvc3NpYmxlIGNsb2NrIGZyZXF1ZW5jeSAqLwotCi0vKgotICogRGlzY292ZXIgdGhlIHRpY2sgZnJlcXVlbmN5IG9mIHRoZSBtYWNoaW5lIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLAotICogd2UgcmV0dXJuIEhaX1dST05HLCBhbiBpbXBvc3NpYmxlIHNhbXBsaW5nIGZyZXF1ZW5jeS4KLSAqLwotCi0vKiBGSVhNRTogQ2hlY2tpbmcgZm9yIE1BQ0ggaGVyZSBtYWtlcyBubyBzZW5zZSB3aGVuIGZvciBhIGNyb3NzCi0gICBncHJvZi4gICovCi0jaWZkZWYgTUFDSAotI2luY2x1ZGUgPG1hY2hpbmUvbWFjaF9wYXJhbS5oPgotI2RlZmluZSBoZXJ0eigpIChIWikKLSNlbHNlCi1leHRlcm4gaW50IGhlcnR6IFBBUkFNUyAoKHZvaWQpKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogaGVydHpfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2YvaGlzdC5jIGIvZ3Byb2YvaGlzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RiYmJiLi4wMDAwMDAwCi0tLSBhL2dwcm9mL2hpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDU5NiArMCwwIEBACi0vKgotICogSGlzdG9ncmFtIHJlbGF0ZWQgb3BlcmF0aW9ucy4KLSAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImdtb25faW8uaCIKLSNpbmNsdWRlICJnbW9uX291dC5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLSNpbmNsdWRlICJzeW1faWRzLmgiCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotI2RlZmluZSBVTklUU19UT19DT0RFIChvZmZzZXRfdG9fY29kZSAvIHNpemVvZihVTklUKSkKLQotc3RhdGljIHZvaWQgc2NhbGVfYW5kX2FsaWduX2VudHJpZXMgUEFSQU1TICgodm9pZCkpOwotCi0vKiBkZWNsYXJhdGlvbnMgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIHRvIG91dHB1dCBibHVyYnM6ICovCi1leHRlcm4gdm9pZCBmbGF0X2JsdXJiIFBBUkFNUyAoKEZJTEUgKiBmcCkpOwotCi1iZmRfdm1hIHNfbG93cGM7CQkvKiBsb3dlc3QgYWRkcmVzcyBpbiAudGV4dCAqLwotYmZkX3ZtYSBzX2hpZ2hwYyA9IDA7CQkvKiBoaWdoZXN0IGFkZHJlc3MgaW4gLnRleHQgKi8KLWJmZF92bWEgbG93cGMsIGhpZ2hwYzsJCS8qIHNhbWUsIGJ1dCBleHByZXNzZWQgaW4gVU5JVHMgKi8KLWludCBoaXN0X251bV9iaW5zID0gMDsJCS8qIG51bWJlciBvZiBoaXN0b2dyYW0gc2FtcGxlcyAqLwotaW50ICpoaXN0X3NhbXBsZSA9IDA7CQkvKiBoaXN0b2dyYW0gc2FtcGxlcyAoc2hvcnRzIGluIHRoZSBmaWxlISkgKi8KLWRvdWJsZSBoaXN0X3NjYWxlOwotY2hhciBoaXN0X2RpbWVuc2lvbltzaXplb2YgKCgoc3RydWN0IGdtb25faGlzdF9oZHIgKikgMCktPmRpbWVuKSArIDFdID0KLSAgInNlY29uZHMiOwotY2hhciBoaXN0X2RpbWVuc2lvbl9hYmJyZXYgPSAncyc7Ci0KLXN0YXRpYyBkb3VibGUgYWNjdW1fdGltZTsJLyogYWNjdW11bGF0ZWQgdGltZSBzbyBmYXIgZm9yIHByaW50X2xpbmUoKSAqLwotc3RhdGljIGRvdWJsZSB0b3RhbF90aW1lOwkvKiB0b3RhbCB0aW1lIGZvciBhbGwgcm91dGluZXMgKi8KLS8qCi0gKiBUYWJsZSBvZiBTSSBwcmVmaXhlcyBmb3IgcG93ZXJzIG9mIDEwICh1c2VkIHRvIGF1dG9tYXRpY2FsbHkKLSAqIHNjYWxlIHNvbWUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZmxhdCBwcm9maWxlKS4KLSAqLwotY29uc3Qgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHByZWZpeDsKLSAgICBkb3VibGUgc2NhbGU7Ci0gIH0KLVNJdGFiW10gPQotewotICB7Ci0gICAgJ1QnLCAxZS0xMgotICB9Ci0gICwJCQkJLyogdGVyYSAqLwotICB7Ci0gICAgJ0cnLCAxZS0wOQotICB9Ci0gICwJCQkJLyogZ2lnYSAqLwotICB7Ci0gICAgJ00nLCAxZS0wNgotICB9Ci0gICwJCQkJLyogbWVnYSAqLwotICB7Ci0gICAgJ0snLCAxZS0wMwotICB9Ci0gICwJCQkJLyoga2lsbyAqLwotICB7Ci0gICAgJyAnLCAxZS0wMAotICB9Ci0gICwKLSAgewotICAgICdtJywgMWUrMDMKLSAgfQotICAsCQkJCS8qIG1pbGxpICovCi0gIHsKLSAgICAndScsIDFlKzA2Ci0gIH0KLSAgLAkJCQkvKiBtaWNybyAqLwotICB7Ci0gICAgJ24nLCAxZSswOQotICB9Ci0gICwJCQkJLyogbmFubyAqLwotICB7Ci0gICAgJ3AnLCAxZSsxMgotICB9Ci0gICwJCQkJLyogcGljbyAqLwotICB7Ci0gICAgJ2YnLCAxZSsxNQotICB9Ci0gICwJCQkJLyogZmVtdG8gKi8KLSAgewotICAgICdhJywgMWUrMTgKLSAgfQotICAsCQkJCS8qIGF0byAqLwotfTsKLQotLyoKLSAqIFJlYWQgdGhlIGhpc3RvZ3JhbSBmcm9tIGZpbGUgSUZQLiAgRklMRU5BTUUgaXMgdGhlIG5hbWUgb2YgSUZQIGFuZAotICogaXMgcHJvdmlkZWQgZm9yIGZvcm1hdHRpbmcgZXJyb3IgbWVzc2FnZXMgb25seS4KLSAqLwotdm9pZAotREVGVU4gKGhpc3RfcmVhZF9yZWMsIChpZnAsIGZpbGVuYW1lKSwgRklMRSAqIGlmcCBBTkQgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gIHN0cnVjdCBnbW9uX2hpc3RfaGRyIGhkcjsKLSAgYmZkX3ZtYSBuX2xvd3BjLCBuX2hpZ2hwYzsKLSAgaW50IGksIG5jbnQsIHByb2ZyYXRlOwotICBVTklUIGNvdW50OwotCi0gIGlmIChmcmVhZCAoJmhkciwgc2l6ZW9mIChoZHIpLCAxLCBpZnApICE9IDEpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogJXM6IHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGVcbiIpLAotCSAgICAgICB3aG9hbWksIGZpbGVuYW1lKTsKLSAgICAgIGRvbmUgKDEpOwotICAgIH0KLQotICBuX2xvd3BjID0gKGJmZF92bWEpIGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLmxvd19wYyk7Ci0gIG5faGlnaHBjID0gKGJmZF92bWEpIGdldF92bWEgKGNvcmVfYmZkLCAoYmZkX2J5dGUgKikgaGRyLmhpZ2hfcGMpOwotICBuY250ID0gYmZkX2dldF8zMiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSBoZHIuaGlzdF9zaXplKTsKLSAgcHJvZnJhdGUgPSBiZmRfZ2V0XzMyIChjb3JlX2JmZCwgKGJmZF9ieXRlICopIGhkci5wcm9mX3JhdGUpOwotICBzdHJuY3B5IChoaXN0X2RpbWVuc2lvbiwgaGRyLmRpbWVuLCBzaXplb2YgKGhkci5kaW1lbikpOwotICBoaXN0X2RpbWVuc2lvbltzaXplb2YgKGhkci5kaW1lbildID0gJ1wwJzsKLSAgaGlzdF9kaW1lbnNpb25fYWJicmV2ID0gaGRyLmRpbWVuX2FiYnJldjsKLQotICBpZiAoIXNfaGlnaHBjKQotICAgIHsKLQotICAgICAgLyogdGhpcyBpcyB0aGUgZmlyc3QgaGlzdG9ncmFtIHJlY29yZDogKi8KLQotICAgICAgc19sb3dwYyA9IG5fbG93cGM7Ci0gICAgICBzX2hpZ2hwYyA9IG5faGlnaHBjOwotICAgICAgbG93cGMgPSAoYmZkX3ZtYSkgbl9sb3dwYyAvIHNpemVvZiAoVU5JVCk7Ci0gICAgICBoaWdocGMgPSAoYmZkX3ZtYSkgbl9oaWdocGMgLyBzaXplb2YgKFVOSVQpOwotICAgICAgaGlzdF9udW1fYmlucyA9IG5jbnQ7Ci0gICAgICBoeiA9IHByb2ZyYXRlOwotICAgIH0KLQotICBEQkcgKFNBTVBMRURFQlVHLAotICAgICAgIHByaW50ZiAoIltoaXN0X3JlYWRfcmVjXSBuX2xvd3BjIDB4JWx4IG5faGlnaHBjIDB4JWx4IG5jbnQgJWRcbiIsCi0JICAgICAgIG5fbG93cGMsIG5faGlnaHBjLCBuY250KTsKLSAgICAgICBwcmludGYgKCJbaGlzdF9yZWFkX3JlY10gc19sb3dwYyAweCVseCBzX2hpZ2hwYyAweCVseCBuc2FtcGxlcyAlZFxuIiwKLQkgICAgICAgc19sb3dwYywgc19oaWdocGMsIGhpc3RfbnVtX2JpbnMpOwotICAgICAgIHByaW50ZiAoIltoaXN0X3JlYWRfcmVjXSAgIGxvd3BjIDB4JWx4ICAgaGlnaHBjIDB4JWx4XG4iLAotCSAgICAgICBsb3dwYywgaGlnaHBjKSk7Ci0KLSAgaWYgKG5fbG93cGMgIT0gc19sb3dwYyB8fCBuX2hpZ2hwYyAhPSBzX2hpZ2hwYwotICAgICAgfHwgbmNudCAhPSBoaXN0X251bV9iaW5zIHx8IGh6ICE9IHByb2ZyYXRlKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGAlcycgaXMgaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iKSwKLQkgICAgICAgd2hvYW1pLCBmaWxlbmFtZSk7Ci0gICAgICBkb25lICgxKTsKLSAgICB9Ci0KLSAgaWYgKCFoaXN0X3NhbXBsZSkKLSAgICB7Ci0gICAgICBoaXN0X3NhbXBsZSA9IChpbnQgKikgeG1hbGxvYyAoaGlzdF9udW1fYmlucyAqIHNpemVvZiAoaGlzdF9zYW1wbGVbMF0pKTsKLSAgICAgIG1lbXNldCAoaGlzdF9zYW1wbGUsIDAsIGhpc3RfbnVtX2JpbnMgKiBzaXplb2YgKGhpc3Rfc2FtcGxlWzBdKSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgaWYgKGZyZWFkICgmY291bnRbMF0sIHNpemVvZiAoY291bnQpLCAxLCBpZnApICE9IDEpCi0JewotCSAgZnByaW50ZiAoc3RkZXJyLAotCQkgICBfKCIlczogJXM6IHVuZXhwZWN0ZWQgRU9GIGFmdGVyIHJlYWRpbmcgJWQgb2YgJWQgc2FtcGxlc1xuIiksCi0JCSAgIHdob2FtaSwgZmlsZW5hbWUsIGksIGhpc3RfbnVtX2JpbnMpOwotCSAgZG9uZSAoMSk7Ci0JfQotICAgICAgaGlzdF9zYW1wbGVbaV0gKz0gYmZkX2dldF8xNiAoY29yZV9iZmQsIChiZmRfYnl0ZSAqKSAmIGNvdW50WzBdKTsKLSAgICB9Ci19Ci0KLQotLyoKLSAqIFdyaXRlIGV4ZWN1dGlvbiBoaXN0b2dyYW0gdG8gZmlsZSBPRlAuICBGSUxFTkFNRSBpcyB0aGUgbmFtZQotICogb2YgT0ZQIGFuZCBpcyBwcm92aWRlZCBmb3IgZm9ybWF0dGluZyBlcnJvci1tZXNzYWdlcyBvbmx5LgotICovCi12b2lkCi1ERUZVTiAoaGlzdF93cml0ZV9oaXN0LCAob2ZwLCBmaWxlbmFtZSksIEZJTEUgKiBvZnAgQU5EIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICBzdHJ1Y3QgZ21vbl9oaXN0X2hkciBoZHI7Ci0gIHVuc2lnbmVkIGNoYXIgdGFnOwotICBVTklUIGNvdW50OwotICBpbnQgaTsKLQotICAvKiB3cml0ZSBoZWFkZXI6ICovCi0KLSAgdGFnID0gR01PTl9UQUdfVElNRV9ISVNUOwotICBwdXRfdm1hIChjb3JlX2JmZCwgc19sb3dwYywgKGJmZF9ieXRlICopIGhkci5sb3dfcGMpOwotICBwdXRfdm1hIChjb3JlX2JmZCwgc19oaWdocGMsIChiZmRfYnl0ZSAqKSBoZHIuaGlnaF9wYyk7Ci0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoaXN0X251bV9iaW5zLCAoYmZkX2J5dGUgKikgaGRyLmhpc3Rfc2l6ZSk7Ci0gIGJmZF9wdXRfMzIgKGNvcmVfYmZkLCBoeiwgKGJmZF9ieXRlICopIGhkci5wcm9mX3JhdGUpOwotICBzdHJuY3B5IChoZHIuZGltZW4sIGhpc3RfZGltZW5zaW9uLCBzaXplb2YgKGhkci5kaW1lbikpOwotICBoZHIuZGltZW5fYWJicmV2ID0gaGlzdF9kaW1lbnNpb25fYWJicmV2OwotCi0gIGlmIChmd3JpdGUgKCZ0YWcsIHNpemVvZiAodGFnKSwgMSwgb2ZwKSAhPSAxCi0gICAgICB8fCBmd3JpdGUgKCZoZHIsIHNpemVvZiAoaGRyKSwgMSwgb2ZwKSAhPSAxKQotICAgIHsKLSAgICAgIHBlcnJvciAoZmlsZW5hbWUpOwotICAgICAgZG9uZSAoMSk7Ci0gICAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBoaXN0X251bV9iaW5zOyArK2kpCi0gICAgewotICAgICAgYmZkX3B1dF8xNiAoY29yZV9iZmQsIGhpc3Rfc2FtcGxlW2ldLCAoYmZkX2J5dGUgKikgJiBjb3VudFswXSk7Ci0gICAgICBpZiAoZndyaXRlICgmY291bnRbMF0sIHNpemVvZiAoY291bnQpLCAxLCBvZnApICE9IDEpCi0JewotCSAgcGVycm9yIChmaWxlbmFtZSk7Ci0JICBkb25lICgxKTsKLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBDYWxjdWxhdGUgc2NhbGVkIGVudHJ5IHBvaW50IGFkZHJlc3NlcyAodG8gc2F2ZSB0aW1lIGluCi0gKiBoaXN0X2Fzc2lnbl9zYW1wbGVzKSwgYW5kLCBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgaGF2ZSBwcm9jZWR1cmUKLSAqIGVudHJ5IG1hc2tzIGF0IHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLCBwb3NzaWJseSBwdXNoIHRoZSBzY2FsZWQKLSAqIGVudHJ5IHBvaW50cyBvdmVyIHRoZSBwcm9jZWR1cmUgZW50cnkgbWFzaywgaWYgaXQgdHVybnMgb3V0IHRoYXQKLSAqIHRoZSBlbnRyeSBwb2ludCBpcyBpbiBvbmUgYmluIGFuZCB0aGUgY29kZSBmb3IgYSByb3V0aW5lIGlzIGluIHRoZQotICogbmV4dCBiaW4uCi0gKi8KLXN0YXRpYyB2b2lkCi1zY2FsZV9hbmRfYWxpZ25fZW50cmllcyAoKQotewotICBTeW0gKnN5bTsKLSAgYmZkX3ZtYSBiaW5fb2ZfZW50cnk7Ci0gIGJmZF92bWEgYmluX29mX2NvZGU7Ci0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyBzeW0rKykKLSAgICB7Ci0gICAgICBzeW0tPmhpc3Quc2NhbGVkX2FkZHIgPSBzeW0tPmFkZHIgLyBzaXplb2YgKFVOSVQpOwotICAgICAgYmluX29mX2VudHJ5ID0gKHN5bS0+aGlzdC5zY2FsZWRfYWRkciAtIGxvd3BjKSAvIGhpc3Rfc2NhbGU7Ci0gICAgICBiaW5fb2ZfY29kZSA9IChzeW0tPmhpc3Quc2NhbGVkX2FkZHIgKyBVTklUU19UT19DT0RFIC0gbG93cGMpIC8gaGlzdF9zY2FsZTsKLSAgICAgIGlmIChiaW5fb2ZfZW50cnkgPCBiaW5fb2ZfY29kZSkKLQl7Ci0JICBEQkcgKFNBTVBMRURFQlVHLAotCSAgICAgICBwcmludGYgKCJbc2NhbGVfYW5kX2FsaWduX2VudHJpZXNdIHB1c2hpbmcgMHglbHggdG8gMHglbHhcbiIsCi0JCSAgICAgICBzeW0tPmhpc3Quc2NhbGVkX2FkZHIsCi0JCSAgICAgICBzeW0tPmhpc3Quc2NhbGVkX2FkZHIgKyBVTklUU19UT19DT0RFKSk7Ci0JICBzeW0tPmhpc3Quc2NhbGVkX2FkZHIgKz0gVU5JVFNfVE9fQ09ERTsKLQl9Ci0gICAgfQotfQotCi0KLS8qCi0gKiBBc3NpZ24gc2FtcGxlcyB0byB0aGUgc3ltYm9sIHRvIHdoaWNoIHRoZXkgYmVsb25nLgotICoKLSAqIEhpc3RvZ3JhbSBiaW4gSSBjb3ZlcnMgc29tZSBhZGRyZXNzIHJhbmdlIFtCSU5fTE9XUEMsQklOX0hJR0hfUEMpCi0gKiB3aGljaCBtYXkgb3ZlcmxhcCBvbmUgbW9yZSBzeW1ib2wgYWRkcmVzcyByYW5nZXMuICBJZiBhIHN5bWJvbAotICogb3ZlcmxhcHMgd2l0aCB0aGUgYmluJ3MgYWRkcmVzcyByYW5nZSBieSBPIHBlcmNlbnQsIHRoZW4gTyBwZXJjZW50Ci0gKiBvZiB0aGUgYmluJ3MgY291bnQgaXMgY3JlZGl0ZWQgdG8gdGhhdCBzeW1ib2wuCi0gKgotICogVGhlcmUgYXJlIHRocmVlIGNhc2VzIGFzIHRvIHdoZXJlIEJJTl9MT1dfUEMgYW5kIEJJTl9ISUdIX1BDIGNhbiBiZQotICogd2l0aCByZXNwZWN0IHRvIHRoZSBzeW1ib2wncyBhZGRyZXNzIHJhbmdlIFtTWU1fTE9XX1BDLAotICogU1lNX0hJR0hfUEMpIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZGlhZ3JhbS4gIE9WRVJMQVAgY29tcHV0ZXMKLSAqIHRoZSBkaXN0YW5jZSAoaW4gVU5JVHMpIGJldHdlZW4gdGhlIGFycm93cywgdGhlIGZyYWN0aW9uIG9mIHRoZQotICogc2FtcGxlIHRoYXQgaXMgdG8gYmUgY3JlZGl0ZWQgdG8gdGhlIHN5bWJvbCB3aGljaCBzdGFydHMgYXQKLSAqIFNZTV9MT1dfUEMuCi0gKgotICogICAgICAgIHN5bV9sb3dfcGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bV9oaWdoX3BjCi0gKiAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAgICAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ci0gKgotICogICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwotICogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogICAgICAgIHwgIC0+fCAgICB8PC0gICAgICAgICAtPnwgICAgICAgICB8PC0gICAgICAgICAtPnwgICAgfDwtICB8Ci0gKiAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgIHwKLSAqICAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICArLS0tLS0tLS0tKwotICoKLSAqICAgICAgICBeICAgICAgICAgXiAgICAgICAgICAgICBeICAgICAgICAgXiAgICAgICAgICAgICBeICAgICAgICAgXgotICogICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICB8Ci0gKiAgIGJpbl9sb3dfcGMgYmluX2hpZ2hfcGMgIGJpbl9sb3dfcGMgYmluX2hpZ2hfcGMgIGJpbl9sb3dfcGMgYmluX2hpZ2hfcGMKLSAqCi0gKiBGb3IgdGhlIFZBWCB3ZSBhc3NlcnQgdGhhdCBzYW1wbGVzIHdpbGwgbmV2ZXIgZmFsbCBpbiB0aGUgZmlyc3QgdHdvCi0gKiBieXRlcyBvZiBhbnkgcm91dGluZSwgc2luY2UgdGhhdCBpcyB0aGUgZW50cnkgbWFzaywgdGh1cyB3ZSBjYWxsCi0gKiBzY2FsZV9hbmRfYWxpZ25fZW50cmllcygpIHRvIGFkanVzdCB0aGUgZW50cnkgcG9pbnRzIGlmIHRoZSBlbnRyeQotICogbWFzayBmYWxscyBpbiBvbmUgYmluIGJ1dCB0aGUgY29kZSBmb3IgdGhlIHJvdXRpbmUgZG9lc24ndCBzdGFydAotICogdW50aWwgdGhlIG5leHQgYmluLiAgSW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYWxpZ25tZW50IG9mIHJvdXRpbmUKLSAqIGFkZHJlc3NlcywgdGhpcyBzaG91bGQgYWxsb3cgdXMgdG8gaGF2ZSBvbmx5IG9uZSBzYW1wbGUgZm9yIGV2ZXJ5Ci0gKiBmb3VyIGJ5dGVzIG9mIHRleHQgc3BhY2UgYW5kIG5ldmVyIGhhdmUgYW55IG92ZXJsYXAgKHRoZSB0d28gZW5kCi0gKiBjYXNlcywgYWJvdmUpLgotICovCi12b2lkCi1ERUZVTl9WT0lEIChoaXN0X2Fzc2lnbl9zYW1wbGVzKQotewotICBiZmRfdm1hIGJpbl9sb3dfcGMsIGJpbl9oaWdoX3BjOwotICBiZmRfdm1hIHN5bV9sb3dfcGMsIHN5bV9oaWdoX3BjOwotICBiZmRfdm1hIG92ZXJsYXAsIGFkZHI7Ci0gIGludCBiaW5fY291bnQsIGk7Ci0gIHVuc2lnbmVkIGludCBqOwotICBkb3VibGUgdGltZSwgY3JlZGl0OwotCi0gIC8qIHJlYWQgc2FtcGxlcyBhbmQgYXNzaWduIHRvIHN5bWJvbHM6ICovCi0gIGhpc3Rfc2NhbGUgPSBoaWdocGMgLSBsb3dwYzsKLSAgaGlzdF9zY2FsZSAvPSBoaXN0X251bV9iaW5zOwotICBzY2FsZV9hbmRfYWxpZ25fZW50cmllcyAoKTsKLQotICAvKiBpdGVyYXRlIG92ZXIgYWxsIHNhbXBsZSBiaW5zOiAqLwotCi0gIGZvciAoaSA9IDAsIGogPSAxOyBpIDwgaGlzdF9udW1fYmluczsgKytpKQotICAgIHsKLSAgICAgIGJpbl9jb3VudCA9IGhpc3Rfc2FtcGxlW2ldOwotICAgICAgaWYgKCFiaW5fY291bnQpCi0JewotCSAgY29udGludWU7Ci0JfQotICAgICAgYmluX2xvd19wYyA9IGxvd3BjICsgKGJmZF92bWEpIChoaXN0X3NjYWxlICogaSk7Ci0gICAgICBiaW5faGlnaF9wYyA9IGxvd3BjICsgKGJmZF92bWEpIChoaXN0X3NjYWxlICogKGkgKyAxKSk7Ci0gICAgICB0aW1lID0gYmluX2NvdW50OwotICAgICAgREJHIChTQU1QTEVERUJVRywKLQkgICBwcmludGYgKAotICAgICAgIlthc3NpZ25fc2FtcGxlc10gYmluX2xvd19wYz0weCVseCwgYmluX2hpZ2hfcGM9MHglbHgsIGJpbl9jb3VudD0lZFxuIiwKLQkJICAgIHNpemVvZiAoVU5JVCkgKiBiaW5fbG93X3BjLCBzaXplb2YgKFVOSVQpICogYmluX2hpZ2hfcGMsCi0JCSAgICBiaW5fY291bnQpKTsKLSAgICAgIHRvdGFsX3RpbWUgKz0gdGltZTsKLQotICAgICAgLyogY3JlZGl0IGFsbCBzeW1ib2xzIHRoYXQgYXJlIGNvdmVyZWQgYnkgYmluIEk6ICovCi0KLSAgICAgIGZvciAoaiA9IGogLSAxOyBqIDwgc3ltdGFiLmxlbjsgKytqKQotCXsKLQkgIHN5bV9sb3dfcGMgPSBzeW10YWIuYmFzZVtqXS5oaXN0LnNjYWxlZF9hZGRyOwotCSAgc3ltX2hpZ2hfcGMgPSBzeW10YWIuYmFzZVtqICsgMV0uaGlzdC5zY2FsZWRfYWRkcjsKLQkgIC8qCi0JICAgKiBJZiBoaWdoIGVuZCBvZiBiaW4gaXMgYmVsb3cgZW50cnkgYWRkcmVzcywgZ28gZm9yIG5leHQKLQkgICAqIGJpbjoKLQkgICAqLwotCSAgaWYgKGJpbl9oaWdoX3BjIDwgc3ltX2xvd19wYykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICAvKgotCSAgICogSWYgbG93IGVuZCBvZiBiaW4gaXMgYWJvdmUgaGlnaCBlbmQgb2Ygc3ltYm9sLCBnbyBmb3IKLQkgICAqIG5leHQgc3ltYm9sLgotCSAgICovCi0JICBpZiAoYmluX2xvd19wYyA+PSBzeW1faGlnaF9wYykKLQkgICAgewotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JICBvdmVybGFwID0KLQkgICAgTUlOIChiaW5faGlnaF9wYywgc3ltX2hpZ2hfcGMpIC0gTUFYIChiaW5fbG93X3BjLCBzeW1fbG93X3BjKTsKLQkgIGlmIChvdmVybGFwID4gMCkKLQkgICAgewotCSAgICAgIERCRyAoU0FNUExFREVCVUcsCi0JCSAgIHByaW50ZiAoCi0JCQkgICAgIlthc3NpZ25fc2FtcGxlc10gWzB4JWx4LDB4JWx4KSAlcyBnZXRzICVmIHRpY2tzICVsZCBvdmVybGFwXG4iLAotCQkJICAgIHN5bXRhYi5iYXNlW2pdLmFkZHIsIHNpemVvZiAoVU5JVCkgKiBzeW1faGlnaF9wYywKLQkJCSAgICBzeW10YWIuYmFzZVtqXS5uYW1lLCBvdmVybGFwICogdGltZSAvIGhpc3Rfc2NhbGUsCi0JCQkgICAgb3ZlcmxhcCkpOwotCSAgICAgIGFkZHIgPSBzeW10YWIuYmFzZVtqXS5hZGRyOwotCSAgICAgIGNyZWRpdCA9IG92ZXJsYXAgKiB0aW1lIC8gaGlzdF9zY2FsZTsKLQkgICAgICAvKgotCSAgICAgICAqIENyZWRpdCBzeW1ib2wgaWYgaXQgYXBwZWFycyBpbiBJTkNMX0ZMQVQgb3IgdGhhdAotCSAgICAgICAqIHRhYmxlIGlzIGVtcHR5IGFuZCBpdCBkb2VzIG5vdCBhcHBlYXIgaXQgaW4KLQkgICAgICAgKiBFWENMX0ZMQVQuCi0JICAgICAgICovCi0JICAgICAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfRkxBVF0sIGFkZHIpCi0JCSAgfHwgKHN5bXNbSU5DTF9GTEFUXS5sZW4gPT0gMAotCQkgICAgICAmJiAhc3ltX2xvb2t1cCAoJnN5bXNbRVhDTF9GTEFUXSwgYWRkcikpKQotCQl7Ci0JCSAgc3ltdGFiLmJhc2Vbal0uaGlzdC50aW1lICs9IGNyZWRpdDsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIHRvdGFsX3RpbWUgLT0gY3JlZGl0OwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBEQkcgKFNBTVBMRURFQlVHLCBwcmludGYgKCJbYXNzaWduX3NhbXBsZXNdIHRvdGFsX3RpbWUgJWZcbiIsCi0JCQkgICAgdG90YWxfdGltZSkpOwotfQotCi0KLS8qCi0gKiBQcmludCBoZWFkZXIgZm9yIGZsYWcgaGlzdG9ncmFtIHByb2ZpbGU6Ci0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfaGVhZGVyLCAocHJlZml4KSwgY29uc3QgY2hhciBwcmVmaXgpCi17Ci0gIGNoYXIgdW5pdFs2NF07Ci0KLSAgc3ByaW50ZiAodW5pdCwgXygiJWMlYy9jYWxsIiksIHByZWZpeCwgaGlzdF9kaW1lbnNpb25fYWJicmV2KTsKLQotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludGYgKF8oIlxuZ3JhbnVsYXJpdHk6IGVhY2ggc2FtcGxlIGhpdCBjb3ZlcnMgJWxkIGJ5dGUocykiKSwKLQkgICAgICAobG9uZykgaGlzdF9zY2FsZSAqIHNpemVvZiAoVU5JVCkpOwotICAgICAgaWYgKHRvdGFsX3RpbWUgPiAwLjApCi0JewotCSAgcHJpbnRmIChfKCIgZm9yICUuMmYlJSBvZiAlLjJmICVzXG5cbiIpLAotCQkgIDEwMC4wIC8gdG90YWxfdGltZSwgdG90YWxfdGltZSAvIGh6LCBoaXN0X2RpbWVuc2lvbik7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiXG5FYWNoIHNhbXBsZSBjb3VudHMgYXMgJWcgJXMuXG4iKSwgMS4wIC8gaHosIGhpc3RfZGltZW5zaW9uKTsKLSAgICB9Ci0KLSAgaWYgKHRvdGFsX3RpbWUgPD0gMC4wKQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiIG5vIHRpbWUgYWNjdW11bGF0ZWRcblxuIikpOwotICAgICAgLyogdGhpcyBkb2Vzbid0IGh1cnQgc2luY2UgYWxsIHRoZSBudW1lcmF0b3JzIHdpbGwgYmUgemVybzogKi8KLSAgICAgIHRvdGFsX3RpbWUgPSAxLjA7Ci0gICAgfQotCi0gIHByaW50ZiAoIiU1LjVzICUxMC4xMHMgJTguOHMgJTguOHMgJTguOHMgJTguOHMgICUtOC44c1xuIiwKLQkgICIlICAiLCBfKCJjdW11bGF0aXZlIiksIF8oInNlbGYgICIpLCAiIiwgXygic2VsZiAgIiksIF8oInRvdGFsICIpLCAiIik7Ci0gIHByaW50ZiAoIiU1LjVzICU5LjlzICAlOC44cyAlOC44cyAlOC44cyAlOC44cyAgJS04LjhzXG4iLAotCSAgXygidGltZSIpLCBoaXN0X2RpbWVuc2lvbiwgaGlzdF9kaW1lbnNpb24sIF8oImNhbGxzIiksIHVuaXQsIHVuaXQsCi0JICBfKCJuYW1lIikpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1ERUZVTiAocHJpbnRfbGluZSwgKHN5bSwgc2NhbGUpLCBTeW0gKiBzeW0gQU5EIGRvdWJsZSBzY2FsZSkKLXsKLSAgaWYgKGlnbm9yZV96ZXJvcyAmJiBzeW0tPm5jYWxscyA9PSAwICYmIHN5bS0+aGlzdC50aW1lID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBhY2N1bV90aW1lICs9IHN5bS0+aGlzdC50aW1lOwotICBpZiAoYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBwcmludGYgKCIlNS4xZiAlMTAuMmYgJTguMmYiLAotCSAgICAgIHRvdGFsX3RpbWUgPiAwLjAgPyAxMDAgKiBzeW0tPmhpc3QudGltZSAvIHRvdGFsX3RpbWUgOiAwLjAsCi0JICAgICAgYWNjdW1fdGltZSAvIGh6LCBzeW0tPmhpc3QudGltZSAvIGh6KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwcmludGYgKCIlNi4yZiAlOS4yZiAlOC4yZiIsCi0JICAgICAgdG90YWxfdGltZSA+IDAuMCA/IDEwMCAqIHN5bS0+aGlzdC50aW1lIC8gdG90YWxfdGltZSA6IDAuMCwKLQkgICAgICBhY2N1bV90aW1lIC8gaHosIHN5bS0+aGlzdC50aW1lIC8gaHopOwotICAgIH0KLSAgaWYgKHN5bS0+bmNhbGxzICE9IDApCi0gICAgewotICAgICAgcHJpbnRmICgiICU4bHUgJTguMmYgJTguMmYgICIsCi0JICAgICAgc3ltLT5uY2FsbHMsIHNjYWxlICogc3ltLT5oaXN0LnRpbWUgLyBoeiAvIHN5bS0+bmNhbGxzLAotCSAgc2NhbGUgKiAoc3ltLT5oaXN0LnRpbWUgKyBzeW0tPmNnLmNoaWxkX3RpbWUpIC8gaHogLyBzeW0tPm5jYWxscyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiICU4LjhzICU4LjhzICU4LjhzICAiLCAiIiwgIiIsICIiKTsKLSAgICB9Ci0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIHByaW50X25hbWUgKHN5bSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfbmFtZV9vbmx5IChzeW0pOwotICAgIH0KLSAgcHJpbnRmICgiXG4iKTsKLX0KLQotCi0vKgotICogQ29tcGFyZSBMUCBhbmQgUlAuICBUaGUgcHJpbWFyeSBjb21wYXJpc29uIGtleSBpcyBleGVjdXRpb24gdGltZSwKLSAqIHRoZSBzZWNvbmRhcnkgaXMgbnVtYmVyIG9mIGludm9jYXRpb24sIGFuZCB0aGUgdGVydGlhcnkgaXMgdGhlCi0gKiBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZSBmdW5jdGlvbiBuYW1lcy4KLSAqLwotc3RhdGljIGludAotREVGVU4gKGNtcF90aW1lLCAobHAsIHJwKSwgY29uc3QgUFRSIGxwIEFORCBjb25zdCBQVFIgcnApCi17Ci0gIGNvbnN0IFN5bSAqbGVmdCA9ICooY29uc3QgU3ltICoqKSBscDsKLSAgY29uc3QgU3ltICpyaWdodCA9ICooY29uc3QgU3ltICoqKSBycDsKLSAgZG91YmxlIHRpbWVfZGlmZjsKLQotICB0aW1lX2RpZmYgPSByaWdodC0+aGlzdC50aW1lIC0gbGVmdC0+aGlzdC50aW1lOwotICBpZiAodGltZV9kaWZmID4gMC4wKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKHRpbWVfZGlmZiA8IDAuMCkKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChyaWdodC0+bmNhbGxzID4gbGVmdC0+bmNhbGxzKQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgaWYgKHJpZ2h0LT5uY2FsbHMgPCBsZWZ0LT5uY2FsbHMpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gc3RyY21wIChsZWZ0LT5uYW1lLCByaWdodC0+bmFtZSk7Ci19Ci0KLQotLyoKLSAqIFByaW50IHRoZSBmbGF0IGhpc3RvZ3JhbSBwcm9maWxlLgotICovCi12b2lkCi1ERUZVTl9WT0lEIChoaXN0X3ByaW50KQotewotICBTeW0gKip0aW1lX3NvcnRlZF9zeW1zLCAqdG9wX2RvZywgKnN5bTsKLSAgdW5zaWduZWQgaW50IGluZGV4OwotICBpbnQgbG9nX3NjYWxlOwotICBkb3VibGUgdG9wX3RpbWUsIHRpbWU7Ci0gIGJmZF92bWEgYWRkcjsKLQotICBpZiAoZmlyc3Rfb3V0cHV0KQotICAgIHsKLSAgICAgIGZpcnN0X291dHB1dCA9IEZBTFNFOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlxmXG4iKTsKLSAgICB9Ci0KLSAgYWNjdW1fdGltZSA9IDAuMDsKLSAgaWYgKGJzZF9zdHlsZV9vdXRwdXQpCi0gICAgewotICAgICAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucykKLQl7Ci0JICBwcmludGYgKF8oIlxuXG5cbmZsYXQgcHJvZmlsZTpcbiIpKTsKLQkgIGZsYXRfYmx1cmIgKHN0ZG91dCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoXygiRmxhdCBwcm9maWxlOlxuIikpOwotICAgIH0KLSAgLyoKLSAgICogU29ydCB0aGUgc3ltYm9sIHRhYmxlIGJ5IHRpbWUgKGNhbGwtY291bnQgYW5kIG5hbWUgYXMgc2Vjb25kYXJ5Ci0gICAqIGFuZCB0ZXJ0aWFyeSBrZXlzKToKLSAgICovCi0gIHRpbWVfc29ydGVkX3N5bXMgPSAoU3ltICoqKSB4bWFsbG9jIChzeW10YWIubGVuICogc2l6ZW9mIChTeW0gKikpOwotICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzeW10YWIubGVuOyArK2luZGV4KQotICAgIHsKLSAgICAgIHRpbWVfc29ydGVkX3N5bXNbaW5kZXhdID0gJnN5bXRhYi5iYXNlW2luZGV4XTsKLSAgICB9Ci0gIHFzb3J0ICh0aW1lX3NvcnRlZF9zeW1zLCBzeW10YWIubGVuLCBzaXplb2YgKFN5bSAqKSwgY21wX3RpbWUpOwotCi0gIGlmIChic2Rfc3R5bGVfb3V0cHV0KQotICAgIHsKLSAgICAgIGxvZ19zY2FsZSA9IDU7CQkvKiBtaWxsaS1zZWNvbmRzIGlzIEJTRC1kZWZhdWx0ICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIFNlYXJjaCBmb3Igc3ltYm9sIHdpdGggaGlnaGVzdCBwZXItY2FsbCBleGVjdXRpb24gdGltZSBhbmQKLSAgICAgICAqIHNjYWxlIGFjY29yZGluZ2x5OgotICAgICAgICovCi0gICAgICBsb2dfc2NhbGUgPSAwOwotICAgICAgdG9wX2RvZyA9IDA7Ci0gICAgICB0b3BfdGltZSA9IDAuMDsKLSAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHN5bXRhYi5sZW47ICsraW5kZXgpCi0JewotCSAgc3ltID0gdGltZV9zb3J0ZWRfc3ltc1tpbmRleF07Ci0JICBpZiAoc3ltLT5uY2FsbHMgIT0gMCkKLQkgICAgewotCSAgICAgIHRpbWUgPSAoc3ltLT5oaXN0LnRpbWUgKyBzeW0tPmNnLmNoaWxkX3RpbWUpIC8gc3ltLT5uY2FsbHM7Ci0JICAgICAgaWYgKHRpbWUgPiB0b3BfdGltZSkKLQkJewotCQkgIHRvcF9kb2cgPSBzeW07Ci0JCSAgdG9wX3RpbWUgPSB0aW1lOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAodG9wX2RvZyAmJiB0b3BfZG9nLT5uY2FsbHMgIT0gMCAmJiB0b3BfdGltZSA+IDAuMCkKLQl7Ci0JICB0b3BfdGltZSAvPSBoejsKLQkgIHdoaWxlIChTSXRhYltsb2dfc2NhbGVdLnNjYWxlICogdG9wX3RpbWUgPCAxMDAwLjAKLQkJICYmICgoc2l6ZV90KSBsb2dfc2NhbGUKLQkJICAgICA8IHNpemVvZiAoU0l0YWIpIC8gc2l6ZW9mIChTSXRhYlswXSkgLSAxKSkKLQkgICAgewotCSAgICAgICsrbG9nX3NjYWxlOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKgotICAgKiBGb3Igbm93LCB0aGUgZGltZW5zaW9uIGlzIGFsd2F5cyBzZWNvbmRzLiAgSW4gdGhlIGZ1dHVyZSwgd2UKLSAgICogbWF5IGFsc28gd2FudCB0byBzdXBwb3J0IG90aGVyIChwc2V1ZG8tKWRpbWVuc2lvbnMgKHN1Y2ggYXMKLSAgICogSS1jYWNoZSBtaXNzZXMgZXRjLikuCi0gICAqLwotICBwcmludF9oZWFkZXIgKFNJdGFiW2xvZ19zY2FsZV0ucHJlZml4KTsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc3ltdGFiLmxlbjsgKytpbmRleCkKLSAgICB7Ci0gICAgICBhZGRyID0gdGltZV9zb3J0ZWRfc3ltc1tpbmRleF0tPmFkZHI7Ci0gICAgICAvKgotICAgICAgICogUHJpbnQgc3ltYm9sIGlmIGl0cyBpbiBJTkNMX0ZMQVQgdGFibGUgb3IgdGhhdCB0YWJsZQotICAgICAgICogaXMgZW1wdHkgYW5kIHRoZSBzeW1ib2wgaXMgbm90IGluIEVYQ0xfRkxBVC4KLSAgICAgICAqLwotICAgICAgaWYgKHN5bV9sb29rdXAgKCZzeW1zW0lOQ0xfRkxBVF0sIGFkZHIpCi0JICB8fCAoc3ltc1tJTkNMX0ZMQVRdLmxlbiA9PSAwCi0JICAgICAgJiYgIXN5bV9sb29rdXAgKCZzeW1zW0VYQ0xfRkxBVF0sIGFkZHIpKSkKLQl7Ci0JICBwcmludF9saW5lICh0aW1lX3NvcnRlZF9zeW1zW2luZGV4XSwgU0l0YWJbbG9nX3NjYWxlXS5zY2FsZSk7Ci0JfQotICAgIH0KLSAgZnJlZSAodGltZV9zb3J0ZWRfc3ltcyk7Ci0KLSAgaWYgKHByaW50X2Rlc2NyaXB0aW9ucyAmJiAhYnNkX3N0eWxlX291dHB1dCkKLSAgICB7Ci0gICAgICBmbGF0X2JsdXJiIChzdGRvdXQpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2dwcm9mL2hpc3QuaCBiL2dwcm9mL2hpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2MmVmNy4uMDAwMDAwMAotLS0gYS9ncHJvZi9oaXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jaWZuZGVmIGhpc3RfaAotI2RlZmluZSBoaXN0X2gKLQotI2luY2x1ZGUgImJmZC5oIgotCi1leHRlcm4gYmZkX3ZtYSBzX2xvd3BjOwkJLyogbG93cGMgZnJvbSB0aGUgcHJvZmlsZSBmaWxlICovCi1leHRlcm4gYmZkX3ZtYSBzX2hpZ2hwYzsJLyogaGlnaHBjIGZyb20gdGhlIHByb2ZpbGUgZmlsZSAqLwotZXh0ZXJuIGJmZF92bWEgbG93cGMsIGhpZ2hwYzsJLyogcmFuZ2UgcHJvZmlsZWQsIGluIFVOSVQncyAqLwotZXh0ZXJuIGludCBoaXN0X251bV9iaW5zOwkvKiBudW1iZXIgb2YgaGlzdG9ncmFtIGJpbnMgKi8KLWV4dGVybiBpbnQgKmhpc3Rfc2FtcGxlOwkvKiBjb2RlIGhpc3RvZ3JhbSAqLwotLyoKLSAqIFNjYWxlIGZhY3RvciBjb252ZXJ0aW5nIHNhbXBsZXMgdG8gcGMgdmFsdWVzOiBlYWNoIHNhbXBsZSBjb3ZlcnMKLSAqIEhJU1RfU0NBTEUgYnl0ZXM6Ci0gKi8KLWV4dGVybiBkb3VibGUgaGlzdF9zY2FsZTsKLQotCi1leHRlcm4gdm9pZCBoaXN0X3JlYWRfcmVjIFBBUkFNUyAoKEZJTEUgKiBpZnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gdm9pZCBoaXN0X3dyaXRlX2hpc3QgUEFSQU1TICgoRklMRSAqIG9mcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpKTsKLWV4dGVybiB2b2lkIGhpc3RfYXNzaWduX3NhbXBsZXMgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgaGlzdF9wcmludCBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZiAvKiBoaXN0X2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL2kzODYuYyBiL2dwcm9mL2kzODYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhYWQxYy4uMDAwMDAwMAotLS0gYS9ncHJvZi9pMzg2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotCi1pbnQKLURFRlVOIChpMzg2X2lzY2FsbCwgKGlwKSwgdW5zaWduZWQgY2hhciAqaXApCi17Ci0gIGlmICgqaXAgPT0gMHhlOCkKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotdm9pZAotaTM4Nl9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgU3ltICpjaGlsZDsKLSAgYmZkX3ZtYSBkZXN0cGMsIGRlbHRhOwotCi0gIGlmIChjb3JlX3RleHRfc3BhY2UgPT0gMCkKLSAgICB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAocF9sb3dwYyA8IHNfbG93cGMpCi0gICAgewotICAgICAgcF9sb3dwYyA9IHNfbG93cGM7Ci0gICAgfQotICBpZiAocF9oaWdocGMgPiBzX2hpZ2hwYykKLSAgICB7Ci0gICAgICBwX2hpZ2hwYyA9IHNfaGlnaHBjOwotICAgIH0KLSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIltmaW5kY2FsbF0gJXM6IDB4JWx4IHRvIDB4JWx4XG4iLAotCQkJICBwYXJlbnQtPm5hbWUsIHBfbG93cGMsIHBfaGlnaHBjKSk7Ci0KLSAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIChwX2xvd3BjICsgZGVsdGEpOwotICAgICAgIGluc3RydWN0cCA8ICh1bnNpZ25lZCBjaGFyICopIChwX2hpZ2hwYyArIGRlbHRhKTsKLSAgICAgICBpbnN0cnVjdHAgKyspCi0gICAgewotICAgICAgaWYgKGkzODZfaXNjYWxsIChpbnN0cnVjdHApKQotCXsKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZGNhbGxdXHQweCV4OmNhbGwiLAotCQkgICAgICAgaW5zdHJ1Y3RwIC0gKHVuc2lnbmVkIGNoYXIgKikgZGVsdGEpKTsKLQkgIC8qCi0JICAgKiAgcmVndWxhciBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nCi0JICAgKiAgICBjaGVjayB0aGF0IHRoaXMgaXMgdGhlIGFkZHJlc3Mgb2YgCi0JICAgKiAgICBhIGZ1bmN0aW9uLgotCSAgICovCi0KLQkgIGRlc3RwYyA9ICgoYmZkX3ZtYSkgYmZkX2dldF8zMiAoY29yZV9iZmQsIGluc3RydWN0cCArIDEpCi0JCSAgICArIChiZmRfdm1hKSBpbnN0cnVjdHAgLSAoYmZkX3ZtYSkgZGVsdGEgKyA1KTsKLQkgIGlmIChkZXN0cGMgPj0gc19sb3dwYyAmJiBkZXN0cGMgPD0gc19oaWdocGMpCi0JICAgIHsKLQkgICAgICBjaGlsZCA9IHN5bV9sb29rdXAgKCZzeW10YWIsIGRlc3RwYyk7Ci0JICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLT5hZGRyID09IGRlc3RwYykKLQkJewotCQkgIC8qCi0JCSAgICogICAgICBhIGhpdAotCQkgICAqLwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiXHRkZXN0cGMgMHglbHggKCVzKVxuIiwgZGVzdHBjLCBjaGlsZC0+bmFtZSkpOwotCQkgIGFyY19hZGQgKHBhcmVudCwgY2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkJICBpbnN0cnVjdHAgKz0gNDsJLyogY2FsbCBpcyBhIDUgYnl0ZSBpbnN0cnVjdGlvbiAqLwotCQkgIGNvbnRpbnVlOwotCQl9Ci0JICAgIH0KLQkgIC8qCi0JICAgKiAgZWxzZToKLQkgICAqICAgIGl0IGxvb2tlZCBsaWtlIGEgY2FsbGYsIGJ1dCBpdDoKLQkgICAqICAgICAgYSkgd2Fzbid0IGFjdHVhbGx5IGEgY2FsbGYsIG9yCi0JICAgKiAgICAgIGIpIGRpZG4ndCBwb2ludCB0byBhIGtub3duIGZ1bmN0aW9uIGluIHRoZSBzeW10YWIsIG9yCi0JICAgKiAgICAgIGMpIHNvbWV0aGluZyBmdW5ueSBpcyBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9wby9NYWtlLWluIGIvZ3Byb2YvcG8vTWFrZS1pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1MmRiMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL2dwcm9mL3BvL1BPVEZJTEVTLmluIGIvZ3Byb2YvcG8vUE9URklMRVMuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTgxMTYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1hbHBoYS5jCi1iYXNpY19ibG9ja3MuYwotYmFzaWNfYmxvY2tzLmgKLWNhbGxfZ3JhcGguYwotY2FsbF9ncmFwaC5oCi1jZ19hcmNzLmMKLWNnX2FyY3MuaAotY2dfZGZuLmMKLWNnX2Rmbi5oCi1jZ19wcmludC5jCi1jZ19wcmludC5oCi1jb3JlZmlsZS5jCi1jb3JlZmlsZS5oCi1nbW9uLmgKLWdtb25faW8uYwotZ21vbl9pby5oCi1nbW9uX291dC5oCi1ncHJvZi5jCi1ncHJvZi5oCi1oZXJ0ei5jCi1oZXJ0ei5oCi1oaXN0LmMKLWhpc3QuaAotaTM4Ni5jCi1zZWFyY2hfbGlzdC5jCi1zZWFyY2hfbGlzdC5oCi1zb3VyY2UuYwotc291cmNlLmgKLXNwYXJjLmMKLXN5bV9pZHMuYwotc3ltX2lkcy5oCi1zeW10YWIuYwotc3ltdGFiLmgKLXRhaG9lLmMKLXV0aWxzLmMKLXV0aWxzLmgKLXZheC5jCmRpZmYgLS1naXQgYS9ncHJvZi9wby9ncHJvZi5wb3QgYi9ncHJvZi9wby9ncHJvZi5wb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YmY3ODcuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvcG8vZ3Byb2YucG90CisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLSMgU09NRSBERVNDUklQVElWRSBUSVRMRS4KLSMgQ29weXJpZ2h0IChDKSBZRUFSIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGSVJTVCBBVVRIT1IgPEVNQUlMQEFERFJFU1M+LCBZRUFSLgotIwotIywgZnV6enkKLW1zZ2lkICIiCi1tc2dzdHIgIiIKLSJQcm9qZWN0LUlkLVZlcnNpb246IFBBQ0tBR0UgVkVSU0lPTlxuIgotIlBPVC1DcmVhdGlvbi1EYXRlOiAxOTk4LTA2LTEyIDE5OjMzLTA0MDBcbiIKLSJQTy1SZXZpc2lvbi1EYXRlOiBZRUFSLU1PLURBIEhPOk1JK1pPTkVcbiIKLSJMYXN0LVRyYW5zbGF0b3I6IEZVTEwgTkFNRSA8RU1BSUxAQUREUkVTUz5cbiIKLSJMYW5ndWFnZS1UZWFtOiBMQU5HVUFHRSA8TExAbGkub3JnPlxuIgotIk1JTUUtVmVyc2lvbjogMS4wXG4iCi0iQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUNIQVJTRVRcbiIKLSJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBFTkNPRElOR1xuIgotCi0jOiBhbHBoYS5jOjg5Ci1tc2dpZCAiPGluZGlyZWN0IGNoaWxkPiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEwNgotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS5jOjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJbZmluZF9jYWxsXSAweCVseDoganNyJXMgPGluZGlyZWN0X2NoaWxkPlxuIgotbXNnc3RyICIiCi0KLSM6IGFscGhhLmM6MTM2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIltmaW5kX2NhbGxdIDB4JWx4OiBic3IiCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MTM0IGNhbGxfZ3JhcGguYzo3MCBoaXN0LmM6MTA1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiAlczogdW5leHBlY3RlZCBlbmQgb2YgZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjIxNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogd2FybmluZzogaWdub3JpbmcgYmFzaWMtYmxvY2sgZXhlYyBjb3VudHMgKHVzZSAtbCBvciAtLWxpbmUpXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MzIyIGJhc2ljX2Jsb2Nrcy5jOjMzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczolZDogKCVzOjB4JWx4KSAlZCBleGVjdXRpb25zXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6MzIzIGJhc2ljX2Jsb2Nrcy5jOjMzMQotbXNnaWQgIjx1bmtub3duPiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo1ODQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIlxuIgotIlRvcCAlZCBMaW5lczpcbiIKLSJcbiIKLSIgICAgIExpbmUgICAgICBDb3VudFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYwOAotbXNnaWQgIiIKLSJcbiIKLSJFeGVjdXRpb24gU3VtbWFyeTpcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MDkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTlsZCAgIEV4ZWN1dGFibGUgbGluZXMgaW4gdGhpcyBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogYmFzaWNfYmxvY2tzLmM6NjExCi0jLCBjLWZvcm1hdAotbXNnaWQgIiU5bGQgICBMaW5lcyBleGVjdXRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGJhc2ljX2Jsb2Nrcy5jOjYxMgotIywgYy1mb3JtYXQKLW1zZ2lkICIlOS4yZiAgIFBlcmNlbnQgb2YgdGhlIGZpbGUgZXhlY3V0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MTYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlxuIgotIiU5ZCAgIFRvdGFsIG51bWJlciBvZiBsaW5lIGV4ZWN1dGlvbnNcbiIKLW1zZ3N0ciAiIgotCi0jOiBiYXNpY19ibG9ja3MuYzo2MTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTkuMmYgICBBdmVyYWdlIGV4ZWN1dGlvbnMgcGVyIGxpbmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjYWxsX2dyYXBoLmM6NDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiW2NnX3RhbGx5XSBhcmMgZnJvbSAlcyB0byAlcyB0cmF2ZXJzZWQgJWQgdGltZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjM5Ci1tc2dpZCAiIgotIlx0XHQgICAgIENhbGwgZ3JhcGggKGV4cGxhbmF0aW9uIGZvbGxvd3MpXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo0MwotbXNnaWQgIiIKLSJcdFx0XHRDYWxsIGdyYXBoXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo0NiBoaXN0LmM6MzgxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJncmFudWxhcml0eTogZWFjaCBzYW1wbGUgaGl0IGNvdmVycyAlbGQgYnl0ZShzKSIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjUwCi1tc2dpZCAiIgotIiBmb3IgJS4yZiUlIG9mICUuMmYgc2Vjb25kc1xuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NTUKLW1zZ2lkICIiCi0iIG5vIHRpbWUgcHJvcGFnYXRlZFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjQgY2dfcHJpbnQuYzo2NyBjZ19wcmludC5jOjY5Ci1tc2dpZCAiY2FsbGVkIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjQgY2dfcHJpbnQuYzo2OQotbXNnaWQgInRvdGFsIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjQKLW1zZ2lkICJwYXJlbnRzIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYgY2dfcHJpbnQuYzo2NwotbXNnaWQgImluZGV4IgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYKLW1zZ2lkICIldGltZSIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY2IGNnX3ByaW50LmM6NjcKLW1zZ2lkICJzZWxmIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjYKLW1zZ2lkICJkZXNjZW5kZW50cyIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjY3IGhpc3QuYzo0MDUKLW1zZ2lkICJuYW1lIgotbXNnc3RyICIiCi0KLSM6IGNnX3ByaW50LmM6NjkKLW1zZ2lkICJjaGlsZHJlbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjc0Ci1tc2dpZCAiaW5kZXggJSUgdGltZSAgICBzZWxmICBjaGlsZHJlbiAgICBjYWxsZWQgICAgIG5hbWVcbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjEwMQotIywgYy1mb3JtYXQKLW1zZ2lkICIgPGN5Y2xlICVkIGFzIGEgd2hvbGU+IFslZF1cbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlNi42cyAlNS41cyAlNy43cyAlMTEuMTFzICU3LjdzICU3LjdzICAgICA8c3BvbnRhbmVvdXM+XG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzozNTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJTYuNnMgJTUuNXMgJTcuN3MgJTcuN3MgJTcuN3MgJTcuN3MgICAgIDxzcG9udGFuZW91cz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjZ19wcmludC5jOjU4NwotbXNnaWQgIiIKLSJJbmRleCBieSBmdW5jdGlvbiBuYW1lXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogY2dfcHJpbnQuYzo2NDQgY2dfcHJpbnQuYzo2NTMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiPGN5Y2xlICVkPiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjM5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBjb3VsZCBub3Qgb3BlbiAlcy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBjb3JlZmlsZS5jOjUzIGNvcmVmaWxlLmM6ODcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IHVuYWJsZSB0byBwYXJzZSBtYXBwaW5nIGZpbGUgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoxMjgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBub3QgaW4gYS5vdXQgZm9ybWF0XG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoxMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IGZpbmQgLnRleHQgc2VjdGlvbiBpbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6MTk4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiByYW4gb3V0IHJvb20gZm9yICVsZCBieXRlcyBvZiB0ZXh0IHNwYWNlXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoyMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNhbid0IGRvIC1jXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzoyNDMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IC1jIG5vdCBzdXBwb3J0ZWQgb24gYXJjaGl0ZWN0dXJlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogY29yZWZpbGUuYzo0MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgYCVzJyBoYXMgbm8gc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGNvcmVmaWxlLmM6NzI2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBzb21lYm9keSBtaXNjb3VudGVkOiBsdGFiLmxlbj0lZCBpbnN0ZWFkIG9mICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzozMyBnbW9uX2lvLmM6NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGJmZF92bWEgaGFzIHVuZXhwZWN0ZWQgc2l6ZSBvZiAlbGQgYnl0ZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6ODcgZ21vbl9pby5jOjE3OQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZmlsZSB0b28gc2hvcnQgdG8gYmUgYSBnbW9uIGZpbGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6OTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgYCVzJyBoYXMgYmFkIG1hZ2ljIGNvb2tpZVxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoxMDgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGZpbGUgYCVzJyBoYXMgdW5zdXBwb3J0ZWQgdmVyc2lvbiAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoxMzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiBmb3VuZCBiYWQgdGFnICVkIChmaWxlIGNvcnJ1cHRlZD8pXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjE5NwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogcHJvZmlsaW5nIHJhdGUgaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjIwNwotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogaW5jb21wYXRpYmxlIHdpdGggZmlyc3QgZ21vbiBmaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI0NQotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogdW5leHBlY3RlZCBFT0YgYWZ0ZXIgcmVhZGluZyAlZC8lZCBiaW5zXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI4MAotbXNnaWQgInRpbWUgaXMgaW4gdGlja3MsIG5vdCBzZWNvbmRzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI4NiBnbW9uX2lvLmM6NDEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkb24ndCBrbm93IGhvdyB0byBkZWFsIHdpdGggZmlsZSBmb3JtYXQgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBnbW9uX2lvLmM6MjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIkZpbGUgYCVzJyAodmVyc2lvbiAlZCkgY29udGFpbnM6XG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI5NQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdCVkIGhpc3RvZ3JhbSByZWNvcmQlc1xuIgotbXNnc3RyICIiCi0KLSM6IGdtb25faW8uYzoyOTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiXHQlZCBjYWxsLWdyYXBoIHJlY29yZCVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ21vbl9pby5jOjI5OQotIywgYy1mb3JtYXQKLW1zZ2lkICJcdCVkIGJhc2ljLWJsb2NrIGNvdW50IHJlY29yZCVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo1OQotbXNnaWQgIiIKLSJAKCMpIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iCi0iIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzoxNDQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIlVzYWdlOiAlcyBbLVthYmNEaGlsTHNUdnd4eXpdXSBbLVtBQ2VFZkZKbk5PcFBxUVpdW25hbWVdXSBbLUkgZGlyc11cbiIKLSJcdFstZFtudW1dXSBbLWsgZnJvbS90b10gWy1tIG1pbi1jb3VudF0gWy10IHRhYmxlLWxlbmd0aF1cbiIKLSJcdFstLVtuby1dYW5ub3RhdGVkLXNvdXJjZVs9bmFtZV1dIFstLVtuby1dZXhlYy1jb3VudHNbPW5hbWVdXVxuIgotIlx0Wy0tW25vLV1mbGF0LXByb2ZpbGVbPW5hbWVdXSBbLS1bbm8tXWdyYXBoWz1uYW1lXV1cbiIKLSJcdFstLVtuby1ddGltZT1uYW1lXSBbLS1hbGwtbGluZXNdIFstLWJyaWVmXSBbLS1kZWJ1Z1s9bGV2ZWxdXVxuIgotIlx0Wy0tZnVuY3Rpb24tb3JkZXJpbmddIFstLWZpbGUtb3JkZXJpbmddXG4iCi0iXHRbLS1kaXJlY3RvcnktcGF0aD1kaXJzXSBbLS1kaXNwbGF5LXVudXNlZC1mdW5jdGlvbnNdXG4iCi0iXHRbLS1maWxlLWZvcm1hdD1uYW1lXSBbLS1maWxlLWluZm9dIFstLWhlbHBdIFstLWxpbmVdIFstLW1pbi1jb3VudD1uXVxuIgotIlx0Wy0tbm8tc3RhdGljXSBbLS1wcmludC1wYXRoXSBbLS1zZXBhcmF0ZS1maWxlc11cbiIKLSJcdFstLXN0YXRpYy1jYWxsLWdyYXBoXSBbLS1zdW1dIFstLXRhYmxlLWxlbmd0aD1sZW5dIFstLXRyYWRpdGlvbmFsXVxuIgotIlx0Wy0tdmVyc2lvbl0gWy0td2lkdGg9bl0gWy0taWdub3JlLW5vbi1mdW5jdGlvbnNdXG4iCi0iXHRbLS1kZW1hbmdsZV0gWy0tbm8tZGVtYW5nbGVdXG4iCi0iXHRbaW1hZ2UtZmlsZV0gW3Byb2ZpbGUtZmlsZS4uLl1cbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjE2MAotbXNnaWQgIlJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MjI5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBkZWJ1Z2dpbmcgbm90IHN1cHBvcnRlZDsgLWQgaWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6MzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB1bmtub3duIGZpbGUgZm9ybWF0ICVzXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gZm9sbG93IHRoZSBHTlUgc3RhbmRhcmRzIGRvY3VtZW50LgotIzogZ3Byb2YuYzozOTAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGdwcm9mICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzozOTEKLW1zZ2lkICIiCi0iQmFzZWQgb24gQlNEIGdwcm9mLCBjb3B5cmlnaHQgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzozOTIKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmUuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo0MzgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIgotIiVzOiBPbmx5IG9uZSBvZiAtLWZ1bmN0aW9uLW9yZGVyaW5nIGFuZCAtLWZpbGUtb3JkZXJpbmcgbWF5IGJlIHNwZWNpZmllZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBncHJvZi5jOjUzOAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogc29ycnksIGZpbGUgZm9ybWF0IGBwcm9mJyBpcyBub3QgeWV0IHN1cHBvcnRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGdwcm9mLmM6NTk5Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBnbW9uLm91dCBmaWxlIGlzIG1pc3NpbmcgaGlzdG9ncmFtXG4iCi1tc2dzdHIgIiIKLQotIzogZ3Byb2YuYzo2MDYKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGdtb24ub3V0IGZpbGUgaXMgbWlzc2luZyBjYWxsLWdyYXBoIGRhdGFcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MTQyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBgJXMnIGlzIGluY29tcGF0aWJsZSB3aXRoIGZpcnN0IGdtb24gZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzoxNTgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6ICVzOiB1bmV4cGVjdGVkIEVPRiBhZnRlciByZWFkaW5nICVkIG9mICVkIHNhbXBsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6Mzc3Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVjJWMvY2FsbCIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6Mzg1Ci1tc2dpZCAiIgotIiBmb3IgJS4yZiUlIG9mICUuMmYgJXNcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6MzkxCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSJcbiIKLSJFYWNoIHNhbXBsZSBjb3VudHMgYXMgJWcgJXMuXG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjM5NgotbXNnaWQgIiIKLSIgbm8gdGltZSBhY2N1bXVsYXRlZFxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDIKLW1zZ2lkICJjdW11bGF0aXZlIgotbXNnc3RyICIiCi0KLSM6IGhpc3QuYzo0MDIKLW1zZ2lkICJzZWxmICAiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjQwMgotbXNnaWQgInRvdGFsICIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA0Ci1tc2dpZCAidGltZSIKLW1zZ3N0ciAiIgotCi0jOiBoaXN0LmM6NDA0Ci1tc2dpZCAiY2FsbHMiCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjUxNQotbXNnaWQgIiIKLSJcbiIKLSJcbiIKLSJcbiIKLSJmbGF0IHByb2ZpbGU6XG4iCi1tc2dzdHIgIiIKLQotIzogaGlzdC5jOjUyMQotbXNnaWQgIkZsYXQgcHJvZmlsZTpcbiIKLW1zZ3N0ciAiIgotCi0jOiBzb3VyY2UuYzoxNDAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGNvdWxkIG5vdCBsb2NhdGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IHNvdXJjZS5jOjIwMAotIywgYy1mb3JtYXQKLW1zZ2lkICIqKiogRmlsZSAlczpcbiIKLW1zZ3N0ciAiIgotCi0jOiB1dGlscy5jOjkzCi0jLCBjLWZvcm1hdAotbXNnaWQgIiA8Y3ljbGUgJWQ+IgotbXNnc3RyICIiCmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5jIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NWRiZi4uMDAwMDAwMAotLS0gYS9ncHJvZi9zZWFyY2hfbGlzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLQotCi12b2lkCi1ERUZVTiAoc2VhcmNoX2xpc3RfYXBwZW5kLCAobGlzdCwgcGF0aHMpLAotICAgICAgIFNlYXJjaF9MaXN0ICogbGlzdCBBTkQgY29uc3QgY2hhciAqcGF0aHMpCi17Ci0gIFNlYXJjaF9MaXN0X0VsZW0gKm5ld19lbDsKLSAgY29uc3QgY2hhciAqYmVnLCAqY29sb247Ci0gIGludCBsZW47Ci0KLSAgY29sb24gPSBwYXRocyAtIDE7Ci0gIGRvCi0gICAgewotICAgICAgYmVnID0gY29sb24gKyAxOwotICAgICAgY29sb24gPSBzdHJjaHIgKGJlZywgJzonKTsKLSAgICAgIGlmIChjb2xvbikKLQl7Ci0JICBsZW4gPSBjb2xvbiAtIGJlZzsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbGVuID0gc3RybGVuIChiZWcpOwotCX0KLSAgICAgIG5ld19lbCA9IChTZWFyY2hfTGlzdF9FbGVtICopIHhtYWxsb2MgKHNpemVvZiAoKm5ld19lbCkgKyBsZW4pOwotICAgICAgbWVtY3B5IChuZXdfZWwtPnBhdGgsIGJlZywgbGVuKTsKLSAgICAgIG5ld19lbC0+cGF0aFtsZW5dID0gJ1wwJzsKLQotICAgICAgLyogYXBwZW5kIG5ldyBwYXRoIGF0IGVuZCBvZiBsaXN0OiAqLwotICAgICAgbmV3X2VsLT5uZXh0ID0gMDsKLSAgICAgIGlmIChsaXN0LT50YWlsKQotCXsKLQkgIGxpc3QtPnRhaWwtPm5leHQgPSBuZXdfZWw7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGxpc3QtPmhlYWQgPSBuZXdfZWw7Ci0JfQotICAgICAgbGlzdC0+dGFpbCA9IG5ld19lbDsKLSAgICB9Ci0gIHdoaWxlIChjb2xvbik7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zZWFyY2hfbGlzdC5oIGIvZ3Byb2Yvc2VhcmNoX2xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZmUzNS4uMDAwMDAwMAotLS0gYS9ncHJvZi9zZWFyY2hfbGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotI2lmbmRlZiBzZWFyY2hfbGlzdF9oCi0jZGVmaW5lIHNlYXJjaF9saXN0X2gKLQotdHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2xpc3RfZWxlbQotICB7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKm5leHQ7Ci0gICAgY2hhciBwYXRoWzFdOwotICB9Ci1TZWFyY2hfTGlzdF9FbGVtOwotCi10eXBlZGVmIHN0cnVjdAotICB7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKmhlYWQ7Ci0gICAgc3RydWN0IHNlYXJjaF9saXN0X2VsZW0gKnRhaWw7Ci0gIH0KLVNlYXJjaF9MaXN0OwotCi1leHRlcm4gdm9pZCBzZWFyY2hfbGlzdF9hcHBlbmQgUEFSQU1TICgoU2VhcmNoX0xpc3QgKiBsaXN0LCBjb25zdCBjaGFyICpwYXRocykpOwotCi0jZW5kaWYgLyogc2VhcmNoX2xpc3RfaCAqLwpkaWZmIC0tZ2l0IGEvZ3Byb2Yvc291cmNlLmMgYi9ncHJvZi9zb3VyY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwMWEwNC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zb3VyY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogS2VlcHMgdHJhY2sgb2Ygc291cmNlIGZpbGVzLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzZWFyY2hfbGlzdC5oIgotI2luY2x1ZGUgInNvdXJjZS5oIgotCi0jZGVmaW5lIEVYVF9BTk5PICItYW5uIgkJLyogcG9zdGZpeCBvZiBhbm5vdGF0ZWQgZmlsZXMgKi8KLQotLyoKLSAqIERlZmF1bHQgb3B0aW9uIHZhbHVlczoKLSAqLwotYm9vbCBjcmVhdGVfYW5ub3RhdGlvbl9maWxlcyA9IEZBTFNFOwotCi1TZWFyY2hfTGlzdCBzcmNfc2VhcmNoX2xpc3QgPQotezAsIDB9OwotU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlID0gMDsKLQotCi1Tb3VyY2VfRmlsZSAqCi1ERUZVTiAoc291cmNlX2ZpbGVfbG9va3VwX3BhdGgsIChwYXRoKSwgY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgU291cmNlX0ZpbGUgKnNmOwotCi0gIGZvciAoc2YgPSBmaXJzdF9zcmNfZmlsZTsgc2Y7IHNmID0gc2YtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAocGF0aCwgc2YtPm5hbWUpID09IDApCi0JewotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgaWYgKCFzZikKLSAgICB7Ci0gICAgICAvKiBjcmVhdGUgYSBuZXcgc291cmNlIGZpbGUgZGVzY3JpcHRvcjogKi8KLQotICAgICAgc2YgPSAoU291cmNlX0ZpbGUgKikgeG1hbGxvYyAoc2l6ZW9mICgqc2YpKTsKLSAgICAgIG1lbXNldCAoc2YsIDAsIHNpemVvZiAoKnNmKSk7Ci0gICAgICBzZi0+bmFtZSA9IHhzdHJkdXAgKHBhdGgpOwotICAgICAgc2YtPm5leHQgPSBmaXJzdF9zcmNfZmlsZTsKLSAgICAgIGZpcnN0X3NyY19maWxlID0gc2Y7Ci0gICAgfQotICByZXR1cm4gc2Y7Ci19Ci0KLQotU291cmNlX0ZpbGUgKgotREVGVU4gKHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lLCAoZmlsZW5hbWUpLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgY29uc3QgY2hhciAqZm5hbWU7Ci0gIFNvdXJjZV9GaWxlICpzZjsKLSAgLyoKLSAgICogVGhlIHVzZXIgY2Fubm90IGtub3cgZXhhY3RseSBob3cgYSBmaWxlbmFtZSB3aWxsIGJlIHN0b3JlZCBpbgotICAgKiB0aGUgZGVidWdnaW5nIGluZm8gKGUuZy4sIC4uL2luY2x1ZGUvZm9vLmgKLSAgICogdnMuIC91c3IvaW5jbHVkZS9mb28uaCkuICBTbyB3ZSBzaW1wbHkgY29tcGFyZSB0aGUgZmlsZW5hbWUKLSAgICogY29tcG9uZW50IG9mIGEgcGF0aCBvbmx5OgotICAgKi8KLSAgZm9yIChzZiA9IGZpcnN0X3NyY19maWxlOyBzZjsgc2YgPSBzZi0+bmV4dCkKLSAgICB7Ci0gICAgICBmbmFtZSA9IHN0cnJjaHIgKHNmLT5uYW1lLCAnLycpOwotICAgICAgaWYgKGZuYW1lKQotCXsKLQkgICsrZm5hbWU7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGZuYW1lID0gc2YtPm5hbWU7Ci0JfQotICAgICAgaWYgKHN0cmNtcCAoZmlsZW5hbWUsIGZuYW1lKSA9PSAwKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiBzZjsKLX0KLQotCi1GSUxFICoKLURFRlVOIChhbm5vdGF0ZV9zb3VyY2UsIChzZiwgbWF4X3dpZHRoLCBhbm5vdGUsIGFyZyksCi0gICAgICAgU291cmNlX0ZpbGUgKiBzZiBBTkQgaW50IG1heF93aWR0aAotICAgICAgIEFORCB2b2lkICgqYW5ub3RlKSBQQVJBTVMgKChjaGFyICpidWYsIGludCB3LCBpbnQgbCwgdm9pZCAqYXJnKSkKLSAgICAgICBBTkQgdm9pZCAqYXJnKQotewotICBzdGF0aWMgYm9vbCBmaXJzdF9maWxlID0gVFJVRTsKLSAgaW50IGksIGxpbmVfbnVtLCBucmVhZDsKLSAgYm9vbCBuZXdfbGluZTsKLSAgY2hhciBidWZbODE5Ml07Ci0gIGNoYXIgZm5hbWVbUEFUSF9NQVhdOwotICBjaGFyICphbm5vdGF0aW9uLCAqbmFtZV9vbmx5OwotICBGSUxFICppZnAsICpvZnA7Ci0gIFNlYXJjaF9MaXN0X0VsZW0gKnNsZSA9IHNyY19zZWFyY2hfbGlzdC5oZWFkOwotCi0gIC8qCi0gICAqIE9wZW4gaW5wdXQgZmlsZS4gIElmIG9wZW4gZmFpbHMsIHdhbGsgYWxvbmcgc2VhcmNoLWxpc3QgdW50aWwKLSAgICogb3BlbiBzdWNjZWVkcyBvciByZWFjaGluZyBlbmQgb2YgbGlzdDoKLSAgICovCi0gIHN0cmNweSAoZm5hbWUsIHNmLT5uYW1lKTsKLSAgaWYgKHNmLT5uYW1lWzBdID09ICcvJykKLSAgICB7Ci0gICAgICBzbGUgPSAwOwkJCS8qIGRvbid0IHVzZSBzZWFyY2ggbGlzdCBmb3IgYWJzb2x1dGUgcGF0aHMgKi8KLSAgICB9Ci0gIG5hbWVfb25seSA9IDA7Ci0gIHdoaWxlIChUUlVFKQotICAgIHsKLSAgICAgIERCRyAoU1JDREVCVUcsIHByaW50ZiAoIlthbm5vdGF0ZV9zb3VyY2VdOiBsb29raW5nIGZvciAlcywgdHJ5aW5nICVzXG4iLAotCQkJICAgICBzZi0+bmFtZSwgZm5hbWUpKTsKLSAgICAgIGlmcCA9IGZvcGVuIChmbmFtZSwgRk9QRU5fUkIpOwotICAgICAgaWYgKGlmcCkKLQl7Ci0JICBicmVhazsKLQl9Ci0gICAgICBpZiAoIXNsZSAmJiAhbmFtZV9vbmx5KQotCXsKLQkgIG5hbWVfb25seSA9IHN0cnJjaHIgKHNmLT5uYW1lLCAnLycpOwotCSAgaWYgKG5hbWVfb25seSkKLQkgICAgewotCSAgICAgIC8qIHRyeSBzZWFyY2gtbGlzdCBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIG5hbWUgb25seTogKi8KLQkgICAgICArK25hbWVfb25seTsKLQkgICAgICBzbGUgPSBzcmNfc2VhcmNoX2xpc3QuaGVhZDsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzbGUpCi0JewotCSAgc3RyY3B5IChmbmFtZSwgc2xlLT5wYXRoKTsKLQkgIHN0cmNhdCAoZm5hbWUsICIvIik7Ci0JICBpZiAobmFtZV9vbmx5KQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChmbmFtZSwgbmFtZV9vbmx5KTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3RyY2F0IChmbmFtZSwgc2YtPm5hbWUpOwotCSAgICB9Ci0JICBzbGUgPSBzbGUtPm5leHQ7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChlcnJubyA9PSBFTk9FTlQpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBjb3VsZCBub3QgbG9jYXRlIGAlcydcbiIpLAotCQkgICAgICAgd2hvYW1pLCBzZi0+bmFtZSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHBlcnJvciAoc2YtPm5hbWUpOwotCSAgICB9Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIG9mcCA9IHN0ZG91dDsKLSAgaWYgKGNyZWF0ZV9hbm5vdGF0aW9uX2ZpbGVzKQotICAgIHsKLSAgICAgIC8qIHRyeSB0byBjcmVhdGUgYW5ub3RhdGVkIHNvdXJjZSBmaWxlOiAqLwotICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0KLSAgICAgIC8qIGNyZWF0ZSBhbm5vdGF0aW9uIGZpbGVzIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAqLwotICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChzZi0+bmFtZSwgJy8nKTsKLSAgICAgIGlmIChmaWxlbmFtZSkKLQl7Ci0JICArK2ZpbGVuYW1lOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaWxlbmFtZSA9IHNmLT5uYW1lOwotCX0KLQotICAgICAgc3RyY3B5IChmbmFtZSwgZmlsZW5hbWUpOwotICAgICAgc3RyY2F0IChmbmFtZSwgRVhUX0FOTk8pOwotICAgICAgb2ZwID0gZm9wZW4gKGZuYW1lLCAidyIpOwotICAgICAgaWYgKCFvZnApCi0JewotCSAgcGVycm9yIChmbmFtZSk7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgfQotCi0gIC8qCi0gICAqIFByaW50IGZpbGUgbmFtZXMgaWYgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCB0aGVyZSBhcmUKLSAgICogbW9yZSB0aGFuIG9uZSBzb3VyY2UgZmlsZToKLSAgICovCi0gIGlmIChvZnAgPT0gc3Rkb3V0KQotICAgIHsKLSAgICAgIGlmIChmaXJzdF9maWxlKQotCXsKLQkgIGZpcnN0X2ZpbGUgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnB1dGMgKCdcbicsIG9mcCk7Ci0JfQotICAgICAgaWYgKGZpcnN0X291dHB1dCkKLQl7Ci0JICBmaXJzdF9vdXRwdXQgPSBGQUxTRTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZnByaW50ZiAob2ZwLCAiXGZcbiIpOwotCX0KLSAgICAgIGZwcmludGYgKG9mcCwgXygiKioqIEZpbGUgJXM6XG4iKSwgc2YtPm5hbWUpOwotICAgIH0KLQotICBhbm5vdGF0aW9uID0geG1hbGxvYyAobWF4X3dpZHRoICsgMSk7Ci0gIGxpbmVfbnVtID0gMTsKLSAgbmV3X2xpbmUgPSBUUlVFOwotICB3aGlsZSAoKG5yZWFkID0gZnJlYWQgKGJ1ZiwgMSwgc2l6ZW9mIChidWYpLCBpZnApKSA+IDApCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IG5yZWFkOyArK2kpCi0JewotCSAgaWYgKG5ld19saW5lKQotCSAgICB7Ci0JICAgICAgKCphbm5vdGUpIChhbm5vdGF0aW9uLCBtYXhfd2lkdGgsIGxpbmVfbnVtLCBhcmcpOwotCSAgICAgIGZwdXRzIChhbm5vdGF0aW9uLCBvZnApOwotCSAgICAgICsrbGluZV9udW07Ci0JICAgICAgbmV3X2xpbmUgPSBGQUxTRTsKLQkgICAgfQotCSAgbmV3X2xpbmUgPSAoYnVmW2ldID09ICdcbicpOwotCSAgZnB1dGMgKGJ1ZltpXSwgb2ZwKTsKLQl9Ci0gICAgfQotICBmcmVlIChhbm5vdGF0aW9uKTsKLSAgcmV0dXJuIG9mcDsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3NvdXJjZS5oIGIvZ3Byb2Yvc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzM2JhZDMuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jaWZuZGVmIHNvdXJjZV9oCi0jZGVmaW5lIHNvdXJjZV9oCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImdwcm9mLmgiCi0jaW5jbHVkZSAic2VhcmNoX2xpc3QuaCIKLQotdHlwZWRlZiBzdHJ1Y3Qgc291cmNlX2ZpbGUKLSAgewotICAgIHN0cnVjdCBzb3VyY2VfZmlsZSAqbmV4dDsKLSAgICBjb25zdCBjaGFyICpuYW1lOwkJLyogbmFtZSBvZiBzb3VyY2UgZmlsZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgbmNhbGxzOwkvKiAjIG9mICJjYWxscyIgdG8gdGhpcyBmaWxlICovCi0gICAgaW50IG51bV9saW5lczsJCS8qICMgb2YgbGluZXMgaW4gZmlsZSAqLwotICAgIGludCBuYWxsb2NlZDsJCS8qIG51bWJlciBvZiBsaW5lcyBhbGxvY2F0ZWQgKi8KLSAgICB2b2lkICoqbGluZTsJCS8qIHVzYWdlLWRlcGVuZGVudCBwZXItbGluZSBkYXRhICovCi0gIH0KLVNvdXJjZV9GaWxlOwotCi0vKgotICogT3B0aW9uczoKLSAqLwotZXh0ZXJuIGJvb2wgY3JlYXRlX2Fubm90YXRpb25fZmlsZXM7CS8qIGNyZWF0ZSBhbm5vdGF0ZWQgb3V0cHV0IGZpbGVzPyAqLwotCi0vKgotICogTGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHNvdXJjZSBmaWxlczoKLSAqLwotZXh0ZXJuIFNlYXJjaF9MaXN0IHNyY19zZWFyY2hfbGlzdDsKLQotLyoKLSAqIENoYWluIG9mIHNvdXJjZS1maWxlIGRlc2NyaXB0b3JzOgotICovCi1leHRlcm4gU291cmNlX0ZpbGUgKmZpcnN0X3NyY19maWxlOwotCi0vKgotICogUmV0dXJucyBwb2ludGVyIHRvIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgZm9yIFBBVEgvRklMRU5BTUUuCi0gKi8KLWV4dGVybiBTb3VyY2VfRmlsZSAqc291cmNlX2ZpbGVfbG9va3VwX3BhdGggUEFSQU1TICgoY29uc3QgY2hhciAqcGF0aCkpOwotZXh0ZXJuIFNvdXJjZV9GaWxlICpzb3VyY2VfZmlsZV9sb29rdXBfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0vKgotICogUmVhZCBzb3VyY2UgZmlsZSBTRiBvdXRwdXQgYW5ub3RhdGVkIHNvdXJjZS4gIFRoZSBhbm5vdGF0aW9uIGlzIGF0Ci0gKiBNQVhfV0lEVEggY2hhcmFjdGVycyB3aWRlIGFuZCBmb3IgZWFjaCBzb3VyY2UtbGluZSBhbiBhbm5vdGF0aW9uIGlzCi0gKiBvYnRhaW5lZCBieSBpbnZva2luZyBmdW5jdGlvbiBBTk5PVEUuICBBUkcgaXMgYW4gYXJndW1lbnQgcGFzc2VkIHRvCi0gKiBBTk5PVEUgdGhhdCBpcyBsZWZ0IHVuaW50ZXJwcmV0ZWQgYnkgYW5ub3RhdGVfc291cmNlKCkuCi0gKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBmaWxlICh3aGljaCBtYXliZSBzdGRvdXQpIHN1Y2gKLSAqIHRoYXQgc3VtbWFyeSBzdGF0aXN0aWNzIGNhbiBiZSBwcmludGVkLiAgSWYgdGhlIHJldHVybmVkIGZpbGUKLSAqIGlzIG5vdCBzdGRvdXQsIGl0IHNob3VsZCBiZSBjbG9zZWQgd2hlbiBkb25lIHdpdGggaXQuCi0gKi8KLWV4dGVybiBGSUxFICphbm5vdGF0ZV9zb3VyY2UgUEFSQU1TICgoU291cmNlX0ZpbGUgKiBzZiwgaW50IG1heF93aWR0aCwKLQkJCQkgICAgICB2b2lkICgqYW5ub3RlKSAoY2hhciAqYiwgaW50IHcsIGludCBsLAotCQkJCQkJICAgICAgdm9pZCAqYXJnKSwKLQkJCQkgICAgICB2b2lkICphcmcpKTsKLQotI2VuZGlmIC8qIHNvdXJjZV9oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zcGFyYy5jIGIvZ3Byb2Yvc3BhcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ3MDJiMS4uMDAwMDAwMAotLS0gYS9ncHJvZi9zcGFyYy5jCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxmJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMCSgweGMwMDAwMDAwKQotCi12b2lkCi1zcGFyY19maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIGJmZF92bWEgZGVzdF9wYywgZGVsdGE7Ci0gIHVuc2lnbmVkIGludCAqaW5zdHI7Ci0gIFN5bSAqY2hpbGQ7Ci0KLSAgZGVsdGEgPSAoYmZkX3ZtYSkgY29yZV90ZXh0X3NwYWNlIC0gY29yZV90ZXh0X3NlY3QtPnZtYTsKLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZF9jYWxsXSAlczogMHglbHggdG8gMHglbHhcbiIsCi0JCQkgIHBhcmVudC0+bmFtZSwgcF9sb3dwYywgcF9oaWdocGMpKTsKLSAgZm9yIChpbnN0ciA9ICh1bnNpZ25lZCBpbnQgKikgKCgocF9sb3dwYyArIGRlbHRhKSArIDMpICZ+IDMpOwotICAgICAgIGluc3RyIDwgKHVuc2lnbmVkIGludCAqKSAocF9oaWdocGMgKyBkZWx0YSk7Ci0gICAgICAgKytpbnN0cikKLSAgICB7Ci0gICAgICBpZiAoKCppbnN0ciAmIENBTEwpKQotCXsKLQkgIERCRyAoQ0FMTERFQlVHLAotCSAgICAgICBwcmludGYgKCJbZmluZF9jYWxsXSAweCVseDogY2FsbGYiLCAoYmZkX3ZtYSkgaW5zdHIgLSBkZWx0YSkpOwotCSAgLyoKLQkgICAqIFJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZyBjaGVjayB0aGF0IHRoaXMgaXMgdGhlCi0JICAgKiBhZGRyZXNzIG9mIGEgZnVuY3Rpb24uCi0JICAgKi8KLQkgIGRlc3RfcGMgPSAoKGJmZF92bWEpIChpbnN0ciArICgqaW5zdHIgJiB+Q0FMTCkpKSAtIGRlbHRhOwotCSAgaWYgKGRlc3RfcGMgPj0gc19sb3dwYyAmJiBkZXN0X3BjIDw9IHNfaGlnaHBjKQotCSAgICB7Ci0JICAgICAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0X3BjKTsKLQkgICAgICBEQkcgKENBTExERUJVRywKLQkJICAgcHJpbnRmICgiXHRkZXN0X3BjPTB4JWx4LCAobmFtZT0lcywgYWRkcj0weCVseClcbiIsCi0JCQkgICBkZXN0X3BjLCBjaGlsZC0+bmFtZSwgY2hpbGQtPmFkZHIpKTsKLQkgICAgICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdF9wYykKLQkJewotCQkgIC8qIGEgaGl0OiAgKi8KLQkJICBhcmNfYWRkIChwYXJlbnQsIGNoaWxkLCAodW5zaWduZWQgbG9uZykgMCk7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgfQotCSAgLyoKLQkgICAqIFNvbWV0aGluZyBmdW5ueSBnb2luZyBvbi4KLQkgICAqLwotCSAgREJHIChDQUxMREVCVUcsIHByaW50ZiAoIlx0YnV0IGl0J3MgYSBib3RjaFxuIikpOwotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zdGFtcC1oLmluIGIvZ3Byb2Yvc3RhbXAtaC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4OGY3MC4uMDAwMDAwMAotLS0gYS9ncHJvZi9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmMgYi9ncHJvZi9zeW1faWRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhM2NhMjguLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltX2lkcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiY2dfYXJjcy5oIgotI2luY2x1ZGUgInN5bV9pZHMuaCIKLQotc3RydWN0IHN5bV9pZAotICB7Ci0gICAgc3RydWN0IHN5bV9pZCAqbmV4dDsKLSAgICBjaGFyICpzcGVjOwkJCS8qIHBhcnNpbmcgbW9kaWZpZXMgdGhpcyAqLwotICAgIFRhYmxlX0lkIHdoaWNoX3RhYmxlOwotICAgIGJvb2wgaGFzX3JpZ2h0OwotICAgIHN0cnVjdCBtYXRjaAotICAgICAgewotCWludCBwcmV2X2luZGV4OwkJLyogaW5kZXggb2YgcHJldiBtYXRjaCAqLwotCVN5bSAqcHJldl9tYXRjaDsJLyogcHJldmlvdXMgbWF0Y2ggKi8KLQlTeW0gKmZpcnN0X21hdGNoOwkvKiBjaGFpbiBvZiBhbGwgbWF0Y2hlcyAqLwotCVN5bSBzeW07Ci0gICAgICB9Ci0gICAgbGVmdCwgcmlnaHQ7Ci0gIH0KLSAqaWRfbGlzdDsKLQotU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107Ci0KLSNpZmRlZiBERUJVRwotY29uc3QgY2hhciAqdGFibGVfbmFtZVtdID0KLXsKLSAgIklOQ0xfR1JBUEgiLCAiRVhDTF9HUkFQSCIsCi0gICJJTkNMX0FSQ1MiLCAiRVhDTF9BUkNTIiwKLSAgIklOQ0xfRkxBVCIsICJFWENMX0ZMQVQiLAotICAiSU5DTF9USU1FIiwgIkVYQ0xfVElNRSIsCi0gICJJTkNMX0FOTk8iLCAiRVhDTF9BTk5PIiwKLSAgIklOQ0xfRVhFQyIsICJFWENMX0VYRUMiCi19OwotI2VuZGlmIC8qIERFQlVHICovCi0KLS8qCi0gKiBUaGlzIGlzIHRoZSB0YWJsZSBpbiB3aGljaCB3ZSBrZWVwIGFsbCB0aGUgc3ltcyB0aGF0IG1hdGNoCi0gKiB0aGUgcmlnaHQgaGFsZiBvZiBhbiBhcmMgaWQuICBJdCBpcyBOT1Qgc29ydGVkIGFjY29yZGluZwotICogdG8gdGhlIGFkZHJlc3NlcywgYmVjYXVzZSBpdCBpcyBhY2Nlc3NlZCBvbmx5IHRocm91Z2gKLSAqIHRoZSBsZWZ0IGhhbGYncyBDSElMRFJFTiBwb2ludGVycyAoc28gaXQncyBjcnVjaWFsIG5vdAotICogdG8gcmVvcmRlciB0aGlzIHRhYmxlIG9uY2UgcG9pbnRlcnMgaW50byBpdCBleGlzdCkuCi0gKi8KLXN0YXRpYyBTeW1fVGFibGUgcmlnaHRfaWRzOwotCi1zdGF0aWMgU291cmNlX0ZpbGUgbm9uX2V4aXN0ZW50X2ZpbGUgPQotewotICAwLCAiPG5vbi1leGlzdGVudC1maWxlPiIKLX07Ci0KLQotdm9pZAotREVGVU4gKHN5bV9pZF9hZGQsIChzcGVjLCB3aGljaF90YWJsZSksCi0gICAgICAgY29uc3QgY2hhciAqc3BlYyBBTkQgVGFibGVfSWQgd2hpY2hfdGFibGUpCi17Ci0gIHN0cnVjdCBzeW1faWQgKmlkOwotICBpbnQgbGVuID0gc3RybGVuIChzcGVjKTsKLQotICBpZCA9IChzdHJ1Y3Qgc3ltX2lkICopIHhtYWxsb2MgKHNpemVvZiAoKmlkKSArIGxlbiArIDEpOwotICBtZW1zZXQgKGlkLCAwLCBzaXplb2YgKCppZCkpOwotCi0gIGlkLT5zcGVjID0gKGNoYXIgKikgaWQgKyBzaXplb2YgKCppZCk7Ci0gIHN0cmNweSAoaWQtPnNwZWMsIHNwZWMpOwotICBpZC0+d2hpY2hfdGFibGUgPSB3aGljaF90YWJsZTsKLQotICBpZC0+bmV4dCA9IGlkX2xpc3Q7Ci0gIGlkX2xpc3QgPSBpZDsKLX0KLQotCi0vKgotICogQSBzcGVjIGhhcyB0aGUgc3ludGF4IEZJTEVOQU1FOihGVU5DTkFNRXxMSU5FTlVNKS4gIEFzIGEgY29udmVuaWVuY2UKLSAqIHRvIHRoZSB1c2VyLCBhIHNwZWMgd2l0aG91dCBhIGNvbG9uIGlzIGludGVycHJldGVkIGFzOgotICoKLSAqICAgICAgKGkpICAgYSBGSUxFTkFNRSBpZiBpdCBjb250YWlucyBhIGRvdAotICogICAgICAoaWkpICBhIEZVTkNOQU1FIGlmIGl0IHN0YXJ0cyB3aXRoIGEgbm9uLWRpZ2l0IGNoYXJhY3RlcgotICogICAgICAoaWlpKSBhIExJTkVOVU0gaWYgaXQgc3RhcnRzIHdpdGggYSBkaWdpdAotICoKLSAqIEEgRlVOQ05BTUUgY29udGFpbmluZyBhIGRvdCBjYW4gYmUgc3BlY2lmaWVkIGJ5IDpGVU5DTkFNRSwgYQotICogRklMRU5BTUUgbm90IGNvbnRhaW5pbmcgYSBkb3QgY2FuIGJlIHNwZWNpZmllZCBieSBGSUxFTkFNRTouCi0gKi8KLXN0YXRpYyB2b2lkCi1ERUZVTiAocGFyc2Vfc3BlYywgKHNwZWMsIHN5bSksIGNoYXIgKnNwZWMgQU5EIFN5bSAqIHN5bSkKLXsKLSAgY2hhciAqY29sb247Ci0KLSAgc3ltX2luaXQgKHN5bSk7Ci0gIGNvbG9uID0gc3RycmNociAoc3BlYywgJzonKTsKLSAgaWYgKGNvbG9uKQotICAgIHsKLSAgICAgICpjb2xvbiA9ICdcMCc7Ci0gICAgICBpZiAoY29sb24gPiBzcGVjKQotCXsKLQkgIHN5bS0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lIChzcGVjKTsKLQkgIGlmICghc3ltLT5maWxlKQotCSAgICB7Ci0JICAgICAgc3ltLT5maWxlID0gJm5vbl9leGlzdGVudF9maWxlOwotCSAgICB9Ci0JfQotICAgICAgc3BlYyA9IGNvbG9uICsgMTsKLSAgICAgIGlmIChzdHJsZW4gKHNwZWMpKQotCXsKLQkgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgc3BlY1swXSkpCi0JICAgIHsKLQkgICAgICBzeW0tPmxpbmVfbnVtID0gYXRvaSAoc3BlYyk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN5bS0+bmFtZSA9IHNwZWM7Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJsZW4gKHNwZWMpKQotICAgIHsKLSAgICAgIC8qIG5vIGNvbG9uOiBzcGVjIGlzIGEgZmlsZW5hbWUgaWYgaXQgY29udGFpbnMgYSBkb3Q6ICovCi0gICAgICBpZiAoc3RyY2hyIChzcGVjLCAnLicpKQotCXsKLQkgIHN5bS0+ZmlsZSA9IHNvdXJjZV9maWxlX2xvb2t1cF9uYW1lIChzcGVjKTsKLQkgIGlmICghc3ltLT5maWxlKQotCSAgICB7Ci0JICAgICAgc3ltLT5maWxlID0gJm5vbl9leGlzdGVudF9maWxlOwotCSAgICB9Ci0JfQotICAgICAgZWxzZSBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICpzcGVjKSkKLQl7Ci0JICBzeW0tPmxpbmVfbnVtID0gYXRvaSAoc3BlYyk7Ci0JfQotICAgICAgZWxzZSBpZiAoc3RybGVuIChzcGVjKSkKLQl7Ci0JICBzeW0tPm5hbWUgPSBzcGVjOwotCX0KLSAgICB9Ci19Ci0KLQotLyoKLSAqIEEgc3ltYm9sIGlkIGhhcyB0aGUgc3ludGF4IFNQRUNbL1NQRUNdLCB3aGVyZSBTUEVDIGlzIGlzIGRlZmluZWQKLSAqIGJ5IHBhcnNlX3NwZWMoKS4KLSAqLwotc3RhdGljIHZvaWQKLURFRlVOIChwYXJzZV9pZCwgKGlkKSwgc3RydWN0IHN5bV9pZCAqaWQpCi17Ci0gIGNoYXIgKnNsYXNoOwotCi0gIERCRyAoSURERUJVRywgcHJpbnRmICgiW3BhcnNlX2lkXSAlcyAtPiAiLCBpZC0+c3BlYykpOwotCi0gIHNsYXNoID0gc3RyY2hyIChpZC0+c3BlYywgJy8nKTsKLSAgaWYgKHNsYXNoKQotICAgIHsKLSAgICAgIHBhcnNlX3NwZWMgKHNsYXNoICsgMSwgJmlkLT5yaWdodC5zeW0pOwotICAgICAgKnNsYXNoID0gJ1wwJzsKLSAgICAgIGlkLT5oYXNfcmlnaHQgPSBUUlVFOwotICAgIH0KLSAgcGFyc2Vfc3BlYyAoaWQtPnNwZWMsICZpZC0+bGVmdC5zeW0pOwotCi0jaWZkZWYgREVCVUcKLSAgaWYgKGRlYnVnX2xldmVsICYgSURERUJVRykKLSAgICB7Ci0gICAgICBwcmludGYgKCIlczoiLCBpZC0+bGVmdC5zeW0uZmlsZSA/IGlkLT5sZWZ0LnN5bS5maWxlLT5uYW1lIDogIioiKTsKLSAgICAgIGlmIChpZC0+bGVmdC5zeW0ubmFtZSkKLQl7Ci0JICBwcmludGYgKCIlcyIsIGlkLT5sZWZ0LnN5bS5uYW1lKTsKLQl9Ci0gICAgICBlbHNlIGlmIChpZC0+bGVmdC5zeW0ubGluZV9udW0pCi0JewotCSAgcHJpbnRmICgiJWQiLCBpZC0+bGVmdC5zeW0ubGluZV9udW0pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIqIik7Ci0JfQotICAgICAgaWYgKGlkLT5oYXNfcmlnaHQpCi0JewotCSAgcHJpbnRmICgiLyVzOiIsCi0JCSAgaWQtPnJpZ2h0LnN5bS5maWxlID8gaWQtPnJpZ2h0LnN5bS5maWxlLT5uYW1lIDogIioiKTsKLQkgIGlmIChpZC0+cmlnaHQuc3ltLm5hbWUpCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlcyIsIGlkLT5yaWdodC5zeW0ubmFtZSk7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlkLT5yaWdodC5zeW0ubGluZV9udW0pCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIlZCIsIGlkLT5yaWdodC5zeW0ubGluZV9udW0pOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBwcmludGYgKCIqIik7Ci0JICAgIH0KLQl9Ci0gICAgICBwcmludGYgKCJcbiIpOwotICAgIH0KLSNlbmRpZgotfQotCi0KLS8qCi0gKiBSZXR1cm4gVFJVRSBpZmYgUEFUVEVSTiBtYXRjaGVzIFNZTS4KLSAqLwotc3RhdGljIGJvb2wKLURFRlVOIChtYXRjaCwgKHBhdHRlcm4sIHN5bSksIFN5bSAqIHBhdHRlcm4gQU5EIFN5bSAqIHN5bSkKLXsKLSAgcmV0dXJuIChwYXR0ZXJuLT5maWxlID8gcGF0dGVybi0+ZmlsZSA9PSBzeW0tPmZpbGUgOiBUUlVFKQotICAgICYmIChwYXR0ZXJuLT5saW5lX251bSA/IHBhdHRlcm4tPmxpbmVfbnVtID09IHN5bS0+bGluZV9udW0gOiBUUlVFKQotICAgICYmIChwYXR0ZXJuLT5uYW1lID8gc3RyY21wIChwYXR0ZXJuLT5uYW1lLCBzeW0tPm5hbWUpID09IDAgOiBUUlVFKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotREVGVU4gKGV4dGVuZF9tYXRjaCwgKG0sIHN5bSwgdGFiLCBzZWNvbmRfcGFzcyksCi0gICAgIHN0cnVjdCBtYXRjaCAqbSBBTkQgU3ltICogc3ltIEFORCBTeW1fVGFibGUgKiB0YWIgQU5EIGJvb2wgc2Vjb25kX3Bhc3MpCi17Ci0gIGlmIChtLT5wcmV2X21hdGNoICE9IHN5bSAtIDEpCi0gICAgewotICAgICAgLyogZGlzY29udGludWl0eTogYWRkIG5ldyBtYXRjaCB0byB0YWJsZTogKi8KLSAgICAgIGlmIChzZWNvbmRfcGFzcykKLQl7Ci0JICB0YWItPmJhc2VbdGFiLT5sZW5dID0gKnN5bTsKLQkgIG0tPnByZXZfaW5kZXggPSB0YWItPmxlbjsKLQotCSAgLyogbGluayBtYXRjaCBpbnRvIG1hdGNoJ3MgY2hhaW46ICovCi0JICB0YWItPmJhc2VbdGFiLT5sZW5dLm5leHQgPSBtLT5maXJzdF9tYXRjaDsKLQkgIG0tPmZpcnN0X21hdGNoID0gJnRhYi0+YmFzZVt0YWItPmxlbl07Ci0JfQotICAgICAgKyt0YWItPmxlbjsKLSAgICB9Ci0KLSAgLyogZXh0ZW5kIG1hdGNoIHRvIGluY2x1ZGUgdGhpcyBzeW1ib2w6ICovCi0gIGlmIChzZWNvbmRfcGFzcykKLSAgICB7Ci0gICAgICB0YWItPmJhc2VbbS0+cHJldl9pbmRleF0uZW5kX2FkZHIgPSBzeW0tPmVuZF9hZGRyOwotICAgIH0KLSAgbS0+cHJldl9tYXRjaCA9IHN5bTsKLX0KLQotCi0vKgotICogR28gdGhyb3VnaCBzeW1faWQgbGlzdCBwcm9kdWNlZCBieSBvcHRpb24gcHJvY2Vzc2luZyBhbmQgZmlsbAotICogaW4gdGhlIHZhcmlvdXMgc3ltYm9sIHRhYmxlcyBpbmRpY2F0aW5nIHdoYXQgc3ltYm9scyBzaG91bGQKLSAqIGJlIGRpc3BsYXllZCBvciBzdXBwcmVzc2VkIGZvciB0aGUgdmFyaW91cyBraW5kcyBvZiBvdXRwdXRzLgotICoKLSAqIFRoaXMgY2FuIHBvdGVudGlhbGx5IHByb2R1Y2UgaHVnZSB0YWJsZXMgYW5kIGluIHBhcnRpY3VsYXJzCi0gKiB0b25zIG9mIGFyY3MsIGJ1dCB0aGlzIGhhcHBlbnMgb25seSBpZiB0aGUgdXNlciBtYWtlcyBzaWxseQotICogcmVxdWVzdHMtLS15b3UgZ2V0IHdoYXQgeW91IGFzayBmb3IhCi0gKi8KLXZvaWQKLURFRlVOX1ZPSUQgKHN5bV9pZF9wYXJzZSkKLXsKLSAgU3ltICpzeW0sICpsZWZ0LCAqcmlnaHQ7Ci0gIHN0cnVjdCBzeW1faWQgKmlkOwotICBTeW1fVGFibGUgKnRhYjsKLQotICAvKgotICAgKiBDb252ZXJ0IHN5bWJvbCBpZHMgaW50byBTeW1zLCBzbyB3ZSBjYW4gZGVhbCB3aXRoIHRoZW0gbW9yZSBlYXNpbHk6Ci0gICAqLwotICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCi0gICAgewotICAgICAgcGFyc2VfaWQgKGlkKTsKLSAgICB9Ci0KLSAgLyogZmlyc3QgZGV0ZXJtaW5lIHNpemUgb2YgZWFjaCB0YWJsZTogKi8KLQotICBmb3IgKHN5bSA9IHN5bXRhYi5iYXNlOyBzeW0gPCBzeW10YWIubGltaXQ7ICsrc3ltKQotICAgIHsKLSAgICAgIGZvciAoaWQgPSBpZF9saXN0OyBpZDsgaWQgPSBpZC0+bmV4dCkKLQl7Ci0JICBpZiAobWF0Y2ggKCZpZC0+bGVmdC5zeW0sIHN5bSkpCi0JICAgIHsKLQkgICAgICBleHRlbmRfbWF0Y2ggKCZpZC0+bGVmdCwgc3ltLCAmc3ltc1tpZC0+d2hpY2hfdGFibGVdLCBGQUxTRSk7Ci0JICAgIH0KLQkgIGlmIChpZC0+aGFzX3JpZ2h0ICYmIG1hdGNoICgmaWQtPnJpZ2h0LnN5bSwgc3ltKSkKLQkgICAgewotCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5yaWdodCwgc3ltLCAmcmlnaHRfaWRzLCBGQUxTRSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGNyZWF0ZSB0YWJsZXMgb2YgYXBwcm9wcmlhdGUgc2l6ZSBhbmQgcmVzZXQgbGVuZ3RoczogKi8KLQotICBmb3IgKHRhYiA9IHN5bXM7IHRhYiA8ICZzeW1zW05VTV9UQUJMRVNdOyArK3RhYikKLSAgICB7Ci0gICAgICBpZiAodGFiLT5sZW4pCi0JewotCSAgdGFiLT5iYXNlID0gKFN5bSAqKSB4bWFsbG9jICh0YWItPmxlbiAqIHNpemVvZiAoU3ltKSk7Ci0JICB0YWItPmxpbWl0ID0gdGFiLT5iYXNlICsgdGFiLT5sZW47Ci0JICB0YWItPmxlbiA9IDA7Ci0JfQotICAgIH0KLSAgaWYgKHJpZ2h0X2lkcy5sZW4pCi0gICAgewotICAgICAgcmlnaHRfaWRzLmJhc2UgPSAoU3ltICopIHhtYWxsb2MgKHJpZ2h0X2lkcy5sZW4gKiBzaXplb2YgKFN5bSkpOwotICAgICAgcmlnaHRfaWRzLmxpbWl0ID0gcmlnaHRfaWRzLmJhc2UgKyByaWdodF9pZHMubGVuOwotICAgICAgcmlnaHRfaWRzLmxlbiA9IDA7Ci0gICAgfQotCi0gIC8qIG1ha2UgYSBzZWNvbmQgcGFzcyB0aHJvdWdoIHN5bXRhYiwgY3JlYXRpbmcgc3ltcyBhcyBuZWNlc3Nhcnk6ICovCi0KLSAgZm9yIChzeW0gPSBzeW10YWIuYmFzZTsgc3ltIDwgc3ltdGFiLmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBmb3IgKGlkID0gaWRfbGlzdDsgaWQ7IGlkID0gaWQtPm5leHQpCi0JewotCSAgaWYgKG1hdGNoICgmaWQtPmxlZnQuc3ltLCBzeW0pKQotCSAgICB7Ci0JICAgICAgZXh0ZW5kX21hdGNoICgmaWQtPmxlZnQsIHN5bSwgJnN5bXNbaWQtPndoaWNoX3RhYmxlXSwgVFJVRSk7Ci0JICAgIH0KLQkgIGlmIChpZC0+aGFzX3JpZ2h0ICYmIG1hdGNoICgmaWQtPnJpZ2h0LnN5bSwgc3ltKSkKLQkgICAgewotCSAgICAgIGV4dGVuZF9tYXRjaCAoJmlkLT5yaWdodCwgc3ltLCAmcmlnaHRfaWRzLCBUUlVFKTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogZ28gdGhyb3VnaCBpZHMgY3JlYXRpbmcgYXJjcyBhcyBuZWVkZWQ6ICovCi0KLSAgZm9yIChpZCA9IGlkX2xpc3Q7IGlkOyBpZCA9IGlkLT5uZXh0KQotICAgIHsKLSAgICAgIGlmIChpZC0+aGFzX3JpZ2h0KQotCXsKLQkgIGZvciAobGVmdCA9IGlkLT5sZWZ0LmZpcnN0X21hdGNoOyBsZWZ0OyBsZWZ0ID0gbGVmdC0+bmV4dCkKLQkgICAgewotCSAgICAgIGZvciAocmlnaHQgPSBpZC0+cmlnaHQuZmlyc3RfbWF0Y2g7IHJpZ2h0OyByaWdodCA9IHJpZ2h0LT5uZXh0KQotCQl7Ci0JCSAgREJHIChJRERFQlVHLAotCQkgICAgICAgcHJpbnRmICgKLQkJCQkiW3N5bV9pZF9wYXJzZV06IGFyYyAlczolcyglbHgtJWx4KSAtPiAlczolcyglbHgtJWx4KSB0byAlc1xuIiwKLQkJCQlsZWZ0LT5maWxlID8gbGVmdC0+ZmlsZS0+bmFtZSA6ICIqIiwKLQkJCQlsZWZ0LT5uYW1lID8gbGVmdC0+bmFtZSA6ICIqIiwgbGVmdC0+YWRkciwKLQkJCQlsZWZ0LT5lbmRfYWRkciwKLQkJCQlyaWdodC0+ZmlsZSA/IHJpZ2h0LT5maWxlLT5uYW1lIDogIioiLAotCQkJCXJpZ2h0LT5uYW1lID8gcmlnaHQtPm5hbWUgOiAiKiIsIHJpZ2h0LT5hZGRyLAotCQkJCXJpZ2h0LT5lbmRfYWRkciwKLQkJCQl0YWJsZV9uYW1lW2lkLT53aGljaF90YWJsZV0pKTsKLQkJICBhcmNfYWRkIChsZWZ0LCByaWdodCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIC8qIGZpbmFsbHksIHdlIGNhbiBzb3J0IHRoZSB0YWJsZXMgYW5kIHdlJ3JlIGRvbmU6ICovCi0KLSAgZm9yICh0YWIgPSAmc3ltc1swXTsgdGFiIDwgJnN5bXNbTlVNX1RBQkxFU107ICsrdGFiKQotICAgIHsKLSAgICAgIERCRyAoSURERUJVRywgcHJpbnRmICgiW3N5bV9pZF9wYXJzZV0gc3ltc1slc106XG4iLAotCQkJICAgIHRhYmxlX25hbWVbdGFiIC0gJnN5bXNbMF1dKSk7Ci0gICAgICBzeW10YWJfZmluYWxpemUgKHRhYik7Ci0gICAgfQotfQotCi0KLS8qCi0gKiBTeW1ib2wgdGFibGVzIHN0b3JpbmcgdGhlIEZST00gc3ltYm9scyBvZiBhcmNzIGRvIG5vdCBuZWNlc3NhcmlseQotICogaGF2ZSBkaXN0aW5jdCBhZGRyZXNzIHJhbmdlcy4gIEZvciBleGFtcGxlLCBzb21lYm9keSBtaWdodCByZXF1ZXN0Ci0gKiAtayAvX21jb3VudCB0byBzdXBwcmVzcyBhbnkgYXJjcyBpbnRvIF9tY291bnQsIHdoaWxlIGF0IHRoZSBzYW1lCi0gKiB0aW1lIHJlcXVlc3RpbmcgLWsgYS9iLiAgRm9ydHVuYXRlbHksIHRob3NlIHN5bWJvbCB0YWJsZXMgZG9uJ3QgZ2V0Ci0gKiB2ZXJ5IGJpZyAodGhlIHVzZXIgaGFzIHRvIHR5cGUgdGhlbSEpLCBzbyBhIGxpbmVhciBzZWFyY2ggaXMgcHJvYmFibHkKLSAqIHRvbGVyYWJsZS4KLSAqLwotYm9vbAotREVGVU4gKHN5bV9pZF9hcmNfaXNfcHJlc2VudCwgKHN5bXRhYiwgZnJvbSwgdG8pLAotICAgICAgIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgU3ltICogZnJvbSBBTkQgU3ltICogdG8pCi17Ci0gIFN5bSAqc3ltOwotCi0gIGZvciAoc3ltID0gc3ltdGFiLT5iYXNlOyBzeW0gPCBzeW10YWItPmxpbWl0OyArK3N5bSkKLSAgICB7Ci0gICAgICBpZiAoZnJvbS0+YWRkciA+PSBzeW0tPmFkZHIgJiYgZnJvbS0+YWRkciA8PSBzeW0tPmVuZF9hZGRyCi0JICAmJiBhcmNfbG9va3VwIChzeW0sIHRvKSkKLQl7Ci0JICByZXR1cm4gVFJVRTsKLQl9Ci0gICAgfQotICByZXR1cm4gRkFMU0U7Ci19CmRpZmYgLS1naXQgYS9ncHJvZi9zeW1faWRzLmggYi9ncHJvZi9zeW1faWRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTYzMzguLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltX2lkcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotI2lmbmRlZiBzeW1faWRzX2gKLSNkZWZpbmUgc3ltX2lkc19oCi0KLSNpbmNsdWRlICJzeW10YWIuaCIKLQotdHlwZWRlZiBlbnVtCi0gIHsKLSAgICBJTkNMX0dSQVBIID0gMCwgRVhDTF9HUkFQSCwKLSAgICBJTkNMX0FSQ1MsIEVYQ0xfQVJDUywKLSAgICBJTkNMX0ZMQVQsIEVYQ0xfRkxBVCwKLSAgICBJTkNMX1RJTUUsIEVYQ0xfVElNRSwKLSAgICBJTkNMX0FOTk8sIEVYQ0xfQU5OTywKLSAgICBJTkNMX0VYRUMsIEVYQ0xfRVhFQywKLSAgICBOVU1fVEFCTEVTCi0gIH0KLVRhYmxlX0lkOwotCi1leHRlcm4gU3ltX1RhYmxlIHN5bXNbTlVNX1RBQkxFU107Ci0KLWV4dGVybiB2b2lkIHN5bV9pZF9hZGQgUEFSQU1TICgoY29uc3QgY2hhciAqc3BlYywgVGFibGVfSWQgd2hpY2hfdGFibGUpKTsKLWV4dGVybiB2b2lkIHN5bV9pZF9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gYm9vbCBzeW1faWRfYXJjX2lzX3ByZXNlbnQgUEFSQU1TICgoU3ltX1RhYmxlICogc3ltdGFiLAotCQkJCQkgICBTeW0gKiBmcm9tLCBTeW0gKiB0bykpOwotCi0jZW5kaWYgLyogc3ltX2lkc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi9zeW10YWIuYyBiL2dwcm9mL3N5bXRhYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJjNjU3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL3N5bXRhYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgInN5bXRhYi5oIgotCi1TeW1fVGFibGUgc3ltdGFiOwotCi0KLS8qCi0gKiBJbml0aWFsaXplIGEgc3ltYm9sIChzbyBpdCdzIGVtcHR5KS4KLSAqLwotdm9pZAotREVGVU4gKHN5bV9pbml0LCAoc3ltKSwgU3ltICogc3ltKQotewotICBtZW1zZXQgKHN5bSwgMCwgc2l6ZW9mICgqc3ltKSk7Ci0gIC8qCi0gICAqIEl0IGlzIG5vdCBzYWZlIHRvIGFzc3VtZSB0aGF0IGEgYmluYXJ5IHplcm8gY29ycmVzcG9uZHMgdG8KLSAgICogYSBmbG9hdGluZy1wb2ludCAwLjAsIHNvIGluaXRpYWxpemUgZmxvYXRzIGV4cGxpY2l0bHk6Ci0gICAqLwotICBzeW0tPmhpc3QudGltZSA9IDAuMDsKLSAgc3ltLT5jZy5jaGlsZF90aW1lID0gMC4wOwotICBzeW0tPmNnLnByb3AuZnJhY3QgPSAwLjA7Ci0gIHN5bS0+Y2cucHJvcC5zZWxmID0gMC4wOwotICBzeW0tPmNnLnByb3AuY2hpbGQgPSAwLjA7Ci19Ci0KLQotLyoKLSAqIENvbXBhcmUgdGhlIGZ1bmN0aW9uIGVudHJ5LXBvaW50IG9mIHR3byBzeW1ib2xzIGFuZCByZXR1cm4gPDAsID0wLAotICogb3IgPjAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGxlZnQgdmFsdWUgaXMgc21hbGxlciB0aGFuLCBlcXVhbAotICogdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgcmlnaHQgdmFsdWUuICBJZiB0d28gc3ltYm9scyBhcmUgZXF1YWwKLSAqIGJ1dCBvbmUgaGFzIGlzX2Z1bmMgc2V0IGFuZCB0aGUgb3RoZXIgZG9lc24ndCwgd2UgbWFrZSB0aGUKLSAqIG5vbi1mdW5jdGlvbiBzeW1ib2wgb25lICJiaWdnZXIiIHNvIHRoYXQgdGhlIGZ1bmN0aW9uIHN5bWJvbCB3aWxsCi0gKiBzdXJ2aXZlIGR1cGxpY2F0ZSByZW1vdmFsLiAgRmluYWxseSwgaWYgYm90aCBzeW1ib2xzIGhhdmUgdGhlCi0gKiBzYW1lIGlzX2Z1bmMgdmFsdWUsIHdlIGRpc2NyaW1pbmF0ZSBhZ2FpbnN0IGlzX3N0YXRpYyBzdWNoIHRoYXQKLSAqIHRoZSBnbG9iYWwgc3ltYm9sIHN1cnZpdmVzLgotICovCi1zdGF0aWMgaW50Ci1ERUZVTiAoY21wX2FkZHIsIChscCwgcnApLCBjb25zdCBQVFIgbHAgQU5EIGNvbnN0IFBUUiBycCkKLXsKLSAgU3ltICpsZWZ0ID0gKFN5bSAqKSBscDsKLSAgU3ltICpyaWdodCA9IChTeW0gKikgcnA7Ci0KLSAgaWYgKGxlZnQtPmFkZHIgPiByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKGxlZnQtPmFkZHIgPCByaWdodC0+YWRkcikKLSAgICB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChsZWZ0LT5pc19mdW5jICE9IHJpZ2h0LT5pc19mdW5jKQotICAgIHsKLSAgICAgIHJldHVybiByaWdodC0+aXNfZnVuYyAtIGxlZnQtPmlzX2Z1bmM7Ci0gICAgfQotCi0gIHJldHVybiBsZWZ0LT5pc19zdGF0aWMgLSByaWdodC0+aXNfc3RhdGljOwotfQotCi0KLXZvaWQKLURFRlVOIChzeW10YWJfZmluYWxpemUsICh0YWIpLCBTeW1fVGFibGUgKiB0YWIpCi17Ci0gIFN5bSAqc3JjLCAqZHN0OwotICBiZmRfdm1hIHByZXZfYWRkcjsKLQotICBpZiAoIXRhYi0+bGVuKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyoKLSAgICogU29ydCBzeW1ib2wgdGFibGUgaW4gb3JkZXIgb2YgaW5jcmVhc2luZyBmdW5jdGlvbiBhZGRyZXNzZXM6Ci0gICAqLwotICBxc29ydCAodGFiLT5iYXNlLCB0YWItPmxlbiwgc2l6ZW9mIChTeW0pLCBjbXBfYWRkcik7Ci0KLSAgLyoKLSAgICogUmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzIHRvIHNwZWVkLXVwIGxhdGVyIHByb2Nlc3NpbmcgYW5kCi0gICAqIHNldCBlbmRfYWRkciBpZiBpdHMgbm90IHNldCB5ZXQ6Ci0gICAqLwotICBwcmV2X2FkZHIgPSB0YWItPmJhc2VbMF0uYWRkciArIDE7Ci0gIGZvciAoc3JjID0gZHN0ID0gdGFiLT5iYXNlOyBzcmMgPCB0YWItPmxpbWl0OyArK3NyYykKLSAgICB7Ci0gICAgICBpZiAoc3JjLT5hZGRyID09IHByZXZfYWRkcikKLQl7Ci0JICAvKgotCSAgICogSWYgc2FtZSBhZGRyZXNzLCBmYXZvciBnbG9iYWwgc3ltYm9sIG92ZXIgc3RhdGljIG9uZSwKLQkgICAqIHRoZW4gZnVuY3Rpb24gb3ZlciBsaW5lIG51bWJlci4gIElmIGJvdGggc3ltYm9scyBhcmUKLQkgICAqIGVpdGhlciBzdGF0aWMgb3IgZ2xvYmFsIGFuZCBlaXRoZXIgZnVuY3Rpb24gb3IgbGluZSwgY2hlY2sKLQkgICAqIHdoZXRoZXIgb25lIGhhcyBuYW1lIGJlZ2lubmluZyB3aXRoIHVuZGVyc2NvcmUgd2hpbGUKLQkgICAqIHRoZSBvdGhlciBkb2Vzbid0LiAgSW4gc3VjaCBjYXNlcywga2VlcCBzeW0gd2l0aG91dAotCSAgICogdW5kZXJzY29yZS4gIFRoaXMgdGFrZXMgY2FyZXMgb2YgY29tcGlsZXIgZ2VuZXJhdGVkCi0JICAgKiBzeW1ib2xzIChzdWNoIGFzIF9fZ251X2NvbXBpbGVkLCBfX2M4OV91c2VkLCBldGMuKS4KLQkgICAqLwotCSAgaWYgKCghc3JjLT5pc19zdGF0aWMgJiYgZHN0Wy0xXS5pc19zdGF0aWMpCi0JICAgICAgfHwgKChzcmMtPmlzX3N0YXRpYyA9PSBkc3RbLTFdLmlzX3N0YXRpYykKLQkJICAmJiAoKHNyYy0+aXNfZnVuYyAmJiAhZHN0Wy0xXS5pc19mdW5jKQotCQkgICAgICB8fCAoKHNyYy0+aXNfZnVuYyA9PSBkc3RbLTFdLmlzX2Z1bmMpCi0JCQkgICYmICgoc3JjLT5uYW1lWzBdICE9ICdfJyAmJiBkc3RbLTFdLm5hbWVbMF0gPT0gJ18nKQotCQkJICAgICAgfHwgKHNyYy0+bmFtZVswXQotCQkJCSAgJiYgc3JjLT5uYW1lWzFdICE9ICdfJwotCQkJCSAgJiYgZHN0Wy0xXS5uYW1lWzFdID09ICdfJykpKSkpKQotCSAgICB7Ci0JICAgICAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSBmYXZvciAlc0AlYyVjIG92ZXIgJXNAJWMlYyIsCi0JCQkgICBzcmMtPm5hbWUsIHNyYy0+aXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgc3JjLT5pc19mdW5jID8gJ0YnIDogJ2YnLAotCQkJICAgZHN0Wy0xXS5uYW1lLCBkc3RbLTFdLmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIGRzdFstMV0uaXNfZnVuYyA/ICdGJyA6ICdmJyk7Ci0JCSAgIHByaW50ZiAoIiAoYWRkcj0lbHgpXG4iLCBzcmMtPmFkZHIpKTsKLQkgICAgICBkc3RbLTFdID0gKnNyYzsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSBmYXZvciAlc0AlYyVjIG92ZXIgJXNAJWMlYyIsCi0JCQkgICBkc3RbLTFdLm5hbWUsIGRzdFstMV0uaXNfc3RhdGljID8gJ3QnIDogJ1QnLAotCQkJICAgZHN0Wy0xXS5pc19mdW5jID8gJ0YnIDogJ2YnLAotCQkJICAgc3JjLT5uYW1lLCBzcmMtPmlzX3N0YXRpYyA/ICd0JyA6ICdUJywKLQkJCSAgIHNyYy0+aXNfZnVuYyA/ICdGJyA6ICdmJyk7Ci0JCSAgIHByaW50ZiAoIiAoYWRkcj0lbHgpXG4iLCBzcmMtPmFkZHIpKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoZHN0ID4gdGFiLT5iYXNlICYmIGRzdFstMV0uZW5kX2FkZHIgPT0gMCkKLQkgICAgewotCSAgICAgIGRzdFstMV0uZW5kX2FkZHIgPSBzcmMtPmFkZHIgLSAxOwotCSAgICB9Ci0KLQkgIC8qIHJldGFpbiBzeW0gb25seSBpZiBpdCBoYXMgYSBub24tZW1wdHkgYWRkcmVzcyByYW5nZTogKi8KLQkgIGlmICghc3JjLT5lbmRfYWRkciB8fCBzcmMtPmFkZHIgPD0gc3JjLT5lbmRfYWRkcikKLQkgICAgewotCSAgICAgICpkc3QrKyA9ICpzcmM7Ci0JICAgICAgcHJldl9hZGRyID0gc3JjLT5hZGRyOwotCSAgICB9Ci0JfQotICAgIH0KLSAgaWYgKHRhYi0+bGVuID4gMCAmJiBkc3RbLTFdLmVuZF9hZGRyID09IDApCi0gICAgewotICAgICAgZHN0Wy0xXS5lbmRfYWRkciA9IGNvcmVfdGV4dF9zZWN0LT52bWEgKyBjb3JlX3RleHRfc2VjdC0+X3Jhd19zaXplIC0gMTsKLSAgICB9Ci0KLSAgREJHIChBT1VUREVCVUcgfCBJRERFQlVHLAotICAgICAgIHByaW50ZiAoIltzeW10YWJfZmluYWxpemVdOiByZW1vdmVkICVkIGR1cGxpY2F0ZSBlbnRyaWVzXG4iLAotCSAgICAgICB0YWItPmxlbiAtIChpbnQpIChkc3QgLSB0YWItPmJhc2UpKSk7Ci0KLSAgdGFiLT5saW1pdCA9IGRzdDsKLSAgdGFiLT5sZW4gPSB0YWItPmxpbWl0IC0gdGFiLT5iYXNlOwotCi0gIERCRyAoQU9VVERFQlVHIHwgSURERUJVRywKLSAgICAgICB1bnNpZ25lZCBpbnQgajsKLQotICAgICAgIGZvciAoaiA9IDA7IGogPCB0YWItPmxlbjsgKytqKQotICAgICAgIHsKLSAgICAgICBwcmludGYgKCJbc3ltdGFiX2ZpbmFsaXplXSAweCVseC0weCVseFx0JXNcbiIsCi0JICAgICAgIChsb25nKSB0YWItPmJhc2Vbal0uYWRkciwgKGxvbmcpIHRhYi0+YmFzZVtqXS5lbmRfYWRkciwKLQkgICAgICAgdGFiLT5iYXNlW2pdLm5hbWUpOwotICAgICAgIH0KLSAgKTsKLX0KLQotCi0jaWZkZWYgREVCVUcKLQotU3ltICoKLURFRlVOIChkYmdfc3ltX2xvb2t1cCwgKHN5bXRhYiwgYWRkcmVzcyksIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgYmZkX3ZtYSBhZGRyZXNzKQotewotICBsb25nIGxvdywgbWlkLCBoaWdoOwotICBTeW0gKnN5bTsKLQotICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIGFkZHJlc3MgMHglbHhcbiIsIGFkZHJlc3MpOwotCi0gIHN5bSA9IHN5bXRhYi0+YmFzZTsKLSAgZm9yIChsb3cgPSAwLCBoaWdoID0gc3ltdGFiLT5sZW4gLSAxOyBsb3cgIT0gaGlnaDspCi0gICAgewotICAgICAgbWlkID0gKGhpZ2ggKyBsb3cpID4+IDE7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIGxvdz0weCVseCwgbWlkPTB4JWx4LCBoaWdoPTB4JWx4XG4iLAotCSAgICAgICBsb3csIG1pZCwgaGlnaCk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbZGJnX3N5bV9sb29rdXBdIHN5bVttXT0weCVseCBzeW1bbSArIDFdPTB4JWx4XG4iLAotCSAgICAgICBzeW1bbWlkXS5hZGRyLCBzeW1bbWlkICsgMV0uYWRkcik7Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA8PSBhZGRyZXNzICYmIHN5bVttaWQgKyAxXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICByZXR1cm4gJnN5bVttaWRdOwotCX0KLSAgICAgIGlmIChzeW1bbWlkXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICBoaWdoID0gbWlkOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBsb3cgPSBtaWQgKyAxOwotCX0KLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIltkYmdfc3ltX2xvb2t1cF0gYmluYXJ5IHNlYXJjaCBmYWlscz8/P1xuIik7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYJLyogREVCVUcgKi8KLQotCi0vKgotICogTG9vayB1cCBhbiBhZGRyZXNzIGluIHRoZSBzeW1ib2wtdGFibGUgdGhhdCBpcyBzb3J0ZWQgYnkgYWRkcmVzcy4KLSAqIElmIGFkZHJlc3MgZG9lcyBub3QgaGl0IGFueSBzeW1ib2wsIDAgaXMgcmV0dXJuZWQuCi0gKi8KLVN5bSAqCi1ERUZVTiAoc3ltX2xvb2t1cCwgKHN5bXRhYiwgYWRkcmVzcyksIFN5bV9UYWJsZSAqIHN5bXRhYiBBTkQgYmZkX3ZtYSBhZGRyZXNzKQotewotICBsb25nIGxvdywgaGlnaDsKLSAgbG9uZyBtaWQgPSAtMTsKLSAgU3ltICpzeW07Ci0jaWZkZWYgREVCVUcKLSAgaW50IHByb2JlcyA9IDA7Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotICBpZiAoIXN5bXRhYi0+bGVuKQotICAgIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBzeW0gPSBzeW10YWItPmJhc2U7Ci0gIGZvciAobG93ID0gMCwgaGlnaCA9IHN5bXRhYi0+bGVuIC0gMTsgbG93ICE9IGhpZ2g7KQotICAgIHsKLSAgICAgIERCRyAoTE9PS1VQREVCVUcsICsrcHJvYmVzKTsKLSAgICAgIG1pZCA9IChoaWdoICsgbG93KSAvIDI7Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA8PSBhZGRyZXNzICYmIHN5bVttaWQgKyAxXS5hZGRyID4gYWRkcmVzcykKLQl7Ci0JICBpZiAoYWRkcmVzcyA+IHN5bVttaWRdLmVuZF9hZGRyKQotCSAgICB7Ci0JICAgICAgLyoKLQkgICAgICAgKiBBZGRyZXNzIGZhbGxzIGludG8gZ2FwIGJldHdlZW4gc3ltW21pZF0gYW5kCi0JICAgICAgICogc3ltW21pZCArIDFdOgotCSAgICAgICAqLwotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBEQkcgKExPT0tVUERFQlVHLAotCQkgICBwcmludGYgKCJbc3ltX2xvb2t1cF0gJWQgcHJvYmVzIChzeW10YWItPmxlbj0ldSlcbiIsCi0JCQkgICBwcm9iZXMsIHN5bXRhYi0+bGVuIC0gMSkpOwotCSAgICAgIHJldHVybiAmc3ltW21pZF07Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3ltW21pZF0uYWRkciA+IGFkZHJlc3MpCi0JewotCSAgaGlnaCA9IG1pZDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbG93ID0gbWlkICsgMTsKLQl9Ci0gICAgfQotICBpZiAoc3ltW21pZCArIDFdLmFkZHIgPD0gYWRkcmVzcykKLSAgICB7Ci0gICAgICBpZiAoYWRkcmVzcyA+IHN5bVttaWQgKyAxXS5lbmRfYWRkcikKLQl7Ci0JICAvKiBhZGRyZXNzIGlzIGJleW9uZCBlbmQgb2Ygc3ltW21pZCArIDFdOiAqLwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIERCRyAoTE9PS1VQREVCVUcsIHByaW50ZiAoIltzeW1fbG9va3VwXSAlZCAoJXUpIHByb2JlcywgZmFsbCBvZmZcbiIsCi0JCQkJICAgIHByb2Jlcywgc3ltdGFiLT5sZW4gLSAxKSk7Ci0JICByZXR1cm4gJnN5bVttaWQgKyAxXTsKLQl9Ci0gICAgfQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2dwcm9mL3N5bXRhYi5oIGIvZ3Byb2Yvc3ltdGFiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTQ1MGUuLjAwMDAwMDAKLS0tIGEvZ3Byb2Yvc3ltdGFiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotI2lmbmRlZiBzeW10YWJfaAotI2RlZmluZSBzeW10YWJfaAotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLQotLyoKLSAqIEZvciBhIHByb2ZpbGUgdG8gYmUgaW50ZWxsaWdpYmxlIHRvIGEgaHVtYW4gdXNlciwgaXQgaXMgbmVjZXNzYXJ5Ci0gKiB0byBtYXAgY29kZS1hZGRyZXNzZXMgaW50byBzb3VyY2UtY29kZSBpbmZvcm1hdGlvbi4gIFNvdXJjZS1jb2RlCi0gKiBpbmZvcm1hdGlvbiBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mOiAoaSkgZnVuY3Rpb24tbmFtZSwgKGlpKQotICogc291cmNlIGZpbGUtbmFtZSwgYW5kIChpaWkpIHNvdXJjZSBsaW5lIG51bWJlci4KLSAqCi0gKiBUaGUgc3ltYm9sIHRhYmxlIGlzIHVzZWQgdG8gbWFwIGFkZHJlc3NlcyBpbnRvIHNvdXJjZS1jb2RlCi0gKiBpbmZvcm1hdGlvbi4KLSAqLwotCi0jaW5jbHVkZSAic291cmNlLmgiCi0KLSNkZWZpbmUgTkJCUyAxMAotCi0vKgotICogU3ltYm9sLWVudHJ5LiAgRm9yIGVhY2ggZXh0ZXJuYWwgaW4gdGhlIHNwZWNpZmllZCBmaWxlIHdlIGdhdGhlcgotICogaXRzIGFkZHJlc3MsIHRoZSBudW1iZXIgb2YgY2FsbHMgYW5kIGNvbXB1dGUgaXRzIHNoYXJlIG9mIGNwdSB0aW1lLgotICovCi10eXBlZGVmIHN0cnVjdCBzeW0KLSAgewotICAgIC8qCi0gICAgICogQ29tbW9uIGluZm9ybWF0aW9uOgotICAgICAqCi0gICAgICogSW4gdGhlIHN5bWJvbC10YWJsZSwgZmllbGRzIEFERFIgYW5kIEZVTkNfTkFNRSBhcmUgZ3VhcmFudGVlZAotICAgICAqIHRvIGNvbnRhaW4gdmFsaWQgaW5mb3JtYXRpb24uICBGSUxFIG1heSBiZSAwLCBpZiB1bmtub3duIGFuZAotICAgICAqIExJTkVfTlVNIG1heWJlIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBiZmRfdm1hIGFkZHI7CQkvKiBhZGRyZXNzIG9mIGVudHJ5IHBvaW50ICovCi0gICAgYmZkX3ZtYSBlbmRfYWRkcjsJCS8qIGVuZC1hZGRyZXNzICovCi0gICAgY29uc3QgY2hhciAqbmFtZTsJCS8qIG5hbWUgb2YgZnVuY3Rpb24gdGhpcyBzeW0gaXMgZnJvbSAqLwotICAgIFNvdXJjZV9GaWxlICpmaWxlOwkJLyogc291cmNlIGZpbGUgc3ltYm9sIGNvbWVzIGZyb20gKi8KLSAgICBpbnQgbGluZV9udW07CQkvKiBzb3VyY2UgbGluZSBudW1iZXIgKi8KLSAgICB1bnNpZ25lZCBpbnQgaXNfZnVuYzoxLAkvKiBpcyB0aGlzIGEgZnVuY3Rpb24gZW50cnkgcG9pbnQ/ICovCi0gICAgICBpc19zdGF0aWM6MSwJCS8qIGlzIHRoaXMgYSBsb2NhbCAoc3RhdGljKSBzeW1ib2w/ICovCi0gICAgICBpc19iYl9oZWFkOjEsCQkvKiBpcyB0aGlzIHRoZSBoZWFkIG9mIGEgYmFzaWMtYmxrPyAqLwotICAgICAgbWFwcGVkOjEsCQkJLyogdGhpcyBzeW1ib2wgd2FzIG1hcHBlZCB0byBhbm90aGVyIG5hbWUgKi8KLSAgICAgIGhhc19iZWVuX3BsYWNlZDoxOwkvKiBoYXZlIHdlIHBsYWNlZCB0aGlzIHN5bWJvbD8gICovCi0gICAgdW5zaWduZWQgbG9uZyBuY2FsbHM7CS8qIGhvdyBtYW55IHRpbWVzIGV4ZWN1dGVkICovCi0gICAgaW50IG51c2VzOwkJCS8qIGhvdyBtYW55IHRpbWVzIHRoaXMgc3ltYm9sIGFwcGVhcnMgaW4KLQkJCQkgICBhIHBhcnRpY3VsYXIgY29udGV4dCAqLwotICAgIGJmZF92bWEgYmJfYWRkcltOQkJTXTsJLyogYWRkcmVzcyBvZiBiYXNpYy1ibG9jayBzdGFydCAqLwotICAgIHVuc2lnbmVkIGxvbmcgYmJfY2FsbHNbTkJCU107IC8qIGhvdyBtYW55IHRpbWVzIGJhc2ljLWJsb2NrIHdhcyBjYWxsZWQgKi8KLSAgICBzdHJ1Y3Qgc3ltICpuZXh0OwkJLyogZm9yIGJ1aWxkaW5nIGNoYWlucyBvZiBzeW1zICovCi0gICAgc3RydWN0IHN5bSAqcHJldjsJCS8qIGZvciBidWlsZGluZyBjaGFpbnMgb2Ygc3ltcyAqLwotCi0gICAgLyogcHJvZmlsZS1zcGVjaWZpYyBpbmZvcm1hdGlvbjogKi8KLQotICAgIC8qIGhpc3RvZ3JhbSBzcGVjaWZpYyBpbmZvOiAqLwotICAgIHN0cnVjdAotICAgICAgewotCWRvdWJsZSB0aW1lOwkJLyogKHdlaWdodGVkKSB0aWNrcyBpbiB0aGlzIHJvdXRpbmUgKi8KLQliZmRfdm1hIHNjYWxlZF9hZGRyOwkvKiBzY2FsZWQgZW50cnkgcG9pbnQgKi8KLSAgICAgIH0KLSAgICBoaXN0OwotCi0gICAgLyogY2FsbC1ncmFwaCBzcGVjaWZpYyBpbmZvOiAqLwotICAgIHN0cnVjdAotICAgICAgewotCXVuc2lnbmVkIGxvbmcgc2VsZl9jYWxsczsgLyogaG93IG1hbnkgY2FsbHMgdG8gc2VsZiAqLwotCWRvdWJsZSBjaGlsZF90aW1lOwkvKiBjdW11bGF0aXZlIHRpY2tzIGluIGNoaWxkcmVuICovCi0JaW50IGluZGV4OwkJLyogaW5kZXggaW4gdGhlIGdyYXBoIGxpc3QgKi8KLQlpbnQgdG9wX29yZGVyOwkJLyogZ3JhcGggY2FsbCBjaGFpbiB0b3Atc29ydCBvcmRlciAqLwotCWJvb2wgcHJpbnRfZmxhZzsJLyogc2hvdWxkIHRoaXMgYmUgcHJpbnRlZD8gKi8KLQlzdHJ1Y3QKLQkgIHsKLQkgICAgZG91YmxlIGZyYWN0OwkvKiB3aGF0ICUgb2YgdGltZSBwcm9wYWdhdGVzICovCi0JICAgIGRvdWJsZSBzZWxmOwkvKiBob3cgbXVjaCBzZWxmIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgICBkb3VibGUgY2hpbGQ7CS8qIGhvdyBtdWNoIGNoaWxkIHRpbWUgcHJvcGFnYXRlcyAqLwotCSAgfQotCXByb3A7Ci0Jc3RydWN0Ci0JICB7Ci0JICAgIGludCBudW07CQkvKiBpbnRlcm5hbCBudW1iZXIgb2YgY3ljbGUgb24gKi8KLQkgICAgc3RydWN0IHN5bSAqaGVhZDsJLyogaGVhZCBvZiBjeWNsZSAqLwotCSAgICBzdHJ1Y3Qgc3ltICpuZXh0OwkvKiBuZXh0IG1lbWJlciBvZiBjeWNsZSAqLwotCSAgfQotCWN5YzsKLQlzdHJ1Y3QgYXJjICpwYXJlbnRzOwkvKiBsaXN0IG9mIGNhbGxlciBhcmNzICovCi0Jc3RydWN0IGFyYyAqY2hpbGRyZW47CS8qIGxpc3Qgb2YgY2FsbGVlIGFyY3MgKi8KLSAgICAgIH0KLSAgICBjZzsKLSAgfQotU3ltOwotCi0vKgotICogU3ltYm9sLXRhYmxlcyBhcmUgYWx3YXlzIGFzc3VtZWQgdG8gYmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIKLSAqIG9mIGFkZHJlc3NlczoKLSAqLwotdHlwZWRlZiBzdHJ1Y3QKLSAgewotICAgIHVuc2lnbmVkIGludCBsZW47CQkvKiAjIG9mIHN5bWJvbHMgaW4gdGhpcyB0YWJsZSAqLwotICAgIFN5bSAqYmFzZTsJCQkvKiBmaXJzdCBlbGVtZW50IGluIHN5bWJvbCB0YWJsZSAqLwotICAgIFN5bSAqbGltaXQ7CQkJLyogbGltaXQgPSBiYXNlICsgbGVuICovCi0gIH0KLVN5bV9UYWJsZTsKLQotZXh0ZXJuIFN5bV9UYWJsZSBzeW10YWI7CS8qIHRoZSBzeW1ib2wgdGFibGUgKi8KLQotZXh0ZXJuIHZvaWQgc3ltX2luaXQgUEFSQU1TICgoU3ltICogc3ltKSk7Ci1leHRlcm4gdm9pZCBzeW10YWJfZmluYWxpemUgUEFSQU1TICgoU3ltX1RhYmxlICogc3ltdGFiKSk7Ci1leHRlcm4gU3ltICpzeW1fbG9va3VwIFBBUkFNUyAoKFN5bV9UYWJsZSAqIHN5bXRhYiwgYmZkX3ZtYSBhZGRyZXNzKSk7Ci0KLWV4dGVybiB2b2lkIGZpbmRfY2FsbCBQQVJBTVMgKChTeW0gKiwgYmZkX3ZtYSwgYmZkX3ZtYSkpOwotCi0jZW5kaWYgLyogc3ltdGFiX2ggKi8KZGlmZiAtLWdpdCBhL2dwcm9mL3RhaG9lLmMgYi9ncHJvZi90YWhvZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTMzYzE3Li4wMDAwMDAwCi0tLSBhL2dwcm9mL3RhaG9lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBkaXN0cmlidXRpb25zIHJldGFpbiB0aGlzIGVudGlyZSBjb3B5cmlnaHQKLSAqIG5vdGljZSBhbmQgY29tbWVudCwgYW5kICgyKSBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcmllcyBkaXNwbGF5Ci0gKiB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDogIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlCi0gKiBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMnJwotICogaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbgotICogYW5kIGluIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcwotICogc29mdHdhcmUuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKLSAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCi0gKi8KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJjb3JlZmlsZS5oIgotI2luY2x1ZGUgImhpc3QuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotICAgIC8qCi0gICAgICogICAgICAgIG9wY29kZSBvZiB0aGUgYGNhbGxmJyBpbnN0cnVjdGlvbgotICAgICAqLwotI2RlZmluZQlDQUxMRgkweGZlCi0KLSAgICAvKgotICAgICAqICAgICAgICByZWdpc3RlciBmb3IgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotICAgICAqLwotI2RlZmluZQlQQwkweGYKLQotZW51bSB0YWhvZV9vcGVybW9kZXMKLSAgewotICAgIGxpdGVyYWwsIGluZGV4ZWQsIHJlZywgcmVnZGVmLCBhdXRvZGVjLCBhdXRvaW5jLCBhdXRvaW5jZGVmLAotICAgIGJ5dGVkaXNwLCBieXRlZGlzcGRlZiwgd29yZGRpc3AsIHdvcmRkaXNwZGVmLCBsb25nZGlzcCwgbG9uZ2Rpc3BkZWYsCi0gICAgaW1tZWRpYXRlLCBhYnNvbHV0ZSwgYnl0ZXJlbCwgYnl0ZXJlbGRlZiwgd29yZHJlbCwgd29yZHJlbGRlZiwKLSAgICBsb25ncmVsLCBsb25ncmVsZGVmCi0gIH07Ci10eXBlZGVmIGVudW0gdGFob2Vfb3Blcm1vZGVzIHRhaG9lX29wZXJhbmRlbnVtOwotCi0vKgotICogQSBzeW1ib2wgdG8gYmUgdGhlIGNoaWxkIG9mIGluZGlyZWN0IGNhbGxmOgotICovCi1TeW0gaW5kaXJlY3RjaGlsZDsKLQotCi10YWhvZV9vcGVyYW5kZW51bQotdGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKQotICAgICB1bnNpZ25lZCBjaGFyICptb2RlcDsKLXsKLSAgbG9uZyB1c2VzcmVnID0gKChsb25nKSAqbW9kZXApICYgMHhmOwotCi0gIHN3aXRjaCAoKChsb25nKSAqbW9kZXApID4+IDQpCi0gICAgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiBsaXRlcmFsOwotICAgIGNhc2UgNDoKLSAgICAgIHJldHVybiBpbmRleGVkOwotICAgIGNhc2UgNToKLSAgICAgIHJldHVybiByZWc7Ci0gICAgY2FzZSA2OgotICAgICAgcmV0dXJuIHJlZ2RlZjsKLSAgICBjYXNlIDc6Ci0gICAgICByZXR1cm4gYXV0b2RlYzsKLSAgICBjYXNlIDg6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSAweGUgPyBhdXRvaW5jIDogaW1tZWRpYXRlOwotICAgIGNhc2UgOToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luY2RlZiA6IGFic29sdXRlOwotICAgIGNhc2UgMTA6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGJ5dGVkaXNwIDogYnl0ZXJlbDsKLSAgICBjYXNlIDExOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcGRlZiA6IGJ5dGVyZWxkZWY7Ci0gICAgY2FzZSAxMjoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gd29yZGRpc3AgOiB3b3JkcmVsOwotICAgIGNhc2UgMTM6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwZGVmIDogd29yZHJlbGRlZjsKLSAgICBjYXNlIDE0OgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBsb25nZGlzcCA6IGxvbmdyZWw7Ci0gICAgY2FzZSAxNToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3BkZWYgOiBsb25ncmVsZGVmOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotY2hhciAqCi10YWhvZV9vcGVyYW5kbmFtZSAobW9kZSkKLSAgICAgdGFob2Vfb3BlcmFuZGVudW0gbW9kZTsKLXsKLQotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICAgIHJldHVybiAibGl0ZXJhbCI7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuICJpbmRleGVkIjsKLSAgICBjYXNlIHJlZzoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIiOwotICAgIGNhc2UgcmVnZGVmOgotICAgICAgcmV0dXJuICJyZWdpc3RlciBkZWZlcnJlZCI7Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgICAgcmV0dXJuICJhdXRvZGVjcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUiOwotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUiOwotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgICByZXR1cm4gImltbWVkaWF0ZSI7Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICAgIHJldHVybiAiYWJzb2x1dGUiOwotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIjsKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotbG9uZwotdGFob2Vfb3BlcmFuZGxlbmd0aCAobW9kZXApCi0gICAgIHVuc2lnbmVkIGNoYXIgKm1vZGVwOwotewotCi0gIHN3aXRjaCAodGFob2Vfb3BlcmFuZG1vZGUgKG1vZGVwKSkKLSAgICB7Ci0gICAgY2FzZSBsaXRlcmFsOgotICAgIGNhc2UgcmVnOgotICAgIGNhc2UgcmVnZGVmOgotICAgIGNhc2UgYXV0b2RlYzoKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgY2FzZSBhdXRvaW5jZGVmOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICBjYXNlIGJ5dGVkaXNwZGVmOgotICAgIGNhc2UgYnl0ZXJlbDoKLSAgICBjYXNlIGJ5dGVyZWxkZWY6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIHdvcmRkaXNwOgotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgY2FzZSB3b3JkcmVsOgotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAzOwotICAgIGNhc2UgaW1tZWRpYXRlOgotICAgIGNhc2UgYWJzb2x1dGU6Ci0gICAgY2FzZSBsb25nZGlzcDoKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgIGNhc2UgbG9uZ3JlbDoKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gNTsKLSAgICBjYXNlIGluZGV4ZWQ6Ci0gICAgICByZXR1cm4gMSArIHRhaG9lX29wZXJhbmRsZW5ndGggKG1vZGVwICsgMSk7Ci0gICAgfQotICAvKiBOT1RSRUFDSEVEICovCi0gIGFib3J0ICgpOwotfQotCi1iZmRfdm1hCi10YWhvZV9yZWxhZGRyIChtb2RlcCkKLSAgICAgY2hhciAqbW9kZXA7Ci17Ci0gIHRhaG9lX29wZXJhbmRlbnVtIG1vZGUgPSB0YWhvZV9vcGVyYW5kbW9kZSAobW9kZXApOwotICBjaGFyICpjcDsKLSAgc2hvcnQgKnNwOwotICBsb25nICpscDsKLSAgaW50IGk7Ci0gIGxvbmcgdmFsdWUgPSAwOwotCi0gIGNwID0gbW9kZXA7Ci0gICsrY3A7CQkJCS8qIHNraXAgb3ZlciB0aGUgbW9kZSAqLwotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJbcmVsYWRkcl0gbm90IHJlbGF0aXZlIGFkZHJlc3NcbiIpOwotICAgICAgcmV0dXJuIChiZmRfdm1hKSBtb2RlcDsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqY3AgKyAqY3ApOwotICAgIGNhc2Ugd29yZHJlbDoKLSAgICAgIGZvciAoaSA9IDA7IChzaXplX3QpIGkgPCBzaXplb2YgKnNwOyBpKyspCi0JdmFsdWUgPSAodmFsdWUgPDwgOCkgKyAoY3BbaV0gJiAweGZmKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpzcCArIHZhbHVlKTsKLSAgICBjYXNlIGxvbmdyZWw6Ci0gICAgICBmb3IgKGkgPSAwOyAoc2l6ZV90KSBpIDwgc2l6ZW9mICpscDsgaSsrKQotCXZhbHVlID0gKHZhbHVlIDw8IDgpICsgKGNwW2ldICYgMHhmZik7Ci0gICAgICByZXR1cm4gKGJmZF92bWEpIChjcCArIHNpemVvZiAqbHAgKyB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkCi10YWhvZV9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgbG9uZyBsZW5ndGg7Ci0gIFN5bSAqY2hpbGQ7Ci0gIHRhaG9lX29wZXJhbmRlbnVtIG1vZGU7Ci0gIHRhaG9lX29wZXJhbmRlbnVtIGZpcnN0bW9kZTsKLSAgYmZkX3ZtYSBkZXN0cGM7Ci0gIHN0YXRpYyBib29sIGluaXRlZCA9IEZBTFNFOwotCi0gIGlmICghaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IFRSVUU7Ci0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0Y2hpbGQpOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5jeWMuaGVhZCA9ICZpbmRpcmVjdGNoaWxkOwotICAgIH0KLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCBwX2xvd3BjLCBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfbG93cGM7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9oaWdocGM7Ci0gICAgICAgaW5zdHJ1Y3RwICs9IGxlbmd0aCkKLSAgICB7Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgaWYgKCppbnN0cnVjdHAgPT0gQ0FMTEYpCi0JewotCSAgLyoKLQkgICAqICAgIG1heWJlIGEgY2FsbGYsIGJldHRlciBjaGVjayBpdCBvdXQuCi0JICAgKiAgICAgIHNraXAgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywgcHJpbnRmICgiW2ZpbmRjYWxsXVx0MHgleDpjYWxsZiIsCi0JCQkJICBpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UpKTsKLQkgIGZpcnN0bW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgc3dpdGNoIChmaXJzdG1vZGUpCi0JICAgIHsKLQkgICAgY2FzZSBsaXRlcmFsOgotCSAgICBjYXNlIGltbWVkaWF0ZToKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBnb3RvIGJvdGNoZWQ7Ci0JICAgIH0KLQkgIGxlbmd0aCArPSB0YWhvZV9vcGVyYW5kbGVuZ3RoIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgbW9kZSA9IHRhaG9lX29wZXJhbmRtb2RlIChpbnN0cnVjdHAgKyBsZW5ndGgpOwotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIlx0Zmlyc3Qgb3BlcmFuZCBpcyAlcyIsIHRhaG9lX29wZXJhbmRuYW1lIChmaXJzdG1vZGUpKTsKLQkgICAgICAgcHJpbnRmICgiXHRzZWNvbmQgb3BlcmFuZCBpcyAlc1xuIiwgdGFob2Vfb3BlcmFuZG5hbWUgKG1vZGUpKTsKLQkgICAgKTsKLQkgIHN3aXRjaCAobW9kZSkKLQkgICAgewotCSAgICBjYXNlIHJlZ2RlZjoKLQkgICAgY2FzZSBieXRlZGlzcGRlZjoKLQkgICAgY2FzZSB3b3JkZGlzcGRlZjoKLQkgICAgY2FzZSBsb25nZGlzcGRlZjoKLQkgICAgY2FzZSBieXRlcmVsZGVmOgotCSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0JICAgIGNhc2UgbG9uZ3JlbGRlZjoKLQkgICAgICAvKgotCSAgICAgICAqICAgIGluZGlyZWN0IGNhbGw6IGNhbGwgdGhyb3VnaCBwb2ludGVyCi0JICAgICAgICogICAgICBlaXRoZXIgICpkKHIpICAgYXMgYSBwYXJhbWV0ZXIgb3IgbG9jYWwKLQkgICAgICAgKiAgICAgICAgICAgICAgKHIpICAgICBhcyBhIHJldHVybiB2YWx1ZQotCSAgICAgICAqICAgICAgICAgICAgICAqZiAgICAgIGFzIGEgZ2xvYmFsIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIFthcmUgdGhlcmUgb3RoZXJzIHRoYXQgd2UgbWlzcz8sCi0JICAgICAgICogICAgICAgZS5nLiBhcnJheXMgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zPz8/XQotCSAgICAgICAqLwotCSAgICAgIGFyY19hZGQgKHBhcmVudCwgJmluZGlyZWN0Y2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkgICAgICBsZW5ndGggKz0gdGFob2Vfb3BlcmFuZGxlbmd0aCAoaW5zdHJ1Y3RwICsgbGVuZ3RoKTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgY2FzZSBieXRlcmVsOgotCSAgICBjYXNlIHdvcmRyZWw6Ci0JICAgIGNhc2UgbG9uZ3JlbDoKLQkgICAgICAvKgotCSAgICAgICAqICAgIHJlZ3VsYXIgcGMgcmVsYXRpdmUgYWRkcmVzc2luZwotCSAgICAgICAqICAgICAgY2hlY2sgdGhhdCB0aGlzIGlzIHRoZSBhZGRyZXNzIG9mIAotCSAgICAgICAqICAgICAgYSBmdW5jdGlvbi4KLQkgICAgICAgKi8KLQkgICAgICBkZXN0cGMgPSB0YWhvZV9yZWxhZGRyIChpbnN0cnVjdHAgKyBsZW5ndGgpCi0JCS0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZTsKLQkgICAgICBpZiAoZGVzdHBjID49IHNfbG93cGMgJiYgZGVzdHBjIDw9IHNfaGlnaHBjKQotCQl7Ci0JCSAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0cGMpOwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiW2ZpbmRjYWxsXVx0ZGVzdHBjIDB4JWx4IiwgZGVzdHBjKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+bmFtZSAlcyIsIGNoaWxkLT5uYW1lKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+YWRkciAweCVseFxuIiwgY2hpbGQtPmFkZHIpOwotCQkgICAgKTsKLQkJICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdHBjKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgICBhIGhpdAotCQkgICAgICAgKi8KLQkJICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgICAgICBsZW5ndGggKz0gdGFob2Vfb3BlcmFuZGxlbmd0aCAoaW5zdHJ1Y3RwICsgbGVuZ3RoKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZ290byBib3RjaGVkOwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBlbHNlOgotCSAgICAgICAqICAgICAgaXQgbG9va2VkIGxpa2UgYSBjYWxsZiwKLQkgICAgICAgKiAgICAgIGJ1dCBpdCB3YXNuJ3QgdG8gYW55d2hlcmUuCi0JICAgICAgICovCi0JICAgICAgZ290byBib3RjaGVkOwotCSAgICBkZWZhdWx0OgotCSAgICBib3RjaGVkOgotCSAgICAgIC8qCi0JICAgICAgICogICAgc29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICAgICAqLwotCSAgICAgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICAgICAgbGVuZ3RoID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9ncHJvZi91dGlscy5jIGIvZ3Byb2YvdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmMDMxZC4uMDAwMDAwMAotLS0gYS9ncHJvZi91dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSA8ZGVtYW5nbGUuaD4KLSNpbmNsdWRlICJncHJvZi5oIgotI2luY2x1ZGUgImNnX2FyY3MuaCIKLSNpbmNsdWRlICJzeW10YWIuaCIKLQotCi0vKgotICogUHJpbnQgbmFtZSBvZiBzeW1ib2wuICBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcHJpbnRlZC4KLSAqLwotaW50Ci1ERUZVTiAocHJpbnRfbmFtZV9vbmx5LCAoc2VsZiksIFN5bSAqIHNlbGYpCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBzZWxmLT5uYW1lOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqZGVtYW5nbGVkID0gMDsKLSAgY2hhciBidWZbUEFUSF9NQVhdOwotICBpbnQgc2l6ZSA9IDA7Ci0KLSAgaWYgKG5hbWUpCi0gICAgewotICAgICAgaWYgKCFic2Rfc3R5bGVfb3V0cHV0KQotCXsKLQkgIGlmIChuYW1lWzBdID09ICdfJyAmJiBuYW1lWzFdICYmIGRpc2NhcmRfdW5kZXJzY29yZXMpCi0JICAgIHsKLQkgICAgICBuYW1lKys7Ci0JICAgIH0KLQkgIGlmIChkZW1hbmdsZSkKLQkgICAgewotCSAgICAgIGRlbWFuZ2xlZCA9IGNwbHVzX2RlbWFuZ2xlIChuYW1lLCBETUdMX0FOU0kgfCBETUdMX1BBUkFNUyk7Ci0JICAgICAgaWYgKGRlbWFuZ2xlZCkKLQkJewotCQkgIG5hbWUgPSBkZW1hbmdsZWQ7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIHByaW50ZiAoIiVzIiwgbmFtZSk7Ci0gICAgICBzaXplID0gc3RybGVuIChuYW1lKTsKLSAgICAgIGlmIChsaW5lX2dyYW51bGFyaXR5ICYmIHNlbGYtPmZpbGUpCi0JewotCSAgZmlsZW5hbWUgPSBzZWxmLT5maWxlLT5uYW1lOwotCSAgaWYgKCFwcmludF9wYXRoKQotCSAgICB7Ci0JICAgICAgZmlsZW5hbWUgPSBzdHJyY2hyIChmaWxlbmFtZSwgJy8nKTsKLQkgICAgICBpZiAoZmlsZW5hbWUpCi0JCXsKLQkJICArK2ZpbGVuYW1lOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgZmlsZW5hbWUgPSBzZWxmLT5maWxlLT5uYW1lOwotCQl9Ci0JICAgIH0KLQkgIHNwcmludGYgKGJ1ZiwgIiAoJXM6JWQpIiwgZmlsZW5hbWUsIHNlbGYtPmxpbmVfbnVtKTsKLQkgIHByaW50ZiAoYnVmKTsKLQkgIHNpemUgKz0gc3RybGVuIChidWYpOwotCX0KLSAgICAgIGlmIChkZW1hbmdsZWQpCi0JewotCSAgZnJlZSAoZGVtYW5nbGVkKTsKLQl9Ci0gICAgICBEQkcgKERGTkRFQlVHLCBwcmludGYgKCJ7JWR9ICIsIHNlbGYtPmNnLnRvcF9vcmRlcikpOwotICAgICAgREJHIChQUk9QREVCVUcsIHByaW50ZiAoIiU0LjBmJSUgIiwgMTAwLjAgKiBzZWxmLT5jZy5wcm9wLmZyYWN0KSk7Ci0gICAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotCi12b2lkCi1ERUZVTiAocHJpbnRfbmFtZSwgKHNlbGYpLCBTeW0gKiBzZWxmKQotewotICBwcmludF9uYW1lX29ubHkgKHNlbGYpOwotCi0gIGlmIChzZWxmLT5jZy5jeWMubnVtICE9IDApCi0gICAgewotICAgICAgcHJpbnRmIChfKCIgPGN5Y2xlICVkPiIpLCBzZWxmLT5jZy5jeWMubnVtKTsKLSAgICB9Ci0gIGlmIChzZWxmLT5jZy5pbmRleCAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzZWxmLT5jZy5wcmludF9mbGFnKQotCXsKLQkgIHByaW50ZiAoIiBbJWRdIiwgc2VsZi0+Y2cuaW5kZXgpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKCIgKCVkKSIsIHNlbGYtPmNnLmluZGV4KTsKLQl9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvZ3Byb2YvdXRpbHMuaCBiL2dwcm9mL3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZmI5YzYuLjAwMDAwMDAKLS0tIGEvZ3Byb2YvdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2lmbmRlZiB1dGlsc19oCi0jZGVmaW5lIHV0aWxzX2gKLQotZXh0ZXJuIGludCBwcmludF9uYW1lX29ubHkgUEFSQU1TICgoU3ltICogc2VsZikpOwotZXh0ZXJuIHZvaWQgcHJpbnRfbmFtZSBQQVJBTVMgKChTeW0gKiBzZWxmKSk7Ci0KLSNlbmRpZiAvKiB1dGlsc19oICovCmRpZmYgLS1naXQgYS9ncHJvZi92YXguYyBiL2dwcm9mL3ZheC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTdiZDhkLi4wMDAwMDAwCi0tLSBhL2dwcm9mL3ZheC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKLSAqIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgZGlzdHJpYnV0aW9ucyByZXRhaW4gdGhpcyBlbnRpcmUgY29weXJpZ2h0Ci0gKiBub3RpY2UgYW5kIGNvbW1lbnQsIGFuZCAoMikgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJpZXMgZGlzcGxheQotICogdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6ICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZQotICogZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzJycKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24KLSAqIGFuZCBpbiBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMKLSAqIHNvZnR3YXJlLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0jaW5jbHVkZSAiZ3Byb2YuaCIKLSNpbmNsdWRlICJjZ19hcmNzLmgiCi0jaW5jbHVkZSAiY29yZWZpbGUuaCIKLSNpbmNsdWRlICJoaXN0LmgiCi0jaW5jbHVkZSAic3ltdGFiLmgiCi0KLSAgICAvKgotICAgICAqICAgICAgICBvcGNvZGUgb2YgdGhlIGBjYWxscycgaW5zdHJ1Y3Rpb24KLSAgICAgKi8KLSNkZWZpbmUJQ0FMTFMJMHhmYgotCi0gICAgLyoKLSAgICAgKiAgICAgICAgcmVnaXN0ZXIgZm9yIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSAgICAgKi8KLSNkZWZpbmUJUEMJMHhmCi0KLWVudW0gb3Blcm1vZGVzCi0gIHsKLSAgICBsaXRlcmFsLCBpbmRleGVkLCByZWcsIHJlZ2RlZiwgYXV0b2RlYywgYXV0b2luYywgYXV0b2luY2RlZiwKLSAgICBieXRlZGlzcCwgYnl0ZWRpc3BkZWYsIHdvcmRkaXNwLCB3b3JkZGlzcGRlZiwgbG9uZ2Rpc3AsIGxvbmdkaXNwZGVmLAotICAgIGltbWVkaWF0ZSwgYWJzb2x1dGUsIGJ5dGVyZWwsIGJ5dGVyZWxkZWYsIHdvcmRyZWwsIHdvcmRyZWxkZWYsCi0gICAgbG9uZ3JlbCwgbG9uZ3JlbGRlZgotICB9OwotdHlwZWRlZiBlbnVtIG9wZXJtb2RlcyBvcGVyYW5kZW51bTsKLQotc3RydWN0IG1vZGVieXRlCi0gIHsKLSAgICB1bnNpZ25lZCBpbnQgcmVnZmllbGQ6NDsKLSAgICB1bnNpZ25lZCBpbnQgbW9kZWZpZWxkOjQ7Ci0gIH07Ci0KLS8qCi0gKiBBIHN5bWJvbCB0byBiZSB0aGUgY2hpbGQgb2YgaW5kaXJlY3QgY2FsbHM6Ci0gKi8KLVN5bSBpbmRpcmVjdGNoaWxkOwotCi0KLXN0YXRpYyBvcGVyYW5kZW51bQotdmF4X29wZXJhbmRtb2RlIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLSAgbG9uZyB1c2VzcmVnID0gbW9kZXAtPnJlZ2ZpZWxkOwotCi0gIHN3aXRjaCAobW9kZXAtPm1vZGVmaWVsZCkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIGxpdGVyYWw7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIGluZGV4ZWQ7Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIHJlZzsKLSAgICBjYXNlIDY6Ci0gICAgICByZXR1cm4gcmVnZGVmOwotICAgIGNhc2UgNzoKLSAgICAgIHJldHVybiBhdXRvZGVjOwotICAgIGNhc2UgODoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYXV0b2luYyA6IGltbWVkaWF0ZTsKLSAgICBjYXNlIDk6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGF1dG9pbmNkZWYgOiBhYnNvbHV0ZTsKLSAgICBjYXNlIDEwOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyBieXRlZGlzcCA6IGJ5dGVyZWw7Ci0gICAgY2FzZSAxMToKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gYnl0ZWRpc3BkZWYgOiBieXRlcmVsZGVmOwotICAgIGNhc2UgMTI6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IHdvcmRkaXNwIDogd29yZHJlbDsKLSAgICBjYXNlIDEzOgotICAgICAgcmV0dXJuIHVzZXNyZWcgIT0gUEMgPyB3b3JkZGlzcGRlZiA6IHdvcmRyZWxkZWY7Ci0gICAgY2FzZSAxNDoKLSAgICAgIHJldHVybiB1c2VzcmVnICE9IFBDID8gbG9uZ2Rpc3AgOiBsb25ncmVsOwotICAgIGNhc2UgMTU6Ci0gICAgICByZXR1cm4gdXNlc3JlZyAhPSBQQyA/IGxvbmdkaXNwZGVmIDogbG9uZ3JlbGRlZjsKLSAgICB9Ci0gIC8qIE5PVFJFQUNIRUQgKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLXZheF9vcGVyYW5kbmFtZSAobW9kZSkKLSAgICAgb3BlcmFuZGVudW0gbW9kZTsKLXsKLQotICBzd2l0Y2ggKG1vZGUpCi0gICAgewotICAgIGNhc2UgbGl0ZXJhbDoKLSAgICAgIHJldHVybiAibGl0ZXJhbCI7Ci0gICAgY2FzZSBpbmRleGVkOgotICAgICAgcmV0dXJuICJpbmRleGVkIjsKLSAgICBjYXNlIHJlZzoKLSAgICAgIHJldHVybiAicmVnaXN0ZXIiOwotICAgIGNhc2UgcmVnZGVmOgotICAgICAgcmV0dXJuICJyZWdpc3RlciBkZWZlcnJlZCI7Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgICAgcmV0dXJuICJhdXRvZGVjcmVtZW50IjsKLSAgICBjYXNlIGF1dG9pbmM6Ci0gICAgICByZXR1cm4gImF1dG9pbmNyZW1lbnQiOwotICAgIGNhc2UgYXV0b2luY2RlZjoKLSAgICAgIHJldHVybiAiYXV0b2luY3JlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBieXRlZGlzcDoKLSAgICAgIHJldHVybiAiYnl0ZSBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgICByZXR1cm4gImJ5dGUgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIGJ5dGVyZWw6Ci0gICAgICByZXR1cm4gImJ5dGUgcmVsYXRpdmUiOwotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAiYnl0ZSByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSB3b3JkZGlzcDoKLSAgICAgIHJldHVybiAid29yZCBkaXNwbGFjZW1lbnQiOwotICAgIGNhc2Ugd29yZGRpc3BkZWY6Ci0gICAgICByZXR1cm4gIndvcmQgZGlzcGxhY2VtZW50IGRlZmVycmVkIjsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICByZXR1cm4gIndvcmQgcmVsYXRpdmUiOwotICAgIGNhc2Ugd29yZHJlbGRlZjoKLSAgICAgIHJldHVybiAid29yZCByZWxhdGl2ZSBkZWZlcnJlZCI7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgICByZXR1cm4gImltbWVkaWF0ZSI7Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICAgIHJldHVybiAiYWJzb2x1dGUiOwotICAgIGNhc2UgbG9uZ2Rpc3A6Ci0gICAgICByZXR1cm4gImxvbmcgZGlzcGxhY2VtZW50IjsKLSAgICBjYXNlIGxvbmdkaXNwZGVmOgotICAgICAgcmV0dXJuICJsb25nIGRpc3BsYWNlbWVudCBkZWZlcnJlZCI7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgcmV0dXJuICJsb25nIHJlbGF0aXZlIjsKLSAgICBjYXNlIGxvbmdyZWxkZWY6Ci0gICAgICByZXR1cm4gImxvbmcgcmVsYXRpdmUgZGVmZXJyZWQiOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGxvbmcKLXZheF9vcGVyYW5kbGVuZ3RoIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLQotICBzd2l0Y2ggKHZheF9vcGVyYW5kbW9kZSAobW9kZXApKQotICAgIHsKLSAgICBjYXNlIGxpdGVyYWw6Ci0gICAgY2FzZSByZWc6Ci0gICAgY2FzZSByZWdkZWY6Ci0gICAgY2FzZSBhdXRvZGVjOgotICAgIGNhc2UgYXV0b2luYzoKLSAgICBjYXNlIGF1dG9pbmNkZWY6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIGJ5dGVkaXNwOgotICAgIGNhc2UgYnl0ZWRpc3BkZWY6Ci0gICAgY2FzZSBieXRlcmVsOgotICAgIGNhc2UgYnl0ZXJlbGRlZjoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2Ugd29yZGRpc3A6Ci0gICAgY2FzZSB3b3JkZGlzcGRlZjoKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgY2FzZSB3b3JkcmVsZGVmOgotICAgICAgcmV0dXJuIDM7Ci0gICAgY2FzZSBpbW1lZGlhdGU6Ci0gICAgY2FzZSBhYnNvbHV0ZToKLSAgICBjYXNlIGxvbmdkaXNwOgotICAgIGNhc2UgbG9uZ2Rpc3BkZWY6Ci0gICAgY2FzZSBsb25ncmVsOgotICAgIGNhc2UgbG9uZ3JlbGRlZjoKLSAgICAgIHJldHVybiA1OwotICAgIGNhc2UgaW5kZXhlZDoKLSAgICAgIHJldHVybiAxICsgdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKChjaGFyICopIG1vZGVwKSArIDEpOwotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotICBhYm9ydCAoKTsKLX0KLQotc3RhdGljIGJmZF92bWEKLXZheF9yZWxhZGRyIChtb2RlcCkKLSAgICAgc3RydWN0IG1vZGVieXRlICptb2RlcDsKLXsKLSAgb3BlcmFuZGVudW0gbW9kZSA9IHZheF9vcGVyYW5kbW9kZSAobW9kZXApOwotICBjaGFyICpjcDsKLSAgc2hvcnQgKnNwOwotICBsb25nICpscDsKLQotICBjcCA9IChjaGFyICopIG1vZGVwOwotICArK2NwOwkJCQkvKiBza2lwIG92ZXIgdGhlIG1vZGUgKi8KLSAgc3dpdGNoIChtb2RlKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiW3JlbGFkZHJdIG5vdCByZWxhdGl2ZSBhZGRyZXNzXG4iKTsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgbW9kZXA7Ci0gICAgY2FzZSBieXRlcmVsOgotICAgICAgcmV0dXJuIChiZmRfdm1hKSAoY3AgKyBzaXplb2YgKmNwICsgKmNwKTsKLSAgICBjYXNlIHdvcmRyZWw6Ci0gICAgICBzcCA9IChzaG9ydCAqKSBjcDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpzcCArICpzcCk7Ci0gICAgY2FzZSBsb25ncmVsOgotICAgICAgbHAgPSAobG9uZyAqKSBjcDsKLSAgICAgIHJldHVybiAoYmZkX3ZtYSkgKGNwICsgc2l6ZW9mICpscCArICpscCk7Ci0gICAgfQotfQotCi0KLXZvaWQKLXZheF9maW5kX2NhbGwgKHBhcmVudCwgcF9sb3dwYywgcF9oaWdocGMpCi0gICAgIFN5bSAqcGFyZW50OwotICAgICBiZmRfdm1hIHBfbG93cGM7Ci0gICAgIGJmZF92bWEgcF9oaWdocGM7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgKmluc3RydWN0cDsKLSAgbG9uZyBsZW5ndGg7Ci0gIFN5bSAqY2hpbGQ7Ci0gIG9wZXJhbmRlbnVtIG1vZGU7Ci0gIG9wZXJhbmRlbnVtIGZpcnN0bW9kZTsKLSAgYmZkX3ZtYSBkZXN0cGM7Ci0gIHN0YXRpYyBib29sIGluaXRlZCA9IEZBTFNFOwotCi0gIGlmICghaW5pdGVkKQotICAgIHsKLSAgICAgIGluaXRlZCA9IFRSVUU7Ci0gICAgICBzeW1faW5pdCAoJmluZGlyZWN0Y2hpbGQpOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5wcm9wLmZyYWN0ID0gMS4wOwotICAgICAgaW5kaXJlY3RjaGlsZC5jZy5jeWMuaGVhZCA9ICZpbmRpcmVjdGNoaWxkOwotICAgIH0KLQotICBpZiAoY29yZV90ZXh0X3NwYWNlID09IDApCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKHBfbG93cGMgPCBzX2xvd3BjKQotICAgIHsKLSAgICAgIHBfbG93cGMgPSBzX2xvd3BjOwotICAgIH0KLSAgaWYgKHBfaGlnaHBjID4gc19oaWdocGMpCi0gICAgewotICAgICAgcF9oaWdocGMgPSBzX2hpZ2hwYzsKLSAgICB9Ci0gIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdICVzOiAweCVseCB0byAweCVseFxuIiwKLQkJCSAgcGFyZW50LT5uYW1lLCBwX2xvd3BjLCBwX2hpZ2hwYykpOwotICBmb3IgKGluc3RydWN0cCA9ICh1bnNpZ25lZCBjaGFyICopIGNvcmVfdGV4dF9zcGFjZSArIHBfbG93cGM7Ci0gICAgICAgaW5zdHJ1Y3RwIDwgKHVuc2lnbmVkIGNoYXIgKikgY29yZV90ZXh0X3NwYWNlICsgcF9oaWdocGM7Ci0gICAgICAgaW5zdHJ1Y3RwICs9IGxlbmd0aCkKLSAgICB7Ci0gICAgICBsZW5ndGggPSAxOwotICAgICAgaWYgKCppbnN0cnVjdHAgPT0gQ0FMTFMpCi0JewotCSAgLyoKLQkgICAqICAgIG1heWJlIGEgY2FsbHMsIGJldHRlciBjaGVjayBpdCBvdXQuCi0JICAgKiAgICAgIHNraXAgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgotCSAgICovCi0JICBEQkcgKENBTExERUJVRywKLQkgICAgICAgcHJpbnRmICgiW2ZpbmRjYWxsXVx0MHgleDpjYWxscyIsCi0JCSAgICAgICBpbnN0cnVjdHAgLSAodW5zaWduZWQgY2hhciAqKSBjb3JlX3RleHRfc3BhY2UpKTsKLQkgIGZpcnN0bW9kZSA9IHZheF9vcGVyYW5kbW9kZSAoKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JICBzd2l0Y2ggKGZpcnN0bW9kZSkKLQkgICAgewotCSAgICBjYXNlIGxpdGVyYWw6Ci0JICAgIGNhc2UgaW1tZWRpYXRlOgotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGdvdG8gYm90Y2hlZDsKLQkgICAgfQotCSAgbGVuZ3RoICs9IHZheF9vcGVyYW5kbGVuZ3RoICgoc3RydWN0IG1vZGVieXRlICopIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkgIG1vZGUgPSB2YXhfb3BlcmFuZG1vZGUgKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpOwotCSAgREJHIChDQUxMREVCVUcsCi0JICAgICAgIHByaW50ZiAoIlx0Zmlyc3Qgb3BlcmFuZCBpcyAlcyIsIHZheF9vcGVyYW5kbmFtZSAoZmlyc3Rtb2RlKSk7Ci0JICAgICAgIHByaW50ZiAoIlx0c2Vjb25kIG9wZXJhbmQgaXMgJXNcbiIsIHZheF9vcGVyYW5kbmFtZSAobW9kZSkpKTsKLQkgIHN3aXRjaCAobW9kZSkKLQkgICAgewotCSAgICBjYXNlIHJlZ2RlZjoKLQkgICAgY2FzZSBieXRlZGlzcGRlZjoKLQkgICAgY2FzZSB3b3JkZGlzcGRlZjoKLQkgICAgY2FzZSBsb25nZGlzcGRlZjoKLQkgICAgY2FzZSBieXRlcmVsZGVmOgotCSAgICBjYXNlIHdvcmRyZWxkZWY6Ci0JICAgIGNhc2UgbG9uZ3JlbGRlZjoKLQkgICAgICAvKgotCSAgICAgICAqICAgIGluZGlyZWN0IGNhbGw6IGNhbGwgdGhyb3VnaCBwb2ludGVyCi0JICAgICAgICogICAgICBlaXRoZXIgICpkKHIpICAgYXMgYSBwYXJhbWV0ZXIgb3IgbG9jYWwKLQkgICAgICAgKiAgICAgICAgICAgICAgKHIpICAgICBhcyBhIHJldHVybiB2YWx1ZQotCSAgICAgICAqICAgICAgICAgICAgICAqZiAgICAgIGFzIGEgZ2xvYmFsIHBvaW50ZXIKLQkgICAgICAgKiAgICAgIFthcmUgdGhlcmUgb3RoZXJzIHRoYXQgd2UgbWlzcz8sCi0JICAgICAgICogICAgICAgZS5nLiBhcnJheXMgb2YgcG9pbnRlcnMgdG8gZnVuY3Rpb25zPz8/XQotCSAgICAgICAqLwotCSAgICAgIGFyY19hZGQgKHBhcmVudCwgJmluZGlyZWN0Y2hpbGQsICh1bnNpZ25lZCBsb25nKSAwKTsKLQkgICAgICBsZW5ndGggKz0gdmF4X29wZXJhbmRsZW5ndGggKAotCQkJCSAgKHN0cnVjdCBtb2RlYnl0ZSAqKSAoaW5zdHJ1Y3RwICsgbGVuZ3RoKSk7Ci0JICAgICAgY29udGludWU7Ci0JICAgIGNhc2UgYnl0ZXJlbDoKLQkgICAgY2FzZSB3b3JkcmVsOgotCSAgICBjYXNlIGxvbmdyZWw6Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICByZWd1bGFyIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLQkgICAgICAgKiAgICAgIGNoZWNrIHRoYXQgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiAKLQkgICAgICAgKiAgICAgIGEgZnVuY3Rpb24uCi0JICAgICAgICovCi0JICAgICAgZGVzdHBjID0gdmF4X3JlbGFkZHIgKChzdHJ1Y3QgbW9kZWJ5dGUgKikgKGluc3RydWN0cCArIGxlbmd0aCkpCi0JCS0gKGJmZF92bWEpIGNvcmVfdGV4dF9zcGFjZTsKLQkgICAgICBpZiAoZGVzdHBjID49IHNfbG93cGMgJiYgZGVzdHBjIDw9IHNfaGlnaHBjKQotCQl7Ci0JCSAgY2hpbGQgPSBzeW1fbG9va3VwICgmc3ltdGFiLCBkZXN0cGMpOwotCQkgIERCRyAoQ0FMTERFQlVHLAotCQkgICAgICAgcHJpbnRmICgiW2ZpbmRjYWxsXVx0ZGVzdHBjIDB4JWx4IiwgZGVzdHBjKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+bmFtZSAlcyIsIGNoaWxkLT5uYW1lKTsKLQkJICAgICAgIHByaW50ZiAoIiBjaGlsZC0+YWRkciAweCVseFxuIiwgY2hpbGQtPmFkZHIpOwotCQkgICAgKTsKLQkJICBpZiAoY2hpbGQtPmFkZHIgPT0gZGVzdHBjKQotCQkgICAgewotCQkgICAgICAvKgotCQkgICAgICAgKiAgICBhIGhpdAotCQkgICAgICAgKi8KLQkJICAgICAgYXJjX2FkZCAocGFyZW50LCBjaGlsZCwgKHVuc2lnbmVkIGxvbmcpIDApOwotCQkgICAgICBsZW5ndGggKz0gdmF4X29wZXJhbmRsZW5ndGggKChzdHJ1Y3QgbW9kZWJ5dGUgKikKLQkJCQkJCSAgIChpbnN0cnVjdHAgKyBsZW5ndGgpKTsKLQkJICAgICAgY29udGludWU7Ci0JCSAgICB9Ci0JCSAgZ290byBib3RjaGVkOwotCQl9Ci0JICAgICAgLyoKLQkgICAgICAgKiAgICBlbHNlOgotCSAgICAgICAqICAgICAgaXQgbG9va2VkIGxpa2UgYSBjYWxscywKLQkgICAgICAgKiAgICAgIGJ1dCBpdCB3YXNuJ3QgdG8gYW55d2hlcmUuCi0JICAgICAgICovCi0JICAgICAgZ290byBib3RjaGVkOwotCSAgICBkZWZhdWx0OgotCSAgICBib3RjaGVkOgotCSAgICAgIC8qCi0JICAgICAgICogICAgc29tZXRoaW5nIGZ1bm55IGdvaW5nIG9uLgotCSAgICAgICAqLwotCSAgICAgIERCRyAoQ0FMTERFQlVHLCBwcmludGYgKCJbZmluZGNhbGxdXHRidXQgaXQncyBhIGJvdGNoXG4iKSk7Ci0JICAgICAgbGVuZ3RoID0gMTsKLQkgICAgICBjb250aW51ZTsKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9pbmNsdWRlL0NPUFlJTkcgYi9pbmNsdWRlL0NPUFlJTkcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNTQ5YmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9DT1BZSU5HCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLQkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCi0JCSAgICAgICBWZXJzaW9uIDIsIEp1bmUgMTk5MQotCi0gQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgICAgICAgICAgICAgICAgICAgICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCi1zb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcwotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KLXVzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKLXRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bwoteW91ciBwcm9ncmFtcywgdG9vLgotCi0gIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKLXByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKLWhhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKLXRoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAotaWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKLWluIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KLQotICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCi1hbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCi1UaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQotZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKLWdyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoteW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKLXNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKLXJpZ2h0cy4KLQotICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCi0oMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAotZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KLQotICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLXNvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQotd2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KLXRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCi1hdXRob3JzJyByZXB1dGF0aW9ucy4KLQotICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQotcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQotcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQotcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55Ci1wYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LgotDAotCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKLWEgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCi11bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCi1yZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKLW1lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Ci10aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAotZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKLWxhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KLXRoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgotCi1BY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAotY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgotcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQotaXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCi1XaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KLQotICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKLXNvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQotY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQotY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQotbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OwotYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KLQotWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCi15b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgotCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KLSAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKLSAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAotICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKLSAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCi0gICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgotICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQotICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQotICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKLSAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcwotICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0Ci0gICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgotICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQotDAotVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgotaWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKLWFuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgotdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQotc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91Ci1kaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKLW9uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgotdGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKLWVudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQotd2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKLXVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgotU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi0gICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQotICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucwotICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAotCi0gICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKLSAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgotICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKLSAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCi0gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KLSAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCi0KLSAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgotICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCi0gICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKLSAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCi0gICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCi0KLVRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKLW1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCi1jb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQotYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCi1jb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCi1zcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKLWFueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Ci1mb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQotb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKLWl0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KLQotSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZwotYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAotYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCi1kaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKLWNvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCi0MCi0gIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAotb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCi12b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCi1Ib3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgotdGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKLXBhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KLQotICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKLXNpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCi1kaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKLXByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKLW1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQotUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKLWFsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKLXRoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgotCi0gIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLVByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCi10aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgotcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgotWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KLXRoaXMgTGljZW5zZS4KLQotICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50Ci1pbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAotY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgotb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAotZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKLWRpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKLUxpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKLW1heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKLWxpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKLWFsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgotdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bwotcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KLQotSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCi1hbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCi1hcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgotY2lyY3Vtc3RhbmNlcy4KLQotSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQotcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKLXN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKLWludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0MCi0gIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKLW1heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwotdGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZwotY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCi10aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucwotb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCi1iZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KLWFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgotCi1FYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCi1zcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQotbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKLXRoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24uCi0KLSAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQotcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgotdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKLW1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCi1vZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCi1vZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KLQotCQkJICAgIE5PIFdBUlJBTlRZCi0KLSAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCi1GT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KLU9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKLVBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECi1PUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUwotVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQotUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCi1SRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCi1XSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCi1SRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAotSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCi1PVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECi1UTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKLVlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCi1QUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKLVBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotDAotCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0Ci1mcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KLQotICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAotdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKLXRoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLQotCi1BbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KLQotSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcwotd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKLQotICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgMTl5eSBuYW1lIG9mIGF1dGhvcgotICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KLSAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgotCi1UaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKLXBhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkKLWJlIGNhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc2hvdyB3JyBhbmQgYHNob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQotbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KLQotWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKLXNjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCi1uZWNlc3NhcnkuICBIZXJlIGlzIGEgc2FtcGxlOyBhbHRlciB0aGUgbmFtZXM6Ci0KLSAgWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQotICBgR25vbW92aXNpb24nICh3aGljaCBtYWtlcyBwYXNzZXMgYXQgY29tcGlsZXJzKSB3cml0dGVuIGJ5IEphbWVzIEhhY2tlci4KLQotICA8c2lnbmF0dXJlIG9mIFR5IENvb24+LCAxIEFwcmlsIDE5ODkKLSAgVHkgQ29vbiwgUHJlc2lkZW50IG9mIFZpY2UKLQotVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbSBpbnRvCi1wcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQotY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCi1saWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwKLVB1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9DaGFuZ2VMb2cgYi9pbmNsdWRlL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwYmIzYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDE1NDUgKzAsMCBAQAotMTk5OS0wNi0yMiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSk6IEFkZCBpbml0X2Z1bmN0aW9uIGFuZAotCWZpbmlfZnVuY3Rpb24uCi0KLTE5OTktMDYtMjAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIG1pcHMuaCAoRWxmMzJfSW50ZXJuYWxfTXN5bSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKEVsZjMyX0V4dGVybmFsX01zeW0pOiBMaWtld2lzZS4KLQkoRUxGMzJfTVNfUkVMX0lOREVYKTogTmV3IG1hY3JvLgotCShFTEYzMl9NU19GTEFHUyk6IExpa2V3aXNlLgotCShFTEYzMl9NU19JTkZPKTogTGlrZXdpc2UuCi0JCi0xOTk5LTA2LTE0ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGFybV90b2dnbGVfcmVnbmFtZXMpOiBOZXcgcHJvdG90eXBlLgotCShzdHJ1Y3QgZGlhc3NlbWJsZV9pbmZvKTogTmV3IGZpZWxkOiBkaXNhc3NlbWJsZXJfb3B0aW9ucy4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChiZmRfZWxmX3ZlcnNpb25fZXhwcik6IFJlbmFtZSBgbWF0Y2gnIHRvIGBwYXR0ZXJuJy4KLQlBZGQgYG1hdGNoJyBjYWxsYmFjayBmdW5jdGlvbi4KLQotMTk5OS0wNC0xMCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChiZmRfbGlua19pbmZvKTogQWRkIG5vX3VuZGVmaW5lZC4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oOiBBZGQgcHJvdG90eXBlIGZvciBwcmludF9pbnNuX21jb3JlLgotCi0xOTk5LTA0LTAyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmggKHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyk6IERlY2xhcmUuCi0KLTE5OTktMDMtMzAgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQGNvZGVzb3VyY2VyeS5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaCAoc3BsYXlfdHJlZV9jb21wYXJlX2ludHMpOiBEZWNsYXJlLgotCi1XZWQgTWFyIDI0IDEyOjQ2OjI5IDE5OTkgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYW15LmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IEN5Z3dpbnssMzJ9IHNob3VsZCBoYXZlIHRoZSBwcm90b3R5cGUuCi0KLTE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2luZm8pOiBhZGQgZmllbGQgIm1wYzg2MGMwIi4KLQotTW9uIEZlYiAgMSAyMTowNTo0NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogZGlzLWFzbS5oIChwcmludF9pbnNuX2kzODZfYXR0KTogIERlY2xhcmUuCi0gICAgICAgKHByaW50X2luc25faTM4Nl9pbnRlbCk6ICBEZWNsYXJlLgotCi05OTgtMTItMzAgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogQ2FzdCBTVFJFQU0gYW5kCi0JRlBSSU5URl9GVU5DIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzLgotCi1XZWQgRGVjIDMwIDE2OjA3OjE0IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IGNoYW5nZSB2b2lkICogdG8gUFRSICh0d28gcGxhY2VzKS4KLQotTW9uIERlYyAxNCAwOTo1MzozMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGNoZWNrIElOX0dDQyBhbnltb3JlLgotCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KLQotVHVlIERlYyAgOCAwMDozMDozMSAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+IAotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieSBFbGVuYSBaYW5ub25pCi0gCTxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4gYW5kIEVkaXRoIEVwc3RlaW4KLSAJPGVlcHN0ZWluQHNvcGhpYS5jeWdudXMuY29tPiBhcyBwYXJ0IG9mIGEgcHJvamVjdCB0byBtZXJnZSBpbgotIAljaGFuZ2VzIG1hZGUgYnkgSFA7IEhQIGRpZCBub3QgY3JlYXRlIENoYW5nZUxvZyBlbnRyaWVzLgotCi0JKiBkaXMtYXNtLmggKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKTogY2hhbmdlIHRoZSB0eXBlIG9mIHN0cmVhbQotCWZyb20gRklMRSogdG8gdm9pZCosIGZvciB1c2Ugd2l0aCBnZGIncyBuZXcgdHlwZSBHREJfRklMRS4KLQkoZnByaW50Zl9mdHlwZSk6IGNoYW5nZSBGSUxFKiBwYXJhbWV0ZXIgdHlwZSB0byB2b2lkKi4KLQotICAgICAgICAqIGRlbWFuZ2xlLmg6IChETUdMX0VERyk6IG5ldyBtYWNybyBmb3IgS3VjayBhbmQgQXNzb2NpYXRlcwotICAgICAgICAoRE1HTF9TVFlMRV9NQVNLKTogbW9kaWZ5IHRvIGluY2x1ZGUgS3VjayBhbmQgQXNzb2Mgc3R5bGUKLSAgICAgICAgKGRlbWFuZ2xpbmdfc3R5bGVzKTogYWRkIG5ldyBlZGdfZGVtYW5nbGluZyBzdHlsZQotICAgICAgICAoRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HKTogbmV3IG1hY3JvCi0gICAgICAgIChFREdfREVNQU5HTElORyk6IG5ldyBtYWNybwotCi0gICAgICAgICogZGVtYW5nbGUuaCAoRE1HTF9IUCk6IG5ldyBtYWNybywgZm9yIEhQL2FDQyBjb21waWxlci4KLSAgICAgICAgKERNR0xfU1RZTEVfTUFTSyk6IG1vZGlmeSB0byBpbmNsdWRlIG5ldyBIUCdzIHN0eWxlLgotICAgICAgICAoZGVtYW5nbGluZ19zdHlsZXMpOiBhZGQgbmV3IGhwX2RlbWFuZ2xpbmcgdmFsdWUuCi0gICAgICAgIChIUF9ERU1BTkdMSU5HX1NUWUxFX1NUUklORyk6IG5ldyBtYWNyby4KLSAgICAgICAgKEFSTV9ERU1BTkdMSU5HKTogY29lcmNlIHRvIGludC4KLSAgICAgICAgKEhQX0RFTUFOR0xJTkcpOiBuZXcgbWFjcm8uCi0KLQkqIGhwLXN5bXRhYi5oOiByZXdyaXR0ZW4sIGZyb20gSFAuCi0JKHF1aWNrX3Byb2NlZHVyZSk6IGNoYW5nZSB0eXBlIG9mIGxhbmd1YWdlIGZpZWxkIHRvIHVuc2lnbmVkIGludAotCShxdWlja19tb2R1bGUpOiBjaGFuZ2UgdHlwZSBvZiBsYW5ndWFnZSBmaWVsZCB0byB1bnNpZ25lZCBpbnQKLQkoc3RydWN0IGRudHRfdHlwZV9zdmFyKTogYWRkIGZpZWxkIHRocmVhZF9zcGVjaWZpYy4KLQkoaHBfbGFuZ3VhZ2UpOiBhZGQgbGFuZ3VhZ2VzIG1vZGNhbCBhbmQgZG1wYXNjYWwuCi0KLU1vbiBOb3YgMzAgMTU6MjU6NTggMTk5OCAgSiJvcm4gUmVubmVja2UgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBlbGYvc2guaCAoZWxmX3NoX3JlbG9jX3R5cGUpOiBBZGQgUl9TSF9GSVJTVF9JTlZBTElEX1JFTE9DLAotCVJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCBSX1NIX1NXSVRDSDggYW5kIFJfU0hfbWF4LgotCi1GcmkgTm92IDIwIDEzOjE0OjAwIDE5OTggIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGJhc2VuYW1lKTogQWRkIHByb3RvdHlwZSBmb3IgRnJlZUJTRC4KLQotRnJpIE5vdiAxMyAxOToxOToxMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGxpYmliZXJ0eS5oOiBQcm90b3R5cGUgeGNhbGxvYy4KLQotU3VuIE5vdiAgOCAxNzo0MjoyNSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGFuc2lkZWNsLmg6IFdyYXAgcHJvYmxlbWF0aWMgbWFjcm9zIHdpdGggIUlOX0dDQy4KLQotCSogZGVtYW5nbGUuaDogTmV2ZXIgZGVmaW5lIFBBUkFNUygpLgotCSogc3BsYXktdHJlZS5oOiBMaWtld2lzZS4KLQotU2F0IE5vdiAgNyAxODozMDoyMCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGV0ZXIuc2NoYXVlckByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdmF4KTogRGVjbGFyZS4KLQotU2F0IE5vdiAgNyAxNjowNDowMyAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGluY2x1ZGUgZ2Fuc2lkZWNsLmguCi0JKiBzcGxheS10cmVlLmg6IExpa2V3aXNlLgotCi0xOTk4LTEwLTI2IDE2OjAzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBuZXcgZmllbGQgb3B0aW1pemUuCi0KLVRodSBPY3QgMjIgMTk6NTg6MDAgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBzcGxheS10cmVlLmg6IFdyYXAgZnVuY3Rpb24gcG9pbnRlciBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zIGluCi0JUEFSQU1TKCkgbWFjcm8uCi0KLTE5OTgtMTAtMjEgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIHNwbGF5LXRyZWUuaDogTmV3IGZpbGUuCi0KLUZyaSBPY3QgIDkgMDA6MDI6MDMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBNZXJnZSBkZXZvIGFuZCBlZ2NzIGluY2x1ZGUgZGlyZWN0b3JpZXMuCi0KLVNhdCBTZXAgIDUgMTI6MTY6MzMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaCwgb2JzdGFjay5oOiBVcGRhdGVkIGZyb20gZ2NjLgotCi0xOTk4LTA4LTAzICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oICh4ZXhpdCk6IENoYW5nZSBkZWNsIHRvIHVzZSBtb2Rlcm4gR0NDIGF0dHJpYnV0ZQotCXRvIGluZGljYXRlIGV4aXQgZG9lcyBub3QgcmV0dXJuLgotCi1Nb24gSnVuICAxIDEzOjQ4OjMyIDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLVR1ZSBNYXkgMjYgMjA6NTc6NDMgMTk5OCAgU3RhbiBDb3ggIDxzY294QGVxdWlub3guY3lnbnVzLmNvbT4KLQotCSogZWxmL3NwYXJjLmggKEVGX1NQQVJDX0xFREFUQSwgUl9TUEFSQ18zMkxFKTogQWRkZWQuCi0KLVR1ZSBGZWIgMjQgMTM6MDU6MDIgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogTWVtYmVyIGBzeW1ib2wnIHJlbmFtZWQgdG8gYHN5bWJvbHMnCi0JYW5kIG1hZGUgYW4gImFzeW1ib2wgKioiLiAgTmV3IG1lbWJlciBudW1fc3ltYm9scy4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBVcGRhdGUuCi0KLVR1ZSBGZWIgMTcgMTI6MzI6MTggMTk5OCAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHNpbV9mZXRjaF9yZWdpc3Rlciwgc2ltX3N0b3JlX3JlZ2lzdGVyKTogQWRkCi0gCXJlZ2lzdGVyIGxlbmd0aCBwYXJhbWV0ZXIuICBGdW5jdGlvbnMgcmV0dXJuIGFjdHVhbCBsZW5ndGggb2YKLSAJcmVnaXN0ZXIuCi0KLVRodSBGZWIgMTIgMTY6Mjk6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZXRvcHQuaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotV2VkIEZlYiAxMSAxNjo1NjowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzeW1jYXQuaDogTmV3IGZpbGUuCi0KLU1vbiBGZWIgIDIgMTc6MTM6MzEgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzMwKTogRGVjbGFyZS4KLQotVGh1IEphbiAyMiAxNjoyMzo1OSAxOTk4ICBGcmVkIEZpc2ggPGZuZkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IEFkZCBmbGFnIElOU05fSEFTX1JFTE9DIHRvIHRlbGwgZGlzYXNzZW1ibHkKLQlmdW5jdGlvbiB0aGVyZSBpcyBhIHJlbG9jIG9uIHRoaXMgbGluZS4KLQotTW9uIERlYyAgOCAxMToyMjoyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IFJlbW92ZSBwcm90b3R5cGUgb2YgZGlzYXNtX3N5bWFkZHIoKSBhcyB0aGlzIGZ1bmN0aW9uCi0Jbm8gbG9uZ2VyIGV4aXN0cy4KLQotVHVlIERlYyAgMiAxMDoyMDo1MyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGRpc2FzbV9zeW1hZGRyKTogTmV3IHByb3RvdHlwZS4KLQotTW9uIERlYyAgMSAyMDoyNDoxOCAxOTk3ICBKIm9ybiBSZW5uZWNrZSA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGNvZmYvc2guaCAoUl9TSF9TV0lUQ0g4KTogTmV3LgotCi1Nb24gRGVjICAxIDExOjI5OjM1IDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmggKENCX1NZU0NBTEwpOiBDb21tZW50IG91dCBhcmcgbmFtZXMgaW4gcHJvdG90eXBlcy4KLQotV2VkIE5vdiAyNiAxNjo0Nzo1OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogY2FsbGJhY2suaCAoQ0JfU1lTQ0FMTCk6IENvbnNpc3RhbnRseSB1c2UgbmFtZXMgZm9yIHByb3RvdHlwZQotCWFyZ3VtZW50cy4KLQotV2VkIE5vdiAyNiAxMTozOTozMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChDQl9TWVNDQUxMKTogQ2hhbmdlIGJ5dGUgY291bnQgYXJndW1lbnRzIHRvCi0Je3JlYWQsd3JpdGV9X21lbSB0byBgaW50Jy4gIE5ldyBtZW1iZXIgYG1hZ2ljJy4KLQkoQ0JfU1lTQ0FMTF9NQUdJQyxDQl9TWVNDQUxMX0lOSVQpOiBOZXcgbWFjcm9zLgotCi1UdWUgTm92IDI1IDAxOjM1OjUyIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3Qgc3RhdCk6IE1vdmUgZm9yd2FyZCBkZWNsIHVwLgotCShob3N0X2NhbGxiYWNrKTogUGFzcyBzdGF0IHN0cnVjdCBwb2ludGVyIHRvIHN0YXQsZnN0YXQuCi0JKENCX1NZU19ubm4pOiBSZW9yZ2FuaXplLgotCShDQl9TWVNDQUxMKTogTmV3IG1lbWJlcnMgcDEscDIuCi0JKGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQpOiBEZWxldGUgZm91cnRoIGFyZy4KLQotU2F0IE5vdiAyMiAyMzozNDoxNSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0b3BfcmVhc29uKTogQ2xhcmlmeSBzaW1fc2lnbmFsbGVkIFNJR1JDCi0gCWFyZ3VtZW50LgotCi1Nb24gTm92IDE3IDE0OjAwOjUxIDE5OTcgIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChDQl9UQVJHRVRfREVGU19NQVApOiBSZW5hbWVkIGZyb20gdGFyZ2V0X2RlZnNfbWFwLgotCShob3N0X2NhbGxiYWNrKTogQWRkIHN0YXQsIGZzdGF0LCBzeXNjYWxsX21hcCwgZXJybm9fbWFwLCBvcGVuX21hcCwKLQlzaWduYWxfbWFwLCBzdGF0X21hcC4KLQkoZXJybl9tYXAsb3Blbl9tYXApOiBSZW5hbWVkIHRvIGNiX2luaXRfZm9vX21hcC4KLQkoY2JfaG9zdF90b190YXJnZXRfZXJybm8sY2JfdGFyZ2V0X3RvX2hvc3Rfb3Blbik6IFJlbmFtZWQgZnJvbQotCWhvc3RfdG9fdGFyZ2V0X2Vycm5vLHRhcmdldF90b19ob3N0X29wZW4uCi0JKGNiX3JlYWRfdGFyZ2V0X3N5c2NhbGxfbWFwcyk6IEFkZCBwcm90b3R5cGUuCi0JKGNiX3RhcmdldF90b19ob3N0X3N5c2NhbGwpOiBMaWtld2lzZS4KLQkoY2JfaG9zdF90b190YXJnZXRfc3RhdCk6IExpa2V3aXNlLgotCShjYl9zeXNjYWxsKTogTGlrZXdpc2UuCi0JKENCX1NZU197ZXhpdCxvcGVuLGNsb3NlLHJlYWQsd3JpdGUsbHNlZWssdW5saW5rLGdldHBpZCxraWxsLGZzdGF0LAotCWFyZ3ZsZW4sYXJndixjaGRpcixzdGF0LGNobW9kLHV0aW1lLHRpbWV9KTogRGVmaW5lLgotCShDQl9TWVNDQUxMKTogTmV3IHR5cGUuCi0JKENCX1JDKTogTmV3IGVudW0uCi0KLUZyaSBOb3YgIDcgMTA6MzQ6MDkgMTk5NyAgUm9iIFNhdm95ZSAgPHJvYkBkYXJrc3Rhci5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKwotCXByb2dyYW1zLgotCSogcmVtb3RlLXNpbS5oOiAgQWRkIGV4dGVybiAiQyIgeyBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoIEMrKwotCXByb2dyYW1zLgotCi1UdWUgT2N0IDE0IDE2OjA3OjUxIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQKLQknc3ltYm9sX2F0X2FkZHJlc3NfZnVuYycuCi0JKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogSW5pdGlhbGlzZSBuZXcgZmllbGQgd2l0aAotCWdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MuCi0KLU1vbiBPY3QgMTMgMTA6MTc6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IENsYXJpZnkgc2ltX3JlYWQsIHNpbV93cml0ZSBNRU0gYXJndW1lbnQuCi0KLVdlZCBTZXAgMjQgMTg6MDM6MTAgMTk5NyAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoU0lNX1JDKTogIEFkZCBhIGJ1bmNoIG9mIG5ldyByZXR1cm4gY29kZXMgZm9yCi0JYnJlYWtwb2ludCBzdHVmZi4KLQkqIEFkZCBmdW5jdGlvbnMgdG8gdGVsbCB0aGUgc2ltdWxhdG9yIHRvIHNldC9jbGVhci9lbmFibGUvZGlzYWJsZQotCWludHJpbnNpYyBicmVha3BvaW50cy4KLQotVGh1IEF1ZyAyOCAxOTo0MTo0MiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChkdXBhcmd2KTogQWRkIHByb3RvdHlwZS4KLQotVHVlIEF1ZyAyNiAxMjoyNTo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX2NyZWF0ZV9pbmZlcmlvcik6IEFkZCBBQkZEIGFyZy4gRG9jdW1lbnQuCi0KLU1vbiBBdWcgMjUgMTA6NTA6NTEgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHNpbV9vcGVuKTogQWRkIEFCRkQgYXJnLiBEb2N1bWVudC4KLQotRnJpIEF1ZyAgOCAxNjo0Mzo1NiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKGFyY19nZXRfZGlzYXNzZW1ibGVyKTogRGVjbGFyZS4KLQotV2VkIEp1bCAzMCAxMTozOTo1MCAxOTk3ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaCAoRE1HTF9KQVZBKTogIE5ldyBvcHRpb24gdG8gcmVxdWVzdCBKYXZhIGRlbWFuZ2xpbmcuCi0KLVR1ZSBKdWwgMjIgMTc6NTk6NTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoUEVYRUNVVEVfKik6IERlZmluZS4KLQkocGV4ZWN1dGUsIHB3YWl0KTogRGVjbGFyZS4KLQotRnJpIEp1biAgNiAxMzowMjozMyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX2tpbGwpOiBNYXJrIGFzIGRlcHJlY2lhdGVkLgotCi1GcmkgTWF5IDIzIDEzOjQzOjQxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHRhc2tfbGluayBtZW1iZXIuCi0KLVRodSBNYXkgMjIgMTE6MzI6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IFJldmlldyBkb2N1bWVudGF0aW9uLiAgQ2xhcmlmeSByZXN0cmljdGlvbnMgb24KLSAJd2hlbiBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZC4KLQotV2VkIE1heSAyMSAxNjo0Nzo1MyAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3NldF9wcm9maWxlX3NpemUpOiBBZGQgcHJvdG90eXBlLCBkb2N1bWVudCBhcwotIAlkZXByZWNpYXRlZC4KLQotVHVlIE1heSAyMCAwOTozMjoyMiAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX29wZW4pOiBBZGQgY2FsbGJhY2sgc3RydWN0LgotCShzaW1fc2V0X2NhbGxiYWNrcyk6IERyb3AgU0lNX0RFU0MgYXJndW1lbnQuIERvY3VtZW50LgotCShzaW1fc2l6ZSk6IFJlbW92ZSByZWNlbnRseSBhZGRlZCBTSU1fREVTQyBhcmd1bWVudC4gRG9jdW1lbnQuCi0KLU1vbiBNYXkgMTkgMTk6MTQ6NDQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IFBhc3MgU0QgaW50byBzaW1fc2l6ZS4KLQotVGh1IE1heSAxNSAwMToyNDoxNiAxOTk3ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suaCAob2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcsIG9ic3RhY2tfY2h1bmtmdW4sCi0Jb2JzdGFja19mcmVlZnVuKTogRWxpbWluYXRlIGNvbXBpbGUgd2FybmluZ3MgaW4gZ2RiLgotCi1UdWUgTWF5IDEzIDEwOjIxOjE0IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKGNvbnN0YW50cyk6ICAgQWRkZWQgbmV3IGZsYWcgYml0cyBGX0FQQ1NfMjYgYW5kCi0JRl9BUENTX1NFVCBmb3IgdGhlIGZfZmxhZ3MgZmllbGQgb2YgdGhlIGZpbGVoZHIgc3RydWN0dXJlLiAgQWRkZWQgbmV3Ci0JZmxhZ3M6IEZfQVBDUzI2LCBGX0FSTV8yLCBGX0FSTV8zLCBGX0FSTV83LCBGX0FSTV83VCB0byBzdG9yZQotCWluZm9ybWF0aW9uIGluIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUgdXNlZCBieSBCRkQKLQlyb3V0aW5lcy4KLQotVHVlIEFwciAyMiAxMDoyNDozNCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZmxvYXRmb3JtYXQuaCAoZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyk6IEFkZCBjb21tZW50cyBmb3IgcHJldmlvdXMKLQlmb3JtYXRzIGFuZCBhZGQgZmxvYXRmb3JtYXRfbGl0dGxlYnl0ZV9iaWd3b3JkLCBwcmltYXJpbHkgZm9yIEFSTS4KLQlBZGQgZGVjbGFyYXRpb24gZm9yIGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZC4KLQotRnJpIEFwciAxOCAxMzowNDo0OSAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3N0b3ApOiBOZXcgaW50ZXJmYWNlIC0gYXN5bmNocm9ub3VzCi0gCW5vdGlmaWNhdGlvbiBvZiBhIHJlcXVlc3QgdG8gc3RvcCAvIHN1c3BlbmQgdGhlIHJ1bm5pbmcKLSAJc2ltdWxhdGlvbi4KLQotCSogcmVtb3RlLXNpbS5oIChlbnVtIHNpbV9zdG9wKTogQWRkIHNpbV9ydW5uaW5nIGFuZCBzaW1fcG9sbGluZyBhcwotIAlzdGF0ZXMgZm9yIHVzZSBpbnRlcm5hbCB0byBzaW11bGF0b3JzLgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1dCk6IFB1dCBhIG1hZ2ljIG51bWJlciBhdAotIAl0aGUgZW5kIG9mIHRoZSBzdHJ1Y3QgdG8gYWxsb3cgYmFzaWMgY2hlY2tpbmcuCi0JKHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCApOiBBZGQgcG9sbF9xdWl0IC0gc28KLSAJdGhhdCB0aGUgY29uc29sZSBldGMgY2FuIGJlIHBvbGxlZCBhdCByZWd1bGFyIGludGVydmFscy4KLQotVGh1IEFwciAxNyAwMjoxNzoxMiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKHN0cnVjdCBfYmZkKTogRGVjbGFyZS4KLQkoc2ltX2xvYWQpOiBSZXR1cm4gU0lNX1JDLiAgTmV3IGFyZyBgYWJmZCcuCi0JKHNpbV9jcmVhdGVfaW5mZXJpb3IpOiBSZXR1cm4gU0lNX1JDLiAgRGVsZXRlIGFyZyBgc3RhcnRfYWRkcmVzcycuCi0KLVdlZCBBcHIgIDIgMTc6MDk6MTIgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBrcmVtdmF4LmN5Z251cy5jb20+Ci0KLQkqIHJlbW90ZS1zaW0uaCAoc2ltX3RyYWNlLCBzaW1fc2l6ZSk6IE1ha2UgdGhlc2UgZ2xvYmFsLiAgVGhleQotIAl3aWxsIGdvIGF3YXkgc2hvcnRseS4KLQotV2VkIEFwciAgMiAxNToyMzo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmggKFNJTV9PUEVOX0tJTkQsIFNJTV9SQyk6IE5ldyBlbnVtcy4KLQkoc2ltX29wZW4pOiBOZXcgYXJndW1lbnQgYGtpbmQnLgotCi1XZWQgQXByICAyIDE0OjQ1OjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogQ09QWUlORzogVXBkYXRlIEZTRiBhZGRyZXNzLgotCi1GcmkgTWFyIDI4IDE1OjI5OjU0IDE5OTcgIE1pa2UgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oICh0b3AgbGV2ZWwpOiBJbmNsdWRlIHN0ZGFyZy5oIG9yIHZhcmFyZ3MuaCBpZgotCXZhX3N0YXJ0IGlzIG5vdCBkZWZpbmVkLgotCShob3N0X2NhbGxiYWNrX3N0cnVjdCk6IE1ha2UgeyxlfXZwcmludGZfZmlsdGVyZWQgdGFrZSBhIHZhX2xpc3QKLQlpbnN0ZWFkIG9mIHZvaWQgKiwgc2luY2UgdmFfbGlzdCBtaWdodCBiZSBhbiBhcnJheSBvciBzdHJ1Y3R1cmUKLQl0eXBlLgotCi1GcmkgTWFyIDI4IDE1OjQ0OjQxIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IEFkZCBwcm90b3R5cGUgZm9yIGdsaWJjIGFuZCBsaW51eC4KLQotTW9uIE1hciAxNyAxOToyMjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG9iamFsbG9jLmg6IE5ldyBmaWxlLgotCi1Nb24gTWFyIDE3IDE0OjU3OjU1IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiByZW1vdGUtc2ltLmg6IE5ldyBmaWxlLCBjb3BpZWQgaW4gZnJvbSBnZGIvcmVtb3RlLXNpbS5oLiAgT25lCi0gCWRheSB0aGlzIHdpbGwgYmUgcGxhY2VkIGluIGEgZGlyZWN0b3J5IG9mIGl0cyBvd24uCi0KLVNhdCBNYXIgMTUgMTk6MDA6MTQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYnN0YWNrLmg6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9uLgotCi1UaHUgTWFyICA2IDE1OjQ2OjU5IDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAa3JlbXZheC5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QpOiBBZGQgY2FsbGJhY2tzIC0KLSAJZmx1c2hfc3Rkb3V0LCB3cml0ZV9zdGRlcnIsIGZsdXNoX3N0ZGVyciwgdnByaW50Zl9maWx0ZXJlZCwKLSAJZXZwcmludGZfZmlsdGVyZWQuICBEZWxldGUgcmVkdW5kYW50IGNhbGxiYWNrcyAtIHByaW50Zl9maWx0ZXJlZC4KLQotVGh1IEZlYiAyNyAyMzoxODoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBSZW1vdmUgbHByZWZpeCBhbmQgbHByZWZpeF9sZW4KLQlmaWVsZHMuCi0KLVR1ZSBGZWIgMjUgMDA6MTA6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIKTogSW5pdGlhbGl6ZQotCWJ5dGVzX3Blcl9jaHVuayBhbmQgZGlzcGxheV9lbmRpYW4uCi0KLU1vbiBGZWIgMjQgMTc6NDc6MDIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBFcmljIFlvdW5nZGFsZSA8ZXJpY0BhbmRhbnRlLmppYy5jb20+OgotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIpOiBEZWZpbmUuCi0JKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyk6IERlZmluZS4KLQkoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlKTogRGVmaW5lLgotCi1UaHUgRmViICA2IDE0OjIwOjAxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IChkaXNhc3NlbWJsZV9pbmZvKTogIEFkZCBuZXcgZmllbGRzCi0JYnl0ZXNfcGVyX2NodW5rIGFuZCBkaXNwbGF5X2VuZGlhbiB0byBjb250cm9sIHRoZQotCWRpc3BsYXkgb2YgcmF3IGluc3RydWN0aW9ucy4KLQotRnJpIERlYyAyNyAyMjoxNzozNyAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3RpYzgwKTogRGVjbGFyZS4KLQotU3VuIERlYyAgOCAxNzoxMToxMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjYWxsYmFjay5oIChob3N0X2NhbGxiYWNrKTogTmV3IG1lbWJlciBgZXJyb3InLgotCi1XZWQgTm92IDIwIDAwOjQwOjIzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNhbGxiYWNrLmg6IE5ldyBmaWxlLCBtb3ZlZCBoZXJlIGZyb20gZ2RiLgotCi1Nb24gTm92IDE4IDE2OjM0OjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5Lmg6IENoZWNraW4gYWdhaW47IGxhc3QgY2hlY2tpbiBmYWlsZWQgZHVlIHRvIHN0aWNreSB0YWcuCi0KLVdlZCBOb3YgMTMgMDg6MjI6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogUmV2ZXJ0IGxhc3QgY29tbWl0IGR1ZSB0byBjb25mbGljdHMgd2l0aCBocHV4Ci0Jc3lzdGVtIGhlYWRlcnMuCi0KLVR1ZSBOb3YgMTIgMTY6MzE6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogTW92ZSBwcm90b3R5cGVzIGZyb20gYXJndi5jIGhlcmUuCi0KLVRodSBPY3QgMzEgMTQ6NTY6MTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYW5zaWRlY2wuaCAoVlBBUkFNUyxWQV9TVEFSVCk6IERlZmluZS4KLQotRnJpIE9jdCAyNSAxMjowODowNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVfaW5mbyk6IEFkZCBieXRlc19wZXJfbGluZSBmaWVsZC4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplIGJ5dGVzX3Blcl9saW5lIGZpZWxkLgotCi1UaHUgT2N0IDI0IDE3OjEwOjAxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZV9pbmZvKTogQWRkIHN5bWJvbCBmaWVsZC4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPX05PX0FSQ0gpOiBJbml0aWFsaXplIHN5bWJvbCBmaWVsZC4KLQotVGh1IE9jdCAxNyAxMToxNzo0MCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fbTMycik6IERlY2xhcmUuCi0KLU1vbiBPY3QgMTQgMjM6NTY6NTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogRGVjbGFyZSBwYXJhbWV0ZXIgdHlwZXMgZm9yIHhtYWxsb2MgYW5kIHhyZWFsbG9jLgotCi1UaHUgT2N0ICAzIDEzOjQ1OjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZm5tYXRjaC5oOiBOZXcgZmlsZS4KLQotVGh1IE9jdCAgMyAxMDozMzoxNCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9tbjEweDAwKTogRGVsZXRlIGRlY2xhcmF0aW9uLgotCShwcmludF9pbnNuX21uMTAyMDAsIHByaW50X2luc25fbW4xMDMwMCk6IERlY2xhcmUuCi0KLVdlZCBPY3QgIDIgMjE6MjQ6NDMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fbW4xMHgwMCk6IERlY2xhcmUuCi0KLU1vbiBTZXAgMzAgMTM6NTY6MTEgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oOiBSZW1vdmUgI2lmbmRlZiBQUklWQVRFX1hNQUxMT0MuCi0KLVNhdCBBdWcgMzEgMTM6Mjc6MDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fdjg1MCk6IERlY2xhcmUuCi0KLVR1ZSBBdWcgMTMgMTY6MTA6MzAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgQ2hhbmdlIGJjb3B5IHRvIG1lbWNweS4gIFdvcmtzIGJldHRlciBvbiBQb3NpeAotCXN5c3RlbXMsIHdoaWNoIGdlbmVyYWxseSBsYWNrIGJjb3B5LgotCi1Nb24gQXVnIDEyIDE3OjAzOjE4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGFuc2lkZWNsLmg6ICBDaGFuZ2UgV0lOMzIgdG8gX1dJTjMyLgotCi1GcmkgSnVsIDI2IDEzOjU4OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzLWFzbS5oOiBBZGQgZmxhdm91ciBmaWVsZC4KLQkocHJpbnRfaW5zbl9hbHBoYSk6IERlY2xhcmUuCi0JKHByaW50X2luc25fYWxwaGFfb3NmLCBwcmludF9pbnNuX2FscGhhX3Ztcyk6IERvbid0IGRlY2xhcmUuCi0JKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6IEluaXRpYWxpemUgZmxhdm91ciBmaWVsZC4KLQotVHVlIEp1bCAyMyAxNzozNzo1OCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKFBSSVZBVEVfWE1BTExPQyk6IEVuY2xvc2UgeG1hbGxvYy94cmVhbGxvYwotCWRlZmluaXRpb25zIGluc2lkZSAjaWZuZGVmIHNvIHRoYXQgcHJvZ3JhbXMgdGhhdCB3YW50IHRvCi0JY2FuIGRlZmluZSBQUklWQVRFX1hNQUxMT0MgYW5kIHRoZW4gZGVmaW5lIHhtYWxsb2MgYW5kCi0JeHJlYWxsb2MgYW55d2F5IHRoZXkgd2FudC4KLQkoYmFzZW5hbWUpOiBEb2N1bWVudCBpbiBzb3VyY2UgdGhhdCB3ZSBjYW4ndCBkZWNsYXJlIHRoZQotIAlwYXJhbWV0ZXIgdHlwZSBiZWNhdXNlIGl0IGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5IGFjcm9zcwotCWRpZmZlcmVudCBzeXN0ZW1zLgotCi1Nb24gSnVsIDIyIDEzOjE2OjEzIDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fYWxwaGEpOiBEb24ndCBkZWNsYXJlLgotCShwcmludF9pbnNuX2FscGhhX29zZiwgcHJpbnRfaW5zbl9hbHBoYV92bXMpOiBEZWNsYXJlLgotCi1XZWQgSnVsIDE3IDE0OjQ1OjEyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmg6IChwcmludF9pbnNuX2QxMHYpOiBEZWNsYXJlLgotCi1Nb24gSnVsIDE1IDE2OjU1OjM4IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogIEdldCByaWQgb2YgZGVjbHMgZm9yIHByaW50X2luc25faTgwODYsCi0JcHJpbnRfaW5zbl9zcGFyYzY0IGFuZCBwcmludF9pbnNuX3NwYXJjbGl0ZS4KLQkqIChJTklUX0RJU0FTU0VNQkxFX0lORk8pOiAgU3BsaXQgaW50byB0d28gcGllY2VzLiAgT25lLAotCUlOSVRfRElTQVNTRU1CTEVfSU5GT19OT19BUkNIIGluaXRzIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciBlbmRpYW4sCi0JbWFjaCwgYW5kIGFyY2guCi0KLUZyaSBKdWwgMTIgMTA6MTk6MjcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2k4MDg2KTogIERlY2xhcmUuCi0KLVdlZCBKdWwgIDMgMTY6MDI6MzkgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3NwYXJjbGl0ZSk6ICBEZWNsYXJlLgotCi1UdWUgSnVuIDE4IDE2OjAyOjQ2IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faDgzMDBzKTogRGVjbGFyZS4KLQotVHVlIEp1biAxOCAxNToxMTozMyAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogZm9wZW4tdm1zLmg6IE5ldyBmaWxlLgotCi1UdWUgSnVuICA0IDE4OjU4OjE2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCBub3RpY2VfYWxsIGZpZWxkLgotCi1GcmkgQXByIDI2IDEwOjMzOjEyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRlbWFuZ2xlLmggKCNpZmRlZiBJTl9HQ0MpOiAjaW5jbHVkZSAiZ2Fuc2lkZWNsLmgiLgotCShQUk9UTyxQVFIsY29uc3QpOiBEZWxldGUuCi0KLU1vbiBBcHIgMjIgMTc6Mjc6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHRyYWRpdGlvbmFsX2Zvcm1hdCBmaWVsZC4KLQotTW9uIEFwciAxNSAxNToxNjo1NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoY2hvb3NlX3RlbXBfYmFzZSk6IEFkZCBwcm90b3R5cGUuCi0KLVR1ZSBNYXIgMTIgMTc6Mjk6NDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXApOiBEZWNsYXJlLgotCShzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IEFkZCB3cmFwX2hhc2ggZmllbGQuCi0KLVdlZCBGZWIgMTQgMTY6NDk6MTcgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogaWVlZS5oIChpZWVlX3JlY29yZF9lbnVtX3R5cGUpOiBEZWZpbmUKLQlpZWVlX2V4dGVybmFsX3JlZmVyZW5jZV9pbmZvX2VudW0uCi0KLUZyaSBGZWIgIDIgMTc6MDk6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoRElTQVNNX1JBV19JTlNOKTogRGVsZXRlLgotCi1UdWUgSmFuIDIzIDA5OjIxOjQ3IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKElOSVRfRElTQVNTRU1CTEVfSU5GTyk6IFNldCBlbmRpYW4gdG8gQkZEX0VORElBTl9VTktOT1dOLgotCU5ldyBhcmd1bWVudCBGUFJJTlRGX0ZVTkMuCi0KLU1vbiBKYW4gMjIgMTY6Mzc6NTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVfaW5mbyk6IE5ldyBtZW1iZXJzIGFyY2gsIG1hY2gsIGVuZGlhbi4KLQkoSU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogSW5pdGlhbGl6ZSB0aGVtLgotCShESVNBU01fUkFXX0lOU057LEZMQUd9KTogRGVmaW5lLgotCi1UaHUgSmFuIDE4IDExOjMyOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2hhbmdlIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouCi0JKGNwbHVzX21hbmdsZV9vcG5hbWUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgYW5kIG9wbmFtZSBwYXJhbWV0ZXIgdG8KLQljb25zdCBjaGFyICouCi0KLUZyaSBKYW4gIDUgMDA6MDE6MjIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpZWVlLmggKGVudW0gaWVlZV9yZWNvcmQpOiBBZGQgaWVlZV9hc25fcmVjb3JkX2VudW0sCi0JaWVlZV9hdF9yZWNvcmRfZW51bSwgaWVlZV90eV9yZWNvcmRfZW51bSwgaWVlZV9hdG5fcmVjb3JkX2VudW0sCi0JaWVlZV9iYl9yZWNvcmRfZW51bSwgYW5kIGllZWVfYmVfcmVjb3JkX2VudW0uCi0KLVdlZCBKYW4gIDMgMTM6MTI6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suaDogVXBkYXRlIGNvcHlyaWdodCB0byAxOTk2LgotCShfb2JzdGFja19tZW1vcnlfdXNlZCk6IERlY2xhcmUuCi0JKG9ic3RhY2tfbWVtb3J5X3VzZWQpOiBEZWZpbmUgbWFjcm8uCi0KLVRodSBEZWMgMjggMTE6NDI6MTIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaCAoeHN0cmR1cCk6IERlY2xhcmUuCi0KLVRodSBEZWMgMjEgMTQ6NDc6MTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB3YWl0Lmg6IFByb3RlY3QgYWxsIG1hY3JvcyB3aXRoICNpZm5kZWYuCi0KLVR1ZSBPY3QgMjQgMjE6NDU6NDAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkIHN0YXRpY19saW5rIGZpZWxkLgotCi1UdWUgU2VwIDEyIDE2OjI4OjA0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIHN5bWJvbCBwYXJhbWV0ZXIgdG8KLQl3YXJuaW5nIGNhbGxiYWNrLgotCi1GcmkgU2VwICAxIDEzOjExOjUxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQ2hhbmdlIHdhcm5pbmcgY2FsbGJhY2sKLQl0byB0YWtlIEJGRCwgc2VjdGlvbiwgYW5kIGFkZHJlc3MgYXJndW1lbnRzLgotCi1UaHUgQXVnIDMxIDE2OjQ1OjEyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBSZW1vdmUgUEUgc3R1ZmYuCi0KLVR1ZSBBdWcgMjIgMDM6MTg6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBsaWJpYmVydHkuaDogRGVjbGFyZSB4c3RyZXJyb3IuICBGcm9tIFBhdCBSYW5raW4uCi0KLU1vbiBBdWcgMjEgMTg6MTE6MzYgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IFJlbW92ZSBQRSBzdHVmZi4KLQotV2VkIEF1ZyAgMiAwODoxNDoxMiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fc3BhcmM2NCk6IERlY2xhcmUuCi0KLU1vbiBKdWwgMTAgMTM6MjY6NDkgMTk5NSAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFpYi5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHN5bWJvbGljLgotCi1TdW4gSnVsICAyIDE3OjQ4OjQwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyk6IENoYW5nZSB0eXBlIG9mIGJhc2VfZmlsZSB0bwotCVBUUi4KLQotVGh1IEp1biAyOSAwMDowMjo0NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19pbmZvKTogQWRkZWQgYmFzZV9maWxlIG1lbWJlci4KLQotVHVlIEp1biAyMCAxNjo0MDowNCAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBhbnNpZGVjbC5oOiB3aW4zMnMgaXMgQU5TSSBlbm91Z2guCi0KLVRodSBNYXkgMTggMDQ6MjU6NTAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JV2VkIE1heSAxMCAxNDoyODoxNiAxOTk1IFJpY2hhcmQgRWFybnNoYXcgKHJlYXJuc2hhQGFybWx0ZC5jby51aykKLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX2FybSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkocHJpbnRfaW5zbl97bGl0dGxlLGJpZ31fYXJtKTogTmV3IGRlY2xhcmF0aW9ucy4KLQotCSogZmxvYXRmb3JtYXQuaCAoZmxvYXRmb3JtYXRfYXJtX2V4dCk6IERlY2xhcmUuCi0KLVNhdCBNYXkgMTMgMTA6MTQ6MDggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29mZi9wZS5oOiBOZXcgZmlsZS4KLQkqIGJmZGxpbmsuaCAoc3Vic3l0ZW0sIHN0YWNrX2hlYXBfcGFyYW1ldGVycyk6IE5ldy4KLQkqIGNvZmYvaTM4Ni5oIChOVF9TRUNUSU9OX0FMSUdOTUVOVCwgTlRfRklMRV9BTElHTk1FTlQsCi0JTlRfREVGX1JFU0VSVkUsIE5UX0RFRl9DT01NSVQpOiBOZXcuCi0JKiBjb2ZmL2ludGVybmFsLmggKGludGVybmFsX2ZpbGVoZHIpOiAgTmV3IGZpZWxkcyBmb3IgUEUuCi0JKElNQUdFX0RBVEFfRElSRUNUT1JZKTogTmV3LgotCShpbnRlcm5hbF9hb3V0aGRyKTogTmV3IGZpZWxkcyBmb3IgUEUuCi0KLVRodSBNYXkgIDQgMTQ6MzY6NDIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGRlbWFuZ2xlLmg6IERvbid0IGluY2x1ZGUgYW5zaWRlY2wuaCBpZiBJTl9HQ0MuCi0KLVR1ZSBGZWIgMjEgMDA6Mzc6MjggMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwLXN5bXRhYi5oOiBEb24ndCB1c2UgYml0ZmllbGQgZW51bWVyYXRpb25zLCB0aGUgSFAgQyBjb21waWxlcgotCWRvZXMgbm90IGhhbmRsZSB0aGVtIGNvcnJlY3RseS4KLQotVGh1IEZlYiAgOSAxNDoyMDoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYmliZXJ0eS5oIChiYXNlbmFtZSk6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVyIHR5cGU7IHNvbWUKLQlzeXN0ZW1zIGhhdmUgdGhpcyBpbiB0aGVpciBoZWFkZXIgZmlsZXMuCi0KLVdlZCBGZWIgIDggMTc6MzU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIGZvcm1hdCBvZiBjb21tb24KLQlzeW1ib2wgaW5mb3JtYXRpb24sIHRvIHJlbW92ZSByZXN0cmljdGlvbnMgb24gbWF4aW11bSBzaXplIGFuZAotCWFsaWdubWVudCBwb3dlciwgYnkgdXNpbmcgYSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIGluc3RlYWQuCi0KLU1vbiBGZWIgIDYgMTQ6NTU6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKGVudW0gYmZkX2xpbmtfaGFzaF90eXBlKTogUmVuYW1lIGJmZF9saW5rX2hhc2hfd2VhawotCXRvIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLiAgQWRkIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KLQotTW9uIEphbiAxNiAyMTowMDoyMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaCAoR0RCX0lOSVRfRElTQVNTRU1CTEVfSU5GTywgZXRjKTogUmVtb3ZlIGFsbAotCUdEQi1zcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotU3VuIEphbiAxNSAxODozOTozNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzcGxhdD4KLQotCSogZGlzLWFzbS5oIChwcmludF9pbnNuX3c2NSk6IERlY2xhcmUuCi0KLVRodSBKYW4gMTIgMTc6NTE6MTcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKGhleF9wKTogRml4IHNlbnNlIG9mIHRlc3QuCi0KLVdlZCBKYW4gMTEgMjI6MzY6NDAgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliaWJlcnR5LmggKF9oZXhfYXJyYXlfc2l6ZSwgX2hleF9iYWQsIF9oZXhfdmFsdWUsIGhleF9pbml0LAotCWhleF9wLCBoZXhfdmFsdWUpOiBOZXcgbWFjcm9zIGFuZCBkZWNsYXJhdGlvbnMsIGZvciBoZXguYy4KLQotRnJpIEphbiAgNiAxNzo0NDoxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1hc20uaDogTWFrZSBpZGVtcG90ZW50LgotCi1XZWQgRGVjIDE0IDEzOjA4OjQzIDE5OTQgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogcHJvZ3Jlc3MuaDogTmV3IGZpbGUsIGVtcHR5IGRlZmluaXRpb25zIGZvciBwcm9ncmVzcyBtYWNyb3MuCi0KLUZyaSBOb3YgMjUgMDA6MTQ6MDUgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwLXN5bXRhYi5oOiBOZXcgZmlsZSBkZXNjcmliaW5nIHRoZSBkZWJ1ZyBzeW1ib2xzIGVtaXR0ZWQKLQlieSB0aGUgSFAgQyBjb21waWxlcnMuCi0KLUZyaSBOb3YgMTEgMTU6NDg6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGZyb20gMjQKLQl0byAyNiBiaXRzLCBhbmQgY2hhbmdlIHUuYy5hbGlnbm1lbnRfcG93ZXIgZnJvbSA4IHRvIDYgYml0cy4gIDYKLQliaXQgaW4gdGhlIGFsaWdubWVudCBwb3dlciBpcyBlbm91Z2ggZm9yIGEgNjQgYml0IGFkZHJlc3Mgc3BhY2UuCi0KLU1vbiBPY3QgMzEgMTM6MDI6NTEgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oIChjcGx1c19tYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KLQotVHVlIE9jdCAyNSAxMTozODowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyk6IEZpeCBjb21tZW50cyBmb3IKLQltdWx0aXBsZV9jb21tb24gZmllbGQuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogYW91dC9hb3V0NjQuaDogT25seSBkZWZpbmUgUU1BR0lDIGlmIGl0IGlzbid0IGFscmVhZHkgZGVmaW5lZC4KLQotCSogZGlzLWFzbS5oOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KLQotV2VkIEF1ZyAxMCAxMjo1MTo0MSAxOTk0ICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBsaWJpYmVydHkuaCAoc3Ryc2lnbmFsKTogRG9jdW1lbnQgaXRzIGV4aXN0ZW5jZSBldmVuIGlmIHdlCi0JY2FuJ3QgZGVjbGFyZSBpdC4KLQotVHVlIEF1ZyAgMiAxNDo0MDowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogb3M5ay5oOiBSZW1vdmUgdV9pbnQxNiwgdV9pbnQzMiwgYW5kIG93bmVyX2lkIHR5cGVkZWZzIGFuZAotCWV4cGFuZCB0aGVpciB1c2VzLiAgVGhvc2UgbmFtZXMgY29uZmxpY3Qgd2l0aCBNYWNoIGhlYWRlcnMuCi0KLUZyaSBKdWwgMjIgMTQ6MTc6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5KTogQ2hhbmdlIHUuYy5zaXplIGludG8gYQotCWJpdGZpZWxkLiAgQWRkIGZpZWxkIHUuYy5hbGlnbm1lbnRfcG93ZXIuCi0KLVN1biBKdWwgMTAgMDA6MjY6MzkgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIGRpcy1hc20uaDogQWRkIHByaW50X2luc25fbnMzMmsgZGVjbGFyYXRpb24uCi0KLU1vbiBKdW4gMjAgMTc6MTM6MjkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKGJmZF9saW5rX2hhc2hfdGFibGUpOiBNYWtlIGNyZWF0b3IgYSBjb25zdCBwb2ludGVyLgotCi1TYXQgSnVuIDE4IDE2OjA5OjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaCAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogRGVjbGFyZS4KLQotVGh1IEp1biAxNiAxNToxOTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2luZm8pOiBBZGQgbmV3IGZpZWxkIHNoYXJlZC4KLQotTW9uIEp1biAgNiAxNDozOTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkpOiBSZW1vdmUgd3JpdHRlbiBmaWVsZDoKLQlub3QgbmVlZGVkIGZvciBhbGwgYmFja2VuZHMuCi0KLVRodSBBcHIgMjggMTk6MDY6NTAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChkaXNhc3NlbWJsZXIpOiBEZWNsYXJlLgotCi1GcmkgQXByICAxIDAwOjM4OjE3IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25AbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIG9ic3RhY2suaDogRGVsZXRlIHVzZSBvZiBJTl9HQ0MgdG8gY29udHJvbCB3aGV0aGVyCi0gICAgICAgIHN0ZGRlZi5oIG9yIGdzdGRkZWYuaCBpcyBpbmNsdWRlZC4KLQotVHVlIE1hciAyMiAxMzowNjowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZGxpbmsuaCAoZW51bSBiZmRfbGlua19vcmRlcl90eXBlKTogQWRkIGJmZF9kYXRhX2xpbmtfb3JkZXIuCi0JKHN0cnVjdCBiZmRfbGlua19vcmRlcik6IEFkZCBkYXRhIGZpZWxkIHRvIHVuaW9uLgotCi1Nb24gTWFyIDIxIDE4OjQ1OjI2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQ2hhbmdlIGJpdHNpemUgYXJndW1lbnQKLQl0byBhZGRfdG9fc2V0IHRvIHJlbG9jLiAgUmVtb3ZlIGJpdHNpemUgYXJndW1lbnQgZnJvbSBjb25zdHJ1Y3Rvci4KLQlDb21tZW50IHRoYXQgcmVsb2Nfb3ZlcmZsb3csIHJlbG9jX2Rhbmdlcm91cyBhbmQgdW5hdHRhY2hlZF9yZWxvYwotCW11c3QgaGFuZGxlIE5VTEwgcG9pbnRlcnMgZm9yIHJlbG9jIGxvY2F0aW9uLgotCShlbnVtIGJmZF9saW5rX29yZGVyX3R5cGUpOiBBZGQgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBhbmQKLQliZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIuCi0JKHN0cnVjdCBiZmRfbGlua19vcmRlcik6IEFkZCByZWxvYyBmaWVsZCB0byB1bmlvbi4KLQkoc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jKTogRGVmaW5lLgotCi1Nb24gTWFyIDE0IDEyOjI3OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5oOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KLQotVHVlIE1hciAgMSAxODoxMDo0OSAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBvczlrLmg6IG9zOTAwMCB0YXJnZXQgc3BlY2lmaWMgaGVhZGVyIGZpbGUsIHRoZSBoZWFkZXIgb2YgdGhlCi0Jb2JqZWN0IGZpbGUgaXMgdXNlZCBub3cuCi0KLVN1biBGZWIgMjcgMjE6NTI6MjYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0Lmg6IE5ldyBmaWxlLCBpbnRlbmRlZCB0byByZXBsYWNlIGllZWUtZmxvYXQuaC4KLQotU3VuIEZlYiAyMCAxNzoxNTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaCAoQU5TSV9QUk9UT1RZUEVTKTogRGVmaW5lIGlmIHVzaW5nIEFOU0kgcHJvdG90eXBlcy4KLQotV2VkIEZlYiAxNiAwMTowNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oOiBEb24ndCBkZWNsYXJlIHN0cnNpZ25hbCwgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGgKLQlTb2xhcmlzIHN5c3RlbSBoZWFkZXIgZmlsZXMuCi0KLVNhdCBGZWIgMTIgMjI6MTE6MzIgMTk5NCAgSmVmZnJleSBBLiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGxpYmliZXJ0eS5oICh4ZXhpdCk6IFVzZSBfX3ZvbGF0aWxlX18gdG8gYXZvaWQgbG9zaW5nIGlmCi0JY29tcGlsaW5nIHdpdGggZ2NjIC10cmFkaXRpb25hbC4KLQotVGh1IEZlYiAxMCAxNDowNTo0MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxpYmliZXJ0eS5oOiBOZXcgZmlsZS4gIERlY2xhcmVzIGZ1bmN0aW9ucyBwcm92aWRlZCBieQotCWxpYmliZXJ0eS4KLQotVHVlIEZlYiAgOCAwNToxOTo1MiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQlIYW5kbGUgb2JzdGFja19jaHVua19hbGxvYyByZXR1cm5pbmcgTlVMTC4gIFRoaXMgYWxsb3dzCi0Jb2JzdGFja3MgdG8gYmUgdXNlZCBieSBsaWJyYXJpZXMsIHdpdGhvdXQgZm9yY2luZyB0aGVtCi0JdG8gY2FsbCBleGl0IG9yIGxvbmdqbXAuCi0JKiBvYnN0YWNrLmggKHN0cnVjdCBvYnN0YWNrKTogQWRkIGFsbG9jX2ZhaWxlZCBmbGFnLgotCV9vYnN0YWNrX2JlZ2luLCBfb2JzdGFja19iZWdpbl8xKTogRGVjbGFyZSB0byByZXR1cm4gaW50LCBub3Qgdm9pZC4KLQkob2JzdGFja19maW5pc2gpOiBJZiBhbGxvY19mYWlsZWQsIHJldHVybiBOVUxMLgotCShvYnN0YWNrX2Jhc2UsIG9ic3RhY2tfbmV4dF9mcmVlLCBvYmpzdGFja19vYmplY3Rfc2l6ZSk6Ci0JSWYgYWxsb2NfZmFpbGVkLCByZXR1cm4gMC4KLQkob2JzdGFja19ncm93LCBvYnN0YWNrX2dyb3cwLCBvYnN0YWNrXzFncm93LCBvYnN0YWNrX3B0cl9ncm93LAotCW9ic3RhY2tfaW50X2dyb3csIG9ic3RhY2tfYmxhbmspOiBJZiBhbGxvY19mYWlsZWQsIGRvIG5vdGhpbmcgdGhhdAotCWNvdWxkIGNvcnJ1cHQgdGhlIG9ic3RhY2suCi0KLU1vbiBKYW4gMjQgMTU6MDY6MDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmggKHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MpOiBBZGQgbmFtZSwgcmVsb2NfbmFtZSBhbmQKLQlhZGRlbmQgYXJnbWVudHMgdG8gcmVsb2Nfb3ZlcmZsb3cgY2FsbGJhY2suCi0KLUZyaSBKYW4gMjEgMTk6MTM6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25fYmlnX3Bvd2VycGMsIHByaW50X2luc25fbGl0dGxlX3Bvd2VycGMsCi0JcHJpbnRfaW5zbl9yczYwMDApOiBEZWNsYXJlLgotCi1UaHUgSmFuICA2IDE0OjE1OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkbGluay5oIChzdHJ1Y3QgYmZkX2xpbmtfY2FsbGJhY2tzKTogQWRkIGJpdHNpemUgYXJndW1lbnQgdG8KLQlhZGRfdG9fc2V0IGZpZWxkLiAgQWRkIG5ldyBjYWxsYmFjayBuYW1lZCBjb25zdHJ1Y3Rvci4KLQotVGh1IERlYyAzMCAxMDo0NDowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmRsaW5rLmg6IE5ldyBmaWxlIGZvciBuZXcgQkZEIGxpbmtlciBiYWNrZW5kIHJvdXRpbmVzLgotCi1Nb24gTm92IDI5IDEwOjQzOjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oIChlbnVtIGRpc19pbnNuX3R5dXBlKTogUmVtb3ZlIG5vbi1BTlNJIHRyYWlsaW5nIGNvbW1hLgotCi1TYXQgT2N0ICAyIDIwOjQyOjI2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IE1vdmUgY29tbWVudCB0byByaWdodCBwbGFjZS4KLQotTW9uIEF1ZyAgOSAxOTowMzozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaCAob2JzdGFja19jaHVua2Z1biwgb2JzdGFja19mcmVlZnVuKTogQWRkIGRlZm5zIGZyb20KLQlwcmV2aW91cyB2ZXJzaW9uLiAgQXJlIHRoZXNlIEN5Z251cyBsb2NhbCBjaGFuZ2VzPwotCi1GcmkgQXVnICA2IDE3OjA1OjQ3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmgsIG9ic3RhY2suaDogVXBkYXRlIHRvIGxhdGVzdCBGU0YgdmVyc2lvbi4KLQotTW9uIEF1ZyAgMiAxNjozNzoxNCAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmL2kzODYuaDogIEFkZCBMeW54IG1hZ2ljIG51bWJlci4KLQotTW9uIEF1ZyAgMiAxNDo0NToyOSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiAgTW92ZSBlbnVtIG91dHNpZGUgb2Ygc3RydWN0IGRlZm4gdG8gYXZvaWQgd2FybmluZ3MuCi0KLU1vbiBBdWcgIDIgMDg6NDk6MzAgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogd2FpdC5oIChXRVhJVFNUQVRVUywgV1NUT1BTSUcpOiBNYXNrIGRvd24gdG8gOCBiaXRzLiAgVGhpcyBpcwotCWZvciBzeXN0ZW1zIHRoYXQgc3RvcmUgc3R1ZmYgaW50byB0aGUgaGlnaCAxNiBiaXRzIG9mIGEgd2FpdAotCXN0YXR1cy4KLQotRnJpIEp1bCAzMCAxODozODowMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiAgQWRkIG5ldyBmaWVsZHMgaW5zbl9pbmZvX3ZhbGlkLCBicmFuY2hfZGVsYXlfaW5zbnMsCi0JZGF0YV9zaXplLCBpbnNuX3R5cGUsIHRhcmdldCwgdGFyZ2V0Mi4gIFRoZXNlIGFyZSB1c2VkIHRvIHJldHVybgotCWluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RydWN0aW9uIGRlY29kZXJzIGJhY2sgdG8gdGhlIGNhbGxpbmcKLQlwcm9ncmFtLiAgQWRkIGNvbW1lbnRzLCBtYWtlIG1vcmUgcmVhZGFibGUuCi0KLU1vbiBKdWwgMTkgMjI6MTQ6MTQgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIG5sbTogIE5ldyBkaXJlY3RvcnkgY29udGFpbmluZyBOTE0vTmV0V2FyZSBpbmNsdWRlcy4KLQotVGh1IEp1bCAxNSAxMjoxMDowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8pOiBOZXcgZmllbGQgYXBwbGljYXRpb25fZGF0YS4KLQotVGh1IEp1bCAxNSAxMjo0MToxNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogQWRkZWQgZGVjbGFyYXRpb24gb2YgcHJpbnRfaW5zbl9tODhrLgotCi1UaHUgSnVsICA4IDA5OjA1OjI2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIG9wY29kZS9oODMwMC5oOiBMb3RzIG9mIGxpdHRsZSBmaXhlcyBmb3IgdGhlIGg4LzMwMGguCi0KLUZyaSBKdWwgIDIgMTA6MzE6NTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oOiBVc2UgQU5TSSBtYWNyb3MgaWYgX19taXBzIGFuZCBfU1lTVFlQRV9TVlI0IGFyZQotCWRlZmluZWQsIHNpbmNlIFJJU0MvT1MgY2MgaGFuZGxlcyBBTlNJIGRlY2xhcmF0aW9ucyBpbiBTVlI0IG1vZGUKLQlidXQgZG9lcyBub3QgZGVmaW5lIF9fU1REQ19fLgotCi1TdW4gSnVuIDIwIDE4OjI3OjUyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IERvbid0IG5lZWQgdG8gaW5jbHVkZSBhbnNpZGVjbC5oIGFueSBtb3JlLgotCi1GcmkgSnVuIDE4IDAzOjIyOjEwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvYXN5cy5oOiAgRWxpbWluYXRlICJpbnQ4X3R5cGUiLCAiaW50MTZfdHlwZSIsICJpbnQzMl90eXBlIiwgYW5kCi0JdGhlaXIgdmFyaWFudHMuICBUaGVzZSBjaGFuZ2VzIGFyZSBjb29yZGluYXRlZCB3aXRoIGNvcnJlc3BvbmRpbmcKLQljaGFuZ2VzIGluIC4uL2JmZC9vYXN5cy5jLgotCi1XZWQgSnVuIDE2IDEwOjQzOjA4IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIE5vdGUgdGhhdCBpdCBoYXMgYmVlbiByZW1vdmVkLgotCi1UdWUgSnVuICA4IDEyOjE2OjAzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkgU3VwcG9ydCBmb3IgSDgvMzAwLUgKLQkqIGRpcy1hc20uaCAocHJpbnRfaW5zbl9oODMwMCwgcHJpbnRfaW5zbl9oODMwMGgpOiBEZWNsYXJlIGl0LgotCSogY29mZi9oODMwMC5oOiBOZXcgbWFnaWMgbnVtYmVyLgotCSogY29mZi9pbnRlcm5hbC5oOiBOZXcgcmVsb2NhdGlvbnMuCi0JKiBvcGNvZGUvaDgzMDAuaDogTG90cyBvZiBuZXcgb3Bjb2Rlcy4KLQotVHVlIEp1biAgMSAwNzozNTowMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaCAoY29uc3QpOiBEb24ndCBkZWZpbmUgaXQgaWYgaXQncyBhbHJlYWR5IGRlZmluZWQuCi0KLVRodSBNYXkgMjcgMTg6MTk6NTEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmggKHByaW50X2luc25faHBwYSk6IERlY2xhcmUgaXQuCi0KLQkqIGJmZC5oOiBNb3ZlZCB0byBiZmQgZGlyZWN0b3J5LiAgU21hbGwgc3R1YiBoZXJlIGluY2x1ZGVzIGl0Ci0Jd2l0aG91dCByZXF1aXJpbmcgIi1JLi4vYmZkIi4KLQotVGh1IEFwciAyOSAxMjowNjoxMyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgd2l0aCBCU0ZfRlVOQ1RJT04uCi0KLU1vbiBBcHIgMjYgMTg6MTU6NTAgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oLCBkaXMtYXNtLmg6IFVwZGF0ZWQgd2l0aCBIaXRhY2hpIFNILgotCi1GcmkgQXByIDIzIDE4OjQxOjM4IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlZCB3aXRoIGFscGhhIGNoYW5nZXMuCi0JKiBkaXMtYXNtLmg6IEFkZGVkIGFscGhhLgotCi1GcmkgQXByIDE2IDE3OjM1OjMwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBzaWduZWQgYmZkXypnZXRfKi4KLQotVGh1IEFwciAxNSAwOToyNDoyMSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZWQgZm9yIGZpbGVfdHJ1bmNhdGVkIGVycm9yLgotCi1UaHUgQXByICA4IDEwOjUzOjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogSWYgbm8gQU5TSSwgZGVmaW5lIGNvbnN0IHRvIGJlIGVtcHR5LgotCi1UaHUgQXByICAxIDA5OjAwOjEwIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IERlY2xhcmUgYTI5ayBhbmQgaTk2MCBwcmludF9pbnNuXyouCi0KLQkqIGRpcy1hc20uaDogQWRkIHByaW50X2FkZHJlc3NfZnVuYyBhbmQgcmVsYXRlZCBzdHVmZi4KLQotCSogZGlzLWFzbS5oIChkaXNfYXNtX3JlYWRfbWVtb3J5KTogRml4IHByb3RvdHlwZS4KLQotV2VkIE1hciAzMSAxNzo0MDoxNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZGlzLWFzbS5oOiBBZGQgcHJpbnRfaW5zbl9zcGFyYy4KLQotV2VkIE1hciAzMSAxNzo1MTo0MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIGZvciBCRkRfUkVMT0NfTUlQU19HUFJFTCBhbmQgYmZkX1tnc11ldF9ncF9zaXplCi0JcHJvdG90eXBlcy4KLQotV2VkIE1hciAzMSAxNjozNToxMiAxOTkzICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjeWdudXMuY29tKQotCi0JKiBkaXMtYXNtLmg6IChkaXNhc3NlbWJsZV9pbmZvKTogIEZpeCB0eXBvIGluIHByb3RvdHlwZSBvZgotCWRpc19hc21fbWVtb3J5X2Vycm9yKCkuCi0KLVR1ZSBNYXIgMzAgMTk6MDk6MjMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaCAoZGlzYXNzZW1ibGVyX2luZm8pOiBBZGQgcmVhZF9tZW1vcnlfZnVuYywKLQltZW1vcnlfZXJyb3JfZnVuYywgYnVmZmVyLCBhbmQgbGVuZ3RoLgotCSh7R0RCXyx9SU5JVF9ESVNBU1NFTUJMRV9JTkZPKTogU2V0IHRoZW0uCi0JcHJpbnRfaW5zbl8qOiBSZW1vdmUgc2Vjb25kIGFyZ3VtZW50LgotCi1UdWUgTWFyIDMwIDE0OjQ4OjU1IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogVXBkYXRlIGZvciBsbWEgZmllbGQgb2Ygc2VjdGlvbi4KLQotVHVlIE1hciAzMCAxMjoyMjo1NSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogYW5zaWRlY2wuaDogVXNlIEFOU0kgdmVyc2lvbnMgb24gQUlYIHJlZ2FyZGxlc3Mgb2YgX19TVERDX18uCi0KLUZyaSBNYXIgMTkgMTQ6NDk6NDkgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGRpcy1hc20uaDogQWRkIGg4NTAwLgotCi1UaHUgTWFyIDE4IDEzOjQ5OjA5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5oOiAgTW92ZWQgZnJvbSAuLi9nZGIuCi0JKiBkaXMtYXNtLmg6ICBOZXcgZmlsZS4gIEludGVyZmFjZSB0byBkaXMtYXNzZW1ibGVyLgotCi1UaHUgTWFyIDExIDEwOjUyOjU3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oIChETUdMX05PX09QVFMpOiAgQWRkIGRlZmluZSAoc2V0IHRvIDApIHRvIHVzZQotCWluIHBsYWNlIG9mIGJhcmUgMCwgZm9yIHJlYWRhYmlsaXR5IHJlYXNvbnMuCi0KLVR1ZSBNYXIgIDIgMTc6NTA6MTEgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGRlbWFuZ2xlLmg6ICBSZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIGNmcm9udCB3aXRoIEFSTS4KLQotVHVlIEZlYiAyMyAxMjoyMToxNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgZm9yIG5ldyBlbGVtZW50cyBpbiBKVU1QX1RBQkxFLgotCi1UdWUgRmViIDE2IDAwOjUxOjMwIDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSBmb3IgQkZEX1ZFUlNJT04gMi4xLgotCi1UdWUgSmFuIDI2IDExOjQ5OjIwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3IgU0VDX0lTX0NPTU1PTiBmbGFnLgotCi1UdWUgSmFuIDE5IDEyOjI1OjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSBmb3IgYmZkX2FzeW1ib2xfdmFsdWUgYnVnIGZpeC4KLQotRnJpIEphbiAgOCAxNjozNzoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGUgdG8gaW5jbHVkZSBFQ09GRiB0ZGF0YSBhbmQgdGFyZ2V0X2ZsYXZvdXIuCi0KLVN1biBEZWMgMjcgMTc6NTI6MzAgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgQWRkIGRlY2xhcmF0aW9uIGZvciBiZmRfZ2V0X3NpemUoKS4KLQotVHVlIERlYyAyMiAyMjo0Mjo0NiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZGVtYW5nbGUuaDogIFByb3RlY3QgZmlsZSBmcm9tIG11bHRpcGxlIGluY2x1c2lvbnMgd2l0aAotCSNpZiAhZGVmaW5lZChERU1BTkdMRV9IKS4uLiNkZWZpbmUgREVNQU5HTEVfSC4uLiNlbmRpZi4KLQotTW9uIERlYyAyMSAyMToyNTo1MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSB0byBnZXQgaHBwYV9jb3JlX3N0cnVjdCBmcm9tIGJmZC5jLgotCi1UaHUgRGVjIDE3IDAwOjQyOjM1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFVwZGF0ZSB0byBnZXQgdGVraGV4IHRkYXRhIG5hbWUgY2hhbmdlIGZyb20gYmZkLgotCi1Nb24gTm92ICA5IDIzOjU1OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oOiAgVXBkYXRlIGNvbW1lbnRzIHRvIGRpc2NvdXJhZ2UgdXNlIG9mIEVYRlVOLgotCi1UaHUgTm92ICA1IDE2OjM1OjQ0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IFVwZGF0ZSB0byBicmluZyBpbiBTRUNfU0hBUkVEX0xJQlJBUlkuCi0KLVRodSBOb3YgIDUgMDM6MjE6MzIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgVXBkYXRlIHRvIG1hdGNoIEVYRlVOLCBiZmRfc2VjbGV0X3N0cnVjdCwgYW5kIFNERUYKLQljbGVhbnVwcyBpbiBiZmQuCi0KLVdlZCBOb3YgIDQgMDc6Mjg6MDUgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGJvdXQuaCAoTl9DQUxMTkFNRSwgTl9CQUxOQU1FKTogRGVmaW5lIGFzIGNoYXItdHlwZSB2YWx1ZXMsIHNvCi0Jd2lkZW5pbmcgd29ya3MgY29uc2lzdGVudGx5LgotCi1GcmkgT2N0IDE2IDAzOjE3OjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaDogIFVwZGF0ZSB0byBSZXZpc2VkIFN0YW5kYXJkIEZTRiBWZXJzaW9uLgotCi1UaHUgT2N0IDE1IDIxOjQzOjIyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmggKHN0cnVjdCBvcHRpb24pOiB1c2UgdGhlIHByb3ZpZGVkIGVudW0gZm9yIGhhc19hcmcuCi0KLQkqIGRlbWFuZ2xlLmggKEFVVE9fREVNQU5HTElORywgR05VX0RFTUFOR0xJTkcsCi0JICBMVUNJRF9ERU1BTkdMSU5HKTogdWx0cml4IGNvbXBpbGVycyByZXF1aXJlIGVudW1zIHRvIGJlCi0JICBlbnVtcyBhbmQgaW50cyB0byBiZSBpbnRzIGFuZCBjYXN0cyB3aGVyZSB0aGV5IG1lZXQuICBjYXN0IHNvbWUKLQkgIGVudW1zIGludG8gaW50cy4KLQotVGh1IE9jdCAxNSAwNDozNTo1MSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBVcGRhdGUgYWZ0ZXIgY29tbWVudCBjaGFuZ2VzLgotCi1UaHUgT2N0ICA4IDA5OjAzOjAyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaCAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyKTogbmV3IG1hY3JvIGZvciBnZXR0aW5nIGluIHh2ZWMKLQotVGh1IFNlcCAgMyAwOToxMDo1MCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaCAoc3RydWN0IHJlbG9jX2hvd3RvX3N0cnVjdCk6ICBzaXplIG5lZWRzIHRvIGJlIHNpZ25lZCBpZgotCWl0J3MgZ29pbmcgdG8gaG9sZCBuZWdhdGl2ZSB2YWx1ZXMuCi0KLVN1biBBdWcgMzAgMTc6NTA6MjcgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkZW1hbmdsZS5oOiAgTmV3IGZpbGUsIG1vdmVkIGZyb20gLi4vZ2RiLiAgTWFkZSBpbmRlcGVuZGVudAotCW9mIGdkYi4gIEFsbG93IGRlbWFuZ2xpbmcgc3R5bGUgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhCi0JcGFyYW1ldGVyIHRvIGNwbHVzX2RlbWFuZ2xlKCksIGJ1dCB1c2luZyB0aGUKLQljdXJyZW50X2RlbWFuZ2xpbmdfc3R5bGUgZ2xvYmFsIGFzIHRoZSBkZWZhdWx0LgotCi1TYXQgQXVnIDI5IDEwOjA3OjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6ICBNZXJnZSBjb21tZW50IGNoYW5nZSBmcm9tIGN1cnJlbnQgRlNGIHZlcnNpb24uCi0KLVRodSBBdWcgMjcgMTI6NTk6MjkgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6IGFkZCB3ZTMyawotCi1UdWUgQXVnIDI1IDE1OjA3OjQ3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogbmV3IGFmdGVyIFo4MDAwIHN0dWZmCi0KLU1vbiBBdWcgMTcgMDk6MDE6MjMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBSZWdlbmVyYXRlZCBhZnRlciBwYWdlL3NlZ21lbnQgc2l6ZSBjaGFuZ2VzLgotCi1TYXQgQXVnICAxIDEzOjQ2OjMxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmg6IE1lcmdlIGNoYW5nZXMgZnJvbSBjdXJyZW50IEZTRiB2ZXJzaW9uLgotCi1Nb24gSnVsIDIwIDIxOjA2OjIzIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmggKGFyZWFfaWQsIGZsYWdzKTogIFJlbW92ZSwgcmVwbGFjZSB3aXRoIGV4dHJhX2FyZywKLQl1c2VfZXh0cmFfYXJnLCBhbmQgbWF5YmVfZW1wdHlfb2JqZWN0LgotCSogb2JzdGFjay5oIChPQlNUQUNLX01BWUJFX0VNUFRZX09CSkVDVCwgT0JTVEFDS19NTUFMTE9DX0xJS0UpOgotCVJlbW92ZSwgcmVwbGFjZWQgYnkgbWF5YmVfZW1wdHlfb2JqZWN0IGFuZCB1c2VfZXh0cmFfYXJnIGJpdGZpZWxkcy4KLQkqIG9ic3RhY2suaCAob2JzdGFja19mdWxsX2JlZ2luLCBfb2JzdGFja19iZWdpbik6ICBSZW1vdmUgYXJlYV9pZAotCWFuZCBmbGFncyBhcmd1bWVudHMuCi0JKiBvYnN0YWNrLmggKG9ic3RhY2tfYWxsb2NfYXJnKTogIE5ldyBtYWNybyB0byBzZXQgZXh0cmFfYXJnLgotCi1UaHUgSnVsIDE2IDA4OjEyOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogbmV3IGFmdGVyIGFkZGluZyBCRkRfSVNfUkVMQVhBQkxFCi0KLVNhdCBKdWwgIDQgMDM6MjI6MjMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiAgUmVnZW4gYWZ0ZXIgYWRkaW5nIEJTRl9GSUxFLgotCi1Nb24gSnVuIDI5IDE0OjE4OjM2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZiBhdCBzdW5maXNoKQotCi0JKiBvYnN0YWNrLmg6ICBDb252ZXJ0IGJjb3B5KCkgdXNlIHRvIG1lbWNweSgpLCB3aGljaCBpcyBtb3JlCi0JcG9ydGFibGUsIG1vcmUgc3RhbmRhcmQsIGFuZCBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgZ2NjJ3MgYnVpbHRpbgotCWZ1bmN0aW9ucyBmb3IgaW5jcmVhc2VkIHBlcmZvcm1hbmNlLgotCi1UaHUgSnVuIDI1IDA0OjQ2OjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhbnNpZGVjbC5oIChQQVJBTVMpOiAgSW5jb3Jwb3JhdGUgdGhpcyBtYWNybyBmcm9tIGdkYidzIGRlZnMuaC4KLQlJdCdzIGEgY2xlYW5lciB3YXkgdG8gZm9yd2FyZC1kZWNsYXJlIGZ1bmN0aW9uIHByb3RvdHlwZXMuCi0KLUZyaSBKdW4gMTkgMTU6NDY6MzIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmg6ICBIUFBBIG1lcmdlLgotCi1UdWUgSnVuIDE2IDIxOjMwOjU2IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuaDogZ3JhdHVpdG91cyB3aGl0ZSBzcGFjZSBjaGFuZ2VzIG1lcmdlZCBmcm9tIG90aGVyIHByZXAKLQkgIHJlbGVhc2VzLgotCi1UaHUgSnVuIDExIDAxOjEwOjU1IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFJlZ2VuJ2QgZnJvbSBiZmQuYyBhZnRlciByZW1vdmluZyBlbGZfY29yZV90ZGF0YV9zdHJ1Y3QuCi0KLU1vbiBNYXkgMTggMTc6Mjk6MDMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5oOiBtZXJnZWQgY2hhbmdlcyBmcm9tIG1ha2UtMy42Mi4xMS4KLQotCSogZ2V0b3B0Lmg6IG1lcmdlZCBjaGFuZ2VzIGZyb20gZ3JlcC0xLjYgKGFscGhhKS4KLQotRnJpIE1heSAgOCAxNDo1MzozMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0Lmg6IG1lcmdlZCBjaGFuZ2VzIGZyb20gYmlzb24tMS4xOC4KLQotU2F0IE1hciAxNCAxNzoyNToyMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5oOiAgQWRkICJhcmVhX2lkIiBhbmQgImZsYWdzIiBtZW1iZXJzIHRvIG9ic3RhY2sKLQlzdHJ1Y3R1cmUuICBBZGQgb2JzdGFja19jaHVua2Z1bigpIGFuZCBvYnN0YWNrX2ZyZWVmdW4oKSB0bwotCXNldCBmdW5jdGlvbnMgZXhwbGljaXRseS4gIENvbnZlcnQgbWF5YmVfZW1wdHlfb2JqZWN0IHRvCi0JYSBiaXQgaW4gImZsYWdzIi4KLQotVGh1IEZlYiAyNyAyMjowMTowMiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogd2FpdC5oIChXSUZTVE9QUEVEKTogIEFkZCBJQk0gcnM2MDAwLXNwZWNpZmljIHZlcnNpb24uCi0KLUZyaSBGZWIgMjEgMjA6NDk6MjAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG9ic3RhY2suaDogIEFkZCBvYnN0YWNrX2Z1bGxfYmVnaW4uCi0JKiBiZmQuaCwgb2JzdGFjay5oOiAgUHJvdG9saW50LgotCi1UaHUgSmFuIDMwIDAxOjE4OjQyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBiZmQuaDogIFJlbW92ZSBjb21tYSBmcm9tIGVudW0gZGVjbGFyYXRpb24uCi0KLU1vbiBKYW4gMjcgMjI6MDE6MTMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmggOiBuZXcgdGFyZ2V0IGVudHIsIGJmZF9yZWxheF9zZWN0aW9uCi0KLVdlZCBEZWMgMTggMTc6MTk6NDQgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmgsIGllZWUuaCwgb3Bjb2RlL202OGsuaCwgb3Bjb2RlL3NwYXJjLmg6ICBBTlNJZnkgZW51bXMuCi0KLVRodSBEZWMgMTIgMjA6NTk6NTYgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGZvcGVuLXNhbWUuaCwgZm9wZW4tYmluLmg6ICBOZXcgZmlsZXMgZm9yIGNvbmZpZ3VyaW5nCi0Jd2hldGhlciBmb3BlbiBkaXN0aW5ndWlzaGVzIGJpbmFyeSBmaWxlcyBvciBub3QuICBGb3IgdXNlCi0JYnkgaG9zdC1kZXBlbmRlbnQgY29uZmlnIGZpbGVzLgotCi1TYXQgTm92IDMwIDIwOjQ2OjQzIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBiZmQuaDogY2hhbmdlIHRoZSBkb2N1bWVudGF0aW9uIGZvcm1hdC4KLQotCSogY3JlYXRlZCBjb2ZmLCBlbGYgYW5kIG9wY29kZSBhbmQgYW91dCBkaXJlY3Rvcmllcy4gTW92ZWQ6Ci0KLQlhb3V0NjQuaAk9PT4gYW91dC9hb3V0NjQuaAotCWFyLmgJCT09PiBhb3V0L2FyLmgKLQlhLm91dC5lbmNhcC5oCT09PiBhb3V0L2VuY2FwLmgKLQlhLm91dC5ob3N0LmgJPT0+IGFvdXQvaG9zdC5oCi0JYS5vdXQuaHAuaAk9PT4gYW91dC9ocC5oCi0JYS5vdXQuc3VuNC5oCT09PiBhb3V0L3N1bjQuaAotCXJhbmxpYi5oCT09PiBhb3V0L3JhbmxpYi5oCi0JcmVsb2MuaAkJPT0+IGFvdXQvcmVsb2MuaAotCXN0YWIuZGVmCT09PiBhb3V0L3N0YWIuZGVmCi0Jc3RhYi5nbnUuaAk9PT4gYW91dC9zdGFiX2dudS5oCi0KLQljb2ZmLWEyOWsuaAk9PT4gY29mZi9hMjlrLmgKLQljb2ZmLWg4MzAwLmgJPT0+IGNvZmYvaDgzMDAuaAotCWNvZmYtaTM4Ni5oCT09PiBjb2ZmL2kzODYuaAotCWNvZmYtaTk2MC5oCT09PiBjb2ZmL2k5NjAuaAotCWludGVybmFsY29mZi5oCT09PiBjb2ZmL2ludGVybmFsLmgKLQljb2ZmLW02OGsuaAk9PT4gY29mZi9tNjhrLmgKLQljb2ZmLW04OGsuaAk9PT4gY29mZi9tODhrLmgKLQljb2ZmLW1pcHMuaAk9PT4gY29mZi9taXBzLmgKLQljb2ZmLXJzNjAwMC5oCT09PiBjb2ZmL3JzNjAwMC5oCi0KLQllbGYtY29tbW9uLmgJPT0+IGVsZi9jb21tb24uaAotCWR3YXJmLmgJCT09PiBlbGYvZHdhcmYuaAotCWVsZi1leHRlcm5hbC5oCT09PiBlbGYvZXh0ZXJuYWwuaAotCWVsZi1pbnRlcm5hbC5oICA9PT4gZWxmL2ludGVybmFsLmgKLQotCWEyOWstb3Bjb2RlLmgJPT0+IG9wY29kZS9hMjlrLmgKLQlhcm0tb3Bjb2RlLmgJPT0+IG9wY29kZS9hcm0uaAotCWg4MzAwLW9wY29kZS5oCT09PiBvcGNvZGUvaDgzMDAuaAotCWkzODYtb3Bjb2RlLmgJPT0+IG9wY29kZS9pMzg2LmgKLQlpODYwLW9wY29kZS5oCT09PiBvcGNvZGUvaTg2MC5oCi0JaTk2MC1vcGNvZGUuaAk9PT4gb3Bjb2RlL2k5NjAuaAotCW02OGstb3Bjb2RlLmgJPT0+IG9wY29kZS9tNjhrLmgKLQltODhrLW9wY29kZS5oCT09PiBvcGNvZGUvbTg4ay5oCi0JbWlwcy1vcGNvZGUuaAk9PT4gb3Bjb2RlL21pcHMuaAotCW5wMS1vcGNvZGUuaAk9PT4gb3Bjb2RlL25wMS5oCi0JbnMzMmstb3Bjb2RlLmgJPT0+IG9wY29kZS9uczMyay5oCi0JcG4tb3Bjb2RlLmgJPT0+IG9wY29kZS9wbi5oCi0JcHlyLW9wY29kZS5oCT09PiBvcGNvZGUvcHlyLmgKLQlzcGFyYy1vcGNvZGUuaAk9PT4gb3Bjb2RlL3NwYXJjLmgKLQl0YWhvZS1vcGNvZGUuaAk9PT4gb3Bjb2RlL3RhaG9lLmgKLQl2YXgtb3Bjb2RlLmgJPT0+IG9wY29kZS92YXguaAotCi0KLQotV2VkIE5vdiAyNyAxMDozODozMSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWxjb2ZmLmg6IChpbnRlcm5hbF9zY25oZHIpIHRvb2sgb3V0ICNkZWYgZGVwZW5kZW5jeSwgbm93Ci0Jc19ucmVsb2MgYW5kIHNfbmxubm8gYXJlIGFsd2F5cyBsb25nLiAJKGludGVybmFsX3JlbG9jKTogYWxsd2F5cwotCWhhcyBhbiBvZmZzZXQgZmllbGQgbm93LgotCi1GcmkgTm92IDIyIDA4OjEyOjU4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBjb2ZmLXJzNjAwMC5oOiAgTGludDsgdXNlIHVuc2lnbmVkIGNoYXJzIGZvciBleHRlcm5hbCBmaWVsZHMuCi0JKiBpbnRlcm5hbGNvZmYuaDogIExpbnQ7IGNhc3Qgc3RvcmFnZSBjbGFzc2VzIHRvIHNpZ25lZCBjaGFyLgotCi1UaHUgTm92IDIxIDIxOjAxOjA1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZjogUmVtb3ZlIHRoZSBHTlUgZXh0ZW5kZWQgdHlwZSBjb2RlcyAoZS5nLiBOX1NFVFQpLgotCSogYW91dDY0Lmg6ICBUaGUgaGV1cmlzdGljIGZvciBkaXN0aW5ndWlzaGluZyBiZXR3ZWVuCi0Jc3Vub3Mtc3R5bGUgYW5kIGJzZC1zdHlsZSBaTUFHSUMgZmlsZXMgKHdydC4gd2hlcmUgdGhlCi0JdGV4dCBzZWdtZW50IHN0YXJ0cykgaXMgbW92ZWQgaW50byAodGhlIGRlZmF1bHQgZGVmaW5pdGlvbiBvZikKLQl0aGUgbWFjcm8gTl9IRUFERVJfSU5fVEVYVC4gIFRoaXMgZGVmaW5pdGlvbiBpcyBvbmx5IHVzZWQKLQlpZiBubyBvdGhlciBkZWZpbml0aW9uIGlzIHVzZWQgLSBlLmcuIGJmZC9uZXdzb3MzLmMgZGVmaW5lcwotCU5fSEVBREVSX0lOX1RFWFQoeCkgdG8gYmUgYWx3YXlzIDAgKGFzIGJlZm9yZSkuCi0KLVRodSBOb3YgMjEgMTE6NTM6MDMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIChOX1RYVEFERFIsIE5fVFhUT0ZGLCBOX1RYVFNJWkUpOiAgTmV3IGRlZmluaXRpb25zCi0JdGhhdCBzaG91bGQgaGFuZGxlIGFsbCB1c2VzLiAgTE9HSUNBTF8gdmVyc2lvbnMgZGVsZXRlZC4KLQlFbGltaW5hdGUgTl9IRUFERVJfSU5fVEVYVCwgdXNpbmcgYV9lbnRyeSB0byBkZXRlcm1pbmUgd2hpY2gKLQlraW5kIG9mIHptYWdpYyBhLm91dCBmaWxlIHdlIGFyZSBsb29raW5nIGF0LgotCSogY29mZi1yczYwMDAuaDogIFR5cG8uCi0KLVR1ZSBOb3YgMTkgMTg6NDM6MzcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkoTm90ZTogIFRoaXMgaXMgYSByZXZpc2VkIGVudHJ5LCBhcyB3YXMgYW91dDY0LmguKQotCSogYW91dDY0Lmg6ICBTb21lIGNsZWFudXBzIG9mIE5fVFhUQUREUiBhbmQgTl9UWFRPRkY6Ci0JV2lsbCBub3cgd29yayBmb3IgYm90aCBvbGQtIGFuZCBuZXctc3R5bGUgWk1BR0lDIGZpbGVzLAotCWRlcGVuZGluZyBvbiBOX0hFQURFUl9JTl9URVhUIG1hY3JvLgotCUFkZCBMT0dJQ0FMX1RYVEFERFIsIExPSUNBTF9UWFRPRkYgYW5kIExPR0lDQUxfVFhUU0laRQotCXRoYXQgZG9uJ3QgY291bnQgdGhlIGV4ZWMgaGVhZGVyIGFzIHBhcnQKLQlvZiB0aGUgdGV4dCBzZWdtZW50LCB0byBiZSBjb25zaXN0ZW50IHdpdGggYmZkLgotCSogYS5vdXQuc3VuNC5oOiAgU2ltcGxpZmllZC9maXhlZCBmb3IgcHJldmlvdXMgY2hhbmdlLgotCi1Nb24gTm92IDE4IDAwOjAyOjA2IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBkd2FyZi5oOiAgVXBkYXRlIHRvIERXQVJGIGRyYWZ0IDUgdmVyc2lvbiBmcm9tIGdjYzIuCi0KLVRodSBOb3YgMTQgMTk6NDQ6NTkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgQWRkZWQgZGVmcyBmb3IgZXh0ZW5kZWQgR05VIHN5bWJvbCB0eXBlcywKLQlzdWNoIGFzIE5fU0VUVC4gIFRoZXNlIGFyZSBub3JtYWxseSBpZmRlZidkIG91dCAoYmVjYXVzZQotCW9mIGNvbmZsaWN0cyB3aXRoIGEub3V0LmdudS5oKSwgYnV0IGFyZSB1c2VkIGJ5IGJmYl9zdGFiX25hbWUoKS4KLQotVGh1IE5vdiAxNCAxOToxNzowMyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZWxmLWNvbW1vbi5oOiAgQWRkIGRlZmluZXMgdG8gc3VwcG9ydCBFTEYgc3ltYm9sIHRhYmxlIGNvZGUuCi0KLU1vbiBOb3YgMTEgMTk6MDE6MDYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGVsZi1pbnRlcm5hbC5oLCBlbGYtZXh0ZXJuYWwuaCwgZWxmLWNvbW1vbi5oOiAgQWRkIHN1cHBvcnQgZm9yCi0Jbm90ZSBzZWN0aW9ucywgd2hpY2ggYXJlIHVzZWQgaW4gRUxGIGNvcmUgZmlsZXMgdG8gaG9sZCBjb3BpZXMKLQlvZiB2YXJpb3VzIC9wcm9jIHN0cnVjdHVyZXMuCi0KLVRodSBOb3YgIDcgMDg6NTg6MjYgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWxjb2ZmLmg6IHRvb2sgb3V0IHRoZSBNODggZGVwZW5kZW5jeSBpbiB0aGUgbGluZW5vCi0Jc3RydWN0LgotCSogY29mZi1tODhrLmg6IGRlZmluZXMgR0VUX0xJTkVOT19MTk5PIGFuZCBQVVRfTElORU5PX0xOTk8gdG8gdXNlCi0JMzJiaXQgbGlubm8gZW50cmllcy4KLQkqIGEyOWstb3Bjb2RlLmg6IGZpeGVkIGVuY29kaW5nIG9mIG10YWNjCi0KLVN1biBOb3YgIDMgMTE6NTQ6MjIgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOiBVcGRhdGVkIGZyb20gLi4vYmZkL2JmZC1pbi5oIChxLnYpLgotCi1GcmkgTm92ICAxIDExOjEzOjUzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbGNvZmYuaDogIEFkZCB4X2NzZWN0IGRlZmluZXMuCi0KLUZyaSBPY3QgMjUgMDM6MTg6MjAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIFJlbmFtZSBDT0ZGLXJlbGF0ZWQgZmlsZXMgaW4gYGNvZmYtQVJDSC5oJyBmb3JtLgotCWNvZmYtYTI5ay5oLCBjb2ZmLWkzODYuaCwgY29mZi1pOTYwLmgsIGNvZmYtbTY4ay5oLCBjb2ZmLW04OGsuaCwKLQljb2ZmLW1pcHMuaCwgY29mZi1yczYwMDAuaCB0byBiZSBleGFjdC4KLQotVGh1IE9jdCAyNCAyMjoxMToxMSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCVJTLzYwMDAgc3VwcG9ydCwgYnkgTWV0aW4gRy4gT3ppc2lrLCBNaW1pIFBo+/RuZy1UaOVvIFb1LCBhbmQKLQlKb2huIEdpbG1vcmUuCi0KLQkqIGEub3V0LmdudS5oOiAgVXBkYXRlIHNsaWdodGx5LgotCSogYmZkLmg6ICBBZGQgbmV3IGVycm9yIGNvZGUsIGZpeCBkb2MsIGFkZCBiZmRfYXJjaF9yczYwMDAuCi0JKiBpbnRlcm5hbGNvZmYuaDogIEFkZCBtb3JlIEZfIGNvZGVzIGZvciBmaWxlaGRyLiAgQWRkCi0JcnMvNjAwMC1kZXBlbmRlbnQgZmllbGRzIHRvIGFvdXRoZHIuICBBZGQgc3RvcmFnZSBjbGFzc2VzCi0JdG8gc3ltZW50cy4gIEFkZCA2MDAwLXNwZWNpZmljIGF1eGVudC4gIEFkZCByX3NpemUgaW4gcmVsb2MuCi0JKiByczYwMDBjb2ZmLmM6ICBOZXcgZmlsZS4KLQotVGh1IE9jdCAyNCAwNDoxMzoyMCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogTmV3IGZpbGUgZm9yIGR3YXJmIHN1cHBvcnQuICBDb3BpZWQgZnJvbSBnY2MyCi0JZGlzdHJpYnV0aW9uLgotCi1XZWQgT2N0IDE2IDEzOjMxOjQ1IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogIFJlbW92ZSBQQUdFX1NJWkUgZGVmaW5lczsgdGhleSBhcmUgdGFyZ2V0LWRlcGVuZGVudC4KLQlBZGQgTl9GTl9TRVEgZm9yIE5fRk4gc3ltYm9sIHR5cGUgdXNlZCBvbiBTZXF1ZW50IG1hY2hpbmVzLgotCSogc3RhYi5kZWY6ICBJbmNsdWRlIE5fRk5fU0VRIGluIHRhYmxlLgotCSogYm91dC5oOiAgRXh0ZXJuYWwgZm9ybWF0cyBvZiBzdHJ1Y3R1cmVzIHVzZSB1bnNpZ25lZCBjaGFycy4KLQotRnJpIE9jdCAxMSAxMjo0MDo0MyAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHN0ZXZlIGF0IGN5Z251cy5jb20pCi0KLQkqIGJmZC5oOnVwZ3JhZGUgZnJvbSBiZmQuYwotCSogaW50ZXJuYWxjb2ZmLmg6IGFkZCBuX25hbWUsIG5femVyb2VzIGFuZCBuX29mZnNldCBtYWNyb3MKLQkqIGFtZGNvZmYuaDogRGVmaW5lIE9NQUdJQyBhbmQgQU9VVEhEUlNaLgotCi1GcmkgT2N0IDExIDEwOjU4OjA2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBhLm91dC5ob3N0Lmg6IENoYW5nZSBTRUdNRU5UX1NJWkUgdG8gMHgxMDAwIGZvciBTb255LgotCSogYmZkLmggKGFsaWduX3Bvd2VyKTogQWRkIChhY3R1YWxseSBtb3ZlKSBjb21tZW50LgotCi1UdWUgT2N0ICA4IDE1OjI5OjMyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzeXMvaC1ydGJzZC5oOiBEZWZpbmUgTUlTU0lOR19WRlBSSU5UIChmb3IgYmludXRpbHMvYnVjb21tLmMpLgotCi1TdW4gT2N0ICA2IDE5OjI0OjM5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogIE1vdmUgc3RydWN0IGludGVybmFsX2V4ZWMgdG8gLi4vYmZkL2xpYmFvdXQuaCBzbwotCWl0IGNhbiBiZSBzaGFyZWQgYnkgYWxsIGBhLm91dC1mYW1pbHknIGNvZGUuICBSZW5hbWUKLQlFWFRFUk5BTF9MSVNUX1NJWkUgdG8gRVhURVJOQUxfTkxJU1RfU0laRS4gIFVzZSBiYXNpYyB0eXBlcwotCWZvciBubGlzdCBtZW1iZXJzLCBhbmQgbWFrZSBzdHJ4IGludGVncmFsIHJhdGhlciB0aGFuIHBvaW50ZXIuCi0JTW9yZSBjb21tZW50YXJ5IG9uIG5fdHlwZSB2YWx1ZXMuCi0JKiBib3V0Lmg6ICBQcm92aWRlIGEgc3RydWN0IGV4dGVybmFsX2V4ZWMgcmF0aGVyIHRoYW4gYW4KLQlpbnRlcm5hbF9leGVjLgotCSogbTY4a2NvZmYuaDogIFJlbW92ZSBgdGFnZW50cmllcycgd2hpY2ggc251Y2sgaW4gZnJvbSB0aGUgaTk2MAotCUNPRkYgcG9ydC4KLQotRnJpIE9jdCAgNCAwMToyNTo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtb3Bjb2RlLmg6ICBSZW1vdmUgYF9lbnVtJyBmcm9tIHRoZSB0eXBlZGVmIGZvciBhbiBlbnVtLgotCSogYmZkLmg6ICBVcGRhdGUgdG8gbWF0Y2ggYmZkIGNoYW5nZXMuCi0KLQkqIHN5cy9oLWkzODZtYWNoLmgsIHN5c2RlcC5oOiAgQWRkIDM4NiBNYWNoIGhvc3Qgc3VwcG9ydC4KLQotVHVlIE9jdCAgMSAwNDo1ODo0MiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYmZkLmgsIGVsZi1jb21tb24uaCwgZWxmLWV4dGVybmFsLmgsIGVsZi1pbnRlcm5hbC5oOgotCUFkZCBwcmVsaW1pbmFyeSBFTEYgc3VwcG9ydCwgc3VmZmljaWVudCBmb3IgR0RCLCBmcm9tIEZyZWQgRmlzaC4KLQkqIHN5c2RlcC5oLCBzeXMvaC1hbWl4Lmg6ICBTdXBwb3J0IEFtaWdhIFNWUjQuCi0KLQkqIHN5cy9oLXZheHVsdC5oOiAgTWFrZSBpdCB3b3JrLiAgKERhdmlkIFRheWxvciA8dGF5bG9yQHRoaW5rLmNvbT4pCi0JKiBhLm91dC52YXguaDogIFJlbW92ZSB1bnVzZWQgYW5kIGNvbmZ1c2luZyBmaWxlLgotCi1Nb24gU2VwIDMwIDEyOjUyOjM1IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAuaDogRGVmaW5lIE5FV1NPUzNfU1lTLCBhbmQgdXNlIGl0LgotCi1GcmkgU2VwIDIwIDEzOjM4OjIxIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhLm91dC5nbnUuaCAoTl9GTik6ICBJdHMgdmFsdWUgKnJlYWxseSBpcyogMHgxRi4KLQlGaXggaXQsIGFuZCBhZGQgY29tbWVudHMgd2FybmluZyBhYm91dCBvci1pbmcgTl9FWFQgd2l0aCBpdAotCWFuZC9vciBOX1dBUk5JTkcuCi0JKiBhb3V0NjQuaCAoTl9GTik6ICBGaXggdmFsdWUsIGFkZCBjb21tZW50cyBhYm91dCBOX0VYVC4KLQkqIHN0YWIuZGVmICh0YWJsZSBhdCBlbmQpOiAgVXBkYXRlIHRvIHNob3cgYWxsIHRoZSB0eXBlCi0JdmFsdWVzIDwweDIwLCBpbmNsdWRpbmcgbG93IG9yZGVyIGJpdHMuICBNb3ZlIE5fRk4gdG8KLQlpdHMgcmlnaHRmdWwgcGxhY2UuCi0KLVR1ZSBTZXAgMTcgMTc6NDE6MzcgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogc3lzL2gtaXJpeDMuaDogIHNnaS9pcml4IHN1cHBvcnQuCi0KLVR1ZSBTZXAgMTcgMDc6NTI6NTkgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JKiBzdGFiLmRlZiAoTl9ERUZEKTogIEFkZCBHTlUgTW9kdWxhLTIgZGVidWcgc3RhYiwgZnJvbSBBbmRyZXcKLQlCZWVycy4KLQotVGh1IFNlcCAxMiAxNDoxMjo1OSAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsY29mZi5oIChTWU1OTUxFTiwgRklMTk1MRU4sIERJTU5VTSk6ICBEZWZpbmUgdGhlc2UKLQlmb3IgaW50ZXJuYWxjb2ZmLCBzZXBhcmF0ZWx5IGZyb20gdGhlIHZhcmlvdXMgZXh0ZXJuYWwgY29mZidzLgotCSogYW1kY29mZi5oLCBiY3M4OGtjb2ZmLmgsIGkzODZjb2ZmLmgsIGludGVsLWNvZmYuaCwgbTY4a2NvZmYuaCwKLQltODhrLWJjcy5oOiBQcmVmaXggU1lNTk1MRU4sIEZJTE5NTEVOLCBhbmQgRElNTlVNIHdpdGggRV8ncyBmb3IKLQl0aGUgZXh0ZXJuYWwgc3RydWN0IGRlZmluaXRpb25zLgotCSogZWNvZmYuaDogUmVtb3ZlIHRoZXNlICNkZWZpbmUncywga2x1ZGdlIG5vIGxvbmdlciBuZWVkZWQuCi0KLQkqIHN5cy9oLXVsdHJhMy5oOiAgQWRkIG5ldyBVbHRyYWNvbXB1dGVyIGhvc3QuCi0JKiBzeXNkZXAuaDogIEFkZCBVTFRSQTNfU1lNMV9TWVMgYW5kIHVzZSBpdC4KLQotVHVlIFNlcCAxMCAxMDoxMTo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnaW50LmN5Z251cy5jb20pCi0KLQkqIGkzODZjb2ZmLmggKExJTkVTWik6ICBBbHdheXMgNiwgbm90IGJhc2VkIG9uIHNpemVvZigpLgotCShGaXggZnJvbSBQZXRlciBTY2hhdWVyIDxwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZT4uKQotCi1XZWQgU2VwICA0IDA4OjU4OjM3IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuZ251LmgsIGFvdXQ2NC5oOiAgQWRkIE5fV0FSTklORy4gIENoYW5nZSBOX0ZOIHRvIDB4MEUsCi0JdG8gbWF0Y2ggU3VuT1MgYW5kIEJTRC4gIEFkZCBOX0NPTU0gYXMgMHgxMiBmb3IgU3VuT1Mgc2hhcmVkIGxpYgotCXN1cHBvcnQuCi0JKiBzdGFiLmRlZjogIEFkZCBOX0NPTU0gdG8gdGFibGUsIGZpeCBvdmVybGFwIGNvbW1lbnQuCi0KLVR1ZSBTZXAgIDMgMDY6Mjk6MjAgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z2ludC5jeWdudXMuY29tKQotCi0JTWVyZ2Ugd2l0aCBsYXRlc3QgRlNGIHZlcnNpb25zIG9mIHRoZXNlIGZpbGVzLgotCi0JKiBzdGFiLmdudS5oOiAgQWRkIExBU1RfVU5VU0VEX1NUQUJfQ09ERS4KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIHRvIEdQTDIuICBNb3ZlIE5fV0FSTklORyBvdXQsIHNpbmNlIG5vdCBhCi0JZGVidWcgc3ltYm9sLiAgQ2hhbmdlIGNvbW1lbnRzLCBhbmQgcmVvcmRlciB0YWJsZSB0byBudW1lcmljCi0Jb3JkZXIuICBVcGRhdGUgZmluYWwgdGFibGUgY29tbWVudC4KLQkoTl9EU0xJTkUsIE5fQlNMSU5FKTogIFJlbnVtYmVyIGZyb20gMHg2NiBhbmQgMHg2OCwgdG8gMHg0NiBhbmQgMHg0OC4KLQotCSogb2JzdGFjay5oOiAgR1BMMi4gIE1lcmdlLgotCi1GcmkgQXVnIDIzIDAxOjU0OjIzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogYS5vdXQuZ251LmgsIGEub3V0LnN1bjQuaDogIE1ha2UgU0VHTUVOVF9TSVpFIGFibGUgdG8gZGVwZW5kCi0Jb24gdGhlIHBhcnRpY3VsYXIgYS5vdXQgYmVpbmcgZXhhbWluZWQuCi0JKiBhLm91dC5zdW40Lmg6ICBEZWZpbmUgc2VnbWVudCBzaXplcyBmb3IgU3VuLTMncyBhbmQgU3VuLTQncy4KLQkqIEZJWE1FOiAgYS5vdXQuZ251LmggaXMgYWxtb3N0IG9ic29sZXRlLgotCSogRklYTUU6ICBhLm91dC5zdW40Lmggc2hvdWxkIGJlIHJlbmFtZWQgYS5vdXQuc3VuLmggbm93LgotCi1XZWQgQXVnIDIxIDIwOjMyOjEzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogU3RhcnQgYSBDaGFuZ2VMb2cgZm9yIHRoZSBpbmNsdWRlcyBkaXJlY3RvcnkuCi0KLQkqIGEub3V0LmdudS5oIChOX0ZOKTogIEZpeCB2YWx1ZSAtLSB3YXMgMTUsIHNob3VsZCBiZSAweDFFLgotCSogc3RhYi5kZWY6ICBVcGRhdGUgYWxsb2NhdGlvbiB0YWJsZSBpbiBjb21tZW50cyBhdCBlbmQsCi0JdG8gcmVmbGVjdCByZWFsaXR5IGFzIEkga25vdyBpdC4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogY2hhbmdlLWxvZwotbGVmdC1tYXJnaW46IDgKLWZpbGwtY29sdW1uOiA3NAotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbnNpZGVjbC5oIGIvaW5jbHVkZS9hbnNpZGVjbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI5ZmI3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW5zaWRlY2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKiBBTlNJIGFuZCB0cmFkaXRpb25hbCBDIGNvbXBhdGFiaWxpdHkgbWFjcm9zCi0gICBDb3B5cmlnaHQgMTk5MSwgMTk5MiwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBBTlNJIGFuZCB0cmFkaXRpb25hbCBDIGNvbXBhdGliaWxpdHkgbWFjcm9zCi0KLSAgIEFOU0kgQyBpcyBhc3N1bWVkIGlmIF9fU1REQ19fIGlzICNkZWZpbmVkLgotCi0gICBNYWNybwlBTlNJIEMgZGVmaW5pdGlvbglUcmFkaXRpb25hbCBDIGRlZmluaXRpb24KLSAgIC0tLS0tCS0tLS0gLSAtLS0tLS0tLS0tCS0tLS0tLS0tLS0tIC0gLS0tLS0tLS0tLQotICAgUFRSCQlgdm9pZCAqJwkJYGNoYXIgKicKLSAgIExPTkdfRE9VQkxFCWBsb25nIGRvdWJsZScJCWBkb3VibGUnCi0gICBWT0xBVElMRQlgdm9sYXRpbGUnCQlgJwotICAgU0lHTkVECWBzaWduZWQnCQlgJwotICAgUFRSQ09OU1QJYHZvaWQgKmNvbnN0JwkJYGNoYXIgKicKLSAgIEFOU0lfUFJPVE9UWVBFUyAgMQkJCW5vdCBkZWZpbmVkCi0KLSAgIENPTlNUIGlzIGFsc28gZGVmaW5lZCwgYnV0IGlzIG9ic29sZXRlLiAgSnVzdCB1c2UgY29uc3QuCi0KLSAgIG9ic29sZXRlIC0tICAgICBERUZVTiAobmFtZSwgYXJnbGlzdCwgYXJncykKLQotCURlZmluZXMgZnVuY3Rpb24gTkFNRS4KLQotCUFSR0xJU1QgbGlzdHMgdGhlIGFyZ3VtZW50cywgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgZW5jbG9zZWQgaW4KLQlwYXJlbnRoZXNlcy4gIEFSR0xJU1QgYmVjb21lcyB0aGUgYXJndW1lbnQgbGlzdCBpbiB0cmFkaXRpb25hbCBDLgotCi0JQVJHUyBsaXN0IHRoZSBhcmd1bWVudHMgd2l0aCB0aGVpciB0eXBlcy4gIEl0IGJlY29tZXMgYSBwcm90b3R5cGUgaW4KLQlBTlNJIEMsIGFuZCB0aGUgdHlwZSBkZWNsYXJhdGlvbnMgaW4gdHJhZGl0aW9uYWwgQy4gIEFyZ3VtZW50cyBzaG91bGQKLQliZSBzZXBhcmF0ZWQgd2l0aCBgQU5EJy4gIEZvciBmdW5jdGlvbnMgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgotCWFyZ3VtZW50cywgdGhlIGxhc3QgdGhpbmcgbGlzdGVkIHNob3VsZCBiZSBgRE9UUycuCi0KLSAgIG9ic29sZXRlIC0tICAgICBERUZVTl9WT0lEIChuYW1lKQotCi0JRGVmaW5lcyBhIGZ1bmN0aW9uIE5BTUUsIHdoaWNoIHRha2VzIG5vIGFyZ3VtZW50cy4KLQotICAgb2Jzb2xldGUgLS0gICAgIEVYRlVOIChuYW1lLCAocHJvdG90eXBlKSkJLS0gb2Jzb2xldGUuCi0KLQlSZXBsYWNlZCBieSBQQVJBTVMuICBEbyBub3QgdXNlOyB3aWxsIGRpc2FwcGVhciBzb21lZGF5IHNvb24uCi0JV2FzIHVzZWQgaW4gZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCUluIEFOU0kgQyBpdCBpcyBgTkFNRSBQUk9UT1RZUEUnIChzbyBQUk9UT1RZUEUgc2hvdWxkIGJlIGVuY2xvc2VkIGluCi0JcGFyZW50aGVzZXMpLiAgSW4gdHJhZGl0aW9uYWwgQyBpdCBpcyBgTkFNRSgpJy4KLQlGb3IgYSBmdW5jdGlvbiB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cywgUFJPVE9UWVBFIHNob3VsZCBiZSBgKHZvaWQpJy4KLQotICAgb2Jzb2xldGUgLS0gICAgIFBST1RPICh0eXBlLCBuYW1lLCAocHJvdG90eXBlKSAgICAtLSBvYnNvbGV0ZS4KLQotCVRoaXMgb25lIGhhcyBhbHNvIGJlZW4gcmVwbGFjZWQgYnkgUEFSQU1TLiAgRG8gbm90IHVzZS4KLQotICAgUEFSQU1TICgoYXJncykpCi0KLQlXZSBjb3VsZCB1c2UgdGhlIEVYRlVOIG1hY3JvIHRvIGhhbmRsZSBwcm90b3R5cGUgZGVjbGFyYXRpb25zLCBidXQKLQl0aGUgbmFtZSBpcyBtaXNsZWFkaW5nIGFuZCB0aGUgcmVzdWx0IGlzIHVnbHkuICBTbyB3ZSBqdXN0IGRlZmluZSBhCi0Jc2ltcGxlIG1hY3JvIHRvIGhhbmRsZSB0aGUgcGFyYW1ldGVyIGxpc3RzLCBhcyBpbjoKLQotCSAgICAgIHN0YXRpYyBpbnQgZm9vIFBBUkFNUyAoKGludCwgY2hhcikpOwotCi0JVGhpcyBwcm9kdWNlczogIGBzdGF0aWMgaW50IGZvbygpOycgb3IgYHN0YXRpYyBpbnQgZm9vIChpbnQsIGNoYXIpOycKLQotCUVYRlVOIHdvdWxkIGhhdmUgZG9uZSBpdCBsaWtlIHRoaXM6Ci0KLQkgICAgICBzdGF0aWMgaW50IEVYRlVOIChmb28sIChpbnQsIGNoYXIpKTsKLQotCWJ1dCB0aGUgZnVuY3Rpb24gaXMgbm90IGV4dGVybmFsLi4uYW5kIGl0J3MgaGFyZCB0byB2aXN1YWxseSBwYXJzZQotCXRoZSBmdW5jdGlvbiBuYW1lIG91dCBvZiB0aGUgbWVzcy4gICBFWEZVTiBzaG91bGQgYmUgY29uc2lkZXJlZAotCW9ic29sZXRlOyBuZXcgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB0byB1c2UgUEFSQU1TLgotCi0gICBET1RTIGlzIGFsc28gb2Jzb2xldGUuCi0KLSAgIEV4YW1wbGVzOgotCi0JZXh0ZXJuIGludCBwcmludGYgUEFSQU1TICgoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pKTsKLSovCi0KLSNpZm5kZWYJX0FOU0lERUNMX0gKLQotI2RlZmluZQlfQU5TSURFQ0xfSAkxCi0KLQotLyogRXZlcnkgc291cmNlIGZpbGUgaW5jbHVkZXMgdGhpcyBmaWxlLAotICAgc28gdGhleSB3aWxsIGFsbCBnZXQgdGhlIHN3aXRjaCBmb3IgbGludC4gICovCi0vKiBMSU5UTElCUkFSWSAqLwotCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX0FJWCkgfHwgKGRlZmluZWQgKF9fbWlwcykgJiYgZGVmaW5lZCAoX1NZU1RZUEVfU1ZSNCkpIHx8IGRlZmluZWQoX1dJTjMyKQotLyogQWxsIGtub3duIEFJWCBjb21waWxlcnMgaW1wbGVtZW50IHRoZXNlIHRoaW5ncyAoYnV0IGRvbid0IGFsd2F5cwotICAgZGVmaW5lIF9fU1REQ19fKS4gIFRoZSBSSVNDL09TIE1JUFMgY29tcGlsZXIgZGVmaW5lcyB0aGVzZSB0aGluZ3MKLSAgIGluIFNWUjQgbW9kZSwgYnV0IGRvZXMgbm90IGRlZmluZSBfX1NURENfXy4gICovCi0KLSNkZWZpbmUJUFRSCQl2b2lkICoKLSNkZWZpbmUJUFRSQ09OU1QJdm9pZCAqQ09OU1QKLSNkZWZpbmUJTE9OR19ET1VCTEUJbG9uZyBkb3VibGUKLQotI2lmbmRlZiBJTl9HQ0MKLSNkZWZpbmUJQU5ECQksCi0jZGVmaW5lCU5PQVJHUwkJdm9pZAotI2RlZmluZQlWT0xBVElMRQl2b2xhdGlsZQotI2RlZmluZQlTSUdORUQJCXNpZ25lZAotI2VuZGlmIC8qICEgSU5fR0NDICovCi0KLSNkZWZpbmUgUEFSQU1TKHBhcmFtbGlzdCkJCXBhcmFtbGlzdAotI2RlZmluZSBBTlNJX1BST1RPVFlQRVMJCQkxCi0KLSNkZWZpbmUgVlBBUkFNUyhBUkdTKQkJCUFSR1MKLSNkZWZpbmUgVkFfU1RBUlQodmFfbGlzdCx2YXIpCQl2YV9zdGFydCh2YV9saXN0LHZhcikKLQotLyogVGhlc2UgYXJlIG9ic29sZXRlLiAgRG8gbm90IHVzZS4gICovCi0jaWZuZGVmIElOX0dDQwotI2RlZmluZSBDT05TVAkJCQljb25zdAotI2RlZmluZSBET1RTCQkJCSwgLi4uCi0jZGVmaW5lIFBST1RPKHR5cGUsIG5hbWUsIGFyZ2xpc3QpCXR5cGUgbmFtZSBhcmdsaXN0Ci0jZGVmaW5lIEVYRlVOKG5hbWUsIHByb3RvKQkJbmFtZSBwcm90bwotI2RlZmluZSBERUZVTihuYW1lLCBhcmdsaXN0LCBhcmdzKQluYW1lKGFyZ3MpCi0jZGVmaW5lIERFRlVOX1ZPSUQobmFtZSkJCW5hbWUodm9pZCkKLSNlbmRpZiAvKiAhIElOX0dDQyAqLwotCi0jZWxzZQkvKiBOb3QgQU5TSSBDLiAgKi8KLQotI2RlZmluZQlQVFIJCWNoYXIgKgotI2RlZmluZQlQVFJDT05TVAlQVFIKLSNkZWZpbmUJTE9OR19ET1VCTEUJZG91YmxlCi0KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lCUFORAkJOwotI2RlZmluZQlOT0FSR1MKLSNkZWZpbmUJVk9MQVRJTEUKLSNkZWZpbmUJU0lHTkVECi0jZW5kaWYgLyogIUlOX0dDQyAqLwotCi0jaWZuZGVmIGNvbnN0IC8qIHNvbWUgc3lzdGVtcyBkZWZpbmUgaXQgaW4gaGVhZGVyIGZpbGVzIGZvciBub24tYW5zaSBtb2RlICovCi0jZGVmaW5lCWNvbnN0Ci0jZW5kaWYKLQotI2RlZmluZSBQQVJBTVMocGFyYW1saXN0KQkJKCkKLQotI2RlZmluZSBWUEFSQU1TKEFSR1MpCQkJKHZhX2FsaXN0KSB2YV9kY2wKLSNkZWZpbmUgVkFfU1RBUlQodmFfbGlzdCx2YXIpCQl2YV9zdGFydCh2YV9saXN0KQotCi0vKiBUaGVzZSBhcmUgb2Jzb2xldGUuICBEbyBub3QgdXNlLiAgKi8KLSNpZm5kZWYgSU5fR0NDCi0jZGVmaW5lIENPTlNUCi0jZGVmaW5lIERPVFMKLSNkZWZpbmUgUFJPVE8odHlwZSwgbmFtZSwgYXJnbGlzdCkJdHlwZSBuYW1lICgpCi0jZGVmaW5lIEVYRlVOKG5hbWUsIHByb3RvKQkJbmFtZSgpCi0jZGVmaW5lIERFRlVOKG5hbWUsIGFyZ2xpc3QsIGFyZ3MpCW5hbWUgYXJnbGlzdCBhcmdzOwotI2RlZmluZSBERUZVTl9WT0lEKG5hbWUpCQluYW1lKCkKLSNlbmRpZiAvKiAhIElOX0dDQyAqLwotCi0jZW5kaWYJLyogQU5TSSBDLiAgKi8KLQotI2VuZGlmCS8qIGFuc2lkZWNsLmgJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cgYi9pbmNsdWRlL2FvdXQvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTRjZmQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotU3VuIEp1biAyOCAxMTozMzo0OCAxOTk4ICBQZXRlciBTY2hhdWVyICA8cGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGU+Ci0KLQkqIHN0YWIuZGVmOiAgQWRkIE5fQUxJQVMgZnJvbSBTdW5Qcm8gRjc3LgotCi1Nb24gTWFyIDExIDEyOjE1OjUyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3RhYi5kZWY6IFVzZSBfX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSByYXRoZXIgdGhhbiBfX2RlZmluZV9zdGFiCi0JZm9yIGR1cGxpY2F0ZSBlbnRyaWVzIE5fQlJPV1MgYW5kIE5fTU9EMi4KLQkqIHN0YWJfZ251LmggKF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKTogRGVmaW5lIGJlZm9yZSBpbmNsdWRpbmcKLQlzdGFiLmRlZi4KLQotRnJpIE9jdCAyNyAxNzo0NzoxNiAxOTk1ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiBhb3V0NjQuaCwgaG9zdC5oLCBocDMwMGhwdXguaCwgc3VuNC5oOiBDaGFuZ2VkIFBBR0VfU0laRSB0bwotCVRBUkdFVF9QQUdFX1NJWkUuCi0KLVR1ZSBTZXAgMTIgMTI6MDc6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdW40LmggKHN0cnVjdCBpbnRlcm5hbF9zdW40X2R5bmFtaWNfbGluayk6IENoYW5nZSBhbGwgZmllbGRzCi0JZnJvbSBsb25nIHRvIHVuc2lnbmVkIGxvbmcuCi0KLVdlZCBKdWwgMTIgMDA6MTU6MTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLXBjLmN5Z251cy5jb20+Ci0KLQkqIHN1bjQuaCAoUEFHRV9TSVpFKTogVW5kZWZpbmUgYmVmb3JlIGRlZmluaW5nLgotCi1UaHUgSnVuIDE2IDE0OjIyOjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKEJNQUdJQyk6IERlZmluZS4KLQotU2F0IEp1biAxMSAxNjoxNjowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgd2VhayBzeW1ib2xzIGFzIGFuIGV4dGVuc2lvbiB0byBhLm91dC4KLQkqIGFvdXQ2NC5oIChOX1dFQUtVLCBOX1dFQUtBLCBOX1dFQUtULCBOX1dFQUtELCBOX1dFQUtCKTogRGVmaW5lLgotCSogc3RhYi5kZWY6IFVwZGF0ZSBzeW1ib2wgdmFsdWUgdGFibGUuCi0KLVRodSBKdW4gIDIgMTc6MTM6MzggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdW40LmggKEVYVEVSTkFMX1NVTjRfRFlOQU1JQ19ERUJVR0dFUl9TSVpFKTogQ29ycmVjdCBmcm9tIDI4IHRvCi0JMjQuICBGaXggdXAgbGRfZ290IGNvbW1lbnQuCi0KLVdlZCBNYXIgMzAgMDA6MzE6NDkgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBkeW5peDMuaDogIENsZWFudXAsIGFkYXB0IHRvIGN1cnJlbnQgYmZkIHZlcnNpb24uCi0KLVNhdCBGZWIgMjYgMTA6MjU6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzIGZyb20gU1ZSNCBjYy4KLQotRnJpIEZlYiAxMSAxMjo1NjowNCAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGFyLmggKEFSTUFHLCBBUk1BR0IsIEFSRk1BRyk6IENoYW5nZSAnXG4nIHRvICdcMDEyJywgZm9yIGdyZWF0ZXIKLQlwb3J0YWJpbGl0eS4KLQotRnJpIEphbiAyMSAwMDo1OTowNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN1bjQuaDogQWRkZWQgaW5mb3JtYXRpb24gYWJvdXQgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcy4KLQotRnJpIEphbiAgNyAwODoyMDoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fVFhUQUREUik6IEFkZCBjb21tZW50IHJlZ2FyZGluZyBPTUFHSUMgYW5kIE5NQUdJQy4KLQotU2F0IERlYyAyNSAxNDo1NTo0MSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fREFUT0ZGKTogRG9uJ3QgcGFkIChyZXZlcnQgY2hhbmdlIG9mIDggSnVsIDE5OTMpLgotCi1UdWUgTm92IDE2IDE1OjQzOjQ2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaDogTmV3IG1hY3JvcyBaTUFHSUNfRElTS19CTE9DS19TSVpFIGFuZCBOX0RJU0tfQkxPQ0tfU0laRQotCWZvciBMaW51eCBaTUFHSUMuCi0JKE5fVFhUT0ZGLCBOX0RBVE9GRik6IFVzZSB0aGVtLgotCi1UaHUgTm92ICA0IDAwOjMzOjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFKTogRml4ZWQgdmFsdWUgdG8gbWF0Y2gKLQlzdW4zIHN5c3RlbTsgdXNlZCB0byBvdmVybGFwIG90aGVyIGZpZWxkcy4KLQkoUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFKTogTGlrZXdpc2UuCi0KLVdlZCBOb3YgIDMgMTM6NDg6MjcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhb3V0NjQuaCAoUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9MSVRUTEUpOiBNYWtlIGl0IDB4MTAgKEtlbidzCi0Jc3VnZ2VzdGlvbikgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFLgotCi1GcmkgT2N0IDI5IDE1OjA5OjUyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4LmggKE5fU0hBUkVEX0xJQik6IERlZmluZSB0byBiZSAwLgotCi1Nb24gU2VwIDEzIDIxOjAwOjU2IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBhci5oIChBUk1BUF9USU1FX09GRlNFVCk6ICBBZGQgYW5kIGRlc2NyaWJlLgotCi1Nb24gQXVnIDIzICBTZWFuIEZhZ2FuICAoc2VmQGN5Z251cy5jb20pCi0KLQkqIGFvdXQ2NC5oIFtBUkNIX1NJWkUgIT0gNjRdOiBBbGxvdyBOX0JBRE1BRyB0byBiZSBvdmVycmlkZGVuLgotCi1Nb24gQXVnIDE2IDE0OjMwOjE0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdGFiX2dudS5oOiBJbmNsdWRlIGFvdXQvc3RhYi5kZWYgbm90IGp1c3Qgc3RhYi5kZWYuCi0KLVN1biBKdWwgMTggMjE6NDE6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBkeW5peDMuaDogTmV3LCBmb3Igc3ltbWV0cnkgcnVubmluZyBkeW5peC4KLQotVGh1IEp1bCAgOCAxMjo1MjoyMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKE5fQkFETUFHKTogUmVjb2duaXplIFFNQUdJQy4KLQlOX1RYVE9GRiwgTl9UWFRBRERSLCBOX1RYVFNJWkU6IFNwZWNpYWwgY29kZSBmb3IgUU1BR0lDLgotCU5fREFUT0ZGOiBQYWQgdGV4dCBzaXplIGlmIHdlIG5lZWQgdG8uCi0KLUZyaSBKdW4gMTggMTk6MTk6MzggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmIChOX0VDT01MKTogRml4IGNvbW1lbnQuCi0KLU1vbiBNYXkgMzEgMDk6MjE6MzAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiBSZW1vdmUgU29sYXJpcyBpbmZvcm1hdGlvbiBvbiBOX0ZVTiBzdGFic3RyaW5nIGdyYW1tYXI7Ci0JSSd2ZSB0cmFuc2ZlcnJlZCBpdCB0byBnZGIvZG9jL3N0YWJzLnRleGluZm8sIHdoZXJlIGl0IGJlbG9uZ3MuCi0KLU1vbiBNYXkgMTAgMDU6NDg6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGtyLXBjLmN5Z251cy5jb20pCi0KLQkqIGhwMzAwaHB1eC5oOiBQYXRjaCBmcm9tIEdsZW5uIEVuZ2VsIGZvciBsaW5rZXIgcHJvYmxlbSBhbmQKLQljb21wYXRpYmlsaXR5IGZpeDoKLQkoT01BR0lDLCBOTUFHSUMpOiBOZXcgZGVmaW5pdGlvbnMuCi0JKFNIQVJFTUFHSUMpOiBEZWxldGVkLgotCShIUFVYX0RPVF9PX01BR0lDKTogTmV3IG1hY3JvLgotCShfTl9CQURNQUcpOiBBZGp1c3RlZC4KLQkoTl9IRUFERVJfSU5fVEVYVCwgTl9EQVRBRERSKTogTmV3IG1hY3Jvcy4KLQotVGh1IEFwciAyOSAxMjowNzozNyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaHAzMDBocHV4Lmg6IE5ldyBmaWxlIGZyb20gR2xlbm4gRW5nZWwsIGdsZW5uZUBsc2lkLmhwLmNvbS4KLQotVHVlIEFwciAyNyAwNTo1MTowNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogYW91dDY0LmggKHN0cnVjdCBleHRlcm5hbF9leGVjLCAqTUFHSUMsIE5fQkFETUFHKTogRG9uJ3QgZGVmaW5lCi0JaWYgYGV4dGVybmFsX2V4ZWMnIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBhIG1hY3JvLgotCShOX0RBVE9GRiwgTl9UUkVMT0ZGLCBOX0RSRUxPRkYsIE5fU1lNT0ZGLCBOX1NUUk9GRik6IERvbid0IGRlZmluZQotCWlmIGFscmVhZHkgZGVmaW5lZC4KLQkoc3RydWN0IGV4dGVybmFsX25saXN0LCBFWFRFUk5BTF9OTElTVF9TSVpFKTogRG9uJ3QgZGVmaW5lIGlmCi0JYGV4dGVybmFsX25saXN0JyBpcyBhbHJlYWR5IGRlZmluZWQgYXMgYSBtYWNyby4KLQotU2F0IEF1ZyAxNSAwNDoyMzowMiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogYWRvYmUuaDogIEFkZCBkZXNjcmlwdGlvbiBvZiBhLm91dC5hZG9iZSBmb3JtYXQuCi0KLUZyaSBKdWwgIDMgMDA6MzY6NTIgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIG1vcmUgU29sYXJpcyBkZWZpbml0aW9ucy4KLQkqIHN0YWJfZ251Lmg6ICBBZGQgTl9TTyBsYW5ndWFnZSB0eXBlcywgYW5kIFNvbGFyaXMgYmFzaWMgZmxvYXQgdHlwZXMuCi0KLVN1biBKdW4gMTQgMTA6NTM6NTMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgVXBkYXRlIGRlc2NyaXB0aW9ucyBvZiBTb2xhcmlzLTIgc3RhYnM7IGFkZCBOX1VOREYuCi0KLVRodSBKdW4gMTEgMDE6MTI6MDcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHN0YWIuZGVmOiAgQWRkIE5fT0JKIGFuZCBOX09QVCBmcm9tIFNvbGFyaXMtMi4KLQotVGh1IEphbiAzMCAxODoxMjo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC9hb3V0NjQuaDogTl9UWFRTSVpFIG5lZWRzIHNvbWUgbW9yZSBwYXJlbnRoZXNlcy4KLQlJIGRvbid0IHRydXN0IEMgcHJlY2VkZW5jZS4KLQotV2VkIERlYyAxOCAxNDozMjowMSAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogYW91dC9hb3V0NjQuaDogIE1vdmUgY29tbW9uIHN1bm9zLXNwZWNpZmljIHRlc3QKLQl0byByZWNvZ25pemUgc2hhcmVkIGxpYnJhcmllcyBpbnRvIG5ldyBtYWNybyBOX1NIQVJFRF9MSUIuCi0JVXNlIGl0IHRvIHNpbXBsaWZ5JnJlZm9ybWF0IE5fVFhUQUREUiwgTl9UWFRPRkYsIE5fVFhUU0laRS4KLQotU2F0IE5vdiAzMCAyMDozNDo1MiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogQ2hhbmdlTG9nLCBhb3V0NjQuaCwgYXIuaCwgZW5jYXAuaCwgaG9zdC5oLCBocC5oLCByYW5saWIuaCwKLQlyZWxvYy5oLCBzdGFiLmRlZiwgc3RhYl9nbnUuaCwgc3VuNC5oOiBBbGwgbW92ZWQgZnJvbSB0aGUKLQlkZXZvL2luY2x1ZGUgZGlyZWN0b3J5Ci0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9hZG9iZS5oIGIvaW5jbHVkZS9hb3V0L2Fkb2JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmYxNWMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2Fkb2JlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyogYGEub3V0LmFkb2JlJyBkaWZmZXJlbmNlcyBmcm9tIHN0YW5kYXJkIGEub3V0IGZpbGVzICovCi0KLSNpZm5kZWYgX19BX09VVF9BRE9CRV9IX18KLSNkZWZpbmUgX19BX09VVF9BRE9CRV9IX18KLQotI2RlZmluZQlCWVRFU19JTl9XT1JECTQKLQotLyogU3RydWN0IGV4dGVybmFsX2V4ZWMgaXMgdGhlIHNhbWUuICAqLwotCi0vKiBUaGlzIGlzIHRoZSBsYXlvdXQgb24gZGlzayBvZiB0aGUgMzItYml0IG9yIDY0LWJpdCBleGVjIGhlYWRlci4gKi8KLQotc3RydWN0IGV4dGVybmFsX2V4ZWMgCi17Ci0gIGJmZF9ieXRlIGVfaW5mb1s0XTsJCS8qIG1hZ2ljIG51bWJlciBhbmQgc3R1ZmYJCSovCi0gIGJmZF9ieXRlIGVfdGV4dFtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2RhdGFbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHNlY3Rpb24gaW4gYnl0ZXMJKi8KLSAgYmZkX2J5dGUgZV9ic3NbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBic3MgYXJlYSBpbiBieXRlcyAJCSovCi0gIGJmZF9ieXRlIGVfc3ltc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBpbiBieXRlcyAJKi8KLSAgYmZkX2J5dGUgZV9lbnRyeVtCWVRFU19JTl9XT1JEXTsgLyogc3RhcnQgYWRkcmVzcyAJCQkqLwotICBiZmRfYnl0ZSBlX3Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gIGJmZF9ieXRlIGVfZHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gCSovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoNCArIEJZVEVTX0lOX1dPUkQgKiA3KQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciBhLm91dCBmaWxlcyAqLwotCi0jdW5kZWYJWk1BR0lDCi0jZGVmaW5lCVpNQUdJQwkweEFEMEJFCQkvKiBDdXRlLCBlaD8gICovCi0jdW5kZWYJT01BR0lDCi0jdW5kZWYJTk1BR0lDCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkJICAoKHgpLmFfaW5mbyAhPSBaTUFHSUMpCi0KLS8qIEJ5IGRlZmF1bHQsIHNlZ21lbnQgc2l6ZSBpcyBjb25zdGFudC4gIEJ1dCBzb21lIG1hY2hpbmVzIG92ZXJyaWRlIHRoaXMKLSAgIHRvIGJlIGEgZnVuY3Rpb24gb2YgdGhlIGEub3V0IGhlYWRlciAoZS5nLiBtYWNoaW5lIHR5cGUpLiAgKi8KLSNpZm5kZWYJTl9TRUdTSVpFCi0jZGVmaW5lCU5fU0VHU0laRSh4KQlTRUdNRU5UX1NJWkUKLSNlbmRpZgotI3VuZGVmIE5fU0VHU0laRSAgIC8qIEZJWE1FWFhYWCAqLwotCi0vKiBTZWdtZW50IGluZm9ybWF0aW9uIGZvciB0aGUgYS5vdXQuQWRvYmUgZm9ybWF0IGlzIHNwZWNpZmllZCBhZnRlciB0aGUKLSAgIGZpbGUgaGVhZGVyLiAgSXQgY29udGFpbnMgTiBzZWdtZW50IGRlc2NyaXB0b3JzLCBmb2xsb3dlZCBieSBvbmUgd2l0aAotICAgYSB0eXBlIG9mIHplcm8uICAKLQotICAgVGhlIGFjdHVhbCB0ZXh0IG9mIHRoZSBzZWdtZW50cyBzdGFydHMgYXQgTl9UWFRPRkYgaW4gdGhlIGZpbGUsCi0gICByZWdhcmRsZXNzIG9mIGhvdyBtYW55IG9yIGhvdyBmZXcgc2VnbWVudCBoZWFkZXJzIHRoZXJlIGFyZS4gICovCi0KLXN0cnVjdCBleHRlcm5hbF9zZWdkZXNjIHsKLQl1bnNpZ25lZCBjaGFyIGVfdHlwZVsxXTsKLQl1bnNpZ25lZCBjaGFyIGVfc2l6ZVszXTsKLQl1bnNpZ25lZCBjaGFyIGVfdmlydGJhc2VbNF07Ci0JdW5zaWduZWQgY2hhciBlX2ZpbGViYXNlWzRdOwotfTsKLQotc3RydWN0IGludGVybmFsX3NlZ2Rlc2MgewotCXVuc2lnbmVkIGludAlhX3R5cGU6ODsJLyogU2VnbWVudCB0eXBlIE5fVEVYVCwgTl9EQVRBLCAwICovCi0JdW5zaWduZWQgaW50IAlhX3NpemU6MjQ7CS8qIFNlZ21lbnQgc2l6ZSAqLwotCWJmZF92bWEJCWFfdmlydGJhc2U7CS8qIFZpcnR1YWwgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGludAlhX2ZpbGViYXNlOwkvKiBCYXNlIGFkZHJlc3MgaW4gb2JqZWN0IGZpbGUgKi8KLX07Ci0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQotLyogVGhpcyBpcyBkb2N1bWVudGVkIHRvIGJlIGF0IDEwMjQsIGJ1dCBhcHBlYXJzIHRvIHJlYWxseSBiZSBhdCAyMDQ4LgotICAgRklYTUU/ISAgKi8KLSNkZWZpbmUgTl9UWFRPRkYoeCkJMjA0OAotCi0jZGVmaW5lCU5fVFhUU0laRSh4KSAoKHgpLmFfdGV4dCkKLQotI2RlZmluZSBOX0RBVEFERFIoeCkKLQotI2RlZmluZSBOX0JTU0FERFIoeCkKLQotLyogT2Zmc2V0cyBvZiB0aGUgdmFyaW91cyBwb3J0aW9ucyBvZiB0aGUgZmlsZSBhZnRlciB0aGUgdGV4dCBzZWdtZW50LiAgKi8KLQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpICkKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0MCi0vKiBTeW1ib2xzICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbmxpc3QgewotICBiZmRfYnl0ZSBlX3N0cnhbQllURVNfSU5fV09SRF07CS8qIGluZGV4IGludG8gc3RyaW5nIHRhYmxlIG9mIG5hbWUgKi8KLSAgYmZkX2J5dGUgZV90eXBlWzFdOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIGJmZF9ieXRlIGVfb3RoZXJbMV07CQkJLyogbWlzYyBpbmZvICh1c3VhbGx5IGVtcHR5KSAqLwotICBiZmRfYnl0ZSBlX2Rlc2NbMl07CQkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX2J5dGUgZV92YWx1ZVtCWVRFU19JTl9XT1JEXTsJLyogdmFsdWUgb2Ygc3ltYm9sICovCi19OwotCi0jZGVmaW5lIEVYVEVSTkFMX05MSVNUX1NJWkUgKEJZVEVTX0lOX1dPUkQrNCtCWVRFU19JTl9XT1JEKQotCi1zdHJ1Y3QgaW50ZXJuYWxfbmxpc3QgewotICB1bnNpZ25lZCBsb25nIG5fc3RyeDsJCQkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIgbl90eXBlOwkJCS8qIHR5cGUgb2Ygc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIgbl9vdGhlcjsJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgdW5zaWduZWQgc2hvcnQgbl9kZXNjOwkJLyogZGVzY3JpcHRpb24gZmllbGQgKi8KLSAgYmZkX3ZtYSBuX3ZhbHVlOwkJCS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLQotLyogVGhlIG5fdHlwZSBmaWVsZCBpcyB0aGUgc3ltYm9sIHR5cGUsIGNvbnRhaW5pbmc6ICAqLwotCi0jZGVmaW5lIE5fVU5ERgkwCS8qIFVuZGVmaW5lZCBzeW1ib2wgKi8KLSNkZWZpbmUgTl9BQlMgCTIJLyogQWJzb2x1dGUgc3ltYm9sIC0tIGRlZmluZWQgYXQgcGFydGljdWxhciBhZGRyICovCi0jZGVmaW5lIE5fVEVYVCAJNAkvKiBUZXh0IHN5bSAtLSBkZWZpbmVkIGF0IG9mZnNldCBpbiB0ZXh0IHNlZyAqLwotI2RlZmluZSBOX0RBVEEgCTYJLyogRGF0YSBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gZGF0YSBzZWcgKi8KLSNkZWZpbmUgTl9CU1MgCTgJLyogQlNTICBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gemVybydkIHNlZyAqLwotI2RlZmluZQlOX0NPTU0JMHgxMgkvKiBDb21tb24gc3ltYm9sICh2aXNpYmxlIGFmdGVyIHNoYXJlZCBsaWIgZHlubGluaykgKi8KLSNkZWZpbmUgTl9GTgkweDFmCS8qIEZpbGUgbmFtZSBvZiAubyBmaWxlICovCi0jZGVmaW5lCU5fRk5fU0VRIDB4MEMJLyogTl9GTiBmcm9tIFNlcXVlbnQgY29tcGlsZXJzIChzaWdoKSAqLwotLyogTm90ZTogTl9FWFQgY2FuIG9ubHkgYmUgdXNlZnVsbHkgT1ItZWQgd2l0aCBOX1VOREYsIE5fQUJTLCBOX1RFWFQsCi0gICBOX0RBVEEsIG9yIE5fQlNTLiAgV2hlbiB0aGUgbG93LW9yZGVyIGJpdCBvZiBvdGhlciB0eXBlcyBpcyBzZXQsCi0gICAoZS5nLiBOX1dBUk5JTkcgdmVyc3VzIE5fRk4pLCB0aGV5IGFyZSB0d28gZGlmZmVyZW50IHR5cGVzLiAgKi8KLSNkZWZpbmUgTl9FWFQgCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChhcyBvcHBvc2VkIHRvIGxvY2FsLXRvLXRoaXMtZmlsZSkgKi8KLSNkZWZpbmUgTl9UWVBFICAweDFlCi0jZGVmaW5lIE5fU1RBQiAJMHhlMAkvKiBJZiBhbnkgb2YgdGhlc2UgYml0cyBhcmUgb24sIGl0J3MgYSBkZWJ1ZyBzeW1ib2wgKi8KLQotI2RlZmluZSBOX0lORFIgMHgwYQotCi0vKiBUaGUgZm9sbG93aW5nIHN5bWJvbHMgcmVmZXIgdG8gc2V0IGVsZW1lbnRzLgotICAgQWxsIHRoZSBOX1NFVFtBVERCXSBzeW1ib2xzIHdpdGggdGhlIHNhbWUgbmFtZSBmb3JtIG9uZSBzZXQuCi0gICBTcGFjZSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBzZXQgaW4gdGhlIHRleHQgc2VjdGlvbiwgYW5kIGVhY2ggc2V0Ci0gICBlbGVtZW50cyB2YWx1ZSBpcyBzdG9yZWQgaW50byBvbmUgd29yZCBvZiB0aGUgc3BhY2UuCi0gICBUaGUgZmlyc3Qgd29yZCBvZiB0aGUgc3BhY2UgaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2V0IChudW1iZXIgb2YgZWxlbWVudHMpLgotCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgc2V0IGlzIG1hZGUgaW50byBhbiBOX1NFVFYgc3ltYm9sCi0gICB3aG9zZSBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lIG9mIHRoZSBzZXQuCi0gICBUaGlzIHN5bWJvbCBhY3RzIGxpa2UgYSBOX0RBVEEgZ2xvYmFsIHN5bWJvbAotICAgaW4gdGhhdCBpdCBjYW4gc2F0aXNmeSB1bmRlZmluZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gICovCi0KLS8qIFRoZXNlIGFwcGVhciBhcyBpbnB1dCB0byBMRCwgaW4gYSAubyBmaWxlLiAgKi8KLSNkZWZpbmUJTl9TRVRBCTB4MTQJCS8qIEFic29sdXRlIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVFQJMHgxNgkJLyogVGV4dCBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRECTB4MTgJCS8qIERhdGEgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VUQgkweDFBCQkvKiBCc3Mgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0KLS8qIFRoaXMgaXMgb3V0cHV0IGZyb20gTEQuICAqLwotI2RlZmluZSBOX1NFVFYJMHgxQwkJLyogUG9pbnRlciB0byBzZXQgdmVjdG9yIGluIGRhdGEgYXJlYS4gICovCi0KLS8qIFdhcm5pbmcgc3ltYm9sLiBUaGUgdGV4dCBnaXZlcyBhIHdhcm5pbmcgbWVzc2FnZSwgdGhlIG5leHQgc3ltYm9sCi0gICBpbiB0aGUgdGFibGUgd2lsbCBiZSB1bmRlZmluZWQuIFdoZW4gdGhlIHN5bWJvbCBpcyByZWZlcmVuY2VkLCB0aGUKLSAgIG1lc3NhZ2UgaXMgcHJpbnRlZC4gICovCi0KLSNkZWZpbmUJTl9XQVJOSU5HIDB4MWUKLQotLyogUmVsb2NhdGlvbnMgCi0KLSAgVGhlcmUJYXJlIHR3byB0eXBlcyBvZiByZWxvY2F0aW9uIGZsYXZvdXJzIGZvciBhLm91dCBzeXN0ZW1zLAotICBzdGFuZGFyZCBhbmQgZXh0ZW5kZWQuIFRoZSBzdGFuZGFyZCBmb3JtIGlzIHVzZWQgb24gc3lzdGVtcyB3aGVyZSB0aGUKLSAgaW5zdHJ1Y3Rpb24gaGFzIHJvb20gZm9yIGFsbCB0aGUgYml0cyBvZiBhbiBvZmZzZXQgdG8gdGhlIG9wZXJhbmQsIHdoaWxzdAotICB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1c2VkIHdoZW4gYW4gYWRkcmVzcyBvcGVyYW5kIGhhcyB0byBiZSBzcGxpdCBvdmVyIG4KLSAgaW5zdHJ1Y3Rpb25zLiBFZywgb24gdGhlIDY4aywgZWFjaCBtb3ZlIGluc3RydWN0aW9uIGNhbiByZWZlcmVuY2UKLSAgdGhlIHRhcmdldCB3aXRoIGEgZGlzcGxhY2VtZW50IG9mIDE2IG9yIDMyIGJpdHMuIE9uIHRoZSBzcGFyYywgbW92ZQotICBpbnN0cnVjdGlvbnMgdXNlIGFuIG9mZnNldCBvZiAxNCBiaXRzLCBzbyB0aGUgb2Zmc2V0IGlzIHN0b3JlZCBpbgotICB0aGUgcmVsb2MgZmllbGQsIGFuZCB0aGUgZGF0YSBpbiB0aGUgc2VjdGlvbiBpcyBpZ25vcmVkLgotKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCi0gICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KLSAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlIHJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9CSUcJMHg4MAotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJMHgwMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9CSUcJMHg2MAotI2RlZmluZQlSRUxPQ19TVERfQklUU19MRU5HVEhfU0hfQklHCTUJLyogVG8gc2hpZnQgdG8gdW5pdHMgcGxhY2UgKi8KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0xJVFRMRQkweDA2Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJMHgxMAotI2RlZmluZQlSRUxPQ19TVERfQklUU19FWFRFUk5fTElUVExFCTB4MDgKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19CQVNFUkVMX0JJRwkweDA4Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCTB4MDgKLQotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9CSUcJMHgwNAotI2RlZmluZQlSRUxPQ19TVERfQklUU19KTVBUQUJMRV9MSVRUTEUJMHgwNAotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkweDAyCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0xJVFRMRQkweDAyCi0KLSNkZWZpbmUJUkVMT0NfU1REX1NJWkUJKEJZVEVTX0lOX1dPUkQgKyAzICsgMSkJCS8qIEJ5dGVzIHBlciByZWxvY2F0aW9uIGVudHJ5ICovCi0KLXN0cnVjdCByZWxvY19zdGRfaW50ZXJuYWwKLXsKLSAgYmZkX3ZtYSByX2FkZHJlc3M7CQkvKiBBZGRyZXNzICh3aXRoaW4gc2VnbWVudCkgdG8gYmUgcmVsb2NhdGVkLiAgKi8KLSAgLyogVGhlIG1lYW5pbmcgb2Ygcl9zeW1ib2xudW0gZGVwZW5kcyBvbiByX2V4dGVybi4gICovCi0gIHVuc2lnbmVkIGludCByX3N5bWJvbG51bToyNDsKLSAgLyogTm9uemVybyBtZWFucyB2YWx1ZSBpcyBhIHBjLXJlbGF0aXZlIG9mZnNldAotICAgICBhbmQgaXQgc2hvdWxkIGJlIHJlbG9jYXRlZCBmb3IgY2hhbmdlcyBpbiBpdHMgb3duIGFkZHJlc3MKLSAgICAgYXMgd2VsbCBhcyBmb3IgY2hhbmdlcyBpbiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gc3BlY2lmaWVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfcGNyZWw6MTsKLSAgLyogTGVuZ3RoIChhcyBleHBvbmVudCBvZiAyKSBvZiB0aGUgZmllbGQgdG8gYmUgcmVsb2NhdGVkLgotICAgICBUaHVzLCBhIHZhbHVlIG9mIDIgaW5kaWNhdGVzIDE8PDIgYnl0ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgcl9sZW5ndGg6MjsKLSAgLyogMSA9PiByZWxvY2F0ZSB3aXRoIHZhbHVlIG9mIHN5bWJvbC4KLSAgICAgcl9zeW1ib2xudW0gaXMgdGhlIGluZGV4IG9mIHRoZSBzeW1ib2wKLSAgICAgaW4gZmlsZXMgdGhlIHN5bWJvbCB0YWJsZS4KLSAgICAgMCA9PiByZWxvY2F0ZSB3aXRoIHRoZSBhZGRyZXNzIG9mIGEgc2VnbWVudC4KLSAgICAgcl9zeW1ib2xudW0gaXMgTl9URVhULCBOX0RBVEEsIE5fQlNTIG9yIE5fQUJTCi0gICAgICh0aGUgTl9FWFQgYml0IG1heSBiZSBzZXQgYWxzbywgYnV0IHNpZ25pZmllcyBub3RoaW5nKS4gICovCi0gIHVuc2lnbmVkIGludCByX2V4dGVybjoxOwotICAvKiBUaGUgbmV4dCB0aHJlZSBiaXRzIGFyZSBmb3IgU3VuT1Mgc2hhcmVkIGxpYnJhcmllcywgYW5kIHNlZW0gdG8KLSAgICAgYmUgdW5kb2N1bWVudGVkLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfYmFzZXJlbDoxOwkvKiBMaW5rYWdlIHRhYmxlIHJlbGF0aXZlICovCi0gIHVuc2lnbmVkIGludCByX2ptcHRhYmxlOjE7CS8qIHBjLXJlbGF0aXZlIHRvIGp1bXAgdGFibGUgKi8KLSAgdW5zaWduZWQgaW50IHJfcmVsYXRpdmU6MTsJLyogInJlbGF0aXZlIHJlbG9jYXRpb24iICovCi0gIC8qIHVudXNlZCAqLwotICB1bnNpZ25lZCBpbnQgcl9wYWQ6MTsJCS8qIFBhZGRpbmcgLS0gc2V0IHRvIHplcm8gKi8KLX07Ci0KLQotLyogRVhURU5ERUQgUkVMT0NTICAqLwotCi1zdHJ1Y3QgcmVsb2NfZXh0X2V4dGVybmFsIHsKLSAgYmZkX2J5dGUgcl9hZGRyZXNzW0JZVEVTX0lOX1dPUkRdOwkvKiBvZmZzZXQgb2Ygb2YgZGF0YSB0byByZWxvY2F0ZSAJKi8KLSAgYmZkX2J5dGUgcl9pbmRleFszXTsJLyogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHN5bWJvbCAJKi8KLSAgYmZkX2J5dGUgcl90eXBlWzFdOwkvKiByZWxvY2F0aW9uIHR5cGUJCQkqLwotICBiZmRfYnl0ZSByX2FkZGVuZFtCWVRFU19JTl9XT1JEXTsJLyogZGF0dW0gYWRkZW5kCQkJCSovCi19OwotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX0VYVEVSTl9CSUcJMHg4MAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCTB4MDEKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0JJRwkJMHgxRgotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX1NIX0JJRwkwCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfTElUVExFCTB4RjgKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMwotCi0vKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxICsgQllURVNfSU5fV09SRCkKLQotZW51bSByZWxvY190eXBlCi17Ci0gIC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLwotICBSRUxPQ184LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLwotICBSRUxPQ19ESVNQOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19ESVNQMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AzMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogU3BlY2lhbCAqLwotICBSRUxPQ19XRElTUDMwLAkJLyogZGF0YVswOjI5XSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfV0RJU1AyMiwJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0hJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdik+PjEwIAkqLwotICBSRUxPQ18yMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSAJCSovCi0gIFJFTE9DXzEzLAkJCS8qIGRhdGFbMDoxMl0gPSAoYWRkZW5kICsgc3YpCQkqLwotICBSRUxPQ19MTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX1NGQV9CQVNFLAkJCi0gIFJFTE9DX1NGQV9PRkYxMywKLSAgLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLwotICBSRUxPQ19CQVNFMTAsICAJCS8qIE5vdCBzdXJlIC0gbWF5YmUgd2UgY2FuIGRvIHRoaXMgdGhlICovCi0gIFJFTE9DX0JBU0UxMywJCQkvKiByaWdodCB3YXkgbm93ICovCi0gIFJFTE9DX0JBU0UyMiwKLSAgLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICBSRUxPQ19QQzEwLAotICBSRUxPQ19QQzIyLAotICAvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICBSRUxPQ19KTVBfVEJMLAotICAvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICBSRUxPQ19TRUdPRkYxNiwKLSAgUkVMT0NfR0xPQl9EQVQsCi0gIFJFTE9DX0pNUF9TTE9ULAotICBSRUxPQ19SRUxBVElWRSwKLQotICBSRUxPQ18xMSwJCi0gIFJFTE9DX1dESVNQMl8xNCwKLSAgUkVMT0NfV0RJU1AxOSwKLSAgUkVMT0NfSEhJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgPj4gNDIgICAgICovCi0gIFJFTE9DX0hMTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikgPj4gMzIgICAgICAqLwotICAKLSAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgUkVMT0NfSlVNUFRBUkcsCi0gIFJFTE9DX0NPTlNULAotICBSRUxPQ19DT05TVEgsCi0gIAotICBOT19SRUxPQwotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbnRlcm5hbCB7Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGxvbmcJcl9pbmRleDsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU7CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF92bWEgcl9hZGRlbmQ7CQkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLSNlbmRpZgkJCQkvKiBfX0FfT1VUX0FET0JFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oIGIvaW5jbHVkZS9hb3V0L2FvdXQ2NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmYxMTQwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9hb3V0NjQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKiBgYS5vdXQnIG9iamVjdC1maWxlIGRlZmluaXRpb25zLCBpbmNsdWRpbmcgZXh0ZW5zaW9ucyB0byA2NC1iaXQgZmllbGRzICovCi0KLSNpZm5kZWYgX19BX09VVF82NF9IX18KLSNkZWZpbmUgX19BX09VVF82NF9IX18KLQotLyogVGhpcyBpcyB0aGUgbGF5b3V0IG9uIGRpc2sgb2YgdGhlIDMyLWJpdCBvciA2NC1iaXQgZXhlYyBoZWFkZXIuICovCi0KLSNpZm5kZWYgZXh0ZXJuYWxfZXhlYwotc3RydWN0IGV4dGVybmFsX2V4ZWMgCi17Ci0gIGJmZF9ieXRlIGVfaW5mb1s0XTsJCS8qIG1hZ2ljIG51bWJlciBhbmQgc3R1ZmYJCSovCi0gIGJmZF9ieXRlIGVfdGV4dFtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgc2VjdGlvbiBpbiBieXRlcwkqLwotICBiZmRfYnl0ZSBlX2RhdGFbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBkYXRhIHNlY3Rpb24gaW4gYnl0ZXMJKi8KLSAgYmZkX2J5dGUgZV9ic3NbQllURVNfSU5fV09SRF07IC8qIGxlbmd0aCBvZiBic3MgYXJlYSBpbiBieXRlcyAJCSovCi0gIGJmZF9ieXRlIGVfc3ltc1tCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSBpbiBieXRlcyAJKi8KLSAgYmZkX2J5dGUgZV9lbnRyeVtCWVRFU19JTl9XT1JEXTsgLyogc3RhcnQgYWRkcmVzcyAJCQkqLwotICBiZmRfYnl0ZSBlX3Ryc2l6ZVtCWVRFU19JTl9XT1JEXTsgLyogbGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvCSovCi0gIGJmZF9ieXRlIGVfZHJzaXplW0JZVEVTX0lOX1dPUkRdOyAvKiBsZW5ndGggb2YgZGF0YSByZWxvY2F0aW9uIGluZm8gCSovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoNCArIEJZVEVTX0lOX1dPUkQgKiA3KQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciBhLm91dCBmaWxlcyAqLwotCi0jaWYgQVJDSF9TSVpFPT02NAotI2RlZmluZSBPTUFHSUMgMHgxMDAxCQkvKiBDb2RlIGluZGljYXRpbmcgb2JqZWN0IGZpbGUgICovCi0jZGVmaW5lIFpNQUdJQyAweDEwMDIJCS8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAweDEwMDMJCS8qIENvZGUgaW5kaWNhdGluZyBwdXJlIGV4ZWN1dGFibGUuICAqLwotCi0vKiBUaGVyZSBpcyBubyA2NC1iaXQgUU1BR0lDIGFzIGZhciBhcyBJIGtub3cuICAqLwotCi0jZGVmaW5lIE5fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gT01BR0lDCQlcCi0JCQkmJiBOX01BR0lDKHgpICE9IE5NQUdJQwkJXAotICAJCQkmJiBOX01BR0lDKHgpICE9IFpNQUdJQykKLSNlbHNlCi0jZGVmaW5lIE9NQUdJQyAwNDA3CQkvKiAuLi5vYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAwNDEwCQkvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgKi8KLSNkZWZpbmUgWk1BR0lDIDA0MTMJCS8qIENvZGUgaW5kaWNhdGluZyBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIEJNQUdJQyAwNDE1CQkvKiBVc2VkIGJ5IGEgYi5vdXQgb2JqZWN0LiAgKi8KLQotLyogVGhpcyBpbmRpY2F0ZXMgYSBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZSB3aXRoIHRoZSBoZWFkZXIgaW4gdGhlIHRleHQuCi0gICBJdCBpcyB1c2VkIGJ5IDM4NkJTRCAoYW5kIHZhcmlhbnRzKSBhbmQgTGludXgsIGF0IGxlYXN0LiAgKi8KLSNpZm5kZWYgUU1BR0lDCi0jZGVmaW5lIFFNQUdJQyAwMzE0Ci0jZW5kaWYKLSMgaWZuZGVmIE5fQkFETUFHCi0jICBkZWZpbmUgTl9CQURNQUcoeCkJICAoTl9NQUdJQyh4KSAhPSBPTUFHSUMJCVwKLQkJCSYmIE5fTUFHSUMoeCkgIT0gTk1BR0lDCQlcCi0gIAkJCSYmIE5fTUFHSUMoeCkgIT0gWk1BR0lDIFwKLQkJICAgICAgICAmJiBOX01BR0lDKHgpICE9IFFNQUdJQykKLSMgZW5kaWYgLyogTl9CQURNQUcgKi8KLSNlbmRpZgotCi0jZW5kaWYKLQotI2lmZGVmIFFNQUdJQwotI2RlZmluZSBOX0lTX1FNQUdJQyh4KSAoTl9NQUdJQyAoeCkgPT0gUU1BR0lDKQotI2Vsc2UKLSNkZWZpbmUgTl9JU19RTUFHSUMoeCkgKDApCi0jZW5kaWYKLQotLyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBUQVJHRVRfUEFHRV9TSVpFIGFuZCBOX1NFR1NJWkUgaXMgdGhhdCBUQVJHRVRfUEFHRV9TSVpFIGlzCi0gICB0aGUgZmluZXN0IGdyYW51bGFyaXR5IGF0IHdoaWNoIHlvdSBjYW4gcGFnZSBzb21ldGhpbmcsIHRodXMgaXQKLSAgIGNvbnRyb2xzIHRoZSBwYWRkaW5nIChpZiBhbnkpIGJlZm9yZSB0aGUgdGV4dCBzZWdtZW50IG9mIGEgWk1BR0lDCi0gICBmaWxlLiAgTl9TRUdTSVpFIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoaW5ncyBjYW4gYmUgbWFya2VkIGFzCi0gICByZWFkLW9ubHkgdmVyc3VzIHJlYWQvd3JpdGUsIHNvIGl0IGNvbnRyb2xzIHRoZSBwYWRkaW5nIGJldHdlZW4gdGhlCi0gICB0ZXh0IHNlZ21lbnQgYW5kIHRoZSBkYXRhIHNlZ21lbnQgKGluIG1lbW9yeTsgb24gZGlzayB0aGUgcGFkZGluZwotICAgYmV0d2VlbiB0aGVtIGlzIFRBUkdFVF9QQUdFX1NJWkUpLiAgVEFSR0VUX1BBR0VfU0laRSBhbmQgTl9TRUdTSVpFIGFyZSB0aGUgc2FtZQotICAgZm9yIG1vc3QgbWFjaGluZXMsIGJ1dCBkaWZmZXJlbnQgZm9yIHN1bjMuICAqLwotCi0vKiBCeSBkZWZhdWx0LCBzZWdtZW50IHNpemUgaXMgY29uc3RhbnQuICBCdXQgc29tZSBtYWNoaW5lcyBvdmVycmlkZSB0aGlzCi0gICB0byBiZSBhIGZ1bmN0aW9uIG9mIHRoZSBhLm91dCBoZWFkZXIgKGUuZy4gbWFjaGluZSB0eXBlKS4gICovCi0KLSNpZm5kZWYJTl9TRUdTSVpFCi0jZGVmaW5lCU5fU0VHU0laRSh4KQlTRUdNRU5UX1NJWkUKLSNlbmRpZgotDAotLyogVmlydHVhbCBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgdGV4dCBzZWN0aW9uLgotICAgVGhpcyBpcyBnZXR0aW5nIHZlcnkgY29tcGxpY2F0ZWQuICBBIGdvb2QgcmVhc29uIHRvIGRpc2NhcmQgYS5vdXQgZm9ybWF0Ci0gICBmb3Igc29tZXRoaW5nIHRoYXQgc3BlY2lmaWVzIHRoZXNlIGZpZWxkcyBleHBsaWNpdGx5LiAgQnV0IHRpbCB0aGVuLi4uCi0KLSAgICogT01BR0lDIGFuZCBOTUFHSUMgZmlsZXM6Ci0gICAgICAgKG9iamVjdCBmaWxlczogdGV4dCBmb3IgInJlbG9jYXRhYmxlIGFkZHIgMCIgcmlnaHQgYWZ0ZXIgdGhlIGhlYWRlcikKLSAgICAgICBzdGFydCBhdCAwLCBvZmZzZXQgaXMgRVhFQ19CWVRFU19TSVpFLCBzaXplIGFzIHN0YXRlZC4KLSAgICogVGhlIHRleHQgYWRkcmVzcywgb2Zmc2V0LCBhbmQgc2l6ZSBvZiBaTUFHSUMgZmlsZXMgZGVwZW5kCi0gICAgIG9uIHRoZSBlbnRyeSBwb2ludCBvZiB0aGUgZmlsZToKLSAgICAgKiBlbnRyeSBwb2ludCBiZWxvdyBURVhUX1NUQVJUX0FERFI6Ci0gICAgICAgKGhhY2sgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMpCi0gICAgICAgc3RhcnQgYXQgMCwgb2Zmc2V0IGlzIDAsIHNpemUgYXMgc3RhdGVkLgotICAgICAqIElmIE5fSEVBREVSX0lOX1RFWFQoeCkgaXMgdHJ1ZSAod2hpY2ggZGVmYXVsdHMgdG8gYmVpbmcgdGhlCi0gICAgICAgY2FzZSB3aGVuIHRoZSBlbnRyeSBwb2ludCBpcyBFWEVDX0JZVEVTX1NJWkUgb3IgZnVydGhlciBpbnRvIGEgcGFnZSk6Ci0gICAgICAgbm8gcGFkZGluZyBpcyBuZWVkZWQ7IHRleHQgY2FuIHN0YXJ0IGFmdGVyIGV4ZWMgaGVhZGVyLiAgU3VuCi0gICAgICAgY29uc2lkZXJzIHRoZSB0ZXh0IHNlZ21lbnQgb2Ygc3VjaCBmaWxlcyB0byBpbmNsdWRlIHRoZSBleGVjIGhlYWRlcjsKLSAgICAgICBmb3IgQkZEJ3MgcHVycG9zZXMsIHdlIGRvbid0LCB3aGljaCBtYWtlcyBtb3JlIHdvcmsgZm9yIHVzLgotICAgICAgIHN0YXJ0IGF0IFRFWFRfU1RBUlRfQUREUiArIEVYRUNfQllURVNfU0laRSwgb2Zmc2V0IGlzIEVYRUNfQllURVNfU0laRSwKLSAgICAgICBzaXplIGFzIHN0YXRlZCBtaW51cyBFWEVDX0JZVEVTX1NJWkUuCi0gICAgICogSWYgTl9IRUFERVJfSU5fVEVYVCh4KSBpcyBmYWxzZSAod2hpY2ggZGVmYXVsdHMgdG8gYmVpbmcgdGhlIGNhc2Ugd2hlbgotICAgICAgIHRoZSBlbnRyeSBwb2ludCBpcyBsZXNzIHRoYW4gRVhFQ19CWVRFU19TSVpFIGludG8gYSBwYWdlIChlLmcuIHBhZ2UKLSAgICAgICBhbGlnbmVkKSk6IChwYWRkaW5nIGlzIG5lZWRlZCBzbyB0aGF0IHRleHQgY2FuIHN0YXJ0IGF0IGEgcGFnZSBib3VuZGFyeSkKLSAgICAgICBzdGFydCBhdCBURVhUX1NUQVJUX0FERFIsIG9mZnNldCBUQVJHRVRfUEFHRV9TSVpFLCBzaXplIGFzIHN0YXRlZC4KLQotICAgIFNwZWNpZmljIGNvbmZpZ3VyYXRpb25zIG1heSB3YW50IHRvIGhhcmR3aXJlIE5fSEVBREVSX0lOX1RFWFQsCi0gICAgZm9yIGVmZmljaWVuY3kgb3IgdG8gYWxsb3cgcGVvcGxlIHRvIHBsYXkgZ2FtZXMgd2l0aCB0aGUgZW50cnkgcG9pbnQuCi0gICAgSW4gdGhhdCBjYXNlLCB5b3Ugd291bGQgI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIGFzIDEgZm9yIHN1bm9zLAotICAgIGFuZCBhcyAwIGZvciBtb3N0IG90aGVyIGhvc3RzIChTb255IE5ld3MsIFZheCBVbHRyaXgsIGV0YykuCi0gICAgKERvIHRoaXMgaW4gdGhlIGFwcHJvcHJpYXRlIGJmZCB0YXJnZXQgZmlsZS4pCi0gICAgKFRoZSBkZWZhdWx0IGlzIGEgaGV1cmlzdGljIHRoYXQgd2lsbCBicmVhayBpZiBwZW9wbGUgdHJ5IGNoYW5naW5nCi0gICAgdGhlIGVudHJ5IHBvaW50LCBwZXJoYXBzIHdpdGggdGhlIGxkIC1lIGZsYWcuKQotCi0gICAgKiBRTUFHSUMgaXMgYWx3YXlzIGxpa2UgYSBaTUFHSUMgZm9yIHdoaWNoIE5fSEVBREVSX0lOX1RFWFQgaXMgdHJ1ZSwKLSAgICBhbmQgZm9yIHdoaWNoIHRoZSBzdGFydGluZyBhZGRyZXNzIGlzIFRBUkdFVF9QQUdFX1NJWkUgKG9yIHNob3VsZCB0aGlzIGJlCi0gICAgU0VHTUVOVF9TSVpFPykgKFRFWFRfU1RBUlRfQUREUiBvbmx5IGFwcGxpZXMgdG8gWk1BR0lDLCBub3QgdG8gUU1BR0lDKS4KLSAgICAqLwotCi0vKiBUaGlzIG1hY3JvIGlzIG9ubHkgcmVsZXZhbnQgZm9yIFpNQUdJQyBmaWxlczsgUU1BR0lDIGFsd2F5cyBoYXMgdGhlIGhlYWRlcgotICAgaW4gdGhlIHRleHQuICAqLwotI2lmbmRlZiBOX0hFQURFUl9JTl9URVhUCi0jZGVmaW5lIE5fSEVBREVSX0lOX1RFWFQoeCkgKCgoeCkuYV9lbnRyeSAmIChUQVJHRVRfUEFHRV9TSVpFLTEpKSA+PSBFWEVDX0JZVEVTX1NJWkUpCi0jZW5kaWYKLQotLyogU3VuIHNoYXJlZCBsaWJyYXJpZXMsIG5vdCBsaW51eC4gIFRoaXMgbWFjcm8gaXMgb25seSByZWxldmFudCBmb3IgWk1BR0lDCi0gICBmaWxlcy4gICovCi0jaWZuZGVmIE5fU0hBUkVEX0xJQgotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgKCh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSKQotI2VuZGlmCi0KLS8qIFJldHVybmluZyAwIG5vdCBURVhUX1NUQVJUX0FERFIgZm9yIE9NQUdJQyBhbmQgTk1BR0lDIGlzIGJhc2VkIG9uCi0gICB0aGUgYXNzdW1wdGlvbiB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggYSAubyBmaWxlLCBub3QgYW4KLSAgIGV4ZWN1dGFibGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgT01BR0lDIChidXQgbWVhbnMgd2UgZG9uJ3Qgd29yawotICAgcmlnaHQgb24gdGhlIG91dHB1dCBmcm9tIGxkIC1OKTsgbW9yZSBxdWVzdGlvbmFibGUgZm9yIE5NQUdJQy4gICovCi0KLSNpZm5kZWYgTl9UWFRBRERSCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKC8qIFRoZSBhZGRyZXNzIG9mIGEgUU1BR0lDIGZpbGUgaXMgYWx3YXlzIG9uZSBwYWdlIGluLCAqLyBcCi0gICAgIC8qIHdpdGggdGhlIGhlYWRlciBpbiB0aGUgdGV4dC4gICovIFwKLSAgICAgTl9JU19RTUFHSUMgKHgpID8gVEFSR0VUX1BBR0VfU0laRSArIEVYRUNfQllURVNfU0laRSA6IFwKLSAgICAgTl9NQUdJQyh4KSAhPSBaTUFHSUMgPyAwIDoJLyogb2JqZWN0IGZpbGUgb3IgTk1BR0lDICovXAotICAgICBOX1NIQVJFRF9MSUIoeCkgPyAwIDoJXAotICAgICBOX0hFQURFUl9JTl9URVhUKHgpICA/CVwKLQkgICAgVEVYVF9TVEFSVF9BRERSICsgRVhFQ19CWVRFU19TSVpFIDoJLyogbm8gcGFkZGluZyAqL1wKLQkgICAgVEVYVF9TVEFSVF9BRERSCQkJLyogYSBwYWdlIG9mIHBhZGRpbmcgKi9cCi0gICAgKQotI2VuZGlmCi0KLS8qIElmIE5fSEVBREVSX0lOX1RFWFQgaXMgbm90IHRydWUgZm9yIFpNQUdJQywgdGhlcmUgaXMgc29tZSBwYWRkaW5nCi0gICB0byBtYWtlIHRoZSB0ZXh0IHNlZ21lbnQgc3RhcnQgYXQgYSBjZXJ0YWluIGJvdW5kYXJ5LiAgRm9yIG1vc3QKLSAgIHN5c3RlbXMsIHRoaXMgYm91bmRhcnkgaXMgVEFSR0VUX1BBR0VfU0laRS4gIEJ1dCBmb3IgTGludXgsIGluIHRoZQotICAgdGltZS1ob25vcmVkIHRyYWRpdGlvbiBvZiBjcmF6eSBaTUFHSUMgaGFja3MsIGl0IGlzIDEwMjQgd2hpY2ggaXMKLSAgIG5vdCB3aGF0IFRBUkdFVF9QQUdFX1NJWkUgbmVlZHMgdG8gYmUgZm9yIFFNQUdJQy4gICovCi0KLSNpZm5kZWYgWk1BR0lDX0RJU0tfQkxPQ0tfU0laRQotI2RlZmluZSBaTUFHSUNfRElTS19CTE9DS19TSVpFIFRBUkdFVF9QQUdFX1NJWkUKLSNlbmRpZgotCi0jZGVmaW5lIE5fRElTS19CTE9DS19TSVpFKHgpIFwKLSAgKE5fTUFHSUMoeCkgPT0gWk1BR0lDID8gWk1BR0lDX0RJU0tfQkxPQ0tfU0laRSA6IFRBUkdFVF9QQUdFX1NJWkUpCi0KLS8qIE9mZnNldCBpbiBhbiBhLm91dCBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gKi8KLSNpZm5kZWYgTl9UWFRPRkYKLSNkZWZpbmUgTl9UWFRPRkYoeCkJXAotICAgICgvKiBGb3Ige08sTixRfU1BR0lDLCBubyBwYWRkaW5nLiAgKi8gXAotICAgICBOX01BR0lDKHgpICE9IFpNQUdJQyA/IEVYRUNfQllURVNfU0laRSA6IFwKLSAgICAgTl9TSEFSRURfTElCKHgpID8gMCA6IFwKLSAgICAgTl9IRUFERVJfSU5fVEVYVCh4KSA/CVwKLQkgICAgRVhFQ19CWVRFU19TSVpFIDoJCQkvKiBubyBwYWRkaW5nICovXAotCSAgICBaTUFHSUNfRElTS19CTE9DS19TSVpFCQkvKiBhIHBhZ2Ugb2YgcGFkZGluZyAqL1wKLSAgICApCi0jZW5kaWYKLS8qIFNpemUgb2YgdGhlIHRleHQgc2VjdGlvbi4gIEl0J3MgYWx3YXlzIGFzIHN0YXRlZCwgZXhjZXB0IHRoYXQgd2UKLSAgIG9mZnNldCBpdCB0byBgdW5kbycgdGhlIGFkanVzdG1lbnQgdG8gTl9UWFRBRERSIGFuZCBOX1RYVE9GRgotICAgZm9yIFpNQUdJQyBmaWxlcyB0aGF0IG5vbWluYWxseSBpbmNsdWRlIHRoZSBleGVjIGhlYWRlcgotICAgYXMgcGFydCBvZiB0aGUgZmlyc3QgcGFnZSBvZiB0ZXh0LiAgKEJGRCBkb2Vzbid0IGNvbnNpZGVyIHRoZQotICAgZXhlYyBoZWFkZXIgdG8gYmUgcGFydCBvZiB0aGUgdGV4dCBzZWdtZW50LikgICovCi0jaWZuZGVmIE5fVFhUU0laRQotI2RlZmluZQlOX1RYVFNJWkUoeCkgXAotICAgICgvKiBGb3IgUU1BR0lDLCB3ZSBkb24ndCBjb25zaWRlciB0aGUgaGVhZGVyIHBhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gICovXAotICAgICBOX0lTX1FNQUdJQyAoeCkgPyAoeCkuYV90ZXh0IC0gRVhFQ19CWVRFU19TSVpFIDogXAotICAgICAoTl9NQUdJQyh4KSAhPSBaTUFHSUMgfHwgTl9TSEFSRURfTElCKHgpKSA/ICh4KS5hX3RleHQgOiBcCi0gICAgIE5fSEVBREVSX0lOX1RFWFQoeCkgID8JXAotCSAgICAoeCkuYV90ZXh0IC0gRVhFQ19CWVRFU19TSVpFOgkvKiBubyBwYWRkaW5nICovXAotCSAgICAoeCkuYV90ZXh0CQkJCS8qIGEgcGFnZSBvZiBwYWRkaW5nICovXAotICAgICkKLSNlbmRpZgotLyogVGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgc2VnbWVudCBpbiB2aXJ0dWFsIG1lbW9yeS4KLSAgIEl0IGlzIHRoZSB0ZXh0IHNlZ21lbnQgYWRkcmVzcywgcGx1cyB0ZXh0IHNlZ21lbnQgc2l6ZSwgcm91bmRlZAotICAgdXAgdG8gYSBOX1NFR1NJWkUgYm91bmRhcnkgZm9yIHB1cmUgb3IgcGFnZWFibGUgZmlsZXMuICovCi0jaWZuZGVmIE5fREFUQUREUgotI2RlZmluZSBOX0RBVEFERFIoeCkgXAotICAgIChOX01BR0lDKHgpPT1PTUFHSUM/IChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpKSBcCi0gICAgIDogIChOX1NFR1NJWkUoeCkgKyAoKE5fVFhUQUREUih4KStOX1RYVFNJWkUoeCktMSkgJiB+KE5fU0VHU0laRSh4KS0xKSkpKQotI2VuZGlmCi0vKiBUaGUgYWRkcmVzcyBvZiB0aGUgQlNTIHNlZ21lbnQgLS0gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGRhdGEgc2VnbWVudC4gICovCi0KLSNkZWZpbmUgTl9CU1NBRERSKHgpCShOX0RBVEFERFIoeCkgKyAoeCkuYV9kYXRhKQotCi0vKiBPZmZzZXRzIG9mIHRoZSB2YXJpb3VzIHBvcnRpb25zIG9mIHRoZSBmaWxlIGFmdGVyIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotCi0vKiBGb3Ige1EsWn1NQUdJQywgdGhlcmUgaXMgcGFkZGluZyB0byBtYWtlIHRoZSBkYXRhIHNlZ21lbnQgc3RhcnQgb24KLSAgIGEgcGFnZSBib3VuZGFyeS4gIE1vc3Qgb2YgdGhlIHRpbWUgdGhlIGFfdGV4dCBmaWVsZCAoYW5kIHRodXMKLSAgIE5fVFhUU0laRSkgYWxyZWFkeSBjb250YWlucyB0aGlzIHBhZGRpbmcuICBJdCBpcyBwb3NzaWJsZSB0aGF0IGZvcgotICAgQlNESSBhbmQvb3IgMzg2QlNEIGl0IHNvbWV0aW1lcyBkb2Vzbid0IGNvbnRhaW4gdGhlIHBhZGRpbmcsIGFuZAotICAgcGVyaGFwcyB3ZSBzaG91bGQgYmUgYWRkaW5nIGl0IGhlcmUuICBCdXQgdGhpcyBzZWVtcyBraW5kIG9mCi0gICBxdWVzdGlvbmFibGUgYW5kIHByb2JhYmx5IHNob3VsZCBiZSBCU0RJLzM4NkJTRC1zcGVjaWZpYyBpZiB3ZSBkbwotICAgZG8gaXQuCi0KLSAgIEZvciBOTUFHSUMgKGF0IGxlYXN0IGZvciBocDMwMCBCU0QsIHByb2JhYmx5IG90aGVycyksIHRoZXJlIGlzCi0gICBwYWRkaW5nIGluIG1lbW9yeSBvbmx5LCBub3Qgb24gZGlzaywgc28gd2UgbXVzdCAqbm90KiBldmVyIHBhZCBoZXJlCi0gICBmb3IgTk1BR0lDLiAgKi8KLQotI2lmbmRlZiBOX0RBVE9GRgotI2RlZmluZSBOX0RBVE9GRih4KSBcCi0gKE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpKQotI2VuZGlmCi0KLSNpZm5kZWYgTl9UUkVMT0ZGCi0jZGVmaW5lIE5fVFJFTE9GRih4KQkoIE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSApCi0jZW5kaWYKLSNpZm5kZWYgTl9EUkVMT0ZGCi0jZGVmaW5lIE5fRFJFTE9GRih4KQkoIE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSApCi0jZW5kaWYKLSNpZm5kZWYgTl9TWU1PRkYKLSNkZWZpbmUgTl9TWU1PRkYoeCkJKCBOX0RSRUxPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2VuZGlmCi0jaWZuZGVmIE5fU1RST0ZGCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggTl9TWU1PRkYoeCkgKyAoeCkuYV9zeW1zICkKLSNlbmRpZgotDAotLyogU3ltYm9scyAqLwotI2lmbmRlZiBleHRlcm5hbF9ubGlzdAotc3RydWN0IGV4dGVybmFsX25saXN0IHsKLSAgYmZkX2J5dGUgZV9zdHJ4W0JZVEVTX0lOX1dPUkRdOwkvKiBpbmRleCBpbnRvIHN0cmluZyB0YWJsZSBvZiBuYW1lICovCi0gIGJmZF9ieXRlIGVfdHlwZVsxXTsJCQkvKiB0eXBlIG9mIHN5bWJvbCAqLwotICBiZmRfYnl0ZSBlX290aGVyWzFdOwkJCS8qIG1pc2MgaW5mbyAodXN1YWxseSBlbXB0eSkgKi8KLSAgYmZkX2J5dGUgZV9kZXNjWzJdOwkJCS8qIGRlc2NyaXB0aW9uIGZpZWxkICovCi0gIGJmZF9ieXRlIGVfdmFsdWVbQllURVNfSU5fV09SRF07CS8qIHZhbHVlIG9mIHN5bWJvbCAqLwotfTsKLSNkZWZpbmUgRVhURVJOQUxfTkxJU1RfU0laRSAoQllURVNfSU5fV09SRCs0K0JZVEVTX0lOX1dPUkQpCi0jZW5kaWYKLQotc3RydWN0IGludGVybmFsX25saXN0IHsKLSAgdW5zaWduZWQgbG9uZyBuX3N0cng7CQkJLyogaW5kZXggaW50byBzdHJpbmcgdGFibGUgb2YgbmFtZSAqLwotICB1bnNpZ25lZCBjaGFyIG5fdHlwZTsJCQkvKiB0eXBlIG9mIHN5bWJvbCAqLwotICB1bnNpZ25lZCBjaGFyIG5fb3RoZXI7CQkvKiBtaXNjIGluZm8gKHVzdWFsbHkgZW1wdHkpICovCi0gIHVuc2lnbmVkIHNob3J0IG5fZGVzYzsJCS8qIGRlc2NyaXB0aW9uIGZpZWxkICovCi0gIGJmZF92bWEgbl92YWx1ZTsJCQkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLX07Ci0KLS8qIFRoZSBuX3R5cGUgZmllbGQgaXMgdGhlIHN5bWJvbCB0eXBlLCBjb250YWluaW5nOiAgKi8KLQotI2RlZmluZSBOX1VOREYJMAkvKiBVbmRlZmluZWQgc3ltYm9sICovCi0jZGVmaW5lIE5fQUJTIAkyCS8qIEFic29sdXRlIHN5bWJvbCAtLSBkZWZpbmVkIGF0IHBhcnRpY3VsYXIgYWRkciAqLwotI2RlZmluZSBOX1RFWFQgCTQJLyogVGV4dCBzeW0gLS0gZGVmaW5lZCBhdCBvZmZzZXQgaW4gdGV4dCBzZWcgKi8KLSNkZWZpbmUgTl9EQVRBIAk2CS8qIERhdGEgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIGRhdGEgc2VnICovCi0jZGVmaW5lIE5fQlNTIAk4CS8qIEJTUyAgc3ltIC0tIGRlZmluZWQgYXQgb2Zmc2V0IGluIHplcm8nZCBzZWcgKi8KLSNkZWZpbmUJTl9DT01NCTB4MTIJLyogQ29tbW9uIHN5bWJvbCAodmlzaWJsZSBhZnRlciBzaGFyZWQgbGliIGR5bmxpbmspICovCi0jZGVmaW5lIE5fRk4JMHgxZgkvKiBGaWxlIG5hbWUgb2YgLm8gZmlsZSAqLwotI2RlZmluZQlOX0ZOX1NFUSAweDBDCS8qIE5fRk4gZnJvbSBTZXF1ZW50IGNvbXBpbGVycyAoc2lnaCkgKi8KLS8qIE5vdGU6IE5fRVhUIGNhbiBvbmx5IGJlIHVzZWZ1bGx5IE9SLWVkIHdpdGggTl9VTkRGLCBOX0FCUywgTl9URVhULAotICAgTl9EQVRBLCBvciBOX0JTUy4gIFdoZW4gdGhlIGxvdy1vcmRlciBiaXQgb2Ygb3RoZXIgdHlwZXMgaXMgc2V0LAotICAgKGUuZy4gTl9XQVJOSU5HIHZlcnN1cyBOX0ZOKSwgdGhleSBhcmUgdHdvIGRpZmZlcmVudCB0eXBlcy4gICovCi0jZGVmaW5lIE5fRVhUIAkxCS8qIEV4dGVybmFsIHN5bWJvbCAoYXMgb3Bwb3NlZCB0byBsb2NhbC10by10aGlzLWZpbGUpICovCi0jZGVmaW5lIE5fVFlQRSAgMHgxZQotI2RlZmluZSBOX1NUQUIgCTB4ZTAJLyogSWYgYW55IG9mIHRoZXNlIGJpdHMgYXJlIG9uLCBpdCdzIGEgZGVidWcgc3ltYm9sICovCi0KLSNkZWZpbmUgTl9JTkRSIDB4MGEKLQotLyogVGhlIGZvbGxvd2luZyBzeW1ib2xzIHJlZmVyIHRvIHNldCBlbGVtZW50cy4KLSAgIEFsbCB0aGUgTl9TRVRbQVREQl0gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUgZm9ybSBvbmUgc2V0LgotICAgU3BhY2UgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2V0IGluIHRoZSB0ZXh0IHNlY3Rpb24sIGFuZCBlYWNoIHNldAotICAgZWxlbWVudHMgdmFsdWUgaXMgc3RvcmVkIGludG8gb25lIHdvcmQgb2YgdGhlIHNwYWNlLgotICAgVGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNwYWNlIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNldCAobnVtYmVyIG9mIGVsZW1lbnRzKS4KLQotICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHNldCBpcyBtYWRlIGludG8gYW4gTl9TRVRWIHN5bWJvbAotICAgd2hvc2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgc2V0LgotICAgVGhpcyBzeW1ib2wgYWN0cyBsaWtlIGEgTl9EQVRBIGdsb2JhbCBzeW1ib2wKLSAgIGluIHRoYXQgaXQgY2FuIHNhdGlzZnkgdW5kZWZpbmVkIGV4dGVybmFsIHJlZmVyZW5jZXMuICAqLwotCi0vKiBUaGVzZSBhcHBlYXIgYXMgaW5wdXQgdG8gTEQsIGluIGEgLm8gZmlsZS4gICovCi0jZGVmaW5lCU5fU0VUQQkweDE0CQkvKiBBYnNvbHV0ZSBzZXQgZWxlbWVudCBzeW1ib2wgKi8KLSNkZWZpbmUJTl9TRVRUCTB4MTYJCS8qIFRleHQgc2V0IGVsZW1lbnQgc3ltYm9sICovCi0jZGVmaW5lCU5fU0VURAkweDE4CQkvKiBEYXRhIHNldCBlbGVtZW50IHN5bWJvbCAqLwotI2RlZmluZQlOX1NFVEIJMHgxQQkJLyogQnNzIHNldCBlbGVtZW50IHN5bWJvbCAqLwotCi0vKiBUaGlzIGlzIG91dHB1dCBmcm9tIExELiAgKi8KLSNkZWZpbmUgTl9TRVRWCTB4MUMJCS8qIFBvaW50ZXIgdG8gc2V0IHZlY3RvciBpbiBkYXRhIGFyZWEuICAqLwotCi0vKiBXYXJuaW5nIHN5bWJvbC4gVGhlIHRleHQgZ2l2ZXMgYSB3YXJuaW5nIG1lc3NhZ2UsIHRoZSBuZXh0IHN5bWJvbAotICAgaW4gdGhlIHRhYmxlIHdpbGwgYmUgdW5kZWZpbmVkLiBXaGVuIHRoZSBzeW1ib2wgaXMgcmVmZXJlbmNlZCwgdGhlCi0gICBtZXNzYWdlIGlzIHByaW50ZWQuICAqLwotCi0jZGVmaW5lCU5fV0FSTklORyAweDFlCi0KLS8qIFdlYWsgc3ltYm9scy4gIFRoZXNlIGFyZSBhIEdOVSBleHRlbnNpb24gdG8gdGhlIGEub3V0IGZvcm1hdC4gIFRoZQotICAgc2VtYW50aWNzIGFyZSB0aG9zZSBvZiBFTEYgd2VhayBzeW1ib2xzLiAgV2VhayBzeW1ib2xzIGFyZSBhbHdheXMKLSAgIGV4dGVybmFsbHkgdmlzaWJsZS4gIFRoZSBOX1dFQUs/IHZhbHVlcyBhcmUgc3F1ZWV6ZWQgaW50byB0aGUKLSAgIGF2YWlsYWJsZSBzbG90cy4gIFRoZSB2YWx1ZSBvZiBhIE5fV0VBS1Ugc3ltYm9sIGlzIDAuICBUaGUgdmFsdWVzCi0gICBvZiB0aGUgb3RoZXIgdHlwZXMgYXJlIHRoZSBkZWZpbml0aW9ucy4gICovCi0jZGVmaW5lIE5fV0VBS1UJMHgwZAkJLyogV2VhayB1bmRlZmluZWQgc3ltYm9sLiAgKi8KLSNkZWZpbmUgTl9XRUFLQSAweDBlCQkvKiBXZWFrIGFic29sdXRlIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS1QgMHgwZgkJLyogV2VhayB0ZXh0IHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0QgMHgxMAkJLyogV2VhayBkYXRhIHN5bWJvbC4gICovCi0jZGVmaW5lIE5fV0VBS0IgMHgxMQkJLyogV2VhayBic3Mgc3ltYm9sLiAgKi8KLQotLyogUmVsb2NhdGlvbnMgCi0KLSAgVGhlcmUJYXJlIHR3byB0eXBlcyBvZiByZWxvY2F0aW9uIGZsYXZvdXJzIGZvciBhLm91dCBzeXN0ZW1zLAotICBzdGFuZGFyZCBhbmQgZXh0ZW5kZWQuIFRoZSBzdGFuZGFyZCBmb3JtIGlzIHVzZWQgb24gc3lzdGVtcyB3aGVyZSB0aGUKLSAgaW5zdHJ1Y3Rpb24gaGFzIHJvb20gZm9yIGFsbCB0aGUgYml0cyBvZiBhbiBvZmZzZXQgdG8gdGhlIG9wZXJhbmQsIHdoaWxzdAotICB0aGUgZXh0ZW5kZWQgZm9ybSBpcyB1c2VkIHdoZW4gYW4gYWRkcmVzcyBvcGVyYW5kIGhhcyB0byBiZSBzcGxpdCBvdmVyIG4KLSAgaW5zdHJ1Y3Rpb25zLiBFZywgb24gdGhlIDY4aywgZWFjaCBtb3ZlIGluc3RydWN0aW9uIGNhbiByZWZlcmVuY2UKLSAgdGhlIHRhcmdldCB3aXRoIGEgZGlzcGxhY2VtZW50IG9mIDE2IG9yIDMyIGJpdHMuIE9uIHRoZSBzcGFyYywgbW92ZQotICBpbnN0cnVjdGlvbnMgdXNlIGFuIG9mZnNldCBvZiAxNCBiaXRzLCBzbyB0aGUgb2Zmc2V0IGlzIHN0b3JlZCBpbgotICB0aGUgcmVsb2MgZmllbGQsIGFuZCB0aGUgZGF0YSBpbiB0aGUgc2VjdGlvbiBpcyBpZ25vcmVkLgotKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgc2luZ2xlIHJlbG9jYXRpb24gdG8gYmUgcGVyZm9ybWVkLgotICAgVGhlIHRleHQtcmVsb2NhdGlvbiBzZWN0aW9uIG9mIHRoZSBmaWxlIGlzIGEgdmVjdG9yIG9mIHRoZXNlIHN0cnVjdHVyZXMsCi0gICBhbGwgb2Ygd2hpY2ggYXBwbHkgdG8gdGhlIHRleHQgc2VjdGlvbi4KLSAgIExpa2V3aXNlLCB0aGUgZGF0YS1yZWxvY2F0aW9uIHNlY3Rpb24gYXBwbGllcyB0byB0aGUgZGF0YSBzZWN0aW9uLiAgKi8KLQotc3RydWN0IHJlbG9jX3N0ZF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlCXJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGJmZF9ieXRlIHJfaW5kZXhbM107CS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGJmZF9ieXRlIHJfdHlwZVsxXTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLX07Ci0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUENSRUxfQklHCSgodW5zaWduZWQgaW50KSAweDgwKQotI2RlZmluZQlSRUxPQ19TVERfQklUU19QQ1JFTF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX0JJRwkoKHVuc2lnbmVkIGludCkgMHg2MCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfTEVOR1RIX1NIX0JJRwk1Ci0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDYpCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0xFTkdUSF9TSF9MSVRUTEUJMQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4MTApCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0VYVEVSTl9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDgpCi0KLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfQkFTRVJFTF9CSUcJKCh1bnNpZ25lZCBpbnQpIDB4MDgpCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0JBU0VSRUxfTElUVExFCSgodW5zaWduZWQgaW50KSAweDEwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX0pNUFRBQkxFX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwNCkKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfSk1QVEFCTEVfTElUVExFCSgodW5zaWduZWQgaW50KSAweDIwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9CSVRTX1JFTEFUSVZFX0JJRwkoKHVuc2lnbmVkIGludCkgMHgwMikKLSNkZWZpbmUJUkVMT0NfU1REX0JJVFNfUkVMQVRJVkVfTElUVExFCSgodW5zaWduZWQgaW50KSAweDQwKQotCi0jZGVmaW5lCVJFTE9DX1NURF9TSVpFCShCWVRFU19JTl9XT1JEICsgMyArIDEpCQkvKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotCi1zdHJ1Y3QgcmVsb2Nfc3RkX2ludGVybmFsCi17Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogQWRkcmVzcyAod2l0aGluIHNlZ21lbnQpIHRvIGJlIHJlbG9jYXRlZC4gICovCi0gIC8qIFRoZSBtZWFuaW5nIG9mIHJfc3ltYm9sbnVtIGRlcGVuZHMgb24gcl9leHRlcm4uICAqLwotICB1bnNpZ25lZCBpbnQgcl9zeW1ib2xudW06MjQ7Ci0gIC8qIE5vbnplcm8gbWVhbnMgdmFsdWUgaXMgYSBwYy1yZWxhdGl2ZSBvZmZzZXQKLSAgICAgYW5kIGl0IHNob3VsZCBiZSByZWxvY2F0ZWQgZm9yIGNoYW5nZXMgaW4gaXRzIG93biBhZGRyZXNzCi0gICAgIGFzIHdlbGwgYXMgZm9yIGNoYW5nZXMgaW4gdGhlIHN5bWJvbCBvciBzZWN0aW9uIHNwZWNpZmllZC4gICovCi0gIHVuc2lnbmVkIGludCByX3BjcmVsOjE7Ci0gIC8qIExlbmd0aCAoYXMgZXhwb25lbnQgb2YgMikgb2YgdGhlIGZpZWxkIHRvIGJlIHJlbG9jYXRlZC4KLSAgICAgVGh1cywgYSB2YWx1ZSBvZiAyIGluZGljYXRlcyAxPDwyIGJ5dGVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHJfbGVuZ3RoOjI7Ci0gIC8qIDEgPT4gcmVsb2NhdGUgd2l0aCB2YWx1ZSBvZiBzeW1ib2wuCi0gICAgIHJfc3ltYm9sbnVtIGlzIHRoZSBpbmRleCBvZiB0aGUgc3ltYm9sCi0gICAgIGluIGZpbGVzIHRoZSBzeW1ib2wgdGFibGUuCi0gICAgIDAgPT4gcmVsb2NhdGUgd2l0aCB0aGUgYWRkcmVzcyBvZiBhIHNlZ21lbnQuCi0gICAgIHJfc3ltYm9sbnVtIGlzIE5fVEVYVCwgTl9EQVRBLCBOX0JTUyBvciBOX0FCUwotICAgICAodGhlIE5fRVhUIGJpdCBtYXkgYmUgc2V0IGFsc28sIGJ1dCBzaWduaWZpZXMgbm90aGluZykuICAqLwotICB1bnNpZ25lZCBpbnQgcl9leHRlcm46MTsKLSAgLyogVGhlIG5leHQgdGhyZWUgYml0cyBhcmUgZm9yIFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMsIGFuZCBzZWVtIHRvCi0gICAgIGJlIHVuZG9jdW1lbnRlZC4gICovCi0gIHVuc2lnbmVkIGludCByX2Jhc2VyZWw6MTsJLyogTGlua2FnZSB0YWJsZSByZWxhdGl2ZSAqLwotICB1bnNpZ25lZCBpbnQgcl9qbXB0YWJsZToxOwkvKiBwYy1yZWxhdGl2ZSB0byBqdW1wIHRhYmxlICovCi0gIHVuc2lnbmVkIGludCByX3JlbGF0aXZlOjE7CS8qICJyZWxhdGl2ZSByZWxvY2F0aW9uIiAqLwotICAvKiB1bnVzZWQgKi8KLSAgdW5zaWduZWQgaW50IHJfcGFkOjE7CQkvKiBQYWRkaW5nIC0tIHNldCB0byB6ZXJvICovCi19OwotCi0KLS8qIEVYVEVOREVEIFJFTE9DUyAgKi8KLQotc3RydWN0IHJlbG9jX2V4dF9leHRlcm5hbCB7Ci0gIGJmZF9ieXRlIHJfYWRkcmVzc1tCWVRFU19JTl9XT1JEXTsJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGJmZF9ieXRlIHJfaW5kZXhbM107CS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGJmZF9ieXRlIHJfdHlwZVsxXTsJLyogcmVsb2NhdGlvbiB0eXBlCQkJKi8KLSAgYmZkX2J5dGUgcl9hZGRlbmRbQllURVNfSU5fV09SRF07CS8qIGRhdHVtIGFkZGVuZAkJCQkqLwotfTsKLQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fQklHCSgodW5zaWduZWQgaW50KSAweDgwKQotI2RlZmluZQlSRUxPQ19FWFRfQklUU19FWFRFUk5fTElUVExFCSgodW5zaWduZWQgaW50KSAweDAxKQotCi0jZGVmaW5lCVJFTE9DX0VYVF9CSVRTX1RZUEVfQklHCQkoKHVuc2lnbmVkIGludCkgMHgxRikKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9CSUcJMAotI2RlZmluZQlSRUxPQ19FWFRfQklUU19UWVBFX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHhGOCkKLSNkZWZpbmUJUkVMT0NfRVhUX0JJVFNfVFlQRV9TSF9MSVRUTEUJMwotCi0vKiBCeXRlcyBwZXIgcmVsb2NhdGlvbiBlbnRyeSAqLwotI2RlZmluZQlSRUxPQ19FWFRfU0laRQkoQllURVNfSU5fV09SRCArIDMgKyAxICsgQllURVNfSU5fV09SRCkKLQotZW51bSByZWxvY190eXBlCi17Ci0gIC8qIHNpbXBsZSByZWxvY2F0aW9ucyAqLwotICBSRUxPQ184LAkJCS8qIGRhdGFbMDo3XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgUkVMT0NfMzIsCQkJLyogZGF0YVswOjMxXSA9IGFkZGVuZCArIHN2IAkJKi8KLSAgLyogcGMtcmVsIGRpc3BsYWNlbWVudCAqLwotICBSRUxPQ19ESVNQOCwJCQkvKiBkYXRhWzA6N10gPSBhZGRlbmQgLSBwYyArIHN2IAkqLwotICBSRUxPQ19ESVNQMTYsCQkJLyogZGF0YVswOjE1XSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX0RJU1AzMiwJCQkvKiBkYXRhWzA6MzFdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogU3BlY2lhbCAqLwotICBSRUxPQ19XRElTUDMwLAkJLyogZGF0YVswOjI5XSA9IChhZGRlbmQgKyBzdiAtIHBjKT4+MiAJKi8KLSAgUkVMT0NfV0RJU1AyMiwJCS8qIGRhdGFbMDoyMV0gPSAoYWRkZW5kICsgc3YgLSBwYyk+PjIgCSovCi0gIFJFTE9DX0hJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdik+PjEwIAkqLwotICBSRUxPQ18yMiwJCQkvKiBkYXRhWzA6MjFdID0gKGFkZGVuZCArIHN2KSAJCSovCi0gIFJFTE9DXzEzLAkJCS8qIGRhdGFbMDoxMl0gPSAoYWRkZW5kICsgc3YpCQkqLwotICBSRUxPQ19MTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikJCSovCi0gIFJFTE9DX1NGQV9CQVNFLAkJCi0gIFJFTE9DX1NGQV9PRkYxMywKLSAgLyogUC5JLkMuIChiYXNlLXJlbGF0aXZlKSAqLwotICBSRUxPQ19CQVNFMTAsICAJCS8qIE5vdCBzdXJlIC0gbWF5YmUgd2UgY2FuIGRvIHRoaXMgdGhlICovCi0gIFJFTE9DX0JBU0UxMywJCQkvKiByaWdodCB3YXkgbm93ICovCi0gIFJFTE9DX0JBU0UyMiwKLSAgLyogZm9yIHNvbWUgc29ydCBvZiBwYy1yZWwgUC5JLkMuICg/KSAqLwotICBSRUxPQ19QQzEwLAotICBSRUxPQ19QQzIyLAotICAvKiBQLkkuQy4ganVtcCB0YWJsZSAqLwotICBSRUxPQ19KTVBfVEJMLAotICAvKiByZXB1dGVkbHkgZm9yIHNoYXJlZCBsaWJyYXJpZXMgc29tZWhvdyAqLwotICBSRUxPQ19TRUdPRkYxNiwKLSAgUkVMT0NfR0xPQl9EQVQsCi0gIFJFTE9DX0pNUF9TTE9ULAotICBSRUxPQ19SRUxBVElWRSwKLQotICBSRUxPQ18xMSwJCi0gIFJFTE9DX1dESVNQMl8xNCwKLSAgUkVMT0NfV0RJU1AxOSwKLSAgUkVMT0NfSEhJMjIsCQkJLyogZGF0YVswOjIxXSA9IChhZGRlbmQgKyBzdikgPj4gNDIgICAgICovCi0gIFJFTE9DX0hMTzEwLAkJCS8qIGRhdGFbMDo5XSA9IChhZGRlbmQgKyBzdikgPj4gMzIgICAgICAqLwotICAKLSAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgUkVMT0NfSlVNUFRBUkcsCi0gIFJFTE9DX0NPTlNULAotICBSRUxPQ19DT05TVEgsCi0gIAotICAvKiBBbGwgdGhlIG5ldyBvbmVzIEkgY2FuIHRoaW5rIG9mLCBmb3Igc3BhcmMgdjkgKi8KLQotICBSRUxPQ182NCwJCQkvKiBkYXRhWzA6NjNdID0gYWRkZW5kICsgc3YgCQkqLwotICBSRUxPQ19ESVNQNjQsCQkJLyogZGF0YVswOjYzXSA9IGFkZGVuZCAtIHBjICsgc3YgCSovCi0gIFJFTE9DX1dESVNQMjEsCQkvKiBkYXRhWzA6MjBdID0gKGFkZGVuZCArIHN2IC0gcGMpPj4yIAkqLwotICBSRUxPQ19ESVNQMjEsCQkJLyogZGF0YVswOjIwXSA9IGFkZGVuZCAtIHBjICsgc3YgICAgICAgICovCi0gIFJFTE9DX0RJU1AxNCwJCQkvKiBkYXRhWzA6MTNdID0gYWRkZW5kIC0gcGMgKyBzdiAJKi8KLSAgLyogUSAuCi0gICAgIFdoYXQgYXJlIHRoZSBvdGhlciBvbmVzLAotICAgICBTaW5jZSB0aGlzIGlzIGEgY2xlYW4gc2xhdGUsIGNhbiB3ZSB0aHJvdyBhd2F5IHRoZSBvbmVzIHdlIGRvbnQKLSAgICAgdW5kZXJzdGFuZCA/IFNob3VsZCB3ZSBzb3J0IHRoZSB2YWx1ZXMgPyBXaGF0IGFib3V0IHVzaW5nIGEKLSAgICAgbWljcm9jb2RlIGZvcm1hdCBsaWtlIHRoZSA2OGsgPwotICAgICAqLwotICBOT19SRUxPQwotICB9OwotCi0KLXN0cnVjdCByZWxvY19pbnRlcm5hbCB7Ci0gIGJmZF92bWEgcl9hZGRyZXNzOwkJLyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgCSovCi0gIGxvbmcJcl9pbmRleDsJCS8qIHN5bWJvbCB0YWJsZSBpbmRleCBvZiBzeW1ib2wgCSovCi0gIGVudW0gcmVsb2NfdHlwZSByX3R5cGU7CS8qIHJlbG9jYXRpb24gdHlwZQkJCSovCi0gIGJmZF92bWEgcl9hZGRlbmQ7CQkvKiBkYXR1bSBhZGRlbmQJCQkJKi8KLX07Ci0KLS8qIFEuCi0gICBTaG91bGQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRhYmxlIGJlIDQgYnl0ZXMgb3IgOCBieXRlcyA/Ci0KLSAgIFEuCi0gICBXaGF0IGFib3V0IGFyY2hpdmUgaW5kZXhlcyA/Ci0KLSAqLwotCi0jZW5kaWYJCQkJLyogX19BX09VVF82NF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9hci5oIGIvaW5jbHVkZS9hb3V0L2FyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNWRjZGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2FyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKiBhcmNoaXZlIGZpbGUgZGVmaW5pdGlvbiBmb3IgR05VIHNvZnR3YXJlICovCi0KLS8qIFNvIGZhciB0aGlzIGlzIGNvcnJlY3QgZm9yIEJTRGlzaCBhcmNoaXZlcy4gIERvbid0IGZvcmdldCB0aGF0Ci0gICBmaWxlcyBtdXN0IGJlZ2luIG9uIGFuIGV2ZW4gYnl0ZSBib3VuZGFyeS4gKi8KLQotI2lmbmRlZiBfX0dOVV9BUl9IX18KLSNkZWZpbmUgX19HTlVfQVJfSF9fCi0KLS8qIE5vdGUgdGhhdCB0aGUgdXN1YWwgJ1xuJyBpbiBtYWdpYyBzdHJpbmdzIG1heSB0cmFuc2xhdGUgdG8gZGlmZmVyZW50Ci0gICBjaGFyYWN0ZXJzLCBhcyBhbGxvd2VkIGJ5IEFOU0kuICAnXDAxMicgaGFzIGEgZml4ZWQgdmFsdWUsIGFuZCByZW1haW5zCi0gICBjb21wYXRpYmxlIHdpdGggZXhpc3RpbmcgQlNEaXNoIGFyY2hpdmVzLiAqLwotCi0jZGVmaW5lIEFSTUFHICAiITxhcmNoPlwwMTIiCS8qIEZvciBDT0ZGIGFuZCBhLm91dCBhcmNoaXZlcyAqLwotI2RlZmluZSBBUk1BR0IgIiE8Ym91dD5cMDEyIgkvKiBGb3IgYi5vdXQgYXJjaGl2ZXMgKi8KLSNkZWZpbmUgU0FSTUFHIDgKLSNkZWZpbmUgQVJGTUFHICJgXDAxMiIKLQotLyogVGhlIGFyX2RhdGUgZmllbGQgb2YgdGhlIGFybWFwIChfXy5TWU1ERUYpIG1lbWJlciBvZiBhbiBhcmNoaXZlCi0gICBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgZW50aXJlIGZpbGUsIG9yIAotICAgQlNELWRlcml2ZWQgbGlua2VycyBjb21wbGFpbi4gIFdlIG9yaWdpbmFsbHkgd3JpdGUgdGhlIGFyX2RhdGUgd2l0aAotICAgdGhpcyBvZmZzZXQgZnJvbSB0aGUgcmVhbCBmaWxlJ3MgbW9kLXRpbWUuICBBZnRlciBmaW5pc2hpbmcgdGhlCi0gICBmaWxlLCB3ZSByZXdyaXRlIGFyX2RhdGUgaWYgaXQncyBub3Qgc3RpbGwgZ3JlYXRlciB0aGFuIHRoZSBtb2QgZGF0ZS4gICovCi0KLSNkZWZpbmUgQVJNQVBfVElNRV9PRkZTRVQgICAgICAgNjAKLQotc3RydWN0IGFyX2hkciB7Ci0gIGNoYXIgYXJfbmFtZVsxNl07CQkvKiBuYW1lIG9mIHRoaXMgbWVtYmVyICovCi0gIGNoYXIgYXJfZGF0ZVsxMl07CQkvKiBmaWxlIG10aW1lICovCi0gIGNoYXIgYXJfdWlkWzZdOwkJLyogb3duZXIgdWlkOyBwcmludGVkIGFzIGRlY2ltYWwgKi8KLSAgY2hhciBhcl9naWRbNl07CQkvKiBvd25lciBnaWQ7IHByaW50ZWQgYXMgZGVjaW1hbCAqLwotICBjaGFyIGFyX21vZGVbOF07CQkvKiBmaWxlIG1vZGUsIHByaW50ZWQgYXMgb2N0YWwgICAqLwotICBjaGFyIGFyX3NpemVbMTBdOwkJLyogZmlsZSBzaXplLCBwcmludGVkIGFzIGRlY2ltYWwgKi8KLSAgY2hhciBhcl9mbWFnWzJdOwkJLyogc2hvdWxkIGNvbnRhaW4gQVJGTUFHICovCi19OwotCi0jZW5kaWYgLyogX19HTlVfQVJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvZHluaXgzLmggYi9pbmNsdWRlL2FvdXQvZHluaXgzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZWVlYmYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2R5bml4My5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIGEub3V0IHNwZWNpZmljcyBmb3IgU2VxdWVudCBTeW1tZXRyeSBydW5uaW5nIER5bml4IDMueAotICovCi0jaWZuZGVmIEFfT1VUX0RZTklYM19ICi0jZGVmaW5lIEFfT1VUX0RZTklYM19ICi0KLSNkZWZpbmUgZXh0ZXJuYWxfZXhlYyBkeW5peF9leHRlcm5hbF9leGVjCi0KLS8qIHN0cnVjdCBleGVjIGZvciBEeW5peCAzCi0gKgotICogYV9nZHRibCBhbmQgYV9ib290c3RyYXAgYXJlIG9ubHkgZm9yIHN0YW5kYWxvbmUgYmluYXJpZXMuCi0gKiBTaGFyZWQgZGF0YSBmaWVsZHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCBhcyBvZiBEeW5peCAzLjEsCi0gKiBidXQgYXJlIHN1cHBvcnRlZCBieSBEeW5peCBjb21waWxlciBwcm9ncmFtcy4KLSAqLwotc3RydWN0IGR5bml4X2V4dGVybmFsX2V4ZWMgewotCXVuc2lnbmVkIGNoYXIgZV9pbmZvWzRdOwotCXVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOwotCXVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9ic3NbNF07Ci0JdW5zaWduZWQgY2hhciBlX3N5bXNbNF07Ci0JdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOwotCXVuc2lnbmVkIGNoYXIgZV90cnNpemVbNF07Ci0JdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfZ19jb2RlWzhdLCBlX2dfZGF0YVs4XSwgZV9nX2Rlc2NbOF07Ci0JdW5zaWduZWQgY2hhciBlX3NoZGF0YVs0XTsKLQl1bnNpZ25lZCBjaGFyIGVfc2hic3NbNF07Ci0JdW5zaWduZWQgY2hhciBlX3NoZHJzaXplWzRdOwotCXVuc2lnbmVkIGNoYXIgZV9ib290c3RyYXBbNDRdOwotCXVuc2lnbmVkIGNoYXIgZV9yZXNlcnZlZFsxMl07Ci0JdW5zaWduZWQgY2hhciBlX3ZlcnNpb25bNF07Ci19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoMTI4KQotCi0vKgotICogQWxsIGV4ZWN1dGFibGVzIHVuZGVyIER5bml4IGFyZSBkZW1hbmQgcGFnZWQgd2l0aCByZWFkLW9ubHkgdGV4dCwKLSAqIFRodXMgbm8gTk1BR0lDLgotICoKLSAqIFpNQUdJQyBoYXMgYSBwYWdlIG9mIDBzIGF0IHZpcnR1YWwgMCwKLSAqIFhNQUdJQyBoYXMgYW4gaW52YWxpZCBwYWdlIGF0IHZpcnR1YWwgMAotICovCi0jZGVmaW5lIE9NQUdJQwkweDEyZWIJCS8qIC5vICovCi0jZGVmaW5lIFpNQUdJQwkweDIyZWIJCS8qIHplcm8gQCAwLCBkZW1hbmQgbG9hZCAqLwotI2RlZmluZSBYTUFHSUMJMHgzMmViCQkvKiBpbnZhbGlkIEAgMCwgZGVtYW5kIGxvYWQgKi8KLSNkZWZpbmUgU01BR0lDCTB4NDJlYgkJLyogc3RhbmRhbG9uZSwgbm90IHN1cHBvcnRlZCBoZXJlICovCi0KLSNkZWZpbmUgTl9CQURNQUcoeCkgKChPTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChaTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChYTUFHSUMgIT0gTl9NQUdJQyh4KSkgJiYgXAotCQkgICAgIChTTUFHSUMgIT0gTl9NQUdJQyh4KSkpCi0KLSNkZWZpbmUgTl9BRERSQURKKHgpICgoWk1BR0lDID09IE5fTUFHSUMoeCkgfHwgWE1BR0lDID09IE5fTUFHSUMoeCkpID8gMHgxMDAwIDogMCkKLQotI2RlZmluZSBOX1RYVE9GRih4KSAoRVhFQ19CWVRFU19TSVpFKQotI2RlZmluZSBOX0RBVE9GRih4KSAoTl9UWFRPRkYoeCkgKyBOX1RYVFNJWkUoeCkpCi0jZGVmaW5lIE5fU0hEQVRPRkYoeCkgKE5fREFUT0ZGKHgpICsgKHgpLmFfZGF0YSkKLSNkZWZpbmUgTl9UUkVMT0ZGKHgpIChOX1NIREFUT0ZGKHgpICsgKHgpLmFfc2hkYXRhKQotI2RlZmluZSBOX0RSRUxPRkYoeCkgKE5fVFJFTE9GRih4KSArICh4KS5hX3Ryc2l6ZSkKLSNkZWZpbmUgTl9TSERSRUxPRkYoeCkgKE5fRFJFTE9GRih4KSArICh4KS5hX2Ryc2l6ZSkKLSNkZWZpbmUgTl9TWU1PRkYoeCkgKE5fU0hEUkVMT0ZGKHgpICsgKHgpLmFfc2hkcnNpemUpCi0jZGVmaW5lIE5fU1RST0ZGKHgpIChOX1NZTU9GRih4KSArICh4KS5hX3N5bXMpCi0KLSNkZWZpbmUgTl9UWFRBRERSKHgpIFwKLQkoKChPTUFHSUMgPT0gTl9NQUdJQyh4KSkgfHwgKFNNQUdJQyA9PSBOX01BR0lDKHgpKSkgPyAwIFwKLQkgOiBURVhUX1NUQVJUX0FERFIgKyBFWEVDX0JZVEVTX1NJWkUpCi0KLSNkZWZpbmUgTl9UWFRTSVpFKHgpIFwKLQkoKChPTUFHSUMgPT0gTl9NQUdJQyh4KSkgfHwgKFNNQUdJQyA9PSBOX01BR0lDKHgpKSkgPyAoKHgpLmFfdGV4dCkgXAotCSA6ICgoeCkuYV90ZXh0IC0gTl9BRERSQURKKHgpIC0gRVhFQ19CWVRFU19TSVpFKSkKLQotI2VuZGlmIC8qIEFfT1VUX0RZTklYM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvZW5jYXAuaCBiL2luY2x1ZGUvYW91dC9lbmNhcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE1ZDQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9lbmNhcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIFlldCBBbm90aGVyIFRyeSBhdCBlbmNhcHN1bGF0aW5nIGJzZCBvYmplY3QgZmlsZXMgaW4gY29mZi4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgUGFjZSBXaWxsaXNzb24gMTIvOS84OAotCi0gICBUaGlzIGZpbGUgaXMgb2Jzb2xldGUuICBJdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8ganVzdCBkZWZpbmUgYSBidW5jaAotICAgb2Ygc3R1ZmYgdGhhdCBCRkQgY2FuIHVzZSB0byBkbyBjb2ZmLWVuY2Fwc3VsYXRlZCBmaWxlcy4gIC0tZ251QGN5Z251cy5jb20KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIFdlIG9ubHkgdXNlIHRoZSBjb2ZmIGhlYWRlcnMgdG8gdGVsbCB0aGUga2VybmVsCi0gKiBob3cgdG8gZXhlYyB0aGUgZmlsZS4gIFRoZXJlZm9yZSwgdGhlIG9ubHkgZmllbGRzIHRoYXQgbmVlZCB0byAKLSAqIGJlIGZpbGxlZCBpbiBhcmUgdGhlIHNjbnB0ciBhbmQgdmFkZHIgZm9yIHRoZSB0ZXh0IGFuZCBkYXRhCi0gKiBzZWN0aW9ucywgYW5kIHRoZSB2YWRkciBmb3IgdGhlIGJzcy4gIEFzIGZhciBhcyBjb2ZmIGlzIGNvbmNlcm5lZCwKLSAqIHRoZXJlIGlzIG5vIHN5bWJvbCB0YWJsZSwgcmVsb2NhdGlvbiwgb3IgbGluZSBudW1iZXJzLgotICoKLSAqIEEgbm9ybWFsIGJzZCBoZWFkZXIgKHN0cnVjdCBleGVjKSBpcyBwbGFjZWQgYWZ0ZXIgdGhlIGNvZmYgaGVhZGVycywKLSAqIGFuZCBiZWZvcmUgdGhlIHJlYWwgdGV4dC4gIEkgZGVmaW5lZCBhIHRoZSBuZXcgZmllbGRzICdhX21hY2h0eXBlJwotICogYW5kIGFfZmxhZ3MuICBJZiBhX21hY2h0eXBlIGlzIE1fMzg2LCBhbmQgYV9mbGFncyAmIEFfRU5DQVAgaXMKLSAqIHRydWUsIHRoZW4gdGhlIGJzZCBoZWFkZXIgaXMgcHJlY2VlZGVkIGJ5IGEgY29mZiBoZWFkZXIuICBNYWNyb3MKLSAqIGxpa2UgTl9UWFRPRkYgYW5kIE5fVFhUQUREUiB1c2UgdGhpcyBmaWVsZCB0byBmaW5kIHRoZSBic2QgaGVhZGVyLgotICogCi0gKiBUaGUgb25seSBwcm9ibGVtIGlzIHRvIHRyYWNrIGRvd24gdGhlIGJzZCBleGVjIGhlYWRlci4gIFRoZQotICogbWFjcm9zIEhFQURFUl9PRkZTRVQsIGV0YyBkbyB0aGlzLgotICovCi0KLSNkZWZpbmUgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFIDB4MjAgLyogY29mZiBoZWFkZXIgcHJlY2VkZXMgYnNkIGhlYWRlciAqLwotCi0vKiBEZXNjcmliZSB0aGUgQ09GRiBoZWFkZXIgdXNlZCBmb3IgZW5jYXBzdWxhdGlvbi4gICovCi0KLXN0cnVjdCBjb2ZmaGVhZGVyCi17Ci0gIC8qIGZpbGVoZHIgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9tYWdpYzsKLSAgdW5zaWduZWQgc2hvcnQgZl9uc2NuczsKLSAgbG9uZyBmX3RpbWRhdDsKLSAgbG9uZyBmX3N5bXB0cjsKLSAgbG9uZyBmX25zeW1zOwotICB1bnNpZ25lZCBzaG9ydCBmX29wdGhkcjsKLSAgdW5zaWduZWQgc2hvcnQgZl9mbGFnczsKLSAgLyogYW91dGhkciAqLwotICBzaG9ydCBtYWdpYzsKLSAgc2hvcnQgdnN0YW1wOwotICBsb25nIHRzaXplOwotICBsb25nIGRzaXplOwotICBsb25nIGJzaXplOwotICBsb25nIGVudHJ5OwotICBsb25nIHRleHRfc3RhcnQ7Ci0gIGxvbmcgZGF0YV9zdGFydDsKLSAgc3RydWN0IGNvZmZzY24KLSAgICB7Ci0gICAgICBjaGFyIHNfbmFtZVs4XTsKLSAgICAgIGxvbmcgc19wYWRkcjsKLSAgICAgIGxvbmcgc192YWRkcjsKLSAgICAgIGxvbmcgc19zaXplOwotICAgICAgbG9uZyBzX3NjbnB0cjsKLSAgICAgIGxvbmcgc19yZWxwdHI7Ci0gICAgICBsb25nIHNfbG5ub3B0cjsKLSAgICAgIHVuc2lnbmVkIHNob3J0IHNfbnJlbG9jOwotICAgICAgdW5zaWduZWQgc2hvcnQgc19ubG5ubzsKLSAgICAgIGxvbmcgc19mbGFnczsKLSAgICB9IHNjbnNbM107Ci19OwotDAotLyogRGVzY3JpYmUgc29tZSBvZiB0aGUgcGFyYW1ldGVycyBvZiB0aGUgZW5jYXBzdWxhdGlvbiwKLSAgIGluY2x1ZGluZyBob3cgdG8gZmluZCB0aGUgZW5jYXBzdWxhdGVkIEJTRCBoZWFkZXIuICAqLwotCi0vKiBGSVhNRSwgdGhpcyBpcyBkdW1iLiAgVGhlIHNhbWUgdG9vbHMgY2FuJ3QgaGFuZGxlIGEub3V0cyBmb3IgZGlmZmVyZW50Ci0gICBhcmNoaXRlY3R1cmVzLCBqdXN0IGJlY2F1c2UgQ09GRl9NQUdJQyBpcyBkaWZmZXJlbnQ7IHNvIHlvdSBuZWVkIGEKLSAgIHNlcGFyYXRlIEdOVSBubSBmb3IgZXZlcnkgYXJjaGl0ZWN0dXJlISE/ICBVbmZvcnR1bmF0ZWx5LCBpdCBuZWVkcyB0bwotICAgYmUgdGhpcyB3YXksIHNpbmNlIHRoZSBDT0ZGX01BR0lDIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIGtlcm5lbAotICAgd2UncmUgdHJ5aW5nIHRvIGZvb2wgaGVyZS4gICovCi0gICAKLSNkZWZpbmUgQ09GRl9NQUdJQ19JMzg2IDA1MTQgLyogSTM4Nk1BR0lDICovCi0jZGVmaW5lIENPRkZfTUFHSUNfTTY4SyAwNTIwIC8qIE1DNjhNQUdJQyAqLwotI2RlZmluZQlDT0ZGX01BR0lDX0EyOUsgMHgxN0EJLyogVXNlZCBieSBhc20yOWsgY3Jvc3MtdG9vbHMgKi8KLQotI2lmZGVmIENPRkZfTUFHSUMKLXNob3J0IF9faGVhZGVyX29mZnNldF90ZW1wOwotI2RlZmluZSBIRUFERVJfT0ZGU0VUKGYpIFwKLQkoX19oZWFkZXJfb2Zmc2V0X3RlbXAgPSAwLCBcCi0JIGZyZWFkICgoY2hhciAqKSZfX2hlYWRlcl9vZmZzZXRfdGVtcCwgc2l6ZW9mIChzaG9ydCksIDEsIChmKSksIFwKLQkgZnNlZWsgKChmKSwgLXNpemVvZiAoc2hvcnQpLCAxKSwgXAotCSBfX2hlYWRlcl9vZmZzZXRfdGVtcD09Q09GRl9NQUdJQyA/IHNpemVvZihzdHJ1Y3QgY29mZmhlYWRlcikgOiAwKQotI2Vsc2UKLSNkZWZpbmUgSEVBREVSX09GRlNFVChmKSAwCi0jZW5kaWYKLQotI2RlZmluZSBIRUFERVJfU0VFSyhmKSAoZnNlZWsgKChmKSwgSEVBREVSX09GRlNFVCgoZikpLCAxKSkKLQwKLS8qIERlc2NyaWJlIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIEJTRCBoZWFkZXIKLSAgIHRoYXQgYXBwZWFycyBpbnNpZGUgdGhlIGVuY2Fwc3VsYXRpb24uICAqLwotCi0vKiBFbmNhcHN1bGF0ZWQgY29mZiBmaWxlcyB0aGF0IGFyZSBsaW5rZWQgWk1BR0lDIGhhdmUgYSB0ZXh0IHNlZ21lbnQKLSAgIG9mZnNldCBqdXN0IHBhc3QgdGhlIGhlYWRlciAoYW5kIGEgbWF0Y2hpbmcgVFhUQUREUiksIGV4Y2x1ZGluZwotICAgdGhlIGhlYWRlcnMgZnJvbSB0aGUgdGV4dCBzZWdtZW50IHByb3BlciBidXQga2VlcGluZyB0aGUgcGh5c2ljYWwKLSAgIGxheW91dCBhbmQgdGhlIHZpcnR1YWwgbWVtb3J5IGxheW91dCBwYWdlLWFsaWduZWQuCi0KLSAgIE5vbi1lbmNhcHN1bGF0ZWQgYS5vdXQgZmlsZXMgdGhhdCBhcmUgbGlua2VkIFpNQUdJQyBoYXZlIGEgdGV4dAotICAgc2VnbWVudCB0aGF0IHN0YXJ0cyBhdCAwIGFuZCBhbiBOX1RYVEFEUiBzaW1pbGFybHkgb2Zmc2V0IHRvIDAuCi0gICBUaGV5IHRvbyBhcmUgcGFnZS1hbGlnbmVkIHdpdGggZWFjaCBvdGhlciwgYnV0IHRoZXkgaW5jbHVkZSB0aGUKLSAgIGEub3V0IGhlYWRlciBhcyBwYXJ0IG9mIHRoZSB0ZXh0LiAKLQotICAgVGhlIF9OX0hEUk9GRiBnZXRzIHNpemVvZiBzdHJ1Y3QgZXhlYyBhZGRlZCB0byBpdCwgc28gd2UgaGF2ZQotICAgdG8gY29tcGVuc2F0ZSBoZXJlLiAgU2VlIDxhLm91dC5nbnUuaD4uICAqLwotCi0jdW5kZWYgX05fSERST0ZGCi0jdW5kZWYgTl9UWFRBRERSCi0jdW5kZWYgTl9EQVRBRERSCi0KLSNkZWZpbmUgX05fSERST0ZGKHgpICgoTl9GTEFHUyh4KSAmIE5fRkxBR1NfQ09GRl9FTkNBUFNVTEFURSkgPyBcCi0JCSAgICAgIHNpemVvZiAoc3RydWN0IGNvZmZoZWFkZXIpIDogMCkKLQotLyogQWRkcmVzcyBvZiB0ZXh0IHNlZ21lbnQgaW4gbWVtb3J5IGFmdGVyIGl0IGlzIGxvYWRlZC4gICovCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0JKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkgc2l6ZW9mIChzdHJ1Y3QgY29mZmhlYWRlcikgKyBzaXplb2YgKHN0cnVjdCBleGVjKSA6IDApCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDQwMDAwMAotCi0jZGVmaW5lIE5fREFUQUREUih4KSBcCi0JKChOX0ZMQUdTKHgpICYgTl9GTEFHU19DT0ZGX0VOQ0FQU1VMQVRFKSA/IFwKLQkgKFNFR01FTlRfU0laRSArICgoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQtMSkgJiB+KFNFR01FTlRfU0laRS0xKSkpIDogXAotCSAoTl9UWFRBRERSKHgpKyh4KS5hX3RleHQpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L2hvc3QuaCBiL2luY2x1ZGUvYW91dC9ob3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMzYyMTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qIFBhcmFtZXRlcnMgYWJvdXQgdGhlIGEub3V0IGZvcm1hdCwgYmFzZWQgb24gdGhlIGhvc3Qgc3lzdGVtIG9uIHdoaWNoCi0gICB0aGUgcHJvZ3JhbSBpcyBjb21waWxlZC4gICovCi0KLS8qIEFkZHJlc3Mgb2YgZGF0YSBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuCi0gICBJdCBpcyB1cCB0byB5b3UgdG8gZGVmaW5lIFNFR01FTlRfU0laRQotICAgb24gbWFjaGluZXMgbm90IGxpc3RlZCBoZXJlLiAgKi8KLSNpZm5kZWYgU0VHTUVOVF9TSVpFCi0jaWYgZGVmaW5lZChocDMwMCkgfHwgZGVmaW5lZChweXIpCi0jZGVmaW5lIFNFR01FTlRfU0laRSBwYWdlX3NpemUKLSNlbmRpZgotI2lmZGVmCXNvbnkKLSNkZWZpbmUJU0VHTUVOVF9TSVpFCTB4MTAwMAotI2VuZGlmCS8qIFNvbnkuICAqLwotI2lmZGVmIGlzNjhrCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDIwMDAwCi0jZW5kaWYKLSNpZiBkZWZpbmVkKG02OGspICYmIGRlZmluZWQoUE9SVEFSKQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFIDB4NDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSBUQVJHRVRfUEFHRV9TSVpFCi0jZW5kaWYKLSNlbmRpZiAvKiFkZWZpbmVkKFNFR01FTlRfU0laRSkqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaHAuaCBiL2luY2x1ZGUvYW91dC9ocC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDJmNDljLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9ocC5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyogU3BlY2lhbCB2ZXJzaW9uIG9mIDxhLm91dC5oPiBmb3IgdXNlIHVuZGVyIGhwLXV4LgotICAgQ29weXJpZ2h0IDE5ODgsIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRISVMgRklMRSBJUyBPQlNPTEVURS4gIEl0IG5lZWRzIHRvIGJlIHJldmlzZWQgYXMgYSB2YXJpYW50ICJleHRlcm5hbCIKLSAgIGEub3V0IGZvcm1hdCBmb3IgdXNlIHdpdGggQkZELiAgKi8KLQotLyogVGhlIGBleGVjJyBzdHJ1Y3R1cmUgYW5kIG92ZXJhbGwgbGF5b3V0IG11c3QgYmUgY2xvc2UgdG8gSFAncyB3aGVuCi0gICB3ZSBhcmUgcnVubmluZyBvbiBhbiBIUCBzeXN0ZW0sIG90aGVyd2lzZSB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvCi0gICBleGVjdXRlIHRoZSByZXN1bHRpbmcgZmlsZS4gKi8KLQotLyogQWxsb3cgdGhpcyBmaWxlIHRvIGJlIGluY2x1ZGVkIHR3aWNlLiAqLwotI2lmbmRlZiBfX0dOVV9FWEVDX01BQ1JPU19fCi0KLXN0cnVjdCBleGVjCi17Ci0gIHVuc2lnbmVkIHNob3J0IGFfbWFjaHR5cGU7CS8qIG1hY2hpbmUgdHlwZSAqLwotICB1bnNpZ25lZCBzaG9ydCBhX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMTsKLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMjsKLSAgdW5zaWduZWQgbG9uZyBhX3RleHQ7CQkvKiBsZW5ndGggb2YgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2RhdGE7CQkvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2JzczsJCS8qIGxlbmd0aCBvZiB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBmb3IgZmlsZSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX2Ryc2l6ZTsJLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlMzsJLyogSFAgPSBwYXNjYWwgaW50ZXJmYWNlIHNpemUgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNDsJLyogSFAgPSBzeW1ib2wgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU1OwkvKiBIUCA9IGRlYnVnIG5hbWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfZW50cnk7CS8qIHN0YXJ0IGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgbG9uZyBhX3NwYXJlNjsJLyogSFAgPSBzb3VyY2UgbGluZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcgYV9zcGFyZTc7CS8qIEhQID0gdmFsdWUgdGFibGUgc2l6ZSAqLwotICB1bnNpZ25lZCBsb25nIGFfc3ltczsJCS8qIGxlbmd0aCBvZiBzeW1ib2wgdGFibGUgZGF0YSBpbiBmaWxlLCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBsb25nIGFfc3BhcmU4OwotfTsKLQotLyogVGVsbCBhLm91dC5nbnUuaCBub3QgdG8gZGVmaW5lIGBzdHJ1Y3QgZXhlYycuICAqLwotI2RlZmluZSBfX1NUUlVDVF9FWEVDX09WRVJSSURFX18KLQotI2luY2x1ZGUgIi4uL2Eub3V0LmdudS5oIgotCi0jdW5kZWYgTl9NQUdJQwotI3VuZGVmIE5fTUFDSFRZUEUKLSN1bmRlZiBOX0ZMQUdTCi0jdW5kZWYgTl9TRVRfSU5GTwotI3VuZGVmIE5fU0VUX01BR0lDCi0jdW5kZWYgTl9TRVRfTUFDSFRZUEUKLSN1bmRlZiBOX1NFVF9GTEFHUwotCi0jZGVmaW5lIE5fTUFHSUMoZXhlYykgKChleGVjKSAuIGFfbWFnaWMpCi0jZGVmaW5lIE5fTUFDSFRZUEUoZXhlYykgKChleGVjKSAuIGFfbWFjaHR5cGUpCi0jZGVmaW5lIE5fU0VUX01BR0lDKGV4ZWMsIG1hZ2ljKSAoKChleGVjKSAuIGFfbWFnaWMpID0gKG1hZ2ljKSkKLSNkZWZpbmUgTl9TRVRfTUFDSFRZUEUoZXhlYywgbWFjaHR5cGUpICgoKGV4ZWMpIC4gYV9tYWNodHlwZSkgPSAobWFjaHR5cGUpKQotCi0jdW5kZWYgTl9CQURNQUcKLSNkZWZpbmUgTl9CQURNQUcoeCkgKChfTl9CQURNQUcgKHgpKSB8fCAoX05fQkFETUFDSCAoeCkpKQotCi0jZGVmaW5lIF9OX0JBRE1BQ0goeCkJCQkJCQkJXAotKCgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTAwMFMyMDBfSUQpICYmCQkJCQlcCi0gKChOX01BQ0hUWVBFICh4KSkgIT0gSFA5OHg2X0lEKSkKLQotI2RlZmluZSBIUDk4eDZfSUQgMHgyMEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDIwQwotCi0jdW5kZWYgX05fSERST0ZGCi0jZGVmaW5lIF9OX0hEUk9GRih4KSAoU0VHTUVOVF9TSVpFIC0gKHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKLQotI2RlZmluZSBTRUdNRU5UX1NJWkUgMHgxMDAwCi0KLSNlbmRpZiAvKiBfX0dOVV9FWEVDX01BQ1JPU19fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmggYi9pbmNsdWRlL2FvdXQvaHAzMDBocHV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZDUxOTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L2hwMzAwaHB1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qIFNwZWNpYWwgdmVyc2lvbiBvZiA8YS5vdXQuaD4gZm9yIHVzZSB1bmRlciBocC11eC4KLSAgIENvcHlyaWdodCAoQykgMTk4OCwxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAqLwotCi1zdHJ1Y3QgaHAzMDBocHV4X2V4ZWNfYnl0ZXMKLXsKLSAgdW5zaWduZWQgY2hhciBlX2luZm9bNF07ICAgLyogYV9tYWNodHlwZS9hX21hZ2ljICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTFbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV9zcGFyZTJbNF07Ci0gIHVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOyAgIC8qIGxlbmd0aCBvZiB0ZXh0LCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfZGF0YVs0XTsgICAvKiBsZW5ndGggb2YgZGF0YSwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBlX2Jzc1s0XTsgICAgLyogbGVuZ3RoIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YSBhcmVhICwgaW4gYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsgLyogbGVuZ3RoIG9mIHJlbG9jYXRpb24gaW5mbyBmb3IgdGV4dCwgaW4gYnl0ZXMqLwotICB1bnNpZ25lZCBjaGFyIGVfZHJzaXplWzRdOyAvKiBsZW5ndGggb2YgcmVsb2NhdGlvbiBpbmZvIGZvciBkYXRhLCBpbiBieXRlcyovCi0gIHVuc2lnbmVkIGNoYXIgZV9wYXNzaXplWzRdOy8qIEhQID0gcGFzY2FsIGludGVyZmFjZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9zeW1zWzRdOyAgIC8qIEhQID0gc3ltYm9sIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3NwYXJlNVs0XTsgLyogSFAgPSBkZWJ1ZyBuYW1lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX2VudHJ5WzRdOyAgLyogc3RhcnQgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyIGVfc3BhcmU2WzRdOyAvKiBIUCA9IHNvdXJjZSBsaW5lIHRhYmxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhciBlX3N1cHNpemVbNF07LyogSFAgPSB2YWx1ZSB0YWJsZSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIgZV9kcmVsb2NzWzRdOwotICB1bnNpZ25lZCBjaGFyIGVfZXh0ZW5zaW9uWzRdOyAvKiBmaWxlIG9mZnNldCBvZiBleHRlbnNpb24gKi8KLX07Ci0jZGVmaW5lCUVYRUNfQllURVNfU0laRQk2NAotCi1zdHJ1Y3QgaHAzMDBocHV4X25saXN0X2J5dGVzCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyIGVfdmFsdWVbNF07Ci0gICAgdW5zaWduZWQgY2hhciBlX3R5cGVbMV07Ci0gICAgdW5zaWduZWQgY2hhciBlX2xlbmd0aFsxXTsJLyogbGVuZ3RoIG9mIGFzY2lpIHN5bWJvbCBuYW1lICovCi0gICAgdW5zaWduZWQgY2hhciBlX2FsbW9kWzJdOwkvKiBhbGlnbm1lbnQgbW9kICovCi0gICAgdW5zaWduZWQgY2hhciBlX3NobGliWzJdOyAgIC8qIGluZm8gYWJvdXQgZHluYW1pYyBsaW5raW5nICovCi0gIH07Ci0jZGVmaW5lIEVYVEVSTkFMX05MSVNUX1NJWkUgMTAKLQotc3RydWN0IGhwMzAwaHB1eF9yZWxvYwotICB7Ci0gICAgdW5zaWduZWQgY2hhciByX2FkZHJlc3NbNF07Lyogb2Zmc2V0IG9mIG9mIGRhdGEgdG8gcmVsb2NhdGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfaW5kZXhbMl07ICAvKiBzeW1ib2wgdGFibGUgaW5kZXggb2Ygc3ltYm9sICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsgICAvKiByZWxvY2F0aW9uIHR5cGUgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHJfbGVuZ3RoWzFdOyAvKiBsZW5ndGggb2YgaXRlbSB0byByZWxvYyAgICAgICAgICAgICAgKi8KLSAgfTsKLQotc3RydWN0IGhwMzAwaHB1eF9oZWFkZXJfZXh0ZW5zaW9uCi17Ci0gICAgdW5zaWduZWQgY2hhciBlX3N5bXNbNF07Ci0gICAgdW5zaWduZWQgY2hhciB1bmlxdWVfaGVhZGVyc1sxMio0XTsKLSAgICB1bnNpZ25lZCBjaGFyIGVfaGVhZGVyWzJdOyAgIC8qIHR5cGUgb2YgaGVhZGVyICovCi0gICAgdW5zaWduZWQgY2hhciBlX3ZlcnNpb25bMl07ICAvKiB2ZXJzaW9uICAgICAgICAqLwotICAgIHVuc2lnbmVkIGNoYXIgZV9zaXplWzRdOyAgICAgLyogYnl0ZXMgZm9sbG93aW5nKi8KLSAgICB1bnNpZ25lZCBjaGFyIGVfZXh0ZW5zaW9uWzRdOy8qIGZpbGUgb2Zmc2V0IG9mIG5leHQgZXh0ZW5zaW9uICovCi19OwotI2RlZmluZSBFWFRFUk5BTF9FWFRFTlNJT05fSEVBREVSX1NJWkUgKDE2KjQpCi0KLS8qIGhwdXggc2VwYXJhdGVzIG9iamVjdCBmaWxlcyAoMHgxMDYpIGFuZCBpbXB1cmUgZXhlY3V0YWJsZXMgKDB4MTA3KSAgKi8KLS8qIGJ1dCB0aGUgYmZkIGNvZGUgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGVtLiBTaW5jZSB3ZSB3YW50IHRvKi8KLS8qIHJlYWQgaHB1eCAubyBmaWxlcywgd2UgYWRkIGFuIHNwZWNpYWwgZGVmaW5lIGFuZCB1c2UgaXQgYmVsb3cgaW4gICAgKi8KLS8qIG9mZnNldCBhbmQgYWRkcmVzcyBjYWxjdWxhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBIUFVYX0RPVF9PX01BR0lDIDB4MTA2Ci0jZGVmaW5lIE9NQUdJQyAweDEwNyAgICAgICAvKiBvYmplY3QgZmlsZSBvciBpbXB1cmUgZXhlY3V0YWJsZS4gICovCi0jZGVmaW5lIE5NQUdJQyAweDEwOCAgICAgICAvKiBDb2RlIGluZGljYXRpbmcgcHVyZSBleGVjdXRhYmxlLiAgICovCi0jZGVmaW5lIFpNQUdJQyAweDEwQiAgICAgICAvKiBkZW1hbmQtcGFnZWQgZXhlY3V0YWJsZS4gICAgICAgICAgICovCi0KLSNkZWZpbmUgTl9IRUFERVJfSU5fVEVYVCh4KSAwCi0KLSNpZiAwIC8qIGxpYmFvdXQuaCBvbmx5IHVzZXMgdGhlIGxvd2VyIDggYml0cyAqLwotI2RlZmluZSBIUDk4eDZfSUQgMHgyMEEKLSNkZWZpbmUgSFA5MDAwUzIwMF9JRCAweDIwQwotI2VuZGlmCi0jZGVmaW5lIEhQOTh4Nl9JRCAweDBBCi0jZGVmaW5lIEhQOTAwMFMyMDBfSUQgMHgwQwotCi0jZGVmaW5lIE5fQkFETUFHKHgpICgoX05fQkFETUFHICh4KSkgfHwgKF9OX0JBRE1BQ0ggKHgpKSkKLQotI2RlZmluZSBOX0RBVEFERFIoeCkgXAotICAgICgoTl9NQUdJQyh4KT09T01BR0lDIHx8IE5fTUFHSUMoeCk9PUhQVVhfRE9UX09fTUFHSUMpID8gXAotICAgICAgICAoTl9UWFRBRERSKHgpK05fVFhUU0laRSh4KSkgXAotICAgICA6ICAoTl9TRUdTSVpFKHgpICsgKChOX1RYVEFERFIoeCkrTl9UWFRTSVpFKHgpLTEpICYgfihOX1NFR1NJWkUoeCktMSkpKSkKLQotI2RlZmluZSBfTl9CQURNQUNIKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotKCgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTAwMFMyMDBfSUQpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICgoTl9NQUNIVFlQRSAoeCkpICE9IEhQOTh4Nl9JRCkpCi0KLSNkZWZpbmUgX05fQkFETUFHKHgpCSAgKE5fTUFHSUMoeCkgIT0gSFBVWF9ET1RfT19NQUdJQyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBOX01BR0lDKHgpICE9IE9NQUdJQwkJXAotCQkJJiYgTl9NQUdJQyh4KSAhPSBOTUFHSUMJCVwKLSAgCQkJJiYgTl9NQUdJQyh4KSAhPSBaTUFHSUMgKQotCi0jdW5kZWYgX05fSERST0ZGCi0jZGVmaW5lIF9OX0hEUk9GRih4KSAoU0VHTUVOVF9TSVpFIC0gKHNpemVvZiAoc3RydWN0IGV4ZWMpKSkKLQotI3VuZGVmIE5fREFUT0ZGCi0jdW5kZWYgTl9QQVNPRkYKLSN1bmRlZiBOX1NZTU9GRgotI3VuZGVmIE5fU1VQT0ZGCi0jdW5kZWYgTl9UUkVMT0ZGCi0jdW5kZWYgTl9EUkVMT0ZGCi0jdW5kZWYgTl9TVFJPRkYKLQotI2RlZmluZSBOX0RBVE9GRih4KQkoIE5fVFhUT0ZGKHgpICsgTl9UWFRTSVpFKHgpICkKLSNkZWZpbmUgTl9QQVNPRkYoeCkgICAgICggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fUEFTT0ZGKHgpICAgLyogKyAoeCkuYV9wYXNzaXplKi8gKQotI2RlZmluZSBOX1NVUE9GRih4KSAgICAgKCBOX1NZTU9GRih4KSArICh4KS5hX3N5bXMgKQotI2RlZmluZSBOX1RSRUxPRkYoeCkJKCBOX1NVUE9GRih4KSAgICAvKiArIDAgKHgpLmFfc3Vwc2l6ZSovICkKLSNkZWZpbmUgTl9EUkVMT0ZGKHgpCSggTl9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplICkKLSNkZWZpbmUgTl9FWFRIT0ZGKHgpICAgICggTl9EUkVMT0ZGKHgpICAgLyogICsgMCAoeCkuYV9kcnNpemUgKi8pCi0jZGVmaW5lIE5fU1RST0ZGKHgpCSggMCAvKiBubyBzdHJpbmcgdGFibGUgKi8gKQotCi0vKiB1c2UgdGhlc2Ugd2hlbiB0aGUgZmlsZSBoYXMgZ251IHN5bWJvbCB0YWJsZXMgKi8KLSNkZWZpbmUgTl9HTlVfVFJFTE9GRih4KSAoTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhKQotI2RlZmluZSBOX0dOVV9EUkVMT0ZGKHgpIChOX0dOVV9UUkVMT0ZGKHgpICsgKHgpLmFfdHJzaXplKQotI2RlZmluZSBOX0dOVV9TWU1PRkYoeCkgIChOX0dOVV9EUkVMT0ZGKHgpICsgKHgpLmFfZHJzaXplKQotCi0jZGVmaW5lIFRBUkdFVF9QQUdFX1NJWkUgMHgxMDAwCi0jZGVmaW5lIFNFR01FTlRfU0laRSAweDEwMDAKLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSIDAKLQotI3VuZGVmIE5fU0hBUkVEX0xJQgotI2RlZmluZSBOX1NIQVJFRF9MSUIoeCkgICggMCAvKiBubyBzaGFyZWQgbGlicmFyaWVzICovICkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9ocHBhLmggYi9pbmNsdWRlL2FvdXQvaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE4NWRlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9ocHBhLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNpbmNsdWRlICJmaWxlaGRyLmgiCi0jaW5jbHVkZSAiYW91dGhkci5oIgotI2luY2x1ZGUgInNjbmhkci5oIgotI2luY2x1ZGUgInNwYWNlaGRyLmgiCi0jaW5jbHVkZSAic3ltcy5oIgotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9yYW5saWIuaCBiL2luY2x1ZGUvYW91dC9yYW5saWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgyNjAwNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvcmFubGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKiByYW5saWIuaCAtLSBhcmNoaXZlIGxpYnJhcnkgaW5kZXggbWVtYmVyIGRlZmluaXRpb24gZm9yIEdOVS4KLSAgIENvcHlyaWdodCAxOTkwLTE5OTEgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgU3ltZGVmIG1lbWJlciBvZiBhbiBhcmNoaXZlIGNvbnRhaW5zIHR3byB0aGluZ3M6Ci0gICBhIHRhYmxlIHRoYXQgbWFwcyBzeW1ib2wtc3RyaW5nIG9mZnNldHMgdG8gZmlsZSBvZmZzZXRzLAotICAgYW5kIGEgc3ltYm9sLXN0cmluZyB0YWJsZS4gIEFsbCB0aGUgc3ltYm9sIG5hbWVzIGFyZQotICAgcnVuIHRvZ2V0aGVyIChlYWNoIHdpdGggdHJhaWxpbmcgbnVsbCkgaW4gdGhlIHN5bWJvbC1zdHJpbmcKLSAgIHRhYmxlLiAgVGhlcmUgaXMgYSBzaW5nbGUgbG9uZ3dvcmQgYnl0ZWNvdW50IG9uIHRoZSBmcm9udAotICAgb2YgZWFjaCBvZiB0aGVzZSB0YWJsZXMuICBUaHVzIGlmIHdlIGhhdmUgdHdvIHN5bWJvbHMsCi0gICAiZm9vIiBhbmQgIl9iYXIiLCB0aGF0IGFyZSBpbiBhcmNoaXZlIG1lbWJlcnMgYXQgb2Zmc2V0cwotICAgMjAwIGFuZCA5MDAsIGl0IHdvdWxkIGxvb2sgbGlrZSB0aGlzOgotICAgICAgICAxNgkJOyBieXRlIGNvdW50IG9mIGluZGV4IHRhYmxlCi0gIAkwCQk7IG9mZnNldCBvZiAiZm9vIiBpbiBzdHJpbmcgdGFibGUKLSAgCTIwMAkJOyBvZmZzZXQgb2YgZm9vLW1vZHVsZSBpbiBmaWxlCi0gIAk0CQk7IG9mZnNldCBvZiAiYmFyIiBpbiBzdHJpbmcgdGFibGUKLSAgCTkwMAkJOyBvZmZzZXQgb2YgYmFyLW1vZHVsZSBpbiBmaWxlCi0gIAk5CQk7IGJ5dGUgY291bnQgb2Ygc3RyaW5nIHRhYmxlCi0gIAkiZm9vXDBfYmFyXDAiCTsgc3RyaW5nIHRhYmxlICAqLwotCi0jZGVmaW5lCVJBTkxJQk1BRwkiX18uU1lNREVGIgkvKiBBcmNoaXZlIGZpbGUgbmFtZSBjb250YWluaW5nIGluZGV4ICovCi0jZGVmaW5lCVJBTkxJQlNLRVcJMwkJLyogQ3JlYXRpb24gdGltZSBvZmZzZXQgKi8KLQotLyogRm9ybWF0IG9mIF9fLlNZTURFRjoKLSAgIEZpcnN0LCBhIGxvbmd3b3JkIGNvbnRhaW5pbmcgdGhlIHNpemUgb2YgdGhlICdzeW1kZWYnIGRhdGEgdGhhdCBmb2xsb3dzLgotICAgU2Vjb25kLCB6ZXJvIG9yIG1vcmUgJ3N5bWRlZicgc3RydWN0dXJlcy4KLSAgIFRoaXJkLCBhIGxvbmd3b3JkIGNvbnRhaW5pbmcgdGhlIGxlbmd0aCBvZiBzeW1ib2wgbmFtZSBzdHJpbmdzLgotICAgRm91cnRoLCB6ZXJvIG9yIG1vcmUgc3ltYm9sIG5hbWUgc3RyaW5ncyAoZWFjaCBmb2xsb3dlZCBieSBhIG51bGwpLiAgKi8KLQotc3RydWN0IHN5bWRlZgotICB7Ci0gICAgdW5pb24KLSAgICAgIHsKLQl1bnNpZ25lZCBsb25nIHN0cmluZ19vZmZzZXQ7CS8qIEluIHRoZSBmaWxlICovCi0JY2hhciAqbmFtZTsJCQkvKiBJbiBtZW1vcnksIHNvbWV0aW1lcyAqLwotICAgICAgfSBzOwotICAgIC8qIHRoaXMgcG9pbnRzIHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBoZWFkZXIgKEFLQSBtZW1iZXIgaGVhZGVyIC0tCi0gICAgICAgYSBzdHJ1Y3QgYXJfaGRyKSwgbm90IHRvIHRoZSBmcm9udCBvZiB0aGUgZmlsZSBvciBpbnRvIHRoZSBmaWxlKS4KLSAgICAgICBpbiBvdGhlciB3b3JkcyBpdCBvbmx5IHRlbGxzIHlvdSB3aGljaCBmaWxlIHRvIHJlYWQgKi8gICAgICAgCi0gICAgdW5zaWduZWQgbG9uZyBmaWxlX29mZnNldDsKLSAgfTsKLQotLyogQ29tcGF0YWJpbGl0eSB3aXRoIEJTRCBjb2RlICovCi0KLSNkZWZpbmUJcmFubGliCXN5bWRlZgotI2RlZmluZQlyYW5fdW4JcwotI2RlZmluZQlyYW5fc3RyeCBzdHJpbmdfb2Zmc2V0Ci0jZGVmaW5lCXJhbl9uYW1lIG5hbWUKLSNkZWZpbmUJcmFuX29mZglmaWxlX29mZnNldApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hb3V0L3JlbG9jLmggYi9pbmNsdWRlL2FvdXQvcmVsb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzYzU1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvcmVsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIHJlbG9jLmggLS0gSGVhZGVyIGZpbGUgZm9yIHJlbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICBDb3B5cmlnaHQgMTk4OS0xOTkxICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogUmVsb2NhdGlvbiB0eXBlcyBmb3IgYS5vdXQgZmlsZXMgdXNpbmcgcmVsb2NfaW5mb19leHRlbmRlZAotICAgKFNQQVJDIGFuZCBBTUQgMjkwMDApLiAqLwotCi0jaWZuZGVmIF9SRUxPQ19IX1JFQURfCi0jZGVmaW5lIF9SRUxPQ19IX1JFQURfIDEKLQotZW51bSByZWxvY190eXBlCi0gIHsKLSAgICBSRUxPQ184LCAgICAgICAgUkVMT0NfMTYsICAgICAgICBSRUxPQ18zMiwgLyogc2ltcGxlIHJlbG9jYXRpb25zICovCi0gICAgUkVMT0NfRElTUDgsICAgIFJFTE9DX0RJU1AxNiwgICAgUkVMT0NfRElTUDMyLCAvKiBwYy1yZWwgZGlzcGxhY2VtZW50ICovCi0gICAgUkVMT0NfV0RJU1AzMCwgIFJFTE9DX1dESVNQMjIsCi0gICAgUkVMT0NfSEkyMiwgICAgIFJFTE9DXzIyLAotICAgIFJFTE9DXzEzLCAgICAgICBSRUxPQ19MTzEwLAotICAgIFJFTE9DX1NGQV9CQVNFLCBSRUxPQ19TRkFfT0ZGMTMsCi0gICAgUkVMT0NfQkFTRTEwLCAgIFJFTE9DX0JBU0UxMywgICAgUkVMT0NfQkFTRTIyLCAvKiBQLkkuQy4gKGJhc2UtcmVsYXRpdmUpICovCi0gICAgUkVMT0NfUEMxMCwgICAgIFJFTE9DX1BDMjIsCS8qIGZvciBzb21lIHNvcnQgb2YgcGMtcmVsIFAuSS5DLiAoPykgKi8KLSAgICBSRUxPQ19KTVBfVEJMLAkJLyogUC5JLkMuIGp1bXAgdGFibGUgKi8KLSAgICBSRUxPQ19TRUdPRkYxNiwJCS8qIHJlcHV0ZWRseSBmb3Igc2hhcmVkIGxpYnJhcmllcyBzb21laG93ICovCi0gICAgUkVMT0NfR0xPQl9EQVQsICBSRUxPQ19KTVBfU0xPVCwgUkVMT0NfUkVMQVRJVkUsCi0gICAgUkVMT0NfMTEsCi0gICAgUkVMT0NfV0RJU1AyXzE0LAotICAgIFJFTE9DX1dESVNQMTksCi0gICAgUkVMT0NfSEhJMjIsCi0gICAgUkVMT0NfSExPMTAsCi0gICAgCi0gICAgLyogMjlLIHJlbG9jYXRpb24gdHlwZXMgKi8KLSAgICBSRUxPQ19KVU1QVEFSRywgUkVMT0NfQ09OU1QsICAgICBSRUxPQ19DT05TVEgsCi0gICAgCi0gICAgUkVMT0NfV0RJU1AxNCwgUkVMT0NfV0RJU1AyMSwKLSAgICAKLSAgICBOT19SRUxPQwotICAgIH07Ci0KLSNkZWZpbmUJUkVMT0NfVFlQRV9OQU1FUyBcCi0iOCIsCQkiMTYiLAkJIjMyIiwJCSJESVNQOCIsCVwKLSJESVNQMTYiLAkiRElTUDMyIiwJIldESVNQMzAiLAkiV0RJU1AyMiIsCVwKLSJISTIyIiwJCSIyMiIsCQkiMTMiLAkJIkxPMTAiLAkJXAotIlNGQV9CQVNFIiwJIlNGQU9GRjEzIiwJIkJBU0UxMCIsCSJCQVNFMTMiLAlcCi0iQkFTRTIyIiwJIlBDMTAiLAkJIlBDMjIiLAkJIkpNUF9UQkwiLAlcCi0iU0VHT0ZGMTYiLAkiR0xPQl9EQVQiLAkiSk1QX1NMT1QiLAkiUkVMQVRJVkUiLAlcCi0iMTEiLAkJIldESVNQMl8xNCIsCSJXRElTUDE5IiwgCSJISEkyMiIsCVwKLSJITE8xMCIsCQkJCQkJCVwKLSJKVU1QVEFSRyIsCSJDT05TVCIsCSJDT05TVEgiLAkiV0RJU1AxNCIsCVwKLSJXRElTUDIxIiwJXAotIk5PX1JFTE9DIgotCi0jZW5kaWYgLyogX1JFTE9DX0hfUkVBRF8gKi8KLQotLyogZW5kIG9mIHJlbG9jLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdGFiLmRlZiBiL2luY2x1ZGUvYW91dC9zdGFiLmRlZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyZDJkZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FvdXQvc3RhYi5kZWYKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyogVGFibGUgb2YgREJYIHN5bWJvbCBjb2RlcyBmb3IgdGhlIEdOVSBzeXN0ZW0uCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDE5OTgKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotDAotLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzIDIuICBUaGlzIHVzZXMgYW4gbl90eXBlIG9mIDAsIHdoaWNoIGluIGEub3V0IGZpbGVzCi0gICBvdmVybGFwcyB0aGUgTl9VTkRGIHVzZWQgZm9yIG9yZGluYXJ5IHN5bWJvbHMuICBJbiBFTEYgZmlsZXMsIHRoZQotICAgZGVidWcgaW5mb3JtYXRpb24gaXMgaW4gYSBkaWZmZXJlbnQgZmlsZSBzZWN0aW9uLCBzbyB0aGVyZSBpcyBubyBjb25mbGljdC4KLSAgIFRoaXMgc3ltYm9sJ3Mgbl92YWx1ZSBnaXZlcyB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHNlY3Rpb24gYXNzb2NpYXRlZAotICAgd2l0aCB0aGlzIGZpbGUuICBUaGUgc3ltYm9sJ3Mgbl9zdHJ4IChyZWxhdGl2ZSB0byB0aGUganVzdC11cGRhdGVkCi0gICBzdHJpbmcgc2VjdGlvbiBzdGFydCBhZGRyZXNzKSBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGZpbGUsCi0gICBlLmcuICJmb28uYyIsIHdpdGhvdXQgYW55IHBhdGggaW5mb3JtYXRpb24uICBUaGUgc3ltYm9sJ3Mgbl9kZXNjIGdpdmVzCi0gICB0aGUgY291bnQgb2YgdXBjb21pbmcgc3ltYm9scyBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWxlIChub3QgaW5jbHVkaW5nCi0gICB0aGlzIG9uZSkuICAqLwotLyogX19kZWZpbmVfc3RhYiAoTl9VTkRGLCAweDAwLCAiVU5ERiIpICAqLwotCi0vKiBHbG9iYWwgdmFyaWFibGUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LgotICAgVG8gZmluZCB0aGUgYWRkcmVzcywgbG9vayBpbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBzeW1ib2wuICAqLwotX19kZWZpbmVfc3RhYiAoTl9HU1lNLCAweDIwLCAiR1NZTSIpCi0KLS8qIEZ1bmN0aW9uIG5hbWUgZm9yIEJTRCBGb3J0cmFuLiAgT25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KLSAgIFRvIGZpbmQgdGhlIGFkZHJlc3MsIGxvb2sgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZXJuYWwgc3ltYm9sLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRk5BTUUsIDB4MjIsICJGTkFNRSIpCi0KLS8qIEZ1bmN0aW9uIG5hbWUgb3IgdGV4dC1zZWdtZW50IHZhcmlhYmxlIGZvciBDLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCi0gICBEZXNjIGlzIHN1cHBvc2VkbHkgc3RhcnRpbmcgbGluZSBudW1iZXIsIGJ1dCBHQ0MgZG9lc24ndCBzZXQgaXQKLSAgIGFuZCBEQlggc2VlbXMgbm90IHRvIG1pc3MgaXQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9GVU4sIDB4MjQsICJGVU4iKQotCi0vKiBEYXRhLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuCi0gICAiU3RhdGljIFN5bSIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9TVFNZTSwgMHgyNiwgIlNUU1lNIikKLQotLyogQlNTLXNlZ21lbnQgdmFyaWFibGUgd2l0aCBpbnRlcm5hbCBsaW5rYWdlLiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLwotX19kZWZpbmVfc3RhYiAoTl9MQ1NZTSwgMHgyOCwgIkxDU1lNIikKLQotLyogTmFtZSBvZiBtYWluIHJvdXRpbmUuICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fTUFJTiwgMHgyYSwgIk1BSU4iKQotCi0vKiBTb2xhcmlzMjogIFJlYWQtb25seSBkYXRhIHN5bWJvbHMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9ST1NZTSwgMHgyYywgIlJPU1lNIikKLQotLyogR2xvYmFsIHN5bWJvbCBpbiBQYXNjYWwuCi0gICBTdXBwb3NlZGx5IHRoZSB2YWx1ZSBpcyBpdHMgbGluZSBudW1iZXI7IEknbSBza2VwdGljYWwuICAqLwotX19kZWZpbmVfc3RhYiAoTl9QQywgMHgzMCwgIlBDIikKLQotLyogTnVtYmVyIG9mIHN5bWJvbHM6ICAwLCBmaWxlcywsZnVuY3MsbGluZXMgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OU1lNUywgMHgzMiwgIk5TWU1TIikKLQotLyogIk5vIERTVCBtYXAgZm9yIHN5bTogbmFtZSwgLDAsdHlwZSxpZ25vcmVkIiAgYWNjb3JkaW5nIHRvIFVsdHJpeCBWNC4wLiAqLwotX19kZWZpbmVfc3RhYiAoTl9OT01BUCwgMHgzNCwgIk5PTUFQIikKLQotLyogTmV3IHN0YWIgZnJvbSBTb2xhcmlzIDIuICBMaWtlIE5fU08sIGJ1dCBmb3IgdGhlIG9iamVjdCBmaWxlLiAgVHdvIGluCi0gICBhIHJvdyBwcm92aWRlIHRoZSBidWlsZCBkaXJlY3RvcnkgYW5kIHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoZSAubyBmcm9tIGl0LgotICAgU29sYXJpczIgdXNlcyB0aGlzIHRvIGF2b2lkIHB1dHRpbmcgdGhlIHN0YWJzIGluZm8gaW50byB0aGUgbGlua2VkCi0gICBleGVjdXRhYmxlOyB0aGlzIHN0YWIgZ29lcyBpbnRvIHRoZSAiLnN0YWIuaW5kZXgiIHNlY3Rpb24sIGFuZCB0aGUgZGVidWdnZXIKLSAgIHJlYWRzIHRoZSByZWFsIHN0YWJzIGRpcmVjdGx5IGZyb20gdGhlIC5vIGZpbGVzIGluc3RlYWQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9PQkosIDB4MzgsICJPQkoiKQotCi0vKiBOZXcgc3RhYiBmcm9tIFNvbGFyaXMgMi4gIE9wdGlvbnMgZm9yIHRoZSBkZWJ1Z2dlciwgcmVsYXRlZCB0byB0aGUKLSAgIHNvdXJjZSBsYW5ndWFnZSBmb3IgdGhpcyBtb2R1bGUuICBFLmcuIHdoZXRoZXIgdG8gdXNlIEFOU0kKLSAgIGludGVncmFsIHByb21vdGlvbnMgb3IgdHJhZGl0aW9uYWwgaW50ZWdyYWwgcHJvbW90aW9ucy4gICovCi1fX2RlZmluZV9zdGFiIChOX09QVCwgMHgzYywgIk9QVCIpCi0KLS8qIFJlZ2lzdGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgbnVtYmVyIG9mIHJlZ2lzdGVyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUlNZTSwgMHg0MCwgIlJTWU0iKQotCi0vKiBNb2R1bGEtMiBjb21waWxhdGlvbiB1bml0LiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCi1fX2RlZmluZV9zdGFiIChOX00yQywgMHg0MiwgIk0yQyIpCi0KLS8qIExpbmUgbnVtYmVyIGluIHRleHQgc2VnbWVudC4gIERlc2MgaXMgdGhlIGxpbmUgbnVtYmVyOwotICAgdmFsdWUgaXMgY29ycmVzcG9uZGluZyBhZGRyZXNzLiAgT24gU29sYXJpczIsIHRoZSBsaW5lIG51bWJlciBpcwotICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU0xJTkUsIDB4NDQsICJTTElORSIpCi0KLS8qIFNpbWlsYXIsIGZvciBkYXRhIHNlZ21lbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9EU0xJTkUsIDB4NDYsICJEU0xJTkUiKQotCi0vKiBTaW1pbGFyLCBmb3IgYnNzIHNlZ21lbnQuICAqLwotX19kZWZpbmVfc3RhYiAoTl9CU0xJTkUsIDB4NDgsICJCU0xJTkUiKQotCi0vKiBTdW4ncyBzb3VyY2UtY29kZSBicm93c2VyIHN0YWJzLiAgPz8gRG9uJ3Qga25vdyB3aGF0IHRoZSBmaWVsZHMgYXJlLgotICAgU3VwcG9zZWRseSB0aGUgZmllbGQgaXMgInBhdGggdG8gYXNzb2NpYXRlZCAuY2IgZmlsZSIuICBUSElTIFZBTFVFCi0gICBPVkVSTEFQUyBXSVRIIE5fQlNMSU5FISAgKi8KLV9fZGVmaW5lX3N0YWJfZHVwbGljYXRlIChOX0JST1dTLCAweDQ4LCAiQlJPV1MiKQotCi0vKiBHTlUgTW9kdWxhLTIgZGVmaW5pdGlvbiBtb2R1bGUgZGVwZW5kZW5jeS4gIFZhbHVlIGlzIHRoZSBtb2RpZmljYXRpb24gdGltZQotICAgb2YgdGhlIGRlZmluaXRpb24gZmlsZS4gIE90aGVyIGlzIG5vbi16ZXJvIGlmIGl0IGlzIGltcG9ydGVkIHdpdGggdGhlCi0gICBHTlUgTTIga2V5d29yZCAlSU5JVElBTElaRS4gIFBlcmhhcHMgTl9NMkMgY2FuIGJlIHVzZWQgaWYgdGhlcmUKLSAgIGFyZSBlbm91Z2ggZW1wdHkgZmllbGRzPyAqLwotX19kZWZpbmVfc3RhYihOX0RFRkQsIDB4NGEsICJERUZEIikKLQotLyogTmV3IGluIFNvbGFyaXMyLiAgRnVuY3Rpb24gc3RhcnQvYm9keS9lbmQgbGluZSBudW1iZXJzLiAgKi8KLV9fZGVmaW5lX3N0YWIoTl9GTElORSwgMHg0QywgIkZMSU5FIikKLQotLyogVEhFIEZPTExPV0lORyBUV08gU1RBQiBWQUxVRVMgQ09ORkxJQ1QuICBIYXBwaWx5LCBvbmUgaXMgZm9yIE1vZHVsYS0yCi0gICBhbmQgb25lIGlzIGZvciBDKysuICAgU3RpbGwsLi4uICovCi0vKiBHTlUgQysrIGV4Y2VwdGlvbiB2YXJpYWJsZS4gIE5hbWUgaXMgdmFyaWFibGUgbmFtZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0VIREVDTCwgMHg1MCwgIkVIREVDTCIpCi0vKiBNb2R1bGEyIGluZm8gImZvciBpbWMiOiAgbmFtZSwsMCwwLDAgIGFjY29yZGluZyB0byBVbHRyaXggVjQuMC4gICovCi1fX2RlZmluZV9zdGFiX2R1cGxpY2F0ZSAoTl9NT0QyLCAweDUwLCAiTU9EMiIpCi0KLS8qIEdOVSBDKysgYGNhdGNoJyBjbGF1c2UuICBWYWx1ZSBpcyBpdHMgYWRkcmVzcy4gIERlc2MgaXMgbm9uemVybyBpZgotICAgdGhpcyBlbnRyeSBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIENBVUdIVCBzdGFiIHNheWluZyB3aGF0IGV4Y2VwdGlvbgotICAgd2FzIGNhdWdodC4gIE11bHRpcGxlIENBVUdIVCBzdGFicyBtZWFucyB0aGF0IG11bHRpcGxlIGV4Y2VwdGlvbnMKLSAgIGNhbiBiZSBjYXVnaHQgaGVyZS4gIElmIERlc2MgaXMgMCwgaXQgbWVhbnMgYWxsIGV4Y2VwdGlvbnMgYXJlIGNhdWdodAotICAgaGVyZS4gICovCi1fX2RlZmluZV9zdGFiIChOX0NBVENILCAweDU0LCAiQ0FUQ0giKQotCi0vKiBTdHJ1Y3R1cmUgb3IgdW5pb24gZWxlbWVudC4gIFZhbHVlIGlzIG9mZnNldCBpbiB0aGUgc3RydWN0dXJlLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU1NZTSwgMHg2MCwgIlNTWU0iKQotCi0vKiBTb2xhcmlzMjogIExhc3Qgc3RhYiBlbWl0dGVkIGZvciBtb2R1bGUuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FTkRNLCAweDYyLCAiRU5ETSIpCi0KLS8qIE5hbWUgb2YgbWFpbiBzb3VyY2UgZmlsZS4KLSAgIFZhbHVlIGlzIHN0YXJ0aW5nIHRleHQgYWRkcmVzcyBvZiB0aGUgY29tcGlsYXRpb24uCi0gICBJZiBtdWx0aXBsZSBOX1NPJ3MgYXBwZWFyLCB0aGUgZmlyc3QgdG8gY29udGFpbiBhIHRyYWlsaW5nIC8gaXMgdGhlCi0gICBjb21waWxhdGlvbiBkaXJlY3RvcnkuICBUaGUgZmlyc3QgdG8gbm90IGNvbnRhaW4gYSB0cmFpbGluZyAvIGlzIHRoZQotICAgc291cmNlIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gdGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeS4gIE90aGVycyAocGVyaGFwcwotICAgcmVzdWx0aW5nIGZyb20gY2Zyb250KSBhcmUgaWdub3JlZC4KLSAgIE9uIFNvbGFyaXMyLCB2YWx1ZSBpcyB1bmRlZmluZWQsIGJ1dCBkZXNjIGlzIGEgc291cmNlLWxhbmd1YWdlIGNvZGUuICAqLwotCi1fX2RlZmluZV9zdGFiIChOX1NPLCAweDY0LCAiU08iKQotCi0vKiBTdW5Qcm8gRjc3OiAgTmFtZSBvZiBhbGlhcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0FMSUFTLCAweDZjLCAiQUxJQVMiKQotCi0vKiBBdXRvbWF0aWMgdmFyaWFibGUgaW4gdGhlIHN0YWNrLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gZnJhbWUgcG9pbnRlci4KLSAgIEFsc28gdXNlZCBmb3IgdHlwZSBkZXNjcmlwdGlvbnMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9MU1lNLCAweDgwLCAiTFNZTSIpCi0KLS8qIEJlZ2lubmluZyBvZiBhbiBpbmNsdWRlIGZpbGUuICBPbmx5IFN1biB1c2VzIHRoaXMuCi0gICBJbiBhbiBvYmplY3QgZmlsZSwgb25seSB0aGUgbmFtZSBpcyBzaWduaWZpY2FudC4KLSAgIFRoZSBTdW4gbGlua2VyIHB1dHMgZGF0YSBpbnRvIHNvbWUgb2YgdGhlIG90aGVyIGZpZWxkcy4gICovCi1fX2RlZmluZV9zdGFiIChOX0JJTkNMLCAweDgyLCAiQklOQ0wiKQotCi0vKiBOYW1lIG9mIHN1Yi1zb3VyY2UgZmlsZSAoI2luY2x1ZGUgZmlsZSkuCi0gICBWYWx1ZSBpcyBzdGFydGluZyB0ZXh0IGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGF0aW9uLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fU09MLCAweDg0LCAiU09MIikKLQotLyogUGFyYW1ldGVyIHZhcmlhYmxlLiAgVmFsdWUgaXMgb2Zmc2V0IGZyb20gYXJndW1lbnQgcG9pbnRlci4KLSAgIChPbiBtb3N0IG1hY2hpbmVzIHRoZSBhcmd1bWVudCBwb2ludGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmcmFtZSBwb2ludGVyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fUFNZTSwgMHhhMCwgIlBTWU0iKQotCi0vKiBFbmQgb2YgYW4gaW5jbHVkZSBmaWxlLiAgTm8gbmFtZS4KLSAgIFRoaXMgYW5kIE5fQklOQ0wgYWN0IGFzIGJyYWNrZXRzIGFyb3VuZCB0aGUgZmlsZSdzIG91dHB1dC4KLSAgIEluIGFuIG9iamVjdCBmaWxlLCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkYXRhIGluIHRoaXMgZW50cnkuCi0gICBUaGUgU3VuIGxpbmtlciBwdXRzIGRhdGEgaW50byBzb21lIG9mIHRoZSBmaWVsZHMuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FSU5DTCwgMHhhMiwgIkVJTkNMIikKLQotLyogQWx0ZXJuYXRlIGVudHJ5IHBvaW50LiAgVmFsdWUgaXMgaXRzIGFkZHJlc3MuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FTlRSWSwgMHhhNCwgIkVOVFJZIikKLQotLyogQmVnaW5uaW5nIG9mIGxleGljYWwgYmxvY2suCi0gICBUaGUgZGVzYyBpcyB0aGUgbmVzdGluZyBsZXZlbCBpbiBsZXhpY2FsIGJsb2Nrcy4KLSAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgc3RhcnQgb2YgdGhlIHRleHQgZm9yIHRoZSBibG9jay4KLSAgIFRoZSB2YXJpYWJsZXMgZGVjbGFyZWQgaW5zaWRlIHRoZSBibG9jayAqcHJlY2VkZSogdGhlIE5fTEJSQUMgc3ltYm9sLgotICAgT24gU29sYXJpczIsIHRoZSB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uICAqLwotX19kZWZpbmVfc3RhYiAoTl9MQlJBQywgMHhjMCwgIkxCUkFDIikKLQotLyogUGxhY2UgaG9sZGVyIGZvciBkZWxldGVkIGluY2x1ZGUgZmlsZS4gIFJlcGxhY2VzIGEgTl9CSU5DTCBhbmQgZXZlcnl0aGluZwotICAgdXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgTl9FSU5DTC4gIFRoZSBTdW4gbGlua2VyIGdlbmVyYXRlcyB0aGVzZSB3aGVuCi0gICBpdCBmaW5kcyBtdWx0aXBsZSBpZGVudGljYWwgY29waWVzIG9mIHRoZSBzeW1ib2xzIGZyb20gYW4gaW5jbHVkZSBmaWxlLgotICAgVGhpcyBhcHBlYXJzIG9ubHkgaW4gb3V0cHV0IGZyb20gdGhlIFN1biBsaW5rZXIuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FWENMLCAweGMyLCAiRVhDTCIpCi0KLS8qIE1vZHVsYS0yIHNjb3BlIGluZm9ybWF0aW9uLiAgQ2FuIHNvbWVvbmUgc2F5IHdoYXQgaW5mbyBpdCBjb250YWlucz8gICovCi1fX2RlZmluZV9zdGFiIChOX1NDT1BFLCAweGM0LCAiU0NPUEUiKQotCi0vKiBFbmQgb2YgYSBsZXhpY2FsIGJsb2NrLiAgRGVzYyBtYXRjaGVzIHRoZSBOX0xCUkFDJ3MgZGVzYy4KLSAgIFRoZSB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSB0ZXh0IGZvciB0aGUgYmxvY2suCi0gICBPbiBTb2xhcmlzMiwgdGhlIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4gICovCi1fX2RlZmluZV9zdGFiIChOX1JCUkFDLCAweGUwLCAiUkJSQUMiKQotCi0vKiBCZWdpbiBuYW1lZCBjb21tb24gYmxvY2suICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50LiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fQkNPTU0sIDB4ZTIsICJCQ09NTSIpCi0KLS8qIEVuZCBuYW1lZCBjb21tb24gYmxvY2suICBPbmx5IHRoZSBuYW1lIGlzIHNpZ25pZmljYW50Ci0gICAoYW5kIGl0IHNob3VsZCBtYXRjaCB0aGUgTl9CQ09NTSkuICAqLwotX19kZWZpbmVfc3RhYiAoTl9FQ09NTSwgMHhlNCwgIkVDT01NIikKLQotLyogTWVtYmVyIG9mIGEgY29tbW9uIGJsb2NrOyB2YWx1ZSBpcyBvZmZzZXQgd2l0aGluIHRoZSBjb21tb24gYmxvY2suCi0gICBUaGlzIHNob3VsZCBvY2N1ciB3aXRoaW4gYSBCQ09NTS9FQ09NTSBwYWlyLiAgKi8KLV9fZGVmaW5lX3N0YWIgKE5fRUNPTUwsIDB4ZTgsICJFQ09NTCIpCi0KLS8qIFNvbGFyaXMyOiBQYXNjYWwgIndpdGgiIHN0YXRlbWVudDogdHlwZSwsMCwwLG9mZnNldCAqLwotX19kZWZpbmVfc3RhYiAoTl9XSVRILCAweGVhLCAiV0lUSCIpCi0KLS8qIFRoZXNlIFNUQUIncyBhcmUgdXNlZCBvbiBHb3VsZCBzeXN0ZW1zIGZvciBOb24tQmFzZSByZWdpc3RlciBzeW1ib2xzCi0gICBvciBzb21ldGhpbmcgbGlrZSB0aGF0LiAgRklYTUUuICBJIGhhdmUgYXNzaWduZWQgdGhlIHZhbHVlcyBhdCByYW5kb20KLSAgIHNpbmNlIEkgZG9uJ3QgaGF2ZSBhIEdvdWxkIGhlcmUuICBGaXh1cHMgZnJvbSBHb3VsZCBmb2xrIHdlbGNvbWUuLi4gKi8KLV9fZGVmaW5lX3N0YWIgKE5fTkJURVhULCAweEYwLCAiTkJURVhUIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJEQVRBLCAweEYyLCAiTkJEQVRBIikKLV9fZGVmaW5lX3N0YWIgKE5fTkJCU1MsICAweEY0LCAiTkJCU1MiKQotX19kZWZpbmVfc3RhYiAoTl9OQlNUUywgIDB4RjYsICJOQlNUUyIpCi1fX2RlZmluZV9zdGFiIChOX05CTENTLCAgMHhGOCwgIk5CTENTIikKLQotLyogU2Vjb25kIHN5bWJvbCBlbnRyeSBjb250YWluaW5nIGEgbGVuZ3RoLXZhbHVlIGZvciB0aGUgcHJlY2VkaW5nIGVudHJ5LgotICAgVGhlIHZhbHVlIGlzIHRoZSBsZW5ndGguICAqLwotX19kZWZpbmVfc3RhYiAoTl9MRU5HLCAweGZlLCAiTEVORyIpCi0MCi0vKiBUaGUgYWJvdmUgaW5mb3JtYXRpb24sIGluIG1hdHJpeCBmb3JtYXQuCi0KLQkJCVNUQUIgTUFUUklYCi0JX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwotCXwgMDAgLSAxRiBhcmUgbm90IGRieCBzdGFiIHN5bWJvbHMJCXwKLQl8IEluIG1vc3QgY2FzZXMsIHRoZSBsb3cgYml0IGlzIHRoZSBFWFRlcm5hbCBiaXR8Ci0KLQl8IDAwIFVOREVGICB8IDAyIEFCUwl8IDA0IFRFWFQgICB8IDA2IERBVEEJfAotCXwgMDEgIHxFWFQgIHwgMDMgIHxFWFQJfCAwNSAgfEVYVCAgfCAwNyAgfEVYVAl8Ci0KLQl8IDA4IEJTUyAgICB8IDBBIElORFIJfCAwQyBGTl9TRVEgfCAwRSBXRUFLQQl8Ci0JfCAwOSAgfEVYVCAgfCAwQiAJfCAwRCBXRUFLVSAgfCAwRiBXRUFLVAl8Ci0KLQl8IDEwIFdFQUtEICB8IDEyIENPTU0JfCAxNCBTRVRBICAgfCAxNiBTRVRUCXwKLQl8IDExIFdFQUtCICB8IDEzCXwgMTUgCSAgICB8IDE3CXwKLQotCXwgMTggU0VURCAgIHwgMUEgU0VUQgl8IDFDIFNFVFYgICB8IDFFIFdBUk5JTkd8Ci0JfCAxOQkgICAgfCAxQgl8IDFEIAkgICAgfCAxRiBGTgl8Ci0KLQl8X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198Ci0JfCBEZWJ1ZyBlbnRyaWVzIHdpdGggYml0IDAxIHNldCBhcmUgdW51c2VkLgl8Ci0JfCAyMCBHU1lNICAgfCAyMiBGTkFNRQl8IDI0IEZVTiAgICB8IDI2IFNUU1lNCXwKLQl8IDI4IExDU1lNICB8IDJBIE1BSU4JfCAyQyBST1NZTSAgfCAyRQl8Ci0JfCAzMCBQQwkgICAgfCAzMiBOU1lNUwl8IDM0IE5PTUFQICB8IDM2CXwKLQl8IDM4IE9CSiAgICB8IDNBCXwgM0MgT1BUICAgIHwgM0UJfAotCXwgNDAgUlNZTSAgIHwgNDIgTTJDCXwgNDQgU0xJTkUgIHwgNDYgRFNMSU5FIHwKLQl8IDQ4IEJTTElORSp8IDRBIERFRkQJfCA0QyBGTElORSAgfCA0RQl8Ci0JfCA1MCBFSERFQ0wqfCA1Mgl8IDU0IENBVENIICB8IDU2ICAgICAgICB8Ci0JfCA1OCAgICAgICAgfCA1QSAgICAgICAgfCA1QyAgICAgICAgfCA1RQl8Ci0JfCA2MCBTU1lNICAgfCA2MiBFTkRNCXwgNjQgU08JICAgIHwgNjYgCXwKLQl8IDY4IAkgICAgfCA2QQl8IDZDIEFMSUFTICB8IDZFCXwKLQl8IDcwCSAgICB8IDcyCXwgNzQJICAgIHwgNzYJfAotCXwgNzgJICAgIHwgN0EJfCA3QwkgICAgfCA3RQl8Ci0JfCA4MCBMU1lNICAgfCA4MiBCSU5DTAl8IDg0IFNPTCAgICB8IDg2CXwKLQl8IDg4CSAgICB8IDhBCXwgOEMJICAgIHwgOEUJfAotCXwgOTAJICAgIHwgOTIJfCA5NAkgICAgfCA5Ngl8Ci0JfCA5OAkgICAgfCA5QQl8IDlDCSAgICB8IDlFCXwKLQl8IEEwIFBTWU0gICB8IEEyIEVJTkNMCXwgQTQgRU5UUlkgIHwgQTYJfAotCXwgQTgJICAgIHwgQUEJfCBBQwkgICAgfCBBRQl8Ci0JfCBCMAkgICAgfCBCMgl8IEI0CSAgICB8IEI2CXwKLQl8IEI4CSAgICB8IEJBCXwgQkMJICAgIHwgQkUJfAotCXwgQzAgTEJSQUMgIHwgQzIgRVhDTAl8IEM0IFNDT1BFICB8IEM2CXwKLQl8IEM4CSAgICB8IENBCXwgQ0MJICAgIHwgQ0UJfAotCXwgRDAJICAgIHwgRDIJfCBENAkgICAgfCBENgl8Ci0JfCBEOAkgICAgfCBEQQl8IERDCSAgICB8IERFCXwKLQl8IEUwIFJCUkFDICB8IEUyIEJDT01NCXwgRTQgRUNPTU0gIHwgRTYJfAotCXwgRTggRUNPTUwgIHwgRUEgV0lUSAl8IEVDCSAgICB8IEVFCXwKLQl8IEYwCSAgICB8IEYyCXwgRjQJICAgIHwgRjYJfAotCXwgRjgJICAgIHwgRkEJfCBGQwkgICAgfCBGRSBMRU5HCXwKLQkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiA1MCBFSERFQ0wgaXMgYWxzbyBNT0QyLgotICogNDggQlNMSU5FIGlzIGFsc28gQlJPV1MuCi0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdGFiX2dudS5oIGIvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMThlMTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hb3V0L3N0YWJfZ251LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jaWZuZGVmIF9fR05VX1NUQUJfXwotCi0vKiBJbmRpY2F0ZSB0aGUgR05VIHN0YWIuaCBpcyBpbiB1c2UuICAqLwotCi0jZGVmaW5lIF9fR05VX1NUQUJfXwotCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWIoTkFNRSwgQ09ERSwgU1RSSU5HKSBOQU1FPUNPREUsCi0jZGVmaW5lIF9fZGVmaW5lX3N0YWJfZHVwbGljYXRlKE5BTUUsIENPREUsIFNUUklORykgTkFNRT1DT0RFLAotCi1lbnVtIF9fc3RhYl9kZWJ1Z19jb2RlCi17Ci0jaW5jbHVkZSAiYW91dC9zdGFiLmRlZiIKLUxBU1RfVU5VU0VEX1NUQUJfQ09ERQotfTsKLQotI3VuZGVmIF9fZGVmaW5lX3N0YWIKLQotLyogRGVmaW5pdGlvbnMgb2YgImRlc2MiIGZpZWxkIGZvciBOX1NPIHN0YWJzIGluIFNvbGFyaXMyLiAgKi8KLQotI2RlZmluZQlOX1NPX0FTCQkxCi0jZGVmaW5lCU5fU09fQwkJMgotI2RlZmluZQlOX1NPX0FOU0lfQwkzCi0jZGVmaW5lCU5fU09fQ0MJCTQJLyogQysrICovCi0jZGVmaW5lCU5fU09fRk9SVFJBTgk1Ci0jZGVmaW5lCU5fU09fUEFTQ0FMCTYKLQotLyogU29sYXJpczI6IEZsb2F0aW5nIHBvaW50IHR5cGUgdmFsdWVzIGluIGJhc2ljIHR5cGVzLiAgKi8KLQotI2RlZmluZQlORl9OT05FCQkwCi0jZGVmaW5lCU5GX1NJTkdMRQkxCS8qIElFRUUgMzItYml0ICovCi0jZGVmaW5lCU5GX0RPVUJMRQkyCS8qIElFRUUgNjQtYml0ICovCi0jZGVmaW5lCU5GX0NPTVBMRVgJMwkvKiBGb3J0cmFuIGNvbXBsZXggKi8KLSNkZWZpbmUJTkZfQ09NUExFWDE2CTQJLyogRm9ydHJhbiBkb3VibGUgY29tcGxleCAqLwotI2RlZmluZQlORl9DT01QTEVYMzIJNQkvKiBGb3J0cmFuIGNvbXBsZXgqMTYgKi8KLSNkZWZpbmUJTkZfTERPVUJMRQk2CS8qIExvbmcgZG91YmxlICh3aGF0ZXZlciB0aGF0IGlzKSAqLwotCi0jZW5kaWYgLyogX19HTlVfU1RBQl8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYW91dC9zdW40LmggYi9pbmNsdWRlL2FvdXQvc3VuNC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDJhMGRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYW91dC9zdW40LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyogU1BBUkMtc3BlY2lmaWMgdmFsdWVzIGZvciBhLm91dCBmaWxlcyAqLwotCi0vKiBTb21lIHN5c3RlbXMsIGUuZy4sIEFJWCwgbWF5IGhhdmUgZGVmaW5lZCB0aGlzIGluIGhlYWRlciBmaWxlcyBhbHJlYWR5Ci0gICBpbmNsdWRlZC4gICovCi0jdW5kZWYgVEFSR0VUX1BBR0VfU0laRQotI2RlZmluZSBUQVJHRVRfUEFHRV9TSVpFCTB4MjAwMAkJLyogOEsuICBha2EgTkJQRyBpbiA8c3lzL3BhcmFtLmg+ICovCi0vKiBOb3RlIHRoYXQgc29tZSBTUEFSQ3MgaGF2ZSA0SyBwYWdlcywgc29tZSA4Sywgc29tZSBvdGhlcnMuICAqLwotCi0jZGVmaW5lIFNFR19TSVpFX1NQQVJDCVRBUkdFVF9QQUdFX1NJWkUKLSNkZWZpbmUJU0VHX1NJWkVfU1VOMwkweDIwMDAwCQkvKiBSZXNvbHV0aW9uIG9mIHIvdyBwcm90ZWN0aW9uIGh3ICovCi0KLSNkZWZpbmUgVEVYVF9TVEFSVF9BRERSCVRBUkdFVF9QQUdFX1NJWkUJLyogTG9jYXRpb24gMCBpcyBub3QgYWNjZXNzaWJsZSAqLwotI2RlZmluZSBOX0hFQURFUl9JTl9URVhUKHgpIDEKLQotLyogTm9uLWRlZmF1bHQgZGVmaW5pdGlvbnMgb2YgdGhlIGFjY2Vzc29yIG1hY3Jvcy4uLiAqLwotCi0vKiBTZWdtZW50IHNpemUgdmFyaWVzIG9uIFN1bi0zIHZlcnN1cyBTdW4tNC4gICovCi0KLSNkZWZpbmUgTl9TRUdTSVpFKHgpCShOX01BQ0hUWVBFKHgpID09IE1fU1BBUkM/CVNFR19TSVpFX1NQQVJDOglcCi0JCQkgTl9NQUNIVFlQRSh4KSA9PSBNXzY4MDIwPwlTRUdfU0laRV9TVU4zOglcCi0JCQkvKiBHdWVzcz8gKi8JCQlUQVJHRVRfUEFHRV9TSVpFKQotCi0vKiBWaXJ0dWFsIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGZyb20gdGhlIGEub3V0IGZpbGUuICBGb3IgT01BR0lDLAotICAgKGFsbW9zdCBhbHdheXMgInVubGlua2VkIC5vJ3MiIHRoZXNlIGRheXMpLCBzaG91bGQgYmUgemVyby4KLSAgIFN1biBhZGRlZCBhIGtsdWRnZSBzbyB0aGF0IHNoYXJlZCBsaWJyYXJpZXMgbGlua2VkIFpNQUdJQyBnZXQKLSAgIGFuIGFkZHJlc3Mgb2YgemVybyBpZiBhX2VudHJ5ICghISEpIGlzIGxvd2VyIHRoYW4gdGhlIG90aGVyd2lzZQotICAgZXhwZWN0ZWQgdGV4dCBhZGRyZXNzLiAgVGhlc2Uga2x1ZGdlcyBoYXZlIGdvdHRhIGdvIQotICAgRm9yIGxpbmtlZCBmaWxlcywgc2hvdWxkIHJlZmxlY3QgcmVhbGl0eSBpZiB3ZSBrbm93IGl0LiAgKi8KLQotLyogVGhpcyBkaWZmZXJzIGZyb20gdGhlIHZlcnNpb24gaW4gYW91dDY0LmggKHdoaWNoIHdlIG92ZXJyaWRlIGJ5IGRlZmluaW5nCi0gICBpdCBoZXJlKSBvbmx5IGZvciBOTUFHSUMgKHdlIHJldHVybiBURVhUX1NUQVJUX0FERFIrRVhFQ19CWVRFU19TSVpFOwotICAgdGhleSByZXR1cm4gMCkuICAqLwotCi0jZGVmaW5lIE5fVFhUQUREUih4KSBcCi0gICAgKE5fTUFHSUMoeCk9PU9NQUdJQz8gMCBcCi0gICAgIDogKE5fTUFHSUMoeCkgPT0gWk1BR0lDICYmICh4KS5hX2VudHJ5IDwgVEVYVF9TVEFSVF9BRERSKT8gMCBcCi0gICAgIDogVEVYVF9TVEFSVF9BRERSK0VYRUNfQllURVNfU0laRSkKLQotLyogV2hlbiBhIGZpbGUgaXMgbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSBvbiBTdW5PUyA0LCB0aGUKLSAgIGR5bmFtaWMgYml0IGluIHRoZSBleGVjIGhlYWRlciBpcyBzZXQsIGFuZCB0aGUgZmlyc3Qgc3ltYm9sIGluIHRoZQotICAgc3ltYm9sIHRhYmxlIGlzIF9fRFlOQU1JQy4gIEl0cyB2YWx1ZSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIGZvbGxvd2luZyBzdHJ1Y3R1cmUuICAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3VuNF9keW5hbWljCi17Ci0gIC8qIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgc3RydWN0dXJlLiAgU3VuT1MgNC4xLnggY3JlYXRlcyBmaWxlcwotICAgICB3aXRoIHZlcnNpb24gbnVtYmVyIDMsIHdoaWNoIGlzIHdoYXQgdGhpcyBzdHJ1Y3R1cmUgaXMgYmFzZWQgb24uCi0gICAgIEFjY29yZGluZyB0byBnZGIsIHZlcnNpb24gMiBpcyBzaW1pbGFyLiAgSSBiZWxpZXZlIHRoYXQgdmVyc2lvbiAyCi0gICAgIHVzZWQgYSBkaWZmZXJlbnQgdHlwZSBvZiBwcm9jZWR1cmUgbGlua2FnZSB0YWJsZSwgYW5kIHRoZXJlIG1heQotICAgICBoYXZlIGJlZW4gb3RoZXIgZGlmZmVyZW5jZXMuICAqLwotICBiZmRfYnl0ZSBsZF92ZXJzaW9uWzRdOwotICAvKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIGEgMjggYnl0ZSBzdHJ1Y3R1cmUgdXNlZCBpbiBkZWJ1Z2dpbmcuCi0gICAgIFRoZSBjb250ZW50cyBhcmUgZmlsbGVkIGluIGF0IHJ1biB0aW1lIGJ5IGxkLnNvLiAgKi8KLSAgYmZkX2J5dGUgbGRkWzRdOwotICAvKiBUaGUgdmlydHVhbCBhZGRyZXNzIG9mIGFub3RoZXIgc3RydWN0dXJlIHdpdGggaW5mb3JtYXRpb24gYWJvdXQKLSAgICAgaG93IHRvIHJlbG9jYXRlIHRoZSBleGVjdXRhYmxlIGF0IHJ1biB0aW1lLiAgKi8KLSAgYmZkX2J5dGUgbGRbNF07Ci19OwotCi0vKiBUaGUgc2l6ZSBvZiB0aGUgZGVidWdnaW5nIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBkZWJ1Z2dlcgotICAgZmllbGQgb2YgX19EWU5BTUlDLiAgKi8KLSNkZWZpbmUgRVhURVJOQUxfU1VONF9EWU5BTUlDX0RFQlVHR0VSX1NJWkUgKDI0KQotCi0vKiBUaGUgc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdGhlIGxpbmtlciBmaWVsZCBvZiBfX0RZTkFNSUMuICBBcyBmYXIKLSAgIGFzIEkgY2FuIHRlbGwsIG1vc3Qgb2YgdGhlIGFkZHJlc3NlcyBpbiB0aGlzIHN0cnVjdHVyZSBhcmUgb2Zmc2V0cwotICAgd2l0aGluIHRoZSBmaWxlLCBidXQgc29tZSBhcmUgYWN0dWFsbHkgdmlydHVhbCBhZGRyZXNzZXMuICAqLwotCi1zdHJ1Y3QgaW50ZXJuYWxfc3VuNF9keW5hbWljX2xpbmsKLXsKLSAgLyogTGlua2VkIGxpc3Qgb2YgbG9hZGVkIG9iamVjdHMuICBUaGlzIGlzIGZpbGxlZCBpbiBhdCBydW50aW1lIGJ5Ci0gICAgIGxkLnNvIGFuZCBwcm9iYWJseSBieSBkbG9wZW4uICAqLwotICB1bnNpZ25lZCBsb25nIGxkX2xvYWRlZDsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgbGlzdCBvZiBuYW1lcyBvZiBzaGFyZWQgb2JqZWN0cyB3aGljaCBtdXN0IGJlCi0gICAgIGluY2x1ZGVkIGF0IHJ1bnRpbWUuICBFYWNoIGVudHJ5IGluIHRoZSBsaXN0IGlzIDE2IGJ5dGVzOiB0aGUgNAotICAgICBieXRlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZyBuYW1pbmcgdGhlIG9iamVjdCAoZS5nLiwgZm9yIC1sYyB0aGlzCi0gICAgIGlzICJjIik7IDQgYnl0ZXMgb2YgZmxhZ3MtLXRoZSBoaWdoIGJpdCBpcyB3aGV0aGVyIHRvIHNlYXJjaCBmb3IKLSAgICAgdGhlIG9iamVjdCB1c2luZyB0aGUgbGlicmFyeSBwYXRoOyB0aGUgMiBieXRlIG1ham9yIHZlcnNpb24KLSAgICAgbnVtYmVyOyB0aGUgMiBieXRlIG1pbm9yIHZlcnNpb24gbnVtYmVyOyB0aGUgNCBieXRlIGFkZHJlc3Mgb2YKLSAgICAgdGhlIG5leHQgZW50cnkgaW4gdGhlIGxpc3QgKHplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBlbnRyeSkuICBUaGUKLSAgICAgdmVyc2lvbiBudW1iZXJzIHNlZW0gdG8gb25seSBiZSBub24temVybyB3aGVuIGRvaW5nIGxpYnJhcnkKLSAgICAgc2VhcmNoaW5nLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9uZWVkOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBwYXRoIHRvIHNlYXJjaCBmb3IgdGhlIHNoYXJlZCBvYmplY3RzIHdoaWNoCi0gICAgIG11c3QgYmUgaW5jbHVkZWQuICBUaGlzIHBvaW50cyB0byBhIHN0cmluZyBpbiBQQVRIIGZvcm1hdCB3aGljaAotICAgICBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgLUwgYXJndW1lbnRzIHRvIHRoZSBsaW5rZXIuICBBY2NvcmRpbmcgdG8KLSAgICAgdGhlIG1hbiBwYWdlLCBsZC5zbyBpbXBsaWNpdGx5IGFkZHMgJHtMRF9MSUJSQVJZX1BBVEh9IHRvIHRoZQotICAgICBiZWdpbm5pbmcgb2YgdGhpcyBzdHJpbmcgYW5kIC9saWI6L3Vzci9saWI6L3Vzci9sb2NhbC9saWIgdG8gdGhlCi0gICAgIGVuZC4gIFRoZSBzdHJpbmcgaXMgdGVybWluYXRlZCBieSBhIG51bGwgYnl0ZS4gIFRoaXMgZmllbGQgaXMKLSAgICAgemVybyBpZiB0aGVyZSBpcyBubyBhZGRpdGlvbmFsIHBhdGguICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3J1bGVzOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgVGhpcyBhcHBlYXJzIHRvIGJlIGEKLSAgICAgdmlydHVhbCBhZGRyZXNzLCBub3QgYSBmaWxlIG9mZnNldC4gIFRoZSBmaXJzdCBlbnRyeSBpbiB0aGUKLSAgICAgZ2xvYmFsIG9mZnNldCB0YWJsZSBzZWVtcyB0byBiZSB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZQotICAgICBzdW40X2R5bmFtaWMgc3RydWN0dXJlICh0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgX19EWU5BTUlDIHN5bWJvbCkuCi0gICAgIFRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlIGlzIHVzZWQgZm9yIFBJQyBjb2RlIHRvIGhvbGQgdGhlCi0gICAgIGFkZHJlc3NlcyBvZiB2YXJpYWJsZXMuICBBIGR5bmFtaWNhbGx5IGxpbmtlZCBmaWxlIHdoaWNoIGRvZXMgbm90Ci0gICAgIGl0c2VsZiBjb250YWluIFBJQyBjb2RlIGhhcyBhIGZvdXIgYnl0ZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9nb3Q7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgVGhpcyBhcHBlYXJzIHRvIGJlIGEKLSAgICAgdmlydHVhbCBhZGRyZXNzLCBub3QgYSBmaWxlIG9mZnNldC4KLQotICAgICBPbiBhIFNQQVJDLCB0aGUgdGFibGUgaXMgY29tcG9zZWQgb2YgMTIgYnl0ZSBlbnRyaWVzLCBlYWNoIG9mCi0gICAgIHdoaWNoIGNvbnNpc3RzIG9mIHRocmVlIGluc3RydWN0aW9ucy4gIFRoZSBmaXJzdCBlbnRyeSBpcwotICAgICAgICAgc2V0aGkgJWhpKDApLCVnMQotCSBqbXAgJWcxCi0JIG5vcAotICAgICBUaGVzZSBpbnN0cnVjdGlvbnMgYXJlIGNoYW5nZWQgYnkgbGQuc28gaW50byBhIGp1bXAgZGlyZWN0bHkgaW50bwotICAgICBsZC5zbyBpdHNlbGYuICBFYWNoIHN1YnNlcXVlbnQgZW50cnkgaXMKLSAgICAgICAgIHNhdmUgJXNwLCAtOTYsICVzcAotCSBjYWxsIDxhZGRyZXNzIG9mIGZpcnN0IGVudHJ5IGluIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlPgotCSA8cmVsb2NfbnVtYmVyIHwgMHgwMTAwMDAwMD4KLSAgICAgVGhlIHJlbG9jX251bWJlciBpcyB0aGUgbnVtYmVyIG9mIHRoZSByZWxvYyB0byB1c2UgdG8gcmVzb2x2ZQotICAgICB0aGlzIGVudHJ5LiAgVGhlIHJlbG9jIHdpbGwgYmUgYSBKTVBfU0xPVCByZWxvYyBhZ2FpbnN0IHNvbWUKLSAgICAgc3ltYm9sIHRoYXQgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBvYmplY3QgZmlsZSBidXQgc2hvdWxkIGJlCi0gICAgIGRlZmluZWQgaW4gYSBzaGFyZWQgb2JqZWN0IChpZiBpdCBpcyBub3QsIGxkLnNvIHdpbGwgcmVwb3J0IGEKLSAgICAgcnVudGltZSBlcnJvciBhbmQgZXhpdCkuICBUaGUgY29uc3RhbnQgMHgwMTAwMDAwMDAgdHVybnMgdGhlCi0gICAgIHJlbG9jIG51bWJlciBpbnRvIGEgc2V0aGkgb2YgJWcwLCB3aGljaCBkb2VzIG5vdGhpbmcgc2luY2UgJWcwIGlzCi0gICAgIGhhcmR3aXJlZCB0byB6ZXJvLgotCi0gICAgIFdoZW4gb25lIG9mIHRoZXNlIGVudHJpZXMgaXMgZXhlY3V0ZWQsIGl0IHdpbmRzIHVwIGNhbGxpbmcgaW50bwotICAgICBsZC5zby4gIGxkLnNvIGxvb2tzIGF0IHRoZSByZWxvYyBudW1iZXIsIGF2YWlsYWJsZSB2aWEgdGhlIHJldHVybgotICAgICBhZGRyZXNzLCB0byBkZXRlcm1pbmUgd2hpY2ggZW50cnkgdGhpcyBpcy4gIEl0IHRoZW4gbG9va3MgYXQgdGhlCi0gICAgIHJlbG9jIGFuZCBwYXRjaGVzIHVwIHRoZSBlbnRyeSBpbiB0aGUgdGFibGUgaW50byBhIHNldGhpIGFuZCBqbXAKLSAgICAgdG8gdGhlIHJlYWwgYWRkcmVzcyBmb2xsb3dlZCBieSBhIG5vcC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmVsb2MKLSAgICAgbG9va3VwIG9ubHkgaGFzIHRvIGhhcHBlbiBvbmNlLCBhbmQgaXQgYWxzbyBtZWFucyB0aGF0IHRoZQotICAgICByZWxvY2F0aW9uIG9ubHkgbmVlZHMgdG8gYmUgZG9uZSBpZiB0aGUgZnVuY3Rpb24gaXMgYWN0dWFsbHkKLSAgICAgY2FsbGVkLiAgVGhlIHJlbG9jYXRpb24gaXMgZXhwZW5zaXZlIGJlY2F1c2UgbGQuc28gbXVzdCBsb29rIHVwCi0gICAgIHRoZSBzeW1ib2wgYnkgbmFtZS4KLQotICAgICBUaGUgc2l6ZSBvZiB0aGUgcHJvY2VkdXJlIGxpbmthZ2UgdGFibGUgaXMgZ2l2ZW4gYnkgdGhlIGxkX3BsdF9zegotICAgICBmaWVsZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfcGx0OwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY3MuICBUaGVzZSBhcmUgaW4gdGhlIHNhbWUgZm9ybWF0IGFzCi0gICAgIG9yZGluYXJ5IHJlbG9jcy4gIFN5bWJvbCBpbmRleCBudW1iZXJzIHJlZmVyIHRvIHRoZSBzeW1ib2xzCi0gICAgIHBvaW50ZWQgdG8gYnkgbGRfc3RhYi4gIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGRldGVybWluZSB0aGUKLSAgICAgbnVtYmVyIG9mIHJlbG9jcyBpcyB0byBhc3N1bWUgdGhhdCBhbGwgdGhlIGJ5dGVzIGZyb20gbGRfcmVsIHRvCi0gICAgIGxkX2hhc2ggY29udGFpbiByZWxvYyBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9yZWw7Ci0KLSAgLyogVGhlIGFkZHJlc3Mgb2YgYSBoYXNoIHRhYmxlIG9mIHN5bWJvbHMuICBUaGUgaGFzaCB0YWJsZSBoYXMKLSAgICAgcm91Z2hseSB0aGUgc2FtZSBudW1iZXIgb2YgZW50cmllcyBhcyB0aGVyZSBhcmUgZHluYW1pYyBzeW1ib2xzOwotICAgICBJIHRoaW5rIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlIGV4YWN0IHNpemUgaXMgdG8gYXNzdW1lIHRoYXQKLSAgICAgZXZlcnkgYnl0ZSBmcm9tIGxkX2hhc2ggdG8gbGRfc3RhYiBpcyBkZXZvdGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotCi0gICAgIEVhY2ggZW50cnkgaW4gdGhlIGhhc2ggdGFibGUgaXMgZWlnaHQgYnl0ZXMuICBUaGUgZmlyc3QgZm91cgotICAgICBieXRlcyBhcmUgYSBzeW1ib2wgaW5kZXggaW50byB0aGUgZHluYW1pYyBzeW1ib2xzLiAgVGhlIHNlY29uZAotICAgICBmb3VyIGJ5dGVzIGFyZSB0aGUgaW5kZXggb2YgdGhlIG5leHQgaGFzaCB0YWJsZSBlbnRyeSBpbiB0aGUKLSAgICAgYnVja2V0LiAgVGhlIGxkX2J1Y2tldHMgZmllbGQgZ2l2ZXMgdGhlIG51bWJlciBvZiBidWNrZXRzLCBzYXkgQi4KLSAgICAgVGhlIGZpcnN0IEIgZW50cmllcyBpbiB0aGUgaGFzaCB0YWJsZSBlYWNoIHN0YXJ0IGEgYnVja2V0IHdoaWNoCi0gICAgIGlzIGNoYWluZWQgdGhyb3VnaCB0aGUgc2Vjb25kIGZvdXIgYnl0ZXMgb2YgZWFjaCBlbnRyeS4gIEEgdmFsdWUKLSAgICAgb2YgemVybyBlbmRzIHRoZSBjaGFpbi4KLQotICAgICBUaGUgaGFzaCBmdW5jdGlvbiBpcyBzaW1wbHkKLSAgICAgICAgIGggPSAwOwotICAgICAgICAgd2hpbGUgKCpzdHJpbmcgIT0gJ1wwJykKLQkgICBoID0gKGggPDwgMSkgKyAqc3RyaW5nKys7Ci0JIGggJj0gMHg3ZmZmZmZmZjsKLQotICAgICBUbyBsb29rIHVwIGEgc3ltYm9sLCBjb21wdXRlIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBuYW1lLiAgVGFrZQotICAgICB0aGUgbW9kdWxvcyBvZiBoYXNoIHZhbHVlIGFuZCB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMuICBTdGFydCBhdAotICAgICB0aGF0IGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlLiAgU2VlIGlmIHRoZSBzeW1ib2wgKGZyb20gdGhlIGZpcnN0Ci0gICAgIGZvdXIgYnl0ZXMgb2YgdGhlIGhhc2ggdGFibGUgZW50cnkpIGhhcyB0aGUgbmFtZSB5b3UgYXJlIGxvb2tpbmcKLSAgICAgZm9yLiAgSWYgbm90LCB1c2UgdGhlIGNoYWluIGZpZWxkICh0aGUgc2Vjb25kIGZvdXIgYnl0ZXMgb2YgdGhlCi0gICAgIGhhc2ggdGFibGUgZW50cnkpIHRvIG1vdmUgb24gdG8gdGhlIG5leHQgZW50cnkgaW4gdGhpcyBidWNrZXQuCi0gICAgIElmIHRoZSBjaGFpbiBmaWVsZCBpcyB6ZXJvIHlvdSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUKLSAgICAgYnVja2V0LCBhbmQgdGhlIHN5bWJvbCBpcyBub3QgaW4gdGhlIGhhc2ggdGFibGUuICAqLyAKLSAgdW5zaWduZWQgbG9uZyBsZF9oYXNoOwotCi0gIC8qIFRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgdGFibGUuICBUaGlzIGlzIGEgbGlzdCBvZgotICAgICBleHRlcm5hbF9ubGlzdCBzdHJ1Y3R1cmVzLiAgVGhlIHN0cmluZyBpbmRpY2VzIGFyZSByZWxhdGl2ZSB0bwotICAgICB0aGUgbGRfc3ltYm9scyBmaWVsZC4gIEkgdGhpbmsgdGhlIG9ubHkgd2F5IHRvIGRldGVybWluZSB0aGUKLSAgICAgbnVtYmVyIG9mIHN5bWJvbHMgaXMgdG8gYXNzdW1lIHRoYXQgYWxsIHRoZSBieXRlcyBiZXR3ZWVuIGxkX3N0YWIKLSAgICAgYW5kIGxkX3N5bWJvbHMgYXJlIGV4dGVybmFsX25saXN0IHN0cnVjdHVyZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3N0YWI7Ci0KLSAgLyogSSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBmb3IuICBJdCBzZWVtcyB0byBhbHdheXMgYmUgemVyby4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3RhYl9oYXNoOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYnVja2V0cyBpbiB0aGUgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfYnVja2V0czsKLQotICAvKiBUaGUgYWRkcmVzcyBvZiB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZS4gIFRoZSBmaXJzdCBzdHJpbmcgaW4gdGhpcwotICAgICBzdHJpbmcgdGFibGUgbmVlZCBub3QgYmUgdGhlIGVtcHR5IHN0cmluZy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3ltYm9sczsKLQotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3ltYm9sIHN0cmluZyB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGxvbmcgbGRfc3ltYl9zaXplOwotCi0gIC8qIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSB0ZXh0IHNlZ21lbnQuICAqLwotICB1bnNpZ25lZCBsb25nIGxkX3RleHQ7Ci0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHByb2NlZHVyZSBsaW5rYWdlIHRhYmxlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsZF9wbHRfc3o7Ci19OwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IGV4dGVybmFsX3N1bjRfZHluYW1pY19saW5rCi17Ci0gIGJmZF9ieXRlIGxkX2xvYWRlZFs0XTsKLSAgYmZkX2J5dGUgbGRfbmVlZFs0XTsKLSAgYmZkX2J5dGUgbGRfcnVsZXNbNF07Ci0gIGJmZF9ieXRlIGxkX2dvdFs0XTsKLSAgYmZkX2J5dGUgbGRfcGx0WzRdOwotICBiZmRfYnl0ZSBsZF9yZWxbNF07Ci0gIGJmZF9ieXRlIGxkX2hhc2hbNF07Ci0gIGJmZF9ieXRlIGxkX3N0YWJbNF07Ci0gIGJmZF9ieXRlIGxkX3N0YWJfaGFzaFs0XTsKLSAgYmZkX2J5dGUgbGRfYnVja2V0c1s0XTsKLSAgYmZkX2J5dGUgbGRfc3ltYm9sc1s0XTsKLSAgYmZkX2J5dGUgbGRfc3ltYl9zaXplWzRdOwotICBiZmRfYnl0ZSBsZF90ZXh0WzRdOwotICBiZmRfYnl0ZSBsZF9wbHRfc3pbNF07Ci19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iZmRsaW5rLmggYi9pbmNsdWRlL2JmZGxpbmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdmMTEzYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2JmZGxpbmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyNyArMCwwIEBACi0vKiBiZmRsaW5rLmggLS0gaGVhZGVyIGZpbGUgZm9yIEJGRCBsaW5rIHJvdXRpbmVzCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIGFuZCBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEJGRExJTktfSAotI2RlZmluZSBCRkRMSU5LX0gKLQotLyogV2hpY2ggc3ltYm9scyB0byBzdHJpcCBkdXJpbmcgYSBsaW5rLiAgKi8KLWVudW0gYmZkX2xpbmtfc3RyaXAKLXsKLSAgc3RyaXBfbm9uZSwJCS8qIERvbid0IHN0cmlwIGFueSBzeW1ib2xzLiAgKi8KLSAgc3RyaXBfZGVidWdnZXIsCS8qIFN0cmlwIGRlYnVnZ2luZyBzeW1ib2xzLiAgKi8KLSAgc3RyaXBfc29tZSwJCS8qIGtlZXBfaGFzaCBpcyB0aGUgbGlzdCBvZiBzeW1ib2xzIHRvIGtlZXAuICAqLwotICBzdHJpcF9hbGwJCS8qIFN0cmlwIGFsbCBzeW1ib2xzLiAgKi8KLX07Ci0KLS8qIFdoaWNoIGxvY2FsIHN5bWJvbHMgdG8gZGlzY2FyZCBkdXJpbmcgYSBsaW5rLiAgVGhpcyBpcyBpcnJlbGV2YW50Ci0gICBpZiBzdHJpcF9hbGwgaXMgdXNlZC4gICovCi1lbnVtIGJmZF9saW5rX2Rpc2NhcmQKLXsKLSAgZGlzY2FyZF9ub25lLAkJLyogRG9uJ3QgZGlzY2FyZCBhbnkgbG9jYWxzLiAgKi8KLSAgZGlzY2FyZF9sLAkJLyogRGlzY2FyZCBsb2NhbCB0ZW1wb3Jhcnkgc3ltYm9scy4gICovCi0gIGRpc2NhcmRfYWxsCQkvKiBEaXNjYXJkIGFsbCBsb2NhbHMuICAqLwotfTsKLQwKLS8qIFRoZXNlIGFyZSB0aGUgcG9zc2libGUgdHlwZXMgb2YgYW4gZW50cnkgaW4gdGhlIEJGRCBsaW5rIGhhc2gKLSAgIHRhYmxlLiAgKi8KLQotZW51bSBiZmRfbGlua19oYXNoX3R5cGUKLXsKLSAgYmZkX2xpbmtfaGFzaF9uZXcsCQkvKiBTeW1ib2wgaXMgbmV3LiAgKi8KLSAgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQsCS8qIFN5bWJvbCBzZWVuIGJlZm9yZSwgYnV0IHVuZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLAkvKiBTeW1ib2wgaXMgd2VhayBhbmQgdW5kZWZpbmVkLiAgKi8KLSAgYmZkX2xpbmtfaGFzaF9kZWZpbmVkLAkvKiBTeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIGJmZF9saW5rX2hhc2hfZGVmd2VhaywJLyogU3ltYm9sIGlzIHdlYWsgYW5kIGRlZmluZWQuICAqLwotICBiZmRfbGlua19oYXNoX2NvbW1vbiwJCS8qIFN5bWJvbCBpcyBjb21tb24uICAqLwotICBiZmRfbGlua19oYXNoX2luZGlyZWN0LAkvKiBTeW1ib2wgaXMgYW4gaW5kaXJlY3QgbGluay4gICovCi0gIGJmZF9saW5rX2hhc2hfd2FybmluZwkJLyogTGlrZSBpbmRpcmVjdCwgYnV0IHdhcm4gaWYgcmVmZXJlbmNlZC4gICovCi19OwotCi0vKiBUaGUgbGlua2luZyByb3V0aW5lcyB1c2UgYSBoYXNoIHRhYmxlIHdoaWNoIHVzZXMgdGhpcyBzdHJ1Y3R1cmUgZm9yCi0gICBpdHMgZWxlbWVudHMuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeQotewotICAvKiBCYXNlIGhhc2ggdGFibGUgZW50cnkgc3RydWN0dXJlLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX2VudHJ5IHJvb3Q7Ci0gIC8qIFR5cGUgb2YgdGhpcyBlbnRyeS4gICovCi0gIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIHR5cGU7Ci0KLSAgLyogVW5kZWZpbmVkIGFuZCBjb21tb24gc3ltYm9scyBhcmUga2VwdCBpbiBhIGxpbmtlZCBsaXN0IHRocm91Z2gKLSAgICAgdGhpcyBmaWVsZC4gIFRoaXMgZmllbGQgaXMgbm90IGluIHRoZSB1bmlvbiBiZWNhdXNlIHRoYXQgd291bGQKLSAgICAgZm9yY2UgdXMgdG8gcmVtb3ZlIGVudHJpZXMgZnJvbSB0aGUgbGlzdCB3aGVuIHdlIGNoYW5nZWQgdGhlaXIKLSAgICAgdHlwZSwgd2hpY2ggd291bGQgZm9yY2UgdGhlIGxpc3QgdG8gYmUgZG91Ymx5IGxpbmtlZCwgd2hpY2ggd291bGQKLSAgICAgd2FzdGUgbW9yZSBtZW1vcnkuICBXaGVuIGFuIHVuZGVmaW5lZCBvciBjb21tb24gc3ltYm9sIGlzCi0gICAgIGNyZWF0ZWQsIGl0IHNob3VsZCBiZSBhZGRlZCB0byB0aGlzIGxpc3QsIHRoZSBoZWFkIG9mIHdoaWNoIGlzIGluCi0gICAgIHRoZSBsaW5rIGhhc2ggdGFibGUgaXRzZWxmLiAgQXMgc3ltYm9scyBhcmUgZGVmaW5lZCwgdGhleSBuZWVkCi0gICAgIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Q7IGFueXRoaW5nIHdoaWNoIHJlYWRzIHRoZSBsaXN0IG11c3QKLSAgICAgZG91YmxlY2hlY2sgdGhlIHN5bWJvbCB0eXBlLgotCi0gICAgIFdlYWsgc3ltYm9scyBhcmUgbm90IGtlcHQgb24gdGhpcyBsaXN0LgotCi0gICAgIERlZmluZWQgYW5kIGRlZndlYWsgc3ltYm9scyB1c2UgdGhpcyBmaWVsZCBhcyBhIHJlZmVyZW5jZSBtYXJrZXIuCi0gICAgIElmIHRoZSBmaWVsZCBpcyBub3QgTlVMTCwgb3IgdGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIHRhaWwgb2YgdGhlCi0gICAgIHVuZGVmaW5lZCBzeW1ib2wgbGlzdCwgdGhlIHN5bWJvbCBoYXMgYmVlbiByZWZlcmVuY2VkLiAgSWYgdGhlCi0gICAgIHN5bWJvbCBpcyB1bmRlZmluZWQgYW5kIGJlY29tZXMgZGVmaW5lZCwgdGhpcyBmaWVsZCB3aWxsCi0gICAgIGF1dG9tYXRpY2FsbHkgYmUgbm9uLU5VTEwgc2luY2UgdGhlIHN5bWJvbCB3aWxsIGhhdmUgYmVlbiBvbiB0aGUKLSAgICAgdW5kZWZpbmVkIHN5bWJvbCBsaXN0LiAgKi8KLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKm5leHQ7Ci0gIC8qIEEgdW5pb24gb2YgaW5mb3JtYXRpb24gZGVwZW5kaW5nIHVwb24gdGhlIHR5cGUuICAqLwotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIE5vdGhpbmcgaXMga2VwdCBmb3IgYmZkX2hhc2hfbmV3LiAgKi8KLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkLCBiZmRfbGlua19oYXNoX3VuZGVmd2Vhay4gICovCi0gICAgICBzdHJ1Y3QKLQl7Ci0JICBiZmQgKmFiZmQ7CQkvKiBCRkQgc3ltYm9sIHdhcyBmb3VuZCBpbi4gICovCi0JfSB1bmRlZjsKLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIGJmZF92bWEgdmFsdWU7CS8qIFN5bWJvbCB2YWx1ZS4gICovCi0JICBhc2VjdGlvbiAqc2VjdGlvbjsJLyogU3ltYm9sIHNlY3Rpb24uICAqLwotCX0gZGVmOwotICAgICAgLyogYmZkX2xpbmtfaGFzaF9pbmRpcmVjdCwgYmZkX2xpbmtfaGFzaF93YXJuaW5nLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpsaW5rOwkvKiBSZWFsIHN5bWJvbC4gICovCi0JICBjb25zdCBjaGFyICp3YXJuaW5nOwkvKiBXYXJuaW5nIChiZmRfbGlua19oYXNoX3dhcm5pbmcgb25seSkuICAqLwotCX0gaTsKLSAgICAgIC8qIGJmZF9saW5rX2hhc2hfY29tbW9uLiAgKi8KLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIFRoZSBsaW5rZXIgbmVlZHMgdG8ga25vdyB0aHJlZSB0aGluZ3MgYWJvdXQgY29tbW9uCi0gICAgICAgICAgICAgc3ltYm9sczogdGhlIHNpemUsIHRoZSBhbGlnbm1lbnQsIGFuZCB0aGUgc2VjdGlvbiBpbgotICAgICAgICAgICAgIHdoaWNoIHRoZSBzeW1ib2wgc2hvdWxkIGJlIHBsYWNlZC4gIFdlIHN0b3JlIHRoZSBzaXplCi0gICAgICAgICAgICAgaGVyZSwgYW5kIHdlIGFsbG9jYXRlIGEgc21hbGwgc3RydWN0dXJlIHRvIGhvbGQgdGhlCi0gICAgICAgICAgICAgc2VjdGlvbiBhbmQgdGhlIGFsaWdubWVudC4gIFRoZSBhbGlnbm1lbnQgaXMgc3RvcmVkIGFzIGEKLSAgICAgICAgICAgICBwb3dlciBvZiB0d28uICBXZSBkb24ndCBzdG9yZSBhbGwgdGhlIGluZm9ybWF0aW9uCi0gICAgICAgICAgICAgZGlyZWN0bHkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGluY3JlYXNlIHRoZSBzaXplIG9mCi0gICAgICAgICAgICAgdGhlIHVuaW9uOyB0aGlzIHN0cnVjdHVyZSBpcyBhIG1ham9yIHNwYWNlIHVzZXIgaW4gdGhlCi0gICAgICAgICAgICAgbGlua2VyLiAgKi8KLQkgIGJmZF9zaXplX3R5cGUgc2l6ZTsJLyogQ29tbW9uIHN5bWJvbCBzaXplLiAgKi8KLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2NvbW1vbl9lbnRyeQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IGFsaWdubWVudF9wb3dlcjsJLyogQWxpZ25tZW50LiAgKi8KLQkgICAgICBhc2VjdGlvbiAqc2VjdGlvbjsJCS8qIFN5bWJvbCBzZWN0aW9uLiAgKi8KLQkgICAgfSAqcDsKLQl9IGM7Ci0gICAgfSB1OwotfTsKLQotLyogVGhpcyBpcyB0aGUgbGluayBoYXNoIHRhYmxlLiAgSXQgaXMgYSBkZXJpdmVkIGNsYXNzIG9mCi0gICBiZmRfaGFzaF90YWJsZS4gICovCi0KLXN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlCi17Ci0gIC8qIFRoZSBoYXNoIHRhYmxlIGl0c2VsZi4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSB0YWJsZTsKLSAgLyogVGhlIGJhY2sgZW5kIHdoaWNoIGNyZWF0ZWQgdGhpcyBoYXNoIHRhYmxlLiAgVGhpcyBpbmRpY2F0ZXMgdGhlCi0gICAgIHR5cGUgb2YgdGhlIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUsIHdoaWNoIGlzIHNvbWV0aW1lcwotICAgICBpbXBvcnRhbnQgaW5mb3JtYXRpb24gd2hlbiBsaW5raW5nIG9iamVjdCBmaWxlcyBvZiBkaWZmZXJlbnQKLSAgICAgdHlwZXMgdG9nZXRoZXIuICAqLwotICBjb25zdCBiZmRfdGFyZ2V0ICpjcmVhdG9yOwotICAvKiBBIGxpbmtlZCBsaXN0IG9mIHVuZGVmaW5lZCBhbmQgY29tbW9uIHN5bWJvbHMsIGxpbmtlZCB0aHJvdWdoIHRoZQotICAgICBuZXh0IGZpZWxkIGluIHRoZSBiZmRfbGlua19oYXNoX2VudHJ5IHN0cnVjdHVyZS4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnM7Ci0gIC8qIEVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZSB0YWlsIG9mIHRoZSB1bmRlZnMgbGlzdC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICp1bmRlZnNfdGFpbDsKLX07Ci0KLS8qIExvb2sgdXAgYW4gZW50cnkgaW4gYSBsaW5rIGhhc2ggdGFibGUuICBJZiBGT0xMT1cgaXMgdHJ1ZSwgdGhpcwotICAgZm9sbG93cyBiZmRfbGlua19oYXNoX2luZGlyZWN0IGFuZCBiZmRfbGlua19oYXNoX3dhcm5pbmcgbGlua3MgdG8KLSAgIHRoZSByZWFsIHN5bWJvbC4gICovCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJmZF9saW5rX2hhc2hfbG9va3VwCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjcmVhdGUsCi0JICAgYm9vbGVhbiBjb3B5LCBib29sZWFuIGZvbGxvdykpOwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBtYWluIGxpbmtlciBoYXNoIHRhYmxlIGlmIHRoZSBzeW1ib2wgbWlnaHQKLSAgIGJlIHdyYXBwZWQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHJlZmVyZW5jZXMgdG8gYW4KLSAgIHVuZGVmaW5lZCBzeW1ib2wsIG5vdCBmb3IgZGVmaW5pdGlvbnMgb2YgYSBzeW1ib2wuICAqLwotCi1leHRlcm4gc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAKLSAgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICosIGNvbnN0IGNoYXIgKiwgYm9vbGVhbiwgYm9vbGVhbiwKLQkgICBib29sZWFuKSk7Ci0KLS8qIFRyYXZlcnNlIGEgbGluayBoYXNoIHRhYmxlLiAgKi8KLWV4dGVybiB2b2lkIGJmZF9saW5rX2hhc2hfdHJhdmVyc2UKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwKLQkgICBib29sZWFuICgqKSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSwKLQkgICBQVFIpKTsKLQotLyogQWRkIGFuIGVudHJ5IHRvIHRoZSB1bmRlZnMgbGlzdC4gICovCi1leHRlcm4gdm9pZCBiZmRfbGlua19hZGRfdW5kZWYKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfdGFibGUgKiwgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikpOwotDAotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gY29tbXVuaWNhdGUKLSAgIGJldHdlZW4gQkZEIGFuZCB0aGUgbGlua2VyIHdoZW4gZG9pbmcgYSBsaW5rLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2luZm8KLXsKLSAgLyogRnVuY3Rpb24gY2FsbGJhY2tzLiAgKi8KLSAgY29uc3Qgc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcyAqY2FsbGJhY2tzOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSByZWxvY2F0ZWFibGUgb2JqZWN0IGZpbGUuICAqLwotICBib29sZWFuIHJlbG9jYXRlYWJsZTsKLSAgLyogdHJ1ZSBpZiBCRkQgc2hvdWxkIGdlbmVyYXRlIGEgInRhc2sgbGlua2VkIiBvYmplY3QgZmlsZSwKLSAgICAgc2ltaWxhciB0byByZWxvY2F0YWJsZSBidXQgYWxzbyB3aXRoIGdsb2JhbHMgY29udmVydGVkIHRvIHN0YXRpY3MuICovCi0gIGJvb2xlYW4gdGFza19saW5rOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBzaGFyZWQ7Ci0gIC8qIHRydWUgaWYgQkZEIHNob3VsZCBwcmUtYmluZCBzeW1ib2xzIGluIGEgc2hhcmVkIG9iamVjdC4gICovCi0gIGJvb2xlYW4gc3ltYm9saWM7Ci0gIC8qIHRydWUgaWYgc2hhcmVkIG9iamVjdHMgc2hvdWxkIGJlIGxpbmtlZCBkaXJlY3RseSwgbm90IHNoYXJlZC4gICovCi0gIGJvb2xlYW4gc3RhdGljX2xpbms7Ci0gIC8qIHRydWUgaWYgdGhlIG91dHB1dCBmaWxlIHNob3VsZCBiZSBpbiBhIHRyYWRpdGlvbmFsIGZvcm1hdC4gIFRoaXMKLSAgICAgaXMgZXF1aXZhbGVudCB0byB0aGUgc2V0dGluZyBvZiB0aGUgQkZEX1RSQURJVElPTkFMX0ZPUk1BVCBmbGFnCi0gICAgIG9uIHRoZSBvdXRwdXQgZmlsZSwgYnV0IG1heSBiZSBjaGVja2VkIHdoZW4gcmVhZGluZyB0aGUgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBib29sZWFuIHRyYWRpdGlvbmFsX2Zvcm1hdDsKLSAgLyogdHJ1ZSBpZiB3ZSB3YW50IHRvIHByb2R1Y2VkIG9wdGltaXplZCBvdXRwdXQgZmlsZXMuICBUaGlzIG1pZ2h0Ci0gICAgIG5lZWQgbXVjaCBtb3JlIHRpbWUgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGV4cGxpY2l0bHkgc2VsZWN0ZWQuICAqLwotICBib29sZWFuIG9wdGltaXplOwotICAvKiB0cnVlIGlmIEJGRCBzaG91bGQgZ2VuZXJhdGUgZXJyb3JzIGZvciB1bmRlZmluZWQgc3ltYm9scwotICAgICBldmVuIGlmIGdlbmVyYXRpbmcgYSBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgYm9vbGVhbiBub191bmRlZmluZWQ7Ci0gIC8qIFdoaWNoIHN5bWJvbHMgdG8gc3RyaXAuICAqLwotICBlbnVtIGJmZF9saW5rX3N0cmlwIHN0cmlwOwotICAvKiBXaGljaCBsb2NhbCBzeW1ib2xzIHRvIGRpc2NhcmQuICAqLwotICBlbnVtIGJmZF9saW5rX2Rpc2NhcmQgZGlzY2FyZDsKLSAgLyogdHJ1ZSBpZiBzeW1ib2xzIHNob3VsZCBiZSByZXRhaW5lZCBpbiBtZW1vcnksIGZhbHNlIGlmIHRoZXkKLSAgICAgc2hvdWxkIGJlIGZyZWVkIGFuZCByZXJlYWQuICAqLwotICBib29sZWFuIGtlZXBfbWVtb3J5OwotICAvKiBUaGUgbGlzdCBvZiBpbnB1dCBCRkQncyBpbnZvbHZlZCBpbiB0aGUgbGluay4gIFRoZXNlIGFyZSBjaGFpbmVkCi0gICAgIHRvZ2V0aGVyIHZpYSB0aGUgbGlua19uZXh0IGZpZWxkLiAgKi8KLSAgYmZkICppbnB1dF9iZmRzOwotICAvKiBJZiBhIHN5bWJvbCBzaG91bGQgYmUgY3JlYXRlZCBmb3IgZWFjaCBpbnB1dCBCRkQsIHRoaXMgaXMgc2VjdGlvbgotICAgICB3aGVyZSB0aG9zZSBzeW1ib2xzIHNob3VsZCBiZSBwbGFjZWQuICBJdCBtdXN0IGJlIGEgc2VjdGlvbiBpbgotICAgICB0aGUgb3V0cHV0IEJGRC4gIEl0IG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIG5vIHN1Y2ggc3ltYm9scwotICAgICB3aWxsIGJlIGNyZWF0ZWQuICBUaGlzIGlzIHRvIHN1cHBvcnQgQ1JFQVRFX09CSkVDVF9TWU1CT0xTIGluIHRoZQotICAgICBsaW5rZXIgY29tbWFuZCBsYW5ndWFnZS4gICovCi0gIGFzZWN0aW9uICpjcmVhdGVfb2JqZWN0X3N5bWJvbHNfc2VjdGlvbjsKLSAgLyogSGFzaCB0YWJsZSBoYW5kbGVkIGJ5IEJGRC4gICovCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICpoYXNoOwotICAvKiBIYXNoIHRhYmxlIG9mIHN5bWJvbHMgdG8ga2VlcC4gIFRoaXMgaXMgTlVMTCB1bmxlc3Mgc3RyaXAgaXMKLSAgICAgc3RyaXBfc29tZS4gICovCi0gIHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqa2VlcF9oYXNoOwotICAvKiB0cnVlIGlmIGV2ZXJ5IHN5bWJvbCBzaG91bGQgYmUgcmVwb3J0ZWQgYmFjayB2aWEgdGhlIG5vdGljZQotICAgICBjYWxsYmFjay4gICovCi0gIGJvb2xlYW4gbm90aWNlX2FsbDsKLSAgLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzIHRvIHJlcG9ydCBiYWNrIHZpYSB0aGUgbm90aWNlIGNhbGxiYWNrLiAgSWYKLSAgICAgdGhpcyBpcyBOVUxMLCBhbmQgbm90aWNlX2FsbCBpcyBmYWxzZSwgdGhlbiBubyBzeW1ib2xzIGFyZQotICAgICByZXBvcnRlZCBiYWNrLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICpub3RpY2VfaGFzaDsKLSAgLyogSGFzaCB0YWJsZSBvZiBzeW1ib2xzIHdoaWNoIGFyZSBiZWluZyB3cmFwcGVkICh0aGUgLS13cmFwIGxpbmtlcgotICAgICBvcHRpb24pLiAgSWYgdGhpcyBpcyBOVUxMLCBubyBzeW1ib2xzIGFyZSBiZWluZyB3cmFwcGVkLiAgKi8KLSAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp3cmFwX2hhc2g7Ci0gIC8qIElmIGEgYmFzZSBvdXRwdXQgZmlsZSBpcyB3YW50ZWQsIHRoZW4gdGhpcyBwb2ludHMgdG8gaXQgKi8KLSAgUFRSIGJhc2VfZmlsZTsKLQotICAvKiBJZiBub24temVybywgc3BlY2lmaWVzIHRoYXQgYnJhbmNoZXMgd2hpY2ggYXJlIHByb2JsZW1hdGljIGZvciB0aGUKLSAgTVBDODYwIEMwIChvciBlYXJsaWVyKSBzaG91bGQgYmUgY2hlY2tlZCBmb3IgYW5kIG1vZGlmaWVkLiAgSXQgZ2l2ZXMgdGhlCi0gIG51bWJlciBvZiBieXRlcyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGF0IHRoZSBlbmQgb2YgZWFjaCB0ZXh0IHBhZ2UuICovCi0gIGludCBtcGM4NjBjMDsKLQotICAvKiBUaGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QgaXMKLSAgICAgbG9hZGVkLiAgKi8KLSAgY29uc3QgY2hhciAqaW5pdF9mdW5jdGlvbjsKLSAgLyogVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzCi0gICAgIHVubG9hZGVkLiAgKi8KLSAgY29uc3QgY2hhciAqZmluaV9mdW5jdGlvbjsKLX07Ci0KLS8qIFRoaXMgc3RydWN0dXJlcyBob2xkcyBhIHNldCBvZiBjYWxsYmFjayBmdW5jdGlvbnMuICBUaGVzZSBhcmUKLSAgIGNhbGxlZCBieSB0aGUgQkZEIGxpbmtlciByb3V0aW5lcy4gIFRoZSBmaXJzdCBhcmd1bWVudCB0byBlYWNoCi0gICBjYWxsYmFjayBmdW5jdGlvbiBpcyB0aGUgYmZkX2xpbmtfaW5mbyBzdHJ1Y3R1cmUgYmVpbmcgdXNlZC4gIEVhY2gKLSAgIGZ1bmN0aW9uIHJldHVybnMgYSBib29sZWFuIHZhbHVlLiAgSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsCi0gICB0aGVuIHRoZSBCRkQgZnVuY3Rpb24gd2hpY2ggY2FsbGVkIGl0IHdpbGwgcmV0dXJuIHdpdGggYSBmYWlsdXJlCi0gICBpbmRpY2F0aW9uLiAgKi8KLQotc3RydWN0IGJmZF9saW5rX2NhbGxiYWNrcwotewotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGFuIG9iamVjdCBpcyBhZGRlZCBmcm9tIGFuCi0gICAgIGFyY2hpdmUuICBBQkZEIGlzIHRoZSBhcmNoaXZlIGVsZW1lbnQgYmVpbmcgYWRkZWQuICBOQU1FIGlzIHRoZQotICAgICBuYW1lIG9mIHRoZSBzeW1ib2wgd2hpY2ggY2F1c2VkIHRoZSBhcmNoaXZlIGVsZW1lbnQgdG8gYmUgcHVsbGVkCi0gICAgIGluLiAgKi8KLSAgYm9vbGVhbiAoKmFkZF9hcmNoaXZlX2VsZW1lbnQpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSAgYmZkICphYmZkLAotCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHN5bWJvbCBpcyBmb3VuZCB3aXRoIG11bHRpcGxlCi0gICAgIGRlZmluaXRpb25zLiAgTkFNRSBpcyB0aGUgc3ltYm9sIHdoaWNoIGlzIGRlZmluZWQgbXVsdGlwbGUgdGltZXMuCi0gICAgIE9CRkQgaXMgdGhlIG9sZCBCRkQsIE9TRUMgaXMgdGhlIG9sZCBzZWN0aW9uLCBPVkFMIGlzIHRoZSBvbGQKLSAgICAgdmFsdWUsIE5CRkQgaXMgdGhlIG5ldyBCRkQsIE5TRUMgaXMgdGhlIG5ldyBzZWN0aW9uLCBhbmQgTlZBTCBpcwotICAgICB0aGUgbmV3IHZhbHVlLiAgT0JGRCBtYXkgYmUgTlVMTC4gIE9TRUMgYW5kIE5TRUMgbWF5IGJlCi0gICAgIGJmZF9jb21fc2VjdGlvbiBvciBiZmRfaW5kX3NlY3Rpb24uICAqLwotICBib29sZWFuICgqbXVsdGlwbGVfZGVmaW5pdGlvbikgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgIGJmZCAqb2JmZCwKLQkJCQkJICBhc2VjdGlvbiAqb3NlYywKLQkJCQkJICBiZmRfdm1hIG92YWwsCi0JCQkJCSAgYmZkICpuYmZkLAotCQkJCQkgIGFzZWN0aW9uICpuc2VjLAotCQkJCQkgIGJmZF92bWEgbnZhbCkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgIG11bHRpcGxlIHRpbWVzLiAgTkFNRSBpcyB0aGUgc3ltYm9sIGFwcGVhcmluZyBtdWx0aXBsZSB0aW1lcy4KLSAgICAgT0JGRCBpcyB0aGUgQkZEIG9mIHRoZSBleGlzdGluZyBzeW1ib2w7IGl0IG1heSBiZSBOVUxMIGlmIHRoaXMgaXMKLSAgICAgbm90IGtub3duLiAgT1RZUEUgaXMgdGhlIHR5cGUgb2YgdGhlIGV4aXN0aW5nIHN5bWJvbCwgd2hpY2ggbWF5Ci0gICAgIGJlIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrLAotICAgICBiZmRfbGlua19oYXNoX2NvbW1vbiwgb3IgYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4gIElmIE9UWVBFIGlzCi0gICAgIGJmZF9saW5rX2hhc2hfY29tbW9uLCBPU0laRSBpcyB0aGUgc2l6ZSBvZiB0aGUgZXhpc3Rpbmcgc3ltYm9sLgotICAgICBOQkZEIGlzIHRoZSBCRkQgb2YgdGhlIG5ldyBzeW1ib2wuICBOVFlQRSBpcyB0aGUgdHlwZSBvZiB0aGUgbmV3Ci0gICAgIHN5bWJvbCwgb25lIG9mIGJmZF9saW5rX2hhc2hfZGVmaW5lZCwgYmZkX2xpbmtfaGFzaF9jb21tb24sIG9yCi0gICAgIGJmZF9saW5rX2hhc2hfaW5kaXJlY3QuICBJZiBOVFlQRSBpcyBiZmRfbGlua19oYXNoX2NvbW1vbiwgTlNJWkUKLSAgICAgaXMgdGhlIHNpemUgb2YgdGhlIG5ldyBzeW1ib2wuICAqLwotICBib29sZWFuICgqbXVsdGlwbGVfY29tbW9uKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICAgYmZkICpvYmZkLAotCQkJCSAgICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG90eXBlLAotCQkJCSAgICAgIGJmZF92bWEgb3NpemUsCi0JCQkJICAgICAgYmZkICpuYmZkLAotCQkJCSAgICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG50eXBlLAotCQkJCSAgICAgIGJmZF92bWEgbnNpemUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgdG8gYWRkIGEgc3ltYm9sIHRvIGEgc2V0LiAgRU5UUlkgaXMKLSAgICAgdGhlIGxpbmsgaGFzaCB0YWJsZSBlbnRyeSBmb3IgdGhlIHNldCBpdHNlbGYgKGUuZy4sCi0gICAgIF9fQ1RPUl9MSVNUX18pLiAgUkVMT0MgaXMgdGhlIHJlbG9jYXRpb24gdG8gdXNlIGZvciBhbiBlbnRyeSBpbgotICAgICB0aGUgc2V0IHdoZW4gZ2VuZXJhdGluZyBhIHJlbG9jYXRlYWJsZSBmaWxlLCBhbmQgaXMgYWxzbyB1c2VkIHRvCi0gICAgIGdldCB0aGUgc2l6ZSBvZiB0aGUgZW50cnkgd2hlbiBnZW5lcmF0aW5nIGFuIGV4ZWN1dGFibGUgZmlsZS4KLSAgICAgQUJGRCwgU0VDIGFuZCBWQUxVRSBpZGVudGlmeSB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSBzZXQuICAqLwotICBib29sZWFuICgqYWRkX3RvX3NldCkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmVudHJ5LAotCQkJCSBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2MsCi0JCQkJIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywgYmZkX3ZtYSB2YWx1ZSkpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBuYW1lIG9mIGEgZysrIGNvbnN0cnVjdG9yIG9yCi0gICAgIGRlc3RydWN0b3IgaXMgZm91bmQuICBUaGlzIGlzIG9ubHkgY2FsbGVkIGJ5IHNvbWUgb2JqZWN0IGZpbGUKLSAgICAgZm9ybWF0cy4gIENPTlNUUlVDVE9SIGlzIHRydWUgZm9yIGEgY29uc3RydWN0b3IsIGZhbHNlIGZvciBhCi0gICAgIGRlc3RydWN0b3IuICBUaGlzIHdpbGwgdXNlIEJGRF9SRUxPQ19DVE9SIHdoZW4gZ2VuZXJhdGluZyBhCi0gICAgIHJlbG9jYXRlYWJsZSBmaWxlLiAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGZvdW5kLiAgQUJGRCwKLSAgICAgU0VDVElPTiBhbmQgVkFMVUUgYXJlIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLiAgKi8KLSAgYm9vbGVhbiAoKmNvbnN0cnVjdG9yKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgYm9vbGVhbiBjb25zdHJ1Y3RvciwKLQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlYywKLQkJCQkgIGJmZF92bWEgdmFsdWUpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgdG8gaXNzdWUgYSBsaW5rZXIgd2FybmluZy4gIEZvcgotICAgICBleGFtcGxlLCB0aGlzIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgd2FybmluZwotICAgICBzeW1ib2wuICBXQVJOSU5HIGlzIHRoZSB3YXJuaW5nIHRvIGJlIGlzc3VlZC4gIFNZTUJPTCBpcyB0aGUgbmFtZQotICAgICBvZiB0aGUgc3ltYm9sIHdoaWNoIHRyaWdnZXJlZCB0aGUgd2FybmluZzsgaXQgbWF5IGJlIE5VTEwgaWYKLSAgICAgdGhlcmUgaXMgbm9uZS4gIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uCi0gICAgIHdoaWNoIHRyaWdlcnJlZCB0aGUgd2FybmluZzsgZWl0aGVyIEFCRkQgb3IgU0VDVElPTiBvciBib3RoIG1heQotICAgICBiZSBOVUxMIGlmIHRoZSBsb2NhdGlvbiBpcyBub3Qga25vd24uICAqLwotICBib29sZWFuICgqd2FybmluZykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKndhcm5pbmcsIGNvbnN0IGNoYXIgKnN5bWJvbCwKLQkJCSAgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkgICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jYXRpb24gaXMgYXR0ZW1wdGVkIGFnYWluc3QKLSAgICAgYW4gdW5kZWZpbmVkIHN5bWJvbC4gIE5BTUUgaXMgdGhlIHN5bWJvbCB3aGljaCBpcyB1bmRlZmluZWQuCi0gICAgIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIGZyb20gd2hpY2ggdGhlCi0gICAgIHJlZmVyZW5jZSBpcyBtYWRlLiAgSW4gc29tZSBjYXNlcyBTRUNUSU9OIG1heSBiZSBOVUxMLiAgKi8KLSAgYm9vbGVhbiAoKnVuZGVmaW5lZF9zeW1ib2wpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGJmZCAqYWJmZCwKLQkJCQkgICAgICAgYXNlY3Rpb24gKnNlY3Rpb24sIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2Mgb3ZlcmZsb3cgb2NjdXJzLiAgTkFNRSBpcwotICAgICB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIG9yIHNlY3Rpb24gdGhlIHJlbG9jIGlzIGFnYWluc3QsCi0gICAgIFJFTE9DX05BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIHJlbG9jYXRpb24sIGFuZCBBRERFTkQgaXMgYW55Ci0gICAgIGFkZGVuZCB0aGF0IGlzIHVzZWQuICBBQkZELCBTRUNUSU9OIGFuZCBBRERSRVNTIGlkZW50aWZ5IHRoZQotICAgICBsb2NhdGlvbiBhdCB3aGljaCB0aGUgb3ZlcmZsb3cgb2NjdXJzOyBpZiB0aGlzIGlzIHRoZSByZXN1bHQgb2YgYQotICAgICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciwgdGhlbgotICAgICBBQkZEIHdpbGwgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCpyZWxvY19vdmVyZmxvdykgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgICBjb25zdCBjaGFyICpyZWxvY19uYW1lLCBiZmRfdm1hIGFkZGVuZCwKLQkJCQkgICAgIGJmZCAqYWJmZCwgYXNlY3Rpb24gKnNlY3Rpb24sCi0JCQkJICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIGRhbmdlcm91cyByZWxvYyBpcyBwZXJmb3JtZWQuCi0gICAgIFRoZSBjYW5vbmljYWwgZXhhbXBsZSBpcyBhbiBhMjlrIElIQ09OU1QgcmVsb2Mgd2hpY2ggZG9lcyBub3QKLSAgICAgZm9sbG93IGFuIElISUhBTEYgcmVsb2MuICBNRVNTQUdFIGlzIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCi0gICAgIEFCRkQsIFNFQ1RJT04gYW5kIEFERFJFU1MgaWRlbnRpZnkgdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRoZQotICAgICBwcm9ibGVtIG9jY3VycmVkOyBpZiB0aGlzIGlzIHRoZSByZXN1bHQgb2YgYQotICAgICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciwgdGhlbgotICAgICBBQkZEIHdpbGwgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCpyZWxvY19kYW5nZXJvdXMpIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwKLQkJCQkgICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCSAgICAgIGJmZF92bWEgYWRkcmVzcykpOwotICAvKiBBIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2MgaXMgZm91bmQgdG8gYmUgYXR0YWNoZWQKLSAgICAgdG8gYSBzeW1ib2wgd2hpY2ggaXMgbm90IGJlaW5nIHdyaXR0ZW4gb3V0LiAgTkFNRSBpcyB0aGUgbmFtZSBvZgotICAgICB0aGUgc3ltYm9sLiAgQUJGRCwgU0VDVElPTiBhbmQgQUREUkVTUyBpZGVudGlmeSB0aGUgbG9jYXRpb24gb2YKLSAgICAgdGhlIHJlbG9jOyBpZiB0aGlzIGlzIHRoZSByZXN1bHQgb2YgYQotICAgICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIG9yIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciwgdGhlbgotICAgICBBQkZEIHdpbGwgYmUgTlVMTC4gICovCi0gIGJvb2xlYW4gKCp1bmF0dGFjaGVkX3JlbG9jKSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCSAgICAgICBiZmQgKmFiZmQsIGFzZWN0aW9uICpzZWN0aW9uLAotCQkJCSAgICAgICBiZmRfdm1hIGFkZHJlc3MpKTsKLSAgLyogQSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiBhIHN5bWJvbCBpbiBub3RpY2VfaGFzaCBpcwotICAgICBkZWZpbmVkIG9yIHJlZmVyZW5jZWQuICBOQU1FIGlzIHRoZSBzeW1ib2wuICBBQkZELCBTRUNUSU9OIGFuZAotICAgICBBRERSRVNTIGFyZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIElmIFNFQ1RJT04gaXMKLSAgICAgYmZkX3VuZF9zZWN0aW9uLCB0aGlzIGlzIGEgcmVmZXJlbmNlLiAgKi8KLSAgYm9vbGVhbiAoKm5vdGljZSkgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICAgYmZkICphYmZkLCBhc2VjdGlvbiAqc2VjdGlvbiwgYmZkX3ZtYSBhZGRyZXNzKSk7Ci19OwotDAotLyogVGhlIGxpbmtlciBidWlsZHMgbGlua19vcmRlciBzdHJ1Y3R1cmVzIHdoaWNoIHRlbGwgdGhlIGNvZGUgaG93IHRvCi0gICBpbmNsdWRlIGlucHV0IGRhdGEgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotLyogVGhlc2UgYXJlIHRoZSB0eXBlcyBvZiBsaW5rX29yZGVyIHN0cnVjdHVyZXMuICAqLwotCi1lbnVtIGJmZF9saW5rX29yZGVyX3R5cGUKLXsKLSAgYmZkX3VuZGVmaW5lZF9saW5rX29yZGVyLAkvKiBVbmRlZmluZWQuICAqLwotICBiZmRfaW5kaXJlY3RfbGlua19vcmRlciwJLyogQnVpbHQgZnJvbSBhIHNlY3Rpb24uICAqLwotICBiZmRfZmlsbF9saW5rX29yZGVyLAkJLyogRmlsbCB3aXRoIGEgMTYgYml0IGNvbnN0YW50LiAgKi8KLSAgYmZkX2RhdGFfbGlua19vcmRlciwJCS8qIFNldCB0byBleHBsaWNpdCBkYXRhLiAgKi8KLSAgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciwJLyogUmVsb2NhdGUgYWdhaW5zdCBhIHNlY3Rpb24uICAqLwotICBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIJLyogUmVsb2NhdGUgYWdhaW5zdCBhIHN5bWJvbC4gICovCi19OwotCi0vKiBUaGlzIGlzIHRoZSBsaW5rX29yZGVyIHN0cnVjdHVyZSBpdHNlbGYuICBUaGVzZSBmb3JtIGEgY2hhaW4KLSAgIGF0dGFjaGVkIHRvIHRoZSBzZWN0aW9uIHdob3NlIGNvbnRlbnRzIHRoZXkgYXJlIGRlc2NyaWJpbmcuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgCi17Ci0gIC8qIE5leHQgbGlua19vcmRlciBpbiBjaGFpbi4gICovCi0gIHN0cnVjdCBiZmRfbGlua19vcmRlciAqbmV4dDsKLSAgLyogVHlwZSBvZiBsaW5rX29yZGVyLiAgKi8KLSAgZW51bSBiZmRfbGlua19vcmRlcl90eXBlIHR5cGU7Ci0gIC8qIE9mZnNldCB3aXRoaW4gb3V0cHV0IHNlY3Rpb24uICAqLwotICBiZmRfdm1hIG9mZnNldDsgIAotICAvKiBTaXplIHdpdGhpbiBvdXRwdXQgc2VjdGlvbi4gICovCi0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgLyogVHlwZSBzcGVjaWZpYyBpbmZvcm1hdGlvbi4gICovCi0gIHVuaW9uIAotICAgIHsKLSAgICAgIHN0cnVjdCAKLQl7Ci0JICAvKiBTZWN0aW9uIHRvIGluY2x1ZGUuICBJZiB0aGlzIGlzIHVzZWQsIHRoZW4KLQkgICAgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uIG11c3QgYmUgdGhlIHNlY3Rpb24gdGhlCi0JICAgICBsaW5rX29yZGVyIGlzIGF0dGFjaGVkIHRvLCBzZWN0aW9uLT5vdXRwdXRfb2Zmc2V0IG11c3QKLQkgICAgIGVxdWFsIHRoZSBsaW5rX29yZGVyIG9mZnNldCBmaWVsZCwgYW5kIHNlY3Rpb24tPl9yYXdfc2l6ZQotCSAgICAgbXVzdCBlcXVhbCB0aGUgbGlua19vcmRlciBzaXplIGZpZWxkLiAgTWF5YmUgdGhlc2UKLQkgICAgIHJlc3RyaWN0aW9ucyBzaG91bGQgYmUgcmVsYXhlZCBzb21lZGF5LiAgKi8KLQkgIGFzZWN0aW9uICpzZWN0aW9uOwotCX0gaW5kaXJlY3Q7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBWYWx1ZSB0byBmaWxsIHdpdGguICAqLwotCSAgdW5zaWduZWQgaW50IHZhbHVlOwotCX0gZmlsbDsKLSAgICAgIHN0cnVjdAotCXsKLQkgIC8qIERhdGEgdG8gcHV0IGludG8gZmlsZS4gIFRoZSBzaXplIGZpZWxkIGdpdmVzIHRoZSBudW1iZXIKLQkgICAgIG9mIGJ5dGVzIHdoaWNoIHRoaXMgZmllbGQgcG9pbnRzIHRvLiAgKi8KLQkgIGJmZF9ieXRlICpjb250ZW50czsKLQl9IGRhdGE7Ci0gICAgICBzdHJ1Y3QKLQl7Ci0JICAvKiBEZXNjcmlwdGlvbiBvZiByZWxvYyB0byBnZW5lcmF0ZS4gIFVzZWQgZm9yCi0JICAgICBiZmRfc2VjdGlvbl9yZWxvY19saW5rX29yZGVyIGFuZAotCSAgICAgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyLiAgKi8KLQkgIHN0cnVjdCBiZmRfbGlua19vcmRlcl9yZWxvYyAqcDsKLQl9IHJlbG9jOwotICAgIH0gdTsKLX07Ci0KLS8qIEEgbGlua2VyIG9yZGVyIG9mIHR5cGUgYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlciBvcgotICAgYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyIG1lYW5zIHRvIGNyZWF0ZSBhIHJlbG9jIGFnYWluc3QgYQotICAgc2VjdGlvbiBvciBzeW1ib2wsIHJlc3BlY3RpdmVseS4gIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgLVVyIHRvCi0gICBnZW5lcmF0ZSByZWxvY3MgZm9yIHRoZSBjb25zdHJ1Y3RvciB0YWJsZXMuICBUaGUKLSAgIGJmZF9saW5rX29yZGVyX3JlbG9jIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIHJlbG9jIHRoYXQgQkZEIHNob3VsZAotICAgY3JlYXRlLiAgSXQgaXMgc2ltaWxhciB0byBhIGFyZWxlbnQsIGJ1dCBJIGRpZG4ndCB1c2UgYXJlbGVudAotICAgYmVjYXVzZSB0aGUgbGlua2VyIGRvZXMgbm90IGtub3cgYW55dGhpbmcgYWJvdXQgbW9zdCBzeW1ib2xzLCBhbmQKLSAgIGFueSBhc3ltYm9sIHN0cnVjdHVyZSBpdCBjcmVhdGVzIHdpbGwgYmUgcGFydGlhbGx5IG1lYW5pbmdsZXNzLgotICAgVGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBsb2dpY2FsbHkgYmUgaW4gdGhlIGJmZF9saW5rX29yZGVyIHN0cnVjdCwKLSAgIGJ1dCBJIGRpZG4ndCB3YW50IHRvIHdhc3RlIHRoZSBzcGFjZSBzaW5jZSB0aGVzZSB0eXBlcyBvZiByZWxvY3MKLSAgIGFyZSByZWxhdGl2ZWx5IHJhcmUuICAqLwotCi1zdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MKLXsKLSAgLyogUmVsb2MgdHlwZS4gICovCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLQotICB1bmlvbgotICAgIHsKLSAgICAgIC8qIEZvciB0eXBlIGJmZF9zZWN0aW9uX3JlbG9jX2xpbmtfb3JkZXIsIHRoaXMgaXMgdGhlIHNlY3Rpb24KLQkgdGhlIHJlbG9jIHNob3VsZCBiZSBhZ2FpbnN0LiAgVGhpcyBtdXN0IGJlIGEgc2VjdGlvbiBpbiB0aGUKLQkgb3V0cHV0IEJGRCwgbm90IGFueSBvZiB0aGUgaW5wdXQgQkZEcy4gICovCi0gICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgIC8qIEZvciB0eXBlIGJmZF9zeW1ib2xfcmVsb2NfbGlua19vcmRlciwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUKLQkgc3ltYm9sIHRoZSByZWxvYyBzaG91bGQgYmUgYWdhaW5zdC4gICovCi0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIH0gdTsKLQotICAvKiBBZGRlbmQgdG8gdXNlLiAgVGhlIG9iamVjdCBmaWxlIHNob3VsZCBjb250YWluIHplcm8uICBUaGUgQkZECi0gICAgIGJhY2tlbmQgaXMgcmVzcG9uc2libGUgZm9yIGZpbGxpbmcgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QKLSAgICAgZmlsZSBjb3JyZWN0bHkuICBGb3Igc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzIChlLmcuLCBDT0ZGKSB0aGUKLSAgICAgYWRkZW5kIG11c3QgYmUgc3RvcmVkIGludG8gaW4gdGhlIG9iamVjdCBmaWxlLCBhbmQgZm9yIHNvbWUKLSAgICAgKGUuZy4sIFNQQVJDIGEub3V0KSBpdCBpcyBrZXB0IGluIHRoZSByZWxvYy4gICovCi0gIGJmZF92bWEgYWRkZW5kOwotfTsKLQotLyogQWxsb2NhdGUgYSBuZXcgbGlua19vcmRlciBmb3IgYSBzZWN0aW9uLiAgKi8KLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKmJmZF9uZXdfbGlua19vcmRlciBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKikpOwotCi0vKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIHRvIGRlc2NyaWJlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIHRoZQotICAgRUxGIGxpbmtlci4gIFRoZXNlIHN0cnVjdHVyZXMgY291bGQgYmUgbWFuaXB1bGF0ZWQgZW50aXJlbHkgaW5zaWRlCi0gICBCRkQsIGJ1dCBpdCB3b3VsZCBiZSBhIHBhaW4uICBJbnN0ZWFkLCB0aGUgcmVndWxhciBsaW5rZXIgc2V0cyB1cAotICAgdGhlc2Ugc3RydWN0dXJlcywgYW5kIHRoZW4gcGFzc2VzIHRoZW0gaW50byBCRkQuICAqLwotCi0vKiBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBhIHZlcnNpb24uICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIKLXsKLSAgLyogTmV4dCByZWd1bGFyIGV4cHJlc3Npb24gZm9yIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbmV4dDsKLSAgLyogUmVndWxhciBleHByZXNzaW9uLiAgKi8KLSAgY29uc3QgY2hhciAqcGF0dGVybjsKLSAgLyogTWF0Y2hpbmcgZnVuY3Rpb24uICAqLwotICBpbnQgKCptYXRjaCkgUEFSQU1TKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKiwgY29uc3QgY2hhciAqKSk7Ci19OwotCi0vKiBWZXJzaW9uIGRlcGVuZGVuY2llcy4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcwotewotICAvKiBOZXh0IGRlcGVuZGVuY3kgZm9yIHRoaXMgdmVyc2lvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbmV4dDsKLSAgLyogVGhlIHZlcnNpb24gd2hpY2ggdGhpcyB2ZXJzaW9uIGRlcGVuZHMgdXBvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdmVyc2lvbl9uZWVkZWQ7Ci19OwotCi0vKiBBIG5vZGUgaW4gdGhlIHZlcnNpb24gdHJlZS4gICovCi0KLXN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZQotewotICAvKiBOZXh0IHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKm5leHQ7Ci0gIC8qIE5hbWUgb2YgdGhpcyB2ZXJzaW9uLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogVmVyc2lvbiBudW1iZXIuICAqLwotICB1bnNpZ25lZCBpbnQgdmVybnVtOwotICAvKiBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBnbG9iYWwgc3ltYm9scyBpbiB0aGlzIHZlcnNpb24uICAqLwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmdsb2JhbHM7Ci0gIC8qIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIGxvY2FsIHN5bWJvbHMgaW4gdGhpcyB2ZXJzaW9uLiAgKi8KLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpsb2NhbHM7Ci0gIC8qIExpc3Qgb2YgdmVyc2lvbnMgd2hpY2ggdGhpcyB2ZXJzaW9uIGRlcGVuZHMgdXBvbi4gICovCi0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqZGVwczsKLSAgLyogSW5kZXggb2YgdGhlIHZlcnNpb24gbmFtZS4gIFRoaXMgaXMgdXNlZCB3aXRoaW4gQkZELiAgKi8KLSAgdW5zaWduZWQgaW50IG5hbWVfaW5keDsKLSAgLyogV2hldGhlciB0aGlzIHZlcnNpb24gdHJlZSB3YXMgdXNlZC4gIFRoaXMgaXMgdXNlZCB3aXRoaW4gQkZELiAgKi8KLSAgaW50IHVzZWQ7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYm91dC5oIGIvaW5jbHVkZS9ib3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzI4Y2MuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ib3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgJ2Eub3V0LmgnLiAgSXQgaXMgdG8gYmUgdXNlZCBpbiBhbGwKLSAqIEdOVSB0b29scyBtb2RpZmllZCB0byBzdXBwb3J0IHRoZSBpODA5NjAgKG9yIHRvb2xzIHRoYXQgb3BlcmF0ZSBvbgotICogb2JqZWN0IGZpbGVzIGNyZWF0ZWQgYnkgc3VjaCB0b29scykuCi0gKgotICogQWxsIGk4MDk2MCBkZXZlbG9wbWVudCBpcyBkb25lIGluIGEgQ1JPU1MtREVWRUxPUE1FTlQgZW52aXJvbm1lbnQuICBJLmUuLAotICogb2JqZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIG9uLCBhbmQgZXhlY3V0ZWQgdW5kZXIgdGhlIGRpcmVjdGlvbiBvZiBhIHN5bWJvbGljCi0gKiBkZWJ1Z2dlciBydW5uaW5nIG9uLCBhIGhvc3Qgc3lzdGVtLiAgV2UgZG8gbm90IHdhbnQgdG8gYmUgc3ViamVjdCB0byB0aGUKLSAqIHZhZ2FyaWVzIG9mIHdoaWNoIGhvc3QgaXQgaXMgb3Igd2hldGhlciBpdCBzdXBwb3J0cyBDT0ZGIG9yIGEub3V0IGZvcm1hdCwKLSAqIG9yIGFueXRoaW5nIGVsc2UuICBXZSBETyB3YW50IHRvOgotICoKLSAqCW8gYWx3YXlzIGdlbmVyYXRlIHRoZSBzYW1lIGZvcm1hdCBvYmplY3QgZmlsZXMsIHJlZ2FyZGxlc3Mgb2YgaG9zdC4KLSAqCi0gKglvIGhhdmUgYW4gJ2Eub3V0JyBoZWFkZXIgdGhhdCB3ZSBjYW4gbW9kaWZ5IGZvciBvdXIgb3duIHB1cnBvc2VzCi0gKgkgICh0aGUgODA5NjAgaXMgdHlwaWNhbGx5IGFuIGVtYmVkZGVkIHByb2Nlc3NvciBhbmQgbWF5IHJlcXVpcmUKLSAqCSAgZW5oYW5jZWQgbGlua2VyIHN1cHBvcnQgdGhhdCB0aGUgbm9ybWFsIGEub3V0LmggaGVhZGVyIGNhbid0Ci0gKgkgIGFjY29tbW9kYXRlKS4KLSAqCi0gKiBBcyBmb3IgYnl0ZS1vcmRlcmluZywgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKLSAqCi0gKglvIFRleHQgYW5kIGRhdGEgdGhhdCBpcyBhY3R1YWxseSBkb3dubG9hZGVkIHRvIHRoZSB0YXJnZXQgaXMgYWx3YXlzCi0gKgkgIGluIGk4MDk2MCAobGl0dGxlLWVuZGlhbikgb3JkZXIuCi0gKgotICoJbyBBbGwgb3RoZXIgbnVtYmVycyAoaW4gdGhlIGhlYWRlciwgc3ltYm9scywgcmVsb2NhdGlvbiBkaXJlY3RpdmVzKQotICoJICBhcmUgaW4gaG9zdCBieXRlLW9yZGVyOiAgb2JqZWN0IGZpbGVzIENBTk5PVCBiZSBsaWZ0ZWQgZnJvbSBhCi0gKgkgIGxpdHRsZS1lbmQgaG9zdCBhbmQgdXNlZCBvbiBhIGJpZy1lbmRpYW4gKG9yIHZpY2UgdmVyc2EpIHdpdGhvdXQKLSAqCSAgbW9kaWZpY2F0aW9uLgotICogPT0+IFRISVMgSVMgTk8gTE9OR0VSIFRSVUUgVVNJTkcgQkZELiAgV0UgQ0FOIEdFTkVSQVRFIEFOWSBCWVRFIE9SREVSCi0gKiAgICAgRk9SIFRIRSBIRUFERVIsIEFORCBSRUFEIEFOWSBCWVRFIE9SREVSLiAgUFJFRkVSRU5DRSBXT1VMRCBCRSBUTwotICogICAgIFVTRSBMSVRUTEUtRU5ESUFOIEJZVEUgT1JERVIgVEhST1VHSE9VVCwgUkVHQVJETEVTUyBPRiBIT1NULiAgPD09Ci0gKgotICoJbyBUaGUgZG93bmxvYWRlciAoJ2NvbW05NjAnKSB0YWtlcyBjYXJlIHRvIGdlbmVyYXRlIGEgcHNldWRvLWhlYWRlcgotICoJICB3aXRoIGNvcnJlY3QgKGk4MDk2MCkgYnl0ZS1vcmRlcmluZyBiZWZvcmUgc2hpcHBpbmcgdGV4dCBhbmQgZGF0YQotICoJICBvZmYgdG8gdGhlIE5JTkRZIG1vbml0b3IgaW4gdGhlIHRhcmdldCBzeXN0ZW1zLiAgU3ltYm9scyBhbmQKLSAqCSAgcmVsb2NhdGlvbiBpbmZvIGFyZSBuZXZlciBzZW50IHRvIHRoZSB0YXJnZXQuCi0gKi8KLQotCi0jZGVmaW5lIEJNQUdJQwkwNDE1Ci0vKiBXZSBkb24ndCBhY2NlcHQgdGhlIGZvbGxvd2luZyAoc2VlIE5fQkFETUFHIG1hY3JvKS4KLSAqIFRoZXkncmUganVzdCBoZXJlIHNvIEdOVSBjb2RlIHdpbGwgY29tcGlsZS4KLSAqLwotI2RlZmluZQlPTUFHSUMJMDQwNwkJLyogb2xkIGltcHVyZSBmb3JtYXQgKi8KLSNkZWZpbmUJTk1BR0lDCTA0MTAJCS8qIHJlYWQtb25seSB0ZXh0ICovCi0jZGVmaW5lCVpNQUdJQwkwNDEzCQkvKiBkZW1hbmQgbG9hZCBmb3JtYXQgKi8KLQotLyogRklMRSBIRUFERVIKLSAqCUFsbCAnbGVuZ3RocycgYXJlIGdpdmVuIGFzIGEgbnVtYmVyIG9mIGJ5dGVzLgotICoJQWxsICdhbGlnbm1lbnRzJyBhcmUgZm9yIHJlbGlua2FibGUgZmlsZXMgb25seTsgIGFuIGFsaWdubWVudCBvZgotICoJCSduJyBpbmRpY2F0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBtdXN0IGJlZ2luIGF0IGFuCi0gKgkJYWRkcmVzcyB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgKDIqKm4pLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfZXhlYyB7Ci0JLyogU3RhbmRhcmQgc3R1ZmYgKi8KLQl1bnNpZ25lZCBjaGFyIGVfaW5mb1s0XTsJLyogSWRlbnRpZmllcyB0aGlzIGFzIGEgYi5vdXQgZmlsZSAqLwotCXVuc2lnbmVkIGNoYXIgZV90ZXh0WzRdOwkvKiBMZW5ndGggb2YgdGV4dCAqLwotCXVuc2lnbmVkIGNoYXIgZV9kYXRhWzRdOwkvKiBMZW5ndGggb2YgZGF0YSAqLwotCXVuc2lnbmVkIGNoYXIgZV9ic3NbNF07CQkvKiBMZW5ndGggb2YgdW5pbml0aWFsaXplZCBkYXRhIGFyZWEgKi8KLQl1bnNpZ25lZCBjaGFyIGVfc3ltc1s0XTsJLyogTGVuZ3RoIG9mIHN5bWJvbCB0YWJsZSAqLwotCXVuc2lnbmVkIGNoYXIgZV9lbnRyeVs0XTsJLyogUnVudGltZSBzdGFydCBhZGRyZXNzICovCi0JdW5zaWduZWQgY2hhciBlX3Ryc2l6ZVs0XTsJLyogTGVuZ3RoIG9mIHRleHQgcmVsb2NhdGlvbiBpbmZvICovCi0JdW5zaWduZWQgY2hhciBlX2Ryc2l6ZVs0XTsJLyogTGVuZ3RoIG9mIGRhdGEgcmVsb2NhdGlvbiBpbmZvICovCi0KLQkvKiBBZGRlZCBmb3IgaTk2MCAqLwotCXVuc2lnbmVkIGNoYXIgZV90bG9hZFs0XTsJLyogVGV4dCBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIgZV9kbG9hZFs0XTsJLyogRGF0YSBydW50aW1lIGxvYWQgYWRkcmVzcyAqLwotCXVuc2lnbmVkIGNoYXIgZV90YWxpZ25bMV07CS8qIEFsaWdubWVudCBvZiB0ZXh0IHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBjaGFyIGVfZGFsaWduWzFdOwkvKiBBbGlnbm1lbnQgb2YgZGF0YSBzZWdtZW50ICovCi0JdW5zaWduZWQgY2hhciBlX2JhbGlnblsxXTsJLyogQWxpZ25tZW50IG9mIGJzcyBzZWdtZW50ICovCi0JdW5zaWduZWQgY2hhciBlX3JlbGF4YWJsZVsxXTsJLyogQXNzZW1ibGVkIHdpdGggZW5vdWdoIGluZm8gdG8gYWxsb3cgbGlua2VyIHRvIHJlbGF4ICovCi19OwotCi0jZGVmaW5lCUVYRUNfQllURVNfU0laRQkoc2l6ZW9mIChzdHJ1Y3QgZXh0ZXJuYWxfZXhlYykpCi0KLS8qIFRoZXNlIG1hY3JvcyB1c2UgdGhlIGFfeHh4IGZpZWxkIG5hbWVzLCBzaW5jZSB0aGV5IG9wZXJhdGUgb24gdGhlIGV4ZWMKLSAgIHN0cnVjdHVyZSBhZnRlciBpdCdzIGJlZW4gYnl0ZS1zd2FwcGVkIGFuZCByZWFsaWduZWQgb24gdGhlIGhvc3QgbWFjaGluZS4gKi8KLSNkZWZpbmUgTl9CQURNQUcoeCkJKCgoeCkuYV9pbmZvKSE9Qk1BR0lDKQotI2RlZmluZSBOX1RYVE9GRih4KQlFWEVDX0JZVEVTX1NJWkUKLSNkZWZpbmUgTl9EQVRPRkYoeCkJKCBOX1RYVE9GRih4KSArICh4KS5hX3RleHQgKQotI2RlZmluZSBOX1RST0ZGKHgpCSggTl9EQVRPRkYoeCkgKyAoeCkuYV9kYXRhICkKLSNkZWZpbmUgTl9UUkVMT0ZGCU5fVFJPRkYKLSNkZWZpbmUgTl9EUk9GRih4KQkoIE5fVFJPRkYoeCkgKyAoeCkuYV90cnNpemUgKQotI2RlZmluZSBOX0RSRUxPRkYJTl9EUk9GRgotI2RlZmluZSBOX1NZTU9GRih4KQkoIE5fRFJPRkYoeCkgKyAoeCkuYV9kcnNpemUgKQotI2RlZmluZSBOX1NUUk9GRih4KQkoIE5fU1lNT0ZGKHgpICsgKHgpLmFfc3ltcyApCi0jZGVmaW5lIE5fREFUQUREUih4KQkoICh4KS5hX2Rsb2FkICkgICAgCi0KLS8qIEFkZHJlc3Mgb2YgdGV4dCBzZWdtZW50IGluIG1lbW9yeSBhZnRlciBpdCBpcyBsb2FkZWQuICAqLwotI2lmICFkZWZpbmVkIChOX1RYVEFERFIpCi0jZGVmaW5lIE5fVFhUQUREUih4KSAwCi0jZW5kaWYKLQotLyogQSBzaW5nbGUgZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZQotICovCi1zdHJ1Y3Qgbmxpc3QgewotCXVuaW9uIHsKLQkJY2hhcgkqbl9uYW1lOwotCQlzdHJ1Y3Qgbmxpc3QgKm5fbmV4dDsKLQkJbG9uZwluX3N0cng7CQkvKiBJbmRleCBpbnRvIHN0cmluZyB0YWJsZQkqLwotCX0gbl91bjsKLQl1bnNpZ25lZCBjaGFyIG5fdHlwZTsJLyogU2VlIGJlbG93CQkJCSovCi0JY2hhcgluX290aGVyOwkvKiBVc2VkIGluIGk4MDk2MCBzdXBwb3J0IC0tIHNlZSBiZWxvdwkqLwotCXNob3J0CW5fZGVzYzsKLQl1bnNpZ25lZCBsb25nIG5fdmFsdWU7Ci19OwotCi0KLS8qIExlZ2FsIHZhbHVlcyBvZiBuX3R5cGUKLSAqLwotI2RlZmluZSBOX1VOREYJMAkvKiBVbmRlZmluZWQgc3ltYm9sCSovCi0jZGVmaW5lIE5fQUJTCTIJLyogQWJzb2x1dGUgc3ltYm9sCSovCi0jZGVmaW5lIE5fVEVYVAk0CS8qIFRleHQgc3ltYm9sCQkqLwotI2RlZmluZSBOX0RBVEEJNgkvKiBEYXRhIHN5bWJvbAkJKi8KLSNkZWZpbmUgTl9CU1MJOAkvKiBCU1Mgc3ltYm9sCQkqLwotI2RlZmluZSBOX0ZOCTMxCS8qIEZpbGVuYW1lIHN5bWJvbAkqLwotCi0jZGVmaW5lIE5fRVhUCTEJLyogRXh0ZXJuYWwgc3ltYm9sIChPUidkIGluIHdpdGggb25lIG9mIGFib3ZlKQkqLwotI2RlZmluZSBOX1RZUEUJMDM2CS8qIE1hc2sgZm9yIGFsbCB0aGUgdHlwZSBiaXRzCQkJKi8KLSNkZWZpbmUgTl9TVEFCCTAzNDAJLyogTWFzayBmb3IgYWxsIGJpdHMgdXNlZCBmb3IgU0RCIGVudHJpZXMgCSovCi0KLS8qIE1FQU5JTkcgT0YgJ25fb3RoZXInCi0gKgotICogSWYgbm9uLXplcm8sIHRoZSAnbl9vdGhlcicgZmllbGRzIGluZGljYXRlcyBlaXRoZXIgYSBsZWFmIHByb2NlZHVyZSBvcgotICogYSBzeXN0ZW0gcHJvY2VkdXJlLCBhcyBmb2xsb3dzOgotICoKLSAqCTEgPD0gbl9vdGhlciA8PSAzMiA6Ci0gKgkJVGhlIHN5bWJvbCBpcyB0aGUgZW50cnkgcG9pbnQgdG8gYSBzeXN0ZW0gcHJvY2VkdXJlLgotICoJCSduX3ZhbHVlJyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnksIGFzIGZvciBhbnkgb3RoZXIKLSAqCQlwcm9jZWR1cmUuICBUaGUgc3lzdGVtIHByb2NlZHVyZSBudW1iZXIgKHdoaWNoIGNhbiBiZSB1c2VkIGluCi0gKgkJYSAnY2FsbHMnIGluc3RydWN0aW9uKSBpcyAobl9vdGhlci0xKS4gIFRoZXNlIGVudHJpZXMgY29tZSBmcm9tCi0gKgkJJy5zeXNwcm9jJyBkaXJlY3RpdmVzLgotICoKLSAqCW5fb3RoZXIgPT0gTl9DQUxMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdjYWxsJyBlbnRyeSBwb2ludCB0byBhIGxlYWYgcHJvY2VkdXJlLgotICoJCVRoZSAqbmV4dCogc3ltYm9sIGluIHRoZSBzeW1ib2wgdGFibGUgbXVzdCBiZSB0aGUgY29ycmVzcG9uZGluZwotICoJCSdiYWwnIGVudHJ5IHBvaW50IHRvIHRoZSBwcm9jZWR1cmUgKHNlZSBmb2xsb3dpbmcpLiAgVGhlc2UKLSAqCQllbnRyaWVzIGNvbWUgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIHR3byBkaWZmZXJlbnQKLSAqCQlzeW1ib2xzIGFyZSBzcGVjaWZpZWQgKHRoZSBmaXJzdCBvbmUgaXMgcmVwcmVzZW50ZWQgaGVyZSkuCi0gKgkKLSAqCi0gKgluX290aGVyID09IE5fQkFMTkFNRQotICoJCXRoZSBzeW1ib2wgaXMgdGhlICdiYWwnIGVudHJ5IHBvaW50IHRvIGEgbGVhZiBwcm9jZWR1cmUuCi0gKgkJVGhlc2UgZW50cmllcyByZXN1bHQgZnJvbSAnLmxlYWZwcm9jJyBkaXJlY3RpdmVzIGluIHdoaWNoIG9ubHkKLSAqCQlvbmUgc3ltYm9sIGlzIHNwZWNpZmllZCwgb3IgaW4gd2hpY2ggdGhlIHNhbWUgc3ltYm9sIGlzCi0gKgkJc3BlY2lmaWVkIHR3aWNlLgotICoKLSAqIE5vdGUgdGhhdCBhbiBOX0NBTExOQU1FIGVudHJ5ICptdXN0KiBoYXZlIGEgY29ycmVzcG9uZGluZyBOX0JBTE5BTUUgZW50cnksCi0gKiBidXQgbm90IGV2ZXJ5IE5fQkFMTkFNRSBlbnRyeSBtdXN0IGhhdmUgYW4gTl9DQUxMTkFNRSBlbnRyeS4KLSAqLwotI2RlZmluZSBOX0NBTExOQU1FCSgoY2hhciktMSkKLSNkZWZpbmUgTl9CQUxOQU1FCSgoY2hhciktMikKLSNkZWZpbmUgSVNfQ0FMTE5BTUUoeCkJKE5fQ0FMTE5BTUUgPT0gKHgpKQotI2RlZmluZSBJU19CQUxOQU1FKHgpCShOX0JBTE5BTUUgPT0gKHgpKQotI2RlZmluZSBJU19PVEhFUih4KQkoKHgpPjAgJiYgKHgpIDw9MzIpCi0KLSNkZWZpbmUgYl9vdXRfcmVsb2NhdGlvbl9pbmZvIHJlbG9jYXRpb25faW5mbwotc3RydWN0IHJlbG9jYXRpb25faW5mbyB7Ci0JaW50CSByX2FkZHJlc3M7CS8qIEZpbGUgYWRkcmVzcyBvZiBpdGVtIHRvIGJlIHJlbG9jYXRlZAkqLwotCXVuc2lnbmVkCi0jZGVmaW5lIHJfaW5kZXggcl9zeW1ib2xudW0KLQkJcl9zeW1ib2xudW06MjQsLyogSW5kZXggb2Ygc3ltYm9sIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMgYmFzZWQsCi0JCQkJKglpZiByX2V4dGVybiBpcyBzZXQuICBPdGhlcndpc2Ugc2V0IHRvCi0JCQkJKgllaXRoZXIgTl9URVhULCBOX0RBVEEsIG9yIE5fQlNTIHRvCi0JCQkJKglpbmRpY2F0ZSBzZWN0aW9uIG9uIHdoaWNoIHJlbG9jYXRpb24gaXMKLQkJCQkqCWJhc2VkLgotCQkJCSovCi0JCXJfcGNyZWw6MSwJLyogMSA9PiByZWxvY2F0ZSBQQy1yZWxhdGl2ZTsgZWxzZSBhYnNvbHV0ZQotCQkJCSAqCU9uIGk5NjAsIHBjLXJlbGF0aXZlIGltcGxpZXMgMjQtYml0Ci0JCQkJICoJYWRkcmVzcywgYWJzb2x1dGUgaW1wbGllcyAzMi1iaXQuCi0JCQkJICovCi0JCXJfbGVuZ3RoOjIsCS8qIE51bWJlciBvZiBieXRlcyB0byByZWxvY2F0ZToKLQkJCQkgKgkwID0+IDEgYnl0ZQotCQkJCSAqCTEgPT4gMiBieXRlcyAtLSB1c2VkIGZvciAxMyBiaXQgcGNyZWwKLQkJCQkgKgkyID0+IDQgYnl0ZXMgCi0JCQkJICovCi0JCXJfZXh0ZXJuOjEsCi0JCXJfYnNyOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLQkJcl9kaXNwOjEsCS8qIFNvbWV0aGluZyBmb3IgdGhlIEdOVSBOUzMySyBhc3NlbWJsZXIgKi8KLQkJcl9jYWxsajoxLAkvKiAxIGlmIHJlbG9jYXRpb24gdGFyZ2V0IGlzIGFuIGk5NjAgJ2NhbGxqJyAqLwotCQlyX3JlbGF4YWJsZToxOwkvKiAxIGlmIGVub3VnaCBpbmZvIGlzIGxlZnQgdG8gcmVsYXgKLQkJCQkgICB0aGUgZGF0YSAqLwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2FsbGJhY2suaCBiL2luY2x1ZGUvY2FsbGJhY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3NTI4NC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NhbGxiYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyogUmVtb3RlIHRhcmdldCBzeXN0ZW0gY2FsbCBjYWxsYmFjayBzdXBwb3J0LgotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgaW50ZXJmYWNlIGlzbid0IGludGVuZGVkIHRvIGJlIHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIGtpbmQKLSAgIG9mIHJlbW90ZSAoaGFyZHdhcmUsIHNpbXVsYXRvciwgd2hhdGV2ZXIpLiAgQXMgc3VjaCwgc3VwcG9ydCBmb3IgaXQKLSAgIChlLmcuIHNpbS9jb21tb24vY2FsbGJhY2suYykgc2hvdWxkICpub3QqIGxpdmUgaW4gdGhlIHNpbXVsYXRvciBzb3VyY2UKLSAgIHRyZWUsIG5vciBzaG91bGQgaXQgbGl2ZSBpbiB0aGUgZ2RiIHNvdXJjZSB0cmVlLiAgKi8KLQotLyogVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBoYW5kbGUgc3lzdGVtIGNhbGxzOgotCi0gICAxKSBIYXZlIGEgc2ltdWxhdG9yIGludGVyY2VwdCB0aGUgYXBwcm9wcmlhdGUgdHJhcCBpbnN0cnVjdGlvbiBhbmQKLSAgIGRpcmVjdGx5IHBlcmZvcm0gdGhlIHN5c3RlbSBjYWxsIG9uIGJlaGFsZiBvZiB0aGUgdGFyZ2V0IHByb2dyYW0uCi0gICBUaGlzIGlzIHRoZSB0eXBpY2FsIHdheSBvZiBoYW5kbGluZyBzeXN0ZW0gY2FsbHMgZm9yIGVtYmVkZGVkIHRhcmdldHMuCi0gICBbSGFuZGxpbmcgc3lzdGVtIGNhbGxzIGZvciBlbWJlZGRlZCB0YXJnZXRzIGlzbid0IHRoYXQgbXVjaCBvZiBhbgotICAgb3h5bW9yb24gYXMgcnVubmluZyBjb21waWxlciB0ZXN0c3VpdGVzIG1ha2UgdXNlIG9mIHRoZSBjYXBhYmlsaXR5Ll0KLQotICAgVGhpcyBtZXRob2Qgb2Ygc3lzdGVtIGNhbGwgaGFuZGxpbmcgaXMgZG9uZSB3aGVuIFNUQVRFX0VOVklST05NRU5UCi0gICBpcyBFTlZJUk9OTUVOVF9VU0VSLgotCi0gICAyKSBIYXZlIGEgc2ltdWxhdG9yIGVtdWxhdGUgdGhlIGhhcmR3YXJlIGFzIG11Y2ggYXMgcG9zc2libGUuCi0gICBJZiB0aGUgcHJvZ3JhbSBydW5uaW5nIG9uIHRoZSByZWFsIGhhcmR3YXJlIGNvbW11bmljYXRlcyB3aXRoIHNvbWUgc29ydAotICAgb2YgdGFyZ2V0IG1hbmFnZXIsIG9uZSB3b3VsZCB3YW50IHRvIGJlIGFibGUgdG8gcnVuIHRoaXMgcHJvZ3JhbSBvbiB0aGUKLSAgIHNpbXVsYXRvciBhcyB3ZWxsLgotCi0gICBUaGlzIG1ldGhvZCBvZiBzeXN0ZW0gY2FsbCBoYW5kbGluZyBpcyBkb25lIHdoZW4gU1RBVEVfRU5WSVJPTk1FTlQKLSAgIGlzIEVOVklST05NRU5UX09QRVJBVElORy4KLSovCi0KLSNpZm5kZWYgQ0FMTEJBQ0tfSAotI2RlZmluZSBDQUxMQkFDS19ICi0KLS8qID8/PyBUaGUgcmVhc29uIHdoeSB3ZSBjaGVjayBmb3IgdmFfc3RhcnQgaGVyZSBzaG91bGQgYmUgZG9jdW1lbnRlZC4gICovCi0KLSNpZm5kZWYgdmFfc3RhcnQKLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotDAotLyogTWFwcGluZyBvZiBob3N0L3RhcmdldCB2YWx1ZXMuICAqLwotLyogPz8/IEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIG9uZSBtaWdodCB3YW50IHRvIGFkZCBhIHN0cmluZyBvZiB0aGUKLSAgIG5hbWUgb2YgdGhlIHN5bWJvbC4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGhvc3RfdmFsOwotICBpbnQgdGFyZ2V0X3ZhbDsKLX0gQ0JfVEFSR0VUX0RFRlNfTUFQOwotCi0jZGVmaW5lIE1BWF9DQUxMQkFDS19GRFMgMTAKLQotLyogRm9yd2FyZCBkZWNsIGZvciBzdGF0L2ZzdGF0LiAgKi8KLXN0cnVjdCBzdGF0OwotCi10eXBlZGVmIHN0cnVjdCBob3N0X2NhbGxiYWNrX3N0cnVjdCBob3N0X2NhbGxiYWNrOwotCi1zdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgCi17Ci0gIGludCAoKmNsb3NlKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosaW50KSk7Ci0gIGludCAoKmdldF9lcnJubykgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKmlzYXR0eSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLSAgaW50ICgqbHNlZWspIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50LCBsb25nICwgaW50KSk7Ci0gIGludCAoKm9wZW4pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciosIGludCBtb2RlKSk7Ci0gIGludCAoKnJlYWQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKixpbnQsICBjaGFyICosIGludCkpOwotICBpbnQgKCpyZWFkX3N0ZGluKSBQQVJBTVMgKCggaG9zdF9jYWxsYmFjayAqLCBjaGFyICosIGludCkpOwotICBpbnQgKCpyZW5hbWUpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLSAgaW50ICgqc3lzdGVtKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotICBsb25nICgqdGltZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBsb25nICopKTsKLSAgaW50ICgqdW5saW5rKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKikpOwotICBpbnQgKCp3cml0ZSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLGludCwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgaW50ICgqd3JpdGVfc3Rkb3V0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci0gIHZvaWQgKCpmbHVzaF9zdGRvdXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotICBpbnQgKCp3cml0ZV9zdGRlcnIpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLSAgdm9pZCAoKmZsdXNoX3N0ZGVycikgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0gIGludCAoKnN0YXQpIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKSk7Ci0gIGludCAoKmZzdGF0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCwgc3RydWN0IHN0YXQgKikpOwotCi0gIC8qIFdoZW4gcHJlc2VudCwgY2FsbCB0byB0aGUgY2xpZW50IHRvIGdpdmUgaXQgdGhlIG9wb3J0dW5pdHkgdG8KLSAgICAgcG9sbCBhbnkgaW8gZGV2aWNlcyBmb3IgYSByZXF1ZXN0IHRvIHF1aXQgKGluZGljYXRlZCBieSBhIG5vbnplcm8KLSAgICAgcmV0dXJuIHZhbHVlKS4gKi8KLSAgaW50ICgqcG9sbF9xdWl0KSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICopKTsKLQotICAvKiBVc2VkIHdoZW4gdGhlIHRhcmdldCBoYXMgZ29uZSBhd2F5LCBzbyB3ZSBjYW4gY2xvc2Ugb3BlbgotICAgICBoYW5kbGVzIGFuZCBmcmVlIG1lbW9yeSBldGMgZXRjLiAgKi8KLSAgaW50ICgqc2h1dGRvd24pIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKikpOwotICBpbnQgKCppbml0KSAgICAgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqKSk7Ci0KLSAgLyogZGVwcmVjaWF0ZWQsIHVzZSB2cHJpbnRmX2ZpbHRlcmVkIC0gVGFsayB0byB0aGUgdXNlciBvbiBhIGNvbnNvbGUuICAqLwotICB2b2lkICgqcHJpbnRmX2ZpbHRlcmVkKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLSAgLyogVGFsayB0byB0aGUgdXNlciBvbiBhIGNvbnNvbGUuICAqLwotICB2b2lkICgqdnByaW50Zl9maWx0ZXJlZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotICAvKiBTYW1lIGFzIHZwcmludGZfZmlsdGVyZWQgYnV0IHRvIHN0ZGVyci4gICovCi0gIHZvaWQgKCpldnByaW50Zl9maWx0ZXJlZCkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotICAvKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIGFuZCAiZXhpdCIuCi0gICAgIEluIHRoZSBjYXNlIG9mIGdkYiAiZXhpdGluZyIgbWVhbnMgZG9pbmcgYSBsb25nam1wIGJhY2sgdG8gdGhlIG1haW4KLSAgICAgY29tbWFuZCBsb29wLiAgKi8KLSAgdm9pZCAoKmVycm9yKSBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLSAgaW50IGxhc3RfZXJybm87CQkvKiBob3N0IGZvcm1hdCAqLwotCi0gIGludCBmZG1hcFtNQVhfQ0FMTEJBQ0tfRkRTXTsKLSAgY2hhciBmZG9wZW5bTUFYX0NBTExCQUNLX0ZEU107Ci0gIGNoYXIgYWx3YXlzb3BlbltNQVhfQ0FMTEJBQ0tfRkRTXTsKLQotICAvKiBTeXN0ZW0gY2FsbCBudW1iZXJzLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICpzeXNjYWxsX21hcDsKLSAgLyogRXJybm8gdmFsdWVzLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICplcnJub19tYXA7Ci0gIC8qIEZsYWdzIHRvIHRoZSBvcGVuIHN5c3RlbSBjYWxsLiAgKi8KLSAgQ0JfVEFSR0VUX0RFRlNfTUFQICpvcGVuX21hcDsKLSAgLyogU2lnbmFsIG51bWJlcnMuICAqLwotICBDQl9UQVJHRVRfREVGU19NQVAgKnNpZ25hbF9tYXA7Ci0gIC8qIExheW91dCBvZiBgc3RhdCcgc3RydWN0LgotICAgICBUaGUgZm9ybWF0IGlzIGEgc2VyaWVzIG9mICJuYW1lLGxlbmd0aCIgcGFpcnMgc2VwYXJhdGVkIGJ5IGNvbG9ucy4KLSAgICAgRW1wdHkgc3BhY2UgaXMgaW5kaWNhdGVkIHdpdGggYSBgbmFtZScgb2YgInNwYWNlIi4KLSAgICAgQWxsIHBhZGRpbmcgbXVzdCBiZSBleHBsaWNpdGx5IG1lbnRpb25lZC4KLSAgICAgTGVuZ3RocyBhcmUgaW4gYnl0ZXMuICBJZiB0aGlzIG5lZWRzIHRvIGJlIGV4dGVuZGVkIHRvIGJpdHMsCi0gICAgIHVzZSAibmFtZS5iaXRzIi4KLSAgICAgRXhhbXBsZTogInN0X2Rldiw0OnN0X2lubyw0OnN0X21vZGUsNDouLi4iICAqLwotICBjb25zdCBjaGFyICpzdGF0X21hcDsKLQotICAvKiBNYXJrZXIgZm9yIHRob3NlIHdhbnRpbmcgdG8gZG8gc2FuaXR5IGNoZWNrcy4KLSAgICAgVGhpcyBzaG91bGQgcmVtYWluIHRoZSBsYXN0IG1lbWJlciBvZiB0aGlzIHN0cnVjdCB0byBoZWxwIGNhdGNoCi0gICAgIG1pc2NvbXBpbGF0aW9uIGVycm9ycy4gKi8KLSNkZWZpbmUgSE9TVF9DQUxMQkFDS19NQUdJQyA0NzA1IC8qIHRlZHMgY29uc3RhbnQgKi8KLSAgaW50IG1hZ2ljOwotfTsKLQotZXh0ZXJuIGhvc3RfY2FsbGJhY2sgZGVmYXVsdF9jYWxsYmFjazsKLQwKLS8qIENhbm9uaWNhbCB2ZXJzaW9ucyBvZiBzeXN0ZW0gY2FsbCBudW1iZXJzLgotICAgSXQncyBub3QgaW50ZW5kZWQgdG8gd2lsbHktbmlsbHkgdGhyb3cgZXZlcnkgc3lzdGVtIGNhbGwgZXZlciBoZWFyZAotICAgb2YgaW4gaGVyZS4gIE9ubHkgaW5jbHVkZSB0aG9zZSB0aGF0IGhhdmUgYW4gaW1wb3J0YW50IHVzZS4KLSAgID8/PyBPbmUgY2FuIGNlcnRhaW5seSBzdGFydCBhIGRpc2N1c3Npb24gb3ZlciB0aGUgb25lcyB0aGF0IGFyZSBjdXJyZW50bHkKLSAgIGhlcmUsIGJ1dCB0aGF0IHdpbGwgYWx3YXlzIGJlIHRydWUuICAqLwotCi0vKiBUaGVzZSBhcmUgdXNlZCBieSB0aGUgQU5TSSBDIHN1cHBvcnQgb2YgbGliYy4gICovCi0jZGVmaW5lCUNCX1NZU19leGl0CTEKLSNkZWZpbmUJQ0JfU1lTX29wZW4JMgotI2RlZmluZQlDQl9TWVNfY2xvc2UJMwotI2RlZmluZQlDQl9TWVNfcmVhZAk0Ci0jZGVmaW5lCUNCX1NZU193cml0ZQk1Ci0jZGVmaW5lCUNCX1NZU19sc2Vlawk2Ci0jZGVmaW5lCUNCX1NZU191bmxpbmsJNwotI2RlZmluZQlDQl9TWVNfZ2V0cGlkCTgKLSNkZWZpbmUJQ0JfU1lTX2tpbGwJOQotI2RlZmluZSBDQl9TWVNfZnN0YXQgICAgMTAKLS8qI2RlZmluZSBDQl9TWVNfc2JyawkxMSAtIG5vdCBjdXJyZW50bHkgYSBzeXN0ZW0gY2FsbCwgYnV0IHJlc2VydmVkLiAgKi8KLQotLyogQVJHViBzdXBwb3J0LiAgKi8KLSNkZWZpbmUgQ0JfU1lTX2FyZ3ZsZW4JMTIKLSNkZWZpbmUgQ0JfU1lTX2FyZ3YJMTMKLQotLyogVGhlc2UgYXJlIGV4dHJhcyBhZGRlZCBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLiAgKi8KLSNkZWZpbmUgQ0JfU1lTX2NoZGlyCTE0Ci0jZGVmaW5lIENCX1NZU19zdGF0CTE1Ci0jZGVmaW5lIENCX1NZU19jaG1vZCAJMTYKLSNkZWZpbmUgQ0JfU1lTX3V0aW1lIAkxNwotI2RlZmluZSBDQl9TWVNfdGltZSAJMTgKLQwKLS8qIFN0cnVjdCB1c2UgdG8gcGFzcyBhbmQgcmV0dXJuIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBwZXJmb3JtIGEKLSAgIHN5c3RlbSBjYWxsLiAgKi8KLS8qIEZJWE1FOiBOZWVkIHRvIGNvbnNpZGVyIHRhcmdldCB3b3JkIHNpemUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjYl9zeXNjYWxsIHsKLSAgLyogVGhlIHRhcmdldCdzIHZhbHVlIG9mIHdoYXQgc3lzdGVtIGNhbGwgdG8gcGVyZm9ybS4gICovCi0gIGludCBmdW5jOwotICAvKiBUaGUgYXJndW1lbnRzIHRvIHRoZSBzeXNjYWxsLiAgKi8KLSAgbG9uZyBhcmcxLCBhcmcyLCBhcmczLCBhcmc0OwotCi0gIC8qIFRoZSByZXN1bHQuICAqLwotICBsb25nIHJlc3VsdDsKLSAgLyogU29tZSBzeXN0ZW0gY2FsbHMgaGF2ZSB0d28gcmVzdWx0cy4gICovCi0gIGxvbmcgcmVzdWx0MjsKLSAgLyogVGhlIHRhcmdldCdzIGVycm5vIHZhbHVlLCBvciAwIGlmIHN1Y2Nlc3MuCi0gICAgIFRoaXMgaXMgY29udmVydGVkIHRvIHRoZSB0YXJnZXQncyB2YWx1ZSB3aXRoIGhvc3RfdG9fdGFyZ2V0X2Vycm5vLiAgKi8KLSAgaW50IGVycmNvZGU7Ci0KLSAgLyogV29ya2luZyBzcGFjZSB0byBiZSB1c2VkIGJ5IG1lbW9yeSByZWFkL3dyaXRlIGNhbGxiYWNrcy4gICovCi0gIFBUUiBwMTsKLSAgUFRSIHAyOwotICBsb25nIHgxLHgyOwotCi0gIC8qIENhbGxiYWNrcyBmb3IgcmVhZGluZy93cml0aW5nIG1lbW9yeSAoZS5nLiBmb3IgcmVhZC93cml0ZSBzeXNjYWxscykuCi0gICAgID8/PyBsb25nIG9yIHVuc2lnbmVkIGxvbmcgbWlnaHQgYmUgYmV0dGVyIHRvIHVzZSBmb3IgdGhlIGBjb3VudCcKLSAgICAgYXJndW1lbnQgaGVyZS4gIFdlIG1pbWljIHNpbV97cmVhZCx3cml0ZX0gZm9yIG5vdy4gIEJlIGNhcmVmdWwgdG8KLSAgICAgdGVzdCBhbnkgY2hhbmdlcyB3aXRoIC1XYWxsIC1XZXJyb3IsIG1peGVkIHNpZ25lZCBjb21wYXJpc29ucwotICAgICB3aWxsIGdldCB5b3UuICAqLwotICBpbnQgKCpyZWFkX21lbSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqIC8qY2IqLywgc3RydWN0IGNiX3N5c2NhbGwgKiAvKnNjKi8sCi0JCQkgICB1bnNpZ25lZCBsb25nIC8qdGFkZHIqLywgY2hhciAqIC8qYnVmKi8sCi0JCQkgICBpbnQgLypieXRlcyovKSk7Ci0gIGludCAoKndyaXRlX21lbSkgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqIC8qY2IqLywgc3RydWN0IGNiX3N5c2NhbGwgKiAvKnNjKi8sCi0JCQkgICAgdW5zaWduZWQgbG9uZyAvKnRhZGRyKi8sIGNvbnN0IGNoYXIgKiAvKmJ1ZiovLAotCQkJICAgIGludCAvKmJ5dGVzKi8pKTsKLQotICAvKiBGb3Igc2FuaXR5IGNoZWNraW5nLCBzaG91bGQgYmUgbGFzdCBlbnRyeS4gICovCi0gIGludCBtYWdpYzsKLX0gQ0JfU1lTQ0FMTDsKLQotLyogTWFnaWMgbnVtYmVyIHNhbml0eSBjaGVja2VyLiAgKi8KLSNkZWZpbmUgQ0JfU1lTQ0FMTF9NQUdJQyAweDEyMzQ0MzIxCi0KLS8qIE1hY3JvIHRvIGluaXRpYWxpemUgQ0JfU1lTQ0FMTC4gIENhbGxlZCBmaXJzdCwgYmVmb3JlIGZpbGxpbmcgaW4KLSAgIGFueSBmaWVsZHMuICAqLwotI2RlZmluZSBDQl9TWVNDQUxMX0lOSVQoc2MpIFwKLWRvIHsgXAotICBtZW1zZXQgKChzYyksIDAsIHNpemVvZiAoKihzYykpKTsgXAotICAoc2MpLT5tYWdpYyA9IENCX1NZU0NBTExfTUFHSUM7IFwKLX0gd2hpbGUgKDApCi0MCi0vKiBSZXR1cm4gY29kZXMgZm9yIHZhcmlvdXMgaW50ZXJmYWNlIHJvdXRpbmVzLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgQ0JfUkNfT0sgPSAwLAotICAvKiBnZW5lcmljIGVycm9yICovCi0gIENCX1JDX0VSUiwKLSAgLyogZWl0aGVyIGZpbGUgbm90IGZvdW5kIG9yIG5vIHJlYWQgYWNjZXNzICovCi0gIENCX1JDX0FDQ0VTUywKLSAgQ0JfUkNfTk9fTUVNCi19IENCX1JDOwotCi0vKiBSZWFkIGluIHRhcmdldCB2YWx1ZXMgZm9yIHN5c3RlbSBjYWxsIG51bWJlcnMsIGVycm5vIHZhbHVlcywgc2lnbmFscy4gICovCi1DQl9SQyBjYl9yZWFkX3RhcmdldF9zeXNjYWxsX21hcHMgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBjaGFyICopKTsKLQotLyogVHJhbnNsYXRlIHRhcmdldCB0byBob3N0IHN5c2NhbGwgZnVuY3Rpb24gbnVtYmVycy4gICovCi1pbnQgY2JfdGFyZ2V0X3RvX2hvc3Rfc3lzY2FsbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCB0byB0YXJnZXQgZXJybm8gdmFsdWUuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X2Vycm5vIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSB0YXJnZXQgdG8gaG9zdCBvcGVuIGZsYWdzLiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9vcGVuIFBBUkFNUyAoKGhvc3RfY2FsbGJhY2sgKiwgaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSB0YXJnZXQgc2lnbmFsIG51bWJlciB0byBob3N0LiAgKi8KLWludCBjYl90YXJnZXRfdG9faG9zdF9zaWduYWwgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBpbnQpKTsKLQotLyogVHJhbnNsYXRlIGhvc3Qgc2lnbmFsIG51bWJlciB0byB0YXJnZXQuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X3NpZ25hbCBQQVJBTVMgKChob3N0X2NhbGxiYWNrICosIGludCkpOwotCi0vKiBUcmFuc2xhdGUgaG9zdCBzdGF0IHN0cnVjdCB0byB0YXJnZXQuCi0gICBJZiBzdGF0IHN0cnVjdCBwdHIgaXMgTlVMTCwganVzdCBjb21wdXRlIHRhcmdldCBzdGF0IHN0cnVjdCBzaXplLgotICAgUmVzdWx0IGlzIHNpemUgb2YgdGFyZ2V0IHN0YXQgc3RydWN0IG9yIDAgaWYgZXJyb3IuICAqLwotaW50IGNiX2hvc3RfdG9fdGFyZ2V0X3N0YXQgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqLCBQVFIpKTsKLQotLyogUGVyZm9ybSBhIHN5c3RlbSBjYWxsLiAgKi8KLUNCX1JDIGNiX3N5c2NhbGwgUEFSQU1TICgoaG9zdF9jYWxsYmFjayAqLCBDQl9TWVNDQUxMICopKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nIGIvaW5jbHVkZS9jb2ZmL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjOTk0Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsODA3ICswLDAgQEAKLVdlZCBKdW4gIDIgMTg6MDg6MTggMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoQkVPU19FWEVfSU1BR0VfQkFTRSwgQkVPU19ETExfSU1BR0VfQkFTRSk6IE5ldy4KLQotTW9uIE1heSAxNyAxMzozNTozNSAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogY29mZi9hcm0uaCAoRl9QSUMsIEZfQVJNXzIsIEZfQVJNXzJhLCBGX0FSTV8zLCBGX0FSTV8zTSwKLQlGX0FSTV80LCBGX0FSTV80VCwgRl9BUENTMjYpOiBDaGFuZ2VkIHZhbHVlcyB0byBkaXN0aW5ndWlzaAotCUZfQVJNXzJhLCBGX0FSTV8zTSwgRl9BUk1fNFQuCi0KLTE5OTktMDUtMTUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKElNQUdFX1JFTF9NQ09SRV9SVkEpOiBEZWZpbmUuCi0KLTE5OTktMDQtMjEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG1jb3JlLmggKEdFVF9MSU5FTk9fTE5OTyk6IE5ldyBtYWNyby4KLQkoUFVUX0xJTkVOT19MTk5PKTogTmV3IG1hY3JvLgotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS5oOiBOZXcgaGVhZGVyIGZpbGUuICBEZWZpbmVzIGZvciBNb3Rvcm9sbGEncyBNQ29yZQotCXByb2Nlc3Nvci4gCi0KLVN1biBEZWMgIDYgMjE6MzY6MzcgMTk5OCAgTWFyayBFbGJyZWNodCAgPHNub3diYWxsM0B1c2EubmV0PgotCi0JKiBpbnRlcm5hbC5oIChDX1dFQUtFWFQpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMjcgMTM6MzU6MzUgMTk5OSAgU3RhbiBDb3ggIDxzY294QGN5Z251cy5jb20+Ci0KLQkqIGNvZmYvYXJtLmggKEZfUElDX0lOVCwgRl9BUk1fMiwgRl9BUk1fMywgRl9BUk1fNCwgRl9BUENTMjYpOgotCUNoYW5nZWQgdmFsdWVzIHRvIGF2b2lkIGNsYXNoaW5nIHdpdGggSU1BR0VfRklMRV8qIGNvZmYgaGVhZGVyCi0JZmxhZyB2YWx1ZXMuCi0JCi1XZWQgQXByICAxIDE2OjA2OjE1IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IERvY3VtZW50IG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIFRodW1iIHN5bWJvbAotCXR5cGVzLiAKLQotRnJpIE1hciAyNyAxNzoxNjo1NyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKElTUFRSLCBJU0ZDTiwgSVNBUlkpOiBBZGQgY2FzdHMgdG8gdW5zaWduZWQgbG9uZy4KLQotTW9uIEZlYiAgMiAxNzoxMDozOCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiB0aWMzMC5oOiBOZXcgZmlsZS4KLQotRnJpIERlYyAxMiAxMTo0OTowNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoUl9NUFBDUjE1Vyk6IE5ldyByZWxvY2F0aW9uIHR5cGUsIGZvciAxNSBiaXQgUEMgcmVsYXRpdmUKLQlvZmZzZXRzLgotCi1UdWUgRGVjICAyIDEwOjIxOjQwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oIChDT0ZGQVJNKTogTmV3IGRlZmluZS4KLQotU2F0IE5vdiAyMiAxNToxMDoxNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChDX1RIVU1CRVhURlVOQywgQ19USFVNQlNUQVRGVU5DKTogQ29uc3RhbnRzIHRvCi0JZGVmaW5lIHN0YXRpYyBhbmQgZXh0ZXJuYWwgZnVuY3Rpb25zLgotCi0JKiBhcm0uaDogQWRkIGJpdHMgdG8gc3VwcG9ydCBQSUMgYW5kIEFQQ1MtRkxPQVQgdHlwZSBiaW5hcmllcywKLQl3aGVuIGltcGxlbWVudGVkLgotCi1GcmkgT2N0ICAzIDE0OjI1OjE3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChSX1BQTDE2Qik6IE1ha2UgY29uc3RhbnQgdXBwZXJjYXNlIGZvciBjb25zaXN0ZW5jeS4KLQotVHVlIEp1bCAyMiAxODoxODo1OCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGdvMzJleGUuaDogTmV3IGZpbGUuCi0KLVR1ZSBKdWwgIDggMTI6MjM6NTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX1RBUkdFVF9JRCk6IEFkZCBkZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfZmlsZWhkcik6IEFkZCBmX3RhcmdldF9pZCBmaWVsZC4KLQotVHVlIEp1biAgMyAxNjo0NDoxOCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oOiBBZGQgc3RvcmFnZSBjbGFzc2VzIGZvciBUaHVtYiBzeW1ib2xzCi0KLU1vbiBNYXkgMjYgMTQ6MDc6NTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChSX1BQTDE2Qik6IENvcnJlY3QgdmFsdWUuCi0KLVNhdCBNYXkgIDMgMDg6MjQ6NTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKENfVUVYVCwgQ19TVEFUTEFCLCBDX0VYVExBQiwgQ19TWVNURU0pOgotCU5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFRJYzgwLgotCi1GcmkgQXByIDE4IDExOjUyOjU1IDE5OTcgIE5pa2xhcyBIYWxscXZpc3QgIDxuaWtsYXNAYXBwbGkuc2U+Ci0KLQkqIGFscGhhLmggKEFMUEhBX0VDT0ZGX0JBRE1BRyk6IFJlY29nbml6ZSAqQlNEL2FscGhhIG1hZ2ljIHRvby4KLQkoQUxQSEFfUl9MSVRFUkFMU0xFQVpZKTogRGVmaW5lLgotCSogZWNvZmYuaCAoQUxQSEFfTUFHSUNfQlNEKTogRGVmaW5lLgotCi1XZWQgSmFuIDI5IDExOjMxOjUxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChSX0lQUjEzLCBSX0FMSUdOKTogRGVmaW5lLgotCi1Nb24gSmFuIDI3IDEzOjM0OjMwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoUl9JUFJNRUQsIFJfT1BUQ0FMTCwgUl9PUFRDQUxMWCk6IE1vdmUgZGVmaW5pdGlvbnMKLQlmcm9tIGhlcmUuLi4KLQkqIGk5NjAuaCAoUl9JUFJNRUQsIFJfT1BUQ0FMTCwgUl9PUFRDQUxMWCk6IC4uLnRvIGhlcmUuCi0KLVdlZCBKYW4gMjIgMjA6MTA6NDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwTUFHSUMpOiBSZW5hbWVkIHRvIFRJQzgwX0FPVVRIRFJfTUFHSUMuCi0KLUZyaSBEZWMgMjcgMjI6MDU6NDUgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmg6IE5ldyBmaWxlIGZvciBUSWM4MCBzdXBwb3J0LgotCi1UaHUgRGVjIDE5IDE2OjE4OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJtLmggKF9MSVQpOiBEZWZpbmUuCi0KLUZyaSBKdW4gMjggMTI6NTQ6MzggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwZS5oIChGSUxIU1opOiBEZWZpbmUuCi0KLVdlZCBKdW4gMjYgMTY6MjQ6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBBbGwgZmlsZXM6IERlZmluZSBGSUxIU1osIEFPVVRTWiwgQU9VVEhEUlNaLCBTQ05IU1osIFNZTUVTWiwKLQlBVVhFU1osIExJTkVTWiwgUkVMU1ogYXMgbnVtZXJpYyBjb25zdGFudHMgcmF0aGVyIHRoYW4gdXNlcyBvZgotCXNpemVvZi4gIERlZmluZSBBT1VUSERSU1ogaW4gYWxsIGZpbGVzLgotCSogcGUuaCAoQU9VVFNaKTogRGVmaW5lIGJ5IGFkZGluZyB0byBBT1VUSERSU1ouCi0KLUZyaSBKdW4gMjEgMTE6MTc6NDYgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IEFkZCBkZWNsYXJhdGlvbnMgZm9yIHJlbG9jYXRpb24gdHlwZXMgYWRkZWQgZm9yIEFscGhhCi0gCU9TRi8xIDMuMC4KLQotVHVlIEp1biAxOCAxNjowNDoyOSAxOTk2ICBKZWZmcmV5IEEuIExhdyAgPGxhd0BydGwuY3lnbnVzLmNvbT4KLQotCSogaDgzMDAuaCAoSDgzMDBTTUFHSUMpOiBEZWZpbmUuCi0JKEg4MzAwU0JBRE1BRyk6IERlZmluZS4KLQotTW9uIEp1biAxMCAxMTo1MzoyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfQkNDX0lOViwgUl9KTVBfREVMKTogTmV3IHJlbG9jYXRpb25zIGZvcgotCXJlbGF4aW5nIGluIHRoZSBIOC8zMDAgc2VyaWVzLgotCi1UaHUgTWF5IDE2IDE1OjQ5OjIyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2guaCAoUl9TSF9DT0RFLCBSX1NIX0RBVEEsIFJfU0hfTEFCRUwpOiBEZWZpbmUuCi0KLVR1ZSBNYXkgIDcgMDA6MzY6MzkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0pNUEwyKTogUmVuYW1lZCBmcm9tIFJfSk1QTF9COCB0byBiZQotCWNvbnNpc3RlbnQgd2l0aCBvdGhlciBzaW1pbGFyIHJlbG9jcy4KLQotCSogaW50ZXJuYWwuaCAoSDgvMzAwIHNwZWNpZmljIHJlbG9jcyk6IEFkZCBjb21tZW50cyBiZXR0ZXIKLQlleHBsYWluaW5nIHdoYXQgZWFjaCByZWxvYyBpcyB1c2VkIGZvci4KLQkoUl9NT1YxNkIxLCBSX01PVjE2QjIpOiBSZW5hbWVkIGZyb20gUl9NT1ZCMSBhbmQgUl9NT1ZCMi4KLQkoUl9NT1YyNEIxLCBSX01PVjI0QjIpOiBSZW5hbWVkIGZyb20gUl9NT1ZMQjEgYW5kIFJfTU9WTEIyLgotCShSX01PVkwxLCBSX01PVkwyKTogTmV3IHJlbG9jcy4KLQkKLUZyaSBNYXkgIDMgMTM6MDE6MTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX1BDUldPUkRfQik6IERlZmluZSBmb3IgdGhlIGg4MzAwIHJlbGF4aW5nCi0JbGlua2VyLgotCi1XZWQgTWF5ICAxIDE5OjIxOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoU0NOTk1MRU4pOiBEZWZpbmUuCi0JKHN0cnVjdCBpbnRlcm5hbF9zY25oZHIpOiBVc2UgU0NOTk1MRU4gZm9yIHNfbmFtZSBmaWVsZC4KLQotRnJpIE1hciAyOSAxMzo0MToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBlLmg6IERlZmluZSBJTUFHRV9DT01EQVQgY29kZXMuCi0KLVdlZCBNYXIgMjcgMTc6Mjk6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhcm0uaCAodW5pb24gZXh0ZXJuYWxfYXV4ZW50KTogQWRkIHhfY2hlY2tzdW0sIHhfYXNzb2NpYXRlZCwgYW5kCi0JeF9jb21kYXQgZmllbGRzIHRvIHhfc2NuIHN0cnVjdC4KLQkqIGkzODYuaCAodW5pb24gZXh0ZXJuYWxfYXV4ZW50KTogTGlrZXdpc2UuCi0JKiBwb3dlcnBjLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IExpa2V3aXNlLgotCSogaW50ZXJuYWwuaCAodW5pb24gaW50ZXJuYWxfYXV4ZW50KTogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjEgMTY6MjU6NTcgMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2ZpbmRfbGluZSk6IEFkZCBjYWNoaW5nIGZpZWxkcy4KLQotVGh1IE1hciAxNCAxNToyMjo0NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKFJfTUVNX0lORElSRUNUKTogTmV3IHJlbG9jIGZvciB0aGUgaDgzMDAuCi0gCi1GcmkgRmViICA5IDEwOjQ0OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXV4LWNvZmYuaDogUmVuYW1lIGZyb20gYXV4LmgsIHRvIGF2b2lkIHByb2JsZW1zIG9uIGhhcGxlc3MgRE9TCi0Jc3lzdGVtcyB3aGljaCB0aGluayB0aGF0IGF1eCBpcyBhIGNvbSBwb3J0LgotCi1Nb24gRmViICA1IDE4OjM1OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC5oIChGX0k5NjBIWCk6IERlZmluZS4KLQotV2VkIEphbiAzMSAxMzoxMTo1NCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYXV4Lmg6IE5ldyBmaWxlLgotCSogaW50ZXJuYWwuaCwgbTY4ay5oOiBQcm90ZWN0IGFnYWluc3QgbXVsdGlwbGUgaW5jbHVzaW9uLgotCi1XZWQgTm92IDIyIDEzOjQ4OjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZWNvZmYuaCAoX1JDT05TVCwgU1RZUF9SQ09OU1QsIFJFTE9DX1NFQ1RJT05fUkNPTlNUKTogRGVmaW5lLgotCShOVU1fUkVMT0NfU0VDVElPTlMpOiBVcGRhdGUuCi0JKiBzeW1jb25zdC5oIChzY1JDb25zdCk6IERlZmluZS4KLQotVHVlIE5vdiAxNCAxODo1NDoyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKENfTlRfV0VBSyk6IERlZmluZS4KLQotVGh1IE5vdiAgOSAxNDowODozMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChTVFlQX09WUkZMTyk6IERlZmluZS4KLQotVHVlIE5vdiAgNyAxNDozODo0NSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogY29mZi9wb3dlcnBjLmggKElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyk6IEFkZGVkIGRlZmluZS4KLQkqIGNvZmYvcGUuaDogQWRkZWQgZGVmaW5lcyBmb3IgZmlsZSBsZXZlbCBmbGFncwotCi1Nb24gTm92ICA2IDE3OjI4OjAxIDE5OTUgIEhhcnJ5IERvbGFuICA8ZG9sYW5Ac3NkLmludGVsLmNvbT4KLQotCSogaTg2MC5oOiBOZXcgZmlsZSwgYmFzZWQgb24gaTM4Ni5oLgotCi1XZWQgTm92ICAxIDE1OjI1OjE4IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBtNjhrLmggKFBBR0VNQUdJQ0VYRUNTV0FQUEVEKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1NXQVBQRUQpOiBEZWZpbmUuCi0JKFBBR0VNQUdJQ1BFWEVDVFNITElCKTogRGVmaW5lLgotCShQQUdFTUFHSUNQRVhFQ1BBR0VEKTogRGVmaW5lLgotCShfQ09NTUVOVCk6IERFRklORS4KLQkqIG04OGsuaCAoX0NPTU1FTlQpOiBEZWZpbmUuCi0KLVdlZCBPY3QgMTggMTg6MzY6MTkgMTk5NSAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc3ltLmg6ICNpZiAwJ2Qgb3V0IHJ1bnRpbWVfcGRyIHN0cnVjdCBiZWNhdXNlIGl0IGNob2tlcyAKLQlWaXN1YWwgQysrIGFuZCB0aGVyZSBhcmVuJ3QgYW55IHJlZmVyZW5jZXMgdG8gaXQgZWxzZXdoZXJlIGluIGdkYi4KLQotTW9uIE9jdCAxNiAxMToxMjoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHJzNjAwMC5oIChTTUFMTF9BT1VUU1opOiBEZWZpbmUuCi0KLQkqIGludGVybmFsLmggKFhNQ19URCk6IERlZmluZS4KLQotVHVlIE9jdCAxMCAxODo0MTowMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyKTogQWRkIG9fY3B1dHlwZSBmaWVsZC4KLQkqIHJzNjAwMC5oIChBT1VUSERSKTogUmVuYW1lIG9fcmVzdjEgdG8gb19jcHV0eXBlLgotCi1Nb24gT2N0ICA5IDE0OjQ1OjQ2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcnM2MDAwLmggKEFPVVRIRFIpOiBBZGQgb19tYXhkYXRhIGZpZWxkLiAgQWRkIGNvbW1lbnRzLgotCShfUEFELCBfTE9BREVSKTogRGVmaW5lLgotCShTVFlQX0xPQURFUik6IERlZmluZS4KLQkqIGludGVybmFsLmggKHN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyKTogQWRkIG9fbWF4ZGF0YSBmaWVsZC4KLQotVGh1IE9jdCAgNSAxMDowMjo1NyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVjb2ZmLmg6IERlZmluZSBzZWN0aW9uIG5hbWUgbWFjcm9zIGFuZCBTVFlQIG1hY3JvcyBmb3IgdmFyaW91cwotCUFscGhhIHNlY3Rpb25zOiAuZ290LCAuaGFzaCwgLmR5bnN5bSwgLmR5bnN0ciwgLnJlbC5keW4sIC5jb25mbGljLAotCS5jb21tZW50LCAubGlibGlzdCwgLmR5bmFtaWMuCi0KLVdlZCBPY3QgIDQgMTA6NTY6MzUgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIHBlLmg6IE1vdmVkIERPU01BR0lDIGFuZCBOVF9TSUdOQVRVUkUgZGVmaW5lcyBoZXJlCi0JKiBwb3dlcnBjLmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JQWxzbyByZW1vdmVkIG90aGVyIHVudXNlZCBkZWZpbmVzICh2YXJpb3VzIE1BR0lDIG9uZXMpCi0JKiBpMzg2Lmg6IHJlbW92ZWQgRE9TTUFHSUMsIE5UX1NJR05BVFVSRSwgYW5kIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBhcm0uaDogcmVtb3ZlZCBET1NNQUdJQywgTlRfU0lHTkFUVVJFLCBhbmQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGFwb2xsby5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogYWxwaGEuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIGg4NTAwLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBoODMwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogaTk2MC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbTg4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogd2UzMmsuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHJzNjAwMC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbWlwcy5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogbTY4ay5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCSogejhrLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiB3NjUuaDogcmVtb3ZlZCB1bnVzZWQgREVGQVVMVF8qIGRlZmluZXMKLQkqIHNwYXJjLmg6IHJlbW92ZWQgdW51c2VkIERFRkFVTFRfKiBkZWZpbmVzCi0JKiBzaC5oOiByZW1vdmVkIHVudXNlZCBERUZBVUxUXyogZGVmaW5lcwotCi1GcmkgU2VwIDI5IDA4OjQwOjA4IDE5OTUgIEtpbSBLbnV0dGlsYSAgPGtya0BjeWdudXMuY29tPgotCi0JKiBwb3dlcnBjLmg6IFJlZm9ybWF0dGVkIHRvIEdOVSBjb2RpbmcgY29udmVudGlvbnMuCi0KLVdlZCBTZXAgMjcgMDY6NTA6NTAgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQG5lbGxpZT4KLQotCSogcGUuaDogYWRkZWQgZGVmaW5lcyBmb3IgbW9yZSBzZWN0aW9uIGNoYXJhY3RlcmlzdGljcwotCSogcG93ZXJwYy5oIChuZXcgZmlsZSk6IGJhc2UgY29mZiBkZWZpbml0aW9ucyBmb3IgcHBjIFBFCi0KLVR1ZSBTZXAgMTIgMTI6MDg6MjAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfc3ltZW50KTogQ2hhbmdlIG5fbnVtYXV4IGZpZWxkIGZyb20KLQljaGFyIHRvIHVuc2lnbmVkIGNoYXIuCi0KLUZyaSBTZXAgIDEgMTU6Mzk6MzYgMTk5NSAgS2F6dW1vdG8gS29qaW1hICA8a2tvamltYUBpbmZvLmthbmFnYXdhLXUuYWMuanA+Ci0KLQkqIG1pcHMuaCAoc3RydWN0IHJwZHJfZXh0KTogRGVmaW5lLgotCi1UaHUgQXVnIDMxIDE2OjUxOjUwIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKGludGVybmFsX2FvdXRoZHIsIGludGVybmFsX2ZpbGVoZHIpOgotCWRvbid0IGluZGlyZWN0IHRoZSBwZSBzdHVmZi4KLQotVHVlIEF1ZyAyOSAxNDoxNjowNyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpMzg2LmggKE5UX0RFRl9SRVNFUlZFLCBOVF9ERUZfQ09NTUlUKTogTWFrZSB0aGUgc2FtZQotCWFzICd0aGUgb3RoZXInIGNvbXBpbGVyLgotCSogaW50ZXJuYWwuaCAoTlRfSU1BR0VfQkFTRSk6IERlbGV0ZWQuCi0JKE5UX0VYRV9JTUFHRV9CQVNFLCBOVF9ETExfSU1BR0VfQkFTRSk6IE5ldy4KLQkoUEVfREVGX1NFQ1RJT05fQUxJR05NRU5ULCBQRV9ERUZfRklMRV9BTElHTk1FTlQpOiBOZXcuCi0JKFJfSU1BR0VCQVNFKTogTmV3LgotCi1Nb24gQXVnIDIxIDE4OjEyOjE5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IChpbnRlcm5hbF9maWxlaGRyKTogTW92ZWQgUEUgc3R1ZmYgaW50bwotCWludGVybmFsX2V4dHJhX3BlX2ZpbGVoZHIuCi0JKGludGVybmFsX2FvdXRoZHIpOiBNb3ZlZCBQRSBzdHVmZiBpbnRvCi0JaW50ZXJhbmxfZXh0cmFfcGVfYW91dGhkci4KLQotTW9uIEp1bCAyNCAxNDowNTozOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmg6IE1vdmUgUl9TSF8qIHJlbG9jcyBmcm9tIGhlcmUuLi4KLQkqIHNoLmg6IC4uLnRvIGhlcmUuCi0JKFJfU0hfU1dJVENIMTYsIFJfU0hfU1dJVENIMzIpOiBEZWZpbmUuCi0JKFJfU0hfVVNFUywgUl9TSF9DT1VOVCwgUl9TSF9BTElHTik6IERlZmluZS4KLQotVGh1IEp1biAyOSAwMDowNDoyNSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChOVF9ERUZfUkVTRVJWRSwgTlRfREVGX0NPTU1JVCk6IEluY3JlYXNlIGEgbG90LgotCi1UdWUgTWF5IDE2IDE1OjA4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IERlbGV0ZQotCi1UdWUgTWF5IDE2IDE1OjA4OjIwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKE5UX3N1YnN5c3RlbSwgTlRfc3RhY2tfaGVhcCk6IE5vdyBleHRlcm4uCi0KLVR1ZSBGZWIgMTQgMTc6NTk6MzcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlY29mZi5oIChzdHJ1Y3QgZWNvZmZfZmRydGFiX2VudHJ5KTogRGVmaW5lLgotCShzdHJ1Y3QgZWNvZmZfZmluZF9saW5lKTogRGVmaW5lLgotCi1TYXQgRmViICA0IDE0OjM4OjAzIDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQHBpc3Rvbi5jcy5hcml6b25hLmVkdT4KLQotCSogc3ltLmggKHN0cnVjdCBwZHIpOiBmaWVsZCAicHJvZiIgYWRkZWQuCi0KLQkqIGFscGhhLmggKFBEUl9CSVRTMV9QUk9GXyopOiBhZGRlZCwgbWFjcm9zIGZvciBQRFJfQklUUypfUkVTRVJWRURfKgotCXVwZGF0ZWQgYWNjb3JkaW5nbHkuCi0KLVN1biBKYW4gMTUgMTg6Mzg6MzMgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIHc2NS5oOiBOZXcgZmlsZS4KLQotV2VkIE5vdiAyMyAyMjo0MzozOCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBzaC5oIChTSF9BUkNIX01BR0lDX0JJRywgU0hfQVJDSF9NQUdJQ19MSVRUTEUpOiBOZXcuCi0JKFNIQkFETUFHKTogQ2hhbmdlZCB0byBzdWl0LgotCi1UdWUgSnVsIDI2IDE3OjQ2OjA4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGk5NjAuaCAoRl9JOTYwSlgpOiBOZXcgbWFjcm8uCi0KLVdlZCBKdWwgIDYgMDA6NDg6NTcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbHBoYS5oOiAgQWRkIGRlZmluaXRpb25zIGZvciBhbHBoYSBmaWxlIGhlYWRlciBmbGFncywgZW5jb2RpbmcKLQl0aGUgb2JqZWN0IHR5cGUgb2YgdGhlIGZpbGUuCi0KLU1vbiBKdW4gMjAgMTM6NDc6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9zd2FwX3Rpcl9pbik6IFJlbW92ZSBkZWNsYXJhdGlvbi4KLQkoZWNvZmZfc3dhcF90aXJfb3V0KTogTGlrZXdpc2UuCi0JKGVjb2ZmX3N3YXBfcm5keF9pbiwgZWNvZmZfc3dhcF9ybmR4X291dCk6IExpa2V3aXNlLgotCShzdHJ1Y3QgZWNvZmZfZGVidWdfc3dhcCk6IEFkZCBuZXcgZmllbGRzOiBzd2FwX3Rpcl9pbiwKLQlzd2FwX3JuZHhfaW4sIHN3YXBfdGlyX291dCwgc3dhcF9ybmR4X291dCwgcmVhZF9kZWJ1Z19pbmZvLgotCi1TdW4gSnVuIDEyIDAzOjUxOjUyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogc3ltY29uc3QuaDogIFBpY2sgdXAgU0dJIGRlZmluZSBmb3Igc3RJbmRpcmVjdC4KLQotRnJpIEFwciAyMiAxMzowNToyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFJFR0lORk8pOiBEb24ndCBkZWZpbmUuCi0JKHN0cnVjdCBlY29mZl9yZWdpbmZvKTogRG9uJ3QgZGVmaW5lLgotCi0JKiBzaC5oIChTSF9BUkNIX01BR0lDKTogUmVuYW1lIGZyb20gU0hNQUdJQy4gIFNITUFHSUMgaXMgdXNlZCBieQotCXNldmVyYWwgdGFyZ2V0cyB0byBtZWFuIGEgc2hhcmVkIGxpYnJhcnkuCi0JKFNIQkFETUFHKTogQ29ycmVzcG9uZGluZyBjaGFuZ2UuCi0KLVRodSBBcHIgMTQgMTM6MDA6NTMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKFJFTE9DX0JJVFMzX1RZUEVfQklHKTogQ2hhbmdlZCBmcm9tIDB4MWUgdG8gMHgzZS4KLQkoUkVMT0NfQklUUzNfVFlQRUhJX0xJVFRMRSk6IERlZmluZS4KLQkoUkVMT0NfQklUUzNfVFlQRUhJX1NIX0xJVFRMRSk6IERlZmluZS4KLQkoTUlQU19SX1BDUkVMMTYpOiBDaGFuZ2UgdmFsdWUgZnJvbSA4IHRvIDEyIHRvIG1hdGNoIElyaXggNC4KLQkoTUlQU19SX1JFTEhJKTogRGVmaW5lLgotCShNSVBTX1JfUkVMTE8pOiBEZWZpbmUuCi0JKE1JUFNfUl9TV0lUQ0gpOiBDaGFuZ2UgdmFsdWUgZnJvbSA5IHRvIDIyLgotCi1UaHUgQXByICA3IDE0OjE5OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNSVBTX1JfU1dJVENIKTogRGVmaW5lLgotCi1UaHUgTWFyIDMxIDE5OjI4OjMzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKGludGVybmFsX2FvdXRoZHIpOiBBZGRlZCBjb21tZW50cyBmb3IgQXBvbGxvIGZpZWxkcy4KLQotVGh1IE1hciAzMSAxNjoyODowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFNUWVBfRUNPRkZfTElCKTogRGVmaW5lIGFzIHVzZWQgb24gSXJpeCA0LgotCi1GcmkgTWFyIDI1IDE3OjE2OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8pOiBBZGQgYWRqdXN0IGZpZWxkLgotCShzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0KTogRGVmaW5lLgotCi1UdWUgTWFyIDIyIDEzOjIyOjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChNSVBTX1JfUENSRUwxNik6IERlZmluZS4KLQotU2F0IEZlYiAyNiAxMDoyNjozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmg6IEFkZCBjYXN0cyB0byBhdm9pZCB3YXJuaW5ncyBmcm9tIFNWUjQgY2MuCi0KLU1vbiBGZWIgMjEgMDk6NDg6NDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIHN5bS5oIChzdHJ1Y3QgcnVudGltZV9wZHIpOiBNYWtlIGZpZWxkIGFkciBiZmRfdm1hLCBub3QgdW5zaWduZWQKLQlsb25nLgotCShTWU1SKTogTWFrZSBmaWVsZCB2YWx1ZSBiZmRfdm1hLCBub3QgbG9uZy4KLQotRnJpIEZlYiAgNCAyMzozNTo1MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC5oIChTVFlQX0RFQlVHKTogRGVmaW5lLgotCi1XZWQgRmViICAyIDE0OjMxOjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAodW5pb24gaW50ZXJuYWxfYXV4ZW50KTogQ2hhbmdlIHhfY3NlY3QueF9zY25sZW4gaW50bwotCWEgdW5pb24gb2YgYSBsb25nIGFuZCBhIHBvaW50ZXIgdG8gYSBzeW1ib2wuICBYQ09GRiBzb21ldGltZXMgdXNlcwotCXRoaXMgZmllbGQgYXMgYSBzeW1ib2wgaW5kZXguCi0KLU1vbiBKYW4gMTAgMjM6NTQ6MjUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChlY29mZl9kZWJ1Z19pbmZvKTogUmVtb3ZlIGZpZWxkcyBsaW5lX2VuZCwKLQlleHRlcm5hbF9kbnJfZW5kLCBleHRlcm5hbF9wZHJfZW5kLCBleHRlcm5hbF9zeW1fZW5kLAotCWV4dGVybmFsX29wdF9lbmQsIGV4dGVybmFsX2F1eF9lbmQsIHNzX2VuZCwgZXh0ZXJuYWxfZmRyX2VuZC4KLQlSZXBsYWNlIGlmZGJhc2Ugd2l0aCBpZmRtYXAuCi0KLVdlZCBKYW4gIDUgMTc6MDU6MzYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKFNUWVBfRVhURU5ERVNDLCBTVFlQX0NPTU1FTlQsIFNUWVBfWERBVEEsIFNUWVBfUERBVEEpOgotCURlZmluZS4KLQotV2VkIEphbiAgNSAxNjo1ODoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKE5VTV9SRUxPQ19TRUNUSU9OUyk6IERlZmluZS4KLQotVHVlIERlYyAyMSAwOToyNDo1NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKHN0cnVjdCBleHRlcm5hbF9yZWxvYyk6IFJlbmFtZSBmaWVsZCByX2FkZGVuZCB0bwotCXJfb2Zmc2V0LgotCi1TYXQgRGVjIDExIDE2OjEyOjMyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChSX0RJU1A3LCBSX1NIX0lNTTE2KTogTmV3IHJlbG9jIHR5cGVzLgotCi1UdWUgTm92IDIzIDE0OjIzOjE5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBBZGRlZCAqX2VuZCBmaWVsZHMgZm9yIGFsbAotCXRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBwb2ludGVycy4KLQotCSogc3ltLmg6IE5hbWVkIHRoZSBFWFRSIHN0cnVjdHVyZSBlY29mZl9leHRyLgotCi1GcmkgTm92IDE5IDA4OjIxOjE4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkByb3Zlci5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChSRUxTWik6IFVzZSBjb3JyZWN0IHNpemUuCi0KLVdlZCBOb3YgMTcgMTc6MTg6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKHN0cnVjdCBlY29mZl9kZWJ1Z19pbmZvKTogRGVmaW5lLgotCi1UdWUgTm92ICAyIDE3OjU2OjU3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoc3RydWN0IGVjb2ZmX2RlYnVnX3N3YXApOiBEZWZpbmUuCi0KLVRodSBPY3QgMjggMTc6MDc6NTAgMTk5MyAgU3RhbiBTaGVicyAgKHNoZWJzQHJ0bC5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKEkzODZMWU5YTUFHSUMpOiBSZW5hbWUgdG8gTFlOWENPRkZNQUdJQy4KLQkqIG02OGsuaCAoTFlOWENPRkZNQUdJQyk6IERlZmluZS4KLQkqIHNwYXJjLmg6IE5ldyBmaWxlLgotCi1UdWUgT2N0IDE5IDE1OjM0OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaCAoZXh0ZXJuYWxfYW91dGhkcik6IFNwbGl0IGZvdXIgYnl0ZSBwYWRkaW5nIGZpZWxkIGludG8KLQl0d28gYnl0ZSBibGRyZXYgZmllbGQgYW5kIHR3byBieXRlIHBhZGRpbmcgZmllbGQuCi0KLQkqIGVjb2ZmLmggKF9MSVRBLCBfUERBVEEsIF9YREFUQSwgU1RZUF9MSVRBKTogRGVmaW5lZC4KLQotV2VkIE9jdCAxMyAxNTo1MjozNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCVN1biBPY3QgMTAgMTc6Mjc6MTAgMTk5MyAgVHJveSBSb2xsbyAodHJveUBjYm1lLnVuc3cuZWR1LmF1KQotCi0JKiBjb2ZmL2ludGVybmFsLmg6IEFkZGVkIG9fc3JpLCBvX2lubGliIGFuZCBvX3ZpZCBmb3IgQXBvbGxvcwotCQkJYXMgd2VsbCBhcyBSX0RJUjE2LgotCi0JKiBjb2ZmL2Fwb2xsby5oOiBOZXcgZmlsZQotCi1Nb24gT2N0IDExIDE3OjE2OjQ4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoUkVHSU5GTywgc3RydWN0IGVjb2ZmX3JlZ2luZm8pOiBEZWZpbmUuCi0KLVR1ZSBPY3QgIDUgMTA6NTI6NTMgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJzNjAwMC5oOiBDaGFuZ2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gY29tbWVudCB0byBvY3RhbAotCWVzY2FwZXMuCi0KLVR1ZSBTZXAgMjggMDM6Mjc6MDQgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBlY29mZi5oIChfRklOSSwgU1RZUF9FQ09GRl9GSU5JKTogIEFkZCB0byBzdXBwb3J0IC5maW5pIHNlY3Rpb24uCi0KLUZyaSBTZXAgMjQgMTE6NTM6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEJBRE1BRyk6IFJlY29nbml6ZSBNSVBTX01BR0lDX0xJVFRMRTMgYW5kIE1JUFNfTUFHSUNfQklHMy4KLQkqIGVjb2ZmLmg6IERlZmluZSBNSVBTX01BR0lDX0xJVFRMRTMgYW5kIE1JUFNfTUFHSUNfQklHMy4KLQotVGh1IFNlcCAyMyAyMTowNzoxNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChCQURNQUcpOiBSZWNvZ25pemUgTUlQU19NQUdJQ19MSVRUTEUyIGFuZCBNSVBTX01BR0lDX0JJRzIuCi0JKiBlY29mZi5oOiBEZWZpbmUgTUlQU19NQUdJQ19MSVRUTEUyIGFuZCBNSVBTX01BR0lDX0JJRzIuCi0KLVRodSBTZXAgMTYgMjA6Mjc6MjEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBzeW0uaCwgc3ltY29uc3QuaDogQWRkIGNvbW1lbnQgc3RhdGluZyB0aGVzZSBmaWxlcyBhcmUgbm90IHBhcnQKLQlvZiBHREIsIEdBUywgZXRjLiAgSW4gMTk5MSwgd2hlbiB3ZSBhc2tlZCBybXMgd2hldGhlciB3ZSBjb3VsZAotCWluY2x1ZGUgdGhlc2UgZmlsZXMgaW4gR0RCIChhbHRob3VnaCB0aGV5IGFyZSBjb3B5cmlnaHRlZCBieQotCXNvbWVvbmUgYmVzaWRlcyB0aGUgRlNGKSwgaGUgc2FpZCBpdCB3YXMgT0sgaWYgdGhleSB3ZXJlIG5vdAotCWNvbnNpZGVyZWQgcGFydCBvZiBHREIuCi0KLUZyaSBTZXAgMTAgMTc6NDA6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfUFVUX0FOWSk6IENhc3QgdmFsIGFyZ3VtZW50IHRvIGJmZF92bWEuCi0KLQkqIGFscGhhLmMgKGV4dGVybmFsX2FvdXRoZHIpOiBOZWVkIGZvdXIgYnl0ZXMgb2YgcGFkZGluZyBiZXR3ZWVuCi0JdnN0YW1wIGFuZCB0c2l6ZS4KLQotVHVlIFNlcCAgNyAxNDoyMDo0MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLmggKEFVWF9HRVRfQU5ZLCBBVVhfUFVUX0FOWSk6IENoYW5nZWQgdG8gcmVmbGVjdCBmdXJ0aGVyCi0JY2hhbmdlIGluIGJmZCBzd2FwcGluZyByb3V0aW5lIG5hbWVzLgotCi1UdWUgU2VwICA3IDEwOjE1OjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBlY29mZi5oIChBVVhfR0VUX0FOWSk6IENoYW5nZSBuYW1lIG9mIF9kb19nZXRiMzIgdG8gcmVmbGVjdCBiZmQKLQljaGFuZ2VzLgotCi1GcmkgQXVnIDEzIDE0OjMwOjMyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogZWNvZmYuaCAoUkVMT0NfU0VDVElPTl9OT05FKTogRGVmaW5lLgotCi1UaHUgQXVnIDEyIDExOjI0OjQyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYWxwaGEuaCAoc3RydWN0IGV4dGVybmFsX3JlbG9jKTogQWRkIHJfc3ltbmR4IGZpZWxkLgotCShSRUxTWik6IENvcnJlY3QuCi0JKFJFTE9DX0JJVFMqKTogQ29ycmVjdC4KLQkoQUxQSEFfUl8qKTogRGVmaW5lLgotCSogZWNvZmYuaCAoUkVMT0NfU0VDVElPTl97WERBVEEsUERBVEEsRklOSSxMSVRBLEFCU30pOiBEZWZpbmUuCi0JKHJfZXh0ZXJuKTogVW5kZWZpbmUuCi0JKiBpbnRlcm5hbC5oIChzdHJ1Y3QgaW50ZXJuYWxfcmVsb2MpOiBNYWtlIHJfdmFkZHIgYmZkX3ZtYSByYXRoZXIKLQl0aGFuIGxvbmcuICBBZGQgcl9leHRlcm4gZmllbGQuCi0KLQkqIGFscGhhLmggKFBEUl9CSVRTKik6IERlZmluZS4KLQkqIHN5bS5oIChQRFIpOiBHaXZlIGNvcnJlY3QgbmFtZXMgdG8gbmV3IGZpZWxkcy4KLQotCSogZWNvZmYuaDogTW92ZWQgTUlQUyByZWxvYyBkZWZpbml0aW9ucyBmcm9tIGhlcmUuLi4KLQkqIG1pcHMuaDogdG8gaGVyZS4KLQotVHVlIEF1ZyAgMyAxMToxNzo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGFscGhhLmg6IENvcnJlY3RlZCBleHRlcm5hbCBzeW1ib2xpYyBkZWJ1Z2dpbmcgc3RydWN0dXJlcyB0bwotCW1hdGNoIGFjdHVhbCB1c2FnZS4KLQkqIGludGVybmFsLmggKGludGVybmFsX2ZpbGVoZHIsIGludGVybmFsX2FvdXRoZHIsCi0JaW50ZXJuYWxfc2NuaGRyKTogQ2hhbmdlZCB0eXBlIG9mIHNvbWUgZmllbGRzIHRvIGJmZF92bWEgc28gdGhleQotCWNhbiBob2xkIDY0IGJpdHMuCi0JKiBzeW0uaCAoSERSUiwgRkRSLCBQRFIsIEVYVFIpOiBMaWtld2lzZS4KLQkoUERSKTogQWRkZWQgbmV3IGZpZWxkcyBmb3VuZCBvbiBBbHBoYS4KLQkqIHN5bWNvbnN0LmggKG1hZ2ljU3ltMik6IERlZmluZTsgbmV3IHZhbHVlIGZvdW5kIG9uIEFscGhhLgotCi0JKiBlY29mZi5oOiBOZXcgZmlsZS4KLQkqIGFscGhhLmgsIG1pcHMuaDogTW92ZWQgY29tbW9uIGluZm9ybWF0aW9uIGludG8gZWNvZmYuaC4gIE1vdmVkCi0JZXh0ZXJuYWwgc3RydWN0dXJlIGRlZmluaXRpb25zIGluIGZyb20gZWNvZmYtZXh0LmguCi0JKiBlY29mZi1leHQuaDogUmVtb3ZlZDsgaW5mb3JtYXRpb24gbm93IGluIGFscGhhLmggYW5kIG1pcHMuaC4KLQotU3VuIEp1bCAxOCAyMTo0Mzo1OSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AcnRsLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogUmVjb2duaXplIEkzODZQVFhNQUdJQy4KLQotRnJpIEp1bCAxNiAwOTo1NDozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTUlQU19BT1VUX3tPWn1NQUdJQyk6IFJlbmFtZWQgZnJvbSB7T1p9TUFHSUMuCi0KLVRodSBKdWwgMTUgMTI6MjM6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtODhrLmggKHVuaW9uIGV4dGVybmFsX2F1eGVudCk6IE1vdmUgeF9mY24gYmFjayBpbnNpZGUgeF9mY25hcnkuCi0JKHtHRVQsUFVUfV9GQ05fe0xOTk9QVFIsRU5ETkRYfSk6IEFkanVzdCBhY2NvcmRpbmdseS4KLQotU3VuIEp1bCAxMSAxODowMDoxOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBEZWZpbmUgTUM2OEtCQ1NNQUdJQy4KLQotVGh1IEp1biAxMCAxMTo0NjoyOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoX0lOSVQsIFNUWVBfTUlQU19JTklUKTogRGVmaW5lICh1c2VkIG9uIElyaXg0KS4KLQkoU1RZUF9PVEhFUl9MT0FEKTogRGVmaW5lIGFzIFNUWVBfTUlQU19JTklULgotCi1XZWQgSnVuICA5IDE1OjA5OjA5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChPTUFHSUMpOiBEZWZpbmUuCi0KLU1vbiBBcHIgMjYgMTg6MDQ6NDcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmgsIHNoLmg6IFN1cHBvcnQgZm9yIFNILgotCi1TYXQgQXByIDI0IDIxOjM0OjU5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBhMjlrLmg6IERlZmluZSBfTElULgotCi1GcmkgQXByIDIzIDE4OjQxOjIzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS5oOiBOZXcgZmlsZS4KLQotVGh1IEFwciAgOCAxMjozNjozNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKENfU0hBRE9XLCBDX1ZFUlNJT04pOiBDb3BpZWQgaW4gZnJvbSBtODhrLmguCi0JKiBtODhrLmgsIGkzODYuaCwgd2UzMmsuaDogRG9uJ3QgZGVmaW5lIGFsbCB0aGUgc3RvcmFnZSBjbGFzc2VzOwotCXRoZXkncmUgYWxyZWFkeSBpbiBpbnRlcm5hbC5oLgotCi1XZWQgQXByICA3IDExOjUxOjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBDaGFuZ2Ugbl9zY2xhc3MgdG8gdW5zaWduZWQgY2hhci4KLQlDaGFuZ2UgQ19FRkNOIHRvIDB4ZmYsIGNoYW5nZSBSUy82MDAwIGRieCBzeW1ib2xzCi0JdG8gbm8gbG9uZ2VyIGJlIHNpZ25lZC4KLQotRnJpIE1hciAxOSAxNDo1Mjo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQWRkIEg4LzUwMCByZWxvYyB0eXBlcy4KLQotV2VkIE1hciAxNyAwOTo0NjowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGVjb2ZmLWV4dC5oIChBVVhfUFVUX0FOWSk6IERvbid0IHVzZSB2b2lkIHZhbHVlcyBpbiBicmFuY2hlcyBvZgotCWNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0KLVRodSBNYXIgIDQgMTQ6MTI6MDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaCAoQVVYX0dFVF8qKTogUmV3cm90ZSB0byB1c2UgbmV3IG1hY3JvIEFVWF9HRVRfQU5ZLgotCShBVVhfUFVUXyopOiBOZXcgbWFjcm9zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFVWF9HRVQgbWFjcm9zLgotCShlY29mZl9zd2FwX3Rpcl9vdXQpOiBBZGRlZCBwcm90b3R5cGUuCi0KLQkqIG1pcHMuaCAoTl9CVE1BU0ssIE5fVE1BU0ssIE5fQlRTSEZULCBOX1RTSElGVCk6IERlZmluZTsgdGhlc2UKLQlhcmUgbmVlZGVkIHRvIGludGVycHJldCBnY2MgZGVidWdnaW5nIG91dHB1dC4KLQotVHVlIEZlYiAgOSAwNzo0MzoyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLmggKEJUWVBFLCBJU1BUUiwgSVNGQ04sIElTQVJZLCBERUNSRUYpOiBSZW1vdmVkCi0JbW9yZSBkZWZpbml0aW9ucyBkdXBsaWNhdGVkIGluIGludGVybmFsLmguCi0KLVdlZCBGZWIgIDMgMDk6MTg6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKFJFTE9DX0JJVFMzX1RZUEVfKik6IENvcnJlY3QgZm9yIGJpZyBlbmRpYW4gbWFjaGluZXMuCi0KLU1vbiBKYW4gMjUgMTE6MzU6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChpbnRlcm5hbF9hb3V0aGRyKTogQWRkZWQgYWRkaXRpb25hbCBmaWVsZHMgdXNlZCBvbmx5Ci0JYnkgTUlQUyBFQ09GRi4KLQotVGh1IEphbiAyMSAxMDoyODozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoQU9VVEhEUik6IEFkZGVkIGFkZGl0aW9uYWwgZmllbGRzIHVzZWQgYnkgRUNPRkYuCi0KLVR1ZSBKYW4gMTkgMTI6MjE6MTkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LmgsIHdlMzJrLmggKE5fKiwgVF8qLCBEVF8qKTogUmVtb3ZlZCBzdGlsbCBtb3JlIGRlZmluaXRpb25zCi0JZHVwbGljYXRlZCBpbiBpbnRlcm5hbC5oLgotCi0JKiBtaXBzLmggKFJFTE9DX1NFQ1RJT05fKiwgRUNPRkZfUl8qKTogRGVmaW5lZCBjb25zdGFudHMgZm9yIEVDT0ZGCi0JcmVsb2NzLgotCi1GcmkgSmFuIDE1IDE4OjE3OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6IEFkZGVkIHByb3RvdHlwZXMgZm9yIG5ldyBFQ09GRiBzd2FwcGluZyBmdW5jdGlvbnMuCi0JKG9wdF9leHQpOiBOZXcgc3RydWN0dXJlLgotCSogbWlwcy5oIChaTUFHSUMpOiBEZWZpbmVkIHRvIGJlIDA0MTMuCi0JKF9MSUIpOiBEZWZpbmVkIHRvIGJlICIubGliIgotCShleHRlcm5hbF9yZWxvYyk6IE1JUFMgRUNPRkYgcmVsb2NzIGFyZSBvbmx5IDggYnl0ZXMuICBBZGRlZAotCW1hY3JvcyB0byBhaWQgaW4gc3dhcHBpbmcuCi0KLUZyaSBKYW4gIDggMTY6MTk6MjYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlY29mZi1leHQuaDogQWRkZWQgcHJvdG90eXBlcyBmb3IgRUNPRkYgc3dhcHBpbmcgZnVuY3Rpb25zLgotCSogaW50ZXJuYWwuaCAoaW50ZXJuYWxfc2NuaGRyKTogQWx3YXlzIHByb3ZpZGUgc19hbGlnbiBmaWVsZCwgbm90Ci0JanVzdCBvbiBpOTYwLgotCShpbnRlcm5hbF9yZWxvYyk6IEFsd2F5cyBwcm92aWRlIHJfc2l6ZSBmaWVsZCwgbm90IGp1c3Qgb24KLQlSUy82MDAwLgotCSogbWlwcy5oIChfUkRBVEEsIF9TREFUQSwgX1NCU1MsIF9MSVQ0LCBfTElUOCwgU1RZUF9SREFUQSwKLQlTVFlQX1NEQVRBLCBTVFlQX1NCU1MsIFNUWVBfTElUNCwgU1RZUF9MSVQ4KTogRGVmaW5lZC4KLQkoQ09ERV9NQVNLLCBNSVBTX0lTX1NUQUIsIE1JUFNfTUFSS19TVEFCLCBNSVBTX1VOTUFSS19TVEFCLAotCVNUQUJTX1NZTUJPTCk6IE1vdmVkIGluIGZyb20gZ2RiL21pcHNyZWFkLmMuCi0KLVdlZCBKYW4gIDYgMTQ6MDE6NDYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpMzg2LmgsIHdlMzJrLmg6IHJlbW92ZWQgU1RZUF8qIGRlZmluZXMsIHNpbmNlIHRoZXkgZHVwbGljYXRlZAotCXRob3NlIGluIGludGVybmFsLmguCi0KLVR1ZSBEZWMgMjkgMTU6NDA6MDcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGRlZmluZSBJMzg2QUlYTUFHSUMgZm9yIERhbmJ1cnkgQUlYIFBTLzIgY29tcGlsZXIuCi0KLVNhdCBEZWMgMTIgMTY6MDc6NTcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpMzg2Lmg6IGRvbid0IGRlZmluZSBCVFlQRSwgSVNQVFIsIElTRkNOLCBJU0FSWSwgREVDUkVGOiB0aGV5Ci0JYXJlIGRlZmluZWQgaW4gaW50ZXJuYWwuaC4KLQotVGh1IE5vdiAxMiAwOTo1MjowMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogKGludGVybmFsX3JlbG9jKTogcl9vZmZzZXQgaXMgbm93IGEgbG9uZy4KLQkqIHo4ay5oOiBzbGlnaHQgY29tbWVudCBlbmhhbmNlbWVudAotCi1XZWQgU2VwIDMwIDA3OjQ2OjA4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBjaGFuZ2VkIHo4ayByZWxvYyB0eXBlcwotCi1GcmkgQXVnIDI4IDEwOjE2OjMxIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIHdlMzJrLmg6IG5ldyBmaWxlCi0KLVRodSBBdWcgMjcgMTM6MDA6MDEgMTk5MiAgQnJlbmRhbiBLZWhvZSAgKGJyZW5kYW5AY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogY29tbWVudCBvdXQgY3J1ZnQgYXQgdGhlIGVuZCBvZiAjZW5kaWYKLQotVHVlIEF1ZyAyNSAxNTowNjo0OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogYWRkZWQgI2RlZmluZSBmb3IgU1RZUF9MSVQsIHJlbW92ZWQgZnJvbSBhMjlrIGFuZAotCWg4MzAwLgotCi0JKiB6OGsuaDogYWRkZWQgejgwMDAgc3VwcG9ydAotCi1UaHUgSnVsIDE2IDE2OjMyOjAwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiBhZGRlZCBSX1JFTExPTkdfTkVHIHJlbG9jIHR5cGUKLQotRnJpIEp1biAxMiAyMDoxMTowNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogIEZpeCB1bnRlcm1pbmF0ZWQgY29tbWVudC4KLQotV2VkIEp1biAxMCAwNzo1Nzo0OSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBhLm91dCBtYWdpYyBudW1iZXJzIGZyb20KLQltb2hyaW5nQGluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUKLQotTW9uIEp1biAgOCAyMDoxMzozMyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0LmgsIG1pcHMuaDogIFVzZSB1bnNpZ25lZCBjaGFycyBldmVyeXdoZXJlLgotCShTdWdnZXN0ZWQgYnkgQW50dGkgTWlldHRpbmVuLikKLQotVHVlIEFwciAxNCAxNToxODo0NCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltLmg6ICBBZGQgY29tbWVudHMuCi0JKiBzeW1jb25zdC5oOiAgTWVyZ2Ugd2l0aCBGcmVkJ3MgY2hhbmdlcy4KLQotVHVlIEFwciAxNCAxNDozMDowNSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc3ltY29uc3QuaDogIFBpY2sgdXAgU0dJIGRlZmluZXMgZm9yIHN0U3RydWN0LCBzdFVuaW9uLCBzdEVudW0sCi0JbGFuZ0NwbHVzcGx1cywgYW5kIGxhbmdDcGx1c3BsdXNWMi4KLQotVGh1IEFwciAgMiAxOTo0Nzo0MyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3ltLmgsIHN5bWNvbnN0Lmg6ICBNSVBTIGhhcyBwcm92aWRlZCByZWRpc3RyaWJ1dGFibGUgdmVyc2lvbnMKLQlvZiB0aGVzZSBmaWxlcy4gIFRoYW5rcyEKLQkqIGVjb2ZmLWV4dC5oOiAgQWRkIHdlYWtleHQgYml0IHRvIG1hdGNoIG5ldyBzeW0uaC4KLQotRnJpIE1hciAgNiAwMDoxMDo0NiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6ICBBZGQgcmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9ycy4KLQotVGh1IEZlYiAyNyAxMTo1MzowNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZWNvZmYtZXh0Lmg6ICBOZXcgZmlsZSBmb3IgZXh0ZXJuYWwgKGluLWZpbGUpIGZvcm0gb2YgZWNvZmYKLQlzeW1ib2wgc3RydWN0dXJlcy4KLQotVGh1IEZlYiAgNiAxMTozMzozMiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogbWFkZSB0aGUgZXh0ZXJuYWxfbGluZW5vIGxfbG5ubyBmaWVsZCA0IGJ5dGVzIHdpZGUuCi0JYW5kZGVkIEdFVC9QVVRfTElORU5PX0xOTk8gbWFjcm9zCi0KLVNhdCBOb3YgMzAgMjA6Mzg6MzUgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIENoYW5nZUxvZywgYTI5ay5oLCBoODMwMC5oLCBpMzg2LmgsIGk5NjAuaCwgaW50ZXJuYWwuaCwgbTY4ay5oLAotCW04OGsuaCwgbWlwcy5oLCByczYwMDAuaDogbW92ZSBmcm9tIGFib3ZlIGNvZmYtPGZvbz4uaAotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYTI5ay5oIGIvaW5jbHVkZS9jb2ZmL2EyOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzYTY0Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qIENPRkYgc3BlYyBmb3IgQU1EIDI5MCowIAotICAgQ29udHJpYnV0ZWQgYnkgRGF2aWQgV29vZCBAIE5ldyBZb3JrIFVuaXZlcnNpdHkuCi0gKi8KLSAKLSNpZm5kZWYgQU1ECi0jIGRlZmluZSBBTUQKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSoqIEZpbGUgSGVhZGVyIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkgKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkgICAqLwotCWNoYXIgZl90aW1kYXRbNF07ICAgICAgIC8qIHRpbWUgJiBkYXRlIHN0YW1wCSAgICAqLwotCWNoYXIgZl9zeW1wdHJbNF07ICAgICAgIC8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIgICAgICAgKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcyAgICAgKi8KLQljaGFyIGZfb3B0aGRyWzJdOyAgICAgICAvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkgKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgRklMSERSICBzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZSBGSUxIU1oJMjAKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBNYWdpYyBudW1iZXJzIGZvciBBbTI5MDAwIAotKioJKEFUJlQgd2lsbCBhc3NpZ24gdGhlICJyZWFsIiBtYWdpYyBudW1iZXIpICAKLSovCi0KLSNkZWZpbmUgU0lQRkJPTUFHSUMgICAgIDA1NzIgICAgLyogQW0yOTAwMCAoQnl0ZSAwIGlzIE1TQikgKi8KLSNkZWZpbmUgU0lQUkJPTUFHSUMgICAgIDA1NzMgICAgLyogQW0yOTAwMCAoQnl0ZSAwIGlzIExTQikgKi8KLQotCi0jZGVmaW5lIEEyOUtfTUFHSUNfQklHIAkJU0lQRkJPTUFHSUMJCi0jZGVmaW5lIEEyOUtfTUFHSUNfTElUVExFCVNJUFJCT01BR0lDCQotI2RlZmluZSBBMjlLQkFETUFHKHgpIAkoKCh4KS5mX21hZ2ljIT1BMjlLX01BR0lDX0JJRykgJiYgXAotCQkJICAoKHgpLmZfbWFnaWMhPUEyOUtfTUFHSUNfTElUVExFKSkKLQotI2RlZmluZSBPTUFHSUMgQTI5S19NQUdJQ19CSUcKLS8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0qLwotCi0vKgotKiogRmlsZSBoZWFkZXIgZmxhZ3MgY3VycmVudGx5IGtub3duIHRvIHVzLgotKioKLSoqIEFtMjkwMDAgd2lsbCB1c2UgdGhlIEZfQVIzMldSIGFuZCBGX0FSMzJXIGZsYWdzIHRvIGluZGljYXRlCi0qKiB0aGUgYnl0ZSBvcmRlcmluZyBpbiB0aGUgZmlsZS4KLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotKiogT3B0aW9uYWwgKGEub3V0KSBoZWFkZXIgCi0qLwotCi10eXBlZGVmCXN0cnVjdCBleHRlcm5hbF9hb3V0aGRyIAotewotICBjaGFyICBtYWdpY1syXTsJICAgICAgIC8qIHR5cGUgb2YgZmlsZQkJCSAqLwotICBjaGFyICB2c3RhbXBbMl07CSAgICAgIC8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyICB0c2l6ZVs0XTsJICAgICAgIC8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyICBkc2l6ZVs0XTsJICAgICAgIC8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhciAgYnNpemVbNF07CSAgICAgICAvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJICAgICAqLwotICBjaGFyICBlbnRyeVs0XTsJICAgICAgIC8qIGVudHJ5IHB0LgkJCSAgICAqLwotICBjaGFyICB0ZXh0X3N0YXJ0WzRdOwkgIC8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAgZGF0YV9zdGFydFs0XTsJICAvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19IEFPVVRIRFI7Ci0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKiBhb3V0aGRyIG1hZ2ljIG51bWJlcnMgKi8KLSNkZWZpbmUgTk1BR0lDCQkwNDEwCS8qIHNlcGFyYXRlIGkvZCBleGVjdXRhYmxlICovCi0jZGVmaW5lIFNITUFHSUMJMDQwNgkJLyogTllVL1VsdHJhMyBzaGFyZWQgZGF0YSBleGVjdXRhYmxlIAotCQkJCSAgICh3cml0YWJsZSB0ZXh0KSAqLwotCi0jZGVmaW5lIF9FVEVYVCAgIAkiX2V0ZXh0IgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIFNlY3Rpb24gaGVhZGVyIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIAotewotCWNoYXIJICAgIHNfbmFtZVs4XTsgICAgICAvKiBzZWN0aW9uIG5hbWUJCSAqLwotCWNoYXIJICAgIHNfcGFkZHJbNF07ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJICAgIHNfdmFkZHJbNF07ICAgICAvKiB2aXJ0dWFsIGFkZHJlc3MJICAgICAgKi8KLQljaGFyCSAgICBzX3NpemVbNF07ICAgICAgLyogc2VjdGlvbiBzaXplCQkgKi8KLQljaGFyCSAgICBzX3NjbnB0cls0XTsgICAgLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCSAgICBzX3JlbHB0cls0XTsgICAgLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbiAgICAgICAqLwotCWNoYXIJICAgIHNfbG5ub3B0cls0XTsgICAvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMgICAgICovCi0JY2hhcgkgICAgc19ucmVsb2NbMl07ICAgIC8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQljaGFyCSAgICBzX25sbm5vWzJdOyAgICAgLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJICAgIHNfZmxhZ3NbNF07ICAgICAvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QJZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQgICAiLnRleHQiCi0jZGVmaW5lIF9EQVRBICAgIi5kYXRhIgotI2RlZmluZSBfQlNTICAgICIuYnNzIgotI2RlZmluZSBfTElUCSIubGl0IgotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIFNlY3Rpb24gdHlwZXMgLSB3aXRoIGFkZGl0aW9uYWwgc2VjdGlvbiB0eXBlIGZvciBnbG9iYWwgCi0qKiByZWdpc3RlcnMgd2hpY2ggd2lsbCBiZSByZWxvY2F0YWJsZSBmb3IgdGhlIEFtMjkwMDAuCi0qKgotKiogSW4gaW5zdGFuY2VzIHdoZXJlIGl0IGlzIG5lY2Vzc2FyeSBmb3IgYSBsaW5rZXIgdG8gcHJvZHVjZSBhbgotKiogb3V0cHV0IGZpbGUgd2hpY2ggY29udGFpbnMgdGV4dCBvciBkYXRhIG5vdCBiYXNlZCBhdCB2aXJ0dWFsCi0qKiBhZGRyZXNzIDAsIGUuZy4gZm9yIGEgUk9NLCB0aGVuIHRoZSBsaW5rZXIgc2hvdWxkIGFjY2VwdAotKiogYWRkcmVzcyBiYXNlIGluZm9ybWF0aW9uIGFzIGNvbW1hbmQgaW5wdXQgYW5kIHVzZSBQQUQgc2VjdGlvbnMKLSoqIHRvIHNraXAgb3ZlciB1bnVzZWQgYWRkcmVzc2VzLgotKi8KLQotI2RlZmluZQlTVFlQX0JTU1JFRwkweDEyMDAJLyogR2xvYmFsIHJlZ2lzdGVyIGFyZWEgKGxpa2UgU1RZUF9JTkZPKSAqLwotI2RlZmluZSBTVFlQX0VOVklSCTB4MjIwMAkvKiBFbnZpcm9ubWVudCAobGlrZSBTVFlQX0lORk8pICovCi0jZGVmaW5lIFNUWVBfQUJTCTB4NDAwMAkvKiBBYnNvbHV0ZSAoYWxsb2NhdGVkLCBub3QgcmVsb2MsIGxvYWRlZCkgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBSZWxvY2F0aW9uIGluZm9ybWF0aW9uIGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07CS8qICh2aXJ0dWFsKSBhZGRyZXNzIG9mIHJlZmVyZW5jZSAqLwotICBjaGFyIHJfc3ltbmR4WzRdOwkvKiBpbmRleCBpbnRvIHN5bWJvbCB0YWJsZSAqLwotICBjaGFyIHJfdHlwZVsyXTsJLyogcmVsb2NhdGlvbiB0eXBlICovCi19OwotCi0jZGVmaW5lCVJFTE9DCQlzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUJUkVMU1oJCTEwCQkvKiBzaXplb2YgKFJFTE9DKSAqLyAKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBSZWxvY2F0aW9uIHR5cGVzIGZvciB0aGUgQW0yOTAwMCAKLSovCi0KLSNkZWZpbmUJUl9BQlMJCTAJLyogcmVmZXJlbmNlIGlzIGFic29sdXRlICovCi0gCi0jZGVmaW5lCVJfSVJFTAkJMDMwCS8qIGluc3RydWN0aW9uIHJlbGF0aXZlIChqbXAvY2FsbCkgKi8KLSNkZWZpbmUJUl9JQUJTCQkwMzEJLyogaW5zdHJ1Y3Rpb24gYWJzb2x1dGUgKGptcC9jYWxsKSAqLwotI2RlZmluZQlSX0lMT0hBTEYJMDMyCS8qIGluc3RydWN0aW9uIGxvdyBoYWxmICAoY29uc3QpICAqLwotI2RlZmluZQlSX0lISUhBTEYJMDMzCS8qIGluc3RydWN0aW9uIGhpZ2ggaGFsZiAoY29uc3RoKSBwYXJ0IDEgKi8KLSNkZWZpbmUJUl9JSENPTlNUCTAzNAkvKiBpbnN0cnVjdGlvbiBoaWdoIGhhbGYgKGNvbnN0aCkgcGFydCAyICovCi0JCQkJLyogY29uc3RhbnQgb2Zmc2V0IG9mIFJfSUhJSEFMRiByZWxvY2F0aW9uICovCi0jZGVmaW5lCVJfQllURQkJMDM1CS8qIHJlbG9jYXRhYmxlIGJ5dGUgdmFsdWUgKi8KLSNkZWZpbmUgUl9IV09SRAkJMDM2CS8qIHJlbG9jYXRhYmxlIGhhbGZ3b3JkIHZhbHVlICovCi0jZGVmaW5lIFJfV09SRAkJMDM3CS8qIHJlbG9jYXRhYmxlIHdvcmQgdmFsdWUgKi8KLQotI2RlZmluZQlSX0lHTEJMUkMJMDQwCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQyAqLwotI2RlZmluZQlSX0lHTEJMUkEJMDQxCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQSAqLwotI2RlZmluZQlSX0lHTEJMUkIJMDQyCS8qIGluc3RydWN0aW9uIGdsb2JhbCByZWdpc3RlciBSQiAqLwotIAotLyoKLU5PVEU6Ci1BbGwgdGhlICJJIiBmb3JtcyByZWZlciB0byAyOTAwMCBpbnN0cnVjdGlvbiBmb3JtYXRzLiAgVGhlIGxpbmtlciBpcyAKLWV4cGVjdGVkIHRvIGtub3cgaG93IHRoZSBudW1lcmljIGluZm9ybWF0aW9uIGlzIHNwbGl0IGFuZC9vciBhbGlnbmVkCi13aXRoaW4gdGhlIGluc3RydWN0aW9uIHdvcmQocykuICBSX0JZVEUgd29ya3MgZm9yIGluc3RydWN0aW9ucywgdG9vLgotCi1JZiB0aGUgcGFyYW1ldGVyIHRvIGEgQ09OU1RIIGluc3RydWN0aW9uIGlzIGEgcmVsb2NhdGFibGUgdHlwZSwgdHdvIAotcmVsb2NhdGlvbiByZWNvcmRzIGFyZSB3cml0dGVuLiAgVGhlIGZpcnN0IGhhcyBhbiByX3R5cGUgb2YgUl9JSElIQUxGIAotKDMzIG9jdGFsKSBhbmQgYSBub3JtYWwgcl92YWRkciBhbmQgcl9zeW1uZHguICBUaGUgc2Vjb25kIHJlbG9jYXRpb24gCi1yZWNvcmQgaGFzIGFuIHJfdHlwZSBvZiBSX0lIQ09OU1QgKDM0IG9jdGFsKSwgYSBub3JtYWwgcl92YWRkciAod2hpY2ggCi1pcyByZWR1bmRhbnQpLCBhbmQgYW4gcl9zeW1uZHggY29udGFpbmluZyB0aGUgMzItYml0IGNvbnN0YW50IG9mZnNldCAKLXRvIHRoZSByZWxvY2F0aW9uIGluc3RlYWQgb2YgdGhlIGFjdHVhbCBzeW1ib2wgdGFibGUgaW5kZXguICBUaGlzIAotc2Vjb25kIHJlY29yZCBpcyBhbHdheXMgd3JpdHRlbiwgZXZlbiBpZiB0aGUgY29uc3RhbnQgb2Zmc2V0IGlzIHplcm8uCi1UaGUgY29uc3RhbnQgZmllbGRzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgc2V0IHRvIHplcm8uCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIExpbmUgbnVtYmVyIGVudHJ5IGRlY2xhcmF0aW9uIGFuZCByZWxhdGVkIGRlZmluaXRpb25zCi0qLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIAotewotICAgdW5pb24gewotCSBjaGFyIGxfc3ltbmR4WzRdOyAvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkgY2hhciBsX3BhZGRyWzRdOyAgLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyICAgICovCi0gICB9IGxfYWRkcjsKLSAgIGNoYXIgbF9sbm5vWzJdOyAJLyogbGluZSBudW1iZXIJICAqLwotfTsKLQotI2RlZmluZQlMSU5FTk8JCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCQk2CQkvKiBzaXplb2YgKExJTkVOTykgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qCi0qKiBTeW1ib2wgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgZGVmaW5pdGlvbnMKLSovCi0KLSNkZWZpbmUJRV9TWU1OTUxFTgk4CS8qIE51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWiAJMTgKLQotLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSovCi0KLS8qCi0qKiBTdG9yYWdlIGNsYXNzIGRlZmluaXRpb25zIC0gbmV3IGNsYXNzZXMgZm9yIGdsb2JhbCByZWdpc3RlcnMuCi0qLwotCi0jZGVmaW5lIENfR0xCTFJFRwkxOQkJLyogZ2xvYmFsIHJlZ2lzdGVyICovCi0jZGVmaW5lIENfRVhUUkVHCTIwCQkvKiBleHRlcm5hbCBnbG9iYWwgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ19ERUZSRUcJMjEJCS8qIGV4dC4gZGVmLiBvZiBnbG9iYWwgcmVnaXN0ZXIgKi8KLQotCi0vKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtKi8KLQotLyoKLSoqIERlcml2ZWQgc3ltYm9sIG1hc2svc2hpZnRzLgotKi8KLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSoqIEF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cnkgZGVjbGFyYXRpb24gYW5kIHJlbGF0ZWQgCi0qKiBkZWZpbml0aW9ucy4KLSovCi0KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNCAgICAgIC8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkgICovCi0jZGVmaW5lIEVfRElNTlVNICAJNCAgICAgICAvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsgICAgICAgLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOyAgLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOyAgIC8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJICAgICAgIC8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07ICAgICAgIC8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07ICAgICAgIC8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07ICAgICAgIC8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsgICAgIC8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkgLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotfTsKLQotI2RlZmluZQlBVVhFTlQJCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJCTE4CQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2FscGhhLmggYi9pbmNsdWRlL2NvZmYvYWxwaGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2Y2JjYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2MiArMCwwIEBACi0vKiBFQ09GRiBzdXBwb3J0IG9uIEFscGhhIG1hY2hpbmVzLgotICAgY29mZi9lY29mZi5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMgZmlsZS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLSAgdW5zaWduZWQgY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9zeW1wdHJbOF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogTWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiBjb2ZmL2Vjb2ZmLmguICAqLwotI2RlZmluZSBBTFBIQV9FQ09GRl9CQURNQUcoeCkgXAotICAoKHgpLmZfbWFnaWMgIT0gQUxQSEFfTUFHSUMgJiYgKHgpLmZfbWFnaWMgIT0gQUxQSEFfTUFHSUNfQlNEKQotCi0vKiBUaGUgb2JqZWN0IHR5cGUgaXMgZW5jb2RlZCBpbiB0aGUgZl9mbGFncy4gICovCi0jZGVmaW5lIEZfQUxQSEFfT0JKRUNUX1RZUEVfTUFTSwkweDMwMDAKLSNkZWZpbmUgRl9BTFBIQV9OT19TSEFSRUQJCTB4MTAwMAotI2RlZmluZSBGX0FMUEhBX1NIQVJBQkxFCQkweDIwMDAKLSNkZWZpbmUgRl9BTFBIQV9DQUxMX1NIQVJFRAkJMHgzMDAwCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyNAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgZXh0ZXJuYWxfYW91dGhkcgotewotICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzJdOwkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl2c3RhbXBbMl07CS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICB1bnNpZ25lZCBjaGFyIGJsZHJldlsyXTsJLyogPz8gKi8KLSAgdW5zaWduZWQgY2hhciBwYWRkaW5nWzJdOwkvKiBwYWQgdG8gcXVhZHdvcmQgYm91bmRhcnkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdHNpemVbOF07CS8qIHRleHQgc2l6ZSBpbiBieXRlcwkJCSovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbOF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs4XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzhdOwkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X3N0YXJ0WzhdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YV9zdGFydFs4XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGJzc19zdGFydFs4XTsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BybWFza1s0XTsJLyogYml0bWFzayBvZiBnZW5lcmFsIHJlZ2lzdGVycyB1c2VkICovCi0gIHVuc2lnbmVkIGNoYXIgZnBybWFza1s0XTsJLyogYml0bWFzayBvZiBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdXNlZCAqLwotICB1bnNpZ25lZCBjaGFyIGdwX3ZhbHVlWzhdOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX0gQU9VVEhEUjsKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLSNkZWZpbmUgQU9VVFNaIDgwCi0jZGVmaW5lIEFPVVRIRFJTWiA4MAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgdW5zaWduZWQgY2hhcglzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19wYWRkcls4XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgdW5zaWduZWQgY2hhcglzX3ZhZGRyWzhdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zaXplWzhdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2NucHRyWzhdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNfcmVscHRyWzhdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIHVuc2lnbmVkIGNoYXIJc19sbm5vcHRyWzhdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgdW5zaWduZWQgY2hhcglzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk2NAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgdW5zaWduZWQgY2hhciByX3ZhZGRyWzhdOwotICB1bnNpZ25lZCBjaGFyIHJfc3ltbmR4WzRdOwotICB1bnNpZ25lZCBjaGFyIHJfYml0c1s0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLS8qIENvbnN0YW50cyB0byB1bnBhY2sgdGhlIHJfYml0cyBmaWVsZC4gIFRoZSBBbHBoYSBzZWVtcyB0byBhbHdheXMgYmUKLSAgIGxpdHRsZSBlbmRpYW4sIHNvIEkgaGF2ZW4ndCBib3RoZXJlZCB0byBkZWZpbmUgYmlnIGVuZGlhbiB2YXJpYW50cwotICAgb2YgdGhlc2UuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfTElUVExFCQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMF9UWVBFX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX0VYVEVSTl9MSVRUTEUJCTB4MDEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9PRkZTRVRfTElUVExFCQkweDdlCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9TSF9MSVRUTEUJCTEKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9MSVRUTEUJCTB4ODAKLSNkZWZpbmUgUkVMT0NfQklUUzFfUkVTRVJWRURfU0hfTElUVExFCQk3Ci0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX0xJVFRMRQkJMHhmZgotI2RlZmluZSBSRUxPQ19CSVRTMl9SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX0xJVFRMRQkJMHgwMwotI2RlZmluZSBSRUxPQ19CSVRTM19SRVNFUlZFRF9TSF9MRUZUX0xJVFRMRQk5Ci0KLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9MSVRUTEUJCQkweGZjCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1NJWkVfU0hfTElUVExFCQkyCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lHTk9SRQkJMAotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkyCi0jZGVmaW5lIEFMUEhBX1JfR1BSRUwzMgkJMwotI2RlZmluZSBBTFBIQV9SX0xJVEVSQUwJCTQKLSNkZWZpbmUgQUxQSEFfUl9MSVRVU0UJCTUKLSNkZWZpbmUgQUxQSEFfUl9HUERJU1AJCTYKLSNkZWZpbmUgQUxQSEFfUl9CUkFERFIJCTcKLSNkZWZpbmUgQUxQSEFfUl9ISU5UCQk4Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDE2CQk5Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDMyCSAgICAgICAxMAotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkgICAgICAgMTEKLSNkZWZpbmUgQUxQSEFfUl9PUF9QVVNICSAgICAgICAxMgotI2RlZmluZSBBTFBIQV9SX09QX1NUT1JFICAgICAgIDEzCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkgICAgICAgMTQKLSNkZWZpbmUgQUxQSEFfUl9PUF9QUlNISUZUICAgICAxNQotI2RlZmluZSBBTFBIQV9SX0dQVkFMVUUJICAgICAgIDE2Ci0jZGVmaW5lIEFMUEhBX1JfR1BSRUxISUdIICAgICAgMTcKLSNkZWZpbmUgQUxQSEFfUl9HUFJFTExPVyAgICAgICAxOAotI2RlZmluZSBBTFBIQV9SX0lNTUVEICAgICAgICAgIDE5Ci0KLS8qIE92ZXJsb2FkZWQgcmVsb2MgdmFsdWUgdXNlZCBieSBOZXQtIGFuZCBPcGVuQlNELiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9MSVRFUkFMU0xFQVpZICAxNwotCi0vKiBXaXRoIEFMUEhBX1JfTElUVVNFLCB0aGUgcl9zaXplIGZpZWxkIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy4gICovCi0jZGVmaW5lIEFMUEhBX1JfTFVfQkFTRSAgICAgICAgIDEKLSNkZWZpbmUgQUxQSEFfUl9MVV9CWVRPRkYgICAgICAgMgotI2RlZmluZSBBTFBIQV9SX0xVX0pTUiAgICAgICAgICAzCi0KLS8qIFdpdGggQUxQSEFfUl9JTU1FRCwgdGhlIHJfc2l6ZSBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0dQXzE2ICAgICAxCi0jZGVmaW5lIEFMUEhBX1JfSU1NRURfR1BfSEkzMiAgIDIKLSNkZWZpbmUgQUxQSEFfUl9JTU1FRF9TQ05fSEkzMiAgMwotI2RlZmluZSBBTFBIQV9SX0lNTUVEX0JSX0hJMzIgICA0Ci0jZGVmaW5lIEFMUEhBX1JfSU1NRURfTE8zMiAgICAgIDUKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MSUMgSU5GT1JNQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV3JpdHRlbiBieSBKb2huIEdpbG1vcmUuICAqLwotCi0vKiBFQ09GRiB1c2VzIENPRkYtbGlrZSBzZWN0aW9uIHN0cnVjdHVyZXMsIGJ1dCBpdHMgb3duIHN5bWJvbCBmb3JtYXQuCi0gICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3ltYm9sIGZvcm1hdCBpbiBmaWVsZHMgd2hvc2Ugc2l6ZSBhbmQgYWxpZ25tZW50Ci0gICB3aWxsIG5vdCB2YXJ5IG9uIGRpZmZlcmVudCBob3N0IHN5c3RlbXMuICAqLwotCi0vKiBGaWxlIGhlYWRlciBhcyBhIHNldCBvZiBieXRlcyAqLwotCi1zdHJ1Y3QgaGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhciAJaF9tYWdpY1syXTsKLQl1bnNpZ25lZCBjaGFyCWhfdnN0YW1wWzJdOwotCXVuc2lnbmVkIGNoYXIJaF9pbGluZU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWRuTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pcGRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzeW1NYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lvcHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lhdXhNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc01heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXNzRXh0TWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pZmRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lleHRNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiTGluZVs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkRuT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlBkT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlN5bU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JPcHRPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcgloX2NiQXV4T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlNzRXh0T2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkZkT2Zmc2V0WzhdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlJmZE9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JFeHRPZmZzZXRbOF07Ci19OwotCi0vKiBGaWxlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBmZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWZfYWRyWzhdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVPZmZzZXRbOF07Ci0JdW5zaWduZWQgY2hhcglmX2NiTGluZVs4XTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JTc1s4XTsKLQl1bnNpZ25lZCBjaGFyCWZfcnNzWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3NCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pc3ltQmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY3N5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaWxpbmVCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jbGluZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaW9wdEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lwZEZpcnN0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jcGRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lhdXhCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYXV4WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9yZmRCYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWZfYml0czJbM107Ci0JdW5zaWduZWQgY2hhcglmX3BhZGRpbmdbNF07Ci19OwotCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0JJRwkJMHhGOAotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9CSUcJCTMKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfTElUVExFCQkweDFGCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRQkwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9CSUcJCTB4MDQKLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUJCTB4MjAKLQotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9CSUcJCTB4MDIKLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFCTB4NDAKLQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9CSUcJMHgwMQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUJMHg4MAotCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfQklHCQkweEMwCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfQklHCQk2Ci0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfTElUVExFCQkweDAzCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFCTAKLQotLyogV2UgaWdub3JlIHRoZSBgcmVzZXJ2ZWQnIGZpZWxkIGluIGJpdHMyLiAqLwotCi0vKiBQcm9jZWR1cmUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbOF07Ci0JdW5zaWduZWQgY2hhcglwX2NiTGluZU9mZnNldFs4XTsKLQl1bnNpZ25lZCBjaGFyCXBfaXN5bVs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaWxpbmVbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfaW9wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9ncF9wcm9sb2d1ZVsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcglwX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJcF9sb2NhbG9mZlsxXTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOwotfTsKLQotI2RlZmluZSBQRFJfQklUUzFfR1BfVVNFRF9CSUcJCTB4ODAKLSNkZWZpbmUgUERSX0JJVFMxX1JFR19GUkFNRV9CSUcJCTB4NDAKLSNkZWZpbmUgUERSX0JJVFMxX1BST0ZfQklHCQkweDIwCi0jZGVmaW5lIFBEUl9CSVRTMV9SRVNFUlZFRF9CSUcJCTB4MWYKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgUERSX0JJVFMyX1JFU0VSVkVEX0JJRwkJMHhmZgotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfU0hfQklHCTAKLQotI2RlZmluZSBQRFJfQklUUzFfR1BfVVNFRF9MSVRUTEUJMHgwMQotI2RlZmluZSBQRFJfQklUUzFfUkVHX0ZSQU1FX0xJVFRMRQkweDAyCi0jZGVmaW5lIFBEUl9CSVRTMV9QUk9GX0xJVFRMRQkJMHgwNAotI2RlZmluZSBQRFJfQklUUzFfUkVTRVJWRURfTElUVExFCTB4ZjgKLSNkZWZpbmUgUERSX0JJVFMxX1JFU0VSVkVEX1NIX0xJVFRMRQkzCi0jZGVmaW5lIFBEUl9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHhmZgotI2RlZmluZSBQRFJfQklUUzJfUkVTRVJWRURfU0hfTEVGVF9MSVRUTEUgNQotCi0vKiBMaW5lIG51bWJlcnMgKi8KLQotc3RydWN0IGxpbmVfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWxfbGluZVs0XTsKLX07Ci0KLS8qIFN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHN5bV9leHQgewotCXVuc2lnbmVkIGNoYXIJc192YWx1ZVs4XTsKLQl1bnNpZ25lZCBjaGFyCXNfaXNzWzRdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMzWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzNFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0JJRwkJMHhGQwotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfQklHCQkyCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9MSVRUTEUJCTB4M0YKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19CSUcJCTB4MDMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHCTMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0xJVFRMRQkJMHhDMAotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTElUVExFCQk2Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0JJRwkJMHhFMAotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfQklHCQk1Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19MSVRUTEUJCTB4MDcKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFCTIKLQotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfQklHCQkweDEwCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9CSUcJCTB4MEYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9MSVRUTEUJCTB4RjAKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcJMAotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZXh0X2V4dCB7Ci0Jc3RydWN0CXN5bV9leHQgZXNfYXN5bTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZXNfYml0czJbM107Ci0JdW5zaWduZWQgY2hhcgllc19pZmRbNF07Ci19OwotCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfQklHCQkweDgwCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfTElUVExFCQkweDAxCi0KLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHCTB4NDAKLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFCTB4MDIKLQotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9CSUcJCTB4MjAKLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFCTB4MDQKLQotLyogRGVuc2UgbnVtYmVycyBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGRucl9leHQgewotCXVuc2lnbmVkIGNoYXIJZF9yZmRbNF07Ci0JdW5zaWduZWQgY2hhcglkX2luZGV4WzRdOwotfTsKLQotLyogUmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yICovCi0KLXN0cnVjdCByZmRfZXh0IHsKLSAgdW5zaWduZWQgY2hhcglyZmRbNF07Ci19OwotCi0vKiBPcHRpbWl6ZXIgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgb3B0X2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMVsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMyWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czNbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzNFsxXTsKLSAgc3RydWN0IHJuZHhfZXh0IG9fcm5keDsKLSAgdW5zaWduZWQgY2hhciBvX29mZnNldFs0XTsKLX07Ci0KLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRQkwCi0KLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9CSUcJMAotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hcG9sbG8uaCBiL2luY2x1ZGUvY29mZi9hcG9sbG8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzNDdmMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXBvbGxvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBBcG9sbG8gTTY4SyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBNb3Rvcm9sYSA2ODAwMC82ODAwOC82ODAxMC82ODAyMCAqLwotI2RlZmluZQlNQzY4TUFHSUMJMDUyMAotI2RlZmluZSBNQzY4S1dSTUFHSUMJMDUyMAkvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqLwotI2RlZmluZQlNQzY4VFZNQUdJQwkwNTIxCi0jZGVmaW5lIE1DNjhLUk9NQUdJQwkwNTIxCS8qIHJlYWRvbmx5IHNoYXJlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIE1DNjhLUEdNQUdJQwkwNTIyCS8qIGRlbWFuZCBwYWdlZCB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU02OE1BR0lDCTAyMTAKLSNkZWZpbmUJTTY4VFZNQUdJQwkwMjExCi0KLS8qIEFwb2xsbyA2ODAwMC1iYXNlZCBtYWNoaW5lcyBoYXZlIGEgZGlmZmVyZW50IG1hZ2ljIG51bWJlci4gVGhpcyBjb21lcwotICogZnJvbSAvdXNyL2luY2x1ZGUvYXBvbGxvL2ZpbGVoZHIuaAotICovCi0jZGVmaW5lIEFQT0xMT002OEtNQUdJQyAwNjI3Ci0KLSNkZWZpbmUgT01BR0lDIE02OE1BR0lDCi0jZGVmaW5lIE02OEtCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9TUM2OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU1DNjhLV1JNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4VFZNQUdJQykgJiYgXAotICAoKHgpLmZfbWFnaWMhPU1DNjhLUk9NQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1BHTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TTY4TUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TTY4VFZNQUdJQykgICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1BUE9MTE9NNjhLTUFHSUMpICkKLQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhcglvX3NyaVs0XTsJCS8qIEFwb2xsbyBzcGVjaWZpYyAtIC5zcmkgZGF0YSBwb2ludGVyICovCi0gIGNoYXIgIG9faW5saWJbNF07CQkvKiBBcG9sbG8gc3BlY2lmaWMgLSAuaW5saWIgZGF0YSBwb2ludGVyICovCi0gIGNoYXIJdmlkWzhdOwkJCS8qIEFwb2xsbyBzcGVjaWZpYyAtIDY0IGJpdCB2ZXJzaW9uIElEICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lCUFQT0xMT19DT0ZGX1ZFUlNJT05fTlVNQkVSIDEgLyogdGhlIHZhbHVlIG9mIHRoZSBhb3V0aGRyIG1hZ2ljICovCi0jZGVmaW5lCUFPVVRIRFJTWiA0NAotI2RlZmluZSBBT1VUU1ogNDQKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCS8qIEFwb2xsbyBhbGxvdyBmb3IgbGFyZ2VyIHNlY3Rpb24gbmFtZXMgYnkgIGFsbG93aW5nIGl0IHRvIGJlIGluCi0JICogdGhlIHN0cmluZyB0YWJsZS4KLQkgKi8KLQljaGFyCQlzX25hbWVbOF07Ci0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBJZiBzX3plb3JlcyBpcyBhbGwgemVyb2VzLCBzX29mZnNldCBnaXZlcyB0aGUgcmVhbCBsb2NhdGlvbiBvZiB0aGUgbmFtZQotICogaW4gdGhlIHN0cmluZyB0YWJsZS4KLSAqLwotCi0jZGVmaW5lCXNfemVyb2VzIHNlY3Rpb25fbmFtZS5zX25hbWUKLSNkZWZpbmUJc19vZmZzZXQgKHNlY3Rpb25fbmFtZS5zX25hbWUrNCkKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfVFYJIi50diIKLSNkZWZpbmUgX0lOSVQJIi5pbml0IgotI2RlZmluZSBfRklOSQkiLmZpbmkiCi0jZGVmaW5lCV9MSU5FUwkiLmxpbmVzIgotI2RlZmluZQlfQkxPQ0tTCSIuYmxvY2tzIgotI2RlZmluZSBfU1JJICAgICIuc3JpIiAgICAgICAgICAgICAgICAgIC8qIFN0YXRpYyBSZXNvdXJjZSBJbmZvcm1hdGlvbiAoc3lzdHlwZSwKLSBldCBhbC4pICovCi0jZGVmaW5lIF9NSVIgICAgIi5taXIiICAgICAgICAgICAgICAgICAgLyogTW9kdWxlIEluZm9ybWF0aW9uIFJlY29yZHMgICovCi0jZGVmaW5lIF9BUFRWICAgIi5hcHR2IiAgICAgICAgICAgICAgICAgLyogQXBvbGxvLXN0eWxlIHRyYW5zZmVyIHZlY3RvcnMuICovCi0jZGVmaW5lIF9JTkxJQiAgIi5pbmxpYiIgICAgICAgICAgICAgICAgLyogU2hhcmVkIExpYnJhcnkgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgX1JXREkgICAiLnJ3ZGkiICAgICAgICAgLyogUmVhZC93cml0ZSBkYXRhIGluaXRpYWxpemF0aW9uIGRpcmVjdGl2ZXMgZm9yCi0gY29tcHJlc3NlZCBzZWN0aW9ucyAqLwotI2RlZmluZSBfVU5XSU5EICIudW53aW5kIiAgICAgICAgICAgICAgIC8qIFN0YWNrIHVud2luZCBpbmZvcm1hdGlvbiAqLwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotI2lmZGVmIE02OEtfQ09GRl9PRkZTRVQKLSAgY2hhciByX29mZnNldFs0XTsKLSNlbmRpZgotCi19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0KLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0jZGVmaW5lIFJFTFNaIDE0Ci0jZWxzZQotI2RlZmluZSBSRUxTWiAxMAotI2VuZGlmCi0KLS8qIEFwb2xsbyBzcGVjaWZpYyBTVFlQIGZsYWdzICovCi0KLSNkZWZpbmUgU1RZUF9SRUxPQ0FURURfTk9UX0xPQURFRCAweDAwMDEwMDAwCS8qIFNlY3Rpb24gaXMgcmVsb2NhdGVkIG5vcm1hbGx5IGR1cmluZyBsaW5raW5nLCBidXQgbmVlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgbm90IGJlIGxvYWRlZCBkdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24gKi8KLSNkZWZpbmUgU1RZUF9ERUJVRyAgICAgICAgICAgICAgMHgwMDAyMDAwMAkvKiBkZWJ1ZyBzZWN0aW9uICovCi0jZGVmaW5lIFNUWVBfT1ZFUkxBWQkJMHgwMDA0MDAwMAkvKiBTZWN0aW9uIGlzIG92ZXJsYXllZCAqLwotI2RlZmluZSBTVFlQX0lOU1RSVUNUSU9OICAgIAkweDAwMjAwMDAwCS8qIFNlY3Rpb24gY29udGFpbnMgZXhlY3V0YWJsZSBjb2RlICovCi0KLSNkZWZpbmUgU1RZUF9aRVJPCQkweDAwODAwMDAwCS8qIFNlY3Rpb24gaXMgaW5pdGlhbGl6ZWQgdG8gemVybyAqLwotI2RlZmluZSBTVFlQX0lOU1RBTExFRAkJMHgwMjAwMDAwMAkvKiBTZWN0aW9uIHNob3VsZCBiZSBpbnN0YWxsYWJsZSBpbiBLR1QgKi8KLSNkZWZpbmUgU1RZUF9MT09LX0lOU1RBTExFRAkweDA0MDAwMDAwCS8qIExvb2sgZm9yIHNlY3Rpb24gaW4gS0dUICovCi0jZGVmaW5lIFNUWVBfU0VDQUxJR04xCQkweDA4MDAwMDAwCS8qIFNwZWNpYWxseSBhbGlnbmVkIHNlY3Rpb24gKi8KLSNkZWZpbmUgU1RZUF9TRUNBTElHTjIJCTB4MTAwMDAwMDAJLyogICAgICAiICAgICAgICIgICAgICAgIiAgICAqLwotI2RlZmluZSBTVFlQX0NPTVBSRVNTRUQJCTB4MjAwMDAwMDAJLyogTm8gc2VjdGlvbiBkYXRhIHBlciBzZSAoc19zY25wdHIgPSAwKSwgYnV0IHRoZXJlIGFyZQotCQkJCQkJICAgaW5pdGlhbGl6YXRpb24gZGlyZWN0aXZlcyBmb3IgaXQgaW4gLnJ3ZGkgc2VjdGlvbgotCQkJCQkJICAgKHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTVFlQX0JTUykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9hcm0uaCBiL2luY2x1ZGUvY29mZi9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkNzhkNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciB0aGUgQVJNICovCi0KLSNkZWZpbmUgQ09GRkFSTSAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqICAgICAgRl9JTlRFUldPUksgICAgIGZpbGUgc3VwcG9ydHMgc3dpdGNoaW5nIGJldHdlZW4gQVJNIGFuZCBUaHVtYiBpbnN0cnVjdGlvbiBzZXRzCi0gKiAgICAgIEZfSU5URVJXT1JLX1NFVCB0aGUgRl9JTlRFUldPUksgYml0IGlzIHZhbGlkCi0gKglGX0FQQ1NfRkxPQVQJY29kZSBwYXNzZXMgZmxvYXQgYXJndW1lbnRzIGluIGZsb2F0IHJlZ2lzdGVycwotICoJRl9QSUMJCWNvZGUgaXMgcmVlbnRyYW50L3Bvc2l0aW9uLWluZGVwZW5kZW50Ci0gKglGX0FSMzJXUglmaWxlIGhhcyBieXRlIG9yZGVyaW5nIG9mIGFuIEFSMzJXUiBtYWNoaW5lIChlLmcuIHZheCkKLSAqCUZfQVBDU18yNglmaWxlIHVzZXMgMjYgYml0IEFSTSBQcm9jZWR1cmUgQ2FsbGluZyBTdGFuZGFyZAotICoJRl9BUENTX1NFVAl0aGUgRl9BUENTXzI2LCBGX0FQQ1NfRkxPQVQgYW5kIEZfUElDIGJpdHMgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKLSNkZWZpbmUgRl9JTlRFUldPUktfU0VUCSgweDAwMjApCi0jZGVmaW5lIEZfQVBDU19GTE9BVAkoMHgwMDQwKQotI3VuZGVmICBGX0FSMTZXUgotI2RlZmluZSBGX1BJQwkJKDB4MDA4MCkKLSNkZWZpbmUJRl9BUjMyV1IJKDB4MDEwMCkKLSNkZWZpbmUgRl9BUENTXzI2CSgweDA0MDApCi0jZGVmaW5lIEZfQVBDU19TRVQJKDB4MDgwMCkKLQotLyogQml0cyBzdG9yZWQgaW4gZmxhZ3MgZmllbGQgb2YgdGhlIGludGVybmFsX2Ygc3RydWN0dXJlICovCi0KLSNkZWZpbmUgRl9JTlRFUldPUksJKDB4MDAxMCkKLSNkZWZpbmUgRl9BUENTX0ZMT0FUCSgweDAwNDApCi0jZGVmaW5lIEZfUElDCQkoMHgwMDgwKQotI2RlZmluZSBGX0FQQ1MyNgkoMHgxMDAwKQotI2RlZmluZSBGX0FSTV9BUkNISVRFQ1RVUkVfTUFTSyAoMHg0MDAwKzB4MDgwMCsweDA0MDApCi0jZGVmaW5lIEZfQVJNXzIJCSgweDA0MDApCi0jZGVmaW5lIEZfQVJNXzJhCSgweDA4MDApCi0jZGVmaW5lIEZfQVJNXzMJCSgweDBjMDApCi0jZGVmaW5lIEZfQVJNXzNNCSgweDQwMDApCi0jZGVmaW5lIEZfQVJNXzQJCSgweDQ0MDApCi0jZGVmaW5lIEZfQVJNXzRUCSgweDQ4MDApCi0jZGVmaW5lIEZfQVJNX3NwYXJlCSgweDRjMDApCi0KLS8qCi0gKiBBUk1NQUdJQyBvdWdodCB0byBlbmNvZGVkIHRoZSBwcm9jZXNvciB0eXBlLAotICogYnV0IGl0IGlzIHRvbyBsYXRlIHRvIGNoYW5nZSBpdCBub3csIGluc3RlYWQKLSAqIHRoZSBmbGFncyBmaWVsZCBvZiB0aGUgaW50ZXJuYWxfZiBzdHJ1Y3R1cmUKLSAqIGlzIHVzZWQgYXMgc2hvd24gYWJvdmUuCi0gKgotICogWFhYIC0gTkMgNS82Lzk3Ci0gKi8KLQotI2RlZmluZQlBUk1NQUdJQwkweGEwMCAgLyogSSBqdXN0IG1hZGUgdGhpcyB1cCAqLyAKLQotI2RlZmluZSBBUk1CQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBBUk1NQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0KLQotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotCi0vKiBkZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcyAqLwotLyogICNkZWZpbmUgTlRfSU1BR0VfQkFTRSAgICAgICAgMHg0MDAwMDAgbW92ZWQgdG8gaW50ZXJuYWwuaCAqLwotI2RlZmluZSBOVF9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgTlRfRklMRV9BTElHTk1FTlQgICAgMHgyMDAgIAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyogV2UgdXNlIHRoZSAucmRhdGEgc2VjdGlvbiB0byBob2xkIHJlYWQgb25seSBkYXRhLiAgKi8KLSNkZWZpbmUgX0xJVAkiLnJkYXRhIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JCWNoYXIgeF9jaGVja3N1bVs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLQkJY2hhciB4X2Fzc29jaWF0ZWRbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLQkJY2hhciB4X2NvbWRhdFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvYXV4LWNvZmYuaCBiL2luY2x1ZGUvY29mZi9hdXgtY29mZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODljMTI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9hdXgtY29mZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyogTW9kaWZpY2F0aW9ucyBvZiBpbnRlcm5hbC5oIGFuZCBtNjhrLmggbmVlZGVkIGJ5IEEvVVgKLSAgIFN1Z2dlc3RlZCBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4gKi8KLQotI2lmbmRlZiBHTlVfQ09GRl9BVVhfSAotI2RlZmluZSBHTlVfQ09GRl9BVVhfSCAxCi0KLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiY29mZi9tNjhrLmgiCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgNjQtYnl0ZSBwYWRkZWQgcGF0aG5hbWVzIG9mIHNoYXJlZCBsaWJyYXJpZXMgKi8KLSN1bmRlZiBTVFlQX0xJQgotI2RlZmluZSBTVFlQX0xJQiAweDIwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHNoYXJlZCBsaWJyYXJ5IGluaXRpYWxpemF0aW9uIGNvZGUgKi8KLSN1bmRlZiBTVFlQX0lOSVQKLSNkZWZpbmUgU1RZUF9JTklUIDB4NDAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgLmlkZW50IGluZm9ybWF0aW9uICovCi0jdW5kZWYgU1RZUF9JREVOVAotI2RlZmluZSBTVFlQX0lERU5UIDB4ODAwCi0KLS8qIFNlY3Rpb24gdHlwZXMgdXNlZCBieSBiZmQgYW5kIGdhcyBub3QgZGVmaW5lZCAoZGlyZWN0bHkpIGJ5IEEvVVggKi8KLSN1bmRlZiBTVFlQX09WRVIKLSNkZWZpbmUgU1RZUF9PVkVSIDAKLSN1bmRlZiBTVFlQX0lORk8KLSNkZWZpbmUgU1RZUF9JTkZPIFNUWVBfSURFTlQKLQotLyogVHJhZGl0aW9uYWwgbmFtZSBvZiB0aGUgc2VjdGlvbiB0YWdnZWQgd2l0aCBTVFlQX0xJQiAqLwotI2RlZmluZSBfTElCICIubGliIgotCi0jZW5kaWYgLyogR05VX0NPRkZfQVVYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9lY29mZi5oIGIvaW5jbHVkZS9jb2ZmL2Vjb2ZmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDIwMmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2Vjb2ZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotI2lmbmRlZiBFQ09GRl9ICi0jZGVmaW5lIEVDT0ZGX0gKLQotLyogR2VuZXJpYyBFQ09GRiBzdXBwb3J0LgotICAgVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHN5bWJvbCBpbmZvcm1hdGlvbiwgZm91bmQgaW4gc3ltLmggYW5kCi0gICBzeW1jb25zdC5oLiAgKi8KLQotLyogTWlwcyBtYWdpYyBudW1iZXJzIHVzZWQgaW4gZmlsZWhkci4gIE1JUFNfTUFHSUNfTElUVExFIGlzIHVzZWQgb24KLSAgIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMuICBNSVBTX01BR0lDX0JJRyBpcyB1c2VkIG9uIGJpZyBlbmRpYW4KLSAgIG1hY2hpbmVzLiAgV2hlcmUgaXMgTUlQU19NQUdJQ18xIGZyb20/ICAqLwotI2RlZmluZSBNSVBTX01BR0lDXzEgMHgwMTgwCi0jZGVmaW5lIE1JUFNfTUFHSUNfTElUVExFIDB4MDE2MgotI2RlZmluZSBNSVBTX01BR0lDX0JJRyAweDAxNjAKLQotLyogVGhlc2UgYXJlIHRoZSBtYWdpYyBudW1iZXJzIHVzZWQgZm9yIE1JUFMgY29kZSBjb21waWxlZCBhdCBJU0EKLSAgIGxldmVsIDIuICAqLwotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRTIgMHgwMTY2Ci0jZGVmaW5lIE1JUFNfTUFHSUNfQklHMiAweDAxNjMKLQotLyogVGhlc2UgYXJlIHRoZSBtYWdpYyBudW1iZXJzIHVzZWQgZm9yIE1JUFMgY29kZSBjb21waWxlZCBhdCBJU0EKLSAgIGxldmVsIDMuICAqLwotI2RlZmluZSBNSVBTX01BR0lDX0xJVFRMRTMgMHgxNDIKLSNkZWZpbmUgTUlQU19NQUdJQ19CSUczIDB4MTQwCi0KLS8qIEFscGhhIG1hZ2ljIG51bWJlcnMgdXNlZCBpbiBmaWxlaGRyLiAgKi8KLSNkZWZpbmUgQUxQSEFfTUFHSUMgMHgxODMKLSNkZWZpbmUgQUxQSEFfTUFHSUNfQlNEIDB4MTg1Ci0KLS8qIE1hZ2ljIG51bWJlcnMgdXNlZCBpbiBhLm91dCBoZWFkZXIuICAqLwotI2RlZmluZSBFQ09GRl9BT1VUX09NQUdJQyAwNDA3CS8qIG5vdCBkZW1hbmQgcGFnZWQgKGxkIC1OKS4gICovCi0jZGVmaW5lIEVDT0ZGX0FPVVRfWk1BR0lDIDA0MTMJLyogZGVtYW5kIGxvYWQgZm9ybWF0LCBlZyBub3JtYWwgbGQgb3V0cHV0ICovCi0KLS8qIE5hbWVzIG9mIHNwZWNpYWwgc2VjdGlvbnMuICAqLwotI2RlZmluZSBfVEVYVCAgICIudGV4dCIKLSNkZWZpbmUgX0RBVEEgICAiLmRhdGEiCi0jZGVmaW5lIF9CU1MgICAgIi5ic3MiCi0jZGVmaW5lIF9SREFUQQkiLnJkYXRhIgotI2RlZmluZSBfU0RBVEEJIi5zZGF0YSIKLSNkZWZpbmUgX1NCU1MJIi5zYnNzIgotI2RlZmluZSBfTElUQQkiLmxpdGEiCi0jZGVmaW5lIF9MSVQ0CSIubGl0NCIKLSNkZWZpbmUgX0xJVDgJIi5saXQ4IgotI2RlZmluZSBfTElCCSIubGliIgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLSNkZWZpbmUgX1BEQVRBCSIucGRhdGEiCi0jZGVmaW5lIF9YREFUQQkiLnhkYXRhIgotI2RlZmluZSBfR09UCSIuZ290IgotI2RlZmluZSBfSEFTSAkiLmhhc2giCi0jZGVmaW5lIF9EWU5TWU0JIi5keW5zeW0iCi0jZGVmaW5lIF9EWU5TVFIJIi5keW5zdHIiCi0jZGVmaW5lIF9SRUxEWU4JIi5yZWwuZHluIgotI2RlZmluZSBfQ09ORkxJQyAiLmNvbmZsaWMiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQkxJU1QgIi5saWJsaXN0IgotI2RlZmluZSBfRFlOQU1JQyAiLmR5bmFtaWMiCi0jZGVmaW5lIF9SQ09OU1QJIi5yY29uc3QiCi0KLS8qIEVDT0ZGIHVzZXMgc29tZSBhZGRpdGlvbmFsIHNlY3Rpb24gZmxhZ3MuICAqLwotI2RlZmluZSBTVFlQX1JEQVRBCSAgICAgMHgxMDAKLSNkZWZpbmUgU1RZUF9TREFUQQkgICAgIDB4MjAwCi0jZGVmaW5lIFNUWVBfU0JTUwkgICAgIDB4NDAwCi0jZGVmaW5lIFNUWVBfR09UCSAgICAweDEwMDAKLSNkZWZpbmUgU1RZUF9EWU5BTUlDCSAgICAweDIwMDAKLSNkZWZpbmUgU1RZUF9EWU5TWU0JICAgIDB4NDAwMAotI2RlZmluZSBTVFlQX1JFTERZTgkgICAgMHg4MDAwCi0jZGVmaW5lIFNUWVBfRFlOU1RSCSAgIDB4MTAwMDAKLSNkZWZpbmUgU1RZUF9IQVNICSAgIDB4MjAwMDAKLSNkZWZpbmUgU1RZUF9MSUJMSVNUCSAgIDB4NDAwMDAKLSNkZWZpbmUgU1RZUF9DT05GTElDCSAgMHgxMDAwMDAKLSNkZWZpbmUgU1RZUF9FQ09GRl9GSU5JCSAweDEwMDAwMDAKLSNkZWZpbmUgU1RZUF9FWFRFTkRFU0MJIDB4MjAwMDAwMCAvKiAweDAyRkZGMDAwIGJpdHMgPT4gc2NuIHR5cGUsIHJlc3QgY2xyICovCi0jZGVmaW5lIFNUWVBfTElUQQkgMHg0MDAwMDAwCi0jZGVmaW5lIFNUWVBfTElUOAkgMHg4MDAwMDAwCi0jZGVmaW5lIFNUWVBfTElUNAkweDEwMDAwMDAwCi0jZGVmaW5lIFNUWVBfRUNPRkZfTElCCTB4NDAwMDAwMDAKLSNkZWZpbmUgU1RZUF9FQ09GRl9JTklUIDB4ODAwMDAwMDAKLSNkZWZpbmUgU1RZUF9PVEhFUl9MT0FEIChTVFlQX0VDT0ZGX0lOSVQgfCBTVFlQX0VDT0ZGX0ZJTkkpCi0KLS8qIGV4dGVuZGVkIHNlY3Rpb24gdHlwZXMgKi8KLSNkZWZpbmUgU1RZUF9DT01NRU5UCSAweDIxMDAwMDAKLSNkZWZpbmUgU1RZUF9SQ09OU1QJIDB4MjIwMDAwMAotI2RlZmluZSBTVFlQX1hEQVRBCSAweDI0MDAwMDAKLSNkZWZpbmUgU1RZUF9QREFUQQkgMHgyODAwMDAwCi0KLS8qIFRoZSBsaW5rZXIgbmVlZHMgYSBzZWN0aW9uIHRvIGhvbGQgc21hbGwgY29tbW9uIHZhcmlhYmxlcyB3aGlsZQotICAgbGlua2luZy4gIFRoZXJlIGlzIG5vIGNvbnZlbmllbnQgd2F5IHRvIGNyZWF0ZSBpdCB3aGVuIHRoZSBsaW5rZXIKLSAgIG5lZWRzIGl0LCBzbyB3ZSBhbHdheXMgY3JlYXRlIG9uZSBmb3IgZWFjaCBCRkQuICBXZSB0aGVuIGF2b2lkCi0gICB3cml0aW5nIGl0IG91dC4gICovCi0jZGVmaW5lIFNDT01NT04gIi5zY29tbW9uIgotCi0vKiBJZiB0aGUgZXh0ZXJuIGJpdCBpbiBhIHJlbG9jIGlzIDEsIHRoZW4gcl9zeW1uZHggaXMgYW4gaW5kZXggaW50bwotICAgdGhlIGV4dGVybmFsIHN5bWJvbCB0YWJsZS4gIElmIHRoZSBleHRlcm4gYml0IGlzIDAsIHRoZW4gcl9zeW1uZHgKLSAgIGluZGljYXRlcyBhIHNlY3Rpb24sIGFuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBSRUxPQ19TRUNUSU9OX05PTkUJMAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1RFWFQJMQotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1JEQVRBCTIKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9EQVRBCTMKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9TREFUQQk0Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fU0JTUwk1Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fQlNTCTYKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9JTklUCTcKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVQ4CTgKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVQ0CTkKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9YREFUQSAgICAxMAotI2RlZmluZSBSRUxPQ19TRUNUSU9OX1BEQVRBICAgIDExCi0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fRklOSSAgICAgMTIKLSNkZWZpbmUgUkVMT0NfU0VDVElPTl9MSVRBICAgICAxMwotI2RlZmluZSBSRUxPQ19TRUNUSU9OX0FCUyAgICAgIDE0Ci0jZGVmaW5lIFJFTE9DX1NFQ1RJT05fUkNPTlNUICAgMTUKLQotI2RlZmluZSBOVU1fUkVMT0NfU0VDVElPTlMgICAgIDE2Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUQUJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGdjYyB1c2VzIG1pcHMtdGZpbGUgdG8gb3V0cHV0IHR5cGUgaW5mb3JtYXRpb24gaW4gc3BlY2lhbCBzdGFicwotICAgZW50cmllcy4gIFRoZXNlIG11c3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgZGVmaW5pdGlvbiBpbgotICAgZ2NjL2NvbmZpZy9taXBzLmguICBBdCBzb21lIHBvaW50LCB0aGVzZSBzaG91bGQgcHJvYmFibHkgZ28gaW50byBhCi0gICBzaGFyZWQgaW5jbHVkZSBmaWxlLCBidXQgY3VycmVudGx5IGdjYyBhbmQgZ2RiIGRvIG5vdCBzaGFyZSBhbnkKLSAgIGRpcmVjdG9yaWVzLiAqLwotI2RlZmluZSBDT0RFX01BU0sgMHg4RjMwMAotI2RlZmluZSBFQ09GRl9JU19TVEFCKHN5bSkgKCgoc3ltKS0+aW5kZXggJiAweEZGRjAwKSA9PSBDT0RFX01BU0spCi0jZGVmaW5lIEVDT0ZGX01BUktfU1RBQihjb2RlKSAoKGNvZGUpK0NPREVfTUFTSykKLSNkZWZpbmUgRUNPRkZfVU5NQVJLX1NUQUIoY29kZSkgKChjb2RlKS1DT0RFX01BU0spCi0jZGVmaW5lIFNUQUJTX1NZTUJPTCAiQHN0YWJzIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBDT0ZGICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGdjYyBhbHNvIHVzZXMgbWlwcy10ZmlsZSB0byBvdXRwdXQgQ09GRiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0gICBUaGVzZSBhcmUgdGhlIHZhbHVlcyBpdCB1c2VzIHdoZW4gb3V0cHV0dGluZyB0aGUgLnR5cGUgZGlyZWN0aXZlLgotICAgVGhlc2Ugc2hvdWxkIGFsc28gYmUgaW4gYSBzaGFyZWQgaW5jbHVkZSBmaWxlLiAgKi8KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBVVggKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGF1eGlsaWFyeSB0eXBlIGluZm9ybWF0aW9uIGlzIHRoZSBzYW1lIG9uIGFsbCBrbm93biBFQ09GRgotICAgdGFyZ2V0cy4gIEkgY2FuJ3Qgc2VlIGFueSByZWFzb24gdGhhdCBpdCB3b3VsZCBldmVyIGNoYW5nZSwgc28gSSBhbQotICAgZ29pbmcgdG8gZ2FtYmxlIGFuZCBkZWZpbmUgdGhlIGV4dGVybmFsIHN0cnVjdHVyZXMgaGVyZSwgaW4gdGhlCi0gICB0YXJnZXQgaW5kZXBlbmRlbnQgRUNPRkYgaGVhZGVyIGZpbGUuICBUaGUgaW50ZXJuYWwgZm9ybXMgYXJlCi0gICBkZWZpbmVkIGluIGNvZmYvc3ltLmgsIHdoaWNoIHdhcyBvcmlnaW5hbGx5IGRvbmF0ZWQgYnkgTUlQUwotICAgQ29tcHV0ZXIgU3lzdGVtcy4gICovCi0KLS8qIFR5cGUgaW5mb3JtYXRpb24gZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCB0aXJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCXRfYml0czFbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxNDVbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxMDFbMV07Ci0JdW5zaWduZWQgY2hhcgl0X3RxMjNbMV07Ci19OwotCi0jZGVmaW5lCVRJUl9CSVRTMV9GQklURklFTERfQklHCQkoKHVuc2lnbmVkIGludCkgMHg4MCkKLSNkZWZpbmUJVElSX0JJVFMxX0ZCSVRGSUVMRF9MSVRUTEUJKCh1bnNpZ25lZCBpbnQpIDB4MDEpCi0KLSNkZWZpbmUJVElSX0JJVFMxX0NPTlRJTlVFRF9CSUcJCSgodW5zaWduZWQgaW50KSAweDQwKQotI2RlZmluZQlUSVJfQklUUzFfQ09OVElOVUVEX0xJVFRMRQkoKHVuc2lnbmVkIGludCkgMHgwMikKLQotI2RlZmluZQlUSVJfQklUUzFfQlRfQklHCQkoKHVuc2lnbmVkIGludCkgMHgzRikKLSNkZWZpbmUJVElSX0JJVFMxX0JUX1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUUzFfQlRfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGQykKLSNkZWZpbmUJVElSX0JJVFMxX0JUX1NIX0xJVFRMRQkJMgotCi0jZGVmaW5lCVRJUl9CSVRTX1RRNF9CSUcJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTRfU0hfQklHCQk0Ci0jZGVmaW5lCVRJUl9CSVRTX1RRNV9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTVfU0hfQklHCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRNF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlUSVJfQklUU19UUTRfU0hfTElUVExFCQkwCi0jZGVmaW5lCVRJUl9CSVRTX1RRNV9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweEYwKQotI2RlZmluZQlUSVJfQklUU19UUTVfU0hfTElUVExFCQk0Ci0KLSNkZWZpbmUJVElSX0JJVFNfVFEwX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9TSF9CSUcJCTQKLSNkZWZpbmUJVElSX0JJVFNfVFExX0JJRwkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9TSF9CSUcJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFEwX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4MEYpCi0jZGVmaW5lCVRJUl9CSVRTX1RRMF9TSF9MSVRUTEUJCTAKLSNkZWZpbmUJVElSX0JJVFNfVFExX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVRJUl9CSVRTX1RRMV9TSF9MSVRUTEUJCTQKLQotI2RlZmluZQlUSVJfQklUU19UUTJfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFEyX1NIX0JJRwkJNAotI2RlZmluZQlUSVJfQklUU19UUTNfQklHCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFEzX1NIX0JJRwkJMAotI2RlZmluZQlUSVJfQklUU19UUTJfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHgwRikKLSNkZWZpbmUJVElSX0JJVFNfVFEyX1NIX0xJVFRMRQkJMAotI2RlZmluZQlUSVJfQklUU19UUTNfTElUVExFCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJVElSX0JJVFNfVFEzX1NIX0xJVFRMRQkJNAotCi0vKiBSZWxhdGl2ZSBzeW1ib2wgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBybmR4X2V4dCB7Ci0JdW5zaWduZWQgY2hhcglyX2JpdHNbNF07Ci19OwotCi0jZGVmaW5lCVJORFhfQklUUzBfUkZEX1NIX0xFRlRfQklHCTQKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfQklHCQkoKHVuc2lnbmVkIGludCkgMHhGMCkKLSNkZWZpbmUJUk5EWF9CSVRTMV9SRkRfU0hfQklHCQk0Ci0KLSNkZWZpbmUJUk5EWF9CSVRTMF9SRkRfU0hfTEVGVF9MSVRUTEUJMAotI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9MSVRUTEUJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlSTkRYX0JJVFMxX1JGRF9TSF9MRUZUX0xJVFRMRQk4Ci0KLSNkZWZpbmUJUk5EWF9CSVRTMV9JTkRFWF9CSUcJCSgodW5zaWduZWQgaW50KSAweDBGKQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVJORFhfQklUUzJfSU5ERVhfU0hfTEVGVF9CSUcJOAotI2RlZmluZQlSTkRYX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTAKLQotI2RlZmluZQlSTkRYX0JJVFMxX0lOREVYX0xJVFRMRQkJKCh1bnNpZ25lZCBpbnQpIDB4RjApCi0jZGVmaW5lCVJORFhfQklUUzFfSU5ERVhfU0hfTElUVExFCTQKLSNkZWZpbmUJUk5EWF9CSVRTMl9JTkRFWF9TSF9MRUZUX0xJVFRMRQk0Ci0jZGVmaW5lCVJORFhfQklUUzNfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogQXV4aWxpYXJ5IHN5bWJvbCBpbmZvcm1hdGlvbiBleHRlcm5hbCByZWNvcmQgKi8KLQotdW5pb24gYXV4X2V4dCB7Ci0Jc3RydWN0IHRpcl9leHQJYV90aTsKLQlzdHJ1Y3Qgcm5keF9leHQJYV9ybmR4OwotCXVuc2lnbmVkIGNoYXIJYV9kbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCWFfZG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9pc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9pc3NbNF07Ci0JdW5zaWduZWQgY2hhcglhX3dpZHRoWzRdOwotCXVuc2lnbmVkIGNoYXIJYV9jb3VudFs0XTsKLX07Ci0KLSNkZWZpbmUgQVVYX0dFVF9BTlkoYmlnZW5kLCBheCwgZmllbGQpIFwKLSAgKChiaWdlbmQpID8gYmZkX2dldGIzMiAoKGF4KS0+ZmllbGQpIDogYmZkX2dldGwzMiAoKGF4KS0+ZmllbGQpKQotCi0jZGVmaW5lCUFVWF9HRVRfRE5MT1coYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2RuTG93KQotI2RlZmluZQlBVVhfR0VUX0ROSElHSChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfZG5IaWdoKQotI2RlZmluZQlBVVhfR0VUX0lTWU0oYmlnZW5kLCBheCkJQVVYX0dFVF9BTlkgKChiaWdlbmQpLCAoYXgpLCBhX2lzeW0pCi0jZGVmaW5lIEFVWF9HRVRfSVNTKGJpZ2VuZCwgYXgpCQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfaXNzKQotI2RlZmluZSBBVVhfR0VUX1dJRFRIKGJpZ2VuZCwgYXgpCUFVWF9HRVRfQU5ZICgoYmlnZW5kKSwgKGF4KSwgYV93aWR0aCkKLSNkZWZpbmUgQVVYX0dFVF9DT1VOVChiaWdlbmQsIGF4KQlBVVhfR0VUX0FOWSAoKGJpZ2VuZCksIChheCksIGFfY291bnQpCi0KLSNkZWZpbmUgQVVYX1BVVF9BTlkoYmlnZW5kLCB2YWwsIGF4LCBmaWVsZCkgXAotICAoKGJpZ2VuZCkgXAotICAgPyAoYmZkX3B1dGIzMiAoKGJmZF92bWEpICh2YWwpLCAoYXgpLT5maWVsZCksIDApIFwKLSAgIDogKGJmZF9wdXRsMzIgKChiZmRfdm1hKSAodmFsKSwgKGF4KS0+ZmllbGQpLCAwKSkKLQotI2RlZmluZSBBVVhfUFVUX0ROTE9XKGJpZ2VuZCwgdmFsLCBheCkgXAotICBBVVhfUFVUX0FOWSAoKGJpZ2VuZCksICh2YWwpLCAoYXgpLCBhX2RuTG93KQotI2RlZmluZSBBVVhfUFVUX0ROSElHSChiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9kbkhpZ2gpCi0jZGVmaW5lIEFVWF9QVVRfSVNZTShiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9pc3ltKQotI2RlZmluZSBBVVhfUFVUX0lTUyhiaWdlbmQsIHZhbCwgYXgpIFwKLSAgQVVYX1BVVF9BTlkgKChiaWdlbmQpLCAodmFsKSwgKGF4KSwgYV9pc3MpCi0jZGVmaW5lIEFVWF9QVVRfV0lEVEgoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfd2lkdGgpCi0jZGVmaW5lIEFVWF9QVVRfQ09VTlQoYmlnZW5kLCB2YWwsIGF4KSBcCi0gIEFVWF9QVVRfQU5ZICgoYmlnZW5kKSwgKHZhbCksIChheCksIGFfY291bnQpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRm9yIGVmZmljaWVuY3ksIGdkYiBkZWFscyBkaXJlY3RseSB3aXRoIHRoZSB1bnN3YXBwZWQgc3ltYm9saWMKLSAgIGluZm9ybWF0aW9uICh0aGF0IHdheSBpdCBvbmx5IHRha2VzIHRoZSB0aW1lIHRvIHN3YXAgaW5mb3JtYXRpb24KLSAgIHRoYXQgaXQgcmVhbGx5IG5lZWRzIHRvIHJlYWQpLiAgZ2RiIG9yaWdpbmFsbHkgcmV0cmlldmVkIHRoZQotICAgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSB0aGUgQkZEIGJhY2tlbmQgaW5mb3JtYXRpb24sIGJ1dCB0aGF0Ci0gICBzdHJhdGVneSwgYmVzaWRlcyBiZWluZyBzb3J0IG9mIHVnbHksIGRvZXMgbm90IHdvcmsgZm9yIE1JUFMgRUxGLAotICAgd2hpY2ggYWxzbyB1c2VzIEVDT0ZGIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoaXMgc3RydWN0dXJlIGhvbGRzCi0gICBwb2ludGVycyB0byB0aGUgKG1vc3RseSkgdW5zd2FwcGVkIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLQotc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8KLXsKLSAgLyogVGhlIHN3YXBwZWQgRUNPRkYgc3ltYm9saWMgaGVhZGVyLiAgKi8KLSAgSERSUiBzeW1ib2xpY19oZWFkZXI7Ci0KLSAgLyogUG9pbnRlcnMgdG8gdGhlIHVuc3dhcHBlZCBzeW1ib2xpYyBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCB0aGUKLSAgICAgcG9pbnRlcnMgdG8gZXh0ZXJuYWwgc3RydWN0dXJlcyBwb2ludCB0byBkaWZmZXJlbnQgc29ydHMgb2YKLSAgICAgaW5mb3JtYXRpb24gb24gZGlmZmVyZW50IEVDT0ZGIHRhcmdldHMuICBUaGUgZWNvZmZfZGVidWdfc3dhcAotICAgICBzdHJ1Y3R1cmUgcHJvdmlkZXMgdGhlIHNpemVzIG9mIHRoZSBzdHJ1Y3R1cmVzIGFuZCB0aGUgZnVuY3Rpb25zCi0gICAgIG5lZWRlZCB0byBzd2FwIHRoZSBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0LiAgVGhlc2UgcG9pbnRlcnMgYXJlCi0gICAgIGFsbCBwb2ludGVycyB0byBhcnJheXMsIG5vdCBzaW5nbGUgc3RydWN0dXJlcy4gIFRoZXkgd2lsbCBiZSBOVUxMCi0gICAgIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgb2YgdGhlIHJlbGV2YW50IHN0cnVjdHVyZS4gIFRoZXNlCi0gICAgIGZpZWxkcyBhcmUgYWxzbyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgdG8gb3V0cHV0IEVDT0ZGIGRlYnVnZ2luZwotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmxpbmU7Ci0gIFBUUiBleHRlcm5hbF9kbnI7CS8qIHN0cnVjdCBkbnJfZXh0ICovCi0gIFBUUiBleHRlcm5hbF9wZHI7CS8qIHN0cnVjdCBwZHJfZXh0ICovCi0gIFBUUiBleHRlcm5hbF9zeW07CS8qIHN0cnVjdCBzeW1fZXh0ICovCi0gIFBUUiBleHRlcm5hbF9vcHQ7CS8qIHN0cnVjdCBvcHRfZXh0ICovCi0gIHVuaW9uIGF1eF9leHQgKmV4dGVybmFsX2F1eDsKLSAgY2hhciAqc3M7Ci0gIGNoYXIgKnNzZXh0OwotICBQVFIgZXh0ZXJuYWxfZmRyOwkvKiBzdHJ1Y3QgZmRyX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfcmZkOwkvKiBzdHJ1Y3QgcmZkX2V4dCAqLwotICBQVFIgZXh0ZXJuYWxfZXh0OwkvKiBzdHJ1Y3QgZXh0X2V4dCAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgdXNlZCB3aGVuIGxpbmtpbmcuICBUaGV5IG1heSBkaXNhcHBlYXIgYXQgc29tZQotICAgICBwb2ludC4gICovCi0gIGNoYXIgKnNzZXh0X2VuZDsKLSAgUFRSIGV4dGVybmFsX2V4dF9lbmQ7Ci0KLSAgLyogV2hlbiBsaW5raW5nLCB0aGlzIGZpZWxkIGhvbGRzIGEgbWFwcGluZyBmcm9tIHRoZSBpbnB1dCBGRFIKLSAgICAgbnVtYmVycyB0byB0aGUgb3V0cHV0IG51bWJlcnMsIGFuZCBpcyB1c2VkIHdoZW4gd3JpdGluZyBvdXQgdGhlCi0gICAgIGV4dGVybmFsIHN5bWJvbHMuICBJdCBpcyBOVUxMIGlmIG5vIG1hcHBpbmcgaXMgcmVxdWlyZWQuICAqLwotICBSRkRUICppZmRtYXA7Ci0KLSAgLyogVGhlIHN3YXBwZWQgRkRSIGluZm9ybWF0aW9uLiAgQ3VycmVudGx5IHRoaXMgaXMgbmV2ZXIgTlVMTCwgYnV0Ci0gICAgIGNvZGUgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIHByb2JhYmx5IGRvdWJsZS1jaGVjayBpbiBjYXNlCi0gICAgIHRoaXMgY2hhbmdlcyBpbiB0aGUgZnV0dXJlLiAgVGhpcyBpcyBhIHBvaW50ZXIgdG8gYW4gYXJyYXksIG5vdCBhCi0gICAgIHNpbmdsZSBzdHJ1Y3R1cmUuICAqLwotICBGRFIgKmZkcjsKLQotICAvKiBXaGVuIHJlbGF4aW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUsIHdlIG1heSBuZWVkIHRvIGFkanVzdAotICAgICBzeW1ib2wgdmFsdWVzIHdoZW4gdGhleSBhcmUgb3V0cHV0LiAgVGhpcyBpcyBhIGxpbmtlZCBsaXN0IG9mCi0gICAgIHN0cnVjdHVyZXMgaW5kaWNhdGluZyBob3cgdmFsdWVzIHNob3VsZCBiZSBhZGp1c3RlZC4gIFRoZXJlIGlzIG5vCi0gICAgIHJlcXVpcmVtZW50IHRoYXQgdGhlIGVudHJpZXMgYmUgaW4gYW55IG9yZGVyLCBvciB0aGF0IHRoZXkgbm90Ci0gICAgIG92ZXJsYXAuICBUaGlzIGZpZWxkIGlzIG5vcm1hbGx5IE5VTEwsIGluIHdoaWNoIGNhc2Ugbm8KLSAgICAgYWRqdXN0bWVudHMgbmVlZCB0byBiZSBtYWRlLiAgKi8KLSAgc3RydWN0IGVjb2ZmX3ZhbHVlX2FkanVzdCAqYWRqdXN0OwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGhvdyB0byBhZGp1c3Qgc3ltYm9sIHZhbHVlcyB3aGVuCi0gICBvdXRwdXR0aW5nIE1JUFMgZW1iZWRkZWQgUElDIGNvZGUuICBUaGVzZSBhZGp1c3RtZW50cyBvbmx5IGFwcGx5IHRvCi0gICB0aGUgaW50ZXJuYWwgc3ltYm9scywgYXMgdGhlIGV4dGVybmFsIHN5bWJvbCB2YWx1ZXMgd2lsbCBjb21lIGZyb20KLSAgIHRoZSBoYXNoIHRhYmxlIGFuZCBoYXZlIGFscmVhZHkgYmVlbiBhZGp1c3RlZC4gICovCi0KLXN0cnVjdCBlY29mZl92YWx1ZV9hZGp1c3QKLXsKLSAgLyogTmV4dCBlbnRyeSBvbiBhZGp1c3RtZW50IGxpc3QuICAqLwotICBzdHJ1Y3QgZWNvZmZfdmFsdWVfYWRqdXN0ICpuZXh0OwotICAvKiBTdGFydGluZyBWTUEgb2YgYWRqdXN0bWVudC4gIFRoaXMgaXMgdGhlIFZNQSBpbiB0aGUgRUNPRkYgZmlsZSwKLSAgICAgbm90IHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uICBUaHVzIGl0IHNob3VsZAotICAgICBpbmRpY2F0ZSBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gICovCi0gIGJmZF92bWEgc3RhcnQ7Ci0gIC8qIEVuZGluZyBWTUEgb2YgYWRqdXN0bWVudC4gICovCi0gIGJmZF92bWEgZW5kOwotICAvKiBBZGp1c3RtZW50LiAgVGhpcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wsIG9yCi0gICAgIEZEUi4gIFRoaXMgaXMgemVybyBmb3IgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5LiAgKi8KLSAgbG9uZyBhZGp1c3Q7Ci19OwotCi0vKiBUaGVzZSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGJ5IHRoZSBFQ09GRiBmaW5kX25lYXJlc3RfbGluZSBmdW5jdGlvbi4gICovCi0KLXN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkKLXsKLSAgLyogQmFzZSBhZGRyZXNzIGluIC50ZXh0IG9mIHRoaXMgRkRSLiAgKi8KLSAgYmZkX3ZtYSBiYXNlX2FkZHI7Ci0gIEZEUiAqZmRyOwotfTsKLQotc3RydWN0IGVjb2ZmX2ZpbmRfbGluZQotewotICAvKiBBbGxvY2F0ZWQgbWVtb3J5IHRvIGhvbGQgZnVuY3Rpb24gYW5kIGZpbGUgbmFtZXMuICAqLwotICBjaGFyICpmaW5kX2J1ZmZlcjsKLQotICAvKiBGRFIgdGFibGUsIHNvcnRlZCBieSBhZGRyZXNzOiAqLwotICBsb25nIGZkcnRhYl9sZW47Ci0gIHN0cnVjdCBlY29mZl9mZHJ0YWJfZW50cnkgKmZkcnRhYjsKLQotICAvKiBDYWNoZSBlbnRyeSBmb3IgbW9zdCByZWNlbnRseSBmb3VuZCBsaW5lIGluZm9ybWF0aW9uLiAgVGhlIHNlY3QKLSAgICAgZmllbGQgaXMgTlVMTCBpZiB0aGlzIGNhY2hlIGRvZXMgbm90IGNvbnRhaW4gdmFsaWQgaW5mb3JtYXRpb24uICAqLwotICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqc2VjdDsKLSAgICAgIGJmZF92bWEgc3RhcnQ7Ci0gICAgICBiZmRfdm1hIHN0b3A7Ci0gICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9ubmFtZTsKLSAgICAgIHVuc2lnbmVkIGludCBsaW5lX251bTsKLSAgICB9IGNhY2hlOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1dBUFBJTkcgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGdlbmVyaWMgRUNPRkYgY29kZSBuZWVkcyB0byBiZSBhYmxlIHRvIHN3YXAgZGVidWdnaW5nCi0gICBpbmZvcm1hdGlvbiBpbiBhbmQgb3V0IGluIHRoZSBzcGVjaWZpYyBmb3JtYXQgdXNlZCBieSBhIHBhcnRpY3VsYXIKLSAgIEVDT0ZGIGltcGxlbWVudGF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uCi0gICBuZWVkZWQgdG8gZG8gdGhpcy4gICovCi0KLXN0cnVjdCBlY29mZl9kZWJ1Z19zd2FwCi17Ci0gIC8qIFN5bWJvbCB0YWJsZSBtYWdpYyBudW1iZXIuICAqLwotICBpbnQgc3ltX21hZ2ljOwotICAvKiBBbGlnbm1lbnQgb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgRS5nLiwgNC4gICovCi0gIGJmZF9zaXplX3R5cGUgZGVidWdfYWxpZ247Ci0gIC8qIFNpemVzIG9mIGV4dGVybmFsIHN5bWJvbGljIGluZm9ybWF0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9oZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9kbnJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9wZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9zeW1fc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9vcHRfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9mZHJfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9yZmRfc2l6ZTsKLSAgYmZkX3NpemVfdHlwZSBleHRlcm5hbF9leHRfc2l6ZTsKLSAgLyogRnVuY3Rpb25zIHRvIHN3YXAgaW4gZXh0ZXJuYWwgc3ltYm9saWMgZGF0YS4gICovCi0gIHZvaWQgKCpzd2FwX2hkcl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgSERSUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX2Rucl9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRE5SICopKTsKLSAgdm9pZCAoKnN3YXBfcGRyX2luKSBQQVJBTVMgKChiZmQgKiwgUFRSLCBQRFIgKikpOwotICB2b2lkICgqc3dhcF9zeW1faW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIFNZTVIgKikpOwotICB2b2lkICgqc3dhcF9vcHRfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIE9QVFIgKikpOwotICB2b2lkICgqc3dhcF9mZHJfaW4pIFBBUkFNUyAoKGJmZCAqLCBQVFIsIEZEUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JmZF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgUkZEVCAqKSk7Ci0gIHZvaWQgKCpzd2FwX2V4dF9pbikgUEFSQU1TICgoYmZkICosIFBUUiwgRVhUUiAqKSk7Ci0gIHZvaWQgKCpzd2FwX3Rpcl9pbikgUEFSQU1TICgoaW50LCBjb25zdCBzdHJ1Y3QgdGlyX2V4dCAqLCBUSVIgKikpOwotICB2b2lkICgqc3dhcF9ybmR4X2luKSBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCBybmR4X2V4dCAqLCBSTkRYUiAqKSk7Ci0gIC8qIEZ1bmN0aW9ucyB0byBzd2FwIG91dCBleHRlcm5hbCBzeW1ib2xpYyBkYXRhLiAgKi8KLSAgdm9pZCAoKnN3YXBfaGRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEhEUlIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2Rucl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBETlIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3Bkcl9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBQRFIgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX3N5bV9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBTWU1SICosIFBUUikpOwotICB2b2lkICgqc3dhcF9vcHRfb3V0KSBQQVJBTVMgKChiZmQgKiwgY29uc3QgT1BUUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfZmRyX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IEZEUiAqLCBQVFIpKTsKLSAgdm9pZCAoKnN3YXBfcmZkX291dCkgUEFSQU1TICgoYmZkICosIGNvbnN0IFJGRFQgKiwgUFRSKSk7Ci0gIHZvaWQgKCpzd2FwX2V4dF9vdXQpIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFWFRSICosIFBUUikpOwotICB2b2lkICgqc3dhcF90aXJfb3V0KSBQQVJBTVMgKChpbnQsIGNvbnN0IFRJUiAqLCBzdHJ1Y3QgdGlyX2V4dCAqKSk7Ci0gIHZvaWQgKCpzd2FwX3JuZHhfb3V0KSBQQVJBTVMgKChpbnQsIGNvbnN0IFJORFhSICosIHN0cnVjdCBybmR4X2V4dCAqKSk7Ci0gIC8qIEZ1bmN0aW9uIHRvIHJlYWQgc3ltYm9sIGRhdGEgYW5kIHNldCB1cCBwb2ludGVycyBpbgotICAgICBlY29mZl9kZWJ1Z19pbmZvIHN0cnVjdHVyZS4gIFRoZSBzZWN0aW9uIGFyZ3VtZW50IGlzIHVzZWQgZm9yCi0gICAgIEVMRiwgbm90IHN0cmFpZ2h0IEVDT0ZGLiAgKi8KLSAgYm9vbGVhbiAoKnJlYWRfZGVidWdfaW5mbykgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosCi0JCQkJICAgICAgc3RydWN0IGVjb2ZmX2RlYnVnX2luZm8gKikpOwotfTsKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoRUNPRkZfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9nbzMyZXhlLmggYi9pbmNsdWRlL2NvZmYvZ28zMmV4ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmQyNmMxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9nbzMyZXhlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiBDT0ZGIGluZm9ybWF0aW9uIGZvciBQQyBydW5uaW5nIGdvMzIuICAqLwotCi0jZGVmaW5lIFNUVUJTSVpFIDIwNDgKLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHJfZ28zMl9leGUgewotCWNoYXIgc3R1YltTVFVCU0laRV07CS8qIHRoZSBzdHViIHRvIGxvYWQgdGhlIGltYWdlCSovCi0JLyogdGhlIHN0YW5kYXJkIENPRkYgaGVhZGVyICovCi0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI3VuZGVmIEZJTEhEUgotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHJfZ28zMl9leGUKLSN1bmRlZiBGSUxIU1oKLSNkZWZpbmUJRklMSFNaCVNUVUJTSVpFKzIwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvaDgzMDAuaCBiL2luY2x1ZGUvY29mZi9oODMwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjYyMzk0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9oODMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBIOC8zMDAgYW5kIEg4LzMwMC1IICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLQotI2RlZmluZQlIODMwME1BR0lDCTB4ODMwMAotI2RlZmluZQlIODMwMEhNQUdJQwkweDgzMDEKLSNkZWZpbmUJSDgzMDBTTUFHSUMJMHg4MzAyCi0KLSNkZWZpbmUgSDgzMDBCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9SDgzMDBNQUdJQykpCi0jZGVmaW5lIEg4MzAwSEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwMEhNQUdJQykpCi0jZGVmaW5lIEg4MzAwU0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1IODMwMFNNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0jZGVmaW5lIEFPVVRTWiAyOAotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1s0XTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0jZGVmaW5lIEdFVF9MSU5FTk9fTE5OTyhhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCx2YWwsICAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9vZmZzZXRbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHJfc3R1ZmZbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KLQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9oODUwMC5oIGIvaW5jbHVkZS9jb2ZmL2g4NTAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDViZjJiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9oODUwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBIOC81MDAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotCi0jZGVmaW5lCUg4NTAwTUFHSUMJMHg4NTAwCi0KLQotI2RlZmluZSBIODUwMEJBRE1BRyh4KSAoKDB4ZmZmZiAmJiAoKHgpLmZfbWFnaWMpIT1IODUwME1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGUgZXh0ZXJuYWwgcmVsb2MgaGFzIGFuIG9mZnNldCBmaWVsZCwgYmVjYXVzZSBzb21lIG9mIHRoZSByZWxvYwotICAgdHlwZXMgb24gdGhlIGg4IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL2kzODYuaCBiL2luY2x1ZGUvY29mZi9pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYmY0YTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2kzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIEludGVsIDM4Ni80ODYuICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKiBCaXRzIGZvciBmX2ZsYWdzOgotICoJRl9SRUxGTEcJcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9FWEVDCQlmaWxlIGlzIGV4ZWN1dGFibGUgKG5vIHVucmVzb2x2ZWQgZXh0ZXJuYWwgcmVmZXJlbmNlcykKLSAqCUZfTE5OTwkJbGluZSBudW1iZXJzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9MU1lNUwkJbG9jYWwgc3ltYm9scyBzdHJpcHBlZCBmcm9tIGZpbGUKLSAqCUZfQVIzMldSCWZpbGUgaGFzIGJ5dGUgb3JkZXJpbmcgb2YgYW4gQVIzMldSIG1hY2hpbmUgKGUuZy4gdmF4KQotICovCi0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkKLSNkZWZpbmUgRl9FWEVDCQkoMHgwMDAyKQotI2RlZmluZSBGX0xOTk8JCSgweDAwMDQpCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCi0KLQotCi0jZGVmaW5lCUkzODZNQUdJQwkweDE0YwotI2RlZmluZSBJMzg2UFRYTUFHSUMJMHgxNTQKLSNkZWZpbmUgSTM4NkFJWE1BR0lDCTB4MTc1Ci0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJMDQxNQotCi0jZGVmaW5lIEkzODZCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyAhPSBJMzg2TUFHSUMpIFwKLQkJICAgICAgICYmICh4KS5mX21hZ2ljICE9IEkzODZBSVhNQUdJQyBcCi0JCSAgICAgICAmJiAoeCkuZl9tYWdpYyAhPSBJMzg2UFRYTUFHSUMgXAotCQkgICAgICAgJiYgKHgpLmZfbWFnaWMgIT0gTFlOWENPRkZNQUdJQykKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLQotCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0jZGVmaW5lIE9NQUdJQyAgICAgICAgICAwNDA0ICAgIC8qIG9iamVjdCBmaWxlcywgZWcgYXMgb3V0cHV0ICovCi0jZGVmaW5lIFpNQUdJQyAgICAgICAgICAwNDEzICAgIC8qIGRlbWFuZCBsb2FkIGZvcm1hdCwgZWcgbm9ybWFsIGxkIG91dHB1dCAqLwotI2RlZmluZSBTVE1BR0lDCQkwNDAxCS8qIHRhcmdldCBzaGxpYiAqLwotI2RlZmluZSBTSE1BR0lDCQkwNDQzCS8qIGhvc3QgICBzaGxpYiAqLwotCi0KLS8qIGRlZmluZSBzb21lIE5UIGRlZmF1bHQgdmFsdWVzICovCi0vKiAgI2RlZmluZSBOVF9JTUFHRV9CQVNFICAgICAgICAweDQwMDAwMCBtb3ZlZCB0byBpbnRlcm5hbC5oICovCi0jZGVmaW5lIE5UX1NFQ1RJT05fQUxJR05NRU5UIDB4MTAwMAotI2RlZmluZSBOVF9GSUxFX0FMSUdOTUVOVCAgICAweDIwMAotI2RlZmluZSBOVF9ERUZfUkVTRVJWRSAgICAgICAweDEwMDAwMAotI2RlZmluZSBOVF9ERUZfQ09NTUlUICAgICAgICAweDEwMDAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JCWNoYXIgeF9jaGVja3N1bVs0XTsJLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0gKi8KLQkJY2hhciB4X2Fzc29jaWF0ZWRbMl07CS8qIENPTURBVCBhc3NvY2lhdGVkIHNlY3Rpb24gaW5kZXggKi8KLQkJY2hhciB4X2NvbWRhdFsxXTsJLyogQ09NREFUIHNlbGVjdGlvbiBudW1iZXIgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pODYwLmggYi9pbmNsdWRlL2NvZmYvaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzY4NmU5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pODYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyogVGhpcyBmaWxlIHdhcyBoYWNrZWQgZnJvbSBpMzg2LmggICBbZG9sYW5Ac3NkLmludGVsLmNvbV0gKi8KLQotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBJbnRlbCA4NjAuICAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLQotCi0KLSNkZWZpbmUJSTg2ME1BR0lDCTB4MTRkCi0KLSNkZWZpbmUgSTg2MEJBRE1BRyh4KSAgICgoeCkuZl9tYWdpYyAhPSBJODYwTUFHSUMpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLSNkZWZpbmUgQU9VVFNaIDI4Ci0jZGVmaW5lIEFPVVRIRFJTWiAyOAotCi0vKiBGSVhNRTogV2hhdCBhcmUgdGhlIGEub3V0IG1hZ2ljIG51bWJlcnM/ICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotCWNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLQljaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotCWNoYXIJCXNfdmFkZHJbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLQljaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0JY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0JY2hhcgkJc19yZWxwdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLQljaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotCWNoYXIJCXNfbnJlbG9jWzJdOwkvKiBudW1iZXIgb2YgcmVsb2NhdGlvbiBlbnRyaWVzCSovCi0JY2hhcgkJc19ubG5ub1syXTsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotCWNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotCi0jCWRlZmluZSBfRVRFWFQJImV0ZXh0IgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pOTYwLmggYi9pbmNsdWRlL2NvZmYvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTM1ODM2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciA4MDk2MC4gIE9yaWdpbnM6IEludGVsIGNvcnAsIG5hdGNoLiAqLwotCi0vKiBOT1RFOiBUYWdlbnRyaWVzIChjZiBUQUdCSVRTKSBhcmUgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIDk2MCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZSBPTUFHSUMgICAgICAoMDQwNykJLyogb2xkIGltcHVyZSBmb3JtYXQuIGRhdGEgaW1tZWRpYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93cyB0ZXh0LiBib3RoIHNlY3Rpb25zIGFyZSBydy4gKi8KLSNkZWZpbmUgTk1BR0lDICAgICAgKDA0MTApCS8qIHNwbGl0IGkmZCwgcmVhZC1vbmx5IHRleHQgKi8KLQotLyoKLSoJSW50ZWwgODA5NjAgKEk5NjApIHByb2Nlc3NvciBmbGFncy4KLSoJRl9JOTYwVFlQRSA9PSBtYXNrIGZvciBwcm9jZXNzb3IgdHlwZSBmaWVsZC4gCi0qLwotCi0jZGVmaW5lCUZfSTk2MFRZUEUJKDB4ZjAwMCkKLSNkZWZpbmUJRl9JOTYwQ09SRQkoMHgxMDAwKQotI2RlZmluZQlGX0k5NjBLQgkoMHgyMDAwKQotI2RlZmluZQlGX0k5NjBTQgkoMHgyMDAwKQotI2RlZmluZQlGX0k5NjBNQwkoMHgzMDAwKQotI2RlZmluZQlGX0k5NjBYQQkoMHg0MDAwKQotI2RlZmluZQlGX0k5NjBDQQkoMHg1MDAwKQotI2RlZmluZQlGX0k5NjBLQQkoMHg2MDAwKQotI2RlZmluZQlGX0k5NjBTQQkoMHg2MDAwKQotI2RlZmluZSBGX0k5NjBKWAkoMHg3MDAwKQotI2RlZmluZSBGX0k5NjBIWAkoMHg4MDAwKQotCi0KLS8qKiBpODA5NjAgTWFnaWMgTnVtYmVycwotKi8KLQotI2RlZmluZSBJOTYwUk9NQUdJQwkoMHgxNjApCS8qIHJlYWQtb25seSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lIEk5NjBSV01BR0lDCSgweDE2MSkJLyogcmVhZC13cml0ZSB0ZXh0IHNlZ21lbnRzICovCi0KLSNkZWZpbmUgSTk2MEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1JOTYwUk9NQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1JOTYwUldNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nCXBoeXNfYWRkcjsKLQl1bnNpZ25lZCBsb25nCWJpdGFycmF5OwotfSBUQUdCSVRTOwotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyCXRhZ2VudHJpZXNbNF07CQkvKiBudW1iZXIgb2YgdGFnIGVudHJpZXMgdG8gZm9sbG93ICovCi19Ci1BT1VUSERSOwotCi0vKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB0YWcgYml0cyBhcnJheSAqLwotCi0jZGVmaW5lIFRBR1BUUihhb3V0KSAoKFRBR0JJVFMgKikgKCYoYW91dC50YWdlbnRyaWVzKSsxKSkKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLS8qI2RlZmluZSBBT1VUU1ooYW91dCkgKHNpemVvZihBT1VUSERSKSsoYW91dC50YWdlbnRyaWVzKnNpemVvZihUQUdCSVRTKSkpKi8KLSNkZWZpbmUgQU9VVFNaIDMyCi0jZGVmaW5lIEFPVVRIRFJTWiAzMgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotCWNoYXIgCQlzX2FsaWduWzRdOwkvKiBzZWN0aW9uIGFsaWdubWVudAkJKi8KLX07Ci0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDQKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkJLyogbGluZSBudW1iZXIJCSovCi0JY2hhciBwYWRkaW5nWzJdOwkvKiBmb3JjZSBhbGlnbm1lbnQJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX2ZsYWdzWzJdOwotICBjaGFyIGVfdHlwZVs0XTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWQyWzJdOwotfTsKLQotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMHgxZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4NjApCi0jZGVmaW5lIE5fQlRTSEZUCSg1KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotCXN0cnVjdCB7Ci0JCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQkJdW5pb24gewotCQkJc3RydWN0IHsKLQkJCSAgICBjaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCQkgICAgY2hhciAgeF9zaXplWzJdOyAvKiBzdHIvdW5pb24vYXJyYXkgc2l6ZSAqLwotCQkJfSB4X2xuc3o7Ci0JCQljaGFyIHhfZnNpemVbNF07CS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQkJfSB4X21pc2M7Ci0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQkJCSAgICBjaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJCSAgICBjaGFyIHhfZW5kbmR4WzRdOwkvKiBlbnRyeSBuZHggcGFzdCBibG9jayBlbmQgKi8KLQkJCX0geF9mY247Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0JCQkgICAgY2hhciB4X2RpbWVuW0VfRElNTlVNXVsyXTsKLQkJCX0geF9hcnk7Ci0JCX0geF9mY25hcnk7Ci0JCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0JfSB4X3N5bTsKLQotCXVuaW9uIHsKLQkJY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCQlzdHJ1Y3QgewotCQkJY2hhciB4X3plcm9lc1s0XTsKLQkJCWNoYXIgeF9vZmZzZXRbNF07Ci0JCX0geF9uOwotCX0geF9maWxlOwotCi0Jc3RydWN0IHsKLQkJY2hhciB4X3Njbmxlbls0XTsJCQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotCQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCQljaGFyIHhfbmxpbm5vWzJdOwkvKiAjIGxpbmUgbnVtYmVycyAqLwotCX0geF9zY247Ci0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3R2ZmlsbFs0XTsJLyogdHYgZmlsbCB2YWx1ZSAqLwotCQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQkJY2hhciB4X3R2cmFuWzJdWzJdOwkvKiB0diByYW5nZSAqLwotCX0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAgSTk2MC1zcGVjaWZpYyAqMm5kKiBhdXguIGVudHJ5IGZvcm1hdHMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXN0cnVjdCB7Ci0JICAvKiBUaGlzIGlzIGEgdmVyeSBvbGQgdHlwbyB0aGF0IGtlZXBzIGdldHRpbmcgcHJvcGFnYXRlZC4gKi8KLSNkZWZpbmUgeF9zdGRpbmR4IHhfc3RpbmR4Ci0JCWNoYXIgeF9zdGluZHhbNF07CS8qIHN5cy4gdGFibGUgZW50cnkgKi8KLQl9IHhfc2M7CS8qIHN5c3RlbSBjYWxsIGVudHJ5ICovCi0KLQlzdHJ1Y3QgewotCQljaGFyIHhfYmFsbnRyeVs0XTsgLyogQkFMIGVudHJ5IHBvaW50ICovCi0JfSB4X2JhbDsgLyogQkFMLWNhbGxhYmxlIGZ1bmN0aW9uICovCi0KLSAgICAgICAgc3RydWN0IHsKLQkJY2hhciB4X3RpbWVzdGFtcFs0XTsJICAgICAgICAvKiB0aW1lIHN0YW1wICovCi0JCWNoYXIgCXhfaWRzdHJpbmdbMjBdOwkgICAgICAgIC8qIHByb2R1Y2VyIGlkZW50aXR5IHN0cmluZyAqLwotCX0geF9pZGVudDsJICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvZHVjZXIgaWRlbnQgaW5mbyAqLwotCi19OwotCi0KLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMjQKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMjQKLQotIwlkZWZpbmUgX0VURVhUCSJfZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotICBjaGFyIHBhZFsyXTsKLX07Ci0KLS8qIHJfdHlwZSB2YWx1ZXMgZm9yIHRoZSBpOTYwLiAgKi8KLQotLyogVGhlIGk5NjAgdXNlcyBSX1JFTExPTkcsIHdoaWNoIGlzIGRlZmluZWQgaW4gaW50ZXJuYWwuaCBhcyAweDExLgotICAgSXQgaXMgYW4gYWJzb2x1dGUgMzIgYml0IHJlbG9jYXRpb24uICAqLwotCi0jZGVmaW5lIFJfSVBSTUVEIAkoMHgxOSkJLyogMjQtYml0IGlwLXJlbGF0aXZlIHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgUl9PUFRDQUxMCSgweDFiKQkvKiAzMi1iaXQgb3B0aW1pemFibGUgY2FsbCAobGVhZnByb2Mvc3lzcHJvYykgKi8KLSNkZWZpbmUgUl9PUFRDQUxMWAkoMHgxYykJLyogNjQtYml0IG9wdGltaXphYmxlIGNhbGwgKGxlYWZwcm9jL3N5c3Byb2MpICovCi0KLS8qIFRoZSBmb2xsb3dpbmcgcmVsb2NhdGlvbiB0eXBlcyBhcmUgZGVmaW5lZCB1c2UgYnkgcmVsYXhpbmcgbGlua2VycywKLSAgIHdoaWNoIGNvbnZlcnQgMzIgYml0IGNhbGxzICh3aGljaCByZXF1aXJlIGEgNjQgYml0IGluc3RydWN0aW9uKQotICAgaW50byAyNCBiaXQgY2FsbHMgKHdoaWNoIHJlcXVpcmUgYSAzMiBiaXQgaW5zdHJ1Y3Rpb24pIHdoZW4KLSAgIHBvc3NpYmxlLiAgSXQgd2lsbCBiZSBwb3NzaWJsZSB3aGVuZXZlciB0aGUgdGFyZ2V0IG9mIHRoZSBjYWxsIGlzCi0gICB3aXRoaW4gYSAyNCBiaXQgcmFuZ2Ugb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24uCi0KLSAgIEl0IGlzIGFsd2F5cyBzYWZlIHRvIGlnbm9yZSB0aGVzZSByZWxvY2F0aW9ucy4gIFRoZXkgb25seSBzZXJ2ZSB0bwotICAgbWFyayBwb2ludHMgd2hpY2ggdGhlIHJlbGF4aW5nIGxpbmtlciB3aWxsIGhhdmUgdG8gY29uc2lkZXIuICBUaGUKLSAgIGFzc2VtYmxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGNvZGUgaXMgZ2VuZXJhdGVkIGV2ZW4gaWYKLSAgIHRoZSByZWxvY2F0aW9ucyBhcmUgaWdub3JlZC4gIEluIHBhcnRpY3VsYXIsIHRoaXMgbWVhbnMgdGhhdCB0aGUKLSAgIFJfSVBSMTMgcmVsb2NhdGlvbiBtYXkgbm90IGFwcGVhciB3aXRoIGFuIGV4dGVybmFsIHN5bWJvbC4gICovCi0KLSNkZWZpbmUgUl9JUFIxMwkJKDB4MWQpCS8qIDEzIGJpdCBpcC1yZWxhdGl2ZSBicmFuY2ggKi8KLSNkZWZpbmUgUl9BTElHTgkJKDB4MWUpICAvKiBhbGlnbm1lbnQgbWFya2VyLiAgVGhpcyBoYXMgbm8KLQkJCQkgICBhc3NvY2lhdGVkIHN5bWJvbC4gIEluc3RlYWQsIHRoZQotCQkJCSAgIHJfc3ltbmR4IGZpZWxkIGluZGljYXRlcyB0aGUKLQkJCQkgICByZXF1aXJlIGFsaWdubWVudCBhdCB0aGlzIHBvaW50IGluCi0JCQkJICAgdGhlIGZpbGUuICBJdCBtdXN0IGJlIGEgcG93ZXIgb2YgMi4gICovCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEyCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9pbnRlcm5hbC5oIGIvaW5jbHVkZS9jb2ZmL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTczMGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MzIgKzAsMCBAQAotLyogSW50ZXJuYWwgZm9ybWF0IG9mIENPRkYgb2JqZWN0IGZpbGUgZGF0YSBzdHJ1Y3R1cmVzLCBmb3IgR05VIEJGRC4KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4gICovCi0KLSNpZm5kZWYgR05VX0NPRkZfSU5URVJOQUxfSAotI2RlZmluZSBHTlVfQ09GRl9JTlRFUk5BTF9IIDEKLQotLyogRmlyc3QsIG1ha2UgInNpZ25lZCBjaGFyIiB3b3JrLCBldmVuIG9uIG9sZCBjb21waWxlcnMuICovCi0jaWZuZGVmIHNpZ25lZAotI2lmbmRlZiBfX1NURENfXwotI2RlZmluZQlzaWduZWQJCQkvKiovCi0jZW5kaWYKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBleHRyYSBzdHVmZiBpbiBhIFBFIGhlYWRlci4gKi8KLQotc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2ZpbGVoZHIKLXsKLSAgLyogRE9TIGhlYWRlciBkYXRhIGZvbGxvd3MgZm9yIFBFIHN0dWZmICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbWFnaWM7CS8qIE1hZ2ljIG51bWJlciwgMHg1YTRkICovCi0gIHVuc2lnbmVkIHNob3J0IGVfY2JscDsJLyogQnl0ZXMgb24gbGFzdCBwYWdlIG9mIGZpbGUsIDB4OTAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jcDsJCS8qIFBhZ2VzIGluIGZpbGUsIDB4MyAqLwotICB1bnNpZ25lZCBzaG9ydCBlX2NybGM7CS8qIFJlbG9jYXRpb25zLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jcGFyaGRyOwkvKiBTaXplIG9mIGhlYWRlciBpbiBwYXJhZ3JhcGhzLCAweDQgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9taW5hbGxvYzsJLyogTWluaW11bSBleHRyYSBwYXJhZ3JhcGhzIG5lZWRlZCwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbWF4YWxsb2M7CS8qIE1heGltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4RkZGRiAqLwotICB1bnNpZ25lZCBzaG9ydCBlX3NzOwkJLyogSW5pdGlhbCAocmVsYXRpdmUpIFNTIHZhbHVlLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9zcDsJCS8qIEluaXRpYWwgU1AgdmFsdWUsIDB4YjggKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jc3VtOwkvKiBDaGVja3N1bSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfaXA7CQkvKiBJbml0aWFsIElQIHZhbHVlLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9jczsJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBDUyB2YWx1ZSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfbGZhcmxjOwkvKiBGaWxlIGFkZHJlc3Mgb2YgcmVsb2NhdGlvbiB0YWJsZSwgMHg0MCAqLwotICB1bnNpZ25lZCBzaG9ydCBlX292bm87CS8qIE92ZXJsYXkgbnVtYmVyLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9yZXNbNF07CS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfb2VtaWQ7CS8qIE9FTSBpZGVudGlmaWVyIChmb3IgZV9vZW1pbmZvKSwgMHgwICovCi0gIHVuc2lnbmVkIHNob3J0IGVfb2VtaW5mbzsJLyogT0VNIGluZm9ybWF0aW9uOyBlX29lbWlkIHNwZWNpZmljLCAweDAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZV9yZXMyWzEwXTsJLyogUmVzZXJ2ZWQgd29yZHMsIGFsbCAweDAgKi8KLSAgYmZkX3ZtYSAgZV9sZmFuZXc7CQkvKiBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIsIDB4ODAgKi8KLSAgdW5zaWduZWQgbG9uZyBkb3NfbWVzc2FnZVsxNl07IC8qIHRleHQgd2hpY2ggYWx3YXlzIGZvbGxvd3MgZG9zIGhlYWRlciAqLwotICBiZmRfdm1hICBudF9zaWduYXR1cmU7ICAgCS8qIHJlcXVpcmVkIE5UIHNpZ25hdHVyZSwgMHg0NTUwICovIAotfTsKLQotc3RydWN0IGludGVybmFsX2ZpbGVoZHIKLXsKLSAgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2ZpbGVoZHIgcGU7Ci0KLSAgLyogc3RhbmRhcmQgY29mZiAgaW50ZXJuYWwgaW5mbyAqLwotICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICB1bnNpZ25lZCBzaG9ydCBmX25zY25zOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGxvbmcgZl90aW1kYXQ7CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgYmZkX3ZtYSBmX3N5bXB0cjsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgbG9uZyBmX25zeW1zOwkJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICB1bnNpZ25lZCBzaG9ydCBmX29wdGhkcjsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIHVuc2lnbmVkIHNob3J0IGZfZmxhZ3M7CS8qIGZsYWdzCQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgZl90YXJnZXRfaWQ7CS8qIChUSWM4MCBzcGVjaWZpYykJCSovCi19OwotCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjE2V1IJZmlsZSBpcyAxNi1iaXQgbGl0dGxlLWVuZGlhbgotICoJRl9BUjMyV1IJZmlsZSBpcyAzMi1iaXQgbGl0dGxlLWVuZGlhbgotICoJRl9BUjMyVwkJZmlsZSBpcyAzMi1iaXQgYmlnLWVuZGlhbgotICoJRl9EWU5MT0FECXJzLzYwMDAgYWl4OiBkeW5hbWljYWxseSBsb2FkYWJsZSB3L2ltcG9ydHMgJiBleHBvcnRzCi0gKglGX1NIUk9CSglycy82MDAwIGFpeDogZmlsZSBpcyBhIHNoYXJlZCBvYmplY3QKLSAqICAgICAgRl9ETEwgICAgICAgICAgIFBFIGZvcm1hdCBETEwKLSAqLwotCi0jZGVmaW5lCUZfUkVMRkxHCSgweDAwMDEpCi0jZGVmaW5lCUZfRVhFQwkJKDB4MDAwMikKLSNkZWZpbmUJRl9MTk5PCQkoMHgwMDA0KQotI2RlZmluZQlGX0xTWU1TCQkoMHgwMDA4KQotI2RlZmluZQlGX0FSMTZXUgkoMHgwMDgwKQotI2RlZmluZQlGX0FSMzJXUgkoMHgwMTAwKQotI2RlZmluZQlGX0FSMzJXICAgICAJKDB4MDIwMCkKLSNkZWZpbmUJRl9EWU5MT0FECSgweDEwMDApCi0jZGVmaW5lCUZfU0hST0JKCSgweDIwMDApCi0jZGVmaW5lIEZfRExMICAgICAgICAgICAoMHgyMDAwKQotCi0vKiBleHRyYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBpbiB0aGUgb3B0aW9uYWwgaGVhZGVyICovCi10eXBlZGVmIHN0cnVjdCBfSU1BR0VfREFUQV9ESVJFQ1RPUlkgCi17Ci0gIGJmZF92bWEgVmlydHVhbEFkZHJlc3M7Ci0gIGxvbmcgICAgU2l6ZTsKLX0gIElNQUdFX0RBVEFfRElSRUNUT1JZOwotI2RlZmluZSBJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFUyAgMTYKLQotLyogRGVmYXVsdCBpbWFnZSBiYXNlIGZvciBOVC4gICovCi0jZGVmaW5lIE5UX0VYRV9JTUFHRV9CQVNFIDB4NDAwMDAwCi0jZGVmaW5lIE5UX0RMTF9JTUFHRV9CQVNFIDB4MTAwMDAwMDAKLQotLyogRGVmYXVsdCBpbWFnZSBiYXNlIGZvciBCZU9TLiAqLwotI2RlZmluZSBCRU9TX0VYRV9JTUFHRV9CQVNFIDB4ODAwMDAwMDAKLSNkZWZpbmUgQkVPU19ETExfSU1BR0VfQkFTRSAweDEwMDAwMDAwCi0KLS8qIEV4dHJhIHN0dWZmIGluIGEgUEUgYW91dGhkciAqLwotCi0jZGVmaW5lIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCAweDEwMDAKLSNkZWZpbmUgUEVfREVGX0ZJTEVfQUxJR05NRU5UIDB4MjAwCi0KLXN0cnVjdCBpbnRlcm5hbF9leHRyYV9wZV9hb3V0aGRyIAotewotICAvKiBQRSBzdHVmZiAgKi8KLSAgYmZkX3ZtYSBJbWFnZUJhc2U7CQkvKiBhZGRyZXNzIG9mIHNwZWNpZmljIGxvY2F0aW9uIGluIG1lbW9yeSB0aGF0Ci0JCQkJICAgZmlsZSBpcyBsb2NhdGVkLCBOVCBkZWZhdWx0IDB4MTAwMDAgKi8KLQotICBiZmRfdm1hIFNlY3Rpb25BbGlnbm1lbnQ7CS8qIHNlY3Rpb24gYWxpZ25tZW50IGRlZmF1bHQgMHgxMDAwICovCi0gIGJmZF92bWEgRmlsZUFsaWdubWVudDsJLyogZmlsZSBhbGlnbm1lbnQgZGVmYXVsdCAweDIwMCAqLwotICBzaG9ydCAgIE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLyogbWluaW11bSB2ZXJzaW9uIG9mIHRoZSBvcGVyYXRpbmcgKi8KLSAgc2hvcnQgICBNaW5vck9wZXJhdGluZ1N5c3RlbVZlcnNpb247IC8qIHN5c3RlbSByZXEnZCBmb3IgZXhlLCBkZWZhdWx0IHRvIDEqLwotICBzaG9ydCAgIE1ham9ySW1hZ2VWZXJzaW9uOwkvKiB1c2VyIGRlZmluZWFibGUgZmllbGQgdG8gc3RvcmUgdmVyc2lvbiBvZiAqLwotICBzaG9ydCAgIE1pbm9ySW1hZ2VWZXJzaW9uOwkvKiBleGUgb3IgZGxsIGJlaW5nIGNyZWF0ZWQsIGRlZmF1bHQgdG8gMCAqLyAKLSAgc2hvcnQgICBNYWpvclN1YnN5c3RlbVZlcnNpb247IC8qIG1pbmltdW0gc3Vic3lzdGVtIHZlcnNpb24gcmVxdWlyZWQgdG8gKi8KLSAgc2hvcnQgICBNaW5vclN1YnN5c3RlbVZlcnNpb247IC8qIHJ1biBleGU7IGRlZmF1bHQgdG8gMy4xICovCi0gIGxvbmcgICAgUmVzZXJ2ZWQxOwkJLyogc2VlbXMgdG8gYmUgMCAqLwotICBsb25nICAgIFNpemVPZkltYWdlOwkJLyogc2l6ZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgZm9yIHByb2cgKi8KLSAgbG9uZyAgICBTaXplT2ZIZWFkZXJzOwkvKiBzaXplIG9mIFBFIGhlYWRlciBhbmQgc2VjdGlvbiB0YWJsZSAqLwotICBsb25nICAgIENoZWNrU3VtOwkJLyogc2V0IHRvIDAgKi8KLSAgc2hvcnQgICBTdWJzeXN0ZW07CQotCi0gIC8qIHR5cGUgb2Ygc3Vic3lzdGVtIGV4ZSB1c2VzIGZvciB1c2VyIGludGVyZmFjZSwKLSAgICAgcG9zc2libGUgdmFsdWVzOgotICAgICAxIC0gTkFUSVZFICAgRG9lc24ndCByZXF1aXJlIGEgc3Vic3lzdGVtCi0gICAgIDIgLSBXSU5ET1dTX0dVSSBydW5zIGluIFdpbmRvd3MgR1VJIHN1YnN5c3RlbQotICAgICAzIC0gV0lORE9XU19DVUkgcnVucyBpbiBXaW5kb3dzIGNoYXIgc3ViLiAoY29uc29sZSBhcHApCi0gICAgIDUgLSBPUzJfQ1VJIHJ1bnMgaW4gT1MvMiBjaGFyYWN0ZXIgc3Vic3lzdGVtCi0gICAgIDcgLSBQT1NJWF9DVUkgcnVucyBpbiBQb3NpeCBjaGFyYWN0ZXIgc3Vic3lzdGVtICovCi0gIHNob3J0ICAgRGxsQ2hhcmFjdGVyaXN0aWNzOwkvKiBmbGFncyBmb3IgRExMIGluaXQsIHVzZSAwICovCi0gIGJmZF92bWEgU2l6ZU9mU3RhY2tSZXNlcnZlOwkvKiBhbW91bnQgb2YgbWVtb3J5IHRvIHJlc2VydmUgICovCi0gIGJmZF92bWEgU2l6ZU9mU3RhY2tDb21taXQ7CS8qIGFtb3VudCBvZiBtZW1vcnkgaW5pdGlhbGx5IGNvbW1pdHRlZCBmb3IgCi0JCQkJICAgaW5pdGlhbCB0aHJlYWQncyBzdGFjaywgZGVmYXVsdCBpcyAweDEwMDAgKi8KLSAgYmZkX3ZtYSBTaXplT2ZIZWFwUmVzZXJ2ZTsJLyogYW1vdW50IG9mIHZpcnR1YWwgbWVtb3J5IHRvIHJlc2VydmUgYW5kICovCi0gIGJmZF92bWEgU2l6ZU9mSGVhcENvbW1pdDsJLyogY29tbWl0LCBkb24ndCBrbm93IHdoYXQgdG8gZGVmYXV0IGl0IHRvICovCi0gIGxvbmcgICAgTG9hZGVyRmxhZ3M7CQkvKiBjYW4gcHJvYmFibHkgc2V0IHRvIDAgKi8KLSAgbG9uZyAgICBOdW1iZXJPZlJ2YUFuZFNpemVzOwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBuZXh0IGVudHJ5LCAxNiAqLwotICBJTUFHRV9EQVRBX0RJUkVDVE9SWSBEYXRhRGlyZWN0b3J5W0lNQUdFX05VTUJFUk9GX0RJUkVDVE9SWV9FTlRSSUVTXTsKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBpbnRlcm5hbF9hb3V0aGRyCi17Ci0gIHNob3J0IG1hZ2ljOwkJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBzaG9ydCB2c3RhbXA7CQkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGJmZF92bWEgdHNpemU7CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgYmZkX3ZtYSBkc2l6ZTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgYmZkX3ZtYSBic2l6ZTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgYmZkX3ZtYSBlbnRyeTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBiZmRfdm1hIHRleHRfc3RhcnQ7CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGJmZF92bWEgZGF0YV9zdGFydDsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLQotICAvKiBpOTYwIHN0dWZmICovCi0gIHVuc2lnbmVkIGxvbmcgdGFnZW50cmllczsJLyogbnVtYmVyIG9mIHRhZyBlbnRyaWVzIHRvIGZvbGxvdyAqLwotCi0gIC8qIFJTLzYwMDAgc3R1ZmYgKi8KLSAgdW5zaWduZWQgbG9uZyBvX3RvYzsJCS8qIGFkZHJlc3Mgb2YgVE9DCQkJKi8KLSAgc2hvcnQgb19zbmVudHJ5OwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGVudHJ5IHBvaW50ICovCi0gIHNob3J0IG9fc250ZXh0OwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIHRleHQJKi8KLSAgc2hvcnQgb19zbmRhdGE7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgZGF0YQkqLwotICBzaG9ydCBvX3NudG9jOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIHRvYwkqLwotICBzaG9ydCBvX3NubG9hZGVyOwkJLyogc2VjdGlvbiBudW1iZXIgZm9yIGxvYWRlciBzZWN0aW9uICovCi0gIHNob3J0IG9fc25ic3M7CQkvKiBzZWN0aW9uIG51bWJlciBmb3IgYnNzCSovCi0gIHNob3J0IG9fYWxnbnRleHQ7CQkvKiBtYXggYWxpZ25tZW50IGZvciB0ZXh0CSovCi0gIHNob3J0IG9fYWxnbmRhdGE7CQkvKiBtYXggYWxpZ25tZW50IGZvciBkYXRhCSovCi0gIHNob3J0IG9fbW9kdHlwZTsJCS8qIE1vZHVsZSB0eXBlIGZpZWxkLCAxUixSRSxSTwkqLwotICBzaG9ydCBvX2NwdXR5cGU7CQkvKiBFbmNvZGVkIENQVSB0eXBlCQkqLwotICB1bnNpZ25lZCBsb25nIG9fbWF4c3RhY2s7CS8qIG1heCBzdGFjayBzaXplIGFsbG93ZWQuCSovCi0gIHVuc2lnbmVkIGxvbmcgb19tYXhkYXRhOwkvKiBtYXggZGF0YSBzaXplIGFsbG93ZWQuCSovCi0KLSAgLyogRUNPRkYgc3R1ZmYgKi8KLSAgYmZkX3ZtYSBic3Nfc3RhcnQ7CQkvKiBCYXNlIG9mIGJzcyBzZWN0aW9uLgkJKi8KLSAgYmZkX3ZtYSBncF92YWx1ZTsJCS8qIEdQIHJlZ2lzdGVyIHZhbHVlLgkJKi8KLSAgdW5zaWduZWQgbG9uZyBncHJtYXNrOwkvKiBHZW5lcmFsIHJlZ2lzdGVycyB1c2VkLgkqLwotICB1bnNpZ25lZCBsb25nIGNwcm1hc2tbNF07CS8qIENvcHJvY2Vzc29yIHJlZ2lzdGVycyB1c2VkLgkqLwotICB1bnNpZ25lZCBsb25nIGZwcm1hc2s7CS8qIEZsb2F0aW5nIHBvaW50ZXIgcmVnaXN0ZXJzIHVzZWQuICAqLwotCi0gIC8qIEFwb2xsbyBzdHVmZiAqLwotICBsb25nIG9faW5saWI7CQkJLyogaW5saWIgZGF0YSAqLwotICBsb25nIG9fc3JpOwkJCS8qIFN0YXRpYyBSZXNvdXJjZSBJbmZvcm1hdGlvbiAqLwotICBsb25nIHZpZFsyXTsJCQkvKiBWZXJzaW9uIGlkICovCi0KLQotICBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZTsKLQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1RPUkFHRSBDTEFTU0VTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgdXNlZCB0byBiZSBkZWZpbmVkIGFzIC0xLCBidXQgbm93IG5fc2NsYXNzIGlzIHVuc2lnbmVkLiAgKi8KLSNkZWZpbmUgQ19FRkNOCQkweGZmCS8qIHBoeXNpY2FsIGVuZCBvZiBmdW5jdGlvbgkqLwotI2RlZmluZSBDX05VTEwJCTAKLSNkZWZpbmUgQ19BVVRPCQkxCS8qIGF1dG9tYXRpYyB2YXJpYWJsZQkJKi8KLSNkZWZpbmUgQ19FWFQJCTIJLyogZXh0ZXJuYWwgc3ltYm9sCQkqLwotI2RlZmluZSBDX1NUQVQJCTMJLyogc3RhdGljCQkJKi8KLSNkZWZpbmUgQ19SRUcJCTQJLyogcmVnaXN0ZXIgdmFyaWFibGUJCSovCi0jZGVmaW5lIENfRVhUREVGCTUJLyogZXh0ZXJuYWwgZGVmaW5pdGlvbgkJKi8KLSNkZWZpbmUgQ19MQUJFTAkJNgkvKiBsYWJlbAkJCSovCi0jZGVmaW5lIENfVUxBQkVMCTcJLyogdW5kZWZpbmVkIGxhYmVsCQkqLwotI2RlZmluZSBDX01PUwkJOAkvKiBtZW1iZXIgb2Ygc3RydWN0dXJlCQkqLwotI2RlZmluZSBDX0FSRwkJOQkvKiBmdW5jdGlvbiBhcmd1bWVudAkJKi8KLSNkZWZpbmUgQ19TVFJUQUcJMTAJLyogc3RydWN0dXJlIHRhZwkJKi8KLSNkZWZpbmUgQ19NT1UJCTExCS8qIG1lbWJlciBvZiB1bmlvbgkJKi8KLSNkZWZpbmUgQ19VTlRBRwkJMTIJLyogdW5pb24gdGFnCQkJKi8KLSNkZWZpbmUgQ19UUERFRgkJMTMJLyogdHlwZSBkZWZpbml0aW9uCQkqLwotI2RlZmluZSBDX1VTVEFUSUMJMTQJLyogdW5kZWZpbmVkIHN0YXRpYwkJKi8KLSNkZWZpbmUgQ19FTlRBRwkJMTUJLyogZW51bWVyYXRpb24gdGFnCQkqLwotI2RlZmluZSBDX01PRQkJMTYJLyogbWVtYmVyIG9mIGVudW1lcmF0aW9uCSovCi0jZGVmaW5lIENfUkVHUEFSTQkxNwkvKiByZWdpc3RlciBwYXJhbWV0ZXIJCSovCi0jZGVmaW5lIENfRklFTEQJCTE4CS8qIGJpdCBmaWVsZAkJCSovCi0jZGVmaW5lIENfQVVUT0FSRwkxOQkvKiBhdXRvIGFyZ3VtZW50CQkqLwotI2RlZmluZSBDX0xBU1RFTlQJMjAJLyogZHVtbXkgZW50cnkgKGVuZCBvZiBibG9jaykJKi8KLSNkZWZpbmUgQ19CTE9DSwkJMTAwCS8qICIuYmIiIG9yICIuZWIiCQkqLwotI2RlZmluZSBDX0ZDTgkJMTAxCS8qICIuYmYiIG9yICIuZWYiCQkqLwotI2RlZmluZSBDX0VPUwkJMTAyCS8qIGVuZCBvZiBzdHJ1Y3R1cmUJCSovCi0jZGVmaW5lIENfRklMRQkJMTAzCS8qIGZpbGUgbmFtZQkJCSovCi0jZGVmaW5lIENfTElORQkJMTA0CS8qIGxpbmUgIyByZWZvcm1hdHRlZCBhcyBzeW1ib2wgdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgQ19BTElBUwkgCTEwNQkvKiBkdXBsaWNhdGUgdGFnCQkqLwotI2RlZmluZSBDX0hJRERFTgkxMDYJLyogZXh0IHN5bWJvbCBpbiBkbWVydCBwdWJsaWMgbGliICovCi0KLSNkZWZpbmUgQ19XRUFLRVhUCTEyNwkvKiB3ZWFrIHN5bWJvbCAtLSBHTlUgZXh0ZW5zaW9uICovCi0KLS8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFRJYzgwICovCi0jZGVmaW5lIENfVUVYVAkJMTkJLyogVGVudGF0aXZlIGV4dGVybmFsIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgQ19TVEFUTEFCCTIwCS8qIFN0YXRpYyBsb2FkIHRpbWUgbGFiZWwgKi8KLSNkZWZpbmUgQ19FWFRMQUIJMjEJLyogRXh0ZXJuYWwgbG9hZCB0aW1lIGxhYmVsICovCi0jZGVmaW5lIENfU1lTVEVNCTIzCS8qIFN5c3RlbSBXaWRlIHZhcmlhYmxlICovCi0KLS8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFdJTkRPV1NfTlQgICAqLwotI2RlZmluZSBDX1NFQ1RJT04gICAgICAgMTA0ICAgICAvKiBzZWN0aW9uIG5hbWUgKi8KLSNkZWZpbmUgQ19OVF9XRUFLCTEwNQkvKiB3ZWFrIGV4dGVybmFsICovCi0KLSAvKiBOZXcgc3RvcmFnZSBjbGFzc2VzIGZvciA4MDk2MCAqLwotCi0vKiBDX0xFQUZQUk9DIGlzIG9ic29sZXRlLiAgVXNlIENfTEVBRkVYVCBvciBDX0xFQUZTVEFUICovCi0jZGVmaW5lIENfTEVBRlBST0MJMTA4CS8qIExlYWYgcHJvY2VkdXJlLCAiY2FsbCIgdmlhIEJBTCAqLwotCi0jZGVmaW5lIENfU0NBTEwJCTEwNwkvKiBQcm9jZWR1cmUgcmVhY2hhYmxlIHZpYSBzeXN0ZW0gY2FsbCAqLwotI2RlZmluZSBDX0xFQUZFWFQgICAgICAgMTA4CS8qIEV4dGVybmFsIGxlYWYgKi8KLSNkZWZpbmUgQ19MRUFGU1RBVCAgICAgIDExMwkvKiBTdGF0aWMgbGVhZiAqLwotI2RlZmluZSBDX09QVFZBUgkxMDkJLyogT3B0aW1pemVkIHZhcmlhYmxlCQkqLwotI2RlZmluZSBDX0RFRklORQkxMTAJLyogUHJlcHJvY2Vzc29yICNkZWZpbmUJCSovCi0jZGVmaW5lIENfUFJBR01BCTExMQkvKiBBZHZpY2UgdG8gY29tcGlsZXIgb3IgbGlua2VyCSovCi0jZGVmaW5lIENfU0VHTUVOVAkxMTIJLyogODA5NjAgc2VnbWVudCBuYW1lCQkqLwotCi0gIC8qIFN0b3JhZ2UgY2xhc3NlcyBmb3IgbTg4ayAqLwotI2RlZmluZSBDX1NIQURPVyAgICAgICAgMTA3ICAgICAvKiBzaGFkb3cgc3ltYm9sICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENfVkVSU0lPTiAgICAgICAxMDggICAgIC8qIGNvZmYgdmVyc2lvbiBzeW1ib2wgICAgICAgICAgKi8KLQotIC8qIE5ldyBzdG9yYWdlIGNsYXNzZXMgZm9yIFJTLzYwMDAgKi8KLSNkZWZpbmUgQ19ISURFWFQgICAgICAgIDEwNwkvKiBVbi1uYW1lZCBleHRlcm5hbCBzeW1ib2wgKi8KLSNkZWZpbmUgQ19CSU5DTCAgICAgICAgIDEwOAkvKiBNYXJrcyBiZWdpbm5pbmcgb2YgaW5jbHVkZSBmaWxlICovCi0jZGVmaW5lIENfRUlOQ0wgICAgICAgICAxMDkJLyogTWFya3MgZW5kaW5nIG9mIGluY2x1ZGUgZmlsZSAqLwotCi0gLyogc3RvcmFnZSBjbGFzc2VzIGZvciBzdGFiIHN5bWJvbHMgZm9yIFJTLzYwMDAgKi8KLSNkZWZpbmUgQ19HU1lNICAgICAgICAgICgweDgwKQotI2RlZmluZSBDX0xTWU0gICAgICAgICAgKDB4ODEpCi0jZGVmaW5lIENfUFNZTSAgICAgICAgICAoMHg4MikKLSNkZWZpbmUgQ19SU1lNICAgICAgICAgICgweDgzKQotI2RlZmluZSBDX1JQU1lNICAgICAgICAgKDB4ODQpCi0jZGVmaW5lIENfU1RTWU0gICAgICAgICAoMHg4NSkKLSNkZWZpbmUgQ19UQ1NZTSAgICAgICAgICgweDg2KQotI2RlZmluZSBDX0JDT01NICAgICAgICAgKDB4ODcpCi0jZGVmaW5lIENfRUNPTUwgICAgICAgICAoMHg4OCkKLSNkZWZpbmUgQ19FQ09NTSAgICAgICAgICgweDg5KQotI2RlZmluZSBDX0RFQ0wgICAgICAgICAgKDB4OGMpCi0jZGVmaW5lIENfRU5UUlkgICAgICAgICAoMHg4ZCkKLSNkZWZpbmUgQ19GVU4gICAgICAgICAgICgweDhlKQotI2RlZmluZSBDX0JTVEFUICAgICAgICAgKDB4OGYpCi0jZGVmaW5lIENfRVNUQVQgICAgICAgICAoMHg5MCkKLQotLyogU3RvcmFnZSBjbGFzc2VzIGZvciBUaHVtYiBzeW1ib2xzICovCi0jZGVmaW5lIENfVEhVTUJFWFQgICAgICAoMTI4ICsgQ19FWFQpCQkvKiAxMzAgKi8KLSNkZWZpbmUgQ19USFVNQlNUQVQgICAgICgxMjggKyBDX1NUQVQpCQkvKiAxMzEgKi8KLSNkZWZpbmUgQ19USFVNQkxBQkVMICAgICgxMjggKyBDX0xBQkVMKQkJLyogMTM0ICovCi0jZGVmaW5lIENfVEhVTUJFWFRGVU5DICAoQ19USFVNQkVYVCAgKyAyMCkJLyogMTUwICovCi0jZGVmaW5lIENfVEhVTUJTVEFURlVOQyAoQ19USFVNQlNUQVQgKyAyMCkJLyogMTUxICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU0NOTk1MRU4gKDgpCi0KLXN0cnVjdCBpbnRlcm5hbF9zY25oZHIKLXsKLSAgY2hhciBzX25hbWVbU0NOTk1MRU5dOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCi0gIC8qIFBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliLgotICAgICBJbiB0aGUgcGVpIGZvcm1hdCwgdGhpcyBmaWVsZCBpcyB0aGUgdmlydHVhbCBzZWN0aW9uIHNpemUKLSAgICAgKHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGFmdGVyIGJlaW5nIGxvYWRlZCBpbnQgbWVtb3J5KSwKLSAgICAgTk9UIHRoZSBwaHlzaWNhbCBhZGRyZXNzLiAgKi8KLSAgYmZkX3ZtYSBzX3BhZGRyOwotCi0gIGJmZF92bWEgc192YWRkcjsJCS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgYmZkX3ZtYSBzX3NpemU7CQkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBiZmRfdm1hIHNfc2NucHRyOwkJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgYmZkX3ZtYSBzX3JlbHB0cjsJCS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgYmZkX3ZtYSBzX2xubm9wdHI7CQkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgdW5zaWduZWQgbG9uZyBzX25yZWxvYzsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICB1bnNpZ25lZCBsb25nIHNfbmxubm87CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgbG9uZyBzX2ZsYWdzOwkJCS8qIGZsYWdzCQkJKi8KLSAgbG9uZyBzX2FsaWduOwkJCS8qIHVzZWQgb24gSTk2MAkJCSovCi19OwotCi0vKgotICogc19mbGFncyAidHlwZSIKLSAqLwotI2RlZmluZSBTVFlQX1JFRwkgKDB4MDAwMCkJLyogInJlZ3VsYXIiOiBhbGxvY2F0ZWQsIHJlbG9jYXRlZCwgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfRFNFQ1QJICgweDAwMDEpCS8qICJkdW1teSI6ICByZWxvY2F0ZWQgb25seSovCi0jZGVmaW5lIFNUWVBfTk9MT0FECSAoMHgwMDAyKQkvKiAibm9sb2FkIjogYWxsb2NhdGVkLCByZWxvY2F0ZWQsIG5vdCBsb2FkZWQgKi8KLSNkZWZpbmUgU1RZUF9HUk9VUAkgKDB4MDAwNCkJLyogImdyb3VwZWQiOiBmb3JtZWQgb2YgaW5wdXQgc2VjdGlvbnMgKi8KLSNkZWZpbmUgU1RZUF9QQUQJICgweDAwMDgpCS8qICJwYWRkaW5nIjogbm90IGFsbG9jYXRlZCwgbm90IHJlbG9jYXRlZCwgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfQ09QWQkgKDB4MDAxMCkJLyogImNvcHkiOiBmb3IgZGVjaXNpb24gZnVuY3Rpb24gdXNlZCBieSBmaWVsZCB1cGRhdGU7ICBub3QgYWxsb2NhdGVkLCBub3QgcmVsb2NhdGVkLAotCQkJCQkJCQkJICAgICBsb2FkZWQ7IHJlbG9jICYgbGluZW5vIGVudHJpZXMgcHJvY2Vzc2VkIG5vcm1hbGx5ICovCi0jZGVmaW5lIFNUWVBfVEVYVAkgKDB4MDAyMCkJLyogc2VjdGlvbiBjb250YWlucyB0ZXh0IG9ubHkgKi8KLSNkZWZpbmUgU19TSFJTRUcJICgweDAwMjApCS8qIEluIDNiIFVwZGF0ZSBmaWxlcyAob3V0cHV0IG9mIG9nZW4pLCBzZWN0aW9ucyB3aGljaCBhcHBlYXIgaW4gU0hBUkVEIHNlZ21lbnRzIG9mIHRoZSBQZmlsZQotCQkJCQkJCQkJICAgICB3aWxsIGhhdmUgdGhlIFNfU0hSU0VHIGZsYWcgc2V0IGJ5IG9nZW4sIHRvIGluZm9ybSBkdWZyIHRoYXQgdXBkYXRpbmcgMSBjb3B5IG9mIHRoZSBwcm9jLiB3aWxsCi0JCQkJCQkJCQkgICAgIHVwZGF0ZSBhbGwgcHJvY2VzcyBpbnZvY2F0aW9ucy4gKi8KLSNkZWZpbmUgU1RZUF9EQVRBCSAoMHgwMDQwKQkvKiBzZWN0aW9uIGNvbnRhaW5zIGRhdGEgb25seSAqLwotI2RlZmluZSBTVFlQX0JTUwkgKDB4MDA4MCkJLyogc2VjdGlvbiBjb250YWlucyBic3Mgb25seSAqLwotI2RlZmluZSBTX05FV0ZDTgkgKDB4MDEwMCkJLyogSW4gYSBtaW5pbWFsIGZpbGUgb3IgYW4gdXBkYXRlIGZpbGUsIGEgbmV3IGZ1bmN0aW9uIChhcyBjb21wYXJlZCB3aXRoIGEgcmVwbGFjZWQgZnVuY3Rpb24pICovCi0jZGVmaW5lIFNUWVBfSU5GTwkgKDB4MDIwMCkJLyogY29tbWVudDogbm90IGFsbG9jYXRlZCBub3QgcmVsb2NhdGVkLCBub3QgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfT1ZFUgkgKDB4MDQwMCkJLyogb3ZlcmxheTogcmVsb2NhdGVkIG5vdCBhbGxvY2F0ZWQgb3IgbG9hZGVkICovCi0jZGVmaW5lIFNUWVBfTElCCSAoMHgwODAwKQkvKiBmb3IgLmxpYjogc2FtZSBhcyBJTkZPICovCi0jZGVmaW5lIFNUWVBfTUVSR0UJICgweDIwMDApCS8qIG1lcmdlIHNlY3Rpb24gLS0gY29tYmluZXMgd2l0aCB0ZXh0LCBkYXRhIG9yIGJzcyBzZWN0aW9ucyBvbmx5ICovCi0jZGVmaW5lIFNUWVBfUkVWRVJTRV9QQUQgKDB4NDAwMCkJLyogc2VjdGlvbiB3aWxsIGJlIHBhZGRlZCB3aXRoIG5vLW9wIGluc3RydWN0aW9ucyB3aGVyZXZlciBwYWRkaW5nIGlzIG5lY2Vzc2FyeSBhbmQgdGhlcmUgaXMgYQotCQkJCQkKLQkJCQkJCQkJCSAgICAgd29yZCBvZiBjb250aWd1b3VzIGJ5dGVzCi0JCQkJCQkJCQkgICAgIGJlZ2lubmluZyBvbiBhIHdvcmQgYm91bmRhcnkuICovCi0KLSNkZWZpbmUgU1RZUF9MSVQJMHg4MDIwCS8qIExpdGVyYWwgZGF0YSAobGlrZSBTVFlQX1RFWFQpICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLQotc3RydWN0IGludGVybmFsX2xpbmVubwotewotICB1bmlvbgotICB7Ci0gICAgbG9uZyBsX3N5bW5keDsJCS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotICAgIGxvbmcgbF9wYWRkcjsJCS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotICB9ICAgICBsX2FkZHI7Ci0gIHVuc2lnbmVkIGxvbmcgbF9sbm5vOwkJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBGSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIERJTU5VTQkJNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBpbnRlcm5hbF9zeW1lbnQKLXsKLSAgdW5pb24KLSAgewotICAgIGNoYXIgX25fbmFtZVtTWU1OTUxFTl07CS8qIG9sZCBDT0ZGIHZlcnNpb24JKi8KLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBsb25nIF9uX3plcm9lczsJCS8qIG5ldyA9PSAwCQkqLwotICAgICAgbG9uZyBfbl9vZmZzZXQ7CQkvKiBvZmZzZXQgaW50byBzdHJpbmcgdGFibGUgKi8KLSAgICB9ICAgICAgX25fbjsKLSAgICBjaGFyICpfbl9ucHRyWzJdOwkJLyogYWxsb3dzIGZvciBvdmVybGF5aW5nCSovCi0gIH0gICAgIF9uOwotICBsb25nIG5fdmFsdWU7CQkJLyogdmFsdWUgb2Ygc3ltYm9sCQkqLwotICBzaG9ydCBuX3NjbnVtOwkJLyogc2VjdGlvbiBudW1iZXIJCSovCi0gIHVuc2lnbmVkIHNob3J0IG5fZmxhZ3M7CS8qIGNvcHkgb2YgZmxhZ3MgZnJvbSBmaWxoZHIJKi8KLSAgdW5zaWduZWQgc2hvcnQgbl90eXBlOwkvKiB0eXBlIGFuZCBkZXJpdmVkIHR5cGUJKi8KLSAgdW5zaWduZWQgY2hhciBuX3NjbGFzczsJLyogc3RvcmFnZSBjbGFzcwkJKi8KLSAgdW5zaWduZWQgY2hhciBuX251bWF1eDsJLyogbnVtYmVyIG9mIGF1eC4gZW50cmllcwkqLwotfTsKLQotI2RlZmluZSBuX25hbWUJCV9uLl9uX25hbWUKLSNkZWZpbmUgbl96ZXJvZXMJX24uX25fbi5fbl96ZXJvZXMKLSNkZWZpbmUgbl9vZmZzZXQJX24uX25fbi5fbl9vZmZzZXQKLQotCi0vKiBSZWxvY2F0YWJsZSBzeW1ib2xzIGhhdmUgbnVtYmVyIG9mIHRoZSBzZWN0aW9uIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQsCi0gICBvciBvbmUgb2YgdGhlIGZvbGxvd2luZzogKi8KLQotI2RlZmluZSBOX1VOREVGCSgoc2hvcnQpMCkJLyogdW5kZWZpbmVkIHN5bWJvbCAqLwotI2RlZmluZSBOX0FCUwkoKHNob3J0KS0xKQkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KLSNkZWZpbmUgTl9ERUJVRwkoKHNob3J0KS0yKQkvKiBkZWJ1Z2dpbmcgc3ltYm9sIC0tIHZhbHVlIGlzIG1lYW5pbmdsZXNzICovCi0jZGVmaW5lIE5fVFYJKChzaG9ydCktMykJLyogaW5kaWNhdGVzIHN5bWJvbCBuZWVkcyBwcmVsb2FkIHRyYW5zZmVyIHZlY3RvciAqLwotI2RlZmluZSBQX1RWCSgoc2hvcnQpLTQpCS8qIGluZGljYXRlcyBzeW1ib2wgbmVlZHMgcG9zdGxvYWQgdHJhbnNmZXIgdmVjdG9yKi8KLQotLyoKLSAqIFR5cGUgb2YgYSBzeW1ib2wsIGluIGxvdyBOIGJpdHMgb2YgdGhlIHdvcmQKLSAqLwotI2RlZmluZSBUX05VTEwJCTAKLSNkZWZpbmUgVF9WT0lECQkxCS8qIGZ1bmN0aW9uIGFyZ3VtZW50IChvbmx5IHVzZWQgYnkgY29tcGlsZXIpICovCi0jZGVmaW5lIFRfQ0hBUgkJMgkvKiBjaGFyYWN0ZXIJCSovCi0jZGVmaW5lIFRfU0hPUlQJCTMJLyogc2hvcnQgaW50ZWdlcgkqLwotI2RlZmluZSBUX0lOVAkJNAkvKiBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0xPTkcJCTUJLyogbG9uZyBpbnRlZ2VyCQkqLwotI2RlZmluZSBUX0ZMT0FUCQk2CS8qIGZsb2F0aW5nIHBvaW50CSovCi0jZGVmaW5lIFRfRE9VQkxFCTcJLyogZG91YmxlIHdvcmQJCSovCi0jZGVmaW5lIFRfU1RSVUNUCTgJLyogc3RydWN0dXJlIAkJKi8KLSNkZWZpbmUgVF9VTklPTgkJOQkvKiB1bmlvbiAJCSovCi0jZGVmaW5lIFRfRU5VTQkJMTAJLyogZW51bWVyYXRpb24gCQkqLwotI2RlZmluZSBUX01PRQkJMTEJLyogbWVtYmVyIG9mIGVudW1lcmF0aW9uKi8KLSNkZWZpbmUgVF9VQ0hBUgkJMTIJLyogdW5zaWduZWQgY2hhcmFjdGVyCSovCi0jZGVmaW5lIFRfVVNIT1JUCTEzCS8qIHVuc2lnbmVkIHNob3J0CSovCi0jZGVmaW5lIFRfVUlOVAkJMTQJLyogdW5zaWduZWQgaW50ZWdlcgkqLwotI2RlZmluZSBUX1VMT05HCQkxNQkvKiB1bnNpZ25lZCBsb25nCSovCi0jZGVmaW5lIFRfTE5HREJMCTE2CS8qIGxvbmcgZG91YmxlCQkqLwotCi0vKgotICogZGVyaXZlZCB0eXBlcywgaW4gbl90eXBlCi0qLwotI2RlZmluZSBEVF9OT04JCSgwKQkvKiBubyBkZXJpdmVkIHR5cGUgKi8KLSNkZWZpbmUgRFRfUFRSCQkoMSkJLyogcG9pbnRlciAqLwotI2RlZmluZSBEVF9GQ04JCSgyKQkvKiBmdW5jdGlvbiAqLwotI2RlZmluZSBEVF9BUlkJCSgzKQkvKiBhcnJheSAqLwotCi0jZGVmaW5lIEJUWVBFKHgpCSgoeCkgJiBOX0JUTUFTSykKLQotI2RlZmluZSBJU1BUUih4KSBcCi0gICgoKHVuc2lnbmVkIGxvbmcpICh4KSAmIE5fVE1BU0spID09ICgodW5zaWduZWQgbG9uZykgRFRfUFRSIDw8IE5fQlRTSEZUKSkKLSNkZWZpbmUgSVNGQ04oeCkgXAotICAoKCh1bnNpZ25lZCBsb25nKSAoeCkgJiBOX1RNQVNLKSA9PSAoKHVuc2lnbmVkIGxvbmcpIERUX0ZDTiA8PCBOX0JUU0hGVCkpCi0jZGVmaW5lIElTQVJZKHgpIFwKLSAgKCgodW5zaWduZWQgbG9uZykgKHgpICYgTl9UTUFTSykgPT0gKCh1bnNpZ25lZCBsb25nKSBEVF9BUlkgPDwgTl9CVFNIRlQpKQotI2RlZmluZSBJU1RBRyh4KSBcCi0gICgoeCkgPT0gQ19TVFJUQUcgfHwgKHgpID09IENfVU5UQUcgfHwgKHgpID09IENfRU5UQUcpCi0jZGVmaW5lIERFQ1JFRih4KSBcCi0gICgoKCh4KSA+PiBOX1RTSElGVCkgJiB+IE5fQlRNQVNLKSB8ICgoeCkgJiBOX0JUTUFTSykpCi0KLXVuaW9uIGludGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QKLSAgewotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBsb25nIGw7CQkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgICAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLSAgICB9ICAgICB4X3RhZ25keDsKLQotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7Ci0JdW5zaWduZWQgc2hvcnQgeF9sbm5vOwkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCXVuc2lnbmVkIHNob3J0IHhfc2l6ZTsJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0gICAgICB4X2xuc3o7Ci0gICAgICBsb25nIHhfZnNpemU7CQkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0gICAgfSAgICAgeF9taXNjOwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QKLSAgICAgIHsJCQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JbG9uZyB4X2xubm9wdHI7CQkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCXVuaW9uCi0JewkJCS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCSAgbG9uZyBsOwotCSAgc3RydWN0IGNvZmZfcHRyX3N0cnVjdCAqcDsKLQl9ICAgICB4X2VuZG5keDsKLSAgICAgIH0gICAgICB4X2ZjbjsKLQotICAgICAgc3RydWN0Ci0gICAgICB7CQkJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCXVuc2lnbmVkIHNob3J0IHhfZGltZW5bRElNTlVNXTsKLSAgICAgIH0gICAgICB4X2FyeTsKLSAgICB9ICAgICB4X2ZjbmFyeTsKLQotICAgIHVuc2lnbmVkIHNob3J0IHhfdHZuZHg7CS8qIHR2IGluZGV4ICovCi0gIH0gICAgICB4X3N5bTsKLQotICB1bmlvbgotICB7Ci0gICAgY2hhciB4X2ZuYW1lW0ZJTE5NTEVOXTsKLSAgICBzdHJ1Y3QKLSAgICB7Ci0gICAgICBsb25nIHhfemVyb2VzOwotICAgICAgbG9uZyB4X29mZnNldDsKLSAgICB9ICAgICAgeF9uOwotICB9ICAgICB4X2ZpbGU7Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBsb25nIHhfc2NubGVuOwkJLyogc2VjdGlvbiBsZW5ndGggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X25yZWxvYzsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X25saW5ubzsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgICB1bnNpZ25lZCBsb25nIHhfY2hlY2tzdW07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtIGZvciBQRSAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfYXNzb2NpYXRlZDsgLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCBmb3IgUEUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfY29tZGF0OwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciBmb3IgUEUgKi8KLSAgfSAgICAgIHhfc2NuOwotCi0gIHN0cnVjdAotICB7Ci0gICAgbG9uZyB4X3R2ZmlsbDsJCS8qIHR2IGZpbGwgdmFsdWUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3R2bGVuOwkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgdW5zaWduZWQgc2hvcnQgeF90dnJhblsyXTsJLyogdHYgcmFuZ2UgKi8KLSAgfSAgICAgIHhfdHY7CQkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICogUlMvNjAwMC1zcGVjaWZpYyBhdXhlbnQgLSBsYXN0IGF1eGVudCBmb3IgZXZlcnkgZXh0ZXJuYWwgc3ltYm9sCi0gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIHN0cnVjdAotICB7Ci0gICAgdW5pb24KLSAgICAgIHsJCQkJLyogY3NlY3QgbGVuZ3RoIG9yIGVuY2xvc2luZyBjc2VjdCAqLwotCWxvbmcgbDsKLQlzdHJ1Y3QgY29mZl9wdHJfc3RydWN0ICpwOwotICAgICAgfSB4X3NjbmxlbjsKLSAgICBsb25nIHhfcGFybWhhc2g7CQkvKiBwYXJtIHR5cGUgaGFzaCBpbmRleCAqLwotICAgIHVuc2lnbmVkIHNob3J0IHhfc25oYXNoOwkvKiBzZWN0IG51bSB3aXRoIHBhcm0gaGFzaCAqLwotICAgIHVuc2lnbmVkIGNoYXIgeF9zbXR5cDsJLyogc3ltYm9sIGFsaWduIGFuZCB0eXBlICovCi0gICAgLyogMC00IC0gTG9nIDIgb2YgYWxpZ25tZW50ICovCi0gICAgLyogNS03IC0gc3ltYm9sIHR5cGUgKi8KLSAgICB1bnNpZ25lZCBjaGFyIHhfc21jbGFzOwkvKiBzdG9yYWdlIG1hcHBpbmcgY2xhc3MgKi8KLSAgICBsb25nIHhfc3RhYjsJCS8qIGRieCBzdGFiIGluZm8gaW5kZXggKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB4X3Nuc3RhYjsJLyogc2VjdCBudW0gd2l0aCBkYnggc3RhYiAqLwotICB9ICAgICAgeF9jc2VjdDsJCS8qIGNzZWN0IGRlZmluaXRpb24gaW5mb3JtYXRpb24gKi8KLQotLyogeF9zbXR5cCB2YWx1ZXM6ICAqLwotCi0jZGVmaW5lCVNNVFlQX0FMSUdOKHgpCSgoeCkgPj4gMykJLyogbG9nMiBvZiBhbGlnbm1lbnQgKi8KLSNkZWZpbmUJU01UWVBfU01UWVAoeCkJKCh4KSAmIDB4NykJLyogc3ltYm9sIHR5cGUgKi8KLS8qIFN5bWJvbCB0eXBlIHZhbHVlczogICovCi0jZGVmaW5lCVhUWV9FUgkwCQkvKiBFeHRlcm5hbCByZWZlcmVuY2UgKi8KLSNkZWZpbmUJWFRZX1NECTEJCS8qIENzZWN0IGRlZmluaXRpb24gKi8KLSNkZWZpbmUJWFRZX0xECTIJCS8qIExhYmVsIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgWFRZX0NNCTMJCS8qIC5CU1MgKi8KLSNkZWZpbmUJWFRZX0VNCTQJCS8qIEVycm9yIG1lc3NhZ2UgKi8KLSNkZWZpbmUJWFRZX1VTCTUJCS8qICJSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlIiAqLwotCi0vKiB4X3NtY2xhcyB2YWx1ZXM6ICAqLwotCi0jZGVmaW5lCVhNQ19QUgkwCQkvKiBSZWFkLW9ubHkgcHJvZ3JhbSBjb2RlICovCi0jZGVmaW5lCVhNQ19STwkxCQkvKiBSZWFkLW9ubHkgY29uc3RhbnQgKi8KLSNkZWZpbmUJWE1DX0RCCTIJCS8qIFJlYWQtb25seSBkZWJ1ZyBkaWN0aW9uYXJ5IHRhYmxlICovCi0jZGVmaW5lCVhNQ19UQwkzCQkvKiBSZWFkLXdyaXRlIGdlbmVyYWwgVE9DIGVudHJ5ICovCi0jZGVmaW5lCVhNQ19VQQk0CQkvKiBSZWFkLXdyaXRlIHVuY2xhc3NpZmllZCAqLwotI2RlZmluZQlYTUNfUlcJNQkJLyogUmVhZC13cml0ZSBkYXRhICovCi0jZGVmaW5lCVhNQ19HTAk2CQkvKiBSZWFkLW9ubHkgZ2xvYmFsIGxpbmthZ2UgKi8KLSNkZWZpbmUJWE1DX1hPCTcJCS8qIFJlYWQtb25seSBleHRlbmRlZCBvcGVyYXRpb24gKi8KLSNkZWZpbmUJWE1DX1NWCTgJCS8qIFJlYWQtb25seSBzdXBlcnZpc29yIGNhbGwgKi8KLSNkZWZpbmUJWE1DX0JTCTkJCS8qIFJlYWQtd3JpdGUgQlNTICovCi0jZGVmaW5lCVhNQ19EUwkxMAkJLyogUmVhZC13cml0ZSBkZXNjcmlwdG9yIGNzZWN0ICovCi0jZGVmaW5lCVhNQ19VQwkxMQkJLyogUmVhZC13cml0ZSB1bm5hbWVkIEZvcnRyYW4gY29tbW9uICovCi0jZGVmaW5lCVhNQ19USQkxMgkJLyogUmVhZC1vbmx5IHRyYWNlYmFjayBpbmRleCBjc2VjdCAqLwotI2RlZmluZQlYTUNfVEIJMTMJCS8qIFJlYWQtb25seSB0cmFjZWJhY2sgdGFibGUgY3NlY3QgKi8KLS8qIAkJMTQJPz8/ICovCi0jZGVmaW5lCVhNQ19UQzAJMTUJCS8qIFJlYWQtd3JpdGUgVE9DIGFuY2hvciAqLwotI2RlZmluZSBYTUNfVEQJMTYJCS8qIFJlYWQtd3JpdGUgZGF0YSBpbiBUT0MgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqICBJOTYwLXNwZWNpZmljICoybmQqIGF1eC4gZW50cnkgZm9ybWF0cwotICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICBzdHJ1Y3QKLSAgewotICAgIC8qIFRoaXMgaXMgYSB2ZXJ5IG9sZCB0eXBvIHRoYXQga2VlcHMgZ2V0dGluZyBwcm9wYWdhdGVkLiAqLwotI2RlZmluZSB4X3N0ZGluZHggeF9zdGluZHgKLSAgICBsb25nIHhfc3RpbmR4OwkJLyogc3lzLiB0YWJsZSBlbnRyeSAqLwotICB9ICAgICAgeF9zYzsJCQkvKiBzeXN0ZW0gY2FsbCBlbnRyeSAqLwotCi0gIHN0cnVjdAotICB7Ci0gICAgdW5zaWduZWQgbG9uZyB4X2JhbG50cnk7CS8qIEJBTCBlbnRyeSBwb2ludCAqLwotICB9ICAgICAgeF9iYWw7CQkJLyogQkFMLWNhbGxhYmxlIGZ1bmN0aW9uICovCi0KLSAgc3RydWN0Ci0gIHsKLSAgICB1bnNpZ25lZCBsb25nIHhfdGltZXN0YW1wOwkvKiB0aW1lIHN0YW1wICovCi0gICAgY2hhciB4X2lkc3RyaW5nWzIwXTsJLyogcHJvZHVjZXIgaWRlbnRpdHkgc3RyaW5nICovCi0gIH0gICAgICB4X2lkZW50OwkJLyogUHJvZHVjZXIgaWRlbnQgaW5mbyAqLwotCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGludGVybmFsX3JlbG9jCi17Ci0gIGJmZF92bWEgcl92YWRkcjsJCS8qIFZpcnR1YWwgYWRkcmVzcyBvZiByZWZlcmVuY2UgKi8KLSAgbG9uZyByX3N5bW5keDsJCS8qIEluZGV4IGludG8gc3ltYm9sIHRhYmxlCSovCi0gIHVuc2lnbmVkIHNob3J0IHJfdHlwZTsJLyogUmVsb2NhdGlvbiB0eXBlCQkqLwotICB1bnNpZ25lZCBjaGFyIHJfc2l6ZTsJCS8qIFVzZWQgYnkgUlMvNjAwMCBhbmQgRUNPRkYJKi8KLSAgdW5zaWduZWQgY2hhciByX2V4dGVybjsJLyogVXNlZCBieSBFQ09GRgkJKi8KLSAgdW5zaWduZWQgbG9uZyByX29mZnNldDsJLyogVXNlZCBieSBBbHBoYSBFQ09GRiwgU1BBUkMsIG90aGVycyAqLwotfTsKLQotI2RlZmluZSBSX1JFTEJZVEUJMDE3Ci0jZGVmaW5lIFJfUkVMV09SRAkwMjAKLSNkZWZpbmUgUl9QQ1JCWVRFCTAyMgotI2RlZmluZSBSX1BDUldPUkQJMDIzCi0jZGVmaW5lIFJfUENSTE9ORwkwMjQKLQotI2RlZmluZQlSX0RJUjE2CQkwMQotI2RlZmluZSBSX0RJUjMyCQkwNgotI2RlZmluZQlSX1BDTE9ORwkwMjAKLSNkZWZpbmUgUl9SRUxCWVRFCTAxNwotI2RlZmluZSBSX1JFTFdPUkQJMDIwCi0jZGVmaW5lIFJfSU1BR0VCQVNFICAgICAwNwotCi0KLSNkZWZpbmUgUl9QQ1IxNkwgMTI4Ci0jZGVmaW5lIFJfUENSMjZMIDEyOQotI2RlZmluZSBSX1ZSVDE2ICAxMzAKLSNkZWZpbmUgUl9IVlJUMTYgMTMxCi0jZGVmaW5lIFJfTFZSVDE2IDEzMgotI2RlZmluZSBSX1ZSVDMyICAxMzMKLSNkZWZpbmUgUl9SRUxMT05HCSgweDExKQkvKiBEaXJlY3QgMzItYml0IHJlbG9jYXRpb24gKi8KLSNkZWZpbmUgUl9JUFJTSE9SVAkoMHgxOCkKLSNkZWZpbmUgUl9JUFJMT05HCSgweDFhKQotI2RlZmluZSBSX0dFVFNFRwkoMHgxZCkKLSNkZWZpbmUgUl9HRVRQQQkJKDB4MWUpCi0jZGVmaW5lIFJfVEFHV09SRAkoMHgxZikKLSNkZWZpbmUgUl9KVU1QVEFSRwkweDIwCS8qIHN0cmFuZ2UgMjlrIDAweHgwMHh4IHJlbG9jICovCi0KLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aXRoIGEgMTZiaXQgYWJzb2x1dGUKLSAgIGFkZHJlc3MuICBUaGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gaW5zbnMgd2l0aCB0aGlzIHJlbG9jIGludG8KLSAgIGFuIGFic29sdXRlIDgtYml0IGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVjE2QjEgICAgCTB4NDEKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aGljaCBoYWQgYSAxNmJpdAotICAgYWJzb2x1dGUgYWRkcmVzcyB3aGljaCBoYXZlIGJlZW4gc2hvcnRlbmVkIGludG8gYSA4LWJpdAotICAgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WMTZCMiAJMHg0MgotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgam1wIGluc25zIHdpdGggYSAxNmJpdCB0YXJnZXQgYWRkcmVzczsKLSAgIHRoZSBsaW5rZXIgdHJpZXMgdG8gdHVybiB0aGVzZSBpbnNucyBpbnRvIGJyYSBpbnNucyB3aXRoCi0gICBhbiA4Yml0IHBjLXJlbGF0aXZlIHRhcmdldC4gICovCi0jZGVmaW5lIFJfSk1QMSAgICAgCTB4NDMKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgYnJhIHdpdGggYW4gOC1iaXQgcGMtcmVsYXRpdmUKLSAgIHRhcmdldCB0aGF0IHdhcyBmb3JtZXJsbHkgYSBqbXAgaW5zbiB3aXRoIGEgMTZiaXQgdGFyZ2V0LiAgKi8KLSNkZWZpbmUgUl9KTVAyIAkJMHg0NAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgUl9SRUxMT05HX05FRyAgCTB4NDUKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGptcCBpbnNucyB3aXRoIGEgMjRiaXQgdGFyZ2V0IGFkZHJlc3M7Ci0gICB0aGUgbGlua2VyIHRyaWVzIHRvIHR1cm4gdGhlc2UgaW5zbnMgaW50byBicmEgaW5zbnMgd2l0aAotICAgYW4gOGJpdCBwYy1yZWxhdGl2ZSB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUEwxICAgICAJMHg0NgotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgYSBicmEgd2l0aCBhbiA4LWJpdCBwYy1yZWxhdGl2ZQotICAgdGFyZ2V0IHRoYXQgd2FzIGZvcm1lcmxseSBhIGptcCBpbnNuIHdpdGggYSAyNGJpdCB0YXJnZXQuICAqLwotI2RlZmluZSBSX0pNUEwyCQkweDQ3Ci0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBtb3YuYiBpbnN0cnVjdGlvbnMgd2l0aCBhIDI0Yml0IGFic29sdXRlCi0gICBhZGRyZXNzLiAgVGhlIGxpbmtlciB0cmllcyB0byB0dXJuIGluc25zIHdpdGggdGhpcyByZWxvYyBpbnRvCi0gICBhbiBhYnNvbHV0ZSA4LWJpdCBhZGRyZXNzLiAgKi8KLQotI2RlZmluZSBSX01PVjI0QjEgICAgCTB4NDgKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5iIGluc3RydWN0aW9ucyB3aGljaCBoYWQgYSAyNGJpdAotICAgYWJzb2x1dGUgYWRkcmVzcyB3aGljaCBoYXZlIGJlZW4gc2hvcnRlbmVkIGludG8gYSA4LWJpdAotICAgYWJzb2x1dGUgYWRkcmVzcy4gICovCi0jZGVmaW5lIFJfTU9WMjRCMiAJMHg0OQotCi0vKiBBbiBoODMwMCBtZW1vcnkgaW5kaXJlY3QganVtcC9jYWxsLiAgRm9yY2VzIHRoZSBhZGRyZXNzIG9mIHRoZSBqdW1wL2NhbGwKLSAgIHRhcmdldCBpbnRvIHRoZSBmdW5jdGlvbiB2ZWN0b3IgKGluIHBhZ2UgemVybyksIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKLSAgIHZlY3RvciBlbnRyeSB0byBiZSBwbGFjZWQgaW4gdGhlIGp1bXAvY2FsbCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJfTUVNX0lORElSRUNUCTB4NGEKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIGEgMTZiaXQgcGMtcmVsYXRpdmUgYnJhbmNoIHRhcmdldCB3aGljaCB3YXMKLSAgIHNob3J0ZW5lZCBpbnRvIGFuIDhiaXQgcGMtcmVsYXRpdmUgYnJhbmNoIHRhcmdldC4gICovCi0jZGVmaW5lIFJfUENSV09SRF9CCTB4NGIKLQotLyogVGhpcyByZWxvYyBpZGVudGlmaWVzIG1vdi5bd2xdIGluc3RydWN0aW9ucyB3aXRoIGEgMzIvMjQgYml0Ci0gICBhYnNvbHV0ZSBhZGRyZXNzOyB0aGUgbGlua2VyIG1heSB0dXJuIHRoaXMgaW50byBhIG1vdi5bd2xdCi0gICBpbnNuIHdpdGggYSAxNmJpdCBhYnNvbHV0ZSBhZGRyZXNzLiAgKi8KLSNkZWZpbmUgUl9NT1ZMMSAgICAJMHg0YwotCi0vKiBUaGlzIHJlbG9jIGlkZW50aWZpZXMgbW92Llt3bF0gaW5zbnMgd2hpY2ggZm9ybWVybGx5IGhhZAotICAgYSAzMi8yNGJpdCBhYnNvbHV0ZSBhZGRyZXNzIGFuZCBob3cgaGF2ZSBhIDE2Yml0IGFic29sdXRlIGFkZHJlc3MuICAqLwotI2RlZmluZSBSX01PVkwyIAkweDRkCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGJDQzo4IHdoaWNoIHdpbGwgaGF2ZSBpdCdzIGNvbmRpdGlvbgotICAgaW52ZXJ0ZWQgYW5kIGl0cyB0YXJnZXQgcmVkaXJlY3RlZCB0byB0aGUgdGFyZ2V0IG9mIHRoZSBicmFuY2gKLSAgIGluIHRoZSBmb2xsb3dpbmcgaW5zbi4gICovCi0jZGVmaW5lIFJfQkNDX0lOVgkweDRlCi0KLS8qIFRoaXMgcmVsb2MgaWRlbnRpZmllcyBhIGptcCBpbnN0cnVjdGlvbiB0aGF0IGhhcyBiZWVuIGRlbGV0ZWQuICAqLwotI2RlZmluZSBSX0pNUF9ERUwJMHg0ZgotCi0vKiBaOGsgbW9kZXMgKi8KLSNkZWZpbmUgUl9JTU0xNiAgIDB4MDEJCS8qIDE2IGJpdCBhYnMgKi8KLSNkZWZpbmUgUl9KUgkgIDB4MDIJCS8qIGpyICA4IGJpdCBkaXNwICovCi0jZGVmaW5lIFJfSU1NNEwgICAweDIzCQkvKiBsb3cgbmliYmxlICovCi0jZGVmaW5lIFJfSU1NOCAgICAweDIyCQkvKiA4IGJpdCBhYnMgKi8KLSNkZWZpbmUgUl9JTU0zMiAgIFJfUkVMTE9ORwkvKiAzMiBiaXQgYWJzICovCi0jZGVmaW5lIFJfQ0FMTCAgICBSX0RBCQkvKiBBYnNvbHV0ZSBhZGRyZXNzIHdoaWNoIGNvdWxkIGJlIGEgY2FsbHIgKi8KLSNkZWZpbmUgUl9KUAkgIFJfREEJCS8qIEFic29sdXRlIGFkZHJlc3Mgd2hpY2ggY291bGQgYmUgYSBqcCAqLwotI2RlZmluZSBSX1JFTDE2ICAgMHgwNAkJLyogMTYgYml0IFBDIHJlbCAqLwotI2RlZmluZSBSX0NBTExSCSAgMHgwNQkJLyogY2FsbHIgMTIgYml0IGRpc3AgKi8KLSNkZWZpbmUgUl9TRUcgICAgIDB4MTAJCS8qIHNldCBpZiBpbiBzZWdtZW50ZWQgbW9kZSAqLwotI2RlZmluZSBSX0lNTTRIICAgMHgyNAkJLyogaGlnaCBuaWJibGUgKi8KLSNkZWZpbmUgUl9ESVNQNyAgIDB4MjUgICAgICAgICAgLyogZGpueiBkaXNwbGFjZW1lbnQgKi8KLQotLyogSDg1MDAgbW9kZXMgKi8KLQotI2RlZmluZSBSX0g4NTAwX0lNTTggIAkxCQkvKiAgOCBiaXQgaW1tZWRpYXRlIAkqLwotI2RlZmluZSBSX0g4NTAwX0lNTTE2IAkyCQkvKiAxNiBiaXQgaW1tZWRpYXRlCSovCi0jZGVmaW5lIFJfSDg1MDBfUENSRUw4IAkzCQkvKiAgOCBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfSDg1MDBfUENSRUwxNiA0CQkvKiAxNiBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfSDg1MDBfSElHSDggIAk1CQkvKiBoaWdoIDggYml0cyBvZiAyNCBiaXQgYWRkcmVzcyAqLwotI2RlZmluZSBSX0g4NTAwX0xPVzE2IAk3CQkvKiBsb3cgMTYgYml0cyBvZiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfSDg1MDBfSU1NMjQJNgkJLyogMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX0g4NTAwX0lNTTMyICAgOCAgICAgICAgICAgICAgIC8qIDMyIGJpdCBpbW1lZGlhdGUgKi8KLSNkZWZpbmUgUl9IODUwMF9ISUdIMTYgIDkJCS8qIGhpZ2ggMTYgYml0cyBvZiAzMiBiaXQgaW1tZWRpYXRlICovCi0KLS8qIFc2NSBtb2RlcyAqLwotCi0jZGVmaW5lIFJfVzY1X0FCUzgJMSAgLyogYWRkciAmIDB4ZmYgCQkqLwotI2RlZmluZSBSX1c2NV9BQlMxNgkyICAvKiBhZGRyICYgMHhmZmZmIAkJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMjQJMyAgLyogYWRkciAmIDB4ZmZmZmZmIAkJKi8KLQotI2RlZmluZSBSX1c2NV9BQlM4UzggICAgNCAgLyogKGFkZHIgPj4gOCkgJiAweGZmIAkqLwotI2RlZmluZSBSX1c2NV9BQlM4UzE2ICAgNSAgLyogKGFkZHIgPj4gMTYpICYgMHhmZiAJKi8KLQotI2RlZmluZSBSX1c2NV9BQlMxNlM4ICAgNiAgLyogKGFkZHIgPj4gOCkgJiAwZmZmZiAJKi8KLSNkZWZpbmUgUl9XNjVfQUJTMTZTMTYgIDcgIC8qIChhZGRyID4+IDE2KSAmIDBmZmZmIAkqLwotCi0jZGVmaW5lIFJfVzY1X1BDUjgJOAotI2RlZmluZSBSX1c2NV9QQ1IxNgk5Ci0KLSNkZWZpbmUgUl9XNjVfRFAgICAgICAgMTAgIC8qIGRpcmVjdCBwYWdlIDggYml0cyBvbmx5ICAgKi8KLQotI2VuZGlmIC8qIEdOVV9DT0ZGX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9tNjhrLmggYi9pbmNsdWRlL2NvZmYvbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTE0N2VkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9tNjhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBNNjhLICovCi0KLSNpZm5kZWYgR05VX0NPRkZfTTY4S19ICi0jZGVmaW5lIEdOVV9DT0ZGX002OEtfSCAxCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIE1vdG9yb2xhIDY4MDAwLzY4MDA4LzY4MDEwLzY4MDIwICovCi0jZGVmaW5lCU1DNjhNQUdJQwkwNTIwCi0jZGVmaW5lIE1DNjhLV1JNQUdJQwkwNTIwCS8qIHdyaXRlYWJsZSB0ZXh0IHNlZ21lbnRzICovCi0jZGVmaW5lCU1DNjhUVk1BR0lDCTA1MjEKLSNkZWZpbmUgTUM2OEtST01BR0lDCTA1MjEJLyogcmVhZG9ubHkgc2hhcmVhYmxlIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUgTUM2OEtQR01BR0lDCTA1MjIJLyogZGVtYW5kIHBhZ2VkIHRleHQgc2VnbWVudHMgKi8KLSNkZWZpbmUJTTY4TUFHSUMJMDIxMAotI2RlZmluZQlNNjhUVk1BR0lDCTAyMTEKLQotLyogdGhpcyBpcyB0aGUgbWFnaWMgb2YgdGhlIEJ1bGwgZHB4LzIgKi8KLSNkZWZpbmUgTUM2OEtCQ1NNQUdJQwkwNTI2Ci0KLS8qIFRoaXMgaXMgTHlueCdzIGFsbC1wbGF0Zm9ybSBtYWdpYyBudW1iZXIgZm9yIGV4ZWN1dGFibGVzLiAqLwotCi0jZGVmaW5lIExZTlhDT0ZGTUFHSUMJMDQxNQotCi0jZGVmaW5lIE9NQUdJQyBNNjhNQUdJQwotCi0vKiBUaGlzIGludGVudGlvbmFsbHkgZG9lcyBub3QgaW5jbHVkZSBNQzY4S0JDU01BR0lDOyBpdCBvbmx5IGluY2x1ZGVzCi0gICBtYWdpYyBudW1iZXJzIHdoaWNoIGltcGx5IHRoYXQgbmFtZXMgZG8gbm90IGhhdmUgdW5kZXJzY29yZXMuICAqLwotI2RlZmluZSBNNjhLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DNjhNQUdJQykgJiYgKCh4KS5mX21hZ2ljIT1NQzY4S1dSTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OFRWTUFHSUMpICYmIFwKLSAgKCh4KS5mX21hZ2ljIT1NQzY4S1JPTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TUM2OEtQR01BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OE1BR0lDKSAmJiAoKHgpLmZfbWFnaWMhPU02OFRWTUFHSUMpICYmICgoeCkuZl9tYWdpYyE9TFlOWENPRkZNQUdJQykgKQotCi0vKiBNYWdpYyBudW1iZXJzIGZvciB0aGUgYS5vdXQgaGVhZGVyLiAgKi8KLQotI2RlZmluZSBQQUdFTUFHSUNFWEVDU1dBUFBFRCAgMDQwNyAvKiBleGVjdXRhYmxlIChzd2FwcGVkKSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1NXQVBQRUQgMDQxMCAvKiBwdXJlIGV4ZWN1dGFibGUgKHN3YXBwZWQpICovCi0jZGVmaW5lIFBBR0VNQUdJQ1BFWEVDVFNITElCICAwNDQzIC8qIHB1cmUgZXhlY3V0YWJsZSAodGFyZ2V0IHNoYXJlZCBsaWJyYXJ5KSAqLwotI2RlZmluZSBQQUdFTUFHSUNQRVhFQ1BBR0VEICAgMDQxMyAvKiBwdXJlIGV4ZWN1dGFibGUgKHBhZ2VkKSAqLwotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bMl07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSNpZmRlZiBNNjhLX0NPRkZfT0ZGU0VUCi0gIGNoYXIgcl9vZmZzZXRbNF07Ci0jZW5kaWYKLQotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotCi0jaWZkZWYgTTY4S19DT0ZGX09GRlNFVAotI2RlZmluZSBSRUxTWiAxNAotI2Vsc2UKLSNkZWZpbmUgUkVMU1ogMTAKLSNlbmRpZgotCi0jZW5kaWYgLyogR05VX0NPRkZfTTY4S19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvbTg4ay5oIGIvaW5jbHVkZS9jb2ZmL204OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA2ZWI0MS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbTg4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgODhrIGJjcyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIgewotCWNoYXIgZl9tYWdpY1syXTsJLyogbWFnaWMgbnVtYmVyCQkJKi8KLQljaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLQljaGFyIGZfdGltZGF0WzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLQljaGFyIGZfc3ltcHRyWzRdOwkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0JY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLQljaGFyIGZfb3B0aGRyWzJdOwkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLQljaGFyIGZfZmxhZ3NbMl07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgTUM4OE1BR0lDICAwNTQwICAgICAgICAgICAvKiA4OGsgQkNTIGV4ZWN1dGFibGUgKi8KLSNkZWZpbmUgTUM4OERNQUdJQyAwNTQxICAgICAgICAgICAvKiBERy9VWCBleGVjdXRhYmxlICAgKi8KLSNkZWZpbmUgTUM4OE9NQUdJQyAwNTU1CSAgICAgICAgICAvKiBPYmplY3QgZmlsZSAgICAgICAgKi8KLQotI2RlZmluZSBNQzg4QkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPU1DODhNQUdJQykgJiYoKHgpLmZfbWFnaWMhPU1DODhETUFHSUMpICYmICgoeCkuZl9tYWdpYyAhPSBNQzg4T01BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgUEFHRU1BR0lDMyAwNDE0IC8qIFNwbGl0IGkmZCwgemVybyBtYXBwZWQgKi8KLSNkZWZpbmUgUEFHRU1BR0lDQkNTIDA0MTMKLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0KLS8qIGNvbXB1dGUgc2l6ZSBvZiBhIGhlYWRlciAqLwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgCi17Ci0gIGNoYXIJCXNfbmFtZVs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotICBjaGFyCQlzX3NpemVbNF07CS8qIHNlY3Rpb24gc2l6ZQkJCSovCi0gIGNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICBjaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyCQlzX25yZWxvY1s0XTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICBjaGFyCQlzX25sbm5vWzRdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJKi8KLX07Ci0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDQKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUICAgIi50ZXh0IgotI2RlZmluZSBfREFUQSAgICIuZGF0YSIKLSNkZWZpbmUgX0JTUyAgICAiLmJzcyIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm97Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQotCWNoYXIgbF9sbm5vWzRdOwotCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLSAgY2hhciBwYWQyWzJdOwotfTsKLQotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkwMTcKLSNkZWZpbmUgTl9UTUFTSwkJMDYwCi0jZGVmaW5lIE5fQlRTSEZUCTQKLSNkZWZpbmUgTl9UU0hJRlQJMgotCi0KLS8qIE5vdGUgdGhhdCB0aGlzIGlzbid0IHRoZSBzYW1lIHNoYXBlIGFzIG90aGVyIGNvZmZzICovCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90YWduZHhbNF07CQkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0gICAgLyogNCAqLwotICAgIHVuaW9uIHsKLSAgICAgIGNoYXIgeF9mc2l6ZVs0XTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLSAgICAgIHN0cnVjdCB7Ci0JY2hhciAgeF9sbm5vWzRdOwkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCWNoYXIgIHhfc2l6ZVs0XTsJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0geF9sbnN6OwotICAgIH0geF9taXNjOwotICAgIAotICAgIC8qIDEyICovCi0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0ZDTiwgdGFnLCBvciAuYmIgKi8KLQljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQljaGFyIHhfZW5kbmR4WzRdOwkJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0gICAgICB9IHhfZmNuOwotICAgICAgc3RydWN0IHsJCQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICB9IHhfZmNuYXJ5OwotICAgIC8qIDIwICovCi0gICAgCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0gICAgY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIHhfemVyb2VzWzRdOwotICAgICAgY2hhciB4X29mZnNldFs0XTsKLSAgICB9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF9zY25sZW5bNF07CQkvKiBzZWN0aW9uIGxlbmd0aCAqLwotICAgIGNoYXIgeF9ucmVsb2NbNF07CQkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIGNoYXIgeF9ubGlubm9bNF07CQkvKiAjIGxpbmUgbnVtYmVycyAqLwotICB9IHhfc2NuOwotICAKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdHZmaWxsWzRdOwkJLyogdHYgZmlsbCB2YWx1ZSAqLwotICAgIGNoYXIgeF90dmxlblsyXTsJCS8qIGxlbmd0aCBvZiAudHYgKi8KLSAgICBjaGFyIHhfdHZyYW5bMl1bMl07CQkvKiB0diByYW5nZSAqLwotICB9IHhfdHY7CQkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi19OwotCi0jZGVmaW5lIEdFVF9GQ05fTE5OT1BUUihhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKilleHQtPnhfc3ltLnhfZmNuYXJ5LnhfZmNuLnhfbG5ub3B0cikKLSNkZWZpbmUgR0VUX0ZDTl9FTkRORFgoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZGVmaW5lIFBVVF9GQ05fTE5OT1BUUihhYmZkLCBpbiwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsICBpbiwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9sbm5vcHRyKQotI2RlZmluZSBQVVRfRkNOX0VORE5EWChhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSAgIGV4dC0+eF9zeW0ueF9mY25hcnkueF9mY24ueF9lbmRuZHgpCi0jZGVmaW5lIEdFVF9MTlNaX1NJWkUoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X3NpemUpCi0jZGVmaW5lIEdFVF9MTlNaX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zeW0ueF9taXNjLnhfbG5zei54X2xubm8pCi0jZGVmaW5lIFBVVF9MTlNaX0xOTk8oYWJmZCwgaW4sIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsIGluLCAoYmZkX2J5dGUgKikgZXh0LT54X3N5bS54X21pc2MueF9sbnN6LnhfbG5ubykKLSNkZWZpbmUgUFVUX0xOU1pfU0laRShhYmZkLCBpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc3ltLnhfbWlzYy54X2xuc3oueF9zaXplKQotI2RlZmluZSBHRVRfU0NOX1NDTkxFTihhYmZkLCBleHQpIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X3NjbmxlbikKLSNkZWZpbmUgR0VUX1NDTl9OUkVMT0MoYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIGV4dC0+eF9zY24ueF9ucmVsb2MpCi0jZGVmaW5lIEdFVF9TQ05fTkxJTk5PKGFiZmQsIGV4dCkgIGJmZF9oX2dldF8zMihhYmZkLCAoYmZkX2J5dGUgKikgZXh0LT54X3Njbi54X25saW5ubykKLSNkZWZpbmUgUFVUX1NDTl9TQ05MRU4oYWJmZCxpbiwgZXh0KSBiZmRfaF9wdXRfMzIoYWJmZCwgaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfc2NubGVuKQotI2RlZmluZSBQVVRfU0NOX05SRUxPQyhhYmZkLGluLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLCBpbiwgKGJmZF9ieXRlICopZXh0LT54X3Njbi54X25yZWxvYykKLSNkZWZpbmUgUFVUX1NDTl9OTElOTk8oYWJmZCxpbiwgZXh0KSAgYmZkX2hfcHV0XzMyKGFiZmQsaW4sIChiZmRfYnl0ZSAqKSBleHQtPnhfc2NuLnhfbmxpbm5vKQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSAgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKQotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotCi0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTIwCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9vZmZzZXRbMl07Ci19OwotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAgMTIKLQotI2RlZmluZSBOT19UVk5EWApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL21jb3JlLmggYi9pbmNsdWRlL2NvZmYvbWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxODk0Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvbWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKiBNb3Rvcm9sbGEgTUNvcmUgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgTUNvcmUgQ09GRi9QRSBBQkkuICovCi0KLSNpZm5kZWYgX0NPRkZfTU9SRV9ICi0jZGVmaW5lIF9DT0ZGX01PUkVfSAotCi0KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX0FCU09MVVRFICAgICAgICAgIAkweDAwMDAKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX0FERFIzMiAgICAgICAgICAgIAkweDAwMDEKLSNkZWZpbmUgSU1BR0VfUkVMX01DT1JFX1BDUkVMX0lNTThCWTQJCTB4MDAwMgotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NMTFCWTIJCTB4MDAwMwotI2RlZmluZSBJTUFHRV9SRUxfTUNPUkVfUENSRUxfSU1NNEJZMgkJMHgwMDA0Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF8zMgkJMHgwMDA1Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9QQ1JFTF9KU1JfSU1NMTFCWTIJMHgwMDA2Ci0jZGVmaW5lIElNQUdFX1JFTF9NQ09SRV9SVkEJCQkweDAwMDcKLQotI2RlZmluZSBQRU1DT1JFCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpYyAgICAgIFsyXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcCAgICAgWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemUgICAgICBbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZSAgICAgIFs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZSAgICAgIFs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeSAgICAgIFs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0IFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydCBbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotLyogRnJvbSB3aW5udC5oICovCi0jZGVmaW5lIElNQUdFX05UX09QVElPTkFMX0hEUl9NQUdJQyAgICAgICAgMHgxMGIKLQotCi0vKiBEZWZpbmUgc29tZSBOVCBkZWZhdWx0IHZhbHVlcy4gKi8KLSNkZWZpbmUgTlRfU0VDVElPTl9BTElHTk1FTlQgMHgxMDAwCi0jZGVmaW5lIE5UX0ZJTEVfQUxJR05NRU5UICAgIDB4MjAwICAKLSNkZWZpbmUgTlRfREVGX1JFU0VSVkUgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgTlRfREVGX0NPTU1JVCAgICAgICAgMHgxMDAwCi0KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jCi17Ci0gIGNoYXIgcl92YWRkciAgWzRdOwotICBjaGFyIHJfc3ltbmR4IFs0XTsKLSAgY2hhciByX3R5cGUgICBbMl07Ci0gIGNoYXIgcl9vZmZzZXQgWzRdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTQKLQotI2RlZmluZQlNQ09SRU1BR0lDCTB4YjAwICAvKiBJIGp1c3QgbWFkZSB0aGlzIHVwICovIAotCi0jZGVmaW5lIE1DT1JFQkFETUFHKHgpICgoKHgpLmZfbWFnaWMhPSBNQ09SRU1BR0lDKSkKLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLSAgY2hhciBmX21hZ2ljICBbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0gIGNoYXIgZl9uc2NucyAgWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXQgWzRdOwkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0ciBbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zICBbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyIFsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFncyAgWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uCi0gIHsKLSAgICBjaGFyIGVfbmFtZSBbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0Ci0gICAgewotICAgICAgY2hhciBlX3plcm9lcyBbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0IFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgCi0gIGNoYXIgZV92YWx1ZSAgWzRdOwotICBjaGFyIGVfc2NudW0gIFsyXTsKLSAgY2hhciBlX3R5cGUgICBbMl07Ci0gIGNoYXIgZV9zY2xhc3MgWzFdOwotICBjaGFyIGVfbnVtYXV4IFsxXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJMHhmCi0jZGVmaW5lIE5fVE1BU0sJCTB4MzAKLSNkZWZpbmUgTl9CVFNIRlQJNAotI2RlZmluZSBOX1RTSElGVAkyCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudAotewotICBzdHJ1Y3QKLSAgewotICAgIGNoYXIgeF90YWduZHggWzRdOwkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgIAotICAgIHVuaW9uCi0gICAgewotICAgICAgc3RydWN0Ci0gICAgICB7Ci0JY2hhciAgeF9sbm5vIFsyXTsgCS8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JY2hhciAgeF9zaXplIFsyXTsgCS8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0gICAgICB9IHhfbG5zejsKLQotICAgICAgY2hhciB4X2ZzaXplIFs0XTsJCS8qIHNpemUgb2YgZnVuY3Rpb24gKi8KLQotICAgIH0geF9taXNjOwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBzdHJ1Y3QgCQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0gICAgICB7Ci0JY2hhciB4X2xubm9wdHIgWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCWNoYXIgeF9lbmRuZHggIFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0gICAgICB9IHhfZmNuOwotCi0gICAgICBzdHJ1Y3QgCQkJLyogaWYgSVNBUlksIHVwIHRvIDQgZGltZW4uICovCi0gICAgICB7Ci0JY2hhciB4X2RpbWVuIFtFX0RJTU5VTV1bMl07Ci0gICAgICB9IHhfYXJ5OwotICAgICAgCi0gICAgfSB4X2ZjbmFyeTsKLQotICAgIGNoYXIgeF90dm5keCBbMl07CQkvKiB0diBpbmRleCAqLwotCi0gIH0geF9zeW07Ci0KLSAgdW5pb24KLSAgewotICAgIGNoYXIgeF9mbmFtZSBbRV9GSUxOTUxFTl07Ci0gICAgCi0gICAgc3RydWN0Ci0gICAgewotICAgICAgY2hhciB4X3plcm9lcyBbNF07Ci0gICAgICBjaGFyIHhfb2Zmc2V0IFs0XTsKLSAgICB9IHhfbjsKLSAgICAKLSAgfSB4X2ZpbGU7Ci0KLSAgc3RydWN0Ci0gIHsKLSAgICBjaGFyIHhfc2NubGVuICAgICBbNF07CS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgY2hhciB4X25yZWxvYyAgICAgWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotICAgIGNoYXIgeF9ubGlubm8gICAgIFsyXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLSAgICBjaGFyIHhfY2hlY2tzdW0gICBbNF07CS8qIHNlY3Rpb24gQ09NREFUIGNoZWNrc3VtICovCi0gICAgY2hhciB4X2Fzc29jaWF0ZWQgWzJdOwkvKiBDT01EQVQgYXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0gICAgY2hhciB4X2NvbWRhdCAgICAgWzFdOwkvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlciAqLwotICB9IHhfc2NuOwotCi0gIHN0cnVjdAotICB7Ci0gICAgY2hhciB4X3R2ZmlsbCBbNF07CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgY2hhciB4X3R2bGVuICBbMl07CQkvKiBsZW5ndGggb2YgLnR2ICovCi0gICAgY2hhciB4X3R2cmFuICBbMl1bMl07CS8qIHR2IHJhbmdlICovCi0gIH0geF90djsJCQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gICBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAgIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gICBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuICAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubwotewotICB1bmlvbgotICB7Ci0gICAgY2hhciBsX3N5bW5keCBbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotICAgIGNoYXIgbF9wYWRkciAgWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLSAgfSBsX2FkZHI7Ci0KLSAgY2hhciBsX2xubm8gWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSAgICAgYmZkX2hfZ2V0XzMyIChhYmZkLCAoYmZkX2J5dGUgKikgKGV4dC0+bF9sbm5vKSk7Ci0jZGVmaW5lIFBVVF9MSU5FTk9fTE5OTyhhYmZkLHZhbCwgZXh0KSBiZmRfaF9wdXRfMzIgKGFiZmQsIHZhbCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi17Ci0gIGNoYXIJc19uYW1lICAgIFs4XTsJLyogc2VjdGlvbiBuYW1lCQkJKi8KLSAgY2hhcglzX3BhZGRyICAgWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICBjaGFyCXNfdmFkZHIgICBbNF07CS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgY2hhcglzX3NpemUgICAgWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBjaGFyCXNfc2NucHRyICBbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGNoYXIJc19yZWxwdHIgIFs0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotICBjaGFyCXNfbG5ub3B0ciBbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkqLwotICBjaGFyCXNfbnJlbG9jICBbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgY2hhcglzX25sbm5vICAgWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0gIGNoYXIJc19mbGFncyAgIFs0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotLyogTmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zLiAgKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotCi0jZW5kaWYgLyogX19DT0ZGX01DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9taXBzLmggYi9pbmNsdWRlL2NvZmYvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDY2NWIxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9taXBzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyogRUNPRkYgc3VwcG9ydCBvbiBNSVBTIG1hY2hpbmVzLgotICAgY29mZi9lY29mZi5oIG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIHRoaXMgZmlsZS4gICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLSAgdW5zaWduZWQgY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICB1bnNpZ25lZCBjaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgdW5zaWduZWQgY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgdW5zaWduZWQgY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgdW5zaWduZWQgY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIHVuc2lnbmVkIGNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyogTWFnaWMgbnVtYmVycyBhcmUgZGVmaW5lZCBpbiBjb2ZmL2Vjb2ZmLmguICAqLwotI2RlZmluZSBNSVBTX0VDT0ZGX0JBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDXzEpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19MSVRUTEUpICYmXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0JJRykgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0xJVFRMRTIpICYmIFwKLQkJCSAgICAgICgoeCkuZl9tYWdpYyE9TUlQU19NQUdJQ19CSUcyKSAmJiBcCi0JCQkgICAgICAoKHgpLmZfbWFnaWMhPU1JUFNfTUFHSUNfTElUVExFMykgJiYgXAotCQkJICAgICAgKCh4KS5mX21hZ2ljIT1NSVBTX01BR0lDX0JJRzMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IGV4dGVybmFsX2FvdXRoZHIKLXsKLSAgdW5zaWduZWQgY2hhciBtYWdpY1syXTsJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl0c2l6ZVs0XTsJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbNF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgdW5zaWduZWQgY2hhcglic2l6ZVs0XTsJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICB1bnNpZ25lZCBjaGFyCWVudHJ5WzRdOwkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgdW5zaWduZWQgY2hhciB0ZXh0X3N0YXJ0WzRdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YV9zdGFydFs0XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyIGJzc19zdGFydFs0XTsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIgZ3BybWFza1s0XTsJLyogPz8gKi8KLSAgdW5zaWduZWQgY2hhciBjcHJtYXNrWzRdWzRdOwkvKiA/PyAqLwotICB1bnNpZ25lZCBjaGFyIGdwX3ZhbHVlWzRdOwkvKiB2YWx1ZSBmb3IgZ3AgcmVnaXN0ZXIgKi8KLX0gQU9VVEhEUjsKLQotLyogY29tcHV0ZSBzaXplIG9mIGEgaGVhZGVyICovCi0KLSNkZWZpbmUgQU9VVFNaIDU2Ci0jZGVmaW5lIEFPVVRIRFJTWiA1NgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTRUNUSU9OIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLSAgdW5zaWduZWQgY2hhcglzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLSAgdW5zaWduZWQgY2hhcglzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0gIHVuc2lnbmVkIGNoYXIJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotICB1bnNpZ25lZCBjaGFyCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0gIHVuc2lnbmVkIGNoYXIJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgdW5zaWduZWQgY2hhcglzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotICB1bnNpZ25lZCBjaGFyCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLSAgdW5zaWduZWQgY2hhcglzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgdW5zaWduZWQgY2hhciByX3ZhZGRyWzRdOwotICB1bnNpZ25lZCBjaGFyIHJfYml0c1s0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDgKLQotLyogTUlQUyBFQ09GRiB1c2VzIGEgcGFja2VkIDggYnl0ZSBmb3JtYXQgZm9yIHJlbG9jcy4gIFRoZXNlIGNvbnN0YW50cwotICAgYXJlIHVzZWQgdG8gdW5wYWNrIHRoZSByX2JpdHMgZmllbGQuICAqLwotCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1NZTU5EWF9TSF9MRUZUX0JJRwkJMTYKLSNkZWZpbmUgUkVMT0NfQklUUzBfU1lNTkRYX1NIX0xFRlRfTElUVExFCTAKLQotI2RlZmluZSBSRUxPQ19CSVRTMV9TWU1ORFhfU0hfTEVGVF9CSUcJCTgKLSNkZWZpbmUgUkVMT0NfQklUUzFfU1lNTkRYX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBSRUxPQ19CSVRTMl9TWU1ORFhfU0hfTEVGVF9CSUcJCTAKLSNkZWZpbmUgUkVMT0NfQklUUzJfU1lNTkRYX1NIX0xFRlRfTElUVExFCTE2Ci0KLS8qIE9yaWdpbmFsbHksIEVDT0ZGIHVzZWQgZm91ciBiaXRzIGZvciB0aGUgcmVsb2MgdHlwZSBhbmQgaGFkIHRocmVlCi0gICByZXNlcnZlZCBiaXRzLiAgSXJpeCA0IGFkZGVkIGFub3RoZXIgYml0IGZvciB0aGUgcmVsb2MgdHlwZSwgd2hpY2gKLSAgIHdhcyBlYXN5IGJlY2F1c2UgaXQgd2FzIGJpZyBlbmRpYW4gYW5kIG9uZSBvZiB0aGUgc3BhcmUgYml0cyBiZWNhbWUKLSAgIHRoZSBuZXcgbW9zdCBzaWduaWZpY2FudCBiaXQuICBUbyBtYWtlIHRoaXMgYWxzbyB3b3JrIGZvciBsaXR0bGUKLSAgIGVuZGlhbiBFQ09GRiwgd2UgbmVlZCB0byB3cmFwIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgYml0cyBhcm91bmQgdG8KLSAgIGJlY29tZSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIHJlbG9jIHR5cGUuICAqLwotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX0JJRwkJCTB4M0UKLSNkZWZpbmUgUkVMT0NfQklUUzNfVFlQRV9TSF9CSUcJCQkxCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVfTElUVExFCQkJMHg3OAotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFX1NIX0xJVFRMRQkJMwotI2RlZmluZSBSRUxPQ19CSVRTM19UWVBFSElfTElUVExFCQkweDA0Ci0jZGVmaW5lIFJFTE9DX0JJVFMzX1RZUEVISV9TSF9MSVRUTEUJCTIKLQotI2RlZmluZSBSRUxPQ19CSVRTM19FWFRFUk5fQklHCQkJMHgwMQotI2RlZmluZSBSRUxPQ19CSVRTM19FWFRFUk5fTElUVExFCQkweDgwCi0KLS8qIFRoZSByX3R5cGUgZmllbGQgaW4gYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICBJCi0gICBkb24ndCBrbm93IGlmIGFueSBvdGhlciB2YWx1ZXMgY2FuIGFwcGVhci4gIFRoZXNlIHNlZW0gdG8gYmUgYWxsCi0gICB0aGF0IG9jY3VyIGluIHRoZSBVbHRyaXggNC4yIGxpYnJhcmllcy4gICovCi0jZGVmaW5lIE1JUFNfUl9JR05PUkUJMAotI2RlZmluZSBNSVBTX1JfUkVGSEFMRgkxCi0jZGVmaW5lIE1JUFNfUl9SRUZXT1JECTIKLSNkZWZpbmUgTUlQU19SX0pNUEFERFIJMwotI2RlZmluZSBNSVBTX1JfUkVGSEkJNAotI2RlZmluZSBNSVBTX1JfUkVGTE8JNQotI2RlZmluZSBNSVBTX1JfR1BSRUwJNgotI2RlZmluZSBNSVBTX1JfTElURVJBTAk3Ci0KLS8qIFRoZXNlIHJlbG9jIHR5cGVzIGFyZSBhIEN5Z251cyBleHRlbnNpb24gdXNlZCB3aGVuIGdlbmVyYXRpbmcKLSAgIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgZm9yIGVtYmVkZGVkIHN5c3RlbXMuICBUaGUgbnVtYmVycyBhcmUKLSAgIHRha2VuIGZyb20gSXJpeCA0LCBidXQgYXQgbGVhc3QgZm9yIGludGVybmFsIHJlbG9jcyBJcml4IDUgZG9lcyBub3QKLSAgIGdpdmUgdGhlbSB0aGUgc2FtZSBtZWFuaW5nLiAgRm9yIGFuIGludGVybmFsIHJlbG9jIHRoZSBzeW1ib2wgaW5kZXgKLSAgIG9mIFJFTEhJIGFuZCBSRUxMTyBpcyBtb2RpZmllZCBhcyBkZXNjcmliZWQgYmVsb3cgZm9yCi0gICBNSVBTX1JfU1dJVENILiAgKi8KLSNkZWZpbmUgTUlQU19SX1BDUkVMMTYJMTIKLSNkZWZpbmUgTUlQU19SX1JFTEhJCTEzCi0jZGVmaW5lIE1JUFNfUl9SRUxMTwkxNAotCi0vKiBUaGlzIHJlbG9jIHR5cGUgaXMgYSBDeWdudXMgZXh0ZW5zaW9uIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHBvc2l0aW9uCi0gICBpbmRlcGVuZGVudCBjb2RlIGZvciBlbWJlZGRlZCBzeXN0ZW1zLiAgSXQgaXMgdXNlZCBmb3IgYW4gZW50cnkgaW4KLSAgIGEgc3dpdGNoIHRhYmxlLCB3aGljaCBsb29rcyBsaWtlIHRoaXM6Ci0gICAgIC53b3JkICRMMy0kTFMxMgotICAgVGhlIG9iamVjdCBmaWxlIHdpbGwgY29udGFpbiB0aGUgY29ycmVjdCBkaWZmZXJlbmNlLCBhbmQgZG9lcyBub3QKLSAgIHJlcXVpcmUgYWRqdXN0bWVudC4gIEhvd2V2ZXIsIHdoZW4gdGhlIGxpbmtlciBpcyByZWxheGluZyBQQwotICAgcmVsYXRpdmUgY2FsbHMsIGl0IGlzIHBvc3NpYmxlIGZvciAkTDMgdG8gbW92ZSBmYXJ0aGVyIGF3YXkuICBUaGlzCi0gICByZWxvYyBhbHdheXMgYXBwZWFycyBpbiB0aGUgLnRleHQgc2VjdGlvbiwgYW5kIGlzIGFsd2F5cyBhZ2FpbnN0Ci0gICB0aGUgLnRleHQgc2VjdGlvbi4gIEhvd2V2ZXIsIHRoZSBzeW1ib2wgaW5kZXggaXMgbm90Ci0gICBSRUxPQ19TRUNUSU9OX1RFWFQuICBJdCBpcywgaW5zdGVhZCwgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhpcwotICAgc3dpdGNoIHRhYmxlIGVudHJ5IGFuZCAkTFMxMi4gIFRodXMsIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAkTDEyIGlzCi0gICAgIHZhZGRyIC0gc3ltbmR4Ci0gICBhbmQgdGhlIG9yaWdpbmFsIHZhbHVlIG9mICRMMyBpcwotICAgICB2YWRkciAtIHN5bW5keCArIGFkZGVuZAotICAgd2hlcmUgYWRkZW5kIGlzIHRoZSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGZpbGUuICBLbm93aW5nIHRoaXMsIHRoZQotICAgbGlua2VyIGNhbiBrbm93IHdoZXRoZXIgdGhlIGFkZGVuZCBpbiB0aGUgb2JqZWN0IGZpbGUgbXVzdCBiZQotICAgYWRqdXN0ZWQuICAqLwotI2RlZmluZSBNSVBTX1JfU1dJVENICTIyCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNUQUJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgTUlQU19JU19TVEFCIEVDT0ZGX0lTX1NUQUIKLSNkZWZpbmUgTUlQU19NQVJLX1NUQUIgRUNPRkZfTUFSS19TVEFCCi0jZGVmaW5lIE1JUFNfVU5NQVJLX1NUQUIgRUNPRkZfVU5NQVJLX1NUQUIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MSUMgSU5GT1JNQVRJT04gKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV3JpdHRlbiBieSBKb2huIEdpbG1vcmUuICAqLwotCi0vKiBFQ09GRiB1c2VzIENPRkYtbGlrZSBzZWN0aW9uIHN0cnVjdHVyZXMsIGJ1dCBpdHMgb3duIHN5bWJvbCBmb3JtYXQuCi0gICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgc3ltYm9sIGZvcm1hdCBpbiBmaWVsZHMgd2hvc2Ugc2l6ZSBhbmQgYWxpZ25tZW50Ci0gICB3aWxsIG5vdCB2YXJ5IG9uIGRpZmZlcmVudCBob3N0IHN5c3RlbXMuICAqLwotCi0vKiBGaWxlIGhlYWRlciBhcyBhIHNldCBvZiBieXRlcyAqLwotCi1zdHJ1Y3QgaGRyX2V4dCB7Ci0JdW5zaWduZWQgY2hhciAJaF9tYWdpY1syXTsKLQl1bnNpZ25lZCBjaGFyCWhfdnN0YW1wWzJdOwotCXVuc2lnbmVkIGNoYXIJaF9pbGluZU1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JMaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkxpbmVPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lkbk1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JEbk9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaXBkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlBkT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3ltTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlN5bU9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaW9wdE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JPcHRPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lhdXhNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiQXV4T2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9pc3NNYXhbNF07Ci0JdW5zaWduZWQgY2hhcgloX2NiU3NPZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcgloX2lzc0V4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JTc0V4dE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWZkTWF4WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYkZkT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jcmZkWzRdOwotCXVuc2lnbmVkIGNoYXIJaF9jYlJmZE9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfaWV4dE1heFs0XTsKLQl1bnNpZ25lZCBjaGFyCWhfY2JFeHRPZmZzZXRbNF07Ci19OwotCi0vKiBGaWxlIGRlc2NyaXB0b3IgZXh0ZXJuYWwgcmVjb3JkICovCi0KLXN0cnVjdCBmZHJfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWZfYWRyWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9yc3NbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lzc0Jhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NiU3NbNF07Ci0JdW5zaWduZWQgY2hhcglmX2lzeW1CYXNlWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jc3ltWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pbGluZUJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJZl9pb3B0QmFzZVs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfY29wdFs0XTsKLQl1bnNpZ25lZCBjaGFyCWZfaXBkRmlyc3RbMl07Ci0JdW5zaWduZWQgY2hhcglmX2NwZFsyXTsKLQl1bnNpZ25lZCBjaGFyCWZfaWF1eEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NhdXhbNF07Ci0JdW5zaWduZWQgY2hhcglmX3JmZEJhc2VbNF07Ci0JdW5zaWduZWQgY2hhcglmX2NyZmRbNF07Ci0JdW5zaWduZWQgY2hhcglmX2JpdHMxWzFdOwotCXVuc2lnbmVkIGNoYXIJZl9iaXRzMlszXTsKLQl1bnNpZ25lZCBjaGFyCWZfY2JMaW5lT2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJZl9jYkxpbmVbNF07Ci19OwotCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX0JJRwkJMHhGOAotI2RlZmluZQlGRFJfQklUUzFfTEFOR19TSF9CSUcJCTMKLSNkZWZpbmUJRkRSX0JJVFMxX0xBTkdfTElUVExFCQkweDFGCi0jZGVmaW5lCUZEUl9CSVRTMV9MQU5HX1NIX0xJVFRMRQkwCi0KLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9CSUcJCTB4MDQKLSNkZWZpbmUJRkRSX0JJVFMxX0ZNRVJHRV9MSVRUTEUJCTB4MjAKLQotI2RlZmluZQlGRFJfQklUUzFfRlJFQURJTl9CSUcJCTB4MDIKLSNkZWZpbmUJRkRSX0JJVFMxX0ZSRUFESU5fTElUVExFCTB4NDAKLQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9CSUcJMHgwMQotI2RlZmluZQlGRFJfQklUUzFfRkJJR0VORElBTl9MSVRUTEUJMHg4MAotCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfQklHCQkweEMwCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfQklHCQk2Ci0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfTElUVExFCQkweDAzCi0jZGVmaW5lCUZEUl9CSVRTMl9HTEVWRUxfU0hfTElUVExFCTAKLQotLyogV2UgaWdub3JlIHRoZSBgcmVzZXJ2ZWQnIGZpZWxkIGluIGJpdHMyLiAqLwotCi0vKiBQcm9jZWR1cmUgZGVzY3JpcHRvciBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lzeW1bNF07Ci0JdW5zaWduZWQgY2hhcglwX2lsaW5lWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2lvcHRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdtYXNrWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmVnb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZW9mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJhbWVyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX3BjcmVnWzJdOwotCXVuc2lnbmVkIGNoYXIJcF9sbkxvd1s0XTsKLQl1bnNpZ25lZCBjaGFyCXBfbG5IaWdoWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9jYkxpbmVPZmZzZXRbNF07Ci19OwotCi0vKiBSdW50aW1lIHByb2NlZHVyZSB0YWJsZSAqLwotCi1zdHJ1Y3QgcnBkcl9leHQgewotCXVuc2lnbmVkIGNoYXIJcF9hZHJbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX3JlZ29mZnNldFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZnJlZ21hc2tbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyZWdvZmZzZXRbNF07Ci0JdW5zaWduZWQgY2hhcglwX2ZyYW1lb2Zmc2V0WzRdOwotCXVuc2lnbmVkIGNoYXIJcF9mcmFtZXJlZ1syXTsKLQl1bnNpZ25lZCBjaGFyCXBfcGNyZWdbMl07Ci0JdW5zaWduZWQgY2hhcglwX2lycHNzWzRdOwotCXVuc2lnbmVkIGNoYXIJcF9yZXNlcnZlZFs0XTsKLQl1bnNpZ25lZCBjaGFyCXBfZXhjZXB0aW9uX2luZm9bNF07Ci19OwotCi0vKiBMaW5lIG51bWJlcnMgKi8KLQotc3RydWN0IGxpbmVfZXh0IHsKLQl1bnNpZ25lZCBjaGFyCWxfbGluZVs0XTsKLX07Ci0KLS8qIFN5bWJvbCBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IHN5bV9leHQgewotCXVuc2lnbmVkIGNoYXIJc19pc3NbNF07Ci0JdW5zaWduZWQgY2hhcglzX3ZhbHVlWzRdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCXNfYml0czJbMV07Ci0JdW5zaWduZWQgY2hhcglzX2JpdHMzWzFdOwotCXVuc2lnbmVkIGNoYXIJc19iaXRzNFsxXTsKLX07Ci0KLSNkZWZpbmUJU1lNX0JJVFMxX1NUX0JJRwkJMHhGQwotI2RlZmluZQlTWU1fQklUUzFfU1RfU0hfQklHCQkyCi0jZGVmaW5lCVNZTV9CSVRTMV9TVF9MSVRUTEUJCTB4M0YKLSNkZWZpbmUJU1lNX0JJVFMxX1NUX1NIX0xJVFRMRQkJMAotCi0jZGVmaW5lCVNZTV9CSVRTMV9TQ19CSUcJCTB4MDMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX1NIX0xFRlRfQklHCTMKLSNkZWZpbmUJU1lNX0JJVFMxX1NDX0xJVFRMRQkJMHhDMAotI2RlZmluZQlTWU1fQklUUzFfU0NfU0hfTElUVExFCQk2Ci0KLSNkZWZpbmUJU1lNX0JJVFMyX1NDX0JJRwkJMHhFMAotI2RlZmluZQlTWU1fQklUUzJfU0NfU0hfQklHCQk1Ci0jZGVmaW5lCVNZTV9CSVRTMl9TQ19MSVRUTEUJCTB4MDcKLSNkZWZpbmUJU1lNX0JJVFMyX1NDX1NIX0xFRlRfTElUVExFCTIKLQotI2RlZmluZQlTWU1fQklUUzJfUkVTRVJWRURfQklHCQkweDEwCi0jZGVmaW5lCVNZTV9CSVRTMl9SRVNFUlZFRF9MSVRUTEUJMHgwOAotCi0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9CSUcJCTB4MEYKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lCVNZTV9CSVRTMl9JTkRFWF9MSVRUTEUJCTB4RjAKLSNkZWZpbmUJU1lNX0JJVFMyX0lOREVYX1NIX0xJVFRMRQk0Ci0KLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUJU1lNX0JJVFMzX0lOREVYX1NIX0xFRlRfTElUVExFCTQKLQotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9CSUcJMAotI2RlZmluZQlTWU1fQklUUzRfSU5ERVhfU0hfTEVGVF9MSVRUTEUJMTIKLQotLyogRXh0ZXJuYWwgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3QgZXh0X2V4dCB7Ci0JdW5zaWduZWQgY2hhcgllc19iaXRzMVsxXTsKLQl1bnNpZ25lZCBjaGFyCWVzX2JpdHMyWzFdOwotCXVuc2lnbmVkIGNoYXIJZXNfaWZkWzJdOwotCXN0cnVjdAlzeW1fZXh0IGVzX2FzeW07Ci19OwotCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfQklHCQkweDgwCi0jZGVmaW5lCUVYVF9CSVRTMV9KTVBUQkxfTElUVExFCQkweDAxCi0KLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fQklHCTB4NDAKLSNkZWZpbmUJRVhUX0JJVFMxX0NPQk9MX01BSU5fTElUVExFCTB4MDIKLQotI2RlZmluZQlFWFRfQklUUzFfV0VBS0VYVF9CSUcJCTB4MjAKLSNkZWZpbmUJRVhUX0JJVFMxX1dFQUtFWFRfTElUVExFCTB4MDQKLQotLyogRGVuc2UgbnVtYmVycyBleHRlcm5hbCByZWNvcmQgKi8KLQotc3RydWN0IGRucl9leHQgewotCXVuc2lnbmVkIGNoYXIJZF9yZmRbNF07Ci0JdW5zaWduZWQgY2hhcglkX2luZGV4WzRdOwotfTsKLQotLyogUmVsYXRpdmUgZmlsZSBkZXNjcmlwdG9yICovCi0KLXN0cnVjdCByZmRfZXh0IHsKLSAgdW5zaWduZWQgY2hhcglyZmRbNF07Ci19OwotCi0vKiBPcHRpbWl6ZXIgc3ltYm9sIGV4dGVybmFsIHJlY29yZCAqLwotCi1zdHJ1Y3Qgb3B0X2V4dCB7Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzMVsxXTsKLSAgdW5zaWduZWQgY2hhciBvX2JpdHMyWzFdOwotICB1bnNpZ25lZCBjaGFyIG9fYml0czNbMV07Ci0gIHVuc2lnbmVkIGNoYXIgb19iaXRzNFsxXTsKLSAgc3RydWN0IHJuZHhfZXh0IG9fcm5keDsKLSAgdW5zaWduZWQgY2hhciBvX29mZnNldFs0XTsKLX07Ci0KLSNkZWZpbmUgT1BUX0JJVFMyX1ZBTFVFX1NIX0xFRlRfQklHCTE2Ci0jZGVmaW5lIE9QVF9CSVRTMl9WQUxVRV9TSF9MRUZUX0xJVFRMRQkwCi0KLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfQklHCTgKLSNkZWZpbmUgT1BUX0JJVFMzX1ZBTFVFX1NIX0xFRlRfTElUVExFCTgKLQotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9CSUcJMAotI2RlZmluZSBPUFRfQklUUzRfVkFMVUVfU0hfTEVGVF9MSVRUTEUJMTYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9wZS5oIGIvaW5jbHVkZS9jb2ZmL3BlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNjc2YTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3BlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyogUEUgQ09GRiBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLQotI2lmbmRlZiBfUEVfSAotI2RlZmluZSBfUEVfSAotCi0vKiBOVCBzcGVjaWZpYyBmaWxlIGF0dHJpYnV0ZXMgKi8KLSNkZWZpbmUgSU1BR0VfRklMRV9SRUxPQ1NfU1RSSVBQRUQgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBJTUFHRV9GSUxFX0VYRUNVVEFCTEVfSU1BR0UgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIElNQUdFX0ZJTEVfTElORV9OVU1TX1NUUklQUEVEICAgICAgICAweDAwMDQKLSNkZWZpbmUgSU1BR0VfRklMRV9MT0NBTF9TWU1TX1NUUklQUEVEICAgICAgIDB4MDAwOAotI2RlZmluZSBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0xPICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIElNQUdFX0ZJTEVfMzJCSVRfTUFDSElORSAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9ERUJVR19TVFJJUFBFRCAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBJTUFHRV9GSUxFX1NZU1RFTSAgICAgICAgICAgICAgICAgICAgMHgxMDAwCi0jZGVmaW5lIElNQUdFX0ZJTEVfRExMICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAKLSNkZWZpbmUgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9ISSAgICAgICAgIDB4ODAwMAotCi0vKiBhZGRpdGlvbmFsIGZsYWdzIHRvIGJlIHNldCBmb3Igc2VjdGlvbiBoZWFkZXJzIHRvIGFsbG93IHRoZSBOVCBsb2FkZXIgdG8KLSAgIHJlYWQgYW5kIHdyaXRlIHRvIHRoZSBzZWN0aW9uIGRhdGEgKHRvIHJlcGxhY2UgdGhlIGFkZHJlc3NlcyBvZiBkYXRhIGluCi0gICBkbGxzIGZvciBvbmUgdGhpbmcpOyBhbHNvIHRvIGV4ZWN1dGUgdGhlIHNlY3Rpb24gaW4gLnRleHQncyBjYXNlICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fRElTQ0FSREFCTEUgMHgwMjAwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0VYRUNVVEUgICAgIDB4MjAwMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9SRUFEICAgICAgICAweDQwMDAwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fV1JJVEUgICAgICAgMHg4MDAwMDAwMAotCi0vKgotICogU2VjdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYWRkZWQgZm9yIHBwYy1udAotICovCi0KLSNkZWZpbmUgSU1BR0VfU0NOX1RZUEVfTk9fUEFEICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggIC8qIFJlc2VydmVkLiAqLwotCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfQ09ERSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUuICovCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfSU5JVElBTElaRURfREFUQSAgICAgICAweDAwMDAwMDQwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGluaXRpYWxpemVkIGRhdGEuICovCi0jZGVmaW5lIElNQUdFX1NDTl9DTlRfVU5JTklUSUFMSVpFRF9EQVRBICAgICAweDAwMDAwMDgwICAvKiBTZWN0aW9uIGNvbnRhaW5zIHVuaW5pdGlhbGl6ZWQgZGF0YS4gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fTE5LX09USEVSICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMCAgLyogUmVzZXJ2ZWQuICovCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfSU5GTyAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwICAvKiBTZWN0aW9uIGNvbnRhaW5zIGNvbW1lbnRzIG9yIHNvbWUgb3RoZXIgdHlwZSBvZiBpbmZvcm1hdGlvbi4gKi8KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19SRU1PVkUgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAgIC8qIFNlY3Rpb24gY29udGVudHMgd2lsbCBub3QgYmVjb21lIHBhcnQgb2YgaW1hZ2UuICovCi0jZGVmaW5lIElNQUdFX1NDTl9MTktfQ09NREFUICAgICAgICAgICAgICAgICAweDAwMDAxMDAwICAvKiBTZWN0aW9uIGNvbnRlbnRzIGNvbWRhdC4gKi8KLQotI2RlZmluZSBJTUFHRV9TQ05fTUVNX0ZBUkRBVEEgICAgICAgICAgICAgICAgMHgwMDAwODAwMAotCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUFVSR0VBQkxFICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fMTZCSVQgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fTE9DS0VEICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fUFJFTE9BRCAgICAgICAgICAgICAgICAweDAwMDgwMDAwCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzFCWVRFUyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUyAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzRCWVRFUyAgICAgICAgICAgICAgIDB4MDAzMDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzhCWVRFUyAgICAgICAgICAgICAgIDB4MDA0MDAwMDAKLSNkZWZpbmUgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgICAgICAgICAgICAgIDB4MDA1MDAwMDAgIC8qIERlZmF1bHQgYWxpZ25tZW50IGlmIG5vIG90aGVycyBhcmUgc3BlY2lmaWVkLiAqLwotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyAgICAgICAgICAgICAgMHgwMDYwMDAwMAotI2RlZmluZSBJTUFHRV9TQ05fQUxJR05fNjRCWVRFUyAgICAgICAgICAgICAgMHgwMDcwMDAwMAotCi0KLSNkZWZpbmUgSU1BR0VfU0NOX0xOS19OUkVMT0NfT1ZGTCAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIFNlY3Rpb24gY29udGFpbnMgZXh0ZW5kZWQgcmVsb2NhdGlvbnMuICovCi0jZGVmaW5lIElNQUdFX1NDTl9NRU1fTk9UX0NBQ0hFRCAgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBTZWN0aW9uIGlzIG5vdCBjYWNoYWJsZS4gICAgICAgICAgICAgICAqLwotI2RlZmluZSBJTUFHRV9TQ05fTUVNX05PVF9QQUdFRCAgICAgICAgICAgICAgMHgwODAwMDAwMCAgLyogU2VjdGlvbiBpcyBub3QgcGFnZWFibGUuICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSU1BR0VfU0NOX01FTV9TSEFSRUQgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAgIC8qIFNlY3Rpb24gaXMgc2hhcmVhYmxlLiAgICAgICAgICAgICAgICAgICovCi0KLS8qIENPTURBVCBzZWxlY3Rpb24gY29kZXMuICAqLwotCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTICAgICAoMSkgLyogV2FybiBpZiBkdXBsaWNhdGVzLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9BTlkJCSAgICAgKDIpIC8qIE5vIHdhcm5pbmcuICAqLwotI2RlZmluZSBJTUFHRV9DT01EQVRfU0VMRUNUX1NBTUVfU0laRQkgICAgICgzKSAvKiBXYXJuIGlmIGRpZmZlcmVudCBzaXplLiAgKi8KLSNkZWZpbmUgSU1BR0VfQ09NREFUX1NFTEVDVF9FWEFDVF9NQVRDSAkgICAgICg0KSAvKiBXYXJuIGlmIGRpZmZlcmVudC4gICovCi0jZGVmaW5lIElNQUdFX0NPTURBVF9TRUxFQ1RfQVNTT0NJQVRJVkUJICAgICAoNSkgLyogQmFzZSBvbiBvdGhlciBzZWN0aW9uLiAgKi8KLQotLyogTWFnaWMgdmFsdWVzIHRoYXQgYXJlIHRydWUgZm9yIGFsbCBkb3MvbnQgaW1wbGVtZW50YXRpb25zICovCi0jZGVmaW5lIERPU01BR0lDICAgICAgIDB4NWE0ZCAgCi0jZGVmaW5lIE5UX1NJR05BVFVSRSAgIDB4MDAwMDQ1NTAKLQotICAvKiBOVCBhbGxvd3MgbG9uZyBmaWxlbmFtZXMsIHdlIHdhbnQgdG8gYWNjb21tb2RhdGUgdGhpcy4gIFRoaXMgbWF5IGJyZWFrCi0gICAgIHNvbWUgb2YgdGhlIGJmZCBmdW5jdGlvbnMgKi8KLSN1bmRlZiAgRklMTk1MRU4KLSNkZWZpbmUgRklMTk1MRU4JMTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotCi0KLSNpZmRlZiBDT0ZGX0lNQUdFX1dJVEhfUEUKLS8qIFRoZSBmaWxlaGRyIGlzIG9ubHkgd2VpcmVkIGluIGltYWdlcyAqLwotCi0jdW5kZWYgRklMSERSCi1zdHJ1Y3QgZXh0ZXJuYWxfUEVfZmlsZWhkcgotewotICAvKiBET1MgaGVhZGVyIGZpZWxkcyAqLwotICBjaGFyIGVfbWFnaWNbMl07CQkvKiBNYWdpYyBudW1iZXIsIDB4NWE0ZCAqLwotICBjaGFyIGVfY2JscFsyXTsJCS8qIEJ5dGVzIG9uIGxhc3QgcGFnZSBvZiBmaWxlLCAweDkwICovCi0gIGNoYXIgZV9jcFsyXTsJCQkvKiBQYWdlcyBpbiBmaWxlLCAweDMgKi8KLSAgY2hhciBlX2NybGNbMl07CQkvKiBSZWxvY2F0aW9ucywgMHgwICovCi0gIGNoYXIgZV9jcGFyaGRyWzJdOwkJLyogU2l6ZSBvZiBoZWFkZXIgaW4gcGFyYWdyYXBocywgMHg0ICovCi0gIGNoYXIgZV9taW5hbGxvY1syXTsJCS8qIE1pbmltdW0gZXh0cmEgcGFyYWdyYXBocyBuZWVkZWQsIDB4MCAqLwotICBjaGFyIGVfbWF4YWxsb2NbMl07CQkvKiBNYXhpbXVtIGV4dHJhIHBhcmFncmFwaHMgbmVlZGVkLCAweEZGRkYgKi8KLSAgY2hhciBlX3NzWzJdOwkJCS8qIEluaXRpYWwgKHJlbGF0aXZlKSBTUyB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9zcFsyXTsJCQkvKiBJbml0aWFsIFNQIHZhbHVlLCAweGI4ICovCi0gIGNoYXIgZV9jc3VtWzJdOwkJLyogQ2hlY2tzdW0sIDB4MCAqLwotICBjaGFyIGVfaXBbMl07CQkJLyogSW5pdGlhbCBJUCB2YWx1ZSwgMHgwICovCi0gIGNoYXIgZV9jc1syXTsJCQkvKiBJbml0aWFsIChyZWxhdGl2ZSkgQ1MgdmFsdWUsIDB4MCAqLwotICBjaGFyIGVfbGZhcmxjWzJdOwkJLyogRmlsZSBhZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUsIDB4NDAgKi8KLSAgY2hhciBlX292bm9bMl07CQkvKiBPdmVybGF5IG51bWJlciwgMHgwICovCi0gIGNoYXIgZV9yZXNbNF1bMl07CQkvKiBSZXNlcnZlZCB3b3JkcywgYWxsIDB4MCAqLwotICBjaGFyIGVfb2VtaWRbMl07CQkvKiBPRU0gaWRlbnRpZmllciAoZm9yIGVfb2VtaW5mbyksIDB4MCAqLwotICBjaGFyIGVfb2VtaW5mb1syXTsJCS8qIE9FTSBpbmZvcm1hdGlvbjsgZV9vZW1pZCBzcGVjaWZpYywgMHgwICovCi0gIGNoYXIgZV9yZXMyWzEwXVsyXTsJCS8qIFJlc2VydmVkIHdvcmRzLCBhbGwgMHgwICovCi0gIGNoYXIgZV9sZmFuZXdbNF07CQkvKiBGaWxlIGFkZHJlc3Mgb2YgbmV3IGV4ZSBoZWFkZXIsIDB4ODAgKi8KLSAgY2hhciBkb3NfbWVzc2FnZVsxNl1bNF07CS8qIG90aGVyIHN0dWZmLCBhbHdheXMgZm9sbG93IERPUyBoZWFkZXIgKi8KLSAgY2hhciBudF9zaWduYXR1cmVbNF07CQkvKiByZXF1aXJlZCBOVCBzaWduYXR1cmUsIDB4NDU1MCAqLyAKLQotICAvKiBGcm9tIHN0YW5kYXJkIGhlYWRlciAqLyAgCi0KLQotICBjaGFyIGZfbWFnaWNbMl07CQkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnNbMl07CQkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0gIGNoYXIgZl90aW1kYXRbNF07CQkvKiB0aW1lICYgZGF0ZSBzdGFtcAkJKi8KLSAgY2hhciBmX3N5bXB0cls0XTsJCS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zWzRdOwkJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0gIGNoYXIgZl9vcHRoZHJbMl07CQkvKiBzaXplb2Yob3B0aW9uYWwgaGRyKQkJKi8KLSAgY2hhciBmX2ZsYWdzWzJdOwkJLyogZmxhZ3MJCQkqLwotCi19OwotCi0KLSNkZWZpbmUgRklMSERSIHN0cnVjdCBleHRlcm5hbF9QRV9maWxlaGRyCi0jdW5kZWYgRklMSFNaCi0jZGVmaW5lIEZJTEhTWiAxNTIKLQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBBT1VUSERSIHN0YW5kYXJkOwotCi0gIC8qIE5UIGV4dHJhIGZpZWxkczsgc2VlIGludGVybmFsLmggZm9yIGRlc2NyaXB0aW9ucyAqLwotICBjaGFyICBJbWFnZUJhc2VbNF07Ci0gIGNoYXIgIFNlY3Rpb25BbGlnbm1lbnRbNF07Ci0gIGNoYXIgIEZpbGVBbGlnbm1lbnRbNF07Ci0gIGNoYXIgIE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBNYWpvckltYWdlVmVyc2lvblsyXTsKLSAgY2hhciAgTWlub3JJbWFnZVZlcnNpb25bMl07Ci0gIGNoYXIgIE1ham9yU3Vic3lzdGVtVmVyc2lvblsyXTsKLSAgY2hhciAgTWlub3JTdWJzeXN0ZW1WZXJzaW9uWzJdOwotICBjaGFyICBSZXNlcnZlZDFbNF07Ci0gIGNoYXIgIFNpemVPZkltYWdlWzRdOwotICBjaGFyICBTaXplT2ZIZWFkZXJzWzRdOwotICBjaGFyICBDaGVja1N1bVs0XTsKLSAgY2hhciAgU3Vic3lzdGVtWzJdOwotICBjaGFyICBEbGxDaGFyYWN0ZXJpc3RpY3NbMl07Ci0gIGNoYXIgIFNpemVPZlN0YWNrUmVzZXJ2ZVs0XTsKLSAgY2hhciAgU2l6ZU9mU3RhY2tDb21taXRbNF07Ci0gIGNoYXIgIFNpemVPZkhlYXBSZXNlcnZlWzRdOwotICBjaGFyICBTaXplT2ZIZWFwQ29tbWl0WzRdOwotICBjaGFyICBMb2FkZXJGbGFnc1s0XTsKLSAgY2hhciAgTnVtYmVyT2ZSdmFBbmRTaXplc1s0XTsKLSAgLyogSU1BR0VfREFUQV9ESVJFQ1RPUlkgRGF0YURpcmVjdG9yeVtJTUFHRV9OVU1CRVJPRl9ESVJFQ1RPUllfRU5UUklFU107ICovCi0gIGNoYXIgIERhdGFEaXJlY3RvcnlbMTZdWzJdWzRdOyAvKiAxNiBlbnRyaWVzLCAyIGVsZW1lbnRzL2VudHJ5LCA0IGNoYXJzICovCi0KLX0gUEVBT1VUSERSOwotCi0KLSN1bmRlZiBBT1VUU1oKLSNkZWZpbmUgQU9VVFNaIChBT1VUSERSU1ogKyAxOTYpCi0KLSN1bmRlZiAgRV9GSUxOTUxFTgotI2RlZmluZSBFX0ZJTE5NTEVOCTE4CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNlbmRpZgotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3Bvd2VycGMuaCBiL2luY2x1ZGUvY29mZi9wb3dlcnBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NTJjZjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3Bvd2VycGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBCYXNpYyBjb2ZmIGluZm9ybWF0aW9uIGZvciB0aGUgUG93ZXJQQwotICoKLSAqIEJhc2VkIG9uIGNvZmYvcnM2MDAwLmgsIGNvZmYvaTM4Ni5oIGFuZCBvdGhlcnMuCi0gKgotICogSW5pdGlhbCByZWxlYXNlOiBLaW0gS251dHRpbGEgKGtya0BjeWdudXMuY29tKQotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLSAgY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotICBjaGFyIGZfbnNjbnNbMl07CS8qIG51bWJlciBvZiBzZWN0aW9ucwkJKi8KLSAgY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLSAgY2hhciBmX25zeW1zWzRdOwkvKiBudW1iZXIgb2Ygc3ltdGFiIGVudHJpZXMJKi8KLSAgY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLQotLyogZXh0cmEgTlQgZGVmaW5lcyAqLwotI2RlZmluZSBQUENNQUdJQyAgICAgICAwNzYwICAgICAgICAgLyogcGVla2VkIG9uIGFhIFBvd2VyUEMgV2luZG93cyBOVCBib3ggKi8KLSNkZWZpbmUgRE9TTUFHSUMgICAgICAgMHg1YTRkICAgICAgIC8qIGZyb20gYXJtLmgsIGkzODYuaCAqLwotI2RlZmluZSBOVF9TSUdOQVRVUkUgICAweDAwMDA0NTUwICAgLyogZnJvbSBhcm0uaCwgaTM4Ni5oICovCi0KLS8qIGZyb20gd2lubnQuaCAqLwotI2RlZmluZSBJTUFHRV9OVF9PUFRJT05BTF9IRFJfTUFHSUMgICAgICAgIDB4MTBiCi0KLSNkZWZpbmUgUFBDQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBQUENNQUdJQykgCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogMjgKLSNkZWZpbmUgQU9VVEhEUlNaIDI4Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9zY25oZHIgewotICBjaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSAgICAqLwotICBjaGFyCQlzX3BhZGRyWzRdOwkvKiBwaHlzaWNhbCBhZGRyZXNzLCBhbGlhc2VkIHNfbmxpYiAqLwotICBjaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJICAgICAgICAgICAgKi8KLSAgY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkgICAgKi8KLSAgY2hhcgkJc19zY25wdHJbNF07CS8qIGZpbGUgcHRyIHRvIHJhdyBkYXRhIGZvciBzZWN0aW9uICovCi0gIGNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSAgICAqLwotICBjaGFyCQlzX2xubm9wdHJbNF07CS8qIGZpbGUgcHRyIHRvIGxpbmUgbnVtYmVycwkgICAgKi8KLSAgY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJICAgICovCi0gIGNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzICAgICovCi0gIGNoYXIJCXNfZmxhZ3NbNF07CS8qIGZsYWdzCQkJICAgICovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9DT01NRU5UICIuY29tbWVudCIKLSNkZWZpbmUgX0xJQiAiLmxpYiIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLSAgdW5pb24gewotICAgIGNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAgKi8KLSAgICBjaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkgICAgICAgKi8KLSAgfSBsX2FkZHI7Ci0gIGNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJICAgICAgICAgICAgICAgICAgICAgICAqLwotfTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4ICAgICAvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZSAgICAgICAqLwotCi0vKiBBbGxvdyB0aGUgZmlsZSBuYW1lIGxlbmd0aCB0byBiZSBvdmVycmlkZGVuIGluIHRoZSBpbmNsdWRpbmcgZmlsZSAgICovCi0jaWZuZGVmIEVfRklMTk1MRU4KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAotI2VuZGlmCi0KLSNkZWZpbmUgRV9ESU1OVU0JNCAgICAgLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLQotI2RlZmluZSBOX0JUTUFTSwkoMHhmKQotI2RlZmluZSBOX1RNQVNLCQkoMHgzMCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3RhZ25keFs0XTsJICAgICAgICAgICAvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICAgICAgICovCi0gICAgdW5pb24gewotICAgICAgc3RydWN0IHsKLQljaGFyICB4X2xubm9bMl07ICAgICAgICAgICAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAgICAgICAgICovCi0JY2hhciAgeF9zaXplWzJdOyAgICAgICAgICAgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgICAgICAgICAgICAqLwotICAgICAgfSB4X2xuc3o7Ci0gICAgICBjaGFyIHhfZnNpemVbNF07CSAgICAgICAgICAgLyogc2l6ZSBvZiBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwotICAgIH0geF9taXNjOwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7CQkgICAgICAgICAgIC8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAgICAgICAgICAgKi8KLQljaGFyIHhfbG5ub3B0cls0XTsgICAgICAgICAvKiBwdHIgdG8gZmNuIGxpbmUgIyAgICAgICAgICAgICAgICovCi0JY2hhciB4X2VuZG5keFs0XTsJICAgLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICAgICAgICAqLwotICAgICAgfSB4X2ZjbjsKLSAgICAgIHN0cnVjdCB7CQkgICAgICAgICAgIC8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAgICAgICAgKi8KLQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotICAgICAgfSB4X2FyeTsKLSAgICB9IHhfZmNuYXJ5OwotICAgIGNoYXIgeF90dm5keFsyXTsJCSAgIC8qIHR2IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLSAgICBjaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgeF96ZXJvZXNbNF07Ci0gICAgICBjaGFyIHhfb2Zmc2V0WzRdOwotICAgIH0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3Njbmxlbls0XTsJICAgICAgICAgICAvKiBzZWN0aW9uIGxlbmd0aCAgICAgICAgICAgICAgICAgICovCi0gICAgY2hhciB4X25yZWxvY1syXTsJICAgICAgICAgICAvKiAjIHJlbG9jYXRpb24gZW50cmllcyAgICAgICAgICAgICovCi0gICAgY2hhciB4X25saW5ub1syXTsJICAgICAgICAgICAvKiAjIGxpbmUgbnVtYmVycyAgICAgICAgICAgICAgICAgICovCi0gICAgY2hhciB4X2NoZWNrc3VtWzRdOwkJICAgLyogc2VjdGlvbiBDT01EQVQgY2hlY2tzdW0JICAgICAgKi8KLSAgICBjaGFyIHhfYXNzb2NpYXRlZFsyXTsJICAgLyogQ09NREFUIGFzc29jaWF0ZWQgc2VjdGlvbiBpbmRleCAqLwotICAgIGNoYXIgeF9jb21kYXRbMV07CQkgICAvKiBDT01EQVQgc2VsZWN0aW9uIG51bWJlcgkgICAgICAqLwotICB9IHhfc2NuOwotfTsKLQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0jZGVmaW5lIF9FVEVYVAkiZXRleHQiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFJFTE9DQVRJT04gRElSRUNUSVZFUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl90eXBlWzJdOwotfTsKLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3JzNjAwMC5oIGIvaW5jbHVkZS9jb2ZmL3JzNjAwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGVmMWQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9yczYwMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKiBJQk0gUlMvNjAwMCAiWENPRkYiIGZpbGUgZGVmaW5pdGlvbnMgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIEZJWE1FOiBDYW4gc29tZW9uZSBwcm92aWRlIGEgdHJhbnNsaXRlcmF0aW9uIG9mIHRoaXMgbmFtZSBpbnRvIEFTQ0lJPwotICAgVXNpbmcgdGhlIGZvbGxvd2luZyBjaGFycyBjYXVzZWQgYSBjb21waWxlciB3YXJuaW5nIG9uIEhJVVggKHNvIEkgcmVwbGFjZWQKLSAgIHRoZW0gd2l0aCBvY3RhbCBlc2NhcGVzKSwgYW5kIGlzbid0IHVzZWZ1bCB3aXRob3V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdAotICAgY2hhcmFjdGVyIHNldCBpdCBpcy4KLSAgIFdyaXR0ZW4gYnkgTWltaSBQaFwzNzNcMzY0bmctVGhcMzQ1byBWXDM2NSBvZiBJQk0KLSAgIGFuZCBKb2huIEdpbG1vcmUgb2YgQ3lnbnVzIFN1cHBvcnQuICAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotICAgICAgICAvKiBJQk0gUlMvNjAwMCAqLwotI2RlZmluZSBVODAyV1JNQUdJQyAgICAgMDczMCAgICAvKiB3cml0ZWFibGUgdGV4dCBzZWdtZW50cyAqKmNoaCoqICAgICAgKi8KLSNkZWZpbmUgVTgwMlJPTUFHSUMgICAgIDA3MzUgICAgLyogcmVhZG9ubHkgc2hhcmFibGUgdGV4dCBzZWdtZW50cyAgICAgICovCi0jZGVmaW5lIFU4MDJUT0NNQUdJQyAgICAwNzM3ICAgIC8qIHJlYWRvbmx5IHRleHQgc2VnbWVudHMgYW5kIFRPQyAgICAgICAqLwotCi0jZGVmaW5lIEJBRE1BRyh4KQlcCi0JKCh4KS5mX21hZ2ljICE9IFU4MDJST01BR0lDICYmICh4KS5mX21hZ2ljICE9IFU4MDJXUk1BR0lDICYmIFwKLQkgKHgpLmZfbWFnaWMgIT0gVTgwMlRPQ01BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIHVuc2lnbmVkIGNoYXIJbWFnaWNbMl07CS8qIHR5cGUgb2YgZmlsZQkJCSovCi0gIHVuc2lnbmVkIGNoYXIJdnN0YW1wWzJdOwkvKiB2ZXJzaW9uIHN0YW1wCQkqLwotICB1bnNpZ25lZCBjaGFyCXRzaXplWzRdOwkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5ICovCi0gIHVuc2lnbmVkIGNoYXIJZHNpemVbNF07CS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkqLwotICB1bnNpZ25lZCBjaGFyCWJzaXplWzRdOwkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJKi8KLSAgdW5zaWduZWQgY2hhcgllbnRyeVs0XTsJLyogZW50cnkgcHQuCQkJKi8KLSAgdW5zaWduZWQgY2hhcgl0ZXh0X3N0YXJ0WzRdOwkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJZGF0YV9zdGFydFs0XTsJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCW9fdG9jWzRdOwkvKiBhZGRyZXNzIG9mIFRPQyAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25lbnRyeVsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgZW50cnkgcG9pbnQgKi8KLSAgdW5zaWduZWQgY2hhcglvX3NudGV4dFsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLnRleHQgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBjaGFyCW9fc25kYXRhWzJdOwkvKiBzZWN0aW9uIG51bWJlciBvZiAuZGF0YSBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbnRvY1syXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgVE9DICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmxvYWRlclsyXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmxvYWRlciBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19zbmJzc1syXTsJLyogc2VjdGlvbiBudW1iZXIgb2YgLmJzcyBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJb19hbGdudGV4dFsyXTsJLyogLnRleHQgYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJb19hbGduZGF0YVsyXTsJLyogLmRhdGEgYWxpZ25tZW50ICovCi0gIHVuc2lnbmVkIGNoYXIJb19tb2R0eXBlWzJdOwkvKiBtb2R1bGUgdHlwZSAoPz8pICovCi0gIHVuc2lnbmVkIGNoYXIgb19jcHV0eXBlWzJdOwkvKiBjcHUgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCW9fbWF4c3RhY2tbNF07CS8qIG1heCBzdGFjayBzaXplICg/PykgKi8KLSAgdW5zaWduZWQgY2hhciBvX21heGRhdGFbNF07CS8qIG1heCBkYXRhIHNpemUgKD8/KSAqLwotICB1bnNpZ25lZCBjaGFyCW9fcmVzdjJbMTJdOwkvKiByZXNlcnZlZCAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBBT1VUU1ogNzIKLSNkZWZpbmUgU01BTExfQU9VVFNaICgyOCkKLSNkZWZpbmUgQU9VVEhEUlNaIDcyCi0KLSNkZWZpbmUJUlM2S19BT1VUSERSX09NQUdJQwkweDAxMDcJLyogb2xkOiB0ZXh0ICYgZGF0YSB3cml0ZWFibGUgKi8KLSNkZWZpbmUJUlM2S19BT1VUSERSX05NQUdJQwkweDAxMDgJLyogbmV3OiB0ZXh0IHIvbywgZGF0YSByL3cgKi8KLSNkZWZpbmUJUlM2S19BT1VUSERSX1pNQUdJQwkweDAxMEIJLyogcGFnZWQ6IHRleHQgci9vLCBib3RoIHBhZ2UtYWxpZ25lZCAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotI2RlZmluZSBfUEFECSIucGFkIgotI2RlZmluZSBfTE9BREVSCSIubG9hZGVyIgotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKiBYQ09GRiB1c2VzIGEgc3BlY2lhbCAubG9hZGVyIHNlY3Rpb24gd2l0aCB0eXBlIFNUWVBfTE9BREVSLiAgKi8KLSNkZWZpbmUgU1RZUF9MT0FERVIgMHgxMDAwCi0KLS8qIFhDT0ZGIHVzZXMgYSBzcGVjaWFsIC5kZWJ1ZyBzZWN0aW9uIHdpdGggdHlwZSBTVFlQX0RFQlVHLiAgKi8KLSNkZWZpbmUgU1RZUF9ERUJVRyAweDIwMDAKLQotLyogWENPRkYgaGFuZGxlcyBsaW5lIG51bWJlciBvciByZWxvY2F0aW9uIG92ZXJmbG93IGJ5IGNyZWF0aW5nCi0gICBhbm90aGVyIHNlY3Rpb24gaGVhZGVyIHdpdGggU1RZUF9PVlJGTE8gc2V0LiAgKi8KLSNkZWZpbmUgU1RZUF9PVlJGTE8gMHg4MDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJLyogbGluZSBudW1iZXIJCSovCi19OwotCi0KLSNkZWZpbmUJTElORU5PCXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLSNkZWZpbmUJTElORVNaCTYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBTWU1CT0xTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRV9TWU1OTUxFTgk4CS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JMTQJLyogIyBjaGFyYWN0ZXJzIGluIGEgZmlsZSBuYW1lCQkqLwotI2RlZmluZSBFX0RJTU5VTQk0CS8qICMgYXJyYXkgZGltZW5zaW9ucyBpbiBhdXhpbGlhcnkgZW50cnkgKi8KLQotc3RydWN0IGV4dGVybmFsX3N5bWVudCAKLXsKLSAgdW5pb24gewotICAgIGNoYXIgZV9uYW1lW0VfU1lNTk1MRU5dOwotICAgIHN0cnVjdCB7Ci0gICAgICBjaGFyIGVfemVyb2VzWzRdOwotICAgICAgY2hhciBlX29mZnNldFs0XTsKLSAgICB9IGU7Ci0gIH0gZTsKLSAgY2hhciBlX3ZhbHVlWzRdOwotICBjaGFyIGVfc2NudW1bMl07Ci0gIGNoYXIgZV90eXBlWzJdOwotICBjaGFyIGVfc2NsYXNzWzFdOwotICBjaGFyIGVfbnVtYXV4WzFdOwotfTsKLQotCi0KLSNkZWZpbmUgTl9CVE1BU0sJKDAxNykKLSNkZWZpbmUgTl9UTUFTSwkJKDA2MCkKLSNkZWZpbmUgTl9CVFNIRlQJKDQpCi0jZGVmaW5lIE5fVFNISUZUCSgyKQotICAKLQotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBjaGFyIHhfc2NubGVuWzRdOwotCQl1bnNpZ25lZCBjaGFyIHhfcGFybWhhc2hbNF07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbmhhc2hbMl07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbXR5cFsxXTsKLQkJdW5zaWduZWQgY2hhciB4X3NtY2xhc1sxXTsKLQkJdW5zaWduZWQgY2hhciB4X3N0YWJbNF07Ci0JCXVuc2lnbmVkIGNoYXIgeF9zbnN0YWJbMl07Ci0JfSB4X2NzZWN0OwotCi19OwotCi0jZGVmaW5lCVNZTUVOVAlzdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50Ci0jZGVmaW5lCVNZTUVTWgkxOAkKLSNkZWZpbmUJQVVYRU5UCXVuaW9uIGV4dGVybmFsX2F1eGVudAotI2RlZmluZQlBVVhFU1oJMTgKLSNkZWZpbmUgREJYTUFTSyAweDgwCQkvKiBmb3IgZGJ4IHN0b3JhZ2UgbWFzayAqLwotI2RlZmluZSBTWU1OQU1FX0lOX0RFQlVHKHN5bXB0cikgKChzeW1wdHIpLT5uX3NjbGFzcyAmIERCWE1BU0spCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9zaXplWzFdOwotICBjaGFyIHJfdHlwZVsxXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTAKLQotI2RlZmluZSBERUZBVUxUX0RBVEFfU0VDVElPTl9BTElHTk1FTlQgNAotI2RlZmluZSBERUZBVUxUX0JTU19TRUNUSU9OX0FMSUdOTUVOVCA0Ci0jZGVmaW5lIERFRkFVTFRfVEVYVF9TRUNUSU9OX0FMSUdOTUVOVCA0Ci0vKiBGb3IgbmV3IHNlY3Rpb25zIHdlIGhhdm4ndCBoZWFyZCBvZiBiZWZvcmUgKi8KLSNkZWZpbmUgREVGQVVMVF9TRUNUSU9OX0FMSUdOTUVOVCA0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvc2guaCBiL2luY2x1ZGUvY29mZi9zaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTk1N2RmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgSGl0YWNoaSBTSCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJU0hfQVJDSF9NQUdJQ19CSUcJMHgwNTAwCi0jZGVmaW5lCVNIX0FSQ0hfTUFHSUNfTElUVExFCTB4MDU1MCAgLyogTGl0dGxlIGVuZGlhbiBTSCAqLwotCi0KLSNkZWZpbmUgU0hCQURNQUcoeCkgXAotICgoKHgpLmZfbWFnaWMhPVNIX0FSQ0hfTUFHSUNfQklHKSAmJiBcCi0gICgoeCkuZl9tYWdpYyE9U0hfQVJDSF9NQUdJQ19MSVRUTEUpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgaDggZG9uJ3QgaGF2ZSByb29tIGluIHRoZSBpbnN0cnVjdGlvbiBmb3IgdGhlIGVudGlyZQotICAgb2Zmc2V0IC0gZWcgdGhlIHN0cmFuZ2UganVtcCBhbmQgaGlnaCBwYWdlIGFkZHJlc3NpbmcgbW9kZXMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0vKiBTSCByZWxvY2F0aW9uIHR5cGVzLiAgTm90IGFsbCBvZiB0aGVzZSBhcmUgYWN0dWFsbHkgdXNlZC4gICovCi0KLSNkZWZpbmUgUl9TSF9VTlVTRUQJMAkJLyogb25seSB1c2VkIGludGVybmFsbHkgKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTDggCTMJCS8qICA4IGJpdCBwY3JlbCAJKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTDE2IAk0CQkvKiAxNiBiaXQgcGNyZWwgCSovCi0jZGVmaW5lIFJfU0hfSElHSDggIAk1CQkvKiBoaWdoIDggYml0cyBvZiAyNCBiaXQgYWRkcmVzcyAqLwotI2RlZmluZSBSX1NIX0xPVzE2IAk3CQkvKiBsb3cgMTYgYml0cyBvZiAyNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NMjQJNgkJLyogMjQgYml0IGltbWVkaWF0ZSAqLwotI2RlZmluZSBSX1NIX1BDRElTUDhCWTQJOSAgCQkvKiBQQyByZWwgOCBiaXRzICo0ICt2ZSAqLwotI2RlZmluZSBSX1NIX1BDRElTUDhCWTIJMTAgIAkJLyogUEMgcmVsIDggYml0cyAqMiArdmUgKi8KLSNkZWZpbmUgUl9TSF9QQ0RJU1A4ICAgIDExICAJCS8qIDggYml0IGJyYW5jaCAqLwotI2RlZmluZSBSX1NIX1BDRElTUCAgICAgMTIgIAkJLyogMTIgYml0IGJyYW5jaCAqLwotI2RlZmluZSBSX1NIX0lNTTMyICAgICAgMTQgICAgCQkvKiAzMiBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NOCAgIAkxNgkJLyogOCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NOEJZMiAgICAxNwkJLyogOCBiaXQgaW1tZWRpYXRlICoyICovCi0jZGVmaW5lIFJfU0hfSU1NOEJZNCAgICAxOAkJLyogOCBiaXQgaW1tZWRpYXRlICo0ICovCi0jZGVmaW5lIFJfU0hfSU1NNCAgIAkxOQkJLyogNCBiaXQgaW1tZWRpYXRlICovCi0jZGVmaW5lIFJfU0hfSU1NNEJZMiAgICAyMAkJLyogNCBiaXQgaW1tZWRpYXRlICoyICovCi0jZGVmaW5lIFJfU0hfSU1NNEJZNCAgICAyMQkJLyogNCBiaXQgaW1tZWRpYXRlICo0ICovCi0jZGVmaW5lIFJfU0hfUENSRUxJTU04QlkyICAgMjIJCS8qIFBDIHJlbCA4IGJpdHMgKjIgdW5zaWduZWQgKi8KLSNkZWZpbmUgUl9TSF9QQ1JFTElNTThCWTQgICAyMwkJLyogUEMgcmVsIDggYml0cyAqNCB1bnNpZ25lZCAqLwotI2RlZmluZSBSX1NIX0lNTTE2ICAgICAgMjQgICAgCQkvKiAxNiBiaXQgaW1tZWRpYXRlICovCi0KLS8qIFRoZSBzd2l0Y2ggdGFibGUgcmVsb2MgdHlwZXMgYXJlIHVzZWQgZm9yIHJlbGF4aW5nLiAgVGhleSBhcmUKLSAgIGdlbmVyYXRlZCBmb3IgZXhwcmVzc2lvbnMgc3VjaCBhcwotICAgICAud29yZCBMMSAtIEwyCi0gICBUaGUgcl9vZmZzZXQgZmllbGQgaG9sZHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgcmVsb2MgYWRkcmVzcwotICAgYW5kIEwyLiAgKi8KLSNkZWZpbmUgUl9TSF9TV0lUQ0g4CTMzCQkvKiA4IGJpdCBzd2l0Y2ggdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgUl9TSF9TV0lUQ0gxNgkyNQkJLyogMTYgYml0IHN3aXRjaCB0YWJsZSBlbnRyeSAqLwotI2RlZmluZSBSX1NIX1NXSVRDSDMyCTI2CQkvKiAzMiBiaXQgc3dpdGNoIHRhYmxlIGVudHJ5ICovCi0KLS8qIFRoZSBVU0VTIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgcmVsYXhpbmcuICBUaGUgY29tcGlsZXIgd2lsbAotICAgZ2VuZXJhdGUgLnVzZXMgcHNldWRvLW9wcyB3aGVuIGl0IGZpbmRzIGEgZnVuY3Rpb24gY2FsbCB3aGljaCBpdAotICAgY2FuIHJlbGF4LiAgVGhlIHJfb2Zmc2V0IGZpZWxkIG9mIHRoZSBVU0VTIHJlbG9jIGhvbGRzIHRoZSBQQwotICAgcmVsYXRpdmUgb2Zmc2V0IHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBsb2FkcyB0aGUgcmVnaXN0ZXIgdXNlZCBpbgotICAgdGhlIGZ1bmN0aW9uIGNhbGwuICAqLwotI2RlZmluZSBSX1NIX1VTRVMJMjcJCS8qIC51c2VzIHBzZXVkby1vcCAqLwotCi0vKiBUaGUgQ09VTlQgcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSBhc3NlbWJsZXIgd2lsbAotICAgZ2VuZXJhdGUgQ09VTlQgcmVsb2NzIGZvciBhZGRyZXNzZXMgcmVmZXJyZWQgdG8gYnkgdGhlIHJlZ2lzdGVyCi0gICBsb2FkcyBhc3NvY2lhdGVkIHdpdGggVVNFUyByZWxvY3MuICBUaGUgcl9vZmZzZXQgZmllbGQgb2YgdGhlIENPVU5UCi0gICByZWxvYyBob2xkcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhZGRyZXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlCi0gICBvYmplY3QgZmlsZS4gICovCi0jZGVmaW5lIFJfU0hfQ09VTlQJMjgJCS8qIENvdW50IG9mIGNvbnN0YW50IHBvb2wgdXNlcyAqLwotCi0vKiBUaGUgQUxJR04gcmVsb2MgdHlwZSBpcyB1c2VkIGZvciByZWxheGluZy4gIFRoZSByX29mZnNldCBmaWVsZCBpcwotICAgdGhlIHBvd2VyIG9mIHR3byB0byB3aGljaCBzdWJzZXF1ZW50IHBvcnRpb25zIG9mIHRoZSBvYmplY3QgZmlsZQotICAgbXVzdCBiZSBhbGlnbmVkLiAgKi8KLSNkZWZpbmUgUl9TSF9BTElHTgkyOQkJLyogLmFsaWduIHBzZXVkby1vcCAqLwotCi0vKiBUaGUgQ09ERSBhbmQgREFUQSByZWxvYyB0eXBlcyBhcmUgdXNlZCBmb3IgYWxpZ25pbmcgbG9hZCBhbmQgc3RvcmUKLSAgIGluc3RydWN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIENPREUgcmVsb2MgYmVmb3JlIGEKLSAgIGJsb2NrIG9mIGluc3RydWN0aW9ucy4gIEl0IHdpbGwgZ2VuZXJhdGUgYSBEQVRBIHJlbG9jIGJlZm9yZSBkYXRhLgotICAgQSBzZWN0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQgYXNzdW1pbmcgaXQgY29udGFpbnMgZGF0YSwgdW5sZXNzIGEKLSAgIENPREUgcmVsb2MgaXMgc2Vlbi4gIFRoZSBvbmx5IHJlbGV2YW50IHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBpbiB0aGUKLSAgIENPREUgYW5kIERBVEEgcmVsb2NzIGFyZSB0aGUgc2VjdGlvbiBhbmQgdGhlIGFkZHJlc3MuICBUaGUgc3ltYm9sCi0gICBhbmQgb2Zmc2V0IGFyZSBtZWFuaW5nbGVzcy4gICovCi0jZGVmaW5lIFJfU0hfQ09ERQkzMAkJLyogc3RhcnQgb2YgY29kZSAqLwotI2RlZmluZSBSX1NIX0RBVEEJMzEJCS8qIHN0YXJ0IG9mIGRhdGEgKi8KLQotLyogVGhlIExBQkVMIHJlbG9jIHR5cGUgaXMgdXNlZCBmb3IgYWxpZ25pbmcgbG9hZCBhbmQgc3RvcmUKLSAgIGluc3RydWN0aW9ucy4gIFRoZSBhc3NlbWJsZXIgd2lsbCBnZW5lcmF0ZSBhIExBQkVMIHJlbG9jIGZvciBlYWNoCi0gICBsYWJlbCB3aXRoaW4gYSBibG9jayBvZiBpbnN0cnVjdGlvbnMuICBUaGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0bwotICAgYXZvaWQgc3dhcHBpbmcgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSB0aGUgdGFyZ2V0cyBvZiBicmFuY2hlcy4gICovCi0jZGVmaW5lIFJfU0hfTEFCRUwJMzIJCS8qIGxhYmVsICovCi0KLS8qIE5COiBSX1NIX1NXSVRDSDggaXMgMzMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zcGFyYy5oIGIvaW5jbHVkZS9jb2ZmL3NwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTI0ZjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9jb2ZmL3NwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBTcGFyYy4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBhbiBhbWFsZ2FtYXRpb24gb2Ygc2V2ZXJhbCBzdGFuZGFyZCBpbmNsdWRlIGZpbGVzIHRoYXQKLSAgIGRlZmluZSBjb2ZmIGZvcm1hdCwgc3VjaCBhcyBmaWxlaGRyLmgsIGFvdXRoZHIuaCwgYW5kIHNvIGZvcnRoLiAgSW4KLSAgIGFkZGl0aW9uLCBhbGwgZGF0YXR5cGVzIGhhdmUgYmVlbiB0cmFuc2xhdGVkIGludG8gY2hhcmFjdGVyIGFycmF5cyBvZgotICAgKHByZXN1bWVkKSBlcXVpdmFsZW50IHNpemUuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHRoaXMgZmlsZSBjYW4KLSAgIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgc3lzdGVtcyB3aGlsZSBzdGlsbCB5aWVsZGluZyB0aGUgc2FtZSByZXN1bHRzLiAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogRklMRSBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLXsKLSAgY2hhciBmX21hZ2ljWzJdOwkJLyogbWFnaWMgbnVtYmVyCQkJKi8KLSAgY2hhciBmX25zY25zWzJdOwkJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotICBjaGFyIGZfdGltZGF0WzRdOwkJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0gIGNoYXIgZl9zeW1wdHJbNF07CQkvKiBmaWxlIHBvaW50ZXIgdG8gc3ltdGFiCSovCi0gIGNoYXIgZl9uc3ltc1s0XTsJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotICBjaGFyIGZfb3B0aGRyWzJdOwkJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0gIGNoYXIgZl9mbGFnc1syXTsJCS8qIGZsYWdzCQkJKi8KLX07Ci0KLSNkZWZpbmUgRl9SRUxGTEcJKDB4MDAwMSkJLyogcmVsb2NhdGlvbiBpbmZvIHN0cmlwcGVkICovCi0jZGVmaW5lIEZfRVhFQwkJKDB4MDAwMikJLyogZmlsZSBpcyBleGVjdXRhYmxlICovCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkJLyogbGluZSBudW1iZXJzIHN0cmlwcGVkICovCi0jZGVmaW5lIEZfTFNZTVMJCSgweDAwMDgpCS8qIGxvY2FsIHN5bWJvbHMgc3RyaXBwZWQgKi8KLQotI2RlZmluZSBTUEFSQ01BR0lDCSgwNTQwKQotCi0vKiBUaGlzIGlzIEx5bngncyBhbGwtcGxhdGZvcm0gbWFnaWMgbnVtYmVyIGZvciBleGVjdXRhYmxlcy4gKi8KLQotI2RlZmluZSBMWU5YQ09GRk1BR0lDCSgwNDE1KQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciBtYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyIHZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyIHRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIgZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIgYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIgZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciB0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIGRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotI2RlZmluZSBPTUFHSUMgICAgICAgICAgMDQwNCAgICAvKiBvYmplY3QgZmlsZXMsIGVnIGFzIG91dHB1dCAqLwotI2RlZmluZSBaTUFHSUMgICAgICAgICAgMDQxMyAgICAvKiBkZW1hbmQgbG9hZCBmb3JtYXQsIGVnIG5vcm1hbCBsZCBvdXRwdXQgKi8KLSNkZWZpbmUgU1RNQUdJQwkJMDQwMQkvKiB0YXJnZXQgc2hsaWIgKi8KLSNkZWZpbmUgU0hNQUdJQwkJMDQ0MwkvKiBob3N0ICAgc2hsaWIgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkcgotewotICBjaGFyIHNfbmFtZVs4XTsJCS8qIHNlY3Rpb24gbmFtZQkJCSovCi0gIGNoYXIgc19wYWRkcls0XTsJCS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0gIGNoYXIgc192YWRkcls0XTsJCS8qIHZpcnR1YWwgYWRkcmVzcwkJKi8KLSAgY2hhciBzX3NpemVbNF07CQkvKiBzZWN0aW9uIHNpemUJCQkqLwotICBjaGFyIHNfc2NucHRyWzRdOwkJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLSAgY2hhciBzX3JlbHB0cls0XTsJCS8qIGZpbGUgcHRyIHRvIHJlbG9jYXRpb24JKi8KLSAgY2hhciBzX2xubm9wdHJbNF07CQkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLSAgY2hhciBzX25yZWxvY1syXTsJCS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLSAgY2hhciBzX25sbm5vWzJdOwkJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMqLwotICBjaGFyIHNfZmxhZ3NbNF07CQkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKiBOYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMuICovCi0KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9UVgkiLnR2IgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLSNkZWZpbmUgX0NPTU1FTlQgIi5jb21tZW50IgotI2RlZmluZSBfTElCICIubGliIgotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gICBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAgIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gICBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuICovCi0KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8KLXsKLSAgdW5pb24gewotICAgIGNoYXIgbF9zeW1uZHhbNF07CQkvKiBmbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwICovCi0gICAgY2hhciBsX3BhZGRyWzRdOwkJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyICovCi0gIH0gbF9hZGRyOwotICBjaGFyIGxfbG5ub1syXTsJCS8qIGxpbmUgbnVtYmVyICovCi19OwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgkoNikKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JKDgpCS8qICMgY2hhcmFjdGVycyBpbiBhIHN5bWJvbCBuYW1lCSovCi0jZGVmaW5lIEVfRklMTk1MRU4JKDE0KQkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCSg0KQkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotI2lmIDAgLyogb2YgZG91YnRmdWwgdmFsdWUgKi8KLSAgICBjaGFyIGVfbnB0clsyXVs0XTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX2xlYWRpbmdfemVyb1sxXTsKLSAgICAgIGNoYXIgZV9kYnhfdHlwZVsxXTsKLSAgICAgIGNoYXIgZV9kYnhfZGVzY1syXTsKLSAgICB9IGVfZGJ4OwotI2VuZGlmCi0gIH0gZTsKLQotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci0gIGNoYXIgcGFkZGluZ1syXTsKLX07Ci0KLSNkZWZpbmUgTl9CVE1BU0sJKDB4ZikKLSNkZWZpbmUgTl9UTUFTSwkJKDB4MzApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi11bmlvbiBleHRlcm5hbF9hdXhlbnQKLXsKLSAgc3RydWN0IHsKLSAgICBjaGFyIHhfdGFnbmR4WzRdOwkJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7Ci0JY2hhciAgeF9sbm5vWzJdOwkvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCWNoYXIgIHhfc2l6ZVsyXTsJLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLSAgICAgIH0geF9sbnN6OwotICAgICAgY2hhciB4X2ZzaXplWzRdOwkJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotICAgIH0geF9taXNjOwotICAgIHVuaW9uIHsKLSAgICAgIHN0cnVjdCB7CQkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0gICAgICB9IHhfZmNuOwotICAgICAgc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCWNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0gICAgICB9IHhfYXJ5OwotICAgIH0geF9mY25hcnk7Ci0gICAgY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLSAgfSB4X3N5bTsKLSAgCi0gIHVuaW9uIHsKLSAgICBjaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgeF96ZXJvZXNbNF07Ci0gICAgICBjaGFyIHhfb2Zmc2V0WzRdOwotICAgIH0geF9uOwotICB9IHhfZmlsZTsKLSAgCi0gIHN0cnVjdCB7Ci0gICAgY2hhciB4X3Njbmxlbls0XTsJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0gICAgY2hhciB4X25yZWxvY1syXTsJCS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0gICAgY2hhciB4X25saW5ub1syXTsJCS8qICMgbGluZSBudW1iZXJzICovCi0gIH0geF9zY247Ci0gIAotICBzdHJ1Y3QgewotICAgIGNoYXIgeF90dmZpbGxbNF07CQkvKiB0diBmaWxsIHZhbHVlICovCi0gICAgY2hhciB4X3R2bGVuWzJdOwkJLyogbGVuZ3RoIG9mIC50diAqLwotICAgIGNoYXIgeF90dnJhblsyXVsyXTsJCS8qIHR2IHJhbmdlICovCi0gIH0geF90djsJCQkvKiAudHYgc2VjdGlvbiBpbmZvIChpbiBhdXhlbnQgb2Ygc3ltIC50dikpICovCi0KLSAgY2hhciB4X2ZpbGxbMjBdOwkJLyogZm9yY2VzIHRvIDIwLWJ5dGUgc2l6ZSAqLwotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMjAJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTIwCi0KLSNkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zcGFyZVsyXTsKLSAgY2hhciByX29mZnNldFs0XTsKLX07Ci0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDE2Ci0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi9zeW0uaCBiL2luY2x1ZGUvY29mZi9zeW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyMDRhZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvc3ltLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ODQgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIG9mIGludGVybmFsIGZvcm1hdCBvZiBNSVBTIEVDT0ZGIHN5bWJvbHMuCi0gICBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcyBhbmQgVGhpcmQgRXllIFNvZnR3YXJlLgotICAgQ2hhbmdlcyBjb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydCBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uICAKLQotICAgVGhpcyBmaWxlIGlzIGp1c3QgYWdncmVnYXRlZCB3aXRoIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIEdOVQotICAgcmVsZWFzZTsgaXQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiBHQVMsIEdEQiwgb3Igb3RoZXIgR05VCi0gICBwcm9ncmFtcy4gICovCi0KLS8qCi0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKiB8IENvcHlyaWdodCAoYykgMTk5MiwgMTk5MSwgMTk5MCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy58Ci0gKiB8IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcywgSW5jLiBncmFudHMgcmVwcm9kdWN0aW9uIGFuZCB1c2UgICB8Ci0gKiB8IHJpZ2h0cyB0byBhbGwgcGFydGllcywgUFJPVklERUQgdGhhdCB0aGlzIGNvbW1lbnQgaXMgICAgICB8Ci0gKiB8IG1haW50YWluZWQgaW4gdGhlIGNvcHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Ci0gKi8KLSNpZm5kZWYgX1NZTV9ICi0jZGVmaW5lIF9TWU1fSAotCi0vKiAoQykgQ29weXJpZ2h0IDE5ODQgYnkgVGhpcmQgRXllIFNvZnR3YXJlLCBJbmMuCi0gKgotICogVGhpcmQgRXllIFNvZnR3YXJlLCBJbmMuIGdyYW50cyByZXByb2R1Y3Rpb24gYW5kIHVzZSByaWdodHMgdG8KLSAqIGFsbCBwYXJ0aWVzLCBQUk9WSURFRCB0aGF0IHRoaXMgY29tbWVudCBpcyBtYWludGFpbmVkIGluIHRoZSBjb3B5LgotICoKLSAqIFRoaXJkIEV5ZSBtYWtlcyBubyBjbGFpbXMgYWJvdXQgdGhlIGFwcGxpY2FiaWxpdHkgb2YgdGhpcwotICogc3ltYm9sIHRhYmxlIHRvIGEgcGFydGljdWxhciB1c2UuCi0gKi8KLQotLyogCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIFRoaXJkIEV5ZSBTeW1ib2wgVGFibGUuCi0gKgotICogU3ltYm9scyBhcmUgYXNzdW1lZCB0byBiZSBpbiAnZW5jb3VudGVyIG9yZGVyJyAtIGkuZS4gdGhlIG9yZGVyIHRoYXQKLSAqIHRoZSB0aGluZ3MgdGhleSByZXByZXNlbnQgd2VyZSBlbmNvdW50ZXJlZCBieSB0aGUgY29tcGlsZXIvYXNzZW1ibGVyL2xvYWRlci4KLSAqIEVYQ0VQVCBmb3IgZ2xvYmFscyEJVGhlc2UgYXJlIGFzc3VtZWQgdG8gYmUgYnVuY2hlZCB0b2dldGhlciwKLSAqIHByb2JhYmx5IHJpZ2h0IGFmdGVyIHRoZSBsYXN0ICdub3JtYWwnIHN5bWJvbC4gIEdsb2JhbHMgQVJFIHNvcnRlZAotICogaW4gYXNjZW5kaW5nIG9yZGVyLgotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBBIGJyaWVmIHdvcmQgYWJvdXQgVGhpcmQgRXllIG5hbWluZy91c2UgY29udmVudGlvbnM6Ci0gKgotICogQWxsIGFycmF5cyBhbmQgaW5kZXgncyBhcmUgMCBiYXNlZC4KLSAqIEFsbCAiaWZvb01heCIgdmFsdWVzIGFyZSB0aGUgaGlnaGVzdCBsZWdhbCB2YWx1ZSBQTFVTIE9ORS4gVGhpcyBtYWtlcwotICogdGhlbSBnb29kIGZvciBhbGxvY2F0aW5nIGFycmF5cywgZXRjLiBBbGwgY2hlY2tzIGFyZSAiaWZvbyA8IGlmb29NYXgiLgotICoKLSAqICJpc3ltIglJbmRleCBpbnRvIHRoZSBTWU1ib2wgdGFibGUuCi0gKiAiaXBkIglJbmRleCBpbnRvIHRoZSBQcm9jZWR1cmUgRGVzY3JpcHRvciBhcnJheS4KLSAqICJpZmQiCUluZGV4IGludG8gdGhlIEZpbGUgRGVzY3JpcHRvciBhcnJheS4KLSAqICJpc3MiCUluZGV4IGludG8gU3RyaW5nIFNwYWNlLgotICogImNiIgkJQ291bnQgb2YgQnl0ZXMuCi0gKiAicmdQZCIJYXJyYXkgd2hvc2UgZG9tYWluIGlzICIwLi5pcGRNYXgtMSIgYW5kIFJhbkdlIGlzIFBEUi4KLSAqICJyZ0ZkIglhcnJheSB3aG9zZSBkb21haW4gaXMgIjAuLmlmZE1heC0xIiBhbmQgUmFuR2UgaXMgRkRSLgotICovCi0KLQotLyogCi0gKiBTeW1ib2xpYyBIZWFkZXIgKEhEUikgc3RydWN0dXJlLgotICogQXMgbG9uZyBhcyBhbGwgdGhlIHBvaW50ZXJzIGFyZSBzZXQgY29ycmVjdGx5LAotICogd2UgZG9uJ3QgY2FyZSBXSEFUIG9yZGVyIHRoZSB2YXJpb3VzIHNlY3Rpb25zIGNvbWUgb3V0IGluIQotICoKLSAqIEEgZmlsZSBwcm9kdWNlZCBzb2xlbHkgZm9yIHRoZSB1c2Ugb2YgQ0RCIHdpbGwgcHJvYmFibHkgTk9UIGhhdmUKLSAqIGFueSBpbnN0cnVjdGlvbnMgb3IgZGF0YSBhcmVhcyBpbiBpdCwgYXMgdGhlc2UgYXJlIGF2YWlsYWJsZQotICogaW4gdGhlIG9yaWdpbmFsLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydAltYWdpYzsJCS8qIHRvIHZlcmlmeSB2YWxpZGl0eSBvZiB0aGUgdGFibGUgKi8KLQlzaG9ydAl2c3RhbXA7CQkvKiB2ZXJzaW9uIHN0YW1wICovCi0JbG9uZwlpbGluZU1heDsJLyogbnVtYmVyIG9mIGxpbmUgbnVtYmVyIGVudHJpZXMgKi8KLQliZmRfdm1hCWNiTGluZTsJCS8qIG51bWJlciBvZiBieXRlcyBmb3IgbGluZSBudW1iZXIgZW50cmllcyAqLwotCWJmZF92bWEJY2JMaW5lT2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JbG9uZwlpZG5NYXg7CQkvKiBtYXggaW5kZXggaW50byBkZW5zZSBudW1iZXIgdGFibGUgKi8KLQliZmRfdm1hCWNiRG5PZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBkZW5zZSBudW1iZXIgdGFibGUgKi8KLQlsb25nCWlwZE1heDsJCS8qIG51bWJlciBvZiBwcm9jZWR1cmVzICovCi0JYmZkX3ZtYQljYlBkT2Zmc2V0OwkvKiBvZmZzZXQgdG8gcHJvY2VkdXJlIGRlc2NyaXB0b3IgdGFibGUgKi8KLQlsb25nCWlzeW1NYXg7CS8qIG51bWJlciBvZiBsb2NhbCBzeW1ib2xzICovCi0JYmZkX3ZtYQljYlN5bU9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGxvY2FsIHN5bWJvbHMqLwotCWxvbmcJaW9wdE1heDsJLyogbWF4IGluZGV4IGludG8gb3B0aW1pemF0aW9uIHN5bWJvbCBlbnRyaWVzICovCi0JYmZkX3ZtYQljYk9wdE9mZnNldDsJLyogb2Zmc2V0IHRvIG9wdGltaXphdGlvbiBzeW1ib2wgZW50cmllcyAqLwotCWxvbmcJaWF1eE1heDsJLyogbnVtYmVyIG9mIGF1eGlsbGFyeSBzeW1ib2wgZW50cmllcyAqLwotCWJmZF92bWEJY2JBdXhPZmZzZXQ7CS8qIG9mZnNldCB0byBzdGFydCBvZiBhdXhpbGxhcnkgc3ltYm9sIGVudHJpZXMqLwotCWxvbmcJaXNzTWF4OwkJLyogbWF4IGluZGV4IGludG8gbG9jYWwgc3RyaW5ncyAqLwotCWJmZF92bWEJY2JTc09mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGxvY2FsIHN0cmluZ3MgKi8KLQlsb25nCWlzc0V4dE1heDsJLyogbWF4IGluZGV4IGludG8gZXh0ZXJuYWwgc3RyaW5ncyAqLwotCWJmZF92bWEJY2JTc0V4dE9mZnNldDsJLyogb2Zmc2V0IHRvIHN0YXJ0IG9mIGV4dGVybmFsIHN0cmluZ3MgKi8KLQlsb25nCWlmZE1heDsJCS8qIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3IgZW50cmllcyAqLwotCWJmZF92bWEJY2JGZE9mZnNldDsJLyogb2Zmc2V0IHRvIGZpbGUgZGVzY3JpcHRvciB0YWJsZSAqLwotCWxvbmcJY3JmZDsJCS8qIG51bWJlciBvZiByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgZW50cmllcyAqLwotCWJmZF92bWEJY2JSZmRPZmZzZXQ7CS8qIG9mZnNldCB0byByZWxhdGl2ZSBmaWxlIGRlc2NyaXB0b3IgdGFibGUgKi8KLQlsb25nCWlleHRNYXg7CS8qIG1heCBpbmRleCBpbnRvIGV4dGVybmFsIHN5bWJvbHMgKi8KLQliZmRfdm1hCWNiRXh0T2Zmc2V0OwkvKiBvZmZzZXQgdG8gc3RhcnQgb2YgZXh0ZXJuYWwgc3ltYm9sIGVudHJpZXMqLwotCS8qIElmIHlvdSBhZGQgbWFjaGluZSBkZXBlbmRlbnQgZmllbGRzLCBhZGQgdGhlbSBoZXJlICovCi0JfSBIRFJSLCAqcEhEUlI7IAotI2RlZmluZSBjYkhEUlIgc2l6ZW9mKEhEUlIpCi0jZGVmaW5lIGhkck5pbCAoKHBIRFJSKTApCi0KLS8qCi0gKiBUaGUgRkRSIGFuZCBQRFIgc3RydWN0dXJlcyBzcGVlZCBtYXBwaW5nIG9mIGFkZHJlc3MgPC0+IG5hbWUuCi0gKiBUaGV5IGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG1lbW9yeSBvcmRlciBhbmQgYXJlIGtlcHQgaW4KLSAqIG1lbW9yeSBieSBDREIgYXQgcnVudGltZS4KLSAqLwotCi0vKiAKLSAqIEZpbGUgRGVzY3JpcHRvcgotICoKLSAqIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgRVZFUlkgRklMRSwgd2hldGhlciBjb21waWxlZCB3aXRoCi0gKiBmdWxsIGRlYnVnZ2luZyBzeW1ib2xzIG9yIG5vdC4gIFRoZSBuYW1lIG9mIGEgZmlsZSBzaG91bGQgYmUKLSAqIHRoZSBwYXRoIG5hbWUgZ2l2ZW4gdG8gdGhlIGNvbXBpbGVyLgkgVGhpcyBhbGxvd3MgdGhlIHVzZXIKLSAqIHRvIHNpbXBseSBzcGVjaWZ5IHRoZSBuYW1lcyBvZiB0aGUgZGlyZWN0b3JpZXMgd2hlcmUgdGhlIENPTVBJTEVTCi0gKiB3ZXJlIGRvbmUsIGFuZCB3ZSB3aWxsIGJlIGFibGUgdG8gZmluZCB0aGVpciBmaWxlcy4KLSAqIEEgZmllbGQgd2hvc2UgY29tbWVudCBzdGFydHMgd2l0aCAiUiAtICIgaW5kaWNhdGVzIHRoYXQgaXQgd2lsbCBiZQotICogc2V0dXAgYXQgcnVudGltZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZmRyIHsKLQliZmRfdm1hCWFkcjsJCS8qIG1lbW9yeSBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBmaWxlICovCi0JbG9uZwlyc3M7CQkvKiBmaWxlIG5hbWUgKG9mIHNvdXJjZSwgaWYga25vd24pICovCi0JbG9uZwlpc3NCYXNlOwkvKiBmaWxlJ3Mgc3RyaW5nIHNwYWNlICovCi0JYmZkX3ZtYQljYlNzOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzcyAqLwotCWxvbmcJaXN5bUJhc2U7CS8qIGJlZ2lubmluZyBvZiBzeW1ib2xzICovCi0JbG9uZwljc3ltOwkJLyogY291bnQgZmlsZSdzIG9mIHN5bWJvbHMgKi8KLQlsb25nCWlsaW5lQmFzZTsJLyogZmlsZSdzIGxpbmUgc3ltYm9scyAqLwotCWxvbmcJY2xpbmU7CQkvKiBjb3VudCBvZiBmaWxlJ3MgbGluZSBzeW1ib2xzICovCi0JbG9uZwlpb3B0QmFzZTsJLyogZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCi0JbG9uZwljb3B0OwkJLyogY291bnQgb2YgZmlsZSdzIG9wdGltaXphdGlvbiBlbnRyaWVzICovCi0JdW5zaWduZWQgc2hvcnQgaXBkRmlyc3Q7Lyogc3RhcnQgb2YgcHJvY2VkdXJlcyBmb3IgdGhpcyBmaWxlICovCi0Jc2hvcnQJY3BkOwkJLyogY291bnQgb2YgcHJvY2VkdXJlcyBmb3IgdGhpcyBmaWxlICovCi0JbG9uZwlpYXV4QmFzZTsJLyogZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0JbG9uZwljYXV4OwkJLyogY291bnQgb2YgZmlsZSdzIGF1eGlsaWFyeSBlbnRyaWVzICovCi0JbG9uZwlyZmRCYXNlOwkvKiBpbmRleCBpbnRvIHRoZSBmaWxlIGluZGlyZWN0IHRhYmxlICovCi0JbG9uZwljcmZkOwkJLyogY291bnQgZmlsZSBpbmRpcmVjdCBlbnRyaWVzICovCi0JdW5zaWduZWQgbGFuZzogNTsJLyogbGFuZ3VhZ2UgZm9yIHRoaXMgZmlsZSAqLwotCXVuc2lnbmVkIGZNZXJnZSA6IDE7CS8qIHdoZXRoZXIgdGhpcyBmaWxlIGNhbiBiZSBtZXJnZWQgKi8KLQl1bnNpZ25lZCBmUmVhZGluIDogMTsJLyogdHJ1ZSBpZiBpdCB3YXMgcmVhZCBpbiAobm90IGp1c3QgY3JlYXRlZCkgKi8KLQl1bnNpZ25lZCBmQmlnZW5kaWFuIDogMTsvKiBpZiBzZXQsIHdhcyBjb21waWxlZCBvbiBiaWcgZW5kaWFuIG1hY2hpbmUgKi8KLQkJCQkvKglhdXgncyB3aWxsIGJlIGluIGNvbXBpbGUgaG9zdCdzIHNleCAqLwotCXVuc2lnbmVkIGdsZXZlbCA6IDI7CS8qIGxldmVsIHRoaXMgZmlsZSB3YXMgY29tcGlsZWQgd2l0aCAqLwotCXVuc2lnbmVkIHJlc2VydmVkIDogMjI7ICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotCWJmZF92bWEJY2JMaW5lT2Zmc2V0OwkvKiBieXRlIG9mZnNldCBmcm9tIGhlYWRlciBmb3IgdGhpcyBmaWxlIGxuJ3MgKi8KLQliZmRfdm1hCWNiTGluZTsJCS8qIHNpemUgb2YgbGluZXMgZm9yIHRoaXMgZmlsZSAqLwotCX0gRkRSLCAqcEZEUjsKLSNkZWZpbmUgY2JGRFIgc2l6ZW9mKEZEUikKLSNkZWZpbmUgZmROaWwgKChwRkRSKTApCi0jZGVmaW5lIGlmZE5pbCAtMQotI2RlZmluZSBpZmRUZW1wIDAKLSNkZWZpbmUgaWxuTmlsIC0xCi0KLQotLyogCi0gKiBQcm9jZWR1cmUgRGVzY3JpcHRvcgotICoKLSAqIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgRVZFUlkgVEVYVCBMQUJFTC4KLSAqIElmIGEgcHJvY2VkdXJlIGlzIGluIGEgZmlsZSB3aXRoIGZ1bGwgc3ltYm9scywgdGhlbiBpc3ltCi0gKiB3aWxsIHBvaW50IHRvIHRoZSBQUk9DIHN5bWJvbHMsIGVsc2UgaXQgd2lsbCBwb2ludCB0byB0aGUKLSAqIGdsb2JhbCBzeW1ib2wgZm9yIHRoZSBsYWJlbC4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCBwZHIgewotCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2Ygc3RhcnQgb2YgcHJvY2VkdXJlICovCi0JbG9uZwlpc3ltOwkJLyogc3RhcnQgb2YgbG9jYWwgc3ltYm9sIGVudHJpZXMgKi8KLQlsb25nCWlsaW5lOwkJLyogc3RhcnQgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JbG9uZwlyZWdtYXNrOwkvKiBzYXZlIHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCXJlZ29mZnNldDsJLyogc2F2ZSByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWlvcHQ7CQkvKiBzdGFydCBvZiBvcHRpbWl6YXRpb24gc3ltYm9sIGVudHJpZXMqLwotCWxvbmcJZnJlZ21hc2s7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgbWFzayAqLwotCWxvbmcJZnJlZ29mZnNldDsJLyogc2F2ZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyYW1lb2Zmc2V0OwkvKiBmcmFtZSBzaXplICovCi0Jc2hvcnQJZnJhbWVyZWc7CS8qIGZyYW1lIHBvaW50ZXIgcmVnaXN0ZXIgKi8KLQlzaG9ydAlwY3JlZzsJCS8qIG9mZnNldCBvciByZWcgb2YgcmV0dXJuIHBjICovCi0JbG9uZwlsbkxvdzsJCS8qIGxvd2VzdCBsaW5lIGluIHRoZSBwcm9jZWR1cmUgKi8KLQlsb25nCWxuSGlnaDsJCS8qIGhpZ2hlc3QgbGluZSBpbiB0aGUgcHJvY2VkdXJlICovCi0JYmZkX3ZtYQljYkxpbmVPZmZzZXQ7CS8qIGJ5dGUgb2Zmc2V0IGZvciB0aGlzIHByb2NlZHVyZSBmcm9tIHRoZSBmZCBiYXNlICovCi0JLyogVGhlc2UgZmllbGRzIGFyZSBuZXcgZm9yIDY0IGJpdCBFQ09GRi4gICovCi0JdW5zaWduZWQgZ3BfcHJvbG9ndWUgOiA4OyAvKiBieXRlIHNpemUgb2YgR1AgcHJvbG9ndWUgKi8KLQl1bnNpZ25lZCBncF91c2VkIDogMTsJLyogdHJ1ZSBpZiB0aGUgcHJvY2VkdXJlIHVzZXMgR1AgKi8KLQl1bnNpZ25lZCByZWdfZnJhbWUgOiAxOwkvKiB0cnVlIGlmIHJlZ2lzdGVyIGZyYW1lIHByb2NlZHVyZSAqLwotCXVuc2lnbmVkIHByb2YgOiAxOwkvKiB0cnVlIGlmIGNvbXBpbGVkIHdpdGggLXBnICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQgOiAxMzsJLyogcmVzZXJ2ZWQ6IG11c3QgYmUgemVybyAqLwotCXVuc2lnbmVkIGxvY2Fsb2ZmIDogODsJLyogb2Zmc2V0IG9mIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHZmcCAqLwotCX0gUERSLCAqcFBEUjsKLSNkZWZpbmUgY2JQRFIgc2l6ZW9mKFBEUikKLSNkZWZpbmUgcGROaWwgKChwUERSKSAwKQotI2RlZmluZSBpcGROaWwJLTEKLQotLyoKLSAqIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHJ1bnRpbWUgcHJvY2VkdXJlIGRlc2NyaXB0b3IgY3JlYXRlZCBieSB0aGUgbG9hZGVyCi0gKiBmb3IgdXNlIGJ5IHRoZSBzdGF0aWMgZXhjZXB0aW9uIHN5c3RlbS4KLSAqLwotLyoKLSAqIElmIDAnZCBvdXQgYmVjYXVzZSBleGNlcHRpb25faW5mbyBjaG9rZXMgVmlzdWFsIEMrKyBhbmQgYmVjYXVzZSB0aGVyZQotICogZG9uJ3Qgc2VlbSB0byBiZSBhbnkgcmVmZXJlbmNlcyB0byB0aGlzIHN0cnVjdHVyZSBlbHNld2hlcmUgaW4gZ2RiLgotICovCi0jaWYgMAotdHlwZWRlZiBzdHJ1Y3QgcnVudGltZV9wZHIgewotCWJmZF92bWEJYWRyOwkJLyogbWVtb3J5IGFkZHJlc3Mgb2Ygc3RhcnQgb2YgcHJvY2VkdXJlICovCi0JbG9uZwlyZWdtYXNrOwkvKiBzYXZlIHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCXJlZ29mZnNldDsJLyogc2F2ZSByZWdpc3RlciBvZmZzZXQgKi8KLQlsb25nCWZyZWdtYXNrOwkvKiBzYXZlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIG1hc2sgKi8KLQlsb25nCWZyZWdvZmZzZXQ7CS8qIHNhdmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgb2Zmc2V0ICovCi0JbG9uZwlmcmFtZW9mZnNldDsJLyogZnJhbWUgc2l6ZSAqLwotCXNob3J0CWZyYW1lcmVnOwkvKiBmcmFtZSBwb2ludGVyIHJlZ2lzdGVyICovCi0Jc2hvcnQJcGNyZWc7CQkvKiBvZmZzZXQgb3IgcmVnIG9mIHJldHVybiBwYyAqLwotCWxvbmcJaXJwc3M7CQkvKiBpbmRleCBpbnRvIHRoZSBydW50aW1lIHN0cmluZyB0YWJsZSAqLwotCWxvbmcJcmVzZXJ2ZWQ7Ci0Jc3RydWN0IGV4Y2VwdGlvbl9pbmZvICpleGNlcHRpb25faW5mbzsvKiBwb2ludGVyIHRvIGV4Y2VwdGlvbiBhcnJheSAqLwotfSBSUERSLCAqcFJQRFI7Ci0jZGVmaW5lIGNiUlBEUiBzaXplb2YoUlBEUikKLSNkZWZpbmUgcnBkTmlsICgocFJQRFIpIDApCi0jZW5kaWYKLQotLyoKLSAqIExpbmUgTnVtYmVycwotICoKLSAqIExpbmUgTnVtYmVycyBhcmUgc2VncmVnYXRlZCBmcm9tIHRoZSBub3JtYWwgc3ltYm9scyBiZWNhdXNlIHRoZXkKLSAqIGFyZSBbMV0gc21hbGxlciAsIFsyXSBhcmUgb2Ygbm8gaW50ZXJlc3QgdG8geW91cgotICogYXZlcmFnZSBsb2FkZXIsIGFuZCBbM10gYXJlIG5ldmVyIG5lZWRlZCBpbiB0aGUgbWlkZGxlIG9mIG5vcm1hbAotICogc2Nhbm5pbmcgYW5kIHRoZXJlZm9yZSBzbG93IHRoaW5ncyBkb3duLgotICoKLSAqIEJ5IGRlZmluaXRpb24sIHRoZSBmaXJzdCBMSU5FUiBmb3IgYW55IGdpdmVuIHByb2NlZHVyZSB3aWxsIGhhdmUKLSAqIHRoZSBmaXJzdCBsaW5lIG9mIGEgcHJvY2VkdXJlIGFuZCByZXByZXNlbnQgdGhlIGZpcnN0IGFkZHJlc3MuCi0gKi8KLQotdHlwZWRlZglsb25nIExJTkVSLCAqcExJTkVSOwotI2RlZmluZSBsaW5lTmlsICgocExJTkVSKTApCi0jZGVmaW5lIGNiTElORVIgc2l6ZW9mKExJTkVSKQotI2RlZmluZSBpbGluZU5pbAktMQotCi0KLQotLyoKLSAqIFRoZSBTeW1ib2wgU3RydWN0dXJlCQkoR0ZXLCB0byB0aG9zZSB3aG8gS25vdyEpCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcJaXNzOwkJLyogaW5kZXggaW50byBTdHJpbmcgU3BhY2Ugb2YgbmFtZSAqLwotCWJmZF92bWEJdmFsdWU7CQkvKiB2YWx1ZSBvZiBzeW1ib2wgKi8KLQl1bnNpZ25lZCBzdCA6IDY7CS8qIHN5bWJvbCB0eXBlICovCi0JdW5zaWduZWQgc2MgIDogNTsJLyogc3RvcmFnZSBjbGFzcyAtIHRleHQsIGRhdGEsIGV0YyAqLwotCXVuc2lnbmVkIHJlc2VydmVkIDogMTsJLyogcmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBpbmRleCA6IDIwOwkvKiBpbmRleCBpbnRvIHN5bS9hdXggdGFibGUgKi8KLQl9IFNZTVIsICpwU1lNUjsKLSNkZWZpbmUgc3ltTmlsICgocFNZTVIpMCkKLSNkZWZpbmUgY2JTWU1SIHNpemVvZihTWU1SKQotI2RlZmluZSBpc3ltTmlsIC0xCi0jZGVmaW5lIGluZGV4TmlsIDB4ZmZmZmYKLSNkZWZpbmUgaXNzTmlsIC0xCi0jZGVmaW5lIGlzc051bGwgMAotCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29udmVydHMgYSBtZW1vcnkgcmVzaWRlbnQgc3RyaW5nIHRvIGFuIGlzcy4KLSAqIFRoaXMgaGFjayBpcyByZWNvZ25pemVkIGluIFNiRklzcywgaW4gc3ltLmMgb2YgdGhlIGRlYnVnZ2VyLgotICovCi0jZGVmaW5lIElzc0ZTYihzYikgKDB4ODAwMDAwMDAgfCAoKHVuc2lnbmVkIGxvbmcpKHNiKSkpCi0KLS8qIEUgWCBUIEUgUiBOIEEgTCAgIFMgWSBNIEIgTyBMICBSIEUgQyBPIFIgRAotICoKLSAqCVNhbWUgYXMgdGhlIFNZTVIgZXhjZXB0IGl0IGNvbnRhaW5zIGZpbGUgY29udGV4dCB0byBkZXRlcm1pbmUgd2hlcmUKLSAqCXRoZSBpbmRleCBpcy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZWNvZmZfZXh0ciB7Ci0JdW5zaWduZWQgam1wdGJsOjE7CS8qIHN5bWJvbCBpcyBhIGp1bXAgdGFibGUgZW50cnkgZm9yIHNobGlicyAqLwotCXVuc2lnbmVkIGNvYm9sX21haW46MTsJLyogc3ltYm9sIGlzIGEgY29ib2wgbWFpbiBwcm9jZWR1cmUgKi8KLQl1bnNpZ25lZCB3ZWFrZXh0OjE7CS8qIHN5bWJvbCBpcyB3ZWFrIGV4dGVybmFsICovCi0JdW5zaWduZWQgcmVzZXJ2ZWQ6MTM7CS8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCi0JaW50CWlmZDsJCS8qIHdoZXJlIHRoZSBpc3MgYW5kIGluZGV4IGZpZWxkcyBwb2ludCBpbnRvICovCi0JU1lNUglhc3ltOwkJLyogc3ltYm9sIGZvciB0aGUgZXh0ZXJuYWwgKi8KLQl9IEVYVFIsICpwRVhUUjsKLSNkZWZpbmUgZXh0TmlsICgocEVYVFIpMCkKLSNkZWZpbmUgY2JFWFRSIHNpemVvZihFWFRSKQotCi0KLS8qIEEgVSBYIEkgTCBMIEEgUiBZICAgVCBZIFAgRQkgSSBOIEYgTyBSIE0gQSBUIEkgTyBOICovCi0KLS8qCi0gKiBUeXBlIEluZm9ybWF0aW9uIFJlY29yZAotICovCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgZkJpdGZpZWxkIDogMTsgLyogc2V0IGlmIGJpdCB3aWR0aCBpcyBzcGVjaWZpZWQgKi8KLQl1bnNpZ25lZCBjb250aW51ZWQgOiAxOyAvKiBpbmRpY2F0ZXMgYWRkaXRpb25hbCBUUSBpbmZvIGluIG5leHQgQVVYICovCi0JdW5zaWduZWQgYnQgIDogNjsJLyogYmFzaWMgdHlwZSAqLwotCXVuc2lnbmVkIHRxNCA6IDQ7Ci0JdW5zaWduZWQgdHE1IDogNDsKLQkvKiAtLS0tIDE2IGJpdCBib3VuZGFyeSAtLS0tICovCi0JdW5zaWduZWQgdHEwIDogNDsKLQl1bnNpZ25lZCB0cTEgOiA0OwkvKiA2IHR5cGUgcXVhbGlmaWVycyAtIHRxUHRyLCBldGMuICovCi0JdW5zaWduZWQgdHEyIDogNDsKLQl1bnNpZ25lZCB0cTMgOiA0OwotCX0gVElSLCAqcFRJUjsKLSNkZWZpbmUgY2JUSVIgc2l6ZW9mKFRJUikKLSNkZWZpbmUgdGlOaWwgKChwVElSKTApCi0jZGVmaW5lIGl0cU1heCA2Ci0KLS8qCi0gKiBSZWxhdGl2ZSBzeW1ib2wgcmVjb3JkCi0gKgotICogSWYgdGhlIHJmZCBmaWVsZCBpcyA0MDk1LCB0aGUgaW5kZXggZmllbGQgaW5kZXhlcyBpbnRvIHRoZSBnbG9iYWwgc3ltYm9sCi0gKgl0YWJsZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQJcmZkIDogMTI7ICAgIC8qIGluZGV4IGludG8gdGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgKi8KLQl1bnNpZ25lZAlpbmRleCA6IDIwOyAvKiBpbmRleCBpbnQgc3ltL2F1eC9pc3MgdGFibGVzICovCi0JfSBSTkRYUiwgKnBSTkRYUjsKLSNkZWZpbmUgY2JSTkRYUiBzaXplb2YoUk5EWFIpCi0jZGVmaW5lIHJuZHhOaWwgKChwUk5EWFIpMCkKLQotLyogZGVuc2UgbnVtYmVycyBvciBzb21ldGltZXMgY2FsbGVkIGJsb2NrIG51bWJlcnMgYXJlIHN0b3JlZCBpbiB0aGlzIHR5cGUsCi0gKglhIHJmZCBvZiAweGZmZmZmZmZmIGlzIGFuIGluZGV4IGludG8gdGhlIGdsb2JhbCB0YWJsZS4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGxvbmcJcmZkOyAgICAvKiBpbmRleCBpbnRvIHRoZSBmaWxlIHRhYmxlICovCi0JdW5zaWduZWQgbG9uZwlpbmRleDsgCS8qIGluZGV4IGludCBzeW0vYXV4L2lzcyB0YWJsZXMgKi8KLQl9IEROUiwgKnBETlI7Ci0jZGVmaW5lIGNiRE5SIHNpemVvZihETlIpCi0jZGVmaW5lIGRuTmlsICgocEROUikwKQotCi0KLQotLyoKLSAqIEF1eGlsbGFyeSBpbmZvcm1hdGlvbiBvY2N1cnMgb25seSBpZiBuZWVkZWQuCi0gKiBJdCBBTFdBWVMgb2NjdXJzIGluIHRoaXMgb3JkZXIgd2hlbiBwcmVzZW50LgotCi0JICAgIGlzeW1NYWMJCXVzZWQgYnkgc3RQcm9jIG9ubHkKLQkgICAgVElSCQkJdHlwZSBpbmZvCi0JICAgIFRJUgkJCWFkZGl0aW9uYWwgVFEgaW5mbyAoaWYgZmlyc3QgVElSIHdhcyBub3QgZW5vdWdoKQotCSAgICBybmR4CQlpZiAoYnQgPT0gYnRTdHJ1Y3QsYnRVbmlvbixidEVudW0sYnRTZXQsYnRSYW5nZSwKLQkJCQkgICAgYnRUeXBlZGVmKToKLQkJCQkgICAgcnN5bS5pbmRleCA9PSBpYXV4IGZvciBidFNldCBvciBidFJhbmdlCi0JCQkJICAgIGVsc2UgcnN5bS5pbmRleCA9PSBpc3ltCi0JICAgIGRpbUxvdwkJYnRSYW5nZSwgYnRTZXQKLQkgICAgZGltTWFjCQlidFJhbmdlLCBidFNldAotCSAgICBybmR4MAkJQXMgbWFueSBhcyB0aGVyZSBhcmUgdHEgYXJyYXlzCi0JICAgIGRpbUxvdzAKLQkgICAgZGltSGlnaDAKLQkgICAgLi4uCi0JICAgIHJuZHhNYXgtMQotCSAgICBkaW1Mb3dNYXgtMQotCSAgICBkaW1IaWdoTWF4LTEKLQkgICAgd2lkdGggaW4gYml0cwlpZiAoYml0IGZpZWxkKSwgd2lkdGggaW4gYml0cy4KLSAqLwotI2RlZmluZSBjQXV4TWF4ICg2ICsgKGlkaW1NYXgqMykpCi0KLS8qIGEgdW5pb24gb2YgYWxsIHBvc3NpYmxlIGluZm8gaW4gdGhlIEFVWCB1bml2ZXJzZSAqLwotdHlwZWRlZiB1bmlvbiB7Ci0JVElSCXRpOwkJLyogdHlwZSBpbmZvcm1hdGlvbiByZWNvcmQgKi8KLQlSTkRYUglybmR4OwkJLyogcmVsYXRpdmUgaW5kZXggaW50byBzeW1ib2wgdGFibGUgKi8KLQlsb25nCWRuTG93OwkJLyogbG93IGRpbWVuc2lvbiAqLwotCWxvbmcJZG5IaWdoOwkJLyogaGlnaCBkaW1lbnNpb24gKi8KLQlsb25nCWlzeW07CQkvKiBzeW1ib2wgdGFibGUgaW5kZXggKGVuZCBvZiBwcm9jKSAqLwotCWxvbmcJaXNzOwkJLyogaW5kZXggaW50byBzdHJpbmcgc3BhY2UgKG5vdCB1c2VkKSAqLwotCWxvbmcJd2lkdGg7CQkvKiB3aWR0aCBmb3Igbm9uLWRlZmF1bHQgc2l6ZWQgc3RydWMgZmllbGRzICovCi0JbG9uZwljb3VudDsJCS8qIGNvdW50IG9mIHJhbmdlcyBmb3IgdmFyaWFudCBhcm0gKi8KLQl9IEFVWFUsICpwQVVYVTsKLSNkZWZpbmUgY2JBVVhVIHNpemVvZihBVVhVKQotI2RlZmluZSBhdXhOaWwgKChwQVVYVSkwKQotI2RlZmluZSBpYXV4TmlsIC0xCi0KLQotLyoKLSAqIE9wdGltaXphdGlvbiBzeW1ib2xzCi0gKgotICogT3B0aW1pemF0aW9uIHN5bWJvbHMgY29udGFpbiBzb21lIG92ZXJsYXAgaW5mb3JtYXRpb24gd2l0aCB0aGUgbm9ybWFsCi0gKiBzeW1ib2wgdGFibGUuIEluIHBhcnRpY3VsYXIsIHRoZSBwcm9jIGluZm9ybWF0aW9uCi0gKiBpcyBzb21ld2hhdCByZWR1bmRhbnQgYnV0IG5lY2Vzc2FyeSB0byBlYXNpbHkgZmluZCB0aGUgb3RoZXIgaW5mb3JtYXRpb24KLSAqIHByZXNlbnQuIAotICoKLSAqIEFsbCBvZiB0aGUgb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGFzdCBvdFByb2MKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgb3Q6IDg7CQkvKiBvcHRpbWl6YXRpb24gdHlwZSAqLwotCXVuc2lnbmVkIHZhbHVlOiAyNDsJLyogYWRkcmVzcyB3aGVyZSB3ZSBhcmUgbW92aW5nIGl0IHRvICovCi0JUk5EWFIJcm5keDsJCS8qIHBvaW50cyB0byBhIHN5bWJvbCBvciBvcHQgZW50cnkgKi8KLQl1bnNpZ25lZCBsb25nCW9mZnNldDsJLyogcmVsYXRpdmUgb2Zmc2V0IHRoaXMgb2NjdXJlZCAqLwotCX0gT1BUUiwgKnBPUFRSOwotI2RlZmluZSBvcHROaWwJKChwT1BUUikgMCkKLSNkZWZpbmUgY2JPUFRSIHNpemVvZihPUFRSKQotI2RlZmluZSBpb3B0TmlsIC0xCi0KLS8qCi0gKiBGaWxlIEluZGlyZWN0Ci0gKgotICogV2hlbiBhIHN5bWJvbCBpcyByZWZlcmVuY2VkIGFjcm9zcyBmaWxlcyB0aGUgZm9sbG93aW5nIHByb2NlZHVyZSBpcyB1c2VkOgotICoJMSkgdXNlIHRoZSBmaWxlIGluZGV4IHRvIGdldCB0aGUgRmlsZSBpbmRpcmVjdCBlbnRyeS4KLSAqCTIpIHVzZSB0aGUgZmlsZSBpbmRpcmVjdCBlbnRyeSB0byBnZXQgdGhlIEZpbGUgZGVzY3JpcHRvci4KLSAqCTMpIGFkZCB0aGUgc3ltIGluZGV4IHRvIHRoZSBiYXNlIG9mIHRoYXQgZmlsZSdzIHN5bSB0YWJsZQotICoKLSAqLwotCi10eXBlZGVmIGxvbmcgUkZEVCwgKnBSRkRUOwotI2RlZmluZSBjYlJGRFQgc2l6ZW9mKFJGRFQpCi0jZGVmaW5lIHJmZE5pbAktMQotCi0vKgotICogVGhlIGZpbGUgaW5kaXJlY3QgdGFibGUgaW4gdGhlIG1pcHMgbG9hZGVyIGlzIGtub3duIGFzIGFuIGFycmF5IG9mIEZJVHMuCi0gKiBUaGlzIGlzIGRvbmUgdG8ga2VlcCB0aGUgY29kZSBpbiB0aGUgbG9hZGVyIHJlYWRhYmxlIGluIHRoZSBhcmVhIHdoZXJlCi0gKiB0aGVzZSB0YWJsZXMgYXJlIG1lcmdlZC4gIE5vdGUgdGhpcyBpcyBvbmx5IGEgbmFtZSBjaGFuZ2UuCi0gKi8KLXR5cGVkZWYgbG9uZyBGSVQsICpwRklUOwotI2RlZmluZSBjYkZJVAlzaXplb2YoRklUKQotI2RlZmluZSBpZmlOaWwJLTEKLSNkZWZpbmUgZmlOaWwJKChwRklUKSAwKQotCi0jaWZkZWYgX0xBTkdVQUdFX1BBU0NBTAotI2RlZmluZSBpZmROaWwgLTEKLSNkZWZpbmUgaWxuTmlsIC0xCi0jZGVmaW5lIGlwZE5pbCAtMQotI2RlZmluZSBpbGluZU5pbCAtMQotI2RlZmluZSBpc3ltTmlsIC0xCi0jZGVmaW5lIGluZGV4TmlsIDE2I2ZmZmZmCi0jZGVmaW5lIGlzc05pbCAtMQotI2RlZmluZSBpc3NOdWxsIDAKLSNkZWZpbmUgaXRxTWF4IDYKLSNkZWZpbmUgaWF1eE5pbCAtMQotI2RlZmluZSBpb3B0TmlsIC0xCi0jZGVmaW5lIHJmZE5pbCAtMQotI2RlZmluZSBpZmlOaWwgLTEKLSNlbmRpZgkvKiBfTEFOR1VBR0VfUEFTQ0FMICovCi0KLQotLyogRGVuc2UgbnVtYmVycwotICoKLSAqIFJhdGhlciB0aGFuIHVzZSBmaWxlIGluZGV4LCBzeW1ib2wgaW5kZXggcGFpcnMgdG8gcmVwcmVzZW50IHN5bWJvbHMKLSAqCWFuZCBnbG9iYWxzLCB3ZSB1c2UgZGVuc2UgbnVtYmVyIHNvIHRoYXQgdGhleSBjYW4gYmUgZWFzaWx5IGVtYmVkZWQKLSAqCWluIGludGVybWVkaWF0ZSBjb2RlIGFuZCB0aGUgcHJvZ3JhbXMgdGhhdCBwcm9jZXNzIHRoZW0gY2FuCi0gKgl1c2UgZGlyZWN0IGFjY2VzcyB0YWJscyBpbnN0ZWFkIG9mIGhhc2ggdGFibGUgKHdoaWNoIHdvdWxkIGJlCi0gKgluZWNlc2FyeSBvdGhlcndpc2UgYmVjYXVzZSBvZiB0aGUgc3BhcnNlIG5hbWUgc3BhY2UgY2F1c2VkIGJ5Ci0gKglmaWxlIGluZGV4LCBzeW1ib2wgaW5kZXggcGFpcnMuIERlbnNlIG51bWJlciBhcmUgcmVwcmVzZW50ZWQKLSAqCWJ5IFJORFhScy4KLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyB0YWJsZSBkZWZpbmVzIHRoZSBtZWFuaW5nIG9mIGVhY2ggU1lNIGZpZWxkIGFzCi0gKiBhIGZ1bmN0aW9uIG9mIHRoZSAic3QiLiAoc2NEL0IgPT0gc2NEYXRhIE9SIHNjQnNzKQotICoKLSAqIE5vdGU6IHRoZSB2YWx1ZSAiaXN5bU1hYyIgaXMgdXNlZCBieSBzeW1ib2xzIHRoYXQgaGF2ZSB0aGUgY29uY2VwdAotICogb2YgZW5jbG9zaW5nIGEgYmxvY2sgb2YgcmVsYXRlZCBpbmZvcm1hdGlvbi4JIFRoaXMgdmFsdWUgaXMgdGhlCi0gKiBpc3ltIG9mIHRoZSBmaXJzdCBzeW1ib2wgQUZURVIgdGhlIGVuZCBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkKLSAqIHN5bWJvbC4gRm9yIGV4YW1wbGUgaWYgYSBwcm9jZWR1cmUgd2FzIGF0IGlzeW09PTkwIGFuZCBoYWQgYW4KLSAqIGlzeW1NYWM9PTE1NSwgdGhlIGFzc29jaWF0ZWQgZW5kIHdvdWxkIGJlIGF0IGlzeW09PTE1NCwgYW5kIHRoZQotICogc3ltYm9sIGF0IDE1NSB3b3VsZCBwcm9iYWJseSAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5KSBiZSB0aGUKLSAqIHN5bWJvbCBmb3IgdGhlIG5leHQgcHJvY2VkdXJlLiAgVGhpcyBhbGxvd3MgcmFwaWQgc2tpcHBpbmcgb3ZlcgotICogaW50ZXJuYWwgaW5mb3JtYXRpb24gb2YgdmFyaW91cyBzb3J0cy4gInN0RW5kInMgQUxXQVlTIGhhdmUgdGhlCi0gKiBpc3ltIG9mIHRoZSBwcmltYXJ5IHN5bWJvbCB0aGF0IHN0YXJ0ZWQgdGhlIGJsb2NrLgotICogCi0KLVNUCQlTQwlWQUxVRQkJSU5ERVgKLS0tLS0tLS0tCS0tLS0tLQktLS0tLS0tLQktLS0tLS0KLXN0RmlsZQkJc2NUZXh0CWFkZHJlc3MJCWlzeW1NYWMKLXN0TGFiZWwJCXNjVGV4dAlhZGRyZXNzCQktLS0KLXN0R2xvYmFsCXNjRC9CCWFkZHJlc3MJCWlhdXgKLXN0U3RhdGljCXNjRC9CCWFkZHJlc3MJCWlhdXgKLXN0UGFyYW0JCXNjQWJzCW9mZnNldAkJaWF1eAotc3RMb2NhbAkJc2NBYnMJb2Zmc2V0CQlpYXV4Ci1zdFByb2MJCXNjVGV4dAlhZGRyZXNzCQlpYXV4CShpc3ltTWFjIGlzIGZpcnN0IEFVWCkKLXN0U3RhdGljUHJvYwlzY1RleHQJYWRkcmVzcwkJaWF1eAkoaXN5bU1hYyBpcyBmaXJzdCBBVVgpCi0KLXN0TWVtYmVyCXNjTmlsCW9yZGluYWwJCS0tLQkoaWYgbWVtYmVyIG9mIGVudW0pCi0JKG1pcHNyZWFkIHRoaW5rcyB0aGUgY2FzZSBiZWxvdyBoYXMgYSBiaXQsIG5vdCBieXRlLCBvZmZzZXQuKQotc3RNZW1iZXIJc2NOaWwJYnl0ZSBvZmZzZXQJaWF1eAkoaWYgbWVtYmVyIG9mIHN0cnVjdC91bmlvbikKLXN0TWVtYmVyCXNjQml0cwliaXQgb2Zmc2V0CWlhdXgJKGJpdCBmaWVsZCBzcGVjKQotCi1zdEJsb2NrCQlzY1RleHQJYWRkcmVzcwkJaXN5bU1hYyAodGV4dCBibG9jaykKLQkodGhlIGNvZGUgc2VlbXMgdG8gdGhpbmsgdGhhdCByYXRoZXIgdGhhbiBzY05pbCwgd2Ugc2VlIHNjSW5mbyBmb3IKLQkgdGhlIHR3byBjYXNlcyBiZWxvdy4pCi1zdEJsb2NrCQlzY05pbAljYgkJaXN5bU1hYyAoc3RydWN0L3VuaW9uIG1lbWJlciBkZWZpbmUpCi1zdEJsb2NrCQlzY05pbAljTWVtYmVycwlpc3ltTWFjIChlbnVtIG1lbWJlciBkZWZpbmUpCi0KLQkoTmV3IHR5cGVzIGFkZGVkIGJ5IFNHSSB0byBzaW1wbGlmeSB0aGluZ3M6KQotc3RTdHJ1Y3QJc2NJbmZvCWNiCQlpc3ltTWFjIChzdHJ1Y3QgdHlwZSBkZWZpbmUpCi1zdFVuaW9uCQlzY0luZm8JY2IJCWlzeW1NYWMgKHVuaW9uICB0eXBlIGRlZmluZSkKLXN0RW51bQkJc2NJbmZvCWNNZW1iZXJzCWlzeW1NYWMgKGVudW0gICB0eXBlIGRlZmluZSkKLQotc3RFbmQJCXNjVGV4dAlhZGRyZXNzCQlpc3ltU3RhcnQKLXN0RW5kCQlzY05pbAktLS0tLS0tCQlpc3ltU3RhcnQgKHN0cnVjdC91bmlvbi9lbnVtKQotCi1zdFR5cGVkZWYJc2NOaWwJLS0tLS0tLQkJaWF1eAotc3RSZWdSZWxvYwlzYz8/Pwl2YWx1ZQkJb2xkIHJlZ2lzdGVyIG51bWJlcgotc3RGb3J3YXJkCXNjPz8/CW5ldyBhZGRyZXNzCWlzeW0gdG8gb3JpZ2luYWwgc3ltYm9sCi0KLXN0Q29uc3RhbnQJc2NJbmZvCXZhbHVlCQktLS0gKHNjYWxhcikKLXN0Q29uc3RhbnQJc2NJbmZvCWlzcwkJLS0tIChjb21wbGV4LCBlLmcuIHN0cmluZykKLQotICoKLSAqLwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvc3ltY29uc3QuaCBiL2luY2x1ZGUvY29mZi9zeW1jb25zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBlZWYyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi9zeW1jb25zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBvZiBjb25zdGFudHMgZm9yIGludGVybmFsIGZvcm1hdCBvZiBNSVBTIEVDT0ZGIHN5bWJvbHMuCi0gICBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IE1JUFMgQ29tcHV0ZXIgU3lzdGVtcyBhbmQgVGhpcmQgRXllIFNvZnR3YXJlLgotICAgQ2hhbmdlcyBjb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydCBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uCi0KLSAgIFRoaXMgZmlsZSBpcyBqdXN0IGFnZ3JlZ2F0ZWQgd2l0aCB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSBHTlUKLSAgIHJlbGVhc2U7IGl0IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgR0FTLCBHREIsIG9yIG90aGVyIEdOVQotICAgcHJvZ3JhbXMuICAqLwotCi0vKgotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICogfCBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTEsIDE5OTAgTUlQUyBDb21wdXRlciBTeXN0ZW1zLCBJbmMufAotICogfCBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlICAgfAotICogfCByaWdodHMgdG8gYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzICAgICAgfAotICogfCBtYWludGFpbmVkIGluIHRoZSBjb3B5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICovCi0KLS8qIChDKSBDb3B5cmlnaHQgMTk4NCBieSBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBUaGlyZCBFeWUgU29mdHdhcmUsIEluYy4gZ3JhbnRzIHJlcHJvZHVjdGlvbiBhbmQgdXNlIHJpZ2h0cyB0bwotICogYWxsIHBhcnRpZXMsIFBST1ZJREVEIHRoYXQgdGhpcyBjb21tZW50IGlzIG1haW50YWluZWQgaW4gdGhlIGNvcHkuCi0gKgotICogVGhpcmQgRXllIG1ha2VzIG5vIGNsYWltcyBhYm91dCB0aGUgYXBwbGljYWJpbGl0eSBvZiB0aGlzCi0gKiBzeW1ib2wgdGFibGUgdG8gYSBwYXJ0aWN1bGFyIHVzZS4KLSAqLwotCi0vKiBnbGV2ZWxzIGZvciBmaWVsZCBpbiBGRFIgKi8KLSNkZWZpbmUgR0xFVkVMXzAJMgotI2RlZmluZSBHTEVWRUxfMQkxCi0jZGVmaW5lIEdMRVZFTF8yCTAJLyogZm9yIHVwd2FyZCBjb21wYXQgcmVhc29ucy4gKi8KLSNkZWZpbmUgR0xFVkVMXzMJMwotCi0vKiBtYWdpYyBudW1iZXIgZm8gc3ltaGVhZGVyICovCi0jZGVmaW5lIG1hZ2ljU3ltCTB4NzAwOQotLyogVGhlIEFscGhhIHVzZXMgdGhpcyB2YWx1ZSBpbnN0ZWFkLCBmb3Igc29tZSByZWFzb24uICAqLwotI2RlZmluZSBtYWdpY1N5bTIJMHgxOTkyCi0KLS8qIExhbmd1YWdlIGNvZGVzICovCi0jZGVmaW5lIGxhbmdDCQkwCQotI2RlZmluZSBsYW5nUGFzY2FsCTEKLSNkZWZpbmUgbGFuZ0ZvcnRyYW4JMgotI2RlZmluZQlsYW5nQXNzZW1ibGVyCTMJLyogb25lIEFzc2VtYmxleSBpbnN0IG1pZ2h0IG1hcCB0byBtYW55IG1hY2ggKi8KLSNkZWZpbmUgbGFuZ01hY2hpbmUJNAotI2RlZmluZSBsYW5nTmlsCQk1Ci0jZGVmaW5lIGxhbmdBZGEJCTYKLSNkZWZpbmUgbGFuZ1BsMQkJNwotI2RlZmluZSBsYW5nQ29ib2wJOAotI2RlZmluZSBsYW5nU3RkYwk5CS8qIEZJWE1FOiBDb2xsaWRlcyB3aXRoIFNHSSBsYW5nQ3BsdXNwbHVzICovCi0jZGVmaW5lIGxhbmdDcGx1c3BsdXMJOQkvKiBGSVhNRTogQ29sbGlkZXMgd2l0aCBsYW5nU3RkYyAqLwotI2RlZmluZSBsYW5nQ3BsdXNwbHVzVjIJMTAJLyogU0dJIGFkZGl0aW9uICovCi0jZGVmaW5lIGxhbmdNYXgJCTExCS8qIG1heGltdW4gYWxsb3dlZCAzMiAtLSA1IGJpdHMgKi8KLQotLyogVGhlIGZvbGxvd2luZyBhcmUgdmFsdWUgZGVmaW5pdGlvbnMgZm9yIHRoZSBmaWVsZHMgaW4gdGhlIFNZTVIgKi8KLQotLyoKLSAqIFN0b3JhZ2UgQ2xhc3NlcwotICovCi0KLSNkZWZpbmUgc2NOaWwJCTAKLSNkZWZpbmUgc2NUZXh0CQkxCS8qIHRleHQgc3ltYm9sICovCi0jZGVmaW5lIHNjRGF0YQkJMgkvKiBpbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLwotI2RlZmluZSBzY0JzcwkJMwkvKiB1bi1pbml0aWFsaXplZCBkYXRhIHN5bWJvbCAqLwotI2RlZmluZSBzY1JlZ2lzdGVyCTQJLyogdmFsdWUgb2Ygc3ltYm9sIGlzIHJlZ2lzdGVyIG51bWJlciAqLwotI2RlZmluZSBzY0FicwkJNQkvKiB2YWx1ZSBvZiBzeW1ib2wgaXMgYWJzb2x1dGUgKi8KLSNkZWZpbmUgc2NVbmRlZmluZWQJNgkvKiB3aG8ga25vd3M/ICovCi0jZGVmaW5lIHNjQ2RiTG9jYWwJNwkvKiB2YXJpYWJsZSdzIHZhbHVlIGlzIElOIHNlLT52YS4/PyAqLwotI2RlZmluZSBzY0JpdHMJCTgJLyogdGhpcyBpcyBhIGJpdCBmaWVsZCAqLwotI2RlZmluZSBzY0NkYlN5c3RlbQk5CS8qIHZhcmlhYmxlJ3MgdmFsdWUgaXMgSU4gQ0RCJ3MgYWRkcmVzcyBzcGFjZSAqLwotI2RlZmluZSBzY0RieAkJOQkvKiBvdmVybGFwIGRieCBpbnRlcm5hbCB1c2UgKi8KLSNkZWZpbmUgc2NSZWdJbWFnZQkxMAkvKiByZWdpc3RlciB2YWx1ZSBzYXZlZCBvbiBzdGFjayAqLwotI2RlZmluZSBzY0luZm8JCTExCS8qIHN5bWJvbCBjb250YWlucyBkZWJ1Z2dlciBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBzY1VzZXJTdHJ1Y3QJMTIJLyogYWRkcmVzcyBpbiBzdHJ1Y3QgdXNlciBmb3IgY3VycmVudCBwcm9jZXNzICovCi0jZGVmaW5lIHNjU0RhdGEJCTEzCS8qIGxvYWQgdGltZSBvbmx5IHNtYWxsIGRhdGEgKi8KLSNkZWZpbmUgc2NTQnNzCQkxNAkvKiBsb2FkIHRpbWUgb25seSBzbWFsbCBjb21tb24gKi8KLSNkZWZpbmUgc2NSRGF0YQkJMTUJLyogbG9hZCB0aW1lIG9ubHkgcmVhZCBvbmx5IGRhdGEgKi8KLSNkZWZpbmUgc2NWYXIJCTE2CS8qIFZhciBwYXJhbWV0ZXIgKGZvcnRyYW4scGFzY2FsKSAqLwotI2RlZmluZSBzY0NvbW1vbgkxNwkvKiBjb21tb24gdmFyaWFibGUgKi8KLSNkZWZpbmUgc2NTQ29tbW9uCTE4CS8qIHNtYWxsIGNvbW1vbiAqLwotI2RlZmluZSBzY1ZhclJlZ2lzdGVyCTE5CS8qIFZhciBwYXJhbWV0ZXIgaW4gYSByZWdpc3RlciAqLwotI2RlZmluZSBzY1ZhcmlhbnQJMjAJLyogVmFyaWFudCByZWNvcmQgKi8KLSNkZWZpbmUgc2NTVW5kZWZpbmVkCTIxCS8qIHNtYWxsIHVuZGVmaW5lZChleHRlcm5hbCkgZGF0YSAqLwotI2RlZmluZSBzY0luaXQJCTIyCS8qIC5pbml0IHNlY3Rpb24gc3ltYm9sICovCi0jZGVmaW5lIHNjQmFzZWRWYXIJMjMJLyogRm9ydHJhbiBvciBQTC8xIHB0ciBiYXNlZCB2YXIgKi8gCi0jZGVmaW5lIHNjWERhdGEgICAgICAgICAyNCAgICAgIC8qIGV4Y2VwdGlvbiBoYW5kbGluZyBkYXRhICovCi0jZGVmaW5lIHNjUERhdGEgICAgICAgICAyNSAgICAgIC8qIFByb2NlZHVyZSBzZWN0aW9uICovCi0jZGVmaW5lIHNjRmluaSAgICAgICAgICAyNiAgICAgIC8qIC5maW5pIHNlY3Rpb24gKi8KLSNkZWZpbmUgc2NSQ29uc3QJMjcJLyogLnJjb25zdCBzZWN0aW9uICovCi0jZGVmaW5lIHNjTWF4CQkzMgotCi0KLS8qCi0gKiAgIFN5bWJvbCBUeXBlcwotICovCi0KLSNkZWZpbmUgc3ROaWwJCTAJLyogTnV0aGluJyBzcGVjaWFsICovCi0jZGVmaW5lIHN0R2xvYmFsCTEJLyogZXh0ZXJuYWwgc3ltYm9sICovCi0jZGVmaW5lIHN0U3RhdGljCTIJLyogc3RhdGljICovCi0jZGVmaW5lIHN0UGFyYW0JCTMJLyogcHJvY2VkdXJlIGFyZ3VtZW50ICovCi0jZGVmaW5lIHN0TG9jYWwJCTQJLyogbG9jYWwgdmFyaWFibGUgKi8KLSNkZWZpbmUgc3RMYWJlbAkJNQkvKiBsYWJlbCAqLwotI2RlZmluZSBzdFByb2MJCTYJLyogICAgICIgICAgICAiCSBQcm9jZWR1cmUgKi8KLSNkZWZpbmUgc3RCbG9jawkJNwkvKiBiZWdpbm5uaW5nIG9mIGJsb2NrICovCi0jZGVmaW5lIHN0RW5kCQk4CS8qIGVuZCAob2YgYW55dGhpbmcpICovCi0jZGVmaW5lIHN0TWVtYmVyCTkJLyogbWVtYmVyIChvZiBhbnl0aGluZwktIHN0cnVjdC91bmlvbi9lbnVtICovCi0jZGVmaW5lIHN0VHlwZWRlZgkxMAkvKiB0eXBlIGRlZmluaXRpb24gKi8KLSNkZWZpbmUgc3RGaWxlCQkxMQkvKiBmaWxlIG5hbWUgKi8KLSNkZWZpbmUgc3RSZWdSZWxvYwkxMgkvKiByZWdpc3RlciByZWxvY2F0aW9uICovCi0jZGVmaW5lIHN0Rm9yd2FyZAkxMwkvKiBmb3J3YXJkaW5nIGFkZHJlc3MgKi8KLSNkZWZpbmUgc3RTdGF0aWNQcm9jCTE0CS8qIGxvYWQgdGltZSBvbmx5IHN0YXRpYyBwcm9jcyAqLwotI2RlZmluZSBzdENvbnN0YW50CTE1CS8qIGNvbnN0ICovCi0jZGVmaW5lIHN0U3RhUGFyYW0JMTYJLyogRm9ydHJhbiBzdGF0aWMgcGFyYW1ldGVycyAqLwotICAgIC8qIFRoZXNlIG5ldyBzeW1ib2wgdHlwZXMgaGF2ZSBiZWVuIHJlY2VudGx5IGFkZGVkIHRvIFNHSSBtYWNoaW5lcy4gKi8KLSNkZWZpbmUgc3RTdHJ1Y3QJMjYJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGEgc3RydWN0IHR5cGUgKi8KLSNkZWZpbmUgc3RVbmlvbgkJMjcJLyogQmVnaW5uaW5nIG9mIGJsb2NrIGRlZmluaW5nIGEgdW5pb24gdHlwZSAqLwotI2RlZmluZSBzdEVudW0JCTI4CS8qIEJlZ2lubmluZyBvZiBibG9jayBkZWZpbmluZyBhbiBlbnVtIHR5cGUgKi8KLSNkZWZpbmUgc3RJbmRpcmVjdAkzNAkvKiBJbmRpcmVjdCB0eXBlIHNwZWNpZmljYXRpb24gKi8KLSAgICAvKiBQc2V1ZG8tc3ltYm9scyAtIGludGVybmFsIHRvIGRlYnVnZ2VyICovCi0jZGVmaW5lIHN0U3RyCQk2MAkvKiBzdHJpbmcgKi8KLSNkZWZpbmUgc3ROdW1iZXIJNjEJLyogcHVyZSBudW1iZXIgKGllLiA0IE5PUiAyKzIpICovCi0jZGVmaW5lIHN0RXhwcgkJNjIJLyogMisyIHZzLiA0ICovCi0jZGVmaW5lIHN0VHlwZQkJNjMJLyogcG9zdC1jb2Vyc2lvbiBTRVIgKi8KLSNkZWZpbmUgc3RNYXgJCTY0Ci0KLS8qIGRlZmluaXRpb25zIGZvciBmaWVsZHMgaW4gVElSICovCi0KLS8qIHR5cGUgcXVhbGlmaWVycyBmb3IgdGkudHEwIC0+IHRpLihpdHFNYXgtMSkgKi8KLSNkZWZpbmUgdHFOaWwJMAkvKiBidCBpcyB3aGF0IHlvdSBzZWUgKi8KLSNkZWZpbmUgdHFQdHIJMQkvKiBwb2ludGVyICovCi0jZGVmaW5lIHRxUHJvYwkyCS8qIHByb2NlZHVyZSAqLwotI2RlZmluZSB0cUFycmF5IDMJLyogZHVoICovCi0jZGVmaW5lIHRxRmFyCTQJLyogbG9uZ2VyIGFkZHJlc3NpbmcgLSA4MDg2LzggbGFuZCAqLwotI2RlZmluZSB0cVZvbAk1CS8qIHZvbGF0aWxlICovCi0jZGVmaW5lIHRxQ29uc3QgNgkvKiBjb25zdCAqLwotI2RlZmluZSB0cU1heAk4Ci0KLS8qIGJhc2ljIHR5cGVzIGFzIHNlZW4gaW4gdGkuYnQgKi8KLSNkZWZpbmUgYnROaWwJCTAJLyogdW5kZWZpbmVkIChhbHNvLCBlbnVtIG1lbWJlcnMpICovCi0jZGVmaW5lIGJ0QWRyCQkxCS8qIGFkZHJlc3MgLSBpbnRlZ2VyIHNhbWUgc2l6ZSBhcyBwb2ludGVyICovCi0jZGVmaW5lIGJ0Q2hhcgkJMgkvKiBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgYnRVQ2hhcgkJMwkvKiB1bnNpZ25lZCBjaGFyYWN0ZXIgKi8KLSNkZWZpbmUgYnRTaG9ydAkJNAkvKiBzaG9ydCAqLwotI2RlZmluZSBidFVTaG9ydAk1CS8qIHVuc2lnbmVkIHNob3J0ICovCi0jZGVmaW5lIGJ0SW50CQk2CS8qIGludCAqLwotI2RlZmluZSBidFVJbnQJCTcJLyogdW5zaWduZWQgaW50ICovCi0jZGVmaW5lIGJ0TG9uZwkJOAkvKiBsb25nICovCi0jZGVmaW5lIGJ0VUxvbmcJCTkJLyogdW5zaWduZWQgbG9uZyAqLwotI2RlZmluZSBidEZsb2F0CQkxMAkvKiBmbG9hdCAocmVhbCkgKi8KLSNkZWZpbmUgYnREb3VibGUJMTEJLyogRG91YmxlIChyZWFsKSAqLwotI2RlZmluZSBidFN0cnVjdAkxMgkvKiBTdHJ1Y3R1cmUgKFJlY29yZCkgKi8KLSNkZWZpbmUgYnRVbmlvbgkJMTMJLyogVW5pb24gKHZhcmlhbnQpICovCi0jZGVmaW5lIGJ0RW51bQkJMTQJLyogRW51bWVyYXRlZCAqLwotI2RlZmluZSBidFR5cGVkZWYJMTUJLyogZGVmaW5lZCB2aWEgYSB0eXBlZGVmLCBpc3ltUmVmIHBvaW50cyAqLwotI2RlZmluZSBidFJhbmdlCQkxNgkvKiBzdWJyYW5nZSBvZiBpbnQgKi8KLSNkZWZpbmUgYnRTZXQJCTE3CS8qIHBhc2NhbCBzZXRzICovCi0jZGVmaW5lIGJ0Q29tcGxleAkxOAkvKiBmb3J0cmFuIGNvbXBsZXggKi8KLSNkZWZpbmUgYnREQ29tcGxleAkxOQkvKiBmb3J0cmFuIGRvdWJsZSBjb21wbGV4ICovCi0jZGVmaW5lIGJ0SW5kaXJlY3QJMjAJLyogZm9yd2FyZCBvciB1bm5hbWVkIHR5cGVkZWYgKi8KLSNkZWZpbmUgYnRGaXhlZERlYwkyMQkvKiBGaXhlZCBEZWNpbWFsICovCi0jZGVmaW5lIGJ0RmxvYXREZWMJMjIJLyogRmxvYXQgRGVjaW1hbCAqLwotI2RlZmluZSBidFN0cmluZwkyMwkvKiBWYXJ5aW5nIExlbmd0aCBDaGFyYWN0ZXIgU3RyaW5nICovCi0jZGVmaW5lIGJ0Qml0CQkyNAkvKiBBbGlnbmVkIEJpdCBTdHJpbmcgKi8KLSNkZWZpbmUgYnRQaWN0dXJlCTI1CS8qIFBpY3R1cmUgKi8KLSNkZWZpbmUgYnRWb2lkCQkyNgkvKiB2b2lkICovCi0jZGVmaW5lIGJ0TG9uZ0xvbmcJMjcJLyogbG9uZyBsb25nICovCi0jZGVmaW5lIGJ0VUxvbmdMb25nCTI4CS8qIHVuc2lnbmVkIGxvbmcgbG9uZyAqLwotI2RlZmluZSBidE1heAkJNjQKLQotI2lmIChfTUZHID09IF9NSVBTKQotLyogb3B0aW1pemF0aW9uIHR5cGUgY29kZXMgKi8KLSNkZWZpbmUgb3ROaWwJCTAKLSNkZWZpbmUgb3RSZWcJCTEJLyogbW92ZSB2YXIgdG8gcmVnICovCi0jZGVmaW5lIG90QmxvY2sJCTIJLyogYmVnaW4gYmFzaWMgYmxvY2sgKi8KLSNkZWZpbmUJb3RQcm9jCQkzCS8qIHByb2NlZHVyZSAqLwotI2RlZmluZSBvdElubGluZQk0CS8qIGlubGluZSBwcm9jZWR1cmUgKi8KLSNkZWZpbmUgb3RFbmQJCTUJLyogd2hhdGV2ZXIgeW91IHN0YXJ0ZWQgKi8KLSNkZWZpbmUgb3RNYXgJCTYJLyogS0VFUCBVUCBUTyBEQVRFICovCi0jZW5kaWYgLyogKF9NRkcgPT0gX01JUFMpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvdGljMzAuaCBiL2luY2x1ZGUvY29mZi90aWMzMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIwMjZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi90aWMzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgVE1TMzIwQzNYICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLSNkZWZpbmUJVElDMzBNQUdJQwkweEMwMDAKLQotI2RlZmluZSBUSUMzMEJBRE1BRyh4KSAoKCh4KS5mX21hZ2ljIT1USUMzME1BR0lDKSkKLQotI2RlZmluZQlGSUxIRFIJc3RydWN0IGV4dGVybmFsX2ZpbGVoZHIKLSNkZWZpbmUJRklMSFNaCTIwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogQU9VVCAiT1BUSU9OQUwgSEVBREVSIiAqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBjaGFyIAltYWdpY1syXTsJCS8qIHR5cGUgb2YgZmlsZQkJCQkqLwotICBjaGFyCXZzdGFtcFsyXTsJCS8qIHZlcnNpb24gc3RhbXAJCQkqLwotICBjaGFyCXRzaXplWzRdOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIGNoYXIJZHNpemVbNF07CQkvKiBpbml0aWFsaXplZCBkYXRhICIgICIJCSovCi0gIGNoYXIJYnNpemVbNF07CQkvKiB1bmluaXRpYWxpemVkIGRhdGEgIiAgICIJCSovCi0gIGNoYXIJZW50cnlbNF07CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgY2hhciAJdGV4dF9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgY2hhciAJZGF0YV9zdGFydFs0XTsJCS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLX0KLUFPVVRIRFI7Ci0KLQotI2RlZmluZSBBT1VUSERSU1ogMjgKLSNkZWZpbmUgQU9VVFNaIDI4Ci0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNFQ1RJT04gSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RydWN0IGV4dGVybmFsX3NjbmhkciB7Ci0JY2hhcgkJc19uYW1lWzhdOwkvKiBzZWN0aW9uIG5hbWUJCQkqLwotCWNoYXIJCXNfcGFkZHJbNF07CS8qIHBoeXNpY2FsIGFkZHJlc3MsIGFsaWFzZWQgc19ubGliICovCi0JY2hhcgkJc192YWRkcls0XTsJLyogdmlydHVhbCBhZGRyZXNzCQkqLwotCWNoYXIJCXNfc2l6ZVs0XTsJLyogc2VjdGlvbiBzaXplCQkJKi8KLQljaGFyCQlzX3NjbnB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmF3IGRhdGEgZm9yIHNlY3Rpb24gKi8KLQljaGFyCQlzX3JlbHB0cls0XTsJLyogZmlsZSBwdHIgdG8gcmVsb2NhdGlvbgkqLwotCWNoYXIJCXNfbG5ub3B0cls0XTsJLyogZmlsZSBwdHIgdG8gbGluZSBudW1iZXJzCSovCi0JY2hhcgkJc19ucmVsb2NbMl07CS8qIG51bWJlciBvZiByZWxvY2F0aW9uIGVudHJpZXMJKi8KLQljaGFyCQlzX25sbm5vWzJdOwkvKiBudW1iZXIgb2YgbGluZSBudW1iZXIgZW50cmllcyovCi0JY2hhcgkJc19mbGFnc1s0XTsJLyogZmxhZ3MJCQkqLwotfTsKLQotLyoKLSAqIG5hbWVzIG9mICJzcGVjaWFsIiBzZWN0aW9ucwotICovCi0jZGVmaW5lIF9URVhUCSIudGV4dCIKLSNkZWZpbmUgX0RBVEEJIi5kYXRhIgotI2RlZmluZSBfQlNTCSIuYnNzIgotCi0KLSNkZWZpbmUJU0NOSERSCXN0cnVjdCBleHRlcm5hbF9zY25oZHIKLSNkZWZpbmUJU0NOSFNaCTQwCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzRdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLSNkZWZpbmUgR0VUX0xJTkVOT19MTk5PKGFiZmQsIGV4dCkgYmZkX2hfZ2V0XzMyKGFiZmQsIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLSNkZWZpbmUgUFVUX0xJTkVOT19MTk5PKGFiZmQsdmFsLCBleHQpIGJmZF9oX3B1dF8zMihhYmZkLHZhbCwgIChiZmRfYnl0ZSAqKSAoZXh0LT5sX2xubm8pKTsKLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJOAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0KLQotI2RlZmluZSBOX0JUTUFTSwkoMDE3KQotI2RlZmluZSBOX1RNQVNLCQkoMDYwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotCi11bmlvbiBleHRlcm5hbF9hdXhlbnQgewotICBzdHJ1Y3QgewotCWNoYXIgeF90YWduZHhbNF07CS8qIHN0ciwgdW4sIG9yIGVudW0gdGFnIGluZHggKi8KLQl1bmlvbiB7Ci0JICBzdHJ1Y3QgewotCQljaGFyICB4X2xubm9bMl07IC8qIGRlY2xhcmF0aW9uIGxpbmUgbnVtYmVyICovCi0JCWNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkgIH0geF9sbnN6OwotCSAgY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JfSB4X21pc2M7Ci0JdW5pb24gewotCSAgc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQljaGFyIHhfbG5ub3B0cls0XTsJLyogcHRyIHRvIGZjbiBsaW5lICMgKi8KLQkJY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JICB9IHhfZmNuOwotCSAgc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQljaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCSAgfSB4X2FyeTsKLQl9IHhfZmNuYXJ5OwotCWNoYXIgeF90dm5keFsyXTsJCS8qIHR2IGluZGV4ICovCi0gIH0geF9zeW07Ci0gIAotICB1bmlvbiB7Ci0JY2hhciB4X2ZuYW1lW0VfRklMTk1MRU5dOwotCXN0cnVjdCB7Ci0JICBjaGFyIHhfemVyb2VzWzRdOwotCSAgY2hhciB4X29mZnNldFs0XTsKLQl9IHhfbjsKLSAgfSB4X2ZpbGU7Ci0gIAotICBzdHJ1Y3QgewotCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQljaGFyIHhfbnJlbG9jWzJdOwkvKiAjIHJlbG9jYXRpb24gZW50cmllcyAqLwotCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0gIH0geF9zY247Ci0gIAotICBzdHJ1Y3QgewotCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQljaGFyIHhfdHZsZW5bMl07CS8qIGxlbmd0aCBvZiAudHYgKi8KLQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0gIH0geF90djsJCS8qIGluZm8gYWJvdXQgLnR2IHNlY3Rpb24gKGluIGF1eGVudCBvZiBzeW1ib2wgLnR2KSkgKi8KLSAgCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgejhrIGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHdpdGggc2VnbWVudHMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCi0vKiBUTVMzMjBDMzAgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0KLSNkZWZpbmUgUl9USUMzMF9BQlMxNiAweDEwMCAgLyogMTYgYml0IGFic29sdXRlLiAqLwotI2RlZmluZSBSX1RJQzMwX0FCUzI0IDB4MTAxICAvKiAyNCBiaXQgYWJzb2x1dGUuICovCi0jZGVmaW5lIFJfVElDMzBfQUJTMzIgMHgxMDIgIC8qIDMyIGJpdCBhYnNvbHV0ZS4gKi8KLSNkZWZpbmUgUl9USUMzMF9MRFAgICAweDEwMyAgLyogTERQIGJpdHMgMjMtMTYgdG8gNy0wLiAqLwotI2RlZmluZSBSX1RJQzMwX1BDMTYgIDB4MTA0ICAvKiAxNiBiaXQgcGMgcmVsYXRpdmUuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NvZmYvdGljODAuaCBiL2luY2x1ZGUvY29mZi90aWM4MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDkzOGY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi90aWM4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKiogY29mZiBpbmZvcm1hdGlvbiBmb3IgVEkgVE1TMzIwQzgwIChNVlApICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi0JY2hhciBmX3RhcmdldF9pZFsyXTsJLyogdGFyZ2V0IGlkIChUSWM4MCBzcGVjaWZpYykJKi8KLX07Ci0KLSNkZWZpbmUJVElDODBfQVJDSF9NQUdJQwkweDBDMQkvKiBHb2VzIGluIHRoZSBmaWxlIGhlYWRlciBtYWdpYyBudW1iZXIgZmllbGQgKi8KLSNkZWZpbmUgVElDODBfVEFSR0VUX0lECQkweDk1CS8qIEdvZXMgaW4gdGhlIHRhcmdldCBpZCBmaWVsZCAqLwotCi0jZGVmaW5lIFRJQzgwQkFETUFHKHgpICgoeCkuZl9tYWdpYyAhPSBUSUM4MF9BUkNIX01BR0lDKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotI2RlZmluZSBUSUM4MF9BT1VUSERSX01BR0lDCTB4MTA4CS8qIEdvZXMgaW4gdGhlIG9wdGlvbmFsIGZpbGUgaGVhZGVyIG1hZ2ljIG51bWJlciBmaWVsZCAqLwotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi0JY2hhcgkJc19yZXNlcnZlZFsxXTsJLyogcmVzZXJ2ZWQgKFRJYzgwIHNwZWNpZmljKQkqLwotCWNoYXIJCXNfbWVtcGFnZVsxXTsJLyogbWVtb3J5IHBhZ2UgbnVtYmVyIChUSWM4MCkJKi8KLX07Ci0KLS8qCi0gKiBuYW1lcyBvZiAic3BlY2lhbCIgc2VjdGlvbnMKLSAqLwotI2RlZmluZSBfVEVYVAkiLnRleHQiCi0jZGVmaW5lIF9EQVRBCSIuZGF0YSIKLSNkZWZpbmUgX0JTUwkiLmJzcyIKLSNkZWZpbmUgX0NJTklUCSIuY2luaXQiCi0jZGVmaW5lIF9DT05TVAkiLmNvbnN0IgotI2RlZmluZSBfU1dJVENICSIuc3dpdGNoIgotI2RlZmluZSBfU1RBQ0sJIi5zdGFjayIKLSNkZWZpbmUgX1NZU01FTQkiLnN5c21lbSIKLQotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIExJTkUgTlVNQkVSUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAxIGxpbmUgbnVtYmVyIGVudHJ5IGZvciBldmVyeSAiYnJlYWtwb2ludGFibGUiIHNvdXJjZSBsaW5lIGluIGEgc2VjdGlvbi4KLSAqIExpbmUgbnVtYmVycyBhcmUgZ3JvdXBlZCBvbiBhIHBlciBmdW5jdGlvbiBiYXNpczsgZmlyc3QgZW50cnkgaW4gYSBmdW5jdGlvbgotICogZ3JvdXBpbmcgd2lsbCBoYXZlIGxfbG5ubyA9IDAgYW5kIGluIHBsYWNlIG9mIHBoeXNpY2FsIGFkZHJlc3Mgd2lsbCBiZSB0aGUKLSAqIHN5bWJvbCB0YWJsZSBpbmRleCBvZiB0aGUgZnVuY3Rpb24gbmFtZS4KLSAqLwotc3RydWN0IGV4dGVybmFsX2xpbmVubyB7Ci0JdW5pb24gewotCQljaGFyIGxfc3ltbmR4WzRdOwkvKiBmdW5jdGlvbiBuYW1lIHN5bWJvbCBpbmRleCwgaWZmIGxfbG5ubyA9PSAwKi8KLQkJY2hhciBsX3BhZGRyWzRdOwkvKiAocGh5c2ljYWwpIGFkZHJlc3Mgb2YgbGluZSBudW1iZXIJKi8KLQl9IGxfYWRkcjsKLQljaGFyIGxfbG5ub1syXTsJCQkvKiBsaW5lIG51bWJlcgkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMTYoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzE2KGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk2Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0vKiBGSVhNRSAtIG5lZWQgdG8gY29ycmVsYXRlIHdpdGggVEljODAgQ29kZSBHZW5lcmF0aW9uIFRvb2xzIFVzZXIncyBHdWlkZSwgQ0c6QS0yNSAqLwotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIGV4dGVybmFsIHJlbG9jIGhhcyBhbiBvZmZzZXQgZmllbGQsIGJlY2F1c2Ugc29tZSBvZiB0aGUgcmVsb2MKLSAgIHR5cGVzIG9uIHRoZSBoOCBkb24ndCBoYXZlIHJvb20gaW4gdGhlIGluc3RydWN0aW9uIGZvciB0aGUgZW50aXJlCi0gICBvZmZzZXQgLSBlZyB0aGUgc3RyYW5nZSBqdW1wIGFuZCBoaWdoIHBhZ2UgYWRkcmVzc2luZyBtb2RlcyAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MgewotICBjaGFyIHJfdmFkZHJbNF07Ci0gIGNoYXIgcl9zeW1uZHhbNF07Ci0gIGNoYXIgcl9yZXNlcnZlZFsyXTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEyCi0KLS8qIFRJYzgwIHJlbG9jYXRpb24gdHlwZXMuICovCi0KLSNkZWZpbmUgUl9BQlMJCTB4MDAJCS8qIEFic29sdXRlIGFkZHJlc3MgLSBubyByZWxvY2F0aW9uICovCi0jZGVmaW5lIFJfUkVMTE9OR1gJMHgxMQkJLyogUFA6IDMyIGJpdHMsIGRpcmVjdCAqLwotI2RlZmluZSBSX1BQQkFTRQkweDM0CQkvKiBQUDogR2xvYmFsIGJhc2UgYWRkcmVzcyB0eXBlICovCi0jZGVmaW5lIFJfUFBMQkFTRQkweDM1CQkvKiBQUDogTG9jYWwgYmFzZSBhZGRyZXNzIHR5cGUgKi8KLSNkZWZpbmUgUl9QUDE1CQkweDM4CQkvKiBQUDogR2xvYmFsIDE1IGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUDE1VwkJMHgzOQkJLyogUFA6IEdsb2JhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX1BQMTVICQkweDNBCQkvKiBQUDogR2xvYmFsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSAyICovCi0jZGVmaW5lIFJfUFAxNkIJCTB4M0IJCS8qIFBQOiBHbG9iYWwgMTYgYml0IG9mZnNldCBmb3IgYnl0ZXMgKi8KLSNkZWZpbmUgUl9QUEwxNQkJMHgzQwkJLyogUFA6IExvY2FsIDE1IGJpdCBvZmZzZXQgKi8KLSNkZWZpbmUgUl9QUEwxNVcJMHgzRAkJLyogUFA6IExvY2FsIDE1IGJpdCBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFBMMTVICTB4M0UJCS8qIFBQOiBMb2NhbCAxNSBiaXQgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQTDE2QgkweDNGCQkvKiBQUDogTG9jYWwgMTYgYml0IG9mZnNldCBmb3IgYnl0ZXMgKi8KLSNkZWZpbmUgUl9QUE4xNQkJMHg0MAkJLyogUFA6IEdsb2JhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0ICovCi0jZGVmaW5lIFJfUFBOMTVXCTB4NDEJCS8qIFBQOiBHbG9iYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDQgKi8KLSNkZWZpbmUgUl9QUE4xNUgJMHg0MgkJLyogUFA6IEdsb2JhbCAxNSBiaXQgbmVnYXRpdmUgb2Zmc2V0IGRpdmlkZWQgYnkgMiAqLwotI2RlZmluZSBSX1BQTjE2QgkweDQzCQkvKiBQUDogR2xvYmFsIDE2IGJpdCBuZWdhdGl2ZSBieXRlIG9mZnNldCAqLwotI2RlZmluZSBSX1BQTE4xNQkweDQ0CQkvKiBQUDogTG9jYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCAqLwotI2RlZmluZSBSX1BQTE4xNVcJMHg0NQkJLyogUFA6IExvY2FsIDE1IGJpdCBuZWdhdGl2ZSBvZmZzZXQgZGl2aWRlZCBieSA0ICovCi0jZGVmaW5lIFJfUFBMTjE1SAkweDQ2CQkvKiBQUDogTG9jYWwgMTUgYml0IG5lZ2F0aXZlIG9mZnNldCBkaXZpZGVkIGJ5IDIgKi8KLSNkZWZpbmUgUl9QUExOMTZCCTB4NDcJCS8qIFBQOiBMb2NhbCAxNiBiaXQgbmVnYXRpdmUgYnl0ZSBvZmZzZXQgKi8KLSNkZWZpbmUgUl9NUFBDUjE1VwkweDRFCQkvKiBNUDogMTUgYml0IFBDLXJlbGF0aXZlIGRpdmlkZWQgYnkgNCAqLwotI2RlZmluZSBSX01QUENSCQkweDRGCQkvKiBNUDogMzIgYml0IFBDLXJlbGF0aXZlIGRpdmlkZWQgYnkgNCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3c2NS5oIGIvaW5jbHVkZS9jb2ZmL3c2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc4YzIzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29mZi93NjUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIFdEQyA2NTgxNiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0KLSNkZWZpbmUJVzY1TUFHSUMJMHg2NTAwCi0KLQotI2RlZmluZSBXNjVCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9VzY1TUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgdzY1IGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHRoZSBzdHJhbmdlIGp1bXAgYW5kIGhpZ2ggcGFnZSBhZGRyZXNzaW5nIG1vZGVzICovCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX29mZnNldFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci0gIGNoYXIgcl9zdHVmZlsyXTsKLX07Ci0KLQotI2RlZmluZSBSRUxPQyBzdHJ1Y3QgZXh0ZXJuYWxfcmVsb2MKLSNkZWZpbmUgUkVMU1ogMTYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb2ZmL3dlMzJrLmggYi9pbmNsdWRlL2NvZmYvd2UzMmsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzZmEzNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvd2UzMmsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqIGNvZmYgaW5mb3JtYXRpb24gZm9yIHdlMzJrICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEZJTEUgSEVBREVSICoqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBleHRlcm5hbF9maWxlaGRyIHsKLQljaGFyIGZfbWFnaWNbMl07CS8qIG1hZ2ljIG51bWJlcgkJCSovCi0JY2hhciBmX25zY25zWzJdOwkvKiBudW1iZXIgb2Ygc2VjdGlvbnMJCSovCi0JY2hhciBmX3RpbWRhdFs0XTsJLyogdGltZSAmIGRhdGUgc3RhbXAJCSovCi0JY2hhciBmX3N5bXB0cls0XTsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYgkqLwotCWNoYXIgZl9uc3ltc1s0XTsJLyogbnVtYmVyIG9mIHN5bXRhYiBlbnRyaWVzCSovCi0JY2hhciBmX29wdGhkclsyXTsJLyogc2l6ZW9mKG9wdGlvbmFsIGhkcikJCSovCi0JY2hhciBmX2ZsYWdzWzJdOwkvKiBmbGFncwkJCSovCi19OwotCi0KLS8qIEJpdHMgZm9yIGZfZmxhZ3M6Ci0gKglGX1JFTEZMRwlyZWxvY2F0aW9uIGluZm8gc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0VYRUMJCWZpbGUgaXMgZXhlY3V0YWJsZSAobm8gdW5yZXNvbHZlZCBleHRlcm5hbCByZWZlcmVuY2VzKQotICoJRl9MTk5PCQlsaW5lIG51bWJlcnMgc3RyaXBwZWQgZnJvbSBmaWxlCi0gKglGX0xTWU1TCQlsb2NhbCBzeW1ib2xzIHN0cmlwcGVkIGZyb20gZmlsZQotICoJRl9BUjMyV1IJZmlsZSBoYXMgYnl0ZSBvcmRlcmluZyBvZiBhbiBBUjMyV1IgbWFjaGluZSAoZS5nLiB2YXgpCi0gKi8KLQotI2RlZmluZSBGX1JFTEZMRwkoMHgwMDAxKQotI2RlZmluZSBGX0VYRUMJCSgweDAwMDIpCi0jZGVmaW5lIEZfTE5OTwkJKDB4MDAwNCkKLSNkZWZpbmUgRl9MU1lNUwkJKDB4MDAwOCkKLSNkZWZpbmUJRl9CTTMyQgkJKDAwMjAwMDApCi0jZGVmaW5lCUZfQk0zMk1BVQkoMDA0MDAwMCkKLQotI2RlZmluZQlXRTMyS01BR0lDCTB4MTcwCS8qIHdlMzJrIHNhbnMgdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIEZCT01BR0lDCTB4MTcwCS8qIHdlMzJrIHNhbnMgdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIE1UVk1BR0lDCTB4MTcxCS8qIHdlMzJrIHdpdGggdHJhbnNmZXIgdmVjdG9yICovCi0jZGVmaW5lIFJCT01BR0lDCTB4MTcyCS8qIHJlc2VydmVkICovCi0jZGVmaW5lIFdFMzJLQkFETUFHKHgpICgoKHgpLmZfbWFnaWMgIT0gV0UzMktNQUdJQykgXAotCQkJJiYgKCh4KS5mX21hZ2ljICE9IEZCT01BR0lDKSBcCi0JCQkmJiAoKHgpLmZfbWFnaWMgIT0gUkJPTUFHSUMpIFwKLQkJCSYmICgoeCkuZl9tYWdpYyAhPSBNVFZNQUdJQykpCi0KLSNkZWZpbmUJRklMSERSCXN0cnVjdCBleHRlcm5hbF9maWxlaGRyCi0jZGVmaW5lCUZJTEhTWgkyMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIEFPVVQgIk9QVElPTkFMIEhFQURFUiIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgY2hhciAJbWFnaWNbMl07CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgY2hhcgl2c3RhbXBbMl07CQkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgY2hhcgl0c2l6ZVs0XTsJCS8qIHRleHQgc2l6ZSBpbiBieXRlcywgcGFkZGVkIHRvIEZXIGJkcnkqLwotICBjaGFyCWRzaXplWzRdOwkJLyogaW5pdGlhbGl6ZWQgZGF0YSAiICAiCQkqLwotICBjaGFyCWJzaXplWzRdOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICBjaGFyCWVudHJ5WzRdOwkJLyogZW50cnkgcHQuCQkJCSovCi0gIGNoYXIgCXRleHRfc3RhcnRbNF07CQkvKiBiYXNlIG9mIHRleHQgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIGNoYXIgCWRhdGFfc3RhcnRbNF07CQkvKiBiYXNlIG9mIGRhdGEgdXNlZCBmb3IgdGhpcyBmaWxlICovCi19Ci1BT1VUSERSOwotCi0jZGVmaW5lIEFPVVRTWiAyOAotI2RlZmluZSBBT1VUSERSU1ogMjgKLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0jZGVmaW5lCVNDTkhEUglzdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyCi0jZGVmaW5lCVNDTkhTWgk0MAotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0jZGVmaW5lIF9UVgkiLnR2IgotI2RlZmluZSBfSU5JVAkiLmluaXQiCi0jZGVmaW5lIF9GSU5JCSIuZmluaSIKLQotLyoqKioqKioqKioqKioqKioqKioqKiogTElORSBOVU1CRVJTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDEgbGluZSBudW1iZXIgZW50cnkgZm9yIGV2ZXJ5ICJicmVha3BvaW50YWJsZSIgc291cmNlIGxpbmUgaW4gYSBzZWN0aW9uLgotICogTGluZSBudW1iZXJzIGFyZSBncm91cGVkIG9uIGEgcGVyIGZ1bmN0aW9uIGJhc2lzOyBmaXJzdCBlbnRyeSBpbiBhIGZ1bmN0aW9uCi0gKiBncm91cGluZyB3aWxsIGhhdmUgbF9sbm5vID0gMCBhbmQgaW4gcGxhY2Ugb2YgcGh5c2ljYWwgYWRkcmVzcyB3aWxsIGJlIHRoZQotICogc3ltYm9sIHRhYmxlIGluZGV4IG9mIHRoZSBmdW5jdGlvbiBuYW1lLgotICovCi1zdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vIHsKLQl1bmlvbiB7Ci0JCWNoYXIgbF9zeW1uZHhbNF07CS8qIGZ1bmN0aW9uIG5hbWUgc3ltYm9sIGluZGV4LCBpZmYgbF9sbm5vID09IDAqLwotCQljaGFyIGxfcGFkZHJbNF07CS8qIChwaHlzaWNhbCkgYWRkcmVzcyBvZiBsaW5lIG51bWJlcgkqLwotCX0gbF9hZGRyOwotCWNoYXIgbF9sbm5vWzJdOwkvKiBsaW5lIG51bWJlcgkJKi8KLX07Ci0KLQotI2RlZmluZQlMSU5FTk8Jc3RydWN0IGV4dGVybmFsX2xpbmVubwotI2RlZmluZQlMSU5FU1oJNgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqIFNZTUJPTFMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBFX1NZTU5NTEVOCTgJLyogIyBjaGFyYWN0ZXJzIGluIGEgc3ltYm9sIG5hbWUJKi8KLSNkZWZpbmUgRV9GSUxOTUxFTgkxNAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBmaWxlIG5hbWUJCSovCi0jZGVmaW5lIEVfRElNTlVNCTQJLyogIyBhcnJheSBkaW1lbnNpb25zIGluIGF1eGlsaWFyeSBlbnRyeSAqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfc3ltZW50IAotewotICB1bmlvbiB7Ci0gICAgY2hhciBlX25hbWVbRV9TWU1OTUxFTl07Ci0gICAgc3RydWN0IHsKLSAgICAgIGNoYXIgZV96ZXJvZXNbNF07Ci0gICAgICBjaGFyIGVfb2Zmc2V0WzRdOwotICAgIH0gZTsKLSAgfSBlOwotICBjaGFyIGVfdmFsdWVbNF07Ci0gIGNoYXIgZV9zY251bVsyXTsKLSAgY2hhciBlX3R5cGVbMl07Ci0gIGNoYXIgZV9zY2xhc3NbMV07Ci0gIGNoYXIgZV9udW1hdXhbMV07Ci19OwotCi0jZGVmaW5lIE5fQlRNQVNLCSgweGYpCi0jZGVmaW5lIE5fVE1BU0sJCSgweDMwKQotI2RlZmluZSBOX0JUU0hGVAkoNCkKLSNkZWZpbmUgTl9UU0hJRlQJKDIpCi0gIAotdW5pb24gZXh0ZXJuYWxfYXV4ZW50IHsKLQlzdHJ1Y3QgewotCQljaGFyIHhfdGFnbmR4WzRdOwkvKiBzdHIsIHVuLCBvciBlbnVtIHRhZyBpbmR4ICovCi0JCXVuaW9uIHsKLQkJCXN0cnVjdCB7Ci0JCQkgICAgY2hhciAgeF9sbm5vWzJdOyAvKiBkZWNsYXJhdGlvbiBsaW5lIG51bWJlciAqLwotCQkJICAgIGNoYXIgIHhfc2l6ZVsyXTsgLyogc3RyL3VuaW9uL2FycmF5IHNpemUgKi8KLQkJCX0geF9sbnN6OwotCQkJY2hhciB4X2ZzaXplWzRdOwkvKiBzaXplIG9mIGZ1bmN0aW9uICovCi0JCX0geF9taXNjOwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewkJLyogaWYgSVNGQ04sIHRhZywgb3IgLmJiICovCi0JCQkgICAgY2hhciB4X2xubm9wdHJbNF07CS8qIHB0ciB0byBmY24gbGluZSAjICovCi0JCQkgICAgY2hhciB4X2VuZG5keFs0XTsJLyogZW50cnkgbmR4IHBhc3QgYmxvY2sgZW5kICovCi0JCQl9IHhfZmNuOwotCQkJc3RydWN0IHsJCS8qIGlmIElTQVJZLCB1cCB0byA0IGRpbWVuLiAqLwotCQkJICAgIGNoYXIgeF9kaW1lbltFX0RJTU5VTV1bMl07Ci0JCQl9IHhfYXJ5OwotCQl9IHhfZmNuYXJ5OwotCQljaGFyIHhfdHZuZHhbMl07CQkvKiB0diBpbmRleCAqLwotCX0geF9zeW07Ci0KLQl1bmlvbiB7Ci0JCWNoYXIgeF9mbmFtZVtFX0ZJTE5NTEVOXTsKLQkJc3RydWN0IHsKLQkJCWNoYXIgeF96ZXJvZXNbNF07Ci0JCQljaGFyIHhfb2Zmc2V0WzRdOwotCQl9IHhfbjsKLQl9IHhfZmlsZTsKLQotCXN0cnVjdCB7Ci0JCWNoYXIgeF9zY25sZW5bNF07CQkJLyogc2VjdGlvbiBsZW5ndGggKi8KLQkJY2hhciB4X25yZWxvY1syXTsJLyogIyByZWxvY2F0aW9uIGVudHJpZXMgKi8KLQkJY2hhciB4X25saW5ub1syXTsJLyogIyBsaW5lIG51bWJlcnMgKi8KLQl9IHhfc2NuOwotCi0gICAgICAgIHN0cnVjdCB7Ci0JCWNoYXIgeF90dmZpbGxbNF07CS8qIHR2IGZpbGwgdmFsdWUgKi8KLQkJY2hhciB4X3R2bGVuWzJdOwkvKiBsZW5ndGggb2YgLnR2ICovCi0JCWNoYXIgeF90dnJhblsyXVsyXTsJLyogdHYgcmFuZ2UgKi8KLQl9IHhfdHY7CQkvKiBpbmZvIGFib3V0IC50diBzZWN0aW9uIChpbiBhdXhlbnQgb2Ygc3ltYm9sIC50dikpICovCi0KLQotfTsKLQotI2RlZmluZQlTWU1FTlQJc3RydWN0IGV4dGVybmFsX3N5bWVudAotI2RlZmluZQlTWU1FU1oJMTgJCi0jZGVmaW5lCUFVWEVOVAl1bmlvbiBleHRlcm5hbF9hdXhlbnQKLSNkZWZpbmUJQVVYRVNaCTE4Ci0KLQotIwlkZWZpbmUgX0VURVhUCSJldGV4dCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBSRUxPQ0FUSU9OIERJUkVDVElWRVMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLXN0cnVjdCBleHRlcm5hbF9yZWxvYyB7Ci0gIGNoYXIgcl92YWRkcls0XTsKLSAgY2hhciByX3N5bW5keFs0XTsKLSAgY2hhciByX3R5cGVbMl07Ci19OwotCi0KLSNkZWZpbmUgUkVMT0Mgc3RydWN0IGV4dGVybmFsX3JlbG9jCi0jZGVmaW5lIFJFTFNaIDEwCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29mZi96OGsuaCBiL2luY2x1ZGUvY29mZi96OGsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliODQ2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2NvZmYvejhrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKiBjb2ZmIGluZm9ybWF0aW9uIGZvciBaaWxvZyBaODAwTiAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKiBGSUxFIEhFQURFUiAqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkciB7Ci0JY2hhciBmX21hZ2ljWzJdOwkvKiBtYWdpYyBudW1iZXIJCQkqLwotCWNoYXIgZl9uc2Nuc1syXTsJLyogbnVtYmVyIG9mIHNlY3Rpb25zCQkqLwotCWNoYXIgZl90aW1kYXRbNF07CS8qIHRpbWUgJiBkYXRlIHN0YW1wCQkqLwotCWNoYXIgZl9zeW1wdHJbNF07CS8qIGZpbGUgcG9pbnRlciB0byBzeW10YWIJKi8KLQljaGFyIGZfbnN5bXNbNF07CS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcwkqLwotCWNoYXIgZl9vcHRoZHJbMl07CS8qIHNpemVvZihvcHRpb25hbCBoZHIpCQkqLwotCWNoYXIgZl9mbGFnc1syXTsJLyogZmxhZ3MJCQkqLwotfTsKLQotCi0vKiBUeXBlIG9mIGNwdSBpcyBzdG9yZWQgaW4gZmxhZ3MgKi8KLSNkZWZpbmUgRl9aODAwMSAgICAweDEwMDAKLSNkZWZpbmUgRl9aODAwMiAgICAweDIwMDAKLSNkZWZpbmUgRl9NQUNITUFTSyAweGYwMDAKLQotI2RlZmluZQlaOEtNQUdJQwkweDgwMDAKLQotI2RlZmluZSBaOEtCQURNQUcoeCkgKCgoeCkuZl9tYWdpYyE9WjhLTUFHSUMpKQotCi0jZGVmaW5lCUZJTEhEUglzdHJ1Y3QgZXh0ZXJuYWxfZmlsZWhkcgotI2RlZmluZQlGSUxIU1oJMjAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBBT1VUICJPUFRJT05BTCBIRUFERVIiICoqKioqKioqKioqKioqKioqKioqKiovCi0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGNoYXIgCW1hZ2ljWzJdOwkJLyogdHlwZSBvZiBmaWxlCQkJCSovCi0gIGNoYXIJdnN0YW1wWzJdOwkJLyogdmVyc2lvbiBzdGFtcAkJCSovCi0gIGNoYXIJdHNpemVbNF07CQkvKiB0ZXh0IHNpemUgaW4gYnl0ZXMsIHBhZGRlZCB0byBGVyBiZHJ5Ki8KLSAgY2hhcglkc2l6ZVs0XTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgY2hhcglic2l6ZVs0XTsJCS8qIHVuaW5pdGlhbGl6ZWQgZGF0YSAiICAgIgkJKi8KLSAgY2hhcgllbnRyeVs0XTsJCS8qIGVudHJ5IHB0LgkJCQkqLwotICBjaGFyIAl0ZXh0X3N0YXJ0WzRdOwkJLyogYmFzZSBvZiB0ZXh0IHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotICBjaGFyIAlkYXRhX3N0YXJ0WzRdOwkJLyogYmFzZSBvZiBkYXRhIHVzZWQgZm9yIHRoaXMgZmlsZSAqLwotfQotQU9VVEhEUjsKLQotCi0jZGVmaW5lIEFPVVRIRFJTWiAyOAotI2RlZmluZSBBT1VUU1ogMjgKLQotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU0VDVElPTiBIRUFERVIgKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1zdHJ1Y3QgZXh0ZXJuYWxfc2NuaGRyIHsKLQljaGFyCQlzX25hbWVbOF07CS8qIHNlY3Rpb24gbmFtZQkJCSovCi0JY2hhcgkJc19wYWRkcls0XTsJLyogcGh5c2ljYWwgYWRkcmVzcywgYWxpYXNlZCBzX25saWIgKi8KLQljaGFyCQlzX3ZhZGRyWzRdOwkvKiB2aXJ0dWFsIGFkZHJlc3MJCSovCi0JY2hhcgkJc19zaXplWzRdOwkvKiBzZWN0aW9uIHNpemUJCQkqLwotCWNoYXIJCXNfc2NucHRyWzRdOwkvKiBmaWxlIHB0ciB0byByYXcgZGF0YSBmb3Igc2VjdGlvbiAqLwotCWNoYXIJCXNfcmVscHRyWzRdOwkvKiBmaWxlIHB0ciB0byByZWxvY2F0aW9uCSovCi0JY2hhcgkJc19sbm5vcHRyWzRdOwkvKiBmaWxlIHB0ciB0byBsaW5lIG51bWJlcnMJKi8KLQljaGFyCQlzX25yZWxvY1syXTsJLyogbnVtYmVyIG9mIHJlbG9jYXRpb24gZW50cmllcwkqLwotCWNoYXIJCXNfbmxubm9bMl07CS8qIG51bWJlciBvZiBsaW5lIG51bWJlciBlbnRyaWVzKi8KLQljaGFyCQlzX2ZsYWdzWzRdOwkvKiBmbGFncwkJCSovCi19OwotCi0vKgotICogbmFtZXMgb2YgInNwZWNpYWwiIHNlY3Rpb25zCi0gKi8KLSNkZWZpbmUgX1RFWFQJIi50ZXh0IgotI2RlZmluZSBfREFUQQkiLmRhdGEiCi0jZGVmaW5lIF9CU1MJIi5ic3MiCi0KLQotI2RlZmluZQlTQ05IRFIJc3RydWN0IGV4dGVybmFsX3NjbmhkcgotI2RlZmluZQlTQ05IU1oJNDAKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKiBMSU5FIE5VTUJFUlMgKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogMSBsaW5lIG51bWJlciBlbnRyeSBmb3IgZXZlcnkgImJyZWFrcG9pbnRhYmxlIiBzb3VyY2UgbGluZSBpbiBhIHNlY3Rpb24uCi0gKiBMaW5lIG51bWJlcnMgYXJlIGdyb3VwZWQgb24gYSBwZXIgZnVuY3Rpb24gYmFzaXM7IGZpcnN0IGVudHJ5IGluIGEgZnVuY3Rpb24KLSAqIGdyb3VwaW5nIHdpbGwgaGF2ZSBsX2xubm8gPSAwIGFuZCBpbiBwbGFjZSBvZiBwaHlzaWNhbCBhZGRyZXNzIHdpbGwgYmUgdGhlCi0gKiBzeW1ib2wgdGFibGUgaW5kZXggb2YgdGhlIGZ1bmN0aW9uIG5hbWUuCi0gKi8KLXN0cnVjdCBleHRlcm5hbF9saW5lbm8gewotCXVuaW9uIHsKLQkJY2hhciBsX3N5bW5keFs0XTsJLyogZnVuY3Rpb24gbmFtZSBzeW1ib2wgaW5kZXgsIGlmZiBsX2xubm8gPT0gMCovCi0JCWNoYXIgbF9wYWRkcls0XTsJLyogKHBoeXNpY2FsKSBhZGRyZXNzIG9mIGxpbmUgbnVtYmVyCSovCi0JfSBsX2FkZHI7Ci0JY2hhciBsX2xubm9bNF07CS8qIGxpbmUgbnVtYmVyCQkqLwotfTsKLQotI2RlZmluZSBHRVRfTElORU5PX0xOTk8oYWJmZCwgZXh0KSBiZmRfaF9nZXRfMzIoYWJmZCwgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotI2RlZmluZSBQVVRfTElORU5PX0xOTk8oYWJmZCx2YWwsIGV4dCkgYmZkX2hfcHV0XzMyKGFiZmQsdmFsLCAgKGJmZF9ieXRlICopIChleHQtPmxfbG5ubykpOwotCi0jZGVmaW5lCUxJTkVOTwlzdHJ1Y3QgZXh0ZXJuYWxfbGluZW5vCi0jZGVmaW5lCUxJTkVTWgk4Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogU1lNQk9MUyAqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIEVfU1lNTk1MRU4JOAkvKiAjIGNoYXJhY3RlcnMgaW4gYSBzeW1ib2wgbmFtZQkqLwotI2RlZmluZSBFX0ZJTE5NTEVOCTE0CS8qICMgY2hhcmFjdGVycyBpbiBhIGZpbGUgbmFtZQkJKi8KLSNkZWZpbmUgRV9ESU1OVU0JNAkvKiAjIGFycmF5IGRpbWVuc2lvbnMgaW4gYXV4aWxpYXJ5IGVudHJ5ICovCi0KLXN0cnVjdCBleHRlcm5hbF9zeW1lbnQgCi17Ci0gIHVuaW9uIHsKLSAgICBjaGFyIGVfbmFtZVtFX1NZTU5NTEVOXTsKLSAgICBzdHJ1Y3QgewotICAgICAgY2hhciBlX3plcm9lc1s0XTsKLSAgICAgIGNoYXIgZV9vZmZzZXRbNF07Ci0gICAgfSBlOwotICB9IGU7Ci0gIGNoYXIgZV92YWx1ZVs0XTsKLSAgY2hhciBlX3NjbnVtWzJdOwotICBjaGFyIGVfdHlwZVsyXTsKLSAgY2hhciBlX3NjbGFzc1sxXTsKLSAgY2hhciBlX251bWF1eFsxXTsKLX07Ci0KLQotCi0jZGVmaW5lIE5fQlRNQVNLCSgwMTcpCi0jZGVmaW5lIE5fVE1BU0sJCSgwNjApCi0jZGVmaW5lIE5fQlRTSEZUCSg0KQotI2RlZmluZSBOX1RTSElGVAkoMikKLSAgCi0KLXVuaW9uIGV4dGVybmFsX2F1eGVudCB7Ci0Jc3RydWN0IHsKLQkJY2hhciB4X3RhZ25keFs0XTsJLyogc3RyLCB1biwgb3IgZW51bSB0YWcgaW5keCAqLwotCQl1bmlvbiB7Ci0JCQlzdHJ1Y3QgewotCQkJICAgIGNoYXIgIHhfbG5ub1syXTsgLyogZGVjbGFyYXRpb24gbGluZSBudW1iZXIgKi8KLQkJCSAgICBjaGFyICB4X3NpemVbMl07IC8qIHN0ci91bmlvbi9hcnJheSBzaXplICovCi0JCQl9IHhfbG5zejsKLQkJCWNoYXIgeF9mc2l6ZVs0XTsJLyogc2l6ZSBvZiBmdW5jdGlvbiAqLwotCQl9IHhfbWlzYzsKLQkJdW5pb24gewotCQkJc3RydWN0IHsJCS8qIGlmIElTRkNOLCB0YWcsIG9yIC5iYiAqLwotCQkJICAgIGNoYXIgeF9sbm5vcHRyWzRdOwkvKiBwdHIgdG8gZmNuIGxpbmUgIyAqLwotCQkJICAgIGNoYXIgeF9lbmRuZHhbNF07CS8qIGVudHJ5IG5keCBwYXN0IGJsb2NrIGVuZCAqLwotCQkJfSB4X2ZjbjsKLQkJCXN0cnVjdCB7CQkvKiBpZiBJU0FSWSwgdXAgdG8gNCBkaW1lbi4gKi8KLQkJCSAgICBjaGFyIHhfZGltZW5bRV9ESU1OVU1dWzJdOwotCQkJfSB4X2FyeTsKLQkJfSB4X2ZjbmFyeTsKLQkJY2hhciB4X3R2bmR4WzJdOwkJLyogdHYgaW5kZXggKi8KLQl9IHhfc3ltOwotCi0JdW5pb24gewotCQljaGFyIHhfZm5hbWVbRV9GSUxOTUxFTl07Ci0JCXN0cnVjdCB7Ci0JCQljaGFyIHhfemVyb2VzWzRdOwotCQkJY2hhciB4X29mZnNldFs0XTsKLQkJfSB4X247Ci0JfSB4X2ZpbGU7Ci0KLQlzdHJ1Y3QgewotCQljaGFyIHhfc2NubGVuWzRdOwkJCS8qIHNlY3Rpb24gbGVuZ3RoICovCi0JCWNoYXIgeF9ucmVsb2NbMl07CS8qICMgcmVsb2NhdGlvbiBlbnRyaWVzICovCi0JCWNoYXIgeF9ubGlubm9bMl07CS8qICMgbGluZSBudW1iZXJzICovCi0JfSB4X3NjbjsKLQotICAgICAgICBzdHJ1Y3QgewotCQljaGFyIHhfdHZmaWxsWzRdOwkvKiB0diBmaWxsIHZhbHVlICovCi0JCWNoYXIgeF90dmxlblsyXTsJLyogbGVuZ3RoIG9mIC50diAqLwotCQljaGFyIHhfdHZyYW5bMl1bMl07CS8qIHR2IHJhbmdlICovCi0JfSB4X3R2OwkJLyogaW5mbyBhYm91dCAudHYgc2VjdGlvbiAoaW4gYXV4ZW50IG9mIHN5bWJvbCAudHYpKSAqLwotCi0KLX07Ci0KLSNkZWZpbmUJU1lNRU5UCXN0cnVjdCBleHRlcm5hbF9zeW1lbnQKLSNkZWZpbmUJU1lNRVNaCTE4CQotI2RlZmluZQlBVVhFTlQJdW5pb24gZXh0ZXJuYWxfYXV4ZW50Ci0jZGVmaW5lCUFVWEVTWgkxOAotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKiogUkVMT0NBVElPTiBESVJFQ1RJVkVTICoqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBleHRlcm5hbCByZWxvYyBoYXMgYW4gb2Zmc2V0IGZpZWxkLCBiZWNhdXNlIHNvbWUgb2YgdGhlIHJlbG9jCi0gICB0eXBlcyBvbiB0aGUgejhrIGRvbid0IGhhdmUgcm9vbSBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbnRpcmUKLSAgIG9mZnNldCAtIGVnIHdpdGggc2VnbWVudHMgKi8KLQotc3RydWN0IGV4dGVybmFsX3JlbG9jIHsKLSAgY2hhciByX3ZhZGRyWzRdOwotICBjaGFyIHJfc3ltbmR4WzRdOwotICBjaGFyIHJfb2Zmc2V0WzRdOwotICBjaGFyIHJfdHlwZVsyXTsKLSAgY2hhciByX3N0dWZmWzJdOwotfTsKLQotCi0jZGVmaW5lIFJFTE9DIHN0cnVjdCBleHRlcm5hbF9yZWxvYwotI2RlZmluZSBSRUxTWiAxNgotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RlbWFuZ2xlLmggYi9pbmNsdWRlL2RlbWFuZ2xlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmU1ZTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9kZW1hbmdsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyogRGVmcyBmb3IgaW50ZXJmYWNlIHRvIGRlbWFuZ2xlcnMuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2lmICFkZWZpbmVkIChERU1BTkdMRV9IKQotI2RlZmluZSBERU1BTkdMRV9ICi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0vKiBPcHRpb25zIHBhc3NlZCB0byBjcGx1c19kZW1hbmdsZSAoaW4gMm5kIHBhcmFtZXRlcikuICovCi0KLSNkZWZpbmUgRE1HTF9OT19PUFRTCTAJCS8qIEZvciByZWFkYWJpbGl0eS4uLiAqLwotI2RlZmluZSBETUdMX1BBUkFNUwkoMSA8PCAwKQkvKiBJbmNsdWRlIGZ1bmN0aW9uIGFyZ3MgKi8KLSNkZWZpbmUgRE1HTF9BTlNJCSgxIDw8IDEpCS8qIEluY2x1ZGUgY29uc3QsIHZvbGF0aWxlLCBldGMgKi8KLSNkZWZpbmUgRE1HTF9KQVZBCSgxIDw8IDIpCS8qIERlbWFuZ2xlIGFzIEphdmEgcmF0aGVyIHRoYW4gQysrLiAqLwotCi0jZGVmaW5lIERNR0xfQVVUTwkoMSA8PCA4KQotI2RlZmluZSBETUdMX0dOVQkoMSA8PCA5KQotI2RlZmluZSBETUdMX0xVQ0lECSgxIDw8IDEwKQotI2RlZmluZSBETUdMX0FSTQkoMSA8PCAxMSkKLSNkZWZpbmUgRE1HTF9IUCAJKDEgPDwgMTIpICAgICAgIC8qIEZvciB0aGUgSFAgYUNDIGNvbXBpbGVyOyBzYW1lIGFzIEFSTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmb3IgdGVtcGxhdGUgYXJndW1lbnRzLCBldGMuICovCi0jZGVmaW5lIERNR0xfRURHCSgxIDw8IDEzKQotCi0vKiBJZiBub25lIG9mIHRoZXNlIGFyZSBzZXQsIHVzZSAnY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlJyBhcyB0aGUgZGVmYXVsdC4gKi8KLSNkZWZpbmUgRE1HTF9TVFlMRV9NQVNLIChETUdMX0FVVE98RE1HTF9HTlV8RE1HTF9MVUNJRHxETUdMX0FSTXxETUdMX0hQfERNR0xfRURHKQotCi0vKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBkZW1hbmdsaW5nIHN0eWxlcy4KLQotICAgTHVjaWQgYW5kIEFSTSBzdHlsZXMgYXJlIHN0aWxsIGtlcHQgbG9naWNhbGx5IGRpc3RpbmN0LCBldmVuIHRob3VnaAotICAgdGhleSBub3cgYm90aCBiZWhhdmUgaWRlbnRpY2FsbHkuICBUaGUgcmVzdWx0aW5nIHN0eWxlIGlzIGFjdHVhbCB0aGUKLSAgIHVuaW9uIG9mIGJvdGguICBJLkUuIGVpdGhlciBzdHlsZSByZWNvZ25pemVzIGJvdGggIl9fcHRfXyIgYW5kICJfX3JmX18iCi0gICBmb3Igb3BlcmF0b3IgIi0+IiwgZXZlbiB0aG91Z2ggdGhlIGZpcnN0IGlzIGx1Y2lkIHN0eWxlIGFuZCB0aGUgc2Vjb25kCi0gICBpcyBBUk0gc3R5bGUuIChGSVhNRT8pICovCi0KLWV4dGVybiBlbnVtIGRlbWFuZ2xpbmdfc3R5bGVzCi17Ci0gIHVua25vd25fZGVtYW5nbGluZyA9IDAsCi0gIGF1dG9fZGVtYW5nbGluZyA9IERNR0xfQVVUTywKLSAgZ251X2RlbWFuZ2xpbmcgPSBETUdMX0dOVSwKLSAgbHVjaWRfZGVtYW5nbGluZyA9IERNR0xfTFVDSUQsCi0gIGFybV9kZW1hbmdsaW5nID0gRE1HTF9BUk0sCi0gIGhwX2RlbWFuZ2xpbmcgPSBETUdMX0hQLAotICBlZGdfZGVtYW5nbGluZyA9IERNR0xfRURHCi19IGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZTsKLQotLyogRGVmaW5lIHN0cmluZyBuYW1lcyBmb3IgdGhlIHZhcmlvdXMgZGVtYW5nbGluZyBzdHlsZXMuICovCi0KLSNkZWZpbmUgQVVUT19ERU1BTkdMSU5HX1NUWUxFX1NUUklORwkiYXV0byIKLSNkZWZpbmUgR05VX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJnbnUiCi0jZGVmaW5lIExVQ0lEX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJsdWNpZCIKLSNkZWZpbmUgQVJNX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJhcm0iCi0jZGVmaW5lIEhQX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJocCIKLSNkZWZpbmUgRURHX0RFTUFOR0xJTkdfU1RZTEVfU1RSSU5HCSJlZGciCi0KLS8qIFNvbWUgbWFjcm9zIHRvIHRlc3Qgd2hhdCBkZW1hbmdsaW5nIHN0eWxlIGlzIGFjdGl2ZS4gKi8KLQotI2RlZmluZSBDVVJSRU5UX0RFTUFOR0xJTkdfU1RZTEUgY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlCi0jZGVmaW5lIEFVVE9fREVNQU5HTElORyAoKChpbnQpIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSkgJiBETUdMX0FVVE8pCi0jZGVmaW5lIEdOVV9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfR05VKQotI2RlZmluZSBMVUNJRF9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfTFVDSUQpCi0jZGVmaW5lIEFSTV9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfQVJNKQotI2RlZmluZSBIUF9ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfSFApCi0jZGVmaW5lIEVER19ERU1BTkdMSU5HICgoKGludCkgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFKSAmIERNR0xfRURHKQotCi1leHRlcm4gY2hhciAqCi1jcGx1c19kZW1hbmdsZSBQQVJBTVMgKChjb25zdCBjaGFyICptYW5nbGVkLCBpbnQgb3B0aW9ucykpOwotCi1leHRlcm4gaW50Ci1jcGx1c19kZW1hbmdsZV9vcG5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqb3BuYW1lLCBjaGFyICpyZXN1bHQsIGludCBvcHRpb25zKSk7Ci0KLWV4dGVybiBjb25zdCBjaGFyICoKLWNwbHVzX21hbmdsZV9vcG5hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqb3BuYW1lLCBpbnQgb3B0aW9ucykpOwotCi0vKiBOb3RlOiBUaGlzIHNldHMgZ2xvYmFsIHN0YXRlLiAgRklYTUUgaWYgeW91IGNhcmUgYWJvdXQgbXVsdGktdGhyZWFkaW5nLiAqLwotCi1leHRlcm4gdm9pZAotc2V0X2NwbHVzX21hcmtlcl9mb3JfZGVtYW5nbGluZyBQQVJBTVMgKChpbnQgY2gpKTsKLQotI2VuZGlmCS8qIERFTUFOR0xFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGlzLWFzbS5oIGIvaW5jbHVkZS9kaXMtYXNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmE1Y2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9kaXMtYXNtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyogSW50ZXJmYWNlIGJldHdlZW4gdGhlIG9wY29kZSBsaWJyYXJ5IGFuZCBpdHMgY2FsbGVycy4KLSAgIFdyaXR0ZW4gYnkgQ3lnbnVzIFN1cHBvcnQsIDE5OTMuCi0KLSAgIFRoZSBvcGNvZGUgbGlicmFyeSAobGlib3Bjb2Rlcy5hKSBwcm92aWRlcyBpbnN0cnVjdGlvbiBkZWNvZGVycyBmb3IKLSAgIGEgbGFyZ2UgdmFyaWV0eSBvZiBpbnN0cnVjdGlvbiBzZXRzLCBjYWxsYWJsZSB3aXRoIGFuIGlkZW50aWNhbAotICAgaW50ZXJmYWNlLCBmb3IgbWFraW5nIGluc3RydWN0aW9uLXByb2Nlc3NpbmcgcHJvZ3JhbXMgbW9yZSBpbmRlcGVuZGVudAotICAgb2YgdGhlIGluc3RydWN0aW9uIHNldCBiZWluZyBwcm9jZXNzZWQuICAqLwotCi0jaWZuZGVmIERJU19BU01fSAotI2RlZmluZSBESVNfQVNNX0gKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYmZkLmgiCi0KLXR5cGVkZWYgaW50ICgqZnByaW50Zl9mdHlwZSkgUEFSQU1TKChQVFIsIGNvbnN0IGNoYXIqLCAuLi4pKTsKLQotZW51bSBkaXNfaW5zbl90eXBlIHsKLSAgZGlzX25vbmluc24sCQkJLyogTm90IGEgdmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLSAgZGlzX25vbmJyYW5jaCwJCS8qIE5vdCBhIGJyYW5jaCBpbnN0cnVjdGlvbiAqLwotICBkaXNfYnJhbmNoLAkJCS8qIFVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIGRpc19jb25kYnJhbmNoLAkJLyogQ29uZGl0aW9uYWwgYnJhbmNoICovCi0gIGRpc19qc3IsCQkJLyogSnVtcCB0byBzdWJyb3V0aW5lICovCi0gIGRpc19jb25kanNyLAkJCS8qIENvbmRpdGlvbmFsIGp1bXAgdG8gc3Vicm91dGluZSAqLwotICBkaXNfZHJlZiwJCQkvKiBEYXRhIHJlZmVyZW5jZSBpbnN0cnVjdGlvbiAqLwotICBkaXNfZHJlZjIJCQkvKiBUd28gZGF0YSByZWZlcmVuY2VzIGluIGluc3RydWN0aW9uICovCi19OwotCi0vKiBUaGlzIHN0cnVjdCBpcyBwYXNzZWQgaW50byB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2Rpbmcgcm91dGluZSwgCi0gICBhbmQgaXMgcGFzc2VkIGJhY2sgb3V0IGludG8gZWFjaCBjYWxsYmFjay4gIFRoZSB2YXJpb3VzIGZpZWxkcyBhcmUgdXNlZAotICAgZm9yIGNvbnZleWluZyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgbWFpbiByb3V0aW5lIGludG8geW91ciBjYWxsYmFja3MsCi0gICBmb3IgcGFzc2luZyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVycyAoc3VjaCBhcyB0aGUKLSAgIGFkZHJlc3NlcyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zKSwgb3IgZm9yIHBhc3NpbmcgaW5mb3JtYXRpb24KLSAgIGJhY2sgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlcnMgdG8gdGhlaXIgY2FsbGVycy4KLQotICAgSXQgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgaXQgaXMgZmlyc3QgcGFzc2VkOyB0aGlzIGNhbiBiZSBkb25lCi0gICBieSBoYW5kLCBvciB1c2luZyBvbmUgb2YgdGhlIGluaXRpYWxpemF0aW9uIG1hY3JvcyBiZWxvdy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gewotICBmcHJpbnRmX2Z0eXBlIGZwcmludGZfZnVuYzsKLSAgUFRSIHN0cmVhbTsKLSAgUFRSIGFwcGxpY2F0aW9uX2RhdGE7Ci0KLSAgLyogVGFyZ2V0IGRlc2NyaXB0aW9uLiAgV2UgY291bGQgcmVwbGFjZSB0aGlzIHdpdGggYSBwb2ludGVyIHRvIHRoZSBiZmQsCi0gICAgIGJ1dCB0aGF0IHdvdWxkIHJlcXVpcmUgb25lLiAgVGhlcmUgY3VycmVudGx5IGlzbid0IGFueSBzdWNoIHJlcXVpcmVtZW50Ci0gICAgIHNvIHRvIGF2b2lkIGludHJvZHVjaW5nIG9uZSB3ZSByZWNvcmQgdGhlc2UgZXhwbGljaXRseS4gICovCi0gIC8qIFRoZSBiZmRfZmxhdm91ci4gIFRoaXMgY2FuIGJlIGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLiAgKi8KLSAgZW51bSBiZmRfZmxhdm91ciBmbGF2b3VyOwotICAvKiBUaGUgYmZkX2FyY2ggdmFsdWUuICAqLwotICBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgYXJjaDsKLSAgLyogVGhlIGJmZF9tYWNoIHZhbHVlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYWNoOwotICAvKiBFbmRpYW5uZXNzIChmb3IgYmktZW5kaWFuIGNwdXMpLiAgTW9uby1lbmRpYW4gY3B1cyBjYW4gaWdub3JlIHRoaXMuICAqLwotICBlbnVtIGJmZF9lbmRpYW4gZW5kaWFuOwotCi0gIC8qIEFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIHN5bWJvbHMgZWl0aGVyIGF0IHRoZSBsb2NhdGlvbiBiZWluZyBkaXNhc3NlbWJsZWQKLSAgICAgb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBiZWluZyBkaXNhc3NlbWJsZWQuICBUaGUgYXJyYXkgaXMgc29ydGVkCi0gICAgIHNvIHRoYXQgdGhlIGZpcnN0IHN5bWJvbCBpcyBpbnRlbmRlZCB0byBiZSB0aGUgb25lIHVzZWQuICBUaGUgb3RoZXJzIGFyZQotICAgICBwcmVzZW50IGZvciBhbnkgbWlzYy4gcHVycG9zZXMuICBUaGlzIGlzIG5vdCBzZXQgcmVsaWFibHksIGJ1dCBpZiBpdCBpcwotICAgICBub3QgTlVMTCwgaXQgaXMgY29ycmVjdC4gICovCi0gIGFzeW1ib2wgKipzeW1ib2xzOwotICAvKiBOdW1iZXIgb2Ygc3ltYm9scyBpbiBhcnJheS4gICovCi0gIGludCBudW1fc3ltYm9sczsKLQotICAvKiBGb3IgdXNlIGJ5IHRoZSBkaXNhc3NlbWJsZXIuCi0gICAgIFRoZSB0b3AgMTYgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIHB1YmxpYyB1c2UgKGFuZCBhcmUgZG9jdW1lbnRlZCBoZXJlKS4KLSAgICAgVGhlIGJvdHRvbSAxNiBiaXRzIGFyZSBmb3IgdGhlIGludGVybmFsIHVzZSBvZiB0aGUgZGlzYXNzZW1ibGVyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSNkZWZpbmUgSU5TTl9IQVNfUkVMT0MJMHg4MDAwMDAwMAotICBQVFIgcHJpdmF0ZV9kYXRhOwotCi0gIC8qIEZ1bmN0aW9uIHVzZWQgdG8gZ2V0IGJ5dGVzIHRvIGRpc2Fzc2VtYmxlLiAgTUVNQUREUiBpcyB0aGUKLSAgICAgYWRkcmVzcyBvZiB0aGUgc3R1ZmYgdG8gYmUgZGlzYXNzZW1ibGVkLCBNWUFERFIgaXMgdGhlIGFkZHJlc3MgdG8KLSAgICAgcHV0IHRoZSBieXRlcyBpbiwgYW5kIExFTkdUSCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCi0gICAgIElORk8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0LgotICAgICBSZXR1cm5zIGFuIGVycm5vIHZhbHVlIG9yIDAgZm9yIHN1Y2Nlc3MuICAqLwotICBpbnQgKCpyZWFkX21lbW9yeV9mdW5jKQotICAgIFBBUkFNUyAoKGJmZF92bWEgbWVtYWRkciwgYmZkX2J5dGUgKm15YWRkciwgaW50IGxlbmd0aCwKLQkgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLSAgLyogRnVuY3Rpb24gd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCBpZiB3ZSBnZXQgYW4gZXJyb3IgdGhhdCB3ZSBjYW4ndAotICAgICByZWNvdmVyIGZyb20uICBTVEFUVVMgaXMgdGhlIGVycm5vIHZhbHVlIGZyb20gcmVhZF9tZW1vcnlfZnVuYyBhbmQKLSAgICAgTUVNQUREUiBpcyB0aGUgYWRkcmVzcyB0aGF0IHdlIHdlcmUgdHJ5aW5nIHRvIHJlYWQuICBJTkZPIGlzIGEKLSAgICAgcG9pbnRlciB0byB0aGlzIHN0cnVjdC4gICovCi0gIHZvaWQgKCptZW1vcnlfZXJyb3JfZnVuYykKLSAgICBQQVJBTVMgKChpbnQgc3RhdHVzLCBiZmRfdm1hIG1lbWFkZHIsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLSAgLyogRnVuY3Rpb24gY2FsbGVkIHRvIHByaW50IEFERFIuICAqLwotICB2b2lkICgqcHJpbnRfYWRkcmVzc19mdW5jKQotICAgIFBBUkFNUyAoKGJmZF92bWEgYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotICAvKiBGdW5jdGlvbiBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgc3ltYm9sIGF0IHRoZSBnaXZlbiBBRERSLgotICAgICBJZiB0aGVyZSBpcywgdGhlIGZ1bmN0aW9uIHJldHVybnMgMSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgMC4KLSAgICAgVGhpcyBpcyB1c2VkIGJ5IHBvcnRzIHdoaWNoIHN1cHBvcnQgYW4gb3ZlcmxheSBtYW5hZ2VyIHdoZXJlCi0gICAgIHRoZSBvdmVybGF5IG51bWJlciBpcyBoZWxkIGluIHRoZSB0b3AgcGFydCBvZiBhbiBhZGRyZXNzLiAgSW4KLSAgICAgc29tZSBjaXJjdW1zdGFuY2VzIHdlIHdhbnQgdG8gaW5jbHVkZSB0aGUgb3ZlcmxheSBudW1iZXIgaW4gdGhlCi0gICAgIGFkZHJlc3MsIChub3JtYWxseSBiZWNhdXNlIHRoZXJlIGlzIGEgc3ltYm9sIGFzc29jaWF0ZWQgd2l0aAotICAgICB0aGF0IGFkZHJlc3MpLCBidXQgc29tZXRpbWVzIHdlIHdhbnQgdG8gbWFzayBvdXQgdGhlIG92ZXJsYXkgYml0cy4gICovCi0gIGludCAoKiBzeW1ib2xfYXRfYWRkcmVzc19mdW5jKQotICAgIFBBUkFNUyAoKGJmZF92bWEgYWRkciwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiBpbmZvKSk7Ci0KLSAgLyogVGhlc2UgYXJlIGZvciBidWZmZXJfcmVhZF9tZW1vcnkuICAqLwotICBiZmRfYnl0ZSAqYnVmZmVyOwotICBiZmRfdm1hIGJ1ZmZlcl92bWE7Ci0gIGludCBidWZmZXJfbGVuZ3RoOwotCi0gIC8qIFRoaXMgdmFyaWFibGUgbWF5IGJlIHNldCBieSB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2Rlci4gIEl0IHN1Z2dlc3RzCi0gICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9iamR1bXAgc2hvdWxkIGRpc3BsYXkgb24gYSBzaW5nbGUgbGluZS4gIElmCi0gICAgICB0aGUgaW5zdHJ1Y3Rpb24gZGVjb2RlciBzZXRzIHRoaXMsIGl0IHNob3VsZCBhbHdheXMgc2V0IGl0IHRvCi0gICAgICB0aGUgc2FtZSB2YWx1ZSBpbiBvcmRlciB0byBnZXQgcmVhc29uYWJsZSBsb29raW5nIG91dHB1dC4gICovCi0gIGludCBieXRlc19wZXJfbGluZTsKLQotICAvKiB0aGUgbmV4dCB0d28gdmFyaWFibGVzIGNvbnRyb2wgdGhlIHdheSBvYmpkdW1wIGRpc3BsYXlzIHRoZSByYXcgZGF0YSAqLwotICAvKiBGb3IgZXhhbXBsZSwgaWYgYnl0ZXNfcGVyX2xpbmUgaXMgOCBhbmQgYnl0ZXNfcGVyX2NodW5rIGlzIDQsIHRoZSAqLwotICAvKiBvdXRwdXQgd2lsbCBsb29rIGxpa2UgdGhpczoKLSAgICAgMDA6ICAgMDAwMDAwMDAgMDAwMDAwMDAKLSAgICAgd2l0aCB0aGUgY2h1bmtzIGRpc3BsYXllZCBhY2NvcmRpbmcgdG8gImRpc3BsYXlfZW5kaWFuIi4gKi8KLSAgaW50IGJ5dGVzX3Blcl9jaHVuazsKLSAgZW51bSBiZmRfZW5kaWFuIGRpc3BsYXlfZW5kaWFuOwotCi0gIC8qIFJlc3VsdHMgZnJvbSBpbnN0cnVjdGlvbiBkZWNvZGVycy4gIE5vdCBhbGwgZGVjb2RlcnMgeWV0IHN1cHBvcnQKLSAgICAgdGhpcyBpbmZvcm1hdGlvbi4gIFRoaXMgaW5mbyBpcyBzZXQgZWFjaCB0aW1lIGFuIGluc3RydWN0aW9uIGlzCi0gICAgIGRlY29kZWQsIGFuZCBpcyBvbmx5IHZhbGlkIGZvciB0aGUgbGFzdCBzdWNoIGluc3RydWN0aW9uLgotCi0gICAgIFRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgZGVjb2RlciBzdXBwb3J0cyB0aGlzIGluZm9ybWF0aW9uLCBzZXQKLSAgICAgaW5zbl9pbmZvX3ZhbGlkIHRvIDAsIGRlY29kZSBhbiBpbnN0cnVjdGlvbiwgdGhlbiBjaGVjayBpdC4gICovCi0KLSAgY2hhciBpbnNuX2luZm9fdmFsaWQ7CQkvKiBCcmFuY2ggaW5mbyBoYXMgYmVlbiBzZXQuICovCi0gIGNoYXIgYnJhbmNoX2RlbGF5X2luc25zOwkvKiBIb3cgbWFueSBzZXF1ZW50aWFsIGluc24ncyB3aWxsIHJ1biBiZWZvcmUKLQkJCQkgICBhIGJyYW5jaCB0YWtlcyBlZmZlY3QuICAoMCA9IG5vcm1hbCkgKi8KLSAgY2hhciBkYXRhX3NpemU7CQkvKiBTaXplIG9mIGRhdGEgcmVmZXJlbmNlIGluIGluc24sIGluIGJ5dGVzICovCi0gIGVudW0gZGlzX2luc25fdHlwZSBpbnNuX3R5cGU7CS8qIFR5cGUgb2YgaW5zdHJ1Y3Rpb24gKi8KLSAgYmZkX3ZtYSB0YXJnZXQ7CQkvKiBUYXJnZXQgYWRkcmVzcyBvZiBicmFuY2ggb3IgZHJlZiwgaWYga25vd247Ci0JCQkJICAgemVybyBpZiB1bmtub3duLiAgKi8KLSAgYmZkX3ZtYSB0YXJnZXQyOwkJLyogU2Vjb25kIHRhcmdldCBhZGRyZXNzIGZvciBkcmVmMiAqLwotCi0gIC8qIENvbW1hbmQgbGluZSBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSB0YXJnZXQgZGlzYXNzZW1ibGVyLiAgKi8KLSAgY2hhciAqIGRpc2Fzc2VtYmxlcl9vcHRpb25zOwotCi19IGRpc2Fzc2VtYmxlX2luZm87Ci0KLQwKLS8qIFN0YW5kYXJkIGRpc2Fzc2VtYmxlcnMuICBEaXNhc3NlbWJsZSBvbmUgaW5zdHJ1Y3Rpb24gYXQgdGhlIGdpdmVuCi0gICB0YXJnZXQgYWRkcmVzcy4gIFJldHVybiBudW1iZXIgb2YgYnl0ZXMgcHJvY2Vzc2VkLiAgKi8KLXR5cGVkZWYgaW50ICgqZGlzYXNzZW1ibGVyX2Z0eXBlKQotICAgICBQQVJBTVMoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1leHRlcm4gaW50IHByaW50X2luc25fYmlnX21pcHMJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX21pcHMJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pMzg2X2F0dAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9pMzg2X2ludGVsCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbTY4awkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl96ODAwMQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl96ODAwMgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODMwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9oODMwMGgJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faDgzMDBzCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2g4NTAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2FscGhhCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGRpc2Fzc2VtYmxlcl9mdHlwZSBhcmNfZ2V0X2Rpc2Fzc2VtYmxlciBQQVJBTVMgKChpbnQsIGludCkpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19hcm0JCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbGl0dGxlX2FybQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3NwYXJjCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2JpZ19hMjlrCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX2xpdHRsZV9hMjlrCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faTk2MAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9zaAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9zaGwJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25faHBwYQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9mcjMwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX20zMnIJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbTg4awkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tY29yZQkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9tbjEwMjAwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX21uMTAzMDAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fbnMzMmsJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fYmlnX3Bvd2VycGMJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYwlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3JzNjAwMAkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl93NjUJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fZDEwdgkJUEFSQU1TICgoYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyopKTsKLWV4dGVybiBpbnQgcHJpbnRfaW5zbl9kMzB2CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3Y4NTAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdGljMzAJCVBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci1leHRlcm4gaW50IHByaW50X2luc25fdmF4CQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotZXh0ZXJuIGludCBwcmludF9pbnNuX3RpYzgwCQlQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvKikpOwotCi1leHRlcm4gaW50IGFybV90b2dnbGVfcmVnbmFtZXMgICAgICAgICAgUEFSQU1TICgodm9pZCkpOwotCi0vKiBGZXRjaCB0aGUgZGlzYXNzZW1ibGVyIGZvciBhIGdpdmVuIEJGRCwgaWYgdGhhdCBzdXBwb3J0IGlzIGF2YWlsYWJsZS4gICovCi1leHRlcm4gZGlzYXNzZW1ibGVyX2Z0eXBlIGRpc2Fzc2VtYmxlcglQQVJBTVMgKChiZmQgKikpOwotCi0MCi0vKiBUaGlzIGJsb2NrIG9mIGRlZmluaXRpb25zIGlzIGZvciBwYXJ0aWN1bGFyIGNhbGxlcnMgd2hvIHJlYWQgaW5zdHJ1Y3Rpb25zCi0gICBpbnRvIGEgYnVmZmVyIGJlZm9yZSBjYWxsaW5nIHRoZSBpbnN0cnVjdGlvbiBkZWNvZGVyLiAgKi8KLQotLyogSGVyZSBpcyBhIGZ1bmN0aW9uIHdoaWNoIGNhbGxlcnMgbWF5IHdpc2ggdG8gdXNlIGZvciByZWFkX21lbW9yeV9mdW5jLgotICAgSXQgZ2V0cyBieXRlcyBmcm9tIGEgYnVmZmVyLiAgKi8KLWV4dGVybiBpbnQgYnVmZmVyX3JlYWRfbWVtb3J5Ci0gIFBBUkFNUyAoKGJmZF92bWEsIGJmZF9ieXRlICosIGludCwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIGdvZXMgd2l0aCBidWZmZXJfcmVhZF9tZW1vcnkuCi0gICBJdCBwcmludHMgYSBtZXNzYWdlIHVzaW5nIGluZm8tPmZwcmludGZfZnVuYyBhbmQgaW5mby0+c3RyZWFtLiAgKi8KLWV4dGVybiB2b2lkIHBlcnJvcl9tZW1vcnkgUEFSQU1TICgoaW50LCBiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLQotLyogSnVzdCBwcmludCB0aGUgYWRkcmVzcyBpbiBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MgZXZlbgotICAgdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0byBwcmludCBzeW1ib2xpYwotICAgYWRkcmVzc2VzKS4gICovCi1leHRlcm4gdm9pZCBnZW5lcmljX3ByaW50X2FkZHJlc3MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBBbHdheXMgdHJ1ZS4gICovCi1leHRlcm4gaW50IGdlbmVyaWNfc3ltYm9sX2F0X2FkZHJlc3MKLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi0vKiBNYWNybyB0byBpbml0aWFsaXplIGEgZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3QuICBUaGlzIHNob3VsZCBiZSBjYWxsZWQKLSAgIGJ5IGFsbCBhcHBsaWNhdGlvbnMgY3JlYXRpbmcgc3VjaCBhIHN0cnVjdC4gICovCi0jZGVmaW5lIElOSVRfRElTQVNTRU1CTEVfSU5GTyhJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykgXAotICAoSU5GTykuZmxhdm91ciA9IGJmZF90YXJnZXRfdW5rbm93bl9mbGF2b3VyLCBcCi0gIChJTkZPKS5hcmNoID0gYmZkX2FyY2hfdW5rbm93biwgXAotICAoSU5GTykubWFjaCA9IDAsIFwKLSAgKElORk8pLmVuZGlhbiA9IEJGRF9FTkRJQU5fVU5LTk9XTiwgXAotICBJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSChJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykKLQotLyogQ2FsbCB0aGlzIG1hY3JvIHRvIGluaXRpYWxpemUgb25seSB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIGZvciB0aGUKLSAgIGRpc2Fzc2VtYmxlci4gIEFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgdGhpbmdzIHN1Y2ggYXMgYnl0ZSBvcmRlciwgb3IgbWFjaGluZQotICAgdmFyaWFudCBhcmUgbm90IHRvdWNoZWQgYnkgdGhpcyBtYWNyby4gIFRoaXMgbWFrZXMgdGhpbmdzIG11Y2ggZWFzaWVyIGZvcgotICAgR0RCIHdoaWNoIG11c3QgaW5pdGlhbGl6ZSB0aGVzZSB0aGluZ3Mgc2VwZXJhdGx5LiAgKi8KLQotI2RlZmluZSBJTklUX0RJU0FTU0VNQkxFX0lORk9fTk9fQVJDSChJTkZPLCBTVFJFQU0sIEZQUklOVEZfRlVOQykgXAotICAoSU5GTykuZnByaW50Zl9mdW5jID0gKGZwcmludGZfZnR5cGUpKEZQUklOVEZfRlVOQyksIFwKLSAgKElORk8pLnN0cmVhbSA9IChQVFIpKFNUUkVBTSksIFwKLSAgKElORk8pLnN5bWJvbHMgPSBOVUxMLCBcCi0gIChJTkZPKS5udW1fc3ltYm9scyA9IDAsIFwKLSAgKElORk8pLmJ1ZmZlciA9IE5VTEwsIFwKLSAgKElORk8pLmJ1ZmZlcl92bWEgPSAwLCBcCi0gIChJTkZPKS5idWZmZXJfbGVuZ3RoID0gMCwgXAotICAoSU5GTykucmVhZF9tZW1vcnlfZnVuYyA9IGJ1ZmZlcl9yZWFkX21lbW9yeSwgXAotICAoSU5GTykubWVtb3J5X2Vycm9yX2Z1bmMgPSBwZXJyb3JfbWVtb3J5LCBcCi0gIChJTkZPKS5wcmludF9hZGRyZXNzX2Z1bmMgPSBnZW5lcmljX3ByaW50X2FkZHJlc3MsIFwKLSAgKElORk8pLnN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgPSBnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzLCBcCi0gIChJTkZPKS5mbGFncyA9IDAsIFwKLSAgKElORk8pLmJ5dGVzX3Blcl9saW5lID0gMCwgXAotICAoSU5GTykuYnl0ZXNfcGVyX2NodW5rID0gMCwgXAotICAoSU5GTykuZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX1VOS05PV04sIFwKLSAgKElORk8pLmluc25faW5mb192YWxpZCA9IDAKLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoRElTX0FTTV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvQ2hhbmdlTG9nIGIvaW5jbHVkZS9lbGYvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ0ZGRkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi1Nb24gSnVuIDIxIDE2OjM2OjAyIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChlbGZfaHBwYV9yZWxvY190eXBlKTogUmVuYW1lZCBmcm9tIGVsZjMyX2hwcGFfcmVsb2NfdHlwZS4KLQotMTk5OS0wNi0xMCAgSmFrdWIgSmVsaW5layAgPGpqQHVsdHJhLmxpbnV4LmN6PgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX21heF9zdGQpOiBEZWZpbmUuCi0KLVdlZCBKdW4gIDkgMTU6MTY6MzQgMTk5OSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IFVwZGF0ZSB3aXRoIHZhcmlvdXMgY2hhbmdlcyBmcm9tIG5ld2VzdCBQQSBFTEYKLQlzcGVjaWZpY2F0aW9ucy4KLQotMTk5OS0wNi0wMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9QUEM2NCk6IERlZmluZS4KLQotMTk5OS0wNi0wMiAgU3R1IEdyb3NzbWFuICA8Z3Jvc3NtYW5AYmFieWxvbi01LmN5Z251cy5jb20+Ci0KLQkqIGR3YXJmLmg6IEFkZCBMQU5HX0pBVkEuCi0JKiBkd2FyZjIuaDogQWRkIERXX0xBTkdfSmF2YS4KLQotMTk5OS0wNS0yOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVMRk9TQUJJX0FSTSk6IERlZmluZS4KLQotMTk5OS0wNS0yOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmg6IFVwZGF0ZSBjb21tZW50LgotCi0xOTk5LTA1LTI4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHplbWJ1LmNvbT4KLQotCSogaTk2MC5oOiBOZXcgZmlsZS4KLQotMTk5OS0wNS0xNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoUl9NQ09SRV9DT1BZKTogRGVmaW5lLgotCShSX01DT1JFX0dMT0JfREFUKTogRGVmaW5lLgotCShSX01DT1JFX0pVTVBfU0xPVCk6IERlZmluZS4KLQotMTk5OS0wNS0xNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaCAoUl9NQ09SRV9SRUxBVElWRSk6IERlZmluZS4KLQotOTk5LTA1LTA1ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLSAKLSAgICAgICAgKiBtNjhrLmggKEVGX0NQVTMyKTogRGVmaW5lLgotIAotMTk5OS0wNC0yMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogcmVsb2MtbWFjcm9zLmggKFNUQVJUX1JFTE9DX05VTUJFUlMpOiBQcmVwZW5kIGFuIHVuZGVyc2NvcmUgdG8KLQlmYWtlIHJlbG9jIGVudHJ5IG5hbWUgKGlmIHBvc3NpYmxlKSwgaW4gb3JkZXIgdG8gYXZvaWQgY29uZmxpY3RzCi0Jd2l0aCB0eXBlZGVmcyBvZiB0aGUgc2FtZSBuYW1lLgotCi0xOTk5LTA0LTE2ICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTXzMyQklUTU9ERSk6IE5ldy4KLQotMTk5OS0wNC0wOCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbWNvcmUuaDogTmV3IGhlYWRlciBmaWxlLiAgRGVmaW5lcyBmb3IgTW90b3JvbGxhJ3MgTUNvcmUKLQlwcm9jZXNzb3IuIAotCi0xOTk5LTA0LTA4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIG5ldyBjb25zdGFudHMgZGVmaW5lZCBpbjogIlN5c3RlbSBWIEFwcGxpY2F0aW9uCi0JQmluYXJ5IEludGVyZmFjZSAtIERSQUZUIC0gQXByaWwgMjksIDE5OTgiIGZvdW5kIGF0IHRoZSB3ZWIgc2l0ZTogCi0JaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3Blci9nYWJpL2NvbnRlbnRzLmh0bWwKLQotCShFTV9NTUEpOiBSZW1vdmVkLiAgUmVwbGFjZWQgd2l0aCBFTV9NQ09SRSBhcyBNb3Rvcm9sbGEgb3duIHRoaXMKLQl2YWx1ZS4gCi0KLTE5OTktMDMtMzEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHJlbG9jLW1hY3Jvcy5oOiBGaXhlZCB0byBub3QgZ2VuZXJhdGUgYW4gZW51bSB3aXRoIGEgdHJhaWxpbmcKLQljb21tYS4gCi0KLTE5OTktMDMtMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVfTUlQU19NQUNIXzUwMDApOiBOZXcuCi0KLTE5OTktMDMtMTAgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIGRlZmluaXRpb25zIGZvciBhIGZldyBtb3JlIFNvbGFyaXMgRUxGIGV4dGVuc2lvbnMuCi0KLVRodSBGZWIgMTggMTg6NTg6MjYgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBleHRlcm5hbC5oOiBPbmx5IHVzZSBhdHRyaWJ1dGUgaWYgX19HTlVDX18gaXMgZGVmaW5lZC4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCVBhdGNoIHN1Ym1pdHRlZCBieTogU2NvdHQgQmFtYnJvdWdoIDxzY290dGJAY29yZWxjb21wdXRlci5jb20+Ci0KLQkqIGVsZi9leHRlcm5hbC5oOiBzdHJ1Y3QgRWxmX0V4dGVybmFsX1ZlcnN5bSBtdXN0IGJlIHBhY2tlZCBvbgotCUFSTS4gIENvZGUgdXNlcyBzaXplb2YoRWxmX0V4dGVybmFsX1ZlcnN5bSkgYW5kIGFzc3VtZXMgaXQgaXMKLQllcXVhbCB0byBzaXplb2YoY2hhclsyXSkuICBSZXBvcnRlZCBieSBKaW0gUGljayA8amltQGppbXBpY2suY29tPgotCi0xOTk5LTAyLTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaCAoRFdBUkYyX0V4dGVybmFsX0FSYW5nZSk6IE5ldyBzdHJ1Y3R1cmUuCi0JKERXQVJGMl9JbnRlcm5hbF9BUmFuZ2UpOiBOZXcgc3RydWN0dXJlLgotCi1Nb24gRmViICAxIDExOjMzOjU2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6ICBSZW51bWJlciByZWxvY3MgdG8gY29uZm9ybSB0byBzdGFuZGFyZC4KLSAgICAgICAgKEVGX05FV19BQkkpOiAgRGVmaW5lLgotICAgICAgICAoRUZfT0xEX0FCSSk6ICBEZWZpbmUuCi0gICAgICAgICogYXJtLW9hYmkuaDogIE5ldyBmaWxlLgotCi0xOTk5LTAxLTI4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBmcjMwLmg6IEFkZCBSX0ZSMzBfR05VX1ZUe0lOSEVSSVQsRU5UUll9IHJlbG9jcy4KLQotMTk5OS0wMS0yNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZHdhcmYyLmg6IEFkZCB0eXBlZGVmcyBmb3Igc3RydWN0dXJlcyBmb3VuZCBpbiBkd2FyZjIgc2VjdGlvbnMuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVfTUlQU19NQUNIXzQxMTEpOiBOZXcuCi0KLTE5OTgtMTItMTUgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfQUJJLEVfTUlQU19BQklfTzMyLEVfTUlQU19BQklfTzY0LAotCUVfTUlQU19BQklfRUFCSTMyLEVfTUlQU19BQklfRUFCSTY0KToKLQotMTk5OC0xMi0wMyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZnIzMC5oOiBBZGQgUl9GUjMwXzQ4IHJlbG9jLgotCi0xOTk4LTEyLTAyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgZXh0ZXJuYWwgZGF0YSB0eXBlIGZvciBjb25mbGljdCBzZWN0aW9uLgotCi0JKiBtaXBzLmg6IEFkZCBtb3JlIExMXyogb3B0aW9ucyBmcm9tIElyaXggNi41LgotCi0JKiBtaXBzLmg6IEFkZCBSX01JUFNfSkFMUiBhbmQgYWRqdXN0IFJfTUlQU19tYXggYXBwcm9wcmlhdGVseS4KLQotVHVlIE5vdiAxMCAxNToxMjoyOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBSZWR1Y2UgdG8gYSAxNiBiaXQgdmFsdWUuCi0KLVR1ZSBOb3YgMTAgMTU6MTc6MjggMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBkMTB2Lmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotV2VkIE5vdiAgNCAxNTo1Njo1MCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0ZSMzApOiBOZXcgbWFjaGluZSBudW1iZXIuCi0KLQkqIGZyMzAuaDogTmV3IGZpbGU6IERlZmluaXRpb25zIGZvciB0aGUgRlIzMC4KLQotRnJpIE9jdCAzMCAxMTo1NDoxNSAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICBGcm9tIFBoaWxpcCBCbHVuZGVsbCA8cGJAbmV4dXMuY28udWs+OgotICAgICAgICAqIGFybS5oIChSX0FSTV9DT1BZLCBldCBhbC4pOiBOZXcgcmVsb2NzLCB1c2VkIGJ5IExpbnV4IGZvciBQSUMuCi0gICAgICAgIChFRl9BTElHTjgpOiBOZXcgZmxhZy4KLQotVHVlIE9jdCAyMCAxMToxOTo1MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChOVF9MV1BTVEFUVVMpOiBDbG9zZSBjb21tZW50IGFjY2lkZW50YWxseSBsZWZ0IG9wZW4uCi0KLU1vbiBPY3QgMTkgMjA6MjQ6MTEgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzaC5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBPY3QgMTkgMDE6NDQ6NDIgMTk5OCAgRmVsaXggTGVlICA8ZmxlZUBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoTlRfUFNUQVRVUywgTlRfRlBSRUdTLCBOVF9QU0lORk8sCi0gCU5UX0xXUFNUQVRVUyxOVF9MV1BTSU5GTyk6IGFkZGVkLgotCSogaW50ZXJuYWwuaCAoRWxmX0ludGVybmFsX05vdGUpOiBuZXcgc3RydWN0dXJlIG1lbWJlcnMuCi0KLUZyaSBPY3QgMTYgMTQ6MTE6MjUgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBtMzJyLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotVHVlIE9jdCAgNiAwOToyMjoyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNwYXJjLmg6ICBBZGQgdnRhYmxlIHJlbG9jcy4KLQotTW9uIE9jdCAgNSAwOTozOToyMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHY4NTAuaDogIEFkZCB2dGFibGUgcmVsb2NzLgotCi1TdW4gT2N0ICA0IDIxOjE3OjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChSXzM4Nl9tYXgpOiBDaGFuZ2UgZnJvbSAyNTIgdG8gMjQuCi0KLU1vbiBTZXAgMjEgMTI6MjQ6NDQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBpMzg2Lmg6ICBDaGFuZ2UgdnRhYmxlIHJlbG9jIG51bWJlcnMuCi0KLVN1biBTZXAgMjAgMDA6NTQ6MjIgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGsuaDogQWRkIHZ0YWJsZSByZWxvY3MgYW5kIFJfNjhLX21heC4KLQotVHVlIFNlcCAxNSAwOTo1Njo0OSBDRFQgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGFybS5oOiAgQWRkIHZ0YWJsZSByZWxvY3MuCi0KLU1vbiBBdWcgMzEgMTE6MjU6MjcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0uaDogIERlZmluZSBTVFRfQVJNX1RGVU5DLiAgUmVtb3ZlIFNUX1RIVU1CX3h4eHgKLSAgICAgICAgZGVmaW5pdGlvbnMuCi0KLVNhdCBBdWcgMjkgMjI6MjU6NTEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgdnRhYmxlIHJlbG9jcy4KLQotMTk5OC0wOC0yNSAxNjo0MiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oOiBBZGQgU1lNSU5GT18qIG1hY3JvcyB0byBhY2Nlc3MgRWxmKl9TeW1pbmZvIGluZm9ybWF0aW9uLgotCi0JKiBleHRlcm5hbC5oOiBBZGQgRWxmX0V4dGVybmFsX1N5bWluZm8gZGVmaW5pdGlvbi4KLQotCSogaW50ZXJuYWwuaDogQWRkIEVsZl9JbnRlcm5hbF9TeW1pbmZvLCBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvLAotCWFuZCBFbGY2NF9TeW1pbmZvIGRlZmluaXRpb25zLgotCi1TdW4gQXVnICA5IDIwOjI2OjQ5IENEVCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICogYXJtLmg6ICBBZGQgU1RfVEhVTUIgZGVmaW5pdGlvbnMuCi0KLVdlZCBBdWcgIDUgMTU6NTI6MzUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLmg6IEFkZCBFTEYgaGVhZGVyIGZsYWdzIHRvIHNwZWNpZnkgY29tcGlsZSB0aW1lIG9wdGluczoKLQlFRl9JTlRFUldPUks6IE5ldyBmbGFnLgotCUVGX0FQQ1NfMjY6IE5ldyBmbGFnLgotCUVGX0FQQ1NfRkxPQVQ6IE5ldyBmbGFnLgotCUVGX1BJQzogTmV3IGZsYWcuCi0KLTE5OTgtMDctMzEgMjE6MjggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBtaXNzaW5nIFJIRl8qIGNvbnN0YW50cy4KLQotRnJpIEp1bCAzMSAxMDowMTo0MCAxOTk4IENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLmg6IEFkZCBSX0FSTV9USE1fUEM5IHJlbG9jYXRpb24uCi0KLTE5OTgtMDctMzAgMTY6MjUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogQWRkIG5ldyBEVF8qIGVudHJpZXMgYW5kIHRoZXJlIGZsYWcgbWFjcm9zIGZyb20gU29sYXJpcy4KLQotVHVlIEp1bCAyOCAxODoxNDowNyAxOTk4ICBTdGFuIENveCAgPHNjb3hAZXF1aW5veC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oOiAoUl9TUEFSQ19SRVYzMik6IEFkZGVkIGZvciBsaXR0bGUgZW5kaWFuIGRhdGEgZS5nLiBzcGFyYyA4NnguCi0KLUZyaSBKdWwgMjQgMTE6MjI6MDYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IEFkZCBSX01OMTAzMDBfMjQgcmVsb2NhdGlvbi4KLQotMTk5OC0wNy0yNCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQWRkIE1JUFM2NCByZWxvY2F0aW9uIG5hbWVzIGFuZCB2YWx1ZXMuCi0KLVdlZCBKdWwgMjIgMTk6Mjk6MDAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBhcm0uaDogUmVuYW1lIHJlbG9jYXRpb25zLgotCi0xOTk4LTA3LTIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogcHBjLmg6IERlZmluZSBlbnVtIGFzIGVsZl9wcGNfcmVsb2NfdHlwZS4KLQotV2VkIEp1bCAyMiAxNjoyMjoxMSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiByZWxvYy1tYWNyb3MuaDogTmV3IGZpbGUuICBQcm92aWRlcyByZWxvY2F0aW9uIG1hY3JvczoKLQlTVEFSVF9SRUxPQ19OVU1CRVJTLCBSRUxPQ19OVU1CRVIsIEZBS0VfUkVMT0MsIEVNUFRZX1JFTE9DIGFuZAotCUVORF9SRUxPQ19OVU1CRVJTIHVzZWQgYnkgb3RoZXIgZWxmIGhlYWRlciBmaWxlcy4KLQotCSogYWxwaGEuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogYXJjLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGFybS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBkMTB2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIGQzMHYuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogaHBwYS5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBpMzg2Lmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG0zMnIuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbTY4ay5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBtaXBzLmg6IFVzZSByZWxvYy1tYWNyb3MuaC4KLQkqIG1uMTAyMDAuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogbW4xMDMwMC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0JKiBwcGMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogc2guaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogc3BhcmMuaDogVXNlIHJlbG9jLW1hY3Jvcy5oLgotCSogdjg1MC5oOiBVc2UgcmVsb2MtbWFjcm9zLmguCi0KLTE5OTgtMDctMjIgMTM6MDcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtbjEwMzAwLmg6IFJld3JpdGUgcmVsb2NhdGlvbiBkZWZpbml0aW9uIHVzaW5nIG1hY3Jvcy4KLQkqIG1pcHMuaDogTGlrZXdpc2UuCi0JKiBwcGMuaDogTGlrZXdpc2UuCi0JKiBhbHBoYS5oOiBMaWtld2lzZS4KLQkqIGFybS5oOiBMaWtld2lzZS4KLQkqIGQxMHYuaDogTGlrZXdpc2UuCi0JKiBkMzB2Lmg6IExpa2V3aXNlLgotCSogbTMyci5oOiBMaWtld2lzZS4KLQkqIG02OGsuaDogTGlrZXdpc2UuCi0JKiBtbjEwMjAwLmg6IExpa2V3aXNlLgotCSogc2guaDogTGlrZXdpc2UuCi0JKiBzcGFyYy5oOiBMaWtld2lzZS4KLQotMTk5OC0wNy0yMSAxMzowNyAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGFybS5oOiBOZXcgZmlsZS4KLQkqIGQxMHYuaDogTmV3IGZpbGUuCi0JKiBkMzB2Lmg6IE5ldyBmaWxlLgotCSogaTM4Ni5oOiBOZXcgZmlsZS4KLQkqIG02OGsuaDogTmV3IGZpbGUuCi0JKiBtbjEwMjAwLmg6IE5ldyBmaWxlLgotCSogc2guaDogTmV3IGZpbGUuCi0KLQkqIG1pcHMuaDogQWRkIFJfTUlQU18qIGFuZCBTSFRfTUlQU18qIGVudHJpZXMuCi0KLQkqIG1uMTAzMDAuaDogQWRkIFJfTU4xMDMwMF8qIGVudHJpZXMuCi0KLQkqIHBwYy5oOiBBZGQgUl9QUENfKiBlbnRyaWVzLgotCi0xOTk4LTA3LTIwIDA3OjExICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oOiBBZGQgT0RLXyosIE9FWF8qLCBPUEFEXyosIE9IV18qLCBhbmQgT0dQXyogY29uc3RhbnRzLgotCURlZmluZSBFbGYzMl9FeHRlcm5hbF9MaWIuCi0KLTE5OTgtMDctMTkgMTU6MjQgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFBUX01JUFNfT1BUSU9OUyk6IE5ldyBzeW1ib2wuCi0JQWRkIGxvdHMgb2YgRFRfTUlQU18qIHN5bWJvbHMuCi0KLUZyaSBKdW4gMjYgMTA6NDY6MzUgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmg6IE5ldyBmaWxlLgotCi1UaHUgSnVuIDE4IDE5OjI3OjU2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV85NjAsIEVNX1Y4MDAsIEVNX0ZSMjAsIEVNX1JIMzIsIEVNX01NQSwKLQlFTV9PTERfQUxQSEEpOiBBZGQgdGhlc2UgY29uc3RhbnRzLgotCi1UaHUgSnVuIDExIDE3OjU5OjAxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV80ODYsIEVNX1MzNzApOiBBZGQgdGhlc2UgY29uc3RhbnRzLgotCi1UdWUgSnVuICA5IDA5OjM1OjI5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9BUk0pOiBBZGQgdGhpcyBjb25zdGFudC4KLQotV2VkIE1heSAgNiAwOTo0NTozMCAxOTk4ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFRl9NSVBTX01BQ0gsRV9NSVBTX01BQ0hfKik6IEFkZGVkLgotCi1TYXQgQXByIDI1IDE4OjM1OjA2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLmggKFNUT19BTFBIQV9OT1BWLCBTVE9fQUxQSEFfU1REX0dQTE9BRCk6IE5ldy4KLQotV2VkIEFwciAxNSAxNTo0Mjo0NSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fU1BBUkM2NCk6IE1vdmUgYW5kIHJlbmFtZSB0byBFTV9PTERfU1BBUkNWOS4KLQkoRU1fU1BBUkNWOSk6IE5ldy4gIFRoaXMgaXMgdGhlIG9mZmljaWFsIEFCSSBuYW1lIGFuZCBudW1iZXIuCi0KLVNhdCBGZWIgMjggMTc6MDQ6NDEgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEuaCAoRUZfQUxQSEFfMzJCSVQsIEVGX0FMUEhBX0NBTlJFTEFYKTogTmV3LgotCi1Nb24gRGVjIDE1IDE1OjA3OjQ5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoRUZfTTMyUl9BUkNILCBFX00zMlJfQVJDSCk6IE5ldyBmbGFncyB0bwotCXNwZWNpZnkgbWFjaGluZSBhcmNoaXRlY3R1cmUuCi0KLUZyaSBEZWMgIDUgMTE6MjA6MDggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBOZXcgY29uc3RhbnRzOiBTSE5fVjg1MF9TQ09NTU9OLCBTSE5fVjg1MF9UQ09NTU9OLAotCVNITl9WODUwX1pDT01NT04sIFNIVF9WODUwX1NDT01NT04sIFNIVF9WODUwX1RDT01NT04sCi0JU0hUX1Y4NTBfWkNPTU1PTiB0byBoYW5kbGUgdjg1MCBjb21tb24gc2VjdGlvbnMuCi0JZW51bSByZWxvY190eXBlIHJlbmFtZWQgdG8gdjg1MF9yZWxvY190eXBlIHRvIGF2b2lkIG5hbWUKLQljb25mbGljdC4KLQotVGh1IE9jdCAyMyAxMzo1NToyNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIGVsZl9zcGFyY19yZWxvY190eXBlKTogQWRkIFVBNjQgJiBVQTE2LgotCi1UaHUgT2N0IDIzIDAwOjQyOjA0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGRvdC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChEVF9TUEFSQ19SRUdJU1RFUik6IE5ldyBtYWNyby4KLQkoRFRfU1BBUkNfUExURk1UKTogSW4gc3VwcG9ydCBvZiBvbGQgc3BhcmM2NC1saW51eCAucGx0czsgd2lsbAotCWdvIGF3YXkgc29vbi4KLQotVHVlIFNlcCAzMCAxMzoyNjo1OCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChFRl9TUEFSQ19IQUxfUjEsIEVGX1NQQVJDX0VYVF9NQVNLKTogTmV3IG1hY3Jvcy4KLQkoRUZfU1BBUkNWOV97TU0sVFNPLFBTTyxSTU99KTogTmV3IG1hY3Jvcy4KLQkoU0hOX0JFRk9SRSxTSE5fQUZURVIpOiBOZXcgbWFjcm9zLgotCShTSEZfRVhDTFVERSxTSEZfT1JERVJFRCk6IE5ldyBtYWNyb3MuCi0JKFNUVF9SRUdJU1RFUik6IE5ldyBtYWNyby4KLQkoUl9TUEFSQ19HTE9CX0pNUCk6IERlbGV0ZWQsIGJ1dCBzbG90IHJlc2VydmVkLgotCShSX1NQQVJDX3tESVNQNjQsUExUNjQsSElYMjIsTE9YMTB9KTogTmV3IHJlbG9jYXRpb25zLgotCShSX1NQQVJDX3tINDQsTTQ0LEw0NCxSRUdJU1RFUn0pOiBOZXcgcmVsb2NhdGlvbnMuCi0JKEVMRjY0X1JfVFlQRV97REFUQSxJRCxJTkZPfSk6IE5ldyBtYWNyb3MuCi0KLVdlZCBTZXAgMTcgMTY6NDE6NDIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBBZGQgUl9WODUwX0NBTExUXzZfN19PRkZTRVQgYW5kIFJfVjg1MF9DQUxMVF8xNl8xNl9PRkZTRVQuCi0KLVR1ZSBTZXAgMTYgMTQ6MTY6MTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogQWRkIFJfVjg1MF9UREFfMTZfMTZfT0ZGU0VULgotCi1XZWQgU2VwICAzIDE1OjExOjE0IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQuCi0KLVdlZCBTZXAgIDMgMTE6MjU6NTcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChyZWxvY190eXBlKTogUmVtb3ZlIFJfVjg1MF8xNl9QQ1JFTC4KLQotVHVlIFNlcCAgMiAxNzo0MTowNSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEUuCi0JKiBjb21tb24uaDogUmVtb3ZlIG1hZ2ljIG51bWJlciBmb3IgVjg1MEVBLgotCSogdjg1MC5oOiBBZGQgbmV3IGZsYWdzIGZvciBlX2ZsYWdzIGZpZWxkIGluIGVsZiBoZWFkZXIuCi0KLU1vbiBBdWcgMjUgMTY6MDY6NDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19WODUwRSk6IGJhY2tlbmQgbWFnaWMgbnVtYmVyIGZvciB2ODUwZS4KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfVjg1MEVBKTogYmFja2VuZCBtYWdpYyBudW1iZXIgZm9yIHY4NTBlYS4KLQotTW9uIEF1ZyAxOCAxMTowNToyMyAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHJlbG9jX3R5cGUpOiBBZGQgMTYgYml0IFBDIHJlbGF0aXZlIHJlbG9jYXRpb24uCi0KLUZyaSBBdWcgMTUgMDU6MTA6MDkgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogYXJjLmggKGVudW0gcmVsb2MpOiBNb3ZlIGhlcmUgZnJvbSBlbGYzMi1hcmMuYy4KLQotRnJpIEF1ZyAgOCAxNzowNToyOSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcmMuaDogTmV3IGZpbGUuCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX0FSQyk6IERlZmluZS4KLQotTW9uIEp1biAxNiAxNDo0NjoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9FaGRyKTogQ2hhbmdlIGVfcGhvZmYgYW5kIGVfc2hvZmYgZnJvbQotCWJmZF9zaWduZWRfdm1hIHRvIGJmZF9zaXplX3R5cGUsIGFzIHRoZXkgYXJlIG5vdCBzaWduZWQuCi0KLVdlZCBNYXIgIDUgMTU6MzU6MjYgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoU0hGX00zMlJfQ0FOX1JFTEFYKTogRGVmaW5lLgotCi1Nb24gRmViIDI0IDE3OjQ5OjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZXh0ZXJuYWwuaDogRHVtcCB0aGUgMzIvNjQgYml0IHNwZWNpZmljIGZvcm1zIG9mIHRoZSB2ZXJzaW9uCi0Jc3RydWN0dXJlcywgYW5kIGp1c3QgZGVmaW5lIHRoZW0gYXMgc2l6ZSBpbmRlcGVuZGVudC4KLQotCSogY29tbW9uLmggKFZFUlNZTV9ISURERU4sIFZFUlNZTV9WRVJTSU9OKTogRGVmaW5lLgotCi1GcmkgRmViIDIxIDEzOjAwOjM0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnIuaCAoZW51bSByZWxvY190eXBlKTogQWRkIFJfTTMyUl9TREExNi4KLQkoU0hOX00zMlJfU0NPTU1PTik6IERlZmluZS4KLQotV2VkIEZlYiAxOSAxNTozNTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEVyaWMgWW91bmdkYWxlIDxlcmljQGFuZGFudGUuamljLmNvbT46Ci0JKiBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBjb21tb24uaDogQWRkZWQgbmV3IHN0cnVjdHVyZXMgYW5kCi0JZGVmaW5pdGlvbnMgZm9yIEVMRiB2ZXJzaW9ucy4KLQotVHVlIEZlYiAxOCAxNzo0MDozNiAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19EMzBWKTogRGVmaW5lLgotCi1Nb24gSmFuIDI3IDExOjU0OjQ0IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmggKGVudW0gcmVsb2NfdHlwZSk6IEFkZCBSX00zMlJfSEkxNl9bU1VdTE8sUl9NMzJSX0xPMTYuCi0KLUZyaSBKYW4gIDMgMTE6MzI6NTEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiB2ODUwLmggKFY4NTBfT1RIRVJfe1REQV9CWVRFLEVSUk9SfSk6IE5ldyBiaXRzIGZvciB0aGUgc3Rfb3RoZXIKLQlmaWVsZC4KLQkoU0hOX1Y4NTBfKik6IFJlbW92ZSB2ODUwIHNwZWNpZmljIHNlY3Rpb24gaW5kZXhlcywgd2hpY2ggYXJlIG5vdAotCW5lZWRlZC4KLQkoZW51bSByZWxvY190eXBlKTogTW92ZSB0aGUgdjg1MCByZWxvY2F0aW9ucyBoZXJlIGZyb20KLQllbGYzMi12ODUwLmMKLQotVGh1IEphbiAgMiAxOTozMDoyMyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaDogTmV3IGZpbGUsIHByb3ZpZGUgVjg1MCBzcGVjaWZpYyBkZWZpbml0aW9ucy4KLQotVHVlIERlYyAzMSAxNDo0NDozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChEVF9BVVhJTElBUlkpOiBEZWZpbmUuCi0JKERUX0ZJTFRFUik6IERlZmluZS4KLQotV2VkIERlYyAgNCAwNTowMzozNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGR3YXJmMi5oOiBVcGRhdGUuCi0KLVR1ZSBOb3YgMjYgMTA6NDQ6NDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNUT19NSVBTMTYpOiBEZWZpbmUuCi0KLVR1ZSBOb3YgMTIgMTU6NDU6NDIgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogUmVtb3ZlIGVtcHR5IGZpbGUuCi0KLVR1ZSBPY3QgIDggMTE6MzE6MjQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVGX01JUFNfQUJJMik6IERlZmluZS4KLQotVGh1IE9jdCAgMyAxMDowMTo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oOiBCcmVhayBtbjEweDAwIHN1cHBvcnQgaW50byBtbjEwMjAwIGFuZCBtbjEwMzAwLgotCi1XZWQgT2N0ICAyIDIxOjI2OjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKEVNX0NZR05VU19NTjEweDAwKTogRGVmaW5lLgotCi1Nb24gU2VwIDIzIDA5OjE4OjA0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLmg6IE5ldyBmaWxlLgotCi1GcmkgQXVnIDMwIDE3OjA2OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX1NIKTogRGVmaW5lLgotCi1UdWUgQXVnIDIwIDE0OjQ3OjU0IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fQ1lHTlVTX1Y4NTApOiBEZWZpbmUuCi0KLU1vbiBBdWcgMTkgMTA6NTk6MTAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19NMzJSKTogRGVmaW5lLgotCi1Nb24gSnVsIDIyIDE4OjU5OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChTSFRfTUlQU19JRkFDRSwgU0hUX01JUFNfQ09OVEVOVCk6IERlZmluZS4KLQkoU0hUX01JUFNfU1lNQk9MX0xJQik6IERlZmluZS4KLQkoU0hGX01JUFNfTUVSR0UsIFNIRl9NSVBTX0FERFIzMiwgU0hGX01JUFNfQUREUjY0KTogRGVmaW5lLgotCShTSEZfTUlQU19OT1NUUklQLCBTSEZfTUlQU19MT0NBTCwgU0hGX01JUFNfTkFNRVMpOiBEZWZpbmUuCi0KLVRodSBKdWwgMTggMTk6MTI6MTUgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBkd2FyZjIuaDogTmV3IGZpbGUuCi0KLUp1bCAxOCAxMzoyMDozOSAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmggKEVNX0NZR05VU19EMTBWKTogRGVmaW5lLgotCSogZDEwdi5oOiBOZXcgZmlsZS4KLQotRnJpIEp1biAyMSAxMjozMzoyNCAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0JKiBjb21tb24uaCAoRU1fQUxQSEEpOiBEZWZpbmUuCi0KLUZyaSBNYXkgMzEgMTc6Mjg6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKEVsZl9FeHRlcm5hbF9PcHRpb25zLCBFbGZfSW50ZXJuYWxfT3B0aW9ucyk6IERlZmluZS4KLQkoYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbik6IERlY2xhcmUuCi0JKGJmZF9taXBzX2VsZl9zd2FwX29wdGlvbnNfb3V0KTogRGVjbGFyZS4KLQkoT0RLXyopOiBEZWZpbmUuCi0JKEVsZjY0X0V4dGVybmFsX1JlZ0luZm8sIEVsZjY0X0ludGVybmFsX1JlZ0luZm8pOiBEZWZpbmUuCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19pbik6IERlY2xhcmUuCi0JKGJmZF9taXBzX2VsZjY0X3N3YXBfcmVnaW5mb19vdXQpOiBEZWNsYXJlLgotCi1UaHUgTWF5IDMwIDEyOjM1OjU3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFX01JUFNfQVJDSF80KTogRGVmaW5lLgotCi1XZWQgTWF5IDI5IDE1OjM1OjMzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChFbGY2NF9NaXBzX0V4dGVybmFsX1JlbCk6IERlZmluZS4KLQkoRWxmNjRfTWlwc19JbnRlcm5hbF9SZWwpOiBEZWZpbmUuCi0JKEVsZjY0X01pcHNfRXh0ZXJuYWxfUmVsYSwgRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhKTogRGVmaW5lLgotCShSU1NfKik6IERlZmluZS4KLQotTW9uIEFwciAyMiAxODoyNjozMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX1s1Nl0pOiBBbHdheXMgZGVmaW5lLgotCi1Nb24gRmViIDE5IDAxOjU1OjU2IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChSX1NQQVJDX3tQTFQzMixISVBMVDIyLExPUExUMTAsUENQTFQzMixQQ1BMVDIyLAotCVBDUExUMTAsNSw2fSk6IERvbid0IGRlZmluZSBpZmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MuCi0KLVR1ZSBGZWIgIDYgMTE6MzM6NTggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKGVudW0gc3BhcmNfZWxmX3JlbG9jX3R5cGUpOiBEZWZpbmUuCi0KLVdlZCBKYW4gMTcgMDk6MDk6MTYgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29tbW9uLmg6IERlZmluZSBFTV9TUEFSQzMyUExVUy4KLQkqIHNwYXJjLmg6IE5ldyBmaWxlLgotCi1UaHUgSmFuIDExIDE2OjI3OjM0IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKFNIRl9FWENMVURFLCBTSFRfT1JERVJFRCk6IE5ldyBmaWVsZHMgZnJvbSB0aGUgYWJpLgotCi1UaHUgTm92IDMwIDE2OjQ3OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IGVsZl9zZWdtZW50X21hcCk6IEFkZCBpbmNsdWRlc19maWxlaGRyIGFuZAotCWluY2x1ZGVzX3BoZHJzIGZpZWxkcy4KLQotVHVlIE5vdiAyOCAxNjo1ODoxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGludGVybmFsLmggKHN0cnVjdCBlbGZfc2VnbWVudF9tYXApOiBEZWZpbmUuCi0KLVR1ZSBPY3QgMzEgMTU6MTk6MzYgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBocHBhLmgsIGludGVybmFsLmgsCi0JbWlwcy5oLCBwcGMuaDogIFByb3RlY3QgYWdhaW5zdCBtdWx0aXBsZSBpbmNsdXNpb25zLgotCi1UaHUgU2VwIDIxIDEzOjUxOjU4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLmggKEVGX1BQQ19SRUxPQ0FUQUJMRV9MSUIpOiBBZGQgbmV3IGZsYWcgYml0LgotCi1GcmkgU2VwICAxIDE1OjMyOjE3IDE5OTUgIEthenVtb3RvIEtvamltYSAgPGtrb2ppbWFAaW5mby5rYW5hZ2F3YS11LmFjLmpwPgotCi0JKiBtaXBzLmg6IEFkZCBzb21lIGRlZmluaXRpb25zIHVzZWQgb24gSXJpeCA1LgotCi1UdWUgSnVuIDIwIDEwOjE4OjI4IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmggKENQVV9QQV9SSVNDMV8wKTogUHJvdGVjdCBmcm9tIHJlZGVmaW5pdGlvbnMuCi0JKENQVV9QQV9SSVNDMV8xKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgIDggMTg6MTQ6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMuaDogTmV3IGZpbGUgZm9yIFBvd2VyUEMgc3VwcG9ydC4KLQotVHVlIEZlYiAxNCAxMzo1OToxMyAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbW1vbi5oIChFTV9QUEMpOiBVc2Ugb2ZmaWNhbCB2YWx1ZSBvZiAyMCwgbm90IDE3LgotCShFTV9QUENfT0xEKTogRGVmaW5lIHRoaXMgdG8gYmUgdGhlIG9sZCB2YWx1ZSBvZiBFTV9QUEMuCi0KLVR1ZSBKYW4gMjQgMDk6NDA6NTkgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb21tb24uaCAoRU1fUFBDKTogTmV3IG1hY3JvLCBQb3dlclBDIG1hY2hpbmUgaWQuCi0KLVR1ZSBKYW4gMTcgMTA6NTE6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmggKFNIVF9NSVBTX01TWU0sIFNIVF9NSVBTX0RXQVJGLCBTSFRfTUlQU19FVkVOVFMpOiBEZWZpbmUuCi0KLU1vbiBPY3QgMTcgMTM6NDM6NTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZXJuYWxfU2hkcik6IFJlbW92ZSByYXdkYXRhIGFuZCBzaXplIGZpZWxkcy4KLQlBZGQgYmZkX3NlY3Rpb24gZmllbGQuCi0KLVR1ZSBNYXkgMjQgMTY6MTE6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEVsZjMyX0V4dGVybmFsX2dwdGFiKTogRGVmaW5lLgotCi1Nb24gTWF5IDE2IDEzOjIyOjA0IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb21tb24uaCAoRU1fSFBQQSk6IERlbGV0ZS4KLQkoRU1fUEFSSVNDKTogQWRkLgotCSogaHBwYS5oOiBOZXcgZmlsZS4KLQotTW9uIE1heSAgOSAxMzoyNzowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChTSE5fTE9SRVNFUlZFKTogUmVuYW1lIGZyb20gU0hOX0xPUkVTRVJWLgotCShFTEYzMl9SX1RZUEUsIEVMRjMyX1JfSU5GTyk6IERvbid0IHJlbHkgb24gc2l6ZSBvZiB1bnNpZ25lZCBjaGFyLgotCShFTEY2NF9SX1RZUEUpOiBEb24ndCByZWx5IG9uIHNpemUgb2YgdW5zaWduZWQgbG9uZy4KLQotTW9uIEFwciAyNSAxNTo1MzowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKEVsZl9JbnRlcm5hbF9TaGRyKTogVXNlIFBUUiwgbm90IHZvaWQgKi4KLQotRnJpIE1hciAxMSAwMDozNDo1OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG1pcHMuaCAoU0hOX01JUFNfVEVYVCwgU0hOX01JUFNfREFUQSk6ICBEZWZpbmUuCi0KLVNhdCBNYXIgIDUgMTQ6MDg6NTQgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBpbnRlcm5hbC5oOiAgUmVtb3ZlIEVsZjMyXyosIEVsZjY0XyogdHlwZWRlZnMuICBUaGVzZSBuYW1lcwotCWNhdXNlIGNvbmZsaWN0cyB3aXRoIHN5c3RlbSBoZWFkZXJzLCBlLmcuIGxpbmsuaCBpbiBnZGIvc29saWIuYy4KLQlDb21iaW5lIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mICpfSW50ZXJuYWxfRHluLgotCSogY29tbW9uLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmNjRfV29yZCwgRWxmNjRfWHdvcmQgdHlwZWRlZnMKLQlieSB0aGVpciBleHBhbnNpb24uCi0JKiBtaXBzLmg6ICBSZXBsYWNlIHVzZXMgb2YgRWxmMzJfV29yZCwgRWxmMzJfU3dvcmQsIEVsZjMyX0FkZHIKLQl0eXBlZGVmcyBieSB0aGVpciBleHBhbnNpb24uIEFkZCBEVF9NSVBTX1JMRF9NQVAgZGVmaW5pdGlvbi4KLQotRnJpIEZlYiAxOCAxMDozOTo1NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9DWUdOVVNfUE9XRVJQQyk6IERlZmluZS4gIFRoaXMgbWF5IGJlIHRlbXBvcmFyeSwKLQlkZXBlbmRpbmcgdXBvbiBob3cgcXVpY2tseSBJIGNhbiBmaW5kIGEgcmVhbCBQb3dlclBDIEFCSS4KLQotTW9uIEZlYiAgNyAwODoyNzoxMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQotV2VkIEZlYiAgMiAxNDoxMjoxOCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmg6IEFkZCBjb21tZW50cyByZWdhcmRpbmcgdmFsdWUgb2YgRU1fSFBQQSBhbmQgaG93IHRvCi0JcGljayBhbiB1bm9mZmljaWFsIHZhbHVlLgotCi1XZWQgTm92IDE3IDE3OjE0OjI2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oIChTSFRfTUlQU19PUFRJT05TKTogRGVmaW5lLgotCi1Nb24gTm92ICA4IDE3OjU3OjAwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBBZGRlZCBzb21lIG1vcmUgTUlQUyBBQkkgbWFjcm8gZGVmaW5pdGlvbnMuCi0KLVdlZCBOb3YgIDMgMjI6MDc6MTcgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoRU1fTUlQU19SUzRfQkUpOiBOZXcgbWFjcm8uCi0KLVR1ZSBPY3QgMTIgMDc6Mjg6MTggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IE5ldyBmaWxlLiAgTUlQUyBBQkkgc3BlY2lmaWMgaW5mb3JtYXRpb24uCi0KLU1vbiBKdW4gMjEgMTM6MTM6NDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmg6IENvbWJpbmVkIDMyLSBhbmQgNjQtYml0IHZlcnNpb25zIG9mIGFsbCBzdHJ1Y3R1cmVzCi0JZXhjZXB0ICpfSW50ZXJuYWxfRHluLiAgVGhpcyB3aWxsIHNpbXBseSB0aGUgYXNzZW1ibGVyIGludGVyZmFjZSwKLQlhbmQgc29tZSBiZmQgY29kZS4KLQotVHVlIE1heSAyNSAwMjowMDoxNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGV4dGVybmFsLmgsIGludGVybmFsLmgsIGNvbW1vbi5oOiBBZGRlZCA2NC1iaXQgdmVyc2lvbnMgb2Ygc29tZQotCXN0cnVjdHVyZXMgYW5kIG1hY3Jvcy4gIFJlbmFtZWQgb2xkIHZlcnNpb25zIHRvIHB1dCAiMzIiIGluIHRoZQotCW5hbWUuICBTb21lIGFyZSB1bmNoYW5nZWQuCi0KLVRodSBBcHIgMjkgMTI6MTI6MjAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oIChFTV9IUFBBLCBOVF9WRVJTSU9OLCBTVE5fVU5ERUYsIERUXyopOiBOZXcgbWFjcm9zLgotCSogZXh0ZXJuYWwuaCAoRWxmX0V4dGVybmFsX0R5bik6IE5ldyB0eXBlLgotCi0JKiBpbnRlcm5hbC5oIChFbGZfSW50ZW5yYWxfU2hkcik6IE5ldyBmaWVsZCBgc2l6ZScuCi0JKEVsZl9JbnRlcm5hbF9EeW4pOiBOZXcgdHlwZS4KLQotVHVlIEFwciAyMCAxNjowMzo0NSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBDaGFuZ2UgdmFsdWUgdG8gb25lIHJhbmRvbWx5IHBpY2tlZCBpbgotCXRoZSB1c2VyIGRlZmluZWQgcmFuZ2UsIHRvIHJlZHVjZSBwcm9iYWJpbGl0eSBvZiBjb2xsaXNpb25zLgotCi1TdW4gTm92IDE1IDA5OjM0OjAyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkd2FyZi5oIChBVF9zcmNfY29vcmRzKTogIFdoaXRlc3BhY2UgY2hhbmdlIG9ubHkuCi0JKiBkd2FyZi5oIChBVF9ib2R5X2JlZ2luLCBBVF9ib2R5X2VuZCwgTEFOR19NT0RVTEEyKToKLQlBZGQgZnJvbSBsYXRlc3QgZ2NjLgotCSogZHdhcmYuaCAoTEFOR19DSElMTCk6ICBBZGQgYXMgR05VIGV4dGVuc2lvbi4KLQotU2F0IEF1ZyAgMSAxMzo0Njo1MyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogZHdhcmYuaDogIFJlcGxhY2Ugd2l0aCBjdXJyZW50IHZlcnNpb24gZnJvbSBnY2MgZGlzdHJpYnV0aW9uLgotCi1GcmkgSnVuIDE5IDE5OjA1OjA5IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oOiAgQWRkIHJlYWwgc3RydWN0IHRhZ3MgdG8gYWxsIHRoZSBUeXBlX0RlZnMsIHNvIHRoZXkKLQljYW4gYmUgdXNlZCBpbiBwcm90b3R5cGVzIHdoZXJlIHRoZSBUeXBlX0RlZnMgYXJlIG5vdCBrbm93bi4KLQotRnJpIEFwciAgMyAyMDo1ODo1OCAxOTkyICBNYXJrIEVpY2hpbiAgKGVpY2hpbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb21tb24uaDogYWRkZWQgRUxGX1Jfe1NZTSxUWVBFLElORk99IGZvciBoYW5kbGluZyByZWxvY2F0aW9uCi0JaW5mbwotCWFkZGVkIEVNX01JUFMsIGFuZCBjb3JyZWN0ZWQgdmFsdWUgb2YgRU1fODYwIGJhc2VkIG9uIFN5c3RlbSBWIEFCSQotCW1hbnVhbC4KLQotCSogZXh0ZXJuYWwuaDogYWRkZWQgRWxmX0V4dGVybmFsX3tSZWwsUmVsYX0uCi0KLQkqIGludGVybmFsLmg6IGFkZGVkIEVsZl9JbnRlcm5hbF97UmVsLFJlbGF9LgotCWFkZGVkIHJhd2RhdGEgdG8gRWxmX0ludGVybmFsX1NoZHIuCi0KLVNhdCBOb3YgMzAgMjA6NDM6NTkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbW1vbi5oLCBkd2FyZi5oLCBleHRlcm5hbC5oLCBpbnRlcm5hbC5oLCBDaGFuZ2VMb2c7IG1vdmVkIGZyb20KLQkuLi9lbGYtPGZvbz4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYWxwaGEuaCBiL2luY2x1ZGUvZWxmL2FscGhhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTlkNWUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYWxwaGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKiBBTFBIQSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBFcmljIFlvdW5nZGFsZSwgPGVyaWNAYWliLmNvbT4uICBObyBwcm9jZXNzb3Igc3VwcGxlbWVudCBhdmFpbGFibGUKLSAgIGZvciB0aGlzIHBsYXRmb3JtLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgQUxQSEEgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfQUxQSEFfSAotI2RlZmluZSBfRUxGX0FMUEhBX0gKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotLyogQWxsIGFkZHJlc3NlcyBtdXN0IGJlIGJlbG93IDJHQi4gICovCi0jZGVmaW5lIEVGX0FMUEhBXzMyQklUCQkweDAwMDAwMDAxCi0KLS8qIEFsbCByZWxvY2F0aW9ucyBuZWVkZWQgZm9yIHJlbGF4YXRpb24gd2l0aCBjb2RlIG1vdmVtZW50IGFyZSBwcmVzZW50LiAgKi8KLSNkZWZpbmUgRUZfQUxQSEFfQ0FOUkVMQVgJMHgwMDAwMDAwMgotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBtdXN0IGJlIGluIHRoZSBnbG9iYWwgZGF0YSBhcmVhLiAgKi8KLSNkZWZpbmUgU0hGX0FMUEhBX0dQUkVMCQkweDEwMDAwMDAwCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgc29tZSBzb3J0IG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gIFRoZSBleGFjdAotICAgZm9ybWF0IGlzIHVuc3BlY2lmaWVkLiAgSXQncyBwcm9iYWJseSBFQ09GRiBzeW1ib2xzLiAgKi8KLSNkZWZpbmUgU0hUX0FMUEhBX0RFQlVHCQkweDcwMDAwMDAxCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgcmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBTSFRfQUxQSEFfUkVHSU5GTwkweDcwMDAwMDAyCi0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8gY29udGFpbnMgdGhlIGZvbGxvd2luZwotICAgc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICBsb25nIHJpX2dwX3ZhbHVlOwotfSBFbGY2NF9SZWdJbmZvOwotCi0vKiBTcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHN0X290aGVyIGZpZWxkIGluIHRoZSBzeW1ib2wgdGFibGUuICAqLwotCi0jZGVmaW5lIFNUT19BTFBIQV9OT1BWCQkweDgwCi0jZGVmaW5lIFNUT19BTFBIQV9TVERfR1BMT0FECTB4ODgKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogQWxwaGEgcmVsb2NzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9hbHBoYV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTk9ORSwgMCkJLyogTm8gcmVsb2MgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFRkxPTkcsIDEpCS8qIERpcmVjdCAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1JFRlFVQUQsIDIpCS8qIERpcmVjdCA2NCBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMMzIsIDMpCS8qIEdQIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfTElURVJBTCwgNCkJLyogR1AgcmVsYXRpdmUgMTYgYml0IHcvb3B0aW1pemF0aW9uICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9MSVRVU0UsIDUpCS8qIE9wdGltaXphdGlvbiBoaW50IGZvciBMSVRFUkFMICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUERJU1AsIDYpCS8qIEFkZCBkaXNwbGFjZW1lbnQgdG8gR1AgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0JSQUREUiwgNykJLyogUEMrNCByZWxhdGl2ZSAyMyBiaXQgc2hpZnRlZCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSElOVCwgOCkJLyogUEMrNCByZWxhdGl2ZSAxNiBiaXQgc2hpZnRlZCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDE2LCA5KQkvKiBQQyByZWxhdGl2ZSAxNiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX1NSRUwzMiwgMTApCS8qIFBDIHJlbGF0aXZlIDMyIGJpdCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfU1JFTDY0LCAxMSkJLyogUEMgcmVsYXRpdmUgNjQgYml0ICovCi0KLS8qIEluaGVyaXRlZCB0aGVzZSBmcm9tIEVDT0ZGLCBidXQgdGhleSBhcmUgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwKLSAgIGFuZCBhcmUgZGVwcmVjaWF0ZWQuICBBbmQgbm90IGltcGxlbWVudGVkIGluIHRoZSBCRkQsIGJ0dy4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QVVNILCAxMikJLyogT1Agc3RhY2sgcHVzaCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfT1BfU1RPUkUsIDEzKQkvKiBPUCBzdGFjayBwb3AgYW5kIHN0b3JlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9PUF9QU1VCLCAxNCkJLyogT1Agc3RhY2sgc3VidHJhY3QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX09QX1BSU0hJRlQsIDE1KQkvKiBPUCBzdGFjayByaWdodCBzaGlmdCAqLwotCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFZBTFVFLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0dQUkVMSElHSCwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HUFJFTExPVywgMTgpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9HUF8xNiwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9JTU1FRF9HUF9ISTMyLCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX1NDTl9ISTMyLCAyMSkKLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0lNTUVEX0JSX0hJMzIsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfSU1NRURfTE8zMiwgMjMpCi0KLS8qIFRoZXNlIHJlbG9jYXRpb25zIGFyZSBzcGVjaWZpYyB0byBzaGFyZWQgbGlicmFyaWVzLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0NPUFksIDI0KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BTFBIQV9HTE9CX0RBVCwgMjUpCS8qIENyZWF0ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FMUEhBX0pNUF9TTE9ULCAyNikJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfQUxQSEFfUkVMQVRJVkUsIDI3KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0KLSAgRU1QVFlfUkVMT0MgIChSX0FMUEhBX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0FMUEhBX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2FyYy5oIGIvaW5jbHVkZS9lbGYvYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNGI1NWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKiBBUkMgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMsIChkamVAY3lnbnVzLmNvbSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIEFSQyBFTEYgQUJJLiAgKi8KLQotI2lmbmRlZiBfRUxGX0FSQ19ICi0jZGVmaW5lIF9FTEZfQVJDX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FyY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9BUkNfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUkNfQjI2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJDX0IyMl9QQ1JFTCwgMykKLSAgRU1QVFlfUkVMT0MgIChSX0FSQ19tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBGb3VyIGJpdCBBUkMgbWFjaGluZSB0eXBlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfQVJDX01BQ0gJCTB4MDAwMDAwMGYKLQotLyogVmFyaW91cyBDUFUgdHlwZXMuICAqLwotI2RlZmluZSBFX0FSQ19NQUNIX0JBU0UJCTB4MDAwMDAwMDAKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQxCTB4MDAwMDAwMDEKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQyCTB4MDAwMDAwMDIKLSNkZWZpbmUgRV9BUkNfTUFDSF9VTlVTRUQ0CTB4MDAwMDAwMDMKLQotLyogTGVhdmUgYml0cyAweGYwIGFsb25lIGluIGNhc2Ugd2UgZXZlciBoYXZlIG1vcmUgdGhhbiAxNiBjcHUgdHlwZXMuCi0gICBIaWdobHkgdW5saWtlbHksIGJ1dCB3aGF0IHRoZSBoZWNrLiAgKi8KLQotLyogRmlsZSBjb250YWlucyBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfQVJDX1BJQwkJMHgwMDAwMDEwMAotCi0jZW5kaWYgLyogX0VMRl9BUkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJtLW9hYmkuaCBiL2luY2x1ZGUvZWxmL2FybS1vYWJpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMDk4NDIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvYXJtLW9hYmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qIEFSTSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUk1fSAotI2RlZmluZSBfRUxGX0FSTV9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSTV9SRUxFWEVDICAgICAweDAxCi0jZGVmaW5lIEVGX0FSTV9IQVNFTlRSWSAgICAweDAyCi0jZGVmaW5lIEVGX0lOVEVSV09SSyAgICAgICAweDA0Ci0jZGVmaW5lIEVGX0FQQ1NfMjYgICAgICAgICAweDA4Ci0jZGVmaW5lIEVGX0FQQ1NfRkxPQVQgICAgICAweDEwCi0jZGVmaW5lIEVGX1BJQyAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEVGX0FMSUdOOAkgICAweDQwCQkvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLQotLyogTG9jYWwgYWxpYXNlcyBmb3Igc29tZSBmbGFncyB0byBtYXRjaCBuYW1lcyB1c2VkIGJ5IENPRkYgcG9ydC4gICovCi0jZGVmaW5lIEZfSU5URVJXT1JLCSAgIEVGX0lOVEVSV09SSwotI2RlZmluZSBGX0FQQ1MyNgkgICBFRl9BUENTXzI2Ci0jZGVmaW5lIEZfQVBDU19GTE9BVAkgICBFRl9BUENTX0ZMT0FUCi0jZGVmaW5lIEZfUElDICAgICAgICAgICAgICBFRl9QSUMKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgIDB4ZAotCi0vKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLwotI2RlZmluZSBTSEZfRU5UUllTRUNUICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KLSNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcCAqLwotCi0vKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KLSNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICovCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FybV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX05PTkUsICAgICAgICAgMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzI0LCAgICAgICAgIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTDMyLCAgICAgICAgMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BQlM4LCAgICAgICAgIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTYsICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fQUJTNSwgICAgIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMjIsICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgOSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9BTVBfVkNBTEw5LCAgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMTEsICAgIDExKSAgICAgICAvKiBjeWdudXMgZXh0ZW5zaW9uIHRvIGFiaTogdGh1bWIgdW5jb25kaXRpb25hbCBicmFuY2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEM5LCAgICAgMTIpICAgICAgIC8qIGN5Z251cyBleHRlbnNpb24gdG8gYWJpOiB0aHVtYiBjb25kaXRpb25hbCBicmFuY2ggKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRFTlRSWSwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBjb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR0xPQl9EQVQsICAgIDIxKSAgICAgICAvKiBjcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgIDIyKSAgICAgICAvKiBjcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBhZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UT0ZGLCAgICAgIDI0KSAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAyNSkgICAgICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QTFQzMiwgICAgICAgMjcpICAgICAgIC8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MsIDI4KQotICBGQUtFX1JFTE9DICAgKExBU1RfSU5WQUxJRF9SRUxPQywgIDI0OSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SU0JSRUwzMiwgICAyNTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1JQQzIyLCAgMjUxKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JSRUwzMiwgICAgIDI1MikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQUJTMzIsICAgICAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlBDMjQsICAgICAgMjU0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JCQVNFLCAgICAgIDI1NSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvYXJtLmggYi9pbmNsdWRlL2VsZi9hcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5NGIxMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9hcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qIEFSTSBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9BUk1fSAotI2RlZmluZSBfRUxGX0FSTV9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0jZGVmaW5lIEVGX0FSTV9SRUxFWEVDICAgICAweDAxCi0jZGVmaW5lIEVGX0FSTV9IQVNFTlRSWSAgICAweDAyCi0jZGVmaW5lIEVGX0lOVEVSV09SSyAgICAgICAweDA0Ci0jZGVmaW5lIEVGX0FQQ1NfMjYgICAgICAgICAweDA4Ci0jZGVmaW5lIEVGX0FQQ1NfRkxPQVQgICAgICAweDEwCi0jZGVmaW5lIEVGX1BJQyAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIEVGX0FMSUdOOAkgICAweDQwCQkvKiA4LWJpdCBzdHJ1Y3R1cmUgYWxpZ25tZW50IGlzIGluIHVzZSAqLwotI2RlZmluZSBFRl9ORVdfQUJJICAgICAgICAgMHg4MAotI2RlZmluZSBFRl9PTERfQUJJICAgICAgICAgMHgxMDAKLQotLyogTG9jYWwgYWxpYXNlcyBmb3Igc29tZSBmbGFncyB0byBtYXRjaCBuYW1lcyB1c2VkIGJ5IENPRkYgcG9ydC4gICovCi0jZGVmaW5lIEZfSU5URVJXT1JLCSAgIEVGX0lOVEVSV09SSwotI2RlZmluZSBGX0FQQ1MyNgkgICBFRl9BUENTXzI2Ci0jZGVmaW5lIEZfQVBDU19GTE9BVAkgICBFRl9BUENTX0ZMT0FUCi0jZGVmaW5lIEZfUElDICAgICAgICAgICAgICBFRl9QSUMKLQotLyogQWRkaXRpb25hbCBzeW1ib2wgdHlwZXMgZm9yIFRodW1iICovCi0jZGVmaW5lIFNUVF9BUk1fVEZVTkMgICAgIDB4ZAotCi0vKiBBUk0tc3BlY2lmaWMgdmFsdWVzIGZvciBzaF9mbGFncyAqLwotI2RlZmluZSBTSEZfRU5UUllTRUNUICAgICAgMHgxMDAwMDAwMCAgIC8qIFNlY3Rpb24gY29udGFpbnMgYW4gZW50cnkgcG9pbnQgKi8KLSNkZWZpbmUgU0hGX0NPTURFRiAgICAgICAgIDB4ODAwMDAwMDAgICAvKiBTZWN0aW9uIG1heSBiZSBtdWx0aXBseSBkZWZpbmVkIGluIHRoZSBpbnB1dCB0byBhIGxpbmsgc3RlcCAqLwotCi0vKiBBUk0tc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgZmxhZ3MgKi8KLSNkZWZpbmUgUEZfQVJNX1NCICAgICAgICAgIDB4MTAwMDAwMDAgICAvKiBTZWdtZW50IGNvbnRhaW5zIHRoZSBsb2NhdGlvbiBhZGRyZXNzZWQgYnkgdGhlIHN0YXRpYyBiYXNlICovCi0KLS8qIFJlbG9jYXRpb24gdHlwZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX2FybV9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX05PTkUsICAgICAgICAgMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzI0LCAgICAgICAgIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMzIsICAgICAgICAyKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JFTDMyLCAgICAgICAgMykKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QQzEzLCAgICAgICAgIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTMTYsICAgICAgICA1KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FCUzEyLCAgICAgICAgNikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fQUJTNSwgICAgIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQUJTOCwgICAgICAgICA4KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1NCUkVMMzIsICAgICAgOSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fUEMyMiwgICAgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOCwgICAgIDExKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0FNUF9WQ0FMTDksICAxMikKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9TV0kyNCwgICAgICAgMTMpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1NXSTgsICAgIDE0KQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1hQQzI1LCAgICAgICAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9USE1fWFBDMjIsICAgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fQ09QWSwgICAgICAgIDIwKSAgICAgICAvKiBjb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR0xPQl9EQVQsICAgIDIxKSAgICAgICAvKiBjcmVhdGUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fSlVNUF9TTE9ULCAgIDIyKSAgICAgICAvKiBjcmVhdGUgUExUIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkVMQVRJVkUsICAgIDIzKSAgICAgICAvKiBhZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR09UT0ZGLCAgICAgIDI0KSAgICAgICAvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICBSRUxPQ19OVU1CRVIgKFJfQVJNX0dPVFBDLCAgICAgICAyNSkgICAgICAgLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HT1QzMiwgICAgICAgMjYpICAgICAgIC8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9QTFQzMiwgICAgICAgMjcpICAgICAgIC8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MxLCAyOCkKLSAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MxLCAgOTkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fR05VX1ZURU5UUlksIDEwMCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9HTlVfVlRJTkhFUklULCAxMDEpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDMTEsICAgIDEwMikgICAgICAgLyogY3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IHRodW1iIHVuY29uZGl0aW9uYWwgYnJhbmNoICovCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fVEhNX1BDOSwgICAgIDEwMykgICAgICAgLyogY3lnbnVzIGV4dGVuc2lvbiB0byBhYmk6IHRodW1iIGNvbmRpdGlvbmFsIGJyYW5jaCAqLwotICBGQUtFX1JFTE9DICAgKEZJUlNUX0lOVkFMSURfUkVMT0MyLCAxMDQpCi0gIEZBS0VfUkVMT0MgICAoTEFTVF9JTlZBTElEX1JFTE9DMiwgIDI0OCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SWFBDMjUsICAgICAyNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUlNCUkVMMzIsICAgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1RITV9SUEMyMiwgIDI1MSkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SUkVMMzIsICAgICAyNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9BUk1fUkFCUzMyLCAgICAgMjUzKQotICBSRUxPQ19OVU1CRVIgKFJfQVJNX1JQQzI0LCAgICAgIDI1NCkKLSAgUkVMT0NfTlVNQkVSIChSX0FSTV9SQkFTRSwgICAgICAyNTUpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2NvbW1vbi5oIGIvaW5jbHVkZS9lbGYvY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNWRmNDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyogRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSw5Miw5Myw5NCw5NSw5Niw5Nyw5OCwxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCBAIEN5Z251cyBTdXBwb3J0LCBmcm9tIGluZm9ybWF0aW9uIHB1Ymxpc2hlZAotICAgaW4gIlVOSVggU3lzdGVtIFYgUmVsZWFzZSA0LCBQcm9ncmFtbWVycyBHdWlkZTogQU5TSSBDIGFuZAotICAgUHJvZ3JhbW1pbmcgU3VwcG9ydCBUb29scyIuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBFTEYgc3VwcG9ydCBmb3IgQkZELCBhbmQgY29udGFpbnMgdGhlIHBvcnRpb25zCi0gICB0aGF0IGFyZSBjb21tb24gdG8gYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4KLSAgIEZvciBleGFtcGxlLCBFTEZNQUcwIGlzIHRoZSBieXRlIDB4N0YgaW4gYm90aCB0aGUgaW50ZXJuYWwgKGluLW1lbW9yeSkKLSAgIGFuZCBleHRlcm5hbCAoaW4tZmlsZSkgcmVwcmVzZW50YXRpb25zLiAqLwotCi0jaWZuZGVmIF9FTEZfQ09NTU9OX0gKLSNkZWZpbmUgX0VMRl9DT01NT05fSAotCi0vKiBGaWVsZHMgaW4gZV9pZGVudFtdICovCi0KLSNkZWZpbmUgRUlfTUFHMAkJMAkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMCBpbmRleCAqLwotI2RlZmluZSBFTEZNQUcwCQkweDdGCS8qIE1hZ2ljIG51bWJlciBieXRlIDAgKi8KLQotI2RlZmluZSBFSV9NQUcxCQkxCS8qIEZpbGUgaWRlbnRpZmljYXRpb24gYnl0ZSAxIGluZGV4ICovCi0jZGVmaW5lIEVMRk1BRzEJCSdFJwkvKiBNYWdpYyBudW1iZXIgYnl0ZSAxICovCi0KLSNkZWZpbmUgRUlfTUFHMgkJMgkvKiBGaWxlIGlkZW50aWZpY2F0aW9uIGJ5dGUgMiBpbmRleCAqLwotI2RlZmluZSBFTEZNQUcyCQknTCcJLyogTWFnaWMgbnVtYmVyIGJ5dGUgMiAqLwotCi0jZGVmaW5lIEVJX01BRzMJCTMJLyogRmlsZSBpZGVudGlmaWNhdGlvbiBieXRlIDMgaW5kZXggKi8KLSNkZWZpbmUgRUxGTUFHMwkJJ0YnCS8qIE1hZ2ljIG51bWJlciBieXRlIDMgKi8KLQotI2RlZmluZSBFSV9DTEFTUwk0CS8qIEZpbGUgY2xhc3MgKi8KLSNkZWZpbmUgRUxGQ0xBU1NOT05FCTAJLyogSW52YWxpZCBjbGFzcyAqLwotI2RlZmluZSBFTEZDTEFTUzMyCTEJLyogMzItYml0IG9iamVjdHMgKi8KLSNkZWZpbmUgRUxGQ0xBU1M2NAkyCS8qIDY0LWJpdCBvYmplY3RzICovCi0KLSNkZWZpbmUgRUlfREFUQQkJNQkvKiBEYXRhIGVuY29kaW5nICovCi0jZGVmaW5lIEVMRkRBVEFOT05FCTAJLyogSW52YWxpZCBkYXRhIGVuY29kaW5nICovCi0jZGVmaW5lIEVMRkRBVEEyTFNCCTEJLyogMidzIGNvbXBsZW1lbnQsIGxpdHRsZSBlbmRpYW4gKi8KLSNkZWZpbmUgRUxGREFUQTJNU0IJMgkvKiAyJ3MgY29tcGxlbWVudCwgYmlnIGVuZGlhbiAqLwotCi0jZGVmaW5lIEVJX1ZFUlNJT04JNgkvKiBGaWxlIHZlcnNpb24gKi8KLQotI2RlZmluZSBFSV9PU0FCSSAgICAgICAgNyAgICAgICAvKiBPcGVyYXRpbmcgU3lzdGVtL0FCSSBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEVMRk9TQUJJX1NZU1YgICAwICAgICAgIC8qIFVOSVggU3lzdGVtIFYgQUJJICovCi0jZGVmaW5lIEVMRk9TQUJJX0hQVVggICAxICAgICAgIC8qIEhQLVVYIG9wZXJhdGluZyBzeXN0ZW0gKi8KLSNkZWZpbmUgRUxGT1NBQklfU1RBTkRBTE9ORSAyNTUgLyogU3RhbmRhbG9uZSAoZW1iZWRkZWQpIGFwcGxpY2F0aW9uICovCi0jZGVmaW5lIEVMRk9TQUJJX0FSTSAgIDk3CQkvKiBBUk0gKi8KLQotI2RlZmluZSBFSV9BQklWRVJTSU9OICAgOCAgICAgICAvKiBBQkkgdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVJX1BBRAkJOQkvKiBTdGFydCBvZiBwYWRkaW5nIGJ5dGVzICovCi0KLQotLyogVmFsdWVzIGZvciBlX3R5cGUsIHdoaWNoIGlkZW50aWZpZXMgdGhlIG9iamVjdCBmaWxlIHR5cGUgKi8KLQotI2RlZmluZSBFVF9OT05FCQkwCS8qIE5vIGZpbGUgdHlwZSAqLwotI2RlZmluZSBFVF9SRUwJCTEJLyogUmVsb2NhdGFibGUgZmlsZSAqLwotI2RlZmluZSBFVF9FWEVDCQkyCS8qIEV4ZWN1dGFibGUgZmlsZSAqLwotI2RlZmluZSBFVF9EWU4JCTMJLyogU2hhcmVkIG9iamVjdCBmaWxlICovCi0jZGVmaW5lIEVUX0NPUkUJCTQJLyogQ29yZSBmaWxlICovCi0jZGVmaW5lIEVUX0xPT1MgICAgICAgICAweEZFMDAJLyogT3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyAqLwotI2RlZmluZSBFVF9ISU9TICAgICAgICAgMHhGRUZGICAvKiBPcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0xPUFJPQwkweEZGMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0jZGVmaW5lIEVUX0hJUFJPQwkweEZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0KLS8qIFZhbHVlcyBmb3IgZV9tYWNoaW5lLCB3aGljaCBpZGVudGlmaWVzIHRoZSBhcmNoaXRlY3R1cmUgKi8KLQotI2RlZmluZSBFTV9OT05FCQkwCS8qIE5vIG1hY2hpbmUgKi8KLSNkZWZpbmUgRU1fTTMyCQkxCS8qIEFUJlQgV0UgMzIxMDAgKi8KLSNkZWZpbmUgRU1fU1BBUkMJMgkvKiBTVU4gU1BBUkMgKi8KLSNkZWZpbmUgRU1fMzg2CQkzCS8qIEludGVsIDgwMzg2ICovCi0jZGVmaW5lIEVNXzY4SwkJNAkvKiBNb3Rvcm9sYSBtNjhrIGZhbWlseSAqLwotI2RlZmluZSBFTV84OEsJCTUJLyogTW90b3JvbGEgbTg4ayBmYW1pbHkgKi8KLSNkZWZpbmUgRU1fNDg2CQk2CS8qIEludGVsIDgwNDg2ICovCi0jZGVmaW5lIEVNXzg2MAkJNwkvKiBJbnRlbCA4MDg2MCAqLwotI2RlZmluZSBFTV9NSVBTCQk4CS8qIE1JUFMgUjMwMDAgKG9mZmljaWFsbHksIGJpZy1lbmRpYW4gb25seSkgKi8KLSNkZWZpbmUgRU1fUzM3MAkJOQkvKiBBbWRhaGwgKi8KLSNkZWZpbmUgRU1fTUlQU19SUzRfQkUgMTAJLyogTUlQUyBSNDAwMCBiaWctZW5kaWFuICovCi0KLSNkZWZpbmUgRU1fUEFSSVNDICAgICAgMTUJLyogSFBQQSAqLwotI2RlZmluZSBFTV9WUFA1NTAgICAgICAxNyAgICAgICAvKiBGdWppdHN1IFZQUDUwMCAqLwotI2RlZmluZSBFTV9TUEFSQzMyUExVUyAxOAkvKiBTdW4ncyAidjhwbHVzIiAqLwotI2RlZmluZSBFTV85NjAgICAgICAgICAxOSAgICAgICAvKiBJbnRlbCA4MDk2MCAqLwotI2RlZmluZSBFTV9QUEMJICAgICAgIDIwCS8qIFBvd2VyUEMgKi8KLSNkZWZpbmUgRU1fUFBDNjQgICAgICAgMjEJLyogNjQtYml0IFBvd2VyUEMgKi8KLQotI2RlZmluZSBFTV9WODAwICAgICAgICAzNgkvKiBORUMgVjgwMCBzZXJpZXMgKi8KLSNkZWZpbmUgRU1fRlIyMAkgICAgICAgMzcJLyogRnVqaXRzdSBGUjIwICovCi0jZGVmaW5lIEVNX1JIMzIJICAgICAgIDM4ICAgICAgIC8qIFRSVyBSSDMyICovCi0jZGVmaW5lIEVNX01DT1JFICAgICAgIDM5ICAgICAgIC8qIE1vdG9yb2xsYSBNQ29yZSAqLyAvKiBNYXkgYWxzbyBiZSB0YWtlbiBieSBGdWppdHN1IE1NQSAqLwotI2RlZmluZSBFTV9BUk0JICAgICAgIDQwCS8qIEFSTSAqLwotI2RlZmluZSBFTV9PTERfQUxQSEEgICA0MQkvKiBEaWdpdGFsIEFscGhhICovCi0jZGVmaW5lIEVNX1NICSAgICAgICA0MgkvKiBIaXRhY2hpIFNIICovCi0jZGVmaW5lIEVNX1NQQVJDVjkgICAgIDQzCS8qIFNQQVJDIHY5IDY0LWJpdCAqLwotI2RlZmluZSBFTV9UUklDT1JFICAgICA0NCAgICAgICAvKiBTaWVtZW5zIFRyaWNvcmUgZW1iZWRkZWQgcHJvY2Vzc29yICovCi0jZGVmaW5lIEVNX0FSQyAgICAgICAgIDQ1ICAgICAgIC8qIEFyZ29uYXV0IFJJU0MgQ29yZSwgQXJnb25hdXQgVGVjaG5vbG9naWVzIEluYy4gKi8KLSNkZWZpbmUgRU1fSDhfMzAwICAgICAgNDYgICAgICAgLyogSGl0YWNoaSBIOC8zMDAgKi8KLSNkZWZpbmUgRU1fSDhfMzAwSCAgICAgNDcgICAgICAgLyogSGl0YWNoaSBIOC8zMDBIICovCi0jZGVmaW5lIEVNX0g4UyAgICAgICAgIDQ4ICAgICAgIC8qIEhpdGFjaGkgSDhTICovCi0jZGVmaW5lIEVNX0g4XzUwMCAgICAgIDQ5ICAgICAgIC8qIEhpdGFjaGkgSDgvNTAwICovCi0jZGVmaW5lIEVNX0lBXzY0ICAgICAgIDUwICAgICAgIC8qIEludGVsIE1lcmNlZFRNIFByb2Nlc3NvciAqLwotI2RlZmluZSBFTV9NSVBTX1ggICAgICA1MSAgICAgICAvKiBTdGFuZm9yZCBNSVBTLVggKi8KLSNkZWZpbmUgRU1fQ09MREZJUkUgICAgNTIgICAgICAgLyogTW90b3JvbGEgQ29sZGZpcmUgKi8KLSNkZWZpbmUgRU1fNjhIQzEyICAgICAgNTMgICAgICAgLyogTW90b3JvbGEgTTY4SEMxMiAqLwotCi0vKiBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gYXNzaWduIG5ldyB1bm9mZmljaWFsIEVNXyogdmFsdWVzLCBwbGVhc2UgcGljayBsYXJnZQotICAgcmFuZG9tIG51bWJlcnMgKDB4ODUyMywgMHhhN2YyLCBldGMuKSB0byBtaW5pbWl6ZSB0aGUgY2hhbmNlcyBvZiBjb2xsaXNpb24KLSAgIHdpdGggb2ZmaWNpYWwgb3Igbm9uLUdOVSB1bm9mZmljaWFsIHZhbHVlcy4KLQotICAgTk9URTogRG8gbm90IGp1c3QgaW5jcmVtZW50IHRoZSBtb3N0IHJlY2VudCBudW1iZXIgYnkgb25lLgotICAgU29tZWJvZHkgZWxzZSBzb21ld2hlcmUgd2lsbCBkbyBleGFjdGx5IHRoZSBzYW1lIHRoaW5nLCBhbmQgeW91Ci0gICB3aWxsIGhhdmUgYSBjb2xsaXNpb24uICBJbnN0ZWFkLCBwaWNrIGEgcmFuZG9tIG51bWJlci4gICovCi0KLS8qIEN5Z251cyBQb3dlclBDIEVMRiBiYWNrZW5kLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfUE9XRVJQQyAweDkwMjUKLQotLyogT2xkIHZlcnNpb24gb2YgU3BhcmMgdjksIGZyb20gYmVmb3JlIHRoZSBBQkk7IHRoaXMgc2hvdWxkIGJlCi0gICByZW1vdmVkIHNob3J0bHkuICAqLwotI2RlZmluZSBFTV9PTERfU1BBUkNWOQkxMQotCi0vKiBPbGQgdmVyc2lvbiBvZiBQb3dlclBDLCB0aGlzIHNob3VsZCBiZSByZW1vdmVkIHNob3J0bHkuICovCi0jZGVmaW5lIEVNX1BQQ19PTEQJMTcKLQotLyogQ3lnbnVzIEFSQyBFTEYgYmFja2VuZC4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX0FSQyAweDkwNDAKLQotLyogQ3lnbnVzIE0zMlIgRUxGIGJhY2tlbmQuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19NMzJSIDB4OTA0MQotCi0vKiBBbHBoYSBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2VuY2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQUxQSEEJMHg5MDI2Ci0KLS8qIEQxMFYgYmFja2VuZCBtYWdpYyBudW1iZXIuICBXcml0dGVuIGluIHRoZSBhYnNlbmNlIG9mIGFuIEFCSS4gICovCi0jZGVmaW5lIEVNX0NZR05VU19EMTBWCTB4NzY1MAotCi0vKiBEMzBWIGJhY2tlbmQgbWFnaWMgbnVtYmVyLiAgV3JpdHRlbiBpbiB0aGUgYWJzZW5jZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfRDMwVgkweDc2NzYKLQotLyogVjg1MCBiYWNrZW5kIG1hZ2ljIG51bWJlci4gIFdyaXR0ZW4gaW4gdGhlIGFic2Vuc2Ugb2YgYW4gQUJJLiAgKi8KLSNkZWZpbmUgRU1fQ1lHTlVTX1Y4NTAJMHg5MDgwCi0KLS8qIG1uMTAyMDAgYW5kIG1uMTAzMDAgYmFja2VuZCBtYWdpYyBudW1iZXJzLgotICAgV3JpdHRlbiBpbiB0aGUgYWJzZW5zZSBvZiBhbiBBQkkuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfTU4xMDIwMAkweGRlYWQKLSNkZWZpbmUgRU1fQ1lHTlVTX01OMTAzMDAJMHhiZWVmCi0KLS8qIEZSMzAgbWFnaWMgbnVtYmVyIC0gbm8gRUFCSSBhdmFpbGFibGUuICAqLwotI2RlZmluZSBFTV9DWUdOVVNfRlIzMAkJMHgzMzMwCi0KLS8qIFNlZSB0aGUgYWJvdmUgY29tbWVudCBiZWZvcmUgeW91IGFkZCBhIG5ldyBFTV8qIHZhbHVlIGhlcmUuICAqLwotCi0vKiBWYWx1ZXMgZm9yIGVfdmVyc2lvbiAqLwotCi0jZGVmaW5lIEVWX05PTkUJCTAJCS8qIEludmFsaWQgRUxGIHZlcnNpb24gKi8KLSNkZWZpbmUgRVZfQ1VSUkVOVAkxCQkvKiBDdXJyZW50IHZlcnNpb24gKi8KLQotLyogVmFsdWVzIGZvciBwcm9ncmFtIGhlYWRlciwgcF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUJUFRfTlVMTAkJMAkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgdW51c2VkICovCi0jZGVmaW5lIFBUX0xPQUQJCTEJCS8qIExvYWRhYmxlIHByb2dyYW0gc2VnbWVudCAqLwotI2RlZmluZSBQVF9EWU5BTUlDCTIJCS8qIER5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBQVF9JTlRFUlAJMwkJLyogUHJvZ3JhbSBpbnRlcnByZXRlciAqLwotI2RlZmluZSBQVF9OT1RFCQk0CQkvKiBBdXhpbGlhcnkgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgUFRfU0hMSUIJNQkJLyogUmVzZXJ2ZWQsIHVuc3BlY2lmaWVkIHNlbWFudGljcyAqLwotI2RlZmluZSBQVF9QSERSCQk2CQkvKiBFbnRyeSBmb3IgaGVhZGVyIHRhYmxlIGl0c2VsZiAqLwotI2RlZmluZSBQVF9MT09TICAgICAgICAgMHg2MDAwMDAwMAkvKiBPUy1zcGVjaWZpYyAqLwotI2RlZmluZSBQVF9ISU9TICAgICAgICAgMHg2ZmZmZmZmZgkvKiBPUy1zcGVjaWZpYyAqLwotI2RlZmluZSBQVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgKi8KLSNkZWZpbmUgUFRfSElQUk9DCTB4N0ZGRkZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljICovCi0KLS8qIFByb2dyYW0gc2VnbWVudCBwZXJtaXNzaW9ucywgaW4gcHJvZ3JhbSBoZWFkZXIgcF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFBGX1gJCSgxIDw8IDApCS8qIFNlZ21lbnQgaXMgZXhlY3V0YWJsZSAqLwotI2RlZmluZSBQRl9XCQkoMSA8PCAxKQkvKiBTZWdtZW50IGlzIHdyaXRhYmxlICovCi0jZGVmaW5lIFBGX1IJCSgxIDw8IDIpCS8qIFNlZ21lbnQgaXMgcmVhZGFibGUgKi8KLSNkZWZpbmUgUEZfTUFTS09TCTB4MEYwMDAwMDAJLyogT1Mtc3BlY2lmaWMgcmVzZXJ2ZWQgYml0cyAqLwotI2RlZmluZSBQRl9NQVNLUFJPQwkweEYwMDAwMDAwCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyByZXNlcnZlZCBiaXRzICovCi0KLS8qIFZhbHVlcyBmb3Igc2VjdGlvbiBoZWFkZXIsIHNoX3R5cGUgZmllbGQgKi8KLQotI2RlZmluZSBTSFRfTlVMTAkwCQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSB1bnVzZWQgKi8KLSNkZWZpbmUgU0hUX1BST0dCSVRTCTEJCS8qIFByb2dyYW0gc3BlY2lmaWMgKHByaXZhdGUpIGRhdGEgKi8KLSNkZWZpbmUgU0hUX1NZTVRBQgkyCQkvKiBMaW5rIGVkaXRpbmcgc3ltYm9sIHRhYmxlICovCi0jZGVmaW5lIFNIVF9TVFJUQUIJMwkJLyogQSBzdHJpbmcgdGFibGUgKi8KLSNkZWZpbmUgU0hUX1JFTEEJNAkJLyogUmVsb2NhdGlvbiBlbnRyaWVzIHdpdGggYWRkZW5kcyAqLwotI2RlZmluZSBTSFRfSEFTSAk1CQkvKiBBIHN5bWJvbCBoYXNoIHRhYmxlICovCi0jZGVmaW5lIFNIVF9EWU5BTUlDCTYJCS8qIEluZm9ybWF0aW9uIGZvciBkeW5hbWljIGxpbmtpbmcgKi8KLSNkZWZpbmUgU0hUX05PVEUJNwkJLyogSW5mb3JtYXRpb24gdGhhdCBtYXJrcyBmaWxlICovCi0jZGVmaW5lIFNIVF9OT0JJVFMJOAkJLyogU2VjdGlvbiBvY2N1cGllcyBubyBzcGFjZSBpbiBmaWxlICovCi0jZGVmaW5lIFNIVF9SRUwJCTkJCS8qIFJlbG9jYXRpb24gZW50cmllcywgbm8gYWRkZW5kcyAqLwotI2RlZmluZSBTSFRfU0hMSUIJMTAJCS8qIFJlc2VydmVkLCB1bnNwZWNpZmllZCBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU0hUX0RZTlNZTQkxMQkJLyogRHluYW1pYyBsaW5raW5nIHN5bWJvbCB0YWJsZSAqLwotCi0jZGVmaW5lIFNIVF9MT09TICAgICAgICAweDYwMDAwMDAwICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNIVF9ISU9TICAgICAgICAweDZmZmZmZmZmICAgICAgLyogT3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpYyBzZW1hbnRpY3MsIGhpICovCi0KLS8qIFRoZSBuZXh0IHRocmVlIHNlY3Rpb24gdHlwZXMgYXJlIGRlZmluZWQgYnkgU29sYXJpcywgYW5kIGFyZSBuYW1lZAotICAgU0hUX1NVTlcqLiAgV2UgdXNlIHRoZW0gaW4gR05VIGNvZGUsIHNvIHdlIGFsc28gZGVmaW5lIFNIVF9HTlUqCi0gICB2ZXJzaW9ucy4gICovCi0jZGVmaW5lIFNIVF9TVU5XX3ZlcmRlZgkweDZmZmZmZmZkCS8qIFZlcnNpb25zIGRlZmluZWQgYnkgZmlsZSAqLwotI2RlZmluZSBTSFRfU1VOV192ZXJuZWVkIDB4NmZmZmZmZmUJLyogVmVyc2lvbnMgbmVlZGVkIGJ5IGZpbGUgKi8KLSNkZWZpbmUgU0hUX1NVTldfdmVyc3ltCTB4NmZmZmZmZmYJLyogU3ltYm9sIHZlcnNpb25zICovCi0KLSNkZWZpbmUgU0hUX0dOVV92ZXJkZWYJU0hUX1NVTldfdmVyZGVmCi0jZGVmaW5lIFNIVF9HTlVfdmVybmVlZAlTSFRfU1VOV192ZXJuZWVkCi0jZGVmaW5lIFNIVF9HTlVfdmVyc3ltCVNIVF9TVU5XX3ZlcnN5bQotCi0jZGVmaW5lIFNIVF9MT1BST0MJMHg3MDAwMDAwMAkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgc2VtYW50aWNzLCBsbyAqLwotI2RlZmluZSBTSFRfSElQUk9DCTB4N0ZGRkZGRkYJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLSNkZWZpbmUgU0hUX0xPVVNFUgkweDgwMDAwMDAwCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTSFRfSElVU0VSCTB4OEZGRkZGRkYJLyogQXBwbGljYXRpb24tc3BlY2lmaWMgc2VtYW50aWNzICovCi0KLS8qIFZhbHVlcyBmb3Igc2VjdGlvbiBoZWFkZXIsIHNoX2ZsYWdzIGZpZWxkICovCi0KLSNkZWZpbmUgU0hGX1dSSVRFCSgxIDw8IDApCS8qIFdyaXRhYmxlIGRhdGEgZHVyaW5nIGV4ZWN1dGlvbiAqLwotI2RlZmluZSBTSEZfQUxMT0MJKDEgPDwgMSkJLyogT2NjdXBpZXMgbWVtb3J5IGR1cmluZyBleGVjdXRpb24gKi8KLSNkZWZpbmUgU0hGX0VYRUNJTlNUUgkoMSA8PCAyKQkvKiBFeGVjdXRhYmxlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFNIRl9NQVNLT1MJMHgwRjAwMDAwMAkvKiBPUy1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLSNkZWZpbmUgU0hGX01BU0tQUk9DCTB4RjAwMDAwMDAJLyogUHJvY2Vzc29yLXNwZWNpZmljIHNlbWFudGljcyAqLwotCi0vKiBWYWx1ZXMgb2Ygbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIGNvcmUgZmlsZXMuICovCi0KLSNkZWZpbmUgTlRfUFJTVEFUVVMJMQkJLyogQ29udGFpbnMgY29weSBvZiBwcnN0YXR1cyBzdHJ1Y3QgKi8KLSNkZWZpbmUgTlRfRlBSRUdTRVQJMgkJLyogQ29udGFpbnMgY29weSBvZiBmcHJlZ3NldCBzdHJ1Y3QgKi8KLSNkZWZpbmUgTlRfUFJQU0lORk8JMwkJLyogQ29udGFpbnMgY29weSBvZiBwcnBzaW5mbyBzdHJ1Y3QgKi8KLQotLyogTm90ZSBzZWdtZW50cyBmb3IgY29yZSBmaWxlcyBvbiBkaXItc3R5bGUgcHJvY2ZzIHN5c3RlbXMuICovCi0KLSNkZWZpbmUgTlRfUFNUQVRVUwkxMAkJLyogSGFzIGEgc3RydWN0IHBzdGF0dXMgKi8KLSNkZWZpbmUgTlRfRlBSRUdTCTEyCQkvKiBIYXMgYSBzdHJ1Y3QgZnByZWdzZXQgKi8KLSNkZWZpbmUgTlRfUFNJTkZPCTEzCQkvKiBIYXMgYSBzdHJ1Y3QgcHNpbmZvICovCi0jZGVmaW5lIE5UX0xXUFNUQVRVUwkxNgkJLyogSGFzIGEgc3RydWN0IGx3cHN0YXR1c190ICovCi0jZGVmaW5lIE5UX0xXUFNJTkZPCTE3CQkvKiBIYXMgYSBzdHJ1Y3QgbHdwc2luZm9fdCAqLwotCi0vKiBWYWx1ZXMgb2Ygbm90ZSBzZWdtZW50IGRlc2NyaXB0b3IgdHlwZXMgZm9yIG9iamVjdCBmaWxlcy4gICovCi0vKiAoT25seSBmb3IgaHBwYSByaWdodCBub3cuICBTaG91bGQgdGhpcyBiZSBtb3ZlZCBlbHNld2hlcmU/KSAgKi8KLQotI2RlZmluZSBOVF9WRVJTSU9OCTEJCS8qIENvbnRhaW5zIGEgdmVyc2lvbiBzdHJpbmcuICAqLwotCi0vKiBUaGVzZSB0aHJlZSBtYWNyb3MgZGlzYXNzZW1ibGUgYW5kIGFzc2VtYmxlIGEgc3ltYm9sIHRhYmxlIHN0X2luZm8gZmllbGQsCi0gICB3aGljaCBjb250YWlucyB0aGUgc3ltYm9sIGJpbmRpbmcgYW5kIHN5bWJvbCB0eXBlLiAgVGhlIFNUQl8gYW5kIFNUVF8KLSAgIGRlZmluZXMgaWRlbnRpZnkgdGhlIGJpbmRpbmcgYW5kIHR5cGUuICovCi0KLSNkZWZpbmUgRUxGX1NUX0JJTkQodmFsKQkJKCgodW5zaWduZWQgaW50KSh2YWwpKSA+PiA0KQotI2RlZmluZSBFTEZfU1RfVFlQRSh2YWwpCQkoKHZhbCkgJiAweEYpCi0jZGVmaW5lIEVMRl9TVF9JTkZPKGJpbmQsdHlwZSkJCSgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4RikpCi0KLSNkZWZpbmUgU1ROX1VOREVGCTAJCS8qIHVuZGVmaW5lZCBzeW1ib2wgaW5kZXggKi8KLQotI2RlZmluZSBTVEJfTE9DQUwJMAkJLyogU3ltYm9sIG5vdCB2aXNpYmxlIG91dHNpZGUgb2JqICovCi0jZGVmaW5lIFNUQl9HTE9CQUwJMQkJLyogU3ltYm9sIHZpc2libGUgb3V0c2lkZSBvYmogKi8KLSNkZWZpbmUgU1RCX1dFQUsJMgkJLyogTGlrZSBnbG9iYWxzLCBsb3dlciBwcmVjZWRlbmNlICovCi0jZGVmaW5lIFNUQl9MT09TICAgICAgICAxMAkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUQl9ISU9TICAgICAgICAxMgkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUQl9MT1BST0MJMTMJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVEJfSElQUk9DCTE1CQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotI2RlZmluZSBTVFRfTk9UWVBFCTAJCS8qIFN5bWJvbCB0eXBlIGlzIHVuc3BlY2lmaWVkICovCi0jZGVmaW5lIFNUVF9PQkpFQ1QJMQkJLyogU3ltYm9sIGlzIGEgZGF0YSBvYmplY3QgKi8KLSNkZWZpbmUgU1RUX0ZVTkMJMgkJLyogU3ltYm9sIGlzIGEgY29kZSBvYmplY3QgKi8KLSNkZWZpbmUgU1RUX1NFQ1RJT04JMwkJLyogU3ltYm9sIGFzc29jaWF0ZWQgd2l0aCBhIHNlY3Rpb24gKi8KLSNkZWZpbmUgU1RUX0ZJTEUJNAkJLyogU3ltYm9sIGdpdmVzIGEgZmlsZSBuYW1lICovCi0jZGVmaW5lIFNUVF9MT09TICAgICAgICAxMAkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9ISU9TICAgICAgICAxMgkJLyogT1Mtc3BlY2lmaWMgc2VtYW50aWNzICovCi0jZGVmaW5lIFNUVF9MT1BST0MJMTMJCS8qIEFwcGxpY2F0aW9uLXNwZWNpZmljIHNlbWFudGljcyAqLwotI2RlZmluZSBTVFRfSElQUk9DCTE1CQkvKiBBcHBsaWNhdGlvbi1zcGVjaWZpYyBzZW1hbnRpY3MgKi8KLQotLyogU3BlY2lhbCBzZWN0aW9uIGluZGljZXMsIHdoaWNoIG1heSBzaG93IHVwIGluIHN0X3NobmR4IGZpZWxkcywgYW1vbmcKLSAgIG90aGVyIHBsYWNlcy4gKi8KLQotI2RlZmluZSBTSE5fVU5ERUYJMAkJLyogVW5kZWZpbmVkIHNlY3Rpb24gcmVmZXJlbmNlICovCi0jZGVmaW5lIFNITl9MT1JFU0VSVkUJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiByZXNlcnZlZCBpbmRpY2VzICovCi0jZGVmaW5lIFNITl9MT1BST0MJMHhGRjAwCQkvKiBCZWdpbiByYW5nZSBvZiBhcHBsLXNwZWNpZmljICovCi0jZGVmaW5lIFNITl9ISVBST0MJMHhGRjFGCQkvKiBFbmQgcmFuZ2Ugb2YgYXBwbC1zcGVjaWZpYyAqLwotI2RlZmluZSBTSE5fTE9PUyAgICAgICAgMHhGRjIwCQkvKiBPUyBzcGVjaWZpYyBzZW1hbnRpY3MsIGxvICovCi0jZGVmaW5lIFNITl9ISU9TICAgICAgICAweEZGM0YJCS8qIE9TIHNwZWNpZmljIHNlbWFudGljcywgaGkgKi8KLSNkZWZpbmUgU0hOX0FCUwkJMHhGRkYxCQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBpcyBhYnNvbHV0ZSAqLwotI2RlZmluZSBTSE5fQ09NTU9OCTB4RkZGMgkJLyogQXNzb2NpYXRlZCBzeW1ib2wgaXMgaW4gY29tbW9uICovCi0jZGVmaW5lIFNITl9ISVJFU0VSVkUJMHhGRkZGCQkvKiBFbmQgcmFuZ2Ugb2YgcmVzZXJ2ZWQgaW5kaWNlcyAqLwotCi0vKiByZWxvY2F0aW9uIGluZm8gaGFuZGxpbmcgbWFjcm9zICovCi0KLSNkZWZpbmUgRUxGMzJfUl9TWU0oaSkJCSgoaSkgPj4gOCkKLSNkZWZpbmUgRUxGMzJfUl9UWVBFKGkpCQkoKGkpICYgMHhmZikKLSNkZWZpbmUgRUxGMzJfUl9JTkZPKHMsdCkJKCgocykgPDwgOCkgKyAoKHQpICYgMHhmZikpCi0KLSNkZWZpbmUgRUxGNjRfUl9TWU0oaSkJCSgoaSkgPj4gMzIpCi0jZGVmaW5lIEVMRjY0X1JfVFlQRShpKQkJKChpKSAmIDB4ZmZmZmZmZmYpCi0jZGVmaW5lIEVMRjY0X1JfSU5GTyhzLHQpCSgoKGJmZF92bWEpIChzKSA8PCAzMikgKyAoYmZkX3ZtYSkgKHQpKQotCi0vKiBEeW5hbWljIHNlY3Rpb24gdGFncyAqLwotCi0jZGVmaW5lIERUX05VTEwJCTAKLSNkZWZpbmUgRFRfTkVFREVECTEKLSNkZWZpbmUgRFRfUExUUkVMU1oJMgotI2RlZmluZSBEVF9QTFRHT1QJMwotI2RlZmluZSBEVF9IQVNICQk0Ci0jZGVmaW5lIERUX1NUUlRBQgk1Ci0jZGVmaW5lIERUX1NZTVRBQgk2Ci0jZGVmaW5lIERUX1JFTEEJCTcKLSNkZWZpbmUgRFRfUkVMQVNaCTgKLSNkZWZpbmUgRFRfUkVMQUVOVAk5Ci0jZGVmaW5lIERUX1NUUlNaCTEwCi0jZGVmaW5lIERUX1NZTUVOVAkxMQotI2RlZmluZSBEVF9JTklUCQkxMgotI2RlZmluZSBEVF9GSU5JCQkxMwotI2RlZmluZSBEVF9TT05BTUUJMTQKLSNkZWZpbmUgRFRfUlBBVEgJMTUKLSNkZWZpbmUgRFRfU1lNQk9MSUMJMTYKLSNkZWZpbmUgRFRfUkVMCQkxNwotI2RlZmluZSBEVF9SRUxTWgkxOAotI2RlZmluZSBEVF9SRUxFTlQJMTkKLSNkZWZpbmUgRFRfUExUUkVMCTIwCi0jZGVmaW5lIERUX0RFQlVHCTIxCi0jZGVmaW5lIERUX1RFWFRSRUwJMjIKLSNkZWZpbmUgRFRfSk1QUkVMCTIzCi0jZGVmaW5lIERUX0JJTkRfTk9XICAgICAyNAotI2RlZmluZSBEVF9JTklUX0FSUkFZICAgMjUKLSNkZWZpbmUgRFRfRklOSV9BUlJBWSAgIDI2Ci0jZGVmaW5lIERUX0lOSVRfQVJSQVlTWiAyNwotI2RlZmluZSBEVF9GSU5JX0FSUkFZU1ogMjgKLQotI2RlZmluZSBEVF9MT09TICAgICAgICAgMHg2MDAwMDAwMAotI2RlZmluZSBEVF9ISU9TICAgICAgICAgMHg2ZmZmZmZmZgotCi0vKiBUaGUgbmV4dCBmb3VyIGR5bmFtaWMgdGFncyBhcmUgdXNlZCBvbiBTb2xhcmlzLiAgV2Ugc3VwcG9ydCB0aGVtCi0gICBldmVyeXdoZXJlLiAgKi8KLSNkZWZpbmUgRFRfVkFMUk5HTE8JMHg2ZmZmZmQwMAotI2RlZmluZSBEVF9QTFRQQURTWgkweDZmZmZmZGY5Ci0jZGVmaW5lIERUX01PVkVFTlQJMHg2ZmZmZmRmYQotI2RlZmluZSBEVF9NT1ZFU1oJMHg2ZmZmZmRmYgotI2RlZmluZSBEVF9GRUFUVVJFXzEJMHg2ZmZmZmRmYwotI2RlZmluZSBEVF9QT1NGTEFHXzEJMHg2ZmZmZmRmZAotI2RlZmluZSBEVF9TWU1JTlNaCTB4NmZmZmZkZmUKLSNkZWZpbmUgRFRfU1lNSU5FTlQJMHg2ZmZmZmRmZgotI2RlZmluZSBEVF9WQUxSTkdISQkweDZmZmZmZGZmCi0KLSNkZWZpbmUgRFRfQUREUlJOR0xPCTB4NmZmZmZlMDAKLSNkZWZpbmUgRFRfU1lNSU5GTwkweDZmZmZmZWZmCi0jZGVmaW5lIERUX0FERFJSTkdISQkweDZmZmZmZWZmCi0KLSNkZWZpbmUgRFRfUkVMQUNPVU5UCTB4NmZmZmZmZjkKLSNkZWZpbmUgRFRfUkVMQ09VTlQJMHg2ZmZmZmZmYQotI2RlZmluZSBEVF9GTEFHU18xCTB4NmZmZmZmZmIKLSNkZWZpbmUgRFRfVkVSREVGCTB4NmZmZmZmZmMKLSNkZWZpbmUgRFRfVkVSREVGTlVNCTB4NmZmZmZmZmQKLSNkZWZpbmUgRFRfVkVSTkVFRAkweDZmZmZmZmZlCi0jZGVmaW5lIERUX1ZFUk5FRUROVU0JMHg2ZmZmZmZmZgotCi0vKiBUaGlzIHRhZyBpcyBhIEdOVSBleHRlbnNpb24gdG8gdGhlIFNvbGFyaXMgdmVyc2lvbiBzY2hlbWUuICAqLwotI2RlZmluZSBEVF9WRVJTWU0JMHg2ZmZmZmZmMAotCi0jZGVmaW5lIERUX0xPUFJPQwkweDcwMDAwMDAwCi0jZGVmaW5lIERUX0hJUFJPQwkweDdmZmZmZmZmCi0KLS8qIFRoZXNlIHNlY3Rpb24gdGFncyBhcmUgdXNlZCBvbiBTb2xhcmlzLiAgV2Ugc3VwcG9ydCB0aGVtCi0gICBldmVyeXdoZXJlLCBhbmQgaG9wZSB0aGV5IGRvIG5vdCBjb25mbGljdC4gICovCi0KLSNkZWZpbmUgRFRfQVVYSUxJQVJZCTB4N2ZmZmZmZmQKLSNkZWZpbmUgRFRfVVNFRAkJMHg3ZmZmZmZmZQotI2RlZmluZSBEVF9GSUxURVIJMHg3ZmZmZmZmZgotCi0vKiBWYWx1ZXMgdXNlZCBpbiBEVF9GRUFUVVJFXzEgLmR5bmFtaWMgZW50cnkuICAqLwotI2RlZmluZSBEVEZfMV9QQVJJTklUCTB4MDAwMDAwMDEKLQotLyogRmxhZyB2YWx1ZXMgdXNlZCBpbiB0aGUgRFRfUE9TRkxBR18xIC5keW5hbWljIGVudHJ5LiAgKi8KLSNkZWZpbmUgREZfUDFfTEFaWUxPQUQJMHgwMDAwMDAwMQotI2RlZmluZSBERl9QMV9HUk9VUFBFUk0JMHgwMDAwMDAwMgotCi0vKiBGbGFnIHZhbHVlIGluIGluIHRoZSBEVF8xX0ZMQUdTIC5keW5hbWljIGVudHJ5LiAgKi8KLSNkZWZpbmUgREZfMV9OT1cJMHgwMDAwMDAwMQotI2RlZmluZSBERl8xX0dMT0JBTAkweDAwMDAwMDAyCi0jZGVmaW5lIERGXzFfR1JPVVAJMHgwMDAwMDAwNAotI2RlZmluZSBERl8xX05PREVMRVRFCTB4MDAwMDAwMDgKLSNkZWZpbmUgREZfMV9MT0FERkxUUgkweDAwMDAwMDEwCi0jZGVmaW5lIERGXzFfSU5JVEZJUlNUCTB4MDAwMDAwMjAKLSNkZWZpbmUgREZfMV9OT09QRU4JMHgwMDAwMDA0MAotI2RlZmluZSBERl8xX09SSUdJTgkweDAwMDAwMDgwCi0jZGVmaW5lIERGXzFfRElSRUNUCTB4MDAwMDAxMDAKLSNkZWZpbmUgREZfMV9UUkFOUwkweDAwMDAwMjAwCi0jZGVmaW5lIERGXzFfSU5URVJQT1NFCTB4MDAwMDA0MDAKLQotLyogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgb2YgYSBFbGYzMl9WZXJkZWYKLSAgIHN0cnVjdHVyZS4gICovCi0KLSNkZWZpbmUgVkVSX0RFRl9OT05FCQkwCi0jZGVmaW5lIFZFUl9ERUZfQ1VSUkVOVAkJMQotCi0vKiBUaGVzZSBjb25zdGFudHMgYXBwZWFyIGluIHRoZSB2ZF9mbGFncyBmaWVsZCBvZiBhIEVsZjMyX1ZlcmRlZgotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfRkxHX0JBU0UJCTB4MQotI2RlZmluZSBWRVJfRkxHX1dFQUsJCTB4MgotCi0vKiBUaGVzZSBzcGVjaWFsIGNvbnN0YW50cyBjYW4gYmUgZm91bmQgaW4gYW4gRWxmMzJfVmVyc3ltIGZpZWxkLiAgKi8KLQotI2RlZmluZSBWRVJfTkRYX0xPQ0FMCQkwCi0jZGVmaW5lIFZFUl9ORFhfR0xPQkFMCQkxCi0KLS8qIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGEgRWxmMzJfVmVybmVlZAotICAgc3RydWN0dXJlLiAgKi8KLQotI2RlZmluZSBWRVJfTkVFRF9OT05FCQkwCi0jZGVmaW5lIFZFUl9ORUVEX0NVUlJFTlQJMQotCi0vKiBUaGlzIGZsYWcgYXBwZWFycyBpbiBhIFZlcnN5bSBzdHJ1Y3R1cmUuICBJdCBtZWFucyB0aGF0IHRoZSBzeW1ib2wKLSAgIGlzIGhpZGRlbiwgYW5kIGlzIG9ubHkgdmlzaWJsZSB3aXRoIGFuIGV4cGxpY2l0IHZlcnNpb24gbnVtYmVyLgotICAgVGhpcyBpcyBhIEdOVSBleHRlbnNpb24uICAqLwotCi0jZGVmaW5lIFZFUlNZTV9ISURERU4JCTB4ODAwMAotCi0vKiBUaGlzIGlzIHRoZSBtYXNrIGZvciB0aGUgcmVzdCBvZiB0aGUgVmVyc3ltIGluZm9ybWF0aW9uLiAgKi8KLQotI2RlZmluZSBWRVJTWU1fVkVSU0lPTgkJMHg3ZmZmCi0KLS8qIFRoaXMgaXMgYSBzcGVjaWFsIHRva2VuIHdoaWNoIGFwcGVhcnMgYXMgcGFydCBvZiBhIHN5bWJvbCBuYW1lLiAgSXQKLSAgIGluZGljdGVzIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIG5hbWUgaXMgYWN0dWFsbHkgdGhlIG5hbWUgb2YgYQotICAgdmVyc2lvbiBub2RlLCBhbmQgaXMgbm90IHBhcnQgb2YgdGhlIGFjdHVhbCBuYW1lLiAgVGhpcyBpcyBhIEdOVQotICAgZXh0ZW5zaW9uLiAgRm9yIGV4YW1wbGUsIHRoZSBzeW1ib2wgbmFtZSBgc3RhdEB2ZXIyJyBpcyB0YWtlbiB0bwotICAgbWVhbiB0aGUgc3ltYm9sIGBzdGF0JyBpbiB2ZXJzaW9uIGB2ZXIyJy4gICovCi0KLSNkZWZpbmUgRUxGX1ZFUl9DSFIJJ0AnCi0KLS8qIFBvc3NpYmxlIHZhbHVlcyBmb3Igc2lfYm91bmR0by4gICovCi0jZGVmaW5lIFNZTUlORk9fQlRfU0VMRgkJMHhmZmZmCS8qIFN5bWJvbCBib3VuZCB0byBzZWxmICovCi0jZGVmaW5lIFNZTUlORk9fQlRfUEFSRU5UCTB4ZmZmZQkvKiBTeW1ib2wgYm91bmQgdG8gcGFyZW50ICovCi0jZGVmaW5lIFNZTUlORk9fQlRfTE9XUkVTRVJWRQkweGZmMDAJLyogQmVnaW5uaW5nIG9mIHJlc2VydmVkIGVudHJpZXMgKi8KLQotLyogUG9zc2libGUgYml0bWFza3MgZm9yIHNpX2ZsYWdzLiAgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfRElSRUNUCTB4MDAwMQkvKiBEaXJlY3QgYm91bmQgc3ltYm9sICovCi0jZGVmaW5lIFNZTUlORk9fRkxHX1BBU1NUSFJVCTB4MDAwMgkvKiBQYXNzLXRocnUgc3ltYm9sIGZvciB0cmFuc2xhdG9yICovCi0jZGVmaW5lIFNZTUlORk9fRkxHX0NPUFkJMHgwMDA0CS8qIFN5bWJvbCBpcyBhIGNvcHktcmVsb2MgKi8KLSNkZWZpbmUgU1lNSU5GT19GTEdfTEFaWUxPQUQJMHgwMDA4CS8qIFN5bWJvbCBib3VuZCB0byBvYmplY3QgdG8gYmUgbGF6eQotCQkJCQkgICBsb2FkZWQgKi8KLS8qIFN5bWluZm8gdmVyc2lvbiB2YWx1ZXMuICAqLwotI2RlZmluZSBTWU1JTkZPX05PTkUJCTAKLSNkZWZpbmUgU1lNSU5GT19DVVJSRU5UCQkxCi0jZGVmaW5lIFNZTUlORk9fTlVNCQkyCi0KLSNlbmRpZiAvKiBfRUxGX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kMTB2LmggYi9pbmNsdWRlL2VsZi9kMTB2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjc5YzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZDEwdi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogZDEwdiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9EMTBWX0gKLSNkZWZpbmUgX0VMRl9EMTBWX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbiB0eXBlcy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfZDEwdl9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xMF9QQ1JFTF9SLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xMF9QQ1JFTF9MLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8xNiwgMykKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfMTgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9EMTBWXzE4X1BDUkVMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfRDEwVl8zMiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfR05VX1ZUSU5IRVJJVCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX0QxMFZfR05VX1ZURU5UUlksIDgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2QzMHYuaCBiL2luY2x1ZGUvZWxmL2QzMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiYWQxOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9kMzB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKiBkMzB2IEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0QzMFZfSAotI2RlZmluZSBfRUxGX0QzMFZfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfZDMwdl9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl82LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl85X1BDUkVMLCAyKQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl85X1BDUkVMX1IsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzE1LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8xNV9QQ1JFTCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMTVfUENSRUxfUiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMjEsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzIxX1BDUkVMLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8yMV9QQ1JFTF9SLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfRDMwVl8zMiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9EMzBWXzMyX1BDUkVMLCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX0QzMFZfMzJfTk9STUFMLCAxMikKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZHdhcmYuaCBiL2luY2x1ZGUvZWxmL2R3YXJmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNzJjZDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZHdhcmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKiBEZWNsYXJhdGlvbnMgYW5kIGRlZmluaXRpb25zIG9mIGNvZGVzIHJlbGF0aW5nIHRvIHRoZSBEV0FSRiBzeW1ib2xpYwotICAgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvcm1hdC4KLQotICAgV3JpdHRlbiBieSBSb24gR3VpbG1ldHRlIChyZmdAbmNkLmNvbSkKLQotQ29weXJpZ2h0IChDKSAxOTkyLCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0KLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgRFdBUkYgc3BlY2lmaWNhdGlvbiAoYSBwdWJsaWMgZG9jdW1lbnQpCi0gICBSZXZpc2lvbiAxLjAuMSAoQXByaWwgOCwgMTk5MikgZGV2ZWxvcGVkIGJ5IHRoZSBVTklYIEludGVybmF0aW9uYWwKLSAgIFByb2dyYW1taW5nIExhbmd1YWdlcyBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChVSS9QTFNJRykgYW5kIGRpc3RyaWJ1dGVkCi0gICBieSBVTklYIEludGVybmF0aW9uYWwuICBDb3BpZXMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGFyZSBhdmFpbGFibGUgZnJvbQotICAgVU5JWCBJbnRlcm5hdGlvbmFsLCAyMCBXYXRlcnZpZXcgQm91bGV2YXJkLCBQYXJzaXBwYW55LCBOSiwgMDcwNTQuCi0qLwotCi0jaWZuZGVmIF9FTEZfRFdBUkZfSAotI2RlZmluZSBfRUxGX0RXQVJGX0gKLQotLyogVGFnIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdGFnIHsKLSAgICBUQUdfcGFkZGluZwkJCT0gMHgwMDAwLAotICAgIFRBR19hcnJheV90eXBlCQk9IDB4MDAwMSwKLSAgICBUQUdfY2xhc3NfdHlwZQkJPSAweDAwMDIsCi0gICAgVEFHX2VudHJ5X3BvaW50CQk9IDB4MDAwMywKLSAgICBUQUdfZW51bWVyYXRpb25fdHlwZQk9IDB4MDAwNCwKLSAgICBUQUdfZm9ybWFsX3BhcmFtZXRlcgk9IDB4MDAwNSwKLSAgICBUQUdfZ2xvYmFsX3N1YnJvdXRpbmUJPSAweDAwMDYsCi0gICAgVEFHX2dsb2JhbF92YXJpYWJsZQkJPSAweDAwMDcsCi0gICAgCQkJCS8qIDB4MDAwOCAtLSByZXNlcnZlZCAqLwotCQkJCS8qIDB4MDAwOSAtLSByZXNlcnZlZCAqLwotICAgIFRBR19sYWJlbAkJCT0gMHgwMDBhLAotICAgIFRBR19sZXhpY2FsX2Jsb2NrCQk9IDB4MDAwYiwKLSAgICBUQUdfbG9jYWxfdmFyaWFibGUJCT0gMHgwMDBjLAotICAgIFRBR19tZW1iZXIJCQk9IDB4MDAwZCwKLQkJCQkvKiAweDAwMGUgLS0gcmVzZXJ2ZWQgKi8KLSAgICBUQUdfcG9pbnRlcl90eXBlCQk9IDB4MDAwZiwKLSAgICBUQUdfcmVmZXJlbmNlX3R5cGUJCT0gMHgwMDEwLAotICAgIFRBR19jb21waWxlX3VuaXQJCT0gMHgwMDExLAotICAgIFRBR19zdHJpbmdfdHlwZQkJPSAweDAwMTIsCi0gICAgVEFHX3N0cnVjdHVyZV90eXBlCQk9IDB4MDAxMywKLSAgICBUQUdfc3Vicm91dGluZQkJPSAweDAwMTQsCi0gICAgVEFHX3N1YnJvdXRpbmVfdHlwZQkJPSAweDAwMTUsCi0gICAgVEFHX3R5cGVkZWYJCQk9IDB4MDAxNiwKLSAgICBUQUdfdW5pb25fdHlwZQkJPSAweDAwMTcsCi0gICAgVEFHX3Vuc3BlY2lmaWVkX3BhcmFtZXRlcnMJPSAweDAwMTgsCi0gICAgVEFHX3ZhcmlhbnQJCQk9IDB4MDAxOSwKLSAgICBUQUdfY29tbW9uX2Jsb2NrCQk9IDB4MDAxYSwKLSAgICBUQUdfY29tbW9uX2luY2x1c2lvbgk9IDB4MDAxYiwKLSAgICBUQUdfaW5oZXJpdGFuY2UJCT0gMHgwMDFjLAotICAgIFRBR19pbmxpbmVkX3N1YnJvdXRpbmUJPSAweDAwMWQsCi0gICAgVEFHX21vZHVsZQkJCT0gMHgwMDFlLAotICAgIFRBR19wdHJfdG9fbWVtYmVyX3R5cGUJPSAweDAwMWYsCi0gICAgVEFHX3NldF90eXBlCQk9IDB4MDAyMCwKLSAgICBUQUdfc3VicmFuZ2VfdHlwZQkJPSAweDAwMjEsCi0gICAgVEFHX3dpdGhfc3RtdAkJPSAweDAwMjIsCi0KLSAgICAvKiBHTlUgZXh0ZW5zaW9ucyAqLwotCi0gICAgVEFHX2Zvcm1hdF9sYWJlbAkJPSAweDgwMDAsICAvKiBmb3IgRk9SVFJBTiA3NyBhbmQgRm9ydHJhbiA5MCAqLwotICAgIFRBR19uYW1lbGlzdAkJPSAweDgwMDEsICAvKiBGb3IgRm9ydHJhbiA5MCAqLwotICAgIFRBR19mdW5jdGlvbl90ZW1wbGF0ZQk9IDB4ODAwMiwgIC8qIGZvciBDKysgKi8KLSAgICBUQUdfY2xhc3NfdGVtcGxhdGUJCT0gMHg4MDAzICAgLyogZm9yIEMrKyAqLwotfTsKLQotI2RlZmluZSBUQUdfbG9fdXNlcgkweDgwMDAgIC8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgVEFHX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotI2RlZmluZSBUQUdfc291cmNlX2ZpbGUgVEFHX2NvbXBpbGVfdW5pdCAgLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKi8KLQotLyogRm9ybSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2Zvcm0gewotICAgIEZPUk1fQUREUgk9IDB4MSwKLSAgICBGT1JNX1JFRgk9IDB4MiwKLSAgICBGT1JNX0JMT0NLMgk9IDB4MywKLSAgICBGT1JNX0JMT0NLNAk9IDB4NCwKLSAgICBGT1JNX0RBVEEyCT0gMHg1LAotICAgIEZPUk1fREFUQTQJPSAweDYsCi0gICAgRk9STV9EQVRBOAk9IDB4NywKLSAgICBGT1JNX1NUUklORwk9IDB4OAotfTsKLQotLyogQXR0cmlidXRlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfYXR0cmlidXRlIHsKLSAgICBBVF9zaWJsaW5nCQkJPSAoMHgwMDEwfEZPUk1fUkVGKSwKLSAgICBBVF9sb2NhdGlvbgkJCT0gKDB4MDAyMHxGT1JNX0JMT0NLMiksCi0gICAgQVRfbmFtZQkJCT0gKDB4MDAzMHxGT1JNX1NUUklORyksCi0gICAgQVRfZnVuZF90eXBlCQk9ICgweDAwNTB8Rk9STV9EQVRBMiksCi0gICAgQVRfbW9kX2Z1bmRfdHlwZQkJPSAoMHgwMDYwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF91c2VyX2RlZl90eXBlCQk9ICgweDAwNzB8Rk9STV9SRUYpLAotICAgIEFUX21vZF91X2RfdHlwZQkJPSAoMHgwMDgwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9vcmRlcmluZwkJCT0gKDB4MDA5MHxGT1JNX0RBVEEyKSwKLSAgICBBVF9zdWJzY3JfZGF0YQkJPSAoMHgwMGEwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9ieXRlX3NpemUJCT0gKDB4MDBiMHxGT1JNX0RBVEE0KSwKLSAgICBBVF9iaXRfb2Zmc2V0CQk9ICgweDAwYzB8Rk9STV9EQVRBMiksCi0gICAgQVRfYml0X3NpemUJCQk9ICgweDAwZDB8Rk9STV9EQVRBNCksCi0JCQkJLyogKDB4MDBlMHxGT1JNX3h4eHgpIC0tIHJlc2VydmVkICovCi0gICAgQVRfZWxlbWVudF9saXN0CQk9ICgweDAwZjB8Rk9STV9CTE9DSzQpLAotICAgIEFUX3N0bXRfbGlzdAkJPSAoMHgwMTAwfEZPUk1fREFUQTQpLAotICAgIEFUX2xvd19wYwkJCT0gKDB4MDExMHxGT1JNX0FERFIpLAotICAgIEFUX2hpZ2hfcGMJCQk9ICgweDAxMjB8Rk9STV9BRERSKSwKLSAgICBBVF9sYW5ndWFnZQkJCT0gKDB4MDEzMHxGT1JNX0RBVEE0KSwKLSAgICBBVF9tZW1iZXIJCQk9ICgweDAxNDB8Rk9STV9SRUYpLAotICAgIEFUX2Rpc2NyCQkJPSAoMHgwMTUwfEZPUk1fUkVGKSwKLSAgICBBVF9kaXNjcl92YWx1ZQkJPSAoMHgwMTYwfEZPUk1fQkxPQ0syKSwKLQkJCQkvKiAoMHgwMTcwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLQkJCQkvKiAoMHgwMTgwfEZPUk1feHh4eCkgLS0gcmVzZXJ2ZWQgKi8KLSAgICBBVF9zdHJpbmdfbGVuZ3RoCQk9ICgweDAxOTB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2NvbW1vbl9yZWZlcmVuY2UJCT0gKDB4MDFhMHxGT1JNX1JFRiksCi0gICAgQVRfY29tcF9kaXIJCQk9ICgweDAxYjB8Rk9STV9TVFJJTkcpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9zdHJpbmcJPSAoMHgwMWMwfEZPUk1fU1RSSU5HKSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfZGF0YTIJPSAoMHgwMWMwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF9jb25zdF92YWx1ZV9kYXRhNAk9ICgweDAxYzB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2RhdGE4CT0gKDB4MDFjMHxGT1JNX0RBVEE4KSwKLSAgICAgICAgQVRfY29uc3RfdmFsdWVfYmxvY2syCT0gKDB4MDFjMHxGT1JNX0JMT0NLMiksCi0gICAgICAgIEFUX2NvbnN0X3ZhbHVlX2Jsb2NrNAk9ICgweDAxYzB8Rk9STV9CTE9DSzQpLAotICAgIEFUX2NvbnRhaW5pbmdfdHlwZQkJPSAoMHgwMWQwfEZPUk1fUkVGKSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9hZGRyCT0gKDB4MDFlMHxGT1JNX0FERFIpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX2RhdGEyCT0gKDB4MDFlMHxGT1JNX0RBVEEyKSwKLSAgICAgICAgQVRfZGVmYXVsdF92YWx1ZV9kYXRhNAk9ICgweDAxZTB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX2RlZmF1bHRfdmFsdWVfZGF0YTgJPSAoMHgwMWUwfEZPUk1fREFUQTgpLAotICAgICAgICBBVF9kZWZhdWx0X3ZhbHVlX3N0cmluZwk9ICgweDAxZTB8Rk9STV9TVFJJTkcpLAotICAgIEFUX2ZyaWVuZHMJCQk9ICgweDAxZjB8Rk9STV9CTE9DSzIpLAotICAgIEFUX2lubGluZQkJCT0gKDB4MDIwMHxGT1JNX1NUUklORyksCi0gICAgQVRfaXNfb3B0aW9uYWwJCT0gKDB4MDIxMHxGT1JNX1NUUklORyksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX3JlZgk9ICgweDAyMjB8Rk9STV9SRUYpLAotICAgICAgICBBVF9sb3dlcl9ib3VuZF9kYXRhMgk9ICgweDAyMjB8Rk9STV9EQVRBMiksCi0gICAgICAgIEFUX2xvd2VyX2JvdW5kX2RhdGE0CT0gKDB4MDIyMHxGT1JNX0RBVEE0KSwKLSAgICAgICAgQVRfbG93ZXJfYm91bmRfZGF0YTgJPSAoMHgwMjIwfEZPUk1fREFUQTgpLAotICAgIEFUX3ByaXZhdGUJCQk9ICgweDAyNDB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3Byb2R1Y2VyCQkJPSAoMHgwMjUwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm9ncmFtCQkJPSAoMHgwMjMwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wcm90ZWN0ZWQJCT0gKDB4MDI2MHxGT1JNX1NUUklORyksCi0gICAgQVRfcHJvdG90eXBlZAkJPSAoMHgwMjcwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9wdWJsaWMJCQk9ICgweDAyODB8Rk9STV9TVFJJTkcpLAotICAgIEFUX3B1cmVfdmlydHVhbAkJPSAoMHgwMjkwfEZPUk1fU1RSSU5HKSwKLSAgICBBVF9yZXR1cm5fYWRkcgkJPSAoMHgwMmEwfEZPUk1fQkxPQ0syKSwKLSAgICBBVF9hYnN0cmFjdF9vcmlnaW4JCT0gKDB4MDJiMHxGT1JNX1JFRiksCi0gICAgQVRfc3RhcnRfc2NvcGUJCT0gKDB4MDJjMHxGT1JNX0RBVEE0KSwKLSAgICBBVF9zdHJpZGVfc2l6ZQkJPSAoMHgwMmUwfEZPUk1fREFUQTQpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9yZWYJPSAoMHgwMmYwfEZPUk1fUkVGKSwKLSAgICAgICAgQVRfdXBwZXJfYm91bmRfZGF0YTIJPSAoMHgwMmYwfEZPUk1fREFUQTIpLAotICAgICAgICBBVF91cHBlcl9ib3VuZF9kYXRhNAk9ICgweDAyZjB8Rk9STV9EQVRBNCksCi0gICAgICAgIEFUX3VwcGVyX2JvdW5kX2RhdGE4CT0gKDB4MDJmMHxGT1JNX0RBVEE4KSwKLSAgICBBVF92aXJ0dWFsCQkJPSAoMHgwMzAwfEZPUk1fU1RSSU5HKSwKLQotICAgIC8qIEdOVSBleHRlbnNpb25zLiAgKi8KLQotICAgIEFUX3NmX25hbWVzCQkJPSAoMHg4MDAwfEZPUk1fREFUQTQpLAotICAgIEFUX3NyY19pbmZvCQkJPSAoMHg4MDEwfEZPUk1fREFUQTQpLAotICAgIEFUX21hY19pbmZvCQkJPSAoMHg4MDIwfEZPUk1fREFUQTQpLAotICAgIEFUX3NyY19jb29yZHMJCT0gKDB4ODAzMHxGT1JNX0RBVEE0KSwKLSAgICBBVF9ib2R5X2JlZ2luCQk9ICgweDgwNDB8Rk9STV9BRERSKSwKLSAgICBBVF9ib2R5X2VuZAkJCT0gKDB4ODA1MHxGT1JNX0FERFIpCi19OwotCi0jZGVmaW5lIEFUX2xvX3VzZXIJMHg4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIEFUX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBMb2NhdGlvbiBhdG9tIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfbG9jYXRpb25fYXRvbSB7Ci0gICAgT1BfUkVHCT0gMHgwMSwKLSAgICBPUF9CQVNFUkVHCT0gMHgwMiwKLSAgICBPUF9BRERSCT0gMHgwMywKLSAgICBPUF9DT05TVAk9IDB4MDQsCi0gICAgT1BfREVSRUYyCT0gMHgwNSwKLSAgICBPUF9ERVJFRjQJPSAweDA2LAotICAgIE9QX0FERAk9IDB4MDcKLX07Ci0KLSNkZWZpbmUgT1BfTE9fVVNFUgkweDgwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIE9QX0hJX1VTRVIJMHhmZiAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KLQotLyogRnVuZGFtZW50YWwgdHlwZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2Z1bmRhbWVudGFsX3R5cGUgewotICAgIEZUX2NoYXIJCT0gMHgwMDAxLAotICAgIEZUX3NpZ25lZF9jaGFyCT0gMHgwMDAyLAotICAgIEZUX3Vuc2lnbmVkX2NoYXIJPSAweDAwMDMsCi0gICAgRlRfc2hvcnQJCT0gMHgwMDA0LAotICAgIEZUX3NpZ25lZF9zaG9ydAk9IDB4MDAwNSwKLSAgICBGVF91bnNpZ25lZF9zaG9ydAk9IDB4MDAwNiwKLSAgICBGVF9pbnRlZ2VyCQk9IDB4MDAwNywKLSAgICBGVF9zaWduZWRfaW50ZWdlcgk9IDB4MDAwOCwKLSAgICBGVF91bnNpZ25lZF9pbnRlZ2VyCT0gMHgwMDA5LAotICAgIEZUX2xvbmcJCT0gMHgwMDBhLAotICAgIEZUX3NpZ25lZF9sb25nCT0gMHgwMDBiLAotICAgIEZUX3Vuc2lnbmVkX2xvbmcJPSAweDAwMGMsCi0gICAgRlRfcG9pbnRlcgkJPSAweDAwMGQsICAvKiBhbiBhbGlhcyBmb3IgKHZvaWQgKikgKi8KLSAgICBGVF9mbG9hdAkJPSAweDAwMGUsCi0gICAgRlRfZGJsX3ByZWNfZmxvYXQJPSAweDAwMGYsCi0gICAgRlRfZXh0X3ByZWNfZmxvYXQJPSAweDAwMTAsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfY29tcGxleAkJPSAweDAwMTEsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfZGJsX3ByZWNfY29tcGxleAk9IDB4MDAxMiwgIC8qIGJyZWFrcyAiY2xhc3NpYyIgc3ZyNCBTREIgKi8KLQkJCS8qIDB4MDAxMyAtLSByZXNlcnZlZCAqLwotICAgIEZUX3ZvaWQJCT0gMHgwMDE0LAotICAgIEZUX2Jvb2xlYW4JCT0gMHgwMDE1LCAgLyogYnJlYWtzICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotICAgIEZUX2V4dF9wcmVjX2NvbXBsZXgJPSAweDAwMTYsICAvKiBicmVha3MgImNsYXNzaWMiIHN2cjQgU0RCICovCi0gICAgRlRfbGFiZWwJCT0gMHgwMDE3LAotICAKLSAgICAvKiBHTlUgZXh0ZW5zaW9ucwotICAgICAgIFRoZSBsb3cgb3JkZXIgYnl0ZSBtdXN0IGluZGljYXRlIHRoZSBzaXplIChpbiBieXRlcykgZm9yIHRoZSB0eXBlLgotICAgICAgIEFsbCBvZiB0aGVzZSB0eXBlcyB3aWxsIHByb2JhYmx5IGJyZWFrICJjbGFzc2ljIiBzdnI0IFNEQiAqLwotCi0gICAgRlRfbG9uZ19sb25nCT0gMHg4MDA4LAotICAgIEZUX3NpZ25lZF9sb25nX2xvbmcJPSAweDgxMDgsCi0gICAgRlRfdW5zaWduZWRfbG9uZ19sb25nID0gMHg4MjA4LAotCi0gICAgRlRfaW50OAkJPSAweDkwMDEsCi0gICAgRlRfc2lnbmVkX2ludDgJPSAweDkxMDEsCi0gICAgRlRfdW5zaWduZWRfaW50OAk9IDB4OTIwMSwKLSAgICBGVF9pbnQxNgkJPSAweDkzMDIsCi0gICAgRlRfc2lnbmVkX2ludDE2CT0gMHg5NDAyLAotICAgIEZUX3Vuc2lnbmVkX2ludDE2CT0gMHg5NTAyLAotICAgIEZUX2ludDMyCQk9IDB4OTYwNCwKLSAgICBGVF9zaWduZWRfaW50MzIJPSAweDk3MDQsCi0gICAgRlRfdW5zaWduZWRfaW50MzIJPSAweDk4MDQsCi0gICAgRlRfaW50NjQJCT0gMHg5OTA4LAotICAgIEZUX3NpZ25lZF9pbnQ2NAk9IDB4OWEwOCwKLSAgICBGVF91bnNpZ25lZF9pbnQ2NAk9IDB4OWIwOCwKLQotICAgIEZUX3JlYWwzMgkJPSAweGEwMDQsCi0gICAgRlRfcmVhbDY0CQk9IDB4YTEwOCwKLSAgICBGVF9yZWFsOTYJCT0gMHhhMjBjLAotICAgIEZUX3JlYWwxMjgJCT0gMHhhMzEwCi19OwotCi0jZGVmaW5lIEZUX2xvX3VzZXIJMHg4MDAwICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0jZGVmaW5lIEZUX2hpX3VzZXIJMHhmZmZmICAvKiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBUeXBlIG1vZGlmaWVyIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfdHlwZV9tb2RpZmllciB7Ci0gICAgTU9EX3BvaW50ZXJfdG8JPSAweDAxLAotICAgIE1PRF9yZWZlcmVuY2VfdG8JPSAweDAyLAotICAgIE1PRF9jb25zdAkJPSAweDAzLAotICAgIE1PRF92b2xhdGlsZQk9IDB4MDQKLX07Ci0KLSNkZWZpbmUgTU9EX2xvX3VzZXIJMHg4MCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBNT0RfaGlfdXNlcgkweGZmICAvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIGVuZCAqLwotCi0vKiBBcnJheSBvcmRlcmluZyBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2FycmF5X2RpbV9vcmRlcmluZyB7Ci0gICAgT1JEX3Jvd19tYWpvcgk9IDAsCi0gICAgT1JEX2NvbF9tYWpvcgk9IDEKLX07Ci0KLS8qIEFycmF5IHN1YnNjcmlwdCBmb3JtYXQgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9zdWJzY3JfZGF0YV9mb3JtYXRzIHsKLSAgICBGTVRfRlRfQ19DCT0gMHgwLAotICAgIEZNVF9GVF9DX1gJPSAweDEsCi0gICAgRk1UX0ZUX1hfQwk9IDB4MiwKLSAgICBGTVRfRlRfWF9YCT0gMHgzLAotICAgIEZNVF9VVF9DX0MJPSAweDQsCi0gICAgRk1UX1VUX0NfWAk9IDB4NSwKLSAgICBGTVRfVVRfWF9DCT0gMHg2LAotICAgIEZNVF9VVF9YX1gJPSAweDcsCi0gICAgRk1UX0VUCT0gMHg4Ci19OwotCi0vKiBEZXJpdmVkIGZyb20gYWJvdmUgZm9yIGVhc2Ugb2YgdXNlLiAgKi8KLQotI2RlZmluZSBGTVRfQ09ERShfRlVOREFNRU5UQUxfVFlQRV9QLCBfVUJfQ09OU1RfUCwgX0xCX0NPTlNUX1ApIFwKLSAoKChfRlVOREFNRU5UQUxfVFlQRV9QKSA/IDAgOiA0KQlcCi0gIHwgKChfVUJfQ09OU1RfUCkgPyAwIDogMikJCVwKLSAgfCAoKF9MQl9DT05TVF9QKSA/IDAgOiAxKSkKLQotLyogU291cmNlIGxhbmd1YWdlIG5hbWVzIGFuZCBjb2Rlcy4gICovCi0KLWVudW0gZHdhcmZfc291cmNlX2xhbmd1YWdlIHsKLSAgICBMQU5HX0M4OQkJPSAweDAwMDAwMDAxLAotICAgIExBTkdfQwkJPSAweDAwMDAwMDAyLAotICAgIExBTkdfQURBODMJCT0gMHgwMDAwMDAwMywKLSAgICBMQU5HX0NfUExVU19QTFVTCT0gMHgwMDAwMDAwNCwKLSAgICBMQU5HX0NPQk9MNzQJPSAweDAwMDAwMDA1LAotICAgIExBTkdfQ09CT0w4NQk9IDB4MDAwMDAwMDYsCi0gICAgTEFOR19GT1JUUkFONzcJPSAweDAwMDAwMDA3LAotICAgIExBTkdfRk9SVFJBTjkwCT0gMHgwMDAwMDAwOCwKLSAgICBMQU5HX1BBU0NBTDgzCT0gMHgwMDAwMDAwOSwKLSAgICBMQU5HX01PRFVMQTIJPSAweDAwMDAwMDBhLAotCi0gICAgLyogR05VIGV4dGVuc2lvbnMgKi8KLQotICAgIExBTkdfQ0hJTEwJCT0gMHgwMDAwOWFmMywJLyogcmFuZG9tIHZhbHVlIGZvciBHTlUgQ2hpbGwgKi8KLSAgICBMQU5HX0pBVkEJCT0gMHgwMDAwOWFmNCAgICAvKiByYW5kb20gdmFsdWUgKyAxIGZvciBHTlUgSmF2YSAqLwotfTsKLQotI2RlZmluZSBMQU5HX2xvX3VzZXIJMHgwMDAwODAwMCAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBMQU5HX2hpX3VzZXIJMHgwMDAwZmZmZiAgLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KLQotLyogTmFtZXMgYW5kIGNvZGVzIGZvciBHTlUgIm1hY2luZm8iIGV4dGVuc2lvbi4gICovCi0KLWVudW0gZHdhcmZfbWFjaW5mb19yZWNvcmRfdHlwZSB7Ci0gICAgTUFDSU5GT19zdGFydAk9ICdzJywKLSAgICBNQUNJTkZPX3Jlc3VtZQk9ICdyJywKLSAgICBNQUNJTkZPX2RlZmluZQk9ICdkJywKLSAgICBNQUNJTkZPX3VuZGVmCT0gJ3UnCi19OwotCi0jZW5kaWYgLyogX0VMRl9EV0FSRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9kd2FyZjIuaCBiL2luY2x1ZGUvZWxmL2R3YXJmMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmQ0ZmE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2R3YXJmMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjM4ICswLDAgQEAKLS8qIERlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgb2YgY29kZXMgcmVsYXRpbmcgdG8gdGhlIERXQVJGIHN5bWJvbGljCi0gICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9ybWF0LgotICAgQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk1LCAxOTk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IEdhcnkgRnVuY2sgKGdhcnlAaW50cmVwaWQuY29tKSBUaGUgQWRhIEpvaW50IFByb2dyYW0KLSAgIE9mZmljZSAoQUpQTyksIEZsb3JpZGEgU3RhdGUgVW52aXZlcnNpdHkgYW5kIFNpbGljb24gR3JhcGhpY3MgSW5jLgotICAgcHJvdmlkZWQgc3VwcG9ydCBmb3IgdGhpcyBlZmZvcnQgLS0gSnVuZSAyMSwgMTk5NS4KLQotICAgRGVyaXZlZCBmcm9tIHRoZSBEV0FSRiAxIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgUm9uIEd1aWxtZXR0ZQotICAgKHJmZ0BuZXRjb20uY29tKSwgTm92ZW1iZXIgMTk5MC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgotCi1HTlUgQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci1sYXRlciB2ZXJzaW9uLgotCi1HTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLUFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1mb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gdGhlIERXQVJGIHNwZWNpZmljYXRpb24gKGEgcHVibGljIGRvY3VtZW50KQotICAgUmV2aXNpb24gMi4wLjAgKEp1bHkgMjcsIDE5OTMpIGRldmVsb3BlZCBieSB0aGUgVU5JWCBJbnRlcm5hdGlvbmFsCi0gICBQcm9ncmFtbWluZyBMYW5ndWFnZXMgU3BlY2lhbCBJbnRlcmVzdCBHcm91cCAoVUkvUExTSUcpIGFuZCBkaXN0cmlidXRlZAotICAgYnkgVU5JWCBJbnRlcm5hdGlvbmFsLiAgQ29waWVzIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBhcmUgYXZhaWxhYmxlIGZyb20KLSAgIFVOSVggSW50ZXJuYXRpb25hbCwgMjAgV2F0ZXJ2aWV3IEJvdWxldmFyZCwgUGFyc2lwcGFueSwgTkosIDA3MDU0LiAgKi8KLQotI2lmbmRlZiBfRUxGX0RXQVJGMl9ICi0jZGVmaW5lIF9FTEZfRFdBUkYyX0gKLQotLyogU3RydWN0dXJlIGZvdW5kIGluIHRoZSAuZGVidWdfbGluZSBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGVuZ3RoICAgICAgICAgIFs0XTsKLSAgdW5zaWduZWQgY2hhciBsaV92ZXJzaW9uICAgICAgICAgWzJdOwotICB1bnNpZ25lZCBjaGFyIGxpX3Byb2xvZ3VlX2xlbmd0aCBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbWluX2luc25fbGVuZ3RoIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9kZWZhdWx0X2lzX3N0bXQgWzFdOwotICB1bnNpZ25lZCBjaGFyIGxpX2xpbmVfYmFzZSAgICAgICBbMV07Ci0gIHVuc2lnbmVkIGNoYXIgbGlfbGluZV9yYW5nZSAgICAgIFsxXTsKLSAgdW5zaWduZWQgY2hhciBsaV9vcGNvZGVfYmFzZSAgICAgWzFdOwotfQotRFdBUkYyX0V4dGVybmFsX0xpbmVJbmZvOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBsaV9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IGxpX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGludCAgIGxpX3Byb2xvZ3VlX2xlbmd0aDsKLSAgdW5zaWduZWQgY2hhciAgbGlfbWluX2luc25fbGVuZ3RoOwotICB1bnNpZ25lZCBjaGFyICBsaV9kZWZhdWx0X2lzX3N0bXQ7Ci0gIGludCAgICAgICAgICAgIGxpX2xpbmVfYmFzZTsKLSAgdW5zaWduZWQgY2hhciAgbGlfbGluZV9yYW5nZTsKLSAgdW5zaWduZWQgY2hhciAgbGlfb3Bjb2RlX2Jhc2U7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfTGluZUluZm87Ci0KLS8qIFN0cnVjdHVyZSBmb3VuZCBpbiAuZGVidWdfcHVibmFtZXMgc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyIHBuX2xlbmd0aCAgWzRdOwotICB1bnNpZ25lZCBjaGFyIHBuX3ZlcnNpb24gWzJdOwotICB1bnNpZ25lZCBjaGFyIHBuX29mZnNldCAgWzRdOwotICB1bnNpZ25lZCBjaGFyIHBuX3NpemUgICAgWzRdOwotfQotRFdBUkYyX0V4dGVybmFsX1B1Yk5hbWVzOwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBsb25nICBwbl9sZW5ndGg7Ci0gIHVuc2lnbmVkIHNob3J0IHBuX3ZlcnNpb247Ci0gIHVuc2lnbmVkIGxvbmcgIHBuX29mZnNldDsKLSAgdW5zaWduZWQgbG9uZyAgcG5fc2l6ZTsKLX0KLURXQVJGMl9JbnRlcm5hbF9QdWJOYW1lczsKLQotLyogU3RyY3V0dXJlIGZvdW5kIGluIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciAgY3VfbGVuZ3RoICAgICAgICBbNF07Ci0gIHVuc2lnbmVkIGNoYXIgIGN1X3ZlcnNpb24gICAgICAgWzJdOwotICB1bnNpZ25lZCBjaGFyICBjdV9hYmJyZXZfb2Zmc2V0IFs0XTsKLSAgdW5zaWduZWQgY2hhciAgY3VfcG9pbnRlcl9zaXplICBbMV07Ci19Ci1EV0FSRjJfRXh0ZXJuYWxfQ29tcFVuaXQ7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGxvbmcgIGN1X2xlbmd0aDsKLSAgdW5zaWduZWQgc2hvcnQgY3VfdmVyc2lvbjsKLSAgdW5zaWduZWQgbG9uZyAgY3VfYWJicmV2X29mZnNldDsKLSAgdW5zaWduZWQgY2hhciAgY3VfcG9pbnRlcl9zaXplOwotfQotRFdBUkYyX0ludGVybmFsX0NvbXBVbml0OwotCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyICBhcl9sZW5ndGggICAgICAgWzRdOwotICB1bnNpZ25lZCBjaGFyICBhcl92ZXJzaW9uICAgICAgWzJdOwotICB1bnNpZ25lZCBjaGFyICBhcl9pbmZvX29mZnNldCAgWzRdOwotICB1bnNpZ25lZCBjaGFyICBhcl9wb2ludGVyX3NpemUgWzFdOwotICB1bnNpZ25lZCBjaGFyICBhcl9zZWdtZW50X3NpemUgWzFdOwotfQotRFdBUkYyX0V4dGVybmFsX0FSYW5nZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgbG9uZyAgYXJfbGVuZ3RoOwotICB1bnNpZ25lZCBzaG9ydCBhcl92ZXJzaW9uOwotICB1bnNpZ25lZCBsb25nICBhcl9pbmZvX29mZnNldDsKLSAgdW5zaWduZWQgY2hhciAgYXJfcG9pbnRlcl9zaXplOwotICB1bnNpZ25lZCBjaGFyICBhcl9zZWdtZW50X3NpemU7Ci19Ci1EV0FSRjJfSW50ZXJuYWxfQVJhbmdlOwotCi0KLS8qIFRhZyBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3RhZwotICB7Ci0gICAgRFdfVEFHX3BhZGRpbmcgPSAweDAwLAotICAgIERXX1RBR19hcnJheV90eXBlID0gMHgwMSwKLSAgICBEV19UQUdfY2xhc3NfdHlwZSA9IDB4MDIsCi0gICAgRFdfVEFHX2VudHJ5X3BvaW50ID0gMHgwMywKLSAgICBEV19UQUdfZW51bWVyYXRpb25fdHlwZSA9IDB4MDQsCi0gICAgRFdfVEFHX2Zvcm1hbF9wYXJhbWV0ZXIgPSAweDA1LAotICAgIERXX1RBR19pbXBvcnRlZF9kZWNsYXJhdGlvbiA9IDB4MDgsCi0gICAgRFdfVEFHX2xhYmVsID0gMHgwYSwKLSAgICBEV19UQUdfbGV4aWNhbF9ibG9jayA9IDB4MGIsCi0gICAgRFdfVEFHX21lbWJlciA9IDB4MGQsCi0gICAgRFdfVEFHX3BvaW50ZXJfdHlwZSA9IDB4MGYsCi0gICAgRFdfVEFHX3JlZmVyZW5jZV90eXBlID0gMHgxMCwKLSAgICBEV19UQUdfY29tcGlsZV91bml0ID0gMHgxMSwKLSAgICBEV19UQUdfc3RyaW5nX3R5cGUgPSAweDEyLAotICAgIERXX1RBR19zdHJ1Y3R1cmVfdHlwZSA9IDB4MTMsCi0gICAgRFdfVEFHX3N1YnJvdXRpbmVfdHlwZSA9IDB4MTUsCi0gICAgRFdfVEFHX3R5cGVkZWYgPSAweDE2LAotICAgIERXX1RBR191bmlvbl90eXBlID0gMHgxNywKLSAgICBEV19UQUdfdW5zcGVjaWZpZWRfcGFyYW1ldGVycyA9IDB4MTgsCi0gICAgRFdfVEFHX3ZhcmlhbnQgPSAweDE5LAotICAgIERXX1RBR19jb21tb25fYmxvY2sgPSAweDFhLAotICAgIERXX1RBR19jb21tb25faW5jbHVzaW9uID0gMHgxYiwKLSAgICBEV19UQUdfaW5oZXJpdGFuY2UgPSAweDFjLAotICAgIERXX1RBR19pbmxpbmVkX3N1YnJvdXRpbmUgPSAweDFkLAotICAgIERXX1RBR19tb2R1bGUgPSAweDFlLAotICAgIERXX1RBR19wdHJfdG9fbWVtYmVyX3R5cGUgPSAweDFmLAotICAgIERXX1RBR19zZXRfdHlwZSA9IDB4MjAsCi0gICAgRFdfVEFHX3N1YnJhbmdlX3R5cGUgPSAweDIxLAotICAgIERXX1RBR193aXRoX3N0bXQgPSAweDIyLAotICAgIERXX1RBR19hY2Nlc3NfZGVjbGFyYXRpb24gPSAweDIzLAotICAgIERXX1RBR19iYXNlX3R5cGUgPSAweDI0LAotICAgIERXX1RBR19jYXRjaF9ibG9jayA9IDB4MjUsCi0gICAgRFdfVEFHX2NvbnN0X3R5cGUgPSAweDI2LAotICAgIERXX1RBR19jb25zdGFudCA9IDB4MjcsCi0gICAgRFdfVEFHX2VudW1lcmF0b3IgPSAweDI4LAotICAgIERXX1RBR19maWxlX3R5cGUgPSAweDI5LAotICAgIERXX1RBR19mcmllbmQgPSAweDJhLAotICAgIERXX1RBR19uYW1lbGlzdCA9IDB4MmIsCi0gICAgRFdfVEFHX25hbWVsaXN0X2l0ZW0gPSAweDJjLAotICAgIERXX1RBR19wYWNrZWRfdHlwZSA9IDB4MmQsCi0gICAgRFdfVEFHX3N1YnByb2dyYW0gPSAweDJlLAotICAgIERXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtID0gMHgyZiwKLSAgICBEV19UQUdfdGVtcGxhdGVfdmFsdWVfcGFyYW0gPSAweDMwLAotICAgIERXX1RBR190aHJvd25fdHlwZSA9IDB4MzEsCi0gICAgRFdfVEFHX3RyeV9ibG9jayA9IDB4MzIsCi0gICAgRFdfVEFHX3ZhcmlhbnRfcGFydCA9IDB4MzMsCi0gICAgRFdfVEFHX3ZhcmlhYmxlID0gMHgzNCwKLSAgICBEV19UQUdfdm9sYXRpbGVfdHlwZSA9IDB4MzUsCi0gICAgLyogU0dJL01JUFMgRXh0ZW5zaW9ucyAqLwotICAgIERXX1RBR19NSVBTX2xvb3AgPSAweDQwODEsCi0gICAgLyogR05VIGV4dGVuc2lvbnMgKi8KLSAgICBEV19UQUdfZm9ybWF0X2xhYmVsID0gMHg0MTAxLAkvKiBmb3IgRk9SVFJBTiA3NyBhbmQgRm9ydHJhbiA5MCAqLwotICAgIERXX1RBR19mdW5jdGlvbl90ZW1wbGF0ZSA9IDB4NDEwMiwJLyogZm9yIEMrKyAqLwotICAgIERXX1RBR19jbGFzc190ZW1wbGF0ZSA9IDB4NDEwMwkvKiBmb3IgQysrICovCi0gIH07Ci0KLSNkZWZpbmUgRFdfVEFHX2xvX3VzZXIJMHg0MDgwCi0jZGVmaW5lIERXX1RBR19oaV91c2VyCTB4ZmZmZgotCi0vKiBmbGFnIHRoYXQgdGVsbHMgd2hldGhlciBlbnRyeSBoYXMgYSBjaGlsZCBvciBub3QgKi8KLSNkZWZpbmUgRFdfY2hpbGRyZW5fbm8gICAwCi0jZGVmaW5lCURXX2NoaWxkcmVuX3llcyAgMQotCi0vKiBGb3JtIG5hbWVzIGFuZCBjb2Rlcy4gICovCi1lbnVtIGR3YXJmX2Zvcm0KLSAgewotICAgIERXX0ZPUk1fYWRkciA9IDB4MDEsCi0gICAgRFdfRk9STV9ibG9jazIgPSAweDAzLAotICAgIERXX0ZPUk1fYmxvY2s0ID0gMHgwNCwKLSAgICBEV19GT1JNX2RhdGEyID0gMHgwNSwKLSAgICBEV19GT1JNX2RhdGE0ID0gMHgwNiwKLSAgICBEV19GT1JNX2RhdGE4ID0gMHgwNywKLSAgICBEV19GT1JNX3N0cmluZyA9IDB4MDgsCi0gICAgRFdfRk9STV9ibG9jayA9IDB4MDksCi0gICAgRFdfRk9STV9ibG9jazEgPSAweDBhLAotICAgIERXX0ZPUk1fZGF0YTEgPSAweDBiLAotICAgIERXX0ZPUk1fZmxhZyA9IDB4MGMsCi0gICAgRFdfRk9STV9zZGF0YSA9IDB4MGQsCi0gICAgRFdfRk9STV9zdHJwID0gMHgwZSwKLSAgICBEV19GT1JNX3VkYXRhID0gMHgwZiwKLSAgICBEV19GT1JNX3JlZl9hZGRyID0gMHgxMCwKLSAgICBEV19GT1JNX3JlZjEgPSAweDExLAotICAgIERXX0ZPUk1fcmVmMiA9IDB4MTIsCi0gICAgRFdfRk9STV9yZWY0ID0gMHgxMywKLSAgICBEV19GT1JNX3JlZjggPSAweDE0LAotICAgIERXX0ZPUk1fcmVmX3VkYXRhID0gMHgxNSwKLSAgICBEV19GT1JNX2luZGlyZWN0ID0gMHgxNgotICB9OwotCi0vKiBBdHRyaWJ1dGUgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLQotZW51bSBkd2FyZl9hdHRyaWJ1dGUKLSAgewotICAgIERXX0FUX3NpYmxpbmcgPSAweDAxLAotICAgIERXX0FUX2xvY2F0aW9uID0gMHgwMiwKLSAgICBEV19BVF9uYW1lID0gMHgwMywKLSAgICBEV19BVF9vcmRlcmluZyA9IDB4MDksCi0gICAgRFdfQVRfc3Vic2NyX2RhdGEgPSAweDBhLAotICAgIERXX0FUX2J5dGVfc2l6ZSA9IDB4MGIsCi0gICAgRFdfQVRfYml0X29mZnNldCA9IDB4MGMsCi0gICAgRFdfQVRfYml0X3NpemUgPSAweDBkLAotICAgIERXX0FUX2VsZW1lbnRfbGlzdCA9IDB4MGYsCi0gICAgRFdfQVRfc3RtdF9saXN0ID0gMHgxMCwKLSAgICBEV19BVF9sb3dfcGMgPSAweDExLAotICAgIERXX0FUX2hpZ2hfcGMgPSAweDEyLAotICAgIERXX0FUX2xhbmd1YWdlID0gMHgxMywKLSAgICBEV19BVF9tZW1iZXIgPSAweDE0LAotICAgIERXX0FUX2Rpc2NyID0gMHgxNSwKLSAgICBEV19BVF9kaXNjcl92YWx1ZSA9IDB4MTYsCi0gICAgRFdfQVRfdmlzaWJpbGl0eSA9IDB4MTcsCi0gICAgRFdfQVRfaW1wb3J0ID0gMHgxOCwKLSAgICBEV19BVF9zdHJpbmdfbGVuZ3RoID0gMHgxOSwKLSAgICBEV19BVF9jb21tb25fcmVmZXJlbmNlID0gMHgxYSwKLSAgICBEV19BVF9jb21wX2RpciA9IDB4MWIsCi0gICAgRFdfQVRfY29uc3RfdmFsdWUgPSAweDFjLAotICAgIERXX0FUX2NvbnRhaW5pbmdfdHlwZSA9IDB4MWQsCi0gICAgRFdfQVRfZGVmYXVsdF92YWx1ZSA9IDB4MWUsCi0gICAgRFdfQVRfaW5saW5lID0gMHgyMCwKLSAgICBEV19BVF9pc19vcHRpb25hbCA9IDB4MjEsCi0gICAgRFdfQVRfbG93ZXJfYm91bmQgPSAweDIyLAotICAgIERXX0FUX3Byb2R1Y2VyID0gMHgyNSwKLSAgICBEV19BVF9wcm90b3R5cGVkID0gMHgyNywKLSAgICBEV19BVF9yZXR1cm5fYWRkciA9IDB4MmEsCi0gICAgRFdfQVRfc3RhcnRfc2NvcGUgPSAweDJjLAotICAgIERXX0FUX3N0cmlkZV9zaXplID0gMHgyZSwKLSAgICBEV19BVF91cHBlcl9ib3VuZCA9IDB4MmYsCi0gICAgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luID0gMHgzMSwKLSAgICBEV19BVF9hY2Nlc3NpYmlsaXR5ID0gMHgzMiwKLSAgICBEV19BVF9hZGRyZXNzX2NsYXNzID0gMHgzMywKLSAgICBEV19BVF9hcnRpZmljaWFsID0gMHgzNCwKLSAgICBEV19BVF9iYXNlX3R5cGVzID0gMHgzNSwKLSAgICBEV19BVF9jYWxsaW5nX2NvbnZlbnRpb24gPSAweDM2LAotICAgIERXX0FUX2NvdW50ID0gMHgzNywKLSAgICBEV19BVF9kYXRhX21lbWJlcl9sb2NhdGlvbiA9IDB4MzgsCi0gICAgRFdfQVRfZGVjbF9jb2x1bW4gPSAweDM5LAotICAgIERXX0FUX2RlY2xfZmlsZSA9IDB4M2EsCi0gICAgRFdfQVRfZGVjbF9saW5lID0gMHgzYiwKLSAgICBEV19BVF9kZWNsYXJhdGlvbiA9IDB4M2MsCi0gICAgRFdfQVRfZGlzY3JfbGlzdCA9IDB4M2QsCi0gICAgRFdfQVRfZW5jb2RpbmcgPSAweDNlLAotICAgIERXX0FUX2V4dGVybmFsID0gMHgzZiwKLSAgICBEV19BVF9mcmFtZV9iYXNlID0gMHg0MCwKLSAgICBEV19BVF9mcmllbmQgPSAweDQxLAotICAgIERXX0FUX2lkZW50aWZpZXJfY2FzZSA9IDB4NDIsCi0gICAgRFdfQVRfbWFjcm9faW5mbyA9IDB4NDMsCi0gICAgRFdfQVRfbmFtZWxpc3RfaXRlbXMgPSAweDQ0LAotICAgIERXX0FUX3ByaW9yaXR5ID0gMHg0NSwKLSAgICBEV19BVF9zZWdtZW50ID0gMHg0NiwKLSAgICBEV19BVF9zcGVjaWZpY2F0aW9uID0gMHg0NywKLSAgICBEV19BVF9zdGF0aWNfbGluayA9IDB4NDgsCi0gICAgRFdfQVRfdHlwZSA9IDB4NDksCi0gICAgRFdfQVRfdXNlX2xvY2F0aW9uID0gMHg0YSwKLSAgICBEV19BVF92YXJpYWJsZV9wYXJhbWV0ZXIgPSAweDRiLAotICAgIERXX0FUX3ZpcnR1YWxpdHkgPSAweDRjLAotICAgIERXX0FUX3Z0YWJsZV9lbGVtX2xvY2F0aW9uID0gMHg0ZCwKLSAgICAvKiBTR0kvTUlQUyBFeHRlbnNpb25zICovCi0gICAgRFdfQVRfTUlQU19mZGUgPSAweDIwMDEsCi0gICAgRFdfQVRfTUlQU19sb29wX2JlZ2luID0gMHgyMDAyLAotICAgIERXX0FUX01JUFNfdGFpbF9sb29wX2JlZ2luID0gMHgyMDAzLAotICAgIERXX0FUX01JUFNfZXBpbG9nX2JlZ2luID0gMHgyMDA0LAotICAgIERXX0FUX01JUFNfbG9vcF91bnJvbGxfZmFjdG9yID0gMHgyMDA1LAotICAgIERXX0FUX01JUFNfc29mdHdhcmVfcGlwZWxpbmVfZGVwdGggPSAweDIwMDYsCi0gICAgRFdfQVRfTUlQU19saW5rYWdlX25hbWUgPSAweDIwMDcsCi0gICAgRFdfQVRfTUlQU19zdHJpZGUgPSAweDIwMDgsCi0gICAgRFdfQVRfTUlQU19hYnN0cmFjdF9uYW1lID0gMHgyMDA5LAotICAgIERXX0FUX01JUFNfY2xvbmVfb3JpZ2luID0gMHgyMDBhLAotICAgIERXX0FUX01JUFNfaGFzX2lubGluZXMgPSAweDIwMGIsCi0gICAgLyogR05VIGV4dGVuc2lvbnMuICAqLwotICAgIERXX0FUX3NmX25hbWVzID0gMHgyMTAxLAotICAgIERXX0FUX3NyY19pbmZvID0gMHgyMTAyLAotICAgIERXX0FUX21hY19pbmZvID0gMHgyMTAzLAotICAgIERXX0FUX3NyY19jb29yZHMgPSAweDIxMDQsCi0gICAgRFdfQVRfYm9keV9iZWdpbiA9IDB4MjEwNSwKLSAgICBEV19BVF9ib2R5X2VuZCA9IDB4MjEwNgotICB9OwotCi0jZGVmaW5lIERXX0FUX2xvX3VzZXIJMHgyMDAwCS8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRFdfQVRfaGlfdXNlcgkweDNmZjAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KLQotLyogTG9jYXRpb24gYXRvbSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX2xvY2F0aW9uX2F0b20KLSAgewotICAgIERXX09QX2FkZHIgPSAweDAzLAotICAgIERXX09QX2RlcmVmID0gMHgwNiwKLSAgICBEV19PUF9jb25zdDF1ID0gMHgwOCwKLSAgICBEV19PUF9jb25zdDFzID0gMHgwOSwKLSAgICBEV19PUF9jb25zdDJ1ID0gMHgwYSwKLSAgICBEV19PUF9jb25zdDJzID0gMHgwYiwKLSAgICBEV19PUF9jb25zdDR1ID0gMHgwYywKLSAgICBEV19PUF9jb25zdDRzID0gMHgwZCwKLSAgICBEV19PUF9jb25zdDh1ID0gMHgwZSwKLSAgICBEV19PUF9jb25zdDhzID0gMHgwZiwKLSAgICBEV19PUF9jb25zdHUgPSAweDEwLAotICAgIERXX09QX2NvbnN0cyA9IDB4MTEsCi0gICAgRFdfT1BfZHVwID0gMHgxMiwKLSAgICBEV19PUF9kcm9wID0gMHgxMywKLSAgICBEV19PUF9vdmVyID0gMHgxNCwKLSAgICBEV19PUF9waWNrID0gMHgxNSwKLSAgICBEV19PUF9zd2FwID0gMHgxNiwKLSAgICBEV19PUF9yb3QgPSAweDE3LAotICAgIERXX09QX3hkZXJlZiA9IDB4MTgsCi0gICAgRFdfT1BfYWJzID0gMHgxOSwKLSAgICBEV19PUF9hbmQgPSAweDFhLAotICAgIERXX09QX2RpdiA9IDB4MWIsCi0gICAgRFdfT1BfbWludXMgPSAweDFjLAotICAgIERXX09QX21vZCA9IDB4MWQsCi0gICAgRFdfT1BfbXVsID0gMHgxZSwKLSAgICBEV19PUF9uZWcgPSAweDFmLAotICAgIERXX09QX25vdCA9IDB4MjAsCi0gICAgRFdfT1Bfb3IgPSAweDIxLAotICAgIERXX09QX3BsdXMgPSAweDIyLAotICAgIERXX09QX3BsdXNfdWNvbnN0ID0gMHgyMywKLSAgICBEV19PUF9zaGwgPSAweDI0LAotICAgIERXX09QX3NociA9IDB4MjUsCi0gICAgRFdfT1Bfc2hyYSA9IDB4MjYsCi0gICAgRFdfT1BfeG9yID0gMHgyNywKLSAgICBEV19PUF9icmEgPSAweDI4LAotICAgIERXX09QX2VxID0gMHgyOSwKLSAgICBEV19PUF9nZSA9IDB4MmEsCi0gICAgRFdfT1BfZ3QgPSAweDJiLAotICAgIERXX09QX2xlID0gMHgyYywKLSAgICBEV19PUF9sdCA9IDB4MmQsCi0gICAgRFdfT1BfbmUgPSAweDJlLAotICAgIERXX09QX3NraXAgPSAweDJmLAotICAgIERXX09QX2xpdDAgPSAweDMwLAotICAgIERXX09QX2xpdDEgPSAweDMxLAotICAgIERXX09QX2xpdDIgPSAweDMyLAotICAgIERXX09QX2xpdDMgPSAweDMzLAotICAgIERXX09QX2xpdDQgPSAweDM0LAotICAgIERXX09QX2xpdDUgPSAweDM1LAotICAgIERXX09QX2xpdDYgPSAweDM2LAotICAgIERXX09QX2xpdDcgPSAweDM3LAotICAgIERXX09QX2xpdDggPSAweDM4LAotICAgIERXX09QX2xpdDkgPSAweDM5LAotICAgIERXX09QX2xpdDEwID0gMHgzYSwKLSAgICBEV19PUF9saXQxMSA9IDB4M2IsCi0gICAgRFdfT1BfbGl0MTIgPSAweDNjLAotICAgIERXX09QX2xpdDEzID0gMHgzZCwKLSAgICBEV19PUF9saXQxNCA9IDB4M2UsCi0gICAgRFdfT1BfbGl0MTUgPSAweDNmLAotICAgIERXX09QX2xpdDE2ID0gMHg0MCwKLSAgICBEV19PUF9saXQxNyA9IDB4NDEsCi0gICAgRFdfT1BfbGl0MTggPSAweDQyLAotICAgIERXX09QX2xpdDE5ID0gMHg0MywKLSAgICBEV19PUF9saXQyMCA9IDB4NDQsCi0gICAgRFdfT1BfbGl0MjEgPSAweDQ1LAotICAgIERXX09QX2xpdDIyID0gMHg0NiwKLSAgICBEV19PUF9saXQyMyA9IDB4NDcsCi0gICAgRFdfT1BfbGl0MjQgPSAweDQ4LAotICAgIERXX09QX2xpdDI1ID0gMHg0OSwKLSAgICBEV19PUF9saXQyNiA9IDB4NGEsCi0gICAgRFdfT1BfbGl0MjcgPSAweDRiLAotICAgIERXX09QX2xpdDI4ID0gMHg0YywKLSAgICBEV19PUF9saXQyOSA9IDB4NGQsCi0gICAgRFdfT1BfbGl0MzAgPSAweDRlLAotICAgIERXX09QX2xpdDMxID0gMHg0ZiwKLSAgICBEV19PUF9yZWcwID0gMHg1MCwKLSAgICBEV19PUF9yZWcxID0gMHg1MSwKLSAgICBEV19PUF9yZWcyID0gMHg1MiwKLSAgICBEV19PUF9yZWczID0gMHg1MywKLSAgICBEV19PUF9yZWc0ID0gMHg1NCwKLSAgICBEV19PUF9yZWc1ID0gMHg1NSwKLSAgICBEV19PUF9yZWc2ID0gMHg1NiwKLSAgICBEV19PUF9yZWc3ID0gMHg1NywKLSAgICBEV19PUF9yZWc4ID0gMHg1OCwKLSAgICBEV19PUF9yZWc5ID0gMHg1OSwKLSAgICBEV19PUF9yZWcxMCA9IDB4NWEsCi0gICAgRFdfT1BfcmVnMTEgPSAweDViLAotICAgIERXX09QX3JlZzEyID0gMHg1YywKLSAgICBEV19PUF9yZWcxMyA9IDB4NWQsCi0gICAgRFdfT1BfcmVnMTQgPSAweDVlLAotICAgIERXX09QX3JlZzE1ID0gMHg1ZiwKLSAgICBEV19PUF9yZWcxNiA9IDB4NjAsCi0gICAgRFdfT1BfcmVnMTcgPSAweDYxLAotICAgIERXX09QX3JlZzE4ID0gMHg2MiwKLSAgICBEV19PUF9yZWcxOSA9IDB4NjMsCi0gICAgRFdfT1BfcmVnMjAgPSAweDY0LAotICAgIERXX09QX3JlZzIxID0gMHg2NSwKLSAgICBEV19PUF9yZWcyMiA9IDB4NjYsCi0gICAgRFdfT1BfcmVnMjMgPSAweDY3LAotICAgIERXX09QX3JlZzI0ID0gMHg2OCwKLSAgICBEV19PUF9yZWcyNSA9IDB4NjksCi0gICAgRFdfT1BfcmVnMjYgPSAweDZhLAotICAgIERXX09QX3JlZzI3ID0gMHg2YiwKLSAgICBEV19PUF9yZWcyOCA9IDB4NmMsCi0gICAgRFdfT1BfcmVnMjkgPSAweDZkLAotICAgIERXX09QX3JlZzMwID0gMHg2ZSwKLSAgICBEV19PUF9yZWczMSA9IDB4NmYsCi0gICAgRFdfT1BfYnJlZzAgPSAweDcwLAotICAgIERXX09QX2JyZWcxID0gMHg3MSwKLSAgICBEV19PUF9icmVnMiA9IDB4NzIsCi0gICAgRFdfT1BfYnJlZzMgPSAweDczLAotICAgIERXX09QX2JyZWc0ID0gMHg3NCwKLSAgICBEV19PUF9icmVnNSA9IDB4NzUsCi0gICAgRFdfT1BfYnJlZzYgPSAweDc2LAotICAgIERXX09QX2JyZWc3ID0gMHg3NywKLSAgICBEV19PUF9icmVnOCA9IDB4NzgsCi0gICAgRFdfT1BfYnJlZzkgPSAweDc5LAotICAgIERXX09QX2JyZWcxMCA9IDB4N2EsCi0gICAgRFdfT1BfYnJlZzExID0gMHg3YiwKLSAgICBEV19PUF9icmVnMTIgPSAweDdjLAotICAgIERXX09QX2JyZWcxMyA9IDB4N2QsCi0gICAgRFdfT1BfYnJlZzE0ID0gMHg3ZSwKLSAgICBEV19PUF9icmVnMTUgPSAweDdmLAotICAgIERXX09QX2JyZWcxNiA9IDB4ODAsCi0gICAgRFdfT1BfYnJlZzE3ID0gMHg4MSwKLSAgICBEV19PUF9icmVnMTggPSAweDgyLAotICAgIERXX09QX2JyZWcxOSA9IDB4ODMsCi0gICAgRFdfT1BfYnJlZzIwID0gMHg4NCwKLSAgICBEV19PUF9icmVnMjEgPSAweDg1LAotICAgIERXX09QX2JyZWcyMiA9IDB4ODYsCi0gICAgRFdfT1BfYnJlZzIzID0gMHg4NywKLSAgICBEV19PUF9icmVnMjQgPSAweDg4LAotICAgIERXX09QX2JyZWcyNSA9IDB4ODksCi0gICAgRFdfT1BfYnJlZzI2ID0gMHg4YSwKLSAgICBEV19PUF9icmVnMjcgPSAweDhiLAotICAgIERXX09QX2JyZWcyOCA9IDB4OGMsCi0gICAgRFdfT1BfYnJlZzI5ID0gMHg4ZCwKLSAgICBEV19PUF9icmVnMzAgPSAweDhlLAotICAgIERXX09QX2JyZWczMSA9IDB4OGYsCi0gICAgRFdfT1BfcmVneCA9IDB4OTAsCi0gICAgRFdfT1BfZmJyZWcgPSAweDkxLAotICAgIERXX09QX2JyZWd4ID0gMHg5MiwKLSAgICBEV19PUF9waWVjZSA9IDB4OTMsCi0gICAgRFdfT1BfZGVyZWZfc2l6ZSA9IDB4OTQsCi0gICAgRFdfT1BfeGRlcmVmX3NpemUgPSAweDk1LAotICAgIERXX09QX25vcCA9IDB4OTYKLSAgfTsKLQotI2RlZmluZSBEV19PUF9sb191c2VyCTB4ODAJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBzdGFydCAqLwotI2RlZmluZSBEV19PUF9oaV91c2VyCTB4ZmYJLyogaW1wbGVtZW50YXRpb24tZGVmaW5lZCByYW5nZSBlbmQgKi8KLQotLyogVHlwZSBlbmNvZGluZ3MuICAqLwotCi1lbnVtIGR3YXJmX3R5cGUKLSAgewotICAgIERXX0FURV92b2lkID0gMHgwLAotICAgIERXX0FURV9hZGRyZXNzID0gMHgxLAotICAgIERXX0FURV9ib29sZWFuID0gMHgyLAotICAgIERXX0FURV9jb21wbGV4X2Zsb2F0ID0gMHgzLAotICAgIERXX0FURV9mbG9hdCA9IDB4NCwKLSAgICBEV19BVEVfc2lnbmVkID0gMHg1LAotICAgIERXX0FURV9zaWduZWRfY2hhciA9IDB4NiwKLSAgICBEV19BVEVfdW5zaWduZWQgPSAweDcsCi0gICAgRFdfQVRFX3Vuc2lnbmVkX2NoYXIgPSAweDgKLSAgfTsKLQotI2RlZmluZQlEV19BVEVfbG9fdXNlciAweDgwCi0jZGVmaW5lCURXX0FURV9oaV91c2VyIDB4ZmYKLQotLyogQXJyYXkgb3JkZXJpbmcgbmFtZXMgYW5kIGNvZGVzLiAgKi8KLWVudW0gZHdhcmZfYXJyYXlfZGltX29yZGVyaW5nCi0gIHsKLSAgICBEV19PUkRfcm93X21ham9yID0gMCwKLSAgICBEV19PUkRfY29sX21ham9yID0gMQotICB9OwotCi0vKiBhY2Nlc3MgYXR0cmlidXRlICovCi1lbnVtIGR3YXJmX2FjY2Vzc19hdHRyaWJ1dGUKLSAgewotICAgIERXX0FDQ0VTU19wdWJsaWMgPSAxLAotICAgIERXX0FDQ0VTU19wcm90ZWN0ZWQgPSAyLAotICAgIERXX0FDQ0VTU19wcml2YXRlID0gMwotICB9OwotCi0vKiB2aXNpYmlsaXR5ICovCi1lbnVtIGR3YXJmX3Zpc2liaWxpdHlfYXR0cmlidXRlCi0gIHsKLSAgICBEV19WSVNfbG9jYWwgPSAxLAotICAgIERXX1ZJU19leHBvcnRlZCA9IDIsCi0gICAgRFdfVklTX3F1YWxpZmllZCA9IDMKLSAgfTsKLQotLyogdmlydHVhbGl0eSAqLwotZW51bSBkd2FyZl92aXJ0dWFsaXR5X2F0dHJpYnV0ZQotICB7Ci0gICAgRFdfVklSVFVBTElUWV9ub25lID0gMCwKLSAgICBEV19WSVJUVUFMSVRZX3ZpcnR1YWwgPSAxLAotICAgIERXX1ZJUlRVQUxJVFlfcHVyZV92aXJ0dWFsID0gMgotICB9OwotCi0vKiBjYXNlIHNlbnNpdGl2aXR5ICovCi1lbnVtIGR3YXJmX2lkX2Nhc2UKLSAgewotICAgIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlID0gMCwKLSAgICBEV19JRF91cF9jYXNlID0gMSwKLSAgICBEV19JRF9kb3duX2Nhc2UgPSAyLAotICAgIERXX0lEX2Nhc2VfaW5zZW5zaXRpdmUgPSAzCi0gIH07Ci0KLS8qIGNhbGxpbmcgY29udmVudGlvbiAqLwotZW51bSBkd2FyZl9jYWxsaW5nX2NvbnZlbnRpb24KLSAgewotICAgIERXX0NDX25vcm1hbCA9IDB4MSwKLSAgICBEV19DQ19wcm9ncmFtID0gMHgyLAotICAgIERXX0NDX25vY2FsbCA9IDB4MwotICB9OwotCi0jZGVmaW5lIERXX0NDX2xvX3VzZXIgMHg0MAotI2RlZmluZSBEV19DQ19oaV91c2VyIDB4ZmYKLQotLyogaW5saW5lIGF0dHJpYnV0ZSAqLwotZW51bSBkd2FyZl9pbmxpbmVfYXR0cmlidXRlCi0gIHsKLSAgICBEV19JTkxfbm90X2lubGluZWQgPSAwLAotICAgIERXX0lOTF9pbmxpbmVkID0gMSwKLSAgICBEV19JTkxfZGVjbGFyZWRfbm90X2lubGluZWQgPSAyLAotICAgIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkID0gMwotICB9OwotCi0vKiBkZXNjcmltaW5hbnQgbGlzdHMgKi8KLWVudW0gZHdhcmZfZGVzY3JpbV9saXN0Ci0gIHsKLSAgICBEV19EU0NfbGFiZWwgPSAwLAotICAgIERXX0RTQ19yYW5nZSA9IDEKLSAgfTsKLQotLyogbGluZSBudW1iZXIgb3Bjb2RlcyAqLwotZW51bSBkd2FyZl9saW5lX251bWJlcl9vcHMKLSAgewotICAgIERXX0xOU19leHRlbmRlZF9vcCA9IDAsCi0gICAgRFdfTE5TX2NvcHkgPSAxLAotICAgIERXX0xOU19hZHZhbmNlX3BjID0gMiwKLSAgICBEV19MTlNfYWR2YW5jZV9saW5lID0gMywKLSAgICBEV19MTlNfc2V0X2ZpbGUgPSA0LAotICAgIERXX0xOU19zZXRfY29sdW1uID0gNSwKLSAgICBEV19MTlNfbmVnYXRlX3N0bXQgPSA2LAotICAgIERXX0xOU19zZXRfYmFzaWNfYmxvY2sgPSA3LAotICAgIERXX0xOU19jb25zdF9hZGRfcGMgPSA4LAotICAgIERXX0xOU19maXhlZF9hZHZhbmNlX3BjID0gOQotICB9OwotCi0vKiBsaW5lIG51bWJlciBleHRlbmRlZCBvcGNvZGVzICovCi1lbnVtIGR3YXJmX2xpbmVfbnVtYmVyX3hfb3BzCi0gIHsKLSAgICBEV19MTkVfZW5kX3NlcXVlbmNlID0gMSwKLSAgICBEV19MTkVfc2V0X2FkZHJlc3MgPSAyLAotICAgIERXX0xORV9kZWZpbmVfZmlsZSA9IDMKLSAgfTsKLQotLyogY2FsbCBmcmFtZSBpbmZvcm1hdGlvbiAqLwotZW51bSBkd2FyZl9jYWxsX2ZyYW1lX2luZm8KLSAgewotICAgIERXX0NGQV9hZHZhbmNlX2xvYyA9IDB4NDAsCi0gICAgRFdfQ0ZBX29mZnNldCA9IDB4ODAsCi0gICAgRFdfQ0ZBX3Jlc3RvcmUgPSAweGMwLAotICAgIERXX0NGQV9ub3AgPSAweDAwLAotICAgIERXX0NGQV9zZXRfbG9jID0gMHgwMSwKLSAgICBEV19DRkFfYWR2YW5jZV9sb2MxID0gMHgwMiwKLSAgICBEV19DRkFfYWR2YW5jZV9sb2MyID0gMHgwMywKLSAgICBEV19DRkFfYWR2YW5jZV9sb2M0ID0gMHgwNCwKLSAgICBEV19DRkFfb2Zmc2V0X2V4dGVuZGVkID0gMHgwNSwKLSAgICBEV19DRkFfcmVzdG9yZV9leHRlbmRlZCA9IDB4MDYsCi0gICAgRFdfQ0ZBX3VuZGVmaW5lZCA9IDB4MDcsCi0gICAgRFdfQ0ZBX3NhbWVfdmFsdWUgPSAweDA4LAotICAgIERXX0NGQV9yZWdpc3RlciA9IDB4MDksCi0gICAgRFdfQ0ZBX3JlbWVtYmVyX3N0YXRlID0gMHgwYSwKLSAgICBEV19DRkFfcmVzdG9yZV9zdGF0ZSA9IDB4MGIsCi0gICAgRFdfQ0ZBX2RlZl9jZmEgPSAweDBjLAotICAgIERXX0NGQV9kZWZfY2ZhX3JlZ2lzdGVyID0gMHgwZCwKLSAgICBEV19DRkFfZGVmX2NmYV9vZmZzZXQgPSAweDBlLAotICAgIC8qIFNHSS9NSVBTIHNwZWNpZmljICovCi0gICAgRFdfQ0ZBX01JUFNfYWR2YW5jZV9sb2M4ID0gMHgxZAotICB9OwotCi0jZGVmaW5lIERXX0NJRV9JRAkgIDB4ZmZmZmZmZmYKLSNkZWZpbmUgRFdfQ0lFX1ZFUlNJT04JICAxCi0KLSNkZWZpbmUgRFdfQ0ZBX2V4dGVuZGVkICAgMAotI2RlZmluZSBEV19DRkFfbG93X3VzZXIgICAweDFjCi0jZGVmaW5lIERXX0NGQV9oaWdoX3VzZXIgIDB4M2YKLQotI2RlZmluZSBEV19DSElMRFJFTl9ubwkJICAgICAweDAwCi0jZGVmaW5lIERXX0NISUxEUkVOX3llcwkJICAgICAweDAxCi0KLSNkZWZpbmUgRFdfQUREUl9ub25lCQkwCi0KLS8qIFNvdXJjZSBsYW5ndWFnZSBuYW1lcyBhbmQgY29kZXMuICAqLwotCi1lbnVtIGR3YXJmX3NvdXJjZV9sYW5ndWFnZQotICB7Ci0gICAgRFdfTEFOR19DODkgPSAweDAwMDEsCi0gICAgRFdfTEFOR19DID0gMHgwMDAyLAotICAgIERXX0xBTkdfQWRhODMgPSAweDAwMDMsCi0gICAgRFdfTEFOR19DX3BsdXNfcGx1cyA9IDB4MDAwNCwKLSAgICBEV19MQU5HX0NvYm9sNzQgPSAweDAwMDUsCi0gICAgRFdfTEFOR19Db2JvbDg1ID0gMHgwMDA2LAotICAgIERXX0xBTkdfRm9ydHJhbjc3ID0gMHgwMDA3LAotICAgIERXX0xBTkdfRm9ydHJhbjkwID0gMHgwMDA4LAotICAgIERXX0xBTkdfUGFzY2FsODMgPSAweDAwMDksCi0gICAgRFdfTEFOR19Nb2R1bGEyID0gMHgwMDBhLAotICAgIERXX0xBTkdfSmF2YSA9IDB4OWFmNCwKLSAgICBEV19MQU5HX01pcHNfQXNzZW1ibGVyID0gMHg4MDAxCi0gIH07Ci0KLQotI2RlZmluZSBEV19MQU5HX2xvX3VzZXIgMHg4MDAwCS8qIGltcGxlbWVudGF0aW9uLWRlZmluZWQgcmFuZ2Ugc3RhcnQgKi8KLSNkZWZpbmUgRFdfTEFOR19oaV91c2VyIDB4ZmZmZgkvKiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHJhbmdlIHN0YXJ0ICovCi0KLS8qIE5hbWVzIGFuZCBjb2RlcyBmb3IgbWFjcm8gaW5mb3JtYXRpb24uICAqLwotCi1lbnVtIGR3YXJmX21hY2luZm9fcmVjb3JkX3R5cGUKLSAgewotICAgIERXX01BQ0lORk9fZGVmaW5lID0gMSwKLSAgICBEV19NQUNJTkZPX3VuZGVmID0gMiwKLSAgICBEV19NQUNJTkZPX3N0YXJ0X2ZpbGUgPSAzLAotICAgIERXX01BQ0lORk9fZW5kX2ZpbGUgPSA0LAotICAgIERXX01BQ0lORk9fdmVuZG9yX2V4dCA9IDI1NQotICB9OwotCi0jZW5kaWYgLyogX0VMRl9EV0FSRjJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvZXh0ZXJuYWwuaCBiL2luY2x1ZGUvZWxmL2V4dGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWI3N2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvZXh0ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IEVMRiBpcyByZXByZXNlbnRlZCBleHRlcm5hbGx5IGJ5IHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1maWxlIHJlcHJlc2VudGF0aW9uIG9mIEVMRi4gIEl0IHJlcXVpcmVzCi0gICB0aGUgZWxmLWNvbW1vbi5oIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIHBvcnRpb25zIHRoYXQgYXJlIGNvbW1vbiB0bwotICAgYm90aCB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucy4gKi8KLQotLyogVGhlIDY0LWJpdCBzdHVmZiBpcyBraW5kIG9mIHJhbmRvbS4gIFBlcmhhcHMgc29tZW9uZSB3aWxsIHB1Ymxpc2ggYQotICAgc3BlYyBzb21lZGF5LiAgKi8KLQotI2lmbmRlZiBfRUxGX0VYVEVSTkFMX0gKLSNkZWZpbmUgX0VMRl9FWFRFUk5BTF9ICi0KLS8qIEVMRiBIZWFkZXIgKDMyLWJpdCBpbXBsZW1lbnRhdGlvbnMpICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgllX2lkZW50WzE2XTsJCS8qIEVMRiAibWFnaWMgbnVtYmVyIiAqLwotICB1bnNpZ25lZCBjaGFyCWVfdHlwZVsyXTsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdHlwZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfbWFjaGluZVsyXTsJCS8qIFNwZWNpZmllcyByZXF1aXJlZCBhcmNoaXRlY3R1cmUgKi8KLSAgdW5zaWduZWQgY2hhcgllX3ZlcnNpb25bNF07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHZlcnNpb24gKi8KLSAgdW5zaWduZWQgY2hhcgllX2VudHJ5WzRdOwkJLyogRW50cnkgcG9pbnQgdmlydHVhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG9mZls0XTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG9mZls0XTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9mbGFnc1s0XTsJCS8qIFByb2Nlc3Nvci1zcGVjaWZpYyBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCWVfZWhzaXplWzJdOwkJLyogRUxGIGhlYWRlciBzaXplIGluIGJ5dGVzICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waGVudHNpemVbMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9waG51bVsyXTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaGVudHNpemVbMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBzaXplICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaG51bVsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIGNoYXIJZV9zaHN0cm5keFsyXTsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGYzMl9FeHRlcm5hbF9FaGRyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJZV9pZGVudFsxNl07CQkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KLSAgdW5zaWduZWQgY2hhcgllX3R5cGVbMl07CQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcgllX21hY2hpbmVbMl07CQkvKiBTcGVjaWZpZXMgcmVxdWlyZWQgYXJjaGl0ZWN0dXJlICovCi0gIHVuc2lnbmVkIGNoYXIJZV92ZXJzaW9uWzRdOwkJLyogSWRlbnRpZmllcyBvYmplY3QgZmlsZSB2ZXJzaW9uICovCi0gIHVuc2lnbmVkIGNoYXIJZV9lbnRyeVs4XTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhvZmZbOF07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hvZmZbOF07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCWVfZmxhZ3NbNF07CQkvKiBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MgKi8KLSAgdW5zaWduZWQgY2hhcgllX2Voc2l6ZVsyXTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhlbnRzaXplWzJdOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfcGhudW1bMl07CQkvKiBQcm9ncmFtIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hlbnRzaXplWzJdOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hudW1bMl07CQkvKiBTZWN0aW9uIGhlYWRlciB0YWJsZSBlbnRyeSBjb3VudCAqLwotICB1bnNpZ25lZCBjaGFyCWVfc2hzdHJuZHhbMl07CQkvKiBTZWN0aW9uIGhlYWRlciBzdHJpbmcgdGFibGUgaW5kZXggKi8KLX0gRWxmNjRfRXh0ZXJuYWxfRWhkcjsKLQotLyogUHJvZ3JhbSBoZWFkZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXBfdHlwZVs0XTsJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX29mZnNldFs0XTsJCS8qIFNlZ21lbnQgZmlsZSBvZmZzZXQgKi8KLSAgdW5zaWduZWQgY2hhcglwX3ZhZGRyWzRdOwkJLyogU2VnbWVudCB2aXJ0dWFsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX3BhZGRyWzRdOwkJLyogU2VnbWVudCBwaHlzaWNhbCBhZGRyZXNzICovCi0gIHVuc2lnbmVkIGNoYXIJcF9maWxlc3pbNF07CQkvKiBTZWdtZW50IHNpemUgaW4gZmlsZSAqLwotICB1bnNpZ25lZCBjaGFyCXBfbWVtc3pbNF07CQkvKiBTZWdtZW50IHNpemUgaW4gbWVtb3J5ICovCi0gIHVuc2lnbmVkIGNoYXIJcF9mbGFnc1s0XTsJCS8qIFNlZ21lbnQgZmxhZ3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX2FsaWduWzRdOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KLX0gRWxmMzJfRXh0ZXJuYWxfUGhkcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXBfdHlwZVs0XTsJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZsYWdzWzRdOwkJLyogU2VnbWVudCBmbGFncyAqLwotICB1bnNpZ25lZCBjaGFyCXBfb2Zmc2V0WzhdOwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBjaGFyCXBfdmFkZHJbOF07CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICB1bnNpZ25lZCBjaGFyCXBfcGFkZHJbOF07CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgdW5zaWduZWQgY2hhcglwX2ZpbGVzels4XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIHVuc2lnbmVkIGNoYXIJcF9tZW1zels4XTsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgdW5zaWduZWQgY2hhcglwX2FsaWduWzhdOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KLX0gRWxmNjRfRXh0ZXJuYWxfUGhkcjsKLQotLyogU2VjdGlvbiBoZWFkZXIgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXNoX25hbWVbNF07CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzaF90eXBlWzRdOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZmxhZ3NbNF07CQkvKiBNaXNjZWxsYW5lb3VzIHNlY3Rpb24gYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2FkZHJbNF07CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9vZmZzZXRbNF07CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfc2l6ZVs0XTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2xpbmtbNF07CQkvKiBJbmRleCBvZiBhbm90aGVyIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9pbmZvWzRdOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcmFsaWduWzRdOwkvKiBTZWN0aW9uIGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2VudHNpemVbNF07CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KLX0gRWxmMzJfRXh0ZXJuYWxfU2hkcjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXNoX25hbWVbNF07CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzaF90eXBlWzRdOwkJLyogVHlwZSBvZiBzZWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfZmxhZ3NbOF07CQkvKiBNaXNjZWxsYW5lb3VzIHNlY3Rpb24gYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2FkZHJbOF07CQkvKiBTZWN0aW9uIHZpcnR1YWwgYWRkciBhdCBleGVjdXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9vZmZzZXRbOF07CQkvKiBTZWN0aW9uIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfc2l6ZVs4XTsJCS8qIFNpemUgb2Ygc2VjdGlvbiBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2xpbmtbNF07CQkvKiBJbmRleCBvZiBhbm90aGVyIHNlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhcglzaF9pbmZvWzRdOwkJLyogQWRkaXRpb25hbCBzZWN0aW9uIGluZm9ybWF0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJc2hfYWRkcmFsaWduWzhdOwkvKiBTZWN0aW9uIGFsaWdubWVudCAqLwotICB1bnNpZ25lZCBjaGFyCXNoX2VudHNpemVbOF07CQkvKiBFbnRyeSBzaXplIGlmIHNlY3Rpb24gaG9sZHMgdGFibGUgKi8KLX0gRWxmNjRfRXh0ZXJuYWxfU2hkcjsKLQotLyogU3ltYm9sIHRhYmxlIGVudHJ5ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglzdF9uYW1lWzRdOwkJLyogU3ltYm9sIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgY2hhcglzdF92YWx1ZVs0XTsJCS8qIFZhbHVlIG9mIHRoZSBzeW1ib2wgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9zaXplWzRdOwkJLyogQXNzb2NpYXRlZCBzeW1ib2wgc2l6ZSAqLwotICB1bnNpZ25lZCBjaGFyCXN0X2luZm9bMV07CQkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9vdGhlclsxXTsJCS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NobmR4WzJdOwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi19IEVsZjMyX0V4dGVybmFsX1N5bTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCXN0X25hbWVbNF07CQkvKiBTeW1ib2wgbmFtZSwgaW5kZXggaW4gc3RyaW5nIHRibCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X2luZm9bMV07CQkvKiBUeXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcglzdF9vdGhlclsxXTsJCS8qIE5vIGRlZmluZWQgbWVhbmluZywgMCAqLwotICB1bnNpZ25lZCBjaGFyCXN0X3NobmR4WzJdOwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfdmFsdWVbOF07CQkvKiBWYWx1ZSBvZiB0aGUgc3ltYm9sICovCi0gIHVuc2lnbmVkIGNoYXIJc3Rfc2l6ZVs4XTsJCS8qIEFzc29jaWF0ZWQgc3ltYm9sIHNpemUgKi8KLX0gRWxmNjRfRXh0ZXJuYWxfU3ltOwotCi0vKiBOb3RlIHNlZ21lbnRzICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgluYW1lc3pbNF07CQkvKiBTaXplIG9mIGVudHJ5J3Mgb3duZXIgc3RyaW5nICovCi0gIHVuc2lnbmVkIGNoYXIJZGVzY3N6WzRdOwkJLyogU2l6ZSBvZiB0aGUgbm90ZSBkZXNjcmlwdG9yICovCi0gIHVuc2lnbmVkIGNoYXIJdHlwZVs0XTsJCS8qIEludGVycHJldGF0aW9uIG9mIHRoZSBkZXNjcmlwdG9yICovCi0gIGNoYXIJCW5hbWVbMV07CQkvKiBTdGFydCBvZiB0aGUgbmFtZStkZXNjIGRhdGEgKi8KLX0gRWxmX0V4dGVybmFsX05vdGU7Ci0KLS8qIFJlbG9jYXRpb24gRW50cmllcyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzRdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzRdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi19IEVsZjMyX0V4dGVybmFsX1JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzRdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzRdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9hZGRlbmRbNF07CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KLX0gRWxmMzJfRXh0ZXJuYWxfUmVsYTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzhdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi19IEVsZjY0X0V4dGVybmFsX1JlbDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyIHJfb2Zmc2V0WzhdOwkvKiBMb2NhdGlvbiBhdCB3aGljaCB0byBhcHBseSB0aGUgYWN0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9pbmZvWzhdOwkvKiBpbmRleCBhbmQgdHlwZSBvZiByZWxvY2F0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIJcl9hZGRlbmRbOF07CS8qIENvbnN0YW50IGFkZGVuZCB1c2VkIHRvIGNvbXB1dGUgdmFsdWUgKi8KLX0gRWxmNjRfRXh0ZXJuYWxfUmVsYTsKLQotLyogZHluYW1pYyBzZWN0aW9uIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJZF90YWdbNF07CQkvKiBlbnRyeSB0YWcgdmFsdWUgKi8KLSAgdW5pb24gewotICAgIHVuc2lnbmVkIGNoYXIJZF92YWxbNF07Ci0gICAgdW5zaWduZWQgY2hhcglkX3B0cls0XTsKLSAgfSBkX3VuOwotfSBFbGYzMl9FeHRlcm5hbF9EeW47Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcglkX3RhZ1s4XTsJCS8qIGVudHJ5IHRhZyB2YWx1ZSAqLwotICB1bmlvbiB7Ci0gICAgdW5zaWduZWQgY2hhcglkX3ZhbFs4XTsKLSAgICB1bnNpZ25lZCBjaGFyCWRfcHRyWzhdOwotICB9IGRfdW47Ci19IEVsZjY0X0V4dGVybmFsX0R5bjsKLQotLyogVGhlIHZlcnNpb24gc3RydWN0dXJlcyBhcmUgY3VycmVudGx5IHNpemUgaW5kZXBlbmRlbnQuICBUaGV5IGFyZQotICAgbmFtZWQgd2l0aG91dCBhIDMyIG9yIDY0LiAgSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoZXNlIHN0cnVjdHVyZXMKLSAgIHdpbGwgbmVlZCB0byBiZSByZW5hbWVkLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX3ZlcnNpb25bMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX2ZsYWdzWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9uZHhbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkX2NudFsyXTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfaGFzaFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdmRfYXV4WzRdOwotICB1bnNpZ25lZCBjaGFyCQl2ZF9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVyZGVmOwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJkZWYgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdmRhX25hbWVbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZkYV9uZXh0WzRdOwotfSBFbGZfRXh0ZXJuYWxfVmVyZGF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVybmVlZCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBjaGFyCQl2bl92ZXJzaW9uWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bl9jbnRbMl07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX2ZpbGVbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuX2F1eFs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5fbmV4dFs0XTsKLX0gRWxmX0V4dGVybmFsX1Zlcm5lZWQ7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX2hhc2hbNF07Ci0gIHVuc2lnbmVkIGNoYXIJCXZuYV9mbGFnc1syXTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX290aGVyWzJdOwotICB1bnNpZ25lZCBjaGFyCQl2bmFfbmFtZVs0XTsKLSAgdW5zaWduZWQgY2hhcgkJdm5hX25leHRbNF07Ci19IEVsZl9FeHRlcm5hbF9WZXJuYXV4OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBhcHBlYXJzIGluIGEgU0hUX0dOVV92ZXJzeW0gc2VjdGlvbi4gIFRoaXMgaXMgbm90IGEKLSAgIHN0YW5kYXJkIEVMRiBzdHJ1Y3R1cmU7IEVMRiBqdXN0IHVzZXMgRWxmMzJfSGFsZi4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdW5zaWduZWQgY2hhcgkJdnNfdmVyc1syXTsKLX0KLSNpZmRlZiBfX0dOVUNfXwotICBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkKLSNlbmRpZgotICBFbGZfRXh0ZXJuYWxfVmVyc3ltOwotCi0vKiBTdHJ1Y3R1cmUgZm9yIHN5bWluZm8gc2VjdGlvbi4gICovCi10eXBlZGVmIHN0cnVjdAotewotICB1bnNpZ25lZCBjaGFyCQlzaV9ib3VuZHRvWzJdOwotICB1bnNpZ25lZCBjaGFyCQlzaV9mbGFnc1syXTsKLX0gRWxmX0V4dGVybmFsX1N5bWluZm87Ci0KLSNlbmRpZiAvKiBfRUxGX0VYVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL2ZyMzAuaCBiL2luY2x1ZGUvZWxmL2ZyMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzYjA1Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9mcjMwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBGUjMwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX0ZSMzBfSAotI2RlZmluZSBfRUxGX0ZSMzBfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfZnIzMF9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF84LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8yMCwgMikKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfMzIsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzQ4LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF82X0lOXzQsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwXzhfSU5fOCwgNikKLSAgUkVMT0NfTlVNQkVSIChSX0ZSMzBfOV9JTl84LCA3KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8xMF9JTl84LCA4KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF85X1BDUkVMLCA5KQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF8xMl9QQ1JFTCwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9GUjMwX0dOVV9WVElOSEVSSVQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfRlIzMF9HTlVfVlRFTlRSWSwgMTIpCi0gIEVNUFRZX1JFTE9DICAoUl9GUjMwX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0ZSMzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaHBwYS5oIGIvaW5jbHVkZS9lbGYvaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTUwNzI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2hwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKiBIUFBBIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBIUFBBIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX0hQUEFfSAotI2RlZmluZSBfRUxGX0hQUEFfSAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBUcmFwIG51bGwgYWRkcmVzcyBkZXJlZmVyZW5jZXMuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfVFJBUE5JTAkweDAwMDEwMDAwCi0KLS8qIC5QQVJJU0MuYXJjaGV4dCBzZWN0aW9uIGlzIHByZXNlbnQuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfRVhUCQkweDAwMDIwMDAwCi0KLS8qIFByb2dyYW0gZXhwZWN0cyBsaXR0bGUtZW5kaWFuIG1vZGUuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfTFNCCQkweDAwMDQwMDAwCi0KLS8qIFByb2dyYW0gZXhwZWN0cyB3aWRlIG1vZGUuICAqLwotI2RlZmluZSBFRl9QQVJJU0NfV0lERQkJMHgwMDA4MDAwMAotCi0vKiBEbyBub3QgYWxsb3cga2VybmVsLWFzc2lzdGVkIGJyYW5jaCBwcmVkaWN0aW9uLiAgKi8KLSNkZWZpbmUgRUZfUEFSSVNDX05PX0tBQlAJMHgwMDEwMDAwMAotCi0vKiBBbGxvdyBsYXp5IHN3YXAgZm9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KLSNkZWZpbmUgRUZfUEFSSVNDX0xBWllTV0FQCTB4MDA0MDAwMDAKLQotLyogQXJjaGl0ZWN0dXJlIHZlcnNpb24gKi8KLSNkZWZpbmUgRUZfUEFSSVNDX0FSQ0gJCTB4MDAwMGZmZmYKLQotI2RlZmluZSBFRkFfUEFSSVNDXzFfMAkJCTB4MDIwYgotI2RlZmluZSBFRkFfUEFSSVNDXzFfMQkJCTB4MDIxMAotI2RlZmluZSBFRkFfUEFSSVNDXzJfMAkJCTB4MDIxNAotCi0vKiBTcGVjaWFsIHNlY3Rpb24gaW5kaWNlcy4gICovCi0vKiBBIHN5bWJvbCB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgdGVudGF0aXZlIGRlZmluaXRpb24gaW4gYW4gQU5TSSBDCi0gICBjb21waWxhdGlvbi4gICovCi0jZGVmaW5lIFNITl9QQVJJU0NfQU5TSV9DT01NT04gCTB4ZmYwMAotCi0vKiBBIHN5bWJvbCB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGFzIGEgY29tbW9uIGJsb2NrIHVzaW5nIHRoZSAKLSAgIGh1Z2UgbWVtb3J5IG1vZGVsLiAgKi8KLSNkZWZpbmUgU0hOX1BBUklTQ19IVUdFX0NPTU1PTgkweGZmMDEKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHByb2R1Y3Qgc3BlY2lmaWMgZXh0ZW5zaW9uIGJpdHMuICAqLwotI2RlZmluZSBTSFRfUEFSSVNDX0VYVAkJMHg3MDAwMDAwMAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHVud2luZCB0YWJsZSBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgU0hUX1BBUklTQ19VTldJTkQJMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGRlYnVnIGluZm9ybWF0aW9uIGZvciBvcHRpbWl6ZWQgY29kZS4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfRE9DCQkweDcwMDAwMDAyCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgY29kZSBhbm5vdGF0aW9ucy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfQU5OT1QJMHg3MDAwMDAwMwotCi0vKiBUaGVzZSBhcmUgc3RyaWN0bHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkZXIgZWxmMzItaHBwYQotICAgaW1wbGVtZW50YXRpb24uICBIb3BlZnVsbHkgd2UgY2FuIGVsaW1pbmF0ZSB0aGVtIGluIHRoZSBmdXR1cmUuICAqLwotLyogT3B0aW9uYWwgc2VjdGlvbiBob2xkaW5nIGFyZ3VtZW50IGxvY2F0aW9uL3JlbG9jYXRpb24gaW5mby4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfU1lNRVhUTiAgICBTSFRfTE9QUk9DKzgKLQotLyogT3B0aW9uIHNlY3Rpb24gZm9yIGxpbmtlciBzdHVicy4gICovCi0jZGVmaW5lIFNIVF9QQVJJU0NfU1RVQlMgICAgICBTSFRfTE9QUk9DKzkKLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIGNvZGUgY29tcGlsZWQgZm9yIHN0YXRpYyBicmFuY2ggcHJlZGljdGlvbi4gICovCi0jZGVmaW5lIFNIRl9QQVJJU0NfU0JQCQkweDgwMDAwMDAwCi0KLS8qIFNlY3Rpb24gc2hvdWxkIGJlIGFsbG9jYXRlZCBmcm9tIGZyb20gR1AuICAqLwotI2RlZmluZSBTSEZfUEFSSVNDX0hVR0UJCTB4NDAwMDAwMDAKLQotLyogU2VjdGlvbiBzaG91bGQgZ28gbmVhciBHUC4gICovCi0jZGVmaW5lIFNIRl9QQVJJU0NfU0hPUlQJMHgyMDAwMDAwMAotCi0KLS8qIElkZW50aWZpZXMgdGhlIGVudHJ5IHBvaW50IG9mIGEgbWlsbGljb2RlIHJvdXRpbmUuICAqLwotI2RlZmluZSBTVFRfUEFSSVNDX01JTExJCTEzCi0KLS8qIEVMRi9IUFBBIHJlbG9jYXRpb24gdHlwZXMgKi8KLQotLyogTm90ZTogUEEtRUxGIGlzIGRlZmluZWQgdG8gdXNlIG9ubHkgUkVMQSByZWxvY2F0aW9ucy4gICovCi0jaW5jbHVkZSAicmVsb2MtbWFjcm9zLmgiCi0KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9ocHBhX3JlbG9jX3R5cGUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTk9ORSwgICAgICAwKQkvKiBObyByZWxvYyAqLwotICAgICAKLSAgICAgLyogVGhlc2UgcmVsb2NhdGlvbiB0eXBlcyBkbyBzaW1wbGUgYmFzZSArIG9mZnNldCByZWxvY2F0aW9ucy4gICovCi0KLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIzMiwgIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMjFMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE3UiwgMykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxN0YsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTRSLCA2KQotCi0gICAgLyogUEMtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcwotICAgICAgIFR5cGljYWxseSB1c2VkIGZvciBjYWxscy4KLSAgICAgICBOb3RlIFBDUkVMMTdDIGFuZCBQQ1JFTDE3RiBkaWZmZXIgb25seSBpbiBvdmVyZmxvdyBoYW5kbGluZy4KLSAgICAgICBQQ1JFTDE3QyBuZXZlciByZXBvcnRzIGEgcmVsb2NhdGlvbiBlcnJvci4KLQotICAgICAgIFdoZW4gc3VwcG9ydGluZyBhcmd1bWVudCByZWxvY2F0aW9ucywgZnVuY3Rpb24gY2FsbHMgbXVzdCBiZQotICAgICAgIGFjY29tcGFuaWVkIGJ5IHBhcmFtZXRlciByZWxvY2F0aW9uIGluZm9ybWF0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyAKLSAgICAgICBjYXJyaWVkIGluIHRoZSB0ZW4gaGlnaC1vcmRlciBiaXRzIG9mIHRoZSBhZGRlbmQgZmllbGQuICBUaGUgcmVtYWluaW5nCi0gICAgICAgMjIgYml0cyBvZiBvZiB0aGUgYWRkZW5kIGZpZWxkIGFyZSBzaWduLWV4dGVuZGVkIHRvIGZvcm0gdGhlIEFkZGVuZC4KLQotICAgICAgIE5vdGUgdGhlIGNvZGUgdG8gYnVpbGQgYXJndW1lbnQgcmVsb2NhdGlvbnMgZGVwZW5kcyBvbiB0aGUgCi0gICAgICAgYWRkZW5kIGJlaW5nIHplcm8uICBBIGNvbnNlcXVlbmNlIG9mIHRoaXMgbGltaXRhdGlvbiBpcyBHQVMKLSAgICAgICBjYW4gbm90IHBlcmZvcm0gcmVsb2NhdGlvbiByZWR1Y3Rpb25zIGZvciBmdW5jdGlvbiBzeW1ib2xzLiAgKi8KLSAgICAgCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDMyLCA5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwyMUwsIDEwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxN1IsIDExKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxN0YsIDEyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxN0MsIDEzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNFIsIDE0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNEYsIDE1KQotCi0gICAgLyogRFAtcmVsYXRpdmUgcmVsb2NhdGlvbiB0eXBlcy4gICovCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDIxTCwgMTgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19EUFJFTDE0V1IsIDE5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRFBSRUwxNERSLCAyMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMTRSLCAyMikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RQUkVMMTRGLCAyMykKLQotICAgIC8qIERhdGEgbGlua2FnZSB0YWJsZSAoRExUKSByZWxvY2F0aW9uIHR5cGVzCi0KLSAgICAgICBTT00gRExUX1JFTCBmaXh1cCByZXF1ZXN0cyBhcmUgdXNlZCB0byBmb3Igc3RhdGljIGRhdGEgcmVmZXJlbmNlcwotICAgICAgIGZyb20gcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSB3aXRoaW4gc2hhcmVkIGxpYnJhcmllcy4gIFRoZXkgYXJlCi0gICAgICAgc2ltaWxhciB0byB0aGUgR09UIHJlbG9jYXRpb24gdHlwZXMgaW4gc29tZSBTVlI0IGltcGxlbWVudGF0aW9ucy4gICovCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDIxTCwgMjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNFIsIDMwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUUkVMMTRGLCAzMSkKLQotICAgIC8qIERMVCBpbmRpcmVjdCByZWxvY2F0aW9uIHR5cGVzICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRExUSU5EMjFMLCAzNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0UiwgMzgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQxNEYsIDM5KQotCi0gICAgLyogQmFzZSByZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgVWdoLiAgVGhlc2UgaW1wbHkgbG90cyBvZiBzdGF0ZSAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VUQkFTRSwgNDApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUNSRUwzMiwgNDEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMjFMLCA0MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxN1IsIDQzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE3RiwgNDQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTRSLCA0NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0JBU0VSRUwxNEYsIDQ3KQotCi0gICAgLyogU2VnbWVudCByZWxhdGl2ZSByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1NFR0JBU0UsIDQ4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VHUkVMMzIsIDQ5KQotCi0gICAgLyogT2Zmc2V0cyBmcm9tIHRoZSBQTFQuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMjFMLCA1MCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMVE9GRjE0UiwgNTQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNEYsIDU1KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMzIsIDU3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjIxTCwgNTgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTRSLCA2MikKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRlBUUjY0LCA2NCkKLQotICAgIC8qIFBsYWJlbCByZWxvY2F0aW9uIHR5cGVzLiAgKi8KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDMyLCA2NSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BMQUJFTDIxTCwgNjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTEFCRUwxNFIsIDcwKQotCi0gICAgLyogUENSRUwgcmVsb2NhdGlvbnMuICAqLwotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUw2NCwgNzIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDIyQywgNzMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDIyRiwgNzQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE0V1IsIDc1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUENSRUwxNERSLCA3NikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTZGLCA3NykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1BDUkVMMTZXRiwgNzgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QQ1JFTDE2REYsIDc5KQotCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjY0LCA4MCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjY0V1IsIDgxKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSNjREUiwgODIpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ESVIxNFdSLCA4MykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE0RFIsIDg0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTZGLCA4NSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RJUjE2V0YsIDg2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRElSMTZERiwgODcpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0dQUkVMNjQsIDg4KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRSRUwxNFdSLCA5MSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVFJFTDE0RFIsIDkyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUwxNkYsIDkzKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfR1BSRUwxNldGLCA5NCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0dQUkVMMTZERiwgOTUpCi0KLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkY2NCwgOTYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19ETFRJTkQxNFdSLCA5OSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0RMVElORDE0RFIsIDEwMCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGMTZGLCAxMDEpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRjE2V0YsIDEwMikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGMTZERiwgMTAzKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19TRUNSRUw2NCwgMTA0KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19CQVNFUkVMMTRXUiwgMTA3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQkFTRVJFTDE0RFIsIDEwOCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfU0VHUkVMNjQsIDExMikKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTRXUiwgMTE1KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTREUiwgMTE2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfUExUT0ZGMTZGLCAxMTcpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNldGLCAxMTgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19QTFRPRkYxNkRGLCAxMTkpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFI2NCwgMTIwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE0V1IsIDEyMykKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX0ZQVFIxNERSLCAxMjQpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTZGLCAxMjUpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9GUFRSMTZXRiwgMTI2KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfRlBUUjE2REYsIDEyNykKLQotIAotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfQ09QWSwgMTI4KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfSVBMVCwgMTI5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfRVBMVCwgMTMwKQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDMyLCAxNTMpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDIxTCwgMTU0KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNFIsIDE1OCkKLQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAyMUwsIDE2MikKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTRSLCAxNjYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE0RiwgMTY3KQotCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDY0LCAyMTYpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19UUFJFTDE0V1IsIDIxOSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTREUiwgMjIwKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNkYsIDIyMSkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX1RQUkVMMTZXRiwgMjIyKQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfVFBSRUwxNkRGLCAyMjMpCi0KLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQNjQsIDIyNCkKLSAgICBSRUxPQ19OVU1CRVIgKFJfUEFSSVNDX0xUT0ZGX1RQMTRXUiwgMjI3KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNERSLCAyMjgpCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE2RiwgMjI5KQotICAgIFJFTE9DX05VTUJFUiAoUl9QQVJJU0NfTFRPRkZfVFAxNldGLCAyMzApCi0gICAgUkVMT0NfTlVNQkVSIChSX1BBUklTQ19MVE9GRl9UUDE2REYsIDIzMSkKLSAgICBFTVBUWV9SRUxPQyAoUl9QQVJJU0NfVU5JTVBMRU1FTlRFRCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNpZm5kZWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi10eXBlZGVmIGVudW0gZWxmX2hwcGFfcmVsb2NfdHlwZSBlbGZfaHBwYV9yZWxvY190eXBlOwotI2VuZGlmCi0KLSNkZWZpbmUgUFRfUEFSSVNDX0FSQ0hFWFQJMHg3MDAwMDAwMAotI2RlZmluZSBQVF9QQVJJU0NfVU5XSU5ECTB4NzAwMDAwMDEKLSNkZWZpbmUgUEZfUEFSSVNDX1NCUAkJMHgwODAwMDAwMAotI2VuZGlmIC8qIF9FTEZfSFBQQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9pMzg2LmggYi9pbmNsdWRlL2VsZi9pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOWYxMDUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyogaXg4NiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9JMzg2X0gKLSNkZWZpbmUgX0VMRl9JMzg2X0gKLQotI2luY2x1ZGUgInJlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTM4Nl9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X05PTkUsICAgICAgMCkJLyogTm8gcmVsb2MgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8zMiwgICAgICAgIDEpCS8qIERpcmVjdCAzMiBiaXQgICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMzMiwgICAgICAyKQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HT1QzMiwgICAgIDMpCS8qIDMyIGJpdCBHT1QgZW50cnkgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9QTFQzMiwJICAgIDQpCS8qIDMyIGJpdCBQTFQgYWRkcmVzcyAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0NPUFksCSAgICA1KQkvKiBDb3B5IHN5bWJvbCBhdCBydW50aW1lICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR0xPQl9EQVQsICA2KQkvKiBDcmVhdGUgR09UIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfSlVNUF9TTE9ULCA3KQkvKiBDcmVhdGUgUExUIGVudHJ5ICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUkVMQVRJVkUsICA4KQkvKiBBZGp1c3QgYnkgcHJvZ3JhbSBiYXNlICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR09UT0ZGLCAgICA5KQkvKiAzMiBiaXQgb2Zmc2V0IHRvIEdPVCAqLwotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X0dPVFBDLCAgICAxMCkJLyogMzIgYml0IFBDIHJlbGF0aXZlIG9mZnNldCB0byBHT1QgKi8KLSAgICAgRkFLRV9SRUxPQyAgIChGSVJTVF9JTlZBTElEX1JFTE9DLCAxMSkKLSAgICAgRkFLRV9SRUxPQyAgIChMQVNUX0lOVkFMSURfUkVMT0MsICAxOSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl8xNiwgICAgICAgMjApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfUEMxNiwgICAgIDIxKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2XzgsCSAgIDIyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfMzg2X1BDOCwgICAgICAyMykKLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9tYXgsCSAgIDI0KQotICAgICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgICAgUkVMT0NfTlVNQkVSIChSXzM4Nl9HTlVfVlRJTkhFUklULCAyNTApCi0gICAgIFJFTE9DX05VTUJFUiAoUl8zODZfR05VX1ZURU5UUlksIDI1MSkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaTk2MC5oIGIvaW5jbHVkZS9lbGYvaTk2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTM5ZDI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL2k5NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIEludGVsIDk2MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9JOTYwX0gKLSNkZWZpbmUgX0VMRl9JOTYwX0gKLQotI2luY2x1ZGUgInJlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfaTk2MF9yZWxvY190eXBlKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX05PTkUsCSAgICAwKQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwXzEyLAkgICAgMSkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF8zMiwJICAgIDIpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfSVAyNCwJICAgIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfU1VCLAkgICAgNCkKLSAgICAgUkVMT0NfTlVNQkVSIChSXzk2MF9PUFRDQUxMLCAgIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl85NjBfT1BUQ0FMTFgsICA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfOTYwX09QVENBTExYQSwgNykKLSAgICAgRU1QVFlfUkVMT0MgKFJfOTYwX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZiAvKiBfRUxGX0k5NjBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaCBiL2luY2x1ZGUvZWxmL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YjgxYTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vKiBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQsIGZyb20gaW5mb3JtYXRpb24gcHVibGlzaGVkCi0gICBpbiAiVU5JWCBTeXN0ZW0gViBSZWxlYXNlIDQsIFByb2dyYW1tZXJzIEd1aWRlOiBBTlNJIEMgYW5kCi0gICBQcm9ncmFtbWluZyBTdXBwb3J0IFRvb2xzIi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVMRiBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IEVMRiBpcyByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGluIHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgRUxGLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBlbGYtY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0KLS8qIE5PVEUgdGhhdCB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSBub3Qga2VwdCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGV5IGFwcGVhcgotICAgaW4gdGhlIG9iamVjdCBmaWxlLiAgSW4gc29tZSBjYXNlcyB0aGV5J3ZlIGJlZW4gcmVvcmRlcmVkIGZvciBtb3JlIG9wdGltYWwKLSAgIHBhY2tpbmcgdW5kZXIgdmFyaW91cyBjaXJjdW1zdGFuY2VzLiAgKi8KLQotI2lmbmRlZiBfRUxGX0lOVEVSTkFMX0gKLSNkZWZpbmUgX0VMRl9JTlRFUk5BTF9ICi0KLS8qIEVMRiBIZWFkZXIgKi8KLQotI2RlZmluZSBFSV9OSURFTlQJMTYJCS8qIFNpemUgb2YgZV9pZGVudFtdICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9laGRyIHsKLSAgdW5zaWduZWQgY2hhcgkJZV9pZGVudFtFSV9OSURFTlRdOwkvKiBFTEYgIm1hZ2ljIG51bWJlciIgKi8KLSAgYmZkX3ZtYQkJZV9lbnRyeTsJCS8qIEVudHJ5IHBvaW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBiZmRfc2l6ZV90eXBlCQllX3Bob2ZmOwkJLyogUHJvZ3JhbSBoZWFkZXIgdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgYmZkX3NpemVfdHlwZQkJZV9zaG9mZjsJCS8qIFNlY3Rpb24gaGVhZGVyIHRhYmxlIGZpbGUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGxvbmcJCWVfdmVyc2lvbjsJCS8qIElkZW50aWZpZXMgb2JqZWN0IGZpbGUgdmVyc2lvbiAqLwotICB1bnNpZ25lZCBsb25nCQllX2ZsYWdzOwkJLyogUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzICovCi0gIHVuc2lnbmVkIHNob3J0CWVfdHlwZTsJCQkvKiBJZGVudGlmaWVzIG9iamVjdCBmaWxlIHR5cGUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9tYWNoaW5lOwkJLyogU3BlY2lmaWVzIHJlcXVpcmVkIGFyY2hpdGVjdHVyZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX2Voc2l6ZTsJCS8qIEVMRiBoZWFkZXIgc2l6ZSBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBzaG9ydAllX3BoZW50c2l6ZTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IHNpemUgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9waG51bTsJCS8qIFByb2dyYW0gaGVhZGVyIHRhYmxlIGVudHJ5IGNvdW50ICovCi0gIHVuc2lnbmVkIHNob3J0CWVfc2hlbnRzaXplOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgc2l6ZSAqLwotICB1bnNpZ25lZCBzaG9ydAllX3NobnVtOwkJLyogU2VjdGlvbiBoZWFkZXIgdGFibGUgZW50cnkgY291bnQgKi8KLSAgdW5zaWduZWQgc2hvcnQJZV9zaHN0cm5keDsJCS8qIFNlY3Rpb24gaGVhZGVyIHN0cmluZyB0YWJsZSBpbmRleCAqLwotfSBFbGZfSW50ZXJuYWxfRWhkcjsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9laGRyIGVsZl9pbnRlcm5hbF9laGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX0VoZHIgRWxmX0ludGVybmFsX0VoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZWhkciBlbGZfaW50ZXJuYWxfZWhkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9FaGRyIEVsZl9JbnRlcm5hbF9FaGRyCi0KLS8qIFByb2dyYW0gaGVhZGVyICovCi0KLXN0cnVjdCBlbGZfaW50ZXJuYWxfcGhkciB7Ci0gIHVuc2lnbmVkIGxvbmcJcF90eXBlOwkJCS8qIElkZW50aWZpZXMgcHJvZ3JhbSBzZWdtZW50IHR5cGUgKi8KLSAgdW5zaWduZWQgbG9uZwlwX2ZsYWdzOwkJLyogU2VnbWVudCBmbGFncyAqLwotICBiZmRfdm1hCXBfb2Zmc2V0OwkJLyogU2VnbWVudCBmaWxlIG9mZnNldCAqLwotICBiZmRfdm1hCXBfdmFkZHI7CQkvKiBTZWdtZW50IHZpcnR1YWwgYWRkcmVzcyAqLwotICBiZmRfdm1hCXBfcGFkZHI7CQkvKiBTZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgYmZkX3ZtYQlwX2ZpbGVzejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBmaWxlICovCi0gIGJmZF92bWEJcF9tZW1zejsJCS8qIFNlZ21lbnQgc2l6ZSBpbiBtZW1vcnkgKi8KLSAgYmZkX3ZtYQlwX2FsaWduOwkJLyogU2VnbWVudCBhbGlnbm1lbnQsIGZpbGUgJiBtZW1vcnkgKi8KLX07Ci0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9waGRyIEVsZl9JbnRlcm5hbF9QaGRyOwotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9waGRyIGVsZl9pbnRlcm5hbF9waGRyCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1BoZHIgRWxmX0ludGVybmFsX1BoZHIKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcGhkciBlbGZfaW50ZXJuYWxfcGhkcgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9QaGRyIEVsZl9JbnRlcm5hbF9QaGRyCi0KLS8qIFNlY3Rpb24gaGVhZGVyICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF9zaGRyIHsKLSAgdW5zaWduZWQgaW50CXNoX25hbWU7CQkvKiBTZWN0aW9uIG5hbWUsIGluZGV4IGluIHN0cmluZyB0YmwgKi8KLSAgdW5zaWduZWQgaW50CXNoX3R5cGU7CQkvKiBUeXBlIG9mIHNlY3Rpb24gKi8KLSAgYmZkX3ZtYQlzaF9mbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgc2VjdGlvbiBhdHRyaWJ1dGVzICovCi0gIGJmZF92bWEJc2hfYWRkcjsJCS8qIFNlY3Rpb24gdmlydHVhbCBhZGRyIGF0IGV4ZWN1dGlvbiAqLwotICBiZmRfc2l6ZV90eXBlCXNoX3NpemU7CQkvKiBTaXplIG9mIHNlY3Rpb24gaW4gYnl0ZXMgKi8KLSAgYmZkX3NpemVfdHlwZQlzaF9lbnRzaXplOwkJLyogRW50cnkgc2l6ZSBpZiBzZWN0aW9uIGhvbGRzIHRhYmxlICovCi0gIHVuc2lnbmVkIGxvbmcJc2hfbGluazsJCS8qIEluZGV4IG9mIGFub3RoZXIgc2VjdGlvbiAqLwotICB1bnNpZ25lZCBsb25nCXNoX2luZm87CQkvKiBBZGRpdGlvbmFsIHNlY3Rpb24gaW5mb3JtYXRpb24gKi8KLSAgZmlsZV9wdHIJc2hfb2Zmc2V0OwkJLyogU2VjdGlvbiBmaWxlIG9mZnNldCAqLwotICB1bnNpZ25lZCBpbnQJc2hfYWRkcmFsaWduOwkJLyogU2VjdGlvbiBhbGlnbm1lbnQgKi8KLQotICAvKiBUaGUgaW50ZXJuYWwgcmVwIGFsc28gaGFzIHNvbWUgY2FjaGVkIGluZm8gYXNzb2NpYXRlZCB3aXRoIGl0LiAqLwotICBhc2VjdGlvbiAqCWJmZF9zZWN0aW9uOwkJLyogQXNzb2NpYXRlZCBCRkQgc2VjdGlvbi4gICovCi0gIFBUUgkJY29udGVudHM7CQkvKiBTZWN0aW9uIGNvbnRlbnRzLiAgKi8KLX0gRWxmX0ludGVybmFsX1NoZHI7Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc2hkciBlbGZfaW50ZXJuYWxfc2hkcgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TaGRyIEVsZl9JbnRlcm5hbF9TaGRyCi0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3NoZHIgZWxmX2ludGVybmFsX3NoZHIKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU2hkciBFbGZfSW50ZXJuYWxfU2hkcgotCi0vKiBTeW1ib2wgdGFibGUgZW50cnkgKi8KLQotc3RydWN0IGVsZl9pbnRlcm5hbF9zeW0gewotICBiZmRfdm1hCXN0X3ZhbHVlOwkJLyogVmFsdWUgb2YgdGhlIHN5bWJvbCAqLwotICBiZmRfdm1hCXN0X3NpemU7CQkvKiBBc3NvY2lhdGVkIHN5bWJvbCBzaXplICovCi0gIHVuc2lnbmVkIGxvbmcJc3RfbmFtZTsJCS8qIFN5bWJvbCBuYW1lLCBpbmRleCBpbiBzdHJpbmcgdGJsICovCi0gIHVuc2lnbmVkIGNoYXIJc3RfaW5mbzsJCS8qIFR5cGUgYW5kIGJpbmRpbmcgYXR0cmlidXRlcyAqLwotICB1bnNpZ25lZCBjaGFyCXN0X290aGVyOwkJLyogTm8gZGVmaW5lZCBtZWFuaW5nLCAwICovCi0gIHVuc2lnbmVkIHNob3J0IHN0X3NobmR4OwkJLyogQXNzb2NpYXRlZCBzZWN0aW9uIGluZGV4ICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfc3ltIEVsZl9JbnRlcm5hbF9TeW07Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfc3ltIGVsZl9pbnRlcm5hbF9zeW0KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfU3ltIEVsZl9JbnRlcm5hbF9TeW0KLQotLyogTm90ZSBzZWdtZW50cyAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfbm90ZSB7Ci0gIHVuc2lnbmVkIGxvbmcJbmFtZXN6OwkJCS8qIFNpemUgb2YgZW50cnkncyBvd25lciBzdHJpbmcgKi8KLSAgdW5zaWduZWQgbG9uZwlkZXNjc3o7CQkJLyogU2l6ZSBvZiB0aGUgbm90ZSBkZXNjcmlwdG9yICovCi0gIHVuc2lnbmVkIGxvbmcJdHlwZTsJCQkvKiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgZGVzY3JpcHRvciAqLwotICBjaGFyICoJbmFtZWRhdGE7CQkvKiBTdGFydCBvZiB0aGUgbmFtZStkZXNjIGRhdGEgKi8KLSAgY2hhciAqCWRlc2NkYXRhOwkJLyogU3RhcnQgb2YgdGhlIGRlc2MgZGF0YSAqLwotICBiZmRfdm1hCWRlc2Nwb3M7CQkvKiBGaWxlIG9mZnNldCBvZiB0aGUgZGVzY2RhdGEgKi8KLX0gRWxmX0ludGVybmFsX05vdGU7Ci0jZGVmaW5lIEVsZjMyX0ludGVybmFsX05vdGUJRWxmX0ludGVybmFsX05vdGUKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfbm90ZQllbGZfaW50ZXJuYWxfbm90ZQotCi0vKiBSZWxvY2F0aW9uIEVudHJpZXMgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3JlbCB7Ci0gIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICBiZmRfdm1hCXJfaW5mbzsJCS8qIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gKi8KLX0gRWxmX0ludGVybmFsX1JlbDsKLQotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF9yZWwgZWxmX2ludGVybmFsX3JlbAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9SZWwgRWxmX0ludGVybmFsX1JlbAotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfcmVsYSB7Ci0gIGJmZF92bWEJcl9vZmZzZXQ7CS8qIExvY2F0aW9uIGF0IHdoaWNoIHRvIGFwcGx5IHRoZSBhY3Rpb24gKi8KLSAgYmZkX3ZtYQlyX2luZm87CQkvKiBJbmRleCBhbmQgVHlwZSBvZiByZWxvY2F0aW9uICovCi0gIGJmZF9zaWduZWRfdm1hIHJfYWRkZW5kOwkvKiBDb25zdGFudCBhZGRlbmQgdXNlZCB0byBjb21wdXRlIHZhbHVlICovCi19IEVsZl9JbnRlcm5hbF9SZWxhOwotCi0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3JlbGEgZWxmX2ludGVybmFsX3JlbGEKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfcmVsYSBlbGZfaW50ZXJuYWxfcmVsYQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9SZWxhIEVsZl9JbnRlcm5hbF9SZWxhCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1JlbGEgRWxmX0ludGVybmFsX1JlbGEKLQotLyogZHluYW1pYyBzZWN0aW9uIHN0cnVjdHVyZSAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfZHluIHsKLSAgLyogVGhpcyBuZWVkcyB0byBzdXBwb3J0IDY0LWJpdCB2YWx1ZXMgaW4gZWxmNjQuICAqLwotICBiZmRfdm1hIGRfdGFnOwkJLyogZW50cnkgdGFnIHZhbHVlICovCi0gIHVuaW9uIHsKLSAgICAvKiBUaGlzIG5lZWRzIHRvIHN1cHBvcnQgNjQtYml0IHZhbHVlcyBpbiBlbGY2NC4gICovCi0gICAgYmZkX3ZtYQlkX3ZhbDsKLSAgICBiZmRfdm1hCWRfcHRyOwotICB9IGRfdW47Ci19IEVsZl9JbnRlcm5hbF9EeW47Ci0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfZHluIGVsZl9pbnRlcm5hbF9keW4KLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfRHluIEVsZl9JbnRlcm5hbF9EeW4KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyZGVmIHsKLSAgdW5zaWduZWQgc2hvcnQgdmRfdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfZmxhZ3M7CS8qIEZsYWdzIChWRVJfRkxHXyopLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfbmR4OwkvKiBWZXJzaW9uIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdmRfY250OwkvKiBOdW1iZXIgb2YgdmVyZGF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfaGFzaDsJLyogSGFzaCBvZiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfYXV4OwkvKiBPZmZzZXQgdG8gdmVyZGF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdmRfbmV4dDsJLyogT2Zmc2V0IHRvIG5leHQgdmVyZGVmLiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgYmZkCQkJICAgICAgKnZkX2JmZDsJCS8qIEJGRC4gICovCi0gIGNvbnN0IGNoYXIJCSAgICAgICp2ZF9ub2RlbmFtZTsJLyogVmVyc2lvbiBuYW1lLiAgKi8KLSAgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJkZWYgICp2ZF9uZXh0ZGVmOwkvKiB2ZF9uZXh0IGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkX2F1eHB0cjsJLyogdmRfYXV4IGFzIHBvaW50ZXIuICAqLwotICB1bnNpZ25lZCBpbnQJCSAgICAgICB2ZF9leHBfcmVmbm87CS8qIFVzZWQgYnkgdGhlIGxpbmtlci4gICovCi19IEVsZl9JbnRlcm5hbF9WZXJkZWY7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3ZlcmRlZiBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggewotICB1bnNpZ25lZCBsb25nIHZkYV9uYW1lOwkvKiBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nIHZkYV9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJkYXV4LiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgY29uc3QgY2hhciAqdmRhX25vZGVuYW1lOwkJCS8qIHZkYV9uYW1lIGFzIHBvaW50ZXIuICAqLwotICBzdHJ1Y3QgZWxmX2ludGVybmFsX3ZlcmRhdXggKnZkYV9uZXh0cHRyOwkvKiB2ZGFfbmV4dCBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1ZlcmRhdXg7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuZWVkIHsKLSAgdW5zaWduZWQgc2hvcnQgdm5fdmVyc2lvbjsJLyogVmVyc2lvbiBudW1iZXIgb2Ygc3RydWN0dXJlLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5fY250OwkvKiBOdW1iZXIgb2YgdmVybmF1eCBlbnRyaWVzLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5fZmlsZTsJLyogU3RyaW5nIHRhYmxlIG9mZnNldCBvZiBsaWJyYXJ5IG5hbWUuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9hdXg7CS8qIE9mZnNldCB0byB2ZXJuYXV4IGVudHJpZXMuICAqLwotICB1bnNpZ25lZCBsb25nCSB2bl9uZXh0OwkvKiBPZmZzZXQgdG8gbmV4dCB2ZXJuZWVkLiAgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIHNldCB1cCB3aGVuIEJGRCByZWFkcyBpbiB0aGUgc3RydWN0dXJlLiAgRklYTUU6Ci0gICAgIEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc3RvcmUgdGhlc2UgaW4gYSBkaWZmZXJlbnQgc3RydWN0dXJlLiAgKi8KLSAgYmZkCQkJICAgICAgKnZuX2JmZDsJCS8qIEJGRC4gICovCi0gIGNvbnN0IGNoYXIgICAgICAgICAgICAgICAgICAqdm5fZmlsZW5hbWU7CS8qIHZuX2ZpbGUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5fYXV4cHRyOwkvKiB2bl9hdXggYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmVlZCAqdm5fbmV4dHJlZjsJLyogdm5fbmV4dHJlZiBhcyBwb2ludGVyLiAgKi8KLX0gRWxmX0ludGVybmFsX1Zlcm5lZWQ7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGFwcGVhcnMgaW4gYSBTSFRfR05VX3Zlcm5lZWQgc2VjdGlvbi4gICovCi0KLXR5cGVkZWYgc3RydWN0IGVsZl9pbnRlcm5hbF92ZXJuYXV4IHsKLSAgdW5zaWduZWQgbG9uZwkgdm5hX2hhc2g7CS8qIEhhc2ggb2YgZGVwZW5kZW5jeSBuYW1lLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgdm5hX2ZsYWdzOwkvKiBGbGFncyAoVkVSX0ZMR18qKS4gICovCi0gIHVuc2lnbmVkIHNob3J0IHZuYV9vdGhlcjsJLyogVW51c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5hX25hbWU7CS8qIFN0cmluZyB0YWJsZSBvZmZzZXQgdG8gdmVyc2lvbiBuYW1lLiAgKi8KLSAgdW5zaWduZWQgbG9uZwkgdm5hX25leHQ7CS8qIE9mZnNldCB0byBuZXh0IHZlcm5hdXguICAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgc2V0IHVwIHdoZW4gQkZEIHJlYWRzIGluIHRoZSBzdHJ1Y3R1cmUuICBGSVhNRToKLSAgICAgSXQgd291bGQgYmUgY2xlYW5lciB0byBzdG9yZSB0aGVzZSBpbiBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuICAqLwotICBjb25zdCBjaGFyICAgICAgICAgICAgICAgICAgKnZuYV9ub2RlbmFtZTsJLyogdm5hX25hbWUgYXMgcG9pbnRlci4gICovCi0gIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVybmF1eCAqdm5hX25leHRwdHI7CS8qIHZuYV9uZXh0IGFzIHBvaW50ZXIuICAqLwotfSBFbGZfSW50ZXJuYWxfVmVybmF1eDsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBpbiBhIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24uICBUaGlzIGlzIG5vdCBhCi0gICBzdGFuZGFyZCBFTEYgc3RydWN0dXJlOyBFTEYganVzdCB1c2VzIEVsZjMyX0hhbGYuICAqLwotCi10eXBlZGVmIHN0cnVjdCBlbGZfaW50ZXJuYWxfdmVyc3ltIHsKLSAgdW5zaWduZWQgc2hvcnQgdnNfdmVyczsKLX0gRWxmX0ludGVybmFsX1ZlcnN5bTsKLQotLyogU3RydWN0dXJlIGZvciBzeW1pbmZvIHNlY3Rpb24uICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgc2hvcnQgaW50IAlzaV9ib3VuZHRvOwotICB1bnNpZ25lZCBzaG9ydCBpbnQJc2lfZmxhZ3M7Ci19IEVsZl9JbnRlcm5hbF9TeW1pbmZvOwotCi0KLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyZGVmIGVsZl9pbnRlcm5hbF92ZXJkZWYKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyZGF1eCBlbGZfaW50ZXJuYWxfdmVyZGF1eAotI2RlZmluZSBlbGY2NF9pbnRlcm5hbF92ZXJkYXV4IGVsZl9pbnRlcm5hbF92ZXJkYXV4Ci0jZGVmaW5lIGVsZjMyX2ludGVybmFsX3Zlcm5lZWQgZWxmX2ludGVybmFsX3Zlcm5lZWQKLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVybmVlZCBlbGZfaW50ZXJuYWxfdmVybmVlZAotI2RlZmluZSBlbGYzMl9pbnRlcm5hbF92ZXJuYXV4IGVsZl9pbnRlcm5hbF92ZXJuYXV4Ci0jZGVmaW5lIGVsZjY0X2ludGVybmFsX3Zlcm5hdXggZWxmX2ludGVybmFsX3Zlcm5hdXgKLSNkZWZpbmUgZWxmMzJfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KLSNkZWZpbmUgZWxmNjRfaW50ZXJuYWxfdmVyc3ltIGVsZl9pbnRlcm5hbF92ZXJzeW0KLQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJkZWYgRWxmX0ludGVybmFsX1ZlcmRlZgotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJkYXV4IEVsZl9JbnRlcm5hbF9WZXJkYXV4Ci0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1ZlcmRhdXggRWxmX0ludGVybmFsX1ZlcmRhdXgKLSNkZWZpbmUgRWxmMzJfSW50ZXJuYWxfVmVybmVlZCBFbGZfSW50ZXJuYWxfVmVybmVlZAotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJuZWVkIEVsZl9JbnRlcm5hbF9WZXJuZWVkCi0jZGVmaW5lIEVsZjMyX0ludGVybmFsX1Zlcm5hdXggRWxmX0ludGVybmFsX1Zlcm5hdXgKLSNkZWZpbmUgRWxmNjRfSW50ZXJuYWxfVmVybmF1eCBFbGZfSW50ZXJuYWxfVmVybmF1eAotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQotI2RlZmluZSBFbGY2NF9JbnRlcm5hbF9WZXJzeW0gRWxmX0ludGVybmFsX1ZlcnN5bQotI2RlZmluZSBFbGYzMl9JbnRlcm5hbF9TeW1pbmZvIEVsZl9JbnRlcm5hbF9TeW1pbmZvCi0jZGVmaW5lIEVsZjY0X0ludGVybmFsX1N5bWluZm8gRWxmX0ludGVybmFsX1N5bWluZm8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBob3cgc2VjdGlvbnMgc2hvdWxkIGJlIGFzc2lnbmVkCi0gICB0byBwcm9ncmFtIHNlZ21lbnRzLiAgKi8KLQotc3RydWN0IGVsZl9zZWdtZW50X21hcAotewotICAvKiBOZXh0IHByb2dyYW0gc2VnbWVudC4gICovCi0gIHN0cnVjdCBlbGZfc2VnbWVudF9tYXAgKm5leHQ7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCB0eXBlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBwX3R5cGU7Ci0gIC8qIFByb2dyYW0gc2VnbWVudCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgcF9mbGFnczsKLSAgLyogUHJvZ3JhbSBzZWdtZW50IHBoeXNpY2FsIGFkZHJlc3MuICAqLwotICBiZmRfdm1hIHBfcGFkZHI7Ci0gIC8qIFdoZXRoZXIgdGhlIHBfZmxhZ3MgZmllbGQgaXMgdmFsaWQ7IGlmIG5vdCwgdGhlIGZsYWdzIGFyZSBiYXNlZAotICAgICBvbiB0aGUgc2VjdGlvbiBmbGFncy4gICovCi0gIHVuc2lnbmVkIGludCBwX2ZsYWdzX3ZhbGlkIDogMTsKLSAgLyogV2hldGhlciB0aGUgcF9wYWRkciBmaWVsZCBpcyB2YWxpZDsgaWYgbm90LCB0aGUgcGh5c2ljYWwgYWRkcmVzcwotICAgICBpcyBiYXNlZCBvbiB0aGUgc2VjdGlvbiBsbWEgdmFsdWVzLiAgKi8KLSAgdW5zaWduZWQgaW50IHBfcGFkZHJfdmFsaWQgOiAxOwotICAvKiBXaGV0aGVyIHRoaXMgc2VnbWVudCBpbmNsdWRlcyB0aGUgZmlsZSBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfZmlsZWhkciA6IDE7Ci0gIC8qIFdoZXRoZXIgdGhpcyBzZWdtZW50IGluY2x1ZGVzIHRoZSBwcm9ncmFtIGhlYWRlcnMuICAqLwotICB1bnNpZ25lZCBpbnQgaW5jbHVkZXNfcGhkcnMgOiAxOwotICAvKiBOdW1iZXIgb2Ygc2VjdGlvbnMgKG1heSBiZSAwKS4gICovCi0gIHVuc2lnbmVkIGludCBjb3VudDsKLSAgLyogU2VjdGlvbnMuICBBY3R1YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGlzIGluIGNvdW50IGZpZWxkLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb25zWzFdOwotfTsKLQotI2VuZGlmIC8qIF9FTEZfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTMyci5oIGIvaW5jbHVkZS9lbGYvbTMyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTM3ZDEzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL20zMnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIE0zMlIgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9FTEZfTTMyUl9ICi0jZGVmaW5lIF9FTEZfTTMyUl9ICi0KLSNpbmNsdWRlICJlbGYvcmVsb2MtbWFjcm9zLmgiCi0KLS8qIFJlbG9jYXRpb25zLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tMzJyX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzE2LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8zMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMjQsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSXzEwX1BDUkVMLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl8xOF9QQ1JFTCwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfMjZfUENSRUwsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NMzJSX0hJMTZfVUxPLCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9ISTE2X1NMTywgOCkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfTE8xNiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfU0RBMTYsIDEwKQotICBSRUxPQ19OVU1CRVIgKFJfTTMyUl9HTlVfVlRJTkhFUklULCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX00zMlJfR05VX1ZURU5UUlksIDEyKQotICBFTVBUWV9SRUxPQyAgKFJfTTMyUl9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIFNtYWxsIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fTTMyUl9TQ09NTU9OCTB4ZmYwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBmbGFncy4gICovCi0KLS8qIFRoaXMgc2VjdGlvbiBjb250YWlucyBzdWZmaWNpZW50IHJlbG9jcyB0byBiZSByZWxheGVkLgotICAgV2hlbiByZWxheGluZywgZXZlbiByZWxvY3Mgb2YgYnJhbmNoIGluc3RydWN0aW9ucyB0aGUgYXNzZW1ibGVyIGNvdWxkCi0gICBjb21wbGV0ZSBtdXN0IGJlIHByZXNlbnQgYmVjYXVzZSByZWxheGluZyBtYXkgY2F1c2UgdGhlIGJyYW5jaCB0YXJnZXQgdG8KLSAgIG1vdmUuICAqLwotI2RlZmluZSBTSEZfTTMyUl9DQU5fUkVMQVgJMHgxMDAwMDAwMAotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZmxhZ3MgZm9yIHRoZSBFTEYgaGVhZGVyIGVfZmxhZ3MgZmllbGQuICAqLwotCi0vKiBUd28gYml0IG0zMnIgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfTTMyUl9BUkNICQkweDMwMDAwMDAwCi0KLS8qIG0zMnIgY29kZS4gICovCi0jZGVmaW5lIEVfTTMyUl9BUkNICQkweDAwMDAwMDAwCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbTY4ay5oIGIvaW5jbHVkZS9lbGYvbTY4ay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODcyZTBmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL202OGsuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qIE1DNjhrIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX002OEtfSAotI2RlZmluZSBfRUxGX002OEtfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9tNjhrX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfTk9ORSwgMCkJCS8qIE5vIHJlbG9jICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfMzIsIDEpCQkvKiBEaXJlY3QgMzIgYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLXzE2LCAyKQkJLyogRGlyZWN0IDE2IGJpdCAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S184LCAzKQkJLyogRGlyZWN0IDggYml0ICAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BDMzIsIDQpCQkvKiBQQyByZWxhdGl2ZSAzMiBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QQzE2LCA1KQkJLyogUEMgcmVsYXRpdmUgMTYgYml0ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUEM4LCA2KQkJLyogUEMgcmVsYXRpdmUgOCBiaXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QzMiwgNykJCS8qIDMyIGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QxNiwgOCkJCS8qIDE2IGJpdCBQQyByZWxhdGl2ZSBHT1QgZW50cnkgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1Q4LCA5KQkJLyogOCBiaXQgUEMgcmVsYXRpdmUgR09UIGVudHJ5ICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfR09UMzJPLCAxMCkJLyogMzIgYml0IEdPVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HT1QxNk8sIDExKQkvKiAxNiBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dPVDhPLCAxMikJLyogOCBiaXQgR09UIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDMyLCAxMykJLyogMzIgYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMTYsIDE0KQkvKiAxNiBiaXQgUEMgcmVsYXRpdmUgUExUIGFkZHJlc3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQ4LCAxNSkJCS8qIDggYml0IFBDIHJlbGF0aXZlIFBMVCBhZGRyZXNzICovCi0gIFJFTE9DX05VTUJFUiAoUl82OEtfUExUMzJPLCAxNikJLyogMzIgYml0IFBMVCBvZmZzZXQgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19QTFQxNk8sIDE3KQkvKiAxNiBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1BMVDhPLCAxOCkJLyogOCBiaXQgUExUIG9mZnNldCAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0NPUFksIDE5KQkJLyogQ29weSBzeW1ib2wgYXQgcnVudGltZSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0dMT0JfREFULCAyMCkJLyogQ3JlYXRlIEdPVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX0pNUF9TTE9ULCAyMSkJLyogQ3JlYXRlIFBMVCBlbnRyeSAqLwotICBSRUxPQ19OVU1CRVIgKFJfNjhLX1JFTEFUSVZFLCAyMikJLyogQWRqdXN0IGJ5IHByb2dyYW0gYmFzZSAqLwotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTlVfVlRJTkhFUklULCAyMykKLSAgUkVMT0NfTlVNQkVSIChSXzY4S19HTlVfVlRFTlRSWSwgMjQpCi0gIEVNUFRZX1JFTE9DICAoUl82OEtfbWF4KSAgIAotRU5EX1JFTE9DX05VTUJFUlMKLQotI2VuZGlmCi0KLSNkZWZpbmUgRUZfQ1BVMzIgICAgMHgwMDgxMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbWNvcmUuaCBiL2luY2x1ZGUvZWxmL21jb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGE5M2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvbWNvcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qIE1vdG9yb2xsYSBNQ29yZSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNQ29yZSBFTEYgQUJJLiAqLwotI2lmbmRlZiBfRUxGX01PUkVfSAotI2RlZmluZSBfRUxGX01PUkVfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbWNvcmVfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9BRERSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTThCWTQsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9QQ1JFTElNTTExQlkyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUxJTU00QlkyLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUENSRUwzMiwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX1BDUkVMSlNSX0lNTTExQlkyLCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfR05VX1ZUSU5IRVJJVCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dOVV9WVEVOVFJZLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTUNPUkVfUkVMQVRJVkUsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9NQ09SRV9DT1BZLCAxMCkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0dMT0JfREFULCAxMSkKLSAgUkVMT0NfTlVNQkVSIChSX01DT1JFX0pVTVBfU0xPVCwgMTIpCi0gIEVNUFRZX1JFTE9DICAoUl9NQ09SRV9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0vKiBTZWN0aW9uIEF0dHJpYnV0ZXMuICAqLwotI2RlZmluZSBTSEZfTUNPUkVfTk9SRUFECTB4ODAwMDAwMDAKLQotI2VuZGlmIC8qIF9FTEZfTUNPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbWlwcy5oIGIvaW5jbHVkZS9lbGYvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNhY2JlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5NCArMCwwIEBACi0vKiBNSVBTIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCA8aWFuQGN5Z251cy5jb20+LCBmcm9tCi0gICBpbmZvcm1hdGlvbiBpbiB0aGUgU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgTUlQUwotICAgUHJvY2Vzc29yIFN1cHBsZW1lbnQuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNSVBTIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX01JUFNfSAotI2RlZmluZSBfRUxGX01JUFNfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9taXBzX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTXzE2LCAxKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU18zMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUkVMMzIsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTXzI2LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISTE2LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19MTzE2LCA2KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HUFJFTDE2LCA3KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19MSVRFUkFMLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1QxNiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfUEMxNiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0NBTEwxNiwgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dQUkVMMzIsIDEyKQotICAvKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZGVmaW5lZCBvbiBJcml4LCBhbHRob3VnaCB0aGV5IGFyZSBub3QKLSAgICAgaW4gdGhlIE1JUFMgRUxGIEFCSS4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1VOVVNFRDEsIDEzKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19VTlVTRUQyLCAxNCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfVU5VU0VEMywgMTUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NISUZUNSwgMTYpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NISUZUNiwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTXzY0LCAxOCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX0RJU1AsIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfUEFHRSwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dPVF9PRlNULCAyMSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR09UX0hJMTYsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19HT1RfTE8xNiwgMjMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1NVQiwgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0lOU0VSVF9BLCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfSU5TRVJUX0IsIDI2KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ERUxFVEUsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISUdIRVIsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19ISUdIRVNULCAyOSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfQ0FMTF9ISTE2LCAzMCkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfQ0FMTF9MTzE2LCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfU0NOX0RJU1AsIDMyKQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19SRUwxNiwgMzMpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0FERF9JTU1FRElBVEUsIDM0KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19QSlVNUCwgMzUpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX1JFTEdPVCwgMzYpCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0pBTFIsIDM3KQotICBSRUxPQ19OVU1CRVIgKFJfTUlQU19tYXgsIDM4KQotICAvKiBUaGVzZSByZWxvY3MgYXJlIHVzZWQgZm9yIHRoZSBtaXBzMTYuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfTUlQUzE2XzI2LCAxMDApCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTMTZfR1BSRUwsIDEwMSkKLSAgLyogVGhlc2UgYXJlIEdOVSBleHRlbnNpb25zIHRvIGVuYWJsZSBDKysgdnRhYmxlIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9NSVBTX0dOVV9WVElOSEVSSVQsIDI1MykKLSAgUkVMT0NfTlVNQkVSIChSX01JUFNfR05VX1ZURU5UUlksIDI1NCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEF0IGxlYXN0IG9uZSAubm9yZW9yZGVyIGRpcmVjdGl2ZSBhcHBlYXJzIGluIHRoZSBzb3VyY2UuICAqLwotI2RlZmluZSBFRl9NSVBTX05PUkVPUkRFUgkweDAwMDAwMDAxCi0KLS8qIEZpbGUgY29udGFpbnMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gICovCi0jZGVmaW5lIEVGX01JUFNfUElDCQkweDAwMDAwMDAyCi0KLS8qIENvZGUgaW4gZmlsZSB1c2VzIHRoZSBzdGFuZGFyZCBjYWxsaW5nIHNlcXVlbmNlIGZvciBjYWxsaW5nCi0gICBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlLiAgKi8KLSNkZWZpbmUgRUZfTUlQU19DUElDCQkweDAwMDAwMDA0Ci0KLS8qIENvZGUgaW4gZmlsZSB1c2VzIG5ldyBBQkkgKC1uMzIgb24gSXJpeCA2KS4gICovCi0jZGVmaW5lIEVGX01JUFNfQUJJMgkJMHgwMDAwMDAyMAotCi0vKiBJbmRpY2F0ZXMgY29kZSBjb21waWxlZCBmb3IgYSA2NC1iaXQgbWFjaGluZSBpbiAzMi1iaXQgbW9kZS4gCi0gICAocmVncyBhcmUgMzItYml0cyB3aWRlLikgKi8KLSNkZWZpbmUgRUZfTUlQU18zMkJJVE1PREUgICAgICAgMHgwMDAwMDEwMAotCi0vKiBGb3VyIGJpdCBNSVBTIGFyY2hpdGVjdHVyZSBmaWVsZC4gICovCi0jZGVmaW5lIEVGX01JUFNfQVJDSAkJMHhmMDAwMDAwMAotCi0vKiAtbWlwczEgY29kZS4gICovCi0jZGVmaW5lIEVfTUlQU19BUkNIXzEJCTB4MDAwMDAwMDAKLQotLyogLW1pcHMyIGNvZGUuICAqLwotI2RlZmluZSBFX01JUFNfQVJDSF8yCQkweDEwMDAwMDAwCi0KLS8qIC1taXBzMyBjb2RlLiAgKi8KLSNkZWZpbmUgRV9NSVBTX0FSQ0hfMwkJMHgyMDAwMDAwMAotCi0vKiAtbWlwczQgY29kZS4gICovCi0jZGVmaW5lIEVfTUlQU19BUkNIXzQJCTB4MzAwMDAwMDAKLQotLyogVGhlIEFCSSBvZiB0aGUgZmlsZS4gIEFsc28gc2VlIEVGX01JUFNfQUJJMiBhYm92ZS4gKi8KLSNkZWZpbmUgRUZfTUlQU19BQkkJCTB4MDAwMEYwMDAKLQotLyogVGhlIG9yaWdpbmFsIG8zMiBhYmkuICovCi0jZGVmaW5lIEVfTUlQU19BQklfTzMyICAgICAgICAgIDB4MDAwMDEwMDAKLQotLyogTzMyIGV4dGVuZGVkIHRvIHdvcmsgb24gNjQgYml0IGFyY2hpdGVjdHVyZXMgKi8KLSNkZWZpbmUgRV9NSVBTX0FCSV9PNjQgICAgICAgICAgMHgwMDAwMjAwMAotCi0vKiBFQUJJIGluIDMyIGJpdCBtb2RlICovCi0jZGVmaW5lIEVfTUlQU19BQklfRUFCSTMyICAgICAgIDB4MDAwMDMwMDAKLQotLyogRUFCSSBpbiA2NCBiaXQgbW9kZSAqLwotI2RlZmluZSBFX01JUFNfQUJJX0VBQkk2NCAgICAgICAweDAwMDA0MDAwCi0KLQotLyogTWFjaGluZSB2YXJpYW50IGlmIHdlIGtub3cgaXQuICBUaGlzIGZpZWxkIHdhcyBpbnZlbnRlZCBhdCBDeWdudXMsCi0gICBidXQgaXQgaXMgaG9wZWQgdGhhdCBvdGhlciB2ZW5kb3JzIHdpbGwgYWRvcHQgaXQuICBJZiBzb21lIHN0YW5kYXJkCi0gICBpcyBkZXZlbG9wZWQsIHRoaXMgY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBmb2xsb3cgaXQuICovCi0KLSNkZWZpbmUgRUZfTUlQU19NQUNICQkweDAwRkYwMDAwCi0KLS8qIEN5Z251cyBpcyBjaG9vc2luZyB2YWx1ZXMgYmV0d2VlbiA4MCBhbmQgOUY7Ci0gICAwMCAtIDdGIHNob3VsZCBiZSBsZWZ0IGZvciBhIGZ1dHVyZSBzdGFuZGFyZDsKLSAgIHRoZSByZXN0IGFyZSBvcGVuLiAqLwotCi0jZGVmaW5lIEVfTUlQU19NQUNIXzM5MDAJMHgwMDgxMDAwMAotCi0jZGVmaW5lIEVfTUlQU19NQUNIXzQwMTAJMHgwMDgyMDAwMAotI2RlZmluZSBFX01JUFNfTUFDSF80MTAwCTB4MDA4MzAwMDAKLSNkZWZpbmUgRV9NSVBTX01BQ0hfNDY1MAkweDAwODUwMDAwCi0jZGVmaW5lIEVfTUlQU19NQUNIXzQxMTEJMHgwMDg4MDAwMAotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIERlZmluZWQgYW5kIGFsbG9jYXRlZCBjb21tb24gc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLiAgSWYKLSAgIHJlbG9jYXRlZCwgYWxpZ25tZW50IG11c3QgYmUgcHJlc2VydmVkLiAgKi8KLSNkZWZpbmUgU0hOX01JUFNfQUNPTU1PTgkweGZmMDAKLQotLyogRGVmaW5lZCBhbmQgYWxsb2NhdGVkIHRleHQgc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLgotICAgT2NjdXIgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIEFscGhhIE9TRi8xIGFuZCBJcml4IDUgZXhlY3V0YWJsZXMuICAqLwotI2RlZmluZSBTSE5fTUlQU19URVhUCQkweGZmMDEKLQotLyogRGVmaW5lZCBhbmQgYWxsb2NhdGVkIGRhdGEgc3ltYm9sLiAgVmFsdWUgaXMgdmlydHVhbCBhZGRyZXNzLgotICAgT2NjdXIgaW4gdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIG9mIEFscGhhIE9TRi8xIGFuZCBJcml4IDUgZXhlY3V0YWJsZXMuICAqLwotI2RlZmluZSBTSE5fTUlQU19EQVRBCQkweGZmMDIKLQotLyogU21hbGwgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9NSVBTX1NDT01NT04JMHhmZjAzCi0KLS8qIFNtYWxsIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fTUlQU19TVU5ERUZJTkVECTB4ZmYwNAotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMuICAqLwotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSBzZXQgb2YgZHluYW1pYyBzaGFyZWQgb2JqZWN0cyB1c2VkIHdoZW4KLSAgIHN0YXRpY2FsbHkgbGlua2luZy4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0xJQkxJU1QJMHg3MDAwMDAwMAotCi0vKiBJJ20gbm90IHN1cmUgd2hhdCB0aGlzIGlzLCBidXQgaXQncyB1c2VkIG9uIElyaXggNS4gICovCi0jZGVmaW5lIFNIVF9NSVBTX01TWU0JCTB4NzAwMDAwMDEKLQotLyogU2VjdGlvbiBjb250YWlucyBsaXN0IG9mIHN5bWJvbHMgd2hvc2UgZGVmaW5pdGlvbnMgY29uZmxpY3Qgd2l0aAotICAgc3ltYm9scyBkZWZpbmVkIGluIHNoYXJlZCBvYmplY3RzLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfQ09ORkxJQ1QJMHg3MDAwMDAwMgotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSBnbG9iYWwgcG9pbnRlciB0YWJsZS4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0dQVEFCCQkweDcwMDAwMDAzCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgbWljcm9jb2RlIGluZm9ybWF0aW9uLiAgVGhlIGV4YWN0IGZvcm1hdCBpcwotICAgdW5zcGVjaWZpZWQuICAqLwotI2RlZmluZSBTSFRfTUlQU19VQ09ERQkJMHg3MDAwMDAwNAotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHNvbWUgc29ydCBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBUaGUgZXhhY3QKLSAgIGZvcm1hdCBpcyB1bnNwZWNpZmllZC4gIEl0J3MgcHJvYmFibHkgRUNPRkYgc3ltYm9scy4gICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFQlVHCQkweDcwMDAwMDA1Ci0KLS8qIFNlY3Rpb24gY29udGFpbnMgcmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19SRUdJTkZPCTB4NzAwMDAwMDYKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1BBQ0tBR0UJMHg3MDAwMDAwNwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfUEFDS1NZTQkweDcwMDAwMDA4Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19SRUxECQkweDcwMDAwMDA5Ci0KLS8qIFNlY3Rpb24gY29udGFpbnMgaW50ZXJmYWNlIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgU0hUX01JUFNfSUZBQ0UJCTB4NzAwMDAwMGIKLQotLyogU2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbiBvZiBjb250ZW50cyBvZiBhbm90aGVyIHNlY3Rpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19DT05URU5UCTB4NzAwMDAwMGMKLQotLyogU2VjdGlvbiBjb250YWlucyBtaXNjZWxsYW5lb3VzIG9wdGlvbnMuICAqLwotI2RlZmluZSBTSFRfTUlQU19PUFRJT05TCTB4NzAwMDAwMGQKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1NIRFIJCTB4NzAwMDAwMTAKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0ZERVNDCQkweDcwMDAwMDExCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19FWFRTWU0JCTB4NzAwMDAwMTIKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTlNFCQkweDcwMDAwMDEzCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QREVTQwkJMHg3MDAwMDAxNAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfTE9DU1lNCQkweDcwMDAwMDE1Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19BVVhTWU0JCTB4NzAwMDAwMTYKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX09QVFNZTQkJMHg3MDAwMDAxNwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfTE9DU1RSCQkweDcwMDAwMDE4Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19MSU5FCQkweDcwMDAwMDE5Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19SRkRFU0MJCTB4NzAwMDAwMWEKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBU1lNCTB4NzAwMDAwMWIKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX0RFTFRBSU5TVAkweDcwMDAwMDFjCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19ERUxUQUNMQVNTCTB4NzAwMDAwMWQKLQotLyogRFdBUkYgZGVidWdnaW5nIHNlY3Rpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19EV0FSRgkJMHg3MDAwMDAxZQotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfREVMVEFERUNMCTB4NzAwMDAwMWYKLQotLyogTGlzdCBvZiBsaWJyYXJpZXMgdGhlIGJpbmFyeSBkZXBlbmRzIG9uLiAgSW5jbHVkZXMgYSB0aW1lIHN0YW1wLCB2ZXJzaW9uCi0gICBudW1iZXIuICAqLwotI2RlZmluZSBTSFRfTUlQU19TWU1CT0xfTElCCTB4NzAwMDAwMjAKLQotLyogRXZlbnRzIHNlY3Rpb24uICAqLwotI2RlZmluZSBTSFRfTUlQU19FVkVOVFMJCTB4NzAwMDAwMjEKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1RSQU5TTEFURQkweDcwMDAwMDIyCi0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19QSVhJRQkJMHg3MDAwMDAyMwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfWExBVEUJCTB4NzAwMDAwMjQKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1hMQVRFX0RFQlVHCTB4NzAwMDAwMjUKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1dISVJMCQkweDcwMDAwMDI2Ci0KLS8qID8/PyAqLwotI2RlZmluZSBTSFRfTUlQU19FSF9SRUdJT04JMHg3MDAwMDAyNwotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgU0hUX01JUFNfWExBVEVfT0xECTB4NzAwMDAwMjgKLQotLyogPz8/ICovCi0jZGVmaW5lIFNIVF9NSVBTX1BEUl9FWENFUFRJT04JMHg3MDAwMDAyOQotCi0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX0xJQkxJU1QgY29udGFpbnMgYW4gYXJyYXkgb2YgdGhlCi0gICBmb2xsb3dpbmcgc3RydWN0dXJlLiAgVGhlIHNoX2xpbmsgZmllbGQgaXMgdGhlIHNlY3Rpb24gaW5kZXggb2YgdGhlCi0gICBzdHJpbmcgdGFibGUuICBUaGUgc2hfaW5mbyBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlCi0gICBzZWN0aW9uLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFN0cmluZyB0YWJsZSBpbmRleCBmb3IgbmFtZSBvZiBzaGFyZWQgb2JqZWN0LiAgKi8KLSAgdW5zaWduZWQgbG9uZyBsX25hbWU7Ci0gIC8qIFRpbWUgc3RhbXAuICAqLwotICB1bnNpZ25lZCBsb25nIGxfdGltZV9zdGFtcDsKLSAgLyogQ2hlY2tzdW0gb2Ygc3ltYm9sIG5hbWVzIGFuZCBjb21tb24gc2l6ZXMuICAqLwotICB1bnNpZ25lZCBsb25nIGxfY2hlY2tzdW07Ci0gIC8qIFN0cmluZyB0YWJsZSBpbmRleCBmb3IgdmVyc2lvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF92ZXJzaW9uOwotICAvKiBGbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgbF9mbGFnczsKLX0gRWxmMzJfTGliOwotCi0vKiBUaGUgZXh0ZXJuYWwgdmVyc2lvbiBvZiBFbGYzMl9MaWIuICAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciBsX25hbWVbNF07Ci0gIHVuc2lnbmVkIGNoYXIgbF90aW1lX3N0YW1wWzRdOwotICB1bnNpZ25lZCBjaGFyIGxfY2hlY2tzdW1bNF07Ci0gIHVuc2lnbmVkIGNoYXIgbF92ZXJzaW9uWzRdOwotICB1bnNpZ25lZCBjaGFyIGxfZmxhZ3NbNF07Ci19IEVsZjMyX0V4dGVybmFsX0xpYjsKLQotLyogVGhlIGxfZmxhZ3MgZmllbGQgb2YgYW4gRWxmMzJfTGliIHN0cnVjdHVyZSBtYXkgY29udGFpbiB0aGUKLSAgIGZvbGxvd2luZyBmbGFncy4gICovCi0KLS8qIFJlcXVpcmUgYW4gZXhhY3QgbWF0Y2ggYXQgcnVudGltZS4gICovCi0jZGVmaW5lIExMX0VYQUNUX01BVENICQkweDAwMDAwMDAxCi0KLS8qIElnbm9yZSB2ZXJzaW9uIGluY29tcGF0aWJpbGl0aWVzIGF0IHJ1bnRpbWUuICAqLwotI2RlZmluZSBMTF9JR05PUkVfSU5UX1ZFUgkweDAwMDAwMDAyCi0KLS8qIFJlcXVpcmUgbWF0Y2hpbmcgbWlub3IgdmVyc2lvbiBudW1iZXIuICAqLwotI2RlZmluZSBMTF9SRVFVSVJFX01JTk9SCTB4MDAwMDAwMDQKLQotLyogPz8/ICovCi0jZGVmaW5lIExMX0VYUE9SVFMJCTB4MDAwMDAwMDgKLQotLyogRGVsYXkgbG9hZGluZyBvZiB0aGlzIGxpYnJhcnkgdW50aWwgcmVhbGx5IG5lZWRlZC4gICovCi0jZGVmaW5lIExMX0RFTEFZX0xPQUQJCTB4MDAwMDAwMTAKLQotLyogPz8/IERlbHRhIEMrKyBzdHVmZiA/Pz8gKi8KLSNkZWZpbmUgTExfREVMVEEJCTB4MDAwMDAwMjAKLQotCi0vKiBBIHNlY3Rpb24gb2YgdHlwZSBTSFRfTUlQU19DT05GTElDVCBpcyBhbiBhcnJheSBvZiBpbmRpY2VzIGludG8gdGhlCi0gICAuZHluc3ltIHNlY3Rpb24uICBFYWNoIGVsZW1lbnQgaGFzIHRoZSBmb2xsb3dpbmcgdHlwZS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgRWxmMzJfQ29uZmxpY3Q7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIgRWxmMzJfRXh0ZXJuYWxfQ29uZmxpY3RbNF07Ci0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBFbGY2NF9Db25mbGljdDsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciBFbGY2NF9FeHRlcm5hbF9Db25mbGljdFs4XTsKLQotLyogQSBzZWN0aW9uIG9mIHR5cGUgU0hUX01JUFNfR1BUQUIgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgaG93Ci0gICBtdWNoIEdQIHNwYWNlIHdvdWxkIGJlIHJlcXVpcmVkIGZvciBkaWZmZXJlbnQgLUcgYXJndW1lbnRzLiAgVGhpcwotICAgaW5mb3JtYXRpb24gaXMgb25seSB1c2VkIHNvIHRoYXQgdGhlIGxpbmtlciBjYW4gcHJvdmlkZSBpbmZvcm1hdGl2ZQotICAgc3VnZ2VzdGlvbnMgYXMgdG8gdGhlIGJlc3QgLUcgdmFsdWUgdG8gdXNlLiAgVGhlIHNoX2luZm8gZmllbGQgaXMKLSAgIHRoZSBpbmRleCBvZiB0aGUgc2VjdGlvbiBmb3Igd2hpY2ggdGhpcyBpbmZvcm1hdGlvbiBhcHBsaWVzLiAgVGhlCi0gICBjb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcmUgYW4gYXJyYXkgb2YgdGhlIGZvbGxvd2luZyB1bmlvbi4gIFRoZQotICAgZmlyc3QgZWxlbWVudCB1c2VzIHRoZSBndF9oZWFkZXIgZmllbGQuICBUaGUgcmVtYWluaW5nIGVsZW1lbnRzIHVzZQotICAgdGhlIGd0X2VudHJ5IGZpZWxkLiAgKi8KLXR5cGVkZWYgdW5pb24KLXsKLSAgc3RydWN0Ci0gICAgewotICAgICAgLyogLUcgdmFsdWUgYWN0dWFsbHkgdXNlZCBmb3IgdGhpcyBvYmplY3QgZmlsZS4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGd0X2N1cnJlbnRfZ192YWx1ZTsKLSAgICAgIC8qIFVudXNlZC4gICovCi0gICAgICB1bnNpZ25lZCBsb25nIGd0X3VudXNlZDsKLSAgICB9IGd0X2hlYWRlcjsKLSAgc3RydWN0Ci0gICAgewotICAgICAgLyogSWYgdGhpcyAtRyBhcmd1bWVudCBoYXMgYmVlbiB1c2VkLi4uICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBndF9nX3ZhbHVlOwotICAgICAgLyogLi4udGhpcyBtYW55IEdQIHNlY3Rpb24gYnl0ZXMgd291bGQgYmUgcmVxdWlyZWQuICAqLwotICAgICAgdW5zaWduZWQgbG9uZyBndF9ieXRlczsKLSAgICB9IGd0X2VudHJ5OwotfSBFbGYzMl9ncHRhYjsKLQotLyogVGhlIGV4dGVybmFsIHZlcnNpb24gb2YgRWxmMzJfZ3B0YWIuICAqLwotCi10eXBlZGVmIHVuaW9uCi17Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfY3VycmVudF9nX3ZhbHVlWzRdOwotICAgICAgdW5zaWduZWQgY2hhciBndF91bnVzZWRbNF07Ci0gICAgfSBndF9oZWFkZXI7Ci0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfZ192YWx1ZVs0XTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgZ3RfYnl0ZXNbNF07Ci0gICAgfSBndF9lbnRyeTsKLX0gRWxmMzJfRXh0ZXJuYWxfZ3B0YWI7Ci0KLS8qIEEgc2VjdGlvbiBvZiB0eXBlIFNIVF9NSVBTX1JFR0lORk8gY29udGFpbnMgdGhlIGZvbGxvd2luZwotICAgc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIE1hc2sgb2YgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyB1c2VkLiAgKi8KLSAgdW5zaWduZWQgbG9uZyByaV9ncHJtYXNrOwotICAvKiBNYXNrIG9mIGNvLXByb2Nlc3NvciByZWdpc3RlcnMgdXNlZC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcmlfY3BybWFza1s0XTsKLSAgLyogR1AgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IGZpbGUuICAqLwotICBsb25nIHJpX2dwX3ZhbHVlOwotfSBFbGYzMl9SZWdJbmZvOwotCi0vKiBUaGUgZXh0ZXJuYWwgdmVyc2lvbiBvZiB0aGUgRWxmX1JlZ0luZm8gc3RydWN0dXJlLiAgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGNoYXIgcmlfZ3BybWFza1s0XTsKLSAgdW5zaWduZWQgY2hhciByaV9jcHJtYXNrWzRdWzRdOwotICB1bnNpZ25lZCBjaGFyIHJpX2dwX3ZhbHVlWzRdOwotfSBFbGYzMl9FeHRlcm5hbF9SZWdJbmZvOwotCi0vKiBNSVBTIEVMRiAucmVnaW5mbyBzd2FwcGluZyByb3V0aW5lcy4gICovCi1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9faW4KLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKiwgRWxmMzJfUmVnSW5mbyAqKSk7Ci1leHRlcm4gdm9pZCBiZmRfbWlwc19lbGYzMl9zd2FwX3JlZ2luZm9fb3V0Ci0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGYzMl9SZWdJbmZvICosIEVsZjMyX0V4dGVybmFsX1JlZ0luZm8gKikpOwotDAotLyogUHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gZmxhZ3MuICAqLwotCi0vKiBUaGlzIHNlY3Rpb24gbXVzdCBiZSBpbiB0aGUgZ2xvYmFsIGRhdGEgYXJlYS4gICovCi0jZGVmaW5lIFNIRl9NSVBTX0dQUkVMCQkweDEwMDAwMDAwCi0KLS8qIFRoaXMgc2VjdGlvbiBzaG91bGQgYmUgbWVyZ2VkLiAgKi8KLSNkZWZpbmUgU0hGX01JUFNfTUVSR0UJCTB4MjAwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIDMyIGJpdCBhZGRyZXNzZXMuICAqLwotI2RlZmluZSBTSEZfTUlQU19BRERSMzIJCTB4NDAwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIGNvbnRhaW5zIDY0IGJpdCBhZGRyZXNzZXMuICAqLwotI2RlZmluZSBTSEZfTUlQU19BRERSNjQJCTB4ODAwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIG1heSBub3QgYmUgc3RyaXBwZWQuICAqLwotI2RlZmluZSBTSEZfTUlQU19OT1NUUklQCTB4MDgwMDAwMDAKLQotLyogVGhpcyBzZWN0aW9uIGlzIGxvY2FsIHRvIHRocmVhZHMuICAqLwotI2RlZmluZSBTSEZfTUlQU19MT0NBTAkJMHgwNDAwMDAwMAotCi0vKiBMaW5rZXIgc2hvdWxkIGdlbmVyYXRlIGltcGxpY2l0IHdlYWsgbmFtZXMgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0jZGVmaW5lIFNIRl9NSVBTX05BTUVTCQkweDAyMDAwMDAwCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgcHJvZ3JhbSBoZWFkZXIgdHlwZXMuICAqLwotCi0vKiBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4gIElkZW50aWZpZXMgb25lIC5yZWdpbmZvIHNlY3Rpb24uICAqLwotI2RlZmluZSBQVF9NSVBTX1JFR0lORk8JCTB4NzAwMDAwMDAKLQotLyogUnVudGltZSBwcm9jZWR1cmUgdGFibGUuICAqLwotI2RlZmluZSBQVF9NSVBTX1JUUFJPQwkJMHg3MDAwMDAwMQotCi0vKiBPcHRpb25zIChmb3Igd2hhdCA/Pz8pLiAgKi8KLSNkZWZpbmUgUFRfTUlQU19PUFRJT05TCQkweDcwMDAwMDAyCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgZHluYW1pYyBhcnJheSB0YWdzLiAgKi8KLQotLyogMzIgYml0IHZlcnNpb24gbnVtYmVyIGZvciBydW50aW1lIGxpbmtlciBpbnRlcmZhY2UuICAqLwotI2RlZmluZSBEVF9NSVBTX1JMRF9WRVJTSU9OCTB4NzAwMDAwMDEKLQotLyogVGltZSBzdGFtcC4gICovCi0jZGVmaW5lIERUX01JUFNfVElNRV9TVEFNUAkweDcwMDAwMDAyCi0KLS8qIENoZWNrc3VtIG9mIGV4dGVybmFsIHN0cmluZ3MgYW5kIGNvbW1vbiBzaXplcy4gICovCi0jZGVmaW5lIERUX01JUFNfSUNIRUNLU1VNCTB4NzAwMDAwMDMKLQotLyogSW5kZXggb2YgdmVyc2lvbiBzdHJpbmcgaW4gc3RyaW5nIHRhYmxlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19JVkVSU0lPTgkweDcwMDAwMDA0Ci0KLS8qIDMyIGJpdHMgb2YgZmxhZ3MuICAqLwotI2RlZmluZSBEVF9NSVBTX0ZMQUdTCQkweDcwMDAwMDA1Ci0KLS8qIEJhc2UgYWRkcmVzcyBvZiB0aGUgc2VnbWVudC4gICovCi0jZGVmaW5lIERUX01JUFNfQkFTRV9BRERSRVNTCTB4NzAwMDAwMDYKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfTVNZTQkJMHg3MDAwMDAwNwotCi0vKiBBZGRyZXNzIG9mIC5jb25mbGljdCBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19DT05GTElDVAkweDcwMDAwMDA4Ci0KLS8qIEFkZHJlc3Mgb2YgLmxpYmxpc3Qgc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfTElCTElTVAkJMHg3MDAwMDAwOQotCi0vKiBOdW1iZXIgb2YgbG9jYWwgZ2xvYmFsIG9mZnNldCB0YWJsZSBlbnRyaWVzLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19MT0NBTF9HT1ROTwkweDcwMDAwMDBhCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAuY29uZmxpY3Qgc2VjdGlvbi4gICovCi0jZGVmaW5lIERUX01JUFNfQ09ORkxJQ1ROTwkweDcwMDAwMDBiCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSAubGlibGlzdCBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19MSUJMSVNUTk8JMHg3MDAwMDAxMAotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgLmR5bnN5bSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19TWU1UQUJOTwkweDcwMDAwMDExCi0KLS8qIEluZGV4IG9mIGZpcnN0IGV4dGVybmFsIGR5bmFtaWMgc3ltYm9sIG5vdCByZWZlcmVuY2VkIGxvY2FsbHkuICAqLwotI2RlZmluZSBEVF9NSVBTX1VOUkVGRVhUTk8JMHg3MDAwMDAxMgotCi0vKiBJbmRleCBvZiBmaXJzdCBkeW5hbWljIHN5bWJvbCBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19HT1RTWU0JCTB4NzAwMDAwMTMKLQotLyogTnVtYmVyIG9mIHBhZ2UgdGFibGUgZW50cmllcyBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ISVBBR0VOTwkweDcwMDAwMDE0Ci0KLS8qIEFkZHJlc3Mgb2YgcnVuIHRpbWUgbG9hZGVyIG1hcCwgdXNlZCBmb3IgZGVidWdnaW5nLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19STERfTUFQCQkweDcwMDAwMDE2Ci0KLS8qIERlbHRhIEMrKyBjbGFzcyBkZWZpbml0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTUwkweDcwMDAwMDE3Ci0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfQ0xBU1MuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTX05PCTB4NzAwMDAwMTgKLQotLyogRGVsdGEgQysrIGNsYXNzIGluc3RhbmNlcy4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfSU5TVEFOQ0UJMHg3MDAwMDAxOQotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX0lOU1RBTkNFLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9JTlNUQU5DRV9OTwkweDcwMDAwMDFhCi0KLS8qIERlbHRhIHJlbG9jYXRpb25zLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9SRUxPQwkweDcwMDAwMDFiCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfUkVMT0MuICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX1JFTE9DX05PCTB4NzAwMDAwMWMKLQotLyogRGVsdGEgc3ltYm9scyB0aGF0IERlbHRhIHJlbG9jYXRpb25zIHJlZmVyIHRvLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9TWU0JMHg3MDAwMDAxZAotCi0vKiBOdW1iZXIgb2YgZW50cmllcyBpbiBEVF9NSVBTX0RFTFRBX1NZTS4gICovCi0jZGVmaW5lIERUX01JUFNfREVMVEFfU1lNX05PCTB4NzAwMDAwMWUKLQotLyogRGVsdGEgc3ltYm9scyB0aGF0IGhvbGQgY2xhc3MgZGVjbGFyYXRpb25zLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19ERUxUQV9DTEFTU1NZTQkweDcwMDAwMDIwCi0KLS8qIE51bWJlciBvZiBlbnRyaWVzIGluIERUX01JUFNfREVMVEFfQ0xBU1NTWU0uICAqLwotI2RlZmluZSBEVF9NSVBTX0RFTFRBX0NMQVNTU1lNX05PCTB4NzAwMDAwMjEKLQotLyogRmxhZ3MgaW5kaWNhdGluZyBpbmZvcm1hdGlvbiBhYm91dCBDKysgZmxhdm9yLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19DWFhfRkxBR1MJMHg3MDAwMDAyMgotCi0vKiBQaXhpZSBpbmZvcm1hdGlvbiAoPz8/KS4gICovCi0jZGVmaW5lIERUX01JUFNfUElYSUVfSU5JVAkweDcwMDAwMDIzCi0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX1NZTUJPTF9MSUIJMHg3MDAwMDAyNAotCi0vKiA/Pz8gKi8KLSNkZWZpbmUgRFRfTUlQU19MT0NBTFBBR0VfR09USURYCTB4NzAwMDAwMjUKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfTE9DQUxfR09USURYCTB4NzAwMDAwMjYKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfSElEREVOX0dPVElEWAkweDcwMDAwMDI3Ci0KLS8qID8/PyAqLwotI2RlZmluZSBEVF9NSVBTX1BST1RFQ1RFRF9HT1RJRFgJMHg3MDAwMDAyOAotCi0vKiBBZGRyZXNzIG9mIGAuTUlQUy5vcHRpb25zJy4gICovCi0jZGVmaW5lIERUX01JUFNfT1BUSU9OUwkJMHg3MDAwMDAyOQotCi0vKiBBZGRyZXNzIG9mIGAuaW50ZXJmYWNlJy4gICovCi0jZGVmaW5lIERUX01JUFNfSU5URVJGQUNFCTB4NzAwMDAwMmEKLQotLyogPz8/ICovCi0jZGVmaW5lIERUX01JUFNfRFlOU1RSX0FMSUdOCTB4NzAwMDAwMmIKLQotLyogU2l6ZSBvZiB0aGUgLmludGVyZmFjZSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19JTlRFUkZBQ0VfU0laRQkweDcwMDAwMDJjCi0KLS8qIFNpemUgb2YgcmxkX3RleHRfcmVzb2x2ZSBmdW5jdGlvbiBzdG9yZWQgaW4gdGhlIEdPVC4gICovCi0jZGVmaW5lIERUX01JUFNfUkxEX1RFWFRfUkVTT0xWRV9BRERSCTB4NzAwMDAwMmQKLQotLyogRGVmYXVsdCBzdWZmaXggb2YgRFNPIHRvIGJlIGFkZGVkIGJ5IHJsZCBvbiBkbG9wZW4oKSBjYWxscy4gICovCi0jZGVmaW5lIERUX01JUFNfUEVSRl9TVUZGSVgJMHg3MDAwMDAyZQotCi0vKiBTaXplIG9mIGNvbXBhY3QgcmVsb2NhdGlvbiBzZWN0aW9uIChPMzIpLiAgKi8KLSNkZWZpbmUgRFRfTUlQU19DT01QQUNUX1NJWkUJMHg3MDAwMDAyZgotCi0vKiBHUCB2YWx1ZSBmb3IgYXV4aWxpYXJ5IEdPVHMuICAqLwotI2RlZmluZSBEVF9NSVBTX0dQX1ZBTFVFCTB4NzAwMDAwMzAKLQotLyogQWRkcmVzcyBvZiBhdXhpbGlhcnkgLmR5bmFtaWMuICAqLwotI2RlZmluZSBEVF9NSVBTX0FVWF9EWU5BTUlDCTB4NzAwMDAwMzEKLQwKLS8qIEZsYWdzIHdoaWNoIG1heSBhcHBlYXIgaW4gYSBEVF9NSVBTX0ZMQUdTIGVudHJ5LiAgKi8KLQotLyogTm8gZmxhZ3MuICAqLwotI2RlZmluZSBSSEZfTk9ORQkJMHgwMDAwMDAwMAotCi0vKiBVc2VzIHNob3J0Y3V0IHBvaW50ZXJzLiAgKi8KLSNkZWZpbmUgUkhGX1FVSUNLU1RBUlQJCTB4MDAwMDAwMDEKLQotLyogSGFzaCBzaXplIGlzIG5vdCBhIHBvd2VyIG9mIHR3by4gICovCi0jZGVmaW5lIFJIRl9OT1RQT1QJCTB4MDAwMDAwMDIKLQotLyogSWdub3JlIExEX0xJQlJBUllfUEFUSC4gICovCi0jZGVmaW5lIFJIU19OT19MSUJSQVJZX1JFUExBQ0VNRU5UIFwKLQkJCQkweDAwMDAwMDA0Ci0KLSNkZWZpbmUgUkhGX05PX01PVkUJCSAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgUkhGX1NHSV9PTkxZCQkgICAweDAwMDAwMDEwCi0jZGVmaW5lIFJIRl9HVUFSQU5URUVfSU5JVAkgICAweDAwMDAwMDIwCi0jZGVmaW5lIFJIRl9ERUxUQV9DX1BMVVNfUExVUwkgICAweDAwMDAwMDQwCi0jZGVmaW5lIFJIRl9HVUFSQU5URUVfU1RBUlRfSU5JVCAgIDB4MDAwMDAwODAKLSNkZWZpbmUgUkhGX1BJWElFCQkgICAweDAwMDAwMTAwCi0jZGVmaW5lIFJIRl9ERUZBVUxUX0RFTEFZX0xPQUQJICAgMHgwMDAwMDIwMAotI2RlZmluZSBSSEZfUkVRVUlDS1NUQVJUCSAgIDB4MDAwMDA0MDAKLSNkZWZpbmUgUkhGX1JFUVVJQ0tTVEFSVEVECSAgIDB4MDAwMDA4MDAKLSNkZWZpbmUgUkhGX0NPUkQJCSAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgUkhGX05PX1VOUkVTX1VOREVGCSAgIDB4MDAwMDIwMDAKLSNkZWZpbmUgUkhGX1JMRF9PUkRFUl9TQUZFCSAgIDB4MDAwMDQwMDAKLQwKLS8qIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFRoZXNlCi0gICBhcmUgdXNlZCBpbiBhbiBJcml4IDUgZHluYW1pYyBzeW1ib2wgdGFibGUuICAqLwotCi0jZGVmaW5lIFNUT19ERUZBVUxUCQkweDAwCi0jZGVmaW5lIFNUT19JTlRFUk5BTAkJMHgwMQotI2RlZmluZSBTVE9fSElEREVOCQkweDAyCi0jZGVmaW5lIFNUT19QUk9URUNURUQJCTB4MDMKLQotLyogVGhpcyB2YWx1ZSBpcyB1c2VkIGZvciBhIG1pcHMxNiAudGV4dCBzeW1ib2wuICAqLwotI2RlZmluZSBTVE9fTUlQUzE2CQkweGYwCi0MCi0vKiBUaGUgNjQtYml0IE1JUFMgRUxGIEFCSSB1c2VzIGFuIHVudXN1YWwgcmVsb2MgZm9ybWF0LiAgRWFjaAotICAgcmVsb2NhdGlvbiBlbnRyeSBzcGVjaWZpZXMgdXAgdG8gdGhyZWUgYWN0dWFsIHJlbG9jYXRpb25zLCBhbGwgYXQKLSAgIHRoZSBzYW1lIGFkZHJlc3MuICBUaGUgZmlyc3QgcmVsb2NhdGlvbiB3aGljaCByZXF1aXJlZCBhIHN5bWJvbAotICAgdXNlcyB0aGUgc3ltYm9sIGluIHRoZSByX3N5bSBmaWVsZC4gIFRoZSBzZWNvbmQgcmVsb2NhdGlvbiB3aGljaAotICAgcmVxdWlyZXMgYSBzeW1ib2wgdXNlcyB0aGUgc3ltYm9sIGluIHRoZSByX3NzeW0gZmllbGQuICBJZiBhbGwKLSAgIHRocmVlIHJlbG9jYXRpb25zIHJlcXVpcmUgYSBzeW1ib2wsIHRoZSB0aGlyZCBvbmUgdXNlcyBhIHplcm8KLSAgIHZhbHVlLiAgKi8KLQotLyogQW4gZW50cnkgaW4gYSA2NCBiaXQgU0hUX1JFTCBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX29mZnNldFs4XTsKLSAgLyogU3ltYm9sIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3N5bVs0XTsKLSAgLyogU3BlY2lhbCBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3N5bVsxXTsKLSAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlM1sxXTsKLSAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTJbMV07Ci0gIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsKLX0gRWxmNjRfTWlwc19FeHRlcm5hbF9SZWw7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIEFkZHJlc3Mgb2YgcmVsb2NhdGlvbi4gICovCi0gIGJmZF92bWEgcl9vZmZzZXQ7Ci0gIC8qIFN5bWJvbCBpbmRleC4gICovCi0gIHVuc2lnbmVkIGxvbmcgcl9zeW07Ci0gIC8qIFNwZWNpYWwgc3ltYm9sLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3NzeW07Ci0gIC8qIFRoaXJkIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTM7Ci0gIC8qIFNlY29uZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUyOwotICAvKiBGaXJzdCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGU7Ci19IEVsZjY0X01pcHNfSW50ZXJuYWxfUmVsOwotCi0vKiBBbiBlbnRyeSBpbiBhIDY0IGJpdCBTSFRfUkVMQSBzZWN0aW9uLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogQWRkcmVzcyBvZiByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX29mZnNldFs4XTsKLSAgLyogU3ltYm9sIGluZGV4LiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3N5bVs0XTsKLSAgLyogU3BlY2lhbCBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBjaGFyIHJfc3N5bVsxXTsKLSAgLyogVGhpcmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlM1sxXTsKLSAgLyogU2Vjb25kIHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZTJbMV07Ci0gIC8qIEZpcnN0IHJlbG9jYXRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHJfdHlwZVsxXTsKLSAgLyogQWRkZW5kLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX2FkZGVuZFs4XTsKLX0gRWxmNjRfTWlwc19FeHRlcm5hbF9SZWxhOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBBZGRyZXNzIG9mIHJlbG9jYXRpb24uICAqLwotICBiZmRfdm1hIHJfb2Zmc2V0OwotICAvKiBTeW1ib2wgaW5kZXguICAqLwotICB1bnNpZ25lZCBsb25nIHJfc3ltOwotICAvKiBTcGVjaWFsIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl9zc3ltOwotICAvKiBUaGlyZCByZWxvY2F0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciByX3R5cGUzOwotICAvKiBTZWNvbmQgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlMjsKLSAgLyogRmlyc3QgcmVsb2NhdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIgcl90eXBlOwotICAvKiBBZGRlbmQuICAqLwotICBiZmRfc2lnbmVkX3ZtYSByX2FkZGVuZDsKLX0gRWxmNjRfTWlwc19JbnRlcm5hbF9SZWxhOwotCi0vKiBWYWx1ZXMgZm91bmQgaW4gdGhlIHJfc3N5bSBmaWVsZCBvZiBhIHJlbG9jYXRpb24gZW50cnkuICAqLwotCi0vKiBObyByZWxvY2F0aW9uLiAgKi8KLSNkZWZpbmUgUlNTX1VOREVGCTAKLQotLyogVmFsdWUgb2YgR1AuICAqLwotI2RlZmluZSBSU1NfR1AJCTEKLQotLyogVmFsdWUgb2YgR1AgaW4gb2JqZWN0IGJlaW5nIHJlbG9jYXRlZC4gICovCi0jZGVmaW5lIFJTU19HUDAJCTIKLQotLyogQWRkcmVzcyBvZiBsb2NhdGlvbiBiZWluZyByZWxvY2F0ZWQuICAqLwotI2RlZmluZSBSU1NfTE9DCQkzCi0MCi0vKiBBIFNIVF9NSVBTX09QVElPTlMgc2VjdGlvbiBjb250YWlucyBhIHNlcmllcyBvZiBvcHRpb25zLCBlYWNoIG9mCi0gICB3aGljaCBzdGFydHMgd2l0aCB0aGlzIGhlYWRlci4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFR5cGUgb2Ygb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBraW5kWzFdOwotICAvKiBTaXplIG9mIG9wdGlvbiBkZXNjcmlwdG9yLCBpbmNsdWRpbmcgaGVhZGVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzaXplWzFdOwotICAvKiBTZWN0aW9uIGluZGV4IG9mIGFmZmVjdGVkIHNlY3Rpb24sIG9yIDAgZm9yIGdsb2JhbCBvcHRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIHNlY3Rpb25bMl07Ci0gIC8qIEluZm9ybWF0aW9uIHNwZWNpZmljIHRvIHRoaXMga2luZCBvZiBvcHRpb24uICAqLwotICB1bnNpZ25lZCBjaGFyIGluZm9bNF07Ci19IEVsZl9FeHRlcm5hbF9PcHRpb25zOwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUeXBlIG9mIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGNoYXIga2luZDsKLSAgLyogU2l6ZSBvZiBvcHRpb24gZGVzY3JpcHRvciwgaW5jbHVkaW5nIGhlYWRlci4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2l6ZTsKLSAgLyogU2VjdGlvbiBpbmRleCBvZiBhZmZlY3RlZCBzZWN0aW9uLCBvciAwIGZvciBnbG9iYWwgb3B0aW9uLiAgKi8KLSAgdW5zaWduZWQgc2hvcnQgc2VjdGlvbjsKLSAgLyogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhpcyBraW5kIG9mIG9wdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgaW5mbzsKLX0gRWxmX0ludGVybmFsX09wdGlvbnM7Ci0KLS8qIE1JUFMgRUxGIG9wdGlvbiBoZWFkZXIgc3dhcHBpbmcgcm91dGluZXMuICAqLwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19pbgotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmX0V4dGVybmFsX09wdGlvbnMgKiwgRWxmX0ludGVybmFsX09wdGlvbnMgKikpOwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmX3N3YXBfb3B0aW9uc19vdXQKLSAgUEFSQU1TICgoYmZkICosIGNvbnN0IEVsZl9JbnRlcm5hbF9PcHRpb25zICosIEVsZl9FeHRlcm5hbF9PcHRpb25zICopKTsKLQotLyogVmFsdWVzIHdoaWNoIG1heSBhcHBlYXIgaW4gdGhlIGtpbmQgZmllbGQgb2YgYW4gRWxmX09wdGlvbnMKLSAgIHN0cnVjdHVyZS4gICovCi0KLS8qIFVuZGVmaW5lZC4gICovCi0jZGVmaW5lIE9ES19OVUxMCTAKLQotLyogUmVnaXN0ZXIgdXNhZ2UgYW5kIEdQIHZhbHVlLiAgKi8KLSNkZWZpbmUgT0RLX1JFR0lORk8JMQotCi0vKiBFeGNlcHRpb24gcHJvY2Vzc2luZyBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIE9ES19FWENFUFRJT05TCTIKLQotLyogU2VjdGlvbiBwYWRkaW5nIGluZm9ybWF0aW9uLiAgKi8KLSNkZWZpbmUgT0RLX1BBRAkJMwotCi0vKiBIYXJkd2FyZSB3b3JrYXJvdW5kcyBwZXJmb3JtZWQuICAqLwotI2RlZmluZSBPREtfSFdQQVRDSAk0Ci0KLS8qIEZpbGwgdmFsdWUgdXNlZCBieSB0aGUgbGlua2VyLiAgKi8KLSNkZWZpbmUgT0RLX0ZJTEwJNQotCi0vKiBSZXNlcnZlZCBzcGFjZSBmb3IgZGVza3RvcCB0b29scy4gICovCi0jZGVmaW5lIE9ES19UQUdTCTYKLQotLyogSGFyZHdhcmUgd29ya2Fyb3VuZHMsIEFORCBiaXRzIHdoZW4gbWVyZ2luZy4gICovCi0jZGVmaW5lIE9ES19IV0FORAk3Ci0KLS8qIEhhcmR3YXJlIHdvcmthcm91bmRzLCBPUiBiaXRzIHdoZW4gbWVyZ2luZy4gICovCi0jZGVmaW5lIE9ES19IV09SCTgKLQotLyogR1AgZ3JvdXAgdG8gdXNlIGZvciB0ZXh0L2RhdGEgc2VjdGlvbnMuICAqLwotI2RlZmluZSBPREtfR1BfR1JPVVAJOQotCi0vKiBJRCBpbmZvcm1hdGlvbi4gICovCi0jZGVmaW5lIE9ES19JREVOVAkxMAotCi0vKiBJbiB0aGUgMzIgYml0IEFCSSwgYW4gT0RLX1JFR0lORk8gb3B0aW9uIGlzIGp1c3QgYSBFbGYzMl9SZWdJbmZvCi0gICBzdHJ1Y3R1cmUuICBJbiB0aGUgNjQgYml0IEFCSSwgaXQgaXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuICBUaGUKLSAgIGluZm8gZmllbGQgb2YgdGhlIG9wdGlvbnMgaGVhZGVyIGlzIG5vdCB1c2VkLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTWFzayBvZiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBjaGFyIHJpX2dwcm1hc2tbNF07Ci0gIC8qIFBhZGRpbmcuICAqLwotICB1bnNpZ25lZCBjaGFyIHJpX3BhZFs0XTsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBjaGFyIHJpX2Nwcm1hc2tbNF1bNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgdW5zaWduZWQgY2hhciByaV9ncF92YWx1ZVs4XTsKLX0gRWxmNjRfRXh0ZXJuYWxfUmVnSW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogTWFzayBvZiBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2dwcm1hc2s7Ci0gIC8qIFBhZGRpbmcuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX3BhZDsKLSAgLyogTWFzayBvZiBjby1wcm9jZXNzb3IgcmVnaXN0ZXJzIHVzZWQuICAqLwotICB1bnNpZ25lZCBsb25nIHJpX2Nwcm1hc2tbNF07Ci0gIC8qIEdQIHJlZ2lzdGVyIHZhbHVlIGZvciB0aGlzIG9iamVjdCBmaWxlLiAgKi8KLSAgYmZkX3ZtYSByaV9ncF92YWx1ZTsKLX0gRWxmNjRfSW50ZXJuYWxfUmVnSW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogVGhlIGhhc2ggdmFsdWUgY29tcHV0ZWQgZnJvbSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZwotICAgICBkeW5hbWljIHN5bWJvbC4gICovCi0gIHVuc2lnbmVkIGNoYXIgbXNfaGFzaF92YWx1ZVs0XTsKLSAgLyogQ29udGFpbnMgYm90aCB0aGUgZHluYW1pYyByZWxvY2F0aW9uIGluZGV4IGFuZCB0aGUgc3ltYm9sIGZsYWdzCi0gICAgIGZpZWxkLiAgVGhlIG1hY3JvcyBFTEYzMl9NU19SRUxfSU5ERVggYW5kIEVMRjMyX01TX0ZMQUdTIGFyZSB1c2VkCi0gICAgIHRvIGFjY2VzcyB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMuICBUaGUgZHluYW1pYyByZWxvY2F0aW9uIGluZGV4Ci0gICAgIGlkZW50aWZpZXMgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSAucmVsLmR5biBzZWN0aW9uIHRoYXQKLSAgICAgcmVmZXJlbmNlcyB0aGUgZHluYW1pYyBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGlzIG1zeW0gZW50cnkuCi0gICAgIElmIHRoZSBpbmRleCBpcyAwLCBubyBkeW5hbWljIHJlbG9jYXRpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0gICAgIHN5bWJvbC4gIFRoZSBzeW1ib2wgZmxhZ3MgZmllbGQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuICAqLwotICB1bnNpZ25lZCBjaGFyIG1zX2luZm9bNF07Ci19IEVsZjMyX0V4dGVybmFsX01zeW07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRoZSBoYXNoIHZhbHVlIGNvbXB1dGVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICAgZHluYW1pYyBzeW1ib2wuICAqLwotICB1bnNpZ25lZCBsb25nIG1zX2hhc2hfdmFsdWU7Ci0gIC8qIENvbnRhaW5zIGJvdGggdGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmRleCBhbmQgdGhlIHN5bWJvbCBmbGFncwotICAgICBmaWVsZC4gIFRoZSBtYWNyb3MgRUxGMzJfTVNfUkVMX0lOREVYIGFuZCBFTEYzMl9NU19GTEFHUyBhcmUgdXNlZAotICAgICB0byBhY2Nlc3MgdGhlIGluZGl2aWR1YWwgdmFsdWVzLiAgVGhlIGR5bmFtaWMgcmVsb2NhdGlvbiBpbmRleAotICAgICBpZGVudGlmaWVzIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgLnJlbC5keW4gc2VjdGlvbiB0aGF0Ci0gICAgIHJlZmVyZW5jZXMgdGhlIGR5bmFtaWMgc3ltYm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBtc3ltIGVudHJ5LgotICAgICBJZiB0aGUgaW5kZXggaXMgMCwgbm8gZHluYW1pYyByZWxvY2F0aW9ucyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZQotICAgICBzeW1ib2wuICBUaGUgc3ltYm9sIGZsYWdzIGZpZWxkIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtc19pbmZvOwotfSBFbGYzMl9JbnRlcm5hbF9Nc3ltOwotCi0jZGVmaW5lIEVMRjMyX01TX1JFTF9JTkRFWChpKSAoKGkpID4+IDgpCi0jZGVmaW5lIEVMRjMyX01TX0ZMQUdTKGkpICAgICAoaSkgJiAweGZmKQotI2RlZmluZSBFTEYzMl9NU19JTkZPKHIsIGYpICAgKCgocikgPDwgOCkgKyAoKGYpICYgMHhmZikpCi0KLS8qIE1JUFMgRUxGIHJlZ2luZm8gc3dhcHBpbmcgcm91dGluZXMuICAqLwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX2luCi0gIFBBUkFNUyAoKGJmZCAqLCBjb25zdCBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICosIEVsZjY0X0ludGVybmFsX1JlZ0luZm8gKikpOwotZXh0ZXJuIHZvaWQgYmZkX21pcHNfZWxmNjRfc3dhcF9yZWdpbmZvX291dAotICBQQVJBTVMgKChiZmQgKiwgY29uc3QgRWxmNjRfSW50ZXJuYWxfUmVnSW5mbyAqLCBFbGY2NF9FeHRlcm5hbF9SZWdJbmZvICopKTsKLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmsgb2YgYW4gT0RLX0VYQ0VQVElPTlMgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9FWF9GUFVfTUlOCTB4MWYJLyogRlBFcyB3aGljaCBtdXN0IGJlIGVuYWJsZWQuICAqLwotI2RlZmluZSBPRVhfRlBVX01BWAkweDFmMDAJLyogRlBFcyB3aGljaCBtYXkgYmUgZW5hYmxlZC4gICovCi0jZGVmaW5lIE9FWF9QQUdFMAkweDEwMDAwCS8qIFBhZ2UgemVybyBtdXN0IGJlIG1hcHBlZC4gICovCi0jZGVmaW5lIE9FWF9TTU0JCTB4MjAwMDAJLyogRm9yY2Ugc2VxdWVudGlhbCBtZW1vcnkgbW9kZS4gICovCi0jZGVmaW5lIE9FWF9GUERCVUcJMHg0MDAwMAkvKiBGb3JjZSBmbG9hdGluZy1wb2ludCBkZWJ1ZyBtb2RlLiAgKi8KLSNkZWZpbmUgT0VYX0RJU01JU1MJMHg4MDAwMAkvKiBEaXNtaXNzIGludmFsaWQgYWRkcmVzcyBmYXVsdHMuICAqLwotCi0vKiBNYXNrcyBvZiB0aGUgRlAgZXhjZXB0aW9ucyBmb3IgT0VYX0ZQVV9NSU4gYW5kIE9FWF9GUFVfTUFYLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9JTlZBTAkweDEwCS8qIEludmFsaWQgb3BlcmF0aW9uIGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfRElWMAkweDA4CS8qIERpdmlzaW9uIGJ5IHplcm8gZXhjZXB0aW9uLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9PRkxPCTB4MDQJLyogT3ZlcmZsb3cgZXhjZXB0aW9uLiAgKi8KLSNkZWZpbmUgT0VYX0ZQVV9VRkxPCTB4MDIJLyogVW5kZXJmbG93IGV4Y2VwdGlvbi4gICovCi0jZGVmaW5lIE9FWF9GUFVfSU5FWAkweDAxCS8qIEluZXhhY3QgZXhjZXB0aW9uLiAgKi8KLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX1BBRCBkZXNjcmlwdG9yLiAgKi8KLSNkZWZpbmUgT1BBRF9QUkVGSVgJMHgwMQotI2RlZmluZSBPUEFEX1BPU1RGSVgJMHgwMgotI2RlZmluZSBPUEFEX1NZTUJPTAkweDA0Ci0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19IV1BBVENIIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPSFdfUjRLRU9QCTB4MDEJLyogUjQwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjhLUEZFVENICTB4MDIJLyogTWF5IG5lZWQgUjgwMDAgcHJlZmV0Y2ggcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjVLRU9QCTB4MDQJLyogUjUwMDAgZW5kLW9mLXBhZ2UgcGF0Y2guICAqLwotI2RlZmluZSBPSFdfUjVLQ1ZUTAkweDA4CS8qIFI1MDAwIGN2dC5bZHNdLmwgYnVnIChjbGVhbiA9PSAxKS4gICovCi0KLS8qIE1hc2tzIGZvciB0aGUgaW5mbyB3b3JkIG9mIGFuIE9ES19JREVOVC9PREtfR1BfR1JPVVAgZGVzY3JpcHRvci4gICovCi0jZGVmaW5lIE9HUF9HUk9VUAkweDAwMDBmZmZmCS8qIEdQIGdyb3VwIG51bWJlci4gICovCi0jZGVmaW5lIE9HUF9TRUxGCTB4ZmZmZjAwMDAJLyogU2VsZi1jb250YWluZWQgR1AgZ3JvdXBzLiAgKi8KLQotLyogTWFza3MgZm9yIHRoZSBpbmZvIHdvcmQgb2YgYW4gT0RLX0hXQU5EL09ES19IV09SIGRlc2NyaXB0b3IuICAqLwotI2RlZmluZSBPSFdBMF9SNEtFT1BfQ0hFQ0tFRAkweDAwMDAwMDAxCi0jZGVmaW5lIE9IV0EwX1I0S0VPUF9DTEVBTgkweDAwMDAwMDAyCi0MCi0KLSNlbmRpZiAvKiBfRUxGX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvbW4xMDIwMC5oIGIvaW5jbHVkZS9lbGYvbW4xMDIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTI5ZTBhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL21uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qIE1OMTAyMDAgRUxGIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1OMTAyMDAgRUxGIEFCSS4gKi8KLQotI2lmbmRlZiBfRUxGX01OMTAyMDBfSAotI2RlZmluZSBfRUxGX01OMTAyMDBfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi1TVEFSVF9SRUxPQ19OVU1CRVJTIChlbGZfbW4xMDIwMF9yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF8zMiwgMSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAyMDBfMTYsIDIpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzgsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwXzI0LCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDIwMF9QQ1JFTDgsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwX1BDUkVMMTYsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMjAwX1BDUkVMMjQsIDcpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0jZW5kaWYgLyogX0VMRl9NTjEwMjAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL21uMTAzMDAuaCBiL2luY2x1ZGUvZWxmL21uMTAzMDAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhMDc1MC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi9tbjEwMzAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKiBNTjEwMzAwIEVMRiBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIHRoZSBNTjEwMzAwIEVMRiBBQkkuICovCi0KLSNpZm5kZWYgX0VMRl9NTjEwMzAwX0gKLSNkZWZpbmUgX0VMRl9NTjEwMzAwX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX21uMTAzMDBfcmVsb2NfdHlwZSkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX01OMTAzMDBfMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwXzE2LCAyKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF84LCAzKQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDMyLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDE2LCA1KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF9QQ1JFTDgsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX0dOVV9WVElOSEVSSVQsIDcpCi0gIFJFTE9DX05VTUJFUiAoUl9NTjEwMzAwX0dOVV9WVEVOVFJZLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfTU4xMDMwMF8yNCwgOSkKLSAgRU1QVFlfUkVMT0MgIChSX01OMTAzMDBfTUFYKQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogTWFjaGluZSB2YXJpYW50IGlmIHdlIGtub3cgaXQuICBUaGlzIGZpZWxkIHdhcyBpbnZlbnRlZCBhdCBDeWdudXMsCi0gICBidXQgaXQgaXMgaG9wZWQgdGhhdCBvdGhlciB2ZW5kb3JzIHdpbGwgYWRvcHQgaXQuICBJZiBzb21lIHN0YW5kYXJkCi0gICBpcyBkZXZlbG9wZWQsIHRoaXMgY29kZSBzaG91bGQgYmUgY2hhbmdlZCB0byBmb2xsb3cgaXQuICovCi0KLSNkZWZpbmUgRUZfTU4xMDMwMF9NQUNICQkweDAwRkYwMDAwCi0KLS8qIEN5Z251cyBpcyBjaG9vc2luZyB2YWx1ZXMgYmV0d2VlbiA4MCBhbmQgOUY7Ci0gICAwMCAtIDdGIHNob3VsZCBiZSBsZWZ0IGZvciBhIGZ1dHVyZSBzdGFuZGFyZDsKLSAgIHRoZSByZXN0IGFyZSBvcGVuLiAqLwotCi0jZGVmaW5lIEVfTU4xMDMwMF9NQUNIX01OMTAzMDAJMHgwMDgxMDAwMAotI2VuZGlmIC8qIF9FTEZfTU4xMDMwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2VsZi9wcGMuaCBiL2luY2x1ZGUvZWxmL3BwYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzExNmQ4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3BwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qIFBQQyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBCeSBNaWNoYWVsIE1laXNzbmVyLCBDeWdudXMgU3VwcG9ydCwgPG1laXNzbmVyQGN5Z251cy5jb20+LCBmcm9tIGluZm9ybWF0aW9uCi0gICBpbiB0aGUgU3lzdGVtIFYgQXBwbGljYXRpb24gQmluYXJ5IEludGVyZmFjZSwgUG93ZXJQQyBQcm9jZXNzb3IgU3VwcGxlbWVudAotICAgYW5kIHRoZSBQb3dlclBDIEVtYmVkZGVkIEFwcGxpY2F0aW9uIEJpbmFyeSBJbnRlcmZhY2UgKGVhYmkpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoaXMgZmlsZSBob2xkcyBkZWZpbml0aW9ucyBzcGVjaWZpYyB0byB0aGUgUFBDIEVMRiBBQkkuICBOb3RlCi0gICB0aGF0IG1vc3Qgb2YgdGhpcyBpcyBub3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQgYnkgQkZELiAgKi8KLQotI2lmbmRlZiBfRUxGX1BQQ19ICi0jZGVmaW5lIF9FTEZfUFBDX0gKLQotI2luY2x1ZGUgImVsZi9yZWxvYy1tYWNyb3MuaCIKLQotLyogUmVsb2NhdGlvbnMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3BwY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX05PTkUsIDApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjMyLCAxKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIyNCwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTYsIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE2X0xPLCA0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNl9ISSwgNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19BRERSMTZfSEEsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfQUREUjE0LCA3KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNF9CUlRBS0VOLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0FERFIxNF9CUk5UQUtFTiwgOSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19SRUwyNCwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMTQsIDExKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0X0JSVEFLRU4sIDEyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1JFTDE0X0JSTlRBS0VOLCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNiwgMTQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR09UMTZfTE8sIDE1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dPVDE2X0hJLCAxNikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HT1QxNl9IQSwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUUkVMMjQsIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0NPUFksIDE5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0dMT0JfREFULCAyMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19KTVBfU0xPVCwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMQVRJVkUsIDIyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0xPQ0FMMjRQQywgMjMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfVUFERFIzMiwgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfVUFERFIxNiwgMjUpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUkVMMzIsIDI2KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDMyLCAyNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFRSRUwzMiwgMjgpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfUExUMTZfTE8sIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1BMVDE2X0hJLCAzMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19QTFQxNl9IQSwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfU0RBUkVMMTYsIDMyKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkYsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfTE8sIDM0KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfSEksIDM1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1NFQ1RPRkZfSEEsIDM2KQotCi0vKiBUaGUgcmVtYWluaW5nIHJlbG9jcyBhcmUgZnJvbSB0aGUgRW1iZWRkZWQgRUxGIEFCSSwgYW5kIGFyZSBub3QKLSAgIGluIHRoZSBTVlI0IEVMRiBBQkkuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjMyLCAxMDEpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTYsIDEwMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfTkFERFIxNl9MTywgMTAzKQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9OQUREUjE2X0hJLCAxMDQpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX05BRERSMTZfSEEsIDEwNSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBSTE2LCAxMDYpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfRU1CX1NEQTJJMTYsIDEwNykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfU0RBMlJFTCwgMTA4KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9TREEyMSwgMTA5KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9NUktSRUYsIDExMCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU0VDMTYsIDExMSkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfTE8sIDExMikKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfSEksIDExMykKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfUkVMU1RfSEEsIDExNCkKLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19FTUJfQklUX0ZMRCwgMTE1KQotICBSRUxPQ19OVU1CRVIgKFJfUFBDX0VNQl9SRUxTREEsIDExNikKLQotICAvKiBUaGVzZSBhcmUgR05VIGV4dGVuc2lvbnMgdG8gZW5hYmxlIEMrKyB2dGFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1BQQ19HTlVfVlRJTkhFUklULCAyNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9QUENfR05VX1ZURU5UUlksIDI1NCkKLQotLyogVGhpcyBpcyBhIHBob255IHJlbG9jIHRvIGhhbmRsZSBhbnkgb2xkIGZhc2hpb25lZCBUT0MxNiByZWZlcmVuY2VzCi0gICB0aGF0IG1heSBzdGlsbCBiZSBpbiBvYmplY3QgZmlsZXMuICAqLwotICBSRUxPQ19OVU1CRVIgKFJfUFBDX1RPQzE2LCAyNTUpCi0KLSAgRU1QVFlfUkVMT0MgKFJfUFBDX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLQotLyogUHJvY2Vzc29yIHNwZWNpZmljIGZsYWdzIGZvciB0aGUgRUxGIGhlYWRlciBlX2ZsYWdzIGZpZWxkLiAgKi8KLQotI2RlZmluZQlFRl9QUENfRU1CCQkweDgwMDAwMDAwCS8qIFBvd2VyUEMgZW1iZWRkZWQgZmxhZyAgKi8KLQotCQkJCQkJLyogQ1lHTlVTIGxvY2FsIGJpdHMgYmVsb3cgKi8KLSNkZWZpbmUJRUZfUFBDX1JFTE9DQVRBQkxFCTB4MDAwMTAwMDAJLyogUG93ZXJQQyAtbXJlbG9jYXRhYmxlIGZsYWcgKi8KLSNkZWZpbmUJRUZfUFBDX1JFTE9DQVRBQkxFX0xJQgkweDAwMDA4MDAwCS8qIFBvd2VyUEMgLW1yZWxvY2F0YWJsZS1saWIgZmxhZyAqLwotCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBoZWFkZXJzLCBzaF90eXBlIGZpZWxkICovCi0KLSNkZWZpbmUgU0hUX09SREVSRUQJCVNIVF9ISVBST0MJLyogTGluayBlZGl0b3IgaXMgdG8gc29ydCB0aGUgXAotCQkJCQkJICAgZW50cmllcyBpbiB0aGlzIHNlY3Rpb24gXAotCQkJCQkJICAgYmFzZWQgb24gdGhlIGFkZHJlc3MgXAotCQkJCQkJICAgc3BlY2lmaWVkIGluIHRoZSBhc3NvY2lhdGVkIFwKLQkJCQkJCSAgIHN5bWJvbCB0YWJsZSBlbnRyeS4gICovCi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBzZWN0aW9uIGZsYWdzLCBzaF9mbGFncyBmaWVsZCAqLwotCi0jZGVmaW5lIFNIRl9FWENMVURFCQkweDgwMDAwMDAwCS8qIExpbmsgZWRpdG9yIGlzIHRvIGV4Y2x1ZGUgXAotCQkJCQkJICAgdGhpcyBzZWN0aW9uIGZyb20gZXhlY3V0YWJsZSBcCi0JCQkJCQkgICBhbmQgc2hhcmVkIG9iamVjdHMgdGhhdCBpdCBcCi0JCQkJCQkgICBidWlsZHMgd2hlbiB0aG9zZSBvYmplY3RzIFwKLQkJCQkJCSAgIGFyZSBub3QgdG8gYmUgZnVyaHRlciBcCi0JCQkJCQkgICByZWxvY2F0ZWQuICAqLwotI2VuZGlmIC8qIF9FTEZfUFBDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3JlbG9jLW1hY3Jvcy5oIGIvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTc0Y2EuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvcmVsb2MtbWFjcm9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogR2VuZXJpYyByZWxvY2F0aW9uIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYnkgdGhlIHZhcmlvdXMgKi5oIHRhcmdldCBzcGVjaWZpYyBoZWFkZXIKLSAgIGZpbGVzIHRvIGVpdGhlciBnZW5lcmF0ZSBhbiBlbnVtIGNvbnRhaW5pbmcgYWxsIHRoZSBrbm93biByZWxvY2F0aW9ucwotICAgZm9yIHRoYXQgdGFyZ2V0LCBvciBpZiBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgaXMgZGVmaW5lZCwgYSByZWNvZ25pdGlvbgotICAgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGluc3RlYWQuICAoVGhpcyBpcyB1c2VkIGJ5IGJpbnV0aWxzL3JlYWRlbGYuYykKLQotICAgR2l2ZW4gYSBoZWFkZXIgZmlsZSBsaWtlIHRoaXM6Ci0KLSAgIAlTVEFSVF9SRUxPQ19OVU1CRVJTIChmb28pCi0gICAJICAgIFJFTE9DX05VTUJFUiAoUl9mb29fTk9ORSwgICAgMCkKLSAgIAkgICAgUkVMT0NfTlVNQkVSIChSX2Zvb18zMiwgICAgICAxKQotICAgCSAgICBGQUtFX1JFTE9DICAgKFJfZm9vX2lsbGVnYWwsIDIpCi0gICAJICAgIEVNUFRZX1JFTE9DICAoUl9mb29fbWF4KQotICAgCUVORF9SRUxPQ19OVU1CRVJTCi0KLSAgIFRoZW4gdGhlIGZvbGxvd2luZyB3aWxsIGJlIHByb2R1Y2VkIGJ5IGRlZmF1bHQgKGllIGlmCi0gICBSRUxPQ19NQUNST1NfR0VOX0ZVTkMgaXMgKm5vdCogZGVmaW5lZCkuCi0KLSAgIAllbnVtIGZvbwotCXsKLQkgIGZvbyA9IC0xLAotICAgCSAgUl9mb29fTk9ORSA9IDAsCi0gICAJICBSX2Zvb18zMiA9IDEsCi0gICAJICBSX2Zvb19pbGxlZ2FsID0gMiwKLSAgIAkgIFJfZm9vX21heAotICAgCX07Ci0KLSAgIElmIFJFTE9DX01BQ1JPU19HRU5fRlVOQyAqaXMqIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGUKLSAgIGZvbGxvd2luZyBmdW5jdGlvbiB3aWxsIGJlIGdlbmVyYXRlZDoKLQotICAgCXN0YXRpYyBjb25zdCBjaGFyICogZm9vIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgcnR5cGUpKTsKLSAgIAlzdGF0aWMgY29uc3QgY2hhciAqCi0gICAJZm9vIChydHlwZSkKLSAgIAkgICAgdW5zaWduZWQgbG9uZyBydHlwZTsKLSAgIAl7Ci0gICAJICAgc3dpdGNoIChydHlwZSkKLSAgIAkgICB7Ci0gICAJICAgY2FzZSAwOiByZXR1cm4gIlJfZm9vX05PTkUiOwotICAgCSAgIGNhc2UgMTogcmV0dXJuICJSX2Zvb18zMiI7Ci0gICAJICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7Ci0gICAJICAgfQotICAgCX0KLSAgICovCi0gICAKLSNpZm5kZWYgX1JFTE9DX01BQ1JPU19ICi0jZGVmaW5lIF9SRUxPQ19NQUNST1NfSAotCi0jaWZkZWYgUkVMT0NfTUFDUk9TX0dFTl9GVU5DCi0KLS8qIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJlbG9jYXRpb24gbnVtYmVyIGFuZCByZXR1cm5zIHRoZQotICAgc3RyaW5nIHZlcnNpb24gbmFtZSBvZiB0aGUgbmFtZSBvZiB0aGF0IHJlbG9jYXRpb24uICBJZgotICAgdGhlIHJlbG9jYXRpb24gaXMgbm90IHJlY29nbmlzZWQsIE5VTEwgaXMgcmV0dXJuZWQuICAqLwotCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICAJCQkJXAotc3RhdGljIGNvbnN0IGNoYXIgKiBuYW1lICAgIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgcnR5cGUpKTsgCVwKLXN0YXRpYyBjb25zdCBjaGFyICoJCQkJCQlcCi1uYW1lIChydHlwZSkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgcnR5cGU7CQkJCQlcCi17CQkJCQkJCQlcCi0gIHN3aXRjaCAocnR5cGUpCQkJCQkJXAotICB7Ci0KLSNpZmRlZiBfX1NURENfXwkJCQkJICAKLSNkZWZpbmUgUkVMT0NfTlVNQkVSKG5hbWUsIG51bWJlcikgIGNhc2UgbnVtYmVyIDogcmV0dXJuICNuYW1lIDsKLSNlbHNlCi0jZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICBjYXNlIG51bWJlciA6IHJldHVybiAibmFtZSIgOwotI2VuZGlmCi0KLSNkZWZpbmUgRkFLRV9SRUxPQyhuYW1lLCBudW1iZXIpICAgIAotI2RlZmluZSBFTVBUWV9SRUxPQyhuYW1lKQotCQkJCQkgIAotI2RlZmluZSBFTkRfUkVMT0NfTlVNQkVSUwlcCi0gICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CVwKLSAgfQkJCQlcCi19Ci0KLQotI2Vsc2UgLyogRGVmYXVsdCB0byBnZW5lcmF0aW5nIGVudW0uICAqLwotCi0vKiBTb21lIGNvbXBpbGVycyBjYW5ub3QgY29wZSB3aXRoIGFuIGVudW0gdGhhdCBlbmRzIHdpdGggYSB0cmFpbGluZwotICAgY29tbWEsIHNvIFNUQVJUX1JFTE9DX05VTUJFUlMgY3JlYXRlcyBhIGZha2UgcmVsb2MgZW50cnksIChpbml0aWFsaXNlZAotICAgdG8gLTEgc28gdGhhdCB0aGUgZmlyc3QgcmVhbCBlbnRyeSB3aWxsIHN0aWxsIGRlZmF1bHQgdG8gMCkuICBGdXJ0aGVyCi0gICBlbnRyaWVzIHRoZW4gcHJlcGVuZCBhIGNvbW1hIHRvIHRoZWlyIGRlZmluaXRpb25zLCBjcmVhdGluZyBhIGxpc3QKLSAgIG9mIGVudW1lcmF0b3IgZW50cmllcyB0aGF0IHdpbGwgc2F0aXNmeSB0aGVzZSBjb21waWxlcnMuICAqLwotI2lmZGVmIF9fU1REQ19fCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICBlbnVtIG5hbWUgeyBfIyNuYW1lID0gLTEKLSNlbHNlCi0jZGVmaW5lIFNUQVJUX1JFTE9DX05VTUJFUlMobmFtZSkgICBlbnVtIG5hbWUgeyBuYW1lID0gLTEKLSNlbmRpZgotCQkJCQkJCi0jZGVmaW5lIFJFTE9DX05VTUJFUihuYW1lLCBudW1iZXIpICAsIG5hbWUgPSBudW1iZXIKLSNkZWZpbmUgRkFLRV9SRUxPQyhuYW1lLCBudW1iZXIpICAgICwgbmFtZSA9IG51bWJlciAKLSNkZWZpbmUgRU1QVFlfUkVMT0MobmFtZSkgICAgICAgICAgICwgbmFtZSAKLSNkZWZpbmUgRU5EX1JFTE9DX05VTUJFUlMgICAgICAgICAgIH07Ci0KLSNlbmRpZgotCi0jZW5kaWYgLyogUkVMT0NfTUFDUk9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3NoLmggYi9pbmNsdWRlL2VsZi9zaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTQ3NjY3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZWxmL3NoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKiBTSCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgX0VMRl9TSF9ICi0jZGVmaW5lIF9FTEZfU0hfSAotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9ucy4gICovCi0vKiBSZWxvY2F0aW9ucyAyNWZmIGFyZSBHTlUgZXh0ZW5zaW9ucy4KLSAgIDI1Li4zMyBhcmUgdXNlZCBmb3IgcmVsYXhhdGlvbiBhbmQgdXNlIHRoZSBzYW1lIGNvbnN0YW50cyBhcyBDT0ZGIHVzZXMuICAqLwotU1RBUlRfUkVMT0NfTlVNQkVSUyAoZWxmX3NoX3JlbG9jX3R5cGUpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9OT05FLCAwKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSMzIsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9SRUwzMiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXUE4sIDMpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9JTkQxMlcsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9ESVI4V1BMLCA1KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOFdQWiwgNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhCUCwgNykKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0RJUjhXLCA4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfRElSOEwsIDkpCi0gIEZBS0VfUkVMT0MgKFJfU0hfRklSU1RfSU5WQUxJRF9SRUxPQywgMTApCi0gIEZBS0VfUkVMT0MgKFJfU0hfTEFTVF9JTlZBTElEX1JFTE9DLCAyNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDE2LCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDMyLCAyNikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1VTRVMsIDI3KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09VTlQsIDI4KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQUxJR04sIDI5KQotICBSRUxPQ19OVU1CRVIgKFJfU0hfQ09ERSwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9EQVRBLCAzMSkKLSAgUkVMT0NfTlVNQkVSIChSX1NIX0xBQkVMLCAzMikKLSAgUkVMT0NfTlVNQkVSIChSX1NIX1NXSVRDSDgsIDMzKQotICBSRUxPQ19OVU1CRVIgKFJfU0hfR05VX1ZUSU5IRVJJVCwgMzQpCi0gIFJFTE9DX05VTUJFUiAoUl9TSF9HTlVfVlRFTlRSWSwgMzUpCi0gIEVNUFRZX1JFTE9DIChSX1NIX21heCkKLUVORF9SRUxPQ19OVU1CRVJTCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9lbGYvc3BhcmMuaCBiL2luY2x1ZGUvZWxmL3NwYXJjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZDAwYmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9lbGYvc3BhcmMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKiBTUEFSQyBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQnkgRG91ZyBFdmFucywgQ3lnbnVzIFN1cHBvcnQsIDxkamVAY3lnbnVzLmNvbT4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfRUxGX1NQQVJDX0gKLSNkZWZpbmUgX0VMRl9TUEFSQ19ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IFN1bi4gICovCi0KLSNkZWZpbmUgRUZfU1BBUkNfMzJQTFVTX01BU0sJMHhmZmZmMDAJLyogYml0cyBpbmRpY2F0aW5nIFY4KyB0eXBlICovCi0jZGVmaW5lIEVGX1NQQVJDXzMyUExVUwkJMHgwMDAxMDAJLyogZ2VuZXJpYyBWOCsgZmVhdHVyZXMgKi8KLSNkZWZpbmUgRUZfU1BBUkNfU1VOX1VTMQkweDAwMDIwMAkvKiBTdW4gVWx0cmFTUEFSQzEgZXh0ZW5zaW9ucyAqLwotI2RlZmluZSBFRl9TUEFSQ19IQUxfUjEJCTB4MDAwNDAwCS8qIEhBTCBSMSBleHRlbnNpb25zICovCi0KLSNkZWZpbmUgRUZfU1BBUkNfTEVEQVRBICAgICAgICAgMHg4MDAwMDAJLyogbGl0dGxlIGVuZGlhbiBkYXRhICovCi0KLS8qIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZSBWOSBBQkkuICAqLwotI2RlZmluZSBFRl9TUEFSQ19FWFRfTUFTSwkweGZmZmYwMAkvKiByZXNlcnZlZCBmb3IgdmVuZG9yIGV4dGVuc2lvbnMgKi8KLQotLyogVjkgbWVtb3J5IG1vZGVscyAqLwotI2RlZmluZSBFRl9TUEFSQ1Y5X01NCQkweDMJCS8qIG1lbW9yeSBtb2RlbCBtYXNrICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfVFNPCQkweDAJCS8qIHRvdGFsIHN0b3JlIG9yZGVyaW5nICovCi0jZGVmaW5lIEVGX1NQQVJDVjlfUFNPCQkweDEJCS8qIHBhcnRpYWwgc3RvcmUgb3JkZXJpbmcgKi8KLSNkZWZpbmUgRUZfU1BBUkNWOV9STU8JCTB4MgkJLyogcmVsYXhlZCBzdG9yZSBvcmRlcmluZyAqLwotCi0vKiBTZWN0aW9uIGluZGljZXMuICAqLwotCi0jZGVmaW5lIFNITl9CRUZPUkUJCTB4ZmYwMAkJLyogdXNlZCB3aXRoIFNIRl9PUkRFUkVEICovCi0jZGVmaW5lIFNITl9BRlRFUgkJMHhmZjAxCQkvKiB1c2VkIHdpdGggU0hGX09SREVSRUQgKi8KLQotLyogU2VjdGlvbiBmbGFncy4gICovCi0KLSNkZWZpbmUgU0hGX0VYQ0xVREUJCTB4ODAwMDAwMDAJLyogZXhjbHVkZSBmcm9tIGxpbmtpbmcgKi8KLSNkZWZpbmUgU0hGX09SREVSRUQJCTB4NDAwMDAwMDAJLyogdHJlYXQgc2hfbGluayxzaF9pbmZvIHNwZWNpYWxseSAqLwotCi0vKiBTeW1ib2wgdHlwZXMuICAqLwotCi0jZGVmaW5lIFNUVF9SRUdJU1RFUgkJMTMJCS8qIGdsb2JhbCByZWcgcmVzZXJ2ZWQgdG8gYXBwLiAqLwotCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi0vKiBSZWxvY2F0aW9uIHR5cGVzLiAgKi8KLVNUQVJUX1JFTE9DX05VTUJFUlMgKGVsZl9zcGFyY19yZWxvY190eXBlKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTk9ORSwgMCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzgsIDEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xNiwgMikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzMyLCAzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfRElTUDgsIDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQMTYsIDUpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ESVNQMzIsIDYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDMwLCA3KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfV0RJU1AyMiwgOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hJMjIsIDkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18yMiwgMTApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMywgMTEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MTzEwLCAxMikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDEwLCAxMykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDEzLCAxNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0dPVDIyLCAxNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDMTAsIDE2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUEMyMiwgMTcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XUExUMzAsIDE4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfQ09QWSwgMTkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19HTE9CX0RBVCwgMjApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19KTVBfU0xPVCwgMjEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRUxBVElWRSwgMjIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTMyLCAyMykKLQotICAvKiA/Pz8gVGhlc2UgNiByZWxvY3MgYXJlIG5ldyBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgRm9yIGJpbmFyeQotICAgICBjb21wYXRpbGl0eSBpbiB0aGUgc3BhcmM2NC1lbGYgdG9vbGNoYWluLCB3ZSBsZWF2ZSB0aGVtIG91dC4KLSAgICAgQSBub24tYmluYXJ5IHVwd2FyZCBjb21wYXRpYmxlIGNoYW5nZSBpcyBleHBlY3RlZCBmb3Igc3BhcmM2NC1lbGYuICAqLwotI2lmbmRlZiBTUEFSQzY0X09MRF9SRUxPQ1MKLSAgLyogPz8/IE5ldyByZWxvY3Mgb24gdGhlIFVsdHJhU1BBUkMuICBOb3Qgc3VyZSB3aGF0IHRoZXkncmUgZm9yIHlldC4gICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QTFQzMiwgMjQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISVBMVDIyLCAyNSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0xPUExUMTAsIDI2KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENQTFQzMiwgMjcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ1BMVDIyLCAyOCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDUExUMTAsIDI5KQotI2VuZGlmCi0KLSAgLyogdjkgcmVsb2NzICovCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMCwgMzApCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ18xMSwgMzEpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ182NCwgMzIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19PTE8xMCwgMzMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISDIyLCAzNCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0hNMTAsIDM1KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTE0yMiwgMzYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QQ19ISDIyLCAzNykKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1BDX0hNMTAsIDM4KQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfUENfTE0yMiwgMzkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19XRElTUDE2LCA0MCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1dESVNQMTksIDQxKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfVU5VU0VEXzQyLCA0MikKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDXzcsIDQzKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfNSwgNDQpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ182LCA0NSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0RJU1A2NCwgNDYpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19QTFQ2NCwgNDcpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19ISVgyMiwgNDgpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19MT1gxMCwgNDkpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19INDQsIDUwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfTTQ0LCA1MSkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX0w0NCwgNTIpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19SRUdJU1RFUiwgNTMpCi0gIFJFTE9DX05VTUJFUiAoUl9TUEFSQ19VQTY0LCA1NCkKLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1VBMTYsIDU1KQotCi0gIC8qIGxpdHRsZSBlbmRpYW4gZGF0YSByZWxvY3MgKi8KLSAgUkVMT0NfTlVNQkVSIChSX1NQQVJDX1JFVjMyLCA1NikKLQotICBFTVBUWV9SRUxPQyAgKFJfU1BBUkNfbWF4X3N0ZCkKLQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR05VX1ZUSU5IRVJJVCwgMjUwKQotICBSRUxPQ19OVU1CRVIgKFJfU1BBUkNfR05VX1ZURU5UUlksIDI1MSkKLQotICBFTVBUWV9SRUxPQyAgKFJfU1BBUkNfbWF4KQotRU5EX1JFTE9DX05VTUJFUlMKLQotLyogUmVsb2NhdGlvbiBtYWNyb3MuICAqLwotCi0jZGVmaW5lIEVMRjY0X1JfVFlQRV9EQVRBKGluZm8pCQkoKChiZmRfdm1hKSAoaW5mbykgPDwgMzIpID4+IDQwKQotI2RlZmluZSBFTEY2NF9SX1RZUEVfSUQoaW5mbykJCSgoKGJmZF92bWEpIChpbmZvKSA8PCA1NikgPj4gNTYpCi0jZGVmaW5lIEVMRjY0X1JfVFlQRV9JTkZPKGRhdGEsIHR5cGUpCSgoKGJmZF92bWEpIChkYXRhKSA8PCA4KSBcCi0JCQkJCSArIChiZmRfdm1hKSAodHlwZSkpCi0KLSNkZWZpbmUgRFRfU1BBUkNfUkVHSVNURVIJMHg3MDAwMDAwMQotCi0vKgotICogRklYTUU6IE5PVCBBQkkgLS0gR0VUIFJJRCBPRiBUSElTCi0gKiBEZWZpbmVzIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgLnBsdC4gIEN1cnJlbnRseSBkZWZpbmVkIHZhbHVlcyBhcmUKLSAqICAgMCAtLSByZXNlcnZlZCB0byBTSQotICogICAxIC0tIGFic29sdXRlIGFkZHJlc3MgaW4gLmdvdC5wbHQKLSAqICAgMiAtLSBnb3QtcmVsYXRpdmUgYWRkcmVzcyBpbiAuZ290LnBsdAotICovCi0KLSNkZWZpbmUgRFRfU1BBUkNfUExURk1UCQkweDcwMDAwMDAxCi0KLSNlbmRpZiAvKiBfRUxGX1NQQVJDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZWxmL3Y4NTAuaCBiL2luY2x1ZGUvZWxmL3Y4NTAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0M2I3Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2VsZi92ODUwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogVjg1MCBFTEYgc3VwcG9ydCBmb3IgQkZELgotICAgQ29weXJpZ2h0IChDKSAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ3JlYXRlZCBieSBNaWNoYWVsIE1laXNzbmVyLCBDeWdudXMgU3VwcG9ydCA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgaG9sZHMgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gdGhlIE1JUFMgRUxGIEFCSS4gIE5vdGUKLSAgIHRoYXQgbW9zdCBvZiB0aGlzIGlzIG5vdCBhY3R1YWxseSBpbXBsZW1lbnRlZCBieSBCRkQuICAqLwotCi0jaWZuZGVmIF9FTEZfVjg1MF9ICi0jZGVmaW5lIF9FTEZfVjg1MF9ICi0KLS8qIFByb2Nlc3NvciBzcGVjaWZpYyBmbGFncyBmb3IgdGhlIEVMRiBoZWFkZXIgZV9mbGFncyBmaWVsZC4gICovCi0KLS8qIEZvdXIgYml0IFY4NTAgYXJjaGl0ZWN0dXJlIGZpZWxkLiAgKi8KLSNkZWZpbmUgRUZfVjg1MF9BUkNICQkweGYwMDAwMDAwCi0KLS8qIHY4NTAgY29kZS4gICovCi0jZGVmaW5lIEVfVjg1MF9BUkNICQkweDAwMDAwMDAwCi0KLS8qIHY4NTBlIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBFX0FSQ0gJCTB4MTAwMDAwMDAKLQotLyogdjg1MGVhIGNvZGUuICAqLwotI2RlZmluZSBFX1Y4NTBFQV9BUkNICQkweDIwMDAwMDAwCi0KLQotLyogRmxhZ3MgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCAqLwotI2RlZmluZSBWODUwX09USEVSX1NEQQkJMHgwMQkvKiBzeW1ib2wgaGFkIFNEQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1pEQQkJMHgwMgkvKiBzeW1ib2wgaGFkIFpEQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1REQQkJMHgwNAkvKiBzeW1ib2wgaGFkIFREQSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX1REQV9CWVRFCTB4MDgJLyogc3ltYm9sIGhhZCBUREEgYnl0ZSByZWxvY2F0aW9ucyAqLwotI2RlZmluZSBWODUwX09USEVSX0VSUk9SCTB4ODAJLyogc3ltYm9sIGhhZCBhbiBlcnJvciByZXBvcnRlZCAqLwotCi0vKiBWODUwIHJlbG9jYXRpb25zICovCi0jaW5jbHVkZSAiZWxmL3JlbG9jLW1hY3Jvcy5oIgotCi1TVEFSVF9SRUxPQ19OVU1CRVJTICh2ODUwX3JlbG9jX3R5cGUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX05PTkUsIDApCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzlfUENSRUwsIDEpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzIyX1BDUkVMLCAyKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9ISTE2X1MsIDMpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0hJMTYsIDQpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0xPMTYsIDUpCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwXzMyLCA2KQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF8xNiwgNykKLSAgICAgUkVMT0NfTlVNQkVSIChSX1Y4NTBfOCwgOCkKLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE2XzE2X09GRlNFVCwgOSkJCS8qIEZvciBsZC5iLCBzdC5iLCBzZXQxLCBjbHIxLCBub3QxLCB0c3QxLCBtb3ZlYSwgbW92aGkgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfU0RBXzE1XzE2X09GRlNFVCwgMTApCQkvKiBGb3IgbGQudywgbGQuaCwgbGQuaHUsIHN0LncsIHN0LmggKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfWkRBXzE2XzE2X09GRlNFVCwgMTEpCQkvKiBGb3IgbGQuYiwgc3QuYiwgc2V0MSwgY2xyMSwgbm90MSwgdHN0MSwgbW92ZWEsIG1vdmhpICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNV8xNl9PRkZTRVQsIDEyKQkJLyogRm9yIGxkLncsIGxkLmgsIGxkLmh1LCBzdC53LCBzdC5oICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV82XzhfT0ZGU0VULCAxMykJCS8qIEZvciBzc3Qudywgc2xkLncgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzdfOF9PRkZTRVQsIDE0KQkJLyogRm9yIHNzdC5oLCBzbGQuaCAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9UREFfN183X09GRlNFVCwgMTUpCQkvKiBGb3Igc3N0LmIsIHNsZC5iICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV8xNl8xNl9PRkZTRVQsIDE2KQkJLyogRm9yIHNldDEsIGNscjEsIG5vdDEsIHRzdDEsIG1vdmVhLCBtb3ZoaSAqLwotLyogQ1lHTlVTIExPQ0FMIHY4NTBlICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1REQV80XzVfT0ZGU0VULCAxNykJCS8qIEZvciBzbGQuaHUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfVERBXzRfNF9PRkZTRVQsIDE4KQkJLyogRm9yIHNsZC5idSAqLwotICAgICBSRUxPQ19OVU1CRVIoIFJfVjg1MF9TREFfMTZfMTZfU1BMSVRfT0ZGU0VULCAxOSkJLyogRm9yIGxkLmJ1ICovCi0gICAgIFJFTE9DX05VTUJFUiggUl9WODUwX1pEQV8xNl8xNl9TUExJVF9PRkZTRVQsIDIwKQkvKiBGb3IgbGQuYnUgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfQ0FMTFRfNl83X09GRlNFVCwgMjEpCQkvKiBGb3IgY2FsbHQgKi8KLSAgICAgUkVMT0NfTlVNQkVSKCBSX1Y4NTBfQ0FMTFRfMTZfMTZfT0ZGU0VULCAyMikJLyogRm9yIGNhbGx0ICovCi0vKiBFTkQgQ1lHTlVTIExPQ0FMICovCi0gICAgIFJFTE9DX05VTUJFUiAoUl9WODUwX0dOVV9WVElOSEVSSVQsIDIzKQotICAgICBSRUxPQ19OVU1CRVIgKFJfVjg1MF9HTlVfVlRFTlRSWSwgMjQpCi0KLSAgICAgRU1QVFlfUkVMT0MgKFJfVjg1MF9tYXgpCi1FTkRfUkVMT0NfTlVNQkVSUwotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiBpbmRpY2VzLiAgVGhlc2Ugc2VjdGlvbnMgZG8gbm90IGFjdHVhbGx5Ci0gICBleGlzdC4gIFN5bWJvbHMgd2l0aCBhIHN0X3NobmR4IGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZXNlCi0gICB2YWx1ZXMgaGF2ZSBhIHNwZWNpYWwgbWVhbmluZy4gICovCi0KLS8qIFNtYWxsIGRhdGEgYXJlYSBjb21tb24gc3ltYm9sLiAgKi8KLSNkZWZpbmUgU0hOX1Y4NTBfU0NPTU1PTgkweGZmMDAKLQotLyogVGlueSBkYXRhIGFyZWEgY29tbW9uIHN5bWJvbC4gICovCi0jZGVmaW5lIFNITl9WODUwX1RDT01NT04JMHhmZjAxCi0KLS8qIFplcm8gZGF0YSBhcmVhIGNvbW1vbiBzeW1ib2wuICAqLwotI2RlZmluZSBTSE5fVjg1MF9aQ09NTU9OCTB4ZmYwMgotCi0MCi0vKiBQcm9jZXNzb3Igc3BlY2lmaWMgc2VjdGlvbiB0eXBlcy4gICovCi0KLS8qIFNlY3Rpb24gY29udGFpbnMgdGhlIC5zY29tbW9uIGRhdGEuICAqLwotI2RlZmluZSBTSFRfVjg1MF9TQ09NTU9OCTB4NzAwMDAwMDAKLQotLyogU2VjdGlvbiBjb250YWlucyB0aGUgLnNjb21tb24gZGF0YS4gICovCi0jZGVmaW5lIFNIVF9WODUwX1RDT01NT04JMHg3MDAwMDAwMQotCi0vKiBTZWN0aW9uIGNvbnRhaW5zIHRoZSAuc2NvbW1vbiBkYXRhLiAgKi8KLSNkZWZpbmUgU0hUX1Y4NTBfWkNPTU1PTgkweDcwMDAwMDAyCi0KLQotI2VuZGlmIC8qIF9FTEZfVjg1MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmggYi9pbmNsdWRlL2Zsb2F0Zm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGFjYTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9mbG9hdGZvcm1hdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qIElFRUUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBkZWNsYXJhdGlvbnMsIGZvciBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChGTE9BVEZPUk1BVF9IKQotI2RlZmluZSBGTE9BVEZPUk1BVF9IIDEKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEEgZmxvYXRmb3JtYXQgY29uc2lzdHMgb2YgYSBzaWduIGJpdCwgYW4gZXhwb25lbnQgYW5kIGEgbWFudGlzc2EuICBPbmNlIHRoZQotICAgYnl0ZXMgYXJlIGNvbmNhdGVuYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGJ5dGVvcmRlciBmbGFnLCB0aGVuIGVhY2ggb2YgdGhvc2UKLSAgIGZpZWxkcyBpcyBjb250aWd1b3VzLiAgV2UgbnVtYmVyIHRoZSBiaXRzIHdpdGggMCBiZWluZyB0aGUgbW9zdCBzaWduaWZpY2FudAotICAgKGkuZS4gQklUU19CSUdfRU5ESUFOIHR5cGUgbnVtYmVyaW5nKSwgYW5kIHNwZWNpZnkgd2hpY2ggYml0cyBlYWNoIGZpZWxkCi0gICBjb250YWlucyB3aXRoIHRoZSAqX3N0YXJ0IGFuZCAqX2xlbiBmaWVsZHMuICAqLwotCi0vKiBXaGF0IGlzIHRoZSBvcmRlciBvZiB0aGUgYnl0ZXMuICovCi0KLWVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycyB7Ci0KLSAgLyogU3RhbmRhcmQgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyLgotICAgICBFWDogMS4yMzQ1Njc4ZTEwID0+IDAwIDAwIDgwIGM1IGUwIGZlIDA2IDQyICovCi0KLSAgZmxvYXRmb3JtYXRfbGl0dGxlLAotCi0gIC8qIFN0YW5kYXJkIGJpZyBlbmRpYW4gYnl0ZSBvcmRlci4KLSAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiA0MiAwNiBmZSBlMCBjNSA4MCAwMCAwMCAqLwotCi0gIGZsb2F0Zm9ybWF0X2JpZywKLQotICAvKiBMaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgYnV0IGJpZyBlbmRpYW4gd29yZCBvcmRlci4KLSAgICAgRVg6IDEuMjM0NTY3OGUxMCA9PiBlMCBmZSAwNiA0MiAwMCAwMCA4MCBjNSAqLwotCi0gIGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZAotCi19OwotCi1lbnVtIGZsb2F0Zm9ybWF0X2ludGJpdCB7IGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubyB9OwotCi1zdHJ1Y3QgZmxvYXRmb3JtYXQKLXsKLSAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIGJ5dGVvcmRlcjsKLSAgdW5zaWduZWQgaW50IHRvdGFsc2l6ZTsJLyogVG90YWwgc2l6ZSBvZiBudW1iZXIgaW4gYml0cyAqLwotCi0gIC8qIFNpZ24gYml0IGlzIGFsd2F5cyBvbmUgYml0IGxvbmcuICAxIG1lYW5zIG5lZ2F0aXZlLCAwIG1lYW5zIHBvc2l0aXZlLiAgKi8KLSAgdW5zaWduZWQgaW50IHNpZ25fc3RhcnQ7Ci0KLSAgdW5zaWduZWQgaW50IGV4cF9zdGFydDsKLSAgdW5zaWduZWQgaW50IGV4cF9sZW47Ci0gIC8qIEFtb3VudCBhZGRlZCB0byAidHJ1ZSIgZXhwb25lbnQuICAweDNmZmYgZm9yIG1hbnkgSUVFRSBleHRlbmRlZHMuICAqLwotICB1bnNpZ25lZCBpbnQgZXhwX2JpYXM7Ci0gIC8qIEV4cG9uZW50IHZhbHVlIHdoaWNoIGluZGljYXRlcyBOYU4uICBUaGlzIGlzIHRoZSBhY3R1YWwgdmFsdWUgc3RvcmVkIGluCi0gICAgIHRoZSBmbG9hdCwgbm90IGFkanVzdGVkIGJ5IHRoZSBleHBfYmlhcy4gIFRoaXMgdXN1YWxseSBjb25zaXN0cyBvZiBhbGwKLSAgICAgb25lIGJpdHMuICAqLwotICB1bnNpZ25lZCBpbnQgZXhwX25hbjsKLQotICB1bnNpZ25lZCBpbnQgbWFuX3N0YXJ0OwotICB1bnNpZ25lZCBpbnQgbWFuX2xlbjsKLQotICAvKiBJcyB0aGUgaW50ZWdlciBiaXQgZXhwbGljaXQgb3IgaW1wbGljaXQ/ICAqLwotICBlbnVtIGZsb2F0Zm9ybWF0X2ludGJpdCBpbnRiaXQ7Ci19OwotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIElFRUUgc2luZ2xlIGFuZCBkb3VibGUsIGJpZyBhbmQgbGl0dGxlIGVuZGlhbi4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9zaW5nbGVfYmlnOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGU7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlOwotCi0vKiBmbG9hdGZvcm1hdCBmb3IgQVJNIElFRUUgZG91YmxlLCBsaXR0bGUgZW5kaWFuIGJ5dGVzIGFuZCBiaWcgZW5kaWFuIHdvcmRzICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlYnl0ZV9iaWd3b3JkOwotCi0vKiBmbG9hdGZvcm1hdHMgZm9yIHZhcmlvdXMgZXh0ZW5kZWRzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pMzg3X2V4dDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTY4ODgxX2V4dDsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaTk2MF9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X204ODExMF9leHQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2FybV9leHQ7Ci0KLS8qIENvbnZlcnQgZnJvbSBGTVQgdG8gYSBkb3VibGUuCi0gICBGUk9NIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBleHRlbmRlZCBmbG9hdC4KLSAgIFN0b3JlIHRoZSBkb3VibGUgaW4gKlRPLiAgKi8KLQotZXh0ZXJuIHZvaWQKLWZsb2F0Zm9ybWF0X3RvX2RvdWJsZSBQQVJBTVMgKChjb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgKiwgY2hhciAqLCBkb3VibGUgKikpOwotCi0vKiBUaGUgY29udmVyc2U6IGNvbnZlcnQgdGhlIGRvdWJsZSAqRlJPTSB0byBGTVQKLSAgIGFuZCBzdG9yZSB3aGVyZSBUTyBwb2ludHMuICAqLwotCi1leHRlcm4gdm9pZAotZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgUEFSQU1TICgoY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0ICosCi0JCQkJIGRvdWJsZSAqLCBjaGFyICopKTsKLQotI2VuZGlmCS8qIGRlZmluZWQgKEZMT0FURk9STUFUX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZubWF0Y2guaCBiL2luY2x1ZGUvZm5tYXRjaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWViNzAwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm5tYXRjaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1OT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQHByZXAuYWkubWl0LmVkdS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYJX0ZOTUFUQ0hfSAotCi0jZGVmaW5lCV9GTk1BVENIX0gJMQotCi0jaWZkZWYJX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXykKLSN1bmRlZglfX1AKLSNkZWZpbmUJX19QKGFyZ3MpCWFyZ3MKLSNlbHNlIC8qIE5vdCBDKysgb3IgQU5TSSBDLiAgKi8KLSN1bmRlZglfX1AKLSNkZWZpbmUJX19QKGFyZ3MpCSgpCi0vKiBXZSBjYW4gZ2V0IGF3YXkgd2l0aG91dCBkZWZpbmluZyBgY29uc3QnIGhlcmUgb25seSBiZWNhdXNlIGluIHRoaXMgZmlsZQotICAgaXQgaXMgdXNlZCBvbmx5IGluc2lkZSB0aGUgcHJvdG90eXBlIGZvciBgZm5tYXRjaCcsIHdoaWNoIGlzIGVsaWRlZCBpbgotICAgbm9uLUFOU0kgQyB3aGVyZSBgY29uc3QnIGlzIHByb2JsZW1hdGljYWwuICAqLwotI2VuZGlmIC8qIEMrKyBvciBBTlNJIEMuICAqLwotCi0KLS8qIFdlICN1bmRlZiB0aGVzZSBiZWZvcmUgZGVmaW5pbmcgdGhlbSBiZWNhdXNlIHNvbWUgbG9zaW5nIHN5c3RlbXMKLSAgIChIUC1VWCBBLjA4LjA3IGZvciBleGFtcGxlKSBkZWZpbmUgdGhlc2UgaW4gPHVuaXN0ZC5oPi4gICovCi0jdW5kZWYJRk5NX1BBVEhOQU1FCi0jdW5kZWYJRk5NX05PRVNDQVBFCi0jdW5kZWYJRk5NX1BFUklPRAotCi0vKiBCaXRzIHNldCBpbiB0aGUgRkxBR1MgYXJndW1lbnQgdG8gYGZubWF0Y2gnLiAgKi8KLSNkZWZpbmUJRk5NX1BBVEhOQU1FCSgxIDw8IDApIC8qIE5vIHdpbGRjYXJkIGNhbiBldmVyIG1hdGNoIGAvJy4gICovCi0jZGVmaW5lCUZOTV9OT0VTQ0FQRQkoMSA8PCAxKSAvKiBCYWNrc2xhc2hlcyBkb24ndCBxdW90ZSBzcGVjaWFsIGNoYXJzLiAgKi8KLSNkZWZpbmUJRk5NX1BFUklPRAkoMSA8PCAyKSAvKiBMZWFkaW5nIGAuJyBpcyBtYXRjaGVkIG9ubHkgZXhwbGljaXRseS4gICovCi0KLSNpZiAhZGVmaW5lZCAoX1BPU0lYX0NfU09VUkNFKSB8fCBfUE9TSVhfQ19TT1VSQ0UgPCAyIHx8IGRlZmluZWQgKF9HTlVfU09VUkNFKQotI2RlZmluZQlGTk1fRklMRV9OQU1FCUZOTV9QQVRITkFNRSAvKiBQcmVmZXJyZWQgR05VIG5hbWUuICAqLwotI2RlZmluZQlGTk1fTEVBRElOR19ESVIJKDEgPDwgMykgLyogSWdub3JlIGAvLi4uJyBhZnRlciBhIG1hdGNoLiAgKi8KLSNkZWZpbmUJRk5NX0NBU0VGT0xECSgxIDw8IDQpIC8qIENvbXBhcmUgd2l0aG91dCByZWdhcmQgdG8gY2FzZS4gICovCi0jZW5kaWYKLQotLyogVmFsdWUgcmV0dXJuZWQgYnkgYGZubWF0Y2gnIGlmIFNUUklORyBkb2VzIG5vdCBtYXRjaCBQQVRURVJOLiAgKi8KLSNkZWZpbmUJRk5NX05PTUFUQ0gJMQotCi0vKiBNYXRjaCBTVFJJTkcgYWdhaW5zdCB0aGUgZmlsZW5hbWUgcGF0dGVybiBQQVRURVJOLAotICAgcmV0dXJuaW5nIHplcm8gaWYgaXQgbWF0Y2hlcywgRk5NX05PTUFUQ0ggaWYgbm90LiAgKi8KLWV4dGVybiBpbnQgZm5tYXRjaCBfX1AgKChjb25zdCBjaGFyICpfX3BhdHRlcm4sIGNvbnN0IGNoYXIgKl9fc3RyaW5nLAotCQkJIGludCBfX2ZsYWdzKSk7Ci0KLSNpZmRlZglfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBmbm1hdGNoLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tYmluLmggYi9pbmNsdWRlL2ZvcGVuLWJpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODY4ZjYzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tYmluLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRoZSAndHlwZScgcGFydCBvZiBhbiBmb3BlbiwgZnJlb3BlbiBvciBmZG9wZW4uIAotCi0JPFJlYWR8V3JpdGU+W1VwZGF0ZV08QmluYXJ5IGZpbGV8dGV4dCBmaWxlPgotCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yICJiaW5hcnkiIHN5c3RlbXMsIHdoZXJlIHRleHQgYW5kIGJpbmFyeSBmaWxlcyBhcmUKLSAgIGRpZmZlcmVudC4gIEFuIGV4YW1wbGUgaXMgTWVzcy1Eb3NlLiAgTWFueSBVbml4IHN5c3RlbXMgY291bGQgYWxzbwotICAgY29wZSB3aXRoIGEgImIiIGluIHRoZSBzdHJpbmcsIGluZGljYXRpbmcgYmluYXJ5IGZpbGVzLCBidXQgc29tZSByZWplY3QgdGhpcwotICAgKGFuZCB0aGVyZWJ5IGRvbid0IGNvbmZvcm0gdG8gQU5TSSBDLCBidXQgd2hhdCBlbHNlIGlzIG5ldz8pLgotCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyYiIKLSNkZWZpbmUgRk9QRU5fV0IgCSJ3YiIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhYiIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicitiIgotI2RlZmluZSBGT1BFTl9XVUIgCSJ3K2IiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErYiIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2ZvcGVuLXNhbWUuaCBiL2luY2x1ZGUvZm9wZW4tc2FtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjM3NTI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tc2FtZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogTWFjcm9zIGZvciB0aGUgJ3R5cGUnIHBhcnQgb2YgYW4gZm9wZW4sIGZyZW9wZW4gb3IgZmRvcGVuLiAKLQotCTxSZWFkfFdyaXRlPltVcGRhdGVdPEJpbmFyeSBmaWxlfHRleHQgZmlsZT4KLQotICAgVGhpcyB2ZXJzaW9uIGlzIGZvciAic2FtZSIgc3lzdGVtcywgd2hlcmUgdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGFyZQotICAgdGhlIHNhbWUuICBBbiBleGFtcGxlIGlzIFVuaXguICBNYW55IFVuaXggc3lzdGVtcyBjb3VsZCBhbHNvIGFkZCBhCi0gICAiYiIgdG8gdGhlIHN0cmluZywgaW5kaWNhdGluZyBiaW5hcnkgZmlsZXMsIGJ1dCBzb21lIHJlamVjdCB0aGlzCi0gICAoYW5kIHRoZXJlYnkgZG9uJ3QgY29uZm9ybSB0byBBTlNJIEMsIGJ1dCB3aGF0IGVsc2UgaXMgbmV3PykuCi0KLSAgIFRoaXMgZmlsZSBpcyBkZXNpZ25lZCBmb3IgaW5jbHVzaW9uIGJ5IGhvc3QtZGVwZW5kZW50IC5oIGZpbGVzLiAgTm8KLSAgIHVzZXIgYXBwbGljYXRpb24gc2hvdWxkIGluY2x1ZGUgaXQgZGlyZWN0bHksIHNpbmNlIHRoYXQgd291bGQgbWFrZQotICAgdGhlIGFwcGxpY2F0aW9uIHVuYWJsZSB0byBiZSBjb25maWd1cmVkIGZvciBib3RoICJzYW1lIiBhbmQgImJpbmFyeSIKLSAgIHZhcmlhbnQgc3lzdGVtcy4gICovCi0KLSNkZWZpbmUgRk9QRU5fUkIJInIiCi0jZGVmaW5lIEZPUEVOX1dCIAkidyIKLSNkZWZpbmUgRk9QRU5fQUIgCSJhIgotI2RlZmluZSBGT1BFTl9SVUIgCSJyKyIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidysiCi0jZGVmaW5lIEZPUEVOX0FVQiAJImErIgotCi0jZGVmaW5lIEZPUEVOX1JUCSJyIgotI2RlZmluZSBGT1BFTl9XVCAJInciCi0jZGVmaW5lIEZPUEVOX0FUIAkiYSIKLSNkZWZpbmUgRk9QRU5fUlVUIAkicisiCi0jZGVmaW5lIEZPUEVOX1dVVCAJIncrIgotI2RlZmluZSBGT1BFTl9BVVQgCSJhKyIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZm9wZW4tdm1zLmggYi9pbmNsdWRlL2ZvcGVuLXZtcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTc2YjdmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZm9wZW4tdm1zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKiBNYWNyb3MgZm9yIHRoZSAndHlwZScgcGFydCBvZiBhbiBmb3BlbiwgZnJlb3BlbiBvciBmZG9wZW4uIAotCi0JPFJlYWR8V3JpdGU+W1VwZGF0ZV08QmluYXJ5IGZpbGV8dGV4dCBmaWxlPgotCi0gICBUaGlzIHZlcnNpb24gaXMgZm9yIFZNUyBzeXN0ZW1zLCB3aGVyZSB0ZXh0IGFuZCBiaW5hcnkgZmlsZXMgYXJlCi0gICBkaWZmZXJlbnQuCi0gICBUaGlzIGZpbGUgaXMgZGVzaWduZWQgZm9yIGluY2x1c2lvbiBieSBob3N0LWRlcGVuZGVudCAuaCBmaWxlcy4gIE5vCi0gICB1c2VyIGFwcGxpY2F0aW9uIHNob3VsZCBpbmNsdWRlIGl0IGRpcmVjdGx5LCBzaW5jZSB0aGF0IHdvdWxkIG1ha2UKLSAgIHRoZSBhcHBsaWNhdGlvbiB1bmFibGUgdG8gYmUgY29uZmlndXJlZCBmb3IgYm90aCAic2FtZSIgYW5kICJiaW5hcnkiCi0gICB2YXJpYW50IHN5c3RlbXMuICAqLwotCi0jZGVmaW5lIEZPUEVOX1JCCSJyYiIsInJmbT12YXIiCi0jZGVmaW5lIEZPUEVOX1dCIAkid2IiLCJyZm09dmFyIgotI2RlZmluZSBGT1BFTl9BQiAJImFiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fUlVCIAkicitiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fV1VCIAkidytiIiwicmZtPXZhciIKLSNkZWZpbmUgRk9QRU5fQVVCIAkiYStiIiwicmZtPXZhciIKLQotI2RlZmluZSBGT1BFTl9SVAkiciIKLSNkZWZpbmUgRk9QRU5fV1QgCSJ3IgotI2RlZmluZSBGT1BFTl9BVCAJImEiCi0jZGVmaW5lIEZPUEVOX1JVVCAJInIrIgotI2RlZmluZSBGT1BFTl9XVVQgCSJ3KyIKLSNkZWZpbmUgRk9QRU5fQVVUIAkiYSsiCmRpZmYgLS1naXQgYS9pbmNsdWRlL2dkYm0uaCBiL2luY2x1ZGUvZ2RibS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJjMjZkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ2RibS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyogR05VIERCTSAtIERhdGFCYXNlIE1hbmFnZXIgaW5jbHVkZSBmaWxlCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MSAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFBoaWxpcCBBLiBOZWxzb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFlvdSBtYXkgY29udGFjdCB0aGUgYXV0aG9yIGJ5OgotICAgICAgIGUtbWFpbDogIHBoaWxAd3d1LmVkdQotICAgICAgdXMtbWFpbDogIFBoaWxpcCBBLiBOZWxzb24KLSAgICAgICAgICAgICAgICBDb21wdXRlciBTY2llbmNlIERlcGFydG1lbnQKLSAgICAgICAgICAgICAgICBXZXN0ZXJuIFdhc2hpbmd0b24gVW5pdmVyc2l0eQotICAgICAgICAgICAgICAgIEJlbGxpbmdoYW0sIFdBIDk4MjI2Ci0gICAgICAgIHBob25lOiAgKDIwNikgNjc2LTMwMzUKLSAgICAgICAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFBhcmFtZXRlcnMgdG8gZ2RibV9vcGVuIGZvciBSRUFERVJTLCBXUklURVJTLCBhbmQgV1JJVEVSUyB3aG8KLSAgIGNhbiBjcmVhdGUgdGhlIGRhdGFiYXNlLiAqLwotI2RlZmluZSAgR0RCTV9SRUFERVIgIDAKLSNkZWZpbmUgIEdEQk1fV1JJVEVSICAxCi0jZGVmaW5lICBHREJNX1dSQ1JFQVQgMgotI2RlZmluZSAgR0RCTV9ORVdEQiAgIDMKLQotLyogUGFyYW1ldGVycyB0byBnZGJtX3N0b3JlIGZvciBzaW1wbGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2VtZW50LiAqLwotI2RlZmluZSAgR0RCTV9JTlNFUlQgIDAKLSNkZWZpbmUgIEdEQk1fUkVQTEFDRSAxCi0KLQotLyogVGhlIGRhdGEgYW5kIGtleSBzdHJ1Y3R1cmUuICBUaGlzIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGZvciBjb21wYXRpYmlsaXR5LiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKmRwdHI7Ci0JaW50ICAgZHNpemU7Ci0gICAgICB9IGRhdHVtOwotCi0KLS8qIFRoZSBmaWxlIGluZm9ybWF0aW9uIGhlYWRlci4gVGhpcyBpcyBnb29kIGVub3VnaCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMuICovCi10eXBlZGVmIHN0cnVjdCB7aW50IGR1bW15WzEwXTt9ICpHREJNX0ZJTEU7Ci0KLQotLyogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyEgKi8KLQotZXh0ZXJuIEdEQk1fRklMRSBnZGJtX29wZW4gKCk7Ci0KLWV4dGVybiB2b2lkCSBnZGJtX2Nsb3NlICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fZmV0Y2ggKCk7Ci0KLWV4dGVybiBpbnQJIGdkYm1fc3RvcmUgKCk7Ci0KLWV4dGVybiBpbnQJIGdkYm1fZGVsZXRlICgpOwotCi1leHRlcm4gZGF0dW0JIGdkYm1fZmlyc3RrZXkgKCk7Ci0KLWV4dGVybiBkYXR1bQkgZ2RibV9uZXh0a2V5ICgpOwotCi1leHRlcm4gaW50CSBnZGJtX3Jlb3JnYW5pemUgKCk7Ci0KLQotLyogZ2RibSBzZW5kcyBiYWNrIHRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgaW4gdGhlIHZhcmlhYmxlIGdkYm1fZXJybm8uICovCi10eXBlZGVmIGVudW0gewlOT19FUlJPUiwKLQkJTUFMTE9DX0VSUk9SLAotCQlCTE9DS19TSVpFX0VSUk9SLAotCQlGSUxFX09QRU5fRVJST1IsCi0JCUZJTEVfV1JJVEVfRVJST1IsCi0JCUZJTEVfU0VFS19FUlJPUiwKLQkJRklMRV9SRUFEX0VSUk9SLAotCQlCQURfTUFHSUNfTlVNQkVSLAotCQlFTVBUWV9EQVRBQkFTRSwKLQkJQ0FOVF9CRV9SRUFERVIsCi0JICAgICAgICBDQU5UX0JFX1dSSVRFUiwKLQkJUkVBREVSX0NBTlRfUkVDT1ZFUiwKLQkJUkVBREVSX0NBTlRfREVMRVRFLAotCQlSRUFERVJfQ0FOVF9TVE9SRSwKLQkJUkVBREVSX0NBTlRfUkVPUkdBTklaRSwKLQkJVU5LTk9XTl9VUERBVEUsCi0JCUlURU1fTk9UX0ZPVU5ELAotCQlSRU9SR0FOSVpFX0ZBSUxFRCwKLQkJQ0FOTk9UX1JFUExBQ0V9Ci0JZ2RibV9lcnJvcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2V0b3B0LmggYi9pbmNsdWRlL2dldG9wdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjMwNzE5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZ2V0b3B0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyogRGVjbGFyYXRpb25zIGZvciBnZXRvcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksOTAsOTEsOTIsOTMsOTQsOTYsOTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX0dFVE9QVF9ICi0jZGVmaW5lIF9HRVRPUFRfSCAxCi0KLSNpZmRlZglfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogRm9yIGNvbW11bmljYXRpb24gZnJvbSBgZ2V0b3B0JyB0byB0aGUgY2FsbGVyLgotICAgV2hlbiBgZ2V0b3B0JyBmaW5kcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBhbiBhcmd1bWVudCwKLSAgIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBoZXJlLgotICAgQWxzbywgd2hlbiBgb3JkZXJpbmcnIGlzIFJFVFVSTl9JTl9PUkRFUiwKLSAgIGVhY2ggbm9uLW9wdGlvbiBBUkdWLWVsZW1lbnQgaXMgcmV0dXJuZWQgaGVyZS4gICovCi0KLWV4dGVybiBjaGFyICpvcHRhcmc7Ci0KLS8qIEluZGV4IGluIEFSR1Ygb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSBzY2FubmVkLgotICAgVGhpcyBpcyB1c2VkIGZvciBjb21tdW5pY2F0aW9uIHRvIGFuZCBmcm9tIHRoZSBjYWxsZXIKLSAgIGFuZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gYGdldG9wdCcuCi0KLSAgIE9uIGVudHJ5IHRvIGBnZXRvcHQnLCB6ZXJvIG1lYW5zIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGw7IGluaXRpYWxpemUuCi0KLSAgIFdoZW4gYGdldG9wdCcgcmV0dXJucyAtMSwgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9mIHRoZQotICAgbm9uLW9wdGlvbiBlbGVtZW50cyB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGl0c2VsZiBzY2FuLgotCi0gICBPdGhlcndpc2UsIGBvcHRpbmQnIGNvbW11bmljYXRlcyBmcm9tIG9uZSBjYWxsIHRvIHRoZSBuZXh0Ci0gICBob3cgbXVjaCBvZiBBUkdWIGhhcyBiZWVuIHNjYW5uZWQgc28gZmFyLiAgKi8KLQotZXh0ZXJuIGludCBvcHRpbmQ7Ci0KLS8qIENhbGxlcnMgc3RvcmUgemVybyBoZXJlIHRvIGluaGliaXQgdGhlIGVycm9yIG1lc3NhZ2UgYGdldG9wdCcgcHJpbnRzCi0gICBmb3IgdW5yZWNvZ25pemVkIG9wdGlvbnMuICAqLwotCi1leHRlcm4gaW50IG9wdGVycjsKLQotLyogU2V0IHRvIGFuIG9wdGlvbiBjaGFyYWN0ZXIgd2hpY2ggd2FzIHVucmVjb2duaXplZC4gICovCi0KLWV4dGVybiBpbnQgb3B0b3B0OwotCi0vKiBEZXNjcmliZSB0aGUgbG9uZy1uYW1lZCBvcHRpb25zIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICBUaGUgTE9OR19PUFRJT05TIGFyZ3VtZW50IHRvIGdldG9wdF9sb25nIG9yIGdldG9wdF9sb25nX29ubHkgaXMgYSB2ZWN0b3IKLSAgIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuIGVsZW1lbnQgY29udGFpbmluZyBhIG5hbWUgd2hpY2ggaXMKLSAgIHplcm8uCi0KLSAgIFRoZSBmaWVsZCBgaGFzX2FyZycgaXM6Ci0gICBub19hcmd1bWVudAkJKG9yIDApIGlmIHRoZSBvcHRpb24gZG9lcyBub3QgdGFrZSBhbiBhcmd1bWVudCwKLSAgIHJlcXVpcmVkX2FyZ3VtZW50CShvciAxKSBpZiB0aGUgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50LAotICAgb3B0aW9uYWxfYXJndW1lbnQgCShvciAyKSBpZiB0aGUgb3B0aW9uIHRha2VzIGFuIG9wdGlvbmFsIGFyZ3VtZW50LgotCi0gICBJZiB0aGUgZmllbGQgYGZsYWcnIGlzIG5vdCBOVUxMLCBpdCBwb2ludHMgdG8gYSB2YXJpYWJsZSB0aGF0IGlzIHNldAotICAgdG8gdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBmaWVsZCBgdmFsJyB3aGVuIHRoZSBvcHRpb24gaXMgZm91bmQsIGJ1dAotICAgbGVmdCB1bmNoYW5nZWQgaWYgdGhlIG9wdGlvbiBpcyBub3QgZm91bmQuCi0KLSAgIFRvIGhhdmUgYSBsb25nLW5hbWVkIG9wdGlvbiBkbyBzb21ldGhpbmcgb3RoZXIgdGhhbiBzZXQgYW4gYGludCcgdG8KLSAgIGEgY29tcGlsZWQtaW4gY29uc3RhbnQsIHN1Y2ggYXMgc2V0IGEgdmFsdWUgZnJvbSBgb3B0YXJnJywgc2V0IHRoZQotICAgb3B0aW9uJ3MgYGZsYWcnIGZpZWxkIHRvIHplcm8gYW5kIGl0cyBgdmFsJyBmaWVsZCB0byBhIG5vbnplcm8KLSAgIHZhbHVlICh0aGUgZXF1aXZhbGVudCBzaW5nbGUtbGV0dGVyIG9wdGlvbiBjaGFyYWN0ZXIsIGlmIHRoZXJlIGlzCi0gICBvbmUpLiAgRm9yIGxvbmcgb3B0aW9ucyB0aGF0IGhhdmUgYSB6ZXJvIGBmbGFnJyBmaWVsZCwgYGdldG9wdCcKLSAgIHJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBgdmFsJyBmaWVsZC4gICovCi0KLXN0cnVjdCBvcHRpb24KLXsKLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSAgY29uc3QgY2hhciAqbmFtZTsKLSNlbHNlCi0gIGNoYXIgKm5hbWU7Ci0jZW5kaWYKLSAgLyogaGFzX2FyZyBjYW4ndCBiZSBhbiBlbnVtIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY29tcGxhaW4gYWJvdXQKLSAgICAgdHlwZSBtaXNtYXRjaGVzIGluIGFsbCB0aGUgY29kZSB0aGF0IGFzc3VtZXMgaXQgaXMgYW4gaW50LiAgKi8KLSAgaW50IGhhc19hcmc7Ci0gIGludCAqZmxhZzsKLSAgaW50IHZhbDsKLX07Ci0KLS8qIE5hbWVzIGZvciB0aGUgdmFsdWVzIG9mIHRoZSBgaGFzX2FyZycgZmllbGQgb2YgYHN0cnVjdCBvcHRpb24nLiAgKi8KLQotI2RlZmluZQlub19hcmd1bWVudAkJMAotI2RlZmluZSByZXF1aXJlZF9hcmd1bWVudAkxCi0jZGVmaW5lIG9wdGlvbmFsX2FyZ3VtZW50CTIKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2lmZGVmIF9fR05VX0xJQlJBUllfXwotLyogTWFueSBvdGhlciBsaWJyYXJpZXMgaGF2ZSBjb25mbGljdGluZyBwcm90b3R5cGVzIGZvciBnZXRvcHQsIHdpdGgKLSAgIGRpZmZlcmVuY2VzIGluIHRoZSBjb25zdHMsIGluIHN0ZGxpYi5oLiAgVG8gYXZvaWQgY29tcGlsYXRpb24KLSAgIGVycm9ycywgb25seSBwcm90b3R5cGUgZ2V0b3B0IGZvciB0aGUgR05VIEMgbGlicmFyeS4gICovCi1leHRlcm4gaW50IGdldG9wdCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LCBjb25zdCBjaGFyICpzaG9ydG9wdHMpOwotI2Vsc2UgLyogbm90IF9fR05VX0xJQlJBUllfXyAqLwotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci0jZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCi1leHRlcm4gaW50IGdldG9wdF9sb25nIChpbnQgYXJnYywgY2hhciAqY29uc3QgKmFyZ3YsIGNvbnN0IGNoYXIgKnNob3J0b3B0cywKLQkJICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKLWV4dGVybiBpbnQgZ2V0b3B0X2xvbmdfb25seSAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAotCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kKTsKLQotLyogSW50ZXJuYWwgb25seS4gIFVzZXJzIHNob3VsZCBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LiAgKi8KLWV4dGVybiBpbnQgX2dldG9wdF9pbnRlcm5hbCAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2LAotCQkJICAgICBjb25zdCBjaGFyICpzaG9ydG9wdHMsCi0JCSAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nb3B0cywgaW50ICpsb25naW5kLAotCQkJICAgICBpbnQgbG9uZ19vbmx5KTsKLSNlbHNlIC8qIG5vdCBfX1NURENfXyAqLwotZXh0ZXJuIGludCBnZXRvcHQgKCk7Ci1leHRlcm4gaW50IGdldG9wdF9sb25nICgpOwotZXh0ZXJuIGludCBnZXRvcHRfbG9uZ19vbmx5ICgpOwotCi1leHRlcm4gaW50IF9nZXRvcHRfaW50ZXJuYWwgKCk7Ci0jZW5kaWYgLyogX19TVERDX18gKi8KLQotI2lmZGVmCV9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIGdldG9wdC5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2hwLXN5bXRhYi5oIGIvaW5jbHVkZS9ocC1zeW10YWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZmNTY2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2hwLXN5bXRhYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg3MSArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcyBmb3IgcmVhZGluZyBkZWJ1ZyBzeW1ib2xzIGZyb20gdGhlCi0gICBuYXRpdmUgSFAgQyBjb21waWxlci4KLQotICAgV3JpdHRlbiBieSB0aGUgQ2VudGVyIGZvciBTb2Z0d2FyZSBTY2llbmNlIGF0IHRoZSBVbml2ZXJzaXR5IG9mIFV0YWgKLSAgIGFuZCBieSBDeWdudXMgU3VwcG9ydC4KLQotICAgQ29weXJpZ2h0IDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgSFBfU1lNVEFCX0lOQ0xVREVECi0jZGVmaW5lIEhQX1NZTVRBQl9JTkNMVURFRAotCi0vKiBHZW5lcmFsIGluZm9ybWF0aW9uOgotCi0gICBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgYW5kIGRlc2NyaWJlcyBvbmx5IHRoZSBkYXRhIHN0cnVjdHVyZXMKLSAgIG5lY2Vzc2FyeSB0byByZWFkIGRlYnVnIHN5bWJvbHMgcHJvZHVjZWQgYnkgdGhlIEhQIEMgY29tcGlsZXIsCi0gICBIUCBBTlNJIEMrKyBjb21waWxlciwgYW5kIEhQIEZPUlRSQU4gOTAgY29tcGlsZXIgdXNpbmcgdGhlCi0gICBTT00gb2JqZWN0IGZpbGUgZm9ybWF0LiAgCi0gICAoRm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgZGVidWcgZm9ybWF0LCBmdHAgaHB1eC1zeW10YWIuaCBmcm9tCi0gICBqYWd1YXIuY3MudXRhaC5lZHU6L2Rpc3QpLgotICAgCi0gICBBZGRpdGlvbmFsIG5vdGVzIChSaWNoIFRpdGxlKQotICAgVGhpcyBmaWxlIGlzIGEgcmV2ZXJzZS1lbmdpbmVlcmVkIHZlcnNpb24gb2YgYSBmaWxlIGNhbGxlZAotICAgInN5bXRhYi5oIiB3aGljaCBleGlzdHMgaW50ZXJuYWwgdG8gSFAncyBDb21wdXRlciBMYW5ndWFnZXMgT3JnYW5pemF0aW9uCi0gICBpbiAvQ0xPL0NvbXBvbmVudHMvRERFL29iai9zb20vc3ltdGFiLmguIEJlY2F1c2UgSFAncyB2ZXJzaW9uIG9mCi0gICB0aGUgZmlsZSBpcyBjb3B5cmlnaHRlZCBhbmQgbm90IGRpc3RyaWJ1dGVkLCBpdCBpcyBuZWNlc3NhcnkgZm9yCi0gICBHREIgdG8gdXNlIHRoZSByZXZlcnNlLWVuZ2luZWVyZWQgdmVyc2lvbiB0aGF0IGZvbGxvd3MuCi0gICBXb3JrIHdhcyBkb25lIGJ5IEN5Z251cyB0byByZXZlcnNlLWVuZ2luZWVyIHRoZSBDIHN1YnNldCBvZiBzeW10YWIuaC4KLSAgIFRoZSBXREIgcHJvamVjdCBoYXMgZXh0ZW5kZWQgdGhpcyB0byBhbHNvIGNvbnRhaW4gdGhlIEMrKyAKLSAgIHN5bWJvbCBkZWZpbml0aW9ucywgdGhlIEY5MCBzeW1ib2wgZGVmaW5pdGlvbnMsIAotICAgYW5kIHRoZSBET0MgKGRlYnVnZ2luZy1vcHRpbWl6ZWQtY29kZSkgc3ltYm9sIGRlZmluaXRpb25zLgotICAgSW4gc29tZSBjYXNlcyAodGhlIEMrKyBzeW1ib2wgZGVmaW5pdGlvbnMpCi0gICBJIGhhdmUgYWRkZWQgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBoZXJlIHRoYXQKLSAgIGdvZXMgYmV5b25kIHdoYXQgaXMgc3VwcGxpZWQgaW4gSFAncyBzeW10YWIuaC4gSWYgd2Ugc29tZWRheQotICAgdW5pZnkgdGhlc2UgZmlsZXMgYWdhaW4sIHRoZSBleHRyYSBjb21tZW50cyBzaG91bGQgYmUgbWVyZ2VkIGJhY2sKLSAgIGludG8gSFAncyBzeW10YWIuaC4KLSAgCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgIERlYnVnIHN5bWJvbHMgYXJlIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4gYW4gdW5sb2FkYWJsZSBzcGFjZSBjYWxsZWQKLSAgICRERUJVRyQuICAkREVCVUckIGNvbnRhaW5zIHNldmVyYWwgc3Vic3BhY2VzIHdoaWNoIGdyb3VwIHJlbGF0ZWQKLSAgIGRlYnVnIHN5bWJvbHMuCi0KLSAgICRHTlRUJCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgZ2xvYmFsIHZhcmlhYmxlcywgdHlwZXMgYW5kIGNvbnRhbnRzLgotCi0gICAkTE5UVCQgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIHByb2NlZHVyZXMgKGluY2x1ZGluZyBuZXN0aW5nKSwgc2NvcGluZwotICAgaW5mb3JtYXRpb24sIGxvY2FsIHZhcmlhYmxlcywgdHlwZXMsIGFuZCBjb25zdGFudHMuCi0KLSAgICRTTFQkIGNvbnRhaW5zIHNvdXJjZSBsaW5lIGluZm9ybWF0aW9uIHNvIHRoYXQgY29kZSBhZGRyZXNzZXMgbWF5IGJlCi0gICBtYXBwZWQgdG8gc291cmNlIGxpbmVzLgotCi0gICAkVlQkIGNvbnRhaW5zIHZhcmlvdXMgc3RyaW5ncyBhbmQgY29uc3RhbnRzIGZvciBuYW1lZCBvYmplY3RzICh2YXJpYWJsZXMsCi0gICB0eXBlZGVmcywgZnVuY3Rpb25zLCBldGMpLiAgU3RyaW5ncyBhcmUgc3RvcmVkIGFzIG51bGwtdGVybWluYXRlZCBjaGFyYWN0ZXIKLSAgIGxpc3RzLiAgQ29uc3RhbnRzIGFsd2F5cyBiZWdpbiBvbiB3b3JkIGJvdW5kYXJpZXMuICBUaGUgZmlyc3QgYnl0ZSBvZgotICAgdGhlIFZUIG11c3QgYmUgemVybyAoYSBudWxsIHN0cmluZykuCi0KLSAgICRYVCQgaXMgbm90IGN1cnJlbnRseSB1c2VkIGJ5IEdEQi4KLQotICAgTWFueSBzdHJ1Y3R1cmVzIHdpdGhpbiB0aGUgc3Vic3BhY2VzIHBvaW50IHRvIG90aGVyIHN0cnVjdHVyZXMgd2l0aGluCi0gICB0aGUgc2FtZSBzdWJzcGFjZSwgb3IgdG8gc3RydWN0dXJlcyB3aXRoaW4gYSBkaWZmZXJlbnQgc3Vic3BhY2UuICBUaGVzZQotICAgcG9pbnRlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgc3RydWN0dXJlIGluZGV4IGZyb20gdGhlIGJlZ2lubmluZyBvZgotICAgdGhlIGFwcHJvcHJpYXRlIHN1YnNwYWNlLiAgKi8KLQotLyogVXNlZCB0byBkZXNjcmliZSB3aGVyZSBhIGNvbnN0YW50IGlzIHN0b3JlZC4gICovCi1lbnVtIGxvY2F0aW9uX3R5cGUKLXsKLSAgTE9DQVRJT05fSU1NRURJQVRFLAotICBMT0NBVElPTl9QVFIsCi0gIExPQ0FUSU9OX1ZULAotfTsKLQotLyogTGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSB0aGlzIGRlYnVnIGZvcm1hdC4gIFdpdGhpbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzCi0gICB0aGlzIHR5cGUgaXMgbGltaXRlZCB0byA0IGJpdHMgZm9yIGEgbWF4aW11bSBvZiAxNiBsYW5ndWFnZXMuICAqLwotZW51bSBocF9sYW5ndWFnZQotewotICBIUF9MQU5HVUFHRV9VTktOT1dOLAotICBIUF9MQU5HVUFHRV9DLAotICBIUF9MQU5HVUFHRV9GNzcsCi0gIEhQX0xBTkdVQUdFX1BBU0NBTCwKLSAgSFBfTEFOR1VBR0VfTU9EQ0FMLAotICBIUF9MQU5HVUFHRV9DT0JPTCwKLSAgSFBfTEFOR1VBR0VfQkFTSUMsCi0gIEhQX0xBTkdVQUdFX0FEQSwKLSAgSFBfTEFOR1VBR0VfQ1BMVVNQTFVTLAotICBIUF9MQU5HVUFHRV9ETVBBU0NBTAotfTsKLQotCi0vKiBCYXNpYyBkYXRhIHR5cGVzIGF2YWlsYWJsZSBpbiB0aGlzIGRlYnVnIGZvcm1hdC4gIFdpdGhpbiB0aGUgZGF0YQotICAgc3RydWN0dXJlcyB0aGlzIHR5cGUgaXMgbGltaXRlZCB0byA1IGJpdHMgZm9yIGEgbWF4aW11bSBvZiAzMiBiYXNpYwotICAgZGF0YSB0eXBlcy4gICovCi1lbnVtIGhwX3R5cGUKLXsKLSAgSFBfVFlQRV9VTkRFRklORUQsIC8qIDAgKi8KLSAgSFBfVFlQRV9CT09MRUFOLCAvKiAxICovCi0gIEhQX1RZUEVfQ0hBUiwgLyogMiAqLwotICBIUF9UWVBFX0lOVCwgLyogMyAqLwotICBIUF9UWVBFX1VOU0lHTkVEX0lOVCwgLyogNCAqLwotICBIUF9UWVBFX1JFQUwsIC8qIDUgKi8KLSAgSFBfVFlQRV9DT01QTEVYLCAvKiA2ICovCi0gIEhQX1RZUEVfU1RSSU5HMjAwLCAvKiA3ICovCi0gIEhQX1RZUEVfTE9OR1NUUklORzIwMCwgLyogOCAqLwotICBIUF9UWVBFX1RFWFQsIC8qIDkgKi8KLSAgSFBfVFlQRV9GTEFCRUwsIC8qIDEwICovCi0gIEhQX1RZUEVfRlROX1NUUklOR19TUEVDLCAvKiAxMSAqLwotICBIUF9UWVBFX01PRF9TVFJJTkdfU1BFQywgLyogMTIgKi8KLSAgSFBfVFlQRV9QQUNLRURfREVDSU1BTCwgLyogMTMgKi8KLSAgSFBfVFlQRV9SRUFMXzMwMDAsIC8qIDE0ICovCi0gIEhQX1RZUEVfTU9EX1NUUklOR18zMDAwLCAvKiAxNSAqLwotICBIUF9UWVBFX0FOWVBPSU5URVIsIC8qIDE2ICovCi0gIEhQX1RZUEVfR0xPQkFMX0FOWVBPSU5URVIsIC8qIDE3ICovCi0gIEhQX1RZUEVfTE9DQUxfQU5ZUE9JTlRFUiwgLyogMTggKi8KLSAgSFBfVFlQRV9DT01QTEVYUzMwMDAsIC8qIDE5ICovCi0gIEhQX1RZUEVfRlROX1NUUklOR19TMzAwX0NPTVBBVCwgLyogMjAgKi8gCi0gIEhQX1RZUEVfRlROX1NUUklOR19WQVhfQ09NUEFULCAvKiAyMSAqLwotICBIUF9UWVBFX0JPT0xFQU5fUzMwMF9DT01QQVQsIC8qIDIyICovCi0gIEhQX1RZUEVfQk9PTEVBTl9WQVhfQ09NUEFULCAvKiAyMyAqLwotICBIUF9UWVBFX1dJREVfQ0hBUiwgLyogMjQgKi8KLSAgSFBfVFlQRV9MT05HLCAvKiAyNSAqLwotICBIUF9UWVBFX1VOU0lHTkVEX0xPTkcsIC8qIDI2ICovCi0gIEhQX1RZUEVfRE9VQkxFLCAvKiAyNyAqLwotICBIUF9UWVBFX1RFTVBMQVRFX0FSRywgLyogMjggKi8KLSAgSFBfVFlQRV9WT0lEIC8qIDI5ICovCi19OwotCi0vKiBBbiBpbW1lZGlhdGUgbmFtZSBhbmQgdHlwZSB0YWJsZSBlbnRyeS4KLQotICAgZXh0ZW5zaW9uIGFuZCBpbW1lZGlhdGUgd2lsbCBhbHdheXMgYmUgb25lLgotICAgZ2xvYmFsIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0gICBocF90eXBlIGlzIHRoZSBiYXNpYyB0eXBlIHRoaXMgZW50cnkgZGVzY3JpYmVzLgotICAgYml0bGVuZ3RoIGlzIHRoZSBsZW5ndGggaW4gYml0cyBmb3IgdGhlIGJhc2ljIHR5cGUuICAqLwotc3RydWN0IGRudHRwX2ltbWVkaWF0ZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQgaW1tZWRpYXRlOgkxOwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IHR5cGU6IAkJNTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDoJMjQ7Ci19OwotCi0vKiBBIG5vbmltbWVkaWF0ZSBuYW1lIGFuZCB0eXBlIHRhYmxlIGVudHJ5LgotCi0gICBleHRlbnNpb24gd2lsbCBhbHdheXMgYmUgb25lLgotICAgaW1tZWRpYXRlIHdpbGwgYWx3YXlzIGJlIHplcm8uCi0gICBpZiBnbG9iYWwgaXMgemVybywgdGhpcyBlbnRyeSBwb2ludHMgaW50byB0aGUgTE5UVAotICAgaWYgZ2xvYmFsIGlzIG9uZSwgdGhpcyBlbnRyeSBwb2ludHMgaW50byB0aGUgR05UVAotICAgaW5kZXggaXMgdGhlIGluZGV4IHdpdGhpbiB0aGUgR05UVCBvciBMTlRUIGZvciB0aGlzIGVudHJ5LiAgKi8KLXN0cnVjdCBkbnR0cF9ub25pbW1lZGlhdGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGltbWVkaWF0ZToJMTsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRleDoJCTI5OwotfTsKLQotLyogQSBwb2ludGVyIHRvIGFuIGVudHJ5IGluIHRoZSBHTlRUIGFuZCBMTlRUIHRhYmxlcy4gIEl0IGhhcyB0d28KLSAgIGZvcm1zIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBiZWluZyBkZXNjcmliZWQuCi0KLSAgIFRoZSBpbW1lZGlhdGUgZm9ybSBpcyB1c2VkIGZvciBzaW1wbGUgZW50cmllcyBhbmQgaXMgb25lCi0gICB3b3JkLgotCi0gICBUaGUgbm9uaW1tZWRpYXRlIGZvcm0gaXMgdXNlZCBmb3IgY29tcGxleCBlbnRyaWVzIGFuZCBjb250YWlucwotICAgYW4gaW5kZXggaW50byB0aGUgTE5UVCBvciBHTlRUIHdoaWNoIGRlc2NyaWJlcyB0aGUgZW50aXJlIHR5cGUuCi0KLSAgIElmIGEgZG50dHBvaW50ZXIgaXMgLTEsIHRoZW4gaXQgaXMgYSBOSUwgZW50cnkuICAqLwotCi0jZGVmaW5lIEROVFROSUwgKC0xKQotdHlwZWRlZiB1bmlvbiBkbnR0cG9pbnRlcgotewotICBzdHJ1Y3QgZG50dHBfaW1tZWRpYXRlICAgIGRudHRpOwotICBzdHJ1Y3QgZG50dHBfbm9uaW1tZWRpYXRlIGRudHRwOwotICBpbnQgd29yZDsKLX0gZG50dHBvaW50ZXI7Ci0KLS8qIEFuIGluZGV4IGludG8gdGhlIHNvdXJjZSBsaW5lIHRhYmxlLiAgQXMgd2l0aCBkbnR0cG9pbnRlcnMsIGEgc2x0cG9pbnRlcgotICAgb2YgLTEgaW5kaWNhdGVzIGEgTklMIGVudHJ5LiAgKi8KLSNkZWZpbmUgU0xUTklMICgtMSkKLXR5cGVkZWYgaW50IHNsdHBvaW50ZXI7Ci0KLS8qIEluZGV4IGludG8gRE9DICg9ICJEZWJ1Z2dpbmcgT3B0aW1pemVkIENvZGUiKSBsaW5lIHRhYmxlICovCi0jZGVmaW5lIExUTklMICgtMSkKLXR5cGVkZWYgaW50IGx0cG9pbnRlcjsKLQotLyogSW5kZXggaW50byBjb250ZXh0IHRhYmxlICovCi0jZGVmaW5lIENUWFROSUwgKC0xKQotdHlwZWRlZiBpbnQgY3R4dHBvaW50ZXI7Ci0KLS8qIFVuc2lnbmVkIGJ5dGUgb2Zmc2V0IGludG8gdGhlIFZULiAgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IHZ0cG9pbnRlcjsKLQotLyogQSBETlRUIGVudHJ5ICh1c2VkIHdpdGhpbiB0aGUgR05UVCBhbmQgTE5UVCkuCi0KLSAgIEROVFQgZW50cmllcyBhcmUgdmFyaWFibGUgc2l6ZWQgb2JqZWN0cywgYnV0IGFyZSBhbHdheXMgYSBtdWx0aXBsZQotICAgb2YgMyB3b3JkcyAod2UgY2FsbCBlYWNoIGdyb3VwIG9mIDMgd29yZHMgYSAiYmxvY2siKS4KLQotICAgVGhlIGZpcnN0IGJpdCBpbiBlYWNoIGJsb2NrIGlzIGFuIGV4dGVuc2lvbiBiaXQuICBUaGlzIGJpdCBpcyB6ZXJvCi0gICBmb3IgdGhlIGZpcnN0IGJsb2NrIG9mIGEgRE5UVCBlbnRyeS4gIElmIHRoZSBlbnRyeSByZXF1aXJlcyBtb3JlCi0gICB0aGFuIG9uZSBibG9jaywgdGhlbiB0aGlzIGJpdCBpcyBzZXQgdG8gb25lIGluIGFsbCBibG9ja3MgYWZ0ZXIKLSAgIHRoZSBmaXJzdCBvbmUuICAqLwotCi0vKiBFYWNoIEROVFQgZW50cnkgZGVzY3JpYmVzIGEgcGFydGljdWxhciBkZWJ1ZyBzeW1ib2wgKGJlZ2lubmluZyBvZgotICAgYSBzb3VyY2UgZmlsZSwgYSBmdW5jdGlvbiwgdmFyaWFibGVzLCBzdHJ1Y3R1cmVzLCBldGMuCi0KLSAgIFRoZSB0eXBlIG9mIHRoZSBETlRUIGVudHJ5IGlzIHN0b3JlZCBpbiB0aGUgImtpbmQiIGZpZWxkIHdpdGhpbiB0aGUKLSAgIEROVFQgZW50cnkgaXRzZWxmLiAgKi8KLQotZW51bSBkbnR0X2VudHJ5X3R5cGUKLXsKLSAgRE5UVF9UWVBFX05JTCA9IC0xLAotICBETlRUX1RZUEVfU1JDRklMRSwKLSAgRE5UVF9UWVBFX01PRFVMRSwKLSAgRE5UVF9UWVBFX0ZVTkNUSU9OLAotICBETlRUX1RZUEVfRU5UUlksCi0gIEROVFRfVFlQRV9CRUdJTiwKLSAgRE5UVF9UWVBFX0VORCwKLSAgRE5UVF9UWVBFX0lNUE9SVCwKLSAgRE5UVF9UWVBFX0xBQkVMLAotICBETlRUX1RZUEVfRlBBUkFNLAotICBETlRUX1RZUEVfU1ZBUiwKLSAgRE5UVF9UWVBFX0RWQVIsCi0gIEROVFRfVFlQRV9IT0xFMSwKLSAgRE5UVF9UWVBFX0NPTlNULAotICBETlRUX1RZUEVfVFlQRURFRiwKLSAgRE5UVF9UWVBFX1RBR0RFRiwKLSAgRE5UVF9UWVBFX1BPSU5URVIsCi0gIEROVFRfVFlQRV9FTlVNLAotICBETlRUX1RZUEVfTUVNRU5VTSwKLSAgRE5UVF9UWVBFX1NFVCwKLSAgRE5UVF9UWVBFX1NVQlJBTkdFLAotICBETlRUX1RZUEVfQVJSQVksCi0gIEROVFRfVFlQRV9TVFJVQ1QsCi0gIEROVFRfVFlQRV9VTklPTiwKLSAgRE5UVF9UWVBFX0ZJRUxELAotICBETlRUX1RZUEVfVkFSSUFOVCwKLSAgRE5UVF9UWVBFX0ZJTEUsCi0gIEROVFRfVFlQRV9GVU5DVFlQRSwKLSAgRE5UVF9UWVBFX1dJVEgsCi0gIEROVFRfVFlQRV9DT01NT04sCi0gIEROVFRfVFlQRV9DT0JTVFJVQ1QsCi0gIEROVFRfVFlQRV9YUkVGLAotICBETlRUX1RZUEVfU0EsCi0gIEROVFRfVFlQRV9NQUNSTywKLSAgRE5UVF9UWVBFX0JMT0NLREFUQSwKLSAgRE5UVF9UWVBFX0NMQVNTX1NDT1BFLAotICBETlRUX1RZUEVfUkVGRVJFTkNFLAotICBETlRUX1RZUEVfUFRSTUVNLAotICBETlRUX1RZUEVfUFRSTUVNRlVOQywKLSAgRE5UVF9UWVBFX0NMQVNTLAotICBETlRUX1RZUEVfR0VORklFTEQsCi0gIEROVFRfVFlQRV9WRlVOQywKLSAgRE5UVF9UWVBFX01FTUFDQ0VTUywKLSAgRE5UVF9UWVBFX0lOSEVSSVRBTkNFLAotICBETlRUX1RZUEVfRlJJRU5EX0NMQVNTLAotICBETlRUX1RZUEVfRlJJRU5EX0ZVTkMsCi0gIEROVFRfVFlQRV9NT0RJRklFUiwKLSAgRE5UVF9UWVBFX09CSkVDVF9JRCwKLSAgRE5UVF9UWVBFX01FTUZVTkMsCi0gIEROVFRfVFlQRV9URU1QTEFURSwKLSAgRE5UVF9UWVBFX1RFTVBMQVRFX0FSRywKLSAgRE5UVF9UWVBFX0ZVTkNfVEVNUExBVEUsCi0gIEROVFRfVFlQRV9MSU5LLAotICBETlRUX1RZUEVfRFlOX0FSUkFZX0RFU0MsCi0gIEROVFRfVFlQRV9ERVNDX1NVQlJBTkdFLAotICBETlRUX1RZUEVfQkVHSU5fRVhULAotICBETlRUX1RZUEVfSU5MTiwKLSAgRE5UVF9UWVBFX0lOTE5fTElTVCwKLSAgRE5UVF9UWVBFX0FMSUFTLAotICBETlRUX1RZUEVfRE9DX0ZVTkNUSU9OLAotICBETlRUX1RZUEVfRE9DX01FTUZVTkMsCi0gIEROVFRfVFlQRV9NQVgKLX07Ci0KLS8qIEROVFRfVFlQRV9TUkNGSUxFOgotCi0gICBPbmUgRE5UVF9UWVBFX1NSQ0ZJTEUgc3ltYm9sIGlzIG91dHB1dCBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlCi0gICBmaWxlIGFuZCBhdCB0aGUgYmVnaW4gYW5kIGVuZCBvZiBhbiBpbmNsdWRlZCBmaWxlLiAgQSBETlRUX1RZUEVfU1JDRklMRQotICAgZW50cnkgaXMgYWxzbyBvdXRwdXQgYmVmb3JlIGVhY2ggRE5UVF9UWVBFX0ZVTkMgc3ltYm9sIHNvIHRoYXQgZGVidWdnZXJzCi0gICBjYW4gZGV0ZXJtaW5lIHdoYXQgZmlsZSBhIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLgotCi0gICBMQU5HVUFHRSBkZXNjcmliZXMgdGhlIHNvdXJjZSBmaWxlJ3MgbGFuZ3VhZ2UuCi0KLSAgIE5BTUUgcG9pbnRzIHRvIGFuIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgc291cmNlIGZpbGUncyBuYW1lLgotCi0gICBOb3RlIHRoZSBuYW1lIHVzZWQgZm9yIEROVFRfVFlQRV9TUkNGSUxFIGVudHJpZXMgYXJlIGV4YWN0bHkgYXMgc2VlbgotICAgYnkgdGhlIGNvbXBpbGVyIChpZSB0aGV5IG1heSBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSkuICBDIGluY2x1ZGUgZmlsZXMKLSAgIHZpYSA8PiBpbmNsdXNpb24gbXVzdCB1c2UgYWJzb2x1dGUgcGF0aHMuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3NyY2ZpbGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgICAgLyogRE5UVF9UWVBFX1NSQ0ZJTEUgKi8KLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOgk0OwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfTU9EVUxFOgotCi0gICBBIEROVFRfVFlQRV9NT0RVTEUgc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIHRoZSBzdGFydCBvZiBhIHBhc2NhbAotICAgbW9kdWxlIG9yIEMgc291cmNlIGZpbGUuIEEgbW9kdWxlIGluZGljYXRlcyBhIGNvbXBpbGF0aW9uIHVuaXQKLSAgIGZvciBuYW1lLXNjb3BpbmcgcHVycG9zZXM7IGluIHRoYXQgcmVnYXJkIHRoZXJlIHNob3VsZCBiZSAKLSAgIGEgMS0xIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gR0RCICJzeW10YWIiJ3MgYW5kIE1PRFVMRSBzeW1ib2wgcmVjb3Jkcy4KLQotICAgRWFjaCBETlRUX1RZUEVfTU9EVUxFIG11c3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEROVFRfVFlQRV9FTkQgc3ltYm9sLgotCi0gICBOQU1FIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgbW9kdWxlJ3MgbmFtZS4gIE5vdGUgQwotICAgc291cmNlIGZpbGVzIGFyZSBjb25zaWRlcmVkIG5hbWVsZXNzIG1vZHVsZXMuCi0KLSAgIEFMSUFTIHBvaW50IHRvIGEgVlQgZW50cnkgcHJvdmlkaW5nIGEgc2Vjb25kYXJ5IG5hbWUuCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX21vZHVsZQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOyAJLyogRE5UVF9UWVBFX01PRFVMRSAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICB2dHBvaW50ZXIgYWxpYXM7Ci0gIGRudHRwb2ludGVyIHVudXNlZDI7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLX07Ci0KLS8qIEROVFRfVFlQRV9GVU5DVElPTiwKLSAgIEROVFRfVFlQRV9FTlRSWSwKLSAgIEROVFRfVFlQRV9CTE9DS0RBVEEsCi0gICBETlRUX1RZUEVfTUVNRlVOQzoKLQotICAgQSBETlRUX1RZUEVfRlVOQ1RJT04gc3ltYm9sIGlzIGVtaXR0ZWQgZm9yIGVhY2ggZnVuY3Rpb24gZGVmaW5pdGlvbjsKLSAgIGEgRE5UVF9UWVBFX0VOVFJZIHN5bWJvbHMgaXMgdXNlZCBmb3Igc2Vjb25kYXJ5IGVudHJ5IHBvaW50cy4gIEJvdGgKLSAgIHN5bWJvbHMgdXNlZCB0aGUgZG50dF90eXBlX2Z1bmN0aW9uIHN0cnVjdHVyZS4KLSAgIEEgRE5UVF9UWVBFX0JMT0NLREFUQSBzeW1ib2wgaXMgZW1pdHRlZCAuLi4/Ci0gICBBIEROVFRfVFlQRV9NRU1GVU5DIHN5bWJvbCBpcyBlbWl0dGVkIGZvciBpbmxpbmVkIG1lbWJlciBmdW5jdGlvbnMgKEMrKykuIAotCi0gICBFYWNoIG9mIEROVFRfVFlQRV9GVU5DVElPTiBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5ELgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgZnVuY3Rpb24gaGFzIGdsb2JhbCBzY29wZS4KLQotICAgTEFOR1VBR0UgZGVzY3JpYmVzIHRoZSBmdW5jdGlvbidzIHNvdXJjZSBsYW5ndWFnZS4KLQotICAgT1BUX0xFVkVMIGRlc2NyaWJlcyB0aGUgb3B0aW1pemF0aW9uIGxldmVsIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQKLSAgIHdpdGguCi0KLSAgIFZBUkFSR1MgaXMgbm9uemVybyBpZiB0aGUgZnVuY3Rpb24gdXNlcyB2YXJhcmdzLgotCi0gICBOQU1FIHBvaW50cyB0byBhIFZUIGVudHJ5IHByb3ZpZGluZyB0aGUgZnVuY3Rpb24ncyBuYW1lLgotCi0gICBBTElBUyBwb2ludHMgdG8gYSBWVCBlbnRyeSBwcm92aWRpbmcgYSBzZWNvbmRhcnkgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uLgotCi0gICBGSVJTVFBBUkFNIHBvaW50cyB0byBhIExOVFQgZW50cnkgd2hpY2ggZGVzY3JpYmVzIHRoZSBwYXJhbWV0ZXIgbGlzdC4KLQotICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCi0gICBtYXkgYmUgZGV0ZXJtaW5lZC4KLQotICAgRU5UUllBRERSIGlzIHRoZSBtZW1vcnkgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRoZSB0aGUgZnVuY3Rpb24ncyBlbnRyeSBwb2ludAotCi0gICBSRVRWQUwgcG9pbnRzIHRvIGEgTE5UVCBlbnRyeSBkZXNjcmliaW5nIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4KLQotICAgTE9XQUREUiBpcyB0aGUgbG93ZXN0IG1lbW9yeSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZ1bmN0aW9uLgotCi0gICBISUFERFIgaXMgdGhlIGhpZ2hlc3QgbWVtb3J5IGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkJMTA7CS8qIEROVFRfVFlQRV9GVU5DVElPTiwKLQkJCQkgICAgICAgICAgIEROVFRfVFlQRV9FTlRSWSwKLQkJCQkJICAgRE5UVF9UWVBFX0JMT0NLREFUQQotCQkJCQkgICBvciBETlRUX1RZUEVfTUVNRlVOQyAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOgk0OwotICB1bnNpZ25lZCBpbnQgbmVzdF9sZXZlbDoJNTsKLSAgdW5zaWduZWQgaW50IG9wdF9sZXZlbDoJMjsKLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6CQkxOwotICB1bnNpZ25lZCBpbnQgbGFuZ19pbmZvOgk0OwotICB1bnNpZ25lZCBpbnQgaW5saW5lZDoJCTE7Ci0gIHVuc2lnbmVkIGludCBsb2NhbGFsbG9jOgkxOwotICB1bnNpZ25lZCBpbnQgZXhwYW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHZ0cG9pbnRlciBhbGlhczsKLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbTsKLSAgc2x0cG9pbnRlciBhZGRyZXNzOwotICBDT1JFX0FERFIgZW50cnlhZGRyOwotICBkbnR0cG9pbnRlciByZXR2YWw7Ci0gIENPUkVfQUREUiBsb3dhZGRyOwotICBDT1JFX0FERFIgaGlhZGRyOwotfTsKLQotLyogRE5UVF9UWVBFX0JFR0lOOgotCi0gICBBIEROVFRfVFlQRV9CRUdJTiBzeW1ib2wgaXMgZW1pdHRlZCB0byBiZWdpbiBhIG5ldyBuZXN0ZWQgc2NvcGUuCi0gICBFdmVyeSBETlRUX1RZUEVfQkVHSU4gc3ltYm9sIG11c3QgaGF2ZSBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sLgotCi0gICBDTEFTU0ZMQUcgaXMgbm9uemVybyBpZiB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgYSBjKysgY2xhc3MgZGVmaW5pdGlvbi4KLQotICAgQUREUkVTUyBwb2ludHMgdG8gYW4gU0xUIGVudHJ5IGZyb20gd2hpY2ggbGluZSBudW1iZXIgYW5kIGNvZGUgbG9jYXRpb25zCi0gICBtYXkgYmUgZGV0ZXJtaW5lZC4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfYmVnaW4KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGNsYXNzZmxhZzoJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIwOwotICBzbHRwb2ludGVyIGFkZHJlc3M7Ci19OwotCi0vKiBETlRUX1RZUEVfRU5EOgotCi0gICBBIEROVFRfVFlQRV9FTkQgc3ltYm9sIGlzIGVtaXR0ZWQgd2hlbiBjbG9zaW5nIGEgc2NvcGUgc3RhcnRlZCBieQotICAgYSBETlRUX1RZUEVfTU9EVUxFLCBETlRUX1RZUEVfRlVOQ1RJT04sIEROVFRfVFlQRV9XSVRILAotICAgRE5UVF9UWVBFX0NPTU1PTiwgRE5UVF9UWVBFX0JFR0lOLCBhbmQgRE5UVF9UWVBFX0NMQVNTX1NDT1BFIHN5bWJvbHMuCi0KLSAgIEVOREtJTkQgZGVzY3JpYmVzIHdoYXQgdHlwZSBvZiBzY29wZSB0aGUgRE5UVF9UWVBFX0VORCBpcyBjbG9zaW5nCi0gICAob25lIG9mIHRoZSBhYm92ZSA2IGtpbmRzKS4KLQotICAgQ0xBU1NGTEFHIGlzIG5vbnplcm8gaWYgdGhpcyBpcyB0aGUgZW5kIG9mIGEgYysrIGNsYXNzIGRlZmluaXRpb24uCi0KLSAgIEFERFJFU1MgcG9pbnRzIHRvIGFuIFNMVCBlbnRyeSBmcm9tIHdoaWNoIGxpbmUgbnVtYmVyIGFuZCBjb2RlIGxvY2F0aW9ucwotICAgbWF5IGJlIGRldGVybWluZWQuCi0KLSAgIEJFR0lOU0NPUEUgcG9pbnRzIHRvIHRoZSBMTlRUIGVudHJ5IHdoaWNoIG9wZW5lZCB0aGUgc2NvcGUuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2VuZAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgZW5ka2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgY2xhc3NmbGFnOgkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTA7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLSAgZG50dHBvaW50ZXIgYmVnaW5zY29wZTsKLX07Ci0KLS8qIEROVFRfVFlQRV9JTVBPUlQgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfTEFCRUwgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0KLS8qIEROVFRfVFlQRV9GUEFSQU06Ci0KLSAgIEEgRE5UVF9UWVBFX0ZQQVJBTSBzeW1ib2wgaXMgZW1pdHRlZCBmb3IgYSBmdW5jdGlvbiBhcmd1bWVudC4gIFdoZW4KLSAgIGNoYWluZWQgdG9nZXRoZXIgdGhlIHN5bWJvbHMgcmVwcmVzZW50IGFuIGFyZ3VtZW50IGxpc3QgZm9yIGEgZnVuY3Rpb24uCi0KLSAgIFJFR1BBUkFNIGlzIG5vbnplcm8gaWYgdGhpcyBwYXJhbWV0ZXIgd2FzIHBhc3NlZCBpbiBhIHJlZ2lzdGVyLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoaXMgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyCi0gICAocGFzcyBieSByZWZlcmVuY2Ugb3IgcGFzcyBieSB2YWx1ZSBmb3IgbGFyZ2UgaXRlbXMpLgotCi0gICBMT05HQUREUiBpcyBub256ZXJvIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSA2NGJpdCBwb2ludGVyLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIHBhcmFtZXRlcidzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIGRlc2NyaWJlcyB3aGVyZSB0aGUgcGFyYW1ldGVyIGlzIHN0b3JlZC4gIERlcGVuZGluZyBvbiB0aGUKLSAgIHBhcmFtZXRlciB0eXBlIExPQ0FUSU9OIGNvdWxkIGJlIGEgcmVnaXN0ZXIgbnVtYmVyLCBvciBhbiBvZmZzZXQKLSAgIGZyb20gdGhlIHN0YWNrIHBvaW50ZXIuCi0KLSAgIFRZUEUgcG9pbnRzIHRvIGEgTlRUIGVudHJ5IGRlc2NyaWJpbmcgdGhlIHR5cGUgb2YgdGhpcyBwYXJhbWV0ZXIuCi0KLSAgIE5FWFRQQVJBTSBwb2ludHMgdG8gdGhlIExOVFQgZW50cnkgZGVzY3JpYmluZyB0aGUgbmV4dCBwYXJhbWV0ZXIuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZwYXJhbQotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgcmVncGFyYW06CTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOgkxOwotICB1bnNpZ25lZCBpbnQgY29weXBhcmFtOgkxOwotICB1bnNpZ25lZCBpbnQgZGZsdDoJCTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNjsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIGludCBsb2NhdGlvbjsKLSAgZG50dHBvaW50ZXIgdHlwZTsKLSAgZG50dHBvaW50ZXIgbmV4dHBhcmFtOwotICBpbnQgbWlzYzsKLX07Ci0KLS8qIEROVFRfVFlQRV9TVkFSOgotCi0gICBBIEROVFRfVFlQRV9TVkFSIGlzIGVtaXR0ZWQgdG8gZGVzY3JpYmUgYSB2YXJpYWJsZSBpbiBzdGF0aWMgc3RvcmFnZS4KLQotICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGhhcyBnbG9iYWwgc2NvcGUuCi0KLSAgIElORElSRUNUIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGEgcG9pbnRlciB0byBhbiBvYmplY3QuCi0KLSAgIExPTkdBRERSIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGluIGxvbmcgcG9pbnRlciBzcGFjZS4KLQotICAgU1RBVElDTUVNIGlzIG5vbnplcm8gaWYgdGhlIHZhcmlhYmxlIGlzIGEgbWVtYmVyIG9mIGEgY2xhc3MuCi0KLSAgIEFfVU5JT04gaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgYW4gYW5vbnltb3VzIHVuaW9uIG1lbWJlci4KLQotICAgTkFNRSBpcyBhIHBvaW50ZXIgaW50byB0aGUgVlQgZm9yIHRoZSB2YXJpYWJsZSdzIG5hbWUuCi0KLSAgIExPQ0FUSU9OIHByb3ZpZGVzIHRoZSBtZW1vcnkgYWRkcmVzcyBmb3IgdGhlIHZhcmlhYmxlLgotCi0gICBUWVBFIGlzIGEgcG9pbnRlciBpbnRvIGVpdGhlciB0aGUgR05UVCBvciBMTlRUIHdoaWNoIGRlc2NyaWJlcwotICAgdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfc3ZhcgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IGluZGlyZWN0OgkxOwotICB1bnNpZ25lZCBpbnQgbG9uZ2FkZHI6CTE7Ci0gIHVuc2lnbmVkIGludCBzdGF0aWNtZW06CTE7Ci0gIHVuc2lnbmVkIGludCBhX3VuaW9uOgkJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDE6ICAgICAgICAgMTsKLSAgdW5zaWduZWQgaW50IHRocmVhZF9zcGVjaWZpYzogMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDI6ICAgICAgICAgMTQ7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBDT1JFX0FERFIgbG9jYXRpb247Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBkaXNwbGFjZW1lbnQ7Ci19OwotCi0vKiBETlRUX1RZUEVfRFZBUjoKLQotICAgQSBETlRUX1RZUEVfRFZBUiBpcyBlbWl0dGVkIHRvIGRlc2NyaWJlIGF1dG9tYXRpYyB2YXJpYWJsZXMgYW5kIHZhcmlhYmxlcwotICAgaGVsZCBpbiByZWdpc3RlcnMuCi0KLSAgIEdMT0JBTCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBoYXMgZ2xvYmFsIHNjb3BlLgotCi0gICBJTkRJUkVDVCBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0LgotCi0gICBSRUdWQVIgaXMgbm9uemVybyBpZiB0aGUgdmFyaWFibGUgaXMgaW4gYSByZWdpc3Rlci4KLQotICAgQV9VTklPTiBpcyBub256ZXJvIGlmIHRoZSB2YXJpYWJsZSBpcyBhbiBhbm9ueW1vdXMgdW5pb24gbWVtYmVyLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIHZhcmlhYmxlJ3MgbmFtZS4KLQotICAgTE9DQVRJT04gcHJvdmlkZXMgdGhlIG1lbW9yeSBhZGRyZXNzIG9yIHJlZ2lzdGVyIG51bWJlciBmb3IgdGhlIHZhcmlhYmxlLgotCi0gICBUWVBFIGlzIGEgcG9pbnRlciBpbnRvIGVpdGhlciB0aGUgR05UVCBvciBMTlRUIHdoaWNoIGRlc2NyaWJlcwotICAgdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZHZhcgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOgkJMTsKLSAgdW5zaWduZWQgaW50IGluZGlyZWN0OgkxOwotICB1bnNpZ25lZCBpbnQgcmVndmFyOgkJMTsKLSAgdW5zaWduZWQgaW50IGFfdW5pb246CQkxOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTc7Ci0gIHZ0cG9pbnRlciBuYW1lOwotICBpbnQgbG9jYXRpb247Ci0gIGRudHRwb2ludGVyIHR5cGU7Ci0gIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci19OwotCi0vKiBETlRUX1RZUEVfQ09OU1Q6Ci0KLSAgIEEgRE5UVF9UWVBFX0NPTlNUIHN5bWJvbCBpcyBlbWl0dGVkIGZvciBwcm9ncmFtIGNvbnN0YW50cy4KLQotICAgR0xPQkFMIGlzIG5vbnplcm8gaWYgdGhlIGNvbnN0YW50IGhhcyBnbG9iYWwgc2NvcGUuCi0KLSAgIElORElSRUNUIGlzIG5vbnplcm8gaWYgdGhlIGNvbnN0YW50IGlzIGEgcG9pbnRlciB0byBhbiBvYmplY3QuCi0KLSAgIExPQ0FUSU9OX1RZUEUgZGVzY3JpYmVzIHdoZXJlIHRvIGZpbmQgdGhlIGNvbnN0YW50J3MgdmFsdWUKLSAgIChpbiB0aGUgVlQsIG1lbW9yeSwgb3IgZW1iZWRkZWQgaW4gYW4gaW5zdHJ1Y3Rpb24pLgotCi0gICBDTEFTU01FTSBpcyBub256ZXJvIGlmIHRoZSBjb25zdGFudCBpcyBhIG1lbWJlciBvZiBhIGNsYXNzLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIGNvbnN0YW50J3MgbmFtZS4KLQotICAgTE9DQVRJT04gcHJvdmlkZXMgdGhlIG1lbW9yeSBhZGRyZXNzLCByZWdpc3RlciBudW1iZXIgb3IgcG9pbnRlcgotICAgaW50byB0aGUgVlQgZm9yIHRoZSBjb25zdGFudCdzIHZhbHVlLgotCi0gICBUWVBFIGlzIGEgcG9pbnRlciBpbnRvIGVpdGhlciB0aGUgR05UVCBvciBMTlRUIHdoaWNoIGRlc2NyaWJlcwotICAgdGhlIHR5cGUgb2YgdGhpcyB2YXJpYWJsZS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfY29uc3QKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IGdsb2JhbDoJCTE7Ci0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDoJMTsKLSAgdW5zaWduZWQgaW50OgkJCTM7Ci0gIHVuc2lnbmVkIGludCBjbGFzc21lbToJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE1OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgQ09SRV9BRERSIGxvY2F0aW9uOwotICBkbnR0cG9pbnRlciB0eXBlOwotICB1bnNpZ25lZCBpbnQgb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgZGlzcGxhY2VtZW50OwotfTsKLQotLyogRE5UVF9UWVBFX1RZUEVERUYgYW5kIEROVFRfVFlQRV9UQUdERUY6Ci0KLSAgIFRoZSBzYW1lIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlc2NyaWJlIHR5cGVkZWZzIGFuZCB0YWdkZWZzLgotCi0gICBETlRUX1RZUEVfVFlQRURFRlMgYXJlIGFzc29jaWF0ZWQgd2l0aCBDICJ0eXBlZGVmcyIuCi0KLSAgIEROVFRfVFlQRV9UQUdERUZzIGFyZSBhc3NvY2lhdGVkIHdpdGggQyAic3RydWN0IiwgInVuaW9uIiwgYW5kICJlbnVtIgotICAgdGFncywgd2hpY2ggbWF5IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBhIHR5cGVkZWYgaW4gdGhlIHNhbWUgc2NvcGUuCi0gICBBbHNvIHRoZXkgYXJlIGFzc29jaWF0ZWQgd2l0aCBDKysgImNsYXNzIiB0YWdzLCB3aGljaCBpbXBsaWNpdGx5IGhhdmUgCi0gICB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjbGFzcyB0eXBlLgotCi0gICBHTE9CQUwgaXMgbm9uemVybyBpZiB0aGUgdHlwZWRlZi90YWdkZWYgaGFzIGdsb2JhbCBzY29wZS4KLQotICAgVFlQRUlORk8gaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgZnVsbCB0eXBlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZQotICAgZm9yIGEgdGFnLiAgKHVzdWFsbHkgMSwgYnV0IGNhbiBiZSB6ZXJvIGZvciBvcGFxdWUgdHlwZXMgaW4gQykuCi0KLSAgIE5BTUUgaXMgYSBwb2ludGVyIGludG8gdGhlIFZUIGZvciB0aGUgY29uc3RhbnQncyBuYW1lLgotCi0gICBUWVBFIHBvaW50cyB0byB0aGUgdW5kZXJseWluZyB0eXBlIGZvciB0aGUgdHlwZWRlZi90YWdkZWYgaW4gdGhlCi0gICBHTlRUIG9yIExOVFQuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3R5cGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgICAgLyogRE5UVF9UWVBFX1RZUEVERUYgb3IgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETlRUX1RZUEVfVEFHREVGIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBnbG9iYWw6CQkxOwotICB1bnNpZ25lZCBpbnQgdHlwZWluZm86CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxOTsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIGRudHRwb2ludGVyIHR5cGU7ICAgICAgICAgICAgICAgICAgICAvKiBVbmRlcmx5aW5nIHR5cGUsIHdoaWNoIGZvciBUQUdERUYncyBtYXkgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEROVFRfVFlQRV9TVFJVQ1QsIEROVFRfVFlQRV9VTklPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEROVFRfVFlQRV9FTlVNLCBvciBETlRUX1RZUEVfQ0xBU1MuIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogRm9yIFRZUEVERUYncyBvdGhlciB1bmRlcmx5aW5nIHR5cGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcmUgYWxzbyBwb3NzaWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfTsKLQotLyogRE5UVF9UWVBFX1BPSU5URVI6Ci0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgYSBwb2ludGVyIHRvIGFuIHVuZGVybHlpbmcgdHlwZS4KLQotICAgUE9JTlRTVE8gaXMgYSBwb2ludGVyIGludG8gdGhlIEdOVFQgb3IgTE5UVCBmb3IgdGhlIHR5cGUgd2hpY2ggdGhpcwotICAgcG9pbnRlciBwb2ludHMgdG8uCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwb2ludGVyIChub3QgdGhlIHVuZGVybHlpbmcgdHlwZSkuICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfcG9pbnRlcgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJCTEwOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIGRudHRwb2ludGVyIHBvaW50c3RvOwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotCi0vKiBETlRUX1RZUEVfRU5VTToKLQotICAgVXNlZCB0byBkZXNjcmliZSBlbnVtZXJhdGVkIHR5cGVzLgotCi0gICBGSVJTVE1FTSBpcyBhIHBvaW50ZXIgdG8gYSBETlRUX1RZUEVfTUVNRU5VTSBpbiB0aGUgR05UVC9MTlRUIHdoaWNoCi0gICBkZXNjcmliZXMgdGhlIGZpcnN0IG1lbWJlciAoYW5kIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgY2hhaW4gb2YKLSAgIG1lbWJlcnMpLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gaG9sZCB0aGUgdmFsdWVzIG9mIHRoZSBlbnVtJ3MKLSAgIG1lbWJlcnMuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2VudW0KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMjE7Ci0gIGRudHRwb2ludGVyIGZpcnN0bWVtOwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotLyogRE5UVF9UWVBFX01FTUVOVU0KLQotICAgVXNlZCB0byBkZXNjcmliZSBtZW1iZXJzIG9mIGFuIGVudW1lcmF0ZWQgdHlwZS4KLQotICAgQ0xBU1NNRU0gaXMgbm9uemVybyBpZiB0aGlzIG1lbWJlciBpcyBwYXJ0IG9mIGEgY2xhc3MuCi0KLSAgIE5BTUUgcG9pbnRzIGludG8gdGhlIFZUIGZvciB0aGUgbmFtZSBvZiB0aGlzIG1lbWJlci4KLQotICAgVkFMVUUgaXMgdGhlIHZhbHVlIG9mIHRoaXMgZW51bWVyYXRpb24gbWVtYmVyLgotCi0gICBORVhUTUVNIHBvaW50cyB0byB0aGUgbmV4dCBETlRUX1RZUEVfTUVNRU5VTSBpbiB0aGUgY2hhaW4uICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX21lbWVudW0KLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgY2xhc3NtZW06CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMDsKLSAgdnRwb2ludGVyIG5hbWU7Ci0gIHVuc2lnbmVkIGludCB2YWx1ZTsKLSAgZG50dHBvaW50ZXIgbmV4dG1lbTsKLX07Ci0KLS8qIEROVFRfVFlQRV9TRVQKLQotICAgVXNlZCB0byBkZXNjcmliZSBQQVNDQUwgInNldCIgdHlwZS4KLQotICAgREVDTEFSQVRJT04gZGVzY3JpYmVzIHRoZSBiaXRwYWNraW5nIG9mIHRoZSBzZXQuCi0KLSAgIFNVQlRZUEUgcG9pbnRzIHRvIGEgRE5UVCBlbnRyeSBkZXNjcmliaW5nIHRoZSB0eXBlIG9mIHRoZSBtZW1iZXJzLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIHNpemUgb2YgdGhlIHNldC4gICovIAotCi1zdHJ1Y3QgZG50dF90eXBlX3NldAotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCBkZWNsYXJhdGlvbjoJMjsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE5OwotICBkbnR0cG9pbnRlciBzdWJ0eXBlOwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotLyogRE5UVF9UWVBFX1NVQlJBTkdFCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgc3VicmFuZ2UgdHlwZS4KLQotICAgRFlOX0xPVyBkZXNjcmliZXMgdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSBzdWJyYW5nZToKLQotICAgICAwMCBmb3IgYSBjb25zdGFudCBsb3dlciBib3VuZCAoZm91bmQgaW4gTE9XQk9VTkQpLgotCi0gICAgIDAxIGZvciBhIGR5bmFtaWMgbG93ZXIgYm91bmQgd2l0aCB0aGUgbG93ZXIgYm91bmQgZm91bmQgaW4gdGhlIHRoZQotICAgICBtZW1vcnkgYWRkcmVzcyBwb2ludGVkIHRvIGJ5IExPV0JPVU5ELgotCi0gICAgIDEwIGZvciBhIGR5bmFtaWMgbG93ZXIgYm91bmQgZGVzY3JpYmVkIGJ5IGFuIHZhcmlhYmxlIGZvdW5kIGluIHRoZQotICAgICBETlRUL0xOVFQgKExPV0JPVU5EIHdvdWxkIGJlIGEgcG9pbnRlciBpbnRvIHRoZSBETlRUL0xOVFQpLgotCi0gICBEWU5fSElHSCBpcyBzaW1pbGFyIHRvIERZTl9MT1csIGV4Y2VwdCBpdCBkZXNjcmliZXMgdGhlIHVwcGVyIGJvdW5kLgotCi0gICBTVUJUWVBFIHBvaW50cyB0byB0aGUgdHlwZSBvZiB0aGUgc3VicmFuZ2UuCi0KLSAgIEJJVExFTkdUSCBpcyB0aGUgbGVuZ3RoIGluIGJpdHMgbmVlZGVkIHRvIGRlc2NyaWJlIHRoZSBzdWJyYW5nZSdzCi0gICB2YWx1ZXMuICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3N1YnJhbmdlCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGR5bl9sb3c6CQkyOwotICB1bnNpZ25lZCBpbnQgZHluX2hpZ2g6CTI7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNzsKLSAgaW50IGxvd2JvdW5kOwotICBpbnQgaGlnaGJvdW5kOwotICBkbnR0cG9pbnRlciBzdWJ0eXBlOwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotLyogRE5UVF9UWVBFX0FSUkFZCi0KLSAgIFVzZWQgdG8gZGVzY3JpYmUgYW4gYXJyYXkgdHlwZS4KLQotICAgREVDTEFSQVRJT04gZGVzY3JpYmVzIHRoZSBiaXQgcGFja2luZyB1c2VkIGluIHRoZSBhcnJheS4KLQotICAgQVJSQVlJU0JZVEVTIGlzIG5vbnplcm8gaWYgdGhlIGZpZWxkIGluIGFycmF5bGVuZ3RoIGRlc2NyaWJlcyB0aGUKLSAgIGxlbmd0aCBpbiBieXRlcyByYXRoZXIgdGhhbiBpbiBiaXRzLiAgQSB2YWx1ZSBvZiB6ZXJvIGlzIHVzZWQgdG8KLSAgIGRlc2NyaWJlIGFuIGFycmF5IHdpdGggc2l6ZSAyKiozMi4KLQotICAgRUxFTUlTQllURVMgaXMgbm9uemVybyBpZiB0aGUgbGVuZ3RoIGlmIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkKLSAgIGlzIGRlc2NyaWJlcyBpbiBieXRlcyByYXRoZXIgdGhhbiBiaXRzLiAgQSB2YWx1ZSBvZiB6ZXJvIGlzIHVzZWQKLSAgIHRvIGFuIGVsZW1lbnQgd2l0aCBzaXplIDIqKjMyLgotCi0gICBFTEVNT1JERVIgaXMgbm9uemVybyBpZiB0aGUgZWxlbWVudHMgYXJlIGluZGV4ZWQgaW4gaW5jcmVhc2luZyBvcmRlci4KLQotICAgSlVTVElGSUVEIGlmIHRoZSBlbGVtZW50cyBhcmUgbGVmdCBqdXN0aWZpZWQgdG8gaW5kZXggemVyby4KLQotICAgQVJSQVlMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgYXJyYXkuCi0KLSAgIElOREVYVFlQRSBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgdHlwZSB1c2VkIHRvIGluZGV4IHRoZSBhcnJheS4KLQotICAgRUxFTVRZUEUgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgZm9yIHRoZSBhcnJheSBlbGVtZW50cy4KLQotICAgRUxFTUxFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgKGluY2x1ZGluZwotICAgYW55IHBhZGRpbmcpLgotCi0gICBNdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgYXJlIHJlcHJlc2VudGVkIGJ5IEVMRU1UWVBFIHBvaW50aW5nIHRvCi0gICBhbm90aGVyIEROVFRfVFlQRV9BUlJBWS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfYXJyYXkKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CTEwOwotICB1bnNpZ25lZCBpbnQgZGVjbGFyYXRpb246CTI7Ci0gIHVuc2lnbmVkIGludCBkeW5fbG93OgkJMjsKLSAgdW5zaWduZWQgaW50IGR5bl9oaWdoOgkyOwotICB1bnNpZ25lZCBpbnQgYXJyYXlpc2J5dGVzOgkxOwotICB1bnNpZ25lZCBpbnQgZWxlbWlzYnl0ZXM6CTE7Ci0gIHVuc2lnbmVkIGludCBlbGVtb3JkZXI6CTE7Ci0gIHVuc2lnbmVkIGludCBqdXN0aWZpZWQ6CTE7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxMTsKLSAgdW5zaWduZWQgaW50IGFycmF5bGVuZ3RoOwotICBkbnR0cG9pbnRlciBpbmRleHR5cGU7Ci0gIGRudHRwb2ludGVyIGVsZW10eXBlOwotICB1bnNpZ25lZCBpbnQgZWxlbWxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9TVFJVQ1QKLQotICAgRE5UVF9UWVBFX1NUUlVDVCBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgQyBzdHJ1Y3R1cmUuCi0KLSAgIERFQ0xBUkFUSU9OIGRlc2NyaWJlcyB0aGUgYml0cGFja2luZyB1c2VkLgotCi0gICBGSVJTVEZJRUxEIGlzIGEgRE5UVCBwb2ludGVyIHRvIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgc3RydWN0dXJlCi0gICAoZWFjaCBmaWVsZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgZmllbGQsIHdhbGsgdGhlIGxpc3QKLSAgIHRvIGFjY2VzcyBhbGwgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmUpLgotCi0gICBWQVJUQUdGSUVMRCBhbmQgVkFSTElTVCBhcmUgdXNlZCBmb3IgUGFzY2FsIHZhcmlhbnQgcmVjb3Jkcy4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYml0cy4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfc3RydWN0Ci17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IGRlY2xhcmF0aW9uOgkyOwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkJMTk7Ci0gIGRudHRwb2ludGVyIGZpcnN0ZmllbGQ7Ci0gIGRudHRwb2ludGVyIHZhcnRhZ2ZpZWxkOwotICBkbnR0cG9pbnRlciB2YXJsaXN0OwotICB1bnNpZ25lZCBpbnQgYml0bGVuZ3RoOwotfTsKLQotLyogRE5UVF9UWVBFX1VOSU9OCi0KLSAgIEROVFRfVFlQRV9VTklPTiBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgQyB1bmlvbi4KLQotICAgRklSU1RGSUVMRCBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWVsZCBjaGFpbi4KLQotICAgQklUTEVOR1RIIGlzIHRoZSBzaXplIG9mIHRoZSB1bmlvbiBpbiBiaXRzLiAgKi8KLQotc3RydWN0IGRudHRfdHlwZV91bmlvbgotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDoJMTA7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkyMTsKLSAgZG50dHBvaW50ZXIgZmlyc3RmaWVsZDsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLX07Ci0KLS8qIEROVFRfVFlQRV9GSUVMRAotCi0gICBETlRUX1RZUEVfRklFTEQgZGVzY3JpYmVzIG9uZSBmaWVsZCBpbiBhIHN0cnVjdHVyZSBvciB1bmlvbgotICAgb3IgQysrIGNsYXNzLgotCi0gICBWSVNJQklMSVRZIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHZpc2liaWxpdHkgb2YgdGhlIGZpZWxkCi0gICAoZm9yIGMrKy4gIHB1YmxpYyA9IDAsIHByb3RlY3RlZCA9IDEsIHByaXZhdGUgPSAyKS4KLQotICAgQV9VTklPTiBpcyBub256ZXJvIGlmIHRoaXMgZmllbGQgaXMgYSBtZW1iZXIgb2YgYW4gYW5vbnltb3VzIHVuaW9uLgotCi0gICBTVEFUSUNNRU0gaXMgbm9uemVybyBpZiB0aGlzIGZpZWxkIGlzIGEgc3RhdGljIG1lbWJlciBvZiBhIHRlbXBsYXRlLgotCi0gICBOQU1FIGlzIGEgcG9pbnRlciBpbnRvIHRoZSBWVCBmb3IgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotCi0gICBCSVRPRkZTRVQgZ2l2ZXMgdGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkIGluIGJpdHMgZnJvbSB0aGUgYmVnaW5uaW5nCi0gICBvZiB0aGUgc3RydWN0dXJlIG9yIHVuaW9uIHRoaXMgZmllbGQgaXMgYSBtZW1iZXIgb2YuCi0KLSAgIFRZUEUgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgZGVzY3JpYmluZyB0aGlzIGZpZWxkLgotCi0gICBCSVRMRU5HVEggaXMgdGhlIHNpemUgb2YgdGhlIGVudHJ5IGluIGJpdHMuCi0KLSAgIE5FWFRGSUVMRCBpcyBhIEROVFQgcG9pbnRlciB0byB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgY2hhaW4uICAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2ZpZWxkCi17Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246CTE7Ci0gIHVuc2lnbmVkIGludCBraW5kOgkxMDsKLSAgdW5zaWduZWQgaW50IHZpc2liaWxpdHk6CTI7Ci0gIHVuc2lnbmVkIGludCBhX3VuaW9uOgkJMTsKLSAgdW5zaWduZWQgaW50IHN0YXRpY21lbToJMTsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTE3OwotICB2dHBvaW50ZXIgbmFtZTsKLSAgdW5zaWduZWQgaW50IGJpdG9mZnNldDsKLSAgZG50dHBvaW50ZXIgdHlwZTsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLSAgZG50dHBvaW50ZXIgbmV4dGZpZWxkOwotfTsKLQotLyogRE5UVF9UWVBFX1ZBUklBTlQgaXMgdW51c2VkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfRklMRSBpcyB1bnVzZWQgYnkgR0RCLiAgKi8KLQotLyogRE5UVF9UWVBFX0ZVTkNUWVBFCi0KLSAgIEkgdGhpbmsgdGhpcyBpcyB1c2VkIHRvIGRlc2NyaWJlIGEgZnVuY3Rpb24gdHlwZSAoZS5nLiwgd291bGQKLSAgIGJlIGVtaXR0ZWQgYXMgcGFydCBvZiBhIGZ1bmN0aW9uLXBvaW50ZXIgZGVzY3JpcHRpb24pLgotCi0gICBWQVJBUkdTIGlzIG5vbnplcm8gaWYgdGhpcyBmdW5jdGlvbiB1c2VzIHZhcmFyZ3MuCi0KLSAgIEZJUlNUUEFSQU0gaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBwYXJhbWV0ZXIKLSAgIGNoYWluLgotCi0gICBSRVRWQUwgaXMgYSBETlRUIHBvaW50ZXIgdG8gdGhlIHR5cGUgb2YgdGhlIHJldHVybiB2YWx1ZS4gICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZnVuY3R5cGUKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsKLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsKLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6CQkxOwotICB1bnNpZ25lZCBpbnQgaW5mbzoJCTQ7Ci0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CQkxNjsKLSAgdW5zaWduZWQgaW50IGJpdGxlbmd0aDsKLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbTsKLSAgZG50dHBvaW50ZXIgcmV0dmFsOwotfTsKLQotLyogRE5UVF9UWVBFX1dJVEggaXMgZW1pdHRlZCBieSBDKysgdG8gaW5kaWNhdGUgIndpdGgiIHNjb3Bpbmcgc2VtYW50aWNzLgotICAgKFByb2JhYmx5IGFsc28gZW1pdHRlZCBieSBQQVNDQUwgdG8gc3VwcG9ydCAid2l0aCIuLi4pLgotICAgCi0gICBDKysgZXhhbXBsZTogU2F5ICJtZW1mdW5jIiBpcyBhIG1ldGhvZCBvZiBjbGFzcyAiYyIsIGFuZCBzYXkKLSAgICJtIiBpcyBhIGRhdGEgbWVtYmVyIG9mIGNsYXNzICJjIi4gVGhlbiBmcm9tIHdpdGhpbiAibWVtZnVuYyIsCi0gICBpdCBpcyBsZWdhbCB0byByZWZlcmVuY2UgIm0iIGRpcmVjdGx5IChlLmcuIHlvdSBkb24ndCBoYXZlIHRvCi0gICBzYXkgInRoaXMtPm0iLiBUaGUgc3ltYm9sIHRhYmxlIGluZGljYXRlcwotICAgdGhpcyBieSBlbWl0dGluZyBhIEROVFRfVFlQRV9XSVRIIHN5bWJvbCB3aXRoaW4gdGhlIGZ1bmN0aW9uICJtZW1mdW5jIiwKLSAgIHBvaW50aW5nIHRvIHRoZSB0eXBlIHN5bWJvbCBmb3IgY2xhc3MgImMiLgotIAotICAgSW4gR0RCLCB0aGlzIHN5bWJvbCByZWNvcmQgaXMgdW5uZWNlc3NhcnksIAotICAgYmVjYXVzZSBHREIncyBzeW1ib2wgbG9va3VwIGFsZ29yaXRobQotICAgaW5mZXJzIHRoZSAid2l0aCIgc2VtYW50aWNzIHdoZW4gaXQgc2VlcyBhICJ0aGlzIiBhcmd1bWVudCB0byB0aGUgbWVtYmVyCi0gICBmdW5jdGlvbi4gU28gR0RCIGNhbiBzYWZlbHkgaWdub3JlIHRoZSBETlRUX1RZUEVfV0lUSCByZWNvcmQuCi0KLSAgIEEgRE5UVF9UWVBFX1dJVEggaGFzIGEgbWF0Y2hpbmcgRE5UVF9UWVBFX0VORCBzeW1ib2wgCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV93aXRoIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjoJMTsgICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6CQkxMDsgICAvKiBhbHdheXMgRE5UVF9UWVBFX1dJVEggKi8KLSAgdW5zaWduZWQgaW50IGFkZHJ0eXBlOiAgCTI7ICAgIC8qIDAgPT4gU1RBVFRZUEUgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSA9PiBEWU5UWVBFICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyID0+IFJFR1RZUEUgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDogCTE7ICAgIC8qIDEgPT4gcG9pbnRlciB0byBvYmplY3QgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxvbmdhZGRyOiAgCTE7ICAgIC8qIDEgPT4gaW4gbG9uZyBwb2ludGVyIHNwYWNlICAgKi8KLSAgdW5zaWduZWQgaW50IG5lc3RsZXZlbDogCTY7ICAgIC8qICMgb2YgbmVzdGluZyBsZXZlbHMgYmFjayAgICAgKi8KLSAgdW5zaWduZWQgaW50IGRvY19yYW5nZXM6IAkxOyAgICAvKiAxID0+IGxvY2F0aW9uIGlzIHJhbmdlIGxpc3QgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6ICAgCTEwOwotICBsb25nIGxvY2F0aW9uOyAgICAgICAJCSAgICAgIC8qIHdoZXJlIHN0b3JlZCAoYWxsb2NhdGVkKSAgICAgKi8KLSAgc2x0cG9pbnRlciBhZGRyZXNzOwotICBkbnR0cG9pbnRlciB0eXBlOyAgICAgICAgICAgICAgICAgICAvKiB0eXBlIG9mIHdpdGggZXhwcmVzc2lvbiAgICAgICovCi0gIHZ0cG9pbnRlciBuYW1lOyAgICAgICAgICAgICAgICAgICAgIC8qIG5hbWUgb2Ygd2l0aCBleHByZXNzaW9uICAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyAgb2Zmc2V0OyAgICAgICAgICAgICAgLyogYnl0ZSBvZmZzZXQgZnJvbSBsb2NhdGlvbiAgICAqLwotfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0vKiBETlRUX1RZUEVfQ09NTU9OIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBBIEROVFRfVFlQRV9DT01NT04gc3ltYm9sIG11c3QgaGF2ZSBhIG1hdGNoaW5nIEROVFRfVFlQRV9FTkQgc3ltYm9sICovCi0KLS8qIEROVFRfVFlQRV9DT0JTVFJVQ1QgaXMgdW5zdXBwb3J0ZWQgYnkgR0RCLiAgKi8KLS8qIEROVFRfVFlQRV9YUkVGIGlzIHVuc3VwcG9ydGVkIGJ5IEdEQi4gICovCi0vKiBETlRUX1RZUEVfU0EgaXMgdW5zdXBwb3J0ZWQgYnkgR0RCLiAgKi8KLS8qIEROVFRfVFlQRV9NQUNSTyBpcyB1bnN1cHBvcnRlZCBieSBHREIgKi8KLQotLyogRE5UVF9UWVBFX0JMT0NLREFUQSBoYXMgdGhlIHNhbWUgc3RydWN0dXJlIGFzIEROVFRfVFlQRV9GVU5DVElPTiAqLwotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSB0aGUgQysrIHNwZWNpZmljIFNPTSByZWNvcmRzICovCi0KLS8qICBUaGUgcHVycG9zZSBvZiB0aGUgRE5UVF9UWVBFX0NMQVNTX1NDT1BFIGlzIHRvIGJyYWNrZXQgQysrIG1ldGhvZHMKLSAgICBhbmQgaW5kaWNhdGUgdGhlIG1ldGhvZCBuYW1lIGJlbG9uZ3MgaW4gdGhlICJjbGFzcyBzY29wZSIgcmF0aGVyCi0gICAgdGhhbiBpbiB0aGUgbW9kdWxlIHRoZXkgYXJlIGJlaW5nIGRlZmluZWQgaW4uIEZvciBleGFtcGxlOgotCi0gICAgY2xhc3MgYyB7Ci0gICAgLi4uCi0gICAgdm9pZCBtZW1mdW5jKCk7IC8vIG1lbWJlciBmdW5jdGlvbgotICAgIH07Ci0KLSAgICB2b2lkIGM6Om1lbWZ1bmMoKSAgIC8vIGRlZmluaXRpb24gb2YgY2xhc3MgYydzICJtZW1mdW5jIgotICAgIHsKLSAgICAuLi4KLSAgICB9Ci0KLSAgICBtYWluKCkKLSAgICB7Ci0gICAgLi4uCi0gICAgfQotCi0gICAgSW4gdGhlIGFib3ZlLCB0aGUgbmFtZSAibWVtZnVuYyIgaXMgbm90IGRpcmVjdGx5IHZpc2libGUgZnJvbSAibWFpbiIuCi0gICAgSS5lLiwgeW91IGhhdmUgdG8gc2F5ICJicmVhayBjOjptZW1mdW5jIi4KLSAgICBJZiBpdCB3ZXJlIGEgbm9ybWFsIGZ1bmN0aW9uIChub3QgYSBtZXRob2QpLCBpdCB3b3VsZCBiZSB2aXNpYmxlCi0gICAgdmlhIHRoZSBzaW1wbGUgImJyZWFrIG1lbWZ1bmMiLiBTaW5jZSAibWVtZnVuYyIgb3RoZXJ3aXNlIGxvb2tzCi0gICAgbGlrZSBhIG5vcm1hbCBGVU5DVElPTiBpbiB0aGUgc3ltYm9sIHRhYmxlLCB0aGUgYnJhY2tldGluZwotICAgIENMQVNTX1NDT1BFIGlzIHdoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSBpdCBpcyByZWFsbHkgYSBtZXRob2QuCi0gICAgCi0KLSAgIEEgRE5UVF9UWVBFX0NMQVNTX1NDT1BFIHN5bWJvbCBtdXN0IGhhdmUgYSBtYXRjaGluZyBETlRUX1RZUEVfRU5EIHN5bWJvbCAKLSovCi0KLXN0cnVjdCBkbnR0X3R5cGVfY2xhc3Nfc2NvcGUgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfQ0xBU1NfU0NPUEUgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDogICAgIDIxOyAKLSAgc2x0cG9pbnRlciBhZGRyZXNzICAgICAgICAgOyAgICAvKiBwb2ludGVyIHRvIFNMVCBlbnRyeSAqLwotICBkbnR0cG9pbnRlciB0eXBlICAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIHR5cGUgRE5UVCAqLwotfTsKLQotLyogQysrIHJlZmVyZW5jZSBwYXJhbWV0ZXIuCi0gICBUaGUgc3RydWN0dXJlIG9mIHRoaXMgcmVjb3JkIGlzIHRoZSBzYW1lIGFzIEROVFRfVFlQRV9QT0lOVEVSIC0gCi0gICByZWZlciB0byBzdHJ1Y3QgZG50dF90eXBlX3BvaW50ZXIuCi0gKi8KLQotLyogVGhlIG5leHQgdHdvIGRlc2NyaWJlIEMrKyBwb2ludGVyLXRvLWRhdGEtbWVtYmVyIHR5cGUsIGFuZCAKLSAgIHBvaW50ZXItdG8tbWVtYmVyLWZ1bmN0aW9uIHR5cGUsIHJlc3BlY3RpdmVseS4KLSAgIEROVFRfVFlQRV9QVFJNRU0gYW5kIEROVFRfVFlQRV9QVFJNRU1GVU5DIGhhdmUgdGhlIHNhbWUgc3RydWN0dXJlIAotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfcHRybWVtIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1BUUk1FTSAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgcG9pbnRzdG8JICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIEROVFQgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBtZW10eXBlIAkgICAgIDsgICAgIC8qIHR5cGUgb2YgbWVtYmVyICAgICAgICAgICAgICAgICovCi19OwotCi1zdHJ1Y3QgZG50dF90eXBlX3B0cm1lbWZ1bmMgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfUFRSTUVNRlVOQyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgcG9pbnRzdG8JICAgICA7ICAgICAvKiBwb2ludGVyIHRvIGNsYXNzIEROVFQgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBtZW10eXBlIAkgICAgIDsgICAgIC8qIHR5cGUgb2YgbWVtYmVyICAgICAgICAgICAgICAgICovCi19OwotCi0vKiBUaGUgRE5UVF9UWVBFX0NMQVNTIHN5bWJvbCBpcyBlbWl0dGVkIHRvIGRlc2NyaWJlIGEgY2xhc3MgdHlwZS4KLSAqICJtZW1iZXJsaXN0IiBwb2ludHMgdG8gYSBjaGFpbmVkIGxpc3Qgb2YgRklFTEQgb3IgR0VORklFTEQgcmVjb3JkcwotICogaW5kaWNhdGluZyB0aGUgY2xhc3MgbWVtYmVycy4gInBhcmVudGxpc3QiIHBvaW50cyB0byBhIGNoYWluZWQgbGlzdAotICogb2YgSU5IRVJJVEFOQ0UgcmVjb3JkcyBpbmRpY2F0aW5nIGNsYXNzZXMgZnJvbSB3aGljaCB3ZSBpbmhlcml0Ci0gKiBmaWVsZHMuCi0gKi8KLQotc3RydWN0IGRudHRfdHlwZV9jbGFzcyAKLXsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOyAgICAgLyogYWx3YXlzIDAgKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9DTEFTUyAqLwotICB1bnNpZ25lZCBpbnQgYWJzdHJhY3Q6ICAgIDE7ICAgICAvKiBpcyB0aGlzIGFuIGFic3RyYWN0IGNsYXNzPyAgICAqLwotICB1bnNpZ25lZCBpbnQgY2xhc3NfZGVjbDogIDI7ICAgICAvKiAwPWNsYXNzLDE9dW5pb24sMj1zdHJ1Y3QgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZXhwYW5zaW9uOiAgIDE7ICAgICAvKiAxPXRlbXBsYXRlIGV4cGFuc2lvbiAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOiAgICAgMTc7ICAgICAKLSAgZG50dHBvaW50ZXIgbWVtYmVybGlzdCAgICAgOyAgICAgLyogcHRyIHRvIGNoYWluIG9mIFtHRU5dRklFTERzICovCi0gIHVuc2lnbmVkIGxvbmcgdnRibF9sb2MgICAgIDsgICAgIC8qIG9mZnNldCBpbiBvYmogb2YgcHRyIHRvIHZ0YmwgICovCi0gIGRudHRwb2ludGVyIHBhcmVudGxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBLX0lOSEVSSVRBTkNFIGxpc3QgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgYml0bGVuZ3RoICAgIDsgICAgIC8qIHRvdGFsIGF0IHRoaXMgbGV2ZWwgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIGlkZW50bGlzdCAgICAgIDsgICAgIC8qIHB0ciB0byBjaGFpbiBvZiBjbGFzcyBpZGVudCdzICovCi0gIGRudHRwb2ludGVyIGZyaWVuZGxpc3QgICAgIDsgICAgIC8qIHB0ciB0byBLX0ZSSUVORCBsaXN0ICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHRlbXBsYXRlcHRyICAgIDsgICAgIC8qIHB0ciB0byB0ZW1wbGF0ZSAgICAgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIG5leHRleHAgICAgICAgIDsgICAgIC8qIHB0ciB0byBuZXh0IGV4cGFuc2lvbiAgICAgICAgICovCi19OwotCi0vKiBDbGFzcyBtZW1iZXJzIGFyZSBpbmRpY2F0ZWQgdmlhIGVpdGhlciB0aGUgRklFTEQgcmVjb3JkIChmb3IKLSAgIGRhdGEgbWVtYmVycywgc2FtZSBhcyBmb3IgQyBzdHJ1Y3QgZmllbGRzKSwgb3IgYnkgdGhlIEdFTkZJRUxEIHJlY29yZAotICAgKGZvciBtZW1iZXIgZnVuY3Rpb25zKS4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2dlbmZpZWxkIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0dFTkZJRUxEICovCi0gIHVuc2lnbmVkIGludCB2aXNpYmlsaXR5OiAgMjsgICAgIC8qIHB1YiA9IDAsIHByb3QgPSAxLCBwcml2ID0gMiAgICovCi0gIHVuc2lnbmVkIGludCBhX3VuaW9uOiAgICAgMTsgICAgIC8qIDEgPT4gYW5vbnltb3VzIHVuaW9uIG1lbWJlciAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE4OwotICBkbnR0cG9pbnRlciBmaWVsZAkgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gZmllbGQgb3IgcXVhbGlmaWVyICovCi0gIGRudHRwb2ludGVyIG5leHRmaWVsZCAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBmaWVsZCAgICAgICAgICovCi19OwotCi0vKiBDKysgdmlydHVhbCBmdW5jdGlvbnMgKi8KLQotc3RydWN0IGRudHRfdHlwZV92ZnVuYyB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9WRlVOQyAqLwotICB1bnNpZ25lZCBpbnQgcHVyZTogICAgICAgIDE7ICAgICAvKiBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gPyAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMDsKLSAgZG50dHBvaW50ZXIgZnVuY3B0ciAgICAgICAgOyAgICAgLyogcG9pbnRzIHRvIEZVTkNUSU9OIHN5bWJvbCAgICAgKi8KLSAgdW5zaWduZWQgbG9uZyB2dGJsX29mZnNldCAgOyAgICAgLyogb2Zmc2V0IGludG8gdnRibCBmb3IgdmlydHVhbCAgKi8KLX07Ci0KLS8qIE5vdCBwcmVjaXNlbHkgc3VyZSB3aGF0IHRoaXMgaXMgaW50ZW5kZWQgZm9yIC0gRERFIGlnbm9yZXMgaXQgKi8KLQotc3RydWN0IGRudHRfdHlwZV9tZW1hY2Nlc3MgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfTUVNQUNDRVNTICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIxOwotICBkbnR0cG9pbnRlciBjbGFzc3B0cgkgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gYmFzZSBjbGFzcyAgICAgICAgICovCi0gIGRudHRwb2ludGVyIGZpZWxkICAgICAgICAgIDsgICAgIC8qIHBvaW50ZXIgZmllbGQgICAgICAgICAgICAgICAgICovCi19OwotCi0vKiBUaGUgRE5UVF9UWVBFX0lOSEVSSVRBTkNFIHJlY29yZCBkZXNjcmliZXMgZGVyaXZlZCBjbGFzc2VzLgotICogSW4gcGFydGljdWxhciwgdGhlICJwYXJlbnRsaXN0IiBmaWVsZCBvZiB0aGUgQ0xBU1MgcmVjb3JkIHBvaW50cwotICogdG8gYSBsaXN0IG9mIElOSEVSSVRBTkNFIHJlY29yZHMgZm9yIGNsYXNzZXMgZnJvbSB3aGljaCB3ZSAKLSAqIGluaGVyaXQgbWVtYmVycy4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2luaGVyaXRhbmNlIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0lOSEVSSVRBTkNFICovCi0gIHVuc2lnbmVkIGludCBWaXJ0dWFsOiAgICAgMTsgICAgIC8qIHZpcnR1YWwgYmFzZSBjbGFzcyA/ICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCB2aXNpYmlsaXR5OiAgMjsgICAgIC8qIHB1YiA9IDAsIHByb3QgPSAxLCBwcml2ID0gMiAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE4OwotICBkbnR0cG9pbnRlciBjbGFzc25hbWUgICAgICA7ICAgICAvKiBmaXJzdCBwYXJlbnQgY2xhc3MsIGlmIGFueSAgICAqLwotICB1bnNpZ25lZCBsb25nIG9mZnNldCAgICAgICA7ICAgICAvKiBvZmZzZXQgdG8gc3RhcnQgb2YgYmFzZSBjbGFzcyAqLwotICBkbnR0cG9pbnRlciBuZXh0ICAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIG5leHQgS19JTkhFUklUQU5DRSAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZVsyXSAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogQysrICJmcmllbmQiIGNsYXNzZXMgLi4uICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZnJpZW5kX2NsYXNzIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX0ZSSUVORF9DTEFTUyAqLwotICB1bnNpZ25lZCBpbnQgdW51c2VkOgkgICAyMTsKLSAgZG50dHBvaW50ZXIgY2xhc3NwdHIgICAgICAgOyAgICAgLyogcG9pbnRlciB0byBjbGFzcyBETlRUICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgbmV4dCAgICAgICAgICAgOyAgICAgLyogbmV4dCBETlRUX0ZSSUVORCAgICAgICAgICAgICAgKi8KLX07Ci0KLXN0cnVjdCBkbnR0X3R5cGVfZnJpZW5kX2Z1bmMgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfRlJJRU5EX0ZVTkMgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjE7Ci0gIGRudHRwb2ludGVyIGZ1bmNwdHIgICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gZnVuY3Rpb24gICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIGNsYXNzcHRyICAgICAgIDsgICAgIC8qIHBvaW50ZXIgdG8gY2xhc3MgRE5UVCAgICAgICAgICovCi0gIGRudHRwb2ludGVyIG5leHQgICAgICAgICAgIDsgICAgIC8qIG5leHQgRE5UVF9GUklFTkQgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGxvbmcgZnV0dXJlWzJdICAgIDsgICAgIC8qIHBhZGRpbmcgdG8gMy13b3JkIGJsb2NrIGVuZCAgICovCi19OwotCi0vKiBEREUgYXBwZWFycyB0byBpZ25vcmUgdGhlIEROVFRfVFlQRV9NT0RJRklFUiByZWNvcmQuCi0gKiBJdCBjb3VsZCBwZXJoYXBzIGJlIHVzZWQgdG8gZ2l2ZSBiZXR0ZXIgInB0eXBlIiBvdXRwdXQgaW4gR0RCOwotICogb3RoZXJ3aXNlIGl0IGlzIHByb2JhYmx5IHNhZmUgZm9yIEdEQiB0byBpZ25vcmUgaXQgYWxzby4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX21vZGlmaWVyIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX01PRElGSUVSICovCi0gIHVuc2lnbmVkIGludCBtX2NvbnN0OiAgICAgMTsgICAgIC8qIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBtX3N0YXRpYzogICAgMTsgICAgIC8qIHN0YXRpYyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBtX3ZvaWQ6ICAgICAgMTsgICAgIC8qIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBtX3ZvbGF0aWxlOiAgMTsgICAgIC8qIHZvbGF0aWxlICAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBtX2R1cGxpY2F0ZTogMTsgICAgIC8qIGR1cGxpY2F0ZSAgICAgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE2OwotICBkbnR0cG9pbnRlciB0eXBlICAgICAgICAgICA7ICAgICAvKiBzdWJ0eXBlICAgICAgICAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZSAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogSSdtIG5vdCBzdXJlIHdoYXQgdGhpcyB3YXMgaW50ZW5kZWQgZm9yIC0gRERFIGlnbm9yZXMgaXQgKi8KLQotc3RydWN0IGRudHRfdHlwZV9vYmplY3RfaWQgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfT0JKRUNUX0lEICovCi0gIHVuc2lnbmVkIGludCBpbmRpcmVjdDogICAgMTsgICAgIC8qIElzIG9iamVjdF9pZGVudCBhZGRyIG9mIGFkZHI/ICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDIwOwotICB1bnNpZ25lZCBsb25nIG9iamVjdF9pZGVudCA7ICAgICAvKiBvYmplY3QgaWRlbnRpZmllciAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIG9mZnNldCAgICAgICA7ICAgICAvKiBvZmZzZXQgdG8gc3RhcnQgb2YgYmFzZSBjbGFzcyAqLwotICBkbnR0cG9pbnRlciBuZXh0ICAgICAgICAgICA7ICAgICAvKiBwb2ludGVyIHRvIG5leHQgS19PQkpFQ1RfSUQgICAqLwotICB1bnNpZ25lZCBsb25nIHNlZ29mZnNldCAgICA7ICAgICAvKiBmb3IgbGlua2VyIGZpeHVwICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBsb25nIGZ1dHVyZSAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICAqLwotfTsKLQotLyogTm8gc2VwYXJhdGUgZG50dF90eXBlX21lbWZ1bmM7IHNhbWUgYXMgZG50dF90eXBlX2Z1bmMgKi8KLQotLyogU3ltYm9sIHJlY29yZHMgdG8gc3VwcG9ydCB0ZW1wbGF0ZXMuIFRoZXNlIG9ubHkgZ2V0IHVzZWQKLSAqIGluIERERSdzICJkZXNjcmliZSIgb3V0cHV0IChsaWtlIEdEQidzICJwdHlwZSIpLgotICovCi0KLS8qIFRoZSBURU1QTEFURSByZWNvcmQgaXMgdGhlIGhlYWRlciBmb3IgYSB0ZW1wbGF0ZS1jbGFzcy4KLSAqIExpa2UgdGhlIENMQVNTIHJlY29yZCwgYSBURU1QTEFURSByZWNvcmQgaGFzIGEgbWVtYmVybGlzdCB0aGF0Ci0gKiBwb2ludHMgdG8gYSBsaXN0IG9mIHRlbXBsYXRlIG1lbWJlcnMuIEl0IGFsc28gaGFzIGFuIGFyZ2xpc3QKLSAqIHBvaW50aW5nIHRvIGEgbGlzdCBvZiBURU1QTEFURV9BUkcgcmVjb3Jkcy4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX3RlbXBsYXRlIHsKLSAgdW5zaWduZWQgaW50IGV4dGVuc2lvbjogICAxOwkgICAvKiBhbHdheXMgemVybyAqLwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgMTA7ICAgICAvKiBhbHdheXMgRE5UVF9UWVBFX1RFTVBMQVRFICovCi0gIHVuc2lnbmVkIGludCBhYnN0cmFjdDogICAgMTsgICAgIC8qIGlzIHRoaXMgYW4gYWJzdHJhY3QgY2xhc3M/ICAgICovCi0gIHVuc2lnbmVkIGludCBjbGFzc19kZWNsOiAgMjsgICAgIC8qIDA9Y2xhc3MsMT11bmlvbiwyPXN0cnVjdCAgICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE4OwotICBkbnR0cG9pbnRlciBtZW1iZXJsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gY2hhaW4gb2YgS19bR0VOXUZJRUxEcyAqLwotICBsb25nIHVudXNlZDIgICAgICAgICAgICAgICA7ICAgICAvKiBvZmZzZXQgaW4gb2JqIG9mIHB0ciB0byB2dGJsICAqLwotICBkbnR0cG9pbnRlciBwYXJlbnRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19JTkhFUklUQU5DRSBsaXN0ICAgICAqLwotICB1bnNpZ25lZCBsb25nIGJpdGxlbmd0aCAgICA7ICAgICAvKiB0b3RhbCBhdCB0aGlzIGxldmVsICAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBpZGVudGxpc3QgICAgICA7ICAgICAvKiBwdHIgdG8gY2hhaW4gb2YgY2xhc3MgaWRlbnQncyAqLwotICBkbnR0cG9pbnRlciBmcmllbmRsaXN0ICAgICA7ICAgICAvKiBwdHIgdG8gS19GUklFTkQgbGlzdCAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBhcmdsaXN0ICAgICAgICA7ICAgICAvKiBwdHIgdG8gYXJndW1lbnQgbGlzdCAgICAgICAgICAqLwotICBkbnR0cG9pbnRlciBleHBhbnNpb25zICAgICA7ICAgICAvKiBwdHIgdG8gZXhwYW5zaW9uIGxpc3QgICAgICAgICAqLwotfTsKLQotLyogVGVtcGxhdGUtY2xhc3MgYXJndW1lbnRzIGFyZSBhIGxpc3Qgb2YgVEVNUExfQVJHIHJlY29yZHMKLSAqIGNoYWluZWQgdG9nZXRoZXIuIFRoZSAibmFtZSIgZmllbGQgaXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hbC4KLSAqIEUuZy46Ci0gKiB0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgcSB7IC4uLiB9OwotICogVGhlbiAiVCIgaXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hbCBhcmd1bWVudC4KLSAqLwotc3RydWN0IGRudHRfdHlwZV90ZW1wbF9hcmcgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfVEVNUExfQVJHICovCi0gIHVuc2lnbmVkIGludCB1c2FnZXR5cGU6ICAgMTsgICAgIC8qIDAgdHlwZS1uYW1lIDEgZXhwcmVzc2lvbiAgICAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDoJICAgMjA7Ci0gIHZ0cG9pbnRlciBuYW1lICAgICAgICAgICAgIDsgICAgIC8qIG5hbWUgb2YgYXJndW1lbnQgICAgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgdHlwZSAgICAgICAgICAgOyAgICAgLyogZm9yIG5vbiB0eXBlIGFyZ3VtZW50cyAgICAgICAqLwotICBkbnR0cG9pbnRlciBuZXh0YXJnICAgICAgICA7ICAgICAvKiBOZXh0IGFyZ3VtZW50IGlmIGFueSAgICAgICAgICovCi0gIGxvbmcgZnV0dXJlWzJdICAgICAgICAgICAgIDsgICAgIC8qIHBhZGRpbmcgdG8gMy13b3JkIGJsb2NrIGVuZCAgKi8KLX07Ci0KLS8qIEZVTkNfVEVNUExBVEUgcmVjb3JkcyBhcmUgc29ydCBvZiBsaWtlIEZVTkNUSU9OLCBidXQgYXJlIGVtaXR0ZWQKLSAqIGZvciB0ZW1wbGF0ZSBtZW1iZXIgZnVuY3Rpb25zLiBFLmcuLAotICogdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHEgeyAKLSAgICAgIC4uLgotICAgICAgdm9pZCBmKCk7Ci0gICAgICAuLi4gCi0gICB9OwotICogV2l0aGluIHRoZSBsaXN0IG9mIEZJRUxEcy9HRU5GSUVMRHMgZGVmaW5pbmcgdGhlIG1lbWJlciBsaXN0Ci0gKiBvZiB0aGUgdGVtcGxhdGUgInEiLCAiZiIgd291bGQgYXBwZWFyIGFzIGEgRlVOQ19URU1QTEFURS4KLSAqIFdlJ2xsIGFsc28gc2VlIGluc3RhbmNlcyBvZiBGVU5DVElPTiAiZiIgcmVjb3JkcyBmb3IgZWFjaCAKLSAqIGluc3RhbnRpYXRpb24gb2YgdGhlIHRlbXBsYXRlLgotICovCi0KLXN0cnVjdCBkbnR0X3R5cGVfZnVuY190ZW1wbGF0ZSB7Ci0gIHVuc2lnbmVkIGludCBleHRlbnNpb246ICAgMTsJICAgLyogYWx3YXlzIHplcm8gKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAgIDEwOyAgICAgLyogYWx3YXlzIEROVFRfVFlQRV9GVU5DX1RFTVBMQVRFICovCi0gIHVuc2lnbmVkIGludCBwdWJsaWM6ICAgICAgMTsgICAgIC8qIDEgPT4gZ2xvYmFsbHkgdmlzaWJsZSAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOiAgICA0OyAgICAgLyogdHlwZSBvZiBsYW5ndWFnZSAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgbGV2ZWw6ICAgICAgIDU7ICAgICAvKiBuZXN0aW5nIGxldmVsICh0b3AgbGV2ZWwgPSAwKSovCi0gIHVuc2lnbmVkIGludCBvcHRpbWl6ZTogICAgMjsgICAgIC8qIGxldmVsIG9mIG9wdGltaXphdGlvbiAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6ICAgICAxOyAgICAgLyogZWxsaXBzZXMuICBQYXNjYWwvODAwIGxhdGVyICAqLyAKLSAgdW5zaWduZWQgaW50IGluZm86ICAgICAgICA0OyAgICAgLyogbGFuZy1zcGVjaWZpYyBzdHVmZjsgRl94eHh4ICAqLwotICB1bnNpZ25lZCBpbnQgaW5saW5lZDogICAgIDE7Ci0gIHVuc2lnbmVkIGludCBsb2NhbGxvYzogICAgMTsgICAgIC8qIDAgYXQgdG9wLCAxIGF0IGVuZCBvZiBibG9jayAgKi8KLSAgdW5zaWduZWQgaW50IHVudXNlZDogICAgICAyOwotICB2dHBvaW50ZXIgbmFtZSAgICAgICAgICAgICA7ICAgICAvKiBuYW1lIG9mIGZ1bmN0aW9uICAgICAgICAgICAgICovCi0gIHZ0cG9pbnRlciBhbGlhcyAgICAgICAgICAgIDsgICAgIC8qIGFsdGVybmF0ZSBuYW1lLCBpZiBhbnkgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbSAgICAgOyAgICAgLyogZmlyc3QgRlBBUkFNLCBpZiBhbnkgICAgICAgICAqLwotICBkbnR0cG9pbnRlciByZXR2YWwgICAgICAgICA7ICAgICAvKiByZXR1cm4gdHlwZSwgaWYgYW55ICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIGFyZ2xpc3QgICAgICAgIDsgICAgIC8qIHB0ciB0byBhcmd1bWVudCBsaXN0ICAgICAgICAgKi8KLX07Ci0KLS8qIExJTksgaXMgYXBwYXJlbnRseSBpbnRlbmRlZCB0byBsaW5rIHRvZ2V0aGVyIGZ1bmN0aW9uIHRlbXBsYXRlCi0gKiBkZWZpbml0aW9ucyB3aXRoIHRoZWlyIGluc3RhbnRpYXRpb25zLiBIb3dldmVyLCBpdCBpcyBub3QgY2xlYXIKLSAqIHdoeSB0aGlzIHdvdWxkIGJlIG5lZWRlZCwgZXhjZXB0IHRvIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIG9uCi0gKiBhICJwdHlwZSIgY29tbWFuZC4gQW5kIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBhQ0MgZG9lcyBub3QgCi0gKiBnZW5lcmF0ZSB0aGlzIHJlY29yZC4KLSAqLwotCi1zdHJ1Y3QgZG50dF90eXBlX2xpbmsgewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAgIDE7CSAgIC8qIGFsd2F5cyB6ZXJvICovCi0gIHVuc2lnbmVkIGludCBraW5kOiAgICAgICAxMDsgICAgIC8qIGFsd2F5cyBETlRUX1RZUEVfTElOSyAqLwotICB1bnNpZ25lZCBpbnQgbGlua0tpbmQ6ICAgIDQ7ICAgICAvKiBhbHdheXMgTElOS19VTktOT1dOICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCB1bnVzZWQ6CSAgIDE3OwotICBsb25nIGZ1dHVyZTEgICAgICAgICAgICAgICA7ICAgICAvKiBleHBhbnNpb24gICAgICAgICAgICAgICAgICAgICovCi0gIGRudHRwb2ludGVyIHB0cjEgICAgICAgICAgIDsgICAgIC8qIGxpbmsgZnJvbSB0ZW1wbGF0ZSAgICAgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgcHRyMiAgICAgICAgICAgOyAgICAgLyogdG8gZXhwYW5zaW9uICAgICAgICAgICAgICAgICAqLwotICBsb25nIGZ1dHVyZVsyXSAgICAgICAgICAgICA7ICAgICAvKiBwYWRkaW5nIHRvIDMtd29yZCBibG9jayBlbmQgICovCi19OwotCi0vKiBlbmQgb2YgQysrIHNwZWNpZmljIFNPTSdzICovCi0KLS8qIEROVFRfVFlQRV9EWU5fQVJSQVlfREVTQyBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfREVTQ19TVUJSQU5HRSBpcyB1bnVzZWQgYnkgR0RCICovCi0vKiBETlRUX1RZUEVfQkVHSU5fRVhUIGlzIHVudXNlZCBieSBHREIgKi8KLS8qIEROVFRfVFlQRV9JTkxOIGlzIHVudXNlZCBieSBHREIgKi8KLS8qIEROVFRfVFlQRV9JTkxOX0xJU1QgaXMgdW51c2VkIGJ5IEdEQiAqLwotLyogRE5UVF9UWVBFX0FMSUFTIGlzIHVudXNlZCBieSBHREIgKi8KLQotc3RydWN0IGRudHRfdHlwZV9kb2NfZnVuY3Rpb24gewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOiAxOyAgIC8qIGFsd2F5cyB6ZXJvICAgICAgICAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGtpbmQ6ICAgICAxMDsgICAvKiBLX0RPQ19GVU5DVElPTiBvciAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogS19ET0NfTUVNRlVOQyAgICAgICAgICAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZ2xvYmFsOiAgICAxOyAgIC8qIDEgPT4gZ2xvYmFsbHkgdmlzaWJsZSAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGxhbmd1YWdlOiAgNDsgICAvKiB0eXBlIG9mIGxhbmd1YWdlICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBsZXZlbDogICAgIDU7ICAgLyogbmVzdGluZyBsZXZlbCAodG9wIGxldmVsID0gMCkqLwotICB1bnNpZ25lZCBpbnQgb3B0aW1pemU6ICAyOyAgIC8qIGxldmVsIG9mIG9wdGltaXphdGlvbiAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IHZhcmFyZ3M6ICAgMTsgICAvKiBlbGxpcHNlcy4gIFBhc2NhbC84MDAgbGF0ZXIgICovCi0gIHVuc2lnbmVkIGludCBpbmZvOiAgICAgIDQ7ICAgLyogbGFuZy1zcGVjaWZpYyBzdHVmZjsgRl94eHh4ICAqLwotICB1bnNpZ25lZCBpbnQgaW5saW5lZDogICAxOwotICB1bnNpZ25lZCBpbnQgbG9jYWxsb2M6ICAxOyAgIC8qIDAgYXQgdG9wLCAxIGF0IGVuZCBvZiBibG9jayAgKi8KLSAgdW5zaWduZWQgaW50IGV4cGFuc2lvbjogMTsgICAvKiAxID0gZnVuY3Rpb24gZXhwYW5zaW9uICAgICAgICovCi0gIHVuc2lnbmVkIGludCBkb2NfY2xvbmU6IDE7Ci0gIHZ0cG9pbnRlciBuYW1lOyAgICAgICAgICAgICAgLyogbmFtZSBvZiBmdW5jdGlvbiAgICAgICAgICAgICAqLwotICB2dHBvaW50ZXIgYWxpYXM7ICAgICAgICAgICAgIC8qIGFsdGVybmF0ZSBuYW1lLCBpZiBhbnkgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgZmlyc3RwYXJhbTsgICAgICAvKiBmaXJzdCBGUEFSQU0sIGlmIGFueSAgICAgICAgICovCi0gIHNsdHBvaW50ZXIgYWRkcmVzczsgICAgICAgICAgLyogY29kZSBhbmQgdGV4dCBsb2NhdGlvbnMgICAgICAqLwotICBDT1JFX0FERFIgZW50cnlhZGRyOyAgICAgICAgIC8qIGFkZHJlc3Mgb2YgZW50cnkgcG9pbnQgICAgICAgKi8KLSAgZG50dHBvaW50ZXIgcmV0dmFsOyAgICAgICAgICAvKiByZXR1cm4gdHlwZSwgaWYgYW55ICAgICAgICAgICovCi0gIENPUkVfQUREUiBsb3dhZGRyOyAgICAgICAgICAgLyogbG93ZXN0IGFkZHJlc3Mgb2YgZnVuY3Rpb24gICAqLwotICBDT1JFX0FERFIgaGlhZGRyOyAgICAgICAgICAgIC8qIGhpZ2hlc3QgYWRkcmVzcyBvZiBmdW5jdGlvbiAgKi8KLSAgZG50dHBvaW50ZXIgaW5saW5lX2xpc3Q7ICAgICAvKiBwb2ludGVyIHRvIGZpcnN0IGlubGluZSAgICAqLwotICBsdHBvaW50ZXIgbHRfb2Zmc2V0OyAgICAgICAgIC8qIHN0YXJ0IG9mIGZyYWcvY3AgbGluZSB0YWJsZSAgKi8KLSAgY3R4dHBvaW50ZXIgY3R4dF9vZmZzZXQ7ICAgICAvKiBzdGFydCBvZiBjb250ZXh0IHRhYmxlIGZvciB0aGlzIHJvdXRpbmUgKi8KLX07Ci0KLS8qIEROVFRfVFlQRV9ET0NfTUVNRlVOQyBpcyB1bnVzZWQgYnkgR0RCICovCi0KLS8qIEROVFRfVFlQRV9HRU5FUklDIGFuZCBETlRUX1RZUEVfQkxPQ0sgYXJlIGNvbnZpZW5jZSBzdHJ1Y3R1cmVzCi0gICBzbyB3ZSBjYW4gZXhhbWluZSBhIEROVFQgZW50cnkgaW4gYSBnZW5lcmljIGZhc2hpb24uICAqLwotc3RydWN0IGRudHRfdHlwZV9nZW5lcmljCi17Ci0gIHVuc2lnbmVkIGludCB3b3JkWzldOwotfTsKLQotc3RydWN0IGRudHRfdHlwZV9ibG9jawotewotICB1bnNpZ25lZCBpbnQgZXh0ZW5zaW9uOgkxOwotICB1bnNpZ25lZCBpbnQga2luZDogICAgICAgICAgICAxMDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJCTIxOwotICB1bnNpZ25lZCBpbnQgd29yZFsyXTsKLX07Ci0KLS8qIE9uZSBlbnRyeSBpbiBhIEROVFQgKGVpdGhlciB0aGUgTE5UVCBvciBHTlRUKS4gIAotICogVGhpcyBpcyBhIHVuaW9uIG9mIHRoZSBhYm92ZSA2MCBvciBzbyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuCi0gKi8KLXVuaW9uIGRudHRlbnRyeQotewotICBzdHJ1Y3QgZG50dF90eXBlX3NyY2ZpbGUgZHNmaWxlOwotICBzdHJ1Y3QgZG50dF90eXBlX21vZHVsZSBkbW9kdWxlOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uIGRmdW5jOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmN0aW9uIGRlbnRyeTsKLSAgc3RydWN0IGRudHRfdHlwZV9iZWdpbiBkYmVnaW47Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZW5kIGRlbmQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZnBhcmFtIGRmcGFyYW07Ci0gIHN0cnVjdCBkbnR0X3R5cGVfc3ZhciBkc3ZhcjsKLSAgc3RydWN0IGRudHRfdHlwZV9kdmFyIGRkdmFyOwotICBzdHJ1Y3QgZG50dF90eXBlX2NvbnN0IGRjb25zdDsKLSAgc3RydWN0IGRudHRfdHlwZV90eXBlIGR0eXBlOwotICBzdHJ1Y3QgZG50dF90eXBlX3R5cGUgZHRhZzsKLSAgc3RydWN0IGRudHRfdHlwZV9wb2ludGVyIGRwdHI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZW51bSBkZW51bTsKLSAgc3RydWN0IGRudHRfdHlwZV9tZW1lbnVtIGRtZW1iZXI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfc2V0IGRzZXQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfc3VicmFuZ2UgZHN1YnI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfYXJyYXkgZGFycmF5OwotICBzdHJ1Y3QgZG50dF90eXBlX3N0cnVjdCBkc3RydWN0OwotICBzdHJ1Y3QgZG50dF90eXBlX3VuaW9uIGR1bmlvbjsKLSAgc3RydWN0IGRudHRfdHlwZV9maWVsZCBkZmllbGQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZnVuY3R5cGUgZGZ1bmN0eXBlOwotICBzdHJ1Y3QgZG50dF90eXBlX3dpdGggZHdpdGg7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZnVuY3Rpb24gZGJsb2NrZGF0YTsKLSAgc3RydWN0IGRudHRfdHlwZV9jbGFzc19zY29wZSBkY2xhc3Nfc2NvcGU7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfcG9pbnRlciBkcmVmZXJlbmNlOwotICBzdHJ1Y3QgZG50dF90eXBlX3B0cm1lbSBkcHRybWVtOwotICBzdHJ1Y3QgZG50dF90eXBlX3B0cm1lbWZ1bmMgZHB0cm1lbWZ1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfY2xhc3MgZGNsYXNzOwotICBzdHJ1Y3QgZG50dF90eXBlX2dlbmZpZWxkIGRnZW5maWVsZDsKLSAgc3RydWN0IGRudHRfdHlwZV92ZnVuYyBkdmZ1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbWVtYWNjZXNzIGRtZW1hY2Nlc3M7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfaW5oZXJpdGFuY2UgZGluaGVyaXRhbmNlOwotICBzdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9jbGFzcyBkZnJpZW5kX2NsYXNzOwotICBzdHJ1Y3QgZG50dF90eXBlX2ZyaWVuZF9mdW5jIGRmcmllbmRfZnVuYzsKLSAgc3RydWN0IGRudHRfdHlwZV9tb2RpZmllciBkbW9kaWZpZXI7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfb2JqZWN0X2lkIGRvYmplY3RfaWQ7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfdGVtcGxhdGUgZHRlbXBsYXRlOwotICBzdHJ1Y3QgZG50dF90eXBlX3RlbXBsX2FyZyBkdGVtcGxfYXJnOwotICBzdHJ1Y3QgZG50dF90eXBlX2Z1bmNfdGVtcGxhdGUgZGZ1bmNfdGVtcGxhdGU7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfbGluayBkbGluazsKLSAgc3RydWN0IGRudHRfdHlwZV9kb2NfZnVuY3Rpb24gZGRvY2Z1bmM7Ci0gIHN0cnVjdCBkbnR0X3R5cGVfZ2VuZXJpYyBkZ2VuZXJpYzsKLSAgc3RydWN0IGRudHRfdHlwZV9ibG9jayBkYmxvY2s7Ci19OwotCi0vKiBTb3VyY2UgbGluZSBlbnRyeSB0eXBlcy4gICovCi1lbnVtIHNsdHR5cGUKLXsKLSAgU0xUX05PUk1BTCwKLSAgU0xUX1NSQ0ZJTEUsCi0gIFNMVF9NT0RVTEUsCi0gIFNMVF9GVU5DVElPTiwKLSAgU0xUX0VOVFJZLAotICBTTFRfQkVHSU4sCi0gIFNMVF9FTkQsCi0gIFNMVF9XSVRILAotICBTTFRfRVhJVCwKLSAgU0xUX0FTU0lTVCwKLSAgU0xUX01BUktFUiwKLSAgU0xUX0NMQVNTX1NDT1BFLAotICBTTFRfSU5MTiwKLSAgU0xUX05PUk1BTF9PRkZTRVQsCi19OwotCi0vKiBBIG5vcm1hbCBzb3VyY2UgbGluZSBlbnRyeS4gIFNpbXBseSBwcm92aWRlcyBhIG1hcHBpbmcgb2YgYSBzb3VyY2UKLSAgIGxpbmUgbnVtYmVyIHRvIGEgY29kZSBhZGRyZXNzLgotCi0gICBTTFRERVNDIHdpbGwgYWx3YXlzIGJlIFNMVF9OT1JNQUwgb3IgU0xUX0VYSVQuICAqLwotCi1zdHJ1Y3Qgc2x0X25vcm1hbAotewotICB1bnNpZ25lZCBpbnQgc2x0ZGVzYzoJNDsKLSAgdW5zaWduZWQgaW50IGxpbmU6CTI4OwotICBDT1JFX0FERFIgYWRkcmVzczsKLX07Ci0KLXN0cnVjdCBzbHRfbm9ybWFsX29mZgotewotICB1bnNpZ25lZCBpbnQgc2x0ZGVzYzoJNDsKLSAgdW5zaWduZWQgaW50IG9mZnNldDoJNjsKLSAgdW5zaWduZWQgaW50IGxpbmU6CTIyOwotICBDT1JFX0FERFIgYWRkcmVzczsKLX07Ci0KLS8qIEEgc3BlY2lhbCBzb3VyY2UgbGluZSBlbnRyeS4gIFByb3ZpZGVzIGEgbWFwcGluZyBvZiBhIGRlY2xhcmF0aW9uCi0gICB0byBhIGxpbmUgbnVtYmVyLiAgVGhlc2UgZW50cmllcyBwb2ludCBiYWNrIGludG8gdGhlIEROVFQgd2hpY2gKLSAgIHJlZmVyZW5jZXMgdGhlbS4gICovCi0KLXN0cnVjdCBzbHRfc3BlY2lhbAotewotICB1bnNpZ25lZCBpbnQgc2x0ZGVzYzoJNDsKLSAgdW5zaWduZWQgaW50IGxpbmU6CTI4OwotICBkbnR0cG9pbnRlciBiYWNrcHRyOwotfTsKLQotLyogVXNlZCB0byBkZXNjcmliZSBuZXN0aW5nLgotCi0gICBGb3IgbmVzdGVkIGxhbmd1YWdlcywgYW4gc2x0X2Fzc2lzdCBlbnRyeSBtdXN0IGZvbGxvdyBlYWNoIFNMVF9GVU5DCi0gICBlbnRyeSBpbiB0aGUgU0xULiAgVGhlIGFkZHJlc3MgZmllbGQgd2lsbCBwb2ludCBmb3J3YXJkIHRvIHRoZQotICAgZmlyc3Qgc2x0X25vcm1hbCBlbnRyeSB3aXRoaW4gdGhlIGZ1bmN0aW9uJ3Mgc2NvcGUuICAqLwotCi1zdHJ1Y3Qgc2x0X2Fzc2lzdAotewotICB1bnNpZ25lZCBpbnQgc2x0ZGVzYzoJNDsKLSAgdW5zaWduZWQgaW50IHVudXNlZDoJMjg7Ci0gIHNsdHBvaW50ZXIgYWRkcmVzczsKLX07Ci0KLXN0cnVjdCBzbHRfZ2VuZXJpYwotewotICB1bnNpZ25lZCBpbnQgd29yZFsyXTsKLX07Ci0KLXVuaW9uIHNsdGVudHJ5Ci17Ci0gIHN0cnVjdCBzbHRfbm9ybWFsIHNub3JtOwotICBzdHJ1Y3Qgc2x0X25vcm1hbF9vZmYgc25vcm1vZmY7Ci0gIHN0cnVjdCBzbHRfc3BlY2lhbCBzc3BlYzsKLSAgc3RydWN0IHNsdF9hc3Npc3Qgc2Fzc3Q7Ci0gIHN0cnVjdCBzbHRfZ2VuZXJpYyBzZ2VuZXJpYzsKLX07Ci0KLS8qICAkTElORVMkIGRlY2xhcmF0aW9ucwotICogIFRoaXMgaXMgdGhlIGxpbmUgdGFibGUgdXNlZCBmb3Igb3B0aW1pemVkIGNvZGUsIHdoaWNoIGlzIG9ubHkgcHJlc2VudCAKLSAqICBpbiB0aGUgbmV3ICRQUk9HUkFNX0lORk8kIGRlYnVnIHNwYWNlLiAgCi0gKi8KLQotI2RlZmluZSBEU1RfTE5fRVNDQVBFX0ZMQUcxICAgMTUKLSNkZWZpbmUgRFNUX0xOX0VTQ0FQRV9GTEFHMiAgIDE0Ci0jZGVmaW5lIERTVF9MTl9DVFhfU1BFQzEgICAgICAxMyAgCi0jZGVmaW5lIERTVF9MTl9DVFhfU1BFQzIgICAgICAxMgotCi0vKgotICBFc2NhcGUgZnVuY3Rpb24gY29kZXM6Ci0qLwotdHlwZWRlZiBlbnVtCi0gICAgewotICAgIGRzdF9sbl9wYWQsICAgICAgICAgIC8qIHBhZCBieXRlICovCi0gICAgZHN0X2xuX2VzY2FwZV8xLCAgICAgLyogcmVzZXJ2ZWQgKi8KLSAgICBkc3RfbG5fZHBjMV9kbG4xLCAgICAvKiAxIGJ5dGUgbGluZSBkZWx0YSwgMSBieXRlIHBjIGRlbHRhICovCi0gICAgZHN0X2xuX2RwYzJfZGxuMiwgICAgLyogMiBieXRlcyBsaW5lIGRlbHRhLCAyIGJ5dGVzIHBjIGRlbHRhICovCi0gICAgZHN0X2xuX3BjNF9sbjQsICAgICAgLyogNCBieXRlcyBBQlNPTFVURSBsaW5lIG51bWJlciwgNCBieXRlcyBBQlNPTFVURSBwYyAqLwotICAgIGRzdF9sbl9kcGMwX2RsbjEsICAgIC8qIDEgYnl0ZSBsaW5lIGRlbHRhLCBwYyBkZWx0YSA9IDAgKi8KLSAgICBkc3RfbG5fbG5fb2ZmXzEsICAgICAvKiBzdGF0ZW1lbnQgZXNjYXBlLCBzdG10ICMgPSAxICgybmQgc3RtdCBvbiBsaW5lKSAqLwotICAgIGRzdF9sbl9sbl9vZmYsICAgICAgIC8qIHN0YXRlbWVudCBlc2NhcGUsIHN0bXQgIyA9IG5leHQgYnl0ZSAqLwotICAgIGRzdF9sbl9lbnRyeSwgICAgICAgIC8qIGVudHJ5IGVzY2FwZSwgbmV4dCBieXRlIGlzIGVudHJ5IG51bWJlciAqLwotICAgIGRzdF9sbl9leGl0LCAgICAgICAgIC8qIGV4aXQgZXNjYXBlICovCi0gICAgZHN0X2xuX3N0bXRfZW5kLCAgICAgLyogZ2FwIGVzY2FwZSwgNCBieXRlcyBwYyBkZWx0YSAqLwotICAgIGRzdF9sbl9zdG10X2NwLCAgICAgIC8qIGN1cnJlbnQgc3RtdCBpcyBhIGNyaXRpY2FsIHBvaW50ICovCi0gICAgZHN0X2xuX2VzY2FwZV8xMiwgICAgLyogcmVzZXJ2ZWQgKi8KLSAgICBkc3RfbG5fZXNjYXBlXzEzLCAgICAvKiB0aGlzIGlzIGFuIGV4Y2VwdGlvbiBzaXRlIHJlY29yZCAqLwotICAgIGRzdF9sbl9ueHRfYnl0ZSwgICAgIC8qIG5leHQgYnl0ZSBjb250YWlucyB0aGUgcmVhbCBlc2NhcGUgY29kZSAqLwotICAgIGRzdF9sbl9lbmQsICAgICAgICAgIC8qIGVuZCBlc2NhcGUsIGZpbmFsIGVudHJ5IGZvbGxvd3MgKi8KLSAgICBkc3RfbG5fZXNjYXBlMV9FTkRfT0ZfRU5VTQotICAgIH0KLSAgICBkc3RfbG5fZXNjYXBlMV90OwotCi10eXBlZGVmIGVudW0KLSAgICB7Ci0gICAgZHN0X2xuX2N0eF8xLCAgICAgICAgLyogbmV4dCBieXRlIGRlc2NyaWJlcyBjb250ZXh0IHN3aXRjaCB3aXRoIDUtYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW50byB0aGUgaW1hZ2UgdGFibGUgYW5kIDMtYml0IHJ1biBsZW5ndGguICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgcnVuIGxlbmd0aCBpcyAwLCBlbmQgd2l0aCBhbm90aGVyIGN4dCBzcGVjaWZpZXIgb3IgY3R4X2VuZCAqLwotICAgIGRzdF9sbl9jdHhfMiwgICAgICAgIC8qIG5leHQgMiBieXRlcyBzd2l0Y2ggY29udGV4dDogMTMgYml0IGluZGV4LCAzIGJpdCBydW4gbGVuZ3RoICovCi0gICAgZHN0X2xuX2N0eF80LCAgICAgICAgLyogbmV4dCA0IGJ5dGVzIHN3aXRjaCBjb250ZXh0OiAyOSBiaXQgaW5kZXgsIDMgYml0IHJ1biBsZW5ndGggKi8KLSAgICBkc3RfbG5fY3R4X2VuZCwgICAgICAvKiBlbmQgY3VycmVudCBjb250ZXh0ICovCi0gICAgZHN0X2xuX2NvbF9ydW5fMSwgICAgLyogbmV4dCBieXRlIGlzIGNvbHVtbiBwb3NpdGlvbiBvZiBzdGFydCBvZiBuZXh0IHN0YXRlbWVudCwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb2xsb3dpbmcgYnl0ZSBpcyBsZW5ndGggb2Ygc3RhdGVtZW50ICovCi0gICAgZHN0X2xuX2NvbF9ydW5fMiwgICAgLyogbmV4dCAyIGJ5dGVzIGlzIGNvbHVtbiBwb3NpdGlvbiBvZiBzdGFydCBvZiBuZXh0IHN0YXRlbWVudCwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb2xsb3dpbmcgMiBieXRlcyBpcyBsZW5ndGggb2Ygc3RhdGVtZW50ICovCi0gICAgZHN0X2xuX2luaXRfYmFzZTEsICAgLyogbmV4dCA0IGJ5dGVzIGFyZSBhYnNvbHV0ZSBQQywgZm9sbG93ZWQgYnkgMSBieXRlIG9mIGxpbmUgbnVtYmVyICovCi0gICAgZHN0X2xuX2luaXRfYmFzZTIsICAgLyogbmV4dCA0IGJ5dGVzIGFyZSBhYnNvbHV0ZSBQQywgZm9sbG93ZWQgYnkgMiBieXRlcyBvZiBsaW5lIG51bWJlciAqLwotICAgIGRzdF9sbl9pbml0X2Jhc2UzLCAgIC8qIG5leHQgNCBieXRlcyBhcmUgYWJzb2x1dGUgUEMsIGZvbGxvd2VkIGJ5IDMgYnl0ZXMgb2YgbGluZSBudW1iZXIgKi8KLSAgICBkc3RfbG5fZXNjYXBlMl9FTkRfT0ZfRU5VTQotICAgIH0KLSAgICBkc3RfbG5fZXNjYXBlMl90OyAgICAgICAgICAgCi0KLXR5cGVkZWYgdW5pb24KLSAgICB7Ci0gICAgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgcGNfZGVsdGEgOiA0OyAgICAgIC8qIDQgYml0IHBjIGRlbHRhICovCi0gICAgICAgIGludCAgICAgICAgICAgICAgIGxuX2RlbHRhIDogNDsgICAgICAvKiA0IGJpdCBsaW5lIG51bWJlciBkZWx0YSAqLwotICAgICAgICB9Ci0gICAgICAgIGRlbHRhOwotCi0gICAgc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZXNjX2ZsYWcgOiA0OyAgICAgIC8qIGFsaWFzIGZvciBwY19kZWx0YSAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgZXNjX2NvZGUgOiA0OyAgICAgIC8qIGVzY2FwZSBmdW5jdGlvbiBjb2RlIChkc3RfbG5fZXNjYXBlMV90LCBvciAuLi4yX3QgKi8KLSAgICAgICAgfQotICAgICAgICBlc2M7Ci0KLSAgICBzdHJ1Y3QKLSAgICAgICAgewotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBlc2NfZmxhZyA6IDQ7ICAgICAgLyogZHN0X2xuX2N0eF9zcGVjMSwgb3IgZHN0X2xuX2N0eF9zcGVjMiAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICBydW5fbGVuZ3RoIDogMjsgICAgICAKLSAgICAgICAgdW5zaWduZWQgaW50ICAgICAgY3R4X2luZGV4IDogMjsgICAgICAvKiAuLi5zcGVjMiBjb250YWlucyBpbmRleDsgIC4uLnNwZWMxLCBpbmRleCAtIDQgKi8KLSAgICAgICAgfQotICAgICAgICBjdHhfc3BlYzsKLQotICAgIGNoYXIgICAgICAgICAgICAgICBzZGF0YTsgICAgICAgICAgICAgICAvKiBzaWduZWQgZGF0YSBieXRlICovCi0gICAgdW5zaWduZWQgY2hhciAgICAgIHVkYXRhOyAgICAgICAgICAgICAgIC8qIHVuc2lnbmVkIGRhdGEgYnl0ZSAqLwotICAgIH0KLSAgICBkc3RfbG5fZW50cnlfdCwKLSAgICAqZHN0X2xuX2VudHJ5X3B0cl90OwotCi0vKiBXYXJuaW5nOiBhbHRob3VnaCB0aGUgYWJvdmUgdW5pb24gb2NjdXBpZXMgb25seSAxIGJ5dGUgdGhlIGNvbXBpbGVyIHRyZWF0cwotICogaXQgYXMgaGF2aW5nIHNpemUgMiAodGhlIG1pbmltdW0gc2l6ZSBvZiBhIHN0cnVjdCkuICBUaGVyZWZvcmUgYSBzZXF1ZW5jZSBvZgotICogZHN0X2xuX2VudHJ5X3QncyBjYW5ub3QgYmUgZGVzY3JpYmVkIGFzIGFuIGFycmF5LCBhbmQgd2Fsa2luZyB0aHJvdWdoIHN1Y2ggYQotICogc2VxdWVuY2UgcmVxdWlyZXMgY29udm9sdXRlZCBjb2RlIHN1Y2ggYXMKLSAqICAgICAgbG5fcHRyID0gKGRzdF9sbl9lbnRyeV9wdHJfdCkgKGNoYXIqKSBsbl9wdHIgKyAxCi0gKiBXZSByZWdyZXQgdGhlIGluY29udmVuaWVuY2UuICovCi0KLS8qIFN0cnVjdHVyZSBmb3IgaW50ZXJwcmV0aW5nIHRoZSBieXRlIGZvbGxvd2luZyBhIGRzdF9sbl9jdHgxIGVudHJ5ICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgIGludCAgICAgICAgICBjdHgxX2luZGV4IDogNTsgICAgICAvKiA1IGJpdCBpbmRleCBpbnRvIGNvbnRleHQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDFfcnVuX2xlbmd0aCA6IDM7IC8qIDMgYml0IHJ1biBsZW5ndGggKi8KLX0gZHN0X2xuX2N0eDFfdCwKLSAgKmRzdF9sbl9jdHgxX3B0cl90OwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGludGVycHJldGluZyB0aGUgYnl0ZXMgZm9sbG93aW5nIGEgZHN0X2xuX2N0eDIgZW50cnkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDJfaW5kZXggOiAxMzsgICAgIC8qIDEzIGJpdCBpbmRleCBpbnRvIGNvbnRleHQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDJfcnVuX2xlbmd0aCA6IDM7IC8qIDMgYml0IHJ1biBsZW5ndGggKi8KLX0gZHN0X2xuX2N0eDJfdCwKLSAgKmRzdF9sbl9jdHgyX3B0cl90OwotCi0vKiBTdHJ1Y3R1cmUgZm9yIGludGVycHJldGluZyB0aGUgYnl0ZXMgZm9sbG93aW5nIGEgZHN0X2xuX2N0eDQgZW50cnkgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDRfaW5kZXggOiAyOTsgICAgIC8qIDI5IGJpdCBpbmRleCBpbnRvIGNvbnRleHQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCAgaW50ICAgICAgICAgIGN0eDRfcnVuX2xlbmd0aCA6IDM7IC8qIDMgYml0IHJ1biBsZW5ndGggKi8KLX0gZHN0X2xuX2N0eDRfdCwKLSAgKmRzdF9sbl9jdHg0X3B0cl90OwotCi0KLS8qICBQWERCIGRlZmluaXRpb25zLgotICoKLSAqIFBYREIgaXMgYSBwb3N0LXByb2Nlc3NvciB3aGljaCB0YWtlcyB0aGUgZXhlY3V0YWJsZSBmaWxlCi0gKiBhbmQgbWFzc2FnZXMgdGhlIGRlYnVnIGluZm9ybWF0aW9uIHNvIHRoYXQgdGhlIGRlYnVnZ2VyIG1heQotICogc3RhcnQgdXAgYW5kIHJ1biBtb3JlIGVmZmljaWVudGx5LiAgU29tZSBvZiB0aGUgdGFza3MKLSAqIHBlcmZvcm1lZCBieSBQWERCIGFyZToKLSAqCi0gKiBvICAgUmVtb3ZlIGR1cGxpY2F0ZSBnbG9iYWwgdHlwZSBhbmQgdmFyaWFibGUgaW5mb3JtYXRpb24KLSAqICAgICBmcm9tIHRoZSBHTlRULAotICoKLSAqIG8gICBBcHBlbmQgdGhlIEdOVFQgb250byB0aGUgZW5kIG9mIHRoZSBMTlRUIGFuZCBwbGFjZSBib3RoCi0gKiAgICAgYmFjayBpbiB0aGUgTE5UVCBzZWN0aW9uLAotICoKLSAqIG8gICBCdWlsZCBxdWljayBsb29rLXVwIHRhYmxlcyAoZGVzY3JpcHRpb24gZm9sbG93cykgZm9yCi0gKiAgICAgZmlsZXMsIHByb2NlZHVyZXMsIG1vZHVsZXMsIGFuZCBwYXJhZ3JhcGhzIChmb3IgQ29ib2wpLAotICogICAgIHBsYWNpbmcgdGhlc2UgaW4gdGhlIEdOVFQgc2VjdGlvbiwKLSAqCi0gKiBvICAgUmVjb25zdHJ1Y3QgdGhlIGhlYWRlciBhcHBlYXJpbmcgaW4gdGhlIGhlYWRlciBzZWN0aW9uCi0gKiAgICAgdG8gYWNjZXNzIHRoaXMgaW5mb3JtYXRpb24uCi0gKgotICogVGhlICJxdWljayBsb29rLXVwIiB0YWJsZXMgYXJlIGluIHRoZSAkR05UVCQgc3ViLXNwYWNlLCBpbgotICogdGhlIGZvbGxvd2luZyBvcmRlcjoKLSAqCi0gKiAgICAgUHJvY2VkdXJlcyAgICAtc29ydGVkIGJ5IGFkZHJlc3MKLSAqICAgICBTb3VyY2UgZmlsZXMgIC1zb3J0ZWQgYnkgYWRkcmVzcyAob2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIGNvZGUgZnJvbSByb3V0aW5lcykKLSAqICAgICBNb2R1bGVzICAgICAgIC1zb3J0ZWQgYnkgYWRkcmVzcwotICogICAgIENsYXNzZXMgICAgICAgLTx1bnNvcnRlZD8+Ci0gKiAgICAgQWRkcmVzcyBBbGlhcyAtc29ydGVkIGJ5IGluZGV4IDw/PgotICogICAgIE9iamVjdCBJRHMgICAgLXNvcnRlZCBieSBvYmplY3QgaWRlbnRpZmllcgotICoKLSAqIE1vc3QgcXVpY2sgZW50cmllcyBoYXZlICgwLWJhc2VkKSBpbmRpY2VzIGludG8gdGhlIExOVFQgdGFibGVzIHRvCi0gKiB0aGUgZnVsbCBlbnRyaWVzIGZvciB0aGUgaXRlbSBpdCBkZXNjcmliZXMuCi0gKgotICogVGhlIHBvc3QtUFhEQiBoZWFkZXIgaXMgaW4gdGhlICRIRUFERVIkIHN1Yi1zcGFjZS4gIEFsYXMsIGl0Ci0gKiBvY2N1cnMgaW4gZGlmZmVyZW50IGZvcm1zLCBkZXBlbmRpbmcgb24gdGhlIG9wdGltaXphdGlvbiBsZXZlbAotICogaW4gdGhlIGNvbXBpbGF0aW9uIHN0ZXAgYW5kIHdoZXRoZXIgUFhEQiB3YXMgcnVuIG9yIG5vdC4gVGhlCi0gKiB3b3JzdCBwYXJ0IGlzIHRoZSBmb3JtcyBhcmVuJ3Qgc2VsZi1kZXNjcmliaW5nLCBzbyB3ZSdsbCBoYXZlCi0gKiB0byBncm92ZWwgaW4gdGhlIGJpdHMgdG8gZmlndXJlIG91dCB3aGF0IGtpbmQgd2UncmUgbG9va2luZyBhdAotICogKHNlZSBocF9nZXRfaGVhZGVyIGluIGhwLXBzeW10YWItcmVhZC5jKS4KLSAqLwotCi0vKiBQWERCIHZlcnNpb25zCi0gKi8KLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0NQTFVTUExVUwkxCi0jZGVmaW5lIFBYREJfVkVSU0lPTl83XzQJMgotI2RlZmluZSBQWERCX1ZFUlNJT05fQ1BQXzMwCTMKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0RERV8zXzJBCTQKLSNkZWZpbmUgUFhEQl9WRVJTSU9OX0RERV8zXzIJNQotI2RlZmluZSBQWERCX1ZFUlNJT05fRERFXzRfMAk2Ci0KLSNkZWZpbmUgUFhEQl9WRVJTSU9OXzJfMQkxCi0KLS8qIEhlYWRlciB2ZXJzaW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIERPQyBpbmZvCi0gKiBidXQgdGhlIGV4ZWN1dGFibGUgaGFzIGJlZW4gcHJvY2Vzc2VkIGJ5IHB4ZGIgKHRoZSBlYXN5Ci0gKiBjYXNlLCBmcm9tICJjYyAtZyIpLgotICovCi10eXBlZGVmIHN0cnVjdCBQWERCX3N0cnVjdCB7Ci0gICAgaW50ICAgICAgICAgICAgICBwZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmdW5jdGlvbiBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBmZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmaWxlIGxvb2stdXAgdGFibGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgIG1kX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIG1vZHVsZSBsb29rLXVwIHRhYmxlICovCi0gICAgdW5zaWduZWQgaW50ICAgICBweGRiZWQgOiAxOyAgIC8qIDEgPT4gZmlsZSBoYXMgYmVlbiBwcmVwcm9jZXNzZWQgICAgICAqLwotICAgIHVuc2lnbmVkIGludCAgICAgYmlnaGRyIDogMTsgICAvKiAxID0+IHRoaXMgaGVhZGVyIGNvbnRhaW5zICd0aW1lJyB3b3JkICovCi0gICAgdW5zaWduZWQgaW50ICAgICBzYV9oZWFkZXIgOiAxOy8qIDEgPT4gY3JlYXRlZCBieSBTQSB2ZXJzaW9uIG9mIHB4ZGIgKi8KLQkJCSAgICAgICAgICAgLyogICB1c2VkIGZvciB2ZXJzaW9uIGNoZWNrIGluIHhkYiAqLwotICAgIHVuc2lnbmVkIGludCAgICAgaW5saW5lZDogMTsgICAvKiBvbmUgb3IgbW9yZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIGlubGluZWQgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIHNwYXJlOjEyOwotICAgIHNob3J0ICAgICAgICAgICAgdmVyc2lvbjsgICAgICAvKiBweGRiIGhlYWRlciB2ZXJzaW9uICovCi0gICAgaW50ICAgICAgICAgICAgICBnbG9iYWxzOyAgICAgIC8qIGluZGV4IGludG8gdGhlIEROVFQgd2hlcmUgR05UVCBiZWdpbnMgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIHRpbWU7ICAgICAgICAgLyogbW9kaWZ5IHRpbWUgb2YgZmlsZSBiZWZvcmUgYmVpbmcgcHhkYmVkICovCi0gICAgaW50ICAgICAgICAgICAgICBwZ19lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBsYWJlbCBsb29rLXVwIHRhYmxlICovCi0gICAgaW50ICAgICAgICAgICAgICBmdW5jdGlvbnM7ICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZnVuY3Rpb25zICovCi0gICAgaW50ICAgICAgICAgICAgICBmaWxlczsgICAgICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZmlsZXMgKi8KLSAgICBpbnQgICAgICAgICAgICAgIGNkX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGNsYXNzIGxvb2stdXAgdGFibGUgKi8KLSAgICBpbnQgICAgICAgICAgICAgIGFhX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGFkZHIgYWxpYXMgbG9vay11cCB0YWJsZSAqLwotICAgIGludCAgICAgICAgICAgICAgb2lfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gb2JqZWN0IGlkIGxvb2stdXAgdGFibGUgKi8KLX0gUFhEQl9oZWFkZXIsICpQWERCX2hlYWRlcl9wdHI7Ci0KLS8qIEhlYWRlciB2ZXJzaW9uIGZvciB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIERPQyBpbmZvIGFuZCB0aGUKLSAqIGV4ZWN1dGFibGUgaGFzIE5PVCBiZWVuIHByb2Nlc3NlZCBieSBweGRiLgotICovCi10eXBlZGVmIHN0cnVjdCBYREJfaGVhZGVyX3N0cnVjdCB7Ci0gICAgbG9uZyBnbnR0X2xlbmd0aDsgCi0gICAgbG9uZyBsbnR0X2xlbmd0aDsgCi0gICAgbG9uZyBzbHRfbGVuZ3RoOyAKLSAgICBsb25nIHZ0X2xlbmd0aDsgCi0gICAgbG9uZyB4dF9sZW5ndGg7IAotfSBYREJfaGVhZGVyOwotCi0vKiBIZWFkZXIgdmVyc2lvbiBmb3IgdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBET0MgaW5mbyBhbmQgdGhlCi0gKiBleGVjdXRhYmxlIGhhcyBiZWVuIHByb2Nlc3NlZCBieSBweGRiLgotICovCi10eXBlZGVmIHN0cnVjdCBET0NfaW5mb19QWERCX2hlYWRlcl9zdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBpbnQgeGRiX2hlYWRlcjogMTsgCSAgICAvKiBiaXQgc2V0IGlmIHRoaXMgaXMgcG9zdC0zLjEgeGRiICovIAotICAgICAgICB1bnNpZ25lZCBpbnQgZG9jX2hlYWRlcjogMTsgICAgICAgICAvKiBiaXQgc2V0IGlmIHRoaXMgaXMgZG9jLXN0eWxlIGhlYWRlciovCi0gICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uOiA4OyAgICAgICAgICAgIC8qIHZlcnNpb24gb2YgcHhkYiBzZWUgZGVmaW5lcwotCQkJCQkgICAgICogUFhEQl9WRVJTSU9OXyogaW4gdGhpcyBmaWxlICovCi0gICAgICAgIHVuc2lnbmVkIGludCByZXNlcnZlZF9mb3JfZmxhZ3M6IDE2Oy8qIGZvciBmdXR1cmUgdXNlOyAtLSBtdXN0IGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgc2V0IHRvIHplcm8gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfYXV4X3BkX3RhYmxlOiAxOyAgIC8qICRHTlRUJCBoYXMgYXV4IFBEIHRhYmxlICovCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfZXhwcl90YWJsZTogMTsgICAgIC8qIHNwYWNlIGhhcyAkRVhQUiQgKi8gICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfcmFuZ2VfdGFibGU6IDE7ICAgIC8qIHNwYWNlIGhhcyAkUkFOR0UkICovICAgICAgIAotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2NvbnRleHRfdGFibGU6IDE7ICAvKiBzcGFjZSBoYXMgJFNSQ19DVFhUJCAqLyAgICAKLSAgICAgICAgdW5zaWduZWQgaW50IGhhc19saW5lc190YWJsZTogMTsgICAgLyogc3BhY2UgY29udGFpbnMgYSAkTElORVMkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzdWJzcGFjZSBmb3IgbGluZSB0YWJsZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX2x0X29mZnNldF9tYXA6IDE7ICAvKiBzcGFjZSBjb250YWlucyBhbiBsdF9vZmZzZXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIHN1YnNwYWNlIGZvciBsaW5lIHRhYmxlIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgIC8qIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBpbiB0aGUgUFhEQl9oZWFkZXIgaW4gJERFQlVHJCAqLwotICAgICAgICBpbnQgICAgICBwZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBmdW5jdGlvbiBsb29rLXVwIHRhYmxlICovCi0gICAgICAgIGludCAgICAgIGZkX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGZpbGUgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBtZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBtb2R1bGUgbG9vay11cCB0YWJsZSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHB4ZGJlZCA6IDE7ICAgLyogMSA9PiBmaWxlIGhhcyBiZWVuIHByZXByb2Nlc3NlZCAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgYmlnaGRyIDogMTsgICAvKiAxID0+IHRoaXMgaGVhZGVyIGNvbnRhaW5zICd0aW1lJyB3b3JkICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgc2FfaGVhZGVyIDogMTsvKiAxID0+IGNyZWF0ZWQgYnkgU0EgdmVyc2lvbiBvZiBweGRiICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICB1c2VkIGZvciB2ZXJzaW9uIGNoZWNrIGluIHhkYiAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGlubGluZWQ6IDE7ICAgLyogb25lIG9yIG1vcmUgZnVuY3Rpb25zIGhhdmUgYmVlbiBpbmxpbmVkICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgc3BhcmUgOiAyODsKLSAgICAgICAgaW50ICAgICAgZ2xvYmFsczsgICAgICAvKiBpbmRleCBpbnRvIHRoZSBETlRUIHdoZXJlIEdOVFQgYmVnaW5zICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdGltZTsgICAgICAgICAvKiBtb2RpZnkgdGltZSBvZiBmaWxlIGJlZm9yZSBiZWluZyBweGRiZWQgKi8KLSAgICAgICAgaW50ICAgICAgcGdfZW50cmllczsgICAvKiAjIG9mIGVudHJpZXMgaW4gbGFiZWwgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBmdW5jdGlvbnM7ICAgIC8qIGFjdHVhbCBudW1iZXIgb2YgZnVuY3Rpb25zICovCi0gICAgICAgIGludCAgICAgIGZpbGVzOyAgICAgICAgLyogYWN0dWFsIG51bWJlciBvZiBmaWxlcyAqLwotICAgICAgICBpbnQgICAgICBjZF9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBjbGFzcyBsb29rLXVwIHRhYmxlICovCi0gICAgICAgIGludCAgICAgIGFhX2VudHJpZXM7ICAgLyogIyBvZiBlbnRyaWVzIGluIGFkZHIgYWxpYXMgbG9vay11cCB0YWJsZSAqLwotICAgICAgICBpbnQgICAgICBvaV9lbnRyaWVzOyAgIC8qICMgb2YgZW50cmllcyBpbiBvYmplY3QgaWQgbG9vay11cCB0YWJsZSAqLwotfSBET0NfaW5mb19QWERCX2hlYWRlcjsKLQotLyogSGVhZGVyIHZlcnNpb24gZm9yIHRoZSBjYXNlIHRoYXQgdGhlcmUgaXMgRE9DIGluZm8gYW5kIHRoZQotICogZXhlY3V0YWJsZSBoYXMgTk9UIGJlZW4gcHJvY2Vzc2VkIGJ5IHB4ZGIuCi0gKi8KLXR5cGVkZWYgc3RydWN0IERPQ19pbmZvX2hlYWRlcl9zdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBpbnQgeGRiX2hlYWRlcjogMTsgCS8qIGJpdCBzZXQgaWYgdGhpcyBpcyBwb3N0LTMuMSB4ZGIgKi8gCi0gICAgICAgIHVuc2lnbmVkIGludCBkb2NfaGVhZGVyOiAxOyAgICAgLyogYml0IHNldCBpZiB0aGlzIGlzIGRvYy1zdHlsZSBoZWFkZXIqLwotICAgICAgICB1bnNpZ25lZCBpbnQgdmVyc2lvbjogODsgICAgICAgICAgICAgLyogdmVyc2lvbiBvZiBkZWJ1Zy9oZWFkZXIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuIEZvciAxMC4wIHRoZSB2YWx1ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgMS4gRm9yICJEYXZpcyIgdGhlCi0JCQkJCQl2YWx1ZSBpcyAyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50IHJlc2VydmVkX2Zvcl9mbGFnczogMTg7IC8qIGZvciBmdXR1cmUgdXNlOyAtLSBtdXN0IGJlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIHplcm8gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgaGFzX3JhbmdlX3RhYmxlOiAxOyAgICAgLyogc3BhY2UgY29udGFpbnMgYSAkUkFOR0UkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzcGFjZSBmb3IgdmFyaWFibGUgcmFuZ2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCBoYXNfY29udGV4dF90YWJsZTogMTsgICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJENUWFQkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzcGFjZSBmb3IgY29udGV4dC9pbmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50IGhhc19saW5lc190YWJsZTogMTsgICAgIC8qIHNwYWNlIGNvbnRhaW5zIGEgJExJTkVTJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIGxpbmUgdGFibGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50IGhhc19sdF9vZmZzZXRfbWFwOiAxOyAgIC8qIHNwYWNlIGNvbnRhaW5zIGFuIGx0X29mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3BhY2UgZm9yIGxpbmUgdGFibGUgbWFwcGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgbG9uZyAgIGdudHRfbGVuZ3RoOyAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCi0gICAgICAgIGxvbmcgICBsbnR0X2xlbmd0aDsgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgc2x0X2xlbmd0aDsgICAvKiBzYW1lIGFzIG9sZCBoZWFkZXIgKi8KLSAgICAgICAgbG9uZyAgIHZ0X2xlbmd0aDsgICAgLyogc2FtZSBhcyBvbGQgaGVhZGVyICovCi0gICAgICAgIGxvbmcgICB4dF9sZW5ndGg7ICAgIC8qIHNhbWUgYXMgb2xkIGhlYWRlciAqLwotICAgICAgICBsb25nICAgY3R4dF9sZW5ndGg7ICAvKiBwcmVzZW50IG9ubHkgaWYgdmVyc2lvbiA+PSAyICovCi0gICAgICAgIGxvbmcgICByYW5nZV9sZW5ndGg7ICAvKiBwcmVzZW50IG9ubHkgaWYgdmVyc2lvbiA+PSAyICovCi0gICAgICAgIGxvbmcgICBleHByX2xlbmd0aDsgIC8qIHByZXNlbnQgb25seSBpZiB2ZXJzaW9uID49IDIgKi8KLQotfSBET0NfaW5mb19oZWFkZXI7Ci0KLXR5cGVkZWYgdW5pb24gR2VuZXJpY0RlYnVnSGVhZGVyX3VuaW9uCi17Ci0gICBQWERCX2hlYWRlciAgICAgICAgICBub19kb2M7Ci0gICBET0NfaW5mb19QWERCX2hlYWRlciBkb2M7Ci0gICBYREJfaGVhZGVyICAgICAgICAgICBub19weGRiX25vX2RvYzsKLSAgIERPQ19pbmZvX2hlYWRlciAgICAgIG5vX3B4ZGJfZG9jOwotfSBHZW5lcmljRGVidWdIZWFkZXI7Ci0KLQotLyogIFByb2NlZHVyZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBwcm9jZWR1cmUgcXVpY2sgbG9vay11cCB0YWJsZQotICovCi10eXBlZGVmIHN0cnVjdCBxdWlja19wcm9jZWR1cmUgewotICAgICAgICBsb25nICAgICAgICAgICAgIGlzeW07CQkvKiAwLWJhc2VkIGluZGV4IG9mIGZpcnN0IHN5bWJvbCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBmb3IgcHJvY2VkdXJlIGluICRMTlRUJCwgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgaS5lLiB0aGUgcHJvY2VkdXJlIGl0c2VsZiAgKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJTdGFydDsJLyogbWVtb3J5IGFkciBvZiBzdGFydCBvZiBwcm9jCSovCi0gICAgICAgIENPUkVfQUREUgkgYWRyRW5kOwkvKiBtZW1vcnkgYWRyIG9mIGVuZCBvZiBwcm9jCSovCi0gICAgICAgIGNoYXIgICAgICAgICAgIAkqc2JBbGlhczsJLyogYWxpYXMgbmFtZSBvZiBwcm9jZWR1cmUJKi8KLSAgICAgICAgY2hhciAgICAgICAgICAgICpzYlByb2M7CS8qIHJlYWwgbmFtZSBvZiBwcm9jZWR1cmUJKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJCcDsJCS8qIGFkZHJlc3Mgb2YgZW50cnkgYnJlYWtwb2ludCAgKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJFeGl0QnA7CS8qIGFkZHJlc3Mgb2YgZXhpdCBicmVha3BvaW50ICAgKi8KLQlpbnQgICAgICAgICAgICAgIGljZDsgICAgICAgICAgIC8qIG1lbWJlciBvZiB0aGlzIGNsYXNzIChpbmRleCkgKi8JCi0JdW5zaWduZWQgaW50CSBpcGQ7CQkvKiBpbmRleCBvZiB0ZW1wbGF0ZSBmb3IgdGhpcyAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBmdW5jdGlvbiAoaW5kZXgpICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQJIHVudXNlZDogICAgNTsKLSAgICAgICAgdW5zaWduZWQgaW50CSBub19sdF9vZmZzZXQ6IDE7Lyogbm8gZW50cnkgaW4gbHRfb2Zmc2V0IHRhYmxlICovCi0gICAgICAgIHVuc2lnbmVkIGludAkgZlRlbXBsYXRlOiAxOwkvKiBmdW5jdGlvbiB0ZW1wbGF0ZQkJKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSBmRXhwYW5zaW9uOiAxOwkvKiBmdW5jdGlvbiBleHBhbnNpb24JCSovCi0JdW5zaWduZWQgaW50CSBsaW5rZWQJICA6IDE7CS8qIGxpbmtlZCB3aXRoIG90aGVyIGV4cGFuc2lvbnMJKi8KLQl1bnNpZ25lZCBpbnQJIGR1cGxpY2F0ZTogMTsgIC8qIGNsb25lIG9mIGFub3RoZXIgcHJvY2VkdXJlICAgKi8KLQl1bnNpZ25lZCBpbnQJIG92ZXJsb2FkZWQ6MTsgIC8qIG92ZXJsb2FkZWQgZnVuY3Rpb24gICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJIG1lbWJlcjogICAgMTsgIC8qIGNsYXNzIG1lbWJlciBmdW5jdGlvbiAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJIGNvbnN0cnVjdG9yOjE7IC8qIGNvbnN0cnVjdG9yIGZ1bmN0aW9uICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJIGRlc3RydWN0b3I6MTsgIC8qIGRlc3RydWN0b3IgZnVuY3Rpb24gICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIFN0YXRpYzogICAgMTsgIC8qIHN0YXRpYyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIFZpcnR1YWw6ICAgMTsgIC8qIHZpcnR1YWwgZnVuY3Rpb24gICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIGNvbnN0YW50OiAgMTsgIC8qIGNvbnN0YW50IGZ1bmN0aW9uICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIHB1cmU6ICAgICAgMTsgIC8qIHB1cmUgKHZpcnR1YWwpIGZ1bmN0aW9uICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIGxhbmd1YWdlOiAgNDsgIC8qIHByb2NlZHVyZSdzIGxhbmd1YWdlICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIGlubGluZWQ6ICAgMTsgIC8qIGZ1bmN0aW9uIGhhcyBiZWVuIGlubGluZWQgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgIE9wZXJhdG9yOiAgMTsgIC8qIG9wZXJhdG9yIGZ1bmN0aW9uICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJIHN0dWI6ICAgICAgMTsgIC8qIGJvZHlsZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50CSBvcHRpbWl6ZTogIDI7CS8qIG9wdGltaXphdGlvbiBsZXZlbCAgIAkqLwotICAgICAgICB1bnNpZ25lZCBpbnQJIGxldmVsOiAgICAgNTsJLyogbmVzdGluZyBsZXZlbCAodG9wPTApCSovCi19IHF1aWNrX3Byb2NlZHVyZV9lbnRyeSwgKnF1aWNrX3Byb2NlZHVyZV9lbnRyeV9wdHI7Ci0KLS8qICBTb3VyY2UgRmlsZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBzb3VyY2UgZmlsZSBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX3NvdXJjZSB7Ci0gICAgICAgIGxvbmcJICAgICAgIGlzeW07CQkvKiAwLWJhc2VkIGluZGV4IGluICRMTlRUJCBvZiAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBmaXJzdCBzeW1ib2wgZm9yIHRoaXMgZmlsZSAgICAqLwotICAgICAgICBDT1JFX0FERFIgICAgICBhZHJTdGFydDsJLyogbWVtIGFkciBvZiBzdGFydCBvZiBmaWxlJ3MgY29kZSAqLwotICAgICAgICBDT1JFX0FERFIgICAgICBhZHJFbmQ7CQkvKiBtZW0gYWRyIG9mIGVuZCBvZiBmaWxlJ3MgY29kZSAgICovCi0gICAgICAgIGNoYXIJICAgICAgKnNiRmlsZTsJCS8qIG5hbWUgb2Ygc291cmNlIGZpbGUJCSAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgIGZIYXNEZWNsOiAxOwkvKiBkbyB3ZSBoYXZlIGEgLmQgZmlsZT8JICAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgZldhcm5lZDogIDE7CS8qIGhhdmUgd2FybmVkIGFib3V0IGFnZSBwcm9ibGVtcz8gKi8KLQl1bnNpZ25lZCBpbnQgICBmU3JjZmlsZTogMTsgICAgIC8qIDAgPT4gaW5jbHVkZSAxPT4gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgdW5zaWduZWQgc2hvcnQgaWxuTWFjOwkJLyogbGluZXMgaW4gZmlsZSAoMCBpZiBkb24ndCBrbm93KSAqLwotICAgICAgICBpbnQJICAgICAgIGlwZDsJCS8qIDAtYmFzZWQgaW5kZXggb2YgZmlyc3QgcHJvY2VkdXJlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIGluIHRoaXMgZmlsZSwgaW4gdGhlIHF1aWNrICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICBsb29rLXVwIHRhYmxlIG9mIHByb2NlZHVyZXMgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICpyZ0xuOwkJLyogbGluZSBwb2ludGVyIGFycmF5LCBpZiBhbnkJICAgKi8KLX0gcXVpY2tfZmlsZV9lbnRyeSwgKnF1aWNrX2ZpbGVfZW50cnlfcHRyOwotCi0vKiAgTW9kdWxlIERlc2NyaXB0b3I6Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIG1vZHVsZSBxdWljayByZWZlcmVuY2UgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfbW9kdWxlIHsKLSAgICAgICAgbG9uZyAgICAgICAgICAgICBpc3ltOwkJICAgLyogMC1iYXNlZCBpbmRleCBvZiBmaXJzdCAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgc3ltYm9sIGZvciBtb2R1bGUgICAgICAgKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJTdGFydDsJICAgLyogYWRyIG9mIHN0YXJ0IG9mIG1vZC4JKi8KLSAgICAgICAgQ09SRV9BRERSCSBhZHJFbmQ7CSAgIC8qIGFkciBvZiBlbmQgb2YgbW9kLgkqLwotICAgICAgICBjaGFyCSAgICAgICAgKnNiQWxpYXM7CSAgIC8qIGFsaWFzIG5hbWUgb2YgbW9kdWxlICAgCSovCi0gICAgICAgIGNoYXIJICAgICAgICAqc2JNb2Q7CQkgICAvKiByZWFsIG5hbWUgb2YgbW9kdWxlCSovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgaW1wb3J0czogICAgICAgMTsgLyogbW9kdWxlIGhhdmUgYW55IGltcG9ydHM/ICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHZhcnNfaW5fZnJvbnQ6IDE7IC8qIG1vZHVsZSBnbG9iYWxzIGluIGZyb250PyAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICB2YXJzX2luX2dhcHM6ICAxOyAvKiBtb2R1bGUgZ2xvYmFscyBpbiBnYXBzPyAgICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgbGFuZ3VhZ2U6ICAgICAgNDsgLyogdHlwZSBvZiBsYW5ndWFnZSAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIHVudXNlZCAgICAgIDogMjU7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdW51c2VkMjsJICAgLyogc3BhY2UgZm9yIGZ1dHVyZSBzdHVmZgkqLwotfSBxdWlja19tb2R1bGVfZW50cnksICpxdWlja19tb2R1bGVfZW50cnlfcHRyOwotCi0vKiAgQXV4aWxpYXJ5IFByb2NlZHVyZSBEZXNjcmlwdG9yOgotICoKLSAqICBBbiBlbGVtZW50IG9mIHRoZSBhdXhpbGlhcnkgcHJvY2VkdXJlIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfYXV4X3Byb2NlZHVyZSB7Ci0gICAgICAgIGxvbmcJIGlzeW1faW5sbjsJLyogc3RhcnQgb24gaW5saW5lIGxpc3QgZm9yIHByb2MgKi8KLQlsb25nICAgICBzcGFyZTsKLX0gcXVpY2tfYXV4X3Byb2NlZHVyZV9lbnRyeSwgKnF1aWNrX2F1eF9wcm9jZWR1cmVfZW50cnlfcHRyOwotCi0vKiAgUGFyYWdyYXBoIERlc2NyaXB0b3I6Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIHBhcmFncmFwaCBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX3BhcmFncmFwaCB7Ci0gICAgICAgIGxvbmcgICAgICAgICAgICAgaXN5bTsgICAgICAgLyogZmlyc3Qgc3ltYm9sIGZvciBsYWJlbCAoaW5kZXgpICAqLwotICAgICAgICBDT1JFX0FERFIgICAgICAgIGFkclN0YXJ0OyAgIC8qIG1lbW9yeSBhZHIgb2Ygc3RhcnQgb2YgbGFiZWwgICAgKi8KLSAgICAgICAgQ09SRV9BRERSICAgICAgICBhZHJFbmQ7ICAgICAvKiBtZW1vcnkgYWRyIG9mIGVuZCBvZiBsYWJlbCAgICAgICovCi0gICAgICAgIGNoYXIgICAgICAgICAgICAqc2JMYWI7ICAgICAgLyogbmFtZSBvZiBsYWJlbCAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgICAgIGluc3Q7ICAgICAgIC8qIFVzZWQgaW4geGRiIHRvIHN0b3JlIGluc3QgQCBicCAgKi8KLSAgICAgICAgdW5zaWduZWQgaW50ICAgICBzZWN0OiAgICAxOyAvKiB0cnVlID0gc2VjdGlvbiwgZmFsc2UgPSBwYXJhZy4gICovCi0gICAgICAgIHVuc2lnbmVkIGludCAgICAgdW51c2VkOiAzMTsgLyogZnV0dXJlIHVzZSAgICAgICAgICAgICAgICAgICAgICAqLwotfSBxdWlja19wYXJhZ3JhcGhfZW50cnksICpxdWlja19wYXJhZ3JhcGhfZW50cnlfcHRyOwotCi0vKgotICogIENsYXNzIERlc2NyaXB0b3I6Ci0gKgotICogIEFuIGVsZW1lbnQgb2YgdGhlIGNsYXNzIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgcXVpY2tfY2xhc3MgewotICAgICAgICBjaGFyCSAgICAgICAgICpzYkNsYXNzOwkvKiBuYW1lIG9mIGNsYXNzCSAgICAgICAgKi8KLSAgICAgICAgbG9uZyAgICAgICAgICAgICAgaXN5bTsgICAgICAgICAvKiBjbGFzcyBzeW1ib2wgKHRhZykgICAgICAgICAgICovCi0JdW5zaWduZWQgaW50CSAgdHlwZSA6IDI7CS8qIDA9Y2xhc3MsIDE9dW5pb24sIDI9c3RydWN0ICAgKi8KLQl1bnNpZ25lZCBpbnQJICBmVGVtcGxhdGUgOiAxOy8qIGNsYXNzIHRlbXBsYXRlICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJICBleHBhbnNpb24gOiAxOy8qIHRlbXBsYXRlIGV4cGFuc2lvbiAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJICB1bnVzZWQgICAgOjI4OwotCXNsdHBvaW50ZXIgICAgICAgIGxvd3Njb3BlOwkvKiBiZWdpbm5pbmcgb2YgZGVmaW5lZCBzY29wZSAgICovCi0Jc2x0cG9pbnRlciAgICAgICAgaGlzY29wZTsJLyogZW5kIG9mIGRlZmluZWQgc2NvcGUgICAgICAgICAqLwotfSBxdWlja19jbGFzc19lbnRyeSwgKnF1aWNrX2NsYXNzX2VudHJ5X3B0cjsKLQotLyogIEFkZHJlc3MgQWxpYXMgRW50cnkKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgYWRkcmVzcyBhbGlhcyBxdWljayBsb29rLXVwIHRhYmxlCi0gKi8KLXR5cGVkZWYgc3RydWN0IHF1aWNrX2FsaWFzIHsKLQlDT1JFX0FERFIgICAgICAgbG93OwotCUNPUkVfQUREUiAgICAgICBoaWdoOwotCWludCAgICAgICAgICAgICBpbmRleDsKLQl1bnNpZ25lZCBpbnQJdW51c2VkIDogMzE7Ci0JdW5zaWduZWQgaW50CWFsdGVybmF0ZSA6IDE7CS8qIGFsdGVybmF0ZSB1bm5hbWVkIGFsaWFzZXM/ICAgKi8KLX0gcXVpY2tfYWxpYXNfZW50cnksICpxdWlja19hbGlhc19lbnRyeV9wdHI7Ci0KLS8qICBPYmplY3QgSWRlbnRpZmljYXRpb24gRW50cnkKLSAqCi0gKiAgQW4gZWxlbWVudCBvZiB0aGUgb2JqZWN0IGlkZW50aWZpY2F0aW9uIHF1aWNrIGxvb2stdXAgdGFibGUKLSAqLwotCi10eXBlZGVmIHN0cnVjdCBxdWlja19vYmpfSUQgewotCUNPUkVfQUREUiAgICBvYmpfaWRlbnQ7CQkvKiBjbGFzcyBpZGVudGlmaWVyICAgICAgICAgKi8KLQlsb25nICAgICAgICAgaXN5bTsJCS8qIGNsYXNzIHN5bWJvbCAgICAgICAgICAgICAqLwotCWxvbmcgICAgICAgICBvZmZzZXQ7CQkvKiBvZmZzZXQgdG8gb2JqZWN0IHN0YXJ0ICAgKi8KLX0gcXVpY2tfb2JqX0lEX2VudHJ5LCAqcXVpY2tfb2JqX0lEX2VudHJ5X3B0cjsKLQotCi0jZW5kaWYgLyogSFBfU1lNVEFCX0lOQ0xVREVEICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaWVlZS5oIGIvaW5jbHVkZS9pZWVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZGUzOWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9pZWVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogSUVFRSBTdGFuZGFyZCA2OTUtMTk4MCAiVW5pdmVyc2FsIEZvcm1hdCBmb3IgT2JqZWN0IE1vZHVsZXMiIGhlYWRlciBmaWxlCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gICovCi0KLSNkZWZpbmUgTl9XX1ZBUklBQkxFUyA4Ci0jZGVmaW5lIE1vZHVsZV9CZWdpbm5pbmcgMHhlMAotCi10eXBlZGVmIHN0cnVjdCBpZWVlX21vZHVsZSB7Ci0gIGNoYXIgKnByb2Nlc3NvcjsKLSAgY2hhciAqbW9kdWxlX25hbWU7Ci19IGllZWVfbW9kdWxlX2JlZ2luX3R5cGU7Ci0KLSNkZWZpbmUgQWRkcmVzc19EZXNjcmlwdG9yIDB4ZWMKLXR5cGVkZWYgc3RydWN0IGllZWVfYWRkcmVzcyB7Ci1iZmRfdm1hIG51bWJlcl9vZl9iaXRzX21hdTsKLSBiZmRfdm1hIG51bWJlcl9vZl9tYXVzX2luX2FkZHJlc3M7Ci0KLSAgdW5zaWduZWQgY2hhciBieXRlX29yZGVyOwotI2RlZmluZSBJRUVFX0xJVFRMRSAweGNjCi0jZGVmaW5lIElFRUVfQklHIDB4Y2QKLX0gaWVlZV9hZGRyZXNzX2Rlc2NyaXB0b3JfdHlwZTsKLQotdHlwZWRlZiB1bmlvbiBpZWVlX3dfdmFyaWFibGUgewotICBmaWxlX3B0ciBvZmZzZXRbTl9XX1ZBUklBQkxFU107Ci0gIHN0cnVjdCB7Ci0gICAgZmlsZV9wdHIgZXh0ZW5zaW9uX3JlY29yZDsKLSAgICBmaWxlX3B0ciBlbnZpcm9ubWVudGFsX3JlY29yZDsKLSAgICBmaWxlX3B0ciBzZWN0aW9uX3BhcnQ7Ci0gICAgZmlsZV9wdHIgZXh0ZXJuYWxfcGFydDsKLSAgICBmaWxlX3B0ciBkZWJ1Z19pbmZvcm1hdGlvbl9wYXJ0OwotICAgIGZpbGVfcHRyIGRhdGFfcGFydDsKLSAgICBmaWxlX3B0ciB0cmFpbGVyX3BhcnQ7Ci0gICAgZmlsZV9wdHIgbWVfcmVjb3JkOwotICB9IHI7Ci19IGllZWVfd192YXJpYWJsZV90eXBlOwotCi0KLQotCi0KLXR5cGVkZWYgZW51bSBpZWVlX3JlY29yZAoteyAKLSAgaWVlZV9udW1iZXJfc3RhcnRfZW51bSA9IDB4MDAsCi0gIGllZWVfbnVtYmVyX2VuZF9lbnVtPTB4N2YsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF9zdGFydF9lbnVtID0gMHg4MCwKLSAgaWVlZV9udW1iZXJfcmVwZWF0X2VuZF9lbnVtID0gMHg4OCwKLSAgaWVlZV9udW1iZXJfcmVwZWF0XzRfZW51bSA9IDB4ODQsCi0gIGllZWVfbnVtYmVyX3JlcGVhdF8zX2VudW0gPSAweDgzLAotICBpZWVlX251bWJlcl9yZXBlYXRfMl9lbnVtID0gMHg4MiwKLSAgaWVlZV9udW1iZXJfcmVwZWF0XzFfZW51bSA9IDB4ODEsCi0gIGllZWVfbW9kdWxlX2JlZ2lubmluZ19lbnVtID0gMHhlMCwKLSAgaWVlZV9tb2R1bGVfZW5kX2VudW0gPSAweGUxLAotICBpZWVlX2V4dGVuc2lvbl9sZW5ndGhfMV9lbnVtID0gMHhkZSwKLSAgaWVlZV9leHRlbnNpb25fbGVuZ3RoXzJfZW51bSA9IDB4ZGYsCi0gIGllZWVfc2VjdGlvbl90eXBlX2VudW0gPSAweGU2LAotICBpZWVlX3NlY3Rpb25fYWxpZ25tZW50X2VudW0gPSAweGU3LAotICBpZWVlX2V4dGVybmFsX3N5bWJvbF9lbnVtID0gMHhlOCwKLSAgaWVlZV9jb21tYSA9IDB4OTAsCi0gIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2VudW0gPSAweGU5LAotICBpZWVlX3NldF9jdXJyZW50X3NlY3Rpb25fZW51bSA9IDB4ZTUsCi0gIGllZWVfYWRkcmVzc19kZXNjcmlwdG9yX2VudW0gPSAweGVjLAotICBpZWVlX2xvYWRfY29uc3RhbnRfYnl0ZXNfZW51bSA9IDB4ZWQsCi0gIGllZWVfbG9hZF93aXRoX3JlbG9jYXRpb25fZW51bSA9IDB4ZTQsCi0KLSAgaWVlZV92YXJpYWJsZV9BX2VudW0gPSAweGMxLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0JfZW51bSA9IDB4YzIsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfQ19lbnVtID0gMHhjMywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9EX2VudW0gPSAweGM0LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0VfZW51bSA9IDB4YzUsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfRl9lbnVtID0gMHhjNiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9HX2VudW0gPSAweGM3LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0hfZW51bSA9IDB4YzgsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfSV9lbnVtID0gMHhjOSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9KX2VudW0gPSAweGNhLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX0tfZW51bSA9IDB4Y2IsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfTF9lbnVtID0gMHhjYywJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9NX2VudW0gPSAweGNkLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX05fZW51bSA9IDB4Y2UsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfT19lbnVtID0gMHhjZiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9QX2VudW0gPSAweGQwLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1FfZW51bSA9IDB4ZDEsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfUl9lbnVtID0gMHhkMiwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9TX2VudW0gPSAweGQzLAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1RfZW51bSA9IDB4ZDQsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfVV9lbnVtID0gMHhkNSwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9WX2VudW0gPSAweGQ2LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1dfZW51bSA9IDB4ZDcsCQkJICAgICAgICAgICAgICAgCi0gIGllZWVfdmFyaWFibGVfWF9lbnVtID0gMHhkOCwJCQkgICAgICAgICAgICAgICAKLSAgaWVlZV92YXJpYWJsZV9ZX2VudW0gPSAweGQ5LAkJCSAgICAgICAgICAgICAgIAotICBpZWVlX3ZhcmlhYmxlX1pfZW51bSA9IDB4ZGEsCi0gIGllZWVfZnVuY3Rpb25fcGx1c19lbnVtID0gMHhhNSwKLSAgaWVlZV9mdW5jdGlvbl9taW51c19lbnVtID0gMHhhNiwKLSAgaWVlZV9mdW5jdGlvbl9zaWduZWRfb3Blbl9iX2VudW0gPSAweGJhLAotICBpZWVlX2Z1bmN0aW9uX3NpZ25lZF9jbG9zZV9iX2VudW0gPSAweGJiLAotCi0gIGllZWVfZnVuY3Rpb25fdW5zaWduZWRfb3Blbl9iX2VudW0gPSAweGJjLAotICBpZWVlX2Z1bmN0aW9uX3Vuc2lnbmVkX2Nsb3NlX2JfZW51bSA9IDB4YmQsCi0KLSAgaWVlZV9mdW5jdGlvbl9laXRoZXJfb3Blbl9iX2VudW0gPSAweGJlLAotICBpZWVlX2Z1bmN0aW9uX2VpdGhlcl9jbG9zZV9iX2VudW0gPSAweGJmLAotICBpZWVlX3JlY29yZF9zZXBlcmF0b3JfZW51bSA9IDB4ZGIsCi0KLSAgaWVlZV9lMl9maXJzdF9ieXRlX2VudW0gPSAweGUyLAotICBpZWVlX3NlY3Rpb25fc2l6ZV9lbnVtID0gMHhlMmQzLAotICBpZWVlX3BoeXNpY2FsX3JlZ2lvbl9zaXplX2VudW0gPSAweGUyYzEsCi0gIGllZWVfcmVnaW9uX2Jhc2VfYWRkcmVzc19lbnVtID0gMHhlMmMyLAotICBpZWVlX21hdV9zaXplX2VudW0gPSAweGUyYzYsCi0gIGllZWVfbV92YWx1ZV9lbnVtID0gMHhlMmNkLAotICBpZWVlX3NlY3Rpb25fYmFzZV9hZGRyZXNzX2VudW0gPSAweGUyY2MsCi0gIGllZWVfYXNuX3JlY29yZF9lbnVtID0gMHhlMmNlLAotICBpZWVlX3NlY3Rpb25fb2Zmc2V0X2VudW0gPSAweGUyZDIsCi0gIGllZWVfdmFsdWVfc3RhcnRpbmdfYWRkcmVzc19lbnVtID0gMHhlMmM3LAotICBpZWVlX2Fzc2lnbl92YWx1ZV90b192YXJpYWJsZV9lbnVtID0gMHhlMmQ3LAotICBpZWVlX3NldF9jdXJyZW50X3BjX2VudW0gPSAweGUyZDAsCi0gIGllZWVfdmFsdWVfcmVjb3JkX2VudW0gPSAweGUyYzksCi0gIGllZWVfbm5fcmVjb3JkID0gMHhmMCwKLSAgaWVlZV9hdF9yZWNvcmRfZW51bSA9IDB4ZjEsCi0gIGllZWVfdHlfcmVjb3JkX2VudW0gPSAweGYyLAotICBpZWVlX2F0dHJpYnV0ZV9yZWNvcmRfZW51bSA9IDB4ZjFjOSwKLSAgaWVlZV9hdG5fcmVjb3JkX2VudW0gPSAweGYxY2UsCi0gIGllZWVfZXh0ZXJuYWxfcmVmZXJlbmNlX2luZm9fcmVjb3JkX2VudW0gPSAweGYxZDgsCi0gIGllZWVfd2Vha19leHRlcm5hbF9yZWZlcmVuY2VfZW51bT0gMHhmNCwKLSAgaWVlZV9yZXBlYXRfZGF0YV9lbnVtID0gMHhmNywKLSAgaWVlZV9iYl9yZWNvcmRfZW51bSA9IDB4ZjgsCi0gIGllZWVfYmVfcmVjb3JkX2VudW0gPSAweGY5Ci19IGllZWVfcmVjb3JkX2VudW1fdHlwZTsKLQkJIAotCi10eXBlZGVmIHN0cnVjdCBpZWVlX3NlY3Rpb24gewotICB1bnNpZ25lZCBpbnQgc2VjdGlvbl9pbmRleDsKLSAgdW5zaWduZWQgaW50IHNlY3Rpb25fdHlwZTsKLSAgY2hhciAqc2VjdGlvbl9uYW1lOwotICB1bnNpZ25lZCBpbnQgcGFyZW50X3NlY3Rpb25faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBzaWJsaW5nX3NlY3Rpb25faW5kZXg7Ci0gIHVuc2lnbmVkIGludCBjb250ZXh0X2luZGV4OwotfSBpZWVlX3NlY3Rpb25fdHlwZTsKLSNkZWZpbmUgSUVFRV9SRUZFUkVOQ0VfQkFTRSAxMQotI2RlZmluZSBJRUVFX1BVQkxJQ19CQVNFIDMyCi0jZGVmaW5lIElFRUVfU0VDVElPTl9OVU1CRVJfQkFTRSAxCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliaWJlcnR5LmggYi9pbmNsdWRlL2xpYmliZXJ0eS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjMxMzY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGliaWJlcnR5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyogRnVuY3Rpb24gZGVjbGFyYXRpb25zIGZvciBsaWJpYmVydHkuCi0gICBXcml0dGVuIGJ5IEN5Z251cyBTdXBwb3J0LCAxOTk0LgotCi0gICBUaGUgbGliaWJlcnR5IGxpYnJhcnkgcHJvdmlkZXMgYSBudW1iZXIgb2YgZnVuY3Rpb25zIHdoaWNoIGFyZQotICAgbWlzc2luZyBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLiAgV2UgZG8gbm90IGRlY2xhcmUgdGhvc2UgaGVyZSwKLSAgIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzIG9uIG9wZXJhdGluZwotICAgc3lzdGVtcyB0aGF0IGRvIHN1cHBvcnQgdGhvc2UgZnVuY3Rpb25zLiAgSW4gdGhpcyBmaWxlIHdlIG9ubHkKLSAgIGRlY2xhcmUgdGhvc2UgZnVuY3Rpb25zIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBsaWJpYmVydHkuICAqLwotCi0jaWZuZGVmIExJQklCRVJUWV9ICi0jZGVmaW5lIExJQklCRVJUWV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEJ1aWxkIGFuIGFyZ3VtZW50IHZlY3RvciBmcm9tIGEgc3RyaW5nLiAgQWxsb2NhdGVzIG1lbW9yeSB1c2luZwotICAgbWFsbG9jLiAgVXNlIGZyZWVhcmd2IHRvIGZyZWUgdGhlIHZlY3Rvci4gICovCi0KLWV4dGVybiBjaGFyICoqYnVpbGRhcmd2IFBBUkFNUyAoKGNoYXIgKikpOwotCi0vKiBGcmVlIGEgdmVjdG9yIHJldHVybmVkIGJ5IGJ1aWxkYXJndi4gICovCi0KLWV4dGVybiB2b2lkIGZyZWVhcmd2IFBBUkFNUyAoKGNoYXIgKiopKTsKLQotLyogRHVwbGljYXRlIGFuIGFyZ3VtZW50IHZlY3Rvci4gQWxsb2NhdGVzIG1lbW9yeSB1c2luZyBtYWxsb2MuICBVc2UKLSAgIGZyZWVhcmd2IHRvIGZyZWUgdGhlIHZlY3Rvci4gICovCi0KLWV4dGVybiBjaGFyICoqZHVwYXJndiBQQVJBTVMgKChjaGFyICoqKSk7Ci0KLQotLyogUmV0dXJuIHRoZSBsYXN0IGNvbXBvbmVudCBvZiBhIHBhdGggbmFtZS4gIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgYQotICAgcHJvdG90eXBlIGhlcmUgYmVjYXVzZSB0aGUgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIGluY29uc2lzdGVudGx5Ci0gICBhY3Jvc3MgZGlmZmVyZW50IHN5c3RlbXMsIHNvbWV0aW1lcyBhcyAiY2hhciAqIiBhbmQgc29tZXRpbWVzIGFzCi0gICAiY29uc3QgY2hhciAqIiAqLwotCi0jaWYgZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fICkgfHwgZGVmaW5lZCAoX19saW51eF9fKSB8fCBkZWZpbmVkIChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykgfHwgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotZXh0ZXJuIGNoYXIgKmJhc2VuYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotI2Vsc2UKLWV4dGVybiBjaGFyICpiYXNlbmFtZSAoKTsKLSNlbmRpZgotCi0vKiBDb25jYXRlbmF0ZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHN0cmluZ3MsIHVwIHRvIChjaGFyICopIE5VTEwuCi0gICBBbGxvY2F0ZXMgbWVtb3J5IHVzaW5nIHhtYWxsb2MuICAqLwotCi1leHRlcm4gY2hhciAqY29uY2F0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0KLS8qIENoZWNrIHdoZXRoZXIgdHdvIGZpbGUgZGVzY3JpcHRvcnMgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4gICovCi0KLWV4dGVybiBpbnQgZmRtYXRjaCBQQVJBTVMgKChpbnQgZmQxLCBpbnQgZmQyKSk7Ci0KLS8qIEdldCB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIHByb2Nlc3MgaGFzIHJ1biwgaW4gbWljcm9zZWNvbmRzLiAgKi8KLQotZXh0ZXJuIGxvbmcgZ2V0X3J1bl90aW1lIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogQ2hvb3NlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0byB1c2UgZm9yIHNjcmF0Y2ggZmlsZXMuICAqLwotCi1leHRlcm4gY2hhciAqY2hvb3NlX3RlbXBfYmFzZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEFsbG9jYXRlIG1lbW9yeSBmaWxsZWQgd2l0aCBzcGFjZXMuICBBbGxvY2F0ZXMgdXNpbmcgbWFsbG9jLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYWNlcyBQQVJBTVMgKChpbnQgY291bnQpKTsKLQotLyogUmV0dXJuIHRoZSBtYXhpbXVtIGVycm9yIG51bWJlciBmb3Igd2hpY2ggc3RyZXJyb3Igd2lsbCByZXR1cm4gYQotICAgc3RyaW5nLiAgKi8KLQotZXh0ZXJuIGludCBlcnJub19tYXggUEFSQU1TICgodm9pZCkpOwotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUgKGUuZy4sIHN0cmVycm5vIChFSU5WQUwpIHJldHVybnMKLSAgICJFSU5WQUwiKS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzdHJlcnJubyBQQVJBTVMgKChpbnQpKTsKLQotLyogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gZXJybm8gdmFsdWUsIHJldHVybiB0aGUgdmFsdWUuICAqLwotCi1leHRlcm4gaW50IHN0cnRvZXJybm8gUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLS8qIEFOU0kncyBzdHJlcnJvcigpLCBidXQgbW9yZSByb2J1c3QuICAqLwotCi1leHRlcm4gY2hhciAqeHN0cmVycm9yIFBBUkFNUyAoKGludCkpOwotCi0vKiBSZXR1cm4gdGhlIG1heGltdW0gc2lnbmFsIG51bWJlciBmb3Igd2hpY2ggc3Ryc2lnbmFsIHdpbGwgcmV0dXJuIGEKLSAgIHN0cmluZy4gICovCi0KLWV4dGVybiBpbnQgc2lnbm9fbWF4IFBBUkFNUyAoKHZvaWQpKTsKLQotLyogUmV0dXJuIGEgc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nIGZvciBhIHNpZ25hbCBudW1iZXIKLSAgIChlLmcuLCBzdHJzaWduYWwgKFNJR0hVUCkgcmV0dXJucyBzb21ldGhpbmcgbGlrZSAiSGFuZ3VwIikuICAqLwotLyogVGhpcyBpcyBjb21tZW50ZWQgb3V0IGFzIGl0IGNhbiBjb25mbGljdCB3aXRoIG9uZSBpbiBzeXN0ZW0gaGVhZGVycy4KLSAgIFdlIHN0aWxsIGRvY3VtZW50IGl0cyBleGlzdGVuY2UgdGhvdWdoLiAgKi8KLQotLypleHRlcm4gY29uc3QgY2hhciAqc3Ryc2lnbmFsIFBBUkFNUyAoKGludCkpOyovCi0KLS8qIFJldHVybiB0aGUgbmFtZSBvZiBhIHNpZ25hbCBudW1iZXIgKGUuZy4sIHN0cnNpZ25vIChTSUdIVVApIHJldHVybnMKLSAgICJTSUdIVVAiKS4gICovCi0KLWV4dGVybiBjb25zdCBjaGFyICpzdHJzaWdubyBQQVJBTVMgKChpbnQpKTsKLQotLyogR2l2ZW4gdGhlIG5hbWUgb2YgYSBzaWduYWwsIHJldHVybiBpdHMgbnVtYmVyLiAgKi8KLQotZXh0ZXJuIGludCBzdHJ0b3NpZ25vIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIHJ1biBieSB4ZXhpdC4gIFJldHVybnMgMCBvbiBzdWNjZXNzLiAgKi8KLQotZXh0ZXJuIGludCB4YXRleGl0IFBBUkFNUyAoKHZvaWQgKCpmbikgKHZvaWQpKSk7Ci0KLS8qIEV4aXQsIGNhbGxpbmcgYWxsIHRoZSBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHhhdGV4aXQuICAqLwotCi0jaWZuZGVmIF9fR05VQ19fCi1leHRlcm4gdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSk7Ci0jZWxzZQotdm9pZCB4ZXhpdCBQQVJBTVMgKChpbnQgc3RhdHVzKSkgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuKSk7Ci0jZW5kaWYKLQotLyogU2V0IHRoZSBwcm9ncmFtIG5hbWUgdXNlZCBieSB4bWFsbG9jLiAgKi8KLQotZXh0ZXJuIHZvaWQgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgd2l0aG91dCBmYWlsLiAgSWYgbWFsbG9jIGZhaWxzLCB0aGlzIHdpbGwgcHJpbnQgYQotICAgbWVzc2FnZSB0byBzdGRlcnIgKHVzaW5nIHRoZSBuYW1lIHNldCBieSB4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUsCi0gICBpZiBhbnkpIGFuZCB0aGVuIGNhbGwgeGV4aXQuICAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciBzaXplX3QuICAqLwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1leHRlcm4gUFRSIHhtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLS8qIFJlYWxsb2NhdGUgbWVtb3J5IHdpdGhvdXQgZmFpbC4gIFRoaXMgd29ya3MgbGlrZSB4bWFsbG9jLgotCi0gICBGSVhNRTogV2UgZG8gbm90IGRlY2xhcmUgdGhlIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzCi0gICB4bWFsbG9jLiAgKi8KLQotZXh0ZXJuIFBUUiB4cmVhbGxvYyBQQVJBTVMgKChQVFIsIHNpemVfdCkpOwotCi0vKiBBbGxvY2F0ZSBtZW1vcnkgd2l0aG91dCBmYWlsIGFuZCBzZXQgaXQgdG8gemVyby4gIFRoaXMgd29ya3MgbGlrZQotICAgeG1hbGxvYy4gICovCi0KLWV4dGVybiBQVFIgeGNhbGxvYyBQQVJBTVMgKChzaXplX3QsIHNpemVfdCkpOwotCi0vKiBDb3B5IGEgc3RyaW5nIGludG8gYSBtZW1vcnkgYnVmZmVyIHdpdGhvdXQgZmFpbC4gICovCi0KLWV4dGVybiBjaGFyICp4c3RyZHVwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBoZXggY2hhcmFjdGVyIG1hbmlwdWxhdGlvbiByb3V0aW5lcyAqLwotCi0jZGVmaW5lIF9oZXhfYXJyYXlfc2l6ZSAyNTYKLSNkZWZpbmUgX2hleF9iYWQJOTkKLWV4dGVybiBjaGFyIF9oZXhfdmFsdWVbX2hleF9hcnJheV9zaXplXTsKLWV4dGVybiB2b2lkIGhleF9pbml0IFBBUkFNUyAoKHZvaWQpKTsKLSNkZWZpbmUgaGV4X3AoYykJKGhleF92YWx1ZSAoYykgIT0gX2hleF9iYWQpCi0vKiBJZiB5b3UgY2hhbmdlIHRoaXMsIG5vdGUgd2VsbDogU29tZSBjb2RlIHJlbGllcyBvbiBzaWRlIGVmZmVjdHMgaW4KLSAgIHRoZSBhcmd1bWVudCBiZWluZyBwZXJmb3JtZWQgZXhhY3RseSBvbmNlLiAgKi8KLSNkZWZpbmUgaGV4X3ZhbHVlKGMpCShfaGV4X3ZhbHVlWyh1bnNpZ25lZCBjaGFyKSAoYyldKQotCi0vKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBwZXhlY3V0ZSByb3V0aW5lLiAgKi8KLQotI2RlZmluZSBQRVhFQ1VURV9GSVJTVCAgIDEKLSNkZWZpbmUgUEVYRUNVVEVfTEFTVCAgICAyCi0jZGVmaW5lIFBFWEVDVVRFX09ORSAgICAgKFBFWEVDVVRFX0ZJUlNUICsgUEVYRUNVVEVfTEFTVCkKLSNkZWZpbmUgUEVYRUNVVEVfU0VBUkNIICA0Ci0jZGVmaW5lIFBFWEVDVVRFX1ZFUkJPU0UgOAotCi0vKiBFeGVjdXRlIGEgcHJvZ3JhbS4gICovCi0KLWV4dGVybiBpbnQgcGV4ZWN1dGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjaGFyICogY29uc3QgKiwgY29uc3QgY2hhciAqLAotCQkJICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgY2hhciAqKiwgaW50KSk7Ci0KLS8qIFdhaXQgZm9yIHBleGVjdXRlIHRvIGZpbmlzaC4gICovCi0KLWV4dGVybiBpbnQgcHdhaXQgUEFSQU1TICgoaW50LCBpbnQgKiwgaW50KSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLQotI2VuZGlmIC8qICEgZGVmaW5lZCAoTElCSUJFUlRZX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9DaGFuZ2VMb2cgYi9pbmNsdWRlL21wdy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYmFkODcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotVHVlIEZlYiAyNyAxMjoyMzowNCAxOTk2ICBSYXltb25kIEpvdSAgPHJqb3VAbWV4aWNhbi5jeWdudXMuY29tPgotCi0JKiBtcHcuaCAoSEFWRV9WUFJJTlRGKTogQWRkIGFuZCBkZWZpbmUgdG8gaGF2ZSB0aGUgdmFsdWUgMS4KLQotRnJpIERlYyAyOSAxNDo0MDo0NiAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oIChIQVZFX1NURExJQl9ILCBldGMpOiBEZWZpbmUgdG8gaGF2ZSB0aGUgdmFsdWUgMS4KLQkoSEFWRV9GQ05UTF9IKTogRGVmaW5lLgotCi1Nb24gRGVjIDExIDE1OjM5OjA2IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmggKG9wZW4sIGFjY2Vzcyk6IERlZmluZSBhcyBtcHdfb3BlbiBhbmQgbXB3X2FjY2Vzcy4KLQotVGh1IE5vdiAgOSAxNTozODozNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5oOiBJbmNsdWRlIHVuaXguaCBpZiBVU0VfTVdfSEVBREVSUywgb3RoZXJ3aXNlIGluY2x1ZGUKLQl2YXJpb3VzIG9yaWdpbmFsIE1QVyBpbmNsdWRlIGZpbGVzIChpb2N0bC5oLCBldGMpLgotCShFSU8pOiBEZWZpbmUgaWYgbm90IGRlZmluZWQuCi0JKiBzeXMvaW9jdGwuaDogUmVtb3ZlLCBub3QgbmVlZGVkLgotCi1XZWQgT2N0IDI1IDEyOjMwOjQ0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3Lmg6IERvbid0IGluY2x1ZGUgZXJybm8uaCBvciBpb2N0bC5oLgotCShFTk9FTlQsIEVBQ0NFUywgRU5PU1lTKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCShmZG9wZW4pOiBEZWNsYXJlIGlmIF9fU1REQ19fLgotCShSX09LLCBXX09LLCBYX09LKTogRGVmaW5lIGlmIG5vdCBkZWZpbmVkLgotCi1UdWUgU2VwIDI2IDE0OjU3OjIxIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3Lmg6IE5ldyBmaWxlLCB1bml2ZXJzYWxseSB1c2VmdWwgTVBXIGhvc3QgZGVmaW5pdGlvbnMuCi0JTWFueSBvZiB0aGVzZSB1c2VkIHRvIGxpdmUgaW4gYmZkL2hvc3RzL21wdy5oLgotCSogZ3JwLmg6IFJlbW92ZSBSQ1MgY29tbWVudC4KLQkqIHN5cy9pb2N0bC5oOiBBZGQgYSBjb21tZW50IGxpbmUuCi0KLVdlZCBEZWMgMTQgMTM6MTI6MTQgMTk5NCAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBzcGluLmg6IE5ldyBmaWxlLCBjdXJzb3Igc3Bpbm5pbmcgZm9yIHByb2dyZXNzLgotCi1UaHUgSnVuIDMwIDE1OjMyOjA3IDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogZmNudGwuaCAob3Blbik6IEFsbG93IG9wdGlvbmFsIHRoaXJkIGFyZy4KLQotVGh1IEFwciAxNCAxMjo1NDo1MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGRpci5oLCBkaXJlbnQuaCwgZmNudGwuaCwgZ3JwLmgsIHB3ZC5oLCBzdGF0Lmg6IE5ldyBmaWxlcy4KLQkqIHN5cy9pb2N0bC5oOiBOZXcgZmlsZS4KLQotTW9uIEZlYiAyMSAwOTo0NDo0NSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIHN5cy9zdGF0LmggKHN0cnVjdCBzdGF0KTogTmV3IGZpZWxkIHN0X3JzaXplLgotCShTX0lGTVQsIGV0Yyk6IFVzZSBkaWZmZXJlbnQgYml0IHBvc2l0aW9ucy4KLQkoZnN0YXQpOiBBZGQgcGFyYW1ldGVyIG5hbWVzIHRvIHByb3RvdHlwZS4KLQotTW9uIEphbiAzMSAxOTozMDoxNiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIFJFQURNRTogTmV3IGZpbGUuCi0JKiB1dGltZS5oLCB2YXJhcmdzLmg6IE5ldyBmaWxlcywgc2ltdWxhdGVkIFBvc2l4LgotCSogc3lzL3tmaWxlLHBhcmFtLHJlc291cmNlLHN0YXQsdGltZSx0eXBlc30uaDogTmV3IGZpbGVzLCBtb3JlCi0Jc2ltdWxhdGVkIFBvc2l4LgotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L1JFQURNRSBiL2luY2x1ZGUvbXB3L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlOTJkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGlzIGEgY29sbGVjdGlvbiBvZiBpbmNsdWRlIGZpbGVzIHRoYXQgaGVscCBpbWl0YXRlIFBvc2l4IGluIE1QVy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L2Rpci5oIGIvaW5jbHVkZS9tcHcvZGlyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2Y2NkMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvZGlyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBUaGUgPGRpci5oPiBoZWFkZXIgZ2l2ZXMgdGhlIGxheW91dCBvZiBhIGRpcmVjdG9yeS4gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpZm5kZWYgX0RJUl9ICi0jZGVmaW5lIF9ESVJfSAotCi0jaWZuZGVmIF9UWVBFU19ICQkvKiBub3QgcXVpdGUgcmlnaHQgKi8KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZgotCi0jZGVmaW5lCURJUkJMS1NJWgk1MTIJLyogc2l6ZSBvZiBkaXJlY3RvcnkgYmxvY2sgKi8KLQotI2lmbmRlZiBESVJTSVoKLSNkZWZpbmUJRElSU0laCTE0Ci0jZW5kaWYKLQotc3RydWN0IGRpcmVjdCB7Ci0gIGlub190IGRfaW5vOwotICBjaGFyIGRfbmFtZVtESVJTSVpdOwotfTsKLQotI2VuZGlmIC8qIF9ESVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZGlyZW50LmggYi9pbmNsdWRlL21wdy9kaXJlbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgwMDBiMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9kaXJlbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpZm5kZWYgX19kaXJlbnRfaAotI2RlZmluZSBfX2RpcmVudF9oCi0KLSNpbmNsdWRlICJzeXMvZGlyLmgiCi0KLXN0cnVjdCBkaXJlbnQgewotICBsb25nIGRfaW5vOwkJCS8qIGlub2RlIG51bWJlciBvZiBlbnRyeSAqLwotICBvZmZfdAlkX29mZjsJCQkvKiBvZmZzZXQgb2YgZGlzayBkaXJlY3RvcnkgZW50cnkgKi8KLSAgdW5zaWduZWQgc2hvcnQgZF9yZWNsZW47CS8qIGxlbmd0aCBvZiB0aGlzIHJlY29yZCAqLwotICBjaGFyIGRfbmFtZVsxXTsJCS8qIG5hbWUgb2YgZmlsZSAqLwotfTsKLQotLyoKLSNkZWZpbmUJRElSRU5UQkFTRVNJWkUgXAotCSgoKHN0cnVjdCBkaXJlbnQgKikgMCktPmRfbmFtZSAtIChjaGFyICopIDApCi0jZGVmaW5lCURJUkVOVFNJWkUobmFtZWxlbikgXAotCSgoRElSRU5UQkFTRVNJWkUgKyAobmFtZWxlbikgKyBOQlBXKSAmIH4oTkJQVyAtIDEpKQotKi8KLQotLyogZnJvbSBNaXBzIHBvc2l4L2RpcmVudC5oICovCi0KLS8qCi0jdW5kZWYgcmV3aW5kZGlyCi0qLwotCi1leHRlcm4gRElSICpvcGVuZGlyKCk7Ci1leHRlcm4gc3RydWN0IGRpcmVudCAqcmVhZGRpcigpOwotZXh0ZXJuIHZvaWQJCXJld2luZGRpcigpOwotZXh0ZXJuIGludAkJY2xvc2VkaXIoKTsKLQotI2VuZGlmIC8qICEgX19kaXJlbnRfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvZmNudGwuaCBiL2luY2x1ZGUvbXB3L2ZjbnRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOTk5YjQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvZmNudGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKgotICogRkNudGwuaCAtLSBmYWNjZXNzKCksIGZjbnRsKCksIGFuZCBvcGVuKCkgbW9kZSBmbGFncwotICoKLSAqIFBvcnRpb25zIGNvcHlyaWdodCBBbWVyaWNhbiBUZWxlcGhvbmUgJiBUZWxlZ3JhcGgKLSAqIFVzZWQgd2l0aCBwZXJtaXNzaW9uLCBBcHBsZSBDb21wdXRlciBJbmMuICgxOTg1LDE5ODgsMTk5MCwxOTkyKQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqLwotCi0jaWZuZGVmIF9fRkNOVExfXwotI2RlZmluZSBfX0ZDTlRMX18KLQotI2lmbmRlZiBfX1RZUEVTX18KLSNpbmNsdWRlIDxUeXBlcy5oPgotI2VuZGlmCi0KLS8qCi0gKglGb3IgdXNlIGJ5IGxzZWVrKCk6Ci0gKi8KLQotI2lmbmRlZiBfX1NURElPX18JCQkvKiB0aGVzZSBkZWZucyBleGFjdGx5IHBhcmFsbGVkIGluIFN0ZElPLmggZm9yIGZzZWVrKCkgKi8KLSNkZWZpbmUgU0VFS19DVVIJMQotI2RlZmluZSBTRUVLX0VORAkyCi0jZGVmaW5lIFNFRUtfU0VUCTAKLSNlbmRpZgotCi0vKgotICogZmFjY2VzcygpIGNvbW1hbmRzOyBmb3IgZ2VuZXJhbCB1c2UKLSAqLwotIAkJCQkJLyogJ2QnID0+ICJkaXJlY3RvcnkiIG9wcyAqLwotI2RlZmluZSBGX0RFTEVURQkJKCgnZCc8PDgpfDB4MDEpCi0jZGVmaW5lIEZfUkVOQU1FCQkoKCdkJzw8OCl8MHgwMikKLQotLyoKLSAqIG1vcmUgZmFjY2VzcygpIGNvbW1hbmRzOyBmb3IgdXNlIG9ubHkgYnkgTVBXIHRvb2xzCi0gKi8KLSAKLSNkZWZpbmUgRl9PUEVOIAkJCSgoJ2QnPDw4KXwweDAwKQkJLyogcmVzZXJ2ZWQgZm9yIG9wZXJhdGluZyBzeXN0ZW0gdXNlICovCi0JCQkJCS8qICdlJyA9PiAiZWRpdG9yIiBvcHMgKi8KLSNkZWZpbmUgRl9HVEFCSU5GTyAJCSgoJ2UnPDw4KXwweDAwKQkJLyogZ2V0IHRhYiBvZmZzZXQgZm9yIGZpbGUgKi8JCi0jZGVmaW5lIEZfU1RBQklORk8gCQkoKCdlJzw8OCl8MHgwMSkJCS8qIHNldCAJIgkiCQkiCSIgICovCi0jZGVmaW5lIEZfR0ZPTlRJTkZPCQkoKCdlJzw8OCl8MHgwMikJCS8qIGdldCBmb250IG51bWJlciBhbmQgc2l6ZSBmb3IgZmlsZSAqLwotI2RlZmluZSBGX1NGT05USU5GTwkJKCgnZSc8PDgpfDB4MDMpCQkvKiBzZXQgCSIJCSIJIgkiCSIJIiAJICovCi0jZGVmaW5lIEZfR1BSSU5UUkVDCQkoKCdlJzw8OCl8MHgwNCkJCS8qIGdldCBwcmludCByZWNvcmQgZm9yIGZpbGUgKi8KLSNkZWZpbmUgRl9TUFJJTlRSRUMJCSgoJ2UnPDw4KXwweDA1KQkJLyogc2V0IAkiCQkiCSIJIiAJICovCi0jZGVmaW5lIEZfR1NFTElORk8gCQkoKCdlJzw8OCl8MHgwNikJCS8qIGdldCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gZm9yIGZpbGUgKi8KLSNkZWZpbmUgRl9TU0VMSU5GTyAJCSgoJ2UnPDw4KXwweDA3KQkJLyogc2V0CQkiCQkiCQkiCQkiICovCi0jZGVmaW5lIEZfR1dJTklORk8gCQkoKCdlJzw8OCl8MHgwOCkJCS8qIGdldCBjdXJyZW50IHdpbmRvdyBwb3NpdGlvbiAqLwotI2RlZmluZSBGX1NXSU5JTkZPIAkJKCgnZSc8PDgpfDB4MDkpCQkvKiBzZXQJIgkJIgkJIiAJICAgKi8KLSNkZWZpbmUgRl9HU0NST0xMSU5GTwkoKCdlJzw8OCl8MHgwQSkJCS8qIGdldCBzY3JvbGwgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgRl9TU0NST0xMSU5GTwkoKCdlJzw8OCl8MHgwQikJCS8qIHNldCAgICAiICAgCQkiICAJICAqLwotI2RlZmluZSBGX0dNQVJLRVIJCSgoJ2UnPDw4KXwweDBEKQkJLyogR2V0IE1hcmtlciAqLwotI2RlZmluZSBGX1NNQVJLRVIJCSgoJ2UnPDw4KXwweDBDKQkJLyogU2V0ICAgIiAJICAqLwotI2RlZmluZSBGX0dTQVZFT05DTE9TRQkoKCdlJzw8OCl8MHgwRikJCS8qIEdldCBTYXZlIG9uIGNsb3NlICovCi0jZGVmaW5lIEZfU1NBVkVPTkNMT1NFCSgoJ2UnPDw4KXwweDBFKQkJLyogU2V0ICAgIgkgIgkgIiAJICovCi0KLS8qCi0gKglhcmd1bWVudCBzdHJ1Y3R1cmVzIHVzZWQgYnkgdmFyaW91cyBmYWNjZXNzKCkgY29tbWFuZHMKLSAqLwotIAotc3RydWN0IE1hcmtFbGVtZW50IHsKLQlpbnQJCQkJc3RhcnQ7CQkJLyogc3RhcnQgcG9zaXRpb24gb2YgbWFyayAqLwotCWludAkJCQllbmQ7CQkJLyogZW5kIHBvc2l0aW9uICovCi0JdW5zaWduZWQgY2hhcgljaGFyQ291bnQ7CQkvKiBudW1iZXIgb2YgY2hhcnMgaW4gbWFyayBuYW1lICovCi0JY2hhcgkJCW5hbWVbNjRdOwkJLyogbWFyayBuYW1lICovCi19IDsJCQkJCQkJCQkvKiBub3RlOiBtYXJrZXIgbmFtZXMgbWF5IGJlIHVwIHRvIDY0IGNoYXJhY3RlcnMgbG9uZyAqLwotCi0jaWZuZGVmIF9fY3BsdXNwbHVzCi10eXBlZGVmIHN0cnVjdCBNYXJrRWxlbWVudCBNYXJrRWxlbWVudDsKLSNlbmRpZgotCi1zdHJ1Y3QgU2VsZWN0aW9uUmVjb3JkIHsKLQlsb25nCXN0YXJ0aW5nUG9zOwotCWxvbmcJZW5kaW5nUG9zOwotCWxvbmcJZGlzcGxheVRvcDsKLX07Ci0KLSNpZm5kZWYgX19jcGx1c3BsdXMKLXR5cGVkZWYgc3RydWN0IFNlbGVjdGlvblJlY29yZCBTZWxlY3Rpb25SZWNvcmQ7Ci0jZW5kaWYKLQotCi0vKgotICogTW9kZSB2YWx1ZXMgYWNjZXNzaWJsZSB0byBvcGVuKCkKLSAqLwotI2RlZmluZSBPX1JET05MWQkJIDAgCQkvKiBCaXRzIDAgYW5kIDEgYXJlIHVzZWQgaW50ZXJuYWxseSAqLwotI2RlZmluZSBPX1dST05MWQkJIDEgCQkvKiBWYWx1ZXMgMC4uMiBhcmUgaGlzdG9yaWNhbCAqLwotI2RlZmluZSBPX1JEV1IgCQkJIDIJCS8qIE5PVEU6IGl0IGdvZXMgMCwgMSwgMiwgKiEqIDgsIDE2LCAzMiwgLi4uICovCi0jZGVmaW5lIE9fQVBQRU5ECSgxPDwgMykJCS8qIGFwcGVuZCAod3JpdGVzIGd1YXJhbnRlZWQgYXQgdGhlIGVuZCkgKi8KLSNkZWZpbmUgT19SU1JDIAkJKDE8PCA0KQkJLyogT3BlbiB0aGUgcmVzb3VyY2UgZm9yayAqLwotI2RlZmluZSBPX0FMSUFTCQkoMTw8IDUpCQkvKiBPcGVuIGFsaWFzIGZpbGUgKi8KLSNkZWZpbmUgT19DUkVBVAkJKDE8PCA4KQkJLyogT3BlbiB3aXRoIGZpbGUgY3JlYXRlICovCi0jZGVmaW5lIE9fVFJVTkMJCSgxPDwgOSkJCS8qIE9wZW4gd2l0aCB0cnVuY2F0aW9uICovCi0jZGVmaW5lIE9fRVhDTCAJCSgxPDwxMCkgCS8qIHcvIE9fQ1JFQVQ6ICBFeGNsdXNpdmUgImNyZWF0ZS1vbmx5IiAqLwotI2RlZmluZSBPX0JJTkFSWQkoMTw8MTEpIAkvKiBPcGVuIGFzIGEgYmluYXJ5IHN0cmVhbSAqLwotI2RlZmluZSBPX05SRVNPTFZFCSgxPDwxNCkJCS8qIERvbid0IHJlc29sdmUgYW55IGFsaWFzZXMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKgotICoJCWZ1bmN0aW9uIHByb3RvdHlwZXMKLSAqLwotaW50ICBjbG9zZShpbnQpOwotaW50ICBjcmVhdChjb25zdCBjaGFyKik7Ci1pbnQJIGR1cChpbnQgZmlsZWRlcyk7CQkvKiBPQlNPTEVURTogZmNudGwoZmlsZWRlcywgRl9EVVBGRCwgMCkgaXMgcHJlZmVycmVkICovCi1pbnQJIGZhY2Nlc3MoY2hhciosIHVuc2lnbmVkIGludCwgbG9uZyopOwotaW50ICBmY250bChpbnQsIHVuc2lnbmVkIGludCwgaW50KTsKLWxvbmcgbHNlZWsoaW50LCBsb25nLCBpbnQpOwotaW50ICBvcGVuKGNvbnN0IGNoYXIqLCBpbnQsIC4uLik7Ci1pbnQgIHJlYWQoaW50LCBjaGFyKiwgdW5zaWduZWQpOwotaW50ICB1bmxpbmsoY2hhciopOwotaW50ICB3cml0ZShpbnQsIGNvbnN0IGNoYXIqLCB1bnNpZ25lZCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLS8qCi0gKiBmY250bCgpIGNvbW1hbmRzCi0gKi8KLSNkZWZpbmUgRl9EVVBGRCAwCSAgIC8qIER1cGxpY2F0ZSBmaWxlcyAoZmlsZSBkZXNjcmlwdG9yKSAqLwotCi0jZW5kaWYgX19GQ05UTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9ncnAuaCBiL2luY2x1ZGUvbXB3L2dycC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWYyYzZhLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L2dycC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJzeXMvdHlwZXMuaCIKLQotc3RydWN0IGdyb3VwIHsKLSAgY2hhciAqZ3JfbmFtZTsKLSAgZ2lkX3QgZ3JfZ2lkOwotICBjaGFyICpncl9wYXNzd2Q7Ci0gIGNoYXIgKipncl9tZW07Ci19OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvbXB3LmggYi9pbmNsdWRlL21wdy9tcHcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg3MDJlNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9tcHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKiBNYWMgTVBXIGhvc3Qtc3BlY2lmaWMgZGVmaW5pdGlvbnMuICovCi0KLSNpZm5kZWYJX19JTkNMVURFX01QV19ICi0jZGVmaW5lIF9fSU5DTFVERV9NUFdfSAotCi0jaWZuZGVmIE1QVwotI2RlZmluZSBNUFcKLSNlbmRpZgotCi0vKiBNUFcgQyBpcyBiYXNpY2FsbHkgQU5TSSwgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgZW5hYmxlIF9fU1REQ19fLAotICAgbm9yIGRvZXMgaXQgYWxsb3cgX19TVERDX18gdG8gYmUgI2RlZmluZWQuICovCi0KLSNpZm5kZWYgQUxNT1NUX1NUREMKLSNkZWZpbmUgQUxNT1NUX1NUREMKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLSNkZWZpbmUgSEFWRV9USU1FX1RfSU5fVElNRV9IIDEKLQotI2RlZmluZSBIQVZFX1NURExJQl9IIDEKLQotI2RlZmluZSBIQVZFX0VSUk5PX0ggMQotCi0jZGVmaW5lIEhBVkVfU1REREVGX0ggMQotCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotCi0jZGVmaW5lIEhBVkVfU1REQVJHX0ggMQotCi0jZGVmaW5lIEhBVkVfVlBSSU5URiAxCi0KLSNpZmRlZiBVU0VfTVdfSEVBREVSUwotCi0jaW5jbHVkZSA8dW5peC5oPgotCi0jZWxzZQotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLQotI2lmbmRlZglPX0FDQ01PREUKLSNkZWZpbmUgT19BQ0NNT0RFIChPX1JET05MWSB8IE9fV1JPTkxZIHwgT19SRFdSKQotI2VuZGlmCi0KLSNpZm5kZWYgZmlsZW5vCi0jZGVmaW5lIGZpbGVubyhmcCkgKChmcCktPl9maWxlKQotI2VuZGlmCi0KLS8qIHN0ZGlvLmggZG9lcyBub3QgZGVmaW5lIHRoaXMgaWYgX19TVERDX18sIHNvIGRlZmluZSBoZXJlLiAqLwotCi0jaWZkZWYgX19TVERDX18KLUZJTEUgKmZkb3BlbihpbnQgZmlsZGVzLCBjb25zdCBjaGFyICptb2RlKTsKLSNlbmRpZgotCi0jZW5kaWYgLyogVVNFX01XX0hFQURFUlMgKi8KLQotLyogQWRkIGVyc2F0eiBkZWZpbml0aW9ucywgZm9yIHN5c3RlbXMgdGhhdCBsYWNrIHRoZW0uICAqLwotCi0jaWZuZGVmIEVJTwotI2RlZmluZSBFSU8gOTYKLSNlbmRpZgotI2lmbmRlZiBFTk9FTlQKLSNkZWZpbmUgRU5PRU5UIDk3Ci0jZW5kaWYKLSNpZm5kZWYgRUFDQ0VTCi0jZGVmaW5lIEVBQ0NFUyA5OAotI2VuZGlmCi0jaWZuZGVmIEVOT1NZUwotI2RlZmluZSBFTk9TWVMgOTkKLSNlbmRpZgotCi0jaWZuZGVmIFJfT0sKLSNkZWZpbmUgUl9PSyA0Ci0jZGVmaW5lIFdfT0sgMgotI2RlZmluZSBYX09LIDEKLSNlbmRpZgotCi0vKiBCaW5hcnkgZmlsZXMgaGF2ZSBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzOyBmb3IgaW5zdGFuY2UsIG5vIGNyL25sCi0gICB0cmFuc2xhdGlvbi4gKi8KLQotI2RlZmluZSBVU0VfQklOQVJZX0ZPUEVOCi0KLSNpbmNsdWRlIDxzcGluLmg+Ci0KLSNpZmRlZiBNUFdfQwotI3VuZGVmICBfX1BUUl9UT19JTlQKLSNkZWZpbmUgX19QVFJfVE9fSU5UKFApICgoaW50KShQKSkKLSN1bmRlZiBfX0lOVF9UT19QVFIKLSNkZWZpbmUgX19JTlRfVE9fUFRSKFApICgoY2hhciAqKShQKSkKLSNlbmRpZiAvKiBNUFdfQyAqLwotCi0jZGVmaW5lIE5PX0ZDTlRMCi0KLWludCBmc3RhdCAoKTsKLQotRklMRSAqbXB3X2ZvcGVuICgpOwotaW50IG1wd19mc2VlayAoKTsKLWludCBtcHdfZnJlYWQgKCk7Ci1pbnQgbXB3X2Z3cml0ZSAoKTsKLWludCBtcHdfYWNjZXNzICgpOwotaW50IG1wd19vcGVuICgpOwotaW50IG1wd19jcmVhdCAoKTsKLXZvaWQgbXB3X2Fib3J0ICh2b2lkKTsKLQotLyogTWFwIHRoZXNlIHN0YW5kYXJkIGZ1bmN0aW9ucyB0byBpbXByb3ZlZCB2ZXJzaW9ucyBpbiBsaWJpYmVydHkuICovCi0KLSNkZWZpbmUgZm9wZW4gbXB3X2ZvcGVuCi0jZGVmaW5lIGZzZWVrIG1wd19mc2VlawotI2RlZmluZSBmcmVhZCBtcHdfZnJlYWQKLSNkZWZpbmUgZndyaXRlIG1wd19md3JpdGUKLSNkZWZpbmUgb3BlbiBtcHdfb3BlbgotI2RlZmluZSBhY2Nlc3MgbXB3X2FjY2VzcwotI2RlZmluZSBjcmVhdCBtcHdfY3JlYXQKLSNkZWZpbmUgYWJvcnQgbXB3X2Fib3J0Ci0KLSNkZWZpbmUgUE9TSVhfVVRJTUUKLQotI2RlZmluZSBMT1NJTkdfVE9UQUxMWQotCi0vKiBEZWZpbmUgdGhpcyBzbyB0aGF0IGZpbGVzIHdpbGwgYmUgY2xvc2VkIGJlZm9yZSBiZWluZyB1bmxpbmtlZC4gKi8KLQotI2RlZmluZSBDTE9TRV9CRUZPUkVfVU5MSU5LCi0KLSNlbmRpZiAvKiBfX0lOQ0xVREVfTVBXX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3B3ZC5oIGIvaW5jbHVkZS9tcHcvcHdkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGZiNzAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvcHdkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jaWZuZGVmIF9fcHdkX2gKLSNkZWZpbmUgX19wd2RfaAotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLXN0cnVjdCBwYXNzd2QgewotICBjaGFyICpwd19uYW1lOwotICB1aWRfdCBwd191aWQ7Ci0gIGdpZF90IHB3X2dpZDsKLSAgY2hhciAqcHdfZGlyOwotICBjaGFyICpwd19zaGVsbDsKLSAgY2hhciAqcHdfcGFzc3dkOwotfTsKLQotI2VuZGlmIC8qICEgX19wd2RfaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3Bpbi5oIGIvaW5jbHVkZS9tcHcvc3Bpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdkMTQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3NwaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qIFByb2dyZXNzIG1hY3JvcyB0aGF0IHVzZSBTcGluQ3Vyc29yIGluIE1QVy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfU1BJTl9ICi0jZGVmaW5lIF9TUElOX0gKLQotLyogRm9yIE1QVywgcHJvZ3Jlc3MgbWFjcm9zIGp1c3QgbmVlZCB0byAic3BpbiB0aGUgY3Vyc29yIiBmcmVxdWVudGx5LAotICAgcHJlZmVyYWJseSBzZXZlcmFsIHRpbWVzIHBlciBzZWNvbmQgb24gYSA2OEsgTWFjLiAgKi8KLQotLyogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlJ3JlIG1lZXRpbmcgdGhlIGdvYWwsIGRlZmluZSB0aGlzIG1hY3JvCi0gICBhbmQgaW5mb3JtYXRpb24gYWJvdXQgZnJlcXVlbmN5IG9mIHNwaW5uaW5nIHdpbGwgYmUgY29sbGVjdGVkIGFuZAotICAgZGlzcGxheWVkLiAgKi8KLQotI2RlZmluZSBTUElOX01FQVNVUkVNRU5UCi0KLSNpbmNsdWRlIDxDdXJzb3JDdGwuaD4KLQotLyogUHJvZ3JhbXMgdXNlIHRoaXMgbWFjcm8gdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbGVuZ3RoeQotICAgYWN0aXZpdHkuICBTVFIgaWRlbnRpZmllcyB0aGUgcGFydGljdWxhciBhY3Rpdml0eSwgd2hpbGUgTgotICAgaW5kaWNhdGVzIHRoZSBleHBlY3RlZCBkdXJhdGlvbiwgaW4gdW5zcGVjaWZpZWQgdW5pdHMuICBJZiBOIGlzCi0gICB6ZXJvLCB0aGVuIHRoZSBleHBlY3RlZCB0aW1lIHRvIGNvbXBsZXRpb24gaXMgdW5rbm93bi4gICovCi0KLSN1bmRlZiBTVEFSVF9QUk9HUkVTUwotI2RlZmluZSBTVEFSVF9QUk9HUkVTUyhTVFIsTikgbXB3X3N0YXJ0X3Byb2dyZXNzIChTVFIsIE4sIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0KLS8qIFByb2dyYW1zIHVzZSB0aGlzIG1hY3JvIHRvIGluZGljYXRlIHRoYXQgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZSBvbiBhCi0gICBsZW5ndGh5IGFjdGl2aXR5LiAgKi8KLQotI3VuZGVmIFBST0dSRVNTCi0jaWZkZWYgU1BJTl9NRUFTVVJFTUVOVAotI2RlZmluZSBQUk9HUkVTUyhYKSBtcHdfcHJvZ3Jlc3NfbWVhc3VyZWQgKFgsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0jZWxzZQotI2RlZmluZSBQUk9HUkVTUyhYKSBtcHdfcHJvZ3Jlc3MgKFgpOwotI2VuZGlmIAotCi0vKiBQcm9ncmFtcyB1c2UgdGhpcyBtYWNybyB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgbGVuZ3RoeSBhY3Rpdml0eS4KLSAgIFNUUiBtdXN0IG1hdGNoIGEgU1RSIHBhc3NlZCB0byBTVEFSVF9QUk9HUkVTUyBwcmV2aW91c2x5LiAgKi8KLQotI3VuZGVmIEVORF9QUk9HUkVTUwotI2RlZmluZSBFTkRfUFJPR1JFU1MoU1RSKSBtcHdfZW5kX3Byb2dyZXNzIChTVFIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0KLWV4dGVybiB2b2lkIG1wd19zdGFydF9wcm9ncmVzcyAoY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKLQotZXh0ZXJuIHZvaWQgbXB3X3Byb2dyZXNzIChpbnQpOwotCi1leHRlcm4gdm9pZCBtcHdfcHJvZ3Jlc3NfbWVhc3VyZWQgKGludCwgY2hhciAqLCBpbnQpOwotCi1leHRlcm4gdm9pZCBtcHdfZW5kX3Byb2dyZXNzIChjaGFyICosIGNoYXIgKiwgaW50KTsKLQotI2VuZGlmIC8qIF9TUElOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N0YXQuaCBiL2luY2x1ZGUvbXB3L3N0YXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3YjhkNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21wdy9zdGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKiBUaGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBkZWZpbmVzIGEgc3RydWN0IHRoYXQgaXMgdXNlZCBpbiB0aGUgc3RhdCgpIGFuZAotICogZnN0YXQgZnVuY3Rpb25zLiAgVGhlIGluZm9ybWF0aW9uIGluIHRoaXMgc3RydWN0IGNvbWVzIGZyb20gdGhlIGktbm9kZSBvZgotICogc29tZSBmaWxlLiAgVGhlc2UgY2FsbHMgYXJlIHRoZSBvbmx5IGFwcHJvdmVkIHdheSB0byBpbnNwZWN0IGktbm9kZXMuCi0gKi8KLQotI2lmbmRlZiBfU1RBVF9ICi0jZGVmaW5lIF9TVEFUX0gKLQotI2lmbmRlZiBfVFlQRVNfSAkJLyogbm90IHF1aXRlIHJpZ2h0ICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotc3RydWN0IHN0YXQgewotICBkZXZfdCBzdF9kZXY7CQkJLyogbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciAqLwotICBpbm9fdCBzdF9pbm87CQkJLyogaS1ub2RlIG51bWJlciAqLwotICBtb2RlX3Qgc3RfbW9kZTsJCS8qIGZpbGUgbW9kZSwgcHJvdGVjdGlvbiBiaXRzLCBldGMuICovCi0gIHNob3J0IGludCBzdF9ubGluazsJCS8qICMgbGlua3M7IFRFTVBPUkFSWSBIQUNLOiBzaG91bGQgYmUgbmxpbmtfdCovCi0gIHVpZF90IHN0X3VpZDsJCQkvKiB1aWQgb2YgdGhlIGZpbGUncyBvd25lciAqLwotICBzaG9ydCBpbnQgc3RfZ2lkOwkJLyogZ2lkOyBURU1QT1JBUlkgSEFDSzogc2hvdWxkIGJlIGdpZF90ICovCi0gIGRldl90IHN0X3JkZXY7Ci0gIG9mZl90IHN0X3NpemU7CQkvKiBmaWxlIHNpemUgKi8KLSAgdGltZV90IHN0X2F0aW1lOwkJLyogdGltZSBvZiBsYXN0IGFjY2VzcyAqLwotICB0aW1lX3Qgc3RfbXRpbWU7CQkvKiB0aW1lIG9mIGxhc3QgZGF0YSBtb2RpZmljYXRpb24gKi8KLSAgdGltZV90IHN0X2N0aW1lOwkJLyogdGltZSBvZiBsYXN0IGZpbGUgc3RhdHVzIGNoYW5nZSAqLwotfTsKLQotLyogVHJhZGl0aW9uYWwgbWFzayBkZWZpbml0aW9ucyBmb3Igc3RfbW9kZS4gKi8KLSNkZWZpbmUgU19JRk1UICAwMTcwMDAwCQkvKiB0eXBlIG9mIGZpbGUgKi8KLSNkZWZpbmUgU19JRlJFRyAwMTAwMDAwCQkvKiByZWd1bGFyICovCi0jZGVmaW5lIFNfSUZCTEsgMDA2MDAwMAkJLyogYmxvY2sgc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGRElSIDAwNDAwMDAgIAkvKiBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgU19JRkNIUiAwMDIwMDAwCQkvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGSUZPIDAwMTAwMDAJCS8qIHRoaXMgaXMgYSBGSUZPICovCi0jZGVmaW5lIFNfSVNVSUQgMDAwNDAwMAkJLyogc2V0IHVzZXIgaWQgb24gZXhlY3V0aW9uICovCi0jZGVmaW5lIFNfSVNHSUQgMDAwMjAwMAkJLyogc2V0IGdyb3VwIGlkIG9uIGV4ZWN1dGlvbiAqLwotCQkJCS8qIG5leHQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLSNkZWZpbmUgU19JU1ZUWCAgIDAxMDAwCQkvKiBzYXZlIHN3YXBwZWQgdGV4dCBldmVuIGFmdGVyIHVzZSAqLwotCi0vKiBQT1NJWCBtYXNrcyBmb3Igc3RfbW9kZS4gKi8KLSNkZWZpbmUgU19JUldYVSAgIDAwNzAwCQkvKiBvd25lcjogIHJ3eC0tLS0tLSAqLwotI2RlZmluZSBTX0lSVVNSICAgMDA0MDAJCS8qIG93bmVyOiAgci0tLS0tLS0tICovCi0jZGVmaW5lIFNfSVdVU1IgICAwMDIwMAkJLyogb3duZXI6ICAtdy0tLS0tLS0gKi8KLSNkZWZpbmUgU19JWFVTUiAgIDAwMTAwCQkvKiBvd25lcjogIC0teC0tLS0tLSAqLwotCi0jZGVmaW5lIFNfSVJXWEcgICAwMDA3MAkJLyogZ3JvdXA6ICAtLS1yd3gtLS0gKi8KLSNkZWZpbmUgU19JUkdSUCAgIDAwMDQwCQkvKiBncm91cDogIC0tLXItLS0tLSAqLwotI2RlZmluZSBTX0lXR1JQICAgMDAwMjAJCS8qIGdyb3VwOiAgLS0tLXctLS0tICovCi0jZGVmaW5lIFNfSVhHUlAgICAwMDAxMAkJLyogZ3JvdXA6ICAtLS0tLXgtLS0gKi8KLQotI2RlZmluZSBTX0lSV1hPICAgMDAwMDcJCS8qIG90aGVyczogLS0tLS0tcnd4ICovCi0jZGVmaW5lIFNfSVJPVEggICAwMDAwNAkJLyogb3RoZXJzOiAtLS0tLS1yLS0gKi8gCi0jZGVmaW5lIFNfSVdPVEggICAwMDAwMgkJLyogb3RoZXJzOiAtLS0tLS0tdy0gKi8KLSNkZWZpbmUgU19JWE9USCAgIDAwMDAxCQkvKiBvdGhlcnM6IC0tLS0tLS0teCAqLwotCi0vKiBUaGUgZm9sbG93aW5nIG1hY3JvcyB0ZXN0IHN0X21vZGUgKGZyb20gUE9TSVggU2VjLiA1LjYuMS4xLiAqLwotI2RlZmluZSBTX0lTUkVHKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRlJFRykJLyogaXMgYSByZWcgZmlsZSAqLwotI2RlZmluZSBTX0lTRElSKG0pCSgobSAmIFNfSUZNVCkgPT0gU19JRkRJUikJLyogaXMgYSBkaXJlY3RvcnkgKi8KLSNkZWZpbmUgU19JU0NIUihtKQkoKG0gJiBTX0lGTVQpID09IFNfSUZDSFIpCS8qIGlzIGEgY2hhciBzcGVjICovCi0jZGVmaW5lIFNfSVNCTEsobSkJKChtICYgU19JRk1UKSA9PSBTX0lGQkxLKQkvKiBpcyBhIGJsb2NrIHNwZWMgKi8KLSNkZWZpbmUgU19JU0ZJRk8obSkJKChtICYgU19JRk1UKSA9PSBTX0lGSUZPKQkvKiBpcyBhIHBpcGUvRklGTyAqLwotCi0KLS8qIEZ1bmN0aW9uIFByb3RvdHlwZXMuICovCi0jaWZuZGVmIF9BTlNJX0gKLSNpbmNsdWRlIDxhbnNpLmg+Ci0jZW5kaWYKLQotX1BST1RPVFlQRSggaW50IGNobW9kLCAoY29uc3QgY2hhciAqX3BhdGgsIGludCBfbW9kZSkJCQkpOwotX1BST1RPVFlQRSggaW50IGZzdGF0LCAoaW50IF9maWxkZXMsIHN0cnVjdCBzdGF0ICpfYnVmKQkJCSk7Ci1fUFJPVE9UWVBFKCBpbnQgbWtkaXIsIChjb25zdCBjaGFyICpfcGF0aCwgaW50IF9tb2RlKQkJCSk7Ci1fUFJPVE9UWVBFKCBpbnQgbWtmaWZvLCAoY29uc3QgY2hhciAqX3BhdGgsIGludCBfbW9kZSkJCQkpOwotX1BST1RPVFlQRSggaW50IHN0YXQgLCAoY29uc3QgY2hhciAqX3BhdGgsIHN0cnVjdCBzdGF0ICpfYnVmKQkJKTsKLV9QUk9UT1RZUEUoIG1vZGVfdCB1bWFzaywgKGludCBfY21hc2spCQkJCQkpOwotCi0jZW5kaWYgLyogX1NUQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3lzL2ZpbGUuaCBiL2luY2x1ZGUvbXB3L3N5cy9maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYThjMTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3lzL2ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS8qIGVtcHR5ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy9zeXMvcGFyYW0uaCBiL2luY2x1ZGUvbXB3L3N5cy9wYXJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE4YzE3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy9wYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLyogZW1wdHkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy9yZXNvdXJjZS5oIGIvaW5jbHVkZS9tcHcvc3lzL3Jlc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTQzOWQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3lzL3Jlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNpZm5kZWYgX19TWVNfUkVTT1VSQ0VfSF9fCi0jZGVmaW5lIF9fU1lTX1JFU09VUkNFX0hfXwotCi1zdHJ1Y3QgcnVzYWdlIHsKLSAgc3RydWN0IHRpbWV2YWwgcnVfdXRpbWU7Ci0gIHN0cnVjdCB0aW1ldmFsIHJ1X3N0aW1lOwotfTsKLQotI2VuZGlmIC8qIF9fU1lTX1JFU09VUkNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvc3lzL3N0YXQuaCBiL2luY2x1ZGUvbXB3L3N5cy9zdGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NWM3MmUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3lzL3N0YXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIEltaXRhdGlvbiBzeXMvc3RhdC5oLiAqLwotCi0jaWZuZGVmIF9fU1lTX1NUQVRfSF9fCi0jZGVmaW5lIF9fU1lTX1NUQVRfSF9fCi0KLSNpbmNsdWRlICA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSAgPHRpbWUuaD4KLQotc3RydWN0IHN0YXQgewotICBkZXZfdCAgIHN0X2RldjsKLSAgaW5vX3QgICBzdF9pbm87Ci0gIG1vZGVfdCAgc3RfbW9kZTsKLSAgc2hvcnQgICBzdF9ubGluazsKLSAgdWlkX3QgICBzdF91aWQ7Ci0gIGdpZF90ICAgc3RfZ2lkOwotICBkZXZfdCAgIHN0X3JkZXY7Ci0gIG9mZl90ICAgc3Rfc2l6ZTsKLSAgb2ZmX3QgICBzdF9yc2l6ZTsKLSAgdGltZV90ICBzdF9hdGltZTsKLSAgaW50ICAgICBzdF9zcGFyZTE7Ci0gIHRpbWVfdCAgc3RfbXRpbWU7Ci0gIGludCAgICAgc3Rfc3BhcmUyOwotICB0aW1lX3QgIHN0X2N0aW1lOwotICBpbnQgICAgIHN0X3NwYXJlMzsKLSAgbG9uZyAgICBzdF9ibGtzaXplOwotICBsb25nICAgIHN0X2Jsb2NrczsKLSAgbG9uZyAgICBzdF9zcGFyZTRbMl07Ci19OwotCi0jZGVmaW5lIFNfSUZNVAkwMTcwMDAwTAotI2RlZmluZSBTX0lGRElSCTAwNDAwMDBMCi0jZGVmaW5lIFNfSUZSRUcgMDEwMDAwMEwKLSNkZWZpbmUgU19JUkVBRCAgICAwNDAwCi0jZGVmaW5lIFNfSVdSSVRFICAgMDIwMAotI2RlZmluZSBTX0lFWEVDICAgIDAxMDAKLQotI2RlZmluZSBTX0lGSUZPIDAxMDAwMCAgLyogRklGTyBzcGVjaWFsICovCi0jZGVmaW5lIFNfSUZDSFIgMDIwMDAwICAvKiBjaGFyYWN0ZXIgc3BlY2lhbCAqLwotI2RlZmluZSBTX0lGQkxLIDAzMDAwMCAgLyogYmxvY2sgc3BlY2lhbCAqLwotCi1pbnQgc3RhdCAoY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKmJ1Zik7Ci1pbnQgZnN0YXQgKGludCBmZCwgc3RydWN0IHN0YXQgKmJ1Zik7Ci0KLSNlbmRpZiAvKiBfX1NZU19TVEFUX0hfX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy90aW1lLmggYi9pbmNsdWRlL21wdy9zeXMvdGltZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWU0ODUyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3N5cy90aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKiBJbWl0YXRpb24gc3lzL3RpbWUuaC4gKi8KLQotI2lmbmRlZiBfX1NZU19USU1FX0hfXwotI2RlZmluZSBfX1NZU19USU1FX0hfXwotCi0jaW5jbHVkZSA8dGltZS5oPgotCi1zdHJ1Y3QgdGltZXZhbCB7Ci0gIGxvbmcgdHZfc2VjOwotICBsb25nIHR2X3VzZWM7Ci19OwotCi0jZW5kaWYgLyogX19TWVNfVElNRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbXB3L3N5cy90eXBlcy5oIGIvaW5jbHVkZS9tcHcvc3lzL3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDljOWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvc3lzL3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKiBJbWl0YXRpb24gc3lzL3R5cGVzLmguICovCi0KLSNpZm5kZWYgX19TWVNfVFlQRVNfSF9fCi0jZGVmaW5lIF9fU1lTX1RZUEVTX0hfXwotCi0jaW5jbHVkZSA8VHlwZXMuaD4KLQotdHlwZWRlZiBzaG9ydCBkZXZfdDsKLXR5cGVkZWYgc2hvcnQgaW5vX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG1vZGVfdDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgdWlkX3Q7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IGdpZF90OwotdHlwZWRlZiBsb25nIG9mZl90OwotCi0jZW5kaWYgLyogX19TWVNfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21wdy91dGltZS5oIGIvaW5jbHVkZS9tcHcvdXRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiZjY2ZjIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tcHcvdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCi1zdHJ1Y3QgdXRpbWJ1ZiB7Ci0gIHRpbWVfdCBhY3RpbWU7Ci0gIHRpbWVfdCBtb2R0aW1lOwotfTsKLQotaW50IHV0aW1lIChjaGFyICosIHN0cnVjdCB1dGltYnVmICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tcHcvdmFyYXJncy5oIGIvaW5jbHVkZS9tcHcvdmFyYXJncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I5ZTQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbXB3L3ZhcmFyZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotLyogdmFyYXJncy5oLiAqLwotI2lmbmRlZiBfX3ZhX2xpc3RfXwotI2RlZmluZSBfX3ZhX2xpc3RfXwotdHlwZWRlZiBjaGFyICp2YV9saXN0OwotI2VuZGlmCi0jZGVmaW5lIHZhX2RjbCBpbnQgdmFfYWxpc3Q7Ci0jZGVmaW5lIHZhX3N0YXJ0KGxpc3QpIGxpc3QgPSAoY2hhciAqKSAmdmFfYWxpc3QKLSNkZWZpbmUgdmFfZW5kKGxpc3QpCi0jZGVmaW5lIHZhX2FyZyhsaXN0LG1vZGUpICgobW9kZSAqKShsaXN0ICs9IHNpemVvZihtb2RlKSkpWy0xXQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vQ2hhbmdlTG9nIGIvaW5jbHVkZS9ubG0vQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWVhM2QwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbmxtL0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLUZyaSBNYXkgIDYgMTM6MzE6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBleHRlcm5hbC5oIChubG1OQU1FKEV4dGVybmFsX0N1c3RvbV9IZWFkZXIpKTogQWRkIGxlbmd0aCwKLQlkYXRhT2Zmc2V0LCBhbmQgZGF0YVN0YW1wIGZpZWxkLgotCShubG1OQU1FKEV4dGVybmFsX0N5Z251c19FeHRfSGVhZGVyKSk6IFJlbW92ZS4KLQkqIGludGVybmFsLmggKE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyKTogQWRkIGhkckxlbmd0aCwKLQlkYXRhT2Zmc2V0LCBkYXRhU3RhbXAgYW5kIGhkciBmaWVsZHMuCi0KLUZyaSBBcHIgMjIgMTE6MTI6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBleHRlcm5hbC5oIChzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcikpOiBSZW5hbWUKLQlmcm9tIG5sbU5BTUUoZXh0ZXJuYWxfY3lnbnVzX3NlY3Rpb25faGVhZGVyKS4gIENoYW5nZSBzdGFtcCBmaWVsZAotCXRvIDggYnl0ZXMuICBBZGQgYnl0ZXMgZmllbGQuCi0JKiBpbnRlcm5hbC5oIChubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIpOiBSZW5hbWUgZnJvbQotCW5sbV9pbnRlcm5hbF9jeWdudXNfc2VjdGlvbl9oZWFkZXIuICBDaGFuZ2Ugc3RhbXAgZmllbGQgdG8gOAotCWJ5dGVzLgotCi1UaHUgQXByIDIxIDExOjU3OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaCAoc3RydWN0IG5sbV9pbnRlcm5hbF9jeWdudXNfc2VjdGlvbl9oZWFkZXIpOiBEZWZpbmUuCi0JKiBleHRlcm5hbC5oIChzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF9jeWdudXNfc2VjdGlvbl9oZWFkZXIpOgotCURlZmluZS4KLQotV2VkIEFwciAyMCAxNDoyNzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGludGVybmFsLmggKHN0cnVjdCBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcik6IFJlbW92ZQotCWRlYnVnUmVjT2Zmc2V0IGFuZCBkZWJ1Z1JlY0xlbmd0aCBmaWVsZHMuICBBZGQgZGF0YSBmaWVsZC4KLQkqIGV4dGVybmFsLmggKHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2N1c3RvbV9oZWFkZXIpKTogUmVtb3ZlCi0JZGVidWdSZWNPZmZzZXQgYW5kIGRlYnVnUmVjTGVuZ3RoIGZpZWxkcy4KLQotTW9uIEZlYiAgNyAwODoyODo0MCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIEhPU1RfNjRfQklUIHRvIEJGRF9IT1NUXzY0X0JJVC4KLQotVGh1IERlYyAgMiAxNDoxNDo0OCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGFscGhhLWV4dC5oOiBOZXcgZmlsZSBkZXNjcmliaW5nIGZvcm1hdHMgb2YgaW5mb3JtYXRpb24gaW4gQWxwaGEKLQlOZXRXYXJlIGZpbGVzLgotCSogY29tbW9uLmg6IERlZmluZSBzb21lIG5vbi1leHRlcm5hbCBBbHBoYSBpbmZvcm1hdGlvbi4KLQotV2VkIE5vdiAxNyAxNzozODo1OCAxOTkzICBTZWFuIEVyaWMgRmFnYW4gIChzZWZAY3lnbnVzLmNvbSkKLQotCSogZXh0ZXJuYWwuaDogRG9uJ3QgZGVmaW5lIGV4dGVybmFsX2ZpeGVkX2hlYWRlciBoZXJlLgotCSogaTM4Ni1leHQuaCwgc3BhcmMzMi1leHQuaDogTmV3IGhlYWRlciBmaWxlcyB0byBkZWZpbmUKLQlleHRlcm5hbF9maXhlZF9oZWFkZXIgZm9yIHBhcnRpY3VsYXIgQ1BVJ3MuCi0KLVdlZCBPY3QgMjcgMTE6NDU6NTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpbnRlcm5hbC5oIChObG1fSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKTogQWRkZWQgZmllbGRzCi0Jc2hhcmVkRGVidWdSZWNvcmRPZmZzZXQgYW5kIHNoYXJlZERlYnVnUmVjb3JkQ291bnQuCi0JKiBleHRlcm5hbC5oIChObG1OQU1FKEV4dGVybmFsX0V4dGVuZGVkX0hlYWRlcikpOiBMaWtld2lzZS4KLQotCSogY29tbW9uLmggKE5MTV9TSUdOQVRVUkUpOiBEbyBub3QgZGVmaW5lIChpdCdzIGRpZmZlcmVudCBmb3IgZWFjaAotCWJhY2tlbmQpLgotCi1UdWUgQXVnIDMxIDEzOjI0OjE1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaW50ZXJuYWwuaDogQ2hhbmdlIGxlbmd0aCBmaWVsZHMgb2YgdHlwZSBjaGFyIHRvIHR5cGUgdW5zaWduZWQKLQljaGFyLgotCi1TYXQgSnVsIDMxIDAyOjEyOjE0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29tbW9uLmggKE5MTV9ISUJJVCwgTkxNX0hFQURFUl9WRVJTSU9OKTogRGVmaW5lLgotCi1UaHUgSnVsIDIyIDE2OjA5OjQ3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb21tb24uaCAoTkxNX0NBVCosIE5MTV9BUkNIX1NJWkUsIE5MTV9UQVJHRVRfTE9OR19TSVpFLAotCU5MTV9UQVJHRVRfQUREUkVTU19TSVpFLCBOTE1fTkFNRSwgTmxtTkFNRSwgbmxtTkFNRSk6ICBOZXcKLQltYWNyb3MuCi0JKiBleHRlcm5hbC5oIChUQVJHRVRfTE9OR19TSVpFLCBUQVJHRVRfQUREUkVTU19TSVpFKTogUmVtb3ZlCi0JbWFjcm9zLCBjb252ZXJ0IHVzYWdlcyB0byBOTE1fIGVxdWl2YWxlbnRzLgotCSogZXh0ZXJuYWwuaDogIFVzZSBubG1OQU1FIGFuZCBObG1OQU1FIG1hY3JvcyB0byBkZXJpdmUgYm90aAotCTMyIGFuZCA2NCBiaXQgdmVyc2lvbnMuCi0KLU1vbiBKdWwgMTkgMjI6MTI6NDAgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIChjb21tb24uaCwgZXh0ZXJuYWwuaCwgaW50ZXJuYWwuaCk6ICBOZXcgZmlsZXMgZm9yIE5MTS9OZXRXYXJlCi0Jc3VwcG9ydC4KLQotDAotTG9jYWwgVmFyaWFibGVzOgotdmVyc2lvbi1jb250cm9sOiBuZXZlcgotRW5kOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vYWxwaGEtZXh0LmggYi9pbmNsdWRlL25sbS9hbHBoYS1leHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxOTlkZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9hbHBoYS1leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKiBBbHBoYSBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEFuIEFscGhhIE5MTSBzdGFydHMgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBubG0zMl9hbHBoYV9leHRlcm5hbF9wcmVmaXhfaGVhZGVyCi17Ci0gIC8qIE1hZ2ljIG51bWJlci4gIE11c3QgYmUgTkxNMzJfQUxQSEFfTUFHSUMuICAqLwotICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzRdOwotICAvKiBGb3JtYXQgZGVzY3JpcHRvci4gIEN1cnJlbnQgdmFsdWUgaXMgMi4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0WzRdOwotICAvKiBTaXplIG9mIHByZWZpeCBoZWFkZXIuICAqLwotICB1bnNpZ25lZCBjaGFyIHNpemVbNF07Ci0gIC8qIFBhZGRpbmcuICAqLwotICB1bnNpZ25lZCBjaGFyIHBhZDFbNF07Ci0gIC8qIE1vcmUgZmllbGRzIG1heSBiZSBhZGRlZCBsYXRlciwgc3VwcG9zZWRseS4gICovCi19OwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybWF0IG9mIGFuIEFscGhhIE5MTSByZWxvYy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgYW4KLSAgIEFscGhhIEVDT0ZGIHJlbG9jLiAgKi8KLQotc3RydWN0IG5sbTMyX2FscGhhX2V4dGVybmFsX3JlbG9jCi17Ci0gIHVuc2lnbmVkIGNoYXIgcl92YWRkcls4XTsKLSAgdW5zaWduZWQgY2hhciByX3N5bW5keFs0XTsKLSAgdW5zaWduZWQgY2hhciByX2JpdHNbNF07Ci19OwotCi0vKiBDb25zdGFudHMgdG8gdW5wYWNrIHRoZSByX2JpdHMgZmllbGQgb2YgYSByZWxvYy4gICovCi0KLSNkZWZpbmUgUkVMT0NfQklUUzBfVFlQRV9MSVRUTEUJCQkweGZmCi0jZGVmaW5lIFJFTE9DX0JJVFMwX1RZUEVfU0hfTElUVExFCQkwCi0KLSNkZWZpbmUgUkVMT0NfQklUUzFfRVhURVJOX0xJVFRMRQkJMHgwMQotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX09GRlNFVF9MSVRUTEUJCTB4N2UKLSNkZWZpbmUgUkVMT0NfQklUUzFfT0ZGU0VUX1NIX0xJVFRMRQkJMQotCi0jZGVmaW5lIFJFTE9DX0JJVFMxX1JFU0VSVkVEX0xJVFRMRQkJMHg4MAotI2RlZmluZSBSRUxPQ19CSVRTMV9SRVNFUlZFRF9TSF9MSVRUTEUJCTcKLSNkZWZpbmUgUkVMT0NfQklUUzJfUkVTRVJWRURfTElUVExFCQkweGZmCi0jZGVmaW5lIFJFTE9DX0JJVFMyX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFCTEKLSNkZWZpbmUgUkVMT0NfQklUUzNfUkVTRVJWRURfTElUVExFCQkweDAzCi0jZGVmaW5lIFJFTE9DX0JJVFMzX1JFU0VSVkVEX1NIX0xFRlRfTElUVExFCTkKLQotI2RlZmluZSBSRUxPQ19CSVRTM19TSVpFX0xJVFRMRQkJCTB4ZmMKLSNkZWZpbmUgUkVMT0NfQklUUzNfU0laRV9TSF9MSVRUTEUJCTIKLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfYWxwaGFfZXh0ZXJuYWxfZml4ZWRfaGVhZGVyCi17Ci0KLSAgLyogVGhlIHNpZ25hdHVyZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBmaWxlIGFzIGFuIE5MTS4gIEl0IG11c3QgY29udGFpbgotICAgICB0aGUgc2lnbmF0dXJlIHN0cmluZywgd2hpY2ggZGVwZW5kcyB1cG9uIHRoZSBOTE0gdGFyZ2V0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlWzI0XTsKLQotICAvKiBUaGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyLiAgQXQgdGhpcyB0aW1lLCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlcgotICAgICBpcyA0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgdmVyc2lvbls0XTsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCB3aGljaCBtdXN0IGJlIGEgRE9TIG5hbWUgKDEtOCBjaGFyYWN0ZXJzIGZvbGxvd2VkCi0gICAgIGJ5IGEgcGVyaW9kIGFuZCBhIDEtMyBjaGFyYWN0ZXIgZXh0ZW5zaW9uKS4gIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBieXRlCi0gICAgIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgdGhlIGxhc3QgYnl0ZSBpcyBhIG51bGwgdGVybWluYXRvciBieXRlLiAgVGhpcwotICAgICBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIGFuZCBhbnkgdW51c2VkIGJ5dGVzIHNob3VsZCBiZSBudWxsIGJ5dGVzLiAgVGhlCi0gICAgIHZhbHVlIGlzIHNldCBieSB0aGUgT1VUUFVUIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZU5hbWVbMTRdOwotCi0gIC8qIFBhZGRpbmcgdG8gbWFrZSBpdCBjb21lIG91dCBjb3JyZWN0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgcGFkMVsyXTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGNvZGUgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAotICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCi0gICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gIEl0IGlzIHBvc3NpYmxlCi0gICAgIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBjdXN0b20gZGF0YS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGN1c3RvbSBkYXRhLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgVGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIE1PRFVMRSBrZXl3b3JkIGluCi0gICAgIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0gICAgIAotICB1bnNpZ25lZCBjaGFyIHJlbG9jYXRpb25GaXh1cE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4dGVybmFsUmVmZXJlbmNlc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHVibGljc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUHVibGljc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGludGVybmFsIGRlYnVnIGluZm8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGVidWdJbmZvT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZEZWJ1Z1JlY29yZHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjb2RlU3RhcnRPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleGl0UHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVUeXBlWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3NbNF07Ci0KLX0gTmxtMzJfYWxwaGFfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vY29tbW9uLmggYi9pbmNsdWRlL25sbS9jb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2NTUwYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKiBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgYXJlIGNvbW1vbiB0byBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotCi0vKiBTZW1pLXBvcnRhYmxlIHN0cmluZyBjb25jYXRlbmF0aW9uIGluIGNwcC4KLSAgIFRoZSBOTE1fQ0FUNCBoYWNrIGlzIHRvIGF2b2lkIGEgcHJvYmxlbSB3aXRoIHNvbWUgc3RyaWN0IEFOU0kgQwotICAgcHJlcHJvY2Vzc29ycy4gIFRoZSBwcm9ibGVtIGlzLCAiMzJfIiBvciAiNjRfIiBhcmUgbm90IGEgdmFsaWQKLSAgIHByZXByb2Nlc3NpbmcgdG9rZW5zLCBhbmQgd2UgZG9uJ3Qgd2FudCBleHRyYSB1bmRlcnNjb3JlcyAoZS5nLiwKLSAgICJubG1fMzJfIikuICBUaGUgWE5MTV9DQVQyIG1hY3JvIHdpbGwgY2F1c2UgdGhlIGlubmVyIE5MTV9DQVQgbWFjcm9zCi0gICB0byBiZSBldmFsdWF0ZWQgZmlyc3QsIHByb2R1Y2luZyBzdGlsbC12YWxpZCBwcC10b2tlbnMuICBUaGVuIHRoZQotICAgZmluYWwgY29uY2F0ZW5hdGlvbiBjYW4gYmUgZG9uZS4gIChTaWdoLikgICovCi0KLSNpZmRlZiBTQUJFUgotIyAgZGVmaW5lIE5MTV9DQVQoYSxiKQkJYSMjYgotIyAgZGVmaW5lIE5MTV9DQVQzKGEsYixjKQlhIyNiIyNjCi0jICBkZWZpbmUgTkxNX0NBVDQoYSxiLGMsZCkJYSMjYiMjYyMjZAotI2Vsc2UKLSMgIGlmZGVmIF9fU1REQ19fCi0jICAgIGRlZmluZSBOTE1fQ0FUKGEsYikJYSMjYgotIyAgICBkZWZpbmUgTkxNX0NBVDMoYSxiLGMpCWEjI2IjI2MKLSMgICAgZGVmaW5lIFhOTE1fQ0FUMihhLGIpCU5MTV9DQVQoYSxiKQotIyAgICBkZWZpbmUgTkxNX0NBVDQoYSxiLGMsZCkJWE5MTV9DQVQyKE5MTV9DQVQoYSxiKSxOTE1fQ0FUKGMsZCkpCi0jICBlbHNlCi0jICAgIGRlZmluZSBOTE1fQ0FUKGEsYikJYS8qKi9iCi0jICAgIGRlZmluZSBOTE1fQ0FUMyhhLGIsYykJYS8qKi9iLyoqL2MKLSMgICAgZGVmaW5lIE5MTV9DQVQ0KGEsYixjLGQpCWEvKiovYi8qKi9jLyoqL2QKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogSWYgTkxNX0FSQ0hfU0laRSBpcyBub3QgZGVmaW5lZCwgZGVmYXVsdCB0byAzMi4gIE5MTV9BUkNIX1NJWkUgaXMKLSAgIG9wdGlvbmFsbHkgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24uICovCi0KLSNpZm5kZWYgTkxNX0FSQ0hfU0laRQotIyAgZGVmaW5lIE5MTV9BUkNIX1NJWkUJCQkzMgotI2VuZGlmCi0KLSNpZiBOTE1fQVJDSF9TSVpFID09IDMyCi0jICBkZWZpbmUgTkxNX1RBUkdFVF9MT05HX1NJWkUJCTQKLSMgIGRlZmluZSBOTE1fVEFSR0VUX0FERFJFU1NfU0laRQk0Ci0jICBkZWZpbmUgTkxNX05BTUUoeCx5KQkJCU5MTV9DQVQ0KHgsMzIsXyx5KQotIyAgZGVmaW5lIE5MTV9ISUJJVAkJCSgoKGJmZF92bWEpIDEpIDw8IDMxKQotI2VuZGlmCi0jaWYgTkxNX0FSQ0hfU0laRSA9PSA2NAotIyAgZGVmaW5lIE5MTV9UQVJHRVRfTE9OR19TSVpFCQk4Ci0jICBkZWZpbmUgTkxNX1RBUkdFVF9BRERSRVNTX1NJWkUJOAotIyAgZGVmaW5lIE5MTV9OQU1FKHgseSkJCQlOTE1fQ0FUNCh4LDY0LF8seSkKLSMgIGRlZmluZSBOTE1fSElCSVQJCQkoKChiZmRfdm1hKSAxKSA8PCA2MykKLSNlbmRpZgotCi0jZGVmaW5lIE5sbU5BTUUoWCkJCU5MTV9OQU1FKE5sbSxYKQotI2RlZmluZSBubG1OQU1FKFgpCQlOTE1fTkFNRShubG0sWCkKLQotLyogR2l2ZSBuYW1lcyB0byB0aGluZ3MgdGhhdCBzaG91bGQgbm90IGNoYW5nZS4gKi8KLQotI2RlZmluZSBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSAkJMTI3Ci0jZGVmaW5lIE5MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RICQk3MQotI2RlZmluZSBOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSAkJNzEKLSNkZWZpbmUgTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEgJMjU1Ci0jZGVmaW5lIE5MTV9PVEhFUl9EQVRBX0xFTkdUSCAJCQk0MDAJCS8qIEZJWE1FICovCi0jZGVmaW5lIE5MTV9PTERfVEhSRUFEX05BTUVfTEVOR1RICQk1Ci0jZGVmaW5lIE5MTV9TSUdOQVRVUkVfU0laRQkJCTI0Ci0jZGVmaW5lIE5MTV9IRUFERVJfVkVSU0lPTgkJCTQKLSNkZWZpbmUgTkxNX01PRFVMRV9OQU1FX1NJWkUJCQkxNAotI2RlZmluZSBOTE1fREVGQVVMVF9TVEFDS1NJWkUJCQkoOCAqIDEwMjQpCi0MCi0vKiBBbHBoYSBpbmZvcm1hdGlvbi4gIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGluIGEgc2VwYXJhdGUgQWxwaGEKLSAgIGhlYWRlciBmaWxlLCBidXQgaXQgY2FuJ3QgZ28gaW4gYWxwaGEtZXh0LmggYmVjYXVzZSBzb21lIG9mIGl0IGlzCi0gICBuZWVkZWQgYnkgbmxtY29udi5jLiAgKi8KLQotLyogTWFnaWMgbnVtYmVyIGluIEFscGhhIHByZWZpeCBoZWFkZXIuICAqLwotI2RlZmluZSBOTE0zMl9BTFBIQV9NQUdJQyAoMHg4MzU2MTg0MCkKLQotLyogVGhlIHJfdHlwZSBmaWVsZCBpbiBhbiBBbHBoYSByZWxvYyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXMuICAqLwotI2RlZmluZSBBTFBIQV9SX0lHTk9SRQkJMAotI2RlZmluZSBBTFBIQV9SX1JFRkxPTkcJCTEKLSNkZWZpbmUgQUxQSEFfUl9SRUZRVUFECQkyCi0jZGVmaW5lIEFMUEhBX1JfR1BSRUwzMgkJMwotI2RlZmluZSBBTFBIQV9SX0xJVEVSQUwJCTQKLSNkZWZpbmUgQUxQSEFfUl9MSVRVU0UJCTUKLSNkZWZpbmUgQUxQSEFfUl9HUERJU1AJCTYKLSNkZWZpbmUgQUxQSEFfUl9CUkFERFIJCTcKLSNkZWZpbmUgQUxQSEFfUl9ISU5UCQk4Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDE2CQk5Ci0jZGVmaW5lIEFMUEhBX1JfU1JFTDMyCSAgICAgICAxMAotI2RlZmluZSBBTFBIQV9SX1NSRUw2NAkgICAgICAgMTEKLSNkZWZpbmUgQUxQSEFfUl9PUF9QVVNICSAgICAgICAxMgotI2RlZmluZSBBTFBIQV9SX09QX1NUT1JFICAgICAgIDEzCi0jZGVmaW5lIEFMUEhBX1JfT1BfUFNVQgkgICAgICAgMTQKLSNkZWZpbmUgQUxQSEFfUl9PUF9QUlNISUZUICAgICAxNQotI2RlZmluZSBBTFBIQV9SX0dQVkFMVUUJICAgICAgIDE2Ci0jZGVmaW5lIEFMUEhBX1JfTldfUkVMT0MgICAgICAyNTAKLQotLyogQSBsb2NhbCByZWxvYywgb3RoZXIgdGhhbiBBTFBIQV9SX0dQRElTUCBvciBBTFBIQV9SX0lHTk9SRSwgbXVzdCBiZQotICAgYWdhaW5zdCBvbmUgb2YgdGhlc2Ugc3ltYm9sIGluZGljZXMuICAqLwotI2RlZmluZSBBTFBIQV9SRUxPQ19TRUNUSU9OX1RFWFQJMQotI2RlZmluZSBBTFBIQV9SRUxPQ19TRUNUSU9OX0RBVEEJMwotCi0vKiBBbiBBTFBIQV9SX05XX1JFTE9DIGhhcyBvbmUgb2YgdGhlc2UgdmFsdWVzIGluIHRoZSBzaXplIGZpZWxkLiAgSWYKLSAgIGl0IGlzIFNFVEdQLCB0aGUgcl92YWRkciBmaWVsZCBob2xkcyB0aGUgR1AgdmFsdWUgdG8gdXNlLiAgSWYgaXQgaXMKLSAgIExJVEEsIHRoZSByX3ZhZGRyIGZpZWxkIGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSAubGl0YSBzZWN0aW9uIGFuZAotICAgdGhlIHJfc3ltbmR4IGZpZWxkIGhvbGRzIHRoZSBzaXplIG9mIHRoZSAubGl0YSBzZWN0aW9uLiAgKi8KLSNkZWZpbmUgQUxQSEFfUl9OV19SRUxPQ19TRVRHUAkxCi0jZGVmaW5lIEFMUEhBX1JfTldfUkVMT0NfTElUQQkyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9leHRlcm5hbC5oIGIvaW5jbHVkZS9ubG0vZXh0ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3YTViYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9leHRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBCRkQsIHRoZSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgTkxNIHN1cHBvcnQgZm9yIEJGRCwgYW5kIGNvbnRhaW5zIHRoZSBwb3J0aW9ucwotICAgdGhhdCBkZXNjcmliZSBob3cgTkxNIGlzIHJlcHJlc2VudGVkIGV4dGVybmFsbHkgYnkgdGhlIEJGRCBsaWJyYXJ5LgotICAgSS5FLiBpdCBkZXNjcmliZXMgdGhlIGluLWZpbGUgcmVwcmVzZW50YXRpb24gb2YgTkxNLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBubG0vY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLgotCi0gICBOb3RlIHRoYXQgYW4gTkxNIGhlYWRlciBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0czoKLQotICAgKDEpCUEgZml4ZWQgbGVuZ3RoIGhlYWRlciB0aGF0IGhhcyBzcGVjaWZpYyBmaWVsZHMgb2Yga25vd24gbGVuZ3RoLAotCWF0IHNwZWNpZmljIG9mZnNldHMgaW4gdGhlIGZpbGUuIAotCi0gICAoMikgIEEgdmFyaWFibGUgbGVuZ3RoIGhlYWRlciB0aGF0IGhhcyBzcGVjaWZpYyBmaWVsZHMgaW4gYSBzcGVjaWZpYwotICAgICAgICBvcmRlciwgYnV0IHNvbWUgZmllbGRzIG1heSBiZSB2YXJpYWJsZSBsZW5ndGguCi0KLSAgICgzKQlBIGF1eGlsaWFyeSBoZWFkZXIgdGhhdCBoYXMgdmFyaW91cyBvcHRpb25hbCBmaWVsZHMgaW4gbm8gc3BlY2lmaWMKLSAgICAgICAgb3JkZXIuICBUaGVyZSBpcyBubyB3YXkgdG8gaWRlbnRpZnkgdGhlIGVuZCBvZiB0aGUgYXV4aWxpYXJ5IGhlYWRlcnMKLQlleGNlcHQgYnkgZmluZGluZyBhIGhlYWRlciB3aXRob3V0IGEgcmVjb2duaXplZCAnc3RhbXAnLgotCi0gICBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoZSBmaXhlZCBsZW5ndGggaGVhZGVyIHVuZm9ydHVuYXRlbHkgdmFyaWVzCi0gICBmcm9tIG9uZSBOTE0gdGFyZ2V0IHRvIGFub3RoZXIsIGR1ZSB0byBwYWRkaW5nLiAgRWFjaCB0YXJnZXQKLSAgIGRlZmluZXMgdGhlIGNvcnJlY3QgZXh0ZXJuYWwgZm9ybWF0IGluIGEgc2VwYXJhdGUgaGVhZGVyIGZpbGUuCi0KLSovCi0gICAKLS8qIE5MTSBIZWFkZXIgKi8KLQotLyogVGhlIHZlcnNpb24gaGVhZGVyIGlzIG9uZSBvZiB0aGUgb3B0aW9uYWwgYXV4aWxpYXJ5IGhlYWRlcnMgYW5kCi0gICBmb2xsb3dzIHRoZSBmaXhlZCBsZW5ndGggYW5kIHZhcmlhYmxlIGxlbmd0aCBOTE0gaGVhZGVycy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtTkFNRShleHRlcm5hbF92ZXJzaW9uX2hlYWRlcikKLXsKLQotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIlZlUnNJb04jIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0KLSAgdW5zaWduZWQgY2hhciBtYWpvclZlcnNpb25bTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWlub3JWZXJzaW9uW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJldmlzaW9uW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHllYXJbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9udGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgZGF5W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotfSBObG1OQU1FKEV4dGVybmFsX1ZlcnNpb25fSGVhZGVyKTsKLQotCi10eXBlZGVmIHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2NvcHlyaWdodF9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDb1B5UmlHaFQ9IiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0KLSAgY2hhciBzdGFtcFsxMF07Ci0KLSAgdW5zaWduZWQgY2hhciBjb3B5cmlnaHRNZXNzYWdlTGVuZ3RoWzFdOwotCi0gIC8qIFRoZXJlIGlzIGEgdmFyaWFibGUgbGVuZ3RoIGZpZWxkIGhlcmUgY2FsbGVkICdjb3B5cmlnaHRNZXNzYWdlJwotICAgICB0aGF0IGlzIHRoZSBsZW5ndGggc3BlY2lmaWVkIGJ5IGNvcHlyaWdodE1lc3NhZ2VMZW5ndGguICovCi0KLX0gTmxtTkFNRShFeHRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyKTsKLQotCi10eXBlZGVmIHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2V4dGVuZGVkX2hlYWRlcikKLXsKLQotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIk1lU3NBZ0VzIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0KLSAgY2hhciBzdGFtcFs4XTsKLQotICB1bnNpZ25lZCBjaGFyIGxhbmd1YWdlSURbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWVzc2FnZUZpbGVPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWVzc2FnZUZpbGVMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgbWVzc2FnZUNvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIGhlbHBGaWxlT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIGhlbHBGaWxlTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIFJQQ0RhdGFPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgUlBDRGF0YUxlbmd0aFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRDb2RlT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZENvZGVMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkRGF0YU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWREYXRhTGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRFeHRlcm5hbFJlZmVyZW5jZU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBzaGFyZWRFeHRlcm5hbFJlZmVyZW5jZUNvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZFB1YmxpY3NPZmZzZXRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkUHVibGljc0NvdW50W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0W05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHNoYXJlZERlYnVnUmVjb3JkQ291bnRbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgc2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXRbTkxNX1RBUkdFVF9BRERSRVNTX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldFtOTE1fVEFSR0VUX0FERFJFU1NfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciBwcm9kdWN0SURbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQwW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkMVtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDJbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQzW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICB1bnNpZ25lZCBjaGFyIHJlc2VydmVkNFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgdW5zaWduZWQgY2hhciByZXNlcnZlZDVbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi19IE5sbU5BTUUoRXh0ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyKTsKLQotCi10eXBlZGVmIHN0cnVjdCBubG1OQU1FKGV4dGVybmFsX2N1c3RvbV9oZWFkZXIpCi17Ci0KLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJDdVN0SGVBZCIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotCi0gIC8qIExlbmd0aCBvZiB0aGlzIGhlYWRlci4gICovCi0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoW05MTV9UQVJHRVRfTE9OR19TSVpFXTsKLQotICAvKiBPZmZzZXQgdG8gZGF0YS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZGF0YU9mZnNldFtOTE1fVEFSR0VUX0xPTkdfU0laRV07Ci0KLSAgLyogTGVuZ3RoIG9mIGRhdGEuICAqLwotICB1bnNpZ25lZCBjaGFyIGRhdGFMZW5ndGhbTkxNX1RBUkdFVF9MT05HX1NJWkVdOwotCi0gIC8qIFN0YW1wIGZvciB0aGlzIGN1c3RvbWVyIGhlYWRlci0td2UgcmVjb2duaXplICJDeUduVXNFeCIuICAqLwotICBjaGFyIGRhdGFTdGFtcFs4XTsKLQotfSBObG1OQU1FKEV4dGVybmFsX0N1c3RvbV9IZWFkZXIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vaTM4Ni1leHQuaCBiL2luY2x1ZGUvbmxtL2kzODYtZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzM2FkMmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vaTM4Ni1leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBpMzg2IE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybWF0IG9mIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG0zMl9pMzg2X2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGNvZGUgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAotICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCi0gICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gIEl0IGlzIHBvc3NpYmxlCi0gICAgIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBjdXN0b20gZGF0YS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGN1c3RvbSBkYXRhLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgVGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIE1PRFVMRSBrZXl3b3JkIGluCi0gICAgIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0gICAgIAotICB1bnNpZ25lZCBjaGFyIHJlbG9jYXRpb25GaXh1cE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4dGVybmFsUmVmZXJlbmNlc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHVibGljc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUHVibGljc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGludGVybmFsIGRlYnVnIGluZm8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGVidWdJbmZvT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZEZWJ1Z1JlY29yZHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjb2RlU3RhcnRPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleGl0UHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVUeXBlWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3NbNF07Ci0KLX0gTmxtMzJfaTM4Nl9FeHRlcm5hbF9GaXhlZF9IZWFkZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25sbS9pbnRlcm5hbC5oIGIvaW5jbHVkZS9ubG0vaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyN2RjNC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qIE5MTSAoTmV0V2FyZSBMb2FkYWJsZSBNb2R1bGUpIHN1cHBvcnQgZm9yIEJGRC4KLSAgIENvcHlyaWdodCAoQykgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgQkZELCB0aGUgQmluYXJ5IEZpbGUgRGVzY3JpcHRvciBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIE5MTSBzdXBwb3J0IGZvciBCRkQsIGFuZCBjb250YWlucyB0aGUgcG9ydGlvbnMKLSAgIHRoYXQgZGVzY3JpYmUgaG93IE5MTSBpcyByZXByZXNlbnRlZCBpbnRlcm5hbGx5IGluIHRoZSBCRkQgbGlicmFyeS4KLSAgIEkuRS4gaXQgZGVzY3JpYmVzIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgTkxNLiAgSXQgcmVxdWlyZXMKLSAgIHRoZSBubG0vY29tbW9uLmggZmlsZSB3aGljaCBjb250YWlucyB0aGUgcG9ydGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvCi0gICBib3RoIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zLiAqLwotICAgCi0jaWYgMAotCi0vKiBUeXBlcyB1c2VkIGJ5IHZhcmlvdXMgc3RydWN0dXJlcywgZnVuY3Rpb25zLCBldGMuICovCi0KLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9BZGRyOwkvKiBVbnNpZ25lZCBwcm9ncmFtIGFkZHJlc3MgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9PZmY7CS8qIFVuc2lnbmVkIGZpbGUgb2Zmc2V0ICovCi10eXBlZGVmIAkgbG9uZwlObG0zMl9Td29yZDsJLyogU2lnbmVkIGxhcmdlIGludGVnZXIgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZwlObG0zMl9Xb3JkOwkvKiBVbnNpZ25lZCBsYXJnZSBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0CU5sbTMyX0hhbGY7CS8qIFVuc2lnbmVkIG1lZGl1bSBpbnRlZ2VyICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIJTmxtMzJfQ2hhcjsJLyogVW5zaWduZWQgdGlueSBpbnRlZ2VyICovCi0KLSNpZmRlZiBCRkRfSE9TVF82NF9CSVQKLXR5cGVkZWYgdW5zaWduZWQgQkZEX0hPU1RfNjRfQklUCU5sbTY0X0FkZHI7Ci10eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9PZmY7Ci10eXBlZGVmICAgICAgICAgIEJGRF9IT1NUXzY0X0JJVAlObG02NF9TeHdvcmQ7Ci10eXBlZGVmIHVuc2lnbmVkIEJGRF9IT1NUXzY0X0JJVAlObG02NF9Yd29yZDsKLSNlbmRpZgotdHlwZWRlZiAgICAgICAgICBsb25nCQlObG02NF9Td29yZDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZwkJTmxtNjRfV29yZDsKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQJCU5sbTY0X0hhbGY7Ci0KLSNlbmRpZiAvKiAwICovCi0KLS8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBpbnRlcm5hbCBmb3JtIG9mIHRoZSBwb3J0aW9uIG9mIHRoZSBOTE0KLSAgIGhlYWRlciB0aGF0IGlzIGZpeGVkIGxlbmd0aC4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgotewotICAvKiBUaGUgc2lnbmF0dXJlIGZpZWxkIGlkZW50aWZpZXMgdGhlIGZpbGUgYXMgYW4gTkxNLiAgSXQgbXVzdCBjb250YWluCi0gICAgIHRoZSBzaWduYXR1cmUgc3RyaW5nLCB3aGljaCBkZXBlbmRzIHVwb24gdGhlIE5MTSB0YXJnZXQuICovCi0KLSAgY2hhciBzaWduYXR1cmVbTkxNX1NJR05BVFVSRV9TSVpFXTsKLQotICAvKiBUaGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyLiAgQXQgdGhpcyB0aW1lLCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlcgotICAgICBpcyA0LiAqLwotCi0gIGxvbmcgdmVyc2lvbjsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCB3aGljaCBtdXN0IGJlIGEgRE9TIG5hbWUgKDEtOCBjaGFyYWN0ZXJzIGZvbGxvd2VkCi0gICAgIGJ5IGEgcGVyaW9kIGFuZCBhIDEtMyBjaGFyYWN0ZXIgZXh0ZW5zaW9uLiAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGJ5dGUKLSAgICAgbGVuZ3RoIG9mIHRoZSBuYW1lIGFuZCB0aGUgbGFzdCBieXRlIGlzIGEgbnVsbCB0ZXJtaW5hdG9yIGJ5dGUuICBUaGlzCi0gICAgIGZpZWxkIGlzIGZpeGVkIGxlbmd0aCwgYW5kIGFueSB1bnVzZWQgYnl0ZXMgc2hvdWxkIGJlIG51bGwgYnl0ZXMuICBUaGUKLSAgICAgdmFsdWUgaXMgc2V0IGJ5IHRoZSBPVVRQVVQga2V5d29yZCB0byBOTE1MSU5LLiAqLwotCi0gIGNoYXIgbW9kdWxlTmFtZVtOTE1fTU9EVUxFX05BTUVfU0laRV07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIGZpbGVfcHRyIGNvZGVJbWFnZU9mZnNldDsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgY29kZSBpbWFnZSwgaW4gYnl0ZXMuICovCi0KLSAgYmZkX3NpemVfdHlwZSBjb2RlSW1hZ2VTaXplOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgZGF0YSBpbWFnZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gKi8KLQotICBmaWxlX3B0ciBkYXRhSW1hZ2VPZmZzZXQ7Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIGJmZF9zaXplX3R5cGUgZGF0YUltYWdlU2l6ZTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAotICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KLQotICBiZmRfc2l6ZV90eXBlIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCi0gICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICBmaWxlX3B0ciBjdXN0b21EYXRhT2Zmc2V0OwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgYmZkX3NpemVfdHlwZSBjdXN0b21EYXRhU2l6ZTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIGZpbGVfcHRyIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQ7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBtb2R1bGUgZGVwZW5kZW5jaWVzIGF0IHRoZSBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0LiAqLwotCi0gIGxvbmcgbnVtYmVyT2ZNb2R1bGVEZXBlbmRlbmNpZXM7Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSByZWxvY2F0aW9uIGZpeHVwIGRhdGEgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgKi8KLQotICBmaWxlX3B0ciByZWxvY2F0aW9uRml4dXBPZmZzZXQ7Ci0gIGxvbmcgbnVtYmVyT2ZSZWxvY2F0aW9uRml4dXBzOwotICBmaWxlX3B0ciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXQ7Ci0gIGxvbmcgbnVtYmVyT2ZFeHRlcm5hbFJlZmVyZW5jZXM7Ci0gIGZpbGVfcHRyIHB1YmxpY3NPZmZzZXQ7Ci0gIGxvbmcgbnVtYmVyT2ZQdWJsaWNzOwotICBmaWxlX3B0ciBkZWJ1Z0luZm9PZmZzZXQ7Ci0gIGxvbmcgbnVtYmVyT2ZEZWJ1Z1JlY29yZHM7Ci0gIGZpbGVfcHRyIGNvZGVTdGFydE9mZnNldDsKLSAgZmlsZV9wdHIgZXhpdFByb2NlZHVyZU9mZnNldDsKLSAgZmlsZV9wdHIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXQ7Ci0gIGxvbmcgbW9kdWxlVHlwZTsKLSAgbG9uZyBmbGFnczsKLX0gTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcjsKLQotI2RlZmluZSBubG0zMl9pbnRlcm5hbF9maXhlZF9oZWFkZXIgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgotI2RlZmluZSBObG0zMl9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcgotI2RlZmluZSBubG02NF9pbnRlcm5hbF9maXhlZF9oZWFkZXIgbmxtX2ludGVybmFsX2ZpeGVkX2hlYWRlcgotI2RlZmluZSBObG02NF9JbnRlcm5hbF9GaXhlZF9IZWFkZXIgTmxtX0ludGVybmFsX0ZpeGVkX0hlYWRlcgotCi0vKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgcG9ydGlvbnMgb2YgdGhlIE5MTSBoZWFkZXIgdGhhdCBhcmUgZWl0aGVyCi0gICB2YXJpYWJsZSBpbiBzaXplIGluIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiwgb3IgZWxzZSBhcmUgbm90IGF0IGEKLSAgIGZpeGVkIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIE5MTSBoZWFkZXIgZHVlIHRvIHByZWNlZGluZwotICAgdmFyaWFibGUgc2l6ZWQgZmllbGRzLgotCi0gICBOb3RlIHRoYXQgYWxsIHRoZSBmaWVsZHMgbXVzdCBleGlzdCBpbiB0aGUgZXh0ZXJuYWwgaGVhZGVyLCBhbmQgaW4KLSAgIHRoZSBvcmRlciB1c2VkIGhlcmUgKHRoZSBzYW1lIG9yZGVyIGlzIHVzZWQgaW4gdGhlIGludGVybmFsIGZvcm0KLSAgIGZvciBjb25zaXN0ZW5jeSwgbm90IG91dCBvZiBuZWNlc3NpdHkpLiAqLwotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyCi17Ci0KLSAgLyogVGhlIGRlc2NyaXB0aW9uTGVuZ3RoIGZpZWxkIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgaW4KLSAgICAgZGVzY3JpcHRpb25UZXh0LCBleGNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvci4gIFRoZSBkZXNjcmlwdGlvblRleHQKLSAgICAgZmllbGQgY29udGFpbnMgdGhlIE5MTSBkZXNjcmlwdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBERVNDUklQVElPTgotICAgICBrZXl3b3JkIGluIE5MTUxJTksgcGx1cyB0aGUgbnVsbCBieXRlIHRlcm1pbmF0b3IuICBUaGUgZGVzY3JpcHRpb25UZXh0Ci0gICAgIGNhbiBiZSB1cCB0byBOTE1fTUFYX0RFU0NSSVBUSU9OX0xFTkdUSCBjaGFyYWN0ZXJzLiAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciBkZXNjcmlwdGlvbkxlbmd0aDsKLSAgY2hhciBkZXNjcmlwdGlvblRleHRbTkxNX01BWF9ERVNDUklQVElPTl9MRU5HVEggKyAxXTsKLQotICAvKiBUaGUgc3RhY2tTaXplIGZpZWxkIGNvbnRhaW5zIHRoZSBzaXplIG9mIHRoZSBzdGFjayBpbiBieXRlcywgYXMKLSAgICAgc3BlY2lmaWVkIGJ5IHRoZSBTVEFDSyBvciBTVEFDS1NJWkUga2V5d29yZCBpbiBOTE1MSU5LLiAgSWYgbm8gc2l6ZQotICAgICBpcyBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzIE5MTV9ERUZBVUxUX1NUQUNLU0laRS4gKi8KLSAgICAgCi0gIGxvbmcgc3RhY2tTaXplOwotCi0gIC8qIFRoZSByZXNlcnZlZCBmaWVsZCBpcyBpbmNsdWRlZCBvbmx5IGZvciBjb21wbGV0ZW5lc3MuICBJdCBzaG91bGQgY29udGFpbgotICAgICB6ZXJvLiAqLwotCi0gIGxvbmcgcmVzZXJ2ZWQ7Ci0KLSAgLyogVGhpcyBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIHNob3VsZCBjb250YWluICIgTE9ORyIgKG5vdGUgbGVhZGluZwotICAgICBzcGFjZSksIGFuZCBpcyB1bnVzZWQuICovCi0KLSAgY2hhciBvbGRUaHJlYWROYW1lW05MTV9PTERfVEhSRUFEX05BTUVfTEVOR1RIXTsKLQotICAvKiBUaGUgc2NyZWVuTmFtZUxlbmd0aCBmaWVsZCBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBhY3R1YWwgdGV4dCBzdG9yZWQKLSAgICAgaW4gdGhlIHNjcmVlbk5hbWUgZmllbGQsIGV4Y2x1ZGluZyB0aGUgbnVsbCBieXRlIHRlcm1pbmF0b3IuICBUaGUKLSAgICAgc2NyZWVuTmFtZSBmaWVsZCBjb250YWlucyB0aGUgc2NyZWVuIG5hbWUgYXMgc3BlY2lmaWVkIGJ5IHRoZSBTQ1JFRU5OQU1FCi0gICAgIGtleXdvcmQgaW4gTkxNTElOSywgYW5kIGNhbiBiZSB1cCB0byBOTE1fTUFYX1NDUkVFTl9OQU1FX0xFTkdUSAotICAgICBjaGFyYWN0ZXJzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgc2NyZWVuTmFtZUxlbmd0aDsKLSAgY2hhciBzY3JlZW5OYW1lW05MTV9NQVhfU0NSRUVOX05BTUVfTEVOR1RIICsgMV07Ci0KLSAgLyogVGhlIHRocmVhZE5hbWVMZW5ndGggZmllbGQgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsIHRleHQgc3RvcmVkCi0gICAgIGluIHRoZSB0aHJlYWROYW1lIGZpZWxkLCBleGNsdWRpbmcgdGhlIG51bGwgYnl0ZSB0ZXJtaW5hdG9yLiAgVGhlCi0gICAgIHRocmVhZE5hbWUgZmllbGQgY29udGFpbnMgdGhlIHRocmVhZCBuYW1lIGFzIHNwZWNpZmllZCBieSB0aGUgVEhSRUFETkFNRQotICAgICBrZXl3b3JkIGluIE5MTUxJTkssIGFuZCBjYW4gYmUgdXAgdG8gTkxNX01BWF9USFJFQURfTkFNRV9MRU5HVEgKLSAgICAgY2hhcmFjdGVycy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHRocmVhZE5hbWVMZW5ndGg7Ci0gIGNoYXIgdGhyZWFkTmFtZVtOTE1fTUFYX1RIUkVBRF9OQU1FX0xFTkdUSCArIDFdOwotCi19IE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyIG5sbV9pbnRlcm5hbF92YXJpYWJsZV9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfdmFyaWFibGVfaGVhZGVyIG5sbV9pbnRlcm5hbF92YXJpYWJsZV9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfVmFyaWFibGVfSGVhZGVyIE5sbV9JbnRlcm5hbF9WYXJpYWJsZV9IZWFkZXIKLQotLyogVGhlIHZlcnNpb24gaGVhZGVyIGlzIG9uZSBvZiB0aGUgb3B0aW9uYWwgYXV4aWxpYXJ5IGhlYWRlcnMgYW5kCi0gICBmb2xsb3dzIHRoZSBmaXhlZCBsZW5ndGggYW5kIHZhcmlhYmxlIGxlbmd0aCBOTE0gaGVhZGVycy4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCi17Ci0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiVmVSc0lvTiMiIGluIHRoZSBzdGFtcCBmaWVsZC4gKi8KLSAgY2hhciBzdGFtcFs4XTsKLSAgbG9uZyBtYWpvclZlcnNpb247Ci0gIGxvbmcgbWlub3JWZXJzaW9uOwotICBsb25nIHJldmlzaW9uOwotICBsb25nIHllYXI7Ci0gIGxvbmcgbW9udGg7Ci0gIGxvbmcgZGF5OwotfSBObG1fSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIgbmxtX2ludGVybmFsX3ZlcnNpb25faGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyIE5sbV9JbnRlcm5hbF9WZXJzaW9uX0hlYWRlcgotI2RlZmluZSBubG02NF9pbnRlcm5hbF92ZXJzaW9uX2hlYWRlciBubG1faW50ZXJuYWxfdmVyc2lvbl9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfVmVyc2lvbl9IZWFkZXIgTmxtX0ludGVybmFsX1ZlcnNpb25fSGVhZGVyCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyCi17Ci0gIC8qIFRoZSBoZWFkZXIgaXMgcmVjb2duaXplZCBieSAiQ29QeVJpR2hUPSIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzEwXTsKLSAgdW5zaWduZWQgY2hhciBjb3B5cmlnaHRNZXNzYWdlTGVuZ3RoOwotICBjaGFyIGNvcHlyaWdodE1lc3NhZ2VbTkxNX01BWF9DT1BZUklHSFRfTUVTU0FHRV9MRU5HVEhdOwotfSBObG1fSW50ZXJuYWxfQ29weXJpZ2h0X0hlYWRlcjsKLQotI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyIG5sbV9pbnRlcm5hbF9jb3B5cmlnaHRfaGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIgTmxtX0ludGVybmFsX0NvcHlyaWdodF9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlciBubG1faW50ZXJuYWxfY29weXJpZ2h0X2hlYWRlcgotI2RlZmluZSBObG02NF9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyIE5sbV9JbnRlcm5hbF9Db3B5cmlnaHRfSGVhZGVyCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKLXsKLSAgLyogVGhlIGhlYWRlciBpcyByZWNvZ25pemVkIGJ5ICJNZVNzQWdFcyIgaW4gdGhlIHN0YW1wIGZpZWxkLiAqLwotICBjaGFyIHN0YW1wWzhdOwotICBsb25nIGxhbmd1YWdlSUQ7Ci0gIGZpbGVfcHRyIG1lc3NhZ2VGaWxlT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIG1lc3NhZ2VGaWxlTGVuZ3RoOwotICBsb25nIG1lc3NhZ2VDb3VudDsKLSAgZmlsZV9wdHIgaGVscEZpbGVPZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgaGVscEZpbGVMZW5ndGg7Ci0gIGZpbGVfcHRyIFJQQ0RhdGFPZmZzZXQ7Ci0gIGJmZF9zaXplX3R5cGUgUlBDRGF0YUxlbmd0aDsKLSAgZmlsZV9wdHIgc2hhcmVkQ29kZU9mZnNldDsKLSAgYmZkX3NpemVfdHlwZSBzaGFyZWRDb2RlTGVuZ3RoOwotICBmaWxlX3B0ciBzaGFyZWREYXRhT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIHNoYXJlZERhdGFMZW5ndGg7Ci0gIGZpbGVfcHRyIHNoYXJlZFJlbG9jYXRpb25GaXh1cE9mZnNldDsKLSAgbG9uZyBzaGFyZWRSZWxvY2F0aW9uRml4dXBDb3VudDsKLSAgZmlsZV9wdHIgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VPZmZzZXQ7Ci0gIGxvbmcgc2hhcmVkRXh0ZXJuYWxSZWZlcmVuY2VDb3VudDsKLSAgZmlsZV9wdHIgc2hhcmVkUHVibGljc09mZnNldDsKLSAgbG9uZyBzaGFyZWRQdWJsaWNzQ291bnQ7Ci0gIGZpbGVfcHRyIHNoYXJlZERlYnVnUmVjb3JkT2Zmc2V0OwotICBsb25nIHNoYXJlZERlYnVnUmVjb3JkQ291bnQ7Ci0gIGJmZF92bWEgU2hhcmVkSW5pdGlhbGl6YXRpb25PZmZzZXQ7Ci0gIGJmZF92bWEgU2hhcmVkRXhpdFByb2NlZHVyZU9mZnNldDsKLSAgbG9uZyBwcm9kdWN0SUQ7Ci0gIGxvbmcgcmVzZXJ2ZWQwOwotICBsb25nIHJlc2VydmVkMTsKLSAgbG9uZyByZXNlcnZlZDI7Ci0gIGxvbmcgcmVzZXJ2ZWQzOwotICBsb25nIHJlc2VydmVkNDsKLSAgbG9uZyByZXNlcnZlZDU7Ci19IE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXI7Ci0KLSNkZWZpbmUgbmxtMzJfaW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfZXh0ZW5kZWRfaGVhZGVyIG5sbV9pbnRlcm5hbF9leHRlbmRlZF9oZWFkZXIKLSNkZWZpbmUgTmxtNjRfSW50ZXJuYWxfRXh0ZW5kZWRfSGVhZGVyIE5sbV9JbnRlcm5hbF9FeHRlbmRlZF9IZWFkZXIKLQotLyogVGhlIGZvcm1hdCBvZiBhIGN1c3RvbSBoZWFkZXIgYXMgc3RvcmVkIGludGVybmFsbHkgaXMgZGlmZmVyZW50Ci0gICBmcm9tIHRoZSBleHRlcm5hbCBmb3JtYXQuICBUaGlzIGlzIGhvdyB3ZSBzdG9yZSBhIGN1c3RvbSBoZWFkZXIKLSAgIHdoaWNoIHdlIGRvIG5vdCByZWNvZ25pemUuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkN1U3RIZUFkIiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0gIGJmZF9zaXplX3R5cGUgaGRyTGVuZ3RoOwotICBmaWxlX3B0ciBkYXRhT2Zmc2V0OwotICBiZmRfc2l6ZV90eXBlIGRhdGFMZW5ndGg7Ci0gIGNoYXIgZGF0YVN0YW1wWzhdOwotICBQVFIgaGRyOwotfSBObG1fSW50ZXJuYWxfQ3VzdG9tX0hlYWRlcjsKLQotI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jdXN0b21faGVhZGVyIG5sbV9pbnRlcm5hbF9jdXN0b21faGVhZGVyCi0jZGVmaW5lIE5sbTMyX0ludGVybmFsX0N1c3RvbV9IZWFkZXIgTmxtX0ludGVybmFsX0N1c3RvbV9IZWFkZXIKLSNkZWZpbmUgbmxtNjRfaW50ZXJuYWxfY3VzdG9tX2hlYWRlciBubG1faW50ZXJuYWxfY3VzdG9tX2hlYWRlcgotI2RlZmluZSBObG02NF9JbnRlcm5hbF9DdXN0b21fSGVhZGVyIE5sbV9JbnRlcm5hbF9DdXN0b21fSGVhZGVyCi0KLS8qIFRoZSBpbnRlcm5hbCBDeWdudXMgaGVhZGVyIGlzIHdyaXR0ZW4gb3V0IGV4dGVybmFsbHkgYXMgYSBjdXN0b20KLSAgIGhlYWRlci4gIFdlIGRvbid0IHRyeSB0byByZXBsaWNhdGUgdGhhdCBzdHJ1Y3R1cmUgaGVyZS4gICovCi0KLXR5cGVkZWYgc3RydWN0IG5sbV9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcgotewotICAvKiBUaGUgaGVhZGVyIGlzIHJlY29nbml6ZWQgYnkgIkN5R25Vc0V4IiBpbiB0aGUgc3RhbXAgZmllbGQuICovCi0gIGNoYXIgc3RhbXBbOF07Ci0gIC8qIEZpbGUgbG9jYXRpb24gb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgZmlsZV9wdHIgb2Zmc2V0OwotICAvKiBMZW5ndGggb2YgZGVidWdnaW5nIGluZm9ybWF0aW9uLiAgKi8KLSAgYmZkX3NpemVfdHlwZSBsZW5ndGg7Ci19IE5sbV9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlcjsKLQotI2RlZmluZSBubG0zMl9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlciBubG1faW50ZXJuYWxfY3lnbnVzX2V4dF9oZWFkZXIKLSNkZWZpbmUgTmxtMzJfSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIgTmxtX0ludGVybmFsX0N5Z251c19FeHRfSGVhZGVyCi0jZGVmaW5lIG5sbTY0X2ludGVybmFsX2N5Z251c19leHRfaGVhZGVyIG5sbV9pbnRlcm5hbF9jeWdudXNfZXh0X2hlYWRlcgotI2RlZmluZSBObG02NF9JbnRlcm5hbF9DeWdudXNfRXh0X0hlYWRlciBObG1fSW50ZXJuYWxfQ3lnbnVzX0V4dF9IZWFkZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmxtL3BwYy1leHQuaCBiL2luY2x1ZGUvbmxtL3BwYy1leHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZTEwNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL25sbS9wcGMtZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogUG93ZXJQQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIE9MREZPUk1BVAotCi0vKiBUaGUgZm9ybWF0IG9mIGEgUG93ZXJQQyBOTE0gY2hhbmdlZC4gIFRoZXNlIHN0cnVjdHVyZXMgYXJlIG9ubHkKLSAgIHVzZWQgaW4gdGhlIG9sZCBmb3JtYXQuICAqLwotCi0vKiBBIFBvd2VyUEMgTkxNIHN0YXJ0cyB3aXRoIGFuIGluc3RhbmNlIG9mIHRoaXMgc3RydWN0dXJlLiAgKi8KLQotc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcHJlZml4X2hlYWRlcgotewotICAvKiBTaWduYXR1cmUuICBNdXN0IGJlICJBcHBsZU5MTSIuICAqLwotICBjaGFyIHNpZ25hdHVyZVs4XTsKLSAgLyogVmVyc2lvbiBudW1iZXIuICBDdXJyZW50IHZhbHVlIGlzIDEuICAqLwotICB1bnNpZ25lZCBjaGFyIGhlYWRlclZlcnNpb25bNF07Ci0gIC8qID8/LiAgU2hvdWxkIGJlIHNldCB0byAwLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcmlnaW5zWzRdOwotICAvKiBGaWxlIGNyZWF0aW9uIGRhdGUgaW4gc3RhbmRhcmQgVW5peCB0aW1lIGZvcm1hdCAoc2Vjb25kcyBzaW5jZQotICAgICAxLzEvNzApLiAgKi8KLSAgdW5zaWduZWQgY2hhciBkYXRlWzRdOwotfTsKLQotI2RlZmluZSBOTE0zMl9QT1dFUlBDX1NJR05BVFVSRSAiQXBwbGVOTE0iCi0jZGVmaW5lIE5MTTMyX1BPV0VSUENfSEVBREVSX1ZFUlNJT04gMQotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybWF0IG9mIGEgUG93ZXJQQyBOTE0gcmVsb2MuICBUaGlzIGlzIHRoZSBzYW1lIGFzIGFuCi0gICBYQ09GRiBkeW5hbWljIHJlbG9jLiAgKi8KLQotc3RydWN0IG5sbTMyX3Bvd2VycGNfZXh0ZXJuYWxfcmVsb2MKLXsKLSAgLyogQWRkcmVzcy4gICovCi0gIHVuc2lnbmVkIGNoYXIgbF92YWRkcls0XTsKLSAgLyogU3ltYm9sIHRhYmxlIGluZGV4LiAgVGhpcyBpcyAwIGZvciAudGV4dCBhbmQgMSBmb3IgLmRhdGEuICAyCi0gICAgIG1lYW5zIC5ic3MsIGJ1dCBJIGRvbid0IGtub3cgaWYgaXQgaXMgdXNlZC4gIEluIFhDT0ZGLCBsYXJnZXIKLSAgICAgbnVtYmVycyBhcmUgaW5kaWNlcyBpbnRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSwgYnV0IHRoZXkgYXJlCi0gICAgIHByZXN1bWFibHkgbm90IHVzZWQgaW4gYW4gTkxNLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsX3N5bW5keFs0XTsKLSAgLyogUmVsb2NhdGlvbiB0eXBlLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsX3J0eXBlWzJdOwotICAvKiBTZWN0aW9uIG51bWJlciBiZWluZyByZWxvY2F0ZWQuICAqLwotICB1bnNpZ25lZCBjaGFyIGxfcnNlY25tWzJdOwotfTsKLQotI2VuZGlmIC8qIE9MREZPUk1BVCAqLwotCi0vKiBUaGUgZXh0ZXJuYWwgZm9ybWF0IG9mIHRoZSBmaXhlZCBoZWFkZXIuICAqLwotCi10eXBlZGVmIHN0cnVjdCBubG0zMl9wb3dlcnBjX2V4dGVybmFsX2ZpeGVkX2hlYWRlcgotewotCi0gIC8qIFRoZSBzaWduYXR1cmUgZmllbGQgaWRlbnRpZmllcyB0aGUgZmlsZSBhcyBhbiBOTE0uICBJdCBtdXN0IGNvbnRhaW4KLSAgICAgdGhlIHNpZ25hdHVyZSBzdHJpbmcsIHdoaWNoIGRlcGVuZHMgdXBvbiB0aGUgTkxNIHRhcmdldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVsyNF07Ci0KLSAgLyogVGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlci4gIEF0IHRoaXMgdGltZSwgdGhlIGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIKLSAgICAgaXMgNC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25bNF07Ci0KLSAgLyogVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSwgd2hpY2ggbXVzdCBiZSBhIERPUyBuYW1lICgxLTggY2hhcmFjdGVycyBmb2xsb3dlZAotICAgICBieSBhIHBlcmlvZCBhbmQgYSAxLTMgY2hhcmFjdGVyIGV4dGVuc2lvbikuICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgYnl0ZQotICAgICBsZW5ndGggb2YgdGhlIG5hbWUgYW5kIHRoZSBsYXN0IGJ5dGUgaXMgYSBudWxsIHRlcm1pbmF0b3IgYnl0ZS4gIFRoaXMKLSAgICAgZmllbGQgaXMgZml4ZWQgbGVuZ3RoLCBhbmQgYW55IHVudXNlZCBieXRlcyBzaG91bGQgYmUgbnVsbCBieXRlcy4gIFRoZQotICAgICB2YWx1ZSBpcyBzZXQgYnkgdGhlIE9VVFBVVCBrZXl3b3JkIHRvIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVOYW1lWzE0XTsKLQotICAvKiBQYWRkaW5nIHRvIG1ha2UgaXQgY29tZSBvdXQgY29ycmVjdC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHBhZDFbMl07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjb2RlIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjb2RlIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGNvZGVJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBkYXRhIGltYWdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBkYXRhIGltYWdlLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRhdGFJbWFnZVNpemVbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgZGF0YSByZWdpb24gdGhhdCB0aGUgbG9hZGVyIGlzIHRvIGJlCi0gICAgIGFsbG9jYXRlZCBhdCBsb2FkIHRpbWUuICBVbmluaXRpYWxpemVkIGRhdGEgZm9sbG93cyB0aGUgaW5pdGlhbGl6ZWQKLSAgICAgZGF0YSBpbiB0aGUgTkxNIGFkZHJlc3Mgc3BhY2UuICovCi0KLSAgdW5zaWduZWQgY2hhciB1bmluaXRpYWxpemVkRGF0YVNpemVbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBjdXN0b20gZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4gIFRoZQotICAgICBjdXN0b20gZGF0YSBpcyBzZXQgYnkgdGhlIENVU1RPTSBrZXl3b3JkIHRvIE5MTUxJTksuICBJdCBpcyBwb3NzaWJsZQotICAgICBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gY3VzdG9tIGRhdGEuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhT2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBzaXplIG9mIHRoZSBjdXN0b20gZGF0YSwgaW4gYnl0ZXMuICovCi0KLSAgdW5zaWduZWQgY2hhciBjdXN0b21EYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIFRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBNT0RVTEUga2V5d29yZCBpbgotICAgICBOTE1MSU5LLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlRGVwZW5kZW5jeU9mZnNldFs0XTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXQgdGhlIG1vZHVsZURlcGVuZGVuY3lPZmZzZXQuICovCi0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZk1vZHVsZURlcGVuZGVuY2llc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHJlbG9jYXRpb24gZml4dXAgZGF0YSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSAqLwotICAgICAKLSAgdW5zaWduZWQgY2hhciByZWxvY2F0aW9uRml4dXBPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlJlbG9jYXRpb25GaXh1cHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleHRlcm5hbFJlZmVyZW5jZXNPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZkV4dGVybmFsUmVmZXJlbmNlc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIHB1YmxpY3NPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBudW1iZXJPZlB1YmxpY3NbNF07Ci0KLSAgLyogVGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBkZWJ1ZyBpbmZvIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgotICAgICBJdCBpcyBwb3NzaWJsZSBmb3IgdGhpcyB0byBiZSBFT0YgaWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mby4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGRlYnVnSW5mb09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRGVidWdSZWNvcmRzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZVN0YXJ0T2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZXhpdFByb2NlZHVyZU9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGNoZWNrVW5sb2FkUHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbW9kdWxlVHlwZVs0XTsKLQotICB1bnNpZ25lZCBjaGFyIGZsYWdzWzRdOwotCi19IE5sbTMyX3Bvd2VycGNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ubG0vc3BhcmMzMi1leHQuaCBiL2luY2x1ZGUvbmxtL3NwYXJjMzItZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZWIyZGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9ubG0vc3BhcmMzMi1leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKiBTUEFSQyBOTE0gKE5ldFdhcmUgTG9hZGFibGUgTW9kdWxlKSBzdXBwb3J0IGZvciBCRkQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEJGRCwgdGhlIEJpbmFyeSBGaWxlIERlc2NyaXB0b3IgbGlicmFyeS4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhlIGV4dGVybmFsIGZvcm1hdCBvZiB0aGUgZml4ZWQgaGVhZGVyLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgbmxtMzJfc3BhcmNfZXh0ZXJuYWxfZml4ZWRfaGVhZGVyCi17Ci0KLSAgLyogVGhlIHNpZ25hdHVyZSBmaWVsZCBpZGVudGlmaWVzIHRoZSBmaWxlIGFzIGFuIE5MTS4gIEl0IG11c3QgY29udGFpbgotICAgICB0aGUgc2lnbmF0dXJlIHN0cmluZywgd2hpY2ggZGVwZW5kcyB1cG9uIHRoZSBOTE0gdGFyZ2V0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlWzI0XTsKLQotICAvKiBUaGUgdmVyc2lvbiBvZiB0aGUgaGVhZGVyLiAgQXQgdGhpcyB0aW1lLCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlcgotICAgICBpcyA0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgdmVyc2lvbls0XTsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLCB3aGljaCBtdXN0IGJlIGEgRE9TIG5hbWUgKDEtOCBjaGFyYWN0ZXJzIGZvbGxvd2VkCi0gICAgIGJ5IGEgcGVyaW9kIGFuZCBhIDEtMyBjaGFyYWN0ZXIgZXh0ZW5zaW9uKS4gIFRoZSBmaXJzdCBieXRlIGlzIHRoZSBieXRlCi0gICAgIGxlbmd0aCBvZiB0aGUgbmFtZSBhbmQgdGhlIGxhc3QgYnl0ZSBpcyBhIG51bGwgdGVybWluYXRvciBieXRlLiAgVGhpcwotICAgICBmaWVsZCBpcyBmaXhlZCBsZW5ndGgsIGFuZCBhbnkgdW51c2VkIGJ5dGVzIHNob3VsZCBiZSBudWxsIGJ5dGVzLiAgVGhlCi0gICAgIHZhbHVlIGlzIHNldCBieSB0aGUgT1VUUFVUIGtleXdvcmQgdG8gTkxNTElOSy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG1vZHVsZU5hbWVbMTRdOwotCi0gIC8qIFBhZGRpbmcgdG8gbWFrZSBpdCBjb21lIG91dCBjb3JyZWN0LiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgcGFkMVsyXTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGNvZGUgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBjb2RlSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGNvZGUgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgY29kZUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGRhdGEgaW1hZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuICovCi0KLSAgdW5zaWduZWQgY2hhciBkYXRhSW1hZ2VPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGRhdGEgaW1hZ2UsIGluIGJ5dGVzLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGF0YUltYWdlU2l6ZVs0XTsKLQotICAvKiBUaGUgc2l6ZSBvZiB0aGUgdW5pbml0aWFsaXplZCBkYXRhIHJlZ2lvbiB0aGF0IHRoZSBsb2FkZXIgaXMgdG8gYmUKLSAgICAgYWxsb2NhdGVkIGF0IGxvYWQgdGltZS4gIFVuaW5pdGlhbGl6ZWQgZGF0YSBmb2xsb3dzIHRoZSBpbml0aWFsaXplZAotICAgICBkYXRhIGluIHRoZSBOTE0gYWRkcmVzcyBzcGFjZS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIHVuaW5pdGlhbGl6ZWREYXRhU2l6ZVs0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGN1c3RvbSBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiAgVGhlCi0gICAgIGN1c3RvbSBkYXRhIGlzIHNldCBieSB0aGUgQ1VTVE9NIGtleXdvcmQgdG8gTkxNTElOSy4gIEl0IGlzIHBvc3NpYmxlCi0gICAgIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBjdXN0b20gZGF0YS4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFPZmZzZXRbNF07Ci0KLSAgLyogVGhlIHNpemUgb2YgdGhlIGN1c3RvbSBkYXRhLCBpbiBieXRlcy4gKi8KLQotICB1bnNpZ25lZCBjaGFyIGN1c3RvbURhdGFTaXplWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KLSAgICAgVGhlIG1vZHVsZSBkZXBlbmRlbmNpZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIE1PRFVMRSBrZXl3b3JkIGluCi0gICAgIE5MTUxJTksuICovCi0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVEZXBlbmRlbmN5T2Zmc2V0WzRdOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgbW9kdWxlIGRlcGVuZGVuY2llcyBhdCB0aGUgbW9kdWxlRGVwZW5kZW5jeU9mZnNldC4gKi8KLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mTW9kdWxlRGVwZW5kZW5jaWVzWzRdOwotCi0gIC8qIFRoZSBieXRlIG9mZnNldCBvZiB0aGUgcmVsb2NhdGlvbiBmaXh1cCBkYXRhIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlICovCi0gICAgIAotICB1bnNpZ25lZCBjaGFyIHJlbG9jYXRpb25GaXh1cE9mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUmVsb2NhdGlvbkZpeHVwc1s0XTsKLQotICB1bnNpZ25lZCBjaGFyIGV4dGVybmFsUmVmZXJlbmNlc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mRXh0ZXJuYWxSZWZlcmVuY2VzWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgcHVibGljc09mZnNldFs0XTsKLQotICB1bnNpZ25lZCBjaGFyIG51bWJlck9mUHVibGljc1s0XTsKLQotICAvKiBUaGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGludGVybmFsIGRlYnVnIGluZm8gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCi0gICAgIEl0IGlzIHBvc3NpYmxlIGZvciB0aGlzIHRvIGJlIEVPRiBpZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZGVidWdJbmZvT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyT2ZEZWJ1Z1JlY29yZHNbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBjb2RlU3RhcnRPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBleGl0UHJvY2VkdXJlT2Zmc2V0WzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgY2hlY2tVbmxvYWRQcm9jZWR1cmVPZmZzZXRbNF07Ci0KLSAgdW5zaWduZWQgY2hhciBtb2R1bGVUeXBlWzRdOwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3NbNF07Ci0KLX0gTmxtMzJfc3BhcmNfRXh0ZXJuYWxfRml4ZWRfSGVhZGVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vYXN5cy5oIGIvaW5jbHVkZS9vYXN5cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdkMjUwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb2FzeXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKiBPYXN5cyBvYmplY3QgZm9ybWF0IGhlYWRlciBmaWxlIGZvciBCRkQuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gICovCi0KLSNkZWZpbmUgT0FTWVNfTUFYX1NFQ19DT1VOVCAxNgotLyogKioqKiAqLwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19hcmNoaXZlX2hlYWRlciB7Ci0gIHVuc2lnbmVkIGludCAgdmVyc2lvbjsKLSAgY2hhciBjcmVhdGVfZGF0ZVsxMl07Ci0gIGNoYXIgcmV2aXNpb25fZGF0ZVsxMl07Ci0gIHVuc2lnbmVkIGludCBtb2RfY291bnQ7Ci0gIGZpbGVfcHRyIG1vZF90Ymxfb2Zmc2V0OwotICB1bnNpZ25lZCBpbnQgc3ltX3RibF9zaXplOwotICB1bnNpZ25lZCBpbnQgc3ltX2NvdW50OwotICBmaWxlX3B0ciBzeW1fdGJsX29mZnNldDsKLSAgdW5zaWduZWQgaW50IHhyZWZfY291bnQ7Ci0gIGZpbGVfcHRyIHhyZWZfbHN0X29mZnNldDsKLX0gb2FzeXNfYXJjaGl2ZV9oZWFkZXJfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfZXh0YXJjaGl2ZV9oZWFkZXIgewotICBiZmRfYnl0ZSB2ZXJzaW9uWzRdOwotICBiZmRfYnl0ZSBjcmVhdGVfZGF0ZVsxMl07Ci0gIGJmZF9ieXRlIHJldmlzaW9uX2RhdGVbMTJdOwotICBiZmRfYnl0ZSBtb2RfY291bnRbNF07Ci0gIGJmZF9ieXRlIG1vZF90Ymxfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSBzeW1fdGJsX3NpemVbNF07Ci0gIGJmZF9ieXRlIHN5bV9jb3VudFs0XTsKLSAgYmZkX2J5dGUgc3ltX3RibF9vZmZzZXRbNF07Ci0gIGJmZF9ieXRlIHhyZWZfY291bnRbNF07Ci0gIGJmZF9ieXRlIHhyZWZfbHN0X29mZnNldFs0XTsKLX0gb2FzeXNfZXh0YXJjaGl2ZV9oZWFkZXJfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfbW9kdWxlX3RhYmxlIHsKLSAgaW50IG1vZF9udW1iZXI7Ci0gIGNoYXIgbW9kX2RhdGVbMTJdOwotICB1bnNpZ25lZCBpbnQgbW9kX3NpemU7Ci0gIHVuc2lnbmVkIGludCBkZXBfY291bnQ7Ci0gIHVuc2lnbmVkIGludCBkZXBlZV9jb3VudDsKLSAgZmlsZV9wdHIgZmlsZV9vZmZzZXQ7Ci0gIHVuc2lnbmVkIGludCBzZWN0X2NvdW50OwotICBjaGFyICptb2R1bGVfbmFtZTsKLSAgdW5zaWduZWQgaW50IG1vZHVsZV9uYW1lX3NpemU7Ci19IG9hc3lzX21vZHVsZV90YWJsZV90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2V4dG1vZHVsZV90YWJsZV9hIHsKLSAgYmZkX2J5dGUgbW9kX251bWJlcls0XTsKLSAgYmZkX2J5dGUgbW9kX2RhdGVbMTJdOwotICBiZmRfYnl0ZSBtb2Rfc2l6ZVs0XTsKLSAgYmZkX2J5dGUgZGVwX2NvdW50WzRdOwotICBiZmRfYnl0ZSBkZXBlZV9jb3VudFs0XTsKLSAgYmZkX2J5dGUgc2VjdF9jb3VudFs0XTsKLSAgYmZkX2J5dGUgZmlsZV9vZmZzZXRbNF07Ci0gIGJmZF9ieXRlIG1vZF9uYW1lWzMyXTsKLX0gb2FzeXNfZXh0bW9kdWxlX3RhYmxlX3R5cGVfYV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19leHRtb2R1bGVfdGFibGVfYiB7Ci0gIGJmZF9ieXRlIG1vZF9udW1iZXJbNF07Ci0gIGJmZF9ieXRlIG1vZF9kYXRlWzEyXTsKLSAgYmZkX2J5dGUgbW9kX3NpemVbNF07Ci0gIGJmZF9ieXRlIGRlcF9jb3VudFs0XTsKLSAgYmZkX2J5dGUgZGVwZWVfY291bnRbNF07Ci0gIGJmZF9ieXRlIHNlY3RfY291bnRbNF07Ci0gIGJmZF9ieXRlIGZpbGVfb2Zmc2V0WzRdOwotICBiZmRfYnl0ZSBtb2RfbmFtZV9sZW5ndGhbNF07Ci19IG9hc3lzX2V4dG1vZHVsZV90YWJsZV90eXBlX2JfdHlwZTsKLQotCi10eXBlZGVmIGVudW0gb2FzeXNfcmVjb3JkIHsKLSAgb2FzeXNfcmVjb3JkX2lzX2VuZF9lbnVtID0gMCwKLSAgb2FzeXNfcmVjb3JkX2lzX2RhdGFfZW51bSA9IDEsCi0gIG9hc3lzX3JlY29yZF9pc19zeW1ib2xfZW51bSA9IDIsCi0gIG9hc3lzX3JlY29yZF9pc19oZWFkZXJfZW51bSA9IDMsCi0gIG9hc3lzX3JlY29yZF9pc19uYW1lZF9zZWN0aW9uX2VudW0gPSA0LAotICBvYXN5c19yZWNvcmRfaXNfY29tX2VudW0gPSA1LAotICBvYXN5c19yZWNvcmRfaXNfZGVidWdfZW51bSA9IDYsCi0gIG9hc3lzX3JlY29yZF9pc19zZWN0aW9uX2VudW0gPSA3LAotICBvYXN5c19yZWNvcmRfaXNfZGVidWdfZmlsZV9lbnVtID0gOCwKLSAgb2FzeXNfcmVjb3JkX2lzX21vZHVsZV9lbnVtID0gOSwKLSAgb2FzeXNfcmVjb3JkX2lzX2xvY2FsX2VudW0gPSAxMAotfSBvYXN5c19yZWNvcmRfZW51bV90eXBlOwotCi0gIAotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19yZWNvcmRfaGVhZGVyIHsKLSAgdW5zaWduZWQgY2hhciBsZW5ndGg7Ci0gIHVuc2lnbmVkIGNoYXIgY2hlY2tfc3VtOwotICB1bnNpZ25lZCBjaGFyIHR5cGU7Ci0gIHVuc2lnbmVkIGNoYXIgZmlsbDsKLX0gb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBvYXN5c19kYXRhX3JlY29yZCB7Ci0gIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuc2lnbmVkIGNoYXIgcmVsYjsKLSAgYmZkX2J5dGUgYWRkcls0XTsKLSAgLyogbWF4aW11bSB0b3RhbCBzaXplIG9mIGRhdGEgcmVjb3JkIGlzIDI1NSBieXRlcyAqLwotICBiZmRfYnl0ZSBkYXRhWzI0Nl07Ci19IG9hc3lzX2RhdGFfcmVjb3JkX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2hlYWRlcl9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHZlcnNpb25fbnVtYmVyOwotICB1bnNpZ25lZCBjaGFyIHJldl9udW1iZXI7Ci0gIGNoYXIgbW9kdWxlX25hbWVbMjYtNl07Ci0gIGNoYXIgZGVzY3JpcHRpb25bNjQtMjZdOwotfSBvYXN5c19oZWFkZXJfcmVjb3JkX3R5cGU7Ci0KLSNkZWZpbmUgT0FTWVNfVkVSU0lPTl9OVU1CRVIgMAotI2RlZmluZSBPQVNZU19SRVZfTlVNQkVSIDAKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfc3ltYm9sX3JlY29yZCB7Ci0gIG9hc3lzX3JlY29yZF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuc2lnbmVkIGNoYXIgcmVsYjsKLSAgYmZkX2J5dGUgdmFsdWVbNF07Ci0gIGJmZF9ieXRlIHJlZm5vWzJdOwotICBjaGFyIG5hbWVbNjRdOwotfSBvYXN5c19zeW1ib2xfcmVjb3JkX3R5cGU7Ci0KLSNkZWZpbmUgUkVMT0NBVElPTl9QQ1JFTF9CSVQgMHg4MAotI2RlZmluZSBSRUxPQ0FUSU9OXzMyQklUX0JJVCAweDQwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9CSVRTIDB4MzAKLSNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX0FCUyAweDAwCi0jZGVmaW5lIFJFTE9DQVRJT05fVFlQRV9SRUwgMHgxMAotI2RlZmluZSBSRUxPQ0FUSU9OX1RZUEVfVU5EIDB4MjAKLSNkZWZpbmUgUkVMT0NBVElPTl9UWVBFX0NPTSAweDMwCi0jZGVmaW5lIFJFTE9DQVRJT05fU0VDVF9CSVRTIDB4MGYKLQotdHlwZWRlZiBzdHJ1Y3Qgb2FzeXNfc2VjdGlvbl9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIHZhbHVlWzRdOwotICBiZmRfYnl0ZSB2bWFbNF07Ci0gIGJmZF9ieXRlIGZpbGxbM107Ci19IG9hc3lzX3NlY3Rpb25fcmVjb3JkX3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0IG9hc3lzX2VuZF9yZWNvcmQgewotICBvYXN5c19yZWNvcmRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bnNpZ25lZCBjaGFyIHJlbGI7Ci0gIGJmZF9ieXRlIGVudHJ5WzRdOwotICBiZmRfYnl0ZSBmaWxsWzJdOwotICBiZmRfYnl0ZSB6ZXJvOwotfSBvYXN5c19lbmRfcmVjb3JkX3R5cGU7Ci0KLXR5cGVkZWYgdW5pb24gb2FzeXNfcmVjb3JkX3VuaW9uIHsKLSAgb2FzeXNfcmVjb3JkX2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgb2FzeXNfZGF0YV9yZWNvcmRfdHlwZSBkYXRhOwotICBvYXN5c19zZWN0aW9uX3JlY29yZF90eXBlIHNlY3Rpb247Ci0gIG9hc3lzX3N5bWJvbF9yZWNvcmRfdHlwZSBzeW1ib2w7Ci0gIG9hc3lzX2hlYWRlcl9yZWNvcmRfdHlwZSBmaXJzdDsKLSAgb2FzeXNfZW5kX3JlY29yZF90eXBlIGVuZDsKLSAgYmZkX2J5dGUgcGFkWzI1Nl07Ci19IG9hc3lzX3JlY29yZF91bmlvbl90eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vYmphbGxvYy5oIGIvaW5jbHVkZS9vYmphbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ1MWNkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb2JqYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKiBvYmphbGxvYy5oIC0tIHJvdXRpbmVzIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2JqZWN0cwotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIE9CSkFMTE9DX0gKLSNkZWZpbmUgT0JKQUxMT0NfSAotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgc3BhY2UgZm9yIGFuIG9iamVjdC4gIFRoZSBhc3N1bXB0aW9uIGlzCi0gICB0aGF0IHRoZSBvYmplY3Qgd2lsbCB3YW50IHRvIGFsbG9jYXRlIHNwYWNlIGFzIGl0IGdvZXMgYWxvbmcsIGJ1dAotICAgd2lsbCBuZXZlciB3YW50IHRvIGZyZWUgYW55IHBhcnRpY3VsYXIgYmxvY2suICBUaGVyZSBpcyBhIGZ1bmN0aW9uCi0gICB0byBmcmVlIGEgYmxvY2ssIHdoaWNoIGFsc28gZnJlZXMgYWxsIG1vcmUgcmVjZW50bHkgYWxsb2NhdGVkCi0gICBibG9ja3MuICBUaGVyZSBpcyBhbHNvIGEgZnVuY3Rpb24gdG8gZnJlZSBhbGwgdGhlIGFsbG9jYXRlZCBzcGFjZS4KLQotICAgVGhpcyBpcyBlc3NlbnRpYWxseSBhIHNwZWNpYWxpemF0aW9uIG9mIG9ic3RhY2tzLiAgVGhlIG1haW4KLSAgIGRpZmZlcmVuY2UgaXMgdGhhdCBhIGJsb2NrIG1heSBub3QgYmUgYWxsb2NhdGVkIGEgYml0IGF0IGEgdGltZS4KLSAgIEFub3RoZXIgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXNlIHJvdXRpbmVzIGFyZSBhbHdheXMgYnVpbHQgb24gdG9wCi0gICBvZiBtYWxsb2MsIGFuZCBhbHdheXMgcGFzcyBhbiBtYWxsb2MgZmFpbHVyZSBiYWNrIHRvIHRoZSBjYWxsZXIsCi0gICB1bmxpa2UgbW9yZSByZWNlbnQgdmVyc2lvbnMgb2Ygb2JzdGFja3MuICAqLwotCi0vKiBUaGlzIGlzIHdoYXQgYW4gb2JqYWxsb2Mgc3RydWN0dXJlIGxvb2tzIGxpa2UuICBDYWxsZXJzIHNob3VsZCBub3QKLSAgIHJlZmVyIHRvIHRoZXNlIGZpZWxkcywgbm9yIHNob3VsZCB0aGV5IGFsbG9jYXRlIHRoZXNlIHN0cnVjdHVyZQotICAgdGhlbXNlbHZlcy4gIEluc3RlYWQsIHRoZXkgc2hvdWxkIG9ubHkgY3JlYXRlIHRoZW0gdmlhCi0gICBvYmphbGxvY19pbml0LCBhbmQgb25seSBhY2Nlc3MgdGhlbSB2aWEgdGhlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zCi0gICBsaXN0ZWQgYmVsb3cuICBUaGUgc3RydWN0dXJlIGlzIG9ubHkgZGVmaW5lZCBoZXJlIHNvIHRoYXQgd2UgY2FuCi0gICBhY2Nlc3MgaXQgdmlhIG1hY3Jvcy4gICovCi0KLXN0cnVjdCBvYmphbGxvYwotewotICBjaGFyICpjdXJyZW50X3B0cjsKLSAgdW5zaWduZWQgaW50IGN1cnJlbnRfc3BhY2U7Ci0gIFBUUiBjaHVua3M7Ci19OwotCi0vKiBXb3JrIG91dCB0aGUgcmVxdWlyZWQgYWxpZ25tZW50LiAgKi8KLQotc3RydWN0IG9iamFsbG9jX2FsaWduIHsgY2hhciB4OyBkb3VibGUgZDsgfTsKLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2lmbmRlZiBvZmZzZXRvZgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi0jZGVmaW5lIE9CSkFMTE9DX0FMSUdOIFwKLSAgKChwdHJkaWZmX3QpICgoY2hhciAqKSAmKChzdHJ1Y3Qgb2JqYWxsb2NfYWxpZ24gKikgMCktPmQgLSAoY2hhciAqKSAwKSkKLSNlbHNlCi0jZGVmaW5lIE9CSkFMTE9DX0FMSUdOIFwKLSAgKChsb25nKSAoKGNoYXIgKikgJigoc3RydWN0IG9iamFsbG9jX2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCi0jZW5kaWYKLQotLyogQ3JlYXRlIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gIFJldHVybnMgTlVMTCBpZiBtYWxsb2MgZmFpbHMuICAqLwotCi1leHRlcm4gc3RydWN0IG9iamFsbG9jICpvYmphbGxvY19jcmVhdGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBBbGxvY2F0ZSBzcGFjZSBmcm9tIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gIFJldHVybnMgTlVMTCBpZiBtYWxsb2MKLSAgIGZhaWxzLiAgKi8KLQotZXh0ZXJuIFBUUiBfb2JqYWxsb2NfYWxsb2MgUEFSQU1TICgoc3RydWN0IG9iamFsbG9jICosIHVuc2lnbmVkIGxvbmcpKTsKLQotLyogVGhlIG1hY3JvIHZlcnNpb24gb2Ygb2JqYWxsb2NfYWxsb2MuICBXZSBvbmx5IGRlZmluZSB0aGlzIGlmIHVzaW5nCi0gICBnY2MsIGJlY2F1c2Ugb3RoZXJ3aXNlIHdlIHdvdWxkIGhhdmUgdG8gZXZhbHVhdGUgdGhlIGFyZ3VtZW50cwotICAgbXVsdGlwbGUgdGltZXMsIG9yIHVzZSBhIHRlbXBvcmFyeSBmaWVsZCBhcyBvYnN0YWNrLmggZG9lcy4gICovCi0KLSNpZiBkZWZpbmVkIChfX0dOVUNfXykgJiYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0KLS8qIE5leHRTdGVwIDIuMCBjYyBpcyByZWFsbHkgZ2NjIDEuOTMgYnV0IGl0IGRlZmluZXMgX19HTlVDX18gPSAyIGFuZAotICAgZG9lcyBub3QgaW1wbGVtZW50IF9fZXh0ZW5zaW9uX18uICBCdXQgdGhhdCBjb21waWxlciBkb2Vzbid0IGRlZmluZQotICAgX19HTlVDX01JTk9SX18uICAqLwotI2lmIF9fR05VQ19fIDwgMiB8fCAoX19OZVhUX18gJiYgIV9fR05VQ19NSU5PUl9fKQotI2RlZmluZSBfX2V4dGVuc2lvbl9fCi0jZW5kaWYKLQotI2RlZmluZSBvYmphbGxvY19hbGxvYyhvLCBsKQkJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JqYWxsb2MgKl9fbyA9IChvKTsJCQkJCVwKLSAgICAgdW5zaWduZWQgbG9uZyBfX2xlbiA9IChsKTsJCQkJCQlcCi0gICAgIGlmIChfX2xlbiA9PSAwKQkJCQkJCQlcCi0gICAgICAgX19sZW4gPSAxOwkJCQkJCQlcCi0gICAgIF9fbGVuID0gKF9fbGVuICsgT0JKQUxMT0NfQUxJR04gLSAxKSAmfiAoT0JKQUxMT0NfQUxJR04gLSAxKTsJXAotICAgICAoX19sZW4gPD0gX19vLT5jdXJyZW50X3NwYWNlCQkJCQlcCi0gICAgICA/IChfX28tPmN1cnJlbnRfcHRyICs9IF9fbGVuLAkJCQkJXAotCSBfX28tPmN1cnJlbnRfc3BhY2UgLT0gX19sZW4sCQkJCQlcCi0JIChQVFIpIChfX28tPmN1cnJlbnRfcHRyIC0gX19sZW4pKQkJCQlcCi0gICAgICA6IF9vYmphbGxvY19hbGxvYyAoX19vLCBfX2xlbikpOyB9KQotCi0jZWxzZSAvKiAhIF9fR05VQ19fICovCi0KLSNkZWZpbmUgb2JqYWxsb2NfYWxsb2MobywgbCkgX29iamFsbG9jX2FsbG9jICgobyksIChsKSkKLQotI2VuZGlmIC8qICEgX19HTlVDX18gKi8KLQotLyogRnJlZSBhbiBlbnRpcmUgb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotZXh0ZXJuIHZvaWQgb2JqYWxsb2NfZnJlZSBQQVJBTVMgKChzdHJ1Y3Qgb2JqYWxsb2MgKikpOwotCi0vKiBGcmVlIGEgYmxvY2sgYWxsb2NhdGVkIGJ5IG9iamFsbG9jX2FsbG9jLiAgVGhpcyBhbHNvIGZyZWVzIGFsbCBtb3JlCi0gICByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2tzLiAgKi8KLQotZXh0ZXJuIHZvaWQgb2JqYWxsb2NfZnJlZV9ibG9jayBQQVJBTVMgKChzdHJ1Y3Qgb2JqYWxsb2MgKiwgUFRSKSk7Ci0KLSNlbmRpZiAvKiBPQkpBTExPQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29ic3RhY2suaCBiL2luY2x1ZGUvb2JzdGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGU5Njc3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb2JzdGFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkzICswLDAgQEAKLS8qIG9ic3RhY2suaCAtIG9iamVjdCBzdGFjayBtYWNyb3MKLSAgIENvcHlyaWdodCAoQykgMTk4OCw4OSw5MCw5MSw5Miw5Myw5NCw5Niw5Nyw5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotCi0gICBOT1RFOiBUaGUgY2Fub25pY2FsIHNvdXJjZSBvZiB0aGlzIGZpbGUgaXMgbWFpbnRhaW5lZCB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5LgotICAgQnVncyBjYW4gYmUgcmVwb3J0ZWQgdG8gYnVnLWdsaWJjQGdudS5vcmcuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAgIGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsCi0gICBVU0EuICAqLwotCi0vKiBTdW1tYXJ5OgotCi1BbGwgdGhlIGFwcGFyZW50IGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgYXJlIG1hY3Jvcy4gVGhlIGlkZWEKLWlzIHRoYXQgeW91IHdvdWxkIHVzZSB0aGVzZSBwcmUtdGVzdGVkIG1hY3JvcyB0byBzb2x2ZSBhCi12ZXJ5IHNwZWNpZmljIHNldCBvZiBwcm9ibGVtcywgYW5kIHRoZXkgd291bGQgcnVuIGZhc3QuCi1DYXV0aW9uOiBubyBzaWRlLWVmZmVjdHMgaW4gYXJndW1lbnRzIHBsZWFzZSEhIFRoZXkgbWF5IGJlCi1ldmFsdWF0ZWQgTUFOWSB0aW1lcyEhCi0KLVRoZXNlIG1hY3JvcyBvcGVyYXRlIGEgc3RhY2sgb2Ygb2JqZWN0cy4gIEVhY2ggb2JqZWN0IHN0YXJ0cyBsaWZlCi1zbWFsbCwgYW5kIG1heSBncm93IHRvIG1hdHVyaXR5LiAgKENvbnNpZGVyIGJ1aWxkaW5nIGEgd29yZCBzeWxsYWJsZQotYnkgc3lsbGFibGUuKSAgQW4gb2JqZWN0IGNhbiBtb3ZlIHdoaWxlIGl0IGlzIGdyb3dpbmcuICBPbmNlIGl0IGhhcwotYmVlbiAiZmluaXNoZWQiIGl0IG5ldmVyIGNoYW5nZXMgYWRkcmVzcyBhZ2Fpbi4gIFNvIHRoZSAidG9wIG9mIHRoZQotc3RhY2siIGlzIHR5cGljYWxseSBhbiBpbW1hdHVyZSBncm93aW5nIG9iamVjdCwgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlCi1zdGFjayBpcyBvZiBtYXR1cmUsIGZpeGVkIHNpemUgYW5kIGZpeGVkIGFkZHJlc3Mgb2JqZWN0cy4KLQotVGhlc2Ugcm91dGluZXMgZ3JhYiBsYXJnZSBjaHVua3Mgb2YgbWVtb3J5LCB1c2luZyBhIGZ1bmN0aW9uIHlvdQotc3VwcGx5LCBjYWxsZWQgYG9ic3RhY2tfY2h1bmtfYWxsb2MnLiAgT24gb2NjYXNpb24sIHRoZXkgZnJlZSBjaHVua3MsCi1ieSBjYWxsaW5nIGBvYnN0YWNrX2NodW5rX2ZyZWUnLiAgWW91IG11c3QgZGVmaW5lIHRoZW0gYW5kIGRlY2xhcmUKLXRoZW0gYmVmb3JlIHVzaW5nIGFueSBvYnN0YWNrIG1hY3Jvcy4KLQotRWFjaCBpbmRlcGVuZGVudCBzdGFjayBpcyByZXByZXNlbnRlZCBieSBhIGBzdHJ1Y3Qgb2JzdGFjaycuCi1FYWNoIG9mIHRoZSBvYnN0YWNrIG1hY3JvcyBleHBlY3RzIGEgcG9pbnRlciB0byBzdWNoIGEgc3RydWN0dXJlCi1hcyB0aGUgZmlyc3QgYXJndW1lbnQuCi0KLU9uZSBtb3RpdmF0aW9uIGZvciB0aGlzIHBhY2thZ2UgaXMgdGhlIHByb2JsZW0gb2YgZ3Jvd2luZyBjaGFyIHN0cmluZ3MKLWluIHN5bWJvbCB0YWJsZXMuICBVbmxlc3MgeW91IGFyZSAiZmFzY2lzdCBwaWcgd2l0aCBhIHJlYWQtb25seSBtaW5kIgotLS1Hb3NwZXIncyBpbW1vcnRhbCBxdW90ZSBmcm9tIEhBS01FTSBpdGVtIDE1NCwgb3V0IG9mIGNvbnRleHQtLXlvdQotd291bGQgbm90IGxpa2UgdG8gcHV0IGFueSBhcmJpdHJhcnkgdXBwZXIgbGltaXQgb24gdGhlIGxlbmd0aCBvZiB5b3VyCi1zeW1ib2xzLgotCi1JbiBwcmFjdGljZSB0aGlzIG9mdGVuIG1lYW5zIHlvdSB3aWxsIGJ1aWxkIG1hbnkgc2hvcnQgc3ltYm9scyBhbmQgYQotZmV3IGxvbmcgc3ltYm9scy4gIEF0IHRoZSB0aW1lIHlvdSBhcmUgcmVhZGluZyBhIHN5bWJvbCB5b3UgZG9uJ3Qga25vdwotaG93IGxvbmcgaXQgaXMuICBPbmUgdHJhZGl0aW9uYWwgbWV0aG9kIGlzIHRvIHJlYWQgYSBzeW1ib2wgaW50byBhCi1idWZmZXIsIHJlYWxsb2MoKWF0aW5nIHRoZSBidWZmZXIgZXZlcnkgdGltZSB5b3UgdHJ5IHRvIHJlYWQgYSBzeW1ib2wKLXRoYXQgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlci4gIFRoaXMgaXMgYmVhdXQsIGJ1dCB5b3Ugc3RpbGwgd2lsbAotd2FudCB0byBjb3B5IHRoZSBzeW1ib2wgZnJvbSB0aGUgYnVmZmVyIHRvIGEgbW9yZSBwZXJtYW5lbnQKLXN5bWJvbC10YWJsZSBlbnRyeSBzYXkgYWJvdXQgaGFsZiB0aGUgdGltZS4KLQotV2l0aCBvYnN0YWNrcywgeW91IGNhbiB3b3JrIGRpZmZlcmVudGx5LiAgVXNlIG9uZSBvYnN0YWNrIGZvciBhbGwgc3ltYm9sCi1uYW1lcy4gIEFzIHlvdSByZWFkIGEgc3ltYm9sLCBncm93IHRoZSBuYW1lIGluIHRoZSBvYnN0YWNrIGdyYWR1YWxseS4KLVdoZW4gdGhlIG5hbWUgaXMgY29tcGxldGUsIGZpbmFsaXplIGl0LiAgVGhlbiwgaWYgdGhlIHN5bWJvbCBleGlzdHMgYWxyZWFkeSwKLWZyZWUgdGhlIG5ld2x5IHJlYWQgbmFtZS4KLQotVGhlIHdheSB3ZSBkbyB0aGlzIGlzIHRvIHRha2UgYSBsYXJnZSBjaHVuaywgYWxsb2NhdGluZyBtZW1vcnkgZnJvbQotbG93IGFkZHJlc3Nlcy4gIFdoZW4geW91IHdhbnQgdG8gYnVpbGQgYSBzeW1ib2wgaW4gdGhlIGNodW5rIHlvdSBqdXN0Ci1hZGQgY2hhcnMgYWJvdmUgdGhlIGN1cnJlbnQgImhpZ2ggd2F0ZXIgbWFyayIgaW4gdGhlIGNodW5rLiAgV2hlbiB5b3UKLWhhdmUgZmluaXNoZWQgYWRkaW5nIGNoYXJzLCBiZWNhdXNlIHlvdSBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sLAoteW91IGtub3cgaG93IGxvbmcgdGhlIGNoYXJzIGFyZSwgYW5kIHlvdSBjYW4gY3JlYXRlIGEgbmV3IG9iamVjdC4KLU1vc3RseSB0aGUgY2hhcnMgd2lsbCBub3QgYnVyc3Qgb3ZlciB0aGUgaGlnaGVzdCBhZGRyZXNzIG9mIHRoZSBjaHVuaywKLWJlY2F1c2UgeW91IHdvdWxkIHR5cGljYWxseSBleHBlY3QgYSBjaHVuayB0byBiZSAoc2F5KSAxMDAgdGltZXMgYXMKLWxvbmcgYXMgYW4gYXZlcmFnZSBvYmplY3QuCi0KLUluIGNhc2UgdGhhdCBpc24ndCBjbGVhciwgd2hlbiB3ZSBoYXZlIGVub3VnaCBjaGFycyB0byBtYWtlIHVwCi10aGUgb2JqZWN0LCBUSEVZIEFSRSBBTFJFQURZIENPTlRJR1VPVVMgSU4gVEhFIENIVU5LIChndWFyYW50ZWVkKQotc28gd2UganVzdCBwb2ludCB0byBpdCB3aGVyZSBpdCBsaWVzLiAgTm8gbW92aW5nIG9mIGNoYXJzIGlzCi1uZWVkZWQgYW5kIHRoaXMgaXMgdGhlIHNlY29uZCB3aW46IHBvdGVudGlhbGx5IGxvbmcgc3RyaW5ncyBuZWVkCi1uZXZlciBiZSBleHBsaWNpdGx5IHNodWZmbGVkLiBPbmNlIGFuIG9iamVjdCBpcyBmb3JtZWQsIGl0IGRvZXMgbm90Ci1jaGFuZ2UgaXRzIGFkZHJlc3MgZHVyaW5nIGl0cyBsaWZldGltZS4KLQotV2hlbiB0aGUgY2hhcnMgYnVyc3Qgb3ZlciBhIGNodW5rIGJvdW5kYXJ5LCB3ZSBhbGxvY2F0ZSBhIGxhcmdlcgotY2h1bmssIGFuZCB0aGVuIGNvcHkgdGhlIHBhcnRseSBmb3JtZWQgb2JqZWN0IGZyb20gdGhlIGVuZCBvZiB0aGUgb2xkCi1jaHVuayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgbGFyZ2VyIGNodW5rLiAgV2UgdGhlbiBjYXJyeSBvbgotYWNjcmV0aW5nIGNoYXJhY3RlcnMgdG8gdGhlIGVuZCBvZiB0aGUgb2JqZWN0IGFzIHdlIG5vcm1hbGx5IHdvdWxkLgotCi1BIHNwZWNpYWwgbWFjcm8gaXMgcHJvdmlkZWQgdG8gYWRkIGEgc2luZ2xlIGNoYXIgYXQgYSB0aW1lIHRvIGEKLWdyb3dpbmcgb2JqZWN0LiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiByZWdpc3RlciB2YXJpYWJsZXMsIHdoaWNoCi1icmVhayB0aGUgb3JkaW5hcnkgJ2dyb3d0aCcgbWFjcm8uCi0KLVN1bW1hcnk6Ci0JV2UgYWxsb2NhdGUgbGFyZ2UgY2h1bmtzLgotCVdlIGNhcnZlIG91dCBvbmUgb2JqZWN0IGF0IGEgdGltZSBmcm9tIHRoZSBjdXJyZW50IGNodW5rLgotCU9uY2UgY2FydmVkLCBhbiBvYmplY3QgbmV2ZXIgbW92ZXMuCi0JV2UgYXJlIGZyZWUgdG8gYXBwZW5kIGRhdGEgb2YgYW55IHNpemUgdG8gdGhlIGN1cnJlbnRseQotCSAgZ3Jvd2luZyBvYmplY3QuCi0JRXhhY3RseSBvbmUgb2JqZWN0IGlzIGdyb3dpbmcgaW4gYW4gb2JzdGFjayBhdCBhbnkgb25lIHRpbWUuCi0JWW91IGNhbiBydW4gb25lIG9ic3RhY2sgcGVyIGNvbnRyb2wgYmxvY2suCi0JWW91IG1heSBoYXZlIGFzIG1hbnkgY29udHJvbCBibG9ja3MgYXMgeW91IGRhcmUuCi0JQmVjYXVzZSBvZiB0aGUgd2F5IHdlIGRvIGl0LCB5b3UgY2FuIGB1bndpbmQnIGFuIG9ic3RhY2sKLQkgIGJhY2sgdG8gYSBwcmV2aW91cyBzdGF0ZS4gKFlvdSBtYXkgcmVtb3ZlIG9iamVjdHMgbXVjaAotCSAgYXMgeW91IHdvdWxkIHdpdGggYSBzdGFjay4pCi0qLwotCi0KLS8qIERvbid0IGRvIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbW9yZSB0aGFuIG9uY2UuICAqLwotCi0jaWZuZGVmIF9PQlNUQUNLX0gKLSNkZWZpbmUgX09CU1RBQ0tfSCAxCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQwKLS8qIFdlIHVzZSBzdWJ0cmFjdGlvbiBvZiAoY2hhciAqKSAwIGluc3RlYWQgb2YgY2FzdGluZyB0byBpbnQKLSAgIGJlY2F1c2Ugb24gd29yZC1hZGRyZXNzYWJsZSBtYWNoaW5lcyBhIHNpbXBsZSBjYXN0IHRvIGludAotICAgbWF5IGlnbm9yZSB0aGUgYnl0ZS13aXRoaW4td29yZCBmaWVsZCBvZiB0aGUgcG9pbnRlci4gICovCi0KLSNpZm5kZWYgX19QVFJfVE9fSU5UCi0jIGRlZmluZSBfX1BUUl9UT19JTlQoUCkgKChQKSAtIChjaGFyICopIDApCi0jZW5kaWYKLQotI2lmbmRlZiBfX0lOVF9UT19QVFIKLSMgZGVmaW5lIF9fSU5UX1RPX1BUUihQKSAoKFApICsgKGNoYXIgKikgMCkKLSNlbmRpZgotCi0vKiBXZSBuZWVkIHRoZSB0eXBlIG9mIHRoZSByZXN1bHRpbmcgb2JqZWN0LiAgSWYgX19QVFJESUZGX1RZUEVfXyBpcwotICAgZGVmaW5lZCwgYXMgd2l0aCBHTlUgQywgdXNlIHRoYXQ7IHRoYXQgd2F5IHdlIGRvbid0IHBvbGx1dGUgdGhlCi0gICBuYW1lc3BhY2Ugd2l0aCA8c3RkZGVmLmg+J3Mgc3ltYm9scy4gIE90aGVyd2lzZSwgaWYgPHN0ZGRlZi5oPiBpcwotICAgYXZhaWxhYmxlLCBpbmNsdWRlIGl0IGFuZCB1c2UgcHRyZGlmZl90LiAgSW4gdHJhZGl0aW9uYWwgQywgbG9uZyBpcwotICAgdGhlIGJlc3QgdGhhdCB3ZSBjYW4gZG8uICAqLwotCi0jaWZkZWYgX19QVFJESUZGX1RZUEVfXwotIyBkZWZpbmUgUFRSX0lOVF9UWVBFIF9fUFRSRElGRl9UWVBFX18KLSNlbHNlCi0jIGlmZGVmIEhBVkVfU1REREVGX0gKLSMgIGluY2x1ZGUgPHN0ZGRlZi5oPgotIyAgZGVmaW5lIFBUUl9JTlRfVFlQRSBwdHJkaWZmX3QKLSMgZWxzZQotIyAgZGVmaW5lIFBUUl9JTlRfVFlQRSBsb25nCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUklOR19ICi0jIGluY2x1ZGUgPHN0cmluZy5oPgotIyBkZWZpbmUgX29ic3RhY2tfbWVtY3B5KFRvLCBGcm9tLCBOKSBtZW1jcHkgKChUbyksIChGcm9tKSwgKE4pKQotI2Vsc2UKLSMgaWZkZWYgbWVtY3B5Ci0jICBkZWZpbmUgX29ic3RhY2tfbWVtY3B5KFRvLCBGcm9tLCBOKSBtZW1jcHkgKChUbyksIChGcm9tKSwgKE4pKQotIyBlbHNlCi0jICBkZWZpbmUgX29ic3RhY2tfbWVtY3B5KFRvLCBGcm9tLCBOKSBiY29weSAoKEZyb20pLCAoVG8pLCAoTikpCi0jIGVuZGlmCi0jZW5kaWYKLQotc3RydWN0IF9vYnN0YWNrX2NodW5rCQkvKiBMaXZlcyBhdCBmcm9udCBvZiBlYWNoIGNodW5rLiAqLwotewotICBjaGFyICAqbGltaXQ7CQkJLyogMSBwYXN0IGVuZCBvZiB0aGlzIGNodW5rICovCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcHJldjsJLyogYWRkcmVzcyBvZiBwcmlvciBjaHVuayBvciBOVUxMICovCi0gIGNoYXIJY29udGVudHNbNF07CQkvKiBvYmplY3RzIGJlZ2luIGhlcmUgKi8KLX07Ci0KLXN0cnVjdCBvYnN0YWNrCQkvKiBjb250cm9sIGN1cnJlbnQgb2JqZWN0IGluIGN1cnJlbnQgY2h1bmsgKi8KLXsKLSAgbG9uZwljaHVua19zaXplOwkJLyogcHJlZmVycmVkIHNpemUgdG8gYWxsb2NhdGUgY2h1bmtzIGluICovCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7CS8qIGFkZHJlc3Mgb2YgY3VycmVudCBzdHJ1Y3Qgb2JzdGFja19jaHVuayAqLwotICBjaGFyCSpvYmplY3RfYmFzZTsJCS8qIGFkZHJlc3Mgb2Ygb2JqZWN0IHdlIGFyZSBidWlsZGluZyAqLwotICBjaGFyCSpuZXh0X2ZyZWU7CQkvKiB3aGVyZSB0byBhZGQgbmV4dCBjaGFyIHRvIGN1cnJlbnQgb2JqZWN0ICovCi0gIGNoYXIJKmNodW5rX2xpbWl0OwkJLyogYWRkcmVzcyBvZiBjaGFyIGFmdGVyIGN1cnJlbnQgY2h1bmsgKi8KLSAgUFRSX0lOVF9UWVBFIHRlbXA7CQkvKiBUZW1wb3JhcnkgZm9yIHNvbWUgbWFjcm9zLiAgKi8KLSAgaW50ICAgYWxpZ25tZW50X21hc2s7CQkvKiBNYXNrIG9mIGFsaWdubWVudCBmb3IgZWFjaCBvYmplY3QuICovCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotICAvKiBUaGVzZSBwcm90b3R5cGVzIHZhcnkgYmFzZWQgb24gYHVzZV9leHRyYV9hcmcnLCBhbmQgd2UgdXNlCi0gICAgIGNhc3RzIHRvIHRoZSBwcm90b3R5cGVsZXNzIGZ1bmN0aW9uIHR5cGUgaW4gYWxsIGFzc2lnbm1lbnRzLAotICAgICBidXQgaGF2aW5nIHByb3RvdHlwZXMgaGVyZSBxdWlldHMgLVdzdHJpY3QtcHJvdG90eXBlcy4gICovCi0gIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCpjaHVua2Z1bikgKHZvaWQgKiwgbG9uZyk7Ci0gIHZvaWQgKCpmcmVlZnVuKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKik7Ci0gIHZvaWQgKmV4dHJhX2FyZzsJCS8qIGZpcnN0IGFyZyBmb3IgY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyAqLwotI2Vsc2UKLSAgc3RydWN0IF9vYnN0YWNrX2NodW5rICooKmNodW5rZnVuKSAoKTsgLyogVXNlcidzIGZjbiB0byBhbGxvY2F0ZSBhIGNodW5rLiAgKi8KLSAgdm9pZCAoKmZyZWVmdW4pICgpOwkJLyogVXNlcidzIGZ1bmN0aW9uIHRvIGZyZWUgYSBjaHVuay4gICovCi0gIGNoYXIgKmV4dHJhX2FyZzsJCS8qIGZpcnN0IGFyZyBmb3IgY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyAqLwotI2VuZGlmCi0gIHVuc2lnbmVkIHVzZV9leHRyYV9hcmc6MTsJLyogY2h1bmsgYWxsb2MvZGVhbGxvYyBmdW5jcyB0YWtlIGV4dHJhIGFyZyAqLwotICB1bnNpZ25lZCBtYXliZV9lbXB0eV9vYmplY3Q6MTsvKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIGN1cnJlbnQKLQkJCQkgICBjaHVuayBjb250YWlucyBhIHplcm8tbGVuZ3RoIG9iamVjdC4gIFRoaXMKLQkJCQkgICBwcmV2ZW50cyBmcmVlaW5nIHRoZSBjaHVuayBpZiB3ZSBhbGxvY2F0ZQotCQkJCSAgIGEgYmlnZ2VyIGNodW5rIHRvIHJlcGxhY2UgaXQuICovCi0gIHVuc2lnbmVkIGFsbG9jX2ZhaWxlZDoxOwkvKiBObyBsb25nZXIgdXNlZCwgYXMgd2Ugbm93IGNhbGwgdGhlIGZhaWxlZAotCQkJCSAgIGhhbmRsZXIgb24gZXJyb3IsIGJ1dCByZXRhaW5lZCBmb3IgYmluYXJ5Ci0JCQkJICAgY29tcGF0aWJpbGl0eS4gICovCi19OwotCi0vKiBEZWNsYXJlIHRoZSBleHRlcm5hbCBmdW5jdGlvbnMgd2UgdXNlOyB0aGV5IGFyZSBpbiBvYnN0YWNrLmMuICAqLwotCi0jaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotZXh0ZXJuIHZvaWQgX29ic3RhY2tfbmV3Y2h1bmsgKHN0cnVjdCBvYnN0YWNrICosIGludCk7Ci1leHRlcm4gdm9pZCBfb2JzdGFja19mcmVlIChzdHJ1Y3Qgb2JzdGFjayAqLCB2b2lkICopOwotZXh0ZXJuIGludCBfb2JzdGFja19iZWdpbiAoc3RydWN0IG9ic3RhY2sgKiwgaW50LCBpbnQsCi0JCQkgICAgdm9pZCAqKCopIChsb25nKSwgdm9pZCAoKikgKHZvaWQgKikpOwotZXh0ZXJuIGludCBfb2JzdGFja19iZWdpbl8xIChzdHJ1Y3Qgb2JzdGFjayAqLCBpbnQsIGludCwKLQkJCSAgICAgdm9pZCAqKCopICh2b2lkICosIGxvbmcpLAotCQkJICAgICB2b2lkICgqKSAodm9pZCAqLCB2b2lkICopLCB2b2lkICopOwotZXh0ZXJuIGludCBfb2JzdGFja19tZW1vcnlfdXNlZCAoc3RydWN0IG9ic3RhY2sgKik7Ci0jZWxzZQotZXh0ZXJuIHZvaWQgX29ic3RhY2tfbmV3Y2h1bmsgKCk7Ci1leHRlcm4gdm9pZCBfb2JzdGFja19mcmVlICgpOwotZXh0ZXJuIGludCBfb2JzdGFja19iZWdpbiAoKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfYmVnaW5fMSAoKTsKLWV4dGVybiBpbnQgX29ic3RhY2tfbWVtb3J5X3VzZWQgKCk7Ci0jZW5kaWYKLQwKLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0KLS8qIERvIHRoZSBmdW5jdGlvbi1kZWNsYXJhdGlvbnMgYWZ0ZXIgdGhlIHN0cnVjdHMKLSAgIGJ1dCBiZWZvcmUgZGVmaW5pbmcgdGhlIG1hY3Jvcy4gICovCi0KLXZvaWQgb2JzdGFja19pbml0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci0KLXZvaWQgKiBvYnN0YWNrX2FsbG9jIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IHNpemUpOwotCi12b2lkICogb2JzdGFja19jb3B5IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYWRkcmVzcywgaW50IHNpemUpOwotdm9pZCAqIG9ic3RhY2tfY29weTAgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCB2b2lkICphZGRyZXNzLCBpbnQgc2l6ZSk7Ci0KLXZvaWQgb2JzdGFja19mcmVlIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqYmxvY2spOwotCi12b2lkIG9ic3RhY2tfYmxhbmsgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgc2l6ZSk7Ci0KLXZvaWQgb2JzdGFja19ncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqZGF0YSwgaW50IHNpemUpOwotdm9pZCBvYnN0YWNrX2dyb3cwIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgdm9pZCAqZGF0YSwgaW50IHNpemUpOwotCi12b2lkIG9ic3RhY2tfMWdyb3cgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgZGF0YV9jaGFyKTsKLXZvaWQgb2JzdGFja19wdHJfZ3JvdyAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEpOwotdm9pZCBvYnN0YWNrX2ludF9ncm93IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGEpOwotCi12b2lkICogb2JzdGFja19maW5pc2ggKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLQotaW50IG9ic3RhY2tfb2JqZWN0X3NpemUgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLQotaW50IG9ic3RhY2tfcm9vbSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotdm9pZCBvYnN0YWNrX21ha2Vfcm9vbSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBzaXplKTsKLXZvaWQgb2JzdGFja18xZ3Jvd19mYXN0IChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjaywgaW50IGRhdGFfY2hhcik7Ci12b2lkIG9ic3RhY2tfcHRyX2dyb3dfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIHZvaWQgKmRhdGEpOwotdm9pZCBvYnN0YWNrX2ludF9ncm93X2Zhc3QgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrLCBpbnQgZGF0YSk7Ci12b2lkIG9ic3RhY2tfYmxhbmtfZmFzdCAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2ssIGludCBzaXplKTsKLQotdm9pZCAqIG9ic3RhY2tfYmFzZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotdm9pZCAqIG9ic3RhY2tfbmV4dF9mcmVlIChzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjayk7Ci1pbnQgb2JzdGFja19hbGlnbm1lbnRfbWFzayAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotaW50IG9ic3RhY2tfY2h1bmtfc2l6ZSAoc3RydWN0IG9ic3RhY2sgKm9ic3RhY2spOwotaW50IG9ic3RhY2tfbWVtb3J5X3VzZWQgKHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrKTsKLQotI2VuZGlmIC8qIF9fU1REQ19fICovCi0KLS8qIE5vbi1BTlNJIEMgY2Fubm90IHJlYWxseSBzdXBwb3J0IGFsdGVybmF0aXZlIGZ1bmN0aW9ucyBmb3IgdGhlc2UgbWFjcm9zLAotICAgc28gd2UgZG8gbm90IGRlY2xhcmUgdGhlbS4gICovCi0KLS8qIEVycm9yIGhhbmRsZXIgY2FsbGVkIHdoZW4gYG9ic3RhY2tfY2h1bmtfYWxsb2MnIGZhaWxlZCB0byBhbGxvY2F0ZQotICAgbW9yZSBtZW1vcnkuICBUaGlzIGNhbiBiZSBzZXQgdG8gYSB1c2VyIGRlZmluZWQgZnVuY3Rpb24uICBUaGUKLSAgIGRlZmF1bHQgYWN0aW9uIGlzIHRvIHByaW50IGEgbWVzc2FnZSBhbmQgYWJvcnQuICAqLwotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLWV4dGVybiB2b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKHZvaWQpOwotI2Vsc2UKLWV4dGVybiB2b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKCk7Ci0jZW5kaWYKLQotLyogRXhpdCB2YWx1ZSB1c2VkIHdoZW4gYHByaW50X2FuZF9hYm9ydCcgaXMgdXNlZC4gICovCi1leHRlcm4gaW50IG9ic3RhY2tfZXhpdF9mYWlsdXJlOwotDAotLyogUG9pbnRlciB0byBiZWdpbm5pbmcgb2Ygb2JqZWN0IGJlaW5nIGFsbG9jYXRlZCBvciB0byBiZSBhbGxvY2F0ZWQgbmV4dC4KLSAgIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IG5vdCBiZSB0aGUgZmluYWwgYWRkcmVzcyBvZiB0aGUgb2JqZWN0Ci0gICBiZWNhdXNlIGEgbmV3IGNodW5rIG1pZ2h0IGJlIG5lZWRlZCB0byBob2xkIHRoZSBmaW5hbCBzaXplLiAgKi8KLQotI2RlZmluZSBvYnN0YWNrX2Jhc2UoaCkgKChoKS0+b2JqZWN0X2Jhc2UpCi0KLS8qIFNpemUgZm9yIGFsbG9jYXRpbmcgb3JkaW5hcnkgY2h1bmtzLiAgKi8KLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX3NpemUoaCkgKChoKS0+Y2h1bmtfc2l6ZSkKLQotLyogUG9pbnRlciB0byBuZXh0IGJ5dGUgbm90IHlldCBhbGxvY2F0ZWQgaW4gY3VycmVudCBjaHVuay4gICovCi0KLSNkZWZpbmUgb2JzdGFja19uZXh0X2ZyZWUoaCkJKChoKS0+bmV4dF9mcmVlKQotCi0vKiBNYXNrIHNwZWNpZnlpbmcgbG93IGJpdHMgdGhhdCBzaG91bGQgYmUgY2xlYXIgaW4gYWRkcmVzcyBvZiBhbiBvYmplY3QuICAqLwotCi0jZGVmaW5lIG9ic3RhY2tfYWxpZ25tZW50X21hc2soaCkgKChoKS0+YWxpZ25tZW50X21hc2spCi0KLS8qIFRvIHByZXZlbnQgcHJvdG90eXBlIHdhcm5pbmdzIHByb3ZpZGUgY29tcGxldGUgYXJndW1lbnQgbGlzdCBpbgotICAgc3RhbmRhcmQgQyB2ZXJzaW9uLiAgKi8KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi0KLSMgZGVmaW5lIG9ic3RhY2tfaW5pdChoKSBcCi0gIF9vYnN0YWNrX2JlZ2luICgoaCksIDAsIDAsIFwKLQkJICAodm9pZCAqKCopIChsb25nKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICh2b2lkICopKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmVnaW4oaCwgc2l6ZSkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAoc2l6ZSksIDAsIFwKLQkJICAodm9pZCAqKCopIChsb25nKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICh2b2lkICopKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uKGgsIHNpemUsIGFsaWdubWVudCwgY2h1bmtmdW4sIGZyZWVmdW4pIFwKLSAgX29ic3RhY2tfYmVnaW4gKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAobG9uZykpIChjaHVua2Z1biksICh2b2lkICgqKSAodm9pZCAqKSkgKGZyZWVmdW4pKQotCi0jIGRlZmluZSBvYnN0YWNrX3NwZWNpZnlfYWxsb2NhdGlvbl93aXRoX2FyZyhoLCBzaXplLCBhbGlnbm1lbnQsIGNodW5rZnVuLCBmcmVlZnVuLCBhcmcpIFwKLSAgX29ic3RhY2tfYmVnaW5fMSAoKGgpLCAoc2l6ZSksIChhbGlnbm1lbnQpLCBcCi0JCSAgICAodm9pZCAqKCopICh2b2lkICosIGxvbmcpKSAoY2h1bmtmdW4pLCBcCi0JCSAgICAodm9pZCAoKikgKHZvaWQgKiwgdm9pZCAqKSkgKGZyZWVmdW4pLCAoYXJnKSkKLQotIyBkZWZpbmUgb2JzdGFja19jaHVua2Z1bihoLCBuZXdjaHVua2Z1bikgXAotICAoKGgpIC0+IGNodW5rZnVuID0gKHN0cnVjdCBfb2JzdGFja19jaHVuayAqKCopKHZvaWQgKiwgbG9uZykpIChuZXdjaHVua2Z1bikpCi0KLSMgZGVmaW5lIG9ic3RhY2tfZnJlZWZ1bihoLCBuZXdmcmVlZnVuKSBcCi0gICgoaCkgLT4gZnJlZWZ1biA9ICh2b2lkICgqKSh2b2lkICosIHN0cnVjdCBfb2JzdGFja19jaHVuayAqKSkgKG5ld2ZyZWVmdW4pKQotCi0jZWxzZQotCi0jIGRlZmluZSBvYnN0YWNrX2luaXQoaCkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAwLCAwLCBcCi0JCSAgKHZvaWQgKigqKSAoKSkgb2JzdGFja19jaHVua19hbGxvYywgKHZvaWQgKCopICgpKSBvYnN0YWNrX2NodW5rX2ZyZWUpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmVnaW4oaCwgc2l6ZSkgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAoc2l6ZSksIDAsIFwKLQkJICAodm9pZCAqKCopICgpKSBvYnN0YWNrX2NodW5rX2FsbG9jLCAodm9pZCAoKikgKCkpIG9ic3RhY2tfY2h1bmtfZnJlZSkKLQotIyBkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb24oaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1bikgXAotICBfb2JzdGFja19iZWdpbiAoKGgpLCAoc2l6ZSksIChhbGlnbm1lbnQpLCBcCi0JCSAgICAodm9pZCAqKCopICgpKSAoY2h1bmtmdW4pLCAodm9pZCAoKikgKCkpIChmcmVlZnVuKSkKLQotIyBkZWZpbmUgb2JzdGFja19zcGVjaWZ5X2FsbG9jYXRpb25fd2l0aF9hcmcoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKSBcCi0gIF9vYnN0YWNrX2JlZ2luXzEgKChoKSwgKHNpemUpLCAoYWxpZ25tZW50KSwgXAotCQkgICAgKHZvaWQgKigqKSAoKSkgKGNodW5rZnVuKSwgKHZvaWQgKCopICgpKSAoZnJlZWZ1biksIChhcmcpKQotCi0jIGRlZmluZSBvYnN0YWNrX2NodW5rZnVuKGgsIG5ld2NodW5rZnVuKSBcCi0gICgoaCkgLT4gY2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikoKSkgKG5ld2NodW5rZnVuKSkKLQotIyBkZWZpbmUgb2JzdGFja19mcmVlZnVuKGgsIG5ld2ZyZWVmdW4pIFwKLSAgKChoKSAtPiBmcmVlZnVuID0gKHZvaWQgKCopKCkpIChuZXdmcmVlZnVuKSkKLQotI2VuZGlmCi0KLSNkZWZpbmUgb2JzdGFja18xZ3Jvd19mYXN0KGgsYWNoYXIpICgqKChoKS0+bmV4dF9mcmVlKSsrID0gYWNoYXIpCi0KLSNkZWZpbmUgb2JzdGFja19ibGFua19mYXN0KGgsbikgKChoKS0+bmV4dF9mcmVlICs9IChuKSkKLQotI2RlZmluZSBvYnN0YWNrX21lbW9yeV91c2VkKGgpIF9vYnN0YWNrX21lbW9yeV91c2VkIChoKQotDAotI2lmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotLyogTmV4dFN0ZXAgMi4wIGNjIGlzIHJlYWxseSBnY2MgMS45MyBidXQgaXQgZGVmaW5lcyBfX0dOVUNfXyA9IDIgYW5kCi0gICBkb2VzIG5vdCBpbXBsZW1lbnQgX19leHRlbnNpb25fXy4gIEJ1dCB0aGF0IGNvbXBpbGVyIGRvZXNuJ3QgZGVmaW5lCi0gICBfX0dOVUNfTUlOT1JfXy4gICovCi0jIGlmIF9fR05VQ19fIDwgMiB8fCAoX19OZVhUX18gJiYgIV9fR05VQ19NSU5PUl9fKQotIyAgZGVmaW5lIF9fZXh0ZW5zaW9uX18KLSMgZW5kaWYKLQotLyogRm9yIEdOVSBDLCBpZiBub3QgLXRyYWRpdGlvbmFsLAotICAgd2UgY2FuIGRlZmluZSB0aGVzZSBtYWNyb3MgdG8gY29tcHV0ZSBhbGwgYXJncyBvbmx5IG9uY2UKLSAgIHdpdGhvdXQgdXNpbmcgYSBnbG9iYWwgdmFyaWFibGUuCi0gICBBbHNvLCB3ZSBjYW4gYXZvaWQgdXNpbmcgdGhlIGB0ZW1wJyBzbG90LCB0byBtYWtlIGZhc3RlciBjb2RlLiAgKi8KLQotIyBkZWZpbmUgb2JzdGFja19vYmplY3Rfc2l6ZShPQlNUQUNLKQkJCQkJXAotICBfX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0gICh7IHN0cnVjdCBvYnN0YWNrICpfX28gPSAoT0JTVEFDSyk7CQkJCQlcCi0gICAgICh1bnNpZ25lZCkgKF9fby0+bmV4dF9mcmVlIC0gX19vLT5vYmplY3RfYmFzZSk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfcm9vbShPQlNUQUNLKQkJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgICAodW5zaWduZWQpIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUpOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX21ha2Vfcm9vbShPQlNUQUNLLGxlbmd0aCkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKLSAgIGlmIChfX28tPmNodW5rX2xpbWl0IC0gX19vLT5uZXh0X2ZyZWUgPCBfX2xlbikJCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2VtcHR5X3AoT0JTVEFDSykJCQkJCVwKLSAgX19leHRlbnNpb25fXwkJCQkJCQkJXAotICAoeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgICAoX19vLT5jaHVuay0+cHJldiA9PSAwICYmIF9fby0+bmV4dF9mcmVlIC0gX19vLT5jaHVuay0+Y29udGVudHMgPT0gMCk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfZ3JvdyhPQlNUQUNLLHdoZXJlLGxlbmd0aCkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGludCBfX2xlbiA9IChsZW5ndGgpOwkJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIF9fbGVuID4gX19vLT5jaHVua19saW1pdCkJCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuKTsJCQkJCVwKLSAgIF9vYnN0YWNrX21lbWNweSAoX19vLT5uZXh0X2ZyZWUsIChjaGFyICopICh3aGVyZSksIF9fbGVuKTsJCVwKLSAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2dyb3cwKE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAotICAgaWYgKF9fby0+bmV4dF9mcmVlICsgX19sZW4gKyAxID4gX19vLT5jaHVua19saW1pdCkJCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIF9fbGVuICsgMSk7CQkJCVwKLSAgIF9vYnN0YWNrX21lbWNweSAoX19vLT5uZXh0X2ZyZWUsIChjaGFyICopICh3aGVyZSksIF9fbGVuKTsJCVwKLSAgIF9fby0+bmV4dF9mcmVlICs9IF9fbGVuOwkJCQkJCVwKLSAgICooX19vLT5uZXh0X2ZyZWUpKysgPSAwOwkJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrXzFncm93KE9CU1RBQ0ssZGF0dW0pCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaWYgKF9fby0+bmV4dF9mcmVlICsgMSA+IF9fby0+Y2h1bmtfbGltaXQpCQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgMSk7CQkJCQlcCi0gICAqKF9fby0+bmV4dF9mcmVlKSsrID0gKGRhdHVtKTsJCQkJCVwKLSAgICh2b2lkKSAwOyB9KQotCi0vKiBUaGVzZSBhc3N1bWUgdGhhdCB0aGUgb2JzdGFjayBhbGlnbm1lbnQgaXMgZ29vZCBlbm91Z2ggZm9yIHBvaW50ZXJzIG9yIGludHMsCi0gICBhbmQgdGhhdCB0aGUgZGF0YSBhZGRlZCBzbyBmYXIgdG8gdGhlIGN1cnJlbnQgb2JqZWN0Ci0gICBzaGFyZXMgdGhhdCBtdWNoIGFsaWdubWVudC4gICovCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAodm9pZCAqKSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAodm9pZCAqKSk7CQkJCVwKLSAgICooKHZvaWQgKiopX19vLT5uZXh0X2ZyZWUpKysgPSAoKHZvaWQgKilkYXR1bSk7CQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfaW50X2dyb3coT0JTVEFDSyxkYXR1bSkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIGlmIChfX28tPm5leHRfZnJlZSArIHNpemVvZiAoaW50KSA+IF9fby0+Y2h1bmtfbGltaXQpCQlcCi0gICAgIF9vYnN0YWNrX25ld2NodW5rIChfX28sIHNpemVvZiAoaW50KSk7CQkJCVwKLSAgICooKGludCAqKV9fby0+bmV4dF9mcmVlKSsrID0gKChpbnQpZGF0dW0pOwkJCQlcCi0gICAodm9pZCkgMDsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19wdHJfZ3Jvd19mYXN0KGgsYXB0cikgKCooKHZvaWQgKiopIChoKS0+bmV4dF9mcmVlKSsrID0gKHZvaWQgKilhcHRyKQotIyBkZWZpbmUgb2JzdGFja19pbnRfZ3Jvd19mYXN0KGgsYWludCkgKCooKGludCAqKSAoaCktPm5leHRfZnJlZSkrKyA9IChpbnQpIGFpbnQpCi0KLSMgZGVmaW5lIG9ic3RhY2tfYmxhbmsoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vID0gKE9CU1RBQ0spOwkJCQkJXAotICAgaW50IF9fbGVuID0gKGxlbmd0aCk7CQkJCQkJXAotICAgaWYgKF9fby0+Y2h1bmtfbGltaXQgLSBfX28tPm5leHRfZnJlZSA8IF9fbGVuKQkJCVwKLSAgICAgX29ic3RhY2tfbmV3Y2h1bmsgKF9fbywgX19sZW4pOwkJCQkJXAotICAgX19vLT5uZXh0X2ZyZWUgKz0gX19sZW47CQkJCQkJXAotICAgKHZvaWQpIDA7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfYWxsb2MoT0JTVEFDSyxsZW5ndGgpCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ibGFuayAoX19oLCAobGVuZ3RoKSk7CQkJCQlcCi0gICBvYnN0YWNrX2ZpbmlzaCAoX19oKTsgfSkKLQotIyBkZWZpbmUgb2JzdGFja19jb3B5KE9CU1RBQ0ssd2hlcmUsbGVuZ3RoKQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19oID0gKE9CU1RBQ0spOwkJCQkJXAotICAgb2JzdGFja19ncm93IChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weTAoT0JTVEFDSyx3aGVyZSxsZW5ndGgpCQkJCVwKLV9fZXh0ZW5zaW9uX18JCQkJCQkJCVwKLSh7IHN0cnVjdCBvYnN0YWNrICpfX2ggPSAoT0JTVEFDSyk7CQkJCQlcCi0gICBvYnN0YWNrX2dyb3cwIChfX2gsICh3aGVyZSksIChsZW5ndGgpKTsJCQkJXAotICAgb2JzdGFja19maW5pc2ggKF9faCk7IH0pCi0KLS8qIFRoZSBsb2NhbCB2YXJpYWJsZSBpcyBuYW1lZCBfX28xIHRvIGF2b2lkIGEgbmFtZSBjb25mbGljdAotICAgd2hlbiBvYnN0YWNrX2JsYW5rIGlzIGNhbGxlZC4gICovCi0jIGRlZmluZSBvYnN0YWNrX2ZpbmlzaChPQlNUQUNLKSAgCQkJCQlcCi1fX2V4dGVuc2lvbl9fCQkJCQkJCQlcCi0oeyBzdHJ1Y3Qgb2JzdGFjayAqX19vMSA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIHZvaWQgKnZhbHVlOwkJCQkJCQkJXAotICAgdmFsdWUgPSAodm9pZCAqKSBfX28xLT5vYmplY3RfYmFzZTsJCQkJCVwKLSAgIGlmIChfX28xLT5uZXh0X2ZyZWUgPT0gdmFsdWUpCQkJCQlcCi0gICAgIF9fbzEtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7CQkJCQlcCi0gICBfX28xLT5uZXh0X2ZyZWUJCQkJCQkJXAotICAgICA9IF9fSU5UX1RPX1BUUiAoKF9fUFRSX1RPX0lOVCAoX19vMS0+bmV4dF9mcmVlKStfX28xLT5hbGlnbm1lbnRfbWFzaylcCi0JCSAgICAgJiB+IChfX28xLT5hbGlnbm1lbnRfbWFzaykpOwkJCVwKLSAgIGlmIChfX28xLT5uZXh0X2ZyZWUgLSAoY2hhciAqKV9fbzEtPmNodW5rCQkJCVwKLSAgICAgICA+IF9fbzEtPmNodW5rX2xpbWl0IC0gKGNoYXIgKilfX28xLT5jaHVuaykJCQlcCi0gICAgIF9fbzEtPm5leHRfZnJlZSA9IF9fbzEtPmNodW5rX2xpbWl0OwkJCQlcCi0gICBfX28xLT5vYmplY3RfYmFzZSA9IF9fbzEtPm5leHRfZnJlZTsJCQkJCVwKLSAgIHZhbHVlOyB9KQotCi0jIGRlZmluZSBvYnN0YWNrX2ZyZWUoT0JTVEFDSywgT0JKKQkJCQkJXAotX19leHRlbnNpb25fXwkJCQkJCQkJXAotKHsgc3RydWN0IG9ic3RhY2sgKl9fbyA9IChPQlNUQUNLKTsJCQkJCVwKLSAgIHZvaWQgKl9fb2JqID0gKE9CSik7CQkJCQkJCVwKLSAgIGlmIChfX29iaiA+ICh2b2lkICopX19vLT5jaHVuayAmJiBfX29iaiA8ICh2b2lkICopX19vLT5jaHVua19saW1pdCkgIFwKLSAgICAgX19vLT5uZXh0X2ZyZWUgPSBfX28tPm9iamVjdF9iYXNlID0gX19vYmo7CQkJCVwKLSAgIGVsc2UgKG9ic3RhY2tfZnJlZSkgKF9fbywgX19vYmopOyB9KQotDAotI2Vsc2UgLyogbm90IF9fR05VQ19fIG9yIG5vdCBfX1NURENfXyAqLwotCi0jIGRlZmluZSBvYnN0YWNrX29iamVjdF9zaXplKGgpIFwKLSAodW5zaWduZWQpICgoaCktPm5leHRfZnJlZSAtIChoKS0+b2JqZWN0X2Jhc2UpCi0KLSMgZGVmaW5lIG9ic3RhY2tfcm9vbShoKQkJXAotICh1bnNpZ25lZCkgKChoKS0+Y2h1bmtfbGltaXQgLSAoaCktPm5leHRfZnJlZSkKLQotIyBkZWZpbmUgb2JzdGFja19lbXB0eV9wKGgpIFwKLSAoKGgpLT5jaHVuay0+cHJldiA9PSAwICYmIChoKS0+bmV4dF9mcmVlIC0gKGgpLT5jaHVuay0+Y29udGVudHMgPT0gMCkKLQotLyogTm90ZSB0aGF0IHRoZSBjYWxsIHRvIF9vYnN0YWNrX25ld2NodW5rIGlzIGVuY2xvc2VkIGluICguLi4sIDApCi0gICBzbyB0aGF0IHdlIGNhbiBhdm9pZCBoYXZpbmcgdm9pZCBleHByZXNzaW9ucwotICAgaW4gdGhlIGFybXMgb2YgdGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi0gICBDYXN0aW5nIHRoZSB0aGlyZCBvcGVyYW5kIHRvIHZvaWQgd2FzIHRyaWVkIGJlZm9yZSwKLSAgIGJ1dCBzb21lIGNvbXBpbGVycyB3b24ndCBhY2NlcHQgaXQuICAqLwotCi0jIGRlZmluZSBvYnN0YWNrX21ha2Vfcm9vbShoLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPm5leHRfZnJlZSArIChoKS0+dGVtcCA+IChoKS0+Y2h1bmtfbGltaXQpCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wKSwgMCkgOiAwKSkKLQotIyBkZWZpbmUgb2JzdGFja19ncm93KGgsd2hlcmUsbGVuZ3RoKQkJCQkJXAotKCAoaCktPnRlbXAgPSAobGVuZ3RoKSwJCQkJCQkJXAotICAoKChoKS0+bmV4dF9mcmVlICsgKGgpLT50ZW1wID4gKGgpLT5jaHVua19saW1pdCkJCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXApLCAwKSA6IDApLAkJCVwKLSAgX29ic3RhY2tfbWVtY3B5ICgoaCktPm5leHRfZnJlZSwgKGNoYXIgKikgKHdoZXJlKSwgKGgpLT50ZW1wKSwJXAotICAoaCktPm5leHRfZnJlZSArPSAoaCktPnRlbXApCi0KLSMgZGVmaW5lIG9ic3RhY2tfZ3JvdzAoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCi0oIChoKS0+dGVtcCA9IChsZW5ndGgpLAkJCQkJCQlcCi0gICgoKGgpLT5uZXh0X2ZyZWUgKyAoaCktPnRlbXAgKyAxID4gKGgpLT5jaHVua19saW1pdCkJCQlcCi0gICA/IChfb2JzdGFja19uZXdjaHVuayAoKGgpLCAoaCktPnRlbXAgKyAxKSwgMCkgOiAwKSwJCQlcCi0gIF9vYnN0YWNrX21lbWNweSAoKGgpLT5uZXh0X2ZyZWUsIChjaGFyICopICh3aGVyZSksIChoKS0+dGVtcCksCVwKLSAgKGgpLT5uZXh0X2ZyZWUgKz0gKGgpLT50ZW1wLAkJCQkJCVwKLSAgKigoaCktPm5leHRfZnJlZSkrKyA9IDApCi0KLSMgZGVmaW5lIG9ic3RhY2tfMWdyb3coaCxkYXR1bSkJCQkJCQlcCi0oICgoKGgpLT5uZXh0X2ZyZWUgKyAxID4gKGgpLT5jaHVua19saW1pdCkJCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgMSksIDApIDogMCksCQkJCVwKLSAgKCooKGgpLT5uZXh0X2ZyZWUpKysgPSAoZGF0dW0pKSkKLQotIyBkZWZpbmUgb2JzdGFja19wdHJfZ3JvdyhoLGRhdHVtKQkJCQkJXAotKCAoKChoKS0+bmV4dF9mcmVlICsgc2l6ZW9mIChjaGFyICopID4gKGgpLT5jaHVua19saW1pdCkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIHNpemVvZiAoY2hhciAqKSksIDApIDogMCksCQlcCi0gICgqKChjaGFyICoqKSAoKChoKS0+bmV4dF9mcmVlKz1zaXplb2YoY2hhciAqKSktc2l6ZW9mKGNoYXIgKikpKSA9ICgoY2hhciAqKSBkYXR1bSkpKQotCi0jIGRlZmluZSBvYnN0YWNrX2ludF9ncm93KGgsZGF0dW0pCQkJCQlcCi0oICgoKGgpLT5uZXh0X2ZyZWUgKyBzaXplb2YgKGludCkgPiAoaCktPmNodW5rX2xpbWl0KQkJCVwKLSAgID8gKF9vYnN0YWNrX25ld2NodW5rICgoaCksIHNpemVvZiAoaW50KSksIDApIDogMCksCQkJXAotICAoKigoaW50ICopICgoKGgpLT5uZXh0X2ZyZWUrPXNpemVvZihpbnQpKS1zaXplb2YoaW50KSkpID0gKChpbnQpIGRhdHVtKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfcHRyX2dyb3dfZmFzdChoLGFwdHIpICgqKChjaGFyICoqKSAoaCktPm5leHRfZnJlZSkrKyA9IChjaGFyICopIGFwdHIpCi0jIGRlZmluZSBvYnN0YWNrX2ludF9ncm93X2Zhc3QoaCxhaW50KSAoKigoaW50ICopIChoKS0+bmV4dF9mcmVlKSsrID0gKGludCkgYWludCkKLQotIyBkZWZpbmUgb2JzdGFja19ibGFuayhoLGxlbmd0aCkJCQkJCVwKLSggKGgpLT50ZW1wID0gKGxlbmd0aCksCQkJCQkJCVwKLSAgKCgoaCktPmNodW5rX2xpbWl0IC0gKGgpLT5uZXh0X2ZyZWUgPCAoaCktPnRlbXApCQkJXAotICAgPyAoX29ic3RhY2tfbmV3Y2h1bmsgKChoKSwgKGgpLT50ZW1wKSwgMCkgOiAwKSwJCQlcCi0gICgoaCktPm5leHRfZnJlZSArPSAoaCktPnRlbXApKQotCi0jIGRlZmluZSBvYnN0YWNrX2FsbG9jKGgsbGVuZ3RoKQkJCQkJXAotIChvYnN0YWNrX2JsYW5rICgoaCksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weShoLHdoZXJlLGxlbmd0aCkJCQkJCVwKLSAob2JzdGFja19ncm93ICgoaCksICh3aGVyZSksIChsZW5ndGgpKSwgb2JzdGFja19maW5pc2ggKChoKSkpCi0KLSMgZGVmaW5lIG9ic3RhY2tfY29weTAoaCx3aGVyZSxsZW5ndGgpCQkJCQlcCi0gKG9ic3RhY2tfZ3JvdzAgKChoKSwgKHdoZXJlKSwgKGxlbmd0aCkpLCBvYnN0YWNrX2ZpbmlzaCAoKGgpKSkKLQotIyBkZWZpbmUgb2JzdGFja19maW5pc2goaCkgIAkJCQkJCVwKLSggKChoKS0+bmV4dF9mcmVlID09IChoKS0+b2JqZWN0X2Jhc2UJCQkJCVwKLSAgID8gKCgoaCktPm1heWJlX2VtcHR5X29iamVjdCA9IDEpLCAwKQkJCQkJXAotICAgOiAwKSwJCQkJCQkJCVwKLSAgKGgpLT50ZW1wID0gX19QVFJfVE9fSU5UICgoaCktPm9iamVjdF9iYXNlKSwJCQkJXAotICAoaCktPm5leHRfZnJlZQkJCQkJCQlcCi0gICAgPSBfX0lOVF9UT19QVFIgKChfX1BUUl9UT19JTlQgKChoKS0+bmV4dF9mcmVlKSsoaCktPmFsaWdubWVudF9tYXNrKQlcCi0JCSAgICAmIH4gKChoKS0+YWxpZ25tZW50X21hc2spKSwJCQkJXAotICAoKChoKS0+bmV4dF9mcmVlIC0gKGNoYXIgKikgKGgpLT5jaHVuawkJCQlcCi0gICAgPiAoaCktPmNodW5rX2xpbWl0IC0gKGNoYXIgKikgKGgpLT5jaHVuaykJCQkJXAotICAgPyAoKGgpLT5uZXh0X2ZyZWUgPSAoaCktPmNodW5rX2xpbWl0KSA6IDApLAkJCQlcCi0gIChoKS0+b2JqZWN0X2Jhc2UgPSAoaCktPm5leHRfZnJlZSwJCQkJCVwKLSAgX19JTlRfVE9fUFRSICgoaCktPnRlbXApKQotCi0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSMgIGRlZmluZSBvYnN0YWNrX2ZyZWUoaCxvYmopCQkJCQkJXAotKCAoaCktPnRlbXAgPSAoY2hhciAqKSAob2JqKSAtIChjaGFyICopIChoKS0+Y2h1bmssCQkJXAotICAoKChoKS0+dGVtcCA+IDAgJiYgKGgpLT50ZW1wIDwgKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspXAotICAgPyAoaW50KSAoKGgpLT5uZXh0X2ZyZWUgPSAoaCktPm9iamVjdF9iYXNlCQkJCVwKLQkgICAgPSAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKQkJCQlcCi0gICA6ICgoKG9ic3RhY2tfZnJlZSkgKChoKSwgKGgpLT50ZW1wICsgKGNoYXIgKikgKGgpLT5jaHVuayksIDApLCAwKSkpCi0jIGVsc2UKLSMgIGRlZmluZSBvYnN0YWNrX2ZyZWUoaCxvYmopCQkJCQkJXAotKCAoaCktPnRlbXAgPSAoY2hhciAqKSAob2JqKSAtIChjaGFyICopIChoKS0+Y2h1bmssCQkJXAotICAoKChoKS0+dGVtcCA+IDAgJiYgKGgpLT50ZW1wIDwgKGgpLT5jaHVua19saW1pdCAtIChjaGFyICopIChoKS0+Y2h1bmspXAotICAgPyAoaW50KSAoKGgpLT5uZXh0X2ZyZWUgPSAoaCktPm9iamVjdF9iYXNlCQkJCVwKLQkgICAgPSAoaCktPnRlbXAgKyAoY2hhciAqKSAoaCktPmNodW5rKQkJCQlcCi0gICA6IChfb2JzdGFja19mcmVlICgoaCksIChoKS0+dGVtcCArIChjaGFyICopIChoKS0+Y2h1bmspLCAwKSkpCi0jIGVuZGlmCi0KLSNlbmRpZiAvKiBub3QgX19HTlVDX18gb3Igbm90IF9fU1REQ19fICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQkvKiBDKysgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogb2JzdGFjay5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cgYi9pbmNsdWRlL29wY29kZS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZDM3NTMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTkyNCArMCwwIEBACi1GcmkgSnVuIDI1IDA0OjIyOjA0IDE5OTkgIEplcnJ5IFF1aW5uIDxqcXVpbm5Abm9ydGVsbmV0d29ya3MuY29tPgotCQkJICBKZWZmIExhdyA8bGF3QGN5Z251cy5jb20+Ci0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBwYTIuMCBjbHJidHMgaW5zdHJ1Y3Rpb24uCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBlbnRyaWVzIGZvciBtZmlhIGFuZCBtdHNhcmNtIGluc3RydWN0aW9ucy4KLQotMTk5OS0wNi0yMyAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2Lmg6IEFsbG93IGBsJyBzdWZmaXggb24gYnN3YXAuICBBbGxvdyBgdycgc3VmZml4IG9uIGFycGwsCi0JbGxkdCwgbG1zdywgbHRyLCBzdHIsIHZlcnIsIHZlcncuICBBZGQgRlAgZmxhZyB0byBmY21vdiouICBBZGQgRlAKLQlmbGFnIHRvIGZjb21pIGFuZCBmcmllbmRzLgotCi1GcmkgTWF5IDI4IDE1OjI2OjExIDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogTW92ZSBpbnRlZ2VyIGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zIGFmdGVyCi0JaW50ZWdlciBsb2dpY2FsIGluc3RydWN0aW9ucy4gIAotCi0xOTk5LTA1LTI4ICBMaW51cyBOb3JkYmVyZyAgPGxpbnVzLm5vcmRiZXJnQGNhbml0LnNlPgotCi0JKiBtNjhrLmg6IERvY3VtZW50IG5ldyBmb3JtYXRzIGBFJywgYEcnLCBgSCcgYW5kIG5ldyBwbGFjZXMgYE4nLAotCWBuJywgYG8nLgotCi0JKiBtNjhrLmg6IERlZmluZSBtY2Y1MjA2ZSwgbWNmNTMwNywgbWNmLiAgRG9jdW1lbnQgbmV3IGZvcm1hdCBgdScKLQlhbmQgbmV3IHBsYWNlcyBgbScsIGBNJywgYGgnLgotCi1UaHUgTWF5IDI3IDA0OjEzOjU0IDE5OTkgIEpvZWwgU2hlcnJpbGwgKGpvZWxAT0FSY29ycC5jb20KLQotCSogaHBwYS5oIChwYV9vcGNvZGVzKTogQWRkIHNldmVyYWwgcHJvY2Vzc29yIHNwZWNpZmljIHN5c3RlbQotCWluc3RydWN0aW9ucy4KLQotV2VkIE1heSAyNiAxNjo1Nzo0NCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAocGFfb3Bjb2Rlcyk6IEFkZCBzZWNvbmQgZW50cnkgZm9yICJjb21iIiwgImNvbWliIiwgCi0JImFkZGIiLCBhbmQgImFkZGliIiB0byBiZSB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQGFwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChSZXZlcnNlTW9kcm0pOiBSZW1vdmUgYWxsIG9jY3VyZW5jZXMuCi0JKEludk1lbSk6IEFkZCB0byBjb250cm9sL2RlYnVnL3Rlc3QgbW92IGluc25zLCBtb3ZobHBzLCBtb3ZsaHBzLAotCW1vdm1za3BzLCBwZXh0cncsIHBtb3Ztc2tiLCBtYXNrbW92cS4KLQlDaGFuZ2UgTm9TdWYgdG8gRlAgb24gYWxsIE1NWCwgWE1NIGFuZCBBTUQgaW5zbnMgYXMgdGhlc2UgYWxsCi0JaWdub3JlIHRoZSBkYXRhIHNpemUgcHJlZml4LgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIsIGkzODZfcmVndGFiKTogQWRkIHN1cHBvcnQgZm9yIFBJSUkgU0lNRC4KLQlNb3N0bHkgc3RvbGVuIGZyb20gRG91ZyBMZWRmb3JkIDxkbGVkZm9yZEByZWRoYXQuY29tPgotCi1TYXQgTWF5ICA4IDIzOjI3OjM1IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHBwYy5oIChQUENfT1BDT0RFXzY0X0JSSURHRSk6IE5ldy4KLQotMTk5OS0wNC0xNCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQVRUUik6IERlbGV0ZSBtZW1iZXIgbnVtX25vbmJvb2xzLgotCShDR0VOX0FUVFJfVFlQRSk6IFVwZGF0ZS4KLQkoQ0dFTl9BVFRSX01BU0spOiBOdW1iZXIgYm9vbGVhbnMgc3RhcnRpbmcgYXQgMC4KLQkoQ0dFTl9BVFRSX1ZBTFVFKTogVXBkYXRlLgotCShDR0VOX0lOU05fQVRUUik6IFVwZGF0ZS4KLQotTW9uIEFwciAxMiAyMzo0MzoyNyAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoZm1weWZhZGQsIGZtcHluZmFkZCwgZm5lZywgZm5lZ2Ficyk6IE5ldyBQQTIuMAotCWluc3RydWN0aW9ucy4KLQotVHVlIE1hciAyMyAxMToyNDozOCAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoYmIsIGJ2Yik6IFR3ZWFrIG9wY29kZS9tYXNrLgotCi0KLTE5OTktMDMtMjIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lTQSxDR0VOX01BQ0gpOiBOZXcgdHlwZWRlZnMuCi0JKHN0cnVjdCBjZ2VuX2NwdV9kZXNjKTogUmVuYW1lIG1lbWJlciBtYWNoIHRvIG1hY2hzLiAgTmV3IG1lbWJlciBpc2FzLgotCU5ldyBtZW1iZXJzIHdvcmRfYml0c2l6ZSxkZWZhdWx0X2luc25fYml0c2l6ZSxiYXNlX2luc24tYml0c2l6ZSwKLQltaW5faW5zbl9iaXRzaXplLG1heF9pbnNuX2JpdHNpemUsaXNhX3RhYmxlLG1hY2hfdGFibGUscmVidWlsZF90YWJsZXMuCi0JRGVsZXRlIG1lbWJlciBtYXhfaW5zbl9zaXplLgotCShlbnVtIGNnZW5fY3B1X29wZW5fYXJnKTogTmV3IGVudW0uCi0JKGNwdV9vcGVuKTogVXBkYXRlIHByb3RvdHlwZS4KLQkoY3B1X29wZW5fMSk6IERlY2xhcmUuCi0JKGNnZW5fc2V0X2NwdSk6IERlbGV0ZS4KLQotMTk5OS0wMy0xMSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fSFdfVEFCTEUpOiBEZWxldGUgYG51bV9pbml0X2VudHJpZXMnIG1lbWJlci4KLQkoQ0dFTl9PUEVSQU5EX05JTCk6IE5ldyBtYWNyby4KLQkoQ0dFTl9PUEVSQU5EKTogTmV3IG1lbWJlciBgdHlwZScuCi0JKEBhcmNoQF9jZ2VuX29wZXJhbmRfdGFibGUpOiBEZWxldGUgZGVjbC4KLQkoQ0dFTl9PUEVSQU5EX0lOREVYLENHRU5fT1BFUkFORF9UWVBFLENHRU5fT1BFUkFORF9FTlRSWSk6IERlbGV0ZS4KLQkoQ0dFTl9PUEVSQU5EX1RBQkxFKTogTmV3IHN0cnVjdC4KLQkoY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9uYW1lLGNnZW5fb3BlcmFuZF9sb29rdXBfYnlfbnVtKTogRGVjbGFyZS4KLQkoQ0dFTl9PUElOU1QpOiBQb2ludGVyIHRvIG9wZXJhbmQgdGFibGUgZW50cnkgcmVwbGFjZWQgd2l0aCBlbnVtLgotCShDR0VOX0NQVV9UQUJMRSk6IE5ldyBtZW1iZXIgYGlzYScuICBDaGFuZ2UgbWVtYmVyIGBvcGVyYW5kX3RhYmxlJywKLQlub3cgYSBDR0VOX09QRVJBTkRfVEFCTEUuICBBZGQgQ0dFTl9DUFVfREVTQyBhcmcgdG8KLQl7Z2V0LHNldH1fe2ludCx2bWF9X29wZXJhbmQuCi0JKEBhcmNoQF9jZ2VuX2NwdV9vcGVuKTogTmV3IGFyZyBgaXNhJy4KLQkoY2dlbl9zZXRfY3B1KTogRGl0dG8uCi0KLUZyaSBGZWIgMjYgMDI6MzY6NDUgMTk5OSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBGaWxsIGluIGNtb3YgYW5kIGZjbW92IGFsdGVybmF0ZXMuICBBZGQgZmNvbWkgc2hvcnQgZm9ybXMuCi0KLTE5OTktMDItMjUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChlbnVtIGNnZW5fYXNtX3R5cGUpOiBBZGQgQ0dFTl9BU01fTk9ORS4KLQkoQ0dFTl9IV19FTlRSWSk6IERlbGV0ZSBtZW1iZXIgYG5leHQnLiAgQ2hhbmdlIHR5cGUgb2YgYHR5cGUnIHRvCi0JZW51bSBjZ2VuX2h3X3R5cGUuCi0JKENHRU5fSFdfVEFCTEUpOiBOZXcgc3RydWN0LgotCShod190YWJsZSk6IERlbGV0ZSBkZWNsYXJhdGlvbi4KLQkoQ0dFTl9PUEVSQU5EKTogQ2hhbmdlIG1lbWJlciBodyB0byBod190eXBlLCBjaGFuZ2UgdHlwZSBmcm9tIHBvaW50ZXIKLQl0byB0YWJsZSBlbnRyeSB0byBlbnVtLgotCShDR0VOX09QSU5TVCk6IERpdHRvLgotCShDR0VOX0NQVV9UQUJMRSk6IENoYW5nZSBtZW1iZXIgaHdfbGlzdCB0byBod190YWJsZS4KLQotU2F0IEZlYiAxMyAxNDoxMzo0NCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS5oIChBWFBfT1BDT0RFX0VWNik6IE5ldy4KLQkoQVhQX09QQ09ERV9OT1BBTCk6IEluY2x1ZGUgaXQuCi0KLTE5OTktMDItMDkgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0NQVV9ERVNDKTogUmVuYW1lZCBmcm9tIENHRU5fT1BDT0RFX0RFU0MuCi0JQWxsIHVzZXMgdXBkYXRlZC4gIE5ldyBtZW1iZXJzIGludF9pbnNuX3AsIG1heF9pbnNuX3NpemUsCi0JcGFyc2Vfb3BlcmFuZCxpbnNlcnRfb3BlcmFuZCxleHRyYWN0X29wZXJhbmQscHJpbnRfb3BlcmFuZCwKLQlzaXplb2ZfZmllbGRzLHNldF9maWVsZHNfYml0c2l6ZSxnZXRfaW50X29wZXJhbmQsc2V0X2ludF9vcGVyYW5kLAotCWdldF92bWFfb3BlcmFuZCxzZXRfdm1hX29wZXJhbmQscGFyc2VfaGFuZGxlcnMsaW5zZXJ0X2hhbmRsZXJzLAotCWV4dHJhY3RfaGFuZGxlcnMscHJpbnRfaGFuZGxlcnMuCi0JKENHRU5fQVRUUik6IENoYW5nZSB0eXBlIG9mIG51bV9ub25ib29scyB0byB1bnNpZ25lZCBpbnQuCi0JKENHRU5fQVRUUl9CT09MX09GRlNFVCk6IE5ldyBtYWNyby4KLQkoQ0dFTl9BVFRSX01BU0spOiBTdWJ0cmFjdCBpdCB0byBjb21wdXRlIGJpdCBudW1iZXIuCi0JKENHRU5fQVRUUl9WQUxVRSk6IFJlZG8gYm9vbC9ub25ib29sIGF0dHIgY2FsY3VsYXRpb24uCi0JKGNnZW5fb3Bjb2RlX2hhbmRsZXIpOiBSZW5hbWVkIGZyb20gY2dlbl9iYXNlLgotCShDR0VOX0hXX0FUVFJfVkFMVUUpOiBSZW5hbWVkIGZyb20gQ0dFTl9IV19BVFRSLCBhbGwgdXNlcyB1cGRhdGVkLgotCShDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSk6IFJlbmFtZWQgZnJvbSBDR0VOX09QRVJBTkRfQVRUUiwKLQlhbGwgdXNlcyB1cGRhdGVkLgotCShDR0VOX09QRVJBTkRfSU5ERVgpOiBSZXdyaXRlIHRvIHVzZSB0YWJsZSBlbnRyeSwgbm90IGdsb2JhbC4KLQkoZW51bSBjZ2VuX29waW5zdF90eXBlKTogUmVuYW1lZCBmcm9tIGNnZW5fb3BlcmFuZF9pbnN0YW5jZV90eXBlLgotCShDR0VOX0lGTERfQVRUUl9WQUxVRSk6IFJlbmFtZWQgZnJvbSBDR0VOX0lGTERfQVRUUiwgYWxsIHVzZXMgdXBkYXRlZC4KLQkoQ0dFTl9PUENPREUsQ0dFTl9JQkFTRSk6IE5ldyB0eXBlcy4KLQkoQ0dFTl9JTlNOKTogUmV3cml0ZS4KLQkoQ0dFTl97QVNNLERJU31fSEFTSCopOiBEZWxldGUuCi0JKGluaXRfb3Bjb2RlX3RhYmxlLGluaXRfaWJsZF90YWJsZSk6IERlY2xhcmUuCi0JKENHRU5fSU5TTl9BVFRSKTogTmV3IHR5cGUuCi0KLU1vbiBGZWIgIDEgMjE6MDk6MTQgMTk5OSAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0gCi0gICAgICAgICogaTM4Ni5oIChkX1N1ZiwgeF9TdWYsIHNsZF9TdWYsIHNsZHhfU3VmLCBid2xkX1N1Zik6ICBEZWZpbmUuCi0gICAgICAgICh4X0ZQLCBkX0ZQLCBkbHNfRlAsIHNsZHhfRlApOiAgRGVmaW5lLgotICAgICAgICBDaGFuZ2UgKlN1ZiBkZWZpbml0aW9ucyB0byBpbmNsdWRlIHggYW5kIGQgc3VmZml4ZXMuCi0gICAgICAgIChtb3ZzeCk6ICBVc2Ugd19TdWYgYW5kIGJfU3VmLgotICAgICAgICAobW92engpOiAgTGlrZXdpc2UuCi0gICAgICAgIChtb3ZzKTogIFVzZSBid2xkX1N1Zi4KLSAgICAgICAgKGZsZCk6ICBDaGFuZ2Ugb3JkZXJpbmcuICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZmlsZCk6ICBBZGQgSW50ZWwgU3ludGF4IGVxdWl2YWxlbnQgb2YgZmlsZHEuCi0gICAgICAgIChmc3QpOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZpc3QpOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZzdHApOiAgVXNlIHNsZF9GUC4gIEFkZCB4X0ZQIHZlcnNpb24uCi0gICAgICAgIChmaXN0cCk6ICBMTG9uZ01lbSB2ZXJzaW9uIGZvciBJbnRlbCBTeW50YXguCi0gICAgICAgIChmY29tLCBmY29tcCk6ICBVc2Ugc2xkX0ZQLgotICAgICAgICAoZmFkZCwgZmlhZGQsIGZzdWIpOiAgVXNlIHNsZF9GUC4KLSAgICAgICAgKGZzdWJyKTogIFVzZSBzbGRfRlAuCi0gICAgICAgIChmbXVsLCBmaW11bCwgZmR2aSwgZmlkaXYsIGZkaXZyKTogIFVzZSBzbGRfRlAuCi0KLTE5OTktMDEtMjcgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChlbnVtIGNnZW5fbW9kZSk6IEFkZCBDR0VOX01PREVfVEFSR0VUX01BWCwgQ0dFTl9NT0RFX0lOVCwKLQlDR0VOX01PREVfVUlOVC4KLQotU2F0IEphbiAxNiAwMToyOToyNSAxOTk5ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaCAoYnYpOiBGaXggbWFzay4KLQotMTk5OS0wMS0wNSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fQVRUUl9WQUxVRV9UWVBFKTogTmV3IHR5cGVkZWYuCi0JKENHRU5fQVRUUik6IFVzZSBpdC4KLQkoQ0dFTl9BVFRSX1RZUEUsQ0dFTl9BVFRSX0VOVFJZKTogRGl0dG8uCi0JKENHRU5fQVRUUl9UQUJMRSk6IE5ldyBtZW1iZXIgZGZhdWx0LgotCi0xOTk4LTEyLTMwICBHYXZpbiBSb21pZy1Lb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChNSVBTMTZfSU5TTl9CUkFOQ0gpOiBOZXcuCi0KLVdlZCBEZWMgIDkgMTA6Mzg6NDggMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGlzIHBhcnQgb2YgYSBjaGFuZ2UgbWFkZSBieSBFZGl0aCBFcHN0ZWluCi0gCTxlZXBzdGVpbkBzb3BoaWEuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gbWVyZ2UgaW4KLSAJY2hhbmdlcyBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGhwcGEuaCAoY29tcGxldGVyX2NoYXJzKTogbGlzdCBvZiBjaGFycyB0byBub3QgcHV0IGEgc3BhY2UKLSAJYWZ0ZXIuCi0KLVN1biBEZWMgIDYgMTM6MjE6MzQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LmggKGkzODZfb3B0YWIpOiBQZXJtaXQgdyBzdWZmaXggb24gcHJvY2Vzc29yIGNvbnRyb2wgYW5kCi0gCXN0YXR1cyB3b3JkIGluc3RydWN0aW9ucy4KLQotMTk5OC0xMS0zMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKHN0cnVjdCBjZ2VuX2h3X2VudHJ5KTogRGVsZXRlIGNvbnN0IG9uIGF0dHJzIG1lbWJlci4KLQkoc3RydWN0IGNnZW5fa2V5d29yZF9lbnRyeSk6IERpdHRvLgotCShzdHJ1Y3QgY2dlbl9vcGVyYW5kKTogRGl0dG8uCi0JKENHRU5fSUZMRCk6IE5ldyB0eXBlZGVmLCB3aXRoIGFzc29jaWF0ZWQgYWNjZXNzIG1hY3Jvcy4KLQkoQ0dFTl9JRk1UKTogTmV3IHR5cGVkZWYsIHdpdGggYXNzb2NpYXRlZCBhY2Nlc3MgbWFjcm9zLgotCShDR0VOX0lGTVQpOiBSZW5hbWVkIGZyb20gQ0dFTl9GT1JNQVQuICBOZXcgbWVtYmVyIGBpZmxkcycuCi0JKENHRU5fSVZBTFVFKTogTmV3IHR5cGVkZWYuCi0JKHN0cnVjdCBjZ2VuX2luc24pOiBEZWxldGUgY29uc3Qgb24gc3ludGF4LGF0dHJzIG1lbWJlcnMuCi0JYGZvcm1hdCcgbm93IHBvaW50cyB0byBmb3JtYXQgZGF0YS4gIFR5cGUgb2YgYHZhbHVlJyBpcyBub3cKLQlDR0VOX0lWQUxVRS4KLQkoc3RydWN0IGNnZW5fb3Bjb2RlX3RhYmxlKTogTmV3IG1lbWJlciBpZmxkX3RhYmxlLgotCi0xOTk4LTExLTE4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9leHRyYWN0X2ZuKTogVXBkYXRlIHR5cGUgb2YgYGJhc2VfaW5zbicgYXJnLgotCShDR0VOX09QRVJBTkRfSU5TVEFOQ0UpOiBOZXcgbWVtYmVyIGBhdHRycycuCi0JKENHRU5fT1BFUkFORF9JTlNUQU5DRV97QVRUUlMsQVRUUn0pOiBOZXcgbWFjcm9zLgotCShjZ2VuX2Rpc19sb29rdXBfaW5zbik6IFVwZGF0ZSB0eXBlIG9mIGBiYXNlX2luc24nIGFyZy4KLQkoY2dlbl9vcGNvZGVfdGFibGUpOiBVcGRhdGUgdHlwZSBvZiBkaXNfaGFzaCBmbi4KLQkoZXh0cmFjdF9vcGVyYW5kKTogVXBkYXRlIHR5cGUgb2YgYGluc25fdmFsdWUnIGFyZy4KLQotVGh1IE9jdCAyOSAxMTozODozNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fVkVSU0lPTl97TUFKT1IsTUlOT1IsRklYTEVWRUx9KTogRGVsZXRlLgotCi1UdWUgT2N0IDI3IDA4OjU3OjU5IDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmggKElOU05fTVVMVCk6IEFkZGVkLgotCi1UdWUgT2N0IDIwIDExOjMxOjM0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChNQVhfTU5FTV9TSVpFKTogUmVuYW1lIGZyb20gTUFYX09QQ09ERV9TSVpFLgotCi1Nb24gT2N0IDE5IDEyOjUwOjAwIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fSU5TTl9JTlQpOiBOZXcgdHlwZWRlZi4KLQkoQ0dFTl9JTlRfSU5TTl9QKTogUmVuYW1lZCBmcm9tIENHRU5fSU5UX0lOU04uCi0JKENHRU5fSU5TTl9CWVRFUyk6IFJlbmFtZWQgZnJvbSBjZ2VuX2luc25fdC4KLQkoQ0dFTl9JTlNOX0JZVEVTX1BUUik6IE5ldyB0eXBlZGVmLgotCShDR0VOX0VYVFJBQ1RfSU5GTyk6IE5ldyB0eXBlZGVmLgotCShjZ2VuX2luc2VydF9mbixjZ2VuX2V4dHJhY3RfZm4pOiBVcGRhdGUuCi0JKGNnZW5fb3Bjb2RlX3RhYmxlKTogTmV3IG1lbWJlciBgaW5zbl9lbmRpYW4nLgotCShhc3NlbWJsZV9pbnNuLGxvb2t1cF9pbnNuLGxvb2t1cF9nZXRfaW5zbl9vcGVyYW5kcyk6IFVwZGF0ZS4KLQkoaW5zZXJ0X29wZXJhbmQsZXh0cmFjdF9vcGVyYW5kKTogVXBkYXRlLgotCShjZ2VuX2dldF9pbnNuX3ZhbHVlLGNnZW5fcHV0X2luc25fdmFsdWUpOiBBZGQgcHJvdG90eXBlcy4KLQotRnJpIE9jdCAgOSAxMzozODoxMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0FUVFJfQk9PTFMpOiBOZXcgbWFjcm8uCi0JKHN0cnVjdCBDR0VOX0hXX0VOVFJZKTogTmV3IG1lbWJlciBgYXR0cnMnLgotCShDR0VOX0hXX0FUVFIpOiBOZXcgbWFjcm8uCi0JKHN0cnVjdCBDR0VOX09QRVJBTkRfSU5TVEFOQ0UpOiBOZXcgbWVtYmVyIGBuYW1lJy4KLQkoQ0dFTl9JTlNOX0lOVkFMSURfUCk6IE5ldyBtYWNyby4KLQotTW9uIE9jdCAgNSAwMDoyMTowNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogQWRkICJmaWQiLgotCQotU3VuIE9jdCAgNCAyMTowMDowMCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQlGcm9tIFJvYmVydCBBbmRyZXcgRGFsZSA8cm9iQG5iLm5ldD4KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFkZCBBTUQgM0ROb3chIGluc3RydWN0aW9ucy4KLQkoQU1EXzNETk9XX09QQ09ERSk6IERlZmluZS4KLQotVHVlIFNlcCAyMiAxNzo1Mzo0NyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKEVJVEhFUl9CVVRfUFJFRkVSX01VKTogRGVmaW5lLgotCi1Nb24gQXVnIDEwIDE0OjA5OjM4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoY2dlbl9pbnNuKTogI2lmIDAgb3V0IGVsZW1lbnQgYGNkeCcuCi0KLU1vbiBBdWcgIDMgMTI6MjE6NTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQlNb3ZlIGFsbCBnbG9iYWwgc3RhdGUgZGF0YSBpbnRvIG9wY29kZSB0YWJsZSBzdHJ1Y3QsIGFuZCB0cmVhdAotCW9wY29kZSB0YWJsZSBhcyBzb21ldGhpbmcgdGhhdCBpcyAib3BlbmVkL2Nsb3NlZCIuCi0JKiBjZ2VuLmggKENHRU5fT1BDT0RFX0RFU0MpOiBOZXcgdHlwZS4KLQkoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCi0JKGNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4pOiBBZGQgcHJvdG90eXBlLgotCShjZ2VuX2N1cnJlbnRfbWFjaGluZSxjZ2VuX2N1cnJlbnRfZW5kaWFuKTogRGVsZXRlLgotCShDR0VOX09QQ09ERV9UQUJMRSk6IE5ldyBtZW1iZXJzIG1hY2gsZW5kaWFuLG9wZXJhbmRfdGFibGUsCi0JcGFyc2Vfb3BlcmFuZF9mbixhc21faGFzaF90YWJsZSxhc21faGFzaF90YWJsZV9lbnRyaWVzLAotCWRpc19oYXNoX3RhYmxlLGRpc19oYXNoX3RhYmxlX2VudHJpZXMuCi0JKG9wY29kZV9vcGVuLG9wY29kZV9jbG9zZSk6IEFkZCBwcm90b3R5cGVzLgotCi0JKiBjZ2VuLmggKGNnZW5faW5zbik6IE5ldyBlbGVtZW50IGBjZHgnLgotCi1UaHUgSnVsIDMwIDIxOjQ0OjI1IDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaCAoRkxBR19MS1IpOiBOZXcgZmxhZyBmb3IgImxlZnQta2lsbHMtcmlnaHQiIGluc3RydWN0aW9ucy4KLQotVHVlIEp1bCAyOCAxMDo1OTowNyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaDogQWRkICJub19tYXRjaF9vcGVyYW5kcyIgZmllbGQgZm9yIGluc3RydWN0aW9ucy4KLQkoTU4xMDMwMF9NQVhfT1BFUkFORFMpOiBEZWZpbmUuCi0KLUZyaSBKdWwgMjQgMTE6NDQ6MjQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChjZ2VuX21hY3JvX2luc25fY291bnQpOiBEZWNsYXJlLgotCi1UdWUgSnVsIDIxIDEzOjEyOjEzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKENHRU5fVkVSU0lPTl97TUFKT1IsTUlOT1IsRklYTEVWRUx9KTogRGVmaW5lLgotCShjZ2VuX2luc2VydF9mbixjZ2VuX2V4dHJhY3RfZm4pOiBOZXcgYXJnIGBwYycuCi0JKGdldF9vcGVyYW5kLHB1dF9vcGVyYW5kKTogUmVwbGFjZWQgd2l0aCBnZXRfe2ludCx2bWF9X29wZXJhbmQsCi0Jc2V0X3tpbnQsdm1hfV9vcGVyYW5kLgotCi1GcmkgSnVuIDI2IDExOjA5OjA2IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oOiBBZGQgIm1hY2hpbmUiIGZpZWxkIGZvciBpbnN0cnVjdGlvbnMuCi0JKE1OMTAzLCBBTTMwKTogRGVmaW5lIG1hY2hpbmUgdHlwZXMuCi0JCi1GcmkgSnVuIDE5IDE2OjA5OjA5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBVc2UgRlAsIG5vdCBzbF9TdWYsIGZvciBmeHNhdmUgYW5kIGZ4cnN0b3IuCi0KLTE5OTgtMDYtMTggIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEFkZCBzdXBwb3J0IGZvciBmeHNhdmUsIGZ4cnN0b3IsIHN5c2VudGVyIGFuZCBzeXNleGl0LgotCi1TYXQgSnVuIDEzIDExOjMxOjM1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkIGdlbmVyYWwgZm9ybSBvZiBhYWQgYW5kIGFhbS4gIEFkZCB1ZDJhCi0JYW5kIHVkMmIuCi0JKGkzODZfcmVndGFiKTogQWxsb3cgY3IwLi43LCBkYjAuLjcsIGRyMC4uNywgdHIwLi43LCBub3QganVzdAotCXRob3NlIHRoYXQgaGFwcGVuIHRvIGJlIGltcGxlbWVudGVkIG9uIHBlbnRpdW1zLgotCi1UdWUgSnVuICA5IDEyOjE2OjAxIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBDaGFuZ2Ugb2NjdXJlbmNlcyBvZiBEYXRhMTYgdG8gU2l6ZTE2LCBEYXRhMzIgdG8gU2l6ZTMyLAotCUlnbm9yZURhdGFTaXplIHRvIElnbm9yZVNpemUuICBGbGFnIGFkZHJlc3MgYW5kIGRhdGEgc2l6ZSBwcmVmaXhlcwotCXdpdGggU2l6ZTE2fElnbm9yZVNpemUgb3IgU2l6ZTMyfElnbm9yZVNpemUuCi0KLU1vbiBKdW4gIDggMTI6MTU6NTIgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LmggKFJFUE5FKTogUmVuYW1lIHRvIFJFUE5FX1BSRUZJWF9PUENPREUuCi0JKFJFUEUpOiBSZW5hbWUgdG8gUkVQRV9QUkVGSVhfT1BDT0RFLgotCShpMzg2X3JlZ3RhYl9lbmQpOiBSZW1vdmUuCi0JKGkzODZfcHJlZml4dGFiLCBpMzg2X3ByZWZpeHRhYl9lbmQpOiBSZW1vdmUuCi0JKGkzODZfb3B0YWIpOiBVc2UgTlVMTCBhcyBzZW50aW5lbCByYXRoZXIgdGhhbiAiIiB0byBzdWl0IHJld3JpdGUKLQlvZiBtZF9iZWdpbi4KLQkoTUFYX09QQ09ERV9TSVpFKTogRGVmaW5lLgotCShpMzg2X29wdGFiX2VuZCk6IFJlbW92ZS4KLQkoc2xfU3VmKTogRGVmaW5lLgotCShzbF9GUCk6IFVzZSBzbF9TdWYuCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IEFsbG93IDE2IGJpdCBkaXNwbGFjZW1lbnQgZm9yIGBtb3YKLQltZW0sYWNjJy4gIENvbWJpbmUgMTYgYW5kIDMyIGJpdCBmb3JtcyBvZiB2YXJpb3VzIGluc25zLiAgQWxsb3cgMTYKLQliaXQgZm9ybSBvZiBsam1wLiAgQWRkIElzUHJlZml4IG1vZGlmaWVyIHRvIHByZWZpeGVzLiAgQWRkIGFkZHIzMiwKLQlkYXRhMzIsIGR3b3JkLCBhbmQgYWR3b3JkIHByZWZpeGVzLgotCShpMzg2X3JlZ3RhYik6IEFkZCBCYXNlSW5kZXggbW9kaWZpZXIgdG8gdmFsaWQgMTYgYml0IGJhc2UvaW5kZXgKLQlyZWdzLgotCi1GcmkgSnVuICA1IDIzOjQyOjQzIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X3JlZ3RhYik6IFJlbW92ZSBCYXNlSW5kZXggbW9kaWZpZXIgZnJvbSBlc3AuCi0KLQkqIGkzODYuaDogQWxsb3cgYGwnIHN1ZmZpeCBvbiBmbGQsIGZzdCwgZnN0cCwgZmNvbSwgZmNvbXAgd2l0aAotCXJlZ2lzdGVyIG9wZXJhbmRzLCBiZWNhdXNlIHRoaXMgaXMgYSBjb21tb24gaWRpb20uICBGbGFnIHRoZW0gd2l0aAotCWEgd2FybmluZy4gIEFsbG93IGlsbGVnYWwgZmFkZHAsIGZzdWJwLCBmc3VicnAsIGZtdWxwLCBmZGl2cCwKLQlmZGl2cnAgYmVjYXVzZSBnY2MgZXJyb25lb3VzbHkgZ2VuZXJhdGVzIHRoZW0uICBBbHNvIGZsYWcgd2l0aCBhCi0Jd2FybmluZy4KLQotCSogaTM4Ni5oOiBBZGQgc3VmZml4IG1vZGlmaWVycyB0byBtb3N0IGluc25zLCBhbmQgdGlnaHRlciBvcGVyYW5kCi0JY2hlY2tzIGluIHNvbWUgY2FzZXMuICBGaXggYSBudW1iZXIgb2YgVW5peFdhcmUgY29tcGF0aWJpbGl0eQotCWlzc3VlcyB3aXRoIGZsb2F0IGluc25zLiAgTWVyZ2Ugc29tZSBmbG9hdGluZyBwb2ludCBvcGNvZGVzLCB1c2luZwotCW5ldyBGbG9hdE1GIG1vZGlmaWVyLgotCShXT1JEX1BSRUZJWF9PUENPREUpOiBSZW5hbWUgdG8gREFUQV9QUkVGSVhfT1BDT0RFIGZvcgotCWNvbnNpc3RlbmN5LgotCi0JKiBpMzg2Lmg6IENoYW5nZSBvY2N1cmVuY2Ugb2YgU2hvcnRmb3JtVyB0byBXfFNob3J0Rm9ybS4gIEFkZAotCUlnbm9yZURhdGFTaXplIHdoZXJlIGFwcHJvcHJpYXRlLgotCi1XZWQgSnVuICAzIDE4OjI4OjQ1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiAob25lX2J5dGVfc2VnbWVudF9kZWZhdWx0cyk6IFJlbW92ZS4KLQkodHdvX2J5dGVfc2VnbWVudF9kZWZhdWx0cyk6IFJlbW92ZS4KLQkoaTM4Nl9yZWd0YWIpOiBBZGQgQmFzZUluZGV4IHRvIDMyIGJpdCByZWdzIHJlZ190eXBlLgotCi1GcmkgTWF5IDE1IDE1OjU5OjA0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5faHdfbG9va3VwX2J5X25hbWUpOiBSZW5hbWVkIGZyb20gY2dlbl9od19sb29rdXAuCi0JKGNnZW5faHdfbG9va3VwX2J5X251bSk6IERlY2xhcmUuCi0KLVRodSBNYXkgIDcgMDk6Mjc6NTggMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChPUF97U0gsTUFTS31fQ09ERTIpOiBBZGRlZCAicSIgb3BlcmFuZCBmb3JtYXQgZm9yIGxvd2VyCi0JdGVuIGJpdHMgb2YgTUlQUyBJU0ExICJicmVhayIgaW5zdHJ1Y3Rpb24sIGFuZCBmb3IgInNkYmJwIgotCi1UaHUgTWF5ICA3IDAyOjE0OjA4IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5fYXNtX2luaXRfcGFyc2UpOiBEZWxldGUuCi0JKGNnZW5fc2F2ZV9maXh1cHMsY2dlbl9yZXN0b3JlX2ZpeHVwcyxjZ2VuX3N3YXBfZml4dXBzKTogRGVsZXRlLgotCShjZ2VuX2FzbV9yZWNvcmRfcmVnaXN0ZXIsY2dlbl9hc21fZmluaXNoX2luc24pOiBEZWxldGUuCi0KLU1vbiBBcHIgMjcgMTA6MTM6MTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9BVFRSX1RZUEUpOiBEZWxldGUgYGNvbnN0JywgbW92ZWQgdG8gdXNlcy4KLQkoY2dlbl9hc21fZmluaXNoX2luc24pOiBVcGRhdGUgcHJvdG90eXBlLgotCShjZ2VuX2luc24pOiBOZXcgbWVtYmVycyBudW0sIGRhdGEuCi0JKENHRU5fSU5TTl9UQUJMRSk6IE1lbWJlcnMgYXNtX2hhc2gsIGFzbV9oYXNoX3RhYmxlX3NpemUsCi0JZGlzX2hhc2gsIGRpc19oYXNoX3RhYmxlX3NpemUgbW92ZWQgdG8gLi4uCi0JKENHRU5fT1BDT0RFX1RBQkxFKS4gIEhlcmUuICBSZW5hbWVkIGZyb20gQ0dFTl9PUENPREVfREFUQS4KLQlBbGwgdXNlcyB1cGRhdGVkLiAgTmV3IG1lbWJlcnMgYXNtX2hhc2hfcCwgZGlzX2hhc2hfcC4KLQkoQ0dFTl9NSU5TTl9FWFBBTlNJT04pOiBOZXcgc3RydWN0LgotCShjZ2VuX2V4cGFuZF9tYWNyb19pbnNuKTogRGVjbGFyZS4KLQkoY2dlbl9tYWNyb19pbnNuX2NvdW50KTogRGVjbGFyZS4KLQkoZ2V0X2luc25fb3BlcmFuZHMpOiBVcGRhdGUgcHJvdG90eXBlLgotCShsb29rdXBfZ2V0X2luc25fb3BlcmFuZHMpOiBEZWNsYXJlLgotCi1UdWUgQXByIDIxIDE3OjExOjMyIDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQ2hhbmdlIGljbHJLbHVkZ2UgYW5kIGltdWxLbHVkZ2UgdG8KLQlyZWdLbHVkZ2UuICBBZGQgb3BlcmFuZHMgdHlwZXMgZm9yIHN0cmluZyBpbnN0cnVjdGlvbnMuCi0KLU1vbiBBcHIgMjAgMTQ6NDA6MjkgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBpMzg2LmggKFgpOiBSZW5hbWVkIGZyb20gYFpfJyB0byBwcmVzZXJ2ZSBmb3JtYXR0aW5nIG9mIG9wY29kZQotCXRhYmxlLgotCi1TdW4gQXByIDE5IDEzOjU0OjA2IDE5OTggIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oIChaXyk6IFJlbmFtZWQgZnJvbSBgXycgdG8gYXZvaWQgY2xhc2ggd2l0aCBjb21tb24gYWxpYXMKLQlmb3IgYGdldHRleHQnLgotCi1GcmkgQXByICAzIDEyOjA0OjQ4IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oOiBSZW1vdmUgTm9Nb2RybSBmbGFnIGZyb20gYWxsIGluc25zOiBpdCdzIG5ldmVyIGNoZWNrZWQuCi0JQWRkIElzU3RyaW5nIGZsYWcgdG8gc3RyaW5nIGluc3RydWN0aW9ucy4KLQkoSVNfU1RSSU5HKTogRG9uJ3QgZGVmaW5lLgotCShMT0NLX1BSRUZJWF9PUENPREUsIENTX1BSRUZJWF9PUENPREUsIERTX1BSRUZJWF9PUENPREUpOiBEZWZpbmUuCi0JKEVTX1BSRUZJWF9PUENPREUsIEZTX1BSRUZJWF9PUENPREUsIEdTX1BSRUZJWF9PUENPREUpOiBEZWZpbmUuCi0JKFNTX1BSRUZJWF9PUENPREUpOiBEZWZpbmUuCi0KLU1vbiBNYXIgMzAgMjE6MzE6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IFJldmVydCBNYXJjaCAyNCBwYXRjaDsgbm8gbW9yZSBMaW5lYXJBZGRyZXNzLgotCi1Nb24gTWFyIDMwIDEwOjI1OjU0IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogUmVtb3ZlIGZ3YWl0ICg5YikgZnJvbSBhbGwgZmxvYXRpbmcgcG9pbnQKLQlpbnN0cnVjdGlvbnMsIGFuZCBpbnN0ZWFkIGFkZCBGV2FpdCBvcGNvZGUgbW9kaWZpZXIuICBBZGQgc2hvcnQKLQlmb3JtIG9mIGZsZGVudiBhbmQgZnN0ZW52LgotCShGV0FJVF9PUENPREUpOiBEZWZpbmUuCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IENoYW5nZSBzZWNvbmQgb3BlcmFuZCBjb25zdHJhaW50IG9mIGBtb3YKLQlzcmVnLHJlZ3xtZW0nIGluc3RydWN0aW9uIGZyb20gUmVnMTZ8TWVtIHRvIFdvcmRSZWd8V29yZE1lbSB0bwotCWFsbG93IGxlZ2FsIGluc3RydWN0aW9ucyBzdWNoIGFzIGBtb3ZsICVncywlZXNpJwotCi1GcmkgTWFyIDI3IDE4OjMwOjUyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaDgzMDAuaDogVmFyaW91cyBjaGFuZ2VzIHRvIGZ1bGx5IGJyYWNrZXQgaW5pdGlhbGl6ZXJzLgotCi1UdWUgTWFyIDI0IDE4OjMyOjQ3IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogaTM4Ni5oOiBTZXQgTGluZWFyQWRkcmVzcyBmb3IgbGlkdCBhbmQgbGdkdC4KLQotTW9uIE1hciAgMiAxMDo0NDowNyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0JPT0xfQVRUUik6IE5ldyBtYWNyby4KLQotVGh1IEZlYiAyNiAxNTo1NDozMSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChGTEFHX0RFTEFZKTogTmV3IGZsYWcgZm9yIGRlbGF5ZWQgYnJhbmNoZXMvanVtcHMuCi0KLU1vbiBGZWIgMjMgMTA6Mzg6MjEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoQ0dFTl9DQVQzKTogRGVsZXRlLiAgVXNlIENPTkNBVDMgbm93LgotCShjZ2VuX2luc24pOiBSZWNvcmQgc3ludGF4IGFuZCBmb3JtYXQgZW50cmllcyBoZXJlLCByYXRoZXIgdGhhbgotCXNlcGFyYXRlbHkuCi0KLVR1ZSBGZWIgMTcgMjE6NDI6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEKTogTmV3IG1hY3JvLgotCi1UdWUgRmViIDE3IDE2OjAwOjU2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGNnZW5faW5zZXJ0X2ZuKTogQ2hhbmdlIHR5cGUgb2YgcmVzdWx0IHRvIGNvbnN0IGNoYXIgKi4KLQkoY2dlbl9wYXJzZV97c2lnbmVkLHVuc2lnbmVkfV9pbnRlZ2VyKTogRGVsZXRlIG1pbixtYXggYXJndW1lbnRzLgotCShDR0VOX3tJTlNOLEtFWVdPUkQsT1BFUkFORH1fTkJPT0xfQVRUUlMpOiBSZW5hbWVkIGZyb20gLi4uX01BWF9BVFRSUy4KLQotVGh1IEZlYiAxMiAxODozMDo0MSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmggKGxvb2t1cF9pbnNuKTogTmV3IGFyZ3VtZW50IGFsaWFzX3AuCi0KLVRodSBGZWIgMTIgMDM6NDE6MDAgMTk5OCAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotRml4IHJhYyB0byBhY2NlcHQgb25seSBhMDoKLQkqIGQxMHYuaCAoT1BFUkFORF9BQ0MpOiBTcGxpdCBpbnRvOgotCShPUEVSQU5EX0FDQzAsIE9QRVJBTkRfQUNDMSkgLgotCShPUEVSQU5EX0dQUik6IERlZmluZS4KLQotV2VkIEZlYiAxMSAxNzozMTo1MyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0ZJRUxEUyk6IERlZmluZSBoZXJlLgotCShDR0VOX0hXX0VOVFJZKTogTmV3IG1lbWJlciBgdHlwZScuCi0JKGh3X2xpc3QpOiBEZWxldGUgZGVjbC4KLQkoZW51bSBjZ2VuX21vZGUpOiBEZWNsYXJlLgotCShDR0VOX09QRVJBTkQpOiBOZXcgbWVtYmVyIGBodycuCi0JKGVudW0gY2dlbl9vcGVyYW5kX2luc3RhbmNlX3R5cGUpOiBEZWNsYXJlLgotCShDR0VOX09QRVJBTkRfSU5TVEFOQ0UpOiBOZXcgdHlwZS4KLQkoQ0dFTl9JTlNOKTogTmV3IG1lbWJlciBgb3BlcmFuZHMnLgotCShDR0VOX09QQ09ERV9EQVRBKTogTWFrZSBod19saXN0IGNvbnN0LgotCShnZXRfaW5zbl9vcGVyYW5kcyxsb29rdXBfaW5zbik6IEFkZCBwcm90b3R5cGVzIGZvci4KLQotVHVlIEZlYiAgMyAxNzoxMToyMyAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oIChDR0VOX0lOU05fTUFYX0FUVFJTKTogUmVuYW1lZCBmcm9tIENHRU5fTUFYX0lOU05fQVRUUlMuCi0JKENHRU5fSFdfRU5UUlkpOiBNb3ZlIGBuZXh0JyBlbnRyeSB0byBlbmQgb2Ygc3RydWN0LgotCShDR0VOX0tFWVdPUkRfTUFYX0FUVFJTKTogUmVuYW1lZCBmcm9tIENHRU5fTUFYX0tFWVdPUkRfQVRUUlMuCi0JKENHRU5fT1BFUkFORF9NQVhfQVRUUlMpOiBSZW5hbWVkIGZyb20gQ0dFTl9NQVhfT1BFUkFORF9BVFRSUy4KLQotTW9uIEZlYiAgMiAxOToxOToxNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogQ29ycmVjdCB0eXBvIGluIGNvbW1lbnQgZW5kIG1hcmtlci4KLQotTW9uIEZlYiAgMiAxNzoxMDozOCAxOTk4ICBTdGV2ZSBIYXdvcnRoICA8c3RldmVAcG0uY3NlLnJtaXQuRURVLkFVPgotCi0JKiB0aWMzMC5oOiBOZXcgZmlsZS4KLQotVGh1IEphbiAyMiAxNzo1NDo1NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IEFkZCBwcm90b3R5cGVzIGZvciBjZ2VuX3NhdmVfZml4dXBzKCksCi0JY2dlbl9yZXN0b3JlX2ZpeHVwcygpLCBhbmQgY2dlbl9zd2FwX2ZpeHVwcygpLiAgQ2hhbmdlIHByb3RvdHlwZQotCW9mIGNnZW5fYXNtX2ZpbmlzaF9pbnNuKCkgdG8gcmV0dXJuIGEgY2hhciAqLgotCi1XZWQgSmFuIDE0IDE3OjIxOjQzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaDogRm9ybWF0dGluZyBjaGFuZ2VzIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuCi0KLU1vbiBKYW4gMTIgMTE6Mzc6MzYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoKik6IENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKENHRU5fQVRUUik6IE1ha2UgdW5zaWduZWQgY2hhci4KLQkoQ0dFTl9BVFRSX1RZUEUpOiBVcGRhdGUuCi0JKENHRU5fQVRUUl97RU5UUlksVEFCTEV9KTogTmV3IHR5cGVzLgotCShjZ2VuX2Jhc2UpOiBNb3ZlIG1lbWJlciBgYXR0cnMnIHRvIGNnZW5faW5zbi4KLQkoQ0dFTl9LRVlXT1JEKTogTmV3IG1lbWJlciBgbnVsbF9lbnRyeScuCi0JKENHRU5fe1NZTlRBWCxGT1JNQVR9KTogTmV3IHR5cGVzLgotCShjZ2VuX2luc24pOiBGb3JtYXQgYW5kIHN5bnRheCBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyLgotCi1UdWUgRGVjIDE2IDE1OjE1OjUyIDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LmggKGQzMHZfb3Bjb2RlKTogUmVvcmRlciBmbGFncyBzb21ld2hhdCwgYWRkIG5ldyBmbGFncyBmb3IKLQkyIHdvcmQgbG9hZC9zdG9yZSwgQUREcHBwL1NVQnBwcCwgMTYvMzIgYml0IG11bHRpcGx5LiAgTWFrZQotCWZsYWdzX3t1c2VkLHNldH0gbG9uZy4KLQkoZDMwdl9vcGVyYW5kKTogTWFrZSBmbGFncyBmaWVsZCBsb25nLgotCi1Nb24gRGVjICAxIDEyOjI0OjQ0IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLmg6IEZpeCBjb21tZW50IGRlc2NyaWJpbmcgb3BlcmFuZCB0eXBlcy4KLQotU3VuIE5vdiAyMyAyMjozMToyNyAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChTSE9SVF9DTVBVKTogQWRkIGNhc2UgZm9yIGNtcHUgaW5zdHJ1Y3Rpb24sIGFuZCBtb3ZlCi0JZXZlcnl0aGluZyBlbHNlIGFmdGVyIGRvd24uCi0KLVR1ZSBOb3YgMTggMTg6NDU6MTQgMTk5NyAgSiJvcm4gUmVubmVja2UgIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCSogZDEwdi5oIChPUEVSQU5EX0ZMQUcpOiBTcGxpdCBpbnRvOgotCShPUEVSQU5EX0ZGTEFHLCBPUEVSQU5EX0NGTEFHKSAuCi0KLVRodSBOb3YgMTMgMTE6MDQ6MjQgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoc3RydWN0IG1pcHNfb3Bjb2RlKTogQ2hhbmdlZCBjb21tZW50cyB0byByZWZsZWN0IG5ldwotCWZpZWxkIHVzYWdlLgotCi1GcmkgT2N0IDI0IDIyOjM2OjIwIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZGVkIHRvIGNvbW1lbnRzIGEgcXVpY2stcmVmIGxpc3Qgb2YgYWxsIGFzc2lnbmVkCi0Jb3BlcmFuZCB0eXBlIGNoYXJhY3RlcnMuCi0JKE9QX3tNQVNLLFNIfV9QRVJGUkVHKTogTmV3IG1hY3Jvcy4KLQotV2VkIE9jdCAyMiAxNzoyODozMyAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy5oOiBBZGQgJ18nIGFuZCAnLycgZm9yIHY5YSBhc3Incy4KLQlQYXRjaCBmcm9tIERhdmlkIE1pbGxlciA8ZGF2ZW1Admdlci5ydXRnZXJzLmVkdT4KLQotVHVlIE9jdCAxNCAxMzoyMjoyOSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IEJpdCBvcHMgd2l0aCBhYnNvbHV0ZSBhZGRyZXNzZXMgbm90IGluIHRoZSA4IGJpdAotCWFyZWEgYXJlIG5vdCBhdmFpbGFibGUgaW4gdGhlIGJhc2UgbW9kZWwgKEg4LzMwMCkuCi0KLVRodSBTZXAgMjUgMTM6MDM6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IFJlbW92ZSBkb2N1bWVudGF0aW9uIG9mIGAgb3BlcmFuZCBzcGVjaWZpZXIuCi0KLVdlZCBTZXAgMjQgMTk6MDA6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLmg6IERvY3VtZW50IHEgYW5kIHYgb3BlcmFuZCBzcGVjaWZpZXJzLgotCi1Nb24gU2VwIDE1IDE4OjI4OjM3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoc3RydWN0IHY4NTBfb3Bjb2RlKTogQWRkIHByb2Nlc3NvcnMgZmllbGQuCi0JKFBST0NFU1NPUl9WODUwLCBQUk9DRVNTT1JfQUxMKTogTmV3IGJpdCBjb25zdGFudHMuCi0JKFBST0NFU1NPUl9WODUwRSwgUFJPQ0VTU09SX05PVF9WODUwKTogTmV3IGJpdCBjb25zdGFudHMuCi0JKFBST0NFU1NPUl9WODUwRUEpOiBOZXcgYml0IGNvbnN0YW50cy4KLQotTW9uIFNlcCAxNSAxMToyOTo0MyAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlIGNoYW5nZXMgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogZDMwdi5oOiBBbGxvdyB1cCB0byA2NCBjb250cm9sIHJlZ2lzdGVycy4gQWRkCi0JU0hPUlRfQTVTIGZvcm1hdC4KLQotCSogZDMwdi5oIChMT05HX0RiKTogTmV3IGZvcm0gZm9yIGRlbGF5ZWQgYnJhbmNoZXMuCi0KLQkqIGQzMHYuaDogKExPTkdfRGIpOiBOZXcgZm9ybSBmb3IgcmVwZWF0aS4KLQotCSogZDMwdi5oIChTSE9SVF9EMkIpOiBOZXcgZm9ybS4KLQotCSogZDMwdi5oIChTSE9SVF9BMik6IE5ldyBmb3JtLgotCi0JKiBkMzB2LmggKE9QRVJBTkRfMlJFRyk6IEFkZCBuZXcgb3BlcmFuZCB0byBpbmRpY2F0ZSAyCi0JcmVnaXN0ZXJzIGFyZSB1c2VkLiAgTmVlZGVkIGZvciBWTElXIG9wdGltaXphdGlvbi4KLQotTW9uIFNlcCAgOCAxNDowNTo0NSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLmg6IE1vdmUgYXNzZW1ibGVyIGludGVyZmFjZSBzZWN0aW9uCi0JdXAgc28gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCBpcyBkZWZpbmVkIGZvciBjZ2VuX3BhcnNlX2FkZHJlc3MuCi0JKGNnZW5fcGFyc2VfYWRkcmVzcyk6IFVwZGF0ZSBwcm90b3R5cGUuCi0KLVR1ZSBTZXAgIDIgMTU6MzI6MzIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX09QUkVBTkRfQURKVVNUX1NIT1JUX01FTU9SWSk6IFJlbW92ZWQuCi0KLVR1ZSBBdWcgMjYgMTI6MjE6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpMzg2LmggKHR3b19ieXRlX3NlZ21lbnRfZGVmYXVsdHMpOiBDb3JyZWN0IGJhc2UgcmVnaXN0ZXIgNSBpbgotCW1vZGVzIDEgYW5kIDIgdG8gYmUgc3MgcmF0aGVyIHRoYW4gZHMuICBGcm9tIEdhYnJpZWwgUGF1YmVydAotCTxwYXViZXJ0QGlyYW0uZXM+LgotCi0JKiBpMzg2Lmg6IFNldCB1ZDIgdG8gMHgwZjBiLiAgRnJvbSBHYWJyaWVsIFBhdWJlcnQKLQk8cGF1YmVydEBpcmFtLmVzPi4KLQotCSogaTM4Ni5oOiBDb21tZW50IGZpeGVzIGZvciBmaWNvbVtwXT97cyxsfSBmcm9tIEdhYnJpZWwgUGF1YmVydAotCTxwYXViZXJ0QGlyYW0uZXM+LgotCi0JKiBpMzg2LmggKEpVTVBfT05fQ1hfWkVSTyk6IFVuY29tbWVudCAoZGVmaW5lIGFnYWluKS4KLQkoSlVNUF9PTl9FQ1hfWkVSTyk6IFJlbW92ZSBjb21tZW50ZWQgb3V0IG1hY3JvLgotCi1GcmkgQXVnIDIyIDEwOjM4OjI5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAoVjg1MF9OT1RfUjApOiBOZXcgZmxhZy4KLQotTW9uIEF1ZyAxOCAxMTowNTo1OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHN0cnVjdCB2ODUwX29wY29kZSk6IFJlbW92ZSBmbGFncyBmaWVsZC4KLQotV2VkIEF1ZyAxMyAxODo0NTo0OCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLmggKHN0cnVjdCB2ODUwX29wY29kZSk6IEFkZCBmbGFncyBmaWVsZC4KLQkoc3RydWN0IHY4NTBfb3BlcmFuZCk6IEV4dGVuZCBtZWFuaW5nIG9mICdiaXRzJyBhbmQgJ3NoaWZ0JwotCWZpZWxkcy4KLQkoVjg1MEVfSU5TVFJVQ1RJT04sIFY4NTBFQV9JTlNUUlVDVElPTik6IE5ldyBmbGFncy4KLQkoVjg1MEVfUFVTSF9QT1AsIFY4NTBFX0lNTUVESUFURTE2LCBWODUwRV9JTU1FRElBVEUzMik6IE5ldyBmbGFncy4KLQotRnJpIEF1ZyAgOCAxNjo1ODo0MiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcmMuaDogTmV3IGZpbGUuCi0KLVRodSBKdWwgMjQgMjE6MTY6NTggMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2Rlcyk6IERlY2xhcmUgYXMgY29uc3QuCi0KLVRodSBKdWwgMTAgMTI6NTM6MjUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKEZQX1MsIEZQX0QpOiBEZWZpbmUuICBCaXRtYXNrcyBpbmRpY2F0aW5nIGlmIGFuIGluc24KLQl1c2VzIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHJlc291cmNlcy4KLQkoSU5TTl9OT19JU0EsIElOU05fSVNBMSk6IERlZmluZS4KLQkoY3B1IHNwZWNpZmljIElOU04gbWFjcm9zKTogVHdlYWsgaW50byBiaXRtYXNrcyBvdXRzaWRlIHRoZSByYW5nZQotCW9mIElOU05fSVNBIGZpZWxkLgotCi1Nb24gSnVuIDE2IDE0OjEwOjAwIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGkzODYuaDogRml4IHBhbmQgb3Bjb2RlLgotCi1Nb24gSnVuICAyIDExOjM1OjA5IDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IFdpZGVuIElOU05fSVNBIGFuZCBtb3ZlIGl0IHRvIGEgbW9yZSBjb252ZW5pZW50Ci0JYml0IHBvc2l0aW9uLiAgQWRkIElOU05fMzkwMC4KLQotVHVlIE1heSAyMCAxMToyNToyOSAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChzdHJ1Y3QgbWlwc19vcGNvZGUpOiBhZGRlZCBuZXcgZmllbGQgbWVtYmVyc2hpcC4KLQotTW9uIE1heSAxMiAxNjoyNjo1MCAxOTk3ICBILkouIEx1ICA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JKiBpMzg2LmggKG1vdmQpOiBvbmx5IFJlZzMyIGlzIGFsbG93ZWQuCi0KLQkqIGkzODYuaDogYWRkIGZjb21wIGFuZCB1ZDIuICBGcm9tIFdheW5lIFNjb3R0Ci0JPHdzY290dEBpY2hpcHMuaW50ZWwuY29tPi4KLQotTW9uIE1heSAgNSAxNzoxNjoyMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIE1NWCBpbnN0cnVjdGlvbnMuCi0KLU1vbiBNYXkgIDUgMTI6NDU6MTkgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogaTM4Ni5oOiBSZW1vdmUgVyBtb2RpZmllciBmcm9tIGNvbmRpdGlvbmFsIG1vdmUgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gQXByIDE0IDE0OjU2OjU4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBDaGFuZ2UgdGhlIG9wY29kZXMgZm9yIGZzdWJwLCBmc3VicnAsIGZkaXZwLCBhbmQgZmRpdnJwCi0Jd2l0aCBubyBhcmd1bWVudHMgdG8gbWF0Y2ggdGhhdCBnZW5lcmF0ZWQgYnkgdGhlIFVuaXhXYXJlCi0JYXNzZW1ibGVyLgotCi1UaHUgQXByIDEwIDE0OjM1OjAwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4uaCAoPGNwdT5fY2dlbl9hc3NlbWJsZV9pbnNuKTogTmV3IGFyZyBmb3IgZXJybXNnLgotCShjZ2VuX3BhcnNlX29wZXJhbmRfZm4pOiBEZWNsYXJlLgotCShjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCk6IERlY2xhcmUuCi0JKGNnZW5fcGFyc2Vfb3BlcmFuZCk6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9wYXJzZV9vcGVyYW5kLAotCW5ldyBhcmd1bWVudCBgd2FudCcuCi0JKGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCk6IFJlbmFtZWQgZnJvbSBjZ2VuX2FzbV9yZXN1bHQuCi0JKGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3R5cGUpOiBOZXcgZW51bS4KLQotU2F0IEFwciAgNSAxMzoxNDowNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogUmV2ZXJ0IGxhc3QgcGF0Y2ggZm9yIHRoZSBOT05fQlJPS0VOX09QQ09ERVMgY2FzZXMuCi0KLUZyaSBBcHIgIDQgMTE6NDY6MTEgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi5oOiBOZXcgZmlsZS4KLQotRnJpIEFwciAgNCAxNDowMjozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQ29ycmVjdCBvcGNvZGUgdmFsdWVzIGZvciBmc3VicCwgZnN1YnJwLCBmZGl2cCwgYW5kCi0JZmRpdnJwLgotCi1UdWUgTWFyIDI1IDIyOjU3OjI2IDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHY4NTAuaCAoZXh0cmFjdCk6ICBNYWtlIHVuc2lnbmVkLgotCi1Nb24gTWFyIDI0IDE0OjM4OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBBZGQgaWNsci4KLQotVGh1IE1hciAyMCAxOTo0OToxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQ2hhbmdlIERXIHRvIFcgZm9yIGNtcHhjaGcgYW5kIHhhZGQsIHNpbmNlIHRoZXkgZG9uJ3QKLQl0YWtlIGEgZGlyZWN0aW9uIGJpdC4KLQotU2F0IE1hciAxNSAxOTowMzoyOSAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogc3BhcmMuaCAoc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoKTogVXNlIGZ1bGwgcHJvdG90eXBlLgotCi1GcmkgTWFyIDE0IDE1OjIyOjAxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaDogSW5jbHVkZSA8YW5zaWRlY2wuaD4uICBVcGRhdGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zIHRvCi0JdXNlIHByb3RvdHlwZXMsIGFuZCB0byB1c2UgY29uc3Qgd2hlbiBhcHByb3ByaWF0ZS4KLQotVGh1IE1hciAgNiAxNDoxODozMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX1JFTEFYKTogRGVmaW5lLgotCi1Nb24gRmViIDI0IDE1OjE1OjU2IDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IENoYW5nZSBwcmVfZGVmaW5lZF9yZWdpc3RlcnMgdG8KLQlkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzIGFuZCByZWdfbmFtZV9jbnQgdG8gZDEwdl9yZWdfbmFtZV9jbnQuCi0KLVNhdCBGZWIgMjIgMjE6MjU6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBtYWNyb3MgZm9yIGNvcDAsIGNvcDEgY29wMiBhbmQgY29wMy4KLQlDaGFuZ2UgbWlwc19vcGNvZGVzIGZyb20gY29uc3QgYXJyYXkgdG8gYSBwb2ludGVyLAotCWFuZCBjaGFuZ2UgYmZkX21pcHNfbnVtX29wY29kZXMgZnJvbSBjb25zdCBpbnQgdG8gaW50LAotCXNvIHRoYXQgd2UgY2FuIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBtaXBzIG9wY29kZXMgdGFibGUKLQlkeW5hbWljYWxseS4KLQotRnJpIEZlYiAyMSAxNjozNDoxOCAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDMwdi5oIChGTEFHX1gpOiBSZW1vdmUgdW51c2VkIGZsYWcuCi0KLVR1ZSBGZWIgMTggMTc6Mzc6MjAgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYuaDogTmV3IGZpbGUuCi0KLUZyaSBGZWIgMTQgMTM6MTY6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFBEU19OQU1FKTogTWFjcm8gdG8gYWNjZXNzIG5hbWUgZmllbGQgb2YgcHJlZGVmaW5lZCBzeW1ib2xzLgotCShQRFNfVkFMVUUpOiBNYWNybyB0byBhY2Nlc3MgdmFsdWUgZmllbGQgb2YgcHJlZGVmaW5lZCBzeW1ib2xzLgotCSh0aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sKTogQWRkIHByb3RvdHlwZS4KLQotTW9uIEZlYiAxMCAxMDozMjoxNyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAodGljODBfc3ltYm9sX3RvX3ZhbHVlKTogQ2hhbmdlIHByb3RvdHlwZSB0byBtYXRjaAotCWNoYW5nZSBpbiBmdW5jdGlvbiwgYWRkZWQgY2xhc3MgcGFyYW1ldGVyLgotCi1UaHUgRmViICA2IDE3OjMwOjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX0VORE1BU0spOiBBZGQgZm9yIGZsYWdnaW5nIFRJYzgwCi0JZW5kbWFzayBmaWVsZHMsIHdoaWNoIGFyZSBzb21ld2hhdCB3ZWlyZCBpbiB0aGF0IDAgYW5kIDMyIGFyZQotCXRyZWF0ZWQgZXhhY3RseSB0aGUgc2FtZS4KLQotVGh1IEphbiAzMCAxMzo0NjoxOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaDogQ2hhbmdlIGFsbCB0aGUgT1BFUkFORCBkZWZpbmVzIHRvIHVzZSB0aGUgZm9ybSAoMSA8PCBYKQotCXJhdGhlciB0aGFuIGEgY29uc3RhbnQgdGhhdCBpcyAyKipYLiAgUmVvcmRlciB0aGVtIHRvIHB1dCBiaXRzIGZvcgotCW9wZXJhbmRzIHRoYXQgaGF2ZSBzeW1ib2xpYyBuYW1lcyBpbiB0aGUgdXBwZXIgYml0cywgc28gdGhleSBjYW4KLQliZSBwYWNrZWQgaW50byBhbiBpbnQgd2hlcmUgdGhlIGxvd2VyIGJpdHMgY29udGFpbiB0aGUgdmFsdWUgdGhhdAotCWNvcnJlc3BvbmRzIHRvIHRoYXQgc3ltYm9saWMgbmFtZS4KLQkocHJlZGVmaW5lZF9zeW1ibyk6IEFkZCBzdHJ1Y3QuCi0JKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IERlY2xhcmUgYXJyYXkgb2YgdHJhbnNsYXRpb25zLgotCSh0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzKTogRGVjbGFyZSBzaXplIG9mIHRoYXQgYXJyYXkuCi0JKHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCk6IERlY2xhcmUgZnVuY3Rpb24uCi0JKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IERlY2xhcmUgZnVuY3Rpb24uCi0KLVdlZCBKYW4gMjkgMDk6Mzc6MjUgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLmggKE1OMTAyMDBfT1BFUkFORF9SRUxBWCk6IERlZmluZS4KLQotU2F0IEphbiAxOCAxNToxODo1OSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfTk9fUjBfREVTVCk6IEFkZCBmb3Igb3Bjb2RlcyB3aGVyZSByMCBjYW5ub3QKLQliZSB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuCi0KLVRodSBKYW4gMTYgMjA6NDg6NTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKHN0cnVjdCB0aWM4MF9vcGNvZGUpOiBDaGFuZ2UgImZvcm1hdCIgZmllbGQgdG8gImZsYWdzIi4KLQkoRk1UX1VOVVNFRCwgRk1UX1NJLCBGTVRfTEksIEZNVF9SRUcpOiBEZWxldGUuCi0JKFRJQzgwX1ZFQ1RPUik6IERlZmluZSBhIGZsYWcgYml0IGZvciB0aGUgZmxhZ3MuICBUaGlzIG9uZSBtZWFucwotCXRoYXQgdGhlIG9wY29kZSBjYW4gaGF2ZSB0d28gdmVjdG9yIGluc3RydWN0aW9ucyBpbiBhIHNpbmdsZQotCTMyIGJpdCB3b3JkIGFuZCB3ZSBoYXZlIHRvIGVuY29kZS9kZWNvZGUgYm90aC4KLQotVHVlIEphbiAxNCAxOTozNzowOSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9QQ1JFTCk6IFJlbmFtZWQgZnJvbQotCVRJQzgwX09QRVJBTkRfUkVMQVRJVkUgZm9yIFBDIHJlbGF0aXZlLgotCShUSUM4MF9PUEVSQU5EX0JBU0VSRUwpOiBOZXcgZmxhZyBiaXQgZm9yIHJlZ2lzdGVyCi0JYmFzZSByZWxhdGl2ZS4KLQotTW9uIEphbiAxMyAxNTo1NjozOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoVElDODBfT1BFUkFORF9GTE9BVCk6IEFkZCBmb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmFuZHMuCi0KLU1vbiBKYW4gIDYgMTA6NTE6MTUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfU0NBTEVEKTogT3BlcmFuZCBtYXkgaGF2ZSBvcHRpb25hbAotCSI6cyIgbW9kaWZpZXIgZm9yIHNjYWxpbmcuCi0KLVN1biBKYW4gIDUgMTI6MTI6MTkgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLmggKFRJQzgwX09QRVJBTkRfTV9TSSk6IEFkZCBvcGVyYW5kIG1vZGlmaWVyIGZvciAiOm0iLgotCShUSUM4MF9PUEVSQU5EX01fTEkpOiBEaXR0bwotCi1TYXQgSmFuICA0IDE5OjAyOjQ0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC5oIChUSUM4MF9PUEVSQU5EX0JJVE5VTSk6IFJlbmFtZWQgZnJvbSBUSUM4MF9PUEVSQU5EX0NDX1NaLgotCShUSUM4MF9PUEVSQU5EX0NDKTogTmV3IGRlZmluZSBmb3IgY29uZGl0aW9uIGNvZGUgb3BlcmFuZC4KLQkoVElDODBfT1BFUkFORF9DUik6IE5ldyBkZWZpbmUgZm9yIGNvbnRyb2wgcmVnaXN0ZXIgb3BlcmFuZC4KLQotRnJpIEphbiAgMyAxNjoyMjoyMyAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaCAoc3RydWN0IHRpYzgwX29wY29kZSk6IE5hbWUgY2hhbmdlZC4KLQkoc3RydWN0IHRpYzgwX29wY29kZSk6IFJlbW92ZSBmb3JtYXQgZmllbGQuCi0JKHN0cnVjdCB0aWM4MF9vcGVyYW5kKTogQWRkIGluc2VydGlvbiBhbmQgZXh0cmFjdGlvbiBmdW5jdGlvbnMuCi0JKFRJQzgwX09QRVJBTkRfKik6IFJlbW92ZSBvbGQgYm9ndXMgdmFsdWVzLCBzdGFydCBhZGRpbmcgbmV3Ci0JY29ycmVjdCBvbmVzLgotCShGTVRfKik6IERpdHRvLgotCi1UdWUgRGVjIDMxIDE1OjA1OjQxIDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oIChWODUwX09QRVJBTkRfQURKVVNUX1NIT1JUX01FTU9SWSk6IE5ldyBmbGFnIHRvIGFkanVzdAotCXR5cGUgSVYgaW5zdHJ1Y3Rpb24gb2Zmc2V0cy4KLQotRnJpIERlYyAyNyAyMjoyMzoxMCAxOTk2ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAuaDogTmV3IGZpbGUuCi0KLVdlZCBEZWMgMTggMTA6MDY6MzEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLmggKE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLKTogRGVmaW5lLgotCi1TYXQgRGVjIDE0IDEwOjQ4OjMxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBuaW5lbW9vbnMuY29tPgotCi0JKiBtbjEwMjAwLmg6IEZpeCBjb21tZW50LCBtbjEwMjAwX29wZXJhbmQgbm90IHBvd2VycGNfb3BlcmFuZC4KLQkqIG1uMTAzMDAuaDogRml4IGNvbW1lbnQsIG1uMTAzMDBfb3BlcmFuZCBub3QgcG93ZXJwY19vcGVyYW5kLgotCSogdjg1MC5oOiBGaXggY29tbWVudCwgdjg1MF9vcGVyYW5kIG5vdCBwb3dlcnBjX29wZXJhbmQuCi0KLU1vbiBEZWMgIDkgMTY6NDU6MzkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLmg6IEZsZXNoIG91dCBzdHJ1Y3R1cmVzIGFuZCBkZWZpbml0aW9ucyBuZWVkZWQgYnkKLQl0aGUgbW4xMDIwMCBhc3NlbWJsZXIgJiBkaXNhc3NlbWJsZXIuCi0KLVR1ZSBOb3YgMjYgMTA6NDY6NTYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLmg6IEFkZCBtaXBzMTYgZGVmaW5pdGlvbnMuCi0KLU1vbiBOb3YgMjUgMTc6NTY6NTQgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGsuaDogRG9jdW1lbnQgbmV3IDwsID4sIG0sIG4sIG8gYW5kIHAgb3BlcmFuZCBzcGVjaWZpZXJzLgotCi1XZWQgTm92IDIwIDEwOjU5OjQxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUENSRUwpOiBEZWZpbmUuCi0JKE1OMTAzMDBfT1BFUkFORF9NRU1BRERSKTogRGVmaW5lLgotCi1UdWUgTm92IDE5IDEzOjMwOjQwIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpOiBEZWZpbmUuCi0KLVdlZCBOb3YgIDYgMTM6NDE6MDggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9TUExJVCk6IERlZmluZS4KLQotVHVlIE5vdiAgNSAxMzoyNjoxMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAoTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEKTogRGVmaW5lLgotCi1Nb24gTm92ICA0IDEyOjUyOjQ4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC5oIChNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQpOiBEZWZpbmUuCi0KLUZyaSBOb3YgIDEgMTA6MzE6MDIgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLmg6IERvbid0IGluY2x1ZGUgImJmZC5oIjsgcHJpdmF0ZSByZWxvY2F0aW9uIHR5cGVzIGFyZSBub3cKLSAJbmVnYXRpdmUgdG8gbWluaW1pemUgcHJvYmxlbXMgd2l0aCBzaGFyZWQgbGlicmFyaWVzLiAgT3JnYW5pemUKLSAJaW5zdHJ1Y3Rpb24gc3Vic2V0cyBieSBBTUFTSyBleHRlbnNpb25zIGFuZCBQQUxjb2RlCi0gCWltcGxlbWVudGF0aW9uLgotCShzdHJ1Y3QgYWxwaGFfb3BlcmFuZCk6IE1vdmUgZmxhZ3Mgc2xvdCBmb3IgYmV0dGVyIHBhY2tpbmcuCi0KLVR1ZSBPY3QgMjkgMTI6MTk6MTAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLmggKFY4NTBfT1BFUkFORF9SRUxBWCk6IE5ldyBvcGVyYW5kIGZsYWcuCi0KLVRodSBPY3QgMTAgMTQ6Mjk6MTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKEZNVF8qKTogTW92ZSBvcGVyYW5kIGZvcm1hdCBkZWZpbml0aW9ucwotCWhlcmUuCi0KLVR1ZSBPY3QgIDggMTQ6NDg6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLmggKE1OMTAzMDBfT1BFUkFORF9QQVJFTik6IERlZmluZS4KLQotTW9uIE9jdCAgNyAxNjo1MjoxMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAuaCAobW4xMDMwMF9vcGNvZGUpOiBBZGQgImZvcm1hdCIgZmllbGQuCi0JKE1OMTAzMDBfT1BFUkFORF8qKTogRGVmaW5lLgotCi1UaHUgT2N0ICAzIDEwOjMzOjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMHgwMC5oOiBEZWxldGUuCi0JKiBtbjEwMjAwLmgsIG1uMTAzMDAuaDogTmV3IGZpbGVzLgotCi1XZWQgT2N0ICAyIDIxOjMxOjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMHgwMC5oOiBOZXcgZmlsZS4KLQotRnJpIFNlcCAyNyAxODoyNjo0NiAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiB2ODUwLmg6ICBBZGQgbmV3IGZsYWcgdG8gaW5kaWNhdGUgdGhpcyBpbnN0cnVjdGlvbiB1c2VzIGEgUEMKLQlkaXNwbGFjZW1lbnQuCi0KLUZyaSBTZXAgMTMgMTQ6NTg6MTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChzdG1hYyk6IEFkZCBtaXNzaW5nIGluc3RydWN0aW9uLgotCi1TYXQgQXVnIDMxIDE2OjAyOjAzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oICh2ODUwX29wY29kZSk6IFJlbW92ZSAic2l6ZSIgZmllbGQuICBBZGQgIm1lbW9wIgotCWZpZWxkLgotCi1GcmkgQXVnIDIzIDEwOjM5OjA4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC5oIChWODUwX09QRVJBTkRfRVApOiBEZWZpbmUuCi0KLQkqIHY4NTAuaCAodjg1MF9vcGNvZGUpOiBBZGQgc2l6ZSBmaWVsZC4KLQotVGh1IEF1ZyAyMiAxNjo1MToyNSAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHY4NTAuaCAodjg1MF9vcGVyYW5kcyk6IEFkZCBpbnNlcnQgYW5kIGV4dHJhY3QgZmllbGRzLCBwb2ludGVycwotIAl0byBmdW5jdGlvbnMgdXNlZCB0byBoYW5kbGUgdW51c3VhbCBvcGVyYW5kIGVuY29kaW5nLgotCShWODUwX09QRVJBTkRfUkVHLCBWODUwX09QRVJBTkRfU1JHLCBWODUwX09QRVJBTkRfQ0MsCi0gCVY4NTBfT1BFUkFORF9TSUdORUQpOiBEZWZpbmVkLgotCi1XZWQgQXVnIDIxIDE3OjQ1OjEwIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oICh2ODUwX29wZXJhbmRzKTogQWRkIGZsYWdzIGZpZWxkLgotCShPUEVSQU5EX1JFRywgT1BFUkFORF9OVU0pOiBEZWZpbmVkLgotCi1UdWUgQXVnIDIwIDE0OjUyOjAyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogdjg1MC5oOiBOZXcgZmlsZS4KLQotRnJpIEF1ZyAxNiAxNDo0NDoxNSAxOTk2ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBjeWdudXMuY28udWs+Ci0KLQkqIG1pcHMuaCAoT1BfU0hfTE9DQywgT1BfU0hfSElDQywgT1BfTUFTS19DQywgT1BfU0hfQ09QMU5PUk0sCi0gCU9QX01BU0tfQ09QMU5PUk0sIE9QX1NIX0NPUDFTUEVDLCBPUF9NQVNLX0NPUDFTUEVDLAotIAlPUF9NQVNLX0NPUDFTQ0xSLCBPUF9NQVNLX0NPUDFDTVAsIE9QX1NIX0NPUDFDTVAsIE9QX1NIX0ZPUk1BVCwKLSAJT1BfTUFTS19GT1JNQVQsIE9QX1NIX1RSVUUsIE9QX01BU0tfVFJVRSwgT1BfU0hfR0UsIE9QX01BU0tfR0UsCi0gCU9QX1NIX1VOU0lHTkVELCBPUF9NQVNLX1VOU0lHTkVELCBPUF9TSF9ISU5ULCBPUF9NQVNLX0hJTlQpOgotIAlEZWZpbmVkLgotCi1GcmkgQXVnIDE2IDAwOjE1OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwaXRsYiwgcGl0bGJlLCBpaXRsYmEsIGlpdGxicCwgZmljLCBmaWNlKTogQWNjZXB0Ci0JYSAzIGJpdCBzcGFjZSBpZCBpbnN0ZWFkIG9mIGEgMiBiaXQgc3BhY2UgaWQuCi0KLVRodSBBdWcgMTUgMTM6MTE6NDYgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaDogQWRkIHNvbWUgYWRkaXRpb25hbCBkZWZpbmVzIHRvIHN1cHBvcnQgdGhlCi0gCWFzc2VtYmxlciBpbiBkZXRlcm1pbmluZyB3aGljaCBvcGVyYXRpb25zIGNhbiBiZSBkb25lIGluIHBhcmFsbGVsLgotCi1UdWUgQXVnICA2IDExOjEzOjIyIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoU04pOiBEZWZpbmUuCi0JKGVlcG1vdi5iKTogUmVuYW1lZCBmcm9tICJlZXBtb3YiCi0JKG5vcCwgYnB0LCBydGUsIHJ0cywgc2xlZXAsIGNscm1hYyk6IFRoZXNlIGhhdmUgbm8gc2l6ZSBhc3NvY2lhdGVkCi0Jd2l0aCB0aGVtLgotCi1GcmkgSnVsIDI2IDExOjQ3OjEwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LmggKE9QRVJBTkRfU0hJRlQpOiBOZXcgb3BlcmFuZCBmbGFnLgotCi1UaHUgSnVsIDI1IDEyOjA2OjIyIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IENoYW5nZXMgZm9yIGRpdnMsIHBhcmFsbGVsLW9ubHkgaW5zdHJ1Y3Rpb25zLCBhbmQKLSAJc2lnbmVkIG51bWJlcnMuCi0KLU1vbiBKdWwgMjIgMTE6MjE6MTUgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYuaCAocGRfcmVnKTogRGVmaW5lLiBQdXR0aW5nIHRoZSBkZWZpbml0aW9uIGhlcmUgYWxsb3dzCi0JdGhlIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIHRvIHNoYXJlIHRoZSBzYW1lIHN0cnVjdC4KLQotTW9uIEp1bCAyMiAxMjoxNToyNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoaTk2MF9vcGNvZGVzKTogImhhbHQiIHRha2VzIGFuIGFyZ3VtZW50LiAgRnJvbSBTdGVwaGVuCi0JV2lsbGlhbXMgPHN0ZXZlQGljYXJ1cy5jb20+LgotCi1XZWQgSnVsIDE3IDE0OjQ2OjM4IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2Lmg6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDExIDEyOjA5OjE1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoYmFuZCwgYmNscik6IEZvcmNlIGhpZ2ggYml0IG9mIGltbWVkaWF0ZSBuaWJibGUgdG8gemVyby4KLQotV2VkIEp1bCAgMyAxNDozMDoxMiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLSAJKiBtNjhrLmggKG1jZjUyMDApOiBOZXcgbWFjcm8uCi0JRG9jdW1lbnQgbmFtZXMgb2YgY29sZGZpcmUgY29udHJvbCByZWdpc3RlcnMuCi0KLVR1ZSBKdWwgIDIgMjM6MDU6NDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChTUkNfSU5fRFNUKTogRGVmaW5lLgotCi0JKiBoODMwMC5oIChVTk9QMyk6IE1hcmsgdGhlIHJlZ2lzdGVyIG9wZXJhbmQgaW4gdGhpcyBpbnNuCi0JYXMgYSBzb3VyY2Ugb3BlcmFuZCwgbm90IGEgZGVzdGluYXRpb24gb3BlcmFuZC4KLQkoU0hJRlRfMiwgU0hJRlRfSU1NKTogUmVtb3ZlLiAgRWxpbWluYXRlIGFsbCByZWZlcmVuY2VzLgotCShVTk9QMyk6IENoYW5nZSBTSElGVF9JTU0gdG8gSU1NIGZvciBIOC9TIGJpdG9wcy4gIE1hcmsKLQlyZWdpc3RlciBvcGVyYW5kIHdpdGggU1JDX0lOX0RTVC4KLQotRnJpIEp1biAyMSAxMzo1MjoxNyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEuaDogTmV3IGZpbGUuCi0KLVRodSBKdW4gMjAgMTU6MDI6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiByczZrLmg6IFJlbW92ZSBvYnNvbGV0ZSBmaWxlLgotCi1XZWQgSnVuIDE5IDE1OjI5OjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBDb3JyZWN0IG9wY29kZSB2YWx1ZXMgZm9yIGZhZGRwLCBmc3VicCwgZnN1YnJwLCBmbXVscCwKLQlmZGl2cCwgYW5kIGZkaXZycC4gIEFkZCBmZnJlZXAuCi0KLVR1ZSBKdW4gMTggMTY6MDY6MDAgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGg4MzAwLmg6IFJlb3JkZXIgdmFyaW91cyAjZGVmaW5lcyBmb3IgcmVhZGFiaWxpdHkuCi0JKEFCUzMyU1JDLCBBQlMzMkRTVCwgRFNQMzJMSVNULCBBQlMzMkxJU1QsIEEzMkxJU1QpOiBEZWZpbmUuCi0JKEJJVE9QKTogQWNjZXB0IGFkZGl0aW9uYWwgKHVudXNlZCkgYXJndW1lbnQuICBBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShFQklUT1ApOiBMaWtld2lzZS4KLQkoT19MQVNUKTogQnVtcC4KLQkobGRjLCBzdGMsIG1vdmIsIG1vdncsIG1vdmwpOiBVc2UgMzJiaXQgb2Zmc2V0cyBhbmQgYWJzb2x1dGVzLgotCi0JKiBoODMwMC5oIChFWFIsIFNISUZUXzIsIE1BQ1JFRywgU0hJRlRfSU1NLCBSRElOQyk6IERlZmluZS4KLQkoT19UQVMsIE9fQ0xSTUFDLCBPX0xETUFDLCBPX01BQywgT19MRE0sIE9fU1RNKTogRGVmaW5lLgotCShCSVRPUCwgRUJJVE9QKTogSGFuZGxlIG5ldyBIOC9TIGFkZHJlc3NpbmcgbW9kZXMgZm9yCi0JYml0IGluc25zLgotCShVTk9QMyk6IEhhbmRsZSBuZXcgc2hpZnQvcm90YXRlIGluc25zIG9uIHRoZSBIOC9TLgotCShpbnNucyB1c2luZyBleHIpOiBOZXcgaW5zdHJ1Y3Rpb25zLgotCSh0YXMsIG1hYywgbGRtYWMsIGNscm1hYywgbGRtLCBzdG0pOiBOZXcgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTWF5IDIzIDE2OjU2OjQ4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoYWRkLmwpOiBVbmRvIEFwciA1dGggY2hhbmdlLiAgVGhlIG1hbnVhbCBJIGhhZAotCXdhcyBpbmNvcnJlY3QuCi0KLU1vbiBNYXkgIDYgMjM6Mzg6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChTVEFSVCk6IFJlbW92ZS4KLQkoTUVNUkVMQVgpOiBEZWZpbmUuICBNYXJrIGFic29sdXRlIG1lbW9yeSBvcGVyYW5kcyBpbiBtb3YuYiwgbW92LncKLQlhbmQgbW92LmwgaW5zbnMgdGhhdCBjYW4gYmUgcmVsYXhlZC4KLQotVHVlIEFwciAzMCAxODozMDo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogUmVtb3ZlIEFiczMyIGZyb20gbGNhbGwuCi0KLU1vbiBBcHIgMjIgMTc6MDk6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBibHVlcy5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChTUEFSQ19PUENPREVfQVJDSF9WOV9QKTogTmV3IG1hY3JvLgotCShTTENQT1ApOiBOZXcgbWFjcm8uCi0JTWFyayBYLFkgb3Bjb2RlIGxldHRlcnMgYXMgaW4gdXNlLgotCi1UaHUgQXByIDExIDE3OjI4OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoRl9GTE9BVCwgRl9GQlIpOiBEZWZpbmUuCi0KLUZyaSBBcHIgIDUgMTY6NTU6MzQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBoODMwMC5oIChBQlM4TUVNKTogUmVuYW1lZCBmcm9tIEFCU01PVi4gIFJlbW92ZSBBQlNNT1YKLQlmcm9tIGFsbCBpbnNucy4KLQkoQUJTOFNSQyxBQlM4RFNUKTogQWRkIEFCUzhNRU0uCi0JKGFkZC5sKTogRml4IHJlZytyZWcgdmFyaWFudC4KLQkoZWVwbW92LncpOiBSZW5hbWVkIGZyb20gZWVwbW92dy4KLQkobGRjLHN0Yyk6IEZpeCBtYW55IGNhc2VzLgotCi1TdW4gTWFyIDMxIDEzOjMwOjAzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKFNQQVJDX09QQ09ERV9BUkNIX01BU0spOiBOZXcgbWFjcm8uCi0KLVRodSBNYXIgIDcgMTU6MDg6MjMgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKE8pOiBNYXJrIG9wZXJhbmQgbGV0dGVyIGFzIGluIHVzZS4KLQotVHVlIEZlYiAyMCAyMDo0NjoyMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMuaCAoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3NwYXJjbGV0X2NwcmVnKTogRGVjbGFyZS4KLQlNYXJrIG9wZXJhbmQgbGV0dGVycyB1VSBhcyBpbiB1c2UuCi0KLU1vbiBGZWIgMTkgMDE6NTk6MDggMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX29wY29kZV9hcmNoX3ZhbCk6IEFkZCBTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVC4KLQkoc3BhcmNfb3Bjb2RlX2FyY2gpOiBEZWxldGUgbWVtYmVyIGBjb25mbGljdHMnLiAgQWRkIGBzdXBwb3J0ZWQnLgotCShTUEFSQ19PUENPREVfU1VQUE9SVEVEKTogTmV3IG1hY3JvLgotCShTUEFSQ19PUENPREVfQ09ORkxJQ1RfUCk6IFJld3JpdGUuCi0JKEZfTk9UVjkpOiBEZWxldGUuCi0KLUZyaSBGZWIgMTYgMTI6MjM6MzQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oIChzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpIE1ha2UgcmV0dXJuIHR5cGUgaW4KLQlkZWNsYXJhdGlvbiBjb25zaXN0ZW50IHdpdGggcmV0dXJuIHR5cGUgaW4gZGVmaW5pdGlvbi4KLQotV2VkIEZlYiAxNCAxODoxNDoxMSAxOTk2ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFJlbW92ZSBEYXRhMzIgZnJvbSBwdXNoZiBhbmQgcG9wZi4KLQotVGh1IEZlYiAgOCAxNDoyNzoyMSAxOTk2ICBKYW1lcyBDYXJsc29uIDxjYXJsc29uQHh5bG9naWNzLmNvbT4KLQotCSogaTM4Ni5oIChpMzg2X3JlZ3RhYik6IEFkZCA4MDQ4NiB0ZXN0IHJlZ2lzdGVycy4KLQotTW9uIEZlYiAgNSAxODozNTo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGk5NjAuaCAoSV9IWCk6IERlZmluZS4KLQkoaTk2MF9vcGNvZGVzKTogQWRkIEhYIGluc3RydWN0aW9uLgotCi1Nb24gSmFuIDI5IDEyOjQzOjM5IDE5OTYgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBpMzg2Lmg6IEZpeCB3YWl0aW5nIGZvcm1zIG9mIGZpbml0LCBmc3RlbnYsIGZzYXZlLCBmc3RzdywgZnN0Y3csCi0JYW5kIGZjbGV4LgotCi1XZWQgSmFuIDI0IDIyOjM2OjU5IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCk6IFJlcGxhY2VzIHNwYXJjX2FyY2hpdGVjdHVyZS4KLQkoU1BBUkNfT1BDT0RFX0NPTkZMSUNUX1ApOiBSZW5hbWVkIGZyb20gQVJDSElURUNUVVJFU19DT05GTElDVF9QLgotCShiZmRfKiBkZWZpbmVzKTogRGVsZXRlLgotCShzcGFyY19vcGNvZGVfYXJjaHMpOiBSZXBsYWNlcyBhcmNoaXRlY3R1cmVfcG5hbWUuCi0JKHNwYXJjX29wY29kZV9sb29rdXBfYXJjaCk6IERlY2xhcmUuCi0JKE5VTU9QQ09ERVMpOiBEZWxldGUuCi0KLU1vbiBKYW4gMjIgMDg6MjQ6MzIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKGVudW0gc3BhcmNfYXJjaGl0ZWN0dXJlKTogQWRkIHY5YS4KLQkoQVJDSElURUNUVVJFU19DT05GTElDVF9QKTogVXBkYXRlLgotCi1UaHUgRGVjIDI4IDEzOjI3OjUzIDE5OTUgIEpvaG4gSGFzc2V5ICA8aGFzc2V5QHJ0cC5kZy5jb20+Ci0KLQkqIGkzODYuaDogQWRkZWQgUGVudGl1bSBQcm8gaW5zdHJ1Y3Rpb25zLgotCi1UaHUgTm92ICAyIDIyOjU5OjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBEb2N1bWVudCBuZXcgJ1cnIG9wZXJhbmQgcGxhY2UuCi0KLVR1ZSBPY3QgMjQgMTA6NDk6MTAgMTk5NSAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBocHBhLmg6IEFkZCBsY2kgYW5kIHN5bmNkbWEgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gT2N0IDIzIDExOjA5OjE2IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgotCi0JKiBtaXBzLmg6IEFkZGVkIElOU05fNDEwMCBmbGFnIHRvIG1hcmsgTkVDIFZSNDEwMCBzcGVjaWZpYwotIAlpbnN0cnVjdGlvbnMuCi0KLU1vbiBPY3QgMTYgMTA6Mjg6MTUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMuaCAoUFBDX09QQ09ERV97Q09NTU9OLEFOWX0pOiBOZXcgb3Bjb2RlIGZsYWdzIGZvcgotCWFzc2VtYmxlcidzIC1tY29tIGFuZCAtbWFueSBzd2l0Y2hlcy4KLQotV2VkIE9jdCAxMSAxNjo1NjozMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBGaXggY21weGNoZzhiIGV4dGVuc2lvbiBvcGNvZGUgZGVzY3JpcHRpb24uCi0KLVRodSBPY3QgIDUgMTg6MDM6MzYgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYuaDogQWRkIFBlbnRpdW0gaW5zdHJ1Y3Rpb25zIHdybXNyLCByZHRzYywgcmRtc3IsIGNtcHhjaGc4YiwKLQlhbmQgcmVnaXN0ZXIgY3I0LgotCi1UdWUgU2VwIDE5IDE1OjI2OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBDaGFuZ2UgY29tbWVudDogc3BsaXQgdHlwZSBQIGludG8gdHlwZXMgMCwgMSBhbmQgMi4KLQotV2VkIEF1ZyAzMCAxMzo1MDo1NSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy5oIChzcGFyY197ZW5jb2RlLGRlY29kZX1fcHJlZmV0Y2gpOiBEZWNsYXJlLgotCi1UdWUgQXVnIDI5IDE1OjM0OjU4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKHNwYXJjX3tlbmNvZGUsZGVjb2RlfV97YXNpLG1lbWJhcn0pOiBEZWNsYXJlLgotCi1XZWQgQXVnICAyIDE4OjMyOjE5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4a21yaS5oOiBSZW1vdmUuCi0KLQkqIG02OGsuaDogTW92ZSB0YWJsZXMgaW50byBvcGNvZGVzL202OGstb3BjLmMsIGxlYXZpbmcganVzdCB0aGUKLQlkZWNsYXJhdGlvbnMuICBSZW1vdmUgRl9BTElBUyBhbmQgZmxhZyBmaWVsZCBvZiBzdHJ1Y3QKLQltNjhrX29wY29kZS4gIENoYW5nZSBhcmNoIGZpZWxkIG9mIHN0cnVjdCBtNjhrX29wY29kZSB0byB1bnNpZ25lZAotCWludC4gIE1ha2UgbmFtZSBhbmQgYXJncyBmaWVsZHMgb2Ygc3RydWN0IG02OGtfb3Bjb2RlIGNvbnN0LgotCi1XZWQgQXVnICAyIDA4OjE2OjQ2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLmggKEZfTk9UVjkpOiBEZWZpbmUuCi0KLVR1ZSBKdWwgMTEgMTQ6MjA6NDIgMTk5NSAgSmVmZiBTcGllZ2VsICA8amVmZnNAbHNpbC5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl80MDEwKTogRGVmaW5lLgotCi1XZWQgSnVuIDIxIDE4OjQ5OjUxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG02OGsuaCAoVEJMMSk6IFJldmVyc2Ugc2Vuc2Ugb2YgInJvdW5kIiBhcmd1bWVudCBpbiByZXN1bHQuCi0KLQlDaGFuZ2VzIGZyb20gQW5kcmVhcyBTY2h3YWIgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46Ci0JKiBtNjhrLmg6IEZpeCBhcmd1bWVudCBkZXNjcmlwdGlvbnMgb2YgY29wcm9jZXNzb3IKLQlpbnN0cnVjdGlvbnMgdG8gYWxsb3cgb25seSBhbHRlcmFibGUgb3BlcmFuZHMgd2hlcmUgYXBwcm9wcmlhdGUuCi0JWyFOT19ERUZBVUxUX1NJWkVTXTogQW4gb21pdHRlZCBzaXplIGRlZmF1bHRzIHRvIGB3Jy4KLQkobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBtb3JlIGFsaWFzZXMuCi0KLUZyaSBBcHIgMTQgMjI6MTU6MzQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oOiBBZGRlZCBleHBsY2l0bHkgc2hvcnQtc2l6ZWQgY29uZGl0aW9uYWwgYnJhbmNoZXMsIGFuZCBhCi0JYnVuY2ggb2YgYWxpYXNlcyAoZm1vdiosIGZ0ZXN0KiwgdGRpdnVsKSB0byBzdXBwb3J0IGdjYydzCi0Jc3ZyNC1iYXNlZCBjb25maWd1cmF0aW9ucy4KLQotTW9uIE1hciAxMyAyMTozMDowMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JTW9uIEZlYiAyNyAwODozNjozOSAxOTk1ICBCcnlhbiBGb3JkICA8YmFmb3JkQGNzLnV0YWguZWR1PgotCSogaTM4Ni5oOiBhZGRlZCBtaXNzaW5nIERhdGExNi9EYXRhMzIgZmxhZ3MgdG8gYSBmZXcgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgTWFyICA4IDE1OjE5OjUzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChPUF9NQVNLX0ZSLCBPUF9TSF9GUik6IERlZmluZS4KLQkoT1BfTUFTS19CQ0MsIE9QX1NIX0JDQyk6IERlZmluZS4KLQkoT1BfTUFTS19QUkVGWCwgT1BfU0hfUFJFRlgpOiBEZWZpbmUuCi0JKE9QX01BU0tfQ0NDLCBPUF9TSF9DQ0MpOiBEZWZpbmUuCi0JKElOU05fUkVBRF9GUFJfUik6IERlZmluZS4KLQkoSU5TTl9SRkUpOiBEZWxldGUuCi0KLVdlZCBNYXIgIDggMDM6MTM6MjMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay5oIChlbnVtIG02OGtfYXJjaGl0ZWN0dXJlKTogRGVsZXRlZC4KLQkoc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzKTogTmV3IHR5cGUuCi0JKG02OGtfb3Bjb2Rlcyk6IE5vdyBjb25zdC4gIERlbGV0ZWQgb3Bjb2RlIGFsaWFzZXMgd2l0aCBleGFjdGx5Ci0JbWF0Y2hpbmcgY29uc3RyYWludHMsIHZhbHVlcyBhbmQgZmxhZ3MuICBBcyBhIHNpZGUgZWZmZWN0IG9mIHRoaXMsCi0JdGhlIE1PVE9ST0xBX1NZTlRBWF9PTkxZIGFuZCBNSVRfU1lOVEFYX09OTFkgbWFjcm9zLCB3aGljaCBzbyBmYXIKLQlhcyBJIGtub3cgd2VyZSBuZXZlciB1c2VkLCBub3cgbWF5IG5lZWQgcmUtZXhhbWluaW5nLgotCShudW1vcGNvZGVzKTogTm93IGNvbnN0LgotCShtNjhrX29wY29kZV9hbGlhc2VzLCBudW1hbGlhc2VzKTogTmV3IHZhcmlhYmxlcy4KLQkoZW5kb3ApOiBEZWxldGVkLgotCVtET05UX0RFRklORV9UQUJMRV06IERlY2xhcmUgbnVtb3Bjb2RlcywgbnVtYWxpYXNlcywgYW5kCi0JbTY4a19vcGNvZGVfYWxpYXNlczsgdXBkYXRlIGRlY2xhcmF0aW9uIG9mIG02OGtfb3Bjb2Rlcy4KLQotTW9uIE1hciAgNiAxMDowMjowMCAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChkZWxheV90eXBlKTogRGVsZXRlIHVudXNlZCBlbnVtZXJhdGlvbi4KLQkocGFfb3Bjb2RlKTogUmVwbGFjZSB1bnVzZWQgZGVsYXllZCBmaWVsZCB3aXRoIGFuIGFyY2hpdGVjdHVyZQotCWZpZWxkLgotCShwYV9vcGNvZGVzKTogTWFyayBlYWNoIGluc3RydWN0aW9uIGFzIGVpdGhlciBQQTEuMCBvciBQQTEuMS4KLQotRnJpIE1hciAgMyAxNjoxMDoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoSU5TTl9JU0E0KTogRGVmaW5lLgotCi1GcmkgRmViIDI0IDE5OjEzOjM3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy5oIChNX0RMQV9BQiwgTV9ETEkpOiBEZWZpbmUuCi0KLVRodSBGZWIgMjMgMTc6MzM6MDkgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaCAoZnN0d3gpOiBGaXggc2luZ2xlLWJpdCBlcnJvci4KLQotV2VkIEZlYiAxNSAxMjoxOTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMuaCAoTV9VTEQsIE1fVUxEX0EsIE1fVVNELCBNX1VTRF9BKTogRGVmaW5lLgotCi1Nb24gRmViICA2IDEwOjM1OjIzIDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogaTM4Ni5oOiBhZGRlZCBjcHVpZCBpbnN0cnVjdGlvbiAsIGFuZCBkclswLTddIGFsaWFzZXMgZm9yIHRoZQotCSAgZGVidWcgcmVnaXN0ZXJzLiAgRnJvbSBDaGFybGVzIEhhbm51bSAobXljcm9mdEBuZXRic2Qub3JnKS4KLQotTW9uIEZlYiAgNiAwMzozMTo1NCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JQ2hhbmdlcyBmcm9tIEJyeWFuIEZvcmQgPGJhZm9yZEBzY2hpcmYuY3MudXRhaC5lZHU+IGZvciAxNi1iaXQKLQlpMzg2IHN1cHBvcnQ6Ci0JKiBpMzg2LmggKE1PVl9BWF9ESVNQMzIpOiBOZXcgbWFjcm8uCi0JKGkzODZfb3B0YWIpOiBBZGRlZCBEYXRhMTYgYW5kIERhdGEzMiBhcyBuZWVkZWQuICBBZGRlZCAidyIgZm9ybXMKLQlvZiBzZXZlcmFsIGNhbGwvcmV0dXJuIGluc3RydWN0aW9ucy4KLQkoQUREUl9QUkVGSVhfT1BDT0RFKTogTmV3IG1hY3JvLgotCi1Nb24gSmFuIDIzIDE2OjQ1OjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQlTYXQgSmFuIDIxIDE3OjUwOjM4IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiAuLi9pbmNsdWRlL29wY29kZS92YXguaCAoc3RydWN0IHZvdF93b3QsIGZpZWxkIGBhcmdzJyk6ICBtYWtlCi0JaXQgcG9pbnRlciB0byBjb25zdCBjaGFyOwotCShzdHJ1Y3Qgdm90LCBmaWVsZCBgbmFtZScpOiAgZGl0dG8uCi0KLVRodSBKYW4gMTkgMTQ6NDc6NTMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogdmF4Lmg6IFN1cHBseSBhbmQgcHJvcGVybHkgZ3JvdXAgYWxsIHZhbHVlcyBpbiBlbmQgc2VudGluZWwuCi0KLVR1ZSBKYW4gMTcgMTA6NTU6MzAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBtaXBzLmggKElOU05fSVNBLCBJTlNOXzQ2NTApOiBEZWZpbmUuCi0KLVdlZCBPY3QgMTkgMTM6MzQ6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBhMjlrLmg6IEFkZCBvcGVyYW5kIHR5cGUgJ0knIGZvciBgaW52JyBhbmQgYGlyZXRpbnYnLiAgT24KLQlzeXN0ZW1zIHdpdGggYSBzZXBhcmF0ZSBpbnN0cnVjdGlvbiBhbmQgZGF0YSBjYWNoZSwgc3VjaCBhcyB0aGUKLQkyOTA0MCwgdGhlc2UgaW5zdHJ1Y3Rpb25zIHRha2UgYW4gb3B0aW9uYWwgYXJndW1lbnQuCi0KLVdlZCBTZXAgMTQgMTc6NDQ6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKElOU05fU1RPUkVfTUVNT1JZKTogQ29ycmVjdCB2YWx1ZSB0byBub3QgY29uZmxpY3Qgd2l0aAotCUlOU05fVFJBUC4KLQotVHVlIFNlcCAgNiAxMTozOTowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoSU5TTl9TVE9SRV9NRU1PUlkpOiBEZWZpbmUuCi0KLVRodSBKdWwgMjggMTk6Mjg6MDcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogRG9jdW1lbnQgbmV3IG9wZXJhbmQgdHlwZSAneCcuCi0KLVR1ZSBKdWwgMjYgMTc6NDg6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTk2MC5oIChJX0NYMik6IE5ldyBpbnN0cnVjdGlvbiBjYXRlZ29yeS4gIEl0IGluY2x1ZGVzCi0JaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSBvbiBDeCBhbmQgSnggcHJvY2Vzc29ycy4KLQkoSV9KWCk6IE5ldyBpbnN0cnVjdGlvbiBjYXRlZ29yeSwgZm9yIEpYLW9ubHkgaW5zdHJ1Y3Rpb25zLgotCShpOTYwX29wY29kZXMpOiBQdXQgZXNocm8gYW5kIHN5c2N0bCBpbiBJX0NYMiBjYXRlZ29yeS4gIEFkZGVkCi0JSngtb25seSBpbnN0cnVjdGlvbnMsIGluIElfSlggY2F0ZWdvcnkuCi0KLVdlZCBKdWwgMTMgMTg6NDM6NDcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbnMzMmsuaCAoZW5kb3ApOiBNYWRlIHBvaW50ZXIgY29uc3QgdG9vLgotCi1TdW4gSnVsIDEwIDExOjAxOjA5IDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBuczMyay5oOiBEcm9wIFEgb3BlcmFuZCB0eXBlIGFzIHRoZXJlIGlzIG5vIGNvcnJlY3QgdXNlCi0JZm9yIGl0LiBBZGQgSSBhbmQgWiBvcGVyYW5kIHR5cGVzIHdoaWNoIGFsbG93IGJldHRlciBjaGVja2luZy4KLQotVGh1IEp1bCAgNyAxMjozNDo0OCAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oICh4b3IubCkgOmZpeCBiaXQgcGF0dGVybi4KLQkoTF8yKTogTmV3IHNpemUgb2Ygb3BlcmFuZC4KLQkodHJhcGEpOiBVc2UgaXQuCi0KLUZyaSBKdW4gMTAgMTY6Mzg6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtNjhrLmg6IE1vdmUgInRyYXAiIGJlZm9yZSAidHBjYyIgdG8gY2hhbmdlIGRpc2Fzc2VtYmx5LgotCi1GcmkgSnVuICAzIDE1OjU3OjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IEluY2x1ZGUgdjkgZGVmaW5pdGlvbnMuCi0KLVRodSBKdW4gIDIgMTI6MjM6MTcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChtNjgwNjApOiBEZWZpbmVkLgotCShtNjgwNDB1cCwgbWZsb2F0LCBtbW11KTogSW5jbHVkZSBpdC4KLQkoc3RydWN0IG02OGtfb3Bjb2RlKTogV2lkZW4gYGFyY2gnIGZpZWxkLgotCShtNjhrX29wY29kZXMpOiBVcGRhdGVkIGZvciBNNjgwNjAuICBSZW1vdmVkIGNvbW1lbnRzIHRoYXQgd2VyZQotCWluc3RydWN0aW9ucyBjb21tZW50ZWQgb3V0IGJ5ICJKRiIgeWVhcnMgYWdvLgotCi1UaHUgQXByIDI4IDE4OjMxOjE0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAoc3RydWN0IG02OGtfb3Bjb2RlKTogU2hvcnRlbiBgYXJjaCcgZmllbGQgdG8gOCBiaXRzLCBhbmQKLQlhZGQgYSBvbmUtYml0IGBmbGFncycgZmllbGQuCi0JKEZfQUxJQVMpOiBOZXcgbWFjcm8uCi0KLVdlZCBBcHIgMjcgMTE6Mjk6NTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaCAoZGVjLCBpbmMpOiBHZXQgZW5jb2RpbmcgcmlnaHQuCi0KLU1vbiBBcHIgIDQgMTM6MTI6NDMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaCAoc3RydWN0IHBvd2VycGNfb3BlcmFuZCk6IFJlbW92ZWQgc2lnbmVkcCBmaWVsZDsganVzdCB1c2UKLQlhIGZsYWcgaW5zdGVhZC4KLQkoUFBDX09QRVJBTkRfU0lHTkVEKTogRGVmaW5lLgotCShQUENfT1BFUkFORF9TSUdOT1BUKTogRGVmaW5lLgotCi1UaHUgTWFyIDMxIDE5OjM0OjA4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoSVNfSlVNUF9PTl9FQ1hfWkVSTywgImpjeHoiIHBhdHRlcm4pOiBPcGVyYW5kIHNpemUKLQlwcmVmaXggaXMgMHg2Niwgbm90IDB4NjcuICBQYXRjaCBmcm9tIEguSi4gTHUgKGhsdUBueW5leHN0LmNvbSkuCi0KLVRodSBNYXIgIDMgMTU6NTE6MDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBSZXZlcnNlIGxhc3QgY2hhbmdlLiAgSXQnbGwgYmUgaGFuZGxlZCBpbiBnYXMgaW5zdGVhZC4KLQotVGh1IEZlYiAyNCAxNToyOTowNSAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKHNhcik6IERpc2FibGVkIHRoZSB0d28tb3BlcmFuZCBJbW0xIGZvcm0sIHNpbmNlIGl0IHdhcwotCXNsb3dlciBvbiB0aGUgNDg2IGFuZCB1c2VkIHRoZSBpbXBsaWNpdCBzaGlmdCBjb3VudCBkZXNwaXRlIHRoZQotCWV4cGxpY2l0IG9wZXJhbmQuICBUaGUgb25lLW9wZXJhbmQgZm9ybSBpcyBzdGlsbCBhdmFpbGFibGUgdG8gZ2V0Ci0JdGhlIHNob3J0ZXIgZm9ybSB3aXRoIHRoZSBpbXBsaWNpdCBzaGlmdCBjb3VudC4KLQotVGh1IEZlYiAxNyAxMjoyNzo1MiAxOTk0ICBUb3Jiam9ybiBHcmFubHVuZCAgKHRlZ2VAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBocHBhLmg6IEZpeCB0eXBvIGluIGZzdHdzIGFyZyBzdHJpbmcuCi0KLVdlZCBGZWIgIDkgMjE6MjM6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMuaCAoc3RydWN0IHBvd2VycGNfb3Bjb2RlKTogTWFrZSBvcGVyYW5kcyBmaWVsZCB1bnNpZ25lZC4KLQotTW9uIEZlYiAgNyAxOToxNDo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oIChQUENfT1BDT0RFXzYwMSk6IERlZmluZS4KLQotRnJpIEZlYiAgNCAyMzo0Mzo1MCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oIChhZGRiKTogVXNlICdAJyBmb3IgYWRkYiBhbmQgYWRkaWIgcHNldWRvIG9wcy4KLQkoc28gd2UgY2FuIGRldGVybWluZSB2YWxpZCBjb21wbGV0ZXJzIGZvciBib3RoIGFkZGIgYW5kIGFkZGJbdGZdLikKLQotCSogaHBwYS5oICh4bXB5dSk6IE5vIGZsb2F0aW5nIHBvaW50IGZvcm1hdCBzcGVjaWZpZXIgZm9yIHRoZQotCXhtcHl1IGluc3RydWN0aW9uLgotCi1GcmkgRmViICA0IDIzOjM2OjUyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLmggKFBQQ19PUEVSQU5EX05FWFQpOiBEZWZpbmUuCi0JKFBQQ19PUEVSQU5EX05FR0FUSVZFKTogQ2hhbmdlIHZhbHVlIHRvIG1ha2Ugcm9vbSBmb3IgYWJvdmUuCi0JKHN0cnVjdCBwb3dlcnBjX21hY3JvKTogRGVmaW5lLgotCShwb3dlcnBjX21hY3JvcywgcG93ZXJwY19udW1fbWFjcm9zKTogRGVjbGFyZS4KLQotRnJpIEphbiAyMSAxOToxMzo1MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy5oOiBOZXcgZmlsZS4gIEhlYWRlciBmaWxlIGZvciBQb3dlclBDIG9wY29kZSB0YWJsZS4KLQotTW9uIEphbiAxNyAwMDoxNDoyMyAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS5oOiBNb3JlIG1pbm9yIHRlbXBsYXRlIGZpeGVzIGZvciBzZnUgYW5kIGNvcHIgKHRvIGFsbG93Ci0JZm9yIGVhc2llciBkaXNhc3NlbWJseSkuCi0KLQkqIGhwcGEuaDogRml4IHRlbXBsYXRlcyBmb3IgYWxsIHRoZSBzZnUgYW5kIGNvcHIgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgRGVjIDE1IDE1OjEyOjQyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAocHVzaCk6IFBlcm1pdCBJbW0xNiBvcGVyYW5kIHRvby4KLQotU2F0IERlYyAxMSAxNjoxNDowNiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogIGg4MzAwLmggKGFuZGMpOiBFeGlzdHMgaW4gYmFzZSBhcmNoLgotCi1XZWQgRGVjICAxIDEyOjE1OjMyIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBGcm9tIEhpc2FzaGkgTUlOQU1JTk8gPG1pbmFtaW5vQHNyYW1oYy5zcmEuY28uanA+Ci0JKiBocHBhLmg6ICN1bmRlZiBOT05FIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggaGl1eCBpbmNsdWRlIGZpbGVzLgotCi1TdW4gTm92IDIxIDIyOjA2OjU3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmg6IEFkZCBGUCBxdWFkd29yZCBzdG9yZSBpbnN0cnVjdGlvbnMuCi0KLVdlZCBOb3YgMTcgMTc6MTM6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IChNX0pfQSk6IEFkZGVkLgotCShNX0xBKTogUmVtb3ZlZC4KLQotTW9uIE5vdiAgOCAxMjoxMjo0NyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoT1BfTUFTS19DQUNIRSwgT1BfU0hfQ0FDSEUpOiBEZWZpbmUuICBGcm9tIFRlZCBMZW1vbgotCTxtZWxsb25AcGVwcGVyLm5jZC5jb20+LgotCi1TdW4gTm92ICA3IDAwOjMwOjExIDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmg6IEltbWVkaWF0ZSBmaWVsZCBpbiBwcm9iZWkgaW5zdHJ1Y3Rpb25zIGlzIHVuc2lnbmVkLAotCW5vdCBsb3ctc2lnbiBleHRlbmRlZC4KLQotV2VkIE5vdiAgMyAxMDozMDowMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oIChSUkkxME1BU0spOiBDaGFuZ2UgZnJvbSAweGZjMDBmZmUwIHRvIDB4ZmMwMGZjMDAuCi0KLVR1ZSBOb3YgIDIgMTI6NDE6MzAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogQWRkICJmeGNoIiB3aXRob3V0IG9wZXJhbmQuCi0KLU1vbiBOb3YgIDEgMTg6MTM6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmggKE1fSkFMXzEsIE1fSkFMXzIsIE1fSkFMX0EpOiBBZGRlZC4KLQotU2F0IE9jdCAgMiAyMjoyNjoxMSAxOTkzICBKZWZmcmV5IEEgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLmg6IEFkZCBnZncgYW5kIGdmciB0byB0aGUgb3Bjb2RlIHRhYmxlLgotCi1XZWQgU2VwIDI5IDE2OjIzOjAwIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oOiBleHRlbmRlZCB0byBoYW5kbGUgbTg4MTEwLgotCi1UdWUgU2VwIDI4IDE5OjE5OjA4IDE5OTMgIEplZmZyZXkgQSBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEuaCAoYmUsIGJsZSk6IFVzZSBvcGVyYW5kIHR5cGUgJ3onIHRvIGRlbm90ZSBhYnNvbHV0ZSBicmFuY2gKLQlhZGRyZXNzZXMuCi0KLVR1ZSBTZXAgMTQgMTQ6MDQ6MzUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBpOTYwLmggKGk5NjBfb3Bjb2Rlcyk6IFByb3Blcmx5IGJyYWNrZXQgaW5pdGlhbGl6ZXJzLgotCi1Nb24gU2VwIDEzIDEyOjUwOjUyIDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oIChCT0ZMQUcpOiByZXdyaXRlIHRvIGF2b2lkIG5lc3RlZCBjb21tZW50LgotCi1Nb24gU2VwIDEzIDE1OjQ2OjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oICh0d28pOiBQcm90ZWN0IHNlY29uZCBhcmd1bWVudCB3aXRoIHBhcmVudGhlc2VzLgotCi1GcmkgU2VwIDEwIDE2OjI5OjQ3IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkZWQgbmV3IGluc3RydWN0aW9uICJyc20iIChmb3IgaTM4NnNsKS4KLQlEZWxldGVkIG9sZCBpbi9vdXQgaW5zdHJ1Y3Rpb25zIGluICIjaWYgMCIgc2VjdGlvbi4KLQotVGh1IFNlcCAgOSAxNzo0MjoxOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYik6IFByb3Blcmx5IGJyYWNrZXQgaW5pdGlhbGl6ZXJzLgotCi1XZWQgQXVnIDI1IDEzOjUwOjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS5oIChwYV9vcGNvZGUpOiBVc2UgJ3wnIGZvciBtb3ZiIGFuZCBtb3ZpYiBpbnNucy4gIChGcm9tCi0JSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdSkuCi0KLU1vbiBBdWcgMjMgMTY6NTU6MDMgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBpMzg2LmggKGxjYWxsKTogQWNjZXB0IEltbTMyIG9wZXJhbmQgYWxzby4KLQotTW9uIEF1ZyAyMyAxMjo0MzoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoTV9BQlNVKTogUmVtb3ZlZCAoYWJzb2x1dGUgdmFsdWUgb2YgdW5zaWduZWQgbnVtYmVyPz8pLgotCShNX0RBQlMpOiBBZGRlZC4KLQotVGh1IEF1ZyAxOSAxNTowODozNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaCAoSU5TTl8qKTogQ2hhbmdlZCB2YWx1ZXMuICBSZW1vdmVkIHVudXNlZCBkZWZpbml0aW9ucy4KLQlBZGRlZCBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWSwgSU5TTl9JU0EyIGFuZCBJTlNOX0lTQTMuICBTcGxpdAotCUlOU05fTE9BRF9ERUxBWSBpbnRvIElOU05fTE9BRF9NRU1PUllfREVMQVkgYW5kCi0JSU5TTl9MT0FEX0NPUFJPQ19ERUxBWS4gIFNwbGl0IElOU05fQ09QUk9DX0RFTEFZIGludG8KLQlJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZIGFuZCBJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkuCi0JKE1fKik6IEFkZGVkIG5ldyB2YWx1ZXMgZm9yIHI2MDAwIGFuZCByNDAwMCBtYWNyb3MuCi0JKEFOWV9ERUxBWSk6IFJlbW92ZWQuCi0KLVdlZCBBdWcgMTggMTU6Mzc6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLmg6IEFkZGVkIE1fTElfUyBhbmQgTV9MSV9TUy4KLQotVHVlIEF1ZyAxNyAwNzowODowOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBHZXQgc29tZSByYXJlIG1vdi5icyBjb3JyZWN0LgotCi1UaHUgQXVnICA1IDA5OjE1OjE3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiBEb24ndCBkZWZpbmUgY29uc3Qgb3Vyc2VsZjsgcmVseSBvbiBhbnNpZGVjbC5oIGhhdmluZwotCWJlZW4gaW5jbHVkZWQuCi0KLUZyaSBKdWwgMzAgMTg6NDE6MTEgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKEZfSlNSLCBGX1VOQlIsIEZfQ09OREJSKTogIEFkZCBuZXcgZmxhZ3MgdG8gbWFyawotCWp1bXAgaW5zdHJ1Y3Rpb25zLCBmb3IgdXNlIGluIGRpc2Fzc2VtYmxlcnMuCi0KLVRodSBKdWwgMjIgMDc6MjU6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtODhrLmg6IE1ha2UgYml0ZmllbGRzIGp1c3QgdW5zaWduZWQsIG5vdCB1bnNpZ25lZCBsb25nIG9yCi0JdW5zaWduZWQgc2hvcnQuCi0KLVdlZCBKdWwgMjEgMTE6NTU6MzEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogTmV3IGFyZ3VtZW50IHR5cGUgJ3knLiAgVXNlIGluIHZhcmlvdXMgZmxvYXQgaW5zdHJ1Y3Rpb25zLgotCi1Nb24gSnVsIDE5IDE3OjE3OjAzIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocHBhLmggKGJyZWFrKTogRmlyc3QgaW1tZWRpYXRlIGZpZWxkIGlzIHVuc2lnbmVkLgotCi0JKiBocHBhLmg6IEFkZCByZmlyIGluc3RydWN0aW9uLgotCi1TdW4gSnVsIDE4IDE2OjI4OjA4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiBTcGxpdCB0aGUgYWN0dWFsIHRhYmxlIG91dCBpbnRvIC4uLy4uL29wY29kZXMvbWlwcy1vcGMuYy4KLQotRnJpIEp1bCAxNiAwOTo1OToyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogUmV3b3JrZWQgdGhlIGhhemFyZCBpbmZvcm1hdGlvbiBzb21ld2hhdCwgYW5kIGZpeGVkIHNvbWUKLQlidWdzIGluIHRoZSBpbnN0cnVjdGlvbiBoYXphcmQgZGVzY3JpcHRpb25zLgotCi1UaHUgSnVsIDE1IDEyOjQyOjAxIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay5oOiBDb3JyZWN0ZWQgYSBjb3VwbGUgb2Ygb3Bjb2Rlcy4KLQotVHVlIEp1bCAgNiAxNToxNzozNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogUmVwbGFjZWQgd2l0aCB2ZXJzaW9uIGZyb20gUmFscGggQ2FtcGJlbGwgYW5kIE9TRi4gIFRoZQotCW5ldyB2ZXJzaW9uIGluY2x1ZGVzIGluc3RydWN0aW9uIGhhemFyZCBpbmZvcm1hdGlvbiwgYnV0IGlzCi0Jb3RoZXJ3aXNlIHJlYXNvbmFibHkgc2ltaWxhci4KLQotVGh1IEp1bCAgMSAyMDozNjoxNyAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBGaXggdHlwbyBpbiBVTk9QMyAoYWZmZWN0ZWQgc2hbYWxdW2xyXS5sKS4KLQotRnJpIEp1biAxMSAxODozODo0NCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCVBhdGNoZXMgZnJvbSBKZWZmIExhdywgbGF3QGNzLnV0YWguZWR1OgotCSogaHBwYS5oOiBDbGVhbiB1cCBzb21lIG9mIHRoZSBPTERfVEFCTEUsIG5vbi1PTERfVEFCTEUgYnJhaW5kYW1hZ2UuCi0JTWFrZSB0aGUgdGFibGVzIGJlIHRoZSBzYW1lIGZvciB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uczoKLQkiYmIiLCAiYWRkYlt0Zl0iLCAiYWRkaWJbdGZdIiwgImFkZCIsICJhZGRbbG9jXSIsICJhZGRjbyIsCi0JInNoWzEyM11hZGQiLCAic2hbMTIzXWFkZFtsb10iLCAic3ViIiwgInN1YltvYnRdIiwgInN1YltidF1vIiwKLQkiZHMiLCAiY29tY2xyIiwgImFkZGkiLCAiYWRkaVtvdF0iLCAiYWRkaXRvIiwgInN1YmkiLCAic3ViaW8iLAotCSJjb21pY2xyIiwgImZhZGQiLCAiZnN1YiIsICJmbXB5IiwgImZkaXYiLCAiZnNxcnQiLCAiZmFicyIsCi0JImZybmQiLCAiZmNweSIsICJmY252ZmYiLCAiZmNudnhmIiwgImZjbnZmeCIsICJmY252Znh0IiwKLQkiZmNtcCIsIGFuZCAiZnRlc3QiLgotCi0JKiBocHBhLmg6IE1ha2UgbmV3IGFuZCBvbGQgdGFibGVzIHRoZSBzYW1lIGZvciAiYnJlYWsiLCAibXRjdGwiLAotCSJtZmN0bCIsICJiYiIsICJzc20iLCAicnNtIiwgInhtcHl1IiwgImZtcHlhZGQiLCAiZm1weXN1YiIuCi0JRml4IHR5cG8gaW4gbGFzdCBwYXRjaC4gIENvbGxhcHNlIHNldmVyYWwgI2lmZGVmcyBpbnRvIGEKLQlzaW5nbGUgI2lmZGVmLgotCi0JKiBocHBhLmg6IERlbGV0ZSByZW1haW5pbmcgT0xEX1RBQkxFIGNvZGUuICBCcmluZyBzb21lCi0Jb2YgdGhlIGNvbW1lbnRzIHVwLXRvLWRhdGUuCi0KLQkqIGhwcGEuaDogVXBkYXRlICJmcmVlIGxpc3QiIG9mIGxldHRlcnMgYW5kIHVwZGF0ZQotCWNvbW1lbnRzIGRlc2NyaWJpbmcgZWFjaCBsZXR0ZXIncyBmdW5jdGlvbi4KLQotRnJpIEp1biAgNCAxNTo0MTozNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiBjaGVja3BvaW50LCBpbmNsdWRlcyBIOC8zMDAtSCBvcGNvZGVzLgotCi1UaHUgSnVuICAzIDE1OjQyOjU5IDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIFBhdGNoZXMgZnJvbSBKZWZmcmV5IExhdyA8bGF3QGNzLnV0YWguZWR1Pi4KLQkqIGhwcGEuaDogUmV3b3JrIHNpbmdsZSBwcmVjaXNpb24gRlAKLQlpbnN0cnVjdGlvbnMgc28gdGhhdCB0aGV5IGNvcnJlY3RseSBkaXNhc3NlbWJsZSBjb2RlCi0JUEExLjEgY29kZS4KLQotVGh1IE1heSAyNyAxOToyMToyMiAxOTkzICBCcnVjZSBCYXVtYW4gIChib290QG9zZi5vcmcpCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYiwgbW92IHBhdHRlcm4pOiBSZW1vdmUgTWVtMTYgcmVzdHJpY3Rpb24gZnJvbQotCW1vdiB0byBhbGxvdyBpbnN0cnVjdGlvbnMgbGlrZSBtb3Ygc3MseHl6KGVjeCkgdG8gYXNzZW1ibGUuCi0KLVR1ZSBNYXkgMjUgMDA6Mzk6NDAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGhwcGEuaDogVXNlIG5ldyB2ZXJzaW9uIGZyb20gVXRhaCBpZiBPTERfVEFCTEUgaXNuJ3QgZGVmaW5lZDsKLQlnZGIgd2lsbCBkZWZpbmUgaXQgZm9yIG5vdy4KLQotTW9uIE1heSAyNCAxNToyMDowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IERvbid0IGVuZCBlbnVtZXJhdG9yIGxpc3Qgd2l0aCBjb21tYS4KLQotRnJpIE1heSAxNCAxNToxNTo1MCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIEJhc2VkIG9uIHBhdGNoZXMgZnJvbSBkYXZpZGpASUNTSS5CZXJrZWxleS5FRFUgKERhdmlkIEpvaG5zb24pOgotCSogbWlwcy5oIChPUF9NQVNLX0NPUFosIE9QX1NIX0NPUFopOiBEZWZpbmUuCi0JKCJiYzJ0Iik6IENvcnJlY3QgdHlwby4KLQkoIltsc113Y1swMjNdIik6IFVzZSBUIHJhdGhlciB0aGFuIHQuCi0JKCJjWzAxMjNdIik6IERlZmluZSBnZW5lcmFsIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy4KLQotTW9uIE1heSAxMCAwNjowMjoyNSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBNb3ZlIHNwbGl0IHBvaW50IGZvciBnY2MgY29tcGlsYXRpb24gbW9yZSB0b3dhcmRzCi0JbWlkZGxlLgotCi1GcmkgQXByICA5IDEzOjI2OjE2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBjeWdudXMuY29tKQotCi0JKiByczZrLmg6IENsZWFuIHVwIGluc3RydWN0aW9ucyBmb3IgcHJpbWFyeSBvcGNvZGUgMTkgKG1hbnkgd2VyZQotCXNpbXBseSB3cm9uZywgaWNzLCByZmksICYgcmZzdmMgd2VyZSBtaXNzaW5nKS4KLQlBZGQgImEiIHRvIG9wcl9leHQgZm9yICJiYiIuICBEb2MgZml4LgotCi1UaHUgTWFyIDE4IDEzOjQ1OjMxIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiAgNDg2IGV4dGVuc2lvbnMgZnJvbSBKb2huIEhhc3NleSAoaGFzc2V5QGRnLXJ0cC5kZy5jb20pLgotCSogbWlwcy5oOiAgQWRkIGNhc3RzLCB0byBzdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBzaGlmdGluZyB0b28gbXVjaC4KLQkqIG02OGsuaDogIERvY3VtZW50IHRoZSBwbGFjZW1lbnQgY29kZSAnOScuCi0KLVRodSBGZWIgMTggMDI6MDM6MTQgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIG02OGsuaCAoQlJFQUtfVVBfQklHX0RFQ0wsIEFORF9PVEhFUl9QQVJUKTogIEFkZCBrbHVkZ2Ugd2hpY2gKLQlhbGxvd3MgY2FsbGVycyB0byBicmVhayB1cCB0aGUgbGFyZ2UgaW5pdGlhbGl6ZWQgc3RydWN0IGZ1bGwgb2YKLQlvcGNvZGVzIGludG8gdHdvIGhhbGYtc2l6ZWQgb25lcy4gIFRoaXMgcGVybWl0cyBHQ0MgdG8gY29tcGlsZQotCXRoaXMgbW9kdWxlLCBzaW5jZSBpdCB0YWtlcyBleHBvbmVudGlhbCBzcGFjZSBmb3IgaW5pdGlhbGl6ZXJzLgotCShudW1vcGNvZGVzLCBlbmRvcCk6ICBSZXZpc2UgdG8gdXNlIEFORF9PVEhFUl9QQVJUIGluIHNpemUgY2FsY3MuCi0KLVRodSBGZWIgIDQgMDI6MDY6NTYgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIGEyOWsuaDogIFJlbW92ZSBSQ1MgY3J1ZCwgdXBkYXRlIEdQTCB0byB2MiwgdXBkYXRlIGNvcHlyaWdodHMuCi0JKiBjb252ZXguaDogIEFkZGVkLCBmcm9tIEdEQidzIGNvbnZ4LW9wY29kZS5oLiAgQWRkZWQgQ09OU1QgdG8gYWxsCi0JaW5pdGlhbGl6ZWQgc3RydWN0cyBpbiBpdC4KLQotVGh1IEphbiAyOCAyMTozMjoyMiAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCURlbHRhIDg4IGNoYW5nZXMgaW5zcGlyZWQgYnkgQ2FybCBHcmVjbywgPGNncmVjb0BDcmVpZ2h0b24uRWR1PjoKLQkqIG04OGsuaCAoUE1FTSk6ICBBdm9pZCBwcmV2aW91cyBkZWZpbml0aW9uIGZyb20gPHN5cy9wYXJhbS5oPi4KLQkoQU5EKTogIENoYW5nZSB0byBBTkRfIHRvIGF2b2lkIGFuc2lkZWNsLmggYEFORCcgY29uZmxpY3QuCi0KLVNhdCBKYW4gMjMgMTg6MTA6NDkgUFNUIDE5OTMgIFJhbHBoIENhbXBiZWxsICAocmFscGhjQHB5cmFtaWQuY29tKQotCi0JKiBtaXBzLmg6IGRvY3VtZW50ICJpIiBhbmQgImoiIG9wZXJhbmRzIGNvcnJlY3RseS4KLQotVGh1IEphbiAgNyAxNTo1ODoxMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogUmVtb3ZlZCBlbmRpYW5uZXNzIGRlcGVuZGVuY3kuCi0KLVN1biBKYW4gIDMgMTQ6MTM6MzUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6IGluY2x1ZGUgaW5mbyBvbiBudW1iZXIgb2YgY3ljbGVzIHBlciBpbnN0cnVjdGlvbi4KLQotTW9uIERlYyAyMSAyMToyOTowOCAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBocHBhLmg6ICBNb3ZlIGhhbmR5IGFsaWFzZXMgdG8gdGhlIGZyb250LiAgRml4IG1hc2tzIGZvciBleHRyYWN0Ci0JYW5kIGRlcG9zaXQgaW5zdHJ1Y3Rpb25zLgotCi1TYXQgRGVjIDEyIDE2OjA5OjQ4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBhY2NlcHQgc2hsZCBhbmQgc2hyZCBib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlIHNoaWZ0Ci0JY291bnQgYXJndW1lbnQsIHdoaWNoIGlzIGFsd2F5cyAlY2wuCi0KLUZyaSBOb3YgMjcgMTc6MTM6MTggMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuIGF0IGN5Z251cy5jb20pCi0KLQkqIGkzODYuaCAoaTM4Nl9vcHRhYl9lbmQsIGkzODZfcmVndGFiX2VuZCk6IE5vdyBjb25zdC4KLQkob25lX2J5dGVfc2VnbWVudF9kZWZhdWx0cywgdHdvX2J5dGVfc2VnbWVudF9kZWZhdWx0cywKLQlpMzg2X3ByZWZpeHRhYl9lbmQpOiBEaXR0by4KLQotTW9uIE5vdiAyMyAxMDo0NzoyNSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogdmF4LmggKGJiKik6IFVzZSAidiIgKGJpdGZpZWxkIHR5cGUpLCBub3QgImEiIChhZGRyZXNzIG9wZXJhbmQpCi0JZm9yIG9wZXJhbmQgMjsgZnJvbSBKb2huIENhcnIsIGpmY0Bkc2cuZGVjLmNvbS4KLQotV2VkIE5vdiAgNCAwNzozNjo0OSAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBEZWZpbmUgRklYRURfU0laRV9CUkFOQ0gsIHNvIGJzciBhbmQgYnJhIGluc3RydWN0aW9ucwotCWFsd2F5cyB1c2UgMTYtYml0IG9mZnNldHMuICBNYWtlcyBjYWxjdWxhdGVkLXNpemUganVtcCB0YWJsZXMKLQlmZWFzaWJsZS4KLQotRnJpIE9jdCAxNiAyMjo1Mjo0MyAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3lnbnVzLmNvbSkKLQotCSogaTM4Ni5oOiBGaXggb25lLW9wZXJhbmQgZm9ybXMgb2YgaW4qIGFuZCBvdXQqIHBhdHRlcm5zLgotCi1UdWUgU2VwIDIyIDE0OjA4OjE0IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBBZGRlZCBDUFUzMiBzdXBwb3J0LgotCi1UdWUgU2VwIDIyIDAwOjM4OjQxIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBtaXBzLmggKGJyZWFrKTogIERpc2Fzc2VtYmxlIHRoZSBhcmd1bWVudC4gIFBhdGNoIGZyb20KLQlqb25hdGhhbkBjcy5zdGFuZm9yZC5lZHUgKEpvbmF0aGFuIFN0b25lKS4KLQotV2VkIFNlcCAgOSAxMToyNToyOCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogbWVyZ2VkIE1vdG9yb2xhIGFuZCBNSVQgc3ludGF4LgotCi1UaHUgU2VwICAzIDA5OjMzOjIyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBtNjhrLmggKHBtb3ZlKTogbWFrZSB0aGUgdGVzdHMgbGVzcyBzdHJpY3QsIHRoZSA2OGsgYm9vayBpcwotCXdyb25nLgotCi1UdWUgQXVnIDI1IDIzOjI1OjE5IDE5OTIgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChtNjhlYzAzMCk6IERlZmluZWQgYXMgYWxpYXMgZm9yIDY4MDMwLgotCShtNjhrX29wY29kZXMpOiBOZXcgdHlwZSBjaGFyYWN0ZXJzICIzIiBmb3IgNjgwMzAgTU1VIHJlZ3MgYW5kICJ0IgotCWZvciBpbW1lZGlhdGUgMC03IGFkZGVkLiAgU2V0IHVwIHNvbWUgb3Bjb2RlcyAocHRlc3QsIGJrcHQpIHRvIHVzZQotCXRoZW0uICBUaWdodGVuZWQgZGVzY3JpcHRpb24gb2YgImZtb3ZleCIgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbQotCXNvbWUgInBtb3ZlIiBlbmNvZGluZ3MuICBBZGRlZCAicG1vdmUiIGZvciA2ODAzMCBNTVUgcmVncywgY2xlYW5lZAotCXVwIGRlc2NyaXB0aW9ucyB0aGF0IGNsYWltZWQgdmVyc2lvbnMgd2VyZSBhdmFpbGFibGUgZm9yIGNoaXBzIG5vdAotCXN1cHBvcnRpbmcgdGhlbS4gIEFkZGVkICJwbW92ZWZkIi4KLQotTW9uIEF1ZyAyNCAxMjowNDo1MSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oOiBmaXggd2hlcmUgdGhlIC4gZ29lcyBpbiBkaXZ1bGwKLQotV2VkIEF1ZyAxOSAxMToyMjoyNCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogdGhlIGNhczIgaW5zdHJ1Y3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbiB3aXRoCi0JaW5kaXJlY3Rpb24gb24gdGhlIGxhc3QgdHdvIG9wZXJhbmRzLCB3aGljaCBjYW4gYmUgZWl0aGVyIGRhdGEgb3IKLQlhZGRyZXNzIHJlZ2lzdGVycy4gIEFkZGVkIGEgbmV3IG9wZXJhbmQgdHlwZSAncicgd2hpY2ggYWNjZXB0cwotCWVpdGhlciByZWdpc3RlciB0eXBlLiAgQWRkZWQgbmV3IGNhc2VzIGZvciBjYXMybCBhbmQgY2FzMncgd2hpY2gKLQl1c2UgdGhlbS4gIENvcnJlY3RlZCBtYXNrcyBmb3IgY2FzMiB3aGljaCBmYWlsZWQgdG8gcmVjb2duaXplIHVzZQotCW9mIGFkZHJlc3MgcmVnaXN0ZXIuCi0KLUZyaSBBdWcgMTQgMTQ6MjA6MzggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIG02OGsuaDogIE1lcmdlZCBpbiBwYXRjaGVzIChtb3N0bHkgbTY4MDQwLXNwZWNpZmljKSBmcm9tCi0JQ29saW4gU21pdGggPGNvbGluQHdycy5jb20+LgotCi0JKiBtNjhrLmg6ICBNZXJnZWQgbTY4a21yaS5oIGFuZCBtNjhrLmggKHVzaW5nIHRoZSBmb3JtZXIgYXMgYQotCWJhc2UpLiAgQWxzbyBjbGVhbmVkIHVwIGR1cGxpY2F0ZXMsIHJlLW9yZGVyZWQgaW5zdHJ1Y3Rpb25zIGZvcgotCXRoZSBzYWtlIG9mIGRpcy1hc3NlbWJsaW5nIChzbyBhbGlhc2VzIGNvbWUgYWZ0ZXIgc3RhbmRhcmQgbmFtZXMpLgotCSogbTY4a21yaS5oOiBOb3cganVzdCBkZWZpbmVzIHNvbWUgbWFjcm9zLCBhbmQgI2luY2x1ZGVzIG02OGsuaC4KLQotV2VkIEF1ZyAxMiAxNjozODoxNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbTY4a21yaS5oOiBhZGRlZCB2YXJpb3VzIG9wY29kZXMuIE1vdmVkIGpieHggdG8gYnh4ZXMuIEZpbGxlZCBpbgotCWFsbCBtaXNzaW5nIC5zCi0KLU1vbiBBdWcgMTAgMjM6MjI6MzMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IE1vdmVkIHRhYmxlcyB0byBCRkQgbGlicmFyeS4KLQotCSogaTM4Ni5oIChpMzg2X29wdGFiKTogQWRkIGZpbGRxLCBmaXN0cHEgYWxpYXNlcyB1c2VkIGJ5IGdjYy4KLQotU3VuIEp1biAyOCAxMzoyOTowMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAuaDogIEZpbmlzaCBmaWxsaW5nIGluIGFsbCB0aGUgaG9sZXMgaW4gdGhlIG9wY29kZSB0YWJsZSwKLQlzbyB0aGF0IHRoZSBMdWNpZCBDIGNvbXBpbGVyIGNhbiBkaWdlc3QgdGhpcyBhcyB3ZWxsLi4uCi0KLUZyaSBKdW4gMjYgMjE6Mjc6MTcgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogIEFkZCBzZXRjLCBzZXRuYywgYWRkcjE2LCBkYXRhMTYsIHJlcHosIHJlcG56IGFsaWFzZXMuCi0JRml4IG9wY29kZXMgb24gdmFyaW91cyBzaXplcyBvZiBmaWxkL2Zpc3QgaW5zdHJ1Y3Rpb25zCi0JKDE2Yml0PW5vIHN1ZmZpeCwgMzJiaXQ9ImwiIHN1ZmZpeCwgNjRiaXQ9ImxsIiBzdWZmaXgpLgotCVVzZSB0YWJzIHRvIGluZGVudCBmb3IgY29tbWVudHMuICBGaXhlcyBzdWdnZXN0ZWQgYnkgTWluaCBUcmFuLUxlLgotCi1UaHUgSnVuIDI1IDE2OjEzOjI2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLmg6ICBGaWxsIGluIGFsbCB0aGUgaG9sZXMgaW4gdGhlIG9wY29kZSB0YWJsZSBzbyB0aGF0IHRoZQotCWxvc2luZyBIUFVYIEMgY29tcGlsZXIgY2FuIGRpZ2VzdCB0aGlzLi4uCi0KLVRodSBKdW4gMTEgMTI6MTU6MjUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogIEZpeCBkZWNvZGluZyBvZiBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMsIHNvbWV3aGF0LgotCShGaXggYnkgRXJpYyBBbmRlcnNvbiwgM2plYW5AbWFhcy1uZW90ZWsuYXJjLm5hc2EuZ292LikKLQotVGh1IE1heSAyOCAxMToxNzo0NCAxOTkyICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IEFkZCBuZXcgYXJjaGl0ZWN0dXJlIHZhcmlhbnQgc3BhcmNsaXRlOyBhZGQgaXRzIHNjYW4KLQlhbmQgZGl2c2NjIG9wY29kZXMuICBEZWZpbmUgQVJDSElURUNUVVJFU19DT05GTElDVF9QIG1hY3JvLgotCi1UdWUgTWF5ICA1IDE0OjIzOjI3IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5oOiAgQWRkIHNvbWUgbW9yZSBvcGNvZGUgc3lub255bXMgKGZyb20gRnJhbmsgWWVsbGluLAotCWZ5QGx1Y2lkLmNvbSkuCi0KLVRodSBBcHIgMTYgMTg6MjU6MjYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIHJzNmsuaDogIE5ldyB2ZXJzaW9uIGZyb20gSUJNIChNZXRpbikuCi0KLVRodSBBcHIgIDkgMDA6MzE6MTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiByczZrLmg6IEZpeCBpbmNvcnJlY3QgZXh0ZW5kZWQgb3Bjb2RlIGZvciBpbnN0cnVjdGlvbnMgYGZtJwotICAgICAgICBhbmQgYGZkJy4gIChGcm9tIG1ldGluQGlibXBhLmF3ZHBhLmlibS5jb20gKE1ldGluIEcuIE96aXNpaykuKQotCi1UdWUgQXByICA3IDEzOjM4OjQ3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJzNmsuaDogIE1vdmUgZnJvbSAuLi8uLi9nZGIvcnM2ay1vcGNvZGUuaC4KLQotRnJpIEFwciAgMyAxMTozMDoyMCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbTY4ay5oIChvbmUsIHR3byk6ICBDYXN0IG1hY3JvIGFyZ3MgdG8gdW5zaWduZWQgdG8gc3VwcHJlc3MKLQljb21wbGFpbnRzIGZyb20gY29tcGlsZXIgYW5kIGxpbnQgYWJvdXQgaW50ZWdlciBvdmVyZmxvdyBkdXJpbmcKLQlzaGlmdC4KLQotU3VuIE1hciAyOSAxMjoyMjowOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAoT1ApOiAgQXZvaWQgc2lnbmVkIG92ZXJmbG93IHdoZW4gc2hpZnRpbmcgdG8gaGlnaCBvcmRlciBiaXQuCi0KLUZyaSBNYXIgIDYgMDA6MjI6MzggMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIG1pcHMuaDogIE1ha2UgYml0ZmllbGQgbGF5b3V0IGRlcGVuZCBvbiB0aGUgSE9TVCBjb21waWxlciwKLQlub3Qgb24gdGhlIFRBUkdFVCBzeXN0ZW0uCi0KLUZyaSBGZWIgMjEgMDE6Mjk6NTEgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGkzODYuaDogYWRkZWQgaW5iLCBpbncsIG91dGIsIG91dHcgb3Bjb2RlcywgYWRkZWQgYXR0IHN5bnRheCBmb3IKLQkgIHNjbXAsIHNsb2QsIHNtb3YsIHNzY2EsIHNzdG8uICBDdXJ0ZXN5IE1pbmggVHJhbi1MZQotCSAgPFRSQU5MRUBJTlRFTExJQ09SUC5DT00+LgotCi1UaHUgSmFuIDMwIDA3OjMxOjQ0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBoODMwMC5oOiB0dXJuZWQgb3BfdHlwZSBlbnVtIGludG8gI2RlZmluZSBsaXN0Ci0KLVRodSBKYW4gMzAgMDE6MDc6MjQgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6ICBSZW1vdmUgImN5cHJlc3MiIGFyY2hpdGVjdHVyZS4gIFJlbW92ZSAiZml0b3giIGFuZAotCXNpbWlsYXIgaW5zdHJ1Y3Rpb25zIC0tIHRoZXkndmUgYmVlbiByZW5hbWVkIHRvICJmaXRvcSIsIGV0Yy4KLQlSRUFMTFkgZml4IHRzdWJjY3R2LiAgRml4ICJmY21wZXEiIGFuZCAiZmNtcHEiIHdoaWNoIGhhZCB3cm9uZwotCW51bWJlciBvZiBhcmd1bWVudHMuCi0JKiBoODMwMC5oOiAgUmVtb3ZlIGV4dHJhIDsgd2hpY2ggcHJvZHVjZXMgY29tcGlsZXIgd2FybmluZy4KLQotVHVlIEphbiAyOCAyMjo1OToyMiAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBzcGFyYy5oOiAgZml4IG9wY29kZSBmb3IgdHN1YmNjdHYuCi0KLVR1ZSBKYW4gIDcgMTc6MTk6MzkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmg6IGZiYSBhbmQgY2JhIGFyZSBub3cgYWxpYXNlcyBmb3IgZmIgYW5kIGNiIHJlc3BlY3RpdmVseS4KLQotRnJpIERlYyAyNyAxMDo1NTo1MCAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaCAobm9wKTogIE1hZGUgdGhlICdsb3NlJyBmaWVsZCBiZSBldmVuIHRpZ2h0ZXIsCi0Jc28gb25seSBhIHN0YW5kYXJkICdub3AnIGlzIGRpc2Fzc2VtYmxlZCBhcyBhIG5vcC4KLQotU3VuIERlYyAyMiAxMjoxODoxOCAxOTkxICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uIGF0IGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLmggKG5vcCk6IEFkZCBSRF9HTyB0byBgbG9zZScgc28gdGhhdCBvbmx5ICVnMCBpbiBkZXN0IGlzCi0JZGlzYXNzZW1ibGVkIGFzIGEgbm9wLgotCi1UdWUgRGVjIDEwIDAwOjIyOjIwIDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogc3BhcmMuaDogZml4IGEgdHlwby4KLQotU2F0IE5vdiAzMCAyMDo0MDo1MSAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogYTI5ay5oLCBhcm0uaCwgaDgzMDAuaCwgIGkzODYuaCwgIGk4NjAuaCwgaTk2MC5oICwgbTY4ay5oLAotCW04OGsuaCwgbWlwcy5oICwgbnAxLmgsIG5zMzJrLmgsIHBuLmgsIHB5ci5oLCBzcGFyYy5oLCB0YWhvZS5oLAotCXZheC5oLCBDaGFuZ2VMb2c6IHJlbmFtZWQgZnJvbSAuLi88Zm9vPi1vcGNvZGUuaAotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hMjlrLmggYi9pbmNsdWRlL29wY29kZS9hMjlrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMmUxMjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYTI5ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBBTUQgMjkwMDAgZmFtaWx5LgotICAgQ29weXJpZ2h0IDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1zdHJ1Y3QgYTI5a19vcGNvZGUgewotICAvKiBOYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGNoYXIgKm5hbWU7Ci0KLSAgLyogT3Bjb2RlIHdvcmQgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogQSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCBkZXNjcmliZSB0aGUgb3BlcmFuZHMuCi0gICAgIFZhbGlkIGNoYXJhY3RlcnMgYXJlOgotICAgICAsICAgICAgICBJdHNlbGYuICBUaGUgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIGFzc2VtYmx5IGNvZGUuCi0gICAgIGEgICAgICAgIFJBLiAgVGhlIHJlZ2lzdGVyIG51bWJlciBpcyBpbiBiaXRzIDgtMTUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBiICAgICAgICBSQi4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyAwLTcgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBjICAgICAgICBSQy4gIFRoZSByZWdpc3RlciBudW1iZXIgaXMgaW4gYml0cyAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIGkgICAgICAgIEFuIGltbWVkaWF0ZSBvcGVyYW5kIGlzIGluIGJpdHMgMC03IG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgICAgeCAgICAgICAgQml0cyAwLTcgYW5kIDE2LTIzIG9mIHRoZSBpbnN0cnVjdGlvbiBhcmUgYml0cyAwLTcgYW5kIDgtMTUKLSAgICAgICAgICAgICAgKHJlc3BlY3RpdmVseSkgb2YgdGhlIGltbWVkaWF0ZSBvcGVyYW5kLgotICAgICBoICAgICAgICBTYW1lIGFzIHggYnV0IHRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBiaXRzIDE2LTMxIG9mIHRoZQotICAgICAgICAgICAgICBpbW1lZGlhdGUgb3BlcmFuZC4KLSAgICAgWCAgICAgICAgU2FtZSBhcyB4IGJ1dCBiaXRzIDE2LTMxIG9mIHRoZSBzaWduZWQgaW1tZWRpYXRlIG9wZXJhbmQKLSAgICAgICAgICAgICAgYXJlIHNldCB0byAxICh0aHVzIHRoZSBvcGVyYW5kIGlzIGFsd2F5cyBuZWdhdGl2ZSkuCi0gICAgIFAsQSAgICAgIEJpdHMgMC03IGFuZCAxNi0yMyBvZiB0aGUgaW5zdHJ1Y3Rpb24gYXJlIGJpdHMgMi05IGFuZCAxMC0xNwotICAgICAgICAgICAgICAocmVzcGVjdGl2ZWx5KSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQuCi0JICAgICAgUD1QQy1yZWxhdGl2ZSwgc2lnbi1leHRlbmRlZCB0byAzMiBiaXRzLgotCSAgICAgIEE9QWJzb2x1dGUsIHplcm8tZXh0ZW5kZWQgdG8gMzIgYml0cy4KLSAgICAgZSAgICAgICAgQ0UgYml0IChiaXQgMjMpIGZvciBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24uCi0gICAgIG4gICAgICAgIENvbnRyb2wgZmllbGQgKGJpdHMgMTYtMjIpIGZvciBhIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24uCi0gICAgIHYgICAgICAgIEltbWVkaWF0ZSBvcGVyYW5kIGluIGJpdHMgMTYtMjMgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICAgICAgICAgICAodXNlZCBmb3IgdHJhcCBudW1iZXJzKS4KLSAgICAgcyAgICAgICAgU0EuICBTcGVjaWFsLXB1cnBvc2UgcmVnaXN0ZXIgbnVtYmVyIGluIGJpdHMgOC0xNQotICAgICAgICAgICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIHUgICAgICAgIFVJLS1iaXQgNyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICAgIHIgICAgICAgIFJORC0tYml0cyA0LTYgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBkICAgICAgICBGRC0tYml0cyAyLTMgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBmICAgICAgICBGUy0tYml0cyAwLTEgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBJCSAgICAgIElELS1iaXRzIDE2LTE3IG9mIHRoZSBpbnN0cnVjdGlvbi4KLQotICAgICBFeHRlbnNpb25zIGZvciAyOTA1MDoKLQotICAgICBkCSAgICAgIEZNVC0tYml0cyAyLTMgb2YgdGhlIGluc3RydWN0aW9uIChub3QgcmVhbGx5IG5ldykuCi0gICAgIGYJICAgICAgQUNOLS1iaXRzIDAtMSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKG5vdCByZWFsbHkgbmV3KS4KLSAgICAgRgkgICAgICBGVU5DLS1TcGVjaWFsIGZ1bmN0aW9uIGluIGJpdHMgMTgtMjEgb2YgdGhlIGluc3RydWN0aW9uLgotICAgICBDCSAgICAgIEFDTi0tYml0cyAxNi0xNyBzcGVjaWZ5aW5nIHRoZSBhY2N1bWxhdG9yIHJlZ2lzdGVyLiAgKi8KLSAgY2hhciAqYXJnczsKLX07Ci0KLSNpZm5kZWYgQ09OU1QKLSNkZWZpbmUgQ09OU1QKLSNlbmRpZiAvKiBDT05TVCAqLwotCi1zdGF0aWMgQ09OU1Qgc3RydWN0IGEyOWtfb3Bjb2RlIGEyOWtfb3Bjb2Rlc1tdID0KLXsKLQoteyAiYWRkIiwgMHgxNDAwMDAwMCwgImMsYSxiIiB9LAoteyAiYWRkIiwgMHgxNTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkYyIsIDB4MWMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZGMiLCAweDFkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhZGRjcyIsIDB4MTgwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZGNzIiwgMHgxOTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkY3UiLCAweDFhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRjdSIsIDB4MWIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFkZHMiLCAweDEwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhZGRzIiwgMHgxMTAwMDAwMCwgImMsYSxpIiB9LAoteyAiYWRkdSIsIDB4MTIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImFkZHUiLCAweDEzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhbmQiLCAweDkwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJhbmQiLCAweDkxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJhbmRuIiwgMHg5YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiYW5kbiIsIDB4OWQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImFzZXEiLCAweDcwMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc2VxIiwgMHg3MTAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNnZSIsIDB4NWMwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ2UiLCAweDVkMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2dldSIsIDB4NWUwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ2V1IiwgMHg1ZjAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNndCIsIDB4NTgwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ3QiLCAweDU5MDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2d0dSIsIDB4NWEwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzZ3R1IiwgMHg1YjAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsZSIsIDB4NTQwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbGUiLCAweDU1MDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2xldSIsIDB4NTYwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbGV1IiwgMHg1NzAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNsdCIsIDB4NTAwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbHQiLCAweDUxMDAwMDAwLCAidixhLGkiIH0sCi17ICJhc2x0dSIsIDB4NTIwMDAwMDAsICJ2LGEsYiIgfSwKLXsgImFzbHR1IiwgMHg1MzAwMDAwMCwgInYsYSxpIiB9LAoteyAiYXNuZXEiLCAweDcyMDAwMDAwLCAidixhLGIiIH0sCi17ICJhc25lcSIsIDB4NzMwMDAwMDAsICJ2LGEsaSIgfSwKLXsgImNhbGwiLCAweGE4MDAwMDAwLCAiYSxQIiB9LAoteyAiY2FsbCIsIDB4YTkwMDAwMDAsICJhLEEiIH0sCi17ICJjYWxsaSIsIDB4YzgwMDAwMDAsICJhLGIiIH0sCi17ICJjbGFzcyIsIDB4ZTYwMDAwMDAsICJjLGEsZiIgfSwKLXsgImNseiIsIDB4MDgwMDAwMDAsICJjLGIiIH0sCi17ICJjbHoiLCAweDA5MDAwMDAwLCAiYyxpIiB9LAoteyAiY29uc3QiLCAweDAzMDAwMDAwLCAiYSx4IiB9LAoteyAiY29uc3RoIiwgMHgwMjAwMDAwMCwgImEsaCIgfSwKLXsgImNvbnN0aHoiLCAweDA1MDAwMDAwLCAiYSxoIiB9LAoteyAiY29uc3RuIiwgMHgwMTAwMDAwMCwgImEsWCIgfSwKLXsgImNvbnZlcnQiLCAweGU0MDAwMDAwLCAiYyxhLHUscixkLGYiIH0sCi17ICJjcGJ5dGUiLCAweDJlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGJ5dGUiLCAweDJmMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJjcGVxIiwgMHg2MDAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BlcSIsIDB4NjEwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ2UiLCAweDRjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGdlIiwgMHg0ZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BnZXUiLCAweDRlMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGdldSIsIDB4NGYwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwZ3QiLCAweDQ4MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGd0IiwgMHg0OTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BndHUiLCAweDRhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGd0dSIsIDB4NGIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbGUiLCAweDQ0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGxlIiwgMHg0NTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsZXUiLCAweDQ2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGxldSIsIDB4NDcwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbHQiLCAweDQwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGx0IiwgMHg0MTAwMDAwMCwgImMsYSxpIiB9LAoteyAiY3BsdHUiLCAweDQyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJjcGx0dSIsIDB4NDMwMDAwMDAsICJjLGEsaSIgfSwKLXsgImNwbmVxIiwgMHg2MjAwMDAwMCwgImMsYSxiIiB9LAoteyAiY3BuZXEiLCAweDYzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJkYWRkIiwgMHhmMTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGRpdiIsIDB4ZjcwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRlcSIsIDB4ZWIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRnZSIsIDB4ZWYwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRndCIsIDB4ZWQwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdiIsIDB4NmEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdiIsIDB4NmIwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRpdjAiLCAweDY4MDAwMDAwLCAiYyxiIiB9LAoteyAiZGl2MCIsIDB4NjkwMDAwMDAsICJjLGkiIH0sCi17ICJkaXZpZGUiLCAweGUxMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZpZHUiLCAweGUzMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkaXZsIiwgMHg2YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZGl2bCIsIDB4NmQwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRpdnJlbSIsIDB4NmUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImRpdnJlbSIsIDB4NmYwMDAwMDAsICJjLGEsaSIgfSwKLXsgImRtYWMiLCAweGQ5MDAwMDAwLCAiRixDLGEsYiIgfSwKLXsgImRtc20iLCAweGRiMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJkbXVsIiwgMHhmNTAwMDAwMCwgImMsYSxiIiB9LAoteyAiZHN1YiIsIDB4ZjMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImVtdWxhdGUiLCAweGQ3MDAwMDAwLCAidixhLGIiIH0sCi17ICJleGJ5dGUiLCAweDBhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJleGJ5dGUiLCAweDBiMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJleGh3IiwgMHg3YzAwMDAwMCwgImMsYSxiIiB9LAoteyAiZXhodyIsIDB4N2QwMDAwMDAsICJjLGEsaSIgfSwKLXsgImV4aHdzIiwgMHg3ZTAwMDAwMCwgImMsYSIgfSwKLXsgImV4dHJhY3QiLCAweDdhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJleHRyYWN0IiwgMHg3YjAwMDAwMCwgImMsYSxpIiB9LAoteyAiZmFkZCIsIDB4ZjAwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZkaXYiLCAweGY2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmZG11bCIsIDB4ZjkwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZlcSIsIDB4ZWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZnZSIsIDB4ZWUwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZndCIsIDB4ZWMwMDAwMDAsICJjLGEsYiIgfSwKLXsgImZtYWMiLCAweGQ4MDAwMDAwLCAiRixDLGEsYiIgfSwKLXsgImZtc20iLCAweGRhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJmbXVsIiwgMHhmNDAwMDAwMCwgImMsYSxiIiB9LAoteyAiZnN1YiIsIDB4ZjIwMDAwMDAsICJjLGEsYiIgfSwKLXsgImhhbHQiLCAweDg5MDAwMDAwLCAiIiB9LAoteyAiaW5ieXRlIiwgMHgwYzAwMDAwMCwgImMsYSxiIiB9LAoteyAiaW5ieXRlIiwgMHgwZDAwMDAwMCwgImMsYSxpIiB9LAoteyAiaW5odyIsIDB4NzgwMDAwMDAsICJjLGEsYiIgfSwKLXsgImluaHciLCAweDc5MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJpbnYiLCAweDlmMDAwMDAwLCAiSSIgfSwKLXsgImlyZXQiLCAweDg4MDAwMDAwLCAiIiB9LAoteyAiaXJldGludiIsIDB4OGMwMDAwMDAsICJJIiB9LAoteyAiam1wIiwgMHhhMDAwMDAwMCwgIlAiIH0sCi17ICJqbXAiLCAweGExMDAwMDAwLCAiQSIgfSwKLXsgImptcGYiLCAweGE0MDAwMDAwLCAiYSxQIiB9LAoteyAiam1wZiIsIDB4YTUwMDAwMDAsICJhLEEiIH0sCi17ICJqbXBmZGVjIiwgMHhiNDAwMDAwMCwgImEsUCIgfSwKLXsgImptcGZkZWMiLCAweGI1MDAwMDAwLCAiYSxBIiB9LAoteyAiam1wZmkiLCAweGM0MDAwMDAwLCAiYSxiIiB9LAoteyAiam1waSIsIDB4YzAwMDAwMDAsICJiIiB9LAoteyAiam1wdCIsIDB4YWMwMDAwMDAsICJhLFAiIH0sCi17ICJqbXB0IiwgMHhhZDAwMDAwMCwgImEsQSIgfSwKLXsgImptcHRpIiwgMHhjYzAwMDAwMCwgImEsYiIgfSwKLXsgImxvYWQiLCAweDE2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWQiLCAweDE3MDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgImxvYWRsIiwgMHgwNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2FkbCIsIDB4MDcwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAibG9hZG0iLCAweDM2MDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgImxvYWRtIiwgMHgzNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJsb2Fkc2V0IiwgMHgyNjAwMDAwMCwgImUsbixhLGIiIH0sCi17ICJsb2Fkc2V0IiwgMHgyNzAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJtZmFjYyIsIDB4ZTkwMDAxMDAsICJjLGQsZiIgfSwKLXsgIm1mc3IiLCAweGM2MDAwMDAwLCAiYyxzIiB9LAoteyAibWZ0bGIiLCAweGI2MDAwMDAwLCAiYyxhIiB9LAoteyAibXRhY2MiLCAweGU4MDEwMDAwLCAiYSxkLGYiIH0sCi17ICJtdHNyIiwgMHhjZTAwMDAwMCwgInMsYiIgfSwKLXsgIm10c3JpbSIsIDB4MDQwMDAwMDAsICJzLHgiIH0sCi17ICJtdHRsYiIsIDB4YmUwMDAwMDAsICJhLGIiIH0sCi17ICJtdWwiLCAweDY0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWwiLCAweDY1MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJtdWxsIiwgMHg2NjAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsbCIsIDB4NjcwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm11bHRpcGx1IiwgMHhlMjAwMDAwMCwgImMsYSxiIiB9LAoteyAibXVsdGlwbHkiLCAweGUwMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx0bSIsIDB4ZGUwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHRtdSIsIDB4ZGYwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm11bHUiLCAweDc0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJtdWx1IiwgMHg3NTAwMDAwMCwgImMsYSxpIiB9LAoteyAibmFuZCIsIDB4OWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm5hbmQiLCAweDliMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJub3AiLCAweDcwNDAwMTAxLCAiIiB9LAoteyAibm9yIiwgMHg5ODAwMDAwMCwgImMsYSxiIiB9LAoteyAibm9yIiwgMHg5OTAwMDAwMCwgImMsYSxpIiB9LAoteyAib3IiLCAweDkyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJvciIsIDB4OTMwMDAwMDAsICJjLGEsaSIgfSwKLXsgIm9ybiIsIDB4YWEwMDAwMDAsICJjLGEsYiIgfSwKLXsgIm9ybiIsIDB4YWIwMDAwMDAsICJjLGEsaSIgfSwKLQotLyogVGhlIGRlc2NyaXB0aW9uIG9mICJzZXRpcCIgaW4gQ2hhcHRlciA4ICgiaW5zdHJ1Y3Rpb24gc2V0Iikgb2YgdGhlIHVzZXIncwotICAgbWFudWFsIGNsYWltcyB0aGF0IHRoZXNlIGFyZSBhYnNvbHV0ZSByZWdpc3RlciBudW1iZXJzLiAgQnV0IHNlY3Rpb24KLSAgIDcuMi4xIGV4cGxhaW5zIHRoYXQgdGhleSBhcmUgbm90LiAgVGhlIGxhdHRlciBpcyBjb3JyZWN0LCBzbyBwcmludAotICAgdGhlc2Ugbm9ybWFsbHkgKCJscjAiLCAibHI1IiwgZXRjLikuICAqLwoteyAic2V0aXAiLCAweDllMDAwMDAwLCAiYyxhLGIiIH0sCi0KLXsgInNsbCIsIDB4ODAwMDAwMDAsICJjLGEsYiIgfSwKLXsgInNsbCIsIDB4ODEwMDAwMDAsICJjLGEsaSIgfSwKLXsgInNxcnQiLCAweGU1MDAwMDAwLCAiYyxhLGYiIH0sCi17ICJzcmEiLCAweDg2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzcmEiLCAweDg3MDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzcmwiLCAweDgyMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzcmwiLCAweDgzMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdG9yZSIsIDB4MWUwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAic3RvcmUiLCAweDFmMDAwMDAwLCAiZSxuLGEsaSIgfSwKLXsgInN0b3JlbCIsIDB4MGUwMDAwMDAsICJlLG4sYSxiIiB9LAoteyAic3RvcmVsIiwgMHgwZjAwMDAwMCwgImUsbixhLGkiIH0sCi17ICJzdG9yZW0iLCAweDNlMDAwMDAwLCAiZSxuLGEsYiIgfSwKLXsgInN0b3JlbSIsIDB4M2YwMDAwMDAsICJlLG4sYSxpIiB9LAoteyAic3ViIiwgMHgyNDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3ViIiwgMHgyNTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViYyIsIDB4MmMwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YmMiLCAweDJkMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJjcyIsIDB4MjgwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YmNzIiwgMHgyOTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3ViY3UiLCAweDJhMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJjdSIsIDB4MmIwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnIiLCAweDM0MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyIiwgMHgzNTAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicmMiLCAweDNjMDAwMDAwLCAiYyxhLGIiIH0sCi17ICJzdWJyYyIsIDB4M2QwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJjcyIsIDB4MzgwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJjcyIsIDB4MzkwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJjdSIsIDB4M2EwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJjdSIsIDB4M2IwMDAwMDAsICJjLGEsaSIgfSwKLXsgInN1YnJzIiwgMHgzMDAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VicnMiLCAweDMxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJydSIsIDB4MzIwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnJ1IiwgMHgzMzAwMDAwMCwgImMsYSxpIiB9LAoteyAic3VicyIsIDB4MjAwMDAwMDAsICJjLGEsYiIgfSwKLXsgInN1YnMiLCAweDIxMDAwMDAwLCAiYyxhLGkiIH0sCi17ICJzdWJ1IiwgMHgyMjAwMDAwMCwgImMsYSxiIiB9LAoteyAic3VidSIsIDB4MjMwMDAwMDAsICJjLGEsaSIgfSwKLXsgInhub3IiLCAweDk2MDAwMDAwLCAiYyxhLGIiIH0sCi17ICJ4bm9yIiwgMHg5NzAwMDAwMCwgImMsYSxpIiB9LAoteyAieG9yIiwgMHg5NDAwMDAwMCwgImMsYSxiIiB9LAoteyAieG9yIiwgMHg5NTAwMDAwMCwgImMsYSxpIiB9LAotCi17ICIiLCAweDAsICIiIH0JCS8qIER1bW15IGVudHJ5LCBub3QgaW5jbHVkZWQgaW4gTlVNX09QQ09ERVMuICBUaGlzCi0JCQkgICBsZXRzIGNvZGUgZXhhbWluZSBlbnRyeSBpKzEgd2l0aG91dCBjaGVja2luZwotCQkJICAgaWYgd2UndmUgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSB0YWJsZS4gICovCi19OwotCi1DT05TVCB1bnNpZ25lZCBpbnQgbnVtX29wY29kZXMgPSAoKChzaXplb2YgYTI5a19vcGNvZGVzKSAvIChzaXplb2YgYTI5a19vcGNvZGVzWzBdKSkgLSAxKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2FscGhhLmggYi9pbmNsdWRlL29wY29kZS9hbHBoYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMThlYjA0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2FscGhhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogYWxwaGEuaCAtLSBIZWFkZXIgZmlsZSBmb3IgQWxwaGEgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LAotICAgcGF0dGVybmVkIGFmdGVyIHRoZSBQUEMgb3Bjb2RlIHRhYmxlIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvci4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBPUENPREVfQUxQSEFfSAotI2RlZmluZSBPUENPREVfQUxQSEFfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBhbHBoYV9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgYWxwaGFfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG9wY29kZSBpdHNlbGYuICBUaG9zZSBiaXRzIHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIHdpdGgKLSAgICAgb3BlcmFuZHMgYXJlIHplcm9lcy4gICovCi0gIHVuc2lnbmVkIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBtYXNrOwotCi0gIC8qIE9uZSBiaXQgZmxhZ3MgZm9yIHRoZSBvcGNvZGUuICBUaGVzZSBhcmUgcHJpbWFyaWx5IHVzZWQgdG8KLSAgICAgaW5kaWNhdGUgc3BlY2lmaWMgcHJvY2Vzc29ycyBhbmQgZW52aXJvbm1lbnRzIHN1cHBvcnQgdGhlCi0gICAgIGluc3RydWN0aW9ucy4gIFRoZSBkZWZpbmVkIHZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LiAqLwotICB1bnNpZ25lZCBmbGFnczsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzRdOwotfTsKLQotLyogVGhlIHRhYmxlIGl0c2VsZiBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIG51bWJlciwgYW5kIGlzIG90aGVyd2lzZQotICAgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNvbnNpZGVyCi0gICBpbnN0cnVjdGlvbnMuICAqLwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgYWxwaGFfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhbHBoYV9udW1fb3Bjb2RlczsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBhbHBoYV9vcGNvZGUuICAqLwotCi0vKiBDUFUgQXZhaWxhYmlsaXR5ICovCi0jZGVmaW5lIEFYUF9PUENPREVfQkFTRSAgMHgwMDAxICAvKiBCYXNlIGFyY2hpdGVjdHVyZSAtLSBhbGwgY3B1cy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY0ICAgMHgwMDAyICAvKiBFVjQgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY1ICAgMHgwMDA0ICAvKiBFVjUgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfRVY2ICAgMHgwMDA4ICAvKiBFVjYgc3BlY2lmaWMgUEFMY29kZSBpbnNucy4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfQldYICAgMHgwMTAwICAvKiBCeXRlL3dvcmQgZXh0ZW5zaW9uIChhbWFzayBiaXQgMCkuICAqLwotI2RlZmluZSBBWFBfT1BDT0RFX0NJWCAgIDB4MDIwMCAgLyogIkNvdW50IiBleHRlbnNpb24gKGFtYXNrIGJpdCAxKS4gICovCi0jZGVmaW5lIEFYUF9PUENPREVfTUFYICAgMHgwNDAwICAvKiBNdWx0aW1lZGlhIGV4dGVuc2lvbiAoYW1hc2sgYml0IDgpLiAgKi8KLQotI2RlZmluZSBBWFBfT1BDT0RFX05PUEFMICh+KEFYUF9PUENPREVfRVY0fEFYUF9PUENPREVfRVY1fEFYUF9PUENPREVfRVY2KSkKLQotLyogQSBtYWNybyB0byBleHRyYWN0IHRoZSBtYWpvciBvcGNvZGUgZnJvbSBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEFYUF9PUChpKQkoKChpKSA+PiAyNikgJiAweDNGKQotCi0vKiBUaGUgdG90YWwgbnVtYmVyIG9mIG1ham9yIG9wY29kZXMuICovCi0jZGVmaW5lIEFYUF9OT1BTCTB4NDAKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBhbHBoYV9vcGVyYW5kLiAgKi8KLQotc3RydWN0IGFscGhhX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIFRoZSBkZWZhdWx0IHJlbG9jYXRpb24gdHlwZSBmb3IgdGhpcyBvcGVyYW5kLiAgKi8KLSAgaW50IGRlZmF1bHRfcmVsb2M7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICB1bnNpZ25lZCBmbGFnczsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotICB1bnNpZ25lZCAoKmluc2VydCkgUEFSQU1TICgodW5zaWduZWQgaW5zdHJ1Y3Rpb24sIGludCBvcCwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoKG8tPmZsYWdzICYgQVhQX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIGludCAoKmV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgYWxwaGFfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgYWxwaGFfb3BlcmFuZCBhbHBoYV9vcGVyYW5kc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhbHBoYV9udW1fb3BlcmFuZHM7Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgYWxwaGFfb3BlcmFuZC4gICovCi0KLS8qIE1hc2sgZm9yIHNlbGVjdGluZyB0aGUgdHlwZSBmb3IgdHlwZWNoZWNrIHB1cnBvc2VzICovCi0jZGVmaW5lIEFYUF9PUEVSQU5EX1RZUEVDSEVDS19NQVNLCQkJCQlcCi0gIChBWFBfT1BFUkFORF9QQVJFTlMgfCBBWFBfT1BFUkFORF9DT01NQSB8IEFYUF9PUEVSQU5EX0lSIHwJCVwKLSAgIEFYUF9PUEVSQU5EX0ZQUiB8IEFYUF9PUEVSQU5EX1JFTEFUSVZFIHwgQVhQX09QRVJBTkRfU0lHTkVEIHwgCVwKLSAgIEFYUF9PUEVSQU5EX1VOU0lHTkVEKQotCi0vKiBUaGlzIG9wZXJhbmQgZG9lcyBub3QgYWN0dWFsbHkgZXhpc3QgaW4gdGhlIGFzc2VtYmxlciBpbnB1dC4gIFRoaXMKLSAgIGlzIHVzZWQgdG8gc3VwcG9ydCBleHRlbmRlZCBtbmVtb25pY3MsIGZvciB3aGljaCB0d28gb3BlcmFuZHMgZmllbGRzCi0gICBhcmUgaWRlbnRpY2FsLiAgVGhlIGFzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUgaW5zZXJ0IGZ1bmN0aW9uIHdpdGgKLSAgIGFueSBvcCB2YWx1ZS4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNhbGwgdGhlIGV4dHJhY3QgZnVuY3Rpb24sCi0gICBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSwgYW5kIGNoZWNrIHRoZSB2YWx1ZSBwbGFjZWQgaW4gdGhlIGludmFsaWQKLSAgIGFyZ3VtZW50LiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfRkFLRQkwMQotCi0vKiBUaGUgb3BlcmFuZCBzaG91bGQgYmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyByYXRoZXIgdGhhbiBzZXBhcmF0ZWQKLSAgIGZyb20gdGhlIHByZXZpb3VzIGJ5IGEgY29tbWEuICBUaGlzIGlzIHVzZWQgZm9yIHRoZSBsb2FkIGFuZCBzdG9yZQotICAgaW5zdHJ1Y3Rpb25zIHdoaWNoIHdhbnQgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlICJSYSxkaXNwKFJiKSIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9QQVJFTlMJMDIKLQotLyogVXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIFBBUkVOUywgdGhpcyBzdXByZXNzZXMgdGhlIHN1cHJlc3Npb24gb2YKLSAgIHRoZSBjb21tYS4gIFRoaXMgaXMgdXNlZCBmb3IgImptcCBSYSwoUmIpLGhpbnQiLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfQ09NTUEJMDQKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGFuIGludGVnZXIgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9JUgkJMDEwCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfRlBSCQkwMjAKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgcmVsYXRpdmUgYnJhbmNoIGRpc3BsYWNlbWVudC4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9SRUxBVElWRQkwNDAKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9TSUdORUQJMDEwMAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgdW5zaWduZWQgdmFsdWVzLiAgVGhpcyBleGlzdHMgcHJpbWFyaWx5IHNvIHRoYXQKLSAgIGEgZmxhZ3MgdmFsdWUgb2YgMCBjYW4gYmUgdHJlYXRlZCBhcyBlbmQtb2YtYXJndW1lbnRzLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfVU5TSUdORUQJMDIwMAotCi0vKiBTdXByZXNzIG92ZXJmbG93IGRldGVjdGlvbiBvbiB0aGlzIGZpZWxkLiAgVGhpcyBpcyB1c2VkIGZvciBoaW50cy4gKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfTk9PVkVSRkxPVwkwNDAwCi0KLS8qIE1hc2sgZm9yIG9wdGlvbmFsIGFyZ3VtZW50IGRlZmF1bHQgdmFsdWUuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9PUFRJT05BTF9NQVNLIDA3MDAwCi0KLS8qIFRoaXMgb3BlcmFuZCBkZWZhdWx0cyB0byB6ZXJvLiAgVGhpcyBpcyB1c2VkIGZvciBqdW1wIGhpbnRzLiAgKi8KLSNkZWZpbmUgQVhQX09QRVJBTkRfREVGQVVMVF9aRVJPIDAxMDAwCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgZGVmYXVsdCB0byB0aGUgZmlyc3QgKHJlYWwpIG9wZXJhbmQgYW5kIGlzIHVzZWQKLSAgIGluIGNvbmp1bmN0aW9uIHdpdGggQVhQX09QRVJBTkRfT1BUSU9OQUwuICBUaGlzIGFsbG93cwotICAgImFuZCAkMCwzLCQwIiB0byBiZSB3cml0dGVuIGFzICJhbmQgJDAsMyIsIGV0Yy4gIEkgZG9uJ3QgbGlrZQotICAgaXQsIGJ1dCBpdCdzIHdoYXQgREVDIGRvZXMuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNUIDAyMDAwCi0KLS8qIFNpbWlsYXJseSwgdGhpcyBvcGVyYW5kIHNob3VsZCBkZWZhdWx0IHRvIHRoZSBzZWNvbmQgKHJlYWwpIG9wZXJhbmQuCi0gICBUaGlzIGFsbG93cyAibmVnbCAkMCIgaW5zdGVhZCBvZiAibmVnbCAkMCwkMCIuICAqLwotI2RlZmluZSBBWFBfT1BFUkFORF9ERUZBVUxUX1NFQ09ORCAwNDAwMAotCi0MCi0vKiBSZWdpc3RlciBjb21tb24gbmFtZXMgKi8KLQotI2RlZmluZSBBWFBfUkVHX1YwCTAKLSNkZWZpbmUgQVhQX1JFR19UMAkxCi0jZGVmaW5lIEFYUF9SRUdfVDEJMgotI2RlZmluZSBBWFBfUkVHX1QyCTMKLSNkZWZpbmUgQVhQX1JFR19UMwk0Ci0jZGVmaW5lIEFYUF9SRUdfVDQJNQotI2RlZmluZSBBWFBfUkVHX1Q1CTYKLSNkZWZpbmUgQVhQX1JFR19UNgk3Ci0jZGVmaW5lIEFYUF9SRUdfVDcJOAotI2RlZmluZSBBWFBfUkVHX1MwCTkKLSNkZWZpbmUgQVhQX1JFR19TMQkxMAotI2RlZmluZSBBWFBfUkVHX1MyCTExCi0jZGVmaW5lIEFYUF9SRUdfUzMJMTIKLSNkZWZpbmUgQVhQX1JFR19TNAkxMwotI2RlZmluZSBBWFBfUkVHX1M1CTE0Ci0jZGVmaW5lIEFYUF9SRUdfRlAJMTUKLSNkZWZpbmUgQVhQX1JFR19BMAkxNgotI2RlZmluZSBBWFBfUkVHX0ExCTE3Ci0jZGVmaW5lIEFYUF9SRUdfQTIJMTgKLSNkZWZpbmUgQVhQX1JFR19BMwkxOQotI2RlZmluZSBBWFBfUkVHX0E0CTIwCi0jZGVmaW5lIEFYUF9SRUdfQTUJMjEKLSNkZWZpbmUgQVhQX1JFR19UOAkyMgotI2RlZmluZSBBWFBfUkVHX1Q5CTIzCi0jZGVmaW5lIEFYUF9SRUdfVDEwCTI0Ci0jZGVmaW5lIEFYUF9SRUdfVDExCTI1Ci0jZGVmaW5lIEFYUF9SRUdfUkEJMjYKLSNkZWZpbmUgQVhQX1JFR19QVgkyNwotI2RlZmluZSBBWFBfUkVHX1QxMgkyNwotI2RlZmluZSBBWFBfUkVHX0FUCTI4Ci0jZGVmaW5lIEFYUF9SRUdfR1AJMjkKLSNkZWZpbmUgQVhQX1JFR19TUAkzMAotI2RlZmluZSBBWFBfUkVHX1pFUk8JMzEKLQotI2VuZGlmIC8qIE9QQ09ERV9BTFBIQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9hcmMuaCBiL2luY2x1ZGUvb3Bjb2RlL2FyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWUwY2ExLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2FyYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAxOTk0LCAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBHREIsIHRoZSBHTlUgZGVidWdnZXIsIGFuZAotdGhlIEdOVSBCaW51dGlscy4KLQotR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCVNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdBUyBvciBHREI7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLglJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIExpc3Qgb2YgdGhlIHZhcmlvdXMgY3B1IHR5cGVzLgotICAgVGhlIHRhYmxlcyBjdXJyZW50bHkgdXNlIGJpdCBtYXNrcyB0byBzYXkgd2hldGhlciB0aGUgaW5zdHJ1Y3Rpb24gb3IKLSAgIHdoYXRldmVyIGlzIHN1cHBvcnRlZCBieSBhIHBhcnRpY3VsYXIgY3B1LiAgVGhpcyBsZXRzIHVzIGhhdmUgb25lIGVudHJ5Ci0gICBhcHBseSB0byBzZXZlcmFsIGNwdXMuCi0KLSAgIFRoaXMgZHVwbGljYXRlcyBiZmRfbWFjaF9hcmNfeHh4LiAgRm9yIG5vdyBJIHdpc2ggdG8gaXNvbGF0ZSB0aGlzIGZyb20gYmZkCi0gICBhbmQgYmZkIGZyb20gdGhpcy4gIEFsc28gbm90ZSB0aGF0IHRoZXNlIG51bWJlcnMgYXJlIGJpdCB2YWx1ZXMgYXMgd2Ugd2FudAotICAgdG8gYWxsb3cgZm9yIHRoaW5ncyBhdmFpbGFibGUgb24gbW9yZSB0aGFuIG9uZSBBUkMgKGJ1dCBub3QgbmVjZXNzYXJpbHkgYWxsCi0gICBBUkNzKS4gICovCi0KLS8qIFRoZSBgYmFzZScgY3B1IG11c3QgYmUgMCAodGFibGUgZW50cmllcyBhcmUgb21pdHRlZCBmb3IgdGhlIGJhc2UgY3B1KS4KLSAgIFRoZSBjcHUgdHlwZSBpcyB0cmVhdGVkIGluZGVwZW5kZW50bHkgb2YgZW5kaWFubmVzcy4KLSAgIFRoZSBjb21wbGV0ZSBgbWFjaCcgbnVtYmVyIGluY2x1ZGVzIGVuZGlhbm5lc3MuCi0gICBUaGVzZSB2YWx1ZXMgYXJlIGludGVybmFsIHRvIG9wY29kZXMvYmZkL2JpbnV0aWxzL2dhcy4gICovCi0jZGVmaW5lIEFSQ19NQUNIX0JBU0UgMAotI2RlZmluZSBBUkNfTUFDSF9VTlVTRUQxIDEKLSNkZWZpbmUgQVJDX01BQ0hfVU5VU0VEMiAyCi0jZGVmaW5lIEFSQ19NQUNIX1VOVVNFRDQgNAotLyogQWRkaXRpb25hbCBjcHUgdmFsdWVzIGNhbiBiZSBpbnNlcnRlZCBoZXJlIGFuZCBBUkNfTUFDSF9CSUcgbW92ZWQgZG93bi4gICovCi0jZGVmaW5lIEFSQ19NQUNIX0JJRyA4Ci0KLS8qIE1hc2sgb2YgbnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlY29yZCBjcHUgdHlwZS4gICovCi0jZGVmaW5lIEFSQ19NQUNIX0NQVV9NQVNLIDcKLS8qIE1hc2sgb2YgbnVtYmVyIG9mIGJpdHMgbmVjZXNzYXJ5IHRvIHJlY29yZCBjcHUgdHlwZSArIGVuZGlhbm5lc3MuICAqLwotI2RlZmluZSBBUkNfTUFDSF9NQVNLIDE1Ci0KLS8qIFR5cGUgdG8gZGVub3RlIGFuIEFSQyBpbnN0cnVjdGlvbiAoYXQgbGVhc3QgYSAzMiBiaXQgdW5zaWduZWQgaW50KS4gICovCi10eXBlZGVmIHVuc2lnbmVkIGludCBhcmNfaW5zbjsKLQotc3RydWN0IGFyY19vcGNvZGUgewotICBjaGFyICpzeW50YXg7CQkJLyogc3ludGF4IG9mIGluc24gKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrLCB2YWx1ZTsJLyogcmVjb2duaXplIGluc24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLwotICBpbnQgZmxhZ3M7CQkJLyogdmFyaW91cyBmbGFnIGJpdHMgKi8KLQotLyogVmFsdWVzIGZvciBgZmxhZ3MnLiAgKi8KLQotLyogUmV0dXJuIENQVSBudW1iZXIsIGdpdmVuIGZsYWcgYml0cy4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfQ1BVKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9DUFVfTUFTSykKLS8qIFJldHVybiBNQUNIIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QQ09ERV9NQUNIKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9NQVNLKQotLyogRmlyc3Qgb3Bjb2RlIGZsYWcgYml0IGF2YWlsYWJsZSBhZnRlciBtYWNoaW5lIG1hc2suICAqLwotI2RlZmluZSBBUkNfT1BDT0RFX0ZMQUdfU1RBUlQgKChBUkNfTUFDSF9NQVNLICsgMSkgPDwgMCkKLS8qIFRoaXMgaW5zbiBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaC4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfQ09ORF9CUkFOQ0ggKEFSQ19PUENPREVfRkxBR19TVEFSVCkKLQotICAvKiBUaGVzZSB2YWx1ZXMgYXJlIHVzZWQgdG8gb3B0aW1pemUgYXNzZW1ibHkgYW5kIGRpc2Fzc2VtYmx5LiAgRWFjaCBpbnNuIGlzCi0gICAgIG9uIGEgbGlzdCBvZiByZWxhdGVkIGluc25zIChzYW1lIGZpcnN0IGxldHRlciBmb3IgYXNzZW1ibHksIHNhbWUgaW5zbiBjb2RlCi0gICAgIGZvciBkaXNhc3NlbWJseSkuICAqLwotICBzdHJ1Y3QgYXJjX29wY29kZSAqbmV4dF9hc207CS8qIE5leHQgaW5zdHJ1Y3Rpb24gdG8gdHJ5IGR1cmluZyBhc3NlbWJseS4gICovCi0gIHN0cnVjdCBhcmNfb3Bjb2RlICpuZXh0X2RpczsJLyogTmV4dCBpbnN0cnVjdGlvbiB0byB0cnkgZHVyaW5nIGRpc2Fzc2VtYmx5LiAgKi8KLQotICAvKiBNYWNyb3MgdG8gY3JlYXRlIHRoZSBoYXNoIHZhbHVlcyBmb3IgdGhlIGxpc3RzLiAgKi8KLSNkZWZpbmUgQVJDX0hBU0hfT1BDT0RFKHN0cmluZykgXAotICAoKHN0cmluZylbMF0gPj0gJ2EnICYmIChzdHJpbmcpWzBdIDw9ICd6JyA/IChzdHJpbmcpWzBdIC0gJ2EnIDogMjYpCi0jZGVmaW5lIEFSQ19IQVNIX0lDT0RFKGluc24pIFwKLSAgKCh1bnNpZ25lZCBpbnQpIChpbnNuKSA+PiAyNykKLQotICAvKiBNYWNyb3MgdG8gYWNjZXNzIGBuZXh0X2FzbScsIGBuZXh0X2Rpcycgc28gdXNlcnMgbmVlZG4ndCBjYXJlIGFib3V0IHRoZQotICAgICB1bmRlcmx5aW5nIG1lY2hhbmlzbS4gICovCi0jZGVmaW5lIEFSQ19PUENPREVfTkVYVF9BU00ob3ApICgob3ApLT5uZXh0X2FzbSkKLSNkZWZpbmUgQVJDX09QQ09ERV9ORVhUX0RJUyhvcCkgKChvcCktPm5leHRfZGlzKQotfTsKLQotc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIHsKLSAgY2hhciAqbmFtZTsJCQkvKiBlZzogImVxIiAqLwotICBzaG9ydCB2YWx1ZTsJCQkvKiBlZzogMSAqLwotICB1bnNpZ25lZCBjaGFyIHR5cGU7CQkvKiBpbmRleCBpbnRvIGBhcmNfb3BlcmFuZHMnICovCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CQkvKiB2YXJpb3VzIGZsYWcgYml0cyAqLwotCi0vKiBWYWx1ZXMgZm9yIGBmbGFncycuICAqLwotCi0vKiBSZXR1cm4gQ1BVIG51bWJlciwgZ2l2ZW4gZmxhZyBiaXRzLiAgKi8KLSNkZWZpbmUgQVJDX09QVkFMX0NQVShiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfQ1BVX01BU0spCi0vKiBSZXR1cm4gTUFDSCBudW1iZXIsIGdpdmVuIGZsYWcgYml0cy4gICovCi0jZGVmaW5lIEFSQ19PUFZBTF9NQUNIKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9NQVNLKQotfTsKLQotc3RydWN0IGFyY19vcGVyYW5kIHsKLSAgLyogT25lIG9mIHRoZSBpbnNuIGZvcm1hdCBjaGFycy4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm10OwotCi0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZCAobWF5IGJlIHVudXNlZCBmb3IgYSBtb2RpZmllcikuICAqLwotICB1bnNpZ25lZCBjaGFyIGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLCBvcgotICAgICB0aGUgbW9kaWZpZXIncyBmbGFnIGJpdCAobWF5IGJlIHVudXNlZCBmb3IgYSBtb2RpZmllci4gICovCi0gIHVuc2lnbmVkIGNoYXIgc2hpZnQ7Ci0KLSAgLyogVmFyaW91cyBmbGFnIGJpdHMuICAqLwotICBpbnQgZmxhZ3M7Ci0KLS8qIFZhbHVlcyBmb3IgYGZsYWdzJy4gICovCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIHN1ZmZpeCB0byB0aGUgb3Bjb2RlLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfU1VGRklYIDEKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgcmVsYXRpdmUgYnJhbmNoIGRpc3BsYWNlbWVudC4gIFRoZSBkaXNhc3NlbWJsZXIKLSAgIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0ggMgotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIGFkZHJlc3MuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfQUJTT0xVVEVfQlJBTkNIIDQKLQotLyogVGhpcyBvcGVyYW5kIGlzIGFuIGFkZHJlc3MuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfQUREUkVTUyA4Ci0KLS8qIFRoaXMgb3BlcmFuZCBpcyBhIGxvbmcgaW1tZWRpYXRlIHZhbHVlLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfTElNTSAweDEwCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfU0lHTkVEIDB4MjAKLQotLyogVGhpcyBvcGVyYW5kIHRha2VzIHNpZ25lZCB2YWx1ZXMsIGJ1dCBhbHNvIGFjY2VwdHMgYSBmdWxsIHBvc2l0aXZlCi0gICByYW5nZSBvZiB2YWx1ZXMuICBUaGF0IGlzLCBpZiBiaXRzIGlzIDE2LCBpdCB0YWtlcyBhbnkgdmFsdWUgZnJvbQotICAgLTB4ODAwMCB0byAweGZmZmYuICAqLwotI2RlZmluZSBBUkNfT1BFUkFORF9TSUdOT1BUIDB4NDAKLQotLyogVGhpcyBvcGVyYW5kIHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIG5lZ2F0aXZlIG51bWJlciBmb3IgdGhlCi0gICBwdXJwb3NlcyBvZiBvdmVyZmxvdyBjaGVja2luZyAoaS5lLiwgdGhlIG5vcm1hbCBtb3N0IG5lZ2F0aXZlCi0gICBudW1iZXIgaXMgZGlzYWxsb3dlZCBhbmQgb25lIG1vcmUgdGhhbiB0aGUgbm9ybWFsIG1vc3QgcG9zaXRpdmUKLSAgIG51bWJlciBpcyBhbGxvd2VkKS4gIFRoaXMgZmxhZyB3aWxsIG9ubHkgYmUgc2V0IGZvciBhIHNpZ25lZAotICAgb3BlcmFuZC4gICovCi0jZGVmaW5lIEFSQ19PUEVSQU5EX05FR0FUSVZFIDB4ODAKLQotLyogVGhpcyBvcGVyYW5kIGRvZXNuJ3QgcmVhbGx5IGV4aXN0LiAgVGhlIHByb2dyYW0gdXNlcyB0aGVzZSBvcGVyYW5kcwotICAgaW4gc3BlY2lhbCB3YXlzLiAgKi8KLSNkZWZpbmUgQVJDX09QRVJBTkRfRkFLRSAweDEwMAotCi0vKiBNb2RpZmllciB2YWx1ZXMuICAqLwotLyogQSBkb3QgaXMgcmVxdWlyZWQgYmVmb3JlIGEgc3VmZml4LiAgRWc6IC5sZSAgKi8KLSNkZWZpbmUgQVJDX01PRF9ET1QgMHgxMDAwCi0KLS8qIEEgbm9ybWFsIHJlZ2lzdGVyIGlzIGFsbG93ZWQgKG5vdCB1c2VkLCBidXQgaGVyZSBmb3IgY29tcGxldGVuZXNzKS4gICovCi0jZGVmaW5lIEFSQ19NT0RfUkVHIDB4MjAwMAotCi0vKiBBbiBhdXhpbGlhcnkgcmVnaXN0ZXIgbmFtZSBpcyBleHBlY3RlZC4gICovCi0jZGVmaW5lIEFSQ19NT0RfQVVYUkVHIDB4NDAwMAotCi0vKiBTdW0gb2YgYWxsIEFSQ19NT0RfWFhYIGJpdHMuICAqLwotI2RlZmluZSBBUkNfTU9EX0JJVFMgMHg3MDAwCi0KLS8qIE5vbi16ZXJvIGlmIHRoZSBvcGVyYW5kIHR5cGUgaXMgcmVhbGx5IGEgbW9kaWZpZXIuICAqLwotI2RlZmluZSBBUkNfTU9EX1AoWCkgKChYKSAmIEFSQ19NT0RfQklUUykKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAocCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKEkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBPIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIE9QIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkLgotCi0gICAgIFJFRyBpcyBub24tTlVMTCB3aGVuIGluc2VydGluZyBhIHJlZ2lzdGVyIHZhbHVlLiAgKi8KLQotICBhcmNfaW5zbiAoKmluc2VydCkgUEFSQU1TICgoYXJjX2luc24gaW5zbiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZCwgaW50IG1vZHMsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZywgbG9uZyB2YWx1ZSwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKiplcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoKG8tPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChJIGlzIHRoZSBpbnN0cnVjdGlvbiwgTyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBPUAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4KLQotICAgICBJTlNOIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0d28gYGFyY19pbnNuJ3MuICBUaGUgZmlyc3QgZWxlbWVudCBpcwotICAgICB0aGUgaW5zbiwgdGhlIHNlY29uZCBpcyB0aGUgbGltbSBpZiBwcmVzZW50LgotCi0gICAgIE9wZXJhbmRzIHRoYXQgaGF2ZSBhIHByaW50YWJsZSBmb3JtIGxpa2UgcmVnaXN0ZXJzIGFuZCBzdWZmaXhlcyBoYXZlCi0gICAgIHRoZWlyIHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSBwb2ludGVyIHN0b3JlZCBpbiBPUFZBTC4gICovCi0KLSAgbG9uZyAoKmV4dHJhY3QpIFBBUkFNUyAoKGFyY19pbnNuICppbnNuLAotCQkJICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kLAotCQkJICAgaW50IG1vZHMsIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsLAotCQkJICAgaW50ICppbnZhbGlkKSk7Ci19OwotCi0vKiBCaXRzIHRoYXQgc2F5IHdoYXQgdmVyc2lvbiBvZiBjcHUgd2UgaGF2ZS4KLSAgIFRoZXNlIHNob3VsZCBiZSBwYXNzZWQgdG8gYXJjX2luaXRfb3Bjb2RlX3RhYmxlcy4KLSAgIEF0IHByZXNlbnQsIGFsbCB0aGVyZSBpcyBpcyB0aGUgY3B1IHR5cGUuICAqLwotCi0vKiBDUFUgbnVtYmVyLCBnaXZlbiB2YWx1ZSBwYXNzZWQgdG8gYGFyY19pbml0X29wY29kZV90YWJsZXMnLiAgKi8KLSNkZWZpbmUgQVJDX0hBVkVfQ1BVKGJpdHMpICgoYml0cykgJiBBUkNfTUFDSF9DUFVfTUFTSykKLS8qIE1BQ0ggbnVtYmVyLCBnaXZlbiB2YWx1ZSBwYXNzZWQgdG8gYGFyY19pbml0X29wY29kZV90YWJsZXMnLiAgKi8KLSNkZWZpbmUgQVJDX0hBVkVfTUFDSChiaXRzKSAoKGJpdHMpICYgQVJDX01BQ0hfTUFTSykKLQotLyogU3BlY2lhbCByZWdpc3RlciB2YWx1ZXM6ICAqLwotI2RlZmluZSBBUkNfUkVHX1NISU1NX1VQREFURSA2MQotI2RlZmluZSBBUkNfUkVHX1NISU1NIDYzCi0jZGVmaW5lIEFSQ19SRUdfTElNTSA2MgotCi0vKiBOb24temVybyBpZiBSRUcgaXMgYSBjb25zdGFudCBtYXJrZXIuICAqLwotI2RlZmluZSBBUkNfUkVHX0NPTlNUQU5UX1AoUkVHKSAoKFJFRykgPj0gNjEpCi0KLS8qIFBvc2l0aW9ucyBhbmQgbWFza3Mgb2YgdmFyaW91cyBmaWVsZHM6ICAqLwotI2RlZmluZSBBUkNfU0hJRlRfUkVHQSAyMQotI2RlZmluZSBBUkNfU0hJRlRfUkVHQiAxNQotI2RlZmluZSBBUkNfU0hJRlRfUkVHQyA5Ci0jZGVmaW5lIEFSQ19NQVNLX1JFRyA2MwotCi0vKiBEZWxheSBzbG90IHR5cGVzLiAgKi8KLSNkZWZpbmUgQVJDX0RFTEFZX05PTkUgMAkvKiBubyBkZWxheSBzbG90ICovCi0jZGVmaW5lIEFSQ19ERUxBWV9OT1JNQUwgMQkvKiBkZWxheSBzbG90IGluIGJvdGggY2FzZXMgKi8KLSNkZWZpbmUgQVJDX0RFTEFZX0pVTVAgMgkvKiBkZWxheSBzbG90IG9ubHkgaWYgYnJhbmNoIHRha2VuICovCi0KLS8qIE5vbi16ZXJvIGlmIFggd2lsbCBmaXQgaW4gYSBzaWduZWQgOSBiaXQgZmllbGQuICAqLwotI2RlZmluZSBBUkNfU0hJTU1fQ09OU1RfUCh4KSAoKGxvbmcpICh4KSA+PSAtMjU2ICYmIChsb25nKSAoeCkgPD0gMjU1KQotCi1leHRlcm4gY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kIGFyY19vcGVyYW5kc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfb3BlcmFuZF9jb3VudDsKLWV4dGVybiAvKmNvbnN0Ki8gc3RydWN0IGFyY19vcGNvZGUgYXJjX29wY29kZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYXJjX29wY29kZXNfY291bnQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIGFyY19zdWZmaXhlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBhcmNfc3VmZml4ZXNfY291bnQ7Ci1leHRlcm4gY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIGFyY19yZWdfbmFtZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYXJjX3JlZ19uYW1lc19jb3VudDsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGFyY19vcGVyYW5kX21hcFtdOwotCi0vKiBVdGlsaXR5IGZucyBpbiBhcmMtb3BjLmMuICAqLwotaW50IGFyY19nZXRfb3Bjb2RlX21hY2ggUEFSQU1TICgoaW50LCBpbnQpKTsKLS8qIGBhcmNfb3Bjb2RlX2luaXRfdGFibGVzJyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYGFyY194eHhfc3VwcG9ydGVkJy4gICovCi12b2lkIGFyY19vcGNvZGVfaW5pdF90YWJsZXMgUEFSQU1TICgoaW50KSk7Ci12b2lkIGFyY19vcGNvZGVfaW5pdF9pbnNlcnQgUEFSQU1TICgodm9pZCkpOwotdm9pZCBhcmNfb3Bjb2RlX2luaXRfZXh0cmFjdCBQQVJBTVMgKCh2b2lkKSk7Ci1jb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqYXJjX29wY29kZV9sb29rdXBfYXNtIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKmFyY19vcGNvZGVfbG9va3VwX2RpcyBQQVJBTVMgKCh1bnNpZ25lZCBpbnQpKTsKLWludCBhcmNfb3Bjb2RlX2xpbW1fcCBQQVJBTVMgKChsb25nICopKTsKLWNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqYXJjX29wY29kZV9sb29rdXBfc3VmZml4IFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqdHlwZSwgaW50IHZhbHVlKSk7Ci1pbnQgYXJjX29wY29kZV9zdXBwb3J0ZWQgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKikpOwotaW50IGFyY19vcHZhbF9zdXBwb3J0ZWQgUEFSQU1TICgoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICopKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2FybS5oIGIvaW5jbHVkZS9vcGNvZGUvYXJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDg3ZWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvYXJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyogQVJNIG9wY29kZSBsaXN0LgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCIGFuZCBHQVMuCi0KLUdEQiBhbmQgR0FTIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiBhbmQgR0FTIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdEQiBvciBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIHR5cGVzIG9mIGluc3RydWN0aW9uIChlbmNvZGVkIGluIGJpdHMgMjYgYW5kIDI3IG9mIHRoZSBpbnN0cnVjdGlvbikgKi8KLQotI2RlZmluZSBUWVBFX0FSSVRITUVUSUMJCTAKLSNkZWZpbmUgVFlQRV9MRFJfU1RSCQkxCi0jZGVmaW5lIFRZUEVfQkxPQ0tfQlJBTkNICTIKLSNkZWZpbmUgVFlQRV9TV0kJCTMKLQotLyogYml0IDI1IGRlY2lkZXMgd2hldGhlciBhbiBpbnN0cnVjdGlvbiBpcyBhIGJsb2NrIG1vdmUgb3IgYSBicmFuY2ggKi8KLSNkZWZpbmUgU1VCVFlQRV9CTE9DSwkJMAotI2RlZmluZSBTVUJUWVBFX0JSQU5DSAkJMQotCi0vKiBjb2RlcyB0byBkaXN0aW5ndWlzaCB0aGUgYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgKi8KLQotI2RlZmluZSBPUENPREVfQU5ECTAKLSNkZWZpbmUgT1BDT0RFX0VPUgkxCi0jZGVmaW5lIE9QQ09ERV9TVUIJMgotI2RlZmluZSBPUENPREVfUlNCCTMKLSNkZWZpbmUgT1BDT0RFX0FERAk0Ci0jZGVmaW5lIE9QQ09ERV9BREMJNQotI2RlZmluZSBPUENPREVfU0JDCTYKLSNkZWZpbmUgT1BDT0RFX1JTQwk3Ci0jZGVmaW5lIE9QQ09ERV9UU1QJOAotI2RlZmluZSBPUENPREVfVEVRCTkKLSNkZWZpbmUgT1BDT0RFX0NNUAkxMAotI2RlZmluZSBPUENPREVfQ01OCTExCi0jZGVmaW5lIE9QQ09ERV9PUlIJMTIKLSNkZWZpbmUgT1BDT0RFX01PVgkxMwotI2RlZmluZSBPUENPREVfQklDCTE0Ci0jZGVmaW5lIE9QQ09ERV9NVk4JMTUKLQotLyogY29uZGl0aW9uIGNvZGVzICovCi0KLSNkZWZpbmUgQ09ORF9FUQkJMAotI2RlZmluZSBDT05EX05FCQkxCi0jZGVmaW5lIENPTkRfQ1MJCTIKLSNkZWZpbmUgQ09ORF9DQwkJMwotI2RlZmluZSBDT05EX01JCQk0Ci0jZGVmaW5lIENPTkRfUEwJCTUKLSNkZWZpbmUgQ09ORF9WUwkJNgotI2RlZmluZSBDT05EX1ZDCQk3Ci0jZGVmaW5lIENPTkRfSEkJCTgKLSNkZWZpbmUgQ09ORF9MUwkJOQotI2RlZmluZSBDT05EX0dFCQkxMAotI2RlZmluZSBDT05EX0xUCQkxMQotI2RlZmluZSBDT05EX0dUCQkxMgotI2RlZmluZSBDT05EX0xFCQkxMwotI2RlZmluZSBDT05EX0FMCQkxNAotI2RlZmluZSBDT05EX05WCQkxNQotCi0vKiBEZXNjcmliZXMgdGhlIGZvcm1hdCBvZiBhbiBBUk0gbWFjaGluZSBpbnN0cnVjdGlvbiAqLwotCi1zdHJ1Y3QgZ2VuZXJpY19mbXQgewotICAgIHVuc2lnbmVkIHJlc3QJOjI1OwkvKiB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSAgICB1bnNpZ25lZCBzdWJ0eXBlCToxOwkvKiB1c2VkIHRvIGRlY2lkZSBiZXR3ZWVuIGJsb2NrIGFuZCBicmFuY2ggKi8KLSAgICB1bnNpZ25lZCB0eXBlCToyOwkvKiBvbmUgb2YgVFlQRV8qICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi1zdHJ1Y3QgYXJpdGhfZm10IHsKLSAgICB1bnNpZ25lZCBvcGVyYW5kMgk6MTI7CS8qICNubiBvciBybiBvciBybiBzaGlmdCAjbSBvciBybiBzaGlmdCBybSAqLwotICAgIHVuc2lnbmVkIGRlc3QJOjQ7CS8qIHBsYWNlIHdoZXJlIHRoZSBhbnN3ZXIgZ29lcyAqLwotICAgIHVuc2lnbmVkIG9wZXJhbmQxCTo0OwkvKiBmaXJzdCBvcGVyYW5kIHRvIGluc3RydWN0aW9uICovCi0gICAgdW5zaWduZWQgc2V0CToxOwkvKiA9PSAxIG1lYW5zIHNldCBwcm9jZXNzb3IgZmxhZ3MgKi8KLSAgICB1bnNpZ25lZCBvcGNvZGUJOjQ7CS8qIG9uZSBvZiBPUENPREVfKiBkZWZpbmVkIGFib3ZlICovCi0gICAgdW5zaWduZWQgaW1tZWQJOjE7CS8qIG9wZXJhbmQyIGlzIGFuIGltbWVkaWF0ZSB2YWx1ZSAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qID09IFRZUEVfQVJJVEhNRVRJQyAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotc3RydWN0IGxkcl9zdHJfZm10IHsKLSAgICB1bnNpZ25lZCBvZmZzZXQJOjEyOwkvKiAjbm4gb3Igcm4gb3Igcm4gc2hpZnQgI20gKi8KLSAgICB1bnNpZ25lZCByZWcJOjQ7CS8qIGRlc3RpbmF0aW9uIGZvciBMRFIsIHNvdXJjZSBmb3IgU1RSICovCi0gICAgdW5zaWduZWQgYmFzZQk6NDsJLyogYmFzZSByZWdpc3RlciAqLwotICAgIHVuc2lnbmVkIGlzX2xvYWQJOjE7CS8qID09IDEgZm9yIExEUiAqLwotICAgIHVuc2lnbmVkIHdyaXRlYmFjawk6MTsJLyogPT0gMSBtZWFucyB3cml0ZSBiYWNrIChiYXNlK29mZnNldCkgaW50byBiYXNlICovCi0gICAgdW5zaWduZWQgYnl0ZQk6MTsJLyogPT0gMSBtZWFucyBieXRlIGFjY2VzcyBlbHNlIHdvcmQgKi8KLSAgICB1bnNpZ25lZCB1cAkJOjE7CS8qID09IDEgbWVhbnMgYWRkIG9mZnNldCBlbHNlIHN1YnRyYWN0IGl0ICovCi0gICAgdW5zaWduZWQgcHJlX2luZGV4CToxOwkvKiA9PSAxIG1lYW5zIFthLGJdIGZvcm0gZWxzZSBbYV0sYiBmb3JtICovCi0gICAgdW5zaWduZWQgaW1tZWQJOjE7CS8qID09IDAgbWVhbnMgaW1tZWRpYXRlIG9mZnNldCAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qID09IFRZUEVfTERSX1NUUiAqLwotICAgIHVuc2lnbmVkIGNvbmQJOjQ7CS8qIG9uZSBvZiBDT05EXyogZGVmaW5lZCBhYm92ZSAqLwotfTsKLQotc3RydWN0IGJsb2NrX2ZtdCB7Ci0gICAgdW5zaWduZWQgbWFzawk6MTY7CS8qIHJlZ2lzdGVyIG1hc2sgKi8KLSAgICB1bnNpZ25lZCBiYXNlCTo0OwkvKiByZWdpc3RlciB1c2VkIGFzIGJhc2Ugb2YgbW92ZSAqLwotICAgIHVuc2lnbmVkIGlzX2xvYWQJOjE7CS8qID09IDEgZm9yIExETSAqLwotICAgIHVuc2lnbmVkIHdyaXRlYmFjawk6MTsJLyogPT0gMSBtZWFucyB1cGRhdGUgYmFzZSBhZnRlciBtb3ZlICovCi0gICAgdW5zaWduZWQgc2V0CToxOwkvKiA9PSAxIG1lYW5zIHNldCBmbGFncyBpbiBwYyBpZiBpbmNsdWRlZCBpbiBtYXNrICovCi0gICAgdW5zaWduZWQgaW5jcmVtZW50CToxOwkvKiA9PSAxIG1lYW5zIGluY3JlbWVudCBiYXNlIHJlZ2lzdGVyICovCi0gICAgdW5zaWduZWQgYmVmb3JlCToxOwkvKiA9PSAxIG1lYW5zIGluYy9kZWMgYmVmb3JlIGVhY2ggbW92ZSAqLwotICAgIHVuc2lnbmVkIGlzX2Jsb2NrCToxOwkvKiA9PSBTVUJUWVBFX0JMT0NLICovCi0gICAgdW5zaWduZWQgdHlwZQk6MjsJLyogPT0gVFlQRV9CTE9DS19CUkFOQ0ggKi8KLSAgICB1bnNpZ25lZCBjb25kCTo0OwkvKiBvbmUgb2YgQ09ORF8qIGRlZmluZWQgYWJvdmUgKi8KLX07Ci0KLXN0cnVjdCBicmFuY2hfZm10IHsKLSAgICB1bnNpZ25lZCBkZXN0CToyNDsJLyogZGVzdGluYXRpb24gb2YgdGhlIGJyYW5jaCAqLwotICAgIHVuc2lnbmVkIGxpbmsJOjE7CS8qIGJyYW5jaCB3aXRoIGxpbmsgKGZ1bmN0aW9uIGNhbGwpICovCi0gICAgdW5zaWduZWQgaXNfYnJhbmNoCToxOwkvKiA9PSBTVUJUWVBFX0JSQU5DSCAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qID09IFRZUEVfQkxPQ0tfQlJBTkNIICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi0jZGVmaW5lIFJPVU5EX04JCTAKLSNkZWZpbmUgUk9VTkRfUAkJMQotI2RlZmluZSBST1VORF9NCQkyCi0jZGVmaW5lIFJPVU5EX1oJCTMKLQotI2RlZmluZSBGTE9BVDJfTVZGCTAKLSNkZWZpbmUgRkxPQVQyX01ORgkxCi0jZGVmaW5lIEZMT0FUMl9BQlMJMgotI2RlZmluZSBGTE9BVDJfUk5ECTMKLSNkZWZpbmUgRkxPQVQyX1NRVAk0Ci0jZGVmaW5lIEZMT0FUMl9MT0cJNQotI2RlZmluZSBGTE9BVDJfTEdOCTYKLSNkZWZpbmUgRkxPQVQyX0VYUAk3Ci0jZGVmaW5lIEZMT0FUMl9TSU4JOAotI2RlZmluZSBGTE9BVDJfQ09TCTkKLSNkZWZpbmUgRkxPQVQyX1RBTgkxMAotI2RlZmluZSBGTE9BVDJfQVNOCTExCi0jZGVmaW5lIEZMT0FUMl9BQ1MJMTIKLSNkZWZpbmUgRkxPQVQyX0FUTgkxMwotCi0jZGVmaW5lIEZMT0FUM19BREYJMAotI2RlZmluZSBGTE9BVDNfTVVGCTEKLSNkZWZpbmUgRkxPQVQzX1NVRgkyCi0jZGVmaW5lIEZMT0FUM19SU0YJMwotI2RlZmluZSBGTE9BVDNfRFZGCTQKLSNkZWZpbmUgRkxPQVQzX1JERgk1Ci0jZGVmaW5lIEZMT0FUM19QT1cJNgotI2RlZmluZSBGTE9BVDNfUlBXCTcKLSNkZWZpbmUgRkxPQVQzX1JNRgk4Ci0jZGVmaW5lIEZMT0FUM19GTUwJOQotI2RlZmluZSBGTE9BVDNfRkRWCTEwCi0jZGVmaW5lIEZMT0FUM19GUkQJMTEKLSNkZWZpbmUgRkxPQVQzX1BPTAkxMgotCi1zdHJ1Y3QgZmxvYXQyX2ZtdCB7Ci0gICAgdW5zaWduZWQgb3BlcmFuZDIJOjM7CS8qIHNlY29uZCBvcGVyYW5kICovCi0gICAgdW5zaWduZWQgaW1tZWQJOjE7CS8qID09IDEgaWYgc2Vjb25kIG9wZXJhbmQgaXMgYSBjb25zdGFudCAqLwotICAgIHVuc2lnbmVkIHBhZDEJOjE7CS8qID09IDAgKi8KLSAgICB1bnNpZ25lZCByb3VuZGluZwk6MjsJLyogUk9VTkRfKiAqLwotICAgIHVuc2lnbmVkIGlzX2RvdWJsZQk6MTsJLyogPT0gMSBpZiBwcmVjaXNpb24gaXMgZG91YmxlIChvbmx5IGlmIG5vdCBleHRlbmRlZCkgKi8KLSAgICB1bnNpZ25lZCBwYWQyCTo0OwkvKiA9PSAxICovCi0gICAgdW5zaWduZWQgZGVzdAk6MzsJLyogZGVzdGluYXRpb24gKi8KLSAgICB1bnNpZ25lZCBpc18yX29wCToxOwkvKiA9PSAxIGlmIDIgb3BlcmFuZCBpbnMgKi8KLSAgICB1bnNpZ25lZCBvcGVyYW5kMQk6MzsJLyogZmlyc3Qgb3BlcmFuZCAob25seSBvZiBpc18yX29wID09IDApICovCi0gICAgdW5zaWduZWQgaXNfZXh0ZW5kZWQgOjE7CS8qID09IDEgaWYgcHJlY2lzaW9uIGlzIGV4dGVuZGVkICovCi0gICAgdW5zaWduZWQgb3Bjb2RlCTo0OwkvKiBGTE9BVDJfKiBvciBGTE9BVDNfKiBkZXBlbmRpbmcgb24gaXNfMl9vcCAqLwotICAgIHVuc2lnbmVkIG11c3RfYmVfMgk6MjsJLyogPT0gMiAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qID09IFRZUEVfU1dJICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogQ09ORF8qICovCi19OwotCi1zdHJ1Y3Qgc3dpX2ZtdCB7Ci0gICAgdW5zaWduZWQgYXJndW1lbnQJOjI0OwkvKiBhcmd1bWVudCB0byBTV0kgKHN5c2NhbGwgbnVtYmVyKSAqLwotICAgIHVuc2lnbmVkIG11c3RfYmVfMwk6MjsJLyogPT0gMyAqLwotICAgIHVuc2lnbmVkIHR5cGUJOjI7CS8qID09IFRZUEVfU1dJICovCi0gICAgdW5zaWduZWQgY29uZAk6NDsJLyogb25lIG9mIENPTkRfKiBkZWZpbmVkIGFib3ZlICovCi19OwotCi11bmlvbiBpbnNuX2ZtdCB7Ci0gICAgc3RydWN0IGdlbmVyaWNfZm10CWdlbmVyaWM7Ci0gICAgc3RydWN0IGFyaXRoX2ZtdAlhcml0aDsKLSAgICBzdHJ1Y3QgbGRyX3N0cl9mbXQJbGRyX3N0cjsKLSAgICBzdHJ1Y3QgYmxvY2tfZm10CWJsb2NrOwotICAgIHN0cnVjdCBicmFuY2hfZm10CWJyYW5jaDsKLSAgICBzdHJ1Y3Qgc3dpX2ZtdAlzd2k7Ci0gICAgdW5zaWduZWQgbG9uZwlpbnM7Ci19OwotCi1zdHJ1Y3Qgb3Bjb2RlIHsKLSAgICB1bnNpZ25lZCBsb25nIHZhbHVlLCBtYXNrOwkvKiByZWNvZ25pc2UgaW5zdHJ1Y3Rpb24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLwotICAgIGNoYXIgKmFzc2VtYmxlcjsJCS8qIGhvdyB0byBkaXNhc3NlbWJsZSB0aGlzIGluc3RydWN0aW9uICovCi19OwotCi0vKiBmb3JtYXQgb2YgdGhlIGFzc2VtYmxlciBzdHJpbmcgOgotICAgCi0gICAlJQkJCSUKLSAgICU8Yml0ZmllbGQ+ZAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGRlY2ltYWwKLSAgICU8Yml0ZmllbGQ+eAkJcHJpbnQgdGhlIGJpdGZpZWxkIGluIGhleAotICAgJTxiaXRmaWVsZD5yCQlwcmludCBhcyBhbiBBUk0gcmVnaXN0ZXIKLSAgICU8Yml0ZmllbGQ+ZgkJcHJpbnQgYSBmbG9hdGluZyBwb2ludCBjb25zdGFudCBpZiA+NyBlbHNlIGFuIGZwIHJlZ2lzdGVyCi0gICAlYwkJCXByaW50IGNvbmRpdGlvbiBjb2RlIChhbHdheXMgYml0cyAyOC0zMSkKLSAgICVQCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGFyaXRobWV0aWMgaW5zbgotICAgJVEJCQlwcmludCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gbGRmL3N0ZiBpbnNuCi0gICAlUgkJCXByaW50IGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIG1vZGUKLSAgICU8Yml0bnVtPidjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIG9uZQotICAgJTxiaXRudW0+YGMJCXByaW50IHNwZWNpZmllZCBjaGFyIGlmZiBiaXQgaXMgemVybwotICAgJTxiaXRudW0+P2FiCQlwcmludCBhIGlmIGJpdCBpcyBvbmUgZWxzZSBwcmludCBiCi0gICAlcAkJCXByaW50ICdwJyBpZmYgYml0cyAxMi0xNSBhcmUgMTUKLSAgICVvCQkJcHJpbnQgb3BlcmFuZDIgKGltbWVkaWF0ZSBvciByZWdpc3RlciArIHNoaWZ0KQotICAgJWEJCQlwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGluc3RydWN0aW9uCi0gICAlYgkJCXByaW50IGJyYW5jaCBkZXN0aW5hdGlvbgotICAgJUEJCQlwcmludCBhZGRyZXNzIGZvciBsZGMvc3RjL2xkZi9zdGYgaW5zdHJ1Y3Rpb24KLSAgICVtCQkJcHJpbnQgcmVnaXN0ZXIgbWFzayBmb3IgbGRtL3N0bSBpbnN0cnVjdGlvbgotKi8KLQotc3RhdGljIHN0cnVjdCBvcGNvZGUgb3Bjb2Rlc1tdID0gewotICAgIC8qIEFSTSBpbnN0cnVjdGlvbnMgKi8KLSAgICAweDAwMDAwMDkwLCAweDBmZTAwMGYwLCAibXVsJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IiLAotICAgIDB4MDAyMDAwOTAsIDB4MGZlMDAwZjAsICJtbGElMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlMC0zciwgJTgtMTFyIiwKLSAgICAweDAwMDAwMDAwLCAweDBkZTAwMDAwLCAiYW5kJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMDIwMDAwMCwgMHgwZGUwMDAwMCwgImVvciVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDA0MDAwMDAsIDB4MGRlMDAwMDAsICJzdWIlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwNjAwMDAwLCAweDBkZTAwMDAwLCAicnNiJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMDgwMDAwMCwgMHgwZGUwMDAwMCwgImFkZCVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDBhMDAwMDAsIDB4MGRlMDAwMDAsICJhZGMlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAwYzAwMDAwLCAweDBkZTAwMDAwLCAic2JjJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMGUwMDAwMCwgMHgwZGUwMDAwMCwgInJzYyVjJTIwJ3MgJTEyLTE1ciwgJTE2LTE5ciwgJW8iLAotICAgIDB4MDEwMDAwMDAsIDB4MGRlMDAwMDAsICJ0c3QlYyVwICUxNi0xOXIsICVvIiwKLSAgICAweDAxMjAwMDAwLCAweDBkZTAwMDAwLCAidGVxJWMlcCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMTQwMDAwMCwgMHgwZGUwMDAwMCwgImNtcCVjJXAgJTE2LTE5ciwgJW8iLAotICAgIDB4MDE2MDAwMDAsIDB4MGRlMDAwMDAsICJjbW4lYyVwICUxNi0xOXIsICVvIiwKLSAgICAweDAxODAwMDAwLCAweDBkZTAwMDAwLCAib3JyJWMlMjAncyAlMTItMTVyLCAlMTYtMTlyLCAlbyIsCi0gICAgMHgwMWEwMDAwMCwgMHgwZGUwMDAwMCwgIm1vdiVjJTIwJ3MgJTEyLTE1ciwgJW8iLAotICAgIDB4MDFjMDAwMDAsIDB4MGRlMDAwMDAsICJiaWMlYyUyMCdzICUxMi0xNXIsICUxNi0xOXIsICVvIiwKLSAgICAweDAxZTAwMDAwLCAweDBkZTAwMDAwLCAibXZuJWMlMjAncyAlMTItMTVyLCAlbyIsCi0gICAgMHgwNDAwMDAwMCwgMHgwYzEwMDAwMCwgInN0ciVjJTIyJ2IgJTEyLTE1ciwgJWEiLAotICAgIDB4MDQxMDAwMDAsIDB4MGMxMDAwMDAsICJsZHIlYyUyMidiICUxMi0xNXIsICVhIiwKLSAgICAweDA4MDAwMDAwLCAweDBlMTAwMDAwLCAic3RtJWMlMjM/aWQlMjQ/YmEgJTE2LTE5ciUyMmAhLCAlbSIsCi0gICAgMHgwODEwMDAwMCwgMHgwZTEwMDAwMCwgImxkbSVjJTIzP2lkJTI0P2JhICUxNi0xOXIlMjJgISwgJW0lMjInXiIsCi0gICAgMHgwYTAwMDAwMCwgMHgwZTAwMDAwMCwgImIlYyUyNCdsICViIiwKLSAgICAweDBmMDAwMDAwLCAweDBmMDAwMDAwLCAic3dpJWMgJTAtMjN4IiwKLSAgICAvKiBGbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgICAweDBlMDAwMTAwLCAweDBmZjA4ZjEwLCAiYWRmJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlMTAwMTAwLCAweDBmZjA4ZjEwLCAibXVmJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlMjAwMTAwLCAweDBmZjA4ZjEwLCAic3VmJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlMzAwMTAwLCAweDBmZjA4ZjEwLCAicnNmJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlNDAwMTAwLCAweDBmZjA4ZjEwLCAiZHZmJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlNTAwMTAwLCAweDBmZjA4ZjEwLCAicmRmJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlNjAwMTAwLCAweDBmZjA4ZjEwLCAicG93JWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlNzAwMTAwLCAweDBmZjA4ZjEwLCAicnB3JWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlODAwMTAwLCAweDBmZjA4ZjEwLCAicm1mJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlOTAwMTAwLCAweDBmZjA4ZjEwLCAiZm1sJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlYTAwMTAwLCAweDBmZjA4ZjEwLCAiZmR2JWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlYjAwMTAwLCAweDBmZjA4ZjEwLCAiZnJkJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlYzAwMTAwLCAweDBmZjA4ZjEwLCAicG9sJWMlUCVSICUxMi0xNGYsICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlMDA4MTAwLCAweDBmZjA4ZjEwLCAibXZmJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlMTA4MTAwLCAweDBmZjA4ZjEwLCAibW5mJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlMjA4MTAwLCAweDBmZjA4ZjEwLCAiYWJzJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlMzA4MTAwLCAweDBmZjA4ZjEwLCAicm5kJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlNDA4MTAwLCAweDBmZjA4ZjEwLCAic3F0JWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlNTA4MTAwLCAweDBmZjA4ZjEwLCAibG9nJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlNjA4MTAwLCAweDBmZjA4ZjEwLCAibGduJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlNzA4MTAwLCAweDBmZjA4ZjEwLCAiZXhwJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlODA4MTAwLCAweDBmZjA4ZjEwLCAic2luJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlOTA4MTAwLCAweDBmZjA4ZjEwLCAiY29zJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlYTA4MTAwLCAweDBmZjA4ZjEwLCAidGFuJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlYjA4MTAwLCAweDBmZjA4ZjEwLCAiYXNuJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlYzA4MTAwLCAweDBmZjA4ZjEwLCAiYWNzJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlZDA4MTAwLCAweDBmZjA4ZjEwLCAiYXRuJWMlUCVSICUxMi0xNGYsICUwLTNmIiwKLSAgICAweDBlMDAwMTEwLCAweDBmZjAwZjFmLCAiZmx0JWMlUCVSICUxNi0xOGYsICUxMi0xNXIiLAotICAgIDB4MGUxMDAxMTAsIDB4MGZmZjBmOTgsICJmaXglYyVSICUxMi0xNXIsICUwLTJmIiwKLSAgICAweDBlMjAwMTEwLCAweDBmZmYwZmZmLCAid2ZzJWMgJTEyLTE1ciIsCi0gICAgMHgwZTMwMDExMCwgMHgwZmZmMGZmZiwgInJmcyVjICUxMi0xNXIiLAotICAgIDB4MGU0MDAxMTAsIDB4MGZmZjBmZmYsICJ3ZmMlYyAlMTItMTVyIiwKLSAgICAweDBlNTAwMTEwLCAweDBmZmYwZmZmLCAicmZjJWMgJTEyLTE1ciIsCi0gICAgMHgwZTkwZjExMCwgMHgwZmY4ZmZmMCwgImNtZiVjICUxNi0xOGYsICUwLTNmIiwKLSAgICAweDBlYjBmMTEwLCAweDBmZjhmZmYwLCAiY25mJWMgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVkMGYxMTAsIDB4MGZmOGZmZjAsICJjbWZlJWMgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGVmMGYxMTAsIDB4MGZmOGZmZjAsICJjbmZlJWMgJTE2LTE4ZiwgJTAtM2YiLAotICAgIDB4MGMwMDAxMDAsIDB4MGUxMDBmMDAsICJzdGYlYyVRICUxMi0xNGYsICVBIiwKLSAgICAweDBjMTAwMTAwLCAweDBlMTAwZjAwLCAibGRmJWMlUSAlMTItMTRmLCAlQSIsCi0gICAgLyogR2VuZXJpYyBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgKi8KLSAgICAweDBlMDAwMDAwLCAweDBmMDAwMDEwLCAiY2RwJWMgJTgtMTFkLCAlMjAtMjNkLCBjciUxMi0xNWQsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSIsCi0gICAgMHgwZTAwMDAxMCwgMHgwZjEwMDAxMCwgIm1yYyVjICU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9IiwKLSAgICAweDBlMTAwMDEwLCAweDBmMTAwMDEwLCAibWNyJWMgJTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0iLAotICAgIDB4MGMwMDAwMDAsIDB4MGUxMDAwMDAsICJzdGMlYyUyMmBsICU4LTExZCwgY3IlMTItMTVkLCAlQSIsCi0gICAgMHgwYzEwMDAwMCwgMHgwZTEwMDAwMCwgImxkYyVjJTIyYGwgJTgtMTFkLCBjciUxMi0xNWQsICVBIiwKLSAgICAvKiB0aGUgcmVzdCAqLwotICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsICJ1bmRlZmluZWQgaW5zdHJ1Y3Rpb24gJTAtMzF4IiwKLX07Ci0jZGVmaW5lIE5fT1BDT0RFUwkoc2l6ZW9mIG9wY29kZXMgLyBzaXplb2Ygb3Bjb2Rlc1swXSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2NnZW4uaCBiL2luY2x1ZGUvb3Bjb2RlL2NnZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1NDJhMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9jZ2VuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzgwICswLDAgQEAKLS8qIEhlYWRlciBmaWxlIGZvciB0YXJnZXRzIHVzaW5nIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBhbmQgdGhlIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBDR0VOX0gKLSNkZWZpbmUgQ0dFTl9ICi0KLS8qID8/PyBUaGlzIGZpbGUgcmVxdWlyZXMgYmZkLmggYnV0IG9ubHkgdG8gZ2V0IGJmZF92bWEuCi0gICBTZWVtcyBsaWtlIGFuIGF3ZnVsIGxvdCB0byByZXF1aXJlIGp1c3QgdG8gZ2V0IHN1Y2ggYSBmdW5kYW1lbnRhbCB0eXBlLgotICAgUGVyaGFwcyB0aGUgZGVmaW5pdGlvbiBvZiBiZmRfdm1hIGNhbiBiZSBtb3ZlZCBvdXRzaWRlIG9mIGJmZC5oLgotICAgT3IgcGVyaGFwcyBvbmUgY291bGQgZHVwbGljYXRlIGl0cyBkZWZpbml0aW9uIGluIGFub3RoZXIgZmlsZS4KLSAgIFVudGlsIHN1Y2ggdGltZSwgdGhpcyBmaWxlIGNvbmRpdGlvbmFsbHkgY29tcGlsZXMgZGVmaW5pdGlvbnMgdGhhdCByZXF1aXJlCi0gICBiZmRfdm1hIHVzaW5nIEJGRF9WRVJTSU9OLiAgKi8KLQotLyogRW51bXMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkLgotICAgQWxsb3cgdGhlbSB0byBiZSB1c2VkIGluIHN0cnVjdCBkZWZpbml0aW9ucywgZXZlbiB0aG91Z2ggdGhlIGVudW0gbXVzdAotICAgYmUgZGVmaW5lZCBlbHNld2hlcmUuCi0gICBJZiBDR0VOX0FSQ0ggaXNuJ3QgZGVmaW5lZCwgdGhpcyBmaWxlIGlzIGJlaW5nIGluY2x1ZGVkIGJ5IHNvbWV0aGluZyBvdGhlcgotICAgdGhhbiA8YXJjaD4tZGVzYy5oLiAgKi8KLQotLyogUHJlcGVuZCB0aGUgYXJjaCBuYW1lLCBkZWZpbmVkIGluIDxhcmNoPi1kZXNjLmgsIGFuZCBfY2dlbl8gdG8gc3ltYm9sIFMuCi0gICBUaGUgbGFjayBvZiBzcGFjZXMgaW4gdGhlIGFyZyBsaXN0IGlzIGltcG9ydGFudCBmb3Igbm9uLXN0ZGMgc3lzdGVtcy4KLSAgIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCBieSA8YXJjaD4tZGVzYy5oLgotICAgSXQgY2FuIGJlIGluY2x1ZGVkIGluZGVwZW5kZW50bHkgb2YgPGFyY2g+LWRlc2MuaCwgaW4gd2hpY2ggY2FzZSB0aGUgYXJjaAotICAgZGVwZW5kZW50IHBvcnRpb25zIHdpbGwgYmUgZGVjbGFyZWQgYXMgInVua25vd25fY2dlbl9mb28iLiAgKi8KLQotI2lmbmRlZiBDR0VOX1NZTQotI2RlZmluZSBDR0VOX1NZTShzKSBDT05DQVQzICh1bmtub3duLF9jZ2VuXyxzKQotI2VuZGlmCi0KLS8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RhdGljICh1bmNoYW5naW5nKSBwaWVjZXMgYW5kIGFzIG11Y2ggb3RoZXIgc3R1ZmYKLSAgIGFzIHdlIGNhbiByZWFzb25hYmx5IHB1dCBoZXJlLiAgSXQncyBnZW5lcmFsbHkgY2xlYW5lciB0byBwdXQgc3R1ZmYgaGVyZQotICAgcmF0aGVyIHRoYW4gaGF2aW5nIGl0IG1hY2hpbmUgZ2VuZXJhdGVkIGlmIHBvc3NpYmxlLiAgKi8KLQotLyogVGhlIGFzc2VtYmxlciBzeW50YXggaXMgbWFkZSB1cCBvZiBleHByZXNzaW9ucyAoZHVoLi4uKS4KLSAgIEF0IHRoZSBsb3dlc3QgbGV2ZWwgdGhlIHZhbHVlcyBhcmUgbW5lbW9uaWNzLCByZWdpc3RlciBuYW1lcywgbnVtYmVycywgZXRjLgotICAgQWJvdmUgdGhhdCBhcmUgc3ViZXhwcmVzc2lvbnMsIGlmIGFueSAoYW4gZXhhbXBsZSBtaWdodCBiZSB0aGUKLSAgICJlZmZlY3RpdmUgYWRkcmVzcyIgaW4gbTY4ayBjcHVzKS4gIFN1YmV4cHJlc3Npb25zIGFyZSB3aXAuCi0gICBBdCB0aGUgc2Vjb25kIGhpZ2hlc3QgbGV2ZWwgYXJlIHRoZSBpbnNucyB0aGVtc2VsdmVzLiAgQWJvdmUgdGhhdCBhcmUKLSAgIHBzZXVkby1pbnNucywgc3ludGhldGljIGluc25zLCBhbmQgbWFjcm9zLCBpZiBhbnkuICAqLwotDAotLyogTG90cyBvZiBjcHUncyBoYXZlIGEgZml4ZWQgaW5zbiBzaXplLCBvciBvbmUgd2hpY2ggcmFyZWx5IGNoYW5nZXMsCi0gICBhbmQgaXQncyBnZW5lcmFsbHkgZWFzaWVyIHRvIGhhbmRsZSB0aGVzZSBieSB0cmVhdGluZyB0aGUgaW5zbiBhcyBhbgotICAgaW50ZWdlciB0eXBlLCByYXRoZXIgdGhhbiBhbiBhcnJheSBvZiBjaGFyYWN0ZXJzLiAgU28gd2UgYWxsb3cgdGFyZ2V0cwotICAgdG8gY29udHJvbCB0aGlzLiAgV2hlbiBhbiBpbnRlZ2VyIHR5cGUgdGhlIHZhbHVlIGlzIGluIGhvc3QgYnl0ZSBvcmRlciwKLSAgIHdoZW4gYW4gYXJyYXkgb2YgY2hhcmFjdGVycyB0aGUgdmFsdWUgaXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuICAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBDR0VOX0lOU05fSU5UOwotI2lmIENHRU5fSU5UX0lOU05fUAotdHlwZWRlZiBDR0VOX0lOU05fSU5UIENHRU5fSU5TTl9CWVRFUzsKLXR5cGVkZWYgQ0dFTl9JTlNOX0lOVCAqQ0dFTl9JTlNOX0JZVEVTX1BUUjsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgKkNHRU5fSU5TTl9CWVRFUzsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAqQ0dFTl9JTlNOX0JZVEVTX1BUUjsKLSNlbmRpZgotCi0jaWZkZWYgX19HTlVDX18KLSNkZWZpbmUgQ0dFTl9JTkxJTkUgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgQ0dFTl9JTkxJTkUKLSNlbmRpZgotCi1lbnVtIGNnZW5fZW5kaWFuCi17Ci0gIENHRU5fRU5ESUFOX1VOS05PV04sCi0gIENHRU5fRU5ESUFOX0xJVFRMRSwKLSAgQ0dFTl9FTkRJQU5fQklHCi19OwotCi0vKiBGb3J3YXJkIGRlY2wuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2luc24gQ0dFTl9JTlNOOwotCi0vKiBPcGFxdWUgcG9pbnRlciB2ZXJzaW9uIGZvciB1c2UgYnkgZXh0ZXJuYWwgd29ybGQuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2NwdV9kZXNjICpDR0VOX0NQVV9ERVNDOwotDAotLyogQXR0cmlidXRlcy4KLSAgIEF0dHJpYnV0ZXMgYXJlIHVzZWQgdG8gZGVzY3JpYmUgdmFyaW91cyByYW5kb20gdGhpbmdzIGFzc29jaWF0ZWQgd2l0aAotICAgYW4gb2JqZWN0IChpZmllbGQsIGhhcmR3YXJlLCBvcGVyYW5kLCBpbnNuLCB3aGF0ZXZlcikgYW5kIGFyZSBzcGVjaWZpZWQKLSAgIGFzIG5hbWUvdmFsdWUgcGFpcnMuCi0gICBJbnRlZ2VyIGF0dHJpYnV0ZXMgY29tcHV0ZWQgYXQgY29tcGlsZSB0aW1lIGFyZSBjdXJyZW50bHkgYWxsIHRoYXQncwotICAgc3VwcG9ydGVkLCB0aG91Z2ggYWRkaW5nIHN0cmluZyBhdHRyaWJ1dGVzIGFuZCBydW4tdGltZSBjb21wdXRhdGlvbiBpcwotICAgc3RyYWlnaHRmb3J3YXJkLiAgSW50ZWdlciBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBhbHdheXMgaG9zdCBpbnQncwotICAgKHNpZ25lZCBvciB1bnNpZ25lZCkuICBGb3IgcG9ydGFiaWxpdHksIHRoaXMgbWVhbnMgMzIgYml0cy4KLSAgIEludGVnZXIgYXR0cmlidXRlcyBhcmUgZnVydGhlciBjYXRlZ29yaXplZCBhcyBib29sZWFuLCBiaXRzZXQsIGludGVnZXIsCi0gICBhbmQgZW51bSB0eXBlcy4gIEJvb2xlYW4gYXR0cmlidXRlcyBhcHBlYXIgZnJlcXVlbnRseSBlbm91Z2ggdGhhdCB0aGV5J3JlCi0gICByZWNvcmRlZCBpbiBvbmUgaG9zdCBpbnQuICBUaGlzIGxpbWl0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYm9vbGVhbgotICAgYXR0cmlidXRlcyB0byAzMiwgdGhvdWdoIHRoYXQncyBhICpsb3QqIG9mIGF0dHJpYnV0ZXMuICAqLwotCi0vKiBUeXBlIG9mIGF0dHJpYnV0ZSB2YWx1ZXMuICAqLwotCi10eXBlZGVmIGludCBDR0VOX0FUVFJfVkFMVUVfVFlQRTsKLQotLyogU3RydWN0IHRvIHJlY29yZCBhdHRyaWJ1dGUgaW5mb3JtYXRpb24uICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBCb29sZWFuIGF0dHJpYnV0ZXMuICAqLwotICB1bnNpZ25lZCBpbnQgYm9vbDsKLSAgLyogTm9uLWJvb2xlYW4gaW50ZWdlciBhdHRyaWJ1dGVzLiAgKi8KLSAgQ0dFTl9BVFRSX1ZBTFVFX1RZUEUgbm9uYm9vbFsxXTsKLX0gQ0dFTl9BVFRSOwotCi0vKiBEZWZpbmUgYSBzdHJ1Y3R1cmUgbWVtYmVyIGZvciBhdHRyaWJ1dGVzIHdpdGggTiBub24tYm9vbGVhbiBlbnRyaWVzLgotICAgVGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygbm9uLWJvb2xlYW4gYXR0cmlidXRlcy4KLSAgIFRoZXJlIGlzIGEgbWF4aW11bSBvZiAzMiBib29sZWFuIGF0dHJpYnV0ZXMgKHNpbmNlIHRoZXkgYXJlIGFsbCByZWNvcmRlZAotICAgaW4gb25lIGhvc3QgaW50KS4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX1RZUEUobikgXAotc3RydWN0IHsgdW5zaWduZWQgaW50IGJvb2w7IFwKLQkgQ0dFTl9BVFRSX1ZBTFVFX1RZUEUgbm9uYm9vbFsobikgPyAobikgOiAxXTsgfQotCi0vKiBSZXR1cm4gdGhlIGJvb2xlYW4gYXR0cmlidXRlcy4gICovCi0KLSNkZWZpbmUgQ0dFTl9BVFRSX0JPT0xTKGEpICgoYSktPmJvb2wpCi0KLS8qIE5vbi1ib29sZWFuIGF0dHJpYnV0ZSBudW1iZXJzIGFyZSBvZmZzZXQgYnkgdGhpcyBtdWNoLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfTkJPT0xfT0ZGU0VUIDMyCi0KLS8qIEdpdmVuIGEgYm9vbGVhbiBhdHRyaWJ1dGUgbnVtYmVyLCByZXR1cm4gaXRzIG1hc2suICAqLwotCi0jZGVmaW5lIENHRU5fQVRUUl9NQVNLKGF0dHIpICgxIDw8IChhdHRyKSkKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiBib29sZWFuIGF0dHJpYnV0ZSBBVFRSIGluIEFUVFJTLiAgKi8KLQotI2RlZmluZSBDR0VOX0JPT0xfQVRUUihhdHRycywgYXR0cikgKChDR0VOX0FUVFJfTUFTSyAoYXR0cikgJiAoYXR0cnMpKSAhPSAwKQotCi0vKiBSZXR1cm4gdmFsdWUgb2YgYXR0cmlidXRlIEFUVFIgaW4gQVRUUl9UQUJMRSBmb3IgT0JKLgotICAgT0JKIGlzIGEgcG9pbnRlciB0byB0aGUgZW50aXR5IHRoYXQgaGFzIHRoZSBhdHRyaWJ1dGVzCi0gICAoPz8/IG5vdCB1c2VkIGF0IHByZXNlbnQgYnV0IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgcHVycG9zZXMgLSBldmVudHVhbGx5Ci0gICB0aGUgZ29hbCBpcyB0byBhbGxvdyByZWNvcmRpbmcgYXR0cmlidXRlcyBpbiBzb3VyY2UgZm9ybSBhbmQgY29tcHV0aW5nCi0gICB0aGVtIGxhemlseSBhdCBydW50aW1lLCBub3Qgc3VyZSBvZiB0aGUgZGV0YWlscyB5ZXQpLiAgKi8KLQotI2RlZmluZSBDR0VOX0FUVFJfVkFMVUUob2JqLCBhdHRyX3RhYmxlLCBhdHRyKSBcCi0oKHVuc2lnbmVkIGludCkgKGF0dHIpIDwgQ0dFTl9BVFRSX05CT09MX09GRlNFVCBcCi0gPyAoKENHRU5fQVRUUl9CT09MUyAoYXR0cl90YWJsZSkgJiBDR0VOX0FUVFJfTUFTSyAoYXR0cikpICE9IDApIFwKLSA6ICgoYXR0cl90YWJsZSktPm5vbmJvb2xbKGF0dHIpIC0gQ0dFTl9BVFRSX05CT09MX09GRlNFVF0pKQotCi0vKiBBdHRyaWJ1dGUgbmFtZS92YWx1ZSB0YWJsZXMuCi0gICBUaGVzZSBhcmUgdXNlZCB0byBhc3Npc3QgcGFyc2luZyBvZiBkZXNjcmlwdGlvbnMgYXQgcnVuLXRpbWUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBjb25zdCBjaGFyICogbmFtZTsKLSAgQ0dFTl9BVFRSX1ZBTFVFX1RZUEUgdmFsdWU7Ci19IENHRU5fQVRUUl9FTlRSWTsKLQotLyogRm9yIGVhY2ggZG9tYWluIChpZmxkLGh3LG9wZXJhbmQsaW5zbiksIGxpc3Qgb2YgYXR0cmlidXRlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNvbnN0IGNoYXIgKiBuYW1lOwotICBjb25zdCBDR0VOX0FUVFJfRU5UUlkgKiBkZmF1bHQ7Ci0gIGNvbnN0IENHRU5fQVRUUl9FTlRSWSAqIHZhbHM7Ci19IENHRU5fQVRUUl9UQUJMRTsKLQwKLS8qIEluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBEZWZhdWx0IGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgotICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGVuY291bnRlcnMgYW4gdW5rbm93biBpbnNuLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfaW5zbl9iaXRzaXplOwotCi0gIC8qIEJhc2UgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIEZvciBub24tTElXIGNwdXMgdGhpcyBpcyBnZW5lcmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlc3QgaW5zbi4KLSAgICAgRm9yIExJVyBjcHVzIGl0cyB3aXAgKHdvcmstaW4tcHJvZ3Jlc3MpLiAgRm9yIHRoZSBtMzJyIGl0cyAzMi4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX2luc25fYml0c2l6ZTsKLQotICAvKiBNaW5pbXVtL21heGltdW0gaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuICAqLwotICB1bnNpZ25lZCBpbnQgbWluX2luc25fYml0c2l6ZTsKLSAgdW5zaWduZWQgaW50IG1heF9pbnNuX2JpdHNpemU7Ci19IENHRU5fSVNBOwotCi0vKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBUaGUgYXJndW1lbnQgdG8gYmZkX2FyY2hfaW5mby0+c2Nhbi4gICovCi0gIGNvbnN0IGNoYXIgKmJmZF9uYW1lOwotICAvKiBvbmUgb2YgZW51bSBtYWNoX2F0dHIgKi8KLSAgaW50IG51bTsKLX0gQ0dFTl9NQUNIOwotDAotLyogUGFyc2UgcmVzdWx0IChhbHNvIGV4dHJhY3Rpb24gcmVzdWx0KS4KLQotICAgVGhlIHJlc3VsdCBvZiBwYXJzaW5nIGFuIGluc24gaXMgc3RvcmVkIGhlcmUuCi0gICBUbyBnZW5lcmF0ZSB0aGUgYWN0dWFsIGluc24sIHRoaXMgaXMgcGFzc2VkIHRvIHRoZSBpbnNlcnQgaGFuZGxlci4KLSAgIFdoZW4gcHJpbnRpbmcgYW4gaW5zbiwgdGhlIHJlc3VsdCBvZiBleHRyYWN0aW9uIGlzIHN0b3JlZCBoZXJlLgotICAgVG8gcHJpbnQgdGhlIGluc24sIHRoaXMgaXMgcGFzc2VkIHRvIHRoZSBwcmludCBoYW5kbGVyLgotCi0gICBJdCBpcyBtYWNoaW5lIGdlbmVyYXRlZCBzbyB3ZSBkb24ndCBkZWZpbmUgaXQgaGVyZSwKLSAgIGJ1dCB3ZSBkbyBuZWVkIGEgZm9yd2FyZCBkZWNsIGZvciB0aGUgaGFuZGxlciBmbnMuCi0KLSAgIFRoZXJlIGlzIG9uZSBtZW1iZXIgZm9yIGVhY2ggcG9zc2libGUgZmllbGQgaW4gdGhlIGluc24uCi0gICBUaGUgdHlwZSBkZXBlbmRzIG9uIHRoZSBmaWVsZC4KLSAgIEFsc28gcmVjb3JkZWQgaGVyZSBpcyB0aGUgY29tcHV0ZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGZvciBhcmNoaXRlY3R1cmVzCi0gICB3aGVyZSBpdCB2YXJpZXMuCi0qLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2ZpZWxkcyBDR0VOX0ZJRUxEUzsKLQotLyogVG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuLCBhcyByZWNvcmRlZCBpbiB0aGUgYGZpZWxkcycgc3RydWN0LiAgKi8KLS8qID8/PyBUaGUgZmllbGQgaW5zZXJ0IGhhbmRsZXIgaGFzIGxvdHMgb2Ygb3Bwb3J0dW5pdGllcyBmb3Igb3B0aW1pemF0aW9uCi0gICBpZiBpdCBldmVyIGdldHMgaW5saW5lZC4gIE9uIGFyY2hpdGVjdHVyZXMgd2hlcmUgaW5zbnMgYWxsIGhhdmUgdGhlIHNhbWUKLSAgIHNpemUsIG1heSB3aXNoIHRvIGRldGVjdCB0aGF0IGFuZCBtYWtlIHRoaXMgbWFjcm8gYSBjb25zdGFudCAtIHRvIGFsbG93Ci0gICBmdXJ0aGVyIG9wdGltaXphdGlvbnMuICAqLwotCi0jZGVmaW5lIENHRU5fRklFTERTX0JJVFNJWkUoZmllbGRzKSAoKGZpZWxkcyktPmxlbmd0aCkKLQwKLS8qIEV4dHJhY3Rpb24gc3VwcG9ydCBmb3IgdmFyaWFibGUgbGVuZ3RoIGluc24gc2V0cy4gICovCi0KLS8qIFdoZW4gZGlzYXNzZW1ibGluZyB3ZSBkb24ndCBrbm93IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBhdCB0aGUgc3RhcnQuCi0gICBTbyB0aGUgZmlyc3QgQ0dFTl9CQVNFX0lOU05fU0laRSBieXRlcyBhcmUgcmVhZCBhdCB0aGUgc3RhcnQgYW5kIHRoZSByZXN0Ci0gICBhcmUgcmVhZCB3aGVuIG5lZWRlZC4gIFRoaXMgc3RydWN0IGNvbnRyb2xzIHRoaXMuICBJdCBpcyBiYXNpY2FsbHkgdGhlCi0gICBkaXNhc3NlbWJsZV9pbmZvIHN0dWZmLCBleGNlcHQgdGhhdCB3ZSBwcm92aWRlIGEgY2FjaGUgZm9yIHZhbHVlcyBhbHJlYWR5Ci0gICByZWFkIChzaW5jZSBieXRlcyBjYW4gdHlwaWNhbGx5IGJlIHJlYWQgc2V2ZXJhbCB0aW1lcyB0byBmZXRjaCBtdWx0aXBsZQotICAgb3BlcmFuZHMgdGhhdCBtYXkgYmUgaW4gdGhlbSksIGFuZCB0aGF0IGV4dHJhY3Rpb24gb2YgZmllbGRzIGlzIG5lZWRlZAotICAgaW4gY29udGV4dHMgb3RoZXIgdGhhbiBkaXNhc3NlbWJseS4gICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogQSBwb2ludGVyIHRvIHRoZSBkaXNhc3NlbWJsZV9pbmZvIHN0cnVjdC4KLSAgICAgV2UgZG9uJ3QgcmVxdWlyZSBkaXMtYXNtLmggc28gd2UgdXNlIFBUUiBmb3IgdGhlIHR5cGUgaGVyZS4KLSAgICAgSWYgTlVMTCwgQllURVMgaXMgZnVsbCBvZiB2YWxpZCBkYXRhIChWQUxJRCA9PSAtMSkuICAqLwotICBQVFIgZGlzX2luZm87Ci0gIC8qIFBvaW50cyB0byBhIHdvcmtpbmcgYnVmZmVyIG9mIHN1ZmZpY2llbnQgc2l6ZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgKmluc25fYnl0ZXM7Ci0gIC8qIE1hc2sgb2YgYnl0ZXMgdGhhdCBhcmUgdmFsaWQgaW4gSU5TTl9CWVRFUy4gICovCi0gIHVuc2lnbmVkIGludCB2YWxpZDsKLX0gQ0dFTl9FWFRSQUNUX0lORk87Ci0MCi0vKiBBc3NvY2lhdGVkIHdpdGggZWFjaCBpbnNuIG9yIGV4cHJlc3Npb24gaXMgYSBzZXQgb2YgImhhbmRsZXJzIiBmb3IKLSAgIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyBsaWtlIHBhcnNpbmcsIHByaW50aW5nLCBldGMuICBUaGVzZSByZXF1aXJlIGEgYmZkX3ZtYQotICAgdmFsdWUgdG8gYmUgcGFzc2VkIGFyb3VuZCBidXQgd2UgZG9uJ3Qgd2FudCBhbGwgYXBwbGljYXRpb25zIHRvIG5lZWQgYmZkLmguCi0gICBTbyB0aGlzIHN0dWZmIGlzIG9ubHkgcHJvdmlkZWQgaWYgYmZkLmggaGFzIGJlZW4gaW5jbHVkZWQuICAqLwotCi0vKiBQYXJzZSBoYW5kbGVyLgotICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KLSAgIElOU04gaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGRlc2NyaWJpbmcgdGhlIGluc24gYmVpbmcgcGFyc2VkLgotICAgU1RSUCBpcyBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSB0ZXh0IGJlaW5nIHBhcnNlZC4KLSAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QgaW4gd2hpY2ggdGhlIHJlc3VsdHMgYXJlIHBsYWNlZC4KLSAgIElmIHRoZSBleHByZXNzaW9uIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQsICpTVFJQIGlzIHVwZGF0ZWQuCi0gICBJZiBub3QgaXQgaXMgbGVmdCBhbG9uZS4KLSAgIFRoZSByZXN1bHQgaXMgTlVMTCBpZiBzdWNjZXNzIG9yIGFuIGVycm9yIG1lc3NhZ2UuICAqLwotdHlwZWRlZiBjb25zdCBjaGFyICogKGNnZW5fcGFyc2VfZm4pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgY29uc3QgY2hhciAqKnN0cnBfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotCi0vKiBJbnNlcnQgaGFuZGxlci4KLSAgIENEIGlzIGEgY3B1IHRhYmxlIGRlc2NyaXB0b3IuCi0gICBJTlNOIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBpbnNuIGJlaW5nIHBhcnNlZC4KLSAgIEZJRUxEUyBpcyBhIHBvaW50ZXIgdG8gYSBjZ2VuX2ZpZWxkcyBzdHJ1Y3QgZnJvbSB3aGljaCB0aGUgdmFsdWVzCi0gICBhcmUgZmV0Y2hlZC4KLSAgIElOU05QIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBpbiB3aGljaCB0byBwbGFjZSB0aGUgaW5zbi4KLSAgIFBDIGlzIHRoZSBwYyB2YWx1ZSBvZiB0aGUgaW5zbi4KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi0jaWZkZWYgQkZEX1ZFUlNJT04KLXR5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX2luc2VydF9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgQ0dFTl9JTlNOX0JZVEVTX1BUUiBpbnNucF8sCi0JICAgICAgYmZkX3ZtYSBwY18pKTsKLSNlbHNlCi10eXBlZGVmIGNvbnN0IGNoYXIgKiAoY2dlbl9pbnNlcnRfZm4pICgpOwotI2VuZGlmCi0KLS8qIEV4dHJhY3QgaGFuZGxlci4KLSAgIENEIGlzIGEgY3B1IHRhYmxlIGRlc2NyaXB0b3IuCi0gICBJTlNOIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBpbnNuIGJlaW5nIHBhcnNlZC4KLSAgIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IGNvbnRyb2xsaW5nIGV4dHJhY3Rpb24KLSAgIChvbmx5IHVzZWQgZm9yIHZhcmlhYmxlIGxlbmd0aCBpbnNucykuCi0gICBFWF9JTkZPIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBmb3IgY29udHJvbGxpbmcgcmVhZGluZyBvZiBmdXJ0aGVyCi0gICBieXRlcyBmb3IgdGhlIGluc24uCi0gICBCQVNFX0lOU04gaXMgdGhlIGZpcnN0IENHRU5fQkFTRV9JTlNOX1NJWkUgYnl0ZXMgKGhvc3Qgb3JkZXIpLgotICAgRklFTERTIGlzIGEgcG9pbnRlciB0byBhIGNnZW5fZmllbGRzIHN0cnVjdCBpbiB3aGljaCB0aGUgcmVzdWx0cyBhcmUgcGxhY2VkLgotICAgUEMgaXMgdGhlIHBjIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGhlIHJlc3VsdCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMgb3IgemVybyBpZiBub3QgcmVjb2duaXplZC4gICovCi0KLSNpZmRlZiBCRkRfVkVSU0lPTgotdHlwZWRlZiBpbnQgKGNnZW5fZXh0cmFjdF9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICppbnNuXywKLQkgICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mb18sIENHRU5fSU5TTl9JTlQgYmFzZV9pbnNuXywKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18pKTsKLSNlbHNlCi10eXBlZGVmIGludCAoY2dlbl9leHRyYWN0X2ZuKSAoKTsKLSNlbmRpZgotCi0vKiBQcmludCBoYW5kbGVyLgotICAgQ0QgaXMgYSBjcHUgdGFibGUgZGVzY3JpcHRvci4KLSAgIElORk8gaXMgYSBwb2ludGVyIHRvIHRoZSBkaXNhc3NlbWJseSBpbmZvLgotICAgRWc6IGRpc2Fzc2VtYmxlX2luZm8uICBJdCdzIGRlZmluZWQgYXMgYFBUUicgc28gdGhpcyBmaWxlIGNhbiBiZSBpbmNsdWRlZAotICAgd2l0aG91dCBkaXMtYXNtLmguCi0gICBJTlNOIGlzIGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZXNjcmliaW5nIHRoZSBpbnNuIGJlaW5nIHByaW50ZWQuCi0gICBGSUVMRFMgaXMgYSBwb2ludGVyIHRvIGEgY2dlbl9maWVsZHMgc3RydWN0LgotICAgUEMgaXMgdGhlIHBjIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIGluc24sIGluIGJpdHMuICAqLwotCi0jaWZkZWYgQkZEX1ZFUlNJT04KLXR5cGVkZWYgdm9pZCAoY2dlbl9wcmludF9mbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSIGluZm9fLCBjb25zdCBDR0VOX0lOU04gKmluc25fLAotCSAgICAgIENHRU5fRklFTERTICpmaWVsZHNfLCBiZmRfdm1hIHBjXywgaW50IGxlbl8pKTsKLSNlbHNlCi10eXBlZGVmIHZvaWQgKGNnZW5fcHJpbnRfZm4pICgpOwotI2VuZGlmCi0KLS8qIFBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXJzLgotCi0gICBJbmRpY2VzIGludG8gdGhlIGhhbmRsZXIgdGFibGVzLgotICAgV2UgY291bGQgdXNlIHBvaW50ZXJzIGhlcmUgaW5zdGVhZCwgYnV0IDkwJSBvZiB0aGVtIGFyZSBnZW5lcmFsbHkgaWRlbnRpY2FsCi0gICBhbmQgdGhhdCdzIGEgbG90IG9mIHJlZHVuZGFudCBkYXRhLiAgTWFraW5nIHRoZXNlIHVuc2lnbmVkIGNoYXIgaW5kaWNlcwotICAgaW50byB0YWJsZXMgb2YgcG9pbnRlcnMgc2F2ZXMgYSBiaXQgb2Ygc3BhY2UuCi0gICBVc2luZyBpbmRpY2VzIGFsc28ga2VlcHMgYXNzZW1ibGVyIGNvZGUgb3V0IG9mIHRoZSBkaXNhc3NlbWJsZXIgYW5kCi0gICB2aWNlIHZlcnNhLiAgKi8KLQotc3RydWN0IGNnZW5fb3Bjb2RlX2hhbmRsZXIKLXsKLSAgdW5zaWduZWQgY2hhciBwYXJzZSwgaW5zZXJ0LCBleHRyYWN0LCBwcmludDsKLX07Ci0MCi0vKiBBc3NlbWJsZXIgaW50ZXJmYWNlLgotCi0gICBUaGUgaW50ZXJmYWNlIHRvIHRoZSBhc3NlbWJsZXIgaXMgaW50ZW5kZWQgdG8gYmUgY2xlYW4gaW4gdGhlIHNlbnNlIHRoYXQKLSAgIGxpYm9wY29kZXMuYSBpcyBhIHN0YW5kYWxvbmUgZW50aXR5IGFuZCBjb3VsZCBiZSB1c2VkIHdpdGggYW55IGFzc2VtYmxlci4KLSAgIE5vdCB0aGF0IG9uZSB3b3VsZCBuZWNlc3NhcmlseSB3YW50IHRvIGRvIHRoYXQgYnV0IHJhdGhlciB0aGF0IGl0IGhlbHBzCi0gICBrZWVwIGEgY2xlYW4gaW50ZXJmYWNlLiAgVGhlIGludGVyZmFjZSB3aWxsIG9idmlvdXNseSBiZSBzbGFudGVkIHRvd2FyZHMKLSAgIEdBUywgYnV0IGF0IGxlYXN0IGl0J3MgYSBzdGFydC4KLSAgID8/PyBOb3RlIHRoYXQgb25lIHBvc3NpYmxlIHVzZXIgb2YgdGhlIGFzc2VtYmxlciBiZXNpZGVzIEdBUyBpcyBHREIuCi0KLSAgIFBhcnNpbmcgaXMgY29udHJvbGxlZCBieSB0aGUgYXNzZW1ibGVyIHdoaWNoIGNhbGxzCi0gICBDR0VOX1NZTSAoYXNzZW1ibGVfaW5zbikuICBJZiBpdCBjYW4gcGFyc2UgYW5kIGJ1aWxkIHRoZSBlbnRpcmUgaW5zbgotICAgaXQgZG9lc24ndCBjYWxsIGJhY2sgdG8gdGhlIGFzc2VtYmxlci4gIElmIGl0IG5lZWRzL3dhbnRzIHRvIGNhbGwgYmFjawotICAgdG8gdGhlIGFzc2VtYmxlciwgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGlzIGNhbGxlZCB3aGljaCBjYW4gZWl0aGVyCi0KLSAgIC0gcmV0dXJuIGEgbnVtYmVyIHRvIGJlIGluc2VydGVkIGluIHRoZSBpbnNuCi0gICAtIHJldHVybiBhICJyZWdpc3RlciIgdmFsdWUgdG8gYmUgaW5zZXJ0ZWQKLSAgICAgKHRoZSByZWdpc3RlciBtaWdodCBub3QgYmUgYSByZWdpc3RlciBwZXIgcGUpCi0gICAtIHF1ZXVlIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIGEgbWFya2VyIHNheWluZyB0aGUgZXhwcmVzc2lvbiBoYXMgYmVlbgotICAgICBxdWV1ZWQgKGVnOiBhIGZpeC11cCkKLSAgIC0gcmV0dXJuIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGUgZXhwcmVzc2lvbiB3YXNuJ3QgcmVjb2duaXphYmxlCi0KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGZvciBzdWNjZXNzLgotICAgVGhlIHBhcnNlZCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGJmZF92bWEgKi4gICovCi0KLS8qIFZhbHVlcyBmb3IgaW5kaWNhdGluZyB3aGF0IHRoZSBjYWxsZXIgd2FudHMuICAqLwotCi1lbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF90eXBlCi17Ci0gIENHRU5fUEFSU0VfT1BFUkFORF9JTklULAotICBDR0VOX1BBUlNFX09QRVJBTkRfSU5URUdFUiwKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX0FERFJFU1MKLX07Ci0KLS8qIFZhbHVlcyBmb3IgaW5kaWNhdGluZyB3aGF0IHdhcyBwYXJzZWQuICAqLwotCi1lbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQKLXsKLSAgQ0dFTl9QQVJTRV9PUEVSQU5EX1JFU1VMVF9OVU1CRVIsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUkVHSVNURVIsCi0gIENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfUVVFVUVELAotICBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX0VSUk9SCi19OwotCi0jaWZkZWYgQkZEX1ZFUlNJT04gLyogRG9uJ3QgcmVxdWlyZSBiZmQuaCB1bm5lY2Vzc2FyaWx5LiAgKi8KLXR5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX3BhcnNlX29wZXJhbmRfZm4pCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsCi0JICAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfdHlwZSwgY29uc3QgY2hhciAqKiwgaW50LCBpbnQsCi0JICAgICAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0ICosIGJmZF92bWEgKikpOwotI2Vsc2UKLXR5cGVkZWYgY29uc3QgY2hhciAqIChjZ2VuX3BhcnNlX29wZXJhbmRfZm4pICgpOwotI2VuZGlmCi0KLS8qIFNldCB0aGUgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGNhbGxiYWNrLiAgKi8KLQotZXh0ZXJuIHZvaWQgY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjZ2VuX3BhcnNlX29wZXJhbmRfZm4pKTsKLQotLyogQ2FsbGVkIGJlZm9yZSB0cnlpbmcgdG8gbWF0Y2ggYSB0YWJsZSBlbnRyeSB3aXRoIHRoZSBpbnNuLiAgKi8KLQotZXh0ZXJuIHZvaWQgY2dlbl9pbml0X3BhcnNlX29wZXJhbmQgUEFSQU1TICgoQ0dFTl9DUFVfREVTQykpOwotDAotLyogT3BlcmFuZCB2YWx1ZXMgKGtleXdvcmRzLCBpbnRlZ2Vycywgc3ltYm9scywgZXRjLikgICovCi0KLS8qIFR5cGVzIG9mIGFzc2VtYmxlciBlbGVtZW50cy4gICovCi0KLWVudW0gY2dlbl9hc21fdHlwZQotewotICBDR0VOX0FTTV9OT05FLCBDR0VOX0FTTV9LRVlXT1JELCBDR0VOX0FTTV9NQVgKLX07Ci0KLSNpZm5kZWYgQ0dFTl9BUkNICi1lbnVtIGNnZW5faHdfdHlwZSB7IENHRU5fSFdfTUFYIH07Ci0jZW5kaWYKLQotLyogTGlzdCBvZiBoYXJkd2FyZSBlbGVtZW50cy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGNoYXIgKm5hbWU7Ci0gIGVudW0gY2dlbl9od190eXBlIHR5cGU7Ci0gIC8qIFRoZXJlIGlzIGN1cnJlbnRseSBubyBleGFtcGxlIHdoZXJlIGJvdGggaW5kZXggc3BlY3MgYW5kIHZhbHVlIHNwZWNzCi0gICAgIGFyZSByZXF1aXJlZCwgc28gZm9yIG5vdyBib3RoIGFyZSBjbHVtcGVkIHVuZGVyICJhc21fZGF0YSIuICAqLwotICBlbnVtIGNnZW5fYXNtX3R5cGUgYXNtX3R5cGU7Ci0gIFBUUiBhc21fZGF0YTsKLSNpZm5kZWYgQ0dFTl9IV19OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX0hXX05CT09MX0FUVFJTIDEKLSNlbmRpZgotICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9IV19OQk9PTF9BVFRSUykgYXR0cnM7Ci0jZGVmaW5lIENHRU5fSFdfQVRUUlMoaHcpICgmKGh3KS0+YXR0cnMpCi19IENHRU5fSFdfRU5UUlk7Ci0KLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBIVy4gICovCi0KLSNkZWZpbmUgQ0dFTl9IV19BVFRSX1ZBTFVFKGh3LCBhdHRyKSBcCi1DR0VOX0FUVFJfVkFMVUUgKChodyksIENHRU5fSFdfQVRUUlMgKGh3KSwgKGF0dHIpKQotCi0vKiBUYWJsZSBvZiBoYXJkd2FyZSBlbGVtZW50cyBmb3Igc2VsZWN0ZWQgbWFjaCwgY29tcHV0ZWQgYXQgcnVudGltZS4KLSAgIGVudW0gY2dlbl9od190eXBlIGlzIGFuIGluZGV4IGludG8gdGhpcyB0YWJsZSAoc3BlY2lmaWNhbGx5IGBlbnRyaWVzJykuICAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFBvaW50ZXIgdG8gbnVsbCB0ZXJtaW5hdGVkIHRhYmxlIG9mIGFsbCBjb21waWxlZCBpbiBlbnRyaWVzLiAgKi8KLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqaW5pdF9lbnRyaWVzOwotICB1bnNpZ25lZCBpbnQgZW50cnlfc2l6ZTsgLyogc2luY2UgdGhlIGF0dHJpYnV0ZSBtZW1iZXIgaXMgdmFyaWFibGUgc2l6ZWQgKi8KLSAgLyogQXJyYXkgb2YgYWxsIGVudHJpZXMsIGluaXRpYWwgYW5kIHJ1bi10aW1lIGFkZGVkLiAgKi8KLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmVudHJpZXM7Ci0gIC8qIE51bWJlciBvZiBlbGVtZW50cyBpbiBgZW50cmllcycuICAqLwotICB1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXM7Ci0gIC8qIEZvciBub3csIHhyZWFsbG9jIGlzIGNhbGxlZCBlYWNoIHRpbWUgYSBuZXcgZW50cnkgaXMgYWRkZWQgYXQgcnVudGltZS4KLSAgICAgPz8/IE1heSB3aXNoIHRvIGtlZXAgdHJhY2sgb2Ygc29tZSBzbG9wIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvCi0gICAgIHhyZWFsbG9jLCBleGNlcHQgdGhhdCB0aGVyZSdzIHVubGlrZWx5IHRvIGJlIG1hbnkgYW5kIG5vdCBleHBlY3RlZCB0byBiZQotICAgICBpbiBzcGVlZCBjcml0aWNhbCBjb2RlLiAgKi8KLX0gQ0dFTl9IV19UQUJMRTsKLQotZXh0ZXJuIGNvbnN0IENHRU5fSFdfRU5UUlkgKiBjZ2VuX2h3X2xvb2t1cF9ieV9uYW1lCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IENHRU5fSFdfRU5UUlkgKiBjZ2VuX2h3X2xvb2t1cF9ieV9udW0KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50KSk7Ci0KLS8qIFRoaXMgc3RydWN0IGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhpbmdzIGxpa2UgcmVnaXN0ZXIgbmFtZXMsIGV0Yy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5fa2V5d29yZF9lbnRyeQotewotICAvKiBOYW1lIChhcyBpbiByZWdpc3RlciBuYW1lKS4gICovCi0gIGNoYXIgKiBuYW1lOwotCi0gIC8qIFZhbHVlIChhcyBpbiByZWdpc3RlciBudW1iZXIpLgotICAgICBUaGUgdmFsdWUgY2Fubm90IGJlIC0xIGFzIHRoYXQgaXMgdXNlZCB0byBpbmRpY2F0ZSAibm90IGZvdW5kIi4KLSAgICAgSURFQTogSGF2ZSAiRlVOQ1RJT04iIGF0dHJpYnV0ZT8gW2Z1bmN0aW9uIGlzIGNhbGxlZCB0byBmZXRjaCB2YWx1ZV0uICAqLwotICBpbnQgdmFsdWU7Ci0KLSAgLyogQXR0cmlidXRlcy4KLSAgICAgVGhpcyBzaG91bGQsIGJ1dCB0ZWNobmljYWxseSBuZWVkbid0LCBhcHBlYXIgbGFzdC4gIEl0IGlzIGEgdmFyaWFibGUgc2l6ZWQKLSAgICAgYXJyYXkgaW4gdGhhdCBvbmUgYXJjaGl0ZWN0dXJlIG1heSBoYXZlIDEgbm9uYm9vbCBhdHRyaWJ1dGUgYW5kIGFub3RoZXIKLSAgICAgbWF5IGhhdmUgbW9yZS4gIEhhdmluZyB0aGlzIGxhc3QgbWVhbnMgdGhlIG5vbi1hcmNoaXRlY3R1cmUgc3BlY2lmaWMgY29kZQotICAgICBuZWVkbid0IGNhcmUuICBUaGUgZ29hbCBpcyB0byBldmVudHVhbGx5IHJlY29yZAotICAgICBhdHRyaWJ1dGVzIGluIHRoZWlyIHJhdyBmb3JtLCBldmFsdWF0ZSB0aGVtIGF0IHJ1bi10aW1lLCBhbmQgY2FjaGUgdGhlCi0gICAgIHZhbHVlcywgc28gdGhpcyB3b3JyeSB3aWxsIGdvIGF3YXkgYW55d2F5LiAgKi8KLSAgLyogPz8/IE1vdmluZyB0aGlzIGxhc3Qgc2hvdWxkIGJlIGRvbmUgYnkgdHJlYXRpbmcga2V5d29yZHMgbGlrZSBpbnNuIGxpc3RzCi0gICAgIGFuZCBtb3ZpbmcgdGhlIGBuZXh0JyBmaWVsZHMgaW50byBhIENHRU5fS0VZV09SRF9MSVNUIHN0cnVjdC4gICovCi0gIC8qIEZJWE1FOiBOb3QgdXNlZCB5ZXQuICAqLwotI2lmbmRlZiBDR0VOX0tFWVdPUkRfTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9LRVlXT1JEX05CT09MX0FUVFJTIDEKLSNlbmRpZgotICBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9LRVlXT1JEX05CT09MX0FUVFJTKSBhdHRyczsKLQotICAvKiA/Pz8gUHV0dGluZyB0aGVzZSBoZXJlIG1lYW5zIGNvbXBpbGVkIGluIGVudHJpZXMgY2FuJ3QgYmUgY29uc3QuCi0gICAgIE5vdCBhIHJlYWxseSBiaWcgZGVhbCwgYnV0IHNvbWV0aGluZyB0byBjb25zaWRlci4gICovCi0gIC8qIE5leHQgbmFtZSBoYXNoIHRhYmxlIGVudHJ5LiAgKi8KLSAgc3RydWN0IGNnZW5fa2V5d29yZF9lbnRyeSAqbmV4dF9uYW1lOwotICAvKiBOZXh0IHZhbHVlIGhhc2ggdGFibGUgZW50cnkuICAqLwotICBzdHJ1Y3QgY2dlbl9rZXl3b3JkX2VudHJ5ICpuZXh0X3ZhbHVlOwotfSBDR0VOX0tFWVdPUkRfRU5UUlk7Ci0KLS8qIFRvcCBsZXZlbCBzdHJ1Y3QgZm9yIGRlc2NyaWJpbmcgYSBzZXQgb2YgcmVsYXRlZCBrZXl3b3JkcwotICAgKGUuZy4gcmVnaXN0ZXIgbmFtZXMpLgotCi0gICBUaGlzIHN0cnVjdCBzdXBwb3J0cyBydW4tdGltZSBlbnRyeSBvZiBuZXcgdmFsdWVzLCBhbmQgaGFzaGVkIGxvb2t1cHMuICAqLwotCi10eXBlZGVmIHN0cnVjdCBjZ2VuX2tleXdvcmQKLXsKLSAgLyogUG9pbnRlciB0byBpbml0aWFsIFtjb21waWxlZCBpbl0gdmFsdWVzLiAgKi8KLSAgQ0dFTl9LRVlXT1JEX0VOVFJZICppbml0X2VudHJpZXM7Ci0gIAotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBgaW5pdF9lbnRyaWVzJy4gICovCi0gIHVuc2lnbmVkIGludCBudW1faW5pdF9lbnRyaWVzOwotICAKLSAgLyogSGFzaCB0YWJsZSB1c2VkIGZvciBuYW1lIGxvb2t1cC4gICovCi0gIENHRU5fS0VZV09SRF9FTlRSWSAqKm5hbWVfaGFzaF90YWJsZTsKLSAgCi0gIC8qIEhhc2ggdGFibGUgdXNlZCBmb3IgdmFsdWUgbG9va3VwLiAgKi8KLSAgQ0dFTl9LRVlXT1JEX0VOVFJZICoqdmFsdWVfaGFzaF90YWJsZTsKLSAgCi0gIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoYXNoX3RhYmxlcy4gICovCi0gIHVuc2lnbmVkIGludCBoYXNoX3RhYmxlX3NpemU7Ci0gIAotICAvKiBQb2ludGVyIHRvIG51bGwga2V5d29yZCAiIiBlbnRyeSBpZiBwcmVzZW50LiAgKi8KLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICpudWxsX2VudHJ5OwotfSBDR0VOX0tFWVdPUkQ7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIGZvciBzZWFyY2hpbmcuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBUYWJsZSBiZWluZyBzZWFyY2hlZC4gICovCi0gIGNvbnN0IENHRU5fS0VZV09SRCAqdGFibGU7Ci0gIAotICAvKiBTcGVjaWZpY2F0aW9uIG9mIHdoYXQgaXMgYmVpbmcgc2VhcmNoZWQgZm9yLiAgKi8KLSAgY29uc3QgY2hhciAqc3BlYzsKLSAgCi0gIC8qIEN1cnJlbnQgaW5kZXggaW4gaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBjdXJyZW50X2hhc2g7Ci0gIAotICAvKiBDdXJyZW50IGVsZW1lbnQgaW4gY3VycmVudCBoYXNoIGNoYWluLiAgKi8KLSAgQ0dFTl9LRVlXT1JEX0VOVFJZICpjdXJyZW50X2VudHJ5OwotfSBDR0VOX0tFWVdPUkRfU0VBUkNIOwotCi0vKiBMb29rdXAgYSBrZXl3b3JkIGZyb20gaXRzIG5hbWUuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmNnZW5fa2V5d29yZF9sb29rdXBfbmFtZQotICBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgY29uc3QgY2hhciAqKSk7Ci0KLS8qIExvb2t1cCBhIGtleXdvcmQgZnJvbSBpdHMgdmFsdWUuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUKLSAgUEFSQU1TICgoQ0dFTl9LRVlXT1JEICosIGludCkpOwotCi0vKiBBZGQgYSBrZXl3b3JkLiAgKi8KLQotdm9pZCBjZ2VuX2tleXdvcmRfYWRkIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqLCBDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotCi0vKiBLZXl3b3JkIHNlYXJjaGluZy4KLSAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgZXZlcnkga2V5d29yZCwgb3IgYSBzdWJzZXQuICAqLwotCi1DR0VOX0tFWVdPUkRfU0VBUkNIIGNnZW5fa2V5d29yZF9zZWFyY2hfaW5pdAotICBQQVJBTVMgKChDR0VOX0tFWVdPUkQgKiwgY29uc3QgY2hhciAqKSk7Ci1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmNnZW5fa2V5d29yZF9zZWFyY2hfbmV4dAotICBQQVJBTVMgKChDR0VOX0tFWVdPUkRfU0VBUkNIICopKTsKLQotLyogT3BlcmFuZCB2YWx1ZSBzdXBwb3J0IHJvdXRpbmVzLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmNnZW5fcGFyc2Vfa2V5d29yZAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICoqLCBDR0VOX0tFWVdPUkQgKiwgbG9uZyAqKSk7Ci0jaWZkZWYgQkZEX1ZFUlNJT04gLyogRG9uJ3QgcmVxdWlyZSBiZmQuaCB1bm5lY2Vzc2FyaWx5LiAgKi8KLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIGludCwgbG9uZyAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIGludCwgdW5zaWduZWQgbG9uZyAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqY2dlbl9wYXJzZV9hZGRyZXNzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IGNoYXIgKiosIGludCwgaW50LAotCSAgICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqLCBiZmRfdm1hICopKTsKLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3ZhbGlkYXRlX3NpZ25lZF9pbnRlZ2VyCi0gICAgIFBBUkFNUyAoKGxvbmcsIGxvbmcsIGxvbmcpKTsKLWV4dGVybiBjb25zdCBjaGFyICpjZ2VuX3ZhbGlkYXRlX3Vuc2lnbmVkX2ludGVnZXIKLSAgICAgUEFSQU1TICgodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZykpOwotI2VuZGlmCi0MCi0vKiBPcGVyYW5kIG1vZGVzLiAgKi8KLQotLyogPz8/IFRoaXMgZHVwbGljYXRlcyB0aGUgdmFsdWVzIGluIGFyY2guaC4gIFJldmlzaXQuCi0gICBUaGVzZSBob3dldmVyIG5lZWQgdGhlIENHRU5fIHByZWZpeCBbYXMgZG9lcyBldmVyeXRoaW5nIGluIHRoaXMgZmlsZV0uICAqLwotLyogPz8/IFRhcmdldHMgbWF5IG5lZWQgdG8gYWRkIHRoZWlyIG93biBtb2RlcyBzbyB3ZSBtYXkgd2lzaCB0byBtb3ZlIHRoaXMKLSAgIHRvIDxhcmNoPi1vcGMuaCwgb3IgYWRkIGEgaG9vay4gICovCi0KLWVudW0gY2dlbl9tb2RlIHsKLSAgQ0dFTl9NT0RFX1ZPSUQsIC8qID8/PyByZW5hbWUgc2ltdWxhdG9yJ3MgVk0gdG8gVk9JRD8gKi8KLSAgQ0dFTl9NT0RFX0JJLCBDR0VOX01PREVfUUksIENHRU5fTU9ERV9ISSwgQ0dFTl9NT0RFX1NJLCBDR0VOX01PREVfREksCi0gIENHRU5fTU9ERV9VQkksIENHRU5fTU9ERV9VUUksIENHRU5fTU9ERV9VSEksIENHRU5fTU9ERV9VU0ksIENHRU5fTU9ERV9VREksCi0gIENHRU5fTU9ERV9TRiwgQ0dFTl9NT0RFX0RGLCBDR0VOX01PREVfWEYsIENHRU5fTU9ERV9URiwKLSAgQ0dFTl9NT0RFX1RBUkdFVF9NQVgsCi0gIENHRU5fTU9ERV9JTlQsIENHRU5fTU9ERV9VSU5ULAotICBDR0VOX01PREVfTUFYCi19OwotCi0vKiBGSVhNRTogVW50aWwgc2ltdWxhdG9yIGlzIHVwZGF0ZWQuICAqLwotCi0jZGVmaW5lIENHRU5fTU9ERV9WTSBDR0VOX01PREVfVk9JRAotDAotLyogT3BlcmFuZHMuICAqLwotCi0jaWZuZGVmIENHRU5fQVJDSAotZW51bSBjZ2VuX29wZXJhbmRfdHlwZSB7IENHRU5fT1BFUkFORF9NQVggfTsKLSNlbmRpZgotCi0vKiAibmlsIiBpbmRpY2F0b3IgZm9yIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlICovCi0jZGVmaW5lIENHRU5fT1BFUkFORF9OSUwgQ0dFTl9PUEVSQU5EX01BWAotCi0vKiBUaGlzIHN0cnVjdCBkZWZpbmVzIGVhY2ggZW50cnkgaW4gdGhlIG9wZXJhbmQgdGFibGUuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBOYW1lIGFzIGl0IGFwcGVhcnMgaW4gdGhlIHN5bnRheCBzdHJpbmcuICAqLwotICBjaGFyICpuYW1lOwotCi0gIC8qIE9wZXJhbmQgdHlwZS4gICovCi0gIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgdHlwZTsKLQotICAvKiBUaGUgaGFyZHdhcmUgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhpcyBvcGVyYW5kLiAgKi8KLSAgZW51bSBjZ2VuX2h3X3R5cGUgaHdfdHlwZTsKLQotICAvKiBGSVhNRTogV2UgZG9uJ3QgeWV0IHJlY29yZCBpZmllbGQgZGVmaW5pdGlvbnMsIHdoaWNoIHdlIHNob3VsZC4KLSAgICAgV2hlbiB3ZSBkbyBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGRlbGV0ZSBzdGFydC9sZW5ndGggKHNpbmNlIHRoZXkgd2lsbAotICAgICBiZSBkdXBsaWNhdGVkIGluIHRoZSBpZmllbGQncyBkZWZpbml0aW9uKSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggYQotICAgICBwb2ludGVyIHRvIHRoZSBpZmllbGQgZW50cnkuICAqLwotCi0gIC8qIEJpdCBwb3NpdGlvbi4KLSAgICAgVGhpcyBpcyBqdXN0IGEgaGludCwgYW5kIG1heSBiZSB1bnVzZWQgaW4gbW9yZSBjb21wbGV4IG9wZXJhbmRzLgotICAgICBNYXkgYmUgdW51c2VkIGZvciBhIG1vZGlmaWVyLiAgKi8KLSAgdW5zaWduZWQgY2hhciBzdGFydDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuCi0gICAgIFRoaXMgaXMganVzdCBhIGhpbnQsIGFuZCBtYXkgYmUgdW51c2VkIGluIG1vcmUgY29tcGxleCBvcGVyYW5kcy4KLSAgICAgTWF5IGJlIHVudXNlZCBmb3IgYSBtb2RpZmllci4gICovCi0gIHVuc2lnbmVkIGNoYXIgbGVuZ3RoOwotCi0jaWYgMCAvKiA/Pz8gSW50ZXJlc3RpbmcgaWRlYSBidXQgcmVsb2NzIHRlbmQgdG8gZ2V0IHRvbyBjb21wbGljYXRlZCwKLQkgYW5kIEFCSSBkZXBlbmRlbnQsIGZvciBzaW1wbGUgdGFibGUgbG9va3VwcyB0byB3b3JrLiAgKi8KLSAgLyogSWRlYWxseSB0aGlzIHdvdWxkIGJlIHRoZSBpbnRlcm5hbCAoZXh0ZXJuYWw/KSByZWxvYyB0eXBlLiAgKi8KLSAgaW50IHJlbG9jX3R5cGU7Ci0jZW5kaWYKLQotICAvKiBBdHRyaWJ1dGVzLgotICAgICBUaGlzIHNob3VsZCwgYnV0IHRlY2huaWNhbGx5IG5lZWRuJ3QsIGFwcGVhciBsYXN0LiAgSXQgaXMgYSB2YXJpYWJsZSBzaXplZAotICAgICBhcnJheSBpbiB0aGF0IG9uZSBhcmNoaXRlY3R1cmUgbWF5IGhhdmUgMSBub25ib29sIGF0dHJpYnV0ZSBhbmQgYW5vdGhlcgotICAgICBtYXkgaGF2ZSBtb3JlLiAgSGF2aW5nIHRoaXMgbGFzdCBtZWFucyB0aGUgbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlCi0gICAgIG5lZWRuJ3QgY2FyZSwgbm93IG9yIHRvbW9ycm93LiAgVGhlIGdvYWwgaXMgdG8gZXZlbnR1YWxseSByZWNvcmQKLSAgICAgYXR0cmlidXRlcyBpbiB0aGVpciByYXcgZm9ybSwgZXZhbHVhdGUgdGhlbSBhdCBydW4tdGltZSwgYW5kIGNhY2hlIHRoZQotICAgICB2YWx1ZXMsIHNvIHRoaXMgd29ycnkgd2lsbCBnbyBhd2F5IGFueXdheS4gICovCi0jaWZuZGVmIENHRU5fT1BFUkFORF9OQk9PTF9BVFRSUwotI2RlZmluZSBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMgMQotI2VuZGlmCi0gIENHRU5fQVRUUl9UWVBFIChDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMpIGF0dHJzOwotI2RlZmluZSBDR0VOX09QRVJBTkRfQVRUUlMob3BlcmFuZCkgKCYob3BlcmFuZCktPmF0dHJzKQotfSBDR0VOX09QRVJBTkQ7Ci0KLS8qIFJldHVybiB2YWx1ZSBvZiBhdHRyaWJ1dGUgQVRUUiBpbiBPUEVSQU5ELiAgKi8KLQotI2RlZmluZSBDR0VOX09QRVJBTkRfQVRUUl9WQUxVRShvcGVyYW5kLCBhdHRyKSBcCi1DR0VOX0FUVFJfVkFMVUUgKChvcGVyYW5kKSwgQ0dFTl9PUEVSQU5EX0FUVFJTIChvcGVyYW5kKSwgKGF0dHIpKQotCi0vKiBUYWJsZSBvZiBvcGVyYW5kcyBmb3Igc2VsZWN0ZWQgbWFjaC9pc2EsIGNvbXB1dGVkIGF0IHJ1bnRpbWUuCi0gICBlbnVtIGNnZW5fb3BlcmFuZF90eXBlIGlzIGFuIGluZGV4IGludG8gdGhpcyB0YWJsZSAoc3BlY2lmaWNhbGx5Ci0gICBgZW50cmllcycpLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBQb2ludGVyIHRvIG51bGwgdGVybWluYXRlZCB0YWJsZSBvZiBhbGwgY29tcGlsZWQgaW4gZW50cmllcy4gICovCi0gIGNvbnN0IENHRU5fT1BFUkFORCAqaW5pdF9lbnRyaWVzOwotICB1bnNpZ25lZCBpbnQgZW50cnlfc2l6ZTsgLyogc2luY2UgdGhlIGF0dHJpYnV0ZSBtZW1iZXIgaXMgdmFyaWFibGUgc2l6ZWQgKi8KLSAgLyogQXJyYXkgb2YgYWxsIGVudHJpZXMsIGluaXRpYWwgYW5kIHJ1bi10aW1lIGFkZGVkLiAgKi8KLSAgY29uc3QgQ0dFTl9PUEVSQU5EICoqZW50cmllczsKLSAgLyogTnVtYmVyIG9mIGVsZW1lbnRzIGluIGBlbnRyaWVzJy4gICovCi0gIHVuc2lnbmVkIGludCBudW1fZW50cmllczsKLSAgLyogRm9yIG5vdywgeHJlYWxsb2MgaXMgY2FsbGVkIGVhY2ggdGltZSBhIG5ldyBlbnRyeSBpcyBhZGRlZCBhdCBydW50aW1lLgotICAgICA/Pz8gTWF5IHdpc2ggdG8ga2VlcCB0cmFjayBvZiBzb21lIHNsb3AgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8KLSAgICAgeHJlYWxsb2MsIGV4Y2VwdCB0aGF0IHRoZXJlJ3MgdW5saWtlbHkgdG8gYmUgbWFueSBhbmQgbm90IGV4cGVjdGVkIHRvIGJlCi0gICAgIGluIHNwZWVkIGNyaXRpY2FsIGNvZGUuICAqLwotfSBDR0VOX09QRVJBTkRfVEFCTEU7Ci0KLWV4dGVybiBjb25zdCBDR0VOX09QRVJBTkQgKiBjZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgQ0dFTl9PUEVSQU5EICogY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50KSk7Ci0MCi0vKiBJbnN0cnVjdGlvbiBvcGVyYW5kIGluc3RhbmNlcy4KLQotICAgRm9yIGVhY2ggaW5zdHJ1Y3Rpb24sIGEgbGlzdCBvZiB0aGUgaGFyZHdhcmUgZWxlbWVudHMgdGhhdCBhcmUgcmVhZCBhbmQKLSAgIHdyaXR0ZW4gYXJlIHJlY29yZGVkLiAgKi8KLQotLyogVGhlIHR5cGUgb2YgdGhlIGluc3RhbmNlLiAgKi8KLQotZW51bSBjZ2VuX29waW5zdF90eXBlIHsKLSAgLyogRW5kIG9mIHRhYmxlIG1hcmtlci4gICovCi0gIENHRU5fT1BJTlNUX0VORCA9IDAsCi0gIENHRU5fT1BJTlNUX0lOUFVULCBDR0VOX09QSU5TVF9PVVRQVVQKLX07Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIElucHV0IG9yIG91dHB1dCBpbmRpY2F0b3IuICAqLwotICBlbnVtIGNnZW5fb3BpbnN0X3R5cGUgdHlwZTsKLQotICAvKiBOYW1lIG9mIG9wZXJhbmQuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBoYXJkd2FyZSBlbGVtZW50IHJlZmVyZW5jZWQuICAqLwotICBlbnVtIGNnZW5faHdfdHlwZSBod190eXBlOwotCi0gIC8qIFRoZSBtb2RlIGluIHdoaWNoIHRoZSBvcGVyYW5kIGlzIGJlaW5nIHVzZWQuICAqLwotICBlbnVtIGNnZW5fbW9kZSBtb2RlOwotCi0gIC8qIFRoZSBvcGVyYW5kIHRhYmxlIGVudHJ5IENHRU5fT1BFUkFORF9OSUwgaWYgdGhlcmUgaXMgbm9uZQotICAgICAoaS5lLiBhbiBleHBsaWNpdCBoYXJkd2FyZSByZWZlcmVuY2UpLiAgKi8KLSAgZW51bSBjZ2VuX29wZXJhbmRfdHlwZSBvcF90eXBlOwotCi0gIC8qIElmIGBvcGVyYW5kJyBpcyAibmlsIiwgdGhlIGluZGV4IChlLmcuIGludG8gYXJyYXkgb2YgcmVnaXN0ZXJzKS4gICovCi0gIGludCBpbmRleDsKLQotICAvKiBBdHRyaWJ1dGVzLgotICAgICA/Pz8gVGhpcyBwZXJoYXBzIHNob3VsZCBiZSBhIHJlYWwgYXR0cmlidXRlIHN0cnVjdCBidXQgdGhlcmUncwotICAgICBubyBjdXJyZW50IG5lZWQsIHNvIHdlIHNhdmUgYSBiaXQgb2Ygc3BhY2UgYW5kIGp1c3QgaGF2ZSBhIHNldCBvZgotICAgICBmbGFncy4gIFRoZSBpbnRlcmZhY2UgaXMgc3VjaCB0aGF0IHRoaXMgY2FuIGVhc2lseSBiZSBtYWRlIGF0dHJpYnV0ZXMKLSAgICAgc2hvdWxkIGl0IHByb3ZlIHVzZWZ1bC4gICovCi0gIHVuc2lnbmVkIGludCBhdHRyczsKLSNkZWZpbmUgQ0dFTl9PUElOU1RfQVRUUlMob3BpbnN0KSAoKG9waW5zdCktPmF0dHJzKQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIE9QSU5TVC4gICovCi0jZGVmaW5lIENHRU5fT1BJTlNUX0FUVFIob3BpbnN0LCBhdHRyKSBcCi0oKENHRU5fT1BJTlNUX0FUVFJTIChvcGluc3QpICYgKGF0dHIpKSAhPSAwKQotLyogT3BlcmFuZCBpcyBjb25kaXRpb25hbGx5IHJlZmVyZW5jZWQgKHJlYWQvd3JpdHRlbikuICAqLwotI2RlZmluZSBDR0VOX09QSU5TVF9DT05EX1JFRiAxCi19IENHRU5fT1BJTlNUOwotDAotLyogU3ludGF4IHN0cmluZy4KLQotICAgRWFjaCBpbnNuIGZvcm1hdCBhbmQgc3ViZXhwcmVzc2lvbiBoYXMgb25lIG9mIHRoZXNlLgotCi0gICBUaGUgc3ludGF4ICJzdHJpbmciIGNvbnNpc3RzIG9mIGNoYXJhY3RlcnMgKG4gPiAwICYmIG4gPCAxMjgpLCBhbmQgb3BlcmFuZAotICAgdmFsdWVzIChuID49IDEyOCksIGFuZCBpcyB0ZXJtaW5hdGVkIGJ5IDAuICBPcGVyYW5kIHZhbHVlcyBhcmUgMTI4ICsgaW5kZXgKLSAgIGludG8gdGhlIG9wZXJhbmQgdGFibGUuICBUaGUgb3BlcmFuZCB0YWJsZSBkb2Vzbid0IGV4aXN0IGluIEMsIHBlciBzZSwgYXMKLSAgIHRoZSBkYXRhIGlzIHJlY29yZGVkIGluIHRoZSBwYXJzZS9pbnNlcnQvZXh0cmFjdC9wcmludCBzd2l0Y2ggc3RhdGVtZW50cy4gKi8KLQotI2lmbmRlZiBDR0VOX01BWF9TWU5UQVhfQllURVMKLSNkZWZpbmUgQ0dFTl9NQVhfU1lOVEFYX0JZVEVTIDE2Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdW5zaWduZWQgY2hhciBzeW50YXhbQ0dFTl9NQVhfU1lOVEFYX0JZVEVTXTsKLX0gQ0dFTl9TWU5UQVg7Ci0KLSNkZWZpbmUgQ0dFTl9TWU5UQVhfU1RSSU5HKHN5bikgKHN5bi0+c3ludGF4KQotI2RlZmluZSBDR0VOX1NZTlRBWF9DSEFSX1AoYykgKChjKSA8IDEyOCkKLSNkZWZpbmUgQ0dFTl9TWU5UQVhfQ0hBUihjKSAoYykKLSNkZWZpbmUgQ0dFTl9TWU5UQVhfRklFTEQoYykgKChjKSAtIDEyOCkKLSNkZWZpbmUgQ0dFTl9TWU5UQVhfTUFLRV9GSUVMRChjKSAoKGMpICsgMTI4KQotCi0vKiA/Pz8gSSBjYW4ndCBjdXJyZW50bHkgdGhpbmsgb2YgYW55IGNhc2Ugd2hlcmUgdGhlIG1uZW1vbmljIGRvZXNuJ3QgY29tZQotICAgZmlyc3QgW2FuZCBpZiBvbmUgZXZlciBkb2Vzbid0IGJ1aWxkaW5nIHRoZSBoYXNoIHRhYmxlcyB3aWxsIGJlIHRyaWNreV0uCi0gICBIb3dldmVyLCB3ZSB0cmVhdCBtbmVtb25pY3MgYXMganVzdCBhbm90aGVyIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLgotICAgQSB2YWx1ZSBvZiAxIG1lYW5zICJ0aGlzIGlzIHdoZXJlIHRoZSBtbmVtb25pYyBhcHBlYXJzIi4gIDEgaXNuJ3QKLSAgIHNwZWNpYWwgb3RoZXIgdGhhbiBpdCdzIGEgbm9uLXByaW50YWJsZSBBU0NJSSBjaGFyLiAgKi8KLQotI2RlZmluZSBDR0VOX1NZTlRBWF9NTkVNT05JQyAgICAgICAxCi0jZGVmaW5lIENHRU5fU1lOVEFYX01ORU1PTklDX1AoY2gpICgoY2gpID09IENHRU5fU1lOVEFYX01ORU1PTklDKQotDAotLyogSW5zdHJ1Y3Rpb24gZmllbGRzLgotCi0gICA/Pz8gV2UgY3VycmVudGx5IGRvbid0IGFsbG93IGFkZGluZyBmaWVsZHMgYXQgcnVuLXRpbWUuCi0gICBFYXN5IHRvIGZpeCB3aGVuIG5lZWRlZC4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5faWZsZCB7Ci0gIC8qIEVudW0gb2YgaWZpZWxkLiAgKi8KLSAgaW50IG51bTsKLSNkZWZpbmUgQ0dFTl9JRkxEX05VTShmKSAoKGYpLT5udW0pCi0KLSAgLyogTmFtZSBvZiB0aGUgZmllbGQsIGRpc3Rpbmd1aXNoZXMgaXQgZnJvbSBhbGwgb3RoZXIgZmllbGRzLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSNkZWZpbmUgQ0dFTl9JRkxEX05BTUUoZikgKChmKS0+bmFtZSkKLQotICAvKiBEZWZhdWx0IG9mZnNldCwgaW4gYml0cywgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gdG8gdGhlIHdvcmQKLSAgICAgY29udGFpbmluZyB0aGUgZmllbGQuICAqLwotICBpbnQgd29yZF9vZmZzZXQ7Ci0jZGVmaW5lIENHRU5fSUZMRF9XT1JEX09GRlNFVChmKSAoKGYpLT53b3JkX29mZnNldCkKLQotICAvKiBEZWZhdWx0IGxlbmd0aCBvZiB0aGUgd29yZCBjb250YWluaW5nIHRoZSBmaWVsZC4gICovCi0gIGludCB3b3JkX3NpemU7Ci0jZGVmaW5lIENHRU5fSUZMRF9XT1JEX1NJWkUoZikgKChmKS0+d29yZF9zaXplKQotCi0gIC8qIERlZmF1bHQgc3RhcnRpbmcgYml0IG51bWJlci4KLSAgICAgV2hldGhlciBsc2I9MCBvciBtc2I9MCBpcyBkZXRlcm1pbmVkIGJ5IENHRU5fSU5TTl9MU0IwX1AuICAqLwotICBpbnQgc3RhcnQ7Ci0jZGVmaW5lIENHRU5fSUZMRF9TVEFSVChmKSAoKGYpLT5zdGFydCkKLQotICAvKiBMZW5ndGggb2YgdGhlIGZpZWxkLCBpbiBiaXRzLiAgKi8KLSAgaW50IGxlbmd0aDsKLSNkZWZpbmUgQ0dFTl9JRkxEX0xFTkdUSChmKSAoKGYpLT5sZW5ndGgpCi0KLSNpZm5kZWYgQ0dFTl9JRkxEX05CT09MX0FUVFJTCi0jZGVmaW5lIENHRU5fSUZMRF9OQk9PTF9BVFRSUyAxCi0jZW5kaWYKLSAgQ0dFTl9BVFRSX1RZUEUgKENHRU5fSUZMRF9OQk9PTF9BVFRSUykgYXR0cnM7Ci0jZGVmaW5lIENHRU5fSUZMRF9BVFRSUyhmKSAoJihmKS0+YXR0cnMpCi19IENHRU5fSUZMRDsKLQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIElGTEQuICAqLwotI2RlZmluZSBDR0VOX0lGTERfQVRUUl9WQUxVRShpZmxkLCBhdHRyKSBcCi1DR0VOX0FUVFJfVkFMVUUgKChpZmxkKSwgQ0dFTl9JRkxEX0FUVFJTIChpZmxkKSwgKGF0dHIpKQotDAotLyogSW5zdHJ1Y3Rpb24gZGF0YS4gICovCi0KLS8qIEluc3RydWN0aW9uIGZvcm1hdHMuCi0KLSAgIEluc3RydWN0aW9ucyBhcmUgZ3JvdXBlZCBieSBmb3JtYXQuICBBc3NvY2lhdGVkIHdpdGggYW4gaW5zdHJ1Y3Rpb24gaXMgaXRzCi0gICBmb3JtYXQuICBFYWNoIGluc24ncyBvcGNvZGUgdGFibGUgZW50cnkgY29udGFpbnMgYSBmb3JtYXQgdGFibGUgZW50cnkuCi0gICA/Pz8gVGhlcmUgaXMgdXN1YWxseSB2ZXJ5IGZldyBmb3JtYXRzIGNvbXBhcmVkIHdpdGggdGhlIG51bWJlciBvZiBpbnNucywKLSAgIHNvIG9uZSBjYW4gcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBvcGNvZGUgdGFibGUgYnkgcmVjb3JkaW5nIHRoZSBmb3JtYXQgdGFibGUKLSAgIGFzIGEgc2VwYXJhdGUgZW50aXR5LiAgR2l2ZW4gdGhhdCB3ZSBjdXJyZW50bHkgZG9uJ3QsIGZvcm1hdCB0YWJsZSBlbnRyaWVzCi0gICBhcmUgYWxzbyBkaXN0aW5ndWlzaGVkIGJ5IHRoZWlyIG9wZXJhbmRzLiAgVGhpcyBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlCi0gICB0YWJsZSwgYnV0IHJlZHVjZXMgdGhlIG51bWJlciBvZiB0YWJsZXMuICBJdCdzIGFsbCBtaW51dGlhZSBhbnl3YXkgc28gaXQKLSAgIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBbYXQgdGhpcyBwb2ludCBpbiB0aW1lXS4KLQotICAgPz8/IFN1cHBvcnQgZm9yIHZhcmlhYmxlIGxlbmd0aCBJU0EncyBpcyB3aXAuICAqLwotCi0vKiBBY2NvbXBhbnlpbmcgZWFjaCBpZm9ybWF0IGRlc2NyaXB0aW9uIGlzIGEgbGlzdCBvZiBpdHMgZmllbGRzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCBDR0VOX0lGTEQgKmlmbGQ7Ci0jZGVmaW5lIENHRU5fSUZNVF9JRkxEX0lGTEQoaWkpICgoaWkpLT5pZmxkKQotfSBDR0VOX0lGTVRfSUZMRDsKLQotI2lmbmRlZiBDR0VOX01BWF9JRk1UX09QRVJBTkRTCi0jZGVmaW5lIENHRU5fTUFYX0lGTVRfT1BFUkFORFMgMQotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIExlbmd0aCB0aGF0IE1BU0sgYW5kIFZBTFVFIGhhdmUgYmVlbiBjYWxjdWxhdGVkIHRvCi0gICAgIFtWQUxVRSBpcyByZWNvcmRlZCBlbHNld2hlcmVdLgotICAgICBOb3JtYWxseSBpdCBpcyBiYXNlX2luc25fYml0c2l6ZS4gIE9uIFtWXUxJVyBhcmNoaXRlY3R1cmVzIHdoZXJlIHRoZSBiYXNlCi0gICAgIGluc24gc2l6ZSBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgYW4gaW5zbiwgdGhpcyBmaWVsZCBpcyBsZXNzIHRoYW4KLSAgICAgYmFzZV9pbnNuX2JpdHNpemUuICAqLwotICB1bnNpZ25lZCBjaGFyIG1hc2tfbGVuZ3RoOwotI2RlZmluZSBDR0VOX0lGTVRfTUFTS19MRU5HVEgoaWZtdCkgKChpZm10KS0+bWFza19sZW5ndGgpCi0KLSAgLyogVG90YWwgbGVuZ3RoIG9mIGluc3RydWN0aW9uLCBpbiBiaXRzLiAgKi8KLSAgdW5zaWduZWQgY2hhciBsZW5ndGg7Ci0jZGVmaW5lIENHRU5fSUZNVF9MRU5HVEgoaWZtdCkgKChpZm10KS0+bGVuZ3RoKQotCi0gIC8qIE1hc2sgdG8gYXBwbHkgdG8gdGhlIGZpcnN0IE1BU0tfTEVOR1RIIGJpdHMuCi0gICAgIEVhY2ggaW5zbidzIHZhbHVlIGlzIHN0b3JlZCB3aXRoIHRoZSBpbnNuLgotICAgICBUaGUgZmlyc3Qgc3RlcCBpbiByZWNvZ25pemluZyBhbiBpbnNuIGZvciBkaXNhc3NlbWJseSBpcwotICAgICAob3Bjb2RlICYgbWFzaykgPT0gdmFsdWUuICAqLwotICBDR0VOX0lOU05fSU5UIG1hc2s7Ci0jZGVmaW5lIENHRU5fSUZNVF9NQVNLKGlmbXQpICgoaWZtdCktPm1hc2spCi0KLSAgLyogSW5zdHJ1Y3Rpb24gZmllbGRzLgotICAgICArMSBmb3IgdHJhaWxpbmcgTlVMTC4gICovCi0gIENHRU5fSUZNVF9JRkxEIGlmbGRzW0NHRU5fTUFYX0lGTVRfT1BFUkFORFMgKyAxXTsKLSNkZWZpbmUgQ0dFTl9JRk1UX0lGTERTKGlmbXQpICgoaWZtdCktPmlmbGRzKQotfSBDR0VOX0lGTVQ7Ci0KLS8qIEluc3RydWN0aW9uIHZhbHVlcy4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRoZSBvcGNvZGUgcG9ydGlvbiBvZiB0aGUgYmFzZSBpbnNuLiAgKi8KLSAgQ0dFTl9JTlNOX0lOVCBiYXNlX3ZhbHVlOwotCi0jaWZkZWYgQ0dFTl9NQVhfRVhUUkFfT1BDT0RFX09QRVJBTkRTCi0gIC8qIEV4dHJhIG9wY29kZSB2YWx1ZXMgYmV5b25kIGJhc2VfdmFsdWUuICAqLwotICB1bnNpZ25lZCBsb25nIGlmaWVsZF92YWx1ZXNbQ0dFTl9NQVhfRVhUUkFfT1BDT0RFX09QRVJBTkRTXTsKLSNlbmRpZgotfSBDR0VOX0lWQUxVRTsKLQotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlLgotICAgVGhpcyBjb250YWlucyB0aGUgc3ludGF4IGFuZCBmb3JtYXQgZGF0YSBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0KLS8qID8/PyBTb21lIHBvcnRzIGFscmVhZHkgaGF2ZSBhbiBvcGNvZGUgdGFibGUgeWV0IHN0aWxsIG5lZWQgdG8gdXNlIHRoZSByZXN0Ci0gICBvZiB3aGF0IGNnZW5faW5zbiBoYXMuICBQbHVzIGtlZXBpbmcgdGhlIG9wY29kZSBkYXRhIHdpdGggdGhlIG9wZXJhbmQKLSAgIGluc3RhbmNlIGRhdGEgY2FuIGNyZWF0ZSBhIHByZXR0eSBiaWcgZmlsZS4gIFNvIHdlIGtlZXAgdGhlbSBzZXBhcmF0ZWx5LgotICAgTm90IHN1cmUgdGhpcyBpcyBhIGdvb2QgaWRlYSBpbiB0aGUgbG9uZyBydW4uICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICAvKiBJbmRpY2VzIGludG8gcGFyc2UvaW5zZXJ0L2V4dHJhY3QvcHJpbnQgaGFuZGxlciB0YWJsZXMuICAqLwotICBzdHJ1Y3QgY2dlbl9vcGNvZGVfaGFuZGxlciBoYW5kbGVyczsKLSNkZWZpbmUgQ0dFTl9PUENPREVfSEFORExFUlMob3BjKSAoJiAob3BjKS0+aGFuZGxlcnMpCi0KLSAgLyogU3ludGF4IHN0cmluZy4gICovCi0gIENHRU5fU1lOVEFYIHN5bnRheDsKLSNkZWZpbmUgQ0dFTl9PUENPREVfU1lOVEFYKG9wYykgKCYgKG9wYyktPnN5bnRheCkKLQotICAvKiBGb3JtYXQgZW50cnkuICAqLwotICBjb25zdCBDR0VOX0lGTVQgKmZvcm1hdDsKLSNkZWZpbmUgQ0dFTl9PUENPREVfRk9STUFUKG9wYykgKChvcGMpLT5mb3JtYXQpCi0jZGVmaW5lIENHRU5fT1BDT0RFX01BU0tfQklUU0laRShvcGMpIENHRU5fSUZNVF9NQVNLX0xFTkdUSCAoQ0dFTl9PUENPREVfRk9STUFUIChvcGMpKQotI2RlZmluZSBDR0VOX09QQ09ERV9CSVRTSVpFKG9wYykgQ0dFTl9JRk1UX0xFTkdUSCAoQ0dFTl9PUENPREVfRk9STUFUIChvcGMpKQotI2RlZmluZSBDR0VOX09QQ09ERV9JRkxEUyhvcGMpIENHRU5fSUZNVF9JRkxEUyAoQ0dFTl9PUENPREVfRk9STUFUIChvcGMpKQotCi0gIC8qIEluc3RydWN0aW9uIG9wY29kZSB2YWx1ZS4gICovCi0gIENHRU5fSVZBTFVFIHZhbHVlOwotI2RlZmluZSBDR0VOX09QQ09ERV9WQUxVRShvcGMpICgmIChvcGMpLT52YWx1ZSkKLSNkZWZpbmUgQ0dFTl9PUENPREVfQkFTRV9WQUxVRShvcGMpIChDR0VOX09QQ09ERV9WQUxVRSAob3BjKS0+YmFzZV92YWx1ZSkKLSNkZWZpbmUgQ0dFTl9PUENPREVfQkFTRV9NQVNLKG9wYykgQ0dFTl9JRk1UX01BU0sgKENHRU5fT1BDT0RFX0ZPUk1BVCAob3BjKSkKLX0gQ0dFTl9PUENPREU7Ci0KLS8qIEluc3RydWN0aW9uIGF0dHJpYnV0ZXMuCi0gICBUaGlzIGlzIG1hZGUgYSBwdWJsaXNoZWQgdHlwZSBhcyBhcHBsaWNhdGlvbnMgY2FuIGNhY2hlIGEgcG9pbnRlciB0bwotICAgdGhlIGF0dHJpYnV0ZXMgZm9yIHNwZWVkLiAgKi8KLQotI2lmbmRlZiBDR0VOX0lOU05fTkJPT0xfQVRUUlMKLSNkZWZpbmUgQ0dFTl9JTlNOX05CT09MX0FUVFJTIDEKLSNlbmRpZgotdHlwZWRlZiBDR0VOX0FUVFJfVFlQRSAoQ0dFTl9JTlNOX05CT09MX0FUVFJTKSBDR0VOX0lOU05fQVRUUl9UWVBFOwotCi0vKiBFbnVtIG9mIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBhdHRyaWJ1dGVzLiAgKi8KLQotI2lmbmRlZiBDR0VOX0FSQ0gKLS8qID8/PyBOdW1iZXJzIGhlcmUgYXJlIHJlY29yZGVkIGluIHR3byBwbGFjZXMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl9hdHRyIHsKLSAgQ0dFTl9JTlNOX0FMSUFTID0gMAotfSBDR0VOX0lOU05fQVRUUjsKLSNlbmRpZgotCi0vKiBUaGlzIHN0cnVjdCBkZWZpbmVzIGVhY2ggZW50cnkgaW4gdGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgLyogRWFjaCByZWFsIGluc3RydWN0aW9uIGlzIGVudW1lcmF0ZWQuICAqLwotICAvKiA/Pz8gVGhpcyBtYXkgZ28gYXdheSBpbiB0aW1lLiAgKi8KLSAgaW50IG51bTsKLSNkZWZpbmUgQ0dFTl9JTlNOX05VTShpbnNuKSAoKGluc24pLT5iYXNlLT5udW0pCi0KLSAgLyogTmFtZSBvZiBlbnRyeSAodGhhdCBkaXN0aW5ndWlzaGVzIGl0IGZyb20gYWxsIG90aGVyIGVudHJpZXMpLiAgKi8KLSAgLyogPz8/IElmIG1uZW1vbmljcyBoYXZlIG9wZXJhbmRzLCB0cnkgdG8gcHJpbnQgZnVsbCBtbmVtb25pYy4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0jZGVmaW5lIENHRU5fSU5TTl9OQU1FKGluc24pICgoaW5zbiktPmJhc2UtPm5hbWUpCi0KLSAgLyogTW5lbW9uaWMuICBUaGlzIGlzIHVzZWQgd2hlbiBwYXJzaW5nIGFuZCBwcmludGluZyB0aGUgaW5zbi4KLSAgICAgSW4gdGhlIGNhc2Ugb2YgaW5zbnMgdGhhdCBoYXZlIG9wZXJhbmRzIG9uIHRoZSBtbmVtb25pY3MsIHRoaXMgaXMKLSAgICAgb25seSB0aGUgY29uc3RhbnQgcGFydC4gIEUuZy4gZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbiBvZiBhbiBgYWRkJyBpbnNuLAotICAgICB3aGVyZSB0aGUgZnVsbCBtbmVtb25pYyBpcyBhZGRlcSwgYWRkbmUsIGV0Yy4sIGFuZCB0aGUgY29uZGl0aW9uIGlzCi0gICAgIHRyZWF0ZWQgYXMgYW4gb3BlcmFuZCwgdGhpcyBpcyBvbmx5ICJhZGQiLiAgKi8KLSAgY29uc3QgY2hhciAqbW5lbW9uaWM7Ci0jZGVmaW5lIENHRU5fSU5TTl9NTkVNT05JQyhpbnNuKSAoKGluc24pLT5iYXNlLT5tbmVtb25pYykKLQotICAvKiBUb3RhbCBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24sIGluIGJpdHMuICAqLwotICBpbnQgYml0c2l6ZTsKLSNkZWZpbmUgQ0dFTl9JTlNOX0JJVFNJWkUoaW5zbikgKChpbnNuKS0+YmFzZS0+Yml0c2l6ZSkKLQotI2lmIDAgLyogPz8/IERpc2FibGVkIGZvciBub3cgYXMgdGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggZW1iZWRkZWQgbmV3bGluZXMKLQkgYW5kIHRoZSB0YWJsZSBpcyBhbHJlYWR5IHByZXR0eSBiaWcuICBTaG91bGQgcGVyaGFwcyBiZSBtb3ZlZAotCSB0byBhIGZpbGUgb2YgaXRzIG93bi4gICovCi0gIC8qIFNlbWFudGljcywgYXMgUlRMLiAgKi8KLSAgLyogPz8/IFBsYWluIHRleHQgb3IgYnl0ZWNvZGVzPyAgKi8KLSAgLyogPz8/IE5vdGUgdGhhdCB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSBjb3VsZCBiZSBjb21wdXRlZCBhdCBydW4tdGltZQotICAgICBpZiB3ZSBwYXJzZSB0aGlzIGFuZCBjYWNoZSB0aGUgcmVzdWx0cy4gIFNvbWV0aGluZyB0byBldmVudHVhbGx5IGRvLiAgKi8KLSAgY29uc3QgY2hhciAqcnR4OwotI2RlZmluZSBDR0VOX0lOU05fUlRYKGluc24pICgoaW5zbiktPmJhc2UtPnJ0eCkKLSNlbmRpZgotCi0gIC8qIEF0dHJpYnV0ZXMuCi0gICAgIFRoaXMgbXVzdCBhcHBlYXIgbGFzdC4gIEl0IGlzIGEgdmFyaWFibGUgc2l6ZWQgYXJyYXkgaW4gdGhhdCBvbmUKLSAgICAgYXJjaGl0ZWN0dXJlIG1heSBoYXZlIDEgbm9uYm9vbCBhdHRyaWJ1dGUgYW5kIGFub3RoZXIgbWF5IGhhdmUgbW9yZS4KLSAgICAgSGF2aW5nIHRoaXMgbGFzdCBtZWFucyB0aGUgbm9uLWFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIG5lZWRuJ3QKLSAgICAgY2FyZS4gIFRoZSBnb2FsIGlzIHRvIGV2ZW50dWFsbHkgcmVjb3JkIGF0dHJpYnV0ZXMgaW4gdGhlaXIgcmF3IGZvcm0sCi0gICAgIGV2YWx1YXRlIHRoZW0gYXQgcnVuLXRpbWUsIGFuZCBjYWNoZSB0aGUgdmFsdWVzLCBzbyB0aGlzIHdvcnJ5IHdpbGwgZ28KLSAgICAgYXdheSBhbnl3YXkuICAqLwotICBDR0VOX0lOU05fQVRUUl9UWVBFIGF0dHJzOwotI2RlZmluZSBDR0VOX0lOU05fQVRUUlMoaW5zbikgKCYoaW5zbiktPmJhc2UtPmF0dHJzKQotLyogUmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSBBVFRSIGluIElOU04uICAqLwotI2RlZmluZSBDR0VOX0lOU05fQVRUUl9WQUxVRShpbnNuLCBhdHRyKSBcCi1DR0VOX0FUVFJfVkFMVUUgKChpbnNuKSwgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgKGF0dHIpKQotfSBDR0VOX0lCQVNFOwotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgSU5TTiBpcyB0aGUgImludmFsaWQiIGluc24gbWFya2VyLiAgKi8KLQotI2RlZmluZSBDR0VOX0lOU05fSU5WQUxJRF9QKGluc24pIChDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pID09IDApCi0KLS8qIE1haW4gc3RydWN0IGNvbnRhaW4gaW5zdHJ1Y3Rpb24gaW5mb3JtYXRpb24uCi0gICBCQVNFIGlzIGFsd2F5cyBwcmVzZW50LCB0aGUgcmVzdCBpcyBwcmVzZW50IG9ubHkgaWYgYXNrZWQgZm9yLiAgKi8KLQotc3RydWN0IGNnZW5faW5zbgotewotICAvKiA/Pz8gTWF5IGJlIG9mIHVzZSB0byBwdXQgYSB0eXBlIGluZGljYXRvciBoZXJlLgotICAgICBUaGVuIHRoaXMgc3RydWN0IGNvdWxkIGRpZmZlcmVudCBpbmZvIGZvciBkaWZmZXJlbnQgY2xhc3NlcyBvZiBpbnNucy4gICovCi0gIC8qID8/PyBBIHNwZWVkdXAgY2FuIGJlIGhhZCBieSBtb3ZpbmcgYGJhc2UnIGludG8gdGhpcyBzdHJ1Y3QuCi0gICAgIE1heWJlIGxhdGVyLiAgKi8KLSAgY29uc3QgQ0dFTl9JQkFTRSAqYmFzZTsKLSAgY29uc3QgQ0dFTl9PUENPREUgKm9wY29kZTsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKm9waW5zdDsKLX07Ci0KLS8qIEluc3RydWN0aW9uIGxpc3RzLgotICAgVGhpcyBpcyB1c2VkIGZvciBhZGRpbmcgbmV3IGVudHJpZXMgYW5kIGZvciBjcmVhdGluZyB0aGUgaGFzaCBsaXN0cy4gICovCi0KLXR5cGVkZWYgc3RydWN0IGNnZW5faW5zbl9saXN0Ci17Ci0gIHN0cnVjdCBjZ2VuX2luc25fbGlzdCAqbmV4dDsKLSAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotfSBDR0VOX0lOU05fTElTVDsKLQotLyogVGFibGUgb2YgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgY29uc3QgQ0dFTl9JTlNOICppbml0X2VudHJpZXM7Ci0gIHVuc2lnbmVkIGludCBlbnRyeV9zaXplOyAvKiBzaW5jZSB0aGUgYXR0cmlidXRlIG1lbWJlciBpcyB2YXJpYWJsZSBzaXplZCAqLwotICB1bnNpZ25lZCBpbnQgbnVtX2luaXRfZW50cmllczsKLSAgQ0dFTl9JTlNOX0xJU1QgKm5ld19lbnRyaWVzOwotfSBDR0VOX0lOU05fVEFCTEU7Ci0KLS8qIFJldHVybiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBpbmNsdWRlcyBhbnkgYWRkZWQgYXQgcnVuLXRpbWUuICAqLwotCi1leHRlcm4gaW50IGNnZW5faW5zbl9jb3VudCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci1leHRlcm4gaW50IGNnZW5fbWFjcm9faW5zbl9jb3VudCBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLS8qIE1hY3JvcyB0byBhY2Nlc3MgdGhlIG90aGVyIGluc24gZWxlbWVudHMgbm90IHJlY29yZGVkIGluIENHRU5fSUJBU0UuICAqLwotCi0vKiBGZXRjaCBJTlNOJ3Mgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZS4gICovCi0vKiA/Pz8gRG9lc24ndCBoYW5kbGUgaW5zbnMgYWRkZWQgYXQgcnVudGltZS4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9PUEVSQU5EUyhpbnNuKSAoKGluc24pLT5vcGluc3QpCi0KLS8qIFJldHVybiBJTlNOJ3Mgb3Bjb2RlIHRhYmxlIGVudHJ5LiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX09QQ09ERShpbnNuKSAoKGluc24pLT5vcGNvZGUpCi0KLS8qIFJldHVybiBJTlNOJ3MgaGFuZGxlciBkYXRhLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0hBTkRMRVJTKGluc24pIENHRU5fT1BDT0RFX0hBTkRMRVJTIChDR0VOX0lOU05fT1BDT0RFIChpbnNuKSkKLQotLyogUmV0dXJuIElOU04ncyBzeW50YXguICAqLwotI2RlZmluZSBDR0VOX0lOU05fU1lOVEFYKGluc24pIENHRU5fT1BDT0RFX1NZTlRBWCAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCi0KLS8qIFJldHVybiBzaXplIG9mIGJhc2UgbWFzayBpbiBiaXRzLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX01BU0tfQklUU0laRShpbnNuKSBcCi0gIENHRU5fT1BDT0RFX01BU0tfQklUU0laRSAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCi0KLS8qIFJldHVybiBtYXNrIG9mIGJhc2UgcGFydCBvZiBJTlNOLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0JBU0VfTUFTSyhpbnNuKSBcCi0gIENHRU5fT1BDT0RFX0JBU0VfTUFTSyAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCi0KLS8qIFJldHVybiB2YWx1ZSBvZiBiYXNlIHBhcnQgb2YgSU5TTi4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9CQVNFX1ZBTFVFKGluc24pIFwKLSAgQ0dFTl9PUENPREVfQkFTRV9WQUxVRSAoQ0dFTl9JTlNOX09QQ09ERSAoaW5zbikpCi0MCi0vKiBNYWNybyBpbnN0cnVjdGlvbnMuCi0gICBNYWNybyBpbnNucyBhcmVuJ3QgcmVhbCBpbnNucywgdGhleSBtYXAgdG8gb25lIG9yIG1vcmUgcmVhbCBpbnNucy4KLSAgIEUuZy4gQW4gYXJjaGl0ZWN0dXJlJ3MgIm5vcCIgaW5zbiBtYXkgYWN0dWFsbHkgYmUgYW4gIm12IHIwLHIwIiBvcgotICAgc29tZSBzdWNoLgotCi0gICBNYWNybyBpbnNucyBjYW4gZXhwYW5kIHRvIG5vdGhpbmcgKGUuZy4gYSBub3AgdGhhdCBpcyBvcHRpbWl6ZWQgYXdheSkuCi0gICBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS1pbnNuIG1hY3JvcyB0aGF0IGJ1aWxkIGEgY29uc3RhbnQgaW4gYSByZWdpc3Rlci4KLSAgIE9mIGNvdXJzZSB0aGlzIGlzbid0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuCi0KLSAgIEFzc2VtYmx5IG9mIG1hY3JvLWluc25zIGlzIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkLiAgRGlzYXNzZW1ibHkgaXNuJ3QuCi0gICBIb3dldmVyLCBkaXNhc3NlbWJseSBvZiBhdCBsZWFzdCBzb21lIGtpbmRzIG9mIG1hY3JvIGluc25zIGlzIGltcG9ydGFudAotICAgaW4gb3JkZXIgdGhhdCB0aGUgZGlzYXNzZW1ibGVkIGNvZGUgcHJlc2VydmUgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBvcmlnaW5hbAotICAgaW5zbi4gIFdoYXQgaXMgYXR0ZW1wdGVkIGhlcmUgaXMgdG8gZGlzYXNzZW1ibGUgYWxsICJzaW1wbGUiIG1hY3JvLWluc25zLAotICAgd2hlcmUgInNpbXBsZSIgaXMgY3VycmVudGx5IGRlZmluZWQgdG8gbWVhbiAiZXhwYW5kcyB0byBvbmUgcmVhbCBpbnNuIi4KLQotICAgU2ltcGxlIG1hY3JvLWluc25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseS4gIFRoZXkgYXJlIGVtaXR0ZWQgYXMgQUxJQVMncwotICAgb2YgcmVhbCBpbnNucy4gIFRoaXMgc2ltcGxpZmllcyB0aGVpciBoYW5kbGluZyBzaW5jZSB0aGVyZSdzIHVzdWFsbHkgbW9yZQotICAgb2YgdGhlbSB0aGFuIGFueSBvdGhlciBraW5kIG9mIG1hY3JvLWluc24sIGFuZCBwcm9wZXIgZGlzYXNzZW1ibHkgb2YgdGhlbQotICAgZmFsbHMgb3V0IGZvciBmcmVlLiAgKi8KLQotLyogRm9yIGVhY2ggbWFjcm8taW5zbiB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMsCi0gICBkZXBlbmRpbmcgb24gdGhlIGFyZ3VtZW50cy4gIFRoaXMgc3RydWN0dXJlIGlzIGFjY2Vzc2VkIHZpYSB0aGUgYGRhdGEnCi0gICBtZW1iZXIgb2YgQ0dFTl9JTlNOLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9taW5zbl9leHBhbnNpb24gewotICAvKiBGdW5jdGlvbiB0byBkbyB0aGUgZXhwYW5zaW9uLgotICAgICBJZiB0aGUgZXhwYW5zaW9uIGZhaWxzIChlLmcuICJubyBtYXRjaCIpIE5VTEwgaXMgcmV0dXJuZWQuCi0gICAgIFNwYWNlIGZvciB0aGUgZXhwYW5zaW9uIGlzIG9idGFpbmVkIHdpdGggbWFsbG9jLgotICAgICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGZyZWUgaXQuICAqLwotICBjb25zdCBjaGFyICogKCogZm4pIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBjZ2VuX21pbnNuX2V4cGFuc2lvbiAqLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKiwgaW50ICosCi0JCQkgICAgICAgQ0dFTl9PUEVSQU5EICoqKSk7Ci0jZGVmaW5lIENHRU5fTUlFWFBOX0ZOKGV4KSAoKGV4KS0+Zm4pCi0KLSAgLyogSW5zdHJ1Y3Rpb24ocykgdGhlIG1hY3JvIGV4cGFuZHMgdG8uCi0gICAgIFRoZSBmb3JtYXQgb2YgU1RSIGlzIGRlZmluZWQgYnkgRk4uCi0gICAgIEl0IGlzIHR5cGljYWxseSB0aGUgYXNzZW1ibHkgY29kZSBvZiB0aGUgcmVhbCBpbnNuLCBidXQgaXQgY291bGQgYWxzbyBiZQotICAgICB0aGUgb3JpZ2luYWwgU2NoZW1lIGV4cHJlc3Npb24gb3IgYSB0b2tlbml6ZWQgZm9ybSBvZiBpdCAod2l0aCBGTiBiZWluZwotICAgICBhbiBhcHByb3ByaWF0ZSBpbnRlcnByZXRlcikuICAqLwotICBjb25zdCBjaGFyICogc3RyOwotI2RlZmluZSBDR0VOX01JRVhQTl9TVFIoZXgpICgoZXgpLT5zdHIpCi19IENHRU5fTUlOU05fRVhQQU5TSU9OOwotCi0vKiBOb3JtYWwgZXhwYW5kZXIuCi0gICBXaGVuIHN1cHBvcnRlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgdGhlIGlucHV0IHN0cmluZyB0byBhbm90aGVyCi0gICBzdHJpbmcgYW5kIHRoZSBwYXJzZXIgd2lsbCBiZSBpbnZva2VkIHJlY3Vyc2l2ZWx5LiAgVGhlIG91dHB1dCBzdHJpbmcKLSAgIG1heSBjb250YWluIGZ1cnRoZXIgbWFjcm8gaW52b2NhdGlvbnMuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqIGNnZW5fZXhwYW5kX21hY3JvX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3Qgc3RydWN0IGNnZW5fbWluc25fZXhwYW5zaW9uICosCi0JICAgICAgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICoqLCBpbnQgKiwgQ0dFTl9PUEVSQU5EICoqKSk7Ci0MCi0vKiBUaGUgYXNzZW1ibGVyIGluc24gdGFibGUgaXMgaGFzaGVkIGJhc2VkIG9uIHNvbWUgZnVuY3Rpb24gb2YgdGhlIG1uZW1vbmljCi0gICAodGhlIGFjdHVhbGx5IGhhc2hpbmcgZG9uZSBpcyB1cCB0byB0aGUgdGFyZ2V0LCBidXQgd2UgcHJvdmlkZSBhIGZldwotICAgZXhhbXBsZXMgbGlrZSB0aGUgZmlyc3QgbGV0dGVyIG9yIGEgZnVuY3Rpb24gb2YgdGhlIGVudGlyZSBtbmVtb25pYykuICAqLwotCi1leHRlcm4gQ0dFTl9JTlNOX0xJU1QgKiBjZ2VuX2FzbV9sb29rdXBfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICopKTsKLSNkZWZpbmUgQ0dFTl9BU01fTE9PS1VQX0lOU04oY2QsIHN0cmluZykgY2dlbl9hc21fbG9va3VwX2luc24gKChjZCksIChzdHJpbmcpKQotI2RlZmluZSBDR0VOX0FTTV9ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKLQotLyogVGhlIGRpc2Fzc2VtYmxlciBpbnNuIHRhYmxlIGlzIGhhc2hlZCBiYXNlZCBvbiBzb21lIGZ1bmN0aW9uIG9mIG1hY2hpbmUKLSAgIGluc3RydWN0aW9uICh0aGUgYWN0dWFsbHkgaGFzaGluZyBkb25lIGlzIHVwIHRvIHRoZSB0YXJnZXQpLiAgKi8KLQotZXh0ZXJuIENHRU5fSU5TTl9MSVNUICogY2dlbl9kaXNfbG9va3VwX2luc24KLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0vKiBGSVhNRTogZGVsZXRlIHRoZXNlIHR3byAqLwotI2RlZmluZSBDR0VOX0RJU19MT09LVVBfSU5TTihjZCwgYnVmLCB2YWx1ZSkgY2dlbl9kaXNfbG9va3VwX2luc24gKChjZCksIChidWYpLCAodmFsdWUpKQotI2RlZmluZSBDR0VOX0RJU19ORVhUX0lOU04oaW5zbikgKChpbnNuKS0+bmV4dCkKLQwKLS8qIFRoZSBDUFUgZGVzY3JpcHRpb24uCi0gICBBIGNvcHkgb2YgdGhpcyBpcyBjcmVhdGVkIHdoZW4gdGhlIGNwdSB0YWJsZSBpcyAib3BlbmVkIi4KLSAgIEFsbCBnbG9iYWwgc3RhdGUgaW5mb3JtYXRpb24gaXMgcmVjb3JkZWQgaGVyZS4KLSAgIEFjY2VzcyBtYWNyb3MgYXJlIHByb3ZpZGVkIGZvciAicHVibGljIiBtZW1iZXJzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgY2dlbl9jcHVfZGVzYwotewotICAvKiBCaXRtYXAgb2Ygc2VsZWN0ZWQgbWFjaGluZShzKSAoYSBsYSBCRkQgbWFjaGluZSBudW1iZXIpLiAgKi8KLSAgaW50IG1hY2hzOwotCi0gIC8qIEJpdG1hcCBvZiBzZWxlY3RlZCBpc2EocykuCi0gICAgID8/PyBTaW11bHRhbmVvdXMgbXVsdGlwbGUgaXNhcyBtaWdodCBub3QgbWFrZSBzZW5zZSwgYnV0IGl0J3Mgbm90ICh5ZXQpCi0gICAgIHByZWNsdWRlZC4gICovCi0gIGludCBpc2FzOwotCi0gIC8qIEN1cnJlbnQgZW5kaWFuLiAgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBlbmRpYW47Ci0jZGVmaW5lIENHRU5fQ1BVX0VORElBTihjZCkgKChjZCktPmVuZGlhbikKLQotICAvKiBDdXJyZW50IGluc24gZW5kaWFuLiAgKi8KLSAgZW51bSBjZ2VuX2VuZGlhbiBpbnNuX2VuZGlhbjsKLSNkZWZpbmUgQ0dFTl9DUFVfSU5TTl9FTkRJQU4oY2QpICgoY2QpLT5pbnNuX2VuZGlhbikKLQotICAvKiBXb3JkIHNpemUgKGluIGJpdHMpLiAgKi8KLSAgLyogPz8/IE9yIG1heWJlIG1heGltdW0gd29yZCBzaXplIC0gbWlnaHQgd2UgZXZlciBuZWVkIHRvIGFsbG93IGEgY3B1IHRhYmxlCi0gICAgIHRvIGJlIG9wZW5lZCBmb3IgYm90aCBzcGFyYzMyL3NwYXJjNjQ/Ci0gICAgID8/PyBBbm90aGVyIGFsdGVybmF0aXZlIGlzIHRvIGNyZWF0ZSBhIHRhYmxlIG9mIHNlbGVjdGVkIG1hY2hzIGFuZAotICAgICBsYXppbHkgZmV0Y2ggdGhlIGRhdGEgZnJvbSB0aGVyZS4gICovCi0gIHVuc2lnbmVkIGludCB3b3JkX2JpdHNpemU7Ci0KLSAgLyogSW5kaWNhdG9yIGlmIHNpemVzIGFyZSB1bmtub3duLgotICAgICBUaGlzIGlzIHVzZWQgYnkgZGVmYXVsdF9pbnNuX2JpdHNpemUsYmFzZV9pbnNuX2JpdHNpemUgaWYgdGhlcmUgaXMgYQotICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNlbGVjdGVkIGlzYSdzLiAgKi8KLSNkZWZpbmUgQ0dFTl9TSVpFX1VOS05PV04gNjU1MzUKLQotICAvKiBEZWZhdWx0IGluc3RydWN0aW9uIHNpemUgKGluIGJpdHMpLgotICAgICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB3aGVuIGl0IGVuY291bnRlcnMgYW4gdW5rbm93biBpbnNuLiAgKi8KLSAgdW5zaWduZWQgaW50IGRlZmF1bHRfaW5zbl9iaXRzaXplOwotCi0gIC8qIEJhc2UgaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuCi0gICAgIEZvciBub24tTElXIGNwdXMgdGhpcyBpcyBnZW5lcmFsbHkgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlc3QgaW5zbi4KLSAgICAgRm9yIExJVyBjcHVzIGl0cyB3aXAgKHdvcmstaW4tcHJvZ3Jlc3MpLiAgRm9yIHRoZSBtMzJyIGl0cyAzMi4gICovCi0gIHVuc2lnbmVkIGludCBiYXNlX2luc25fYml0c2l6ZTsKLQotICAvKiBNaW5pbXVtL21heGltdW0gaW5zdHJ1Y3Rpb24gc2l6ZSAoaW4gYml0cykuICAqLwotICB1bnNpZ25lZCBpbnQgbWluX2luc25fYml0c2l6ZTsKLSAgdW5zaWduZWQgaW50IG1heF9pbnNuX2JpdHNpemU7Ci0KLSAgLyogSW5zdHJ1Y3Rpb24gc2V0IHZhcmlhbnRzLiAgKi8KLSAgY29uc3QgQ0dFTl9JU0EgKmlzYV90YWJsZTsKLQotICAvKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLSAgY29uc3QgQ0dFTl9NQUNIICptYWNoX3RhYmxlOwotCi0gIC8qIEhhcmR3YXJlIGVsZW1lbnRzLiAgKi8KLSAgQ0dFTl9IV19UQUJMRSBod190YWJsZTsKLQotICAvKiBJbnN0cnVjdGlvbiBmaWVsZHMuICAqLwotICBjb25zdCBDR0VOX0lGTEQgKmlmbGRfdGFibGU7Ci0KLSAgLyogT3BlcmFuZHMuICAqLwotICBDR0VOX09QRVJBTkRfVEFCTEUgb3BlcmFuZF90YWJsZTsKLQotICAvKiBNYWluIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX1RBQkxFIGluc25fdGFibGU7Ci0jZGVmaW5lIENHRU5fQ1BVX0lOU05fVEFCTEUoY2QpICgmIChjZCktPmluc25fdGFibGUpCi0KLSAgLyogTWFjcm8gaW5zdHJ1Y3Rpb25zIGFyZSBkZWZpbmVkIHNlcGFyYXRlbHkgYW5kIGFyZSBjb21iaW5lZCB3aXRoIHJlYWwKLSAgICAgaW5zbnMgZHVyaW5nIGhhc2ggdGFibGUgY29tcHV0YXRpb24uICAqLwotICBDR0VOX0lOU05fVEFCTEUgbWFjcm9faW5zbl90YWJsZTsKLQotICAvKiBDb3B5IG9mIENHRU5fSU5UX0lOU05fUC4gICovCi0gIGludCBpbnRfaW5zbl9wOwotCi0gIC8qIENhbGxlZCB0byByZWJ1aWxkIHRoZSB0YWJsZXMgYWZ0ZXIgc29tZXRoaW5nIGhhcyBjaGFuZ2VkLiAgKi8KLSAgdm9pZCAoKnJlYnVpbGRfdGFibGVzKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci0KLSAgLyogT3BlcmFuZCBwYXJzZXIgY2FsbGJhY2suICAqLwotICBjZ2VuX3BhcnNlX29wZXJhbmRfZm4gKiBwYXJzZV9vcGVyYW5kX2ZuOwotCi0gIC8qIFBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGNvdmVyIGZucyBmb3Igb3BlcmFuZHMuICAqLwotICBjb25zdCBjaGFyICogKCpwYXJzZV9vcGVyYW5kKQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IGNoYXIgKiosCi0JICAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkc18pKTsKLSNpZmRlZiBCRkRfVkVSU0lPTgotICBjb25zdCBjaGFyICogKCppbnNlcnRfb3BlcmFuZCkKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywKLQkgICAgICBDR0VOX0lOU05fQllURVNfUFRSLCBiZmRfdm1hIHBjXykpOwotICBpbnQgKCpleHRyYWN0X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9FWFRSQUNUX0lORk8gKiwgQ0dFTl9JTlNOX0lOVCwKLQkgICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzXywgYmZkX3ZtYSBwY18pKTsKLSAgdm9pZCAoKnByaW50X29wZXJhbmQpCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgUFRSIGluZm9fLCBDR0VOX0ZJRUxEUyAqIGZpZWxkc18sCi0JICAgICAgdm9pZCBjb25zdCAqYXR0cnNfLCBiZmRfdm1hIHBjXywgaW50IGxlbmd0aF8pKTsKLSNlbHNlCi0gIGNvbnN0IGNoYXIgKiAoKmluc2VydF9vcGVyYW5kKSAoKTsKLSAgaW50ICgqZXh0cmFjdF9vcGVyYW5kKSAoKTsKLSAgdm9pZCAoKnByaW50X29wZXJhbmQpICgpOwotI2VuZGlmCi0jZGVmaW5lIENHRU5fQ1BVX1BBUlNFX09QRVJBTkQoY2QpICgoY2QpLT5wYXJzZV9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9JTlNFUlRfT1BFUkFORChjZCkgKChjZCktPmluc2VydF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9FWFRSQUNUX09QRVJBTkQoY2QpICgoY2QpLT5leHRyYWN0X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX1BSSU5UX09QRVJBTkQoY2QpICgoY2QpLT5wcmludF9vcGVyYW5kKQotCi0gIC8qIFNpemUgb2YgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KLSAgdW5zaWduZWQgaW50IHNpemVvZl9maWVsZHM7Ci0jZGVmaW5lIENHRU5fQ1BVX1NJWkVPRl9GSUVMRFMoY2QpICgoY2QpLT5zaXplb2ZfZmllbGRzKQotCi0gIC8qIFNldCB0aGUgYml0c2l6ZSBmaWVsZC4gICovCi0gIHZvaWQgKCpzZXRfZmllbGRzX2JpdHNpemUpIFBBUkFNUyAoKENHRU5fRklFTERTICpmaWVsZHNfLCBpbnQgc2l6ZV8pKTsKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX0ZJRUxEU19CSVRTSVpFKGNkKSAoKGNkKS0+c2V0X2ZpZWxkc19iaXRzaXplKQotCi0gIC8qIENHRU5fRklFTERTIGFjY2Vzc29ycy4gICovCi0gIGludCAoKmdldF9pbnRfb3BlcmFuZCkKLSAgICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBpbnQgb3BpbmRleF8sIGNvbnN0IENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0gIHZvaWQgKCpzZXRfaW50X29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50IHZhbHVlXykpOwotI2lmZGVmIEJGRF9WRVJTSU9OCi0gIGJmZF92bWEgKCpnZXRfdm1hX29wZXJhbmQpCi0gICAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgaW50IG9waW5kZXhfLCBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXykpOwotICB2b2lkICgqc2V0X3ZtYV9vcGVyYW5kKQotICAgICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGludCBvcGluZGV4XywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGJmZF92bWEgdmFsdWVfKSk7Ci0jZWxzZQotICBsb25nICgqZ2V0X3ZtYV9vcGVyYW5kKSAoKTsKLSAgdm9pZCAoKnNldF92bWFfb3BlcmFuZCkgKCk7Ci0jZW5kaWYKLSNkZWZpbmUgQ0dFTl9DUFVfR0VUX0lOVF9PUEVSQU5EKGNkKSAoKGNkKS0+Z2V0X2ludF9vcGVyYW5kKQotI2RlZmluZSBDR0VOX0NQVV9TRVRfSU5UX09QRVJBTkQoY2QpICgoY2QpLT5zZXRfaW50X29wZXJhbmQpCi0jZGVmaW5lIENHRU5fQ1BVX0dFVF9WTUFfT1BFUkFORChjZCkgKChjZCktPmdldF92bWFfb3BlcmFuZCkKLSNkZWZpbmUgQ0dFTl9DUFVfU0VUX1ZNQV9PUEVSQU5EKGNkKSAoKGNkKS0+c2V0X3ZtYV9vcGVyYW5kKQotCi0gIC8qIEluc3RydWN0aW9uIHBhcnNlL2luc2VydC9leHRyYWN0L3ByaW50IGhhbmRsZXJzLiAgKi8KLSAgLyogRklYTUU6IG1ha2UgdGhlc2UgdHlwZXMgdXBwZXJjYXNlLiAgKi8KLSAgY2dlbl9wYXJzZV9mbiAqIGNvbnN0ICpwYXJzZV9oYW5kbGVyczsKLSAgY2dlbl9pbnNlcnRfZm4gKiBjb25zdCAqaW5zZXJ0X2hhbmRsZXJzOwotICBjZ2VuX2V4dHJhY3RfZm4gKiBjb25zdCAqZXh0cmFjdF9oYW5kbGVyczsKLSAgY2dlbl9wcmludF9mbiAqIGNvbnN0ICpwcmludF9oYW5kbGVyczsKLSNkZWZpbmUgQ0dFTl9QQVJTRV9GTihjZCwgaW5zbikgICAoY2QtPnBhcnNlX2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wYXJzZV0pCi0jZGVmaW5lIENHRU5fSU5TRVJUX0ZOKGNkLCBpbnNuKSAgKGNkLT5pbnNlcnRfaGFuZGxlcnNbKGluc24pLT5vcGNvZGUtPmhhbmRsZXJzLmluc2VydF0pCi0jZGVmaW5lIENHRU5fRVhUUkFDVF9GTihjZCwgaW5zbikgKGNkLT5leHRyYWN0X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5leHRyYWN0XSkKLSNkZWZpbmUgQ0dFTl9QUklOVF9GTihjZCwgaW5zbikgICAoY2QtPnByaW50X2hhbmRsZXJzWyhpbnNuKS0+b3Bjb2RlLT5oYW5kbGVycy5wcmludF0pCi0KLSAgLyogUmV0dXJuIG5vbi16ZXJvIGlmIGluc24gc2hvdWxkIGJlIGFkZGVkIHRvIGhhc2ggdGFibGUuICAqLwotICBpbnQgKCogYXNtX2hhc2hfcCkgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLQotICAvKiBBc3NlbWJsZXIgaGFzaCBmdW5jdGlvbi4gICovCi0gIHVuc2lnbmVkIGludCAoKiBhc21faGFzaCkgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gYXNzZW1ibGVyIGhhc2ggdGFibGUuICAqLwotICB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfc2l6ZTsKLQotICAvKiBSZXR1cm4gbm9uLXplcm8gaWYgaW5zbiBzaG91bGQgYmUgYWRkZWQgdG8gaGFzaCB0YWJsZS4gICovCi0gIGludCAoKiBkaXNfaGFzaF9wKSBQQVJBTVMgKChjb25zdCBDR0VOX0lOU04gKikpOwotCi0gIC8qIERpc2Fzc2VtYmxlciBoYXNoIGZ1bmN0aW9uLiAgKi8KLSAgdW5zaWduZWQgaW50ICgqIGRpc19oYXNoKSBQQVJBTVMgKChjb25zdCBjaGFyICosIENHRU5fSU5TTl9JTlQpKTsKLQotICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBkaXNhc3NlbWJsZXIgaGFzaCB0YWJsZS4gICovCi0gIHVuc2lnbmVkIGludCBkaXNfaGFzaF9zaXplOwotCi0gIC8qIEFzc2VtYmxlciBpbnN0cnVjdGlvbiBoYXNoIHRhYmxlLiAgKi8KLSAgQ0dFTl9JTlNOX0xJU1QgKiphc21faGFzaF90YWJsZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmFzbV9oYXNoX3RhYmxlX2VudHJpZXM7Ci0KLSAgLyogRGlzYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotICBDR0VOX0lOU05fTElTVCAqKmRpc19oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqZGlzX2hhc2hfdGFibGVfZW50cmllczsKLX0gQ0dFTl9DUFVfVEFCTEU7Ci0KLS8qIHdpcCAqLwotI2lmbmRlZiBDR0VOX1dPUkRfRU5ESUFOCi0jZGVmaW5lIENHRU5fV09SRF9FTkRJQU4oY2QpIENHRU5fQ1BVX0VORElBTiAoY2QpCi0jZW5kaWYKLSNpZm5kZWYgQ0dFTl9JTlNOX1dPUkRfRU5ESUFOCi0jZGVmaW5lIENHRU5fSU5TTl9XT1JEX0VORElBTihjZCkgQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKQotI2VuZGlmCi0MCi0vKiBQcm90b3R5cGVzIG9mIG1ham9yIGZ1bmN0aW9ucy4gICovCi0vKiBGSVhNRTogTW92ZSBtb3JlIENHRU5fU1lNLWRlZmluZWQgZnVuY3Rpb25zIGludG8gQ0dFTl9DUFVfREVTQy4KLSAgIE5vdCB0aGUgaW5pdCBmbnMgdGhvdWdoLCBhcyB0aGF0IHdvdWxkIGRyYWcgaW4gdGhpbmdzIHRoYXQgbWlnaHRuJ3QgYmUKLSAgIHVzZWQgYW5kIG1pZ2h0IG5vdCBldmVuIGV4aXN0LiAgKi8KLQotLyogQXJndW1lbnQgdHlwZXMgdG8gY3B1X29wZW4uICAqLwotCi1lbnVtIGNnZW5fY3B1X29wZW5fYXJnIHsKLSAgQ0dFTl9DUFVfT1BFTl9FTkQsCi0gIC8qIFNlbGVjdCBpbnN0cnVjdGlvbiBzZXQocyksIGFyZyBpcyBiaXRtYXAgb3IgMCBtZWFuaW5nICJ1bnNwZWNpZmllZCIuICAqLwotICBDR0VOX0NQVV9PUEVOX0lTQVMsCi0gIC8qIFNlbGVjdCBtYWNoaW5lKHMpLCBhcmcgaXMgYml0bWFwIG9yIDAgbWVhbmluZyAidW5zcGVjaWZpZWQiLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9NQUNIUywKLSAgLyogU2VsZWN0IG1hY2hpbmUsIGFyZyBpcyBtYWNoJ3MgYmZkIG5hbWUuCi0gICAgIE11bHRpcGxlIG1hY2hpbmVzIGNhbiBiZSBzcGVjaWZpZWQgYnkgcmVwZWF0ZWQgdXNlLiAgKi8KLSAgQ0dFTl9DUFVfT1BFTl9CRkRNQUNILAotICAvKiBTZWxlY3QgZW5kaWFuLCBhcmcgaXMgQ0dFTl9FTkRJQU5fKi4gICovCi0gIENHRU5fQ1BVX09QRU5fRU5ESUFOCi19OwotCi0vKiBPcGVuIGEgY3B1IGRlc2NyaXB0b3IgdGFibGUgZm9yIHVzZS4KLSAgID8/PyBXZSBvbmx5IHN1cHBvcnQgSVNPIEMgc3RkYXJncyBoZXJlLCBub3QgSyZSLgotICAgTGF6aW5lc3MsIHBsdXMgZXhwZXJpbWVudCB0byBzZWUgaWYgYW55dGhpbmcgcmVxdWlyZXMgSyZSIC0gZXZlbnR1YWxseQotICAgSyZSIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCAtIGUuZy4gR0RCIGlzIGN1cnJlbnRseSB0cnlpbmcgdGhpcy4gICovCi0KLWV4dGVybiBDR0VOX0NQVV9ERVNDIENHRU5fU1lNIChjcHVfb3BlbikgKGVudW0gY2dlbl9jcHVfb3Blbl9hcmcsIC4uLik7Ci0KLS8qIENvdmVyIGZuIHRvIGhhbmRsZSBzaW1wbGUgY2FzZS4gICovCi0KLWV4dGVybiBDR0VOX0NQVV9ERVNDIENHRU5fU1lNIChjcHVfb3Blbl8xKSBQQVJBTVMgKChjb25zdCBjaGFyICptYWNoX25hbWVfLAotCQkJCQkJICAgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuXykpOwotCi0vKiBDbG9zZSBpdC4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChjcHVfY2xvc2UpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlIGZvciB1c2UuCi0gICBDYWxsZWQgYnkgaW5pdF9hc20vaW5pdF9kaXMuICAqLwotCi1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9vcGNvZGVfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7Ci0KLS8qIEluaXRpYWxpemUgdGhlIGlibGQgdGFibGUgZm9yIHVzZS4KLSAgIENhbGxlZCBieSBpbml0X2FzbS9pbml0X2Rpcy4gICovCi0KLWV4dGVybiB2b2lkIENHRU5fU1lNIChpbml0X2libGRfdGFibGUpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MgY2RfKSk7Ci0KLS8qIEluaXRpYWxpemUgYW4gY3B1IHRhYmxlIGZvciBhc3NlbWJsZXIgb3IgZGlzYXNzZW1ibGVyIHVzZS4KLSAgIFRoZXNlIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGNwdV9vcGVuLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfYXNtKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDKSk7Ci1leHRlcm4gdm9pZCBDR0VOX1NZTSAoaW5pdF9kaXMpIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MpKTsKLQotLyogSW5pdGlhbGl6ZSB0aGUgb3BlcmFuZCBpbnN0YW5jZSB0YWJsZSBmb3IgdXNlLiAgKi8KLQotZXh0ZXJuIHZvaWQgQ0dFTl9TWU0gKGluaXRfb3BpbnN0X3RhYmxlKSBQQVJBTVMgKChDR0VOX0NQVV9ERVNDIGNkXykpOwotCi0vKiBBc3NlbWJsZSBhbiBpbnN0cnVjdGlvbi4gICovCi0KLWV4dGVybiBjb25zdCBDR0VOX0lOU04gKiBDR0VOX1NZTSAoYXNzZW1ibGVfaW5zbikKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgY2hhciAqLCBDR0VOX0ZJRUxEUyAqLAotCSAgICAgIENHRU5fSU5TTl9CWVRFU19QVFIsIGNoYXIgKiopKTsKLQotZXh0ZXJuIGNvbnN0IENHRU5fS0VZV09SRCBDR0VOX1NZTSAob3BlcmFuZF9tYWNoKTsKLWV4dGVybiBpbnQgQ0dFTl9TWU0gKGdldF9tYWNoKSBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLQotLyogT3BlcmFuZCBpbmRleCBjb21wdXRhdGlvbi4gICovCi1leHRlcm4gY29uc3QgQ0dFTl9JTlNOICogY2dlbl9sb29rdXBfaW5zbgotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiBpbnNuXywKLQkgICAgICBDR0VOX0lOU05fSU5UIGludF92YWx1ZV8sIHVuc2lnbmVkIGNoYXIgKmJ5dGVzX3ZhbHVlXywKLQkgICAgICBpbnQgbGVuZ3RoXywgQ0dFTl9GSUVMRFMgKmZpZWxkc18sIGludCBhbGlhc19wXykpOwotZXh0ZXJuIHZvaWQgY2dlbl9nZXRfaW5zbl9vcGVyYW5kcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiBpbnNuXywKLQkgICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzXywgaW50ICppbmRpY2VzXykpOwotZXh0ZXJuIGNvbnN0IENHRU5fSU5TTiAqIGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqaW5zbl8sCi0JICAgICAgQ0dFTl9JTlNOX0lOVCBpbnRfdmFsdWVfLCB1bnNpZ25lZCBjaGFyICpieXRlc192YWx1ZV8sCi0JICAgICAgaW50IGxlbmd0aF8sIGludCAqaW5kaWNlc18sIENHRU5fRklFTERTICpmaWVsZHNfKSk7Ci0KLS8qIENvdmVyIGZucyB0byBiZmRfZ2V0L3NldC4gICovCi0KLWV4dGVybiBDR0VOX0lOU05fSU5UIGNnZW5fZ2V0X2luc25fdmFsdWUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgdW5zaWduZWQgY2hhciAqLCBpbnQpKTsKLWV4dGVybiB2b2lkIGNnZW5fcHV0X2luc25fdmFsdWUKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgdW5zaWduZWQgY2hhciAqLCBpbnQsIENHRU5fSU5TTl9JTlQpKTsKLQotLyogUmVhZCBpbiBhIGNwdSBkZXNjcmlwdGlvbiBmaWxlLgotICAgPz8/IEZvciBmdXR1cmUgY29uY2VybnMsIGluY2x1ZGluZyBhZGRpbmcgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBhc3NlbWJsZXIvCi0gICBkaXNhc3NlbWJsZXIgYXQgcnVuLXRpbWUuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqIGNnZW5fcmVhZF9jcHVfZmlsZQotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBjaGFyICogZmlsZW5hbWVfKSk7Ci0KLSNlbmRpZiAvKiBDR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2NvbnZleC5oIGIvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWVlYmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvY29udmV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzExICswLDAgQEAKLS8qIEluZm9ybWF0aW9uIGZvciBpbnN0cnVjdGlvbiBkaXNhc3NlbWJseSBvbiB0aGUgQ29udmV4LgotICAgQ29weXJpZ2h0IDE5ODksIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZglDT05TVAotI2RlZmluZQlDT05TVAotI2VuZGlmCS8qIENPTlNUICovCi0KLSNkZWZpbmUgeHh4IDAKLSNkZWZpbmUgcnJyIDEKLSNkZWZpbmUgcnIgMgotI2RlZmluZSByeHIgMwotI2RlZmluZSByIDQKLSNkZWZpbmUgbm9wcyA1Ci0jZGVmaW5lIG5yIDYKLSNkZWZpbmUgcGNyZWwgNwotI2RlZmluZSBsciA4Ci0jZGVmaW5lIHJ4bCA5Ci0jZGVmaW5lIHJsciAxMAotI2RlZmluZSBycmwgMTEKLSNkZWZpbmUgaW1sIDEyCi0jZGVmaW5lIGltciAxMwotI2RlZmluZSBhMXIgMTQKLSNkZWZpbmUgYTFsIDE1Ci0jZGVmaW5lIGEyciAxNgotI2RlZmluZSBhMmwgMTcKLSNkZWZpbmUgYTMgMTgKLSNkZWZpbmUgYTQgMTkKLSNkZWZpbmUgYTUgMjAKLSNkZWZpbmUgViAxCi0jZGVmaW5lIFMgMgotI2RlZmluZSBWTSAzCi0jZGVmaW5lIEEgNAotI2RlZmluZSBWTCA1Ci0jZGVmaW5lIFZTIDYKLSNkZWZpbmUgVkxTIDcKLSNkZWZpbmUgUFNXIDgKLS8qIFByZXZlbnQgYW4gZXJyb3IgZHVyaW5nICJtYWtlIGRlcGVuZCIuICAqLwotI2lmICFkZWZpbmVkIChQQykKLSNkZWZpbmUgUEMgOQotI2VuZGlmCi0jZGVmaW5lIElUUiAxMAotI2RlZmluZSBWViAxMQotI2RlZmluZSBJVFNSIDEyCi0jZGVmaW5lIFRPQyAxMwotI2RlZmluZSBDSVIgMTQKLSNkZWZpbmUgVFRSIDE1Ci0jZGVmaW5lIFZNVSAxNgotI2RlZmluZSBWTUwgMTcKLSNkZWZpbmUgSUNSIDE4Ci0jZGVmaW5lIFRDUFUgMTkKLSNkZWZpbmUgQ1BVSUQgMjAKLSNkZWZpbmUgVElEIDIxCi0KLUNPTlNUIGNoYXIgKm9wW10gPSB7Ci0gICIiLAotICAidjBcMHYxXDB2MlwwdjNcMHY0XDB2NVwwdjZcMHY3IiwKLSAgInMwXDBzMVwwczJcMHMzXDBzNFwwczVcMHM2XDBzNyIsCi0gICJ2bSIsCi0gICJzcFwwYTFcMGEyXDBhM1wwYTRcMGE1XDBhcFwwZnAiLAotICAidmwiLAotICAidnMiLAotICAidmxzIiwKLSAgInBzdyIsCi0gICJwYyIsCi0gICJpdHIiLAotICAidnYiLAotICAiaXRzciIsCi0gICJ0b2MiLAotICAiY2lyIiwKLSAgInR0ciIsCi0gICJ2bXUiLAotICAidm1sIiwKLSAgImljciIsCi0gICJ0Y3B1IiwKLSAgImNwdWlkIiwKLSAgInRpZCIsCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQwW10gPSB7Ci0gIHswLDAscnJyLFYsUyxTfSwJLyogbW92ICovCi0gIHswLDAscnJyLFMsUyxWfSwJLyogbW92ICovCi0gIHsxLDEscnJyLFYsVixWfSwJLyogbWVyZy50ICovCi0gIHsyLDEscnJyLFYsVixWfSwJLyogbWFzay50ICovCi0gIHsxLDIscnJyLFYsUyxWfSwJLyogbWVyZy5mICovCi0gIHsyLDIscnJyLFYsUyxWfSwJLyogbWFzay5mICovCi0gIHsxLDEscnJyLFYsUyxWfSwJLyogbWVyZy50ICovCi0gIHsyLDEscnJyLFYsUyxWfSwJLyogbWFzay50ICovCi0gIHszLDMscnJyLFYsVixWfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycnIsVixWLFZ9LAkvKiBtdWwuZCAqLwotICB7NCwzLHJycixWLFYsVn0sCS8qIGRpdi5zICovCi0gIHs0LDQscnJyLFYsVixWfSwJLyogZGl2LmQgKi8KLSAgezMsMyxycnIsVixTLFZ9LAkvKiBtdWwucyAqLwotICB7Myw0LHJycixWLFMsVn0sCS8qIG11bC5kICovCi0gIHs0LDMscnJyLFYsUyxWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsVixTLFZ9LAkvKiBkaXYuZCAqLwotICB7NSwwLHJycixWLFYsVn0sCS8qIGFuZCAqLwotICB7NiwwLHJycixWLFYsVn0sCS8qIG9yICovCi0gIHs3LDAscnJyLFYsVixWfSwJLyogeG9yICovCi0gIHs4LDAscnJyLFYsVixWfSwJLyogc2hmICovCi0gIHs1LDAscnJyLFYsUyxWfSwJLyogYW5kICovCi0gIHs2LDAscnJyLFYsUyxWfSwJLyogb3IgKi8KLSAgezcsMCxycnIsVixTLFZ9LAkvKiB4b3IgKi8KLSAgezgsMCxycnIsVixTLFZ9LAkvKiBzaGYgKi8KLSAgezksMyxycnIsVixWLFZ9LAkvKiBhZGQucyAqLwotICB7OSw0LHJycixWLFYsVn0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJycixWLFYsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixWLFYsVn0sCS8qIHN1Yi5kICovCi0gIHs5LDMscnJyLFYsUyxWfSwJLyogYWRkLnMgKi8KLSAgezksNCxycnIsVixTLFZ9LAkvKiBhZGQuZCAqLwotICB7MTAsMyxycnIsVixTLFZ9LAkvKiBzdWIucyAqLwotICB7MTAsNCxycnIsVixTLFZ9LAkvKiBzdWIuZCAqLwotICB7OSw1LHJycixWLFYsVn0sCS8qIGFkZC5iICovCi0gIHs5LDYscnJyLFYsVixWfSwJLyogYWRkLmggKi8KLSAgezksNyxycnIsVixWLFZ9LAkvKiBhZGQudyAqLwotICB7OSw4LHJycixWLFYsVn0sCS8qIGFkZC5sICovCi0gIHs5LDUscnJyLFYsUyxWfSwJLyogYWRkLmIgKi8KLSAgezksNixycnIsVixTLFZ9LAkvKiBhZGQuaCAqLwotICB7OSw3LHJycixWLFMsVn0sCS8qIGFkZC53ICovCi0gIHs5LDgscnJyLFYsUyxWfSwJLyogYWRkLmwgKi8KLSAgezEwLDUscnJyLFYsVixWfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnJyLFYsVixWfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnJyLFYsVixWfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnJyLFYsVixWfSwJLyogc3ViLmwgKi8KLSAgezEwLDUscnJyLFYsUyxWfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnJyLFYsUyxWfSwJLyogc3ViLmggKi8KLSAgezEwLDcscnJyLFYsUyxWfSwJLyogc3ViLncgKi8KLSAgezEwLDgscnJyLFYsUyxWfSwJLyogc3ViLmwgKi8KLSAgezMsNSxycnIsVixWLFZ9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJycixWLFYsVn0sCS8qIG11bC5oICovCi0gIHszLDcscnJyLFYsVixWfSwJLyogbXVsLncgKi8KLSAgezMsOCxycnIsVixWLFZ9LAkvKiBtdWwubCAqLwotICB7Myw1LHJycixWLFMsVn0sCS8qIG11bC5iICovCi0gIHszLDYscnJyLFYsUyxWfSwJLyogbXVsLmggKi8KLSAgezMsNyxycnIsVixTLFZ9LAkvKiBtdWwudyAqLwotICB7Myw4LHJycixWLFMsVn0sCS8qIG11bC5sICovCi0gIHs0LDUscnJyLFYsVixWfSwJLyogZGl2LmIgKi8KLSAgezQsNixycnIsVixWLFZ9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJycixWLFYsVn0sCS8qIGRpdi53ICovCi0gIHs0LDgscnJyLFYsVixWfSwJLyogZGl2LmwgKi8KLSAgezQsNSxycnIsVixTLFZ9LAkvKiBkaXYuYiAqLwotICB7NCw2LHJycixWLFMsVn0sCS8qIGRpdi5oICovCi0gIHs0LDcscnJyLFYsUyxWfSwJLyogZGl2LncgKi8KLSAgezQsOCxycnIsVixTLFZ9LAkvKiBkaXYubCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MVtdID0gewotICB7MTEsMCx4eHgsMCwwLDB9LAkvKiBleGl0ICovCi0gIHsxMiwwLGEzLDAsMCwwfSwJLyogam1wICovCi0gIHsxMywyLGEzLDAsMCwwfSwJLyogam1waS5mICovCi0gIHsxMywxLGEzLDAsMCwwfSwJLyogam1waS50ICovCi0gIHsxNCwyLGEzLDAsMCwwfSwJLyogam1wYS5mICovCi0gIHsxNCwxLGEzLDAsMCwwfSwJLyogam1wYS50ICovCi0gIHsxNSwyLGEzLDAsMCwwfSwJLyogam1wcy5mICovCi0gIHsxNSwxLGEzLDAsMCwwfSwJLyogam1wcy50ICovCi0gIHsxNiwwLGEzLDAsMCwwfSwJLyogdGFjICovCi0gIHsxNywwLGExcixBLDAsMH0sCS8qIGxkZWEgKi8KLSAgezE4LDgsYTFsLFZMUywwLDB9LAkvKiBsZC5sICovCi0gIHsxOCw5LGExbCxWTSwwLDB9LAkvKiBsZC54ICovCi0gIHsxOSwwLGEzLDAsMCwwfSwJLyogdGFzICovCi0gIHsyMCwwLGEzLDAsMCwwfSwJLyogcHNoZWEgKi8KLSAgezIxLDgsYTJsLFZMUywwLDB9LAkvKiBzdC5sICovCi0gIHsyMSw5LGEybCxWTSwwLDB9LAkvKiBzdC54ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyMiwwLGEzLDAsMCwwfSwJLyogY2FsbCAqLwotICB7MjMsMCxhMywwLDAsMH0sCS8qIGNhbGxzICovCi0gIHsyNCwwLGEzLDAsMCwwfSwJLyogY2FsbHEgKi8KLSAgezI1LDAsYTFyLEEsMCwwfSwJLyogcGZvcmsgKi8KLSAgezI2LDUsYTJyLFMsMCwwfSwJLyogc3RlLmIgKi8KLSAgezI2LDYsYTJyLFMsMCwwfSwJLyogc3RlLmggKi8KLSAgezI2LDcsYTJyLFMsMCwwfSwJLyogc3RlLncgKi8KLSAgezI2LDgsYTJyLFMsMCwwfSwJLyogc3RlLmwgKi8KLSAgezE4LDUsYTFyLEEsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsQSwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezI3LDcsYTFyLEEsMCwwfSwJLyogaW5jci53ICovCi0gIHsyMSw1LGEycixBLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLEEsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsQSwwLDB9LAkvKiBzdC53ICovCi0gIHsyNyw4LGExcixTLDAsMH0sCS8qIGluY3IubCAqLwotICB7MTgsNSxhMXIsUywwLDB9LAkvKiBsZC5iICovCi0gIHsxOCw2LGExcixTLDAsMH0sCS8qIGxkLmggKi8KLSAgezE4LDcsYTFyLFMsMCwwfSwJLyogbGQudyAqLwotICB7MTgsOCxhMXIsUywwLDB9LAkvKiBsZC5sICovCi0gIHsyMSw1LGEycixTLDAsMH0sCS8qIHN0LmIgKi8KLSAgezIxLDYsYTJyLFMsMCwwfSwJLyogc3QuaCAqLwotICB7MjEsNyxhMnIsUywwLDB9LAkvKiBzdC53ICovCi0gIHsyMSw4LGEycixTLDAsMH0sCS8qIHN0LmwgKi8KLSAgezE4LDUsYTFyLFYsMCwwfSwJLyogbGQuYiAqLwotICB7MTgsNixhMXIsViwwLDB9LAkvKiBsZC5oICovCi0gIHsxOCw3LGExcixWLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDgsYTFyLFYsMCwwfSwJLyogbGQubCAqLwotICB7MjEsNSxhMnIsViwwLDB9LAkvKiBzdC5iICovCi0gIHsyMSw2LGEycixWLDAsMH0sCS8qIHN0LmggKi8KLSAgezIxLDcsYTJyLFYsMCwwfSwJLyogc3QudyAqLwotICB7MjEsOCxhMnIsViwwLDB9LAkvKiBzdC5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQyW10gPSB7Ci0gIHsyOCw1LHJyLEEsQSwwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLEEsQSwwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLEEsQSwwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLEEsQSwwfSwJLyogY3Z0aC53ICovCi0gIHsyOCw1LHJyLFMsUywwfSwJLyogY3Z0dy5iICovCi0gIHsyOCw2LHJyLFMsUywwfSwJLyogY3Z0dy5oICovCi0gIHsyOSw3LHJyLFMsUywwfSwJLyogY3Z0Yi53ICovCi0gIHszMCw3LHJyLFMsUywwfSwJLyogY3Z0aC53ICovCi0gIHsyOCwzLHJyLFMsUywwfSwJLyogY3Z0dy5zICovCi0gIHszMSw3LHJyLFMsUywwfSwJLyogY3Z0cy53ICovCi0gIHszMiwzLHJyLFMsUywwfSwJLyogY3Z0ZC5zICovCi0gIHszMSw0LHJyLFMsUywwfSwJLyogY3Z0cy5kICovCi0gIHszMSw4LHJyLFMsUywwfSwJLyogY3Z0cy5sICovCi0gIHszMiw4LHJyLFMsUywwfSwJLyogY3Z0ZC5sICovCi0gIHszMywzLHJyLFMsUywwfSwJLyogY3Z0bC5zICovCi0gIHszMyw0LHJyLFMsUywwfSwJLyogY3Z0bC5kICovCi0gIHszNCwwLHJyLEEsQSwwfSwJLyogbGRwYSAqLwotICB7OCwwLG5yLEEsMCwwfSwJLyogc2hmICovCi0gIHsxOCw2LG5yLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxucixBLDAsMH0sCS8qIGxkLncgKi8KLSAgezMzLDcscnIsUyxTLDB9LAkvKiBjdnRsLncgKi8KLSAgezI4LDgscnIsUyxTLDB9LAkvKiBjdnR3LmwgKi8KLSAgezM1LDEscnIsUyxTLDB9LAkvKiBwbGMudCAqLwotICB7MzYsMCxycixTLFMsMH0sCS8qIHR6YyAqLwotICB7MzcsNixycixBLEEsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsQSxBLDB9LAkvKiBlcS53ICovCi0gIHszNyw2LG5yLEEsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxucixBLDAsMH0sCS8qIGVxLncgKi8KLSAgezM3LDUscnIsUyxTLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFMsUywwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixTLFMsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsUyxTLDB9LAkvKiBlcS5sICovCi0gIHszOCw2LHJyLEEsQSwwfSwJLyogbGV1LmggKi8KLSAgezM4LDcscnIsQSxBLDB9LAkvKiBsZXUudyAqLwotICB7MzgsNixucixBLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LG5yLEEsMCwwfSwJLyogbGV1LncgKi8KLSAgezM4LDUscnIsUyxTLDB9LAkvKiBsZXUuYiAqLwotICB7MzgsNixycixTLFMsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LHJyLFMsUywwfSwJLyogbGV1LncgKi8KLSAgezM4LDgscnIsUyxTLDB9LAkvKiBsZXUubCAqLwotICB7MzksNixycixBLEEsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LHJyLEEsQSwwfSwJLyogbHR1LncgKi8KLSAgezM5LDYsbnIsQSwwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxucixBLDAsMH0sCS8qIGx0dS53ICovCi0gIHszOSw1LHJyLFMsUywwfSwJLyogbHR1LmIgKi8KLSAgezM5LDYscnIsUyxTLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxycixTLFMsMH0sCS8qIGx0dS53ICovCi0gIHszOSw4LHJyLFMsUywwfSwJLyogbHR1LmwgKi8KLSAgezQwLDYscnIsQSxBLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLEEsQSwwfSwJLyogbGUudyAqLwotICB7NDAsNixucixBLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsbnIsQSwwLDB9LAkvKiBsZS53ICovCi0gIHs0MCw1LHJyLFMsUywwfSwJLyogbGUuYiAqLwotICB7NDAsNixycixTLFMsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcscnIsUyxTLDB9LAkvKiBsZS53ICovCi0gIHs0MCw4LHJyLFMsUywwfSwJLyogbGUubCAqLwotICB7NDEsNixycixBLEEsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsQSxBLDB9LAkvKiBsdC53ICovCi0gIHs0MSw2LG5yLEEsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxucixBLDAsMH0sCS8qIGx0LncgKi8KLSAgezQxLDUscnIsUyxTLDB9LAkvKiBsdC5iICovCi0gIHs0MSw2LHJyLFMsUywwfSwJLyogbHQuaCAqLwotICB7NDEsNyxycixTLFMsMH0sCS8qIGx0LncgKi8KLSAgezQxLDgscnIsUyxTLDB9LAkvKiBsdC5sICovCi0gIHs5LDcscnIsUyxBLDB9LAkvKiBhZGQudyAqLwotICB7OCwwLHJyLEEsQSwwfSwJLyogc2hmICovCi0gIHswLDAscnIsQSxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxycixTLEEsMH0sCS8qIG1vdiAqLwotICB7MCw3LHJyLFMsUywwfSwJLyogbW92LncgKi8KLSAgezgsMCxycixTLFMsMH0sCS8qIHNoZiAqLwotICB7MCwwLHJyLFMsUywwfSwJLyogbW92ICovCi0gIHswLDAscnIsQSxTLDB9LAkvKiBtb3YgKi8KLSAgezUsMCxycixBLEEsMH0sCS8qIGFuZCAqLwotICB7NiwwLHJyLEEsQSwwfSwJLyogb3IgKi8KLSAgezcsMCxycixBLEEsMH0sCS8qIHhvciAqLwotICB7NDIsMCxycixBLEEsMH0sCS8qIG5vdCAqLwotICB7NSwwLHJyLFMsUywwfSwJLyogYW5kICovCi0gIHs2LDAscnIsUyxTLDB9LAkvKiBvciAqLwotICB7NywwLHJyLFMsUywwfSwJLyogeG9yICovCi0gIHs0MiwwLHJyLFMsUywwfSwJLyogbm90ICovCi0gIHs0MCwzLHJyLFMsUywwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixTLFMsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsUyxTLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFMsUywwfSwJLyogbHQuZCAqLwotICB7OSwzLHJyLFMsUywwfSwJLyogYWRkLnMgKi8KLSAgezksNCxycixTLFMsMH0sCS8qIGFkZC5kICovCi0gIHsxMCwzLHJyLFMsUywwfSwJLyogc3ViLnMgKi8KLSAgezEwLDQscnIsUyxTLDB9LAkvKiBzdWIuZCAqLwotICB7MzcsMyxycixTLFMsMH0sCS8qIGVxLnMgKi8KLSAgezM3LDQscnIsUyxTLDB9LAkvKiBlcS5kICovCi0gIHs0Myw2LHJyLEEsQSwwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsQSxBLDB9LAkvKiBuZWcudyAqLwotICB7MywzLHJyLFMsUywwfSwJLyogbXVsLnMgKi8KLSAgezMsNCxycixTLFMsMH0sCS8qIG11bC5kICovCi0gIHs0LDMscnIsUyxTLDB9LAkvKiBkaXYucyAqLwotICB7NCw0LHJyLFMsUywwfSwJLyogZGl2LmQgKi8KLSAgezksNixycixBLEEsMH0sCS8qIGFkZC5oICovCi0gIHs5LDcscnIsQSxBLDB9LAkvKiBhZGQudyAqLwotICB7OSw2LG5yLEEsMCwwfSwJLyogYWRkLmggKi8KLSAgezksNyxucixBLDAsMH0sCS8qIGFkZC53ICovCi0gIHs5LDUscnIsUyxTLDB9LAkvKiBhZGQuYiAqLwotICB7OSw2LHJyLFMsUywwfSwJLyogYWRkLmggKi8KLSAgezksNyxycixTLFMsMH0sCS8qIGFkZC53ICovCi0gIHs5LDgscnIsUyxTLDB9LAkvKiBhZGQubCAqLwotICB7MTAsNixycixBLEEsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LHJyLEEsQSwwfSwJLyogc3ViLncgKi8KLSAgezEwLDYsbnIsQSwwLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxucixBLDAsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw1LHJyLFMsUywwfSwJLyogc3ViLmIgKi8KLSAgezEwLDYscnIsUyxTLDB9LAkvKiBzdWIuaCAqLwotICB7MTAsNyxycixTLFMsMH0sCS8qIHN1Yi53ICovCi0gIHsxMCw4LHJyLFMsUywwfSwJLyogc3ViLmwgKi8KLSAgezMsNixycixBLEEsMH0sCS8qIG11bC5oICovCi0gIHszLDcscnIsQSxBLDB9LAkvKiBtdWwudyAqLwotICB7Myw2LG5yLEEsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxucixBLDAsMH0sCS8qIG11bC53ICovCi0gIHszLDUscnIsUyxTLDB9LAkvKiBtdWwuYiAqLwotICB7Myw2LHJyLFMsUywwfSwJLyogbXVsLmggKi8KLSAgezMsNyxycixTLFMsMH0sCS8qIG11bC53ICovCi0gIHszLDgscnIsUyxTLDB9LAkvKiBtdWwubCAqLwotICB7NCw2LHJyLEEsQSwwfSwJLyogZGl2LmggKi8KLSAgezQsNyxycixBLEEsMH0sCS8qIGRpdi53ICovCi0gIHs0LDYsbnIsQSwwLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LG5yLEEsMCwwfSwJLyogZGl2LncgKi8KLSAgezQsNSxycixTLFMsMH0sCS8qIGRpdi5iICovCi0gIHs0LDYscnIsUyxTLDB9LAkvKiBkaXYuaCAqLwotICB7NCw3LHJyLFMsUywwfSwJLyogZGl2LncgKi8KLSAgezQsOCxycixTLFMsMH0sCS8qIGRpdi5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQzW10gPSB7Ci0gIHszMiwzLHJyLFYsViwwfSwJLyogY3Z0ZC5zICovCi0gIHszMSw0LHJyLFYsViwwfSwJLyogY3Z0cy5kICovCi0gIHszMyw0LHJyLFYsViwwfSwJLyogY3Z0bC5kICovCi0gIHszMiw4LHJyLFYsViwwfSwJLyogY3Z0ZC5sICovCi0gIHswLDAscnJsLFMsUyxWTX0sCS8qIG1vdiAqLwotICB7MCwwLHJscixTLFZNLFN9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezQ0LDAscnIsUyxTLDB9LAkvKiBsb3AgKi8KLSAgezM2LDAscnIsVixWLDB9LAkvKiB0emMgKi8KLSAgezQ0LDAscnIsVixWLDB9LAkvKiBsb3AgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezQyLDAscnIsVixWLDB9LAkvKiBub3QgKi8KLSAgezgsMCxycixTLFYsMH0sCS8qIHNoZiAqLwotICB7MzUsMSxycixWLFYsMH0sCS8qIHBsYy50ICovCi0gIHs0NSwyLHJyLFYsViwwfSwJLyogY3Bycy5mICovCi0gIHs0NSwxLHJyLFYsViwwfSwJLyogY3Bycy50ICovCi0gIHszNywzLHJyLFYsViwwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixWLFYsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDMscnIsVixWLDB9LAkvKiBuZWcucyAqLwotICB7NDMsNCxycixWLFYsMH0sCS8qIG5lZy5kICovCi0gIHszNywzLHJyLFMsViwwfSwJLyogZXEucyAqLwotICB7MzcsNCxycixTLFYsMH0sCS8qIGVxLmQgKi8KLSAgezQzLDMscnIsUyxTLDB9LAkvKiBuZWcucyAqLwotICB7NDMsNCxycixTLFMsMH0sCS8qIG5lZy5kICovCi0gIHs0MCwzLHJyLFYsViwwfSwJLyogbGUucyAqLwotICB7NDAsNCxycixWLFYsMH0sCS8qIGxlLmQgKi8KLSAgezQxLDMscnIsVixWLDB9LAkvKiBsdC5zICovCi0gIHs0MSw0LHJyLFYsViwwfSwJLyogbHQuZCAqLwotICB7NDAsMyxycixTLFYsMH0sCS8qIGxlLnMgKi8KLSAgezQwLDQscnIsUyxWLDB9LAkvKiBsZS5kICovCi0gIHs0MSwzLHJyLFMsViwwfSwJLyogbHQucyAqLwotICB7NDEsNCxycixTLFYsMH0sCS8qIGx0LmQgKi8KLSAgezM3LDUscnIsVixWLDB9LAkvKiBlcS5iICovCi0gIHszNyw2LHJyLFYsViwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxycixWLFYsMH0sCS8qIGVxLncgKi8KLSAgezM3LDgscnIsVixWLDB9LAkvKiBlcS5sICovCi0gIHszNyw1LHJyLFMsViwwfSwJLyogZXEuYiAqLwotICB7MzcsNixycixTLFYsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcscnIsUyxWLDB9LAkvKiBlcS53ICovCi0gIHszNyw4LHJyLFMsViwwfSwJLyogZXEubCAqLwotICB7NDAsNSxycixWLFYsMH0sCS8qIGxlLmIgKi8KLSAgezQwLDYscnIsVixWLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LHJyLFYsViwwfSwJLyogbGUudyAqLwotICB7NDAsOCxycixWLFYsMH0sCS8qIGxlLmwgKi8KLSAgezQwLDUscnIsUyxWLDB9LAkvKiBsZS5iICovCi0gIHs0MCw2LHJyLFMsViwwfSwJLyogbGUuaCAqLwotICB7NDAsNyxycixTLFYsMH0sCS8qIGxlLncgKi8KLSAgezQwLDgscnIsUyxWLDB9LAkvKiBsZS5sICovCi0gIHs0MSw1LHJyLFYsViwwfSwJLyogbHQuYiAqLwotICB7NDEsNixycixWLFYsMH0sCS8qIGx0LmggKi8KLSAgezQxLDcscnIsVixWLDB9LAkvKiBsdC53ICovCi0gIHs0MSw4LHJyLFYsViwwfSwJLyogbHQubCAqLwotICB7NDEsNSxycixTLFYsMH0sCS8qIGx0LmIgKi8KLSAgezQxLDYscnIsUyxWLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LHJyLFMsViwwfSwJLyogbHQudyAqLwotICB7NDEsOCxycixTLFYsMH0sCS8qIGx0LmwgKi8KLSAgezQzLDUscnIsVixWLDB9LAkvKiBuZWcuYiAqLwotICB7NDMsNixycixWLFYsMH0sCS8qIG5lZy5oICovCi0gIHs0Myw3LHJyLFYsViwwfSwJLyogbmVnLncgKi8KLSAgezQzLDgscnIsVixWLDB9LAkvKiBuZWcubCAqLwotICB7NDMsNSxycixTLFMsMH0sCS8qIG5lZy5iICovCi0gIHs0Myw2LHJyLFMsUywwfSwJLyogbmVnLmggKi8KLSAgezQzLDcscnIsUyxTLDB9LAkvKiBuZWcudyAqLwotICB7NDMsOCxycixTLFMsMH0sCS8qIG5lZy5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ0W10gPSB7Ci0gIHs0NiwwLG5vcHMsMCwwLDB9LAkvKiBub3AgKi8KLSAgezQ3LDAscGNyZWwsMCwwLDB9LAkvKiBiciAqLwotICB7NDgsMixwY3JlbCwwLDAsMH0sCS8qIGJyaS5mICovCi0gIHs0OCwxLHBjcmVsLDAsMCwwfSwJLyogYnJpLnQgKi8KLSAgezQ5LDIscGNyZWwsMCwwLDB9LAkvKiBicmEuZiAqLwotICB7NDksMSxwY3JlbCwwLDAsMH0sCS8qIGJyYS50ICovCi0gIHs1MCwyLHBjcmVsLDAsMCwwfSwJLyogYnJzLmYgKi8KLSAgezUwLDEscGNyZWwsMCwwLDB9LAkvKiBicnMudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0NVtdID0gewotICB7NTEsNSxycixWLFYsMH0sCS8qIGxkdmkuYiAqLwotICB7NTEsNixycixWLFYsMH0sCS8qIGxkdmkuaCAqLwotICB7NTEsNyxycixWLFYsMH0sCS8qIGxkdmkudyAqLwotICB7NTEsOCxycixWLFYsMH0sCS8qIGxkdmkubCAqLwotICB7MjgsMyxycixWLFYsMH0sCS8qIGN2dHcucyAqLwotICB7MzEsNyxycixWLFYsMH0sCS8qIGN2dHMudyAqLwotICB7MjgsOCxycixWLFYsMH0sCS8qIGN2dHcubCAqLwotICB7MzMsNyxycixWLFYsMH0sCS8qIGN2dGwudyAqLwotICB7NTIsNSxyeHIsVixWLDB9LAkvKiBzdHZpLmIgKi8KLSAgezUyLDYscnhyLFYsViwwfSwJLyogc3R2aS5oICovCi0gIHs1Miw3LHJ4cixWLFYsMH0sCS8qIHN0dmkudyAqLwotICB7NTIsOCxyeHIsVixWLDB9LAkvKiBzdHZpLmwgKi8KLSAgezUyLDUscnhyLFMsViwwfSwJLyogc3R2aS5iICovCi0gIHs1Miw2LHJ4cixTLFYsMH0sCS8qIHN0dmkuaCAqLwotICB7NTIsNyxyeHIsUyxWLDB9LAkvKiBzdHZpLncgKi8KLSAgezUyLDgscnhyLFMsViwwfSwJLyogc3R2aS5sICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBmb3JtYXQ2W10gPSB7Ci0gIHs1MywwLHIsQSwwLDB9LAkvKiBsZHNkciAqLwotICB7NTQsMCxyLEEsMCwwfSwJLyogbGRrZHIgKi8KLSAgezU1LDMscixTLDAsMH0sCS8qIGxuLnMgKi8KLSAgezU1LDQscixTLDAsMH0sCS8qIGxuLmQgKi8KLSAgezU2LDAsbm9wcywwLDAsMH0sCS8qIHBhdHUgKi8KLSAgezU3LDAscixBLDAsMH0sCS8qIHBhdGUgKi8KLSAgezU4LDAsbm9wcywwLDAsMH0sCS8qIHBpY2ggKi8KLSAgezU5LDAsbm9wcywwLDAsMH0sCS8qIHBsY2ggKi8KLSAgezAsMCxscixQU1csQSwwfSwJLyogbW92ICovCi0gIHswLDAscnhsLEEsUFNXLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixQQyxBLDB9LAkvKiBtb3YgKi8KLSAgezYwLDAscixTLDAsMH0sCS8qIGlkbGUgKi8KLSAgezAsMCxscixJVFIsUywwfSwJLyogbW92ICovCi0gIHswLDAscnhsLFMsSVRSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCxyeGwsUyxJVFNSLDB9LAkvKiBtb3YgKi8KLSAgezYxLDAsbm9wcywwLDAsMH0sCS8qIHJ0bnEgKi8KLSAgezYyLDAsbm9wcywwLDAsMH0sCS8qIGNmb3JrICovCi0gIHs2MywwLG5vcHMsMCwwLDB9LAkvKiBydG4gKi8KLSAgezY0LDAsbm9wcywwLDAsMH0sCS8qIHdmb3JrICovCi0gIHs2NSwwLG5vcHMsMCwwLDB9LAkvKiBqb2luICovCi0gIHs2NiwwLG5vcHMsMCwwLDB9LAkvKiBydG5jICovCi0gIHs2NywzLHIsUywwLDB9LAkvKiBleHAucyAqLwotICB7NjcsNCxyLFMsMCwwfSwJLyogZXhwLmQgKi8KLSAgezY4LDMscixTLDAsMH0sCS8qIHNpbi5zICovCi0gIHs2OCw0LHIsUywwLDB9LAkvKiBzaW4uZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NjksMyxyLFMsMCwwfSwJLyogY29zLnMgKi8KLSAgezY5LDQscixTLDAsMH0sCS8qIGNvcy5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs3MCw3LHIsQSwwLDB9LAkvKiBwc2gudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7NzEsNyxyLEEsMCwwfSwJLyogcG9wLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezcwLDcscixTLDAsMH0sCS8qIHBzaC53ICovCi0gIHs3MCw4LHIsUywwLDB9LAkvKiBwc2gubCAqLwotICB7NzEsNyxyLFMsMCwwfSwJLyogcG9wLncgKi8KLSAgezcxLDgscixTLDAsMH0sCS8qIHBvcC5sICovCi0gIHs3MiwwLG5vcHMsMCwwLDB9LAkvKiBlbmkgKi8KLSAgezczLDAsbm9wcywwLDAsMH0sCS8qIGRzaSAqLwotICB7NzQsMCxub3BzLDAsMCwwfSwJLyogYmtwdCAqLwotICB7NzUsMCxub3BzLDAsMCwwfSwJLyogbXN5bmMgKi8KLSAgezc2LDAscixTLDAsMH0sCS8qIG1za2kgKi8KLSAgezc3LDAscixTLDAsMH0sCS8qIHhtdGkgKi8KLSAgezAsMCxyeGwsUyxWViwwfSwJLyogbW92ICovCi0gIHs3OCwwLG5vcHMsMCwwLDB9LAkvKiB0c3R2diAqLwotICB7MCwwLGxyLFZTLEEsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxBLFZTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixWTCxBLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsQSxWTCwwfSwJLyogbW92ICovCi0gIHswLDcsbHIsVlMsUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxyeGwsUyxWUywwfSwJLyogbW92LncgKi8KLSAgezAsNyxscixWTCxTLDB9LAkvKiBtb3YudyAqLwotICB7MCw3LHJ4bCxTLFZMLDB9LAkvKiBtb3YudyAqLwotICB7NzksMCxyLEEsMCwwfSwJLyogZGlhZyAqLwotICB7ODAsMCxub3BzLDAsMCwwfSwJLyogcGJrcHQgKi8KLSAgezgxLDMscixTLDAsMH0sCS8qIHNxcnQucyAqLwotICB7ODEsNCxyLFMsMCwwfSwJLyogc3FydC5kICovCi0gIHs4MiwwLG5vcHMsMCwwLDB9LAkvKiBjYXNyICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MywzLHIsUywwLDB9LAkvKiBhdGFuLnMgKi8KLSAgezgzLDQscixTLDAsMH0sCS8qIGF0YW4uZCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0N1tdID0gewotICB7ODQsNSxyLFYsMCwwfSwJLyogc3VtLmIgKi8KLSAgezg0LDYscixWLDAsMH0sCS8qIHN1bS5oICovCi0gIHs4NCw3LHIsViwwLDB9LAkvKiBzdW0udyAqLwotICB7ODQsOCxyLFYsMCwwfSwJLyogc3VtLmwgKi8KLSAgezg1LDAscixWLDAsMH0sCS8qIGFsbCAqLwotICB7ODYsMCxyLFYsMCwwfSwJLyogYW55ICovCi0gIHs4NywwLHIsViwwLDB9LAkvKiBwYXJpdHkgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDUscixWLDAsMH0sCS8qIG1heC5iICovCi0gIHs4OCw2LHIsViwwLDB9LAkvKiBtYXguaCAqLwotICB7ODgsNyxyLFYsMCwwfSwJLyogbWF4LncgKi8KLSAgezg4LDgscixWLDAsMH0sCS8qIG1heC5sICovCi0gIHs4OSw1LHIsViwwLDB9LAkvKiBtaW4uYiAqLwotICB7ODksNixyLFYsMCwwfSwJLyogbWluLmggKi8KLSAgezg5LDcscixWLDAsMH0sCS8qIG1pbi53ICovCi0gIHs4OSw4LHIsViwwLDB9LAkvKiBtaW4ubCAqLwotICB7ODQsMyxyLFYsMCwwfSwJLyogc3VtLnMgKi8KLSAgezg0LDQscixWLDAsMH0sCS8qIHN1bS5kICovCi0gIHs5MCwzLHIsViwwLDB9LAkvKiBwcm9kLnMgKi8KLSAgezkwLDQscixWLDAsMH0sCS8qIHByb2QuZCAqLwotICB7ODgsMyxyLFYsMCwwfSwJLyogbWF4LnMgKi8KLSAgezg4LDQscixWLDAsMH0sCS8qIG1heC5kICovCi0gIHs4OSwzLHIsViwwLDB9LAkvKiBtaW4ucyAqLwotICB7ODksNCxyLFYsMCwwfSwJLyogbWluLmQgKi8KLSAgezkwLDUscixWLDAsMH0sCS8qIHByb2QuYiAqLwotICB7OTAsNixyLFYsMCwwfSwJLyogcHJvZC5oICovCi0gIHs5MCw3LHIsViwwLDB9LAkvKiBwcm9kLncgKi8KLSAgezkwLDgscixWLDAsMH0sCS8qIHByb2QubCAqLwotICB7MzUsMixscixWTSxTLDB9LAkvKiBwbGMuZiAqLwotICB7MzUsMSxscixWTSxTLDB9LAkvKiBwbGMudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0eFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZm9ybWF0MWFbXSA9IHsKLSAgezkxLDAsaW1yLEEsMCwwfSwJLyogaGFsdCAqLwotICB7OTIsMCxhNCwwLDAsMH0sCS8qIHN5c2MgKi8KLSAgezE4LDYsaW1yLEEsMCwwfSwJLyogbGQuaCAqLwotICB7MTgsNyxpbXIsQSwwLDB9LAkvKiBsZC53ICovCi0gIHs1LDAsaW1yLEEsMCwwfSwJLyogYW5kICovCi0gIHs2LDAsaW1yLEEsMCwwfSwJLyogb3IgKi8KLSAgezcsMCxpbXIsQSwwLDB9LAkvKiB4b3IgKi8KLSAgezgsMCxpbXIsQSwwLDB9LAkvKiBzaGYgKi8KLSAgezksNixpbXIsQSwwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LGltcixBLDAsMH0sCS8qIGFkZC53ICovCi0gIHsxMCw2LGltcixBLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LGltcixBLDAsMH0sCS8qIHN1Yi53ICovCi0gIHszLDYsaW1yLEEsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxpbXIsQSwwLDB9LAkvKiBtdWwudyAqLwotICB7NCw2LGltcixBLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsaW1yLEEsMCwwfSwJLyogZGl2LncgKi8KLSAgezE4LDcsaW1sLFZMLDAsMH0sCS8qIGxkLncgKi8KLSAgezE4LDcsaW1sLFZTLDAsMH0sCS8qIGxkLncgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezgsNyxpbXIsUywwLDB9LAkvKiBzaGYudyAqLwotICB7OTMsMCxhNSwwLDAsMH0sCS8qIHRyYXAgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDYsaW1yLEEsMCwwfSwJLyogZXEuaCAqLwotICB7MzcsNyxpbXIsQSwwLDB9LAkvKiBlcS53ICovCi0gIHszOCw2LGltcixBLDAsMH0sCS8qIGxldS5oICovCi0gIHszOCw3LGltcixBLDAsMH0sCS8qIGxldS53ICovCi0gIHszOSw2LGltcixBLDAsMH0sCS8qIGx0dS5oICovCi0gIHszOSw3LGltcixBLDAsMH0sCS8qIGx0dS53ICovCi0gIHs0MCw2LGltcixBLDAsMH0sCS8qIGxlLmggKi8KLSAgezQwLDcsaW1yLEEsMCwwfSwJLyogbGUudyAqLwotICB7NDEsNixpbXIsQSwwLDB9LAkvKiBsdC5oICovCi0gIHs0MSw3LGltcixBLDAsMH0sCS8qIGx0LncgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGZvcm1hdDFiW10gPSB7Ci0gIHsxOCw0LGltcixTLDAsMH0sCS8qIGxkLmQgKi8KLSAgezE4LDEwLGltcixTLDAsMH0sCS8qIGxkLnUgKi8KLSAgezE4LDgsaW1yLFMsMCwwfSwJLyogbGQubCAqLwotICB7MTgsNyxpbXIsUywwLDB9LAkvKiBsZC53ICovCi0gIHs1LDAsaW1yLFMsMCwwfSwJLyogYW5kICovCi0gIHs2LDAsaW1yLFMsMCwwfSwJLyogb3IgKi8KLSAgezcsMCxpbXIsUywwLDB9LAkvKiB4b3IgKi8KLSAgezgsMCxpbXIsUywwLDB9LAkvKiBzaGYgKi8KLSAgezksNixpbXIsUywwLDB9LAkvKiBhZGQuaCAqLwotICB7OSw3LGltcixTLDAsMH0sCS8qIGFkZC53ICovCi0gIHsxMCw2LGltcixTLDAsMH0sCS8qIHN1Yi5oICovCi0gIHsxMCw3LGltcixTLDAsMH0sCS8qIHN1Yi53ICovCi0gIHszLDYsaW1yLFMsMCwwfSwJLyogbXVsLmggKi8KLSAgezMsNyxpbXIsUywwLDB9LAkvKiBtdWwudyAqLwotICB7NCw2LGltcixTLDAsMH0sCS8qIGRpdi5oICovCi0gIHs0LDcsaW1yLFMsMCwwfSwJLyogZGl2LncgKi8KLSAgezksMyxpbXIsUywwLDB9LAkvKiBhZGQucyAqLwotICB7MTAsMyxpbXIsUywwLDB9LAkvKiBzdWIucyAqLwotICB7MywzLGltcixTLDAsMH0sCS8qIG11bC5zICovCi0gIHs0LDMsaW1yLFMsMCwwfSwJLyogZGl2LnMgKi8KLSAgezQwLDMsaW1yLFMsMCwwfSwJLyogbGUucyAqLwotICB7NDEsMyxpbXIsUywwLDB9LAkvKiBsdC5zICovCi0gIHszNyw2LGltcixTLDAsMH0sCS8qIGVxLmggKi8KLSAgezM3LDcsaW1yLFMsMCwwfSwJLyogZXEudyAqLwotICB7MzgsNixpbXIsUywwLDB9LAkvKiBsZXUuaCAqLwotICB7MzgsNyxpbXIsUywwLDB9LAkvKiBsZXUudyAqLwotICB7MzksNixpbXIsUywwLDB9LAkvKiBsdHUuaCAqLwotICB7MzksNyxpbXIsUywwLDB9LAkvKiBsdHUudyAqLwotICB7NDAsNixpbXIsUywwLDB9LAkvKiBsZS5oICovCi0gIHs0MCw3LGltcixTLDAsMH0sCS8qIGxlLncgKi8KLSAgezQxLDYsaW1yLFMsMCwwfSwJLyogbHQuaCAqLwotICB7NDEsNyxpbXIsUywwLDB9LAkvKiBsdC53ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQwW10gPSB7Ci0gIHsxMCwzLHJycixTLFYsVn0sCS8qIHN1Yi5zICovCi0gIHsxMCw0LHJycixTLFYsVn0sCS8qIHN1Yi5kICovCi0gIHs0LDMscnJyLFMsVixWfSwJLyogZGl2LnMgKi8KLSAgezQsNCxycnIsUyxWLFZ9LAkvKiBkaXYuZCAqLwotICB7MTAsMTEscnJyLFMsVixWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFMsVixWfSwJLyogc3ViLmQuZiAqLwotICB7NCwxMSxycnIsUyxWLFZ9LAkvKiBkaXYucy5mICovCi0gIHs0LDEyLHJycixTLFYsVn0sCS8qIGRpdi5kLmYgKi8KLSAgezMsMTEscnJyLFYsVixWfSwJLyogbXVsLnMuZiAqLwotICB7MywxMixycnIsVixWLFZ9LAkvKiBtdWwuZC5mICovCi0gIHs0LDExLHJycixWLFYsVn0sCS8qIGRpdi5zLmYgKi8KLSAgezQsMTIscnJyLFYsVixWfSwJLyogZGl2LmQuZiAqLwotICB7MywxMSxycnIsVixTLFZ9LAkvKiBtdWwucy5mICovCi0gIHszLDEyLHJycixWLFMsVn0sCS8qIG11bC5kLmYgKi8KLSAgezQsMTEscnJyLFYsUyxWfSwJLyogZGl2LnMuZiAqLwotICB7NCwxMixycnIsVixTLFZ9LAkvKiBkaXYuZC5mICovCi0gIHs1LDIscnJyLFYsVixWfSwJLyogYW5kLmYgKi8KLSAgezYsMixycnIsVixWLFZ9LAkvKiBvci5mICovCi0gIHs3LDIscnJyLFYsVixWfSwJLyogeG9yLmYgKi8KLSAgezgsMixycnIsVixWLFZ9LAkvKiBzaGYuZiAqLwotICB7NSwyLHJycixWLFMsVn0sCS8qIGFuZC5mICovCi0gIHs2LDIscnJyLFYsUyxWfSwJLyogb3IuZiAqLwotICB7NywyLHJycixWLFMsVn0sCS8qIHhvci5mICovCi0gIHs4LDIscnJyLFYsUyxWfSwJLyogc2hmLmYgKi8KLSAgezksMTEscnJyLFYsVixWfSwJLyogYWRkLnMuZiAqLwotICB7OSwxMixycnIsVixWLFZ9LAkvKiBhZGQuZC5mICovCi0gIHsxMCwxMSxycnIsVixWLFZ9LAkvKiBzdWIucy5mICovCi0gIHsxMCwxMixycnIsVixWLFZ9LAkvKiBzdWIuZC5mICovCi0gIHs5LDExLHJycixWLFMsVn0sCS8qIGFkZC5zLmYgKi8KLSAgezksMTIscnJyLFYsUyxWfSwJLyogYWRkLmQuZiAqLwotICB7MTAsMTEscnJyLFYsUyxWfSwJLyogc3ViLnMuZiAqLwotICB7MTAsMTIscnJyLFYsUyxWfSwJLyogc3ViLmQuZiAqLwotICB7OSwxMyxycnIsVixWLFZ9LAkvKiBhZGQuYi5mICovCi0gIHs5LDE0LHJycixWLFYsVn0sCS8qIGFkZC5oLmYgKi8KLSAgezksMTUscnJyLFYsVixWfSwJLyogYWRkLncuZiAqLwotICB7OSwxNixycnIsVixWLFZ9LAkvKiBhZGQubC5mICovCi0gIHs5LDEzLHJycixWLFMsVn0sCS8qIGFkZC5iLmYgKi8KLSAgezksMTQscnJyLFYsUyxWfSwJLyogYWRkLmguZiAqLwotICB7OSwxNSxycnIsVixTLFZ9LAkvKiBhZGQudy5mICovCi0gIHs5LDE2LHJycixWLFMsVn0sCS8qIGFkZC5sLmYgKi8KLSAgezEwLDEzLHJycixWLFYsVn0sCS8qIHN1Yi5iLmYgKi8KLSAgezEwLDE0LHJycixWLFYsVn0sCS8qIHN1Yi5oLmYgKi8KLSAgezEwLDE1LHJycixWLFYsVn0sCS8qIHN1Yi53LmYgKi8KLSAgezEwLDE2LHJycixWLFYsVn0sCS8qIHN1Yi5sLmYgKi8KLSAgezEwLDEzLHJycixWLFMsVn0sCS8qIHN1Yi5iLmYgKi8KLSAgezEwLDE0LHJycixWLFMsVn0sCS8qIHN1Yi5oLmYgKi8KLSAgezEwLDE1LHJycixWLFMsVn0sCS8qIHN1Yi53LmYgKi8KLSAgezEwLDE2LHJycixWLFMsVn0sCS8qIHN1Yi5sLmYgKi8KLSAgezMsMTMscnJyLFYsVixWfSwJLyogbXVsLmIuZiAqLwotICB7MywxNCxycnIsVixWLFZ9LAkvKiBtdWwuaC5mICovCi0gIHszLDE1LHJycixWLFYsVn0sCS8qIG11bC53LmYgKi8KLSAgezMsMTYscnJyLFYsVixWfSwJLyogbXVsLmwuZiAqLwotICB7MywxMyxycnIsVixTLFZ9LAkvKiBtdWwuYi5mICovCi0gIHszLDE0LHJycixWLFMsVn0sCS8qIG11bC5oLmYgKi8KLSAgezMsMTUscnJyLFYsUyxWfSwJLyogbXVsLncuZiAqLwotICB7MywxNixycnIsVixTLFZ9LAkvKiBtdWwubC5mICovCi0gIHs0LDEzLHJycixWLFYsVn0sCS8qIGRpdi5iLmYgKi8KLSAgezQsMTQscnJyLFYsVixWfSwJLyogZGl2LmguZiAqLwotICB7NCwxNSxycnIsVixWLFZ9LAkvKiBkaXYudy5mICovCi0gIHs0LDE2LHJycixWLFYsVn0sCS8qIGRpdi5sLmYgKi8KLSAgezQsMTMscnJyLFYsUyxWfSwJLyogZGl2LmIuZiAqLwotICB7NCwxNCxycnIsVixTLFZ9LAkvKiBkaXYuaC5mICovCi0gIHs0LDE1LHJycixWLFMsVn0sCS8qIGRpdi53LmYgKi8KLSAgezQsMTYscnJyLFYsUyxWfSwJLyogZGl2LmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MVtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7OTQsMCxhMywwLDAsMH0sCS8qIHRzdCAqLwotICB7OTUsMCxhMywwLDAsMH0sCS8qIGxjayAqLwotICB7OTYsMCxhMywwLDAsMH0sCS8qIHVsayAqLwotICB7MTcsMCxhMXIsUywwLDB9LAkvKiBsZGVhICovCi0gIHs5NywwLGExcixBLDAsMH0sCS8qIHNwYXduICovCi0gIHs5OCwwLGExcixBLDAsMH0sCS8qIGxkY21yICovCi0gIHs5OSwwLGEycixBLDAsMH0sCS8qIHN0Y21yICovCi0gIHsxMDAsMCxhMXIsQSwwLDB9LAkvKiBwb3ByICovCi0gIHsxMDEsMCxhMnIsQSwwLDB9LAkvKiBwc2hyICovCi0gIHsxMDIsNyxhMXIsQSwwLDB9LAkvKiByY3ZyLncgKi8KLSAgezEwMyw3LGEycixBLDAsMH0sCS8qIG1hdG0udyAqLwotICB7MTA0LDcsYTJyLEEsMCwwfSwJLyogc25kci53ICovCi0gIHsxMDQsOCxhMnIsUywwLDB9LAkvKiBzbmRyLmwgKi8KLSAgezEwMiw4LGExcixTLDAsMH0sCS8qIHJjdnIubCAqLwotICB7MTAzLDgsYTJyLFMsMCwwfSwJLyogbWF0bS5sICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMDUsNyxhMnIsQSwwLDB9LAkvKiBwdXRyLncgKi8KLSAgezEwNSw4LGEycixTLDAsMH0sCS8qIHB1dHIubCAqLwotICB7MTA2LDcsYTFyLEEsMCwwfSwJLyogZ2V0ci53ICovCi0gIHsxMDYsOCxhMXIsUywwLDB9LAkvKiBnZXRyLmwgKi8KLSAgezI2LDEzLGEycixTLDAsMH0sCS8qIHN0ZS5iLmYgKi8KLSAgezI2LDE0LGEycixTLDAsMH0sCS8qIHN0ZS5oLmYgKi8KLSAgezI2LDE1LGEycixTLDAsMH0sCS8qIHN0ZS53LmYgKi8KLSAgezI2LDE2LGEycixTLDAsMH0sCS8qIHN0ZS5sLmYgKi8KLSAgezEwNyw3LGEycixBLDAsMH0sCS8qIG1hdHIudyAqLwotICB7MTA4LDcsYTJyLEEsMCwwfSwJLyogbWF0LncgKi8KLSAgezEwOSw3LGExcixBLDAsMH0sCS8qIGdldC53ICovCi0gIHsxMTAsNyxhMXIsQSwwLDB9LAkvKiByY3YudyAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MTExLDcsYTFyLEEsMCwwfSwJLyogaW5jLncgKi8KLSAgezExMiw3LGEycixBLDAsMH0sCS8qIHB1dC53ICovCi0gIHsxMTMsNyxhMnIsQSwwLDB9LAkvKiBzbmQudyAqLwotICB7MTA3LDgsYTJyLFMsMCwwfSwJLyogbWF0ci5sICovCi0gIHsxMDgsOCxhMnIsUywwLDB9LAkvKiBtYXQubCAqLwotICB7MTA5LDgsYTFyLFMsMCwwfSwJLyogZ2V0LmwgKi8KLSAgezExMCw4LGExcixTLDAsMH0sCS8qIHJjdi5sICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTEsOCxhMXIsUywwLDB9LAkvKiBpbmMubCAqLwotICB7MTEyLDgsYTJyLFMsMCwwfSwJLyogcHV0LmwgKi8KLSAgezExMyw4LGEycixTLDAsMH0sCS8qIHNuZC5sICovCi0gIHsxOCwxMyxhMXIsViwwLDB9LAkvKiBsZC5iLmYgKi8KLSAgezE4LDE0LGExcixWLDAsMH0sCS8qIGxkLmguZiAqLwotICB7MTgsMTUsYTFyLFYsMCwwfSwJLyogbGQudy5mICovCi0gIHsxOCwxNixhMXIsViwwLDB9LAkvKiBsZC5sLmYgKi8KLSAgezIxLDEzLGEycixWLDAsMH0sCS8qIHN0LmIuZiAqLwotICB7MjEsMTQsYTJyLFYsMCwwfSwJLyogc3QuaC5mICovCi0gIHsyMSwxNSxhMnIsViwwLDB9LAkvKiBzdC53LmYgKi8KLSAgezIxLDE2LGEycixWLDAsMH0sCS8qIHN0LmwuZiAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0MltdID0gewotICB7MjgsNSxycixWLFYsMH0sCS8qIGN2dHcuYiAqLwotICB7MjgsNixycixWLFYsMH0sCS8qIGN2dHcuaCAqLwotICB7MjksNyxycixWLFYsMH0sCS8qIGN2dGIudyAqLwotICB7MzAsNyxycixWLFYsMH0sCS8qIGN2dGgudyAqLwotICB7MjgsMTMscnIsVixWLDB9LAkvKiBjdnR3LmIuZiAqLwotICB7MjgsMTQscnIsVixWLDB9LAkvKiBjdnR3LmguZiAqLwotICB7MjksMTUscnIsVixWLDB9LAkvKiBjdnRiLncuZiAqLwotICB7MzAsMTUscnIsVixWLDB9LAkvKiBjdnRoLncuZiAqLwotICB7MzEsOCxycixWLFYsMH0sCS8qIGN2dHMubCAqLwotICB7MzIsNyxycixWLFYsMH0sCS8qIGN2dGQudyAqLwotICB7MzMsMyxycixWLFYsMH0sCS8qIGN2dGwucyAqLwotICB7MjgsNCxycixWLFYsMH0sCS8qIGN2dHcuZCAqLwotICB7MzEsMTYscnIsVixWLDB9LAkvKiBjdnRzLmwuZiAqLwotICB7MzIsMTUscnIsVixWLDB9LAkvKiBjdnRkLncuZiAqLwotICB7MzMsMTEscnIsVixWLDB9LAkvKiBjdnRsLnMuZiAqLwotICB7MjgsMTIscnIsVixWLDB9LAkvKiBjdnR3LmQuZiAqLwotICB7MTE0LDAscnIsUyxTLDB9LAkvKiBlbmFsICovCi0gIHs4LDcscnIsUyxTLDB9LAkvKiBzaGYudyAqLwotICB7MTE1LDAscnIsUyxTLDB9LAkvKiBlbmFnICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyOCw0LHJyLFMsUywwfSwJLyogY3Z0dy5kICovCi0gIHszMiw3LHJyLFMsUywwfSwJLyogY3Z0ZC53ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMyxycixTLFMsMH0sCS8qIGZyaW50LnMgKi8KLSAgezExNiw0LHJyLFMsUywwfSwJLyogZnJpbnQuZCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTE2LDMscnIsVixWLDB9LAkvKiBmcmludC5zICovCi0gIHsxMTYsNCxycixWLFYsMH0sCS8qIGZyaW50LmQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezExNiwxMSxycixWLFYsMH0sCS8qIGZyaW50LnMuZiAqLwotICB7MTE2LDEyLHJyLFYsViwwfSwJLyogZnJpbnQuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwzLHJyLFYsViwwfSwJLyogc3FydC5zICovCi0gIHs4MSw0LHJyLFYsViwwfSwJLyogc3FydC5kICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4MSwxMSxycixWLFYsMH0sCS8qIHNxcnQucy5mICovCi0gIHs4MSwxMixycixWLFYsMH0sCS8qIHNxcnQuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQzW10gPSB7Ci0gIHszMiwxMSxycixWLFYsMH0sCS8qIGN2dGQucy5mICovCi0gIHszMSwxMixycixWLFYsMH0sCS8qIGN2dHMuZC5mICovCi0gIHszMywxMixycixWLFYsMH0sCS8qIGN2dGwuZC5mICovCi0gIHszMiwxNixycixWLFYsMH0sCS8qIGN2dGQubC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszNiwyLHJyLFYsViwwfSwJLyogdHpjLmYgKi8KLSAgezQ0LDIscnIsVixWLDB9LAkvKiBsb3AuZiAqLwotICB7MTE3LDIscnIsVixWLDB9LAkvKiB4cG5kLmYgKi8KLSAgezQyLDIscnIsVixWLDB9LAkvKiBub3QuZiAqLwotICB7OCwyLHJyLFMsViwwfSwJLyogc2hmLmYgKi8KLSAgezM1LDE3LHJyLFYsViwwfSwJLyogcGxjLnQuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzcsMTEscnIsVixWLDB9LAkvKiBlcS5zLmYgKi8KLSAgezM3LDEyLHJyLFYsViwwfSwJLyogZXEuZC5mICovCi0gIHs0MywxMSxycixWLFYsMH0sCS8qIG5lZy5zLmYgKi8KLSAgezQzLDEyLHJyLFYsViwwfSwJLyogbmVnLmQuZiAqLwotICB7MzcsMTEscnIsUyxWLDB9LAkvKiBlcS5zLmYgKi8KLSAgezM3LDEyLHJyLFMsViwwfSwJLyogZXEuZC5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs0MCwxMSxycixWLFYsMH0sCS8qIGxlLnMuZiAqLwotICB7NDAsMTIscnIsVixWLDB9LAkvKiBsZS5kLmYgKi8KLSAgezQxLDExLHJyLFYsViwwfSwJLyogbHQucy5mICovCi0gIHs0MSwxMixycixWLFYsMH0sCS8qIGx0LmQuZiAqLwotICB7NDAsMTEscnIsUyxWLDB9LAkvKiBsZS5zLmYgKi8KLSAgezQwLDEyLHJyLFMsViwwfSwJLyogbGUuZC5mICovCi0gIHs0MSwxMSxycixTLFYsMH0sCS8qIGx0LnMuZiAqLwotICB7NDEsMTIscnIsUyxWLDB9LAkvKiBsdC5kLmYgKi8KLSAgezM3LDEzLHJyLFYsViwwfSwJLyogZXEuYi5mICovCi0gIHszNywxNCxycixWLFYsMH0sCS8qIGVxLmguZiAqLwotICB7MzcsMTUscnIsVixWLDB9LAkvKiBlcS53LmYgKi8KLSAgezM3LDE2LHJyLFYsViwwfSwJLyogZXEubC5mICovCi0gIHszNywxMyxycixTLFYsMH0sCS8qIGVxLmIuZiAqLwotICB7MzcsMTQscnIsUyxWLDB9LAkvKiBlcS5oLmYgKi8KLSAgezM3LDE1LHJyLFMsViwwfSwJLyogZXEudy5mICovCi0gIHszNywxNixycixTLFYsMH0sCS8qIGVxLmwuZiAqLwotICB7NDAsMTMscnIsVixWLDB9LAkvKiBsZS5iLmYgKi8KLSAgezQwLDE0LHJyLFYsViwwfSwJLyogbGUuaC5mICovCi0gIHs0MCwxNSxycixWLFYsMH0sCS8qIGxlLncuZiAqLwotICB7NDAsMTYscnIsVixWLDB9LAkvKiBsZS5sLmYgKi8KLSAgezQwLDEzLHJyLFMsViwwfSwJLyogbGUuYi5mICovCi0gIHs0MCwxNCxycixTLFYsMH0sCS8qIGxlLmguZiAqLwotICB7NDAsMTUscnIsUyxWLDB9LAkvKiBsZS53LmYgKi8KLSAgezQwLDE2LHJyLFMsViwwfSwJLyogbGUubC5mICovCi0gIHs0MSwxMyxycixWLFYsMH0sCS8qIGx0LmIuZiAqLwotICB7NDEsMTQscnIsVixWLDB9LAkvKiBsdC5oLmYgKi8KLSAgezQxLDE1LHJyLFYsViwwfSwJLyogbHQudy5mICovCi0gIHs0MSwxNixycixWLFYsMH0sCS8qIGx0LmwuZiAqLwotICB7NDEsMTMscnIsUyxWLDB9LAkvKiBsdC5iLmYgKi8KLSAgezQxLDE0LHJyLFMsViwwfSwJLyogbHQuaC5mICovCi0gIHs0MSwxNSxycixTLFYsMH0sCS8qIGx0LncuZiAqLwotICB7NDEsMTYscnIsUyxWLDB9LAkvKiBsdC5sLmYgKi8KLSAgezQzLDEzLHJyLFYsViwwfSwJLyogbmVnLmIuZiAqLwotICB7NDMsMTQscnIsVixWLDB9LAkvKiBuZWcuaC5mICovCi0gIHs0MywxNSxycixWLFYsMH0sCS8qIG5lZy53LmYgKi8KLSAgezQzLDE2LHJyLFYsViwwfSwJLyogbmVnLmwuZiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NFtdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTBfZm9ybWF0NVtdID0gewotICB7NTEsMTMscnIsVixWLDB9LAkvKiBsZHZpLmIuZiAqLwotICB7NTEsMTQscnIsVixWLDB9LAkvKiBsZHZpLmguZiAqLwotICB7NTEsMTUscnIsVixWLDB9LAkvKiBsZHZpLncuZiAqLwotICB7NTEsMTYscnIsVixWLDB9LAkvKiBsZHZpLmwuZiAqLwotICB7MjgsMTEscnIsVixWLDB9LAkvKiBjdnR3LnMuZiAqLwotICB7MzEsMTUscnIsVixWLDB9LAkvKiBjdnRzLncuZiAqLwotICB7MjgsMTYscnIsVixWLDB9LAkvKiBjdnR3LmwuZiAqLwotICB7MzMsMTUscnIsVixWLDB9LAkvKiBjdnRsLncuZiAqLwotICB7NTIsMTMscnhyLFYsViwwfSwJLyogc3R2aS5iLmYgKi8KLSAgezUyLDE0LHJ4cixWLFYsMH0sCS8qIHN0dmkuaC5mICovCi0gIHs1MiwxNSxyeHIsVixWLDB9LAkvKiBzdHZpLncuZiAqLwotICB7NTIsMTYscnhyLFYsViwwfSwJLyogc3R2aS5sLmYgKi8KLSAgezUyLDEzLHJ4cixTLFYsMH0sCS8qIHN0dmkuYi5mICovCi0gIHs1MiwxNCxyeHIsUyxWLDB9LAkvKiBzdHZpLmguZiAqLwotICB7NTIsMTUscnhyLFMsViwwfSwJLyogc3R2aS53LmYgKi8KLSAgezUyLDE2LHJ4cixTLFYsMH0sCS8qIHN0dmkubC5mICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMF9mb3JtYXQ2W10gPSB7Ci0gIHswLDAscnhsLFMsQ0lSLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixDSVIsUywwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVE9DLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLENQVUlELFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLHJ4bCxTLFRUUiwwfSwJLyogbW92ICovCi0gIHswLDAsbHIsVFRSLFMsMH0sCS8qIG1vdiAqLwotICB7MTE4LDAsbm9wcywwLDAsMH0sCS8qIGN0cnNsICovCi0gIHsxMTksMCxub3BzLDAsMCwwfSwJLyogY3Ryc2cgKi8KLSAgezAsMCxyeGwsUyxWTVUsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZNVSxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxWTUwsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFZNTCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxJQ1IsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLElDUixTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxyeGwsUyxUQ1BVLDB9LAkvKiBtb3YgKi8KLSAgezAsMCxscixUQ1BVLFMsMH0sCS8qIG1vdiAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MTIwLDAsbm9wcywwLDAsMH0sCS8qIHN0b3AgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCxyeGwsUyxUSUQsMH0sCS8qIG1vdiAqLwotICB7MCwwLGxyLFRJRCxTLDB9LAkvKiBtb3YgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUwX2Zvcm1hdDdbXSA9IHsKLSAgezg0LDEzLHIsViwwLDB9LAkvKiBzdW0uYi5mICovCi0gIHs4NCwxNCxyLFYsMCwwfSwJLyogc3VtLmguZiAqLwotICB7ODQsMTUscixWLDAsMH0sCS8qIHN1bS53LmYgKi8KLSAgezg0LDE2LHIsViwwLDB9LAkvKiBzdW0ubC5mICovCi0gIHs4NSwyLHIsViwwLDB9LAkvKiBhbGwuZiAqLwotICB7ODYsMixyLFYsMCwwfSwJLyogYW55LmYgKi8KLSAgezg3LDIscixWLDAsMH0sCS8qIHBhcml0eS5mICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHs4OCwxMyxyLFYsMCwwfSwJLyogbWF4LmIuZiAqLwotICB7ODgsMTQscixWLDAsMH0sCS8qIG1heC5oLmYgKi8KLSAgezg4LDE1LHIsViwwLDB9LAkvKiBtYXgudy5mICovCi0gIHs4OCwxNixyLFYsMCwwfSwJLyogbWF4LmwuZiAqLwotICB7ODksMTMscixWLDAsMH0sCS8qIG1pbi5iLmYgKi8KLSAgezg5LDE0LHIsViwwLDB9LAkvKiBtaW4uaC5mICovCi0gIHs4OSwxNSxyLFYsMCwwfSwJLyogbWluLncuZiAqLwotICB7ODksMTYscixWLDAsMH0sCS8qIG1pbi5sLmYgKi8KLSAgezg0LDExLHIsViwwLDB9LAkvKiBzdW0ucy5mICovCi0gIHs4NCwxMixyLFYsMCwwfSwJLyogc3VtLmQuZiAqLwotICB7OTAsMTEscixWLDAsMH0sCS8qIHByb2Qucy5mICovCi0gIHs5MCwxMixyLFYsMCwwfSwJLyogcHJvZC5kLmYgKi8KLSAgezg4LDExLHIsViwwLDB9LAkvKiBtYXgucy5mICovCi0gIHs4OCwxMixyLFYsMCwwfSwJLyogbWF4LmQuZiAqLwotICB7ODksMTEscixWLDAsMH0sCS8qIG1pbi5zLmYgKi8KLSAgezg5LDEyLHIsViwwLDB9LAkvKiBtaW4uZC5mICovCi0gIHs5MCwxMyxyLFYsMCwwfSwJLyogcHJvZC5iLmYgKi8KLSAgezkwLDE0LHIsViwwLDB9LAkvKiBwcm9kLmguZiAqLwotICB7OTAsMTUscixWLDAsMH0sCS8qIHByb2Qudy5mICovCi0gIHs5MCwxNixyLFYsMCwwfSwJLyogcHJvZC5sLmYgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDBbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezEwLDE4LHJycixTLFYsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixTLFYsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezQsMTgscnJyLFMsVixWfSwJLyogZGl2LnMudCAqLwotICB7NCwxOSxycnIsUyxWLFZ9LAkvKiBkaXYuZC50ICovCi0gIHszLDE4LHJycixWLFYsVn0sCS8qIG11bC5zLnQgKi8KLSAgezMsMTkscnJyLFYsVixWfSwJLyogbXVsLmQudCAqLwotICB7NCwxOCxycnIsVixWLFZ9LAkvKiBkaXYucy50ICovCi0gIHs0LDE5LHJycixWLFYsVn0sCS8qIGRpdi5kLnQgKi8KLSAgezMsMTgscnJyLFYsUyxWfSwJLyogbXVsLnMudCAqLwotICB7MywxOSxycnIsVixTLFZ9LAkvKiBtdWwuZC50ICovCi0gIHs0LDE4LHJycixWLFMsVn0sCS8qIGRpdi5zLnQgKi8KLSAgezQsMTkscnJyLFYsUyxWfSwJLyogZGl2LmQudCAqLwotICB7NSwxLHJycixWLFYsVn0sCS8qIGFuZC50ICovCi0gIHs2LDEscnJyLFYsVixWfSwJLyogb3IudCAqLwotICB7NywxLHJycixWLFYsVn0sCS8qIHhvci50ICovCi0gIHs4LDEscnJyLFYsVixWfSwJLyogc2hmLnQgKi8KLSAgezUsMSxycnIsVixTLFZ9LAkvKiBhbmQudCAqLwotICB7NiwxLHJycixWLFMsVn0sCS8qIG9yLnQgKi8KLSAgezcsMSxycnIsVixTLFZ9LAkvKiB4b3IudCAqLwotICB7OCwxLHJycixWLFMsVn0sCS8qIHNoZi50ICovCi0gIHs5LDE4LHJycixWLFYsVn0sCS8qIGFkZC5zLnQgKi8KLSAgezksMTkscnJyLFYsVixWfSwJLyogYWRkLmQudCAqLwotICB7MTAsMTgscnJyLFYsVixWfSwJLyogc3ViLnMudCAqLwotICB7MTAsMTkscnJyLFYsVixWfSwJLyogc3ViLmQudCAqLwotICB7OSwxOCxycnIsVixTLFZ9LAkvKiBhZGQucy50ICovCi0gIHs5LDE5LHJycixWLFMsVn0sCS8qIGFkZC5kLnQgKi8KLSAgezEwLDE4LHJycixWLFMsVn0sCS8qIHN1Yi5zLnQgKi8KLSAgezEwLDE5LHJycixWLFMsVn0sCS8qIHN1Yi5kLnQgKi8KLSAgezksMjAscnJyLFYsVixWfSwJLyogYWRkLmIudCAqLwotICB7OSwyMSxycnIsVixWLFZ9LAkvKiBhZGQuaC50ICovCi0gIHs5LDIyLHJycixWLFYsVn0sCS8qIGFkZC53LnQgKi8KLSAgezksMjMscnJyLFYsVixWfSwJLyogYWRkLmwudCAqLwotICB7OSwyMCxycnIsVixTLFZ9LAkvKiBhZGQuYi50ICovCi0gIHs5LDIxLHJycixWLFMsVn0sCS8qIGFkZC5oLnQgKi8KLSAgezksMjIscnJyLFYsUyxWfSwJLyogYWRkLncudCAqLwotICB7OSwyMyxycnIsVixTLFZ9LAkvKiBhZGQubC50ICovCi0gIHsxMCwyMCxycnIsVixWLFZ9LAkvKiBzdWIuYi50ICovCi0gIHsxMCwyMSxycnIsVixWLFZ9LAkvKiBzdWIuaC50ICovCi0gIHsxMCwyMixycnIsVixWLFZ9LAkvKiBzdWIudy50ICovCi0gIHsxMCwyMyxycnIsVixWLFZ9LAkvKiBzdWIubC50ICovCi0gIHsxMCwyMCxycnIsVixTLFZ9LAkvKiBzdWIuYi50ICovCi0gIHsxMCwyMSxycnIsVixTLFZ9LAkvKiBzdWIuaC50ICovCi0gIHsxMCwyMixycnIsVixTLFZ9LAkvKiBzdWIudy50ICovCi0gIHsxMCwyMyxycnIsVixTLFZ9LAkvKiBzdWIubC50ICovCi0gIHszLDIwLHJycixWLFYsVn0sCS8qIG11bC5iLnQgKi8KLSAgezMsMjEscnJyLFYsVixWfSwJLyogbXVsLmgudCAqLwotICB7MywyMixycnIsVixWLFZ9LAkvKiBtdWwudy50ICovCi0gIHszLDIzLHJycixWLFYsVn0sCS8qIG11bC5sLnQgKi8KLSAgezMsMjAscnJyLFYsUyxWfSwJLyogbXVsLmIudCAqLwotICB7MywyMSxycnIsVixTLFZ9LAkvKiBtdWwuaC50ICovCi0gIHszLDIyLHJycixWLFMsVn0sCS8qIG11bC53LnQgKi8KLSAgezMsMjMscnJyLFYsUyxWfSwJLyogbXVsLmwudCAqLwotICB7NCwyMCxycnIsVixWLFZ9LAkvKiBkaXYuYi50ICovCi0gIHs0LDIxLHJycixWLFYsVn0sCS8qIGRpdi5oLnQgKi8KLSAgezQsMjIscnJyLFYsVixWfSwJLyogZGl2LncudCAqLwotICB7NCwyMyxycnIsVixWLFZ9LAkvKiBkaXYubC50ICovCi0gIHs0LDIwLHJycixWLFMsVn0sCS8qIGRpdi5iLnQgKi8KLSAgezQsMjEscnJyLFYsUyxWfSwJLyogZGl2LmgudCAqLwotICB7NCwyMixycnIsVixTLFZ9LAkvKiBkaXYudy50ICovCi0gIHs0LDIzLHJycixWLFMsVn0sCS8qIGRpdi5sLnQgKi8KLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDFbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezI2LDIwLGEycixTLDAsMH0sCS8qIHN0ZS5iLnQgKi8KLSAgezI2LDIxLGEycixTLDAsMH0sCS8qIHN0ZS5oLnQgKi8KLSAgezI2LDIyLGEycixTLDAsMH0sCS8qIHN0ZS53LnQgKi8KLSAgezI2LDIzLGEycixTLDAsMH0sCS8qIHN0ZS5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezE4LDIwLGExcixWLDAsMH0sCS8qIGxkLmIudCAqLwotICB7MTgsMjEsYTFyLFYsMCwwfSwJLyogbGQuaC50ICovCi0gIHsxOCwyMixhMXIsViwwLDB9LAkvKiBsZC53LnQgKi8KLSAgezE4LDIzLGExcixWLDAsMH0sCS8qIGxkLmwudCAqLwotICB7MjEsMjAsYTJyLFYsMCwwfSwJLyogc3QuYi50ICovCi0gIHsyMSwyMSxhMnIsViwwLDB9LAkvKiBzdC5oLnQgKi8KLSAgezIxLDIyLGEycixWLDAsMH0sCS8qIHN0LncudCAqLwotICB7MjEsMjMsYTJyLFYsMCwwfSwJLyogc3QubC50ICovCi19OwotCi1DT05TVCBzdHJ1Y3QgZm9ybXN0ciBlMV9mb3JtYXQyW10gPSB7Ci0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsyOCwyMCxycixWLFYsMH0sCS8qIGN2dHcuYi50ICovCi0gIHsyOCwyMSxycixWLFYsMH0sCS8qIGN2dHcuaC50ICovCi0gIHsyOSwyMixycixWLFYsMH0sCS8qIGN2dGIudy50ICovCi0gIHszMCwyMixycixWLFYsMH0sCS8qIGN2dGgudy50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHszMSwyMyxycixWLFYsMH0sCS8qIGN2dHMubC50ICovCi0gIHszMiwyMixycixWLFYsMH0sCS8qIGN2dGQudy50ICovCi0gIHszMywxOCxycixWLFYsMH0sCS8qIGN2dGwucy50ICovCi0gIHsyOCwxOSxycixWLFYsMH0sCS8qIGN2dHcuZC50ICovCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHswLDAsMCwwLDAsMH0sCi0gIHsxMTYsMTgscnIsVixWLDB9LAkvKiBmcmludC5zLnQgKi8KLSAgezExNiwxOSxycixWLFYsMH0sCS8qIGZyaW50LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7ODEsMTgscnIsVixWLDB9LAkvKiBzcXJ0LnMudCAqLwotICB7ODEsMTkscnIsVixWLDB9LAkvKiBzcXJ0LmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0M1tdID0gewotICB7MzIsMTgscnIsVixWLDB9LAkvKiBjdnRkLnMudCAqLwotICB7MzEsMTkscnIsVixWLDB9LAkvKiBjdnRzLmQudCAqLwotICB7MzMsMTkscnIsVixWLDB9LAkvKiBjdnRsLmQudCAqLwotICB7MzIsMjMscnIsVixWLDB9LAkvKiBjdnRkLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MzYsMSxycixWLFYsMH0sCS8qIHR6Yy50ICovCi0gIHs0NCwxLHJyLFYsViwwfSwJLyogbG9wLnQgKi8KLSAgezExNywxLHJyLFYsViwwfSwJLyogeHBuZC50ICovCi0gIHs0MiwxLHJyLFYsViwwfSwJLyogbm90LnQgKi8KLSAgezgsMSxycixTLFYsMH0sCS8qIHNoZi50ICovCi0gIHszNSwyNCxycixWLFYsMH0sCS8qIHBsYy50LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezM3LDE4LHJyLFYsViwwfSwJLyogZXEucy50ICovCi0gIHszNywxOSxycixWLFYsMH0sCS8qIGVxLmQudCAqLwotICB7NDMsMTgscnIsVixWLDB9LAkvKiBuZWcucy50ICovCi0gIHs0MywxOSxycixWLFYsMH0sCS8qIG5lZy5kLnQgKi8KLSAgezM3LDE4LHJyLFMsViwwfSwJLyogZXEucy50ICovCi0gIHszNywxOSxycixTLFYsMH0sCS8qIGVxLmQudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7NDAsMTgscnIsVixWLDB9LAkvKiBsZS5zLnQgKi8KLSAgezQwLDE5LHJyLFYsViwwfSwJLyogbGUuZC50ICovCi0gIHs0MSwxOCxycixWLFYsMH0sCS8qIGx0LnMudCAqLwotICB7NDEsMTkscnIsVixWLDB9LAkvKiBsdC5kLnQgKi8KLSAgezQwLDE4LHJyLFMsViwwfSwJLyogbGUucy50ICovCi0gIHs0MCwxOSxycixTLFYsMH0sCS8qIGxlLmQudCAqLwotICB7NDEsMTgscnIsUyxWLDB9LAkvKiBsdC5zLnQgKi8KLSAgezQxLDE5LHJyLFMsViwwfSwJLyogbHQuZC50ICovCi0gIHszNywyMCxycixWLFYsMH0sCS8qIGVxLmIudCAqLwotICB7MzcsMjEscnIsVixWLDB9LAkvKiBlcS5oLnQgKi8KLSAgezM3LDIyLHJyLFYsViwwfSwJLyogZXEudy50ICovCi0gIHszNywyMyxycixWLFYsMH0sCS8qIGVxLmwudCAqLwotICB7MzcsMjAscnIsUyxWLDB9LAkvKiBlcS5iLnQgKi8KLSAgezM3LDIxLHJyLFMsViwwfSwJLyogZXEuaC50ICovCi0gIHszNywyMixycixTLFYsMH0sCS8qIGVxLncudCAqLwotICB7MzcsMjMscnIsUyxWLDB9LAkvKiBlcS5sLnQgKi8KLSAgezQwLDIwLHJyLFYsViwwfSwJLyogbGUuYi50ICovCi0gIHs0MCwyMSxycixWLFYsMH0sCS8qIGxlLmgudCAqLwotICB7NDAsMjIscnIsVixWLDB9LAkvKiBsZS53LnQgKi8KLSAgezQwLDIzLHJyLFYsViwwfSwJLyogbGUubC50ICovCi0gIHs0MCwyMCxycixTLFYsMH0sCS8qIGxlLmIudCAqLwotICB7NDAsMjEscnIsUyxWLDB9LAkvKiBsZS5oLnQgKi8KLSAgezQwLDIyLHJyLFMsViwwfSwJLyogbGUudy50ICovCi0gIHs0MCwyMyxycixTLFYsMH0sCS8qIGxlLmwudCAqLwotICB7NDEsMjAscnIsVixWLDB9LAkvKiBsdC5iLnQgKi8KLSAgezQxLDIxLHJyLFYsViwwfSwJLyogbHQuaC50ICovCi0gIHs0MSwyMixycixWLFYsMH0sCS8qIGx0LncudCAqLwotICB7NDEsMjMscnIsVixWLDB9LAkvKiBsdC5sLnQgKi8KLSAgezQxLDIwLHJyLFMsViwwfSwJLyogbHQuYi50ICovCi0gIHs0MSwyMSxycixTLFYsMH0sCS8qIGx0LmgudCAqLwotICB7NDEsMjIscnIsUyxWLDB9LAkvKiBsdC53LnQgKi8KLSAgezQxLDIzLHJyLFMsViwwfSwJLyogbHQubC50ICovCi0gIHs0MywyMCxycixWLFYsMH0sCS8qIG5lZy5iLnQgKi8KLSAgezQzLDIxLHJyLFYsViwwfSwJLyogbmVnLmgudCAqLwotICB7NDMsMjIscnIsVixWLDB9LAkvKiBuZWcudy50ICovCi0gIHs0MywyMyxycixWLFYsMH0sCS8qIG5lZy5sLnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDRbXSA9IHsKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLSAgezAsMCwwLDAsMCwwfSwKLX07Ci0KLUNPTlNUIHN0cnVjdCBmb3Jtc3RyIGUxX2Zvcm1hdDVbXSA9IHsKLSAgezUxLDIwLHJyLFYsViwwfSwJLyogbGR2aS5iLnQgKi8KLSAgezUxLDIxLHJyLFYsViwwfSwJLyogbGR2aS5oLnQgKi8KLSAgezUxLDIyLHJyLFYsViwwfSwJLyogbGR2aS53LnQgKi8KLSAgezUxLDIzLHJyLFYsViwwfSwJLyogbGR2aS5sLnQgKi8KLSAgezI4LDE4LHJyLFYsViwwfSwJLyogY3Z0dy5zLnQgKi8KLSAgezMxLDIyLHJyLFYsViwwfSwJLyogY3Z0cy53LnQgKi8KLSAgezI4LDIzLHJyLFYsViwwfSwJLyogY3Z0dy5sLnQgKi8KLSAgezMzLDIyLHJyLFYsViwwfSwJLyogY3Z0bC53LnQgKi8KLSAgezUyLDIwLHJ4cixWLFYsMH0sCS8qIHN0dmkuYi50ICovCi0gIHs1MiwyMSxyeHIsVixWLDB9LAkvKiBzdHZpLmgudCAqLwotICB7NTIsMjIscnhyLFYsViwwfSwJLyogc3R2aS53LnQgKi8KLSAgezUyLDIzLHJ4cixWLFYsMH0sCS8qIHN0dmkubC50ICovCi0gIHs1MiwyMCxyeHIsUyxWLDB9LAkvKiBzdHZpLmIudCAqLwotICB7NTIsMjEscnhyLFMsViwwfSwJLyogc3R2aS5oLnQgKi8KLSAgezUyLDIyLHJ4cixTLFYsMH0sCS8qIHN0dmkudy50ICovCi0gIHs1MiwyMyxyeHIsUyxWLDB9LAkvKiBzdHZpLmwudCAqLwotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0NltdID0gewotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotQ09OU1Qgc3RydWN0IGZvcm1zdHIgZTFfZm9ybWF0N1tdID0gewotICB7ODQsMjAscixWLDAsMH0sCS8qIHN1bS5iLnQgKi8KLSAgezg0LDIxLHIsViwwLDB9LAkvKiBzdW0uaC50ICovCi0gIHs4NCwyMixyLFYsMCwwfSwJLyogc3VtLncudCAqLwotICB7ODQsMjMscixWLDAsMH0sCS8qIHN1bS5sLnQgKi8KLSAgezg1LDEscixWLDAsMH0sCS8qIGFsbC50ICovCi0gIHs4NiwxLHIsViwwLDB9LAkvKiBhbnkudCAqLwotICB7ODcsMSxyLFYsMCwwfSwJLyogcGFyaXR5LnQgKi8KLSAgezAsMCwwLDAsMCwwfSwKLSAgezg4LDIwLHIsViwwLDB9LAkvKiBtYXguYi50ICovCi0gIHs4OCwyMSxyLFYsMCwwfSwJLyogbWF4LmgudCAqLwotICB7ODgsMjIscixWLDAsMH0sCS8qIG1heC53LnQgKi8KLSAgezg4LDIzLHIsViwwLDB9LAkvKiBtYXgubC50ICovCi0gIHs4OSwyMCxyLFYsMCwwfSwJLyogbWluLmIudCAqLwotICB7ODksMjEscixWLDAsMH0sCS8qIG1pbi5oLnQgKi8KLSAgezg5LDIyLHIsViwwLDB9LAkvKiBtaW4udy50ICovCi0gIHs4OSwyMyxyLFYsMCwwfSwJLyogbWluLmwudCAqLwotICB7ODQsMTgscixWLDAsMH0sCS8qIHN1bS5zLnQgKi8KLSAgezg0LDE5LHIsViwwLDB9LAkvKiBzdW0uZC50ICovCi0gIHs5MCwxOCxyLFYsMCwwfSwJLyogcHJvZC5zLnQgKi8KLSAgezkwLDE5LHIsViwwLDB9LAkvKiBwcm9kLmQudCAqLwotICB7ODgsMTgscixWLDAsMH0sCS8qIG1heC5zLnQgKi8KLSAgezg4LDE5LHIsViwwLDB9LAkvKiBtYXguZC50ICovCi0gIHs4OSwxOCxyLFYsMCwwfSwJLyogbWluLnMudCAqLwotICB7ODksMTkscixWLDAsMH0sCS8qIG1pbi5kLnQgKi8KLSAgezkwLDIwLHIsViwwLDB9LAkvKiBwcm9kLmIudCAqLwotICB7OTAsMjEscixWLDAsMH0sCS8qIHByb2QuaC50ICovCi0gIHs5MCwyMixyLFYsMCwwfSwJLyogcHJvZC53LnQgKi8KLSAgezkwLDIzLHIsViwwLDB9LAkvKiBwcm9kLmwudCAqLwotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotICB7MCwwLDAsMCwwLDB9LAotfTsKLQotY2hhciAqbG9wW10gPSB7Ci0gICJtb3YiLAkvKiAwICovCi0gICJtZXJnIiwJLyogMSAqLwotICAibWFzayIsCS8qIDIgKi8KLSAgIm11bCIsCS8qIDMgKi8KLSAgImRpdiIsCS8qIDQgKi8KLSAgImFuZCIsCS8qIDUgKi8KLSAgIm9yIiwJLyogNiAqLwotICAieG9yIiwJLyogNyAqLwotICAic2hmIiwJLyogOCAqLwotICAiYWRkIiwJLyogOSAqLwotICAic3ViIiwJLyogMTAgKi8KLSAgImV4aXQiLAkvKiAxMSAqLwotICAiam1wIiwJLyogMTIgKi8KLSAgImptcGkiLAkvKiAxMyAqLwotICAiam1wYSIsCS8qIDE0ICovCi0gICJqbXBzIiwJLyogMTUgKi8KLSAgInRhYyIsCS8qIDE2ICovCi0gICJsZGVhIiwJLyogMTcgKi8KLSAgImxkIiwJLyogMTggKi8KLSAgInRhcyIsCS8qIDE5ICovCi0gICJwc2hlYSIsCS8qIDIwICovCi0gICJzdCIsCS8qIDIxICovCi0gICJjYWxsIiwJLyogMjIgKi8KLSAgImNhbGxzIiwJLyogMjMgKi8KLSAgImNhbGxxIiwJLyogMjQgKi8KLSAgInBmb3JrIiwJLyogMjUgKi8KLSAgInN0ZSIsCS8qIDI2ICovCi0gICJpbmNyIiwJLyogMjcgKi8KLSAgImN2dHciLAkvKiAyOCAqLwotICAiY3Z0YiIsCS8qIDI5ICovCi0gICJjdnRoIiwJLyogMzAgKi8KLSAgImN2dHMiLAkvKiAzMSAqLwotICAiY3Z0ZCIsCS8qIDMyICovCi0gICJjdnRsIiwJLyogMzMgKi8KLSAgImxkcGEiLAkvKiAzNCAqLwotICAicGxjIiwJLyogMzUgKi8KLSAgInR6YyIsCS8qIDM2ICovCi0gICJlcSIsCS8qIDM3ICovCi0gICJsZXUiLAkvKiAzOCAqLwotICAibHR1IiwJLyogMzkgKi8KLSAgImxlIiwJLyogNDAgKi8KLSAgImx0IiwJLyogNDEgKi8KLSAgIm5vdCIsCS8qIDQyICovCi0gICJuZWciLAkvKiA0MyAqLwotICAibG9wIiwJLyogNDQgKi8KLSAgImNwcnMiLAkvKiA0NSAqLwotICAibm9wIiwJLyogNDYgKi8KLSAgImJyIiwJLyogNDcgKi8KLSAgImJyaSIsCS8qIDQ4ICovCi0gICJicmEiLAkvKiA0OSAqLwotICAiYnJzIiwJLyogNTAgKi8KLSAgImxkdmkiLAkvKiA1MSAqLwotICAic3R2aSIsCS8qIDUyICovCi0gICJsZHNkciIsCS8qIDUzICovCi0gICJsZGtkciIsCS8qIDU0ICovCi0gICJsbiIsCS8qIDU1ICovCi0gICJwYXR1IiwJLyogNTYgKi8KLSAgInBhdGUiLAkvKiA1NyAqLwotICAicGljaCIsCS8qIDU4ICovCi0gICJwbGNoIiwJLyogNTkgKi8KLSAgImlkbGUiLAkvKiA2MCAqLwotICAicnRucSIsCS8qIDYxICovCi0gICJjZm9yayIsCS8qIDYyICovCi0gICJydG4iLAkvKiA2MyAqLwotICAid2ZvcmsiLAkvKiA2NCAqLwotICAiam9pbiIsCS8qIDY1ICovCi0gICJydG5jIiwJLyogNjYgKi8KLSAgImV4cCIsCS8qIDY3ICovCi0gICJzaW4iLAkvKiA2OCAqLwotICAiY29zIiwJLyogNjkgKi8KLSAgInBzaCIsCS8qIDcwICovCi0gICJwb3AiLAkvKiA3MSAqLwotICAiZW5pIiwJLyogNzIgKi8KLSAgImRzaSIsCS8qIDczICovCi0gICJia3B0IiwJLyogNzQgKi8KLSAgIm1zeW5jIiwJLyogNzUgKi8KLSAgIm1za2kiLAkvKiA3NiAqLwotICAieG10aSIsCS8qIDc3ICovCi0gICJ0c3R2diIsCS8qIDc4ICovCi0gICJkaWFnIiwJLyogNzkgKi8KLSAgInBia3B0IiwJLyogODAgKi8KLSAgInNxcnQiLAkvKiA4MSAqLwotICAiY2FzciIsCS8qIDgyICovCi0gICJhdGFuIiwJLyogODMgKi8KLSAgInN1bSIsCS8qIDg0ICovCi0gICJhbGwiLAkvKiA4NSAqLwotICAiYW55IiwJLyogODYgKi8KLSAgInBhcml0eSIsCS8qIDg3ICovCi0gICJtYXgiLAkvKiA4OCAqLwotICAibWluIiwJLyogODkgKi8KLSAgInByb2QiLAkvKiA5MCAqLwotICAiaGFsdCIsCS8qIDkxICovCi0gICJzeXNjIiwJLyogOTIgKi8KLSAgInRyYXAiLAkvKiA5MyAqLwotICAidHN0IiwJLyogOTQgKi8KLSAgImxjayIsCS8qIDk1ICovCi0gICJ1bGsiLAkvKiA5NiAqLwotICAic3Bhd24iLAkvKiA5NyAqLwotICAibGRjbXIiLAkvKiA5OCAqLwotICAic3RjbXIiLAkvKiA5OSAqLwotICAicG9wciIsCS8qIDEwMCAqLwotICAicHNociIsCS8qIDEwMSAqLwotICAicmN2ciIsCS8qIDEwMiAqLwotICAibWF0bSIsCS8qIDEwMyAqLwotICAic25kciIsCS8qIDEwNCAqLwotICAicHV0ciIsCS8qIDEwNSAqLwotICAiZ2V0ciIsCS8qIDEwNiAqLwotICAibWF0ciIsCS8qIDEwNyAqLwotICAibWF0IiwJLyogMTA4ICovCi0gICJnZXQiLAkvKiAxMDkgKi8KLSAgInJjdiIsCS8qIDExMCAqLwotICAiaW5jIiwJLyogMTExICovCi0gICJwdXQiLAkvKiAxMTIgKi8KLSAgInNuZCIsCS8qIDExMyAqLwotICAiZW5hbCIsCS8qIDExNCAqLwotICAiZW5hZyIsCS8qIDExNSAqLwotICAiZnJpbnQiLAkvKiAxMTYgKi8KLSAgInhwbmQiLAkvKiAxMTcgKi8KLSAgImN0cnNsIiwJLyogMTE4ICovCi0gICJjdHJzZyIsCS8qIDExOSAqLwotICAic3RvcCIsCS8qIDEyMCAqLwotfTsKLQotY2hhciAqcm9wW10gPSB7Ci0gICIiLAkvKiAwICovCi0gICIudCIsCS8qIDEgKi8KLSAgIi5mIiwJLyogMiAqLwotICAiLnMiLAkvKiAzICovCi0gICIuZCIsCS8qIDQgKi8KLSAgIi5iIiwJLyogNSAqLwotICAiLmgiLAkvKiA2ICovCi0gICIudyIsCS8qIDcgKi8KLSAgIi5sIiwJLyogOCAqLwotICAiLngiLAkvKiA5ICovCi0gICIudSIsCS8qIDEwICovCi0gICIucy5mIiwJLyogMTEgKi8KLSAgIi5kLmYiLAkvKiAxMiAqLwotICAiLmIuZiIsCS8qIDEzICovCi0gICIuaC5mIiwJLyogMTQgKi8KLSAgIi53LmYiLAkvKiAxNSAqLwotICAiLmwuZiIsCS8qIDE2ICovCi0gICIudC5mIiwJLyogMTcgKi8KLSAgIi5zLnQiLAkvKiAxOCAqLwotICAiLmQudCIsCS8qIDE5ICovCi0gICIuYi50IiwJLyogMjAgKi8KLSAgIi5oLnQiLAkvKiAyMSAqLwotICAiLncudCIsCS8qIDIyICovCi0gICIubC50IiwJLyogMjMgKi8KLSAgIi50LnQiLAkvKiAyNCAqLwotfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaCBiL2luY2x1ZGUvb3Bjb2RlL2QxMHYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NGM5OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9kMTB2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyogZDEwdi5oIC0tIEhlYWRlciBmaWxlIGZvciBEMTBWIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IE1hcnRpbiBIdW50IChodW50QGN5Z251cy5jb20pLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIEQxMFZfSAotI2RlZmluZSBEMTBWX0gKLQotLyogRm9ybWF0IFNwZWNpZmllciAqLwotI2RlZmluZSBGTTAwCTAKLSNkZWZpbmUgRk0wMQkweDQwMDAwMDAwCi0jZGVmaW5lIEZNMTAJMHg4MDAwMDAwMAotI2RlZmluZSBGTTExCTB4QzAwMDAwMDAKLQotI2RlZmluZSBOT1AgMHg1ZTAwCi0jZGVmaW5lIE9QQ09ERV9ESVZTCTB4MTQwMDI4MDAKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDEwdl9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgZDEwdl9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiB0aGUgb3Bjb2RlIGZvcm1hdCAqLwotICBpbnQgZm9ybWF0OwotCi0gIC8qIFRoZXNlIG51bWJlcnMgd2VyZSBwaWNrZWQgc28gd2UgY2FuIGRvIGlmKCBpICYgU0hPUlRfT1BDT0RFKSAqLwotI2RlZmluZSBTSE9SVF9PUENPREUgMQotI2RlZmluZSBMT05HX09QQ09ERSAgOAotI2RlZmluZSBTSE9SVF8yCSAgICAgMQkJLyogc2hvcnQgd2l0aCAyIG9wZXJhbmRzICovCi0jZGVmaW5lIFNIT1JUX0IJICAgICAzCQkvKiBzaG9ydCB3aXRoIDgtYml0IGJyYW5jaCAqLwotI2RlZmluZSBMT05HX0IJICAgICA4CQkvKiBsb25nIHdpdGggMTYtYml0IGJyYW5jaCAqLwotI2RlZmluZSBMT05HX0wgICAgICAgMTAJCS8qIGxvbmcgd2l0aCAzIG9wZXJhbmRzICovCi0jZGVmaW5lIExPTkdfUiAgICAgICAxMgkJLyogcmVzZXJ2ZWQgKi8KLQotICAvKiBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHZhcmlhYmxlLWxlbmd0aCBpbnN0cnVjdGlvbnMgKi8KLSAgLyogZm9yIGV4YW1wbGUsICJicmEiIHdpbGwgYmUgYSBmYWtlIGZvciAiYnJhLnMiIGFuZCBicmEubCIgKi8KLSAgLyogd2hpY2ggd2lsbCBpbW1lZGlhdGVseSBmb2xsb3cgaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0jZGVmaW5lIE9QQ09ERV9GQUtFICAzMgotCi0gIC8qIHRoZSBudW1iZXIgb2YgY3ljbGVzICovCi0gIGludCBjeWNsZXM7Ci0KLSAgLyogdGhlIGV4ZWN1dGlvbiB1bml0KHMpIHVzZWQgKi8KLSAgaW50IHVuaXQ7Ci0jZGVmaW5lIEVJVEhFUgkwCi0jZGVmaW5lIElVCTEKLSNkZWZpbmUgTVUJMgotI2RlZmluZSBCT1RICTMKLQotICAvKiBleGVjdXRpb24gdHlwZTsgcGFyYWxsZWwgb3Igc2VxdWVudGlhbCAqLwotICAvKiB0aGlzIGZpZWxkIGlzIHVzZWQgdG8gZGVjaWRlIGlmIHR3byBpbnN0cnVjdGlvbnMgKi8KLSAgLyogY2FuIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsICovCi0gIGludCBleGVjX3R5cGU7Ci0jZGVmaW5lIFBBUk9OTFkgMQkvKiBwYXJhbGxlbCBvbmx5ICovCi0jZGVmaW5lIFNFUQkyCS8qIG11c3QgYmUgc2VxdWVudGlhbCAqLwotI2RlZmluZSBQQVIJNAkvKiBtYXkgYmUgcGFyYWxsZWwgKi8KLSNkZWZpbmUgQlJBTkNIX0xJTksgOAkvKiBzdWJyb3V0aW5lIGNhbGwuICBtdXN0IGJlIGFsaWduZWQgKi8KLSNkZWZpbmUgUk1FTSAgICAgMTYJLyogcmVhZHMgbWVtb3J5ICovCi0jZGVmaW5lIFdNRU0gICAgIDMyCS8qIHdyaXRlcyBtZW1vcnkgKi8KLSNkZWZpbmUgUkYwICAgICAgNjQJLyogcmVhZHMgZjAgKi8KLSNkZWZpbmUgV0YwICAgICAxMjgJLyogbW9kaWZpZXMgZjAgKi8KLSNkZWZpbmUgV0NBUiAgICAyNTYJLyogd3JpdGUgQ2FycnkgKi8KLSNkZWZpbmUgQlJBTkNIICA1MTIJLyogYnJhbmNoLCBubyBsaW5rICovCi0KLSAgLyogdGhlIG9wY29kZSAqLwotICBsb25nIG9wY29kZTsKLQotICAvKiBtYXNrLiAgaWYoIChpICYgbWFzaykgPT0gb3Bjb2RlICkgdGhlbiBtYXRjaCAqLwotICBsb25nIG1hc2s7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZQotICAgICBvcGVyYW5kIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0Ci0gICAgIGFwcGVhciBpbiBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgKi8KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s2XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDEwdl9vcGNvZGUgZDEwdl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGQxMHZfbnVtX29wY29kZXM7Ci0KLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgZDEwdl9vcGVyYW5kLiAgKi8KLXN0cnVjdCBkMTB2X29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBkMTB2X29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGQxMHZfb3BlcmFuZCBkMTB2X29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgZDEwdl9vcGVyYW5kLiAgKi8KLQotLyogdGhlIG9wZXJhbmQgbXVzdCBiZSBhbiBldmVuIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX0VWRU4JKDEpCi0KLS8qIHRoZSBvcGVyYW5kIG11c3QgYmUgYW4gb2RkIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX09ERAkoMikJCi0KLS8qIHRoaXMgaXMgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyOyBpdCB3aWxsIGJlIG1vZGlmaWVkICovCi0vKiB0aGlzIGlzIHVzZWQgYnkgdGhlIG9wdGltaXplciAqLwotI2RlZmluZSBPUEVSQU5EX0RFU1QJKDQpCi0KLS8qIG51bWJlciBvciBzeW1ib2wgKi8KLSNkZWZpbmUgT1BFUkFORF9OVU0JKDgpCi0KLS8qIGFkZHJlc3Mgb3IgbGFiZWwgKi8KLSNkZWZpbmUgT1BFUkFORF9BRERSCSgweDEwKQotCi0vKiByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX1JFRwkoMHgyMCkKLQotLyogcG9zdGluY3JlbWVudCArICAqLwotI2RlZmluZSBPUEVSQU5EX1BMVVMJKDB4NDApCi0KLS8qIHBvc3RkZWNyZW1lbnQgLSAgKi8KLSNkZWZpbmUgT1BFUkFORF9NSU5VUwkoMHg4MCkKLQotLyogQCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFNJR04JKDB4MTAwKQotCi0vKiBAKCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFBBUgkoMHgyMDApCi0KLS8qIGFjY3VtdWxhdG9yIDAgKi8KLSNkZWZpbmUgT1BFUkFORF9BQ0MwCSgweDQwMCkKLQotLyogYWNjdW11bGF0b3IgMSAqLwotI2RlZmluZSBPUEVSQU5EX0FDQzEJKDB4ODAwKQotCi0vKiBmMCAvIGYxIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9GRkxBRwkoMHgxMDAwKQotCi0vKiBjIGZsYWcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgT1BFUkFORF9DRkxBRwkoMHgyMDAwKQotCi0vKiBjb250cm9sIHJlZ2lzdGVyICAqLwotI2RlZmluZSBPUEVSQU5EX0NPTlRST0wJKDB4NDAwMCkKLQotLyogcHJlZGVjcmVtZW50IG1vZGUgJ0Atc3AnICAqLwotI2RlZmluZSBPUEVSQU5EX0FUTUlOVVMJKDB4ODAwMCkKLQotLyogc2lnbmVkIG51bWJlciAqLwotI2RlZmluZSBPUEVSQU5EX1NJR05FRAkoMHgxMDAwMCkKLQotLyogc3BlY2lhbCBhY2N1bXVsYXRvciBzaGlmdHMgbmVlZCBhIDQtYml0IG51bWJlciAqLwotLyogMSA8PSB4IDw9IDE2ICovCi0jZGVmaW5lIE9QRVJBTkRfU0hJRlQJKDB4MjAwMDApCi0KLS8qIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAqLwotI2RlZmluZSBPUEVSQU5EX0dQUgkoMHg0MDAwMCkKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHBkX3JlZwotewotICBjaGFyICpuYW1lOwkJLyogbmFtZSB0byByZWNvZ25pemUgKi8KLSAgY2hhciAqcG5hbWU7CQkvKiBuYW1lIHRvIHByaW50IGZvciB0aGlzIHJlZ2lzdGVyICovCi0gIGludCB2YWx1ZTsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcGRfcmVnIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbXTsKLWludCBkMTB2X3JlZ19uYW1lX2NudCgpOwotCi0vKiBhbiBleHByZXNzaW9uUyBvbmx5IGhhcyBvbmUgcmVnaXN0ZXIgdHlwZSwgc28gd2UgZmFrZSBpdCAqLwotLyogYnkgc2V0dGluZyBoaWdoIGJpdHMgdG8gaW5kaWNhdGUgdHlwZSAqLwotI2RlZmluZSBSRUdJU1RFUl9NQVNLCTB4RkYKLQotI2VuZGlmIC8qIEQxMFZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvZDMwdi5oIGIvaW5jbHVkZS9vcGNvZGUvZDMwdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODI4ZGFiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2QzMHYuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKiBkMzB2LmggLS0gSGVhZGVyIGZpbGUgZm9yIEQzMFYgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQgKGh1bnRAY3lnbnVzLmNvbSksIEN5Z251cyBTb2x1dGlvbnMKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBEMzBWX0gKLSNkZWZpbmUgRDMwVl9ICi0KLSNkZWZpbmUgTk9QIDB4MDBGMDAwMDAKLQotLyogU3RydWN0dXJlIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgcHJlZGVmaW5lZCByZWdpc3RlcnMuICAqLwotc3RydWN0IHBkX3JlZwotewotICBjaGFyICpuYW1lOwkJLyogbmFtZSB0byByZWNvZ25pemUgKi8KLSAgY2hhciAqcG5hbWU7CQkvKiBuYW1lIHRvIHByaW50IGZvciB0aGlzIHJlZ2lzdGVyICovCi0gIGludCB2YWx1ZTsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdOwotaW50IHJlZ19uYW1lX2NudCgpOwotCi0vKiB0aGUgbnVtYmVyIG9mIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0jZGVmaW5lIE1BWF9DT05UUk9MX1JFRwk2NAotCi0vKiBkZWZpbmUgdGhlIGZvcm1hdCBzcGVjaWZpZXJzICovCi0jZGVmaW5lIEZNMDAJMAotI2RlZmluZSBGTTAxCTB4ODAwMDAwMDAKLSNkZWZpbmUgRk0xMAkweDgwMDAwMDAwMDAwMDAwMDBMTAotI2RlZmluZSBGTTExCTB4ODAwMDAwMDA4MDAwMDAwMExMCi0KLS8qIGRlZmluZSB0aGUgb3Bjb2RlIGNsYXNzZXMgKi8KLSNkZWZpbmUgQlJBCTAKLSNkZWZpbmUgTE9HSUMJMQotI2RlZmluZSBJTUVNCTIKLSNkZWZpbmUgSUFMVTEJNAotI2RlZmluZSBJQUxVMgk1Ci0KLS8qIGRlZmluZSB0aGUgZXhlY3V0aW9uIGNvbmRpdGlvbiBjb2RlcyAqLwotI2RlZmluZSBFQ0NfQUwJMAkvKiBBTHdheXMgKGRlZmF1bHQpICovCi0jZGVmaW5lIEVDQ19UWAkxCS8qIEYwPVRydWUsIEYxPURvbid0IGNhcmUgKi8KLSNkZWZpbmUgRUNDX0ZYCTIJLyogRjA9RmFsc2UsIEYxPURvbid0IGNhcmUgKi8KLSNkZWZpbmUgRUNDX1hUCTMJLyogRjA9RG9uJ3QgY2FyZSwgRjE9VHJ1ZSAqLwotI2RlZmluZSBFQ0NfWEYJNAkvKiBGMD1Eb24ndCBjYXJlLCBGMT1GYWxzZSAqLwotI2RlZmluZSBFQ0NfVFQJNQkvKiBGMD1UcnVlLCBGMT1UcnVlICovCi0jZGVmaW5lIEVDQ19URgk2CS8qIEYwPVRydWUsIEYxPUZhbHNlICovCi0jZGVmaW5lIEVDQ19SRVNFUlZFRAk3CS8qIHJlc2VydmVkICovCi0jZGVmaW5lIEVDQ19NQVgJRUNDX1JFU0VSVkVECi0KLWV4dGVybiBjb25zdCBjaGFyICpkMzB2X2VjY19uYW1lc1tdOwotCi0vKiBjb25kaXRpb24gY29kZSB0YWJsZSBmb3IgQ01QIGFuZCBDTVBVICovCi1leHRlcm4gY29uc3QgY2hhciAqZDMwdl9jY19uYW1lc1tdOwotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBkMzB2X29wY29kZS4gICovCi1zdHJ1Y3QgZDMwdl9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiB0aGUgb3Bjb2RlICovCi0gIGludCBvcDE7CS8qIGZpcnN0IHBhcnQsICJJQUxVMSIgZm9yIGV4YW1wbGUgKi8KLSAgaW50IG9wMjsJLyogdGhlIHJlc3Qgb2YgdGhlIG9wY29kZSAqLwotCi0gIC8qIG9wY29kZSBmb3JtYXQocykuICBUaGVzZSBudW1iZXJzIGNvcnJlc3BvbmQgdG8gZW50cmllcyAqLwotICAvKiBpbiB0aGUgZDMwdl9mb3JtYXRfdGFibGUgKi8KLSAgdW5zaWduZWQgY2hhciBmb3JtYXRbNF07Ci0KLSNkZWZpbmUgU0hPUlRfTQkJMQotI2RlZmluZSBTSE9SVF9NMgk1CS8qIGZvciBsZDJ3IGFuZCBzdDJ3ICovCi0jZGVmaW5lIFNIT1JUX0EJCTkKLSNkZWZpbmUgU0hPUlRfQjEJMTEKLSNkZWZpbmUgU0hPUlRfQjIJMTIKLSNkZWZpbmUgU0hPUlRfQjMJMTMKLSNkZWZpbmUgU0hPUlRfQjNiCTE1Ci0jZGVmaW5lIFNIT1JUX0QxCTE3Ci0jZGVmaW5lIFNIT1JUX0QyCTE5Ci0jZGVmaW5lIFNIT1JUX0QyQgkyMQotI2RlZmluZSBTSE9SVF9VCQkyMwkvKiB1bmFyeSBTSE9SVF9BLiAgQUJTIGZvciBleGFtcGxlICovCi0jZGVmaW5lIFNIT1JUX0YJCTI1CS8qIFNIT1JUX0Egd2l0aCBmbGFnIHJlZ2lzdGVycyAqLwotI2RlZmluZSBTSE9SVF9BRgkyNwkvKiBTSE9SVF9BIHdpdGggb25seSB0aGUgZmlyc3QgcmVnaXN0ZXIgYSBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNIT1JUX1QJCTI5CS8qIGZvciB0cmFwIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFNIT1JUX0E1CTMwCS8qIFNIT1JUX0Egd2l0aCBhIDUtYml0IGltbWVkaWF0ZSBpbnN0ZWFkIG9mIDYgKi8KLSNkZWZpbmUgU0hPUlRfQ01QCTMyCS8qIHNwZWNpYWwgZm9ybSBmb3IgQ01QY2MgKi8KLSNkZWZpbmUgU0hPUlRfQ01QVQkzNAkvKiBzcGVjaWFsIGZvcm0gZm9yIENNUFVjYyAqLwotI2RlZmluZSBTSE9SVF9BMQkzNgkvKiBzcGVjaWFsIGZvcm0gb2YgU0hPUlRfQSBmb3IgTUFDYSBvcGNvZGVzIHdoZXJlIGE9MSAqLwotI2RlZmluZSBTSE9SVF9BQQkzOAkvKiBTSE9SVF9BIHdpdGggdGhlIGZpcnN0IHJlZ2lzdGVyIGFuIGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIFNIT1JUX1JBCTQwCS8qIFNIT1JUX0Egd2l0aCB0aGUgc2Vjb25kIHJlZ2lzdGVyIGFuIGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIFNIT1JUX01PRElOQwk0MgkKLSNkZWZpbmUgU0hPUlRfTU9EREVDCTQzCi0jZGVmaW5lIFNIT1JUX0MxCTQ0Ci0jZGVmaW5lIFNIT1JUX0MyCTQ1Ci0jZGVmaW5lIFNIT1JUX1VGCTQ2Ci0jZGVmaW5lIFNIT1JUX0EyCTQ3Ci0jZGVmaW5lIFNIT1JUX0E1Uwk0OQotI2RlZmluZSBTSE9SVF9OT05FCTUxCS8qIG5vIG9wZXJhbmRzICovCi0jZGVmaW5lIExPTkcJCTUyCi0jZGVmaW5lIExPTkdfVQkJNTMJLyogdW5hcnkgTE9ORyAqLwotI2RlZmluZSBMT05HX0FGCQk1NAkvKiBMT05HIHdpdGggdGhlIGZpcnN0IHJlZ2lzdGVyIGEgZmxhZyByZWdpc3RlciAqLwotI2RlZmluZSBMT05HX0NNUAk1NQkvKiBzcGVjaWFsIGZvcm0gZm9yIENNUGNjIGFuZCBDTVBVY2MgKi8KLSNkZWZpbmUgTE9OR19NCQk1NgkvKiBNZW1vcnkgbG9uZyBmb3IgbGRiLCBzdGIgKi8KLSNkZWZpbmUgTE9OR19NMgkJNTcJLyogTWVtb3J5IGxvbmcgZm9yIGxkMncsIHN0MncgKi8KLSNkZWZpbmUgTE9OR18yCQk1OAkvKiBMT05HIHdpdGggMiBvcGVyYW5kczsgYnJhdG56ICovCi0jZGVmaW5lIExPTkdfMmIJCTU5CS8qIExPTkdfMiB3aXRoIG1vZGlmaWVyIG9mIDMgKi8KLSNkZWZpbmUgTE9OR19ECQk2MAkvKiBmb3IgREJSQUkqLwotI2RlZmluZSBMT05HX0RiCQk2MQkvKiBmb3IgcmVwZWF0aSovCi0KLSAgLyogdGhlIGV4ZWN1dGlvbiB1bml0KHMpIHVzZWQgKi8KLSAgaW50IHVuaXQ7Ci0jZGVmaW5lIEVJVEhFUgkwCi0jZGVmaW5lIElVCTEKLSNkZWZpbmUgTVUJMgotI2RlZmluZSBFSVRIRVJfQlVUX1BSRUZFUl9NVSAzCi0KLSAgLyogdGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlY2lkZSBpZiB0d28gaW5zdHJ1Y3Rpb25zICovCi0gIC8qIGNhbiBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCAqLwotICBsb25nIGZsYWdzX3VzZWQ7Ci0gIGxvbmcgZmxhZ3Nfc2V0OwotI2RlZmluZSBGTEFHXzAJCSgxTDw8MCkKLSNkZWZpbmUgRkxBR18xCQkoMUw8PDEpCi0jZGVmaW5lIEZMQUdfMgkJKDFMPDwyKQotI2RlZmluZSBGTEFHXzMJCSgxTDw8MykKLSNkZWZpbmUgRkxBR180CQkoMUw8PDQpCQkvKiBTIChzYXR1cmF0aW9uKSAqLwotI2RlZmluZSBGTEFHXzUJCSgxTDw8NSkJCS8qIFYgKG92ZXJmbG93KSAqLwotI2RlZmluZSBGTEFHXzYJCSgxTDw8NikJCS8qIFZBIChhY2N1bXVsYXRlZCBvdmVyZmxvdykgKi8KLSNkZWZpbmUgRkxBR183CQkoMUw8PDcpCQkvKiBDIChjYXJyeS9ib3Jyb3cpICovCi0jZGVmaW5lIEZMQUdfU00JCSgxTDw8OCkJCS8qIFNNIChzdGFjayBtb2RlKSAqLwotI2RlZmluZSBGTEFHX1JQCQkoMUw8PDkpCQkvKiBSUCAocmVwZWF0IGVuYWJsZSkgKi8KLSNkZWZpbmUgRkxBR19DT05UUk9MCSgxTDw8MTApCS8qIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0jZGVmaW5lIEZMQUdfQTAJCSgxTDw8MTEpCS8qIEEwICovCi0jZGVmaW5lIEZMQUdfQTEJCSgxTDw8MTIpCS8qIEExICovCi0jZGVmaW5lIEZMQUdfSk1QCSgxTDw8MTMpCS8qIGluc3RydWN0aW9uIGlzIGEgYnJhbmNoICovCi0jZGVmaW5lIEZMQUdfSlNSCSgxTDw8MTQpCS8qIHN1YnJvdXRpbmUgY2FsbC4gIG11c3QgYmUgYWxpZ25lZCAqLwotI2RlZmluZSBGTEFHX01FTQkoMUw8PDE1KQkvKiByZWFkcy93cml0ZXMgbWVtb3J5ICovCi0jZGVmaW5lIEZMQUdfMldPUkQJKDFMPDwxNikJLyogMiB3b3JkLzQgYnl0ZSBvcGVyYXRpb24gKi8KLSNkZWZpbmUgRkxBR19NVUwxNgkoMUw8PDE3KQkvKiAxNiBiaXQgbXVsdGlwbHkgKi8KLSNkZWZpbmUgRkxBR19NVUwzMgkoMUw8PDE4KQkvKiAzMiBiaXQgbXVsdGlwbHkgKi8KLSNkZWZpbmUgRkxBR19BRERTVUJwcHAJKDFMPDwxOSkJLyogQUREcHBwIG9yIFNVQnBwcCAqLwotI2RlZmluZSBGTEFHX0RFTEFZCSgxTDw8MjApCS8qIFRoaXMgaXMgYSBkZWxheWVkIGJyYW5jaCBvciBqdW1wICovCi0jZGVmaW5lIEZMQUdfTEtSCSgxTDw8MjEpCS8qIGluc24gaW4gbGVmdCBzbG90IGtpbGxzIHJpZ2h0IHNsb3QgKi8KLSNkZWZpbmUgRkxBR19DVlZBCShGTEFHXzV8RkxBR182fEZMQUdfNykKLSNkZWZpbmUgRkxBR19DCQlGTEFHXzcKLSNkZWZpbmUgRkxBR19BTEwJKEZMQUdfMCB8IFwKLQkJCSBGTEFHXzEgfCBcCi0JCQkgRkxBR18yIHwgXAotCQkJIEZMQUdfMyB8IFwKLQkJCSBGTEFHXzQgfCBcCi0JCQkgRkxBR181IHwgXAotCQkJIEZMQUdfNiB8IFwKLQkJCSBGTEFHXzcgfCBcCi0JCQkgRkxBR19TTSB8IFwKLQkJCSBGTEFHX1JQIHwgXAotCQkJIEZMQUdfQ09OVFJPTCkKLQotICBpbnQgcmVsb2NfZmxhZzsKLSNkZWZpbmUgUkVMT0NfUENSRUwJMQotI2RlZmluZSBSRUxPQ19BQlMJMgotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X29wY29kZSBkMzB2X29wY29kZV90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IGludCBkMzB2X251bV9vcGNvZGVzOwotCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfb3BlcmFuZC4gICovCi1zdHJ1Y3QgZDMwdl9vcGVyYW5kCi17Ci0gIC8qIHRoZSBsZW5ndGggb2YgdGhlIGZpZWxkICovCi0gIGludCBsZW5ndGg7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogcG9zaXRpb24gcmVsYXRpdmUgdG8gUmEgKi8KLSAgaW50IHBvc2l0aW9uOwotCi0gIC8qIHN5bnRheCBmbGFncy4gICovCi0gIGxvbmcgZmxhZ3M7Ci19OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkMzB2X29wZXJhbmQgZDMwdl9vcGVyYW5kX3RhYmxlW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgZDMwdl9vcGVyYW5kLiAgKi8KLQotLyogdGhpcyBpcyB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXI7IGl0IHdpbGwgYmUgbW9kaWZpZWQgKi8KLS8qIHRoaXMgaXMgdXNlZCBieSB0aGUgb3B0aW1pemVyICovCi0jZGVmaW5lIE9QRVJBTkRfREVTVAkoMSkKLQotLyogbnVtYmVyIG9yIHN5bWJvbCAqLwotI2RlZmluZSBPUEVSQU5EX05VTQkoMikKLQotLyogYWRkcmVzcyBvciBsYWJlbCAqLwotI2RlZmluZSBPUEVSQU5EX0FERFIJKDQpCi0KLS8qIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfUkVHCSg4KQotCi0vKiBwb3N0aW5jcmVtZW50ICsgICovCi0jZGVmaW5lIE9QRVJBTkRfUExVUwkoMHgxMCkKLQotLyogcG9zdGRlY3JlbWVudCAtICAqLwotI2RlZmluZSBPUEVSQU5EX01JTlVTCSgweDIwKQotCi0vKiBzaWduZWQgbnVtYmVyICovCi0jZGVmaW5lIE9QRVJBTkRfU0lHTkVECSgweDQwKQotCi0vKiB0aGlzIG9wZXJhbmQgbXVzdCBiZSBzaGlmdGVkIGxlZnQgYnkgMyAqLwotI2RlZmluZSBPUEVSQU5EX1NISUZUCSgweDgwKQotCi0vKiBmbGFnIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9QRVJBTkRfRkxBRwkoMHgxMDApCi0KLS8qIGNvbnRyb2wgcmVnaXN0ZXIgICovCi0jZGVmaW5lIE9QRVJBTkRfQ09OVFJPTAkoMHgyMDApCi0KLS8qIGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIE9QRVJBTkRfQUNDCSgweDQwMCkKLQotLyogQCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFNJR04JKDB4ODAwKQotCi0vKiBAKCAgKi8KLSNkZWZpbmUgT1BFUkFORF9BVFBBUgkoMHgxMDAwKQotCi0vKiBwcmVkZWNyZW1lbnQgbW9kZSAnQC1zcCcgICovCi0jZGVmaW5lIE9QRVJBTkRfQVRNSU5VUwkoMHgyMDAwKQotCi0vKiB0aGlzIG9wZXJhbmQgY2hhbmdlcyB0aGUgaW5zdHJ1Y3Rpb24gbmFtZSAqLwotLyogZm9yIGV4YW1wbGUsIENQTWNjLCBDTVBVY2MgKi8KLSNkZWZpbmUgT1BFUkFORF9OQU1FCSgweDQwMDApCi0KLS8qIGZha2Ugb3BlcmFuZCBmb3IgbXZ0c3lzIGFuZCBtdmZzeXMgKi8KLSNkZWZpbmUgT1BFUkFORF9TUEVDSUFMCSgweDgwMDApCi0KLS8qIGxldCB0aGUgb3B0aW1pemVyIGtub3cgdGhhdCB0d28gcmVnaXN0ZXJzIGFyZSBhZmZlY3RlZCAqLwotI2RlZmluZSBPUEVSQU5EXzJSRUcJKDB4MTAwMDApCi0KLS8qIFRoZSBmb3JtYXQgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IGQzMHZfZm9ybWF0LiAgKi8KLXN0cnVjdCBkMzB2X2Zvcm1hdAotewotICBpbnQJZm9ybTsJCS8qIFNIT1JUX0EsIExPTkcsIGV0YyAqLwotICBpbnQJbW9kaWZpZXI7CS8qIHR3byBiaXQgbW9kaWZpZXIgZm9sbG93aW5nIG9wY29kZSAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzWzVdOwotfTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZDMwdl9mb3JtYXQgZDMwdl9mb3JtYXRfdGFibGVbXTsKLQotCi0vKiBhbiBpbnN0cnVjdGlvbiBpcyBkZWZpbmVkIGJ5IGFuIG9wY29kZSBhbmQgYSBmb3JtYXQgKi8KLS8qIGZvciBleGFtcGxlLCAiYWRkIiBoYXMgb25lIG9wY29kZSwgYnV0IHRocmVlIGRpZmZlcmVudCAqLwotLyogZm9ybWF0cywgMiBTSE9SVF9BIGZvcm1zIGFuZCBhIExPTkcgZm9ybS4gKi8KLXN0cnVjdCBkMzB2X2luc24KLXsKLSAgc3RydWN0IGQzMHZfb3Bjb2RlICpvcDsJLyogcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgb3Bjb2RlIHRhYmxlICovCi0gIHN0cnVjdCBkMzB2X2Zvcm1hdCAqZm9ybTsJLyogcG9pbnRlciB0byBhbiBlbnRyeSBpbiB0aGUgZm9ybWF0IHRhYmxlICovCi0gIGludCBlY2M7CQkJLyogZXhlY3V0aW9uIGNvbmRpdGlvbiBjb2RlICovCi19OwotCi0vKiBhbiBleHByZXNzaW9uUyBvbmx5IGhhcyBvbmUgcmVnaXN0ZXIgdHlwZSwgc28gd2UgZmFrZSBpdCAqLwotLyogYnkgc2V0dGluZyBoaWdoIGJpdHMgdG8gaW5kaWNhdGUgdHlwZSAqLwotI2RlZmluZSBSRUdJU1RFUl9NQVNLCTB4RkYKLQotI2VuZGlmIC8qIEQzMFZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaDgzMDAuaCBiL2luY2x1ZGUvb3Bjb2RlL2g4MzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMDVlNGUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaDgzMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwNCArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIHRoZSBIOC0zMDAKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4sIHNhY0BjeWdudXMuY29tLgotICAgCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIHRoZSBHTlUgRGVidWdnZXIgYW5kIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBJbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBhcyBhIHNlcXVlbmNlIG9mIG5pYmJsZXMuCi0gICBJZiB0aGUgbmliYmxlIGhhcyB2YWx1ZSAxNSBvciBsZXNzIHRoZW4gdGhlIHJlcHJlc2VudGF0aW9uIGlzIGNvbXBsZXRlLgotICAgT3RoZXJ3aXNlLCB3ZSByZWNvcmQgd2hhdCBpdCBjb250YWlucyB3aXRoIHNldmVyYWwgZmxhZ3MuICAqLwotCi10eXBlZGVmIGludCBvcF90eXBlOwotCi0jZGVmaW5lIEhleDAJMAotI2RlZmluZSBIZXgxIAkxCi0jZGVmaW5lIEhleDIgCTIKLSNkZWZpbmUgSGV4MyAJMwotI2RlZmluZSBIZXg0IAk0Ci0jZGVmaW5lIEhleDUgCTUKLSNkZWZpbmUgSGV4NiAJNgotI2RlZmluZSBIZXg3IAk3Ci0jZGVmaW5lIEhleDggCTgKLSNkZWZpbmUgSGV4OSAJOQotI2RlZmluZSBIZXhBIAkxMAotI2RlZmluZSBIZXhCIAkxMQotI2RlZmluZSBIZXhDIAkxMgotI2RlZmluZSBIZXhEIAkxMwotI2RlZmluZSBIZXhFIAkxNAotI2RlZmluZSBIZXhGIAkxNQotCi0jZGVmaW5lIExfOAkJMHgwMQotI2RlZmluZSBMXzE2CQkweDAyCi0jZGVmaW5lIExfMzIJCTB4MDQKLSNkZWZpbmUgTF9QICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgTF8yNAkJMHgxMAotI2RlZmluZSBNRU1SRUxBWCAJMHgyMAkJCS8qIG1vdmUgaW5zbiB3aGljaCBtYXkgcmVsYXggKi8gCi0jZGVmaW5lIFNSQyAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIERTVCAgICAgICAgICAgICAweDgwCi0KLSNkZWZpbmUgUkVHCQkweDEwMAotI2RlZmluZSBFWFIJCTB4MjAwCi0jZGVmaW5lIE1BQ1JFRwkJMHg4MDAKLSNkZWZpbmUgU1JDX0lOX0RTVAkweDQwMAotI2RlZmluZSBJTU0JCTB4MTAwMAotI2RlZmluZSBESVNQCQkweDIwMDAKLSNkZWZpbmUgSU5ECQkweDQwMDAKLSNkZWZpbmUgSU5DCQkweDgwMDAKLSNkZWZpbmUgREVDCQkweDEwMDAwCi0jZGVmaW5lIExfMwkJMHgyMDAwMAotI2RlZmluZSBLQklUIAkJMHg0MDAwMAotI2RlZmluZSBEQklUICAgICAgICAgICAgMHg4MDAwMAotI2RlZmluZSBESVNQUkVHICAgICAgICAgMHgxMDAwMDAKLSNkZWZpbmUgSUdOT1JFIAkJMHgyMDAwMDAKLSNkZWZpbmUgRSAgICAgIAkJMHg0MDAwMDAJCS8qIEZJWE1FOiBlbmQgb2YgbmliYmxlIHNlcXVlbmNlPyAqLwotI2RlZmluZSBMXzIJCTB4ODAwMDAwCi0jZGVmaW5lIEIzMCAgCQkweDEwMDAwMDAgCQkvKiBiaXQgMyBtdXN0IGJlIGxvdyAqLwotI2RlZmluZSBCMzEgIAkJMHgyMDAwMDAwCQkvKiBiaXQgMyBtdXN0IGJlIGhpZ2ggKi8KLSNkZWZpbmUgQ0NSCQkweDQwMDAwMDAKLSNkZWZpbmUgQUJTICAgICAgICAgICAgIDB4ODAwMDAwMAotI2RlZmluZSBBQlNKTVAJCTB4MTAwMDAwMDAgIAotI2RlZmluZSBBQlM4TUVNICAgICAgICAgMHgyMDAwMDAwMAkKLSNkZWZpbmUgUENSRUwgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgTUVNSU5EICAgICAgICAgIDB4ODAwMDAwMDAKLQotI2RlZmluZSBJTU0zIAkJSU1NfExfMwotI2RlZmluZSBJTU0yIAkJSU1NfExfMgotCi0jZGVmaW5lIFNJWkUJCShMXzJ8TF8zfExfOHxMXzE2fExfMzJ8TF9QfExfMjQpCi0jZGVmaW5lIE1PREUJCShSRUd8SU1NfERJU1B8SU5EfElOQ3xERUN8Q0NSfEFCU3xNRU1JTkR8RVhSKQotCi0jZGVmaW5lIFJEOCAJCShEU1R8TF84fFJFRykKLSNkZWZpbmUgUkQxNiAJCShEU1R8TF8xNnxSRUcpCi0jZGVmaW5lIFJEMzIgCQkoRFNUfExfMzJ8UkVHKQotI2RlZmluZSBSUzggCQkoU1JDfExfOHxSRUcpCi0jZGVmaW5lIFJTMTYgCQkoU1JDfExfMTZ8UkVHKQotI2RlZmluZSBSUzMyCQkoU1JDfExfMzJ8UkVHKQotCi0jZGVmaW5lIFJTUCAJCShTUkN8TF9QfFJFRykKLSNkZWZpbmUgUkRQIAkJKERTVHxMX1B8UkVHKQotCi0jZGVmaW5lIElNTTggCQkoSU1NfFNSQ3xMXzgpCi0jZGVmaW5lIElNTTE2IAkJKElNTXxTUkN8TF8xNikKLSNkZWZpbmUgSU1NMzIgCQkoSU1NfFNSQ3xMXzMyKQotCi0jZGVmaW5lIEFCUzhTUkMgCShTUkN8QUJTfExfOHxBQlM4TUVNKQotI2RlZmluZSBBQlM4RFNUCQkoRFNUfEFCU3xMXzh8QUJTOE1FTSkKLQotI2RlZmluZSBESVNQOCAJCShQQ1JFTHxMXzgpCi0jZGVmaW5lIERJU1AxNiAJCShQQ1JFTHxMXzE2KQotCi0jZGVmaW5lIERJU1A4U1JDCShESVNQfExfOHxTUkMpCi0jZGVmaW5lIERJU1AxNlNSQwkoRElTUHxMXzE2fFNSQykKLQotI2RlZmluZSBESVNQOERTVAkoRElTUHxMXzh8RFNUKQotI2RlZmluZSBESVNQMTZEU1QJKERJU1B8TF8xNnxEU1QpCi0KLSNkZWZpbmUgQUJTMTZTUkMgCShTUkN8QUJTfExfMTYpCi0jZGVmaW5lIEFCUzE2RFNUIAkoRFNUfEFCU3xMXzE2KQotI2RlZmluZSBBQlMyNFNSQyAJKFNSQ3xBQlN8TF8yNCkKLSNkZWZpbmUgQUJTMjREU1QgCShEU1R8QUJTfExfMjQpCi0jZGVmaW5lIEFCUzMyU1JDIAkoU1JDfEFCU3xMXzMyKQotI2RlZmluZSBBQlMzMkRTVCAJKERTVHxBQlN8TF8zMikKLQotI2RlZmluZSBSRERFQyAJCShEU1R8REVDKQotI2RlZmluZSBSU0lOQyAJCShTUkN8SU5DKQotI2RlZmluZSBSRElOQwkJKERTVHxJTkMpCi0KLSNkZWZpbmUgUkRJTkQgCQkoRFNUfElORCkKLSNkZWZpbmUgUlNJTkQgCQkoU1JDfElORCkKLQotI2lmIDEKLSNkZWZpbmUgT1I4IFJTOAkJLyogPz8/IE9SIGFzIGluIE9uZSBSZWdpc3Rlcj8gKi8KLSNkZWZpbmUgT1IxNiBSUzE2Ci0jZGVmaW5lIE9SMzIgUlMzMgotI2Vsc2UKLSNkZWZpbmUgT1I4IFJEOAotI2RlZmluZSBPUjE2IFJEMTYKLSNkZWZpbmUgT1IzMiBSRDMyCi0jZW5kaWYKLQotc3RydWN0IGNvZGUgCi17Ci0gIG9wX3R5cGUgbmliWzMwXTsKLX07Ci0KLXN0cnVjdCBhcmcgCi17Ci0gIG9wX3R5cGUgbmliWzNdOwotfTsKLQotc3RydWN0IGg4X29wY29kZSAKLXsKLSAgaW50IGhvdzsKLSAgaW50IGluYmFzZTsKLSAgaW50IHRpbWU7Ci0gIGNoYXIgKm5hbWU7Ci0gIHN0cnVjdCBhcmcgYXJnczsKLSAgc3RydWN0IGNvZGUgZGF0YTsKLSAgaW50IGxlbmd0aDsKLSAgaW50IG5vcGVyYW5kczsKLSAgaW50IGlkeDsKLSAgaW50IHNpemU7Ci19OwotCi0jaWZkZWYgREVGSU5FX1RBQkxFCi0KLSNkZWZpbmUgQklUT1AoY29kZSwgaW1tLCBuYW1lLCBvcDAwLCBvcDAxLG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApXAoteyBjb2RlLCAxLCAyLCBuYW1lLAl7e2ltbSxSRDgsRX19LAl7e29wMDAsIG9wMDEsIGltbSwgUkQ4LCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LFwKLXsgY29kZSwgMSwgNiwgbmFtZSwJe3tpbW0sUkRJTkQsRX19LHt7b3AxMCwgb3AxMSwgQjMwfFJESU5ELCAwLCBvcDAwLG9wMDEsIGltbSwgMCwgRX19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDEsIDYsIG5hbWUsCXt7aW1tLEFCUzhEU1QsRX19LHt7b3AyMCwgb3AyMSwgQUJTOERTVCwgSUdOT1JFLCBvcDAwLG9wMDEsIGltbSwgMCxFfX0sIDAsIDAsIDAsIDB9XAotLHsgY29kZSwgMCwgNiwgbmFtZSwJe3tpbW0sQUJTMTZEU1QsRX19LHt7MHg2LDB4YSwweDEsb3AzMCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSwgb3AwMCxvcDAxLCBpbW0sIDAsRX19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDAsIDYsIG5hbWUsCXt7aW1tLEFCUzMyRFNULEV9fSx7ezB4NiwweGEsMHgzLG9wMzAsQUJTMzJEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLCBvcDAwLG9wMDEsIGltbSwgMCxFfX0sIDAsIDAsIDAsIDB9Ci0KLQotI2RlZmluZSBFQklUT1AoY29kZSwgaW1tLCBuYW1lLCBvcDAwLCBvcDAxLG9wMTAsb3AxMSwgb3AyMCxvcDIxLG9wMzApXAotICAgQklUT1AoY29kZSxpbW0sIG5hbWUsIG9wMDArMSwgb3AwMSwgb3AxMCxvcDExLCBvcDIwLG9wMjEsb3AzMCksXAotICAgQklUT1AoY29kZSxSUzgsICBuYW1lLCBvcDAwLCBvcDAxLCBvcDEwLG9wMTEsIG9wMjAsb3AyMSxvcDMwKQotCi0jZGVmaW5lIFdUV09QKGNvZGUsbmFtZSwgb3AxLCBvcDIpIFwKLXsgY29kZSwgMSwgMiwgbmFtZSwge3tSUzE2LCBSRDE2LCBFfX0sIHt7IG9wMSwgb3AyLCBSUzE2LCBSRDE2LCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9Ci0KLSNkZWZpbmUgQlJBTkNIKGNvZGUsIG5hbWUsIG9wKSBcCi17IGNvZGUsIDEsIDQsbmFtZSx7e0RJU1A4LEUsMH19LCB7eyAweDQsIG9wLCBESVNQOCwgSUdOT1JFLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IGNvZGUsIDAsIDYsbmFtZSx7e0RJU1AxNixFLDB9fSwge3sgMHg1LCAweDgsIG9wLCAweDAsIERJU1AxNiwgSUdOT1JFLCBJR05PUkUsIElHTk9SRSwgRSwwfX0sIDAsIDAsIDAsIDB9IAotCi0jZGVmaW5lIFNPUChjb2RlLCB4LG5hbWUpIFwKLXtjb2RlLCAxLCB4LCAgbmFtZSAKLQotI2RlZmluZSBORVdfU09QKGNvZGUsIGluLHgsbmFtZSkgXAote2NvZGUsIGluLCB4LCAgbmFtZSAKLSNkZWZpbmUgRU9QICAsMCwwLDAgfQotCi0jZGVmaW5lIFRXT09QKGNvZGUsIG5hbWUsIG9wMSwgb3AyLG9wMykgXAoteyBjb2RlLDEsIDIsbmFtZSwge3tJTU04LCBSRDgsIEV9fSwJe3sgb3AxLCBSRDgsIElNTTgsIElHTk9SRSwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSxcCi17IGNvZGUsIDEsIDIsbmFtZSwge3tSUzgsIFJEOCwgRX19LAl7eyBvcDIsIG9wMywgUlM4LCBSRDgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0gCi0KLSNkZWZpbmUgVU5PUChjb2RlLG5hbWUsIG9wMSwgb3AyKSBcCi17IGNvZGUsIDEsIDIsIG5hbWUsIHt7T1I4LCBFLCAwfX0sIHt7IG9wMSwgb3AyLCAwLCBPUjgsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0KLQotI2RlZmluZSBVTk9QMyhjb2RlLCBuYW1lLCBvcDEsIG9wMiwgb3AzKSBcCi17IE8oY29kZSxTQiksIDEsIDIsIG5hbWUsIHt7T1I4LCAgRSwgMH19LCB7e29wMSwgb3AyLCBvcDMrMCwgT1I4LCAgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSwgXAoteyBPKGNvZGUsU1cpLCAwLCAyLCBuYW1lLCB7e09SMTYsIEUsIDB9fSwge3tvcDEsIG9wMiwgb3AzKzEsIE9SMTYsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNMKSwgMCwgMiwgbmFtZSwge3tPUjMyLCBFLCAwfX0sIHt7b3AxLCBvcDIsIG9wMyszLCBPUjMyfEIzMCwgRSwgMCwgMCwgMCwgMH19LCAwLCAwLCAwLCAwfSBcCi0seyBPKGNvZGUsU0IpLCAxLCAyLCBuYW1lLCB7e0lNTSwgT1I4IHwgU1JDX0lOX0RTVCwgIEV9fSwge3tvcDEsIG9wMiwgb3AzKzQsIE9SOCB8IFNSQ19JTl9EU1QsICBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9LCBcCi17IE8oY29kZSxTVyksIDAsIDIsIG5hbWUsIHt7SU1NLCBPUjE2IHwgU1JDX0lOX0RTVCwgRX19LCB7e29wMSwgb3AyLCBvcDMrNSwgT1IxNiB8IFNSQ19JTl9EU1QsIEUsIDAsIDAsIDAsIDB9fSwgMCwgMCwgMCwgMH0sIFwKLXsgTyhjb2RlLFNMKSwgMCwgMiwgbmFtZSwge3tJTU0sIE9SMzIgfCBTUkNfSU5fRFNULCBFfX0sIHt7b3AxLCBvcDIsIG9wMys3LCBPUjMyIHwgU1JDX0lOX0RTVHxCMzAgLCBFLCAwLCAwLCAwLCAwfX0sIDAsIDAsIDAsIDB9Ci0KLQotI2RlZmluZSBJTU0zMkxJU1QgSU1NMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIElNTTI0TElTVCBJTU0yNCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIElNTTE2TElTVCBJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMTZMSVNUIExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgRElTUDI0TElTVCBESVNQfExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBESVNQMzJMSVNUIERJU1B8TF8zMixJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQUJTMjRMSVNUIEFCU3xMXzI0LElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUKLSNkZWZpbmUgQUJTMzJMSVNUIEFCU3xMXzMyLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMjRMSVNUIExfMjQsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRQotI2RlZmluZSBBMzJMSVNUIExfMzIsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFCi0jZGVmaW5lIFBSRUZJWDMyIDB4MCwweDEsMHgwLDB4MAotI2RlZmluZSBQUkVGSVhMREMgMHgwLDB4MSwweDQsMHgwCi0KLQotI2RlZmluZSBPKG9wLCBzaXplKSAob3AqNCtzaXplKQotCi0jZGVmaW5lIE9fUkVDT01QSUxFIDAKLSNkZWZpbmUgT19BREQgIDEKLSNkZWZpbmUgT19BRERYIDIKLSNkZWZpbmUgT19BTkQgIDMKLSNkZWZpbmUgT19CQU5EIDQKLSNkZWZpbmUgT19CUkEgIDUKLSNkZWZpbmUgT19CUk4gIDYKLSNkZWZpbmUgT19CSEkgIDcKLSNkZWZpbmUgT19CTFMgIDgKLSNkZWZpbmUgT19CQ0MgIDkKLSNkZWZpbmUgT19CQ1MgIDEwCi0jZGVmaW5lIE9fQk5FICAxMSAgCi0jZGVmaW5lIE9fQlZDICAxMgotI2RlZmluZSBPX0JWUyAgMTMKLSNkZWZpbmUgT19CUEwgIDE0Ci0jZGVmaW5lIE9fQk1JICAxNQotI2RlZmluZSBPX0JHRSAgMTYKLSNkZWZpbmUgT19CTFQgIDE3Ci0jZGVmaW5lIE9fQkdUICAxOAotI2RlZmluZSBPX0JMRSAgMTkKLSNkZWZpbmUgT19BTkRDIDIwCi0jZGVmaW5lIE9fQkVRIDIxCi0jZGVmaW5lIE9fQkNMUiAyMgotI2RlZmluZSBPX0JJQU5EIDIzCi0jZGVmaW5lIE9fQklMRCAyNAotI2RlZmluZSBPX0JJT1IgMjUKLSNkZWZpbmUgT19CSVhPUiAyNgotI2RlZmluZSBPX0JJU1QgMjcKLSNkZWZpbmUgT19CTEQgMjgKLSNkZWZpbmUgT19CTk9UIDI5Ci0jZGVmaW5lIE9fQlNFVCAzMAotI2RlZmluZSBPX0JTUiAzMQotI2RlZmluZSBPX0JYT1IgMzIKLSNkZWZpbmUgT19DTVAgMzMKLSNkZWZpbmUgT19EQUEgMzQKLSNkZWZpbmUgT19EQVMgMzUKLSNkZWZpbmUgT19ERUMgMzYKLSNkZWZpbmUgT19ESVZVIDM3Ci0jZGVmaW5lIE9fRElWUyAzOAotI2RlZmluZSBPX0lOQyAzOQotI2RlZmluZSBPX0xEQyA0MAotI2RlZmluZSBPX01PVl9UT19NRU0gNDEKLSNkZWZpbmUgT19PUiA0MgotI2RlZmluZSBPX1JPVEwgNDMKLSNkZWZpbmUgT19ST1RSIDQ0Ci0jZGVmaW5lIE9fUk9UWEwgNDUKLSNkZWZpbmUgT19ST1RYUiA0NgotI2RlZmluZSBPX0JQVCA0NwotI2RlZmluZSBPX1NIQUwgNDgKLSNkZWZpbmUgT19TSEFSIDQ5Ci0jZGVmaW5lIE9fU0hMTCA1MAotI2RlZmluZSBPX1NITFIgNTEKLSNkZWZpbmUgT19TVUIgIDUyCi0jZGVmaW5lIE9fU1VCUyA1MwotI2RlZmluZSBPX1RSQVBBIDU0Ci0jZGVmaW5lIE9fWE9SIDU1Ci0jZGVmaW5lIE9fWE9SQyA1NgotI2RlZmluZSBPX0JPUiA1NwotI2RlZmluZSBPX0JTVCA1OAotI2RlZmluZSBPX0JUU1QgNTkKLSNkZWZpbmUgT19FRVBNT1YgNjAKLSNkZWZpbmUgT19FWFRTIDYxCi0jZGVmaW5lIE9fRVhUVSA2MgotI2RlZmluZSBPX0pNUCA2MwotI2RlZmluZSBPX0pTUiA2NAotI2RlZmluZSBPX01VTFUgNjUKLSNkZWZpbmUgT19NVUxTIDY2Ci0jZGVmaW5lIE9fTk9QIDY3Ci0jZGVmaW5lIE9fTk9UIDY4Ci0jZGVmaW5lIE9fT1JDIDY5Ci0jZGVmaW5lIE9fUlRFIDcwCi0jZGVmaW5lIE9fU1RDIDcxCi0jZGVmaW5lIE9fU1VCWCA3MgotI2RlZmluZSBPX05FRyA3MwotI2RlZmluZSBPX1JUUyA3NAotI2RlZmluZSBPX1NMRUVQIDc1Ci0jZGVmaW5lIE9fSUxMIDc2Ci0jZGVmaW5lIE9fQUREUyA3NwotI2RlZmluZSBPX1NZU0NBTEwgNzgKLSNkZWZpbmUgT19NT1ZfVE9fUkVHIDc5Ci0jZGVmaW5lIE9fVEFTIDgwCi0jZGVmaW5lIE9fQ0xSTUFDIDgyCi0jZGVmaW5lIE9fTERNQUMgODMKLSNkZWZpbmUgT19NQUMgODQKLSNkZWZpbmUgT19MRE0gODUKLSNkZWZpbmUgT19TVE0gODYKLSNkZWZpbmUgT19TVE1BQyA4NwotI2RlZmluZSBPX0xBU1QgODgKLSNkZWZpbmUgU0IgMAotI2RlZmluZSBTVyAxCi0jZGVmaW5lIFNMIDIKLSNkZWZpbmUgU04gMwotCi0KLS8qIEZJWE1FOiBMb3RzIG9mIGluc25zIGhhdmUgIkUsIDAsIDAsIDAsIDAiIGluIHRoZSBuaWJibGUgY29kZSBzZXF1ZW5jZXMuCi0gICBNZXRoaW5rcyB0aGUgemVyb2VzIGFyZW4ndCBuZWNlc3NhcnkuICBPbmNlIGNvbmZpcm1lZCwgbnVrZSAnZW0uICAqLwotCi1zdHJ1Y3QgaDhfb3Bjb2RlIGg4X29wY29kZXNbXSA9IAotewotICBUV09PUChPKE9fQURELFNCKSwiYWRkLmIiLCAweDgsIDB4MCwweDgpLAotICAKLSAgTkVXX1NPUChPKE9fQURELFNXKSwxLDIsImFkZC53Iikse3tSUzE2LFJEMTYsRX19LHt7MHgwLDB4OSxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNXKSwwLDQsImFkZC53Iikse3tJTU0xNixSRDE2LEV9fSx7ezB4NywweDksMHgxLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQURELFNMKSwwLDIsImFkZC5sIikse3tSUzMyLFJEMzIsRSB9fSwge3sweDAsMHhBLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FERCxTTCksMCw2LCJhZGQubCIpLHt7SU1NMzIsUkQzMixFIH19LHt7MHg3LDB4QSwweDEsQjMwfFJEMzIsSU1NMzJMSVNULEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FERFMsU0wpLDEsMiwiYWRkcyIpLCB7e0tCSVQsUkRQLEV9fSwgICB7ezB4MCwweEIsS0JJVCxSRFAsRSwwLDAsMCwwfX0gRU9QLAotCi0gIFRXT09QKE8oT19BRERYLFNCKSwiYWRkeCIsMHg5LDB4MCwweEUpLAotICBUV09PUChPKE9fQU5ELFNCKSwgImFuZC5iIiwweEUsMHgxLDB4NiksCi0KLSAgTkVXX1NPUChPKE9fQU5ELFNXKSwwLDIsImFuZC53Iikse3tSUzE2LFJEMTYsRSB9fSx7ezB4NiwweDYsUlMxNixSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0FORCxTVyksMCw0LCJhbmQudyIpLHt7SU1NMTYsUkQxNixFIH19LHt7MHg3LDB4OSwweDYsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX0gRU9QLAotICAKLSAgTkVXX1NPUChPKE9fQU5ELFNMKSwwLDYsImFuZC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NixCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5ELFNMKSwwLDIsImFuZC5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NixCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX0FOREMsU0IpLDEsMiwiYW5kYyIpLCB7e0lNTTgsQ0NSLEV9fSx7eyAweDAsMHg2LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLSAgTkVXX1NPUChPKE9fQU5EQyxTQiksMSwyLCJhbmRjIiksIHt7SU1NOCxFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDAsMHg2LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLQotICBCSVRPUChPKE9fQkFORCxTQiksIElNTTN8QjMwLCJiYW5kIiwweDcsMHg2LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCUkFOQ0goTyhPX0JSQSxTQiksImJyYSIsMHgwKSwKLSAgQlJBTkNIKE8oT19CUkEsU0IpLCJidCIsMHgwKSwKLSAgQlJBTkNIKE8oT19CUk4sU0IpLCJicm4iLDB4MSksCi0gIEJSQU5DSChPKE9fQlJOLFNCKSwiYmYiLDB4MSksCi0gIEJSQU5DSChPKE9fQkhJLFNCKSwiYmhpIiwweDIpLAotICBCUkFOQ0goTyhPX0JMUyxTQiksImJscyIsMHgzKSwKLSAgQlJBTkNIKE8oT19CQ0MsU0IpLCJiY2MiLDB4NCksCi0gIEJSQU5DSChPKE9fQkNDLFNCKSwiYmhzIiwweDQpLAotICBCUkFOQ0goTyhPX0JDUyxTQiksImJjcyIsMHg1KSwKLSAgQlJBTkNIKE8oT19CQ1MsU0IpLCJibG8iLDB4NSksCi0gIEJSQU5DSChPKE9fQk5FLFNCKSwiYm5lIiwweDYpLAotICBCUkFOQ0goTyhPX0JFUSxTQiksImJlcSIsMHg3KSwKLSAgQlJBTkNIKE8oT19CVkMsU0IpLCJidmMiLDB4OCksCi0gIEJSQU5DSChPKE9fQlZTLFNCKSwiYnZzIiwweDkpLAotICBCUkFOQ0goTyhPX0JQTCxTQiksImJwbCIsMHhBKSwKLSAgQlJBTkNIKE8oT19CTUksU0IpLCJibWkiLDB4QiksCi0gIEJSQU5DSChPKE9fQkdFLFNCKSwiYmdlIiwweEMpLAotICBCUkFOQ0goTyhPX0JMVCxTQiksImJsdCIsMHhEKSwKLSAgQlJBTkNIKE8oT19CR1QsU0IpLCJiZ3QiLDB4RSksCi0gIEJSQU5DSChPKE9fQkxFLFNCKSwiYmxlIiwweEYpLAotCi0gIEVCSVRPUChPKE9fQkNMUixTQiksSU1NM3xCMzAsImJjbHIiLCAweDYsMHgyLDB4NywweEQsMHg3LDB4RiwweDgpLAotICBCSVRPUChPKE9fQklBTkQsU0IpLElNTTN8QjMxLCJiaWFuZCIsMHg3LDB4NiwweDcsMHhDLDB4NywweEUsMHgwKSwKLSAgQklUT1AoTyhPX0JJTEQsU0IpLCBJTU0zfEIzMSwiYmlsZCIsIDB4NywweDcsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CSU9SLFNCKSwgSU1NM3xCMzEsImJpb3IiLCAweDcsMHg0LDB4NywweEMsMHg3LDB4RSwweDApLAotICBCSVRPUChPKE9fQklTVCxTQiksIElNTTN8QjMxLCJiaXN0IiwgMHg2LDB4NywweDcsMHhELDB4NywweEYsMHg4KSwKLSAgQklUT1AoTyhPX0JJWE9SLFNCKSxJTU0zfEIzMSwiYml4b3IiLDB4NywweDUsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CTEQsU0IpLCAgSU1NM3xCMzAsImJsZCIsICAweDcsMHg3LDB4NywweEMsMHg3LDB4RSwweDApLAotICBFQklUT1AoTyhPX0JOT1QsU0IpLElNTTN8QjMwLCJibm90IiwgMHg2LDB4MSwweDcsMHhELDB4NywweEYsMHg4KSwKLSAgQklUT1AoTyhPX0JPUixTQiksICBJTU0zfEIzMCwiYm9yIiwgIDB4NywweDQsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEVCSVRPUChPKE9fQlNFVCxTQiksSU1NM3xCMzAsImJzZXQiLCAweDYsMHgwLDB4NywweEQsMHg3LDB4RiwweDgpLAotCi0gIFNPUChPKE9fQlNSLFNCKSw2LCJic3IiKSx7e0RJU1A4LEUsMH19LHt7IDB4NSwweDUsRElTUDgsSUdOT1JFLEUsMCwwLDAsMH19IEVPUCwKLSAgU09QKE8oT19CU1IsU0IpLDYsImJzciIpLHt7RElTUDE2LEUsMH19LHt7IDB4NSwweEMsMHgwLDB4MCxESVNQMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRSwwLDAsMCwwfX0gRU9QLAotICBCSVRPUChPKE9fQlNULFNCKSwgSU1NM3xCMzAsImJzdCIsMHg2LDB4NywweDcsMHhELDB4NywweEYsMHg4KSwKLSAgRUJJVE9QKE8oT19CVFNULFNCKSwgSU1NM3xCMzAsImJ0c3QiLDB4NiwweDMsMHg3LDB4QywweDcsMHhFLDB4MCksCi0gIEJJVE9QKE8oT19CWE9SLFNCKSwgSU1NM3xCMzAsImJ4b3IiLDB4NywweDUsMHg3LDB4QywweDcsMHhFLDB4MCksCi0KLSAgVFdPT1AoTyhPX0NNUCxTQiksICJjbXAuYiIsMHhBLDB4MSwweEMpLAotICBXVFdPUChPKE9fQ01QLFNXKSwgImNtcC53IiwweDEsMHhEKSwKLQotICBORVdfU09QKE8oT19DTVAsU1cpLDEsMiwiY21wLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHgxLDB4RCxSUzE2LFJEMTYsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQ01QLFNXKSwwLDQsImNtcC53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4MixSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fQ01QLFNMKSwwLDYsImNtcC5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MixCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fQ01QLFNMKSwwLDIsImNtcC5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDEsMHhGLEIzMXxSUzMyLEIzMHxSRDMyLEV9fSBFT1AsCi0KLSAgVU5PUChPKE9fREFBLFNCKSwgImRhYSIsMHgwLDB4RiksCi0gIFVOT1AoTyhPX0RBUyxTQiksICJkYXMiLDB4MSwweEYpLAotICBVTk9QKE8oT19ERUMsU0IpLCAiZGVjLmIiLDB4MSwweEEpLAotCi0gIE5FV19TT1AoTyhPX0RFQywgU1cpLDAsMiwiZGVjLnciKSAse3tEQklULFJEMTYsRSB9fSx7ezB4MSwweEIsMHg1fERCSVQsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19ERUMsIFNMKSwwLDIsImRlYy5sIikgLHt7REJJVCxSRDMyLEUgfX0se3sweDEsMHhCLDB4N3xEQklULFJEMzJ8QjMwLEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fRElWVSxTQiksMSw2LCJkaXZ4dS5iIiksIHt7UlM4LFJEMTYsRX19LCB7ezB4NSwweDEsUlM4LFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0RJVlUsU1cpLDAsMjAsImRpdnh1LnciKSx7e1JTMTYsUkQzMixFfX0se3sweDUsMHgzLFJTMTYsQjMwfFJEMzIsRX19RU9QLAotICAgIAotICBORVdfU09QKE8oT19ESVZTLFNCKSwwLDIwLCJkaXZ4cy5iIikgLHt7UlM4LFJEMTYsRSB9fSx7ezB4MCwweDEsMHhELDB4MCwweDUsMHgxLFJTOCxSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0RJVlMsU1cpLDAsMDIsImRpdnhzLnciKSAse3tSUzE2LFJEMzIsRSB9fSx7ezB4MCwweDEsMHhELDB4MCwweDUsMHgzLFJTMTYsQjMwfFJEMzIsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19FRVBNT1YsU0IpLDEsNTAsImVlcG1vdi5iIikse3tFLDAsMH19LHt7MHg3LDB4QiwweDUsMHhDLDB4NSwweDksMHg4LDB4RixFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VFUE1PVixTVyksMCw1MCwiZWVwbW92LnciKSx7e0UsMCwwfX0se3sweDcsMHhCLDB4RCwweDQsMHg1LDB4OSwweDgsMHhGLEV9fSBFT1AsCi0gICAgCi0gIE5FV19TT1AoTyhPX0VYVFMsU1cpLDAsMiwiZXh0cy53Iikse3tPUjE2LEUsMH19LHt7MHgxLDB4NywweEQsT1IxNixFICAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VYVFMsU0wpLDAsMiwiZXh0cy5sIikse3tPUjMyLEUsMH19LHt7MHgxLDB4NywweEYsT1IzMnxCMzAsRSAgIH19RU9QLAotCi0gIE5FV19TT1AoTyhPX0VYVFUsU1cpLDAsMiwiZXh0dS53Iikse3tPUjE2LEUsMH19LHt7MHgxLDB4NywweDUsT1IxNixFICAgfX1FT1AsCi0gIE5FV19TT1AoTyhPX0VYVFUsU0wpLDAsMiwiZXh0dS5sIikse3tPUjMyLEUsMH19LHt7MHgxLDB4NywweDcsT1IzMnxCMzAsRSAgIH19RU9QLAotICAgIAotICBVTk9QKE8oT19JTkMsU0IpLCAiaW5jIiwweDAsMHhBKSwKLQotICBORVdfU09QKE8oT19JTkMsU1cpLDAsMiwiaW5jLnciKSAse3tEQklULFJEMTYsRSB9fSx7ezB4MCwweEIsMHg1fERCSVQsUkQxNixFfX0gRU9QLAotICBORVdfU09QKE8oT19JTkMsU0wpLDAsMiwiaW5jLmwiKSAse3tEQklULFJEMzIsRSB9fSx7ezB4MCwweEIsMHg3fERCSVQsUkQzMnxCMzAsRX19IEVPUCwKLQotICBTT1AoTyhPX0pNUCxTQiksNCwiam1wIikse3tSU0lORCxFLDB9fSx7ezB4NSwweDksQjMwfFJTSU5ELDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19KTVAsU0IpLDYsImptcCIpLHt7U1JDfEFCU0pNUCxFLDB9fSx7ezB4NSwweEEsU1JDfEFCU0pNUCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19KTVAsU0IpLDgsImptcCIpLHt7U1JDfE1FTUlORCxFLDB9fSx7ezB4NSwweEIsU1JDfE1FTUlORCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgU09QKE8oT19KU1IsU0IpLDYsImpzciIpLHt7U1JDfFJTSU5ELEUsMH19LCB7ezB4NSwweEQsQjMwfFJTSU5ELDB4MCxFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19KU1IsU0IpLDgsImpzciIpLHt7U1JDfEFCU0pNUCxFLDB9fSx7ezB4NSwweEUsU1JDfEFCU0pNUCxJR05PUkUsSUdOT1JFLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19KU1IsU0IpLDgsImpzciIpLHt7U1JDfE1FTUlORCxFLDB9fSx7ezB4NSwweEYsU1JDfE1FTUlORCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTERDLFNCKSwxLDIsImxkYyIpLHt7SU1NOCxDQ1IsRX19LCAgICAgICAgIHt7IDB4MCwweDcsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e09SOCxDQ1IsRX19LCAgICAgICAgICB7eyAweDAsMHgzLDB4MCxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzE2U1JDLENDUixFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4MCwweDAsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tBQlMzMlNSQyxDQ1IsRX19LCAgICAge3tQUkVGSVhMREMsMHg2LDB4QiwweDIsMHgwLFNSQ3xBQlMzMkxJU1QsRX19RU9QLAotICBORVdfU09QKE8oT19MREMsU0IpLDAsMiwibGRjIikse3tESVNQfFNSQ3xMXzE2LENDUixFfX0se3tQUkVGSVhMREMsMHg2LDB4RixCMzB8RElTUFJFRywwLERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMzIsQ0NSLEV9fSx7e1BSRUZJWExEQywweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweDIsMHgwLFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkMsQ0NSLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweEQsQjMwfFJTSU5DLDB4MCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e1JTSU5ELENDUixFfX0sICAgICAgICB7e1BSRUZJWExEQywweDYsMHg5LEIzMHxSRElORCwweDAsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19MREMsU0IpLDEsMiwibGRjIikse3tJTU04LEVYUixFfX0sICAgICAgICAge3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDcsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMSwyLCJsZGMiKSx7e09SOCxFWFIsRX19LCAgICAgICAgICB7eyAweDAsMHgzLDB4MSxPUjgsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0FCUzE2U1JDLEVYUixFfX0sICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4YiwweDAsMHgwLEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7QUJTMzJTUkMsRVhSLEV9fSwgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHhiLDB4MiwweDAsU1JDfEFCUzMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMTYsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4ZixCMzB8RElTUFJFRywwLERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e0RJU1B8U1JDfExfMzIsRVhSLEV9fSx7eyAweDAsMHgxLDB4NCwweDEsMHg3LDB4OCxCMzB8RElTUFJFRywwLDB4NiwweEIsMHgyLDB4MCxTUkN8RElTUDMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX0xEQyxTQiksMCwyLCJsZGMiKSx7e1JTSU5DLEVYUixFfX0sICAgICAgICB7eyAweDAsMHgxLDB4NCwweDEsMHg2LDB4ZCxCMzB8UlNJTkMsMHgwLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fTERDLFNCKSwwLDIsImxkYyIpLHt7UlNJTkQsRVhSLEV9fSwgICAgICAgIHt7IDB4MCwweDEsMHg0LDB4MSwweDYsMHg5LEIzMHxSRElORCwweDAsRX19IEVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tBQlN8U1JDfExfMTZ8TUVNUkVMQVgsUkQ4LEV9fSwgIHt7IDB4NiwweEEsMHgwLFJEOCxTUkN8QUJTfE1FTVJFTEFYfEExNkxJU1QsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDYsIm1vdi5iIikse3tBQlN8U1JDfExfMzJ8TUVNUkVMQVgsUkQ4LEUgfX0sIHt7IDB4NiwweEEsMHgyLFJEOCxTUkN8QUJTfE1FTVJFTEFYfEEzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw0LCJtb3YuYiIpLHt7UlM4LEFCU3xMXzE2fE1FTVJFTEFYfERTVCxFfX0sICAgICB7eyAweDYsMHhBLDB4OCxSUzgsRFNUfEFCU3xNRU1SRUxBWHxBMTZMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNCKSw2LCJtb3YuYiIpLHt7UlM4LEFCU3xEU1R8TF8zMnxNRU1SRUxBWCxFIH19LCAgICB7eyAweDYsMHhBLDB4QSxSUzgsRFNUfEFCU3xNRU1SRUxBWHxBMzJMSVNULEUgfX1FT1AsCi0gICAgCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0RJU1B8TF8zMnxTUkMsUkQ4LEV9fSwgIHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEEsMHgyLFJEOCxTUkN8RElTUDMyTElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxESVNQfExfMzJ8RFNULEV9fSwgIHt7IDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEEsMHhBLFJTOCxEU1R8RElTUDMyTElTVCxFfX1FT1AsCi0KLQotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMiwibW92LmIiKSx7e1JTOCxSRDgsRX19LAkgICAge3sgMHgwLDB4QyxSUzgsUkQ4LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDIsIm1vdi5iIikse3tJTU04LFJEOCxFfX0sICAgICAgICAgICB7eyAweEYsUkQ4LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tSU0lORCxSRDgsRX19LCAgICAgICAgICB7eyAweDYsMHg4LEIzMHxSU0lORCxSRDgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e0RJU1AxNlNSQyxSRDgsRX19LCAgICAgIHt7IDB4NiwweEUsQjMwfERJU1BSRUcsUkQ4LERJU1AxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksNiwibW92LmIiKSx7e1JTSU5DLFJEOCxFfX0sICAgICAgICAgIHt7IDB4NiwweEMsQjMwfFJTSU5DLFJEOCxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0IpLDQsIm1vdi5iIikse3tBQlM4U1JDLFJEOCxFfX0sICAgICAgICB7eyAweDIsUkQ4LEFCUzhTUkMsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsUkRJTkQsRX19LCAgICAgICAgICB7eyAweDYsMHg4LFJESU5EfEIzMSxSUzgsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxESVNQMTZEU1QsRX19LCAgICAgIHt7IDB4NiwweEUsRElTUFJFR3xCMzEsUlM4LERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTQiksNiwibW92LmIiKSx7e1JTOCxSRERFQ3xCMzEsRX19LCAgICAgIHt7IDB4NiwweEMsUkRERUN8QjMxLFJTOCxFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDQsIm1vdi5iIikse3tSUzgsQUJTOERTVCxFfX0sICAgICAgICB7eyAweDMsUlM4LEFCUzhEU1QsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsUkRJTkQsRX19LCAgICAgICAge3sgMHg2LDB4OSxSRElORHxCMzEsUlMxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7RElTUHxMXzMyfFNSQyxSRDE2LEV9fSx7eyAweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhCLDB4MixSRDE2LFNSQ3xESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixESVNQfExfMzJ8RFNULEV9fSx7eyAweDcsMHg4LEIzMHxESVNQUkVHLDB4MCwweDYsMHhCLDB4QSxSUzE2LERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7QUJTfExfMzJ8TUVNUkVMQVh8U1JDLFJEMTYsRSB9fSx7eyAweDYsMHhCLDB4MixSRDE2LFNSQ3xNRU1SRUxBWHxBQlMzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixBQlN8TF8zMnxNRU1SRUxBWHxEU1QsRSB9fSx7eyAweDYsMHhCLDB4QSxSUzE2LERTVHxNRU1SRUxBWHxBQlMzMkxJU1QsRSB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSwyLCJtb3YudyIpLHt7UlMxNixSRDE2LEV9fSwgICAgICAgICB7eyAweDAsMHhELFJTMTYsIFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNCwibW92LnciKSx7e0lNTTE2LFJEMTYsRX19LCAgICAgICAge3sgMHg3LDB4OSwweDAsUkQxNixJTU0xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTVyksNCwibW92LnciKSx7e1JTSU5ELFJEMTYsRX19LCAgICAgICAge3sgMHg2LDB4OSxCMzB8UlNJTkQsUkQxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7RElTUDE2U1JDLFJEMTYsRX19LCAgICB7eyAweDYsMHhGLEIzMHxESVNQUkVHLFJEMTYsRElTUDE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNXKSw2LCJtb3YudyIpLHt7UlNJTkMsUkQxNixFfX0sICAgICAgICB7eyAweDYsMHhELEIzMHxSU0lOQyxSRDE2LEUsMCwwLDAsMH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU1cpLDYsIm1vdi53Iikse3tBQlMxNlNSQyxSRDE2LEV9fSwgICAgIHt7IDB4NiwweEIsMHgwLFJEMTYsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsRElTUDE2RFNULEV9fSwgICAge3sgMHg2LDB4RixESVNQUkVHfEIzMSxSUzE2LERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTVyksNiwibW92LnciKSx7e1JTMTYsUkRERUMsRX19LCAgICAgICAge3sgMHg2LDB4RCxSRERFQ3xCMzEsUlMxNixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNXKSw2LCJtb3YudyIpLHt7UlMxNixBQlMxNkRTVCxFfX0sICAgICB7eyAweDYsMHhCLDB4OCxSUzE2LEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDQsIm1vdi5sIikse3tJTU0zMixSRDMyLEV9fSwgICAgICAgIHt7IDB4NywweEEsMHgwLEIzMHxSRDMyLElNTTMyTElTVCxFfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksMiwibW92LmwiKSx7e1JTMzIsUkQzMixFfX0sICAgICAgICAge3sgMHgwLDB4RixCMzF8UlMzMixCMzB8UkQzMixFLDAsMCwwLDB9fUVPUCwKLQotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDQsIm1vdi5sIikse3tSU0lORCxSRDMyLEV9fSwgICAgICAgIHt7IFBSRUZJWDMyLDB4NiwweDksUlNJTkR8QjMwLEIzMHxSRDMyLEUsMCwwLDAsMCB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fUkVHLFNMKSw2LCJtb3YubCIpLHt7RElTUDE2U1JDLFJEMzIsRX19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhGLERJU1BSRUd8QjMwLEIzMHxSRDMyLERJU1AxNlNSQyxJR05PUkUsSUdOT1JFLElHTk9SRSxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tESVNQfExfMzJ8U1JDLFJEMzIsRX19LHt7IFBSRUZJWDMyLDB4NywweDgsQjMwfERJU1BSRUcsMHgwLDB4NiwweEIsMHgyLEIzMHxSRDMyLFNSQ3xESVNQMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e1JTSU5DLFJEMzIsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4RCxCMzB8UlNJTkMsQjMwfFJEMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19SRUcsU0wpLDYsIm1vdi5sIikse3tBQlMxNlNSQyxSRDMyLEV9fSwgICAgIHt7IFBSRUZJWDMyLDB4NiwweEIsMHgwLEIzMHxSRDMyLEFCUzE2U1JDLElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTTCksNiwibW92LmwiKSx7e0FCUzMyU1JDfE1FTVJFTEFYLFJEMzIsRSB9fSwgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweDIsQjMwfFJEMzIsU1JDfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLFJESU5ELEV9fSwgICAgICAgIHt7IFBSRUZJWDMyLDB4NiwweDksUkRJTkR8QjMxLEIzMHxSUzMyLEUsMCwwLDAsMCB9fUVPUCwKLSAgU09QKE8oT19NT1ZfVE9fTUVNLFNMKSw2LCJtb3YubCIpLHt7UlMzMixESVNQMTZEU1QsRX19LCAgICB7eyBQUkVGSVgzMiwweDYsMHhGLERJU1BSRUd8QjMxLEIzMHxSUzMyLERJU1AxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLERJU1B8TF8zMnxEU1QsRX19LHt7IFBSRUZJWDMyLDB4NywweDgsQjMxfERJU1BSRUcsMHgwLDB4NiwweEIsMHhBLEIzMHxSUzMyLERTVHxESVNQMzJMSVNULEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsUkRERUMsRX19LCAgICAgICAge3sgUFJFRklYMzIsMHg2LDB4RCxSRERFQ3xCMzEsQjMwfFJTMzIsRSwwLDAsMCwwIH19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0wpLDYsIm1vdi5sIikse3tSUzMyLEFCUzE2RFNULEV9fSwgICAgIHt7IFBSRUZJWDMyLDB4NiwweEIsMHg4LEIzMHxSUzMyLEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEUgfX1FT1AsCi0gIFNPUChPKE9fTU9WX1RPX01FTSxTTCksNiwibW92LmwiKSx7e1JTMzIsQUJTMzJEU1R8TUVNUkVMQVgsRSB9fSwgICAge3sgUFJFRklYMzIsMHg2LDB4QiwweEEsQjMwfFJTMzIsRFNUfE1FTVJFTEFYfEFCUzMyTElTVCxFIH19RU9QLAotCi0gIFNPUChPKE9fTU9WX1RPX1JFRyxTQiksMTAsIm1vdmZwZSIpLHt7QUJTMTZTUkMsUkQ4LEV9fSx7eyAweDYsMHhBLDB4NCxSRDgsQUJTMTZTUkMsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBTT1AoTyhPX01PVl9UT19NRU0sU0IpLDEwLCJtb3Z0cGUiKSx7e1JTOCxBQlMxNkRTVCxFfX0se3sgMHg2LDB4QSwweEMsUlM4LEFCUzE2RFNULElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fUVPUCwKLQotICBORVdfU09QKE8oT19NVUxVLFNCKSwxLDE0LCJtdWx4dS5iIikse3tSUzgsUkQxNixFfX0sIHt7IDB4NSwweDAsUlM4LFJEMTYsRSwwLDAsMCwwfX1FT1AsCi0gIE5FV19TT1AoTyhPX01VTFUsU1cpLDAsMTQsIm11bHh1LnciKSx7e1JTMTYsUkQzMixFfX0se3sgMHg1LDB4MixSUzE2LEIzMHxSRDMyLEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX01VTFMsU0IpLDAsMjAsIm11bHhzLmIiKSx7e1JTOCxSRDE2LEV9fSwge3sgMHgwLDB4MSwweGMsMHgwLDB4NSwweDAsUlM4LFJEMTYsRX19RU9QLAotICBORVdfU09QKE8oT19NVUxTLFNXKSwwLDIwLCJtdWx4cy53Iikse3tSUzE2LFJEMzIsRX19LHt7IDB4MCwweDEsMHhjLDB4MCwweDUsMHgyLFJTMTYsQjMwfFJEMzIsRX19RU9QLAotICAKLSAgLyogPz8/IFRoaXMgY2FuIHVzZSBVTk9QMy4gICovCi0gIE5FV19TT1AoTyhPX05FRyxTQiksMSwyLCJuZWcuYiIpLHt7IE9SOCxFLCAwfX0se3sgMHgxLDB4NywweDgsT1I4LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19ORUcsU1cpLDAsMiwibmVnLnciKSx7eyBPUjE2LEUsMH19LHt7IDB4MSwweDcsMHg5LE9SMTYsRX19RU9QLAotICBORVdfU09QKE8oT19ORUcsU0wpLDAsMiwibmVnLmwiKSx7eyBPUjMyLEUsMH19LHt7IDB4MSwweDcsMHhCLEIzMHxPUjMyLEV9fUVPUCwKLSAgICAKLSAgTkVXX1NPUChPKE9fTk9QLFNOKSwxLDIsIm5vcCIpLHt7RSwwLDB9fSx7eyAweDAsMHgwLDB4MCwweDAsRSwwLDAsMCwwfX1FT1AsCi0KLSAgLyogPz8/IFRoaXMgY2FuIHVzZSBVTk9QMy4gICovCi0gIE5FV19TT1AoTyhPX05PVCxTQiksMSwyLCJub3QuYiIpLHt7IE9SOCxFLCAwfX0se3sgMHgxLDB4NywweDAsT1I4LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19OT1QsU1cpLDAsMiwibm90LnciKSx7eyBPUjE2LEUsMH19LHt7IDB4MSwweDcsMHgxLE9SMTYsRX19RU9QLAotICBORVdfU09QKE8oT19OT1QsU0wpLDAsMiwibm90LmwiKSx7eyBPUjMyLEUsMH19LHt7IDB4MSwweDcsMHgzLEIzMHxPUjMyLEV9fUVPUCwKLQotICBUV09PUChPKE9fT1IsIFNCKSwib3IuYiIsMHhDLDB4MSwweDQpLAotICBORVdfU09QKE8oT19PUixTVyksMCw0LCJvci53Iikse3tJTU0xNixSRDE2LEUgfX0se3sweDcsMHg5LDB4NCxSRDE2LElNTTE2LElHTk9SRSxJR05PUkUsSUdOT1JFLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX09SLFNXKSwwLDIsIm9yLnciKSx7e1JTMTYsUkQxNixFIH19LHt7MHg2LDB4NCxSUzE2LFJEMTYsRX19IEVPUCwKLQotICBORVdfU09QKE8oT19PUixTTCksMCw2LCJvci5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NCxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fT1IsU0wpLDAsMiwib3IubCIpLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NCxCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIE5FV19TT1AoTyhPX09SQyxTQiksMSwyLCJvcmMiKSx7e0lNTTgsQ0NSLEV9fSx7eyAweDAsMHg0LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19PUkMsU0IpLDEsMiwib3JjIikse3tJTU04LEVYUixFfX0se3sgMHgwLDB4MSwweDQsMHgxLDB4MCwweDQsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fTU9WX1RPX1JFRyxTVyksMSw2LCJwb3AudyIpLHt7T1IxNixFLDB9fSx7eyAweDYsMHhELDB4NyxPUjE2LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fUkVHLFNMKSwwLDYsInBvcC5sIikse3tPUjMyLEUsMH19LHt7IFBSRUZJWDMyLDB4NiwweEQsMHg3LE9SMzJ8QjMwLEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fTUVNLFNXKSwxLDYsInB1c2gudyIpLHt7T1IxNixFLDB9fSx7eyAweDYsMHhELDB4RixPUjE2LEUsMCwwLDAsMH19RU9QLAotICBORVdfU09QKE8oT19NT1ZfVE9fTUVNLFNMKSwwLDYsInB1c2gubCIpLHt7T1IzMixFLDB9fSx7eyBQUkVGSVgzMiwweDYsMHhELDB4RixPUjMyfEIzMCxFLDAsMCwwLDB9fUVPUCwKLQotICBVTk9QMyhPX1JPVEwsICAicm90bCIsIDB4MSwweDIsMHg4KSwKLSAgVU5PUDMoT19ST1RSLCAgInJvdHIiLCAweDEsMHgzLDB4OCksCi0gIFVOT1AzKE9fUk9UWEwsICJyb3R4bCIsMHgxLDB4MiwweDApLAotICBVTk9QMyhPX1JPVFhSLCAicm90eHIiLDB4MSwweDMsMHgwKSwKLQotICBTT1AoTyhPX0JQVCxTTiksICAxMCwiYnB0Iikse3tFLDAsMH19LHt7IDB4NywweEEsMHhGLDB4RixFLDAsMCwwLDB9fUVPUCwKLSAgU09QKE8oT19SVEUsU04pLCAgMTAsInJ0ZSIpLHt7RSwwLDB9fSx7eyAweDUsMHg2LDB4NywweDAsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fUlRTLFNOKSwgICA4LCJydHMiKSx7e0UsMCwwfX0se3sgMHg1LDB4NCwweDcsMHgwLEUsMCwwLDAsMH19RU9QLAotCi0gIFVOT1AzKE9fU0hBTCwgICJzaGFsIiwweDEsMHgwLDB4OCksCi0gIFVOT1AzKE9fU0hBUiwgICJzaGFyIiwweDEsMHgxLDB4OCksCi0gIFVOT1AzKE9fU0hMTCwgICJzaGxsIiwweDEsMHgwLDB4MCksCi0gIFVOT1AzKE9fU0hMUiwgICJzaGxyIiwweDEsMHgxLDB4MCksCi0KLSAgU09QKE8oT19TTEVFUCxTTiksMiwic2xlZXAiKSx7e0UsMCwwfX0se3sgMHgwLDB4MSwweDgsMHgwLEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLCAxLDIsInN0YyIpLHt7Q0NSLFJEOCxFfX0se3sgMHgwLDB4MiwweDAsUkQ4LEUsMCwwLDAsMH19IEVPUCwKLQotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tDQ1IsUlNJTkQsRX19LCAgICAgICAge3tQUkVGSVhMREMsMHg2LDB4OSxCMzF8UkRJTkQsMHgwLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixESVNQfERTVHxMXzE2LEV9fSx7e1BSRUZJWExEQywweDYsMHhGLEIzMXxESVNQUkVHLDAsRFNUfERJU1B8TF8xNixJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixESVNQfERTVHxMXzMyLEV9fSx7e1BSRUZJWExEQywweDcsMHg4LEIzMHxESVNQUkVHLDAsMHg2LDB4QiwweEEsMHgwLERTVHxESVNQMzJMSVNULEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLFJEREVDLEV9fSwgICAgICAgIHt7UFJFRklYTERDLDB4NiwweEQsQjMxfFJEREVDLDB4MCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7Q0NSLEFCUzE2U1JDLEV9fSwgICAgIHt7UFJFRklYTERDLDB4NiwweEIsMHg4LDB4MCxBQlMxNkRTVCxJR05PUkUsSUdOT1JFLElHTk9SRSxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0NDUixBQlMzMlNSQyxFfX0sICAgICB7e1BSRUZJWExEQywweDYsMHhCLDB4QSwweDAsRFNUfEFCUzMyTElTVCxFfX1FT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwgMSwyLCJzdGMiKSx7e0VYUixSRDgsRX19LHt7IDB4MCwweDIsMHgxLFJEOCxFLDAsMCwwLDB9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fU1RDLFNCKSwwLDIsInN0YyIpLHt7RVhSLFJTSU5ELEV9fSwgICAgICAgIHt7MHgwLDB4MSwweDQsMHgxLDB4NiwweDksQjMxfFJESU5ELDB4MCxFfX0gRU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsRElTUHxEU1R8TF8xNixFfX0se3sweDAsMHgxLDB4NCwweDEsMHg2LDB4RixCMzF8RElTUFJFRywwLERTVHxESVNQfExfMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsRElTUHxEU1R8TF8zMixFfX0se3sweDAsMHgxLDB4NCwweDEsMHg3LDB4OCxCMzB8RElTUFJFRywwLDB4NiwweEIsMHhBLDB4MCxEU1R8RElTUDMyTElTVCxFfX1FT1AsCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixSRERFQyxFfX0sICAgICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhELEIzMXxSRERFQywweDAsRX19RU9QLAotCi0gIE5FV19TT1AoTyhPX1NUQyxTQiksMCwyLCJzdGMiKSx7e0VYUixBQlMxNlNSQyxFfX0sICAgICB7ezB4MCwweDEsMHg0LDB4MSwweDYsMHhCLDB4OCwweDAsQUJTMTZEU1QsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19RU9QLAotICBORVdfU09QKE8oT19TVEMsU0IpLDAsMiwic3RjIikse3tFWFIsQUJTMzJTUkMsRX19LCAgICAge3sweDAsMHgxLDB4NCwweDEsMHg2LDB4QiwweEEsMHgwLERTVHxBQlMzMkxJU1QsRX19RU9QLAotCi0gIFNPUChPKE9fU1VCLFNCKSwyLCJzdWIuYiIpLHt7UlM4LFJEOCxFfX0se3sgMHgxLDB4OCxSUzgsUkQ4LEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX1NVQixTVyksMSwyLCJzdWIudyIpLHt7UlMxNixSRDE2LEUgfX0sICB7ezB4MSwweDksUlMxNixSRDE2LEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NVQixTVyksMCw0LCJzdWIudyIpLHt7SU1NMTYsUkQxNixFIH19LCB7ezB4NywweDksMHgzLFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fU1VCLFNMKSwwLDIsInN1Yi5sIikgLHt7UlMzMixSRDMyLEUgfX0sIHt7MHgxLDB4QSxCMzF8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotICBORVdfU09QKE8oT19TVUIsU0wpLDAsNiwic3ViLmwiKSwge3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4MyxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLQotICBTT1AoTyhPX1NVQlMsU0wpLDIsInN1YnMiKSx7e0tCSVQsUkRQLEV9fSx7eyAweDEsMHhCLEtCSVQsUkRQLEUsMCwwLDAsMH19RU9QLAotICBUV09PUChPKE9fU1VCWCxTQiksInN1YngiLDB4QiwweDEsMHhFKSwKLQotICBORVdfU09QKE8oT19UUkFQQSxTQiksMCwyLCJ0cmFwYSIpLHt7IElNTTIsRX19LCAge3sweDUsMHg3LElNTTIsSUdOT1JFLEUgIH19RU9QLAotICBORVdfU09QKE8oT19UQVMsU0IpLDAsMiwidGFzIikse3tSU0lORCxFfX0sICB7ezB4MCwweDEsMHhlLDB4MCwweDcsMHhiLEIzMHxSU0lORCwweGMsRSAgfX1FT1AsCi0KLSAgVFdPT1AoTyhPX1hPUiwgU0IpLCJ4b3IiLDB4RCwweDEsMHg1KSwKLQotICBORVdfU09QKE8oT19YT1IsU1cpLDAsNCwieG9yLnciKSx7e0lNTTE2LFJEMTYsRSB9fSx7ezB4NywweDksMHg1LFJEMTYsSU1NMTYsSUdOT1JFLElHTk9SRSxJR05PUkUsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fWE9SLFNXKSwwLDIsInhvci53Iikse3tSUzE2LFJEMTYsRSB9fSx7ezB4NiwweDUsUlMxNixSRDE2LEV9fSBFT1AsCi0KLSAgTkVXX1NPUChPKE9fWE9SLFNMKSwwLDYsInhvci5sIikse3tJTU0zMixSRDMyLEUgfX0se3sweDcsMHhBLDB4NSxCMzB8UkQzMixJTU0zMkxJU1QsRX19IEVPUCwKLSAgTkVXX1NPUChPKE9fWE9SLFNMKSwwLDIsInhvci5sIikgLHt7UlMzMixSRDMyLEUgfX0se3sweDAsMHgxLDB4RiwweDAsMHg2LDB4NSxCMzB8UlMzMixCMzB8UkQzMixFfX0gRU9QLAotCi0gIFNPUChPKE9fWE9SQyxTQiksMiwieG9yYyIpLHt7SU1NOCxDQ1IsRX19LHt7IDB4MCwweDUsSU1NOCxJR05PUkUsRSwwLDAsMCwwfX1FT1AsCi0gIFNPUChPKE9fWE9SQyxTQiksMiwieG9yYyIpLHt7SU1NOCxFWFIsRX19LHt7IDB4MCwweDEsMHg0LDB4MSwweDAsMHg1LElNTTgsSUdOT1JFLEUsMCwwLDAsMH19RU9QLAotCi0gIE5FV19TT1AoTyhPX0NMUk1BQyxTTiksMSwyLCJjbHJtYWMiKSx7e0UsIDAsIDB9fSx7ezB4MCwweDEsMHhhLDB4MCxFfX0gRU9QLAotICBORVdfU09QKE8oT19NQUMsU0wpLDEsMiwibWFjIikse3tSU0lOQyxSRElOQyxFfX0se3sweDAsMHgxLDB4NiwweDAsMHg2LDB4ZCxCMzB8UlNJTkMsQjMwfFJESU5DLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0xETUFDLFNMKSwxLDIsImxkbWFjIikse3tSUzMyLE1BQ1JFRyxFfX0se3sweDAsMHgzLE1BQ1JFRyxSUzMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX1NUTUFDLFNMKSwxLDIsInN0bWFjIikse3tNQUNSRUcsUkQzMixFfX0se3sweDAsMHgyLE1BQ1JFRyxSRDMyLEV9fSBFT1AsCi0gIE5FV19TT1AoTyhPX0xETSxTTCksMCw2LCJsZG0ubCIpLHt7UlNJTkMsIFJTMzIsIEV9fSx7eyAweDAsMHgxLElHTk9SRSwweDAsMHg2LDB4RCwweDcsSUdOT1JFLEV9fUVPUCwKLSAgTkVXX1NPUChPKE9fU1RNLFNMKSwwLDYsInN0bS5sIikse3tSUzMyLCBSRERFQywgRX19LHt7MHgwLDB4MSxJR05PUkUsMHgwLDB4NiwweEQsMHhGLElHTk9SRSxFfX1FT1AsCi0gIHsgMCB9Ci19OwotI2Vsc2UKLWV4dGVybiBzdHJ1Y3QgaDhfb3Bjb2RlIGg4X29wY29kZXNbXSA7Ci0jZW5kaWYKLQotCi0KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaHBwYS5oIGIvaW5jbHVkZS9vcGNvZGUvaHBwYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTEwMDQ3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2hwcGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgUEEtUklTQy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgMTk5MSwgMTk5MywgMTk5NSwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHQVMsIHRoZSBHTlUgQXNzZW1ibGVyLCBhbmQgR0RCLCB0aGUgR05VIGRpc2Fzc2VtYmxlci4KLQotR0FTL0dEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdBUy9HREIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWYgIWRlZmluZWQoX19TVERDX18pICYmICFkZWZpbmVkKGNvbnN0KQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qCi0gKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LgotICovCi0KLS8qIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgZGVsYXkgc2xvdCBudWxsaWZpY2F0aW9uOiBub3JtYWwgd2hpY2ggaXMKLSAqIGNvbnRyb2xlZCBieSB0aGUgbnVsbGlmaWNhdGlvbiBiaXQsIGFuZCBjb25kaXRpb25hbCwgd2hpY2ggZGVwZW5kcwotICogb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgYnJhbmNoIGFuZCBpdHMgc3VjY2VzcyBvciBmYWlsdXJlLgotICoKLSAqIE5PTkUgaXMgdW5mb3J0dW5hdGVseSAjZGVmaW5lZCBpbiB0aGUgaGl1eCBzeXN0ZW0gaW5jbHVkZSBmaWxlcy4gIAotICogI3VuZGVmIGl0IGF3YXkuCi0gKi8KLSN1bmRlZiBOT05FCi1zdHJ1Y3QgcGFfb3Bjb2RlCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB1bnNpZ25lZCBsb25nIGludCBtYXRjaDsJLyogQml0cyB0aGF0IG11c3QgYmUgc2V0Li4uICAqLwotICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hc2s7CS8qIC4uLiBpbiB0aGVzZSBiaXRzLiAqLwotICAgIGNoYXIgKmFyZ3M7Ci0gICAgZW51bSBwYV9hcmNoIGFyY2g7Ci19OwotCi0KLS8qCi0gICBBbGwgaHBwYSBvcGNvZGVzIGFyZSAzMiBiaXRzLgotCi0gICBUaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIG9uZSBjaGFyYWN0ZXIKLSAgIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLgotCi0gICBCaXQgcG9zaXRpb25zIGluIHRoaXMgZGVzY3JpcHRpb24gZm9sbG93IEhQIHVzYWdlIG9mIGxzYiA9IDMxLAotICAgImF0IiBpcyBsc2Igb2YgZmllbGQuCi0KLSAgIEluIHRoZSBhcmdzIGZpZWxkLCB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgbXVzdCBtYXRjaCBleGFjdGx5OgotCi0JJyssKCkgJwotCi0gICBJbiB0aGUgYXJncyBmaWVsZCwgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB1bnVzZWQ6Ci0KLQknICAiIyQlICAgICorLSAuLyAgICAgICAgICA6OyAgICAnCi0JJyAgICAgICAgICAgICAgICAgICAgICAgICAgW1xdICAnCi0JJyAgICAgICAgICAgICAgICAgICAgICAgICAgeyB9ICcKLQotICAgSGVyZSBhcmUgYWxsIHRoZSBjaGFyYWN0ZXJzOgotCi0JJyAhIiMkJSYnKCkqKy0sLi8wMTIzNDU2Nzg5Ojs8PT4/QCcKLQknQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eXycKLQknYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+JwotCi1LaW5kcyBvZiBvcGVyYW5kczoKLSAgIHggICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAxNS4KLSAgIGIgICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAxMC4KLSAgIHQgICAgaW50ZWdlciByZWdpc3RlciBmaWVsZCBhdCAzMS4KLSAgIHkgICAgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgZmllbGQgYXQgMzEKLSAgIDUgICAgNSBiaXQgaW1tZWRpYXRlIGF0IDE1LgotICAgcyAgICAyIGJpdCBzcGFjZSBzcGVjaWZpZXIgYXQgMTcuCi0gICBTICAgIDMgYml0IHNwYWNlIHNwZWNpZmllciBhdCAxOC4KLSAgIGMgICAgaW5kZXhlZCBsb2FkIGNvbXBsZXRlci4KLSAgIEMgICAgc2hvcnQgbG9hZCBhbmQgc3RvcmUgY29tcGxldGVyLgotICAgWQlTdG9yZSBCeXRlcyBTaG9ydCBjb21wbGV0ZXIKLSAgIDwgICAgbm9uLW5lZ2F0ZWQgY29tcGFyZS9zdWJ0cmFjdCBjb25kaXRpb25zLgotICAgYQljb21wYXJlL3N1YnRyYWN0IGNvbmRpdGlvbnMKLSAgIGQgICAgbm9uLW5lZ2F0ZWQgYWRkIGNvbmRpdGlvbnMKLSAgICYgICAgbG9naWNhbCBpbnN0cnVjdGlvbiBjb25kaXRpb25zCi0gICBVICAgIHVuaXQgaW5zdHJ1Y3Rpb24gY29uZGl0aW9ucwotICAgPiAgICBzaGlmdC9leHRyYWN0L2RlcG9zaXQgY29uZGl0aW9ucy4KLSAgIH4gICAgYnZiLGJiIGNvbmRpdGlvbnMKLSAgIFYgICAgNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBpICAgIDExIGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMzEKLSAgIGogICAgMTQgYml0IGltbWVkaWF0ZSB2YWx1ZSBhdCAzMQotICAgayAgICAyMSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxCi0gICBuCW51bGxpZmljYXRpb24gZm9yIGJyYW5jaCBpbnN0cnVjdGlvbnMKLSAgIE4JbnVsbGlmaWNhdGlvbiBmb3Igc3BvcCBhbmQgY29wciBpbnN0cnVjdGlvbnMKLSAgIHcgICAgMTIgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQKLSAgIFcgICAgMTcgYml0IGJyYW5jaCBkaXNwbGFjZW1lbnQgKFBDIHJlbGF0aXZlKQotICAgeiAgICAxNyBiaXQgYnJhbmNoIGRpc3BsYWNlbWVudCAoanVzdCBhIG51bWJlciwgbm90IGFuIGFkZHJlc3MpCi0KLUFsc28gdGhlc2U6Ci0KLSAgIHAgICAgNSBiaXQgc2hpZnQgY291bnQgYXQgMjYgKHRvIHN1cHBvcnQgdGhlIFNIRCBpbnN0cnVjdGlvbikgZW5jb2RlZCBhcwotICAgICAgICAzMS1wCi0gICBQICAgIDUgYml0IGJpdCBwb3NpdGlvbiBhdCAyNgotICAgVCAgICA1IGJpdCBmaWVsZCBsZW5ndGggYXQgMzEgKGVuY29kZWQgYXMgMzItVCkKLSAgIEEgICAgMTMgYml0IGltbWVkaWF0ZSBhdCAxOCAodG8gc3VwcG9ydCB0aGUgQlJFQUsgaW5zdHJ1Y3Rpb24pCi0gICBeCWxpa2UgYiwgYnV0IGRlc2NyaWJlcyBhIGNvbnRyb2wgcmVnaXN0ZXIKLSAgIFogICAgU3lzdGVtIENvbnRyb2wgQ29tcGxldGVyICh0byBzdXBwb3J0IExQQSwgTEhBLCBldGMuKQotICAgRCAgICAyNiBiaXQgaW1tZWRpYXRlIGF0IDMxICh0byBzdXBwb3J0IHRoZSBESUFHIGluc3RydWN0aW9uKQotCi0gICBmICAgIDMgYml0IFNwZWNpYWwgRnVuY3Rpb24gVW5pdCBpZGVudGlmaWVyIGF0IDI1Ci0gICBPICAgIDIwIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTUgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICBvICAgIDE1IGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIGF0IDIwCi0gICAyICAgIDIyIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTcgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICAxICAgIDE1IGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gMTAgYml0cyBhdCAyMAotICAgICAgICBhbmQgNSBiaXRzIGF0IDMxCi0gICAwICAgIDEwIGJpdCBTcGVjaWFsIEZ1bmN0aW9uIFVuaXQgb3BlcmF0aW9uIHNwbGl0IGJldHdlZW4gNSBiaXRzIGF0IDIwCi0gICAgICAgIGFuZCA1IGJpdHMgYXQgMzEKLSAgIHUgICAgMyBiaXQgY29wcm9jZXNzb3IgdW5pdCBpZGVudGlmaWVyIGF0IDI1Ci0gICBGICAgIFNvdXJjZSBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBDb21wbGV0ZXIgZW5jb2RlZCAyIGJpdHMgYXQgMjAKLSAgIEkgICAgU291cmNlIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDEgYml0cyBhdCAyMAotCShmb3IgMHhlIGZvcm1hdCBGUCBpbnN0cnVjdGlvbnMpCi0gICBHICAgIERlc3RpbmF0aW9uIEZsb2F0aW5nIFBvaW50IE9wZXJhbmQgRm9ybWF0IENvbXBsZXRlciBlbmNvZGVkIDIgYml0cyBhdCAxOAotICAgTSAgICBGbG9hdGluZy1Qb2ludCBDb21wYXJlIENvbmRpdGlvbnMgKGVuY29kZWQgYXMgNSBiaXRzIGF0IDMxKQotICAgPyAgICBub24tbmVnYXRlZC9uZWdhdGVkIGNvbXBhcmUvc3VidHJhY3QgY29uZGl0aW9ucy4KLSAgIEAgICAgbm9uLW5lZ2F0ZWQvbmVnYXRlZCBhZGQgY29uZGl0aW9ucy4KLSAgICEgICAgbm9uLW5lZ2F0ZWQgYWRkIGNvbmRpdGlvbnMuCi0KLSAgIHMgICAgMiBiaXQgc3BhY2Ugc3BlY2lmaWVyIGF0IDE3LgotICAgYiAgICByZWdpc3RlciBmaWVsZCBhdCAxMC4KLSAgIHIJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDMxIChmb3IgdGhlIGJyZWFrIGluc3RydWN0aW9uKQotCSh2ZXJ5IHNpbWlsYXIgdG8gViBhYm92ZSwgZXhjZXB0IHRoZSB2YWx1ZSBpcyB1bnNpZ25lZCBpbnN0ZWFkIG9mCi0JbG93X3NpZ25fZXh0KQotICAgUgk1IGJpdCBpbW1lZGlhdGUgdmFsdWUgYXQgMTUgKGZvciB0aGUgc3NtLCByc20sIHByb2JlaSBpbnN0cnVjdGlvbnMpCi0JKHNhbWUgYXMgciBhYm92ZSwgZXhjZXB0IHRoZSB2YWx1ZSBpcyBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbikKLSAgIFEJNSBiaXQgaW1tZWRpYXRlIHZhbHVlIGF0IDEwIChhIGJpdCBwb3NpdGlvbiBzcGVjaWZpZWQgaW4KLQl0aGUgYmIgaW5zdHJ1Y3Rpb24uIEl0J3MgdGhlIHNhbWUgYXMgciBhYm92ZSwgZXhjZXB0IHRoZQotICAgICAgICB2YWx1ZSBpcyBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbikKLSAgIHwJc2hpZnQvZXh0cmFjdC9kZXBvc2l0IGNvbmRpdGlvbnMgd2hlbiB1c2VkIGluIGEgY29uZGl0aW9uYWwgYnJhbmNoCi0KLUFuZCB0aGVzZSAoUEpIKSBmb3IgUEEtODkgRi5QLiByZWdpc3RlcnMgYW5kIGluc3RydWN0aW9uczoKLQotICAgdiAgICBhICd0JyBvcGVyYW5kIHR5cGUgZXh0ZW5kZWQgdG8gaGFuZGxlIEwvUiByZWdpc3RlciBoYWx2ZXMuCi0gICBFICAgIGEgJ2InIG9wZXJhbmQgdHlwZSBleHRlbmRlZCB0byBoYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcy4KLSAgIFggICAgYW4gJ3gnIG9wZXJhbmQgdHlwZSBleHRlbmRlZCB0byBoYW5kbGUgTC9SIHJlZ2lzdGVyIGhhbHZlcy4KLSAgIEogICAgYSAnYicgb3BlcmFuZCB0eXBlIGZ1cnRoZXIgZXh0ZW5kZWQgdG8gaGFuZGxlIGV4dHJhIDEuMSByZWdpc3RlcnMKLSAgIEsgICAgYSAneCcgb3BlcmFuZCB0eXBlIGZ1cnRoZXIgZXh0ZW5kZWQgdG8gaGFuZGxlIGV4dHJhIDEuMSByZWdpc3RlcnMKLSAgIDQgICAgYSB2YXJpYXRpb24gb2YgdGhlICdiJyBvcGVyYW5kIHR5cGUgZm9yICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInCi0gICA2ICAgIGEgdmFyaWF0aW9uIG9mIHRoZSAneCcgb3BlcmFuZCB0eXBlIGZvciAnZm1weWFkZCcgYW5kICdmbXB5c3ViJwotICAgNyAgICBhIHZhcmlhdGlvbiBvZiB0aGUgJ3QnIG9wZXJhbmQgdHlwZSBmb3IgJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicKLSAgIDggICAgNSBiaXQgcmVnaXN0ZXIgZmllbGQgYXQgMjAgKHVzZWQgaW4gJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicpCi0gICA5ICAgIDUgYml0IHJlZ2lzdGVyIGZpZWxkIGF0IDI1ICh1c2VkIGluICdmbXB5YWRkJyBhbmQgJ2ZtcHlzdWInKQotICAgSCAgICBGbG9hdGluZyBQb2ludCBPcGVyYW5kIEZvcm1hdCBhdCAyNiBmb3IgJ2ZtcHlhZGQnIGFuZCAnZm1weXN1YicKLSAgICAgICAgKHZlcnkgc2ltaWxhciB0byAnRicpCi0qLwotCi0KLS8qIExpc3Qgb2YgY2hhcmFjdGVycyBub3QgdG8gcHV0IGEgc3BhY2UgYWZ0ZXIuICBOb3RlIHRoYXQKLSAgICIsIiBpcyBpbmNsdWRlZCwgYXMgdGhlICJzcG9wTiIgb3BlcmF0aW9ucyB1c2UgbGl0ZXJhbAotICAgY29tbWFzIGluIHRoZWlyIGNvbXBsZXRlciBzZWN0aW9ucy4gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb21wbGV0ZXJfY2hhcnMgPSAiLENjWTw+PyFAKyZVfkZmR0hJTm5Pb1pNYWR1fC89MDEyMyVlJG19IjsKLQotLyogVGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzIGluIHRoaXMgdGFibGUgaXMgc2lnbmlmaWNhbnQ6Ci0KLSAgICogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdCBiZQotICAgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQgcnVudGltZS4KLQotICAgKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuICAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBhX29wY29kZSBwYV9vcGNvZGVzW10gPQotewotCi0KLS8qIHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLQoteyAiYiIsCQkweGU4MDAwMDAwLCAweGZmZTBlMDAwLCAiblciLCBwYTEwfSwgLyogYmwgZm9vLHIwICovCi17ICJsZGkiLAkweDM0MDAwMDAwLCAweGZmZTBjMDAwLCAiaix4IiwgcGExMH0sCS8qIGxkbyB2YWwocjApLHIgKi8KLXsgImNvbWliIiwgCTB4ODQwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bjUsYix3IiwgcGExMH0sIC8qIGNvbWlie3RmfSovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJjb21pYiIsIAkweDhjMDAwMDAwLCAweGZjMDAwMDAwLCAiP241LGIsdyIsIHBhMTB9LCAvKiBjb21pYnt0Zn0qLwoteyAiY29tYiIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsICI/bngsYix3IiwgcGExMH0sIC8qIGNvbWJ7dGZ9ICovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJjb21iIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwgIj9ueCxiLHciLCBwYTEwfSwgLyogY29tYnt0Zn0gKi8KLXsgImFkZGIiLAkweGEwMDAwMDAwLCAweGZjMDAwMDAwLCAiQG54LGIsdyIsIHBhMTB9LCAvKiBhZGRie3RmfSAqLwotLyogVGhpcyBlbnRyeSBpcyBmb3IgdGhlIGRpc2Fzc2VtYmxlciBvbmx5LiAgSXQgd2lsbCBuZXZlciBiZSB1c2VkIGJ5Ci0gICBhc3NlbWJsZXIuICAqLwoteyAiYWRkYiIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJAbngsYix3IiwgcGExMH0sCi17ICJhZGRpYiIsCTB4YTQwMDAwMDAsIDB4ZmMwMDAwMDAsICJAbjUsYix3IiwgcGExMH0sIC8qIGFkZGlie3RmfSovCi0vKiBUaGlzIGVudHJ5IGlzIGZvciB0aGUgZGlzYXNzZW1ibGVyIG9ubHkuICBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgYnkKLSAgIGFzc2VtYmxlci4gICovCi17ICJhZGRpYiIsCTB4YWMwMDAwMDAsIDB4ZmMwMDAwMDAsICJAbjUsYix3IiwgcGExMH0sIC8qIGFkZGlie3RmfSovCi17ICJub3AiLCAgICAgICAgMHgwODAwMDI0MCwgMHhmZmZmZmZmZiwgIiIsIHBhMTB9LCAgICAgIC8qIG9yIDAsMCwwICovCi17ICJjb3B5IiwgICAgICAgMHgwODAwMDI0MCwgMHhmZmUwZmZlMCwgIngsdCIsIHBhMTB9LCAgIC8qIG9yIHIsMCx0ICovCi17ICJtdHNhciIsICAgICAgMHgwMTYwMTg0MCwgMHhmZmUwZmZmZiwgIngiLCBwYTEwfSwgLyogbXRjdGwgcixjcjExICovCi0KLS8qIExvYWRzIGFuZCBTdG9yZXMgZm9yIGludGVnZXIgcmVnaXN0ZXJzLiAgKi8KLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwfSwKLXsgImxkdyIsICAgICAgICAweDQ4MDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImoocyxiKSx4IiwgcGExMH0sCi17ICJsZGgiLCAgICAgICAgMHg0NDAwMDAwMCwgMHhmYzAwMDAwMCwgImooYikseCIsIHBhMTB9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKHMsYikseCIsIHBhMTB9LAoteyAibGRiIiwgICAgICAgIDB4NDAwMDAwMDAsIDB4ZmMwMDAwMDAsICJqKGIpLHgiLCBwYTEwfSwKLXsgInN0dyIsICAgICAgICAweDY4MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKHMsYikiLCBwYTEwfSwKLXsgInN0dyIsICAgICAgICAweDY4MDAwMDAwLCAweGZjMDAwMDAwLCAieCxqKGIpIiwgcGExMH0sCi17ICJzdGgiLCAgICAgICAgMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMH0sCi17ICJzdGgiLCAgICAgICAgMHg2NDAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTB9LAoteyAic3RiIiwgICAgICAgIDB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGoocyxiKSIsIHBhMTB9LAoteyAic3RiIiwgICAgICAgIDB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsICJ4LGooYikiLCBwYTEwfSwKLXsgImxkd20iLCAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiaihzLGIpLHgiLCBwYTEwfSwKLXsgImxkd20iLCAgICAgICAweDRjMDAwMDAwLCAweGZjMDAwMDAwLCAiaihiKSx4IiwgcGExMH0sCi17ICJzdHdtIiwgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihzLGIpIiwgcGExMH0sCi17ICJzdHdtIiwgICAgICAgMHg2YzAwMDAwMCwgMHhmYzAwMDAwMCwgIngsaihiKSIsIHBhMTB9LAoteyAibGR3eCIsICAgICAgIDB4MGMwMDAwODAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkd3giLCAgICAgICAweDBjMDAwMDgwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGRoeCIsICAgICAgIDB4MGMwMDAwNDAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkaHgiLCAgICAgICAweDBjMDAwMDQwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGRieCIsICAgICAgIDB4MGMwMDAwMDAsIDB4ZmMwMDFmYzAsICJjeChzLGIpLHQiLCBwYTEwfSwKLXsgImxkYngiLCAgICAgICAweDBjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3goYiksdCIsIHBhMTB9LAoteyAibGR3YXgiLCAgICAgIDB4MGMwMDAxODAsIDB4ZmMwMGRmYzAsICJjeChiKSx0IiwgcGExMH0sCi17ICJsZGN3eCIsICAgICAgMHgwYzAwMDFjMCwgMHhmYzAwMWZjMCwgImN4KHMsYiksdCIsIHBhMTB9LAoteyAibGRjd3giLCAgICAgIDB4MGMwMDAxYzAsIDB4ZmMwMDFmYzAsICJjeChiKSx0IiwgcGExMH0sCi17ICJsZHdzIiwJMHgwYzAwMTA4MCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGR3cyIsCTB4MGMwMDEwODAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGhzIiwJMHgwYzAwMTA0MCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGRocyIsCTB4MGMwMDEwNDAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGJzIiwJMHgwYzAwMTAwMCwgMHhmYzAwMWZjMCwgIkM1KHMsYiksdCIsIHBhMTB9LAoteyAibGRicyIsCTB4MGMwMDEwMDAsIDB4ZmMwMDFmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZHdhcyIsCTB4MGMwMDExODAsIDB4ZmMwMGRmYzAsICJDNShiKSx0IiwgcGExMH0sCi17ICJsZGN3cyIsCTB4MGMwMDExYzAsIDB4ZmMwMDFmYzAsICJDNShzLGIpLHQiLCBwYTEwfSwKLXsgImxkY3dzIiwJMHgwYzAwMTFjMCwgMHhmYzAwMWZjMCwgIkM1KGIpLHQiLCBwYTEwfSwKLXsgInN0d3MiLAkweDBjMDAxMjgwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdHdzIiwJMHgwYzAwMTI4MCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0aHMiLAkweDBjMDAxMjQwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdGhzIiwJMHgwYzAwMTI0MCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0YnMiLAkweDBjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3gsVihzLGIpIiwgcGExMH0sCi17ICJzdGJzIiwJMHgwYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0d2FzIiwJMHgwYzAwMTM4MCwgMHhmYzAwZGZjMCwgIkN4LFYoYikiLCBwYTEwfSwKLXsgInN0YnlzIiwJMHgwYzAwMTMwMCwgMHhmYzAwMWZjMCwgIll4LFYocyxiKSIsIHBhMTB9LAoteyAic3RieXMiLAkweDBjMDAxMzAwLCAweGZjMDAxZmMwLCAiWXgsVihiKSIsIHBhMTB9LAotCi0vKiBJbW1lZGlhdGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsgImxkbyIsCTB4MzQwMDAwMDAsIDB4ZmMwMGMwMDAsICJqKGIpLHgiLCBwYTEwfSwKLXsgImxkaWwiLAkweDIwMDAwMDAwLCAweGZjMDAwMDAwLCAiayxiIiwgcGExMH0sCi17ICJhZGRpbCIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsICJrLGIiLCBwYTEwfSwKLQotLyogQnJhbmNoaW5nIGluc3RydWN0aW9ucy4gKi8KLXsgImJsIiwJCTB4ZTgwMDAwMDAsIDB4ZmMwMGUwMDAsICJuVyxiIiwgcGExMH0sCi17ICJnYXRlIiwJMHhlODAwMjAwMCwgMHhmYzAwZTAwMCwgIm5XLGIiLCBwYTEwfSwKLXsgImJsciIsCTB4ZTgwMDQwMDAsIDB4ZmMwMGUwMDEsICJueCxiIiwgcGExMH0sCi17ICJidiIsCQkweGU4MDBjMDAwLCAweGZjMDBmZmZkLCAibngoYikiLCBwYTEwfSwKLXsgImJ2IiwJCTB4ZTgwMGMwMDAsIDB4ZmMwMGZmZmQsICJuKGIpIiwgcGExMH0sCi17ICJiZSIsCQkweGUwMDAwMDAwLCAweGZjMDAwMDAwLCAibnooUyxiKSIsIHBhMTB9LAoteyAiYmxlIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwgIm56KFMsYikiLCBwYTEwfSwKLXsgIm1vdmIiLAkweGM4MDAwMDAwLCAweGZjMDAwMDAwLCAifG54LGIsdyIsIHBhMTB9LAoteyAibW92aWIiLAkweGNjMDAwMDAwLCAweGZjMDAwMDAwLCAifG41LGIsdyIsIHBhMTB9LAoteyAiY29tYnQiLAkweDgwMDAwMDAwLCAweGZjMDAwMDAwLCAiPG54LGIsdyIsIHBhMTB9LAoteyAiY29tYmYiLAkweDg4MDAwMDAwLCAweGZjMDAwMDAwLCAiPG54LGIsdyIsIHBhMTB9LAoteyAiY29taWJ0IiwJMHg4NDAwMDAwMCwgMHhmYzAwMDAwMCwgIjxuNSxiLHciLCBwYTEwfSwKLXsgImNvbWliZiIsCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsICI8bjUsYix3IiwgcGExMH0sCi17ICJhZGRidCIsCTB4YTAwMDAwMDAsIDB4ZmMwMDAwMDAsICIhbngsYix3IiwgcGExMH0sCi17ICJhZGRiZiIsCTB4YTgwMDAwMDAsIDB4ZmMwMDAwMDAsICIhbngsYix3IiwgcGExMH0sCi17ICJhZGRpYnQiLAkweGE0MDAwMDAwLCAweGZjMDAwMDAwLCAiIW41LGIsdyIsIHBhMTB9LAoteyAiYWRkaWJmIiwJMHhhYzAwMDAwMCwgMHhmYzAwMDAwMCwgIiFuNSxiLHciLCBwYTEwfSwKLXsgImJiIiwJCTB4YzQwMDQwMDAsIDB4ZmMwMDQwMDAsICJ+bngsUSx3IiwgcGExMH0sIAoteyAiYnZiIiwJMHhjMDAwNDAwMCwgMHhmZmUwNDAwMCwgIn5ueCx3IiwgcGExMH0sCi17ICJjbHJidHMiLAkweGU4MDA0MDA1LCAweGZmZmZmZmZmLCAiIiwgcGEyMH0sCi0KLS8qIENvbXB1dGF0aW9uIEluc3RydWN0aW9ucyAqLwotCi17ICJjb21jbHIiLCAgICAgMHgwODAwMDg4MCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAib3IiLCAgICAgICAgIDB4MDgwMDAyNDAsIDB4ZmMwMDBmZTAsICImeCxiLHQiLCBwYTEwfSwKLXsgInhvciIsICAgICAgICAweDA4MDAwMjgwLCAweGZjMDAwZmUwLCAiJngsYix0IiwgcGExMH0sCi17ICJhbmQiLCAgICAgICAgMHgwODAwMDIwMCwgMHhmYzAwMGZlMCwgIiZ4LGIsdCIsIHBhMTB9LAoteyAiYW5kY20iLCAgICAgIDB4MDgwMDAwMDAsIDB4ZmMwMDBmZTAsICImeCxiLHQiLCBwYTEwfSwKLXsgInV4b3IiLCAgICAgICAweDA4MDAwMzgwLCAweGZjMDAwZmUwLCAiVXgsYix0IiwgcGExMH0sCi17ICJ1YWRkY20iLCAgICAgMHgwODAwMDk4MCwgMHhmYzAwMGZlMCwgIlV4LGIsdCIsIHBhMTB9LAoteyAidWFkZGNtdCIsICAgIDB4MDgwMDA5YzAsIDB4ZmMwMDBmZTAsICJVeCxiLHQiLCBwYTEwfSwKLXsgImRjb3IiLCAgICAgICAweDA4MDAwYjgwLCAweGZjMWYwZmUwLCAiVWIsdCIsICAgcGExMH0sCi17ICJpZGNvciIsICAgICAgMHgwODAwMGJjMCwgMHhmYzFmMGZlMCwgIlViLHQiLCAgIHBhMTB9LAoteyAiYWRkaSIsICAgICAgIDB4YjQwMDAwMDAsIDB4ZmMwMDA4MDAsICJkaSxiLHgiLCBwYTEwfSwKLXsgImFkZGlvIiwgICAgICAweGI0MDAwODAwLCAweGZjMDAwODAwLCAiZGksYix4IiwgcGExMH0sCi17ICJhZGRpdCIsICAgICAgMHhiMDAwMDAwMCwgMHhmYzAwMDgwMCwgImRpLGIseCIsIHBhMTB9LAoteyAiYWRkaXRvIiwgICAgIDB4YjAwMDA4MDAsIDB4ZmMwMDA4MDAsICJkaSxiLHgiLCBwYTEwfSwKLXsgImFkZCIsICAgICAgICAweDA4MDAwNjAwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJhZGRsIiwgICAgICAgMHgwODAwMGEwMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAiYWRkbyIsICAgICAgIDB4MDgwMDBlMDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgImFkZGMiLCAgICAgICAweDA4MDAwNzAwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJhZGRjbyIsICAgICAgMHgwODAwMGYwMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic3ViIiwgICAgICAgIDB4MDgwMDA0MDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKLXsgInN1Ym8iLCAgICAgICAweDA4MDAwYzAwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCi17ICJzdWJiIiwgICAgICAgMHgwODAwMDUwMCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAic3ViYm8iLCAgICAgIDB4MDgwMDBkMDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKLXsgInN1YnQiLCAgICAgICAweDA4MDAwNGMwLCAweGZjMDAwZmUwLCAiYXgsYix0IiwgcGExMH0sCi17ICJzdWJ0byIsICAgICAgMHgwODAwMGNjMCwgMHhmYzAwMGZlMCwgImF4LGIsdCIsIHBhMTB9LAoteyAiZHMiLCAgICAgICAgIDB4MDgwMDA0NDAsIDB4ZmMwMDBmZTAsICJheCxiLHQiLCBwYTEwfSwKLXsgInN1YmkiLCAgICAgICAweDk0MDAwMDAwLCAweGZjMDAwODAwLCAiYWksYix4IiwgcGExMH0sCi17ICJzdWJpbyIsICAgICAgMHg5NDAwMDgwMCwgMHhmYzAwMDgwMCwgImFpLGIseCIsIHBhMTB9LAoteyAiY29taWNsciIsICAgIDB4OTAwMDAwMDAsIDB4ZmMwMDA4MDAsICJhaSxiLHgiLCBwYTEwfSwKLXsgInNoMWFkZCIsICAgICAweDA4MDAwNjQwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDFhZGRsIiwgICAgMHgwODAwMGE0MCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gxYWRkbyIsICAgIDB4MDgwMDBlNDAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgInNoMmFkZCIsICAgICAweDA4MDAwNjgwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDJhZGRsIiwgICAgMHgwODAwMGE4MCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gyYWRkbyIsICAgIDB4MDgwMDBlODAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLXsgInNoM2FkZCIsICAgICAweDA4MDAwNmMwLCAweGZjMDAwZmUwLCAiZHgsYix0IiwgcGExMH0sCi17ICJzaDNhZGRsIiwgICAgMHgwODAwMGFjMCwgMHhmYzAwMGZlMCwgImR4LGIsdCIsIHBhMTB9LAoteyAic2gzYWRkbyIsICAgIDB4MDgwMDBlYzAsIDB4ZmMwMDBmZTAsICJkeCxiLHQiLCBwYTEwfSwKLQotLyogRXh0cmFjdCBhbmQgRGVwb3NpdCBJbnN0cnVjdGlvbnMgKi8KLQoteyAidnNoZCIsICAgICAgIDB4ZDAwMDAwMDAsIDB4ZmMwMDFmZTAsICI+eCxiLHQiLCBwYTEwfSwKLXsgInNoZCIsICAgICAgICAweGQwMDAwODAwLCAweGZjMDAxYzAwLCAiPngsYixwLHQiLCBwYTEwfSwKLXsgInZleHRydSIsICAgICAweGQwMDAxMDAwLCAweGZjMDAxZmUwLCAiPmIsVCx4IiwgcGExMH0sCi17ICJ2ZXh0cnMiLCAgICAgMHhkMDAwMTQwMCwgMHhmYzAwMWZlMCwgIj5iLFQseCIsIHBhMTB9LAoteyAiZXh0cnUiLCAgICAgIDB4ZDAwMDE4MDAsIDB4ZmMwMDFjMDAsICI+YixQLFQseCIsIHBhMTB9LAoteyAiZXh0cnMiLCAgICAgIDB4ZDAwMDFjMDAsIDB4ZmMwMDFjMDAsICI+YixQLFQseCIsIHBhMTB9LAoteyAienZkZXAiLCAgICAgIDB4ZDQwMDAwMDAsIDB4ZmMwMDFmZTAsICI+eCxULGIiLCBwYTEwfSwKLXsgInZkZXAiLCAgICAgICAweGQ0MDAwNDAwLCAweGZjMDAxZmUwLCAiPngsVCxiIiwgcGExMH0sCi17ICJ6ZGVwIiwgICAgICAgMHhkNDAwMDgwMCwgMHhmYzAwMWMwMCwgIj54LHAsVCxiIiwgcGExMH0sCi17ICJkZXAiLCAgICAgICAgMHhkNDAwMGMwMCwgMHhmYzAwMWMwMCwgIj54LHAsVCxiIiwgcGExMH0sCi17ICJ6dmRlcGkiLCAgICAgMHhkNDAwMTAwMCwgMHhmYzAwMWZlMCwgIj41LFQsYiIsIHBhMTB9LAoteyAidmRlcGkiLCAgICAgIDB4ZDQwMDE0MDAsIDB4ZmMwMDFmZTAsICI+NSxULGIiLCBwYTEwfSwKLXsgInpkZXBpIiwgICAgICAweGQ0MDAxODAwLCAweGZjMDAxYzAwLCAiPjUscCxULGIiLCBwYTEwfSwKLXsgImRlcGkiLCAgICAgICAweGQ0MDAxYzAwLCAweGZjMDAxYzAwLCAiPjUscCxULGIiLCBwYTEwfSwKLQotLyogU3lzdGVtIENvbnRyb2wgSW5zdHJ1Y3Rpb25zICovCi0KLXsgImJyZWFrIiwgICAgICAweDAwMDAwMDAwLCAweGZjMDAxZmUwLCAicixBIiwgcGExMH0sCi17ICJyZmkiLCAgICAgICAgMHgwMDAwMGMwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTB9LAoteyAicmZpciIsICAgICAgIDB4MDAwMDBjYTAsIDB4ZmZmZmZmZmYsICIiLCBwYTExfSwKLXsgInNzbSIsICAgICAgICAweDAwMDAwZDYwLCAweGZmZTBmZmUwLCAiUix0IiwgcGExMH0sCi17ICJyc20iLCAgICAgICAgMHgwMDAwMGU2MCwgMHhmZmUwZmZlMCwgIlIsdCIsIHBhMTB9LAoteyAibXRzbSIsICAgICAgIDB4MDAwMDE4NjAsIDB4ZmZlMGZmZmYsICJ4IiwgcGExMH0sCi17ICJsZHNpZCIsICAgICAgMHgwMDAwMTBhMCwgMHhmYzFmM2ZlMCwgIihzLGIpLHQiLCBwYTEwfSwKLXsgImxkc2lkIiwgICAgICAweDAwMDAxMGEwLCAweGZjMWYzZmUwLCAiKGIpLHQiLCBwYTEwfSwKLXsgIm10c3AiLCAgICAgICAweDAwMDAxODIwLCAweGZmZTAxZmZmLCAieCxTIiwgcGExMH0sCi17ICJtdGN0bCIsICAgICAgMHgwMDAwMTg0MCwgMHhmYzAwZmZmZiwgIngsXiIsIHBhMTB9LAoteyAibXRzYXJjbSIsICAgIDB4MDE2MDE4QzAsIDB4ZmZlMGZmZmYsICJ4IiwgcGEyMH0sCi17ICJtZmlhIiwgICAgICAgMHgwMDAwMTRBMCwgMHhmZmZmZmZlMCwgInQiLCBwYTIwfSwKLXsgIm1mc3AiLCAgICAgICAweDAwMDAwNGEwLCAweGZmZmYxZmUwLCAiUyx0IiwgcGExMH0sCi17ICJtZmN0bCIsICAgICAgMHgwMDAwMDhhMCwgMHhmYzFmZmZlMCwgIl4sdCIsIHBhMTB9LAoteyAic3luYyIsICAgICAgIDB4MDAwMDA0MDAsIDB4ZmZmZmZmZmYsICIiLCBwYTEwfSwKLXsgInN5bmNkbWEiLCAgICAweDAwMTAwNDAwLCAweGZmZmZmZmZmLCAiIiwgcGExMH0sCi17ICJwcm9iZXIiLCAgICAgMHgwNDAwMTE4MCwgMHhmYzAwM2ZlMCwgIihzLGIpLHgsdCIsIHBhMTB9LAoteyAicHJvYmVyIiwgICAgIDB4MDQwMDExODAsIDB4ZmMwMDNmZTAsICIoYikseCx0IiwgcGExMH0sCi17ICJwcm9iZXJpIiwgICAgMHgwNDAwMzE4MCwgMHhmYzAwM2ZlMCwgIihzLGIpLFIsdCIsIHBhMTB9LAoteyAicHJvYmVyaSIsICAgIDB4MDQwMDMxODAsIDB4ZmMwMDNmZTAsICIoYiksUix0IiwgcGExMH0sCi17ICJwcm9iZXciLCAgICAgMHgwNDAwMTFjMCwgMHhmYzAwM2ZlMCwgIihzLGIpLHgsdCIsIHBhMTB9LAoteyAicHJvYmV3IiwgICAgIDB4MDQwMDExYzAsIDB4ZmMwMDNmZTAsICIoYikseCx0IiwgcGExMH0sCi17ICJwcm9iZXdpIiwgICAgMHgwNDAwMzFjMCwgMHhmYzAwM2ZlMCwgIihzLGIpLFIsdCIsIHBhMTB9LAoteyAicHJvYmV3aSIsICAgIDB4MDQwMDMxYzAsIDB4ZmMwMDNmZTAsICIoYiksUix0IiwgcGExMH0sCi17ICJscGEiLCAgICAgICAgMHgwNDAwMTM0MCwgMHhmYzAwM2ZjMCwgIlp4KHMsYiksdCIsIHBhMTB9LAoteyAibHBhIiwgICAgICAgIDB4MDQwMDEzNDAsIDB4ZmMwMDNmYzAsICJaeChiKSx0IiwgcGExMH0sCi17ICJsaGEiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZjMCwgIlp4KHMsYiksdCIsIHBhMTB9LAoteyAibGhhIiwgICAgICAgIDB4MDQwMDEzMDAsIDB4ZmMwMDNmYzAsICJaeChiKSx0IiwgcGExMH0sCi17ICJsY2kiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZlMCwgIngocyxiKSx0IiwgcGExMH0sCi17ICJsY2kiLCAgICAgICAgMHgwNDAwMTMwMCwgMHhmYzAwM2ZlMCwgIngoYiksdCIsIHBhMTB9LAoteyAicGR0bGIiLCAgICAgIDB4MDQwMDEyMDAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMH0sCi17ICJwZHRsYiIsICAgICAgMHgwNDAwMTIwMCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJwaXRsYiIsICAgICAgMHgwNDAwMDIwMCwgMHhmYzAwMWZkZiwgIlp4KFMsYikiLCBwYTEwfSwKLXsgInBpdGxiIiwgICAgICAweDA0MDAwMjAwLCAweGZjMDAxZmRmLCAiWngoYikiLCBwYTEwfSwKLXsgInBkdGxiZSIsICAgICAweDA0MDAxMjQwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTB9LAoteyAicGR0bGJlIiwgICAgIDB4MDQwMDEyNDAsIDB4ZmMwMDNmZGYsICJaeChiKSIsIHBhMTB9LAoteyAicGl0bGJlIiwgICAgIDB4MDQwMDAyNDAsIDB4ZmMwMDFmZGYsICJaeChTLGIpIiwgcGExMH0sCi17ICJwaXRsYmUiLCAgICAgMHgwNDAwMDI0MCwgMHhmYzAwMWZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJpZHRsYmEiLCAgICAgMHgwNDAwMTA0MCwgMHhmYzAwM2ZmZiwgIngsKHMsYikiLCBwYTEwfSwKLXsgImlkdGxiYSIsICAgICAweDA0MDAxMDQwLCAweGZjMDAzZmZmLCAieCwoYikiLCBwYTEwfSwKLXsgImlpdGxiYSIsICAgICAweDA0MDAwMDQwLCAweGZjMDAxZmZmLCAieCwoUyxiKSIsIHBhMTB9LAoteyAiaWl0bGJhIiwgICAgIDB4MDQwMDAwNDAsIDB4ZmMwMDFmZmYsICJ4LChiKSIsIHBhMTB9LAoteyAiaWR0bGJwIiwgICAgIDB4MDQwMDEwMDAsIDB4ZmMwMDNmZmYsICJ4LChzLGIpIiwgcGExMH0sCi17ICJpZHRsYnAiLCAgICAgMHgwNDAwMTAwMCwgMHhmYzAwM2ZmZiwgIngsKGIpIiwgcGExMH0sCi17ICJpaXRsYnAiLCAgICAgMHgwNDAwMDAwMCwgMHhmYzAwMWZmZiwgIngsKFMsYikiLCBwYTEwfSwKLXsgImlpdGxicCIsICAgICAweDA0MDAwMDAwLCAweGZjMDAxZmZmLCAieCwoYikiLCBwYTEwfSwKLXsgInBkYyIsICAgICAgICAweDA0MDAxMzgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTB9LAoteyAicGRjIiwgICAgICAgIDB4MDQwMDEzODAsIDB4ZmMwMDNmZGYsICJaeChiKSIsIHBhMTB9LAoteyAiZmRjIiwgICAgICAgIDB4MDQwMDEyODAsIDB4ZmMwMDNmZGYsICJaeChzLGIpIiwgcGExMH0sCi17ICJmZGMiLCAgICAgICAgMHgwNDAwMTI4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJmaWMiLCAgICAgICAgMHgwNDAwMDI4MCwgMHhmYzAwMWZkZiwgIlp4KFMsYikiLCBwYTEwfSwKLXsgImZpYyIsICAgICAgICAweDA0MDAwMjgwLCAweGZjMDAxZmRmLCAiWngoYikiLCBwYTEwfSwKLXsgImZkY2UiLCAgICAgICAweDA0MDAxMmMwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTB9LAoteyAiZmRjZSIsICAgICAgIDB4MDQwMDEyYzAsIDB4ZmMwMDNmZGYsICJaeChiKSIsIHBhMTB9LAoteyAiZmljZSIsICAgICAgIDB4MDQwMDAyYzAsIDB4ZmMwMDFmZGYsICJaeChTLGIpIiwgcGExMH0sCi17ICJmaWNlIiwgICAgICAgMHgwNDAwMDJjMCwgMHhmYzAwMWZkZiwgIlp4KGIpIiwgcGExMH0sCi17ICJkaWFnIiwgICAgICAgMHgxNDAwMDAwMCwgMHhmYzAwMDAwMCwgIkQiLCBwYTEwfSwKLQotLyogVGhlc2UgbWF5IGJlIHNwZWNpZmljIHRvIGNlcnRhaW4gdmVyc2lvbnMgb2YgdGhlIFBBLiAgSm9lbCBjbGFpbWVkCi0gICB0aGV5IHdlcmUgNzIwMDAgKDcyMDA/KSBzcGVjaWZpYy4gIEhvd2V2ZXIsIEknbSBhbG1vc3QgY2VydGFpbiB0aGUKLSAgIG10Y3B1L21mY3B1IHdlcmUgdW5kb2N1bWVudGVkLCBidXQgYXZhaWxhYmxlIGluIHRoZSBvbGRlciA3MDAgbWFjaGluZXMuICAqLwoteyAibXRjcHUiLCAgICAgIDB4MTQwMDE2MDAsIDB4ZmMwMGZmZmYsICJ4LF4ifSwKLXsgIm1mY3B1IiwgICAgICAweDE0MDAxQTAwLCAweGZjMDBmZmZmLCAiXix4In0sCi17ICJ0b2NlbiIsICAgICAgMHgxNDQwMzYwMCwgMHhmZmZmZmZmZiwgIiJ9LAoteyAidG9jZGlzIiwgICAgIDB4MTQ0MDE2MjAsIDB4ZmZmZmZmZmYsICIifSwKLXsgInNoZHdnciIsICAgICAweDE0NDAyNjAwLCAweGZmZmZmZmZmLCAiIn0sCi17ICJncnNoZHciLCAgICAgMHgxNDQwMDYyMCwgMHhmZmZmZmZmZiwgIiJ9LAotCi0vKiBnZncgYW5kIGdmciBhcmUgbm90IGluIHRoZSBIUCBQQSAxLjEgbWFudWFsLCBidXQgdGhleSBhcmUgaW4gZWl0aGVyCi0gICB0aGUgVGltZXggRlBVIG9yIHRoZSBNdXN0YW5nIEVSUyAobm90IHN1cmUgd2hpY2gpIG1hbnVhbC4gICovCi17ICJnZnciLAkweDA0MDAxNjgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTF9LAoteyAiZ2Z3IiwJMHgwNDAwMTY4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMX0sCi17ICJnZnIiLAkweDA0MDAxYTgwLCAweGZjMDAzZmRmLCAiWngocyxiKSIsIHBhMTF9LAoteyAiZ2ZyIiwJMHgwNDAwMWE4MCwgMHhmYzAwM2ZkZiwgIlp4KGIpIiwgcGExMX0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IENvcHJvY2Vzc29yIEluc3RydWN0aW9ucyAqLwotICAKLXsgImZsZHd4IiwgICAgICAweDI0MDAwMDAwLCAweGZjMDAxZjgwLCAiY3gocyxiKSx2IiwgcGExMH0sCi17ICJmbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWY4MCwgImN4KGIpLHYiLCBwYTEwfSwKLXsgImZsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZmMwLCAiY3gocyxiKSx5IiwgcGExMH0sCi17ICJmbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWZjMCwgImN4KGIpLHkiLCBwYTEwfSwKLXsgImZzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZjgwLCAiY3YseChzLGIpIiwgcGExMH0sCi17ICJmc3R3eCIsICAgICAgMHgyNDAwMDIwMCwgMHhmYzAwMWY4MCwgImN2LHgoYikiLCBwYTEwfSwKLXsgImZzdGR4IiwgICAgICAweDJjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3kseChzLGIpIiwgcGExMH0sCi17ICJmc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN5LHgoYikiLCBwYTEwfSwKLXsgImZzdHF4IiwgICAgICAweDNjMDAwMjAwLCAweGZjMDAxZmMwLCAiY3kseChzLGIpIiwgcGExMH0sCi17ICJmc3RxeCIsICAgICAgMHgzYzAwMDIwMCwgMHhmYzAwMWZjMCwgImN5LHgoYikiLCBwYTEwfSwKLXsgImZsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZjgwLCAiQzUocyxiKSx2IiwgcGExMH0sCi17ICJmbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWY4MCwgIkM1KGIpLHYiLCBwYTEwfSwKLXsgImZsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZmMwLCAiQzUocyxiKSx5IiwgcGExMH0sCi17ICJmbGRkcyIsICAgICAgMHgyYzAwMTAwMCwgMHhmYzAwMWZjMCwgIkM1KGIpLHkiLCBwYTEwfSwKLXsgImZzdHdzIiwgICAgICAweDI0MDAxMjAwLCAweGZjMDAxZjgwLCAiQ3YsNShzLGIpIiwgcGExMH0sCi17ICJmc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWY4MCwgIkN2LDUoYikiLCBwYTEwfSwKLXsgImZzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3ksNShzLGIpIiwgcGExMH0sCi17ICJmc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN5LDUoYikiLCBwYTEwfSwKLXsgImZzdHFzIiwgICAgICAweDNjMDAxMjAwLCAweGZjMDAxZmMwLCAiQ3ksNShzLGIpIiwgcGExMH0sCi17ICJmc3RxcyIsICAgICAgMHgzYzAwMTIwMCwgMHhmYzAwMWZjMCwgIkN5LDUoYikiLCBwYTEwfSwKLXsgImZhZGQiLCAgICAgICAweDMwMDAwNjAwLCAweGZjMDBlN2UwLCAiRkUsWCx2IiwgcGExMH0sCi17ICJmYWRkIiwgICAgICAgMHgzODAwMDYwMCwgMHhmYzAwZTcyMCwgIklKLEssdiIsIHBhMTB9LAoteyAiZnN1YiIsICAgICAgIDB4MzAwMDI2MDAsIDB4ZmMwMGU3ZTAsICJGRSxYLHYiLCBwYTEwfSwKLXsgImZzdWIiLCAgICAgICAweDM4MDAyNjAwLCAweGZjMDBlNzIwLCAiSUosSyx2IiwgcGExMH0sCi17ICJmbXB5IiwgICAgICAgMHgzMDAwNDYwMCwgMHhmYzAwZTdlMCwgIkZFLFgsdiIsIHBhMTB9LAoteyAiZm1weSIsICAgICAgIDB4MzgwMDQ2MDAsIDB4ZmMwMGU3MjAsICJJSixLLHYiLCBwYTEwfSwKLXsgImZkaXYiLCAgICAgICAweDMwMDA2NjAwLCAweGZjMDBlN2UwLCAiRkUsWCx2IiwgcGExMH0sCi17ICJmZGl2IiwgICAgICAgMHgzODAwNjYwMCwgMHhmYzAwZTcyMCwgIklKLEssdiIsIHBhMTB9LAoteyAiZnNxcnQiLCAgICAgIDB4MzAwMDgwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGExMH0sCi17ICJmc3FydCIsICAgICAgMHgzODAwODAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTEwfSwKLXsgImZhYnMiLCAgICAgICAweDMwMDA2MDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMTB9LAoteyAiZmFicyIsICAgICAgIDB4MzgwMDYwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGExMH0sCi17ICJmcmVtIiwgICAgICAgMHgzMDAwODYwMCwgMHhmYzAwZTdlMCwgIkZFLFgsdiIsIHBhMTB9LAoteyAiZnJlbSIsICAgICAgIDB4MzgwMDg2MDAsIDB4ZmMwMGU3MjAsICJGSixLLHYiLCBwYTEwfSwKLXsgImZybmQiLCAgICAgICAweDMwMDBhMDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMTB9LAoteyAiZnJuZCIsICAgICAgIDB4MzgwMGEwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGExMH0sCi17ICJmY3B5IiwgICAgICAgMHgzMDAwNDAwMCwgMHhmYzFmZTdlMCwgIkZFLHYiLCBwYTEwfSwKLXsgImZjcHkiLCAgICAgICAweDM4MDA0MDAwLCAweGZjMWZlNzIwLCAiRkosdiIsIHBhMTB9LAoteyAiZmNudmZmIiwgICAgIDB4MzAwMDAyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZmIiwgICAgIDB4MzgwMDAyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudnhmIiwgICAgIDB4MzAwMDgyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudnhmIiwgICAgIDB4MzgwMDgyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzAwMTAyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZ4IiwgICAgIDB4MzgwMTAyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzAwMTgyMDAsIDB4ZmMxZjg3ZTAsICJGR0UsdiIsIHBhMTB9LAoteyAiZmNudmZ4dCIsICAgIDB4MzgwMTgyMDAsIDB4ZmMxZjg3MjAsICJGR0osdiIsIHBhMTB9LAoteyAiZm1weWZhZGQiLCAgIDB4YjgwMDAwMDAsIDB4ZmMwMDAwMjAsICJGRSxYLDMsdiIsIHBhMjB9LAoteyAiZm1weW5mYWRkIiwgIDB4YjgwMDAwMjAsIDB4ZmMwMDAwMjAsICJGRSxYLDMsdiIsIHBhMjB9LAoteyAiZm5lZyIsICAgICAgIDB4MzAwMGMwMDAsIDB4ZmMxZmU3ZTAsICJGRSx2IiwgcGEyMH0sCi17ICJmbmVnIiwgICAgICAgMHgzODAwYzAwMCwgMHhmYzFmZTcyMCwgIkZKLHYiLCBwYTIwfSwKLXsgImZuZWdhYnMiLCAgICAweDMwMDBlMDAwLCAweGZjMWZlN2UwLCAiRkUsdiIsIHBhMjB9LAoteyAiZm5lZ2FicyIsICAgIDB4MzgwMGUwMDAsIDB4ZmMxZmU3MjAsICJGSix2IiwgcGEyMH0sCi17ICJmY21wIiwgICAgICAgMHgzMDAwMDQwMCwgMHhmYzAwZTdlMCwgIkZNRSxYIiwgcGExMH0sCi17ICJmY21wIiwgICAgICAgMHgzODAwMDQwMCwgMHhmYzAwZTcyMCwgIklNSixLIiwgcGExMH0sCi17ICJ4bXB5dSIsCTB4MzgwMDQ3MDAsIDB4ZmMwMGU3MjAsICJFLFgsdiIsIHBhMTF9LAoteyAiZm1weWFkZCIsCTB4MTgwMDAwMDAsIDB4ZmMwMDAwMDAsICJINCw2LDcsOSw4IiwgcGExMX0sCi17ICJmbXB5c3ViIiwJMHg5ODAwMDAwMCwgMHhmYzAwMDAwMCwgIkg0LDYsNyw5LDgiLCBwYTExfSwKLXsgImZ0ZXN0IiwgICAgICAweDMwMDAyNDIwLCAweGZmZmZmZmZmLCAiIiwgcGExMH0sCi17ICJmaWQiLCAgICAgICAgMHgzMDAwMDAwMCwgMHhmZmZmZmZmZiwgIiIsIHBhMTF9LAotCi0KLS8qIEFzc2lzdCBJbnN0cnVjdGlvbnMgKi8KLQoteyAic3BvcDAiLCAgICAgIDB4MTAwMDAwMDAsIDB4ZmMwMDA2MDAsICJmLE9OIiwgcGExMH0sCi17ICJzcG9wMSIsICAgICAgMHgxMDAwMDIwMCwgMHhmYzAwMDYwMCwgImYsb050IiwgcGExMH0sCi17ICJzcG9wMiIsICAgICAgMHgxMDAwMDQwMCwgMHhmYzAwMDYwMCwgImYsMU5iIiwgcGExMH0sCi17ICJzcG9wMyIsICAgICAgMHgxMDAwMDYwMCwgMHhmYzAwMDYwMCwgImYsME54LGIiLCBwYTEwfSwKLXsgImNvcHIiLCAgICAgICAweDMwMDAwMDAwLCAweGZjMDAwMDAwLCAidSwyTiIsIHBhMTB9LAoteyAiY2xkd3giLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmMwMDFlMDAsICJ1Y3gocyxiKSx0IiwgcGExMH0sCi17ICJjbGR3eCIsICAgICAgMHgyNDAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeChiKSx0IiwgcGExMH0sCi17ICJjbGRkeCIsICAgICAgMHgyYzAwMDAwMCwgMHhmYzAwMWUwMCwgInVjeChzLGIpLHQiLCBwYTEwfSwKLXsgImNsZGR4IiwgICAgICAweDJjMDAwMDAwLCAweGZjMDAxZTAwLCAidWN4KGIpLHQiLCBwYTEwfSwKLXsgImNzdHd4IiwgICAgICAweDI0MDAwMjAwLCAweGZjMDAxZTAwLCAidWN0LHgocyxiKSIsIHBhMTB9LAoteyAiY3N0d3giLCAgICAgIDB4MjQwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3QseChiKSIsIHBhMTB9LAoteyAiY3N0ZHgiLCAgICAgIDB4MmMwMDAyMDAsIDB4ZmMwMDFlMDAsICJ1Y3QseChzLGIpIiwgcGExMH0sCi17ICJjc3RkeCIsICAgICAgMHgyYzAwMDIwMCwgMHhmYzAwMWUwMCwgInVjdCx4KGIpIiwgcGExMH0sCi17ICJjbGR3cyIsICAgICAgMHgyNDAwMTAwMCwgMHhmYzAwMWUwMCwgInVDNShzLGIpLHQiLCBwYTEwfSwKLXsgImNsZHdzIiwgICAgICAweDI0MDAxMDAwLCAweGZjMDAxZTAwLCAidUM1KGIpLHQiLCBwYTEwfSwKLXsgImNsZGRzIiwgICAgICAweDJjMDAxMDAwLCAweGZjMDAxZTAwLCAidUM1KHMsYiksdCIsIHBhMTB9LAoteyAiY2xkZHMiLCAgICAgIDB4MmMwMDEwMDAsIDB4ZmMwMDFlMDAsICJ1QzUoYiksdCIsIHBhMTB9LAoteyAiY3N0d3MiLCAgICAgIDB4MjQwMDEyMDAsIDB4ZmMwMDFlMDAsICJ1Q3QsNShzLGIpIiwgcGExMH0sCi17ICJjc3R3cyIsICAgICAgMHgyNDAwMTIwMCwgMHhmYzAwMWUwMCwgInVDdCw1KGIpIiwgcGExMH0sCi17ICJjc3RkcyIsICAgICAgMHgyYzAwMTIwMCwgMHhmYzAwMWUwMCwgInVDdCw1KHMsYikiLCBwYTEwfSwKLXsgImNzdGRzIiwgICAgICAweDJjMDAxMjAwLCAweGZjMDAxZTAwLCAidUN0LDUoYikiLCBwYTEwfSwKLX07Ci0KLSNkZWZpbmUgTlVNT1BDT0RFUyAoKHNpemVvZiBwYV9vcGNvZGVzKS8oc2l6ZW9mIHBhX29wY29kZXNbMF0pKQotCi0vKiBTS1YgMTIvMTgvOTIuIEFkZGVkIHNvbWUgZGVub3RhdGlvbnMgZm9yIHZhcmlvdXMgb3BlcmFuZHMuICovCi0KLSNkZWZpbmUgUEFfSU1NMTFfQVRfMzEgJ2knCi0jZGVmaW5lIFBBX0lNTTE0X0FUXzMxICdqJwotI2RlZmluZSBQQV9JTU0yMV9BVF8zMSAnaycKLSNkZWZpbmUgUEFfRElTUDEyICd3JwotI2RlZmluZSBQQV9ESVNQMTcgJ1cnCi0KLSNkZWZpbmUgTl9IUFBBX09QRVJBTkRfRk9STUFUUyA1CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9pMzg2LmggYi9pbmNsdWRlL29wY29kZS9pMzg2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhODcyZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvaTM4Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NyArMCwwIEBACi0vKiBvcGNvZGUvaTM4Ni5oIC0tIEludGVsIDgwMzg2IG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIsIGFuZCBHREIsIHRoZSBHTlUgRGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZSBVbml4V2FyZSBhc3NlbWJsZXIsIGFuZCBwcm9iYWJseSBvdGhlciBBVCZUIGRlcml2ZWQgaXg4NiBVbml4Ci0gICBhc3NlbWJsZXJzLCBnZW5lcmF0ZSBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgd2l0aCByZXZlcnNlZAotICAgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgaW4gY2VydGFpbiBjYXNlcy4gIFVuZm9ydHVuYXRlbHksCi0gICBnY2MgYW5kIHBvc3NpYmx5IG1hbnkgb3RoZXIgcHJvZ3JhbXMgdXNlIHRoaXMgcmV2ZXJzZWQgc3ludGF4LCBzbwotICAgd2UncmUgc3R1Y2sgd2l0aCBpdC4KLQotICAgZWcuIGBmc3ViICVzdCgzKSwlc3QnIHJlc3VsdHMgaW4gc3QgPC0gc3QgLSBzdCgzKSBhcyBleHBlY3RlZCwgYnV0Ci0gICBgZnN1YiAlc3QsJXN0KDMpJyByZXN1bHRzIGluIHN0KDMpIDwtIHN0IC0gc3QoMyksIHJhdGhlciB0aGFuCi0gICB0aGUgZXhwZWN0ZWQgc3QoMykgPC0gc3QoMykgLSBzdCAhCi0KLSAgIFRoaXMgaGFwcGVucyB3aXRoIGFsbCB0aGUgbm9uLWNvbW11dGF0aXZlIGFyaXRobWV0aWMgZmxvYXRpbmcgcG9pbnQKLSAgIG9wZXJhdGlvbnMgd2l0aCB0d28gcmVnaXN0ZXIgb3BlcmFuZHMsIHdoZXJlIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMKLSAgICVzdCwgYW5kIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGlzICVzdChpKS4gIExvb2sgZm9yIEZsb2F0RFIgYmVsb3cuICAqLwotCi0jaWZuZGVmIFVOSVhXQVJFX0NPTVBBVAotLyogU2V0IG5vbi16ZXJvIGZvciBicm9rZW4sIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgU2V0IHRvIHplcm8gZm9yCi0gICBub24tYnJva2VuIG9wY29kZXMgYXQgeW91ciBwZXJpbC4gIGdjYyBnZW5lcmF0ZXMgVW5peFdhcmUKLSAgIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgVU5JWFdBUkVfQ09NUEFUIDEKLSNlbmRpZgotCi0KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZSBpMzg2X29wdGFiW10gPSB7Ci0KLSNkZWZpbmUgWCBOb25lCi0jZGVmaW5lIE5vU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgYl9TdWYgKE5vX3dTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgd19TdWYgKE5vX2JTdWZ8Tm9fbFN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgbF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgZF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2xTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgeF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZnxOb19zU3VmfE5vX2xTdWZ8Tm9fZFN1ZikKLSNkZWZpbmUgYndfU3VmIChOb19sU3VmfE5vX3NTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBibF9TdWYgKE5vX3dTdWZ8Tm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIHdsX1N1ZiAoTm9fYlN1ZnxOb19zU3VmfE5vX2RTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgc2xfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9fZFN1ZnxOb194U3VmKQotI2RlZmluZSBzbGRfU3VmIChOb19iU3VmfE5vX3dTdWZ8Tm9feFN1ZikKLSNkZWZpbmUgc2xkeF9TdWYgKE5vX2JTdWZ8Tm9fd1N1ZikKLSNkZWZpbmUgYndsX1N1ZiAoTm9fc1N1ZnxOb19kU3VmfE5vX3hTdWYpCi0jZGVmaW5lIGJ3bGRfU3VmIChOb19zU3VmfE5vX3hTdWYpCi0jZGVmaW5lIEZQIChOb1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBsX0ZQIChsX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBkX0ZQIChkX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSB4X0ZQICh4X1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBzbF9GUCAoc2xfU3VmfElnbm9yZVNpemUpCi0jZGVmaW5lIHNsZF9GUCAoc2xkX1N1ZnxJZ25vcmVTaXplKQotI2RlZmluZSBzbGR4X0ZQIChzbGR4X1N1ZnxJZ25vcmVTaXplKQotI2lmIFVOSVhXQVJFX0NPTVBBVAotI2RlZmluZSBGbG9hdERSIEZsb2F0RAotI2Vsc2UKLSNkZWZpbmUgRmxvYXREUiAoRmxvYXREfEZsb2F0UikKLSNlbmRpZgotCi0vKiBtb3ZlIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNT1ZfQVhfRElTUDMyIDB4YTAKLXsgIm1vdiIsICAgMiwJMHhhMCwgWCwgYndsX1N1ZnxEfFcsCQkJeyBEaXNwMTZ8RGlzcDMyLCBBY2MsIDAgfSB9LAoteyAibW92IiwgICAyLAkweDg4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsgIm1vdiIsICAgMiwJMHhiMCwgWCwgYndsX1N1ZnxXfFNob3J0Rm9ybSwJCXsgSW1tLCBSZWcsIDAgfSB9LAoteyAibW92IiwgICAyLAkweGM2LCBYLCBid2xfU3VmfFd8TW9kcm0sCQl7IEltbSwgUmVnfEFueU1lbSwgMCB9IH0sCi0vKiBUaGUgbmV4dCB0d28gaW5zdHJ1Y3Rpb25zIGFjY2VwdCBXb3JkUmVnIHNvIHRoYXQgYSBzZWdtZW50IHJlZ2lzdGVyCi0gICBjYW4gYmUgY29waWVkIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCBhbmQgdmljZSB2ZXJzYSwgd2l0aG91dCB1c2luZyBhCi0gICBzaXplIHByZWZpeC4gIFdoZW4gbW92aW5nIHRvIGEgMzIgYml0IHJlZ2lzdGVyLCB0aGUgdXBwZXIgMTYgYml0cwotICAgYXJlIHNldCB0byBhbiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHZhbHVlIChvbiB0aGUgUGVudGl1bSBQcm8sCi0gICB0aGUgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB2YWx1ZSBpcyB6ZXJvKS4gICovCi17ICJtb3YiLCAgIDIsCTB4OGMsIFgsIHdsX1N1ZnxNb2RybSwJCQl7IFNSZWczfFNSZWcyLCBXb3JkUmVnfFdvcmRNZW0sIDAgfSB9LAoteyAibW92IiwgICAyLAkweDhlLCBYLCB3bF9TdWZ8TW9kcm18SWdub3JlU2l6ZSwJeyBXb3JkUmVnfFdvcmRNZW0sIFNSZWczfFNSZWcyLCAwIH0gfSwKLS8qIG1vdmUgdG8vZnJvbSBjb250cm9sIGRlYnVnIHJlZ2lzdGVycyAqLwoteyAibW92IiwgICAyLCAweDBmMjAsIFgsIGxfU3VmfER8TW9kcm18SWdub3JlU2l6ZSwJeyBDb250cm9sLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyMSwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IERlYnVnLCBSZWczMnxJbnZNZW0sIDB9IH0sCi17ICJtb3YiLCAgIDIsIDB4MGYyNCwgWCwgbF9TdWZ8RHxNb2RybXxJZ25vcmVTaXplLAl7IFRlc3QsIFJlZzMyfEludk1lbSwgMH0gfSwKLQotLyogbW92ZSB3aXRoIHNpZ24gZXh0ZW5kICovCi0vKiAibW92c2JsIiAmICJtb3ZzYnciIG11c3Qgbm90IGJlIHVuaWZpZWQgaW50byAibW92c2IiIHRvIGF2b2lkCi0gICBjb25mbGljdCB3aXRoIHRoZSAibW92cyIgc3RyaW5nIG1vdmUgaW5zdHJ1Y3Rpb24uICAqLwoteyJtb3ZzYmwiLCAyLCAweDBmYmUsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBSZWczMiwgMH0gfSwKLXsibW92c2J3IiwgMiwgMHgwZmJlLCBYLCBOb1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgUmVnMTYsIDB9IH0sCi17Im1vdnN3bCIsIDIsIDB4MGZiZiwgWCwgTm9TdWZ8TW9kcm0sCQkJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsibW92c3giLCAgMiwgMHgwZmJmLCBYLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLAl7IFJlZzE2fFNob3J0TWVtLCBSZWczMiwgMH0gfSwKLXsibW92c3giLCAgMiwgMHgwZmJlLCBYLCBiX1N1ZnxNb2RybSwJCQl7IFJlZzh8Qnl0ZU1lbSwgV29yZFJlZywgMH0gfSwKLQotLyogbW92ZSB3aXRoIHplcm8gZXh0ZW5kICovCi17Im1vdnpiIiwgIDIsIDB4MGZiNiwgWCwgd2xfU3VmfE1vZHJtLAkJCXsgUmVnOHxCeXRlTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJtb3Z6d2wiLCAyLCAweDBmYjcsIFgsIE5vU3VmfE1vZHJtLAkJCXsgUmVnMTZ8U2hvcnRNZW0sIFJlZzMyLCAwfSB9LAotLyogSW50ZWwgU3ludGF4ICovCi17Im1vdnp4IiwgIDIsIDB4MGZiNywgWCwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSwJeyBSZWcxNnxTaG9ydE1lbSwgUmVnMzIsIDB9IH0sCi17Im1vdnp4IiwgIDIsIDB4MGZiNiwgWCwgYl9TdWZ8TW9kcm0sCQkJeyBSZWc4fEJ5dGVNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLS8qIHB1c2ggaW5zdHJ1Y3Rpb25zICovCi17InB1c2giLCAgIDEsCTB4NTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywwLDAgfSB9LAoteyJwdXNoIiwgICAxLAkweGZmLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMCB9IH0sCi17InB1c2giLCAgIDEsCTB4NmEsIFgsIHdsX1N1ZiwJCXsgSW1tOFMsIDAsIDB9IH0sCi17InB1c2giLCAgIDEsCTB4NjgsIFgsIHdsX1N1ZiwJCXsgSW1tMTZ8SW1tMzIsIDAsIDB9IH0sCi17InB1c2giLCAgIDEsCTB4MDYsIFgsIHdsX1N1ZnxTZWcyU2hvcnRGb3JtLAl7IFNSZWcyLDAsMCB9IH0sCi17InB1c2giLCAgIDEsIDB4MGZhMCwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm0sCXsgU1JlZzMsMCwwIH0gfSwKLS8qIHB1c2ggYWxsICovCi17InB1c2hhIiwgIDAsCTB4NjAsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMCB9IH0sCi0KLS8qIHBvcCBpbnN0cnVjdGlvbnMgKi8KLXsicG9wIiwJICAgMSwJMHg1OCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLDAsMCB9IH0sCi17InBvcCIsCSAgIDEsCTB4OGYsIDAsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCAwLCAwIH0gfSwKLSNkZWZpbmUgUE9QX1NFR19TSE9SVCAweDA3Ci17InBvcCIsCSAgIDEsCTB4MDcsIFgsIHdsX1N1ZnxTZWcyU2hvcnRGb3JtLAl7IFNSZWcyLDAsMCB9IH0sCi17InBvcCIsCSAgIDEsIDB4MGZhMSwgWCwgd2xfU3VmfFNlZzNTaG9ydEZvcm0sCXsgU1JlZzMsMCwwIH0gfSwKLS8qIHBvcCBhbGwgKi8KLXsicG9wYSIsICAgMCwJMHg2MSwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwIH0gfSwKLQotLyogeGNoZyBleGNoYW5nZSBpbnN0cnVjdGlvbnMKLSAgIHhjaGcgY29tbXV0ZXM6ICB3ZSBhbGxvdyBib3RoIG9wZXJhbmQgb3JkZXJzICovCi17InhjaGciLCAgIDIsCTB4OTAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgQWNjLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg5MCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBBY2MsIFdvcmRSZWcsIDAgfSB9LAoteyJ4Y2hnIiwgICAyLAkweDg2LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwIH0gfSwKLXsieGNoZyIsICAgMiwJMHg4NiwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIFJlZywgMCB9IH0sCi0KLS8qIGluL291dCBmcm9tIHBvcnRzICovCi17ImluIiwJICAgMiwJMHhlNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW04LCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDIsCTB4ZWMsIFgsIGJ3bF9TdWZ8VywJCXsgSW5PdXRQb3J0UmVnLCBBY2MsIDAgfSB9LAoteyJpbiIsCSAgIDEsCTB4ZTQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tOCwgMCwgMCB9IH0sCi17ImluIiwJICAgMSwJMHhlYywgWCwgYndsX1N1ZnxXLAkJeyBJbk91dFBvcnRSZWcsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAyLAkweGU2LCBYLCBid2xfU3VmfFcsCQl7IEFjYywgSW1tOCwgMCB9IH0sCi17Im91dCIsCSAgIDIsCTB4ZWUsIFgsIGJ3bF9TdWZ8VywJCXsgQWNjLCBJbk91dFBvcnRSZWcsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGU2LCBYLCBid2xfU3VmfFcsCQl7IEltbTgsIDAsIDAgfSB9LAoteyJvdXQiLAkgICAxLAkweGVlLCBYLCBid2xfU3VmfFcsCQl7IEluT3V0UG9ydFJlZywgMCwgMCB9IH0sCi0KLS8qIGxvYWQgZWZmZWN0aXZlIGFkZHJlc3MgKi8KLXsibGVhIiwJICAgMiwgMHg4ZCwgICBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDAgfSB9LAotCi0vKiBsb2FkIHNlZ21lbnQgcmVnaXN0ZXJzIGZyb20gbWVtb3J5ICovCi17ImxkcyIsCSAgIDIsCTB4YzUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGVzIiwJICAgMiwJMHhjNCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJsZnMiLAkgICAyLCAweDBmYjQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGdzIiwJICAgMiwgMHgwZmI1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImxzcyIsCSAgIDIsIDB4MGZiMiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAotCi0vKiBmbGFncyByZWdpc3RlciBpbnN0cnVjdGlvbnMgKi8KLXsiY2xjIiwJICAgMCwJMHhmOCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJjbGQiLAkgICAwLAkweGZjLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNsaSIsCSAgIDAsCTB4ZmEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiY2x0cyIsICAgMCwgMHgwZjA2LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImNtYyIsCSAgIDAsCTB4ZjUsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsibGFoZiIsICAgMCwJMHg5ZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJzYWhmIiwgICAwLAkweDllLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InB1c2hmIiwgIDAsCTB4OWMsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicG9wZiIsICAgMCwJMHg5ZCwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJzdGMiLAkgICAwLAkweGY5LCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17InN0ZCIsCSAgIDAsCTB4ZmQsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsic3RpIiwJICAgMCwJMHhmYiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBhcml0aG1ldGljICovCi17ImFkZCIsCSAgIDIsCTB4MDAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiYWRkIiwJICAgMiwJMHg4MywgMCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDA0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhZGQiLAkgICAyLAkweDgwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImluYyIsCSAgIDEsCTB4NDAsIFgsIHdsX1N1ZnxTaG9ydEZvcm0sCXsgV29yZFJlZywgMCwgMH0gfSwKLXsiaW5jIiwJICAgMSwJMHhmZSwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic3ViIiwJICAgMiwJMHgyOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzdWIiLAkgICAyLAkweDgzLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4MmMsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InN1YiIsCSAgIDIsCTB4ODAsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsiZGVjIiwJICAgMSwJMHg0OCwgWCwgd2xfU3VmfFNob3J0Rm9ybSwJeyBXb3JkUmVnLCAwLCAwfSB9LAoteyJkZWMiLAkgICAxLAkweGZlLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzYmIiLAkgICAyLAkweDE4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNiYiIsCSAgIDIsCTB4ODMsIDMsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsic2JiIiwJICAgMiwJMHgxYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsic2JiIiwJICAgMiwJMHg4MCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJjbXAiLAkgICAyLAkweDM4LCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImNtcCIsCSAgIDIsCTB4ODMsIDcsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiY21wIiwJICAgMiwJMHgzYywgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiY21wIiwJICAgMiwJMHg4MCwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgUmVnLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweDg0LCBYLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGE4LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJ0ZXN0IiwgICAyLAkweGY2LCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17ImFuZCIsCSAgIDIsCTB4MjAsIFgsIGJ3bF9TdWZ8RHxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMH0gfSwKLXsiYW5kIiwJICAgMiwJMHg4MywgNCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDI0LCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJhbmQiLAkgICAyLAkweDgwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tLCBSZWd8QW55TWVtLCAwfSB9LAotCi17Im9yIiwJICAgMiwJMHgwOCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODMsIDEsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsib3IiLAkgICAyLAkweDBjLCBYLCBid2xfU3VmfFcsCQl7IEltbSwgQWNjLCAwfSB9LAoteyJvciIsCSAgIDIsCTB4ODAsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLXsieG9yIiwJICAgMiwJMHgzMCwgWCwgYndsX1N1ZnxEfFd8TW9kcm0sCXsgUmVnLCBSZWd8QW55TWVtLCAwfSB9LAoteyJ4b3IiLAkgICAyLAkweDgzLCA2LCB3bF9TdWZ8TW9kcm0sCQl7IEltbThTLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17InhvciIsCSAgIDIsCTB4MzQsIFgsIGJ3bF9TdWZ8VywJCXsgSW1tLCBBY2MsIDB9IH0sCi17InhvciIsCSAgIDIsCTB4ODAsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0sIFJlZ3xBbnlNZW0sIDB9IH0sCi0KLS8qIGljbHIgd2l0aCAxIG9wZXJhbmQgaXMgcmVhbGx5IHhvciB3aXRoIDIgb3BlcmFuZHMuICovCi17ImNsciIsCSAgIDEsCTB4MzAsIFgsIGJ3bF9TdWZ8V3xNb2RybXxyZWdLbHVkZ2UsCXsgUmVnLCAwLCAwIH0gfSwKLQoteyJhZGMiLAkgICAyLAkweDEwLCBYLCBid2xfU3VmfER8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDB9IH0sCi17ImFkYyIsCSAgIDIsCTB4ODMsIDIsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOFMsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHgxNCwgWCwgYndsX1N1ZnxXLAkJeyBJbW0sIEFjYywgMH0gfSwKLXsiYWRjIiwJICAgMiwJMHg4MCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbSwgUmVnfEFueU1lbSwgMH0gfSwKLQoteyJuZWciLAkgICAxLAkweGY2LCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsibm90IiwJICAgMSwJMHhmNiwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsiYWFhIiwJICAgMCwJMHgzNywgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYXMiLAkgICAwLAkweDNmLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImRhYSIsCSAgIDAsCTB4MjcsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiZGFzIiwJICAgMCwJMHgyZiwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAoteyJhYWQiLAkgICAwLCAweGQ1MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFkIiwJICAgMSwgICAweGQ1LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAoteyJhYW0iLAkgICAwLCAweGQ0MGEsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiYWFtIiwJICAgMSwgICAweGQ0LCBYLCBOb1N1ZiwJCQl7IEltbThTLCAwLCAwfSB9LAotCi0vKiBjb252ZXJzaW9uIGluc25zICovCi0vKiBjb252ZXJzaW9uOglpbnRlbCBuYW1pbmcgKi8KLXsiY2J3IiwJICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjd2RlIiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3ZCIsCSAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2RxIiwJICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAotLyogIGF0dCBuYW1pbmcgKi8KLXsiY2J0dyIsICAgMCwJMHg5OCwgWCwgTm9TdWZ8U2l6ZTE2LAkJeyAwLCAwLCAwfSB9LAoteyJjd3RsIiwgICAwLAkweDk4LCBYLCBOb1N1ZnxTaXplMzIsCQl7IDAsIDAsIDB9IH0sCi17ImN3dGQiLCAgIDAsCTB4OTksIFgsIE5vU3VmfFNpemUxNiwJCXsgMCwgMCwgMH0gfSwKLXsiY2x0ZCIsICAgMCwJMHg5OSwgWCwgTm9TdWZ8U2l6ZTMyLAkJeyAwLCAwLCAwfSB9LAotCi0vKiBXYXJuaW5nISB0aGUgbXVsL2ltdWwgKG9wY29kZSAweGY2KSBtdXN0IG9ubHkgaGF2ZSAxIG9wZXJhbmQhICBUaGV5IGFyZQotICAgZXhwYW5kaW5nIDY0LWJpdCBtdWx0aXBsaWVzLCBhbmQgKmNhbm5vdCogYmUgc2VsZWN0ZWQgdG8gYWNjb21wbGlzaAotICAgJ2ltdWwgJWVieCwgJWVheCcgKG9wY29kZSAweDBmYWYgbXVzdCBiZSB1c2VkIGluIHRoaXMgY2FzZSkKLSAgIFRoZXNlIG11bHRpcGxpZXMgY2FuIG9ubHkgYmUgc2VsZWN0ZWQgd2l0aCBzaW5nbGUgb3BlcmFuZCBmb3Jtcy4gICovCi17Im11bCIsCSAgIDEsCTB4ZjYsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJpbXVsIiwgICAxLAkweGY2LCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaW11bCIsICAgMiwgMHgwZmFmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMywJMHg2YiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04UywgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnfSB9LAoteyJpbXVsIiwgICAzLAkweDY5LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTE2fEltbTMyLCBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWd9IH0sCi0vKiBpbXVsIHdpdGggMiBvcGVyYW5kcyBtaW1pY3MgaW11bCB3aXRoIDMgYnkgcHV0dGluZyB0aGUgcmVnaXN0ZXIgaW4KLSAgIGJvdGggaS5ybS5yZWcgJiBpLnJtLnJlZ21lbSBmaWVsZHMuICByZWdLbHVkZ2UgZW5hYmxlcyB0aGlzCi0gICB0cmFuc2Zvcm1hdGlvbi4gICovCi17ImltdWwiLCAgIDIsCTB4NmIsIFgsIHdsX1N1ZnxNb2RybXxyZWdLbHVkZ2UseyBJbW04UywgV29yZFJlZywgMH0gfSwKLXsiaW11bCIsICAgMiwJMHg2OSwgWCwgd2xfU3VmfE1vZHJtfHJlZ0tsdWRnZSx7IEltbTE2fEltbTMyLCBXb3JkUmVnLCAwfSB9LAotCi17ImRpdiIsCSAgIDEsCTB4ZjYsIDYsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAoteyJkaXYiLAkgICAyLAkweGY2LCA2LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgQWNjLCAwfSB9LAoteyJpZGl2IiwgICAxLAkweGY2LCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsiaWRpdiIsICAgMiwJMHhmNiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIEFjYywgMH0gfSwKLQoteyJyb2wiLAkgICAyLAkweGQwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9sIiwJICAgMiwJMHhjMCwgMCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvbCIsCSAgIDIsCTB4ZDIsIDAsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb2wiLAkgICAxLAkweGQwLCAwLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyb3IiLAkgICAyLAkweGQwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicm9yIiwJICAgMiwJMHhjMCwgMSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJvciIsCSAgIDIsCTB4ZDIsIDEsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyb3IiLAkgICAxLAkweGQwLCAxLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY2wiLAkgICAyLAkweGQwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNsIiwJICAgMiwJMHhjMCwgMiwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjbCIsCSAgIDIsCTB4ZDIsIDIsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY2wiLAkgICAxLAkweGQwLCAyLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJyY3IiLAkgICAyLAkweGQwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsicmNyIiwJICAgMiwJMHhjMCwgMywgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InJjciIsCSAgIDIsCTB4ZDIsIDMsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJyY3IiLAkgICAxLAkweGQwLCAzLCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzYWwiLAkgICAyLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FsIiwJICAgMiwJMHhjMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhbCIsCSAgIDIsCTB4ZDIsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYWwiLAkgICAxLAkweGQwLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLXsic2hsIiwJICAgMiwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTEsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNobCIsCSAgIDIsCTB4YzAsIDQsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW04LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaGwiLAkgICAyLAkweGQyLCA0LCBid2xfU3VmfFd8TW9kcm0sCXsgU2hpZnRDb3VudCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hsIiwJICAgMSwJMHhkMCwgNCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZ3xBbnlNZW0sIDAsIDB9IH0sCi0KLXsic2hsZCIsICAgMywgMHgwZmE0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IEltbTgsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hsZCIsICAgMywgMHgwZmE1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFNoaWZ0Q291bnQsIFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbX0gfSwKLXsic2hsZCIsICAgMiwgMHgwZmE1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWcsIFdvcmRSZWd8V29yZE1lbSwgMH0gfSwKLQoteyJzaHIiLAkgICAyLAkweGQwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tMSwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2hyIiwJICAgMiwJMHhjMCwgNSwgYndsX1N1ZnxXfE1vZHJtLAl7IEltbTgsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNociIsCSAgIDIsCTB4ZDIsIDUsIGJ3bF9TdWZ8V3xNb2RybSwJeyBTaGlmdENvdW50LCBSZWd8QW55TWVtLCAwfSB9LAoteyJzaHIiLAkgICAxLAkweGQwLCA1LCBid2xfU3VmfFd8TW9kcm0sCXsgUmVnfEFueU1lbSwgMCwgMH0gfSwKLQoteyJzaHJkIiwgICAzLCAweDBmYWMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgSW1tOCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaHJkIiwgICAzLCAweDBmYWQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgU2hpZnRDb3VudCwgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtfSB9LAoteyJzaHJkIiwgICAyLCAweDBmYWQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAotCi17InNhciIsCSAgIDIsCTB4ZDAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBJbW0xLCBSZWd8QW55TWVtLCAwfSB9LAoteyJzYXIiLAkgICAyLAkweGMwLCA3LCBid2xfU3VmfFd8TW9kcm0sCXsgSW1tOCwgUmVnfEFueU1lbSwgMH0gfSwKLXsic2FyIiwJICAgMiwJMHhkMiwgNywgYndsX1N1ZnxXfE1vZHJtLAl7IFNoaWZ0Q291bnQsIFJlZ3xBbnlNZW0sIDB9IH0sCi17InNhciIsCSAgIDEsCTB4ZDAsIDcsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWd8QW55TWVtLCAwLCAwfSB9LAotCi0vKiBjb250cm9sIHRyYW5zZmVyIGluc3RydWN0aW9ucyAqLwoteyJjYWxsIiwgICAxLAkweGU4LCBYLCB3bF9TdWZ8SnVtcER3b3JkLAl7IERpc3AxNnxEaXNwMzIsIDAsIDB9IH0sCi17ImNhbGwiLCAgIDEsCTB4ZmYsIDIsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtfEp1bXBBYnNvbHV0ZSwgMCwgMH0gfSwKLS8qIEludGVsIFN5bnRheCAqLwoteyJjYWxsIiwgICAyLAkweDlhLCBYLCB3bF9TdWZ8SnVtcEludGVyU2VnbWVudCwgeyBJbW0xNiwgSW1tMTZ8SW1tMzIsIDB9IH0sCi17ImxjYWxsIiwgIDIsCTB4OWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50LCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGNhbGwiLCAgMSwJMHhmZiwgMywgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAotCi0jZGVmaW5lIEpVTVBfUENfUkVMQVRJVkUgMHhlYgoteyJqbXAiLAkgICAxLAkweGViLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbXAiLAkgICAxLAkweGZmLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbXxKdW1wQWJzb2x1dGUsIDAsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiam1wIiwgICAgMiwJMHhlYSwgWCwgd2xfU3VmfEp1bXBJbnRlclNlZ21lbnQsIHsgSW1tMTYsIEltbTE2fEltbTMyLCAwfSB9LAoteyJqbXAiLCAgICAxLAkweGZmLCA1LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17ImxqbXAiLCAgIDIsCTB4ZWEsIFgsIHdsX1N1ZnxKdW1wSW50ZXJTZWdtZW50LCB7IEltbTE2LCBJbW0xNnxJbW0zMiwgMH0gfSwKLXsibGptcCIsICAgMSwJMHhmZiwgNSwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAotCi17InJldCIsCSAgIDAsCTB4YzMsIFgsIHdsX1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmV0IiwJICAgMSwJMHhjMiwgWCwgd2xfU3VmLAkJeyBJbW0xNiwgMCwgMH0gfSwKLXsibHJldCIsICAgMCwJMHhjYiwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJscmV0IiwgICAxLAkweGNhLCBYLCB3bF9TdWYsCQl7IEltbTE2LCAwLCAwfSB9LAoteyJlbnRlciIsICAyLAkweGM4LCBYLCB3bF9TdWYsCQl7IEltbTE2LCBJbW04LCAwfSB9LAoteyJsZWF2ZSIsICAwLAkweGM5LCBYLCB3bF9TdWYsCQl7IDAsIDAsIDB9IH0sCi0KLS8qIGNvbmRpdGlvbmFsIGp1bXBzICovCi17ImpvIiwJICAgMSwJMHg3MCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5vIiwJICAgMSwJMHg3MSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiamIiLAkgICAxLAkweDcyLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYyIsCSAgIDEsCTB4NzIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYWUiLCAgIDEsCTB4NzIsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYiIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuYyIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImphZSIsCSAgIDEsCTB4NzMsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImplIiwJICAgMSwJMHg3NCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianoiLAkgICAxLAkweDc0LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmUiLAkgICAxLAkweDc1LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbnoiLAkgICAxLAkweDc1LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYmUiLAkgICAxLAkweDc2LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmEiLAkgICAxLAkweDc2LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbmJlIiwgICAxLAkweDc3LCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqYSIsCSAgIDEsCTB4NzcsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpzIiwJICAgMSwJMHg3OCwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsiam5zIiwJICAgMSwJMHg3OSwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLXsianAiLAkgICAxLAkweDdhLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcGUiLAkgICAxLAkweDdhLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbnAiLAkgICAxLAkweDdiLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqcG8iLAkgICAxLAkweDdiLCBYLCBOb1N1ZnxKdW1wLAkJeyBEaXNwLCAwLCAwfSB9LAoteyJqbCIsCSAgIDEsCTB4N2MsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuZ2UiLCAgIDEsCTB4N2MsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubCIsCSAgIDEsCTB4N2QsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpnZSIsCSAgIDEsCTB4N2QsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpsZSIsCSAgIDEsCTB4N2UsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpuZyIsCSAgIDEsCTB4N2UsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpubGUiLCAgIDEsCTB4N2YsIFgsIE5vU3VmfEp1bXAsCQl7IERpc3AsIDAsIDB9IH0sCi17ImpnIiwJICAgMSwJMHg3ZiwgWCwgTm9TdWZ8SnVtcCwJCXsgRGlzcCwgMCwgMH0gfSwKLQotLyogamN4eiB2cy4gamVjeHogaXMgY2hvc2VuIG9uIHRoZSBiYXNpcyBvZiB0aGUgYWRkcmVzcyBzaXplIHByZWZpeC4gICovCi17ImpjeHoiLCAgIDEsCTB4ZTMsIFgsIE5vU3VmfEp1bXBCeXRlfFNpemUxNiwgeyBEaXNwLCAwLCAwfSB9LAoteyJqZWN4eiIsICAxLAkweGUzLCBYLCBOb1N1ZnxKdW1wQnl0ZXxTaXplMzIsIHsgRGlzcCwgMCwgMH0gfSwKLQotLyogVGhlIGxvb3AgaW5zdHJ1Y3Rpb25zIGFsc28gdXNlIHRoZSBhZGRyZXNzIHNpemUgcHJlZml4IHRvIHNlbGVjdAotICAgJWN4IHJhdGhlciB0aGFuICVlY3ggZm9yIHRoZSBsb29wIGNvdW50LCBzbyB0aGUgYHcnIGZvcm0gb2YgdGhlc2UKLSAgIGluc3RydWN0aW9ucyBlbWl0IGFuIGFkZHJlc3Mgc2l6ZSBwcmVmaXggcmF0aGVyIHRoYW4gYSBkYXRhIHNpemUKLSAgIHByZWZpeC4gICovCi17Imxvb3AiLCAgIDEsCTB4ZTIsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29weiIsICAxLAkweGUxLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLXsibG9vcGUiLCAgMSwJMHhlMSwgWCwgd2xfU3VmfEp1bXBCeXRlLAl7IERpc3AsIDAsIDB9IH0sCi17Imxvb3BueiIsIDEsCTB4ZTAsIFgsIHdsX1N1ZnxKdW1wQnl0ZSwJeyBEaXNwLCAwLCAwfSB9LAoteyJsb29wbmUiLCAxLAkweGUwLCBYLCB3bF9TdWZ8SnVtcEJ5dGUsCXsgRGlzcCwgMCwgMH0gfSwKLQotLyogc2V0IGJ5dGUgb24gZmxhZyBpbnN0cnVjdGlvbnMgKi8KLXsic2V0byIsICAgMSwgMHgwZjkwLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRubyIsICAxLCAweDBmOTEsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGIiLCAgIDEsIDB4MGY5MiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YyIsICAgMSwgMHgwZjkyLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYWUiLCAxLCAweDBmOTIsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5iIiwgIDEsIDB4MGY5MywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmMiLCAgMSwgMHgwZjkzLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRhZSIsICAxLCAweDBmOTMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGUiLCAgIDEsIDB4MGY5NCwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0eiIsICAgMSwgMHgwZjk0LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuZSIsICAxLCAweDBmOTUsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG56IiwgIDEsIDB4MGY5NSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YmUiLCAgMSwgMHgwZjk2LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRuYSIsICAxLCAweDBmOTYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5iZSIsIDEsIDB4MGY5NywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0YSIsICAgMSwgMHgwZjk3LCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRzIiwgICAxLCAweDBmOTgsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5zIiwgIDEsIDB4MGY5OSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cCIsICAgMSwgMHgwZjlhLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRwZSIsICAxLCAweDBmOWEsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5wIiwgIDEsIDB4MGY5YiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0cG8iLCAgMSwgMHgwZjliLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRsIiwgICAxLCAweDBmOWMsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldG5nZSIsIDEsIDB4MGY5YywgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmwiLCAgMSwgMHgwZjlkLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRnZSIsICAxLCAweDBmOWQsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGxlIiwgIDEsIDB4MGY5ZSwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLXsic2V0bmciLCAgMSwgMHgwZjllLCAwLCBiX1N1ZnxNb2RybSwJCXsgUmVnOHxCeXRlTWVtLCAwLCAwfSB9LAoteyJzZXRubGUiLCAxLCAweDBmOWYsIDAsIGJfU3VmfE1vZHJtLAkJeyBSZWc4fEJ5dGVNZW0sIDAsIDB9IH0sCi17InNldGciLCAgIDEsIDB4MGY5ZiwgMCwgYl9TdWZ8TW9kcm0sCQl7IFJlZzh8Qnl0ZU1lbSwgMCwgMH0gfSwKLQotLyogc3RyaW5nIG1hbmlwdWxhdGlvbiAqLwoteyJjbXBzIiwgICAwLAkweGE2LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17ImNtcHMiLCAgIDIsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCBBbnlNZW0sIDB9IH0sCi17InNjbXAiLCAgIDAsCTB4YTYsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic2NtcCIsICAgMiwJMHhhNiwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW18RXNTZWcsIEFueU1lbSwgMH0gfSwKLXsiaW5zIiwJICAgMCwJMHg2YywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJpbnMiLAkgICAyLAkweDZjLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEluT3V0UG9ydFJlZywgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJvdXRzIiwgICAwLAkweDZlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17Im91dHMiLCAgIDIsCTB4NmUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBJbk91dFBvcnRSZWcsIDB9IH0sCi17ImxvZHMiLCAgIDAsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsibG9kcyIsICAgMSwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIDAsIDB9IH0sCi17ImxvZHMiLCAgIDIsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBY2MsIDB9IH0sCi17InNsb2QiLCAgIDAsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsic2xvZCIsICAgMSwJMHhhYywgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIDAsIDB9IH0sCi17InNsb2QiLCAgIDIsCTB4YWMsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtLCBBY2MsIDB9IH0sCi17Im1vdnMiLCAgIDAsCTB4YTQsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgMCwgMCwgMH0gfSwKLXsibW92cyIsICAgMiwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyBBbnlNZW0sIEFueU1lbXxFc1NlZywgMH0gfSwKLXsic21vdiIsICAgMCwJMHhhNCwgWCwgYndsZF9TdWZ8V3xJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJzbW92IiwgICAyLAkweGE0LCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbSwgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJzY2FzIiwgICAwLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNjYXMiLCAgIDEsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCAwLCAwfSB9LAoteyJzY2FzIiwgICAyLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQWNjLCAwfSB9LAoteyJzc2NhIiwgICAwLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNzY2EiLCAgIDEsCTB4YWUsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCAwLCAwfSB9LAoteyJzc2NhIiwgICAyLAkweGFlLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFueU1lbXxFc1NlZywgQWNjLCAwfSB9LAoteyJzdG9zIiwgICAwLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InN0b3MiLCAgIDEsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCAwLCAwfSB9LAoteyJzdG9zIiwgICAyLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFjYywgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJzc3RvIiwgICAwLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IDAsIDAsIDB9IH0sCi17InNzdG8iLCAgIDEsCTB4YWEsIFgsIGJ3bGRfU3VmfFd8SXNTdHJpbmcsCXsgQW55TWVtfEVzU2VnLCAwLCAwfSB9LAoteyJzc3RvIiwgICAyLAkweGFhLCBYLCBid2xkX1N1ZnxXfElzU3RyaW5nLAl7IEFjYywgQW55TWVtfEVzU2VnLCAwfSB9LAoteyJ4bGF0IiwgICAwLAkweGQ3LCBYLCBiX1N1ZnxJc1N0cmluZywJeyAwLCAwLCAwfSB9LAoteyJ4bGF0IiwgICAxLAkweGQ3LCBYLCBiX1N1ZnxJc1N0cmluZywJeyBBbnlNZW0sIDAsIDB9IH0sCi0KLS8qIGJpdCBtYW5pcHVsYXRpb24gKi8KLXsiYnNmIiwJICAgMiwgMHgwZmJjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiYnNyIiwJICAgMiwgMHgwZmJkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiYnQiLAkgICAyLCAweDBmYTMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZywgV29yZFJlZ3xXb3JkTWVtLCAwfSB9LAoteyJidCIsCSAgIDIsIDB4MGZiYSwgNCwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0YyIsCSAgIDIsIDB4MGZiYiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0YyIsCSAgIDIsIDB4MGZiYSwgNywgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0ciIsCSAgIDIsIDB4MGZiMywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0ciIsCSAgIDIsIDB4MGZiYSwgNiwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0cyIsCSAgIDIsIDB4MGZhYiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi17ImJ0cyIsCSAgIDIsIDB4MGZiYSwgNSwgd2xfU3VmfE1vZHJtLAkJeyBJbW04LCBXb3JkUmVnfFdvcmRNZW0sIDB9IH0sCi0KLS8qIGludGVycnVwdHMgJiBvcC4gc3lzIGluc25zICovCi0vKiBTZWUgZ2FzL2NvbmZpZy90Yy1pMzg2LmMgZm9yIGNvbnZlcnNpb24gb2YgJ2ludCAkMycgaW50byB0aGUgc3BlY2lhbAotICAgaW50IDMgaW5zbi4gKi8KLSNkZWZpbmUgSU5UX09QQ09ERSAweGNkCi0jZGVmaW5lIElOVDNfT1BDT0RFIDB4Y2MKLXsiaW50IiwJICAgMSwJMHhjZCwgWCwgTm9TdWYsCQkJeyBJbW04LCAwLCAwfSB9LAoteyJpbnQzIiwgICAwLAkweGNjLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi17ImludG8iLCAgIDAsCTB4Y2UsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLXsiaXJldCIsICAgMCwJMHhjZiwgWCwgd2xfU3VmLAkJeyAwLCAwLCAwfSB9LAotLyogaTM4NnNsLCBpNDg2c2wsIGxhdGVyIDQ4NiwgYW5kIFBlbnRpdW0gKi8KLXsicnNtIiwJICAgMCwgMHgwZmFhLCBYLCBOb1N1ZiwJCQl7IDAsIDAsIDB9IH0sCi0KLXsiYm91bmQiLCAgMiwJMHg2MiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnLCBXb3JkTWVtLCAwfSB9LAotCi17ImhsdCIsCSAgIDAsCTB4ZjQsIFgsIE5vU3VmLAkJCXsgMCwgMCwgMH0gfSwKLS8qIG5vcCBpcyBhY3R1YWxseSAneGNoZ2wgJWVheCwgJWVheCcgKi8KLXsibm9wIiwJICAgMCwJMHg5MCwgWCwgTm9TdWYsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBwcm90ZWN0aW9uIGNvbnRyb2wgKi8KLXsiYXJwbCIsICAgMiwJMHg2MywgWCwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2LCBSZWcxNnxTaG9ydE1lbSwgMH0gfSwKLXsibGFyIiwJICAgMiwgMHgwZjAyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsibGdkdCIsICAgMSwgMHgwZjAxLCAyLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRNZW0sIDAsIDB9IH0sCi17ImxpZHQiLCAgIDEsIDB4MGYwMSwgMywgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJsbGR0IiwgICAxLCAweDBmMDAsIDIsIHdfU3VmfE1vZHJtfElnbm9yZVNpemUseyBSZWcxNnxTaG9ydE1lbSwgMCwgMH0gfSwKLXsibG1zdyIsICAgMSwgMHgwZjAxLCA2LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi17ImxzbCIsCSAgIDIsIDB4MGYwMywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17Imx0ciIsCSAgIDEsIDB4MGYwMCwgMywgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAotCi17InNnZHQiLCAgIDEsIDB4MGYwMSwgMCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkTWVtLCAwLCAwfSB9LAoteyJzaWR0IiwgICAxLCAweDBmMDEsIDEsIHdsX1N1ZnxNb2RybSwJCXsgV29yZE1lbSwgMCwgMH0gfSwKLXsic2xkdCIsICAgMSwgMHgwZjAwLCAwLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMH0gfSwKLXsic21zdyIsICAgMSwgMHgwZjAxLCA0LCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgMCwgMH0gfSwKLXsic3RyIiwJICAgMSwgMHgwZjAwLCAxLCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi0KLXsidmVyciIsICAgMSwgMHgwZjAwLCA0LCB3X1N1ZnxNb2RybXxJZ25vcmVTaXplLHsgUmVnMTZ8U2hvcnRNZW0sIDAsIDB9IH0sCi17InZlcnciLCAgIDEsIDB4MGYwMCwgNSwgd19TdWZ8TW9kcm18SWdub3JlU2l6ZSx7IFJlZzE2fFNob3J0TWVtLCAwLCAwfSB9LAotCi0vKiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotLyogbG9hZCAqLwoteyJmbGQiLAkgICAxLCAweGQ5YzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIHJlZ2lzdGVyICovCi17ImZsZCIsCSAgIDEsCTB4ZDksIDAsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZmxkIiwJICAgMSwgMHhkOWMwLCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZmxkIiwgICAgMSwJMHhkYiwgNSwgeF9GUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBlZmxvYXQgKi8KLXsiZmlsZCIsICAgMSwJMHhkZiwgMCwgc2xfU3VmfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHdvcmQoMTYpL2R3b3JkKDMyKSAqLwotLyogSW50ZWwgU3ludGF4ICovCi17ImZpbGQiLCAgMSwJMHhkZiwgNSwgZF9TdWZ8SWdub3JlU2l6ZXxNb2RybSx7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaWxkcSIsICAxLAkweGRmLCA1LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgPC0tIG1lbSBxd29yZCAoNjQpICovCi17ImZpbGRsbCIsIDEsCTB4ZGYsIDUsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmxkdCIsICAgMSwJMHhkYiwgNSwgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIDwtLSBtZW0gZWZsb2F0ICovCi17ImZibGQiLCAgIDEsCTB4ZGYsIDQsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCA8LS0gbWVtIGJjZCAqLwotCi0vKiBzdG9yZSAobm8gcG9wKSAqLwoteyJmc3QiLAkgICAxLCAweGRkZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIHJlZ2lzdGVyICovCi17ImZzdCIsCSAgIDEsCTB4ZDksIDIsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZnN0IiwJICAgMSwgMHhkZGQwLCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpc3QiLCAgIDEsCTB4ZGYsIDIsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSB3b3JkKDE2KS9kd29yZCgzMikgKi8KLQotLyogc3RvcmUgKHdpdGggcG9wKSAqLwoteyJmc3RwIiwgICAxLCAweGRkZDgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sIC8qIHJlZ2lzdGVyICovCi17ImZzdHAiLCAgIDEsCTB4ZDksIDMsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZnN0cCIsICAgMSwgMHhkZGQ4LCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZnN0cCIsICAgMSwJMHhkYiwgNywgeF9GUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBlZmxvYXQgKi8KLXsiZmlzdHAiLCAgMSwJMHhkZiwgMywgc2xfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gd29yZCgxNikvZHdvcmQoMzIpICovCi0vKiBJbnRlbCBTeW50YXggKi8KLXsiZmlzdHAiLCAxLAkweGRmLCA3LCBkX0ZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIHF3b3JkICg2NCkgKi8KLXsiZmlzdHBxIiwgMSwJMHhkZiwgNywgRlB8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LCAvKiAlc3QwIC0tPiBtZW0gcXdvcmQgKDY0KSAqLwoteyJmaXN0cGxsIiwxLAkweGRmLCA3LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBxd29yZCAoNjQpICovCi17ImZzdHB0IiwgIDEsCTB4ZGIsIDcsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwgLyogJXN0MCAtLT4gbWVtIGVmbG9hdCAqLwoteyJmYnN0cCIsICAxLAkweGRmLCA2LCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sIC8qICVzdDAgLS0+IG1lbSBiY2QgKi8KLQotLyogZXhjaGFuZ2UgJXN0PG4+IHdpdGggJXN0MCAqLwoteyJmeGNoIiwgICAxLCAweGQ5YzgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ4Y2giLCAgIDAsIDB4ZDljOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmeGNoICVzdCgxKSAqLwotCi0vKiBjb21wYXJpc29uICh3aXRob3V0IHBvcCkgKi8KLXsiZmNvbSIsICAgMSwgMHhkOGQwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29tIiwgICAwLCAweGQ4ZDEsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmNvbSAlc3QoMSkgKi8KLXsiZmNvbSIsICAgMSwJMHhkOCwgMiwgc2xkX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgTG9uZ01lbXxMTG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gZmxvYXQvZG91YmxlICovCi17ImZjb20iLCAgIDEsIDB4ZDhkMCwgWCwgbF9GUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmaWNvbSIsICAxLAkweGRlLCAyLCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sIC8qIGNvbXBhcmUgJXN0MCwgbWVtIHdvcmQvZHdvcmQgKi8KLQotLyogY29tcGFyaXNvbiAod2l0aCBwb3ApICovCi17ImZjb21wIiwgIDEsIDB4ZDhkOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmNvbXAiLCAgMCwgMHhkOGQ5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZjb21wICVzdCgxKSAqLwoteyJmY29tcCIsICAxLAkweGQ4LCAzLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LCAvKiBjb21wYXJlICVzdDAsIG1lbSBmbG9hdC9kb3VibGUgKi8KLXsiZmNvbXAiLCAgMSwgMHhkOGQ4LCBYLCBsX0ZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZpY29tcCIsIDEsCTB4ZGUsIDMsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwgLyogY29tcGFyZSAlc3QwLCBtZW0gd29yZC9kd29yZCAqLwoteyJmY29tcHAiLCAwLCAweGRlZDksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBjb21wYXJlICVzdDAsICVzdDEgJiBwb3AgMiAqLwotCi0vKiB1bm9yZGVyZWQgY29tcGFyaXNvbiAod2l0aCBwb3ApICovCi17ImZ1Y29tIiwgIDEsIDB4ZGRlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb20iLCAgMCwgMHhkZGUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZ1Y29tICVzdCgxKSAqLwoteyJmdWNvbXAiLCAxLCAweGRkZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZ1Y29tcCIsIDAsIDB4ZGRlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmdWNvbXAgJXN0KDEpICovCi17ImZ1Y29tcHAiLDAsIDB4ZGFlOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIHVjb21wYXJlICVzdDAsICVzdDEgJiBwb3AgdHdpY2UgKi8KLQoteyJmdHN0IiwgICAwLCAweGQ5ZTQsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiB0ZXN0ICVzdDAgKi8KLXsiZnhhbSIsICAgMCwgMHhkOWU1LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogZXhhbWluZSAlc3QwICovCi0KLS8qIGxvYWQgY29uc3RhbnRzIGludG8gJXN0MCAqLwoteyJmbGQxIiwgICAwLCAweGQ5ZTgsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSAxLjAgKi8KLXsiZmxkbDJ0IiwgMCwgMHhkOWU5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gbG9nMigxMCkgKi8KLXsiZmxkbDJlIiwgMCwgMHhkOWVhLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogJXN0MCA8LS0gbG9nMihlKSAqLwoteyJmbGRwaSIsICAwLCAweGQ5ZWIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBwaSAqLwoteyJmbGRsZzIiLCAwLCAweGQ5ZWMsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsb2cxMCgyKSAqLwoteyJmbGRsbjIiLCAwLCAweGQ5ZWQsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSBsbigyKSAqLwoteyJmbGR6IiwgICAwLCAweGQ5ZWUsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwJICAgICAvKiAlc3QwIDwtLSAwLjAgKi8KLQotLyogYXJpdGhtZXRpYyAqLwotCi0vKiBhZGQgKi8KLXsiZmFkZCIsICAgMiwgMHhkOGMwLCBYLCBGUHxTaG9ydEZvcm18RmxvYXRELAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmFkZCIsICAgMSwgMHhkOGMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LCAvKiBhbGlhcyBmb3IgZmFkZCAlc3QoaSksICVzdCAqLwotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmYWRkIiwgICAwLCAweGRlYzEsIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmFkZHAgKi8KLSNlbmRpZgoteyJmYWRkIiwgICAxLAkweGQ4LCAwLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWFkZCIsICAxLAkweGRlLCAwLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi17ImZhZGRwIiwgIDIsIDB4ZGVjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZhZGRwIiwgIDEsIDB4ZGVjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmFkZHAiLCAgMCwgMHhkZWMxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCSAgICAgLyogYWxpYXMgZm9yIGZhZGRwICVzdCwgJXN0KDEpICovCi17ImZhZGRwIiwgIDIsIDB4ZGVjMCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0KLS8qIHN1YnRyYWN0ICovCi17ImZzdWIiLCAgIDIsIDB4ZDhlMCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmc3ViIiwgICAxLCAweGQ4ZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZzdWIiLCAgIDAsIDB4ZGVlMSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmc3VicCAqLwotI2VuZGlmCi17ImZzdWIiLCAgIDEsCTB4ZDgsIDQsIHNsZF9GUHxGbG9hdE1GfE1vZHJtLAl7IExvbmdNZW18TExvbmdNZW0sIDAsIDB9IH0sCi17ImZpc3ViIiwgIDEsCTB4ZGUsIDQsIHNsX0ZQfEZsb2F0TUZ8TW9kcm0sCXsgU2hvcnRNZW18TG9uZ01lbSwgMCwgMH0gfSwKLQotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmc3VicCIsICAyLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmc3VicCIsICAxLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZzdWJwIiwgIDAsIDB4ZGVlMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc3VicCIsICAyLCAweGRlZTAsIFgsIEZQfFNob3J0Rm9ybXxVZ2gsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAotI2Vsc2UKLXsiZnN1YnAiLCAgMiwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnAiLCAgMSwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicCIsICAwLCAweGRlZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNlbmRpZgotCi0vKiBzdWJ0cmFjdCByZXZlcnNlICovCi17ImZzdWJyIiwgIDIsIDB4ZDhlOCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmc3ViciIsICAxLCAweGQ4ZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZzdWJyIiwgIDAsIDB4ZGVlOSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmc3VicnAgKi8KLSNlbmRpZgoteyJmc3ViciIsICAxLAkweGQ4LCA1LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaXN1YnIiLCAxLAkweGRlLCA1LCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZnN1YnJwIiwgMiwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZnN1YnJwIiwgMSwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmc3VicnAiLCAwLCAweGRlZTksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnN1YnJwIiwgMiwgMHhkZWU4LCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbHNlCi17ImZzdWJycCIsIDIsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZzdWJycCIsIDEsIDB4ZGVlMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnN1YnJwIiwgMCwgMHhkZWUxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQotLyogbXVsdGlwbHkgKi8KLXsiZm11bCIsICAgMiwgMHhkOGM4LCBYLCBGUHxTaG9ydEZvcm18RmxvYXRELAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZm11bCIsICAgMSwgMHhkOGM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmbXVsIiwgICAwLCAweGRlYzksIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZm11bHAgKi8KLSNlbmRpZgoteyJmbXVsIiwgICAxLAkweGQ4LCAxLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaW11bCIsICAxLAkweGRlLCAxLCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi17ImZtdWxwIiwgIDIsIDB4ZGVjOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZtdWxwIiwgIDEsIDB4ZGVjOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZm11bHAiLCAgMCwgMHhkZWM5LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZtdWxwIiwgIDIsIDB4ZGVjOCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0KLS8qIGRpdmlkZSAqLwoteyJmZGl2IiwgICAyLCAweGQ4ZjAsIFgsIEZQfFNob3J0Rm9ybXxGbG9hdERSLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmRpdiIsICAgMSwgMHhkOGYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAotI2lmIFVOSVhXQVJFX0NPTVBBVAoteyJmZGl2IiwgICAwLCAweGRlZjEsIFgsIEZQfFVnaCwJCXsgMCwgMCwgMH0gfSwJICAgICAvKiBhbGlhcyBmb3IgZmRpdnAgKi8KLSNlbmRpZgoteyJmZGl2IiwgICAxLAkweGQ4LCA2LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWRpdiIsICAxLAkweGRlLCA2LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBTaG9ydE1lbXxMb25nTWVtLCAwLCAwfSB9LAotCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZkaXZwIiwgIDIsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZwIiwgIDEsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnAiLCAgMCwgMHhkZWYxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZkaXZwIiwgIDIsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtfFVnaCwJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi0jZWxzZQoteyJmZGl2cCIsICAyLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRBY2MsIEZsb2F0UmVnLCAwfSB9LAoteyJmZGl2cCIsICAxLCAweGRlZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi17ImZkaXZwIiwgIDAsIDB4ZGVmOSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotI2VuZGlmCi0KLS8qIGRpdmlkZSByZXZlcnNlICovCi17ImZkaXZyIiwgIDIsIDB4ZDhmOCwgWCwgRlB8U2hvcnRGb3JtfEZsb2F0RFIsCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmZGl2ciIsICAxLCAweGQ4ZjgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0jaWYgVU5JWFdBUkVfQ09NUEFUCi17ImZkaXZyIiwgIDAsIDB4ZGVmOSwgWCwgRlB8VWdoLAkJeyAwLCAwLCAwfSB9LAkgICAgIC8qIGFsaWFzIGZvciBmZGl2cnAgKi8KLSNlbmRpZgoteyJmZGl2ciIsICAxLAkweGQ4LCA3LCBzbGRfRlB8RmxvYXRNRnxNb2RybSwJeyBMb25nTWVtfExMb25nTWVtLCAwLCAwfSB9LAoteyJmaWRpdnIiLCAxLAkweGRlLCA3LCBzbF9GUHxGbG9hdE1GfE1vZHJtLAl7IFNob3J0TWVtfExvbmdNZW0sIDAsIDB9IH0sCi0KLSNpZiBVTklYV0FSRV9DT01QQVQKLXsiZmRpdnJwIiwgMiwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0QWNjLCBGbG9hdFJlZywgMH0gfSwKLXsiZmRpdnJwIiwgMSwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmZGl2cnAiLCAwLCAweGRlZjksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmRpdnJwIiwgMiwgMHhkZWY4LCBYLCBGUHxTaG9ydEZvcm18VWdoLAl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLSNlbHNlCi17ImZkaXZycCIsIDIsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdEFjYywgRmxvYXRSZWcsIDB9IH0sCi17ImZkaXZycCIsIDEsIDB4ZGVmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZmRpdnJwIiwgMCwgMHhkZWYxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi0jZW5kaWYKLQoteyJmMnhtMSIsICAwLCAweGQ5ZjAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnlsMngiLCAgMCwgMHhkOWYxLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwdGFuIiwgIDAsIDB4ZDlmMiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcGF0YW4iLCAwLCAweGQ5ZjMsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnh0cmFjdCIsMCwgMHhkOWY0LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwcmVtMSIsIDAsIDB4ZDlmNSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmZGVjc3RwIiwwLCAweGQ5ZjYsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmluY3N0cCIsMCwgMHhkOWY3LCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZwcmVtIiwgIDAsIDB4ZDlmOCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmeWwyeHAxIiwwLCAweGQ5ZjksIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnNxcnQiLCAgMCwgMHhkOWZhLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzaW5jb3MiLDAsIDB4ZDlmYiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmcm5kaW50IiwwLCAweGQ5ZmMsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZnNjYWxlIiwgMCwgMHhkOWZkLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZzaW4iLCAgIDAsIDB4ZDlmZSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmY29zIiwgICAwLCAweGQ5ZmYsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNocyIsICAgMCwgMHhkOWUwLCBYLCBGUCwJCQl7IDAsIDAsIDB9IH0sCi17ImZhYnMiLCAgIDAsIDB4ZDllMSwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi0vKiBwcm9jZXNzb3IgY29udHJvbCAqLwoteyJmbmluaXQiLCAwLCAweGRiZTMsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmluaXQiLCAgMCwgMHhkYmUzLCBYLCBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLXsiZmxkY3ciLCAgMSwJMHhkOSwgNSwgRlB8TW9kcm0sCQl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmbnN0Y3ciLCAxLAkweGQ5LCA3LCBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZzdGN3IiwgIDEsCTB4ZDksIDcsIEZQfEZXYWl0fE1vZHJtLAl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmbnN0c3ciLCAxLCAweGRmZTAsIFgsIEZQLAkJCXsgQWNjLCAwLCAwfSB9LAoteyJmbnN0c3ciLCAxLAkweGRkLCA3LCBGUHxNb2RybSwJCXsgU2hvcnRNZW0sIDAsIDB9IH0sCi17ImZuc3RzdyIsIDAsIDB4ZGZlMCwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAoteyJmc3RzdyIsICAxLCAweGRmZTAsIFgsIEZQfEZXYWl0LAkJeyBBY2MsIDAsIDB9IH0sCi17ImZzdHN3IiwgIDEsCTB4ZGQsIDcsIEZQfEZXYWl0fE1vZHJtLAl7IFNob3J0TWVtLCAwLCAwfSB9LAoteyJmc3RzdyIsICAwLCAweGRmZTAsIFgsIEZQfEZXYWl0LAkJeyAwLCAwLCAwfSB9LAoteyJmbmNsZXgiLCAwLCAweGRiZTIsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLXsiZmNsZXgiLCAgMCwgMHhkYmUyLCBYLCBGUHxGV2FpdCwJCXsgMCwgMCwgMH0gfSwKLS8qIFNob3J0IGZvcm1zIG9mIGZsZGVudiwgZnN0ZW52IHVzZSBkYXRhIHNpemUgcHJlZml4LgotICAgRklYTUU6IEFyZSB0aGVzZSB0aGUgcmlnaHQgc3VmZml4ZXM/ICAqLwoteyJmbnN0ZW52IiwxLAkweGQ5LCA2LCBzbF9TdWZ8TW9kcm0sCQl7IExMb25nTWVtLCAwLCAwfSB9LAoteyJmc3RlbnYiLCAxLAkweGQ5LCA2LCBzbF9TdWZ8RldhaXR8TW9kcm0sCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZsZGVudiIsIDEsCTB4ZDksIDQsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZuc2F2ZSIsIDEsCTB4ZGQsIDYsIHNsX1N1ZnxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZzYXZlIiwgIDEsCTB4ZGQsIDYsIHNsX1N1ZnxGV2FpdHxNb2RybSwJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsiZnJzdG9yIiwgMSwJMHhkZCwgNCwgc2xfU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLQoteyJmZnJlZSIsICAxLCAweGRkYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0vKiBQNjpmcmVlIHN0KGkpLCBwb3Agc3QgKi8KLXsiZmZyZWVwIiwgMSwgMHhkZmMwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmbm9wIiwgICAwLCAweGQ5ZDAsIFgsIEZQLAkJCXsgMCwgMCwgMH0gfSwKLSNkZWZpbmUgRldBSVRfT1BDT0RFIDB4OWIKLXsiZndhaXQiLCAgMCwJMHg5YiwgWCwgRlAsCQkJeyAwLCAwLCAwfSB9LAotCi0vKgotICBvcGNvZGUgcHJlZml4ZXM7IHdlIGFsbG93IHRoZW0gYXMgc2VwZXJhdGUgaW5zbnMgdG9vCi0qLwotI2RlZmluZSBBRERSX1BSRUZJWF9PUENPREUgMHg2NwoteyJhZGRyMTYiLCAwLAkweDY3LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJhZGRyMzIiLCAwLAkweDY3LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJhd29yZCIsICAwLAkweDY3LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJhZHdvcmQiLCAwLAkweDY3LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBEQVRBX1BSRUZJWF9PUENPREUgMHg2NgoteyJkYXRhMTYiLCAwLAkweDY2LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJkYXRhMzIiLCAwLAkweDY2LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJ3b3JkIiwgICAwLAkweDY2LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMTZ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAoteyJkd29yZCIsICAwLAkweDY2LCBYLCBOb1N1ZnxJc1ByZWZpeHxTaXplMzJ8SWdub3JlU2l6ZSwJeyAwLCAwLCAwfSB9LAotI2RlZmluZSBMT0NLX1BSRUZJWF9PUENPREUgMHhmMAoteyJsb2NrIiwgICAwLAkweGYwLCBYLCBOb1N1ZnxJc1ByZWZpeCwJeyAwLCAwLCAwfSB9LAoteyJ3YWl0IiwgICAwLCAgIDB4OWIsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIENTX1BSRUZJWF9PUENPREUgMHgyZQoteyJjcyIsCSAgIDAsCTB4MmUsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIERTX1BSRUZJWF9PUENPREUgMHgzZQoteyJkcyIsCSAgIDAsCTB4M2UsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEVTX1BSRUZJWF9PUENPREUgMHgyNgoteyJlcyIsCSAgIDAsCTB4MjYsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEZTX1BSRUZJWF9PUENPREUgMHg2NAoteyJmcyIsCSAgIDAsCTB4NjQsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIEdTX1BSRUZJWF9PUENPREUgMHg2NQoteyJncyIsCSAgIDAsCTB4NjUsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIFNTX1BSRUZJWF9PUENPREUgMHgzNgoteyJzcyIsCSAgIDAsCTB4MzYsIFgsIE5vU3VmfElzUHJlZml4LAl7IDAsIDAsIDB9IH0sCi0jZGVmaW5lIFJFUE5FX1BSRUZJWF9PUENPREUgMHhmMgotI2RlZmluZSBSRVBFX1BSRUZJWF9PUENPREUgIDB4ZjMKLXsicmVwIiwJICAgMCwJMHhmMywgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVwZSIsICAgMCwJMHhmMywgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVweiIsICAgMCwJMHhmMywgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVwbmUiLCAgMCwJMHhmMiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLXsicmVwbnoiLCAgMCwJMHhmMiwgWCwgTm9TdWZ8SXNQcmVmaXgsCXsgMCwgMCwgMH0gfSwKLQotLyogNDg2IGV4dGVuc2lvbnMgKi8KLQoteyJic3dhcCIsICAgMSwgMHgwZmM4LCBYLCBsX1N1ZnxTaG9ydEZvcm0sCXsgUmVnMzIsMCwwIH0gfSwKLXsieGFkZCIsICAgIDIsIDB4MGZjMCwgWCwgYndsX1N1ZnxXfE1vZHJtLAl7IFJlZywgUmVnfEFueU1lbSwgMCB9IH0sCi17ImNtcHhjaGciLCAyLCAweDBmYjAsIFgsIGJ3bF9TdWZ8V3xNb2RybSwJeyBSZWcsIFJlZ3xBbnlNZW0sIDAgfSB9LAoteyJpbnZkIiwgICAgMCwgMHgwZjA4LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsid2JpbnZkIiwgIDAsIDB4MGYwOSwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImludmxwZyIsICAxLCAweDBmMDEsIDcsIE5vU3VmfE1vZHJtLAkJeyBBbnlNZW0sIDAsIDB9IH0sCi0KLS8qIDU4NiBhbmQgbGF0ZSA0ODYgZXh0ZW5zaW9ucyAqLwoteyJjcHVpZCIsICAgMCwgMHgwZmEyLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLQotLyogUGVudGl1bSBleHRlbnNpb25zICovCi17IndybXNyIiwgICAwLCAweDBmMzAsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJyZHRzYyIsICAgMCwgMHgwZjMxLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLXsicmRtc3IiLCAgIDAsIDB4MGYzMiwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17ImNtcHhjaGc4YiIsMSwweDBmYzcsIDEsIE5vU3VmfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLXsic3lzZW50ZXIiLDAsIDB4MGYzNCwgWCwgTm9TdWYsCQl7IDAsIDAsIDB9IH0sCi17InN5c2V4aXQiLCAwLCAweDBmMzUsIFgsIE5vU3VmLAkJeyAwLCAwLCAwfSB9LAoteyJmeHNhdmUiLCAgMSwgMHgwZmFlLCAwLCBGUHxNb2RybSwJCXsgTExvbmdNZW0sIDAsIDB9IH0sCi17ImZ4cnN0b3IiLCAxLCAweDBmYWUsIDEsIEZQfE1vZHJtLAkJeyBMTG9uZ01lbSwgMCwgMH0gfSwKLQotLyogUGVudGl1bSBQcm8gZXh0ZW5zaW9ucyAqLwoteyJyZHBtYyIsICAgMCwgMHgwZjMzLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwKLQoteyJ1ZDIiLAkgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogb2ZmaWNpYWwgdW5kZWZpbmVkIGluc3RyLiAqLwoteyJ1ZDJhIiwgICAgMCwgMHgwZjBiLCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogYWxpYXMgZm9yIHVkMiAqLwoteyJ1ZDJiIiwgICAgMCwgMHgwZmI5LCBYLCBOb1N1ZiwJCXsgMCwgMCwgMH0gfSwgLyogMm5kLiBvZmZpY2lhbCB1bmRlZmluZWQgaW5zdHIuICovCi0KLXsiY21vdm8iLCAgIDIsIDB4MGY0MCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZubyIsICAyLCAweDBmNDEsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YiIsICAgMiwgMHgwZjQyLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmMiLCAgIDIsIDB4MGY0MiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYWUiLCAyLCAweDBmNDIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YWUiLCAgMiwgMHgwZjQzLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5jIiwgIDIsIDB4MGY0MywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYiIsICAyLCAweDBmNDMsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92ZSIsICAgMiwgMHgwZjQ0LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnoiLCAgIDIsIDB4MGY0NCwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZSIsICAyLCAweDBmNDUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnoiLCAgMiwgMHgwZjQ1LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmJlIiwgIDIsIDB4MGY0NiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuYSIsICAyLCAweDBmNDYsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92YSIsICAgMiwgMHgwZjQ3LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5iZSIsIDIsIDB4MGY0NywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZzIiwgICAyLCAweDBmNDgsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bnMiLCAgMiwgMHgwZjQ5LCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdnAiLCAgIDIsIDB4MGY0YSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZucCIsICAyLCAweDBmNGIsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bCIsICAgMiwgMHgwZjRjLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5nZSIsIDIsIDB4MGY0YywgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZnZSIsICAyLCAweDBmNGQsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92bmwiLCAgMiwgMHgwZjRkLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdmxlIiwgIDIsIDB4MGY0ZSwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi17ImNtb3ZuZyIsICAyLCAweDBmNGUsIFgsIHdsX1N1ZnxNb2RybSwJCXsgV29yZFJlZ3xXb3JkTWVtLCBXb3JkUmVnLCAwfSB9LAoteyJjbW92ZyIsICAgMiwgMHgwZjRmLCBYLCB3bF9TdWZ8TW9kcm0sCQl7IFdvcmRSZWd8V29yZE1lbSwgV29yZFJlZywgMH0gfSwKLXsiY21vdm5sZSIsIDIsIDB4MGY0ZiwgWCwgd2xfU3VmfE1vZHJtLAkJeyBXb3JkUmVnfFdvcmRNZW0sIFdvcmRSZWcsIDB9IH0sCi0KLXsiZmNtb3ZiIiwgIDIsIDB4ZGFjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmFlIiwyLCAweGRhYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdmUiLCAgMiwgMHhkYWM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZiZSIsIDIsIDB4ZGFkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmEiLCAyLCAweGRhZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdnUiLCAgMiwgMHhkYWQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhZSIsIDIsIDB4ZGJjMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmIiLCAyLCAweGRiYzAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm5lIiwgMiwgMHhkYmM4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNtb3ZhIiwgIDIsIDB4ZGJkMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjbW92bmJlIiwyLCAweGRiZDAsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmY21vdm51IiwgMiwgMHhkYmQ4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLQoteyJmY29taSIsICAgMiwgMHhkYmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNvbWkiLCAgIDAsIDB4ZGJmMSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmY29taSIsICAgMSwgMHhkYmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMiwgMHhkYmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZnVjb21pIiwgIDAsIDB4ZGJlOSwgWCwgRlB8U2hvcnRGb3JtLAkJeyAwLCAwLCAwfSB9LAoteyJmdWNvbWkiLCAgMSwgMHhkYmU4LCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCAwLCAwfSB9LAoteyJmY29taXAiLCAgMiwgMHhkZmYwLCBYLCBGUHxTaG9ydEZvcm0sCQl7IEZsb2F0UmVnLCBGbG9hdEFjYywgMH0gfSwKLXsiZmNvbXBpIiwgIDIsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZjb21waSIsICAwLCAweGRmZjEsIFgsIEZQfFNob3J0Rm9ybSwJCXsgMCwgMCwgMH0gfSwKLXsiZmNvbXBpIiwgIDEsIDB4ZGZmMCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgMCwgMH0gfSwKLXsiZnVjb21pcCIsIDIsIDB4ZGZlOCwgWCwgRlB8U2hvcnRGb3JtLAkJeyBGbG9hdFJlZywgRmxvYXRBY2MsIDB9IH0sCi17ImZ1Y29tcGkiLCAyLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIEZsb2F0QWNjLCAwfSB9LAoteyJmdWNvbXBpIiwgMCwgMHhkZmU5LCBYLCBGUHxTaG9ydEZvcm0sCQl7IDAsIDAsIDB9IH0sCi17ImZ1Y29tcGkiLCAxLCAweGRmZTgsIFgsIEZQfFNob3J0Rm9ybSwJCXsgRmxvYXRSZWcsIDAsIDB9IH0sCi0KLS8qIE1NWCBpbnN0cnVjdGlvbnMuICAqLwotCi17ImVtbXMiLCAgICAgMCwgMHgwZjc3LCBYLCBGUCwJCQl7IDAsIDAsIDAgfSB9LAoteyJtb3ZkIiwgICAgIDIsIDB4MGY2ZSwgWCwgRlB8TW9kcm0sCQl7IFJlZzMyfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17Im1vdmQiLCAgICAgMiwgMHgwZjdlLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YLCBSZWczMnxMb25nTWVtLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmNmYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsibW92cSIsICAgICAyLCAweDBmN2YsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVgsIFJlZ01NWHxMb25nTWVtLCAwIH0gfSwKLXsicGFja3NzZHciLCAyLCAweDBmNmIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Nzd2IiLCAyLCAweDBmNjMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFja3Vzd2IiLCAyLCAweDBmNjcsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGIiLCAgICAyLCAweDBmZmMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHciLCAgICAyLCAweDBmZmQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZGQiLCAgICAyLCAweDBmZmUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHNiIiwgICAyLCAweDBmZWMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHN3IiwgICAyLCAweDBmZWQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzYiIsICAyLCAweDBmZGMsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFkZHVzdyIsICAyLCAweDBmZGQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZCIsICAgICAyLCAweDBmZGIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGFuZG4iLCAgICAyLCAweDBmZGYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxYiIsICAyLCAweDBmNzQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxdyIsICAyLCAweDBmNzUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGVxZCIsICAyLCAweDBmNzYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0YiIsICAyLCAweDBmNjQsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0dyIsICAyLCAweDBmNjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGNtcGd0ZCIsICAyLCAweDBmNjYsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1hZGR3ZCIsICAyLCAweDBmZjUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGh3IiwgICAyLCAweDBmZTUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG11bGx3IiwgICAyLCAweDBmZDUsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG9yIiwJICAgICAyLCAweDBmZWIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmZjEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNsbHciLCAgICAyLCAweDBmNzEsIDYsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGZmMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2xsZCIsICAgIDIsIDB4MGY3MiwgNiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZmYzLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzbGxxIiwgICAgMiwgMHgwZjczLCA2LCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmZTEsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNyYXciLCAgICAyLCAweDBmNzEsIDQsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGZlMiwgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JhZCIsICAgIDIsIDB4MGY3MiwgNCwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZmQxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzcmx3IiwgICAgMiwgMHgwZjcxLCAyLCBGUHxNb2RybSwJCXsgSW1tOCwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmZDIsIFgsIEZQfE1vZHJtLAkJeyBSZWdNTVh8TG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicHNybGQiLCAgICAyLCAweDBmNzIsIDIsIEZQfE1vZHJtLAkJeyBJbW04LCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGZkMywgWCwgRlB8TW9kcm0sCQl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc3JscSIsICAgIDIsIDB4MGY3MywgMiwgRlB8TW9kcm0sCQl7IEltbTgsIFJlZ01NWCwgMCB9IH0sCi17InBzdWJiIiwgICAgMiwgMHgwZmY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ3IiwgICAgMiwgMHgwZmY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJkIiwgICAgMiwgMHgwZmZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzYiIsICAgMiwgMHgwZmU4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJzdyIsICAgMiwgMHgwZmU5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c2IiLCAgMiwgMHgwZmQ4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzdWJ1c3ciLCAgMiwgMHgwZmQ5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hidyIsMiwgMHgwZjY4LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2h3ZCIsMiwgMHgwZjY5LCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2hkcSIsMiwgMHgwZjZhLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xidyIsMiwgMHgwZjYwLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2x3ZCIsMiwgMHgwZjYxLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB1bnBja2xkcSIsMiwgMHgwZjYyLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InB4b3IiLCAgICAgMiwgMHgwZmVmLCBYLCBGUHxNb2RybSwJCXsgUmVnTU1YfExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi0KLQotLyogUElJSSBLYXRtYWkgTmV3IEluc3RydWN0aW9ucyAvIFNJTUQgaW5zdHJ1Y3Rpb25zICovCi0KLXsiYWRkcHMiLCAgICAgMiwgMHgwZjU4LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFkZHNzIiwgICAgIDIsIDB4ZjMwZjU4LCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImFuZG5wcyIsICAgIDIsIDB4MGY1NSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJhbmRwcyIsICAgICAyLCAweDBmNTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBwcyIsICAgICAzLCAweDBmYzIsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NIH0gfSwKLXsiY21wc3MiLCAgICAgMywgMHhmMzBmYzIsICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdYTU18V29yZE1lbSwgUmVnWE1NIH0gfSwKLXsiY21wZXFwcyIsICAgMiwgMHgwZmMyLCAgICAwLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBlcXNzIiwgICAyLCAweGYzMGZjMiwgIDAsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbHRwcyIsICAgMiwgMHgwZmMyLCAgICAxLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsdHNzIiwgICAyLCAweGYzMGZjMiwgIDEsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbGVwcyIsICAgMiwgMHgwZmMyLCAgICAyLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBsZXNzIiwgICAyLCAweGYzMGZjMiwgIDIsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wdW5vcmRwcyIsMiwgMHgwZmMyLCAgICAzLCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXB1bm9yZHNzIiwyLCAweGYzMGZjMiwgIDMsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmVxcHMiLCAgMiwgMHgwZmMyLCAgICA0LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBuZXFzcyIsICAyLCAweGYzMGZjMiwgIDQsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmx0cHMiLCAgMiwgMHgwZmMyLCAgICA1LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubHRzcyIsICAyLCAweGYzMGZjMiwgIDUsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wbmxlcHMiLCAgMiwgMHgwZmMyLCAgICA2LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBubGVzcyIsICAyLCAweGYzMGZjMiwgIDYsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY21wb3JkcHMiLCAgMiwgMHgwZmMyLCAgICA3LCBGUHxNb2RybXxJbW1FeHQsCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJjbXBvcmRzcyIsICAyLCAweGYzMGZjMiwgIDcsIEZQfE1vZHJtfEltbUV4dCwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY29taXNzIiwgICAgMiwgMHgwZjJmLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0cGkycHMiLCAgMiwgMHgwZjJhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImN2dHNpMnNzIiwgIDIsIDB4ZjMwZjJhLCAgWCwgRlB8TW9kcm0sCXsgUmVnMzJ8V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsiY3Z0cHMycGkiLCAgMiwgMHgwZjJkLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHNzMnNpIiwgIDIsIDB4ZjMwZjJkLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiY3Z0dHBzMnBpIiwgMiwgMHgwZjJjLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17ImN2dHRzczJzaSIsIDIsIDB4ZjMwZjJjLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZzMyLCAwIH0gfSwKLXsiZGl2cHMiLCAgICAgMiwgMHgwZjVlLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImRpdnNzIiwgICAgIDIsIDB4ZjMwZjVlLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17ImxkbXhjc3IiLCAgIDEsIDB4MGZhZSwgICAgMiwgRlB8TW9kcm0sIAl7IFdvcmRNZW0sIDAsIDAgfSB9LAoteyJzdG14Y3NyIiwgICAxLCAweDBmYWUsICAgIDMsIEZQfE1vZHJtLCAJeyBXb3JkTWVtLCAwLCAwIH0gfSwKLXsic2ZlbmNlIiwgICAgMCwgMHgwZmFlZjgsICBYLCBGUCwJCXsgMCwgMCwgMCB9IH0sCi17Im1heHBzIiwgICAgIDIsIDB4MGY1ZiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtYXhzcyIsICAgICAyLCAweGYzMGY1ZiwgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxXb3JkTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtaW5wcyIsICAgICAyLCAweDBmNWQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibWluc3MiLCAgICAgMiwgMHhmMzBmNWQsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92YXBzIiwgICAgMiwgMHgwZjI4LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmFwcyIsICAgIDIsIDB4MGYyOSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBSZWdYTU18TExvbmdNZW0sIDAgfSB9LAoteyJtb3ZobHBzIiwgICAyLCAweDBmMTIsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxJbnZNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmhwcyIsICAgIDIsIDB4MGYxNiwgICAgWCwgRlB8TW9kcm0sCXsgTExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im1vdmhwcyIsICAgIDIsIDB4MGYxNywgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NLCBMTG9uZ01lbSwgMCB9IH0sCi17Im1vdmxocHMiLCAgIDIsIDB4MGYxNiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfEludk1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92bHBzIiwgICAgMiwgMHgwZjEyLCAgICBYLCBGUHxNb2RybSwJeyBMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92bHBzIiwgICAgMiwgMHgwZjEzLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bXNrcHMiLCAgMiwgMHgwZjUwLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18SW52TWVtLCBSZWczMiwgMCB9IH0sCi17Im1vdnVwcyIsICAgIDIsIDB4MGYxMCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJtb3Z1cHMiLCAgICAyLCAweDBmMTEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTSwgUmVnWE1NfExMb25nTWVtLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTAsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsibW92c3MiLCAgICAgMiwgMHhmMzBmMTEsICBYLCBGUHxNb2RybSwJeyBSZWdYTU0sIFJlZ1hNTXxXb3JkTWVtLCAwIH0gfSwKLXsibXVscHMiLCAgICAgMiwgMHgwZjU5LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im11bHNzIiwgICAgIDIsIDB4ZjMwZjU5LCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17Im9ycHMiLCAgICAgIDIsIDB4MGY1NiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJyY3BwcyIsICAgICAyLCAweDBmNTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsicmNwc3MiLCAgICAgMiwgMHhmMzBmNTMsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsicnNxcnRwcyIsICAgMiwgMHgwZjUyLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InJzcXJ0c3MiLCAgIDIsIDB4ZjMwZjUyLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InNodWZwcyIsICAgIDMsIDB4MGZjNiwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0gfSB9LAoteyJzcXJ0cHMiLCAgICAyLCAweDBmNTEsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3FydHNzIiwgICAgMiwgMHhmMzBmNTEsICBYLCBGUHxNb2RybSwJeyBSZWdYTU18V29yZE1lbSwgUmVnWE1NLCAwIH0gfSwKLXsic3VicHMiLCAgICAgMiwgMHgwZjVjLCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InN1YnNzIiwgICAgIDIsIDB4ZjMwZjVjLCAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVjb21pc3MiLCAgIDIsIDB4MGYyZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfFdvcmRNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InVucGNraHBzIiwgIDIsIDB4MGYxNSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnWE1NfExMb25nTWVtLCBSZWdYTU0sIDAgfSB9LAoteyJ1bnBja2xwcyIsICAyLCAweDBmMTQsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ1hNTXxMTG9uZ01lbSwgUmVnWE1NLCAwIH0gfSwKLXsieG9ycHMiLCAgICAgMiwgMHgwZjU3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdYTU18TExvbmdNZW0sIFJlZ1hNTSwgMCB9IH0sCi17InBhdmdiIiwgICAgIDIsIDB4MGZlMCwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwYXZndyIsICAgICAyLCAweDBmZTMsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicGV4dHJ3IiwgICAgMywgMHgwZmM1LCAgICBYLCBGUHxNb2RybSwJeyBJbW04LCBSZWdNTVgsIFJlZzMyfEludk1lbSB9IH0sCi17InBpbnNydyIsICAgIDMsIDB4MGZjNCwgICAgWCwgRlB8TW9kcm0sCXsgSW1tOCwgUmVnMzJ8U2hvcnRNZW0sIFJlZ01NWCB9IH0sCi17InBtYXhzdyIsICAgIDIsIDB4MGZlZSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbWF4dWIiLCAgICAyLCAweDBmZGUsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YLCAwIH0gfSwKLXsicG1pbnN3IiwgICAgMiwgMHgwZmVhLCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBtaW51YiIsICAgIDIsIDB4MGZkYSwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbW92bXNrYiIsICAyLCAweDBmZDcsICAgIFgsIEZQfE1vZHJtLAl7IFJlZ01NWCwgUmVnMzJ8SW52TWVtLCAwIH0gfSwKLXsicG11bGh1dyIsICAgMiwgMHgwZmU0LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8TExvbmdNZW0sIFJlZ01NWCwgMCB9IH0sCi17InBzYWRidyIsICAgIDIsIDB4MGZmNiwgICAgWCwgRlB8TW9kcm0sCXsgUmVnTU1YfExMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwc2h1ZnciLCAgICAzLCAweDBmNzAsICAgIFgsIEZQfE1vZHJtLAl7IEltbTgsIFJlZ01NWHxMTG9uZ01lbSwgUmVnTU1YIH0gfSwKLXsibWFza21vdnEiLCAgMiwgMHgwZmY3LCAgICBYLCBGUHxNb2RybSwJeyBSZWdNTVh8SW52TWVtLCBSZWdNTVgsIDAgfSB9LAoteyJtb3ZudHBzIiwgICAyLCAweDBmMmIsICAgIFgsIEZQfE1vZHJtLCAJeyBSZWdYTU0sIExMb25nTWVtLCAwIH0gfSwKLXsibW92bnRxIiwgICAgMiwgMHgwZmU3LCAgICBYLCBGUHxNb2RybSwgCXsgUmVnTU1YLCBMTG9uZ01lbSwgMCB9IH0sCi17InByZWZldGNobnRhIiwgMSwgMHgwZjE4LCAgMCwgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLXsicHJlZmV0Y2h0MCIsICAxLCAweDBmMTgsICAxLCBGUHxNb2RybSwgCXsgTExvbmdNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHQxIiwgIDEsIDB4MGYxOCwgIDIsIEZQfE1vZHJtLCAJeyBMTG9uZ01lbSwgMCwgMCB9IH0sCi17InByZWZldGNodDIiLCAgMSwgMHgwZjE4LCAgMywgRlB8TW9kcm0sIAl7IExMb25nTWVtLCAwLCAwIH0gfSwKLQotLyogQU1EIDNETm93ISBpbnN0cnVjdGlvbnMgKi8KLQoteyJwcmVmZXRjaCIsIDEsIDB4MGYwZCwJICAgMCwgRlB8TW9kcm0sCQl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoteyJwcmVmZXRjaHciLDEsIDB4MGYwZCwJICAgMSwgRlB8TW9kcm0sCQl7IEJ5dGVNZW0sIDAsIDAgfSB9LAoteyJmZW1tcyIsICAgIDAsIDB4MGYwZSwJICAgWCwgRlAsCQl7IDAsIDAsIDAgfSB9LAoteyJwYXZndXNiIiwgIDIsIDB4MGYwZiwgMHhiZiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZjJpZCIsICAgIDIsIDB4MGYwZiwgMHgxZCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmFjYyIsICAgIDIsIDB4MGYwZiwgMHhhZSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmFkZCIsICAgIDIsIDB4MGYwZiwgMHg5ZSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGVxIiwgIDIsIDB4MGYwZiwgMHhiMCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGdlIiwgIDIsIDB4MGYwZiwgMHg5MCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZmNtcGd0IiwgIDIsIDB4MGYwZiwgMHhhMCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm1heCIsICAgIDIsIDB4MGYwZiwgMHhhNCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm1pbiIsICAgIDIsIDB4MGYwZiwgMHg5NCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZm11bCIsICAgIDIsIDB4MGYwZiwgMHhiNCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcCIsICAgIDIsIDB4MGYwZiwgMHg5NiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MSIsIDIsIDB4MGYwZiwgMHhhNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJjcGl0MiIsIDIsIDB4MGYwZiwgMHhiNiwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcWl0MSIsIDIsIDB4MGYwZiwgMHhhNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnJzcXJ0IiwgIDIsIDB4MGYwZiwgMHg5NywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnN1YiIsICAgIDIsIDB4MGYwZiwgMHg5YSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwZnN1YnIiLCAgIDIsIDB4MGYwZiwgMHhhYSwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwaTJmZCIsICAgIDIsIDB4MGYwZiwgMHgwZCwgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAoteyJwbXVsaHJ3IiwgIDIsIDB4MGYwZiwgMHhiNywgRlB8TW9kcm18SW1tRXh0LAl7IFJlZ01NWHxMb25nTWVtLCBSZWdNTVgsIDAgfSB9LAotCi17TlVMTCwgMCwgMCwgMCwgMCwgeyAwLCAwLCAwfSB9CS8qIHNlbnRpbmVsICovCi19OwotI3VuZGVmIFgKLSN1bmRlZiBOb1N1ZgotI3VuZGVmIGJfU3VmCi0jdW5kZWYgd19TdWYKLSN1bmRlZiBsX1N1ZgotI3VuZGVmIGJ3X1N1ZgotI3VuZGVmIGJsX1N1ZgotI3VuZGVmIHdsX1N1ZgotI3VuZGVmIHNsX1N1ZgotI3VuZGVmIGJ3bF9TdWYKLSN1bmRlZiBGUAotI3VuZGVmIGxfRlAKLSN1bmRlZiBzbF9GUAotCi0jZGVmaW5lIE1BWF9NTkVNX1NJWkUgMTYJLyogZm9yIHBhcnNpbmcgaW5zbiBtbmVtb25pY3MgZnJvbSBpbnB1dCAqLwotCi0KLS8qIDM4NiByZWdpc3RlciB0YWJsZSAqLwotCi1zdGF0aWMgY29uc3QgcmVnX2VudHJ5IGkzODZfcmVndGFiW10gPSB7Ci0gIC8qIDggYml0IHJlZ3MgKi8KLSAgeyJhbCIsIFJlZzh8QWNjLCAwfSwKLSAgeyJjbCIsIFJlZzh8U2hpZnRDb3VudCwgMX0sCi0gIHsiZGwiLCBSZWc4LCAyfSwKLSAgeyJibCIsIFJlZzgsIDN9LAotICB7ImFoIiwgUmVnOCwgNH0sCi0gIHsiY2giLCBSZWc4LCA1fSwKLSAgeyJkaCIsIFJlZzgsIDZ9LAotICB7ImJoIiwgUmVnOCwgN30sCi0gIC8qIDE2IGJpdCByZWdzICovCi0gIHsiYXgiLCBSZWcxNnxBY2MsIDB9LAotICB7ImN4IiwgUmVnMTYsIDF9LAotICB7ImR4IiwgUmVnMTZ8SW5PdXRQb3J0UmVnLCAyfSwKLSAgeyJieCIsIFJlZzE2fEJhc2VJbmRleCwgM30sCi0gIHsic3AiLCBSZWcxNiwgNH0sCi0gIHsiYnAiLCBSZWcxNnxCYXNlSW5kZXgsIDV9LAotICB7InNpIiwgUmVnMTZ8QmFzZUluZGV4LCA2fSwKLSAgeyJkaSIsIFJlZzE2fEJhc2VJbmRleCwgN30sCi0gIC8qIDMyIGJpdCByZWdzICovCi0gIHsiZWF4IiwgUmVnMzJ8QmFzZUluZGV4fEFjYywgMH0sCi0gIHsiZWN4IiwgUmVnMzJ8QmFzZUluZGV4LCAxfSwKLSAgeyJlZHgiLCBSZWczMnxCYXNlSW5kZXgsIDJ9LAotICB7ImVieCIsIFJlZzMyfEJhc2VJbmRleCwgM30sCi0gIHsiZXNwIiwgUmVnMzIsIDR9LAotICB7ImVicCIsIFJlZzMyfEJhc2VJbmRleCwgNX0sCi0gIHsiZXNpIiwgUmVnMzJ8QmFzZUluZGV4LCA2fSwKLSAgeyJlZGkiLCBSZWczMnxCYXNlSW5kZXgsIDd9LAotICAvKiBzZWdtZW50IHJlZ2lzdGVycyAqLwotICB7ImVzIiwgU1JlZzIsIDB9LAotICB7ImNzIiwgU1JlZzIsIDF9LAotICB7InNzIiwgU1JlZzIsIDJ9LAotICB7ImRzIiwgU1JlZzIsIDN9LAotICB7ImZzIiwgU1JlZzMsIDR9LAotICB7ImdzIiwgU1JlZzMsIDV9LAotICAvKiBjb250cm9sIHJlZ2lzdGVycyAqLwotICB7ImNyMCIsIENvbnRyb2wsIDB9LAotICB7ImNyMSIsIENvbnRyb2wsIDF9LAotICB7ImNyMiIsIENvbnRyb2wsIDJ9LAotICB7ImNyMyIsIENvbnRyb2wsIDN9LAotICB7ImNyNCIsIENvbnRyb2wsIDR9LAotICB7ImNyNSIsIENvbnRyb2wsIDV9LAotICB7ImNyNiIsIENvbnRyb2wsIDZ9LAotICB7ImNyNyIsIENvbnRyb2wsIDd9LAotICAvKiBkZWJ1ZyByZWdpc3RlcnMgKi8KLSAgeyJkYjAiLCBEZWJ1ZywgMH0sCi0gIHsiZGIxIiwgRGVidWcsIDF9LAotICB7ImRiMiIsIERlYnVnLCAyfSwKLSAgeyJkYjMiLCBEZWJ1ZywgM30sCi0gIHsiZGI0IiwgRGVidWcsIDR9LAotICB7ImRiNSIsIERlYnVnLCA1fSwKLSAgeyJkYjYiLCBEZWJ1ZywgNn0sCi0gIHsiZGI3IiwgRGVidWcsIDd9LAotICB7ImRyMCIsIERlYnVnLCAwfSwKLSAgeyJkcjEiLCBEZWJ1ZywgMX0sCi0gIHsiZHIyIiwgRGVidWcsIDJ9LAotICB7ImRyMyIsIERlYnVnLCAzfSwKLSAgeyJkcjQiLCBEZWJ1ZywgNH0sCi0gIHsiZHI1IiwgRGVidWcsIDV9LAotICB7ImRyNiIsIERlYnVnLCA2fSwKLSAgeyJkcjciLCBEZWJ1ZywgN30sCi0gIC8qIHRlc3QgcmVnaXN0ZXJzICovCi0gIHsidHIwIiwgVGVzdCwgMH0sCi0gIHsidHIxIiwgVGVzdCwgMX0sCi0gIHsidHIyIiwgVGVzdCwgMn0sCi0gIHsidHIzIiwgVGVzdCwgM30sCi0gIHsidHI0IiwgVGVzdCwgNH0sCi0gIHsidHI1IiwgVGVzdCwgNX0sCi0gIHsidHI2IiwgVGVzdCwgNn0sCi0gIHsidHI3IiwgVGVzdCwgN30sCi0gIC8qIGZsb2F0IHJlZ2lzdGVycyAqLwotICB7InN0KDApIiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICB7InN0IiwgRmxvYXRSZWd8RmxvYXRBY2MsIDB9LAotICB7InN0KDEpIiwgRmxvYXRSZWcsIDF9LAotICB7InN0KDIpIiwgRmxvYXRSZWcsIDJ9LAotICB7InN0KDMpIiwgRmxvYXRSZWcsIDN9LAotICB7InN0KDQpIiwgRmxvYXRSZWcsIDR9LAotICB7InN0KDUpIiwgRmxvYXRSZWcsIDV9LAotICB7InN0KDYpIiwgRmxvYXRSZWcsIDZ9LAotICB7InN0KDcpIiwgRmxvYXRSZWcsIDd9LAotICB7Im1tMCIsIFJlZ01NWCwgMH0sCi0gIHsibW0xIiwgUmVnTU1YLCAxfSwKLSAgeyJtbTIiLCBSZWdNTVgsIDJ9LAotICB7Im1tMyIsIFJlZ01NWCwgM30sCi0gIHsibW00IiwgUmVnTU1YLCA0fSwKLSAgeyJtbTUiLCBSZWdNTVgsIDV9LAotICB7Im1tNiIsIFJlZ01NWCwgNn0sCi0gIHsibW03IiwgUmVnTU1YLCA3fSwKLSAgeyJ4bW0wIiwgUmVnWE1NLCAwfSwKLSAgeyJ4bW0xIiwgUmVnWE1NLCAxfSwKLSAgeyJ4bW0yIiwgUmVnWE1NLCAyfSwKLSAgeyJ4bW0zIiwgUmVnWE1NLCAzfSwKLSAgeyJ4bW00IiwgUmVnWE1NLCA0fSwKLSAgeyJ4bW01IiwgUmVnWE1NLCA1fSwKLSAgeyJ4bW02IiwgUmVnWE1NLCA2fSwKLSAgeyJ4bW03IiwgUmVnWE1NLCA3fQotfTsKLQotI2RlZmluZSBNQVhfUkVHX05BTUVfU0laRSA4CS8qIGZvciBwYXJzaW5nIHJlZ2lzdGVyIG5hbWVzIGZyb20gaW5wdXQgKi8KLQotLyogc2VnbWVudCBzdHVmZiAqLwotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBjcyA9IHsgImNzIiwgMHgyZSB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBkcyA9IHsgImRzIiwgMHgzZSB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBzcyA9IHsgInNzIiwgMHgzNiB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBlcyA9IHsgImVzIiwgMHgyNiB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBmcyA9IHsgImZzIiwgMHg2NCB9Owotc3RhdGljIGNvbnN0IHNlZ19lbnRyeSBncyA9IHsgImdzIiwgMHg2NSB9OwotCi0vKiBlbmQgb2Ygb3Bjb2RlL2kzODYuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvaTg2MC5oIGIvaW5jbHVkZS9vcGNvZGUvaTg2MC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmViZDI1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL2k4NjAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MSArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgaTg2MC4KLSAgIENvcHlyaWdodCAoQykgMTk4OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgYW5kIEdEQiwgdGhlIEdOVSBkaXNhc3NlbWJsZXIuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTIG9yIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkKF9fU1REQ19fKSAmJiAhZGVmaW5lZChjb25zdCkKLSNkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0vKgotICogU3RydWN0dXJlIG9mIGFuIG9wY29kZSB0YWJsZSBlbnRyeS4KLSAqLwotc3RydWN0IGk4NjBfb3Bjb2RlCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB1bnNpZ25lZCBsb25nIG1hdGNoOwkvKiBCaXRzIHRoYXQgbXVzdCBiZSBzZXQuICAqLwotICAgIHVuc2lnbmVkIGxvbmcgbG9zZTsJLyogQml0cyB0aGF0IG11c3Qgbm90IGJlIHNldC4gICovCi0gICAgY29uc3QgY2hhciAqYXJnczsKLSAgICAvKiBOb256ZXJvIGlmIHRoaXMgaXMgYSBwb3NzaWJsZSBleHBhbmQtaW5zdHJ1Y3Rpb24uICAqLwotICAgIGNoYXIgZXhwYW5kOwotfTsKLQotZW51bSBleHBhbmRfdHlwZQotewotICAgIEVfTU9WID0gMSwgRV9BRERSLCBFX1UzMiwgRV9BTkQsIEVfUzMyLCBFX0RFTEFZCi19OwotCi0vKgotICAgQWxsIGk4NjAgb3Bjb2RlcyBhcmUgMzIgYml0cywgZXhjZXB0IGZvciB0aGUgcHNldWRvaW5zdHJ1Y3Rpb25zCi0gICBhbmQgdGhlIG9wZXJhdGlvbnMgdXRpbGl6aW5nIGEgMzItYml0IGFkZHJlc3MgZXhwcmVzc2lvbiwgYW4KLSAgIHVuc2lnbmVkIDMyLWJpdCBjb25zdGFudCwgb3IgYSBzaWduZWQgMzItYml0IGNvbnN0YW50LgotICAgVGhlc2Ugb3Bjb2RlcyBhcmUgZXhwYW5kZWQgaW50byBhIHR3by1pbnN0cnVjdGlvbiBzZXF1ZW5jZSBmb3IKLSAgIGFueSBzaXR1YXRpb24gd2hlcmUgdGhlIGltbWVkaWF0ZSBvcGVyYW5kIGRvZXMgbm90IGZpdCBpbiAzMiBiaXRzLgotICAgSW4gdGhlIGNhc2Ugb2YgdGhlIGFkZCBhbmQgc3VidHJhY3Qgb3BlcmF0aW9ucyB0aGUgZXhwYW5zaW9uIGlzCi0gICB0byBhIHRocmVlLWluc3RydWN0aW9uIHNlcXVlbmNlIChleDogb3JoLCBvciwgYWRkcykuICBJbiBjYXNlcwotICAgd2hlcmUgdGhlIGFkZHJlc3MgaXMgdG8gYmUgcmVsb2NhdGVkLCB0aGUgaW5zdHJ1Y3Rpb24gaXMKLSAgIGV4cGFuZGVkIHRvIGhhbmRsZSB0aGUgd29yc2UgY2FzZSwgdGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYXQKLSAgIHRoZSBmaW5hbCBsaW5rIGlmIHRoZSBhY3R1YWwgYWRkcmVzcyB3ZXJlIGtub3duLgotCi0gICBUaGUgcHNldWRvaW5zdHJ1Y3Rpb25zIGFyZTogIG1vdiwgZm1vdiwgcG1vdiwgbm9wLCBhbmQgZm5vcC4KLSAgIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgYSBvbmUgb3IgdHdvIGluc3RydWN0aW9uCi0gICBzZXF1ZW5jZSBvZiBvdGhlciBvcGVyYXRpb25zLgotCi0gICBUaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEKLSAgIHBhcnRpY3VsYXIgb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZQotICAgb2YgdGhhdCBvcGNvZGUuCi0KLSAgIFRoZSBhcmdzIGNvbXBvbmVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIG9uZSBjaGFyYWN0ZXIKLSAgIGZvciBlYWNoIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLgotCi1LaW5kcyBvZiBvcGVyYW5kczoKLSAgICMgICAgTnVtYmVyIHVzZWQgYnkgb3B0aW1pemVyLiAgSXQgaXMgaWdub3JlZC4KLSAgIDEgICAgc3JjMSBpbnRlZ2VyIHJlZ2lzdGVyLgotICAgMiAgICBzcmMyIGludGVnZXIgcmVnaXN0ZXIuCi0gICBkICAgIGRlc3QgcmVnaXN0ZXIuCi0gICBjCWN0cmxyZWcgY29udHJvbCByZWdpc3Rlci4KLSAgIGkgICAgMTYgYml0IGltbWVkaWF0ZS4KLSAgIEkgICAgMTYgYml0IGltbWVkaWF0ZSwgYWxpZ25lZC4KLSAgIDUgICAgNSBiaXQgaW1tZWRpYXRlLgotICAgbCAgICBsYnJvZmYgMjYgYml0IFBDIHJlbGF0aXZlIGltbWVkaWF0ZS4KLSAgIHIgICAgc2Jyb2ZmIDE2IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0gICBzCXNwbGl0IDE2IGJpdCBpbW1lZGlhdGUuCi0gICBTCXNwbGl0IDE2IGJpdCBpbW1lZGlhdGUsIGFsaWduZWQuCi0gICBlICAgIHNyYzEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0gICBmICAgIHNyYzIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0gICBnICAgIGRlc3QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0KLSovCi0KLS8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGlzIHRhYmxlIGlzIHNpZ25pZmljYW50OgotICAgCi0gICAqIFRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUKLSAgIGNvbnNlY3V0aXZlLiAgSWYgdGhleSBhcmVuJ3QsIHRoZSBhc3NlbWJsZXIgd2lsbCBib21iIGF0IHJ1bnRpbWUuCi0KLSAgICogVGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgbm90IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mIHRoZSBvcGNvZGVzLiAgKi8KLQotc3RhdGljIHN0cnVjdCBpODYwX29wY29kZSBpODYwX29wY29kZXNbXSA9Ci17Ci0KLS8qIFJFRy1Gb3JtYXQgSW5zdHJ1Y3Rpb25zICovCi17ICJsZC5jIiwJMHgzMDAwMDAwMCwgMHhjYzAwMDAwMCwgImMsZCIsIDAgfSwJLyogbGQuYyBjc3JjMixpZGVzdCAqLwoteyAibGQuYiIsCTB4MDAwMDAwMDAsIDB4ZmMwMDAwMDAsICIxKDIpLGQiLCAwIH0sCS8qIGxkLmIgaXNyYzEoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5iIiwJMHgwNDAwMDAwMCwgMHhmODAwMDAwMCwgIkkoMiksZCIsIEVfQUREUiB9LAkvKiBsZC5iICNjb25zdChpc3JjMiksaWRlc3QgKi8KLXsgImxkLnMiLAkweDEwMDAwMDAwLCAweGVjMDAwMDAxLCAiMSgyKSxkIiwgMCB9LAkvKiBsZC5zIGlzcmMxKGlzcmMyKSxpZGVzdCAqLwoteyAibGQucyIsCTB4MTQwMDAwMDEsIDB4ZTgwMDAwMDAsICJJKDIpLGQiLCBFX0FERFIgfSwJLyogbGQucyAjY29uc3QoaXNyYzIpLGlkZXN0ICovCi17ICJsZC5sIiwJMHgxMDAwMDAwMSwgMHhlYzAwMDAwMCwgIjEoMiksZCIsIDAgfSwJLyogbGQubCBpc3JjMShpc3JjMiksaWRlc3QgKi8KLXsgImxkLmwiLAkweDE0MDAwMDAxLCAweGU4MDAwMDAwLCAiSSgyKSxkIiwgRV9BRERSIH0sCS8qIGxkLmwgI2NvbnN0KGlzcmMyKSxpZGVzdCAqLwotCi17ICJzdC5jIiwJMHgzODAwMDAwMCwgMHhjNDAwMDAwMCwgIjEsYyIsIDAgfSwJLyogc3QuYyBpc3JjMW5pLGNzcmMyICovCi17ICJzdC5iIiwJMHgwYzAwMDAwMCwgMHhmMDAwMDAwMCwgIjEsUygyKSIsIEVfQUREUiB9LAkvKiBzdC5iIGlzcmMxbmksI2NvbnN0KGlzcmMyKSAqLwoteyAic3QucyIsCTB4MWMwMDAwMDAsIDB4ZTAwMDAwMDAsICIxLFMoMikiLCBFX0FERFIgfSwJLyogc3QucyBpc3JjMW5pLCNjb25zdChpc3JjMikgKi8KLXsgInN0LmwiLAkweDFjMDAwMDAxLCAweGUwMDAwMDAwLCAiMSxTKDIpIiwgRV9BRERSIH0sCS8qIHN0LmwgaXNyYzFuaSwjY29uc3QoaXNyYzIpICovCi0KLXsgIml4ZnIiLAkweDA4MDAwMDAwLCAweGY0MDAwMDAwLCAiMSxnIiwgMCB9LAkvKiBpeGZyIGlzcmMxbmksZmRlc3QgKi8KLQoteyAiZmxkLmwiLAkweDIwMDAwMDAyLCAweGRjMDAwMDAxLCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQubCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyNDAwMDAwMiwgMHhkODAwMDAwMSwgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQubCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQubCIsCTB4MjAwMDAwMDMsIDB4ZGMwMDAwMDAsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLmwgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5sIiwJMHgyNDAwMDAwMywgMHhkODAwMDAwMCwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5sICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLmQiLAkweDIwMDAwMDAwLCAweGRjMDAwMDA3LCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQuZCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyNDAwMDAwMCwgMHhkODAwMDAwNywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQuZCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQuZCIsCTB4MjAwMDAwMDEsIDB4ZGMwMDAwMDYsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLmQgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5kIiwJMHgyNDAwMDAwMSwgMHhkODAwMDAwNiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5kICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwoteyAiZmxkLnEiLAkweDIwMDAwMDA0LCAweGRjMDAwMDAzLCAiMSgyKSxnIiwgMCB9LAkvKiBmbGQucSBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyNDAwMDAwNCwgMHhkODAwMDAwMywgImkoMiksZyIsIEVfQUREUiB9LAkvKiBmbGQucSAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJmbGQucSIsCTB4MjAwMDAwMDUsIDB4ZGMwMDAwMDIsICIxKDIpKyssZyIsIDAgfSwJLyogZmxkLnEgaXNyYzEoaXNyYzIpKyssZmRlc3QgKi8KLXsgImZsZC5xIiwJMHgyNDAwMDAwNSwgMHhkODAwMDAwMiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIGZsZC5xICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwotCi17ICJwZmxkLmwiLAkweDYwMDAwMDAwLCAweDljMDAwMDAzLCAiMSgyKSxnIiwgMCB9LAkvKiBwZmxkLmwgaXNyYzEoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDY0MDAwMDAwLCAweDk4MDAwMDAzLCAiaSgyKSxnIiwgRV9BRERSIH0sCS8qIHBmbGQubCAjY29uc3QoaXNyYzIpLGZkZXN0ICovCi17ICJwZmxkLmwiLAkweDYwMDAwMDAxLCAweDljMDAwMDAyLCAiMSgyKSsrLGciLCAwIH0sCS8qIHBmbGQubCBpc3JjMShpc3JjMikrKyxmZGVzdCAqLwoteyAicGZsZC5sIiwJMHg2NDAwMDAwMSwgMHg5ODAwMDAwMiwgImkoMikrKyxnIiwgRV9BRERSIH0sCS8qIHBmbGQubCAjY29uc3QoaXNyYzIpKyssZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjAwMDAwMDAsIDB4OWMwMDAwMDcsICIxKDIpLGciLCAwIH0sCS8qIHBmbGQuZCBpc3JjMShpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjQwMDAwMDAsIDB4OTgwMDAwMDcsICJpKDIpLGciLCBFX0FERFIgfSwJLyogcGZsZC5kICNjb25zdChpc3JjMiksZmRlc3QgKi8KLXsgInBmbGQuZCIsCTB4NjAwMDAwMDEsIDB4OWMwMDAwMDYsICIxKDIpKyssZyIsIDAgfSwJLyogcGZsZC5kIGlzcmMxKGlzcmMyKSsrLGZkZXN0ICovCi17ICJwZmxkLmQiLAkweDY0MDAwMDAxLCAweDk4MDAwMDA2LCAiaSgyKSsrLGciLCBFX0FERFIgfSwJLyogcGZsZC5kICNjb25zdChpc3JjMikrKyxmZGVzdCAqLwotCi17ICJmc3QubCIsCTB4MjgwMDAwMDIsIDB4ZDQwMDAwMDEsICJnLDEoMikiLCAwIH0sCS8qIGZzdC5sIGZkZXN0LGlzcmMxKGlzcmMyKSAqLwoteyAiZnN0LmwiLAkweDJjMDAwMDAyLCAweGQwMDAwMDAxLCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIGZzdC5sIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgImZzdC5sIiwJMHgyODAwMDAwMywgMHhkNDAwMDAwMCwgImcsMSgyKSsrIiwgMCB9LAkvKiBmc3QubCBmZGVzdCxpc3JjMShpc3JjMikrKyAqLwoteyAiZnN0LmwiLAkweDJjMDAwMDAzLCAweGQwMDAwMDAwLCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogZnN0LmwgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi17ICJmc3QuZCIsCTB4MjgwMDAwMDAsIDB4ZDQwMDAwMDcsICJnLDEoMikiLCAwIH0sCS8qIGZzdC5kIGZkZXN0LGlzcmMxKGlzcmMyKSAqLwoteyAiZnN0LmQiLAkweDJjMDAwMDAwLCAweGQwMDAwMDA3LCAiZyxpKDIpIiwgRV9BRERSIH0sCS8qIGZzdC5kIGZkZXN0LCNjb25zdChpc3JjMikgKi8KLXsgImZzdC5kIiwJMHgyODAwMDAwMSwgMHhkNDAwMDAwNiwgImcsMSgyKSsrIiwgMCB9LAkvKiBmc3QuZCBmZGVzdCxpc3JjMShpc3JjMikrKyAqLwoteyAiZnN0LmQiLAkweDJjMDAwMDAxLCAweGQwMDAwMDA2LCAiZyxpKDIpKysiLCBFX0FERFIgfSwJLyogZnN0LmQgZmRlc3QsI2NvbnN0KGlzcmMyKSsrICovCi0KLXsgInBzdC5kIiwJMHgzYzAwMDAwMCwgMHhjMDAwMDAwNywgImcsaSgyKSIsIEVfQUREUiB9LAkvKiBwc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpICovCi17ICJwc3QuZCIsCTB4M2MwMDAwMDEsIDB4YzAwMDAwMDYsICJnLGkoMikrKyIsIEVfQUREUiB9LAkvKiBwc3QuZCBmZGVzdCwjY29uc3QoaXNyYzIpKysgKi8KLQoteyAiYWRkdSIsCTB4ODAwMDAwMDAsIDB4N2MwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYWRkdSBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYWRkdSIsCTB4ODQwMDAwMDAsIDB4NzgwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIGFkZHUgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhZGRzIiwJMHg5MDAwMDAwMCwgMHg2YzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhZGRzIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJhZGRzIiwJMHg5NDAwMDAwMCwgMHg2ODAwMDAwMCwgImksMixkIiwgRV9TMzIgfSwJLyogYWRkcyAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnUiLAkweDg4MDAwMDAwLCAweDc0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHN1YnUgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInN1YnUiLAkweDhjMDAwMDAwLCAweDcwMDAwMDAwLCAiaSwyLGQiLCBFX1MzMiB9LAkvKiBzdWJ1ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAic3VicyIsCTB4OTgwMDAwMDAsIDB4NjQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc3VicyBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAic3VicyIsCTB4OWMwMDAwMDAsIDB4NjAwMDAwMDAsICJpLDIsZCIsIEVfUzMyIH0sCS8qIHN1YnMgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgInNobCIsCTB4YTAwMDAwMDAsIDB4NWMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hsIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaGwiLAkweGE0MDAwMDAwLCAweDU4MDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNobCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInNociIsCTB4YTgwMDAwMDAsIDB4NTQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogc2hyIGlzcmMxLGlzcmMyLGlkZXN0ICovCi17ICJzaHIiLAkweGFjMDAwMDAwLCAweDUwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNociAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInNocmQiLAkweGIwMDAwMDAwLCAweDRjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNocmQgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNocmEiLAkweGI4MDAwMDAwLCAweDQ0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHNocmEgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInNocmEiLAkweGJjMDAwMDAwLCAweDQwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHNocmEgI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgIm1vdiIsCTB4YTAwMDAwMDAsIDB4NWMwMGY4MDAsICIyLGQiLCAwIH0sCS8qIHNobCByMCxpc3JjMixpZGVzdCAqLwoteyAibW92IiwJMHg5NDAwMDAwMCwgMHg2OWUwMDAwMCwgImksZCIsIEVfTU9WIH0sCS8qIGFkZHMgI2NvbnN0LHIwLGlkZXN0ICovCi17ICJub3AiLAkweGEwMDAwMDAwLCAweDVmZmZmODAwLCAiIiwgMCB9LAkvKiBzaGwgcjAscjAscjAgKi8KLXsgImZub3AiLAkweGIwMDAwMDAwLCAweDRmZmZmODAwLCAiIiwgMCB9LAkvKiBzaHJkIHIwLHIwLHIwICovCi0KLXsgInRyYXAiLAkweDQ0MDAwMDAwLCAweGI4MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHRyYXAgaXNyYzFuaSxpc3JjMixpZGVzdCAqLwotCi17ICJmbHVzaCIsCTB4MzQwMDAwMDAsIDB4YzgxZjAwMDEsICJpKDIpIiwgRV9BRERSIH0sCS8qIGZsdXNoICNjb25zdChpc3JjMikgKi8KLXsgImZsdXNoIiwJMHgzNDAwMDAwMSwgMHhjODFmMDAwMCwgImkoMikrKyIsIEVfQUREUiB9LAkvKiBmbHVzaCAjY29uc3QoaXNyYzIpKysgKi8KLQoteyAiYW5kIiwJMHhjMDAwMDAwMCwgMHgzYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBhbmQgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZCIsCTB4YzQwMDAwMDAsIDB4MzgwMDAwMDAsICJpLDIsZCIsIEVfQU5EIH0sCS8qIGFuZCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgImFuZGgiLAkweGM4MDAwMDAwLCAweDM0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZGggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgImFuZGgiLAkweGNjMDAwMDAwLCAweDMwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIGFuZGggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi17ICJhbmRub3QiLAkweGQwMDAwMDAwLCAweDJjMDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIGFuZG5vdCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90IiwJMHhkNDAwMDAwMCwgMHgyODAwMDAwMCwgImksMixkIiwgRV9VMzIgfSwJLyogYW5kbm90ICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90aCIsCTB4ZDgwMDAwMDAsIDB4MjQwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogYW5kbm90aCBpc3JjMSxpc3JjMixpZGVzdCAqLwoteyAiYW5kbm90aCIsCTB4ZGMwMDAwMDAsIDB4MjAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogYW5kbm90aCAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgIm9yIiwJCTB4ZTAwMDAwMDAsIDB4MWMwMDAwMDAsICIxLDIsZCIsIDAgfSwJLyogb3IgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgIm9yIiwJCTB4ZTQwMDAwMDAsIDB4MTgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIG9yICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAib3JoIiwJMHhlODAwMDAwMCwgMHgxNDAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiBvcmggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgIm9yaCIsCTB4ZWMwMDAwMDAsIDB4MTAwMDAwMDAsICJpLDIsZCIsIDAgfSwJLyogb3JoICNjb25zdCxpc3JjMixpZGVzdCAqLwoteyAieG9yIiwJMHhmMDAwMDAwMCwgMHgwYzAwMDAwMCwgIjEsMixkIiwgMCB9LAkvKiB4b3IgaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInhvciIsCTB4ZjQwMDAwMDAsIDB4MDgwMDAwMDAsICJpLDIsZCIsIEVfVTMyIH0sCS8qIHhvciAjY29uc3QsaXNyYzIsaWRlc3QgKi8KLXsgInhvcmgiLAkweGY4MDAwMDAwLCAweDA0MDAwMDAwLCAiMSwyLGQiLCAwIH0sCS8qIHhvcmggaXNyYzEsaXNyYzIsaWRlc3QgKi8KLXsgInhvcmgiLAkweGZjMDAwMDAwLCAweDAwMDAwMDAwLCAiaSwyLGQiLCAwIH0sCS8qIHhvcmggI2NvbnN0LGlzcmMyLGlkZXN0ICovCi0KLXsgImJ0ZSIsCTB4NTgwMDAwMDAsIDB4YTQwMDAwMDAsICIxLDIscyIsIDAgfSwJLyogYnRlIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJ0ZSIsCTB4NWMwMDAwMDAsIDB4YTAwMDAwMDAsICI1LDIscyIsIDAgfSwJLyogYnRlICNjb25zdDUsaXNyYzIsc2Jyb2ZmICovCi17ICJidG5lIiwJMHg1MDAwMDAwMCwgMHhhYzAwMDAwMCwgIjEsMixzIiwgMCB9LAkvKiBidG5lIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJ0bmUiLAkweDU0MDAwMDAwLCAweGE4MDAwMDAwLCAiNSwyLHMiLCAwIH0sCS8qIGJ0bmUgI2NvbnN0NSxpc3JjMixzYnJvZmYgKi8KLXsgImJsYSIsCTB4YjQwMDAwMDAsIDB4NDgwMDAwMDAsICIxLDIscyIsIEVfREVMQVkgfSwJLyogYmxhIGlzcmMxcyxpc3JjMixzYnJvZmYgKi8KLXsgImJyaSIsCTB4NDAwMDAwMDAsIDB4YmMwMDAwMDAsICIxIiwgRV9ERUxBWSB9LAkvKiBicmkgaXNyYzFuaSAqLwotCi0vKiBDb3JlIEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgKi8KLXsgImxvY2siLAkweDRjMDAwMDAxLCAweGIwMDAwMDFlLCAiIiwgMCB9LAkvKiBsb2NrIHNldCBCTCBpbiBkaXJiYXNlICovCi17ICJjYWxsaSIsCTB4NGMwMDAwMDIsIDB4YjAwMDAwMWQsICIxIiwgRV9ERUxBWSB9LAkvKiBjYWxsaSBpc3JjMW5pICovCi17ICJpbnRvdnIiLAkweDRjMDAwMDA0LCAweGIwMDAwMDFiLCAiIiwgMCB9LAkvKiBpbnRvdnIgdHJhcCBvbiBpbnRlZ2VyIG92ZXJmbG93ICovCi17ICJ1bmxvY2siLAkweDRjMDAwMDA3LCAweGIwMDAwMDE4LCAiIiwgMCB9LAkvKiB1bmxvY2sgY2xlYXIgQkwgaW4gZGlyYmFzZSAqLwotCi0vKiBDVFJMLUZvcm1hdCBJbnN0cnVjdGlvbnMgKi8KLXsgImJyIiwJCTB4NjgwMDAwMDAsIDB4OTQwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBiciBsYnJvZmYgKi8KLXsgImNhbGwiLAkweDZjMDAwMDAwLCAweDkwMDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogY2FsbCBsYnJvZmYgKi8KLXsgImJjIiwJCTB4NzAwMDAwMDAsIDB4OGMwMDAwMDAsICJsIiwgMCB9LAkvKiBiYyBsYnJvZmYgKi8KLXsgImJjLnQiLAkweDc0MDAwMDAwLCAweDg4MDAwMDAwLCAibCIsIEVfREVMQVkgfSwJLyogYmMudCBsYnJvZmYgKi8KLXsgImJuYyIsCTB4NzgwMDAwMDAsIDB4ODQwMDAwMDAsICJsIiwgMCB9LAkvKiBibmMgbGJyb2ZmICovCi17ICJibmMudCIsCTB4N2MwMDAwMDAsIDB4ODAwMDAwMDAsICJsIiwgRV9ERUxBWSB9LAkvKiBibmMudCBsYnJvZmYgKi8KLQotLyogRmxvYXRpbmcgUG9pbnQgRXNjYXBlIEluc3RydWN0aW9uIEZvcm1hdCAtIHBmYW0ucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicjJwMS5zcyIsCTB4NDgwMDA0MDAsIDB4YjQwMDAzZmYsICJlLGYsZyIsIDAgfSwKLXsgInIycDEuc2QiLAkweDQ4MDAwNDgwLCAweGI0MDAwMzdmLCAiZSxmLGciLCAwIH0sCi17ICJyMnAxLmRkIiwJMHg0ODAwMDU4MCwgMHhiNDAwMDI3ZiwgImUsZixnIiwgMCB9LAoteyAicjJwdC5zcyIsCTB4NDgwMDA0MDEsIDB4YjQwMDAzZmUsICJlLGYsZyIsIDAgfSwKLXsgInIycHQuc2QiLAkweDQ4MDAwNDgxLCAweGI0MDAwMzdlLCAiZSxmLGciLCAwIH0sCi17ICJyMnB0LmRkIiwJMHg0ODAwMDU4MSwgMHhiNDAwMDI3ZSwgImUsZixnIiwgMCB9LAoteyAicjJhcDEuc3MiLAkweDQ4MDAwNDAyLCAweGI0MDAwM2ZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwMS5zZCIsCTB4NDgwMDA0ODIsIDB4YjQwMDAzN2QsICJlLGYsZyIsIDAgfSwKLXsgInIyYXAxLmRkIiwJMHg0ODAwMDU4MiwgMHhiNDAwMDI3ZCwgImUsZixnIiwgMCB9LAoteyAicjJhcHQuc3MiLAkweDQ4MDAwNDAzLCAweGI0MDAwM2ZjLCAiZSxmLGciLCAwIH0sCi17ICJyMmFwdC5zZCIsCTB4NDgwMDA0ODMsIDB4YjQwMDAzN2MsICJlLGYsZyIsIDAgfSwKLXsgInIyYXB0LmRkIiwJMHg0ODAwMDU4MywgMHhiNDAwMDI3YywgImUsZixnIiwgMCB9LAoteyAiaTJwMS5zcyIsCTB4NDgwMDA0MDQsIDB4YjQwMDAzZmIsICJlLGYsZyIsIDAgfSwKLXsgImkycDEuc2QiLAkweDQ4MDAwNDg0LCAweGI0MDAwMzdiLCAiZSxmLGciLCAwIH0sCi17ICJpMnAxLmRkIiwJMHg0ODAwMDU4NCwgMHhiNDAwMDI3YiwgImUsZixnIiwgMCB9LAoteyAiaTJwdC5zcyIsCTB4NDgwMDA0MDUsIDB4YjQwMDAzZmEsICJlLGYsZyIsIDAgfSwKLXsgImkycHQuc2QiLAkweDQ4MDAwNDg1LCAweGI0MDAwMzdhLCAiZSxmLGciLCAwIH0sCi17ICJpMnB0LmRkIiwJMHg0ODAwMDU4NSwgMHhiNDAwMDI3YSwgImUsZixnIiwgMCB9LAoteyAiaTJhcDEuc3MiLAkweDQ4MDAwNDA2LCAweGI0MDAwM2Y5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwMS5zZCIsCTB4NDgwMDA0ODYsIDB4YjQwMDAzNzksICJlLGYsZyIsIDAgfSwKLXsgImkyYXAxLmRkIiwJMHg0ODAwMDU4NiwgMHhiNDAwMDI3OSwgImUsZixnIiwgMCB9LAoteyAiaTJhcHQuc3MiLAkweDQ4MDAwNDA3LCAweGI0MDAwM2Y4LCAiZSxmLGciLCAwIH0sCi17ICJpMmFwdC5zZCIsCTB4NDgwMDA0ODcsIDB4YjQwMDAzNzgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXB0LmRkIiwJMHg0ODAwMDU4NywgMHhiNDAwMDI3OCwgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLnNzIiwJMHg0ODAwMDQwOCwgMHhiNDAwMDNmNywgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLnNkIiwJMHg0ODAwMDQ4OCwgMHhiNDAwMDM3NywgImUsZixnIiwgMCB9LAoteyAicmF0MXAyLmRkIiwJMHg0ODAwMDU4OCwgMHhiNDAwMDI3NywgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLnNzIiwJMHg0ODAwMDQwOSwgMHhiNDAwMDNmNiwgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLnNkIiwJMHg0ODAwMDQ4OSwgMHhiNDAwMDM3NiwgImUsZixnIiwgMCB9LAoteyAibTEyYXBtLmRkIiwJMHg0ODAwMDU4OSwgMHhiNDAwMDI3NiwgImUsZixnIiwgMCB9LAoteyAicmExcDIuc3MiLAkweDQ4MDAwNDBhLCAweGI0MDAwM2Y1LCAiZSxmLGciLCAwIH0sCi17ICJyYTFwMi5zZCIsCTB4NDgwMDA0OGEsIDB4YjQwMDAzNzUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXAyLmRkIiwJMHg0ODAwMDU4YSwgMHhiNDAwMDI3NSwgImUsZixnIiwgMCB9LAoteyAibTEydHRwYS5zcyIsCTB4NDgwMDA0MGIsIDB4YjQwMDAzZjQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0cGEuc2QiLAkweDQ4MDAwNDhiLCAweGI0MDAwMzc0LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHBhLmRkIiwJMHg0ODAwMDU4YiwgMHhiNDAwMDI3NCwgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLnNzIiwJMHg0ODAwMDQwYywgMHhiNDAwMDNmMywgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLnNkIiwJMHg0ODAwMDQ4YywgMHhiNDAwMDM3MywgImUsZixnIiwgMCB9LAoteyAiaWF0MXAyLmRkIiwJMHg0ODAwMDU4YywgMHhiNDAwMDI3MywgImUsZixnIiwgMCB9LAoteyAibTEydHBtLnNzIiwJMHg0ODAwMDQwZCwgMHhiNDAwMDNmMiwgImUsZixnIiwgMCB9LAoteyAibTEydHBtLnNkIiwJMHg0ODAwMDQ4ZCwgMHhiNDAwMDM3MiwgImUsZixnIiwgMCB9LAoteyAibTEydHBtLmRkIiwJMHg0ODAwMDU4ZCwgMHhiNDAwMDI3MiwgImUsZixnIiwgMCB9LAoteyAiaWExcDIuc3MiLAkweDQ4MDAwNDBlLCAweGI0MDAwM2YxLCAiZSxmLGciLCAwIH0sCi17ICJpYTFwMi5zZCIsCTB4NDgwMDA0OGUsIDB4YjQwMDAzNzEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXAyLmRkIiwJMHg0ODAwMDU4ZSwgMHhiNDAwMDI3MSwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLnNzIiwJMHg0ODAwMDQwZiwgMHhiNDAwMDNmMCwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLnNkIiwJMHg0ODAwMDQ4ZiwgMHhiNDAwMDM3MCwgImUsZixnIiwgMCB9LAoteyAibTEydHBhLmRkIiwJMHg0ODAwMDU4ZiwgMHhiNDAwMDI3MCwgImUsZixnIiwgMCB9LAotCi0vKiBGbG9hdGluZyBQb2ludCBFc2NhcGUgSW5zdHJ1Y3Rpb24gRm9ybWF0IC0gcGZzbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJyMnMxLnNzIiwJMHg0ODAwMDQxMCwgMHhiNDAwMDNlZiwgImUsZixnIiwgMCB9LAoteyAicjJzMS5zZCIsCTB4NDgwMDA0OTAsIDB4YjQwMDAzNmYsICJlLGYsZyIsIDAgfSwKLXsgInIyczEuZGQiLAkweDQ4MDAwNTkwLCAweGI0MDAwMjZmLCAiZSxmLGciLCAwIH0sCi17ICJyMnN0LnNzIiwJMHg0ODAwMDQxMSwgMHhiNDAwMDNlZSwgImUsZixnIiwgMCB9LAoteyAicjJzdC5zZCIsCTB4NDgwMDA0OTEsIDB4YjQwMDAzNmUsICJlLGYsZyIsIDAgfSwKLXsgInIyc3QuZGQiLAkweDQ4MDAwNTkxLCAweGI0MDAwMjZlLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzMS5zcyIsCTB4NDgwMDA0MTIsIDB4YjQwMDAzZWQsICJlLGYsZyIsIDAgfSwKLXsgInIyYXMxLnNkIiwJMHg0ODAwMDQ5MiwgMHhiNDAwMDM2ZCwgImUsZixnIiwgMCB9LAoteyAicjJhczEuZGQiLAkweDQ4MDAwNTkyLCAweGI0MDAwMjZkLCAiZSxmLGciLCAwIH0sCi17ICJyMmFzdC5zcyIsCTB4NDgwMDA0MTMsIDB4YjQwMDAzZWMsICJlLGYsZyIsIDAgfSwKLXsgInIyYXN0LnNkIiwJMHg0ODAwMDQ5MywgMHhiNDAwMDM2YywgImUsZixnIiwgMCB9LAoteyAicjJhc3QuZGQiLAkweDQ4MDAwNTkzLCAweGI0MDAwMjZjLCAiZSxmLGciLCAwIH0sCi17ICJpMnMxLnNzIiwJMHg0ODAwMDQxNCwgMHhiNDAwMDNlYiwgImUsZixnIiwgMCB9LAoteyAiaTJzMS5zZCIsCTB4NDgwMDA0OTQsIDB4YjQwMDAzNmIsICJlLGYsZyIsIDAgfSwKLXsgImkyczEuZGQiLAkweDQ4MDAwNTk0LCAweGI0MDAwMjZiLCAiZSxmLGciLCAwIH0sCi17ICJpMnN0LnNzIiwJMHg0ODAwMDQxNSwgMHhiNDAwMDNlYSwgImUsZixnIiwgMCB9LAoteyAiaTJzdC5zZCIsCTB4NDgwMDA0OTUsIDB4YjQwMDAzNmEsICJlLGYsZyIsIDAgfSwKLXsgImkyc3QuZGQiLAkweDQ4MDAwNTk1LCAweGI0MDAwMjZhLCAiZSxmLGciLCAwIH0sCi17ICJpMmFzMS5zcyIsCTB4NDgwMDA0MTYsIDB4YjQwMDAzZTksICJlLGYsZyIsIDAgfSwKLXsgImkyYXMxLnNkIiwJMHg0ODAwMDQ5NiwgMHhiNDAwMDM2OSwgImUsZixnIiwgMCB9LAoteyAiaTJhczEuZGQiLAkweDQ4MDAwNTk2LCAweGI0MDAwMjY5LCAiZSxmLGciLCAwIH0sCi17ICJpMmFzdC5zcyIsCTB4NDgwMDA0MTcsIDB4YjQwMDAzZTgsICJlLGYsZyIsIDAgfSwKLXsgImkyYXN0LnNkIiwJMHg0ODAwMDQ5NywgMHhiNDAwMDM2OCwgImUsZixnIiwgMCB9LAoteyAiaTJhc3QuZGQiLAkweDQ4MDAwNTk3LCAweGI0MDAwMjY4LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuc3MiLAkweDQ4MDAwNDE4LCAweGI0MDAwM2U3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuc2QiLAkweDQ4MDAwNDk4LCAweGI0MDAwMzY3LCAiZSxmLGciLCAwIH0sCi17ICJyYXQxczIuZGQiLAkweDQ4MDAwNTk4LCAweGI0MDAwMjY3LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uc3MiLAkweDQ4MDAwNDE5LCAweGI0MDAwM2U2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uc2QiLAkweDQ4MDAwNDk5LCAweGI0MDAwMzY2LCAiZSxmLGciLCAwIH0sCi17ICJtMTJhc20uZGQiLAkweDQ4MDAwNTk5LCAweGI0MDAwMjY2LCAiZSxmLGciLCAwIH0sCi17ICJyYTFzMi5zcyIsCTB4NDgwMDA0MWEsIDB4YjQwMDAzZTUsICJlLGYsZyIsIDAgfSwKLXsgInJhMXMyLnNkIiwJMHg0ODAwMDQ5YSwgMHhiNDAwMDM2NSwgImUsZixnIiwgMCB9LAoteyAicmExczIuZGQiLAkweDQ4MDAwNTlhLCAweGI0MDAwMjY1LCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0dHNhLnNzIiwJMHg0ODAwMDQxYiwgMHhiNDAwMDNlNCwgImUsZixnIiwgMCB9LAoteyAibTEydHRzYS5zZCIsCTB4NDgwMDA0OWIsIDB4YjQwMDAzNjQsICJlLGYsZyIsIDAgfSwKLXsgIm0xMnR0c2EuZGQiLAkweDQ4MDAwNTliLCAweGI0MDAwMjY0LCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuc3MiLAkweDQ4MDAwNDFjLCAweGI0MDAwM2UzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuc2QiLAkweDQ4MDAwNDljLCAweGI0MDAwMzYzLCAiZSxmLGciLCAwIH0sCi17ICJpYXQxczIuZGQiLAkweDQ4MDAwNTljLCAweGI0MDAwMjYzLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uc3MiLAkweDQ4MDAwNDFkLCAweGI0MDAwM2UyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uc2QiLAkweDQ4MDAwNDlkLCAweGI0MDAwMzYyLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c20uZGQiLAkweDQ4MDAwNTlkLCAweGI0MDAwMjYyLCAiZSxmLGciLCAwIH0sCi17ICJpYTFzMi5zcyIsCTB4NDgwMDA0MWUsIDB4YjQwMDAzZTEsICJlLGYsZyIsIDAgfSwKLXsgImlhMXMyLnNkIiwJMHg0ODAwMDQ5ZSwgMHhiNDAwMDM2MSwgImUsZixnIiwgMCB9LAoteyAiaWExczIuZGQiLAkweDQ4MDAwNTllLCAweGI0MDAwMjYxLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2Euc3MiLAkweDQ4MDAwNDFmLCAweGI0MDAwM2UwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2Euc2QiLAkweDQ4MDAwNDlmLCAweGI0MDAwMzYwLCAiZSxmLGciLCAwIH0sCi17ICJtMTJ0c2EuZGQiLAkweDQ4MDAwNTlmLCAweGI0MDAwMjYwLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZm1hbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJtcjJwMS5zcyIsCTB4NDgwMDAwMDAsIDB4YjQwMDA3ZmYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnAxLnNkIiwJMHg0ODAwMDA4MCwgMHhiNDAwMDc3ZiwgImUsZixnIiwgMCB9LAoteyAibXIycDEuZGQiLAkweDQ4MDAwMTgwLCAweGI0MDAwNjdmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJwdC5zcyIsCTB4NDgwMDAwMDEsIDB4YjQwMDA3ZmUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnB0LnNkIiwJMHg0ODAwMDA4MSwgMHhiNDAwMDc3ZSwgImUsZixnIiwgMCB9LAoteyAibXIycHQuZGQiLAkweDQ4MDAwMTgxLCAweGI0MDAwNjdlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuc3MiLAkweDQ4MDAwMDAyLCAweGI0MDAwN2ZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuc2QiLAkweDQ4MDAwMDgyLCAweGI0MDAwNzdkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcDEuZGQiLAkweDQ4MDAwMTgyLCAweGI0MDAwNjdkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuc3MiLAkweDQ4MDAwMDAzLCAweGI0MDAwN2ZjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuc2QiLAkweDQ4MDAwMDgzLCAweGI0MDAwNzdjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtcHQuZGQiLAkweDQ4MDAwMTgzLCAweGI0MDAwNjdjLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwMS5zcyIsCTB4NDgwMDAwMDQsIDB4YjQwMDA3ZmIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnAxLnNkIiwJMHg0ODAwMDA4NCwgMHhiNDAwMDc3YiwgImUsZixnIiwgMCB9LAoteyAibWkycDEuZGQiLAkweDQ4MDAwMTg0LCAweGI0MDAwNjdiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJwdC5zcyIsCTB4NDgwMDAwMDUsIDB4YjQwMDA3ZmEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnB0LnNkIiwJMHg0ODAwMDA4NSwgMHhiNDAwMDc3YSwgImUsZixnIiwgMCB9LAoteyAibWkycHQuZGQiLAkweDQ4MDAwMTg1LCAweGI0MDAwNjdhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuc3MiLAkweDQ4MDAwMDA2LCAweGI0MDAwN2Y5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuc2QiLAkweDQ4MDAwMDg2LCAweGI0MDAwNzc5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcDEuZGQiLAkweDQ4MDAwMTg2LCAweGI0MDAwNjc5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuc3MiLAkweDQ4MDAwMDA3LCAweGI0MDAwN2Y4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuc2QiLAkweDQ4MDAwMDg3LCAweGI0MDAwNzc4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtcHQuZGQiLAkweDQ4MDAwMTg3LCAweGI0MDAwNjc4LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXAyLnNzIiwJMHg0ODAwMDAwOCwgMHhiNDAwMDdmNywgImUsZixnIiwgMCB9LAoteyAibXJtdDFwMi5zZCIsCTB4NDgwMDAwODgsIDB4YjQwMDA3NzcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxcDIuZGQiLAkweDQ4MDAwMTg4LCAweGI0MDAwNjc3LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXBtLnNzIiwJMHg0ODAwMDAwOSwgMHhiNDAwMDdmNiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1wbS5zZCIsCTB4NDgwMDAwODksIDB4YjQwMDA3NzYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtcG0uZGQiLAkweDQ4MDAwMTg5LCAweGI0MDAwNjc2LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuc3MiLAkweDQ4MDAwMDBhLCAweGI0MDAwN2Y1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuc2QiLAkweDQ4MDAwMDhhLCAweGI0MDAwNzc1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xcDIuZGQiLAkweDQ4MDAwMThhLCAweGI0MDAwNjc1LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRwbS5zcyIsMHg0ODAwMDAwYiwgMHhiNDAwMDdmNCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0cG0uc2QiLDB4NDgwMDAwOGIsIDB4YjQwMDA3NzQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHBtLmRkIiwweDQ4MDAwMThiLCAweGI0MDAwNjc0LCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXAyLnNzIiwJMHg0ODAwMDAwYywgMHhiNDAwMDdmMywgImUsZixnIiwgMCB9LAoteyAibWltdDFwMi5zZCIsCTB4NDgwMDAwOGMsIDB4YjQwMDA3NzMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxcDIuZGQiLAkweDQ4MDAwMThjLCAweGI0MDAwNjczLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHBtLnNzIiwJMHg0ODAwMDAwZCwgMHhiNDAwMDdmMiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRwbS5zZCIsCTB4NDgwMDAwOGQsIDB4YjQwMDA3NzIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0cG0uZGQiLAkweDQ4MDAwMThkLCAweGI0MDAwNjcyLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuc3MiLAkweDQ4MDAwMDBlLCAweGI0MDAwN2YxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuc2QiLAkweDQ4MDAwMDhlLCAweGI0MDAwNzcxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xcDIuZGQiLAkweDQ4MDAwMThlLCAweGI0MDAwNjcxLCAiZSxmLGciLCAwIH0sCi0KLS8qIEZsb2F0aW5nIFBvaW50IEVzY2FwZSBJbnN0cnVjdGlvbiBGb3JtYXQgLSBwZm1zbS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJtcjJzMS5zcyIsCTB4NDgwMDAwMTAsIDB4YjQwMDA3ZWYsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnMxLnNkIiwJMHg0ODAwMDA5MCwgMHhiNDAwMDc2ZiwgImUsZixnIiwgMCB9LAoteyAibXIyczEuZGQiLAkweDQ4MDAwMTkwLCAweGI0MDAwNjZmLCAiZSxmLGciLCAwIH0sCi17ICJtcjJzdC5zcyIsCTB4NDgwMDAwMTEsIDB4YjQwMDA3ZWUsICJlLGYsZyIsIDAgfSwKLXsgIm1yMnN0LnNkIiwJMHg0ODAwMDA5MSwgMHhiNDAwMDc2ZSwgImUsZixnIiwgMCB9LAoteyAibXIyc3QuZGQiLAkweDQ4MDAwMTkxLCAweGI0MDAwNjZlLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuc3MiLAkweDQ4MDAwMDEyLCAweGI0MDAwN2VkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuc2QiLAkweDQ4MDAwMDkyLCAweGI0MDAwNzZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtczEuZGQiLAkweDQ4MDAwMTkyLCAweGI0MDAwNjZkLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3Quc3MiLAkweDQ4MDAwMDEzLCAweGI0MDAwN2VjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3Quc2QiLAkweDQ4MDAwMDkzLCAweGI0MDAwNzZjLCAiZSxmLGciLCAwIH0sCi17ICJtcjJtc3QuZGQiLAkweDQ4MDAwMTkzLCAweGI0MDAwNjZjLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzMS5zcyIsCTB4NDgwMDAwMTQsIDB4YjQwMDA3ZWIsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnMxLnNkIiwJMHg0ODAwMDA5NCwgMHhiNDAwMDc2YiwgImUsZixnIiwgMCB9LAoteyAibWkyczEuZGQiLAkweDQ4MDAwMTk0LCAweGI0MDAwNjZiLCAiZSxmLGciLCAwIH0sCi17ICJtaTJzdC5zcyIsCTB4NDgwMDAwMTUsIDB4YjQwMDA3ZWEsICJlLGYsZyIsIDAgfSwKLXsgIm1pMnN0LnNkIiwJMHg0ODAwMDA5NSwgMHhiNDAwMDc2YSwgImUsZixnIiwgMCB9LAoteyAibWkyc3QuZGQiLAkweDQ4MDAwMTk1LCAweGI0MDAwNjZhLCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuc3MiLAkweDQ4MDAwMDE2LCAweGI0MDAwN2U5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuc2QiLAkweDQ4MDAwMDk2LCAweGI0MDAwNzY5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtczEuZGQiLAkweDQ4MDAwMTk2LCAweGI0MDAwNjY5LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3Quc3MiLAkweDQ4MDAwMDE3LCAweGI0MDAwN2U4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3Quc2QiLAkweDQ4MDAwMDk3LCAweGI0MDAwNzY4LCAiZSxmLGciLCAwIH0sCi17ICJtaTJtc3QuZGQiLAkweDQ4MDAwMTk3LCAweGI0MDAwNjY4LCAiZSxmLGciLCAwIH0sCi17ICJtcm10MXMyLnNzIiwJMHg0ODAwMDAxOCwgMHhiNDAwMDdlNywgImUsZixnIiwgMCB9LAoteyAibXJtdDFzMi5zZCIsCTB4NDgwMDAwOTgsIDB4YjQwMDA3NjcsICJlLGYsZyIsIDAgfSwKLXsgIm1ybXQxczIuZGQiLAkweDQ4MDAwMTk4LCAweGI0MDAwNjY3LCAiZSxmLGciLCAwIH0sCi17ICJtbTEybXNtLnNzIiwJMHg0ODAwMDAxOSwgMHhiNDAwMDdlNiwgImUsZixnIiwgMCB9LAoteyAibW0xMm1zbS5zZCIsCTB4NDgwMDAwOTksIDB4YjQwMDA3NjYsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJtc20uZGQiLAkweDQ4MDAwMTk5LCAweGI0MDAwNjY2LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuc3MiLAkweDQ4MDAwMDFhLCAweGI0MDAwN2U1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuc2QiLAkweDQ4MDAwMDlhLCAweGI0MDAwNzY1LCAiZSxmLGciLCAwIH0sCi17ICJtcm0xczIuZGQiLAkweDQ4MDAwMTlhLCAweGI0MDAwNjY1LCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHRzbS5zcyIsMHg0ODAwMDAxYiwgMHhiNDAwMDdlNCwgImUsZixnIiwgMCB9LAoteyAibW0xMnR0c20uc2QiLDB4NDgwMDAwOWIsIDB4YjQwMDA3NjQsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0dHNtLmRkIiwweDQ4MDAwMTliLCAweGI0MDAwNjY0LCAiZSxmLGciLCAwIH0sCi17ICJtaW10MXMyLnNzIiwJMHg0ODAwMDAxYywgMHhiNDAwMDdlMywgImUsZixnIiwgMCB9LAoteyAibWltdDFzMi5zZCIsCTB4NDgwMDAwOWMsIDB4YjQwMDA3NjMsICJlLGYsZyIsIDAgfSwKLXsgIm1pbXQxczIuZGQiLAkweDQ4MDAwMTljLCAweGI0MDAwNjYzLCAiZSxmLGciLCAwIH0sCi17ICJtbTEydHNtLnNzIiwJMHg0ODAwMDAxZCwgMHhiNDAwMDdlMiwgImUsZixnIiwgMCB9LAoteyAibW0xMnRzbS5zZCIsCTB4NDgwMDAwOWQsIDB4YjQwMDA3NjIsICJlLGYsZyIsIDAgfSwKLXsgIm1tMTJ0c20uZGQiLAkweDQ4MDAwMTlkLCAweGI0MDAwNjYyLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuc3MiLAkweDQ4MDAwMDFlLCAweGI0MDAwN2UxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuc2QiLAkweDQ4MDAwMDllLCAweGI0MDAwNzYxLCAiZSxmLGciLCAwIH0sCi17ICJtaW0xczIuZGQiLAkweDQ4MDAwMTllLCAweGI0MDAwNjYxLCAiZSxmLGciLCAwIH0sCi0KLQoteyAiZm11bC5zcyIsCTB4NDgwMDAwMjAsIDB4YjQwMDA3ZGYsICJlLGYsZyIsIDAgfSwJLyogZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmbXVsLnNkIiwJMHg0ODAwMDBhMCwgMHhiNDAwMDc1ZiwgImUsZixnIiwgMCB9LAkvKiBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZtdWwuZGQiLAkweDQ4MDAwMWEwLCAweGI0MDAwNjVmLCAiZSxmLGciLCAwIH0sCS8qIGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwuc3MiLAkweDQ4MDAwNDIwLCAweGI0MDAwM2RmLCAiZSxmLGciLCAwIH0sCS8qIHBmbXVsLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbXVsLnNkIiwJMHg0ODAwMDRhMCwgMHhiNDAwMDM1ZiwgImUsZixnIiwgMCB9LAkvKiBwZm11bC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZm11bC5kZCIsCTB4NDgwMDA1YTAsIDB4YjQwMDAyNWYsICJlLGYsZyIsIDAgfSwJLyogcGZtdWwucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZtdWwzLmRkIiwJMHg0ODAwMDVhNCwgMHhiNDAwMDI1YiwgImUsZixnIiwgMCB9LAkvKiBwZm11bDMucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZm1sb3cuZGQiLAkweDQ4MDAwMWExLCAweGI0MDAwNjVlLCAiZSxmLGciLCAwIH0sCS8qIGZtbG93LmRkIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLnNzIiwJMHg0ODAwMDAyMiwgMHhiNDAwMDdkZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLnNkIiwJMHg0ODAwMDBhMiwgMHhiNDAwMDc1ZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcmNwLmRkIiwJMHg0ODAwMDFhMiwgMHhiNDAwMDY1ZCwgImYsZyIsIDAgfSwJLyogZnJjcC5wIGZzcmMyLGZkZXN0ICovCi17ICJmcnNxci5zcyIsCTB4NDgwMDAwMjMsIDB4YjQwMDA3ZGMsICJmLGciLCAwIH0sCS8qIGZyc3FyLnAgZnNyYzIsZmRlc3QgKi8KLXsgImZyc3FyLnNkIiwJMHg0ODAwMDBhMywgMHhiNDAwMDc1YywgImYsZyIsIDAgfSwJLyogZnJzcXIucCBmc3JjMixmZGVzdCAqLwoteyAiZnJzcXIuZGQiLAkweDQ4MDAwMWEzLCAweGI0MDAwNjVjLCAiZixnIiwgMCB9LAkvKiBmcnNxci5wIGZzcmMyLGZkZXN0ICovCi17ICJmYWRkLnNzIiwJMHg0ODAwMDAzMCwgMHhiNDAwMDdjZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGQuc2QiLAkweDQ4MDAwMGIwLCAweGI0MDAwNzRmLCAiZSxmLGciLCAwIH0sCS8qIGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmFkZC5kZCIsCTB4NDgwMDAxYjAsIDB4YjQwMDA2NGYsICJlLGYsZyIsIDAgfSwJLyogZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmFkZC5zcyIsCTB4NDgwMDA0MzAsIDB4YjQwMDAzY2YsICJlLGYsZyIsIDAgfSwJLyogcGZhZGQucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGQuc2QiLAkweDQ4MDAwNGIwLCAweGI0MDAwMzRmLCAiZSxmLGciLCAwIH0sCS8qIHBmYWRkLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmYWRkLmRkIiwJMHg0ODAwMDViMCwgMHhiNDAwMDI0ZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmc3ViLnNzIiwJMHg0ODAwMDAzMSwgMHhiNDAwMDdjZSwgImUsZixnIiwgMCB9LAkvKiBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZzdWIuc2QiLAkweDQ4MDAwMGIxLCAweGI0MDAwNzRlLCAiZSxmLGciLCAwIH0sCS8qIGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnN1Yi5kZCIsCTB4NDgwMDAxYjEsIDB4YjQwMDA2NGUsICJlLGYsZyIsIDAgfSwJLyogZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZnN1Yi5zcyIsCTB4NDgwMDA0MzEsIDB4YjQwMDAzY2UsICJlLGYsZyIsIDAgfSwJLyogcGZzdWIucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZzdWIuc2QiLAkweDQ4MDAwNGIxLCAweGI0MDAwMzRlLCAiZSxmLGciLCAwIH0sCS8qIHBmc3ViLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmc3ViLmRkIiwJMHg0ODAwMDViMSwgMHhiNDAwMDI0ZSwgImUsZixnIiwgMCB9LAkvKiBwZnN1Yi5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaXguc3MiLAkweDQ4MDAwMDMyLCAweGI0MDAwN2NkLCAiZSxnIiwgMCB9LAkvKiBmaXgucCBmc3JjMSxmZGVzdCAqLwoteyAiZml4LnNkIiwJMHg0ODAwMDBiMiwgMHhiNDAwMDc0ZCwgImUsZyIsIDAgfSwJLyogZml4LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZpeC5kZCIsCTB4NDgwMDAxYjIsIDB4YjQwMDA2NGQsICJlLGciLCAwIH0sCS8qIGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LnNzIiwJMHg0ODAwMDQzMiwgMHhiNDAwMDNjZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LnNkIiwJMHg0ODAwMDRiMiwgMHhiNDAwMDM0ZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJwZml4LmRkIiwJMHg0ODAwMDViMiwgMHhiNDAwMDI0ZCwgImUsZyIsIDAgfSwJLyogcGZpeC5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5zcyIsCTB4NDgwMDAwMzMsIDB4YjQwMDA3Y2MsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgImZhbW92LmRzIiwJMHg0ODAwMDEzMywgMHhiNDAwMDZjYywgImUsZyIsIDAgfSwJLyogZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAiZmFtb3Yuc2QiLAkweDQ4MDAwMGIzLCAweGI0MDAwNzRjLCAiZSxnIiwgMCB9LAkvKiBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJmYW1vdi5kZCIsCTB4NDgwMDAxYjMsIDB4YjQwMDA2NGMsICJlLGciLCAwIH0sCS8qIGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5zcyIsCTB4NDgwMDA0MzMsIDB4YjQwMDAzY2MsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi17ICJwZmFtb3YuZHMiLAkweDQ4MDAwNTMzLCAweGI0MDAwMmNjLCAiZSxnIiwgMCB9LAkvKiBwZmFtb3YucCBmc3JjMSxmZGVzdCAqLwoteyAicGZhbW92LnNkIiwJMHg0ODAwMDRiMywgMHhiNDAwMDM0YywgImUsZyIsIDAgfSwJLyogcGZhbW92LnAgZnNyYzEsZmRlc3QgKi8KLXsgInBmYW1vdi5kZCIsCTB4NDgwMDA1YjMsIDB4YjQwMDAyNGMsICJlLGciLCAwIH0sCS8qIHBmYW1vdi5wIGZzcmMxLGZkZXN0ICovCi0vKiBwZmd0IGhhcyBSIGJpdCBjbGVhcmVkOyBwZmxlIGhhcyBSIGJpdCBzZXQgKi8KLXsgInBmZ3Quc3MiLAkweDQ4MDAwNDM0LCAweGI0MDAwM2NiLCAiZSxmLGciLCAwIH0sCS8qIHBmZ3QucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZndC5zZCIsCTB4NDgwMDA0MzQsIDB4YjQwMDAzY2IsICJlLGYsZyIsIDAgfSwJLyogcGZndC5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmd0LmRkIiwJMHg0ODAwMDUzNCwgMHhiNDAwMDJjYiwgImUsZixnIiwgMCB9LAkvKiBwZmd0LnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLS8qIHBmZ3QgaGFzIFIgYml0IGNsZWFyZWQ7IHBmbGUgaGFzIFIgYml0IHNldCAqLwoteyAicGZsZS5zcyIsCTB4NDgwMDA0YjQsIDB4YjQwMDAzNGIsICJlLGYsZyIsIDAgfSwJLyogcGZsZS5wIGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmxlLnNkIiwJMHg0ODAwMDRiNCwgMHhiNDAwMDM0YiwgImUsZixnIiwgMCB9LAkvKiBwZmxlLnAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmbGUuZGQiLAkweDQ4MDAwNWI0LCAweGI0MDAwMjRiLCAiZSxmLGciLCAwIH0sCS8qIHBmbGUucCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnRydW5jLnNzIiwJMHg0ODAwMDAzYSwgMHhiNDAwMDdjNSwgImUsZyIsIDAgfSwJLyogZnRydW5jLnAgZnNyYzEsZmRlc3QgKi8KLXsgImZ0cnVuYy5zZCIsCTB4NDgwMDAwYmEsIDB4YjQwMDA3NDUsICJlLGciLCAwIH0sCS8qIGZ0cnVuYy5wIGZzcmMxLGZkZXN0ICovCi17ICJmdHJ1bmMuZGQiLAkweDQ4MDAwMWJhLCAweGI0MDAwNjQ1LCAiZSxnIiwgMCB9LAkvKiBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5zcyIsCTB4NDgwMDA0M2EsIDB4YjQwMDAzYzUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5zZCIsCTB4NDgwMDA0YmEsIDB4YjQwMDAzNDUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAicGZ0cnVuYy5kZCIsCTB4NDgwMDA1YmEsIDB4YjQwMDAyNDUsICJlLGciLCAwIH0sCS8qIHBmdHJ1bmMucCBmc3JjMSxmZGVzdCAqLwoteyAiZnhmciIsCTB4NDgwMDAwNDAsIDB4YjQwMDA3YmYsICJlLGQiLCAwIH0sCS8qIGZ4ZnIgZnNyYzEsaWRlc3QgKi8KLXsgImZpYWRkLnNzIiwJMHg0ODAwMDA0OSwgMHhiNDAwMDdiNiwgImUsZixnIiwgMCB9LAkvKiBmaWFkZC53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmaWFkZC5kZCIsCTB4NDgwMDAxYzksIDB4YjQwMDA2MzYsICJlLGYsZyIsIDAgfSwJLyogZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpYWRkLnNzIiwJMHg0ODAwMDQ0OSwgMHhiNDAwMDNiNiwgImUsZixnIiwgMCB9LAkvKiBwZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZpYWRkLmRkIiwJMHg0ODAwMDVjOSwgMHhiNDAwMDIzNiwgImUsZixnIiwgMCB9LAkvKiBwZmlhZGQudyBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZmlzdWIuc3MiLAkweDQ4MDAwMDRkLCAweGI0MDAwN2IyLCAiZSxmLGciLCAwIH0sCS8qIGZpc3ViLncgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZpc3ViLmRkIiwJMHg0ODAwMDFjZCwgMHhiNDAwMDYzMiwgImUsZixnIiwgMCB9LAkvKiBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlzdWIuc3MiLAkweDQ4MDAwNDRkLCAweGI0MDAwM2IyLCAiZSxmLGciLCAwIH0sCS8qIHBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJwZmlzdWIuZGQiLAkweDQ4MDAwNWNkLCAweGI0MDAwMjMyLCAiZSxmLGciLCAwIH0sCS8qIHBmaXN1Yi53IGZzcmMxLGZzcmMyLGZkZXN0ICovCi17ICJmemNoa2wiLAkweDQ4MDAwMDU3LCAweGI0MDAwN2E4LCAiZSxmLGciLCAwIH0sCS8qIGZ6Y2hrbCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZ6Y2hrbCIsCTB4NDgwMDA0NTcsIDB4YjQwMDAzYTgsICJlLGYsZyIsIDAgfSwJLyogcGZ6Y2hrbCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAiZnpjaGtzIiwJMHg0ODAwMDA1ZiwgMHhiNDAwMDdhMCwgImUsZixnIiwgMCB9LAkvKiBmemNoa3MgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgInBmemNoa3MiLAkweDQ4MDAwNDVmLCAweGI0MDAwM2EwLCAiZSxmLGciLCAwIH0sCS8qIHBmemNoa3MgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGRwIiwJMHg0ODAwMDA1MCwgMHhiNDAwMDdhZiwgImUsZixnIiwgMCB9LAkvKiBmYWRkcCBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGRwIiwJMHg0ODAwMDQ1MCwgMHhiNDAwMDNhZiwgImUsZixnIiwgMCB9LAkvKiBwZmFkZHAgZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZhZGR6IiwJMHg0ODAwMDA1MSwgMHhiNDAwMDdhZSwgImUsZixnIiwgMCB9LAkvKiBmYWRkeiBmc3JjMSxmc3JjMixmZGVzdCAqLwoteyAicGZhZGR6IiwJMHg0ODAwMDQ1MSwgMHhiNDAwMDNhZSwgImUsZixnIiwgMCB9LAkvKiBwZmFkZHogZnNyYzEsZnNyYzIsZmRlc3QgKi8KLXsgImZvcm0iLAkweDQ4MDAwMDVhLCAweGI0MDAwN2E1LCAiZSxnIiwgMCB9LAkvKiBmb3JtIGZzcmMxLGZkZXN0ICovCi17ICJwZm9ybSIsCTB4NDgwMDA0NWEsIDB4YjQwMDAzYTUsICJlLGciLCAwIH0sCS8qIHBmb3JtIGZzcmMxLGZkZXN0ICovCi0KLS8qIEZsb2F0aW5nIHBvaW50IHBzZXVkby1pbnN0cnVjdGlvbnMgKi8KLXsgImZtb3Yuc3MiLAkweDQ4MDAwMDQ5LCAweGI3ZTAwN2I2LCAiZSxnIiwgMCB9LAkvKiBmaWFkZC5zcyBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5kZCIsCTB4NDgwMDAxYzksIDB4YjdlMDA2MzYsICJlLGciLCAwIH0sCS8qIGZpYWRkLmRkIGZzcmMxLGYwLGZkZXN0ICovCi17ICJmbW92LnNkIiwJMHg0ODAwMDBiMCwgMHhiN2UwMDc0ZiwgImUsZyIsIDAgfSwJLyogZmFkZC5zZCBmc3JjMSxmMCxmZGVzdCAqLwoteyAiZm1vdi5kcyIsCTB4NDgwMDAxMzAsIDB4YjdlMDA2Y2YsICJlLGciLCAwIH0sCS8qIGZhZGQuZHMgZnNyYzEsZjAsZmRlc3QgKi8KLXsgInBmbW92LmRzIiwJMHg0ODAwMDUzMCwgMHhiNzMwMDJjZiwgImUsZyIsIDAgfSwJLyogcGZhZGQuZHMgZnNyYzEsZjAsZmRlc3QgKi8KLXsgInBmbW92LmRkIiwJMHg0ODAwMDVjOSwgMHhiN2UwMDIzNiwgImUsZyIsIDAgfSwJLyogcGZpYWRkLmRkIGZzcmMxLGYwLGZkZXN0ICovCi0KLQotfTsKLQotI2RlZmluZSBOVU1PUENPREVTICgoc2l6ZW9mIGk4NjBfb3Bjb2RlcykvKHNpemVvZiBpODYwX29wY29kZXNbMF0pKQotCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaCBiL2luY2x1ZGUvb3Bjb2RlL2k5NjAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUyZmMzMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9pOTYwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyogQmFzaWMgODA5NjAgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4KLSAqCi0gKiBUaGUgJ0NPSicgaW5zdHJ1Y3Rpb25zIGFyZSBhY3R1YWxseSBDT0JSIGluc3RydWN0aW9ucyB3aXRoIHRoZSAnYicgaW4KLSAqIHRoZSBtbmVtb25pYyByZXBsYWNlZCBieSBhICdqJzsgIHRoZXkgYXJlIEFMV0FZUyAiZGUtb3B0aW1pemVkIiBpZiBuZWNlc3Nhcnk6Ci0gKiBpZiB0aGUgZGlzcGxhY2VtZW50IHdpbGwgbm90IGZpdCBpbiAxMyBiaXRzLCB0aGUgYXNzZW1ibGVyIHdpbGwgcmVwbGFjZSB0aGVtCi0gKiB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBhcmUgYW5kIGJyYW5jaCBpbnN0cnVjdGlvbnMuCi0gKgotICogQWxsIG9mIHRoZSAnTUVNbicgaW5zdHJ1Y3Rpb25zIGFyZSB0aGUgc2FtZSBmb3JtYXQ7IHRoZSAnbicgaW4gdGhlIG5hbWUKLSAqIGluZGljYXRlcyB0aGUgZGVmYXVsdCBpbmRleCBzY2FsZSBmYWN0b3IgKHRoZSBzaXplIG9mIHRoZSBkYXR1bSBvcGVyYXRlZCBvbikuCi0gKgotICogVGhlIEZCUkEgZm9ybWF0cyBhcmUgbm90IGFjdHVhbGx5IGFuIGluc3RydWN0aW9uIGZvcm1hdC4gIFRoZXkgYXJlIHRoZQotICogImNvbnZlbmllbmNlIGRpcmVjdGl2ZXMiIGZvciBicmFuY2hpbmcgb24gZmxvYXRpbmctcG9pbnQgY29tcGFyaXNvbnMsCi0gKiBlYWNoIG9mIHdoaWNoIGdlbmVyYXRlcyAyIGluc3RydWN0aW9ucyAoYSAnYm5vJyBhbmQgb25lIG90aGVyIGJyYW5jaCkuCi0gKgotICogVGhlIENBTExKIGZvcm1hdCBpcyBub3QgYWN0dWFsbHkgYW4gaW5zdHJ1Y3Rpb24gZm9ybWF0LiAgSXQgaW5kaWNhdGVzIHRoYXQKLSAqIHRoZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgKGEgQ1RSTC1mb3JtYXQgJ2NhbGwnKSBzaG91bGQgaGF2ZSBpdHMgcmVsb2NhdGlvbgotICogc3BlY2lhbGx5IGZsYWdnZWQgZm9yIGxpbmstdGltZSByZXBsYWNlbWVudCB3aXRoIGEgJ2JhbCcgb3IgJ2NhbGxzJyBpZgotICogYXBwcm9wcmlhdGUuCi0gKi8gCi0KLSNkZWZpbmUgQ1RSTAkwCi0jZGVmaW5lIENPQlIJMQotI2RlZmluZSBDT0oJMgotI2RlZmluZSBSRUcJMwotI2RlZmluZSBNRU0xCTQKLSNkZWZpbmUgTUVNMgk1Ci0jZGVmaW5lIE1FTTQJNgotI2RlZmluZSBNRU04CTcKLSNkZWZpbmUgTUVNMTIJOAotI2RlZmluZSBNRU0xNgk5Ci0jZGVmaW5lIEZCUkEJMTAKLSNkZWZpbmUgQ0FMTEoJMTEKLQotLyogTWFza3MgZm9yIHRoZSBtb2RlIGJpdHMgaW4gUkVHIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTTEJCTB4MDgwMAotI2RlZmluZSBNMgkJMHgxMDAwCi0jZGVmaW5lIE0zCQkweDIwMDAKLQotLyogR2VuZXJhdGUgdGhlIDEyLWJpdCBvcGNvZGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbiBieSBwbGFjaW5nIHRoZSAKLSAqIGhpZ2ggOCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMgMjQtMzEsIHRoZSBsb3cgNCBiaXRzIGluIGluc3RydWN0aW9uIGJpdHMKLSAqIDctMTAuCi0gKi8KLQotI2RlZmluZSBSRUdfT1BDKG9wYykJKChvcGMgJiAweGZmMCkgPDwgMjApIHwgKChvcGMgJiAweGYpIDw8IDcpCi0KLS8qIEdlbmVyYXRlIGEgdGVtcGxhdGUgZm9yIGEgUkVHIGZvcm1hdCBpbnN0cnVjdGlvbjogIHBsYWNlIHRoZSBvcGNvZGUgYml0cwotICogaW4gdGhlIGFwcHJvcHJpYXRlIGZpZWxkcyBhbmQgT1IgaW4gbW9kZSBiaXRzIGZvciB0aGUgb3BlcmFuZHMgdGhhdCB3aWxsIG5vdAotICogYmUgdXNlZC4gIEkuZS4sCi0gKgkJc2V0IG0xPTEsIGlmIHNyYzEgd2lsbCBub3QgYmUgdXNlZAotICoJCXNldCBtMj0xLCBpZiBzcmMyIHdpbGwgbm90IGJlIHVzZWQKLSAqCQlzZXQgbTM9MSwgaWYgZHN0ICB3aWxsIG5vdCBiZSB1c2VkCi0gKgotICogU2V0dGluZyB0aGUgInVudXNlZCIgbW9kZSBiaXRzIHRvIDEgc3BlZWRzIHVwIGluc3RydWN0aW9uIGV4ZWN1dGlvbighKS4KLSAqIFRoZSBpbmZvcm1hdGlvbiBpcyBhbHNvIHVzZWZ1bCB0byB1cyBiZWNhdXNlIHNvbWUgMS1vcGVyYW5kIFJFRyBpbnN0cnVjdGlvbnMKLSAqIHVzZSB0aGUgc3JjMSBmaWVsZCwgb3RoZXJzIHRoZSBkc3QgZmllbGQ7IGFuZCBzb21lIDItb3BlcmFuZCBSRUcgaW5zdHJ1Y3Rpb25zCi0gKiB1c2Ugc3JjMS9zcmMyLCBvdGhlcnMgc3JjMS9kc3QuICBUaGUgc2V0IG1vZGUgYml0cyBlbmFibGUgdXMgdG8gZGlzdGluZ3Vpc2guCi0gKi8KLSNkZWZpbmUgUl8wKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMSB8IE0yIHwgTTMgKQkvKiBObyBvcGVyYW5kcyAgICAgICovCi0jZGVmaW5lIFJfMShvcGMpCSggUkVHX09QQyhvcGMpIHwgTTIgfCBNMyApCS8qIDEgb3BlcmFuZDogc3JjMSAgKi8KLSNkZWZpbmUgUl8xRChvcGMpCSggUkVHX09QQyhvcGMpIHwgTTEgfCBNMiApCS8qIDEgb3BlcmFuZDogZHN0ICAgKi8KLSNkZWZpbmUgUl8yKG9wYykJKCBSRUdfT1BDKG9wYykgfCBNMyApCQkvKiAyIG9wczogc3JjMS9zcmMyICovCi0jZGVmaW5lIFJfMkQob3BjKQkoIFJFR19PUEMob3BjKSB8IE0yICkJCS8qIDIgb3BzOiBzcmMxL2RzdCAgKi8KLSNkZWZpbmUgUl8zKG9wYykJKCBSRUdfT1BDKG9wYykgKQkJLyogMyBvcGVyYW5kcyAgICAgICAqLwotCi0vKiBERVNDUklQVE9SIEJZVEVTIEZPUiBSRUdJU1RFUiBPUEVSQU5EUwotICoKLSAqIEludGVycHJldCBuYW1lcyBhcyBmb2xsb3dzOgotICoJUjogICBnbG9iYWwgb3IgbG9jYWwgcmVnaXN0ZXIgb25seQotICoJUlM6ICBnbG9iYWwsIGxvY2FsLCBvciAoaWYgdGFyZ2V0IGFsbG93cykgc3BlY2lhbC1mdW5jdGlvbiByZWdpc3RlciBvbmx5Ci0gKglSTDogIGdsb2JhbCBvciBsb2NhbCByZWdpc3Rlciwgb3IgaW50ZWdlciBsaXRlcmFsCi0gKglSU0w6IGdsb2JhbCwgbG9jYWwsIG9yIChpZiB0YXJnZXQgYWxsb3dzKSBzcGVjaWFsLWZ1bmN0aW9uIHJlZ2lzdGVyOwotICoJCW9yIGludGVnZXIgbGl0ZXJhbAotICoJRjogICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3RlcgotICoJRkw6ICBnbG9iYWwsIGxvY2FsLCBvciBmbG9hdGluZy1wb2ludCByZWdpc3Rlcjsgb3IgbGl0ZXJhbCAoaW5jbHVkaW5nCi0gKgkJZmxvYXRpbmcgcG9pbnQpCi0gKgotICogQSBudW1iZXIgYXBwZW5kZWQgdG8gYSBuYW1lIGluZGljYXRlcyB0aGF0IHJlZ2lzdGVycyBtdXN0IGJlIGFsaWduZWQsCi0gKiBhcyBmb2xsb3dzOgotICoJMjogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgMgotICoJNDogcmVnaXN0ZXIgbnVtYmVyIG11c3QgYmUgbXVsdGlwbGUgb2YgNAotICovCi0KLSNkZWZpbmUgU0ZSCTB4MTAJCS8qIE1hc2sgZm9yIHRoZSAic2ZyLU9LIiBiaXQgKi8KLSNkZWZpbmUgTElUCTB4MDgJCS8qIE1hc2sgZm9yIHRoZSAibGl0ZXJhbC1PSyIgYml0ICovCi0jZGVmaW5lIEZQCTB4MDQJCS8qIE1hc2sgZm9yICJmbG9hdGluZy1wb2ludC1PSyIgYml0ICovCi0KLS8qIFRoaXMgbWFjcm8gb3JzIHRoZSBiaXRzIHRvZ2V0aGVyLiAgTm90ZSB0aGF0ICdhbGlnbicgaXMgYSBtYXNrCi0gKiBmb3IgdGhlIGxvdyAwLCAxLCBvciAyIGJpdHMgb2YgdGhlIHJlZ2lzdGVyIG51bWJlciwgYXMgYXBwcm9wcmlhdGUuCi0gKi8KLSNkZWZpbmUgT1AoYWxpZ24sbGl0LGZwLHNmcikJKCBhbGlnbiB8IGxpdCB8IGZwIHwgc2ZyICkKLQotI2RlZmluZSBSCU9QKCAwLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSUwlPUCggMCwgMCwgICAwLCAgU0ZSICkKLSNkZWZpbmUgUkwJT1AoIDAsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIFJTTAlPUCggMCwgTElULCAwLCAgU0ZSICkKLSNkZWZpbmUgRglPUCggMCwgMCwgICBGUCwgMCAgICkKLSNkZWZpbmUgRkwJT1AoIDAsIExJVCwgRlAsIDAgICApCi0jZGVmaW5lIFIyCU9QKCAxLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSTDIJT1AoIDEsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIEYyCU9QKCAxLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTDIJT1AoIDEsIExJVCwgRlAsIDAgICApCi0jZGVmaW5lIFI0CU9QKCAzLCAwLCAgIDAsICAwICAgKQotI2RlZmluZSBSTDQJT1AoIDMsIExJVCwgMCwgIDAgICApCi0jZGVmaW5lIEY0CU9QKCAzLCAwLCAgIEZQLCAwICAgKQotI2RlZmluZSBGTDQJT1AoIDMsIExJVCwgRlAsIDAgICApCi0KLSNkZWZpbmUgTQkweDdmCS8qIE1lbW9yeSBvcGVyYW5kIChNRU1BICYgTUVNQiBmb3JtYXQgaW5zdHJ1Y3Rpb25zKSAqLwotCi0vKiBNYWNyb3MgdG8gZXh0cmFjdCBpbmZvIGZyb20gdGhlIHJlZ2lzdGVyIG9wZXJhbmQgZGVzY3JpcHRvciBieXRlICdvZCcuCi0gKi8KLSNkZWZpbmUgU0ZSX09LKG9kKQkob2QgJiBTRlIpCS8qIFRSVUUgaWYgc2ZyIG9wZXJhbmQgYWxsb3dlZCAqLwotI2RlZmluZSBMSVRfT0sob2QpCShvZCAmIExJVCkJLyogVFJVRSBpZiBsaXRlcmFsIG9wZXJhbmQgYWxsb3dlZCAqLwotI2RlZmluZSBGUF9PSyhvZCkJKG9kICYgRlApCS8qIFRSVUUgaWYgZmxvYXRpbmctcG9pbnQgb3AgYWxsb3dlZCAqLwotI2RlZmluZSBSRUdfQUxJR04ob2QsbikJKChvZCAmIDB4MyAmIG4pID09IDApCi0JCQkJCS8qIFRSVUUgaWYgcmVnICNuIGlzIHByb3Blcmx5IGFsaWduZWQgKi8KLSNkZWZpbmUgTUVNT1Aob2QpCShvZCA9PSBNKQkvKiBUUlVFIGlmIG9wZXJhbmQgaXMgYSBtZW1vcnkgb3BlcmFuZCovCi0KLS8qIERlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIGk4MDk2MCBpbnN0cnVjdGlvbiAqLwotc3RydWN0IGk5NjBfb3Bjb2RlIHsKLQlsb25nIG9wY29kZTsJLyogMzIgYml0cywgY29uc3RhbnQgZmllbGRzIGZpbGxlZCBpbiwgcmVzdCB6ZXJvZWQgKi8KLQljaGFyICpuYW1lOwkvKiBBc3NlbWJsZXIgbW5lbW9uaWMJCQkJICAgKi8KLQlzaG9ydCBpY2xhc3M7CS8qIENsYXNzOiBzZWUgI2RlZmluZXMgYmVsb3cJCQkgICAqLwotCWNoYXIgZm9ybWF0OwkvKiBSRUcsIENPQlIsIENUUkwsIE1FTW4sIENPSiwgRkJSQSwgb3IgQ0FMTEoJICAgKi8KLQljaGFyIG51bV9vcHM7CS8qIE51bWJlciBvZiBvcGVyYW5kcwkJCQkgICAqLwotCWNoYXIgb3BlcmFuZFszXTsvKiBPcGVyYW5kIGRlc2NyaXB0b3JzOyBzYW1lIG9yZGVyIGFzIGFzc2VtYmxlciBpbnN0ciAqLwotfTsKLQotLyogQ2xhc3NlcyBvZiA5NjAgaW50cnVjdGlvbnM6Ci0gKgktIGVhY2ggaW5zdHJ1Y3Rpb24gZmFsbHMgaW50byBvbmUgY2xhc3MuCi0gKgktIGVhY2ggdGFyZ2V0IGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBvbmUgb3IgbW9yZSBjbGFzc2VzLgotICoKLSAqIEVBQ0ggQ09OU1RBTlQgTVVTVCBDT05UQUlOIDEgQU5EIE9OTFkgMSBTRVQgQklUITogIHNlZSB0YXJnX2hhc19pY2xhc3MoKS4KLSAqLwotI2RlZmluZSBJX0JBU0UJMHgwMQkvKiA4MDk2MCBiYXNlIGluc3RydWN0aW9uIHNldAkqLwotI2RlZmluZSBJX0NYCTB4MDIJLyogODA5NjBDeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9ERUMJMHgwNAkvKiBEZWNpbWFsIGluc3RydWN0aW9uCQkqLwotI2RlZmluZSBJX0ZQCTB4MDgJLyogRmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgSV9LWAkweDEwCS8qIDgwOTYwS3ggaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfTUlMCTB4MjAJLyogTWlsaXRhcnkgaW5zdHJ1Y3Rpb24JCSovCi0jZGVmaW5lIElfQ0FTSU0JMHg0MAkvKiBDQSBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24JKi8KLSNkZWZpbmUgSV9DWDIJMHg4MAkvKiBDeC9KeC9IeCBpbnN0cnVjdGlvbnMJKi8KLSNkZWZpbmUgSV9KWAkweDEwMAkvKiBKeC9IeCBpbnN0cnVjdGlvbgkJKi8KLSNkZWZpbmUgSV9IWAkweDIwMAkvKiBIeCBpbnN0cnVjdGlvbnMJCSovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKgkJVEFCTEUgT0YgaTk2MCBJTlNUUlVDVElPTiBERVNDUklQVElPTlMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBzdHJ1Y3QgaTk2MF9vcGNvZGUgaTk2MF9vcGNvZGVzW10gPSB7Ci0KLQkvKiBpZiBhIENUUkwgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wZXJhbmQsIGl0J3MgYWx3YXlzIGEgZGlzcGxhY2VtZW50ICovCi0KLQkvKiBjYWxsaiBkZWZhdWx0PT0nY2FsbCcgKi8KLQl7IDB4MDkwMDAwMDAsCSJjYWxsaiIsCUlfQkFTRSwJQ0FMTEosIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgwODAwMDAwMCwJImIiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MDkwMDAwMDAsCSJjYWxsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDBhMDAwMDAwLAkicmV0IiwJCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDBiMDAwMDAwLAkiYmFsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEwMDAwMDAwLAkiYm5vIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYmYgc2FtZSBhcyBibm8gKi8KLQl7IDB4MTAwMDAwMDAsCSJiZiIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJydSBzYW1lIGFzIGJubyAqLwotCXsgMHgxMDAwMDAwMCwJImJydSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxMTAwMDAwMCwJImJnIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJnIHNhbWUgYXMgYmcgKi8KLQl7IDB4MTEwMDAwMDAsCSJicmciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTIwMDAwMDAsCSJiZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJyZSBzYW1lIGFzIGJlICovCi0JeyAweDEyMDAwMDAwLAkiYnJlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDEzMDAwMDAwLAkiYmdlIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJnZSBzYW1lIGFzIGJnZSAqLwotCXsgMHgxMzAwMDAwMCwJImJyZ2UiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTQwMDAwMDAsCSJibCIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCS8qIGJybCBzYW1lIGFzIGJsICovCi0JeyAweDE0MDAwMDAwLAkiYnJsIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDE1MDAwMDAwLAkiYm5lIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJsZyBzYW1lIGFzIGJuZSAqLwotCXsgMHgxNTAwMDAwMCwJImJybGciLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTYwMDAwMDAsCSJibGUiLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQkvKiBicmxlIHNhbWUgYXMgYmxlICovCi0JeyAweDE2MDAwMDAwLAkiYnJsZSIsCQlJX0JBU0UsCUNUUkwsIAkxLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxNzAwMDAwMCwJImJvIiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnQgc2FtZSBhcyBibyAqLwotCXsgMHgxNzAwMDAwMCwJImJ0IiwJCUlfQkFTRSwJQ1RSTCwgCTEsIHsgMCwgMCwgMCB9IH0sCi0JLyogYnJvIHNhbWUgYXMgYm8gKi8KLQl7IDB4MTcwMDAwMDAsCSJicm8iLAkJSV9CQVNFLAlDVFJMLCAJMSwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTgwMDAwMDAsCSJmYXVsdG5vIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQkvKiBmYXVsdGYgc2FtZSBhcyBmYXVsdG5vICovCi0JeyAweDE4MDAwMDAwLAkiZmF1bHRmIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MTkwMDAwMDAsCSJmYXVsdGciLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCXsgMHgxYTAwMDAwMCwJImZhdWx0ZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFiMDAwMDAwLAkiZmF1bHRnZSIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0JeyAweDFjMDAwMDAwLAkiZmF1bHRsIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWQwMDAwMDAsCSJmYXVsdG5lIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWUwMDAwMDAsCSJmYXVsdGxlIiwJSV9CQVNFLAlDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQl7IDB4MWYwMDAwMDAsCSJmYXVsdG8iLAlJX0JBU0UsCUNUUkwsIAkwLCB7IDAsIDAsIDAgfSB9LAotCS8qIGZhdWx0dCBzeW4gZm9yIGZhdWx0byAqLwotCXsgMHgxZjAwMDAwMCwJImZhdWx0dCIsCUlfQkFTRSwJQ1RSTCwgCTAsIHsgMCwgMCwgMCB9IH0sCi0KLQl7IDB4MDEwMDAwMDAsCSJzeXNjYWxsIiwJSV9DQVNJTSxDVFJMLCAJMCwgeyAwLCAwLCAwIH0gfSwKLQotCS8qIElmIGEgQ09CUiAob3IgQ09KKSBoYXMgMyBvcGVyYW5kcywgdGhlIGxhc3Qgb25lIGlzIGFsd2F5cyBhCi0JICogZGlzcGxhY2VtZW50IGFuZCBkb2VzIG5vdCBhcHBlYXIgZXhwbGljaXRseSBpbiB0aGUgdGFibGUuCi0JICovCi0KLQl7IDB4MjAwMDAwMDAsCSJ0ZXN0bm8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIxMDAwMDAwLAkidGVzdGciLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIyMDAwMDAwLAkidGVzdGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDIzMDAwMDAwLAkidGVzdGdlIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNDAwMDAwMCwJInRlc3RsIiwJSV9CQVNFLAlDT0JSLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgMHgyNTAwMDAwMCwJInRlc3RuZSIsCUlfQkFTRSwJQ09CUiwJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IDB4MjYwMDAwMDAsCSJ0ZXN0bGUiLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDI3MDAwMDAwLAkidGVzdG8iLAlJX0JBU0UsCUNPQlIsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyAweDMwMDAwMDAwLAkiYmJjIiwJCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMTAwMDAwMCwJImNtcG9iZyIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMjAwMDAwMCwJImNtcG9iZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMzAwMDAwMCwJImNtcG9iZ2UiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzQwMDAwMDAsCSJjbXBvYmwiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzUwMDAwMDAsCSJjbXBvYm5lIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM2MDAwMDAwLAkiY21wb2JsZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNzAwMDAwMCwJImJicyIsCQlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzgwMDAwMDAsCSJjbXBpYm5vIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM5MDAwMDAwLAkiY21waWJnIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNhMDAwMDAwLAkiY21waWJlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNiMDAwMDAwLAkiY21waWJnZSIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYzAwMDAwMCwJImNtcGlibCIsCUlfQkFTRSwJQ09CUiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzZDAwMDAwMCwJImNtcGlibmUiLAlJX0JBU0UsCUNPQlIsCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2UwMDAwMDAsCSJjbXBpYmxlIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNmMDAwMDAwLAkiY21waWJvIiwJSV9CQVNFLAlDT0JSLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDMxMDAwMDAwLAkiY21wb2pnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4MzIwMDAwMDAsCSJjbXBvamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzMzAwMDAwMCwJImNtcG9qZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzNDAwMDAwMCwJImNtcG9qbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM1MDAwMDAwLAkiY21wb2puZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM2MDAwMDAwLAkiY21wb2psZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM4MDAwMDAwLAkiY21waWpubyIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDM5MDAwMDAwLAkiY21waWpnIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQl7IDB4M2EwMDAwMDAsCSJjbXBpamUiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYjAwMDAwMCwJImNtcGlqZ2UiLAlJX0JBU0UsCUNPSiwJMywgeyBSTCwgUlMsIDAgfSB9LAotCXsgMHgzYzAwMDAwMCwJImNtcGlqbCIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNkMDAwMDAwLAkiY21waWpuZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNlMDAwMDAwLAkiY21waWpsZSIsCUlfQkFTRSwJQ09KLAkzLCB7IFJMLCBSUywgMCB9IH0sCi0JeyAweDNmMDAwMDAwLAkiY21waWpvIiwJSV9CQVNFLAlDT0osCTMsIHsgUkwsIFJTLCAwIH0gfSwKLQotCXsgMHg4MDAwMDAwMCwJImxkb2IiLAkJSV9CQVNFLAlNRU0xLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweDgyMDAwMDAwLAkic3RvYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4ODQwMDAwMDAsCSJieCIsCQlJX0JBU0UsCU1FTTEsCTEsIHsgTSwgIDAsICAwIH0gfSwKLQl7IDB4ODUwMDAwMDAsCSJiYWx4IiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBNLCAgUiwgIDAgfSB9LAotCXsgMHg4NjAwMDAwMCwJImNhbGx4IiwJSV9CQVNFLAlNRU0xLAkxLCB7IE0sICAwLCAgMCB9IH0sCi0JeyAweDg4MDAwMDAwLAkibGRvcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OGEwMDAwMDAsCSJzdG9zIiwJCUlfQkFTRSwJTUVNMiwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHg4YzAwMDAwMCwJImxkYSIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OTAwMDAwMDAsCSJsZCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4OTIwMDAwMDAsCSJzdCIsCQlJX0JBU0UsCU1FTTQsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQl7IDB4OTgwMDAwMDAsCSJsZGwiLAkJSV9CQVNFLAlNRU04LAkyLCB7IE0sICBSMiwgMCB9IH0sCi0JeyAweDlhMDAwMDAwLAkic3RsIiwJCUlfQkFTRSwJTUVNOCwJMiwgeyBSMiwgTSwgIDAgfSB9LAotCXsgMHhhMDAwMDAwMCwJImxkdCIsCQlJX0JBU0UsCU1FTTEyLAkyLCB7IE0sICBSNCwgMCB9IH0sCi0JeyAweGEyMDAwMDAwLAkic3R0IiwJCUlfQkFTRSwJTUVNMTIsCTIsIHsgUjQsIE0sICAwIH0gfSwKLQl7IDB4YjAwMDAwMDAsCSJsZHEiLAkJSV9CQVNFLAlNRU0xNiwJMiwgeyBNLCAgUjQsIDAgfSB9LAotCXsgMHhiMjAwMDAwMCwJInN0cSIsCQlJX0JBU0UsCU1FTTE2LAkyLCB7IFI0LCBNLCAgMCB9IH0sCi0JeyAweGMwMDAwMDAwLAkibGRpYiIsCQlJX0JBU0UsCU1FTTEsCTIsIHsgTSwgIFIsICAwIH0gfSwKLQl7IDB4YzIwMDAwMDAsCSJzdGliIiwJCUlfQkFTRSwJTUVNMSwJMiwgeyBSLCAgTSwgIDAgfSB9LAotCXsgMHhjODAwMDAwMCwJImxkaXMiLAkJSV9CQVNFLAlNRU0yLAkyLCB7IE0sICBSLCAgMCB9IH0sCi0JeyAweGNhMDAwMDAwLAkic3RpcyIsCQlJX0JBU0UsCU1FTTIsCTIsIHsgUiwgIE0sICAwIH0gfSwKLQotCXsgUl8zKDB4NTgwKSwJIm5vdGJpdCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTgxKSwJImFuZCIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MiksCSJhbmRub3QiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4MyksCSJzZXRiaXQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NCksCSJub3RhbmQiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4NiksCSJ4b3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODcpLAkib3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1ODgpLAkibm9yIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTg5KSwJInhub3IiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NThhKSwJIm5vdCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8zKDB4NThiKSwJIm9ybm90IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGMpLAkiY2xyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OGQpLAkibm90b3IiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU4ZSksCSJuYW5kIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NThmKSwJImFsdGVyYml0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTApLAkiYWRkbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5MSksCSJhZGRpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTkyKSwJInN1Ym8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OTMpLAkic3ViaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5OCksCSJzaHJvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTlhKSwJInNocmRpIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1OWIpLAkic2hyaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDU5YyksCSJzaGxvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTlkKSwJInJvdGF0ZSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NTllKSwJInNobGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzIoMHg1YTApLAkiY21wbyIsCQlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMSksCSJjbXBpIiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NWEyKSwJImNvbmNtcG8iLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlNMLCAwIH0gfSwKLQl7IFJfMigweDVhMyksCSJjb25jbXBpIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzMoMHg1YTQpLAkiY21waW5jbyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NWE1KSwJImNtcGluY2kiLAlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDVhNiksCSJjbXBkZWNvIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg1YTcpLAkiY21wZGVjaSIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yKDB4NWFjKSwJInNjYW5ieXRlIiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzIoMHg1YWUpLAkiY2hrYml0IiwJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTTCwgMCB9IH0sCi0JeyBSXzMoMHg1YjApLAkiYWRkYyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDViMiksCSJzdWJjIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8yRCgweDVjYyksCSJtb3YiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUlNMLFJTLCAwIH0gfSwKLQl7IFJfMkQoMHg1ZGMpLAkibW92bCIsCQlJX0JBU0UsCVJFRywJMiwgeyBSTDIsUjIsIDAgfSB9LAotCXsgUl8yRCgweDVlYyksCSJtb3Z0IiwJCUlfQkFTRSwJUkVHLAkyLCB7IFJMNCxSNCwgMCB9IH0sCi0JeyBSXzJEKDB4NWZjKSwJIm1vdnEiLAkJSV9CQVNFLAlSRUcsCTIsIHsgUkw0LFI0LCAwIH0gfSwKLQl7IFJfMygweDYxMCksCSJhdG1vZCIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTLCBSU0wsUiB9IH0sCi0JeyBSXzMoMHg2MTIpLAkiYXRhZGQiLAlJX0JBU0UsCVJFRywJMywgeyBSUywgUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NDApLAkic3BhbmJpdCIsCUlfQkFTRSwJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0JeyBSXzJEKDB4NjQxKSwJInNjYW5iaXQiLAlJX0JBU0UsCVJFRywJMiwgeyBSU0wsUlMsIDAgfSB9LAotCXsgUl8zKDB4NjQ1KSwJIm1vZGFjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2NTApLAkibW9kaWZ5IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMygweDY1MSksCSJleHRyYWN0IiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMygweDY1NCksCSJtb2R0YyIsCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjU1KSwJIm1vZHBjIiwJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSIH0gfSwKLQl7IFJfMSgweDY2MCksCSJjYWxscyIsCUlfQkFTRSwJUkVHLAkxLCB7IFJTTCwgMCwgMCB9IH0sCi0JeyBSXzAoMHg2NmIpLAkibWFyayIsCQlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMCgweDY2YyksCSJmbWFyayIsCUlfQkFTRSwJUkVHLAkwLCB7IDAsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjZkKSwJImZsdXNocmVnIiwJSV9CQVNFLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzAoMHg2NmYpLAkic3luY2YiLAlJX0JBU0UsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMygweDY3MCksCSJlbXVsIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUjIgfSB9LAotCXsgUl8zKDB4NjcxKSwJImVkaXYiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJMMixSUyB9IH0sCi0JeyBSXzJEKDB4NjcyKSwJImN2dGFkciIsCUlfQ0FTSU0sUkVHLCAJMiwgeyBSTCwgUjIsIDAgfSB9LAotCXsgUl8zKDB4NzAxKSwJIm11bG8iLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3MDgpLAkicmVtbyIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDcwYiksCSJkaXZvIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzQxKSwJIm11bGkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3NDgpLAkicmVtaSIsCQlJX0JBU0UsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc0OSksCSJtb2RpIiwJCUlfQkFTRSwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzRiKSwJImRpdmkiLAkJSV9CQVNFLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQkvKiBGbG9hdGluZy1wb2ludCBpbnN0cnVjdGlvbnMgKi8KLQotCXsgUl8yRCgweDY3NCksCSJjdnRpciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4Njc1KSwJImN2dGlsciIsCUlfRlAsCVJFRywJMiwgeyBSTCwgRiwgMCB9IH0sCi0JeyBSXzMoMHg2NzYpLAkic2NhbGVybCIsCUlfRlAsCVJFRywJMywgeyBSTCwgRkwyLEYyIH0gfSwKLQl7IFJfMygweDY3NyksCSJzY2FsZXIiLAlJX0ZQLAlSRUcsCTMsIHsgUkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDY4MCksCSJhdGFuciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgxKSwJImxvZ2VwciIsCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NjgyKSwJImxvZ3IiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg2ODMpLAkicmVtciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMigweDY4NCksCSJjbXBvciIsCUlfRlAsCVJFRywJMiwgeyBGTCwgRkwsIDAgfSB9LAotCXsgUl8yKDB4Njg1KSwJImNtcHIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGTCwgMCB9IH0sCi0JeyBSXzJEKDB4Njg4KSwJInNxcnRyIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2ODkpLAkiZXhwciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YSksCSJsb2dibnIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YiksCSJyb3VuZHIiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8yRCgweDY4YyksCSJzaW5yIiwJCUlfRlAsCVJFRywJMiwgeyBGTCwgRiwgMCB9IH0sCi0JeyBSXzJEKDB4NjhkKSwJImNvc3IiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2OGUpLAkidGFuciIsCQlJX0ZQLAlSRUcsCTIsIHsgRkwsIEYsIDAgfSB9LAotCXsgUl8xKDB4NjhmKSwJImNsYXNzciIsCUlfRlAsCVJFRywJMSwgeyBGTCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2OTApLAkiYXRhbnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NjkxKSwJImxvZ2VwcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTIpLAkibG9ncmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzMoMHg2OTMpLAkicmVtcmwiLAlJX0ZQLAlSRUcsCTMsIHsgRkwyLEZMMixGMiB9IH0sCi0JeyBSXzIoMHg2OTQpLAkiY21wb3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAotCXsgUl8yKDB4Njk1KSwJImNtcHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGTDIsIDAgfSB9LAotCXsgUl8yRCgweDY5OCksCSJzcXJ0cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OTkpLAkiZXhwcmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2OWEpLAkibG9nYm5ybCIsCUlfRlAsCVJFRywJMiwgeyBGTDIsRjIsIDAgfSB9LAotCXsgUl8yRCgweDY5YiksCSJyb3VuZHJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjljKSwJInNpbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjlkKSwJImNvc3JsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzJEKDB4NjllKSwJInRhbnJsIiwJSV9GUCwJUkVHLAkyLCB7IEZMMixGMiwgMCB9IH0sCi0JeyBSXzEoMHg2OWYpLAkiY2xhc3NybCIsCUlfRlAsCVJFRywJMSwgeyBGTDIsIDAsIDAgfSB9LAotCXsgUl8yRCgweDZjMCksCSJjdnRyaSIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NmMxKSwJImN2dHJpbCIsCUlfRlAsCVJFRywJMiwgeyBGTCwgUjIsIDAgfSB9LAotCXsgUl8yRCgweDZjMiksCSJjdnR6cmkiLAlJX0ZQLAlSRUcsCTIsIHsgRkwsIFIsIDAgfSB9LAotCXsgUl8yRCgweDZjMyksCSJjdnR6cmlsIiwJSV9GUCwJUkVHLAkyLCB7IEZMLCBSMiwgMCB9IH0sCi0JeyBSXzJEKDB4NmM5KSwJIm1vdnIiLAkJSV9GUCwJUkVHLAkyLCB7IEZMLCBGLCAwIH0gfSwKLQl7IFJfMkQoMHg2ZDkpLAkibW92cmwiLAlJX0ZQLAlSRUcsCTIsIHsgRkwyLEYyLCAwIH0gfSwKLQl7IFJfMkQoMHg2ZTEpLAkibW92cmUiLAlJX0ZQLAlSRUcsCTIsIHsgRkw0LEY0LCAwIH0gfSwKLQl7IFJfMygweDZlMiksCSJjcHlzcmUiLAlJX0ZQLAlSRUcsCTMsIHsgRkw0LEZMNCxGNCB9IH0sCi0JeyBSXzMoMHg2ZTMpLAkiY3B5cnNyZSIsCUlfRlAsCVJFRywJMywgeyBGTDQsRkw0LEY0IH0gfSwKLQl7IFJfMygweDc4YiksCSJkaXZyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzhjKSwJIm11bHIiLAkJSV9GUCwJUkVHLAkzLCB7IEZMLCBGTCwgRiB9IH0sCi0JeyBSXzMoMHg3OGQpLAkic3ViciIsCQlJX0ZQLAlSRUcsCTMsIHsgRkwsIEZMLCBGIH0gfSwKLQl7IFJfMygweDc4ZiksCSJhZGRyIiwJCUlfRlAsCVJFRywJMywgeyBGTCwgRkwsIEYgfSB9LAotCXsgUl8zKDB4NzliKSwJImRpdnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzljKSwJIm11bHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzlkKSwJInN1YnJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCXsgUl8zKDB4NzlmKSwJImFkZHJsIiwJSV9GUCwJUkVHLAkzLCB7IEZMMixGTDIsRjIgfSB9LAotCi0JLyogVGhlc2UgYXJlIHRoZSBmbG9hdGluZyBwb2ludCBicmFuY2ggaW5zdHJ1Y3Rpb25zLiAgRWFjaCBhY3R1YWxseQotCSAqIGdlbmVyYXRlcyAyIGJyYW5jaCBpbnN0cnVjdGlvbnM6ICB0aGUgZmlyc3QgYSBDVFJMIGluc3RydWN0aW9uIHdpdGgKLQkgKiB0aGUgaW5kaWNhdGVkIG9wY29kZSwgYW5kIHRoZSBzZWNvbmQgYSAnYm5vJy4KLQkgKi8KLQotCXsgMHgxMjAwMDAwMCwJImJydWUiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDExMDAwMDAwLAkiYnJ1ZyIsCQlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTMwMDAwMDAsCSJicnVnZSIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCXsgMHgxNDAwMDAwMCwJImJydWwiLAkJSV9GUCwJRkJSQSwgCTEsIHsgMCwgMCwgMCB9CX0sCi0JeyAweDE2MDAwMDAwLAkiYnJ1bGUiLAlJX0ZQLAlGQlJBLCAJMSwgeyAwLCAwLCAwIH0JfSwKLQl7IDB4MTUwMDAwMDAsCSJicnVsZyIsCUlfRlAsCUZCUkEsIAkxLCB7IDAsIDAsIDAgfQl9LAotCi0KLQkvKiBEZWNpbWFsIGluc3RydWN0aW9ucyAqLwotCi0JeyBSXzMoMHg2NDIpLAkiZGFkZGMiLAlJX0RFQywJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NjQzKSwJImRzdWJjIiwJSV9ERUMsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMkQoMHg2NDQpLAkiZG1vdnQiLAlJX0RFQywJUkVHLAkyLCB7IFJTTCxSUywgMCB9IH0sCi0KLQotCS8qIEtYIGV4dGVuc2lvbnMgKi8KLQotCXsgUl8yKDB4NjAwKSwJInN5bm1vdiIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzIoMHg2MDEpLAkic3lubW92bCIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzIoMHg2MDIpLAkic3lubW92cSIsCUlfS1gsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjE1KSwJInN5bmxkIiwJSV9LWCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQotCi0JLyogTUMgZXh0ZW5zaW9ucyAqLwotCi0JeyBSXzMoMHg2MDMpLAkiY21wc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMygweDYwNCksCSJtb3Zxc3RyIiwJSV9NSUwsCVJFRywJMywgeyBSLCAgUiwgIFJMIH0gfSwKLQl7IFJfMygweDYwNSksCSJtb3ZzdHIiLAlJX01JTCwJUkVHLAkzLCB7IFIsICBSLCAgUkwgfSB9LAotCXsgUl8yRCgweDYxMyksCSJpbnNwYWNjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjE0KSwJImxkcGh5IiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzMoMHg2MTcpLAkiZmlsbCIsCQlJX01JTCwJUkVHLAkzLCB7IFIsICBSTCwgUkwgfSB9LAotCXsgUl8yRCgweDY0NiksCSJjb25kcmVjIiwJSV9NSUwsCVJFRywJMiwgeyBSLCAgUiwgMCB9IH0sCi0JeyBSXzJEKDB4NjU2KSwJInJlY2VpdmUiLAlJX01JTCwJUkVHLAkyLCB7IFIsICBSLCAwIH0gfSwKLQl7IFJfMygweDY2MiksCSJzZW5kIiwJCUlfTUlMLAlSRUcsCTMsIHsgUiwgIFJMLCBSIH0gfSwKLQl7IFJfMSgweDY2MyksCSJzZW5kc2VydiIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjQpLAkicmVzdW1wcmNzIiwJSV9NSUwsCVJFRywJMSwgeyBSLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2NSksCSJzY2hlZHByY3MiLAlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8wKDB4NjY2KSwJInNhdmVwcmNzIiwJSV9NSUwsCVJFRywJMCwgeyAwLCAwLCAwIH0JfSwKLQl7IFJfMSgweDY2OCksCSJjb25kd2FpdCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzEoMHg2NjkpLAkid2FpdCIsCQlJX01JTCwJUkVHLAkxLCB7IFIsIDAsIDAgfQl9LAotCXsgUl8xKDB4NjZhKSwJInNpZ25hbCIsCUlfTUlMLAlSRUcsCTEsIHsgUiwgMCwgMCB9CX0sCi0JeyBSXzFEKDB4NjczKSwJImxkdGltZSIsCUlfTUlMLAlSRUcsCTEsIHsgUjIsIDAsIDAgfQl9LAotCi0KLQkvKiBDWCBleHRlbnNpb25zICovCi0KLQl7IFJfMygweDVkOCksCSJlc2hybyIsCUlfQ1gyLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg2MzApLAkic2RtYSIsCQlJX0NYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0JeyBSXzMoMHg2MzEpLAkidWRtYSIsCQlJX0NYLAlSRUcsCTAsIHsgMCwgMCwgMCB9CX0sCi0JeyBSXzMoMHg2NTkpLAkic3lzY3RsIiwJSV9DWDIsCVJFRywJMywgeyBSU0wsUlNMLFJMIH0gfSwKLQotCi0JLyogSnggZXh0ZW5zaW9ucy4gICovCi0JeyBSXzMoMHg3ODApLAkiYWRkb25vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkwKSwJImFkZG9nIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EwKSwJImFkZG9lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IwKSwJImFkZG9nZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMCksCSJhZGRvbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMCksCSJhZGRvbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTApLAkiYWRkb2xlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YwKSwJImFkZG9vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzgxKSwJImFkZGlubyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDc5MSksCSJhZGRpZyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdhMSksCSJhZGRpZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdiMSksCSJhZGRpZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzEpLAkiYWRkaWwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDEpLAkiYWRkaW5lIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2UxKSwJImFkZGlsZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdmMSksCSJhZGRpbyIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQotCXsgUl8yRCgweDVhZCksCSJic3dhcCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKLQotCXsgUl8yKDB4NTk0KSwJImNtcG9iIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk1KSwJImNtcGliIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk2KSwJImNtcG9zIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCXsgUl8yKDB4NTk3KSwJImNtcGlzIiwJSV9KWCwJUkVHLAkyLCB7IFJTTCxSU0wsIDAgfSB9LAotCi0JeyBSXzMoMHg3ODQpLAkic2Vsbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTQpLAkic2VsZyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTQpLAkic2VsZSIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjQpLAkic2VsZ2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YzQpLAkic2VsbCIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZDQpLAkic2VsbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTQpLAkic2VsbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjQpLAkic2VsbyIsCQlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0KLQl7IFJfMygweDc4MiksCSJzdWJvbm8iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3OTIpLAkic3Vib2ciLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YTIpLAkic3Vib2UiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3YjIpLAkic3Vib2dlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2MyKSwJInN1Ym9sIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2QyKSwJInN1Ym9uZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdlMiksCSJzdWJvbGUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZjIpLAkic3Vib28iLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ODMpLAkic3ViaW5vIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4NzkzKSwJInN1YmlnIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2EzKSwJInN1YmllIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2IzKSwJInN1YmlnZSIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdjMyksCSJzdWJpbCIsCUlfSlgsCVJFRywJMywgeyBSU0wsUlNMLFJTIH0gfSwKLQl7IFJfMygweDdkMyksCSJzdWJpbmUiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzMoMHg3ZTMpLAkic3ViaWxlIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCXsgUl8zKDB4N2YzKSwJInN1YmlvIiwJSV9KWCwJUkVHLAkzLCB7IFJTTCxSU0wsUlMgfSB9LAotCi0JeyBSXzMoMHg2NWMpLAkiZGNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSTCB9IH0sCi0JeyBSXzMoMHg2NWIpLAkiaWNjdGwiLAlJX0pYLAlSRUcsCTMsIHsgUlNMLFJTTCxSUyB9IH0sCi0JeyBSXzJEKDB4NjU4KSwJImludGN0bCIsCUlfSlgsCVJFRywJMiwgeyBSU0wsIFJTLCAwIH0gfSwKLQl7IFJfMCgweDViNCksCSJpbnRkaXMiLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCi0JeyBSXzAoMHg1YjUpLAkiaW50ZW4iLAlJX0pYLAlSRUcsCTAsIHsgICAwLCAgMCwgMCB9IH0sCi0JeyBSXzAoMHg2NWQpLAkiaGFsdCIsCQlJX0pYLAlSRUcsCTEsIHsgUlNMLCAgMCwgMCB9IH0sCi0KLQkvKiBIeCBleHRlbnNpb25zLiAgKi8KLQl7IDB4YWMwMDAwMDAsCSJkY2ludmEiLAlJX0hYLAlNRU0xLAkxLCB7ICAgTSwgIDAsIDAgfSB9LAotCi0JLyogRU5EIE9GIFRBQkxFICovCi0KLQl7IDAsCQlOVUxMLAkJMCwJMCwJMCwgeyAwLCAwLCAwIH0JfQotfTsKLQotIC8qIGVuZCBvZiBpOTYwLW9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tNjhrLmggYi9pbmNsdWRlL29wY29kZS9tNjhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDhiNzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbTY4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBoZWFkZXIgZm9yIG02ODBbMDEyMzRdMC9tNjg4OFsxMl0vbTY4ODUxLgotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIFRoZXNlIGFyZSB1c2VkIGFzIGJpdCBmbGFncyBmb3IgdGhlIGFyY2ggZmllbGQgaW4gdGhlIG02OGtfb3Bjb2RlCi0gICBzdHJ1Y3R1cmUuICAqLwotI2RlZmluZQlfbTY4a191bmRlZiAgMAotI2RlZmluZQltNjgwMDAgIDB4MDAxCi0jZGVmaW5lCW02ODAwOCAgbTY4MDAwIC8qIHN5bm9ueW0gZm9yIC1tNjgwMDAuICBvdGhlcndpc2UgdW51c2VkLiAqLwotI2RlZmluZQltNjgwMTAgIDB4MDAyCi0jZGVmaW5lCW02ODAyMCAgMHgwMDQKLSNkZWZpbmUJbTY4MDMwICAweDAwOAotI2RlZmluZSBtNjhlYzAzMCBtNjgwMzAgLyogc2ltaWxhciBlbm91Z2ggdG8gLW02ODAzMCB0byBpZ25vcmUgZGlmZmVyZW5jZXM7Ci0JCQkgICBnYXMgd2lsbCBkZWFsIHdpdGggdGhlIGZldyBkaWZmZXJlbmNlcy4gICovCi0jZGVmaW5lCW02ODA0MCAgMHgwMTAKLS8qIHRoZXJlIGlzIG5vIDY4MDUwICovCi0jZGVmaW5lIG02ODA2MCAgMHgwMjAKLSNkZWZpbmUJbTY4ODgxICAweDA0MAotI2RlZmluZQltNjg4ODIgIG02ODg4MSAvKiBzeW5vbnltIGZvciAtbTY4ODgxLiAgb3RoZXJ3aXNlIHVudXNlZC4gKi8KLSNkZWZpbmUJbTY4ODUxICAweDA4MAotI2RlZmluZSBjcHUzMgkweDEwMAkvKiBlLmcuLCA2ODMzMiAqLwotI2RlZmluZSBtY2Y1MjAwIDB4MjAwCi0jZGVmaW5lIG1jZjUyMDZlIDB4NDAwCi0jZGVmaW5lIG1jZjUzMDcgMHg4MDAKLQotIC8qIGhhbmR5IGFsaWFzZXMgKi8KLSNkZWZpbmUJbTY4MDQwdXAgIChtNjgwNDAgfCBtNjgwNjApCi0jZGVmaW5lCW02ODAzMHVwICAobTY4MDMwIHwgbTY4MDQwdXApCi0jZGVmaW5lCW02ODAyMHVwICAobTY4MDIwIHwgbTY4MDMwdXApCi0jZGVmaW5lCW02ODAxMHVwICAobTY4MDEwIHwgY3B1MzIgfCBtNjgwMjB1cCkKLSNkZWZpbmUJbTY4MDAwdXAgIChtNjgwMDAgfCBtNjgwMTB1cCkKLSNkZWZpbmUgbWNmICAgICAgIChtY2Y1MjAwIHwgbWNmNTIwNmUgfCBtY2Y1MzA3KQotCi0jZGVmaW5lCW1mbG9hdCAgKG02ODg4MSB8IG02ODg4MiB8IG02ODA0MCB8IG02ODA2MCkKLSNkZWZpbmUJbW1tdSAgICAobTY4ODUxIHwgbTY4MDMwIHwgbTY4MDQwIHwgbTY4MDYwKQotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IgYW4gb3Bjb2RlLiAgKi8KLQotc3RydWN0IG02OGtfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIC8qIFRoZSBtYXNrIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7Ci0gIC8qIFRoZSBhcmd1bWVudHMuICAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGUgYXJjaGl0ZWN0dXJlcyB3aGljaCBzdXBwb3J0IHRoaXMgb3Bjb2RlLiAgKi8KLSAgdW5zaWduZWQgaW50IGFyY2g7Ci19OwotCi0vKiBUaGUgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBpbmZvcm1hdGlvbiBmb3IgYW4gb3Bjb2RlIGFsaWFzLiAgKi8KLQotc3RydWN0IG02OGtfb3Bjb2RlX2FsaWFzCi17Ci0gIC8qIFRoZSBhbGlhcyBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqYWxpYXM7Ci0gIC8qIFRoZSBpbnN0cnVjdGlvbiBmb3Igd2hpY2ggdGhpcyBpcyBhbiBhbGlhcy4gICovCi0gIGNvbnN0IGNoYXIgKnByaW1hcnk7Ci19OwotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMgYmVjYXVzZSB0aGF0IGlzIHRoZQotICAgbW9zdCBhbnkgb2YgdGhlbSBuZWVkLiAgVGhlIGFjdHVhbCBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24gaXMKLSAgIGFsd2F5cyBhdCBsZWFzdCAyIGJ5dGVzLCBhbmQgaXMgYXMgbXVjaCBsb25nZXIgYXMgbmVjZXNzYXJ5IHRvIGhvbGQKLSAgIHRoZSBvcGVyYW5kcyBpdCBoYXMuCi0KLSAgIFRoZSBtYXRjaCBmaWVsZCBpcyBhIG1hc2sgc2F5aW5nIHdoaWNoIGJpdHMgbXVzdCBtYXRjaCBwYXJ0aWN1bGFyCi0gICBvcGNvZGUgaW4gb3JkZXIgZm9yIGFuIGluc3RydWN0aW9uIHRvIGJlIGFuIGluc3RhbmNlIG9mIHRoYXQKLSAgIG9wY29kZS4KLQotICAgVGhlIGFyZ3MgZmllbGQgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0d28gY2hhcmFjdGVycyBmb3IgZWFjaAotICAgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBUaGUgZmlyc3Qgc3BlY2lmaWVzIHRoZSBraW5kIG9mCi0gICBvcGVyYW5kOyB0aGUgc2Vjb25kLCB0aGUgcGxhY2UgaXQgaXMgc3RvcmVkLiAgKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICBDaGFyYWN0ZXJzIHVzZWQ6IEFhQkNjRGRFRmZHSElKa0xsTW1uT29wUXFSclNzVHRVIFZ2V1hZWjAxMjN8Kn4lO0AhJiQ/Lzw+I14rLQotCi0gICBEICBkYXRhIHJlZ2lzdGVyIG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgQSAgYWRkcmVzcyByZWdpc3RlciBvbmx5LiAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIGEgIGFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMuCi0gICBSICBlaXRoZXIga2luZCBvZiByZWdpc3Rlci4gIFN0b3JlZCBhcyA0IGJpdHMuCi0gICByICBlaXRoZXIga2luZCBvZiByZWdpc3RlciBpbmRpcmVjdCBvbmx5LiAgU3RvcmVkIGFzIDQgYml0cy4KLSAgICAgIEF0IHRoZSBtb21lbnQsIHVzZWQgb25seSBmb3IgY2FzMiBpbnN0cnVjdGlvbi4KLSAgIEYgIGZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG9ubHkuICAgU3RvcmVkIGFzIDMgYml0cy4KLSAgIE8gIGFuIG9mZnNldCAob3Igd2lkdGgpOiBpbW1lZGlhdGUgZGF0YSAwLTMxIG9yIGRhdGEgcmVnaXN0ZXIuCi0gICAgICBTdG9yZWQgYXMgNiBiaXRzIGluIHNwZWNpYWwgZm9ybWF0IGZvciBCRi4uLiBpbnNucy4KLSAgICsgIGF1dG9pbmNyZW1lbnQgb25seS4gIFN0b3JlZCBhcyAzIGJpdHMgKG51bWJlciBvZiB0aGUgYWRkcmVzcyByZWdpc3RlcikuCi0gICAtICBhdXRvZGVjcmVtZW50IG9ubHkuICBTdG9yZWQgYXMgMyBiaXRzIChudW1iZXIgb2YgdGhlIGFkZHJlc3MgcmVnaXN0ZXIpLgotICAgUSAgcXVpY2sgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgMyBiaXRzLgotICAgICAgVGhpcyBtYXRjaGVzIGFuIGltbWVkaWF0ZSBvcGVyYW5kIG9ubHkgd2hlbiB2YWx1ZSBpcyBpbiByYW5nZSAxIC4uIDguCi0gICBNICBtb3ZlcSBpbW1lZGlhdGUgZGF0YS4gIFN0b3JlZCBhcyA4IGJpdHMuCi0gICAgICBUaGlzIG1hdGNoZXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQgb25seSB3aGVuIHZhbHVlIGlzIGluIHJhbmdlIC0xMjguLjEyNwotICAgVCAgdHJhcCB2ZWN0b3IgaW1tZWRpYXRlIGRhdGEuICBTdG9yZWQgYXMgNCBiaXRzLgotCi0gICBrICBLLWZhY3RvciBmb3IgZm1vdmUucCBpbnN0cnVjdGlvbi4gICBTdG9yZWQgYXMgYSA3LWJpdCBjb25zdGFudCBvcgotICAgICAgYSB0aHJlZSBiaXQgcmVnaXN0ZXIgb2Zmc2V0LCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkIHR5cGUuCi0KLSAgICMgIGltbWVkaWF0ZSBkYXRhLiAgU3RvcmVkIGluIHNwZWNpYWwgcGxhY2VzIChiLCB3IG9yIGwpCi0gICAgICB3aGljaCBzYXkgaG93IG1hbnkgYml0cyB0byBzdG9yZS4KLSAgIF4gIGltbWVkaWF0ZSBkYXRhIGZvciBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMuICAgU3BlY2lhbCBwbGFjZXMKLSAgICAgIGFyZSBvZmZzZXQgYnkgMiBieXRlcyBmcm9tICcjJy4uLgotICAgQiAgcGMtcmVsYXRpdmUgYWRkcmVzcywgY29udmVydGVkIHRvIGFuIG9mZnNldAotICAgICAgdGhhdCBpcyB0cmVhdGVkIGFzIGltbWVkaWF0ZSBkYXRhLgotICAgZCAgZGlzcGxhY2VtZW50IGFuZCByZWdpc3Rlci4gIFN0b3JlcyB0aGUgcmVnaXN0ZXIgYXMgMyBiaXRzCi0gICAgICBhbmQgc3RvcmVzIHRoZSBkaXNwbGFjZW1lbnQgaW4gdGhlIGVudGlyZSBzZWNvbmQgd29yZC4KLQotICAgQyAgdGhlIENDUi4gIE5vIG5lZWQgdG8gc3RvcmUgaXQ7IHRoaXMgaXMganVzdCBmb3IgZmlsdGVyaW5nIHZhbGlkaXR5LgotICAgUyAgdGhlIFNSLiAgTm8gbmVlZCB0byBzdG9yZSwganVzdCBhcyB3aXRoIENDUi4KLSAgIFUgIHRoZSBVU1AuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgRSAgdGhlIEFDQy4gIE5vIG5lZWQgdG8gc3RvcmUsIGp1c3QgYXMgd2l0aCBDQ1IuCi0gICBHICB0aGUgTUFDU1IuICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotICAgSCAgdGhlIE1BU0suICBObyBuZWVkIHRvIHN0b3JlLCBqdXN0IGFzIHdpdGggQ0NSLgotCi0gICBJICBDb3Byb2Nlc3NvciBJRC4gICBOb3QgcHJpbnRlZCBpZiAxLiAgIFRoZSBDb3Byb2Nlc3NvciBJRCBpcyBhbHdheXMKLSAgICAgIGV4dHJhY3RlZCBmcm9tIHRoZSAnZCcgZmllbGQgb2Ygd29yZCBvbmUsIHdoaWNoIG1lYW5zIHRoYXQgYW4gZXh0ZW5kZWQKLSAgICAgIGNvcHJvY2Vzc29yIG9wY29kZSBjYW4gYmUgc2tpcHBlZCB1c2luZyB0aGUgJ2knIHBsYWNlLCBpZiBuZWVkZWQuCi0KLSAgIHMgIFN5c3RlbSBDb250cm9sIHJlZ2lzdGVyIGZvciB0aGUgZmxvYXRpbmcgcG9pbnQgY29wcm9jZXNzb3IuCi0KLSAgIEogIE1pc2MgcmVnaXN0ZXIgZm9yIG1vdmVjIGluc3RydWN0aW9uLCBzdG9yZWQgaW4gJ2onIGZvcm1hdC4KLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMHgwMDAJU0ZDCVNvdXJjZSBGdW5jdGlvbiBDb2RlIHJlZwlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4MDAxCURGQwlEYXRhIEZ1bmN0aW9uIENvZGUgcmVnCQlbNjAsIDQwLCAzMCwgMjAsIDEwXQotCTB4MDAyCUNBQ1IJQ2FjaGUgQ29udHJvbCBSZWdpc3RlcgkJWzYwLCA0MCwgMzAsIDIwXQotCTB4MDAzCVRDCU1NVSBUcmFuc2xhdGlvbiBDb250cm9sCQlbNjAsIDQwXQotCTB4MDA0CUlUVDAJSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMAlbNjAsIDQwXQotCTB4MDA1CUlUVDEJSW5zdHJ1Y3Rpb24gVHJhbnNwYXJlbnQKLQkJCQlUcmFuc2xhdGlvbiByZWcgMQlbNjAsIDQwXQotCTB4MDA2CURUVDAJRGF0YSBUcmFuc3BhcmVudAotCQkJCVRyYW5zbGF0aW9uIHJlZyAwCVs2MCwgNDBdCi0JMHgwMDcJRFRUMQlEYXRhIFRyYW5zcGFyZW50Ci0JCQkJVHJhbnNsYXRpb24gcmVnIDEJWzYwLCA0MF0KLQkweDAwOAlCVVNDUglCdXMgQ29udHJvbCBSZWdpc3RlcgkJWzYwXQotCTB4ODAwCVVTUAlVc2VyIFN0YWNrIFBvaW50ZXIJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHg4MDEJVkJSCVZlY3RvciBCYXNlIHJlZwkJCVs2MCwgNDAsIDMwLCAyMCwgMTBdCi0JMHg4MDIJQ0FBUglDYWNoZSBBZGRyZXNzIFJlZ2lzdGVyCQlbICAgICAgICAzMCwgMjBdCi0JMHg4MDMJTVNQCU1hc3RlciBTdGFjayBQb2ludGVyCQlbICAgIDQwLCAzMCwgMjBdCi0JMHg4MDQJSVNQCUludGVycnVwdCBTdGFjayBQb2ludGVyCQlbICAgIDQwLCAzMCwgMjBdCi0JMHg4MDUJTU1VU1IJTU1VIFN0YXR1cyByZWcJCQlbICAgIDQwXQotCTB4ODA2CVVSUAlVc2VyIFJvb3QgUG9pbnRlcgkJWzYwLCA0MF0KLQkweDgwNwlTUlAJU3VwZXJ2aXNvciBSb290IFBvaW50ZXIJCVs2MCwgNDBdCi0JMHg4MDgJUENSCVByb2Nlc3NvciBDb25maWd1cmF0aW9uIHJlZwlbNjBdCi0JMHhDMDAJUk9NQkFSCVJPTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIJWzUyMFhdCi0JMHhDMDQJUkFNQkFSMAlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0JMHhDMDUJUkFNQkFSMQlSQU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDAJWzUyMFhdCi0JMHhDMEYJTUJBUjAJUkFNIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwCVs1MjBYXQotCi0gICAgTCAgUmVnaXN0ZXIgbGlzdCBvZiB0aGUgdHlwZSBkMC1kNy9hMC1hNyBldGMuCi0gICAgICAgKE5ldyEgIEltcHJvdmVkISAgQ2FuIGFsc28gaG9sZCBmcDAtZnA3LCBhcyB3ZWxsISkKLSAgICAgICBUaGUgYXNzZW1ibGVyIHRyaWVzIHRvIHNlZSBpZiB0aGUgcmVnaXN0ZXJzIG1hdGNoIHRoZSBpbnNuIGJ5Ci0gICAgICAgbG9va2luZyBhdCB3aGVyZSB0aGUgaW5zbiB3YW50cyB0aGVtIHN0b3JlZC4KLQotICAgIGwgIFJlZ2lzdGVyIGxpc3QgbGlrZSBMLCBidXQgd2l0aCBhbGwgdGhlIGJpdHMgcmV2ZXJzZWQuCi0gICAgICAgVXNlZCBmb3IgZ29pbmcgdGhlIG90aGVyIHdheS4gLiAuCi0KLSAgICBjICBjYWNoZSBpZGVudGlmaWVyIHdoaWNoIG1heSBiZSAibmMiIGZvciBubyBjYWNoZSwgImljIgotICAgICAgIGZvciBpbnN0cnVjdGlvbiBjYWNoZSwgImRjIiBmb3IgZGF0YSBjYWNoZSwgb3IgImJjIgotICAgICAgIGZvciBib3RoIGNhY2hlcy4gIFVzZWQgaW4gY2ludiBhbmQgY3B1c2guICBBbHdheXMKLSAgICAgICBzdG9yZWQgaW4gcG9zaXRpb24gImQiLgotCi0gICAgdSAgQW55IHJlZ2lzdGVyLCB3aXRoIGBgdXBwZXInJyBvciBgYGxvd2VyJycgc3BlY2lmaWNhdGlvbi4gIFVzZWQKLSAgICAgICBpbiB0aGUgbWFjIGluc3RydWN0aW9ucyB3aXRoIHNpemUgd29yZC4KLQotIFRoZSByZW1haW5kZXIgYXJlIGFsbCBzdG9yZWQgYXMgNiBiaXRzIHVzaW5nIGFuIGFkZHJlc3MgbW9kZSBhbmQgYQotIHJlZ2lzdGVyIG51bWJlcjsgdGhleSBkaWZmZXIgaW4gd2hpY2ggYWRkcmVzc2luZyBtb2RlcyB0aGV5IG1hdGNoLgotCi0gICAqICBhbGwJCQkJCShtb2RlcyAwLTYsNy4wLTQpCi0gICB+ICBhbHRlcmFibGUgbWVtb3J5CQkJCShtb2RlcyAyLTYsNy4wLDcuMSkKLSAgIAkJCQkJCShub3QgMCwxLDcuMi00KQotICAgJSAgYWx0ZXJhYmxlCQkJCQkobW9kZXMgMC02LDcuMCw3LjEpCi0JCQkJCQkobm90IDcuMi00KQotICAgOyAgZGF0YQkJCQkJKG1vZGVzIDAsMi02LDcuMC00KQotCQkJCQkJKG5vdCAxKQotICAgQCAgZGF0YSwgYnV0IG5vdCBpbW1lZGlhdGUJCQkobW9kZXMgMCwyLTYsNy4wLTMpCi0JCQkJCQkobm90IDEsNy40KQotICAgISAgY29udHJvbAkJCQkJKG1vZGVzIDIsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAwLDEsMyw0LDcuNCkKLSAgICYgIGFsdGVyYWJsZSBjb250cm9sCQkJCShtb2RlcyAyLDUsNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAwLDEsNy4yLTQpCi0gICAkICBhbHRlcmFibGUgZGF0YQkJCQkobW9kZXMgMCwyLTYsNy4wLDcuMSkKLQkJCQkJCShub3QgMSw3LjItNCkKLSAgID8gIGFsdGVyYWJsZSBjb250cm9sLCBvciBkYXRhIHJlZ2lzdGVyCShtb2RlcyAwLDIsNSw2LDcuMCw3LjEpCi0JCQkJCQkobm90IDEsMyw0LDcuMi00KQotICAgLyAgY29udHJvbCwgb3IgZGF0YSByZWdpc3RlcgkJCShtb2RlcyAwLDIsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAxLDMsNCw3LjQpCi0gICA+ICAqc2F2ZSBvcGVyYW5kcwkJCQkobW9kZXMgMiw0LDUsNiw3LjAsNy4xKQotCQkJCQkJKG5vdCAwLDEsMyw3LjItNCkKLSAgIDwgICpyZXN0b3JlIG9wZXJhbmRzCQkJCShtb2RlcyAyLDMsNSw2LDcuMC0zKQotCQkJCQkJKG5vdCAwLDEsNCw3LjQpCi0KLSAgIGNvbGRmaXJlIG1vdmUgb3BlcmFuZHM6Ci0gICBtICAJCQkJCQkobW9kZXMgMC00KQotICAgbgkJCQkJCShtb2RlcyA1LDcuMikKLSAgIG8JCQkJCQkobW9kZXMgNiw3LjAsNy4xLDcuMyw3LjQpCi0gICBwCQkJCQkJKG1vZGVzIDAtNSkKLQotICAgY29sZGZpcmUgYnNldC9iY2xyL2J0c3QvbXVsc2wvbXVsdWwgb3BlcmFuZHM6Ci0gICBxCQkJCQkJKG1vZGVzIDAsMi01KQotICAgdgkJCQkJCShtb2RlcyAwLDItNSw3LjAsNy4xKQotKi8KLQotLyogRm9yIHRoZSA2ODg1MTogKi8KLS8qCi0gICBJIGRpZG4ndCB1c2UgbXVjaCBpbWFnaW5hdGlvbiBpbiBjaG9vc2luZyB0aGUgCi0gICBmb2xsb3dpbmcgY29kZXMsIHNvIG1hbnkgb2YgdGhlbSBhcmVuJ3QgdmVyeQotICAgbW5lbW9uaWMuIC1yYWIKLQotICAgMCAgMzIgYml0IHBtbXUgcmVnaXN0ZXIKLQlQb3NzaWJsZSB2YWx1ZXM6Ci0JMDAwCVRDCVRyYW5zbGF0aW9uIENvbnRyb2wgUmVnaXN0ZXIgKDY4MDMwLCA2ODg1MSkKLQotICAgMSAgMTYgYml0IHBtbXUgcmVnaXN0ZXIKLQkxMTEJQUMJQWNjZXNzIENvbnRyb2wgKDY4ODUxKQotCi0gICAyICA4IGJpdCBwbW11IHJlZ2lzdGVyCi0JMTAwCUNBTAlDdXJyZW50IEFjY2VzcyBMZXZlbCAoNjg4NTEpCi0JMTAxCVZBTAlWYWxpZGF0ZSBBY2Nlc3MgTGV2ZWwgKDY4ODUxKQotCTExMAlTQ0MJU3RhY2sgQ2hhbmdlIENvbnRyb2wgKDY4ODUxKQotCi0gICAzICA2ODAzMC1vbmx5IHBtbXUgcmVnaXN0ZXJzICgzMiBiaXQpCi0JMDEwCVRUMAlUcmFuc3BhcmVudCBUcmFuc2xhdGlvbiByZWcgMAotCQkJKGFrYSBBY2Nlc3MgQ29udHJvbCByZWcgMCAtLSBBQzAgLS0gb24gNjhlYzAzMCkKLQkwMTEJVFQxCVRyYW5zcGFyZW50IFRyYW5zbGF0aW9uIHJlZyAxCi0JCQkoYWthIEFjY2VzcyBDb250cm9sIHJlZyAxIC0tIEFDMSAtLSBvbiA2OGVjMDMwKQotCi0gICBXICB3aWRlIHBtbXUgcmVnaXN0ZXJzCi0JUG9zc2libGUgdmFsdWVzOgotCTAwMQlEUlAJRG1hIFJvb3QgUG9pbnRlciAoNjg4NTEpCi0JMDEwCVNSUAlTdXBlcnZpc29yIFJvb3QgUG9pbnRlciAoNjgwMzAsIDY4ODUxKQotCTAxMQlDUlAJQ3B1IFJvb3QgUG9pbnRlciAoNjgwMzAsIDY4ODUxKQotCi0gICBmCWZ1bmN0aW9uIGNvZGUgcmVnaXN0ZXIgKDY4MDMwLCA2ODg1MSkKLQkwCVNGQwotCTEJREZDCi0KLSAgIFYJVkFMIHJlZ2lzdGVyIG9ubHkgKDY4ODUxKQotCi0gICBYCUJBRHgsIEJBQ3ggKDE2IGJpdCkKLQkxMDAJQkFECUJyZWFrcG9pbnQgQWNrbm93bGVkZ2UgRGF0YSAoNjg4NTEpCi0JMTAxCUJBQwlCcmVha3BvaW50IEFja25vd2xlZGdlIENvbnRyb2wgKDY4ODUxKQotCi0gICBZCVBTUiAoNjg4NTEpIChNTVVTUiBvbiA2ODAzMCkgKEFDVVNSIG9uIDY4ZWMwMzApCi0gICBaCVBDU1IgKDY4ODUxKQotCi0gICB8CW1lbW9yeSAJCShtb2RlcyAyLTYsIDcuKikKLQotICAgdCAgYWRkcmVzcyB0ZXN0IGxldmVsICg2ODAzMCBvbmx5KQotICAgICAgU3RvcmVkIGFzIDMgYml0cywgcmFuZ2UgMC03LgotICAgICAgQWxzbyB1c2VkIGZvciBicmVha3BvaW50IGluc3RydWN0aW9uIG5vdy4KLQotKi8KLQotLyogUGxhY2VzIHRvIHB1dCBhbiBvcGVyYW5kLCBmb3Igbm9uLWdlbmVyYWwgb3BlcmFuZHM6Ci0gICBDaGFyYWN0ZXJzIHVzZWQ6IEJiQ2NEZGdoaWprTGxNbU5ub3N0V3cxMjM0NTY3ODkKLQotICAgcyAgc291cmNlLCBsb3cgYml0cyBvZiBmaXJzdCB3b3JkLgotICAgZCAgZGVzdCwgc2hpZnRlZCA5IGluIGZpcnN0IHdvcmQKLSAgIDEgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDEyCi0gICAyICBzZWNvbmQgd29yZCwgc2hpZnRlZCA2Ci0gICAzICBzZWNvbmQgd29yZCwgc2hpZnRlZCAwCi0gICA0ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDEyCi0gICA1ICB0aGlyZCB3b3JkLCBzaGlmdGVkIDYKLSAgIDYgIHRoaXJkIHdvcmQsIHNoaWZ0ZWQgMAotICAgNyAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgNwotICAgOCAgc2Vjb25kIHdvcmQsIHNoaWZ0ZWQgMTAKLSAgIDkgIHNlY29uZCB3b3JkLCBzaGlmdGVkIDUKLSAgIEQgIHN0b3JlIGluIGJvdGggcGxhY2UgMSBhbmQgcGxhY2UgMzsgZm9yIGRpdnVsIGFuZCBkaXZzbC4KLSAgIEIgIGZpcnN0IHdvcmQsIGxvdyBieXRlLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKLSAgIFcgIHNlY29uZCB3b3JkIChlbnRpcmUpLCBmb3IgYnJhbmNoIGRpc3BsYWNlbWVudHMKLSAgIEwgIHNlY29uZCBhbmQgdGhpcmQgd29yZHMgKGVudGlyZSksIGZvciBicmFuY2ggZGlzcGxhY2VtZW50cwotICAgICAgKGFsc28gb3ZlcmxvYWRlZCBmb3IgbW92ZTE2KQotICAgYiAgc2Vjb25kIHdvcmQsIGxvdyBieXRlCi0gICB3ICBzZWNvbmQgd29yZCAoZW50aXJlKSBbdmFyaWFibGUgd29yZC9sb25nIGJyYW5jaCBvZmZzZXQgZm9yIGRicmFdCi0gICBXICBzZWNvbmQgd29yZCAoZW50aXJlKSAobXVzdCBiZSBzaWduZWQgMTYgYml0IHZhbHVlKQotICAgbCAgc2Vjb25kIGFuZCB0aGlyZCB3b3JkIChlbnRpcmUpCi0gICBnICB2YXJpYWJsZSBicmFuY2ggb2Zmc2V0IGZvciBicmEgYW5kIHNpbWlsYXIgaW5zdHJ1Y3Rpb25zLgotICAgICAgVGhlIHBsYWNlIHRvIHN0b3JlIGRlcGVuZHMgb24gdGhlIG1hZ25pdHVkZSBvZiBvZmZzZXQuCi0gICB0ICBzdG9yZSBpbiBib3RoIHBsYWNlIDcgYW5kIHBsYWNlIDg7IGZvciBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zCi0gICBjICBicmFuY2ggb2Zmc2V0IGZvciBjcEJjYyBvcGVyYXRpb25zLgotICAgICAgVGhlIHBsYWNlIHRvIHN0b3JlIGlzIHdvcmQgdHdvIGlmIGJpdCBzaXggb2Ygd29yZCBvbmUgaXMgemVybywKLSAgICAgIGFuZCB3b3JkcyB0d28gYW5kIHRocmVlIGlmIGJpdCBzaXggb2Ygd29yZCBvbmUgaXMgb25lLgotICAgaSAgSW5jcmVtZW50IGJ5IHR3bywgdG8gc2tpcCBvdmVyIGNvcHJvY2Vzc29yIGV4dGVuZGVkIG9wZXJhbmRzLiAgIE9ubHkKLSAgICAgIHdvcmtzIHdpdGggdGhlICdJJyBmb3JtYXQuCi0gICBrICBEeW5hbWljIEstZmFjdG9yIGZpZWxkLiAgIEJpdHMgNi00IG9mIHdvcmQgMiwgdXNlZCBhcyBhIHJlZ2lzdGVyIG51bWJlci4KLSAgICAgIEFsc28gdXNlZCBmb3IgZHluYW1pYyBmbW92ZW0gaW5zdHJ1Y3Rpb24uCi0gICBDICBmbG9hdGluZyBwb2ludCBjb3Byb2Nlc3NvciBjb25zdGFudCAtIDcgYml0cy4gIEFsc28gdXNlZCBmb3Igc3RhdGljCi0gICAgICBLLWZhY3RvcnMuLi4KLSAgIGogIE1vdmVjIHJlZ2lzdGVyICMsIHN0b3JlZCBpbiAxMiBsb3cgYml0cyBvZiBzZWNvbmQgd29yZC4KLSAgIG0gIEZvciBNW1NdQUN4OyA0IGJpdHMgc3BsaXQgd2l0aCBNU0Igc2hpZnRlZCA2IGJpdHMgaW4gZmlyc3Qgd29yZAotICAgICAgYW5kIHJlbWFpbmluZyAzIGJpdHMgb2YgcmVnaXN0ZXIgc2hpZnRlZCA5IGJpdHMgaW4gZmlyc3Qgd29yZC4KLSAgICAgIEluZGljYXRlIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNyBiaXRzIGluIHNlY29uZCB3b3JkLgotICAgICAgVXNlIHdpdGggYFInIG9yIGB1JyBmb3JtYXQuCi0gICBuICBgbScgd2l0aG91dGggdXBwZXIvbG93ZXIgaW5kaWNhdGlvbi4gKEZvciBNW1NdQUN4OyA0IGJpdHMgc3BsaXQKLSAgICAgIHdpdGggTVNCIHNoaWZ0ZWQgNiBiaXRzIGluIGZpcnN0IHdvcmQgYW5kIHJlbWFpbmluZyAzIGJpdHMgb2YKLSAgICAgIHJlZ2lzdGVyIHNoaWZ0ZWQgOSBiaXRzIGluIGZpcnN0IHdvcmQuICBObyB1cHBlci9sb3dlcgotICAgICAgaW5kaWNhdGlvbiBpcyBkb25lLikgIFVzZSB3aXRoIGBSJyBvciBgdScgZm9ybWF0LgotICAgbyAgRm9yIE1bU11BQ3c7IDQgYml0cyBzaGlmdGVkIDEyIGluIHNlY29uZCB3b3JkIChsaWtlIGAxJykuCi0gICAgICBJbmRpY2F0ZSB1cHBlci9sb3dlciBpbiAxIGJpdCBzaGlmdGVkIDcgYml0cyBpbiBzZWNvbmQgd29yZC4KLSAgICAgIFVzZSB3aXRoIGBSJyBvciBgdScgZm9ybWF0LgotICAgTSAgRm9yIE1bU11BQ3c7IDQgYml0cyBpbiBsb3cgYml0cyBvZiBmaXJzdCB3b3JkLiAgSW5kaWNhdGUKLSAgICAgIHVwcGVyL2xvd2VyIGluIDEgYml0IHNoaWZ0ZWQgNiBiaXRzIGluIHNlY29uZCB3b3JkLiAgVXNlIHdpdGgKLSAgICAgIGBSJyBvciBgdScgZm9ybWF0LgotICAgTiAgRm9yIE1bU11BQ3c7IDQgYml0cyBpbiBsb3cgYml0cyBvZiBzZWNvbmQgd29yZC4gIEluZGljYXRlCi0gICAgICB1cHBlci9sb3dlciBpbiAxIGJpdCBzaGlmdGVkIDYgYml0cyBpbiBzZWNvbmQgd29yZC4gIFVzZSB3aXRoCi0gICAgICBgUicgb3IgYHUnIGZvcm1hdC4KLSAgIGggIHNoaWZ0IGluZGljYXRvciAoc2NhbGUgZmFjdG9yKSwgMSBiaXQgc2hpZnRlZCAxMCBpbiBzZWNvbmQgd29yZAotCi0gUGxhY2VzIHRvIHB1dCBvcGVyYW5kLCBmb3IgZ2VuZXJhbCBvcGVyYW5kczoKLSAgIGQgIGRlc3RpbmF0aW9uLCBzaGlmdGVkIDYgYml0cyBpbiBmaXJzdCB3b3JkCi0gICBiICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIG9uZSBieXRlCi0gICB3ICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZCwgYW5kIGltbWVkaWF0ZSB1c2VzIHR3byBieXRlcwotICAgbCAgc291cmNlLCBhdCBsb3cgYml0IG9mIGZpcnN0IHdvcmQsIGFuZCBpbW1lZGlhdGUgdXNlcyBmb3VyIGJ5dGVzCi0gICBzICBzb3VyY2UsIGF0IGxvdyBiaXQgb2YgZmlyc3Qgd29yZC4KLSAgICAgIFVzZWQgc29tZXRpbWVzIGluIGNvbnRleHRzIHdoZXJlIGltbWVkaWF0ZSBpcyBub3QgYWxsb3dlZCBhbnl3YXkuCi0gICBmICBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyA0IGJ5dGVzCi0gICBGICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0LCBsb3cgYml0IG9mIDFzdCB3b3JkLCBpbW1lZGlhdGUgdXNlcyA4IGJ5dGVzCi0gICB4ICBleHRlbmRlZCBwcmVjaXNpb24gZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDEyIGJ5dGVzCi0gICBwICBwYWNrZWQgZmxvYXQsIGxvdyBiaXQgb2YgMXN0IHdvcmQsIGltbWVkaWF0ZSB1c2VzIDEyIGJ5dGVzCi0qLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlIG02OGtfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyBtNjhrX29wY29kZV9hbGlhc2VzW107Ci0KLWV4dGVybiBjb25zdCBpbnQgbTY4a19udW1vcGNvZGVzLCBtNjhrX251bWFsaWFzZXM7Ci0KLS8qIGVuZCBvZiBtNjhrLW9wY29kZS5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tODhrLmggYi9pbmNsdWRlL29wY29kZS9tODhrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExN2ZhMDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbTg4ay5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIzICswLDAgQEAKLS8qIFRhYmxlIG9mIG9wY29kZXMgZm9yIHRoZSBtb3Rvcm9sYSA4OGsgZmFtaWx5LgotICAgQ29weXJpZ2h0IDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiBhbmQgR0FTLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotICoJCQlEaXNhc3NlbWJsZXIgSW5zdHJ1Y3Rpb24gVGFibGUKLSAqCi0gKglUaGUgZmlyc3QgZmllbGQgb2YgdGhlIHRhYmxlIGlzIHRoZSBvcGNvZGUgZmllbGQuIElmIGFuIG9wY29kZQotICoJaXMgc3BlY2lmaWVkIHdoaWNoIGhhcyBhbnkgbm9uLW9wY29kZSBiaXRzIG9uLCBhIHN5c3RlbSBlcnJvcgotICoJd2lsbCBvY2N1ciB3aGVuIHRoZSBzeXN0ZW0gYXR0ZW1wdHMgdGhlIGluc3RhbGwgaXQgaW50byB0aGUKLSAqCWluc3RydWN0aW9uIHRhYmxlLiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIHRoZQotICoJaW5zdHJ1Y3Rpb24gbW5lbW9uaWMuIEVhY2ggb3BlcmFuZCBpcyBzcGVjaWZpZWQgYnkgb2Zmc2V0LCB3aWR0aCwKLSAqCWFuZCB0eXBlLiBUaGUgb2Zmc2V0IGlzIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudAotICoJYml0IG9mIHRoZSBvcGVyYW5kIHdpdGggYml0IDAgYmVpbmcgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZgotICoJdGhlIGluc3RydWN0aW9uLiBUaGUgd2lkdGggaXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeQotICoJdGhlIG9wZXJhbmQuIFRoZSB0eXBlIHNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgotICoJdGhlIG9wZXJhbmQuIFRoZSB2YWxpZCBmb3JtYXRzIGFyZTogcmVnaXN0ZXIsIHJlZ2lzdGVyIGluZGlyZWN0LAotICoJaGV4IGNvbnN0YW50LCBhbmQgYml0IGZpZWxkIHNwZWNpZmljYXRpb24uICBUaGUgbGFzdCBmaWVsZCBpcyBhCi0gKglwb2ludGVyIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIGluIHRoZSBsaW5rZWQgbGlzdC4gIFRoZXNlIHBvaW50ZXJzCi0gKglhcmUgaW5pdGlhbGl6ZWQgYnkgaW5pdF9kaXNhc20oKS4KLSAqCi0gKgkJCQlTdHJ1Y3R1cmUgRm9ybWF0Ci0gKgotICogICAgICAgc3RydWN0IElOU1RBQiB7Ci0gKiAgICAgICAgICBVUElOVCBvcGNvZGU7Ci0gKiAgICAgICAgICBjaGFyICptbmVtb25pYzsKLSAqICAgICAgICAgIHN0cnVjdCBPUFNQRUMgb3AxLG9wMixvcDM7Ci0gKiAgICAgICAgICBzdHJ1Y3QgU0lNX0ZMQUdTIGZsZ3M7Ci0gKiAgICAgICAgICBzdHJ1Y3QgSU5TVEFCICpuZXh0OwotICogICAgICAgfQotICoKLSAqICAgICAgIHN0cnVjdCBPUFNQRUMgewotICogICAgICAgICAgVVBJTlQgb2Zmc2V0OjU7Ci0gKiAgICAgICAgICBVUElOVCB3aWR0aDo2OwotICogICAgICAgICAgVVBJTlQgdHlwZTo1OwotICogICAgICAgfQotICoKLSAqCQkJCVJldmlzaW9uIEhpc3RvcnkKLSAqCi0gKglSZXZpc2lvbiAxLjAJMTEvMDgvODUJQ3JlYXRpb24gZGF0ZQotICoJCSAxLjEJMDIvMDUvODYJVXBkYXRlZCBpbnN0cnVjdGlvbiBtbmVtb25pYyB0YWJsZSBNRAotICoJCSAxLjIJMDYvMTYvODYJVXBkYXRlZCBTSU1fRkxBR1MgZm9yIGZsb2F0aW5nIHBvaW50Ci0gKgkJIDEuMwkwOS8yMC84NglVcGRhdGVkIGZvciBuZXcgZW5jb2RpbmcKLSAqCQkgCTA1LzExLzg5CVIuIFRyYXdpY2sgYWRhcHRlZCBmcm9tIE1vdG9yb2xhIGRpc2Fzc2VtYmxlcgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBuZWVkZWQgdG8gYnVpbGQgdGhlIE04ODAwMAotICogc2ltdWxhdG9yLiAgSXQgaXMgdGhlIG1haW4gaW5jbHVkZSBmaWxlLCBjb250YWluaW5nIGFsbCB0aGUKLSAqIHN0cnVjdHVyZXMsIG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgZXhjZXB0IGZvciB0aGUgZmxvYXRpbmcgcG9pbnQKLSAqIGluc3RydWN0aW9uIHNldC4KLSAqLwotCi0vKgotICogVGhlIGZvbGxvd2luZyBmbGFnIGluZm9ybXMgdGhlIFNpbXVsYXRvciBhcyB0byB3aGF0IHR5cGUgb2YgYnl0ZSBvcmRlcmluZwotICogd2lsbCBiZSB1c2VkLiBGb3IgaW5zdGFuY2UsIGEgQk9GTEFHID0gMSBpbmRpY2F0ZXMgYSBERUMgVkFYIGFuZCBJQk0gdHlwZQotICogb2Ygb3JkZXJpbmcgc2hhbGwgYmUgdXNlZC4KLSovCi0KLS8qICMgZGVmaW5lICAgICBCT0ZMQUcgICAxICovICAgICAgICAgICAgICAgICAgICAgICAvKiBCWVRFIE9SREVSSU5HIEZMQUcgKi8KLQotLyogZGVmaW5lIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgcHJpbWFyeSBvcGNvZGUgZmllbGQgb2YgdGhlIGluc3RydWN0aW9uLAotICogdGhlIGRlc3RpbmF0aW9uIGZpZWxkLCB0aGUgc291cmNlIDEgYW5kIHNvdXJjZSAyIGZpZWxkcy4KLSAqLwotIyBkZWZpbmUgICAgT1AgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygb3Bjb2RlIGZpZWxkICovCi0jIGRlZmluZSAgICBERVNUICAgICA2ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBkZXN0aW5hdGlvbiAgKi8KLSMgZGVmaW5lICAgIFNPVVJDRTEgIDYgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIHNvdXJjZTEgICAgICAqLwotIyBkZWZpbmUgICAgU09VUkNFMiAgNiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc291cmNlMiAgICAgICovCi0KLSMgZGVmaW5lICAgIFJFR3MgICAgMzIgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzICAqLwotCi0jIGRlZmluZSAgICBXT1JEICAgIGxvbmcKLSMgZGVmaW5lICAgIEZMQUcgICAgdW5zaWduZWQKLSMgZGVmaW5lICAgIFNUQVRFICAgc2hvcnQKLQotIyBkZWZpbmUgICAgVFJVRSAgICAgMQotIyBkZWZpbmUgICAgRkFMU0UgICAgMAotCi0jIGRlZmluZSAgICBSRUFEICAgICAwCi0jIGRlZmluZSAgICBXUklURSAgICAxCi0KLS8qIFRoZSBuZXh0IGZvdXIgZXF1YXRlcyBkZWZpbmUgdGhlIHByaW9yaXRpZXMgdGhhdCB0aGUgdmFyaW91cyBjbGFzc2VzCi0gKiBvZiBpbnN0cnVjdGlvbnMgaGF2ZSByZWdhcmRpbmcgd3JpdGluZyByZXN1bHRzIGJhY2sgaW50byByZWdpc3RlcnMgYW5kCi0gKiBzaWduYWxsaW5nIGV4Y2VwdGlvbnMuCi0gKi8KLS8qIFBNRU0gaXMgYWxzbyBkZWZpbmVkIGluIDxzeXMvcGFyYW0uaD4gb24gRGVsdGEgODgncy4gIFNpZ2ghICAqLwotI3VuZGVmIFBNRU0KLQotIyBkZWZpbmUgICAgUElOVCAgMCAgIC8qIEludGVnZXIgUHJpb3JpdHkgKi8KLSMgZGVmaW5lICAgIFBGTFQgIDEgICAvKiBGbG9hdGluZyBQb2ludCBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgUE1FTSAgMiAgIC8qIE1lbW9yeSBQcmlvcml0eSAqLwotIyBkZWZpbmUgICAgTkEgICAgMyAgIC8qIE5vdCBBcHBsaWNhYmxlLCBpbnN0cnVjdGlvbiBkb2VzbnQgd3JpdGUgdG8gcmVncyAqLwotIyBkZWZpbmUgICAgSElQUkkgMyAgIC8qIGhpZ2hlc3Qgb2YgdGhlc2UgcHJpb3JpdGllcyAqLwotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gcmVnaXN0ZXJzIGFyZSBhbiBhcnRpZmljaWFsIG1lY2hhbmlzbSB0byBzcGVlZCB1cAotICogc2ltdWxhdG9yIGV4ZWN1dGlvbi4gIEluIHRoZSByZWFsIHByb2Nlc3NvciwgYW4gaW5zdHJ1Y3Rpb24gcmVnaXN0ZXIKLSAqIGlzIDMyIGJpdHMgd2lkZS4gIEluIHRoZSBzaW11bGF0b3IsIHRoZSAzMiBiaXQgaW5zdHJ1Y3Rpb24gaXMga2VwdCBpbgotICogYSBzdHJ1Y3R1cmUgZmllbGQgY2FsbGVkIHJhd29wLCBhbmQgdGhlIGluc3RydWN0aW9uIGlzIHBhcnRpYWxseSBkZWNvZGVkLAotICogYW5kIHNwbGl0IGludG8gdmFyaW91cyBmaWVsZHMgYW5kIGZsYWdzIHdoaWNoIG1ha2UgdXAgdGhlIG90aGVyIGZpZWxkcwotICogb2YgdGhlIHN0cnVjdHVyZS4KLSAqIFRoZSBwYXJ0aWFsIGRlY29kZSBpcyBkb25lIHdoZW4gdGhlIGluc3RydWN0aW9ucyBhcmUgaW5pdGlhbGx5IGxvYWRlZAotICogaW50byBzaW11bGF0b3IgbWVtb3J5LiAgVGhlIHNpbXVsYXRvciBjb2RlIG1lbW9yeSBpcyBub3QgYW4gYXJyYXkgb2YKLSAqIDMyIGJpdCB3b3JkcywgYnV0IGlzIGFuIGFycmF5IG9mIGluc3RydWN0aW9uIHJlZ2lzdGVyIHN0cnVjdHVyZXMuCi0gKiBZZXMgdGhpcyB3YXN0ZXMgbWVtb3J5LCBidXQgaXQgZXhlY3V0ZXMgbXVjaCBxdWlja2VyLgotICovCi0KLXN0cnVjdCBJUl9GSUVMRFMgewotCQkgICAgdW5zaWduZWQgICAgICAgIG9wOk9QLAotCQkJCSAgICBkZXN0OiBERVNULAotCQkJCSAgICBzcmMxOiBTT1VSQ0UxLAotCQkJCSAgICBzcmMyOiBTT1VSQ0UyOwotCQkJICAgICAgaW50ICAgbHRuY3ksCi0JCQkJICAgIGV4dGltZSwKLQkJCQkgICAgd2JfcHJpOyAgICAgLyogd3JpdGViYWNrIHByaW9yaXR5ICAgICAqLwotCQkgICAgdW5zaWduZWQgICAgICAgIGltbV9mbGFnczoyLC8qIGltbWVkaWF0ZSBzaXplICAgICAgICAgKi8KLQkJCQkgICAgcnMxX3VzZWQ6MSwgLyogcmVnaXN0ZXIgc291cmNlIDEgdXNlZCAqLwotCQkJCSAgICByczJfdXNlZDoxLCAvKiByZWdpc3RlciBzb3VyY2UgMiB1c2VkICovCi0JCQkJICAgIHJzZF91c2VkOjEsIC8qIHJlZ2lzdGVyIHNvdXJjZS9kZXN0LiB1c2VkICovCi0JCQkJICAgIGNfZmxhZzoxLCAgIC8qIGNvbXBsZW1lbnQgICAgICAqLwotCQkJCSAgICB1X2ZsYWc6MSwgICAvKiB1cHBlciBoYWxmIHdvcmQgKi8KLQkJCQkgICAgbl9mbGFnOjEsICAgLyogZXhlY3V0ZSBuZXh0ICAgICovCi0JCQkJICAgIHdiX2ZsYWc6MSwgIC8qIHVzZXMgd3JpdGViYWNrIHNsb3QgKi8KLQkJCQkgICAgZGVzdF82NDoxLCAgLyogZGVzdCBzaXplICAgICAgICovCi0JCQkJICAgIHMxXzY0OjEsICAgIC8qIHNvdXJjZSAxIHNpemUgICAqLwotCQkJCSAgICBzMl82NDoxLCAgICAvKiBzb3VyY2UgMiBzaXplICAgKi8KLQkJCQkgICAgc2NhbGVfZmxhZzoxLCAvKiBzY2FsZWQgcmVnaXN0ZXIgKi8KLQkJCQkgICAgYnJrX2ZsZzoxOwotICAgICAgICAgICAgICAgICB9OwotCi1zdHJ1Y3QJbWVtX3NlZ3MgewotCXN0cnVjdCBtZW1fd3JkICpzZWc7CQkJLyogcG9pbnRlciAocmV0dXJuZWQgYnkgY2FsbG9jKSB0byBzZWdtZW50ICovCi0JdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsJCQkvKiBiYXNlIGxvYWQgYWRkcmVzcyBmcm9tIGZpbGUgaGVhZGVycyAqLwotCXVuc2lnbmVkIGxvbmcgZW5kYWRkcjsJCQkvKiBFbmRpbmcgYWRkcmVzcyBvZiBzZWdtZW50ICovCi0JaW50CSAgICAgIGZsYWdzOwkJCS8qIHNlZ21lbnQgY29udHJvbCBmbGFncyAobm9uZSBkZWZpbmVkIDEyLzUvODYpICovCi19OwotCi0jZGVmaW5lCU1BWFNFR1MJCSgxMCkJCQkvKiBtYXggbnVtYmVyIG9mIHNlZ21lbnQgYWxsb3dlZCAqLwotI2RlZmluZQlNRU1TRUdTSVpFCShzaXplb2Yoc3RydWN0IG1lbV9zZWdzKSkvKiBzaXplIG9mIG1lbV9zZWdzIHN0cnVjdHVyZSAqLwotCi0KLSNkZWZpbmUgQlJLX1JECQkoMHgwMSkJCQkvKiBicmVhayBvbiBtZW1vcnkgcmVhZCAqLwotI2RlZmluZSBCUktfV1IJCSgweDAyKQkJCS8qIGJyZWFrIG9uIG1lbW9yeSB3cml0ZSAqLwotI2RlZmluZSBCUktfRVhFQwkoMHgwNCkJCQkvKiBicmVhayBvbiBleGVjdXRpb24gKi8KLSNkZWZpbmUJQlJLX0NOVAkJKDB4MDgpCQkJLyogYnJlYWsgb24gdGVybWluYWwgY291bnQgKi8KLQotCi1zdHJ1Y3QJbWVtX3dyZCB7Ci0Jc3RydWN0IElSX0ZJRUxEUyBvcGNvZGU7CQkvKiBzaW11bGF0b3IgaW5zdHJ1Y3Rpb24gYnJlYWsgZG93biAqLwotCXVuaW9uIHsKLQkJdW5zaWduZWQgbG9uZyAgbDsJCS8qIG1lbW9yeSBlbGVtZW50IGJyZWFrIGRvd24gKi8KLQkJdW5zaWduZWQgc2hvcnQgc1syXTsKLQkJdW5zaWduZWQgY2hhciAgY1s0XTsKLQl9IG1lbTsKLX07Ci0KLSNkZWZpbmUJTUVNV1JEU0laRQkoc2l6ZW9mKHN0cnVjdCBtZW1fd3JkKSkJLyogc2l6ZSBvZiBlYWNoIDMyIGJpdCBtZW1vcnkgbW9kZWwgKi8KLQotLyogRXh0ZXJuYWwgZGVjbGFyYXRpb25zICovCi0KLWV4dGVybglzdHJ1Y3QgbWVtX3NlZ3MgbWVtb3J5W107Ci1leHRlcm4Jc3RydWN0IFBST0NFU1NPUiBtNzgwMDA7Ci0KLXN0cnVjdCAgUFJPQ0VTU09SICAgewotCSAgICAgdW5zaWduZWQgV09SRAotCQkJICAgIGlwLCAgICAgICAgICAvKiBleGVjdXRlIGluc3RydWN0aW9uIHBvaW50ZXIgKi8KLQkJCSAgICB2YnIsICAgICAgICAgLyogdmVjdG9yIGJhc2UgcmVnaXN0ZXIgKi8KLQkJCSAgICBwc3I7ICAgICAgICAgLyogcHJvY2Vzc29yIHN0YXR1cyByZWdpc3RlciAqLwotCi0JCSAgICBXT1JEICAgIFMxYnVzLCAvKiBzb3VyY2UgMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFMyYnVzLCAvKiBzb3VyY2UgMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERidXMsICAvKiBkZXN0aW5hdGlvbiAqLwotCQkJICAgIERBYnVzLCAvKiBkYXRhIGFkZHJlc3MgYnVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxVLAotCQkJICAgIFJlZ3NbUkVHc10sICAgICAgIC8qIGRhdGEgcmVnaXN0ZXJzICovCi0JCQkgICAgdGltZV9sZWZ0W1JFR3NdLCAgLyogbWF4IGNsb2NrcyBiZWZvcmUgcmVnIGlzIGF2YWlsYWJsZSAqLwotCQkJICAgIHdiX3ByaVtSRUdzXSwgICAgIC8qIHdyaXRlYmFjayBwcmlvcml0eSBvZiByZWcgKi8KLQkJCSAgICBTRlUwX3JlZ3NbUkVHc10sICAvKiBpbnRlZ2VyIHVuaXQgY29udHJvbCByZWdzICovCi0JCQkgICAgU0ZVMV9yZWdzW1JFR3NdLCAgLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdzICovCi0JCQkgICAgU2NvcmVib2FyZFtSRUdzXSwKLQkJCSAgICBWYnI7Ci0JICAgIHVuc2lnbmVkIFdPUkQgICBzY29yZWJvYXJkLAotCQkJICAgIFBzdywKLQkJCSAgICBUcHN3OwotCQkgICAgRkxBRyAgIGp1bXBfcGVuZGluZzoxOyAgIC8qIHdhaXRpbmcgZm9yIGEganVtcCBpbnN0ci4gKi8KLSAgICAgICAgICAgICAgICAgICAgfTsKLQotIyBkZWZpbmUgICAgaTI2Yml0ICAgICAgMSAgICAvKiBzaXplIG9mIGltbWVkaWF0ZSBmaWVsZCAqLwotIyBkZWZpbmUgICAgaTE2Yml0ICAgICAgMgotIyBkZWZpbmUgICAgaTEwYml0ICAgICAgMwotCi0vKiBEZWZpbml0aW9ucyBmb3IgZmllbGRzIGluIHBzciAqLwotCi0jIGRlZmluZSBtb2RlICAzMQotIyBkZWZpbmUgcmJvICAgMzAKLSMgZGVmaW5lIHNlciAgIDI5Ci0jIGRlZmluZSBjYXJyeSAyOAotIyBkZWZpbmUgc2Y3bSAgMTEKLSMgZGVmaW5lIHNmNm0gIDEwCi0jIGRlZmluZSBzZjVtICAgOQotIyBkZWZpbmUgc2Y0bSAgIDgKLSMgZGVmaW5lIHNmM20gICA3Ci0jIGRlZmluZSBzZjJtICAgNgotIyBkZWZpbmUgc2YxbSAgIDUKLSMgZGVmaW5lIG1hbSAgICA0Ci0jIGRlZmluZSBpbm0gICAgMwotIyBkZWZpbmUgZXhtICAgIDIKLSMgZGVmaW5lIHRybSAgICAxCi0jIGRlZmluZSBvdmZtICAgMAotCi0jZGVmaW5lCSAgICBNT0RFTUFTSyAgICgxPDwobW9kZS0xKSkKLSMgZGVmaW5lICAgIFNJTEVOVCAgICAgMCAgIC8qIHNpbXVsYXRlIHdpdGhvdXQgb3V0cHV0IHRvIGNydCAqLwotIyBkZWZpbmUgICAgVkVSQk9TRSAgICAxICAgLyogc2ltdWxhdGUgaW4gdmVyYm9zZSBtb2RlICovCi0jIGRlZmluZSAgICBQUl9JTlNUUiAgIDIgICAvKiBvbmx5IHByaW50IGluc3RydWN0aW9ucyAqLwotCi0jIGRlZmluZSAgICBSRVNFVCAgICAgIDE2IC8qIHJlc2V0IHBoYXNlICovCi0KLSMgZGVmaW5lICAgIFBIQVNFMSAgICAgMCAgLyogZGF0YSBwYXRoIHBoYXNlcyAqLwotIyBkZWZpbmUgICAgUEhBU0UyICAgICAxCi0KLS8qIHRoZSAxIGNsb2NrIG9wZXJhdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgQUREVSAgICAgICAgMQotIyBkZWZpbmUgICAgQUREQyAgICAgICAgMgotIyBkZWZpbmUgICAgQUREVUMgICAgICAgMwotIyBkZWZpbmUgICAgQUREICAgICAgICAgNAotCi0jIGRlZmluZSAgICBTVUJVICAgIEFERCsxCi0jIGRlZmluZSAgICBTVUJCICAgIEFERCsyCi0jIGRlZmluZSAgICBTVUJVQiAgIEFERCszCi0jIGRlZmluZSAgICBTVUIgICAgIEFERCs0Ci0KLSMgZGVmaW5lICAgIEFORF8gICAgQUREKzUKLSMgZGVmaW5lICAgIE9SICAgICAgQUREKzYKLSMgZGVmaW5lICAgIFhPUiAgICAgQUREKzcKLSMgZGVmaW5lICAgIENNUCAgICAgQUREKzgKLQotLyogdGhlIExPQURTICovCi0KLSMgZGVmaW5lICAgIExEQUIgICAgQ01QKzEKLSMgZGVmaW5lICAgIExEQUggICAgQ01QKzIKLSMgZGVmaW5lICAgIExEQSAgICAgQ01QKzMKLSMgZGVmaW5lICAgIExEQUQgICAgQ01QKzQKLQotIyBkZWZpbmUgICAgTERCICAgTERBRCsxCi0jIGRlZmluZSAgICBMREggICBMREFEKzIKLSMgZGVmaW5lICAgIExEICAgIExEQUQrMwotIyBkZWZpbmUgICAgTEREICAgTERBRCs0Ci0jIGRlZmluZSAgICBMREJVICBMREFEKzUKLSMgZGVmaW5lICAgIExESFUgIExEQUQrNgotCi0vKiB0aGUgU1RPUkVTICovCi0KLSMgZGVmaW5lICAgIFNUQiAgICBMREhVKzEKLSMgZGVmaW5lICAgIFNUSCAgICBMREhVKzIKLSMgZGVmaW5lICAgIFNUICAgICBMREhVKzMKLSMgZGVmaW5lICAgIFNURCAgICBMREhVKzQKLQotLyogdGhlIGV4Y2hhbmdlICovCi0KLSMgZGVmaW5lICAgIFhNRU1CVSBMREhVKzUKLSMgZGVmaW5lICAgIFhNRU0gICBMREhVKzYKLQotLyogdGhlIGJyYW5jaGVzICovCi0jIGRlZmluZSAgICBKU1IgICAgU1REKzEKLSMgZGVmaW5lICAgIEJTUiAgICBTVEQrMgotIyBkZWZpbmUgICAgQlIgICAgIFNURCszCi0jIGRlZmluZSAgICBKTVAgICAgU1REKzQKLSMgZGVmaW5lICAgIEJCMSAgICBTVEQrNQotIyBkZWZpbmUgICAgQkIwICAgIFNURCs2Ci0jIGRlZmluZSAgICBSVE4gICAgU1REKzcKLSMgZGVmaW5lICAgIEJDTkQgICBTVEQrOAotCi0vKiB0aGUgVFJBUFMgKi8KLSMgZGVmaW5lICAgIFRCMSAgICBCQ05EKzEKLSMgZGVmaW5lICAgIFRCMCAgICBCQ05EKzIKLSMgZGVmaW5lICAgIFRDTkQgICBCQ05EKzMKLSMgZGVmaW5lICAgIFJURSAgICBCQ05EKzQKLSMgZGVmaW5lICAgIFRCTkQgICBCQ05EKzUKLQotLyogdGhlIE1JU0MgaW5zdHJ1Y3Rpb25zICovCi0jIGRlZmluZSAgICBNVUwgICAgIFRCTkQgKyAxCi0jIGRlZmluZSAgICBESVYgICAgIE1VTCAgKzIKLSMgZGVmaW5lICAgIERJVlUgICAgTVVMICArMwotIyBkZWZpbmUgICAgTUFTSyAgICBNVUwgICs0Ci0jIGRlZmluZSAgICBGRjAgICAgIE1VTCAgKzUKLSMgZGVmaW5lICAgIEZGMSAgICAgTVVMICArNgotIyBkZWZpbmUgICAgQ0xSICAgICBNVUwgICs3Ci0jIGRlZmluZSAgICBTRVQgICAgIE1VTCAgKzgKLSMgZGVmaW5lICAgIEVYVCAgICAgTVVMICArOQotIyBkZWZpbmUgICAgRVhUVSAgICBNVUwgICsxMAotIyBkZWZpbmUgICAgTUFLICAgICBNVUwgICsxMQotIyBkZWZpbmUgICAgUk9UICAgICBNVUwgICsxMgotCi0vKiBjb250cm9sIHJlZ2lzdGVyIG1hbmlwdWxhdGlvbnMgKi8KLQotIyBkZWZpbmUgICAgTERDUiAgICBST1QgICsxCi0jIGRlZmluZSAgICBTVENSICAgIFJPVCAgKzIKLSMgZGVmaW5lICAgIFhDUiAgICAgUk9UICArMwotCi0jIGRlZmluZSAgICBGTERDUiAgICBST1QgICs0Ci0jIGRlZmluZSAgICBGU1RDUiAgICBST1QgICs1Ci0jIGRlZmluZSAgICBGWENSICAgICBST1QgICs2Ci0KLQotIyBkZWZpbmUgICAgTk9QICAgICBYQ1IgKzEKLQotLyogZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0KLSMgZGVmaW5lICAgIEZBREQgICAgTk9QICsxCi0jIGRlZmluZSAgICBGU1VCICAgIE5PUCArMgotIyBkZWZpbmUgICAgRk1VTCAgICBOT1AgKzMKLSMgZGVmaW5lICAgIEZESVYgICAgTk9QICs0Ci0jIGRlZmluZSAgICBGU1FSVCAgIE5PUCArNQotIyBkZWZpbmUgICAgRkNNUCAgICBOT1AgKzYKLSMgZGVmaW5lICAgIEZJUCAgICAgTk9QICs3Ci0jIGRlZmluZSAgICBGTFQgICAgIE5PUCArOAotIyBkZWZpbmUgICAgSU5UICAgICBOT1AgKzkKLSMgZGVmaW5lICAgIE5JTlQgICAgTk9QICsxMAotIyBkZWZpbmUgICAgVFJOQyAgICBOT1AgKzExCi0jIGRlZmluZSAgICBGTERDICAgTk9QICsxMgotIyBkZWZpbmUgICAgRlNUQyAgIE5PUCArMTMKLSMgZGVmaW5lICAgIEZYQyAgICBOT1AgKzE0Ci0KLSMgZGVmaW5lIFVFWFQoc3JjLG9mZix3aWQpICgoKCh1bnNpZ25lZCBpbnQpKHNyYykpPj4ob2ZmKSkgJiAoKDE8PCh3aWQpKSAtIDEpKQotIyBkZWZpbmUgU0VYVChzcmMsb2ZmLHdpZCkgKCgoKChpbnQpKHNyYykpPDwoMzItKChvZmYpKyh3aWQpKSkpID4+KDMyLSh3aWQpKSkgKQotIyBkZWZpbmUgTUFLRShzcmMsb2ZmLHdpZCkgXAotICAoKCgodW5zaWduZWQgaW50KShzcmMpKSAmICgoMTw8KHdpZCkpIC0gMSkpIDw8IChvZmYpKQotCi0jIGRlZmluZSBvcHdvcmQobikgKHVuc2lnbmVkIGxvbmcpIChtZW1hZGRyLT5tZW0ubCkKLQotLyogIENvbnN0YW50cyBhbmQgTWFza3MgKi8KLQotI2RlZmluZSBTRlUwICAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgU0ZVMSAgICAgICAweDg0MDAwMDAwCi0jZGVmaW5lIFNGVTcgICAgICAgMHg5YzAwMDAwMAotI2RlZmluZSBSUkkxMCAgICAgIDB4ZjAwMDAwMDAKLSNkZWZpbmUgUlJSICAgICAgICAweGY0MDAwMDAwCi0jZGVmaW5lIFNGVU1BU0sgICAgMHhmYzAwZmZlMAotI2RlZmluZSBSUlJNQVNLICAgIDB4ZmMwMGZmZTAKLSNkZWZpbmUgUlJJMTBNQVNLICAweGZjMDBmYzAwCi0jZGVmaW5lIERFRk1BU0sgICAgMHhmYzAwMDAwMAotI2RlZmluZSBDVFJMICAgICAgIDB4MDAwMGYwMDAKLSNkZWZpbmUgQ1RSTE1BU0sgICAweGZjMDBmODAwCi0KLS8qIE9wZXJhbmRzIHR5cGVzICovCi0KLWVudW0gb3BlcmFuZF90eXBlIHsKLSAgSEVYID0gMSwKLSAgUkVHID0gMiwKLSAgQ09OVCA9IDMsCi0gIElORCA9IDMsCi0gIEJGID0gNCwKLSAgUkVHU0MgPSA1ICAgIC8qIHNjYWxlZCByZWdpc3RlciAqLywKLSAgQ1JSRUcgPSA2ICAgIC8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8sCi0gIEZDUlJFRyA9IDcgICAgLyogZmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciAqLywKLSAgUENSRUwgPSA4LAotICBDT05ETUFTSyA9IDksCi0gIFhSRUcgPSAxMCwgLyogZXh0ZW5kZWQgcmVnaXN0ZXIgKi8KLSAgREVDID0gMTEsIC8qIGRlY2ltYWwgKi8KLX07Ci0KLS8qIEhhc2hpbmcgU3BlY2lmaWNhdGlvbiAqLwotCi0jZGVmaW5lIEhBU0hWQUwgICAgIDc5Ci0KLS8qIFR5cGUgZGVmaW5pdGlvbnMgKi8KLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKLQotLyogU3RydWN0dXJlIHRlbXBsYXRlcyAqLwotCi0jaWYgbmV2ZXIKLXR5cGVkZWYgc3RydWN0IHsKLSAgIHVuc2lnbmVkIGludCBvZmZzZXQ6NTsKLSAgIHVuc2lnbmVkIGludCB3aWR0aDo2OwotICAgdW5zaWduZWQgaW50IHR5cGU6NTsKLX0gT1BTUEVDOwotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgIHVuc2lnbmVkIGludCBvZmZzZXQ7Ci0gICB1bnNpZ25lZCBpbnQgd2lkdGg7Ci0gICBlbnVtIG9wZXJhbmRfdHlwZSB0eXBlOwotfSBPUFNQRUM7Ci0KLQlzdHJ1Y3QgU0lNX0ZMQUdTIHsKLQkgICAgICBpbnQgIGx0bmN5LCAgIC8qIGxhdGVuY3kgKG1heCBudW1iZXIgb2YgY2xvY2tzIG5lZWRlZCB0byBleGVjdXRlKSAqLwotCQkgIGV4dGltZSwgICAvKiBleGVjdXRpb24gdGltZSAobWluIG51bWJlciBvZiBjbG9ja3MgbmVlZGVkIHRvIGV4ZWN1dGUpICovCi0JCSAgd2JfcHJpOyAgIC8qIHdyaXRlYmFjayBzbG90IHByaW9yaXR5ICovCi0gICB1bnNpZ25lZCAgICAgICAgIG9wOk9QLCAgIC8qIHNpbXVsYXRvciB2ZXJzaW9uIG9mIG9wY29kZSAqLwotCSAgICAgaW1tX2ZsYWdzOjIsICAgLyogMTAsMTYgb3IgMjYgYml0IGltbWVkaWF0ZSBmbGFncyAqLwotCSAgICAgIHJzMV91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlIDEgdXNlZCAqLwotCSAgICAgIHJzMl91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlIDIgdXNlZCAqLwotCSAgICAgIHJzZF91c2VkOjEsICAgLyogcmVnaXN0ZXIgc291cmNlL2Rlc3QgdXNlZCAqLwotCQljX2ZsYWc6MSwgICAvKiBjb21wbGVtZW50ICovCi0JCXVfZmxhZzoxLCAgIC8qIHVwcGVyIGhhbGYgd29yZCAqLwotCQluX2ZsYWc6MSwgICAvKiBleGVjdXRlIG5leHQgKi8KLQkgICAgICAgd2JfZmxhZzoxLCAgIC8qIHVzZXMgd3JpdGViYWNrIHNsb3QgKi8KLQkgICAgICAgZGVzdF82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gZGVzdCAqLwotCQkgczFfNjQ6MSwgICAvKiBkb3VibGUgcHJlY2lzaW9uIHNvdXJjZSAxICovCi0JCSBzMl82NDoxLCAgIC8qIGRvdWJsZSBwcmVjaXNpb24gc291cmNlIDIgKi8KLQkgICAgc2NhbGVfZmxhZzoxOyAgIC8qIHJlZ2lzdGVyIGlzIHNjYWxlZCAqLwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgSU5TVFJVQ1RBQiB7Ci0gICB1bnNpZ25lZCBpbnQgIG9wY29kZTsKLSAgIGNoYXIgICAgICAgICAgKm1uZW1vbmljOwotICAgT1BTUEVDICAgICAgICBvcDEsb3AyLG9wMzsKLSAgIHN0cnVjdCBTSU1fRkxBR1MgZmxnczsKLSAgIHN0cnVjdCBJTlNUUlVDVEFCICAgICpuZXh0OwotfSBJTlNUQUI7Ci0MCi0KLSNkZWZpbmUgTk9fT1BFUkFORCB7MCwwLDB9Ci0KLS8qIE9wY29kZSAgICAgTW5lbW9uaWMgICAgICAgT3AgMSBTcGVjICAgICBPcCAyIFNwZWMgICAgT3AgMyBTcGVjICAgICAgICAgU2ltZmxhZ3MgICAgICAgICAgICAgTmV4dCAgKi8KLQotc3RhdGljIElOU1RBQiAgaW5zdHJ1Y3Rpb25zW10gPSB7Ci0gIHsweGY0MDBjODAwLCJqc3IgICAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsSlNSICwgICAgICAgICAgMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjYzAwLCJqc3IubiAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsSlNSICwgICAgICAgICAgMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjMDAwLCJqbXAgICAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsSk1QICwgICAgICAgICAgMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBjNDAwLCJqbXAubiAgICAgICAiLHswLDUsUkVHfSAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsSk1QICwgICAgICAgICAgMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGM4MDAwMDAwLCJic3IgICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsQlNSICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGNjMDAwMDAwLCJic3IubiAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsQlNSICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGMwMDAwMDAwLCJiciAgICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsQlIgICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGM0MDAwMDAwLCJici5uICAgICAgICAiLHswLDI2LFBDUkVMfSxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsxLDEsTkEsQlIgICwgICAgIGkyNmJpdCwwLDAsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQwMDAwMDAwLCJiYjAgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDE2LFBDUkVMfSx7MiwyLE5BLEJCMCwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQ0MDAwMDAwLCJiYjAubiAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDE2LFBDUkVMfSx7MSwxLE5BLEJCMCwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGQ4MDAwMDAwLCJiYjEgICAgICAgICAiLHsyMSw1LEhFWH0sezE2LDUsUkVHfSAgICAgLHswLDE2LFBDUkVMfSx7MiwyLE5BLEJCMSwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGRjMDAwMDAwLCJiYjEubiAgICAgICAiLHsyMSw1LEhFWH0sezE2LDUsUkVHfSAgICAgLHswLDE2LFBDUkVMfSx7MSwxLE5BLEJCMSwgICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBkMDAwLCJ0YjAgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDEwLEhFWH0sIHsyLDIsTkEsVEIwICwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBkODAwLCJ0YjEgICAgICAgICAiLHsyMSw1LEhFWH0gICx7MTYsNSxSRUd9ICAgLHswLDEwLEhFWH0sIHsyLDIsTkEsVEIxICwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGU4MDAwMDAwLCJiY25kICAgICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDE2LFBDUkVMfSx7MiwyLE5BLEJDTkQsICAgIGkxNmJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGVjMDAwMDAwLCJiY25kLm4gICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDE2LFBDUkVMfSx7MSwxLE5BLEJDTkQsICAgIGkxNmJpdCwwLDEsMCwwLDAsMSwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDBlODAwLCJ0Y25kICAgICAgICAiLHsyMSw1LENPTkRNQVNLfSx7MTYsNSxSRUd9LHswLDEwLEhFWH0sIHsyLDIsTkEsVENORCwgICAgIGkxMGJpdCwwLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY4MDAwMDAwLCJ0Ym5kICAgICAgICAiLHsxNiw1LFJFR30gICx7MCwxNixIRVh9ICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsVEJORCwgICAgIGkxMGJpdCwxLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBmODAwLCJ0Ym5kICAgICAgICAiLHsxNiw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsVEJORCwgICAgICAgICAgMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDBmYzAwLCJydGUgICAgICAgICAiLE5PX09QRVJBTkQgICAgICxOT19PUEVSQU5EICAgICAgLE5PX09QRVJBTkQgICAsIHsyLDIsTkEsUlRFICwgICAgICAgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDFjMDAwMDAwLCJsZC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREIgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxYzAwLCJsZC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREIgICAgICwgICAgMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDBjMDAwMDAwLCJsZC5idSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREJVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwYzAwLCJsZC5idSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREJVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDE4MDAwMDAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREggICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxODAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREggICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxYTAwLCJsZC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREggICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDA4MDAwMDAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREhVLCAgIGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwODAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREhVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAwYTAwLCJsZC5odSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREhVICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDE0MDAwMDAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMRCAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNDAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNjAwLCJsZCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDEwMDAwMDAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHszLDEsUE1FTSxMREQgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxMDAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMREQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxMjAwLCJsZC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMREQgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweGY0MDAxNTAwLCJsZC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAxNzAwLCJsZC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxMRCAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDJjMDAwMDAwLCJzdC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1RCICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYzAwLCJzdC5iICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1RCICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDI4MDAwMDAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1RIICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyODAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1RIICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyYTAwLCJzdC5oICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1RIICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9LCBOVUxMIH0sCi0gIHsweDI0MDAwMDAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsTkEsU1QgICAgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwxLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNDAwLCJzdCAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDI2MDAsInN0ICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVCAgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHgyMDAwMDAwMCwic3QuZCAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLE5BLFNURCAgICAgICxpMTZiaXQsMCwxLDAsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyMDAwLCJzdC5kICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsTkEsU1REICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDIyMDAsInN0LmQgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxOQSxTVEQgICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMjUwMCwic3QudXNyICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLE5BLFNUICAgICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAyNzAwLCJzdC51c3IgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsTkEsU1QgICAgICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLS8qICBtODgxMDAgb25seToKLSAgezB4MDAwMDAwMDAsInhtZW0uYnUgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLFhNRU1CVSAsaTE2Yml0LDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICovCi0gIHsweGY0MDAwMDAwLCJ4bWVtLmJ1ICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLS8qICBtODgxMDAgb25seToKLSAgezB4MDQwMDAwMDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMsMSxQTUVNLFhNRU0gICAsaTE2Yml0LDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICovCi0gIHsweGY0MDAwNDAwLCJ4bWVtICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDA2MDAsInhtZW0gICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezMsMSxQTUVNLFhNRU0gICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwMDUwMCwieG1lbS51c3IgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MywxLFBNRU0sWE1FTSAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDAwNzAwLCJ4bWVtLnVzciAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHszLDEsUE1FTSxYTUVNICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDF9ICAgLE5VTEwgfSwKLS8qIG04ODEwMCBvbmx5OgotICB7MHhmNDAwM2UwMCwibGRhLmIgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gKi8KLSAgezB4ZjQwMDNlMDAsImxkYS54ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUgsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotICB7MHhmNDAwM2EwMCwibGRhLmggICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR1NDfSx7MSwxLFBJTlQsTERBSCwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwxfSAgICxOVUxMIH0sCi0gIHsweGY0MDAzNjAwLCJsZGEgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHU0N9LHsxLDEsUElOVCxMREEgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDF9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDMyMDAsImxkYS5kICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUdTQ30sezEsMSxQSU5ULExEQUQsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMX0gICAsTlVMTCB9LAotCi0gIHsweDgwMDA0MDAwLCJsZGNyICAgICAgICAiLHsyMSw1LFJFR30gICx7NSw2LENSUkVHfSAgLE5PX09QRVJBTkQgICAgLHsxLDEsUElOVCxMRENSLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMDgwMDAsInN0Y3IgICAgICAgICIsezE2LDUsUkVHfSAgLHs1LDYsQ1JSRUd9ICAsTk9fT1BFUkFORCAgICAsezEsMSxQSU5ULFNUQ1IsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4MDAwYzAwMCwieGNyICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7NSw2LENSUkVHfSx7MSwxLFBJTlQsWENSLCAgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4ZjQwMDYwMDAsImFkZHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjIwMCwiYWRkdS5jaSAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2MTAwLCJhZGR1LmNvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBRERVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDYzMDAsImFkZHUuY2lvICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERFUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjQwMCwic3VidSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2NjAwLCJzdWJ1LmNpICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUJVLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDY1MDAsInN1YnUuY28gICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjcwMCwic3VidS5jaW8gICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCVSwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA2ODAwLCJkaXZ1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHszMiwzMixQSU5ULERJVlUsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNjkwMCwiZGl2dS5kICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCx9LCBOVUxMIH0sCi0gIHsweGY0MDA2ZTAwLCJtdWxzICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLH0sIE5VTEwgfSwKLSAgezB4ZjQwMDZjMDAsIm11bHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsNCxQSU5ULE1VTCwgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzAwMCwiYWRkICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3MjAwLCJhZGQuY2kgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBREQgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDcxMDAsImFkZC5jbyAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULEFERCAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzMwMCwiYWRkLmNpbyAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQUREICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NDAwLCJzdWIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc2MDAsInN1Yi5jaSAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNVQiAsICAgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNzUwMCwic3ViLmNvICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsU1VCICwgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA3NzAwLCJzdWIuY2lvICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxTVUIgLCAgICAgICAgMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDc4MDAsImRpdnMgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMyLDMyLFBJTlQsRElWICwgICAgICAwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwN2MwMCwiY21wICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQ01QLCAgICAgICAgIDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4NjAwMDAwMDAsImFkZHUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULEFERFUsICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg2NDAwMDAwMCwic3VidSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsU1VCVSwgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4NjgwMDAwMDAsImRpdnUgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezMyLDMyLFBJTlQsRElWVSwgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg2YzAwMDAwMCwibXVsdSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7NCwxLFBJTlQsTVVMLCAgICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDcwMDAwMDAwLCJhZGQgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBREQsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NzQwMDAwMDAsInN1YiAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFNVQiwgICAgaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg3ODAwMDAwMCwiZGl2cyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MzIsMzIsUElOVCxESVYsICBpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDdjMDAwMDAwLCJjbXAgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxDTVAsICAgIGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHhmNDAwNDAwMCwiYW5kICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsQU5EXyAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA0NDAwLCJhbmQuYyAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxBTkRfICAgICAgICAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDU4MDAsIm9yICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE9SICAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwNWMwMCwib3IuYyAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsT1IgICAgICAgICAgLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA1MDAwLCJ4b3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxYT1IgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDU0MDAsInhvci5jICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFhPUiAgICAgICAgICwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg0MDAwMDAwMCwiYW5kICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsQU5EXyAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDQ0MDAwMDAwLCJhbmQudSAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxBTkRfICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTgwMDAwMDAsIm9yICAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULE9SICAgICAsaTE2Yml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg1YzAwMDAwMCwib3IudSAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsT1IgICAgICxpMTZiaXQsMSwwLDEsMCwxLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDUwMDAwMDAwLCJ4b3IgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxYT1IgICAgLGkxNmJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4NTQwMDAwMDAsInhvci51ICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTYsSEVYfSwgezEsMSxQSU5ULFhPUiAgICAsaTE2Yml0LDEsMCwxLDAsMSwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg0ODAwMDAwMCwibWFzayAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxNixIRVh9LCB7MSwxLFBJTlQsTUFTSyAgICxpMTZiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDRjMDAwMDAwLCJtYXNrLnUgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDE2LEhFWH0sIHsxLDEsUElOVCxNQVNLICAgLGkxNmJpdCwxLDAsMSwwLDEsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMGVjMDAsImZmMCAgICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezEsMSxQSU5ULEZGMCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwZTgwMCwiZmYxICAgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7MSwxLFBJTlQsRkYxICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA4MDAwLCJjbHIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxDTFIgICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMDg4MDAsInNldCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULFNFVCAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwOTAwMCwiZXh0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsRVhUICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGYwMDA5ODAwLCJleHR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDEwLEJGfSAsIHsxLDEsUElOVCxFWFRVICAgLGkxMGJpdCwxLDAsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjAwMGEwMDAsIm1hayAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsMTAsQkZ9ICwgezEsMSxQSU5ULE1BSyAgICAsaTEwYml0LDEsMCwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmMDAwYTgwMCwicm90ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCwxMCxCRn0gLCB7MSwxLFBJTlQsUk9UICAgICxpMTBiaXQsMSwwLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA4MDAwLCJjbHIgICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxDTFIgICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMDg4MDAsInNldCAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULFNFVCAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwOTAwMCwiZXh0ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsRVhUICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweGY0MDA5ODAwLCJleHR1ICAgICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHsxLDEsUElOVCxFWFRVICAgICAgICAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ZjQwMGEwMDAsIm1hayAgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezEsMSxQSU5ULE1BSyAgICAgICAgICwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHhmNDAwYTgwMCwicm90ICAgICAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7MSwxLFBJTlQsUk9UICAgICAgICAgLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwfSAgICxOVUxMIH0sCi0KLSAgezB4ODQwMDI4MDAsImZhZGQuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjg4MCwiZmFkZC5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyYTAwLCJmYWRkLnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhODAsImZhZGQuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjgyMCwiZmFkZC5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyOGEwLCJmYWRkLmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGQUREICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDJhMjAsImZhZGQuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZBREQgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMmFhMCwiZmFkZC5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRkFERCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMDAwLCJmc3ViLnNzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs1LDEsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwODAsImZzdWIuc3NkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzIwMCwiZnN1Yi5zZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjgwLCJmc3ViLnNkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMwMjAsImZzdWIuZHNzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzBhMCwiZnN1Yi5kc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwyLFBGTFQsRlNVQiAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzMjIwLCJmc3ViLmRkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDIsUEZMVCxGU1VCICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDMyYTAsImZzdWIuZGRkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMixQRkxULEZTVUIgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDAwMCwiZm11bC5zc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDgwLCJmbXVsLnNzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAyMDAsImZtdWwuc2RzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDI4MCwiZm11bC5zZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMDIwLCJmbXVsLmRzcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDAwYTAsImZtdWwuZHNkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezksMixQRkxULEZNVUwgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwwLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMDIyMCwiZm11bC5kZHMgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7OSwyLFBGTFQsRk1VTCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAwMmEwLCJmbXVsLmRkZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs5LDIsUEZMVCxGTVVMICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMSwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcwMDAsImZkaXYuc3NzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezMwLDMwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzA4MCwiZmRpdi5zc2QgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDAsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MjAwLCJmZGl2LnNkcyAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDAsMSwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyODAsImZkaXYuc2RkICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwxLDEsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzAyMCwiZmRpdi5kc3MgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3MGEwLCJmZGl2LmRzZCAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2MCw2MCxQRkxULEZESVYgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwxLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDcyMjAsImZkaXYuZGRzICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYwLDYwLFBGTFQsRkRJViAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzJhMCwiZmRpdi5kZGQgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NjAsNjAsUEZMVCxGRElWICAgICAgLDAsMSwxLDEsMCwwLDAsMSwxLDEsMSwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3ODAwLCJmc3FydC5zcyAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDc4MjAsImZzcXJ0LnNkICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULEZMVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNzg4MCwiZnNxcnQuZHMgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA3OGEwLCJmc3FydC5kZCAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDM4MDAsImZjbXAuc3MgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezUsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMzg4MCwiZmNtcC5zZCAgICAgIix7MjEsNSxSRUd9ICAsezE2LDUsUkVHfSAgICx7MCw1LFJFR30gLCB7NiwxLFBGTFQsRkNNUCAgICAgICAgLDAsMSwxLDEsMCwwLDAsMSwwLDEsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAzYTAwLCJmY21wLmRzICAgICAiLHsyMSw1LFJFR30gICx7MTYsNSxSRUd9ICAgLHswLDUsUkVHfSAsIHs2LDEsUEZMVCxGQ01QICAgICAgICAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDNhODAsImZjbXAuZGQgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezAsNSxSRUd9ICwgezYsMSxQRkxULEZDTVAgICAgICAgICwwLDEsMSwxLDAsMCwwLDEsMSwxLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwMjAwMCwiZmx0LnMgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsRkxUICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDAyMDIwLCJmbHQuZCAgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxGTFQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDQ4MDAsImludC5zICAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezUsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNDg4MCwiaW50LmQgICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NiwxLFBGTFQsSU5UICAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1MDAwLCJuaW50LnMgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs1LDEsUEZMVCxJTlQgICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODQwMDUwODAsIm5pbnQuZCAgICAgICIsezIxLDUsUkVHfSAgLHswLDUsUkVHfSAgICAsTk9fT1BFUkFORCAgICwgezYsMSxQRkxULElOVCAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMSwwLDAsMH0gICAsTlVMTCB9LAotICB7MHg4NDAwNTgwMCwidHJuYy5zICAgICAgIix7MjEsNSxSRUd9ICAsezAsNSxSRUd9ICAgICxOT19PUEVSQU5EICAgLCB7NSwxLFBGTFQsVFJOQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDg0MDA1ODgwLCJ0cm5jLmQgICAgICAiLHsyMSw1LFJFR30gICx7MCw1LFJFR30gICAgLE5PX09QRVJBTkQgICAsIHs2LDEsUEZMVCxUUk5DICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDEsMCwwLDB9ICAgLE5VTEwgfSwKLQotICB7MHg4MDAwNDgwMCwiZmxkY3IgICAgICAgIix7MjEsNSxSRUd9ICAsezUsNixGQ1JSRUd9ICxOT19PUEVSQU5EICAgLCB7MSwxLFBGTFQsRkxEQyAgICAgICAgLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwfSAgICxOVUxMIH0sCi0gIHsweDgwMDA4ODAwLCJmc3RjciAgICAgICAiLHsxNiw1LFJFR30gICx7NSw2LEZDUlJFR30gLE5PX09QRVJBTkQgICAsIHsxLDEsUEZMVCxGU1RDICAgICAgICAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDB9ICAgLE5VTEwgfSwKLSAgezB4ODAwMGM4MDAsImZ4Y3IgICAgICAgICIsezIxLDUsUkVHfSAgLHsxNiw1LFJFR30gICAsezUsNixGQ1JSRUd9ICwgezEsMSxQRkxULEZYQyAgICAgICAgICwwLDAsMSwxLDAsMCwwLDEsMCwwLDAsMH0gICAsTlVMTCB9LAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBuZXcgZm9yIHRoZSA4ODExMC4gKi8KLQotICB7MHg4NDAwYWFhMCwiZmFkZC5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhODAsImZhZGQuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYWMwLCJmYWRkLmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWEyMCwiZmFkZC5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFhMDAsImZhZGQuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYTQwLCJmYWRkLmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWIyMCwiZmFkZC5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFiMDAsImZhZGQuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYjQwLCJmYWRkLmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYThhMCwiZmFkZC5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4ODAsImZhZGQuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOGMwLCJmYWRkLnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTgyMCwiZmFkZC5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE4MDAsImZhZGQuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhODQwLCJmYWRkLnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYTkyMCwiZmFkZC5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGE5MDAsImZhZGQuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhOTQwLCJmYWRkLnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWNhMCwiZmFkZC54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjODAsImZhZGQueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhY2MwLCJmYWRkLnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWMyMCwiZmFkZC54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFjMDAsImZhZGQueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhYzQwLCJmYWRkLnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYWQyMCwiZmFkZC54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGFkMDAsImZhZGQueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBhZDQwLCJmYWRkLnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBiYTgwLCJmY21wLnNkZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYTAwLCJmY21wLnNkcyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYjAwLCJmY21wLnNkeCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiODgwLCJmY21wLnNzZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiODAwLCJmY21wLnNzcyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiOTAwLCJmY21wLnNzeCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYzgwLCJmY21wLnN4ZCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiYzAwLCJmY21wLnN4cyAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiZDAwLCJmY21wLnN4eCAgICAiLHsyMSw1LFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGJhYTAsImZjbXB1LnNkZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJhMjAsImZjbXB1LnNkcyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJiMjAsImZjbXB1LnNkeCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4YTAsImZjbXB1LnNzZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI4MjAsImZjbXB1LnNzcyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI5MjAsImZjbXB1LnNzeCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjYTAsImZjbXB1LnN4ZCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJjMjAsImZjbXB1LnN4cyAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGJkMjAsImZjbXB1LnN4eCAgICIsezIxLDUsUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwMDgyMCwiZmN2dC5zZCAgICAgIix7MjEsNSxSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDA4ODAsImZjdnQuZHMgICAgICIsezIxLDUsUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDg4ODAsImZjdnQuZHMgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4YzAsImZjdnQuZHggICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4MjAsImZjdnQuc2QgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg4NDAsImZjdnQuc3ggICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg5MjAsImZjdnQueGQgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg5MDAsImZjdnQueHMgICAgICIsezIxLDUsWFJFR30gLHswLDUsWFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZjJhMCwiZmRpdi5kZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyODAsImZkaXYuZGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMmMwLCJmZGl2LmRkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjIyMCwiZmRpdi5kc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYyMDAsImZkaXYuZHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMjQwLCJmZGl2LmRzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjMyMCwiZmRpdi5keGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYzMDAsImZkaXYuZHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMzQwLCJmZGl2LmR4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjBhMCwiZmRpdi5zZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwODAsImZkaXYuc2RzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMGMwLCJmZGl2LnNkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjAyMCwiZmRpdi5zc2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYwMDAsImZkaXYuc3NzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMDQwLCJmZGl2LnNzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjEyMCwiZmRpdi5zeGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGYxMDAsImZkaXYuc3hzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmMTQwLCJmZGl2LnN4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjRhMCwiZmRpdi54ZGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0ODAsImZkaXYueGRzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNGMwLCJmZGl2LnhkeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjQyMCwiZmRpdi54c2QgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY0MDAsImZkaXYueHNzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNDQwLCJmZGl2LnhzeCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjUyMCwiZmRpdi54eGQgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY1MDAsImZkaXYueHhzICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmNTQwLCJmZGl2Lnh4eCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDAyMjIwLCJmbHQuZHMgICAgICAiLHsyMSw1LFhSRUd9ICx7MCw1LFJFR30gICxOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDIyMDAsImZsdC5zcyAgICAgICIsezIxLDUsWFJFR30gLHswLDUsUkVHfSAgLE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwMjI0MCwiZmx0LnhzICAgICAgIix7MjEsNSxYUkVHfSAsezAsNSxSRUd9ICAsTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMDgyYTAsImZtdWwuZGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjgwLCJmbXVsLmRkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODJjMCwiZm11bC5kZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgyMjAsImZtdWwuZHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MjAwLCJmbXVsLmRzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODI0MCwiZm11bC5kc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgzMjAsImZtdWwuZHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MzAwLCJmbXVsLmR4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODM0MCwiZm11bC5keHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwYTAsImZtdWwuc2RkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDgwLCJmbXVsLnNkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODBjMCwiZm11bC5zZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgwMjAsImZtdWwuc3NkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MDAwLCJmbXVsLnNzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODA0MCwiZm11bC5zc3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDgxMjAsImZtdWwuc3hkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4MTAwLCJmbXVsLnN4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODE0MCwiZm11bC5zeHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0YTAsImZtdWwueGRkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDgwLCJmbXVsLnhkcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODRjMCwiZm11bC54ZHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg0MjAsImZtdWwueHNkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NDAwLCJmbXVsLnhzcyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODQ0MCwiZm11bC54c3ggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMDg1MjAsImZtdWwueHhkICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA4NTAwLCJmbXVsLnh4cyAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwODU0MCwiZm11bC54eHggICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZjhhMCwiZnNxcnQuZGQgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODgwLCJmc3FydC5kcyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4YzAsImZzcXJ0LmR4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjgyMCwiZnNxcnQuc2QgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmODAwLCJmc3FydC5zcyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY4NDAsImZzcXJ0LnN4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZjkyMCwiZnNxcnQueGQgICAgIix7MjEsNSxYUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBmOTAwLCJmc3FydC54cyAgICAiLHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGY5NDAsImZzcXJ0Lnh4ICAgICIsezIxLDUsWFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBiMmEwLCJmc3ViLmRkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjI4MCwiZnN1Yi5kZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyYzAsImZzdWIuZGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMjIwLCJmc3ViLmRzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjIwMCwiZnN1Yi5kc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIyNDAsImZzdWIuZHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMzIwLCJmc3ViLmR4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjMwMCwiZnN1Yi5keHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIzNDAsImZzdWIuZHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMGEwLCJmc3ViLnNkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjA4MCwiZnN1Yi5zZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwYzAsImZzdWIuc2R4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMDIwLCJmc3ViLnNzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjAwMCwiZnN1Yi5zc3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIwNDAsImZzdWIuc3N4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiMTIwLCJmc3ViLnN4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjEwMCwiZnN1Yi5zeHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGIxNDAsImZzdWIuc3h4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNGEwLCJmc3ViLnhkZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQ4MCwiZnN1Yi54ZHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0YzAsImZzdWIueGR4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNDIwLCJmc3ViLnhzZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjQwMCwiZnN1Yi54c3MgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI0NDAsImZzdWIueHN4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBiNTIwLCJmc3ViLnh4ZCAgICAiLHsyMSw1LFhSRUd9ICx7MTYsNSxYUkVHfSAgLHswLDUsWFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwYjUwMCwiZnN1Yi54eHMgICAgIix7MjEsNSxYUkVHfSAsezE2LDUsWFJFR30gICx7MCw1LFhSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGI1NDAsImZzdWIueHh4ICAgICIsezIxLDUsWFJFR30gLHsxNiw1LFhSRUd9ICAsezAsNSxYUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGZjMDAsImlsbG9wIiwgezAsMixERUN9LCBOT19PUEVSQU5ELCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwYzgwMCwiaW50LnNzICAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBjODgwLCJpbnQuc2QgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGM5MDAsImludC5zeCAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDA0MDAwMDAwLCJsZCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDAwMDAwMDAwLCJsZC5kICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDNjMDAwMDAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsMTYsSEVYfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDE0MDAsImxkICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTAwMCwibGQuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxODAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDE1MDAsImxkLnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTEwMCwibGQuZC51c3IgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxOTAwLCJsZC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmMDAwMTYwMCwibGQgICAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDEyMDAsImxkLmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxYTAwLCJsZC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMTcwMCwibGQudXNyICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDEzMDAsImxkLmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAxYjAwLCJsZC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg0MDBjMDAwLCJtb3YucyAgICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGMwODAsIm1vdi5kICAgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwNDIwMCwibW92LnMgICAgICAgIiwgezIxLDUsWFJFR30sIHswLDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDA0MjgwLCJtb3YuZCAgICAgICAiLCB7MjEsNSxYUkVHfSwgezAsNSxSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGMzMDAsIm1vdiAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwNmQwMCwibXVsdS5kICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4NDAwZDA4MCwibmludC5zZCAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkMDAwLCJuaW50LnNzICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODQwMGQxMDAsIm5pbnQuc3ggICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAyMDIwLCJwYWRkLmIgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjA0MCwicGFkZC5oICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwNjAsInBhZGQgICAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDIxZTAsInBhZGRzLnMgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMWEwLCJwYWRkcy5zLmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjFjMCwicGFkZHMucy5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIwZTAsInBhZGRzLnUgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMGEwLCJwYWRkcy51LmIgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjBjMCwicGFkZHMudS5oICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDIxNjAsInBhZGRzLnVzICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAyMTIwLCJwYWRkcy51cy5iICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMjE0MCwicGFkZHMudXMuaCAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMzg2MCwicGNtcCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMDAwMCwicG11bCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwNjI2MCwicHBhY2suMTYgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDYyNDAsInBwYWNrLjE2LmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2NDYwLCJwcGFjay4zMiAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjQyMCwicHBhY2suMzIuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDY0NDAsInBwYWNrLjMyLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDA2MTYwLCJwcGFjay44ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDA3MjAwLCJwcm90ICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7NSw2LEhFWH0sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNzgwMCwicHJvdCAgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHg4ODAwMzAyMCwicHN1Yi5iICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwNDAsInBzdWIuaCAgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMDYwLCJwc3ViICAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweDg4MDAzMWUwLCJwc3Vicy5zICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzFhMCwicHN1YnMucy5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxYzAsInBzdWJzLnMuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMGUwLCJwc3Vicy51ICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzBhMCwicHN1YnMudS5iICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMwYzAsInBzdWJzLnUuaCAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg4MDAzMTYwLCJwc3Vicy51cyAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwMzEyMCwicHN1YnMudXMuYiAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ODgwMDMxNDAsInBzdWJzLnVzLmggICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODgwMDY4MDAsInB1bnBrLm4gICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4ODAwNjgyMCwicHVucGsuYiAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4MzQwMDAwMDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MzAwMDAwMDAsInN0LmQgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4MzgwMDAwMDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCwxNixIRVh9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwMmM4MCwic3QuYi53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDI4ODAsInN0Lmgud3QgICAgICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyNDgwLCJzdC53dCAgICAgICAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjA4MCwic3QuZC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDJkODAsInN0LmIudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGY0MDAyOTgwLCJzdC5oLnVzci53dCAiLCB7MjEsNSxSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjU4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjQwMDIxODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ZjAwMDI0MDAsInN0ICAgICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjAwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMTAwLCJzdC5kLnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIxODAsInN0LmQudXNyLnd0ICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjA4MCwic3QuZC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNTAwLCJzdC51c3IgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI1ODAsInN0LnVzci53dCAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjQ4MCwic3Qud3QgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyODAwLCJzdC54ICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI5MDAsInN0LngudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjk4MCwic3QueC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyODgwLCJzdC54Lnd0ICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUd9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotICB7MHhmNDAwMmY4MCwic3QuYi51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmU4MCwic3QuYi53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjM4MCwic3QuZC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjI4MCwic3QuZC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmI4MCwic3QuaC51c3Iud3QgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMmE4MCwic3QuaC53dCAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjc4MCwic3QudXNyLnd0ICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmNDAwMjY4MCwic3Qud3QgICAgICAgIiwgezIxLDUsUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotCi0gIHsweGYwMDAyNjAwLCJzdCAgICAgICAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjIwMCwic3QuZCAgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDIzMDAsInN0LmQudXNyICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyMzgwLCJzdC5kLnVzci53dCAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjI4MCwic3QuZC53dCAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDI3MDAsInN0LnVzciAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyNzgwLCJzdC51c3Iud3QgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMjY4MCwic3Qud3QgICAgICAgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJhMDAsInN0LnggICAgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweGYwMDAyYjAwLCJzdC54LnVzciAgICAiLCB7MjEsNSxYUkVHfSwgezE2LDUsUkVHfSwgezAsNSxSRUdTQ30sIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHhmMDAwMmI4MCwic3QueC51c3Iud3QgIiwgezIxLDUsWFJFR30sIHsxNiw1LFJFR30sIHswLDUsUkVHU0N9LCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLSAgezB4ZjAwMDJhODAsInN0Lngud3QgICAgICIsIHsyMSw1LFhSRUd9LCB7MTYsNSxSRUd9LCB7MCw1LFJFR1NDfSwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0KLSAgezB4ODQwMGQ4ODAsInRybmMuc2QgICAgICIsIHsyMSw1LFJFR30sIHswLDUsWFJFR30sIE5PX09QRVJBTkQsIHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSwgTlVMTCB9LAotICB7MHg4NDAwZDgwMCwidHJuYy5zcyAgICAgIiwgezIxLDUsUkVHfSwgezAsNSxYUkVHfSwgTk9fT1BFUkFORCwgezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9LCBOVUxMIH0sCi0gIHsweDg0MDBkOTAwLCJ0cm5jLnN4ICAgICAiLCB7MjEsNSxSRUd9LCB7MCw1LFhSRUd9LCBOT19PUEVSQU5ELCB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sIE5VTEwgfSwKLQotfTsKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbWlwcy5oIGIvaW5jbHVkZS9vcGNvZGUvbWlwcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGE4YzdlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL21pcHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyMyArMCwwIEBACi0vKiBtaXBzLmguICBNaXBzIG9wY29kZSBsaXN0IGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJhbHBoIENhbXBiZWxsIGFuZCBPU0YKLSAgIENvbW1lbnRlZCBhbmQgbW9kaWZpZWQgYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfTUlQU19IXwotI2RlZmluZSBfTUlQU19IXwotCi0vKiBUaGVzZSBhcmUgYml0IG1hc2tzIGFuZCBzaGlmdCBjb3VudHMgdG8gdXNlIHRvIGFjY2VzcyB0aGUgdmFyaW91cwotICAgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uLiAgVG8gcmV0cmlldmUgdGhlIFggZmllbGQgb2YgYW4KLSAgIGluc3RydWN0aW9uLCB1c2UgdGhlIGV4cHJlc3Npb24KLQkoaSA+PiBPUF9TSF9YKSAmIE9QX01BU0tfWAotICAgVG8gc2V0IHRoZSBzYW1lIGZpZWxkICh0byBqKSwgdXNlCi0JaSA9IChpICZ+IChPUF9NQVNLX1ggPDwgT1BfU0hfWCkpIHwgKGogPDwgT1BfU0hfWCkKLQotICAgTWFrZSBzdXJlIHlvdSB1c2UgZmllbGRzIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW5zdHJ1Y3Rpb24sCi0gICBvZiBjb3Vyc2UuICAKLQotICAgVGhlICdpJyBmb3JtYXQgdXNlcyBPUCwgUlMsIFJUIGFuZCBJTU1FRElBVEUuICAKLQotICAgVGhlICdqJyBmb3JtYXQgdXNlcyBPUCBhbmQgVEFSR0VULgotCi0gICBUaGUgJ3InIGZvcm1hdCB1c2VzIE9QLCBSUywgUlQsIFJELCBTSEFNVCBhbmQgRlVOQ1QuCi0KLSAgIFRoZSAnYicgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgREVMVEEuCi0KLSAgIFRoZSBmbG9hdGluZyBwb2ludCAnaScgZm9ybWF0IHVzZXMgT1AsIFJTLCBSVCBhbmQgSU1NRURJQVRFLgotCi0gICBUaGUgZmxvYXRpbmcgcG9pbnQgJ3InIGZvcm1hdCB1c2VzIE9QLCBGTVQsIEZULCBGUywgRkQgYW5kIEZVTkNULgotCi0gICBBIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gdXNlcyBPUCwgQ09ERSBhbmQgU1BFQyAoMTAgYml0cyBvZiB0aGUKLSAgIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24gYXJlIG5vdCBkZWZpbmVkOyBLYW5lIHNheXMgdGhlIGJyZWFrcG9pbnQKLSAgIGNvZGUgZmllbGQgaW4gQlJFQUsgaXMgMjAgYml0czsgeWV0IE1JUFMgYXNzZW1ibGVycyBhbmQgZGVidWdnZXJzCi0gICBvbmx5IHVzZSB0ZW4gYml0cykuICBBbiBvcHRpb25hbCB0d28tb3BlcmFuZCBmb3JtIG9mIGJyZWFrL3NkYmJwCi0gICBhbGxvd3MgdGhlIGxvd2VyIHRlbiBiaXRzIHRvIGJlIHNldCB0b28uCi0KLSAgIFRoZSBzeXNjYWxsIGluc3RydWN0aW9uIHVzZXMgU1lTQ0FMTC4KLQotICAgVGhlIGdlbmVyYWwgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zIHVzZSBDT1BaLiAgKi8KLQotI2RlZmluZSBPUF9NQVNLX09QCQkweDNmCi0jZGVmaW5lIE9QX1NIX09QCQkyNgotI2RlZmluZSBPUF9NQVNLX1JTCQkweDFmCi0jZGVmaW5lIE9QX1NIX1JTCQkyMQotI2RlZmluZSBPUF9NQVNLX0ZSCQkweDFmCi0jZGVmaW5lIE9QX1NIX0ZSCQkyMQotI2RlZmluZSBPUF9NQVNLX0ZNVAkJMHgxZgotI2RlZmluZSBPUF9TSF9GTVQJCTIxCi0jZGVmaW5lIE9QX01BU0tfQkNDCQkweDcKLSNkZWZpbmUgT1BfU0hfQkNDCQkxOAotI2RlZmluZSBPUF9NQVNLX0NPREUJCTB4M2ZmCi0jZGVmaW5lIE9QX1NIX0NPREUJCTE2Ci0jZGVmaW5lIE9QX01BU0tfQ09ERTIJCTB4M2ZmCi0jZGVmaW5lIE9QX1NIX0NPREUyCQk2Ci0jZGVmaW5lIE9QX01BU0tfUlQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUlQJCTE2Ci0jZGVmaW5lIE9QX01BU0tfRlQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlQJCTE2Ci0jZGVmaW5lIE9QX01BU0tfQ0FDSEUJCTB4MWYKLSNkZWZpbmUgT1BfU0hfQ0FDSEUJCTE2Ci0jZGVmaW5lIE9QX01BU0tfUkQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUkQJCTExCi0jZGVmaW5lIE9QX01BU0tfRlMJCTB4MWYKLSNkZWZpbmUgT1BfU0hfRlMJCTExCi0jZGVmaW5lIE9QX01BU0tfUFJFRlgJCTB4MWYKLSNkZWZpbmUgT1BfU0hfUFJFRlgJCTExCi0jZGVmaW5lIE9QX01BU0tfQ0NDCQkweDcKLSNkZWZpbmUgT1BfU0hfQ0NDCQk4Ci0jZGVmaW5lIE9QX01BU0tfU1lTQ0FMTAkJMHhmZmZmZgotI2RlZmluZSBPUF9TSF9TWVNDQUxMCQk2Ci0jZGVmaW5lIE9QX01BU0tfU0hBTVQJCTB4MWYKLSNkZWZpbmUgT1BfU0hfU0hBTVQJCTYKLSNkZWZpbmUgT1BfTUFTS19GRAkJMHgxZgotI2RlZmluZSBPUF9TSF9GRAkJNgotI2RlZmluZSBPUF9NQVNLX1RBUkdFVAkJMHgzZmZmZmZmCi0jZGVmaW5lIE9QX1NIX1RBUkdFVAkJMAotI2RlZmluZSBPUF9NQVNLX0NPUFoJCTB4MWZmZmZmZgotI2RlZmluZSBPUF9TSF9DT1BaCQkwCi0jZGVmaW5lIE9QX01BU0tfSU1NRURJQVRFCTB4ZmZmZgotI2RlZmluZSBPUF9TSF9JTU1FRElBVEUJCTAKLSNkZWZpbmUgT1BfTUFTS19ERUxUQQkJMHhmZmZmCi0jZGVmaW5lIE9QX1NIX0RFTFRBCQkwCi0jZGVmaW5lIE9QX01BU0tfRlVOQ1QJCTB4M2YKLSNkZWZpbmUgT1BfU0hfRlVOQ1QJCTAKLSNkZWZpbmUgT1BfTUFTS19TUEVDCQkweDNmCi0jZGVmaW5lIE9QX1NIX1NQRUMJCTAKLSNkZWZpbmUgT1BfU0hfTE9DQyAgICAgICAgICAgICAgOCAgICAgICAvKiBGUCBjb25kaXRpb24gY29kZSAqLwotI2RlZmluZSBPUF9TSF9ISUNDICAgICAgICAgICAgICAxOCAgICAgIC8qIEZQIGNvbmRpdGlvbiBjb2RlICovCi0jZGVmaW5lIE9QX01BU0tfQ0MgICAgICAgICAgICAgIDB4NwotI2RlZmluZSBPUF9TSF9DT1AxTk9STSAgICAgICAgICAyNSAgICAgIC8qIE5vcm1hbCBDT1AxIGVuY29kaW5nICovCi0jZGVmaW5lIE9QX01BU0tfQ09QMU5PUk0gICAgICAgIDB4MSAgICAgLyogYSBzaW5nbGUgYml0ICovCi0jZGVmaW5lIE9QX1NIX0NPUDFTUEVDICAgICAgICAgIDIxICAgICAgLyogQ09QMSBlbmNvZGluZ3MgKi8KLSNkZWZpbmUgT1BfTUFTS19DT1AxU1BFQyAgICAgICAgMHhmCi0jZGVmaW5lIE9QX01BU0tfQ09QMVNDTFIgICAgICAgIDB4NAotI2RlZmluZSBPUF9NQVNLX0NPUDFDTVAgICAgICAgICAweDMKLSNkZWZpbmUgT1BfU0hfQ09QMUNNUCAgICAgICAgICAgNAotI2RlZmluZSBPUF9TSF9GT1JNQVQgICAgICAgICAgICAyMSAgICAgIC8qIEZQIHNob3J0IGZvcm1hdCBmaWVsZCAqLwotI2RlZmluZSBPUF9NQVNLX0ZPUk1BVCAgICAgICAgICAweDcKLSNkZWZpbmUgT1BfU0hfVFJVRSAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19UUlVFICAgICAgICAgICAgMHgxCi0jZGVmaW5lIE9QX1NIX0dFICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIE9QX01BU0tfR0UgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgT1BfU0hfVU5TSUdORUQgICAgICAgICAgMTYKLSNkZWZpbmUgT1BfTUFTS19VTlNJR05FRCAgICAgICAgMHgxCi0jZGVmaW5lIE9QX1NIX0hJTlQgICAgICAgICAgICAgIDE2Ci0jZGVmaW5lIE9QX01BU0tfSElOVCAgICAgICAgICAgIDB4MWYKLSNkZWZpbmUgT1BfU0hfTU1JICAgICAgICAgICAgICAgMCAgICAgICAvKiBNdWx0aW1lZGlhIChwYXJhbGxlbCkgb3AgKi8KLSNkZWZpbmUgT1BfTUFTS19NTUkgICAgICAgICAgICAgMHgzZiAKLSNkZWZpbmUgT1BfU0hfTU1JU1VCICAgICAgICAgICAgNgotI2RlZmluZSBPUF9NQVNLX01NSVNVQiAgICAgICAgICAweDFmCi0jZGVmaW5lIE9QX01BU0tfUEVSRlJFRwkJMHgxZgkvKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nICovCi0jZGVmaW5lIE9QX1NIX1BFUkZSRUcJCTEKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBpbnN0cnVjdGlvbi4gICovCi0KLXN0cnVjdCBtaXBzX29wY29kZQotewotICAvKiBUaGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBBIHN0cmluZyBkZXNjcmliaW5nIHRoZSBhcmd1bWVudHMgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGUgYmFzaWMgb3Bjb2RlIGZvciB0aGUgaW5zdHJ1Y3Rpb24uICBXaGVuIGFzc2VtYmxpbmcsIHRoaXMKLSAgICAgb3Bjb2RlIGlzIG1vZGlmaWVkIGJ5IHRoZSBhcmd1bWVudHMgdG8gcHJvZHVjZSB0aGUgYWN0dWFsIG9wY29kZQotICAgICB0aGF0IGlzIHVzZWQuICBJZiBwaW5mbyBpcyBJTlNOX01BQ1JPLCB0aGVuIHRoaXMgaXMgMC4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7Ci0gIC8qIElmIHBpbmZvIGlzIG5vdCBJTlNOX01BQ1JPLCB0aGVuIHRoaXMgaXMgYSBiaXQgbWFzayBmb3IgdGhlCi0gICAgIHJlbGV2YW50IHBvcnRpb25zIG9mIHRoZSBvcGNvZGUgd2hlbiBkaXNhc3NlbWJsaW5nLiAgSWYgdGhlCi0gICAgIGFjdHVhbCBvcGNvZGUgYW5kZWQgd2l0aCB0aGUgbWF0Y2ggZmllbGQgZXF1YWxzIHRoZSBvcGNvZGUgZmllbGQsCi0gICAgIHRoZW4gd2UgaGF2ZSBmb3VuZCB0aGUgY29ycmVjdCBpbnN0cnVjdGlvbi4gIElmIHBpbmZvIGlzCi0gICAgIElOU05fTUFDUk8sIHRoZW4gdGhpcyBmaWVsZCBpcyB0aGUgbWFjcm8gaWRlbnRpZmllci4gICovCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgLyogRm9yIGEgbWFjcm8sIHRoaXMgaXMgSU5TTl9NQUNSTy4gIE90aGVyd2lzZSwgaXQgaXMgYSBjb2xsZWN0aW9uCi0gICAgIG9mIGJpdHMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb24sIG5vdGFibHkgYW55IHJlbGV2YW50IGhhemFyZAotICAgICBpbmZvcm1hdGlvbi4gICovCi0gIHVuc2lnbmVkIGxvbmcgcGluZm87Ci0gIC8qIEEgY29sbGVjdGlvbiBvZiBiaXRzIGRlc2NyaWJpbmcgdGhlIGluc3RydWN0aW9uIHNldHMgb2Ygd2hpY2ggdGhpcwotICAgICBpbnN0cnVjdGlvbiBvciBtYWNybyBpcyBhIG1lbWJlci4gKi8KLSAgdW5zaWduZWQgbG9uZyBtZW1iZXJzaGlwOwotfTsKLQotLyogVGhlc2UgYXJlIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXJzIGluIHRoZSBhcmdzIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbi4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmllbGRzIGFwcGVhcgotICAgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdXNlZC4gIENvbW1hcyBhbmQgcGFyZW50aGVzZXMgaW4gdGhlIGFyZ3MKLSAgIHN0cmluZyBhcmUgaWdub3JlZCB3aGVuIGFzc2VtYmxpbmcsIGFuZCB3cml0dGVuIGludG8gdGhlIG91dHB1dAotICAgd2hlbiBkaXNhc3NlbWJsaW5nLgotCi0gICBFYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgY29ycmVzcG9uZHMgdG8gYSBtYXNrIGZpZWxkIGRlZmluZWQgYWJvdmUuCi0KLSAgICI8IiA1IGJpdCBzaGlmdCBhbW91bnQgKE9QXypfU0hBTVQpCi0gICAiPiIgc2hpZnQgYW1vdW50IGJldHdlZW4gMzIgYW5kIDYzLCBzdG9yZWQgYWZ0ZXIgc3VidHJhY3RpbmcgMzIgKE9QXypfU0hBTVQpCi0gICAiYSIgMjYgYml0IHRhcmdldCBhZGRyZXNzIChPUF8qX1RBUkdFVCkKLSAgICJiIiA1IGJpdCBiYXNlIHJlZ2lzdGVyIChPUF8qX1JTKQotICAgImMiIDEwIGJpdCBicmVha3BvaW50IGNvZGUgKE9QXypfQ09ERSkKLSAgICJkIiA1IGJpdCBkZXN0aW5hdGlvbiByZWdpc3RlciBzcGVjaWZpZXIgKE9QXypfUkQpCi0gICAiaCIgNSBiaXQgcHJlZnggaGludCAoT1BfKl9QUkVGWCkKLSAgICJpIiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIChPUF8qX0lNTUVESUFURSkKLSAgICJqIiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSAoT1BfKl9ERUxUQSkKLSAgICJrIiA1IGJpdCBjYWNoZSBvcGNvZGUgaW4gdGFyZ2V0IHJlZ2lzdGVyIHBvc2l0aW9uIChPUF8qX0NBQ0hFKQotICAgIm8iIDE2IGJpdCBzaWduZWQgb2Zmc2V0IChPUF8qX0RFTFRBKQotICAgInAiIDE2IGJpdCBQQyByZWxhdGl2ZSBicmFuY2ggdGFyZ2V0IGFkZHJlc3MgKE9QXypfREVMVEEpCi0gICAicSIgMTAgYml0IGV4dHJhIGJyZWFrcG9pbnQgY29kZSAoT1BfKl9DT0RFMikKLSAgICJyIiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIHRhcmdldCAoT1BfKl9SUykKLSAgICJzIiA1IGJpdCBzb3VyY2UgcmVnaXN0ZXIgc3BlY2lmaWVyIChPUF8qX1JTKQotICAgInQiIDUgYml0IHRhcmdldCByZWdpc3RlciAoT1BfKl9SVCkKLSAgICJ1IiAxNiBiaXQgdXBwZXIgMTYgYml0cyBvZiBhZGRyZXNzIChPUF8qX0lNTUVESUFURSkKLSAgICJ2IiA1IGJpdCBzYW1lIHJlZ2lzdGVyIHVzZWQgYXMgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChPUF8qX1JTKQotICAgInciIDUgYml0IHNhbWUgcmVnaXN0ZXIgdXNlZCBhcyBib3RoIHRhcmdldCBhbmQgZGVzdGluYXRpb24gKE9QXypfUlQpCi0gICAiQyIgMjUgYml0IGNvcHJvY2Vzc29yIGZ1bmN0aW9uIGNvZGUgKE9QXypfQ09QWikKLSAgICJCIiAyMCBiaXQgc3lzY2FsbCBmdW5jdGlvbiBjb2RlIChPUF8qX1NZU0NBTEwpCi0gICAieCIgYWNjZXB0IGFuZCBpZ25vcmUgcmVnaXN0ZXIgbmFtZQotICAgInoiIG11c3QgYmUgemVybyByZWdpc3RlcgotCi0gICBGbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnM6Ci0gICAiRCIgNSBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKE9QXypfRkQpCi0gICAiTSIgMyBiaXQgY29tcGFyZSBjb25kaXRpb24gY29kZSAoT1BfKl9DQ0MpIChvbmx5IHVzZWQgZm9yIG1pcHM0IGFuZCB1cCkKLSAgICJOIiAzIGJpdCBicmFuY2ggY29uZGl0aW9uIGNvZGUgKE9QXypfQkNDKSAob25seSB1c2VkIGZvciBtaXBzNCBhbmQgdXApCi0gICAiUyIgNSBiaXQgZnMgc291cmNlIDEgcmVnaXN0ZXIgKE9QXypfRlMpCi0gICAiVCIgNSBiaXQgZnQgc291cmNlIDIgcmVnaXN0ZXIgKE9QXypfRlQpCi0gICAiUiIgNSBiaXQgZnIgc291cmNlIDMgcmVnaXN0ZXIgKE9QXypfRlIpCi0gICAiViIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGZsb2F0aW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE9QXypfRlMpCi0gICAiVyIgNSBiaXQgc2FtZSByZWdpc3RlciB1c2VkIGFzIGZsb2F0aW5nIHRhcmdldCBhbmQgZGVzdGluYXRpb24gKE9QXypfRlQpCi0KLSAgIENvcHJvY2Vzc29yIGluc3RydWN0aW9uczoKLSAgICJFIiA1IGJpdCB0YXJnZXQgcmVnaXN0ZXIgKE9QXypfUlQpCi0gICAiRyIgNSBiaXQgZGVzdGluYXRpb24gcmVnaXN0ZXIgKE9QXypfUkQpCi0gICAiUCIgNSBiaXQgcGVyZm9ybWFuY2UtbW9uaXRvciByZWdpc3RlciAoT1BfKl9QRVJGUkVHKQotCi0gICBNYWNybyBpbnN0cnVjdGlvbnM6Ci0gICAiQSIgR2VuZXJhbCAzMiBiaXQgZXhwcmVzc2lvbgotICAgIkkiIDMyIGJpdCBpbW1lZGlhdGUKLSAgICJGIiA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaW4gLnJkYXRhCi0gICAiTCIgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5saXQ4Ci0gICAiZiIgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gICAibCIgMzIgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50IGluIC5saXQ0Ci0KLSAgIE90aGVyOgotICAgIigpIiBwYXJlbnMgc3Vycm91bmRpbmcgb3B0aW9uYWwgdmFsdWUKLSAgICIsIiAgc2VwYXJhdGVzIG9wZXJhbmRzCi0KLSAgIENoYXJhY3RlcnMgdXNlZCBzbyBmYXIsIGZvciBxdWljayByZWZlcmVuY2Ugd2hlbiBhZGRpbmcgbW9yZToKLSAgICI8PigpLCIKLSAgICJBQkNERUZHSUxNTlNUUlZXIgotICAgImFiY2RmaGlqa2xvcHFyc3R1dnd4eiIKLSovCi0KLS8qIFRoZXNlIGFyZSB0aGUgYml0cyB3aGljaCBtYXkgYmUgc2V0IGluIHRoZSBwaW5mbyBmaWVsZCBvZiBhbgotICAgaW5zdHJ1Y3Rpb25zLCBpZiBpdCBpcyBub3QgZXF1YWwgdG8gSU5TTl9NQUNSTy4gICovCi0KLS8qIE1vZGlmaWVzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SRC4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfR1BSX0QgICAgICAgICAgICAweDAwMDAwMDAxCi0vKiBNb2RpZmllcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUlQuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0dQUl9UICAgICAgICAgICAgMHgwMDAwMDAwMgotLyogTW9kaWZpZXMgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIDMxLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9HUFJfMzEgICAgICAgICAgIDB4MDAwMDAwMDQKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZELiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfRCAgICAgICAgICAgIDB4MDAwMDAwMDgKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZTLiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfUyAgICAgICAgICAgIDB4MDAwMDAwMTAKLS8qIE1vZGlmaWVzIHRoZSBmbG9hdGluZyBwb2ludCByZWdpc3RlciBpbiBPUF8qX0ZULiAgKi8KLSNkZWZpbmUgSU5TTl9XUklURV9GUFJfVCAgICAgICAgICAgIDB4MDAwMDAwMjAKLS8qIFJlYWRzIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaW4gT1BfKl9SUy4gICovCi0jZGVmaW5lIElOU05fUkVBRF9HUFJfUyAgICAgICAgICAgICAweDAwMDAwMDQwCi0vKiBSZWFkcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE9QXypfUlQuICAqLwotI2RlZmluZSBJTlNOX1JFQURfR1BSX1QgICAgICAgICAgICAgMHgwMDAwMDA4MAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlMuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1MgICAgICAgICAgICAgMHgwMDAwMDEwMAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlQuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1QgICAgICAgICAgICAgMHgwMDAwMDIwMAotLyogUmVhZHMgdGhlIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIGluIE9QXypfRlIuICAqLwotI2RlZmluZSBJTlNOX1JFQURfRlBSX1IJCSAgICAweDAwMDAwNDAwCi0vKiBNb2RpZmllcyBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZS4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfQ09ORF9DT0RFICAgICAgICAweDAwMDAwODAwCi0vKiBSZWFkcyBjb3Byb2Nlc3NvciBjb25kaXRpb24gY29kZS4gICovCi0jZGVmaW5lIElOU05fUkVBRF9DT05EX0NPREUgICAgICAgICAweDAwMDAxMDAwCi0vKiBUTEIgb3BlcmF0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl9UTEIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKLS8qIFJlYWRzIGNvcHJvY2Vzc29yIHJlZ2lzdGVyIG90aGVyIHRoYW4gZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX0NPUCAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAotLyogSW5zdHJ1Y3Rpb24gbG9hZHMgdmFsdWUgZnJvbSBtZW1vcnksIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fTE9BRF9NRU1PUllfREVMQVkgICAgICAweDAwMDA4MDAwCi0vKiBJbnN0cnVjdGlvbiBsb2FkcyB2YWx1ZSBmcm9tIGNvcHJvY2Vzc29yLCByZXF1aXJpbmcgZGVsYXkuICAqLwotI2RlZmluZSBJTlNOX0xPQURfQ09QUk9DX0RFTEFZCSAgICAweDAwMDEwMDAwCi0vKiBJbnN0cnVjdGlvbiBoYXMgdW5jb25kaXRpb25hbCBicmFuY2ggZGVsYXkgc2xvdC4gICovCi0jZGVmaW5lIElOU05fVU5DT05EX0JSQU5DSF9ERUxBWSAgICAweDAwMDIwMDAwCi0vKiBJbnN0cnVjdGlvbiBoYXMgY29uZGl0aW9uYWwgYnJhbmNoIGRlbGF5IHNsb3QuICAqLwotI2RlZmluZSBJTlNOX0NPTkRfQlJBTkNIX0RFTEFZICAgICAgMHgwMDA0MDAwMAotLyogQ29uZGl0aW9uYWwgYnJhbmNoIGxpa2VseTogaWYgYnJhbmNoIG5vdCB0YWtlbiwgaW5zbiBudWxsaWZpZWQuICAqLwotI2RlZmluZSBJTlNOX0NPTkRfQlJBTkNIX0xJS0VMWQkgICAgMHgwMDA4MDAwMAotLyogTW92ZXMgdG8gY29wcm9jZXNzb3IgcmVnaXN0ZXIsIHJlcXVpcmluZyBkZWxheS4gICovCi0jZGVmaW5lIElOU05fQ09QUk9DX01PVkVfREVMQVkgICAgICAweDAwMTAwMDAwCi0vKiBMb2FkcyBjb3Byb2Nlc3NvciByZWdpc3RlciBmcm9tIG1lbW9yeSwgcmVxdWlyaW5nIGRlbGF5LiAgKi8KLSNkZWZpbmUgSU5TTl9DT1BST0NfTUVNT1JZX0RFTEFZICAgIDB4MDAyMDAwMDAKLS8qIFJlYWRzIHRoZSBISSByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fUkVBRF9ISQkJICAgIDB4MDA0MDAwMDAKLS8qIFJlYWRzIHRoZSBMTyByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fUkVBRF9MTwkJICAgIDB4MDA4MDAwMDAKLS8qIE1vZGlmaWVzIHRoZSBISSByZWdpc3Rlci4gICovCi0jZGVmaW5lIElOU05fV1JJVEVfSEkJCSAgICAweDAxMDAwMDAwCi0vKiBNb2RpZmllcyB0aGUgTE8gcmVnaXN0ZXIuICAqLwotI2RlZmluZSBJTlNOX1dSSVRFX0xPCQkgICAgMHgwMjAwMDAwMAotLyogVGFrZXMgYSB0cmFwIChlYXNpZXIgdG8ga2VlcCBvdXQgb2YgZGVsYXkgc2xvdCkuICAqLwotI2RlZmluZSBJTlNOX1RSQVAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gc3RvcmVzIHZhbHVlIGludG8gbWVtb3J5LiAgKi8KLSNkZWZpbmUgSU5TTl9TVE9SRV9NRU1PUlkJICAgIDB4MDgwMDAwMDAKLS8qIEluc3RydWN0aW9uIHVzZXMgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludC4gICovCi0jZGVmaW5lIEZQX1MJCQkgICAgMHgxMDAwMDAwMAotLyogSW5zdHJ1Y3Rpb24gdXNlcyBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LiAgKi8KLSNkZWZpbmUgRlBfRAkJCSAgICAweDIwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBpcyBwYXJ0IG9mIHRoZSB0eDM5J3MgaW50ZWdlciBtdWx0aXBseSBmYW1pbHkuICAgICovCi0jZGVmaW5lIElOU05fTVVMVCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCi0vKiBJbnN0cnVjdGlvbiBzeW5jaHJvbml6ZSBzaGFyZWQgbWVtb3J5LiAgKi8KLSNkZWZpbmUgSU5TTl9TWU5DCQkgICAgMHg4MDAwMDAwMAotCi0vKiBJbnN0cnVjdGlvbiBpcyBhY3R1YWxseSBhIG1hY3JvLiAgSXQgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlCi0gICBkaXNhc3NlbWJsZXIsIGFuZCByZXF1aXJlcyBzcGVjaWFsIHRyZWF0bWVudCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLSNkZWZpbmUgSU5TTl9NQUNSTyAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKLQotCi0KLQotCi0vKiBNSVBTIElTQSBmaWVsZC0tQ1BVIGxldmVsIGF0IHdoaWNoIGluc24gaXMgc3VwcG9ydGVkLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EJCSAgICAweDAwMDAwMDBGCi0vKiBBbiBpbnN0cnVjdGlvbiB3aGljaCBpcyBub3QgcGFydCBvZiBhbnkgYmFzaWMgTUlQUyBJU0EuCi0gICAoaWUgaXQgaXMgYSBjaGlwIHNwZWNpZmljIGluc3RydWN0aW9uKSAgKi8KLSNkZWZpbmUgSU5TTl9OT19JU0EJCSAgICAweDAwMDAwMDAwCi0vKiBNSVBTIElTQSAxIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0ExCQkgICAgMHgwMDAwMDAwMQotLyogTUlQUyBJU0EgMiBpbnN0cnVjdGlvbiAoUjYwMDAgb3IgUjQwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EyCQkgICAgMHgwMDAwMDAwMgotLyogTUlQUyBJU0EgMyBpbnN0cnVjdGlvbiAoUjQwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0EzCQkgICAgMHgwMDAwMDAwMwotLyogTUlQUyBJU0EgNCBpbnN0cnVjdGlvbiAoUjgwMDApLiAgKi8KLSNkZWZpbmUgSU5TTl9JU0E0CQkgICAgMHgwMDAwMDAwNAotCi0vKiBDaGlwIHNwZWNpZmljIGluc3RydWN0aW9ucy4gIFRoZXNlIGFyZSBiaXRtYXNrcy4gICovCi0vKiBNSVBTIFI0NjUwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl80NjUwCQkgICAgMHgwMDAwMDAxMAotLyogTFNJIFI0MDEwIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgSU5TTl80MDEwCQkgICAgMHgwMDAwMDAyMAotLyogTkVDIFZSNDEwMCBpbnN0cnVjdGlvbi4gKi8KLSNkZWZpbmUgSU5TTl80MTAwICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLS8qIFRvc2hpYmEgUjM5MDAgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBJTlNOXzM5MDAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotCi0KLS8qIFRoaXMgaXMgYSBsaXN0IG9mIG1hY3JvIGV4cGFuZGVkIGluc3RydWN0aW9ucy4KLSAqCi0gKiBfSSBhcHBlbmRlZCBtZWFucyBpbW1lZGlhdGUKLSAqIF9BIGFwcGVuZGVkIG1lYW5zIGFkZHJlc3MKLSAqIF9BQiBhcHBlbmRlZCBtZWFucyBhZGRyZXNzIHdpdGggYmFzZSByZWdpc3RlcgotICogX0QgYXBwZW5kZWQgbWVhbnMgNjQgYml0IGZsb2F0aW5nIHBvaW50IGNvbnN0YW50Ci0gKiBfUyBhcHBlbmRlZCBtZWFucyAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQKLSAqLwotZW51bSB7Ci0gICAgTV9BQlMsCi0gICAgTV9BRERfSSwKLSAgICBNX0FERFVfSSwKLSAgICBNX0FORF9JLAotICAgIE1fQkVRLAotICAgIE1fQkVRX0ksCi0gICAgTV9CRVFMX0ksCi0gICAgTV9CR0UsCi0gICAgTV9CR0VMLAotICAgIE1fQkdFX0ksCi0gICAgTV9CR0VMX0ksCi0gICAgTV9CR0VVLAotICAgIE1fQkdFVUwsCi0gICAgTV9CR0VVX0ksCi0gICAgTV9CR0VVTF9JLAotICAgIE1fQkdULAotICAgIE1fQkdUTCwKLSAgICBNX0JHVF9JLAotICAgIE1fQkdUTF9JLAotICAgIE1fQkdUVSwKLSAgICBNX0JHVFVMLAotICAgIE1fQkdUVV9JLAotICAgIE1fQkdUVUxfSSwKLSAgICBNX0JMRSwKLSAgICBNX0JMRUwsCi0gICAgTV9CTEVfSSwKLSAgICBNX0JMRUxfSSwKLSAgICBNX0JMRVUsCi0gICAgTV9CTEVVTCwKLSAgICBNX0JMRVVfSSwKLSAgICBNX0JMRVVMX0ksCi0gICAgTV9CTFQsCi0gICAgTV9CTFRMLAotICAgIE1fQkxUX0ksCi0gICAgTV9CTFRMX0ksCi0gICAgTV9CTFRVLAotICAgIE1fQkxUVUwsCi0gICAgTV9CTFRVX0ksCi0gICAgTV9CTFRVTF9JLAotICAgIE1fQk5FLAotICAgIE1fQk5FX0ksCi0gICAgTV9CTkVMX0ksCi0gICAgTV9EQUJTLAotICAgIE1fREFERF9JLAotICAgIE1fREFERFVfSSwKLSAgICBNX0RESVZfMywKLSAgICBNX0RESVZfM0ksCi0gICAgTV9ERElWVV8zLAotICAgIE1fRERJVlVfM0ksCi0gICAgTV9ESVZfMywKLSAgICBNX0RJVl8zSSwKLSAgICBNX0RJVlVfMywKLSAgICBNX0RJVlVfM0ksCi0gICAgTV9ETEFfQUIsCi0gICAgTV9ETEksCi0gICAgTV9ETVVMLAotICAgIE1fRE1VTF9JLCAKLSAgICBNX0RNVUxPLAotICAgIE1fRE1VTE9fSSwgCi0gICAgTV9ETVVMT1UsCi0gICAgTV9ETVVMT1VfSSwgCi0gICAgTV9EUkVNXzMsCi0gICAgTV9EUkVNXzNJLAotICAgIE1fRFJFTVVfMywKLSAgICBNX0RSRU1VXzNJLAotICAgIE1fRFNVQl9JLAotICAgIE1fRFNVQlVfSSwKLSAgICBNX0RTVUJVX0lfMiwKLSAgICBNX0pfQSwKLSAgICBNX0pBTF8xLAotICAgIE1fSkFMXzIsCi0gICAgTV9KQUxfQSwKLSAgICBNX0xfRE9CLAotICAgIE1fTF9EQUIsCi0gICAgTV9MQV9BQiwKLSAgICBNX0xCX0EsCi0gICAgTV9MQl9BQiwKLSAgICBNX0xCVV9BLAotICAgIE1fTEJVX0FCLAotICAgIE1fTERfQSwKLSAgICBNX0xEX09CLAotICAgIE1fTERfQUIsCi0gICAgTV9MREMxX0FCLAotICAgIE1fTERDMl9BQiwKLSAgICBNX0xEQzNfQUIsCi0gICAgTV9MRExfQUIsCi0gICAgTV9MRFJfQUIsCi0gICAgTV9MSF9BLAotICAgIE1fTEhfQUIsCi0gICAgTV9MSFVfQSwKLSAgICBNX0xIVV9BQiwKLSAgICBNX0xJLAotICAgIE1fTElfRCwKLSAgICBNX0xJX0RELAotICAgIE1fTElfUywKLSAgICBNX0xJX1NTLAotICAgIE1fTExfQUIsCi0gICAgTV9MTERfQUIsCi0gICAgTV9MU19BLAotICAgIE1fTFdfQSwKLSAgICBNX0xXX0FCLAotICAgIE1fTFdDMF9BLAotICAgIE1fTFdDMF9BQiwKLSAgICBNX0xXQzFfQSwKLSAgICBNX0xXQzFfQUIsCi0gICAgTV9MV0MyX0EsCi0gICAgTV9MV0MyX0FCLAotICAgIE1fTFdDM19BLAotICAgIE1fTFdDM19BQiwKLSAgICBNX0xXTF9BLAotICAgIE1fTFdMX0FCLAotICAgIE1fTFdSX0EsCi0gICAgTV9MV1JfQUIsCi0gICAgTV9MV1VfQUIsCi0gICAgTV9NVUwsCi0gICAgTV9NVUxfSSwgCi0gICAgTV9NVUxPLAotICAgIE1fTVVMT19JLCAKLSAgICBNX01VTE9VLAotICAgIE1fTVVMT1VfSSwgCi0gICAgTV9OT1JfSSwKLSAgICBNX09SX0ksCi0gICAgTV9SRU1fMywKLSAgICBNX1JFTV8zSSwKLSAgICBNX1JFTVVfMywKLSAgICBNX1JFTVVfM0ksCi0gICAgTV9ST0wsCi0gICAgTV9ST0xfSSwKLSAgICBNX1JPUiwKLSAgICBNX1JPUl9JLAotICAgIE1fU19EQSwKLSAgICBNX1NfRE9CLAotICAgIE1fU19EQUIsCi0gICAgTV9TX1MsCi0gICAgTV9TQ19BQiwKLSAgICBNX1NDRF9BQiwKLSAgICBNX1NEX0EsCi0gICAgTV9TRF9PQiwKLSAgICBNX1NEX0FCLAotICAgIE1fU0RDMV9BQiwKLSAgICBNX1NEQzJfQUIsCi0gICAgTV9TREMzX0FCLAotICAgIE1fU0RMX0FCLAotICAgIE1fU0RSX0FCLAotICAgIE1fU0VRLAotICAgIE1fU0VRX0ksCi0gICAgTV9TR0UsCi0gICAgTV9TR0VfSSwKLSAgICBNX1NHRVUsCi0gICAgTV9TR0VVX0ksCi0gICAgTV9TR1QsCi0gICAgTV9TR1RfSSwKLSAgICBNX1NHVFUsCi0gICAgTV9TR1RVX0ksCi0gICAgTV9TTEUsCi0gICAgTV9TTEVfSSwKLSAgICBNX1NMRVUsCi0gICAgTV9TTEVVX0ksCi0gICAgTV9TTFRfSSwKLSAgICBNX1NMVFVfSSwKLSAgICBNX1NORSwKLSAgICBNX1NORV9JLAotICAgIE1fU0JfQSwKLSAgICBNX1NCX0FCLAotICAgIE1fU0hfQSwKLSAgICBNX1NIX0FCLAotICAgIE1fU1dfQSwKLSAgICBNX1NXX0FCLAotICAgIE1fU1dDMF9BLAotICAgIE1fU1dDMF9BQiwKLSAgICBNX1NXQzFfQSwKLSAgICBNX1NXQzFfQUIsCi0gICAgTV9TV0MyX0EsCi0gICAgTV9TV0MyX0FCLAotICAgIE1fU1dDM19BLAotICAgIE1fU1dDM19BQiwKLSAgICBNX1NXTF9BLAotICAgIE1fU1dMX0FCLAotICAgIE1fU1dSX0EsCi0gICAgTV9TV1JfQUIsCi0gICAgTV9TVUJfSSwKLSAgICBNX1NVQlVfSSwKLSAgICBNX1NVQlVfSV8yLAotICAgIE1fVEVRX0ksCi0gICAgTV9UR0VfSSwKLSAgICBNX1RHRVVfSSwKLSAgICBNX1RMVF9JLAotICAgIE1fVExUVV9JLAotICAgIE1fVE5FX0ksCi0gICAgTV9UUlVOQ1dELAotICAgIE1fVFJVTkNXUywKLSAgICBNX1VMRCwKLSAgICBNX1VMRF9BLAotICAgIE1fVUxILAotICAgIE1fVUxIX0EsCi0gICAgTV9VTEhVLAotICAgIE1fVUxIVV9BLAotICAgIE1fVUxXLAotICAgIE1fVUxXX0EsCi0gICAgTV9VU0gsCi0gICAgTV9VU0hfQSwKLSAgICBNX1VTVywKLSAgICBNX1VTV19BLAotICAgIE1fVVNELAotICAgIE1fVVNEX0EsCi0gICAgTV9YT1JfSSwKLSAgICBNX0NPUDAsCi0gICAgTV9DT1AxLAotICAgIE1fQ09QMiwKLSAgICBNX0NPUDMsCi0gICAgTV9OVU1fTUFDUk9TCi19OwotCi0KLS8qIFRoZSBvcmRlciBvZiBvdmVybG9hZGVkIGluc3RydWN0aW9ucyBtYXR0ZXJzLiAgTGFiZWwgYXJndW1lbnRzIGFuZAotICAgcmVnaXN0ZXIgYXJndW1lbnRzIGxvb2sgdGhlIHNhbWUuIEluc3RydWN0aW9ucyB0aGF0IGNhbiBoYXZlIGVpdGhlcgotICAgZm9yIGFyZ3VtZW50cyBtdXN0IGFwZWFyIGluIHRoZSBjb3JyZWN0IG9yZGVyIGluIHRoaXMgdGFibGUgZm9yIHRoZQotICAgYXNzZW1ibGVyIHRvIHBpY2sgdGhlIHJpZ2h0IG9uZS4gSW4gb3RoZXIgd29yZHMsIGVudHJpZXMgd2l0aAotICAgaW1tZWRpYXRlIG9wZXJhbmRzIG11c3QgYXBlYXIgYWZ0ZXIgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gd2l0aAotICAgcmVnaXN0ZXJzLgotCi0gICBNYW55IGluc3RydWN0aW9ucyBhcmUgc2hvcnQgaGFuZCBmb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zIChpLmUuLCBUaGUKLSAgIGphbCA8cmVnaXN0ZXI+IGluc3RydWN0aW9uIGlzIHNob3J0IGZvciBqYWxyIDxyZWdpc3Rlcj4pLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSBtaXBzX2J1aWx0aW5fb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBiZmRfbWlwc19udW1fYnVpbHRpbl9vcGNvZGVzOwotZXh0ZXJuIHN0cnVjdCBtaXBzX29wY29kZSAqbWlwc19vcGNvZGVzOwotZXh0ZXJuIGludCBiZmRfbWlwc19udW1fb3Bjb2RlczsKLSNkZWZpbmUgTlVNT1BDT0RFUyBiZmRfbWlwc19udW1fb3Bjb2RlcwotCi0MCi0vKiBUaGUgcmVzdCBvZiB0aGlzIGZpbGUgYWRkcyBkZWZpbml0aW9ucyBmb3IgdGhlIG1pcHMxNiBUaW55UklTQwotICAgcHJvY2Vzc29yLiAgKi8KLQotLyogVGhlc2UgYXJlIHRoZSBiaXRtYXNrcyBhbmQgc2hpZnQgY291bnRzIHVzZWQgZm9yIHRoZSBkaWZmZXJlbnQKLSAgIGZpZWxkcyBpbiB0aGUgaW5zdHJ1Y3Rpb24gZm9ybWF0cy4gIE90aGVyIHRoYW4gT1AsIG5vIG1hc2tzIGFyZQotICAgcHJvdmlkZWQgZm9yIHRoZSBmaXhlZCBwb3J0aW9ucyBvZiBhbiBpbnN0cnVjdGlvbiwgc2luY2UgdGhleSBhcmUKLSAgIG5vdCBuZWVkZWQuCi0KLSAgIFRoZSBJIGZvcm1hdCB1c2VzIElNTTExLgotCi0gICBUaGUgUkkgZm9ybWF0IHVzZXMgUlggYW5kIElNTTguCi0KLSAgIFRoZSBSUiBmb3JtYXQgdXNlcyBSWCwgYW5kIFJZLgotCi0gICBUaGUgUlJJIGZvcm1hdCB1c2VzIFJYLCBSWSwgYW5kIElNTTUuCi0KLSAgIFRoZSBSUlIgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgUlouCi0KLSAgIFRoZSBSUklfQSBmb3JtYXQgdXNlcyBSWCwgUlksIGFuZCBJTU00LgotCi0gICBUaGUgU0hJRlQgZm9ybWF0IHVzZXMgUlgsIFJZLCBhbmQgU0hBTVQuCi0KLSAgIFRoZSBJOCBmb3JtYXQgdXNlcyBJTU04LgotCi0gICBUaGUgSThfTU9WUjMyIGZvcm1hdCB1c2VzIFJZIGFuZCBSRUdSMzIuCi0KLSAgIFRoZSBJUl9NT1YzMlIgZm9ybWF0IHVzZXMgUkVHMzJSIGFuZCBNT1YzMlouCi0KLSAgIFRoZSBJNjQgZm9ybWF0IHVzZXMgSU1NOC4KLQotICAgVGhlIFJJNjQgZm9ybWF0IHVzZXMgUlkgYW5kIElNTTUuCi0gICAqLwotCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfT1AJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9PUAkJMTEKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU0xMQkweDdmZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU0xMQkwCi0jZGVmaW5lIE1JUFMxNk9QX01BU0tfUlgJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX1JYCQk4Ci0jZGVmaW5lIE1JUFMxNk9QX01BU0tfSU1NOAkweGZmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX0lNTTgJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JZCTB4NwotI2RlZmluZSBNSVBTMTZPUF9TSF9SWQkJNQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTUJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU01CTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SWgkweDcKLSNkZWZpbmUgTUlQUzE2T1BfU0hfUloJCTIKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19JTU00CTB4ZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU00CTAKLSNkZWZpbmUgTUlQUzE2T1BfTUFTS19SRUdSMzIJMHgxZgotI2RlZmluZSBNSVBTMTZPUF9TSF9SRUdSMzIJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX1JFRzMyUgkweDFmCi0jZGVmaW5lIE1JUFMxNk9QX1NIX1JFRzMyUgkzCi0jZGVmaW5lIE1JUFMxNk9QX0VYVFJBQ1RfUkVHMzJSKGkpICgoKChpKSA+PiA1KSAmIDcpIHwgKChpKSAmIDB4MTgpKQotI2RlZmluZSBNSVBTMTZPUF9NQVNLX01PVkUzMloJMHg3Ci0jZGVmaW5lIE1JUFMxNk9QX1NIX01PVkUzMloJMAotI2RlZmluZSBNSVBTMTZPUF9NQVNLX0lNTTYJMHgzZgotI2RlZmluZSBNSVBTMTZPUF9TSF9JTU02CTUKLQotLyogVGhlc2UgYXJlIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIG1heSBhcHBlYXJzIGluIHRoZSBhcmdzIGZpZWxkIG9mIGFuCi0gICBpbnN0cnVjdGlvbi4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZmllbGRzIGFwcGVhcgotICAgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdXNlZC4gIENvbW1hcyBhbmQgcGFyZW50aGVzZXMgaW4gdGhlIGFyZ3MKLSAgIHN0cmluZyBhcmUgaWdub3JlZCB3aGVuIGFzc2VtYmxpbmcsIGFuZCB3cml0dGVuIGludG8gdGhlIG91dHB1dAotICAgd2hlbiBkaXNhc3NlbWJsaW5nLgotCi0gICAieSIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlkpCi0gICAieCIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlgpCi0gICAieiIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfUlopCi0gICAiWiIgMyBiaXQgcmVnaXN0ZXIgKE1JUFMxNk9QXypfTU9WRTMyWikKLSAgICJ2IiAzIGJpdCBzYW1lIHJlZ2lzdGVyIGFzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gKE1JUFMxNk9QXypfUlgpCi0gICAidyIgMyBiaXQgc2FtZSByZWdpc3RlciBhcyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIChNSVBTMTZPUF8qX1JZKQotICAgIjAiIHplcm8gcmVnaXN0ZXIgKCQwKQotICAgIlMiIHN0YWNrIHBvaW50ZXIgKCRzcCBvciAkMjkpCi0gICAiUCIgcHJvZ3JhbSBjb3VudGVyCi0gICAiUiIgcmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIgKCRyYSBvciAkMzEpCi0gICAiWCIgNSBiaXQgTUlQUyByZWdpc3RlciAoTUlQUzE2T1BfKl9SRUdSMzIpCi0gICAiWSIgNSBiaXQgTUlQUyByZWdpc3RlciAoTUlQUzE2T1BfKl9SRUczMlIpCi0gICAiNiIgNiBiaXQgdW5zaWduZWQgYnJlYWsgY29kZSAoTUlQUzE2T1BfKl9JTU02KQotICAgImEiIDI2IGJpdCBqdW1wIGFkZHJlc3MKLSAgICJlIiAxMSBiaXQgZXh0ZW5zaW9uIHZhbHVlCi0gICAibCIgcmVnaXN0ZXIgbGlzdCBmb3IgZW50cnkgaW5zdHJ1Y3Rpb24KLSAgICJMIiByZWdpc3RlciBsaXN0IGZvciBleGl0IGluc3RydWN0aW9uCi0KLSAgIFRoZSByZW1haW5pbmcgY29kZXMgbWF5IGJlIGV4dGVuZGVkLiAgRXhjZXB0IGFzIG90aGVyd2lzZSBub3RlZCwKLSAgIHRoZSBmdWxsIGV4dGVuZGVkIG9wZXJhbmQgaXMgYSAxNiBiaXQgc2lnbmVkIHZhbHVlLgotICAgIjwiIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWikgKGZ1bGwgNSBiaXQgdW5zaWduZWQpCi0gICAiPiIgMyBiaXQgdW5zaWduZWQgc2hpZnQgY291bnQgKiAwIChNSVBTMTZPUF8qX1JYKSAoZnVsbCA1IGJpdCB1bnNpZ25lZCkKLSAgICJbIiAzIGJpdCB1bnNpZ25lZCBzaGlmdCBjb3VudCAqIDAgKE1JUFMxNk9QXypfUlopIChmdWxsIDYgYml0IHVuc2lnbmVkKQotICAgIl0iIDMgYml0IHVuc2lnbmVkIHNoaWZ0IGNvdW50ICogMCAoTUlQUzE2T1BfKl9SWCkgKGZ1bGwgNiBiaXQgdW5zaWduZWQpCi0gICAiNCIgNCBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNCkgKGZ1bGwgMTUgYml0IHNpZ25lZCkKLSAgICI1IiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTUpCi0gICAiSCIgNSBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogMiAoTUlQUzE2T1BfKl9JTU01KQotICAgIlciIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDQgKE1JUFMxNk9QXypfSU1NNSkKLSAgICJEIiA1IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiA4IChNSVBTMTZPUF8qX0lNTTUpCi0gICAiaiIgNSBiaXQgc2lnbmVkIGltbWVkaWF0ZSAqIDAgKE1JUFMxNk9QXypfSU1NNSkKLSAgICI4IiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpCi0gICAiViIgOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICogNCAoTUlQUzE2T1BfKl9JTU04KQotICAgIkMiIDggYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqIDggKE1JUFMxNk9QXypfSU1NOCkKLSAgICJVIiA4IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKiAwIChNSVBTMTZPUF8qX0lNTTgpIChmdWxsIDE2IGJpdCB1bnNpZ25lZCkKLSAgICJrIiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlICogMCAoTUlQUzE2T1BfKl9JTU04KQotICAgIksiIDggYml0IHNpZ25lZCBpbW1lZGlhdGUgKiA4IChNSVBTMTZPUF8qX0lNTTgpCi0gICAicCIgOCBiaXQgY29uZGl0aW9uYWwgYnJhbmNoIGFkZHJlc3MgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJxIiAxMSBiaXQgYnJhbmNoIGFkZHJlc3MgKE1JUFMxNk9QXypfSU1NMTEpCi0gICAiQSIgOCBiaXQgUEMgcmVsYXRpdmUgYWRkcmVzcyAqIDQgKE1JUFMxNk9QXypfSU1NOCkKLSAgICJCIiA1IGJpdCBQQyByZWxhdGl2ZSBhZGRyZXNzICogOCAoTUlQUzE2T1BfKl9JTU01KQotICAgIkUiIDUgYml0IFBDIHJlbGF0aXZlIGFkZHJlc3MgKiA0IChNSVBTMTZPUF8qX0lNTTUpCi0gICAqLwotCi0vKiBGb3IgdGhlIG1pcHMxNiwgd2UgdXNlIHRoZSBzYW1lIG9wY29kZSB0YWJsZSBmb3JtYXQgYW5kIGEgZmV3IG9mCi0gICB0aGUgc2FtZSBmbGFncy4gIEhvd2V2ZXIsIG1vc3Qgb2YgdGhlIGZsYWdzIGFyZSBkaWZmZXJlbnQuICAqLwotCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWC4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1gJCSAgICAweDAwMDAwMDAxCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWS4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1kJCSAgICAweDAwMDAwMDAyCi0vKiBNb2RpZmllcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1oJCSAgICAweDAwMDAwMDA0Ci0vKiBNb2RpZmllcyB0aGUgVCAoJDI0KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX1QJCSAgICAweDAwMDAwMDA4Ci0vKiBNb2RpZmllcyB0aGUgU1AgKCQyOSkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9XUklURV9TUAkJICAgIDB4MDAwMDAwMTAKLS8qIE1vZGlmaWVzIHRoZSBSQSAoJDMxKSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFXzMxCQkgICAgMHgwMDAwMDAyMAotLyogTW9kaWZpZXMgdGhlIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX1JFRzMyUi4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1dSSVRFX0dQUl9ZCQkgICAgMHgwMDAwMDA0MAotLyogUmVhZHMgdGhlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUlguICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1gJCSAgICAweDAwMDAwMDgwCi0vKiBSZWFkcyB0aGUgcmVnaXN0ZXIgaW4gTUlQUzE2T1BfKl9SWS4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfWQkJICAgIDB4MDAwMDAxMDAKLS8qIFJlYWRzIHRoZSByZWdpc3RlciBpbiBNSVBTMTZPUF8qX01PVkUzMlouICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEX1oJCSAgICAweDAwMDAwMjAwCi0vKiBSZWFkcyB0aGUgVCAoJDI0KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfVAkJICAgIDB4MDAwMDA0MDAKLS8qIFJlYWRzIHRoZSBTUCAoJDI5KSByZWdpc3Rlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfU1AJCSAgICAweDAwMDAwODAwCi0vKiBSZWFkcyB0aGUgUkEgKCQzMSkgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNSVBTMTZfSU5TTl9SRUFEXzMxCQkgICAgMHgwMDAwMTAwMAotLyogUmVhZHMgdGhlIHByb2dyYW0gY291bnRlci4gICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX1JFQURfUEMJCSAgICAweDAwMDAyMDAwCi0vKiBSZWFkcyB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyIGluIE1JUFMxNk9QXypfUkVHUjMyLiAgKi8KLSNkZWZpbmUgTUlQUzE2X0lOU05fUkVBRF9HUFJfWAkJICAgIDB4MDAwMDQwMDAKLS8qIElzIGEgYnJhbmNoIGluc24uICovCi0jZGVmaW5lIE1JUFMxNl9JTlNOX0JSQU5DSCAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKLQotLyogVGhlIGZvbGxvd2luZyBmbGFncyBoYXZlIHRoZSBzYW1lIHZhbHVlIGZvciB0aGUgbWlwczE2IG9wY29kZQotICAgdGFibGU6Ci0gICBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLSAgIElOU05fQ09ORF9CUkFOQ0hfREVMQVkKLSAgIElOU05fQ09ORF9CUkFOQ0hfTElLRUxZIChuZXZlciB1c2VkKQotICAgSU5TTl9SRUFEX0hJCi0gICBJTlNOX1JFQURfTE8KLSAgIElOU05fV1JJVEVfSEkKLSAgIElOU05fV1JJVEVfTE8KLSAgIElOU05fVFJBUAotICAgSU5TTl9JU0EzCi0gICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHMxNl9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IGJmZF9taXBzMTZfbnVtX29wY29kZXM7Ci0KLSNlbmRpZiAvKiBfTUlQU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oIGIvaW5jbHVkZS9vcGNvZGUvbW4xMDIwMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmZhOTRiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL21uMTAyMDAuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKiBtbjEwMjAwLmggLS0gSGVhZGVyIGZpbGUgZm9yIE1hdHN1c2hpdGEgMTAyMDAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSmVmZiBMYXcsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTU4xMDIwMF9ICi0jZGVmaW5lIE1OMTAyMDBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBtbjEwMjAwX29wY29kZS4gICovCi0KLXN0cnVjdCBtbjEwMjAwX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogVGhlIGZvcm1hdCBvZiB0aGlzIG9wY29kZS4gICovCi0gIHVuc2lnbmVkIGNoYXIgZm9ybWF0OwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IG1uMTAyMDBfb3Bjb2RlIG1uMTAyMDBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBtbjEwMjAwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAyMDBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCBtbjEwMjAwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogSG93IGZhciB0aGUgb3BlcmFuZCBpcyBsZWZ0IHNoaWZ0ZWQgaW4gdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIE9uZSBiaXQgc3ludGF4IGZsYWdzLiAgKi8KLSAgaW50IGZsYWdzOwotfTsKLQotLyogRWxlbWVudHMgaW4gdGhlIHRhYmxlIGFyZSByZXRyaWV2ZWQgYnkgaW5kZXhpbmcgd2l0aCB2YWx1ZXMgZnJvbQotICAgdGhlIG9wZXJhbmRzIGZpZWxkIG9mIHRoZSBtbjEwMjAwX29wY29kZXMgdGFibGUuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCBtbjEwMjAwX29wZXJhbmRzW107Ci0KLS8qIFZhbHVlcyBkZWZpbmVkIGZvciB0aGUgZmxhZ3MgZmllbGQgb2YgYSBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kLiAgKi8KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0RSRUcgMHgxCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0FSRUcgMHgyCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX1BTVyAweDQKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTURSIDB4OAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgMHgxMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFIDB4MjAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUEFSRU4gMHg0MAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRCAweDgwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX0VYVEVOREVEIDB4MTAwCi0KLSNkZWZpbmUgTU4xMDIwMF9PUEVSQU5EX05PQ0hFQ0sgMHgyMDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfUENSRUwgMHg0MDAKLQotI2RlZmluZSBNTjEwMjAwX09QRVJBTkRfTUVNQUREUiAweDgwMAotCi0jZGVmaW5lIE1OMTAyMDBfT1BFUkFORF9SRUxBWCAweDEwMDAKLQotI2RlZmluZSBGTVRfMSAxCi0jZGVmaW5lIEZNVF8yIDIKLSNkZWZpbmUgRk1UXzMgMwotI2RlZmluZSBGTVRfNCA0Ci0jZGVmaW5lIEZNVF81IDUKLSNkZWZpbmUgRk1UXzYgNgotI2RlZmluZSBGTVRfNyA3Ci0jZW5kaWYgLyogTU4xMDIwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmggYi9pbmNsdWRlL29wY29kZS9tbjEwMzAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTRiMGIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbW4xMDMwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qIG1uMTAzMDAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTWF0c3VzaGl0YSAxMDMwMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKZWZmIExhdywgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBNTjEwMzAwX0gKLSNkZWZpbmUgTU4xMDMwMF9ICi0KLS8qIFRoZSBvcGNvZGUgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IG1uMTAzMDBfb3Bjb2RlLiAgKi8KLQotI2RlZmluZSBNTjEwMzAwX01BWF9PUEVSQU5EUyA4Ci1zdHJ1Y3QgbW4xMDMwMF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEEgYml0bWFzay4gIEZvciBlYWNoIG9wZXJhbmQsIG5vbnplcm8gaWYgaXQgbXVzdCBub3QgaGF2ZSB0aGUgc2FtZQotICAgICByZWdpc3RlciBzcGVjaWZpY2F0aW9uIGFzIGFsbCBvdGhlciBvcGVyYW5kcyB3aXRoIGEgbm9uemVybyBiaXQgaW4KLSAgICAgdGhpcyBmbGFnLiAgaWUgMHg4MSB3b3VsZCBpbmRpY2F0ZSB0aGF0IG9wZXJhbmRzIDcgYW5kIDAgbXVzdCBub3QKLSAgICAgbWF0Y2guICBOb3RlIHRoYXQgd2UgY291bnQgb3BlcmFuZHMgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFzIHRoZXkgYXBwZWFyCi0gICAgIGluIHRoZSBvcGVyYW5kcyBzcGVjaWZpY2F0aW9uIGJlbG93LiAgKi8KLSAgdW5zaWduZWQgaW50IG5vX21hdGNoX29wZXJhbmRzOwotCi0gIC8qIFRoZSBmb3JtYXQgb2YgdGhpcyBvcGNvZGUuICAqLwotICB1bnNpZ25lZCBjaGFyIGZvcm1hdDsKLQotICAvKiBCaXRtYXNrIGluZGljYXRpbmcgd2hhdCBjcHUgdmFyaWFudHMgdGhpcyBvcGNvZGUgaXMgYXZhaWxhYmxlIG9uLgotICAgICBXZSBhc3N1bWUgbW4xMDMwMCBiYXNlIG9wY29kZXMgYXJlIGF2YWlsYWJsZSBldmVyeXdoZXJlLCBzbyB3ZSBvbmx5Ci0gICAgIGhhdmUgdG8gbm90ZSBvcGNvZGVzIHdoaWNoIGFyZSBhdmFpbGFibGUgb24gb3RoZXIgdmFyaWFudHMuICAqLwotICB1bnNpZ25lZCBpbnQgbWFjaGluZTsKLQotICAvKiBBbiBhcnJheSBvZiBvcGVyYW5kIGNvZGVzLiAgRWFjaCBjb2RlIGlzIGFuIGluZGV4IGludG8gdGhlCi0gICAgIG9wZXJhbmQgdGFibGUuICBUaGV5IGFwcGVhciBpbiB0aGUgb3JkZXIgd2hpY2ggdGhlIG9wZXJhbmRzIG11c3QKLSAgICAgYXBwZWFyIGluIGFzc2VtYmx5IGNvZGUsIGFuZCBhcmUgdGVybWluYXRlZCBieSBhIHplcm8uICAqLwotICB1bnNpZ25lZCBjaGFyIG9wZXJhbmRzW01OMTAzMDBfTUFYX09QRVJBTkRTXTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UKLSAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlcgotICAgaW5zdHJ1Y3Rpb25zLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgbW4xMDMwMF9vcGNvZGVzW107Ci1leHRlcm4gY29uc3QgaW50IG1uMTAzMDBfbnVtX29wY29kZXM7Ci0KLQwKLS8qIFRoZSBvcGVyYW5kcyB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IG1uMTAzMDBfb3BlcmFuZAotewotICAvKiBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIG9wZXJhbmQuICAqLwotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBpbnQgc2hpZnQ7Ci0KLSAgLyogT25lIGJpdCBzeW50YXggZmxhZ3MuICAqLwotICBpbnQgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIG1uMTAzMDBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kIG1uMTAzMDBfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBtbjEwMzAwX29wZXJhbmQuICAqLwotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRFJFRyAweDEKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfQVJFRyAweDIKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1AgMHg0Ci0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BTVyAweDgKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfTURSIDB4MTAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIDB4MjAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUFJPTU9URSAweDQwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1BBUkVOIDB4ODAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVQRUFURUQgMHgxMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUQgMHgyMDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfU1BMSVQgMHg0MDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QgMHg4MDAKLQotI2RlZmluZSBNTjEwMzAwX09QRVJBTkRfUENSRUwgMHgxMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX01FTUFERFIgMHgyMDAwCi0KLSNkZWZpbmUgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIDB4NDAwMAotCi0KLS8qIE9wY29kZSBGb3JtYXRzLiAgKi8KLSNkZWZpbmUgRk1UX1MwIDEKLSNkZWZpbmUgRk1UX1MxIDIKLSNkZWZpbmUgRk1UX1MyIDMKLSNkZWZpbmUgRk1UX1M0IDQKLSNkZWZpbmUgRk1UX1M2IDUKLSNkZWZpbmUgRk1UX0QwIDYKLSNkZWZpbmUgRk1UX0QxIDcKLSNkZWZpbmUgRk1UX0QyIDgKLSNkZWZpbmUgRk1UX0Q0IDkKLSNkZWZpbmUgRk1UX0Q1IDEwCi0KLS8qIFZhcmlhbnRzIG9mIHRoZSBtbjEwMzAwIHdoaWNoIGhhdmUgYWRkaXRpb25hbCBvcGNvZGVzLiAgKi8KLSNkZWZpbmUgTU4xMDMgMzAwCi0jZGVmaW5lIEFNMzAgIDMwMAotCi0KLSNlbmRpZiAvKiBNTjEwMzAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25wMS5oIGIvaW5jbHVkZS9vcGNvZGUvbnAxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2FkYzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvbnAxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyogUHJpbnQgR09VTEQgTlBMIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLUdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGdsZF9vcGNvZGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgY2hhciAqYXJnczsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQKLSAgIGlzIHRoZSBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbgotICAgaXMgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBhdCBtb3N0IGZvdXIuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgYmFzZWQgb24gdGhlIG9wY29kZS4KLQotICAgVGhlIG1hc2sgY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzCi0gICB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICByICBSZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgUiAgUmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICBiICBCYXNlIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBCICBCYXNlIHJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgdiAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBWICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEEgIE9wdGlvbmFsIGFkZHJlc3MgcmVnaXN0ZXIgKGJhc2UgcmVnaXN0ZXIpCi0gICBYICBPcHRpb25hbCBpbmRleCByZWdpc3RlcgotICAgSSAgSW1tZWRpYXRlIGRhdGEgKDE2Yml0cyBzaWduZWQpCi0gICBPICBPZmZzZXQgZmllbGQgKDE2Yml0cyBzaWduZWQpCi0gICBoICBPZmZzZXQgZmllbGQgKDE1Yml0cyBzaWduZWQpCi0gICBkICBPZmZzZXQgZmllbGQgKDE0Yml0cyBzaWduZWQpCi0gICBTICBTaGlmdCBjb3VudCBmaWVsZAotCi0gICBhbnkgb3RoZXIgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBhcyBpcy4uLgotKi8KLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi1zdHJ1Y3QgZ2xkX29wY29kZSBnbGRfb3Bjb2Rlc1tdID0KLXsKLXsgImxiIiwJCTB4YjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5iIiwJMHhiODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYnMiLAkweGVjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxoIiwJCTB4YjQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5oIiwJMHhiODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsdyIsCQkweGI0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxudyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGQiLAkJMHhiNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsbmQiLAkweGI4MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxpIiwJCTB4ZjgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibHBhIiwJMHg1MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYSIsCQkweDUwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxhYnIiLAkweDU4MDgwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxicCIsCTB4OTAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGhwIiwJMHg5MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJsd3AiLAkweDkwMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxkcCIsCTB4OTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VhYnIiLAkweDU4MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgImxmIiwJCTB4YmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibGZiciIsCTB4YmMwODAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAibHdiciIsCTB4NWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAic3RiIiwJMHhkNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGgiLAkweGQ0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN0dyIsCTB4ZDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RkIiwJMHhkNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGYiLAkweGRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZmJyIiwJMHhkYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdHdiciIsCTB4NTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJiLHhPQSxYIiwJNCB9LAoteyAiem1iIiwJMHhkODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWgiLAkweGQ4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInptdyIsCTB4ZDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1kIiwJMHhkODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdGJwIiwJMHg5NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGhwIiwJMHg5NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJzdHdwIiwJMHg5NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGRwIiwJMHg5NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsaWwiLAkweGY4MGIwMDAwLAkweGZjN2YwMDAwLAkicixEIiwJCTQgfSwKLXsgImx3c2wxIiwJMHhlYzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsd3NsMiIsCTB4ZmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdzbDMiLAkweGZjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLQoteyAibHZiIiwJMHhiMDA4MDAwMCwJMHhmYzA4MDAwMCwJInYseE9BLFgiLAk0IH0sCi17ICJsdmgiLAkweGIwMDAwMDAxLAkweGZjMDgwMDAxLAkidix4T0EsWCIsCTQgfSwKLXsgImx2dyIsCTB4YjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ2LHhPQSxYIiwJNCB9LAoteyAibHZkIiwJMHhiMDAwMDAwMiwJMHhmYzA4MDAwMiwJInYseE9BLFgiLAk0IH0sCi17ICJsaXYiLAkweDNjMDQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImxpdmYiLAkweDNjMDgwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN0dmIiLAkweGQwMDgwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dmgiLAkweGQwMDAwMDAxLAkweGZjMDgwMDAxLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dnciLAkweGQwMDAwMDAwLAkweGZjMDgwMDAwLAkidix4T0EsWCIsCTQgfSwKLXsgInN0dmQiLAkweGQwMDAwMDAyLAkweGZjMDgwMDAyLAkidix4T0EsWCIsCTQgfSwKLQoteyAidHJyIiwJMHgyYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm4iLAkweDJjMDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybmQiLAkweDJjMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYWJzIiwJMHgyYzAxMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmFic2QiLAkweDJjMDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyYyIsCTB4MmMwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNyIiwJMHgyODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjeGNyIiwJMHgyYzA2MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJjeGNyZCIsCTB4MmMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidGJyciIsCTB4MmMwMjAwMDAsCTB4ZmMwZjAwMDAsCSJyLEIiLAkJMiB9LAoteyAidHJiciIsCTB4MjgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJiLFIiLAkJMiB9LAoteyAieGNiciIsCTB4MjgwMjAwMDAsCTB4ZmMwZjAwMDAsCSJiLEIiLAkJMiB9LAoteyAidGJyYnIiLAkweDI4MDEwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKLQoteyAidHJ2diIsCTB4MjgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2dm4iLAkweDJjMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydnZuZCIsCTB4MmMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAidHJ2YWIiLAkweDJjMDcwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInRydmFiZCIsCTB4MmMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiY21wdiIsCTB4MTQwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZXhwdiIsCTB4MTQwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmx0IiwJMHgxMDAzMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2bGUiLAkweDEwMDQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZndCIsCTB4MTQwMzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2dmdlIiwJMHgxNDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcnZ2ZXEiLAkweDEwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm1ydnZuZSIsCTB4MTAwNTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXJ2cmx0IiwJMHgxMDBkMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZybGUiLAkweDEwMGUwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJndCIsCTB4MTQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXJ2cmdlIiwJMHgxNDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJtcnZyZXEiLAkweDEwMGYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1ydnJuZSIsCTB4MTQwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAidHJ2ciIsCTB4MTQwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAidHJydiIsCTB4MTQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJidSIsCQkweDQwMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibnMiLAkweDcwMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibmNvIiwJMHg3MDg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmdlIiwJMHg3MTA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYm5lIiwJMHg3MTg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVuZ2UiLAkweDcyMDgwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJidW5sZSIsCTB4NzI4ODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJndCIsCTB4NzMwODAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJuYW55IiwJMHg3Mzg4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnMiCSwJMHg3MDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmNvIiwJMHg3MDgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmx0IiwJMHg3MTAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmVxIiwJMHg3MTgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnVnZSIsCTB4NzIwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImJ1bHQiLAkweDcyODAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJibGUiLAkweDczMDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJiYW55IiwJMHg3MzgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnJsbmsiLAkweDQ0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpYiIsCTB4NDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmloIiwJMHg0ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJiaXciLAkweDRjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImJpZCIsCTB4NGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2YiIsCTB4NjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2aCIsCTB4NjAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2dyIsCTB4NjQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYml2ZCIsCTB4NjQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzYiIsCTB4NjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzaCIsCTB4NjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzdyIsCTB4NmMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYnZzZCIsCTB4NmMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAotCi17ICJjYW1iIiwJMHg4MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1oIiwJMHg4MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJjYW13IiwJMHg4MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1kIiwJMHg4MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJjYXIiLAkweDEwMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNhcmQiLAkweDE0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNpIiwJCTB4ZjgwNTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiY2hrYm5kIiwJMHg1YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgImNhdnYiLAkweDEwMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImNhdnIiLAkweDEwMDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImNhdnZkIiwJMHgxMDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjYXZyZCIsCTB4MTAwYjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJhbm1iIiwJMHg4NDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1oIiwJMHg4NDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhbm13IiwJMHg4NDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhbm1kIiwJMHg4NDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhbnIiLAkweDA0MDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFuaSIsCTB4ZjgwODAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAib3JtYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtdyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JyIiwJMHgwODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJvaSIsCQkweGY4MDkwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImVvbWIiLAkweDhjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWgiLAkweDhjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbXciLAkweDhjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVvbWQiLAkweDhjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImVvciIsCTB4MGMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZW9pIiwJMHhmODBhMDAwMCwJMHhmYzdmMDAwMCwJInIsSSIsCQk0IH0sCi0KLXsgImFudnYiLAkweDA0MDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFudnIiLAkweDA0MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm9ydnYiLAkweDA4MDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgIm9ydnIiLAkweDA4MDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgImVvdnYiLAkweDBjMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImVvdnIiLAkweDBjMDIwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAic2FjeiIsCTB4MTAwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2xhIiwJMHgxYzQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGwiLAkweDFjNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsYyIsCTB4MjQ0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xhZCIsCTB4MjA0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xsZCIsCTB4MjA2MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhIiwJMHgxYzAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmwiLAkweDFjMjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNyYyIsCTB4MjQwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JhZCIsCTB4MjAwMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsZCIsCTB4MjAyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2RhIiwJMHgzYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzZGwiLAkweDNjMDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInNkYyIsCTB4M2MwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RhZCIsCTB4M2MwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic2RsZCIsCTB4M2MwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJzdmRhIiwJMHgzYzA3MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRsIiwJMHgzYzA2MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRjIiwJMHgzYzA1MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdmRhZCIsCTB4M2MwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAic3ZkbGQiLAkweDNjMGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLQoteyAic2JtIiwJMHhhYzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6Ym0iLAkweGFjMDAwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInRibSIsCTB4YTgwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiaW5jbWIiLAkweGEwMDAwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJpbmNtaCIsCTB4YTAwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImluY213IiwJMHhhNDAwMDAwMCwJMHhmYzA4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiaW5jbWQiLAkweGE0MDgwMDAwLAkweGZjMDgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJzYm1kIiwJMHg3YzA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ6Ym1kIiwJMHg3YzAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJ0Ym1kIiwJMHg3ODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi0KLXsgInNzbSIsCTB4OWMwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAienNtIiwJMHg5YzAwMDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ0c20iLAkweDk4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLQoteyAiYWRtYiIsCTB4YzgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtaCIsCTB4YzgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtdyIsCTB4YzgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtZCIsCTB4YzgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRyIiwJMHgzODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhcm1iIiwJMHhlODA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1oIiwJMHhlODAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJhcm13IiwJMHhlODAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhcm1kIiwJMHhlODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZGkiLAkweGY4MDEwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgInN1bWIiLAkweGNjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWgiLAkweGNjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bXciLAkweGNjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWQiLAkweGNjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ciIsCTB4M2MwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VpIiwJMHhmODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsSSIsCQk0IH0sCi17ICJtcG1iIiwJMHhjMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcG1oIiwJMHhjMDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJtcG13IiwJMHhjMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcHIiLAkweDM4MDIwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1wcmQiLAkweDNjMGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm1waSIsCTB4ZjgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZHZtYiIsCTB4YzQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtaCIsCTB4YzQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtdyIsCTB4YzQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZyIiwJMHgzODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkdmkiLAkweGY4MDQwMDAwLAkweGZjMGYwMDAwLAkicixJIiwJCTQgfSwKLXsgImV4cyIsCTB4MzgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJhZHZ2IiwJMHgzMDAwMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHZ2ZCIsCTB4MzAwODAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiYWRydiIsCTB4MzQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiYWRydmQiLAkweDM0MDgwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgInN1dnYiLAkweDMwMDEwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1dnZkIiwJMHgzMDA5MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJzdXJ2IiwJMHgzNDAxMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXJ2ZCIsCTB4MzQwOTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAibXB2diIsCTB4MzAwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXBydiIsCTB4MzQwMjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAotCi17ICJhZGZ3IiwJMHhlMDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJhZGZkIiwJMHhlMDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJhZHJmdyIsCTB4MzgwMTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRyZmQiLAkweDM4MDkwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZ3IiwJMHhlMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdXJmZCIsCTB4ZTAwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3VyZnciLAkweDM4MDMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInN1cmZkIiwJMHgzODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcGZ3IiwJMHhlNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJtcGZkIiwJMHhlNDA4MDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJtcHJmdyIsCTB4MzgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZmQiLAkweDM4MGUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInJmdyIsCTB4ZTQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAicmZkIiwJMHhlNDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJycmZ3IiwJMHgwYzBlMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAicnJmZCIsCTB4MGMwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLQoteyAiYWR2dmZ3IiwJMHgzMDA0MDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJhZHZ2ZmQiLAkweDMwMGMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImFkcnZmdyIsCTB4MzQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAiYWRydmZkIiwJMHgzNDBjMDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXZ2ZnciLAkweDMwMDUwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgInN1dnZmZCIsCTB4MzAwZDAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAic3VydmZ3IiwJMHgzNDA1MDAwMCwJMHhmYzBmMDAwMCwJInYsUiIsCQkyIH0sCi17ICJzdXJ2ZmQiLAkweDM0MGQwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wdnZmdyIsCTB4MzAwNjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAibXB2dmZkIiwJMHgzMDBlMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJtcHJ2ZnciLAkweDM0MDYwMDAwLAkweGZjMGYwMDAwLAkidixSIiwJCTIgfSwKLXsgIm1wcnZmZCIsCTB4MzQwZTAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFIiLAkJMiB9LAoteyAicnZmdyIsCTB4MzAwNzAwMDAsCTB4ZmMwZjAwMDAsCSJ2IiwJCTIgfSwKLXsgInJ2ZmQiLAkweDMwMGYwMDAwLAkweGZjMGYwMDAwLAkidiIsCQkyIH0sCi0KLXsgImZsdHciLAkweDM4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZsdGQiLAkweDM4MGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeHciLAkweDM4MDUwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZpeGQiLAkweDM4MGQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNmcGRzIiwJMHgzYzA5MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi0KLXsgImZsdHZ3IiwJMHgwODBkMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJmbHR2ZCIsCTB4MDgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJ2LFYiLAkJMiB9LAoteyAiZml4dnciLAkweDA4MGMwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLXsgImZpeHZkIiwJMHgwODBlMDAwMCwJMHhmYzBmMDAwMCwJInYsViIsCQkyIH0sCi17ICJjZnB2ZHMiLAkweDBjMGQwMDAwLAkweGZjMGYwMDAwLAkidixWIiwJCTIgfSwKLQoteyAib3J2cm4iLAkweDAwMGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLXsgImFuZHZybiIsCTB4MDAwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAiZnJzdGVxIiwJMHgwNDA5MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtYSIsCTB4MGMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWFkIiwJMHgwYzBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJzaWdtZiIsCTB4MDgwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAic2lnbWZkIiwJMHgwODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJwcm9kZiIsCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAicHJvZGZkIiwJMHgwNDBhMDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtYXh2IiwJMHgxMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsViIsCQkyIH0sCi17ICJtYXh2ZCIsCTB4MTAwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWludiIsCTB4MTQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFYiLAkJMiB9LAoteyAibWludmQiLAkweDE0MGEwMDAwLAkweGZjMGYwMDAwLAkicixWIiwJCTIgfSwKLQoteyAibHBzZCIsCTB4ZjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImxkYyIsCTB4ZjAwODAwMDAsCTB4ZmMwODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgInNwbSIsCTB4MDQwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJwbSIsCTB4MDQwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRyaXRyIiwJMHgwMDA3MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJyaXQiLAkweDAwMDYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJycHN3dCIsCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImV4ciIsCTB4ZjgwNzAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJNCB9LAoteyAiaGFsdCIsCTB4MDAwMDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAid2FpdCIsCTB4MDAwMTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAibm9wIiwJMHgwMDAyMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJlaWFlIiwJMHgwMDAzMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJlZmFlIiwJMHgwMDBkMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJkaWFlIiwJMHgwMDBlMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJkZmFlIiwJMHgwMDBmMDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJzcHZjIiwJMHhmODA2MDAwMCwJMHhmYzBmMDAwMCwJInIsVCxOIiwJNCB9LAoteyAicmRzdHMiLAkweDAwMDkwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJzZXRjcHUiLAkweDAwMGMwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJjbWMiLAkweDAwMGIwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi17ICJ0cnJjdSIsCTB4MDAwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImF0dG5pbyIsCTB4MDAwNTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAiZnVkaXQiLAkweDI4MDgwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImJyZWFrIiwJMHgyODA5MDAwMCwJMHhmYzBmMDAwMCwJIiIsCQkyIH0sCi17ICJmcnpzcyIsCTB4MjgwYTAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAicmlwaSIsCTB4MDQwNDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNwIiwJMHgwNDA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiYmxvY2siLAkweDA0MDYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInVuYmxvY2siLAkweDA0MDcwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgInRyc2MiLAkweDA4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRzY3IiLAkweDA4MDcwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImZxIiwJCTB4MDQwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImZsdXB0ZSIsCTB4MmMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJ2aXUiLAkweDA0MGYwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImxkZWwiLAkweDI4MGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxkdSIsCTB4MjgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3RkZWNjIiwJMHgyODBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cnBjIiwJMHgwODA0MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHBjciIsCTB4MDgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgImdoYWx0IiwJMHgwYzA1MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAiZ3J1biIsCTB4MGMwNDAwMDAsCTB4ZmMwZjAwMDAsCSIiLAkJMiB9LAoteyAidG1wciIsCTB4MmMwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJtcCIsCTB4MmMwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotCi17ICJ0cnJ2ZSIsCTB4MjgwNjAwMDAsCTB4ZmMwZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRydmVyIiwJMHgyODA3MDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAoteyAidHJ2bHIiLAkweDI4MGYwMDAwLAkweGZjMGYwMDAwLAkiciIsCQkyIH0sCi0KLXsgImxpbmtmbCIsCTB4MTgwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua2JsIiwJMHgxODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJsaW5rZnAiLAkweDE4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImxpbmticCIsCTB4MTgwMzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibGlua3BsIiwJMHgxODA0MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ1bGlua2wiLAkweDE4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVsaW5rcCIsCTB4MTgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmt0bCIsCTB4MTgwYTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidWxpbmt0cCIsCTB4MTgwYjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAotfTsKLQotaW50IG51bW9wY29kZXMgPSBzaXplb2YoZ2xkX29wY29kZXMpIC8gc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKLQotc3RydWN0IGdsZF9vcGNvZGUgKmVuZG9wID0gZ2xkX29wY29kZXMgKyBzaXplb2YoZ2xkX29wY29kZXMpIC8KLQkJIAkJc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmggYi9pbmNsdWRlL29wY29kZS9uczMyay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmJiOGI4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL25zMzJrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLyogbnMzMmstb3Bjb2RlLmggLS0gT3Bjb2RlIHRhYmxlIGZvciBOYXRpb25hbCBTZW1pIDMyayBwcm9jZXNzb3IKLSAgIENvcHlyaWdodCAoQykgMTk4NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlci4KLQotR0FTIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpZmRlZiBTRVFVRU5UX0NPTVBBVEFCSUxJVFkKLSNkZWZpbmUgREVGX01PREVDIDIwCi0jZGVmaW5lIERFRl9NT0RFTCAyMQotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVDCi0jZGVmaW5lIERFRl9NT0RFQyAyMAotI2VuZGlmCi0KLSNpZm5kZWYgREVGX01PREVMCi0jZGVmaW5lIERFRl9NT0RFTCAyMAotI2VuZGlmCi0vKgotICAgQWZ0ZXIgZGVjaWRpbmcgdGhlIGluc3RydWN0aW9uIGVudHJ5ICh2aWEgaGFzaC5jKSB0aGUgaW5zdHJ1Y3Rpb24gcGFyc2VyCi0gICB3aWxsIHRyeSB0byBtYXRjaCB0aGUgb3BlcmFuZHMgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIHRvIHRoZSByZXF1aXJlZCBzZXQKLSAgIGdpdmVuIGluIHRoZSBlbnRyeSBvcGVyYW5kZmllbGQuIEV2ZXJ5IG9wZXJhbmQgd2lsbCByZXN1bHQgaW4gYSBjaGFuZ2UgaW4KLSAgIHRoZSBvcGNvZGUgb3IgdGhlIGFkZGl0aW9uIG9mIGRhdGEgdG8gdGhlIG9wY29kZS4KLSAgIFRoZSBvcGVyYW5kcyBpbiB0aGUgc291cmNlIGluc3RydWN0aW9uIGFyZSBjaGVja2VkIGZvciBpbmNvbnNpc3RlbnQKLSAgIHNlbWFudGljcy4KLSAKLQlGIDogMzIgYml0IGZsb2F0CWdlbmVyYWwgZm9ybQotCUwgOiA2NCBiaXQgZmxvYXQJICAgICIKLQlCIDogYnl0ZQkJICAgICIKLQlXIDogd29yZAkJICAgICIKLQlEIDogZG91YmxlLXdvcmQJCSAgICAiCi0JQSA6IGRvdWJsZS13b3JkCQlnZW4tYWRkcmVzcy1mb3JtIGllIG5vIHJlZ3MsIG5vIGltbWVkaWF0ZQotCUkgOiBpbnRlZ2VyIHdyaXRlYWJsZSAgIGdlbiBpbnQgZXhjZXB0IGltbWVkaWF0ZSAoQSArIHJlZykKLQlaIDogZmxvYXRpbmcgd3JpdGVhYmxlCWdlbiBmbG9hdCBleGNlcHQgaW1tZWRpYXRlIChaICsgZnJlZykKLQlkIDogZGlzcGxhY2VtZW50Ci0JYiA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcgIGFjYgotCXAgOiBkaXNwbGFjZW1lbnQgLSBwYyByZWxhdGl2ZSBhZGRyZXNzaW5nICBiciBiY29uZCBic3IgY3hwCi0JcSA6IHF1aWNrCi0JaSA6IGltbWVkaWF0ZSAoOCBiaXRzKQotCSAgICBUaGlzIGlzIG5vdCBhIHN0YW5kYXJkIG5zMzJrIG9wZXJhbmR0eXBlLCBpdCBpcyB1c2VkIHRvIGJ1aWxkCi0JICAgIGluc3RydWN0aW9ucyBsaWtlICAgIHN2YyBhcmcxLGFyZzIKLQkgICAgU3ZjIGlzIHRoZSBpbnN0cnVjdGlvbiBTdXBlclZpc29yQ2FsbCBhbmQgaXMgc29tZXRpbWVzIHVzZWQgdG8KLQkgICAgY2FsbCBPUy1yb3V0aW5lcyBmcm9tIHVzZXJtb2RlLiBTb21lIGFyZ3MgbWlnaHQgYmUgaGFuZHkhCi0JciA6IHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKQotCU8gOiBzZXRjZmcgaW5zdHJ1Y3Rpb24gb3B0aW9uc2xpc3QKLQlDIDogY2ludiBpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCVMgOiBzdHJpbmdpbnN0cnVjdGlvbiBvcHRpb25zbGlzdAotCVUgOiByZWdpc3Rlcmxpc3QJc2F2ZSxlbnRlcgotCXUgOiByZWdpc3Rlcmxpc3QJcmVzdG9yZSxleGl0Ci0JTSA6IG1tdSByZWdpc3RlcgotCVAgOiBjcHUgcmVnaXN0ZXIKLQlnIDogMzpyZCBvcGVyYW5kIG9mIGluc3Mgb3IgZXh0cyBpbnN0cnVjdGlvbgotCUcgOiA0OnRoIG9wZXJhbmQgb2YgaW5zcyBvciBleHRzIGluc3RydWN0aW9uCi0JICAgIFRob3NlIG9wZXJhbmRzIGFyZSBlbmNvZGVkIGluIHRoZSBzYW1lIGJ5dGUuCi0JICAgIFRoaXMgYnl0ZSBpcyBwbGFjZWQgbGFzdCBpbiB0aGUgaW5zdHJ1Y3Rpb24uCi0JZiA6IG9wZXJhbmQgb2Ygc2ZzcgotCUggOiBzZXF1ZW50LWhhY2sgZm9yIGJzciAoV2FybmluZykKLQotY29sdW1uCTEgCWluc3RydWN0aW9ucwotCTIgCW51bWJlciBvZiBiaXRzIGluIG9wY29kZS4KLQkzIAludW1iZXIgb2YgYml0cyBpbiBvcGNvZGUgZXhwbGljaXRseQotCQlkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0cnVjdGlvbiB0eXBlLgotCTQgCW9wY29kZXNlZWQsIHRoZSBudW1iZXIgd2UgYnVpbGQgb3VyIG9wY29kZQotCQlmcm9tLgotCTUgCW9wZXJhbmR0eXBlcywgdXNlZCBieSBvcGVyYW5kcGFyc2VyLgotCTYgCXNpemUgaW4gYnl0ZXMgb2YgaW1tZWRpYXRlCi0qLwotc3RydWN0IG5zMzJrX29wY29kZSB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlX2lkX3NpemU7IC8qIG5vdCB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgKi8KLSAgdW5zaWduZWQgY2hhciBvcGNvZGVfc2l6ZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGVfc2VlZDsKLSAgY2hhciAqb3BlcmFuZHM7Ci0gIHVuc2lnbmVkIGNoYXIgaW1fc2l6ZTsJLyogbm90IHVzZWQgYnkgZGlzc2Fzc2VtYmxlciAqLwotICBjaGFyICpkZWZhdWx0X2FyZ3M7CQkvKiBkZWZhdWx0IHRvIHRob3NlIGFyZ3Mgd2hlbiBub25lIGdpdmVuICovCi0gIGNoYXIgZGVmYXVsdF9tb2RlYzsJCS8qIGRlZmF1bHQgdG8gdGhpcyBhZGRyLW1vZGUgd2hlbiBhbWJpZ291cwotCQkJCSAgIGllIHdoZW4gdGhlIGFyZ3VtZW50IG9mIGEgZ2VuZXJhbCBhZGRyLW1vZGUKLQkJCQkgICBpcyBhIHBsYWluIGNvbnN0YW50ICovCi0gIGNoYXIgZGVmYXVsdF9tb2RlbDsJCS8qIGlzIGEgcGxhaW4gbGFiZWwgKi8KLX07Ci0KLSNpZmRlZiBjb21tZW50Ci0vKiBUaGlzIHNlY3Rpb24gd2FzIGZyb20gdGhlIGdkYiB2ZXJzaW9uIG9mIHRoaXMgZmlsZS4gKi8KLQotI2lmbmRlZiBuczMya19vcGNvZGVUCi0jZGVmaW5lIG5zMzJrX29wY29kZVQgaW50Ci0jZW5kaWYgLyogbm8gbnMzMmtfb3Bjb2RlVCAqLwotCi1zdHJ1Y3Qgbm90X3dvdAkJCS8qIG5zMzJrIG9wY29kZSB0YWJsZTogd290IHRvIGRvIHdpdGggdGhpcyAqLwotCQkJCS8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGludCBvYml0czsJCS8qIG51bWJlciBvZiBvcGNvZGUgYml0cyAqLwotICBpbnQgaWJpdHM7CQkvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gYml0cyAqLwotICBuczMya19vcGNvZGVUCWNvZGU7CS8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi0gIGNoYXIgKmFyZ3M7CQkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotfTsKLQotc3RydWN0IG5vdAkJCS8qIG5zMzJrIG9wY29kZSB0ZXh0ICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIG5hbWU7CS8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IG5vdF93b3QgICAgZGV0YWlsOwkvKiByZXN0IG9mIG9wY29kZSB0YWJsZSAgICAgICAgICBbZGF0dW1dICovCi19OwotCi0vKiBJbnN0cnVjdGlvbnMgbG9vayBsaWtlIHRoaXM6Ci0gICAgCi0gICBiYXNpYyBpbnN0cnVjdGlvbi0tMSwgMiwgb3IgMyBieXRlcwotICAgaW5kZXggYnl0ZSBmb3Igb3BlcmFuZCBBLCBpZiBvcGVyYW5kIEEgaXMgaW5kZXhlZC0tMSBieXRlCi0gICBpbmRleCBieXRlIGZvciBvcGVyYW5kIEIsIGlmIG9wZXJhbmQgQiBpcyBpbmRleGVkLS0xIGJ5dGUKLSAgIGFkZHJlc3NpbmcgZXh0ZW5zaW9uIGZvciBvcGVyYW5kIEEKLSAgIGFkZHJlc3NpbmcgZXh0ZW5zaW9uIGZvciBvcGVyYW5kIEIKLSAgIGltcGxpZWQgb3BlcmFuZHMKLQotICAgT3BlcmFuZCBBIGlzIHRoZSBvcGVyYW5kIGxpc3RlZCBmaXJzdCBpbiB0aGUgZm9sbG93aW5nIG9wY29kZSB0YWJsZS4KLSAgIE9wZXJhbmQgQiBpcyB0aGUgb3BlcmFuZCBsaXN0ZWQgc2Vjb25kIGluIHRoZSBmb2xsb3dpbmcgb3Bjb2RlIHRhYmxlLgotICAgQWxsIGluc3RydWN0aW9ucyBoYXZlIGF0IG1vc3QgMiBnZW5lcmFsIG9wZXJhbmRzLCBzbyB0aGlzIGlzIGVub3VnaC4KLSAgIFRoZSBpbXBsaWVkIG9wZXJhbmRzIGFyZSBhc3NvY2lhdGVkIHdpdGggb3BlcmFuZHMgb3RoZXIgdGhhbiBBIGFuZCBCLgotCi0gICBFYWNoIG9wZXJhbmQgaGFzIGEgZGlnaXQgYW5kIGEgbGV0dGVyLgotICAgCi0gICBUaGUgZGlnaXQgZ2l2ZXMgdGhlIHBvc2l0aW9uIGluIHRoZSBhc3NlbWJseSBsYW5ndWFnZS4gIFRoZSBsZXR0ZXIsCi0gICBvbmUgb2YgdGhlIGZvbGxvd2luZywgdGVsbHMgdXMgd2hhdCBraW5kIG9mIG9wZXJhbmQgaXQgaXMuICAqLwotCi0vKiBGIDogMzIgYml0IGZsb2F0Ci0gKiBMIDogNjQgYml0IGZsb2F0Ci0gKiBCIDogYnl0ZQotICogVyA6IHdvcmQKLSAqIEQgOiBkb3VibGUtd29yZAotICogSSA6IGludGVnZXIgbm90IGltbWVkaWF0ZQotICogWiA6IGZsb2F0aW5nIG5vdCBpbW1lZGlhdGUKLSAqIGQgOiBkaXNwbGFjZW1lbnQKLSAqIHEgOiBxdWljawotICogaSA6IGltbWVkaWF0ZSAoOCBiaXRzKQotICogciA6IHJlZ2lzdGVyIG51bWJlciAoMyBiaXRzKQotICogcCA6IGRpc3BsYWNlbWVudCAtIHBjIHJlbGF0aXZlIGFkZHJlc3NpbmcKLSovCi0KLQotI2VuZGlmIC8qIGNvbW1lbnQgKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgbnMzMmtfb3Bjb2Rlc1tdPQotewotICB7ICJhYnNmIiwJMTQsMjQsCTB4MzViZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzbCIsCTE0LDI0LAkweDM0YmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFic2IiLAkxNCwyNCwJMHgzMDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhYnN3IiwJMTQsMjQsCTB4MzE0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWJzZCIsCTE0LDI0LAkweDMzNGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYmIiLAkgNywxNiwJMHg0YywJIjJJMXEzcCIsCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYnciLAkgNywxNiwJMHg0ZCwJIjJJMXEzcCIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFjYmQiLAkgNywxNiwJMHg0ZiwJIjJJMXEzcCIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGYiLAkxNCwyNCwJMHgwMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRsIiwJMTQsMjQsCTB4MDBiZSwgIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkYiIsCSA2LDE2LAkweDAwLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGR3IiwJIDYsMTYsCTB4MDEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZGQiLAkgNiwxNiwJMHgwMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY2IiLAkgNiwxNiwJMHgxMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY3ciLAkgNiwxNiwJMHgxMSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkY2QiLAkgNiwxNiwJMHgxMywJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcGIiLAkxNCwyNCwJMHgzYzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhZGRwdyIsCTE0LDI0LAkweDNkNGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkZHBkIiwJMTQsMjQsCTB4M2Y0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcWIiLAkgNywxNiwJMHgwYywJIjJJMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcXciLAkgNywxNiwJMHgwZCwJIjJJMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkcWQiLAkgNywxNiwJMHgwZiwJIjJJMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRkciIsCSA2LDE2LAkweDI3LAkiMUEySSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAiYWRqc3BiIiwJMTEsMTYsCTB4MDU3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFkanNwdyIsCTExLDE2LAkweDA1N2QsCSIxVyIsIAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYWRqc3BkIiwJMTEsMTYsCTB4MDU3ZiwJIjFEIiwgCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhbmRiIiwJIDYsMTYsCTB4MjgsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFuZHciLAkgNiwxNiwJMHgyOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYW5kZCIsCSA2LDE2LAkweDJiLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJhc2hiIiwJMTQsMjQsCTB4MDQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYXNodyIsCTE0LDI0LAkweDA1NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImFzaGQiLAkxNCwyNCwJMHgwNzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiZXEiLAkgOCw4LAkweDBhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJuZSIsCSA4LDgsCTB4MWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmNzIiwJIDgsOCwJMHgyYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiY2MiLAkgOCw4LAkweDNhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJoaSIsCSA4LDgsCTB4NGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmxzIiwJIDgsOCwJMHg1YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZ3QiLAkgOCw4LAkweDZhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsZSIsCSA4LDgsCTB4N2EsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmZzIiwJIDgsOCwJMHg4YSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJiZmMiLAkgOCw4LAkweDlhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJsbyIsCSA4LDgsCTB4YWEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYmhzIiwJIDgsOCwJMHhiYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJibHQiLAkgOCw4LAkweGNhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJnZSIsCSA4LDgsCTB4ZGEsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiYnV0IiwJIDgsOCwJMHhlYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotICB7ICJidWYiLAkgOCw4LAkweGZhLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0gIHsgImJpY2IiLAkgNiwxNiwJMHgwOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmljdyIsCSA2LDE2LAkweDA5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNkIiwJIDYsMTYsCTB4MGIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpY3BzcmIiLAkxMSwxNiwJMHgxN2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJiaWNwc3J3IiwJMTEsMTYsCTB4MTdkLAkiMVciLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiYmlzcHNyYiIsCTExLDE2LAkweDM3YywJIjFCIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJpc3BzcnciLAkxMSwxNiwJMHgzN2QsCSIxVyIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJicHQiLAkgOCw4LAkweGYyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImJyIiwJIDgsOCwJMHhlYSwJIjFwIiwJCTAsCSIiLAkyMSwyMQl9LAotI2lmZGVmIFNFUVVFTlRfQ09NUEFUQUJJTElUWQotICB7ICJic3IiLAkgOCw4LAkweDAyLAkiMUgiLAkJMCwJIiIsCTIxLDIxCX0sCi0jZWxzZQotICB7ICJic3IiLAkgOCw4LAkweDAyLAkiMXAiLAkJMCwJIiIsCTIxLDIxCX0sCi0jZW5kaWYKLSAgeyAiY2FzZWIiLAkxMSwxNiwJMHg3N2MsCSIxQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYXNldyIsCTExLDE2LAkweDc3ZCwJIjFXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNhc2VkIiwJMTEsMTYsCTB4NzdmLAkiMUQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGIiLAkxNCwyNCwJMHgwODRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjYml0dyIsCTE0LDI0LAkweDA5NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNiaXRkIiwJMTQsMjQsCTB4MGI0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGliIiwJMTQsMjQsCTB4MGM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGl3IiwJMTQsMjQsCTB4MGQ0ZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2JpdGlkIiwJMTQsMjQsCTB4MGY0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2tiIiwJMTEsMjQsCTB4MGVlLAkiMkEzQjFyIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2t3IiwJMTEsMjQsCTB4MWVlLAkiMkEzVzFyIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2hlY2tkIiwJMTEsMjQsCTB4M2VlLAkiMkEzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY2ludiIsCTE0LDI0LAkweDI3MWUsCSIyRDFDIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGYiLAkxNCwyNCwJMHgwOWJlLAkiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBsIiwJMTQsMjQsCTB4MDhiZSwJIjFMMkwiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wYiIsCSA2LDE2LAkweDA0LAkiMUIyQiIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXB3IiwJIDYsMTYsCTB4MDUsCSIxVzJXIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcGQiLAkgNiwxNiwJMHgwNywJIjFEMkQiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbWIiLAkxNCwyNCwJMHgwNGNlLAkiMUEyQTNiIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbXciLAkxNCwyNCwJMHgwNWNlLAkiMUEyQTNiIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wbWQiLAkxNCwyNCwJMHgwN2NlLAkiMUEyQTNiIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcWIiLAkgNywxNiwJMHgxYywJIjJCMXEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcXciLAkgNywxNiwJMHgxZCwJIjJXMXEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wcWQiLAkgNywxNiwJMHgxZiwJIjJEMXEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc2IiLAkxNiwyNCwJMHgwNDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjbXBzdyIsCTE2LDI0LAkweDA1MGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNtcHNkIiwJMTYsMjQsCTB4MDcwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY21wc3QiLAkxNiwyNCwJMHg4NDBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjb21iIiwJMTQsMjQsCTB4MzQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiY29tdyIsCTE0LDI0LAkweDM1NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImNvbWQiLAkxNCwyNCwJMHgzNzRlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJjdnRwIiwJMTEsMjQsCTB4MDM2ZSwJIjJBM0QxciIsCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImN4cCIsCSA4LDgsCTB4MjIsCSIxcCIsCQkwLAkiIiwJMjEsMjEJfSwKLSAgeyAiY3hwZCIsCTExLDE2LAkweDA3ZiwJIjFBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRlaWIiLAkxNCwyNCwJMHgyY2NlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkZWl3IiwJMTQsMjQsCTB4MmRjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGVpZCIsCTE0LDI0LAkweDJmY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpYSIsCSA4LDgsCTB4YzIsCSIiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2ZiIsCTE0LDI0LAkweDIxYmUsCSIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmwiLAkxNCwyNCwJMHgyMGJlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJkaXZiIiwJMTQsMjQsCTB4M2NjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZGl2dyIsCTE0LDI0LAkweDNkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRpdmQiLAkxNCwyNCwJMHgzZmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJlbnRlciIsCSA4LDgsCTB4ODIsCSIxVTJkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4aXQiLAkgOCw4LAkweDkyLAkiMXUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0YiIsCTExLDI0LAkweDAyZSwJIjJJM0IxcjRkIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0dyIsCTExLDI0LAkweDEyZSwJIjJJM1cxcjRkIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0ZCIsCTExLDI0LAkweDMyZSwJIjJJM0QxcjRkIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZXh0c2IiLAkxNCwyNCwJMHgwY2NlLAkiMUkySTRHM2ciLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJleHRzdyIsCTE0LDI0LAkweDBkY2UsCSIxSTJJNEczZyIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImV4dHNkIiwJMTQsMjQsCTB4MGZjZSwJIjFJMkk0RzNnIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmZzYiIsCTE0LDI0LAkweDA0NmUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZmc3ciLAkxNCwyNCwJMHgwNTZlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmZnNkIiwJMTQsMjQsCTB4MDc2ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxhZyIsCSA4LDgsCTB4ZDIsCSIiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JmYiIsCTE0LDI0LAkweDNjM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29yZnciLAkxNCwyNCwJMHgzZDNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmZkIiwJMTQsMjQsCTB4M2YzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZmxvb3JsYiIsCTE0LDI0LAkweDM4M2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImZsb29ybHciLAkxNCwyNCwJMHgzOTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJmbG9vcmxkIiwJMTQsMjQsCTB4M2IzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaWJpdGIiLAkxNCwyNCwJMHgzODRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpYml0dyIsCTE0LDI0LAkweDM5NGUsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImliaXRkIiwJMTQsMjQsCTB4M2I0ZSwJIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXhiIiwJMTEsMjQsCTB4NDJlLAkiMkIzQjFyIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXh3IiwJMTEsMjQsCTB4NTJlLAkiMlczVzFyIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5kZXhkIiwJMTEsMjQsCTB4NzJlLAkiMkQzRDFyIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zYiIsCTExLDI0LAkweDBhZSwJIjJCM0kxcjRkIiwJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zdyIsCTExLDI0LAkweDFhZSwJIjJXM0kxcjRkIiwJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zZCIsCTExLDI0LAkweDNhZSwJIjJEM0kxcjRkIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiaW5zc2IiLAkxNCwyNCwJMHgwOGNlLAkiMUIySTRHM2ciLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJpbnNzdyIsCTE0LDI0LAkweDA5Y2UsCSIxVzJJNEczZyIsCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImluc3NkIiwJMTQsMjQsCTB4MGJjZSwJIjFEMkk0RzNnIiwJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAianNyIiwJMTEsMTYsCTB4NjdmLAkiMUEiLAkJNCwJIiIsCTIxLDIxCX0sCi0gIHsgImp1bXAiLAkxMSwxNiwJMHgyN2YsCSIxQSIsCQk0LAkiIiwJMjEsMjEJfSwKLSAgeyAibGZzciIsCTE5LDI0LAkweDAwZjNlLCIxRCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsbXIiLAkxNSwyNCwJMHgwYjFlLAkiMkQxTSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJscHJiIiwJIDcsMTYsCTB4NmMsCSIyQjFQIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxwcnciLAkgNywxNiwJMHg2ZCwJIjJXMVAiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHByZCIsCSA3LDE2LAkweDZmLAkiMkQxUCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsc2hiIiwJMTQsMjQsCTB4MTQ0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibHNodyIsCTE0LDI0LAkweDE1NGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImxzaGQiLAkxNCwyNCwJMHgxNzRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtZWliIiwJMTQsMjQsCTB4MjRjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibWVpdyIsCTE0LDI0LAkweDI1Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1laWQiLAkxNCwyNCwJMHgyN2NlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb2RiIiwJMTQsMjQsCTB4MzhjZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW9kdyIsCTE0LDI0LAkweDM5Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vZGQiLAkxNCwyNCwJMHgzYmNlLAkiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZmIiwJMTQsMjQsCTB4MDViZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bCIsCTE0LDI0LAkweDA0YmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmIiLAkgNiwxNiwJMHgxNCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92dyIsCSA2LDE2LAkweDE1LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkIiwJIDYsMTYsCTB4MTcsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmJmIiwJMTQsMjQsCTB4MDQzZSwJIjFCMloiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92d2YiLAkxNCwyNCwJMHgwNTNlLAkiMVcyWiIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkZiIsCTE0LDI0LAkweDA3M2UsCSIxRDJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmJsIiwJMTQsMjQsCTB4MDAzZSwJIjFCMloiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92d2wiLAkxNCwyNCwJMHgwMTNlLAkiMVcyWiIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZkbCIsCTE0LDI0LAkweDAzM2UsCSIxRDJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdmZsIiwJMTQsMjQsCTB4MWIzZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92bGYiLAkxNCwyNCwJMHgxNjNlLAkiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtYiIsCTE0LDI0LAkweDAwY2UsCSIxQTJBM2IiLAkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtdyIsCTE0LDI0LAkweDAxY2UsCSIxQTJBM2IiLAkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZtZCIsCTE0LDI0LAkweDAzY2UsCSIxQTJBM2IiLAk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxYiIsCSA3LDE2LAkweDVjLAkiMkkxcSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxdyIsCSA3LDE2LAkweDVkLAkiMkkxcSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZxZCIsCSA3LDE2LAkweDVmLAkiMkkxcSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzYiIsCTE2LDI0LAkweDAwMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN3IiwJMTYsMjQsCTB4MDEwZSwJIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibW92c2QiLAkxNiwyNCwJMHgwMzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtb3ZzdCIsCTE2LDI0LAkweDgwMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1YiIsCTE0LDI0LAkweDBjYWUsCSIxQTJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1dyIsCTE0LDI0LAkweDBkYWUsCSIxQTJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnN1ZCIsCTE0LDI0LAkweDBmYWUsCSIxQTJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzYiIsCTE0LDI0LAkweDFjYWUsCSIxQTJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzdyIsCTE0LDI0LAkweDFkYWUsCSIxQTJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnVzZCIsCTE0LDI0LAkweDFmYWUsCSIxQTJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnhiZCIsCTE0LDI0LAkweDFjY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnh3ZCIsCTE0LDI0LAkweDFkY2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnhidyIsCTE0LDI0LAkweDEwY2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnpiZCIsCTE0LDI0LAkweDE4Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnp3ZCIsCTE0LDI0LAkweDE5Y2UsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm1vdnpidyIsCTE0LDI0LAkweDE0Y2UsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bGYiLAkxNCwyNCwJMHgzMWJlLAkiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxsIiwJMTQsMjQsCTB4MzBiZSwJIjFMMloiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibXVsYiIsCTE0LDI0LAkweDIwY2UsICIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm11bHciLAkxNCwyNCwJMHgyMWNlLCAiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJtdWxkIiwJMTQsMjQsCTB4MjNjZSwgIjFEMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVnZiIsCTE0LDI0LAkweDE1YmUsICIxRjJaIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2wiLAkxNCwyNCwJMHgxNGJlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJuZWdiIiwJMTQsMjQsCTB4MjA0ZSwgIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibmVndyIsCTE0LDI0LAkweDIxNGUsICIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5lZ2QiLAkxNCwyNCwJMHgyMzRlLCAiMUQySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3AiLAkgOCw4LAkweGEyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm5vdGIiLAkxNCwyNCwJMHgyNDRlLCAiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJub3R3IiwJMTQsMjQsCTB4MjU0ZSwgIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAibm90ZCIsCTE0LDI0LAkweDI3NGUsICIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIm9yYiIsCSA2LDE2LAkweDE4LAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJvcnciLAkgNiwxNiwJMHgxOSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAib3JkIiwJIDYsMTYsCTB4MWIsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInF1b2IiLAkxNCwyNCwJMHgzMGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJxdW93IiwJMTQsMjQsCTB4MzFjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicXVvZCIsCTE0LDI0LAkweDMzY2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJkdmFsIiwJMTksMjQsCTB4MDAzMWUsIjFBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlbWIiLAkxNCwyNCwJMHgzNGNlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyZW13IiwJMTQsMjQsCTB4MzVjZSwJIjFXMkkiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmVtZCIsCTE0LDI0LAkweDM3Y2UsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJlc3RvcmUiLAkgOCw4LAkweDcyLAkiMXUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicmV0IiwJIDgsOCwJMHgxMiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldGkiLAkgOCw4LAkweDUyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJldHQiLAkgOCw4LAkweDQyLAkiMWQiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm90YiIsCTE0LDI0LAkweDAwNGUsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdHciLAkxNCwyNCwJMHgwMTRlLAkiMUIySSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3RkIiwJMTQsMjQsCTB4MDM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRmYiIsCTE0LDI0LAkweDI0M2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kZnciLAkxNCwyNCwJMHgyNTNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGZkIiwJMTQsMjQsCTB4MjczZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicm91bmRsYiIsCTE0LDI0LAkweDIwM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInJvdW5kbHciLAkxNCwyNCwJMHgyMTNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJyb3VuZGxkIiwJMTQsMjQsCTB4MjMzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAicnhwIiwJIDgsOCwJMHgzMiwJIjFkIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcWIiLAkxMSwxNiwJMHgzYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcXciLAkxMSwxNiwJMHgzZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNlcWQiLAkxMSwxNiwJMHgzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZWIiLAkxMSwxNiwJMHhiYywJIjFCIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZXciLAkxMSwxNiwJMHhiZCwJIjFXIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNuZWQiLAkxMSwxNiwJMHhiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjc2IiLAkxMSwxNiwJMHgxM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY3N3IiwJMTEsMTYsCTB4MTNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NzZCIsCTExLDE2LAkweDEzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNjY2IiLAkxMSwxNiwJMHgxYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2N3IiwJMTEsMTYsCTB4MWJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NjZCIsCTExLDE2LAkweDFiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoaWIiLAkxMSwxNiwJMHgyM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaGl3IiwJMTEsMTYsCTB4MjNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hpZCIsCTExLDE2LAkweDIzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsc2IiLAkxMSwxNiwJMHgyYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHN3IiwJMTEsMTYsCTB4MmJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xzZCIsCTExLDE2LAkweDJiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNndGIiLAkxMSwxNiwJMHgzM2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ3R3IiwJMTEsMTYsCTB4MzNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2d0ZCIsCTExLDE2LAkweDMzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsZWIiLAkxMSwxNiwJMHgzYmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbGV3IiwJMTEsMTYsCTB4M2JkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xlZCIsCTExLDE2LAkweDNiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc2IiLAkxMSwxNiwJMHg0M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZnN3IiwJMTEsMTYsCTB4NDNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZzZCIsCTExLDE2LAkweDQzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmY2IiLAkxMSwxNiwJMHg0YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZmN3IiwJMTEsMTYsCTB4NGJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2ZjZCIsCTExLDE2LAkweDRiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsb2IiLAkxMSwxNiwJMHg1M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbG93IiwJMTEsMTYsCTB4NTNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2xvZCIsCTExLDE2LAkweDUzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNoc2IiLAkxMSwxNiwJMHg1YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzaHN3IiwJMTEsMTYsCTB4NWJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2hzZCIsCTExLDE2LAkweDViZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNsdGIiLAkxMSwxNiwJMHg2M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbHR3IiwJMTEsMTYsCTB4NjNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2x0ZCIsCTExLDE2LAkweDYzZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNnZWIiLAkxMSwxNiwJMHg2YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzZ2V3IiwJMTEsMTYsCTB4NmJkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2dlZCIsCTExLDE2LAkweDZiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1dGIiLAkxMSwxNiwJMHg3M2MsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdXR3IiwJMTEsMTYsCTB4NzNkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3V0ZCIsCTExLDE2LAkweDczZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1ZmIiLAkxMSwxNiwJMHg3YmMsCSIxQiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWZ3IiwJMTEsMTYsCTB4N2JkLAkiMVciLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VmZCIsCTExLDE2LAkweDdiZiwJIjFEIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNhdmUiLAkgOCw4LAkweDYyLAkiMVUiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGIiLCAgICAxNCwyNCwJMHgxODRlLAkiMUIyQSIsCQkxLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzYml0dyIsCTE0LDI0LAkweDE5NGUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNiaXRkIiwJMTQsMjQsCTB4MWI0ZSwJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGliIiwJMTQsMjQsCTB4MWM0ZSwJIjFCMkEiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGl3IiwJMTQsMjQsCTB4MWQ0ZSwJIjFXMkEiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2JpdGlkIiwJMTQsMjQsCTB4MWY0ZSwJIjFEMkEiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2V0Y2ZnIiwJMTUsMjQsCTB4MGIwZSwJIjFPIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNmc3IiLAkxNCwyNCwJMHgzNzNlLAkiMWYiLAkJMCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc2IiLAkxNiwyNCwJMHgwYzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJza3BzdyIsCTE2LDI0LAkweDBkMGUsCSIxUyIsCQkwLAkiW10iLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNrcHNkIiwJMTYsMjQsCTB4MGYwZSwgIjFTIiwJCTAsCSJbXSIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2twc3QiLAkxNiwyNCwJMHg4YzBlLAkiMVMiLAkJMCwJIltdIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzbXIiLAkxNSwyNCwJMHgwZjFlLAkiMkkxTSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzcHJiIiwJIDcsMTYsCTB4MmMsCSIySTFQIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInNwcnciLAkgNywxNiwJMHgyZCwJIjJJMVAiLAkJMiwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3ByZCIsCSA3LDE2LAkweDJmLAkiMkkxUCIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJmIiwJMTQsMjQsCTB4MTFiZSwJIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VibCIsCTE0LDI0LAkweDEwYmUsCSIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmIiLAkgNiwxNiwJMHgyMCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VidyIsCSA2LDE2LAkweDIxLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJkIiwJIDYsMTYsCTB4MjMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmNiIiwJIDYsMTYsCTB4MzAsCSIxQjJJIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmN3IiwJIDYsMTYsCTB4MzEsCSIxVzJJIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YmNkIiwJIDYsMTYsCTB4MzMsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInN1YnBiIiwJMTQsMjQsCTB4MmM0ZSwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic3VicHciLAkxNCwyNCwJMHgyZDRlLAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzdWJwZCIsCTE0LDI0LAkweDJmNGUsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0jaWZkZWYgTlMzMktfU1ZDX0lNTUVEX09QRVJBTkRTCi0gIHsgInN2YyIsCSA4LDgsCTB4ZTIsCSIyaTFpIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sIC8qIG5vdCByZWFsbHksIGJ1dCBzb21lIHVuaXggdXNlcyBpdCAqLwotI2Vsc2UKLSAgeyAic3ZjIiwJIDgsOCwJMHhlMiwJIiIsCQkwLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotI2VuZGlmCi0gIHsgInRiaXRiIiwJIDYsMTYsCTB4MzQsCSIxQjJBIiwJCTEsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRiaXR3IiwJIDYsMTYsCTB4MzUsCSIxVzJBIiwJCTIsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRiaXRkIiwJIDYsMTYsCTB4MzcsCSIxRDJBIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jZmIiLAkxNCwyNCwJMHgyYzNlLAkiMUYySSIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2Z3IiwJMTQsMjQsCTB4MmQzZSwJIjFGMkkiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNmZCIsCTE0LDI0LAkweDJmM2UsCSIxRjJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInRydW5jbGIiLAkxNCwyNCwJMHgyODNlLAkiMUwySSIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ0cnVuY2x3IiwJMTQsMjQsCTB4MjkzZSwJIjFMMkkiLAkJOCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAidHJ1bmNsZCIsCTE0LDI0LAkweDJiM2UsCSIxTDJJIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIndhaXQiLAkgOCw4LAkweGIyLAkiIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgIndydmFsIiwJMTksMjQsCTB4MDA3MWUsIjFBIiwJCTAsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgInhvcmIiLAkgNiwxNiwJMHgzOCwJIjFCMkkiLAkJMSwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAieG9ydyIsCSA2LDE2LAkweDM5LAkiMVcySSIsCQkyLAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJ4b3JkIiwJIDYsMTYsCTB4M2IsCSIxRDJJIiwJCTQsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi0gIHsgImRvdGYiLAkxNCwyNCwgIDB4MGRmZSwgIjFGMkYiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAiZG90bCIsCTE0LDI0LCAgMHgwY2ZlLCAiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsb2diZiIsCTE0LDI0LCAgMHgxNWZlLCAiMUYyWiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJsb2dibCIsCTE0LDI0LCAgMHgxNGZlLCAiMUwyWiIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJwb2x5ZiIsCTE0LDI0LCAgMHgwOWZlLCAiMUYyRiIsCQk0LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJwb2x5bCIsCTE0LDI0LCAgMHgwOGZlLCAiMUwyTCIsCQk4LAkiIiwJREVGX01PREVDLERFRl9NT0RFTAl9LAotICB7ICJzY2FsYmYiLAkxNCwyNCwgIDB4MTFmZSwgIjFGMloiLAkJNCwJIiIsCURFRl9NT0RFQyxERUZfTU9ERUwJfSwKLSAgeyAic2NhbGJsIiwJMTQsMjQsICAweDEwZmUsICIxTDJaIiwJCTgsCSIiLAlERUZfTU9ERUMsREVGX01PREVMCX0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50IG51bW9wY29kZXM9c2l6ZW9mKG5zMzJrX29wY29kZXMpL3NpemVvZihuczMya19vcGNvZGVzWzBdKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcGNvZGUgKmNvbnN0IGVuZG9wID0gbnMzMmtfb3Bjb2RlcytzaXplb2YobnMzMmtfb3Bjb2Rlcykvc2l6ZW9mKG5zMzJrX29wY29kZXNbMF0pOwotCi0jZGVmaW5lIE1BWF9BUkdTIDQKLSNkZWZpbmUgQVJHX0xFTiA1MAotCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS9wbi5oIGIvaW5jbHVkZS9vcGNvZGUvcG4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1OWEyYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9wbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qIFByaW50IEdPVUxEIFBOIChQb3dlck5vZGUpIGluc3RydWN0aW9ucyBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTg2LCAxOTg3LCAxOTg5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIuCi0KLUdEQiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdEQjsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotc3RydWN0IGdsZF9vcGNvZGUKLXsKLSAgY2hhciAqbmFtZTsKLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLSAgY2hhciAqYXJnczsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLS8qIFdlIHN0b3JlIGZvdXIgYnl0ZXMgb2Ygb3Bjb2RlIGZvciBhbGwgb3Bjb2RlcyBiZWNhdXNlIHRoYXQKLSAgIGlzIHRoZSBtb3N0IGFueSBvZiB0aGVtIG5lZWQuICBUaGUgYWN0dWFsIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbgotICAgaXMgYWx3YXlzIGF0IGxlYXN0IDIgYnl0ZXMsIGFuZCBhdCBtb3N0IGZvdXIuICBUaGUgbGVuZ3RoIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gaXMgYmFzZWQgb24gdGhlIG9wY29kZS4KLQotICAgVGhlIG1hc2sgY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoCi0gICBwYXJ0aWN1bGFyIG9wY29kZSBpbiBvcmRlciBmb3IgYW4gaW5zdHJ1Y3Rpb24gdG8gYmUgYW4gaW5zdGFuY2UKLSAgIG9mIHRoYXQgb3Bjb2RlLgotCi0gICBUaGUgYXJncyBjb21wb25lbnQgaXMgYSBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzCi0gICB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCB0aGUgYXJndW1lbnRzIHRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICByICBSZWdpc3RlciBpbiBmaXJzdCBmaWVsZAotICAgUiAgUmVnaXN0ZXIgaW4gc2Vjb25kIGZpZWxkCi0gICBiICBCYXNlIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBCICBCYXNlIHJlZ2lzdGVyIGluIHNlY29uZCBmaWVsZAotICAgdiAgVmVjdG9yIHJlZ2lzdGVyIGluIGZpcnN0IGZpZWxkCi0gICBWICBWZWN0b3IgcmVnaXN0ZXIgaW4gZmlyc3QgZmllbGQKLSAgIEEgIE9wdGlvbmFsIGFkZHJlc3MgcmVnaXN0ZXIgKGJhc2UgcmVnaXN0ZXIpCi0gICBYICBPcHRpb25hbCBpbmRleCByZWdpc3RlcgotICAgSSAgSW1tZWRpYXRlIGRhdGEgKDE2Yml0cyBzaWduZWQpCi0gICBPICBPZmZzZXQgZmllbGQgKDE2Yml0cyBzaWduZWQpCi0gICBoICBPZmZzZXQgZmllbGQgKDE1Yml0cyBzaWduZWQpCi0gICBkICBPZmZzZXQgZmllbGQgKDE0Yml0cyBzaWduZWQpCi0gICBTICBTaGlmdCBjb3VudCBmaWVsZAotCi0gICBhbnkgb3RoZXIgY2hhcmFjdGVycyBhcmUgcHJpbnRlZCBhcyBpcy4uLgotKi8KLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi1zdHJ1Y3QgZ2xkX29wY29kZSBnbGRfb3Bjb2Rlc1tdID0KLXsKLXsgImFibSIsCTB4YTAwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAiYWJyIiwJMHgxODA4MDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCi17ICJhY2kiLAkweGZjNzcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImFkZmQiLAkweGUwMDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFkZnciLAkweGUwMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFkaSIsCTB4YzgwMTAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiYWRtYiIsCTB4YjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtZCIsCTB4YjgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtaCIsCTB4YjgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRtdyIsCTB4YjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYWRyIiwJMHgzODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJhZHJmZCIsCTB4MzgwOTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYWRyZnciLAkweDM4MDEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFkcm0iLAkweDM4MDgwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImFpIiwgCTB4ZmMwMzAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImFubWIiLAkweDg0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWQiLAkweDg0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImFubWgiLAkweDg0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImFubXciLAkweDg0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImFuciIsCTB4MDQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiYXJtYiIsCTB4ZTgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtZCIsCTB4ZTgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtaCIsCTB4ZTgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiYXJtdyIsCTB4ZTgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiYmNmIiwJMHhmMDAwMDAwMCwJMHhmYzA4MDAwMCwJIkkseE9BLFgiLAk0IH0sCi17ICJiY3QiLAkweGVjMDAwMDAwLAkweGZjMDgwMDAwLAkiSSx4T0EsWCIsCTQgfSwKLXsgImJlaSIsCTB4MDAwNjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiYmZ0IiwJMHhmMDAwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYmliIiwJMHhmNDAwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmlkIiwJMHhmNDYwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmloIiwJMHhmNDIwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYml3IiwJMHhmNDQwMDAwMCwJMHhmYzc4MDAwMCwJInIseE9BIiwJNCB9LAoteyAiYmwiLCAJMHhmODgwMDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAiYnN1YiIsCTB4NWMwODAwMDAsCTB4ZmY4ZjAwMDAsCSIiLAkJMiB9LAoteyAiYnN1Ym0iLAkweDI4MDgwMDAwLAkweGZjMDgwMDAwLAkiIiwJCTQgfSwKLXsgImJ1IiwgCTB4ZWMwMDAwMDAsCTB4ZmY4ODAwMDAsCSJ4T0EsWCIsCTQgfSwKLXsgImNhbGwiLAkweDI4MDgwMDAwLAkweGZjMGYwMDAwLAkiIiwJCTIgfSwKLXsgImNhbGxtIiwJMHg1YzA4MDAwMCwJMHhmZjg4MDAwMCwJIiIsCQk0IH0sCi17ICJjYW1iIiwJMHg5MDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1kIiwJMHg5MDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJjYW1oIiwJMHg5MDAwMDAwMSwJMHhmYzA4MDAwMSwJInIseE9BLFgiLAk0IH0sCi17ICJjYW13IiwJMHg5MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIueE9BLFgiLAk0IH0sCi17ICJjYXIiLAkweDEwMDAwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgImNkIiwgCTB4ZmMwNjAwMDAsCTB4ZmMwNzAwMDAsCSJyLGYiLAkJNCB9LAoteyAiY2VhIiwJMHgwMDBmMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJjaSIsIAkweGM4MDUwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgImNtYyIsCTB4MDQwYTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImNtbWIiLAkweDk0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbWQiLAkweDk0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbWgiLAkweDk0MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImNtbXciLAkweDk0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImNtciIsCTB4MTQwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZGFjaSIsCTB4ZmM3ZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiZGFlIiwJMHgwMDBlMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJkYWkiLAkweGZjMDQwMDAwLAkweGZjMDdmZmZmLAkiSSIsCQk0IH0sCi17ICJkY2kiLAkweGZjNmYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgImRpIiwgCTB4ZmMwMTAwMDAsCTB4ZmMwN2ZmZmYsCSJJIiwJCTQgfSwKLXsgImR2ZmQiLAkweGU0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImR2ZnciLAkweGU0MDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImR2aSIsCTB4YzgwNDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAiZHZtYiIsCTB4YzQwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtaCIsCTB4YzQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZtdyIsCTB4YzQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZHZyIiwJMHgzODBhMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJkdnJmZCIsCTB4MzgwYzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJNCB9LAoteyAiZHZyZnciLAkweDM4MDQwMDAwLAkweGZjMGYwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImVhZSIsCTB4MDAwODAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiZWNpIiwJMHhmYzY3MDAwMCwJMHhmYzdmODA4MCwJInIsSSIsCQk0IH0sCi17ICJlY3djcyIsCTB4ZmM0ZjAwMDAsCTB4ZmM3ZjgwMDAsCSIiLAkJNCB9LAoteyAiZWkiLCAJMHhmYzAwMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAiZW9tYiIsCTB4OGMwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tZCIsCTB4OGMwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9taCIsCTB4OGMwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9tdyIsCTB4OGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiZW9yIiwJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJlb3JtIiwJMHgwYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJlcyIsIAkweDAwMDQwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJleG0iLAkweGE4MDAwMDAwLAkweGZmODgwMDAwLAkieE9BLFgiLAk0IH0sCi17ICJleHIiLAkweGM4MDcwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJleHJyIiwJMHhjODA3MDAwMiwJMHhmYzdmMDAwMiwJInIiLAkJMiB9LAoteyAiZml4ZCIsCTB4MzgwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZml4dyIsCTB4MzgwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZmx0ZCIsCTB4MzgwZjAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZmx0dyIsCTB4MzgwNzAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiZ3JpbyIsCTB4ZmMzZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAiaGFsdCIsCTB4MDAwMDAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAiaGlvIiwJMHhmYzM3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJqd2NzIiwJMHhmYTA4MDAwMCwJMHhmZjg4MDAwMCwJInhPQSxYIiwJNCB9LAoteyAibGEiLCAJMHg1MDAwMDAwMCwJMHhmYzAwMDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsYWJyIiwJMHg1ODA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsYiIsIAkweGFjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxjcyIsIAkweDAwMDMwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJsZCIsIAkweGFjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxlYXIiLCAJMHg4MDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsZiIsIAkweGNjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImxmYnIiLCAJMHhjYzA4MDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJsaCIsIAkweGFjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImxpIiwgCTB4YzgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibG1hcCIsCTB4MmMwNzAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgImxtYiIsCTB4YjAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG1kIiwJMHhiMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJsbWgiLAkweGIwMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgImxtdyIsCTB4YjAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibG5iIiwJMHhiNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJsbmQiLAkweGI0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgImxuaCIsCTB4YjQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibG53IiwJMHhiNDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJscHNkIiwJMHhmOTgwMDAwMCwJMHhmZjg4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJscHNkY20iLAkweGZhODAwMDAwLAkweGZmODgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgImx3IiwgCTB4YWMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibHdiciIsIAkweDVjMDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgIm1wZmQiLAkweGU0MDgwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgIm1wZnciLAkweGU0MDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgIm1waSIsCTB4YzgwMzAwMDAsCTB4ZmM3ZjAwMDAsCSJyLEkiLAkJNCB9LAoteyAibXBtYiIsCTB4YzAwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBtaCIsCTB4YzAwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAibXBtdyIsCTB4YzAwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAibXByIiwJMHgzODAyMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJtcHJmZCIsCTB4MzgwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAibXByZnciLAkweDM4MDYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgIm5vcCIsCTB4MDAwMjAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAib3JtYiIsCTB4ODgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtZCIsCTB4ODgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtaCIsCTB4ODgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JtdyIsCTB4ODgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAib3JyIiwJMHgwODAwMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJvcnJtIiwJMHgwODA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJyZHN0cyIsCTB4MDAwOTAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInJldHVybiIsCTB4MjgwZTAwMDAsCTB4ZmM3ZjAwMDAsCSIiLAkJMiB9LAoteyAicmkiLCAJMHhmYzAyMDAwMCwJMHhmYzA3ZmZmZiwJIkkiLAkJNCB9LAoteyAicm5kIiwJMHgwMDA1MDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAicnBzd3QiLAkweDA0MGIwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJyc2NobmwiLAkweGZjMmYwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInJzY3RsIiwJMHhmYzQ3MDAwMCwJMHhmYzdmODAwMCwJInIsSSIsCQk0IH0sCi17ICJyd2NzIiwJMHgwMDBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzYWN6IiwJMHgxMDA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzYm0iLAkweDk4MDgwMDAwLAkweGZjMDgwMDAwLAkiZix4T0EsWCIsCTQgfSwKLXsgInNiciIsCTB4MTgwMDAwMDAsCTB4ZmMwYzAwMDAsCSJyLGYiLAkJNCB9LAoteyAic2VhIiwJMHgwMDBkMDAwMCwJMHhmZmZmMDAwMCwJIiIsCQkyIH0sCi17ICJzZXRjcHUiLAkweDJjMDkwMDAwLAkweGZjN2YwMDAwLAkiciIsCQkyIH0sCi17ICJzaW8iLAkweGZjMTcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInNpcHUiLAkweDAwMGEwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTIgfSwKLXsgInNsYSIsCTB4MWM0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xhZCIsCTB4MjA0MDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic2xjIiwJMHgyNDQwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzbGwiLAkweDFjNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNsbGQiLAkweDIwNjAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNtYyIsCTB4MDQwNzAwMDAsCTB4ZmMwNzAwMDAsCSIiLAkJMiB9LAoteyAic3JhIiwJMHgxYzAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmFkIiwJMHgyMDAwMDAwMCwJMHhmYzYwMDAwMCwJInIsUyIsCQkyIH0sCi17ICJzcmMiLAkweDI0MDAwMDAwLAkweGZjNjAwMDAwLAkicixTIiwJCTIgfSwKLXsgInNybCIsCTB4MWMyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3JsZCIsCTB4MjAyMDAwMDAsCTB4ZmM2MDAwMDAsCSJyLFMiLAkJMiB9LAoteyAic3RiIiwJMHhkNDA4MDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdGQiLAkweGQ0MDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN0ZiIsCTB4ZGMwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RmYnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN0aCIsCTB4ZDQwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtYiIsCTB4ZDgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtZCIsCTB4ZDgwMDAwMDIsCTB4ZmMwODAwMDIsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtaCIsCTB4ZDgwMDAwMDEsCTB4ZmMwODAwMDEsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RtdyIsCTB4ZDgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3RwaW8iLAkweGZjMjcwMDAwLAkweGZjN2Y4MDAwLAkicixJIiwJCTQgfSwKLXsgInN0dyIsCTB4ZDQwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAic3R3YnIiLAkweDU0MDAwMDAwLAkweGZjMDgwMDAwLAkiYix4T0EsWCIsCTQgfSwKLXsgInN1YWJyIiwJMHg1ODAwMDAwMCwJMHhmYzA4MDAwMCwJImIseE9BLFgiLAk0IH0sCi17ICJzdWZkIiwJMHhlMDAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJzdWZ3IiwJMHhlMDAwMDAwMCwJMHhmYzA4MDAwMCwJInIseE9BLFgiLAk0IH0sCi17ICJzdWkiLAkweGM4MDIwMDAwLAkweGZjN2YwMDAwLAkicixJIiwJCTQgfSwKLXsgInN1bWIiLAkweGJjMDgwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWQiLAkweGJjMDAwMDAyLAkweGZjMDgwMDAyLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bWgiLAkweGJjMDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInN1bXciLAkweGJjMDAwMDAwLAkweGZjMDgwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1ciIsCTB4M2MwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAic3VyZmQiLAkweDM4MGIwMDAwLAkweGZjMGYwMDAwLAkicix4T0EsWCIsCTQgfSwKLXsgInN1cmZ3IiwJMHgzODAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdXJtIiwJMHgzYzA4MDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJzdmMiLAkweGM4MDYwMDAwLAkweGZmZmYwMDAwLAkiIiwJCTQgfSwKLXsgInRibSIsCTB4YTQwODAwMDAsCTB4ZmMwODAwMDAsCSJmLHhPQSxYIiwJNCB9LAoteyAidGJyIiwJMHgxODBjMDAwMCwJMHhmYzBjMDAwMCwJInIsZiIsCQkyIH0sCi17ICJ0YnJyIiwJMHgyYzAyMDAwMCwJMHhmYzBmMDAwMCwJInIsQiIsCQkyIH0sCi17ICJ0Y2NyIiwJMHgyODA0MDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJ0ZCIsIAkweGZjMDUwMDAwLAkweGZjMDcwMDAwLAkicixmIiwJCTQgfSwKLXsgInRpbyIsCTB4ZmMxZjAwMDAsCTB4ZmM3ZjgwMDAsCSJyLEkiLAkJNCB9LAoteyAidG1hcHIiLAkweDJjMGEwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRwY2JyIiwJMHgyODBjMDAwMCwJMHhmYzdmMDAwMCwJInIiLAkJMiB9LAoteyAidHJiciIsCTB4MmMwMTAwMDAsCTB4ZmMwZjAwMDAsCSJiLFIiLAkJMiB9LAoteyAidHJjIiwJMHgyYzAzMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cmNjIiwJMHgyODA1MDAwMCwJMHhmYzdmMDAwMCwJIiIsCQkyIH0sCi17ICJ0cmNtIiwJMHgyYzBiMDAwMCwJMHhmYzBmMDAwMCwJInIsUiIsCQkyIH0sCi17ICJ0cm4iLAkweDJjMDQwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRybm0iLAkweDJjMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInRyciIsCTB4MmMwMDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJybSIsCTB4MmMwODAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJzYyIsCTB4MmMwZTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAidHJzdyIsCTB4MjgwMDAwMDAsCTB4ZmM3ZjAwMDAsCSJyIiwJCTIgfSwKLXsgInRzY3IiLAkweDJjMGYwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInVlaSIsCTB4MDAwNzAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAid2FpdCIsCTB4MDAwMTAwMDAsCTB4ZmZmZjAwMDAsCSIiLAkJMiB9LAoteyAid2N3Y3MiLAkweGZjNWYwMDAwLAkweGZjN2Y4MDAwLAkiIiwJCTQgfSwKLXsgInd3Y3MiLAkweDAwMGMwMDAwLAkweGZjMGYwMDAwLAkicixSIiwJCTIgfSwKLXsgInhjYnIiLAkweDI4MDIwMDAwLAkweGZjMGYwMDAwLAkiYixCIiwJCTIgfSwKLXsgInhjciIsCTB4MmMwNTAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAieGNybSIsCTB4MmMwZDAwMDAsCTB4ZmMwZjAwMDAsCSJyLFIiLAkJMiB9LAoteyAiemJtIiwJMHg5YzA4MDAwMCwJMHhmYzA4MDAwMCwJImYseE9BLFgiLAk0IH0sCi17ICJ6YnIiLAkweDE4MDQwMDAwLAkweGZjMGMwMDAwLAkicixmIiwJCTIgfSwKLXsgInptYiIsCTB4ZjgwODAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAiem1kIiwJMHhmODAwMDAwMiwJMHhmYzA4MDAwMiwJInIseE9BLFgiLAk0IH0sCi17ICJ6bWgiLAkweGY4MDAwMDAxLAkweGZjMDgwMDAxLAkicix4T0EsWCIsCTQgfSwKLXsgInptdyIsCTB4ZjgwMDAwMDAsCTB4ZmMwODAwMDAsCSJyLHhPQSxYIiwJNCB9LAoteyAienIiLCAJMHgwYzAwMDAwMCwJMHhmYzBmMDAwMCwJInIiLAkJMiB9LAotfTsKLQotaW50IG51bW9wY29kZXMgPSBzaXplb2YoZ2xkX29wY29kZXMpIC8gc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKLQotc3RydWN0IGdsZF9vcGNvZGUgKmVuZG9wID0gZ2xkX29wY29kZXMgKyBzaXplb2YoZ2xkX29wY29kZXMpIC8KLQkJc2l6ZW9mKGdsZF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3BwYy5oIGIvaW5jbHVkZS9vcGNvZGUvcHBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NGYwZGYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvcHBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyogcHBjLmggLS0gSGVhZGVyIGZpbGUgZm9yIFBvd2VyUEMgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBQUENfSAotI2RlZmluZSBQUENfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBwb3dlcnBjX29wY29kZS4gICovCi0KLXN0cnVjdCBwb3dlcnBjX29wY29kZQotewotICAvKiBUaGUgb3Bjb2RlIG5hbWUuICAqLwotICBjb25zdCBjaGFyICpuYW1lOwotCi0gIC8qIFRoZSBvcGNvZGUgaXRzZWxmLiAgVGhvc2UgYml0cyB3aGljaCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoCi0gICAgIG9wZXJhbmRzIGFyZSB6ZXJvZXMuICAqLwotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYQotICAgICBtYXNrIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUKLSAgICAgb3Bjb2RlIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdAotICAgICBtYXRjaCAoYW5kIGFyZSBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2s7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIGRlZmluZWQgdmFsdWVzCi0gICAgIGFyZSBsaXN0ZWQgYmVsb3cuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci19OwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlIHBvd2VycGNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBwb3dlcnBjX251bV9vcGNvZGVzOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHBvd2VycGNfb3Bjb2RlLiAgKi8KLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQb3dlclBDIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfUFBDICgwMSkKLQotLyogT3Bjb2RlIGlzIGRlZmluZWQgZm9yIHRoZSBQT1dFUiAoUlMvNjAwMCkgYXJjaGl0ZWN0dXJlLiAgKi8KLSNkZWZpbmUgUFBDX09QQ09ERV9QT1dFUiAoMDIpCi0KLS8qIE9wY29kZSBpcyBkZWZpbmVkIGZvciB0aGUgUE9XRVIyIChSaW9zIDIpIGFyY2hpdGVjdHVyZS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfUE9XRVIyICgwNCkKLQotLyogT3Bjb2RlIGlzIG9ubHkgZGVmaW5lZCBvbiAzMiBiaXQgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfMzIgKDAxMCkKLQotLyogT3Bjb2RlIGlzIG9ubHkgZGVmaW5lZCBvbiA2NCBiaXQgYXJjaGl0ZWN0dXJlcy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjQgKDAyMCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEgcHJvY2Vzc29yLiAgVGhlIDYwMQotICAgaXMgYXNzdW1lZCB0byBzdXBwb3J0IGFsbCBQb3dlclBDIChQUENfT1BDT0RFX1BQQykgaW5zdHJ1Y3Rpb25zLAotICAgYnV0IGl0IGFsc28gc3VwcG9ydHMgbWFueSBhZGRpdGlvbmFsIFBPV0VSIGluc3RydWN0aW9ucy4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfNjAxICgwNDApCi0KLS8qIE9wY29kZSBpcyBzdXBwb3J0ZWQgaW4gYm90aCB0aGUgUG93ZXIgYW5kIFBvd2VyUEMgYXJjaGl0ZWN0dXJlcwotICAgKGllLCBjb21waWxlcidzIC1tY3B1PWNvbW1vbiBvciBhc3NlbWJsZXIncyAtbWNvbSkuICAqLwotI2RlZmluZSBQUENfT1BDT0RFX0NPTU1PTiAoMDEwMCkKLQotLyogT3Bjb2RlIGlzIHN1cHBvcnRlZCBmb3IgYW55IFBvd2VyIG9yIFBvd2VyUEMgcGxhdGZvcm0gKHRoaXMgaXMKLSAgIGZvciB0aGUgYXNzZW1ibGVyJ3MgLW1hbnkgb3B0aW9uLCBhbmQgaXQgZWxpbWluYXRlcyBkdXBsaWNhdGVzKS4gICovCi0jZGVmaW5lIFBQQ19PUENPREVfQU5ZICgwMjAwKQotCi0vKiBPcGNvZGUgaXMgc3VwcG9ydGVkIGFzIHBhcnQgb2YgdGhlIDY0LWJpdCBicmlkZ2UuICAqLwotI2RlZmluZSBQUENfT1BDT0RFXzY0X0JSSURHRSAoMDQwMCkKLQotLyogQSBtYWNybyB0byBleHRyYWN0IHRoZSBtYWpvciBvcGNvZGUgZnJvbSBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFBQQ19PUChpKSAoKChpKSA+PiAyNikgJiAweDNmKQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBwb3dlcnBjX29wZXJhbmQuICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19vcGVyYW5kCi17Ci0gIC8qIFRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgb3BlcmFuZC4gICovCi0gIGludCBiaXRzOwotCi0gIC8qIEhvdyBmYXIgdGhlIG9wZXJhbmQgaXMgbGVmdCBzaGlmdGVkIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIGludCBzaGlmdDsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotICB1bnNpZ25lZCBsb25nICgqaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBsb25nIG9wLAotCQkJCSAgIGNvbnN0IGNoYXIgKiplcnJtc2cpKTsKLQotICAvKiBFeHRyYWN0aW9uIGZ1bmN0aW9uLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUbwotICAgICBleHRyYWN0IHRoaXMgb3BlcmFuZCB0eXBlIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgY29tcHV0ZQotICAgICAgICAgb3AgPSAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoKG8tPmZsYWdzICYgUFBDX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAmJiAob3AgJiAoMSA8PCAoby0+Yml0cyAtIDEpKSkgIT0gMCkKLQkgICBvcCAtPSAxIDw8IG8tPmJpdHM7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiwgbyBpcyBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcAotICAgICBpcyB0aGUgcmVzdWx0OyB0aGlzIGFzc3VtZXMgdHdvcyBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuICBJZgotICAgICB0aGUgSU5WQUxJRCBhcmd1bWVudCBpcyBub3QgTlVMTCwgKklOVkFMSUQgd2lsbCBiZSBzZXQgdG8KLSAgICAgbm9uLXplcm8gaWYgdGhpcyBvcGVyYW5kIHR5cGUgY2FuIG5vdCBhY3R1YWxseSBiZSBleHRyYWN0ZWQgZnJvbQotICAgICB0aGlzIG9wZXJhbmQgKGkuZS4sIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBtYXRjaCkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCBpcyB2YWxpZCwgKklOVkFMSUQgd2lsbCBub3QgYmUgY2hhbmdlZC4gICovCi0gIGxvbmcgKCpleHRyYWN0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci19OwotCi0vKiBFbGVtZW50cyBpbiB0aGUgdGFibGUgYXJlIHJldHJpZXZlZCBieSBpbmRleGluZyB3aXRoIHZhbHVlcyBmcm9tCi0gICB0aGUgb3BlcmFuZHMgZmllbGQgb2YgdGhlIHBvd2VycGNfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kIHBvd2VycGNfb3BlcmFuZHNbXTsKLQotLyogVmFsdWVzIGRlZmluZWQgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBhIHN0cnVjdCBwb3dlcnBjX29wZXJhbmQuICAqLwotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcy4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1NJR05FRCAoMDEpCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLCBidXQgYWxzbyBhY2NlcHRzIGEgZnVsbCBwb3NpdGl2ZQotICAgcmFuZ2Ugb2YgdmFsdWVzIHdoZW4gcnVubmluZyBpbiAzMiBiaXQgbW9kZS4gIFRoYXQgaXMsIGlmIGJpdHMgaXMKLSAgIDE2LCBpdCB0YWtlcyBhbnkgdmFsdWUgZnJvbSAtMHg4MDAwIHRvIDB4ZmZmZi4gIEluIDY0IGJpdCBtb2RlLAotICAgdGhpcyBmbGFnIGlzIGlnbm9yZWQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9TSUdOT1BUICgwMikKLQotLyogVGhpcyBvcGVyYW5kIGRvZXMgbm90IGFjdHVhbGx5IGV4aXN0IGluIHRoZSBhc3NlbWJsZXIgaW5wdXQuICBUaGlzCi0gICBpcyB1c2VkIHRvIHN1cHBvcnQgZXh0ZW5kZWQgbW5lbW9uaWNzIHN1Y2ggYXMgbXIsIGZvciB3aGljaCB0d28KLSAgIG9wZXJhbmRzIGZpZWxkcyBhcmUgaWRlbnRpY2FsLiAgVGhlIGFzc2VtYmxlciBzaG91bGQgY2FsbCB0aGUKLSAgIGluc2VydCBmdW5jdGlvbiB3aXRoIGFueSBvcCB2YWx1ZS4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIGNhbGwKLSAgIHRoZSBleHRyYWN0IGZ1bmN0aW9uLCBpZ25vcmUgdGhlIHJldHVybiB2YWx1ZSwgYW5kIGNoZWNrIHRoZSB2YWx1ZQotICAgcGxhY2VkIGluIHRoZSB2YWxpZCBhcmd1bWVudC4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX0ZBS0UgKDA0KQotCi0vKiBUaGUgbmV4dCBvcGVyYW5kIHNob3VsZCBiZSB3cmFwcGVkIGluIHBhcmVudGhlc2VzIHJhdGhlciB0aGFuCi0gICBzZXBhcmF0ZWQgZnJvbSB0aGlzIG9uZSBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB0aGUgbG9hZCBhbmQKLSAgIHN0b3JlIGluc3RydWN0aW9ucyB3aGljaCB3YW50IHRoZWlyIG9wZXJhbmRzIHRvIGxvb2sgbGlrZQotICAgICAgIHJlZyxkaXNwbGFjZW1lbnQocmVnKQotICAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfUEFSRU5TICgwMTApCi0KLS8qIFRoaXMgb3BlcmFuZCBtYXkgdXNlIHRoZSBzeW1ib2xpYyBuYW1lcyBmb3IgdGhlIENSIGZpZWxkcywgd2hpY2gKLSAgIGFyZQotICAgICAgIGx0ICAwCWd0ICAxCWVxICAyCXNvICAzCXVuICAzCi0gICAgICAgY3IwIDAJY3IxIDEJY3IyIDIJY3IzIDMKLSAgICAgICBjcjQgNAljcjUgNQljcjYgNgljcjcgNwotICAgVGhlc2UgbWF5IGJlIGNvbWJpbmVkIGFyaXRobWV0aWNhbGx5LCBhcyBpbiBjcjIqNCtndC4gIFRoZXNlIGFyZQotICAgb25seSBzdXBwb3J0ZWQgb24gdGhlIFBvd2VyUEMsIG5vdCB0aGUgUE9XRVIuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9DUiAoMDIwKQotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSByZWdpc3Rlci4gIFRoZSBkaXNhc3NlbWJsZXIgdXNlcyB0aGlzIHRvIHByaW50Ci0gICByZWdpc3RlciBuYW1lcyB3aXRoIGEgbGVhZGluZyAncicuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9HUFIgKDA0MCkKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugd2l0aCBhIGxlYWRpbmcgJ2YnLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfRlBSICgwMTAwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSByZWxhdGl2ZSBicmFuY2ggZGlzcGxhY2VtZW50LiAgVGhlIGRpc2Fzc2VtYmxlcgotICAgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gICovCi0jZGVmaW5lIFBQQ19PUEVSQU5EX1JFTEFUSVZFICgwMjAwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYWJzb2x1dGUgYnJhbmNoIGFkZHJlc3MuICBUaGUgZGlzYXNzZW1ibGVyCi0gICBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5IGlmIHBvc3NpYmxlLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfQUJTT0xVVEUgKDA0MDApCi0KLS8qIFRoaXMgb3BlcmFuZCBpcyBvcHRpb25hbCwgYW5kIGlzIHplcm8gaWYgb21pdHRlZC4gIFRoaXMgaXMgdXNlZCBmb3IKLSAgIHRoZSBvcHRpb25hbCBCRiBhbmQgTCBmaWVsZHMgaW4gdGhlIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLiAgVGhlCi0gICBhc3NlbWJsZXIgbXVzdCBjb3VudCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBvbiB0aGUgbGluZSwKLSAgIGFuZCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIHJlbWFpbmluZyBmb3IgdGhlIG9wY29kZSwgYW5kIGRlY2lkZQotICAgd2hldGhlciB0aGlzIG9wZXJhbmQgaXMgcHJlc2VudCBvciBub3QuICBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZAotICAgcHJpbnQgdGhpcyBvcGVyYW5kIG91dCBvbmx5IGlmIGl0IGlzIG5vdCB6ZXJvLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfT1BUSU9OQUwgKDAxMDAwKQotCi0vKiBUaGlzIGZsYWcgaXMgb25seSB1c2VkIHdpdGggUFBDX09QRVJBTkRfT1BUSU9OQUwuICBJZiB0aGlzIG9wZXJhbmQKLSAgIGlzIG9taXR0ZWQsIHRoZW4gZm9yIHRoZSBuZXh0IG9wZXJhbmQgdXNlIHRoaXMgb3BlcmFuZCB2YWx1ZSBwbHVzCi0gICAxLCBpZ25vcmluZyB0aGUgbmV4dCBvcGVyYW5kIGZpZWxkIGZvciB0aGUgb3Bjb2RlLiAgVGhpcyB3cmV0Y2hlZAotICAgaGFjayBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgUG93ZXIgcm90YXRlIGluc3RydWN0aW9ucyBjYW4gdGFrZQotICAgZWl0aGVyIDQgb3IgNSBvcGVyYW5kcy4gIFRoZSBkaXNhc3NlbWJsZXIgc2hvdWxkIHByaW50IHRoaXMgb3BlcmFuZAotICAgb3V0IHJlZ2FyZGxlc3Mgb2YgdGhlIFBQQ19PUEVSQU5EX09QVElPTkFMIGZpZWxkLiAgKi8KLSNkZWZpbmUgUFBDX09QRVJBTkRfTkVYVCAoMDIwMDApCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYSBuZWdhdGl2ZSBudW1iZXIgZm9yIHRoZQotICAgcHVycG9zZXMgb2Ygb3ZlcmZsb3cgY2hlY2tpbmcgKGkuZS4sIHRoZSBub3JtYWwgbW9zdCBuZWdhdGl2ZQotICAgbnVtYmVyIGlzIGRpc2FsbG93ZWQgYW5kIG9uZSBtb3JlIHRoYW4gdGhlIG5vcm1hbCBtb3N0IHBvc2l0aXZlCi0gICBudW1iZXIgaXMgYWxsb3dlZCkuICBUaGlzIGZsYWcgd2lsbCBvbmx5IGJlIHNldCBmb3IgYSBzaWduZWQKLSAgIG9wZXJhbmQuICAqLwotI2RlZmluZSBQUENfT1BFUkFORF9ORUdBVElWRSAoMDQwMDApCi0MCi0vKiBUaGUgUE9XRVIgYW5kIFBvd2VyUEMgYXNzZW1ibGVycyB1c2UgYSBmZXcgbWFjcm9zLiAgV2Uga2VlcCB0aGVtCi0gICB3aXRoIHRoZSBvcGVyYW5kcyB0YWJsZSBmb3Igc2ltcGxpY2l0eS4gIFRoZSBtYWNybyB0YWJsZSBpcyBhbgotICAgYXJyYXkgb2Ygc3RydWN0IHBvd2VycGNfbWFjcm8uICAqLwotCi1zdHJ1Y3QgcG93ZXJwY19tYWNybwotewotICAvKiBUaGUgbWFjcm8gbmFtZS4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBvcGVyYW5kcyB0aGUgbWFjcm8gdGFrZXMuICAqLwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7Ci0KLSAgLyogT25lIGJpdCBmbGFncyBmb3IgdGhlIG9wY29kZS4gIFRoZXNlIGFyZSB1c2VkIHRvIGluZGljYXRlIHdoaWNoCi0gICAgIHNwZWNpZmljIHByb2Nlc3NvcnMgc3VwcG9ydCB0aGUgaW5zdHJ1Y3Rpb25zLiAgVGhlIHZhbHVlcyBhcmUgdGhlCi0gICAgIHNhbWUgYXMgdGhvc2UgZm9yIHRoZSBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgZmxhZ3MgZmllbGQuICAqLwotICB1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gIC8qIEEgZm9ybWF0IHN0cmluZyB0byB0dXJuIHRoZSBtYWNybyBpbnRvIGEgbm9ybWFsIGluc3RydWN0aW9uLgotICAgICBFYWNoICVOIGluIHRoZSBzdHJpbmcgaXMgcmVwbGFjZWQgd2l0aCBvcGVyYW5kIG51bWJlciBOICh6ZXJvCi0gICAgIGJhc2VkKS4gICovCi0gIGNvbnN0IGNoYXIgKmZvcm1hdDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcG93ZXJwY19tYWNybyBwb3dlcnBjX21hY3Jvc1tdOwotZXh0ZXJuIGNvbnN0IGludCBwb3dlcnBjX251bV9tYWNyb3M7Ci0KLSNlbmRpZiAvKiBQUENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vcGNvZGUvcHlyLmggYi9pbmNsdWRlL29wY29kZS9weXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MzJiOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS9weXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKiBweXJhbWlkLm9wY29kZS5oIC0tIGdkYiBpbml0aWFsIGF0dGVtcHQuICovCi0KLS8qIHB5cmFtaWQgb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzCi0gICBwYXJ0aWN1bGFyIG9wY29kZSAqLwotCi1zdHJ1Y3QgcHlyX2RhdHVtCi17Ci0gIGNoYXIgICAgICAgICAgICAgIG5hcmdzOwotICBjaGFyICogICAgICAgICAgICBhcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotICB1bnNpZ25lZCBsb25nICAgICBtYXNrOwkvKiBCaXQgdmVjdG9yOiB3aGljaCBvcGVyYW5kIG1vZGVzIGFyZSB2YWxpZAotCQkJCSAgIGZvciB0aGlzIG9wY29kZSAqLwotICB1bnNpZ25lZCBjaGFyICAgICBjb2RlOwkvKiBvcC1jb2RlIChhbHdheXMgNig/KSBiaXRzICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBweXJfaW5zbl9mb3JtYXQgewotICAgIHVuc2lnbmVkIGludCBtb2RlIDo0OwotICAgIHVuc2lnbmVkIGludCBvcGVyYXRvciA6ODsKLSAgICB1bnNpZ25lZCBpbnQgaW5kZXhfc2NhbGUgOjI7Ci0gICAgdW5zaWduZWQgaW50IGluZGV4X3JlZyA6NjsKLSAgICB1bnNpZ25lZCBpbnQgb3BlcmFuZF8xIDo2OwotICAgIHVuc2lnbmVkIGludCBvcGVyYW5kXzI6NjsKLX0gcHlyX2luc25fZm9ybWF0OwotCQotCi0vKiBXZSBzdG9yZSBmb3VyIGJ5dGVzIG9mIG9wY29kZSBmb3IgYWxsIG9wY29kZXMuCi0gICBQeXJhbWlkIGlzIHN1ZmZpY2llbnRseSBSSVNDeSB0aGF0OgotICAgICAgLSBpbnNucyBhcmUgYWx3YXlzIGFuIGludGVncmFsIG51bWJlciBvZiB3b3JkczsKLSAgICAgIC0gdGhlIGxlbmd0aCBvZiBhbnkgaW5zbiBjYW4gYmUgdG9sZCBmcm9tIHRoZSBmaXJzdCB3b3JkIG9mCi0gICAgICAgIHRoZSBpbnNuLiAoaWUsIGlmIHRoZXJlIGFyZSB6ZXJvLCBvbmUsIG9yIHR3byB3b3JkcyBvZgotCWltbWVkaWF0ZSBvcGVyYW5kL29mZnNldCkuCi0KLSAgIAotICAgVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHdvIGNoYXJhY3RlcnMgZm9yIGVhY2gKLSAgIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLiAgVGhlIGZpcnN0IHNwZWNpZmllcyB0aGUga2luZCBvZiBvcGVyYW5kOwotICAgdGhlIHNlY29uZCwgdGhlIHBsYWNlIGl0IGlzIHN0b3JlZC4gKi8KLQotLyogS2luZHMgb2Ygb3BlcmFuZHM6Ci0gICBtYXNrCSBhc3NlbWJsZXIgc3ludGF4CWRlc2NyaXB0aW9uCi0gICAweDAwMDE6ICBtb3Z3IFJuLFJuCQlyZWdpc3RlciB0byByZWdpc3RlcgotICAgMHgwMDAyOiAgbW92dyBLLFJuCQlxdWljayBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKLSAgIDB4MDAwNDogIG1vdncgSSxSbgkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIKLSAgIDB4MDAwODogIG1vdncgKFJuKSxSbglyZWdpc3RlciBpbmRpcmVjdCB0byByZWdpc3RlcgotICAgCSAgICBtb3Z3IChSbilbeF0sUm4JcmVnaXN0ZXIgaW5kaXJlY3QgdG8gcmVnaXN0ZXIKLSAgIDB4MDAxMDogIG1vdncgSShSbiksUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0IHRvIHJlZ2lzdGVyCi0gICAJICAgIG1vdncgSShSbilbeF0sUm4Jb2Zmc2V0IHJlZ2lzdGVyIGluZGlyZWN0LCBpbmRleGVkLCB0byByZWdpc3RlcgotCi0gICAweDAwMjA6ICBtb3Z3IFJuLChSbikJcmVnaXN0ZXIgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgICAgICAgCi0gICAweDAwNDA6ICBtb3Z3IEssKFJuKQkJcXVpY2sgaW1tZWRpYXRlIHRvIHJlZ2lzdGVyIGluZGlyZWN0ICAgICAgICAgCi0gICAweDAwODA6ICBtb3Z3IEksKFJuKQkJbG9uZyBpbW1lZGlhdGUgdG8gcmVnaXN0ZXIgaW5kaXJlY3QgICAgICAgICAgCi0gICAweDAxMDA6ICBtb3Z3IChSbiksKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCAgICAgICAKLSAgIDB4MDEwMDogIG1vdncgKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0IHRvLXJlZ2lzdGVyIGluZGlyZWN0ICAgICAgIAotICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAotICAgMHgwMjAwOiAgbW92dyBJKFJuKSwoUm4pCXJlZ2lzdGVyIGluZGlyZWN0K29mZnNldCB0byByZWdpc3RlciBpbmRpcmVjdAotCi0gICAweDA0MDA6ICBtb3Z3IFJuLEkoUm4pCXJlZ2lzdGVyIHRvIHJlZ2lzdGVyIGluZGlyZWN0K29mZnNldAotICAgMHgwODAwOiAgbW92dyBLLEkoUm4pCXF1aWNrIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgSSxJKFJuKQlsb25nIGltbWVkaWF0ZSB0byByZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgKFJuKSxJKFJuKQlyZWdpc3RlciBpbmRpcmVjdCB0by1yZWdpc3RlciBpbmRpcmVjdCtvZmZzZXQKLSAgIDB4MTAwMDogIG1vdncgSShSbiksSShSbikJcmVnaXN0ZXIgaW5kaXJlY3Qrb2Zmc2V0IHRvIHJlZ2lzdGVyIGluZGlyZWN0Ci0gICAJCQkJCStvZmZzZXQKLSAgIDB4MDAwMDogIChpcnJlZ3VsYXIpCQk/Pz8KLSAgIAotCi0gICBFYWNoIGluc24gaGFzIGEgZm91ci1iaXQgZmllbGQgZW5jb2RpbmcgdGhlIHR5cGUocykgb2YgaXRzIG9wZXJhbmRzLgotKi8KLQotLyogU29tZSBjb21tb24gY29tYmluYXRpb25zCi0gICAqLwotCi0vKiB0aGUgZmlyc3QgNSwoMHgxfDB4MnwweDR8MHg4fDB4MTApIGllICgxfDJ8NHw4fDE2KSwgaWUgKCAzMiAtMSkqLwotI2RlZmluZSBHRU5fVE9fUkVHICgzMSkKLQotI2RlZmluZQlVTktOT1dOICgodW5zaWduZWQgbG9uZyktMSkKLSNkZWZpbmUgQU5ZIChHRU5fVE9fUkVHIHwgKEdFTl9UT19SRUcgPDwgNSkgfCAoR0VOX1RPX1JFRyA8PCAxNSkpCi0KLSNkZWZpbmUgQ09OVkVSVCAoMXw4fDB4MTB8MHgyMHwweDIwMCkKLQotI2RlZmluZSBLX1RPX1JFRyAoMikKLSNkZWZpbmUgSV9UT19SRUcgKDQpCi0jZGVmaW5lIE5PVEtfVE9fUkVHIChHRU5fVE9fUkVHICYgfktfVE9fUkVHKQotI2RlZmluZSBOT1RJX1RPX1JFRyAoR0VOX1RPX1JFRyAmIH5JX1RPX1JFRykKLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IHRoaXMgYXJyYXkgYmUgc29ydGVkIGFzIGZvbGxvd3M6Ci0gICBhbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIG11c3QgYmUgY29uc2VjdXRpdmUuCi0gICBBbGwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG1uZW1vbmljIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzCi0gICBtdXN0IGJlIGNvbnNlY3V0aXZlLgotICovCi0KLXN0cnVjdCBweXJfb3Bjb2RlCQkvKiBweXIgb3Bjb2RlIHRleHQgKi8KLXsKLSAgY2hhciAqICAgICAgICAgICAgbmFtZTsJLyogb3Bjb2RlIG5hbWU6IGxvd2VyY2FzZSBzdHJpbmcgIFtrZXldICAqLwotICBzdHJ1Y3QgcHlyX2RhdHVtICBkYXR1bTsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSBweXJfaG93IGFyZ3MKLSNkZWZpbmUgcHlyX25hcmdzIG5hcmdzCi0jZGVmaW5lIHB5cl9tYXNrIG1hc2sKLSNkZWZpbmUgcHlyX25hbWUgbmFtZQotCi1zdHJ1Y3QgcHlyX29wY29kZSBweXJfb3Bjb2Rlc1tdID0KLXsKLSAgeyJtb3ZiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MTF9LCB9LAotICB7Im1vdmgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgxMn0gfSwKLSAgeyJtb3Z3IiwJeyAyLCAiIiwgQU5ZLAkJCTB4MTB9IH0sCi0gIHsibW92bCIsCXsgMiwgIiIsIEFOWSwJCQkweDEzfSB9LAotICB7Im1uZWd3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTR9IH0sCi0gIHsibW5lZ2YiLAl7IDIsICIiLCAweDEsCQkJMHgxNX0gfSwKLSAgeyJtbmVnZCIsCXsgMiwgIiIsIDB4MSwJCQkweDE2fSB9LAotICB7Im1jb213IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MTd9IH0sCi0gIHsibWFic3ciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxOH0gfSwKLSAgeyJtYWJzZiIsCXsgMiwgIiIsIDB4MSwJCQkweDE5fSB9LAotICB7Im1hYnNkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWF9IH0sCi0gIHsibXRzdHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgxY30gfSwKLSAgeyJtdHN0ZiIsCXsgMiwgIiIsIDB4MSwJCQkweDFkfSB9LAotICB7Im10c3RkIiwJeyAyLCAiIiwgMHgxLAkJCTB4MWV9IH0sCi0gIHsibW92YSIsCXsgMiwgIiIsIDB4OHwweDEwLAkJMHgxZn0gfSwKLSAgeyJtb3Z6YnciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMH0gfSwKLSAgeyJtb3Z6aHciLAl7IDIsICIiLCAoMHgxfDB4OHwweDEwKSwJMHgyMX0gfSwKLQkJCQkvKiAyIGluc25zIG91dCBvZiBvcmRlciBoZXJlICovCi0gIHsibW92YmwiLAl7IDIsICIiLCAxLAkJCTB4NGZ9IH0sCi0gIHsiZmlsYmwiLAl7IDIsICIiLCAxLAkJCTB4NGV9IH0sCi0KLSAgeyJjdnRidyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDIyfSB9LAotICB7ImN2dGh3IiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjN9IH0sCi0gIHsiY3Z0d2IiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyNH0gfSwKLSAgeyJjdnR3aCIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI1fSB9LAotICB7ImN2dHdmIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4MjZ9IH0sCi0gIHsiY3Z0d2QiLAl7IDIsICIiLCBDT05WRVJULAkJMHgyN30gfSwKLSAgeyJjdnRmdyIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDI4fSB9LAotICB7ImN2dGZkIiwJeyAyLCAiIiwgQ09OVkVSVCwJCTB4Mjl9IH0sCi0gIHsiY3Z0ZHciLAl7IDIsICIiLCBDT05WRVJULAkJMHgyYX0gfSwKLSAgeyJjdnRkZiIsCXsgMiwgIiIsIENPTlZFUlQsCQkweDJifSB9LAotCi0gIHsiYWRkdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQwfSB9LAotICB7ImFkZHdjIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDF9IH0sCi0gIHsic3VidyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQyfSB9LAotICB7InN1YndiIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDN9IH0sCi0gIHsicnN1YnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0NH0gfSwKLSAgeyJtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDV9IH0sCi0gIHsiZW11bCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ3fSB9LAotICB7InVtdWx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDZ9IH0sCi0gIHsiZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDQ4fSB9LAotICB7ImVkaXYiLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHg0YX0gfSwKLSAgeyJyZGl2dyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRifSB9LAotICB7InVkaXZ3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NDl9IH0sCi0gIHsibW9kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDRjfSB9LAotICB7InVtb2R3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4NGR9IH0sCi0KLQotICB7ImFkZGYiLAl7IDIsICIiLCAxLAkJCTB4NTB9IH0sCi0gIHsiYWRkZCIsCXsgMiwgIiIsIDEsCQkJMHg1MX0gfSwKLSAgeyJzdWJmIiwJeyAyLCAiIiwgMSwJCQkweDUyfSB9LAotICB7InN1YmQiLAl7IDIsICIiLCAxLAkJCTB4NTN9IH0sCi0gIHsibXVsZiIsCXsgMiwgIiIsIDEsCQkJMHg1Nn0gfSwKLSAgeyJtdWxkIiwJeyAyLCAiIiwgMSwJCQkweDU3fSB9LAotICB7ImRpdmYiLAl7IDIsICIiLCAxLAkJCTB4NTh9IH0sCi0gIHsiZGl2ZCIsCXsgMiwgIiIsIDEsCQkJMHg1OX0gfSwKLQotCi0gIHsiY21wYiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDYxfSB9LAotICB7ImNtcGgiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Mn0gfSwKLSAgeyJjbXB3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4NjB9IH0sCi0gIHsidWNtcGIiLAl7IDIsICIiLCBVTktOT1dOLAkJMHg2Nn0gfSwKLSAgLyogV0hZIG5vICJ1Y21waCI/Pz8gKi8KLSAgeyJ1Y21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY1fSB9LAotICB7InhjaHciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwZn0gfSwKLQotCi0gIHsiYW5kdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMwfSB9LAotICB7Im9ydyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDMxfSB9LAotICB7InhvcnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzMn0gfSwKLSAgeyJiaWN3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4MzN9IH0sCi0gIHsibHNobHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzOH0gfSwKLSAgeyJhc2hsdyIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNhfSB9LAotICB7ImFzaGxsIiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2N9IH0sCi0gIHsiYXNocnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzYn0gfSwKLSAgeyJhc2hybCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDNkfSB9LAotICB7InJvdGx3IiwJeyAyLCAiIiwgR0VOX1RPX1JFRywJCTB4M2V9IH0sCi0gIHsicm90cnciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgzZn0gfSwKLQotICAvKiBwdXNoIGFuZCBwb3AgaW5zbnMgYXJlICJnb2luZyBhd2F5IG5leHQgcmVsZWFzZSIuICovCi0gIHsicHVzaHciLAl7IDIsICIiLCBHRU5fVE9fUkVHLAkJMHgwY30gfSwKLSAgeyJwb3B3IiwJeyAyLCAiIiwgKDB4MXwweDh8MHgxMCksCTB4MGR9IH0sCi0gIHsicHVzaGEiLAl7IDIsICIiLCAoMHg4fDB4MTApLAkJMHgwZX0gfSwKLQotICB7ImJpdHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MzV9IH0sCi0gIHsiYml0Y3ciLAl7IDIsICIiLCBVTktOT1dOLAkJMHgzNn0gfSwKLSAgLyogc29tZSBraW5kIG9mIGlicmEvZGJyYSBpbnNucz8/Ki8KLSAgeyJpY21wdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDY3fSB9LAotICB7ImRjbXB3IiwJeyAyLCAiIiwgKDF8NHwweDIwfDB4ODB8MHg0MDB8MHgxMDAwKSwJMHg2OX0gfSwvKkZJWE1FKi8KLSAgeyJhY21wdyIsCXsgMiwgIiIsIDEsCQkJMHg2Yn0gfSwKLQotICAvKiBDYWxsIGlzIHdyaXR0ZW4gYXMgYSAxLW9wIGluc24sIGJ1dCBpcyBhbHdheXMgKGRpcylhc3NlbWJsZWQgYXMgYSAyLW9wCi0gICAgIGluc24gd2l0aCBhIDJuZCBvcCBvZiB0cjE0LiAgIFRoZSBhc3NlbWJsZXIgd2lsbCBoYXZlIHRvIGdyb2sgdGhpcy4gICovCi0gIHsiY2FsbCIsCXsgMiwgIiIsIEdFTl9UT19SRUcsCQkweDA0fSB9LAotICB7ImNhbGwiLAl7IDEsICIiLCBHRU5fVE9fUkVHLAkJMHgwNH0gfSwKLQotICB7ImNhbGxrIiwJeyAxLCAiIiwgVU5LTk9XTiwJCTB4MDZ9IH0sLyogc3lzdGVtIGNhbGw/Ki8KLSAgLyogUmV0IGlzIHVzdWFsbHkgd3JpdHRlbiBhcyBhIDAtb3AgaW5zbiwgYnV0IGdldHMgZGlzYXNzZW1ibGVkIGFzIGEKLSAgICAgMS1vcCBpbnNuLiBUaGUgb3BlcmFuZCBpcyBhbHdheXMgdHIxNS4gKi8KLSAgeyJyZXQiLAl7IDAsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKLSAgeyJyZXQiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwOX0gfSwKLSAgeyJhZHNmIiwJeyAyLCAiIiwgKDF8Mnw0KSwJCTB4MDh9IH0sCi0gIHsicmV0ZCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDBhfSB9LAotICB7ImJ0YyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAxfSB9LAotICB7ImJmYyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAyfSB9LAotICAvKiBDYXJlZnVsOiBoYWx0IGlzIDB4MDAwMDAwMDAuIEp1bXAgbXVzdCBoYXZlIHNvbWUgb3RoZXIgKG1vZGU/KWJpdCBzZXQ/PyAqLwotICB7Imp1bXAiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJidHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHhmMDB9IH0sCi0gIC8qIHJlYWQgY29udHJvbC1zdGFjayBwb2ludGVyIGlzIGFub3RoZXIgMS1vci0yIG9wZXJhbmQgaW5zbi4gKi8KLSAgeyJyY3NwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDFmfSB9LAotICB7InJjc3AiLAl7IDEsICIiLCBVTktOT1dOLAkJMHgwMWZ9IH0KLX07Ci0KLS8qIGVuZDogcHlyYW1pZC5vcGNvZGUuaCAqLwotLyogT25lIGRheSBJIHdpbGwgaGF2ZSB0byB0YWtlIHRoZSB0aW1lIHRvIGZpbmQgb3V0IHdoYXQgb3BlcmFuZHMKLSAgIGFyZSB2YWxpZCBmb3IgdGhlc2UgaW5zbnMsIGFuZCBndWVzcyBhdCB3aGF0IHRoZXkgbWVhbi4KLQotICAgSSBjYW4ndCBpbWFnaW5lIHdoYXQgdGhlICJJPz8/IiBpbnNucyAoaWdsb2IsIGV0YykgZG8uCi0KLSAgIHRoZSBhcml0aG1ldGljLXNvdW5kaW5nIGluc25zIGVuZGluZyBpbiAicCIgc291bmQgYXdmdWxseSBsaWtlIEJDRAotICAgYXJpdGhtZXRpYyBpbnNuczoKLSAgIAlkc2hscCAtPiBEZWNpbWFsIFNIaWZ0IExlZnQgUGFja2VkCi0JZHNocnAgLT4gRGVjaW1hbCBTSGlmdCBSaWdodCBQYWNrZWQKLSAgIGFuZCBjdnRscCB3b3VsZCBiZSBjb252ZXJ0IGxvbmcgdG8gcGFja2VkLgotICAgSSBoYXZlIG5vIGlkZWEgaG93IHRoZSBvcGVyYW5kcyBhcmUgaW50ZXJwcmV0ZWQ7IGJ1dCBoYXZpbmcgdGhlbSBiZQotICAgYSBsb25nIHJlZ2lzdGVyIHdpdGggKGFkZHJlc3MsIGxlbmd0aCkgb2YgYW4gaW4tbWVtb3J5IHBhY2tlZCBCQ0Qgb3BlcmFuZAotICAgd291bGQgbm90IGJlIHN1cnByaXNpbmcuCi0gICBUaGV5IGFyZSB1bmxpa2VseSB0byBiZSBhIHBhY2tlZCBiY2Qgc3RyaW5nOiA2NCBiaXRzIG9mIGxvbmcgZ2l2ZQotICAgaXMgb25seSAxNSBkaWdpdHMrc2lnbiwgd2hpY2ggaXNuJ3QgZW5vdWdoIGZvciBDT0JPTC4KLSAqLyAKLSNpZiAwCi0gIHsid2NzcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlIGNzcD8qLwotICAvKiBUaGUgT1N4IE9wZXJhdGluZyBTeXN0ZW0gUG9ydGluZyBHdWlkZSBjbGFpbXMgU1NMIGRvZXMgdGhpbmdzCi0gICAgIHdpdGggdHIxMiAoYSByZWdpc3RlciByZXNlcnZlZCB0byBpdCkgdG8gZG8gd2l0aCBzdGF0aWMgYmxvY2stc3RydWN0dXJlCi0gICAgIHJlZmVyZW5jZXMuICBTU0w9U2V0IFN0YXRpYyBMaW5rPyAgSXQncyAiR29pbmcgYXdheSBuZXh0IHJlbGVhc2UiLiAqLwotICB7InNzbCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImNjbXBzIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibGNkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidWVtdWwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp1bnNpZ25lZCBlbXVsKi8KLSAgeyJzcmYiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypHaWRnZXQgdGltZT8/PyovCi0gIHsibW5lZ3AiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgL21vdmUtbmVnIHBoeXM/Ki8KLSAgeyJsZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypsb2FkIHBoeXM/Ki8KLSAgeyJsZHRpIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibGRiIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3RwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsic3R0aSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN0YiIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InN0dSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImFkZHAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJzdWJwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsibXVscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImRpdnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwKLSAgeyJkc2hscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAgLyogZGVjIHNobCBwYWNrZWQ/ICovCi0gIHsiZHNocnAiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogZGVjIHNociBwYWNrZWQ/ICovCi0gIHsibW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKm1vdmUgKHN0cmluZz8pPyovCi0gIHsiY21wcCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjbXAgcGh5cz8qLwotICB7ImNtcHMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY21wIChzdHJpbmc/KT8qLwotICB7ImN2dGxwIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGN2dCBsb25nIHRvIHA/PyovCi0gIHsiY3Z0cGwiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogY3Z0IHAgdG8gbD8/Ki8KLSAgeyJkaW50ciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiA/PyBpbnRyID8qLwotICB7InJwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiByZWFkIHBoeXMgd29yZD8qLwotICB7IndwaHlzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiB3cml0ZSBwaHlzIHdvcmQ/Ki8KLSAgeyJjbW92cyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InJzdWJ3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiYmljcHN3IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIGNsciBiaXQgaW4gcHN3PyAqLwotICB7ImJpc3BzdyIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBzZXQgYml0IGluIHBzdz8gKi8KLSAgeyJlaW8iLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogPz8gP2lvID8gKi8KLSAgeyJjYWxscCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKiBjYWxsIHBoeXM/Ki8KLSAgeyJjYWxsciIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7ImxwY3h0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qbG9hZCBwcm9jIGNvbnRleHQqLwotICB7InJlaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKnJldCBmcm9tIGludHJwdCovCi0gIHsicnBvcnQiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLypyZWFkLXBvcnQ/Ki8KLSAgeyJydG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qcmVhZC10aW1lLW9mLWRheT8qLwotICB7InNzaSIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LAotICB7InZ0cGEiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyp2aXJ0LXRvLXBoeXMtYWRkcj8qLwotICB7IndpY2wiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogd3JpdGUgaWNsID8gKi8KLSAgeyJ3cG9ydCIsCXsgMiwgIiIsIFVOS05PV04sCQkweDAwfSB9LCAvKndyaXRlLXBvcnQ/Ki8KLSAgeyJ3dG9kIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qd3JpdGUtdGltZS1vZi1kYXk/Ki8KLSAgeyJmbGljIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsiaWdsb2IiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBnbG9iYWw/ICovCi0gIHsiaXBoeXMiLAl7IDIsICIiLCBVTktOT1dOLAkJMHgwMH0gfSwgLyogSSBwaHlzaWNhbD8gKi8KLSAgeyJpcGlkIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgcGlkPyAqLwotICB7Iml2ZWN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sIC8qIEkgdmVjdG9yPyAqLwotICB7ImxhbXN0IiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0gIHsidGlvIiwJeyAyLCAiIiwgVU5LTk9XTiwJCTB4MDB9IH0sCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmggYi9pbmNsdWRlL29wY29kZS9zcGFyYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjE1OWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3NwYXJjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyogRGVmaW5pdGlvbnMgZm9yIG9wY29kZSB0YWJsZSBmb3IgdGhlIHNwYXJjLgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCA5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0FTLCB0aGUgR05VIEFzc2VtYmxlciwgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLCBhbmQKLXRoZSBHTlUgQmludXRpbHMuCi0KLUdBUy9HREIgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HQVMvR0RCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHQVMgb3IgR0RCOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4JSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotLyogVGhlIFNQQVJDIG9wY29kZSB0YWJsZSAoYW5kIG90aGVyIHJlbGF0ZWQgZGF0YSkgaXMgZGVmaW5lZCBpbgotICAgdGhlIG9wY29kZXMgbGlicmFyeSBpbiBzcGFyYy1vcGMuYy4gIElmIHlvdSBjaGFuZ2UgYW55dGhpbmcgaGVyZSwgbWFrZQotICAgc3VyZSB5b3UgZml4IHVwIHRoYXQgZmlsZSwgYW5kIHZpY2UgdmVyc2EuICAqLwotCi0gLyogRklYTUUtc29tZWRheTogcGVyaGFwcyB0aGUgLGEncyBhbmQgc3VjaCBzaG91bGQgYmUgZW1iZWRkZWQgaW4gdGhlCi0gICAgaW5zdHJ1Y3Rpb24ncyBuYW1lIHJhdGhlciB0aGFuIHRoZSBhcmdzLiAgVGhpcyB3b3VsZCBtYWtlIGdhcyBmYXN0ZXIsIHBpbnNuCi0gICAgc2xvd2VyLCBidXQgd291bGQgbWVzcyB1cCBzb21lIG1hY3JvcyBhIGJpdC4gIHhveG9yaWNoLiAqLwotCi0vKiBMaXN0IG9mIGluc3RydWN0aW9uIHNldHMgdmFyaWF0aW9ucy4KLSAgIFRoZXNlIHZhbHVlcyBhcmUgc3VjaCB0aGF0IGVhY2ggZWxlbWVudCBpcyBlaXRoZXIgYSBzdXBlcnNldCBvZiBhCi0gICBwcmVjZWRpbmcgZWFjaCBvbmUgb3IgdGhleSBjb25mbGljdCBpbiB3aGljaCBjYXNlIFNQQVJDX09QQ09ERV9DT05GTElDVF9QCi0gICByZXR1cm5zIG5vbi16ZXJvLgotICAgVGhlIHZhbHVlcyBhcmUgaW5kaWNlcyBpbnRvIGBzcGFyY19vcGNvZGVfYXJjaHMnIGRlZmluZWQgaW4gc3BhcmMtb3BjLmMuCi0gICBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IHVwZGF0aW5nIHNwYXJjLW9wYy5jLiAgKi8KLQotZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgewotICBTUEFSQ19PUENPREVfQVJDSF9WNiA9IDAsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1Y3LAotICBTUEFSQ19PUENPREVfQVJDSF9WOCwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfU1BBUkNMRVQsCi0gIFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSwKLSAgLyogdjkgdmFyaWFudHMgbXVzdCBhcHBlYXIgbGFzdCAqLwotICBTUEFSQ19PUENPREVfQVJDSF9WOSwKLSAgU1BBUkNfT1BDT0RFX0FSQ0hfVjlBLCAvKiB2OSB3aXRoIHVsdHJhc3BhcmMgYWRkaXRpb25zICovCi0gIFNQQVJDX09QQ09ERV9BUkNIX0JBRCAvKiBlcnJvciByZXR1cm4gZnJvbSBzcGFyY19vcGNvZGVfbG9va3VwX2FyY2ggKi8KLX07Ci0KLS8qIFRoZSBoaWdoZXN0IGFyY2hpdGVjdHVyZSBpbiB0aGUgdGFibGUuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQVJDSF9NQVggKFNQQVJDX09QQ09ERV9BUkNIX0JBRCAtIDEpCi0KLS8qIEdpdmVuIGFuIGVudW0gc3BhcmNfb3Bjb2RlX2FyY2hfdmFsLCByZXR1cm4gdGhlIGJpdG1hc2sgdG8gdXNlIGluCi0gICBpbnNuIGVuY29kaW5nL2RlY29kaW5nLiAgKi8KLSNkZWZpbmUgU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyhhcmNoKSAoMSA8PCAoYXJjaCkpCi0KLS8qIEdpdmVuIGEgdmFsaWQgc3BhcmNfb3Bjb2RlX2FyY2hfdmFsLCByZXR1cm4gbm9uLXplcm8gaWYgaXQncyB2OS4gICovCi0jZGVmaW5lIFNQQVJDX09QQ09ERV9BUkNIX1Y5X1AoYXJjaCkgKChhcmNoKSA+PSBTUEFSQ19PUENPREVfQVJDSF9WOSkKLQotLyogVGFibGUgb2YgY3B1IHZhcmlhbnRzLiAgKi8KLQotc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogTWFzayBvZiBzcGFyY19vcGNvZGVfYXJjaF92YWwncyBzdXBwb3J0ZWQuCi0gICAgIEVHOiBGb3IgdjcgdGhpcyB3b3VsZCBiZQotICAgICAoU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoLi4uX1Y2KSB8IFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKC4uLl9WNykpLgotICAgICBUaGVzZSBhcmUgc2hvcnQncyBiZWNhdXNlIHNwYXJjX29wY29kZS5hcmNoaXRlY3R1cmUgaXMuICAqLwotICBzaG9ydCBzdXBwb3J0ZWQ7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZV9hcmNoIHNwYXJjX29wY29kZV9hcmNoc1tdOwotCi0vKiBHaXZlbiBhcmNoaXRlY3R1cmUgbmFtZSwgbG9vayB1cCBpdCdzIHNwYXJjX29wY29kZV9hcmNoX3ZhbCB2YWx1ZS4gICovCi1leHRlcm4gZW51bSBzcGFyY19vcGNvZGVfYXJjaF92YWwgc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotCi0vKiBSZXR1cm4gdGhlIGJpdG1hc2sgb2Ygc3VwcG9ydGVkIGFyY2hpdGVjdHVyZXMgZm9yIEFSQ0guICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfU1VQUE9SVEVEKEFSQ0gpIChzcGFyY19vcGNvZGVfYXJjaHNbQVJDSF0uc3VwcG9ydGVkKQotCi0vKiBOb24temVybyBpZiBBUkNIMSBjb25mbGljdHMgd2l0aCBBUkNIMi4KLSAgIElFOiBBUkNIMSBhcyBhIHN1cHBvcnRlZCBiaXQgc2V0IHRoYXQgQVJDSDIgZG9lc24ndCwgYW5kIHZpY2UgdmVyc2EuICAqLwotI2RlZmluZSBTUEFSQ19PUENPREVfQ09ORkxJQ1RfUChBUkNIMSwgQVJDSDIpIFwKLSgoKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkgXAotICAhPSBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChBUkNIMSkpIFwKLSAmJiAoKFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gxKSAmIFNQQVJDX09QQ09ERV9TVVBQT1JURUQgKEFSQ0gyKSkgXAotICAgICAhPSBTUEFSQ19PUENPREVfU1VQUE9SVEVEIChBUkNIMikpKQotCi0vKiBTdHJ1Y3R1cmUgb2YgYW4gb3Bjb2RlIHRhYmxlIGVudHJ5LiAgKi8KLQotc3RydWN0IHNwYXJjX29wY29kZSB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGxvbmcgbWF0Y2g7CS8qIEJpdHMgdGhhdCBtdXN0IGJlIHNldC4gKi8KLSAgdW5zaWduZWQgbG9uZyBsb3NlOwkvKiBCaXRzIHRoYXQgbXVzdCBub3QgYmUgc2V0LiAqLwotICBjb25zdCBjaGFyICphcmdzOwotICAvKiBUaGlzIHdhcyBjYWxsZWQgImRlbGF5ZWQiIGluIHZlcnNpb25zIGJlZm9yZSB0aGUgZmxhZ3MuICovCi0gIGNoYXIgZmxhZ3M7Ci0gIHNob3J0IGFyY2hpdGVjdHVyZTsJLyogQml0bWFzayBvZiBzcGFyY19vcGNvZGVfYXJjaF92YWwncy4gICovCi19OwotCi0jZGVmaW5lCUZfREVMQVlFRAkxCS8qIERlbGF5ZWQgYnJhbmNoICovCi0jZGVmaW5lCUZfQUxJQVMJCTIJLyogQWxpYXMgZm9yIGEgInJlYWwiIGluc3RydWN0aW9uICovCi0jZGVmaW5lCUZfVU5CUgkJNAkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCAqLwotI2RlZmluZQlGX0NPTkRCUgk4CS8qIENvbmRpdGlvbmFsIGJyYW5jaCAqLwotI2RlZmluZQlGX0pTUgkJMTYJLyogU3Vicm91dGluZSBjYWxsICovCi0jZGVmaW5lIEZfRkxPQVQJCTMyCS8qIEZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIChub3QgYSBicmFuY2gpICovCi0jZGVmaW5lIEZfRkJSCQk2NAkvKiBGbG9hdGluZyBwb2ludCBicmFuY2ggKi8KLS8qIEZJWE1FOiBBZGQgRl9BTkFDSFJPTklTVElDIGZsYWcgZm9yIHY5LiAgKi8KLQotLyoKLQotQWxsIHNwYXJjIG9wY29kZXMgYXJlIDMyIGJpdHMsIGV4Y2VwdCBmb3IgdGhlIGBzZXQnIGluc3RydWN0aW9uIChyZWFsbHkgYQotbWFjcm8pLCB3aGljaCBpcyA2NCBiaXRzLiBJdCBpcyBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlLgotCi1UaGUgbWF0Y2ggY29tcG9uZW50IGlzIGEgbWFzayBzYXlpbmcgd2hpY2ggYml0cyBtdXN0IG1hdGNoIGEgcGFydGljdWxhcgotb3Bjb2RlIGluIG9yZGVyIGZvciBhbiBpbnN0cnVjdGlvbiB0byBiZSBhbiBpbnN0YW5jZSBvZiB0aGF0IG9wY29kZS4KLQotVGhlIGFyZ3MgY29tcG9uZW50IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIGNoYXJhY3RlciBmb3IgZWFjaCBvcGVyYW5kIG9mIHRoZQotaW5zdHJ1Y3Rpb24uCi0KLUtpbmRzIG9mIG9wZXJhbmRzOgotCSMJTnVtYmVyIHVzZWQgYnkgb3B0aW1pemVyLglJdCBpcyBpZ25vcmVkLgotCTEJcnMxIHJlZ2lzdGVyLgotCTIJcnMyIHJlZ2lzdGVyLgotCWQJcmQgcmVnaXN0ZXIuCi0JZQlmcnMxIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyLgotCXYJZnJzMSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAoZG91YmxlL2V2ZW4pLgotCVYJZnJzMSBmbG9hdGluZyBwb2ludCByZWdpc3RlciAocXVhZC9tdWx0aXBsZSBvZiA0KS4KLQlmCWZyczIgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIuCi0JQglmcnMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChkb3VibGUvZXZlbikuCi0JUglmcnMyIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIChxdWFkL211bHRpcGxlIG9mIDQpLgotCWcJZnJzZCBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4KLQlICWZyc2QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKGRvdWJsZS9ldmVuKS4KLQlKCWZyc2QgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXIgKHF1YWQvbXVsdGlwbGUgb2YgNCkuCi0JYgljcnMxIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JYwljcnMyIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JRAljcnNkIGNvcHJvY2Vzc29yIHJlZ2lzdGVyCi0JbQlhbHRlcm5hdGUgc3BhY2UgcmVnaXN0ZXIgKGFzcikgaW4gcmQKLQlNCWFsdGVybmF0ZSBzcGFjZSByZWdpc3RlciAoYXNyKSBpbiByczEKLQloCTIyIGhpZ2ggYml0cy4KLQlYCTUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZQotCVkJNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlCi0JSwlNRU1CQVIgbWFzayAoNyBiaXRzKS4gKHY5KQotCWoJMTAgYml0IEltbWVkaWF0ZS4gKHY5KQotCUkJMTEgYml0IEltbWVkaWF0ZS4gKHY5KQotCWkJMTMgYml0IEltbWVkaWF0ZS4KLQluCTIyIGJpdCBpbW1lZGlhdGUuCi0JawkyKzE0IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuICh2OSkKLQlHCTE5IGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuICh2OSkKLQlsCTIyIGJpdCBQQyByZWxhdGl2ZSBpbW1lZGlhdGUuCi0JTAkzMCBiaXQgUEMgcmVsYXRpdmUgaW1tZWRpYXRlLgotCWEJQW5udWwuCVRoZSBhbm51bCBiaXQgaXMgc2V0LgotCUEJQWx0ZXJuYXRlIGFkZHJlc3Mgc3BhY2UuIFN0b3JlZCBhcyA4IGJpdHMuCi0JQwlDb3Byb2Nlc3NvciBzdGF0ZSByZWdpc3Rlci4KLQlGCWZsb2F0aW5nIHBvaW50IHN0YXRlIHJlZ2lzdGVyLgotCXAJUHJvY2Vzc29yIHN0YXRlIHJlZ2lzdGVyLgotCU4JQnJhbmNoIHByZWRpY3QgY2xlYXIgIixwbiIgKHY5KQotCVQJQnJhbmNoIHByZWRpY3Qgc2V0ICIscHQiICh2OSkKLQl6CSVpY2MuICh2OSkKLQlaCSV4Y2MuICh2OSkKLQlxCUZsb2F0aW5nIHBvaW50IHF1ZXVlLgotCXIJU2luZ2xlIHJlZ2lzdGVyIHRoYXQgaXMgYm90aCByczEgYW5kIHJkLgotCU8JU2luZ2xlIHJlZ2lzdGVyIHRoYXQgaXMgYm90aCByczIgYW5kIHJkLgotCVEJQ29wcm9jZXNzb3IgcXVldWUuCi0JUwlTcGVjaWFsIGNhc2UuCi0JdAlUcmFwIGJhc2UgcmVnaXN0ZXIuCi0JdwlXaW5kb3cgaW52YWxpZCBtYXNrIHJlZ2lzdGVyLgotCXkJWSByZWdpc3Rlci4KLQl1CXNwYXJjbGV0IGNvcHJvY2Vzc29yIHJlZ2lzdGVycyBpbiByZCBwb3NpdGlvbgotCVUJc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzIGluIHJzMSBwb3NpdGlvbgotCUUJJWNjci4gKHY5KQotCXMJJWZwcnMuICh2OSkKLQlQCSVwYy4gICh2OSkKLQlXCSV0aWNrLgkodjkpCi0JbwklYXNpLiAodjkpCi0JNgklZmNjMC4gKHY5KQotCTcJJWZjYzEuICh2OSkKLQk4CSVmY2MyLiAodjkpCi0JOQklZmNjMy4gKHY5KQotCSEJUHJpdmlsZWdlZCBSZWdpc3RlciBpbiByZCAodjkpCi0JPwlQcml2aWxlZ2VkIFJlZ2lzdGVyIGluIHJzMSAodjkpCi0JKglQcmVmZXRjaCBmdW5jdGlvbiBjb25zdGFudC4gKHY5KQotCXgJT1BGIGZpZWxkICh2OSBpbXBkZXApLgotCTAJMzIvNjQgYml0IGltbWVkaWF0ZSBmb3Igc2V0IG9yIHNldHggKHY5KSBpbnNucwotCV8JQW5jaWxsYXJ5IHN0YXRlIHJlZ2lzdGVyIGluIHJkICh2OWEpCi0JLwlBbmNpbGxhcnkgc3RhdGUgcmVnaXN0ZXIgaW4gcnMxICh2OWEpCi0KLVRoZSBmb2xsb3dpbmcgY2hhcnMgYXJlIHVudXNlZDogKG5vdGU6ICxbXSBhcmUgdXNlZCBhcyBwdW5jdHVhdGlvbikKLVszNDVdCi0KLSovCi0KLSNkZWZpbmUgT1AyKHgpCQkoKCh4KSYweDcpIDw8IDIyKSAvKiBvcDIgZmllbGQgb2YgZm9ybWF0MiBpbnNucyAqLwotI2RlZmluZSBPUDMoeCkJCSgoKHgpJjB4M2YpIDw8IDE5KSAvKiBvcDMgZmllbGQgb2YgZm9ybWF0MyBpbnNucyAqLwotI2RlZmluZSBPUCh4KQkJKCh1bnNpZ25lZCkoKHgpJjB4MykgPDwgMzApIC8qIG9wIGZpZWxkIG9mIGFsbCBpbnNucyAqLwotI2RlZmluZSBPUEYoeCkJCSgoKHgpJjB4MWZmKSA8PCA1KSAvKiBvcGYgZmllbGQgb2YgZmxvYXQgaW5zbnMgKi8KLSNkZWZpbmUgT1BGX0xPVzUoeCkJT1BGKCh4KSYweDFmKSAvKiB2OSAqLwotI2RlZmluZSBGM0YoeCwgeSwgeikJKE9QKHgpIHwgT1AzKHkpIHwgT1BGKHopKSAvKiBmb3JtYXQzIGZsb2F0IGluc25zICovCi0jZGVmaW5lIEYzSSh4KQkJKCgoeCkmMHgxKSA8PCAxMykgLyogaW1tZWRpYXRlIGZpZWxkIG9mIGZvcm1hdCAzIGluc25zICovCi0jZGVmaW5lIEYyKHgsIHkpCShPUCh4KSB8IE9QMih5KSkgLyogZm9ybWF0IDIgaW5zbnMgKi8KLSNkZWZpbmUgRjMoeCwgeSwgeikJKE9QKHgpIHwgT1AzKHkpIHwgRjNJKHopKSAvKiBmb3JtYXQzIGluc25zICovCi0jZGVmaW5lIEYxKHgpCQkoT1AoeCkpCi0jZGVmaW5lIERJU1AzMCh4KQkoKHgpJjB4M2ZmZmZmZmYpCi0jZGVmaW5lIEFTSSh4KQkJKCgoeCkmMHhmZikgPDwgNSkgLyogYXNpIGZpZWxkIG9mIGZvcm1hdDMgaW5zbnMgKi8KLSNkZWZpbmUgUlMyKHgpCQkoKHgpJjB4MWYpIC8qIHJzMiBmaWVsZCAqLwotI2RlZmluZSBTSU1NMTMoeCkJKCh4KSYweDFmZmYpIC8qIHNpbW0xMyBmaWVsZCAqLwotI2RlZmluZSBSRCh4KQkJKCgoeCkmMHgxZikgPDwgMjUpIC8qIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGZpZWxkICovCi0jZGVmaW5lIFJTMSh4KQkJKCgoeCkmMHgxZikgPDwgMTQpIC8qIHJzMSBmaWVsZCAqLwotI2RlZmluZSBBU0lfUlMyKHgpCShTSU1NMTMoeCkpCi0jZGVmaW5lIE1FTUJBUih4KQkoKHgpJjB4N2YpCi0jZGVmaW5lIFNMQ1BPUCh4KQkoKCh4KSYweDdmKSA8PCA2KSAvKiBzcGFyY2xldCBjcG9wICovCi0KLSNkZWZpbmUgQU5OVUwJKDE8PDI5KQotI2RlZmluZSBCUFJFRAkoMTw8MTkpCS8qIHY5ICovCi0jZGVmaW5lCUlNTUVECUYzSSgxKQotI2RlZmluZSBSRF9HMAlSRCh+MCkKLSNkZWZpbmUJUlMxX0cwCVJTMSh+MCkKLSNkZWZpbmUJUlMyX0cwCVJTMih+MCkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgc3BhcmNfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCBzcGFyY19udW1fb3Bjb2RlczsKLQotZXh0ZXJuIGludCBzcGFyY19lbmNvZGVfYXNpIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9hc2kgUEFSQU1TICgoaW50KSk7Ci1leHRlcm4gaW50IHNwYXJjX2VuY29kZV9tZW1iYXIgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gY29uc3QgY2hhciAqc3BhcmNfZGVjb2RlX21lbWJhciBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX3ByZWZldGNoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9wcmVmZXRjaCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBpbnQgc3BhcmNfZW5jb2RlX3NwYXJjbGV0X2NwcmVnIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIGNvbnN0IGNoYXIgKnNwYXJjX2RlY29kZV9zcGFyY2xldF9jcHJlZyBQQVJBTVMgKChpbnQpKTsKLQotLyoKLSAqIExvY2FsIFZhcmlhYmxlczoKLSAqIGZpbGwtY29sdW1uOiAxMzEKLSAqIGNvbW1lbnQtY29sdW1uOiAwCi0gKiBFbmQ6Ci0gKi8KLQotLyogZW5kIG9mIHNwYXJjLmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmggYi9pbmNsdWRlL29wY29kZS90YWhvZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNlZTI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3RhaG9lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIFBvcnRlZCBieSB0aGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgWW9yayBhdCBCdWZmYWxvIGJ5IHRoZSBEaXN0cmlidXRlZAotICogQ29tcHV0ZXIgU3lzdGVtcyBMYWIsIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZSwgMTk5MS4KLSAqLwotCi0jaWZuZGVmIHRhaG9lX29wY29kZVQKLSNkZWZpbmUgdGFob2Vfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyB0YWhvZV9vcGNvZGVUICovCi0KLXN0cnVjdCB2b3Rfd290ICAgICAgICAgICAgICAgICAgLyogdGFob2Ugb3Bjb2RlIHRhYmxlOiB3b3QgdG8gZG8gd2l0aCB0aGlzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcnRpY3VsYXIgb3Bjb2RlICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIGFyZ3M7ICAgICAgIC8qIGhvdyB0byBjb21waWxlIHNhaWQgb3Bjb2RlICovCi0gIHRhaG9lX29wY29kZVQgICAgICAgY29kZTsgICAgIC8qIG9wLWNvZGUgKG1heSBiZSA+IDggYml0cyEpICovCi19OwotCi1zdHJ1Y3Qgdm90ICAgICAgICAgICAgICAgICAgICAgIC8qIHRhaG9lIG9wY29kZSB0ZXh0ICovCi17Ci0gIGNoYXIgKiAgICAgICAgICAgIG5hbWU7ICAgICAgIC8qIG9wY29kZSBuYW1lOiBsb3dlcmNhc2Ugc3RyaW5nICBba2V5XSAgKi8KLSAgc3RydWN0IHZvdF93b3QgICAgZGV0YWlsOyAgICAgLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSB2b3RfaG93IGFyZ3MKLSNkZWZpbmUgdm90X2NvZGUgY29kZQotI2RlZmluZSB2b3RfZGV0YWlsIGRldGFpbAotI2RlZmluZSB2b3RfbmFtZSBuYW1lCi0KLXN0YXRpYyBzdHJ1Y3Qgdm90Ci12b3RzdHJzW10gPQotewoteyAgICAiaGFsdCIsCXsiIiwJCQkweDAwCX0gfSwKLXsgICAgInNpbmYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDA1ICAgIH0gfSwKLXsgICAgImxkZiIsICAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDA2ICAgIH0gfSwKLXsgICAgImxkZCIsICAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDA3ICAgIH0gfSwKLXsgICAgImFkZGIyIiwJeyJyYm1iIiwJCTB4MDgJfSB9LAoteyAgICAibW92YiIsCXsicmJ3YiIsCQkweDA5CX0gfSwKLXsgICAgImFkZHcyIiwJeyJyd213IiwJCTB4MGEJfSB9LAoteyAgICAibW92dyIsCXsicnd3dyIsCQkweDBiCX0gfSwKLXsgICAgImFkZGwyIiwJeyJybG1sIiwJCTB4MGMJfSB9LAoteyAgICAibW92bCIsCXsicmx3bCIsCQkweDBkCX0gfSwKLXsgICAgImJicyIsCXsicmx2bGJ3IiwJCTB4MGUJfSB9LAoteyAgICAibm9wIiwgICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4MTAgICAgfSB9LAoteyAgICAiYnJiIiwJeyJiYiIsCQkJMHgxMQl9IH0sCi17ICAgICJicnciLAl7ImJ3IiwJCQkweDEzCX0gfSwKLXsgICAgImNvc2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDE1ICAgIH0gfSwKLXsgICAgImxuZiIsICAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDE2ICAgIH0gfSwKLXsgICAgImxuZCIsICAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDE3ICAgIH0gfSwKLXsgICAgImFkZGIzIiwJeyJyYnJid2IiLAkJMHgxOAl9IH0sCi17ICAgICJjbXBiIiwJeyJyYndiIiwJCTB4MTkJfSB9LCAKLXsgICAgImFkZHczIiwJeyJyd3J3d3ciLAkJMHgxYQl9IH0sCi17ICAgICJjbXB3IiwJeyJyd3d3IiwJCTB4MWIJfSB9LAoteyAgICAiYWRkbDMiLAl7InJscmx3bCIsCQkweDFjCX0gfSwKLXsgICAgImNtcGwiLAl7InJsd2wiLAkJMHgxZAl9IH0sCi17ICAgICJiYmMiLAl7InJsdmxidyIsCQkweDFlCX0gfSwKLXsgICAgInJlaSIsCXsiIiwJCQkweDIwCX0gfSwKLXsgICAgImJuZXEiLAl7ImJiIiwJCQkweDIxCX0gfSwKLXsgICAgImJuZXF1IiwJeyJiYiIsCQkJMHgyMQl9IH0sCi17ICAgICJjdnR3bCIsCXsicnd3bCIsCQkweDIzCX0gfSwKLXsgICAgInN0ZiIsICAgICB7IndsIiwgICAgICAgICAgICAgICAgICAweDI2ICAgIH0gfSwKLXsgICAgInN0ZCIsICAgICB7IndxIiwgICAgICAgICAgICAgICAgICAweDI3ICAgIH0gfSwKLXsgICAgInN1YmIyIiwJeyJyYm1iIiwJCTB4MjgJfSB9LAoteyAgICAibWNvbWIiLAl7InJid2IiLAkJMHgyOQl9IH0sCi17ICAgICJzdWJ3MiIsCXsicndtdyIsCQkweDJhCX0gfSwKLXsgICAgIm1jb213IiwJeyJyd3d3IiwJCTB4MmIJfSB9LAoteyAgICAic3VibDIiLCAgIHsicmxtbCIsICAgICAgICAgICAgICAgIDB4MmMgICAgfSB9LAoteyAgICAibWNvbWwiLCAgIHsicmx3bCIsICAgICAgICAgICAgICAgIDB4MmQgICAgfSB9LAoteyAgICAiZW11bCIsCXsicmxybHJsd3EiLAkJMHgyZQl9IH0sCi17ICAgICJhb2Jsc3MiLAl7InJsbWxidyIsCQkweDJmCX0gfSwKLXsgICAgImJwdCIsCXsiIiwJCQkweDMwCX0gfSwKLXsgICAgImJlcWwiLAl7ImJiIiwJCQkweDMxCX0gfSwKLXsgICAgImJlcWx1IiwJeyJiYiIsCQkJMHgzMQl9IH0sCi17ICAgICJjdnR3YiIsCXsicnd3YiIsCQkweDMzCX0gfSwKLXsgICAgImxvZ2YiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDM1ICAgIH0gfSwKLXsgICAgImNtcGYiLCAgICB7InJsIiwgICAgICAgICAgICAgICAgICAweDM2ICAgIH0gfSwKLXsgICAgImNtcGQiLCAgICB7InJxIiwgICAgICAgICAgICAgICAgICAweDM3ICAgIH0gfSwKLXsgICAgInN1YmIzIiwJeyJyYnJid2IiLAkJMHgzOAl9IH0sCi17ICAgICJiaXRiIiwJeyJyYnJiIiwJCTB4MzkJfSB9LAoteyAgICAic3VidzMiLAl7InJ3cnd3dyIsCQkweDNhCX0gfSwKLXsgICAgImJpdHciLAl7InJ3cnciLAkJMHgzYgl9IH0sCi17ICAgICJzdWJsMyIsCXsicmxybHdsIiwJCTB4M2MJfSB9LAoteyAgICAiYml0bCIsCXsicmxybCIsCQkweDNkCX0gfSwKLXsgICAgImVkaXYiLAl7InJscnF3bHdsIiwJCTB4M2UJfSB9LAoteyAgICAiYW9ibGVxIiwJeyJybG1sYnciLAkJMHgzZgl9IH0sCi17ICAgICJyZXQiLAl7IiIsCQkJMHg0MAl9IH0sCi17ICAgICJiZ3RyIiwJeyJiYiIsCQkJMHg0MQl9IH0sCi17ICAgICJzcXJ0ZiIsICAgeyIiLCAgICAgICAgICAgICAgICAgICAgMHg0NSAgICB9IH0sCi17ICAgICJjbXBmMiIsICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHg0NiAgICB9IH0sCi17ICAgICJjbXBkMiIsICAgeyJycXJxIiwgICAgICAgICAgICAgICAgMHg0NyAgICB9IH0sCi17ICAgICJzaGxsIiwgICAgeyJyYnJsd2wiLCAgICAgICAgICAgICAgMHg0OCAgICB9IH0sCi17ICAgICJjbHJiIiwJeyJ3YiIsCQkJMHg0OQl9IH0sCi17ICAgICJzaGxxIiwJeyJyYnJxd3EiLAkJMHg0YQl9IH0sCi17ICAgICJjbHJ3IiwJeyJ3dyIsCQkJMHg0Ygl9IH0sCi17ICAgICJtdWxsMiIsCXsicmxtbCIsCQkweDRjCX0gfSwKLXsgICAgImNscmwiLAl7IndsIiwJCQkweDRkCX0gfSwKLXsgICAgInNoYWwiLCAgICB7InJicmx3bCIsCQkweDRlCX0gfSwKLXsgICAgImJsZXEiLAl7ImJiIiwJCQkweDUxCX0gfSwKLXsgICAgImV4cGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU1ICAgIH0gfSwKLXsgICAgInRzdGYiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU2ICAgIH0gfSwKLXsgICAgInRzdGQiLCAgICB7IiIsICAgICAgICAgICAgICAgICAgICAweDU3ICAgIH0gfSwKLXsgICAgInNocmwiLCAgICB7InJicmx3bCIsCQkweDU4CX0gfSwKLXsgICAgInRzdGIiLAl7InJiIiwJCQkweDU5CX0gfSwKLXsgICAgInNocnEiLCAgICB7InJicnF3cSIsCQkweDVhCX0gfSwKLXsgICAgInRzdHciLAl7InJ3IiwJCQkweDViCX0gfSwKLXsgICAgIm11bGwzIiwJeyJybHJsd2wiLAkJMHg1Ywl9IH0sCi17ICAgICJ0c3RsIiwJeyJybCIsCQkJMHg1ZAl9IH0sCi17ICAgICJzaGFyIiwJeyJyYnJsd2wiLAkJMHg1ZQl9IH0sCi17ICAgICJiYnNzaSIsCXsicmxtbGJ3IiwJCTB4NWYJfSB9LAoteyAgICAibGRwY3R4IiwJeyIiLAkJCTB4NjAJfSB9LAoteyAgICAicHVzaGQiLCAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4NjcgICAgfSB9LAoteyAgICAiaW5jYiIsCXsibWIiLAkJCTB4NjkJfSB9LAoteyAgICAiaW5jdyIsCXsibXciLAkJCTB4NmIJfSB9LAoteyAgICAiZGl2bDIiLAl7InJsbWwiLAkJMHg2Ywl9IH0sCi17ICAgICJpbmNsIiwJeyJtbCIsCQkJMHg2ZAl9IH0sCi17ICAgICJjdnRsYiIsCXsicmx3YiIsCQkweDZmCX0gfSwKLXsgICAgInN2cGN0eCIsCXsiIiwJCQkweDcwCX0gfSwKLXsgICAgImptcCIsCXsiYWIiLAkJCTB4NzEJfSB9LAoteyAgICAiY3ZsZiIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NzYgICAgfSB9LAoteyAgICAiY3ZsZCIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4NzcgICAgfSB9LAoteyAgICAiZGVjYiIsCXsibWIiLAkJCTB4NzkJfSB9LAoteyAgICAiZGVjdyIsCXsibXciLAkJCTB4N2IJfSB9LAoteyAgICAiZGl2bDMiLAl7InJscmx3bCIsCQkweDdjCX0gfSwKLXsgICAgImRlY2wiLAl7Im1sIiwJCQkweDdkCX0gfSwKLXsgICAgImN2dGx3IiwJeyJybHd3IiwJCTB4N2YJfSB9LAoteyAgICAiYmdlcSIsCXsiYmIiLAkJCTB4ODEJfSB9LAoteyAgICAibW92czIiLAl7ImFiYWIiLAkJMHg4Mgl9IH0sCi17ICAgICJjdmZsIiwgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHg4NiAgICB9IH0sCi17ICAgICJjdmRsIiwgICAgeyJ3bCIsICAgICAgICAgICAgICAgICAgMHg4NyAgICB9IH0sCi17ICAgICJvcmIyIiwJeyJyYm1iIiwJCTB4ODgJfSB9LAoteyAgICAiY3Z0YmwiLAl7InJid2wiLAkJMHg4OQl9IH0sCi17ICAgICJvcncyIiwJeyJyd213IiwJCTB4OGEJfSB9LAoteyAgICAiYmlzcHN3IiwJeyJydyIsCQkJMHg4Ygl9IH0sCi17ICAgICJvcmwyIiwgICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHg4YyAgICB9IH0sCi17ICAgICJhZHdjIiwJeyJybG1sIiwJCTB4OGQJfSB9LAoteyAgICAiYWRkYSIsIAl7InJsbWwiLAkJMHg4ZQl9IH0sCi17ICAgICJibHNzIiwJeyJiYiIsCQkJMHg5MQl9IH0sCi17ICAgICJjbXBzMiIsICAgeyJhYmFiIiwJCTB4OTIJfSB9LAoteyAgICAibGRmZCIsICAgIHsicmwiLCAgICAgICAgICAgICAgICAgIDB4OTcgICAgfSB9LAoteyAgICAib3JiMyIsCXsicmJyYndiIiwJCTB4OTgJfSB9LAoteyAgICAiY3Z0YnciLAl7InJid3ciLAkJMHg5OQl9IH0sCi17ICAgICJvcnczIiwgICAJeyJyd3J3d3ciLAkJMHg5YQl9IH0sCi17ICAgICJiaWNwc3ciLAl7InJ3IiwJCQkweDliCX0gfSwKLXsgICAgIm9ybDMiLCAgICB7InJscmx3bCIsICAgICAgICAgICAgICAweDljICAgIH0gfSwKLXsgICAgInNid2MiLAl7InJsbWwiLAkJMHg5ZAl9IH0sCi17ICAgICJzdWJhIiwgICAgeyJybG1sIiwgICAgICAgICAgICAgICAgMHg5ZSAgICB9IH0sCi17ICAgICJiZ3RydSIsCXsiYmIiLAkJCTB4YTEJfSB9LAoteyAgICAiY3ZkZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YTYgICAgfSB9LAoteyAgICAiYW5kYjIiLCAgIHsicmJtYiIsCQkweGE4ICAgIH0gfSwKLXsgICAgIm1vdnpibCIsCXsicmJ3bCIsCQkweGE5CX0gfSwKLXsgICAgImFuZHcyIiwgICB7InJ3bXciLAkJMHhhYSAgICB9IH0sCi17ICAgICJsb2FkciIsICAgeyJyd2FsIiwJCTB4YWIJfSB9LAoteyAgICAiYW5kbDIiLCAgIHsicmxtbCIsCQkweGFjICAgIH0gfSwKLXsgICAgIm10cHIiLAl7InJscmwiLAkJMHhhZAl9IH0sCi17ICAgICJmZnMiLAl7InJsd2wiLAkJMHhhZQl9IH0sCi17ICAgICJibGVxdSIsCXsiYmIiLAkJCTB4YjEJfSB9LAoteyAgICAibmVnZiIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YjYgICAgfSB9LAoteyAgICAibmVnZCIsICAgIHsiIiwgICAgICAgICAgICAgICAgICAgIDB4YjcgICAgfSB9LAoteyAgICAiYW5kYjMiLCAgIHsicmJyYndiIiwgICAgICAgICAgICAgIDB4YjggICAgfSB9LAoteyAgICAibW92emJ3IiwJeyJyYnd3IiwJCTB4YjkJfSB9LAoteyAgICAiYW5kdzMiLCAgIHsicndyd3d3IiwJCTB4YmEgICAgfSB9LAoteyAgICAic3RvcmVyIiwgIHsicndhbCIsICAgICAgICAgICAgICAgIDB4YmIgICAgfSB9LAoteyAgICAiYW5kbDMiLCAgIHsicmxybHdsIiwJCTB4YmMgICAgfSB9LAoteyAgICAibWZwciIsCXsicmx3bCIsCQkweGJkCX0gfSwKLXsgICAgImZmYyIsCXsicmx3bCIsCQkweGJlCX0gfSwKLXsgICAgImNhbGxzIiwJeyJyYmFiIiwJCTB4YmYJfSB9LAoteyAgICAicHJvYmVyIiwJeyJyYmFicmwiLAkJMHhjMAl9IH0sCi17ICAgICJidmMiLAl7ImJiIiwJCQkweGMxCX0gfSwKLXsgICAgIm1vdnMzIiwJeyJhYmFicnciLAkJMHhjMgl9IH0sCi17ICAgICJtb3Z6d2wiLAl7InJ3d2wiLAkJMHhjMwl9IH0sCi17ICAgICJhZGRmIiwgICAgeyJybCIsICAgICAgICAgICAgICAgICAgMHhjNiAgICB9IH0sCi17ICAgICJhZGRkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhjNyAgICB9IH0sCi17ICAgICJ4b3JiMiIsICAgeyJyYm1iIiwgICAgICAgICAgICAgICAgMHhjOCAgICB9IH0sCi17ICAgICJtb3ZvYiIsICAgeyJyYndiIiwgICAgICAgICAgICAgICAgMHhjOSAgICB9IH0sCi17ICAgICJ4b3J3MiIsICAgeyJyd213IiwgICAgICAgICAgICAgICAgMHhjYSAgICB9IH0sCi17ICAgICJtb3ZvdyIsICAgeyJyd3d3IiwgICAgICAgICAgICAgICAgMHhjYgl9IH0sCi17ICAgICJ4b3JsMiIsCXsicmxtbCIsICAgICAgICAgICAgICAgIDB4Y2MgICAgfSB9LAoteyAgICAibW92cHNsIiwgIHsid2wiLCAgICAgICAgICAgICAgICAgIDB4Y2QgICAgfSB9LAoteyAgICAia2NhbGwiLCAgIHsicnciLAkJCTB4Y2YJfSB9LAoteyAgICAicHJvYmV3IiwgIHsicmJhYnJsIiwJCTB4ZDAJfSB9LAoteyAgICAiYnZzIiwgICAgIHsiYmIiLAkJCTB4ZDEJfSB9LAoteyAgICAiY21wczMiLCAgIHsiYWJhYnJ3IiwJCTB4ZDIJfSB9LAoteyAgICAic3ViZiIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZDYgICAgfSB9LAoteyAgICAic3ViZCIsICAgIHsicnEiLCAgICAgICAgICAgICAgICAgIDB4ZDcgICAgfSB9LAoteyAgICAieG9yYjMiLAl7InJicmJ3YiIsCQkweGQ4CX0gfSwKLXsgICAgInB1c2hiIiwgICB7InJiIiwJCQkweGQ5CX0gfSwKLXsgICAgInhvcnczIiwJeyJyd3J3d3ciLAkJMHhkYQl9IH0sCi17ICAgICJwdXNodyIsICAgeyJydyIsIAkJCTB4ZGIJfSB9LAoteyAgICAieG9ybDMiLAl7InJscmx3bCIsCQkweGRjCX0gfSwKLXsgICAgInB1c2hsIiwJeyJybCIsCQkJMHhkZAl9IH0sCi17ICAgICJpbnNxdWUiLAl7ImFiYWIiLAkJMHhlMAl9IH0sCi17ICAgICJiY3MiLAl7ImJiIiwJCQkweGUxCX0gfSwKLXsgICAgImJnZXF1IiwJeyJiYiIsCQkJMHhlMQl9IH0sCi17ICAgICJtdWxmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhlNiAgICB9IH0sCi17ICAgICJtdWxkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhlNyAgICB9IH0sCi17ICAgICJtbmVnYiIsCXsicmJ3YiIsCQkweGU4CX0gfSwKLXsgICAgIm1vdmFiIiwJeyJhYndsIiwJCTB4ZTkJfSB9LAoteyAgICAibW5lZ3ciLAl7InJ3d3ciLAkJMHhlYQl9IH0sCi17ICAgICJtb3ZhdyIsCXsiYXd3bCIsCQkweGViCX0gfSwKLXsgICAgIm1uZWdsIiwJeyJybHdsIiwJCTB4ZWMJfSB9LAoteyAgICAibW92YWwiLAl7ImFsd2wiLAkJMHhlZAl9IH0sCi17ICAgICJyZW1xdWUiLAl7ImFiIiwgIAkJMHhmMAl9IH0sCi17ICAgICJiY2MiLAl7ImJiIiwJCQkweGYxCX0gfSwKLXsgICAgImJsc3N1IiwJeyJiYiIsCQkJMHhmMQl9IH0sCi17ICAgICJkaXZmIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhmNiAgICB9IH0sCi17ICAgICJkaXZkIiwgICAgeyJycSIsICAgICAgICAgICAgICAgICAgMHhmNyAgICB9IH0sCi17ICAgICJtb3ZibGsiLCAgeyJhbGFscnciLCAgICAgICAgICAgICAgMHhmOAl9IH0sCi17ICAgICJwdXNoYWIiLAl7ImFiIiwJCQkweGY5CX0gfSwKLXsgICAgInB1c2hhdyIsCXsiYXciLAkJCTB4ZmIJfSB9LAoteyAgICAiY2FzZWwiLAl7InJscmxybCIsCQkweGZjCX0gfSwKLXsgICAgInB1c2hhbCIsCXsiYWwiLAkJCTB4ZmQJfSB9LAoteyAgICAiY2FsbGYiLAl7InJiYWIiLAkJMHhmZQl9IH0sCi17ICAgICAgIiIgICAgICAgLCAgICIiICAgICAgICAgIH0gLyogZW1wdHkgaXMgZW5kIHNlbnRpbmVsICovCi0KLX07CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWMzMC5oIGIvaW5jbHVkZS9vcGNvZGUvdGljMzAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwMDI3NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS90aWMzMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkxICswLDAgQEAKLS8qIHRpYzMwLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJIFRNUzMyMEMzMCBvcGNvZGUgdGFibGUKLSAgIENvcHlyaWdodCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgU3RldmVuIEhhd29ydGggKHN0ZXZlQHBtLmNzZS5ybWl0LmVkdS5hdSkKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZJWE1FOiBUaGUgb3Bjb2RlIHRhYmxlIHNob3VsZCBiZSBpbiBvcGNvZGVzL3RpYzMwLW9wYy5jLCBub3QgaW4gYQotICAgaGVhZGVyIGZpbGUuICAqLwotCi0jaWZuZGVmIF9UTVMzMjBfSF8KLSNkZWZpbmUgX1RNUzMyMF9IXwotCi1zdHJ1Y3QgX3JlZ2lzdGVyCi17Ci0gIGNoYXIgKm5hbWU7Ci0gIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOwotICB1bnNpZ25lZCBjaGFyIHJlZ3R5cGU7Ci19OwotCi10eXBlZGVmIHN0cnVjdCBfcmVnaXN0ZXIgcmVnOwotCi0jZGVmaW5lIFJFR19SbiAgICAweDAxCi0jZGVmaW5lIFJFR19BUm4gICAweDAyCi0jZGVmaW5lIFJFR19EUCAgICAweDAzCi0jZGVmaW5lIFJFR19PVEhFUiAweDA0Ci0KLXN0YXRpYyBjb25zdCByZWcgdGljMzBfcmVndGFiW10gPSB7Ci0gIHsgInIwIiwgMHgwMCwgUkVHX1JuIH0sCi0gIHsgInIxIiwgMHgwMSwgUkVHX1JuIH0sCi0gIHsgInIyIiwgMHgwMiwgUkVHX1JuIH0sCi0gIHsgInIzIiwgMHgwMywgUkVHX1JuIH0sCi0gIHsgInI0IiwgMHgwNCwgUkVHX1JuIH0sCi0gIHsgInI1IiwgMHgwNSwgUkVHX1JuIH0sCi0gIHsgInI2IiwgMHgwNiwgUkVHX1JuIH0sCi0gIHsgInI3IiwgMHgwNywgUkVHX1JuIH0sCi0gIHsgImFyMCIsMHgwOCwgUkVHX0FSbiB9LAotICB7ICJhcjEiLDB4MDksIFJFR19BUm4gfSwKLSAgeyAiYXIyIiwweDBBLCBSRUdfQVJuIH0sCi0gIHsgImFyMyIsMHgwQiwgUkVHX0FSbiB9LAotICB7ICJhcjQiLDB4MEMsIFJFR19BUm4gfSwKLSAgeyAiYXI1IiwweDBELCBSRUdfQVJuIH0sCi0gIHsgImFyNiIsMHgwRSwgUkVHX0FSbiB9LAotICB7ICJhcjciLDB4MEYsIFJFR19BUm4gfSwKLSAgeyAiZHAiLCAweDEwLCBSRUdfRFAgfSwKLSAgeyAiaXIwIiwweDExLCBSRUdfT1RIRVIgfSwKLSAgeyAiaXIxIiwweDEyLCBSRUdfT1RIRVIgfSwKLSAgeyAiYmsiLCAweDEzLCBSRUdfT1RIRVIgfSwKLSAgeyAic3AiLCAweDE0LCBSRUdfT1RIRVIgfSwKLSAgeyAic3QiLCAweDE1LCBSRUdfT1RIRVIgfSwKLSAgeyAiaWUiLCAweDE2LCBSRUdfT1RIRVIgfSwKLSAgeyAiaWYiLCAweDE3LCBSRUdfT1RIRVIgfSwKLSAgeyAiaW9mIiwweDE4LCBSRUdfT1RIRVIgfSwKLSAgeyAicnMiLCAweDE5LCBSRUdfT1RIRVIgfSwKLSAgeyAicmUiLCAweDFBLCBSRUdfT1RIRVIgfSwKLSAgeyAicmMiLCAweDFCLCBSRUdfT1RIRVIgfSwKLSAgeyAiUjAiLCAweDAwLCBSRUdfUm4gfSwKLSAgeyAiUjEiLCAweDAxLCBSRUdfUm4gfSwKLSAgeyAiUjIiLCAweDAyLCBSRUdfUm4gfSwKLSAgeyAiUjMiLCAweDAzLCBSRUdfUm4gfSwKLSAgeyAiUjQiLCAweDA0LCBSRUdfUm4gfSwKLSAgeyAiUjUiLCAweDA1LCBSRUdfUm4gfSwKLSAgeyAiUjYiLCAweDA2LCBSRUdfUm4gfSwKLSAgeyAiUjciLCAweDA3LCBSRUdfUm4gfSwKLSAgeyAiQVIwIiwweDA4LCBSRUdfQVJuIH0sCi0gIHsgIkFSMSIsMHgwOSwgUkVHX0FSbiB9LAotICB7ICJBUjIiLDB4MEEsIFJFR19BUm4gfSwKLSAgeyAiQVIzIiwweDBCLCBSRUdfQVJuIH0sCi0gIHsgIkFSNCIsMHgwQywgUkVHX0FSbiB9LAotICB7ICJBUjUiLDB4MEQsIFJFR19BUm4gfSwKLSAgeyAiQVI2IiwweDBFLCBSRUdfQVJuIH0sCi0gIHsgIkFSNyIsMHgwRiwgUkVHX0FSbiB9LAotICB7ICJEUCIsIDB4MTAsIFJFR19EUCB9LAotICB7ICJJUjAiLDB4MTEsIFJFR19PVEhFUiB9LAotICB7ICJJUjEiLDB4MTIsIFJFR19PVEhFUiB9LAotICB7ICJCSyIsIDB4MTMsIFJFR19PVEhFUiB9LAotICB7ICJTUCIsIDB4MTQsIFJFR19PVEhFUiB9LAotICB7ICJTVCIsIDB4MTUsIFJFR19PVEhFUiB9LAotICB7ICJJRSIsIDB4MTYsIFJFR19PVEhFUiB9LAotICB7ICJJRiIsIDB4MTcsIFJFR19PVEhFUiB9LAotICB7ICJJT0YiLDB4MTgsIFJFR19PVEhFUiB9LAotICB7ICJSUyIsIDB4MTksIFJFR19PVEhFUiB9LAotICB7ICJSRSIsIDB4MUEsIFJFR19PVEhFUiB9LAotICB7ICJSQyIsIDB4MUIsIFJFR19PVEhFUiB9LAotICB7ICIiLCAgIDAsIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHJlZyAqY29uc3QgdGljMzBfcmVndGFiX2VuZAotICA9IHRpYzMwX3JlZ3RhYiArIHNpemVvZih0aWMzMF9yZWd0YWIpL3NpemVvZih0aWMzMF9yZWd0YWJbMF0pOwotCi0vKiBJbmRpcmVjdCBBZGRyZXNzaW5nIE1vZGVzIE1vZGlmaWNhdGlvbiBGaWVsZHMgKi8KLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBEaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgUHJlRGlzcF9BZGQgICAgICAgIDB4MDAKLSNkZWZpbmUgUHJlRGlzcF9TdWIgICAgICAgIDB4MDEKLSNkZWZpbmUgUHJlRGlzcF9BZGRfTW9kICAgIDB4MDIKLSNkZWZpbmUgUHJlRGlzcF9TdWJfTW9kICAgIDB4MDMKLSNkZWZpbmUgUG9zdERpc3BfQWRkX01vZCAgIDB4MDQKLSNkZWZpbmUgUG9zdERpc3BfU3ViX01vZCAgIDB4MDUKLSNkZWZpbmUgUG9zdERpc3BfQWRkX0NpcmMgIDB4MDYKLSNkZWZpbmUgUG9zdERpc3BfU3ViX0NpcmMgIDB4MDcKLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjAgKi8KLSNkZWZpbmUgUHJlSVIwX0FkZCAgICAgICAgIDB4MDgKLSNkZWZpbmUgUHJlSVIwX1N1YiAgICAgICAgIDB4MDkKLSNkZWZpbmUgUHJlSVIwX0FkZF9Nb2QgICAgIDB4MEEKLSNkZWZpbmUgUHJlSVIwX1N1Yl9Nb2QgICAgIDB4MEIKLSNkZWZpbmUgUG9zdElSMF9BZGRfTW9kICAgIDB4MEMKLSNkZWZpbmUgUG9zdElSMF9TdWJfTW9kICAgIDB4MEQKLSNkZWZpbmUgUG9zdElSMF9BZGRfQ2lyYyAgIDB4MEUKLSNkZWZpbmUgUG9zdElSMF9TdWJfQ2lyYyAgIDB4MEYKLS8qIEluZGlyZWN0IEFkZHJlc3Npbmcgd2l0aCBJbmRleCBSZWdpc3RlciBJUjEgKi8KLSNkZWZpbmUgUHJlSVIxX0FkZCAgICAgICAgIDB4MTAKLSNkZWZpbmUgUHJlSVIxX1N1YiAgICAgICAgIDB4MTEKLSNkZWZpbmUgUHJlSVIxX0FkZF9Nb2QgICAgIDB4MTIKLSNkZWZpbmUgUHJlSVIxX1N1Yl9Nb2QgICAgIDB4MTMKLSNkZWZpbmUgUG9zdElSMV9BZGRfTW9kICAgIDB4MTQKLSNkZWZpbmUgUG9zdElSMV9TdWJfTW9kICAgIDB4MTUKLSNkZWZpbmUgUG9zdElSMV9BZGRfQ2lyYyAgIDB4MTYKLSNkZWZpbmUgUG9zdElSMV9TdWJfQ2lyYyAgIDB4MTcKLS8qIEluZGlyZWN0IEFkZHJlc3NpbmcgKFNwZWNpYWwgQ2FzZXMpICovCi0jZGVmaW5lIEluZGlyZWN0T25seSAgICAgICAweDE4Ci0jZGVmaW5lIFBvc3RJUjBfQWRkX0JpdFJldiAweDE5Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqc3ludGF4OwotICB1bnNpZ25lZCBjaGFyIG1vZGZpZWxkOwotICB1bnNpZ25lZCBjaGFyIGRpc3BsYWNlbWVudDsKLX0gaW5kX2FkZHJfdHlwZTsKLQotI2RlZmluZSBJTVBMSUVEX0RJU1AgIDB4MDEKLSNkZWZpbmUgRElTUF9SRVFVSVJFRCAweDAyCi0jZGVmaW5lIE5PX0RJU1AgICAgICAgMHgwMwotCi1zdGF0aWMgY29uc3QgaW5kX2FkZHJfdHlwZSB0aWMzMF9pbmRhZGRyX3RhYltdID0gewotICB7ICIqK2FyIiwgICAgICAgUHJlRGlzcF9BZGQsICAgICAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKi1hciIsICAgICAgIFByZURpc3BfU3ViLCAgICAgICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiorK2FyIiwgICAgICBQcmVEaXNwX0FkZF9Nb2QsICAgIElNUExJRURfRElTUCB9LAotICB7ICIqLS1hciIsICAgICAgUHJlRGlzcF9TdWJfTW9kLCAgICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyKysiLCAgICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiphci0tIiwgICAgICBQb3N0RGlzcF9TdWJfTW9kLCAgIElNUExJRURfRElTUCB9LAotICB7ICIqYXIrKyUiLCAgICAgUG9zdERpc3BfQWRkX0NpcmMsICBJTVBMSUVEX0RJU1AgfSwKLSAgeyAiKmFyLS0lIiwgICAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgSU1QTElFRF9ESVNQIH0sCi0gIHsgIiorYXIoKSIsICAgICBQcmVEaXNwX0FkZCwgICAgICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKi1hcigpIiwgICAgIFByZURpc3BfU3ViLCAgICAgICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqKythcigpIiwgICAgUHJlRGlzcF9BZGRfTW9kLCAgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiotLWFyKCkiLCAgICBQcmVEaXNwX1N1Yl9Nb2QsICAgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyKysoKSIsICAgIFBvc3REaXNwX0FkZF9Nb2QsICAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqYXItLSgpIiwgICAgUG9zdERpc3BfU3ViX01vZCwgICBESVNQX1JFUVVJUkVEIH0sCi0gIHsgIiphcisrKCklIiwgICBQb3N0RGlzcF9BZGRfQ2lyYywgIERJU1BfUkVRVUlSRUQgfSwKLSAgeyAiKmFyLS0oKSUiLCAgIFBvc3REaXNwX1N1Yl9DaXJjLCAgRElTUF9SRVFVSVJFRCB9LAotICB7ICIqK2FyKGlyMCkiLCAgUHJlSVIwX0FkZCwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiotYXIoaXIwKSIsICBQcmVJUjBfU3ViLCAgICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKisrYXIoaXIwKSIsIFByZUlSMF9BZGRfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqLS1hcihpcjApIiwgUHJlSVIwX1N1Yl9Nb2QsICAgICBOT19ESVNQIH0sCi0gIHsgIiphcisrKGlyMCkiLCBQb3N0SVIwX0FkZF9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyLS0oaXIwKSIsIFBvc3RJUjBfU3ViX01vZCwgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjApJSIsUG9zdElSMF9BZGRfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMCklIixQb3N0SVIwX1N1Yl9DaXJjLCAgIE5PX0RJU1AgfSwKLSAgeyAiKithcihpcjEpIiwgIFByZUlSMV9BZGQsICAgICAgICAgTk9fRElTUCB9LAotICB7ICIqLWFyKGlyMSkiLCAgUHJlSVIxX1N1YiwgICAgICAgICBOT19ESVNQIH0sCi0gIHsgIiorK2FyKGlyMSkiLCBQcmVJUjFfQWRkX01vZCwgICAgIE5PX0RJU1AgfSwKLSAgeyAiKi0tYXIoaXIxKSIsIFByZUlSMV9TdWJfTW9kLCAgICAgTk9fRElTUCB9LAotICB7ICIqYXIrKyhpcjEpIiwgUG9zdElSMV9BZGRfTW9kLCAgICBOT19ESVNQIH0sCi0gIHsgIiphci0tKGlyMSkiLCBQb3N0SVIxX1N1Yl9Nb2QsICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIxKSUiLFBvc3RJUjFfQWRkX0NpcmMsICAgTk9fRElTUCB9LAotICB7ICIqYXItLShpcjEpJSIsUG9zdElSMV9TdWJfQ2lyYywgICBOT19ESVNQIH0sCi0gIHsgIiphciIsICAgICAgICBJbmRpcmVjdE9ubHksICAgICAgIE5PX0RJU1AgfSwKLSAgeyAiKmFyKysoaXIwKWIiLFBvc3RJUjBfQWRkX0JpdFJldiwgTk9fRElTUCB9LAotICB7ICIiLCAgICAgICAgICAgMCwwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbmRfYWRkcl90eXBlICpjb25zdCB0aWMzMF9pbmRhZGRydGFiX2VuZAotICA9IHRpYzMwX2luZGFkZHJfdGFiICsgc2l6ZW9mKHRpYzMwX2luZGFkZHJfdGFiKS9zaXplb2YodGljMzBfaW5kYWRkcl90YWJbMF0pOwotCi0vKiBQb3NzaWJsZSBvcGVyYW5kIHR5cGVzICovCi0vKiBSZWdpc3RlciB0eXBlcyAqLwotI2RlZmluZSBSbiAgICAgICAweDAwMDEKLSNkZWZpbmUgQVJuICAgICAgMHgwMDAyCi0jZGVmaW5lIERQUmVnICAgIDB4MDAwNAotI2RlZmluZSBPdGhlclJlZyAweDAwMDgKLS8qIEFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLwotI2RlZmluZSBEaXJlY3QgICAweDAwMTAKLSNkZWZpbmUgSW5kaXJlY3QgMHgwMDIwCi0jZGVmaW5lIEltbTE2ICAgIDB4MDA0MAotI2RlZmluZSBEaXNwICAgICAweDAwODAKLSNkZWZpbmUgSW1tMjQgICAgMHgwMTAwCi0jZGVmaW5lIEFiczI0ICAgIDB4MDIwMAotLyogMyBvcGVyYW5kIGFkZHJlc3NpbmcgbW9kZSB0eXBlcyAqLwotI2RlZmluZSBvcDNUMSAgICAweDA0MDAKLSNkZWZpbmUgb3AzVDIgICAgMHgwODAwCi0vKiBJbnRlcnJ1cHQgdmVjdG9yICovCi0jZGVmaW5lIElWZWN0b3IgIDB4MTAwMAotLyogTm90IHJlcXVpcmVkICovCi0jZGVmaW5lIE5vdFJlcSAgIDB4MjAwMAotCi0jZGVmaW5lIEdBZGRyMSAgIFJuIHwgRGlyZWN0IHwgSW5kaXJlY3QgfCBJbW0xNgotI2RlZmluZSBHQWRkcjIgICBHQWRkcjEgfCBBbGxSZWcKLSNkZWZpbmUgVEFkZHIxICAgb3AzVDEgfCBSbiB8IEluZGlyZWN0Ci0jZGVmaW5lIFRBZGRyMiAgIG9wM1QyIHwgUm4gfCBJbmRpcmVjdAotI2RlZmluZSBSZWcgICAgICBSbiB8IEFSbgotI2RlZmluZSBBbGxSZWcgICBSZWcgfCBEUFJlZyB8IE90aGVyUmVnCi0KLXR5cGVkZWYgc3RydWN0IF90ZW1wbGF0ZQotewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHM7IC8qIGhvdyBtYW55IG9wZXJhbmRzICovCi0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsgLyogYmFzZV9vcGNvZGUgaXMgdGhlIGZ1bmRhbWVudGFsIG9wY29kZSBieXRlICovCi0gIC8qIHRoZSBiaXRzIGluIG9wY29kZV9tb2RpZmllciBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZmluYWwgb3Bjb2RlIGZyb20KLSAgICAgdGhlIGJhc2Vfb3Bjb2RlLiAgVGhlc2UgYml0cyBhbHNvIGFyZSB1c2VkIHRvIGRldGVjdCBhbHRlcm5hdGUgZm9ybXMgb2YKLSAgICAgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24gKi8KLSAgdW5zaWduZWQgaW50IG9wY29kZV9tb2RpZmllcjsKLQotICAvKiBvcGNvZGVfbW9kaWZpZXIgYml0czogKi8KLSNkZWZpbmUgQWRkcmVzc01vZGUgMHgwMDYwMDAwMAotI2RlZmluZSBQQ1JlbCAgICAgICAweDAyMDAwMDAwCi0jZGVmaW5lIFN0YWNrT3AgICAgIDB4MDAxRjAwMDAKLSNkZWZpbmUgUm90YXRlICAgICAgU3RhY2tPcAotICAKLSAgLyogb3BlcmFuZF90eXBlc1tpXSBkZXNjcmliZXMgdGhlIHR5cGUgb2Ygb3BlcmFuZCBpLiAgVGhpcyBpcyBtYWRlCi0gICAgIGJ5IE9SJ2luZyB0b2dldGhlciBhbGwgb2YgdGhlIHBvc3NpYmxlIHR5cGUgbWFza3MuICAoZS5nLgotICAgICAnb3BlcmFuZF90eXBlc1tpXSA9IFJlZ3xJbW0nIHNwZWNpZmllcyB0aGF0IG9wZXJhbmQgaSBjYW4gYmUKLSAgICAgZWl0aGVyIGEgcmVnaXN0ZXIgb3IgYW4gaW1tZWRpYXRlIG9wZXJhbmQgKi8KLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbM107Ci0gIC8qIFRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIHR5cGUgb2YgYW4gaW1tZWRpYXRlIGFyZ3VtZW50IHRvIGFuIGluc3RydWN0aW9uLiAqLwotICBpbnQgaW1tX2FyZ190eXBlOwotI2RlZmluZSBJbW1fTm9uZSAgMAotI2RlZmluZSBJbW1fRmxvYXQgMQotI2RlZmluZSBJbW1fU0ludCAgMgotI2RlZmluZSBJbW1fVUludCAgMwotfQotdGVtcGxhdGU7Ci0KLXN0YXRpYyBjb25zdCB0ZW1wbGF0ZSB0aWMzMF9vcHRhYltdID0gewotICB7ICJhYnNmIiAgICwyLDB4MDAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAiYWJzaSIgICAsMiwweDAwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImFkZGMiICAgLDIsMHgwMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhZGRjMyIgICwzLDB4MjAwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFkZGYiICAgLDIsMHgwMTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJhZGRmMyIgICwzLDB4MjA4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCi0gIHsgImFkZGkiICAgLDIsMHgwMjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhZGRpMyIgICwzLDB4MjEwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFuZCIgICAgLDIsMHgwMjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJhbmQzIiAgICwzLDB4MjE4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFuZG4iICAgLDIsMHgwMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJhbmRuMyIgICwzLDB4MjIwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImFzaCIgICAgLDIsMHgwMzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJhc2gzIiAgICwzLDB4MjI4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgImIiICAgICAgLDEsMHg2ODAwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidSIgICAgICwxLDB4NjgwMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmxvIiAgICAsMSwweDY4MDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJscyIgICAgLDEsMHg2ODAyMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiaGkiICAgICwxLDB4NjgwMzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhzIiAgICAsMSwweDY4MDQwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJlcSIgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmUiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx0IiAgICAsMSwweDY4MDcwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsZSIgICAgLDEsMHg2ODA4MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZ3QiICAgICwxLDB4NjgwOTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmdlIiAgICAsMSwweDY4MEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6IiAgICAgLDEsMHg2ODA1MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnoiICAgICwxLDB4NjgwNjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnAiICAgICAsMSwweDY4MDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuIiAgICAgLDEsMHg2ODA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibm4iICAgICwxLDB4NjgwQTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm52IiAgICAsMSwweDY4MEMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ2IiAgICAgLDEsMHg2ODBEMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibnVmIiAgICwxLDB4NjgwRTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVmIiAgICAsMSwweDY4MEYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJuYyIgICAgLDEsMHg2ODA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiYyIgICAgICwxLDB4NjgwMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdiIgICAsMSwweDY4MTAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdiIgICAgLDEsMHg2ODExMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmx1ZiIgICwxLDB4NjgxMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmx1ZiIgICAsMSwweDY4MTMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ6dWYiICAgLDEsMHg2ODE0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZCIgICAgICwxLDB4NjgyMDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnVkIiAgICAsMSwweDY4MjAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsb2QiICAgLDEsMHg2ODIxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHNkIiAgICwxLDB4NjgyMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmhpZCIgICAsMSwweDY4MjMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJoc2QiICAgLDEsMHg2ODI0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiZXFkIiAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5lZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdGQiICAgLDEsMHg2ODI3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibGVkIiAgICwxLDB4NjgyODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmd0ZCIgICAsMSwweDY4MjkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJnZWQiICAgLDEsMHg2ODJBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJiemQiICAgICwxLDB4NjgyNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm56ZCIgICAsMSwweDY4MjYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJwZCIgICAgLDEsMHg2ODI5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmQiICAgICwxLDB4NjgyNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5uZCIgICAsMSwweDY4MkEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJudmQiICAgLDEsMHg2ODJDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJidmQiICAgICwxLDB4NjgyRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm51ZmQiICAsMSwweDY4MkUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJ1ZmQiICAgLDEsMHg2ODJGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibmNkIiAgICwxLDB4NjgyNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYmNkIiAgICAsMSwweDY4MjEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJubHZkIiAgLDEsMHg2ODMwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJibHZkIiAgICwxLDB4NjgzMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYm5sdWZkIiAsMSwweDY4MzIwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImJsdWZkIiAgLDEsMHg2ODMzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJienVmZCIgICwxLDB4NjgzNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiYnIiICAgICAsMSwweDYwMDAwMDAwLDAsICAgICAgICAgICB7IEltbTI0LCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImJyZCIgICAgLDEsMHg2MTAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsIiAgICwxLDB4NjIwMDAwMDAsMCwgICAgICAgICAgIHsgSW1tMjQsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbHUiICAsMSwweDcwMDAwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsbyIgLDEsMHg3MDAxMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbHMiICwxLDB4NzAwMjAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGhpIiAsMSwweDcwMDMwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxocyIgLDEsMHg3MDA0MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsZXEiICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5lIiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdCIgLDEsMHg3MDA3MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbGUiICwxLDB4NzAwODAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGd0IiAsMSwweDcwMDkwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxnZSIgLDEsMHg3MDBBMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxseiIgICwxLDB4NzAwNTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG56IiAsMSwweDcwMDYwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxwIiAgLDEsMHg3MDA5MDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbiIgICwxLDB4NzAwNzAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5uIiAsMSwweDcwMEEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxudiIgLDEsMHg3MDBDMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsdiIgICwxLDB4NzAwRDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG51ZiIsMSwweDcwMEUwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGx1ZiIgLDEsMHg3MDBGMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbmMiICwxLDB4NzAwNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbGMiICAsMSwweDcwMDEwMDAwLFBDUmVsLCAgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxubHYiLDEsMHg3MDEwMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsbHYiICwxLDB4NzAxMTAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY2FsbG5sdWYiLDEsMHg3MDEyMDAwMCxQQ1JlbCwgICAgICB7IEFsbFJlZ3xEaXNwLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImNhbGxsdWYiLDEsMHg3MDEzMDAwMCxQQ1JlbCwgICAgICAgeyBBbGxSZWd8RGlzcCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJjYWxsenVmIiwxLDB4NzAxNDAwMDAsUENSZWwsICAgICAgIHsgQWxsUmVnfERpc3AsIDAsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAiY21wZiIgICAsMiwweDA0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImNtcGYzIiAgLDIsMHgyMzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJjbXBpIiAgICwyLDB4MDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAiY21waTMiICAsMiwweDIzODAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGIiICAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1IiAgICAsMiwweDZDMDAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsbyIgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJscyIgICAsMiwweDZDMDIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoaSIgICAsMiwweDZDMDMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJocyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJlcSIgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZSIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdCIgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsZSIgICAsMiwweDZDMDgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJndCIgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJnZSIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6IiAgICAsMiwweDZDMDUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJueiIgICAsMiwweDZDMDYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJwIiAgICAsMiwweDZDMDkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuIiAgICAsMiwweDZDMDcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubiIgICAsMiwweDZDMEEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudiIgICAsMiwweDZDMEMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ2IiAgICAsMiwweDZDMEQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudWYiICAsMiwweDZDMEUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZiIgICAsMiwweDZDMEYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuYyIgICAsMiwweDZDMDQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJjIiAgICAsMiwweDZDMDEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHYiICAsMiwweDZDMTAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdiIgICAsMiwweDZDMTEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHVmIiAsMiwweDZDMTIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdWYiICAsMiwweDZDMTMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6dWYiICAsMiwweDZDMTQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJkIiAgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZCIgICAsMiwweDZDMjAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsb2QiICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsc2QiICAsMiwweDZDMjIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoaWQiICAsMiwweDZDMjMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJoc2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJlcWQiICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZWQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdGQiICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsZWQiICAsMiwweDZDMjgwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJndGQiICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJnZWQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6ZCIgICAsMiwweDZDMjUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuemQiICAsMiwweDZDMjYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJwZCIgICAsMiwweDZDMjkwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuZCIgICAsMiwweDZDMjcwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubmQiICAsMiwweDZDMkEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudmQiICAsMiwweDZDMkMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ2ZCIgICAsMiwweDZDMkQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJudWZkIiAsMiwweDZDMkUwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ1ZmQiICAsMiwweDZDMkYwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJuY2QiICAsMiwweDZDMjQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJjZCIgICAsMiwweDZDMjEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHZkIiAsMiwweDZDMzAwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdmQiICAsMiwweDZDMzEwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJubHVmZCIsMiwweDZDMzIwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJsdWZkIiAsMiwweDZDMzMwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZGJ6dWZkIiAsMiwweDZDMzQwMDAwLFBDUmVsLCAgICAgICB7IEFSbiwgQWxsUmVnfERpc3AsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAiZml4IiAgICAsMiwweDA1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgQWxsUmVnLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJmbG9hdCIgICwyLDB4MDU4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBSbiwgMCB9LCBJbW1fU0ludCB9LAotICB7ICJpYWNrIiAgICwxLDB4MUIwMDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImlkbGUiICAgLDAsMHgwNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImlkbGUyIiAgLDAsMHgwNjAwMDAwMSwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sIC8qIExDMzEgT25seSAqLwotICB7ICJsZGUiICAgICwyLDB4MDY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmIiAgICAsMiwweDA3MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZnUiICAgLDIsMHg0MDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsbyIgICwyLDB4NDA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbHMiICAsMiwweDQxMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmhpIiAgLDIsMHg0MTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZocyIgICwyLDB4NDIwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmZXEiICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5lIiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdCIgICwyLDB4NDM4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbGUiICAsMiwweDQ0MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmd0IiAgLDIsMHg0NDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZnZSIgICwyLDB4NDUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmeiIgICAsMiwweDQyODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm56IiAgLDIsMHg0MzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZwIiAgICwyLDB4NDQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbiIgICAsMiwweDQzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5uIiAgLDIsMHg0NTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZudiIgICwyLDB4NDYwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmdiIgICAsMiwweDQ2ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm51ZiIgLDIsMHg0NzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZ1ZiIgICwyLDB4NDc4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbmMiICAsMiwweDQyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmMiICAgLDIsMHg0MDgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZubHYiICwyLDB4NDgwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmbHYiICAsMiwweDQ4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZm5sdWYiLDIsMHg0OTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJsZGZsdWYiICwyLDB4NDk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibGRmenVmIiAsMiwweDRBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkZmkiICAgLDIsMHgwNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBEaXJlY3R8SW5kaXJlY3QsIFJuLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgImxkaSIgICAgLDIsMHgwODAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGl1IiAgICwyLDB4NTAwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbG8iICAsMiwweDUwODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWxzIiAgLDIsMHg1MTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGloaSIgICwyLDB4NTE4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpaHMiICAsMiwweDUyMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWVxIiAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGluZSIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHQiICAsMiwweDUzODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWxlIiAgLDIsMHg1NDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlndCIgICwyLDB4NTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpZ2UiICAsMiwweDU1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXoiICAgLDIsMHg1MjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlueiIgICwyLDB4NTMwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpcCIgICAsMiwweDU0ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW4iICAgLDIsMHg1MzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubiIgICwyLDB4NTUwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbnYiICAsMiwweDU2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXYiICAgLDIsMHg1NjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGludWYiICwyLDB4NTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpdWYiICAsMiwweDU3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaW5jIiAgLDIsMHg1MjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGljIiAgICwyLDB4NTA4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbmx2IiAsMiwweDU4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaWx2IiAgLDIsMHg1ODgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlubHVmIiwyLDB4NTkwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAibGRpbHVmIiAsMiwweDU5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgImxkaXp1ZiIgLDIsMHg1QTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJsZGlpIiAgICwyLDB4MDg4MDAwMDAsQWRkcmVzc01vZGUsIHsgRGlyZWN0fEluZGlyZWN0LCBBbGxSZWcsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAibGRtIiAgICAsMiwweDA5MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgImxkcCIgICAgLDIsMHgwODcwMDAwMCwwLCAgICAgICAgICAgeyBBYnMyNHxEaXJlY3QsIERQUmVnfE5vdFJlcSwgMCB9LCBJbW1fVUludCB9LAotICB7ICJsb3Bvd2VyIiwwLDB4MTA4MDAwMDEsMCwgICAgICAgICAgIHsgMCwgMCwgMCB9LCBJbW1fTm9uZSB9LCAvKiBMQzMxIE9ubHkgKi8KLSAgeyAibHNoIiAgICAsMiwweDA5ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgImxzaDMiICAgLDMsMHgyNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAibWF4c3BlZWQiLDAsMHgxMDgwMDAwMCwwLCAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwgLyogTEMzMSBPbmx5ICovCi0gIHsgIm1weWYiICAgLDIsMHgwQTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJtcHlmMyIgICwzLDB4MjQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxLCBUQWRkcjIsIFJuIH0sIEltbV9Ob25lIH0sCi0gIHsgIm1weWkiICAgLDIsMHgwQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJtcHlpMyIgICwzLDB4MjUwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgIm5lZ2IiICAgLDIsMHgwQjAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fU0ludCB9LAotICB7ICJuZWdmIiAgICwyLDB4MEI4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIxLCBSbiwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAibmVnaSIgICAsMiwweDBDMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgIm5vcCIgICAgLDEsMHgwQzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWd8SW5kaXJlY3R8Tm90UmVxLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgIm5vcm0iICAgLDIsMHgwRDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LCAvKkNoZWNrIGFub3RoZXIgc291cmNlKi8KLSAgeyAibm90IiAgICAsMiwweDBEODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgIm9yIiAgICAgLDIsMHgxMDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJvcjMiICAgICwzLDB4MjU4MDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgInBvcCIgICAgLDEsMHgwRTIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicG9wZiIgICAsMSwweDBFQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInB1c2giICAgLDEsMHgwRjIwMDAwMCxTdGFja09wLCAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicHVzaGYiICAsMSwweDBGQTAwMDAwLFN0YWNrT3AsICAgICB7IFJuLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGkiICAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl1IiAgLDAsMHg3ODAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsbyIgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlscyIgLDAsMHg3ODAyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGloaSIgLDAsMHg3ODAzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlocyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGllcSIgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluZSIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdCIgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsZSIgLDAsMHg3ODA4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlndCIgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlnZSIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl6IiAgLDAsMHg3ODA1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlueiIgLDAsMHg3ODA2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlwIiAgLDAsMHg3ODA5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluIiAgLDAsMHg3ODA3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubiIgLDAsMHg3ODBBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGludiIgLDAsMHg3ODBDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl2IiAgLDAsMHg3ODBEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGludWYiLDAsMHg3ODBFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl1ZiIgLDAsMHg3ODBGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGluYyIgLDAsMHg3ODA0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGljIiAgLDAsMHg3ODAxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubHYiLDAsMHg3ODEwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdiIgLDAsMHg3ODExMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlubHVmIiwwLDB4NzgxMjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGlsdWYiLDAsMHg3ODEzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldGl6dWYiLDAsMHg3ODE0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHMiICAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN1IiAgLDAsMHg3ODgwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsbyIgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNscyIgLDAsMHg3ODgyMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNoaSIgLDAsMHg3ODgzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNocyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNlcSIgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuZSIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdCIgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsZSIgLDAsMHg3ODg4MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNndCIgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNnZSIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN6IiAgLDAsMHg3ODg1MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNueiIgLDAsMHg3ODg2MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNwIiAgLDAsMHg3ODg5MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuIiAgLDAsMHg3ODg3MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubiIgLDAsMHg3ODhBMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNudiIgLDAsMHg3ODhDMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN2IiAgLDAsMHg3ODhEMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNudWYiLDAsMHg3ODhFMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN1ZiIgLDAsMHg3ODhGMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNuYyIgLDAsMHg3ODg0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNjIiAgLDAsMHg3ODgxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubHYiLDAsMHg3ODkwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdiIgLDAsMHg3ODkxMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNubHVmIiwwLDB4Nzg5MjAwMDAsMCwgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHNsdWYiLDAsMHg3ODkzMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJldHN6dWYiLDAsMHg3ODk0MDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJuZCIgICAgLDIsMHgxMTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJyb2wiICAgICwxLDB4MTFFMDAwMDEsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJvbGMiICAgLDEsMHgxMjYwMDAwMSxSb3RhdGUsICAgICAgeyBBbGxSZWcsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAicm9yIiAgICAsMSwweDEyRTBGRkZGLFJvdGF0ZSwgICAgICB7IEFsbFJlZywgMCwgMCB9LCBJbW1fTm9uZSB9LAotICB7ICJyb3JjIiAgICwxLDB4MTM2MEZGRkYsUm90YXRlLCAgICAgIHsgQWxsUmVnLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInJwdGIiICAgLDEsMHg2NDAwMDAwMCwwLCAgICAgICAgICAgeyBJbW0yNCwgMCwgMCB9LCBJbW1fVUludCB9LAotICB7ICJycHRzIiAgICwxLDB4MTM5QjAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCAwLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInNpZ2kiICAgLDAsMHgxNjAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInN0ZiIgICAgLDIsMHgxNDAwMDAwMCxBZGRyZXNzTW9kZSwgeyBSbiwgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdGZpIiAgICwyLDB4MTQ4MDAwMDAsQWRkcmVzc01vZGUsIHsgUm4sIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fRmxvYXQgfSwKLSAgeyAic3RpIiAgICAsMiwweDE1MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEFsbFJlZywgRGlyZWN0fEluZGlyZWN0LCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN0aWkiICAgLDIsMHgxNTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBBbGxSZWcsIERpcmVjdHxJbmRpcmVjdCwgMCB9LCBJbW1fU0ludCB9LAotICB7ICJzdWJiIiAgICwyLDB4MTY4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3ViYjMiICAsMywweDI2MDAwMDAwLEFkZHJlc3NNb2RlLCB7IFRBZGRyMXxBbGxSZWcsIFRBZGRyMnxBbGxSZWcsIEFsbFJlZyB9LCBJbW1fTm9uZSB9LAotICB7ICJzdWJjIiAgICwyLDB4MTcwMDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1VJbnQgfSwKLSAgeyAic3ViZiIgICAsMiwweDE3ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMSwgUm4sIDAgfSwgSW1tX0Zsb2F0IH0sCi0gIHsgInN1YmYzIiAgLDMsMHgyNjgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjEsIFRBZGRyMiwgUm4gfSwgSW1tX05vbmUgfSwKLSAgeyAic3ViaSIgICAsMiwweDE4MDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YmkzIiAgLDMsMHgyNzAwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCBBbGxSZWcgfSwgSW1tX05vbmUgfSwKLSAgeyAic3VicmIiICAsMiwweDE4ODAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9TSW50IH0sCi0gIHsgInN1YnJmIiAgLDIsMHgxOTAwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjEsIFJuLCAwIH0sIEltbV9GbG9hdCB9LAotICB7ICJzdWJyaSIgICwyLDB4MTk4MDAwMDAsQWRkcmVzc01vZGUsIHsgR0FkZHIyLCBBbGxSZWcsIDAgfSwgSW1tX1NJbnQgfSwKLSAgeyAic3dpIiAgICAsMCwweDY2MDAwMDAwLDAsICAgICAgICAgICB7IDAsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcCIgICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHUiICAsMSwweDc0ODAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxvIiAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxzIiAsMSwweDc0ODIwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGhpIiAsMSwweDc0ODMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGhzIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGVxIiAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5lIiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx0IiAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGxlIiAsMSwweDc0ODgwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGd0IiAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGdlIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHoiICAsMSwweDc0ODUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG56IiAsMSwweDc0ODYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHAiICAsMSwweDc0ODkwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG4iICAsMSwweDc0ODcwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5uIiAsMSwweDc0OEEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG52IiAsMSwweDc0OEMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHYiICAsMSwweDc0OEQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG51ZiIsMSwweDc0OEUwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHVmIiAsMSwweDc0OEYwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5jIiAsMSwweDc0ODQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGMiICAsMSwweDc0ODEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5sdiIsMSwweDc0OTAwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx2IiAsMSwweDc0OTEwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcG5sdWYiLDEsMHg3NDkyMDAyMCwwLCAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcGx1ZiIsMSwweDc0OTMwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHJhcHp1ZiIsMSwweDc0OTQwMDIwLDAsICAgICAgICAgICB7IElWZWN0b3IsIDAsIDAgfSwgSW1tX05vbmUgfSwKLSAgeyAidHN0YiIgICAsMiwweDFBMDAwMDAwLEFkZHJlc3NNb2RlLCB7IEdBZGRyMiwgQWxsUmVnLCAwIH0sIEltbV9VSW50IH0sCi0gIHsgInRzdGIzIiAgLDIsMHgyNzgwMDAwMCxBZGRyZXNzTW9kZSwgeyBUQWRkcjF8QWxsUmVnLCBUQWRkcjJ8QWxsUmVnLCAwIH0sIEltbV9Ob25lIH0sCi0gIHsgInhvciIgICAgLDIsMHgxQTgwMDAwMCxBZGRyZXNzTW9kZSwgeyBHQWRkcjIsIEFsbFJlZywgMCB9LCBJbW1fVUludCB9LAotICB7ICJ4b3IzIiAgICwzLDB4MjgwMDAwMDAsQWRkcmVzc01vZGUsIHsgVEFkZHIxfEFsbFJlZywgVEFkZHIyfEFsbFJlZywgQWxsUmVnIH0sIEltbV9Ob25lIH0sCi0gIHsgIiIgICAgICAgLDAsMHgwMDAwMDAwMCwwLCAgICAgICAgICAgeyAwLCAwLCAwIH0sIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHRlbXBsYXRlICpjb25zdCB0aWMzMF9vcHRhYl9lbmQgPQotICB0aWMzMF9vcHRhYiArIHNpemVvZih0aWMzMF9vcHRhYikvc2l6ZW9mKHRpYzMwX29wdGFiWzBdKTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBpbnQgb3BlcmFuZHNfMTsKLSAgdW5zaWduZWQgaW50IG9wZXJhbmRzXzI7Ci0gIHVuc2lnbmVkIGludCBiYXNlX29wY29kZTsKLSAgdW5zaWduZWQgaW50IG9wZXJhbmRfdHlwZXNbMl1bM107Ci0gIC8qIFdoaWNoIG9wZXJhbmQgZml0cyBpbnRvIHdoaWNoIHBhcnQgb2YgdGhlIGZpbmFsIG9wY29kZSB3b3JkLiAqLwotICBpbnQgb3BvcmRlcjsKLX0gcGFydGVtcGxhdGU7Ci0KLS8qIG9wb3JkZXIgZGVmaW5lcyAtIG5vdCB2ZXJ5IGRlc2NyaXB0aXZlLiAqLwotI2RlZmluZSBPT180b3AxICAgMAotI2RlZmluZSBPT180b3AyICAgMQotI2RlZmluZSBPT180b3AzICAgMgotI2RlZmluZSBPT181b3AxICAgMwotI2RlZmluZSBPT181b3AyICAgNAotI2RlZmluZSBPT19QRmllbGQgNQotCi1zdGF0aWMgY29uc3QgcGFydGVtcGxhdGUgdGljMzBfcGFyb3B0YWJbXSA9IHsKLSAgeyAicV9hYnNmX3N0ZiIsICAgMiwyLDB4QzgwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9hYnNpX3N0aSIsICAgMiwyLDB4Q0EwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDEgfSwKLSAgeyAicV9hZGRmM19zdGYiLCAgMywyLDB4Q0MwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfYWRkaTNfc3RpIiwgIDMsMiwweENFMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX2FuZDNfc3RpIiwgICAzLDIsMHhEMDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9hc2gzX3N0aSIsICAgMywyLDB4RDIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfZml4X3N0aSIsICAgIDIsMiwweEQ0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfZmxvYXRfc3RmIiwgIDIsMiwweEQ2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbGRmX2xkZiIsICAgIDIsMiwweEM0MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKLQlPT180b3AyIH0sCi0gIHsgInFfbGRmX3N0ZiIsICAgIDIsMiwweEQ4MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbGRpX2xkaSIsICAgIDIsMiwweEM2MDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgSW5kaXJlY3QsIFJuLCAwIH0gfSwKLQlPT180b3AyIH0sCi0gIHsgInFfbGRpX3N0aSIsICAgIDIsMiwweERBMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCAwIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT180b3AxIH0sCi0gIHsgInFfbHNoM19zdGkiLCAgIDMsMiwweERDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMiB9LAotICB7ICJxX21weWYzX2FkZGYzIiwzLDMsMHg4MDAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCi0gCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSB9LCBPT19QRmllbGQgfSwKLSAgeyAicV9tcHlmM19zdGYiLCAgMywyLDB4REUwMDAwMDAsIHsgeyBJbmRpcmVjdCwgUm4sIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AxIH0sCi0gIHsgInFfbXB5ZjNfc3ViZjMiLDMsMywweDg0MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbXB5aTNfYWRkaTMiLDMsMywweDg4MDAwMDAwLCB7IHsgUm4gfCBJbmRpcmVjdCwgUm4gfCBJbmRpcmVjdCwgUm4gfSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0gfSwgT09fUEZpZWxkIH0sCi0gIHsgInFfbXB5aTNfc3RpIiwgIDMsMiwweEUwMDAwMDAwLCB7IHsgSW5kaXJlY3QsIFJuLCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMSB9LAotICB7ICJxX21weWkzX3N1YmkzIiwzLDMsMHg4QzAwMDAwMCwgeyB7IFJuIHwgSW5kaXJlY3QsIFJuIHwgSW5kaXJlY3QsIFJuIH0sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBSbiB8IEluZGlyZWN0LCBSbiB8IEluZGlyZWN0LCBSbiB9IH0sIE9PX1BGaWVsZCB9LAotICB7ICJxX25lZ2Zfc3RmIiwgICAyLDIsMHhFMjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX25lZ2lfc3RpIiwgICAyLDIsMHhFNDAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX25vdF9zdGkiLCAgICAyLDIsMHhFNjAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgMCB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNG9wMSB9LAotICB7ICJxX29yM19zdGkiLCAgICAzLDIsMHhFODAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAicV9zdGZfc3RmIiwgICAgMiwyLDB4QzAwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDMgfSwKLSAgeyAicV9zdGlfc3RpIiwgICAgMiwyLDB4QzIwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIDAgfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzRvcDMgfSwKLSAgeyAicV9zdWJmM19zdGYiLCAgMywyLDB4RUEwMDAwMDAsIHsgeyBSbiwgSW5kaXJlY3QsIFJuIH0sIHsgUm4sIEluZGlyZWN0LCAwIH0gfSwKLQlPT181b3AyIH0sCi0gIHsgInFfc3ViaTNfc3RpIiwgIDMsMiwweEVDMDAwMDAwLCB7IHsgUm4sIEluZGlyZWN0LCBSbiB9LCB7IFJuLCBJbmRpcmVjdCwgMCB9IH0sCi0JT09fNW9wMiB9LAotICB7ICJxX3hvcjNfc3RpIiwgICAzLDIsMHhFRTAwMDAwMCwgeyB7IEluZGlyZWN0LCBSbiwgUm4gfSwgeyBSbiwgSW5kaXJlY3QsIDAgfSB9LAotCU9PXzVvcDEgfSwKLSAgeyAiIiwgICAgICAgICAgICAgMCwwLDB4MDAwMDAwMDAsIHsgeyAwLCAwLCAwIH0sIHsgMCwgMCwgMCB9IH0sIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHBhcnRlbXBsYXRlICpjb25zdCB0aWMzMF9wYXJvcHRhYl9lbmQgPQotICB0aWMzMF9wYXJvcHRhYiArIHNpemVvZih0aWMzMF9wYXJvcHRhYikvc2l6ZW9mKHRpYzMwX3Bhcm9wdGFiWzBdKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS90aWM4MC5oIGIvaW5jbHVkZS9vcGNvZGUvdGljODAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5YmMzMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29wY29kZS90aWM4MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qIHRpYzgwLmggLS0gSGVhZGVyIGZpbGUgZm9yIFRJIFRNUzMyMEM4MCAoTVYpIG9wY29kZSB0YWJsZQotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IEZyZWQgRmlzaCAoZm5mQGN5Z251cy5jb20pLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFRJQzgwX0gKLSNkZWZpbmUgVElDODBfSAotCi0vKiBUaGUgb3Bjb2RlIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB0aWM4MF9vcGNvZGUuICAqLwotCi1zdHJ1Y3QgdGljODBfb3Bjb2RlCi17Ci0gIC8qIFRoZSBvcGNvZGUgbmFtZS4gICovCi0KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aCBvcGVyYW5kcwotICAgICBhcmUgemVyb2VzLiAgKi8KLQotICB1bnNpZ25lZCBsb25nIG9wY29kZTsKLQotICAvKiBUaGUgb3Bjb2RlIG1hc2suICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRoaXMgaXMgYSBtYXNrCi0gICAgIGNvbnRhaW5pbmcgb25lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbXVzdCBtYXRjaCB0aGUgb3Bjb2RlCi0gICAgIGZpZWxkLCBhbmQgemVyb2VzIGluZGljYXRpbmcgdGhvc2UgYml0cyB3aGljaCBuZWVkIG5vdCBtYXRjaCAoYW5kIGFyZQotICAgICBwcmVzdW1hYmx5IGZpbGxlZCBpbiBieSBvcGVyYW5kcykuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgbWFzazsKLQotICAvKiBTcGVjaWFsIHB1cnBvc2UgZmxhZ3MgZm9yIHRoaXMgb3Bjb2RlLiAqLwotCi0gIHVuc2lnbmVkIGNoYXIgZmxhZ3M7Ci0KLSAgLyogQW4gYXJyYXkgb2Ygb3BlcmFuZCBjb2Rlcy4gIEVhY2ggY29kZSBpcyBhbiBpbmRleCBpbnRvIHRoZSBvcGVyYW5kCi0gICAgIHRhYmxlLiAgVGhleSBhcHBlYXIgaW4gdGhlIG9yZGVyIHdoaWNoIHRoZSBvcGVyYW5kcyBtdXN0IGFwcGVhciBpbgotICAgICBhc3NlbWJseSBjb2RlLCBhbmQgYXJlIHRlcm1pbmF0ZWQgYnkgYSB6ZXJvLiAgRklYTUU6IEFkanVzdCBzaXplIHRvCi0gICAgIG1hdGNoIGFjdHVhbCByZXF1aXJlbWVudHMgd2hlbiBUSWM4MCBzdXBwb3J0IGlzIGNvbXBsZXRlICovCi0KLSAgdW5zaWduZWQgY2hhciBvcGVyYW5kc1s4XTsKLX07Ci0KLS8qIFRoZSB0YWJsZSBpdHNlbGYgaXMgc29ydGVkIGJ5IG1ham9yIG9wY29kZSBudW1iZXIsIGFuZCBpcyBvdGhlcndpc2UgaW4KLSAgIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZGlzYXNzZW1ibGVyIHNob3VsZCBjb25zaWRlciBpbnN0cnVjdGlvbnMuCi0gICBGSVhNRTogVGhpcyBpc24ndCBjdXJyZW50bHkgdHJ1ZS4gKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgdGljODBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCB0aWM4MF9udW1fb3Bjb2RlczsKLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCB0aWM4MF9vcGVyYW5kLiAgKi8KLQotc3RydWN0IHRpYzgwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLQotICBpbnQgYml0czsKLQotICAvKiBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi0gIGludCBzaGlmdDsKLQotICAvKiBJbnNlcnRpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIFRvIGluc2VydCBhbgotICAgICBvcGVyYW5kIHZhbHVlIGludG8gYW4gaW5zdHJ1Y3Rpb24sIGNoZWNrIHRoaXMgZmllbGQuCi0KLSAgICAgSWYgaXQgaXMgTlVMTCwgZXhlY3V0ZQotICAgICAgICAgaSB8PSAob3AgJiAoKDEgPDwgby0+Yml0cykgLSAxKSkgPDwgby0+c2hpZnQ7Ci0gICAgIChpIGlzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB3ZSBhcmUgZmlsbGluZyBpbiwgbyBpcyBhIHBvaW50ZXIgdG8KLSAgICAgdGhpcyBzdHJ1Y3R1cmUsIGFuZCBvcCBpcyB0aGUgb3Bjb2RlIHZhbHVlOyB0aGlzIGFzc3VtZXMgdHdvcwotICAgICBjb21wbGVtZW50IGFyaXRobWV0aWMpLgotCi0gICAgIElmIHRoaXMgZmllbGQgaXMgbm90IE5VTEwsIHRoZW4gc2ltcGx5IGNhbGwgaXQgd2l0aCB0aGUKLSAgICAgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBvcGVyYW5kIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIG5ldyB2YWx1ZQotICAgICBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgRVJSTVNHIGFyZ3VtZW50IGlzIG5vdCBOVUxMLCB0aGVuIGlmCi0gICAgIHRoZSBvcGVyYW5kIHZhbHVlIGlzIGlsbGVnYWwsICpFUlJNU0cgd2lsbCBiZSBzZXQgdG8gYSB3YXJuaW5nCi0gICAgIHN0cmluZyAodGhlIG9wZXJhbmQgd2lsbCBiZSBpbnNlcnRlZCBpbiBhbnkgY2FzZSkuICBJZiB0aGUKLSAgICAgb3BlcmFuZCB2YWx1ZSBpcyBsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHVuY2hhbmdlZCAobW9zdCBvcGVyYW5kcwotICAgICBjYW4gYWNjZXB0IGFueSB2YWx1ZSkuICAqLwotCi0gIHVuc2lnbmVkIGxvbmcgKCppbnNlcnQpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGxvbmcgb3AsCi0JCQkJICAgY29uc3QgY2hhciAqKmVycm1zZykpOwotCi0gIC8qIEV4dHJhY3Rpb24gZnVuY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlci4gIFRvCi0gICAgIGV4dHJhY3QgdGhpcyBvcGVyYW5kIHR5cGUgZnJvbSBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBjb21wdXRlCi0gICAgICAgICBvcCA9ICgoaSkgPj4gby0+c2hpZnQpICYgKCgxIDw8IG8tPmJpdHMpIC0gMSk7Ci0JIGlmICgoby0+ZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NJR05FRCkgIT0gMAotCSAgICAgJiYgKG9wICYgKDEgPDwgKG8tPmJpdHMgLSAxKSkpICE9IDApCi0JICAgb3AgLT0gMSA8PCBvLT5iaXRzOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotCi0gIGxvbmcgKCpleHRyYWN0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBpbnQgKmludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0KLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgdGljODBfb3Bjb2RlcyB0YWJsZS4gICovCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCB0aWM4MF9vcGVyYW5kc1tdOwotCi0MCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHRpYzgwX29wZXJhbmQuCi0KLSAgIE5vdGUgdGhhdCBmbGFncyBmb3IgYWxsIHByZWRlZmluZWQgc3ltYm9scywgc3VjaCBhcyB0aGUgZ2VuZXJhbCBwdXJwb3NlCi0gICByZWdpc3RlcnMgKGV4OiByMTApLCBjb250cm9sIHJlZ2lzdGVycyAoZXg6IEZQU1QpLCBjb25kaXRpb24gY29kZXMgKGV4OgotICAgZXEwLmIpLCBiaXQgbnVtYmVycyAoZXg6IGd0LmIpLCBldGMgYXJlIGxhcmdlIGVub3VnaCB0aGF0IHRoZXkgY2FuIGJlCi0gICBvcidkIGludG8gYW4gaW50IHdoZXJlIHRoZSBsb3dlciBiaXRzIGNvbnRhaW4gdGhlIGFjdHVhbCBudW1lcmljIHZhbHVlCi0gICB0aGF0IGNvcnJlcG9uZHMgdG8gdGhpcyBwcmVkZWZpbmVkIHN5bWJvbC4gIFRoaXMgd2F5IGEgc2luZ2xlIGludCBjYW4KLSAgIGNvbnRhaW4gYm90aCB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBhbmQgaXQncyB0eXBlLgotICovCi0KLS8qIFRoaXMgb3BlcmFuZCBtdXN0IGJlIGFuIGV2ZW4gcmVnaXN0ZXIgbnVtYmVyLiAgRmxvYXRpbmcgcG9pbnQgbnVtYmVycwotICAgZm9yIGV4YW1wbGUgYXJlIHN0b3JlZCBpbiBldmVuL29kZCByZWdpc3RlciBwYWlycy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0VWRU4JKDEgPDwgMCkKLQotLyogVGhpcyBvcGVyYW5kIG11c3QgYmUgYW4gb2RkIHJlZ2lzdGVyIG51bWJlciBhbmQgbXVzdCBiZSBvbmUgZ3JlYXRlciB0aGFuCi0gICB0aGUgcmVnaXN0ZXIgbnVtYmVyIG9mIHRoZSBwcmV2aW91cyBvcGVyYW5kLiAgSS5FLiB0aGUgc2Vjb25kIHJlZ2lzdGVyIGluCi0gICBhbiBldmVuL29kZCByZWdpc3RlciBwYWlyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfT0RECSgxIDw8IDEpCi0KLS8qIFRoaXMgb3BlcmFuZCB0YWtlcyBzaWduZWQgdmFsdWVzLiAgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1NJR05FRAkoMSA8PCAyKQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGJlIGVpdGhlciBhIHByZWRlZmluZWQgY29uc3RhbnQgbmFtZSBvciBhIG51bWVyaWMgdmFsdWUuCi0gICBBbiBleGFtcGxlIHdvdWxkIGJlIGEgY29uZGl0aW9uIGNvZGUgbGlrZSAiZXEwLmIiIHdoaWNoIGhhcyB0aGUgbnVtZXJpYwotICAgdmFsdWUgMHgyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTlVNCSgxIDw8IDMpCi0KLS8qIFRoaXMgb3BlcmFuZCBzaG91bGQgYmUgd3JhcHBlZCBpbiBwYXJlbnRoZXNlcyByYXRoZXIgdGhhbiBzZXBhcmF0ZWQKLSAgIGZyb20gdGhlIHByZXZpb3VzIG9uZSBieSBhIGNvbW1hLiAgVGhpcyBpcyB1c2VkIGZvciB2YXJpb3VzCi0gICBpbnN0cnVjdGlvbnMsIGxpa2UgdGhlIGxvYWQgYW5kIHN0b3JlIGluc3RydWN0aW9ucywgd2hpY2ggd2FudAotICAgdGhlaXIgb3BlcmFuZHMgdG8gbG9vayBsaWtlICJkaXNwbGFjZW1lbnQocmVnKSIgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1BBUkVOUwkoMSA8PCA0KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBQQyByZWxhdGl2ZSBicmFuY2ggb2Zmc2V0LiAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMKLSAgIHRoZXNlIHN5bWJvbGljYWxseSBpZiBwb3NzaWJsZS4gIE5vdGUgdGhhdCB0aGUgb2Zmc2V0cyBhcmUgdGFrZW4gYXMgd29yZAotICAgb2Zmc2V0cy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX1BDUkVMCSgxIDw8IDUpCi0KLS8qIFRoaXMgZmxhZyBpcyBhIGhpbnQgdG8gdGhlIGRpc2Fzc2VtYmxlciBmb3IgdXNpbmcgaGV4IGFzIHRoZSBwcmVmZXJlZAotICAgcHJpbnRpbmcgZm9ybWF0LCBldmVuIGZvciBzbWFsbCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSBpbW1lZGlhdGUgdmFsdWVzLgotICAgTm9ybWFsbHkgdmFsdWVzIGluIHRoZSByYW5nZSAtOTk5IHRvIDk5OSBhcmUgcHJpbnRlZCBhcyBzaWduZWQgZGVjaW1hbAotICAgdmFsdWVzIGFuZCBvdGhlciB2YWx1ZXMgYXJlIHByaW50ZWQgaW4gaGV4LiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQklURklFTEQJKDEgPDwgNikKLQotLyogVGhpcyBvcGVyYW5kIG1heSBoYXZlIGEgIjptIiBtb2RpZmllciBzcGVjaWZpZWQgYnkgYml0IDE3IGluIGEgc2hvcnQKLSAgIGltbWVkaWF0ZSBmb3JtIGluc3RydWN0aW9uLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfTV9TSQkoMSA8PCA3KQotCi0vKiBUaGlzIG9wZXJhbmQgbWF5IGhhdmUgYSAiOm0iIG1vZGlmaWVyIHNwZWNpZmllZCBieSBiaXQgMTUgaW4gYSBsb25nCi0gICBpbW1lZGlhdGUgb3IgcmVnaXN0ZXIgZm9ybSBpbnN0cnVjdGlvbi4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX01fTEkJKDEgPDwgOCkKLQotLyogVGhpcyBvcGVyYW5kIG1heSBoYXZlIGEgIjpzIiBtb2RpZmllciBzcGVjaWZpZWQgaW4gYml0IDExIGluIGEgbG9uZwotICAgaW1tZWRpYXRlIG9yIHJlZ2lzdGVyIGZvcm0gaW5zdHJ1Y3Rpb24uICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9TQ0FMRUQJKDEgPDwgOSkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0ZMT0FUCSgxIDw8IDEwKQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYW4gYnl0ZSBvZmZzZXQgZnJvbSBhIGJhc2UgcmVsb2NhdGlvbi4gVGhlIGxvd2VyCi0gdHdvIGJpdHMgb2YgdGhlIGZpbmFsIHJlbG9jYXRlZCBhZGRyZXNzIGFyZSBpZ25vcmVkIHdoZW4gdGhlIHZhbHVlIGlzCi0gd3JpdHRlbiB0byB0aGUgcHJvZ3JhbSBjb3VudGVyLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQkFTRVJFTAkoMSA8PCAxMSkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGFuICJlbmRtYXNrIiBmaWVsZCBmb3IgYSBzaGlmdCBpbnN0cnVjdGlvbi4KLSAgIEl0IGlzIHRyZWF0ZWQgc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBoYXZlIHZhbHVlcyBvZiAwLTMyLAotICAgd2hlcmUgMCBhbmQgMzIgcmVzdWx0IGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhlIGFzc2VtYmxlcgotICAgbXVzdCBiZSBhYmxlIHRvIGFjY2VwdCBib3RoIGVuZG1hc2sgdmFsdWVzLiAgVGhpcyBkaXNhc3NlbWJsZXIKLSAgIGhhcyBubyB3YXkgb2Yga25vd2luZyBmcm9tIHRoZSBpbnN0cnVjdGlvbiB3aGljaCB2YWx1ZSB3YXMgCi0gICBnaXZlbiBhdCBhc3NlbWJseSB0aW1lLCBzbyBpdCBqdXN0IHVzZXMgJzAnLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfRU5ETUFTSwkoMSA8PCAxMikKLQotLyogVGhpcyBvcGVyYW5kIGlzIG9uZSBvZiB0aGUgMzIgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHdpdGggYSBsZWFkaW5nICdyJy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0dQUgkoMSA8PCAyNykKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQgYWNjdW11bGF0b3IgcmVnaXN0ZXIuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSB3aXRoIGEgbGVhZGluZyAnYScuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9GUEEJKCAxIDw8IDI4KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBjb250cm9sIHJlZ2lzdGVyIG51bWJlciwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJFSUYiLCAiRVBDIiwgZXRjKS4KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcHJpbnRzIHRoZXNlIHN5bWJvbGljYWxseS4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX0NSCSgxIDw8IDI5KQotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBjb25kaXRpb24gY29kZSwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJlcTAuYiIsICJuZTAudyIsIGV0YykuCi0gICBUaGUgZGlzYXNzZW1ibGVyIHByaW50cyB0aGVzZSBzeW1ib2xpY2FsbHkuICovCi0KLSNkZWZpbmUgVElDODBfT1BFUkFORF9DQwkoMSA8PCAzMCkKLQotLyogVGhpcyBvcGVyYW5kIGlzIGEgYml0IG51bWJlciwgZWl0aGVyIG51bWVyaWMgb3IKLSAgIHN5bWJvbGljIChsaWtlICJlcS5iIiwgIm9yLmYiLCBldGMpLgotICAgVGhlIGRpc2Fzc2VtYmxlciBwcmludHMgdGhlc2Ugc3ltYm9saWNhbGx5LgotICAgTm90ZSB0aGF0IHRoZXkgYXBwZWFyIGluIHRoZSBpbnN0cnVjdGlvbiBpbiAxJ3MgY29tcGxlbWVudCByZWxhdGl2ZQotICAgdG8gdGhlIHZhbHVlcyBnaXZlbiBpbiB0aGUgbWFudWFsLiAqLwotCi0jZGVmaW5lIFRJQzgwX09QRVJBTkRfQklUTlVNCSgxIDw8IDMxKQotCi0vKiBUaGlzIG1hc2sgaXMgdXNlZCB0byBzdHJpcCBvcGVyYW5kIGJpdHMgZnJvbSBhbiBpbnQgdGhhdCBjb250YWlucwotICAgYm90aCBvcGVyYW5kIGJpdHMgYW5kIGEgbnVtZXJpYyB2YWx1ZSBpbiB0aGUgbHNicy4gKi8KLQotI2RlZmluZSBUSUM4MF9PUEVSQU5EX01BU0sJKFRJQzgwX09QRVJBTkRfR1BSIHwgVElDODBfT1BFUkFORF9GUEEgfCBUSUM4MF9PUEVSQU5EX0NSIHwgVElDODBfT1BFUkFORF9DQyB8IFRJQzgwX09QRVJBTkRfQklUTlVNKQotCi0MCi0vKiBGbGFnIGJpdHMgZm9yIHRoZSBzdHJ1Y3QgdGljODBfb3Bjb2RlIGZsYWdzIGZpZWxkLiAqLwotCi0jZGVmaW5lIFRJQzgwX1ZFQ1RPUgkJMDEJLyogSXMgYSB2ZWN0b3IgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVElDODBfTk9fUjBfREVTVAkwMgkvKiBSZWdpc3RlciByMCBjYW5ub3QgYmUgYSBkZXN0aW5hdGlvbiByZWdpc3RlciAqLwotCi0MCi0vKiBUaGUgb3Bjb2RlcyBsaWJyYXJ5IGNvbnRhaW5zIGEgdGFibGUgdGhhdCBhbGxvd3MgdHJhbnNsYXRpb24gZnJvbSBwcmVkZWZpbmVkCi0gICBzeW1ib2wgbmFtZXMgdG8gbnVtZXJpYyB2YWx1ZXMsIGFuZCB2aWNlIHZlcnNhLiAqLwotCi0vKiBTdHJ1Y3R1cmUgdG8gaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBwcmVkZWZpbmVkIHN5bWJvbHMuICAqLwotCi1zdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wKLXsKLSAgY2hhciAqbmFtZTsJCS8qIG5hbWUgdG8gcmVjb2duaXplICovCi0gIGludCB2YWx1ZTsKLX07Ci0KLSNkZWZpbmUgUERTX05BTUUocGRzcCkgKChwZHNwKSAtPiBuYW1lKQotI2RlZmluZSBQRFNfVkFMVUUocGRzcCkgKChwZHNwKSAtPiB2YWx1ZSkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbXTsJLyogVHJhbnNsYXRpb24gYXJyYXkgKi8KLWV4dGVybiBjb25zdCBpbnQgdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9sczsJCQkJLyogSG93IG1hbnkgbWVtYmVycyBpbiB0aGUgYXJyYXkgKi8KLQotY29uc3QgY2hhciAqdGljODBfdmFsdWVfdG9fc3ltYm9sIFBBUkFNUyAoKGludCB2YWwsIGludCBjbGFzcykpOwkvKiBUcmFuc2xhdGUgdmFsdWUgdG8gc3ltYm9saWMgbmFtZSAqLwotaW50IHRpYzgwX3N5bWJvbF90b192YWx1ZSBQQVJBTVMgKChjaGFyICpuYW1lLCBpbnQgY2xhc3MpKTsJCS8qIFRyYW5zbGF0ZSBzeW1ib2xpYyBuYW1lIHRvIHZhbHVlICovCi0KLWNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqCi10aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqKSk7Ci0KLSNlbmRpZiAvKiBUSUM4MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS92ODUwLmggYi9pbmNsdWRlL29wY29kZS92ODUwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTE2ZjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9vcGNvZGUvdjg1MC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qIHY4NTAuaCAtLSBIZWFkZXIgZmlsZSBmb3IgTkVDIFY4NTAgb3Bjb2RlIHRhYmxlCi0gICBDb3B5cmlnaHQgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSi5ULiBDb25rbGluLCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIFY4NTBfSAotI2RlZmluZSBWODUwX0gKLQotLyogVGhlIG9wY29kZSB0YWJsZSBpcyBhbiBhcnJheSBvZiBzdHJ1Y3Qgdjg1MF9vcGNvZGUuICAqLwotCi1zdHJ1Y3Qgdjg1MF9vcGNvZGUKLXsKLSAgLyogVGhlIG9wY29kZSBuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICAvKiBUaGUgb3Bjb2RlIGl0c2VsZi4gIFRob3NlIGJpdHMgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gd2l0aAotICAgICBvcGVyYW5kcyBhcmUgemVyb2VzLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBvcGNvZGU7Ci0KLSAgLyogVGhlIG9wY29kZSBtYXNrLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICBUaGlzIGlzIGEKLSAgICAgbWFzayBjb250YWluaW5nIG9uZXMgaW5kaWNhdGluZyB0aG9zZSBiaXRzIHdoaWNoIG11c3QgbWF0Y2ggdGhlCi0gICAgIG9wY29kZSBmaWVsZCwgYW5kIHplcm9lcyBpbmRpY2F0aW5nIHRob3NlIGJpdHMgd2hpY2ggbmVlZCBub3QKLSAgICAgbWF0Y2ggKGFuZCBhcmUgcHJlc3VtYWJseSBmaWxsZWQgaW4gYnkgb3BlcmFuZHMpLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrOwotCi0gIC8qIEFuIGFycmF5IG9mIG9wZXJhbmQgY29kZXMuICBFYWNoIGNvZGUgaXMgYW4gaW5kZXggaW50byB0aGUKLSAgICAgb3BlcmFuZCB0YWJsZS4gIFRoZXkgYXBwZWFyIGluIHRoZSBvcmRlciB3aGljaCB0aGUgb3BlcmFuZHMgbXVzdAotICAgICBhcHBlYXIgaW4gYXNzZW1ibHkgY29kZSwgYW5kIGFyZSB0ZXJtaW5hdGVkIGJ5IGEgemVyby4gICovCi0gIHVuc2lnbmVkIGNoYXIgb3BlcmFuZHNbOF07Ci0KLSAgLyogV2hpY2ggKGlmIGFueSkgb3BlcmFuZCBpcyBhIG1lbW9yeSBvcGVyYW5kLiAgKi8KLSAgdW5zaWduZWQgaW50IG1lbW9wOwotCi0gIC8qIFRhcmdldCBwcm9jZXNzb3IocykuICBBIGJpdCBmaWVsZCBvZiBwcm9jZXNzb3JzIHdoaWNoIHN1cHBvcnQKLSAgICAgdGhpcyBpbnN0cnVjdGlvbi4gIE5vdGUgYSBiaXQgZmllbGQgaXMgdXNlZCBhcyBzb21lIGluc3RydWN0aW9ucwotICAgICBhcmUgYXZhaWxhYmxlIG9uIG11bHRpcGxlLCBkaWZmZXJlbnQgcHJvY2Vzc29yIHR5cGVzLCB3aGVyZWFzCi0gICAgIG90aGVyIGluc3RydWN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgb24gb25lIHNwZWNpZmljIHR5cGUuICAqLwotICB1bnNpZ25lZCBpbnQgcHJvY2Vzc29yczsKLX07Ci0KLS8qIFZhbHVlcyBmb3IgdGhlIHByb2Nlc3NvcnMgZmllbGQgaW4gdGhlIHY4NTBfb3Bjb2RlIHN0cnVjdHVyZS4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9WODUwCQkoMSA8PCAwKQkJLyogSnVzdCB0aGUgVjg1MC4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9BTEwJCS0xCQkJLyogQW55IHByb2Nlc3Nvci4gICovCi0jZGVmaW5lIFBST0NFU1NPUl9WODUwRQkJKDEgPDwgMSkJCS8qIEp1c3QgdGhlIFY4NTBFLiAqLwotI2RlZmluZSBQUk9DRVNTT1JfTk9UX1Y4NTAJKH4gUFJPQ0VTU09SX1Y4NTApCS8qIEFueSBwcm9jZXNzb3IgZXhjZXB0IHRoZSBWODUwLiAgKi8KLSNkZWZpbmUgUFJPQ0VTU09SX1Y4NTBFQQkoMSA8PCAyKQkJLyogSnVzdCB0aGUgVjg1MEVBLiAqLwotCi0vKiBUaGUgdGFibGUgaXRzZWxmIGlzIHNvcnRlZCBieSBtYWpvciBvcGNvZGUgbnVtYmVyLCBhbmQgaXMgb3RoZXJ3aXNlCi0gICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGRpc2Fzc2VtYmxlciBzaG91bGQgY29uc2lkZXIKLSAgIGluc3RydWN0aW9ucy4gICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlIHY4NTBfb3Bjb2Rlc1tdOwotZXh0ZXJuIGNvbnN0IGludCB2ODUwX251bV9vcGNvZGVzOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0IHY4NTBfb3BlcmFuZC4gICovCi0KLXN0cnVjdCB2ODUwX29wZXJhbmQKLXsKLSAgLyogVGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgLyogSWYgdGhpcyB2YWx1ZSBpcyAtMSB0aGVuIHRoZSBvcGVyYW5kJ3MgYml0cyBhcmUgaW4gYSBkaXNjb250aW5vdXMgZGlzdHJpYnV0aW9uIGluIHRoZSBpbnN0cnVjdGlvbi4gKi8KLSAgaW50IGJpdHM7Ci0KLSAgLyogKGJpdHMgPj0gMCk6ICBIb3cgZmFyIHRoZSBvcGVyYW5kIGlzIGxlZnQgc2hpZnRlZCBpbiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiAoYml0cyA9PSAtMSk6IEJpdCBtYXNrIG9mIHRoZSBiaXRzIGluIHRoZSBvcGVyYW5kLiAgKi8KLSAgaW50IHNoaWZ0OwotCi0gIC8qIEluc2VydGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgVG8gaW5zZXJ0IGFuCi0gICAgIG9wZXJhbmQgdmFsdWUgaW50byBhbiBpbnN0cnVjdGlvbiwgY2hlY2sgdGhpcyBmaWVsZC4KLQotICAgICBJZiBpdCBpcyBOVUxMLCBleGVjdXRlCi0gICAgICAgICBpIHw9IChvcCAmICgoMSA8PCBvLT5iaXRzKSAtIDEpKSA8PCBvLT5zaGlmdDsKLSAgICAgKGkgaXMgdGhlIGluc3RydWN0aW9uIHdoaWNoIHdlIGFyZSBmaWxsaW5nIGluLCBvIGlzIGEgcG9pbnRlciB0bwotICAgICB0aGlzIHN0cnVjdHVyZSwgYW5kIG9wIGlzIHRoZSBvcGNvZGUgdmFsdWU7IHRoaXMgYXNzdW1lcyB0d29zCi0gICAgIGNvbXBsZW1lbnQgYXJpdGhtZXRpYykuCi0KLSAgICAgSWYgdGhpcyBmaWVsZCBpcyBub3QgTlVMTCwgdGhlbiBzaW1wbHkgY2FsbCBpdCB3aXRoIHRoZQotICAgICBpbnN0cnVjdGlvbiBhbmQgdGhlIG9wZXJhbmQgdmFsdWUuICBJdCB3aWxsIHJldHVybiB0aGUgbmV3IHZhbHVlCi0gICAgIG9mIHRoZSBpbnN0cnVjdGlvbi4gIElmIHRoZSBFUlJNU0cgYXJndW1lbnQgaXMgbm90IE5VTEwsIHRoZW4gaWYKLSAgICAgdGhlIG9wZXJhbmQgdmFsdWUgaXMgaWxsZWdhbCwgKkVSUk1TRyB3aWxsIGJlIHNldCB0byBhIHdhcm5pbmcKLSAgICAgc3RyaW5nICh0aGUgb3BlcmFuZCB3aWxsIGJlIGluc2VydGVkIGluIGFueSBjYXNlKS4gIElmIHRoZQotICAgICBvcGVyYW5kIHZhbHVlIGlzIGxlZ2FsLCAqRVJSTVNHIHdpbGwgYmUgdW5jaGFuZ2VkIChtb3N0IG9wZXJhbmRzCi0gICAgIGNhbiBhY2NlcHQgYW55IHZhbHVlKS4gICovCi0gIHVuc2lnbmVkIGxvbmcgKCogaW5zZXJ0KSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc3RydWN0aW9uLCBsb25nIG9wLAotCQkJCSAgIGNvbnN0IGNoYXIgKiogZXJybXNnKSk7Ci0KLSAgLyogRXh0cmFjdGlvbiBmdW5jdGlvbi4gIFRoaXMgaXMgdXNlZCBieSB0aGUgZGlzYXNzZW1ibGVyLiAgVG8KLSAgICAgZXh0cmFjdCB0aGlzIG9wZXJhbmQgdHlwZSBmcm9tIGFuIGluc3RydWN0aW9uLCBjaGVjayB0aGlzIGZpZWxkLgotCi0gICAgIElmIGl0IGlzIE5VTEwsIGNvbXB1dGUKLSAgICAgICAgIG9wID0gby0+Yml0cyA9PSAtMSA/ICgoaSkgJiBvLT5zaGlmdCkgOiAoKGkpID4+IG8tPnNoaWZ0KSAmICgoMSA8PCBvLT5iaXRzKSAtIDEpOwotCSBpZiAoby0+ZmxhZ3MgJiBWODUwX09QRVJBTkRfU0lHTkVEKQotCSAgICAgb3AgPSAob3AgPDwgKDMyIC0gby0+Yml0cykpID4+ICgzMiAtIG8tPmJpdHMpOwotICAgICAoaSBpcyB0aGUgaW5zdHJ1Y3Rpb24sIG8gaXMgYSBwb2ludGVyIHRvIHRoaXMgc3RydWN0dXJlLCBhbmQgb3AKLSAgICAgaXMgdGhlIHJlc3VsdDsgdGhpcyBhc3N1bWVzIHR3b3MgY29tcGxlbWVudCBhcml0aG1ldGljKS4KLQotICAgICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBOVUxMLCB0aGVuIHNpbXBseSBjYWxsIGl0IHdpdGggdGhlCi0gICAgIGluc3RydWN0aW9uIHZhbHVlLiAgSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLiAgSWYKLSAgICAgdGhlIElOVkFMSUQgYXJndW1lbnQgaXMgbm90IE5VTEwsICpJTlZBTElEIHdpbGwgYmUgc2V0IHRvCi0gICAgIG5vbi16ZXJvIGlmIHRoaXMgb3BlcmFuZCB0eXBlIGNhbiBub3QgYWN0dWFsbHkgYmUgZXh0cmFjdGVkIGZyb20KLSAgICAgdGhpcyBvcGVyYW5kIChpLmUuLCB0aGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgbWF0Y2gpLiAgSWYgdGhlCi0gICAgIG9wZXJhbmQgaXMgdmFsaWQsICpJTlZBTElEIHdpbGwgbm90IGJlIGNoYW5nZWQuICAqLwotICB1bnNpZ25lZCBsb25nICgqIGV4dHJhY3QpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb24sIGludCAqIGludmFsaWQpKTsKLQotICAvKiBPbmUgYml0IHN5bnRheCBmbGFncy4gICovCi0gIGludCBmbGFnczsKLX07Ci0KLS8qIEVsZW1lbnRzIGluIHRoZSB0YWJsZSBhcmUgcmV0cmlldmVkIGJ5IGluZGV4aW5nIHdpdGggdmFsdWVzIGZyb20KLSAgIHRoZSBvcGVyYW5kcyBmaWVsZCBvZiB0aGUgdjg1MF9vcGNvZGVzIHRhYmxlLiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB2ODUwX29wZXJhbmQgdjg1MF9vcGVyYW5kc1tdOwotCi0vKiBWYWx1ZXMgZGVmaW5lZCBmb3IgdGhlIGZsYWdzIGZpZWxkIG9mIGEgc3RydWN0IHY4NTBfb3BlcmFuZC4gICovCi0KLS8qIFRoaXMgb3BlcmFuZCBuYW1lcyBhIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfUkVHCTB4MDEKLQotLyogVGhpcyBvcGVyYW5kIG5hbWVzIGEgc3lzdGVtIHJlZ2lzdGVyICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9TUkcJMHgwMgotCi0vKiBUaGlzIG9wZXJhbmQgbmFtZXMgYSBjb25kaXRpb24gY29kZSB1c2VkIGluIHRoZSBzZXRmIGluc3RydWN0aW9uICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9DQwkJMHgwNAotCi0vKiBUaGlzIG9wZXJhbmQgdGFrZXMgc2lnbmVkIHZhbHVlcyAqLwotI2RlZmluZSBWODUwX09QRVJBTkRfU0lHTkVECTB4MDgKLQotLyogVGhpcyBvcGVyYW5kIGlzIHRoZSBlcCByZWdpc3Rlci4gICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9FUAkJMHgxMAotCi0vKiBUaGlzIG9wZXJhbmQgaXMgYSBQQyBkaXNwbGFjZW1lbnQgKi8KLSNkZWZpbmUgVjg1MF9PUEVSQU5EX0RJU1AJMHgyMAotCi0vKiBUaGlzIGlzIGEgcmVsYXhhYmxlIG9wZXJhbmQuICAgT25seSB1c2VkIGZvciBEOS0+RDIyIGJyYW5jaCByZWxheGluZwotICAgcmlnaHQgbm93LiAgV2UgbWF5IG5lZWQgb3RoZXJzIGluIHRoZSBmdXR1cmUgKG9yIG1heWJlIGhhbmRsZSB0aGVtIGxpa2UKLSAgIHByb21vdGVkIG9wZXJhbmRzIG9uIHRoZSBtbjEwMzAwPykgICovCi0jZGVmaW5lIFY4NTBfT1BFUkFORF9SRUxBWAkweDQwCi0KLS8qIFRoZSByZWdpc3RlciBzcGVjaWZpZWQgbXVzdCBub3QgYmUgcjAgKi8KLSNkZWZpbmUgVjg1MF9OT1RfUjAJICAgICAgICAweDgwCi0KLS8qIENZR05VUyBMT0NBTCB2ODUwZSAqLwotLyogcHVzaC9wb3AgdHlwZSBpbnN0cnVjdGlvbiwgVjg1MEUgc3BlY2lmaWMuICAqLwotI2RlZmluZSBWODUwRV9QVVNIX1BPUAkJMHgxMDAKLQotLyogMTYgYml0IGltbWVkaWF0ZSBmb2xsb3dzIGluc3RydWN0aW9uLCBWODUwRSBzcGVjaWZpYy4gICovCi0jZGVmaW5lIFY4NTBFX0lNTUVESUFURTE2CTB4MjAwCi0KLS8qIDMyIGJpdCBpbW1lZGlhdGUgZm9sbG93cyBpbnN0cnVjdGlvbiwgVjg1MEUgc3BlY2lmaWMuICAqLwotI2RlZmluZSBWODUwRV9JTU1FRElBVEUzMgkweDQwMAotCi0jZW5kaWYgLyogVjg1MF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wY29kZS92YXguaCBiL2luY2x1ZGUvb3Bjb2RlL3ZheC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2FmZWJkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvb3Bjb2RlL3ZheC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qIFZheCBvcGNkZSBsaXN0LgotICAgQ29weXJpZ2h0IChDKSAxOTg5LCAxOTk1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIEdBUy4KLQotR0RCIGFuZCBHQVMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCIGFuZCBHQVMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0RCIG9yIEdBUzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiB2YXhfb3Bjb2RlVAotI2RlZmluZSB2YXhfb3Bjb2RlVCBpbnQKLSNlbmRpZiAvKiBubyB2YXhfb3Bjb2RlVCAqLwotCi1zdHJ1Y3Qgdm90X3dvdAkJCS8qIHZheCBvcGNvZGUgdGFibGU6IHdvdCB0byBkbyB3aXRoIHRoaXMgKi8KLQkJCQkvKiBwYXJ0aWN1bGFyIG9wY29kZSAqLwotewotICBjb25zdCBjaGFyICAgICAgICphcmdzOwkvKiBob3cgdG8gY29tcGlsZSBzYWlkIG9wY29kZSAqLwotICB2YXhfb3Bjb2RlVCAgICAgICBjb2RlOwkvKiBvcC1jb2RlIChtYXkgYmUgPiA4IGJpdHMhKSAqLwotfTsKLQotc3RydWN0IHZvdAkJCS8qIHZheCBvcGNvZGUgdGV4dCAqLwotewotICBjb25zdCBjaGFyICAgICAgICpuYW1lOwkvKiBvcGNvZGUgbmFtZTogbG93ZXJjYXNlIHN0cmluZyAgW2tleV0gICovCi0gIHN0cnVjdCB2b3Rfd290ICAgIGRldGFpbDsJLyogcmVzdCBvZiBvcGNvZGUgdGFibGUgICAgICAgICAgW2RhdHVtXSAqLwotfTsKLQotI2RlZmluZSB2b3RfaG93IGFyZ3MKLSNkZWZpbmUgdm90X2NvZGUgY29kZQotI2RlZmluZSB2b3RfZGV0YWlsIGRldGFpbAotI2RlZmluZSB2b3RfbmFtZSBuYW1lCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm90Ci12b3RzdHJzW10gPQotewoteyAgICAiaGFsdCIsCXsiIiwJCQkweDAwCX0gfSwKLXsgICAgIm5vcCIsCXsiIiwJCQkweDAxCX0gfSwKLXsgICAgInJlaSIsCXsiIiwJCQkweDAyCX0gfSwKLXsgICAgImJwdCIsCXsiIiwJCQkweDAzCX0gfSwKLXsgICAgInJldCIsCXsiIiwJCQkweDA0CX0gfSwKLXsgICAgInJzYiIsCXsiIiwJCQkweDA1CX0gfSwKLXsgICAgImxkcGN0eCIsCXsiIiwJCQkweDA2CX0gfSwKLXsgICAgInN2cGN0eCIsCXsiIiwJCQkweDA3CX0gfSwKLXsgICAgImN2dHBzIiwJeyJyd2FicndhYiIsCQkweDA4CX0gfSwKLXsgICAgImN2dHNwIiwJeyJyd2FicndhYiIsCQkweDA5CX0gfSwKLXsgICAgImluZGV4IiwJeyJybHJscmxybHJsd2wiLAkweDBhCX0gfSwKLXsgICAgImNyYyIsCXsiYWJybHJ3YWIiLAkJMHgwYgl9IH0sCi17ICAgICJwcm9iZXIiLAl7InJicndhYiIsCQkweDBjCX0gfSwKLXsgICAgInByb2JldyIsCXsicmJyd2FiIiwJICAgICAgICAweDBkCX0gfSwKLXsgICAgImluc3F1ZSIsCXsiYWJhYiIsCQkweDBlCX0gfSwKLXsgICAgInJlbXF1ZSIsCXsiYWJ3bCIsCQkweDBmCX0gfSwKLXsgICAgImJzYmIiLAl7ImJiIiwJCQkweDEwCX0gfSwKLXsgICAgImJyYiIsCXsiYmIiLAkJCTB4MTEJfSB9LAoteyAgICAiYm5lcSIsCXsiYmIiLAkJCTB4MTIJfSB9LAoteyAgICAiYm5lcXUiLAl7ImJiIiwJCQkweDEyCX0gfSwKLXsgICAgImJlcWwiLAl7ImJiIiwJCQkweDEzCX0gfSwKLXsgICAgImJlcWx1IiwJeyJiYiIsCQkJMHgxMwl9IH0sCi17ICAgICJiZ3RyIiwJeyJiYiIsCQkJMHgxNAl9IH0sCi17ICAgICJibGVxIiwJeyJiYiIsCQkJMHgxNQl9IH0sCi17ICAgICJqc2IiLAl7ImFiIiwJCQkweDE2CX0gfSwKLXsgICAgImptcCIsCXsiYWIiLAkJCTB4MTcJfSB9LAoteyAgICAiYmdlcSIsCXsiYmIiLAkJCTB4MTgJfSB9LAoteyAgICAiYmxzcyIsCXsiYmIiLAkJCTB4MTkJfSB9LAoteyAgICAiYmd0cnUiLAl7ImJiIiwJCQkweDFhCX0gfSwKLXsgICAgImJsZXF1IiwJeyJiYiIsCQkJMHgxYgl9IH0sCi17ICAgICJidmMiLAl7ImJiIiwJCQkweDFjCX0gfSwKLXsgICAgImJ2cyIsCXsiYmIiLAkJCTB4MWQJfSB9LAoteyAgICAiYmNjIiwJeyJiYiIsCQkJMHgxZQl9IH0sCi17ICAgICJiZ2VxdSIsCXsiYmIiLAkJCTB4MWUJfSB9LAoteyAgICAiYmxzc3UiLAl7ImJiIiwJCQkweDFmCX0gfSwKLXsgICAgImJjcyIsCXsiYmIiLAkJCTB4MWYJfSB9LAoteyAgICAiYWRkcDQiLAl7InJ3YWJyd2FiIiwJCTB4MjAJfSB9LAoteyAgICAiYWRkcDYiLAl7InJ3YWJyd2FicndhYiIsCTB4MjEJfSB9LAoteyAgICAic3VicDQiLAl7InJ3YWJyd2FiIiwJCTB4MjIJfSB9LAoteyAgICAic3VicDYiLAl7InJ3YWJyd2FicndhYiIsCTB4MjMJfSB9LAoteyAgICAiY3Z0cHQiLAl7InJ3YWJhYnJ3YWIiLAkJMHgyNAl9IH0sCi17ICAgICJtdWxwIiwJeyJyd2FicndhYnJ3YWIiLAkweDI1CX0gfSwKLXsgICAgImN2dHRwIiwJeyJyd2FiYWJyd2FiIiwJCTB4MjYJfSB9LAoteyAgICAiZGl2cCIsCXsicndhYnJ3YWJyd2FiIiwJMHgyNwl9IH0sCi17ICAgICJtb3ZjMyIsCXsicndhYmFiIiwJCTB4MjgJfSB9LAoteyAgICAiY21wYzMiLAl7InJ3YWJhYiIsCQkweDI5CX0gfSwKLXsgICAgInNjYW5jIiwJeyJyd2FiYWJyYiIsCQkweDJhCX0gfSwKLXsgICAgInNwYW5jIiwJeyJyd2FiYWJyYiIsCQkweDJiCX0gfSwKLXsgICAgIm1vdmM1IiwJeyJyd2FicmJyd2FiIiwJCTB4MmMJfSB9LAoteyAgICAiY21wYzUiLAl7InJ3YWJyYnJ3YWIiLAkJMHgyZAl9IH0sCi17ICAgICJtb3Z0YyIsCXsicndhYnJiYWJyd2FiIiwJMHgyZQl9IH0sCi17ICAgICJtb3Z0dWMiLAl7InJ3YWJyYmFicndhYiIsCTB4MmYJfSB9LAoteyAgICAiYnNidyIsCXsiYnciLAkJCTB4MzAJfSB9LAoteyAgICAiYnJ3IiwJeyJidyIsCQkJMHgzMQl9IH0sCi17ICAgICJjdnR3bCIsCXsicnd3bCIsCQkweDMyCX0gfSwKLXsgICAgImN2dHdiIiwJeyJyd3diIiwJCTB4MzMJfSB9LAoteyAgICAibW92cCIsCXsicndhYmFiIiwJCTB4MzQJfSB9LAoteyAgICAiY21wcDMiLAl7InJ3YWJhYiIsCQkweDM1CX0gfSwKLXsgICAgImN2dHBsIiwJeyJyd2Fid2wiLAkJMHgzNgl9IH0sCi17ICAgICJjbXBwNCIsCXsicndhYnJ3YWIiLAkJMHgzNwl9IH0sCi17ICAgICJlZGl0cGMiLAl7InJ3YWJhYmFiIiwJCTB4MzgJfSB9LAoteyAgICAibWF0Y2hjIiwJeyJyd2FicndhYiIsCQkweDM5CX0gfSwKLXsgICAgImxvY2MiLAl7InJicndhYiIsCQkweDNhCX0gfSwKLXsgICAgInNrcGMiLAl7InJicndhYiIsCQkweDNiCX0gfSwKLXsgICAgIm1vdnp3bCIsCXsicnd3bCIsCQkweDNjCX0gfSwKLXsgICAgImFjYnciLAl7InJ3cndtd2J3IiwJCTB4M2QJfSB9LAoteyAgICAibW92YXciLAl7ImF3d2wiLAkJMHgzZQl9IH0sCi17ICAgICJwdXNoYXciLAl7ImF3IiwJCQkweDNmCX0gfSwKLXsgICAgImFkZGYyIiwJeyJyZm1mIiwJCTB4NDAJfSB9LAoteyAgICAiYWRkZjMiLAl7InJmcmZ3ZiIsCQkweDQxCX0gfSwKLXsgICAgInN1YmYyIiwJeyJyZm1mIiwJCTB4NDIJfSB9LAoteyAgICAic3ViZjMiLAl7InJmcmZ3ZiIsCQkweDQzCX0gfSwKLXsgICAgIm11bGYyIiwJeyJyZm1mIiwJCTB4NDQJfSB9LAoteyAgICAibXVsZjMiLAl7InJmcmZ3ZiIsCQkweDQ1CX0gfSwKLXsgICAgImRpdmYyIiwJeyJyZm1mIiwJCTB4NDYJfSB9LAoteyAgICAiZGl2ZjMiLAl7InJmcmZ3ZiIsCQkweDQ3CX0gfSwKLXsgICAgImN2dGZiIiwJeyJyZndiIiwJCTB4NDgJfSB9LAoteyAgICAiY3Z0ZnciLAl7InJmd3ciLAkJMHg0OQl9IH0sCi17ICAgICJjdnRmbCIsCXsicmZ3bCIsCQkweDRhCX0gfSwKLXsgICAgImN2dHJmbCIsCXsicmZ3bCIsCQkweDRiCX0gfSwKLXsgICAgImN2dGJmIiwJeyJyYndmIiwJCTB4NGMJfSB9LAoteyAgICAiY3Z0d2YiLAl7InJ3d2YiLAkJMHg0ZAl9IH0sCi17ICAgICJjdnRsZiIsCXsicmx3ZiIsCQkweDRlCX0gfSwKLXsgICAgImFjYmYiLAl7InJmcmZtZmJ3IiwJCTB4NGYJfSB9LAoteyAgICAibW92ZiIsCXsicmZ3ZiIsCQkweDUwCX0gfSwKLXsgICAgImNtcGYiLAl7InJmcmYiLAkJMHg1MQl9IH0sCi17ICAgICJtbmVnZiIsCXsicmZ3ZiIsCQkweDUyCX0gfSwKLXsgICAgInRzdGYiLAl7InJmIiwJCQkweDUzCX0gfSwKLXsgICAgImVtb2RmIiwJeyJyZnJicmZ3bHdmIiwJCTB4NTQJfSB9LAoteyAgICAicG9seWYiLAl7InJmcndhYiIsCQkweDU1CX0gfSwKLXsgICAgImN2dGZkIiwJeyJyZndkIiwJCTB4NTYJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1NyBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLXsgICAgImFkYXdpIiwJeyJyd213IiwJCTB4NTgJfSB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wY29kZSA1OSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGNvZGUgNWEgaXMgbm90IGRlZmluZWQgeWV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDViIGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiaW5zcWhpIiwJeyJhYmFxIiwJCTB4NWMJfSB9LAoteyAgICAiaW5zcXRpIiwJeyJhYmFxIiwJCTB4NWQJfSB9LAoteyAgICAicmVtcWhpIiwJeyJhcXdsIiwJCTB4NWUJfSB9LAoteyAgICAicmVtcXRpIiwJeyJhcXdsIiwJCTB4NWYJfSB9LAoteyAgICAiYWRkZDIiLAl7InJkbWQiLAkJMHg2MAl9IH0sCi17ICAgICJhZGRkMyIsCXsicmRyZHdkIiwJCTB4NjEJfSB9LAoteyAgICAic3ViZDIiLAl7InJkbWQiLAkJMHg2Mgl9IH0sCi17ICAgICJzdWJkMyIsCXsicmRyZHdkIiwJCTB4NjMJfSB9LAoteyAgICAibXVsZDIiLAl7InJkbWQiLAkJMHg2NAl9IH0sCi17ICAgICJtdWxkMyIsCXsicmRyZHdkIiwJCTB4NjUJfSB9LAoteyAgICAiZGl2ZDIiLAl7InJkbWQiLAkJMHg2Ngl9IH0sCi17ICAgICJkaXZkMyIsCXsicmRyZHdkIiwJCTB4NjcJfSB9LAoteyAgICAiY3Z0ZGIiLAl7InJkd2IiLAkJMHg2OAl9IH0sCi17ICAgICJjdnRkdyIsCXsicmR3dyIsCQkweDY5CX0gfSwKLXsgICAgImN2dGRsIiwJeyJyZHdsIiwJCTB4NmEJfSB9LAoteyAgICAiY3Z0cmRsIiwJeyJyZHdsIiwJCTB4NmIJfSB9LAoteyAgICAiY3Z0YmQiLAl7InJid2QiLAkJMHg2Ywl9IH0sCi17ICAgICJjdnR3ZCIsCXsicnd3ZCIsCQkweDZkCX0gfSwKLXsgICAgImN2dGxkIiwJeyJybHdkIiwJCTB4NmUJfSB9LAoteyAgICAiYWNiZCIsCXsicmRyZG1kYnciLAkJMHg2Zgl9IH0sCi17ICAgICJtb3ZkIiwJeyJyZHdkIiwJCTB4NzAJfSB9LAoteyAgICAiY21wZCIsCXsicmRyZCIsCQkweDcxCX0gfSwKLXsgICAgIm1uZWdkIiwJeyJyZHdkIiwJCTB4NzIJfSB9LAoteyAgICAidHN0ZCIsCXsicmQiLAkJCTB4NzMJfSB9LAoteyAgICAiZW1vZGQiLAl7InJkcmJyZHdsd2QiLAkJMHg3NAl9IH0sCi17ICAgICJwb2x5ZCIsCXsicmRyd2FiIiwJCTB4NzUJfSB9LAoteyAgICAiY3Z0ZGYiLAl7InJkd2YiLAkJMHg3Ngl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3Bjb2RlIDc3IGlzIG5vdCBkZWZpbmVkIHlldCAqLwoteyAgICAiYXNobCIsCXsicmJybHdsIiwJCTB4NzgJfSB9LAoteyAgICAiYXNocSIsCXsicmJycXdxIiwJCTB4NzkJfSB9LAoteyAgICAiZW11bCIsCXsicmxybHJsd3EiLAkJMHg3YQl9IH0sCi17ICAgICJlZGl2IiwJeyJybHJxd2x3bCIsCQkweDdiCX0gfSwKLXsgICAgImNscmQiLAl7IndkIiwJCQkweDdjCX0gfSwKLXsgICAgImNscmciLAl7IndnIiwJCQkweDdjCX0gfSwKLXsgICAgImNscnEiLAl7IndkIiwJCQkweDdjCX0gfSwKLXsgICAgIm1vdnEiLAl7InJxd3EiLAkJMHg3ZAl9IH0sCi17ICAgICJtb3ZhcSIsCXsiYXF3bCIsCQkweDdlCX0gfSwKLXsgICAgIm1vdmFkIiwJeyJhZHdsIiwJCTB4N2UJfSB9LAoteyAgICAicHVzaGFxIiwJeyJhcSIsCQkJMHg3Zgl9IH0sCi17ICAgICJwdXNoYWQiLAl7ImFkIiwJCQkweDdmCX0gfSwKLXsgICAgImFkZGIyIiwJeyJyYm1iIiwJCTB4ODAJfSB9LAoteyAgICAiYWRkYjMiLAl7InJicmJ3YiIsCQkweDgxCX0gfSwKLXsgICAgInN1YmIyIiwJeyJyYm1iIiwJCTB4ODIJfSB9LAoteyAgICAic3ViYjMiLAl7InJicmJ3YiIsCQkweDgzCX0gfSwKLXsgICAgIm11bGIyIiwJeyJyYm1iIiwJCTB4ODQJfSB9LAoteyAgICAibXVsYjMiLAl7InJicmJ3YiIsCQkweDg1CX0gfSwKLXsgICAgImRpdmIyIiwJeyJyYm1iIiwJCTB4ODYJfSB9LAoteyAgICAiZGl2YjMiLAl7InJicmJ3YiIsCQkweDg3CX0gfSwKLXsgICAgImJpc2IyIiwJeyJyYm1iIiwJCTB4ODgJfSB9LAoteyAgICAiYmlzYjMiLAl7InJicmJ3YiIsCQkweDg5CX0gfSwKLXsgICAgImJpY2IyIiwJeyJyYm1iIiwJCTB4OGEJfSB9LAoteyAgICAiYmljYjMiLAl7InJicmJ3YiIsCQkweDhiCX0gfSwKLXsgICAgInhvcmIyIiwJeyJyYm1iIiwJCTB4OGMJfSB9LAoteyAgICAieG9yYjMiLAl7InJicmJ3YiIsCQkweDhkCX0gfSwKLXsgICAgIm1uZWdiIiwJeyJyYndiIiwJCTB4OGUJfSB9LAoteyAgICAiY2FzZWIiLAl7InJicmJyYiIsCQkweDhmCX0gfSwKLXsgICAgIm1vdmIiLAl7InJid2IiLAkJMHg5MAl9IH0sCi17ICAgICJjbXBiIiwJeyJyYnJiIiwJCTB4OTEJfSB9LAoteyAgICAibWNvbWIiLAl7InJid2IiLAkJMHg5Mgl9IH0sCi17ICAgICJiaXRiIiwJeyJyYnJiIiwJCTB4OTMJfSB9LAoteyAgICAiY2xyYiIsCXsid2IiLAkJCTB4OTQJfSB9LAoteyAgICAidHN0YiIsCXsicmIiLAkJCTB4OTUJfSB9LAoteyAgICAiaW5jYiIsCXsibWIiLAkJCTB4OTYJfSB9LAoteyAgICAiZGVjYiIsCXsibWIiLAkJCTB4OTcJfSB9LAoteyAgICAiY3Z0YmwiLAl7InJid2wiLAkJMHg5OAl9IH0sCi17ICAgICJjdnRidyIsCXsicmJ3dyIsCQkweDk5CX0gfSwKLXsgICAgIm1vdnpibCIsCXsicmJ3bCIsCQkweDlhCX0gfSwKLXsgICAgIm1vdnpidyIsCXsicmJ3dyIsCQkweDliCX0gfSwKLXsgICAgInJvdGwiLAl7InJicmx3bCIsCQkweDljCX0gfSwKLXsgICAgImFjYmIiLAl7InJicmJtYmJ3IiwJCTB4OWQJfSB9LAoteyAgICAibW92YWIiLAl7ImFid2wiLAkJMHg5ZQl9IH0sCi17ICAgICJwdXNoYWIiLAl7ImFiIiwJCQkweDlmCX0gfSwKLXsgICAgImFkZHcyIiwJeyJyd213IiwJCTB4YTAJfSB9LAoteyAgICAiYWRkdzMiLAl7InJ3cnd3dyIsCQkweGExCX0gfSwKLXsgICAgInN1YncyIiwJeyJyd213IiwJCTB4YTIJfSB9LAoteyAgICAic3VidzMiLAl7InJ3cnd3dyIsCQkweGEzCX0gfSwKLXsgICAgIm11bHcyIiwJeyJyd213IiwJCTB4YTQJfSB9LAoteyAgICAibXVsdzMiLAl7InJ3cnd3dyIsCQkweGE1CX0gfSwKLXsgICAgImRpdncyIiwJeyJyd213IiwJCTB4YTYJfSB9LAoteyAgICAiZGl2dzMiLAl7InJ3cnd3dyIsCQkweGE3CX0gfSwKLXsgICAgImJpc3cyIiwJeyJyd213IiwJCTB4YTgJfSB9LAoteyAgICAiYmlzdzMiLAl7InJ3cnd3dyIsCQkweGE5CX0gfSwKLXsgICAgImJpY3cyIiwJeyJyd213IiwJCTB4YWEJfSB9LAoteyAgICAiYmljdzMiLAl7InJ3cnd3dyIsCQkweGFiCX0gfSwKLXsgICAgInhvcncyIiwJeyJyd213IiwJCTB4YWMJfSB9LAoteyAgICAieG9ydzMiLAl7InJ3cnd3dyIsCQkweGFkCX0gfSwKLXsgICAgIm1uZWd3IiwJeyJyd3d3IiwJCTB4YWUJfSB9LAoteyAgICAiY2FzZXciLAl7InJ3cndydyIsCQkweGFmCX0gfSwKLXsgICAgIm1vdnciLAl7InJ3d3ciLAkJMHhiMAl9IH0sCi17ICAgICJjbXB3IiwJeyJyd3J3IiwJCTB4YjEJfSB9LAoteyAgICAibWNvbXciLAl7InJ3d3ciLAkJMHhiMgl9IH0sCi17ICAgICJiaXR3IiwJeyJyd3J3IiwJCTB4YjMJfSB9LAoteyAgICAiY2xydyIsCXsid3ciLAkJCTB4YjQJfSB9LAoteyAgICAidHN0dyIsCXsicnciLAkJCTB4YjUJfSB9LAoteyAgICAiaW5jdyIsCXsibXciLAkJCTB4YjYJfSB9LAoteyAgICAiZGVjdyIsCXsibXciLAkJCTB4YjcJfSB9LAoteyAgICAiYmlzcHN3IiwJeyJydyIsCQkJMHhiOAl9IH0sCi17ICAgICJiaWNwc3ciLAl7InJ3IiwJCQkweGI5CX0gfSwKLXsgICAgInBvcHIiLAl7InJ3IiwJCQkweGJhCX0gfSwKLXsgICAgInB1c2hyIiwJeyJydyIsCQkJMHhiYgl9IH0sCi17ICAgICJjaG1rIiwJeyJydyIsCQkJMHhiYwl9IH0sCi17ICAgICJjaG1lIiwJeyJydyIsCQkJMHhiZAl9IH0sCi17ICAgICJjaG1zIiwJeyJydyIsCQkJMHhiZQl9IH0sCi17ICAgICJjaG11IiwJeyJydyIsCQkJMHhiZgl9IH0sCi17ICAgICJhZGRsMiIsCXsicmxtbCIsCQkweGMwCX0gfSwKLXsgICAgImFkZGwzIiwJeyJybHJsd2wiLAkJMHhjMQl9IH0sCi17ICAgICJzdWJsMiIsCXsicmxtbCIsCQkweGMyCX0gfSwKLXsgICAgInN1YmwzIiwJeyJybHJsd2wiLAkJMHhjMwl9IH0sCi17ICAgICJtdWxsMiIsCXsicmxtbCIsCQkweGM0CX0gfSwKLXsgICAgIm11bGwzIiwJeyJybHJsd2wiLAkJMHhjNQl9IH0sCi17ICAgICJkaXZsMiIsCXsicmxtbCIsCQkweGM2CX0gfSwKLXsgICAgImRpdmwzIiwJeyJybHJsd2wiLAkJMHhjNwl9IH0sCi17ICAgICJiaXNsMiIsCXsicmxtbCIsCQkweGM4CX0gfSwKLXsgICAgImJpc2wzIiwJeyJybHJsd2wiLAkJMHhjOQl9IH0sCi17ICAgICJiaWNsMiIsCXsicmxtbCIsCQkweGNhCX0gfSwKLXsgICAgImJpY2wzIiwJeyJybHJsd2wiLAkJMHhjYgl9IH0sCi17ICAgICJ4b3JsMiIsCXsicmxtbCIsCQkweGNjCX0gfSwKLXsgICAgInhvcmwzIiwJeyJybHJsd2wiLAkJMHhjZAl9IH0sCi17ICAgICJtbmVnbCIsCXsicmx3bCIsCQkweGNlCX0gfSwKLXsgICAgImNhc2VsIiwJeyJybHJscmwiLAkJMHhjZgl9IH0sCi17ICAgICJtb3ZsIiwJeyJybHdsIiwJCTB4ZDAJfSB9LAoteyAgICAiY21wbCIsCXsicmxybCIsCQkweGQxCX0gfSwKLXsgICAgIm1jb21sIiwJeyJybHdsIiwJCTB4ZDIJfSB9LAoteyAgICAiYml0bCIsCXsicmxybCIsCQkweGQzCX0gfSwKLXsgICAgImNscmYiLAl7IndmIiwJCQkweGQ0CX0gfSwKLXsgICAgImNscmwiLAl7IndsIiwJCQkweGQ0CX0gfSwKLXsgICAgInRzdGwiLAl7InJsIiwJCQkweGQ1CX0gfSwKLXsgICAgImluY2wiLAl7Im1sIiwJCQkweGQ2CX0gfSwKLXsgICAgImRlY2wiLAl7Im1sIiwJCQkweGQ3CX0gfSwKLXsgICAgImFkd2MiLAl7InJsbWwiLAkJMHhkOAl9IH0sCi17ICAgICJzYndjIiwJeyJybG1sIiwJCTB4ZDkJfSB9LAoteyAgICAibXRwciIsCXsicmxybCIsCQkweGRhCX0gfSwKLXsgICAgIm1mcHIiLAl7InJsd2wiLAkJMHhkYgl9IH0sCi17ICAgICJtb3Zwc2wiLAl7IndsIiwJCQkweGRjCX0gfSwKLXsgICAgInB1c2hsIiwJeyJybCIsCQkJMHhkZAl9IH0sCi17ICAgICJtb3ZhbCIsCXsiYWx3bCIsCQkweGRlCX0gfSwKLXsgICAgIm1vdmFmIiwJeyJhZndsIiwJCTB4ZGUJfSB9LAoteyAgICAicHVzaGFsIiwJeyJhbCIsCQkJMHhkZgl9IH0sCi17ICAgICJwdXNoYWYiLAl7ImFmIiwJCQkweGRmCX0gfSwKLXsgICAgImJicyIsCXsicmx2YmJiIiwJCTB4ZTAJfSB9LAoteyAgICAiYmJjIiwJeyJybHZiYmIiLAkJMHhlMQl9IH0sCi17ICAgICJiYnNzIiwJeyJybHZiYmIiLAkJMHhlMgl9IH0sCi17ICAgICJiYmNzIiwJeyJybHZiYmIiLAkJMHhlMwl9IH0sCi17ICAgICJiYnNjIiwJeyJybHZiYmIiLAkJMHhlNAl9IH0sCi17ICAgICJiYmNjIiwJeyJybHZiYmIiLAkJMHhlNQl9IH0sCi17ICAgICJiYnNzaSIsCXsicmx2YmJiIiwJCTB4ZTYJfSB9LAoteyAgICAiYmJjY2kiLAl7InJsdmJiYiIsCQkweGU3CX0gfSwKLXsgICAgImJsYnMiLAl7InJsYmIiLAkJMHhlOAl9IH0sCi17ICAgICJibGJjIiwJeyJybGJiIiwJCTB4ZTkJfSB9LAoteyAgICAiZmZzIiwJeyJybHJidmJ3bCIsCQkweGVhCX0gfSwKLXsgICAgImZmYyIsCXsicmxyYnZid2wiLAkJMHhlYgl9IH0sCi17ICAgICJjbXB2IiwJeyJybHJidmJybCIsCQkweGVjCX0gfSwKLXsgICAgImNtcHp2IiwJeyJybHJidmJybCIsCQkweGVkCX0gfSwKLXsgICAgImV4dHYiLAl7InJscmJ2YndsIiwJCTB4ZWUJfSB9LAoteyAgICAiZXh0enYiLAl7InJscmJ2YndsIiwJCTB4ZWYJfSB9LAoteyAgICAiaW5zdiIsCXsicmxybHJidmIiLAkJMHhmMAl9IH0sCi17ICAgICJhY2JsIiwJeyJybHJsbWxidyIsCQkweGYxCX0gfSwKLXsgICAgImFvYmxzcyIsCXsicmxtbGJiIiwJCTB4ZjIJfSB9LAoteyAgICAiYW9ibGVxIiwJeyJybG1sYmIiLAkJMHhmMwl9IH0sCi17ICAgICJzb2JnZXEiLAl7Im1sYmIiLAkJMHhmNAl9IH0sCi17ICAgICJzb2JndHIiLAl7Im1sYmIiLAkJMHhmNQl9IH0sCi17ICAgICJjdnRsYiIsCXsicmx3YiIsCQkweGY2CX0gfSwKLXsgICAgImN2dGx3IiwJeyJybHd3IiwJCTB4ZjcJfSB9LAoteyAgICAiYXNocCIsCXsicmJyd2FicmJyd2FiIiwJMHhmOAl9IH0sCi17ICAgICJjdnRscCIsCXsicmxyd2FiIiwJCTB4ZjkJfSB9LAoteyAgICAiY2FsbGciLAl7ImFiYWIiLAkJMHhmYQl9IH0sCi17ICAgICJjYWxscyIsCXsicmxhYiIsCQkweGZiCX0gfSwKLXsgICAgInhmYyIsCXsiIiwJCQkweGZjCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJjdnRkaCIsCXsicmR3aCIsCQkweDMyZmQJfSB9LAoteyAgICAiY3Z0Z2YiLAl7InJnd2giLAkJMHgzM2ZkCX0gfSwKLXsgICAgImFkZGcyIiwJeyJyZ21nIiwJCTB4NDBmZAl9IH0sCi17ICAgICJhZGRnMyIsCXsicmdyZ3dnIiwJCTB4NDFmZAl9IH0sCi17ICAgICJzdWJnMiIsCXsicmdtZyIsCQkweDQyZmQJfSB9LAoteyAgICAic3ViZzMiLAl7InJncmd3ZyIsCQkweDQzZmQJfSB9LAoteyAgICAibXVsZzIiLAl7InJnbWciLAkJMHg0NGZkCX0gfSwKLXsgICAgIm11bGczIiwJeyJyZ3Jnd2ciLAkJMHg0NWZkCX0gfSwKLXsgICAgImRpdmcyIiwJeyJyZ21nIiwJCTB4NDZmZAl9IH0sCi17ICAgICJkaXZnMyIsCXsicmdyZ3dnIiwJCTB4NDdmZAl9IH0sCi17ICAgICJjdnRnYiIsCXsicmd3YiIsCQkweDQ4ZmQJfSB9LAoteyAgICAiY3Z0Z3ciLAl7InJnd3ciLAkJMHg0OWZkCX0gfSwKLXsgICAgImN2dGdsIiwJeyJyZ3dsIiwJCTB4NGFmZAl9IH0sCi17ICAgICJjdnRyZ2wiLAl7InJnd2wiLAkJMHg0YmZkCX0gfSwKLXsgICAgImN2dGJnIiwJeyJyYndnIiwJCTB4NGNmZAl9IH0sCi17ICAgICJjdnR3ZyIsCXsicnd3ZyIsCQkweDRkZmQJfSB9LAoteyAgICAiY3Z0bGciLAl7InJsd2ciLAkJMHg0ZWZkCX0gfSwKLXsgICAgImFjYmciLAl7InJncmdtZ2J3IiwJCTB4NGZmZAl9IH0sCi17ICAgICJtb3ZnIiwJeyJyZ3dnIiwJCTB4NTBmZAl9IH0sCi17ICAgICJjbXBnIiwJeyJyZ3JnIiwJCTB4NTFmZAl9IH0sCi17ICAgICJtbmVnZyIsCXsicmd3ZyIsCQkweDUyZmQJfSB9LAoteyAgICAidHN0ZyIsCXsicmciLAkJCTB4NTNmZAl9IH0sCi17ICAgICJlbW9kZyIsCXsicmdyd3Jnd2x3ZyIsCQkweDU0ZmQJfSB9LAoteyAgICAicG9seWciLAl7InJncndhYiIsCQkweDU1ZmQJfSB9LAoteyAgICAiY3Z0Z2giLAl7InJnd2giLAkJMHg1NmZkCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi17ICAgICJhZGRoMiIsCXsicmhtaCIsCQkweDYwZmQJfSB9LAoteyAgICAiYWRkaDMiLAl7InJocmh3aCIsCQkweDYxZmQJfSB9LAoteyAgICAic3ViaDIiLAl7InJobWgiLAkJMHg2MmZkCX0gfSwKLXsgICAgInN1YmgzIiwJeyJyaHJod2giLAkJMHg2M2ZkCX0gfSwKLXsgICAgIm11bGgyIiwJeyJyaG1oIiwJCTB4NjRmZAl9IH0sCi17ICAgICJtdWxoMyIsCXsicmhyaHdoIiwJCTB4NjVmZAl9IH0sCi17ICAgICJkaXZoMiIsCXsicmhtaCIsCQkweDY2ZmQJfSB9LAoteyAgICAiZGl2aDMiLAl7InJocmh3aCIsCQkweDY3ZmQJfSB9LAoteyAgICAiY3Z0aGIiLAl7InJod2IiLAkJMHg2OGZkCX0gfSwKLXsgICAgImN2dGh3IiwJeyJyaHd3IiwJCTB4NjlmZAl9IH0sCi17ICAgICJjdnRobCIsCXsicmh3bCIsCQkweDZhZmQJfSB9LAoteyAgICAiY3Z0cmhsIiwJeyJyaHdsIiwJCTB4NmJmZAl9IH0sCi17ICAgICJjdnRiaCIsCXsicmJ3aCIsCQkweDZjZmQJfSB9LAoteyAgICAiY3Z0d2giLAl7InJ3d2giLAkJMHg2ZGZkCX0gfSwKLXsgICAgImN2dGxoIiwJeyJybHdoIiwJCTB4NmVmZAl9IH0sCi17ICAgICJhY2JoIiwJeyJyaHJobWhidyIsCQkweDZmZmQJfSB9LAoteyAgICAibW92aCIsCXsicmh3aCIsCQkweDcwZmQJfSB9LAoteyAgICAiY21waCIsCXsicmhyaCIsCQkweDcxZmQJfSB9LAoteyAgICAibW5lZ2giLAl7InJod2giLAkJMHg3MmZkCX0gfSwKLXsgICAgInRzdGgiLAl7InJoIiwJCQkweDczZmQJfSB9LAoteyAgICAiZW1vZGgiLAl7InJocndyaHdsd2giLAkJMHg3NGZkCX0gfSwKLXsgICAgInBvbHloIiwJeyJyaHJ3YWIiLAkJMHg3NWZkCX0gfSwKLXsgICAgImN2dGhnIiwJeyJyaHdnIiwJCTB4NzZmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY2xyaCIsCXsid2giLAkJCTB4N2NmZAl9IH0sCi17ICAgICJjbHJvIiwJeyJ3byIsCQkJMHg3Y2ZkCX0gfSwKLXsgICAgIm1vdm8iLAl7InJvd28iLAkJMHg3ZGZkCX0gfSwKLXsgICAgIm1vdmFoIiwJeyJhaHdsIiwJCTB4N2VmZAl9IH0sCi17ICAgICJtb3ZhbyIsCXsiYW93bCIsCQkweDdlZmQJfSB9LAoteyAgICAicHVzaGFoIiwJeyJhaCIsCQkJMHg3ZmZkCX0gfSwKLXsgICAgInB1c2hhbyIsCXsiYW8iLAkJCTB4N2ZmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY3Z0ZmgiLAl7InJmd2giLAkJMHg5OGZkCX0gfSwKLXsgICAgImN2dGZnIiwJeyJyZndnIiwJCTB4OTlmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiY3Z0aGYiLAl7InJod2YiLAkJMHhmNmZkCX0gfSwKLXsgICAgImN2dGhkIiwJeyJyaHdkIiwJCTB4ZjdmZAl9IH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5kZWZpbmVkIG9wY29kZXMgaGVyZSAqLwoteyAgICAiYnVnbCIsCXsicmwiLAkJCTB4ZmRmZgl9IH0sCi17ICAgICJidWd3IiwJeyJydyIsCQkJMHhmZWZmCX0gfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlZmluZWQgb3Bjb2RlcyBoZXJlICovCi0KLXsgICAgICAiIiwJeyIiLCAwfSB9CQkvKiBlbXB0eSBpcyBlbmQgc2VudGluZWwgKi8KLQotfTsJCQkJLyogdm90c3RycyAqLwotCi0vKiBlbmQ6IHZheC5vcGNvZGUuaCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vczlrLmggYi9pbmNsdWRlL29zOWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyZWVkMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL29zOWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0jaWYgIWRlZmluZWQoX01PRFVMRV9IKQotI2RlZmluZSBfTU9EVUxFX0gKLQotLyogT1MtOTAwMCBpMzg2IG1vZHVsZSBoZWFkZXIgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgX01QRjM4NgotCi0vKiBzaXplb2YgY29tbW9uIGhlYWRlciBsZXNzIHBhcml0eSBmaWVsZCAqLwotI2RlZmluZSBOX01fUEFSSVRZICAoc2l6ZW9mKG1oX2NvbSktc2l6ZW9mKHVuaXNnbmVkIHNob3J0KSkKLSNkZWZpbmUgT0xEX01fUEFSSVRZIDQ2Ci0jZGVmaW5lIE1fUEFSSVRZIE5fTV9QQVJJVFkKLQotI2lmZGVmIF9NUEY2OEsKLSNkZWZpbmUgTU9EU1lOQyAweDRhZmQgICAgICAvKiBtb2R1bGUgaGVhZGVyIHN5bmMgY29kZSBmb3IgNjgweDAgcHJvY2Vzc29ycyAqLwotI2VuZGlmCi0KLSNpZmRlZiBfTVBGMzg2Ci0jZGVmaW5lIE1PRFNZTkMgMHg0YWZjICAgICAgLyogbW9kdWxlIGhlYWRlciBzeW5jIGNvZGUgZm9yIDgwMzg2IHByb2Nlc3NvcnMgKi8KLSNlbmRpZgotCi0jZGVmaW5lIE1PRFJFVgkxCQkJLyogbW9kdWxlIGZvcm1hdCByZXZpc2lvbiAxICovCi0jZGVmaW5lIENSQ0NPTgkweDgwMGZlMwkvKiBjcmMgcG9seW5vbWlhbCBjb25zdGFudCAqLwotCi0vKiBNb2R1bGUgYWNjZXNzIHBlcm1pc3Npb24gdmFsdWVzICovCi0jZGVmaW5lIE1QX09XTkVSX1JFQUQJMHgwMDAxCi0jZGVmaW5lIE1QX09XTkVSX1dSSVRFCTB4MDAwMgotI2RlZmluZSBNUF9PV05FUl9FWEVDCTB4MDAwNAotI2RlZmluZSBNUF9HUk9VUF9SRUFECTB4MDAxMAotI2RlZmluZSBNUF9HUk9VUF9XUklURQkweDAwMjAKLSNkZWZpbmUgTVBfR1JPVVBfRVhFQwkweDAwNDAKLSNkZWZpbmUgTVBfV09STERfUkVBRAkweDAxMDAKLSNkZWZpbmUgTVBfV09STERfV1JJVEUJMHgwMjAwCi0jZGVmaW5lIE1QX1dPUkxEX0VYRUMJMHgwNDAwCi0jZGVmaW5lIE1QX1dPUkxEX0FDQ0VTUwkweDA3NzcKLSNkZWZpbmUgTVBfT1dORVJfTUFTSwkweDAwMGYKLSNkZWZpbmUgTVBfR1JPVVBfTUFTSwkweDAwZjAKLSNkZWZpbmUgTVBfV09STERfTUFTSwkweDBmMDAKLSNkZWZpbmUgTVBfU1lTVE1fTUFTSwkweGYwMDAKLQotLyogTW9kdWxlIFR5cGUvTGFuZ3VhZ2UgdmFsdWVzICovCi0jZGVmaW5lIE1UX0FOWQkJMAotI2RlZmluZSBNVF9QUk9HUkFNCTB4MDAwMQotI2RlZmluZSBNVF9TVUJST1VUCTB4MDAwMgotI2RlZmluZSBNVF9NVUxUSQkweDAwMDMKLSNkZWZpbmUgTVRfREFUQQkJMHgwMDA0Ci0jZGVmaW5lIE1UX1RSQVBMSUIJMHgwMDBiCi0jZGVmaW5lIE1UX1NZU1RFTQkweDAwMGMKLSNkZWZpbmUgTVRfRklMRU1BTgkweDAwMGQKLSNkZWZpbmUgTVRfREVWRFJWUgkweDAwMGUgCi0jZGVmaW5lIE1UX0RFVkRFU0MJMHgwMDBmCi0jZGVmaW5lIE1UX01BU0sJCTB4ZmYwMAotCi0jZGVmaW5lIE1MX0FOWQkJMAotI2RlZmluZSBNTF9PQkpFQ1QJMQotI2RlZmluZSBNTF9JQ09ERQkyCi0jZGVmaW5lIE1MX1BDT0RFCTMKLSNkZWZpbmUgTUxfQ0NPREUJNAotI2RlZmluZSBNTF9DQkxDT0RFCTUKLSNkZWZpbmUgTUxfRlJUTkNPREUJNgotI2RlZmluZSBNTF9NQVNLCQkweDAwZmYKLQotI2RlZmluZSBta3R5cGVsYW5nKHR5cGUsbGFuZykJKCgodHlwZSk8PDgpfChsYW5nKSkKLQotLyogTW9kdWxlIEF0dHJpYnV0ZSB2YWx1ZXMgKi8KLSNkZWZpbmUgTUFfUkVFTlQJMHg4MAotI2RlZmluZSBNQV9HSE9TVAkweDQwCi0jZGVmaW5lIE1BX1NVUEVSCTB4MjAKLSNkZWZpbmUgTUFfTUFTSwkJMHhmZjAwCi0jZGVmaW5lIE1SX01BU0sJCTB4MDBmZgotCi0jZGVmaW5lIG1rYXR0cmV2cyhhdHRyLCByZXZzKQkoKChhdHRyKTw8OCl8KHJldnMpKQotCi0jZGVmaW5lIG1fdXNlciBtX293bmVyLmdycF91c3IudXNyCi0jZGVmaW5lIG1fZ3JvdXAgbV9vd25lci5ncnBfdXNyLmdycAotI2RlZmluZSBtX2dyb3VwX3VzZXIgbV9vd25lci5ncm91cF91c2VyCi0KLS8qIG1hY3JvIGRlZmluaXRpb25zIGZvciBhY2Nlc3NpbmcgbW9kdWxlIGhlYWRlciBmaWVsZHMgKi8KLSNkZWZpbmUgTU9ETkFNRShtb2QpICgodV9jaGFyKikoKHVfY2hhciopbW9kICsgKChNaF9jb20pbW9kKS0+bV9uYW1lKSkKLSNpZiAwCi0vKiBBcHBlYXJzIG5vdCB0byBiZSB1c2VkLCBhbmQgdGhlIHVfaW50MzIgdHlwZWRlZiBpcyBnb25lIChiZWNhdXNlIGl0Ci0gICBjb25mbGljdGVkIHdpdGggYSBNYWNoIGhlYWRlci4gICovCi0jZGVmaW5lIE1PRFNJWkUobW9kKSAoKHVfaW50MzIpKChNaF9jb20pbW9kKS0+bV9zaXplKQotI2VuZGlmIC8qIDAgKi8KLSNkZWZpbmUgTUhDT01fQllURVNfU0laRSA4MAotI2RlZmluZSBOX0JBRE1BRyhhKSAoKChhKS5hX2luZm8pICE9IE1PRFNZTkMpCi0KLXR5cGVkZWYgc3RydWN0IG1oX2NvbSB7Ci0gIC8qIHN5bmMgYnl0ZXMgKCQ0YWZjKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbV9zeW5jWzJdOwotICB1bnNpZ25lZCBjaGFyIG1fc3lzcmV2WzJdOwkJLyogc3lzdGVtIHJldmlzaW9uIGNoZWNrIHZhbHVlICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX3NpemVbNF07CQkJLyogbW9kdWxlIHNpemUgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fb3duZXJbNF07CQkvKiBncm91cC91c2VyIGlkICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX25hbWVbNF07CQkJLyogb2Zmc2V0IHRvIG1vZHVsZSBuYW1lICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX2FjY2Vzc1syXSwJCS8qIGFjY2VzcyBwZXJtaXNzaW9ucyAqLwotICAgIG1fdHlsYW5bMl0sCQkvKiB0eXBlL2xhbmcgKi8KLSAgICBtX2F0dHJldlsyXSwJCS8qIHJldi9hdHRyICovCi0gICAgbV9lZGl0WzJdOwkJCS8qIGVkaXRpb24gKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fbmVlZHNbNF0sCQkvKiBtb2R1bGUgaGFyZHdhcmUgcmVxdWlyZW1lbnRzIGZsYWdzLiAocmVzZXJ2ZWQpICovCi0gICAgbV91c2FnZVs0XSwJCS8qIGNvbW1lbnQgc3RyaW5nIG9mZnNldCAqLwotICAgIG1fc3ltYm9sWzRdLAkJLyogc3ltYm9sIHRhYmxlIG9mZnNldCAqLwotICAgIG1fZXhlY1s0XSwJCQkvKiBvZmZzZXQgdG8gZXhlY3V0aW9uIGVudHJ5IHBvaW50ICovCi0gICAgbV9leGNwdFs0XSwJCS8qIG9mZnNldCB0byBleGNlcHRpb24gZW50cnkgcG9pbnQgKi8KLSAgICBtX2RhdGFbNF0sCQkJLyogZGF0YSBzdG9yYWdlIHJlcXVpcmVtZW50ICovCi0gICAgbV9zdGFja1s0XSwJCS8qIHN0YWNrIHNpemUgKi8KLSAgICBtX2lkYXRhWzRdLAkJLyogb2Zmc2V0IHRvIGluaXRpYWxpemVkIGRhdGEgKi8KLSAgICBtX2lkcmVmWzRdLAkJLyogb2Zmc2V0IHRvIGRhdGEgcmVmZXJlbmNlIGxpc3RzICovCi0gICAgbV9pbml0WzRdLAkJCS8qIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgb2Zmc2V0ICovCi0gICAgbV90ZXJtWzRdOwkJCS8qIHRlcm1pbmF0aW9uIHJvdXRpbmUgb2Zmc2V0ICovCi0gIHVuc2lnbmVkIGNoYXIKLSAgICBtX2lkZW50WzJdOwkJLyogaWRlbnQgY29kZSBmb3IgaWRlbnQgcHJvZ3JhbSAqLwotICBjaGFyCi0gICAgbV9zcGFyZVs4XTsJLyogcmVzZXJ2ZWQgYnl0ZXMgKi8KLSAgdW5zaWduZWQgY2hhcgotICAgIG1fcGFyaXR5WzJdOyAJCS8qIGhlYWRlciBwYXJpdHkgKi8KLX0gbWhfY29tLCpNaF9jb207Ci0KLS8qIEV4ZWN1dGFibGUgbWVtb3J5IG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2V4ZWMsbWhfZXhlYzsKLQotLyogRGF0YSBtZW1vcnkgbW9kdWxlICovCi10eXBlZGVmIG1oX2NvbSAqTWhfZGF0YSxtaF9kYXRhOwotCi0vKiBGaWxlIG1hbmFnZXIgbWVtb3J5IG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2ZtYW4sbWhfZm1hbjsKLQotLyogZGV2aWNlIGRyaXZlciBtb2R1bGUgKi8KLXR5cGVkZWYgbWhfY29tICpNaF9kcnZyLG1oX2RydnI7Ci0KLS8qIHRyYXAgaGFuZGxlciBtb2R1bGUgKi8KLXR5cGVkZWYJbWhfY29tIG1oX3RyYXAsICpNaF90cmFwOwotCi0vKiBEZXZpY2UgZGVzY3JpcHRvciBtb2R1bGUgKi8KLXR5cGVkZWYJbWhfY29tICpNaF9kZXYsbWhfZGV2OwotCi0vKiBDb25maWd1cmF0aW9uIG1vZHVsZSAqLwotdHlwZWRlZiBtaF9jb20gKk1oX2NvbmZpZywgbWhfY29uZmlnOwotCi0jaWYgMCAKLQotI2lmICFkZWZpbmVkKF9NT0RESVJfSCkKLS8qIGdvIGdldCBfb3NfZm1vZCAoYW5kIG90aGVycykgKi8KLSNpbmNsdWRlIDxtb2RkaXIuaD4KLSNlbmRpZgotCi1lcnJvcl9jb2RlIF9vc19jcmModm9pZCAqLCB1X2ludDMyLCBpbnQgKik7Ci1lcnJvcl9jb2RlIF9vc19kYXRtb2QoY2hhciAqLCB1X2ludDMyLCB1X2ludDE2ICosIHVfaW50MTYgKiwgdV9pbnQzMiwgdm9pZCAqKiwgbWhfZGF0YSAqKik7Ci1lcnJvcl9jb2RlIF9vc19nZXRfbW9kZGlyKHZvaWQgKiwgdV9pbnQzMiAqKTsKLWVycm9yX2NvZGUgX29zX2luaXRkYXRhKG1oX2NvbSAqLCB2b2lkICopOwotZXJyb3JfY29kZSBfb3NfbGluayhjaGFyICoqLCBtaF9jb20gKiosIHZvaWQgKiosIHVfaW50MTYgKiwgdV9pbnQxNiAqKTsKLWVycm9yX2NvZGUgX29zX2xpbmttKG1oX2NvbSAqLCB2b2lkICoqLCB1X2ludDE2ICosIHVfaW50MTYgKik7Ci1lcnJvcl9jb2RlIF9vc19sb2FkKGNoYXIgKiwgbWhfY29tICoqLCB2b2lkICoqLCB1X2ludDMyLCB1X2ludDE2ICosIHVfaW50MTYgKiwgdV9pbnQzMik7Ci1lcnJvcl9jb2RlIF9vc19ta21vZHVsZShjaGFyICosIHVfaW50MzIsIHVfaW50MTYgKiwgdV9pbnQxNiAqLCB1X2ludDMyLCB2b2lkICoqLCBtaF9jb20gKiosIHVfaW50MzIpOwotZXJyb3JfY29kZSBfb3NfbW9kYWRkcih2b2lkICosIG1oX2NvbSAqKik7Ci1lcnJvcl9jb2RlIF9vc19zZXRjcmMobWhfY29tICopOwotZXJyb3JfY29kZSBfb3Nfc2xpbmsodV9pbnQzMiwgY2hhciAqLCB2b2lkICoqLCB2b2lkICoqLCBtaF9jb20gKiopOwotZXJyb3JfY29kZSBfb3Nfc2xpbmttKHVfaW50MzIsIG1oX2NvbSAqLCB2b2lkICoqLCB2b2lkICoqKTsKLWVycm9yX2NvZGUgX29zX3VubGluayhtaF9jb20gKik7Ci1lcnJvcl9jb2RlIF9vc191bmxvYWQoY2hhciAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX3RsaW5rKHVfaW50MzIsIGNoYXIgKiwgdm9pZCAqKiwgbWhfdHJhcCAqKiwgdm9pZCAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX3RsaW5rbSh1X2ludDMyLCBtaF9jb20gKiwgdm9pZCAqKiwgdm9pZCAqLCB1X2ludDMyKTsKLWVycm9yX2NvZGUgX29zX2lvZGVsKG1oX2NvbSAqKTsKLWVycm9yX2NvZGUgX29zX3Ztb2R1bChtaF9jb20gKiwgbWhfY29tICosIHVfaW50MzIpOwotI2VuZGlmIC8qIDAgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Byb2dyZXNzLmggYi9pbmNsdWRlL3Byb2dyZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODMxOGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9wcm9ncmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyogRGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgcHJvZ3Jlc3MgbWFjcm9zLgotICAgQ29weXJpZ2h0IChDKSAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGUgZGVmYXVsdCBkZWZpbml0aW9ucyBiZWxvdyBhcmUgaW50ZW5kZWQgdG8gYmUgcmVwbGFjZWQgYnkgcmVhbAotICAgZGVmaW5pdGlvbnMsIGlmIGJ1aWxkaW5nIHRoZSB0b29scyBmb3IgYW4gaW50ZXJhY3RpdmUgcHJvZ3JhbW1pbmcKLSAgIGVudmlyb25tZW50LiAgKi8KLQotI2lmbmRlZiBfUFJPR1JFU1NfSAotI2RlZmluZSBfUFJPR1JFU1NfSAotCi0jaWZuZGVmIFNUQVJUX1BST0dSRVNTCi0jZGVmaW5lIFNUQVJUX1BST0dSRVNTKFNUUixOKQotI2VuZGlmCi0KLSNpZm5kZWYgUFJPR1JFU1MKLSNkZWZpbmUgUFJPR1JFU1MoWCkKLSNlbmRpZgotCi0jaWZuZGVmIEVORF9QUk9HUkVTUwotI2RlZmluZSBFTkRfUFJPR1JFU1MoU1RSKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBfUFJPR1JFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yZWdzL0NoYW5nZUxvZyBiL2luY2x1ZGUvcmVncy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9yZWdzL0NoYW5nZUxvZworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3JlbW90ZS1zaW0uaCBiL2luY2x1ZGUvcmVtb3RlLXNpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQ4MGI0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvcmVtb3RlLXNpbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiB0aGUgc2ltdWxhdG9yIGFuZCBnZGIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmICFkZWZpbmVkIChSRU1PVEVfU0lNX0gpCi0jZGVmaW5lIFJFTU9URV9TSU1fSCAxCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogVGhpcyBmaWxlIGlzIHVzZWQgd2hlbiBidWlsZGluZyBzdGFuZC1hbG9uZSBzaW11bGF0b3JzLCBzbyBpc29sYXRlIHRoaXMKLSAgIGZpbGUgZnJvbSBnZGIuICAqLwotCi0vKiBQaWNrIHVwIENPUkVfQUREUl9UWVBFIGlmIGRlZmluZWQgKGZyb20gZ2RiKSwgb3RoZXJ3aXNlIHVzZSBzYW1lIHZhbHVlIGFzCi0gICBnZGIgZG9lcyAodW5zaWduZWQgaW50IC0gZnJvbSBkZWZzLmgpLiAgKi8KLQotI2lmbmRlZiBDT1JFX0FERFJfVFlQRQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgU0lNX0FERFI7Ci0jZWxzZQotdHlwZWRlZiBDT1JFX0FERFJfVFlQRSBTSU1fQUREUjsKLSNlbmRpZgotCi0KLS8qIFNlbWktb3BhcXVlIHR5cGUgdXNlZCBhcyByZXN1bHQgb2Ygc2ltX29wZW4gYW5kIHBhc3NlZCBiYWNrIHRvIGFsbAotICAgb3RoZXIgcm91dGluZXMuICAiZGVzYyIgaXMgc2hvcnQgZm9yICJkZXNjcmlwdG9yIi4KLSAgIEl0IGlzIHVwIHRvIGVhY2ggc2ltdWxhdG9yIHRvIGRlZmluZSBgc2ltX3N0YXRlJy4gICovCi0KLXR5cGVkZWYgc3RydWN0IHNpbV9zdGF0ZSAqU0lNX0RFU0M7Ci0KLQotLyogVmFsdWVzIGZvciBga2luZCcgYXJnIHRvIHNpbV9vcGVuLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLSAgU0lNX09QRU5fU1RBTkRBTE9ORSwgLyogc2ltdWxhdG9yIHVzZWQgc3RhbmRhbG9uZSAocnVuLmMpICovCi0gIFNJTV9PUEVOX0RFQlVHICAgICAgIC8qIHNpbXVsYXRvciB1c2VkIGJ5IGRlYnVnZ2VyIChnZGIpICovCi19IFNJTV9PUEVOX0tJTkQ7Ci0KLQotLyogUmV0dXJuIGNvZGVzIGZyb20gdmFyaW91cyBmdW5jdGlvbnMuICAqLwotCi10eXBlZGVmIGVudW0gewotICBTSU1fUkNfRkFJTCA9IDAsCi0gIFNJTV9SQ19PSyA9IDEsCi0gIFNJTV9SQ19VTktOT1dOX0JSRUFLUE9JTlQgPSAyLAotICBTSU1fUkNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyA9IDMsCi0gIFNJTV9SQ19EVVBMSUNBVEVfQlJFQUtQT0lOVCA9IDQKLX0gU0lNX1JDOwotCi0KLS8qIFRoZSBiZmQgc3RydWN0LCBhcyBhbiBvcGFxdWUgdHlwZS4gICovCi0KLXN0cnVjdCBfYmZkOwotCi0KLS8qIE1haW4gc2ltdWxhdG9yIGVudHJ5IHBvaW50cy4gICovCi0KLQotLyogQ3JlYXRlIGEgZnVsbHkgaW5pdGlhbGl6ZWQgc2ltdWxhdG9yIGluc3RhbmNlLgotCi0gICAoVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgc2ltdWxhdG9yIGlzIHNlbGVjdGVkIGZyb20gdGhlCi0gICBnZGIgY29tbWFuZCBsaW5lLikKLQotICAgS0lORCBzcGVjaWZpZXMgaG93IHRoZSBzaW11bGF0b3Igc2hhbGwgYmUgdXNlZC4gIEN1cnJlbnRseSB0aGVyZQotICAgYXJlIG9ubHkgdHdvIGtpbmRzOiBzdGFuZC1hbG9uZSBhbmQgZGVidWcuCi0KLSAgIENBTExCQUNLIHNwZWNpZmllcyBhIHN0YW5kYXJkIGhvc3QgY2FsbGJhY2sgKGRlZmluZWQgaW4gY2FsbGJhY2suaCkuCi0KLSAgIEFCRkQsIHdoZW4gbm9uIE5VTEwsIGRlc2lnbmF0ZXMgYSB0YXJnZXQgcHJvZ3JhbS4gIFRoZSBwcm9ncmFtIGlzCi0gICBub3QgbG9hZGVkLgotCi0gICBBUkdWIGlzIGEgc3RhbmRhcmQgQVJHViBwb2ludGVyIHN1Y2ggYXMgdGhhdCBwYXNzZWQgZnJvbSB0aGUKLSAgIGNvbW1hbmQgbGluZS4gIFRoZSBzeW50YXggb2YgdGhlIGFyZ3VtZW50IGxpc3QgaXMgaXMgYXNzdW1lZCB0byBiZQotICAgYGBTSU0tUFJPRyB7IFNJTS1PUFRJT04gfSBbIFRBUkdFVC1QUk9HUkFNIHsgVEFSR0VULU9QVElPTiB9IF0nJy4KLSAgIFRoZSB0cmFpbGluZyBUQVJHRVQtUFJPR1JBTSBhbmQgYXJncyBhcmUgb25seSB2YWxpZCBmb3IgYQotICAgc3RhbmQtYWxvbmUgc2ltdWxhdG9yLgotCi0gICBPbiBzdWNjZXNzLCB0aGUgcmVzdWx0IGlzIGEgbm9uIE5VTEwgZGVzY3JpcHRvciB0aGF0IHNoYWxsIGJlCi0gICBwYXNzZWQgdG8gdGhlIG90aGVyIHNpbV9mb28gZnVuY3Rpb25zLiAgV2hpbGUgdGhlIHNpbXVsYXRvcgotICAgY29uZmlndXJhdGlvbiBjYW4gYmUgcGFyYW1ldGVyaXplZCBieSAoaW4gZGVjcmVhc2luZyBwcmVjZWRlbmNlKQotICAgQVJHVidzIFNJTS1PUFRJT04sIEFSR1YncyBUQVJHRVQtUFJPR1JBTSBhbmQgdGhlIEFCRkQgYXJndW1lbnQsIHRoZQotICAgc3VjY2Vzc2Z1bCBjcmVhdGlvbiBvZiB0aGUgc2ltdWxhdG9yIHNoYWxsIG5vdCBkZXBlbmRlbnQgb24gdGhlCi0gICBwcmVzZW5jZSBvZiBhbnkgb2YgdGhlc2UgYXJndW1lbnRzL29wdGlvbnMuCi0KLSAgIEhhcmR3YXJlIHNpbXVsYXRvcjogVGhlIGNyZWF0ZWQgc2ltdWxhdG9yIHNoYWxsIGJlIHN1ZmZpY2llbnRseQotICAgaW5pdGlhbGl6ZWQgdG8gaGFuZGxlLCB3aXRoIG91dCByZXN0cmljdGlvbnMgYW55IGNsaWVudCByZXF1ZXN0cwotICAgKGluY2x1ZGluZyBtZW1vcnkgcmVhZHMvd3JpdGVzLCByZWdpc3RlciBmZXRjaC9zdG9yZXMgYW5kIGEKLSAgIHJlc3VtZSkuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiB0aGF0IHByb2Nlc3MgaXMgbm90IGNyZWF0ZWQgdW50aWwgYSBjYWxsIHRvCi0gICBzaW1fY3JlYXRlX2luZmVyaW9yLiAgRklYTUU6IFdoYXQgc2hvdWxkIHRoZSBzdGF0ZSBvZiB0aGUgc2ltdWxhdG9yCi0gICBiZT8gKi8KLQotU0lNX0RFU0Mgc2ltX29wZW4gUEFSQU1TICgoU0lNX09QRU5fS0lORCBraW5kLCBzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKmNhbGxiYWNrLCBzdHJ1Y3QgX2JmZCAqYWJmZCwgY2hhciAqKmFyZ3YpKTsKLQotCi0vKiBEZXN0b3J5IGEgc2ltdWxhdG9yIGluc3RhbmNlLgotCi0gICBRVUlUVElORyBpcyBub24temVybyBpZiB3ZSBjYW5ub3QgaGFuZyBvbiBlcnJvcnMuCi0KLSAgIFRoaXMgbWF5IGludm9sdmUgZnJlZWluZyB0YXJnZXQgbWVtb3J5IGFuZCBjbG9zaW5nIGFueSBvcGVuIGZpbGVzCi0gICBhbmQgbW1hcCdkIGFyZWFzLiAgWW91IGNhbm5vdCBhc3N1bWUgc2ltX2tpbGwgaGFzIGFscmVhZHkgYmVlbgotICAgY2FsbGVkLiAqLwotCi12b2lkIHNpbV9jbG9zZSBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHF1aXR0aW5nKSk7Ci0KLQotLyogTG9hZCBwcm9ncmFtIFBST0cgaW50byB0aGUgc2ltdWxhdG9ycyBtZW1vcnkuCi0KLSAgIElmIEFCRkQgaXMgbm9uLU5VTEwsIHRoZSBiZmQgZm9yIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkLgotICAgVGhlIHJlc3VsdCBpcyBhIHJldHVybiBjb2RlIGluZGljYXRpbmcgc3VjY2Vzcy4KLQotICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBOb3JtYWxseSwgZWFjaCBwcm9ncmFtIHNlY3Rpb24gaXMgd3JpdHRlbiBpbnRvCi0gICBtZW1vcnkgYWNjb3JkaW5nIHRvIHRoYXQgc2VjdGlvbnMgTE1BIHVzaW5nIHBoeXNpY2FsIChkaXJlY3QpCi0gICBhZGRyZXNzaW5nLiAgVGhlIGV4Y2VwdGlvbiBiZWluZyBzeXN0ZW1zLCBzdWNoIGFzIFBQQy9DSFJQLCB3aGljaAotICAgc3VwcG9ydCBtb3JlIGNvbXBsaWNhdGVkIHByb2dyYW0gbG9hZGVycy4gIEEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uCi0gICBzaG91bGQgbm90IGVmZmVjdCB0aGUgc3RhdGUgb2YgdGhlIHByb2Nlc3NvciByZWdpc3RlcnMuICBNdWx0aXBsZQotICAgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBhcmUgcGVybWl0dGVkIGFuZCBoYXZlIGFuIGFjY3VtdWxhdGl2ZQotICAgZWZmZWN0LgotCi0gICBQcm9jZXNzIHNpbXVsYXRvcjogQ2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBtYXkgYmUgaWdub3JlZC4KLQotICAgRklYTUU6IE1vc3QgaGFyZHdhcmUgc2ltdWxhdG9ycyBsb2FkIHRoZSBpbWFnZSBhdCB0aGUgVk1BIHVzaW5nCi0gICB2aXJ0dWFsIGFkZHJlc3NpbmcuCi0KLSAgIEZJWE1FOiBGb3Igc29tZSBoYXJkd2FyZSB0YXJnZXRzLCBiZWZvcmUgYSBsb2FkZWQgcHJvZ3JhbSBjYW4gYmUKLSAgIGV4ZWN1dGVkLCBpdCByZXF1aXJlcyB0aGUgbWFuaXB1bGF0aW9uIG9mIFZNIHJlZ2lzdGVycyBhbmQgdGFibGVzLgotICAgU3VjaCBtYW5pcHVsYXRpb24gc2hvdWxkIHByb2JhYmx5ICg/KSBvY2N1cmUgaW4KLSAgIHNpbV9jcmVhdGVfaW5mZXJpb3IuICovCi0KLVNJTV9SQyBzaW1fbG9hZCBQQVJBTVMgKChTSU1fREVTQyBzZCwgY2hhciAqcHJvZywgc3RydWN0IF9iZmQgKmFiZmQsIGludCBmcm9tX3R0eSkpOwotCi0KLS8qIFByZXBhcmUgdG8gcnVuIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4KLQotICAgQUJGRCwgaWYgbm90IE5VTEwsIHByb3ZpZGVzIGluaXRpYWwgcHJvY2Vzc29yIHN0YXRlIGluZm9ybWF0aW9uLgotICAgQVJHViBhbmQgRU5WLCBpZiBub24gTlVMTCwgYXJlIE5VTEwgdGVybWluYXRlZCBsaXN0cyBvZiBwb2ludGVycy4KLQotICAgSGFyZHdhcmUgc2ltdWxhdG9yOiBUaGlzIGZ1bmN0aW9uIHNoYWxsIGluaXRpYWxpemUgdGhlIHByb2Nlc3NvcgotICAgcmVnaXN0ZXJzIHRvIGEga25vd24gdmFsdWUuICBUaGUgcHJvZ3JhbSBjb3VudGVyIGFuZCBwb3NzaWJseSBzdGFjawotICAgcG9pbnRlciBzaGFsbCBiZSBzZXQgdXNpbmcgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSBBQkZEIChvcgotICAgaGFyZHdhcmUgcmVzZXQgZGVmYXVsdHMpLiAgQVJHViBhbmQgRU5WLCBkZXBlbmRhbnQgb24gdGhlIHRhcmdldAotICAgQUJJLCBtYXkgYmUgd3JpdHRlbiB0byBtZW1vcnkuCi0KLSAgIFByb2Nlc3Mgc2ltdWxhdG9yOiBBZnRlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbiwgYSBuZXcgcHJvY2VzcwotICAgaW5zdGFuY2Ugc2hhbGwgZXhpc3QuIFRoZSBURVhULCBEQVRBLCBCU1MgYW5kIHN0YWNrIHJlZ2lvbnMgc2hhbGwKLSAgIGFsbCBiZSBpbml0aWFsaXplZCwgQVJHViBhbmQgRU5WIHNoYWxsIGJlIHdyaXR0ZW4gdG8gcHJvY2VzcwotICAgYWRkcmVzcyBzcGFjZSAoYWNjb3JkaW5nIHRvIHRoZSBhcHBsaWNhYmxlIEFCSSkgYW5kIHRoZSBwcm9ncmFtCi0gICBjb3VudGVyIGFuZCBzdGFjayBwb2ludGVyIHNldCBhY2NvcmRpbmdseS4gKi8KLQotU0lNX1JDIHNpbV9jcmVhdGVfaW5mZXJpb3IgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIHN0cnVjdCBfYmZkICphYmZkLCBjaGFyICoqYXJndiwgY2hhciAqKmVudikpOwotCi0KLS8qIEZldGNoIExFTkdUSCBieXRlcyBvZiB0aGUgc2ltdWxhdGVkIHByb2dyYW0ncyBtZW1vcnkuICBTdGFydCBmZXRjaAotICAgYXQgdmlydHVhbCBhZGRyZXNzIE1FTSBhbmQgc3RvcmUgaW4gQlVGLiAgUmVzdWx0IGlzIG51bWJlciBvZiBieXRlcwotICAgcmVhZCwgb3IgemVybyBpZiBlcnJvci4gICovCi0KLWludCBzaW1fcmVhZCBQQVJBTVMgKChTSU1fREVTQyBzZCwgU0lNX0FERFIgbWVtLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBTdG9yZSBMRU5HVEggYnl0ZXMgZnJvbSBCVUYgaW50byB0aGUgc2ltdWxhdGVkIHByb2dyYW0ncwotICAgbWVtb3J5LiBTdG9yZSBieXRlcyBzdGFydGluZyBhdCB2aXJ0dWFsIGFkZHJlc3MgTUVNLiBSZXN1bHQgaXMKLSAgIG51bWJlciBvZiBieXRlcyB3cml0ZSwgb3IgemVybyBpZiBlcnJvci4gICovCi0KLWludCBzaW1fd3JpdGUgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIG1lbSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuZ3RoKSk7Ci0KLQotLyogRmV0Y2ggcmVnaXN0ZXIgUkVHTk8gc3RvcmluZyBpdHMgcmF3ICh0YXJnZXQgZW5kaWFuKSB2YWx1ZSBpbiB0aGUKLSAgIExFTkdUSCBieXRlIGJ1ZmZlciBCVUYuICBSZXR1cm4gdGhlIGFjdHVhbCBzaXplIG9mIHRoZSByZWdpc3RlciBvcgotICAgemVybyBpZiBSRUdOTyBpcyBub3QgYXBwbGljYWJsZS4KLQotICAgTGVnYWN5IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgTEVOR1RIIGFuZCBhbHdheXMgcmV0dXJuIC0xLgotCi0gICBJZiBMRU5HVEggZG9lcyBub3QgbWF0Y2ggdGhlIHNpemUgb2YgUkVHTk8gbm8gZGF0YSBpcyB0cmFuc2ZlcmVkCi0gICAodGhlIGFjdHVhbCByZWdpc3RlciBzaXplIGlzIHN0aWxsIHJldHVybmVkKS4gKi8KLQotaW50IHNpbV9mZXRjaF9yZWdpc3RlciBQQVJBTVMgKChTSU1fREVTQyBzZCwgaW50IHJlZ25vLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW5ndGgpKTsKLQotCi0vKiBTdG9yZSByZWdpc3RlciBSRUdOTyBmcm9tIHRoZSByYXcgKHRhcmdldCBlbmRpYW4pIHZhbHVlIGluIEJVRi4KLSAgIFJldHVybiB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIHJlZ2lzdGVyIG9yIHplcm8gaWYgUkVHTk8gaXMgbm90Ci0gICBhcHBsaWNhYmxlLgotCi0gICBMZWdhY3kgaW1wbGVtZW50YXRpb25zIGlnbm9yZSBMRU5HVEggYW5kIGFsd2F5cyByZXR1cm4gLTEuCi0KLSAgIElmIExFTkdUSCBkb2VzIG5vdCBtYXRjaCB0aGUgc2l6ZSBvZiBSRUdOTyBubyBkYXRhIGlzIHRyYW5zZmVyZWQKLSAgICh0aGUgYWN0dWFsIHJlZ2lzdGVyIHNpemUgaXMgc3RpbGwgcmV0dXJuZWQpLiAqLwotCi1pbnQgc2ltX3N0b3JlX3JlZ2lzdGVyIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgcmVnbm8sIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbmd0aCkpOwotCi0KLS8qIFByaW50IHdoYXRldmVyIHN0YXRpc3RpY3MgdGhlIHNpbXVsYXRvciBoYXMgY29sbGVjdGVkLgotCi0gICBWRVJCT1NFIGlzIGN1cnJlbnRseSB1bnVzZWQgYW5kIG11c3QgYWx3YXlzIGJlIHplcm8uICAqLwotCi12b2lkIHNpbV9pbmZvIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBpbnQgdmVyYm9zZSkpOwotCi0KLS8qIFJ1biAob3IgcmVzdW1lKSB0aGUgc2ltdWxhdGVkIHByb2dyYW0uICAqLwotCi12b2lkIHNpbV9yZXN1bWUgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGludCBzdGVwLCBpbnQgc2lnZ25hbCkpOwotCi0KLS8qIEFzeW5jaHJvbm91cyByZXF1ZXN0IHRvIHN0b3AgdGhlIHNpbXVsYXRpb24uCi0gICBBIG5vbnplcm8gcmV0dXJuIGluZGljYXRlcyB0aGF0IHRoZSBzaW11bGF0b3IgaXMgYWJsZSB0byBoYW5kbGUKLSAgIHRoZSByZXF1ZXN0ICovCi0KLWludCBzaW1fc3RvcCBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0KLS8qIEZldGNoIHRoZSBSRUFTT04gd2h5IHRoZSBwcm9ncmFtIHN0b3BwZWQuCi0KLSAgIFNJTV9FWElURUQ6IFRoZSBwcm9ncmFtIGhhcyB0ZXJtaW5hdGVkLiBTSUdSQyBpbmRpY2F0ZXMgdGhlIHRhcmdldAotICAgZGVwZW5kYW50IGV4aXQgc3RhdHVzLgotCi0gICBTSU1fU1RPUFBFRDogVGhlIHByb2dyYW0gaGFzIHN0b3BwZWQuICBTSUdSQyB1c2VzIHRoZSBob3N0J3Mgc2lnbmFsCi0gICBudW1iZXJpbmcgYXMgYSB3YXkgb2YgaWRlbnRpZnlpbmcgdGhlIHJlYW9uOiBwcm9ncmFtIGludGVycnVwdGVkIGJ5Ci0gICB1c2VyIHZpYSBhIHNpbV9zdG9wIHJlcXVlc3QgKFNJR0lOVCk7IGEgYnJlYWtwb2ludCBpbnN0cnVjdGlvbgotICAgKFNJR1RSQVApOyBhIGNvbXBsZXRlZCBzaW5nbGUgc3RlcCAoU0lHVFJBUCk7IGFuIGludGVybmFsIGVycm9yCi0gICBjb25kaXRpb24gKFNJR0FCUlQpOyBhbiBpbGxlZ2FsIGluc3RydWN0aW9uIChTSUdJTEwpOyBBY2Nlc3MgdG8gYW4KLSAgIHVuZGVmaW5lZCBtZW1vcnkgcmVnaW9uIChTSUdTRUdWKTsgTWlzLWFsaWduZWQgbWVtb3J5IGFjY2VzcwotICAgKFNJR0JVUykuCi0KLSAgIFNJTV9TSUdOQUxMRUQ6IFRoZSBwcm9ncmFtIGhhcyBzdG9wcGVkLiBUaGUgc2ltdWxhdG9yIGhhcwotICAgZW5jb3VudGVyZWQgdGFyZ2V0IGNvZGUgdGhhdCByZXF1aXJlcyB0aGUgKEhPU1QpIHNpZ25hbCBTSUdSQyB0byBiZQotICAgZGVsaXZlcmVkIHRvIHRoZSBzaW11bGF0ZWQgcHJvZ3JhbS4gIEV4OiBga2lsbCAoZ2V0cGlkICgpLAotICAgVEFSR0VUX1NJR3h4eCknLiAgV2hlcmUgVEFSR0VUX1NJR3h4eCBoYXMgYmVlbiB0cmFuc2xhdGVkIGludG8gYQotICAgaG9zdCBzaWduYWwuICBGSVhNRTogVGhpcyBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLi4KLQotICAgU0lNX1JVTk5JTkcsIFNJTV9QT0xMSU5HOiBUaGUgcmV0dXJuIG9mIG9uZSBvZiB0aGVzZSB2YWx1ZXMKLSAgIGluZGljYXRlcyBhIHByb2JsZW0gaW50ZXJuYWwgdG8gdGhlIHNpbXVsYXRvci4gKi8KLQotZW51bSBzaW1fc3RvcCB7IHNpbV9ydW5uaW5nLCBzaW1fcG9sbGluZywgc2ltX2V4aXRlZCwgc2ltX3N0b3BwZWQsIHNpbV9zaWduYWxsZWQgfTsKLQotdm9pZCBzaW1fc3RvcF9yZWFzb24gUEFSQU1TICgoU0lNX0RFU0Mgc2QsIGVudW0gc2ltX3N0b3AgKnJlYXNvbiwgaW50ICpzaWdyYykpOwotCi0KLS8qIFBhc3N0aHJ1IGZvciBvdGhlciBjb21tYW5kcyB0aGF0IHRoZSBzaW11bGF0b3IgbWlnaHQgc3VwcG9ydC4KLSAgIFNpbXVsYXRvcnMgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCBhbnkgY29tYmluYXRpb24gb2YgTlVMTAotICAgb3IgZW1wdHkgQ01ELiAqLwotCi12b2lkIHNpbV9kb19jb21tYW5kIFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBjaGFyICpjbWQpKTsKLQotLyogQ2FsbCB0aGVzZSBmdW5jdGlvbnMgdG8gc2V0IGFuZCBjbGVhciBicmVha3BvaW50cyBhdCBBRERSLiAqLwotCi1TSU1fUkMgc2ltX3NldF9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2NsZWFyX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fY2xlYXJfYWxsX2JyZWFrcG9pbnRzIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLS8qIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBlbmFibGUgYW5kIGRpc2FibGUgYnJlYWtwb2ludHMuICovCi0KLVNJTV9SQyBzaW1fZW5hYmxlX2JyZWFrcG9pbnQgUEFSQU1TICgoU0lNX0RFU0Mgc2QsIFNJTV9BRERSIGFkZHIpKTsKLVNJTV9SQyBzaW1fZGlzYWJsZV9icmVha3BvaW50IFBBUkFNUyAoKFNJTV9ERVNDIHNkLCBTSU1fQUREUiBhZGRyKSk7Ci1TSU1fUkMgc2ltX2VuYWJsZV9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLVNJTV9SQyBzaW1fZGlzYWJsZV9hbGxfYnJlYWtwb2ludHMgUEFSQU1TICgoU0lNX0RFU0Mgc2QpKTsKLQwKLQotLyogUHJvdmlkZSBzaW11bGF0b3Igd2l0aCBhIGRlZmF1bHQgKGdsb2JhbCkgaG9zdF9jYWxsYmFja19zdHJ1Y3QuCi0gICBUSElTIFBST0NFRFVSRSBJUyBERVBSRUNJQVRFRC4KLSAgIEdEQiBhbmQgTlJVTiBkbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlLgotICAgVGhpcyBwcm9jZWR1cmUgZG9lcyBub3QgdGFrZSBhIFNJTV9ERVNDIGFyZ3VtZW50IGFzIGl0IGlzCi0gICB1c2VkIGJlZm9yZSBzaW1fb3Blbi4gKi8KLQotdm9pZCBzaW1fc2V0X2NhbGxiYWNrcyBQQVJBTVMgKChzdHJ1Y3QgaG9zdF9jYWxsYmFja19zdHJ1Y3QgKikpOwotCi0KLS8qIFNldCB0aGUgc2l6ZSBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSBhcnJheS4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi12b2lkIHNpbV9zaXplIFBBUkFNUyAoKGludCBpKSk7Ci0KLQotLyogUnVuIGEgc2ltdWxhdGlvbiB3aXRoIHRyYWNpbmcgZW5hYmxlZC4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi1pbnQgc2ltX3RyYWNlIFBBUkFNUyAoKFNJTV9ERVNDIHNkKSk7Ci0KLQotLyogQ29uZmlndXJlIHRoZSBzaXplIG9mIHRoZSBwcm9maWxlIGJ1ZmZlci4KLSAgIFRISVMgUFJPQ0VEVVJFIElTIERFUFJFQ0lBVEVELgotICAgR0RCIGFuZCBOUlVOIGRvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuCi0gICBUaGlzIHByb2NlZHVyZSBkb2VzIG5vdCB0YWtlIGEgU0lNX0RFU0MgYXJndW1lbnQgYXMgaXQgaXMKLSAgIHVzZWQgYmVmb3JlIHNpbV9vcGVuLiAqLwotCi12b2lkIHNpbV9zZXRfcHJvZmlsZV9zaXplIFBBUkFNUyAoKGludCBuKSk7Ci0KLQotLyogS2lsbCB0aGUgcnVubmluZyBwcm9ncmFtLgotICAgVEhJUyBQUk9DRURVUkUgSVMgREVQUkVDSUFURUQuCi0gICBHREIgYW5kIE5SVU4gZG8gbm90IHVzZSB0aGlzIGludGVyZmFjZS4KLSAgIFRoaXMgcHJvY2VkdXJlIHdpbGwgYmUgcmVwbGFjZWQgYXMgcGFydCBvZiB0aGUgaW50cm9kdWN0aW9uIG9mCi0gICBtdWx0aS1jcHUgc2ltdWxhdG9ycy4gKi8KLQotdm9pZCBzaW1fa2lsbCBQQVJBTVMgKChTSU1fREVTQyBzZCkpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgLyogIWRlZmluZWQgKFJFTU9URV9TSU1fSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3BsYXktdHJlZS5oIGIvaW5jbHVkZS9zcGxheS10cmVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjhmZTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zcGxheS10cmVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyogQSBzcGxheS10cmVlIGRhdGF0eXBlLiAgCi0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBNYXJrIE1pdGNoZWxsIChtYXJrQG1hcmttaXRjaGVsbC5jb20pLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQ0MuCi0gICAKLUdOVSBDQyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZvciBhbiBlYXNpbHkgcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygc3BsYXktdHJlZXMsIHNlZToKLQotICAgICBMZXdpcywgSGFycnkgUi4gYW5kIERlbmVuYmVyZywgTGFycnkuICBEYXRhIFN0cnVjdHVyZXMgYW5kIFRoZWlyCi0gICAgIEFsZ29yaXRobXMuICBIYXJwZXItQ29sbGlucywgSW5jLiAgMTk5MS4gIAotCi0gICBUaGUgbWFqb3IgZmVhdHVyZSBvZiBzcGxheSB0cmVlcyBpcyB0aGF0IGFsbCBiYXNpYyB0cmVlIG9wZXJhdGlvbnMKLSAgIGFyZSBhbW9ydGl6ZWQgTyhsb2cgbikgdGltZSBmb3IgYSB0cmVlIHdpdGggbiBub2Rlcy4gICovCi0KLSNpZm5kZWYgX1NQTEFZX1RSRUVfSAotI2RlZmluZSBfU1BMQVlfVFJFRV9ICi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLS8qIFVzZSB0eXBlZGVmcyBmb3IgdGhlIGtleSBhbmQgZGF0YSB0eXBlcyB0byBmYWNpbGl0YXRlIGNoYW5naW5nCi0gICB0aGVzZSB0eXBlcywgaWYgbmVjZXNzYXJ5LiAgVGhlc2UgdHlwZXMgc2hvdWxkIGJlIHN1ZmZpY2llbnRseSB3aWRlCi0gICB0aGF0IGFueSBwb2ludGVyIG9yIHNjYWxhciBjYW4gYmUgY2FzdCB0byB0aGVzZSB0eXBlcywgYW5kIHRoZW4KLSAgIGNhc3QgYmFjaywgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi4gICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgaW50IHNwbGF5X3RyZWVfa2V5OwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGludCBzcGxheV90cmVlX3ZhbHVlOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGZvciBhIG5vZGUgaW4gdGhlIHRyZWUuICAqLwotdHlwZWRlZiBzdHJ1Y3Qgc3BsYXlfdHJlZV9ub2RlICpzcGxheV90cmVlX25vZGU7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gd2hpY2ggY29tcGFyZXMgdHdvIHNwbGF5LXRyZWUga2V5cy4gIFRoZQotICAgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB2YWx1ZXMgYXMgZm9yIHFzb3J0LiAgKi8KLXR5cGVkZWYgaW50ICgqc3BsYXlfdHJlZV9jb21wYXJlX2ZuKSBQQVJBTVMoKHNwbGF5X3RyZWVfa2V5LCBzcGxheV90cmVlX2tleSkpOwotCi0vKiBUaGUgdHlwZSBvZiBhIGZ1bmN0aW9uIHVzZWQgdG8gZGVhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQKLSAgIHdpdGggdGhlIGtleS4gICovCi10eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2RlbGV0ZV9rZXlfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9rZXkpKTsKLQotLyogVGhlIHR5cGUgb2YgYSBmdW5jdGlvbiB1c2VkIHRvIGRlYWxsb2NhdGUgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkCi0gICB3aXRoIHRoZSB2YWx1ZS4gICovCi10eXBlZGVmIHZvaWQgKCpzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbikgUEFSQU1TKChzcGxheV90cmVlX3ZhbHVlKSk7Ci0KLS8qIFRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHRyZWUuICAqLwotdHlwZWRlZiBpbnQgKCpzcGxheV90cmVlX2ZvcmVhY2hfZm4pIFBBUkFNUygoc3BsYXlfdHJlZV9ub2RlLCB2b2lkKikpOwotCi0vKiBUaGUgbm9kZXMgaW4gdGhlIHNwbGF5IHRyZWUuICAqLwotc3RydWN0IHNwbGF5X3RyZWVfbm9kZQotewotICAvKiBUaGUga2V5LiAgKi8KLSAgc3BsYXlfdHJlZV9rZXkga2V5OwotCi0gIC8qIFRoZSB2YWx1ZS4gICovCi0gIHNwbGF5X3RyZWVfdmFsdWUgdmFsdWU7Ci0KLSAgLyogVGhlIGxlZnQgYW5kIHJpZ2h0IGNoaWxkcmVuLCByZXNwZWN0aXZlbHkuICAqLwotICBzcGxheV90cmVlX25vZGUgbGVmdDsKLSAgc3BsYXlfdHJlZV9ub2RlIHJpZ2h0OwotfTsKLQotLyogVGhlIHNwbGF5IHRyZWUgaXRzZWxmLiAgKi8KLXR5cGVkZWYgc3RydWN0IHNwbGF5X3RyZWUKLXsKLSAgLyogVGhlIHJvb3Qgb2YgdGhlIHRyZWUuICAqLwotICBzcGxheV90cmVlX25vZGUgcm9vdDsKLQotICAvKiBUaGUgY29tcGFyaXNpb24gZnVuY3Rpb24uICAqLwotICBzcGxheV90cmVlX2NvbXBhcmVfZm4gY29tcDsKLQotICAvKiBUaGUgZGVhbGxvY2F0ZS1rZXkgZnVuY3Rpb24uICBOVUxMIGlmIG5vIGNsZWFudXAgaXMgbmVjZXNzYXJ5LiAgKi8KLSAgc3BsYXlfdHJlZV9kZWxldGVfa2V5X2ZuIGRlbGV0ZV9rZXk7Ci0KLSAgLyogVGhlIGRlYWxsb2NhdGUtdmFsdWUgZnVuY3Rpb24uICBOVUxMIGlmIG5vIGNsZWFudXAgaXMgbmVjZXNzYXJ5LiAgKi8KLSAgc3BsYXlfdHJlZV9kZWxldGVfdmFsdWVfZm4gZGVsZXRlX3ZhbHVlOwotfSAqc3BsYXlfdHJlZTsKLQotZXh0ZXJuIHNwbGF5X3RyZWUgc3BsYXlfdHJlZV9uZXcgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZV9jb21wYXJlX2ZuLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbiwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbikpOwotZXh0ZXJuIHZvaWQgc3BsYXlfdHJlZV9kZWxldGUgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSkpOwotZXh0ZXJuIHZvaWQgc3BsYXlfdHJlZV9pbnNlcnQgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX2tleSwKLQkJCQkJICAgICAgICBzcGxheV90cmVlX3ZhbHVlKSk7Ci1leHRlcm4gc3BsYXlfdHJlZV9ub2RlIHNwbGF5X3RyZWVfbG9va3VwICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfa2V5KSk7Ci1leHRlcm4gaW50IHNwbGF5X3RyZWVfZm9yZWFjaCAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfZm9yZWFjaF9mbiwKLQkJCQkJICAgICAgICB2b2lkKikpOwotZXh0ZXJuIGludCBzcGxheV90cmVlX2NvbXBhcmVfaW50cyAgICAgIFBBUkFNUygoc3BsYXlfdHJlZV9rZXksCi0JCQkJCQlzcGxheV90cmVlX2tleSkpOwotZXh0ZXJuIGludCBzcGxheV90cmVlX2NvbXBhcmVfcG9pbnRlcnMgIFBBUkFNUygoc3BsYXlfdHJlZV9rZXksCi0JCQkJCQlzcGxheV90cmVlX2tleSkpOwotCQkJCQkgICAgICAgCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgLyogX1NQTEFZX1RSRUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeW1jYXQuaCBiL2luY2x1ZGUvc3ltY2F0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZWZhZGEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9zeW1jYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIFN5bWJvbCBjb25jYXRlbmF0aW9uIHV0aWxpdGllcy4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk4LCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgU1lNX0NBVF9ICi0jZGVmaW5lIFNZTV9DQVRfSAotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKEFMTU9TVF9TVERDKQotI2RlZmluZSBDT05DQVQyKGEsYikJIGEjI2IKLSNkZWZpbmUgQ09OQ0FUMyhhLGIsYykJIGEjI2IjI2MKLSNkZWZpbmUgQ09OQ0FUNChhLGIsYyxkKSBhIyNiIyNjIyNkCi0jZGVmaW5lIFNUUklOR1gocykgI3MKLSNlbHNlCi0jZGVmaW5lIENPTkNBVDIoYSxiKQkgYS8qKi9iCi0jZGVmaW5lIENPTkNBVDMoYSxiLGMpCSBhLyoqL2IvKiovYwotI2RlZmluZSBDT05DQVQ0KGEsYixjLGQpIGEvKiovYi8qKi9jLyoqL2QKLSNkZWZpbmUgU1RSSU5HWChzKSAiPyIKLSNlbmRpZgotCi0jZGVmaW5lIFhDT05DQVQyKGEsYikgICAgIENPTkNBVDIoYSxiKQotI2RlZmluZSBYQ09OQ0FUMyhhLGIsYykgICBDT05DQVQzKGEsYixjKQotI2RlZmluZSBYQ09OQ0FUNChhLGIsYyxkKSBDT05DQVQ0KGEsYixjLGQpCi0KLSNkZWZpbmUgWFNUUklORyhzKSBTVFJJTkdYKHMpIAotCi0jZW5kaWYgU1lNX0NBVF9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3dhaXQuaCBiL2luY2x1ZGUvd2FpdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNjOWNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvd2FpdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyogRGVmaW5lIGhvdyB0byBhY2Nlc3MgdGhlIGludCB0aGF0IHRoZSB3YWl0IHN5c3RlbSBjYWxsIHN0b3Jlcy4KLSAgIFRoaXMgaGFzIGJlZW4gY29tcGF0aWJsZSBpbiBhbGwgVW5peCBzeXN0ZW1zIHNpbmNlIHRpbWUgaW1tZW1vcmlhbCwKLSAgIGJ1dCB2YXJpb3VzIHdlbGwtbWVhbmluZyBwZW9wbGUgaGF2ZSBkZWZpbmVkIHZhcmlvdXMgZGlmZmVyZW50Ci0gICB3b3JkcyBmb3IgdGhlIHNhbWUgb2xkIGJpdHMgaW4gdGhlIHNhbWUgb2xkIGludCAoc29tZXRpbWVzIGNsYWltZWQKLSAgIHRvIGJlIGEgc3RydWN0KS4gIFdlIGp1c3Qga25vdyBpdCdzIGFuIGludCBhbmQgd2UgdXNlIHRoZXNlIG1hY3JvcwotICAgdG8gYWNjZXNzIHRoZSBiaXRzLiAgKi8KLQotLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlZmluZWQgZXF1aXZhbGVudGx5IHRvIHRoZWlyIGRlZmluaXRpb25zCi0gICBpbiBQT1NJWC4xLiAgV2UgZmFpbCB0byBkZWZpbmUgV05PSEFORyBhbmQgV1VOVFJBQ0VELCB3aGljaCBQT1NJWC4xCi0gICA8c3lzL3dhaXQuaD4gZGVmaW5lcywgc2luY2Ugb3VyIGNvZGUgZG9lcyBub3QgdXNlIHdhaXRwaWQoKS4gIFdlCi0gICBhbHNvIGZhaWwgdG8gZGVjbGFyZSB3YWl0KCkgYW5kIHdhaXRwaWQoKS4gICovICAgCi0KLSNpZm5kZWYJV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRCh3KQkoKCh3KSYwMzc3KSA9PSAwKQotI2VuZGlmCi0KLSNpZm5kZWYJV0lGU0lHTkFMRUQKLSNkZWZpbmUgV0lGU0lHTkFMRUQodykJKCgodykmMDM3NykgIT0gMDE3NyAmJiAoKHcpJn4wMzc3KSA9PSAwKQotI2VuZGlmCi0KLSNpZm5kZWYJV0lGU1RPUFBFRAotI2lmZGVmIElCTTYwMDAKLQotLyogVW5mb3J0dW5hdGVseSwgdGhlIGFib3ZlIGNvbW1lbnQgKGFib3V0IGJlaW5nIGNvbXBhdGlibGUgaW4gYWxsIFVuaXggCi0gICBzeXN0ZW1zKSBpcyBub3QgcXVpdGUgY29ycmVjdCBmb3IgQUlYLCBzaWdoLiAgQW5kIEFJWCAzLjIgY2FuIGdlbmVyYXRlCi0gICBzdGF0dXMgd29yZHMgbGlrZSAweDU3YyAoc2lndHJhcCByZWNlaXZlZCBhZnRlciBsb2FkKSwgYW5kIGdkYiB3b3VsZAotICAgY2hva2Ugb24gaXQuICovCi0KLSNkZWZpbmUgV0lGU1RPUFBFRCh3KQkoKHcpJjB4NDApCi0KLSNlbHNlCi0jZGVmaW5lIFdJRlNUT1BQRUQodykJKCgodykmMDM3NykgPT0gMDE3NykKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYJV0VYSVRTVEFUVVMKLSNkZWZpbmUgV0VYSVRTVEFUVVModykJKCgodykgPj4gOCkgJiAwMzc3KSAvKiBzYW1lIGFzIFdSRVRDT0RFICovCi0jZW5kaWYKLQotI2lmbmRlZglXVEVSTVNJRwotI2RlZmluZSBXVEVSTVNJRyh3KQkoKHcpICYgMDE3NykKLSNlbmRpZgotCi0jaWZuZGVmCVdTVE9QU0lHCi0jZGVmaW5lIFdTVE9QU0lHCVdFWElUU1RBVFVTCi0jZW5kaWYKLQotLyogVGhlc2UgYXJlIG5vdCBkZWZpbmVkIGluIFBPU0lYLCBidXQgYXJlIHVzZWQgYnkgb3VyIHByb2dyYW1zLiAgKi8KLQotI2RlZmluZSBXQUlUVFlQRQlpbnQKLQotI2lmbmRlZglXQ09SRURVTVAKLSNkZWZpbmUgV0NPUkVEVU1QKHcpCSgoKHcpJjAyMDApICE9IDApCi0jZW5kaWYKLQotI2lmbmRlZglXU0VURVhJVAotI2RlZmluZSBXU0VURVhJVCh3LHN0YXR1cykgKCh3KSA9ICgwIHwgKChzdGF0dXMpIDw8IDgpKSkKLSNlbmRpZgotCi0jaWZuZGVmCVdTRVRTVE9QCi0jZGVmaW5lIFdTRVRTVE9QKHcsc2lnKQkgICAoKHcpID0gKDAxNzcgfCAoKHNpZykgPDwgOCkpKQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2luc3RhbGwtc2ggYi9pbnN0YWxsLXNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlOWRlMjM4Li4wMDAwMDAwCi0tLSBhL2luc3RhbGwtc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQotIyBUaGlzIGNvbWVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCkuCi0jCi0jIENvcHlyaWdodCAxOTkxIGJ5IHRoZSBNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5Ci0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cwotIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAotIyB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZwotIyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBNLkkuVC4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKLSMgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAotIyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBNLkkuVC4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQotIyBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIKLSMgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0jCi0jIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50Ci0jIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0Ci0jIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCi0jCi0jIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KLSMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KLSMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCi0KLQotIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0Ci0KLSMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KLWRvaXQ9IiR7RE9JVFBST0ctfSIKLQotCi0jIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KLQotbXZwcm9nPSIke01WUFJPRy1tdn0iCi1jcHByb2c9IiR7Q1BQUk9HLWNwfSIKLWNobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgotY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCi1jaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKLXN0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igotcm1wcm9nPSIke1JNUFJPRy1ybX0iCi1ta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKLQotdHJhbnNmb3JtYmFzZW5hbWU9IiIKLXRyYW5zZm9ybV9hcmc9IiIKLWluc3RjbWQ9IiRtdnByb2ciCi1jaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgotY2hvd25jbWQ9IiIKLWNoZ3JwY21kPSIiCi1zdHJpcGNtZD0iIgotcm1jbWQ9IiRybXByb2cgLWYiCi1tdmNtZD0iJG12cHJvZyIKLXNyYz0iIgotZHN0PSIiCi1kaXJfYXJnPSIiCi0KLXdoaWxlIFsgeCIkMSIgIT0geCBdOyBkbwotICAgIGNhc2UgJDEgaW4KLQktYykgaW5zdGNtZD0iJGNwcHJvZyIKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWQpIGRpcl9hcmc9dHJ1ZQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktbSkgY2htb2RjbWQ9IiRjaG1vZHByb2cgJDIiCi0JICAgIHNoaWZ0Ci0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1vKSBjaG93bmNtZD0iJGNob3ducHJvZyAkMiIKLQkgICAgc2hpZnQKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JLWcpIGNoZ3JwY21kPSIkY2hncnBwcm9nICQyIgotCSAgICBzaGlmdAotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0KLQktcykgc3RyaXBjbWQ9IiRzdHJpcHByb2ciCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCi0JICAgIHNoaWZ0Ci0JICAgIGNvbnRpbnVlOzsKLQotCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKLQkgICAgc2hpZnQKLQkgICAgY29udGludWU7OwotCi0JKikgIGlmIFsgeCIkc3JjIiA9IHggXQotCSAgICB0aGVuCi0JCXNyYz0kMQotCSAgICBlbHNlCi0JCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZwotCQk6Ci0JCWRzdD0kMQotCSAgICBmaQotCSAgICBzaGlmdAotCSAgICBjb250aW51ZTs7Ci0gICAgZXNhYwotZG9uZQotCi1pZiBbIHgiJHNyYyIgPSB4IF0KLXRoZW4KLQllY2hvICJpbnN0YWxsOglubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIKLQlleGl0IDEKLWVsc2UKLQl0cnVlCi1maQotCi1pZiBbIHgiJGRpcl9hcmciICE9IHggXTsgdGhlbgotCWRzdD0kc3JjCi0Jc3JjPSIiCi0JCi0JaWYgWyAtZCAkZHN0IF07IHRoZW4KLQkJaW5zdGNtZD06Ci0JCWNobW9kY21kPSIiCi0JZWxzZQotCQlpbnN0Y21kPW1rZGlyCi0JZmkKLWVsc2UKLQotIyBXYWl0aW5nIGZvciB0aGlzIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSAiJGluc3RjbWQgJHNyYyAkZHN0dG1wIiBjb21tYW5kCi0jIG1pZ2h0IGNhdXNlIGRpcmVjdG9yaWVzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdvdWxkIGJlIGVzcGVjaWFsbHkgYmFkIAotIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCi0KLQlpZiBbIC1mICRzcmMgLW8gLWQgJHNyYyBdCi0JdGhlbgotCQl0cnVlCi0JZWxzZQotCQllY2hvICJpbnN0YWxsOiAgJHNyYyBkb2VzIG5vdCBleGlzdCIKLQkJZXhpdCAxCi0JZmkKLQkKLQlpZiBbIHgiJGRzdCIgPSB4IF0KLQl0aGVuCi0JCWVjaG8gImluc3RhbGw6CW5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIKLQkJZXhpdCAxCi0JZWxzZQotCQl0cnVlCi0JZmkKLQotIyBJZiBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSwgYXBwZW5kIHRoZSBpbnB1dCBmaWxlbmFtZTsgaWYgeW91ciBzeXN0ZW0KLSMgZG9lcyBub3QgbGlrZSBkb3VibGUgc2xhc2hlcyBpbiBmaWxlbmFtZXMsIHlvdSBtYXkgbmVlZCB0byBhZGQgc29tZSBsb2dpYwotCi0JaWYgWyAtZCAkZHN0IF0KLQl0aGVuCi0JCWRzdD0iJGRzdCIvYGJhc2VuYW1lICRzcmNgCi0JZWxzZQotCQl0cnVlCi0JZmkKLWZpCi0KLSMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAotZHN0ZGlyPWBlY2hvICRkc3QgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAotCi0jIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgotIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0Ci0KLSMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCi1pZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KLWRlZmF1bHRJRlM9JwkKLScKLUlGUz0iJHtJRlMtJHtkZWZhdWx0SUZTfX0iCi0KLW9JRlM9IiR7SUZTfSIKLSMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCi1JRlM9JyUnCi1zZXQgLSBgZWNobyAke2RzdGRpcn0gfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKLUlGUz0iJHtvSUZTfSIKLQotcGF0aGNvbXA9JycKLQotd2hpbGUgWyAkIyAtbmUgMCBdIDsgZG8KLQlwYXRoY29tcD0iJHtwYXRoY29tcH0kezF9IgotCXNoaWZ0Ci0KLQlpZiBbICEgLWQgIiR7cGF0aGNvbXB9IiBdIDsKLSAgICAgICAgdGhlbgotCQkkbWtkaXJwcm9nICIke3BhdGhjb21wfSIKLQllbHNlCi0JCXRydWUKLQlmaQotCi0JcGF0aGNvbXA9IiR7cGF0aGNvbXB9LyIKLWRvbmUKLWZpCi0KLWlmIFsgeCIkZGlyX2FyZyIgIT0geCBdCi10aGVuCi0JJGRvaXQgJGluc3RjbWQgJGRzdCAmJgotCi0JaWYgWyB4IiRjaG93bmNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG93bmNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKLQlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCi0JaWYgWyB4IiRjaG1vZGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaG1vZGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaQotZWxzZQotCi0jIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KLQotCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXSAKLQl0aGVuCi0JCWRzdGZpbGU9YGJhc2VuYW1lICRkc3RgCi0JZWxzZQotCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0ICR0cmFuc2Zvcm1iYXNlbmFtZSB8IAotCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCi0JZmkKLQotIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCi0KLQlpZiBbIHgiJGRzdGZpbGUiID0geCBdIAotCXRoZW4KLQkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKLQllbHNlCi0JCXRydWUKLQlmaQotCi0jIE1ha2UgYSB0ZW1wIGZpbGUgbmFtZSBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KLQotCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIwotCi0jIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKLQotCSRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCAmJgotCi0JdHJhcCAicm0gLWYgJHtkc3R0bXB9IiAwICYmCi0KLSMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cwotCi0jIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCi0jIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKLSMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCi0KLQlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCi0JaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKLQlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgotCi0jIE5vdyByZW5hbWUgdGhlIGZpbGUgdG8gdGhlIHJlYWwgZGVzdGluYXRpb24uCi0KLQkkZG9pdCAkcm1jbWQgLWYgJGRzdGRpci8kZHN0ZmlsZSAmJgotCSRkb2l0ICRtdmNtZCAkZHN0dG1wICRkc3RkaXIvJGRzdGZpbGUgCi0KLWZpICYmCi0KLQotZXhpdCAwCmRpZmYgLS1naXQgYS9pbnRsL0NoYW5nZUxvZyBiL2ludGwvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2ZmNmY2Li4wMDAwMDAwCi0tLSBhL2ludGwvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMiArMCwwIEBACi0xOTk3LTA5LTA2IDAyOjEwICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaW50bGguaW5zdC5pbjogUmVmb3JtYXQgY29weXJpZ2h0LgotCi0xOTk3LTA4LTE5IDE1OjIyICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IFJlbW92ZSB3cm9uZyBjb21tZW50LgotCi0xOTk3LTA4LTE2IDAwOjEzICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtZGF0YSk6IERvbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gaW5zdGFsbC4KLQotMTk5Ny0wOC0wMSAxNDozMCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGNhdC1jb21wYXQuYzogRml4IGNvcHlyaWdodC4KLQotCSogbG9jYWxlYWxpYXMuYzogRG9uJ3QgZGVmaW5lIHN0cmNociB1bmxlc3MgIUhBVkVfU1RSQ0hSLgotCi0JKiBsb2FkbXNnY2F0LmM6IFVwZGF0ZSBjb3B5cmlnaHQuICBGaXggdHlwb3MuCi0KLQkqIGwxMG5mbGlzdC5jOiBEb24ndCBkZWZpbmUgc3RyY2hyIHVubGVzcyAhSEFWRV9TVFJDSFIuCi0JKF9ubF9tYWtlX2wxMG5mbGlzdCk6IEhhbmRsZSBzcG9uc29yIGFuZCByZXZpc2lvbiBjb3JyZWN0bHkuCi0KLQkqIGdldHRleHQuYzogVXBkYXRlIGNvcHlyaWdodC4KLQkqIGdldHRleHQuaDogTGlrZXdpc2UuCi0JKiBoYXNoLXN0cmluZy5oOiBMaWtld2lzZS4KLQotCSogZmluZGRvbWFpbi5jOiBSZW1vYXZlIGRlYWQgY29kZS4gIERlZmluZSBzdHJjaHIgb25seSBpZgotCSFIQVZFX1NUUkNIUi4KLQotCSogZXhwbG9kZW5hbWUuYzogSW5jbHVkZSA8c3lzL3R5cGVzLmg+LgotCi0JKiBleHBsb2RlbmFtZS5jOiBSZWZvcm1hdCBjb3B5cmlnaHQgdGV4dC4KLQkoX25sX2V4cGxvZGVfbmFtZSk6IEZpeCB0eXBvLgotCi0JKiBkY2dldHRleHQuYzogRGVmaW5lIGFuZCB1c2UgX19zZXRfZXJybm8uCi0JKGd1ZXNzX2NhdGVnb3J5X3ZhbHVlKTogRG9uJ3QgdXNlIHNldGxvY2FsZSBpZiBIQVZFX0xDX01FU1NBR0VTIGlzCi0Jbm90IGRlZmluZWQuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IFByZXR0eSBwcmludGluZy4KLQotMTk5Ny0wNS0wMSAwMjoyNSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jIChndWVzc19jYXRlZ29yeV92YWx1ZSk6IERvbid0IGRlcGVuZCBvbgotCUhBVkVfTENfTUVTU0FHRVMuICBXZSBkb24ndCBuZWVkIHRoZSBtYWNybyBoZXJlLgotCVBhdGNoIGJ5IEJydW5vIEhhaWJsZSA8aGFpYmxlQGlsb2cuZnI+LgotCi0JKiBjYXQtY29tcGF0LmMgKHRleHRkb21haW4pOiBEb04ndCByZWZlciB0byBIQVZFX1NFVExPQ0FMRV9OVUxMCi0JbWFjcm8uICBJbnN0ZWFkIHVzZSBIQVZFX0xPQ0FMRV9OVUxMIGFuZCBkZWZpbmUgaXQgd2hlbiB1c2luZwotCWdsaWJjLCBhcyBpbiBkY2dldHRleHQuYy4KLQlQYXRjaCBieSBCcnVubyBIYWlibGUgPGhhaWJsZUBpbG9nLmZyPi4KLQotCSogTWFrZWZpbGUuaW4gKENQUEZMQUdTKTogTmV3IHZhcmlhYmxlLiAgUmVwb3J0ZWQgYnkgRnJhbmMsb2lzCi0JUGluYXJkLgotCi1Nb24gTWFyIDEwIDA2OjUxOjE3IDE5OTcgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogSW1wbGVtZW50IGhhbmRsaW5nIG9mIGxpYnRvb2wuCi0KLQkqIGdldHRleHRQLmg6IENoYW5nZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHVzZSBvZiBnZW5lcmljIGxvd2xldmVsCi0JaTE4biBmaWxlIGhhbmRsaW5nLgotCi1XZWQgRGVjICA0IDIwOjIxOjE4IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiB0ZXh0ZG9tYWluLmM6IFB1dCBwYXJlbnRoZXNlcyBhcm91bmQgYXJndW1lbnRzIG9mIG1lbWNweSBtYWNybwotCWRlZmluaXRpb24uCi0JKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KLQkqIGwxMG5mbGlzdC5jOiBMaWtld2lzZS4KLQkqIGZpbmRkb21haW4uYzogTGlrZXdpc2UuCi0JKiBiaW5kdGV4dGRvbS5jOiBMaWtld2lzZS4KLQlSZXBvcnRlZCBieSBUaG9tYXMgRXNrZW4uCi0KLU1vbiBOb3YgMjUgMjI6NTc6NTEgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIHRleHRkb21haW4uYzogTW92ZSBkZWZpbml0aW9uIG9mIGBtZW1jcHlgIG1hY3JvIHRvIHJpZ2h0Ci0JcG9zaXRpb24uCi0KLUZyaSBOb3YgMjIgMDQ6MDE6NTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGZpbmRkb21haW4uYyBbIUhBVkVfU1RSSU5HX0ggJiYgIV9MSUJDXTogRGVmaW5lIG1lbWNweSB1c2luZwotIAliY29weSBpZiBub3QgYWxyZWFkeSBkZWZpbmVkLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIEVza2VuLgotCSogYmluZHRleHRkb20uYzogTGlrZXdpc2UuCi0JKiBsMTBuZmxpc3QuYzogTGlrZXdpc2UuCi0JKiBsb2NhbGVhbGlhcy5jOiBMaWtld2lzZS4KLQkqIHRleHRkb21haW4uYzogTGlrZXdpc2UuCi0KLVR1ZSBPY3QgMjkgMTE6MTA6MjcgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsaWJkaXIpOiBDaGFuZ2UgdG8gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YKLSAJcHJlZml4LiAgUmVwb3J0ZWQgYnkgS251dC1I5XZhcmRBa3NuZXMgPGV0b2tuYUBldG8uZXJpY3Nzb24uc2U+LgotCi1TYXQgQXVnIDMxIDAzOjA3OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYyAoX25sX25vcm1hbGl6ZV9jb2Rlc2V0KTogV2UgY29udmVydCB0byBsb3dlciBjYXNlLAotCXNvIGRvbid0IHByZXBlbmQgdXBwZXJjYXNlIGBJU08nIGZvciBvbmx5IG51bWVyaWMgYXJnLgotCi1GcmkgSnVsIDE5IDAwOjE1OjQ2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYzogTW92ZSBpbmNsdXNpb24gb2YgYXJnei5oLCBjdHlwZS5oLCBzdGRsaWIuaCBhZnRlcgotCWRlZmluaXRpb24gb2YgX0dOVV9TT1VSQ0UuICBQYXRjaCBieSBSb2xhbmQgTWNHcmF0aC4KLQotCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IEZpeCBhbm90aGVyIGJ1ZyB3aXRoIGBmb3InIGxvb3AgYW5kCi0JZW1wdHkgYXJndW1lbnRzLiAgUGF0Y2ggYnkgSmltIE1leWVyaW5nLiAgQ29ycmVjdCBuYW1lIG9zCi0JdW5pbnN0YWxsZWQgZmlsZXM6IG5vIGludGwtIHByZWZpeCBhbnltb3JlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1kYXRhKTogQWdhaW4gd29yayBhcm91bmQgc2hlbGxzIHdoaWNoCi0JY2Fubm90IGhhbmRsZSBtcHR5IGZvciBsaXN0LiAgUmVwb3J0ZWQgYnkgSmltIE1leWVyaW5nLgotCi1TYXQgSnVsIDEzIDE4OjExOjM1IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFNwbGl0IGdvYWwuICBOb3cgZGVwZW5kIG9uIGluc3RhbGwtZXhlYwotICAgICAgICBhbmQgaW5zdGFsbC1kYXRhLgotCShpbnN0YWxsLWV4ZWMsIGluc3RhbGwtZGF0YSk6IE5ldyBnb2Fscy4gIENyZWF0ZWQgZnJvbSBmb3JtZXIKLQlpbnN0YWxsIGdvYWwuCi0JUmVwb3J0ZWQgYnkgS2FybCBCZXJyeS4KLQotU2F0IEp1biAyMiAwNDo1ODoxNCAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1LSU5TVEFMTERJUlMpOiBOZXcgdmFyaWFibGUuICBQYXRoIHRvCi0gICAgICAgIG1raW5zdGFsbGRpcnMgc2NyaXB0LgotCShpbnN0YWxsKTogdXNlIE1LSU5TVEFMTERJUlMgdmFyaWFibGUgb3IgaWYgdGhlIHNjcmlwdCBpcyBub3QgcHJlc2VudAotCXRyeSB0byBmaW5kIGl0IGluIHRoZSAkdG9wX3NjcmRpcikuCi0KLVdlZCBKdW4gMTkgMDI6NTY6NTYgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGwxMG5mbGlzdC5jOiBMaW51eCBsaWJjICpwYXJ0bHkqIGluY2x1ZGVzIHRoZSBhcmd6XyogZnVuY3Rpb25zLgotCUdyci4gIFdvcmsgYXJvdW5kIGJ5IHJlbmFtaW5nIHRoZSBzdGF0aWMgdmVyc2lvbiBhbmQgdXNlIG1hY3JvcwotCWZvciByZW5hbWluZy4KLQotVHVlIEp1biAxOCAyMDoxMToxNyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgcHJlc2VuY2UgdGVzdCBtYWNyb3Mgb2YgX19hcmd6XyogZnVuY3Rpb25zLgotCi0JKiBsMTBuZmxpc3QuYzogSW5jbHVkZSA8YXJnei5oPiBiYXNlZCBvbiB0ZXN0IG9mIGl0IGluc3RlYWQgd2hlbgotCV9fYXJnel8qIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlLgotCVJlcG9ydGVkIGJ5IEFuZHJlYXMgU2Nod2FiLgotCi1UaHUgSnVuIDEzIDE1OjE3OjQ0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBleHBsb2RlbmFtZS5jLCBsMTBuZmxpc3QuYzogRGVmaW5lIE5VTEwgZm9yIGR1bWIgc3lzdGVtcy4KLQotVHVlIEp1biAxMSAxNzowNToxMyAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogaW50bGguaW5zdC5pbiwgbGliZ2V0dGV4dC5oIChkY2dldHRleHQpOiBSZW5hbWUgbG9jYWwgdmFyaWFibGUKLQlyZXN1bHQgdG8gX19yZXN1bHQgdG8gcHJldmVudCBuYW1lIGNsYXNoLgotCi0JKiBsMTBuZmxpc3QuYywgbG9jYWxlYWxpYXMuYywgZGNnZXR0ZXh0LmM6IERlZmluZSBfR05VX1NPVVJDRSB0bwotICAgICAgICBnZXQgcHJvdG90eXBlIGZvciBzdHBjcHkgYW5kIHN0cmNhc2VjbXAuCi0KLQkqIGludGxoLmluc3QuaW4sIGxpYmdldHRleHQuaDogTW92ZSBkZWNsYXJhdGlvbiBvZgotCWBfbmxfbXNnX2NhdF9jbnRyJyBvdXRzaWRlIF9fZXh0ZW5zaW9uX18gYmxvY2sgdG8gcHJldmVudCB3YXJuaW5nCi0JZnJvbSBnY2MncyAtV25lc3RlZC1leHRlcm4gb3B0aW9uLgotCi1GcmkgSnVuICA3IDAxOjU4OjAwIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlbW92ZSBjb21tZW50LgotCi1UaHUgSnVuICA2IDE3OjI4OjE3IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFdvcmsgYXJvdW5kIGZvciBhbm90aGVyIEJ1Z2xpeCBzdHVwaWRpdHkuCi0JQWx3YXlzIHVzZSBhbiBgZWxzZScgY2xvc2UgZm9yIGBpZidzLiAgUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW50bGguaW5zdCk6IENvcnJlY3QgdHlwbyBpbiBwaG9ueSBydWxlLgotCVJlcG9ydGVkIGJ5IE5lbHNvbiBCZWViZS4KLQotVGh1IEp1biAgNiAwMTo0OTo1MiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogZGNnZXR0ZXh0LmMgKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJpYWJsZSBhbGxvY2FfbGlzdCB0bwotCWJsb2NrX2xpc3QgYXMgdGhlIG1hY3JvIGNhbGxzIGFzc3VtZS4KLQlQYXRjaCBieSBFcmljIEJhY2t1cy4KLQotCSogbG9jYWxlYWxpYXMuYyBbIUhBVkVfQUxMT0NBXTogRGVmaW5lIGFsbG9jYSBhcyBtYWNybyB1c2luZwotICAgICAgICBtYWxsb2MuCi0JKHJlYWRfYWxpYXNfZmlsZSk6IFJlbmFtZSB2YXJyaWFiZSBhbGxvY2FfbGlzdCB0byBibG9ja19saXN0IGFzIHRoZQotCW1hY3JvIGNhbGxzIGFzc3VtZS4KLQlQYXRjaCBieSBFcmljIEJhY2t1cy4KLQotCSogbDEwbmZsaXN0LmM6IENvcnJlY3QgY29uZGl0aW9uYWwgZm9yIDxhcmd6Lmg+IGluY2x1c2lvbi4KLQlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCBvbiBhbGwtQFVTRV9JTkNMVURFRF9MSUJJTlRMQCwgbm90Ci0gICAgICAgIGFsbC1AVVNFX05MU0AuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaW50bGguaW5zdCBjb21lcyBmcm9tIGxvY2FsIGRpciwgbm90Ci0gICAgICAgICQoc3JjZGlyKS4KLQotCSogTWFrZWZpbGUuaW4gKGludGxoLmluc3QpOiBTcGVjaWFsIGhhbmRsaW5nIG9mIHRoaXMgZ29hbC4gIElmCi0JdXNlZCBpbiBnZXR0ZXh0LCB0aGlzIGlzIHJlYWxseSBhIHJ1bCB0byBjb25zdHJ1Y3QgdGhpcyBmaWxlLiAgSWYKLQl1c2VkIGluIGFueSBvdGhlciBwYWNrYWdlIGl0IGlzIGRlZmluZWQgYXMgYSAuUEhPTlkgcnVsZSB3aXRoCi0JZW1wdHkgYm9keS4KLQotCSogZmluZGRvbWFpbi5jOiBFeHRyYWN0IGxvY2FsZSBmaWxlIGluZm9ybWF0aW9uIGhhbmRsaW5nIGludG8KLQlsMTBuZmlsZS5jLiAgUmVuYW1lIGxvY2FsIHN0cGNweV9fIGZ1bmN0aW9uIHRvIHN0cGNweS4KLQotCSogZGNnZXR0ZXh0LmMgKHN0cGNweSk6IEFkZCBsb2NhbCBkZWZpbml0aW9uLgotCi0JKiBsMTBuZmxpc3QuYzogU29sdmUgc29tZSBwb3J0YWJpbGl0eSBwcm9ibGVtcy4gIFBhdGNoZXMgcGFydGx5IGJ5Ci0JVGhvbWFzIEVza2VuLiAgQWRkIGxvY2FsIGRlZmluaXRpb24gb2Ygc3RwY3B5LgotCi1UdWUgSnVuICA0IDAyOjQ3OjQ5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBpbnRsaC5pbnN0LmluOiBEb24ndCBkZXBlbmQgaW5jbHVkaW5nIDxsb2NhbGUuaD4gb24KLQlIQVZFX0xPQ0FMRV9ILiAgSW5zdGVhZCBjb25maWd1cmUgbXVzdCByZXdyaXRlIHRoaXMgZmlpbGUKLQlkZXBlbmRpbmcgb24gdGhlIHJlc3VsdCBvZiB0aGUgY29uZmlndXJlIHJ1bi4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBsaWJpbnRsLmluc3QgaXMgbm93IGNhbGxlZCBpbnRsaC5pbnN0LgotCUFkZCBydWxlcyBmb3IgdXBkYXRpbmcgaW50bGguaW5zdCBmcm9tIGludGxoLmluc3QuaW4uCi0KLQkqIGxpYmludGwuaW5zdDogUmVuYW1lZCB0byBpbnRsaC5pbnN0LmluLgotCi0JKiBsb2NhbGVhbGlhcy5jLCBkY2dldHRleHQuYyBbX19HTlVDX19dOiBEZWZpbmUgSEFWRV9BTExPQ0EgdG8gMQotICAgICAgICBiZWNhdXNlIGdjYyBoYXMgX19idWl0bGluX2FsbG9jYS4KLQlSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotTW9uIEp1biAgMyAwMDozMjoxNiAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxjaGVjayk6IE5ldyBnb2FsIHRvIGZ1bGZpbGwgbmVlZHMgb2YKLSAgICAgICAgYXV0b21ha2UncyBkaXN0Y2hlY2suCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogUmVvcmRlciBjb21tYW5kcyBzbyB0aGF0IFZFUlNJT04gaXMKLSAgICAgICAgZm91bmQuCi0KLQkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKTogTm93IHVzZSBzdWJkaXJlY3RvcnkgaW50bC8gaW4KLSAgICAgICAgQGRhdGFkaXJAL2dldHRleHQuCi0JKENPTVNSQ1MpOiBBZGQgbDEwbmZpbGUuYy4KLQkoT0JKRUNUUyk6IEFkZCBsMTBuZmlsZS5vLgotCShESVNURklMRVMpOiBSZW5hbWUgdG8gRElTVEZJTEUubm9ybWFsLiAgUmVtb3ZlICQoRElTVEZJTEVTLmNvbW1vbikuCi0JKERJU1RGSUxFLmdldHRleHQpOiBSZW1vdmUgJChESVNURklMRVMuY29tbW9uKS4KLQkoYWxsLWdldHRleHQpOiBSZW1vdmUgZ29hbC4KLQkoaW5zdGFsbCk6IElmICQoUEFDS0FHRSkgPSBnZXR0ZXh0IGluc3RhbGwsIG90aGVyd29zZSBkbyBub3RoaW5nLiAgTm8KLQlwYWNrYWdlIGJ1dCBnZXR0ZXh0IGl0c2VsZiBzaG91bGQgaW5zdGFsbCBsaWJpbnRsLmggKyBoZWFkZXJzLgotCShkaXN0KTogRXh0ZW5kIGdvYWwgdG8gd29yayBmb3IgZ2V0dGV4dCwgdG9vLgotCShkaXN0LWdldHRleHQpOiBSZW1vdmUgZ29hbC4KLQotCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IERlZmluZSBtYWNybyBhbGxvY2EgYnkgdXNpbmcgbWFsbG9jLgotCi1TdW4gSnVuICAyIDE3OjMzOjA2IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsb2FkbXNnY2F0LmMgKF9ubF9sb2FkX2RvbWFpbik6IFBhcmFtZXRlciBpcyBub3cgY29tZXMgZnJvbQotICAgICAgICBmaW5kX2wxMG5maWxlLgotCi1TYXQgSnVuICAxIDAyOjIzOjAzIDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBjeWdudXMuY29tPgotCi0JKiBsMTBuZmxpc3QuYyAoX19hcmd6X25leHQpOiBBZGQgZGVmaW5pdGlvbi4KLQotCSogZGNnZXR0ZXh0LmMgWyFIQVZFX0FMTE9DQV06IEFkZCBjb2RlIGZvciBoYW5kbGluZyBtaXNzaW5nIGFsbG9jYQotCWNvZGUuICBVc2UgbmV3IGwxMG5maWxlIGhhbmRsaW5nLgotCi0JKiBsb2NhbGVhbGlhcy5jIFshSEFWRV9BTExPQ0FdOiBBZGQgY29kZSBmb3IgaGFuZGxpbmcgbWlzc2luZwotICAgICAgICBhbGxvY2EgY29kZS4KLQotCSogbDEwbmZsaXN0LmM6IEluaXRpYWwgcmV2aXNpb24uCi0KLVR1ZSBBcHIgIDIgMTg6NTE6MTggMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1nZXR0ZXh0KTogTmV3IGdvYWwuICBTYW1lIGFzIGFsbC15ZXMuCi0KLVRodSBNYXIgMjggMjM6MDE6MjIgMTk5NiAgS2FybCBFaWNod2FsZGVyICA8a2VAa2UuY2VudHJhbC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGdldHRleHRzcmNkaXIpOiBEZWZpbmUgdXNpbmcgQGRhdGFkaXJALgotCi1UdWUgTWFyIDI2IDEyOjM5OjE0IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYzogSW5jbHVkZSA8Y3R5cGUuaD4uICBSZXBvcnRlZCBieSBSb2xhbmQgTWNHcmF0aC4KLQotU2F0IE1hciAyMyAwMjowMDozNSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBmaW5kZG9tYWluLmMgKHN0cGNweSk6IFJlbmFtZSB0byBzdHBjcHlfXyB0byBwcmV2ZW50IGNsYXNoaW5nCi0gICAgICAgIHdpdGggZXh0ZXJuYWwgZGVjbGFyYXRpb24uCi0KLVNhdCBNYXIgIDIgMDA6NDc6MDkgMTk5NiAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbC1ubyk6IFJlbmFtZSBmcm9tIGFsbF9uby4KLQotU2F0IEZlYiAxNyAwMDoyNTo1OSAxOTk2ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBnZXR0ZXh0UC5oIFtsb2FkZWRfZG9tYWluXTogQXJyYXkgYHN1Y2Nlc3NvcicgbXVzdCBub3cgY29udGFpbiB1cAotICAgICAgICB0byA2MyBlbGVtZW50cyAoYmVjYXVzZSBvZiBjb2Rlc2V0IG5hbWUgbm9ybWFsaXphdGlvbikuCi0KLQkqIGZpbmRkb21haW4uYzogSW1wbGVtZW50IGNvZGVzZXQgbmFtZSBub3JtYWxpemF0aW9uLgotCi1UaHUgRmViIDE1IDA0OjM5OjA5IDE5OTYgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChhbGwpOiBEZWZpbmUgdG8gYGFsbC1AVVNFX05MU0AnLgotCShhbGwteWVzLCBhbGxfbm8pOiBOZXcgZ29hbHMuICBgYWxsLW5vJyBpcyBub29wLCBgYWxsLXllcycKLQlpcyBmb3JtZXIgYWxsLgotCi1Nb24gSmFuIDE1IDIxOjQ2OjAxIDE5OTYgIEhvd2FyZCBHYXlsZSAgPGhvd2FyZEBoYWwuY29tPgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKTogSW5jcmVtZW50IHN0cmluZyBwb2ludGVycyBpbiBsb29wCi0gICAgICAgIG9mIHN0cmNhc2VjbXAgcmVwbGFjZW1lbnQuCi0KLUZyaSBEZWMgMjkgMjE6MTY6MzQgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwtc3JjKTogV2hvIGNvbW1lbnRlZCB0aGlzIGdvYWwgb3V0ID8gOi0pCi0KLUZyaSBEZWMgMjkgMTU6MDg6MTYgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZGNnZXR0ZXh0LmMgKERDR0VUVEVYVCk6IFNhdmUgYGVycm5vJy4gIEZhaWxpbmcgc3lzdGVtIGNhbGxzCi0Jc2hvdWxkIG5vdCBlZmZlY3QgaXQgYmVjYXVzZSBhIG1pc3NpbmcgY2F0YWxvZyBpcyBubyBlcnJvci4KLQlSZXBvcnRlZCBieSBIYXJhbGQgSzxvOj5uaWcgPGtvZW5pZ0B0YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGU+LgotCi1UdWUgRGVjIDE5IDIyOjA5OjEzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChNYWtlZmlsZSk6IEV4cGxpY2l0bHkgdXNlICQoU0hFTEwpIGZvciBydW5uaW5nCi0gICAgICAgIHNoZWxsIHNjcmlwdHMuCi0KLUZyaSBEZWMgMTUgMTc6MzQ6NTkgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IE9ubHkgaW5zdGFsbCBsaWJyYXJ5IGFuZCBoZWFkZXIgd2hlbgotCXdlIHVzZSB0aGUgb3duIGltcGxlbWVudGF0aW9uLiAgRG9uJ3QgZG8gaXQgd2hlbiB1c2luZyB0aGUKLQlzeXN0ZW0ncyBnZXR0ZXh0IG9yIGNhdGdldHMgZnVuY3Rpb25zLgotCi0JKiBkY2dldHRleHQuYyAoZmluZF9tc2cpOiBNdXN0IG5vdCBzd2FwIGRvbWFpbi0+aGFzaF9zaXplIGhlcmUuCi0KLVNhdCBEZWMgIDkgMTY6MjQ6MzcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9jYWxlYWxpYXMuYywgbGliaW50bC5pbnN0LCBsaWJnZXR0ZXh0LmgsIGhhc2gtc3RyaW5nLmgsCi0JZ2V0dGV4dFAuaCwgZmluZGRvbWFpbi5jLCBkY2dldHRleHQuYywgY2F0LWNvbXBhdC5jOgotCVVzZSBQQVJBTVMgaW5zdGVhZCBvZiBfX1AuICBTdWdnZXN0ZWQgYnkgUm9sYW5kIE1jR3JhdGguCi0KLVR1ZSBEZWMgIDUgMTE6Mzk6MTQgMTk5NSAgTGFycnkgU2Nod2ltbWVyICA8cm9zZWJ1ZEBjeWNsb25lLnN0YW5mb3JkLmVkdT4KLQotCSogbGliZ2V0dGV4dC5oOiBVc2UgYCNpZiAhZGVmaW5lZCAoX0xJQklOVExfSCknIGluc3RlYWQgb2YgYCNpZgotCSFfTElCSU5UTF9IJyBiZWNhdXNlIFNvbGFyaXMgZGVmaW5lcyBfTElCSU5UTF9IIGFzIGVtcHR5LgotCi1Nb24gRGVjICA0IDE1OjQyOjA3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6Ci0JSW5zdGFsbCBsaWJpbnRsLmluc3QgaW5zdGVhZCBvZiBsaWJpbnRsLmguaW5zdGFsbC4KLQotU2F0IERlYyAgMiAyMjo1MTozOCAxOTk1ICBNYXJjdXMgRGFuaWVscyAgPG1hcmN1c0BzeXNjLnBkeC5lZHU+Ci0KLQkqIGNhdC1jb21wYXQuYyAodGV4dGRvbWFpbik6Ci0JUmV2ZXJzZSBvcmRlciBpbiB3aGljaCBmaWxlcyBhcmUgdHJpZWQgeW91IGxvYWQuICBGaXJzdAotCXRyeSBsb2NhbCBmaWxlLCB3aGVuIHRoaXMgZmFpbGVkIGFic29sdXRlIHBhdGguCi0KLVdlZCBOb3YgMjkgMDI6MDM6NTMgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KLQotCSogY2F0LWNvbXBhdC5jIChiaW5kdGV4dGRvbWFpbik6IEFkZCBtaXNzaW5nIHsgfS4KLQotU3VuIE5vdiAyNiAxODoyMTo0MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJpbnRsLmluc3Q6IEFkZCBtaXNzaW5nIF9fUCBkZWZpbml0aW9uLiAgUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi0JKiBNYWtlZmlsZS5pbjoKLQlBZGQgZHVtbXkgYGFsbCcgYW5kIGBkdmknIGdvYWxzLiAgUmVwb3J0ZWQgYnkgVG9tIFRyb21leS4KLQotU2F0IE5vdiAyNSAxNjoxMjowMSAxOTk1ICBGcmFuYyxvaXMgUGluYXJkICA8cGluYXJkQGlyby51bW9udHJlYWwuY2E+Ci0KLQkqIGhhc2gtc3RyaW5nLmg6IENhcGl0YWxpemUgYXJndW1lbnRzIG9mIG1hY3Jvcy4KLQotU2F0IE5vdiAyNSAxMjowMTozNiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogUHJldmVudCBmaWxlcyBuYW1lcyBsb25nZXIgdGhhbiAxMwotCWNoYXJhY3RlcnMuICBsaWJpbnRsLmguZ2xpYmMtPmxpYmludGwuZ2xpYmMsCi0JbGliaW50bC5oLmluc3RhbGwtPmxpYmludGwuaW5zdC4gIFJlcG9ydGVkIGJ5IEpvc2h1YSBSLiBQb3Vsc29uLgotCi1TYXQgTm92IDI1IDExOjMxOjEyIDE5OTUgIEVyaWMgQmFja3VzICA8ZXJpY2JAbHNpZC5ocC5jb20+Ci0KLQkqIGRjZ2V0dGV4dC5jOiBGaXggYnVnIGluIHByZXByb2Nlc3NvciBjb25kaXRpb25hbHMuCi0KLVNhdCBOb3YgMjUgMDI6MzU6MjcgMTk5NSAgTmVsc29uIEguIEYuIEJlZWJlICA8YmVlYmVAbWF0aC51dGFoLmVkdT4KLQotCSogbGliZ2V0dGV4dC5oOiBTb2xhcmlzIGNjIGRvZXMgbm90IHVuZGVyc3RhbmQKLQkgI2lmICFTWU1CT0wxICYmICFTWU1CT0wyLiAgU2FkCWJ1dCB0cnVlLgotCi1UaHUgTm92IDIzIDE2OjIyOjE0IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGhhc2gtc3RyaW5nLmggKGhhc2hfc3RyaW5nKToKLQlGaXggZm9yIG1hY2hpbmUgd2l0aCA+MzIgYml0IGB1bnNpZ25lZCBsb25nJ3MuCi0KLQkqIGRjZ2V0dGV4dC5jIChEQ0dFVFRFWFQpOgotCUZpeCBob3JyaWJsZSBidWcgaW4gbG9vcCBmb3IgYWx0ZXJuYXRpdmUgdHJhbnNsYXRpb24uCi0KLVRodSBOb3YgMjMgMDE6NDU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogcG8ydGJsLnNlZC5pbiwgbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDoKLQlTb21lIGZ1cnRoZXIgc2ltcGxpZmljYXRpb25zIGluIG1lc3NhZ2UgbnVtYmVyIGdlbmVyYXRpb24uCi0KLU1vbiBOb3YgMjAgMjE6MDg6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliaW50bC5oLmdsaWJjOiBVc2UgX19jb25zdCBpbnN0ZWFkIG9mIGNvbnN0IGluIHByb3RvdHlwZXMuCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6Ci0JSW5zdGFsbCBsaWJpbnRsLmguaW5zdGFsbCBpbnN0ZWFkIG9mIGxpYmludGwuaC4gIFRoaXMKLQlpcyBhIHN0cmlwcGVkLWRvd24gdmVyc2lvbi4gIFN1Z2dlc3RlZCBieSBQZXRlciBNaWxsZXIuCi0KLQkqIGxpYmludGwuaC5pbnN0YWxsLCBsaWJpbnRsLmguZ2xpYmM6IEluaXRpYWwgcmV2aXNpb24uCi0KLQkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMsIHJlYWRfYWxpYXNfZmlsZSk6Ci0JUHJvdGVjdCBwcm90b3R5cGVzIGluIHR5cGUgY2FzdHMgYnkgX19QLgotCi1UdWUgTm92IDE0IDE2OjQzOjU4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGhhc2gtc3RyaW5nLmg6IENvcnJlY3QgcHJvdG90eXBlIGZvciBoYXNoX3N0cmluZy4KLQotU3VuIE5vdiAxMiAxMjo0MjozMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBoYXNoLXN0cmluZy5oIChoYXNoX3N0cmluZyk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIGdldHRleHRQLmg6IEZpeCBjb3B5cmlnaHQuCi0JKFNXQVApOiBBZGQgcHJvdG90eXBlLgotCi1XZWQgTm92ICA4IDIyOjU2OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6IEZvcmdvdCBzaXplb2YuCi0JQXZvaWQgY2FsbGluZyAqcHJpbnRmIGZ1bmN0aW9uLiAgVGhpcyBpbnRyb2R1Y2VzIGEgYmlnIG92ZXJoZWFkLgotCVBhdGNoIGJ5IFJvbGFuZCBNY0dyYXRoLgotCi1UdWUgTm92ICA3IDE0OjIxOjA4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYywgY2F0LWNvbXBhdC5jOiBXcm9uZyBpbmRlbnRhdGlvbiBpbiAjaWYgZm9yIHN0cGNweS4KLQotCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOgotCURlZmluZSBzdWJzdGl0dXRpb24gZnVuY3Rpb24gbG9jYWwuICBUaGUgbWFjcm8gd2FzIHRvIGZsYWt5LgotCi0JKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvLgotCi0JKiB4b3Blbi1tc2cuc2VkLCBsaW51eC1tc2cuc2VkOgotCVdoaWxlIGJyaW5naW5nIG1lc3NhZ2UgbnVtYmVyIHRvIHJpZ2h0IHBsYWNlIG9ubHkgYWNjZXB0IGRpZ2l0cy4KLQotCSogbGludXgtbXNnLnNlZCwgeG9wZW4tbXNnLnNlZDogTm93IHRoYXQgdGhlIGNvdW50ZXIgZG9lcyBub3QgaGF2ZQotCWxlYWRpbmcgMHMgd2UgZG9uJ3QgbmVlZCB0byByZW1vdmUgdGhlbS4gIFJlcG9ydGVkIGJ5IE1hcmN1cwotCURhbmllbHMuCi0KLQkqIE1ha2VmaWxlLmluICguLi9wby9jYXQtaWQtdGJsLm8pOiBVc2UgJCh0b3Bfc3JkaXIpIGluCi0JZGVwZW5kZW5jeS4gIFJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBjYXQtY29tcGF0LmM6IChzdHBjcHkpIFshX0xJQkMgJiYgIUhBVkVfU1RQQ1BZXTogRGVmaW5lIHJlcGxhY2VtZW50LgotCUdlbmVyYWxseSBjbGVhbnVwIHVzaW5nICNpZiBpbnN0ZWFkIG9mICNpZm5kZWYuCi0KLQkqIE1ha2VmaWxlLmluOiBDb3JyZWN0IHR5cG9zIGluIGNvbW1lbnQuICBCeSBGcmFuYyxvaXMgUGluYXJkLgotCi1Nb24gTm92ICA2IDAwOjI3OjAyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsLXNyYyk6IERvbid0IGluc3RhbGwgbGliaW50bC5oIGFuZCBsaWJpbnRsLmEKLQlpZiB3ZSB1c2UgYW4gYXZhaWxhYmxlIGdldHRleHQgaW1wbGVtZW50YXRpb24uCi0KLVN1biBOb3YgIDUgMjI6MDI6MDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliZ2V0dGV4dC5oOiBGaXggdHlwbzogSEFWRV9DQVRHRVRUUyAtPiBIQVZFX0NBVEdFVFMuICBSZXBvcnRlZAotCWJ5IEZyYW5jLG9pcyBQaW5hcmQuCi0KLQkqIGxpYmdldHRleHQuaDogVXNlICNpZiBpbnN0ZWFkIG9mICNpZmRlZi8jaWZuZGVmLgotCi0JKiBmaW5kZG9tYWluLmM6Ci0JQ29tbWVudHMgZGVzY3JpYmluZyB3aGF0IGhhcyB0byBiZSBkb25lIHNob3VsZCBzdGFydCB3aXRoIEZJWE1FLgotCi1TdW4gTm92ICA1IDE5OjM4OjAxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBTcGxpdC4gIFVzZSBESVNURklMRVMgd2l0aCBub3JtYWwgbWVhbmluZy4KLQlESVNURklMRVMuY29tbW9uIG5hbWVzIHRoZSBmaWxlcyBjb21tb24gdG8gYm90aCBkaXN0IGdvYWxzLgotCURJU1RGSUxFUy5nZXR0ZXh0IGFyZSB0aGUgZmlsZXMgb25seSBkaXN0cmlidXRlZCBpbiBHTlUgZ2V0dGV4dC4KLQotU3VuIE5vdiAgNSAxNzozMjo1NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBkY2dldHRleHQuYyAoRENHRVRURVhUKTogQ29ycmVjdCBzZWFyY2hpbmcgaW4gZGVyaXZlZCBsb2NhbGVzLgotCVRoaXMgd2FzIG5lY2Vzc2FyeSBzaW5jZSBhIGNoYW5nZSBpbiBfbmxfZmluZF9tc2cgc2V2ZXJhbCB3ZWVrcwotCWFnby4gIEkgcmVhbGx5IGRvbid0IGtub3cgdGhpcyBpcyBzdGlsbCBub3QgZml4ZWQuCi0KLVN1biBOb3YgIDUgMTI6NDM6MTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOiBUZXN0IGZvciBGSUxFTkFNRSA9PSBOVUxMLiAgVGhpcwotCW1pZ2h0IG1hcmsgYSBzcGVjaWFsIGNvbmRpdGlvbi4KLQotCSogZmluZGRvbWFpbi5jIChtYWtlX2VudHJ5X3JlYyk6IERvbid0IG1ha2UgaWxsZWdhbCBlbnRyeSBhcyBkZWNpZGVkLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdCk6IFN1cHByZXNzIGVycm9yIG1lc3NhZ2Ugd2hlbiBsbiBmYWlsZWQuCi0JR2V0IGZpbGVzIGZyb20gJChzcmNkaXIpIGV4cGxpY2l0bHkuCi0KLQkqIGxpYmdldHRleHQuaCAoZ2V0dGV4dF9jb25zdCk6IFJlbmFtZSB0byBnZXR0ZXh0X25vb3AuCi0KLUZyaSBOb3YgIDMgMDc6MzY6NTAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChtYWtlX2VudHJ5X3JlYyk6Ci0JUHJvdGVjdCBhZ2FpbnN0IHdyb25nIGxvY2FsZSBuYW1lcyBieSB0ZXN0aW5nIG1hc2suCi0KLQkqIGxpYmdldHRleHQuaCAoZ2V0dGV4dF9jb25zdCk6IEFkZCBtYWNybyBkZWZpbml0aW9uLgotCUNhcGl0YWxpemUgbWFjcm8gYXJndW1lbnRzLgotCi1UaHUgTm92ICAyIDIzOjE1OjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlUZXN0IGZvciBwb2ludGVyICE9IE5VTEwgYmVmb3JlIGFjY2Vzc2luZyB2YWx1ZS4KLQlSZXBvcnRlZCBieSBUb20gVHJvbWV5LgotCi0JKiBnZXR0ZXh0LmMgKE5VTEwpOgotCURlZmluZSBhcyAodm9pZCopMCBpbnN0YWQgb2YgMC4gIFJlcG9ydGVkIGJ5IEZyYW5jLG9pcyBQaW5hcmQuCi0KLU1vbiBPY3QgMzAgMjE6Mjg6NTIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogcG8ydGJsLnNlZC5pbjogU2VyaW91cyB0eXBvIGJ1ZyBmaXhlZCBieSBKaW0gTWV5ZXJpbmcuCi0KLVNhdCBPY3QgMjggMjM6MjA6NDcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbGliZ2V0dGV4dC5oOiBEaXNhYmxlIGRjZ2V0dGV4dCBvcHRpbWl6YXRpb24gZm9yIFNvbGFyaXMgMi4zLgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKLQlQZXRlciBNaWxsZXIgcmVwb3J0ZWQgdGhhdCB0b2xvd2VyIGluIHNvbWUgc3lzdGVtcyBpcwotCWV2ZW4gZHVtYmVyIHRoYW4gSSB0aG91Z2h0LiAgUHJvdGVjdCBjYWxsIGJ5IGBpc3VwcGVyJy4KLQotRnJpIE9jdCAyNyAyMjoyMjo1MSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAobGliZGlyLCBpbmNsdWRlZGlyKTogTmV3IHZhcmlhYmxlcy4KLQkoaW5zdGFsbC1zcmMpOiBJbnN0YWxsIGxpYmludGwuYSBhbmQgbGliaW50bC5oIGluIGNvcnJlY3QgZGlycy4KLQotRnJpIE9jdCAyNyAyMjowNzoyOSAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoU09VUkNFUyk6IEZpeCB0eXBvOiBpbnRybC5jb21wYXQuYyAtPiBpbnRsLWNvbXBhdC5jLgotCi0JKiBwbzJ0Ymwuc2VkLmluOiBQYXRjaCBmb3IgYnVnZ3kgU0VEcyBieSBDaHJpc3RpYW4gdm9uIFJvcXVlcy4KLQotCSogbG9jYWxlYWxpYXMuYzoKLQlGaXggdHlwbyBhbmQgc3VwZXJmbG91cyB0ZXN0LiAgUmVwb3J0ZWQgYnkgQ2hyaXN0aWFuIHZvbiBSb3F1ZXMuCi0KLUZyaSBPY3QgIDYgMTE6NTI6MDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCUNvcnJlY3Qgc29tZSByZW1haW5kZXIgZnJvbSB0aGUgcHJlLUNFTiBzeW50YXguICBOb3cKLQl3ZSBkb24ndCBoYXZlIGEgY29uc3RhbnQgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgYW55bW9yZS4KLQotV2VkIFNlcCAyNyAyMTo0MToxMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogQWRkIGxpYmludGwuaC5nbGliYy4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3QtbGliYyk6IEFkZCBnb2FsIGZvciBwYWNraW5nIHNvdXJjZXMgZm9yIGdsaWJjLgotCShDT01TUkNTLCBDT01IRFJTKTogU3BsaXR0ZWQgdG8gc2VwYXJhdGUgc291cmNlcyBzaGFyZWQgd2l0aCBnbGliYy4KLQotCSogbG9hZG1zZ2NhdC5jOiBGb3JnZXQgdG8gY29udGludWUgI2lmIGxpbmUuCi0KLQkqIGxvY2FsZWFsaWFzLmM6Ci0JW19MSUJDXTogUmVuYW1lIHN0cmNhc2VjbXAgdG8gX19zdHJjYXNlY21wIHRvIGtlZXAgQU5TSSBDIG5hbWUKLQlzcGFjZSBjbGVhbi4KLQotCSogZGNnZXR0ZXh0LmMsIGZpbmRkb21haW4uYzogQmV0dGVyIGNvbW1lbnQgdG8gbGFzdCBjaGFuZ2UuCi0KLQkqIGxvYWRtc2djYXQuYzoKLQlbX0xJQkNdOiBSZW5hbWUgZnN0YXQsIG9wZW4sIGNsb3NlLCByZWFkLCBtbWFwLCBhbmQgbXVubWFwIHRvCi0JX19mc3RhdCwgX19vcGVuLCBfX2Nsb3NlLCBfX3JlYWQsIF9fbW1hcCwgYW5kIF9fbXVubWFwIHJlc3AKLQl0byBrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBmaW5kZG9tYWluLmM6Ci0JW19MSUJDXTogUmVuYW1lIHN0cGNweSB0byBfX3N0cGNweSB0byBrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBkY2dldHRleHQuYzoKLQlbX0xJQkNdOiBSZW5hbWUgZ2V0Y2VkIGFuZCBzdHBjcHkgdG8gX19nZXRjd2QgYW5kIF9fc3RwY3B5IHJlc3AgdG8KLQlrZWVwIEFOU0kgQyBuYW1lIHNwYWNlIGNsZWFuLgotCi0JKiBsaWJnZXR0ZXh0Lmg6Ci0JSW5jbHVkZSBzeXMvdHlwZXMuaCBmb3IgdGhvc2Ugb2xkIFN5c1Ygc3lzdGVtcyBvdXQgdGhlcmUuCi0JUmVwb3J0ZWQgYnkgRnJhbmNlc2NvIFBvdG9ydGlgLgotCi0JKiBsb2FkbXNnY2F0LmMgKHVzZV9tbWFwKTogRGVmaW5lIGlmIGNvbXBpbGVkIGZvciBnbGliYy4KLQotCSogYmluZHRleHRkb20uYzogSW5jbHVkZSBhbGwgdGhvc2Ugc3RhbmRhcmQgaGVhZGVycwotCXVuY29uZGl0aW9uYWxseSBpZiBfTElCQyBpcyBkZWZpbmVkLgotCi0JKiBmaW5kZG9tYWluLmM6IEZpeCAyIHRpbWVzIGRlZmllbmQgLT4gZGVmaW5lZC4KLQotCSogdGV4dGRvbWFpbi5jOiBJbmNsdWRlIGxpYmludGwuaCBpbnN0ZWFkIG9mIGxpYmdldHRleHQuaCB3aGVuCi0JY29tcGlsaW5nIGZvciBnbGliYy4gIEluY2x1ZGUgYWxsIHRob3NlIHN0YW5kYXJkIGhlYWRlcnMKLQl1bmNvbmRpdGlvbmFsbHkgaWYgX0xJQkMgaXMgZGVmaW5lZC4KLQotCSogbG9jYWxlYWxpYXMuYywgbG9hZG1zZ2NhdC5jOiBQcmVwYXJlIHRvIGJlIGNvbXBpbGVkIGluIGdsaWJjLgotCi0JKiBnZXR0ZXh0LmM6Ci0JSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgotCUdldCBOVUxMIGZyb20gc3RkZGVmLmggaWYgd2UgY29tcGlsZSBmb3IgZ2xpYmMuCi0KLQkqIGZpbmRkb21haW4uYzogSW5jbHVkZSBsaWJpbnRsLmggaW5zdGVhZCBvZiBsaWJnZXR0ZXh0Lmggd2hlbgotCWNvbXBpbGluZyBmb3IgZ2xpYmMuICBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzCi0JdW5jb25kaXRpb25hbGx5IGlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGRjZ2V0dGV4dC5jOiBJbmNsdWRlIGFsbCB0aG9zZSBzdGFuZGFyZCBoZWFkZXJzIHVuY29uZGl0aW9uYWxseQotCWlmIF9MSUJDIGlzIGRlZmluZWQuCi0KLQkqIGRnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKLQlsaWJnZXR0ZXh0LmguCi0JKGxvY2FsZS5oKTogRG9uJ3QgcmVseSBvbiBIQVZFX0xPQ0FMRV9IIHdoZW4gY29tcGlsaW5nIGZvciBnbGliYy4KLQotCSogZGNnZXR0ZXh0LmM6IElmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YKLQlsaWJnZXR0ZXh0LmguCi0JKGdldGN3ZCk6IERvbid0IHJlbHkgb24gSEFWRV9HRVRDV0Qgd2hlbiBjb21waWxpbmcgZm9yIGdsaWJjLgotCi0JKiBiaW5kdGV4dGRvbS5jOgotCUlmIGNvbXBpbGVkIGluIGdsaWJjIGluY2x1ZGUgbGliaW50bC5oIGluc3RlYWQgb2YgbGliZ2V0dGV4dC5oLgotCi1Nb24gU2VwIDI1IDIyOjIzOjA2IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGxvY2FsZWFsaWFzLmMgKF9ubF9leHBhbmRfYWxpYXMpOiBEb24ndCBjYWxsIGJzZWFyY2ggaWYgTk1BUCA8PSAwLgotCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKLQlTdHJpbmcgdXNlZCBpbiBwdXRlbnYgbXVzdCBub3QgYmUgcmVjeWNsZWQuCi0JUmVwb3J0ZWQgYnkgTWFyY3VzIERhbmllbHMuCi0KLQkqIGxpYmdldHRleHQuaCAoX19VU0VfR05VX0dFVFRFWFQpOgotCUFkZGl0aW9uYWwgc3ltYm9sIHRvIHNpZ25hbCB0aGF0IHdlIHVzZSBHTlUgZ2V0dGV4dAotCWxpYnJhcnkuCi0KLQkqIGNhdC1jb21wYXQuYyAoYmluZHRleHRkb21haW4pOgotCUZpeCBidWcgd2l0aCB0aGUgc3RyYW5nZSBzdHBjcHkgcmVwbGFjZW1lbnQuCi0JUmVwb3J0ZWQgYnkgTmVsc29uIEJlZWJlLgotCi1TYXQgU2VwIDIzIDA4OjIzOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGNhdC1jb21wYXQuYzogSW5jbHVkZSA8c3RyaW5nLmg+IGZvciBzdHBjcHkgcHJvdG90eXBlLgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCVdoaWxlIGV4cGFuZCBzdHJkdXAgY29kZSB0ZW1wb3JhcnkgdmFyaWFibGUgYGNwJyBoaWRlZAotCWhpZ2hlciBsZXZlbCB2YXJpYWJsZSB3aXRoIHNhbWUgbmFtZS4gIFJlbmFtZSB0byBgdHAnLgotCi0JKiB0ZXh0ZG9tYWluLmMgKHRleHRkb21haW4pOgotCUF2b2lkIHdhcm5pbmcgYnkgdXNpbmcgdGVtcG9yYXJ5IHZhcmlhYmxlIGluIHN0cmR1cCBjb2RlLgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6IFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgYGFwcGxpY2F0aW9uJy4KLQotVGh1IFNlcCAyMSAxNTo1MTo0NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChhbGlhc19jb21wYXJlKToKLQlVc2Ugc3RyY2FzZWNtcCgpIG9ubHkgaWYgYXZhaWxhYmxlLiAgRWxzZSB1c2UKLQlpbXBsZW1lbnRhdGlvbiBpbiBwbGFjZS4KLQotCSogaW50bC1jb21wYXQuYzoKLQlXcmFwcGVyIGZ1bmN0aW9ucyBub3cgY2FsbCAqX18gZnVuY3Rpb25zIGluc3RlYWQgb2YgX18qLgotCi0JKiBsaWJnZXR0ZXh0Lmg6IERlY2xhcmUgcHJvdG90eXBlcyBmb3IgKl9fIGZ1bmN0aW9ucyBpbnN0ZWFkIGZvciBfXyouCi0KLQkqIGNhdC1jb21wYXQuYywgbG9hZG1zZ2NhdC5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCi0JKiBiaW5kdGV4dGRvbS5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCVJlbmFtZSB0byBiaW5kdGV4dGRvbWFpbl9fIGlmIG5vdCB1c2VkIGluIEdOVSBDIExpYnJhcnkuCi0KLQkqIGRnZXR0ZXh0LmM6Ci0JUmVuYW1lIGZ1bmN0aW9uIHRvIGRnZXR0ZXh0X18gaWYgbm90IHVzZWQgaW4gR05VIEMgTGlicmFyeS4KLQotCSogZ2V0dGV4dC5jOgotCURvbid0IHVzZSB4bWFsbG9jLCB4c3RyZHVwLCBhbmQgc3RwY3B5LiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgcGFydAotCW9mIHRoZSBzdGFuZGFyZCBsaWJjIGFuZCBzbyBwcmV2ZW50IGxpYmludGwuYSBmcm9tIGJlaW5nIHVzZWQKLQlzdGFuZGFsb25lLgotCUZ1bmN0aW9ucyBub3cgY2FsbGVkIGdldHRleHRfXyBpZiBub3QgdXNlZCBpbiBHTlUgQyBMaWJyYXJ5LgotCi0JKiBkY2dldHRleHQuYywgbG9jYWxlYWxpYXMuYywgdGV4dGRvbWFpbi5jLCBmaW5kZG9tYWluLmM6Ci0JRG9uJ3QgdXNlIHhtYWxsb2MsIHhzdHJkdXAsIGFuZCBzdHBjcHkuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBwYXJ0Ci0Jb2YgdGhlIHN0YW5kYXJkIGxpYmMgYW5kIHNvIHByZXZlbnQgbGliaW50bC5hIGZyb20gYmVpbmcgdXNlZAotCXN0YW5kYWxvbmUuCi0KLVN1biBTZXAgMTcgMjM6MTQ6NDkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jOiBDb3JyZWN0IHNvbWUgYnVncyBpbiBoYW5kbGluZyBvZiBDRU4gc3RhbmRhcmQKLSAJbG9jYWxlIGRlZmluaXRpb25zLgotCi1UaHUgU2VwICA3IDAxOjQ5OjI4IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYzogSW1wbGVtZW50IENFTiBzeW50YXguCi0KLQkqIGdldHRleHRQLmggKGxvYWRlZF9kb21haW4pOiBFeHRlbmQgbnVtYmVyIG9mIHN1Y2Nlc3NvcnMgdG8gMzEuCi0KLVNhdCBBdWcgMTkgMTk6MjU6MjkgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKGFsaWFzcGF0aCk6IFJlbW92ZSBwYXRoIHRvIFgxMSBsb2NhbGUgZGlyLgotCi0JKiBNYWtlZmlsZS5pbjogTWFrZSBpbnN0YWxsLXNyYyBkZXBlbmQgb24gaW5zdGFsbC4gIFRoaXMgaGVscHMKLSAJZ2V0dGV4dCB0byBpbnN0YWxsIHRoZSBzb3VyY2VzIGFuZCBvdGhlciBwYWNrYWdlcyBjYW4gdXNlIHRoZQotIAlpbnN0YWxsIGdvYWwuCi0KLVNhdCBBdWcgMTkgMTU6MTk6MzMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKHVuaW5zdGFsbCk6IFJlbW92ZSBzdHVmZiBpbnN0YWxsZWQgYnkgaW5zdGFsbC1zcmMuCi0KLVR1ZSBBdWcgMTUgMTM6MTM6NTMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogVkVSU0lPTi5pbjogSW5pdGlhbCByZXZpc2lvbi4KLQotCSogTWFrZWZpbGUuaW4gKERJU1RGSUxFUyk6Ci0JQWRkIFZFUlNJT04gZmlsZS4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyeSBmb3IgZ2V0dGV4dCwgYnV0Ci0JZm9yIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoaXMgbGlicmFyeS4KLQotVHVlIEF1ZyAxNSAwNjoxNjo0NCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBnZXR0ZXh0UC5oIChfbmxfZmluZF9kb21haW4pOgotCU5ldyBwcm90b3R5cGUgYWZ0ZXIgY2hhbmdpbmcgc2VhcmNoIHN0cmF0ZWd5LgotCi0JKiBmaW5kZG9tYWluLmMgKF9ubF9maW5kX2RvbWFpbik6Ci0JV2Ugbm93IHRyeSBvbmx5IHRvIGZpbmQgYSBzcGVjaWZpZWQgY2F0YWxvZy4gIEZhbGwgYmFjayB0byBvdGhlcgotCWNhdGFsb2dzIGxpc3RlZCBpbiB0aGUgbG9jYWxlIGxpc3QgaXMgbm93IGRvbmUgaW4gX19kY2dldHRleHQuCi0KLQkqIGRjZ2V0dGV4dC5jIChfX2RjZ2V0dGV4dCk6Ci0JTm93IHdlIHByb3ZpZGUgbWVzc2FnZSBmYWxsIGJhY2sgZXZlbiB0byBkaWZmZXJlbnQgbGFuZ3VhZ2VzLgotCUkuZS4gaWYgYSBtZXNzYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gb25lIGxhbmd1YWdlIGFsbCB0aGUgb3RoZXIKLSAJaW4gdGhlIGxvY2FsZSBsaXN0IGEgdHJpZWQuICBGb3JtZXJseSBmYWxsIGJhY2sgd2FzIG9ubHkgcG9zc2libGUKLSAJd2l0aGluIG9uZSBsYW5ndWFnZS4gIEltcGxlbWVudGVkIGJ5IG1vdmluZyBvbmUgbG9vcCBmcm9tCi0gCV9ubF9maW5kX2RvbWFpbiB0byBoZXJlLgotCi1Nb24gQXVnIDE0IDIzOjQ1OjUwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChnZXR0ZXh0c3JjZGlyKToKLQlEaXJlY3Rvcnkgd2hlcmUgc291cmNlIG9mIEdOVSBnZXR0ZXh0IGxpYnJhcnkgYXJlIG1hZGUKLQlhdmFpbGFibGUuCi0JKElOU1RBTEwsIElOU1RBTExfREFUQSk6IFByb2dyYW1zIHVzZWQgZm9yIGluc3RhbGxpbmcgc291cmNlcy4KLQkoZ2V0dGV4dC1zcmMpOiBOZXcuICBSdWxlIHRvIGluc3RhbGwgR05VIGdldHRleHQgc291cmNlcyBmb3IgdXNlIGluCi0JZ2V0dGV4dGl6ZSBzaGVsbCBzY3JpcHQuCi0KLVN1biBBdWcgMTMgMTQ6NDA6NDggMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jIChfbmxfbG9hZF9kb21haW4pOgotCVVzZSBtbWFwIGZvciBsb2FkaW5nIG9ubHkgd2hlbiBtdW5tYXAgZnVuY3Rpb24gaXMKLQlhbHNvIGF2YWlsYWJsZS4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEZXBlbmQgb24gYGFsbCcgZ29hbC4KLQotV2VkIEF1ZyAgOSAxMTowNDozMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsb2NhbGVhbGlhcy5jIChyZWFkX2FsaWFzX2ZpbGUpOgotCURvIG5vdCBvdmVyd3JpdGUgJ1xuJyB3aGVuIHRlcm1pbmF0aW5nIGFsaWFzIHZhbHVlIHN0cmluZy4KLQotCSogbG9jYWxlYWxpYXMuYyAocmVhZF9hbGlhc19maWxlKToKLQlIYW5kbGUgbG9uZyBsaW5lcy4gIElnbm9yZSB0aGUgcmVzdCBub3QgZml0dGluZyBpbgotCXRoZSBidWZmZXIgYWZ0ZXIgdGhlIGluaXRpYWwgYGZnZXRzJyBjYWxsLgotCi1XZWQgQXVnICA5IDAwOjU0OjI5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGdldHRleHRQLmggKF9ubF9sb2FkX2RvbWFpbik6Ci0JQWRkIHByb3RvdHlwZSwgcmVwbGFjaW5nIHByb3RvdHlwZSBmb3IgX25sX2xvYWRfbXNnX2NhdC4KLQotCSogZmluZGRvbWFpbi5jIChfbmxfZmluZF9kb21haW4pOgotCVJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZSBmaWxlbmFtZSBhbmQgZmlsZW5hbWVfbGVuLgotCShleHBhbmRfYWxpYXMpOiBSZW1vdmUgcHJvdG90eXBlIGJlY2F1c2UgZnVuY3Rpb25zIGRvZXMgbm90Ci0gCWV4aXN0IGFueW1vcmUuCi0KLQkqIGxvY2FsZWFsaWFzLmMgKHJlYWRfYWxpYXNfZmlsZSk6Ci0JQ2hhbmdlIHR5cGUgb2YgZm5hbWVfbGVuIHBhcmFtZXRlciB0byBpbnQuCi0JKHhtYWxsb2MpOiBBZGQgcHJvdG90eXBlLgotCi0JKiBsb2FkbXNnY2F0LmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jLgotCi1UdWUgQXVnICA4IDIyOjMwOjM5IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAoX25sX2ZpbmRfZG9tYWluKToKLQlBbGxvdyBhbGlhcyBuYW1lIHRvIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGZvdXIgY29tcG9uZW50cy4KLQotCSogTWFrZWZpbGUuaW4gKGFsaWFzcGF0aCk6IE5ldyB2YXJpYWJsZS4gIFNldCB0byBwcmVsaW1pbmFyeSB2YWx1ZS4KLQkoU09VUkNFUyk6IEFkZCBsb2NhbGVhbGlhcy5jLgotCShPQkpFQ1RTKTogQWRkIGxvY2FsZWFsaWFzLm8uCi0KLQkqIGdldHRleHRQLmg6IEFkZCBwcm90b3R5cGUgZm9yIF9ubF9leHBhbmRfYWxpYXMuCi0KLQkqIGZpbmRkb21haW4uYzogQWxpYXNpbmcgaGFuZGxlZCBpbiBpbnRsL2xvY2FsZWFsaWFzLmMuCi0KLQkqIGxvY2FsZWFsaWFzLmM6IEFsaWFzaW5nIGZvciBsb2NhbGUgbmFtZXMuCi0KLQkqIGJpbmR0ZXh0ZG9tLmM6IEJldHRlciBwcm90b3R5cGVzIGZvciB4bWFsbG9jIGFuZCB4c3RyZHVwLgotCi1Nb24gQXVnICA3IDIzOjQ3OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChESVNURklMRVMpOiBnZXR0ZXh0LnBlcmwgaXMgbm93IGZvdW5kIGluIG1pc2MvLgotCi0JKiBjYXQtY29tcGF0LmMgKGJpbmR0ZXh0ZG9tYWluKToKLQlDb3JyZWN0IGltcGxlbWVudGF0aW9uLiAgZGlybmFtZSBwYXJhbWV0ZXIgd2FzIG5vdCB1c2VkLgotCVJlcG9ydGVkIGJ5IE1hcmN1cyBEYW5pZWxzLgotCi0JKiBnZXR0ZXh0UC5oIChsb2FkZWRfZG9tYWluKToKLQlOZXcgZmllbGRzIGBzdWNjZXNzb3InIGFuZCBgZGVjaWRlZCcgZm9yIG9vLCBsYXp5Ci0JbWVzc2FnZSBoYW5kbGluZyBpbXBsZW1lbnRhdGlvbi4KLQotCSogZGNnZXR0ZXh0LmM6Ci0JQWRvcHQgZm9yIG9vLCBsYXp5IG1lc3NhZ2UgaGFuZGxpaW5nLgotICAJTm93IHdlIGNhbiBpbmhlcml0IHRyYW5zbGF0aW9ucyBmcm9tIGxlc3Mgc3BlY2lmaWMgbG9jYWxlcy4KLQkoZmluZF9tc2cpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGxvYWRtc2djYXQuYywgZmluZGRvbWFpbi5jOgotCUNvbXBsZXRlIHJld3JpdGUuICBJbXBsZW1lbnQgb28sIGxhenkgbWVzc2FnZSBoYW5kbGluZyA6LSkuCi0gIAlXZSBub3cgaGF2ZSBhbiBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlIGBMQU5HVUFHRScgd2l0aAotIAlhIGhpZ2hlciBwcmlvcml0eSB0aGFuIExDX0FMTCBmb3IgdGhlIExDX01FU1NBR0UgbG9jYWxlLgotICAJSGVyZSB3ZSBjYW4gc2V0IGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2Ygc3BlY2lmaWNhdGlvbnMgZWFjaAotIAlvZiB0aGUgZm9ybSBgbGFuZ3VhZ2VbX3RlcnJpdG9yeVsuY29kZXNldF1dW0Btb2RpZmllcl0nLgotCi1TYXQgQXVnICA1IDA5OjU1OjQyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGZpbmRkb21haW4uYyAodW5pc3RkLmgpOgotCUluY2x1ZGUgdG8gZ2V0IF9QQ19QQVRIX01BWCBkZWZpbmVkIG9uIHN5c3RlbSBoYXZpbmcgaXQuCi0KLUZyaSBBdWcgIDQgMjI6NDI6MDAgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogZmluZGRvbWFpbi5jIChzdHBjcHkpOiBJbmNsdWRlIHByb3RvdHlwZS4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3QpOiBSZW1vdmUgYGNvcHlpbmcgaW5zdGVhZCcgbWVzc2FnZS4KLQotV2VkIEF1ZyAgMiAxODo1MjowMyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoSUQsIFRBR1MpOiBEbyBub3QgdXNlICReLgotCi1UdWUgQXVnICAxIDIwOjA3OjExIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChUQUdTLCBJRCk6IFVzZSAkXiBhcyBjb21tYW5kIGFyZ3VtZW50LgotCShUQUdTKTogR2l2ZSBldGFncyAtbyBvcHRpb24gdCB3cml0ZSB0byBjdXJyZW50IGRpcmVjdG9yeSwKLSAJbm90ICQoc3JjZGlyKS4KLQkoSUQpOiBVc2UgJChzcmNkaXIpIGluc3RlYWQgb3MgJCh0b3Bfc3JjZGlyKS9zcmMuCi0JKGRpc3RjbGVhbik6IFJlbW92ZSBJRC4KLQotU3VuIEp1bCAzMCAxMTo1MTo0NiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoZ251bG9jYWxlZGlyKToKLQlOZXcgdmFyaWFibGUsIGFsd2F5cyB1c2luZyBzaGFyZS8gZm9yIGRhdGEgZGlyZWN0b3J5LgotCShERUZTKTogQWRkIEdOVUxPQ0FMRURJUiwgdXNlZCBpbiBmaW5kZG9tYWluLmMuCi0KLQkqIGZpbmRkb21haW4uYyAoX25sX2RlZmF1bHRfZGlybmFtZSk6Ci0JU2V0IHRvIEdOVUxPQ0FMRURJUiwgYmVjYXVzZSBpdCBhbHdheXMgaGFzIHRvIHBvaW50Ci0JdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBHTlUgZ2V0dGV4dCBMaWJyYXJ5IHdyaXRlcyBpdCB0by4KLQotCSogaW50bC1jb21wYXQuYyAodGV4dGRvbWFpbiwgYmluZHRleHRkb21haW4pOgotCVVuZGVmaW5lIG1hY3JvcyBiZWZvcmUgZnVuY3Rpb24gZGVmaW5pdGlvbi4KLQotU2F0IEp1bCAyMiAwMToxMDowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBsaWJnZXR0ZXh0LmggKF9MSUJJTlRMX0gpOgotCVByb3RlY3QgZGVmaW5pdGlvbiBpbiBjYXNlIHdoZXJlIHRoaXMgZmlsZSBpcyBpbmNsdWRlZCBhcwotCWxpYmdldHRleHQuaCBvbiBTb2xhcmlzIG1hY2hpbmVzLiAgQWRkIGNvbW1lbnQgYWJvdXQgdGhpcy4KLQotV2VkIEp1bCAxOSAwMjozNjo0MiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBpbnRsLWNvbXBhdC5jICh0ZXh0ZG9tYWluKTogQ29ycmVjdCB0eXBvLgotCi1XZWQgSnVsIDE5IDAxOjUxOjM1IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGRjZ2V0dGV4dC5jIChkY2dldHRleHQpOiBGdW5jdGlvbiBub3cgY2FsbGVkIF9fZGNnZXR0ZXh0LgotCi0JKiBkZ2V0dGV4dC5jIChkZ2V0dGV4dCk6IE5vdyBjYWxsZWQgX19kZ2V0dGV4dCBhbmQgY2FsbHMKLSAJX19kY2dldHRleHQuCi0KLQkqIGdldHRleHQuYyAoZ2V0dGV4dCk6Ci0JRnVuY3Rpb24gbm93IGNhbGxlZCBfX2dldHRleHQgYW5kIGNhbGxzIF9fZGdldHRleHQuCi0KLQkqIHRleHRkb21haW4uYyAodGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQgX190ZXh0ZG9tYWluLgotCi0JKiBiaW5kdGV4dGRvbS5jIChiaW5kdGV4dGRvbWFpbik6IEZ1bmN0aW9uIG5vdyBjYWxsZWQKLSAJX19iaW5kdGV4dGRvbWFpbi4KLQotCSogaW50bC1jb21wYXQuYzogSW5pdGlhbCByZXZpc2lvbi4KLQotCSogTWFrZWZpbGUuaW4gKFNPVVJDRVMpOiBBZGQgaW50bC1jb21wYXQuYy4KLQkoT0JKRUNUUyk6IFdlIGFsd2F5cyBjb21waWxlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGZ1bmN0aW9ucy4KLSAgCU9CSkVDVFMgY29udGFpbnMgYWxsIG9iamVjdHMgYnV0IGNhdC1jb21wYXQubywgLi4vcG8vY2F0LWlmLXRibC5vLAotIAlhbmQgaW50bC1jb21wYXQuby4KLSAgCShHRVRUT0JKUyk6IENvbnRhaW5zIG5vdyBvbmx5IGludGwtY29tcGF0Lm8uCi0KLQkqIGxpYmdldHRleHQuaDoKLQlSZS1pbmNsdWRlIHByb3RlY3Rpb24gbWF0Y2hlcyBkdWFsaXN0aWMgY2hhcmFjdGVyIG9mIGxpYmdldHRleHQuaC4KLQlGb3IgYWxsIGZ1bmN0aW9ucyBpbiBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGRlZmluZSBfXyBjb3VudGVyIHBhcnQuCi0KLQkqIGZpbmRkb21haW4uYyAoc3RyY2hyKTogRGVmaW5lIGFzIGluZGV4IGlmIG5vdCBmb3VuZCBpbiBDIGxpYnJhcnkuCi0JKF9ubF9maW5kX2RvbWFpbik6IEZvciByZWxhdGl2ZSBwYXRocyBwYXN0ZSAvIGluIGJldHdlZW4uCi0KLVR1ZSBKdWwgMTggMTY6Mzc6NDUgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogbG9hZG1zZ2NhdC5jLCBmaW5kZG9tYWluLmM6IEFkZCBpbmNsdXNpb24gb2Ygc3lzL3R5cGVzLmguCi0KLQkqIHhvcGVuLW1zZy5zZWQ6IEZpeCBidWcgd2l0aCBgbXNnc3RyICIiJyBsaW5lcy4KLQlBIGxpdHRsZSBiaXQgYmV0dGVyIGNvbW1lbnRzLgotCi1UdWUgSnVsIDE4IDAxOjE4OjI3IDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluOgotCXBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCBhcmUgbm93IGZvdW5kIGluIC4uL21pc2MuCi0KLQkqIHBvLW1vZGUuZWwsIG1ha2VsaW5rcywgY29tYmluZS1zaCwgZWxpc3AtY29tcDoKLQlNb3ZlZCB0byAuLi9taXNjLy4KLQotCSogbGliZ2V0dGV4dC5oLCBnZXR0ZXh0UC5oLCBnZXR0ZXh0Lmg6IFVuaWZvcm0gdGVzdCBmb3IgX19TVERDX18uCi0KLVN1biBKdWwgMTYgMjI6MzM6MDIgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwsIElOU1RBTExfREFUQSk6IE5ldyB2YXJpYWJsZXMuCi0JKGluc3RhbGwtZGF0YSwgdW5pbnN0YWxsKTogSW5zdGFsbC91bmluc3RhbGwgLmVsYyBmaWxlLgotCi0JKiBwby1tb2RlLmVsIChJbnN0YWxsYXRpb24gY29tbWVudCk6Ci0JQWRkIC5wb3ggYXMgcG9zc2libGUgZXh0ZW5zaW9uIG9mIC5wbyBmaWxlcy4KLQotU3VuIEp1bCAxNiAxMzoyMzoyNyAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBlbGlzcC1jb21wOiBDb21wbGV0ZSBuZXcgdmVyc2lvbiBieSBGcmFuYyxvaXM6IFRoaXMgZG9lcyBub3QKLSAJZmFpbCB3aGVuIG5vdCBjb21waWxpbmcgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkuCi0KLVN1biBKdWwgMTYgMDA6MTI6MTcgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKC4uL3BvL2NhdC1pZC10Ymwubyk6Ci0JVXNlICQoTUFLRSkgaW5zdGVhZCBvZiBtYWtlIGZvciByZWN1cnNpdmUgbWFrZS4KLQotCSogTWFrZWZpbGUuaW4gKC5lbC5lbGMpOiBVc2UgJChTSEVMTCkgaW5zdGVhZCBvZiAvYmluL3NoLgotCShpbnN0YWxsLWV4ZWMpOiBBZGQgbWlzc2luZyBkdW1teSBnb2FsLgotCShpbnN0YWxsLWRhdGEsIHVuaW5zdGFsbCk6IEAgaW4gbXVsdGktbGluZSBzaGVsbCBjb21tYW5kIGF0Ci0gCWJlZ2lubmluZywgbm90IGluIGZyb250IG9mIGVjaG8uICBSZXBvcnRlZCBieSBFcmljIEJhY2t1cy4KLQotU2F0IEp1bCAxNSAwMDoyMToyOCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKToKLQlSZW5hbWUgbGliZ2V0dGV4dC5wZXJsIHRvIGdldHRleHQucGVybCB0byBmaXQgaW4gMTQgY2hhcnMKLQlmaWxlIHN5c3RlbXMuCi0KLQkqIGdldHRleHQucGVybDoKLSAJUmVuYW1lIHRvIGdldHRleHQucGVybCB0byBmaXQgaW4gMTQgY2hhcnMgZmlsZSBzeXN0ZW1zLgotCi1UaHUgSnVsIDEzIDIzOjE3OjIwIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIGNhdC1jb21wYXQuYzogSWYgIVNURENfSEVBREVSUyB0cnkgdG8gaW5jbHVkZSBtYWxsb2MuaC4KLQotVGh1IEp1bCAxMyAyMDo1NTowMiAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBwbzJ0Ymwuc2VkLmluOiBQcmV0dHkgcHJpbnRpbmcuCi0KLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6Ci0JQ29ycmVjdCBidWdzIHdpdGggaGFuZGxpbmcgc3Vic3RpdHV0ZSBmbGFncyBpbiBicmFuY2hlcy4KLQotCSogaGFzaC1zdHJpbmcuaCAoaGFzaF9zdHJpbmcpOgotCU9sZCBLJlIgY29tcGlsZXJzIGRvbid0IHVuZGVyIHN0YW5kIGB1bnNpZ25lZCBjaGFyJy4KLQotCSogZ2V0dGV4dC5oIChubHNfdWludDMyKToKLQlTb21lIG9sZCBLJlIgY29tcGlsZXJzIChlZyBIUCkgZG9uJ3QgdW5kZXJzdGFuZCBgdW5zaWduZWQgaW50Jy4KLQotCSogY2F0LWNvbXBhdC5jIChtc2dfdG9fY2F0X2lkKTogRGUtQU5TSS1meSBwcm90b3R5cGVzLgotCi1UaHUgSnVsIDEzIDAxOjM0OjMzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluIChFTENGSUxFUyk6IE5ldyB2YXJpYWJsZS4KLQkoRElTVEZJTEVTKTogQWRkIGVsaXNwLWNvbXAuCi0JQWRkIGltcGxpY2l0IHJ1bGUgZm9yIC5lbCAtPiAuZWxjIGNvbXBpbGF0aW9uLgotCShpbnN0YWxsLWRhdGEpOiBpbnN0YWxsICRFTENGSUxFUwotCShjbGVhbik6IHJlbmFtZWQgcG8tdG8tdGJsIGFuZCBwby10by1tc2cgdG8gcG8ydGJsIGFuZCBwbzJtc2cgcmVzcC4KLQotCSogZWxpc3AtY29tcDogSW5pdGlhbCByZXZpc2lvbgotCi1XZWQgSnVsIDEyIDE2OjE0OjUyIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIE1ha2VmaWxlLmluOgotCWNhdC1pZC10YmwuYyBpcyBub3cgZm91bmQgaW4gcG8vLiAgVGhpcyBlbmFibGVzIHVzIHRvIHVzZSBhbiBpZGVudGljYWwKLQlpbnRsLyBkaXJlY3RvcnkgaW4gYWxsIHBhY2thZ2VzLgotCi0JKiBkY2dldHRleHQuYyAoZGNnZXR0ZXh0KTogaGFzaGluZyBkb2VzIG5vdCB3b3JrIGZvciB0YWJsZSBzaXplIDw9IDIuCi0KLQkqIHRleHRkb21haW4uYzogZml4IHR5cG8gKCNpZiBkZWYgLT4gI2lmIGRlZmluZWQpCi0KLVR1ZSBKdWwgMTEgMTg6NDQ6NDMgMTk5NSAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQG15d2FyZT4KLQotCSogTWFrZWZpbGUuaW4gKHN0YW1wLWNhdC1pZCk6IHVzZSB0b3Bfc3JjZGlyIHRvIGFkZHJlc3Mgc291cmNlIGZpbGVzCi0JKERJU1RGSUxFUyxkaXN0Y2xlYW4pOiBtb3ZlIHR1cGRhdGUucGVybCB0byBzcmMvCi0KLQkqIHBvLXRvLXRibC5zZWQuaW46Ci0JYWRkIGFkZGl0aW9uYWwganVtcCB0byBjbGVhciBjaGFuZ2UgZmxhZyB0byByZWNvZ25pemUgbXVsdGlsaW5lIHN0cmluZ3MKLQotVHVlIEp1bCAxMSAwMTozMjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiB0ZXh0ZG9tYWluLmM6IFByb3RlY3QgaW5jbHVzaW9uIG9mIHN0ZGxpYi5oIGFuZCBzdHJpbmcuaC4KLQotCSogbG9hZG1zZ2NhdC5jOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBzdGRsaWIuaC4KLQotCSogbGliZ2V0dGV4dC5oOiBQcm90ZWN0IGluY2x1c2lvbiBvZiBsb2NhbGUuaC4KLQlBbGxvdyB1c2UgaW4gQysrIHByb2dyYW1zLgotCURlZmluZSBOVUxMIGlzIG5vdCBoYXBwZW5lZCBhbHJlYWR5LgotCi0JKiBNYWtlZmlsZS5pbiAoRElTVEZJTEVTKTogc2hpcCBwby10by10Ymwuc2VkLmluIGluc3RlYWQgb2YKLQlwby10by10Ymwuc2VkLgotCShkaXN0Y2xlYW4pOiByZW1vdmUgcG8tdG8tdGJsLnNlZCBhbmQgdHVwZGF0ZS5wZXJsLgotCi0JKiB0dXBkYXRlLnBlcmwuaW46IFN1YnN0aXR1dGUgUGVybCBwYXRoIGV2ZW4gaW4gZXhlYyBsaW5lLgotCURvbid0IGluY2x1ZGUgZW50cmllcyB3aXRob3V0IHRyYW5zbGF0aW9uIGZyb20gb2xkIC5wbyBmaWxlLgotCi1UdWUgSnVsICA0IDAwOjQxOjUxIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHR1cGRhdGUucGVybC5pbjogdXNlICJVcGRhdGVkOiAiIGluIG1zZ2lkICIiLgotCi0JKiBjYXQtY29tcGF0LmM6IEZpeCB0eXBvIChMT0NBTERJUiAtPiBMT0NBTEVESVIpLgotIAlEZWZpbmUgZ2V0ZW52IGlmICFfX1NURENfXy4KLQotCSogYmluZHRleHRkb20uYzogUHJvdGVjdCBzdGRsaWIuaCBhbmQgc3RyaW5nLmggaW5jbHVzaW9uLgotIAlEZWZpbmUgZnJlZSBpZiAhX19TVERDX18uCi0KLQkqIGZpbmRkb21haW4uYzogQ2hhbmdlIERFRl9NU0dfRE9NX0RJUiB0byBMT0NBTEVESVIuCi0gCURlZmluZSBmcmVlIGlmICFfX1NURENfXy4KLQotCSogY2F0LWNvbXBhdC5jOiBDaGFuZ2UgREVGX01TR19ET01fRElSIHRvIExPQ0FMRURJUi4KLQotTW9uIEp1bCAgMyAyMzo1NjozMCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBNYWtlZmlsZS5pbjogVXNlIExPQ0FMRURJUiBpbnN0ZWFkIG9mIERFRl9NU0dfRE9NX0RJUi4KLQlSZW1vdmUgdW5uZWVkZWQgJChzcmNkaXIpIGZyb20gTWFrZWZpbGUuaW4gZGVwZW5kZW5jeS4KLQotCSogbWFrZWxpbmtzOiBBZGQgY29weXJpZ2h0IGFuZCBzaG9ydCBkZXNjcmlwdGlvbi4KLQotCSogcG8tbW9kZS5lbDogTGFzdCB2ZXJzaW9uIGZvciAwLjcuCi0KLQkqIHR1cGRhdGUucGVybC5pbjogRml4IGRpZSBtZXNzYWdlLgotCi0JKiBkY2dldHRleHQuYzogUHJvdGVjdCBpbmNsdWRlIG9mIHN0cmluZy5oLgotCi0JKiBnZXR0ZXh0LmM6IFByb3RlY3QgaW5jbHVkZSBvZiBzdGRsaWIuaCBhbmQgZnVydGhlciB0cmllcyB0byBnZXQgTlVMTC4KLQotCSogZmluZGRvbWFpbi5jOiBTb21lIGNvcnJlY3Rpb25zIGluIGluY2x1ZGVzLgotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBQcnVuZSBsaXN0IGNvcnJlY3QgcGF0aCB0byBNYWtlZmlsZS5pbi4KLQotCSogcG8tdG8tdGJsLnNlZDogQWRvcHQgZm9yIG5ldyAucG8gZmlsZSBmb3JtYXQuCi0KLQkqIGxpbnV4LW1zZy5zZWQsIHhvcGVuLW1zZy5zZWQ6IEFkb3B0IGZvciBuZXcgLnBvIGZpbGUgZm9ybWF0LgotCi1TdW4gSnVsICAyIDIzOjU1OjAzIDE5OTUgIFVscmljaCBEcmVwcGVyICA8ZHJlcHBlckBteXdhcmU+Ci0KLQkqIHR1cGRhdGUucGVybC5pbjogQ29tcGxldGUgcmV3cml0ZSBmb3IgbmV3IC5wbyBmaWxlIGZvcm1hdC4KLQotU3VuIEp1bCAgMiAwMjowNjo1MCAxOTk1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAbXl3YXJlPgotCi0JKiBGaXJzdCBvZmZpY2lhbCByZWxlYXNlLiAgVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgYWxsIHRoZSBjb2RlCi0JbmVlZGVkIHRvIGludGVybmF0aW9uYWxpemUgb3duIHBhY2thZ2VzLiAgSXQgcHJvdmlkZXMgZnVuY3Rpb25zCi0Jd2hpY2ggYWxsb3cgdG8gdXNlIHRoZSBYL09wZW4gY2F0Z2V0cyBmdW5jdGlvbiB3aXRoIGFuIGludGVyZmFjZQotCWxpa2UgdGhlIFVuaWZvcnVtIGdldHRleHQgZnVuY3Rpb24uICBGb3Igc3lzdGVtIHdoaWNoIGRvZXMgbm90Ci0JaGF2ZSBuZWl0aGVyIG9mIHRob3NlIGEgY29tcGxldGUgaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQuCmRpZmYgLS1naXQgYS9pbnRsL01ha2VmaWxlLmluIGIvaW50bC9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk2NDdkZS4uMDAwMDAwMAotLS0gYS9pbnRsL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIGRpcmVjdG9yeSB3aXRoIG1lc3NhZ2UgY2F0YWxvZyBoYW5kbGluZyBpbiBHTlUgTkxTIFV0aWxpdGllcy4KLSMgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1QQUNLQUdFID0gQFBBQ0tBR0VACi1WRVJTSU9OID0gQFZFUlNJT05ACi0KLVNIRUxMID0gL2Jpbi9zaAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotdG9wX2J1aWxkZGlyID0gLi4KLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotdHJhbnNmb3JtID0gQHByb2dyYW1fdHJhbnNmb3JtX25hbWVACi1saWJkaXIgPSAkKGV4ZWNfcHJlZml4KS9saWIKLWluY2x1ZGVkaXIgPSAkKHByZWZpeCkvaW5jbHVkZQotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9IEBkYXRhZGlyQC9nZXR0ZXh0L2ludGwKLWFsaWFzcGF0aCA9ICQobG9jYWxlZGlyKTouCi1zdWJkaXIgPSBpbnRsCi0KLUlOU1RBTEwgPSBASU5TVEFMTEAKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi0KLWwgPSBAbEAKLQotQVIgPSBhcgotQ0MgPSBAQ0NACi1MSUJUT09MID0gQExJQlRPT0xACi1SQU5MSUIgPSBAUkFOTElCQAotCi1ERUZTID0gLURMT0NBTEVESVI9XCIkKGxvY2FsZWRpcilcIiAtREdOVUxPQ0FMRURJUj1cIiQoZ251bG9jYWxlZGlyKVwiIFwKLS1ETE9DQUxFX0FMSUFTX1BBVEg9XCIkKGFsaWFzcGF0aClcIiBAREVGU0AKLUNQUEZMQUdTID0gQENQUEZMQUdTQAotQ0ZMQUdTID0gQENGTEFHU0AKLUxERkxBR1MgPSBATERGTEFHU0AKLQotQ09NUElMRSA9ICQoQ0MpIC1jICQoREVGUykgJChJTkNMVURFUykgJChDUFBGTEFHUykgJChDRkxBR1MpICQoWENGTEFHUykKLQotSEVBREVSUyA9ICQoQ09NSERSUykgbGliZ2V0dGV4dC5oIGxvYWRpbmZvLmgKLUNPTUhEUlMgPSBnZXR0ZXh0LmggZ2V0dGV4dFAuaCBoYXNoLXN0cmluZy5oCi1TT1VSQ0VTID0gJChDT01TUkNTKSBpbnRsLWNvbXBhdC5jIGNhdC1jb21wYXQuYwotQ09NU1JDUyA9IGJpbmR0ZXh0ZG9tLmMgZGNnZXR0ZXh0LmMgZGdldHRleHQuYyBnZXR0ZXh0LmMgXAotZmluZGRvbWFpbi5jIGxvYWRtc2djYXQuYyBsb2NhbGVhbGlhcy5jIHRleHRkb21haW4uYyBsMTBuZmxpc3QuYyBcCi1leHBsb2RlbmFtZS5jCi1PQkpFQ1RTID0gQElOVExPQkpTQCBiaW5kdGV4dGRvbS4kbG8gZGNnZXR0ZXh0LiRsbyBkZ2V0dGV4dC4kbG8gZ2V0dGV4dC4kbG8gXAotZmluZGRvbWFpbi4kbG8gbG9hZG1zZ2NhdC4kbG8gbG9jYWxlYWxpYXMuJGxvIHRleHRkb21haW4uJGxvIGwxMG5mbGlzdC4kbG8gXAotZXhwbG9kZW5hbWUuJGxvCi1DQVRPQkpTID0gY2F0LWNvbXBhdC4kbG8gLi4vcG8vY2F0LWlkLXRibC4kbG8KLUdFVFRPQkpTID0gaW50bC1jb21wYXQuJGxvCi1ESVNURklMRVMuY29tbW9uID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluIGxpbnV4LW1zZy5zZWQgcG8ydGJsLnNlZC5pbiBcCi14b3Blbi1tc2cuc2VkICQoSEVBREVSUykgJChTT1VSQ0VTKQotRElTVEZJTEVTLm5vcm1hbCA9IFZFUlNJT04KLURJU1RGSUxFUy5nZXR0ZXh0ID0gbGliaW50bC5nbGliYyBpbnRsaC5pbnN0LmluCi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLmxvCi0uYy5vOgotCSQoQ09NUElMRSkgJDwKLS5jLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAkPAotCi1JTkNMVURFUyA9IC1JLiAtSSQoc3JjZGlyKQotCi1hbGw6IGFsbC1AVVNFX0lOQ0xVREVEX0xJQklOVExACi0KLWFsbC15ZXM6IGxpYmludGwuJGxhIGludGxoLmluc3QKLWFsbC1ubzoKLWluc3RhbGwtaW5mbzoKLQotbGliaW50bC5hOiAkKE9CSkVDVFMpCi0Jcm0gLWYgJEAKLQkkKEFSKSBjcnUgJEAgJChPQkpFQ1RTKQotCSQoUkFOTElCKSAkQAotCi1saWJpbnRsLmxhOiAkKE9CSkVDVFMpCi0JJChMSUJUT09MKSAtLW1vZGU9bGluayAkKENDKSAkKExERkxBR1MpIC1vICRAICQoT0JKRUNUUykgXAotCQkgICAtdmVyc2lvbi1pbmZvIDE6MCAtcnBhdGggJChsaWJkaXIpCi0KLS4uL3BvL2NhdC1pZC10YmwuJGxvOiAuLi9wby9jYXQtaWQtdGJsLmMgJCh0b3Bfc3JjZGlyKS9wby8kKFBBQ0tBR0UpLnBvdAotCWNkIC4uL3BvICYmICQoTUFLRSkgY2F0LWlkLXRibC4kbG8KLQotY2hlY2s6IGFsbAotCi0jIFRoaXMgaW5zdGFsbGF0aW9uIGdvYWwgaXMgb25seSB1c2VkIGluIEdOVSBnZXR0ZXh0LiAgUGFja2FnZXMgd2hpY2gKLSMgb25seSB1c2UgdGhlIGxpYnJhcnkgc2hvdWxkIHVzZSBpbnN0YWxsIGluc3RlYWQuCi0KLSMgV2UgbXVzdCBub3QgaW5zdGFsbCB0aGUgbGliaW50bC5oL2xpYmludGwuYSBmaWxlcyBpZiB3ZSBhcmUgb24gYQotIyBzeXN0ZW0gd2hpY2ggaGFzIHRoZSBnZXR0ZXh0KCkgZnVuY3Rpb24gaW4gaXRzIEMgbGlicmFyeSBvciBpbiBhCi0jIHNlcGFyYXRlIGxpYnJhcnkgb3IgdXNlIHRoZSBjYXRnZXRzIGludGVyZmFjZS4gIEEgc3BlY2lhbCBjYXNlIGlzCi0jIHdoZXJlIGNvbmZpZ3VyZSBmb3VuZCBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIEdOVSBnZXR0ZXh0IGxpYnJhcnkuCi0jIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgb25lIHdoaWNoIGNvbWVzIHdpdGggdGhpcyB2ZXJzaW9uIG9mIHRoZQotIyBwYWNrYWdlLCB5b3UgaGF2ZSB0byB1c2UgYGNvbmZpZ3VyZSAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCcuCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6IGFsbAotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gImdldHRleHQiIFwKLQkgICAmJiB0ZXN0ICdASU5UTE9CSlNAJyA9ICckKEdFVFRPQkpTKSc7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGxpYmRpcikgJChpbmNsdWRlZGlyKTsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGxpYmRpcikgJChpbmNsdWRlZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSBpbnRsaC5pbnN0ICQoaW5jbHVkZWRpcikvbGliaW50bC5oOyBcCi0JICAkKElOU1RBTExfREFUQSkgbGliaW50bC5hICQobGliZGlyKS9saWJpbnRsLmE7IFwKLQllbHNlIFwKLQkgIDogOyBcCi0JZmkKLWluc3RhbGwtZGF0YTogYWxsCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgVkVSU0lPTiAkKGdldHRleHRzcmNkaXIpL1ZFUlNJT047IFwKLQkgIGRpc3RzPSIkKERJU1RGSUxFUy5jb21tb24pIjsgXAotCSAgZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkZmlsZSAkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCSAgZG9uZTsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQlkaXN0cz0iJChESVNURklMRVMuY29tbW9uKSI7IFwKLQlmb3IgZmlsZSBpbiAkJGRpc3RzOyBkbyBcCi0JICBybSAtZiAkKGdldHRleHRzcmNkaXIpLyQkZmlsZTsgXAotCWRvbmUKLQotaW5mbyBkdmk6Ci0KLSQoT0JKRUNUUyk6IGNvbmZpZy5oIGxpYmdldHRleHQuaAotYmluZHRleHRkb20uJGxvIGZpbmRkb21haW4uJGxvIGxvYWRtc2djYXQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBsb2FkaW5mby5oCi1kY2dldHRleHQuJGxvOiBnZXR0ZXh0UC5oIGdldHRleHQuaCBoYXNoLXN0cmluZy5oIGxvYWRpbmZvLmgKLQotdGFnczogVEFHUwotCi1UQUdTOiAkKEhFQURFUlMpICQoU09VUkNFUykKLQloZXJlPWBwd2RgOyBjZCAkKHNyY2RpcikgJiYgZXRhZ3MgLW8gJCRoZXJlL1RBR1MgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0KLWlkOiBJRAotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpCi0JaGVyZT1gcHdkYDsgY2QgJChzcmNkaXIpICYmIG1raWQgLWYkJGhlcmUvSUQgJChIRUFERVJTKSAkKFNPVVJDRVMpCi0KLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgKi5hICoubyAqLmxvIGNvcmUgY29yZS4qCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgSUQgVEFHUyBwbzJtc2cuc2VkIHBvMnRibC5zZWQgbGliaW50bC5oIGNvbmZpZy5sb2cKLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLQotIyBHTlUgZ2V0dGV4dCBuZWVkcyBub3QgY29udGFpbiB0aGUgZmlsZSBgVkVSU0lPTicgYnV0IGNvbnRhaW5zIHNvbWUKLSMgb3RoZXIgZmlsZXMgd2hpY2ggc2hvdWxkIG5vdCBiZSBkaXN0cmlidXRlZCBpbiBvdGhlciBwYWNrYWdlcy4KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IE1ha2VmaWxlICQoRElTVEZJTEVTKQotCWlmIHRlc3QgIiQoUEFDS0FHRSkiID0gZ2V0dGV4dDsgdGhlbiBcCi0JICBhZGRpdGlvbmFsPSIkKERJU1RGSUxFUy5nZXR0ZXh0KSI7IFwKLQllbHNlIFwKLQkgIGFkZGl0aW9uYWw9IiQoRElTVEZJTEVTLm5vcm1hbCkiOyBcCi0JZmk7IFwKLQlmb3IgZmlsZSBpbiAkKERJU1RGSUxFUy5jb21tb24pICQkYWRkaXRpb25hbDsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotZGlzdC1saWJjOgotCXRhciB6Y3ZmIGludGwtZ2xpYmMudGFyLmd6ICQoQ09NU1JDUykgJChDT01IRFJTKSBsaWJpbnRsLmguZ2xpYmMKLQotTWFrZWZpbGU6IE1ha2VmaWxlLmluIGNvbmZpZy5zdGF0dXMKLQlDT05GSUdfRklMRVM9JEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0jIFRoZSBkZXBlbmRlbmN5IGZvciBpbnRsaC5pbnN0IGlzIGRpZmZlcmVudCBpbiBnZXR0ZXh0IGFuZCBhbGwgb3RoZXIKLSMgcGFja2FnZXMuICBCZWNhdXNlIHdlIGNhbm5vdCB5b3UgR05VIG1ha2UgZmVhdHVyZXMgd2UgaGF2ZSB0byBzb2x2ZQotIyB0aGUgcHJvYmxlbSB3aGlsZSByZXdyaXRpbmcgTWFrZWZpbGUuaW4uCi1AR1RfWUVTQGludGxoLmluc3Q6IGludGxoLmluc3QuaW4gLi4vY29uZmlnLnN0YXR1cwotQEdUX1lFU0AJY2QgLi4gXAotQEdUX1lFU0AJJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS8kQCBDT05GSUdfSEVBREVSUz0gXAotQEdUX1lFU0AJICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLUBHVF9OT0AuUEhPTlk6IGludGxoLmluc3QKLUBHVF9OT0BpbnRsaC5pbnN0OgotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2Ugbm90IHRvIGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9pbnRsL2FjY29uZmlnLmggYi9pbnRsL2FjY29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZjgxZjguLjAwMDAwMDAKLS0tIGEvaW50bC9hY2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZC4gICovCi0jdW5kZWYgRU5BQkxFX05MUwotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSBjYXRnZXRzIGFuZCBkb24ndCB3YW50IHRvIHVzZSBHTlUgZ2V0dGV4dC4gICovCi0jdW5kZWYgSEFWRV9DQVRHRVRTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0dFVFRFWFQKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gICovCi0jdW5kZWYgSEFWRV9MQ19NRVNTQUdFUwpkaWZmIC0tZ2l0IGEvaW50bC9hY2xvY2FsLm00IGIvaW50bC9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU0MzlmLi4wMDAwMDAwCi0tLSBhL2ludGwvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi1kbmwgYWNsb2NhbC5tNCBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBhY2xvY2FsIDEuMwotCi1kbmwgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotZG5sIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi1kbmwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbnMsIGFzIGxvbmcgYXMgdGhpcyBub3RpY2UgaXMgcHJlc2VydmVkLgotCi1kbmwgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1kbmwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLWRubCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBCi1kbmwgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0jIExpa2UgQUNfQ09ORklHX0hFQURFUiwgYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlIHN0YW1wIGZpbGUuCi0KLUFDX0RFRlVOKEFNX0NPTkZJR19IRUFERVIsCi1bQUNfUFJFUkVRKFsyLjEyXSkKLUFDX0NPTkZJR19IRUFERVIoWyQxXSkKLWRubCBXaGVuIGNvbmZpZy5zdGF0dXMgZ2VuZXJhdGVzIGEgaGVhZGVyLCB3ZSBtdXN0IHVwZGF0ZSB0aGUgc3RhbXAtaCBmaWxlLgotZG5sIFRoaXMgZmlsZSByZXNpZGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgY29uZmlnIGhlYWRlcgotZG5sIHRoYXQgaXMgZ2VuZXJhdGVkLiAgV2UgbXVzdCBzdHJpcCBldmVyeXRoaW5nIHBhc3QgdGhlIGZpcnN0ICI6IiwKLWRubCBhbmQgZXZlcnl0aGluZyBwYXN0IHRoZSBsYXN0ICIvIi4KLUFDX09VVFBVVF9DT01NQU5EUyhjaGFuZ2VxdW90ZSg8PCw+PilkbmwKLWlmZWxzZShwYXRzdWJzdCg8PCQxPj4sIDw8W14gXT4+LCA8PD4+KSwgPDw+PiwKLTw8dGVzdCAteiAiPDwkPj5DT05GSUdfSEVBREVSUyIgfHwgZWNobyB0aW1lc3RhbXAgPiBwYXRzdWJzdCg8PCQxPj4sIDw8XlwoW146XSovXCk/Lio+PiwgPDxcMT4+KXN0YW1wLWg8PD4+ZG5sPj4sCi08PGFtX2luZHg9MQotZm9yIGFtX2ZpbGUgaW4gPDwkMT4+OyBkbwotICBjYXNlICIgPDwkPj5DT05GSUdfSEVBREVSUyAiIGluCi0gICoiIDw8JD4+YW1fZmlsZSAiKjw8KT4+Ci0gICAgZWNobyB0aW1lc3RhbXAgPiBgZWNobyA8PCQ+PmFtX2ZpbGUgfCBzZWQgLWUgJ3MlOi4qJSUnIC1lICdzJVteL10qJCUlJ2BzdGFtcC1oJGFtX2luZHgKLSAgICA7OwotICBlc2FjCi0gIGFtX2luZHg9YGV4cHIgIjw8JD4+YW1faW5keCIgKyAxYAotZG9uZTw8Pj5kbmw+PikKLWNoYW5nZXF1b3RlKFssXSkpXSkKLQotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX1BST0dfSU5TVEFMTCwKLVtBQ19SRVFVSVJFKFtBQ19QUk9HX0lOU1RBTExdKQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotQUNfU1VCU1QoSU5TVEFMTF9TQ1JJUFQpZG5sCi1dKQotCi0jIFRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYGdldHRleHQubTQnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUKLSMgaW5jbHVkZWQgbWFjcm9zIGFzc3VtZSBDeWdudXMtc3R5bGUgc291cmNlIGFuZCBidWlsZCB0cmVlcy4KLQotIyBNYWNybyB0byBhZGQgZm9yIHVzaW5nIEdOVSBnZXR0ZXh0LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMwotCi1BQ19ERUZVTihDWV9XSVRIX05MUywKLSAgW0FDX01TR19DSEVDS0lORyhbd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICBkbmwgRGVmYXVsdCBpcyBlbmFibGVkIE5MUwotICAgIEFDX0FSR19FTkFCTEUobmxzLAotICAgICAgWyAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydF0sCi0gICAgICBVU0VfTkxTPSRlbmFibGV2YWwsIFVTRV9OTFM9eWVzKQotICAgIEFDX01TR19SRVNVTFQoJFVTRV9OTFMpCi0gICAgQUNfU1VCU1QoVVNFX05MUykKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICBkbmwgSWYgd2UgdXNlIE5MUyBmaWd1cmUgb3V0IHdoYXQgbWV0aG9kCi0gICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIEFDX0RFRklORShFTkFCTEVfTkxTKQotICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX0FSR19XSVRIKGluY2x1ZGVkLWdldHRleHQsCi0gICAgICAgIFsgIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlXSwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbCwKLSAgICAgICAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD1ubykKLSAgICAgIEFDX01TR19SRVNVTFQoJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQpCi0KLSAgICAgIG5sc19jdl91c2VfZ251X2dldHRleHQ9IiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IgotICAgICAgaWYgdGVzdCAiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiICE9ICJ5ZXMiOyB0aGVuCi0gICAgICAgIGRubCBVc2VyIGRvZXMgbm90IGluc2lzdCBvbiB1c2luZyBHTlUgTkxTIGxpYnJhcnkuICBGaWd1cmUgb3V0IHdoYXQKLSAgICAgICAgZG5sIHRvIHVzZS4gIElmIGdldHRleHQgb3IgY2F0Z2V0cyBhcmUgYXZhaWxhYmxlIChpbiB0aGlzIG9yZGVyKSB3ZQotICAgICAgICBkbmwgdXNlIHRoaXMuICBFbHNlIHdlIGhhdmUgdG8gZmFsbCBiYWNrIHRvIEdOVSBOTFMgbGlicmFyeS4KLQlkbmwgY2F0Z2V0cyBpcyBvbmx5IHVzZWQgaWYgcGVybWl0dGVkIGJ5IG9wdGlvbiAtLXdpdGgtY2F0Z2V0cy4KLQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JQUNfQ0hFQ0tfSEVBREVSKGxpYmludGwuaCwKLQkgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliY10sIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjLAotCSAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsaWJpbnRsLmg+XSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCSAgICAgICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMsIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vKV0pCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBBQ19DSEVDS19MSUIoaW50bCwgYmluZHRleHRkb21haW4sCi0JICAgICAgIFtBQ19DQUNIRV9DSEVDSyhbZm9yIGdldHRleHQgaW4gbGliaW50bF0sCi0JCSBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCwKLQkJIFtBQ19UUllfTElOSyhbXSwgW3JldHVybiAoaW50KSBnZXR0ZXh0ICgiIildLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8pXSldKQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIEFDX0RFRklORShIQVZFX0dFVFRFWFQpCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTKQotICAgIGZpCi0gIGZpXSkKLQpkaWZmIC0tZ2l0IGEvaW50bC9iaW5kdGV4dGRvbS5jIGIvaW50bC9iaW5kdGV4dGRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmNiOGQ5Li4wMDAwMDAwCi0tLSBhL2ludGwvYmluZHRleHRkb20uYworKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYmluZHRleHRkb21haW4oMykgZnVuY3Rpb24KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgX25sX2RlZmF1bHRfZGlybmFtZVtdOwotCi0vKiBMaXN0IHdpdGggYmluZGluZ3Mgb2Ygc3BlY2lmaWMgZG9tYWlucy4gICovCi1leHRlcm4gc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7Ci0KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBCSU5EVEVYVERPTUFJTiBfX2JpbmR0ZXh0ZG9tYWluCi0jIGRlZmluZSBzdHJkdXAoc3RyKSBfX3N0cmR1cCAoc3RyKQotI2Vsc2UKLSMgZGVmaW5lIEJJTkRURVhURE9NQUlOIGJpbmR0ZXh0ZG9tYWluX18KLSNlbmRpZgotCi0vKiBTcGVjaWZ5IHRoYXQgdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIHdpbGwgYmUgZm91bmQKLSAgIGluIERJUk5BTUUgcmF0aGVyIHRoYW4gaW4gdGhlIHN5c3RlbSBsb2NhbGUgZGF0YSBiYXNlLiAgKi8KLWNoYXIgKgotQklORFRFWFRET01BSU4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci17Ci0gIHN0cnVjdCBiaW5kaW5nICpiaW5kaW5nOwotCi0gIC8qIFNvbWUgc2FuaXR5IGNoZWNrcy4gICovCi0gIGlmIChkb21haW5uYW1lID09IE5VTEwgfHwgZG9tYWlubmFtZVswXSA9PSAnXDAnKQotICAgIHJldHVybiBOVUxMOwotCi0gIGZvciAoYmluZGluZyA9IF9ubF9kb21haW5fYmluZGluZ3M7IGJpbmRpbmcgIT0gTlVMTDsgYmluZGluZyA9IGJpbmRpbmctPm5leHQpCi0gICAgewotICAgICAgaW50IGNvbXBhcmUgPSBzdHJjbXAgKGRvbWFpbm5hbWUsIGJpbmRpbmctPmRvbWFpbm5hbWUpOwotICAgICAgaWYgKGNvbXBhcmUgPT0gMCkKLQkvKiBXZSBmb3VuZCBpdCEgICovCi0JYnJlYWs7Ci0gICAgICBpZiAoY29tcGFyZSA8IDApCi0JewotCSAgLyogSXQgaXMgbm90IGluIHRoZSBsaXN0LiAgKi8KLQkgIGJpbmRpbmcgPSBOVUxMOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICBpZiAoZGlybmFtZSA9PSBOVUxMKQotICAgIC8qIFRoZSBjdXJyZW50IGJpbmRpbmcgaGFzIGJlIHRvIHJldHVybmVkLiAgKi8KLSAgICByZXR1cm4gYmluZGluZyA9PSBOVUxMID8gKGNoYXIgKikgX25sX2RlZmF1bHRfZGlybmFtZSA6IGJpbmRpbmctPmRpcm5hbWU7Ci0KLSAgaWYgKGJpbmRpbmcgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBUaGUgZG9tYWluIGlzIGFscmVhZHkgYm91bmQuICBJZiB0aGUgbmV3IHZhbHVlIGFuZCB0aGUgb2xkCi0JIG9uZSBhcmUgZXF1YWwgd2Ugc2ltcGx5IGRvIG5vdGhpbmcuICBPdGhlcndpc2UgcmVwbGFjZSB0aGUKLQkgb2xkIGJpbmRpbmcuICAqLwotICAgICAgaWYgKHN0cmNtcCAoZGlybmFtZSwgYmluZGluZy0+ZGlybmFtZSkgIT0gMCkKLQl7Ci0JICBjaGFyICpuZXdfZGlybmFtZTsKLQotCSAgaWYgKHN0cmNtcCAoZGlybmFtZSwgX25sX2RlZmF1bHRfZGlybmFtZSkgPT0gMCkKLQkgICAgbmV3X2Rpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotCSAgZWxzZQotCSAgICB7Ci0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0JICAgICAgbmV3X2Rpcm5hbWUgPSBzdHJkdXAgKGRpcm5hbWUpOwotCSAgICAgIGlmIChuZXdfZGlybmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0JICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoZGlybmFtZSkgKyAxOwotCSAgICAgIG5ld19kaXJuYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmIChuZXdfZGlybmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCSAgICAgIG1lbWNweSAobmV3X2Rpcm5hbWUsIGRpcm5hbWUsIGxlbik7Ci0jZW5kaWYKLQkgICAgfQotCi0JICBpZiAoYmluZGluZy0+ZGlybmFtZSAhPSBfbmxfZGVmYXVsdF9kaXJuYW1lKQotCSAgICBmcmVlIChiaW5kaW5nLT5kaXJuYW1lKTsKLQotCSAgYmluZGluZy0+ZGlybmFtZSA9IG5ld19kaXJuYW1lOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIHRvIGNyZWF0ZSBhIG5ldyBiaW5kaW5nLiAgKi8KLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBzdHJ1Y3QgYmluZGluZyAqbmV3X2JpbmRpbmcgPQotCShzdHJ1Y3QgYmluZGluZyAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld19iaW5kaW5nKSk7Ci0KLSAgICAgIGlmIChuZXdfYmluZGluZyA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSRFVQCi0gICAgICBuZXdfYmluZGluZy0+ZG9tYWlubmFtZSA9IHN0cmR1cCAoZG9tYWlubmFtZSk7Ci0gICAgICBpZiAobmV3X2JpbmRpbmctPmRvbWFpbm5hbWUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSNlbHNlCi0gICAgICBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKLSAgICAgIG5ld19iaW5kaW5nLT5kb21haW5uYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0gICAgICBtZW1jcHkgKG5ld19iaW5kaW5nLT5kb21haW5uYW1lLCBkb21haW5uYW1lLCBsZW4pOwotI2VuZGlmCi0KLSAgICAgIGlmIChzdHJjbXAgKGRpcm5hbWUsIF9ubF9kZWZhdWx0X2Rpcm5hbWUpID09IDApCi0JbmV3X2JpbmRpbmctPmRpcm5hbWUgPSAoY2hhciAqKSBfbmxfZGVmYXVsdF9kaXJuYW1lOwotICAgICAgZWxzZQotCXsKLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9TVFJEVVAKLQkgIG5ld19iaW5kaW5nLT5kaXJuYW1lID0gc3RyZHVwIChkaXJuYW1lKTsKLQkgIGlmIChuZXdfYmluZGluZy0+ZGlybmFtZSA9PSBOVUxMKQotCSAgICByZXR1cm4gTlVMTDsKLSNlbHNlCi0JICBsZW4gPSBzdHJsZW4gKGRpcm5hbWUpICsgMTsKLQkgIG5ld19iaW5kaW5nLT5kaXJuYW1lID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgaWYgKG5ld19iaW5kaW5nLT5kaXJuYW1lID09IE5VTEwpCi0JICAgIHJldHVybiBOVUxMOwotCSAgbWVtY3B5IChuZXdfYmluZGluZy0+ZGlybmFtZSwgZGlybmFtZSwgbGVuKTsKLSNlbmRpZgotCX0KLQotICAgICAgLyogTm93IGVucXVldWUgaXQuICAqLwotICAgICAgaWYgKF9ubF9kb21haW5fYmluZGluZ3MgPT0gTlVMTAotCSAgfHwgc3RyY21wIChkb21haW5uYW1lLCBfbmxfZG9tYWluX2JpbmRpbmdzLT5kb21haW5uYW1lKSA8IDApCi0JewotCSAgbmV3X2JpbmRpbmctPm5leHQgPSBfbmxfZG9tYWluX2JpbmRpbmdzOwotCSAgX25sX2RvbWFpbl9iaW5kaW5ncyA9IG5ld19iaW5kaW5nOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsKLQkgIHdoaWxlIChiaW5kaW5nLT5uZXh0ICE9IE5VTEwKLQkJICYmIHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+bmV4dC0+ZG9tYWlubmFtZSkgPiAwKQotCSAgICBiaW5kaW5nID0gYmluZGluZy0+bmV4dDsKLQotCSAgbmV3X2JpbmRpbmctPm5leHQgPSBiaW5kaW5nLT5uZXh0OwotCSAgYmluZGluZy0+bmV4dCA9IG5ld19iaW5kaW5nOwotCX0KLQotICAgICAgYmluZGluZyA9IG5ld19iaW5kaW5nOwotICAgIH0KLQotICByZXR1cm4gYmluZGluZy0+ZGlybmFtZTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fYmluZHRleHRkb21haW4sIGJpbmR0ZXh0ZG9tYWluKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9jYXQtY29tcGF0LmMgYi9pbnRsL2NhdC1jb21wYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3ZDkwMS4uMDAwMDAwMAotLS0gYS9pbnRsL2NhdC1jb21wYXQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKiBDb21wYXRpYmlsaXR5IGNvZGUgZm9yIGdldHRleHQtdXNpbmctY2F0Z2V0cyBpbnRlcmZhY2UuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWZkZWYgU1REQ19IRUFERVJTCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi1jaGFyICpnZXRlbnYgKCk7Ci0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX05MX1RZUEVTX0gKLSMgaW5jbHVkZSA8bmxfdHlwZXMuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mIGBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6Ci0gICBgYERpcmVjdHMgYHNldGxvY2FsZSgpJyB0byBxdWVyeSBgY2F0ZWdvcnknIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAgc2V0dGluZyBvZiBgbG9jYWwnLicnCi0gICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIEFuZCBldmVuIHdvcnNlOiBQT1NJWAotICAgZGVmaW5lcyB0aGlzIG5vdCBhdCBhbGwuICBTbyB3ZSBjYW4gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IG9uIHNlbGVjdGVkCi0gICBzeXN0ZW0gKGUuZy4gdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBIQVZFX0xPQ0FMRV9OVUxMCi0jZW5kaWYKLQotLyogVGhlIGNhdGFsb2cgZGVzY3JpcHRvci4gICovCi1zdGF0aWMgbmxfY2F0ZCBjYXRhbG9nID0gKG5sX2NhdGQpIC0xOwotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IGNhdGFsb2cuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdF9jYXRhbG9nX25hbWVbXSA9ICJtZXNzYWdlcyI7Ci0KLS8qIE5hbWUgb2YgY3VycmVudGx5IHVzZWQgY2F0YWxvZy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY2F0YWxvZ19uYW1lID0gZGVmYXVsdF9jYXRhbG9nX25hbWU7Ci0KLS8qIEdldCBJRCBmb3IgZ2l2ZW4gc3RyaW5nLiAgSWYgbm90IGZvdW5kIHJldHVybiAtMS4gICovCi1zdGF0aWMgaW50IG1zZ190b19jYXRfaWQgUEFSQU1TICgoY29uc3QgY2hhciAqbXNnKSk7Ci0KLS8qIFN1YnN0aXR1dGlvbiBmb3Igc3lzdGVtcyBsYWNraW5nIHRoaXMgZnVuY3Rpb24gaW4gdGhlaXIgQyBsaWJyYXJ5LiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOwotI2VuZGlmCi0KLQotLyogU2V0IGN1cnJlbnRseSB1c2VkIGRvbWFpbi9jYXRhbG9nLiAgKi8KLWNoYXIgKgotdGV4dGRvbWFpbiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgbmxfY2F0ZCBuZXdfY2F0YWxvZzsKLSAgY2hhciAqbmV3X25hbWU7Ci0gIHNpemVfdCBuZXdfbmFtZV9sZW47Ci0gIGNoYXIgKmxhbmc7Ci0KLSNpZiBkZWZpbmVkIEhBVkVfU0VUTE9DQUxFICYmIGRlZmluZWQgSEFWRV9MQ19NRVNTQUdFUyBcCi0gICAgJiYgZGVmaW5lZCBIQVZFX0xPQ0FMRV9OVUxMCi0gIGxhbmcgPSBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCBOVUxMKTsKLSNlbHNlCi0gIGxhbmcgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgaWYgKGxhbmcgPT0gTlVMTCB8fCBsYW5nWzBdID09ICdcMCcpCi0gICAgewotICAgICAgbGFuZyA9IGdldGVudiAoIkxDX01FU1NBR0VTIik7Ci0gICAgICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLQlsYW5nID0gZ2V0ZW52ICgiTEFORyIpOwotICAgIH0KLSNlbmRpZgotICBpZiAobGFuZyA9PSBOVUxMIHx8IGxhbmdbMF0gPT0gJ1wwJykKLSAgICBsYW5nID0gIkMiOwotCi0gIC8qIFNlZSB3aGV0aGVyIG5hbWUgb2YgY3VycmVudGx5IHVzZWQgZG9tYWluIGlzIGFza2VkLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gKGNoYXIgKikgY2F0YWxvZ19uYW1lOwotCi0gIGlmIChkb21haW5uYW1lWzBdID09ICdcMCcpCi0gICAgZG9tYWlubmFtZSA9IGRlZmF1bHRfY2F0YWxvZ19uYW1lOwotCi0gIC8qIENvbXB1dGUgbGVuZ3RoIG9mIGFkZGVkIHBhdGggZWxlbWVudC4gICovCi0gIG5ld19uYW1lX2xlbiA9IHNpemVvZiAoTE9DQUxFRElSKSAtIDEgKyAxICsgc3RybGVuIChsYW5nKQotCQkgKyBzaXplb2YgKCIvTENfTUVTU0FHRVMvIikgLSAxICsgc2l6ZW9mIChQQUNLQUdFKSAtIDEKLQkJICsgc2l6ZW9mICgiLmNhdCIpOwotCi0gIG5ld19uYW1lID0gKGNoYXIgKikgbWFsbG9jIChuZXdfbmFtZV9sZW4pOwotICBpZiAobmV3X25hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzdHJjcHkgKG5ld19uYW1lLCBQQUNLQUdFKTsKLSAgbmV3X2NhdGFsb2cgPSBjYXRvcGVuIChuZXdfbmFtZSwgMCk7Ci0KLSAgaWYgKG5ld19jYXRhbG9nID09IChubF9jYXRkKSAtMSkKLSAgICB7Ci0gICAgICAvKiBOTFNQQVRIIHNlYXJjaCBkaWRuJ3Qgd29yaywgdHJ5IGFic29sdXRlIHBhdGggKi8KLSAgICAgIHNwcmludGYgKG5ld19uYW1lLCAiJXMvJXMvTENfTUVTU0FHRVMvJXMuY2F0IiwgTE9DQUxFRElSLCBsYW5nLAotCSAgICAgICBQQUNLQUdFKTsKLSAgICAgIG5ld19jYXRhbG9nID0gY2F0b3BlbiAobmV3X25hbWUsIDApOwotCi0gICAgICBpZiAobmV3X2NhdGFsb2cgPT0gKG5sX2NhdGQpIC0xKQotCXsKLQkgIGZyZWUgKG5ld19uYW1lKTsKLQkgIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci0JfQotICAgIH0KLQotICAvKiBDbG9zZSBvbGQgY2F0YWxvZy4gICovCi0gIGlmIChjYXRhbG9nICE9IChubF9jYXRkKSAtMSkKLSAgICBjYXRjbG9zZSAoY2F0YWxvZyk7Ci0gIGlmIChjYXRhbG9nX25hbWUgIT0gZGVmYXVsdF9jYXRhbG9nX25hbWUpCi0gICAgZnJlZSAoKGNoYXIgKikgY2F0YWxvZ19uYW1lKTsKLQotICBjYXRhbG9nID0gbmV3X2NhdGFsb2c7Ci0gIGNhdGFsb2dfbmFtZSA9IG5ld19uYW1lOwotCi0gIHJldHVybiAoY2hhciAqKSBjYXRhbG9nX25hbWU7Ci19Ci0KLWNoYXIgKgotYmluZHRleHRkb21haW4gKGRvbWFpbm5hbWUsIGRpcm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci17Ci0jaWYgSEFWRV9TRVRFTlYgfHwgSEFWRV9QVVRFTlYKLSAgY2hhciAqb2xkX3ZhbCwgKm5ld192YWwsICpjcDsKLSAgc2l6ZV90IG5ld192YWxfbGVuOwotCi0gIC8qIFRoaXMgZG9lcyBub3QgbWFrZSBtdWNoIHNlbnNlIGhlcmUgYnV0IHRvIGJlIGNvbXBhdGlibGUgZG8gaXQuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIENvbXB1dGUgbGVuZ3RoIG9mIGFkZGVkIHBhdGggZWxlbWVudC4gIElmIHdlIHVzZSBzZXRlbnYgd2UgZG9uJ3QgbmVlZAotICAgICB0aGUgZmlyc3QgYnl0cyBmb3IgTkxTUEFUSD0sIGJ1dCB3aHkgY29tcGxpY2F0ZSB0aGUgY29kZSBmb3IgdGhpcwotICAgICBwZWFudXRzLiAgKi8KLSAgbmV3X3ZhbF9sZW4gPSBzaXplb2YgKCJOTFNQQVRIPSIpIC0gMSArIHN0cmxlbiAoZGlybmFtZSkKLQkJKyBzaXplb2YgKCIvJUwvTENfTUVTU0FHRVMvJU4uY2F0Iik7Ci0KLSAgb2xkX3ZhbCA9IGdldGVudiAoIk5MU1BBVEgiKTsKLSAgaWYgKG9sZF92YWwgPT0gTlVMTCB8fCBvbGRfdmFsWzBdID09ICdcMCcpCi0gICAgewotICAgICAgb2xkX3ZhbCA9IE5VTEw7Ci0gICAgICBuZXdfdmFsX2xlbiArPSAxICsgc2l6ZW9mIChMT0NBTEVESVIpIC0gMQotCSAgICAgICAgICAgICArIHNpemVvZiAoIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBuZXdfdmFsX2xlbiArPSBzdHJsZW4gKG9sZF92YWwpOwotCi0gIG5ld192YWwgPSAoY2hhciAqKSBtYWxsb2MgKG5ld192YWxfbGVuKTsKLSAgaWYgKG5ld192YWwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotIyBpZiBIQVZFX1NFVEVOVgotICBjcCA9IG5ld192YWw7Ci0jIGVsc2UKLSAgY3AgPSBzdHBjcHkgKG5ld192YWwsICJOTFNQQVRIPSIpOwotIyBlbmRpZgotCi0gIGNwID0gc3RwY3B5IChjcCwgZGlybmFtZSk7Ci0gIGNwID0gc3RwY3B5IChjcCwgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQ6Iik7Ci0KLSAgaWYgKG9sZF92YWwgPT0gTlVMTCkKLSAgICB7Ci0jIGlmIF9fU1REQ19fCi0gICAgICBzdHBjcHkgKGNwLCBMT0NBTEVESVIgIi8lTC9MQ19NRVNTQUdFUy8lTi5jYXQiKTsKLSMgZWxzZQotCi0gICAgICBjcCA9IHN0cGNweSAoY3AsIExPQ0FMRURJUik7Ci0gICAgICBzdHBjcHkgKGNwLCAiLyVML0xDX01FU1NBR0VTLyVOLmNhdCIpOwotIyBlbmRpZgotICAgIH0KLSAgZWxzZQotICAgIHN0cGNweSAoY3AsIG9sZF92YWwpOwotCi0jIGlmIEhBVkVfU0VURU5WCi0gIHNldGVudiAoIk5MU1BBVEgiLCBuZXdfdmFsLCAxKTsKLSAgZnJlZSAobmV3X3ZhbCk7Ci0jIGVsc2UKLSAgcHV0ZW52IChuZXdfdmFsKTsKLSAgLyogRG8gKm5vdCogZnJlZSB0aGUgZW52aXJvbm1lbnQgZW50cnkgd2UganVzdCBlbnRlcmVkLiAgSXQgaXMgdXNlZAotICAgICBmcm9tIG5vdyBvbi4gICAqLwotIyBlbmRpZgotCi0jZW5kaWYKLQotICByZXR1cm4gKGNoYXIgKikgZG9tYWlubmFtZTsKLX0KLQotI3VuZGVmIGdldHRleHQKLWNoYXIgKgotZ2V0dGV4dCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBtc2dpZDsKLQotICBpZiAobXNnID09IE5VTEwgfHwgY2F0YWxvZyA9PSAobmxfY2F0ZCkgLTEpCi0gICAgcmV0dXJuIChjaGFyICopIG1zZzsKLQotICAvKiBHZXQgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgY2F0YWxvZy4gIFdlIGFsd2F5cyB1c2Ugc2V0IG51bWJlciAxLgotICAgICBUaGUgbWVzc2FnZSBJRCBpcyBjb21wdXRlZCBieSB0aGUgZnVuY3Rpb24gYG1zZ190b19jYXRfaWQnCi0gICAgIHdoaWNoIHdvcmtzIG9uIHRoZSB0YWJsZSBnZW5lcmF0ZWQgYnkgYHBvLXRvLXRibCcuICAqLwotICBtc2dpZCA9IG1zZ190b19jYXRfaWQgKG1zZyk7Ci0gIGlmIChtc2dpZCA9PSAtMSkKLSAgICByZXR1cm4gKGNoYXIgKikgbXNnOwotCi0gIHJldHVybiBjYXRnZXRzIChjYXRhbG9nLCAxLCBtc2dpZCwgKGNoYXIgKikgbXNnKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIHRoZSB0YWJsZSBgX21zZ190YmwnIHdoaWNoIGhhcyBgX21zZ190YmxfbGVuZ3RoJyBlbnRyaWVzCi0gICBmb3IgdGhlIG9uZSBlcXVhbCB0byBtc2cuICBJZiBpdCBpcyBmb3VuZCByZXR1cm4gdGhlIElELiAgSW4gY2FzZSB3aGVuCi0gICB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZCByZXR1cm4gLTEuICAqLwotc3RhdGljIGludAotbXNnX3RvX2NhdF9pZCAobXNnKQotICAgICBjb25zdCBjaGFyICptc2c7Ci17Ci0gIGludCBjbnQ7Ci0KLSAgZm9yIChjbnQgPSAwOyBjbnQgPCBfbXNnX3RibF9sZW5ndGg7ICsrY250KQotICAgIGlmIChzdHJjbXAgKG1zZywgX21zZ190YmxbY250XS5fbXNnKSA9PSAwKQotICAgICAgcmV0dXJuIF9tc2dfdGJsW2NudF0uX21zZ19udW1iZXI7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvY29uZmlnLmluIGIvaW50bC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhOTA0OWIuLjAwMDAwMDAKLS0tIGEvaW50bC9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICAqLwotI3VuZGVmIGNvbnN0Ci0KLS8qIERlZmluZSB0byBvbmUgb2YgX2dldGI2NywgR0VUQjY3LCBnZXRiNjcgZm9yIENyYXktMiBhbmQgQ3JheS1ZTVAgc3lzdGVtcy4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGFsbG9jYS5jIHN1cHBvcnQgb24gdGhvc2Ugc3lzdGVtcy4gICovCi0jdW5kZWYgQ1JBWV9TVEFDS1NFR19FTkQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGFsbG9jYSwgYXMgYSBmdW5jdGlvbiBvciBtYWNyby4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0EKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIDxhbGxvY2EuaD4gYW5kIGl0IHNob3VsZCBiZSB1c2VkIChub3Qgb24gVWx0cml4KS4gICovCi0jdW5kZWYgSEFWRV9BTExPQ0FfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB3b3JraW5nIGBtbWFwJyBzeXN0ZW0gY2FsbC4gICovCi0jdW5kZWYgSEFWRV9NTUFQCi0KLS8qIERlZmluZSBhcyBfX2lubGluZSBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlciBjYWxscyBpdC4gICovCi0jdW5kZWYgaW5saW5lCi0KLS8qIERlZmluZSB0byBgbG9uZycgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgb2ZmX3QKLQotLyogRGVmaW5lIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBzdGF0IGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gICovCi0jdW5kZWYgX1BPU0lYX1NPVVJDRQotCi0vKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAgKi8KLSN1bmRlZiBzaXplX3QKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkLiAgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGNhdGdldHMgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAgKi8KLSN1bmRlZiBIQVZFX0NBVEdFVFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCi0vKiBEZWZpbmUgYXMgMSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAgKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X2NvdW50IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9DT1VOVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9uZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9ORVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X3N0cmluZ2lmeSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfU1RSSU5HSUZZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZGNnZXR0ZXh0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0RDR0VUVEVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGN3ZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRDV0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRwYWdlc2l6ZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9HRVRQQUdFU0laRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG11bm1hcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NVU5NQVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwdXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUFVURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGxvY2FsZSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRMT0NBTEUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RQQ1BZCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2FzZWNtcCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDQVNFQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNIUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxhcmd6Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0FSR1pfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTElNSVRTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bG9jYWxlLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0xPQ0FMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG1hbGxvYy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9NQUxMT0NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxubF90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9OTF9UWVBFU19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGkgbGlicmFyeSAoLWxpKS4gICovCi0jdW5kZWYgSEFWRV9MSUJJCmRpZmYgLS1naXQgYS9pbnRsL2NvbmZpZ3VyZSBiL2ludGwvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNDFlZWEwLi4wMDAwMDAwCi0tLSBhL2ludGwvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMjk1MCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEgCi0jIENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotIyBEZWZhdWx0czoKLWFjX2hlbHA9Ci1hY19kZWZhdWx0X3ByZWZpeD0vdXNyL2xvY2FsCi0jIEFueSBhZGRpdGlvbnMgZnJvbSBjb25maWd1cmUuaW46Ci1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi0KLSMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KLSMgVGhlIHZhcmlhYmxlcyBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIHRoZSBvcHRpb25zLCB3aXRoCi0jIGRhc2hlcyBjaGFuZ2VkIHRvIHVuZGVybGluZXMuCi1idWlsZD1OT05FCi1jYWNoZV9maWxlPS4vY29uZmlnLmNhY2hlCi1leGVjX3ByZWZpeD1OT05FCi1ob3N0PU5PTkUKLW5vX2NyZWF0ZT0KLW5vbm9wdD1OT05FCi1ub19yZWN1cnNpb249Ci1wcmVmaXg9Tk9ORQotcHJvZ3JhbV9wcmVmaXg9Tk9ORQotcHJvZ3JhbV9zdWZmaXg9Tk9ORQotcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT1zLHgseCwKLXNpbGVudD0KLXNpdGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tdmVyc2lvbiAgICAgICAgICAgICAgIHByaW50IHRoZSB2ZXJzaW9uIG9mIGF1dG9jb25mIHRoYXQgY3JlYXRlZCBjb25maWd1cmUKLURpcmVjdG9yeSBhbmQgZmlsZSBuYW1lczoKLSAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMgaW4gUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFskYWNfZGVmYXVsdF9wcmVmaXhdCi0gIC0tZXhlYy1wcmVmaXg9RVBSRUZJWCAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBmaWxlcyBpbiBFUFJFRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtzYW1lIGFzIHByZWZpeF0KLSAgLS1iaW5kaXI9RElSICAgICAgICAgICAgdXNlciBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvYmluXQotICAtLXNiaW5kaXI9RElSICAgICAgICAgICBzeXN0ZW0gYWRtaW4gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL3NiaW5dCi0gIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2xpYmV4ZWNdCi0gIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9zaGFyZV0KLSAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvZXRjXQotICAtLXNoYXJlZHN0YXRlZGlyPURJUiAgICBtb2RpZmlhYmxlIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL2NvbV0KLSAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL3Zhcl0KLSAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIGluIERJUiBbRVBSRUZJWC9saWJdCi0gIC0taW5jbHVkZWRpcj1ESVIgICAgICAgIEMgaGVhZGVyIGZpbGVzIGluIERJUiBbUFJFRklYL2luY2x1ZGVdCi0gIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIGluIERJUiBbL3Vzci9pbmNsdWRlXQotICAtLWluZm9kaXI9RElSICAgICAgICAgICBpbmZvIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvaW5mb10KLSAgLS1tYW5kaXI9RElSICAgICAgICAgICAgbWFuIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvbWFuXQotICAtLXNyY2Rpcj1ESVIgICAgICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciAuLl0KLSAgLS1wcm9ncmFtLXByZWZpeD1QUkVGSVggcHJlcGVuZCBQUkVGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVggYXBwZW5kIFNVRkZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9UFJPR1JBTQotICAgICAgICAgICAgICAgICAgICAgICAgICBydW4gc2VkIFBST0dSQU0gb24gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLUVPRgotICAgIGNhdCA8PCBFT0YKLUhvc3QgdHlwZToKLSAgLS1idWlsZD1CVUlMRCAgICAgICAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbQlVJTEQ9SE9TVF0KLSAgLS1ob3N0PUhPU1QgICAgICAgICAgICAgY29uZmlndXJlIGZvciBIT1NUIFtndWVzc2VkXQotICAtLXRhcmdldD1UQVJHRVQgICAgICAgICBjb25maWd1cmUgZm9yIFRBUkdFVCBbVEFSR0VUPUhPU1RdCi1GZWF0dXJlcyBhbmQgcGFja2FnZXM6Ci0gIC0tZGlzYWJsZS1GRUFUVVJFICAgICAgIGRvIG5vdCBpbmNsdWRlIEZFQVRVUkUgKHNhbWUgYXMgLS1lbmFibGUtRkVBVFVSRT1ubykKLSAgLS1lbmFibGUtRkVBVFVSRVs9QVJHXSAgaW5jbHVkZSBGRUFUVVJFIFtBUkc9eWVzXQotICAtLXdpdGgtUEFDS0FHRVs9QVJHXSAgICB1c2UgUEFDS0FHRSBbQVJHPXllc10KLSAgLS13aXRob3V0LVBBQ0tBR0UgICAgICAgZG8gbm90IHVzZSBQQUNLQUdFIChzYW1lIGFzIC0td2l0aC1QQUNLQUdFPW5vKQotICAtLXgtaW5jbHVkZXM9RElSICAgICAgICBYIGluY2x1ZGUgZmlsZXMgYXJlIGluIERJUgotICAtLXgtbGlicmFyaWVzPURJUiAgICAgICBYIGxpYnJhcnkgZmlsZXMgYXJlIGluIERJUgotRU9GCi0gICAgaWYgdGVzdCAtbiAiJGFjX2hlbHAiOyB0aGVuCi0gICAgICBlY2hvICItLWVuYWJsZSBhbmQgLS13aXRoIG9wdGlvbnMgcmVjb2duaXplZDokYWNfaGVscCIKLSAgICBmaQotICAgIGV4aXQgMCA7OwotCi0gIC1ob3N0IHwgLS1ob3N0IHwgLS1ob3MgfCAtLWhvKQotICAgIGFjX3ByZXY9aG9zdCA7OwotICAtaG9zdD0qIHwgLS1ob3N0PSogfCAtLWhvcz0qIHwgLS1obz0qKQotICAgIGhvc3Q9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaXIgfCAtLWluY2x1ZGVkaSB8IC0taW5jbHVkZWQgfCAtLWluY2x1ZGUgXAotICB8IC0taW5jbHVkIHwgLS1pbmNsdSB8IC0taW5jbCB8IC0taW5jKQotICAgIGFjX3ByZXY9aW5jbHVkZWRpciA7OwotICAtaW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaT0qIHwgLS1pbmNsdWRlZD0qIHwgLS1pbmNsdWRlPSogXAotICB8IC0taW5jbHVkPSogfCAtLWluY2x1PSogfCAtLWluY2w9KiB8IC0taW5jPSopCi0gICAgaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQotICAgIGFjX3ByZXY9aW5mb2RpciA7OwotICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQotICAgIGluZm9kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmRpciB8IC0tbGliZGlyIHwgLS1saWJkaSB8IC0tbGliZCkKLSAgICBhY19wcmV2PWxpYmRpciA7OwotICAtbGliZGlyPSogfCAtLWxpYmRpcj0qIHwgLS1saWJkaT0qIHwgLS1saWJkPSopCi0gICAgbGliZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJleGVjZGlyIHwgLS1saWJleGVjZGlyIHwgLS1saWJleGVjZGkgfCAtLWxpYmV4ZWNkIHwgLS1saWJleGVjIFwKLSAgfCAtLWxpYmV4ZSB8IC0tbGliZXggfCAtLWxpYmUpCi0gICAgYWNfcHJldj1saWJleGVjZGlyIDs7Ci0gIC1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2RpPSogfCAtLWxpYmV4ZWNkPSogfCAtLWxpYmV4ZWM9KiBcCi0gIHwgLS1saWJleGU9KiB8IC0tbGliZXg9KiB8IC0tbGliZT0qKQotICAgIGxpYmV4ZWNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaXIgfCAtLWxvY2Fsc3RhdGVkaSB8IC0tbG9jYWxzdGF0ZWQgXAotICB8IC0tbG9jYWxzdGF0ZSB8IC0tbG9jYWxzdGF0IHwgLS1sb2NhbHN0YSB8IC0tbG9jYWxzdCBcCi0gIHwgLS1sb2NhbHMgfCAtLWxvY2FsIHwgLS1sb2NhIHwgLS1sb2MgfCAtLWxvKQotICAgIGFjX3ByZXY9bG9jYWxzdGF0ZWRpciA7OwotICAtbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaT0qIHwgLS1sb2NhbHN0YXRlZD0qIFwKLSAgfCAtLWxvY2Fsc3RhdGU9KiB8IC0tbG9jYWxzdGF0PSogfCAtLWxvY2Fsc3RhPSogfCAtLWxvY2Fsc3Q9KiBcCi0gIHwgLS1sb2NhbHM9KiB8IC0tbG9jYWw9KiB8IC0tbG9jYT0qIHwgLS1sb2M9KiB8IC0tbG89KikKLSAgICBsb2NhbHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1tYW5kaXIgfCAtLW1hbmRpciB8IC0tbWFuZGkgfCAtLW1hbmQgfCAtLW1hbiB8IC0tbWEgfCAtLW0pCi0gICAgYWNfcHJldj1tYW5kaXIgOzsKLSAgLW1hbmRpcj0qIHwgLS1tYW5kaXI9KiB8IC0tbWFuZGk9KiB8IC0tbWFuZD0qIHwgLS1tYW49KiB8IC0tbWE9KiB8IC0tbT0qKQotICAgIG1hbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbmZwIHwgLS1uZnAgfCAtLW5mKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGhvdXQtZnAuCi0gICAgd2l0aF9mcD1ubyA7OwotCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykKLSAgICBub19jcmVhdGU9eWVzIDs7Ci0KLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKQotICAgIG5vX3JlY3Vyc2lvbj15ZXMgOzsKLQotICAtb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpciB8IC0tb2xkaW5jbHVkZWRpIHwgLS1vbGRpbmNsdWRlZCBcCi0gIHwgLS1vbGRpbmNsdWRlIHwgLS1vbGRpbmNsdWQgfCAtLW9sZGluY2x1IHwgLS1vbGRpbmNsIHwgLS1vbGRpbmMgXAotICB8IC0tb2xkaW4gfCAtLW9sZGkgfCAtLW9sZCB8IC0tb2wgfCAtLW8pCi0gICAgYWNfcHJldj1vbGRpbmNsdWRlZGlyIDs7Ci0gIC1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpPSogfCAtLW9sZGluY2x1ZGVkPSogXAotICB8IC0tb2xkaW5jbHVkZT0qIHwgLS1vbGRpbmNsdWQ9KiB8IC0tb2xkaW5jbHU9KiB8IC0tb2xkaW5jbD0qIHwgLS1vbGRpbmM9KiBcCi0gIHwgLS1vbGRpbj0qIHwgLS1vbGRpPSogfCAtLW9sZD0qIHwgLS1vbD0qIHwgLS1vPSopCi0gICAgb2xkaW5jbHVkZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJlZml4IHwgLS1wcmVmaXggfCAtLXByZWZpIHwgLS1wcmVmIHwgLS1wcmUgfCAtLXByIHwgLS1wKQotICAgIGFjX3ByZXY9cHJlZml4IDs7Ci0gIC1wcmVmaXg9KiB8IC0tcHJlZml4PSogfCAtLXByZWZpPSogfCAtLXByZWY9KiB8IC0tcHJlPSogfCAtLXByPSogfCAtLXA9KikKLSAgICBwcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKLSAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCi0gICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OwotICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKLSAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQotICAgIHByb2dyYW1fcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZmkgfCAtLXByb2dyYW0tc3VmZiBcCi0gIHwgLS1wcm9ncmFtLXN1ZiB8IC0tcHJvZ3JhbS1zdSB8IC0tcHJvZ3JhbS1zKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9zdWZmaXggOzsKLSAgLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZml4PSogfCAtLXByb2dyYW0tc3VmZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXN1ZmY9KiB8IC0tcHJvZ3JhbS1zdWY9KiB8IC0tcHJvZ3JhbS1zdT0qIHwgLS1wcm9ncmFtLXM9KikKLSAgICBwcm9ncmFtX3N1ZmZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW0gfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW4gfCAtLXByb2dyYW0tdHJhbnNmb3JtLSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybSB8IC0tcHJvZ3JhbS10cmFuc2ZvciBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm8gfCAtLXByb2dyYW0tdHJhbnNmIFwKLSAgfCAtLXByb2dyYW0tdHJhbnMgfCAtLXByb2dyYW0tdHJhbiBcCi0gIHwgLS1wcm9nci10cmEgfCAtLXByb2dyYW0tdHIgfCAtLXByb2dyYW0tdCkKLSAgICBhY19wcmV2PXByb2dyYW1fdHJhbnNmb3JtX25hbWUgOzsKLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW49KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbz0qIHwgLS1wcm9ncmFtLXRyYW5zZj0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnM9KiB8IC0tcHJvZ3JhbS10cmFuPSogXAotICB8IC0tcHJvZ3ItdHJhPSogfCAtLXByb2dyYW0tdHI9KiB8IC0tcHJvZ3JhbS10PSopCi0gICAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iJGFjX29wdGFyZyIgOzsKLQotICAtcSB8IC1xdWlldCB8IC0tcXVpZXQgfCAtLXF1aWUgfCAtLXF1aSB8IC0tcXUgfCAtLXEgXAotICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKLSAgICBzaWxlbnQ9eWVzIDs7Ci0KLSAgLXNiaW5kaXIgfCAtLXNiaW5kaXIgfCAtLXNiaW5kaSB8IC0tc2JpbmQgfCAtLXNiaW4gfCAtLXNiaSB8IC0tc2IpCi0gICAgYWNfcHJldj1zYmluZGlyIDs7Ci0gIC1zYmluZGlyPSogfCAtLXNiaW5kaXI9KiB8IC0tc2JpbmRpPSogfCAtLXNiaW5kPSogfCAtLXNiaW49KiBcCi0gIHwgLS1zYmk9KiB8IC0tc2I9KikKLSAgICBzYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAotICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKLSAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKLSAgfCAtLXNoYSB8IC0tc2gpCi0gICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OwotICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKLSAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKLSAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCi0gIHwgLS1zaGE9KiB8IC0tc2g9KikKLSAgICBzaGFyZWRzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZSB8IC0tc2l0ZSB8IC0tc2l0KQotICAgIGFjX3ByZXY9c2l0ZSA7OwotICAtc2l0ZT0qIHwgLS1zaXRlPSogfCAtLXNpdD0qKQotICAgIHNpdGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNyY2RpciB8IC0tc3JjZGlyIHwgLS1zcmNkaSB8IC0tc3JjZCB8IC0tc3JjIHwgLS1zcikKLSAgICBhY19wcmV2PXNyY2RpciA7OwotICAtc3JjZGlyPSogfCAtLXNyY2Rpcj0qIHwgLS1zcmNkaT0qIHwgLS1zcmNkPSogfCAtLXNyYz0qIHwgLS1zcj0qKQotICAgIHNyY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCi0gIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQotICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OwotICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAotICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCi0gICAgc3lzY29uZmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtdGFyZ2V0IHwgLS10YXJnZXQgfCAtLXRhcmdlIHwgLS10YXJnIHwgLS10YXIgfCAtLXRhIHwgLS10KQotICAgIGFjX3ByZXY9dGFyZ2V0IDs7Ci0gIC10YXJnZXQ9KiB8IC0tdGFyZ2V0PSogfCAtLXRhcmdlPSogfCAtLXRhcmc9KiB8IC0tdGFyPSogfCAtLXRhPSogfCAtLXQ9KikKLSAgICB0YXJnZXQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXYgfCAtdmVyYm9zZSB8IC0tdmVyYm9zZSB8IC0tdmVyYm9zIHwgLS12ZXJibyB8IC0tdmVyYikKLSAgICB2ZXJib3NlPXllcyA7OwotCi0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzKQotICAgIGVjaG8gImNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9ZGdldHRleHQuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3QgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWlmIChlY2hvICJ0ZXN0aW5nXGMiOyBlY2hvIDEsMiwzKSB8IGdyZXAgYyA+L2Rldi9udWxsOyB0aGVuCi0gICMgU3RhcmRlbnQgVmlzdHJhIFNWUjQgZ3JlcCBsYWNrcyAtZSwgc2F5cyBnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1LgotICBpZiAoZWNobyAtbiB0ZXN0aW5nOyBlY2hvIDEsMiwzKSB8IHNlZCBzLy1uL3huLyB8IGdyZXAgeG4gPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX249IGFjX2M9JwotJyBhY190PScJJwotICBlbHNlCi0gICAgYWNfbj0tbiBhY19jPSBhY190PQotICBmaQotZWxzZQotICBhY19uPSBhY19jPSdcYycgYWNfdD0KLWZpCi0KLQotCi0KLQotCi1hY19hdXhfZGlyPQotZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwtc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgotICAgIGJyZWFrCi0gIGVsaWYgdGVzdCAtZiAkYWNfZGlyL2luc3RhbGwuc2g7IHRoZW4KLSAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLnNoIC1jIgotICAgIGJyZWFrCi0gIGZpCi1kb25lCi1pZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgaW5zdGFsbC1zaCBvciBpbnN0YWxsLnNoIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU2MjogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjE2OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDYzMSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NjM3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDY0OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NjU0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc3OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzA2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3MzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzgzOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3OTMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Nzk3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKLSAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgotICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPW5vCi0gIGVsc2UKLSAgICBhY19jdl9wcm9nX2NjX2Nyb3NzPXllcwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgYWNfY3ZfcHJvZ19jY193b3Jrcz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODE3OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIyOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MzE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLSAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODQ2OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci0gIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHQ0M9Ci0gIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9InJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIiAmJiBhY19jdl9wcm9nX1JBTkxJQj0iOiIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MDM6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjkyNDogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGRjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTI5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9eWVzCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA5NTQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk5MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQotI2RlZmluZSBUT1VQUEVSKGMpIChJU0xPV0VSKGMpID8gJ0EnICsgKChjKSAtICdhJykgOiAoYykpCi0jZGVmaW5lIFhPUihlLCBmKSAoKChlKSAmJiAhKGYpKSB8fCAoIShlKSAmJiAoZikpKQotaW50IG1haW4gKCkgeyBpbnQgaTsgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotaWYgKFhPUiAoaXNsb3dlciAoaSksIElTTE9XRVIgKGkpKSB8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkgZXhpdCgyKTsKLWV4aXQgKDApOyB9Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfc3RkYyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIFNURENfSEVBREVSUyAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMjg6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAzMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi0vKiBVbHRyaXggbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotdHlwZWRlZiBpbnQgY2hhcnNldFsyXTsgY29uc3QgY2hhcnNldCB4OwotLyogU3VuT1MgNC4xLjEgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLWNoYXIgY29uc3QgKmNvbnN0ICpjY3A7Ci1jaGFyICoqcDsKLS8qIE5FQyBTVlI0LjAuMiBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi1zdHJ1Y3QgcG9pbnQge2ludCB4LCB5O307Ci1zdGF0aWMgc3RydWN0IHBvaW50IGNvbnN0IHplcm8gPSB7MCwwfTsKLS8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcy4KLSAgIEl0IGRvZXMgbm90IGxldCB5b3Ugc3VidHJhY3Qgb25lIGNvbnN0IFgqIHBvaW50ZXIgZnJvbSBhbm90aGVyIGluIGFuIGFybQotICAgb2YgYW4gaWYtZXhwcmVzc2lvbiB3aG9zZSBpZi1wYXJ0IGlzIG5vdCBhIGNvbnN0YW50IGV4cHJlc3Npb24gKi8KLWNvbnN0IGNoYXIgKmcgPSAic3RyaW5nIjsKLWNjcCA9ICZnICsgKGcgPyBnLWcgOiAwKTsKLS8qIEhQVVggNy4wIGNjIHJlamVjdHMgdGhlc2UuICovCi0rK2NjcDsKLXAgPSAoY2hhcioqKSBjY3A7Ci1jY3AgPSAoY2hhciBjb25zdCAqY29uc3QgKikgcDsKLXsgLyogU0NPIDMuMnY0IGNjIHJlamVjdHMgdGhpcy4gICovCi0gIGNoYXIgKnQ7Ci0gIGNoYXIgY29uc3QgKnMgPSAwID8gKGNoYXIgKikgMCA6IChjaGFyIGNvbnN0ICopIDA7Ci0KLSAgKnQrKyA9IDA7Ci19Ci17IC8qIFNvbWVvbmUgdGhpbmtzIHRoZSBTdW4gc3VwcG9zZWRseS1BTlNJIGNvbXBpbGVyIHdpbGwgcmVqZWN0IHRoaXMuICAqLwotICBpbnQgeFtdID0gezI1LCAxN307Ci0gIGNvbnN0IGludCAqZm9vID0gJnhbMF07Ci0gICsrZm9vOwotfQoteyAvKiBTdW4gU0MxLjAgQU5TSSBjb21waWxlciByZWplY3RzIHRoaXMgLS0gYnV0IG5vdCB0aGUgYWJvdmUuICovCi0gIHR5cGVkZWYgY29uc3QgaW50ICppcHRyOwotICBpcHRyIHAgPSAwOwotICArK3A7Ci19Ci17IC8qIEFJWCBYTCBDIDEuMDIuMC4wIHJlamVjdHMgdGhpcyBzYXlpbmcKLSAgICAgImsuYyIsIGxpbmUgMi4yNzogMTUwNi0wMjUgKFMpIE9wZXJhbmQgbXVzdCBiZSBhIG1vZGlmaWFibGUgbHZhbHVlLiAqLwotICBzdHJ1Y3QgcyB7IGludCBqOyBjb25zdCBpbnQgKmFwWzNdOyB9OwotICBzdHJ1Y3QgcyAqYjsgYi0+aiA9IDU7Ci19Ci17IC8qIFVMVFJJWC0zMiBWMy4xIChSZXYgOSkgdmNjIHJlamVjdHMgdGhpcyAqLwotICBjb25zdCBpbnQgZm9vID0gMTA7Ci19Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMDgyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19jb25zdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2NvbnN0IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9jX2NvbnN0ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGNvbnN0IAotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBpbmxpbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMDM6IGNoZWNraW5nIGZvciBpbmxpbmUiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfaW5saW5lJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3ZfY19pbmxpbmU9bm8KLWZvciBhY19rdyBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZTsgZG8KLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTExMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotfSAkYWNfa3cgZm9vKCkgewotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMTc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2lubGluZT0kYWNfa3c7IGJyZWFrCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZG9uZQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfaW5saW5lIiAxPiY2Ci1jYXNlICIkYWNfY3ZfY19pbmxpbmUiIGluCi0gIGlubGluZSB8IHllcykgOzsKLSAgbm8pIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBpbmxpbmUgCi1FT0YKLSA7OwotICAqKSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgaW5saW5lICRhY19jdl9jX2lubGluZQotRU9GCi0gOzsKLWVzYWMKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9mZl90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQzOiBjaGVja2luZyBmb3Igb2ZmX3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3R5cGVfb2ZmX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTQ4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTc2OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExODEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgInNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjExOiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjIzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI0NDogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWYgSEFWRV9BTExPQ0FfSAotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EubwotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTMwNDogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzM0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNjI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM4OTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzOTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxNjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLWZvciBhY19oZHIgaW4gdW5pc3RkLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDQxOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQ0NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ1MTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0ODUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUwODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTUzMzogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU0MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY4MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MDk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzE0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzE5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNzU0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3Nzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MDY6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4MTEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTgzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODY4OiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4NzMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTkwMTogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTIxOiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NDA6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NDUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk1MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2NzogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTcyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTc5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiIDE+JjYKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgIT0gInllcyI7IHRoZW4KLQkgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5OTU6IGNoZWNraW5nIGZvciBiaW5kdGV4dGRvbWFpbiBpbiAtbGludGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBpbnRsJ18nYmluZHRleHRkb21haW4gfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1saW50bCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgYmluZHRleHRkb21haW4oKTsKLQotaW50IG1haW4oKSB7Ci1iaW5kdGV4dGRvbWFpbigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotTElCUz0iJGFjX3NhdmVfTElCUyIKLQotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2xpYl8nJGFjX2xpYl92YXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjAzMDogY2hlY2tpbmcgZm9yIGdldHRleHQgaW4gbGliaW50bCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA0MjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCSAgIGZpCi0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiID0gInllcyIgXAotCSAgICAgIHx8IHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgPSAieWVzIjsgdGhlbgotCSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0dFVFRFWFQgMQotRU9GCi0KLQkgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIm1zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9NU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9NU0dGTVQ9IiRNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnZHYgJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9NU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTVNHRk1UIiAmJiBhY19jdl9wYXRoX01TR0ZNVD0ibm8iCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0JICAgICAgaWYgdGVzdCAiJE1TR0ZNVCIgIT0gIm5vIjsgdGhlbgotCQlmb3IgYWNfZnVuYyBpbiBkY2dldHRleHQKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDQ6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjEzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE1OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE5NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjI2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjM0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI2NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMDA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMzU6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0MjU6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NTM6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NTggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MjQ2MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbXNnZm9ybWF0PWxpbnV4Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotbXNnZm9ybWF0PXhvcGVuCi1maQotCi0KLQkgICAgICAgICAgCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICAgICAgICBzZWQgLWUgJy9eIy4qW15cXF0kL2QnIC1lICcvXiMkL2QnIFwKLQkgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluID4gcG8ydGJsLnNlZAotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFBBQ0tBR0UiID0gImdldHRleHQiOyB0aGVuCi0gICAgIEdUX05PPSIjTk8jIgotICAgICBHVF9ZRVM9Ci0gICBlbHNlCi0gICAgIEdUX05PPQotICAgICBHVF9ZRVM9IiNZRVMjIgotICAgZmkKLSAgIAotICAgCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIAotCi0gICAgICBsPQotICAgCi0KLSAgICAgICAgICAgIGlmIHRlc3QgLWQgJHNyY2Rpci9wbzsgdGhlbgotICAgICAgdGVzdCAtZCBwbyB8fCBta2RpciBwbwotICAgICAgaWYgdGVzdCAieCRzcmNkaXIiICE9ICJ4LiI7IHRoZW4KLQkgaWYgdGVzdCAieGBlY2hvICRzcmNkaXIgfCBzZWQgJ3NALy4qQEAnYCIgPSAieCI7IHRoZW4KLQkgICAgcG9zcmNwcmVmaXg9IiRzcmNkaXIvIgotCSBlbHNlCi0JICAgIHBvc3JjcHJlZml4PSIuLi8kc3JjZGlyLyIKLQkgZmkKLSAgICAgIGVsc2UKLQkgcG9zcmNwcmVmaXg9Ii4uLyIKLSAgICAgIGZpCi0gICAgICBybSAtZiBwby9QT1RGSUxFUwotICAgICAgc2VkIC1lICIvXiMvZCIgLWUgIi9eXCQvZCIgLWUgInMsLiosCSRwb3NyY3ByZWZpeCYgXFxcXCwiIC1lICJcJHMvXCguKlwpIFxcXFwvXDEvIiBcCi0JIDwgJHNyY2Rpci9wby9QT1RGSUxFUy5pbiA+IHBvL1BPVEZJTEVTCi0gICBmaQotICAKLQotCi10cmFwICcnIDEgMiAxNQotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCkgMj4mMSB8IGdyZXAgYWNfc3BhY2VgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotdHJhcCAncm0gLWZyIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29yZSBjb3JlLiogKi5jb3JlICRhY19jbGVhbl9maWxlczsgZXhpdCAxJyAxIDIgMTUKLQotdGVzdCAieCRwcmVmaXgiID0geE5PTkUgJiYgcHJlZml4PSRhY19kZWZhdWx0X3ByZWZpeAotIyBMZXQgbWFrZSBleHBhbmQgZXhlY19wcmVmaXguCi10ZXN0ICJ4JGV4ZWNfcHJlZml4IiA9IHhOT05FICYmIGV4ZWNfcHJlZml4PScke3ByZWZpeH0nCi0KLSMgQW55IGFzc2lnbm1lbnQgdG8gVlBBVEggY2F1c2VzIFN1biBtYWtlIHRvIG9ubHkgZXhlY3V0ZQotIyB0aGUgZmlyc3Qgc2V0IG9mIGRvdWJsZS1jb2xvbiBydWxlcywgc28gcmVtb3ZlIGl0IGlmIG5vdCBuZWVkZWQuCi0jIElmIHRoZXJlIGlzIGEgY29sb24gaW4gdGhlIHBhdGgsIHdlIG5lZWQgdG8ga2VlcCBpdC4KLWlmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCi0gIGFjX3Zwc3ViPScvXlsgCV0qVlBBVEhbIAldKj1bXjpdKiQvZCcKLWZpCi0KLXRyYXAgJ3JtIC1mICRDT05GSUdfU1RBVFVTIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLQotREVGUz0tREhBVkVfQ09ORklHX0gKLQotIyBXaXRob3V0IHRoZSAiLi8iLCBzb21lIHNoZWxscyBsb29rIGluIFBBVEggZm9yIGNvbmZpZy5zdGF0dXMuCi06ICR7Q09ORklHX1NUQVRVUz0uL2NvbmZpZy5zdGF0dXN9Ci0KLWVjaG8gY3JlYXRpbmcgJENPTkZJR19TVEFUVVMKLXJtIC1mICRDT05GSUdfU1RBVFVTCi1jYXQgPiAkQ09ORklHX1NUQVRVUyA8PEVPRgotIyEgL2Jpbi9zaAotIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuCi0jIFJ1biB0aGlzIGZpbGUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSMgVGhpcyBkaXJlY3Rvcnkgd2FzIGNvbmZpZ3VyZWQgYXMgZm9sbG93cywKLSMgb24gaG9zdCBgKGhvc3RuYW1lIHx8IHVuYW1lIC1uKSAyPi9kZXYvbnVsbCB8IHNlZCAxcWA6Ci0jCi0jICQwICRhY19jb25maWd1cmVfYXJncwotIwotIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotIyBjb25maWd1cmUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLWFjX2NzX3VzYWdlPSJVc2FnZTogJENPTkZJR19TVEFUVVMgWy0tcmVjaGVja10gWy0tdmVyc2lvbl0gWy0taGVscF0iCi1mb3IgYWNfb3B0aW9uCi1kbwotICBjYXNlICJcJGFjX29wdGlvbiIgaW4KLSAgLXJlY2hlY2sgfCAtLXJlY2hlY2sgfCAtLXJlY2hlYyB8IC0tcmVjaGUgfCAtLXJlY2ggfCAtLXJlYyB8IC0tcmUgfCAtLXIpCi0gICAgZWNobyAicnVubmluZyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIgotICAgIGV4ZWMgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiA7OwotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycyB8IC0tdmVyIHwgLS12ZSB8IC0tdikKLSAgICBlY2hvICIkQ09ORklHX1NUQVRVUyBnZW5lcmF0ZWQgYnkgYXV0b2NvbmYgdmVyc2lvbiAyLjEyLjEiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfREFUQUAlJElOU1RBTExfREFUQSVnCi1zJUBJTlNUQUxMX1NDUklQVEAlJElOU1RBTExfU0NSSVBUJWcKLXMlQFNFVF9NQUtFQCUkU0VUX01BS0UlZwotcyVAQ0NAJSRDQyVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi1hY19zb3VyY2VzPSIkbmxzX2N2X2hlYWRlcl9saWJndCIKLWFjX2Rlc3RzPSIkbmxzX2N2X2hlYWRlcl9pbnRsIgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLXNyY2Rpcj0kYWNfZ2l2ZW5fc3JjZGlyCi13aGlsZSB0ZXN0IC1uICIkYWNfc291cmNlcyI7IGRvCi0gIHNldCAkYWNfZGVzdHM7IGFjX2Rlc3Q9JDE7IHNoaWZ0OyBhY19kZXN0cz0kKgotICBzZXQgJGFjX3NvdXJjZXM7IGFjX3NvdXJjZT0kMTsgc2hpZnQ7IGFjX3NvdXJjZXM9JCoKLQotICBlY2hvICJsaW5raW5nICRzcmNkaXIvJGFjX3NvdXJjZSB0byAkYWNfZGVzdCIKLQotICBpZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfc291cmNlOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkc3JjZGlyLyRhY19zb3VyY2U6IEZpbGUgbm90IGZvdW5kIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgJGFjX2Rlc3QKLQotICAjIE1ha2UgcmVsYXRpdmUgc3ltbGlua3MuCi0gICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICBhY19kZXN0X2Rpcj1gZWNobyAkYWNfZGVzdHxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kZXN0X2RpciIgIT0gIiRhY19kZXN0IiAmJiB0ZXN0ICIkYWNfZGVzdF9kaXIiICE9IC47IHRoZW4KLSAgICAjIFRoZSBkZXN0IGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGVzdF9kaXIiICYmIG1rZGlyICIkYWNfZGVzdF9kaXIiCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2Rlc3RfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kZXN0X2Rpcl9zdWZmaXguCi0gICAgYWNfZG90cz1gZWNobyAkYWNfZGVzdF9kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGVzdF9kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRzcmNkaXIiIGluCi0gIFsvJF0qKSBhY19yZWxfc291cmNlPSIkc3JjZGlyLyRhY19zb3VyY2UiIDs7Ci0gICopIGFjX3JlbF9zb3VyY2U9IiRhY19kb3RzJHNyY2Rpci8kYWNfc291cmNlIiA7OwotICBlc2FjCi0KLSAgIyBNYWtlIGEgc3ltbGluayBpZiBwb3NzaWJsZTsgb3RoZXJ3aXNlIHRyeSBhIGhhcmQgbGluay4KLSAgaWYgbG4gLXMgJGFjX3JlbF9zb3VyY2UgJGFjX2Rlc3QgMj4vZGV2L251bGwgfHwKLSAgICBsbiAkc3JjZGlyLyRhY19zb3VyY2UgJGFjX2Rlc3Q7IHRoZW4gOgotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGxpbmsgJGFjX2Rlc3QgdG8gJHNyY2Rpci8kYWNfc291cmNlIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWRvbmUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvaW50bC9jb25maWd1cmUuaW4gYi9pbnRsL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhOWMyNC4uMDAwMDAwMAotLS0gYS9pbnRsL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0LgotCi1BQ19JTklUKGRnZXR0ZXh0LmMpCi1BTV9DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotQU1fUFJPR19JTlNUQUxMCi1DWV9HTlVfR0VUVEVYVAotQUNfTElOS19GSUxFUygkbmxzX2N2X2hlYWRlcl9saWJndCwgJG5sc19jdl9oZWFkZXJfaW50bCkKLQotQUNfT1VUUFVUKE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvaW50bC9kY2dldHRleHQuYyBiL2ludGwvZGNnZXR0ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTZiZmQuLjAwMDAwMDAKLS0tIGEvaW50bC9kY2dldHRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGNnZXR0ZXh0KDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotIyBkZWZpbmUgSEFWRV9BTExPQ0EgMQotI2Vsc2UKLSMgaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9IIHx8IGRlZmluZWQgX0xJQkMKLSMgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyBlbHNlCi0jICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgIGVsc2UKLSMgICBpZm5kZWYgYWxsb2NhCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZuZGVmIGVycm5vCi1leHRlcm4gaW50IGVycm5vOwotI2VuZGlmCi0jaWZuZGVmIF9fc2V0X2Vycm5vCi0jIGRlZmluZSBfX3NldF9lcnJubyh2YWwpIGVycm5vID0gKHZhbCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICpnZXRlbnYgKCk7Ci0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBfR05VX1NPVVJDRQotIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfVU5JU1REX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiZ2V0dGV4dC5oIgotI2luY2x1ZGUgImdldHRleHRQLmgiCi0jaWZkZWYgX0xJQkMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotI2Vsc2UKLSMgaW5jbHVkZSAibGliZ2V0dGV4dC5oIgotI2VuZGlmCi0jaW5jbHVkZSAiaGFzaC1zdHJpbmcuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgZ2V0Y3dkIF9fZ2V0Y3dkCi0jIGRlZmluZSBzdHBjcHkgX19zdHBjcHkKLSNlbHNlCi0jIGlmICFkZWZpbmVkIEhBVkVfR0VUQ1dECi1jaGFyICpnZXR3ZCAoKTsKLSMgIGRlZmluZSBnZXRjd2QoYnVmLCBtYXgpIGdldHdkIChidWYpCi0jIGVsc2UKLWNoYXIgKmdldGN3ZCAoKTsKLSMgZW5kaWYKLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIEFtb3VudCB0byBpbmNyZWFzZSBidWZmZXIgc2l6ZSBieSBpbiBlYWNoIHRyeS4gICovCi0jZGVmaW5lIFBBVEhfSU5DUiAzMgotCi0vKiBUaGUgZm9sbG93aW5nIGlzIGZyb20gcGF0aG1heC5oLiAgKi8KLS8qIE5vbi1QT1NJWCBCU0Qgc3lzdGVtcyBtaWdodCBoYXZlIGdjYydzIGxpbWl0cy5oLCB3aGljaCBkb2Vzbid0IGRlZmluZQotICAgUEFUSF9NQVggYnV0IG1pZ2h0IGNhdXNlIHJlZGVmaW5pdGlvbiB3YXJuaW5ncyB3aGVuIHN5cy9wYXJhbS5oIGlzCi0gICBsYXRlciBpbmNsdWRlZCAoYXMgb24gTU9SRS9CU0QgNC4zKS4gICovCi0jaWYgZGVmaW5lZChfUE9TSVhfVkVSU0lPTikgfHwgKGRlZmluZWQoSEFWRV9MSU1JVFNfSCkgJiYgIWRlZmluZWQoX19HTlVDX18pKQotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotCi0jaWZuZGVmIF9QT1NJWF9QQVRIX01BWAotIyBkZWZpbmUgX1BPU0lYX1BBVEhfTUFYIDI1NQotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChQQVRIX01BWCkgJiYgZGVmaW5lZChfUENfUEFUSF9NQVgpCi0jIGRlZmluZSBQQVRIX01BWCAocGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSA8IDEgPyAxMDI0IDogcGF0aGNvbmYgKCIvIiwgX1BDX1BBVEhfTUFYKSkKLSNlbmRpZgotCi0vKiBEb24ndCBpbmNsdWRlIHN5cy9wYXJhbS5oIGlmIGl0IGFscmVhZHkgaGFzIGJlZW4uICAqLwotI2lmIGRlZmluZWQoSEFWRV9TWVNfUEFSQU1fSCkgJiYgIWRlZmluZWQoUEFUSF9NQVgpICYmICFkZWZpbmVkKE1BWFBBVEhMRU4pCi0jIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChQQVRIX01BWCkgJiYgZGVmaW5lZChNQVhQQVRITEVOKQotIyBkZWZpbmUgUEFUSF9NQVggTUFYUEFUSExFTgotI2VuZGlmCi0KLSNpZm5kZWYgUEFUSF9NQVgKLSMgZGVmaW5lIFBBVEhfTUFYIF9QT1NJWF9QQVRIX01BWAotI2VuZGlmCi0KLS8qIFhQRzMgZGVmaW5lcyB0aGUgcmVzdWx0IG9mIGBzZXRsb2NhbGUgKGNhdGVnb3J5LCBOVUxMKScgYXM6Ci0gICBgYERpcmVjdHMgYHNldGxvY2FsZSgpJyB0byBxdWVyeSBgY2F0ZWdvcnknIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQKLSAgICAgc2V0dGluZyBvZiBgbG9jYWwnLicnCi0gICBIb3dldmVyIGl0IGRvZXMgbm90IHNwZWNpZnkgdGhlIGV4YWN0IGZvcm1hdC4gIEFuZCBldmVuIHdvcnNlOiBQT1NJWAotICAgZGVmaW5lcyB0aGlzIG5vdCBhdCBhbGwuICBTbyB3ZSBjYW4gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IG9uIHNlbGVjdGVkCi0gICBzeXN0ZW0gKGUuZy4gdGhvc2UgdXNpbmcgR05VIEMgTGlicmFyeSkuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBIQVZFX0xPQ0FMRV9OVUxMCi0jZW5kaWYKLQotLyogTmFtZSBvZiB0aGUgZGVmYXVsdCBkb21haW4gdXNlZCBmb3IgZ2V0dGV4dCgzKSBwcmlvciBhbnkgY2FsbCB0bwotICAgdGV4dGRvbWFpbigzKS4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGlzICJtZXNzYWdlcyIuICAqLwotY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbltdID0gIm1lc3NhZ2VzIjsKLQotLyogVmFsdWUgdXNlZCBhcyB0aGUgZGVmYXVsdCBkb21haW4gZm9yIGdldHRleHQoMykuICAqLwotY29uc3QgY2hhciAqX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbjsKLQotLyogQ29udGFpbnMgdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MuICAqLwotY29uc3QgY2hhciBfbmxfZGVmYXVsdF9kaXJuYW1lW10gPSBHTlVMT0NBTEVESVI7Ci0KLS8qIExpc3Qgd2l0aCBiaW5kaW5ncyBvZiBzcGVjaWZpYyBkb21haW5zIGNyZWF0ZWQgYnkgYmluZHRleHRkb21haW4oKQotICAgY2FsbHMuICAqLwotc3RydWN0IGJpbmRpbmcgKl9ubF9kb21haW5fYmluZGluZ3M7Ci0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucy4gICovCi1zdGF0aWMgY2hhciAqZmluZF9tc2cgUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGUsCi0JCQkgICAgICAgY29uc3QgY2hhciAqbXNnaWQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpjYXRlZ29yeV90b19uYW1lIFBBUkFNUyAoKGludCBjYXRlZ29yeSkpOwotc3RhdGljIGNvbnN0IGNoYXIgKmd1ZXNzX2NhdGVnb3J5X3ZhbHVlIFBBUkFNUyAoKGludCBjYXRlZ29yeSwKLQkJCQkJCSBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWUpKTsKLQotCi0vKiBGb3IgdGhvc2UgbG9vc2luZyBzeXN0ZW1zIHdoaWNoIGRvbid0IGhhdmUgYGFsbG9jYScgd2UgaGF2ZSB0byBhZGQKLSAgIHNvbWUgYWRkaXRpb25hbCBjb2RlIGVtdWxhdGluZyBpdC4gICovCi0jaWZkZWYgSEFWRV9BTExPQ0EKLS8qIE5vdGhpbmcgaGFzIHRvIGJlIGRvbmUuICAqLwotIyBkZWZpbmUgQUREX0JMT0NLKGxpc3QsIGFkZHJlc3MpIC8qIG5vdGhpbmcgKi8KLSMgZGVmaW5lIEZSRUVfQkxPQ0tTKGxpc3QpIC8qIG5vdGhpbmcgKi8KLSNlbHNlCi1zdHJ1Y3QgYmxvY2tfbGlzdAotewotICB2b2lkICphZGRyZXNzOwotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV4dDsKLX07Ci0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcikJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgc3RydWN0IGJsb2NrX2xpc3QgKm5ld3AgPSAoc3RydWN0IGJsb2NrX2xpc3QgKikgbWFsbG9jIChzaXplb2YgKCpuZXdwKSk7ICBcCi0gICAgLyogSWYgd2UgY2Fubm90IGdldCBhIGZyZWUgYmxvY2sgd2UgY2Fubm90IGFkZCB0aGUgbmV3IGVsZW1lbnQgdG8JICAgICAgXAotICAgICAgIHRoZSBsaXN0LiAgKi8JCQkJCQkJICAgICAgXAotICAgIGlmIChuZXdwICE9IE5VTEwpIHsJCQkJCQkJICAgICAgXAotICAgICAgbmV3cC0+YWRkcmVzcyA9IChhZGRyKTsJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5uZXh0ID0gKGxpc3QpOwkJCQkJCSAgICAgIFwKLSAgICAgIChsaXN0KSA9IG5ld3A7CQkJCQkJCSAgICAgIFwKLSAgICB9CQkJCQkJCQkJICAgICAgXAotICB9IHdoaWxlICgwKQotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkJCQkJCQkgICAgICBcCi0gIGRvIHsJCQkJCQkJCQkgICAgICBcCi0gICAgd2hpbGUgKGxpc3QgIT0gTlVMTCkgewkJCQkJCSAgICAgIFwKLSAgICAgIHN0cnVjdCBibG9ja19saXN0ICpvbGQgPSBsaXN0OwkJCQkJICAgICAgXAotICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CQkJCQkJICAgICAgXAotICAgICAgZnJlZSAob2xkKTsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIHVuZGVmIGFsbG9jYQotIyBkZWZpbmUgYWxsb2NhKHNpemUpIChtYWxsb2MgKHNpemUpKQotI2VuZGlmCS8qIGhhdmUgYWxsb2NhICovCi0KLQotLyogTmFtZXMgZm9yIHRoZSBsaWJpbnRsIGZ1bmN0aW9ucyBhcmUgYSBwcm9ibGVtLiAgVGhleSBtdXN0IG5vdCBjbGFzaAotICAgd2l0aCBleGlzdGluZyBuYW1lcyBhbmQgdGhleSBzaG91bGQgZm9sbG93IEFOU0kgQy4gIEJ1dCB0aGlzIHNvdXJjZQotICAgY29kZSBpcyBhbHNvIHVzZWQgaW4gR05VIEMgTGlicmFyeSB3aGVyZSB0aGUgbmFtZXMgaGF2ZSBhIF9fCi0gICBwcmVmaXguICBTbyB3ZSBoYXZlIHRvIG1ha2UgYSBkaWZmZXJlbmNlIGhlcmUuICAqLwotI2lmZGVmIF9MSUJDCi0jIGRlZmluZSBEQ0dFVFRFWFQgX19kY2dldHRleHQKLSNlbHNlCi0jIGRlZmluZSBEQ0dFVFRFWFQgZGNnZXR0ZXh0X18KLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLSAgIGxvY2FsZS4gICovCi1jaGFyICoKLURDR0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQotICAgICBjb25zdCBjaGFyICpkb21haW5uYW1lOwotICAgICBjb25zdCBjaGFyICptc2dpZDsKLSAgICAgaW50IGNhdGVnb3J5OwotewotI2lmbmRlZiBIQVZFX0FMTE9DQQotICBzdHJ1Y3QgYmxvY2tfbGlzdCAqYmxvY2tfbGlzdCA9IE5VTEw7Ci0jZW5kaWYKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluOwotICBzdHJ1Y3QgYmluZGluZyAqYmluZGluZzsKLSAgY29uc3QgY2hhciAqY2F0ZWdvcnluYW1lOwotICBjb25zdCBjaGFyICpjYXRlZ29yeXZhbHVlOwotICBjaGFyICpkaXJuYW1lLCAqeGRvbWFpbm5hbWU7Ci0gIGNoYXIgKnNpbmdsZV9sb2NhbGU7Ci0gIGNoYXIgKnJldHZhbDsKLSAgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0KLSAgLyogSWYgbm8gcmVhbCBNU0dJRCBpcyBnaXZlbiByZXR1cm4gTlVMTC4gICovCi0gIGlmIChtc2dpZCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIC8qIElmIERPTUFJTk5BTUUgaXMgTlVMTCwgd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlZmF1bHQgZG9tYWluLiAgSWYKLSAgICAgQ0FURUdPUlkgaXMgbm90IExDX01FU1NBR0VTIHRoaXMgbWlnaHQgbm90IG1ha2UgbXVjaCBzZW5zZSBidXQgdGhlCi0gICAgIGRlZmludGlvbiBsZWZ0IHRoaXMgdW5kZWZpbmVkLiAgKi8KLSAgaWYgKGRvbWFpbm5hbWUgPT0gTlVMTCkKLSAgICBkb21haW5uYW1lID0gX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW47Ci0KLSAgLyogRmlyc3QgZmluZCBtYXRjaGluZyBiaW5kaW5nLiAgKi8KLSAgZm9yIChiaW5kaW5nID0gX25sX2RvbWFpbl9iaW5kaW5nczsgYmluZGluZyAhPSBOVUxMOyBiaW5kaW5nID0gYmluZGluZy0+bmV4dCkKLSAgICB7Ci0gICAgICBpbnQgY29tcGFyZSA9IHN0cmNtcCAoZG9tYWlubmFtZSwgYmluZGluZy0+ZG9tYWlubmFtZSk7Ci0gICAgICBpZiAoY29tcGFyZSA9PSAwKQotCS8qIFdlIGZvdW5kIGl0ISAgKi8KLQlicmVhazsKLSAgICAgIGlmIChjb21wYXJlIDwgMCkKLQl7Ci0JICAvKiBJdCBpcyBub3QgaW4gdGhlIGxpc3QuICAqLwotCSAgYmluZGluZyA9IE5VTEw7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChiaW5kaW5nID09IE5VTEwpCi0gICAgZGlybmFtZSA9IChjaGFyICopIF9ubF9kZWZhdWx0X2Rpcm5hbWU7Ci0gIGVsc2UgaWYgKGJpbmRpbmctPmRpcm5hbWVbMF0gPT0gJy8nKQotICAgIGRpcm5hbWUgPSBiaW5kaW5nLT5kaXJuYW1lOwotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGguICBNYWtlIGl0IGFic29sdXRlIG5vdy4gICovCi0gICAgICBzaXplX3QgZGlybmFtZV9sZW4gPSBzdHJsZW4gKGJpbmRpbmctPmRpcm5hbWUpICsgMTsKLSAgICAgIHNpemVfdCBwYXRoX21heDsKLSAgICAgIGNoYXIgKnJldDsKLQotICAgICAgcGF0aF9tYXggPSAodW5zaWduZWQpIFBBVEhfTUFYOwotICAgICAgcGF0aF9tYXggKz0gMjsJCS8qIFRoZSBnZXRjd2QgZG9jcyBzYXkgdG8gZG8gdGhpcy4gICovCi0KLSAgICAgIGRpcm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHBhdGhfbWF4ICsgZGlybmFtZV9sZW4pOwotICAgICAgQUREX0JMT0NLIChibG9ja19saXN0LCBkaXJuYW1lKTsKLQotICAgICAgX19zZXRfZXJybm8gKDApOwotICAgICAgd2hpbGUgKChyZXQgPSBnZXRjd2QgKGRpcm5hbWUsIHBhdGhfbWF4KSkgPT0gTlVMTCAmJiBlcnJubyA9PSBFUkFOR0UpCi0JewotCSAgcGF0aF9tYXggKz0gUEFUSF9JTkNSOwotCSAgZGlybmFtZSA9IChjaGFyICopIGFsbG9jYSAocGF0aF9tYXggKyBkaXJuYW1lX2xlbik7Ci0JICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGRpcm5hbWUpOwotCSAgX19zZXRfZXJybm8gKDApOwotCX0KLQotICAgICAgaWYgKHJldCA9PSBOVUxMKQotCXsKLQkgIC8qIFdlIGNhbm5vdCBnZXQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuICBEb24ndCBzaWduYWwgYW4KLQkgICAgIGVycm9yIGJ1dCBzaW1wbHkgcmV0dXJuIHRoZSBkZWZhdWx0IHN0cmluZy4gICovCi0JICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JICBfX3NldF9lcnJubyAoc2F2ZWRfZXJybm8pOwotCSAgcmV0dXJuIChjaGFyICopIG1zZ2lkOwotCX0KLQotICAgICAgc3RwY3B5IChzdHBjcHkgKHN0cmNociAoZGlybmFtZSwgJ1wwJyksICIvIiksIGJpbmRpbmctPmRpcm5hbWUpOwotICAgIH0KLQotICAvKiBOb3cgZGV0ZXJtaW5lIHRoZSBzeW1ib2xpYyBuYW1lIG9mIENBVEVHT1JZIGFuZCBpdHMgdmFsdWUuICAqLwotICBjYXRlZ29yeW5hbWUgPSBjYXRlZ29yeV90b19uYW1lIChjYXRlZ29yeSk7Ci0gIGNhdGVnb3J5dmFsdWUgPSBndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSk7Ci0KLSAgeGRvbWFpbm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoY2F0ZWdvcnluYW1lKQotCQkJCSArIHN0cmxlbiAoZG9tYWlubmFtZSkgKyA1KTsKLSAgQUREX0JMT0NLIChibG9ja19saXN0LCB4ZG9tYWlubmFtZSk7Ci0KLSAgc3RwY3B5IChzdHBjcHkgKHN0cGNweSAoc3RwY3B5ICh4ZG9tYWlubmFtZSwgY2F0ZWdvcnluYW1lKSwgIi8iKSwKLQkJICBkb21haW5uYW1lKSwKLQkgICIubW8iKTsKLQotICAvKiBDcmVhdGluZyB3b3JraW5nIGFyZWEuICAqLwotICBzaW5nbGVfbG9jYWxlID0gKGNoYXIgKikgYWxsb2NhIChzdHJsZW4gKGNhdGVnb3J5dmFsdWUpICsgMSk7Ci0gIEFERF9CTE9DSyAoYmxvY2tfbGlzdCwgc2luZ2xlX2xvY2FsZSk7Ci0KLQotICAvKiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBzdHJpbmcuICBUaGlzIGlzIGEgbG9vcCBiZWNhdXNlIHdlIHBlcmhhcHMKLSAgICAgZ290IGFuIG9yZGVyZWQgbGlzdCBvZiBsYW5ndWFnZXMgdG8gY29uc2lkZXIgZm9yIHRoIHRyYW5zbGF0aW9uLiAgKi8KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgLyogTWFrZSBDQVRFR09SWVZBTFVFIHBvaW50IHRvIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIGxpc3QuICAqLwotICAgICAgd2hpbGUgKGNhdGVnb3J5dmFsdWVbMF0gIT0gJ1wwJyAmJiBjYXRlZ29yeXZhbHVlWzBdID09ICc6JykKLQkrK2NhdGVnb3J5dmFsdWU7Ci0gICAgICBpZiAoY2F0ZWdvcnl2YWx1ZVswXSA9PSAnXDAnKQotCXsKLQkgIC8qIFRoZSB3aG9sZSBjb250ZW50cyBvZiBDQVRFR09SWVZBTFVFIGhhcyBiZWVuIHNlYXJjaGVkIGJ1dAotCSAgICAgbm8gdmFsaWQgZW50cnkgaGFzIGJlZW4gZm91bmQuICBXZSBzb2x2ZSB0aGlzIHNpdHVhdGlvbgotCSAgICAgYnkgaW1wbGljaXRseSBhcHBlbmRpbmcgYSAiQyIgZW50cnksIGkuZS4gbm8gdHJhbnNsYXRpb24KLQkgICAgIHdpbGwgdGFrZSBwbGFjZS4gICovCi0JICBzaW5nbGVfbG9jYWxlWzBdID0gJ0MnOwotCSAgc2luZ2xlX2xvY2FsZVsxXSA9ICdcMCc7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKmNwID0gc2luZ2xlX2xvY2FsZTsKLQkgIHdoaWxlIChjYXRlZ29yeXZhbHVlWzBdICE9ICdcMCcgJiYgY2F0ZWdvcnl2YWx1ZVswXSAhPSAnOicpCi0JICAgICpjcCsrID0gKmNhdGVnb3J5dmFsdWUrKzsKLQkgICpjcCA9ICdcMCc7Ci0JfQotCi0gICAgICAvKiBJZiB0aGUgY3VycmVudCBsb2NhbGUgdmFsdWUgaXMgQyAob3IgUE9TSVgpIHdlIGRvbid0IGxvYWQgYQotCSBkb21haW4uICBSZXR1cm4gdGhlIE1TR0lELiAgKi8KLSAgICAgIGlmIChzdHJjbXAgKHNpbmdsZV9sb2NhbGUsICJDIikgPT0gMAotCSAgfHwgc3RyY21wIChzaW5nbGVfbG9jYWxlLCAiUE9TSVgiKSA9PSAwKQotCXsKLQkgIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLQkgIF9fc2V0X2Vycm5vIChzYXZlZF9lcnJubyk7Ci0JICByZXR1cm4gKGNoYXIgKikgbXNnaWQ7Ci0JfQotCi0KLSAgICAgIC8qIEZpbmQgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZyBtYXRjaGluZyB0aGUKLQkgRE9NQUlOTkFNRSBhbmQgQ0FURUdPUlkuICAqLwotICAgICAgZG9tYWluID0gX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBzaW5nbGVfbG9jYWxlLCB4ZG9tYWlubmFtZSk7Ci0KLSAgICAgIGlmIChkb21haW4gIT0gTlVMTCkKLQl7Ci0JICByZXR2YWwgPSBmaW5kX21zZyAoZG9tYWluLCBtc2dpZCk7Ci0KLQkgIGlmIChyZXR2YWwgPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGludCBjbnQ7Ci0KLQkgICAgICBmb3IgKGNudCA9IDA7IGRvbWFpbi0+c3VjY2Vzc29yW2NudF0gIT0gTlVMTDsgKytjbnQpCi0JCXsKLQkJICByZXR2YWwgPSBmaW5kX21zZyAoZG9tYWluLT5zdWNjZXNzb3JbY250XSwgbXNnaWQpOwotCi0JCSAgaWYgKHJldHZhbCAhPSBOVUxMKQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCi0JICBpZiAocmV0dmFsICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBGUkVFX0JMT0NLUyAoYmxvY2tfbGlzdCk7Ci0JICAgICAgX19zZXRfZXJybm8gKHNhdmVkX2Vycm5vKTsKLQkgICAgICByZXR1cm4gcmV0dmFsOwotCSAgICB9Ci0JfQotICAgIH0KLSAgLyogTk9UUkVBQ0hFRCAqLwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19kY2dldHRleHQsIGRjZ2V0dGV4dCk7Ci0jZW5kaWYKLQotCi1zdGF0aWMgY2hhciAqCi1maW5kX21zZyAoZG9tYWluX2ZpbGUsIG1zZ2lkKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpkb21haW5fZmlsZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHNpemVfdCB0b3AsIGFjdCwgYm90dG9tOwotICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotCi0gIGlmIChkb21haW5fZmlsZS0+ZGVjaWRlZCA9PSAwKQotICAgIF9ubF9sb2FkX2RvbWFpbiAoZG9tYWluX2ZpbGUpOwotCi0gIGlmIChkb21haW5fZmlsZS0+ZGF0YSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIGRvbWFpbiA9IChzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqKSBkb21haW5fZmlsZS0+ZGF0YTsKLQotICAvKiBMb2NhdGUgdGhlIE1TR0lEIGFuZCBpdHMgdHJhbnNsYXRpb24uICAqLwotICBpZiAoZG9tYWluLT5oYXNoX3NpemUgPiAyICYmIGRvbWFpbi0+aGFzaF90YWIgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBVc2UgdGhlIGhhc2hpbmcgdGFibGUuICAqLwotICAgICAgbmxzX3VpbnQzMiBsZW4gPSBzdHJsZW4gKG1zZ2lkKTsKLSAgICAgIG5sc191aW50MzIgaGFzaF92YWwgPSBoYXNoX3N0cmluZyAobXNnaWQpOwotICAgICAgbmxzX3VpbnQzMiBpZHggPSBoYXNoX3ZhbCAlIGRvbWFpbi0+aGFzaF9zaXplOwotICAgICAgbmxzX3VpbnQzMiBpbmNyID0gMSArIChoYXNoX3ZhbCAlIChkb21haW4tPmhhc2hfc2l6ZSAtIDIpKTsKLSAgICAgIG5sc191aW50MzIgbnN0ciA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPmhhc2hfdGFiW2lkeF0pOwotCi0gICAgICBpZiAobnN0ciA9PSAwKQotCS8qIEhhc2ggdGFibGUgZW50cnkgaXMgZW1wdHkuICAqLwotCXJldHVybiBOVUxMOwotCi0gICAgICBpZiAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+b3JpZ190YWJbbnN0ciAtIDFdLmxlbmd0aCkgPT0gbGVuCi0JICAmJiBzdHJjbXAgKG1zZ2lkLAotCQkgICAgIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCSAgICAgICBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5vZmZzZXQpKSA9PSAwKQotCXJldHVybiAoY2hhciAqKSBkb21haW4tPmRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwKLQkJCQkJICBkb21haW4tPnRyYW5zX3RhYltuc3RyIC0gMV0ub2Zmc2V0KTsKLQotICAgICAgd2hpbGUgKDEpCi0JewotCSAgaWYgKGlkeCA+PSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3IpCi0JICAgIGlkeCAtPSBkb21haW4tPmhhc2hfc2l6ZSAtIGluY3I7Ci0JICBlbHNlCi0JICAgIGlkeCArPSBpbmNyOwotCi0JICBuc3RyID0gVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRvbWFpbi0+aGFzaF90YWJbaWR4XSk7Ci0JICBpZiAobnN0ciA9PSAwKQotCSAgICAvKiBIYXNoIHRhYmxlIGVudHJ5IGlzIGVtcHR5LiAgKi8KLQkgICAgcmV0dXJuIE5VTEw7Ci0KLQkgIGlmIChXIChkb21haW4tPm11c3Rfc3dhcCwgZG9tYWluLT5vcmlnX3RhYltuc3RyIC0gMV0ubGVuZ3RoKSA9PSBsZW4KLQkgICAgICAmJiBzdHJjbXAgKG1zZ2lkLAotCQkJIGRvbWFpbi0+ZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCQkgICBkb21haW4tPm9yaWdfdGFiW25zdHIgLSAxXS5vZmZzZXQpKQotCSAgICAgICAgID09IDApCi0JICAgIHJldHVybiAoY2hhciAqKSBkb21haW4tPmRhdGEKLQkgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkb21haW4tPnRyYW5zX3RhYltuc3RyIC0gMV0ub2Zmc2V0KTsKLQl9Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgfQotCi0gIC8qIE5vdyB3ZSB0cnkgdGhlIGRlZmF1bHQgbWV0aG9kOiAgYmluYXJ5IHNlYXJjaCBpbiB0aGUgc29ydGVkCi0gICAgIGFycmF5IG9mIG1lc3NhZ2VzLiAgKi8KLSAgYm90dG9tID0gMDsKLSAgdG9wID0gZG9tYWluLT5uc3RyaW5nczsKLSAgd2hpbGUgKGJvdHRvbSA8IHRvcCkKLSAgICB7Ci0gICAgICBpbnQgY21wX3ZhbDsKLQotICAgICAgYWN0ID0gKGJvdHRvbSArIHRvcCkgLyAyOwotICAgICAgY21wX3ZhbCA9IHN0cmNtcCAobXNnaWQsIGRvbWFpbi0+ZGF0YQotCQkJICAgICAgICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsCi0JCQkJICAgIGRvbWFpbi0+b3JpZ190YWJbYWN0XS5vZmZzZXQpKTsKLSAgICAgIGlmIChjbXBfdmFsIDwgMCkKLQl0b3AgPSBhY3Q7Ci0gICAgICBlbHNlIGlmIChjbXBfdmFsID4gMCkKLQlib3R0b20gPSBhY3QgKyAxOwotICAgICAgZWxzZQotCWJyZWFrOwotICAgIH0KLQotICAvKiBJZiBhbiB0cmFuc2xhdGlvbiBpcyBmb3VuZCByZXR1cm4gdGhpcy4gICovCi0gIHJldHVybiBib3R0b20gPj0gdG9wID8gTlVMTCA6IChjaGFyICopIGRvbWFpbi0+ZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLAotCQkJCSAgICAgZG9tYWluLT50cmFuc190YWJbYWN0XS5vZmZzZXQpOwotfQotCi0KLS8qIFJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbG9jYWxlIENBVEVHT1JZLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICoKLWNhdGVnb3J5X3RvX25hbWUgKGNhdGVnb3J5KQotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICBzd2l0Y2ggKGNhdGVnb3J5KQotICB7Ci0jaWZkZWYgTENfQ09MTEFURQotICBjYXNlIExDX0NPTExBVEU6Ci0gICAgcmV0dmFsID0gIkxDX0NPTExBVEUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfQ1RZUEUKLSAgY2FzZSBMQ19DVFlQRToKLSAgICByZXR2YWwgPSAiTENfQ1RZUEUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTU9ORVRBUlkKLSAgY2FzZSBMQ19NT05FVEFSWToKLSAgICByZXR2YWwgPSAiTENfTU9ORVRBUlkiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTlVNRVJJQwotICBjYXNlIExDX05VTUVSSUM6Ci0gICAgcmV0dmFsID0gIkxDX05VTUVSSUMiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfVElNRQotICBjYXNlIExDX1RJTUU6Ci0gICAgcmV0dmFsID0gIkxDX1RJTUUiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfTUVTU0FHRVMKLSAgY2FzZSBMQ19NRVNTQUdFUzoKLSAgICByZXR2YWwgPSAiTENfTUVTU0FHRVMiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfUkVTUE9OU0UKLSAgY2FzZSBMQ19SRVNQT05TRToKLSAgICByZXR2YWwgPSAiTENfUkVTUE9OU0UiOwotICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgTENfQUxMCi0gIGNhc2UgTENfQUxMOgotICAgIC8qIFRoaXMgbWlnaHQgbm90IG1ha2Ugc2Vuc2UgYnV0IGlzIHBlcmhhcHMgYmV0dGVyIHRoYW4gYW55IG90aGVyCi0gICAgICAgdmFsdWUuICAqLwotICAgIHJldHZhbCA9ICJMQ19BTEwiOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgLyogSWYgeW91IGhhdmUgYSBiZXR0ZXIgaWRlYSBmb3IgYSBkZWZhdWx0IHZhbHVlIGxldCBtZSBrbm93LiAgKi8KLSAgICByZXR2YWwgPSAiTENfWFhYIjsKLSAgfQotCi0gIHJldHVybiByZXR2YWw7Ci19Ci0KLS8qIEd1ZXNzIHZhbHVlIG9mIGN1cnJlbnQgbG9jYWxlIGZyb20gdmFsdWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqCi1ndWVzc19jYXRlZ29yeV92YWx1ZSAoY2F0ZWdvcnksIGNhdGVnb3J5bmFtZSkKLSAgICAgaW50IGNhdGVnb3J5OwotICAgICBjb25zdCBjaGFyICpjYXRlZ29yeW5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnJldHZhbDsKLQotICAvKiBUaGUgaGlnaGVzdCBwcmlvcml0eSB2YWx1ZSBpcyB0aGUgYExBTkdVQUdFJyBlbnZpcm9ubWVudAotICAgICB2YXJpYWJsZS4gIFRoaXMgaXMgYSBHTlUgZXh0ZW5zaW9uLiAgKi8KLSAgcmV0dmFsID0gZ2V0ZW52ICgiTEFOR1VBR0UiKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogYExBTkdVQUdFJyBpcyBub3Qgc2V0LiAgU28gd2UgaGF2ZSB0byBwcm9jZWVkIHdpdGggdGhlIFBPU0lYCi0gICAgIG1ldGhvZHMgb2YgbG9va2luZyB0byBgTENfQUxMJywgYExDX3h4eCcsIGFuZCBgTEFORycuICBPbiBzb21lCi0gICAgIHN5c3RlbXMgdGhpcyBjYW4gYmUgZG9uZSBieSB0aGUgYHNldGxvY2FsZScgZnVuY3Rpb24gaXRzZWxmLiAgKi8KLSNpZiBkZWZpbmVkIEhBVkVfU0VUTE9DQUxFICYmIGRlZmluZWQgSEFWRV9MQ19NRVNTQUdFUyAmJiBkZWZpbmVkIEhBVkVfTE9DQUxFX05VTEwKLSAgcmV0dXJuIHNldGxvY2FsZSAoY2F0ZWdvcnksIE5VTEwpOwotI2Vsc2UKLSAgLyogU2V0dGluZyBvZiBMQ19BTEwgb3ZlcndyaXRlcyBhbGwgb3RoZXIuICAqLwotICByZXR2YWwgPSBnZXRlbnYgKCJMQ19BTEwiKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogTmV4dCBjb21lcyB0aGUgbmFtZSBvZiB0aGUgZGVzaXJlZCBjYXRlZ29yeS4gICovCi0gIHJldHZhbCA9IGdldGVudiAoY2F0ZWdvcnluYW1lKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogTGFzdCBwb3NzaWJpbGl0eSBpcyB0aGUgTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gICovCi0gIHJldHZhbCA9IGdldGVudiAoIkxBTkciKTsKLSAgaWYgKHJldHZhbCAhPSBOVUxMICYmIHJldHZhbFswXSAhPSAnXDAnKQotICAgIHJldHVybiByZXR2YWw7Ci0KLSAgLyogV2UgdXNlIEMgYXMgdGhlIGRlZmF1bHQgZG9tYWluLiAgUE9TSVggc2F5cyB0aGlzIGlzIGltcGxlbWVudGF0aW9uCi0gICAgIGRlZmluZWQuICAqLwotICByZXR1cm4gIkMiOwotI2VuZGlmCi19Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZGdldHRleHQuYyBiL2ludGwvZGdldHRleHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkZTY3Ny4uMDAwMDAwMAotLS0gYS9pbnRsL2RnZXR0ZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBkZ2V0dGV4dC5jIC0tIGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZ2V0dGV4dCgzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9MT0NBTEVfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPGxvY2FsZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIERHRVRURVhUIF9fZGdldHRleHQKLSMgZGVmaW5lIERDR0VUVEVYVCBfX2RjZ2V0dGV4dAotI2Vsc2UKLSMgZGVmaW5lIERHRVRURVhUIGRnZXR0ZXh0X18KLSMgZGVmaW5lIERDR0VUVEVYVCBkY2dldHRleHRfXwotI2VuZGlmCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIG9mIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotY2hhciAqCi1ER0VUVEVYVCAoZG9tYWlubmFtZSwgbXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICByZXR1cm4gRENHRVRURVhUIChkb21haW5uYW1lLCBtc2dpZCwgTENfTUVTU0FHRVMpOwotfQotCi0jaWZkZWYgX0xJQkMKLS8qIEFsaWFzIGZvciBmdW5jdGlvbiBuYW1lIGluIEdOVSBDIExpYnJhcnkuICAqLwotd2Vha19hbGlhcyAoX19kZ2V0dGV4dCwgZGdldHRleHQpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9pbnRsL2V4cGxvZGVuYW1lLmMgYi9pbnRsL2V4cGxvZGVuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzQ2ZTkuLjAwMDAwMDAKLS0tIGEvaW50bC9leHBsb2RlbmFtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotLyogT24gc29tZSBzdHJhbmdlIHN5c3RlbXMgc3RpbGwgbm8gZGVmaW5pdGlvbiBvZiBOVUxMIGlzIGZvdW5kLiAgU2lnaCEgICovCi0jaWZuZGVmIE5VTEwKLSMgaWYgZGVmaW5lZCBfX1NURENfXyAmJiBfX1NURENfXwotIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jIGVsc2UKLSMgIGRlZmluZSBOVUxMIDAKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLWludAotX25sX2V4cGxvZGVfbmFtZSAobmFtZSwgbGFuZ3VhZ2UsIG1vZGlmaWVyLCB0ZXJyaXRvcnksIGNvZGVzZXQsCi0JCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBzcGVjaWFsLCBzcG9uc29yLCByZXZpc2lvbikKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqKmxhbmd1YWdlOwotICAgICBjb25zdCBjaGFyICoqbW9kaWZpZXI7Ci0gICAgIGNvbnN0IGNoYXIgKip0ZXJyaXRvcnk7Ci0gICAgIGNvbnN0IGNoYXIgKipjb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICoqbm9ybWFsaXplZF9jb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICoqc3BlY2lhbDsKLSAgICAgY29uc3QgY2hhciAqKnNwb25zb3I7Ci0gICAgIGNvbnN0IGNoYXIgKipyZXZpc2lvbjsKLXsKLSAgZW51bSB7IHVuZGVjaWRlZCwgeHBnLCBjZW4gfSBzeW50YXg7Ci0gIGNoYXIgKmNwOwotICBpbnQgbWFzazsKLQotICAqbW9kaWZpZXIgPSBOVUxMOwotICAqdGVycml0b3J5ID0gTlVMTDsKLSAgKmNvZGVzZXQgPSBOVUxMOwotICAqbm9ybWFsaXplZF9jb2Rlc2V0ID0gTlVMTDsKLSAgKnNwZWNpYWwgPSBOVUxMOwotICAqc3BvbnNvciA9IE5VTEw7Ci0gICpyZXZpc2lvbiA9IE5VTEw7Ci0KLSAgLyogTm93IHdlIGRldGVybWluZSB0aGUgc2luZ2xlIHBhcnRzIG9mIHRoZSBsb2NhbGUgbmFtZS4gIEZpcnN0Ci0gICAgIGxvb2sgZm9yIHRoZSBsYW5ndWFnZS4gIFRlcm1pbmF0aW9uIHN5bWJvbHMgYXJlIGBfJyBhbmQgYEAnIGlmCi0gICAgIHdlIHVzZSBYUEc0IHN0eWxlLCBhbmQgYF8nLCBgKycsIGFuZCBgLCcgaWYgd2UgdXNlIENFTiBzeW50YXguICAqLwotICBtYXNrID0gMDsKLSAgc3ludGF4ID0gdW5kZWNpZGVkOwotICAqbGFuZ3VhZ2UgPSBjcCA9IG5hbWU7Ci0gIHdoaWxlIChjcFswXSAhPSAnXDAnICYmIGNwWzBdICE9ICdfJyAmJiBjcFswXSAhPSAnQCcKLQkgJiYgY3BbMF0gIT0gJysnICYmIGNwWzBdICE9ICcsJykKLSAgICArK2NwOwotCi0gIGlmICgqbGFuZ3VhZ2UgPT0gY3ApCi0gICAgLyogVGhpcyBkb2VzIG5vdCBtYWtlIHNlbnNlOiBsYW5ndWFnZSBoYXMgdG8gYmUgc3BlY2lmaWVkLiAgVXNlCi0gICAgICAgdGhpcyBlbnRyeSBhcyBpdCBpcyB3aXRob3V0IGV4cGxvZGluZy4gIFBlcmhhcHMgaXQgaXMgYW4gYWxpYXMuICAqLwotICAgIGNwID0gc3RyY2hyICgqbGFuZ3VhZ2UsICdcMCcpOwotICBlbHNlIGlmIChjcFswXSA9PSAnXycpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgdGVycml0b3J5LiAgKi8KLSAgICAgIGNwWzBdID0gJ1wwJzsKLSAgICAgICp0ZXJyaXRvcnkgPSArK2NwOwotCi0gICAgICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnLicgJiYgY3BbMF0gIT0gJ0AnCi0JICAgICAmJiBjcFswXSAhPSAnKycgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkrK2NwOwotCi0gICAgICBtYXNrIHw9IFRFUlJJVE9SWTsKLQotICAgICAgaWYgKGNwWzBdID09ICcuJykKLQl7Ci0JICAvKiBOZXh0IGlzIHRoZSBjb2Rlc2V0LiAgKi8KLQkgIHN5bnRheCA9IHhwZzsKLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpjb2Rlc2V0ID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJ0AnKQotCSAgICArK2NwOwotCi0JICBtYXNrIHw9IFhQR19DT0RFU0VUOwotCi0JICBpZiAoKmNvZGVzZXQgIT0gY3AgJiYgKCpjb2Rlc2V0KVswXSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgKm5vcm1hbGl6ZWRfY29kZXNldCA9IF9ubF9ub3JtYWxpemVfY29kZXNldCAoKmNvZGVzZXQsCi0JCQkJCQkJICAgY3AgLSAqY29kZXNldCk7Ci0JICAgICAgaWYgKHN0cmNtcCAoKmNvZGVzZXQsICpub3JtYWxpemVkX2NvZGVzZXQpID09IDApCi0JCWZyZWUgKChjaGFyICopICpub3JtYWxpemVkX2NvZGVzZXQpOwotCSAgICAgIGVsc2UKLQkJbWFzayB8PSBYUEdfTk9STV9DT0RFU0VUOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoY3BbMF0gPT0gJ0AnIHx8IChzeW50YXggIT0geHBnICYmIGNwWzBdID09ICcrJykpCi0gICAgewotICAgICAgLyogTmV4dCBpcyB0aGUgbW9kaWZpZXIuICAqLwotICAgICAgc3ludGF4ID0gY3BbMF0gPT0gJ0AnID8geHBnIDogY2VuOwotICAgICAgY3BbMF0gPSAnXDAnOwotICAgICAgKm1vZGlmaWVyID0gKytjcDsKLQotICAgICAgd2hpbGUgKHN5bnRheCA9PSBjZW4gJiYgY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnKycKLQkgICAgICYmIGNwWzBdICE9ICcsJyAmJiBjcFswXSAhPSAnXycpCi0JKytjcDsKLQotICAgICAgbWFzayB8PSBYUEdfTU9ESUZJRVIgfCBDRU5fQVVESUVOQ0U7Ci0gICAgfQotCi0gIGlmIChzeW50YXggIT0geHBnICYmIChjcFswXSA9PSAnKycgfHwgY3BbMF0gPT0gJywnIHx8IGNwWzBdID09ICdfJykpCi0gICAgewotICAgICAgc3ludGF4ID0gY2VuOwotCi0gICAgICBpZiAoY3BbMF0gPT0gJysnKQotCXsKLSAJICAvKiBOZXh0IGlzIHNwZWNpYWwgYXBwbGljYXRpb24gKENFTiBzeW50YXgpLiAgKi8KLQkgIGNwWzBdID0gJ1wwJzsKLQkgICpzcGVjaWFsID0gKytjcDsKLQotCSAgd2hpbGUgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJywnICYmIGNwWzBdICE9ICdfJykKLQkgICAgKytjcDsKLQotCSAgbWFzayB8PSBDRU5fU1BFQ0lBTDsKLQl9Ci0KLSAgICAgIGlmIChjcFswXSA9PSAnLCcpCi0JewotIAkgIC8qIE5leHQgaXMgc3BvbnNvciAoQ0VOIHN5bnRheCkuICAqLwotCSAgY3BbMF0gPSAnXDAnOwotCSAgKnNwb25zb3IgPSArK2NwOwotCi0JICB3aGlsZSAoY3BbMF0gIT0gJ1wwJyAmJiBjcFswXSAhPSAnXycpCi0JICAgICsrY3A7Ci0KLQkgIG1hc2sgfD0gQ0VOX1NQT05TT1I7Ci0JfQotCi0gICAgICBpZiAoY3BbMF0gPT0gJ18nKQotCXsKLSAJICAvKiBOZXh0IGlzIHJldmlzaW9uIChDRU4gc3ludGF4KS4gICovCi0JICBjcFswXSA9ICdcMCc7Ci0JICAqcmV2aXNpb24gPSArK2NwOwotCi0JICBtYXNrIHw9IENFTl9SRVZJU0lPTjsKLQl9Ci0gICAgfQotCi0gIC8qIEZvciBDRU4gc3ludGF4IHZhbHVlcyBpdCBtaWdodCBiZSBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUKLSAgICAgc2VwYXJhdG9yIGNoYXJhY3RlciBpbiB0aGUgZmlsZSBuYW1lLCBub3QgZm9yIFhQRyBzeW50YXguICAqLwotICBpZiAoc3ludGF4ID09IHhwZykKLSAgICB7Ci0gICAgICBpZiAoKnRlcnJpdG9yeSAhPSBOVUxMICYmICgqdGVycml0b3J5KVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflRFUlJJVE9SWTsKLQotICAgICAgaWYgKCpjb2Rlc2V0ICE9IE5VTEwgJiYgKCpjb2Rlc2V0KVswXSA9PSAnXDAnKQotCW1hc2sgJj0gflhQR19DT0RFU0VUOwotCi0gICAgICBpZiAoKm1vZGlmaWVyICE9IE5VTEwgJiYgKCptb2RpZmllcilbMF0gPT0gJ1wwJykKLQltYXNrICY9IH5YUEdfTU9ESUZJRVI7Ci0gICAgfQotCi0gIHJldHVybiBtYXNrOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9maW5kZG9tYWluLmMgYi9pbnRsL2ZpbmRkb21haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NWQ0ZC4uMDAwMDAwMAotLS0gYS9pbnRsL2ZpbmRkb21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZWxzZQotIyBpZmRlZiBIQVZFX01BTExPQ19ICi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgZWxzZQotdm9pZCBmcmVlICgpOwotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIEhBVkVfU1RSSU5HX0ggfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHN0cmluZ3MuaD4KLSMgaWZuZGVmIG1lbWNweQotIyAgZGVmaW5lIG1lbWNweShEc3QsIFNyYywgTnVtKSBiY29weSAoU3JjLCBEc3QsIE51bSkKLSMgZW5kaWYKLSNlbmRpZgotI2lmICFIQVZFX1NUUkNIUiAmJiAhZGVmaW5lZCBfTElCQwotIyBpZm5kZWYgc3RyY2hyCi0jICBkZWZpbmUgc3RyY2hyIGluZGV4Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9VTklTVERfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotLyogTGlzdCBvZiBhbHJlYWR5IGxvYWRlZCBkb21haW5zLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfbmxfbG9hZGVkX2RvbWFpbnM7Ci0KLQotLyogUmV0dXJuIGEgZGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbWVzc2FnZSBjYXRhbG9nIGRlc2NyaWJlZCBieQotICAgdGhlIERPTUFJTk5BTUUgYW5kIENBVEVHT1JZIHBhcmFtZXRlcnMgd2l0aCByZXNwZWN0IHRvIHRoZSBjdXJyZW50bHkKLSAgIGVzdGFibGlzaGVkIGJpbmRpbmdzLiAgKi8KLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX2ZpbmRfZG9tYWluIChkaXJuYW1lLCBsb2NhbGUsIGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci0gICAgIGNoYXIgKmxvY2FsZTsKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqcmV0dmFsOwotICBjb25zdCBjaGFyICpsYW5ndWFnZTsKLSAgY29uc3QgY2hhciAqbW9kaWZpZXI7Ci0gIGNvbnN0IGNoYXIgKnRlcnJpdG9yeTsKLSAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OwotICBjb25zdCBjaGFyICpzcGVjaWFsOwotICBjb25zdCBjaGFyICpzcG9uc29yOwotICBjb25zdCBjaGFyICpyZXZpc2lvbjsKLSAgY29uc3QgY2hhciAqYWxpYXNfdmFsdWU7Ci0gIGludCBtYXNrOwotCi0gIC8qIExPQ0FMRSBjYW4gY29uc2lzdCBvZiB1cCB0byBmb3VyIHJlY29nbml6ZWQgcGFydHMgZm9yIHRoZSBYUEcgc3ludGF4OgotCi0JCWxhbmd1YWdlW190ZXJyaXRvcnlbLmNvZGVzZXRdXVtAbW9kaWZpZXJdCi0KLSAgICAgYW5kIHNpeCBwYXJ0cyBmb3IgdGhlIENFTiBzeW50YXg6Ci0KLQlsYW5ndWFnZVtfdGVycml0b3J5XVsrYXVkaWVuY2VdWytzcGVjaWFsXVssW3Nwb25zb3JdW19yZXZpc2lvbl1dCi0KLSAgICAgQmVzaWRlIHRoZSBmaXJzdCBhbGwgb2YgdGhlbSBhcmUgYWxsb3dlZCB0byBiZSBtaXNzaW5nLiAgSWYgdGhlCi0gICAgIGZ1bGwgc3BlY2lmaWVkIGxvY2FsZSBpcyBub3QgZm91bmQsIHRoZSBsZXNzIHNwZWNpZmljIG9uZSBhcmUKLSAgICAgbG9va2VkIGZvci4gIFRoZSB2YXJpb3VzIHBhcnQgd2lsbCBiZSBzdHJpcHBlZCBvZiBhY2NvcmRpbmcgdG8KLSAgICAgdGhlIGZvbGxvd2luZyBvcmRlcjoKLQkJKDEpIHJldmlzaW9uCi0JCSgyKSBzcG9uc29yCi0JCSgzKSBzcGVjaWFsCi0JCSg0KSBjb2Rlc2V0Ci0JCSg1KSBub3JtYWxpemVkIGNvZGVzZXQKLQkJKDYpIHRlcnJpdG9yeQotCQkoNykgYXVkaWVuY2UvbW9kaWZpZXIKLSAgICovCi0KLSAgLyogSWYgd2UgaGF2ZSBhbHJlYWR5IHRlc3RlZCBmb3IgdGhpcyBsb2NhbGUgZW50cnkgdGhlcmUgaGFzIHRvCi0gICAgIGJlIG9uZSBkYXRhIHNldCBpbiB0aGUgbGlzdCBvZiBsb2FkZWQgZG9tYWlucy4gICovCi0gIHJldHZhbCA9IF9ubF9tYWtlX2wxMG5mbGlzdCAoJl9ubF9sb2FkZWRfZG9tYWlucywgZGlybmFtZSwKLQkJCSAgICAgICBzdHJsZW4gKGRpcm5hbWUpICsgMSwgMCwgbG9jYWxlLCBOVUxMLCBOVUxMLAotCQkJICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIGRvbWFpbm5hbWUsIDApOwotICBpZiAocmV0dmFsICE9IE5VTEwpCi0gICAgewotICAgICAgLyogV2Uga25vdyBzb21ldGhpbmcgYWJvdXQgdGhpcyBsb2NhbGUuICAqLwotICAgICAgaW50IGNudDsKLQotICAgICAgaWYgKHJldHZhbC0+ZGVjaWRlZCA9PSAwKQotCV9ubF9sb2FkX2RvbWFpbiAocmV0dmFsKTsKLQotICAgICAgaWYgKHJldHZhbC0+ZGF0YSAhPSBOVUxMKQotCXJldHVybiByZXR2YWw7Ci0KLSAgICAgIGZvciAoY250ID0gMDsgcmV0dmFsLT5zdWNjZXNzb3JbY250XSAhPSBOVUxMOyArK2NudCkKLQl7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGVjaWRlZCA9PSAwKQotCSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbC0+c3VjY2Vzc29yW2NudF0pOwotCi0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQotCSAgICBicmVhazsKLQl9Ci0gICAgICByZXR1cm4gY250ID49IDAgPyByZXR2YWwgOiBOVUxMOwotICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgIH0KLQotICAvKiBTZWUgd2hldGhlciB0aGUgbG9jYWxlIHZhbHVlIGlzIGFuIGFsaWFzLiAgSWYgeWVzIGl0cyB2YWx1ZQotICAgICAqb3ZlcndyaXRlcyogdGhlIGFsaWFzIG5hbWUuICBObyB0ZXN0IGZvciB0aGUgb3JpZ2luYWwgdmFsdWUgaXMKLSAgICAgZG9uZS4gICovCi0gIGFsaWFzX3ZhbHVlID0gX25sX2V4cGFuZF9hbGlhcyAobG9jYWxlKTsKLSAgaWYgKGFsaWFzX3ZhbHVlICE9IE5VTEwpCi0gICAgewotICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbiAoYWxpYXNfdmFsdWUpICsgMTsKLSAgICAgIGxvY2FsZSA9IChjaGFyICopIG1hbGxvYyAobGVuKTsKLSAgICAgIGlmIChsb2NhbGUgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLQotICAgICAgbWVtY3B5IChsb2NhbGUsIGFsaWFzX3ZhbHVlLCBsZW4pOwotICAgIH0KLQotICAvKiBOb3cgd2UgZGV0ZXJtaW5lIHRoZSBzaW5nbGUgcGFydHMgb2YgdGhlIGxvY2FsZSBuYW1lLiAgRmlyc3QKLSAgICAgbG9vayBmb3IgdGhlIGxhbmd1YWdlLiAgVGVybWluYXRpb24gc3ltYm9scyBhcmUgYF8nIGFuZCBgQCcgaWYKLSAgICAgd2UgdXNlIFhQRzQgc3R5bGUsIGFuZCBgXycsIGArJywgYW5kIGAsJyBpZiB3ZSB1c2UgQ0VOIHN5bnRheC4gICovCi0gIG1hc2sgPSBfbmxfZXhwbG9kZV9uYW1lIChsb2NhbGUsICZsYW5ndWFnZSwgJm1vZGlmaWVyLCAmdGVycml0b3J5LAotCQkJICAgJmNvZGVzZXQsICZub3JtYWxpemVkX2NvZGVzZXQsICZzcGVjaWFsLAotCQkJICAgJnNwb25zb3IsICZyZXZpc2lvbik7Ci0KLSAgLyogQ3JlYXRlIGFsbCBwb3NzaWJsZSBsb2NhbGUgZW50cmllcyB3aGljaCBtaWdodCBiZSBpbnRlcmVzdGVkIGluCi0gICAgIGdlbmVyYWxpemF0aW9uLiAgKi8KLSAgcmV0dmFsID0gX25sX21ha2VfbDEwbmZsaXN0ICgmX25sX2xvYWRlZF9kb21haW5zLCBkaXJuYW1lLAotCQkJICAgICAgIHN0cmxlbiAoZGlybmFtZSkgKyAxLCBtYXNrLCBsYW5ndWFnZSwgdGVycml0b3J5LAotCQkJICAgICAgIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCi0JCQkgICAgICAgc3BvbnNvciwgcmV2aXNpb24sIGRvbWFpbm5hbWUsIDEpOwotICBpZiAocmV0dmFsID09IE5VTEwpCi0gICAgLyogVGhpcyBtZWFucyB3ZSBhcmUgb3V0IG9mIGNvcmUuICAqLwotICAgIHJldHVybiBOVUxMOwotCi0gIGlmIChyZXR2YWwtPmRlY2lkZWQgPT0gMCkKLSAgICBfbmxfbG9hZF9kb21haW4gKHJldHZhbCk7Ci0gIGlmIChyZXR2YWwtPmRhdGEgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbnQgY250OwotICAgICAgZm9yIChjbnQgPSAwOyByZXR2YWwtPnN1Y2Nlc3NvcltjbnRdICE9IE5VTEw7ICsrY250KQotCXsKLQkgIGlmIChyZXR2YWwtPnN1Y2Nlc3NvcltjbnRdLT5kZWNpZGVkID09IDApCi0JICAgIF9ubF9sb2FkX2RvbWFpbiAocmV0dmFsLT5zdWNjZXNzb3JbY250XSk7Ci0JICBpZiAocmV0dmFsLT5zdWNjZXNzb3JbY250XS0+ZGF0YSAhPSBOVUxMKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIFRoZSByb29tIGZvciBhbiBhbGlhcyB3YXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkLiAgRnJlZSBpdCBub3cuICAqLwotICBpZiAoYWxpYXNfdmFsdWUgIT0gTlVMTCkKLSAgICBmcmVlIChsb2NhbGUpOwotCi0gIHJldHVybiByZXR2YWw7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2dldHRleHQuYyBiL2ludGwvZ2V0dGV4dC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzM2ZDIxLi4wMDAwMDAwCi0tLSBhL2ludGwvZ2V0dGV4dC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyogSW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dCgzKSBmdW5jdGlvbgotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIF9fbmVlZF9OVUxMCi0jIGluY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSMgaWZkZWYgU1REQ19IRUFERVJTCi0jICBpbmNsdWRlIDxzdGRsaWIuaD4JCS8qIEp1c3QgZm9yIE5VTEwuICAqLwotIyBlbHNlCi0jICBpZmRlZiBIQVZFX1NUUklOR19ICi0jICAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBlbHNlCi0jICAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lcyBmb3IgdGhlIGxpYmludGwgZnVuY3Rpb25zIGFyZSBhIHByb2JsZW0uICBUaGV5IG11c3Qgbm90IGNsYXNoCi0gICB3aXRoIGV4aXN0aW5nIG5hbWVzIGFuZCB0aGV5IHNob3VsZCBmb2xsb3cgQU5TSSBDLiAgQnV0IHRoaXMgc291cmNlCi0gICBjb2RlIGlzIGFsc28gdXNlZCBpbiBHTlUgQyBMaWJyYXJ5IHdoZXJlIHRoZSBuYW1lcyBoYXZlIGEgX18KLSAgIHByZWZpeC4gIFNvIHdlIGhhdmUgdG8gbWFrZSBhIGRpZmZlcmVuY2UgaGVyZS4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIEdFVFRFWFQgX19nZXR0ZXh0Ci0jIGRlZmluZSBER0VUVEVYVCBfX2RnZXR0ZXh0Ci0jZWxzZQotIyBkZWZpbmUgR0VUVEVYVCBnZXR0ZXh0X18KLSMgZGVmaW5lIERHRVRURVhUIGRnZXR0ZXh0X18KLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWNoYXIgKgotR0VUVEVYVCAobXNnaWQpCi0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotewotICByZXR1cm4gREdFVFRFWFQgKE5VTEwsIG1zZ2lkKTsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fZ2V0dGV4dCwgZ2V0dGV4dCk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvZ2V0dGV4dC5oIGIvaW50bC9nZXR0ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNGI5ZTMuLjAwMDAwMDAKLS0tIGEvaW50bC9nZXR0ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyogSW50ZXJuYWwgaGVhZGVyIGZvciBHTlUgZ2V0dGV4dCBpbnRlcm5hdGlvbmFsaXphdGlvbiBmdW5jdGlvbnMKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9HRVRURVhUX0gKLSNkZWZpbmUgX0dFVFRFWFRfSCAxCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgSEFWRV9MSU1JVFNfSCB8fCBfTElCQwotIyBpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLS8qIFRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIEdOVSBtZXNzYWdlIGNhdGFsb2cgZm9ybWF0LiAgKi8KLSNkZWZpbmUgX01BR0lDIDB4OTUwNDEyZGUKLSNkZWZpbmUgX01BR0lDX1NXQVBQRUQgMHhkZTEyMDQ5NQotCi0vKiBSZXZpc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnRseSB1c2VkIC5tbyAoYmluYXJ5KSBmaWxlIGZvcm1hdC4gICovCi0jZGVmaW5lIE1PX1JFVklTSU9OX05VTUJFUiAwCi0KLS8qIFRoZSBmb2xsb3dpbmcgY29udG9ydGlvbnMgYXJlIGFuIGF0dGVtcHQgdG8gdXNlIHRoZSBDIHByZXByb2Nlc3NvcgotICAgdG8gZGV0ZXJtaW5lIGFuIHVuc2lnbmVkIGludGVncmFsIHR5cGUgdGhhdCBpcyAzMiBiaXRzIHdpZGUuICBBbgotICAgYWx0ZXJuYXRpdmUgYXBwcm9hY2ggaXMgdG8gdXNlIGF1dG9jb25mJ3MgQUNfQ0hFQ0tfU0laRU9GIG1hY3JvLCBidXQKLSAgIGRvaW5nIHRoYXQgd291bGQgcmVxdWlyZSB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbXBpbGUgYW5kICpydW4qCi0gICB0aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUuICBMb2NhbGx5IHJ1bm5pbmcgY3Jvc3MtY29tcGlsZWQgZXhlY3V0YWJsZXMKLSAgIGlzIHVzdWFsbHkgbm90IHBvc3NpYmxlLiAgKi8KLQotI2lmIF9fU1REQ19fCi0jIGRlZmluZSBVSU5UX01BWF8zMl9CSVRTIDQyOTQ5NjcyOTVVCi0jZWxzZQotIyBkZWZpbmUgVUlOVF9NQVhfMzJfQklUUyAweEZGRkZGRkZGCi0jZW5kaWYKLQotLyogSWYgVUlOVF9NQVggaXNuJ3QgZGVmaW5lZCwgYXNzdW1lIGl0J3MgYSAzMi1iaXQgdHlwZS4KLSAgIFRoaXMgc2hvdWxkIGJlIHZhbGlkIGZvciBhbGwgc3lzdGVtcyBHTlUgY2FyZXMgYWJvdXQgYmVjYXVzZQotICAgdGhhdCBkb2Vzbid0IGluY2x1ZGUgMTYtYml0IHN5c3RlbXMsIGFuZCBvbmx5IG1vZGVybiBzeXN0ZW1zCi0gICAodGhhdCBjZXJ0YWlubHkgaGF2ZSA8bGltaXRzLmg+KSBoYXZlIDY0Ky1iaXQgaW50ZWdyYWwgdHlwZXMuICAqLwotCi0jaWZuZGVmIFVJTlRfTUFYCi0jIGRlZmluZSBVSU5UX01BWCBVSU5UX01BWF8zMl9CSVRTCi0jZW5kaWYKLQotI2lmIFVJTlRfTUFYID09IFVJTlRfTUFYXzMyX0JJVFMKLXR5cGVkZWYgdW5zaWduZWQgbmxzX3VpbnQzMjsKLSNlbHNlCi0jIGlmIFVTSFJUX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IG5sc191aW50MzI7Ci0jIGVsc2UKLSMgIGlmIFVMT05HX01BWCA9PSBVSU5UX01BWF8zMl9CSVRTCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbmxzX3VpbnQzMjsKLSMgIGVsc2UKLSAgLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIGludGVuZGVkIHRvIHRocm93IGFuIGVycm9yLiAgVXNpbmcgI2Vycm9yIGlzCi0gICAgIG5vdCBwb3J0YWJsZSBlbm91Z2guICAqLwotICAiQ2Fubm90IGRldGVybWluZSB1bnNpZ25lZCAzMi1iaXQgZGF0YSB0eXBlLiIKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotCi0vKiBIZWFkZXIgZm9yIGJpbmFyeSAubW8gZmlsZSBmb3JtYXQuICAqLwotc3RydWN0IG1vX2ZpbGVfaGVhZGVyCi17Ci0gIC8qIFRoZSBtYWdpYyBudW1iZXIuICAqLwotICBubHNfdWludDMyIG1hZ2ljOwotICAvKiBUaGUgcmV2aXNpb24gbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdC4gICovCi0gIG5sc191aW50MzIgcmV2aXNpb247Ci0gIC8qIFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBwYWlycy4gICovCi0gIG5sc191aW50MzIgbnN0cmluZ3M7Ci0gIC8qIE9mZnNldCBvZiB0YWJsZSB3aXRoIHN0YXJ0IG9mZnNldHMgb2Ygb3JpZ2luYWwgc3RyaW5ncy4gICovCi0gIG5sc191aW50MzIgb3JpZ190YWJfb2Zmc2V0OwotICAvKiBPZmZzZXQgb2YgdGFibGUgd2l0aCBzdGFydCBvZmZzZXRzIG9mIHRyYW5zbGF0aW9uIHN0cmluZ3MuICAqLwotICBubHNfdWludDMyIHRyYW5zX3RhYl9vZmZzZXQ7Ci0gIC8qIFNpemUgb2YgaGFzaGluZyB0YWJsZS4gICovCi0gIG5sc191aW50MzIgaGFzaF90YWJfc2l6ZTsKLSAgLyogT2Zmc2V0IG9mIGZpcnN0IGhhc2hpbmcgZW50cnkuICAqLwotICBubHNfdWludDMyIGhhc2hfdGFiX29mZnNldDsKLX07Ci0KLXN0cnVjdCBzdHJpbmdfZGVzYwotewotICAvKiBMZW5ndGggb2YgYWRkcmVzc2VkIHN0cmluZy4gICovCi0gIG5sc191aW50MzIgbGVuZ3RoOwotICAvKiBPZmZzZXQgb2Ygc3RyaW5nIGluIGZpbGUuICAqLwotICBubHNfdWludDMyIG9mZnNldDsKLX07Ci0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0jZW5kaWYJLyogZ2V0dGV4dC5oICAqLwpkaWZmIC0tZ2l0IGEvaW50bC9nZXR0ZXh0UC5oIGIvaW50bC9nZXR0ZXh0UC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjhkNTUyLi4wMDAwMDAwCi0tLSBhL2ludGwvZ2V0dGV4dFAuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIEhlYWRlciBkZXNjcmliaW5nIGludGVybmFscyBvZiBnZXR0ZXh0IGxpYnJhcnkKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBfR0VUVEVYVFBfSAotI2RlZmluZSBfR0VUVEVYVFBfSAotCi0jaW5jbHVkZSAibG9hZGluZm8uaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFcKLSMgZGVmaW5lIFcoZmxhZywgZGF0YSkgKChmbGFnKSA/IFNXQVAgKGRhdGEpIDogKGRhdGEpKQotI2VuZGlmCi0KLQotc3RhdGljIG5sc191aW50MzIgU1dBUCBQQVJBTVMgKChubHNfdWludDMyIGkpKTsKLQotc3RhdGljIGlubGluZSBubHNfdWludDMyCi1TV0FQIChpKQotICAgICBubHNfdWludDMyIGk7Ci17Ci0gIHJldHVybiAoaSA8PCAyNCkgfCAoKGkgJiAweGZmMDApIDw8IDgpIHwgKChpID4+IDgpICYgMHhmZjAwKSB8IChpID4+IDI0KTsKLX0KLQotCi1zdHJ1Y3QgbG9hZGVkX2RvbWFpbgotewotICBjb25zdCBjaGFyICpkYXRhOwotICBpbnQgbXVzdF9zd2FwOwotICBubHNfdWludDMyIG5zdHJpbmdzOwotICBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKm9yaWdfdGFiOwotICBzdHJ1Y3Qgc3RyaW5nX2Rlc2MgKnRyYW5zX3RhYjsKLSAgbmxzX3VpbnQzMiBoYXNoX3NpemU7Ci0gIG5sc191aW50MzIgKmhhc2hfdGFiOwotfTsKLQotc3RydWN0IGJpbmRpbmcKLXsKLSAgc3RydWN0IGJpbmRpbmcgKm5leHQ7Ci0gIGNoYXIgKmRvbWFpbm5hbWU7Ci0gIGNoYXIgKmRpcm5hbWU7Ci19OwotCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICpfbmxfZmluZF9kb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kaXJuYW1lLAotCQkJCQkJIGNoYXIgKl9fbG9jYWxlLAotCQkJCQkJIGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSkpOwotdm9pZCBfbmxfbG9hZF9kb21haW4gUEFSQU1TICgoc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqX19kb21haW4pKTsKLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLSNlbmRpZiAvKiBnZXR0ZXh0UC5oICAqLwpkaWZmIC0tZ2l0IGEvaW50bC9oYXNoLXN0cmluZy5oIGIvaW50bC9oYXNoLXN0cmluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjZlODQxLi4wMDAwMDAwCi0tLSBhL2ludGwvaGFzaC1zdHJpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qIEltcGxlbWVudHMgYSBzdHJpbmcgaGFzaGluZyBmdW5jdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9WQUxVRVNfSAotIyBpbmNsdWRlIDx2YWx1ZXMuaD4KLSNlbmRpZgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZm5kZWYgUEFSQU1TCi0jIGlmIF9fU1REQ19fCi0jICBkZWZpbmUgUEFSQU1TKEFyZ3MpIEFyZ3MKLSMgZWxzZQotIyAgZGVmaW5lIFBBUkFNUyhBcmdzKSAoKQotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIGFzc3VtZSB0byBoYXZlIGB1bnNpZ25lZCBsb25nIGludCcgdmFsdWUgd2l0aCBhdCBsZWFzdCAzMiBiaXRzLiAgKi8KLSNkZWZpbmUgSEFTSFdPUkRCSVRTIDMyCi0KLQotLyogRGVmaW5lcyB0aGUgc28gY2FsbGVkIGBoYXNocGp3JyBmdW5jdGlvbiBieSBQLkouIFdlaW5iZXJnZXIKLSAgIFtzZWUgQWhvL1NldGhpL1VsbG1hbiwgQ09NUElMRVJTOiBQcmluY2lwbGVzLCBUZWNobmlxdWVzIGFuZCBUb29scywKLSAgIDE5ODYsIDE5ODcgQmVsbCBUZWxlcGhvbmUgTGFib3JhdG9yaWVzLCBJbmMuXSAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGhhc2hfc3RyaW5nIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fc3RyX3BhcmFtKSk7Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotaGFzaF9zdHJpbmcgKHN0cl9wYXJhbSkKLSAgICAgY29uc3QgY2hhciAqc3RyX3BhcmFtOwotewotICB1bnNpZ25lZCBsb25nIGludCBodmFsLCBnOwotICBjb25zdCBjaGFyICpzdHIgPSBzdHJfcGFyYW07Ci0KLSAgLyogQ29tcHV0ZSB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHN0cmluZy4gICovCi0gIGh2YWwgPSAwOwotICB3aGlsZSAoKnN0ciAhPSAnXDAnKQotICAgIHsKLSAgICAgIGh2YWwgPDw9IDQ7Ci0gICAgICBodmFsICs9ICh1bnNpZ25lZCBsb25nKSAqc3RyKys7Ci0gICAgICBnID0gaHZhbCAmICgodW5zaWduZWQgbG9uZykgMHhmIDw8IChIQVNIV09SREJJVFMgLSA0KSk7Ci0gICAgICBpZiAoZyAhPSAwKQotCXsKLQkgIGh2YWwgXj0gZyA+PiAoSEFTSFdPUkRCSVRTIC0gOCk7Ci0JICBodmFsIF49IGc7Ci0JfQotICAgIH0KLSAgcmV0dXJuIGh2YWw7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2ludGwtY29tcGF0LmMgYi9pbnRsL2ludGwtY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwM2VmYTAuLjAwMDAwMDAKLS0tIGEvaW50bC9pbnRsLWNvbXBhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyogaW50bC1jb21wYXQuYyAtIFN0dWIgZnVuY3Rpb25zIHRvIGNhbGwgZ2V0dGV4dCBmdW5jdGlvbnMgZnJvbSBHTlUgZ2V0dGV4dAotICAgTGlicmFyeS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0KLS8qIEBAIGVuZCBvZiBwcm9sb2cgQEAgKi8KLQotCi0jdW5kZWYgZ2V0dGV4dAotI3VuZGVmIGRnZXR0ZXh0Ci0jdW5kZWYgZGNnZXR0ZXh0Ci0jdW5kZWYgdGV4dGRvbWFpbgotI3VuZGVmIGJpbmR0ZXh0ZG9tYWluCi0KLQotY2hhciAqCi1iaW5kdGV4dGRvbWFpbiAoZG9tYWlubmFtZSwgZGlybmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqZGlybmFtZTsKLXsKLSAgcmV0dXJuIGJpbmR0ZXh0ZG9tYWluX18gKGRvbWFpbm5hbWUsIGRpcm5hbWUpOwotfQotCi0KLWNoYXIgKgotZGNnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm1zZ2lkOwotICAgICBpbnQgY2F0ZWdvcnk7Ci17Ci0gIHJldHVybiBkY2dldHRleHRfXyAoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KTsKLX0KLQotCi1jaGFyICoKLWRnZXR0ZXh0IChkb21haW5uYW1lLCBtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBkZ2V0dGV4dF9fIChkb21haW5uYW1lLCBtc2dpZCk7Ci19Ci0KLQotY2hhciAqCi1nZXR0ZXh0IChtc2dpZCkKLSAgICAgY29uc3QgY2hhciAqbXNnaWQ7Ci17Ci0gIHJldHVybiBnZXR0ZXh0X18gKG1zZ2lkKTsKLX0KLQotCi1jaGFyICoKLXRleHRkb21haW4gKGRvbWFpbm5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmRvbWFpbm5hbWU7Ci17Ci0gIHJldHVybiB0ZXh0ZG9tYWluX18gKGRvbWFpbm5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvaW50bC9pbnRsaC5pbnN0LmluIGIvaW50bC9pbnRsaC5pbnN0LmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQzMjNjLi4wMDAwMDAwCi0tLSBhL2ludGwvaW50bGguaW5zdC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBNZXNzYWdlIGNhdGFsb2dzIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZm5kZWYgX0xJQklOVExfSAotI2RlZmluZSBfTElCSU5UTF9ICTEKLQotQElOQ0xVREVfTE9DQUxFX0hACi0KLS8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQotICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLQotI2lmbmRlZiBQQVJBTVMKLSMgaWYgX19TVERDX18KLSMgIGRlZmluZSBQQVJBTVMoYXJncykgYXJncwotIyBlbHNlCi0jICBkZWZpbmUgUEFSQU1TKGFyZ3MpICgpCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWV4dGVybiBjaGFyICpnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLSAgIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGNnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKLQkJCQlpbnQgX19jYXRlZ29yeSkpOwotCi0KLS8qIFNldCB0aGUgY3VycmVudCBkZWZhdWx0IG1lc3NhZ2UgY2F0YWxvZyB0byBET01BSU5OQU1FLgotICAgSWYgRE9NQUlOTkFNRSBpcyBudWxsLCByZXR1cm4gdGhlIGN1cnJlbnQgZGVmYXVsdC4KLSAgIElmIERPTUFJTk5BTUUgaXMgIiIsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IG9mICJtZXNzYWdlcyIuICAqLwotZXh0ZXJuIGNoYXIgKnRleHRkb21haW4gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotCi0KLS8qIE9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuICAqLwotI2lmIGRlZmluZWQgX19PUFRJTUlaRUQKLS8qIFRoZXNlIG11c3QgYmUgYSBtYWNyby4gIElubGluZWQgZnVuY3Rpb25zIGFyZSB1c2VsZXNzIGJlY2F1c2UgdGhlCi0gICBgX19idWlsdGluX2NvbnN0YW50X3AnIHByZWRpY2F0ZSBpbiBkY2dldHRleHQgd291bGQgYWx3YXlzIHJldHVybgotICAgZmFsc2UuICAqLwotCi0jIGRlZmluZSBnZXR0ZXh0KG1zZ2lkKSBkZ2V0dGV4dCAoKGNoYXIgKikgMCwgbXNnaWQpCi0KLSMgZGVmaW5lIGRnZXR0ZXh0KGRvbWFpbm5hbWUsIG1zZ2lkKQkJCQkJICAgICAgXAotICBkY2dldHRleHQgKGRvbWFpbm5hbWUsIG1zZ2lkLCBMQ19NRVNTQUdFUykKLQotIyBpZiBfX0dOVUNfXyA+IDIgfHwgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNykKLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gbG9hZG1zZ2NhdC5jLiAgV2UgbmVlZCBhIHNpZ24sCi0gICB3aGV0aGVyIGEgbmV3IGNhdGFsb2cgd2FzIGxvYWRlZCwgd2hpY2ggY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbGwKLSAgIHRyYW5zbGF0aW9ucy4gICovCi1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0KLSMgIGRlZmluZSBkY2dldHRleHQoZG9tYWlubmFtZSwgbXNnaWQsIGNhdGVnb3J5KQkJCSAgICAgIFwKLSAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAotICAgKHsJCQkJCQkJCQkgICAgICBcCi0gICAgIGNoYXIgKl9fcmVzdWx0OwkJCQkJCQkgICAgICBcCi0gICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobXNnaWQpKQkJCQkJICAgICAgXAotICAgICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgc3RhdGljIGNoYXIgKl9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLQkgc3RhdGljIGludCBfX2NhdGFsb2dfY291bnRlcl9fOwkJCQkgICAgICBcCi0JIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKLQkgICB7CQkJCQkJCQkgICAgICBcCi0JICAgICBfX3RyYW5zbGF0aW9uX18gPQkJCQkJCSAgICAgIFwKLQkgICAgICAgKGRjZ2V0dGV4dCkgKChkb21haW5uYW1lKSwgKG1zZ2lkKSwgKGNhdGVnb3J5KSk7CQkgICAgICBcCi0JICAgICBfX2NhdGFsb2dfY291bnRlcl9fID0gX25sX21zZ19jYXRfY250cjsJCQkgICAgICBcCi0JICAgfQkJCQkJCQkJICAgICAgXAotCSBfX3Jlc3VsdCA9IF9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLSAgICAgICB9CQkJCQkJCQkgICAgICBcCi0gICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLSAgICAgICBfX3Jlc3VsdCA9IChkY2dldHRleHQpICgoZG9tYWlubmFtZSksIChtc2dpZCksIChjYXRlZ29yeSkpOwkgICAgICBcCi0gICAgIF9fcmVzdWx0OwkJCQkJCQkJICAgICAgXAotICAgIH0pKQotIyBlbmRpZgotI2VuZGlmIC8qIE9wdGltaXppbmcuICovCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmIC8qIGxpYmludGwuaCAqLwpkaWZmIC0tZ2l0IGEvaW50bC9sMTBuZmxpc3QuYyBiL2ludGwvbDEwbmZsaXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMmJjMTMuLjAwMDAwMDAKLS0tIGEvaW50bC9sMTBuZmxpc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKiBIYW5kbGUgbGlzdCBvZiBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4sIDE5OTUuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jIGluY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBfR05VX1NPVVJDRQotIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9MSUJDIHx8IGRlZmluZWQgSEFWRV9BUkdaX0gKLSMgaW5jbHVkZSA8YXJnei5oPgotI2VuZGlmCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxvYWRpbmZvLmgiCi0KLS8qIE9uIHNvbWUgc3RyYW5nZSBzeXN0ZW1zIHN0aWxsIG5vIGRlZmluaXRpb24gb2YgTlVMTCBpcyBmb3VuZC4gIFNpZ2ghICAqLwotI2lmbmRlZiBOVUxMCi0jIGlmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLSMgIGRlZmluZSBOVUxMICgodm9pZCAqKSAwKQotIyBlbHNlCi0jICBkZWZpbmUgTlVMTCAwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgc3RwY3B5KGRlc3QsIHNyYykgX19zdHBjcHkoZGVzdCwgc3JjKQotI2Vsc2UKLSMgaWZuZGVmIEhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqc3RwY3B5IFBBUkFNUyAoKGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYykpOwotIyBlbmRpZgotI2VuZGlmCi0KLS8qIERlZmluZSBmdW5jdGlvbiB3aGljaCBhcmUgdXN1YWxseSBub3QgYXZhaWxhYmxlLiAgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX0NPVU5UCi0vKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBBUkdaLiAgKi8KLXN0YXRpYyBzaXplX3QgYXJnel9jb3VudF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyZ3osIHNpemVfdCBsZW4pKTsKLQotc3RhdGljIHNpemVfdAotYXJnel9jb3VudF9fIChhcmd6LCBsZW4pCi0gICAgIGNvbnN0IGNoYXIgKmFyZ3o7Ci0gICAgIHNpemVfdCBsZW47Ci17Ci0gIHNpemVfdCBjb3VudCA9IDA7Ci0gIHdoaWxlIChsZW4gPiAwKQotICAgIHsKLSAgICAgIHNpemVfdCBwYXJ0X2xlbiA9IHN0cmxlbiAoYXJneik7Ci0gICAgICBhcmd6ICs9IHBhcnRfbGVuICsgMTsKLSAgICAgIGxlbiAtPSBwYXJ0X2xlbiArIDE7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgcmV0dXJuIGNvdW50OwotfQotIyB1bmRlZiBfX2FyZ3pfY291bnQKLSMgZGVmaW5lIF9fYXJnel9jb3VudChhcmd6LCBsZW4pIGFyZ3pfY291bnRfXyAoYXJneiwgbGVuKQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfQ09VTlQgKi8KLQotI2lmICFkZWZpbmVkIF9MSUJDICYmICFkZWZpbmVkIEhBVkVfX19BUkdaX1NUUklOR0lGWQotLyogTWFrZSAnXDAnIHNlcGFyYXRlZCBhcmcgdmVjdG9yIEFSR1ogcHJpbnRhYmxlIGJ5IGNvbnZlcnRpbmcgYWxsIHRoZSAnXDAncwotICAgZXhjZXB0IHRoZSBsYXN0IGludG8gdGhlIGNoYXJhY3RlciBTRVAuICAqLwotc3RhdGljIHZvaWQgYXJnel9zdHJpbmdpZnlfXyBQQVJBTVMgKChjaGFyICphcmd6LCBzaXplX3QgbGVuLCBpbnQgc2VwKSk7Ci0KLXN0YXRpYyB2b2lkCi1hcmd6X3N0cmluZ2lmeV9fIChhcmd6LCBsZW4sIHNlcCkKLSAgICAgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGxlbjsKLSAgICAgaW50IHNlcDsKLXsKLSAgd2hpbGUgKGxlbiA+IDApCi0gICAgewotICAgICAgc2l6ZV90IHBhcnRfbGVuID0gc3RybGVuIChhcmd6KTsKLSAgICAgIGFyZ3ogKz0gcGFydF9sZW47Ci0gICAgICBsZW4gLT0gcGFydF9sZW4gKyAxOwotICAgICAgaWYgKGxlbiA+IDApCi0JKmFyZ3orKyA9IHNlcDsKLSAgICB9Ci19Ci0jIHVuZGVmIF9fYXJnel9zdHJpbmdpZnkKLSMgZGVmaW5lIF9fYXJnel9zdHJpbmdpZnkoYXJneiwgbGVuLCBzZXApIGFyZ3pfc3RyaW5naWZ5X18gKGFyZ3osIGxlbiwgc2VwKQotI2VuZGlmCS8qICFfTElCQyAmJiAhSEFWRV9fX0FSR1pfU1RSSU5HSUZZICovCi0KLSNpZiAhZGVmaW5lZCBfTElCQyAmJiAhZGVmaW5lZCBIQVZFX19fQVJHWl9ORVhUCi1zdGF0aWMgY2hhciAqYXJnel9uZXh0X18gUEFSQU1TICgoY2hhciAqYXJneiwgc2l6ZV90IGFyZ3pfbGVuLAotCQkJCSAgY29uc3QgY2hhciAqZW50cnkpKTsKLQotc3RhdGljIGNoYXIgKgotYXJnel9uZXh0X18gKGFyZ3osIGFyZ3pfbGVuLCBlbnRyeSkKLSAgICAgY2hhciAqYXJnejsKLSAgICAgc2l6ZV90IGFyZ3pfbGVuOwotICAgICBjb25zdCBjaGFyICplbnRyeTsKLXsKLSAgaWYgKGVudHJ5KQotICAgIHsKLSAgICAgIGlmIChlbnRyeSA8IGFyZ3ogKyBhcmd6X2xlbikKLSAgICAgICAgZW50cnkgPSBzdHJjaHIgKGVudHJ5LCAnXDAnKSArIDE7Ci0KLSAgICAgIHJldHVybiBlbnRyeSA+PSBhcmd6ICsgYXJnel9sZW4gPyBOVUxMIDogKGNoYXIgKikgZW50cnk7Ci0gICAgfQotICBlbHNlCi0gICAgaWYgKGFyZ3pfbGVuID4gMCkKLSAgICAgIHJldHVybiBhcmd6OwotICAgIGVsc2UKLSAgICAgIHJldHVybiAwOwotfQotIyB1bmRlZiBfX2FyZ3pfbmV4dAotIyBkZWZpbmUgX19hcmd6X25leHQoYXJneiwgbGVuLCBlbnRyeSkgYXJnel9uZXh0X18gKGFyZ3osIGxlbiwgZW50cnkpCi0jZW5kaWYJLyogIV9MSUJDICYmICFIQVZFX19fQVJHWl9ORVhUICovCi0KLQotLyogUmV0dXJuIG51bWJlciBvZiBiaXRzIHNldCBpbiBYLiAgKi8KLXN0YXRpYyBpbnQgcG9wIFBBUkFNUyAoKGludCB4KSk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1wb3AgKHgpCi0gICAgIGludCB4OwotewotICAvKiBXZSBhc3N1bWUgdGhhdCBubyBtb3JlIHRoYW4gMTYgYml0cyBhcmUgdXNlZC4gICovCi0gIHggPSAoKHggJiB+MHg1NTU1KSA+PiAxKSArICh4ICYgMHg1NTU1KTsKLSAgeCA9ICgoeCAmIH4weDMzMzMpID4+IDIpICsgKHggJiAweDMzMzMpOwotICB4ID0gKCh4ID4+IDQpICsgeCkgJiAweDBmMGY7Ci0gIHggPSAoKHggPj4gOCkgKyB4KSAmIDB4ZmY7Ci0KLSAgcmV0dXJuIHg7Ci19Ci0KLQwKLXN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IChsMTBuZmlsZV9saXN0LCBkaXJsaXN0LCBkaXJsaXN0X2xlbiwgbWFzaywgbGFuZ3VhZ2UsCi0JCSAgICB0ZXJyaXRvcnksIGNvZGVzZXQsIG5vcm1hbGl6ZWRfY29kZXNldCwgbW9kaWZpZXIsIHNwZWNpYWwsCi0JCSAgICBzcG9uc29yLCByZXZpc2lvbiwgZmlsZW5hbWUsIGRvX2FsbG9jYXRlKQotICAgICBzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICoqbDEwbmZpbGVfbGlzdDsKLSAgICAgY29uc3QgY2hhciAqZGlybGlzdDsKLSAgICAgc2l6ZV90IGRpcmxpc3RfbGVuOwotICAgICBpbnQgbWFzazsKLSAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2U7Ci0gICAgIGNvbnN0IGNoYXIgKnRlcnJpdG9yeTsKLSAgICAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgICAgY29uc3QgY2hhciAqbm9ybWFsaXplZF9jb2Rlc2V0OwotICAgICBjb25zdCBjaGFyICptb2RpZmllcjsKLSAgICAgY29uc3QgY2hhciAqc3BlY2lhbDsKLSAgICAgY29uc3QgY2hhciAqc3BvbnNvcjsKLSAgICAgY29uc3QgY2hhciAqcmV2aXNpb247Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBpbnQgZG9fYWxsb2NhdGU7Ci17Ci0gIGNoYXIgKmFic19maWxlbmFtZTsKLSAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqbGFzdCA9IE5VTEw7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnJldHZhbDsKLSAgY2hhciAqY3A7Ci0gIHNpemVfdCBlbnRyaWVzOwotICBpbnQgY250OwotCi0gIC8qIEFsbG9jYXRlIHJvb20gZm9yIHRoZSBmdWxsIGZpbGUgbmFtZS4gICovCi0gIGFic19maWxlbmFtZSA9IChjaGFyICopIG1hbGxvYyAoZGlybGlzdF9sZW4KLQkJCQkgICsgc3RybGVuIChsYW5ndWFnZSkKLQkJCQkgICsgKChtYXNrICYgVEVSUklUT1JZKSAhPSAwCi0JCQkJICAgICA/IHN0cmxlbiAodGVycml0b3J5KSArIDEgOiAwKQotCQkJCSAgKyAoKG1hc2sgJiBYUEdfQ09ERVNFVCkgIT0gMAotCQkJCSAgICAgPyBzdHJsZW4gKGNvZGVzZXQpICsgMSA6IDApCi0JCQkJICArICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChub3JtYWxpemVkX2NvZGVzZXQpICsgMSA6IDApCi0JCQkJICArICgoKG1hc2sgJiBYUEdfTU9ESUZJRVIpICE9IDAKLQkJCQkgICAgICB8fCAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCkKLQkJCQkgICAgID8gc3RybGVuIChtb2RpZmllcikgKyAxIDogMCkKLQkJCQkgICsgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDAKLQkJCQkgICAgID8gc3RybGVuIChzcGVjaWFsKSArIDEgOiAwKQotCQkJCSAgKyAoKChtYXNrICYgQ0VOX1NQT05TT1IpICE9IDAKLQkJCQkgICAgICB8fCAobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMCkKLQkJCQkgICAgID8gKDEgKyAoKG1hc2sgJiBDRU5fU1BPTlNPUikgIT0gMAotCQkJCQkgICAgID8gc3RybGVuIChzcG9uc29yKSArIDEgOiAwKQotCQkJCQkrICgobWFzayAmIENFTl9SRVZJU0lPTikgIT0gMAotCQkJCQkgICA/IHN0cmxlbiAocmV2aXNpb24pICsgMSA6IDApKSA6IDApCi0JCQkJICArIDEgKyBzdHJsZW4gKGZpbGVuYW1lKSArIDEpOwotCi0gIGlmIChhYnNfZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR2YWwgPSBOVUxMOwotICBsYXN0ID0gTlVMTDsKLQotICAvKiBDb25zdHJ1Y3QgZmlsZSBuYW1lLiAgKi8KLSAgbWVtY3B5IChhYnNfZmlsZW5hbWUsIGRpcmxpc3QsIGRpcmxpc3RfbGVuKTsKLSAgX19hcmd6X3N0cmluZ2lmeSAoYWJzX2ZpbGVuYW1lLCBkaXJsaXN0X2xlbiwgJzonKTsKLSAgY3AgPSBhYnNfZmlsZW5hbWUgKyAoZGlybGlzdF9sZW4gLSAxKTsKLSAgKmNwKysgPSAnLyc7Ci0gIGNwID0gc3RwY3B5IChjcCwgbGFuZ3VhZ2UpOwotCi0gIGlmICgobWFzayAmIFRFUlJJVE9SWSkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICdfJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgdGVycml0b3J5KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwKQotICAgIHsKLSAgICAgICpjcCsrID0gJy4nOwotICAgICAgY3AgPSBzdHBjcHkgKGNwLCBjb2Rlc2V0KTsKLSAgICB9Ci0gIGlmICgobWFzayAmIFhQR19OT1JNX0NPREVTRVQpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnLic7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIG5vcm1hbGl6ZWRfY29kZXNldCk7Ci0gICAgfQotICBpZiAoKG1hc2sgJiAoWFBHX01PRElGSUVSIHwgQ0VOX0FVRElFTkNFKSkgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBUaGlzIGNvbXBvbmVudCBjYW4gYmUgcGFydCBvZiBib3RoIHN5bnRhY2VzIGJ1dCBoYXMgZGlmZmVyZW50Ci0JIGxlYWRpbmcgY2hhcmFjdGVycy4gIEZvciBDRU4gd2UgdXNlIGArJywgZWxzZSBgQCcuICAqLwotICAgICAgKmNwKysgPSAobWFzayAmIENFTl9BVURJRU5DRSkgIT0gMCA/ICcrJyA6ICdAJzsKLSAgICAgIGNwID0gc3RwY3B5IChjcCwgbW9kaWZpZXIpOwotICAgIH0KLSAgaWYgKChtYXNrICYgQ0VOX1NQRUNJQUwpICE9IDApCi0gICAgewotICAgICAgKmNwKysgPSAnKyc7Ci0gICAgICBjcCA9IHN0cGNweSAoY3AsIHNwZWNpYWwpOwotICAgIH0KLSAgaWYgKChtYXNrICYgKENFTl9TUE9OU09SIHwgQ0VOX1JFVklTSU9OKSkgIT0gMCkKLSAgICB7Ci0gICAgICAqY3ArKyA9ICcsJzsKLSAgICAgIGlmICgobWFzayAmIENFTl9TUE9OU09SKSAhPSAwKQotCWNwID0gc3RwY3B5IChjcCwgc3BvbnNvcik7Ci0gICAgICBpZiAoKG1hc2sgJiBDRU5fUkVWSVNJT04pICE9IDApCi0JewotCSAgKmNwKysgPSAnXyc7Ci0JICBjcCA9IHN0cGNweSAoY3AsIHJldmlzaW9uKTsKLQl9Ci0gICAgfQotCi0gICpjcCsrID0gJy8nOwotICBzdHBjcHkgKGNwLCBmaWxlbmFtZSk7Ci0KLSAgLyogTG9vayBpbiBsaXN0IG9mIGFscmVhZHkgbG9hZGVkIGRvbWFpbnMgd2hldGhlciBpdCBpcyBhbHJlYWR5Ci0gICAgIGF2YWlsYWJsZS4gICovCi0gIGxhc3QgPSBOVUxMOwotICBmb3IgKHJldHZhbCA9ICpsMTBuZmlsZV9saXN0OyByZXR2YWwgIT0gTlVMTDsgcmV0dmFsID0gcmV0dmFsLT5uZXh0KQotICAgIGlmIChyZXR2YWwtPmZpbGVuYW1lICE9IE5VTEwpCi0gICAgICB7Ci0JaW50IGNvbXBhcmUgPSBzdHJjbXAgKHJldHZhbC0+ZmlsZW5hbWUsIGFic19maWxlbmFtZSk7Ci0JaWYgKGNvbXBhcmUgPT0gMCkKLQkgIC8qIFdlIGZvdW5kIGl0ISAgKi8KLQkgIGJyZWFrOwotCWlmIChjb21wYXJlIDwgMCkKLQkgIHsKLQkgICAgLyogSXQncyBub3QgaW4gdGhlIGxpc3QuICAqLwotCSAgICByZXR2YWwgPSBOVUxMOwotCSAgICBicmVhazsKLQkgIH0KLQotCWxhc3QgPSByZXR2YWw7Ci0gICAgICB9Ci0KLSAgaWYgKHJldHZhbCAhPSBOVUxMIHx8IGRvX2FsbG9jYXRlID09IDApCi0gICAgewotICAgICAgZnJlZSAoYWJzX2ZpbGVuYW1lKTsKLSAgICAgIHJldHVybiByZXR2YWw7Ci0gICAgfQotCi0gIHJldHZhbCA9IChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopCi0gICAgbWFsbG9jIChzaXplb2YgKCpyZXR2YWwpICsgKF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pCi0JCQkJKiAoMSA8PCBwb3AgKG1hc2spKQotCQkJCSogc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2wxMG5maWxlICopKSk7Ci0gIGlmIChyZXR2YWwgPT0gTlVMTCkKLSAgICByZXR1cm4gTlVMTDsKLQotICByZXR2YWwtPmZpbGVuYW1lID0gYWJzX2ZpbGVuYW1lOwotICByZXR2YWwtPmRlY2lkZWQgPSAoX19hcmd6X2NvdW50IChkaXJsaXN0LCBkaXJsaXN0X2xlbikgIT0gMQotCQkgICAgIHx8ICgobWFzayAmIFhQR19DT0RFU0VUKSAhPSAwCi0JCQkgJiYgKG1hc2sgJiBYUEdfTk9STV9DT0RFU0VUKSAhPSAwKSk7Ci0gIHJldHZhbC0+ZGF0YSA9IE5VTEw7Ci0KLSAgaWYgKGxhc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICByZXR2YWwtPm5leHQgPSAqbDEwbmZpbGVfbGlzdDsKLSAgICAgICpsMTBuZmlsZV9saXN0ID0gcmV0dmFsOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJldHZhbC0+bmV4dCA9IGxhc3QtPm5leHQ7Ci0gICAgICBsYXN0LT5uZXh0ID0gcmV0dmFsOwotICAgIH0KLQotICBlbnRyaWVzID0gMDsKLSAgLyogSWYgdGhlIERJUkxJU1QgaXMgYSByZWFsIGxpc3QgdGhlIFJFVFZBTCBlbnRyeSBjb3JyZXNwb25kcyBub3QgdG8KLSAgICAgYSByZWFsIGZpbGUuICBTbyB3ZSBoYXZlIHRvIHVzZSB0aGUgRElSTElTVCBzZXBhcmF0aW9uIG1lY2hhbmlzbQotICAgICBvZiB0aGUgaW5uZXIgbG9vcC4gICovCi0gIGNudCA9IF9fYXJnel9jb3VudCAoZGlybGlzdCwgZGlybGlzdF9sZW4pID09IDEgPyBtYXNrIC0gMSA6IG1hc2s7Ci0gIGZvciAoOyBjbnQgPj0gMDsgLS1jbnQpCi0gICAgaWYgKChjbnQgJiB+bWFzaykgPT0gMAotCSYmICgoY250ICYgQ0VOX1NQRUNJRklDKSA9PSAwIHx8IChjbnQgJiBYUEdfU1BFQ0lGSUMpID09IDApCi0JJiYgKChjbnQgJiBYUEdfQ09ERVNFVCkgPT0gMCB8fCAoY250ICYgWFBHX05PUk1fQ09ERVNFVCkgPT0gMCkpCi0gICAgICB7Ci0JLyogSXRlcmF0ZSBvdmVyIGFsbCBlbGVtZW50cyBvZiB0aGUgRElSTElTVC4gICovCi0JY2hhciAqZGlyID0gTlVMTDsKLQotCXdoaWxlICgoZGlyID0gX19hcmd6X25leHQgKChjaGFyICopIGRpcmxpc3QsIGRpcmxpc3RfbGVuLCBkaXIpKQotCSAgICAgICAhPSBOVUxMKQotCSAgcmV0dmFsLT5zdWNjZXNzb3JbZW50cmllcysrXQotCSAgICA9IF9ubF9tYWtlX2wxMG5mbGlzdCAobDEwbmZpbGVfbGlzdCwgZGlyLCBzdHJsZW4gKGRpcikgKyAxLCBjbnQsCi0JCQkJICBsYW5ndWFnZSwgdGVycml0b3J5LCBjb2Rlc2V0LAotCQkJCSAgbm9ybWFsaXplZF9jb2Rlc2V0LCBtb2RpZmllciwgc3BlY2lhbCwKLQkJCQkgIHNwb25zb3IsIHJldmlzaW9uLCBmaWxlbmFtZSwgMSk7Ci0gICAgICB9Ci0gIHJldHZhbC0+c3VjY2Vzc29yW2VudHJpZXNdID0gTlVMTDsKLQotICByZXR1cm4gcmV0dmFsOwotfQotDAotLyogTm9ybWFsaXplIGNvZGVzZXQgbmFtZS4gIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGZvciB0aGUgY29kZXNldAotICAgbmFtZXMuICBOb3JtYWxpemF0aW9uIGFsbG93cyB0aGUgdXNlciB0byB1c2UgYW55IG9mIHRoZSBjb21tb24KLSAgIG5hbWVzLiAgKi8KLWNvbnN0IGNoYXIgKgotX25sX25vcm1hbGl6ZV9jb2Rlc2V0IChjb2Rlc2V0LCBuYW1lX2xlbikKLSAgICAgY29uc3QgY2hhciAqY29kZXNldDsKLSAgICAgc2l6ZV90IG5hbWVfbGVuOwotewotICBpbnQgbGVuID0gMDsKLSAgaW50IG9ubHlfZGlnaXQgPSAxOwotICBjaGFyICpyZXR2YWw7Ci0gIGNoYXIgKndwOwotICBzaXplX3QgY250OwotCi0gIGZvciAoY250ID0gMDsgY250IDwgbmFtZV9sZW47ICsrY250KQotICAgIGlmIChpc2FsbnVtIChjb2Rlc2V0W2NudF0pKQotICAgICAgewotCSsrbGVuOwotCi0JaWYgKGlzYWxwaGEgKGNvZGVzZXRbY250XSkpCi0JICBvbmx5X2RpZ2l0ID0gMDsKLSAgICAgIH0KLQotICByZXR2YWwgPSAoY2hhciAqKSBtYWxsb2MgKChvbmx5X2RpZ2l0ID8gMyA6IDApICsgbGVuICsgMSk7Ci0KLSAgaWYgKHJldHZhbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChvbmx5X2RpZ2l0KQotCXdwID0gc3RwY3B5IChyZXR2YWwsICJpc28iKTsKLSAgICAgIGVsc2UKLQl3cCA9IHJldHZhbDsKLQotICAgICAgZm9yIChjbnQgPSAwOyBjbnQgPCBuYW1lX2xlbjsgKytjbnQpCi0JaWYgKGlzYWxwaGEgKGNvZGVzZXRbY250XSkpCi0JICAqd3ArKyA9IHRvbG93ZXIgKGNvZGVzZXRbY250XSk7Ci0JZWxzZSBpZiAoaXNkaWdpdCAoY29kZXNldFtjbnRdKSkKLQkgICp3cCsrID0gY29kZXNldFtjbnRdOwotCi0gICAgICAqd3AgPSAnXDAnOwotICAgIH0KLQotICByZXR1cm4gKGNvbnN0IGNoYXIgKikgcmV0dmFsOwotfQotCi0KLS8qIEBAIGJlZ2luIG9mIGVwaWxvZyBAQCAqLwotCi0vKiBXZSBkb24ndCB3YW50IGxpYmludGwuYSB0byBkZXBlbmQgb24gYW55IG90aGVyIGxpYnJhcnkuICBTbyB3ZQotICAgYXZvaWQgdGhlIG5vbi1zdGFuZGFyZCBmdW5jdGlvbiBzdHBjcHkuICBJbiBHTlUgQyBMaWJyYXJ5IHRoaXMKLSAgIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgdGhvdWdoLiAgQWxzbyBhbGxvdyB0aGUgc3ltYm9sIEhBVkVfU1RQQ1BZCi0gICB0byBiZSBkZWZpbmVkLiAgKi8KLSNpZiAhX0xJQkMgJiYgIUhBVkVfU1RQQ1BZCi1zdGF0aWMgY2hhciAqCi1zdHBjcHkgKGRlc3QsIHNyYykKLSAgICAgY2hhciAqZGVzdDsKLSAgICAgY29uc3QgY2hhciAqc3JjOwotewotICB3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCi0gICAgLyogRG8gbm90aGluZy4gKi8gOwotICByZXR1cm4gZGVzdCAtIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwvbGliZ2V0dGV4dC5oIGIvaW50bC9saWJnZXR0ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNGRlNGQuLjAwMDAwMDAKLS0tIGEvaW50bC9saWJnZXR0ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyogTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAotICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEJlY2F1c2Ugb24gc29tZSBzeXN0ZW1zIChlLmcuIFNvbGFyaXMpIHdlIHNvbWV0aW1lcyBoYXZlIHRvIGluY2x1ZGUKLSAgIHRoZSBzeXN0ZW1zIGxpYmludGwuaCBhcyB3ZWxsIGFzIHRoaXMgZmlsZSB3ZSBoYXZlIG1vcmUgY29tcGxleAotICAgaW5jbHVkZSBwcm90ZWN0aW9uIGFib3ZlLiAgQnV0IHRoZSBzeXN0ZW1zIGhlYWRlciBtaWdodCBwZXJoYXBzIGFsc28KLSAgIGRlZmluZSBfTElCSU5UTF9IIGFuZCB0aGVyZWZvcmUgd2UgaGF2ZSB0byBwcm90ZWN0IHRoZSBkZWZpbml0aW9uIGhlcmUuICAqLwotCi0jaWYgIWRlZmluZWQgKF9MSUJJTlRMX0gpIHx8ICFkZWZpbmVkIChfTElCR0VUVEVYVF9IKQotI2lmICFkZWZpbmVkIChfTElCSU5UTF9IKQotIyBkZWZpbmUgX0xJQklOVExfSAkxCi0jZW5kaWYKLSNkZWZpbmUgX0xJQkdFVFRFWFRfSAkxCi0KLS8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQotICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWYgSEFWRV9MT0NBTEVfSAotIyBpbmNsdWRlIDxsb2NhbGUuaD4KLSNlbmRpZgotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSMgaWYgIWRlZmluZWQgX19jcGx1c3BsdXMgfHwgZGVmaW5lZCBfX0dOVUNfXwotIyAgZGVmaW5lIE5VTEwgKCh2b2lkICopIDApCi0jIGVsc2UKLSMgIGRlZmluZSBOVUxMICgwKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZiAhSEFWRV9MQ19NRVNTQUdFUwotLyogVGhpcyB2YWx1ZSBkZXRlcm1pbmVzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGdldHRleHQoKSBhbmQgZGdldHRleHQoKQotICAgZnVuY3Rpb24uICBCdXQgc29tZSBzeXN0ZW0gZG9lcyBub3QgaGF2ZSB0aGlzIGRlZmluZWQuICBEZWZpbmUgaXQKLSAgIHRvIGEgZGVmYXVsdCB2YWx1ZS4gICovCi0jIGRlZmluZSBMQ19NRVNTQUdFUyAoLTEpCi0jZW5kaWYKLQotCi0vKiBEZWNsYXJhdGlvbnMgZm9yIGdldHRleHQtdXNpbmctY2F0Z2V0cyBpbnRlcmZhY2UuICBEZXJpdmVkIGZyb20KLSAgIEppbSBNZXllcmluZydzIGxpYmludGwuaC4gICovCi1zdHJ1Y3QgX21zZ19lbnQKLXsKLSAgY29uc3QgY2hhciAqX21zZzsKLSAgaW50IF9tc2dfbnVtYmVyOwotfTsKLQotCi0jaWYgSEFWRV9DQVRHRVRTCi0vKiBUaGVzZSB0d28gdmFyaWFibGVzIGFyZSBkZWZpbmVkIGluIHRoZSBhdXRvbWF0aWNhbGx5IGJ5IHBvLXRvLXRibC5zZWQKLSAgIGdlbmVyYXRlZCBmaWxlIGBjYXQtaWQtdGJsLmMnLiAgKi8KLWV4dGVybiBjb25zdCBzdHJ1Y3QgX21zZ19lbnQgX21zZ190YmxbXTsKLWV4dGVybiBpbnQgX21zZ190YmxfbGVuZ3RoOwotI2VuZGlmCi0KLQotLyogRm9yIGF1dG9tYXRpY2FsIGV4dHJhY3Rpb24gb2YgbWVzc2FnZXMgc29tZXRpbWVzIG5vIHJlYWwKLSAgIHRyYW5zbGF0aW9uIGlzIG5lZWRlZC4gIEluc3RlYWQgdGhlIHN0cmluZyBpdHNlbGYgaXMgdGhlIHJlc3VsdC4gICovCi0jZGVmaW5lIGdldHRleHRfbm9vcChTdHIpIChTdHIpCi0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICBJZiBub3QgZm91bmQsIHJldHVybnMgTVNHSUQgaXRzZWxmICh0aGUgZGVmYXVsdAotICAgdGV4dCkuICAqLwotZXh0ZXJuIGNoYXIgKmdldHRleHQgUEFSQU1TICgoY29uc3QgY2hhciAqX19tc2dpZCkpOwotZXh0ZXJuIGNoYXIgKmdldHRleHRfXyBQQVJBTVMgKChjb25zdCBjaGFyICpfX21zZ2lkKSk7Ci0KLS8qIExvb2sgdXAgTVNHSUQgaW4gdGhlIERPTUFJTk5BTUUgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgKi8KLWV4dGVybiBjaGFyICpkZ2V0dGV4dCBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsIGNvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLWV4dGVybiBjaGFyICpkZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgY29uc3QgY2hhciAqX19tc2dpZCkpOwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBET01BSU5OQU1FIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgQ0FURUdPUlkKLSAgIGxvY2FsZS4gICovCi1leHRlcm4gY2hhciAqZGNnZXR0ZXh0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwgY29uc3QgY2hhciAqX19tc2dpZCwKLQkJCQlpbnQgX19jYXRlZ29yeSkpOwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dF9fIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgIGNvbnN0IGNoYXIgKl9fbXNnaWQsIGludCBfX2NhdGVnb3J5KSk7Ci0KLQotLyogU2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIHRvIERPTUFJTk5BTUUuCi0gICBJZiBET01BSU5OQU1FIGlzIG51bGwsIHJldHVybiB0aGUgY3VycmVudCBkZWZhdWx0LgotICAgSWYgRE9NQUlOTkFNRSBpcyAiIiwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgb2YgIm1lc3NhZ2VzIi4gICovCi1leHRlcm4gY2hhciAqdGV4dGRvbWFpbiBQQVJBTVMgKChjb25zdCBjaGFyICpfX2RvbWFpbm5hbWUpKTsKLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluX18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIFBBUkFNUyAoKGNvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCQkgIGNvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluX18gUEFSQU1TICgoY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgICBjb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLQotI2lmIEVOQUJMRV9OTFMKLQotLyogU29sYXJpcyAyLjMgaGFzIHRoZSBnZXR0ZXh0IGZ1bmN0aW9uIGJ1dCBkY2dldHRleHQgaXMgbWlzc2luZy4KLSAgIFNvIHdlIG9taXQgdGhpcyBvcHRpbWl6YXRpb24gZm9yIFNvbGFyaXMgMi4zLiAgQlRXLCBTb2xhcmlzIDIuNAotICAgaGFzIGRjZ2V0dGV4dC4gICovCi0jIGlmICFIQVZFX0NBVEdFVFMgJiYgKCFIQVZFX0dFVFRFWFQgfHwgSEFWRV9EQ0dFVFRFWFQpCi0KLSMgIGRlZmluZSBnZXR0ZXh0KE1zZ2lkKQkJCQkJCSAgICAgIFwKLSAgICAgZGdldHRleHQgKE5VTEwsIE1zZ2lkKQotCi0jICBkZWZpbmUgZGdldHRleHQoRG9tYWlubmFtZSwgTXNnaWQpCQkJCQkgICAgICBcCi0gICAgIGRjZ2V0dGV4dCAoRG9tYWlubmFtZSwgTXNnaWQsIExDX01FU1NBR0VTKQotCi0jICBpZiBkZWZpbmVkIF9fR05VQ19fICYmIF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPj0gNwotLyogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgZGVmaW5lZCBpbiBsb2FkbXNnY2F0LmMuICBXZSBuZWVkIGEgc2lnbiwKLSAgIHdoZXRoZXIgYSBuZXcgY2F0YWxvZyB3YXMgbG9hZGVkLCB3aGljaCBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFsbAotICAgdHJhbnNsYXRpb25zLiAgKi8KLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQotIyAgIGRlZmluZSBkY2dldHRleHQoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KQkJCSAgICAgIFwKLSAgKF9fZXh0ZW5zaW9uX18JCQkJCQkJICAgICAgXAotICAgKHsJCQkJCQkJCQkgICAgICBcCi0gICAgIGNoYXIgKl9fcmVzdWx0OwkJCQkJCQkgICAgICBcCi0gICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAoTXNnaWQpKQkJCQkJICAgICAgXAotICAgICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgc3RhdGljIGNoYXIgKl9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLQkgc3RhdGljIGludCBfX2NhdGFsb2dfY291bnRlcl9fOwkJCQkgICAgICBcCi0JIGlmICghIF9fdHJhbnNsYXRpb25fXyB8fCBfX2NhdGFsb2dfY291bnRlcl9fICE9IF9ubF9tc2dfY2F0X2NudHIpICAgIFwKLQkgICB7CQkJCQkJCQkgICAgICBcCi0JICAgICBfX3RyYW5zbGF0aW9uX18gPQkJCQkJCSAgICAgIFwKLQkgICAgICAgZGNnZXR0ZXh0X18gKERvbWFpbm5hbWUsIE1zZ2lkLCBDYXRlZ29yeSk7CQkgICAgICBcCi0JICAgICBfX2NhdGFsb2dfY291bnRlcl9fID0gX25sX21zZ19jYXRfY250cjsJCQkgICAgICBcCi0JICAgfQkJCQkJCQkJICAgICAgXAotCSBfX3Jlc3VsdCA9IF9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLSAgICAgICB9CQkJCQkJCQkgICAgICBcCi0gICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLSAgICAgICBfX3Jlc3VsdCA9IGRjZ2V0dGV4dF9fIChEb21haW5uYW1lLCBNc2dpZCwgQ2F0ZWdvcnkpOwkJICAgICAgXAotICAgICBfX3Jlc3VsdDsJCQkJCQkJCSAgICAgIFwKLSAgICB9KSkKLSMgIGVuZGlmCi0jIGVuZGlmCi0KLSNlbHNlCi0KLSMgZGVmaW5lIGdldHRleHQoTXNnaWQpIChNc2dpZCkKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbm5hbWUsIE1zZ2lkKSAoTXNnaWQpCi0jIGRlZmluZSBkY2dldHRleHQoRG9tYWlubmFtZSwgTXNnaWQsIENhdGVnb3J5KSAoTXNnaWQpCi0jIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbm5hbWUpIHdoaWxlICgwKSAvKiBub3RoaW5nICovCi0jIGRlZmluZSBiaW5kdGV4dGRvbWFpbihEb21haW5uYW1lLCBEaXJuYW1lKSB3aGlsZSAoMCkgLyogbm90aGluZyAqLwotCi0jZW5kaWYKLQotLyogQEAgYmVnaW4gb2YgZXBpbG9nIEBAICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW50bC9saWJpbnRsLmdsaWJjIGIvaW50bC9saWJpbnRsLmdsaWJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTViOGY5Li4wMDAwMDAwCi0tLSBhL2ludGwvbGliaW50bC5nbGliYworKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKiBsaWJnZXR0ZXh0LmggLS0gTWVzc2FnZSBjYXRhbG9ncyBmb3IgaW50ZXJuYXRpb25hbGl6YXRpb24uCi1Db3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KLUNvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyLgotVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSB0aGUgZmlsZSBsaWJnZXR0ZXh0LmggaW4gdGhlIEdOVSBnZXR0ZXh0IHBhY2thZ2UuCi0KLVRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCi1MaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIF9MSUJJTlRMX0gKLSNkZWZpbmUgX0xJQklOVExfSAkxCi0jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KLQotI2luY2x1ZGUgPGxvY2FsZS5oPgotCi0jZGVmaW5lIF9fbmVlZF9OVUxMCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLS8qIFdlIGRlZmluZSBhbiBhZGRpdGlvbmFsIHN5bWJvbCB0byBzaWduYWwgdGhhdCB3ZSB1c2UgdGhlIEdOVQotICAgaW1wbGVtZW50YXRpb24gb2YgZ2V0dGV4dC4gICovCi0jZGVmaW5lIF9fVVNFX0dOVV9HRVRURVhUIDEKLQotX19CRUdJTl9ERUNMUwotCi0vKiBMb29rIHVwIE1TR0lEIGluIHRoZSBjdXJyZW50IGRlZmF1bHQgbWVzc2FnZSBjYXRhbG9nIGZvciB0aGUgY3VycmVudAotICAgTENfTUVTU0FHRVMgbG9jYWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm5zIE1TR0lEIGl0c2VsZiAodGhlIGRlZmF1bHQKLSAgIHRleHQpLiAgKi8KLWV4dGVybiBjaGFyICpnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19tc2dpZCkpOwotZXh0ZXJuIGNoYXIgKl9fZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50Ci0gICBMQ19NRVNTQUdFUyBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCkpOwotZXh0ZXJuIGNoYXIgKl9fZGdldHRleHQgX19QICgoX19jb25zdCBjaGFyICpfX2RvbWFpbm5hbWUsCi0JCQkgICAgICBfX2NvbnN0IGNoYXIgKl9fbXNnaWQpKTsKLQotLyogTG9vayB1cCBNU0dJRCBpbiB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgZm9yIHRoZSBjdXJyZW50IENBVEVHT1JZCi0gICBsb2NhbGUuICAqLwotZXh0ZXJuIGNoYXIgKmRjZ2V0dGV4dCBfX1AgKChfX2NvbnN0IGNoYXIgKl9fZG9tYWlubmFtZSwKLQkJCSAgICAgX19jb25zdCBjaGFyICpfX21zZ2lkLCBpbnQgX19jYXRlZ29yeSkpOwotZXh0ZXJuIGNoYXIgKl9fZGNnZXR0ZXh0IF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJICAgICAgIF9fY29uc3QgY2hhciAqX19tc2dpZCwgaW50IF9fY2F0ZWdvcnkpKTsKLQotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWV4dGVybiBjaGFyICp0ZXh0ZG9tYWluIF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci1leHRlcm4gY2hhciAqX190ZXh0ZG9tYWluIF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lKSk7Ci0KLS8qIFNwZWNpZnkgdGhhdCB0aGUgRE9NQUlOTkFNRSBtZXNzYWdlIGNhdGFsb2cgd2lsbCBiZSBmb3VuZAotICAgaW4gRElSTkFNRSByYXRoZXIgdGhhbiBpbiB0aGUgc3lzdGVtIGxvY2FsZSBkYXRhIGJhc2UuICAqLwotZXh0ZXJuIGNoYXIgKmJpbmR0ZXh0ZG9tYWluIF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgX19jb25zdCBjaGFyICpfX2Rpcm5hbWUpKTsKLWV4dGVybiBjaGFyICpfX2JpbmR0ZXh0ZG9tYWluIF9fUCAoKF9fY29uc3QgY2hhciAqX19kb21haW5uYW1lLAotCQkJCSAgICBfX2NvbnN0IGNoYXIgKl9fZGlybmFtZSkpOwotCi0KLS8qIE9wdGltaXplZCB2ZXJzaW9uIG9mIHRoZSBmdW5jdGlvbiBhYm92ZS4gICovCi0jaWYgZGVmaW5lZCBfX09QVElNSVpFRAotLyogVGhlc2UgbXVzdCBiZSBhIG1hY3JvLiAgSW5saW5lZCBmdW5jdGlvbnMgYXJlIHVzZWxlc3MgYmVjYXVzZSB0aGUKLSAgIGBfX2J1aWx0aW5fY29uc3RhbnRfcCcgcHJlZGljYXRlIGluIGRjZ2V0dGV4dCB3b3VsZCBhbHdheXMgcmV0dXJuCi0gICBmYWxzZS4gICovCi0KLSMgZGVmaW5lIGdldHRleHQobXNnaWQpIGRnZXR0ZXh0IChOVUxMLCBtc2dpZCkKLQotIyBkZWZpbmUgZGdldHRleHQoZG9tYWlubmFtZSwgbXNnaWQpCQkJCQkgICAgICBcCi0gIGRjZ2V0dGV4dCAoZG9tYWlubmFtZSwgbXNnaWQsIExDX01FU1NBR0VTKQotCi0jIGlmIF9fR05VQ19fID4gMiB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA+PSA3KQotIyAgZGVmaW5lIGRjZ2V0dGV4dChkb21haW5uYW1lLCBtc2dpZCwgY2F0ZWdvcnkpCQkJICAgICAgXAotICAoX19leHRlbnNpb25fXwkJCQkJCQkgICAgICBcCi0gICAoewkJCQkJCQkJCSAgICAgIFwKLSAgICAgY2hhciAqcmVzdWx0OwkJCQkJCQkgICAgICBcCi0gICAgIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcCAobXNnaWQpKQkJCQkJICAgICAgXAotICAgICAgIHsJCQkJCQkJCSAgICAgIFwKLQkgZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwkJCQkJICAgICAgXAotCSBzdGF0aWMgY2hhciAqX190cmFuc2xhdGlvbl9fOwkJCQkJICAgICAgXAotCSBzdGF0aWMgaW50IF9fY2F0YWxvZ19jb3VudGVyX187CQkJCSAgICAgIFwKLQkgaWYgKCEgX190cmFuc2xhdGlvbl9fIHx8IF9fY2F0YWxvZ19jb3VudGVyX18gIT0gX25sX21zZ19jYXRfY250cikgICAgXAotCSAgIHsJCQkJCQkJCSAgICAgIFwKLQkgICAgIF9fdHJhbnNsYXRpb25fXyA9CQkJCQkJICAgICAgXAotCSAgICAgICBfX2RjZ2V0dGV4dCAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJCSAgICAgIFwKLQkgICAgIF9fY2F0YWxvZ19jb3VudGVyX18gPSBfbmxfbXNnX2NhdF9jbnRyOwkJCSAgICAgIFwKLQkgICB9CQkJCQkJCQkgICAgICBcCi0JIHJlc3VsdCA9IF9fdHJhbnNsYXRpb25fXzsJCQkJCSAgICAgIFwKLSAgICAgICB9CQkJCQkJCQkgICAgICBcCi0gICAgIGVsc2UJCQkJCQkJCSAgICAgIFwKLSAgICAgICByZXN1bHQgPSBfX2RjZ2V0dGV4dCAoKGRvbWFpbm5hbWUpLCAobXNnaWQpLCAoY2F0ZWdvcnkpKTsJICAgICAgXAotICAgICByZXN1bHQ7CQkJCQkJCQkgICAgICBcCi0gICAgfSkpCi0jIGVuZGlmCi0jZW5kaWYgLyogT3B0aW1pemluZy4gKi8KLQotCi1fX0VORF9ERUNMUwotCi0jZW5kaWYgLyogbGliaW50bC5oICovCmRpZmYgLS1naXQgYS9pbnRsL2xpbnV4LW1zZy5zZWQgYi9pbnRsL2xpbnV4LW1zZy5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MThlNzIuLjAwMDAwMDAKLS0tIGEvaW50bC9saW51eC1tc2cuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgcG8ybXNnLnNlZCAtIENvbnZlcnQgVW5pZm9ydW0gc3R5bGUgLnBvIGZpbGUgdG8gTGludXggc3R5bGUgLm1zZyBmaWxlCi0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIwotIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSAubXNnIHNob3VsZCBiZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSMgbWVzc2FnZSBzZXQgbnVtYmVyLiAgV2UgdXNlIGFsd2F5cyBzZXQgbnVtYmVyIDEuCi0jCi0xIHsKLSAgaVwKLSRzZXQgMSAjIEF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBwbzJtc2cuc2VkCi0gIGgKLSAgcy8uKi8wLwotICB4Ci19Ci0jCi0jIE1pdGNoJ3Mgb2xkIGNhdGFsb2cgZm9ybWF0IGRvZXMgbm90IGFsbG93IGNvbW1lbnRzLgotIwotIyBXZSBjb3B5IHRoZSBvcmlnaW5hbCBtZXNzYWdlIGFzIGEgY29tbWVudCBpbnRvIHRoZSAubXNnIGZpbGUuCi0jCi0vXm1zZ2lkLyB7Ci0gIHMvbXNnaWRbIAldKiIvLwotIwotIyBUaGlzIGRvZXMgbm90IHdvcmsgbm93IHdpdGggdGhlIG5ldyBmb3JtYXQuCi0jIC8iJC8hIHsKLSMgICBzL1xcJC8vCi0jICAgcy8kLyAuLi4gKG1vcmUgbGluZXMgZm9sbG93aW5nKSIvCi0jIH0KLSAgeAotIyBUaGUgZm9sbG93aW5nIG5pY2Ugc29sdXRpb24gaXMgYnkKLSMgQnJ1bm8gPEhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+Ci0gIHRkCi0jIEluY3JlbWVudCBhIGRlY2ltYWwgbnVtYmVyIGluIHBhdHRlcm4gc3BhY2UuCi0jIEZpcnN0IGhpZGUgdHJhaWxpbmcgYDknIGRpZ2l0cy4KLSAgOmQKLSAgcy85XChfKlwpJC9fXDEvCi0gIHRkCi0jIEFzc3VyZSBhdCBsZWFzdCBvbmUgZGlnaXQgaXMgYXZhaWxhYmxlLgotICBzL15cKF8qXCkkLzBcMS8KLSMgSW5jcmVtZW50IHRoZSBsYXN0IGRpZ2l0LgotICBzLzhcKF8qXCkkLzlcMS8KLSAgcy83XChfKlwpJC84XDEvCi0gIHMvNlwoXypcKSQvN1wxLwotICBzLzVcKF8qXCkkLzZcMS8KLSAgcy80XChfKlwpJC81XDEvCi0gIHMvM1woXypcKSQvNFwxLwotICBzLzJcKF8qXCkkLzNcMS8KLSAgcy8xXChfKlwpJC8yXDEvCi0gIHMvMFwoXypcKSQvMVwxLwotIyBDb252ZXJ0IHRoZSBoaWRkZW4gYDknIGRpZ2l0cyB0byBgMCdzLgotICBzL18vMC9nCi0gIHgKLSAgRwotICBzL1woLipcKSJcblwoWzAtOV0qXCkvJCAjXDIgT3JpZ2luYWwgTWVzc2FnZTooXDEpL3AKLX0KLSMKLSMgVGhlIC5tc2cgZmlsZSBjb250YWlucywgb3RoZXIgdGhlbiB0aGUgLnBvIGZpbGUsIG9ubHkgdGhlIHRyYW5zbGF0aW9ucwotIyBidXQgZWFjaCBnaXZlbiBhIHVuaXF1ZSBJRC4gIFN0YXJ0aW5nIGZyb20gMSBhbmQgaW5jcmVtZW50aW5nIGJ5IDEgZm9yCi0jIGVhY2ggbWVzc2FnZSB3ZSBhc3NpZ24gdGhlbSB0byB0aGUgbWVzc2FnZXMuCi0jIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSAucG8gZmlsZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjYXQtaWQtdGJsLmMgZmlsZQotIyAod2l0aCBwby10by10YmwpIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBoZXJlLiAgKEF0IGxlYXN0IHRoZSBvcmRlcgotIyBvZiBkZWNsYXJhdGlvbnMgbXVzdCBub3QgYmUgY2hhbmdlZC4pCi0jCi0vXm1zZ3N0ci8gewotICBzL21zZ3N0clsgCV0qIlwoLipcKSIvIyBcMS8KLSMgQ2xlYXIgc3Vic3RpdHV0aW9uIGZsYWcuCi0gIHRiCi0jIEFwcGVuZCB0aGUgbmV4dCBsaW5lLgotICA6YgotICBOCi0jIExvb2sgd2hldGhlciBzZWNvbmQgcGFydCBpcyBjb250aW51YXRpb24gbGluZS4KLSAgcy9cKC4qXG5cKSJcKC4qXCkiL1wxXDIvCi0jIFllcywgdGhlbiBicmFuY2guCi0gIHRhCi0gIFAKLSAgRAotIyBOb3RlIHRoYXQgRCBpbmNsdWRlcyBhIGp1bXAgdG8gdGhlIHN0YXJ0ISEKLSMgV2UgZm91bmQgYSBjb250aW51YXRpb24gbGluZS4gIEJ1dCBiZWZvcmUgcHJpbnRpbmcgaW5zZXJ0ICdcJy4KLSAgOmEKLSAgcy9cKC4qXClcKFxuLipcKS9cMVxcXDIvCi0gIFAKLSMgV2UgY2Fubm90IHVzZSBEIGhlcmUuCi0gIHMvLipcblwoLipcKS9cMS8KLSAgdGIKLX0KLWQKZGlmZiAtLWdpdCBhL2ludGwvbG9hZGluZm8uaCBiL2ludGwvbG9hZGluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3YzJlYi4uMDAwMDAwMAotLS0gYS9pbnRsL2xvYWRpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jaWZuZGVmIFBBUkFNUwotIyBpZiBfX1NURENfXwotIyAgZGVmaW5lIFBBUkFNUyhhcmdzKSBhcmdzCi0jIGVsc2UKLSMgIGRlZmluZSBQQVJBTVMoYXJncykgKCkKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBFbmNvZGluZyBvZiBsb2NhbGUgbmFtZSBwYXJ0cy4gICovCi0jZGVmaW5lIENFTl9SRVZJU0lPTgkJMQotI2RlZmluZSBDRU5fU1BPTlNPUgkJMgotI2RlZmluZSBDRU5fU1BFQ0lBTAkJNAotI2RlZmluZSBYUEdfTk9STV9DT0RFU0VUCTgKLSNkZWZpbmUgWFBHX0NPREVTRVQJCTE2Ci0jZGVmaW5lIFRFUlJJVE9SWQkJMzIKLSNkZWZpbmUgQ0VOX0FVRElFTkNFCQk2NAotI2RlZmluZSBYUEdfTU9ESUZJRVIJCTEyOAotCi0jZGVmaW5lIENFTl9TUEVDSUZJQwkoQ0VOX1JFVklTSU9OfENFTl9TUE9OU09SfENFTl9TUEVDSUFMfENFTl9BVURJRU5DRSkKLSNkZWZpbmUgWFBHX1NQRUNJRklDCShYUEdfQ09ERVNFVHxYUEdfTk9STV9DT0RFU0VUfFhQR19NT0RJRklFUikKLQotCi1zdHJ1Y3QgbG9hZGVkX2wxMG5maWxlCi17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBpbnQgZGVjaWRlZDsKLQotICBjb25zdCB2b2lkICpkYXRhOwotCi0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKm5leHQ7Ci0gIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKnN1Y2Nlc3NvclsxXTsKLX07Ci0KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9ub3JtYWxpemVfY29kZXNldCBQQVJBTVMgKChjb25zdCBjaGFyICpjb2Rlc2V0LAotCQkJCQkJICBzaXplX3QgbmFtZV9sZW4pKTsKLQotZXh0ZXJuIHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKgotX25sX21ha2VfbDEwbmZsaXN0IFBBUkFNUyAoKHN0cnVjdCBsb2FkZWRfbDEwbmZpbGUgKipsMTBuZmlsZV9saXN0LAotCQkJICAgIGNvbnN0IGNoYXIgKmRpcmxpc3QsIHNpemVfdCBkaXJsaXN0X2xlbiwgaW50IG1hc2ssCi0JCQkgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UsIGNvbnN0IGNoYXIgKnRlcnJpdG9yeSwKLQkJCSAgICBjb25zdCBjaGFyICpjb2Rlc2V0LAotCQkJICAgIGNvbnN0IGNoYXIgKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJCSAgICBjb25zdCBjaGFyICptb2RpZmllciwgY29uc3QgY2hhciAqc3BlY2lhbCwKLQkJCSAgICBjb25zdCBjaGFyICpzcG9uc29yLCBjb25zdCBjaGFyICpyZXZpc2lvbiwKLQkJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGRvX2FsbG9jYXRlKSk7Ci0KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9leHBhbmRfYWxpYXMgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotCi1leHRlcm4gaW50IF9ubF9leHBsb2RlX25hbWUgUEFSQU1TICgoY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmxhbmd1YWdlLAotCQkJCSAgICAgY29uc3QgY2hhciAqKm1vZGlmaWVyLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnRlcnJpdG9yeSwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipjb2Rlc2V0LAotCQkJCSAgICAgY29uc3QgY2hhciAqKm5vcm1hbGl6ZWRfY29kZXNldCwKLQkJCQkgICAgIGNvbnN0IGNoYXIgKipzcGVjaWFsLAotCQkJCSAgICAgY29uc3QgY2hhciAqKnNwb25zb3IsCi0JCQkJICAgICBjb25zdCBjaGFyICoqcmV2aXNpb24pKTsKZGlmZiAtLWdpdCBhL2ludGwvbG9hZG1zZ2NhdC5jIGIvaW50bC9sb2FkbXNnY2F0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZTkwYTkuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2FkbXNnY2F0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogTG9hZCBuZWVkZWQgbWVzc2FnZSBjYXRhbG9ncwotICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBIQVZFX1VOSVNURF9IIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQKSB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImdldHRleHQuaCIKLSNpbmNsdWRlICJnZXR0ZXh0UC5oIgotCi0vKiBAQCBlbmQgb2YgcHJvbG9nIEBAICovCi0KLSNpZmRlZiBfTElCQwotLyogUmVuYW1lIHRoZSBub24gSVNPIEMgZnVuY3Rpb25zLiAgVGhpcyBpcyByZXF1aXJlZCBieSB0aGUgc3RhbmRhcmQKLSAgIGJlY2F1c2Ugc29tZSBJU08gQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgZnN0YXQgIF9fZnN0YXQKLSMgZGVmaW5lIG9wZW4gICBfX29wZW4KLSMgZGVmaW5lIGNsb3NlICBfX2Nsb3NlCi0jIGRlZmluZSByZWFkICAgX19yZWFkCi0jIGRlZmluZSBtbWFwICAgX19tbWFwCi0jIGRlZmluZSBtdW5tYXAgX19tdW5tYXAKLSNlbmRpZgotCi0vKiBXZSBuZWVkIGEgc2lnbiwgd2hldGhlciBhIG5ldyBjYXRhbG9nIHdhcyBsb2FkZWQsIHdoaWNoIGNhbiBiZSBhc3NvY2lhdGVkCi0gICB3aXRoIGFsbCB0cmFuc2xhdGlvbnMuICBUaGlzIGlzIGltcG9ydGFudCBpZiB0aGUgdHJhbnNsYXRpb25zIGFyZQotICAgY2FjaGVkIGJ5IG9uZSBvZiBHQ0MncyBmZWF0dXJlcy4gICovCi1pbnQgX25sX21zZ19jYXRfY250ciA9IDA7Ci0KLQotLyogTG9hZCB0aGUgbWVzc2FnZSBjYXRhbG9ncyBzcGVjaWZpZWQgYnkgRklMRU5BTUUuICBJZiBpdCBpcyBubyB2YWxpZAotICAgbWVzc2FnZSBjYXRhbG9nIGRvIG5vdGhpbmcuICAqLwotdm9pZAotX25sX2xvYWRfZG9tYWluIChkb21haW5fZmlsZSkKLSAgICAgc3RydWN0IGxvYWRlZF9sMTBuZmlsZSAqZG9tYWluX2ZpbGU7Ci17Ci0gIGludCBmZDsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIHN0cnVjdCBtb19maWxlX2hlYWRlciAqZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgLTE7Ci0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKLSAgaW50IHVzZV9tbWFwID0gMDsKLSNlbmRpZgotICBzdHJ1Y3QgbG9hZGVkX2RvbWFpbiAqZG9tYWluOwotCi0gIGRvbWFpbl9maWxlLT5kZWNpZGVkID0gMTsKLSAgZG9tYWluX2ZpbGUtPmRhdGEgPSBOVUxMOwotCi0gIC8qIElmIHRoZSByZWNvcmQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgbG9jYWxlIHRoZSBGSUxFTkFNRQotICAgICBtaWdodCBiZSBOVUxMLiAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgotICAgICBzcGVjaWZpY2F0aW9uIHRoZSBsb2NhbGUgZmlsZSBuYW1lIGlzIGRpZmZlcmVudCBmb3IgWFBHIGFuZCBDRU4KLSAgICAgc3ludGF4LiAgKi8KLSAgaWYgKGRvbWFpbl9maWxlLT5maWxlbmFtZSA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBUcnkgdG8gb3BlbiB0aGUgYWRkcmVzc2VkIGZpbGUuICAqLwotICBmZCA9IG9wZW4gKGRvbWFpbl9maWxlLT5maWxlbmFtZSwgT19SRE9OTFkpOwotICBpZiAoZmQgPT0gLTEpCi0gICAgcmV0dXJuOwotCi0gIC8qIFdlIG11c3Qga25vdyBhYm91dCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gICovCi0gIGlmIChmc3RhdCAoZmQsICZzdCkgIT0gMAotICAgICAgJiYgc3Quc3Rfc2l6ZSA8IChvZmZfdCkgc2l6ZW9mIChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIpKQotICAgIHsKLSAgICAgIC8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiAgKi8KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKLSAgLyogTm93IHdlIGFyZSByZWFkeSB0byBsb2FkIHRoZSBmaWxlLiAgSWYgbW1hcCgpIGlzIGF2YWlsYWJsZSB3ZSB0cnkKLSAgICAgdGhpcyBmaXJzdC4gIElmIG5vdCBhdmFpbGFibGUgb3IgaXQgZmFpbGVkIHdlIHRyeSB0byBsb2FkIGl0LiAgKi8KLSAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbW1hcCAoTlVMTCwgc3Quc3Rfc2l6ZSwgUFJPVF9SRUFELAotCQkJCQkgTUFQX1BSSVZBVEUsIGZkLCAwKTsKLQotICBpZiAoZGF0YSAhPSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xKQotICAgIHsKLSAgICAgIC8qIG1tYXAoKSBjYWxsIHdhcyBzdWNjZXNzZnVsLiAgKi8KLSAgICAgIGNsb3NlIChmZCk7Ci0gICAgICB1c2VfbW1hcCA9IDE7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogSWYgdGhlIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgKGkuZS4gbW1hcCdlZCkgd2UgdHJ5IHRvIGxvYWQKLSAgICAgaXQgbWFudWFsbHkuICAqLwotICBpZiAoZGF0YSA9PSAoc3RydWN0IG1vX2ZpbGVfaGVhZGVyICopIC0xKQotICAgIHsKLSAgICAgIG9mZl90IHRvX3JlYWQ7Ci0gICAgICBjaGFyICpyZWFkX3B0cjsKLQotICAgICAgZGF0YSA9IChzdHJ1Y3QgbW9fZmlsZV9oZWFkZXIgKikgbWFsbG9jIChzdC5zdF9zaXplKTsKLSAgICAgIGlmIChkYXRhID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgICB0b19yZWFkID0gc3Quc3Rfc2l6ZTsKLSAgICAgIHJlYWRfcHRyID0gKGNoYXIgKikgZGF0YTsKLSAgICAgIGRvCi0JewotCSAgbG9uZyBpbnQgbmIgPSAobG9uZyBpbnQpIHJlYWQgKGZkLCByZWFkX3B0ciwgdG9fcmVhZCk7Ci0JICBpZiAobmIgPT0gLTEpCi0JICAgIHsKLQkgICAgICBjbG9zZSAoZmQpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCi0JICByZWFkX3B0ciArPSBuYjsKLQkgIHRvX3JlYWQgLT0gbmI7Ci0JfQotICAgICAgd2hpbGUgKHRvX3JlYWQgPiAwKTsKLQotICAgICAgY2xvc2UgKGZkKTsKLSAgICB9Ci0KLSAgLyogVXNpbmcgdGhlIG1hZ2ljIG51bWJlciB3ZSBjYW4gdGVzdCB3aGV0aGVyIGl0IHJlYWxseSBpcyBhIG1lc3NhZ2UKLSAgICAgY2F0YWxvZyBmaWxlLiAgKi8KLSAgaWYgKGRhdGEtPm1hZ2ljICE9IF9NQUdJQyAmJiBkYXRhLT5tYWdpYyAhPSBfTUFHSUNfU1dBUFBFRCkKLSAgICB7Ci0gICAgICAvKiBUaGUgbWFnaWMgbnVtYmVyIGlzIHdyb25nOiBub3QgYSBtZXNzYWdlIGNhdGFsb2cgZmlsZS4gICovCi0jaWYgKGRlZmluZWQgSEFWRV9NTUFQICYmIGRlZmluZWQgSEFWRV9NVU5NQVAgJiYgIWRlZmluZWQgRElTQUxMT1dfTU1BUCkgXAotICAgIHx8IGRlZmluZWQgX0xJQkMKLSAgICAgIGlmICh1c2VfbW1hcCkKLQltdW5tYXAgKChjYWRkcl90KSBkYXRhLCBzdC5zdF9zaXplKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotCWZyZWUgKGRhdGEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBkb21haW5fZmlsZS0+ZGF0YQotICAgID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgbG9hZGVkX2RvbWFpbikpOwotICBpZiAoZG9tYWluX2ZpbGUtPmRhdGEgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgZG9tYWluID0gKHN0cnVjdCBsb2FkZWRfZG9tYWluICopIGRvbWFpbl9maWxlLT5kYXRhOwotICBkb21haW4tPmRhdGEgPSAoY2hhciAqKSBkYXRhOwotICBkb21haW4tPm11c3Rfc3dhcCA9IGRhdGEtPm1hZ2ljICE9IF9NQUdJQzsKLQotICAvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXZhaWxhYmxlIHRhYmxlcy4gICovCi0gIHN3aXRjaCAoVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPnJldmlzaW9uKSkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZG9tYWluLT5uc3RyaW5ncyA9IFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5uc3RyaW5ncyk7Ci0gICAgICBkb21haW4tPm9yaWdfdGFiID0gKHN0cnVjdCBzdHJpbmdfZGVzYyAqKQotCSgoY2hhciAqKSBkYXRhICsgVyAoZG9tYWluLT5tdXN0X3N3YXAsIGRhdGEtPm9yaWdfdGFiX29mZnNldCkpOwotICAgICAgZG9tYWluLT50cmFuc190YWIgPSAoc3RydWN0IHN0cmluZ19kZXNjICopCi0JKChjaGFyICopIGRhdGEgKyBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+dHJhbnNfdGFiX29mZnNldCkpOwotICAgICAgZG9tYWluLT5oYXNoX3NpemUgPSBXIChkb21haW4tPm11c3Rfc3dhcCwgZGF0YS0+aGFzaF90YWJfc2l6ZSk7Ci0gICAgICBkb21haW4tPmhhc2hfdGFiID0gKG5sc191aW50MzIgKikKLQkoKGNoYXIgKikgZGF0YSArIFcgKGRvbWFpbi0+bXVzdF9zd2FwLCBkYXRhLT5oYXNoX3RhYl9vZmZzZXQpKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBUaGlzIGlzIGFuIGlsbGVnYWwgcmV2aXNpb24uICAqLwotI2lmIChkZWZpbmVkIEhBVkVfTU1BUCAmJiBkZWZpbmVkIEhBVkVfTVVOTUFQICYmICFkZWZpbmVkIERJU0FMTE9XX01NQVApIFwKLSAgICB8fCBkZWZpbmVkIF9MSUJDCi0gICAgICBpZiAodXNlX21tYXApCi0JbXVubWFwICgoY2FkZHJfdCkgZGF0YSwgc3Quc3Rfc2l6ZSk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLQlmcmVlIChkYXRhKTsKLSAgICAgIGZyZWUgKGRvbWFpbik7Ci0gICAgICBkb21haW5fZmlsZS0+ZGF0YSA9IE5VTEw7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFNob3cgdGhhdCBvbmUgZG9tYWluIGlzIGNoYW5nZWQuICBUaGlzIG1pZ2h0IG1ha2Ugc29tZSBjYWNoZWQKLSAgICAgdHJhbnNsYXRpb25zIGludmFsaWQuICAqLwotICArK19ubF9tc2dfY2F0X2NudHI7Ci19CmRpZmYgLS1naXQgYS9pbnRsL2xvY2FsZWFsaWFzLmMgYi9pbnRsL2xvY2FsZWFsaWFzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZDkxOTQuLjAwMDAwMDAKLS0tIGEvaW50bC9sb2NhbGVhbGlhcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qIEhhbmRsZSBhbGlhc2VzIGZvciBsb2NhbGUgbmFtZXMKLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotCi0gICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKLSAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGRlZmluZSBIQVZFX0FMTE9DQSAxCi0jZWxzZQotIyBpZiBkZWZpbmVkIEhBVkVfQUxMT0NBX0ggfHwgZGVmaW5lZCBfTElCQwotIyAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jIGVsc2UKLSMgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgZWxzZQotIyAgIGlmbmRlZiBhbGxvY2EKLWNoYXIgKmFsbG9jYSAoKTsKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZCBTVERDX0hFQURFUlMgfHwgZGVmaW5lZCBfTElCQwotIyBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICpnZXRlbnYgKCk7Ci0jIGlmZGVmIEhBVkVfTUFMTE9DX0gKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyBlbHNlCi12b2lkIGZyZWUgKCk7Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGlmbmRlZiBfR05VX1NPVVJDRQotIyAgZGVmaW5lIF9HTlVfU09VUkNFCTEKLSMgZW5kaWYKLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jIGlmbmRlZiBtZW1jcHkKLSMgIGRlZmluZSBtZW1jcHkoRHN0LCBTcmMsIE51bSkgYmNvcHkgKFNyYywgRHN0LCBOdW0pCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiAhSEFWRV9TVFJDSFIgJiYgIWRlZmluZWQgX0xJQkMKLSMgaWZuZGVmIHN0cmNocgotIyAgZGVmaW5lIHN0cmNociBpbmRleAotIyBlbmRpZgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXR0ZXh0LmgiCi0jaW5jbHVkZSAiZ2V0dGV4dFAuaCIKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0jaWZkZWYgX0xJQkMKLS8qIFJlbmFtZSB0aGUgbm9uIEFOU0kgQyBmdW5jdGlvbnMuICBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZAotICAgYmVjYXVzZSBzb21lIEFOU0kgQyBmdW5jdGlvbnMgd2lsbCByZXF1aXJlIGxpbmtpbmcgd2l0aCB0aGlzIG9iamVjdAotICAgZmlsZSBhbmQgdGhlIG5hbWUgc3BhY2UgbXVzdCBub3QgYmUgcG9sbHV0ZWQuICAqLwotIyBkZWZpbmUgc3RyY2FzZWNtcCBfX3N0cmNhc2VjbXAKLSNlbmRpZgotCi0KLS8qIEZvciB0aG9zZSBsb29zaW5nIHN5c3RlbXMgd2hpY2ggZG9uJ3QgaGF2ZSBgYWxsb2NhJyB3ZSBoYXZlIHRvIGFkZAotICAgc29tZSBhZGRpdGlvbmFsIGNvZGUgZW11bGF0aW5nIGl0LiAgKi8KLSNpZmRlZiBIQVZFX0FMTE9DQQotLyogTm90aGluZyBoYXMgdG8gYmUgZG9uZS4gICovCi0jIGRlZmluZSBBRERfQkxPQ0sobGlzdCwgYWRkcmVzcykgLyogbm90aGluZyAqLwotIyBkZWZpbmUgRlJFRV9CTE9DS1MobGlzdCkgLyogbm90aGluZyAqLwotI2Vsc2UKLXN0cnVjdCBibG9ja19saXN0Ci17Ci0gIHZvaWQgKmFkZHJlc3M7Ci0gIHN0cnVjdCBibG9ja19saXN0ICpuZXh0OwotfTsKLSMgZGVmaW5lIEFERF9CTE9DSyhsaXN0LCBhZGRyKQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICBzdHJ1Y3QgYmxvY2tfbGlzdCAqbmV3cCA9IChzdHJ1Y3QgYmxvY2tfbGlzdCAqKSBtYWxsb2MgKHNpemVvZiAoKm5ld3ApKTsgIFwKLSAgICAvKiBJZiB3ZSBjYW5ub3QgZ2V0IGEgZnJlZSBibG9jayB3ZSBjYW5ub3QgYWRkIHRoZSBuZXcgZWxlbWVudCB0bwkgICAgICBcCi0gICAgICAgdGhlIGxpc3QuICAqLwkJCQkJCQkgICAgICBcCi0gICAgaWYgKG5ld3AgIT0gTlVMTCkgewkJCQkJCQkgICAgICBcCi0gICAgICBuZXdwLT5hZGRyZXNzID0gKGFkZHIpOwkJCQkJCSAgICAgIFwKLSAgICAgIG5ld3AtPm5leHQgPSAobGlzdCk7CQkJCQkJICAgICAgXAotICAgICAgKGxpc3QpID0gbmV3cDsJCQkJCQkJICAgICAgXAotICAgIH0JCQkJCQkJCQkgICAgICBcCi0gIH0gd2hpbGUgKDApCi0jIGRlZmluZSBGUkVFX0JMT0NLUyhsaXN0KQkJCQkJCSAgICAgIFwKLSAgZG8gewkJCQkJCQkJCSAgICAgIFwKLSAgICB3aGlsZSAobGlzdCAhPSBOVUxMKSB7CQkJCQkJICAgICAgXAotICAgICAgc3RydWN0IGJsb2NrX2xpc3QgKm9sZCA9IGxpc3Q7CQkJCQkgICAgICBcCi0gICAgICBsaXN0ID0gbGlzdC0+bmV4dDsJCQkJCQkgICAgICBcCi0gICAgICBmcmVlIChvbGQpOwkJCQkJCQkgICAgICBcCi0gICAgfQkJCQkJCQkJCSAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSMgdW5kZWYgYWxsb2NhCi0jIGRlZmluZSBhbGxvY2Eoc2l6ZSkgKG1hbGxvYyAoc2l6ZSkpCi0jZW5kaWYJLyogaGF2ZSBhbGxvY2EgKi8KLQotCi1zdHJ1Y3QgYWxpYXNfbWFwCi17Ci0gIGNvbnN0IGNoYXIgKmFsaWFzOwotICBjb25zdCBjaGFyICp2YWx1ZTsKLX07Ci0KLQotc3RhdGljIHN0cnVjdCBhbGlhc19tYXAgKm1hcDsKLXN0YXRpYyBzaXplX3Qgbm1hcCA9IDA7Ci1zdGF0aWMgc2l6ZV90IG1heG1hcCA9IDA7Ci0KLQotLyogUHJvdG90eXBlcyBmb3IgbG9jYWwgZnVuY3Rpb25zLiAgKi8KLXN0YXRpYyBzaXplX3QgcmVhZF9hbGlhc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZuYW1lLCBpbnQgZm5hbWVfbGVuKSk7Ci1zdGF0aWMgdm9pZCBleHRlbmRfYWxpYXNfdGFibGUgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBhbGlhc19jb21wYXJlIFBBUkFNUyAoKGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDEsCi0JCQkJICBjb25zdCBzdHJ1Y3QgYWxpYXNfbWFwICptYXAyKSk7Ci0KLQotY29uc3QgY2hhciAqCi1fbmxfZXhwYW5kX2FsaWFzIChuYW1lKQotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpsb2NhbGVfYWxpYXNfcGF0aCA9IExPQ0FMRV9BTElBU19QQVRIOwotICBzdHJ1Y3QgYWxpYXNfbWFwICpyZXR2YWw7Ci0gIHNpemVfdCBhZGRlZDsKLQotICBkbwotICAgIHsKLSAgICAgIHN0cnVjdCBhbGlhc19tYXAgaXRlbTsKLQotICAgICAgaXRlbS5hbGlhcyA9IG5hbWU7Ci0KLSAgICAgIGlmIChubWFwID4gMCkKLQlyZXR2YWwgPSAoc3RydWN0IGFsaWFzX21hcCAqKSBic2VhcmNoICgmaXRlbSwgbWFwLCBubWFwLAotCQkJCQkgICAgICAgc2l6ZW9mIChzdHJ1Y3QgYWxpYXNfbWFwKSwKLQkJCQkJICAgICAgIChpbnQgKCopIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwKLQkJCQkJCQkJIGNvbnN0IHZvaWQgKikpCi0JCQkJCQkpIGFsaWFzX2NvbXBhcmUpOwotICAgICAgZWxzZQotCXJldHZhbCA9IE5VTEw7Ci0KLSAgICAgIC8qIFdlIHJlYWxseSBmb3VuZCBhbiBhbGlhcy4gIFJldHVybiB0aGUgdmFsdWUuICAqLwotICAgICAgaWYgKHJldHZhbCAhPSBOVUxMKQotCXJldHVybiByZXR2YWwtPnZhbHVlOwotCi0gICAgICAvKiBQZXJoYXBzIHdlIGNhbiBmaW5kIGFub3RoZXIgYWxpYXMgZmlsZS4gICovCi0gICAgICBhZGRlZCA9IDA7Ci0gICAgICB3aGlsZSAoYWRkZWQgPT0gMCAmJiBsb2NhbGVfYWxpYXNfcGF0aFswXSAhPSAnXDAnKQotCXsKLQkgIGNvbnN0IGNoYXIgKnN0YXJ0OwotCi0JICB3aGlsZSAobG9jYWxlX2FsaWFzX3BhdGhbMF0gPT0gJzonKQotCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOwotCSAgc3RhcnQgPSBsb2NhbGVfYWxpYXNfcGF0aDsKLQotCSAgd2hpbGUgKGxvY2FsZV9hbGlhc19wYXRoWzBdICE9ICdcMCcgJiYgbG9jYWxlX2FsaWFzX3BhdGhbMF0gIT0gJzonKQotCSAgICArK2xvY2FsZV9hbGlhc19wYXRoOwotCi0JICBpZiAoc3RhcnQgPCBsb2NhbGVfYWxpYXNfcGF0aCkKLQkgICAgYWRkZWQgPSByZWFkX2FsaWFzX2ZpbGUgKHN0YXJ0LCBsb2NhbGVfYWxpYXNfcGF0aCAtIHN0YXJ0KTsKLQl9Ci0gICAgfQotICB3aGlsZSAoYWRkZWQgIT0gMCk7Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljIHNpemVfdAotcmVhZF9hbGlhc19maWxlIChmbmFtZSwgZm5hbWVfbGVuKQotICAgICBjb25zdCBjaGFyICpmbmFtZTsKLSAgICAgaW50IGZuYW1lX2xlbjsKLXsKLSNpZm5kZWYgSEFWRV9BTExPQ0EKLSAgc3RydWN0IGJsb2NrX2xpc3QgKmJsb2NrX2xpc3QgPSBOVUxMOwotI2VuZGlmCi0gIEZJTEUgKmZwOwotICBjaGFyICpmdWxsX2ZuYW1lOwotICBzaXplX3QgYWRkZWQ7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGFsaWFzZmlsZVtdID0gIi9sb2NhbGUuYWxpYXMiOwotCi0gIGZ1bGxfZm5hbWUgPSAoY2hhciAqKSBhbGxvY2EgKGZuYW1lX2xlbiArIHNpemVvZiBhbGlhc2ZpbGUpOwotICBBRERfQkxPQ0sgKGJsb2NrX2xpc3QsIGZ1bGxfZm5hbWUpOwotICBtZW1jcHkgKGZ1bGxfZm5hbWUsIGZuYW1lLCBmbmFtZV9sZW4pOwotICBtZW1jcHkgKCZmdWxsX2ZuYW1lW2ZuYW1lX2xlbl0sIGFsaWFzZmlsZSwgc2l6ZW9mIGFsaWFzZmlsZSk7Ci0KLSAgZnAgPSBmb3BlbiAoZnVsbF9mbmFtZSwgInIiKTsKLSAgaWYgKGZwID09IE5VTEwpCi0gICAgewotICAgICAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gIGFkZGVkID0gMDsKLSAgd2hpbGUgKCFmZW9mIChmcCkpCi0gICAgewotICAgICAgLyogSXQgaXMgYSByZWFzb25hYmxlIGFwcHJvYWNoIHRvIHVzZSBhIGZpeCBidWZmZXIgaGVyZSBiZWNhdXNlCi0JIGEpIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IHR3byBmaWVsZHMKLQkgYikgdGhlc2UgZmllbGRzIG11c3QgYmUgdXNhYmxlIGFzIGZpbGUgbmFtZXMgYW5kIHNvIG11c3Qgbm90Ci0JICAgIGJlIHRoYXQgbG9uZwotICAgICAgICovCi0gICAgICBjaGFyIGJ1ZltCVUZTSVpdOwotICAgICAgY2hhciAqYWxpYXM7Ci0gICAgICBjaGFyICp2YWx1ZTsKLSAgICAgIGNoYXIgKmNwOwotCi0gICAgICBpZiAoZmdldHMgKGJ1ZiwgQlVGU0laLCBmcCkgPT0gTlVMTCkKLQkvKiBFT0YgcmVhY2hlZC4gICovCi0JYnJlYWs7Ci0KLSAgICAgIGNwID0gYnVmOwotICAgICAgLyogSWdub3JlIGxlYWRpbmcgd2hpdGUgc3BhY2UuICAqLwotICAgICAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKLQkrK2NwOwotCi0gICAgICAvKiBBIGxlYWRpbmcgJyMnIHNpZ25hbHMgYSBjb21tZW50IGxpbmUuICAqLwotICAgICAgaWYgKGNwWzBdICE9ICdcMCcgJiYgY3BbMF0gIT0gJyMnKQotCXsKLQkgIGFsaWFzID0gY3ArKzsKLQkgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCi0JICAgICsrY3A7Ci0JICAvKiBUZXJtaW5hdGUgYWxpYXMgbmFtZS4gICovCi0JICBpZiAoY3BbMF0gIT0gJ1wwJykKLQkgICAgKmNwKysgPSAnXDAnOwotCi0JICAvKiBOb3cgbG9vayBmb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgdmFsdWUuICAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKGNwWzBdKSkKLQkgICAgKytjcDsKLQotCSAgaWYgKGNwWzBdICE9ICdcMCcpCi0JICAgIHsKLQkgICAgICBjaGFyICp0cDsKLQkgICAgICBzaXplX3QgbGVuOwotCi0JICAgICAgdmFsdWUgPSBjcCsrOwotCSAgICAgIHdoaWxlIChjcFswXSAhPSAnXDAnICYmICFpc3NwYWNlIChjcFswXSkpCi0JCSsrY3A7Ci0JICAgICAgLyogVGVybWluYXRlIHZhbHVlLiAgKi8KLQkgICAgICBpZiAoY3BbMF0gPT0gJ1xuJykKLQkJewotCQkgIC8qIFRoaXMgaGFzIHRvIGJlIGRvbmUgdG8gbWFrZSB0aGUgZm9sbG93aW5nIHRlc3QKLQkJICAgICBmb3IgdGhlIGVuZCBvZiBsaW5lIHBvc3NpYmxlLiAgV2UgYXJlIGxvb2tpbmcgZm9yCi0JCSAgICAgdGhlIHRlcm1pbmF0aW5nICdcbicgd2hpY2ggZG8gbm90IG92ZXJ3cml0ZSBoZXJlLiAgKi8KLQkJICAqY3ArKyA9ICdcMCc7Ci0JCSAgKmNwID0gJ1xuJzsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGNwWzBdICE9ICdcMCcpCi0JCSpjcCsrID0gJ1wwJzsKLQotCSAgICAgIGlmIChubWFwID49IG1heG1hcCkKLQkJZXh0ZW5kX2FsaWFzX3RhYmxlICgpOwotCi0JICAgICAgLyogV2UgY2Fubm90IGRlcGVuZCBvbiBzdHJkdXAgYXZhaWxhYmxlIGluIHRoZSBsaWJjLiAgU2lnaCEgICovCi0JICAgICAgbGVuID0gc3RybGVuIChhbGlhcykgKyAxOwotCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmICh0cCA9PSBOVUxMKQotCQl7Ci0JCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCQkgIHJldHVybiBhZGRlZDsKLQkJfQotCSAgICAgIG1lbWNweSAodHAsIGFsaWFzLCBsZW4pOwotCSAgICAgIG1hcFtubWFwXS5hbGlhcyA9IHRwOwotCi0JICAgICAgbGVuID0gc3RybGVuICh2YWx1ZSkgKyAxOwotCSAgICAgIHRwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotCSAgICAgIGlmICh0cCA9PSBOVUxMKQotCQl7Ci0JCSAgRlJFRV9CTE9DS1MgKGJsb2NrX2xpc3QpOwotCQkgIHJldHVybiBhZGRlZDsKLQkJfQotCSAgICAgIG1lbWNweSAodHAsIHZhbHVlLCBsZW4pOwotCSAgICAgIG1hcFtubWFwXS52YWx1ZSA9IHRwOwotCi0JICAgICAgKytubWFwOwotCSAgICAgICsrYWRkZWQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFBvc3NpYmx5IG5vdCB0aGUgd2hvbGUgbGluZSBmaXRzIGludG8gdGhlIGJ1ZmZlci4gIElnbm9yZQotCSB0aGUgcmVzdCBvZiB0aGUgbGluZS4gICovCi0gICAgICB3aGlsZSAoc3RyY2hyIChjcCwgJ1xuJykgPT0gTlVMTCkKLQl7Ci0JICBjcCA9IGJ1ZjsKLQkgIGlmIChmZ2V0cyAoYnVmLCBCVUZTSVosIGZwKSA9PSBOVUxMKQotCSAgICAvKiBNYWtlIHN1cmUgdGhlIGlubmVyIGxvb3Agd2lsbCBiZSBsZWZ0LiAgVGhlIG91dGVyIGxvb3AKLQkgICAgICAgd2lsbCBleGl0IGF0IHRoZSBgZmVvZicgdGVzdC4gICovCi0JICAgICpjcCA9ICdcbic7Ci0JfQotICAgIH0KLQotICAvKiBTaG91bGQgd2UgdGVzdCBmb3IgZmVycm9yKCk/ICBJIHRoaW5rIHdlIGhhdmUgdG8gc2lsZW50bHkgaWdub3JlCi0gICAgIGVycm9ycy4gIC0tZHJlcHBlciAgKi8KLSAgZmNsb3NlIChmcCk7Ci0KLSAgaWYgKGFkZGVkID4gMCkKLSAgICBxc29ydCAobWFwLCBubWFwLCBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApLAotCSAgIChpbnQgKCopIFBBUkFNUyAoKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSkpIGFsaWFzX2NvbXBhcmUpOwotCi0gIEZSRUVfQkxPQ0tTIChibG9ja19saXN0KTsKLSAgcmV0dXJuIGFkZGVkOwotfQotCi0KLXN0YXRpYyB2b2lkCi1leHRlbmRfYWxpYXNfdGFibGUgKCkKLXsKLSAgc2l6ZV90IG5ld19zaXplOwotICBzdHJ1Y3QgYWxpYXNfbWFwICpuZXdfbWFwOwotCi0gIG5ld19zaXplID0gbWF4bWFwID09IDAgPyAxMDAgOiAyICogbWF4bWFwOwotICBuZXdfbWFwID0gKHN0cnVjdCBhbGlhc19tYXAgKikgbWFsbG9jIChuZXdfc2l6ZQotCQkJCQkgKiBzaXplb2YgKHN0cnVjdCBhbGlhc19tYXApKTsKLSAgaWYgKG5ld19tYXAgPT0gTlVMTCkKLSAgICAvKiBTaW1wbHkgZG9uJ3QgZXh0ZW5kOiB3ZSBkb24ndCBoYXZlIGFueSBtb3JlIGNvcmUuICAqLwotICAgIHJldHVybjsKLQotICBtZW1jcHkgKG5ld19tYXAsIG1hcCwgbm1hcCAqIHNpemVvZiAoc3RydWN0IGFsaWFzX21hcCkpOwotCi0gIGlmIChtYXhtYXAgIT0gMCkKLSAgICBmcmVlIChtYXApOwotCi0gIG1hcCA9IG5ld19tYXA7Ci0gIG1heG1hcCA9IG5ld19zaXplOwotfQotCi0KLXN0YXRpYyBpbnQKLWFsaWFzX2NvbXBhcmUgKG1hcDEsIG1hcDIpCi0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDE7Ci0gICAgIGNvbnN0IHN0cnVjdCBhbGlhc19tYXAgKm1hcDI7Ci17Ci0jaWYgZGVmaW5lZCBfTElCQyB8fCBkZWZpbmVkIEhBVkVfU1RSQ0FTRUNNUAotICByZXR1cm4gc3RyY2FzZWNtcCAobWFwMS0+YWxpYXMsIG1hcDItPmFsaWFzKTsKLSNlbHNlCi0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMS0+YWxpYXM7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWFwMi0+YWxpYXM7Ci0gIHVuc2lnbmVkIGNoYXIgYzEsIGMyOwotCi0gIGlmIChwMSA9PSBwMikKLSAgICByZXR1cm4gMDsKLQotICBkbwotICAgIHsKLSAgICAgIC8qIEkga25vdyB0aGlzIHNlZW1zIHRvIGJlIG9kZCBidXQgdGhlIHRvbG93ZXIoKSBmdW5jdGlvbiBpbgotCSBzb21lIHN5c3RlbXMgbGliYyBjYW5ub3QgaGFuZGxlIG5vbmFscGhhIGNoYXJhY3RlcnMuICAqLwotICAgICAgYzEgPSBpc3VwcGVyICgqcDEpID8gdG9sb3dlciAoKnAxKSA6ICpwMTsKLSAgICAgIGMyID0gaXN1cHBlciAoKnAyKSA/IHRvbG93ZXIgKCpwMikgOiAqcDI7Ci0gICAgICBpZiAoYzEgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgICsrcDE7Ci0gICAgICArK3AyOwotICAgIH0KLSAgd2hpbGUgKGMxID09IGMyKTsKLQotICByZXR1cm4gYzEgLSBjMjsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvaW50bC9wbzJ0Ymwuc2VkLmluIGIvaW50bC9wbzJ0Ymwuc2VkLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JjY2E0Li4wMDAwMDAwCi0tLSBhL2ludGwvcG8ydGJsLnNlZC5pbgorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jIHBvMnRibC5zZWQgLSBDb252ZXJ0IFVuaWZvcnVtIHN0eWxlIC5wbyBmaWxlIHRvIGxvb2t1cCB0YWJsZSBmb3IgY2F0Z2V0cwotIyBDb3B5cmlnaHQgKEMpIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLTEgewotICBpXAotLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgcG8ydGJsLnNlZCBmcm9tIEBQQUNLQUdFIE5BTUVALnBvdC4gICovXAotXAotI2lmIEhBVkVfQ09ORklHX0hcCi0jIGluY2x1ZGUgPGNvbmZpZy5oPlwKLSNlbmRpZlwKLVwKLSNpbmNsdWRlICJsaWJnZXR0ZXh0LmgiXAotXAotY29uc3Qgc3RydWN0IF9tc2dfZW50IF9tc2dfdGJsW10gPSB7Ci0gIGgKLSAgcy8uKi8wLwotICB4Ci19Ci0jCi0jIFdyaXRlIG1zZ2lkIGVudHJpZXMgaW4gQyBhcnJheSBmb3JtLgotIwotL15tc2dpZC8gewotICBzL21zZ2lkWyAJXSpcKCIuKiJcKS8gIHtcMS8KLSAgdGIKLSMgQXBwZW5kIHRoZSBuZXh0IGxpbmUKLSAgOmIKLSAgTgotIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgY29udGludWF0aW9uIGxpbmUuCi0gIHMvXCguKlwpIlwoXG5cKSJcKC4qIlwpL1wxXDJcMy8KLSMgWWVzLCB0aGVuIGJyYW5jaC4KLSAgdGEKLSMgQmVjYXVzZSB3ZSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgZmlsZSBjb3JyZWN0bHkgZm9ybWVkIHRoZSBsaW5lCi0jIGp1c3QgcmVhZCBjYW5ub3QgYmUgYWdhaW4gYmUgYSBtc2dpZCBsaW5lLiAgU28gaXQncyBzYWZlIHRvIGlnbm9yZQotIyBpdC4KLSAgcy9cKC4qXClcbi4qL1wxLwotICBiYwotIyBXZSBmb3VuZCBhIGNvbnRpbnVhdGlvbiBsaW5lLiAgQnV0IGJlZm9yZSBwcmludGluZyBpbnNlcnQgJ1wnLgotICA6YQotICBzL1woLipcKVwoXG4uKlwpL1wxXFxcMi8KLSAgUAotIyBXZSBjYW5ub3QgdXNlIEQgaGVyZS4KLSAgcy8uKlxuXCguKlwpL1wxLwotIyBTb21lIGJ1Z2d5IHNlZHMgZG8gbm90IGNsZWFyIHRoZSBgc3VjY2Vzc2Z1bCBzdWJzdGl0dXRpb24gc2luY2UgbGFzdCBgYHQnJycKLSMgZmxhZyBvbiBgTicsIHNvIHdlIGRvIGEgYHQnIGhlcmUgdG8gY2xlYXIgaXQuCi0gIHRiCi0jIE5vdCByZWFjaGVkCi0gIDpjCi0gIHgKLSMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5Ci0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotICB0ZAotIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgotIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCi0gIDpkCi0gIHMvOVwoXypcKSQvX1wxLwotICB0ZAotIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KLSAgcy9eXChfKlwpJC8wXDEvCi0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KLSAgcy84XChfKlwpJC85XDEvCi0gIHMvN1woXypcKSQvOFwxLwotICBzLzZcKF8qXCkkLzdcMS8KLSAgcy81XChfKlwpJC82XDEvCi0gIHMvNFwoXypcKSQvNVwxLwotICBzLzNcKF8qXCkkLzRcMS8KLSAgcy8yXChfKlwpJC8zXDEvCi0gIHMvMVwoXypcKSQvMlwxLwotICBzLzBcKF8qXCkkLzFcMS8KLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KLSAgcy9fLzAvZwotICB4Ci0gIEcKLSAgcy9cKC4qXClcblwoWzAtOV0qXCkvXDEsIFwyfSwvCi0gIHMvXCguKlwpIiQvXDEvCi0gIHAKLX0KLSMKLSMgTGFzdCBsaW5lLgotIwotJCB7Ci0gIGlcCi19O1wKLQotICBnCi0gIHMvMCpcKC4qXCkvaW50IF9tc2dfdGJsX2xlbmd0aCA9IFwxOy9wCi19Ci1kCmRpZmYgLS1naXQgYS9pbnRsL3RleHRkb21haW4uYyBiL2ludGwvdGV4dGRvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ5MzQwLi4wMDAwMDAwCi0tLSBhL2ludGwvdGV4dGRvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZXh0ZG9tYWluKDMpIGZ1bmN0aW9uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGdudS5haS5taXQuZWR1PiwgMTk5NS4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCi0gICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSMgaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgX0xJQkMKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQgU1REQ19IRUFERVJTIHx8IGRlZmluZWQgSEFWRV9TVFJJTkdfSCB8fCBkZWZpbmVkIF9MSUJDCi0jIGluY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSMgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyBpZm5kZWYgbWVtY3B5Ci0jICBkZWZpbmUgbWVtY3B5KERzdCwgU3JjLCBOdW0pIGJjb3B5IChTcmMsIERzdCwgTnVtKQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfTElCQwotIyBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jZWxzZQotIyBpbmNsdWRlICJsaWJnZXR0ZXh0LmgiCi0jZW5kaWYKLQotLyogQEAgZW5kIG9mIHByb2xvZyBAQCAqLwotCi0vKiBOYW1lIG9mIHRoZSBkZWZhdWx0IHRleHQgZG9tYWluLiAgKi8KLWV4dGVybiBjb25zdCBjaGFyIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluW107Ci0KLS8qIERlZmF1bHQgdGV4dCBkb21haW4gaW4gd2hpY2ggZW50cmllcyBmb3IgZ2V0dGV4dCgzKSBhcmUgdG8gYmUgZm91bmQuICAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKl9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluOwotCi0KLS8qIE5hbWVzIGZvciB0aGUgbGliaW50bCBmdW5jdGlvbnMgYXJlIGEgcHJvYmxlbS4gIFRoZXkgbXVzdCBub3QgY2xhc2gKLSAgIHdpdGggZXhpc3RpbmcgbmFtZXMgYW5kIHRoZXkgc2hvdWxkIGZvbGxvdyBBTlNJIEMuICBCdXQgdGhpcyBzb3VyY2UKLSAgIGNvZGUgaXMgYWxzbyB1c2VkIGluIEdOVSBDIExpYnJhcnkgd2hlcmUgdGhlIG5hbWVzIGhhdmUgYSBfXwotICAgcHJlZml4LiAgU28gd2UgaGF2ZSB0byBtYWtlIGEgZGlmZmVyZW5jZSBoZXJlLiAgKi8KLSNpZmRlZiBfTElCQwotIyBkZWZpbmUgVEVYVERPTUFJTiBfX3RleHRkb21haW4KLSMgZGVmaW5lIHN0cmR1cChzdHIpIF9fc3RyZHVwIChzdHIpCi0jZWxzZQotIyBkZWZpbmUgVEVYVERPTUFJTiB0ZXh0ZG9tYWluX18KLSNlbmRpZgotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBtZXNzYWdlIGNhdGFsb2cgdG8gRE9NQUlOTkFNRS4KLSAgIElmIERPTUFJTk5BTUUgaXMgbnVsbCwgcmV0dXJuIHRoZSBjdXJyZW50IGRlZmF1bHQuCi0gICBJZiBET01BSU5OQU1FIGlzICIiLCByZXNldCB0byB0aGUgZGVmYXVsdCBvZiAibWVzc2FnZXMiLiAgKi8KLWNoYXIgKgotVEVYVERPTUFJTiAoZG9tYWlubmFtZSkKLSAgICAgY29uc3QgY2hhciAqZG9tYWlubmFtZTsKLXsKLSAgY2hhciAqb2xkOwotCi0gIC8qIEEgTlVMTCBwb2ludGVyIHJlcXVlc3RzIHRoZSBjdXJyZW50IHNldHRpbmcuICAqLwotICBpZiAoZG9tYWlubmFtZSA9PSBOVUxMKQotICAgIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICBvbGQgPSAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLQotICAvKiBJZiBkb21haW4gbmFtZSBpcyB0aGUgbnVsbCBzdHJpbmcgc2V0IHRvIGRlZmF1bHQgZG9tYWluICJtZXNzYWdlcyIuICAqLwotICBpZiAoZG9tYWlubmFtZVswXSA9PSAnXDAnCi0gICAgICB8fCBzdHJjbXAgKGRvbWFpbm5hbWUsIF9ubF9kZWZhdWx0X2RlZmF1bHRfZG9tYWluKSA9PSAwKQotICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gX25sX2RlZmF1bHRfZGVmYXVsdF9kb21haW47Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgZm9sbG93aW5nIG1hbGxvYyBmYWlscyBgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4nCi0JIHdpbGwgYmUgTlVMTC4gIFRoaXMgdmFsdWUgd2lsbCBiZSByZXR1cm5lZCBhbmQgc28gc2lnbmFscyB3ZQotCSBhcmUgb3V0IG9mIGNvcmUuICAqLwotI2lmIGRlZmluZWQgX0xJQkMgfHwgZGVmaW5lZCBIQVZFX1NUUkRVUAotICAgICAgX25sX2N1cnJlbnRfZGVmYXVsdF9kb21haW4gPSBzdHJkdXAgKGRvbWFpbm5hbWUpOwotI2Vsc2UKLSAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4gKGRvbWFpbm5hbWUpICsgMTsKLSAgICAgIGNoYXIgKmNwID0gKGNoYXIgKikgbWFsbG9jIChsZW4pOwotICAgICAgaWYgKGNwICE9IE5VTEwpCi0JbWVtY3B5IChjcCwgZG9tYWlubmFtZSwgbGVuKTsKLSAgICAgIF9ubF9jdXJyZW50X2RlZmF1bHRfZG9tYWluID0gY3A7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgaWYgKG9sZCAhPSBfbmxfZGVmYXVsdF9kZWZhdWx0X2RvbWFpbikKLSAgICBmcmVlIChvbGQpOwotCi0gIHJldHVybiAoY2hhciAqKSBfbmxfY3VycmVudF9kZWZhdWx0X2RvbWFpbjsKLX0KLQotI2lmZGVmIF9MSUJDCi0vKiBBbGlhcyBmb3IgZnVuY3Rpb24gbmFtZSBpbiBHTlUgQyBMaWJyYXJ5LiAgKi8KLXdlYWtfYWxpYXMgKF9fdGV4dGRvbWFpbiwgdGV4dGRvbWFpbik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ludGwveG9wZW4tbXNnLnNlZCBiL2ludGwveG9wZW4tbXNnLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5YzBiYi4uMDAwMDAwMAotLS0gYS9pbnRsL3hvcGVuLW1zZy5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotIyBwbzJtc2cuc2VkIC0gQ29udmVydCBVbmlmb3J1bSBzdHlsZSAucG8gZmlsZSB0byBYL09wZW4gc3R5bGUgLm1zZyBmaWxlCi0jIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0jIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIwotIyBUaGUgZmlyc3QgZGlyZWN0aXZlIGluIHRoZSAubXNnIHNob3VsZCBiZSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSMgbWVzc2FnZSBzZXQgbnVtYmVyLiAgV2UgdXNlIGFsd2F5cyBzZXQgbnVtYmVyIDEuCi0jCi0xIHsKLSAgaVwKLSRzZXQgMSAjIEF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBwbzJtc2cuc2VkCi0gIGgKLSAgcy8uKi8wLwotICB4Ci19Ci0jCi0jIFdlIGNvcHkgYWxsIGNvbW1lbnRzIGludG8gdGhlIC5tc2cgZmlsZS4gIFBlcmhhcHMgdGhleSBjYW4gaGVscC4KLSMKLS9eIy8gcy9eI1sgCV0qLyQgL3AKLSMKLSMgV2UgY29weSB0aGUgb3JpZ2luYWwgbWVzc2FnZSBhcyBhIGNvbW1lbnQgaW50byB0aGUgLm1zZyBmaWxlLgotIwotL15tc2dpZC8gewotIyBEb2VzIG5vdCB3b3JrIG5vdwotIyAgLyIkLyEgewotIyAgICBzL1xcJC8vCi0jICAgIHMvJC8gLi4uIChtb3JlIGxpbmVzIGZvbGxvd2luZykiLwotIyAgfQotICBzL15tc2dpZFsgCV0qIlwoLipcKSIkLyQgT3JpZ2luYWwgTWVzc2FnZTogXDEvCi0gIHAKLX0KLSMKLSMgVGhlIC5tc2cgZmlsZSBjb250YWlucywgb3RoZXIgdGhlbiB0aGUgLnBvIGZpbGUsIG9ubHkgdGhlIHRyYW5zbGF0aW9ucwotIyBidXQgZWFjaCBnaXZlbiBhIHVuaXF1ZSBJRC4gIFN0YXJ0aW5nIGZyb20gMSBhbmQgaW5jcmVtZW50aW5nIGJ5IDEgZm9yCi0jIGVhY2ggbWVzc2FnZSB3ZSBhc3NpZ24gdGhlbSB0byB0aGUgbWVzc2FnZXMuCi0jIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSAucG8gZmlsZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjYXQtaWQtdGJsLmMgZmlsZQotIyAod2l0aCBwby10by10YmwpIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgdXNlZCBoZXJlLiAgKEF0IGxlYXN0IHRoZSBvcmRlcgotIyBvZiBkZWNsYXJhdGlvbnMgbXVzdCBub3QgYmUgY2hhbmdlZC4pCi0jCi0vXm1zZ3N0ci8gewotICBzL21zZ3N0clsgCV0qIlwoLipcKSIvXDEvCi0gIHgKLSMgVGhlIGZvbGxvd2luZyBuaWNlIHNvbHV0aW9uIGlzIGJ5Ci0jIEJydW5vIDxIYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgotICB0ZAotIyBJbmNyZW1lbnQgYSBkZWNpbWFsIG51bWJlciBpbiBwYXR0ZXJuIHNwYWNlLgotIyBGaXJzdCBoaWRlIHRyYWlsaW5nIGA5JyBkaWdpdHMuCi0gIDpkCi0gIHMvOVwoXypcKSQvX1wxLwotICB0ZAotIyBBc3N1cmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGlzIGF2YWlsYWJsZS4KLSAgcy9eXChfKlwpJC8wXDEvCi0jIEluY3JlbWVudCB0aGUgbGFzdCBkaWdpdC4KLSAgcy84XChfKlwpJC85XDEvCi0gIHMvN1woXypcKSQvOFwxLwotICBzLzZcKF8qXCkkLzdcMS8KLSAgcy81XChfKlwpJC82XDEvCi0gIHMvNFwoXypcKSQvNVwxLwotICBzLzNcKF8qXCkkLzRcMS8KLSAgcy8yXChfKlwpJC8zXDEvCi0gIHMvMVwoXypcKSQvMlwxLwotICBzLzBcKF8qXCkkLzFcMS8KLSMgQ29udmVydCB0aGUgaGlkZGVuIGA5JyBkaWdpdHMgdG8gYDAncy4KLSAgcy9fLzAvZwotICB4Ci0jIEJyaW5nIHRoZSBsaW5lIGluIHRoZSBmb3JtYXQgYDxudW1iZXI+IDxtZXNzYWdlPicKLSAgRwotICBzL15bXlxuXSokLyYgLwotICBzL1woLipcKVxuXChbMC05XSpcKS9cMiBcMS8KLSMgQ2xlYXIgZmxhZyBmcm9tIGxhc3Qgc3Vic3RpdHV0aW9uLgotICB0YgotIyBBcHBlbmQgdGhlIG5leHQgbGluZS4KLSAgOmIKLSAgTgotIyBMb29rIHdoZXRoZXIgc2Vjb25kIHBhcnQgaXMgYSBjb250aW51YXRpb24gbGluZS4KLSAgcy9cKC4qXG5cKSJcKC4qXCkiL1wxXDIvCi0jIFllcywgdGhlbiBicmFuY2guCi0gIHRhCi0gIFAKLSAgRAotIyBOb3RlIHRoYXQgYEQnIGluY2x1ZGVzIGEganVtcCB0byB0aGUgc3RhcnQhIQotIyBXZSBmb3VuZCBhIGNvbnRpbnVhdGlvbiBsaW5lLiAgQnV0IGJlZm9yZSBwcmludGluZyBpbnNlcnQgJ1wnLgotICA6YQotICBzL1woLipcKVwoXG4uKlwpL1wxXFxcMi8KLSAgUAotIyBXZSBjYW5ub3QgdXNlIHRoZSBzZWQgY29tbWFuZCBgRCcgaGVyZQotICBzLy4qXG5cKC4qXCkvXDEvCi0gIHRiCi19Ci1kCmRpZmYgLS1naXQgYS9sZC9DaGFuZ2VMb2cgYi9sZC9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTYyY2EuLjAwMDAwMDAKLS0tIGEvbGQvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsOTEwMyArMCwwIEBACi0xOTk5LTA2LTIyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgbGlua19pbmZvLmluaXRfZnVuY3Rpb24gYW5kCi0JbGlua19pbmZvLmZpbmlfZnVuY3Rpb24uCi0JKiBsZXhzdXAuYyAoT1BUSU9OX0lOSVQpOiBOZXcgbWFjcm8uCi0JKE9QVElPTl9GSU5JKTogTGlrZXdpc2UuCi0JKGxkX29wdGlvbnMpOiBBZGQgZGVzY3JpcHRpb25zIGZvciB0aGVtLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIHRoZW0uCi0KLTE5OTktMDYtMjMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IE9ubHkgZGlzY2FyZCBsaW5rIG9uY2UKLQlzZWN0aW9ucyBpZiB3ZSBhcmUgYnVpbGRpbmcgY29uc3RydWN0b3JzLgotCi0xOTk5LTA2LTIyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChMb2NhdGlvbiBDb3VudGVyKTogRGVzY3JpYmUgYmVoYXZpb3VyIG9mCi0JbG9jYXRpb24gY291bnRlciBpbnNpZGUgc2VjdGlvbiBzdGF0ZW1lbnRzLgotCi0xOTk5LTA2LTIwICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKFdSSVRBQkxFX1JPREFUQSk6IE5ldyB2YXJpYWJsZSBmb3IKLQljb250cm9sbGluZyB3aGV0aGVyIG9yIG5vdCAucm9kYXRhIGlzIGluIHRoZSBkYXRhIHNlZ21lbnQgb3IgdGhlCi0JdGV4dCBzZWdtZW50LgotCi0xOTk5LTA2LTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IEFkZCBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCAtLXRodW1iLWVudHJ5LgotCSogZW11bHRlbXBsL2FybWVsZi5lbTogQWRkIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIC0tdGh1bWItZW50cnkuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogQWRkIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoIC0tdGh1bWItZW50cnkuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBuZXcgQVJNIGNvbW1hbmQgbGluZSBzd2l0Y2g6IC0tdGh1bWItZW50cnkuCQotMTk5OS0wNi0yMCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBjb25maWd1cmUuaW4gKGFsbF9saWJwYXRoKTogQWNjdW11bGF0ZSBhY3Jvc3MgYWxsIGVuYWJsZWQgdGFyZ2V0cy4KLQotU3VuIEp1biAyMCAxNDoxMDozMyAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBXYXRjaCBFTVVMQVRJT05fTElCUEFUSCBpbnN0ZWFkIG9mCi0JREVGQVVMVF9FTVVMQVRJT04uCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBMaWtld2lzZS4KLQotRnJpIEp1biAxOCAxNToyNDo0OCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoR0VOU0NSSVBUUyk6IFBhc3MgRU1VTEFUSU9OX0xJQlBBVEgsIG5vdCBFTVVMLgotCSogY29uZmlndXJlLmluIChhbGxfZW11bHMpOiBBZGQgdGFyZ19leHRyYV9saWJwYXRoLgotCShhbGxfbGlicGF0aCwgRU1VTEFUSU9OX0xJQlBBVEgpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUudGd0IChwb3dlcnBjLSotbGludXgtZ251Kik6IERlZmluZSB0YXJnX2V4dHJhX2xpYnBhdGguCi0JKiBnZW5zY3JpcHRzLnNoIChMSUJfUEFUSCk6IERlZmluZSBpZiBlbXVsYXRpb24gaW4gRU1VTEFUSU9OX0xJQlBBVEguCi0KLU1vbiBKdW4gMTQgMTA6Mzg6MzYgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC50ZXhpbmZvOiBGaXggdXNlIG9mIEBpdGVtIHZzLiBAaXRlbXguCi0KLTE5OTktMDYtMTMgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JRnJvbSBUaG9tYXMgWmVua2VyIDx0aHpAbGVubmFydHotZWxlY3Ryb25pYy5kZT46Ci0JKiBsZGdyYW0ueSAoYXR0cmlidXRlc19vcHQpOiBVc2UgYXR0cmlidXRlc19saXN0IGluc3RlYWQgb2YgTkFNRS4KLQkoYXR0cmlidXRlc19saXN0LCBhdHRyaWJ1dGVzX3N0cmluZyk6IE5ldyBub250ZXJtaW5hbHMuCi0JKiBsZGxhbmcuYyAobGFuZ19zZXRfZmxhZ3MpOiBBZGQgaW52ZXJ0IHBhcmFtZXRlci4gIERvbid0IGhhbmRsZQotCSchJy4KLQkqIGxkbGFuZy5jIChsYW5nX3NldF9mbGFncyk6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlKTogRG9uJ3QgYWRkCi0JZW50cnlfc3ltYm9sIGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wgd2hlbiBkb2luZyBhIHJlbG9jYXRlYWJsZQotCWxpbmsuICBGcm9tIDxqZWZmZGJAZ29vZG5ldC5jb20+LgotCi0xOTk5LTA2LTEyICBEYXZpZCBPJ0JyaWVuICA8b2JyaWVuQGZyZWVic2Qub3JnPgotCi0JKiBjb25maWd1cmUudGd0OiAoaVszNDU2XTg2LSotZnJlZWJzZCopOiBOb3cgZGVmYXVsdHMgdG8gRUxGLgotCi0xOTk5LTA2LTA5ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAoaGVscCk6IFJlc3RvcmUgcHJldmlvdXMgZm9ybWF0IG9mIG91dHB1dC4KLQotMTk5OS0wNi0wNCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBJZiBjb21waWxpbmcgZm9yIGFybV9lcG9jX3BlIHJlbmFtZQotCWludGVyd29ya2luZyBmdW5jdGlvbnMgdG8gYXZvaWQgYSBuYW1lIHNwYWNlIGNsYXNoLgotCi0xOTk5LTA2LTAyICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IEFkZCBpbml0cCBzdXBwb3J0LgotCi0xOTk5LTA2LTAyICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IFJlbmFtZSBnbG9iYWwgYXJtIGludGVyd29ya2luZyBmdW5jdGlvbnMgdG8KLQlhdm9pZCBuYW1lIGNvbGxpc2lvbiB3aGVuIGFsbCB0YXJnZXRzIEJGRCBpcyBidWlsdC4KLQotMTk5OS0wNS0zMCAgQ29ydCBEb3VnYW4gIDxjb3J0QGF0dGlzLmNzLm5tdC5lZHU+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZWxmMzJwcGNsaW51eC5vLgotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWxpbnV4LWdudSk6IFVzZSBpdC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaDogTmV3IGZpbGUuCi0KLTE5OTktMDUtMjkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogQ2xhcmlmeSB0aGF0IG9wdGlvbnMgd2hpY2ggcmVmZXIgdG8gZmlsZXMKLQltdXN0IGJlIHByb3Blcmx5IG9yZGVyZWQuCi0KLTE5OTktMDUtMjkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9hcm1lbGYuZW0gKC4uLl9wYXJzZV9hcmdzKTogTmV3IGZ1bmN0aW9uOiBQYXJzZQotCWNvbW1hbmQgbGluZSBvcHRpb24uICBBY2NlcHQgYXJtLWVsZiBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uCi0JJy1wJyBvciAnLS1uby1waXBlbGluZS1rbm93bGVkZ2UnLgotCSguLi5fbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uOiBEZXNjcmliZSB0aGUgbmV3IGNvbW1hbmQgbGluZQotCW9wdGlvbi4KLQkoLi4uX2JlZm9yZV9hbGxvY2F0aW9uKTogUGFzcyB0aGUgdmFsdWUgb2YgdGhlIG5ldyB2YXJpYWJsZQotCW5vX3BpcGVsaW5lX2tub3dsZWRnZSB0byBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24uCi0JCi0JKiBlbXVsdGVtcC9hcm1lbGZfb2FiaS5lbSAoLi4uX2JlZm9yZV9hbGxvY2F0aW9uKTogUGFzcyB6ZXJvIGFzCi0JdGhlIHRoaXJkIHBhcmFtZXRlciB0byBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24uCi0KLTE5OTktMDUtMjggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChoZWxwKTogTWlub3IgZm9ybWF0dGluZyBjaGFuZ2VzLgotCi0xOTk5LTA1LTI4ICBNYXJ0aW4gRG9yZXkgIDxtZG9yZXlAbWFkZ2UuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpOTYwLSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL2VsZjMyX2k5NjAuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMl9pOTYwLm8uCi0JKGVlbGYzMl9pOTYwLmMpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLTE5OTktMDUtMjYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2ggKFRFTVBMQVRFX05BTUUpOiBTZXQgdG8gYXJtZWxmX29hYmkuIAotCi0xOTk5LTA1LTI0ICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtIChiZWZvcmVfcGFyc2UpOiBTZXQgY29uZmlnLmR5bmFtaWNfbGluayBhbmQKLSAJY29uZmlnLmhhc19zaGFyZWQuCi0JKiBlbXVscGFyYW1zL2FybWVsZi5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IExpa2V3aXNlLgotCi0xOTk5LTA0LTEzICBQaGlsaXAgQmx1bmRlbGwgIDxwaGlsYkBnbnUub3JnPgotCi0JKiBlbXVsdGVtcGwvYXJtZWxmLmVtOiBBZGQgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBzaGFyZWQgb2JqZWN0cwotCShjb3BpZWQgZnJvbSBlbGYzMi5lbSkuCi0KLVdlZCBNYXkgMTkgMTI6NDQ6MjYgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBSZW1vdmUgZWFybWxpbnV4Lm8gYW5kCi0JZWFybTI2bGludXgubywgYWRkIGVhcm1lbGZfbGludXgubyBhbmQgZWFybWVsZl9saW51eDI2Lm8uCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLTE5OTktMDUtMTYgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgotCShURU1QTEFURV9OQU1FKTogRGVmaW5lLgotCi1UaHUgTWF5IDEzIDA5OjQ4OjA5IDE5OTkgIEpvZWwgU2hlcnJpbGwgKGpvZWxAT0FSY29ycC5jb20pCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKGkzODYtKi1ydGVtc2VsZiosIHNoLSotcnRlbXNlbGYqKTogTmV3IHRhcmdldHMuCi0JKG1pcHMqZWwtKi1ydGVtcyosIHBvd2VycGNsZS0qLXJ0ZW1zKik6IE5ldyB0YXJnZXRzLgotCi0xOTk5LTA1LTEwICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFNwZWNpZnkgdGhlIG91dHB1dCBhcmNoLCB3aGljaCBJYW4gc2F5cyBpcwotCXRoZSBSaWdodCBUaGluZyB0byBkby4KLQotCSogZW11bHRlbXBsL3BlLmVtOiB2YXJpb3VzIGNoYW5nZXMgdG8gcGFyYW1ldGVyaXplIHRoZQotCXRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4KLQkoZ2xkX2kzODZwZV9hZnRlcl9vcGVuKTogRGV0ZWN0IGFuZCBmaXggTVMgaW1wb3J0IGxpYnJhcmllcwotCWJ5IHJlbmFtaW5nIHRoZSBtZW1iZXIgb2JqZWN0cyAod2hpY2ggYXJlIGFsbCBuYW1lZCB0aGUgc2FtZSkuCi0KLQkqIHBlLWRsbC5jOiB2YXJpb3VzIGNoYW5nZXMgdG8gcGFyYW1ldGVyaXplIHRoZSB0YXJnZXQtc3BlY2lmaWMKLQlpbmZvcm1hdGlvbi4KLQkoZ2VuZXJhdGVfcmVsb2MpOiBzdXBwb3J0IHJlbG9jcyBtb3JlIGdlbmVyaWNhbGx5IHRvIGFsbG93IGZvcgotCWV4cGFuc2lvbi4KLQkocGVfZXhlX2J1aWxkX3NlY3Rpb25zKTogbmV3OyB1c2VkIHRvIGFkZCAucmVsb2NzIHRvIC5leGVzCi0JKHBlX2V4ZV9maWxsX3NlY3Rpb25zKTogZGl0dG8KLQotMTk5OS0wNS0xMCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOgotCUNoZWNrIGZvciBUQVJHRVRfSVNfYXJtX2Vwb2NfcGUuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCi0xOTk5LTA1LTEyICBBbnRob255IEdyZWVuICA8Z3JlZW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdhbGtfd2lsZCwgd2Fsa193aWxkX2ZpbGUsIHdhbGtfd2lsZF9zZWN0aW9uLAotCW91dHB1dF9zZWN0aW9uX2NhbGxiYWNrLCBnY19zZWN0aW9uX2NhbGxiYWNrKTogTmV3IGZ1bmN0aW9ucyBmb3IKLQlnZW5lcmljIHNlY3Rpb24gd2Fsa3MuCi0JKHdpbGQsIGxhbmdfZ2Nfd2lsZCk6IFVzZSB3YWxrX3dpbGQuCi0JKHdpbGRfZmlsZSwgbGFuZ19nY193aWxkX2ZpbGUpOiBEZWxldGVkLiBDb21tb24gbG9naWMgbW92ZWQgdG8KLQl3YWxrX3dpbGRfZmlsZS4KLQkod2lsZF9zZWN0aW9uLCBsYW5nX2djX3dpbGRfc2VjdGlvbik6IERlbGV0ZWQuIENvbW1vbiBsb2dpYyBtb3ZlZAotCXRvIHdhbGtfZmlsZF9zZWN0aW9uLiAgVW5pcXVlIGxvZ2ljIG1vdmVkIGludG8gY2FsbGJhY2tzCi0Jb3V0cHV0X3NlY3Rpb25fY2FsbGJhY2sgYW5kIGdjX3NlY3Rpb25fY2FsbGJhY2suCi0KLTE5OTktMDQtMjYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBVcGRhdGVkIGZvciBuZXcgdmVyc2lvbiBvZiBsaWJ0b29sLgotCi0xOTk5LTA0LTEyICBQaGlsaXAgQmx1bmRlbGwgIDxwYkBuZXh1cy5jby51az4KLQotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2g6IE5ldyBmaWxlLiAgU3VwcG9ydCBmb3IgQVJNIAotCUdOVS9MaW51eCBFTEYgQUJJLgotCSogZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaDogTmV3IGZpbGUuIEFQQ1MtMjYgdmVyc2lvbiBvZiBhYm92ZS4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEZvciBhcm0qLSotbGludXgtZ251Kiwgc2V0IGRlZmF1bHQgZW11bGF0aW9uIHRvCi0JYGFybWVsZl9saW51eCcsIGFuZCBhbHNvIGluY2x1ZGUgYGFybWVsZl9saW51eDI2JyBhbmQgYGFybWVsZicuCi0JKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGVzIHRvIG1ha2UgZWFybWxpbnV4LmMgYW5kIGVhcm1saW51eDI2LmMuCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhcm1saW51eC5vIGFuZCBlYXJtbGludXgyNi5vLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbGZfaTM4Nl9iZS5vLgotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotYmVvcyopOiBVc2UgaXQuCi0JKiBlbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW4gKGVudmlyb24pOiBEZXRlY3QgZGVjbGFyYXRpb24uCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IGRlY2xhcmUgZW52aXJvbi4KLQkqIHN5c2RlcC5oIChlbnZpcm9uKTogRGVjbGFyZSBpZiBuZWVkZWQuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogUmVidWlsZC4KLQotMTk5OS0wNC0xMSAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyk6IE5ldy4KLQkodmVyc19kZWZucyk6IEFjY2VwdCBgZXh0ZXJuICJsYW5nIiB7IH0nIHN5bnRheC4KLQkqIGxkbGV4LmwgKHZlcnNfbm9kZV9uZXN0aW5nKTogTmV3LgotCShWX0lERU5USUZJRVIpOiBBY2NlcHQgLiBhbmQgJCBpbiBzeW1ib2xzLgotCShWRVJTX05PREUpOiBBY2NlcHQgYGV4dGVybiAibGFuZyIgeyB9JyB0b2tlbnMuICBOZXN0IFZFUlNfTk9ERSBzdGF0ZXMuCi0JKiBsZGxhbmcuYyAobGFuZ19uZXdfdmVyc19yZWdleCk6IE5ldyBgbGFuZycgYXJndW1lbnQuICBVcGRhdGUgY2FsbGVycy4KLQkobGFuZ192ZXJzX21hdGNoX2xhbmdfYyk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ192ZXJzX21hdGNoX2xhbmdfY3BsdXNwbHVzKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19qYXZhKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX2RvX3ZlcnNpb25fZXhwb3J0c19zZWN0aW9uKTogRml4IGl0ZXJhdGlvbi4gIERvbid0IGZyZWUKLQlzZWN0aW9uIGNvbnRlbnRzLCBhcyBpdCBpcyBzdGlsbCBpbiB1c2UgYnkgdGhlIHBhdHRlcm5zLgotCi0xOTk5LTA0LTEwICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXQgbGlua19pbmZvLm5vX3VuZGVmaW5lZC4KLQkqIGxleHN1cC5jOiBBZGQgY29tbWFuZC1saW5lIG9wdGlvbiAtLW5vLXVuZGVmaW5lZC4KLQotMTk5OS0wNC0wNiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLmggKExDX01FU1NBR0VTKTogTmV2ZXIgZGVmaW5lLgotCSogbGRtYWluLmMgKG1haW4pOiBEb24ndCBwYXNzIExDX01FU1NBR0VTIHRvIHNldGxvY2FsZSBpZiB0aGUKLQlzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIGl0LgotCi0xOTk5LTA0LTA2ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxkbWFpbi5oIChkZW1hbmdsaW5nKTogRGVjbGFyZS4KLQkqIGxkbWFpbi5jIChkZW1hbmdsaW5nKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkobWFpbik6IEluaXRpYWxpemUgZGVtYW5nbGluZy4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBEb24ndCBkZW1hbmdsZSBzeW1ib2wgaWYgISBkZW1hbmdsaW5nLgotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMsIHBhcnNlX2FyZ3MpOiBIYW5kbGUgLS1kZW1hbmdsZSBhbmQKLQktLW5vLWRlbWFuZ2xlLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS1kZW1hbmdsZS8tLW5vLWRlbWFuZ2xlLgotCi0JKiBsZGxleC5sIChWX0lERU5USUZJRVIpOiBBbGxvdyAnLicgaW4gc3ltYm9sLgotCi0xOTk5LTA0LTA1ICBDaHJpcyBUb3JlayAgPHRvcmVrQEJTREkuQ09NPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBDaGVjayB0aGF0Ci0JYSBzaGFyZWQgbGlicmFyeSByZWFsbHkgZXhpc3RzLCBhdm9pZGluZyBicm9rZW4gc3ltbGlua3MuCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9maWxlKTogR2VuZXJhdGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBpZgotCXdlIGNhbid0IGZpbmQgYSAtbCBmaWxlLgotCi0xOTk5LTA0LTA1ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaTM4Ni0qLXBlKTogYWRkIHRhcmdfZXh0cmFfb2ZpbGVzIGZvciBvdGhlciBQRQotCXRhcmdldHMgKGkzODYtcGUgYW5kIGkzODYtd2lubnQpCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBkZWZmaWxlcC55OiBJbmNsdWRlICJzeXNkZXAuaCIgYW5kICJsZG1pc2MuaCIuCi0JKGRlZl9maWxlX2FkZF9kaXJlY3RpdmUpOiBDaGFuZ2UgcmV0dXJuIHR5cGUgdG8gdm9pZC4gIFJlbW92ZQotCXVudXNlZCBsb2NhbHMgc2hfcmVzZXJ2ZSwgc2hfY29tbWl0LCBhbmQgai4KLQkoZGVmX3VuZ2V0Yyk6IEFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KLQkoZGVmX2xleCk6IENvcnJlY3QgcGFyZW50aGVzaXphdGlvbiBvZiB8fCB3aXRoaW4gJiYuCi0JKiBkZWZmaWxlLmggKGRlZl9maWxlX2FkZF9kaXJlY3RpdmUpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBwZS1kbGwuYzogSW5jbHVkZSA8dGltZS5oPiwgPGN0eXBlLmg+LCBhbmQgImxkZW11bC5oIi4KLQkoZ2VuZXJhdGVfZWRhdGEpOiBSZW1vdmUgdW51c2VkIGxvY2FsIGkuCi0JKHF1b3RlcHV0KTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkocGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlKTogRml4IHR5cGUgaW4gZm9ybWF0IHN0cmluZy4KLQkocXVpY2tfc3ltYm9sKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBibGhlLgotCShwZV9kbGxfZ2VuZXJhdGVfaW1wbGliKTogQWRkIGNhc3QgdG8gYXZvaWQgd2FybmluZy4KLQkocGVfcHJvY2Vzc19pbXBvcnRfZGVmcyk6IFJlbW92ZSB1bnVzZWQgbG9jYWxzIGFyX2hlYWQsIGFyX3RhaWwsCi0JYW5kIG4uCi0JKHBlX2FzMTYpOiBDb21tZW50IG91dC4KLQotMTk5OS0wNC0wNCAgRG9uIEJvd21hbiA8ZG9uQHBpeHNjaS5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBtaXBzKi0qLXZ4d29ya3MqIHRhcmdldC4KLQotMTk5OS0wMy0zMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhcm1fZXBvY19wZS5vCi0JQWRkIGJ1aWxkIHJ1bGUgYW5kIGRlcGVuZGVuY2llcyBmb3IgZWFybV9lcG9jX3BlLmMuCi0KLQkqIGVtdWxwYXJhbXMvYXJtX2Vwb2NfcGUuc2g6IE5ldyBmaWxlLgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgJ3RhcmdfZXh0cmFfb2ZpbGVzJyBmb3IgQVJNIGJhc2VkIFBFCi0JdGFyZ2V0cy4gCi0KLTE5OTktMDMtMzEgIFBoaWxpcCBCbHVuZGVsbCAgPHBiQG5leHVzLmNvLnVrPgotCi0JKiBjb25maWd1cmUudGd0OiBNYXRjaCBgYXJtKi0qLWxpbnV4LWdudSonIG5vdAotIAlgYXJtdiotKi1saW51eC1nbnUnLgotCi0xOTk5LTAzLTI2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IHRoZSAuZWhfZnJhbWUgYW5kIC5nY2NfZXhjZXB0X3RhYmxlCi0Jc2VjdGlvbnMgaW4gdGhlIGRhdGEgc2VnbWVudC4KLQotRnJpIE1hciAyNiAxMjowNTo1MSAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAod2lsZGNhcmRfc3BlYyk6IEFkZCBleGNsdWRlX25hbWUuCi0gICAgICAgICogbGRncmFtLnkgKEVYQ0xVREVfRklMRSk6IE5ldyB0b2tlbi4KLQkod2lsZGNhcmRfc3BlYyk6IFNldCBleGNsdWRlX25hbWUuCi0JKGZpbGVfTkFNRV9saXN0KTogUmVjb2duaXplIEVYQ0xVREVfRklMRS4KLSAgICAgICAgKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogQ2hlY2sgZm9yIGV4Y2x1ZGVkIGZpbGVzLgotCShwcmludF93aWxkX3N0YXRlbWVudCk6IFByaW50IGV4Y2x1ZGVkIGZpbGVzLgotCShsYW5nX2FkZF93aWxkKTogTmV3IGFyZ3VtZW50IGV4Y2x1ZGVfZmlsZW5hbWUuCi0JU2V0IGV4Y2x1ZGVfZmlsZW5hbWUuCi0JKiBsZGxhbmcuaCAobGFuZ193aWxkX3N0YXRlbWVudF90eXBlKTogIEFkZCBleGNsdWRlX2ZpbGVuYW1lLgotCSogbGRsZXgubDogTmV3IHRva2VuIEVYQ0xVREVfRklMRS4KLQkqIG1yaS5jIChtcmlfZHJhd190cmVlKTogIEFkZCBhcmd1bWVudCB0byBsYW5nX2FkZF93aWxkLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjIChDVE9SLCBEVE9SKTogIEV4Y2x1ZGUgY3J0ZW5kLm8gZnJvbSBjdG9yIHdpbGRjYXJkLgotCVJlb3JkZXIgc29ydGVkIGFuZCB1bnNvcnRlZCBjdG9ycy4KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2MgKENUT1IsIERUT1IpOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2MgKENUT1IsIERUT1IpOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoQ1RPUiwgRFRPUik6IExpa2V3aXNlLgotCQotMTk5OS0wMy0yNiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZ2Nfc2VjdGlvbnMpOiBJZiBlbnRyeV9zeW1ib2wgaXMgbm90IGRlZmluZWQsCi0JZGVmYXVsdCB0byAic3RhcnQiLgotCi0xOTk5LTAzLTAzICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBleHBsaWNpdCBwbGFjZW1lbnRzIGZvciB0aGUgLmVoX2ZyYW1lCi0JYW5kIC5nY2NfZXhjZXB0X3RhYmxlIHNlY3Rpb25zLiAKLQotV2VkIE1hciAgMyAwOToxMzozNCAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNsbT4KLSAKLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFJlbW92ZSAuZW5kLmN0b3JzIGFuZCAuZW5kLmR0b3JzCi0gICAgICAgIHNlY3Rpb25zLiAgUmVvcmRlciAuY3RvcnMgc2VjdGlvbiBlbnRyaWVzLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IExpa2V3aXNlLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2M6IExpa2V3aXNlLgotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLTE5OTktMDItMjYgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IFdyb25nIGVycm9yIG1zZyBmb3IgLXIgYW5kIC0tbXBjODYwYzAuCi0KLTE5OTktMDItMjUgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKTogUmVtb3ZlIGV4dHJhbmVvdXMKLQliYWNrc2xhc2guIAotCi1UaHUgRmViIDI1IDE1OjA3OjI0IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IERvbid0IGdhdGhlciAuY3RvciBhbmQgLmR0b3Igc2VjdGlvbnMKLSAgICAgICAgZm9yIHJlbG9jYXRlYWJsZSBsaW5rcy4KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotICAgICAgICAKLTE5OTktMDItMjIgIEppbSBMZW1rZSAgPGpsZW1rZUBjeWdudXMuY29tPgotCi0JKiBsZGludC50ZXhpbmZvOiByZW1vdmUgZXh0cmFuZW91cyByaWdodCBicmFjZS4KLQkqIGxkbWFpbi5jIChtYWluKTogaW5pdGlhbGl6ZSBhbmQgY2hlY2sgb3B0aW9uICJtcGM4NjBjMCIuCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucywgcGFyc2VfYXJncyk6IGFkZCBvcHRpb24gIm1wYzg2MGMwIi4KLQotV2VkIEZlYiAxNyAxMjoxMDowNiAxOTk5ICBTdGFuIENveCAgPHNjb3hAY3lnbnVzLmNvbT4KLQotCSogbXB3LWVsZm1pcHMuYyAoZ2xkZWxmMzJlYm1pcF9iZWZvcmVfYWxsb2NhdGlvbik6IFJlbW92ZSBzcGVjaWFsCi0JLnJlZ2luZm8gc2VjdGlvbiBoYW5kbGluZy4gCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggKElOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMpOiBSZW1vdmVkCi0JKiBlbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggKElOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlMpOiBSZW1vdmVkCi0KLTE5OTktMDItMTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlQYXRjaCBmcm9tOiBTY290dCBCYW1icm91Z2ggPHNjb3R0YkBjb3JlbGNvbXB1dGVyLmNvbT4KLQkKLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZGVkIGFybXYqLSotbGludXgtZ251IHRvICR0YXJnX2VtdWwKLQlyZWNvZ25pdGlvbi4gCi0KLVdlZCBGZWIgMTcgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotIAotICAgICAgICAqIGVtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbQotICAgICAgICAoYmZkX2VsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMsCi0gICAgICAgIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nLAotICAgICAgICBiZmRfZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24pOiBEZWZpbmUgdGhlbSB0byB1c2UgdGhlCi0gICAgICAgIG9sZCBBQkkgdmVyc2lvbnMgb2YgdGhlIGZ1bmN0aW9ucy4KLQotVHVlIEZlYiAxNiAxNjo0ODoxOSAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEFDX1BSRVJFUSB0byAyLjEzLiAgQ2hhbmdlIEFNX1BST0dfSU5TVEFMTAotCXRvIEFDX1BST0dfSU5TVEFMTC4gIENoYW5nZSBBTV9FWEVFWFQgdG8gQUNfRVhFRVhULgotCSogTWFrZWZpbGUuYW0gKGVhcm1lbGZfb2FiaS5jKTogQ2hhbmdlcyBzcGFjZXMgdG8gdGFiLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogYWNsb2NhbC5tNDogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViIDE1IDE4OjIxOjQ4IDE5OTkgIFZsYWRpbWlyIE4uIE1ha2Fyb3YgIDx2bWFrYXJvdkBjeWdudXMuY29tPgotCi0JKiBsZGV4cC5oIChzdHJ1Y3QgZXRyZWVfdmFsdWVfdHlwZSk6IENoYW5nZSB2YWxpZCBvbnRvIHZhbGlkX3AuCi0KLQkqIGxkZXhwLmMgKG5ld19hYnMpOiBEaXR0by4KLQkobmV3X3JlbCwgbmV3X3JlbF9mcm9tX3NlY3Rpb24sIGZvbGRfYmluYXJ5LCBpbnZhbGlkLCBmb2xkX25hbWUsCi0gCWV4cF9mb2xkX3RyZWUsIGV4cF9iaW5vcCwgZXhwX3RyaW5vcCwgc3RhdF9hbGxvYywKLSAJZXhwX2dldF9hYnNfaW50KTogRGl0dG8KLQotCSogbGRsYW5nLmMgKHByaW50X2Fzc2lnbm1lbnQsIGxhbmdfc2l6ZV9zZWN0aW9ucywKLQlsYW5nX2RvX2Fzc2lnbm1lbnRzKTogRGl0dG8uCi0JCi0xOTk5LTAyLTExICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3Nlcyk6IE5ldyBmdW5jdGlvbjogQ2hlY2sKLQlhZGRyZXNzZXMgYXNzaWduZWQgdG8gc2VjdGlvbiBmb3Igb3ZlcmxhcHMuCi0JKGxhbmdfcHJvY2Vzcyk6IENhbGwgbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyBpZiBzdWl0YWJsZS4KLQotCSogbGQuaDogQWRkIG5ldyBib29sZWFuIGZpZWxkIHRvIGFyZ3NfdHlwZSBzdHJ1Y3R1cmU6Ci0JJ2NoZWNrX3NlY3Rpb25fYWRkcmVzc2VzJy4KLQotCSogbGRtYWluLmM6IEluaXRpYWxpc2UgY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgZmllbGQgdG8gdHJ1ZS4KLQotCSogbGV4c3VwLmM6IEFkZCBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgJy0tbm8tY2hlY2stc2VjdGlvbnMnIGFuZAotCSctLWNoZWNrLXNlY3Rpb25zJy4KLQotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zICctLWNoZWNrLXNlY3Rpb25zJwotCWFuZCAnLS1uby1jaGVjay1zZWN0aW9ucycuCi0KLTE5OTktMDItMDggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzdXBwb3J0IGZvciBTdHJvbmdBUk0gdGFyZ2V0LgotCi1XZWQgRmViICAzIDE5OjQxOjAxIDE5OTkgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogSnVzdCBzZXQgU0VDX0tFRVAgb25jZS4gIENoZWNrIGZvcgotCWFuIG93bmVyIG9mIGEgc2VjdGlvbiBiZWZvcmUgdXNpbmcgaXQgdG8gbG9vayB1cCBhIHJlbG9jIHR5cGUuCi0JRG9uJ3Qgc2V0IFNFQ19LRUVQIGZvciB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQotTW9uIEZlYiAgMSAxMTozOTo0NiAxOTk5ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIE1ha2VmaWxlLmFtIChlYXJtZWxmX29hYmkubyk6ICBOZXcuCi0gICAgICAgICogTWFrZWZpbGUuaW46ICBSZWdlbmVyYXRlLgotICAgICAgICAqIGNvbmZpZ3VyZS50Z3QgKGFybS0qLW9hYmkpOiAgTmV3LgotICAgICAgICAodGh1bWItKi1vYWJpKTogIE5ldy4KLSAgICAgICAgKiBlbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoOiAgTmV3LgotICAgICAgICAqIGVtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbTogIE5ldy4KLQotMTk5OS0wMS0zMSAxNzo1NzozMSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLWZsZWFkaW5nLXVuZGVyc2NvcmVzCi0Jc3dpdGNoIGluIGFsbCBsaW5rZXIgZ2VuZXJhdGVkIHN5bWJvbHMuCi0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGN7LGxlfSotKi12eHdvcmtzKTogQWRkIGFzIGFsaWFzZXMgZm9yCi0JcG93ZXJwY3ssbGV9LSotZWFiaS4KLQotV2VkIEphbiAyMCAxNzowMTo0OCAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLXNvbGFyaXMyKik6IE5ldyB0YXJnZXQuICBGcm9tIFBhdmVsCi0JUm9za2luIDxwYXZlbF9yb3NraW5AZ2VvY2l0aWVzLmNvbT4uCi0KLTE5OTktMDEtMTkgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDb3VudCBsb2FkYWJsZSBzZWN0aW9ucyBhcwotICAgICAgICAgIGNvbnRyaWJ1dGluZyB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBzZWdtZW50LgotCi0xOTk5LTAxLTE1ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogT25seSB1cGRhdGUgdGhlIGN1cnJlbnQKLSAgICAgICAgICBhZGRyZXNzIG9mIGEgcmVnaW9uIGlmIHRoZSBzZWN0aW9uIGp1c3QgcGxhY2VkIGludG8gaXQgaXMgYW4KLSAgICAgICAgICBhbGxvY2F0ZWQgc2VjdGlvbi4KLQotMTk5OS0wMS0xMiAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IFJlcGxhY2UgZWZyMzAubyB3aXRoIGVlbGYzMmZyMzAuby4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCi0JKiBjb25maWd1cmUudGd0OiBSZXBsYWNlIGZyMzAgd2l0aCBlbGYzMmZyMzAuCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJmcjMwLnNoOiBOZXcgZmlsZTogUmVwbGFjZXMgZnIzMC5zaCwgYW5kIHVzZXMKLQlnZW5lcmljIGVsZi5zYyBzY3JpcHQuICBBbHNvIHJlcGxhY2VzIHRoZSAuc3RhY2sgc2VjdGlvbiB3aXRoIGEKLQl1c2VyIGRlZmluYWJsZSBzeW1ib2wgX19zdGFjay4KLQotMTk5OS0wMS0xMSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZnIzMC5zYzogRmlsbCAuaW5pdCBhbmQgLmZpbmkgc2VjdGlvbnMgd2l0aCBOT1AKLQlwYXR0ZXJuLiAKLQotMTk5OS0wMS0wMyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjaGVjay1ERUpBR05VKTogTm8gbG9uZ2VyIHByb3ZpZGUgSE9TVElOR19FTVUsCi0JSE9TVElOR19DUlQwLCBIT1NUSU5HX0xJQlM7IHRoZSB0ZXN0IHN1aXRlIGNhbiBleHRyYWN0IHRoZW0gZnJvbQotCWNvbmZpZ3VyZS5ob3N0IGFuZCBjb25maWd1cmUudGd0IG5vdy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk4LTEyLTI3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MsIGNhc2UgT1BUSU9OX1JQQVRIKTogQXZvaWQgYWRkaW5nIGR1cGxpY2F0ZQotCWVsZW1lbnRzIHRvIHJwYXRoLgotCi1UaHUgRGVjIDEwIDExOjEyOjI4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIHBlLWRsbC5vIGFuZCBkZWZmaWxlcC5vLgotCShBTExfRU1VTF9FWFRSQV9PRklMRVMpOiBOZXcgdmFyaWFibGUuICBQdXQgdGhlbSBoZXJlIGluc3RlYWQuCi0JKiBjb25maWd1cmUuaW46IFNldCBFTVVMX0VYVFJBX09GSUxFUyB0byAkKEFMTF9FTVVMX0VYVFJBX09GSUxFUykKLQlpZiBjb25maWd1cmluZyB3aXRoIGFsbCB0YXJnZXRzLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZC4KLQotCSogZW11bHRlbXBsL3BlLmVtIChwZV9lbmFibGVfc3RkY2FsbF9maXh1cCk6IE1ha2Ugc3RhdGljLgotCShwZV9kbGxfZG9fZGVmYXVsdF9leGNsdWRlcyk6IFJlbW92ZWQsIHVudXNlZC4KLQkocGVfZGVmX2ZpbGUsIHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZywgcGVfZGxsX2tpbGxfYXRzLAotCXBlX2RsbF9zdGRjYWxsX2FsaWFzZXMpOiBEb24ndCBpbml0aWFsaXplIHRoZW0sIHRoaXMgZmlsZSBtYXkgYmUKLQljb21waWxlZCBtb3JlIHRoYW4gb25jZS4KLQkqIHBlLWRsbC5jIChwZV9kZWZfZmlsZSwgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nLAotCXBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzLCBwZV9kbGxfa2lsbF9hdHMsCi0JcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyk6IERlZmluZSBhbmQgaW5pdGlhbGl6ZSB0aGVtIGhlcmUgaW5zdGVhZC4KLQkoZ2VuZXJhdGVfcmVsb2MpOiBGaXggYWxsb2NhdGlvbiBvZiByZWxvY19hZGRyZXNzZXMgYXJyYXkgdG8gdXNlCi0JYmZkX3ZtYSBpbnN0ZWFkIG9mIHVuc2lnbmVkIGxvbmcuICBGaXggZWxlbWVudCBzaXplIGluIHFzb3J0IGNhbGwuCi0JKHJlbG9jX3NvcnQpOiBDb21wYXJlIHBvaW50ZXJzIHRvIGJmZF92bWEgaW5zdGVhZCBvZiB1bnNpZ25lZAotCWxvbmcuCi0KLU1vbiBEZWMgIDcgMjE6MTA6MDkgMTk5OCAgSi5KLiB2YW4gZGVyIEhlaWpkZW4gIDxqLmoudmFuZGVyaGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLW1pbmd3MzIqKTogQWRkIGN5Z3dpbiB0YXJnZXQgc3BlY2lmaWMKLQlmaWxlcy4KLQotU3VuIERlYyAgNiAxNjozMzozMyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OCotKi1nbnUqKTogTmV3IHRhcmdldC4gIEZyb20gQXltZXJpYyBWaW5jZW50Ci0JPGF5bWVyaWMudmluY2VudEBlbWkudS1ib3JkZWF1eC5mcj4uCi0KLTE5OTgtMTItMDQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZnIzMC5zaCAoVEVYVF9TVEFSVF9BRERSKTogQ2hhbmdlIFRFWFRfU1RBUlRfQUREUgotCWZyb20gMHgxMDAwMDAgdG8gMHgxMDAwMCBzbyB0aGF0IGl0IGZpdHMgaW4gMjAgYml0cy4KLQotU2F0IE5vdiAyOCAyMjozMjoyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5oIChsZGVtdWxfcmVjb2duaXplZF9maWxlKTogRGVjbGFyZS4KLQotU2F0IE5vdiAyOCAyMjozMDo1NSAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5jcy51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF93aWxkKTogRG9uJ3QgcHJldGVuZCB0aGF0IHRoZXJlIGlzIGFuIGlucHV0Ci0JZmlsZSBpZiB0aGUgZmlsZW5hbWUgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuLgotCi0xOTk4LTExLTI1ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmggKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IG5ldyBob29rICJyZWNvZ25pemVkX2ZpbGUiCi0JKiBsZGVtdWwuYyAobGRlbXVsX3JlY29nbml6ZWRfZmlsZSk6IG5ldyBmdW5jdGlvbiwgbmV3IGhvb2sKLQkqIGxkaW50LnRleGluZm86IGRvY3VtZW50IG5ldyBob29rLgotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IGNhbGwgcmVjb2duaXplZF9ob29rIGZvciBhbGwgb2JqZWN0cyB3ZQotCWRvIHJlY29nbml6ZSwgaW4gY2FzZSB0aGUgZW11bGF0aW9uIG5lZWRzIHRvIGhhbmRsZSB0aGVtCi0Jc3BlY2lhbGx5LiAgUEUgRExMcyB1c2UgdGhpcy4KLQkqIHBlLWRsbC5jIChwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiB0YWtlIG91dCBoYWNrIGFuZCBkZWJ1ZwotCXByaW50ZnMKLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZfcmVjb2duaXplZF9maWxlKTogbmV3IGZ1bmN0aW9uCi0JKGdsZF9pNDg2X3VucmVjb2duaXplZF9maWxlKTogdGFrZSBvdXQgaGFjawotCi0xOTk4LTExLTIzICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmMgKGZpbGxfZWRhdGEpOiBmaWxsIGluIHRpbWVzdGFtcAotCShtYWtlX2hlYWQpOiBuYW1lIG9iamVjdCBmaWxlcyBzZXF1ZW50aWFsbHkgdG8gZW5zdXJlCi0JdGhleSBsaW5rIGluIHRoZSByaWdodCBvcmRlci4KLQkobWFrZV90YWlsKTogc2FtZSBoZXJlCi0JKHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMpOiB1c2Ugc2VxdWVudGlhbCBuYW1lcyBmb3IgYmZkcyB0byBlbnN1cmUKLQlwcm9wZXIgbGluayBvcmRlci4KLQkocGVfaW1wbGllZF9pbXBvcnRfZGxsKTogbmV3IGZ1bmN0aW9uOyBoYW5kbGVzIGxpbmtpbmcgZGlyZWN0bHkKLQlhZ2FpbnN0IERMTHMgYnkgc2ltdWxhdGluZyBJTVBPUlRTIGRpcmVjdGl2ZXMuICAqIGVtdWx0ZW1wbC9wZS5lbQotCShnbGRfaTM4NnBlX2JlZm9yZV9wYXJzZSk6IGhhY2sgYmZkIHRvIG5vdCByZWNvZ25pemUgLmRsbCBmaWxlcwotCXZpYSBiZmRfcGVfZGxsX25vdF9yZWNvZ25pemVkX2hhY2sKLQotMTk5OC0xMS0yMyAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX2kzODZwZV9wYXJzZV9hcmdzKTogQ29uZGl0aW9uYWxpemUgY2FsbCB0bwotCXBlX2RsbF9hZGRfZXhjbHVkZXMKLQotTW9uIE5vdiAyMyAxNDozNjoxOCAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGFmdGVyX3BhcnNlKTogT25seSBjcmVhdGUgYW4gdW5kZWZpbmVkIGVudHJ5Ci0Jc3ltYm9sIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0KLTE5OTgtMTEtMjMgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2cGVfYWZ0ZXJfb3Blbik6IGNhbGwKLQlwZV9wcm9jZXNzX2ltcG9ydF9kZWZzCi0JKiBwZS1kbGwuYyAocGVfZGxsX2dlbmVyYXRlX2RlZl9maWxlKTogY2FsY3VsYXRlIEJBU0UgZnJvbQotCXBlX2RhdGEsIG9ubHkgcHJpbnQgaWYgYWN0dWFsbHkgc2V0LiAgUHJpbnQgdmVyc2lvbiBvbmx5IGlmCi0Jc2V0LgotCShzYXZlX3JlbG9jcyk6IHNhdmUgcmVsb2NzIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQuCi0JKG1ha2Vfb25lKTogc3VwcG9ydCBpbnRlcm5hbC9leHRlcm5hbCBkaWZmZXJlbnQgbmFtZXMuCi0JKHBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIpOiBzdXBwb3J0IG5ldyBtYWtlX29uZQotCShwZV9wcm9jZXNzX2ltcG9ydF9kZWZzKTogbmV3IGZ1bmN0aW9uOyBoYW5kbGVzIElNUE9SVAotCWRpcmVjdGl2ZXMgaW4gLmRlZiBmaWxlcy4KLQotRnJpIE5vdiAyMCAxMzowNjo0OSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQ29wZSB3aXRoIGVtcHR5IHN5bWJvbCBuYW1lcy4KLQotVGh1IE5vdiAxOSAxMzozMToxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogQWRkIHByb3Zpc2lvbiBvZiAnX2VuZCcgc3ltYm9sLgotCi1XZWQgTm92IDE4IDE4OjE4OjQzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IGNoYW5nZSByZWZzIGZyb20gY3lnd2luMzIqIHRvIGN5Z3dpbiouCi0JKiBhY2xvY2FsLm00OiByZWdlbmVyYXRlCi0JKiBjb25maWd1cmUuaW46IGRvbid0IG5lZWQgdG8gY2FsbCBBTV9DWUdXSU4zMi4KLQkqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1Nb24gTm92IDE2IDIyOjE0OjA3IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2X2ZpbmlzaCk6IGdlbmVyYXRlIGltcG9ydCBsaWJyYXJ5Ci0JKiBkZWZmaWxlLmg6IGFkZCBoaW50IG1lbWJlci4KLQkqIHBlLWRsbC5jIChwZV9kbGxfZ2VuZXJhdGVfaW1wbGliKTogTmV3IGZ1bmN0aW9uIHdpdGggaGVscGVyczsKLSAJZ2VuZXJhdGVzIHRoZSBpbXBvcnQgbGlicmFyeSBkaXJlY3RseSBmcm9tIHRoZSBleHBvcnQgdGFibGUuCi0JKGZpbGxfZWRhdGEpOiByZW1lbWJlciB0aGUgYWN0dWFsIGhpbnQgZm9yIHRoZSBpbXBvcnQgbGlicmFyeS4KLQotU2F0IE5vdiAxNCAxNDozNjoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLjE6IFNvbWUgY2xlYW51cHMgZnJvbSBOT0tVQkkgSGlyb3Rha2EgPGhub2t1YmlAeXl5Lm9yLmpwPi4KLQotVGh1IE5vdiAxMiAxOToyMTo1NyAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL2xkLnBvdDogUmVnZW5lcmF0ZWQuCi0JKiBwby9QT1RGSUxFUy5pbjogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQuCi0JKiBNYWtlZmlsZS5pbjogUmVnZW5lcmF0ZWQuCi0KLVdlZCBOb3YgMTEgMTg6MTA6MTUgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIHBlLWRsbC5jIChnZW5lcmF0ZV9yZWxvYyk6IGRvbid0IG91dHB1dCBQRSByZWxvY3MgZm9yIHNlY3Rpb25zCi0gCXRoYXQgd29uJ3QgYmUgbG9hZGVkLgotCi1XZWQgTm92IDExIDEzOjQ0OjU0IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAoZmlsbF9lZGF0YSk6IGRvbid0IHN0cmlwIHVuZGVyc2NvcmVzCi0KLVR1ZSBOb3YgMTAgMjE6Mjg6MTkgMTk5OCAgREogRGVsb3JpZSAgPGRqQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IGFkZGVkIGkzODZwZSBvcHRpb24gc3VtbWFyeQotCi1UdWUgTm92IDEwIDE3OjUzOjE3IDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYyAocHJvY2Vzc19kZWZfZmlsZSk6IHByb3Blcmx5IG5vdGUgdW5kZWZpbmVkIGV4cG9ydGVkCi0gCXN5bWJvbHMsIGNsZWFuIHVwIG9sZCBjb2RlLgotCShwZV9kbGxfZ2VuZXJhdGVfZGVmX2ZpbGUpOiBkb24ndCBjcmFzaCBpZiBwZV9kZWZfZmlsZSBpcyBOVUxMCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF9pMzg2X3BhcnNlX2FyZ3MpOiBhZGQKLSAJKGVuL2RpcylhYmxlLXN0ZGNhbGwtZml4dXBzCi0JKHBlX2ZpeHVwX3N0ZGNhbGxzKTogd2FybiBhYm91dCBzdGRjYWxsIGZpeHVwcwotCShnbGRfaTM4Nl91bnJlY29nbml6ZWRfZmlsZSk6IG1ha2UgZXhwb3J0ZWQgc3ltYm9scyB1bmRlZnMgc28gdGhhdAotIAlhcmNoaXZlIG1lbWJlcnMgZ2V0IHB1bGxlZCBpbgotCi1UdWUgTm92IDEwIDE0OjUwOjUxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogQWRkIEtFRVAgYXR0cmlidXRlIHRvIC5pbml0LAotICAgICAgICAuZmluaSwgLmR0b3JzIGFuZCAuY3RvcnMuICBBZGQgLmRhdGEgYW5kIC50ZXh0Ci0gICAgICAgIHdpbGRjYXJkcyB0byBzdXBwb3J0IHNlY3Rpb24gZ2FyYmFnZSBjb2xsZWN0aW9uLgotCi1Nb24gTm92ICA5IDIyOjUyOjUwIDE5OTggIERKIERlbG9yaWUgIDxkakBpbmR5LmRlbG9yaWUuY29tPgotCi0JKiBkZWZmaWxlcC55OiBwcm9wZXJseSBoYW5kbGUgcmVsb2NzIHdpdGggbXVsdGlwbGUgZGVmX2ZpbGVzLAotCWNhY2hlIGltcG9ydCBtb2R1bGUgbmFtZXMKLQotTW9uIE5vdiAgOSAyMjo0NDo1OCAxOTk4ICBESiBEZWxvcmllICA8ZGpAY3lnbnVzLmNvbT4KLQotCSogcGUtZGxsLmMgKHByb2Nlc3NfZGVmX2ZpbGUpOiBkb24ndCBhc3N1bWUgZXhwb3J0cyB3b24ndCBtb3ZlCi0JZHVyaW5nIGEgcmVhbGxvYwotCi1Nb24gTm92ICA5IDE2OjQxOjMwIDE5OTggIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBwZS1kbGwuYzogTmV3IGZpbGU7IGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCi0JKiBkZWZmaWxlLmg6IE5ldyBmaWxlOyBkaXJlY3Qgc3VwcG9ydCBmb3IgUEUgRExMcwotCSogZGVmZmlsZXAueTogTmV3IGZpbGU7IGRpcmVjdCBzdXBwb3J0IGZvciBQRSBETExzCi0JKiBlbXVsdGVtcGwvcGUuZW06IGFkZCBkaXJlY3Qgc3VwcG9ydCBmb3IgUEUgRExMcwotCSogY29uZmlndXJlLnRndDogYWxsb3cgdGFyZ2V0LXNwZWNpZmljIGV4dHJhIGZpbGVzCi0JKiBjb25maWd1cmUuaW46IGFsbG93IHRhcmdldC1zcGVjaWZpYyBleHRyYSBmaWxlcwotCSogbGRsYW5nLmMgKGxhbmdfYWRkX2Fzc2lnbm1lbnQpOiByZXR1cm4gdGhlIGFzc2lnbm1lbnQgc28gdGhhdAotIAlvbmUgY2FuIGNoYW5nZSB0aGUgdmFsdWUgbGF0ZXIgYmFzZWQgb24gdGhlIG9iamVjdCBmaWxlcyAocGUtZGxsCi0gCURFRiBmaWxlcyBkbyB0aGlzKQotCSogbGRpbnQudGV4aW5mbzogYWRkIHNlY3Rpb24gZm9yIGVtdWxhdGlvbiB3YWxrdGhyb3VnaAotCSogTWFrZWZpbGUuYW06IGFkZCBuZXcgZmlsZXMgYW5kIHRhcmdldC1zcGVjaWZpYyBleHRyYSBmaWxlcwotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfaTM4Nl9saXN0X29wdGlvbnMpOiBsaXN0IGRsbC1zcGVjaWZpYwotCW9wdGlvbnMuCi0JKiBwZS1kbGwuYyAocHJvY2Vzc19kZWZfZmlsZSk6IGF1dG8tZXhwb3J0IGV2ZXJ5dGhpbmcgaWYKLQlub3RoaW5nIGlzIG90aGVyd2lzZSBleHBvcnRlZC4KLQkKLVdlZCBOb3YgIDQgMTY6Mzk6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IEFkZCBzdXBwb3J0IGZvciBGUjMwIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogZW11bHBhcmFtcy9mcjMwLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXAvZnIzMC5zYzogTmV3IGZpbGUuCi0JCi1Nb24gTm92ICAyIDE0OjQ3OjE1IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbGRtYWluLmMgKG1haW4pOiAgRG9uJ3QgcmVwb3J0IGVycm9yIGZvciBkeW5hbWljIGxpbmtzIGFuZAotICAgICAgICAtLWdjLXNlY3Rpb25zLgotCi0xOTk4LTEwLTI2IDE2OjA1ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBDaGFuZ2UgdGV4dCBvZiAtTyB0byBPcHRpbWl6ZSBvdXRwdXQgZmlsZSIuCi0JKHBhcnNlX2FyZ3MpOiBTZXQgbGlua19pbmZvLm9wdGltaXplIGJhc2VkIG9uIC1PIGFyZ3VtZW50LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby5vcHRpbXplIHRvIGZhbHNlLgotCSogbGQudGV4aW5mbzogRGVzY3JpYmUgLU8gb3B0aW9uLgotCSogbGQuMTogTGlrZXdpc2UuCi0KLU1vbiBPY3QgMTIgMTQ6Mjk6NTYgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTW92ZSAuc2JzcyBhbmQgLnNjb21tb24gc2VjdGlvbnMgaW50byB0aGVpcgotCW93biBzZWdtZW50LCBzbyB0aGF0IHRoZXkgY2FuIGJlIG5leHQgdG8gdGhlIC5ic3Mgc2VjdGlvbiBhbmQgc28KLQlpbml0aWFsaXNlZCBieSB0aGUgc2FtZSBwaWVjZSBvZiBjb2RlLgotCi1GcmkgT2N0ICA5IDE1OjU5OjUyIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmLnNjOiAgTWVyZ2UgLnNkYXRhLiogZXRjIHNlY3Rpb25zLgotICAgICAgICAqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6ICBTZXQgU0VDX0tFRVAgZm9yCi0gICAgICAgIGN0b3Igc2VjdGlvbnMuCi0KLU1vbiBPY3QgIDUgMDk6NDA6NDMgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBsZG1haW4uYyAobWFpbik6ICBFcnJvciBpZiAtLWdjLXNlY3Rpb25zIGFuZAotICAgICAgICBkeWFubWljIGxpbmtpbmcuCi0gICAgICAgICogc2NyaXB0dGVtcGwvdjg1MC5zYzogIEFkZCBLRUVQIGF0dHJpYnV0ZSB0byAuaW5pdCwKLSAgICAgICAgLmZpbmksIC5kdG9ycyBhbmQgLmN0b3JzLiAgQWRkIC5kYXRhIGFuZCAudGV4dAotICAgICAgICB3aWxkY2FyZHMgdG8gc3VwcG9ydCBzZWN0aW9uIGdhcmJhZ2UgY29sbGVjdGlvbi4KLQotV2VkIFNlcCAzMCAxMToxOToxNSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBSZW5hbWUgLmNhbGxfdGFibGUgc2VjdGlvbiB0bwotCS5jYWxsX3RhYmxlX2RhdGEgYW5kIGNyZWF0ZSBhIG5ldyBzZWN0aW9uIGNhbGxlZAotCS5jYWxsX3RhYmxlX3RleHQuCi0KLVN1biBTZXAgMjAgMDA6NDM6MjYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBhbGlnbm1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgLmJzcwotCXNlY3Rpb24sIHNvIHRoYXQgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIG1lbXNpemUgb2YgdGhlIHNlZ21lbnQuCi0KLUZyaSBTZXAgMTggMTM6NDI6NDIgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZF9wbGFjZV9vcnBoYW4pOiBEb24ndCBwcm9jZXNzIGZvcgotICAgICAgICBzZWN0aW9ucyB3aXRoIFNFQ19FWENMVURFIGZsYWcuCi0KLUZyaSBTZXAgIDQgMDk6MjQ6MDIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMzB2ZWxmLnNoIChURVhUX1NJWkUpOiBJbmNyZWFzZWQgdG8gMjAwMEsuCi0JKERBVEFfU0laRSk6IEluY3JlYXNlZCB0byAyMDAwSy4KLQotVGh1IFNlcCAgMyAxNzozMDo1OCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFRFTVBMQVRFX05BTUUpOiBVc2UgZWxmMzIuCi0KLU1vbiBBdWcgMzEgMDE6MDY6MDAgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBNYWtlZmlsZS5hbTogIENoYW5nZSBhcm1lbGYuc2MgdG8gZWxmLnNjCi0gICAgICAgICogTWFrZWZpbGUuaW46ICBSZWdlbmVyYXRlLgotCi1Nb24gQXVnIDMxIDExOjEyOjA0IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHBhcmFtcy9hcm1lbGYuc2g6ICBDaGFuZ2UgU0NSSVBUX05BTUUgdG8KLSAgICAgICAgZWxmLiAgQ2hhbmdlIFRFWFRfU1RBUlRfQUREUiB0byAweDgwMDAuICBEZWZpbmUKLSAgICAgICAgT1RIRVJfVEVYVF9TRUNUSU9OUywgT1RIRVJfQlNTX1NZTUJPTFMgYW5kCi0gICAgICAgIE9USEVSX0JTU19FTkRfU1lNQk9MUy4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGYuc2M6ICBNb2RpZnkgdG8gdXNlCi0gICAgICAgIE9USEVSX0JTU19FTkRfU1lNQk9MUy4KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBSZW1vdmUgZmlsZS4KLQotVHVlIEF1ZyAxOCAxMjowNTozNCAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVtdWx0ZW1wbC9hcm1lbGYuZW0gKGdsZF9hcm1lbGZfYmVmb3JlX2FsbG9jYXRpb24pOgotICAgICAgICBBZGQgYmZkXyBwcmVmaXggdG8gZWxmMzJfYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSAgICAgICAgYW5kIGVsZjMyX2FybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMuCi0gICAgICAgIChnbGRfYXJtZWxmX2FmdGVyX29wZW4pOiBBZGQgYmZkXyBwcmVmaXggdG8KLSAgICAgICAgZWxmMzJfYXJtX2dldF9iZmRfZm9yX2ludGVyd29ya2luZy4KLQotRnJpIEF1ZyAxNCAxNTozNDoyOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBsZGdyYW0ueTogSW5jbHVkZSAibGRjdG9yLmgiLgotCShzdGF0ZW1lbnQpOiBBY2NlcHQgU09SVCBhcm91bmQgQ09OU1RSVUNUT1JTLgotCSogbGRjdG9yLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShjb25zdHJ1Y3RvcnNfc29ydGVkKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkoY3Rvcl9wcmlvLCBjdG9yX2NtcCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IFNvcnQgY29uc3RydWN0b3JzIGlmIHJlcXVlc3RlZC4KLQkqIGxkY3Rvci5oIChjb25zdHJ1Y3RvcnNfc29ydGVkKTogRGVjbGFyZS4KLQkqIGxkbGFuZy5jIChwcmludF9zdGF0ZW1lbnQpOiBQcmludCBzb3J0ZWQgQ09OU1RSVUNUT1JTCi0JY29ycmVjdGx5LgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgc29ydCBhcm91bmQgQ09OU1RSVUNUT1JTLgotCSogbGQudGV4aW5mbyAoT3V0cHV0IFNlY3Rpb24gS2V5d29yZHMpOiBEb2N1bWVudCBTT1JUCi0gCShDT05TVFJVQ1RPUlMpLgotCi1UaHUgQXVnIDEzIDEyOjIwOjM5IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgKiBlbXVscGFyYW1zL2FybWVsZi5zaDogIERlZmluZSBURU1QTEFURV9OQU1FIHRvIGFybWVsZi4KLSAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIEluY2x1ZGUgLmdsdWVfN3QgYW5kIC5nbHVlNwotICAgICAgIHNlY3Rpb25zLgotICAgICAgICogZW11bHRlbXBsL2FybWVsZi5lbTogTmV3IGZpbGUuCi0KLVRodSBBdWcgMTMgMTI6NTI6NDUgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBNYWtlZmlsZS5hbSAobGQuZHZpKTogVXNlICIgaW5zdGVhZCBvZiAnIGZvciBNQUtFSU5GTy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgQXVnIDExIDE2OjE3OjAxIDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogc2NyaXB0dGVtcGwvZWxmYXJtLnNjOiAgQ2hhbmdlIHRleHQgc3RhcnQgYWRkcmVzcwotICAgICAgICBiYWNrIHRvIHplcm8uCi0KLVR1ZSBBdWcgMTEgMTA6MDE6MTIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvbW4xMDIwMC5zaCAoTUFYX1BBR0VTSVpFKTogRGVmaW5lIHRvIDEuCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaCAoTUFYX1BBR0VTSVpFKTogRGVmaW5lIHRvIDEuCi0KLVN1biBBdWcgIDkgMjA6MzE6MjcgMTk5OCAgQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9lbGZhcm0uc2M6ICBTZXQgdGV4dCBzdGFydCBhZGRyZXNzIHRvCi0gICAgICAgIDB4ODAwMC4gIEFkZCBfX2Jzc19lbmQgZGVmaW5pdGlvbi4KLQotU2F0IEF1ZyAgMSAxMTo0NzozNyAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIHNjcmlwdHRlbXBsL2VsZmFybS5zYzogIE5ldyBmaWxlLgotICAgICAgICAqIGVtdWxwYXJhbXMvYXJtZWxmLnNoOiBTZXQgU0NSSVBUX05BTUUgdG8gZWxmYXJtLgotCi1GcmkgSnVsIDMxIDE1OjU2OjE2IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZW11bHBhcmFtcy9hcm1lbGYuc2g6IE5ldyBmaWxlLgotICAgICAgICAqIGNvbmZpZ3VyZS50Z3Q6ICBSZWNvZ25pemUgdGh1bWItZWxmIGFuZCBhcm0tZWxmLgotICAgICAgICAqIE1ha2VmaWxlLmFtIChlYXJtZWxmLm8pOiBOZXcuCi0gICAgICAgICogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBKdWwgMjQgMTI6MDA6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgcmVtb3ZlIHRoZSBmaWxlIGJlZm9yZQotCWNoZWNraW5nIHdoZXRoZXIgJChiaW5kaXIpID09ICQodG9vbGRpcikvYmluLiAgRnJvbSBNYWNpZWoKLQlXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUudGd0OiBSZWNvZ25pemUgaDhbMzVdMDAqLWNvZmYqIGFzIHdlbGwgYXMgLWhtcyouCi0KLVRodSBKdWwgMjMgMTE6MTU6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBJZiBBTElHTk1FTlQgaXMgZGVmaW5lZCwgdXNlIGl0IHRvIHNldAotCWFsaWdubWVudCBvZiBlbmQgc3ltYm9sLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoQUxJR05NRU5UKTogRGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCAoQUxJR05NRU5UKTogRGVmaW5lLgotCSogbGRpbnQudGV4aW5mbyAoZW11bGF0aW9uIHBhcmFtZXRlcnMpOiBEb2N1bWVudCBBTElHTk1FTlQuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIG1pc3NpbmcgYnJlYWsgc3RhdGVtZW50LgotCi0JKiBsZGxhbmcuYyAobGFuZ19nY19zZWN0aW9uc18xKTogQWRkIGRlZmF1bHQgY2FzZSB0byBzd2l0Y2ggdG8KLQlhdm9pZCB3YXJuaW5ncy4KLQotVHVlIEp1bCAxNCAxNTo0MjoxNyAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpPzg2LSotYmVvc3twZSxlbGYsfSopOiBSZWNvZ25pemUuCi0JKiBNYWtlZmlsZS5hbSAoZWkzODZiZW9zLm8pOiBOZXcuCi0JKiBlbXVscGFyYW1zL2kzODZiZW9zLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWx0ZW1wbC9iZW9zLmVtLCBzY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYzogTmV3IGZpbGUuCi0KLVR1ZSBKdWwgMTQgMTU6MzU6NDIgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmM6IE5ldyBvcHRpb24gLS12ZXJzaW9uLWV4cG9ydHMtc2VjdGlvbi4KLQkqIGxkLmggKHN0cnVjdCBhcmdzX3R5cGUpOiBBZGQgdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24uCi0JKiBsZGxhbmcuYyAobGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbik6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19wcm9jZXNzKTogQ2FsbCBpdC4KLQotTW9uIEp1bCAxMyAxMzoyMDoyMyAxOTk4ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0B0cmFuc21ldGEuY29tPgotCi0JKiBsZGxleC5sOiBBY2NlcHQgQVNTRVJULgotCSogbGRncmFtLnkgKGV4cCk6IEFkZCBBU1NFUlRfSyBjYXNlLgotCSogbGRleHAuaCAobm9kZV90eXBlKTogQWRkIGV0cmVlX2Fzc2VydCB0byBub2RlX2NsYXNzIGVudW0uCi0JKGV0cmVlX3R5cGUpOiBBZGQgYXNzZXJ0X3MgZmllbGQuCi0JKGV4cF9hc3NlcnQpOiBEZWNsYXJlLgotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IEhhbmRsZSBldHJlZV9hc3NlcnQuCi0JKGV4cF9hc3NlcnQpOiBOZXcgZnVuY3Rpb24uCi0JKGV4cF9wcmludF90cmVlKTogSGFuZGxlIGV0cmVlX2Fzc2VydC4KLQkqIGxkLnRleGluZm8gKE1pc2NlbGxhbmVvdXMgQ29tbWFuZHMpOiBEb2N1bWVudCBBU1NFUlQuCi0KLVdlZCBKdWwgIDggMTQ6MDM6MTIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueTogQ2hhbmdlIE1BWCB0byBNQVhfSyBhbmQgTUlOIHRvIE1JTl9LLCB0byBhdm9pZAotCWNvbmZsaWN0cyB3aXRoIHN5c3RlbSBoZWFkZXIgZmlsZXMuICBDaGFuZ2UgYWxsIHVzZXMuCi0KLQkqIE1ha2VmaWxlLmFtIChNQUlOVEFJTkVSQ0xFQU5GSUxFUyk6IERlZmluZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UdWUgSnVsICA3IDE4OjAzOjIyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxkdmVyLnRleGkpOiBOZXcgdGFyZ2V0LgotCShsZC5pbmZvLCBsZC5kdmkpOiBEZXBlbmQgdXBvbiBsZHZlci50ZXhpLgotCSogbGQudGV4aW5mbzogSW5jbHVkZSBsZHZlci50ZXhpLiAgTWVudGlvbiB2ZXJzaW9uIG51bWJlciBvbiB0aXRsZQotCXBhZ2UgYW5kIGluIHRvcCBub2RlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBKdWwgIDYgMTQ6NTU6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1zb2xhcmlzKik6IE5ldyB0YXJnZXQuCi0KLUZyaSBKdWwgIDMgMTQ6MTk6MDYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogRG9uJ3QgZ2V0IGFuIGFzc2VydGlvbiBmYWlsdXJlIGlmIHRoZQotCXNlY3Rpb24gaXMgZGlzY2FyZGVkLgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVXNlIFNPUlQgdG8gc29ydCBzZWN0aW9ucyBhcHByb3ByaWF0ZWx5LgotCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X2J5X2ZpbGVfbmFtZSk6IFJlbW92ZS4KLQkoc29ydF9ieV9zZWN0aW9uX25hbWUpOiBSZW1vdmUuCi0JKHNvcnRfc2VjdGlvbnNfMSwgc29ydF9zZWN0aW9ucyk6IFJlbW92ZS4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogRG9uJ3QgY2FsbAotCXNvcnRfc2VjdGlvbnMuCi0JKGhvbGRfc2VjdGlvbiwgaG9sZF9zZWN0aW9uX25hbWUpOiBOZXcgc3RhdGljIHZhcmlhYmxlcy4KLQkoaG9sZF91c2UsIGhvbGRfdGV4dCwgaG9sZF9yZGF0YSwgaG9sZF9kYXRhLCBob2xkX2Jzcyk6IExpa2V3aXNlLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUmV3cml0ZS4gIExvb2sgZm9yIGEgZ29vZAotCXBsYWNlIHRvIHB1dCB0aGUgc2VjdGlvbi4gIEFsaWduIHRoZSBzZWN0aW9uLiAgU29ydCB0aGUgaW5wdXQKLQlzZWN0aW9ucyBieSBuYW1lLgotCShnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0KLQkqIGxkbGFuZy5jICh3aWxkX3NvcnQpOiBXaGVuIHNvcnRpbmcgYnkgZmlsZSBuYW1lLCBzb3J0IGJ5IGFyY2hpdmUKLQluYW1lIGZpcnN0LgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9wZV9zdWJzeXN0ZW0pOiBEb24ndCBjYWxsCi0JbGRsYW5nX2FkZF91bmRlZi4KLQkoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogVXNlIG5ldyBhZnRlcl9wYXJzZSBmdW5jdGlvbgotCXJhdGhlciB0aGFuIGFmdGVyX3BhcnNlX2RlZmF1bHQuCi0KLQkqIGxkZ3JhbS55IChleHRlcm5fbmFtZV9saXN0KTogRG8gbm90IHJlcXVpcmUgc3ltYm9scyB0byBiZQotCXNlcGFyYXRlZCBieSBjb21tYXMuCi0JKGlmaWxlX3AxKTogQWRkIEVYVEVSTi4KLQkqIGxkbGV4Lmw6IEFjY2VwdCBFWFRFUk4gaW4gQk9USCBhbmQgU0NSSVBUIG1vZGUgYXMgd2VsbCBhcyBNUkkKLQltb2RlLgotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IE1lbnRpb24gdGhhdCBFWFRFUk4gaXMgZXF1aXZhbGVudCB0byAtdS4KLQkoTWlzY2VsbGFuZW91cyBDb21tYW5kcyk6IERvY3VtZW50IEVYVEVSTi4KLQotV2VkIEp1bCAgMSAxOTo0MDozNCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBnY19zZWN0aW9ucy4KLQkqIGxkZ3JhbS55IChsZGdyYW1faGFkX2tlZXAsIEtFRVApOiBOZXcuCi0JKGlucHV0X3NlY3Rpb25fc3BlY19ub19rZWVwKTogUmVuYW1lIGZyb20gb2xkIGlucHV0X3NlY3Rpb25fc3BlYy4KLQkoaW5wdXRfc2VjdGlvbl9zcGVjKTogTmV3LiAgUmVjb2duaXplIEtFRVAuCi0JKiBsZGxhbmcuYyAod2lsZF9zZWN0aW9uKTogSGFuZGxlIGtlZXAgc2VjdGlvbnMuCi0JKGxhbmdfZ2Nfd2lsZF9zZWN0aW9uLCBsYW5nX2djX3dpbGRfZmlsZSwgbGFuZ19nY193aWxkKTogTmV3LgotCShsYW5nX2djX3NlY3Rpb25zXzEsIGxhbmdfZ2Nfc2VjdGlvbnMpOiBOZXcuCi0JKGxhbmdfcHJvY2Vzcyk6IEludm9rZSBsYW5nX2djX3NlY3Rpb25zLgotCShsYW5nX2FkZF93aWxkKTogQWRkIGtlZXAgYXJndW1lbnQuICBVcGRhdGUgYWxsIGNhbGxlcnMuCi0JKiBsZGxhbmcuaCAobGFuZ193aWxkX3N0YXRlbWVudF9zdHJ1Y3QpOiBBZGQga2VlcF9zZWN0aW9ucy4KLQkqIGxkbGV4LmwgKEtFRVApOiBNYXRjaCBpdC4KLQkqIGxkbWFpbi5jIChtYWluKTogRXJyb3Igb24gLXIgYW5kIC0tZ2Mtc2VjdGlvbnMuCi0JKiBsZXhzdXAuYzogQWRkIC0tZ2Mtc2VjdGlvbnMuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTWVyZ2UgLnRleHQuKiBldGMgc2VjdGlvbnMgYXBwcm9wcmlhdGVseS4KLQlNYXJrIHN0YXJ0dXAgc2VjdGlvbnMgd2l0aCBLRUVQLgotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBMaWtld2lzZS4KLQotCSogbGQudGV4aW5mbzogVXBkYXRlIGZvciAtLWdjLXNlY3Rpb25zIGFuZCBLRUVQLgotCi1XZWQgSnVsICAxIDE1OjIxOjIwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gUGV0ZXIgSm9yZGFuIDxwam9yZGFuQGNobGEudXNjLmVkdT46Ci0JKiBzY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYzogQ29ycmVjdCBjb25zdHJ1Y3RvciBoYW5kbGluZyBmb3IgLXUuCi0KLVR1ZSBKdW4gMjMgMTU6MTc6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1kYXRhLWxvY2FsKTogTWFrZSBsZHNjcmlwdHMgc3ViZGlyZWN0b3J5LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVR1ZSBKdW4gMjMgMTU6MTc6MDQgMTk5OCAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoaW5zdGFsbC1leGVjLWxvY2FsKTogRG9uJ3QgbGV0IEVYRUVYVCBpbnRlcmZlcmUKLQl3aXRoIHRoZSBwcm9ncmFtIHRyYW5zZm9ybSBuYW1lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVN1biBKdW4gMjEgMjM6NTU6MTYgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiBOb3RlIHRoYXQgLXJlbGF4IG1heSBtYWtlIHN5bWJvbGljIGRlYnVnZ2luZwotCWltcG9zc2libGUgb24gc29tZSBwbGF0Zm9ybXMuCi0KLVR1ZSBKdW4gMTYgMTI6NTE6MTMgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogTWFrZWZpbGUuYW0gKE1ha2VmaWxlKTogUmVtb3ZlIHRhcmdldC4KLQkoY29uZmlnLnN0YXR1cyk6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogY29uZmlndXJlLmhvc3QgKHBvd2VycGMqLSotbGludXgtZ251Kik6IE5ldyBob3N0LgotCi1GcmkgSnVuIDEyIDE3OjM4OjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKElOUFVUX0ZJTEVTKTogT3B0aW9uYWwgSU5QVVQgc3BlYy4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoIChPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TKTogQ2hhbmdlIHRvcCBvZgotCXN0YWNrIHRvIDhNQi4KLQotRnJpIEp1biAxMiAxOTozMzoxNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChIRklMRVMpOiBSZW1vdmUgY29uZmlnLmguCi0JKEVNVUxBVElPTl9PRklMRVMsIFBPVEZJTEVTKTogTW92ZSBwYXRjaCBvZiBNYXkgMTQgZnJvbQotCU1ha2VmaWxlLmluIHRvIE1ha2VmaWxlLmFtLgotCShlYXJtY29mZi5jKTogRGVwZW5kIHVwb24gYXJtY29mZi5lbSwgbm90IGdlbmVyaWMuZW0uCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogQ29ycmVjdCBtaXNzcGVsbGluZyBpbiAkKFBBQ0tBR0UpLgotCSgkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QpOiBQYXNzIC1DIHRvICQoWEdFVFRFWFQpLgotCSogTWFrZWZpbGUuaW4sIHBvL1BPVEZJTEVTLmluLCBwby9sZC5wb3Q6IFJlYnVpbGQuCi0KLUZyaSBKdW4gMTIgMTM6NDM6MTcgMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLVR1ZSBKdW4gIDkgMDk6MzY6NDggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogQWRkIENPTlNUIHR5cGUgbW9kaWZpZXIgdG8gZGVjbGFyYXRpb24KLQlvZiAnc2VuZCcuCi0KLUZyaSBKdW4gIDUgMTg6MTk6NTkgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOiBTZXQKLQljb25maWcuaGFzX3NoYXJlZCB0byB0cnVlLgotCSogZW11bHRlbXBsL2xpbnV4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOgotCUxpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOgotCUxpa2V3aXNlLgotCi1UdWUgSnVuICAyIDEyOjU1OjAzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfZmluaXNoKTogSWYgdGhlIGVudHJ5IHN5bWJvbCBpcyBub3QgZm91bmQsIHRyeQotCXBhcnNpbmcgaXQgYXMgYSBudW1iZXIuCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogRG9jdW1lbnQgdGhpcy4KLQotTW9uIEp1biAgMSAxNDowMToyMCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKElucHV0IFNlY3Rpb24gV2lsZGNhcmRzKTogRG9jdW1lbnQgU09SVCBrZXl3b3JkLgotCi1Nb24gTWF5IDE4IDEyOjQyOjUzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogTmV3IG1lbWJlciBoYXNfc2hhcmVkLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGl0LgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOiBTZXQgaXQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFRyZWF0IC1zaGFyZWQgYXMgZXJyb3IgaWYgbm90IHN1cHBvcnRlZC4KLQotTW9uIE1heSAxOCAxMzoxNDo0MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIEphc29uIE1lcnJpbGwgPGphc29uQGN5Z251cy5jb20+OgotCSogbGRsYW5nLmMgKHdpbGRfc29ydCk6IENvcnJlY3Qgb3JkZXIgb2Ygc29ydC4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0ICpjcnRiZWdpbi5vIGJlZm9yZSBvdGhlciAuY3RvcnMgYW5kCi0JLmR0b3JzLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLUZyaSBNYXkgMTUgMDA6MjI6MzUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUga2V5d29yZCBTT1JULgotCSogbGRncmFtLnkgKGN1cnJlbnRfZmlsZSk6IENoYW5nZSB0byBzdHJ1Y3Qgd2lsZGNhcmRfc3BlYy4KLQkoJXVuaW9uKTogQWRkIG5ldyBmaWVsZHMgY25hbWUgYW5kIHdpbGRjYXJkLgotCSh3aWxkY2FyZF9uYW1lLCB3aWxkY2FyZF9zcGVjKTogTmV3IG5vbnRlcm1pbmFscy4KLQkoZmlsZV9OQU1FX2xpc3QpOiBVc2Ugd2lsZGNhcmRfc3BlYy4KLQkoaW5wdXRfc2VjdGlvbl9zcGVjKTogQ2hhbmdlIGN1cnJlbnRfZmlsZSB1c2FnZS4KLQkqIGxkLmggKHN0cnVjdCB3aWxkY2FyZF9zcGVjKTogRGVmaW5lLgotCSogbGRsYW5nLmggKGxhbmdfd2lsZF9zdGF0ZW1lbnRfc3RydWN0KTogQWRkIG5ldyBmaWVsZHMKLQlzZWN0aW9uc19zb3J0ZWQgYW5kIGZpbGVuYW1lc19zb3J0ZWQuCi0JKGxhbmdfYWRkX3dpbGQpOiBVcGRhdGUgZGVjbGFyYXRpb24uCi0JKiBsZGxhbmcuYyAod2lsZF9zb3J0KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkod2lsZF9zZWN0aW9uKTogVXNlIHdpbGRfc29ydC4KLQkocHJpbnRfd2lsZF9zdGF0ZW1lbnQpOiBQcmludCBzb3J0aW5nIGluZm9ybWF0aW9uLgotCShsYW5nX2FkZF93aWxkKTogQWRkIG5ldyBwYXJhbWV0ZXJzIHNlY3Rpb25zX3NvcnRlZCBhbmQKLQlmaWxlbmFtZXNfc29ydGVkLiAgQ2hhbmdlIGFsbCBjYWxsZXJzLgotCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiBVcGRhdGUgY2FsbHMgdG8gbGFuZ19hZGRfd2lsZC4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogU29ydCAuY3RvcnMuKiBhbmQgLmR0b3JzLiogYnkgc2VjdGlvbiBuYW1lLgotCSogc2NyaXB0dGVtcGwvZWxmZDEwdi5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTGlrZXdpc2UuCi0KLVRodSBNYXkgMTQgMTg6Mzk6MTYgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lLgotCi1UaHUgTWF5IDE0IDE0OjUxOjI0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5oOiBBZGQgbmV3IHByb3RvdHlwZTogbGRlbXVsX2xpc3RfZW11bGF0aW9uX29wdGlvbnMuCi0JKGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCk6IEFkZCBuZXcgZmllbGQ6IGxpc3Rfb3B0aW9ucy4KLQkqIGxkZW11bC5jIChsZGVtdWxfbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uLiAgQ2FsbCB0aGUKLQlsaXN0X29wdGlvbnMgZmllbGQgb2YgdGhlIGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBmb3IgZWFjaAotCXN1cHBvcnRlZCBlbXVsYXRpb24sIGlmIHN1Y2ggYSBmdW5jdGlvbiBpcyBwcmVzZW50LgotCSogbGV4c3VwLmMgKGhlbHApOiBDYWxsIGxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zLgotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfPD5fbGlzdF9vcHRpb25zKTogTmV3IGZ1bmN0aW9uLiAgRGVzY3JpYmUKLQl0aGUgcGUgZW11bGF0aW9uIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCSogZW11bHRlbXBsL2FybWNvZmYuZW0gKGdsZDw+X2xpc3Rfb3B0aW9ucyk6IE5ldyBmdW5jdGlvbi4KLQlEZXNjcmliZSAgdGhlIGFybWNvZmYgZW11bGF0aW9uIHNwZWNpZmljIGNvbW1hbmQgbGluZSBvcHRpb25zLgotCi0JKiBlbXVsdGVtcGwvcGUuZW06IEFkZCBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOgotCS0tc3VwcG9ydC1vbGQtY29kZS4KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBEaXR0by4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHRoZSAtLXN1cHBvcnQtb2xkLWNvZGUgb3B0aW9uLgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGVtdWxhdGlvbiBmaWxlcyBmb3IgUE9URklMRVMuaW4gdGFyZ2V0LgotCSogZW11bHRlbXBsL3BlLmVtOiBJbnRlcm5hdGlvbmFsaXNlIHN1aXRhYmxlIHN0cmluZ3MuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbTogSW50ZXJuYXRpb25hbGlzZSBzdWl0YWJsZSBzdHJpbmdzLgotCSogcG8vUE9URklMRVMuaW46IFJlYnVpbHQuCi0KLVN1biBNYXkgMTAgMjI6MzY6MzAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogcG8vTWFrZS1pbiAoaW5zdGFsbC1pbmZvKTogTmV3IHRhcmdldC4KLQotVHVlIEFwciAyOCAxOToxODozMCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQ29uZGl0aW9uYWxseSBjYWxsIHNldGxvY2FsZS4KLQkqIGxkLmg6IEluY2x1ZGUgPGxvY2FsZS5oPiBpZiBIQVZFX0xPQ0FMRV9ILgotCShMQ19NRVNTQUdFUyk6IE5vdyBjYW4gYmUgZGVmaW5lZCBldmVuIHdoZW4gRU5BQkxFX05MUy4KLQotTW9uIEFwciAyNyAxMTo1NjoyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIHZlcnNpb24gbnVtYmVyIHRvIDIuOS40Ci0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpIFstcnBhdGgtbGlua106IE1lbnRpb24gbGQuc28uY29uZi4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbG9iYWxfdmVyY2hlY2tfbmVlZGVkKTogTmV3IGZpbGUgc3RhdGljCi0JdmFyaWFibGUuCi0JKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpOiBOZXcgZmlsZSBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBDaGVjayBmb3Igc2hhcmVkIGxpYnJhcmllcwotCXR3aWNlLCBvbmNlIHdpdGggZm9yY2Ugc2V0IHRvIDAgYW5kIG9uY2Ugd2l0aCBpdCBzZXQgdG8gMS4KLSAJKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYpOiBBZGQgZm9yY2UgcGFyYW1ldGVyLgotCUNoYW5nZSBhbGwgY2FsbGVycy4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkKTogTGlrZXdpc2UuICBJZiBub3QgZm9yY2UsIGNoZWNrCi0Jd2hldGhlciB0aGUgbGlicmFyaWVzIG5lZWRzIGFueSBpbmNvbXBhdGlibGUgdmVyc2lvbnMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQotV2VkIEFwciAyMiAxNjowMTozNSAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL01ha2UtaW4gKE1LSU5TVEFMTERJUlMpOiBEb24ndCBsb29rIGluICQodG9wX3NyY2RpcikuCi0KLVdlZCBBcHIgMjIgMTI6NDA6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoY2hlY2stREVKQUdOVSk6IEFkZCAkKElOVExMSUJTKSB0byBMSUJJQkVSVFkgd2hlbgotCWludm9raW5nIHJ1bnRlc3QuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBDaGFuZ2UgLWwgb3B0aW9ucyBpbnRvIC0tbGlicmFyeSBvcHRpb25zCi0JdG8gYXZvaWQgY29uZnVzaW9uIGJldHdlZW4gLWxpIGFuZCAtbGlicmFyeS4KLQotCSogbGQudGV4aW5mbyAoTUVNT1JZKTogQ2xhcmlmeSB1c2Ugb2YgPlJFR0lPTi4KLQotVHVlIEFwciAyMSAyMzoxMjo0MCAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QHNjcmliYmxlcy5jeWdudXMuY29tPgotCi0JKiBNYW55IGZpbGVzOiBBZGRlZCBnZXR0ZXh0IGludm9jYXRpb25zIGFyb3VuZCB1c2VyLXZpc2libGUKLQlzdHJpbmdzLgotCSogbGQuaDogQWRkZWQgZ2V0dGV4dC1yZWxhdGVkIGluY2x1ZGVzIGFuZCBkZWZpbmVzLgotCSogbGRtYWluLmM6IENhbGwgc2V0bG9jYWxlLCBiaW5kdGV4dGRvbWFpbiwgdGV4dGRvbWFpbi4KLQkqIGFjY29uZmlnLmggKEVOQUJMRV9OTFMsIEhBVkVfQ0FUR0VUUywgSEFWRV9HRVRURVhULCBIQVZFX1NUUENQWSwKLQlIQVZFX0xDX01FU1NBR0VTKTogRGVmaW5lLgotCSogY29uZmlndXJlLmluOiBDYWxsIENZX0dOVV9HRVRURVhULiAgQ3JlYXRlIHBvL01ha2VmaWxlLmluIGFuZAotCXBvL01ha2VmaWxlLiAgVXNlIEFNX1BST0dfTEVYLgotCShURElSUyk6IEFDX1NVQlNUIGVhcmx5IG9uLCB0byBhdm9pZCBoYXZpbmcgdmFsdWUgc3BsaXQgd2hlbiBpdAotCWhhcHBlbnMgdG8gY3Jvc3MgbGluZSA5MCBvZiB0aGUgZ2VuZXJhdGVkIHNlZCBzY3JpcHQuCi0JKiBNYWtlZmlsZS5hbSAoU1VCRElSUyk6IE5ldyBtYWNyby4KLQkoUE9URklMRVMpOiBMaWtld2lzZS4KLQkocG8vUE9URklMRVMuaW4pOiBOZXcgdGFyZ2V0LgotCShsZF9uZXdfTERBREQpOiBBZGRlZCBJTlRMTElCUy4KLQkobGRfbmV3X0RFUEVOREVOQ0lFUyk6IEFkZGVkIElOVExERVBTLgotCSogcG8vTWFrZS1pbiwgcG8vUE9URklMRVMuaW4sIHBvL2dhcy5wb3Q6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAyMSAyMzowNzowNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKFNpbXBsZSBFeGFtcGxlKTogUmV3cml0ZSBhIGZldyB0aGluZ3MgYXMgc3VnZ2VzdGVkCi0JYnkgTmljayBDbGlmdG9uIDxuaWNrY0BjeWdudXMuY29tPi4KLQkoUFJPVklERSk6IExpa2V3aXNlLgotCi1UdWUgQXByIDIxIDA5OjU1OjA2IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogUmVuYW1lIGV4dGVybmFsIGFybSBpbnRlcndvcmtpbmcgZnVuY3Rpb25zCi0JdG8gY29uZm9ybSB0byBCRkQgbmFtaW5nIGNvbnZlbnRpb25zLiAgQWRkIGNvZGUgdG8gX2FmdGVyX29wZW4oKQotCWZ1bmN0aW9uIHRvIG9idGFpbiBhIGJmZCBmb3IgdXNlIGJ5IHRoZSBpbnRlcndvcmtpbmcgY29kZS4KLQotCSogZW11bHRlbXBsL2FybWNvZmYuZW06IFJlbmFtZSBleHRlcm5hbCBhcm0gaW50ZXJ3b3JraW5nIGZ1bmN0aW9ucwotCXRvIGNvbmZvcm0gdG8gQkZEIG5hbWluZyBjb252ZW50aW9ucy4gIEFkZCBuZXcgX2FmdGVyX29wZW4oKQotCWZ1bmN0aW9uIHRvIG9idGFpbiBhIGJmZCBmb3IgdXNlIGJ5IHRoZSBpbnRlcndvcmtpbmcgY29kZS4KLQotU3VuIEFwciAxOSAxOToyMzowOSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKSBbY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW1dOgotCVVwZGF0ZSBkb3QgYW5kIHRoZSBkZWZhdWx0IG1lbW9yeSBzZWN0aW9uIGV2ZW4gd2hlbiByZWxheGluZy4KLQotU2F0IEFwciAxOCAxODo0MToxMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogTWFuaXB1bGF0ZSB0aGUgc2VjdGlvbidzIGNvb2tlZCBzaXplCi0JcmF0aGVyIHRoYW4gaXRzIHJhdyBzaXplLgotCi1UdWUgQXByICA3IDEzOjM1OjI5IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogY29uZmlndXJlLmluIChURVNUQkZETElCKTogTmV3LiAgRGVmaW5lZCBhbmQgc3Vic3RpdHV0ZWQuCi0JKiBNYWtlZmlsZS5hbSAoVEVTVEJGRExJQik6IENoYW5nZWQgdG8gQFRFU1RCRkRMSUJALgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEFwciAgNiAxNTozMzozOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChsZC5pbmZvKTogSW52b2tlIG1ha2VpbmZvIHdpdGggLUkgb3B0aW9ucyBkaXJlY3RseQotCXJhdGhlciB0aGFuIHJlbHlpbmcgb24gZGVmYXVsdCBydWxlLiAgRG9uJ3QgZGVwZW5kIHVwb24KLQliZmRzdW1tLnRleGkuCi0JKGxkLmR2aSk6IExpa2V3aXNlLgotCShiZmRzdW1tLnRleGkpOiBSZW1vdmUgdGFyZ2V0LgotCShDTEVBTkZJTEVTKTogVGFrZSBiZmRzdW1tLnRleGkgb3V0IG9mIHZhbHVlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLVN1biBBcHIgIDUgMTM6MDc6NTcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVXNlIHNoZWxsIHZhcmlhYmxlcyB0byBhdm9pZCBkZXBlbmRpbmcgdXBvbgotCWhvdyAkIGlzIGhhbmRsZWQgd2hlbiBleHBhbmRpbmcgYSBzaGVsbCBzdWJzdGl0dXRpb24uCi0KLUZyaSBBcHIgIDMgMDA6NTY6NTAgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IEFkZCBsZC5sb2cgYW5kIGxkLnN1bS4KLQkoRElTVENMRUFORklMRVMpOiBBZGQgc2l0ZS5leHAgYW5kIHNpdGUuYmFrLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogUHV0IHRoZSB0ZGlycyBpbiBhIGZpbGUgYW5kIHVzZSBBQ19TVUJTVF9GSUxFLAotCXJhdGhlciB0aGFuIGluIGEgc2hlbGwgdmFyaWFibGUgYW5kIHVzaW5nIEFDX1NVQlNULgotCSogTWFrZWZpbGUuYW0gKERJU1RDTEVBTkZJTEVTKTogUmVtb3ZlIGxkc2NyaXB0cy4gIEFkZCB0ZGlycy4KLSAJKGRpc3RjbGVhbi1sb2NhbCk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBsZC50ZXhpbmZvOiBDb21wbGV0ZWx5IHJld3JpdGUgbGlua2VyIHNjcmlwdCBkb2N1bWVudGF0aW9uLgotCi1Nb24gTWFyIDMwIDEyOjQ3OjMzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgdmVyc2lvbiB0byAyLjkuMS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogQnJhbmNoZWQgYmludXRpbHMgMi45LgotCi1TYXQgTWFyIDI4IDE2OjQ4OjE5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKE1PU1RMWUNMRUFORklMRVMpOiBSZW1vdmUgdG1wZGlyLgotCShtb3N0bHljbGVhbi1sb2NhbCk6IE5ldyB0YXJnZXQgdG8gcmVtb3ZlIHRtcGRpci4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogbGRjcmVmLmMgKG91dHB1dF9jcmVmKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogbGRmaWxlLmMgKGxkZmlsZV9hZGRfYXJjaCk6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKGxhbmdfbGVhdmVfb3ZlcmxheV9zZWN0aW9uKTogTGlrZXdpc2UuCi0JKiBsZXhzdXAuYyAoT1BUSU9OX0NPVU5UKTogTGlrZXdpc2UuCi0JKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKToKLQlMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2Rpcik6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiBJbml0aWFsaXplIHZhcmlhYmxlcyB0byBhdm9pZCB3YXJuaW5ncy4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvYXJtY29mZi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVJlbW92ZSB1bnVzZWQgdmFyaWFibGVzLgotCi0JKiBNYWtlZmlsZS5hbSAoTU9TVExZQ0xFQU5GSUxFUyk6IENvcnJlY3QgbmFtZSAod2FzCi0JTU9TVENMRUFORklMRVMpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBNYXIgMjcgMTY6Mzk6MjUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFB1dAotCUFSTSBjb2RlIGluc2lkZSBpZmRlZiBUQVJHRVRfSVNfYXJtcGUuCi0KLVdlZCBNYXIgMjUgMTE6MzQ6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBILkouIEx1ICA8aGpsQGdudS5vcmc+OgotCSogTWFrZWZpbGUuYW0gKExERElTVFNUVUZGKTogTmV3IHZhcmlhYmxlLgotCShkaXN0c3R1ZmYpOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBPbmx5IGluY2x1ZGUgLmlkYXRhXCRbMC03XSBpbiAuaWRhdGEgd2hlbgotCXJlbG9jYXRpbmcuCi0KLVR1ZSBNYXIgMjQgMTU6NTk6MjkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2MgKC50ZXh0KTogQWRkIC5nbHVlXzcgYW5kIC5nbHVlXzd0IHNlY3Rpb25zIHRvCi0JaG9sZCBBcm0vVGh1bWIgc3R1YnMuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkX3BlX2JlZm9yZV9hbGxvY2F0aW9uKTogQ2FsbAotCWFybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChmb3IgQVJNL1RodW1iIHRhcmdldHMpIGluIG9yZGVyIHRvCi0JZ2F0aGVyIGludGVyd29ya2luZyBzdGIgaW5mb3JtYXRpb24uCi0KLU1vbiBNYXIgMjMgMTg6NTQ6MTUgMTk5OCAgSm9lbCBTaGVycmlsbCAgPGpvZWxAT0FSY29ycC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IChzaCotKi1ydGVtcyopOiBTd2l0Y2hlZCBmcm9tIEVMRiB0byBDT0ZGLgotCi1GcmkgTWFyIDIwIDE5OjE3OjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggbGlidG9vbCAxLjIuCi0KLVRodSBNYXIgMTkgMTQ6NTQ6NDUgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFRoZSBDeWd3aW4zMiBsaWJyYXJ5IHVzZXMgYSAuZGF0YSRub2NvcHkKLQlzZWN0aW9uIHRvIGF2b2lkIGNvcHlpbmcgY2VydGFpbiBkYXRhIG9uIGZvcmsuICBUaGUgbGlua2VyIHVzZWQgdG8KLQlpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotCWJyZWFrcyBidWlsZGluZyB0aGUgY3lnd2luMzIgZGxsLiAgVGhlIGZpeCBpcyB0byByZW5hbWUgdGhlCi0Jc2VjdGlvbgkiLmRhdGFfY3lnd2luX25vY29weSIgYW5kIGV4cGxpY3RseSBpbmNsdWRlIGl0IGFmdGVyCi0JX19kYXRhX2VuZF9fLgotCi1XZWQgTWFyIDE4IDA5OjQyOjI0IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBBZGQgdGh1bWItcGUgdGFyZ2V0LgotCi1TdW4gTWFyICA4IDIzOjM0OjE0IDE5OTggIFN0YW4gQ294ICA8c2NveEBlcXVpbm94LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjbGl0ZSotKi1lbGYpOiBBZGRlZC4KLQotTW9uIE1hciAgMiAxOToyNDowOCAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIHRoZSBkZWZhdWx0IG1lbW9yeSByZWdpb24gaXMKLQkqZGVmYXVsdCosIHNlZSBpZiB0aGVyZSBpcyBhIG1lbW9yeSByZWdpb24gdGhhdCBjb3VsZCBiZSB1c2VkLgotCi1UaHUgRmViIDI2IDE3OjA5OjUzIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBBZGQgc3VwcG9ydCBmb3IgLmVpdF92IHNlY3Rpb24gYW5kIHB1dAotCWl0IGF0IDB4ZmZmZmYwMjAuCi0JKiBlbXVscGFyYW1zL2QzMHZ7ZWxmLF9vLF9lfS5zaDogRGl0dG8uCi0KLU1vbiBGZWIgMjMgMTc6NDY6NTEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfc2VjdGlvbnMpOiBQZXJtaXQgdGhlIHdpbGRjYXJkIHRvIGluY2x1ZGUKLQlhIHRyYWlsaW5nICcqJyB3aGVuIHNvcnRpbmcgZ3JvdXBlZCBzZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBJbmNsdWRlIGdyb3VwZWQgc2VjdGlvbnMgdXNpbmcgTkFNRVwkKi4gIE9ubHkKLQlpbmNsdWRlIHRoZW0gd2hlbiByZWxvY2F0aW5nLgotCi1XZWQgRmViIDE4IDIzOjM5OjQ2IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChpbnN0YWxsLWV4ZWMtbG9jYWwpOiBJbnN0YWxsIHByb3Blcmx5IHdoZW4gbG4KLQlmYWlscyBvciB0b29sZGlyID09IHByZWZpeC4KLQotRnJpIEZlYiAxMyAxNToyNDowNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChBVVRPTUFLRV9PUFRJT05TKTogRGVmaW5lLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbiwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIGF1dG9tYWtlIDEuMmUuCi0KLVRodSBGZWIgMTIgMTQ6MTA6NDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFsaWduIHRoZSBfZW5kIHN5bWJvbCBhY2NvcmRpbmcgdG8gdGhlIEVMRgotIAlmb3JtYXQgc2l6ZS4gIEZyb20gR29yZG9uIFcuIFJvc3MgPGd3ckBtYy5jb20+LgotCi0JTmV0QlNEIHBhdGNoZXMgZnJvbSBHb3Jkb24gVy4gUm9zcyA8Z3dyQG1jLmNvbT46Ci0JKiBjb25maWd1cmUuaG9zdCAoYWxwaGEqLSotbmV0YnNkKik6IE5ldyBob3N0LgotCSogY29uZmlndXJlLnRndCAoYWxwaGEqLSotbmV0YnNkKiwgcG93ZXJwYy0qLW5ldGJzZCopOiBOZXcKLQl0YXJnZXRzLgotCi0JKiBsZXhzdXAuYyAoaGVscCk6IFVwZGF0ZSBidWctZ251LXV0aWxzIGFkZHJlc3MuCi0JKiBsZC50ZXhpbmZvIChCdWcgUmVwb3J0aW5nKTogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMTAgMTg6MDU6NTYgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogV2FybiBpZiBzb21lIG1lbW9yeSByZWdpb25zIHdlcmUKLQlkZWZpbmVkLCBidXQgYSBsb2FkYWJsZSBzZWN0aW9uIGlzIGdvaW5nIGludG8gdGhlIGRlZmF1bHQgbWVtb3J5Ci0JcmVnaW9uLgotCi1UdWUgRmViIDEwIDE2OjE3OjIwIDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogbGRsZXgubCAoVl9JREVOVElGSUVSKTogQWxsb3cgJy4nIGFzIHN5bWJvbCBwcmVmaXguCi0KLVR1ZSBGZWIgMTAgMTU6MDk6NDUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoTWFrZWZpbGUpOiBBZGQgdGFyZ2V0LCBmb3IgZGVwZW5kZW5jaWVzIG9uCi0JY29uZmlndXJlLmhvc3QgYW5kIGNvbmZpZ3VyZS50Z3QuCi0JKiBjb25maWd1cmUuaG9zdCwgY29uZmlndXJlLnRndDogQ2hhbmdlIC1saW51eCogdG8gLWxpbnV4LWdudSouCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotTW9uIEZlYiAgOSAxMzo0NDo0MCAxOTk4ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2MgKC5zdGFjayk6IE1vdmUgc3RhY2sgdG8gMHgwMC4uN0ZGRS4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChSRUFET05MWV9TVEFSVF9BRERSKTogUmVhZCBvbmx5IHNlY3Rpb24KLSAJbW92ZWQgdG8gMHgwMC4uLi4uNC4KLQotU2F0IEZlYiAgNyAxNTo0MToyNiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UaHUgRmViICA1IDEyOjE2OjExIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFJlbW92ZSAke1JFTE9DQVRJTkctMH0gZnJvbSBhbGwgc2VjdGlvbnMuCi0JRnJvbSBUaG9tYXMgZGUgTGVsbGlzIDx0ZGVsQHdycy5jb20+LgotCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVdlZCBGZWIgIDQgMTM6MDI6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGRfbmV3X0xEQUREKTogUmVtb3ZlIEBMRVhMSUJALgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLU1vbiBGZWIgIDIgMTk6MzQ6NTQgMTk5OCAgU3RldmUgSGF3b3J0aCAgPHN0ZXZlQHBtLmNzZS5ybWl0LkVEVS5BVT4KLQotCUFkZCB0bXMzMjBjMzAgc3VwcG9ydDoKLQkqIGNvbmZpZ3VyZS50Z3QgKHRpYzMwLSotKmFvdXQqLCB0aWMzMC0qLSpjb2ZmKik6IE5ldyB0YXJnZXRzLgotCSogZW11bHBhcmFtcy90aWMzMGFvdXQuc2g6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy90aWMzMGNvZmYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3RpYzMwY29mZi5zYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5hbSAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXRpYzMwYW91dC5vIGFuZAotCWV0aWMzMGNvZmYuby4KLQkoZXRpYzMwYW91dC5jLCBldGljMzBjb2ZmLmMpOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1Nb24gRmViICAyIDE0OjEwOjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IENvcnJlY3QgSE9TVElOR19DUlQwIGluIGFscGhhKi0qLWxpbnV4KiBjYXNlIHRvCi0JYWNjZXB0IGVpdGhlciBsZC5zbyBvciBsZC1saW51eC5zby4KLQotRnJpIEphbiAzMCAxOToxNjoyOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAoe0NDLENYWH1fRk9SX1RBUkdFVCk6IENoYW5nZSBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lCi0JdG8gdHJhbnNmb3JtLgotCSogTWFrZWZpbGUuaW46IFJlZ2VuZXJhdGUuCi0KLUZyaSBKYW4gMzAgMTk6MTU6MTcgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBQdXQgLmR5bnNic3MgaW4gLnNic3MuCi0KLUZyaSBKYW4gMzAgMTE6NDM6NDkgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogTWFrZWZpbGUuYW0gKGVlbGYzMmJzbWlwLmMsIGVlbGYzMmxzbWlwLmMpOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgSmFuIDI5IDE2OjA0OjIxIDE5OTggIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBsZGZpbGUuYyAoc2xhc2gpOiBTZXQgdG8gYmFja3NsYXNoIGlmIF9XSU4zMiBidXQgbm90Ci0JX19DWUdXSU4zMl9fLgotCShsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IElmIF9fTVNET1NfXyBvciBfV0lOMzIsIGFjY2VwdCBhCi0JbGVhZGluZyBiYWNrc2xhc2ggb3IgYSBsZWFkaW5nIHg6IGFzIGFuIGFic29sdXRlIHBhdGguCi0JKGxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZSk6IFVzZSBzbGFzaCByYXRoZXIgdGhhbiAvIHdoZW4KLQlnZW5lcmF0aW5nIG5hbWUgdG8gdHJ5LgotCSogbGV4c3VwLmMgKFBBVEhfU0VQQVJBVE9SKTogRGVmaW5lLgotCShzZXRfZGVmYXVsdF9kaXJsaXN0KTogVXNlIFBBVEhfU0VQQVJBVE9SIHJhdGhlciB0aGFuICc6Jy4KLQotV2VkIEphbiAyOCAxNDowNjozMCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChFTEZTSVpFKTogNjQKLQkoVEVYVF9TVEFSVF9BRERSKTogUm91bmQgb2ZmLCBzaW5jZSBTSVpFT0ZfSEVBREVSUyBpcyBhZGRlZCBsYXRlci4KLQkoREFUQV9QTFQpOiBOZWVkZWQgYnkgdjkgYWJpLgotCi1XZWQgSmFuIDI4IDE2OjM3OjI3IDE5OTggIEouSi4gdmFuIGRlciBIZWlqZGVuICA8Si5KLnZhbmRlckhlaWpkZW5Ac3R1ZGVudC51dHdlbnRlLm5sPgotCi0JKiBjb25maWd1cmUudGd0IChpWzM0NTZdODYtKi1taW5ndzMyKik6IE5ldyBlbnRyeS4KLQotV2VkIEphbiAyOCAxNTo1MTo1OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogT25seSBpbmNsdWRlIGxpbmtvbmNlIHNlY3Rpb25zIGluIGZpbmFsCi0Jc2VjdGlvbnMgd2hlbiByZWxvY2F0aW5nLgotCi1XZWQgSmFuIDI4IDE0OjEwOjAxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IEFkZCBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlcyBvZgotCWluZm9ybWF0aW9uIGluY2x1ZGVkIGluIGEgbGluayBtYXAuCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBNZW50aW9uIExERU1VTEFUSU9OIGluIGRlc2NyaXB0aW9uIG9mIC1tLgotCShFbnZpcm9ubWVudCk6IE1lbnRpb24gTERFTVVMQVRJT04uCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBDbGFyaWZ5IC0tZXhwb3J0LWR5bmFtaWMgYSBiaXQuCi0KLVRodSBKYW4gMjIgMTY6MDc6MjMgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRsZXgubCAoPFNDUklQVD57V0lMRENIQVJ9Kik6IFRha2UgY2FyZSBmb3IgdGhlIGNvbW1lbnRzIHRoaXMKLQlwYXR0ZXJuIGNvdWxkIG1hdGNoLgotCi1XZWQgSmFuIDIxIDIyOjI2OjQ2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMpOiBXaGVuIGRvaW5nCi0JYSByZWxvY2F0ZWFibGUgbGluaywgc2V0IHRoZSBpbWFnZSBiYXNlIHRvIDAsIGFuZCBkb24ndCBkZWZpbmUgdGhlCi0JdmFyaW91cyBzeW1ib2xzLgotCSogZW11bHBhcmFtcy9pMzg2cGUuc2ggKFJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUKTogRGVmaW5lLgotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFN3YXAgdGhlIC5kYXRhIGFuZCAuYnNzIHNlY3Rpb25zIHNvIHRoYXQKLQkuZGF0YSBjb21lcyBmaXJzdC4gIElmIGRvaW5nIGEgcmVsb2NhdGVhYmxlIGxpbmssIHVzZQotCVJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUIGlmIGl0IGlzIGRlZmluZWQsIGFuZCBzdGFydCB0aGUKLQlzZWN0aW9ucyBhdCAwLCBhbmQgZG9uJ3QgZGVmaW5lIGFueSBzeW1ib2xzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19tZW1vcnlfZGVmYXVsdCk6IENvcnJlY3QgcGFyZW50aGlzaXphdGlvbiBvZgotCWV4cHJlc3Npb24uCi0KLVdlZCBKYW4gMjEgMjE6MjA6MzIgMTk5OCAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IERvbid0IGluY2x1ZGUgc3lzL3R5cGVzLmggYW5kIHN5cy9zdGF0LmgKLQloZXJlOyB0aGV5IGFyZSBpbmNsdWRlZCBhbHJlYWR5IHZpYSBzeXNkZXAuaC4KLQotVHVlIEphbiAgNiAxMzo0MDowMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9pOTYwLnNjOiBEb24ndCBleHBsaWNpdGx5IHNldCAuZGF0YSBhbmQgLmJzcyBzdGFydC4KLQotRnJpIEphbiAgMiAyMDoxNTozNyAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKGF0dHJpYnV0ZXNfb3B0KTogUGFzcyByZWdpb24gcG9pbnRlciB0bwotCWxhbmdfc2V0X2ZsYWdzLCBub3QgJnJlZ2lvbi0+ZmxhZ3MuCi0KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9kZWZhdWx0KTogTmV3IGZ1bmN0aW9uIHRvIGZpZ3VyZSBvdXQgYQotCWRlZmF1bHQgbWVtb3J5IHJlZ2lvbiBmb3IgYSBzZWN0aW9uIGlmIGl0IHdhcyBub3Qgc3BlY2lmaWVkLgotCShsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKTogWmVybyBmbGFncywgbm90X2ZsYWdzIGZpZWxkLgotCShsYW5nX21hcHssX2ZsYWdzfSk6IFByaW50IGF0dHJpYnV0ZSBmbGFncyBpbiBtZW1vcnkgbWFwLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBDYWxsIGxhbmdfbWVtb3J5X2RlZmF1bHQgdG8gZ2V0IGRlZmF1bHQKLQltZW1vcnkgcmVnaW9uLgotCShsYW5nX3NldF9mbGFncyk6IEltcGxlbWVudCBhdHRyaWJ1dGUgZmxhZ3MgZm9yIHJlYWwuICBUYWtlIG5ldwotCWFyZ3VtZW50IHRvIGdpdmUgdGhlIGZsYWdzIHdlIGFyZSB0byBza2lwIGZvciB0aGlzIHJlZ2lvbi4KLQotCSogbGRsYW5nLmggKG1lbW9yeV9yZWdpb25fc3RydWN0KTogQWRkIG5vdF9mbGFncyBmaWVsZCwgbWFrZSBib3RoCi0JZmxhZ3MgZmllbGRzIGZsYWd3b3JkIHR5cGUuCi0JKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGUpOiBNYWtlIGZsYWdzIGZpZWxkIGZsYWd3b3JkIHR5cGUuCi0JKGxhbmdfc2V0X2ZsYWdzKTogVXBkYXRlIHByb3RvdHlwZSB0byBtYXRjaCBuZXcgY2FsbGluZyBzZXF1ZW5jZS4KLQkobGFuZ19tZW1vcnlfcmVnaW9uX2RlZmF1bHQpOiBBZGQgcHJvdG90eXBlLgotCi0JKiBlbXVscGFyYW1zL2QzMHZ7X2UsX28sZWxmfS5zaCAoe1RFWFQsREFUQSxFTUVNfV9ERUZfU0VDVElPTik6Ci0JRGVmaW5lIHdoZXRoZXIgb3Igbm90IHRoZSByZWdpb24gZ2V0cyBkZWZhdWx0IHNlY3Rpb25zLCBhbmQgaWYgc28sCi0Jd2hhdCBzZWN0aW9ucy4KLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAoTUVNT1JZKTogU2V0IHVwIHdoaWNoIG9mIHRoZSByZWdpb25zIGdldAotCWRlZmF1bHQgc2VjdGlvbnMuCi0KLVRodSBKYW4gIDEgMjI6NTg6MDQgMTk5OCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZmQzMHYuc2MgKC5laF9mcmFtZSk6IExpbmsgaW50byB0aGUgZGF0YSBzZWN0aW9uLgotCi1UaHUgSmFuICAxIDE4OjA0OjUxIDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBGaXggdHlwby4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwcy5zYzogTGlrZXdpc2UuCi0KLVN1biBEZWMgMjEgMTI6NTE6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGV4cC5jIChmb2xkX25hbWUpOiBEb24ndCBjcmFzaCBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgaW4gYQotCXNlY3Rpb24gd2l0aCBubyBvdXRwdXQgc2VjdGlvbiwgc3VjaCBhcyBhIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24uCi0KLVdlZCBEZWMgMTcgMTI6MTQ6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEtlZXAgdHJhY2sgb2Ygd2hlcmUgd2UgYXJlIGluIHRoZSBvcHRpb24KLQlwYXJzaW5nIGJlZm9yZSBjYWxsaW5nIGxkZW11bF9wYXJzZV9hcmdzLCBzbyB0aGF0IHdlIGRvbid0IGNhbGwgaXQKLQltdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZSBhcmd1bWVudCBhbmQgY29uZnVzZSB0aGUgZ2V0b3B0Ci0JaW50ZXJuYWxzLgotCi1UaHUgRGVjIDExIDA5OjAwOjE1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChkMzB2LWVsZi0qKTogUmVuYW1lIGQzMHZlbGZfZSB0byBkMzB2X2UgYW5kCi0JZDMwdmVsZl9vIHRvIGQzMHZfbyB0byB3b3JrIGluIERPUyBlbnZpcm9ubWVudHMuCi0JKiBNYWtlZmlsZS57YW0saW59OiBEaXR0by4KLQotCSogZW11bHBhcmFtcy9kMzB2X3tvLGV9OiBSZW5hbWUgZnJvbSBkMzB2ZWxmX3tvLGV9LgotCSogZW11bHBhcmFtcy9kMzB2ZWxmX3tvLGV9OiBEZWxldGVkLgotCi1XZWQgRGVjIDEwIDE3OjQwOjA4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IEFkZCBnbHVlIHNlY3Rpb25zIChjb2RlIHRha2VuIGZyb20gQXJtCi0JYnJhbmNoKS4KLQotCSogZW11bHBhcmFtcy9hcm1jb2ZmLnNoIChURU1QTEFURV9OQU1FKTogU2V0IHRvIGFybWNvZmYuCi0KLQkqIGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOiBOZXcgZmlsZSwgaW1wb3J0ZWQgZnJvbSBBcm0gYnJhbmNoLgotCi1XZWQgRGVjIDEwIDE0OjEwOjQ0IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBBZGQgLnJlbCBhbmQgLnJlbGEgc2VjdGlvbnMgZm9yIGFsbAotCWRlZmluZWQgc2VjdGlvbnMuICBTZXQgdXAgX197RCxDfVRPUl97TElTVCxFTkR9X18uICBBZGQgb25jaGlwIGFuZAotCWV4dGVybmFsIG1lbW9yeSBzZWN0aW9ucyBmb3Igcm9kYXRhLiAgRGVsZXRlIC5zdHJpbmcsIC5yb2RhdGExLAotCWFuZCAuZGF0YTEgc2VjdGlvbnMuCi0KLVR1ZSBEZWMgIDkgMTU6Mjg6MTcgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtOiBBZGQgT2N0IDIzIGNoYW5nZXMgdG8gTWFrZWZpbGUuaW4gaGVyZS4KLQotCSogTWFrZWZpbGUue2FtLGlufTogKEFMTF9FTVVMQVRJT05TKTogQWRkIGVkMTB2ZWxmLm8uCi0KLQkqIE1ha2VmaWxlLnthbSxpbn06IChBTExfRU1VTEFUSU9OUyk6IEFkZCBldGljODBjb2ZmLm8uCi0KLQkqIE1ha2VmaWxlLnthbSxpbn06IChBTExfRU1VTEFUSU9OUyk6IEFkZCBlZDMwdmVsZnssX2UsX299Lm8uCi0JKGVkMzB2ZWxmX2UuYyk6IExpa2UgZDMwdmVsZiwgZXhjZXB0IC50ZXh0Ly5kYXRhL2V0YyBhbHdheXMgZ28gaW4KLQlleHRlcm5hbCBtZW1vcnkuCi0JKGVkMzB2ZWxmX28uYyk6IExpa2UgZDMwdmVsZiwgZXhjZXB0IC50ZXh0Ly5kYXRhL2V0YyBhbHdheXMgZ28gaW4KLQlvbmNoaXAgbWVtb3J5LgotCi0JKiBlbXVscGFyYW1zL2QzMHZlbGYuc2ggKFNUQUNLX1NUQVJUX0FERFIpOiBUb3Agb2YgZGVmYXVsdAotCXN0YWNrLgotCSh7VEVYVCxEQVRBLEVNRU19X1NJWkUpOiBTaXplcyBvZiB0aGUgMyBtZW1vcnkgYXJlYXMuCi0JKHtURVhULERBVEEsQlNTfV9NRU1PUlkpOiBXaGljaCBtZW1vcnkgcmVnaW9uIC50ZXh0LCAuZGF0YSwgYW5kCi0JLmJzcyBzaG91bGQgZ28gaW4uCi0KLQkqIGVtdWxwYXJhbXMvZDMwdmVsZl97ZSxvfS5zaDogTmV3IGZpbGVzIHRvIGJlIGV4cGxpY2l0IHdoZXRoZXIKLQkudGV4dCwgLmRhdGEsIGV0YyBnbyBpbiBleHRlcm5hbCBtZW1vcnkgb3Igb25jaGlwIG1lbW9yeS4KLQotCSogY29uZmlndXJlLnRndCAoZDMwdi0qLSpleHQqKTogTmV3IGNvbmZpZ3VyYXRpb24gdG8gZGVmYXVsdAotCS50ZXh0LCAuZGF0YSwgZXRjLiBpbiBleHRlcm5hbCBtZW1vcnkuCi0JKGQzMHYtKi0qb25jaGlwKik6IE5ldyBjb25maWd1cmF0aW9uIHRvIGRlZmF1bHQgLnRleHQsIC5kYXRhLAotCWV0Yy4gaW4gb25jaGlwIG1lbW9yeS4KLQkoZDMwdi0qLSopOiBBZGQgZDMwdmVsZl97ZSxvfSBlbXVsYXRpb25zLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBBbGxvdyAudGV4dCwgLmRhdGEsIC5ic3MgdG8gYmUgcHV0IGluCi0JZWl0aGVyIHRoZSBvbmNoaXAgdGV4dC9kYXRhIGFyZWFzIG9yIHRoZSBleHRlcm5hbCBtZW1vcnkgYXJlYS4KLQkoTUVNT1JZKTogR2V0IHNpemVzIGZyb20gZDMwdmVsZi5zaC4KLQkoLmV7ZGF0YSx0ZXh0LGJzc30pOiBQdXQgc2VjdGlvbnMgaW4gdGhlIGV4dGVybmFsIG1lbW9yeSByZWdpb24uCi0JKC5zdGV4dCk6IFB1dCBzZWN0aW9uIGluIHRoZSBvbmNoaXAgdGV4dCByZWdpb24uCi0JKC5ze2RhdGEsYnNzfSk6IFB1dCBzZWN0aW9ucyBpbiB0aGUgb25jaGlwIGRhdGEgcmVnaW9uLgotCShfX3N0YWNrKTogQXNzaWduIGZyb20gJHtTVEFDS19TVEFSVF9BRERSfS4KLQkoLnRleHQpOiBQdXQgaW4gJHtURVhUX01FTU9SWX0gbWVtb3J5IHJlZ2lvbi4KLQkoLmRhdGF7LDF9Ly5zdHJpbmdzLy5yb2RhdGF7LDF9KTogUHV0IGluICR7REFUQV9NRU1PUll9IG1lbW9yeQotCXJlZ2lvbi4KLQkoLmJzcyk6IFB1dCBpbiAke0JTU19NRU1PUll9IG1lbW9yeSByZWdpb24uCi0KLVR1ZSBEZWMgIDIgMTA6MTQ6NDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCBzdXBwb3J0IGZvciBUaHVtYiB0YXJnZXQuCi0KLVNhdCBOb3YgMjIgMTU6MjM6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sOiBEb24ndCBkZWZpbmUgaGV4X21vZGUuICBDb3JyZWN0IG51bWJlciByZWdleHAgdG8gbm90Ci0JYWNjZXB0IGhleCBkaWdpdHMgd2l0aG91dCBhIGxlYWRpbmcgJCBvciAweC4gIEhhbmRsZSBsZWFkaW5nICQKLQljb3JyZWN0bHkuICBQYXNzIDAgcmF0aGVyIHRoYW4gaGV4X21vZGUgdG8gYmZkX3NjYW5fdm1hLgotCSogbGRsZXguaCAoaGV4X21vZGUpOiBEb24ndCBkZWNsYXJlLgotCi1TdW4gTm92IDE2IDIwOjE2OjQ1IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QzMHZlbGYuc2ggKHtEQVRBLEVNRU19X1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgc3RhcnQKLQlvZiBpbnRlcm5hbCBkYXRhIGFyZWEgYW5kIGV4dGVybmFsIG1lbW9yeSBvbiBjaGlwLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMzB2LnNjOiBEZWZpbmUgYSBNRU1PUlkgcmVnaW9uIHRoYXQgZGVzY3JpYmVzCi0JdGhlIDMgcmVnaW9ucyBvZiBtZW1vcnkgb24gdGhlIGNoaXAuICBQdXQgLnRleHQvLmluaXQvLmZpbmkgaW50bwotCXRoZSB0ZXh0IG1lbW9yeSByZWdpb24sIHB1dCBvdGhlciBzZWdtZW50cyBpbnRvIHRoZSBkYXRhIG1lbW9yeQotCXJlZ2lvbi4gIEFkZCBtb3JlIG9mIHRoZSBzdGFuZGFyZCBlbGYgc2VjdGlvbnMuICBEZWZhdWx0IF9fc3RhY2sKLQl0byBiZSAweDIwMDA4MDAwLCB3aGljaCBpcyAxIGJ5dGUgYmV5b25kIGVuZCBvZiB0aGUgaW50ZXJuYWwgZGF0YQotCXJlZ2lvbi4KLQotVGh1IE5vdiAxMyAxMzo0NTowMCAxOTk3ICBBbmRyZXcgQ2FnbmV5ICA8Y2FnbmV5QGIxLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRhcmdfZXh0cmFfZW11bHMpOiBNYWtlIEZyZWVCU0QgYSBpMzg2YnNkCi0gCXZhcmlhbnQuCi0KLVN1biBOb3YgIDIgMTQ6NTE6MzYgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogY29uZmlndXJlLmhvc3QgKGFscGhhKi0qLWxpbnV4Kik6IENvcnJlY3QgSE9TVElOR19DUlQwLiAgU2V0Ci0JSE9TVElOR19MSUJTLgotCi1UaHUgT2N0IDMwIDEyOjI1OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIHdhcm5fbWlzbWF0Y2ggZmllbGQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgd2Fybl9taXNtYXRjaCBmaWVsZC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0tbm8td2Fybi1taXNtYXRjaCBvcHRpb24uCi0JKiBsZGxhbmcuYyAoaWdub3JlX2JmZF9lcnJvcik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxhbmdfY2hlY2spOiBJZiB3YXJuX21pc21hdGNoIGlzIGZhbHNlLCBkb24ndCB3YXJuIGFib3V0Ci0JbWlzbWF0Y2hlZCBpbnB1dCBmaWxlcy4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IG5ldyBvcHRpb24uCi0KLVRodSBPY3QgMjMgMTQ6Mzg6MTggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogUmVuYW1lIGxpbmtlciBzeW1ib2wgJ19zdGFjaycgdG8gJ19fc3RhY2snCi0JdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggQyBjb2RlIHdoaWNoIGlzIGRlZmluaW5nIGEgdmFyaWFibGUgY2FsbGVkCi0JJ3N0YWNrJy4KLQotVGh1IE9jdCAyMyAwMDo1Nzo0NSAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBkb3QuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogTW92ZSBlZWxmNjRfc3BhcmMubyAuLi4KLQkoQUxMXzY0X0VNVUxBVElPTlMpOiAuLi4gaGVyZS4KLQkoZWVsZjY0X3NwYXJjLmMpOiBUZW1wbGF0ZSBzaG91bGQgYmUgZWxmMzIgbm90IGdlbmVyaWMuCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChURU1QTEFURV9OQU1FKTogTmV3IGRlZmluaXRpb24uCi0KLVRodSBPY3QgMjMgMDA6NDQ6MjAgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAZG90LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzcGFyYzY0LSotbGludXgqLgotCSogZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBULCBOT1ApOiBOZXcuCi0KLVdlZCBPY3QgMjIgMTE6Mjk6MjUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogUHV0IC5laF9mcmFtZSBpbiAucmRhdGEuCi0KLUZyaSBPY3QgMTcgMDA6MDA6MTMgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlKTogT25seSBjaGVjayBnbG9iYWxzPD0+bG9jYWxzLAotCXNpbmNlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBleHBvcnQgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lCi0Jc3ltYm9sLgotCi1XZWQgT2N0IDE1IDE0OjUyOjM2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFB1dCAuc3RhYiBhbmQgLnN0YWJzdHIgc2VjdGlvbnMgYXQgZW5kLgotCi1XZWQgT2N0ICA4IDEyOjM3OjA1IDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QsIGNvbmZpZ3VyZS5ob3N0OiBDaGFuZ2UgYWxwaGEtKi0qIHRvIGFscGhhKi0qLSo7Ci0JY29uZmlnLmd1ZXNzIG5vdyByZWNvZ25pemVzIGFscGhhZXY1IGV0Yy4KLQotRnJpIE9jdCAgMyAxNDoyMzowMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBEb24ndCB0cmVhdAotCS1zIGFuZCAtdSBhcyAtc3RhdGljIGFuZCAtdW5peC4KLQotVGh1IE9jdCAgMiAxODo0MDoyOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBSZXdyaXRlIGZsYWcgaGFuZGxpbmcgZm9yIGNsYXJpdHkuICBJZiB3ZQotIAlhcmUgbm90IGFkZGluZyB0aGUgZmlyc3QgaW5wdXQgc2VjdGlvbiwgYW5kIFNFQ19SRUFET05MWSBpcyBjbGVhcgotIAlvbiB0aGUgb3V0cHV0IHNlY3Rpb24sIHRoZW4gZG9uJ3QgY29weSBpdCBmcm9tIHRoZSBpbnB1dCBzZWN0aW9uLgotICAJSWYgU0VDX1JFQURPTkxZIGlzIG5vdCBzZXQgb24gdGhlIGlucHV0IHNlY3Rpb24sIHRoZW4gY2xlYXIgaXQgb24KLSAJdGhlIG91dHB1dCBzZWN0aW9uLgotCi0JKiBjb25maWd1cmUudGd0IChtaXBzKi1zZ2ktaXJpeFs1Nl0qKTogVXNlIGVsZjMyYnNtaXAgcmF0aGVyIHRoYW4KLQllbGYzMmJtaXAuCi0JKG1pcHMqZWwtKi1saW51eCopOiBDaGFuZ2UgZWxmMzJsbWlwIHRvIGVsZjMybHNtaXAgYW5kIGVsZjMyYm1pcAotCXRvIGVsZjMyYnNtaXAuCi0JKG1pcHMqLSotbGludXgqKTogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyYnNtaXAuc2g6IE5ldyBmaWxlOyBqdXN0IGxpa2UgZWxmMzJibWlwLnNoLCBidXQKLQlzZXR0aW5nIEVOVFJZIHRvIF9fc3RhcnQuCi0JKiBlbXVscGFyYW1zL2VsZjMybHNtaXAuc2g6IE5ldyBmaWxlOyBqdXN0IGxpa2UgZWxmMzJsbWlwLnNoLCBidXQKLQlzZXR0aW5nIEVOVFJZIHRvIF9fc3RhcnQuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFsd2F5cyBzZXQgRU5UUlkgdG8gX3N0YXJ0IGlmIGl0IHdhcyBub3QKLQlhbHJlYWR5IHNldC4KLQotV2VkIE9jdCAgMSAxNjo0MTowMCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3Y4NTAuc2ggKFJPWkRBVEFfU1RBUlRfQUREUiwgUk9TREFUQV9TVEFSVF9BRERSKTogTmV3Ci0JVmFyaWFibGVzLgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBNb3ZlIHJlYWQgb25seSBhcmVhcyBvdXQgb2YgemVybyBhbmQgc21hbGwKLQlkYXRhIHNlY3Rpb25zIGFuZCBpbnRvIHRoZWlyIG93biBzZWN0aW9ucy4KLQotV2VkIFNlcCAyNCAxNjo1OToxNSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS50Z3QgKHNoKi0qLXJ0ZW1zKik6IE5ldyB0YXJnZXQsIGxpa2Ugc2gtKi1lbGYqLgotCi1XZWQgU2VwIDI0IDExOjMzOjE0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoU2VjdGlvbiBPcHRpb25zKTogSW1wcm92ZSBkb2N1bWVudGF0aW9uIG9mIE5PTE9BRAotCWRpcmVjdGl2ZS4KLQotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gU2VwIDIyIDE3OjI0OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IFJldmVydCBwYXRjaCBvZiBTZXB0ZW1iZXIgMy4KLQotV2VkIFNlcCAxNyAxNjo0NTozNCAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSwgTWFrZWZpbGUuaW46IEFkZCBydWxlIGZvciBldjg1MC5jCi0JKiBjb25maWd1cmUudGd0ICh0YXJnX2V4dHJhX2VtdWxzKTogQWRkIHY4NTAgdGFyZ2V0LgotCi1XZWQgU2VwIDE3IDE2OjQzOjM5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvdjg1MC5zaCAoQ0FMTF9UQUJMRV9TVEFSVF9BRERSKTogTmV3IGVudHJ5LgotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogQWRkIGNhbGwgdGFibGUgZGF0YSBhcmVhCi0KLU1vbiBTZXAgMTUgMTE6Mjk6MTMgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlNZXJnZSBjaGFuZ2UgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogUHV0IC5yb2RhdGEgaW4gdGhlIC50ZXh0IHNlY3Rpb24uCi0KLVR1ZSBTZXAgIDkgMDc6NDk6NTYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQG5pbmVtb29ucy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKTogUmVtb3ZlIGV4dHJhbmVvdXMKLQlpbml0aWFsaXphdGlvbiBvZiBwLgotCi1UaHUgU2VwICA0IDA5OjAzOjMzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEluCi0JZXhwcmVzc2lvbiBwcm9kdWNlZCBmb3IgLWJwVCBhbmQgLWJwRCBvcHRpb25zLCBhbGlnbiB0byBhIDMyIGJ5dGUKLQlib3VuZGFyeSByYXRoZXIgdGhhbiBhbiA4IGJ5dGUgYm91bmRhcnkuCi0JKiBzY3JpcHR0ZW1wbC9haXguc2M6IFB1dCAudG9jYnNzIGF0IHN0YXJ0IG9mIC5ic3Mgc2VjdGlvbi4KLQotCSogbGRtaXNjLmgsIGxkbWlzYy5jLCBsZGNyZWYuYzogUmVuYW1lIGZpbmZvIHRvIGxmaW5mbywgdG8gYXZvaWQKLQlmdW5jdGlvbiBuYW1lIGNvbmZsaWN0IHdpdGggQUlYIDQuMiB1bmlzdGQuaCBoZWFkZXIgZmlsZS4KLQotV2VkIFNlcCAgMyAxNToxMjozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBDbGVhciBTRUNfSEFTX0NPTlRFTlRTIGZyb20gYQotCW5vbG9hZF9zZWN0aW9uLgotCi1GcmkgQXVnIDI5IDAwOjMyOjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKGxkX25ld19ERVBFTkRFTkNJRVMpOiBSZW1vdmUgQExFWExJQkAuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEF1ZyAyOCAxMDoxMjoxMCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChhcmMtKi1lbGYqKTogUmVjb2duaXplLgotCSogTWFrZWZpbGUuYW0gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhcmNlbGYuby4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlLgotCSogZW11bHBhcmFtcy9hcmNlbGYuc2g6IE5ldyBmaWxlLgotCi1XZWQgQXVnIDIwIDExOjE0OjEzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHdpbGRjYXJkcCk6IERvbid0IGxldCBhIGJhY2tzbGFzaCBieSBpdHNlbGYgY2F1c2UgYQotCXBhdHRlcm4gdG8gYmUgdHJlYXRlZCBhcyBhIHdpbGRjYXJkIHBhdHRlcm4uCi0KLQkqIGxkZ3JhbS55IChhdHlwZSk6IEFjY2VwdCBwYXJlbnRoZXNlcyB3aXRoIG5vIHR5cGUuCi0KLQkqIGxkLnRleGluZm8gKFNlY3Rpb24gRGVmaW5pdGlvbik6IENsYXJpZnkgdXNlIG9mIHdoaXRlc3BhY2UuCi0JKFNlY3Rpb24gUGxhY2VtZW50KTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgMTggMTE6MTI6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLU1vbiBBdWcgMTggMTE6MTI6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZSB0YXJnZXQuCi0KLVNhdCBBdWcgIDkgMDA6NDI6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGQuaW5mbyk6IENoYW5nZSBkZXBlbmRlbmN5IGZyb20KLQkkKEJGRERJUikvZG9jL2JmZHN1bW0udGV4aSB0byBiZmRzdW1tLnRleGkuCi0JKGxkLmR2aSk6IExpa2V3aXNlLgotCShiZmRzdW1tLnRleGkpOiBOZXcgdGFyZ2V0LgotCShDTEVBTkZJTEVTKTogQWRkIGJmZHN1bW0udGV4aS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBNYWtlZmlsZS5hbTogTmV3IGZpbGUsIGJhc2VkIG9uIG9sZCBNYWtlZmlsZS5pbi4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUsIGZyb20gb2xkIGFjbG9jYWwubTQuCi0JKiBjb25maWd1cmUuaW46IENhbGwgQU1fSU5JVF9BVVRPTUFLRSBhbmQgQU1fUFJPR19MSUJUT09MLiAgUmVtb3ZlCi0Jc2hhcmVkIGxpYnJhcnkgaGFuZGxpbmc7IG5vdyBoYW5kbGVkIGJ5IGxpYnRvb2wuICBSZXBsYWNlCi0JQUNfQ09ORklHX0hFQURFUiB3aXRoIEFNX0NPTkZJR19IRUFERVIuICBDYWxsIEFDX1BST0dfWUFDQywKLQlBQ19QUk9HX0xFWCwgYW5kIEFDX0RFQ0xfWVlURVhULiAgQ2FsbCBBTV9NQUlOVEFJTkVSX01PREUsCi0JQU1fQ1lHV0lOMzIsIGFuZCBBTV9FWEVFWFQuICBEb24ndCBjYWxsIENZX0NZR1dJTjMyIG9yIENZX0VYRUVYVC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBEb24ndCBzZXQgSExERkxBR1MsIEhMREVOViwgb3IgUlBBVEhfRU5WVkFSLgotCSogYWNjb25maWcuaDogTWVudGlvbiBQQUNLQUdFIGFuZCBWRVJTSU9OLgotCSogc3RhbXAtaC5pbjogTmV3IGZpbGUuCi0JKiBsZHZlci5jIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBTZXQgbGRfcHJvZ3JhbV92ZXJzaW9uIGZyb20KLQlWRVJTSU9OLgotCSogbGRncmFtLnksIGxkbGV4Lmw6IFJlcGxhY2UgVkVSU0lPTiB3aXRoIFZFUlNJT05LLgotCSogTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi1Nb24gSnVsIDI4IDE5OjA0OjUwIDE5OTcgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IFVzZSBDWUdXSU4gYW5kIEVYRUVYVCBhdXRvY29uZiBtYWNybyB0byBsb29rIGZvcgotICAgICAgICB3aW4zMiBkZXBlbmRlbmNpZXMuCi0gICAgICAgICogY29uZmlndXJlOiBSZWdlbmVyYXRlZCB3aXRoIGF1dG9jb25mIDIuMTIuCi0gICAgICAgICogTWFrZWZpbGUuaW46IEFkZCAkKEVYRUVYVCkgdG8gZXhlY3V0YWJsZS4KLQotVHVlIEp1bCAyMiAxODo1MDozOCAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGVtdWxwYXJhbXMvaTM4NmdvMzIuc2ggKE9VVFBVVF9GT1JNQVQpOiBTZXQgdG8gImNvZmYtZ28zMiIuCi0JKFNFR01FTlRfU0laRSk6IFNldCB0byAweDIwMC4KLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBSZXdyaXRlLgotCSogY29uZmlndXJlLnRndCAoaVszNDU2XTg2LSotbXNkb3NkamdwcCopOiBOZXcgdGFyZ2V0LgotCi1Nb24gSnVsICA3IDEyOjM5OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gTWFuZnJlZCBIb2xsc3RlaW4gPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+OgotCSogY29uZmlndXJlLmhvc3QgKGlbMzQ1Nl04Ni0qLWxpbnV4KmxpYmMxKik6IFJlbmFtZWQgZnJvbQotCWlbMzQ1Nl04Ni0qLWxpbnV4Ki4KLQkoaVszNDU2XTg2LSotbGludXgqKTogTmV3IGhvc3QuCi0KLVRodSBKdW4gMjYgMTM6NTQ6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogUHV0IC5yc3JjIGFmdGVyIC5yZWxvYy4gIFB1dCBpbnB1dCAucnNyYwotCXNlY3Rpb25zIGluIHRoZSBvdXRwdXQgLnJzcmMgc2VjdGlvbi4KLQotV2VkIEp1biAyNSAxMjo0ODo0MSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY29uZmlndXJlLmhvc3QgKG02OCotKi1saW51eCpsaWJjMSopOiBSZW5hbWVkIGZyb20KLQlgbTY4Ki0qLWxpbnV4KicuCi0JKG02OCotKi1saW51eCopOiBOZXcgY29uZmlndXJhdGlvbiBmb3IgdXNlIHdpdGggR05VIGxpYmMgMi4KLQotTW9uIEp1biAxNiAxOToxODoyMSAxOTk3ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IENvcnJlY3QgLnJlbGEuc2RhdGEgZW50cmllcy4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBQdXQgdGhlIFBMVCBiZXR3ZWVuIHRoZSBzbWFsbCBhbmQgbGFyZ2UKLQlCU1Mgc2VnbWVudHMuCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChURVhUX1NUQVJUX0FERFIpOiBUaGUgQUJJIHNheXMgYEEKLQlwcm9ncmFtIGJhc2Ugb2YgMHgwMjAwMDAwMCBpcyByZWNvbW1lbmRlZC4uLicgYmVjYXVzZSBvdGhlcndpc2UKLQlzaGFyZWQgbGlicmFyaWVzIGFyZSBsZXNzIGVmZmljaWVudC4gIFdlIHVzZSAweDAxODAwMDAwIGJlY2F1c2UKLQlvdGhlcndpc2UgaXQncyBpbXBvc3NpYmxlIHRvIGJyYW5jaCB0byBsb2NhdGlvbiAwLCBmb3IgaW5zdGFuY2UgaWYKLQl5b3UgaGF2ZSBhbiB1bmRlZmluZWQgd2VhayBzeW1ib2wuCi0KLU1vbiBKdW4gMTYgMTI6NDk6MzYgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogbGRsYW5nLmMgKGxhbmdfcGxhY2VfdW5kZWZpbmVkcyk6IEFkZCBcbiBpbiBlaW5mbyBjYWxsLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkqIGxkbGV4Lmw6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogTGlrZXdpc2UuCi0JKiBlbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKToKLQlMaWtld2lzZS4KLQkoY2hlY2tfc2VjdGlvbnMpOiBMaWtld2lzZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlMaWtld2lzZS4KLQkqIG1wdy1lcHBjbWFjLmMgKGdsZHBwY21hY29zX3JlYWRfZmlsZSk6IExpa2V3aXNlLgotCSogbXB3LWlkdG1pcHMuYyAoZ2xkbWlwc2lkdF9hZnRlcl9vcGVuKTogTGlrZXdpc2UuCi0JKGNoZWNrX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGdsZG1pcHNpZHRfYWZ0ZXJfYWxsb2NhdGlvbik6IExpa2V3aXNlLgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX2Nob29zZV9tb2RlKTogUmVtb3ZlIHVudXNlZCBlaW5mbyBhcmd1bWVudC4KLQotRnJpIEp1biAgNiAyMzo0Nzo0MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBBZGQgemVyb2VzIGFmdGVyIC5pZGF0YSQzIHRvIG1hcmsgdGhlIGVuZCBvZgotCXRoZSBpbXBvcnQgbGlzdC4KLQotVGh1IE1heSAyOSAxMzoxMzoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IERvbid0Ci0JY3Jhc2ggaWYgYW4gb3V0cHV0IHNlY3Rpb24gaGFzIG5vIEJGRCBzZWN0aW9uLgotCi1GcmkgTWF5IDIzIDE1OjIzOjI1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAobGRfb3B0aW9ucyk6IEFkZCBlbnRyeSBmb3IgdGhlIG5ldyAidGFzay1saW5rIiBvcHRpb24uCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgdGhlICJ0YXNrLWxpbmsiIG9wdGlvbi4KLQkoT1BUSU9OX1RBU0tfTElOSyk6IEFkZCBkZWZpbmUuCi0KLVdlZCBNYXkgMjEgMTc6NDQ6MTUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IENvcnJlY3QgY2hlY2sgb2YgZmNsb3NlIHJldHVybiB2YWx1ZSB3aGVuCi0JaGFuZGxpbmcgLS1mb3JjZS1leGUtc3VmZml4LgotCi1UaHUgTWF5IDE1IDExOjM1OjI5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogQWRkIHRlc3Qgb2YgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZQotCWNhbGwgdG8gYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEoKS4KLQotTW9uIE1heSAxMiAyMzoyMjo1OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFJlbW92ZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogU2V0IEVOVFJZIGJhc2VkIG9uIHRhcmdldC4gIFBlcm1pdAotCVRFWFRfRFlOQU1JQyB0byBjb250cm9sIC5keW5hbWljIHNlZ21lbnQuICBQZXJtaXQKLQlTSExJQl9URVhUX1NUQVJUX0FERFIgdG8gc2V0IHN0YXJ0IG9mIHNoYXJlZCBvYmplY3QuICBTdXBwb3J0Ci0JSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUy4gIFB1dCAuc3R1YiBpbiAudGV4dC4gIE9ubHkgcHV0Ci0JLmdudS5saW5rb25jZS50KiBpbiAudGV4dCB3aGVuIHJlbG9jYXRpbmcuICBTdXBwb3J0Ci0JT1RIRVJfVEVYVF9TRUNUSU9OUy4gIFN1cHBvcnQgU0hMSUJfREFUQV9BRERSIGFzIHdlbGwgYXMKLQlEQVRBX0FERFIuICBTdXBwb3J0IE9USEVSX0dPVF9TWU1CT0xTIGFuZCBPVEhFUl9HT1RfU0VDVElPTlMuCi0JKiBlbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggKFNDUklQVF9OQU1FKTogU2V0IHRvIGVsZi4KLQkoREFUQV9BRERSKTogRG9uJ3Qgc2V0LgotCShJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TKTogUmVuYW1lIGZyb20gT1RIRVJfUkVBRE9OTFlfU0VDVElPTlMuCi0JKE9USEVSX1RFWFRfU0VDVElPTlMpOiBTZXQuCi0JKE9USEVSX0dPVF9TRUNUSU9OUyk6IFJlbmFtZSBmcm9tIE9USEVSX1JFQURXUklURV9TRUNUSU9OUy4KLQkoTUFDSElORSk6IFNldCB0byBlbXB0eSBzdHJpbmcuCi0JKiBlbXVscGFyYW1zL2VsZjMybDQzMDAuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmVibWlwLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaDogTGlrZXdpc2UuICBBbHNvOgotCShURVhUX0RZTkFNSUMpOiBTZXQuCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcHMuc2g6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKGVlbGYzMmJtaXBzLmMpOiBEZXBlbmQgdXBvbiBlbGYuc2MgcmF0aGVyIHRoYW4KLQllbGZtaXBzLnNjLgotCShlZWxmMzJlYm1pcHMuYywgZWVsZjMyZWxtaXBzLmMsIGVlbGYzMmxtaXAuYyk6IExpa2V3aXNlLgotCi1Nb24gTWF5IDEyIDExOjExOjA2IDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IERvbid0IGFsaWduIHRoZSBkYXRhIHNlZ21lbnQgb24gdGhlIG5leHQgOAotCWJ5dGUgYm91bmRhcnksIGluc3RlYWQgbGV0IHRoZSBsaW5rZXIgdXNlIHdoYXRldmVyIHRoZSBpbmRpdmlkdWFsCi0Jc2VjdGlvbnMgcmVxdWlyZS4KLQotRnJpIE1heSAgOSAxNzo0NTo0NiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1Nl04Ni0qLWdudSopOiBEb24ndCBpbmNsdWRlIE1hY2ggc3VwcG9ydC4KLQotVHVlIE1heSAgNiAxMzoyMToxOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFNlYW4gTWNOZWlsIDxzZWFuQG1jbmVpbC5jb20+OgotCSogZW11bHRlbXBsL3BlLmVtIChzb3J0X2J5X2ZpbGVfbmFtZSk6IFNvcnQgYnkgYXJjaGl2ZSBuYW1lCi0JZmlyc3QuCi0JKHNvcnRfc2VjdGlvbnMpOiBTb3J0IGFsbCBzZWN0aW9ucywgbm90IGp1c3Qgc2VjdGlvbnMgaW4gdGhlIHNhbWUKLQlhcmNoaXZlLgotCi1Nb24gTWF5ICA1IDE4OjE5OjU1IDE5OTcgIFBoaWxpcCBCbHVuZGVsbCAgPHBqYjI3QGNhbS5hYy51az4KLQotCSogY29uZmlndXJlLnRndCwgY29uZmlndXJlLmhvc3Q6IGNvcGUgd2l0aCAnKi0qLWxpbnV4LWdudWFvdXQnCi0JdGFyZ2V0cy4KLQotRnJpIE1heSAgMiAxNTo1NDoyOCAxOTk3ICBNaWtlIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvdGljODBjb2ZmLnNjICgudGV4dCk6IEFkZCBhIGxlYWRpbmcgdW5kZXJzY29yZSB0bwotCV9fe0QsQ31UT1Jfe0xJU1QsRU5EfV9fIGRlZmluYXRpb25zLiAgUmVhcnJhbmdlIHRoZSBvcmRlciBvZiBpdGVtcwotCWluIHRoZSAudGV4dCBzZWN0aW9uLiAgTW92ZSAuY29uc3QsIC5jdG9ycywgLmR0b3JzIGludG8gc2VwYXJhdGUKLQlzZWN0aW9ucy4KLQotV2VkIEFwciAzMCAxMjoyMzoyMSAxOTk3ICBNYW5mcmVkIEhvbGxzdGVpbiAgPG1hbmZyZWRAcy1kaXJla3RuZXQuZGU+Ci0KLQkqIHNjcmlwdHRlbXBsL204OGtiY3Muc2MgKF9fLmluaXRwLmVuZCwgX2V0ZXh0KTogQWRkZWQgd2hpdGVzcGFjZQotCWFyb3VuZCBhc3NpZ25tZW50IG9mIGN1cnJlbnQgbG9jYXRpb24gcG9pbnRlci4KLQotVGh1IEFwciAxNyAxMzowNzoxOCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYnVpbGRfc2V0cyk6IE1ha2Ugc3VyZSB0aGUgc2V0IGlzIGFsaWduZWQKLQlhcHByb3ByaWF0ZWx5LgotCi1UdWUgQXByIDE1IDEzOjE5OjI2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1hGT1JNLCBJTlNUQUxMX1hGT1JNMSk6IFJlbW92ZS4KLQkoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGxkLm5ldyBhbmQgaW5zdGFsbGRpcnMuICBVc2UKLQkkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpIGRpcmVjdGx5LCByYXRoZXIgdGhhbiB1c2luZwotCSQoSU5TVEFMTF9YRk9STSkgYW5kICQoSU5TVEFMTF9YRk9STTEpLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwtaW5mbyk6IFJ1biBta2luc3RhbGxkaXJzLgotCi1Nb24gQXByIDE0IDEyOjA2OjE1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBDaGFuZ2UgaW5zdGFsbC5zaCB0byBpbnN0YWxsLXNoLgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIEFwciAgNCAxMTo0Mjo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbTogSW5jbHVkZSAibGliaWJlcnR5LmgiLgotCShzb3J0X3NlY3Rpb25zXzEpOiBVc2UgeG1hbGxvYyByYXRoZXIgdGhhbiBhbGxvY2EuCi0KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBTUVVBRC4KLQkqIGxkZ3JhbS55IChsZW5ndGgpOiBBZGQgU1FVQUQuCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBVc2UgU1FVQUQgZm9yIGEgc2lnbmVkIDggYnl0ZQotCXJlbG9jLgotCSogbGRsYW5nLmMgKHByaW50X2RhdGFfc3RhdGVtZW50KTogSGFuZGxlIFNRVUFELgotCShsYW5nX3NpemVfc2VjdGlvbnMsIGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZS4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90b2tlbik6IEFkZCBTUVVBRCB0byB0YWJsZS4KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IEhhbmRsZSBTUVVBRC4KLQkqIGxkLnRleGluZm8gKFNlY3Rpb24gRGF0YSBFeHByZXNzaW9ucyk6IERvY3VtZW50IFNRVUFELgotCi1UaHUgQXByICAzIDEzOjE5OjQwIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGR2ZXIuYyAobGRfcHJvZ3JhbV92ZXJzaW9uKTogU2V0IHRvIDIuOC4xLgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVdlZCBBcHIgIDIgMTE6NTU6MjcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtcHctaWR0bWlwcy5jOiBSZW5hbWUgZnJvbSBtcHctZW1pcHNpZHQuYy4KLQkqIG1wdy1lbGZtaXBzLmM6IFJlbmFtZSBmcm9tIG1wdy1lbWlwc2VsZi5jLgotCSogbXB3LWNvbmZpZy5pbjogVXBkYXRlIGFjY29yZGluZ2x5LgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQ2FsbCBsYW5nX2NoZWNrIGltbWVkaWF0ZWx5IGFmdGVyCi0Jb3BlbmluZyB0aGUgaW5wdXQgZmlsZXMsIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmsuCi0KLU1vbiBNYXIgMzEgMjM6NDQ6MDAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGluaXQpOiBGdWxseSBicmFja2V0IGluaXRpYWxpemVyLgotCShzZXRfcGVfc3RhY2tfaGVhcCk6IFJlbW92ZSBsb2NhbHMgYmVnaW5fY29tbWl0IGFuZCBlbmQuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogUmVtb3ZlIHVudXNlZCBsb2NhbCBpLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZW1vdmUgdW51c2VkIGxvY2FsIHB0ci4KLQotTW9uIE1hciAzMSAxNjozNTo1MSAxOTk3ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS50Z3QgKGhwcGEqLSotcnRlbXMqKTogTmV3IHRhcmdldCwgbGlrZSBocHBhLSotKmVsZiouCi0KLUZyaSBNYXIgMjggMTU6Mjk6MjMgMTk5NyAgSC5KLiBMdSA8aGpsQGdudS5haS5taXQuZWR1PgotCi0JQ29udHJpYnV0ZWQgYnkgRGF2aWQgUy4gTWlsbGVyIDxkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1PjoKLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjKi0qLWxpbnV4YW91dCopOiBOZXcgdGFyZ2V0LgotCShzcGFyYyotKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlc3BhcmNsaW51eC5vLgotCShlc3BhcmNsaW51eC5jKTogTmV3IHRhcmdldC4KLQotRnJpIE1hciAyOCAxNDozMDoxMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFJhbGYgQmFlY2hsZSA8cmFsZkBnbnUuYWkubWl0LmVkdT46Ci0JKiBjb25maWd1cmUudGd0OiBTZXQgdGFyZ19leHRyYV9lbXVscyBmb3IgbWlwcyplbC0qLWxpbnV4KiBhbmQKLQltaXBzKi0qLWxpbnV4Ki4gIFVzZSBlbGYzMmJtaXAgYW5kIGVsZjMybG1pcCwgbm90IGVsZjMyZWJtaXAgYW5kCi0JZWxmMzJlbG1pcC4KLQotVGh1IE1hciAyNyAxNzoxNDozMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVXBkYXRlIGNvcHlyaWdodCBkYXRlIGluIHZlcnNpb24KLQltZXNzYWdlLgotCi1GcmkgTWFyIDIxIDEyOjI4OjQxIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGVtdWxwYXJhbXMvZGVsdGE2OC5zaCAoT1VUUFVUX0ZPUk1BVCk6IFNldCB0byAiY29mZi1tNjhrLXN5c3YiLgotCi1UdWUgTWFyIDE4IDExOjE2OjIzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtOiBJbmNsdWRlICJvYnN0YWNrLmgiLgotCi1Nb24gTWFyIDE3IDE5OjI2OjA2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmM6IEluY2x1ZGUgIm9ic3RhY2suaCIuCi0KLVNhdCBNYXIgMTUgMjM6MjM6NDYgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMtKi1iZW9zKik6IFVzZSBhaXhwcGMgZm9yIHRhcmdfZW11bC4KLQotU2F0IE1hciAxNSAxODoxMDozOCAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogbGRlbXVsLmggKGxkZW11bF9saXN0X2VtdWxhdGlvbnMpOiBVc2UgZnVsbCBwcm90b3R5cGUuCi0JKiBsZGxhbmcuYyAocHJpbnRfb25lX3N5bWJvbCk6IEFkZCBkZWNsYXJhdGlvbi4KLQkqIGxkbGFuZy5oIChkcHJpbnRfc3RhdGVtZW50cyk6IERlY2xhcmUuCi0JKiBsZG1haW4uYyAocmVtb3ZlX291dHB1dCk6IERlY2xhcmUuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogRGVjbGFyZS4KLQkqIGxkd3JpdGUuYyAoY2xvbmVfc2VjdGlvbik6IERlY2xhcmUuCi0JKHNwbGl0X3NlY3Rpb25zKTogTWFrZSBzdGF0aWMuICBEZWNsYXJlLgotCSogbXJpLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKHN0cmR1cCk6IERvbid0IGRlY2xhcmUuCi0JKG1yaV9hbGlhcyk6IFVzZSB4c3RyZHVwIHJhdGhlciB0aGFuIHN0cmR1cC4KLQotRnJpIE1hciAxNCAyMTozMDowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IENoYW5nZSBoYW5kbGluZyBvZiBkYXRhIGFyZWEgd2hlbgotCWdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB0byBub3Qgc2tpcCBhIGxhcmdlIGJsb2NrIG9mIG1lbW9yeS4KLQlGcm9tIFBlciBGb2dlbHN0cm9tIDxwZWZvQGN2cy5vcGVuYnNkLm9yZz4uCi0KLVdlZCBNYXIgMTIgMjE6MzM6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobXVsdGlwbGVfZGVmaW5pdGlvbik6IE9ubHkgc2tpcCB0aGUgd2FybmluZyBpZiB0aGUKLQlvdXRwdXQgc2VjdGlvbiBpcyBhYnNvbHV0ZSB3aGVuIHRoZSBpbnB1dCBzZWN0aW9uIGlzIG5vdAotCWFic29sdXRlLgotCi0JKiBsZGxleC5sOiBBY2NlcHQgd2hpdGVzcGFjZSBpbiBWRVJTX1NUQVJUIHN0YXRlLiAgV2FybiBhYm91dAotCWludmFsaWQgY2hhcmFjdGVycyBpbiBWRVJTXyogc3RhdGVzLgotCi1UdWUgTWFyIDExIDEzOjUxOjMxIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlKTogRG9uJ3QgbGV0IGEKLQl0cmFpbGluZyBzcGFjZSBsZWFkIHVzIHRvIHRoaW5rIHRoYXQgdGhlcmUgaXMgYSB6ZXJvIGFkZHJlc3MuCi0KLVN1biBNYXIgIDkgMjM6MDY6MzUgMTk5NyAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFuZGFudGUuamljLmNvbT4KLQotCSogbGRncmFtLnkgKHZlcnNfbm9kZSk6IENvcnJlY3QgdHlwbyBvZiAnKCcgIGZvciAneycuCi0KLUZyaSBNYXIgIDcgMTg6NDA6MTIgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAoRU5UUlkpOiBFbnRyeSBzeW1ib2wgaXMgX19zdGFydAotCXJhdGhlciB0aGFuIF9zdGFydC4KLQkoX19lZGF0YSk6IERlZmluZSB0aGlzIHJhdGhlciB0aGFuICJlZGF0YSIuCi0JKF9fZW5kKTogRGVmaW5lIHRoaXMgcmF0aGVyIHRoYW4gImVuZCIuCi0KLVR1ZSBNYXIgIDQgMTc6MTg6MzUgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHRpYzgwLSotKik6IEFsbG93IGRyb3BwaW5nIG9mIC1jb2ZmLgotCi1TdW4gTWFyICAyIDIyOjU5OjQ5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobGQuZHZpKTogU2V0IE1BS0VJTkZPIGVudmlyb25tZW50IHZhcmlhYmxlIGFzIHdlbGwKLQlhcyBURVhJTlBVVFMuICBOZWVkZWQgZm9yIGJ1aWxkaW5nIGluIHNlcGFyYXRlIGJ1aWxkIGRpci4KLQkqIGxkaW50LnRleGluZm8gKFNDUklQVF9OQU1FKTogRml4IHR5cG8uCi0JKiBlbXVscGFyYW1zL3RpYzgwY29mZi5zaDogUmV3cml0ZSB0byBpbmNsdWRlIGludGVybmFsIGRvY3VtZW50YXRpb24KLQlhYm91dCBlYWNoIHNoZWxsIHZhcmlhYmxlIHRoYXQgaXMgc2V0IChvciBub3Qgc2V0KS4KLQkqIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYzogQ29tcGxldGUgcmV3cml0ZS4KLQotRnJpIEZlYiAyOCAxNzo0MjoyNyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2FsbCBiZmRfc2V0X2RlZmF1bHRfdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKGxkbWFpbi5vKTogRGVmaW5lIFRBUkdFVCB3aGVuIGNvbXBpbGluZy4KLQotVGh1IEZlYiAyNyAxMTo0MTowMyAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3QgaW5pdGlhbGl6ZSBsaW5rX2luZm8ubHByZWZpeCBvcgotCWxpbmtfaW5mby5scHJlZml4X2xlbi4KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtIChocHBhZWxmX2JlZm9yZV9wYXJzZSk6IExpa2V3aXNlLgotCi0JKiBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogUmVtb3ZlLgotCSogZW11bHBhcmFtcy9tODhrYmNzLnNoIChURU1QTEFURV9OQU1FKTogRG9uJ3Qgc2V0LgotCSogTWFrZWZpbGUuaW4gKGVtODhrYmNzLmMpOiBEZXBlbmQgdXBvbiBnZW5lcmljLmVtIHJhdGhlciB0aGFuCi0JbTg4a2Jjcy5lbS4KLQotCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiBQYXNzIG5vbG9hZF9zZWN0aW9uLCBub3QgU0VDX05FVkVSX0xPQUQsCi0JdG8gbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuICBGcm9tIE1hcmsgUmFzaW4KLQk8bWFyay5yYXNpbkB0ZWxyYWQuY28uaWw+LgotCi1XZWQgRmViIDI2IDExOjUxOjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IENsZWFyIFNFQ19JU19DT01NT04gZnJvbSBjb21tb24KLQlzZWN0aW9uLgotCi1UdWUgRmViIDI1IDIwOjM4OjExIDE5OTcgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotKi1sbmV3cyopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKGVtaXBzbG5ld3MuYyk6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL21pcHNsbmV3cy5zaDogTmV3IGZpbGUuCi0KLVR1ZSBGZWIgMjUgMTY6MDQ6MDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGhvbGRfaW50ZXJwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUHV0IGxvYWRhYmxlIC5ub3RlIHNlY3Rpb25zCi0JYWZ0ZXIgaG9sZF9pbnRlcnAuICBDaG9vc2UgYSB1bmlxdWUgb3V0cHV0IHNlY3Rpb24gbmFtZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbik6IERvbid0IHNldCBob2xkX3VzZSBpZiB0aGUKLQlTRUNfTE9BRCBvciBTRUNfQUxMT0MgZmxhZ3MgZGlmZmVyLiAgU2V0IGhvbGRfaW50ZXJwLgotCi1Nb24gRmViIDI0IDE4OjE2OjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYW5kYW50ZS5qaWMuY29tPjoKLQkqIGxkbGV4LmwgKFZfVEFHLCBWX0lERU5USUZJRVIpOiBOZXcgbWFjcm9zLgotCShWRVJTX1NUQVJULCBWRVJTX1NDUklQVCwgVkVSU19OT0RFKTogTmV3IHN0YXRlcyB0byBwYXJzZSB2ZXJzaW9uCi0JaW5mb3JtYXRpb24uCi0JKGxkbGV4X3ZlcnNpb25fc2NyaXB0LCBsZGxleF92ZXJzaW9uX2ZpbGUpOiBOZXcgZnVuY3Rpb25zLgotCSogbGRsZXguaCAoZW51bSBpbnB1dF9lbnVtKTogQWRkIGlucHV0X3ZlcnNpb25fc2NyaXB0LgotCShsZGxleF92ZXJzaW9uX3NjcmlwdCk6IERlY2xhcmUuCi0JKGxkbGV4X3ZlcnNpb25fZmlsZSk6IERlY2xhcmUuCi0JKiBsZGdyYW0ueSAoJXVuaW9uKTogQWRkIGRlZmxpc3QsIHZlcnN5bXMsIGFuZCB2ZXJzbm9kZS4KLQkoVkVSU19UQUcsIFZFUlNfSURFTlRJRklFUik6IE5ldyB0ZXJtaW5hbHMuCi0JKEdMT0JBTCwgTE9DQUwsIFZFUlNJT04sIElOUFVUX1ZFUlNJT05fU0NSSVBUKTogTmV3IHRlcm1pbmFscy4KLQkoZmlsZSk6IEFjY2VwdCBJTlBVVF9WRVJTSU9OX1NDUklQVC4KLQkoaWZpbGVfcDEpOiBBY2NlcHQgdmVyc2lvbi4KLQkodmVyc2lvbl9zY3JpcHRfZmlsZSk6IE5ldyBub250ZXJtaW5hbC4KLQkodmVyc2lvbiwgdmVyc19ub2RlcywgdmVyc19ub2RlKTogTGlrZXdpc2UuCi0JKHZlcmRlcCwgdmVyc190YWcsIHZlcl9kZWZucyk6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKGxhbmdfZWxmX3ZlcnNpb25faW5mbyk6IE5ldyBnbG9iYWwgdmFyaWFibGUuCi0JKGxhbmdfbmV3X3ZlcnNfcmVnZXgpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfbmV3X3ZlcnNfbm9kZSk6IE5ldyBmdW5jdGlvbi4KLQkodmVyc2lvbl9pbmRleCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfcmVnaXN0ZXJfdmVyc19ub2RlKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX2FkZF92ZXJzX2RlcGVuZCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5oIChsYW5nX2VsZl92ZXJzaW9uX2luZm8pOiBEZWNsYXJlLgotCShsYW5nX25ld192ZXJzX3JlZ2V4LCBsYW5nX25ld192ZXJzX25vZGUpOiBEZWNsYXJlLgotCShsYW5nX2FkZF92ZXJzX2RlcGVuZCwgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUpOiBEZWNsYXJlLgotCSogbGV4c3VwLmMgKE9QVElPTl9WRVJTSU9OX1NDUklQVCk6IERlZmluZS4KLQkobGRfb3B0aW9ucyk6IEFkZCAidmVyc2lvbi1zY3JpcHQiLgotCShwYXJzZV9hcmdzKTogSGFuZGxlIE9QVElPTl9WRVJTSU9OX1NDUklQVC4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVBhc3MgbGFuZ19lbGZfdmVyc2lvbl9pbmZvIHRvIHNpemVfZHluYW1pY19zZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIC5nbnUudmVyc2lvbiBzZWN0aW9ucy4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHN5bWJvbCB2ZXJzaW9uaW5nLgotCi1GcmkgRmViIDIxIDE3OjM3OjUxIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZWQzMHZlbGYuYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0IChkMzB2LSotKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL2QzMHZlbGYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvZWxmZDMwdi5zYzogTmV3IGZpbGUuCi0KLUZyaSBGZWIgMTQgMTg6Mjg6MzEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb24gQ29tbWFuZHMpOiBEb2N1bWVudCB0aGUgSU5DTFVERSBjb21tYW5kLgotCi1UaHUgRmViIDEzIDIwOjMxOjM3IDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AaW5mby51Y2wuYWMuYmU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBCRkRfTkVFRF9ERUNMQVJBVElPTiBvbiBnZXRlbnYuCi0JKiBhY2NvbmZpZy5oIChORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVik6IE5ldyBtYWNyby4KLQkqIHN5c2RlcC5oIChnZXRlbnYpOiBEZWNsYXJlIGlmIE5FRURfREVDTEFSQVRJT05fR0VURU5WLgotCSogbGRlbXVsLmMgKGxkX2VtdWxfZGVmYXVsdF90YXJnZXQpOiBEbyBub3QgY2FzdCBnZXRlbnYgcmV0dXJuCi0JdmFsdWUuCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IExpa2V3aXNlLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0KLVR1ZSBGZWIgMTEgMTU6MzQ6MjYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBXaGVuIHJlbG9jYXRpbmcsIHB1dCAubWlwczE2LmZuLiogYW5kCi0JLm1pcHMxNi5jYWxsLiogaW4gLnRleHQuCi0KLVN1biBGZWIgIDkgMTg6MDk6MTMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvdGljODBjb2ZmLnNoOiBOZXcgKGR1bW15KSBmaWxlIGZvciBUSWM4MC4KLQkqIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYzogTmV3IChkdW1teSkgZmlsZSBmb3IgVEljODAuCi0JKiBNYWtlZmlsZS5pbiAoZXRpYzgwY29mZi5jKTogQWRkIHRhcmdldCBhbmQgcnVsZSB0byBidWlsZCBpdC4KLQkqIGNvbmZpZ3VyZS50Z3QgKHRpYzgwLSotY29mZik6IFNldCB0YXJnX2VtdWwgdG8gdGljODBjb2ZmLgotCi1GcmkgSmFuIDMxIDEzOjE2OjUzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogU2VhcmNoIGZvcgotCSIuc28iIGluIHRoZSBuYW1lLCBub3QgIi5zby4iLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyKTogQWNjZXB0IGEgcGxhaW4gLnNvIGZpbGUuCi0KLQkqIE1ha2VmaWxlLmluIChsZC5pbmZvKTogQWRkIC1JJChzcmNkaXIpLiAgRnJvbSBBbGFuIE1vZHJhCi0JPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1Pi4KLQotVGh1IEphbiAzMCAxMTozMTo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbTogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTa2lwIHRoZSBkaXJlY3RvcnkgbmFtZSB3aGVuCi0Jc2VhcmNoaW5nIGZvciAiLnNvLiIuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBNYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyeSBuYW1lCi0JaGFzIGEgdmVyc2lvbiBudW1iZXIsIGFuZCB0aGF0IG9ubHkgdmVyc2lvbiBudW1iZXJzIGZvbGxvdyAuc28uCi0KLVdlZCBKYW4gMjkgMTg6MTU6MDAgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcGUuc2M6Ci0JKiBzY3JpcHR0ZW1wbC9wcGNwZS5zYzogYWRkICooLmdjY19leGNlcHRfdGFibGUpIHRvIHRoZSB0ZXh0Ci0Jc2VjdGlvbiBzbyBXaW4zMiBleGVjdXRhYmxlcyBhcmUgdmFsaWQuCi0KLU1vbiBKYW4gMjcgMTI6Mjg6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFB1dCBsaW5rb25jZSByZWxvYyBzZWN0aW9uIGluIG90aGVyCi0gCWFwcHJvcHJpYXRlIHJlbG9jIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogQWRkIGxpbmtvbmNlIHN1cHBvcnQuCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2M6IExpa2V3aXNlLgotCi1GcmkgSmFuIDI0IDEwOjQ0OjA5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL21uMTAyMDAuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBNb3ZlIHRoZQotCXN0YWNrIHVwIHRvIDB4ODAwMDAuCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaCAoT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyk6IExpa2V3aXNlLgotCi1UdWUgSmFuIDIxIDEyOjExOjEwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL20zMnJlbGYuc2ggKE9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlMpOiBVc2UgUFJPVklERQotCXRvIGRlZmluZSBgX3N0YWNrJy4KLQotVGh1IEphbiAxNiAxNzowNzo1MiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IFJlbmFtZSBhdXhpbGlhcnlfZmlsdGVyX3NobGliIHRvCi0JYXV4aWxpYXJ5X2ZpbHRlcnMsIGFuZCBtYWtlIGl0IGNoYXIgKiouCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtZiBieSBzZXR0aW5nIHVwIGFuIGFycmF5LgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFVzZQotCW5ldyBuYW1lIG9mIGF1eGlsaWFyeV9maWx0ZXJzLgotCi0JKiBsZC50ZXhpbmZvIChPcHRpb25zKTogSW1wcm92ZSBkb2N1bWVudGF0aW9uIG9mIC0tZmlsdGVyIGFuZAotCS0tYXV4aWxpYXJ5LgotCi1UdWUgSmFuIDE0IDE1OjQ0OjI4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IENsYXJpZnkgdGhhdCB0aGUgbm9ybWFsIHVzYWdlIGlzIC1ULgotCShDb21tYW5kcyk6IExpa2V3aXNlLgotCi1UaHUgSmFuICA5IDExOjI2OjI3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogQ29ycmVjdCBtYXNrIHVzZWQgZm9yIC5kYXRhIGFkZHJlc3MuCi0KLVdlZCBKYW4gIDggMTU6MTQ6NTkgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtOiBtYWtlIGRlZmF1bHQgZXhlY3V0YWJsZSBhLmV4ZSBpbnN0ZWFkIG9mCi0JYS5vdXQKLQotRnJpIEphbiAgMyAxNzozMzozNCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBNb3ZlIC5nb3QgY2xvc2VyIHRvIC5zZGF0YSBhbmQgLnNic3MgYnkKLQlzaGlmdGluZyAucGx0IGJhY2suICBSdW1vdXIgaGFzIGl0IHRoYXQgdGhlIE5ldEJTRCBsZC5zbyBkZXBlbmRzCi0Jb24gLmR5bmFtaWMgYmVpbmcgYWZ0ZXIgLmdvdCwgc28gd2UgbGVhdmUgdGhhdC4KLQotRnJpIEphbiAgMyAxNDowNDo0MCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6IERvbid0IHJlbW92ZSBjb25maWdkb2MudGV4aS4KLSAJKG1haW50YWluZXItY2xlYW4pOiBEbyByZW1vdmUgY29uZmlnZG9jLnRleGkuCi0KLQkqIGxkLnRleGluZm8gKE9wZXJhdG9ycyk6IFJlbW92ZSAnQCcgZnJvbSBAc21hbGxleG1wbGUgaW4gY29tbWVudAotCXRvIGF2b2lkIGNvbmZ1c2luZyB0ZXhpMnJvZmYuCi0KLUZyaSBKYW4gIDMgMTE6Mjc6MDIgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjICguemRhdGEpOiBBZGQgLnpjb21tb24gc2VjdGlvbi4KLQkoLnRkYXRhKTogQWRkIC50Y29tbW9uIGFuZCAudGNvbW1vbl9ieXRlIHNlY3Rpb25zLgotCi1UaHUgSmFuICAyIDE4OjE0OjMyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyplbC0qLWxpbnV4KiwgbWlwcyotKi1saW51eCopOiBOZXcgdGFyZ2V0cy4KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IFVzZSBfX3N0YXJ0IGFzIHRoZSBlbnRyeSBhZGRyZXNzIGZvcgotCW1pcHMqLSotbGludXgqLgotCi1UdWUgRGVjIDMxIDE0OjQ4OjMwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpbHRlcl9zaGxpYiBhbmQgYXV4aWxpYXJ5X2ZpbHRlcl9zaGxpYgotCWZpZWxkcy4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC0tYXV4aWxpYXJ5Ly1mIGFuZAotCS0tZmlsdGVyLy1GLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBmaWx0ZXJfc2hsaWIgYW5kIGF1eGlsaWFyeV9maWx0ZXJfc2hsaWIgdG8KLQlzaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLWZpbHRlci8tRiBhbmQgLS1hdXhpbGlhcnkvLWYuCi0KLU1vbiBEZWMgMzAgMTM6NTU6NTcgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjICgudGRhdGEpIEFkZCAudGJzcyBhbmQgLnRieXRlIHNlY3Rpb25zLgotCi1XZWQgRGVjIDE4IDIyOjU3OjM1IDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBVc2UgTmV3Rm9sZGVyUmVjdXJzaXZlIGZvciBpbnN0YWxsYXRpb24uCi0KLUZyaSBEZWMgMTMgMTQ6MDg6NTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjOiBNYWtlIHN1cmUgX197ZSxnfXAgc3RhcnQgcmVsYXRpdmUgdG8gdGhlCi0Je3MsdH1kYXRhIHNlY3Rpb25zLiAgRG8gbm90IGVtaXQgYW55IGxpbmtlciBnZW5lcmF0ZWQgc3ltYm9scyBpZgotCS1yLiAgVXNlIHtURVhULHtaLFMsVH1EQVRBfV9TVEFSVF9BRERSIHZhcmlhYmxlcyB0byBpbml0aWFsaXplCi0Jd2hlcmUgdGhlIGRpZmZlcmVudCBzZWN0aW9ucyBnby4gIENoYW5nZSBzb21lIHdoaXRlc3BhY2UuCi0KLQkqIGVtdWxwYXJhbXMvdjg1MC5zaCAoe1RFWFQse1osUyxUfURBVEF9X1NUQVJUX0FERFIpOiBEZWZpbmUKLQlhcHByb3ByaWF0ZWx5LiAgUmVtb3ZlIGNydWQgbm90IHVzZWQgYW55bW9yZS4KLQotRnJpIERlYyAxMyAxMDoxOTo1NyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbW4xMDIwMC5jKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEhhbmRsZSBtbjEwMjAwLgotCSogZW11bHBhcm1zL21uMTAyMDAuc2g6IE5ldyBmaWxlLgotCi1UaHUgRGVjIDEyIDE3OjA0OjU1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2dsZDk2MGMuZW06IEluY2x1ZGUgPGN0eXBlLmg+LgotIAkoZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCk6IEdldCB0aGUgbWFjaGluZSB0eXBlIGZyb20gdGhlIC1BIG9wdGlvbgotCWlmIHRoZXJlIGlzIG9uZSwgcmF0aGVyIHRoYW4gYWx3YXlzIHVzaW5nIGNvcmUuCi0KLVNhdCBEZWMgIDcgMTA6MDc6NTEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBlbXVscGFybXMvbW4xMDMwMC5zaDogSGFuZGxlIGxlYWRpbmcgdW5kZXJzY29yZXMuCi0KLVRodSBEZWMgIDUgMTM6NDU6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBPbmx5Ci0Jc2V0IGhvbGRfcmVsIGlmIFNFQ19BTExPQyBpcyBzZXQuCi0KLVR1ZSBEZWMgIDMgMTE6Mjk6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IFNldCB0aGUgb3V0cHV0X29mZnNldCBhcyB3ZWxsCi0JYXMgdGhlIG91dHB1dF9zZWN0aW9uIHdoZW4gb25seSByZWFkaW5nIHN5bWJvbHMgZnJvbSBhIGZpbGUuCi0KLU1vbiBEZWMgIDIgMTE6NDM6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zLyouc2g6IE1ha2Ugc3VyZSB0aGF0IGVhY2ggc2V0IG9mIHBhcmFtZXRlcnMgd2hpY2gKLQl1c2VzIHRoZSBlbGYuc2Mgc2NyaXB0IHNldHMgTUFDSElORS4KLQotV2VkIE5vdiAyNyAwMzoyMjowNSAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnssbWlwcyxwcGN9LnNjOiBBZGQgdGhlIHJlbWFpbmluZyBEV0FSRiBzZWN0aW9ucy4KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogTGlrZXdpc2UuCi0KLVR1ZSBOb3YgMjYgMTY6NTg6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjEyLgotCi1Nb24gTm92IDI1IDEyOjE3OjU1IDE5OTYgIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMpOiBBZGQgY2FzZQotCWZvciBiZmRfdm1hIHRvIGluaXQgbG9vcC4KLQotTW9uIE5vdiAyNSAwOTo1NTowNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy9tbjEwMzAwLnNoOiBSZW1vdmUgYm9ndXMgJ18nIHByZWZpeCBmb3IKLQllbnRyeSBzeW1ib2wgYW5kIGN0b3IvZHRvciBzdHVmZi4KLQotRnJpIE5vdiAxNSAxMzowMDoxOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbW4xMDMwMC5jKTogQWRkIGRlcGVuZGVuY2llcy4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEhhbmRsZSBtbjEwMzAwLgotCSogZW11bHBhcm1zL21uMTAzMDAuc2g6IE5ldyBmaWxlLgotCi1UdWUgTm92ICA1IDEwOjU3OjUwIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFJFQURPTkxZX1NUQVJUX0FERFIpOiBDaGFuZ2VkIHRvIDB4MjAwMDAwNC4KLQkoRU1CRURERUQpOiBEZWZpbmUuCi0KLUZyaSBOb3YgIDEgMTA6MDE6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBBZGQgc2VjdGlvbiBvbiByZXBvcnRpbmcgYnVncy4KLQotCSogc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2M6IE1ha2Ugc3VyZSB0aGUgZXRleHQgYW5kIF9fQ1RPUl9MSVNUX18KLQlzeW1ib2xzIGFyZSBjb3JyZWN0bHkgYWxpZ25lZC4KLQotVGh1IE9jdCAzMSAwOToyODo1OSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdGVtcGwvdjg1MC5zYyAoemRhdGEpOiBIYW5kbGUgcmVzemRhdGEsIHJvbXpkYXRhIGFuZAotCXJvbXpic3MgdG9vLgotCi1UdWUgT2N0IDI5IDEyOjMzOjA1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2g6IENoYW5nZXMgbmVlZGVkIGZvciBEMTBWLUVWQSBib2FyZC4KLQlTZXQgVEVYVF9TVEFSVF9BRERSIHRvIDB4MTAwMDAwMC4gU2V0IFJFQURPTkxZX1NUQVJUX0FERFIgdG8KLQkweDIwMDAwMDAuCi0KLQkqIHNjcmlwdHRlbXBsL2VsZmQxMHYuc2M6ICBGaXggY2FsY3VsYXRpb24gb2YgLnRleHQuICBDaGFuZ2UKLQkuc3RhY2sgdG8gc3RhcnQgYXQgMHgyMDA3ZmZlLgotCi1Nb24gT2N0IDI4IDE1OjM3OjAwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjbGV0Ki0qLWFvdXQqKTogRGVsZXRlLCB1c2Ugc3BhcmMqLSotYW91dCouCi0KLVdlZCBPY3QgMjMgMTY6MTc6MjIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHRlbXBsL3Y4NTAuc2MgKHpkYXRhKTogRml4IHR5cG8gInpyb2RhdGEiIC0+ICJyb3pkYXRhIi4KLQotCSogc2NyaXB0ZW1wbC92ODUwLnNjICh6ZGF0YSk6IE1ha2Ugc3VyZSB0aGlzIHN0YXlzCi0JaW4gbG8tbWVtb3J5LgotCi1UdWUgT2N0IDIyIDExOjM2OjQ3IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvdjg1MC5zYyAoX19lcCk6IFB1dCBpdCBhdCB0aGUgc3RhcnQKLQlvZiB0aGUgdGRhIHNlY3Rpb24uCi0KLQkqIHNjcmlwdGVtcGwvdjg1MC5zYzogTW92ZSBhbGwgIm5vcm1hbCIgc2VjdGlvbnMgaW50bwotCXRoZSBleHRlcm5hbCBtZW1vcnkgcmVnaW9uICgweDEwMDAwMCAtIDB4MjAwMDAwKS4KLQotTW9uIE9jdCAyMSAxNzoxNjo1OSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZkMTB2LnNjOiBDbG9uZSBmcm9tIGVsZi5zYywgbW92ZSAudGV4dCB0bwotCTB4MTAwMDAsIHNvIHRoYXQgaXMgbW9yZSByb29tIGZvciBkYXRhLgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKFRFWFRfU1RBUlRfQUREUik6IE5vdyAweDEwMDAwMC4KLQkoUkVBRE9OTFlfU1RBUlRfQUREUik6IE5vdyAweDAuCi0JKFNDUklQVF9OQU1FKTogTm93IGVsZmQxMHYuCi0KLQkqIE1ha2VmaWxlLmluIChlZDEwdmVsZi5jKTogRGVwZW5kIG9uIGVsZmQxMHYuc2MsIG5vdCBlbGYuc2MuCi0KLUZyaSBPY3QgMTggMjI6MTI6NDkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoCShURVhUX1NUQVJUX0FERFIpOiBDaGFuZ2UgZnJvbSAwIHRvIDB4MTAwLgotCi1GcmkgT2N0IDE4IDE1OjQzOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIGVlbGY2NGFscGhhLm8uCi0JKEFMTF82NF9FTVVMQVRJT05TKTogTmV3IHZhcmlhYmxlLgotCSogY29uZmlndXJlLmluOiBBY2NlcHQgLS1lbmFibGUtNjQtYml0LWJmZCBvcHRpb24uICBJZiBpdCBpcyBzZXQKLQl3aXRoIC0tZW5hYmxlLXRhcmdldHM9YWxsLCBpbmNsdWRlIEFMTF82NF9FTVVMQVRJT05TIGluCi0JRU1VTEFUSU9OX09GSUxFUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotRnJpIE9jdCAxOCAxMjo1ODozNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2MgKF9fZ3AsIF9fZXApOiBEZWZpbmUuCi0KLVRodSBPY3QgMTcgMTg6MTQ6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBUcnkgdG8gY29uc2lzdGVudGx5IHVzZSBhIHNpbmdsZSBvciBhIGRvdWJsZSBkYXNoCi0JZm9yIGVhY2ggb3B0aW9uLgotCi1UaHUgT2N0IDE3IDEwOjE3OjIwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvbTMycmVsZi5zaCAoRU1CRURERUQpOiBEZWZpbmUuCi0KLVRodSBPY3QgMTcgMTA6NTY6NDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC92ODUwLnNjICguemRhdGEpOiBBZGQgdGhpcyBiZWZvcmUgLnRleHQuCi0JKC5zZGF0YSk6IEFsc28gaW5jbHVkZSAucm9zZGF0YSBhcyBwYXJ0IG9mIHRoZSAuc2RhdGEuCi0JKC50ZGF0YSk6IEluY2x1ZGUgdGhpcyBqdXN0IGJlZm9yZSAuc2RhdGEuCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoIChTQ1JJUFRfTkFNRSk6IFVzZSAidjg1MCIgbm90ICJlbGYiLgotCSogc2NyaXB0dGVtcGwvdjg1MC5zYzogV3JhcCBzY3JpcHQgd2l0aCBhICJjYXQgPDwgRU9GIi4KLQotV2VkIE9jdCAxNiAyMzoxMDowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL3Y4NTAuc2M6IE5ldyBsaW5rZXIgc2NyaXB0IGZvciB0aGUgVjg1MC4KLQkqIE1ha2VmaWxlLmluOiBVc2UgaXQuCi0KLVRodSBPY3QgMTAgMTc6NTc6MDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMyYjQzMDAuc2g6IERlZmluZSBfZ3AgaW4gT1RIRVJfR09UX1NZTUJPTFMsIG5vdAotCU9USEVSX1JFQURXUklURV9TRUNUSU9OUy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaDogTGlrZXdpc2UuCi0KLVdlZCBPY3QgIDkgMTQ6MzY6MTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCB3YXJuX3NlY3Rpb25fYWxpZ24gZmllbGQuCi0JKiBsZXhzdXAuYyAoT1BUSU9OX1dBUk5fU0VDVElPTl9BTElHTik6IERlZmluZS4KLQkobGRfb3B0aW9ucyk6IEFkZCAtLXdhcm4tc2VjdGlvbi1hbGlnbi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSAtLXdhcm4tc2VjdGlvbi1hbGlnbi4KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiB3YXJuX3NlY3Rpb25fYWxpZ24sIHdhcm4gaWYKLQl0aGUgc3RhcnQgb2YgYSBzZWN0aW9uIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0td2Fybi1zZWN0aW9uLWFsaWduLgotCSogbGQudGV4aW5mbzogQ2hhbmdlIHNvbWUgc2luZ2xlIGRhc2hlcyB0byBkb3VibGUgZGFzaGVzLgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNldF9wZV9zdWJzeXN0ZW0pOiBSZWNvcmQgZW50cnkgc3ltYm9sIGZvciBlYWNoCi0Jc3Vic3lzdGVtIHR5cGUuICBJZmRlZiBvdXQgb3MyIHR5cGUuICBSZWNvZ25pemUgYSB2ZXJzaW9uIG51bWJlci4KLQotVHVlIE9jdCAgOCAxMjowNzoxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3N1YnN5c3RlbSk6IFdoZW4gc2V0dGluZyB0aGUgc3Vic3lzdGVtCi0JdG8gd2luZG93cywgc2V0IHRoZSBlbnRyeSBwb2ludC4KLQotCSogTWFrZWZpbGUuaW4gKGxkbGV4LmMpOiBEb24ndCBwYXNzIGFueSBvcHRpb25zIHRvICQoTEVYKS4KLQotTW9uIE9jdCAgNyAxNzoyOTowNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBNZW50aW9uIC5zbyBleHRlbnNpb25zIGZvciBzaGFyZWQKLQlsaWJyYXJpZXMuCi0KLVN1biBPY3QgIDYgMjI6MzU6MzYgMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZ7LG1pcHMscHBjfS5zYzogQWRkIERXQVJGIDIgc2VjdGlvbnMuCi0KLUZyaSBPY3QgIDQgMTg6NDk6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogT25seSBzZXQgdGhlIGFkZHJlc3Mgb2YgLnRleHQgaWYKLQlSRUxPQ0FUSU5HLgotCi1GcmkgT2N0ICA0IDEwOjU5OjUyIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvc3BhcmNhb3V0LnNoICh7QklHLExJVFRMRX1fT1VUUFVUX0ZPUk1BVCk6IERlZmluZS4KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2MgKHtCSUcsTElUVExFfV9PVVRQVVRfRk9STUFUKTogUHJvdmlkZSBkZWZhdWx0LgotCShPVVRQVVRfRk9STUFUKTogU3VwcG9ydCBiaS1lbmRpYW4gdGFyZ2V0cy4KLQotVGh1IE9jdCAgMyAxMzo1MjowMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guaCwgZm5tYXRjaC5jOiBSZW1vdmUgKG5vdyBpbiBsaWJpYmVydHkpLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCShDRklMRVMpOiBSZW1vdmUgZm5tYXRjaC5jLgotCShIRklMRVMpOiBSZW1vdmUgZm5tYXRjaC5oLgotCShPRklMRVMpOiBSZW1vdmUgZm5tYXRjaC5vLgotCi1UaHUgT2N0ICAzIDE1OjQxOjI0IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IE1vdmUgY29uZmlnLmxvZyB0byBkaXN0Y2xlYW4uCi0KLVdlZCBPY3QgIDIgMjM6NDU6MjUgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGVtdWx0bXBsL3BlLmVtOiBpbmNyZWFzZSBzaXplIG9mIHN0YWNrIHJlc2VydmUgdG8gMHgyMDAwMDAwCi0gICAgICAgIChuZWNlc3NhcnkgaW4gb3JkZXIgdG8gY29tcGlsZSBwYXJzZS5jIGluIGdjYyBzb3VyY2VzIHVuZGVyIE5UKQotCi1XZWQgT2N0ICAyIDE0OjQ5OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBGaXggdHlwbyBpbiAtLXJwYXRoLWxpbmsgZGVzY3JpcHRpb24uCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBTdWdnZXN0Ci0JLS1ycGF0aCBpZiBhIG5lZWRlZCBsaWJyYXJ5IGlzIG5vdCBmb3VuZC4KLQotVHVlIE9jdCAgMSAxNjoxNzozMyAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBvYXJjb3JwLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotKi1ydGVtcyopOiBOZXcgdGFyZ2V0LCBsaWtlIG1pcHMqLSotZWxmKi4KLQotVHVlIE9jdCAgMSAxNTo1MDozNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBHaXZlIG1vcmUgZGV0YWlsIG9uIC1sIG9wdGlvbi4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogSGFuZGxlIENSRUFURV9TSExJQiB0aGUgc2FtZSB3YXkgdGhhdAotCWVsZi5zYyBkb2VzLCBzbyB0aGF0IGdsaWJjIHdvcmtzIGJldHRlci4KLQotCSogbGR2ZXIuYyAobGRfcHJvZ3JhbV92ZXJzaW9uKTogTmV3IHZhcmlhYmxlLgotCShsZHZlcnNpb24pOiBVc2UgaXQuCi0JKiBsZHZlci5oIChsZF9wcm9ncmFtX3ZlcnNpb24pOiBEZWNsYXJlLgotCSogbGV4c3VwLmMgKGxkX29wdGlvbnMpOiBIYW5kbGUgLS1kbGwtdmVyYm9zZSBsaWtlIC0tdmVyYm9zZSwgbm90Ci0JLS12ZXJzaW9uLiAgQ2hhbmdlIC0tdmVyc2lvbiBoYW5kbGluZyB0byBtYXRjaCBjdXJyZW50IEdOVQotCXN0YW5kYXJkcy4KLQkoaGVscCk6IFByaW50IGJ1ZyByZXBvcnQgYWRkcmVzcy4KLQotTW9uIFNlcCAzMCAxMjoxNDo0MyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZW0zMnJlbGYuYyk6IEFkZCBydWxlIGZvci4KLQkqIGNvbmZpZ3VyZS50Z3QgKG0zMnItKi0qKTogUmVjb2duaXplLgotCSogZW11bHBhcmFtcy9tMzJyZWxmLnNoOiBOZXcgZmlsZS4KLQotVGh1IFNlcCAyNiAxMzo1ODo0NyAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIHN5bWJvbGljIGRvdWJsZXF1b3RpbmcgdG8gbGRtYWluIGNvbXBpbGUgZWRpdC4KLQkqIG1wdy1jb25maWcuaW46IEFkZCBtaXBzLSotKiBjYXNlIGFzIG1pcHMtZWxmLCBhbmQgdXNlIG1vcmUKLQl3aWxkY2FyZHMgaW4gbWF0Y2hpbmcuCi0JKiBtcHctZW1pcHNlbGYuYzogTmV3IGZpbGUsIHByZWdlbmVyYXRlZCBtaXBzIGVsZiBlbXVsYXRpb24uCi0KLVR1ZSBTZXAgMTcgMTI6MTg6MjEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGludC50ZXhpbmZvOiBSZXdyb3RlLgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgY2FzZXMgZm9yIE1JUFMgNTAwMCBsaWtlIE1JUFMgNDMwMC4KLQotTW9uIFNlcCAxNiAxNzo1NToyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IE9ubHkgZGVmaW5lIHN5bWJvbHMgaWYgUkVMT0NBVElORy4gIEZpeAotCXN5bnRheCBlcnJvciBvbiBfX2VuZF9fIGxpbmUuCi0KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IEZvciAtTiBvciAtbiwgZG9uJ3QgYWxpZ24gLmRhdGEuICBGcm9tCi0gCUNocmlzIEhhZGxleSA8Q2hyaXN0b3BoZXIuSGFkbGV5QGNsLmNhbS5hYy51az4KLQotU3VuIFNlcCAxNSAyMjowOTo1NiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoOiBGaXggT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUy4KLQotU3VuIFNlcCAxNSAxMDozODoxNiAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJtcy9kMTB2LnNoOiBTZXQgT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyB0byBwdXQKLQlzdGFjayBhdCB0b3Agb2Ygc2ltdWxhdG9yIG1lbW9yeS4KLQotRnJpIFNlcCAxMyAxNTo0OTo0NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGV4LmwgKFNZTUJPTENIQVJOKTogQWRkICQsIF8sIGFuZCB+LgotCi1XZWQgU2VwIDExIDIzOjMwOjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKGdldF9lbXVsYXRpb24pOiBDaGVjayBmb3IgLW1pcHM0IGxpa2UgLW1pcHMxLCBldC4gYWwuCi0KLVRodSBTZXAgIDUgMTU6MjQ6MTIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IEFjY2VwdCBhIGxhbmdfaW5wdXRfc3RhdGVtZW50Ci0JYXMgdGhlIFBUUiBhcmd1bWVudC4gIElmIHRoZSBmaWxlIGlzIHN5bWJvbHMgb25seSwgZGlzY2FyZCBhbGwKLQlpbnB1dCBzZWN0aW9ucy4KLQkobGRsYW5nX2FkZF9maWxlKTogUGFzcyBlbnRyeSB0byBiZmRfbWFwX292ZXJfc2VjdGlvbnMuCi0KLVdlZCBTZXAgIDQgMTU6NTM6NDMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChhbHBoYS0qLWdudSopOiBOZXcgdGFyZ2V0LiAgRnJvbSBGaWxhIEtvbG9kbnkKLQk8ZmlsYUBpYmkuY29tPi4KLQotVHVlIFNlcCAgMyAwMDo1Mjo1NCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoOiBTZXQgT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUwotCi1TdW4gU2VwICAxIDIxOjQ4OjU4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcm1zL3Y4NTAuc2g6IFNldCBFTUJFRERFRC4KLQotRnJpIEF1ZyAzMCAyMjozMDozMCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJtcy92ODUwLnNoOiBFbnRyeSBzeW1ib2wgaXMgIl9zdGFydCIsIHR3ZWFrCi0JY3Rvci9kdG9yIHN1cHBvcnQuCi0KLUZyaSBBdWcgMzAgMTg6MzI6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0IChzaC0qLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogZW11bHBhcmFtcy9zaGVsZi5zaDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL3NobGVsZi5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZXNoZWxmLm8gYW5kIGVzaGxlbGYuby4KLQkoZXNoZWxmLmMsIGVzaGxlbGYuYyk6IE5ldyB0YXJnZXRzLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBJZiBFTUJFRERFRCBpcyBkZWZpbmVkLCB0aGVuIGRvbid0IGFkZAotCVNJWkVPRl9IRUFERVJTIHRvIFRFWFRfU1RBUlRfQUREUi4gIEV4cGFuZCBDVE9SX1NUQVJUIGFuZCBDVE9SX0VORAotCWFyb3VuZCAuY3RvcnMsIGFuZCBEVE9SX1NUQVJUIGFuZCBEVE9SX0VORCBhcm91bmQgLmR0b3JzLiAgRXhwYW5kCi0JT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUyBpZiBSRUxPQ0FUSU5HLgotCi1UaHUgQXVnIDI5IDE2OjU3OjQ2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLntob3N0LHRndH0gKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtCi0JcHJvLgotCi1Nb24gQXVnIDI2IDEyOjU4OjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKHNlY3Rpb24pOiBBZGQgb3B0X25vY3Jvc3NyZWZzOyBwYXNzIHZhbHVlIHRvCi0JbGFuZ19lbnRlcl9vdmVybGF5LgotCShvcHRfbm9jcm9zc3JlZnMpOiBOZXcgbm9udGVybWluYWwuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgTk9DUk9TU1JFRlMga2V5d29yZCBpbiBFWFBSRVNTSU9OIG1vZGUuCi0JKiBsZGxhbmcuYyAob3ZlcmxheV9ub2Nyb3NzcmVmcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfZW50ZXJfb3ZlcmxheSk6IEFkZCBub2Nyb3NzcmVmcyBwYXJhbWV0ZXIuCi0JKGxhbmdfbGVhdmVfb3ZlcmxheSk6IE9ubHkgYWRkIG5vY3Jvc3NyZWZzIGlmIG92ZXJsYXlfbm9jcm9zc3JlZnMKLQlpcyBzZXQuICBJbml0aWFsaXplIG92ZXJsYXlfbm9jcm9zc3JlZnMuCi0JKiBsZGxhbmcuaCAobGFuZ19lbnRlcl9vdmVybGF5KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGQudGV4aW5mbyAoT3ZlcmxheXMpOiBVcGRhdGUgZG9jdW1lbnRhdGlvbi4KLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogUHJpbnQgR05VIGxkIGluIHRoZSB2ZXJzaW9uIG1lc3NhZ2UuCi0KLVRodSBBdWcgMjIgMTc6MTA6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhMREVOVi4KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBITERFTlYuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoSExERU5WKTogTmV3IHZhcmlhYmxlLgotCSgkKExEX1BST0cpKTogVXNlICQoSExERU5WKS4KLQotVGh1IEF1ZyAyMiAxNjoyOToyOCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChldjg1MC5jKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZ3VyZS50Z3QgKHY4NTAtKi0qKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvdjg1MC5zaDogTmV3IGZpbGUuCi0KLVRodSBBdWcgMjIgMTE6MTY6MDIgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBAREFTSF9DX0ZMQUdAIHRvIGNvbXBpbGVyIGVkaXQuCi0KLVdlZCBBdWcgMjEgMTE6MjY6MzcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IFB1dCAuZ251LmxpbmtvbmNlKiBzZWN0aW9ucyBpbiBhcHByb3ByaWF0ZQotCWNvbnRhaW5pbmcgc2VjdGlvbnMuCi0KLU1vbiBBdWcgMTkgMTM6MDE6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmM6IEluY2x1ZGUgc3lzZGVwLmguCi0KLU1vbiBBdWcgMTkgMTE6Mjg6MjkgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBnZW5zY3JpcHRzLnNoOiBVbmRvIDgvMTYgY2hhbmdlLgotCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2ggKE1BQ0hJTkUpOiBFeHBsaWNpdGx5IHNldCB0byBub3RoaW5nLgotCi1GcmkgQXVnIDE2IDE5OjE4OjA4IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogZ2Vuc2NyaXB0cy5zaDogRXhwbGljaXRseSByZXNldCBhbnkgc2hlbGwgdmFyaWFibGVzIHNldCBvciB1c2VkCi0JYnkgdGhlIHZhcmlvdXMgLnNjIHNjcmlwdHMgdG8gYWxsb3cgaW5hZHZlcnRhbnQgdXNlIG9mIHRoZXNlCi0JbmFtZXMgYXMgbm9ybWFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBieSB0aGUgcGVyc29uIHJ1bm5pbmcKLQljb25maWd1cmUuCi0KLQkqIE1ha2VmaWxlLmluIChlZDEwdmVsZi5jKTogVXNlIHRkaXJfZDEwdiwgbm90IHRkaXJfYXJjZWxmLgotCi1GcmkgQXVnIDE2IDE0OjE1OjQxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYyAoX19ic3Nfc3RhcnRfXywgX19ic3NfZW5kX18sCi0gCV9fZGF0YV9zdGFydF9fLCBfX2RhdGFfZW5kX18pOiBBZGRlZCB0byBrZWVwIGluIHN5bmMuIHdpdGggdGhlCi0gCWRlZmF1bHQgQVJNIGNydDAucy4gQWRkZWQgX19DVE9SX0xJU1RfXyBhbmQgX19EVE9SX0xJU1RfXyBzdXBwb3J0LgotCi1UaHUgQXVnICA4IDE0OjI0OjU2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRjcmVmLmMgKGNoZWNrX3JlbG9jX3JlZnMpOiBJZiBpbmZvLT5zYW1lLCBsb29rIGZvciBhbnkgc3ltYm9sCi0JZGVmaW5lZCBpbiBpbmZvLT5kZWZzZWMsIG5vdCBqdXN0IHRoZSBzZWN0aW9uIHN5bWJvbC4KLQotV2VkIEF1ZyAgNyAxNDo0MDo0OCAxOTk2ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQkZEX05FRURfREVDTEFSQVRJT04gb24gc3Ryc3RyIGFuZCBzYnJrLgotCSogYWNjb25maWcuaCAoTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIpOiBOZXcgbWFjcm8uCi0JKE5FRURfREVDTEFSQVRJT05fU0JSSyk6IE5ldyBtYWNyby4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCSogc3lzZGVwLmggKHN0cnN0cik6IERlY2xhcmUgaWYgTkVFRF9ERUNMQVJBVElPTl9TVFJTVFIuCi0JKiBsZG1haW4uYyAoc2Jyayk6IERlY2xhcmUgaWYgSEFWRV9TQlJLIGFuZAotCU5FRURfREVDTEFSQVRJT05fU0JSSy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcmVjb3JkX3BoZHJzKTogQ2FzdCB4bWFsbG9jIGFuZCB4cmVhbGxvYyByZXR1cm4uCi0KLU1vbiBBdWcgIDUgMTY6MjY6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgT1ZFUkxBWS4KLQkqIGxkZ3JhbS55OiBBZGQgc2VjdGlvbl9waGRyIGZpZWxkIHRvICV1bmlvbi4KLQkoc2VjdGlvbik6IEhhbmRsZSBwaGRyX29wdCByZXN1bHQuICBBZGQgT1ZFUkxBWSBjYXNlLgotCShvcHRfZXhwX3dpdGhvdXRfdHlwZSk6IE5ldyBub250ZXJtaW5hbC4KLQkocGhkcl9vcHQpOiBSZXR1cm4gbGlzdCBvZiBwaGRycy4KLQkob3ZlcmxheV9zZWN0aW9uKTogTmV3IG5vbnRlcm1pbmFsLgotCSogbGRsYW5nLmM6IEluY2x1ZGUgPGN0eXBlLmg+LgotCShsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IEFkZCBwaGRycyBwYXJhbWV0ZXIuCi0JQ2hhbmdlIGFsbCBjYWxsZXJzLgotCShsYW5nX3NlY3Rpb25faW5fcGhkcik6IFJlbW92ZS4KLQkob3ZlcmxheV92bWEsIG92ZXJsYXlfbG1uLCBvdmVybGF5X21heCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShzdHJ1Y3Qgb3ZlcmxheV9saXN0KTogRGVmaW5lLgotCShvdmVybGF5X2xpc3QpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShsYW5nX2VudGVyX292ZXJsYXksIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9ucy4KLQkobGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24sIGxhbmdfbGVhdmVfb3ZlcmxheSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBsZGxhbmcuaCAobGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBVcGRhdGUKLQlkZWNsYXJhdGlvbiBmb3IgbmV3IHBhcmFtZXRlci4KLQkobGFuZ19zZWN0aW9uX2luX3BoZHIpOiBEb24ndCBkZWNsYXJlLgotCShsYW5nX2VudGVyX292ZXJsYXksIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uKTogRGVjbGFyZS4KLQkobGFuZ19sZWF2ZV9vdmVybGF5X3NlY3Rpb24sIGxhbmdfbGVhdmVfb3ZlcmxheSk6IERlY2xhcmUuCi0JKiBsZC50ZXhpbmZvIChPdmVybGF5cyk6IE5ldyBub2RlIHVuZGVyIFNFQ1RJT05TLCBkb2N1bWVudGluZwotCW92ZXJsYXlzLgotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgTUFYIGFuZCBNSU4uCi0JKiBsZGdyYW0ueSAoTUFYLCBNSU4pOiBOZXcgdGVybWluYWxzLgotCShleHApOiBSZWNvZ25pemUgTUFYIGFuZCBNSU4uCi0JKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IEhhbmRsZSBNQVggYW5kIE1JTi4KLQkqIGxkLnRleGluZm8gKEFyaXRobWV0aWMgRnVuY3Rpb25zKTogRG9jdW1lbnQgTUFYIGFuZCBNSU4uCi0KLQkqIGxkLnRleGluZm8gKFBIRFJTKTogVXNlIEBjaW5kZXgsIG5vdCBAa2luZGV4LCBmb3IgcHJvZ3JhbSBoZWFkZXIKLQlpbmRleCBlbnRyaWVzLgotCi0JKiBsZGdyYW0ueSAoU0laRU9GLCBBRERSKTogRG8gbm90IHNwZWNpZnkgdHlwZS4KLQotCSogbGRjcmVmLmMgKGNoZWNrX25vY3Jvc3NyZWYpOiBTa2lwIHN5bWJvbHMgd2l0aCBubyBvdXRwdXQKLQlzZWN0aW9ucy4KLQotRnJpIEF1ZyAgMiAxNDo1Nzo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZ3JhbS55IChMT0FEQUREUik6IE5ldyB0ZXJtaW5hbC4KLQkoZXhwKTogSGFuZGxlIExPQURBRERSLgotCSogbGRsZXgubDogUmVjb2duaXplIExPQURBRERSLgotCSogbGRleHAuYyAoZXhwX3ByaW50X3Rva2VuKTogQWRkIExPQURBRERSLgotCShmb2xkX25hbWUpOiBJbXBsZW1lbnQgTE9BREFERFIuCi0JKiBsZGxhbmcuYyAoZXhwX2luaXRfb3MpOiBUcmVhdCBMT0FEQUREUiBsaWtlIEFERFIuCi0JKiBsZC50ZXhpbmZvIChBcml0aG1ldGljIEZ1bmN0aW9ucyk6IERvY3VtZW50IExPQURBRERSLgotCi1UaHUgQXVnICAxIDEyOjUyOjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoY2hlY2tfbm9jcm9zc3JlZnMpOiBEZWNsYXJlLgotCSogbGRsYW5nLmggKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYpOiBEZWZpbmUuCi0JKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzKTogRGVmaW5lLgotCShub2Nyb3NzcmVmX2xpc3QpOiBEZWNsYXJlLgotCShsYW5nX2FkZF9ub2Nyb3NzcmVmKTogRGVjbGFyZS4KLQkqIGxkbGV4Lmw6IFJlY29nbml6ZSBOT0NST1NTUkVGUyBrZXl3b3JkLgotCSogbGRncmFtLnkgKCV1bmlvbik6IEFkZCBub2Nyb3NzcmVmIGZpZWxkLgotCShOT0NST1NTUkVGUyk6IE5ldyB0ZXJtaW5hbC4KLQkoaWZpbGVfcDEpOiBSZWNvZ25pemUgTk9DUk9TU1JFRlMuCi0JKG5vY3Jvc3NyZWZfbGlzdCk6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGFuZy5jIChub2Nyb3NzcmVmX2xpc3QpOiBEZWZpbmUuCi0JKGxhbmdfYWRkX25vY3Jvc3NyZWYpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZG1haW4uYyAobWFpbik6IElmIG5vY3Jvc3NyZWZfbGlzdCBpcyBub3QgTlVMTCwgY2FsbAotCWNoZWNrX25vY3Jvc3NyZWZzLgotCSh3YXJuaW5nX2NhbGxiYWNrKTogRnJlZSBzeW1ib2xzIGlmIHRoZXJlIGlzIG5vIHBsYWNlIHRvIHN0b3JlCi0JdGhlbS4KLQkobm90aWNlKTogQ2FsbCBhZGRfY3JlZiBpZiBub2Nyb3NzcmVmX2xpc3QgaXMgbm90IE5VTEwuCi0JKiBsZGNyZWYuYzogSW5jbHVkZSAibGRleHAuaCIgYW5kICJsZGxhbmcuaCIuCi0JKGNoZWNrX25vY3Jvc3NyZWZzKTogTmV3IGZ1bmN0aW9uLgotCShjaGVja19ub2Nyb3NzcmVmKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoc3RydWN0IGNoZWNrX3JlZnNfaW5mbyk6IERlZmluZS4KLQkoY2hlY2tfcmVmcywgY2hlY2tfcmVsb2NfcmVmcyk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCSogbGQudGV4aW5mbyAoT3B0aW9uIENvbW1hbmRzKTogRG9jdW1lbnQgTk9DUk9TU1JFRlMuCi0KLQkqIGxkLnRleGluZm8gKFNlY3Rpb24gUGxhY2VtZW50KTogSW1wcm92ZSB0aGUgd29yZGluZyBvZiB0aGUKLQl3aWxkY2FyZCBkb2N1bWVudGF0aW9uLiAgTWVudGlvbiB0aGF0IHdpbGRjYXJkcyBhcmUgb25seSBzZWFyY2hlZAotCWZvciBvbiB0aGUgY29tbWFuZCBsaW5lLCBub3QgaW4gdGhlIGZpbGUgc3lzdGVtLgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBNb3ZlCi0JZGVmaW5pdGlvbiBvZiBsaWJfcGF0aCBpbnNpZGUgY29uZGl0aW9uIHdoZXJlIGl0IGlzIHVzZWQuCi0KLVdlZCBKdWwgMzEgMTM6MTc6MTAgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLSAJKiBlbXVscGFyYW1zL2QxMHZlbGYuc2g6IE5vdyB3b3JrcyB3aXRoIGVsZi5zYy4KLQotV2VkIEp1bCAzMSAxMTo1MjowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChTQ1JJUFRfTkFNRSk6IENoYW5nZSB0byB2YW5pbGxhLgotCi1UdWUgSnVsIDMwIDE0OjQ2OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IEFkZCB0aGUgc2VjdGlvbiBWTUEgdG8gdGhlIHJlc3VsdAotCXZhbHVlIHdoZW4gY29tcHV0aW5nIHRoZSBhZGRyZXNzIG9mIGEgc2VjdGlvbi4KLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGNyZWYgZmllbGQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFNldCBjb21tYW5kX2xpbmUuY3JlZi4KLQkqIGxkbWFpbi5jIChtYWluKTogQ2hlY2sgY29tbWFuZF9saW5lLmNyZWYgcmF0aGVyIHRoYW4KLQlsaW5rX2luZm8ubm90aWNlX2FsbC4KLQkobm90aWNlKTogTGlrZXdpc2UuCi0KLQkqIGxkY3JlZi5jIChvdXRwdXRfb25lX2NyZWYpOiBEb24ndCBjcmFzaCBpZiBhIHN5bWJvbCBpcyBkZWZpbmVkCi0JaW4gYSBzZWN0aW9uIHdpdGhvdXQgYW4gb3duZXIuCi0KLU1vbiBKdWwgMjkgMTc6MjM6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmgsIGZubWF0Y2guYzogTmV3IGZpbGVzLgotCSogbGRsZXgubDogUmVtb3ZlIHVudXNlZCBkZWZpbml0aW9uIG9mIEZJTEVOQU1FLiAgQWRkIGRlZmluaXRpb24KLQlvZiBXSUxEQ0hBUi4gIEluIFNDUklQVCBtb2RlLCBhY2NlcHQgYW55IHNlcXVlbmNlIG9mIFdJTERDSEFSIGFzIGEKLQlOQU1FLgotCSogbGRncmFtLnkgKGZpbGVfTkFNRV9saXN0KTogQWNjZXB0ICcqJyBhbmQgJz8nIHNwZWNpYWxseS4KLQkoaW5wdXRfc2VjdGlvbl9zcGVjKTogQWNjZXB0ICc/JyBzcGVjaWFsbHkuCi0JKHN0YXRlbWVudCk6IENoYW5nZSBleHAgdG8gbXVzdGJlX2V4cCBpbiBsZW5ndGggYW5kIEZJTEwgY2FzZXMuCi0JKHNlY3Rpb24pOiBDYWxsIGxkbGV4X3NjcmlwdCBiZWZvcmUgc2VjdGlvbiBzdGF0ZW1lbnRzLCBhbmQgY2FsbAotCWxkbGV4X3BvcHN0YXRlIGFmdGVyIHRoZW0uCi0JKiBsZGxhbmcuYzogSW5jbHVkZSAiZm5tYXRjaC5oIi4KLQkod2lsZGNhcmRwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkod2lsZF9zZWN0aW9uKTogUGVybWl0IHRoZSBzZWN0aW9uIG5hbWUgdG8gYmUgYSB3aWxkY2FyZC4KLQkod2lsZF9maWxlKTogTmV3IHN0YXRpYyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiB3aWxkLgotCSh3aWxkKTogQ2FsbCB3aWxkX2ZpbGUuICBQZXJtaXQgdGhlIGZpbGUgbmFtZSB0byBiZSBhIHdpbGRjYXJkLgotCShvcGVuX2lucHV0X2JmZHMpOiBEb24ndCBjYWxsIGxvb2t1cF9uYW1lIGZvciBhIHdpbGRjYXJkIHBhdHRlcm4uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0gCShDRklMRVMpOiBBZGQgZm5tYXRjaC5jLgotCShIRklMRVMpOiBBZGQgZm5tYXRjaC5oLgotCShPRklMRVMpOiBBZGQgZm5tYXRjaC5vLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdGhhdCBmaWxlIGFuZCBzZWN0aW9uIG5hbWVzIGNhbiBub3cgYmUKLQl3aWxkY2FyZCBwYXR0ZXJucy4KLQotCSogbGRsYW5nLmMgKGxhbmdfcGxhY2Vfb3JwaGFucyk6IENvcnJlY3QgY29uZGl0aW9uOiBwbGFjZSBhIGNvbW1vbgotCXNlY3Rpb24gaWYgbm90IHJlbG9jYXRlYWJsZSBvciBpZiBjb21tb24gZGVmaW5pdGlvbnMgYXJlIGZvcmNlZC4KLQotV2VkIEp1bCAyNCAxMjoxNjozOCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9kMTB2ZWxmLnNoIChTQ1JJUFRfTkFNRSk6IENoYW5nZSB0byBlbGYuCi0KLVdlZCBKdWwgMjQgMTM6Mzg6MjIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHdvZ2dsZWJ1Zy50aWFjLm5ldD4KLQotCSogY29uZmlndXJlLnRndCAoZDEwdi0qLSopOiBEb24ndCByZXF1aXJlIHRoZSAtZWxmLCBhbGxvdyBwbGFpbiBkMTB2LgotCi1UdWUgSnVsIDIzIDEwOjM2OjE5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZWQxMHZlbGYuYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0IChkMTB2LSotZWxmKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL2QxMHZlbGYuc2g6IE5ldyBmaWxlLgotCi1UaHUgSnVsIDE4IDE2OjI1OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmMqLSotc3lzdjQqKTogTmV3IHRhcmdldC4gIEZyb20gQW5kcmV3IEdpZXJ0aAotCTxBTkRSRVdHQG1pY3JvbGlzZS5jby51az4uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGFuZ2UgaXJpeDUgdG8gaXJpeFs1Nl0qLgotCSogY29uZmlndXJlLnRndDogTGlrZXdpc2UuCi0KLVdlZCBKdWwgMTcgMTA6NTI6NDYgMTk5NiAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc29ydF9zZWN0aW9ucyk6IFBheSBhdHRlbnRpb24gdG8gcmV0dXJuIGNvZGUuCi0KLQkqIGxkbWlzYy5jIChkZW1hbmdsZSk6IFJlbW92ZSBhbGwgcHJlZml4ICcuJ3MgZnJvbSBhIG5hbWUuCi0KLU1vbiBKdWwgMTUgMTE6NDk6NDkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUm91bmQKLSAJdGhlIHZhbHVlIG9mIF9fc3RhcnRfU0VDTkFNRSB0byB0aGUgYWxpZ25tZW50IHJlcXVpcmVkIGJ5IHRoZQotIAlzZWN0aW9uIHRvIGJlIHBsYWNlZC4KLQotVHVlIEp1bCAgOSAxMjowOTowMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqZWwtKi1lbGYqKTogVXNlIGVsZjMyZWxtaXAuCi0JKG1pcHMqLSotZWxmKik6IFVzZSBlbGYzMmVibWlwLgotCSogZW11bHBhcmFtcy9lbGYzMmJtaXAuc2ggKEVNQkVEREVEKTogRG9uJ3QgZGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggKEVNQkVEREVEKTogRG9uJ3QgZGVmaW5lLgotCSogZW11bHBhcmFtcy9lbGYzMmVsbWlwLnNoOiBOZXcgZmlsZTsgY29weSBvZiBlbGYzMmxtaXAuc2ggd2l0aAotCUVNQkVEREVEIGRlZmluZWQuCi0JKiBlbXVscGFyYW1zL2VsZjMyZWJtaXAuc2g6IE5ldyBmaWxlOyBjb3B5IG9mIGVsZjMyYm1pcC5zaCB3aXRoCi0JRU1CRURERUQgZGVmaW5lZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJiNDMwMC5zaCAoRU1CRURERUQpOiBEZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMybDQzMDAuc2ggKEVNQkVEREVEKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMmVibWlwLm8gZWVsZjMyZWxtaXAuby4KLQkoZWVsZjMyZWJtaXAuYywgZWVsZjMyZWxtaXAuYyk6IE5ldyB0YXJnZXRzLgotCi1UaHUgSnVsICA0IDEyOjAxOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogU2V0IHZlcnNpb24gdG8gY3lnbnVzLTIuNy4xLgotCi0JKiBSZWxlYXNlZCBiaW51dGlscyAyLjcuCi0KLQkqIGVtdWxwYXJhbXMvcGM1MzJtYWNoYS5zaDogUmVuYW1lIGZyb20gcGM1MzJtYWNoYW91dC5zaCB0byBhdm9pZAotCVN5c3RlbSBWIGZpbGUgbmFtZSBsaW1pdGF0aW9ucy4KLQkqIGNvbmZpZ3VyZS50Z3QgKG5jMzJrLXBjNTMyLW1hY2gqLCBuczMyay1wYzUzMi11eCopOiBVc2UKLQlwYzUzMm1hY2hhIHJhdGhlciB0aGFuIHBjNTMybWFjaGFvdXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBDaGFuZ2UgZXBjNTMybWFjaGFvdXQubyB0bwotCWVwYzUzMm1hY2hhLm8uCi0JKGVwYzUzMm1hY2hhLmMpOiBSZW5hbWUgdGFyZ2V0IGZyb20gZXBjNTMybWFjaGFvdXQuYy4KLQotV2VkIEp1bCAgMyAxMTo0MDoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChwcmludF9wYWRkaW5nX3N0YXRlbWVudCk6IFVzZSAldSwgbm90ICV4LCB0byBwcmludAotCWZpbGwgdmFsdWUuCi0KLVN1biBKdW4gMzAgMTE6MTY6NDMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctZXBwY21hYy5jOiBVcGRhdGUgdG8gcmVmbGVjdCBNYXkgMjMgY2hhbmdlIHRvIGFpeC5lbS4KLQotVGh1IEp1biAyNyAxNDowMzo0MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyk6IFB1dCB0aGUgLnNhCi0JZmlsZSBqdXN0IGJlZm9yZSB0aGUgLnNvIGZpbGUsIHJhdGhlciB0aGFuIGp1c3QgYWZ0ZXIuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBVc2UgLXByaW50LWZpbGUtbmFtZT1GSUxFIHJhdGhlciB0aGFuIHBpcGluZwotCS1wcmludC1saWJnY2MtZmlsZS1uYW1lIHRocm91Z2ggc2VkLgotCShpWzM0NV04NiotKi1zY28qLCBpWzM0NV04Ni0qLWlzYyopOiBDcmVhdGUgY3J0YmVnaW4ubyBhbmQKLQljcnRlbmQubyBmaWxlcywgaW4gY2FzZSBnY2MgZG9lc24ndCB1c2UgdGhlbS4KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBjcnRiZWdpbi5vIGFuZCBjcnRlbmQuby4KLQotV2VkIEp1biAyNiAxNTo1NzoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG1pcHMqLWRlYy1vc2YqKTogTmV3IHRhcmdldC4KLQotVHVlIEp1biAyNSAyMjoxNToyOSAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoYmluZGlyLCBsaWJkaXIsIGRhdGFkaXIsIG1hbmRpciwgaW5mb2RpciwgaW5jbHVkZWRpciwKLQlJTlNUQUxMX1BST0dSQU0sIElOU1RBTExfREFUQSk6IFVzZSBhdXRvY29uZi1zZXQgdmFsdWVzLgotCShkb2NkaXIpOiBSZW1vdmVkLgotCSogY29uZmlndXJlLmluIChBQ19QUkVSRVEpOiBhdXRvY29uZiAyLjUgb3IgaGlnaGVyLgotCShBQ19QUk9HX0lOU1RBTEwpOiBBZGRlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIEp1biAyNCAxODo0ODoxNiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoX0dMT0JBTF9PRkZTRVRfVEFCTEVfKTogRG9uJ3QgZG8gYQotCVBST1ZJREUgb2YgX0dMT0JBTF9PRkZTRVRfVEFCTEVfLCBzaW5jZSBpdCBuZWVkcyB0byBiZSBhdCBhCi0Jbm9uLWZpeGVkIGxvY2F0aW9uLgotCi1Nb24gSnVuIDI0IDE3OjU1OjMxIDE5OTYgIEpvdWtlIE51bWFuICA8am51bWFuQGJhemlzLm5sPgotCi0JKiBsZGxhbmcuaCAoZW51bSBzZWN0aW9uX3R5cGUpOiBEZWZpbmUuCi0JKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUpOiBSZW1vdmUgbG9hZGFibGUgZmllbGQuICBBZGQKLQlzZWN0eXBlIGZpZWxkLgotCShsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IENoYW5nZSBmbGFncyBwYXJhbWV0ZXIgaW4KLQlwcm90b3R5cGUgdG8gc2VjdHlwZS4KLQkqIGxkZ3JhbS55ICh0eXBlYml0cyk6IFJlbW92ZS4KLQkoc2VjdHlwZSk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKG9wdF9hdCk6IFVzZSBzZWN0eXBlIHJhdGhlciB0aGFuIHR5cGViaXRzLgotCSh0eXBlKTogU2V0IHNlY3R5cGUgcmF0aGVyIHRoYW4gdHlwZWJpdHMuCi0JKGF0eXBlKTogTGlrZXdpc2UuCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgRFNFQ1QsIENPUFksIElORk8sIGFuZCBPVkVSTEFZIGluCi0JRVhQUkVTU0lPTiBtb2RlLgotCSogbGRsYW5nLmMgKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCk6IFNldCBzZWN0eXBlCi0JZmllbGQgcmF0aGVyIHRoYW4gbG9hZGFibGUgZmllbGQuCi0JKHdpbGRfZG9pdCk6IENoZWNrIHNlY3R5cGUgcmF0aGVyIHRoYW4gbG9hZGFibGUuCi0JKGxhbmdfcmVjb3JkX3BoZHJzKTogTGlrZXdpc2UuCi0JKGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUmVuYW1lIGZsYWdzIHBhcmFtZXRlciB0bwotCXNlY3R5cGUuICBTZXQgc2VjdHlwZSBmaWVsZCByYXRoZXIgdGhhbiBsb2FkYWJsZSBmaWVsZC4gIFNldCBmbGFncwotCWZpZWxkIGJhc2VkIG9uIHNlY3R5cGUuCi0KLU1vbiBKdW4gMjQgMTI6MDA6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEZvcmNlIC5zdGFiKiBhbmQgLmNvbW1lbnQgc2VjdGlvbnMgdG8gc3RhcnQKLQlhdCAwLgotCi0JKiBjb25maWd1cmUuaW46IE9uIGFscGhhKi0qLW9zZiosIGxpbmsgYWdhaW5zdCBsaWJiZmQuYSBpZiBub3QKLQl1c2luZyBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMC4KLQotRnJpIEp1biAyMSAxNzo0MDo1NiAxOTk2ICBKb2VsIFNoZXJyaWxsICA8am9lbEBtZXJsaW4uZ2NzLnJlZHN0b25lLmFybXkubWlsPgotCi0JKiBjb25maWd1cmUudGd0OiBBZGQgc3VwcG9ydCBmb3IgKi0qLXJ0ZW1zKiBjb25maWd1cmF0aW9ucy4KLQotRnJpIEp1biAyMSAxMzowNTo1MSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlndXJlLnRndCAoYWxwaGEtKi1saW51eGVjb2ZmKik6IE5ldyB0YXJnZXQuCi0JKGFscGhhLSotbGludXgqKTogVXNlIGVsZjY0YWxwaGEuCi0JKiBlbXVscGFyYW1zL2VsZjY0YWxwaGEuc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBJZiBFTEZTSVpFIGlzIG5vdCBzZXQsIHNldCBpdCB0byAzMi4gIFVzZQotCSR7RUxGU0laRX0gcmF0aGVyIHRoYW4gMzIgd2hlbiBjYWxsaW5nIEJGRCByb3V0aW5lcy4KLQkoaG9sZF9yb2RhdGEpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBVc2UgaG9sZF9yb2RhdGEgZm9yIGEKLQlyZWFkb25seSBzZWN0aW9uIHRoYXQgaXMgbm90IGNvZGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBTZXQgaG9sZF9yb2RhdGEuICBEb24ndCB1c2UKLQlhIC5yZWwgc2VjdGlvbiB1bmxlc3MgaXRzIGJmZF9zZWN0aW9uIGZpZWxkIGlzIG5vdCBOVUxMLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGY2NGFscGhhLm8uCi0JKGVlbGY2NGFscGhhLmMpOiBOZXcgdGFyZ2V0LgotCi1GcmkgSnVuIDIxIDEyOjQ1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IENvcnJlY3QgaGFuZGxpbmcgb2YgMCBpbiAlVyBjYXNlLgotCi1UaHUgSnVuIDIwIDEzOjU1OjI4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUFkZCBlbm91Z2ggc3VwcG9ydCB0byB1bmRlcnN0YW5kIHRoZSBnY2Mgc3ZyMy5pZmlsZSBzY3JpcHQ6Ci0JKiBsZGxleC5sOiBSZWNvZ25pemUgQkxPQ0sgYW5kIEdST1VQIGluIEVYUFJFU1NJT04gY29udGV4dC4gIEFkZAotCUJJTkQga2V5d29yZC4KLQkqIGxkZ3JhbS55OiBBZGQgQklORCB0b2tlbi4KLQkoc2VjdGlvbik6IFJlY29nbml6ZSBHUk9VUC4KLQkob3B0X2V4dF93aXRoX3R5cGUpOiBSZWNvZ25pemUgYSBjb3VwbGUgb2YgY2FzZXMgb2YgQklORC4KLQkqIGxkbGFuZy5jIChpbml0X29zKTogRG9uJ3QgZG8gYW55dGhpbmcgaWYgc2VjdGlvbiBpcyBhbHJlYWR5Ci0JaW5pdGlhbGl6ZWQuICBDYWxsIGV4cF9pbml0X29zIG9uIGFkZHJfdHJlZSBmaWVsZC4KLQkoZXhwX2luaXRfb3MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zKTogQ2FsbCBleHBfaW5pdF9vcyBvbiBhc3NpZ25tZW50Ci0JZXhwcmVzc2lvbi4KLQkobGFuZ19wbGFjZV9vcnBoYW5zKTogQ2hlY2sgZm9yIGNvbW1vbiBzZWN0aW9ucyBieSBuYW1lIENPTU1PTgotCXJhdGhlciB0aGFuIGJ5IGNvbW1vbl9zZWN0aW9uIGZpZWxkLiAgRG9uJ3Qgd2FybiBhYm91dCBhYnNlbmNlIG9mCi0JW0NPTU1PTl0gY29tbWFuZC4KLQotCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBSZW1vdmUgdXNlbGVzcyBmaWVsZHMKLQljb21tb25fc2VjdGlvbiwgY29tbW9uX291dHB1dF9zZWN0aW9uLCBhbmQgY29tcGxhaW5lZCwgYXMgd2VsbCBhcwotCWFsbCByZWZlcmVuY2VzIHRvIHRoZW0uCi0KLQkqIGxkZXhwLmM6IFJlaW5kZW50IGEgbG90IG9mIGNvZGUuCi0JKGV4cF9mb2xkX3RyZWUpOiBDYWxsIEZBSUwgcmF0aGVyIHRoYW4gZWluZm8gaW4gZGVmYXVsdCBjYXNlLgotCi1XZWQgSnVuIDE5IDExOjQwOjE0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3QgKG04OCotKi1kZ3V4Kik6IFF1b3RlIEhPU1RJTkdfQ1JUMC4gIEZyb20KLQk8cmFuZGFsbC5ocm9uQG1lZGFwaGlzLmNvbT4uCi0KLVR1ZSBKdW4gMTggMTU6NTM6MDkgMTk5NiAgSmVmZnJleSBBLiBMYXcgIDxsYXdAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwcy5zYzogTmV3IGZpbGUgZm9yIEg4L1MuCi0JKiBlbXVscGFyYXJtcy9oODMwMHMuc2g6IE5ldyBmaWxlIGZvciBIOC9TLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIEg4L1MuCi0JKGVfaDgzMDBzLmMpOiBBZGQgZGVwZW5kZW5jaWVzLgotCSogY29uZmlndXJlLnRndDogQWRkIEg4L1MgdG8gdGFyZ19leHRyYV9lbXVscy4KLQotVHVlIEp1biAxOCAxNzo1NTozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKGlbMzQ1XTg2Ki0qLWlzYyopOiBOZXcgdGFyZ2V0LiAgRnJvbQotCTx1ZGRlYm9yZ0BjYXJtZW4uc2U+LgotCi1XZWQgSnVuIDEyIDEyOjQ2OjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGV4c3VwLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLSAJKHBhcnNlX2FyZ3MpOiBDb3B5IHRoZSAtWSBhcmd1bWVudCBpbnRvIG1lbW9yeS4KLSAJKHNldF9kZWZhdWx0X2Rpcmxpc3QpOiBEb24ndCBwdXQgdGhlICc6JyBiYWNrIGludG8gdGhlIGRpcmVjdG9yeQotCWxpc3QuCi0KLUZyaSBKdW4gIDcgMTE6Mjc6NDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IEluY2x1ZGUgbGliaWJlcnR5LmguCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKTogTmV3IHN0YXRpYyBmdW5jdGlvbiB0byBhZGQKLQlMRF9MSUJSQVJZX1BBVEggdG8gdGhlIGxpc3Qgb2Ygc2VhcmNoIGRpcmVjdG9yaWVzLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBBZGQgbmV3IHNldF9zeW1ib2xzIHJvdXRpbmUuCi0KLVRodSBKdW4gIDYgMTE6NTA6MzEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaCAoT1RIRVJfR09UX1NZTUJPTFMpOiBVc2UgQUxJR04oMTYpCi0JcmF0aGVyIHRoYW4gLiB3aGVuIGNvbXB1dGluZyBfZ3AgdmFsdWUuICBGcm9tIFBlciBGb2dlbHN0cm9tLgotCSogZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggKE9USEVSX0dPVF9TWU1CT0xTKTogTGlrZXdpc2UuCi0KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3QgY2xvc2UgYW5kIHVubGluayB0aGUgZmlsZSBvbiBlcnJvciwgc2luY2UKLQlyZW1vdmVfb3V0cHV0IHdpbGwgZG8gaXQgYW55aG93LgotCSogbGRsYW5nLmMgKG9wZW5fb3V0cHV0KTogU2V0IGJvb2xlYW4gdmFyaWFibGUgdG8gdHJ1ZSwgbm90IDEuCi0KLVdlZCBKdW4gIDUgMTg6MzQ6MTQgMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL3tlbGYzMmI0MzAwLnNoLGVsZjMybDQzMDAuc2h9IChTQ1JJUFRfTkFNRSk6IFVzZQotCWVsZm1pcHMgaW5zdGVhZCBvZiBlbGYuCi0KLVR1ZSBKdW4gIDQgMTg6NDM6MDcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGNyZWYuYzogTmV3IGZpbGUuCi0JKiBsZC5oIChhZGRfY3JlZiwgb3V0cHV0X2NyZWYpOiBEZWNsYXJlLgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIG5vdGljZV9hbGwgZmllbGQuICBJZiBpdCBpcyBzZXQgYXQKLQllbmQgb2YgbGluaywgY2FsbCBvdXRwdXRfY3JlZi4KLQkobm90aWNlKTogUmVuYW1lIGZyb20gbm90aWNlX3lzeW0uICBDaGVjayBub3RpY2VfYWxsLgotCSogbGRtaXNjLmMgKGZpbmZvKTogTWFrZSBnbG9iYWxseSB2aXNpYmxlLgotCSogbGRtaXNjLmggKGZpbmZvKTogRGVjbGFyZS4KLQkqIGxleHN1cC5jIChPUFRJT05fQ1JFRik6IERlZmluZS4KLQkobGRfb3B0aW9ucyk6IEFkZCAiY3JlZiIuCi0JKHBhcnNlX2FyZ3MpOiBIYW5kbGUgT1BUSU9OX0NSRUYuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCBsZGNyZWYuYy4KLQkoT0ZJTEVTKTogQWRkIGxkY3JlZi5vLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS1jcmVmLgotCi1UdWUgSnVuICA0IDEyOjEyOjI1IDE5OTYgIFRvbSBUcm9tZXkgIDx0cm9tZXlAY3NrMy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE1ha2UgJCh0b29sZGlyKSBhbmQgJCh0b29sZGlyKS9iaW4uCi0KLUZyaSBNYXkgMzEgMTI6NDA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKHNvcnRfc2VjdGlvbnMpOiBEb24ndCBhc3N1bWUgdGhhdCBhCi0Jd2lsZF9zdGF0ZW1lbnQgaGFzIGEgc2VjdGlvbiBuYW1lLgotCi1XZWQgTWF5IDI5IDEzOjEzOjM1IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmbWlwcy5zYzogUXVvdGUgdGVzdCAteiBhcmd1bWVudC4KLQotCSogbGQudGV4aW5mbzogQ2xhcmlmeSB0aGUgQ09OU1RSVUNUT1JTIGNvbW1hbmQuCi0KLVRodSBNYXkgMjMgMTY6MDc6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBJbml0aWFsaXplCi0JZmlsZSwgbm90IGltcGZpbGUuCi0KLVdlZCBNYXkgMjIgMTE6MzE6MzAgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiBEb24ndCBjb3B5IG92ZXIgU0VDX0xJTktfe09OQ0UsRFVQTElDQVRFU30KLQlpZiBmaW5hbCBsaW5rLgotCSogZW11bHRlbXBsL3BlLmVtIChzZnVuYyk6IFJlbmFtZWQgdG8gc29ydF9ieV9maWxlX25hbWUuCi0JKHNvcnRfYnlfc2VjdGlvbl9uYW1lLCBzb3J0X3NlY3Rpb25zXzEpOiBOZXcgZnVuY3Rpb25zLgotCShzb3J0X3NlY3Rpb25zKTogT25seSBzb3J0IGJ5IGZpbGUgbmFtZSBzZWN0aW9ucyBpbiAuaWRhdGEuCi0JQWRkICJHcm91cGVkIFNlY3Rpb25zIiBzdXBwb3J0LgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZXdyaXRlIHRvIHN1cHBvcnQgR3JvdXBlZAotCVNlY3Rpb25zLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogRGVsZXRlLgotCSogc2NyaXB0dGVtcGwvcGUuc2MgKC50ZXh0LC5kYXRhLC5yZGF0YSk6IEFkZCAqKC5mb29cJCkuCi0JKC5DUlQsLnJzcmMpOiBSZXdyaXRlIHRvIHVzZSBHcm91cGVkIFNlY3Rpb24gc3VwcG9ydC4KLQotVHVlIE1heSAyMSAxNDozMTo0OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1lcHBjbWFjLmM6IFVwZGF0ZSB0byByZWZsZWN0IGNoYW5nZXMgdG8gYWl4LmVtLgotCi1TdW4gTWF5IDE5IDE2OjU5OjQ0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAc2ViYS5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoZHByaW50X3N0YXRlbWVudCk6IFN0b3AgcHJpbnRpbmcgYXQgZW5kIG9mIGxpc3QuCi0KLVNhdCBNYXkgMTggMTM6MTI6MDUgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCVN1cHBvcnQgZm9yIC0tZm9yY2UtZXhlLXN1ZmZpeAotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZvcmNlX2V4ZV9zdWZmaXguCi0JKiBsZC50ZXhpbmZvOiBBZGQgZG9jdW1lbnRhdGlvbi4KLQkqIGxkbWFpbi5jIChtYWluKTogIEFkZCBzdXBwb3J0IGZvciBvcHRpb24uCi0JKiBsZXhzdXAuYyAoT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVgpOiBOZXcuCi0JKGxkX29wdGlvbnMsIHBhcnNlX2FyZ3MpOiAgQWRkIHN1cHBvcnQgZm9yIG9wdGlvbi4KLQotV2VkIE1heSAxNSAxMjo1MDoyNSAxOTk2ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoc2V0X3BlX3ZhbHVlKTogUGFzcyAwIG5vdCAxNiB0byBzdHJ0b3VsIGNhbGwuCi0KLUZyaSBNYXkgMTAgMTY6Mjg6NDQgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKF9fc3RhY2spOiBNYWtlIF9fc3RhY2sgMCBpZiBpdCB3YXMKLQlyZWZlcmVuY2VkIGJ1dCBub3QgZGVmaW5lZC4KLQotVGh1IE1heSAgOSAwODo1MjoyMyAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3tlbGYzMmJtaXAuc2gsZWxmMzJsbWlwLnNoLG1pcHNpZHQuc2gsbWlwc2lkdGwuc2h9OgotCVNldCBhIG5ldyB2YXJpYWJsZSB0byBzaWduaWZ5IGlmIHRoZSBmaW5hbCB0YXJnZXQgaXMgYW4gZW1iZWRkZWQKLQlzeXN0ZW0uCi0JKiBzY3JpcHR0ZW1wbC97bWlwcy5zYyxlbGZtaXBzLnNjfTogRG9uJ3QgYWRkIFNJWkVPRl9IRUFERVJTIHRvCi0JLnRleHQgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbS4KLQotVHVlIE1heSAgNyAxMDo1NjoxMSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogTmV3IGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogTmV3IGZ1bmN0aW9uLgotCShob2xkX3tzZWN0aW9uLHVzZSx0ZXh0LHJkYXRhLGRhdGF9KTogTmV3IHN0YXRpYyBsb2NhbHMuCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVwZGF0ZSBvcnBoYW4gZmllbGQuCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogV2hpdGVzcGFjZSBjbGVhbnVwLiAgU2VtaWNvbG9uIHVzYWdlIGNsZWFudXAuCi0JKElOSVQsRklOSSk6IERlbGV0ZSwgdW51c2VkLgotCSgudGV4dCk6IERvY3VtZW50IG9ycGhhbiAudGV4dC5mb28gc2VjdGlvbnMuCi0JKC5yZGF0YSk6IERvY3VtZW50IG9ycGhhbiAucmRhdGEuZm9vIHNlY3Rpb25zLgotCSguZGF0YSk6IERvY3VtZW50IG9ycGhhbiAuZGF0YS5mb28gc2VjdGlvbnMuCi0KLVR1ZSBNYXkgIDcgMTE6MzU6NDYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogUGxhY2UgIi50aW55IiBzZWN0aW9ucyByaWdodAotCWFmdGVyICIuZGF0YSIgc2VjdGlvbnMuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IFBsYWNlICIudGlueSIgc2VjdGlvbnMgaW50bwotCXRoZSAidGlueSIgbWVtb3J5IHJlZ2lvbiwgMHhmZjgwMDAgdGhyb3VnaCAweGZmZmYwMC4KLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IFNldCB0aGUgZW50cnkgcG9pbnQgdG8gdGhlIHZhbHVlIG9mCi0JIl9zdGFydCIgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQuCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IExpa2V3aXNlLgotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogUGxhY2UgLnJvZGF0YSBzZWN0aW9ucyBiZWZvcmUgLnRleHQKLQlzZWN0aW9ucyBpbiBtYWluIHJhbS4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCi0KLU1vbiBNYXkgIDYgMjM6MzI6MzAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMGguc2M6IFVzZSAiZWlnaHQiLCBub3QgImVpZ2h0Yml0IiBmb3IgdGhlCi0JOC1iaXQgcmVnaW9uIGFuZCA4LWJpdCBzZWN0aW9ucy4KLQotV2VkIE1heSAgMSAxNzo1MDowNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IEZpeCB0eXBvcy4KLQotTW9uIEFwciAyOSAyMDozMTowNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLmVuZGp1bmspOiBEZWZpbmUgX19lbmRfXy4KLQotTW9uIEFwciAyOSAxNzowNToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsb25nZXN0X3NlY3Rpb25fbmFtZSk6IFJlbW92ZS4KLQkoU0VDVElPTl9OQU1FX01BUF9MRU5HVEgpOiBEZWZpbmUuCi0JKHByaW50X3NpemUsIHByaW50X2FsaWdubWVudCwgcHJpbnRfZmlsbCwgcHJpbnRfc2VjdGlvbik6IFJlbW92ZS4KLQkocHJpbnRfZmxhZ3MpOiBSZW1vdmUuCi0JKGxhbmdfbWFwKTogUmV3cml0ZS4KLQkocHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfYXNzaWdubWVudCk6IFJld3JpdGUuCi0JKHByaW50X29uZV9zeW1ib2wpOiBSZXdyaXRlLgotCShwcmludF9pbnB1dF9zZWN0aW9uKTogUmV3cml0ZS4KLQkocHJpbnRfZmlsbF9zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF9kYXRhX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X2FkZHJlc3Nfc3RhdGVtZW50KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkocHJpbnRfcmVsb2Nfc3RhdGVtZW50KTogUmV3cml0ZS4KLQkocHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQpOiBSZXdyaXRlLgotCShwcmludF93aWxkX3N0YXRlbWVudCk6IFJld3JpdGUuCi0JKHByaW50X3N0YXRlbWVudF9saXN0KTogQ2xlYW4gdXAuCi0JKHByaW50X3N0YXRlbWVudCk6IENsZWFuIHVwLiAgU29tZSBtaW5vciBvdXRwdXQgY2hhbmdlcy4KLQkocHJpbnRfc3RhdGVtZW50cyk6IENsZWFuIHVwLgotCShsb2FkX3N5bWJvbHMpOiBQdXQgYW5vdGhlciAtIGJlZm9yZSAtd2hvbGUtYXJjaGl2ZS4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90cmVlKTogQ2hhbmdlIGV0cmVlX3ZhbHVlIGFuZCBldHJlZV9yZWwgdG8KLQlwcmludCAweCBhbmQgdG8gb21pdCBsZWFkaW5nIHplcm9lcy4gIEZvciBldHJlZV9yZWwsIHVzZSAlQiB0bwotCXByaW50IHRoZSBCRkQuICBGb3IgZXRyZWVfYXNzaWduLCByZW1vdmUgdGhlIHNwYWNlIGFmdGVyIHRoZQotCWRlc3RpbmF0aW9uIG5hbWUuCi0JKiBsZHdyaXRlLmM6IEluY2x1ZGUgImxpYmliZXJ0eS5oIi4KLQkoY2xvbmVfc2VjdGlvbik6IENhbGwgeHN0cmR1cCwgbm90IHN0cmR1cC4KLQkobGR3cml0ZSk6IERvbid0IHByaW50IGFueSBtYXAgaW5mb3JtYXRpb24uCi0JKHByaW50X3N5bWJvbF90YWJsZSwgcHJpbnRfZmlsZV9zdHVmZiwgcHJpbnRfc3ltYm9sKTogUmVtb3ZlLgotCSogbGRtYWluLmMgKG1haW4pOiBDYWxsIGxhbmdfbWFwIHdoZW4gYXBwcm9wcmlhdGUuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQWRkIHN1cHBvcnQgZm9yICVXLgotCShwcmludF9hZGRyZXNzKTogUmVtb3ZlLgotCSogbGRtaXNjLmggKHByaW50X2FkZHJlc3MpOiBEb24ndCBkZWNsYXJlLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1Nb24gQXByIDI5IDEwOjI5OjA3IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTY4Ki0qLWxpbnV4Kik6IEFkZCAtZHluYW1pYy1saW5rZXIgdG8KLSAJSE9TVElOR19DUlQwLiAgU2VhcmNoIC1sZ2NjIGJvdGggYmVmb3JlIGFuZCBhZnRlciAtbGMgaW4KLSAJSE9TVElOR19MSUJTLiAgTG9vayBmb3IgY3J0e2JlZ2luLGVuZH0ubyBpbiB0aGUgY29tcGlsZXIgZGlyZWN0b3J5Ci0gCWF0IGZpcnN0LgotCShpWzM0NV04Ni0qLWxpbnV4Kik6IExvb2sgZm9yIGNydHtiZWdpbixlbmR9Lm8gaW4gdGhlIGNvbXBpbGVyCi0JZGlyZWN0b3J5IGF0IGZpcnN0LgotCi1GcmkgQXByIDI2IDE0OjQyOjI3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtaXNjLmggKGRlbWFuZ2xlKTogRGVjbGFyZS4KLQkqIGxkbWlzYy5jOiBJbmNsdWRlICJsaWJpYmVydHkuaCIuICBJbmNsdWRlIGRlbWFuZ2xlLmggd2l0aCAiIiwKLSAJbm90IDw+LgotCShkZW1hbmdsZSk6IE1ha2Ugbm9uLXN0YXRpYy4gIFJlbW92ZSByZW1vdmVfdW5kZXJzY29yZSBwYXJhbXRlci4KLQlBbHdheXMgcmV0dXJuIGFuIGFsbG9jYXRlZCBzdHJpbmcuCi0JKHZmaW5mbyk6IEZyZWUgcmVzdWx0IG9mIGRlbWFuZ2xlLiAgQWRkIGNhc2UgJ0cnLiAgVXNlICVUIHRvIHByaW50Ci0JZnVuY3Rpb25uYW1lLCByYXRoZXIgdGhhbiBjYWxsaW5nIGRlbWFuZ2xlLiAgUHJpbnQgYSBjb2xvbiBiZXR3ZWVuCi0JdGhlIEJGRChzZWN0aW9uK29mZnNldCkgYW5kIHRoZSBsaW5lIG51bWJlci4KLQkqIGxkbWFpbi5jIChhZGRfYXJjaGl2ZV9lbGVtZW50KTogSW1wcm92ZSBmb3JtYXQgb2YgYXJjaGl2ZQotCWluZm9ybWF0aW9uIGluIG1hcCBmaWxlLgotCShjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IERvbid0IHByaW50IGFueXRoaW5nIHRvIHRoZSBtYXAgZmlsZS4KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBJbXByb3ZlIGZvcm1hdCBvZiBjb21tb24gc3ltYm9sCi0JaW5mb3JtYXRpb24gaW4gbWFwIGZpbGUuCi0JKiBsZGN0b3IuYyAobGRjdG9yX2J1aWxkX3NldHMpOiBJZiBwcm9kdWNpbmcgYSBtYXAgZmlsZSwgcHJpbnQgc2V0Ci0JaW5mb3JtYXRpb24uCi0JKiBsZHdyaXRlLmMgKHByaW50X3N5bWJvbF90YWJsZSk6IFByaW50IGEgbmV3bGluZSBiZWZvcmUgdGhlCi0JaGVhZGVyIGluIHRoZSBtYXAgZmlsZS4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IFJlaW5kZW50LgotCi1Nb24gQXByIDIyIDEyOjA3OjMyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IElmIF9jb29rZWRfc2l6ZSBpcyBub3QgMCwgdGhlbgotCWRvbid0IGNsb2JiZXIgaXQgd2hlbiBub3QgcmVsYXhpbmcuCi0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogUmVtb3ZlIHRyYWRpdGlvbmFsX2Zvcm1hdCBmaWVsZC4KLQkqIGxkbWFpbi5jIChtYWluKTogVXNlIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgcmF0aGVyIHRoYW4KLQljb25maWcudHJhZGl0aW9uYWxfZm9ybWF0LgotCSogbGRsYW5nLmMgKGxkbGFuZ19vcGVuX291dHB1dCk6IExpa2V3aXNlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQkqIG1wdy1lcHBjbWFjLmMgKGdsZHBwY21hY29zX3BhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IERpc2NhcmQgZGVidWdnaW5nIHNlY3Rpb25zIGlmIHdlIGFyZQotCXN0cmlwcGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLQkqIGVtdWxwYXJhbXMvejgwMDIuc2ggKEFSQ0gpOiBTZXQgdG8gejgwMDIsIG5vdCB6OGsuCi0KLVR1ZSBBcHIgMTYgMTY6Mzg6MzIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IENvcnJlY3QgaGFuZGxpbmcgb2Ygc3VidHJhY3Rpb24gd2l0aAotCWFic29sdXRlIHZhbHVlcy4KLQkoZm9sZF9uYW1lKTogUGVybWl0IHN5bWJvbHMgaW4gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0uCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IE9ubHkgUFJPVklERSBfX3N0YWNrIHdoZW4gUkVMT0NBVElORy4gIFVuZG8KLQlhY2NpZGVudGFsIGNoYW5nZXMgaW4gbGFzdCBwYXRjaC4KLQotVHVlIEFwciAxNiAxMDoyNTo0MiAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHBvd2VycGMqLSote3N5c3YsbGludXh9KTogQWRkIGFsaWFzZXMuCi0JKHBvd2VycGNsZSotKi17c3lzdixzb2xhcmlzfSk6IERpdHRvLgotCi1Nb24gQXByIDE1IDE0OjUwOjU2IDE5OTYgIFJvYiBTYXZveWUgIDxyb2JAY2hpbmFkb2xsLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IEFkZCBQUk9WSURFIChfX3N0YWNrID0gMCkgc28gSSBjYW4gdXNlIGl0Ci0JaW4gbTY4ay9jcnQwLlMgd2l0aG91dCB0aGluZ3MgYmxvd2luZyB1cC4KLQotRnJpIEFwciAxMiAxNjo0MDo1NiAxOTk2ICBSb2IgU2F2b3llICA8cm9iQGNoaW5hZG9sbC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogUmVtb3ZlIGRlZmF1bHQgYWRkcmVzcyBmb3IgLmRhdGEgc28KLQkudGV4dCwgLmRhdGEsIGFuZCAuYnNzIGFyZSBhbGwgc2VxdWVudGlhbC4KLQotVGh1IEFwciAxMSAxMjowNTozNSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjOiBSZW1vdmUgcmVnaW9ucyBhbmQgc2ltcGxpZnkuCi0KLVdlZCBBcHIgMTAgMTQ6NDE6NTMgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogQWRkIHRoZSAiOC1iaXQgYXJlYSIgaW4gdGhlIHVwcGVyIDI1NgotCWJ5dGVzIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiAgUHV0IGRhdGEgZnJvbSB0aGUgIi5laWdodCIgc2VjdGlvbnMKLQlpbnRvIHRoZSA4LWJpdCBhcmVhLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotVHVlIEFwciAgOSAxNDoxMDo0MiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKToKLQlQYXNzICRBUkNIIHRvIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggaW5zdGVhZCBvZiBzZXR0aW5nCi0JbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgZGlyZWN0bHkuCi0KLVR1ZSBBcHIgIDkgMTQ6MjI6MTUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKC5pbml0LC5maW5pKTogUHV0IC5pbml0LCAuZmluaSBzZWN0aW9uCi0JbmV4dCB0byAudGV4dC4gIFB1dCBfZXRleHQgYWZ0ZXIgLnRleHQsIC5pbml0LCAuZmluaSwgYW5kCi0JLnJvZGF0YXssMn0gc2VjdGlvbnMuCi0KLVR1ZSBBcHIgIDkgMTI6MTg6NTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBSZWFycmFuZ2Ugb3B0aW9uIGRvY3VtZW50YXRpb24uCi0KLQkqIGxleHN1cC5jIChsZF9vcHRpb25zKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocGFyc2VfYXJncyk6IEJ1aWxkIHNob3J0b3B0cyBhbmQgbG9uZ29wdHMgZnJvbSBsZF9vcHRpb25zIGFycmF5LgotCShoZWxwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkqIGxkdmVyLmggKGhlbHApOiBEb24ndCBkZWNsYXJlLgotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogUmVpbmRlbnQuCi0JKGhlbHApOiBSZW1vdmUuCi0KLQkqIGxkLnRleGluZm8sIGxkLjE6IE1lbnRpb24gLUUgYXMgYSBzeW5vbnltIGZvciAtZXhwb3J0LWR5bmFtaWMuCi0KLU1vbiBBcHIgIDggMTE6NTY6MjMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IFdoZW4gY2hlY2tpbmcgZm9yIGEgbmF0aXZlIGVtdWxhdGlvbiwgY2hlY2sKLQl0aGF0IHRoZSBjdXJyZW50IGVtdWxhdGlvbiBpcyB0aGUgZGVmYXVsdCBlbXVsYXRpb24uCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IExpa2V3aXNlLgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBBZGQgLUUgYXMgYSBzeW5vbnltIGZvciAtZXhwb3J0LWR5bmFtaWMsCi0JZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkuCi0KLUZyaSBBcHIgIDUgMTQ6MzA6MTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYpOiBOZXcKLQlzdGF0aWMgZnVuY3Rpb24sIGlmICR7aG9zdH0gPSAke3RhcmdldH0uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBDYWxsIGNoZWNrX2xkX3NvX2NvbmYgdG8gZmluZCBhCi0JbmVlZGVkIHNoYXJlZCBsaWJyYXJ5IGlmICR7aG9zdH0gPSAkW3RhcmdldH0uCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni0qLWxpbnV4Kik6IEFkZCAtZHluYW1pYy1saW5rZXIgdG8KLQlIT1NUSU5HX0NSVDAuICBTZWFyY2ggLWxnY2MgYm90aCBiZWZvcmUgYW5kIGFmdGVyIC1sYyBpbgotCUhPU1RJTkdfTElCUy4KLQotCSogY29uZmlndXJlLnRndDogQWRkIGlbMzQ1XTg2LSotZnJlZWJzZGVsZiogdGFyZ2V0OyBmcm9tIEpvaG4KLQlQb2xzdHJhIDxqZHBAcG9sc3RyYS5jb20+LgotCi1GcmkgQXByICA1IDE4OjExOjI1IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogZW11bHBhcmFtcy9lbGYzMntiLGx9NDMwMC5zaCAoTUFDSElORSk6IEFkZCBleHBsaWNpdAotIAlhcmNoaXRlY3R1cmUgbnVtYmVyLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgJE1BQ0hJTkUgZGVmaW5pdGlvbiBpZiBwcmVzZW50LgotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEZvcmNlIDQxMDAgYnVpbGQgdG8gdXNlIHNhbWUKLSAJdGVtcGxhdGUgYXMgNDMwMC4KLQotTW9uIEFwciAgMSAxNzozNTo0MCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBDaGFuZ2UgcmVnaW9uIGNoZWNrIHRvIGhhbmRsZQotCXJlZ2lvbnMgd2hpY2ggZW5kIGF0IHRoZSBoaWdoZXN0IHBvc3NpYmxlIGFkZHJlc3MgY29ycmVjdGx5LgotCUZyb20gUm9sYW5kIFdlYmVyIDxyb3dlYmVyQGlyYS51a2EuZGU+LgotCi0JKiBsZGxhbmcuYyAoc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHdpbGRfZG9pdCk6IERpc2NhcmQgc2VjdGlvbnMgd2l0aCBTRUNfRVhDTFVERSBzZXQgaWYgbm90IGRvaW5nIGEKLQlyZWxvY2F0ZWFibGUgbGluay4gIERvbid0IHdvcnJ5IGFib3V0IHNlY3Rpb24gYmVpbmcgTlVMTCwgc2luY2UgaXQKLQluZXZlciBzaG91bGQgYmUuICBEb24ndCBjYWxsIGluaXRfb3MgdW5sZXNzIHRoZSBzZWN0aW9uIGlzIGdvaW5nCi0JdG8gYmUgYWRkZWQuCi0JKGxkbGFuZ19hZGRfZmlsZSk6IENhbGwgc2VjdGlvbl9hbHJlYWR5X2xpbmtlZCBmb3IgZWFjaCBzZWN0aW9uLgotCSogbGRtYWluLmMgKG11bHRpcGxlX2RlZmluaXRpb24pOiBEb24ndCB3YXJuIGFib3V0IG11bHRpcGxlCi0JZGVmaW5pdGlvbnMgaW4gc2VjdGlvbnMgd2hpY2ggYXJlIGJlaW5nIGRpc2NhcmRlZC4KLQotU3VuIE1hciAzMSAwMDozMDo0NyAxOTk2ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC97cHBjcGUuc2MsIHBlLnNjfSAoLmp1bmspOiBSZW1vdmUgYW5kIHVzZSAvRElTQ0FSRC8uCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGluaXQpOiBSZW1vdmUgc3BlY2lhbCBjYXNlIFBQQyBjb2RlLgotCi1GcmkgTWFyIDI5IDAwOjAxOjI5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaDgzMDAuc2M6IE1ha2UgdmVjdG9ycyBzZWN0aW9uIDB4YzQgYnl0ZXMgbG9uZwotCXNvIGFzIG5vdCB0byBvdmVyd3JpdGUgdGhlIG1hZ2ljIHN5c2NhbGwgZW50cnkgYXQgMHhjNC4KLQkqIHNjcmlwdHRlbXBsL2g4MzAwaC5zYzogTGlrZXdpc2UuCi0KLVRodSBNYXIgMjggMTE6MDU6NDcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoc3BhcmM2NC0qLXNvbGFyaXMyKik6IERlbGV0ZS4KLQlTdGljayB3aXRoIHNwYXJjLSotc29sYXJpczIqLgotCi1XZWQgTWFyIDI3IDEyOjMzOjI0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAoRElTQ0FSRF9TRUNUSU9OX05BTUUpOiBEZWZpbmUgdG8gIi9ESVNDQVJELyIuCi0JKiBsZGxhbmcuYyAoaW5pdF9vcyk6IEZhaWwgb24gYW4gYXR0ZW1wdCB0byBpbml0aWFsaXplIGFueSBzZWN0aW9uCi0JbmFtZWQgRElTQ0FSRF9TRUNUSU9OX05BTUUuCi0JKHdpbGRfZG9pdCk6IERpc2NhcmQgaW5wdXQgc2VjdGlvbnMgYXNzaWduZWQgdG8gYW4gb3V0cHV0IHNlY3Rpb24KLQluYW1lZCBESVNDQVJEX1NFQ1RJT05fTkFNRS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IHVzZSBvZiAvRElTQ0FSRC8uCi0KLQkqIGxkbGFuZy5jOiBGaXggc29tZSBpbmRlbnRhdGlvbiBhbmQgY29tbWVudHMuCi0KLVR1ZSBNYXIgMjYgMTg6MTQ6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgYmZkX3NldF9lcnJvcl9wcm9ncmFtX25hbWUuCi0KLVRodSBNYXIgMjEgMTM6MTc6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC50ZXhpbmZvOiBGaXggYSBjb3VwbGUgb2YgaW5kZXhpbmcgZW50cmllcy4gIE1lbnRpb24gdGhhdAotCS0tdmVyYm9zZSBkaXNwbGF5cyBidWlsdGluIGxpbmtlciBzY3JpcHRzLgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogY2FzZSAnSSc6IElmIHRoZSBmaWxlIGlzIG5vdCBpbiBhbiBhcmNoaXZlLAotCWFuZCB0aGUgbG9jYWwgc3ltYm9sIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIGZpbGVuYW1lLCBwcmludCB0aGUKLQlmaWxlbmFtZSBhcyB3ZWxsLgotCi0JUGF0Y2hlcyBmcm9tIEpvaG4gUG9sc3RyYSA8amRwQHBvbHN0cmEuY29tPiBmb3IgRnJlZUJTRCBFTEY6Ci0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IC1Cc2hhcmVhYmxlIGlzIGEgc3lub255bSBmb3IgLXNoYXJlZC4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IE1ha2UgdGhlIHNhbWUKLQlhcyBURVhUX1NUQVJUX0FERFIuCi0KLVdlZCBNYXIgMjAgMTg6MTg6MjUgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLnRleGluZm86IEZpeCB0eXBvcy4gIFVzZSBAcHhyZWYgb25seSBpbnNpZGUgcGFyZW50aGVzZXMuCi0KLVdlZCBNYXIgMjAgMTY6NTY6MTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAoYWRkX3dyYXApOiBOZXcgZnVuY3Rpb24uCi0JKiBsZG1haW4uaCAoYWRkX3dyYXApOiBEZWNsYXJlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBDYWxsIGFkZF93cmFwLgotCi1UdWUgTWFyIDE5IDE2OjQ0OjIwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChzcGFyYyotKi1zb2xhcmlzMiogaG9zdCk6IEFjY2VwdCBhbnkgc3BhcmMgdmFyaWFudC4KLQotV2VkIE1hciAxMyAxNzo0NzozMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBDaGFuZ2UgbmFtZSBvZiBwYWdlIHplcm8gbWVtb3J5Ci0JZnJvbSAibnVsbCIgdG8gInZlY3RvcnMiLiAgQ3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIGZvcgotCXZlY3RvcnMuICBBZGQgY29tbWVudHMgb24gaG93IHRvIGV4cGxpY2l0bHkgcGxhY2UgaXRlbXMKLQlpbiB0aGUgdmVjdG9yIHRhYmxlLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBMaWtld2lzZS4KLQotV2VkIE1hciAxMyAxMjo0MDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9sbms5NjAuZW0gKG1hY2hpbmVfdGFibGUpOiBBZGQganggYW5kIGh4LgotCi0JKiBnZW5zY3JpcHRzLnNoOiBEb24ndCB1c2UgJHs5Oi14eH0sIHNpbmNlIFVsdHJpeCAvYmluL3NoIGRvZXNuJ3QKLQlzdXBwb3J0IGl0LgotCi1UdWUgTWFyIDEyIDEyOjQzOjU5IDE5OTYgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGtvYWxhLmF6c3Rhcm5ldC5jb20+Ci0KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIHdhcm5fbXVsdGlwbGVfZ3AgZmllbGQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtLXdhcm4tbXVsdGlwbGUtZ3AuCi0JKiBsZG1haW4uYyAod2FybmluZ19jYWxsYmFjayk6IFN1cHByZXNzIG11bHRpcGxlIGdwIHZhbHVlcyB3YXJuaW5nCi0JaWYgLS13YXJuX211bHRpcGxlX2dwIHdhcyBub3QgdXNlZC4KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IC0td2Fybi1tdWx0aXBsZS1ncC4KLQotVHVlIE1hciAxMiAxMjowMjoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0td3JhcC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBsaW5rX2luZm8ud3JhcF9oYXNoLgotCSogbGRleHAuYyAoZm9sZF9uYW1lKTogVXNlIGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgaW4gREVGSU5FRAotCWFuZCBOQU1FIGNhc2VzLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS13cmFwLgotCi0JKiBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjguCi0KLQlEb24ndCBkbyBTdW5PUyBzdHlsZSBkeW5hbWljIGxpbmtpbmcgZm9yIHNwYXJjLWFvdXQ6Ci0JKiBjb25maWd1cmUudGd0IChzcGFyYzY0LSotYW91dCopOiBVc2Ugc3BhcmNhb3V0LCBub3Qgc3VuNC4KLQkoc3BhcmNsaXRlKi1mdWppdHN1LSosIHNwYXJjKi0qLWFvdXQpOiBMaWtld2lzZS4KLQkoc3BhcmMqLXdycy12eHdvcmtzKik6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9zcGFyY2FvdXQuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVzcGFyY2FvdXQuby4KLQkoZXNwYXJjYW91dC5jKTogTmV3IHRhcmdldC4KLQotV2VkIE1hciAgNiAxNjowNjo1MiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYyAoLnNkYXRhMiwgLnNic3MyKTogSW1wbGVtZW50IEZlYiAyIGNoYW5nZQotIAlpbiBhIGRpZmZlcmVudCBtYW5uZXIgdG8gd29yayBhcm91bmQgZGlmZmVyZW5jZXMgaW4gc2hlbGwgdmFyaWFibGUKLSAJZXhwYW5zaW9uLgotCi1XZWQgTWFyICA2IDE4OjA4OjE4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmggKGxkZW11bF91bnJlY29nbml6ZWRfZmlsZSk6IERlY2xhcmUuCi0JKGxkZW11bGF0aW9uX3hmZXJfdHlwZSk6IEFkZCB1bnJlY29nbml6ZWRfZmlsZSBmaWVsZC4KLQkqIGxkZW11bC5jIChsZGVtdWxfdW5yZWNvZ25pemVkX2ZpbGUpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuYyAobG9hZF9zeW1ib2xzKTogSWYgYSBmaWxlIGNhbiBub3QgYmUgcmVjb2duaXplZCwgY2FsbAotCWxkZW11bF91bnJlY29nbml6ZWRfZmlsZSBiZWZvcmUgdHJ5aW5nIGl0IGFzIGEgbGlua2VyIHNjcmlwdC4KLQkqIGFpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUpOiBOZXcgc3RhdGljCi0JZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSk6IFVzZSBGT1BFTl9SVCwgbm90ICJyIi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogSW5pdGlhbGl6ZSB1bnJlY29nbml6ZWRfZmlsZS4KLQotTW9uIE1hciAgNCAxNDoxMToxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jICh3aWxkKTogSGFuZGxlIGZvby5hKC50ZXh0KSBieSBtYXBwaW5nIGVhY2ggaW5jbHVkZWQKLQltZW1iZXIgb2YgZm9vLmEgc2VwYXJhdGVseS4gIEZyb20gSm91a2UgTnVtYW4gPGpudW1hbkBiYXppcy5ubD4uCi0KLUZyaSBNYXIgIDEgMTA6MjQ6NTkgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCk6Ci0JU2VhcmNoIHRyaW5hcnkuY29uZCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdHJpbmFyeS5saHMgdHdpY2UuCi0KLVR1ZSBGZWIgMjcgMTU6MDg6NDMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEVkaXQgb3V0IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQuCi0JKEBURElSU0ApOiBFZGl0IG91dCwgY2FuJ3QgdXNlIGdlbnNjcmlwdHMuCi0KLVR1ZSBGZWIgMjcgMTU6MDk6MjEgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKG02OGstKi1saW51eGFvdXQqLCBtNjhrLSotbGludXgqKTogTmV3IHRhcmdldHMuCi0JKiBlbXVscGFyYW1zL202OGtsaW51eC5zaDogTmV3IGZpbGUuCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlDYWxsIGJmZF8ke0VNVUxBVElPTl9OQU1FfV9zaXplX2R5bmFtaWNfc2VjdGlvbnMgaW5zdGVhZCBvZgotCWJmZF9saW51eF9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW02OGtsaW51eC5vLgotCShlbTY4a2xpbnV4LmMpOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmhvc3QgKG02OCotKi1saW51eGFvdXQqLCBtNjgqLSotbGludXgqKTogTmV3IGhvc3RzLgotCi1UdWUgRmViIDI3IDEyOjU1OjQ2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogU29ydCBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4KLQlGaWxsIGluIG1pc3NpbmcgZW50cmllcy4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLS1uby13aG9sZS1hcmNoaXZlLgotCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBBZGQgd2hvbGVfYXJjaGl2ZSBmaWVsZC4KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBTZXQgd2hvbGVfYXJjaGl2ZSBmaWVsZC4KLQkobG9hZF9zeW1ib2xzKTogQ2hlY2sgaW5wdXQgZmlsZSBzcGVjaWZpYyB3aG9sZV9hcmNoaXZlIGZpZWxkCi0JcmF0aGVyIHRoYW4gZ2xvYmFsIHZhcmlhYmxlLgotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLS1uby13aG9sZS1hcmNoaXZlLgotCi1UdWUgRmViIDIwIDE2OjA3OjAwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndDogQ29ycmVjdCBnbGRpOTYwIHRvIGdsZDk2MC4KLQotTW9uIEZlYiAxOSAxMToxNjo0NCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTogQ2hlY2sKLQl0aGUgU09OQU1FIGlmIGl0IGlzIGF2YWlsYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOiBVc2UgdGhlIFNPTkFNRSwgbm90IHRoZQotCWZpbGVuYW1lLCB3aGVuIGNoZWNraW5nIGZvciBjb25mbGljdGluZyBsaWJyYXJ5IHZlcnNpb25zLiAgRG9uJ3QKLQlhc3N1bWUgdGhhdCB0aGUgc3VmZml4IGlzIG9ubHkgbnVtYmVycyBhbmQgZG90cy4KLQotCSogbGQudGV4aW5mbzogTWVudGlvbiB0aGF0IC1SIGNhbiBiZSB1c2VkIGZvciAtcnBhdGguCi0KLVN1biBGZWIgMTggMTU6MDU6MTcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdDogQ2hlY2sgZm9yICdkbyBub3QgbWl4JyBmcm9tIG5hdGl2ZSBsaW5rZXIgYmVmb3JlCi0JdHJ5aW5nIHRvIHVzZSAtcnBhdGguCi0KLVRodSBGZWIgMTUgMTM6NTg6MDYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFJlbW92ZSBleHBsaWNpdCBzdWJzdGl0dXRpb24gb2YgQ0ZMQUdTOyBhdXRvY29uZgotCWRvZXMgaXQgYW55aG93LgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKExERkxBR1MpOiBTZXQgdG8gQExERkxBR1NALgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQyBiZWZvcmUgY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogUmVtb3ZlIGdvMzIgaG9zdCwgc2luY2UgaXQgc2hvdWxkIG5vIGxvbmdlciBiZQotCW5lY2Vzc2FyeS4gIERvbid0IHNldCBDQyBmb3Igcm9tcCBob3N0LgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IERvbid0IHNraXAgYSBwYWdlIGluIHZpcnR1YWwgbWVtb3J5IHNwYWNlIGlmCi0JdGhlIHRleHQgc2VnbWVudCBlbmRzIGV4YWN0bHkgb24gYSBwYWdlIGJvdW5kYXJ5LgotCi0JKiBjb25maWd1cmUuaW46IFN1YnN0aXR1dGUgUlBBVEhfRU5WVkFSLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlndXJlLmhvc3Q6IFNldCBSUEFUSF9FTlZWQVIuCi0JKiBNYWtlZmlsZS5pbiAoUlBBVEhfRU5WVkFSKTogTmV3IHZhcmlhYmxlLgotCShjaGVjayk6IFVzZSAkKFJQQVRIX0VOVlZBUikgcmF0aGVyIHRoYW4gTERfTElCUkFSWV9QQVRILgotCi1XZWQgRmViIDE0IDE4OjQ5OjAxIDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogY29uZmlndXJlLmluOiBSZWRvIGVtdWxhdGlvbiBoYW5kbGluZyBzbyB0aGF0IGVhY2ggZW11bGF0aW9uCi0Jc2VhcmNoZXMgdGhlIGNvcnJlY3QgdG9vbCBkaXJlY3RvcnksIGJhc2VkIG9uIHRoZSB0YXJnZXQgYWxpYXMuCi0JRm9yIGV4YW1wbGUsICJjb25maWd1cmUgLS1lbmFibGUtdGFyZ2V0cz1tNjhrLWNvZmYgaTM4Ni1saW51eCIKLQl3aWxsIHNlYXJjaCAvdXNyL2xvY2FsL2kzODYtbGludXgvbGliIGZvciBsaW51eCBhbmQKLQkvdXNyL2xvY2FsL202OGstY29mZi9saWIgZm9yIG02OGstY29mZi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZCBzcGVjaWFsIHRkaXIgc2V0dGluZ3MgZm9yIExpbnV4LgotCSogTWFrZWZpbGUuaW46IEFkZCBAVERJUlNALiAgUGFzcyAiJCh0ZGlyX0VNVUwpIiB0byAke0dFTlNDUklQVFN9Ci0JZm9yIGVhY2ggZUVNVUwuYyB0YXJnZXQuCi0JKiBnZW5zY3JpcHRzLnNoOiBBY2NlcHQgc3BlY2lmaWMgYWxpYXMgYXMgOXRoIGFyZ3VtZW50LCBhbmQgdXNlIGl0Ci0JaW4gTElCX1BBVEguCi0KLVdlZCBGZWIgMTQgMTY6Mzg6MzYgMTk5NiAgTWFydGluIEFuYW50aGFyYW1hbiAgPG1hcnRpbkBtYWlsLmltZWNoLnVuaS1kdWlzYnVyZy5kZT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2V0X3N0YXJ0b2YpOiBEb24ndCBkbyBhbnl0aGluZyBmb3IgYQotCXJlbG9jYXRlYWJsZSBsaW5rLgotCi0JKiBsZGdyYW0ueSAobXJpX3NjcmlwdF9maWxlKTogQ2FsbCBtcmlfZHJhd190cmVlLgotCSogbXJpLmMgKG1yaV9kcmF3X3RyZWUpOiBNYWtlIGdsb2JhbGx5IHZpc2libGUuICBEb24ndCBib3RoZXIgdG8KLQljcmVhdGUgbWVtb3J5IHJlZ2lvbnMuCi0JKG1yaV9sb2FkKTogRG9uJ3QgY2FsbCBtcmlfZHJhd190cmVlLgotCSogbXJpLmggKG1yaV9kcmF3X3RyZWUpOiBEZWNsYXJlLgotCi0JKiBjb25maWd1cmUudGd0IChtNjgqLSotcHNvcyk6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL202OGtwc29zLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3Bzb3Muc2M6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVtNjhrcHNvcy5vLgotCShlbTY4a3Bzb3MuYyk6IE5ldyB0YXJnZXQuCi0KLVdlZCBGZWIgMTQgMTE6MDk6MjUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUudGd0ICgqLSotaWVlZSopOiBOZXcgdGFyZ2V0OyB1c2UgdmFuaWxsYS4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UpOiBTdHJpcAotCWA6Zm9vJyBmcm9tICR7QVJDSH0uCi0KLVR1ZSBGZWIgMTMgMTU6NTg6NTggMTk5NiAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBzbmFrZS5jcy51dGFoLmVkdT4KLQotCSogc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjOiBEb24ndCBwYWQgdGhlIC50ZXh0IHNlY3Rpb24uICBQdXQKLQkucm9kYXRhIGluIC5kYXRhLgotCi1UdWUgRmViIDEzIDE0OjA0OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmhvc3Q6IFNldCBIRExGTEFHUyBmb3IgKi0qLWhwdXggd2l0aCAtLWVuYWJsZS1zaGFyZWQuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOiBXYXJuIGlmCi0JaXQgbG9va3MgbGlrZSB3ZSBtaWdodCBiZSBsaW5raW5nIGluIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlCi0Jc2FtZSBzaGFyZWQgbGlicmFyeS4gIEJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBIIEogTHUgPGhqbEB6b29tLmNvbT4uCi0KLVRodSBGZWIgIDggMTk6MjU6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogSW5jcmVtZW50IHRoZSBzZWN0aW9uIHNpemUgd2hlbiBhCi0JcGFkZGluZyBzdGF0ZW1lbnQgaXMgZW5jb3VudGVyZWQuCi0KLVdlZCBGZWIgIDcgMTQ6MDE6MzMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IExvb2sgZm9yIC0tZW5hYmxlLXNoYXJlZC4gIENoYW5nZSB0aGUgdmFsdWUgb2YKLQlCRkRMSUIgd2hlbiBsaW5raW5nIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSBvbiBTdW5PUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBJZiB1c2luZyBhIHNoYXJlZCBCRkQgbGlicmFyeSwgdHJ5IHRvIHBhc3MgYQotCXJlYXNvbmFibGUgLXJwYXRoIG9wdGlvbiB3aGVuIGxpbmtpbmcuCi0JKiBNYWtlZmlsZS5pbiAoQkZETElCKTogU2V0IHRvIEBCRkRMSUJALgotCi1UdWUgRmViICA2IDEyOjI5OjE0IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIChBUkNIKTogQ2hhbmdlIHRvIGBzcGFyYzp2OScuCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbTogU3RyaXAgYDpmb28nIGZyb20gJHtBUkNIfS4KLQotTW9uIEZlYiAgNSAxNjoyNTozMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlTdXBwb3J0IGZvciBidWlsZGluZyBiZmQgYW5kIG9wY29kZXMgYXMgc2hhcmVkIGxpYnJhcmllcywgYmFzZWQgb24KLQlwYXRjaGVzIGZyb20gQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogY29uZmlndXJlLmluIChITERGTEFHUyk6IE5ldyBzdWJzdGl0dXRpb24uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBjb25maWd1cmUuaG9zdDogU2V0IEhMREZMQUdTIG9uIFN1bk9TLgotCSogTWFrZWZpbGUuaW4gKEhMREZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShCRkRERVApOiBOZXcgdmFyaWFibGUuCi0JKEJGRExJQik6IENoYW5nZSB0byAtTC4uL2JmZCAtbGJmZC4KLQkoJChMRF9QUk9HKSk6IERlcGVuZCB1cG9uICQoQkZEREVQKSByYXRoZXJuIHRoYW4gJChCRkRMSUIpLiAgVXNlCi0JJChITERGTEFHUykgaW4gbGluay4KLQkoY2hlY2spOiBTZXQgTERfTElCUkFSWV9QQVRIIGluIHRoZSBlbnZpcm9ubWVudC4KLQotRnJpIEZlYiAgMiAxOToyNjoyNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAd29nZ2xlYnVnLnRpYWMubmV0PgotCi0JKiBzY3JpcHR0ZW1wbC9lbGZwcGMuc2MgKC5zZGF0YTIsIC5zYnNzMik6IFB1dCAuc2RhdGEyIGFuZCAuc2JzcwotCWluIHRoZSByZWFkLW9ubHkgc2VjdGlvbiwgbm90IHJlYWQvd3JpdGUgdW5sZXNzIHdlIGFyZSBtYWtpbmcgYQotCXNoYXJlZCBsaWJyYXJ5LgotCSguZGVidWcqKTogQWRkIGR3YXJmIGRlYnVnIHNlY3Rpb25zLgotCSgucmVsYS57c2RhdGEqLHNic3MqfSk6IEFkZCBzZWN0aW9ucy4KLQotRnJpIEZlYiAgMiAxNjo1MDoyMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAgMSAxMDo1MDo0NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKFRFWFRfU1RBUlRfQUREUik6IENoYW5nZSB0byAweDgwNDgwMDAsCi0JZm9yIFNWUjQgY29tcGF0aWJpbGl0eS4KLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IENvcnJlY3QgaGFuZGxpbmcgb2YgQUJTT0xVVEUuCi0KLVdlZCBKYW4gMzEgMTc6MzA6MTkgMTk5NiAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAoaVszNDVdODYtKi1jeWd3aW4zMiwgcG93ZXJwY2xlLSotY3lnd2luMzIpOiBOZXcuCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGRlZmluZm8gaW5pdCk6IE1ha2UgdGhlIGRlZmF1bHQgc3RhY2sgcmVzZXJ2ZQotCW9mIGEgUFBDIGxhcmdlci4KLQotV2VkIEphbiAzMSAxNDozNDoyMyAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogY29uZmlndXJlLnRndCAobTY4Ki1hcHBsZS1hdXgqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvbTY4a2F1eC5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9tNjhrYXV4LnNjOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbTY4a2F1eC5vLgotCShlbTY4a2F1eC5jKTogTmV3IHRhcmdldC4KLQotVHVlIEphbiAzMCAxMzoxODo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBJZ25vcmUKLQktYm5vZW50cnksIHNpbmNlIHRoZSByaWdodCB0aGluZyB0ZW5kcyB0byBoYXBwZW4gYW55aG93LgotCi1Nb24gSmFuIDI5IDEyOjI5OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLWV4cG9ydC1keW5hbWljLgotCi1GcmkgSmFuIDI2IDExOjExOjU1IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IENoZWNrIGZvciBuYXRpdmUgY29tcGlsZSBieSBjb21wYXJpbmcKLQkke3RhcmdldH0gYW5kICR7aG9zdH0uCi0KLVRodSBKYW4gMjUgMTY6NDY6NTggMTk5NiAgSmFtZXMgRy4gU21pdGggIDxqc21pdGhAY3lnbnVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL3tlbGYzMmI0MzAwLnNoLCBlbGYzMmw0MzAwLnNofTogQ2hhbmdlZAotIAlURVhUX1NUQVJUX0FERFIgdG8gYWxsb3cgdXNlIG9uIElEVCBhbmQgUE1PTiBzeXN0ZW1zLgotCi1XZWQgSmFuIDI0IDIwOjU5OjQwIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOgotCWNvcnJlY3Qgc3BlbGxpbmcuCi0KLVdlZCBKYW4gMjQgMTY6NTk6MTkgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS50Z3QgKHNwYXJjNjQtKi1zb2xhcmlzMiopOiBOZXcgY29uZmlndXJhdGlvbi4KLQkoc3BhcmM2NC0qLWFvdXQqKTogUmVuYW1lZCBmcm9tIHNwYXJjNjQqLgotCi1Nb24gSmFuIDIyIDEzOjAxOjM1IDE5OTYgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoR0VOU0NSSVBUUyk6IFBhc3MgQGhvc3RAIEB0YXJnZXRAIEB0YXJnZXRfYWxpYXNALgotCSogZ2Vuc2NyaXB0cy5zaDogU2V0IGhvc3QsIHRhcmdldCBhbmQgdGFyZ2V0X2FsaWFzIHZhcmlhYmxlcy4KLQlDaGVjayBmb3IgbmF0aXZlIGNvbXBpbGUgYnkgY29tcGFyaW5nICR7dGFyZ2V0fSBhbmQgJHtob3N0fS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9lbGZtaXBzLnNjOiBUZXN0ICR7dGFyZ2V0fSwgbm90ICR7dGFyZ2V0X2FsaWFzfS4KLQotTW9uIEphbiAyMiAxMTowMzoyMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogUmVmaW5lIGVhYmkgc3VwcG9ydCB0byBiZXR0ZXIgc3VwcG9ydAotCS5zZGF0YSwgLnNkYXRhMiwgLnNic3MsIGV0Yy4gc2VjdGlvbnMuCi0KLVR1ZSBKYW4gMTYgMTU6MTY6NTggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoJXVuaW9uKTogQWRkIHBoZHIgZmllbGQuCi0JKHBoZHIpOiBVc2UgcGhkcl9xdWFsaWZpZXJzIHJhdGhlciB0aGFuIG9wdF9oZHJzIGFuZCBvcHRfYXQuCi0JKHBoZHJfcXVhbGlmaWVycyk6IE5ldyBub250ZXJtaW5hbC4gIEFkZCBzdXBwb3J0IGZvciBGTEFHUy4KLQkob3B0X2hkcnMsIGhkcik6IFJlbW92ZS4KLQkocGhkcl92YWwpOiBOZXcgbm9udGVybWluYWwuCi0JKiBsZGxhbmcuYyAobGFuZ19uZXdfcGhkcik6IFJlcGxhY2UgaGRycyBwYXJhbWV0ZXIgd2l0aCBmaWxlaGRyCi0JYW5kIHBoZHJzIHBhcmFtZXRlcnMuICBBZGQgZmxhZ3MgcGFyYW1ldGVyLgotCShsYW5nX3JlY29yZF9waGRycyk6IFVwZGF0ZSBmb3IgY2hhbmdlcyB0byBsYW5nX3BoZHIuICBQYXNzIGZsYWdzCi0JdG8gYmZkX3JlY29yZF9waGRyLgotCSogbGRsYW5nLmggKHN0cnVjdCBsYW5nX3BoZHIpOiBSZXBsYWNlIGhkcnMgZmllbGQgd2l0aCBmaWxlaGRyIGFuZAotCXBoZHJzIGZpZWxkcy4gIEFkZCBmbGFncyBmaWVsZC4KLQkoTEFOR19QSERSX0ZJTEVIRFIsIExBTkdfUEhEUl9QSERSUyk6IFJlbW92ZS4KLQkobGFuZ19uZXdfcGhkcik6IFVwZGF0ZSBkZWNsYXJhdGlvbi4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IEZMQUdTLgotCi1Nb24gSmFuIDE1IDE1OjA3OjE5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JRG9uJ3QgbWFrZSBhIHNoYXJlZCBsaWJyYXJ5IGJlY2F1c2Ugb2YgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSB0bwotCV9fR0xPQkFMX09GRlNFVF9UQUJMRV8uCi0KLQlBZGQgc29tZSBJcml4IDUgc3VwcG9ydCwgbW9zdGx5IGZyb20gS2F6dW1vdG8gS29qaW1hCi0gICAgICAgIDxra29qaW1hQGluZm8ua2FuYWdhd2EtdS5hYy5qcD46Ci0JKiBlbXVscGFyYW1zL2VsZjMyYm1pcC5zaCAoU0NSSVBUX05BTUUpOiBDaGFuZ2UgdG8gZWxmbWlwcy4KLQkoU0hMSUJfVEVYVF9TVEFSVF9BRERSKTogRGVmaW5lLgotCShPVEhFUl9HT1RfU1lNQk9MUyk6IERlZmluZS4KLQkoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogUmVtb3ZlIGluaXRpYWxpemF0aW9uIG9mIF9ncC4KLQkoRVhFQ1VUQUJMRV9TWU1CT0xTKTogRG9uJ3QgZGVmaW5lLgotCShEWU5BTUlDX0xJTkspOiBEb24ndCBkZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZjMybG1pcC5zaDogU2FtZSBjaGFuZ2VzIGFzIGVsZjMyYm1pcC5zaC4KLQkqIHNjcmlwdHRlbXBsL2VsZm1pcHMuc2M6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmhvc3QgKG1pcHMqLWRlYy1ic2QqKTogQ2hhbmdlIG1pcHMgdG8gbWlwcyouCi0JKG1pcHMqLXNnaS1pcml4NCopOiBMaWtld2lzZS4KLQkobWlwcyotc2dpLWlyaXg1Kik6IE5ldyBlbnRyeS4KLQkqIE1ha2VmaWxlLmluIChlZWxmMzJibWlwLmMpOiBEZXBlbmQgdXBvbiBlbGZtaXBzLnNjIHJhdGhlciB0aGFuCi0JZWxmLnNjLgotCShlZWxmMzJsbWlwLmMpOiBMaWtld2lzZS4KLQotU2F0IEphbiAxMyAwOTo0MTo0MyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogUmVtb3ZlIHN1cHBvcnQgZm9yIC5yZWwuKiBzZWN0aW9ucy4gIEFkZAotCS5yZWxhLmdvdC5uZWcgc2VjdGlvbi4KLQotRnJpIEphbiAxMiAxNDo1NjoxOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3NoLnNjOiBPbmx5IGJ1aWxkIGNvbnN0cnVjdG9ycyB3aGVuIENPTlNUUlVDVElORy4KLQotCSogbGRtaXNjLmM6IEluY2x1ZGUgPHN0ZGFyZy5oPiByYXRoZXIgdGhhbiA8dmFyYXJncy5oPiBpZgotCUFOU0lfUFJPVE9UWVBFUyBpcyBkZWZpbmVkLiAgUmVtb3ZlIHNwZWNpYWwgaGFuZGxpbmcgb2YKLQlXSU5ET1dTX05ULiAgVmFyaW91cyBpbmRlbmRhdGlvbiBmaXhlcy4KLQkodmZpbmZvKTogQ2hhbmdlIGZtdCBwYXJhbWV0ZXIgdG8gY29uc3QgY2hhciAqLgotCShpbmZvX21zZyk6IFdyaXRlIDxzdGRhcmcuaD4gdmVyc2lvbi4KLQkoZWluZm8sIG1pbmZvLCBmaW5mbyk6IExpa2V3aXNlLgotCShpbmZvX2Fzc2VydCk6IENoYW5nZSBmaWxlIHBhcmFtZXRlciB0byBjb25zdCBjaGFyICouCi0JKiBsZG1pc2MuaCAoZWluZm8sIG1pbmZvLCBpbmZvX21zZyk6IElmIEFOU0lfUFJPVE9UWVBFUyBpcwotCWRlZmluZWQsIHVzZSBhIHJlYWwgcHJvdG90eXBlLgotCShpbmZvX2Fzc2VydCk6IENoYW5nZSBmaXJzdCBwYXJhbWV0ZXIgdG8gYmUgY29uc3QgY2hhciAqLgotCi1GcmkgSmFuIDEyIDEzOjI5OjU1IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLnNkYXRhMi8uc2JzczIsIGV0Yy4gIEFkZAotCWluIG9sZCBzdXBwb3J0IHRoYXQgMi43LjIgbmVlZHMsIGJ1dCB0aGUgY3VycmVudCBjb21waWxlciBkb2VzCi0Jbm90LgotCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMyeyxsfXBwYy5jKTogRml4IHVwIGRlcGVuZGVuY2llcyB0byB1c2UgdGhlCi0JY29ycmVjdCBMaW5rZXIgc2NyaXB0IHRlbXBsYXRlLgotCi0JKiBlbXVscGFyYW1zL2VsZjMyeyxsfXBwYy5zaCAoVEVYVF9TVEFSVF9BRERSKTogU2V0IHRvIDB4NDAwMDAsCi0Jbm90IDB4NDAwMDAwLgotCShEQVRBX0FERFIsTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogRGVsZXRlLgotCi1UdWUgSmFuICA5IDE1OjUzOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IFB1dCAucmNvbnN0IHJpZ2h0IGFmdGVyIC5yZGF0YS4KLQotRnJpIEphbiAgNSAxNDowNzo0NSAxOTk2ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvcGUuZW0gKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0Jc29ydCB1c2luZyByaWdodCBwb2ludGVyLgotCi1GcmkgSmFuICA1IDEyOjI1OjQ3IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBSZW1vdmUgc3VwcG9ydCBmb3IgY3JlYXRpbmcgc3BlY2lhbAotCWxhYmVscyBmb3IgZWFiaSBzZWN0aW9uIGJlZ2luL2VuZCBoZXJlLiAgVGhlIGNvbXBpbGVyIG5vdyB1c2VzCi0JY3J0e2ksbn0ubyB0byBjcmVhdGUgdGhlc2Ugc3ltYm9scy4KLQotVGh1IEphbiAgNCAxNzowODo1OCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0OiBDaGFuZ2UgZXhpc3RpbmcgTGludXggSE9TVElOR19DUlQwIHRvIGJlIHVzZWQKLQlmb3IgYS5vdXQgb25seSwgYW5kIHB1dCBpbiBhcHByb3ByaWF0ZSBIT1NUSU5HX0NSVDAgYW5kCi0JSE9TVElOR19MSUJTIHZhbHVlcyBmb3IgTGludXggRUxGLgotCi1UaHUgSmFuICA0IDEyOjAyOjA1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBVc2UgYWxsIDY0SyBmb3IgcmFtLgotCSogc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBEZWZpbmUgMjU2SyByYW0gc2l6ZS4KLQotVGh1IERlYyAyMSAxNTo1NzoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogUGFzcwotCWV4cG9ydF9kZWZpbmVzIGFzIHRydWUgdG8gYmZkX3hjb2ZmX3NpemVfZHluYW1pY19zZWN0aW9ucyBpZiAtdW5peAotCXdhcyB1c2VkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgLWJFIHdhcyB1c2VkLgotCi1UdWUgRGVjIDE5IDE3OjM1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IE9ubHkgc2V0Ci0JcmVsb2NhdGVhYmxlIGJlZm9yZSBjYWxsaW5nIGxkY3Rvcl9idWlsZF9zZXRzIGlmIHRoZSBvdXRwdXQgZmlsZQotCWlzIGluIGFuIFhDT0ZGIGZvcm1hdC4KLQotRnJpIERlYyAxNSAxNjozNDozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IFdoZW4gaGFuZGxpbmcgYSBkYXRhIHN0YXRlbWVudCwgaWYKLQl0aGUgZW5kaWFubmVzcyBvZiB0aGUgb3V0cHV0IGZpbGUgaXMgdW5rbm93biwgdXNlIHRoZSBlbmRpYW5uZXNzCi0Jb2YgdGhlIGlucHV0IGZpbGUuCi0KLVR1ZSBEZWMgMTIgMTM6NTU6NDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBSZWNvZ25pemUgbWlwcy0qLSogYXMgZXF1aXZhbGVudCB0bwotCW1pcHMtaWR0LWVjb2ZmLgotCSogbXB3LWVwcGNtYWNvcy5jOiBSZW5hbWUgdG8gc2hvcnRlciBtcHctZXBwY21hYy5jLgotCSogbXB3LWxkLnI6IEFkZCB2ZXJzaW9uIHJlc291cmNlcy4KLQkoY2ZyZyk6IFVzZSBzeW1ib2xpYyBpbnN0ZWFkIG9mIGxpdGVyYWwgbmFtZSBmb3IgZXhlY3V0YWJsZS4KLQotTW9uIERlYyAxMSAxNToxMzo0MSAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcHBjcGUuc2MgKEZJTkkpOiBNb3ZlZCB0aGUgLnJlbG9jIHNlY3Rpb24uCi0KLVdlZCBEZWMgIDYgMTQ6MzM6NTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHByaW50X3N0YXRlbWVudHssc30pOiBEZWxldGUgZHVwbGljYXRlIHByb3RvdHlwZS4KLQkocHJpbnRfc3RhdGVtZW50X2xpc3QpOiBSZW5hbWVkIGZyb20gcHJpbnRfc3RhdGVtZW50LiAgQWxsIGNhbGxlcnMKLQl1cGRhdGVkLgotCShwcmludF9zdGF0ZW1lbnQpOiBOZXcgZnVuY3Rpb24gdG8gcHJpbnQganVzdCBvbmUgc3RhdGVtZW50LgotCShwcmludF97ZGF0YSxyZWxvYyxwYWRkaW5nfV9zdGF0ZW1lbnQpOiBEb24ndCBjcmFzaCBpZgotCW91dHB1dF9zZWN0aW9uID09IE5VTEwuCi0JKGRwcmludF9zdGF0ZW1lbnQpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogRml4Ci0JY2FsbCB0byBzb3J0X3NlY3Rpb25zLgotCi1XZWQgRGVjICA2IDE0OjU5OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAodW5peF9sZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBIYW5kbGUgLXVuaXguCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogSWYgdW5peF9sZCwgcGFzcwotCWdjIGFzIGZhbHNlIGFuZCBleHBvcnRfZGVmaW5lZHMgYXMgdHJ1ZSB0byBzaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBQZXJtaXQgYXNzaWdubWVudHMgdG8gZG90IGluIHRoZSBmaW5hbAotCXBoYXNlIGlmIHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgYWJzX291dHB1dF9zZWN0aW9uLgotCi0KLVR1ZSBEZWMgIDUgMDk6NDk6MzkgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBGaXggY2FsbAotCXRvIHNvcnRfc2VjdGlvbnMuCi0KLUZyaSBEZWMgIDEgMTY6NDg6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoUEhEUlMpOiBOZXcgdG9rZW4uCi0JKGlmaWxlX3AxKTogQWNjZXB0IHBoZHJzLgotCShzZWN0aW9uKTogQWNjZXB0IHBoZHJfb3B0IGF0IHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gZGVmaW5pdGlvbi4KLQkocGhkcl9vcCk6IE5ldyBub250ZXJtaW5hbC4KLQkocGhkcnMsIHBoZHJfbGlzdCwgcGhkciwgcGhkcl90eXBlLCBvcHRfaGRycywgaGRyKTogTGlrZXdpc2UuCi0JKiBsZGxleC5sOiBBY2NlcHQgUEhEUlMuCi0JKiBsZGxhbmcuaCAoc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0KTogRGVmaW5lLgotCShsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlKTogQWRkIHBoZHJzIGZpZWxkLgotCShzdHJ1Y3QgbGFuZ19waGRyKTogRGVmaW5lLgotCShMQU5HX1BIRFJfRklMRUhEUiwgTEFOR19QSERSX1BIRFJTKTogRGVmaW5lLgotCShsYW5nX25ld19waGRyKTogRGVjbGFyZS4KLQkqIGxkbGFuZy5jIChsYW5nX3BoZHJfbGlzdCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCk6IEluaXRpYWxpemUgcGhkcnMgZmllbGQuCi0JKGxhbmdfcHJvY2Vzcyk6IENhbGwgbGFuZ19yZWNvcmRfcGhkcnMuCi0JKGxhbmdfbmV3X3BoZHIpOiBOZXcgZnVuY3Rpb24uCi0JKGxhbmdfc2VjdGlvbl9pbl9waGRyKTogTmV3IGZ1bmN0aW9uLgotCShsYW5nX3JlY29yZF9waGRycyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBQSERSUy4KLQotVGh1IE5vdiAzMCAxMzoxNDozMCAxOTk1ICBLaW0gS251dHRpbGEgIDxrcmtAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvcHBjcGUuc2M6IE1vdmVkIC5lZGF0YSBpbnRvIGl0cyBvd24gc2VjdGlvbiB0bwotCWV4cG9zZSBpdC4KLQotVGh1IE5vdiAzMCAxMTozMjozNCAxOTk1ICBNYW5mcmVkIEhvbGxzdGVpbiBLUy9FRjRBIDYwLzFGLzExMCAjNDAyODMgIDxtYW5mcmVkQGx0cy5zZWwuYWxjYXRlbC5kZT4KLQotCSogY29uZmlndXJlLmhvc3QgKG02OCotbW90b3JvbGEtc3lzdik6IERlZmluZSBIT1NUSU5HX0NSVDAgYW5kCi0JSE9TVElOR19MSUJTIGZvciB0ZXN0aW5nLgotCShtODgqLW1vdG9yb2xhLXN5c3YzKTogRGVmaW5lIEhPU1RJTkdfQ1JUMCBhbmQgSE9TVElOR19MSUJTIGZvcgotCXRlc3RpbmcuCi0KLVR1ZSBOb3YgMjggMTI6MTQ6NTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFNldCBjb25maWcuZHluYW1pY19saW5rIHRvIGZhbHNlIGZvciAtTgotCWFuZCAtbi4KLQotTW9uIE5vdiAyNyAxMzoxMjowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNy4KLQotRnJpIE5vdiAyNCAxODozNTozNSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogVHdvIC5qdW5rJ3MgaXMgdG9vIG11Y2gganVuay4KLQotVHVlIE5vdiAyMSAxNjoxNDozMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEJGRF9ORUVEX0RFQ0xBUkFUSU9OLgotCSogYWNjb25maWcuaDogUHV0IE5FRURfREVDTEFSQVRJT05fRlJFRSBpbiBAVE9QQCBzZWN0aW9uLgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQgd2l0aCBhdXRvY29uZiAyLjYuCi0KLQkqIGxkbWFpbi5jIChjb25zdHJ1Y3Rvcl9jYWxsYmFjayk6IERvbid0IHdhcm4gYWJvdXQgQkZEX1JFTE9DX0NUT1IKLQliZWluZyB1bnN1cHBvcnRlZCBpZiB0aGlzIGlzIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rIGFuZCB0aGUgaW5wdXQKLQlCRkQgc3VwcG9ydHMgaXQsIHNpbmNlIGxkY3Rvcl9idWlsZF9zZXRzIGNhbiBjb3BlIHdpdGggdGhhdCBjYXNlLgotCi1GcmkgTm92IDE3IDE2OjIzOjE1IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLW1hY29zKik6IE5ldyB0YXJnZXQuCi0JKiBlbXVscGFyYW1zL3BwY21hY29zLnNoOiBOZXcgZmlsZSwgUG93ZXJNYWMgZW11bGF0aW9uLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVwcGNtYWNvcy5vLgotCShlcHBjbWFjb3MuYyk6IE5ldyB0YXJnZXQuCi0JKiBtcHctZXBwY21hY29zLmM6IFVwZGF0ZS4KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgYXR0ZW1wdHMgdG8gdXNlIHtHRU5TQ1JJUFRTfS4KLQotRnJpIE5vdiAxNyAxMDozNzoyNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChDQ19GT1JfVEFSR0VUKTogVXNlIEBob3N0QCBhbmQgQHRhcmdldEAsIG5vdAotCSQoaG9zdF9jYW5vbmljYWwpIGFuZCAkKHRhcmdldF9jYW5vbmljYWwpLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCi1UaHUgTm92IDE2IDExOjIzOjQyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjICguZW5kanVuayk6IE1vdmUgZGVmaW5pdGlvbiBvZiBgZW5kJyB0byBoZXJlCi0Jc28gdGhlIG1hbGxvYyBoZWFwIGJlZ2lucyBhdCBhIHNhbmUgcGxhY2UuCi0KLVRodSBOb3YgMTYgMDM6MDk6MzIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlWZXJzaW9uIDIuNiByZWxlYXNlZC4KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFVwZGF0ZSB0byAyLjYuCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IERlbGV0ZSBsZGVtdWwtbGlzdC5oIGhlcmUsIGJ1dCBub3QKLQkkKEdFTkVSQVRFRF8qRklMRVMpLCBzaW5jZSB0aGV5IG5lZWQgdG8gYmUgcmV0YWluZWQgYnkgZGlzdGNsZWFuLgotCShtYWludGFpbmVyLWNsZWFuLCByZWFsY2xlYW4pOiBEZWxldGUgdGhlbSBoZXJlLgotCi1UdWUgTm92IDE0IDE3OjA4OjA2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IE9wZW4gdGhlCi0JYmFzZSBmaWxlIHdpdGggRk9QRU5fV0IsIG5vdCAidyIuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IFVzZSB0aGUKLQllbnZpcm9ubWVudCB2YXJpYWJsZSBMRF9SVU5fUEFUSCBpZiBuZWl0aGVyIC1ycGF0aCBub3IgLXJwYXRoLWxpbmsKLQl3ZXJlIHVzZWQuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogVXNlIHRoZSBlbnZpcm9ubWVudAotCXZhcmlhYmxlIExEX1JVTl9QQVRIIGlmIC1ycGF0aCB3YXMgbm90IHVzZWQuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCBMRF9SVU5fUEFUSC4KLQotVGh1IE5vdiAgOSAxMzowOToyOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBSZWNvZ25pemUKLQktYmwgYW5kIC1ibG9hZG1hcCBvcHRpb25zLgotCi0JKiBsZGZpbGUuYyAobGRmaWxlX3RyeV9vcGVuX2JmZCk6IElmIGJmZF9lcnJvcl9pbnZhbGlkX3RhcmdldCwKLQlyZXBvcnQgYSBiZXR0ZXIgZXJyb3IuCi0KLQkqIGVtdWx0ZW1wbC9haXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogQWRkCi0JbmV3IGxvY2FsIHZhcmlhYmxlIHNwZWNpYWxfc2VjdGlvbnMsIGFuZCBwYXNzIGl0IHRvCi0Jc2l6ZV9keW5hbWljX3NlY3Rpb25zLiAgTG9vayB0aHJvdWdoIHRoZSByZXN1bHRzLCBhbmQgbW92ZSB0aGUKLQlzZWN0aW9ucyBhcm91bmQgaW4gdGhlIG1hcHBpbmcgc28gdGhhdCB0aGV5IGFyZSBkZWZpbmVkIGNvcnJlY3RseS4KLQotV2VkIE5vdiAgOCAxMTo0MDo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5jIChsZGVtdWxfZGVmYXVsdF90YXJnZXQpOiBDYXN0IGdldGVudiByZXR1cm4gdmFsdWUuCi0KLVR1ZSBOb3YgIDcgMTE6MTU6MzYgMTk5NSAgS2ltIEtudXR0aWxhICA8a3JrQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvcHBjcGUuc2ggKEFSQ0gpOiBOZXcgZmlsZSBmb3IgUG93ZXJQQyBQb3J0YWJsZQotCUV4ZWN1dGFibGUgc3VwcG9ydC4KLQkqIHNjcmlwdHRlbXBsL3BwY3BlLnNjOiBOZXcgZmlsZSBmb3IgUG93ZXJQQyBQb3J0YWJsZSBFeGVjdXRhYmxlCi0Jc3VwcG9ydC4KLQotCSogY29uZmlndXJlLnRndCAodGFyZ19leHRyYV9lbXVscyk6IEFkZGVkIHBvd2VycGNsZS1wZSB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlcHBjcGUubyB0YXJnZXQuCi0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoVEFSR0VUX0lTX3BwY3BlKTogZmlsZSB0YWlsb3JpbmcgbWFjcm8KLQkoZ2xkXyRfYmVmb3JlX2FsbG9jYXRpb24pOiBhZGRlZCBob29rcyBmb3IgdG9jIGNvbnN0cnVjdGlvbiBiYXNlZAotCW9uIHRoZSBhYm92ZSBtYWNyby4KLQotVHVlIE5vdiAgNyAxMTo0NzoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLnRleGluZm86IFRoZSBsaW5rZXIgZG9lcyBub3QgdXNlIF9tYWluIGFzIGFuIGVudHJ5IHBvaW50LgotCi1UdWUgTm92ICA3IDExOjQ2OjExIDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjICguZGF0YSk6IENhbGN1bGF0ZSBuZXh0IGJvdW5kYXJ5IG1vZHVsbwotCTB4MjAwMCBub3QgMHgyMDAuCi0KLU1vbiBOb3YgIDYgMTA6NTk6MjEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCB0ZXN0IGZvciB3aGV0aGVyIGZyZWUgbXVzdCBiZSBkZWNsYXJlZC4KLQkqIHN5c2RlcC5oOiBEZWNsYXJlIGZyZWUgaWYgbmVjZXNzYXJ5LiAgSW5jbHVkZSAiYW5zaWRlY2wuaCIuCi0JKiBhY2NvbmZpZy5oOiBFeHBsYWluIE5FRURfREVDTEFSQVRJT05fRlJFRS4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmluOiBSZWJ1aWxkLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFRha2UgQjo6IG91dCBvZiBzaG9ydG9wdHMuCi0KLVN1biBOb3YgIDUgMDM6MDg6MjggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggKEVYRUNVVEFCTEVfU1lNQk9MUyk6IFNldCBfX0RZTkFNSUMgdG8gMAotCWZvciBub3csIGFzIHdpdGggbTY4azRrYnNkLCB1bnRpbCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGdldHMKLQlkb25lLgotCi0JKiBjb25maWd1cmUuaG9zdDogRm9yIGkzODYgQlNEIHZhcmlhbnRzLCBjcnQwLm8gbGl2ZXMgaW4KLQkvdXNyL2xpYi4gIChUcnVlIGZvciBOZXRCU0QgYXQgbGVhc3QsIHVuY29uZmlybWVkIGZvciBvdGhlcnMuKQotCi1XZWQgTm92ICAxIDE1OjQyOjQ1IDE5OTUgIE1hbmZyZWQgSG9sbHN0ZWluIEtTL0VGNEEgNjAvMUYvMTEwICM0MDI4MyAgPG1hbmZyZWRAbHRzLnNlbC5hbGNhdGVsLmRlPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWRlbHRhNjguby4KLQkoZWRlbHRhNjguYyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWd1cmUudGd0IChtNjgqLW1vdG9yb2xhLXN5c3YqKTogTmV3IHRhcmdldC4KLQkqIGVtdWxwYXJhbXMvZGVsdGE2OC5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9kZWx0YTY4LnNjOiBOZXcgZmlsZS4KLQotCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYzogSGFuZGxlIC5pbml0IGFuZCAuZmluaS4gIENoYW5nZSBzZWN0aW9uCi0JYWRkcmVzc2VzLgotCi1XZWQgTm92ICAxIDExOjQxOjU2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRncmFtLnkgKG1yaV9zY3JpcHRfY29tbWFuZCk6IEFjY2VwdCAnLCcgYXMgd2VsbCBhcyAnPScgaW4KLQlBTElHTiBhbmQgQUxJR05NT0Qgc3RhdGVtZW50cy4KLQotCSogZW11bHRlbXBsL2FpeC5lbTogSW5jbHVkZSBsZGdyYW0uaC4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6IEhhbmRsZSAtcEQgYW5kIC1wVCwgYXMgdXNlZCBvbgotCUFJWCA0LjEuCi0JKiBNYWtlZmlsZS5pbiAoJChFTVVMQVRJT05fT0ZJTEVTKSk6IERlcGVuZCB1cG9uIGxkZ3JhbS5oLgotCi1UdWUgT2N0IDMxIDE4OjIyOjI0IDE5OTUgIERhdmlkIE1vc2Jlcmdlci1UYW5nICA8ZGF2aWRtQGF6c3Rhcm5ldC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5ob3N0IChhbHBoYS0qLWxpbnV4Kik6IE5ldyBob3N0LgotCSogY29uZmlndXJlLnRndCAoYWxwaGEtKi1saW51eCopOiBOZXcgdGFyZ2V0LgotCi1UdWUgT2N0IDMxIDEyOjM2OjUyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbSAoZXhwb3J0X2ZpbGVzKTogUmVtb3ZlLgotCShpbXBvcnRfZmlsZXMpOiBNYWtlIHN0YXRpYy4KLQkoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCk6IERlZmluZS4KLQkoZXhwb3J0X3N5bWJvbHMpOiBOZXcgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogSGFuZGxlIGFuIGluaXRpYWwgLWIgb3B0aW9uCi0JY29ycmVjdGx5LiAgQ2FsbCByZWFkX2ZpbGUgZm9yIGFuIGV4cG9ydCBmaWxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IENhbGwKLQliZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCBmb3IgZWFjaCBleHBvcnQgc3ltYm9sLCByYXRoZXIgdGhhbgotCWNhbGxpbmcgcmVhZF9maWxlIGZvciBlYWNoIGV4cG9ydCBmaWxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUpOiBGb3IgYW4gZXhwb3J0IGZpbGUsIG1ha2UgdGhlCi0JZXhwb3J0ZWQgc3ltYm9scyB1bmRlZmluZWQsIGFuZCBzdG9yZSB0aGVtIG9uIHRoZSBleHBvcnRfc3ltYm9scwotCWxpc3QuCi0KLVNhdCBPY3QgMjggMDA6MTA6MDMgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3BlLmVtIChnbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyk6Ci0JRG9uJ3QgaGFuZyBpZiBsYXN0IG9wdGlvbiBpcyB1bnJlY29nbmlzZWQuCi0JKGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scyk6IEluc2VydCBjcmVhdGVkCi0Jc3ltYm9scyBpbnRvIEFCUyBvdXRwdXQgc2VjdGlvbi4KLQotRnJpIE9jdCAyNyAxODowMzoxNyAxOTk1ICBOaWtsYXMgSGFsbHF2aXN0ICA8bmlrbGFzQGFwcGxpLnNlPgotCi0JKiAgTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgc3VwcG9ydCBmb3IgdGhlIE5ldEJTRAotCW02OGs0ayBhcmNoLgotCShlbTY4azRrbmJzZC5jKTogTmV3IHJ1bGUuCi0KLQkqIGNvbmZpZ3VyZS50Z3Q6IEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBOZXRCU0QgbTY4azRrIGFyY2guCi0KLQkqIGdlbnNjcmlwdHMuc2gsIGxkaW50LnRleGluZm8sCi0JZW11bHBhcmFtcy97YTI5ayxhcm1hb3V0Yixhcm1hb3V0bCxjb2ZmX3NwYXJjLGVibW9uMjlrLGdsZDk2MCwKLQlnbGQ5NjBjb2ZmLGdvMzIsaDgzMDAsaDgzMDBoLGg4NTAwLGg4NTAwYixoODUwMGMsaDg1MDBtLGg4NTAwcywKLQlocDMwMGJzZCxocDNocHV4LGhwcGFlbGYuc2gsaTM4NmFvdXQsaTM4NmJzZCxpMzg2Y29mZixpMzg2Z28zMiwKLQlpMzg2bGludXgsaTM4Nmx5bngsaTM4Nm5ic2QsbG5rOTYwLG02OGthb3V0LG02OGtjb2ZmLG02OGtseW54LAotCW04OGtiY3MsbWlwc2JpZyxtaXBzYnNkLG1pcHNpZHQsbWlwc2lkdGwsbWlwc2xpdCxuZXdzLG5zMzJrbmJzZCwKLQlwYzUzMm1hY2hhb3V0LHJpc2NpeCxzYTI5MjAwLHNoLHNobCxzcGFyY2x5bngsc3BhcmNuYnNkLAotCXN0MjAwMCxzdW4zLHN1bjQsdmFuaWxsYSx2YXgsdnN0YSx3NjUsejgwMDEsejgwMDJ9LnNoOiBDaGFuZ2VkCi0JUEFHRV9TSVpFIHRvIFRBUkdFVF9QQUdFX1NJWkUuCi0KLQkqIGVtdWxwYXJhbXMvbTY4a25ic2QuaDogRGl0dG8uCi0JKFRFWFRfU1RBUlRfQUREUiwgTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKTogV2UgaGF2ZSA4SyBwYWdlc2l6ZS4KLQkoRVhFQ1VUQUJMRV9TWU1CT0xTKTogSGFyZGNvZGUgX19EWU5BTUlDIHRvIHplcm8gZm9yIHRoZSB0aW1lCi0JYmVpbmcuCi0KLQkqIGVtdWxwYXJhbXMvbTY4azRrbmJzZC5zaDogTmV3IGZpbGUuCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IEV4cGFuZCBFWEVDVVRBQkxFX1NZTUJPTFMgaWYgcmVsb2NhdGluZy4KLQotRnJpIE9jdCAyNyAxNzo1OTowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9haXguZW06IEluY2x1ZGUgbGRjdG9yLmguCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IENhbGwgZmluZF9yZWxvY3MuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfcmVsb2NzKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVzZSBuZXcgYWZ0ZXJfb3BlbiBmdW5jdGlvbi4KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogVXNlIENPTlNUUlVDVE9SUyBpbiAuZGF0YS4KLQkqIGxkY3Rvci5jIChzdHJ1Y3Qgc2V0X2luZm8pOiBNb3ZlIGRlZmluaXRpb24gaW50byBsZGN0b3IuaC4KLQkoc3RydWN0IHNldF9lbGVtZW50KTogTGlrZXdpc2UuCi0JKHNldHMpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogQWRkIG5hbWUgcGFyYW1ldGVyLiAgU2F2ZSBpdCBpbiB0aGUgbmV3Ci0Jc2V0IGVsZW1lbnQuCi0JKGxkY3Rvcl9idWlsZF9zZXRzKTogQXZvaWQgYmVpbmcgY2FsbGVkIHR3aWNlLiAgUGFzcyBzZXQgZWxlbWVudAotCW5hbWUgdG8gbGFuZ19hZGRfcmVsb2MuCi0JKiBsZGN0b3IuaCAoc3RydWN0IHNldF9pbmZvKTogTW92ZSBkZWZpbml0aW9uIGhlcmUgZnJvbSBsZGN0b3IuYy4KLQkoc3RydWN0IHNldF9lbGVtZW50KTogTGlrZXdpc2UuICBBZGQgbmV3IGZpZWxkIG5hbWUuCi0JKHNldHMpOiBEZWNsYXJlLgotCShsZGN0b3JfYWRkX3NldF9lbnRyeSk6IERlY2xhcmUgbmV3IG5hbWUgcGFyYW1ldGVyLgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogRG9uJ3QgaW5zaXN0IHRoYXQgZWl0aGVyIG5hbWUgb3IKLQlzZWN0aW9uIGJlIE5VTEwgaW4gYSBsYW5nX3JlbG9jX3N0YXRlbWVudC4KLQkqIGxkbWFpbi5jIChhZGRfdG9fc2V0KTogUGFzcyBOVUxMIHRvIGxkY3Rvcl9hZGRfbmV3X3NldF9lbnRyeSBmb3IKLQluZXcgbmFtZSBwYXJhbWV0ZXIuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogUGFzcyBuYW1lIHRvIGxkY3Rvcl9hZGRfbmV3X3NldF9lbnRyeSBmb3IKLQluZXcgbmFtZSBwYXJhbWV0ZXIuCi0KLQkqIGxkbWlzYy5jIChkZW1hbmdsZSk6IEZpeCBpbmRlbnRhdGlvbi4gIFJlbW92ZSBhIGxlYWRpbmcgcGVyaW9kLgotCi1UaHUgT2N0IDI2IDIyOjIyOjQ5IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIFBvd2VyTWFjIHRhcmdldCBzdXBwb3J0LCBnZW5lcmF0ZSBjb25maWcuaC4KLQkqIG1hYy1sZC5yOiBOZXcgZmlsZSwgTWFjIHJlc291cmNlcy4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIGVkaXRzIE1ha2VmaWxlLmluIGludG8gTVBXIHN5bnRheC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtcHctZXBwY21hY29zLmM6IFByZWJ1aWx0IHZlcnNpb24gb2YgUG93ZXJNYWMgbGlua2luZyBzY3JpcHQuCi0KLVRodSBPY3QgMjYgMTQ6MTE6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvYWl4LmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKTogVHJlYXQKLQktc3RhdGljIGFzIGEgc3lub255bSBmb3IgLWJuc28uCi0KLQkqIHNjcmlwdHRlbXBsL2FpeC5zYzogTW92ZSBzcGVjaWFsIHN5bWJvbHMgaW5zaWRlIHNlY3Rpb25zLgotCUFsd2F5cyBzdGFydCAuZGF0YSBhdCAwLgotCi1XZWQgT2N0IDI1IDExOjUyOjEyIDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdHN0dWZmKTogIEFsc28gbWFrZSBpbmZvLgotCShtYWludGFpbmVyLWNsZWFuIHJlYWxjbGVhbik6ICBBbHNvIGRlbGV0ZSAqLmluZm8qLgotCi1XZWQgT2N0IDI1IDExOjI3OjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2FpeC5lbTogQWRkIHN1cHBvcnQgZm9yIHZhcmlvdXMgQUlYIGxpbmtlciBvcHRpb25zLAotCWZvciBBSVggaW1wb3J0IGFuZCBleHBvcnQgZmlsZXMsIGFuZCBmb3IgQUlYIHNoYXJlZCBvYmplY3RzLgotCSogc2NyaXB0dGVtcGwvYWl4LnNjOiBBZGQgLnBhZC4gIFB1dCAuZHMganVzdCBiZWZvcmUgdGhlIFRPQy4KLQotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIG5ldyBmaWVsZCBsaW5rX2luZm8uc3RhdGljX2xpbmsuCi0KLQkqIGxkbWFpbi5jIChhZGRfa2VlcHN5bXNfZmlsZSk6IEFkZCBcbiBhdCBlbmQgb2YgZWluZm8gY2FsbHMuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogTGlrZXdpc2UuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogTGlrZXdpc2UuCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBMaWtld2lzZS4KLQotCSogbGQudGV4aW5mbzogVGhlIE1SSSBBTElHTiBkaXJlY3RpdmUgaXMgc3VwcG9ydGVkLgotCi1Nb24gT2N0IDIzIDExOjQ2OjQzIDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgotCi0JKiBlbXVscGFyYW1zL2VsZjMydnI0MzAwLnNoOiBEZWxldGVkLgotCSogZW11bHBhcmFtcy9lbGYzMnZyNDMwMGVsLnNoOiBEZWxldGVkLgotCSogZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoOiBBZGRlZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaDogQWRkZWQuCi0JKiBjb25maWd1cmUudGd0LCBNYWtlZmlsZS5pbjogVXBkYXRlZCB0aGUgYnVpbGQgdG8gdXNlIHRoZQotIAluZXcgOC4zIHVuaXF1ZSBuYW1lcy4KLQotVGh1IE9jdCAxOSAxNzo0MTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChlbnRyeV9zeW1ib2wpOiBNYWtlIG5vbi1zdGF0aWMuCi0JKiBsZGxhbmcuaCAoZW50cnlfc3ltYm9sKTogRGVjbGFyZS4KLQotCSogbGRsZXgubDogVHJlYXQgUFJPVklERSBhcyBhIGtleXdvcmQgaW4gZXhwcmVzc2lvbiBzdGF0ZS4KLQotV2VkIE9jdCAxOCAxNzozNDowNiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYyAoLmJzcyk6IE1vdmUgdG8gYmUgYWZ0ZXIgLnRleHQKLQotVHVlIE9jdCAxNyAxMjoyMjowNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCk6Ci0JU2VhcmNoIHRyaW5hcnkuY29uZCByYXRoZXIgdGhhbiBzZWFyY2hpbmcgdHJpbmFyeS5saHMgdHdpY2UuICBGcm9tCi0JbGlubGlAaWhwLlBIeXMuZXRoei5DSC4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogTW92ZQotCWRpcmVjdG9yeSBzZWFyY2hpbmcgY29kZSBpbnRvIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLCBleHRyYWN0ZWQKLQlmcm9tIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28uCi0JKGdsb2JhbF9uZWVkZWQsIGdsb2JhbF9mb3VuZCk6IE5ldyBzdGF0aWMgdmFyaWFibGVzLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBVc2UgbmV3IGFmdGVyX29wZW4gZnVuY3Rpb24uCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBNZW50aW9uIC1ycGF0aC1saW5rIG9uIFN1bk9TLgotCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMycHBjLmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSwgbm90IGdlbmVyaWMuZW0uCi0JKGVlbGYzMmxwcGMuYyk6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMmxwcGMuc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgZWxmMzIuCi0JKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZSBhcyB5ZXMuCi0KLU1vbiBPY3QgMTYgMTk6MTE6MTMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IFN0cnVjdCBiZmRfZWxmX2xpbmtfbmVlZGVkX2xpc3QgaXMgbm93IG5hbWVkCi0JYmZkX2xpbmtfbmVlZGVkLWxpc3Q7IG1ha2UgYXBwcm9wcmlhdGUgY2hhbmdlcy4KLQotCSogY29uZmlndXJlLnRndCAocG93ZXJwYy0qLWFpeCopOiBOZXcgdGFyZ2V0OyB1c2UgYWl4cHBjLgotCShyczYwMDAtKi1haXgqKTogTmV3IHRhcmdldDsgdXNlIGFpeHJzNi4KLQkqIGVtdWxwYXJhbXMvYWl4cHBjLnNoLCBlbXVscGFyYW1zL2FpeHJzNi5zaDogTmV3IGZpbGVzLgotCSogZW11bHRlbXBsL2FpeC5lbTogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9haXguc2M6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVhaXhwcGMubyBhbmQgZWFpeHJzNi5vLgotCShlYWl4cHBjLmMsIGVhaXhyczYuYyk6IE5ldyB0YXJnZXRzLgotCi1GcmkgT2N0IDEzIDE0OjAwOjM3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXAvcGUuc2MgKC5yZWxvYyk6IE1vdmUgdG8gdGhlIGVuZC4KLQotVHVlIE9jdCAxMCAxNzo1MzoyMiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IERvbid0IHRyeSB0byB1c2UgYW4gZW50cnlfc3ltYm9sIGZyb20gYQotCXNlY3Rpb24gd2hpY2ggd2FzIG5vdCBsaW5rZWQgaW50byB0aGUgZmluYWwgb3V0cHV0LgotCi1UdWUgT2N0IDEwIDEwOjE3OjIyIDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9wZS5lbSAoZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MpOiBGaXgKLQlmYXRhbCB0eXBvcy4KLQotVHVlIE9jdCAxMCAwMTowMTo1MSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBycGF0aF9saW5rIGZpZWxkLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogU2VhcmNoIGZvcgotCXJlcXVpcmVkIGRlcGVuZGVuY2llcyBpbiBycGF0aF9saW5rIHBhdGguICBPbmx5IHNlYXJjaAotCUxEX0xJQlJBUllfUEFUSCB3aGVuIGNvbmZpZ3VyZWQgbmF0aXZlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBSZWNvZ25pemUgLXJwYXRoLWxpbmsuCi0JKiBsZC4xLCBsZC50ZXhpbmZvOiBEb2N1bWVudCAtcnBhdGgtbGluay4KLQotU2F0IE9jdCAgNyAxNzowNzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbik6IERvbid0Ci0JYm90aGVyIHNlYXJjaGluZyBmb3IgbmVlZGVkIGxpYnJhcmllcyB1bmxlc3MgZG9pbmcgYSBmaW5hbCBsaW5rLgotCi1GcmkgT2N0ICA2IDE2OjI2OjE2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JTW9uIFNlcCAyNSAyMjo0OTozMiAxOTk1ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQvbGQuMTogRml4IGZvcm1hdHRpbmcgYnVncy4KLQotV2VkIE9jdCAgNCAxNzozNzo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGV4cF9nZXRfYWJzX2ludCk6IFJldHVybiBiZmRfdm1hLCBub3QgaW50LgotCSogbGRleHAuaCAoZXhwX2dldF9hYnNfaW50KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFVzZSBmcHJpbnRmX3ZtYSB0bwotCXByaW50IHJldHVybiB2YWx1ZSBvZiBleHBfZ2V0X2Fic19pbnQuCi0KLU1vbiBPY3QgIDIgMTM6NTY6MDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsb2JhbF9zdGF0KTogTmV3IGZpbGUgc3RhdGljIHZhcmlhYmxlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkKTogQ2FsbCBzdGF0X25lZWRlZCB0byBtYWtlIHN1cmUKLQl0aGF0IHRoZSBmaWxlIGhhcyBub3QgYWxyZWFkeSBiZWVuIGluY2x1ZGVkIHVuZGVyIGFub3RoZXIgbmFtZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCi1GcmkgU2VwIDI5IDEyOjAwOjE4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAZGVuZWIuY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtY29mZi5zYzogU3RhcnQgLnRleHQgYXQgMHg4MDAwLgotCVN0YXJ0IC5kYXRhIGF0IDB4NDAwMDAuCi0KLUZyaSBTZXAgMjkgMTE6MDk6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogSWYKLQljb21tYW5kX2xpbmUucnBhdGggaXMgc2V0LCB1c2UgaXQsIHJhdGhlciB0aGFuIHRoZSAtTCBvcHRpb25zLCB0bwotCWJ1aWxkIHRoZSBydWxlcyBzZWN0aW9uLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgdGhpcyB1c2Ugb2YgLXJwYXRoLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IERvbid0IHNldCBsaW5rX2luZm8uc2hhcmVkIGZvciAtYXNzZXJ0Ci0JcHVyZS10ZXh0LiAgUGFzcyB0cnVlLCBub3QgMSwgdG8gbGFuZ19hZGRfZW50cnkuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGZpbmRfYXNzaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZm91bmRfYXNzaWduKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBSZW5hbWUgbG9jYWwgaCB0byBoZHluLgotCUlmIG5vdCBhIHJlbG9jYXRlYWJsZSBsaW5rLCBhbmQgbm8gc3RhcnQgc3ltYm9sIHdhcyBzcGVjaWZpZWQgb24KLQl0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlcmUgYXJlIGFueSB1bmRlZmluZWQgc3ltYm9scywgc2V0Ci0JbGlua19pbmZvLnNoYXJlZC4gIElmIGxpbmtfaW5mby5zaGFyZWQgaXMgc2V0LCBzZXQgdGhlIGFkZHJlc3Mgb2YKLQl0aGUgLnRleHQgc2VjdGlvbiB0byAweDIwLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2Fzc2lnbm1lbnQpOiBSZW5hbWUgZnJvbQotCWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQuICBJZiBmaW5kX2Fzc2lnbiBpcwotCXNldCwgdGhlbiBqdXN0IHNldCBmb3VuZF9hc3NpZ24gYmFzZWQgb24gd2hldGhlciBhbiBhc3NpZ25tZW50IGlzCi0JZm91bmQgdG8gZmluZF9hc3NpZ24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQpOiBEb24ndCB1c2UgYSBzcGVjaWFsIHNjcmlwdCB3aGVuCi0JcHJvZHVjaW5nIGEgc2hhcmVkIGxpYnJhcnkuCi0JKiBlbXVscGFyYW1zL3N1bjQuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IFJlbW92ZS4KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IFJlbW92ZSBDUkVBVEVfU0hMSUIgdGVzdHMuCi0JKiBsZGxhbmcuYyAoZW50cnlfZnJvbV9jbWRsaW5lKTogTmV3IGdsb2JhbCB2YXJpYWJsZS4KLQkobGFuZ19hZGRfZW50cnkpOiBDaGFuZ2UgY21kbGluZSBwYXJhbWV0ZXIgZnJvbSBpbnQgdG8gYm9vbGVhbi4KLQlVc2UgZ2xvYmFsIGVudHJ5X2Zyb21fY21kbGluZSByYXRoZXIgdGhhbiBmdW5jdGlvbiBzdGF0aWMKLQlmcm9tX2NtZGxpbmUuCi0JKiBsZGxhbmcuaCAoZW50cnlfZnJvbV9jbWRsaW5lKTogRGVjbGFyZS4KLQkobGFuZ19hZGRfZW50cnkpOiBDaGFuZ2UgZGVjbGFyYXRpb24gb2Ygc2Vjb25kIHBhcmFtZXRlciBmcm9tIGludAotCXRvIGJvb2xlYW4uCi0JKiBsZGdyYW0ueTogUGFzcyBmYWxzZSwgbm90IDAsIHRvIGxhbmdfYWRkX2VudHJ5LgotCi1UaHUgU2VwIDI4IDEyOjM0OjEzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQuaCAocGFyc2luZ19kZWZzeW0pOiBEZWNsYXJlLgotCSogbGRsZXguaCAobGV4X3N0cmluZyk6IERlY2xhcmUuCi0JKiBsZGxleC5sIChsZXhfc3RyaW5nKTogRGVmaW5lLgotCSogbGV4c3VwLmMgKHBhcnNpbmdfZGVmc3ltKTogRGVmaW5lLgotCShwYXJzZV9hcmdzKTogSW4gT1BUSU9OX0RFRlNZTSBjYXNlLCBzZXQgbGV4X3N0cmluZyBiZWZvcmUgY2FsbGluZwotCWxleF9yZWRpcmVjdCwgYW5kIGNsZWFyIGl0IGFmdGVyIGNhbGxpbmcgeXlwYXJzZS4gIFNldAotCXBhcnNpbmdfZGVmc3ltIGFyb3VuZCBjYWxsIHRvIHl5cGFyc2UuCi0JKiBsZG1haW4uYyAobWFpbik6IFNldCBsZXhfc3RyaW5nIGJlZm9yZSBjYWxsaW5nIGxleF9yZWRpcmVjdCwgYW5kCi0JY2xlYXIgaXQgYWZ0ZXIgY2FsbGluZyB5eXBhcnNlLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEZvciAlUywgaGFuZGxlIC0tZGVmc3ltIGFyZ3VtZW50cyBhbmQgYnVpbHQKLQlpbiBsaW5rZXIgc2NyaXB0cyBjb3JyZWN0bHkuCi0KLQkqIHNjcmlwdHRlbXBsL3NwYXJjY29mZi5zYzogQWRkIC5jdG9ycy8uZHRvcnMgaGFuZGxpbmcgbGlrZSBvdGhlcgotCUNPRkYgdGFyZ2V0cywgYWxsb3dpbmcgZm9yIHRoZSBsZWFkaW5nIHVuZGVyc2NvcmUgdXNlZCBvbiBTUEFSQwotCUNPRkYuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1hc3NlcnQuCi0JKiBlbXVscGFyYW1zL3N1bjQuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IERlZmluZS4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCk6IFVzZSB0aGUKLQlzaGFyZWQgbGlicmFyeSBzY3JpcHQgd2hlbiBhcHByb3ByaWF0ZS4KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IElmIENSRUFURV9TSExJQiBpcyBzZXQsIHN0YXJ0IHRoZSAudGV4dAotCXNlY3Rpb24gYXQgU0laRU9GX0hFQURFUlMuCi0KLVRodSBTZXAgMjggMDE6NDA6MzcgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBkZW5lYi5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoZWFybWNvZmYuYyk6IEJ1aWxkLgotCSogY29uZmlndXJlLnRndCAoYXJtLSotY29mZik6IE5ldyB0YXJnZXQKLQkqIGVtdWxwYXJtcy9hcm1jb2ZmLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2FybWNvZmYuc2M6IE5ldyBmaWxlLgotCi1UdWUgU2VwIDI2IDEwOjU5OjMyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2M6IFJlbW92ZSAuZGF0YTI7IG5vIGxvbmdlciBuZWVkZWQuCi0KLUZyaSBTZXAgMjIgMTg6MDk6MDIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGZpbGUuYyAobGRmaWxlX3NldF9vdXRwdXRfYXJjaCk6IE1ha2UgYXJjaCBjb25zdC4KLQotVGh1IFNlcCAyMSAxNzo1NToyNCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQ29ycmVjdGx5IGxvY2F0ZSBfX2Jzc19zdGFydCBhdCB0aGUKLQliZWdpbm5pbmcgb2YgdGhlIC5ic3MgYXJlYSwgbm90IGF0IHRoZSBlbmQgb2YgZGF0YS4gIEFkZAotCV9fc2Jzc197c3RhcnQsZW5kfSBzeW1ib2xzLgotCi1XZWQgU2VwIDIwIDEyOjI5OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBRdW90ZSAkKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpLgotCShDWFhfRk9SX1RBUkdFVCwgaW5zdGFsbCk6IExpa2V3aXNlLgotCi1Nb24gU2VwIDE4IDE0OjUzOjIyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoZXMgYnkgQWxhbiBNb2RyYSA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+OgotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQpOiBSZW1vdmUgYnJva2Vuc2VkIHN0dWZmLgotCShDWFhfRk9SX1RBUkdFVCk6IExpa2V3aXNlLgotCShpbnN0YWxsKTogTGlrZXdpc2UuCi0JKEdFTkVSQVRFRF9IRklMRVMpOiBSZW1vdmUgY29uZmlnLmguCi0JKC5kZXApOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQotTW9uIFNlcCAxOCAxNDozOTozOCAxOTk1ICBBcm5lIEguIEp1dWwgIDxhcm5lakBwdnYudW5pdC5ubz4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotZGVjLW5ldGJzZCopOiBOZXcgdGFyZ2V0LgotCi1GcmkgU2VwIDE1IDIwOjAxOjUyIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaG9zdCAobTg4Ki0qLWRndXgqKTogRml4IGFub3RoZXIgc2hlbGwgc3ludGF4IGVycm9yLgotCi1GcmkgU2VwIDE1IDIzOjI4OjA1IDE5OTUgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAaGlnaGxhbmQuY29tLmF1PgotCi0JKiBjb25maWd1cmUuaG9zdCAoaVszNDVdODYtKi1ic2QqKTogRml4IHNoZWxsIHN5bnRheCBlcnJvci4KLQotVGh1IFNlcCAxMiAxMjo1MDo0OSAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wL3BlLnNjOiAgQWxsb3cgYm90aCBzcGVsbGluZ3Mgb2YgLmN0b3JzLy5kdG9ycy4KLQlTdGFydCAudGV4dCBzZWN0aW9uIG9uIHRoZSByaWdodCBib3VuZGFyeS4gQWx3YXlzIGFsaWduCi0Jc3RhYnMuCi0KLVR1ZSBTZXAgMTIgMTI6MjQ6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyB0YXJnZXQuCi0KLQkqIGxkbWFpbi5jIChzdHJ1Y3Qgd2FybmluZ19jYWxsYmFja19pbmZvKTogRGVmaW5lLgotCSh3YXJuaW5nX2NhbGxiYWNrKTogQWRkIG5ldyBwYXJhbWV0ZXIgc3ltYm9sLiAgQ2FsbAotCXdhcm5pbmdfZmluZF9yZWxvYyB0byB0cnkgdG8gZmluZCB0aGUgc2VjdGlvbiBhbmQgVk1BLgotCSh3YXJuaW5nX2ZpbmRfcmVsb2MpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBOVUxMIGFzIHN5bWJvbCBwYXJhbWV0ZXIgdG8gd2FybmluZyBjYWxsYmFjay4KLQotCSogbGQudGV4aW5mbzogQ2xhcmlmeSAtTCBvcHRpb24uCi0KLQkqIGxkbGFuZy5jIChsYW5nX29uZV9jb21tb24pOiBBZGQgY2FzdCB0byBhdm9pZCB3YXJuaW5nLgotCSh0b3Bvd2VyKTogTGlrZXdpc2UuICBBbHNvLCByZWluZGVudC4KLQkqIGxkd3JpdGUuYyAoY2xvbmVfc2VjdGlvbik6IENoYW5nZSBpIHRvIHVuc2lnbmVkIGludC4KLQkqIGVtdWx0ZW1wbC9zdW5vcy5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOiBBZGQKLQljYXN0IHRvIGF2b2lkIHdhcm5pbmcuCi0KLUZyaSBTZXAgIDggMTY6MzI6NDMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIGNvbmZpZ3VyZS50Z3QuCi0KLQkqIGxkZW11bC5oIChsZGVtdWxfc2V0X3N5bWJvbHMpOiBEZWNsYXJlLgotCShsZGVtdWxfcGFyc2VfYXJncyk6IERlY2xhcmUuCi0JKiBsZGVtdWwuYyAobGRlbXVsX3BhcnNlX2FyZ3MpOiBGaXggaW5kZW50YXRpb24uCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19IRUFERVJfRElSRU5ULgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW06IFVzZSBhdXRvY29uZiByZWNvbW1lbmQgbWVjaGFuaXNtIHRvIGRlZmluZQotCURJUiBhbmQgc3RydWN0IGRpcmVudC4KLQotCSogY29uZmlndXJlLnRndCAobWlwcyotKi1ic2QqKTogTmV3IGNhc2UuCi0KLQkqIGNvbmZpZ3VyZS5ob3N0IChpWzM0NV04Ni1zZXF1ZW50LXB0eCogfCBpWzM0NV04Ni1zZXF1ZW50LXN5c3YqKQotCU5ldyBjYXNlLgotCSogY29uZmlndXJlLnRndCAoaVszNDVdODYtKi1wdHgqKTogTmV3IGNhc2UuCi0KLVRodSBTZXAgIDcgMTA6NDg6MjYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcuaW46IFJlbmFtZSBmcm9tIGNvbmZpZy5oLmluLgotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0NPTkZJR19IRUFERVIgd2l0aCBjb25maWcuaDpjb25maWcuaW4uCi0JQ2hlY2sgZm9yIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuIGNyZWF0aW5nIHN0YW1wLWguCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0JKiBNYWtlZmlsZS5pbiAoc3RhbXAtaCk6IERlcGVuZCB1cG9uIGNvbmZpZy5pbiByYXRoZXIgdGhhbgotCWNvbmZpZy5oLmluLiAgU2V0IENPTkZJR19IRUFERVJTIHRvIGNvbmZpZy5oOmNvbmZpZy5pbiB3aGVuCi0JY2FsbGluZyBjb25maWcuc3RhdHVzLgotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuKTogUmVtb3ZlIGNvbmZpZy5oIGFuZCBzdGFtcC1oLgotCi0JKiBjb25maWd1cmUuaG9zdCAoc3BhcmMtKi1zdW5vczY0Kik6IFJlbW92ZS4KLQkqIGxkbGFuZy5jIChsYW5nX21hcCk6IENoZWNrIEJGRDY0LCBub3QgSE9TVF82NF9CSVQuCi0KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBEb24ndCB3YXJuIGFib3V0IG1vdmluZyB0aGUgbG9jYXRpb24KLQljb3VudGVyIGJhY2t3YXJkIGluIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLgotCi1XZWQgU2VwICA2IDE0OjQyOjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIHRvIHVzZSBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZS5ob3N0OiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS50Z3Q6IE5ldyBmaWxlLgotCSogYWNsb2NhbC5tNDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmU6IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvY29uZi4KLQkqIGFjY29uZmlnLmg6IE5ldyBmaWxlLgotCSogY29uZmlnLmguaW46IE5ldyBmaWxlLCBidWlsdCBieSBhdXRvaGVhZGVyLgotCSogc3lzZGVwLmg6IE5ldyBmaWxlLgotCSogbGQuaDogSW5jb3Jwb3JhdGUgb2xkIGNvbnRlbnRzIG9mIGNvbmZpZy5oLgotCSogY29uZmlnLmg6IFJlbW92ZS4KLQkqIE1ha2VmaWxlLmluOiBWYXJpb3VzIGNoYW5nZXMgZm9yIG5ldyBjb25maWd1cmUgc2NyaXB0LiAgQWxzbzoKLQkoQ0NfRk9SX0JVSUxEKTogUmVtb3ZlLgotCShsZG1haW4ubyk6IERvbid0IGJvdGhlciB0byBlbnN1cmUgdGhhdCBFTVVMIGlzIG5vbi1lbXB0eS4KLQkoZGVwLnNlZCk6IFVzZSBAU1JDRElSQCwgbm90IEBzcmNkaXJALgotCSogZGVwLWluLnNlZDogVXNlIEBTUkNESVJALCBub3QgQHNyY2RpckAuCi0JKiBnZW5zY3JpcHRzLnNoOiBDcmVhdGUgbGRzY3JpcHRzIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSogbGRlbXVsLmMsIGxleHN1cC5jLCBtcHctZW1pcHNpZHQuYzogRG9uJ3QgaW5jbHVkZSAiY29uZmlnLmgiLgotCSogbXB3LWVzaC5jLCBlbXVsdGVtcC8qLmVtOiBMaWtld2lzZS4KLQkqIGxkbWFpbi5jOiBMaWtld2lzZS4gIEluY2x1ZGUgPGN0eXBlLmg+LiAgRG9uJ3QgdHJ5IHRvIHNldAotCUhBVkVfU0JSSyBoZXJlLgotCSogY29uZmlnLyoubXQsIGNvbmZpZy8qLm1oOiBSZW1vdmUuCi0KLVR1ZSBTZXAgIDUgMTQ6NTU6MjQgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVHJlYXQgbnMzMmstcGM1MzItdXgqIGxpa2UgbnMzMmstcGM1MzItbWFjaCosIGFuZAotCW5zMzJrLXBjNTMyLWxpdGVzKiBsaWtlIG5zMzJrLXBjNTMyLW5ldGJzZCouICBGcm9tIElhbiBEYWxsLgotCi1GcmkgU2VwICAxIDIyOjI5OjUyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL3BlLnNjOiBGaXggdHlwbyBpbiBzcGVsbGluZyBvZiAuY3RvcnMvLmR0b3JzLgotCi1GcmkgU2VwICAxIDEzOjEzOjI5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKHdhcm5pbmdfY2FsbGJhY2spOiBBZGQgYWJmZCwgc2VjdGlvbiwgYW5kIGFkZHJlc3MKLQlwYXJhbWV0ZXJzLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JQ2hhbmdlIGNhbGwgdG8gd2FybmluZyBhY2NvcmRpbmdseS4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBJZiBub3QKLQlyZWxvY2F0ZWFibGUgYW5kIG5vdCBzaGFyZWQsIHB1dCAuZ251Lndhcm5pbmcuU1lNQk9MIHNlY3Rpb25zIGludG8KLQl0aGUgLnRleHQgc2VjdGlvbi4KLQotRnJpIFNlcCAgMSAwODozNToxNiAxOTk1ICBKYW1lcyBHLiBTbWl0aCAgPGpzbWl0aEBiZWF1dHkuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBtaXBzKnZyNDMwMC1pZHQtZWxmKiBhbmQKLSAgICAgICAgbWlwcyp2cjQzMDBlbC1pZHQtZWxmKiB0YXJnZXRzLgotCSogTWFrZWZpbGUuaW46IEFkZGVkIGVlbGYzMnZyNDMwMCogdGFyZ2V0cy4KLQkqIGVtdWxwYXJhbXMve2VsZjMydnI0MzAwLnNoLCBlbGYzMnZyNDMwMGVsLnNofTogQWRkZWQuCi0JKiBjb25maWcve21pcHMtdnI0MzAwLm10LCBtaXBzLXZyNDMwMGVsLm10fTogQWRkZWQuCi0KLUZyaSBTZXAgIDEgMTA6NTE6NDUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9hMjlrLnNjOiBGaXggdG8gYmUgcmVhc29uYWJsZS4gIEZyb20gQnJlbmRhbiBLZWhvZQotCTxicmVuZGFuQGN5Z251cy5jb20+LgotCi1UaHUgQXVnIDMxIDE2OjM3OjA3IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkZW11bC5jIChsZGVtdWxfcGFyc2VfYXJncyk6IE5ldy4KLQkqIGxkZW11bC5oIChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgcGFyc2VfYXJncy4KLQkqIGxleHN1cC5jIChhbGwgcGUgc3R1ZmYpOiBNb3ZlZCBpbnRvIHBlLmVtCi0JKHBhcnNlX2FyZ3MpOiBDYWxsIGVtdWxhdGlvbiBhcmcgcGFyc2VyLgotCSogZW11bHRlbXBsL3BlLmVtIChwYXJzZV9hcmdzKTogaGFuZGxlIFBFIHNwZWNmaWMgYXJncy4KLQotVGh1IEF1ZyAzMSAxNzowMTozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwKTogRG9uJ3QgdXNlIHRoZSBmaXJzdCByZWdpb24KLQlhcyB0aGUgZGVmYXVsdCByZWdpb24uICBDcmVhdGUgYSBuZXcgcmVnaW9uIGluc3RlYWQuCi0KLVR1ZSBBdWcgMjkgMTQ6MjE6NDEgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9zZXRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkZW11bC5oIChsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QpOiBBZGQgc2V0X3N5bWJvbHMuCi0JKiBsZG1haW4uYyAobWFpbik6IEFkZCBjYWxsIHRvIGxkZW11bF9zZXRfc3ltYm9scy4KLQkqIGxleHN1cC5jIChzZXRfcGVfdmFsdWUpOiBOZXcgYXJncy4KLQkoc2V0X3BlX25hbWUpOiBOZXcuCi0JKHBhcnNlX2FyZ3MpOiBDb3BlIHdpdGggbmV3IHNldF9wZV92YWx1ZSBhcmdzLgotCSogZW11bHRlbXBsL3BlLmVtIChzZXRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbi4KLQkobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIHNldF9zeW1ib2xzLgotCSogc2NyaXB0dGVtcGwvcGUuc2M6IFVzZSBuZXcgc3ltYm9scy4KLQotVGh1IEF1ZyAyNCAxODoxMjoxOCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogRG9uJ3QgY2FsbCBzZXRfZGVmYXVsdF9kaXJsaXN0IGZvciAtTy4KLQlGb3IgLVksIGlnbm9yZSBhIGxlYWRpbmcgYFAsJywgYW5kIG9ubHkgY2FsbCBzZXRfZGVmYXVsdF9kaXJsaXN0Ci0JYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgdGhlIG90aGVyIGFyZ3VtZW50cy4KLQotVHVlIEF1ZyAyMiAwNzozNjo1OCAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogS2VlcCAuZWRhdGEsIGRvbid0IGJhc2Ugc3RhYnMgYXQgMC4KLQkqIGVtdWxwYXJhbXMvYXJtcGUuc2g6IFJ1biBQRSBzY3JpcHQuCi0KLU1vbiBBdWcgMjEgMTg6MzA6NDIgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBSZW1vdmUgUEUgc3R1ZmYuCi0JKiBsZXhzdXAuYyAob3B0aW9ucyk6IExvYWQgbW9yZSBQRSBvcHRpb25zLgotCShzZXRfcGVfdmFsdWUpOiBOZXcgZnVuY3Rpb24uCi0KLVRodSBBdWcgMTcgMTM6MzU6NDkgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCi0JKiBlbXVsdGVtcGwve2FybXBlLnNjLCBpMzg2cGUuc2N9OiBEZWxldGVkLgotCSogZW11bHRlbXBsL3BlLnNjOiBOZXcgZmlsZSBwZXJmb3JtcyBnZW5lcmljIFBFIHN1cHBvcnQgYW5kIHNvcnRzCi0JYXJjaGl2ZSBtZW1iZXJzLgotCSogZW11bHBhcmFtcy97YXJtcGUuc2gsaTM4NnBlLnNofTogVXNlIG5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwve2FybXBlLnNjLCBpMzg2cGUuc2N9OiBEZWxldGVkCi0JKiBzY3JpcHR0ZW1wbC9wZS5zYzogTmV3LgotCSogTWFrZWZpbGUuaW46IFVzZSBuZXcgZmlsZXMuCi0KLVRodSBBdWcgMTcgMTQ6NDY6MzQgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaDg1MDBzLnNjICgucmRhdGEpOiBBbGwgZGF0YSBtdXN0IGdvIGluIGRhdGEgc2VnbWVudC4KLQkoLnN0cmluZ3MsLmN0b3JzLC5kdG9ycyk6IExpa2V3aXNlLgotCi1XZWQgQXVnIDE2IDExOjM4OjU5IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FybXBlLnNjOiBBbHdheXMgc3RhcnQgY29kZSBhdCAweDQwMTAwMCwgZXZlbgotCWlmIC1yLgotCSogbGR3cml0ZS5jIChzdHJkdXApOiBOZXcgZXh0ZXJuIGRlY2xhcmF0aW9uLgotCSogbGRncmFtLnkgKGF0eXBlKTogTmV3IHJ1bGUgdG8gY2xhcmlmeSB0eXBlIHBhcnNpbmcuCi0JKiBsZGxhbmcuYyAoaW5pdF9vcyk6IFJlbW92ZSBjb21tZW50ZWQgb3V0IGNvZGUuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IFNldCBTRUNfQUxMT0MgYW5kIFNFQ19MT0FEIGJpdHMKLQl1bmxlc3MgdG9sZCBub3QgdG8gYnkgdGhlIGxpbmsgc2NyaXB0LgotCi1XZWQgQXVnIDE2IDExOjQ1OjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2V0X3N0YXJ0b2YpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsYW5nX3Byb2Nlc3MpOiBDYWxsIGl0LgotCi0JKiBsZGdyYW0ueTogVHdlYWsgY2FzZXN5bWxpc3QgdG8gYXZvaWQgYmlzb24gZXJyb3JzLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFjY2VwdCAtaCBhcyBhIHN5bm9ueW0gZm9yIC0tc29uYW1lLCBmb3IKLQlTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLVR1ZSBBdWcgMTUgMTc6MzE6MTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGdyYW0ueSAoWVlERUJVRyk6IElmIG5vdCBkZWZpbmVkLCBkZWZpbmUgYXMgMS4KLQkoQ0FTRSwgRVhURVJOLCBTVEFSVCk6IE5ldyB0b2tlbnMuCi0JKG1yaV9zY3JpcHRfY29tbWFuZCk6IEhhbmRsZSBDQVNFLCBFWFRFUk4sIElOQ0xVREUsIFNUQVJULgotCShjYXNlc3ltbGlzdCk6IE5ldyBub250ZXJtaW5hbC4KLQkoZXh0ZXJuX25hbWVfbGlzdCk6IE5ldyBub250ZXJtaW5hbC4KLQkqIGxkbGV4Lmw6IEFjY2VwdCBsb3dlciBjYXNlIHRyYWlsaW5nIGJhc2Ugc3BlY2lmaWVycy4gIERvbid0Ci0JaWdub3JlIHRoZSBmaXJzdCBkaWdpdCB3aGVuIHRoZSBiYXNlIGlzIGEgc3VmZml4LiAgQWNjZXB0IG1hbnkKLQlFWFBSRVNTSU9OIHN0YXRlIHRva2VucyBpbiBNUkkgc3RhdGUuICBTdXBwb3J0IE1SSSBjb250aW51YXRpb24KLQlsaW5lcyBhbmQgTVJJIHNlbWljb2xvbiBjb21tZW50cy4gIEFjY2VwdCBhbGwgTVJJIGtleXdvcmRzIGluCi0JbG93ZXIgY2FzZS4gIEFkZCBDQVNFLCBFWFRFUk4sIGFuZCBTVEFSVCBNUkkga2V5d29yZHMuCi0KLVR1ZSBBdWcgIDggMTk6MTQ6NTggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBVc2UgeG1hbGxvYwotCWluc3RlYWQgb2YgYWxsb2NhLgotCi1UdWUgQXVnICA4IDE1OjI0OjA1IDE5OTUgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENDX0ZPUl9UQVJHRVQsIENYWF9GT1JfVEFSR0VUKTogRG9uJ3QgdXNlCi0JJHIvLi4vZ2NjL3hnY2MgdW5sZXNzIGl0IGlzIHByZXNlbnQuCi0KLVRodSBBdWcgIDMgMTE6NTY6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogT25seSBwdXQgLmN0b3JzIGFuZCAuZHRvcnMgaW4gLnRleHQKLQl3aGVuIENPTlNUUlVDVElORy4KLQkqIHNjcmlwdHRlbXBsL202OGtseW54LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL253LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL3NhMjkyMDAuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjOiBMaWtld2lzZS4KLQotRnJpIEp1bCAyOCAxMjowMjoyMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL3t6ODAwMS5zaCwgejgwMDIuc2h9OiBGaXggdHlwby4KLQotVGh1IEp1bCAyNyAyMTowNjoyMSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLWxpbnV4b2xkbGQpOiBUcmVhdCBsaWtlIGxpbnV4YW91dCouCi0KLVRodSBKdWwgMjcgMTU6MjY6MjggMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvaTM4NnBlLnNjOiBDb3BlIHdpdGggY29uc3RydWN0b3JzLgotCSogc2NyaXB0dGVtcGwvejhrc2ltLnNjOiBEZWxldGVkLgotCSogc2NyaXB0dGVtcGwvejgwMDAuc2M6IFJlc3VycmVjdGVkIGFzIHRoaXMsIGJ1dAotCWNhbiBoYW5kbGUgejgwMDEgYW5kIHo4MDAyIGZvcm1hdHMuCi0JKiBlbXVscGFyYW1zL3o4a3NpbS5zaDogRGVsZXRlZC4KLQkqIGVtdWxwYXJhbXMve3o4MDAxLnNoLCB6ODAwMi5zaH06IE5ldyBmaWxlcy4KLQkqIGNvbmZpZy96OGtzaW0ubXQ6IERlbGV0ZWQKLQkqIGNvbmZpZy96OGstY29mZi5tdDogTmV3LCBnZW5lcmF0ZXMgYm90aCBlbXVsYXRpb25zLgotCi1UdWUgSnVsIDI1IDE0OjUzOjAyIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEluICVDIGFuZCAlRCBjYXNlLCBhbHdheXMgcHJpbnQgdGhlIEJGRCB1c2luZwotCSVCLCBpbiBjYXNlIGl0IGlzIGluIGFuIGFyY2hpdmUuCi0KLU1vbiBKdWwgMjQgMTU6MjM6MzkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQ2FsbCByZXNldF9tZW1vcnlfcmVnaW9ucyBmb3IgZWFjaAotCXJlbGF4YXRpb24gcGFzcy4KLQotRnJpIEp1bCAyMSAyMjo0OTo0NCAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBBZGQgc3VwcG9ydCBmb3IgLnNkYXRhLCAuc2JzcywgYW5kCi0JX1NEQV9CQVNFLgotCi1UaHUgSnVsIDIwIDE2OjI2OjU1IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAoY29uc3RydWN0b3JfY2FsbGJhY2spOiBBbGxvY2F0ZSBzZXRfbmFtZSBpbiBzdGFjawotCWZyYW1lLCByYXRoZXIgdGhhbiBhbHdheXMgY2FsbGluZyBhbGxvY2Egd2l0aCBhIGZpeGVkIHNpemUuCi0KLVdlZCBKdWwgMTkgMTY6MjE6NDMgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9hcm1wZS5zaCAoT1VUUFVUX0ZPUk1BVCk6IENoYW5nZSB0byBwZWktYXJtLWxpdHRsZS4KLQkoTElUVExFX09VVFBVVF9GT1JNQVQsIEJJR19PVVRQVVRfRk9STUFUKTogRGVmaW5lLgotCi1Nb24gSnVsIDE3IDEzOjU3OjAwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogU2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIGNsb25lCi0Jc2VjdGlvbiB0byB0aGF0IG9mIHRoZSBzZWN0aW9uIGJlaW5nIGNsb25lZC4KLQotCSogbGR3cml0ZS5jIChzcGxpdF9zZWN0aW9ucyk6IERvbid0IHNwbGl0IHRoZSBmaXJzdCBpbnB1dCBzZWN0aW9uCi0JaW50byBhIG5ldyBvdXRwdXQgc2VjdGlvbi4KLQotU2F0IEp1bCAxNSAwMDoyNjozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KLQkoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lIGFzIHllcy4KLQotRnJpIEp1bCAxNCAxMjoxMTo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9taXBzZWNvZmYuZW0gKGNoZWNrX3NlY3Rpb25zKTogVXNlICVQLCBub3QgJUYuCi0KLQkqIGxkdmVyLmMgKGhlbHApOiBVcGRhdGUgbGlzdCBvZiBvcHRpb25zIHRvIG1hdGNoIGN1cnJlbnRseQotCXN1cHBvcnRlZCBsaXN0LgotCi1UaHUgSnVsIDEzIDEzOjUyOjEwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2xuazk2MC5lbSAobGRfbG5rOTYwX2VtdWxhdGlvbik6IEluaXRpYWxpemUKLQlhZnRlcl9vcGVuIGZpZWxkLgotCi0JKiBsZGV4cC5jIChleHBfaW50b3ApOiBEb24ndCBjYXN0IHN0YXRfYWxsb2MgYXJnIHRvIGJmZF9zaXplX3R5cGU7Ci0JaXQgdGFrZXMgYSBzaXplX3QgYW55aG93LgotCShleHBfYmlub3ApOiBMaWtld2lzZS4KLQkoZXhwX3RyaW5vcCk6IExpa2V3aXNlLgotCShleHBfdW5vcCk6IExpa2V3aXNlLgotCShleHBfbmFtZW9wKTogTGlrZXdpc2UuCi0JKGV4cF9hc3NvcCk6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXApOiBMaWtld2lzZS4KLQkoaW5pdF9vcyk6IExpa2V3aXNlLgotCShsZGxhbmdfYWRkX3VuZGVmKTogTGlrZXdpc2UuCi0JKGluc2VydF9wYWQpOiBMaWtld2lzZS4KLQkqIGxkZmlsZS5jIChsZGZpbGVfYWRkX2FyY2gpOiBEb24ndCBjYXN0IHhtYWxsb2MgYXJnIHRvCi0JYmZkX3NpemVfdHlwZS4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSXQncyBlYXJtYW91dGIubywgbm90IGVhcm1vdXRiLm8uCi0KLVdlZCBKdWwgMTIgMTE6MzI6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuaCAobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlKTogQWRkIHNlYXJjaCBwYXJhbWV0ZXIgdG8KLQlkZWNsYXJhdGlvbi4KLQkobGRfZW11bGF0aW9uX3hmZXJfdHlwZSk6IEFkZCBzZWFyY2ggcGFyYW1ldGVyIHRvCi0Jb3Blbl9keW5hbWljX2FyY2hpdmUgZW50cnkgcG9pbnQuCi0JKiBsZGVtdWwuYyAobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlKTogQWRkIHNlYXJjaCBwYXJhbWV0ZXIuCi0JKiBsZGZpbGUuYyAobGRmaWxlX3RyeV9vcGVuX2JmZCk6IFJlbmFtZSBmcm9tIHRyeV9vcGVuX2JmZCwgYW5kCi0JbWFrZSBub24tc3RhdGljLiAgQ2hhbmdlIGFsbCBjYWxsZXJzIHRvIHVzZSBuZXcgbmFtZS4KLQkobGRmaWxlX29wZW5fZmlsZV9zZWFyY2gpOiBNYWtlIHN0YXRpYy4gIElmIGVudHJ5IGlzIGR5bmFtaWMsIGNhbGwKLQlsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUuCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBEb24ndCBjYWxsIGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZS4KLQkqIGxkZmlsZS5oIChsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCk6IERvbid0IGRlY2xhcmUuCi0JKGxkZmlsZV90cnlfb3Blbl9iZmQpOiBEZWNsYXJlLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSk6Ci0JQWNjZXB0IHNlYXJjaCBwYXJhbWV0ZXIuICBEb24ndCBzZWFyY2ggZm9yIGEgbGlicmFyeSwganVzdCBsb29rIGluCi0JYSBzaW5nbGUgcGxhY2UuCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlKToKLQlMaWtld2lzZS4KLQotVHVlIEp1bCAxMSAxNjo0NDoyMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChzZXRfc2NyaXB0c19kaXIpOiBEb24ndCBiYXNlIHNjcmlwdCBkaXJlY3Rvcnkgb24KLQljdXJyZW50IGRpcmVjdG9yeS4KLQotVHVlIEp1bCAxMSAxMjoyOTowMiAxOTk1ICBSaWNrIFNsYWRrZXkgIDxqcnNAd29ybGQuc3RkLmNvbT4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IERvbid0IHByaW50IHRoZSBsaW5lIG51bWJlciBpZiBpdCBpc24ndAotCW1lYW5pbmdmdWwuCi0KLU1vbiBKdWwgMTAgMTM6Mzg6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBmaWVsZCB3YXJuX2NvbnN0cnVjdG9ycy4KLQkqIGxkbWFpbi5jIChhZGRfdG9fc2V0KTogV2FybiBpZiBjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogTGlrZXdpc2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEhhbmRsZSAtd2Fybi1jb25zdHJ1Y3RvcnMuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtd2Fybi1jb25zdHJ1Y3RvcnMuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTogRG9uJ3QKLQlnZXQgY29uZnVzZWQgYnkgZGlyZWN0b3J5IG5hbWVzIGlmIHdlIHNlYXJjaGVkIGZvciB0aGUgZmlsZS4KLQotCUJhc2VkIG9uIHBhdGNoZXMgZnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+OgotCSogbGRsYW5nLmggKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUpOiBBZGQgbmV3IGZpZWxkIGR5bmFtaWMuCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogU2V0IGR5bmFtaWMgZnJvbSBjb25maWcuZHluYW1pY19saW5rLgotCSogbGRmaWxlLmM6IEluY2x1ZGUgYmZkbGluay5oLgotCShsZGZpbGVfb3Blbl9maWxlKTogQ2hlY2sgZHluYW1pYyBmaWVsZCBvZiBlbnRyeSwgbm90IGdsb2JhbAotCWR5bmFtaWNfbGluayBmaWVsZC4gIERvbid0IGRvIGEgZHluYW1pYyBzZWFyY2ggd2hlbiBkb2luZyBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuCi0JKiBsZG1haW4uYyAobWFpbik6IERvbid0IHdhcm4gYWJvdXQgZHluYW1pY19saW5rIGZvciBhCi0JcmVsb2NhdGVhYmxlIGxpbmsuCi0JKiBlbXVsdGVtcGwvc3Vub3MuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc28pOiBTa2lwIGZpbGUgaWYKLQlkeW5hbWljIGlzIGZhbHNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyk6IEFsd2F5cwotCWxvb3Agb3ZlciBpbnB1dCBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogbGQudGV4aW5mbywgbGQuMTogRG9jdW1lbnQgLUJzdGF0aWMsIC1CZHluYW1pYywgLUJzaGFyZWQsIGFuZAotCS1zaGFyZWQuCi0KLU1vbiBKdWwgMTAgMTM6Mjk6NDMgMTk5NSAgRXJpYyBZb3VuZ2RhbGUgIDxlcmljQGFpYi5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogU2V0IGxpbmtfaW5mby5zeW1ib2xpYyB0byBmYWxzZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1Cc3ltYm9saWMuCi0KLVdlZCBKdWwgIDUgMDA6MTI6MTEgMTk5NSAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChIQVZFX1NCUkspOiAgRGVmaW5lIGZvciBldmVyeXRoaW5nIGV4Y2VwdAotCXNwZWNpZmljIHN5c3RlbXMgdGhhdCBhcmUga25vd24gdG8gbm90IHN1cHBvcnQgc2Jyay4KLQkobWFpbik6ICBVc2UgSEFWRV9TQlJLIHRvIGRlY2lkZSB3aGV0aGVyIG9yIG5vdCB0byB1c2Ugc2Jyay4KLQotVHVlIEp1bCAgNCAxMjo1NTo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCk6Ci0JSGFuZGxlIGV0cmVlX3Byb3ZpZGUuCi0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xvYmFsX25lZWRlZCk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGdsb2JhbF9mb3VuZCk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCk6IExpa2V3aXNlLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkKTogTGlrZXdpc2UuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZCk6IExpa2V3aXNlLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBSZXBsYWNlIGFmdGVyX29wZW5fZGVmYXVsdCB3aXRoCi0JZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3Blbi4KLQotTW9uIEp1bCAgMyAxNDoyNjozNyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGkzODYtKi13aW4zMik6IE5ldyB0YXJnZXQuCi0KLU1vbiBKdWwgIDMgMTQ6Mzk6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IExldCAtRyBlaXRoZXIgc2V0IHRoZSBzbWFsbCBkYXRhIHNpemUgb3IKLQliZSBlcXVpdmFsZW50IHRvIC0tc2hhcmVkLCBkZXBlbmRpbmcgb24gdGhlIG5leHQgYXJndW1lbnQuICBBY2NlcHQKLQlhbmQgaWdub3JlIC16IGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLVN1biBKdWwgIDIgMTc6NTI6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENhc3QgZm9wZW4gcmVzdWx0IHRvIFBUUiBiZWZvcmUgc3RvcmluZwotCWl0IGluIGxpbmtfaW5mby5iYXNlX2ZpbGUuICBGaXggaW5kZW50YXRpb24uCi0KLVdlZCBKdW4gMjggMTc6MTE6MjUgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBBbHdheXMgaW5pdGlhbGl6ZSBQRSBpbmZvIGluIGxpbmtfaW5mby4KLQkqIGxleHN1cC5jIChPUFRJT05fQkFTRV9GSUxFKTogTmV3IG9wdGlvbi4KLQkocGFyc2VfYXJncyk6IEhhbmRsZSBuZXcgb3B0aW9uLgotCSogZW11bHBhcmFtcy9hcm1wZS5zaDogT3V0cHV0IHBlaS4KLQkqIGVtdWx0ZW1wbC9pMzg2cGUuZW06IEFkZCBuZXdsaW5lIHRvIGVuZC4KLQkqIHNjcmlwdHRlbXBsL2FybXBlLnNjOiBDaGFuZ2Ugb3V0cHV0IGFuZCBxdW90ZSB0aGUgJHMuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2cGUuc2M6IENoYW5nZSBvdXRwdXQgYW5kIHF1b3RlIHRoZSAkcy4KLQotVGh1IEp1biAyMiAxOTo1NTo0MSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JU3VuIE1heSAgNyAxMTo1Mzo0MSBNRFQgMTk5NSAgQnJ5YW4gRm9yZCAgPGJhZm9yZEBjcy51dGFoLmVkdT4KLQotCSogY29uZmlndXJlLmluIChpMzg2LSotbXNkb3MqLCBpMzg2LSotbW9zcyopOiBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZGVkIGkzODZtc2Rvcy5vLgotCShpMzg2bXNkb3Mubyk6IE5ldyB0YXJnZXQuCi0JKiBjb25maWcvaTM4Ni1tc2Rvcy5tdDogQ3JlYXRlZC4KLQkqIGVtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoOiBDcmVhdGVkLgotCSogc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjOiBDcmVhdGVkLgotCi1UaHUgSnVuIDIyIDE1OjA2OjM1IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjICguZml4dXApOiBBZGQgc3VwcG9ydCBmb3IgYSAuZml4dXAgc2VjdGlvbgotCXRoYXQgY29udGFpbnMgcG9pbnRlcnMgdG8gYmUgcmVsb2NhdGVkLgotCi1UdWUgSnVuIDIwIDE3OjQ3OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWVzaC5jOiBOZXcgZmlsZSwgbW9kaWZpZWQgZm9yIE1QVyBmcm9tIGVzaC5jLgotCSogc2NyaXB0dGVtcGwvc2guc2M6IFJlZm9ybWF0dGVkIHRvIHNpbXBsaWZ5IE1QV2lmaWNhdGlvbiwKLQl1c2UgKigpIHRvIGNvbmNhdCBzdGFiIHNlY3Rpb25zIGluc3RlYWQgb2YgW10uCi0KLVRodSBKdW4gMTUgMDg6NDg6MTYgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogc2NyaXB0dGVtcGwvYXJtcGUuc2M6IEFkZCBjb25zdHJ1Y3RvciBzdXBwb3J0LgotCi1UdWUgSnVuIDEzIDA5OjExOjIwIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiAgQW55IHNlY3Rpb24gd2l0aCBhIERBVEEKLQlzdGF0ZW1lbnQgaGFzIGNvbnRlbnRzLgotCi1TdW4gSnVuIDExIDE1OjIwOjQ2IDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGVtdWxwYXJhbXMvbTY4a2VsZi5zaCAoTk9QKTogRGVmaW5lLgotCShEWU5BTUlDX0xJTkspOiBEb24ndCBkZWZpbmUuCi0JKFRFWFRfU1RBUlRfQUREUik6IFNldCB0byAweDgwMDAwMDAwOyB0aGUgZXh0cmEgMHgxMDAgZm9yIGhlYWRlcnMKLQl3aWxsIGNvbWUgZnJvbSB0aGUgbGlua2VyIHNjcmlwdC4KLQotVGh1IEp1biAgOCAxNDoxNzozMyAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoLCBzY3JpcHRlbXBsL2FybXBlLnNjOiBBZGQgZW5kIGFuZCBzdGFjay4KLQotTW9uIEp1biAgNSAwMjoxNjoyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1nbnUqKTogVXNlIEdOVSBlbGYgY29uZmlnLgotCi1UaHUgTWF5IDI1IDExOjQ5OjI4IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCUZyb20gQW5kcmV3IENhZ25leSA8Y2FnbmV5QGhpZ2hsYW5kLmNvbS5hdT4KLQkqIE1ha2VmaWxlLmluOiBGaXh1cCBtb3JlIGdvdGNoYXMgZnJvbSByZW5hbWluZyBlbGYzMnBwY2xlIHRvCi0JZWxmMzJscHBjLgotCi1XZWQgTWF5IDI0IDExOjIzOjIxIDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQlBZGQgc3VwcG9ydCBmb3IgQVJNLVBFLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGFybXBlLm8KLQkqIGNvbmZpZ3VyZS5pbjogUmVjb2duaXplIGFybXBlLgotCSogY29uZmlnL2FybS1wZS5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2FybXBlLnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2FybXBlLnNjOiBOZXcgZmlsZS4KLQotCi1Nb24gTWF5IDIyIDE1OjE5OjI2IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChoODMwMGgtKi1obXMpOiBEZWxldGVkCi0JKiBjb25maWcvY2YtaDgzMDBoLm10OiBEZWxldGVkLgotCi1UaHUgTWF5IDE4IDA0OjI2OjEwIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCVdlZCBNYXkgMTAgMTQ6Mjg6MTYgMTk5NSBSaWNoYXJkIEVhcm5zaGF3IChyZWFybnNoYUBhcm1sdGQuY28udWspCi0KLQlGcm9tIERhdmlkIFRheWxvciAoZHRheWxvckBhcm1sdGQuY28udWspCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZWFybW91dFtsYl0ubwotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYXJteyxlW2xiXS0qLWFvdXQuCi0JKiBjb25maWcvYXJtW2xiXS1hb3V0Lm10OiBOZXcgZmlsZXMuCi0JKiBlbXVscGFyYW1zL2FybWFvdXRbbGJdLnNoOiBOZXcgZmlsZXMuCi0JKiBzY3JpcHR0ZW1wbC9hcm1hb3V0LnNjOiBOZXcgZmlsZS4KLQotVHVlIE1heSAxNiAxODoyNzoxMSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9wcGNsZS1lbGYzMi5tdCAoRU1VTCk6IFVzZSBlbGYzMmxwcGMsIG5vdCBlbGYzMnBwY2xlLCB0bwotCWJlIHVuaXF1ZSBpbiA4IGNoYXJhY3RlcnMgZm9yIERPUy4KLQotCSogZW11bHBhcmFtcy9lbGYzMmxwcGMuc2g6IE5ldyBmaWxlLCByZW5hbWVkIGZyb20gZWxmMzJwcGNsZS5zaC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGNsZS5zaDogRGVsZXRlZC4KLQotRnJpIE1heSAxMiAxMTowMzo1NSAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCQkJICBUb20gR3JpZXN0IDxncmllc3RAY3MueWFsZS5lZHU+Ci0KLQlJbml0aWFsIHN1cHBvcnQgZm9yIFBFIGV4ZWN1dGFibGVzIChlZyBOVCwgd2luMzIpCi0KLQkqIE1ha2VmaWxlLmluIChjb25maWd1cmUuaW4sIGVpMzg2cGUpOiBBZGQgc3VwcG9ydC4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBQRSBhcmd1bWVudCBpbmZvLgotCSogbGR3cml0ZS5jIChwcmludF9maWxlX3N0dWZmKTogRG9uJ3QgcHJpbnQgb3V0IC5kcmVjdHZlCi0JYW5kIC5kZWJ1ZyBzZWN0aW9uIGluZm8uCi0JKiBsZXhzdXAuYyAoc2V0X3N1YnN5c3RlbSwgc2V0X3N0YWNrX2hlYXAsIE9QVElPTl9IRUFQLAotCSBPUFRJT05fU1VCU1lTVEVNLCBwYXJzZV9hcmdzbSBzZXRfc3Vic3lzdGVtLCBzZXRfc3RhY2tfaGVhcCk6Ci0JIEhhbmRsZSBuZXcgYXJndW1lbnRzLgotCSogY29uZmlnL2kzODYtcGUubXQsIGVtdWx0ZW1wbC9pMzg2cGUuZW0sIHNjcmlwdHRlbXBsL2kzODZwZS5zYzoKLQlOZXcgZmlsZXMKLQotV2VkIE1heSAxMCAxODozNzo1OSAxOTk1ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYzogIFJlbW92ZSAuUEFSSVNDLnVud2luZCBzZWN0aW9uIGZyb20gdGV4dAotCXNlZ21lbnQuICBUaGlzIGFsbG93cyBsZCAtciB0byBwcmVzZXJ2ZSB1bndpbmQgc2VjdGlvbnMuCi0KLVR1ZSBNYXkgIDkgMTc6MTk6NTcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBsaXR0bGUgZW5kaWFuIFBvd2VyUEMgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMnBwY2xlLm8uCi0JKGVlbGYzMnBwY2xlLmMpOiBTdXBwb3J0IGZvciBsaXR0bGUgZW5kaWFuIFBvd2VyUEMuCi0KLQkqIGNvbmZpZy9wcGNsZS1lbGYzMi5tdDogTmV3IGZpbGUgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGNsZS5zaDogRGl0dG8uCi0KLVdlZCBNYXkgIDMgMTI6NTY6MzIgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IENoZWNrCi0Jc3Vic2VjdGlvbl9hbGlnbm1lbnQsIGluc3RlYWQgb2YgY2hlY2tpbmcgc2VjdGlvbl9hbGlnbm1lbnQgdHdpY2UuCi0JTm90aWNlZCBieSBBbGFuIE1vZHJhIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4uCi0KLVR1ZSBNYXkgIDIgMTY6MzY6MDcgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaHBwYSotKi1saXRlcyopOiBIYW5kbGUgbGlrZSBocHBhKi0qLSplbGYqLgotCi1Nb24gQXByIDI0IDE5OjIxOjAyIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBsZHdyaXRlLmMgKGxkd3JpdGUpOiBCZWZvcmUgZG9pbmcgYW55dGhpbmcsIHJlc2V0IHRoZSBlcnJvcgotCWNvZGUuICBJZiBiZmRfZmluYWxfbGluayByZXR1cm5zIGFuIGVycm9yLCBidXQgdGhlIGVycm9yIGNvZGUgaXMKLQl1bnNldCwgZG9uJ3QgaXNzdWUgYW4gZXh0cmEgbWVzc2FnZS4gIEFzc3VtZSBhIGNvcnJlY3QgZXJyb3IKLQltZXNzYWdlIHdhcyBhbHJlYWR5IHNldC4KLQotRnJpIEFwciAxNCAxNjozMToyNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbTY4a2VsZi5vLgotCShlbTY4a2VsZi5vKTogTmV3IHRhcmdldC4KLQkqIGNvbmZpZy9tNjhrLWVsZi5tdCwgZW11bHBhcmFtcy9tNjhrZWxmLnNoOiBOZXcgZmlsZXMuCi0JKiBjb25maWd1cmUuaW46IFVzZSB0aGVtIGZvciBtNjgqLSotZWxmLgotCi1UdWUgQXByIDExIDEyOjAyOjAzIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCU1lcmdlIGluIHN1cHBvcnQgZm9yIE1hYyBNUFcgYXMgYSBob3N0LgotCShPbGQgY2hhbmdlIGRlc2NyaXB0aW9ucyByZXRhaW5lZCBmb3IgaW5mb3JtYXRpb25hbCB2YWx1ZS4pCi0KLQkqIG1wdy1jb25maWcuaW4gKGkzODYtdW5rbm93bi1hb3V0KTogQ2hhbmdlIHRvIGkzODYtdW5rbm93bi1nbzMyLgotCShpMzg2LXVua25vd24tY29mZik6IFJlbW92ZS4KLQkoc2gtaGl0YWNoaS1obXMpOiBOZXcgdGFyZ2V0LgotCShlbXVsYXRpb25fb2ZpbGVzKTogU2V0IGNvcnJlY3RseSBmb3IgZWFjaCB0YXJnZXQuCi0JKHZlcnNpb24sIFRERUZJTkVTKTogQWRkIHRvIG1ha2VmaWxlIGZyYWdtZW50LgotCSogbXB3LW1ha2UuaW4gKEJJU09OKTogVXNlIGJ5YWNjIGluc3RlYWQgb2YgYmlzb24uCi0JKGVtXyouYyk6IFJlcGxhY2Ugd2l0aCBlKi5jIGV2ZXJ5d2hlcmUuCi0JKGxkZ3JhbS5oKTogU2VwYXJhdGUgYWN0aW9uIGZyb20gbGRncmFtLmMgZ2VuZXJhdGlvbi4KLQkoTERfUFJPRyk6IERlcGVuZCBvbiBWZXJzaW9uLnIuCi0JKFZlcnNpb24ucik6IGdlbmVyYXRlIGZyb20gdmVyc2lvbiBpbmZvLgotCSogbXB3LWVtaXBzaWR0LmM6IE5ldyBmaWxlLCBtb2RpZmllZCBmb3IgTVBXIGZyb20gZW1pcHNpZHQuYy4KLQotCSogbXB3LWNvbmZpZy5pbiAobTY4ay1hcHBsZS1tYWNvcywgcHBjLWFwcGxlLW1hY29zLAotICAgICAgICBpMzg2LXVua25vd24tYW91dCwgaTM4Ni11bmtub3duLWNvZmYpOiBOZXcgdGFyZ2V0cy4KLQkobTY4ay1hb3V0LCBtNjhrLWNvZmYpOiBSZW1vdmUgdGFyZ2V0cy4KLQkobWsudG1wKTogQWRkIGRlZmluaXRpb24gb2YgRU1VTC4KLQotCSogbXB3LWNvbmZpZy5pbiAoZW11bG5hbWUpOiBTZXQgYmFzZWQgb24gdGFyZ2V0LgotCShsZGVtdWwtbGlzdC5oKTogQ29uc3RydWN0LgotCSogbXB3LW1ha2UuaW4gKGluc3RhbGwtb25seSk6IE5ldyB0YXJnZXQuCi0JKGluc3RhbGwpOiBEZXBlbmQgb24gaW5zdGFsbC1vbmx5LgotCi0JKiBtcHctbWFrZS5pbiAoYmluZGlyKTogRml4IHBhdGhuYW1lLgotCShpbnN0YWxsKTogTW92ZSBoZXJlIGZyb20gbXB3LWJ1aWxkLmluLgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnQuCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyBtYWtlZmlsZSBmcmFnbWVudC4KLQkoVGhpcyBmaWxlIGlzIHNlbWktYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBNYWtlZmlsZS5pbi4pCi0JKiBsZGZpbGUuYyAoc2xhc2gpOiBJZiBNUFcsIHNldCB0byBgOicuCi0JKiBsZGxleC5sIChUUlVFX0ZBTFNFX0FMUkVBRFlfREVGSU5FRCk6IElmIE1QVywgc2V0IHRoaXMgdG8KLQlwcmV2ZW50IHJlZGVmaW5pdGlvbiBlcnJvcnMuCi0KLVR1ZSBBcHIgIDQgMTc6NTU6MTggMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAYmFuZy5oYWNrLmNvbT4KLQotCSogbGR3cml0ZS5jIChjbG9uZV9zZWN0aW9uKTogQWxpZ24gY2xvbmUgc2VjdGlvbnMgb24gZXZlbgotCWJvdW5kYXJpZXMuCi0KLVRodSBNYXIgMzAgMTQ6MzI6MjYgMTk5NSAgSC5KLiBMdSAoaGpsQG55bmV4c3QuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBsaW51eCB0byBkZWZhdWx0IHRvIGVsZi4gIFVzaW5nCi0JaVszNDVdODYtKi1saW51eGFvdXQgd2lsbCBidWlsZCBhIGxpbmtlciB3aGljaCBkZWZhdWx0cyB0byBhLm91dC4KLQkqIGNvbmZpZy9pMzg2LWxhb3V0Lm10OiBSZW5hbWUgZnJvbSBvbGQgY29uZmlnL2kzODYtbGludXgubXQuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdDogUmVuYW1lIGZyb20gb2xkIGNvbmZpZy9pMzg2LWxlbGYubXQuCi0JKiBjb25maWcvaTM4Ni1sZWxmLm10OiBSZW1vdmUuCi0KLVRodSBNYXIgMzAgMTM6MDk6NDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IElmIG9wZW5pbmcgdGhlIG1hcCBmaWxlIGZhaWxzLCBjYWxsCi0gICAgICAgIGJmZF9zZXRfZXJyb3IgYmVmb3JlIGNhbGxpbmcgZWluZm8uCi0KLQkqIGxkLnRleGluZm8sIGxkLjE6IERvY3VtZW50IHRoZSAtbm8ta2VlcC1tZW1vcnkgb3B0aW9uLgotCi1Nb24gTWFyIDI3IDExOjEwOjA4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRtYWluLmMgKG1haW4pOiBSZXZlcnQgcGF0Y2ggb2YgTWFyY2ggMTAsIHNpbmNlIHRoZSBTVlI0IGxpbmtlcgotCWRvZXMgbWFyayBzaGFyZWQgbGlicmFyaWVzIGFzIGV4ZWN1dGFibGUuCi0KLVR1ZSBNYXIgMjEgMTU6MTU6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBDaGFuZ2UgcG93ZXIgdG8gaW50LiAgUGFzcyBsYXJnZXIgdmFsdWVzCi0JYmVmb3JlIHNtYWxsZXIgdmFsdWVzLgotCShsYW5nX29uZV9jb21tb24pOiBUcmVhdCBpbmZvIGFzIGludCAqLiAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGZvcgotCWxhc3QgdmFsdWUsIHNpbmNlIGl0IGlzIG5vdyB6ZXJvLgotCi1TYXQgTWFyIDE4IDAxOjQ5OjE0IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxvYWRfc3ltYm9scyk6IEFuIGVtcHR5IGFyY2hpdmUgaXMgT0suCi0KLUZyaSBNYXIgMTcgMTY6MTU6MzEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAocHJvZ3Jlc3MuaCk6IEluY2x1ZGUuCi0JKG1haW4pOiBDYWxsIFNUQVJUX1BST0dSRVNTIGFuZCBFTkRfUFJPR1JFU1MuCi0KLVRodSBNYXIgMTYgMTc6MTc6MzMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogTW92ZSBfR09UMl9FTkRfIGFmdGVyIHRoZSAuY3RvcnMgYW5kCi0JLmR0b3JzIHNlY3Rpb25zLCBzbyB0aGF0IHRoZXNlIHBvaW50ZXJzIGdldCByZWxvY2F0ZWQgYWxzby4KLQlEZWZpbmUgdGhlIHN5bWJvbHMgX197QyxEfVRPUl97TElTVCxFTkR9X18gdG8gbWFyayB0aGUgYmVnaW5uaW5nCi0JYW5kIGVuZCBvZiB0aGUgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzLgotCi1UaHUgTWFyIDE2IDEzOjU5OjE0IDE5OTUgIFJvbGFuZCBNY0dyYXRoICA8cm9sYW5kQGNodXJjaHkuZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBJZiB3aG9sZV9hcmNoaXZlIGlzIHRydWUgYW5kIEVOVFJZCi0JZGVzY3JpYmVzIGFuIGFyY2hpdmUsIGNhbGwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgb24gZWFjaCBtZW1iZXIuCi0JKiBsZG1haW4uYyAod2hvbGVfYXJjaGl2ZSk6IE5ldyB2YXJpYWJsZS4KLQkobWFpbik6IEluaXRpYWxpemUgaXQgdG8gZmFsc2UuCi0JKiBsZG1haW4uaDogRGVjbGFyZSB3aG9sZV9hcmNoaXZlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBHcm9rIC0td2hvbGUtYXJjaGl2ZSBzd2l0Y2guCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBEb2N1bWVudCAtLXdob2xlLWFyY2hpdmUuCi0KLVRodSBNYXIgMTYgMTE6Mzg6NDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZW5zY3JpcHRzLnNoIChFTVVMQVRJT05fTkFNRSk6IFNldCBMSUJfUEFUSCB0byBlbXB0eSB3aGVuIG5vdAotCXVzaW5nIHRoZSBkZWZhdWx0IGVtdWxhdGlvbi4KLQotCSogY29uZmlnL2RndXgubWggKEhPU1RJTkdfRU1VKTogVXNlIC1tIHJhdGhlciB0aGFuIHRyeWluZyB0byBzZXQKLQlMREVNVUxBVElPTi4KLQkqIGNvbmZpZy9ocHBhZWxmLm1oIChIT1NUSU5HX0VNVSk6IExpa2V3aXNlLgotCi1UdWUgTWFyIDE0IDEyOjI4OjAzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogU2V0IGZvcmNlX21hagotCWZvciAtbGMuTi4gIEZyb20gSC5KLiBMdSA8aGpsQG55bmV4c3QuY29tPi4KLQotRnJpIE1hciAxMCAxNDo0Mzo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jIChtYWluKTogRG9uJ3Qgc2V0IEVYRUNfUCBpZiBsaW5rX2luZm8uc2hhcmVkIGlzIHNldC4KLQotCSogbGRsZXgubDogUmV0dXJuIC1sRklMRU5BTUUgYXMgdGhlIHRva2VuIExOQU1FLgotCSogbGRncmFtLnk6IEFkZCB0b2tlbiBMTkFNRS4KLQkoaW5wdXRfbGlzdCk6IFRyZWF0IExOQU1FIGxpa2UgTkFNRSwgYnV0IHBhc3MgaXQgdG8KLQlsYW5nX2FkZF9pbnB1dF9maWxlIGFzIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0uCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCB1c2luZyAtbEZJTEVOQU1FIGluIElOUFVULgotCi1UaHUgTWFyICA5IDEyOjIxOjUxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfY2hlY2spOiBJZiB0aGUgYXJjaGl0ZWN0dXJlcyBhcmUgY29tcGF0aWJsZSBjYWxsCi0JYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEgdG8gbGV0IHRoZSBiYWNrZW5kIGRvIGFkZGl0aW9uYWwKLQljaGVja3MuCi0KLVR1ZSBNYXIgIDcgMDA6NTM6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZGVtdWwuYyAobGRlbXVsX2Nob29zZV9tb2RlKTogSWYgZW11bGF0aW9uIG5vdCByZWNvZ25pemVkLCBsaXN0Ci0JYWxsIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi1Nb24gTWFyICA2IDE0OjAzOjUwIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRlbXVsLmMgKGxkZW11bF9saXN0X2VtdWxhdGlvbnMpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGVtdWwuaCAobGRlbXVsX2xpc3RfZW11bGF0aW9ucyk6IERlY2xhcmUuCi0JKiBsZHZlci5jIChoZWxwKTogTGlzdCBzdXBwb3J0ZWQgdGFyZ2V0cyBhbmQgZW11bGF0aW9ucy4KLQotRnJpIE1hciAgMyAxNTo0MDozNiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2MgKC5kZWJ1Zyk6IFJlbG9jYXRlIHRvIGFkZHJlc3MgMC4KLQkoLmRlYnVnX3NyY2luZm8sIC5kZWJ1Z19hcmFuZ2VzLCAuZGVidWdfcHVibmFtZXMsCi0JLmRlYnVnX3NmbmFtZXMsIC5saW5lKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgIDMgMTc6MDc6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGhvbGRfcmVsKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogUGxhY2UgcmVhZG9ubHkgc2VjdGlvbnMgd2l0aAotCWNvbnRlbnRzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggIi5yZWwiIGFmdGVyIGhvbGRfcmVsLiAgUmVtb3ZlIHRoZQotCWFzc2VydGlvbiB3aGljaCBjaGVja2VkIGZvciB1bnBsYWNlZCAucmVsIHNlY3Rpb25zLiAgRG9uJ3QgdHJ5IHRvCi0Jc29ydCB0aGUgc2VjdGlvbiBpbnRvIHBsYWNlIGlmIHBsYWNlLT5iZmRfc2VjdGlvbiBpcyBOVUxMLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTogU2V0IGhvbGRfcmVsIHRvIHRoZSBmaXJzdAotCXNlY3Rpb24gYmVnaW5uaW5nIHdpdGggIi5yZWwiLgotCi1UaHUgTWFyICAyIDE0OjM0OjQzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCURvYyBub3RlIGZyb20gcGllcnJlQHBoaS5sYS50Y2UuY29tIChQaWVycmUgV2lsbGFyZCk6Ci0JKiBsZC50ZXhpbmZvOiAtWCBhbmQgLXggd29yayBldmVuIGlmIC1zIG9yIC1TIGFyZSBub3Qgc3BlY2lmaWVkLgotCSogbGQuMTogU2ltaWxhciBjaGFuZ2UuCi0KLVdlZCBNYXIgIDEgMTM6NTE6MTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVscGFyYW1zL2dsZDk2MGNvZmYuc2ggKENPRkZfQ1RPUlMpOiBEZWZpbmUuCi0JKiBzY3JpcHR0ZW1wbC9pOTYwLnNjOiBVc2UgQ09GRl9DVE9SUyBpZiBDT05TVFJVQ1RJTkcuCi0KLVR1ZSBGZWIgMjggMTI6NDI6NTYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGlbMzQ1XTg2LSotbGludXhlbGYqKTogTmV3IHRhcmdldC4gIFVzZSBpMzg2LWxlbGYuCi0JKGlbMzQ1XTg2LSotZ251ZWxmKik6IE5ldyB0YXJnZXQuICBVc2UgaTM4Ni1nZWxmLgotCSogY29uZmlnL2kzODYtbGVsZi5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvaTM4Ni1nZWxmLm10OiBOZXcgZmlsZS4KLQotVHVlIEZlYiAyOCAxMDoyNzo1NCAxOTk1ICBSb2IgU2F2b3llICA8cm9iQGRhcmtzdGFyLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogTWF0Y2ggb24gbWlwcy1lY29mZiwgYW5kIGRlZmF1bHQgdG8gdGhlIElEVAotCWNvbmZpZ3VyYXRpb24uCi0KLUZyaSBGZWIgMTcgMTM6MDY6NDcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZnBwYy5zYzogQWRkIHN1cHBvcnQgZm9yIC5nb3QxIGFuZCAuZ290MiBzZWN0aW9ucy4KLQlPZmZzZXQgX0dMT0JBTF9PRkZTRVRfVEFCTEVfIDMyNzY4IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBHT1QgYXJlYQotCXRvIGRvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgdGFibGUuCi0KLVRodSBGZWIgIDkgMTg6Mjk6NDMgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvIHJlY3Vyc2l2ZSBkZWxldGlvbiwgc2luY2UgbGRzY3JpcHRzCi0JaXMgYSBkaXJlY3RvcnkuCi0KLVRodSBGZWIgIDkgMTE6Mzg6MjIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobWFpbik6IElmIHRyYWNlX2ZpbGVfdHJpZXMgaXMgdHJ1ZSwgYW5kIHdlIGFyZSB1c2luZwotCWFuIGludGVybmFsIGxpbmtlciBzY3JpcHQsIHByaW50IG91dCB0aGUgc2NyaXB0LgotCSogbGRmaWxlLmMgKHRyeV9vcGVuKTogUmVpbmRlbnQgZnVuY3Rpb24uICBNYWtlIHRoZSBtZXNzYWdlcyBhYm91dAotCW9wZW5pbmcgc2NyaXB0IGZpbGVzIG1vcmUgaW5mb3JtYXRpdmUuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogRm9yIC1WLCBjYWxsIGxkdmVyc2lvbiB3aXRoIDEsIG5vdCAwLgotCSogbGQudGV4aW5mbywgbGQuMTogVXBkYXRlIGFjY29yZGluZ2x5LgotCi1XZWQgRmViICA4IDE3OjM0OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IEFkanVzdCByZWZlcmVuY2VzIHRvIGNvbW1vbiBzeW1ib2wKLQlpbmZvcm1hdGlvbiBmb3IgbmV3IHN0cnVjdHVyZS4KLQotTW9uIEZlYiAgNiAxMjoxNzoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkbWFpbi5jICh1bmRlZmluZWRfc3ltYm9sKTogSGFuZGxlIHNlY3Rpb24gYmVpbmcgTlVMTC4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogSGFuZGxlIGJmZF9saW5rX2hhc2hfZGVmd2Vhay4KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IExpa2V3aXNlLgotCSogbGRsYW5nLmMgKHByaW50X29uZV9zeW1ib2wpOiBMaWtld2lzZS4KLQkobGFuZ19maW5pc2gpOiBMaWtld2lzZS4KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9jb21tb24pOiBMaWtld2lzZS4KLQkqIGxkd3JpdGUuYyAocHJpbnRfc3ltYm9sKTogTGlrZXdpc2UuICBBbHNvLCBiZmRfbGlua19oYXNoX3dlYWsKLQlyZW5hbWVkIHRvIGJmZF9saW5rX2hhc2hfdW5kZWZ3ZWFrLgotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogU2V0IGFkZHJlc3Mgb2YgLmRhdGEgc2VjdGlvbiBjb3JyZWN0bHkKLQl3aGVuIC1uIG9yIC1OIGlzIHVzZWQuICBQYXRjaCBmcm9tIENocmlzIEcgRGVtZXRyaW91Ci0JPENocmlzX0dfRGVtZXRyaW91QExBR0FWVUxJTi5QREwuQ1MuQ01VLkVEVT4uCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBTaW1pbGFyIGNoYW5nZS4KLQotVHVlIEphbiAzMSAxNjoyMDo1MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQ2xhcmlmeSBlcnJvciBtZXNzYWdlIHdoZW4gdXNlcgotCXNwZWNpZmllZCBzdGFydCBhZGRyIGNvbmZsaWN0cyB3aXRoIHJlZ2lvbi4gIEZpeCByZXNldHRpbmcgb2YKLQlyZWdpb24gcG9pbnRlci4KLQotVHVlIEphbiAzMSAxMjozNzowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkZXhwLmMgKGZvbGRfbmFtZSk6IEluIGNhc2UgTkFNRSwgcGVybWl0IGFuIGFic29sdXRlIHN5bWJvbAotCWluIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLgotCi1Nb24gSmFuIDMwIDExOjMzOjI1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlcGVuZCB1cG9uIGNsZWFuLiAgRG9uJ3QgYm90aGVyIHRvCi0JcmVtb3ZlIGZpbGVzIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBieSBjbGVhbi4gIEZyb20gcGF0Y2ggYnkKLQlhbGFuQFNQUkkuTGV2ZWxzLlVuaVNBLkVkdS5BdSAoQWxhbiBNb2RyYSkuCi0KLUZyaSBKYW4gMjcgMTY6Mjc6MzQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogRm9yCi0JYSBNSVBTIHRhcmdldCwgY2xvYmJlciB0aGUgc2l6ZSBvZiBhbGwgYnV0IHRoZSBmaXJzdCBpbnB1dAotCS5yZWdpbmZvIHNlY3Rpb24gdG8gYmUgMCwgc28gdGhhdCBsYW5nX3NpemVfc2VjdGlvbnMgc2V0cyB0aGUKLQljb3JyZWN0IHNpemUgZm9yIHRoZSBvdXRwdXQgLnJlZ2luZm8gc2VjdGlvbi4KLQotVGh1IEphbiAyNiAxOTo1MzozNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24pOgotCVJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaXMuCi0KLVRodSBKYW4gMjYgMTI6MzM6MDUgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBwb3dlcnBjLSotZWFiaS4KLQotCSogc2NyaXB0dGVtcGwvZWxmcHBjLnNjOiBOZXcgZmlsZSBmb3IgUG93ZXJQQyBlbWJlZGRlZCBBQkkKLQlzdXBwb3J0LgotCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoIChTQ1JJUFRfTkFNRSk6IFVzZSBlbGZwcGMuc2MgaW5zdGVhZCBvZgotCWVsZi5zYywgd2hpY2ggZGVmaW5lcyBzb21lIG5ldyBzeW1ib2xzIFBvd2VyUEMgZWxmIG5lZWRzLgotCi1UdWUgSmFuIDI0IDEwOjMyOjE1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogRG9uJ3QgZHVtcCBjb3JlIGlmIGEKLQljb25zdHJ1Y3RvciBlbnRyeSBpcyBpbiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQotTW9uIEphbiAyMyAxMzo1ODoxMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi1nbnUqKTogU2V0IGxkX3RhcmdldCB0byBpMzg2LWdudS4KLQkqIGNvbmZpZy9pMzg2LWdudS5tdDogTmV3IGZpbGUuICBJbmNsdWRlIEVMRiBzdXBwb3J0LgotCi1UaHUgSmFuIDE5IDE2OjIyOjExIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IElmCi0JdGhlcmUgYXJlIGFueSBpbnB1dCBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcsIHRyZWF0IHRoZW0gYXMKLQljb250YWluaW5nIGEgd2FybmluZyBtZXNzYWdlIHRvIGJlIHByaW50ZWQgYnkgdGhlIGxpbmtlciwgYW5kCi0JY2xvYmJlciB0aGUgc2l6ZSBzbyB0aGF0IHRoZSBtZXNzYWdlIGlzIG5vdCBjb3BpZWQgaW50byB0aGUgb3V0cHV0Ci0JZmlsZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogUHV0IC5nbnUud2FybmluZyBzZWN0aW9ucyBpbnRvIHRoZSAudGV4dAotCXNlY3Rpb24uCi0KLVN1biBKYW4gMTUgMTY6NDU6MDAgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAodzY1LSotKik6IE5ldyB0YXJnZXQuCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlLgotCSogc2NyaXB0dGVtcGwvdzY1LnNjOiBOZXcuCi0JKiBjb25maWcvY29mZi13NjUubXQ6IE5ldy4KLQotVGh1IEphbiAxMiAwMTozMjoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsYW5nX3BsYWNlX29ycGhhbnMpOiBEb24ndCBpZ25vcmUgZmlsZXMgd2l0aAotCWp1c3Rfc3ltc19mbGFnIHNldC4gIEluc3RlYWQsIHB1dCBhbGwgdGhlaXIgc2VjdGlvbnMgaW4KLQliZmRfYWJzX3NlY3Rpb25fcHRyLCB1c2luZyB0aGUgc2VjdGlvbiBWTUEgYXMgdGhlIG91dHB1dF9vZmZzZXQuCi0KLVdlZCBKYW4gMTEgMjI6NTk6MDkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9idWlsZF9zZXRzKTogRG9uJ3QgdXNlIGBjb25zdCcgd2l0aCB0eXBlZGVmCi0JbmFtZSBgcmVsb2NfaG93dG9fdHlwZScsIHNpbmNlIGl0J3Mgbm93IGRlZmluZWQgdG8gYmUgY29uc3QuCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfcmVsb2MpOiBEaXR0by4KLQkqIGxkbGFuZy5oIChsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlLCBsYW5nX2FkZF9yZWxvYyk6IERpdHRvLgotCi1XZWQgSmFuIDExIDExOjI0OjQ1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGRleHAuYyAoZm9sZF9iaW5hcnkpOiBBZGRpbmcgb3Igc3VidHJhY3RpbmcgYW4gYWJzb2x1dGUgdmFsdWUKLQl0byBhIHJlbGF0aXZlIHZhbHVlIGRvZXMgbm90IHJlcXVpcmUgZm9yY2luZyB0aGUgcmVsYXRpdmUgdmFsdWUgdG8KLQliZSBhYnNvbHV0ZS4gIEFsc28sIHJlaW5kZW50IGZ1bmN0aW9uLgotCi1XZWQgRGVjIDI4IDIyOjA1OjUyIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkd3JpdGUuYyAoY2xvbmVfc2VjdGlvbik6IENyZWF0ZSBhIHN5bWJvbCB3aXRoIHRoZQotCXNhbWUgbmFtZSBhcyB0aGUgc2VjdGlvbi4KLQotTW9uIERlYyAxOSAxNDowMjoxMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBsZC5oIChzcGxpdF9ieV9yZWxvYywgc3BsaXRfYnlfZmlsZSk6IE5ldyBmbGFncy4KLQkqIGxkd3JpdGUuYyAgKGNsb25lX3NlY3Rpb24sIHNwbGl0X3NlY3Rpb25zKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogVW5kZXJzdGFuZCBuZXcgc3BsaXQgb3B0aW9ucy4KLQotRnJpIERlYyAgOSAxNzoyMjo1NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogTW92ZSAuY3RvcnMgYW5kIC5kdG9ycyBmcm9tIC50ZXh0IHNlZ21lbnQgdG8KLQkuZGF0YSBzZWdtZW50LiAgVGhleSBtdXN0IGJlIHdyaXRhYmxlIHdoZW4gY3JlYXRpbmcgYSBzaGFyZWQKLQlsaWJyYXJ5LiAgRnJvbSBILkouIEx1IDxoamxAbnluZXhzdC5jb20+LgotCi1GcmkgRGVjICAyIDE0OjA5OjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AcnRsLmN5Z251cy5jb20+Ci0KLQkqIGVtdWx0ZW1wbC9taXBvc2Vjb2ZmLmVtOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdC5zaCAoVEVNUExBVEVfTkFNRSk6IFNldCB0byBtaXBzZWNvZmYuCi0JKiBlbXVscGFyYW1zL21pcHNpZHRsLnNoIChURU1QTEFURV9OQU1FKTogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBQdXQgLnJlbC5zZGF0YSBzZWN0aW9ucyBpbiAudGV4dCwgYW5kCi0JcHJvdmlkZSBfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgYW5kIF9fcnVudGltZV9yZWxvY19zdG9wIGlmIHRoZXkgYXJlCi0JdXNlZC4gICBBbGlnbiBfZmRhdGEgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LgotCSogTWFrZWZpbGUuaW4gKGVtaXBzaWR0LmMpOiBEZXBlbmQgdXBvbiBtaXBzZWNvZmYuZW0gcmF0aGVyIHRoYW4KLQlnZW5lcmljLmVtLgotCShlbWlwc2lkdGwuYyk6IExpa2V3aXNlLgotCShjaGVjayk6IFBhc3MgQ0NfRk9SX0hPU1QgYW5kIENGTEFHU19GT1JfSE9TVCB0byBydW50ZXN0LgotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgbmV3IGZpZWxkIGVtYmVkZGVkX3JlbG9jcy4KLQkqIGxkZW11bC5oIChsZGVtdWxfYWZ0ZXJfb3BlbiwgYWZ0ZXJfb3Blbl9kZWZhdWx0KTogRGVjbGFyZS4KLQkobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQWRkIG5ldyBmaWVsZCBhZnRlcl9vcGVuLgotCSogbGRlbXVsLmMgKGxkZW11bF9hZnRlcl9vcGVuKTogTmV3IGZ1bmN0aW9uLgotCShhZnRlcl9vcGVuX2RlZmF1bHQpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQ2FsbCBsZGVtdWxfYWZ0ZXJfb3Blbi4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC0tZW1iZWRkZWQtcmVsb2NzLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplCi0JbmV3IGFmdGVyX29wZW4gZmllbGQgdG8gYWZ0ZXJfb3Blbl9kZWZhdWx0LgotCSogZW11bHRlbXBsL2dlbmVyaWMuZW0sIGVtdWx0ZW1wbC9nbGQ5NjAuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL2dsZDk2MGMuZW0sIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBMaWtld2lzZS4KLQkqIGVtdWx0ZW1wbC9saW51eC5lbSwgZW11bHRlbXBsL204OGtiY3MuZW06IExpa2V3aXNlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtLCBlbXVsdGVtcGwvdmFuaWxsYS5lbTogTGlrZXdpc2UuCi0JKiBsZC50ZXhpbmZvLCBsZC4xOiBNZW50aW9uIC1lbWJlZGRlZC1yZWxvY3MuCi0KLVdlZCBOb3YgMjMgMjI6MDQ6NDcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBlc2hsLm8uCi0JKiBjb25maWcvY29mZi1zaC5tdDogQWRkIHNobCBlbXVsYXRpb24uCi0KLVR1ZSBOb3YgMjIgMTE6NTU6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEZpbGwgLnRleHQgc2VjdGlvbiB3aXRoIE5PUFMuICBGcm9tIEVyaWMKLQlZb3VuZ2RhbGUgPGVyaWNAYWliLmNvbT4uCi0KLVRodSBOb3YgMTcgMTQ6Mzk6NDggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JUGF0Y2hlcyBmcm9tIHBpcmtlckBlaXVuaXgudHV3aWVuLmFjLmF0IChNYXJ0aW4gUGlya2VyKS4KLQkqIGNvbmZpZy9pMzg2bGludXgubWg6IE5ldyBmaWxlOyBzZXQgSE9TVElOR19DUlQwLgotCSogZ2Vuc2NyaXB0cy5zaDogRG9uJ3QgcHV0ICR7bGliZGlyfSBpbiBMSUJfUEFUSCBpZiBpdCBpcwotCS91c3IvbGliLCBzaW5jZSB0aGF0IGlzIGFscmVhZHkgaW4gTElCX1BBVEguCi0KLVdlZCBOb3YgMTYgMTA6MDM6MDMgMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2MgKC50ZXh0KTogSGFuZGxlIGEgdXNlIHJkZWZpbmVkIHRleHQgc3RhcnQKLQlhZGRyZXNzLgotCSguZGF0YSwgLmJzcyk6IElmICItTiIsIHRoZW4gcGxhY2UgdGhlIGRhdGEvYnNzIGp1c3QgYWZ0ZXIgdGhlIGVuZAotCW9mIHRoZSAudGV4dCBzZWN0aW9uIHJhdGhlciB0aGFuIGF0IHRoZSBkZWZhdWx0IDB4NDAwMDAwMDAuCi0KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2MgKC50ZXh0KTogUGxhY2UgdW53aW5kIGRlc2NyaXB0b3JzIGluIHRoZQotCXRleHQgc2VnbWVudC4KLQotU2F0IE5vdiAxMiAxNTo1NTo1NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlQYXRjaGVzIGZyb20gRXJpYyBZb3VuZ2RhbGUgPGVyaWNAYWliLmNvbT46Ci0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiBEb24ndCB3YXJuIGlmIGVudHJ5IHN5bWJvbCBub3QgZm91bmQKLQl3aGVuIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeS4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuKTogV2FybiBpZgotCWF0dGVtcHRpbmcgdG8gcGxhY2UgYW4gb3JwaGFuZWQgcmVsb2NhdGlvbiBzZWN0aW9uIHdoZW4gZ2VuZXJhdGluZwotCWEgZHluYW1pY2FsbHkgbGlua2VkIG9iamVjdC4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgRU5UUlkoJHtFTlRSWX0pLCBhbmQgZGVmYXVsdCAke0VOVFJZfSB0bwotCV9zdGFydC4KLQotRnJpIE5vdiAxMSAxNDoyNzoyMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBmaWVsZCBleHBvcnRfZHluYW1pYy4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogUmVjb2duaXplIC0tZXhwb3J0LWR5bmFtaWMuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKToKLQlQYXNzIGV4cG9ydF9keW5hbWljIGFyZ3VtZW50IHRvIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMuCi0KLVdlZCBOb3YgIDkgMTI6NDc6MTEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZGxhbmcuYyAobGFuZ19vbmVfY29tbW9uKTogU2V0IFNFQ19BTExPQyBpbiBhbnkgc2VjdGlvbiB3aGVyZQotCXdlIGFsbG9jYXRlIGNvbW1vbiBzeW1ib2xzLgotCi1UdWUgTm92ICA4IDE3OjUwOjQzIDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY0BhaWIuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCAucmVsLmluaXQsIC5yZWxhLmluaXQsIC5yZWwuZmluaSwgYW5kCi0JLnJlbGEuZmluaSB0byB0aGUgbGlzdCBvZiAucmVsKiBzZWN0aW9ucy4KLQotVHVlIE5vdiAgOCAxNzo0Nzo0NSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBBZGQgbmV3IGFyZ3VtZW50IHBsYWNlLiAgT25seSBhY2NlcHQKLQlsaW5rZXIgc2NyaXB0cyBpZiBwbGFjZSBpcyBub3QgTlVMTC4gIFB1dCBjb21tYW5kcyBmb3VuZCBpbiBhbgotCWFzc3VtZWQgbGlua2VyIHNjcmlwdCBpbnRvIHBsYWNlLgotCShsb29rdXBfbmFtZSk6IFBhc3MgTlVMTCBhcyBwbGFjZSBhcmd1bWVudCB0byBsb2FkX3N5bWJvbHMuCi0JKG9wZW5faW5wdXRfYmZkcyk6IEluIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW0gY2FzZSwgcGFzcyBhIHBsYWNlCi0JYXJndW1lbnQgdG8gbG9hZF9zeW1ib2xzLCBhbmQgc3RvcmUgYW55IG5ldyBzdGF0ZW1lbnRzIGFmdGVyIHRoZQotCWN1cnJlbnQgb25lLgotCi1Nb24gTm92ICA3IDE1OjUzOjAyIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IEJ1bXAgdG8gMi41LjMuCi0KLUZyaSBOb3YgIDQgMTU6MTE6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGUqbmJzZC5jKTogRml4IHR5cG8gaW4gZGVwZW5kZW5jaWVzLgotCi1UaHUgTm92ICAzIDE5OjM1OjQ0IDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IEFkZCBtaXNzaW5nICJlbHNlIHRydWUiIGNsYXVzZS4KLQotCSogZW11bHBhcmFtcy92YXguc2ggKE9VVFBVVF9GT1JNQVQpOiBVc2UgImEub3V0Ii4KLQotCSogc2NyaXB0dGVtcGwvZ28zMmNvZmYuc2M6IENoYW5nZXMgZnJvbSBESiBEZWxvcmllOiBDaGFuZ2UgZGVmYXVsdAotCWVudHJ5IHBvaW50IHRvICJzdGFydCIuICBBbGlnbiBhdCBlbmQgb2YgZWFjaCBzZWN0aW9uIHRvIDB4MjAwLgotCVN0YXJ0IC50ZXh0IHNlY3Rpb24gMHgxMDAwIGxhdGVyLiAgQWRkIF9ldGV4dCwgX2VkYXRhLCBfZW5kCi0Jc3ltYm9scy4KLQotV2VkIE5vdiAgMiAxMjoxNzo0OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkY3Rvci5jIChsZGN0b3JfYWRkX3NldF9lbnRyeSk6IERvbid0IHBlcm1pdCBhIHNldCB0byBiZQotCWNvbXBvc2VkIG9mIGRpZmZlcmVudCBvYmplY3QgZmlsZSBmb3JtYXRzLgotCShsZGN0b3JfYnVpbGRfc2V0cyk6IElmIHRoZSBvdXRwdXQgZm9ybWF0IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0JcmVsb2MsIGFuZCB3ZSBhcmUgbm90IGdlbmVyYXRpbmcgYSByZWxvY2F0ZWFibGUgbGluaywgdHJ5IGdldHRpbmcKLQl0aGUgcmVsb2MgZnJvbSB0aGUgaW5wdXQgZm9ybWF0LgotCi1UdWUgTm92ICAxIDEwOjMwOjE5IDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW02OGtuYnNkLm8uCi0JICAoZW02OGtuYnNkLmMpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWcvbTY4ay1uYnNkLm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvbTY4a25ic2Quc2g6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChtNjgqLSotbmV0YnNkKik6IFVzZSBhYm92ZSBjb25maWdzLgotCi1Nb24gT2N0IDMxIDE5OjM1OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTogSWYgd2UgZmluZCBhbgotCWFwcHJvcHJpYXRlbHkgbmFtZWQgc3RhdGljIGxpYnJhcnksIHN0b3AgdGhlIHNlYXJjaCBhdCB0aGF0Ci0JZGlyZWN0b3J5LgotCi1XZWQgT2N0IDI2IDEzOjU5OjEyIDE5OTQgIEouVC4gQ29ua2xpbiAgKGp0Y0BwaGlzaGhlYWQuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZWkzODZuYnNkLm8sIGVuczMya25ic2QubwotCSAgYW5kIGVzcGFyY25ic2Qubzsgc29ydGVkIGVudHJpZXMuCi0gICAgICAgICAgKGVpMzg2bmJzZC5jLGVuczMya25ic2QuYyxlc3BhcmNuYnNkLmMpOiBOZXcgdGFyZ2V0cy4KLQotCSogY29uZmlnL25ldGJzZDUzMi5tdDogUmVtb3ZlZC4KLQkqIGVtdWxwYXJhbXMvbmV0YnNkNTMyLnNoOiBSZW1vdmVkLgotCi0JKiBjb25maWcve2kzODYtbmJzZC5tdCxuczMyay1uYnNkLm10LHNwYXJjLW5ic2QubXR9OiBOZXcgZmlsZXMuCi0JKiBlbXVscGFyYW1zL3tpMzg2bmJzZC5zaCxuczMya25ic2Quc2gsc3BhcmNuYnNkLnNofTogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluIChpWzM0NV04Ni0qLW5ldGJzZCosIG5zMzJrLXBjNTMyLW5ldGJzZCosCi0JICBzcGFyYyotKi1uZXRic2QqKTogVXNlIGFib3ZlIGNvbmZpZ3MuCi0KLVR1ZSBPY3QgMjUgMTE6NDc6MTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZG1haW4uYyAobXVsdGlwbGVfY29tbW9uKTogT25lIG9mIHRoZSB0eXBlcyBtYXkgbm93IGJlCi0JYmZkX2xpbmtfaGFzaF9pbmRpcmVjdC4gIFRoZSBvbGQgQkZEIGFyZ3VtZW50IG1heSBiZSBOVUxMLgotCi1UaHUgT2N0IDIwIDIyOjAxOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgKiBhdCB0aGUgZW5kIG9mIG02OGstaHAtaHB1eC4KLQotVHVlIE9jdCAxOCAxNTo1ODozOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkbGV4Lmw6IENhc3QgYXNzaWdubWVudCB0byB5eV9jaF9idWYgZmllbGQgdG8gY2hhciAqLCBub3QgdG8KLQlZWV9DSEFSICouCi0KLU1vbiBPY3QgMTcgMTQ6NTM6MTYgMTk5NCAgSi5ULiBDb25rbGluICAoanRjQHBoaXNoaGVhZC5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9udy5zYzogR2F0aGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kCi0JICBkZWZpbmUgX19DVE9SX19MSVNUX18gYW5kIF9fRFRPUl9MSVNUX18gYXBwcm9wcmlhdGVseS4KLQotRnJpIE9jdCAxNCAxNDozNTozOCAxOTk0ICBKLlQuIENvbmtsaW4gIChqdGNAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlaTM4Nm53Lm8gYW5kIGVwcGNudy5vLgotCSAgKGVpMzg2bncuYywgZXBwY253LmMpOiBOZXcgdGFyZ2V0cy4KLQotCSogY29uZmlnL3tpMzg2LHBwY30tbncubXQsIGVtdWxwYXJhbXMve2kzODYscHBjfW53LnNoLAotCSAgc2NyaXB0dGVtcGwvbncuc2M6IE5ldyBmaWxlcywgZm9yIGkzODYgYW5kIHBvd2VycGMgbmV0d2FyZS4KLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2VkIG5ldHdhcmUgbGRfdGFyZ2V0IG5hbWUgdG8gYmUge2kzODYscHBjfS1udwotCSAgaW5zdGVhZCBvZiB7aTM4NixwcGN9LWVsZi4KLQotIAkqIGNvbmZpZ3VyZS5pbiAoc3BhcmMqLSotbmV0d2FyZSk6IFJlbW92ZWQuICBUaGVyZSBpcyBubyBzdWNoCi0JICB0aGluZyBhbnltb3JlLgotCi0JKiBsZGludC50ZXhpbmZvOiBNb3ZlIG1pc3BsYWNlZCBgQGVuZCBpZnRleCcuCi0KLUZyaSBPY3QgMTQgMTI6MDI6MTggMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljQGFpYi5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogQWRkIC5yZWwuY3RvcnMsIC5yZWxhLmN0b3JzLCAucmVsLmR0b3JzLCBhbmQKLQkucmVsYS5kdG9ycyB0byB0aGUgbGlzdCBvZiAucmVsKiBzZWN0aW9ucy4KLQotVGh1IE9jdCAxMyAxNDoxNjoyNyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBsZHZlci5jIChsZHZlcnNpb24pOiBVcGRhdGUgdG8gdmVyc2lvbiAyLjUuCi0JKiBWZXJzaW9uIDIuNSByZWxlYXNlZC4KLQotCSogY29uZmlndXJlLmluIChhbGxfdGFyZ2V0cyk6IEhhbmRsZSBpMzg2LWxpbnV4Ki4KLQotVGh1IE9jdCAxMyAxMToyNDozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IFNldCBfZXRleHQgYW5kIF9fZXRleHQgdG8gLiwgbm90Ci0JJHtEQVRBX0FMSUdOTUVOVH0uICBUaGlzIGlzIGNvbXBhdGlibGUgd2l0aCBTdW5PUywgYW5kLCB3aXRoIGx1Y2ssCi0Jd2lsbCBub3QgYnJlYWsgYW55IG90aGVyIHN5c3RlbS4gIEZyb20gRXJpYyBWYWxldHRlCi0JPGV2QGNob3J1cy5mcj4uCi0KLVdlZCBPY3QgMTIgMTY6MjI6NTggMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENoYW5nZSAtViB0byBiZSBhIHN5bm9ueW0gZm9yIC12LiAgQWRkCi0JLS12ZXJib3NlIHRvIGdldCB0aGUgb2xkIC1WIGJlaGF2aW91ci4KLQkqIGxkLjEsIGxkLnRleGluZm86IERvY3VtZW50IHRoaXMgY2hhbmdlLgotCi1UdWUgU2VwIDI3IDE0OjU2OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZW1vdmUKLQlhc3NlcnRpb24sIHNpbmNlIGl0IGNvdWxkIGZhaWwgd2l0aCBhIHVzZXIgZGVmaW5lZCBsaW5rZXIgc2NyaXB0LgotCi0JKiBsZGV4cC5jIChmb2xkX25hbWUpOiBGb3IgREVGSU5FRCBjYXNlLCBkb24ndCB0cnkgdG8gbG9vayB1cCB0aGUKLQluYW1lIGluIHRoZSBoYXNoIHRhYmxlIGR1cmluZyB0aGUgZmlyc3QgcGhhc2UtLXRoZSBoYXNoIHRhYmxlIGRvZXMKLQlub3QgZXZlbiBleGlzdCBhdCB0aGF0IHBvaW50LCBtdWNoIGxlc3MgaGF2ZSB0aGUgcmlnaHQgdmFsdWUuCi0KLQkqIE1ha2VmaWxlLmluIChDQyk6IERlZmluZS4KLQkoQ1hYKTogTW92ZSBkZWZpbml0aW9uLCBjaGFuZ2UgZnJvbSBnKysgdG8gZ2NjLgotCShFWFBFQ1QsIFJVTlRFU1QpOiBDb3B5IGRlZmluaXRpb25zIGZyb20gdG9wIGxldmVsIE1ha2VmaWxlLmluLgotCShSVU5URVNUX0NDLCBSVU5URVNUX0NGTEFHUyk6IFJlbW92ZS4KLQkoUlVOVEVTVF9DWFgsIFJVTlRFU1RfQ1hYRkxBR1MpOiBSZW1vdmUuCi0JKENDX0ZPUl9UQVJHRVQsIENYWF9GT1JfVEFSR0VUKTogQ29weSBmcm9tIHRvcCBsZXZlbCBNYWtlZmlsZS5pbi4KLQkoLmNjLm8pOiBDb21tZW50IG91dC4KLQkodGVzdGRpcik6IFJlbW92ZS4KLQkoc2l0ZS5leHApOiBEb24ndCBjcmVhdGUgdGVzdGRpciBvciBzZXQgdG1wZGlyLgotCShjaGVjayk6IFJ1biBjaGVja3MgZXZlbiBpZiBub3QgcnVubmluZyBuYXRpdmUuICBVc2UgQ0NfRk9SX1RBUkdFVAotCWluc3RlYWQgb2YgUlVOVEVTVF9DQywgYW5kIGxpa2V3aXNlIGZvciBDWFguCi0JKGNkdGVzdCB0YXJnZXRzKTogQ29tbWVudCBvdXQuCi0JKiBjb25maWcvc29sYXJpczIubWggKEhPU1RJTkdfTElCUyk6IE9ubHkgbWVudGlvbiBjcnRlbmQubyBvbmNlLgotCSogY2R0ZXN0LWJhci5jYywgY2R0ZXN0LWZvby5jYywgY2R0ZXN0LWZvby5oOiBSZW1vdmUuCi0JKiBjZHRlc3QtbWFpbi5jYywgY2R0ZXN0LmV4cDogUmVtb3ZlLgotCi1Nb24gU2VwIDI2IDExOjQwOjMwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMmJtaXAuc2g6IFJlbmFtZSBmcm9tIGVsZjMybWlwYi5zaCB0byBhdm9pZCBET1MKLQlmaWxlIG5hbWluZyBwcm9ibGVtcy4KLQkqIGVtdWxwYXJhbXMvZWxmMzJsbWlwLnNoOiBSZW5hbWUgZnJvbSBlbGYzMm1pcGwuc2guCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBSZW5hbWUgZWVsZjMybWlwYi5vIHRvCi0JZWVsZjMyYm1pcC5vIGFuZCBlZWxmMzJtaXBsLm8gdG8gZWVsZjMybG1pcC5vLgotCShlZWxmMzJibWlwLmMpOiBSZW5hbWUgZnJvbSBlZWxmMzJtaXBiLmMuICBVc2UgZWxmMzJibWlwLnNoLgotCShlZWxmMzJsbWlwLmMpOiBSZW5hbWUgZnJvbSBlZWxmMzJtaXBsLmMuICBVc2UgZWxmMzJsbWlwLnNoLgotCSogY29uZmlnL21pcHNiLWVsZjMyLm10IChFTVVMKTogVXNlIGVsZjMyYm1pcCwgbm90IGVsZjMybWlwYi4KLQkqIGNvbmZpZy9taXBzbC1lbGYzMi5tdCAoRU1VTCk6IFVzZSBlbGYzMmxtaXAsIG5vdCBlbGYzMm1pcGwuCi0KLQkqIGdlbnNjcmlwdHMuc2g6IEFsd2F5cyBzZWFyY2ggL3Vzci9sb2NhbC9UQVJHRVQvbGliLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IElmIC1OIGlzIHNldCwgZm9yY2UgREFUQV9BRERSIHRvIGJlICIuIi4KLQotRnJpIFNlcCAyMyAxNTowNTo0OSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IEhhbmRsZSBpMzg2LWJzZGkqIHRhcmdldHMgbGlrZSBpMzg2LWJzZC4KLQotRnJpIFNlcCAyMyAwMDowNjo1OSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIHN1cHBvcnQgZm9yIC1hIGZvciBIUC9VWAotCWNvbXBhdGliaWxpdHkuCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogLWMgdGFrZXMgYW4gYXJndW1lbnQuCi0KLVR1ZSBTZXAgMjAgMTQ6MzU6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZC5oIChhcmdzX3R5cGUpOiBBZGQgbmV3IGZpZWxkIGVuZGlhbi4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1FQiBhbmQgLUVMIGJ5IHNldHRpbmcKLQljb21tYW5kX2xpbmUuZW5kaWFuLgotCSogbGRncmFtLnkgKGlmaWxlX3AxKTogQWNjZXB0IE9VVFBVVF9GT1JNQVQgd2l0aCB0aHJlZSBhcmd1bWVudHMuCi0JKiBsZGxhbmcuYyAobGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCk6IEFkZCBhcmd1bWVudHMgYmlnIGFuZCBsaXR0bGUuCi0JSWYgY29tbWFuZF9saW5lLmVuZGlhbiBpcyBzZXQsIHVzZSBpdCB0byBzZWxlY3QgYmlnIG9yIGxpdHRsZQotCXJhdGhlciB0aGFuIHRoZSBkZWZhdWx0LiAgQ2hhbmdlZCBhbGwgY2FsbGVycy4KLQkqIGxkbGFuZy5oIChsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KTogVXBkYXRlIGRlY2xhcmF0aW9uLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2g6IERlZmluZSBCSUdfT1VUUFVUX0ZPUk1BVCBhbmQKLQlMSVRUTEVfT1VUUFVUX0ZPUk1BVC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBsLnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2JpZy5zaDogTGlrZXdpc2UuCi0JKiBlbXVscGFyYW1zL21pcHNic2Quc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzaWR0LnNoOiBMaWtld2lzZS4KLQkqIGVtdWxwYXJhbXMvbWlwc2lkdGwuc2g6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9taXBzbGl0LnNoOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRGVmaW5lIEJJR19PVVRQVVRfRk9STUFUIGFuZAotCUxJVFRMRV9PVVRQVVRfRk9STUFUIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuICBQYXNzIHRoZW0gdG8KLQlPVVRQVVRfRk9STUFULgotCSogc2NyaXB0dGVtcGwvbWlwcy5zYzogUGFzcyBCSUdfT1VUUFVUX0ZPUk1BVCBhbmQKLQlMSVRUTEVfT1VUUFVUX0ZPUk1BVCB0byBPVVRQVVRfRk9STUFULgotCSogc2NyaXB0dGVtcGwvbWlwc2JzZC5zYzogTGlrZXdpc2UuCi0KLQkqIE1ha2VmaWxlLmluIChsZGdyYW0uaCk6IE1ha2Ugc2VwYXJhdGUgdGFyZ2V0IGZyb20gbGRncmFtLmMsCi0JZGVwZW5kaW5nIHVwb24gbGRncmFtLmMsIHNvIHRoYXQgYSBwYXJhbGxlbCBtYWtlIGRvZXMgbm90IHRyeSB0bwotCWJ1aWxkIGJvdGggYXQgb25jZS4KLQotCSogY29uZmlndXJlLmluIChtaXBzKmVsLWVsZiopOiBOZXcgdGFyZ2V0LgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkIGVlbGYzMm1pcGIubyBhbmQgZWVsZjMybWlwbC5vLgotCShlZWxmMzJtaXBsLmMpOiBOZXcgdGFyZ2V0LgotCi0JKiBjb25maWcvbWlwc2wtZWxmMzIubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGwuc2g6IE5ldyBmaWxlLgotCi1GcmkgU2VwIDE2IDEyOjE2OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKG1haW4pOiBSYXRoZXIgdGhhbiBwcm9oaWJpdGluZyBsZCAtciAtcywgdHJlYXQgaXQgYXMKLQlsZCAtciAtUyAteC4KLQotVGh1IFNlcCAxNSAxMzowNTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBQcmludCBCRkQgZmlsZSBuYW1lIGFzIHdlbGwgYXMgZmlsZSBuYW1lCi0JcmV0dXJuZWQgYnkgZmluZF9uZWFyZXN0X2xpbmUsIGluIGNhc2UgdGhlIGZpbGUgbmFtZSBpcyBzb21ldGhpbmcKLQl1bmhlbHBmdWwgc3VjaCBhcyBhIC5oIGZpbGUuICBIYW5kbGUgJXUuCi0KLVdlZCBTZXAgMTQgMTI6NDk6MTIgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfZG9fYXNzaWdubWVudHMpOiBNYWtlIHN1cmUgb3V0cHV0IHN0YXRlbWVudAotCWhhcyBhbiBhdHRhY2hlZCBiZmRfc2VjdGlvbiBiZWZvcmUgdHJ5aW5nIHRvIGRlcmVmZXJlbmNlIGl0LgotCi1XZWQgU2VwIDE0IDEyOjQ4OjA5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgbmV3IGZpZWxkIHdhcm5fb25jZS4KLQkqIGxkbWFpbi5jICh1bmRlZmluZWRfc3ltYm9sKTogSGFuZGxlIC13YXJuLW9uY2UuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFJlY29nbml6ZSAtd2Fybi1vbmNlLgotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IERvY3VtZW50IC13YXJuLW9uY2UuCi0JKiBsZC4xOiBMaWtld2lzZS4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEhhbmRsZSAlRCBhcyAlQywgYnV0IG5ldmVyIHByaW50IHRoZSBmdW5jdGlvbgotCW5hbWUuICBGb3IgJUMsIHByaW50IHRoZSBmdW5jdGlvbiBuYW1lIG9uIGEgc2VwYXJhdGUgbGluZSwgdG8ga2VlcAotCXRoZSBsZW5ndGggb2YgZXJyb3IgbWVzc2FnZXMgdW5kZXIgY29udHJvbC4KLQkqIGxkbWFpbi5jIChtdWx0aXBsZV9kZWZpbml0aW9uKTogVXNlICVEIGZvciBgYGZpcnN0IGRlZmluZWQKLQloZXJlLicnCi0JKHVuZGVmaW5lZF9zeW1ib2wpOiBVc2UgJUQgZm9yIGBgbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcwotCWZvbGxvdycnLgotCi0JKiBsZG1pc2MuYyAobXVsdGlwbGVfd2Fybik6IFJlbW92ZTsgbm8gbG9uZ2VyIHVzZWQuCi0JKiBsZG1pc2MuaCAobXVsdGlwbGVfd2Fybik6IERvbid0IGRlY2xhcmUuCi0KLVR1ZSBTZXAgMTMgMjA6NDc6NTggMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFByaW50IGFsbCBsaW5lcwotCXRvIHRoZSBtYXAgZmlsZS4KLQotVHVlIFNlcCAxMyAxNjozMDoxMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsb2FkX3N5bWJvbHMpOiBDaGVjayBmb3IgYXJjaGl2ZSBiZWZvcmUgb2JqZWN0LiAgVXNlCi0JYmZkX2NoZWNrX2Zvcm1hdF9tYXRjaGVzLCBhbmQsIGlmIGFtYmlndW91cywgcHJpbnQgYSBsaXN0IG9mCi0JbWF0Y2hpbmcgZm9ybWF0cy4gIElmIGZpbGUgZm9ybWF0IGlzIG5vdCByZWNvZ25pemVkLCB0cmVhdCBmaWxlIGFzCi0JYSBsaW5rZXIgc2NyaXB0LgotCSogbGRncmFtLnkgKHl5ZXJyb3IpOiBJZiBhc3N1bWluZyBhbiBvYmplY3QgZmlsZSBpcyBhIHNjcmlwdCwKLQltZW50aW9uIHRoYXQuICBUd2VhayB0aGUgZm9ybWF0IG9mIHRoZSBlcnJvciBtZXNzYWdlcy4KLQkqIGxkbGV4LmwgKGxleF93YXJuX2ludmFsaWQpOiBJZiBhc3N1bWluZyBhbiBvYmplY3QgaXMgYSBzY3JpcHQsCi0JZ3Vlc3MgdGhhdCB0aGlzIGlzIG5vdCBhY3R1YWxseSBhIHNjcmlwdCwgYW5kIGp1c3QgcmVwb3J0IHRoYXQgdGhlCi0JZmlsZSBmb3JtYXQgd2FzIG5vdCByZWNvZ25pemVkLgotCSogbGQudGV4aW5mbyAoT3B0aW9ucyk6IEFkbWl0IHRoYXQgLSggbWF5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UuCi0JQWRkIG5vdGUgdGhhdCB1bnJlY29nbml6ZWQgb2JqZWN0IGZpbGVzIGFyZSBub3cgdHJlYXRlZCBhcyBsaW5rZXIKLQlzY3JpcHRzLgotCi0JKiBsZGZpbGUuYyAobGRmaWxlX2lucHV0X2ZpbGVuYW1lKTogTWFrZSBjb25zdC4KLQkobGRmaWxlX2Fzc3VtZWRfc2NyaXB0KTogTmV3IHZhcmlhYmxlLgotCSh0cnlfb3Blbik6IENoYW5nZSBhcmd1bWVudHMgdHlwZXMgdG8gY29uc3QuCi0JKGxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZSk6IExpa2V3aXNlLgotCShsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUpOiBMaWtld2lzZS4gIEFsc28sIHNldCBsaW5lbm8gdG8gMS4KLQkqIGxkZmlsZS5oOiBVcGRhdGUgZGVjbGFyYXRpb25zIGZvciBsZGZpbGUuYyBjaGFuZ2VzLgotCSogbGRsZXgubDogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGZpbGVfbmFtZV9zdGFjayk6IENoYW5nZSB0byBiZSBjb25zdCBjaGFyICouCi0JKGxpbmVub19zdGFjayk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKDw8RU9GPj4pOiBTZXQgbGluZW5vIGFzIHdlbGwgYXMgbGRmaWxlX2lucHV0X2ZpbGVuYW1lLgotCShsZXhfcHVzaF9maWxlKTogTWFrZSBuYW1lIGFyZ3VtZW50IGNvbnN0LiAgSW5pdGlhbGl6ZQotCWxpbmVub19zdGFjayBlbnRyeS4KLQkobGV4X3JlZGlyZWN0KTogSW5pdGlhbGl6ZSBsaW5lbm9fc3RhY2sgZW50cnkuCi0JKGxleF93YXJuX2ludmFsaWQpOiBIYW5kbGUgbm9uIHByaW50YWJsZSBjaGFyYWN0ZXJzIG5pY2VseS4KLQkqIGxkbGV4LmggKGxleF9wdXNoX2ZpbGUpOiBEZWNsYXJlIHNlY29uZCBhcmd1bWVudCBhcyBjb25zdC4KLQotCSogbGRncmFtLnkgKGlmaWxlX3AxKTogUmVjb2duaXplIEdST1VQLgotCSogbGRsZXgubDogUmVjb2duaXplIEdST1VQLgotCSogbGQudGV4aW5mbyAoT3B0aW9uIENvbW1hbmRzKTogRG9jdW1lbnQgR1JPVVAuCi0KLU1vbiBTZXAgMTIgMTc6MDQ6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbTY4a2x5bngubWg6IE5ldyBmaWxlLgotCi1Nb24gU2VwIDEyIDAxOjUwOjAzIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbTogQWRkIG5ld2xpbmVzIHRvIHRoZSBlcnJvciBtZXNzYWdlcy4KLQotU2F0IFNlcCAxMCAxNjowNTozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2bHlueC5taDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9pMzg2bHlueC5zYzogRG9uJ3QgcHV0IC5jdG9ycyBhbmQgLmR0b3JzIGluIC50ZXh0Ci0JdW5sZXNzIENPTlNUUlVDVElORy4KLQotVGh1IFNlcCAgOCAxMzoyNToyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCShHRU5FUkFURV9TSExJQl9TQ1JJUFQpOiBEZWZpbmUgYXMgeWVzLgotCShEWU5BTUlDX0xJTkspOiBEZWZpbmUgYXMgZmFsc2UuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSk6Ci0JSW5pdGlhbGl6ZSBjb25maWcuZHluYW1pY19saW5rIHRvIERZTkFNSUNfTElOSyBpZiBpdCBpcyBkZWZpbmVkLgotCShnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4pOiBSZXNldCBzdGF0X3B0ciBhdCBlbmQuCi0JKiBNYWtlZmlsZS5pbiAoZWVsZjMybWlwYi5jKTogRGVwZW5kIHVwb24gZWxmMzIuZW0gcmF0aGVyIHRoYW4KLQlnZW5lcmljLmVtLgotCi1UaHUgU2VwICA4IDE2OjMwOjM3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBzY3JpcHR0ZW1wbC9oODUwMGIuc2M6IFB1dCByZGF0YSBzdHVmZiBpbnRvIG93biBzZWdtZW50LgotCi1UaHUgU2VwICA4IDEzOjI1OjI0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9lbGYzMnBwYy5zaCAoT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TKTogRG9uJ3QgZGVmaW5lOwotCS5nb3Qgc2VjdGlvbiBpcyBub3cgZXhwbGljaXRseSBoYW5kbGVkIGluIGVsZi5zYy4KLQotV2VkIFNlcCAgNyAxMzowODozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBSZWRvIHNjcmlwdCB0byBzZXQgLiBvdXRzaWRlIG9mIHNlY3Rpb25zCi0JYW5kIG5vdCBib3RoZXIgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHNlY3Rpb24gYWRkcmVzc2VzLgotCUV4cGxpY2l0bHkgcGxhY2UgLnNkYXRhIHNlY3Rpb24uCi0KLVR1ZSBTZXAgIDYgMjM6NTE6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9tNjhrY29mZi5zYzogUHV0IC5ic3MgaW4gZGF0YSBzZWdtZW50LgotCi0JKiBzY3JpcHR0ZW1wbC9oODMwMC5zYzogQ2hhbmdlIC5zdGFiIGFuZCAuc3RhYnN0ciB0byB1c2UgYSBWTUEgb2YKLQkwLCBhbmQgdG8gb25seSBiZSBtYXJrZWQgYXMgTk9MT0FEIGlmIHJlbG9jYXRpbmcuCi0JKiBzY3JpcHR0ZW1wbC9oODUwMC5zYywgc2NyaXB0dGVtcGwvaDg1MDBiLnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2g4NTAwYy5zYywgc2NyaXB0dGVtcGwvaDg1MDBtLnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL2g4NTAwcy5zYywgc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2M6IExpa2V3aXNlLgotCSogc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MsIHNjcmlwdHRlbXBsL2kzODZseW54LnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL202OGtjb2ZmLnNjLCBzY3JpcHR0ZW1wbC9tNjhrbHlueC5zYzogTGlrZXdpc2UuCi0JKiBzY3JpcHR0ZW1wbC9zaC5zYywgc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjOiBMaWtld2lzZS4KLQkqIHNjcmlwdHRlbXBsL3NwYXJjbHlueC5zYzogTGlrZXdpc2UuCi0KLVN1biBTZXAgMDQgMTc6NTg6MTAgMTk5NCAgUmljaGFyZCBFYXJuc2hhdyAocndlQHBlZ2FzdXMuZXNwcml0LmVjLm9yZykKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogQWRkIHN1cHBvcnQgKGRpc2FibGVkKSB0aGUgQVJNL1JJU0NpWC4KLQkqIGNvbmZpZy9yaXNjaXgubXQsIGVtdWxwYXJhbXMvcmlzY2l4LnNoLCBzY3JpcHR0ZW1wbC9yaXNjaXguc2M6Ci0JTmV3IGZpbGVzLgotCi1UdWUgQXVnIDMwIDExOjQ4OjA4IDE5OTQgIEVyaWMgWW91bmdkYWxlICAoZXJpY3lAY2Fpcy5jYWlzLmNvbSkKLQotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIGZpZWxkIHNvbmFtZS4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogSGFuZGxlIC1zb25hbWUgYXJndW1lbnQuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW06IEluIGNhbGwgdG8gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucywKLQlwYXNzIHNvbmFtZS4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IC1zb25hbWUuCi0KLU1vbiBBdWcgMjkgMTU6MjE6NTAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19jaGVjayk6IERvbid0IHRyeSB0byBzZXQgdGhlIGFyY2hpdGVjdHVyZSBpZiB0aGUKLQlpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIGFyZSBpbmNvbXBhdGlibGUuICBKdXN0IHdhcm4uCi0KLVdlZCBBdWcgMjQgMTI6NTI6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBpWzM0XTg2IHRvIGlbMzQ1XTg2LgotCi1TdW4gQXVnIDIxIDE2OjE3OjE5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9ocDNocHV4LnNoOiBEZWZpbmUgX19EWU5BTUlDIHRvIGJlIDAuCi0KLVRodSBBdWcgMTggMTU6Mzc6NDUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JTWFrZSB0aGUgRUxGIGxpbmtlciBoYW5kbGUgb3JwaGFuZWQgc2VjdGlvbnMgcmVhc29uYWJseS4gIEFsc28sCi0JZGVmaW5lIF9fc3RhcnRfU0VDTkFNRSBhbmQgX19zdG9wX1NFQ05BTUUgYXJvdW5kIHNlY3Rpb25zIHdob3NlCi0JbmFtZXMgY2FuIGJlIHJlcHJlc2VudGVkIGluIEMsIGZvciB0aGUgYmVuZWZpdCBvZiBzeW1ib2wgc2V0cyBpbgotCWdsaWJjLgotCSogbGRlbXVsLmggKGxkZW11bF9wbGFjZV9vcnBoYW4pOiBEZWNsYXJlLgotCShsZF9lbXVsYXRpb25feGZlcl90eXBlKTogQWRkIHBsYWNlX29ycGhhbiBmaWVsZC4KLQkqIGxkZW11bC5jIChsZGVtdWxfcGxhY2Vfb3JwaGFuKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsYW5nLmggKHdpbGRfZG9pdCk6IERlY2xhcmUuCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogTWFrZSBub25zdGF0aWMuCi0JKGxhbmdfcGxhY2Vfb3JwaGFucyk6IENhbGwgbGRlbXVsX3BsYWNlX29ycGhhbi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbTogSW5jbHVkZSA8Y3R5cGUuaD4gYW5kICJsZGdyYW0uaCIuCi0JKGhvbGRfc2VjdGlvbiwgaG9sZF91c2UsIGhvbGRfdGV4dCwgaG9sZF9kYXRhLCBob2xkX2Jzcyk6IE5ldwotCXN0YXRpYyB2YXJpYWJsZXMuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24pOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBJbml0aWFsaXplIHBsYWNlX29ycGhhbiBmaWVsZC4KLQotVHVlIEF1ZyAxNiAwMDoxNzoyMCAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IEFkZCAubGludXgtZHluYW1pYyBhZnRlciAuZGF0YS4KLQotVHVlIEF1ZyAxNiAwMDowODoyMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKSBUcmVhdCAtLWRsbC12ZXJib3NlIGFzIC0tdmVyc2lvbiwgZm9yCi0JTGludXggY29tcGF0aWJpbGl0eS4gIEZyb20gaGpsQG55bmV4c3QuY29tIChILkouIEx1KS4KLQotTW9uIEF1ZyAxNSAxNzoxNzozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmggKGV4cF9nZXRfYWJzX2ludCk6IERlY2xhcmUuCi0KLVNhdCBBdWcgIDYgMDE6NDU6MzkgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfZG9fYXNzaWdubWVudHMpOiAgSGFuZGxlIGNvbXBsZXggQVQncyBiZXR0ZXIuCi0JKiBsZGV4cC5jIChleHBfZ2V0X2Fic19pbnQpOiAgTmV3IGZ1bmN0aW9uLgotCi1GcmkgQXVnICA1IDIwOjU1OjU1IDE5OTQgIEphc29uIE1vbGVuZGEgKGNyYXNoQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWRkIGk5NjAtbmluZHktY29mZiBzdXBwb3J0LgotCi1UaHUgQXVnICA0IDE0OjQ1OjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCAoeXlfY3JlYXRlX3N0cmluZ19idWZmZXIpOiBIYW5kbGUgY2hhbmdlIHRvIGludGVybmFsCi0JaW50ZXJmYWNlIGluIGZsZXggMi40LjcuCi0KLVR1ZSBBdWcgIDIgMTE6NTI6MDYgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBlbXVsdGVtcGwvbGludXguZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfYWRkcmVzc19zdGF0ZW1lbnQpOgotCU5ldyBmdW5jdGlvbjsgYWRkIDB4MjAgdG8gYW55IHVzZSBvZiAtVHRleHQuCi0JKGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogTmV3Ci0JZnVuY3Rpb24uCi0JKGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbik6IFVzZSB0aGUgbmV3IGZ1bmN0aW9uCi0JZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMuCi0KLU1vbiBBdWcgIDEgMTU6NTA6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9taXBzLnNjOiBSZWRvIHNjcmlwdCB0byBzZXQgLiBvdXRzaWRlIG9mIHNlY3Rpb25zCi0JYW5kIG5vdCBib3RoZXIgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHNlY3Rpb24gYWRkcmVzc2VzLgotCi1UdWUgSnVsIDI2IDExOjAyOjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBDb3B5IHNldmVyYWwgbW9yZSByZWxvY2F0aW9uIHNlY3Rpb25zIGludG8KLQl0aGUgb3V0cHV0LiAgUHV0IC5nb3QucGx0IHNlY3Rpb25zIGludG8gLmdvdC4KLQotRnJpIEp1bCAyMiAxMjoxNTozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogVXNlIFBST1ZJREUgdG8gZGVmaW5lIGV0ZXh0LCBlZGF0YSwgYW5kIGVuZC4KLQotCUFkZCBhIG5ldyBzY3JpcHQgb3BlcmF0b3IsIFBST1ZJREUsIHRvIGRlZmluZSBhIHN5bWJvbCBvbmx5IGlmIGl0Ci0JaXMgbmVlZGVkLgotCSogbGRncmFtLnkgKFBST1ZJREUpOiBOZXcgdG9rZW4uCi0JKGFzc2lnbm1lbnQpOiBBY2NlcHQgUFJPVklERS4KLQkqIGxkbGV4LmwgKFBST1ZJREUpOiBOZXcgdG9rZW4uCi0JKiBsZGV4cC5oIChub2RlX3R5cGUpOiBBZGQgZXRyZWVfcHJvdmlkZSB0byBub2RlX2NsYXNzIGVudW0uCi0JKGV4cF9wcm92aWRlKTogRGVjbGFyZS4KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBIYW5kbGUgZXRyZWVfcHJvdmlkZS4KLQkoZXhwX3Byb3ZpZGUpOiBOZXcgZnVuY3Rpb24uCi0JKGV4cF9wcmludF90cmVlKTogSGFuZGxlIGV0cmVlX3Byb3ZpZGUuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCBQUk9WSURFLgotCi0JKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBQYXNzIGRlc2lyZWQgYWxpZ25tZW50IHRvCi0gICAgICAgIGxhbmdfb25lX2NvbW1vbiBhcyBwb3dlciBvZiB0d28uCi0JKGxhbmdfb25lX2NvbW1vbik6IEdldCBjb21tb24gc3ltYm9sIGFsaWdubWVudCBmcm9tIGxpbmtlciBoYXNoCi0JdGFibGUgZW50cnkuICBUcmVhdCBkZXNpcmVkIGFsaWdubWVudCBhcyBhIHBvd2VyIG9mIHR3by4KLQotCSogbGRsYW5nLmMgKHdpbGRfc2VjdGlvbik6IEF0dGFjaCBhbGwgc2VjdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lLAotCW5vdCBqdXN0IHRoZSBmaXJzdCBvbmUuICBJZiB0aGVyZSBpcyBubyBuYW1lLCBhdHRhY2ggYWxsIHNlY3Rpb25zCi0JZXZlbiBpZiB0aGUgU0VDX0lTX0NPTU1PTiBmbGFnIGlzIHNldC4KLQotV2VkIEp1bCAyMCAxNTo0OToyNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkLmggKGFyZ3NfdHlwZSk6IEFkZCBmaWVsZCBycGF0aC4KLQkqIGxleHN1cC5jIChTX0lTRElSKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQuCi0JKHBhcnNlX2FyZ3MpOiBBZGQgc3VwcG9ydCBmb3IgLXJwYXRoLiAgSWYgLVIgaXMgdXNlZCB0byBuYW1lIGEKLQlkaXJlY3RvcnksIHRyZWF0IGl0IGFzIC1ycGF0aCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6Ci0JUGFzcyBjb21tYW5kX2xpbmUucnBhdGggdG8gYmZkX2VsZjMyX3NpemVfZHluYW1pY19zZWN0aW9ucy4KLQkqIGxkbWFpbi5jIChtYWluKTogSW5pdGlhbGl6ZSBjb21tYW5kX2xpbmUucnBhdGggdG8gTlVMTC4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IC1ycGF0aCBvcHRpb24uCi0KLVN1biBKdWwgMTAgMDA6MzM6MjQgMTk5NCAgSWFuIERhbGwgIChkYWxsQGhmcmQuZHN0by5nb3YuYXUpCi0KLQkqIGVtdWxwYXJhbXMvcGM1MzJtYWNoYW91dC5zaDogTmV3IGZpbGUuIFBjNTMyIG1hY2ggc2NyaXB0Ci0JcGFyYW1ldGVycy4KLQotCSogZW11bHBhcmFtcy9uZXRic2Q1MzIuc2g6IE5ldyBmaWxlLiBOZXRic2QgNTMyIHNjcmlwdCBwYXJhbWV0ZXJzLgotCi0JKiBjb25maWcvcGM1MzJtYWNoLm10OiBOZXcgZmlsZS4gUGM1MzIgbWFjaCB0YXJnZXQgc3VwcG9ydC4KLQotCSogY29uZmlnL3BjNTMybWFjaC5taDogTmV3IGZpbGUuIFBjNTMyIG1hY2ggaG9zdCBzdXBwb3J0LgotCi0JKiBjb25maWcvbmV0YnNkNTMyLm10OiBOZXcgZmlsZS4gTmV0YnNkIDUzMiB0YXJnZXQgc3VwcG9ydC4KLQotCSogY29uZmlndXJlLmluOiBBZGQgbnMzMmstcGM1MzItbWFjaCBhbmQgbnMzMmstcGM1MzItbmV0YnNkIHN1cHBvcnQuCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgZXBjbWFjaGFvdXQuYyBkZXBlbmRlbmN5IGFuZCBlbmV0YnNkNTMyLmMKLQlkZXBlbmRlbmN5LgotCi1GcmkgSnVsICA4IDEwOjU3OjAyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL3N1bm9zLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbik6IFVzZQotCWJmZF9hYnNfc2VjdGlvbl9wdHIsIG5vdCAmYmZkX2Fic19zZWN0aW9uLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IENoYW5nZWQgInJldGFpbi1zeW1ib2xzLWZpbGUiIGZyb20KLQlub19hcmd1bWVudCB0byByZXF1aXJlZF9hcmd1bWVudC4gIEZyb20gZGptLgotCi1UaHUgSnVsICA3IDEyOjI5OjUzIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBFeHBsaWNpdGx5IG1lbnRpb24gLnN0YWIgYW5kIC5zdGFic3RyCi0Jc2VjdGlvbnMgdG8gZm9yY2UgYSBWTUEgb2YgMDsgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZQotCW5vdCBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGxpbmtlciBzdHlsZS4KLQotTW9uIEp1bCAgNCAxOTozNTo0NSAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAoX19zdGFja196ZXJvKTogRG9uJ3QgZGVmaW5lIHRoaXMgbmFtZSwKLQlpdCB3YXMgZm9yIHRoZSBIUFVYIGR5bmFtaWMgbG9hZGVyJ3MgdXNlIGFuZCBpdCBjcmVhdGVzIHByb2JsZW1zCi0Jd2l0aCBFTEYgR0RCLgotCi1GcmkgSnVsICAxIDEyOjUzOjQ3IDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsZGxhbmcuYyAobGFuZ19kb19hc3NpZ25tZW50cyk6IE5vIGxvbmdlciBzdGF0aWMuICBEZWxldGUgZGVjbC4KLQkqIGxkbGFuZy5oIChsYW5nX2RvX2Fzc2lnbm1lbnRzKTogUHV0IGV4dGVybmFsIGRlY2wgaGVyZS4KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBNaW5vciBjbGVhbnVwcyB0aHJvdWdob3V0IGZpbGUuCi0JKGhwcGFfZWxmX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogUmV3cml0ZS4KLQkoaHBwYWVsZl9maW5pc2gpOiBSZXdyaXRlLgotCi1XZWQgSnVuIDI5IDE2OjUwOjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NvbGFyaXMyLm1oIChOQVRJVkVfTElCX0RJUlMpOiBEZWZpbmUgYXMgL3Vzci9jY3MvbGliLgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFjY2VwdCAtQnN0YXRpYyBhbmQgLUJkeW5hbWljLiAgRG8gbm90Ci0JYWNjZXB0IHBsYWluIC1CLgotCSogbGQudGV4aW5mbzogLUJzdGF0aWMgaXMgbm90IGlnbm9yZWQuCi0KLVR1ZSBKdW4gMjggMTI6MTM6MzQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBSZWNvZ25pemUgXHIgdGhlIHNhbWUgYXMgXG4uCi0KLVRodSBKdW4gMjMgMTc6NTM6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBzaGFyZWQgbGlicmFyaWVzLCBmcm9tIEVyaWMKLQlZb3VuZ2RhbGUgPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCSogZ2Vuc2NyaXB0cy5zaDogSWYgdGhlIGVtdWxhdGlvbiBwYXJhbWV0ZXIgZmlsZSBzZXRzCi0gICAgICAgIEdFTkVSQVRFX1NITElCX1NDUklQVCwgZ2VuZXJhdGUgYSAueHMgc2NyaXB0IGZpbGUgd2l0aAotCUNSRUFURV9TSExJQiBkZWZpbmVkLgotCSogZW11bHRlbXBsL2VsZjMyLmVtIChnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KTogSWYKLQlsaW5rX2luZm8uc2hhcmVkIGlzIHNldCwgdXNlIHRoZSAueHMgc2NyaXB0IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IElmIENSRUFURV9TSExJQiBpcyBzZXQsIGRvbid0IGNyZWF0ZSBhCi0JLmludGVycCBzZWN0aW9uLCBhbmQgZG9uJ3QgaW5jbHVkZSBURVhUX1NUQVJUX0FERFIgaW4gdGhlIHN0YXJ0aW5nCi0JYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbi4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2ggKEdFTkVSQVRFX1NITElCX1NDUklQVCk6IExpa2V3aXNlLgotCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCAoR0VORVJBVEVfU0hMSUJfU0NSSVBUKTogRGVmaW5lLgotCi1UaHUgSnVuIDIzIDEyOjUyOjIyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cy4KLQotV2VkIEp1biAyMiAxMzo0MjoxNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIHN1cHBvcnQgZm9yIG5ldyBvcHRpb25zIC0oIC0pIHdpdGgKLQlzeW5vbnltcyAtLXN0YXJ0LWdyb3VwIC0tZW5kLWdyb3VwLgotCSogbGRsYW5nLmggKGVudW0gc3RhdGVtZW50X2VudW0pOiBBZGQgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bS4KLQkobGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSk6IERlZmluZSBuZXcgc3RydWN0LgotCShsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlKTogQWRkIGdyb3VwX3N0YXRlbWVudCBmaWVsZC4KLQkobGFuZ19lbnRlcl9ncm91cCwgbGFuZ19sZWF2ZV9ncm91cCk6IERlY2xhcmUuCi0JKiBsZGxhbmcuYyAobGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyKTogSGFuZGxlCi0JbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bS4KLQkobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucywgcHJpbnRfc3RhdGVtZW50KTogTGlrZXdpc2UuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucywgbGFuZ19kb19hc3NpZ25tZW50cyk6IExpa2V3aXNlLgotCShvcGVuX2lucHV0X2JmZHMpOiBDb21wbGV0ZWx5IHJld3JpdGUuICBOb3cgZG9lcyBpdHMgb3duIGxvb3BpbmcsCi0JcmF0aGVyIHRoYW4gdXNpbmcgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBIYW5kbGUgZ3JvdXBzLgotCShsYW5nX3Byb2Nlc3MpOiBVcGRhdGUgY2FsbCB0byBvcGVuX2lucHV0X2JmZHMuCi0JKHByaW50X2dyb3VwKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkobGFuZ19lbnRlcl9ncm91cCwgbGFuZ19sZWF2ZV9ncm91cCk6IE5ldyBzdGF0aWMgZnVuY3Rpb25zLgotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBJZiB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuCi0Jb3BlbmVkLCBqdXN0IHJldHVybiByYXRoZXIgdGhhbiB0YWtpbmcgYW4gYXNzZXJ0aW9uIGZhaWx1cmUuCi0JKiBsZHZlci5jIChoZWxwKTogTWVudGlvbiBuZXcgb3B0aW9ucy4KLQkqIGxkLnRleGluZm86IERvY3VtZW50IG5ldyBvcHRpb25zLgotCi0JKiBsZGxhbmcuYyAoZW5kX29mX2RhdGFfc2VjdGlvbl9zdGF0ZW1lbnRfbGlzdCk6IERvbid0IGRlZmluZS4KLQkobGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOiBEb24ndCBzZXQgb2Jzb2xldGUgdmFyaWFibGUKLQllbmRfb2ZfZGF0YV9zZWN0aW9uX3N0YXRlbWVudF9saXN0LgotCi0JKiBzY3JpcHR0ZW1wbC9nbzMyY29mZi5zYzogRG9uJ3QgcHV0ICR7REFUQV9BTElHTk1FTlR9IGluc2lkZSBhbgotCUFMSUdOLgotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogQWRqdXN0IGN1cnJlbnQgcmVnaW9uIGFkZHJlc3MKLQlldmVuIGZvciBzZWN0aW9ucyB3aXRoIGFuIGV4cGxpY2l0IGFkZHJlc3MuICBGcm9tCi0JcmFscGhjQHB5cmFtaWQuY29tIChSYWxwaCBDYW1wYmVsbCkuCi0KLQkqIGVtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIChOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBTZXQgdG8gMC4KLQlGcm9tIGpyc0B3b3JsZC5zdGQuY29tIChSaWNrIFNsYWRrZXkpLgotCi0JKiBzY3JpcHR0ZW1wbC9taXBzYnNkLnNjOiBMZXQgc2VjdGlvbnMgYWxpZ24gdG8gdGhlaXIgbmF0dXJhbAotCWJvdW5kYXJpZXMuCi0KLVR1ZSBKdW4gMjEgMTE6Mjc6MDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19pbml0KTogVXNlIG5ldyBiZmRfYWJzX3NlY3Rpb25fcHRyLCBub3QKLQkmYmZkX2Fic19zZWN0aW9uLgotCShsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mKTogTGlrZXdpc2UuCi0JKGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YpOiBMaWtld2lzZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogVXNlIGJmZF9pc19hYnNfc2VjdGlvbiB0byBjaGVjayBmb3IgdGhlCi0JYWJzb2x1dGUgc2VjdGlvbi4gIERvbid0IHRyeSB0byBzZXQgdGhlIFZNQSBvciBvdXRwdXRfb2Zmc2V0IG9yCi0Jc2l6ZSBvZiB0aGUgYWJzb2x1dGUgc2VjdGlvbi4KLQkqIGxkbWFpbi5jIChub3RpY2VfeXN5bSk6IFVzZSBiZmRfaXNfdW5kX3NlY3Rpb24gdG8gY2hlY2sgZm9yIHRoZQotCXVuZGVmaW5lZCBzZWN0aW9uLgotCi1UaHUgSnVuIDE2IDIyOjQ4OjQxIDE5OTQgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzY3JpcHR0ZW1wbC9ocHBhZWxmLnNjOiBQbGFjZSAuZGF0YSBhbmQgLmJzcyBhdCAweDQwMDAwMDAwCi0Jd2hlbiBnZW5lcmF0aW5nIHJlbG9jYXRhYmxlIG9iamVjdHMuCi0KLVRodSBKdW4gMTYgMTQ6MjU6MjIgMTk5NCAgRXJpYyBZb3VuZ2RhbGUgIChlcmljeUBjYWlzLmNhaXMuY29tKQotCi0JKiBlbXVsdGVtcGwvbGludXguZW06IE5ldyBmaWxlIHByb3ZpZGluZyBzdXBwb3J0IGZvciBsaW5raW5nCi0JYWdhaW5zdCBMaW51eCBzaGFyZWQgbGlicmFyaWVzLgotCSogY29uZmlnL2kzODYtbGludXgubXQgKGVpMzg2bGludXguYyk6IERlcGVuZCB1cG9uIGxpbnV4LmVtLgotCSogZW11bHBhcmFtcy9pMzg2bGludXguc2ggKFRFTVBMQVRFX05BTUUpOiBEZWZpbmUgYXMgbGludXguCi0KLVRodSBKdW4gMTYgMTI6MjI6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IEFkZCAtc2hhcmVkIHRvIGxvbmdvcHRzLCBhbmQgaGFuZGxlIGl0LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGxpbmtfaW5mby5zaGFyZWQgdG8gZmFsc2UuICBHaXZlCi0JZXJyb3IgaWYgbGlua19pbmZvLnJlbG9jYXRlYWJsZSBhbmQgbGlua19pbmZvLnNoYXJlZCBhcmUgYm90aCBzZXQuCi0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgRU1VTF9FWFRSQSogaXMgZGVmaW5lZCBpbiBhIGNvbmZpZyBmaWxlLCB0cmVhdAotCWl0IGFzIG5hbWluZyBhbiBlbXVsYXRpb24gdG8gYmUgYWRkZWQgdG8gRU1VTEFUSU9OX09GSUxFUy4KLQkqIGNvbmZpZy9pMzg2LWxpbnV4Lm10IChFTVVMX0VYVFJBMSk6IERlZmluZSBhcyBlbGZfaTM4Ni4KLQotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCShBTExfRU1VTEFUSU9OUyk6IEFkZCBlaTM4NmxpbnV4Lm8sIGVlbGYzMl9zcGFyYy5vLAotCWVlbGY2NF9zcGFyYy5vLiAgUmVtb3ZlICQoT1RIRVJfRU1VTEFUSU9OUykuCi0JKGVpMzg2bGludXguYywgZWVsZjMyX3NwYXJjLmMsIGVlbGY2NF9zcGFyYy5jKTogTmV3IHRhcmdldHMuCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IERvbid0IGRlZmluZS4KLQkoZWkzODZsaW51eC5jKTogUmVtb3ZlOyBub3cgaW4gTWFrZWZpbGUuaW4uCi0JKiBjb25maWcvaTM4Ni1seW54Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL202OGstbHlueC5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnL3NwYXJjNjQtZWxmLm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCShlZWxmNjRfc3BhcmMuYyk6IFJlbW92ZTsgbm93IGluIE1ha2VmaWxlLmluLgotCSogY29uZmlnL3N1bjRzb2wyLm10IChPVEhFUl9FTVVMQVRJT05TKTogRG9uJ3QgZGVmaW5lLgotCShlZWxmMzJfc3BhcmMuYyk6IFJlbW92ZTsgbm93IGluIE1ha2VmaWxlLmluLgotCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdHJlZSk6IERvbid0IGNyYXNoIGlmIGV0cmVlX3JlbCBzZWN0aW9uIGhhcwotCW5vIG93bmVyLS1pdCBtaWdodCBiZSBiZmRfYWJzX3NlY3Rpb24uICBGcm9tIEVyaWMgWW91bmdkYWxlCi0JPGVyaWN5QGNhaXMuY2Fpcy5jb20+LgotCi0JKiBzY3JpcHR0ZW1wbC9hb3V0LnNjOiBMZXQgc2VjdGlvbnMgYWxpZ24gdG8gdGhlaXIgbmF0dXJhbAotCWJvdW5kYXJpZXMuCi0KLVdlZCBKdW4gMTUgMDE6NTQ6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGVtdWwuaCAobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlKTogRGVjbGFyZS4KLQkobGRfZW11bGF0aW9uX3hmZXJfdHlwZSk6IEFkZCBuZXcgZmllbGQgb3Blbl9keW5hbWljX2FyY2hpdmUuCi0JKiBsZGVtdWwuYzogSW5jbHVkZSBsZGV4cC5oIGFuZCBsZGxhbmcuaC4KLQkobGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlKTogTmV3IGZ1bmN0aW9uLgotCSogbGRmaWxlLmggKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogRGVjbGFyZS4KLQkqIGxkZmlsZS5jOiBJbmNsdWRlIGxkZW11bC5oLgotCSh0cnlfb3Blbl9iZmQpOiBSZW5hbWUgZnJvbSBjYWNoZV9iZmRfb3BlbnIuICBSZXR1cm4gYm9vbGVhbgotCWFyZ3VtZW50LCBub3QgYmZkICouICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoKTogUmVuYW1lIGZyb20gb3Blbl9hLiAgUmV0dXJuIGJvb2xlYW4KLQlhcmd1bWVudCwgbm90IGJmZCAqLiAgQ2xlYW4gdXAuICBDaGFuZ2UgYWxsIGNhbGxlcnMuCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBJZiBkb2luZyBhIGR5bmFtaWMgbGluaywgY2FsbAotCWxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGUgZXh0ZW5zaW9uIG9mCi0JYSBkeW5hbWljIG9iamVjdCBpcyAiLnNvIi4KLQkqIGVtdWx0ZW1wbC9lbGYzMi5lbSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUpOgotCU5ldyBmdW5jdGlvbi4KLQkobGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uKTogSW5pdGlhbGl6ZSBvcGVuX2R5bmFtaWNfYXJjaGl2ZQotCWZpZWxkLgotCSogZW11bHRlbXBsL3N1bm9zLmVtIChsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24pOiBMaWtld2lzZS4KLQotCSogbGRtYWluLmMgKGdldF9lbXVsYXRpb24pOiBJZ25vcmUgLW00ODYgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IElnbm9yZSAtcW1hZ2ljIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCUFjY2VwdCAtc3RhdGljIGFzIGEgc3lub255bSBmb3IgLW5vbl9zaGFyZWQuCi0KLQlMZXQgdGhlIHVzZXIgY2hhbmdlIHRoZSBkeW5hbWljIGxpbmtlciB1c2VkIGJ5IEVMRiBjb2RlLgotCSogbGQuaCAoYXJnc190eXBlKTogQWRkIG5ldyBmaWVsZCBpbnRlcnByZXRlci4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIGR5bmFtaWMtbGlua2VyIHRvIGxvbmdvcHRzLCBhbmQKLQloYW5kbGUgaXQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgY29tbWFuZF9saW5lLmludGVycHJldGVyIHRvIE5VTEwuCi0JKiBlbXVsdGVtcGwvZWxmMzIuZW0gKGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKTogR2V0Ci0JdGhlIEVMRiBiYWNrZW5kIHRvIHJldHVybiB0aGUgLmludGVycCBzZWN0aW9uLiAgSWYKLQljb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgaXMgbm90IE5VTEwsIHNldCB0aGUgY29udGVudHMgb2YgLmludGVycAotCXRvIGl0LgotCSogbGQudGV4aW5mbzogTWVudGlvbiAtZHluYW1pYy1saW5rZXIuCi0KLQkqIGNvbmZpZy9zdW40c29sMi5tdCAoZWVsZjMyX3NwYXJjLmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSwgbm90Ci0JZ2VuZXJpYy5lbS4KLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBTb3J0IG91dCB0aGUgb3B0aW9uIG1hY3JvcyBhbmQgY2hhbmdlIHRoZQotCWRlZmluaXRpb25zIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBhIG5ldyBvcHRpb24uCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IERlZmluZSBfX2V0ZXh0IGFuZCBfX2VkYXRhIHRvIGdvIGFsb25nIHdpdGgKLQlfZXRleHQgYW5kIF9lZGF0YS4KLQotCSogbGQuaCAobGRfY29uZmlnX3R5cGUpOiBBZGQgbmV3IGZpZWxkIHRyYWRpdGlvbmFsX2Zvcm1hdC4KLQkqIGxleHN1cC5jIChwYXJzZV9hcmdzKTogQWRkIHRyYWRpdGlvbmFsLWZvcm1hdCB0byBsb25nb3B0cywgYW5kCi0JaGFuZGxlIGl0LgotCSogbGRtYWluLmMgKG1haW4pOiBJbml0aWFsaXplIGNvbmZpZy50cmFkaXRpb25hbF9mb3JtYXQgdG8gZmFsc2UuCi0JKiBsZGxhbmcuYyAobGRsYW5nX29wZW5fb3V0cHV0KTogU2V0IEJGRF9UUkFESVRJT05BTF9GT1JNQVQgaW4gQkZECi0JZmxhZ3Mgb2Ygb3V0cHV0X2JmZCBhY2NvcmRpbmcgdG8gY29uZmlnLnRyYWRpdGlvbmFsX2Zvcm1hdC4KLQkqIGxkdmVyLmMgKGhlbHApOiBNZW50aW9uIC10cmFkaXRpb25hbC1mb3JtYXQuCi0JKiBsZC50ZXhpbmZvOiBEb2N1bWVudCAtdHJhZGl0aW9uYWwtZm9ybWF0LgotCi1UdWUgSnVuIDE0IDIzOjEwOjA3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRjdG9yLmMgKGxkY3Rvcl9hZGRfZW50cnkpOiBBZGQgZW50cmllcyB0byBhIHNldCBpbiB0aGUgb3JkZXIKLQl0aGV5IGFyZSBlbmNvdW50ZXJlZC4KLQotVHVlIEp1biAxNCAxODowNTowOSAxOTk0ICBFcmljIFlvdW5nZGFsZSAgKGVyaWN5QGNhaXMuY2Fpcy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIChURVhUX1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgMHgxMDAwLgotCShOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBEZWZpbmUgYXMgMHgyMC4KLQotTW9uIEp1biAxMyAxNTo0NjowOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FscGhhLnNjOiBEZWZpbmUgX2Z0ZXh0LCBfZXRleHQgYW5kIF9mZGF0YSBpbnN0ZWQgb2YKLQlfRlRFWFQsIF9FVEVYVCBhbmQgX0ZEQVRBLiAgRG9udCBkZWZpbmUgX0VORC4KLQotCSogbGRmaWxlLmMgKG9wZW5fYSk6IElmIHRoaXMgaXMgbm90IGFuIGFyY2hpdmUsIHRyeSB0byBvcGVuIGl0IGluCi0JdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGJlZm9yZSBzZWFyY2hpbmcgZm9yIGl0LgotCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFRyZWF0IC1pIGFzIGEgc3lub255bSBmb3IgLXIuCi0KLQkqIGxkZ3JhbS55IChleHApOiBUcmVhdCBCTE9DSyBhcyBhIHN5bm9ueW0gZm9yIEFMSUdOLCBzbyB0aGF0Ci0JQkxPQ0sgd29ya3MgaW4gYSBzZWN0aW9uIGFkZHJlc3MgYXMgZG9jdW1lbnRlZC4KLQotCSogbGRncmFtLnkgKFlZREVCVUcpOiBEb24ndCBkZWZpbmUuCi0KLUZyaSBKdW4gMTAgMTY6NDU6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBlbXVsdGVtcGwvZ2xkOTYwLmVtOiBQYXNzIGZhbHNlIGZvciBuZXcgYXJndW1lbnQgdG8KLQlsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aC4KLQkqIGVtdWx0ZW1wbC9nbGQ5NjBjLmVtLCBlbXVsdGVtcGwvbG5rOTYwLmVtOiBMaWtld2lzZS4KLQotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBPbmx5IGxvb2sgZm9yIC5zbyBmaWxlcyBpZiBkb2luZyBhIGR5bmFtaWMKLQlsaW5rLgotCi1UaHUgSnVuICA5IDA4OjM1OjE3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvaTk2MC5zYzogQWRkIENPTlNUUlVDVE9SUyB0byAuZGF0YS4KLQotVGh1IEp1biAgOSAwNjo1MjoyOSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChjaGVjayk6IERlbGV0ZSBsZC5uZXcgZGVwZW5kZW5jeSBzbyB0aGF0IGEgcmVncmVzc2lvbgotCSAgdGVzdCBkb2Vzbid0IHRyaWdnZXIgYSByZWJ1aWxkIG9mIHRoZSBsaW5rZXIuCi0KLVRodSBKdW4gIDkgMDA6MTc6MjAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyk6IEZvciBsYW5nX2FkZHJlc3MsIGNhbGwKLQlpbml0X29zIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gY2FsbGVkLgotCi1UaHUgSnVuICAyIDE3OjI0OjA4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUFkZCBzdXBwb3J0IGZvciBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLgotCSogYW91dC5zYzogRG9uJ3QgZGVmaW5lIF9fRFlOQU1JQyBoZXJlLiAgQWRkIG5ldyBzZWN0aW9ucyB1c2VkIGJ5Ci0Jc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBjb2RlLgotCSogZW11bHRlbXBsL3N1bm9zLmVtOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvc3VuNC5zaCAoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBzdW5vcy4KLQkqIGVtdWxwYXJhbXMvc3VuMy5zaCAoVEVNUExBVEVfTkFNRSk6IExpa2V3aXNlLgotCSogTWFrZWZpbGUuaW4gKGVzdW40LmMpOiBEZXBlbmQgdXBvbiBzdW5vcy5lbSwgbm90IGdlbmVyaWMuZW0uCi0JKGVzdW4zLmMpOiBMaWtld2lzZS4KLQotCSogbGRsYW5nLmM6IE1pbm9yIGZvcm1hdHRpbmcgY2xlYW51cHMuCi0JKGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5oIChsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUpOiBEZWNsYXJlLgotCi0JKiBsZGZpbGUuaCAoc2VhcmNoX2RpcnNfdHlwZSk6IE1vdmUgZnJvbSBsZGZpbGUuYywgYW5kIGFkZCBjbWRsaW5lCi0JZmllbGQuCi0JKHNlYXJjaF9oZWFkKTogRGVjbGFyZS4KLQkobGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgpOiBBZGQgbmV3IGNtZGxpbmUgYXJndW1lbnQgaW4gcHJvdG90eXBlLgotCSogbGRmaWxlLmMgKHNlYXJjaF9oZWFkKTogTWFrZSBub24tc3RhdGljLgotCShzZWFyY2hfZGlyc190eXBlKTogTW92ZSB0byBsZGZpbGUuaC4KLQkobGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgpOiBBY2NlcHQgY21kbGluZSBhcmd1bWVudCwgYW5kIHNhdmUgaXQuCi0JKiBsZXhzdXAuYyAocGFyc2VfYXJncyk6IFBhc3MgdHJ1ZSBmb3IgbmV3IGNtZGxpbmUgYXJndW1lbnQgb2YKLQlsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aC4KLQkoc2V0X2RlZmF1bHRfZGlybGlzdCk6IExpa2V3aXNlLgotCSogbGRtYWluLmMgKGNoZWNrX2Zvcl9zY3JpcHRzX2Rpcik6IFBhc3MgZmFsc2UgZm9yIG5ldyBjbWRsaW5lCi0JYXJndW1lbnQgb2YgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGguCi0JKiBsZGdyYW0ueSAoaWZpbGVfcDEpOiBMaWtld2lzZS4KLQotV2VkIEp1biAgMSAxNDoyNDowOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5oIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKTogUmVtb3ZlIGZpZWxkcyBzdWJmaWxlcywKLQl0b3RhbF9zaXplLCBzdXBlcmZpbGUgYW5kIGNoYWluLgotCSogbGRmaWxlLmMgKG9wZW5fYSk6IERvbid0IGNsZWFyIHNlYXJjaF9kaXJzX2ZsYWcuCi0JKGxkZmlsZV9vcGVuX2ZpbGUpOiBEb24ndCB0cnkgdG8gb3BlbiBzdXBlcmZpbGUuICBBc3NlcnQgdGhhdCBmaWxlCi0JaGFzIG5vdCBhbHJlYWR5IGJlZW4gb3BlbmVkLgotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IERvbid0IGluaXRpYWxpemUgc3VwZXJmaWxlLgotCSogbGRtYWluLmMgKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBEb24ndCBpbml0aWFsaXplIHN1YmZpbGVzIG9yCi0JY2hhaW4gb3Igc3VwZXJmaWxlLiAgSW5pdGlhbGl6ZSBzZWFyY2hfZGlyc19mbGFnIHRvIGZhbHNlLgotCi1GcmkgTWF5IDI3IDEyOjI1OjMzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IENoYW5nZWQgdmVyc2lvbiB0byAiY3lnbnVzLTIuNC4xIi4KLQotCUNoYW5nZXMgZnJvbSBiaW51dGlscy0yLjQgcmVsZWFzZToKLQotCSogZ2Vuc2NyaXB0cy5zaCAoUkVMT0NBVElORywgQ09OU1RSVUNUSU5HKTogV2hlbiBzZXR0aW5nCi0JdmFyaWFibGVzLCB1c2Ugd2hpdGVzcGFjZSwgc28gc2NyaXB0cyBkb24ndCBicmVhay4KLQotCSogY29uZmlnL2FscGhhb3NmLm1oIChIREVGSU5FUywgQ0ZMQUdTKTogRGVsZXRlZC4KLQotCSogZW11bHRlbXBsL2dlbmVyaWMuZW06IEZpbmQgZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQgaW4gJHtzcmNkaXJ9LgotCi0JKiBjZHRlc3QtYmFyLmNjOiBSZW5hbWVkIGZyb20gY2R0ZXN0LWZ1bmMuY2MuCi0JKiBNYWtlZmlsZS5pbjogTm90ZWQgY2hhbmdlLgotCi0JKiBzY3JpcHR0ZW1wbC9hMjlrLnNjOiBEb24ndCBpbmNsdWRlIC9sYWIzL3UzLy4uLi4vc2VnbWVudHMubzsgSQotCWRvbid0IGtub3cgd2hlcmUgdGhhdCdzIHN1cHBvc2VkIHRvIGNvbWUgZnJvbSwgb3Igd2h5IGl0J3MKLQluZWNlc3NhcnkuCi0KLQlXZWQgTWF5IDExIDIyOjMyOjAwIDE5OTQgIERKIERlbG9yaWUgKGRqQGN0cm9uLmNvbSkKLQotCSogY29uZmlndXJlLmJhdDogdXBkYXRlIHRvIGxhdGVzdCBtYWtlZmlsZS5pbgotCSogZW11bHBhcmEvZ28zMi5zaDogc2V0IHRvIGNvZmYtZ28zMiBub3QgYW91dAotCSogZW11bHRlbXAvZ2VuZXJpYy5lbTogc3RyZW5ndGgtcmVkdWNlIHRoZSBzdHJ1Y3R1cmUgb2YKLQkgIHRoaXMgc2hlbGwgc2NyaXB0LCBzaW5jZSB0aGUgb25seSBhdmFpbGFibGUgc2hlbGwgZm9yCi0JICBET1MgY2FuJ3QgaGFuZGxlIGNvbXBsZXggc3ludGF4LgotCSogZW11bHRlbXAvc3RyaW5naWZ5LnNlZDogZm9yICJzZWQgLWYiIGluc3RlYWQgb2YgaW5saW5lLgotCSogbWFrZWZpbGUuaW46IGRlcGVuZCBvbiBzdHJpbmdpZnkuc2VkIGFzIHdlbGwgYXMgZ2Vuc2NyaXB0cy5zaAotCSogc2NyaXB0dGVtcC9nbzMyY29mZi5zYzogY29ycmVjdCBmb3IgZGpncHAgMS4xMSdzIENPRkYgZm9ybWF0Ci0JKiBnZW5zY3JpcHRzLnNoOiBlbXB0eSB2YXJpYWJsZXMgYXJlbid0IGFsd2F5cyBjb25zaWRlcmVkICJzZXQiLAotCSAgc28gc2V0IHRoZW0gdG8gInkiIGluc3RlYWQuCi0KLUZyaSBNYXkgMjcgMDE6MDg6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoZW50cnlfc3ltYm9sKTogTWFrZSBzdGF0aWMuCi0JKGxhbmdfYWRkX2VudHJ5KTogQWRkIGNtZGxpbmUgYXJndW1lbnQuCi0JKiBsZGxhbmcuaCAobGFuZ19hZGRfZW50cnkpOiBDaGFuZ2UgcHJvdG90eXBlLgotCSogbGRncmFtLnkgKHN0YXRlbWVudF9hbnl3aGVyZSk6IENoYW5nZSBsYW5nX2FkZF9lbnRyeSBjYWxsLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQotVHVlIE1heSAyNCAxNjoxMzo0MyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnNoIChPVEhFUl9SRUFET05MWV9TRUNUSU9OUyk6IERvbid0IGdpdmUKLQkucmVnaW5mbyBhbiBhZGRyZXNzLgotCShPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMpOiBEb24ndCBnaXZlIC5saXQ0IG9yIC5saXQ4IGFuIGFkZHJlc3MuCi0JKE9USEVSX1NFQ1RJT05TKTogRGVmaW5lIGZvciAuZ3B0YWIuc2RhdGEgYW5kIC5ncHRhYi5zYnNzLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgT1RIRVJfU0VDVElPTlMgYXQgZW5kIG9mIHNjcmlwdC4KLQotVGh1IE1heSAxOSAxMzozMTozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQlBZGQgc3VwcG9ydCBmb3IgRUxGIHNoYXJlZCBsaWJyYXJpZXMuCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZSk6IEFkZCBmaWVsZCBkeW5hbWljX2xpbmsuCi0JKiBsZG1haW4uYyAobWFpbik6IEluaXRpYWxpemUgY29uZmlnLmR5bmFtaWNfbGluayB0byBmYWxzZS4gIFdhcm4KLQlvbiBhdHRlbXB0cyB0byB1c2UgLXIgd2l0aCAtcmVsYXgsIC1jYWxsX3NoYXJlZCBvciAtcy4KLQkqIGxleHN1cC5jIChsb25nb3B0cyk6IFNlcGFyYXRlIE9QVElPTl9DQUxMX1NIQVJFRCBmcm9tCi0JT1BUSU9OX05PTl9TSEFSRUQuICBBZGQgT1BUSU9OX0lHTk9SRS4gIEFkanVzdCBtYWNybyB2YWx1ZXMKLQlhY2NvcmRpbmdseS4gIEFkZCAiZHkiIGFuZCAibm9uX3NoYXJlZCIgb3B0aW9ucy4gIENoYW5nZSAiUXkiIHRvCi0JT1BUSU9OX0lHTk9SRSBmb3Igbm93LiAgSGFuZGxlIE9QVElPTl9DQUxMX1NIQVJFRCBhbmQKLQlPUFRJT05fTk9OX1NIQVJFRCBieSBzZXR0aW5nIGR5bmFtaWNfbGluayBmaWVsZCBhY2NvcmRpbmdseS4KLQlIYW5kbGUgT1BUSU9OX0lHTk9SRSBieSBpZ25vcmluZyBpdC4gIENsZWFyIGR5bmFtaWNfbGluayBmaWVsZCBmb3IKLQktciBhbmQgLVVyLgotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2ZpbGUpOiBJZiBjb25maWcuZHluYW1pY19saW5rIGlzIHRydWUsIHRyeQotCW9wZW5pbmcgYSBmaWxlIHdpdGggYSAuc28gZXh0ZW5zaW9uIGZpcnN0LgotCSogZW11bHRlbXBsL2VsZjMyLmVtOiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2ggKFRFWFRfU1RBUlRfQUREUik6IENoYW5nZSB0byAweDEwMDAwLgotCShOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBMaWtld2lzZS4KLQkoVEVNUExBVEVfTkFNRSk6IERlZmluZSBhcyBlbGYzMi4KLQkoREFUQV9QTFQpOiBEZWZpbmUuCi0JKiBlbXVscGFyYW1zL2VsZl9pMzg2LnNoIChURU1QTEFURV9OQU1FKTogRGVmaW5lIGFzIGVsZjMyLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgcGxhY2VtZW50IGZvciBuZXcgZHluYW1pYyBzZWN0aW9ucy4KLQlEb24ndCB1c2UgQ1JFQVRFX09CSkVDVF9TWU1CT0xTLiAgRGVmaW5lIF9ldGV4dCwgX2VkYXRhIGFuZCBfZW5kCi0Jb3V0c2lkZSBvZiBhbnkgc2VjdGlvbi4gIERvbid0IHVzZSBBTElHTig4KTsganVzdCBsZXQgb25lIHNlY3Rpb24KLQlWTUEgZm9sbG93IGFub3RoZXIuICBQdXQgLmR5bmJzcyBpbiAuYnNzLiAgRG9uJ3QgbWVudGlvbiBkZWJ1Z2dpbmcKLQlzZWN0aW9uczsgdGhleSdsbCBiZSBoYW5kbGVkIGNvcnJlY3RseSBhbnlob3cuCi0JKiBNYWtlZmlsZS5pbiAoZWVsZl9pMzg2LmMpOiBEZXBlbmQgdXBvbiBlbGYzMi5lbSwgbm90IGdlbmVyaWMuZW0uCi0KLVdlZCBNYXkgMTggMTA6MTU6MzkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IFJlZGlyZWN0IG91dHB1dCBvZiBsbiB0byAvZGV2L251bGwuCi0KLU1vbiBNYXkgMTYgMTM6MzU6MDggMTk5NCAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBDaGFuZ2UgYWxsIHJlZmVyZW5jZXMgb2YKLQkuaHBwYV9saW5rZXJfc3R1YnMgdG8gLlBBUklTQy5zdHVicy4KLQkqIHNjcmlwdHRlbXBsL2hwcGFlbGYuc2M6IExpa2V3aXNlLgotCi1GcmkgTWF5IDEzIDEzOjAwOjM4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IENoYW5nZSBgYG5vIGF0dGFjaGVkCi0Jb3V0cHV0IHNlY3Rpb24nJyBtZXNzYWdlIHNsaWdodGx5LgotCShsYW5nX2RvX2Fzc2lnbm1lbnRzKTogRG9uJ3QgcmVjdXJzZSBkb3duIGlmIHRoZXJlIGlzIG5vIHJlYWwKLQlzZWN0aW9uLgotCi0JKiBjb25maWcvaTM4Ni1saW51eC5tdCAoT1RIRVJfRU1VTEFUSU9OUyk6IENoYW5nZSBlbV8gdG8gZSB0bwotCW1hdGNoIGNvcnJlc3BvbmRpbmcgY2hhbmdlIGluIGVtdWxhdGlvbiB0ZW1wbGF0ZXMuCi0JKiBjb25maWcvaTM4Ni1seW54Lm10LCBjb25maWcvbTY4ay1seW54Lm10OiBMaWtld2lzZS4KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10LCBjb25maWcvc3VuNHNvbDIubXQ6IExpa2V3aXNlLgotCi1XZWQgTWF5IDExIDE4OjE2OjQ2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbik6IFVwZGF0ZWQgdmVyc2lvbiBudW1iZXIuCi0KLQkqIGNkdGVzdC1mb28uY2M6IFVzZSBleHBsaWNpdCAiI3ByYWdtYSBpbXBsZW1lbnRhdGlvbiIuCi0JKiBjZHRlc3QtYmFyLmNjOiBSZW5hbWVkIGZyb20gY2R0ZXN0LWZ1bmMuY2MuCi0JKiBNYWtlZmlsZS5pbjogUmVmZXJlbmNlcyB0byBjZHRlc3QtZnVuYy5vIGNoYW5nZWQgdG8KLQljZHRlc3QtYmFyLm8uCi0KLVdlZCBNYXkgMTEgMTY6MjQ6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRG9uJ3QgY3JlYXRlIHVubmVjZXNzYXJ5IG91dHB1dCBzZWN0aW9ucy4KLQkqIGxkbGFuZy5jIChvdXRfYmZkX2dldF9zZWN0aW9uX2J5X25hbWUpOiBSZW1vdmUuCi0JKHdpbGRfc2VjdGlvbik6IENhbGwgYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgcmF0aGVyIHRoYW4KLQlvdXJfYmZkX2dldF9zZWN0aW9uX2J5X25hbWUuICBEb24ndCBjYWxsIHdpbGRfZG9pdCBpZiB0aGVyZSBpcyBubwotCXNlY3Rpb24uCi0JKGxhbmdfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiBSZW1vdmUuCi0JKG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMpOiBGb3Igc2V2ZXJhbCBjYXNlcywgY2FsbCBpbml0X29zIGlmCi0JaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2FsbGVkLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiBvdXRwdXQgc2VjdGlvbiB3YXMgbm90IGNyZWF0ZWQsIHNraXAgaXQuCi0JKGxhbmdfcHJvY2Vzcyk6IERvbid0IGNhbGwgbGFuX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzLgotCShsYW5nX3BsYWNlX29ycGhhbnMpOiBTa2lwIGZpbGVzIHdpdGgganVzdF9zeW1zX2ZsYWdzIHNldCB0byB0cnVlLgotCSogbGQudGV4aW5mbzogRG9jdW1lbnQgY2hhbmdlLgotCi1UdWUgTWF5IDEwIDE0OjMxOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IERvbid0IGJvdGhlciBpbml0aWFsaXppbmcgdGhlIHZtYSBhbmQKLQlzZWN0aW9uIHNpemUuICBEb24ndCBzcGVjaWFsIGNhc2UgU0VDX1NIQVJFRF9MSUJSQVJZLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBIYW5kbGUgU0VDX0NPRkZfU0hBUkVEX0xJQlJBUlkgc2VjdGlvbnMKLQlzcGVjaWFsbHkuCi0KLUZyaSBNYXkgIDYgMTI6MjQ6MjcgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2dvMzIubWggOiBOZXcgZmlsZSBmb3IgWGdvMzJYLgotCi1GcmkgTWF5ICA2IDE1OjE1OjM1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRmaWxlLmMgKGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSk6IFNldCBiZmRfZXJyb3Jfc3lzdGVtX2NhbGwKLQliZWZvcmUgY2FsbGluZyBlaW5mbywgc2luY2Ugd2UgYXJlIHJlcG9ydGluZyBhbiBmb3BlbiBmYWlsdXJlLgotCUZyb20ganJzQHdvcmxkLnN0ZC5jb20gKFJpY2sgU2xhZGtleSkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlICJlIiByYXRoZXIgdGhhbiAiZW1fIiBhcyBwcmVmaXggZm9yCi0JZW11bGF0aW9ucy4KLQotRnJpIE1heSAgNiAwMTowODoxNCAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbSkKLQotCSogZW11bHRlbXBsL2dlbmVyaWMuZW06IFVzZSAiZSIgcmF0aGVyIHRoYW4gImVtXyIgYXMgcHJlZml4IGZvcgotCWZpbGVuYW1lLgotCSogZW11bHRlbXBsL2dsZDk2MC5lbSwgZW11bHRlbXBsL2dsZDk2MGMuZW0sIGVtdWx0ZW1wbC9sbms5NjAuZW0sCi0JZW11bHRlbXBsL2hwcGFlbGYuZW0sIGVtdWx0ZW1wbC9tODhrYmNzLmVtLCBlbXVsdGVtcGwvdmFuaWxsYS5lbToKLQlEaXR0by4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGFsbCBnZW5lcmF0ZWQgZmlsZSBuYW1lcy4KLQkobGRlbXVsLWxpc3QuaCk6IERlcGVuZCBvbiBNYWtlZmlsZSwgbm90IGNvbmZpZy5zdGF0dXMuICBDaGFuZ2VkCi0Jc2VkIHBhdHRlcm5zIHRvIGhhbmRsZSBuZXcgZmlsZW5hbWVzLgotCi0JKiBjb25maWcvbWlwc2wtaWR0Lm10OiBSZW5hbWVkIGZyb20gbWlwcy1pZHRsLm10LgotCSogY29uZmlndXJlLmluOiBBZGp1c3RlZC4KLQotVGh1IE1heSAgNSAxNTowNzozMiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogRG9uJ3QgdXNlICIkPCoiLCBpdCBkb2Vzbid0IGFsd2F5cwotCXdvcmsuICBJbnN0ZWFkLCBjaGVjayBidWlsZCBkaXIgYW5kICRzcmNkaXIgZXhwbGljaXRseSwgYW5kIHVzZQotCWBlY2hvJyB0byBnZXQgYWxsIHRoZSBmaWxlbmFtZXMuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaDgzMDBoLSotaG1zKTogQ2hhbmdlZCBsZF90YXJnZXQgbmFtZSB0bwotCWNmLWg4MzAwaC4KLQkqIGNvbmZpZy9jZi1oODMwMGgubXQ6IFJlbmFtZWQgZnJvbSBjb2ZmLWg4MzAwaC5tdCwgdG8gbWFrZSBpdAotCXVuaXF1ZSBpbiA4LjMuCi0KLQkqIGNvbmZpZy9pOTYwY29mZi5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2dsZDk2MGNvZmYuc2g6IE5ldyBmaWxlLgotCSogZW11bHRlbXBsL2dsZDk2MGMuZW06IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluIChpOTYwLSotdnh3b3JrczUqIGV4Y2VwdCAtdnh3b3JrczUuMCopOiBVc2UKLQlpOTYwY29mZiBjb25maWd1cmF0aW9uLgotCSogTWFrZWZpbGUuaW4gKGVtX2dsZDk2MGNvZmYuYyk6IEFkZGVkIGRlcGVuZGVuY2llcywgYnVpbGQgcnVsZS4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogUmVtb3ZlIGVtX2RlbHRhNjgubywgc2luY2UgdGhlCi0JY29kZSBpc24ndCBpbmNsdWRlZCBpbiBGU0YgcmVsZWFzZXMsIGFuZCBpdCBjYW4gc3RpbGwgYmUKLQlleHBsaWNpdGx5IHNlbGVjdGVkLgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgc2l0ZS5iYWsgYW5kIHRtcGRpci4KLQkoU1RBR0VTVFVGRik6IFJlbW92ZWQgJChHRU5FUkFURURfQ0ZJTEVTKSAkKEdFTkVSQVRFRF9IRklMRVMpLgotCShtb3N0bHljbGVhbik6IERlbGV0ZSB0aGVtIGV4cGxpY2l0bHkgaGVyZS4gIEFsc28gcmVtb3ZlIHRtcGRpci4KLQotCVBhdGNoZXMgZnJvbSBSYWxwaCBDYW1wYmVsbDoKLQkqIGNvbmZpZy9taXBzYnNkLm1oOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChlbV9taXBzYnNkLmMpOiBVc2UgbWlwc2JzZC5zYywgbm90IGFvdXQuc2MuCi0JKiBzY3JpcHR0ZW1wbC9taXBzYnNkLnNjOiBEb24ndCBkZWZpbmUgX19EWU5BTUlDLgotCSogZW11bHBhcmFtcy9taXBzYnNkLnNoIChPVVRQVVRfRk9STUFUKTogRml4IG5hbWUgdG8gaGF2ZSBgYS5vdXQnCi0JaW5zdGVhZCBvZiBgYW91dCcuCi0KLQkqIGNvbmZpZ3VyZS5pbiAoaTM4Ni0qLWdudSopOiBUcmVhdCBsaWtlIGkzODYtKi1tYWNoKi4KLQotV2VkIE1heSAgNCAxMTo1OTo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tNjhrLm10IChFTVVMKTogU2V0IHRvIG02OGthb3V0LgotCSogZW11bHBhcmFtcy9tNjhrYW91dC5zaDogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW1fbTY4a2FvdXQuby4KLQkoZW1fbTY4a2FvdXQuYyk6IE5ldyB0YXJnZXQuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiBkb3QgbW92ZXMgYmVjYXVzZSBvZiBhbgotCWFzc2lnbm1lbnQsIGRvbid0IHRyeSB0byBpbnNlcnQgYSBwYWQgaW50byB0aGUgYWJzb2x1dGUgb3V0cHV0Ci0Jc2VjdGlvbiwganVzdCBjaGFuZ2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGRlZmF1bHQgbWVtb3J5IHJlZ2lvbgotCWluc3RlYWQuCi0KLQkqIE1ha2VmaWxlLmluIChtb3N0bHljbGVhbik6IFJlbW92ZSBjZHRlc3QudG1wLCBjZHRlc3QtdXIsCi0JY2R0ZXN0LXVyLm91dCwgYW5kIGNkdGVzdC11ci50bXAuCi0KLVdlZCBBcHIgMjcgMTY6MDM6MzcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9zYTI5MjAwLnNjOiBBbGlnbiBhbGwgc2VjdGlvbnMgdG8gZm91ciBieXRlCi0JYm91bmRhcmllcy4KLQotV2VkIEFwciAyNyAxMDo0ODowMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlndXJlLmluOiBTdXBwb3J0IGZvciBnbzMyIGNvZmYuCi0JKiBjb25maWcvaTM4Ni1nbzMyLm10OiBOZXcgZmlsZQotCSogZW11bHBhcmFtcy9pMzg2Z28zMi5zaDogTmV3IGZpbGUKLQkqIHNjcmlwdHRlbXBsL2kzODZnbzMyLnNjOiBOZXcgZmlsZQotCi1UdWUgQXByIDI2IDE3OjIwOjAzIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGVtX202OGtseW54LmMsIGVtX2kzODZseW54LmMsIGVtX3NwYXJjbHlueC5jKTogVXNlCi0JTHlueC1zcGVjaWZpYyBzY3JpcHQgdGVtcGxhdGVzLgotCSogY29uZmlndXJlLmluIChzcGFyY2xpdGUqLSotY29mZik6IFVzZSBjb2ZmLXNwYXJjLgotCSogZW11bHBhcmFtcy9pMzg2bHlueC5zaCAoU0NSSVBUX05BTUUpOiBTZXQgdG8gaTM4Nmx5bnguCi0JKiBlbXVscGFyYW1zL3NwYXJjbHlueC5zaCAoU0NSSVBUX05BTUUpOiBTZXQgdG8gc3BhcmNseW54LgotCShFTlRSWSk6IFNldCB0byBfX21haW4uCi0JKiBzY3JpcHR0ZW1wbC9pMzg2bHlueC5zYzogTmV3IGZpbGUsIHNjcmlwdCBmb3IgSTM4NiBMeW54LgotCSogc2NyaXB0dGVtcGwvbTY4a2x5bnguc2M6IEFkZCBpbnNlcnRpb24gb2YgY3Rvci9kdG9yIHNlY3Rpb25zLgotCSogc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjOiBOZXcgZmlsZSwgc2NyaXB0IGZvciB1U3BhcmMgTHlueC4KLQotVHVlIEFwciAyNiAxMjo0MTowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IEZvcmNlIF9ncCBhbmQgLmxpdDggdG8gYmUgYWxpZ25lZCB0byBhIDE2Ci0JYnl0ZSBib3VuZGFyeSwgaW4gY2FzZSB0aGUgZ2xvYmFsIGNvbnN0cnVjdG9ycyBkbyBub3QgdGFrZSB1cCBhbgotCWV2ZW4gMTYgYnl0ZXMuCi0KLQkqIGNvbmZpZy9pMzg2djQubWggKEhPU1RJTkdfQ1JUMCk6IElmIC4uL2djYy9jcnRiZWdpbi5vIGRvZXMgbm90Ci0JZXhpc3QsIGdldCBjcnRiZWdpbiBiYXNlZCBvbiBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWUuCi0JKEhPU1RJTkdfTElCUyk6IFNpbWlsYXIgY2hhbmdlIGZvciAuLi9nY2MvY3J0ZW5kLm8uCi0KLU1vbiBBcHIgMjUgMTU6Mjc6NTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogV2hlbiBubyBhZGRyZXNzIGlzIGdpdmVuIGZvciBhCi0Jc2VjdGlvbiwgYWxpZ24gaXQgYWNjb3JkaW5nIHRvIGl0cyByZXF1aXJlbWVudHMuCi0KLVRodSBBcHIgMjEgMTc6MjQ6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4sIGRpc3RjbGVhbik6IFJlbW92ZSBjb25maWdkb2MudGV4aS4KLQotVHVlIEFwciAxOSAxMjoxMjoxNSAxOTk0ICBCaWxsIENveCAgKGJpbGxAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGlbMzRdODYtKi1ic2QzODYgdG8gdGhlIHBhdHRlcm5zIHJlY29nbml6ZWQuCi0KLUZyaSBBcHIgMTUgMTQ6MzU6NDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogV2hlbiByZWxheGluZywgYWRqdXN0IHRoZQotCXBvc2l0aW9uIG9mIGEgcGFkZGluZyBzdGF0ZW1lbnQsIGFuZCBhZGp1c3QgZG90IGFjY29yZGluZ2x5LgotCi1Nb24gQXByIDExIDE3OjM3OjA5IDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEVYUEVDVCwgUlVOVEVTVCk6IFNldCB0aGVzZSBmb3IgdGhlIGNoZWNrIGdvYWwuCi0KLU1vbiBBcHIgMTEgMTI6MzI6NTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYzogSWYgcmVsb2NhdGluZywgZG9uJ3QgcHV0IC5pbml0IGFuZAotCS5maW5pIHNlY3Rpb25zIGludG8gLnRleHQ7IGtlZXAgdGhlbSBzZXBhcmF0ZS4KLQkqIGNvbmZpZy9pMzg2c2NvLm1oIChIT1NUSU5HX0NSVDApOiBJZiAuLi9nY2MvY3J0YmVnaW4ubyBkb2VzIG5vdAotCWV4aXN0LCBnZXQgY3J0YmVnaW4gYmFzZWQgb24gZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lLgotCShIT1NUSU5HX0xJQlMpOiBTaW1pbGFyIGNoYW5nZSBmb3IgLi4vZ2NjL2NydGVuZC5vLgotCi1Nb24gQXByIDExIDEwOjMxOjAwIDE5OTQgIEJpbGwgQ294ICAoYmlsbEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogU2V0IFRDTF9MSUJSQVJZIGZvciBydW50ZXN0LgotCi1XZWQgQXByICA2IDAwOjA5OjM3IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBjb25maWd1cmUuaW4gKGhwcGEqLSotKmVsZiopOiBEb24ndCByZXF1aXJlICItaHAtIiBmb3IgdGhlCi0JbWFudWZhY3R1cmVyLgotCi0JKiBlbXVsdGVtcGwvaHBwYWVsZi5lbSAoaHBwYWVsZl9maW5pc2gpOiBPbmx5IHJlc2l6ZSBzZWN0aW9ucwotCWlmIGJ1aWxkaW5nIGEgZmluYWwgZXhlY3V0YWJsZS4KLQotVHVlIEFwciAgNSAxMjoxNzozMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiBiZmRfY2xvc2UuCi0KLVRodSBNYXIgMzEgMTg6MDc6MDYgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogQ2xlYW4gdXAgc2VjdGlvbiBhbGlnbm1lbnQgdG8gZW5zdXJlIHRoYXQKLQlzZWN0aW9ucyBuZXZlciBvdmVybGFwIHdoZW4gdXNpbmcgLXIuCi0KLVdlZCBNYXIgMzAgMTU6NTE6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogQ2hhbmdlIHN5bWJvbCByZWFkaW5nIHNsaWdodGx5IGZvciByZWNlbnQgQkZECi0JY2hhbmdlczogZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCByZW5hbWVkIGFuZCByZXR1cm5zIGxvbmcsCi0JYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgcmV0dXJucyBsb25nLCBjaGVjayBmb3IgZXJyb3IgaW5kaWNhdGlvbnMuCi0KLUZyaSBNYXIgMjUgMTc6MjA6MDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAocHJpbnRfaW5wdXRfc2VjdGlvbik6IEZvciBzZWN0aW9uIHNpemUsIHVzZQotCV9jb29rZWRfc2l6ZSBpZiBpdCBpcyBub24temVybywgc2l6ZSBvdGhlcndpc2UuCi0JKHNpemVfaW5wdXRfc2VjdGlvbik6IExpa2V3aXNlLgotCShsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UgKGNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pLgotCi1UaHUgTWFyIDI0IDE1OjIwOjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKG5ld19hZmlsZSk6IEFkZCBuZXcgYXJndW1lbnQgYWRkX3RvX2xpc3QuICBEb24ndCBzZXQKLQlyZWFsIHRvIHRydWUgZm9yIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bS4gIENsZWFyIHRoZV9iZmQuCi0JKGxhbmdfYWRkX2lucHV0X2ZpbGUpOiBQYXNzIHRydWUgdG8gbmV3X2FmaWxlIGZvciBhZGRfdG9fbGlzdC4KLQkobG9va3VwX25hbWUpOiBSZW1vdmUgZm9yY2VfbG9hZCBhcmd1bWVudC4gIENoYW5nZWQgYWxsIGNhbGxlcnMuCi0JUGFzcyBmYWxzZSB0byBuZXdfYWZpbGUgZm9yIGFkZF90b19saXN0LiAgU3BsaXQgbG9hZGluZyBvZiBzeW1ib2xzCi0Jb3V0IGludG8gc2VwYXJhdGUgZnVuY3Rpb24uCi0JKGxvYWRfc3ltYm9scyk6IE5ldyBmdW5jdGlvbiBzcGxpdCBvdXQgb2YgbG9va3VwX25hbWUuICBEb24ndCBsb2FkCi0JdGhlIHN5bWJvbHMgaWYgdGhleSBhcmUgYWxyZWFkeSBsb2FkZWQuCi0JKG9wZW5faW5wdXRfYmZkcyk6IEZvciBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtIGNhbGwgbG9hZF9zeW1ib2xzCi0JcmF0aGVyIHRoYW4gbG9va3VwX25hbWUuCi0JKGxhbmdfcHJvY2Vzcyk6IFBhc3MgYWJzX291dHB1dF9zZWN0aW9uIHJhdGhlciB0aGFuIE5VTEwgdG8KLQlsYW5nX3NpemVfc2VjdGlvbnMuCi0JKGxhbmdfc3RhcnR1cCk6IFNldCByZWFsIGZpZWxkIG9mIGZpcnN0X2ZpbGUgdG8gdHJ1ZS4KLQotV2VkIE1hciAyMyAxNDoxNTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChoYWRfcmVsYXgpOiBSZW1vdmVkLgotCShyZWxheF9hZ2Fpbik6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENoYW5nZSBjYWxsIHRvIGJmZF9yZWxheF9zZWN0aW9uIHRvCi0JY29ycmVzcG9uZCB0byBCRkQgY2hhbmdlcy4gIFNldCByZWxheF9hZ2FpbiBhcHByb3ByaWF0ZWx5LgotCShsYW5nX3Byb2Nlc3MpOiBSZW1vdmUgI2lmIDAgY29kZS4gIFdoZW4gcmVsYXhpbmcsIGtlZXAgY2FsbGluZwotCWxhbmdfZG9fYXNzaWdubWVudHMgYW5kIGxhbmdfc2l6ZV9zZWN0aW9ucyB1bnRpbCByZWxheF9hZ2FpbgotCWJlY29tZXMgZmFsc2UuCi0KLQkqIGVtdWx0ZW1wL2dsZDk2MC5lbTogSW5jbHVkZSBsaWJpYmVydHkuaAotCShnbGQ5NjBfYmVmb3JlX3BhcnNlKTogUGFzcyBOVUxMIGFzIGZpbmFsIGFyZ3VtZW50IHRvIGNvbmNhdC4KLQotVHVlIE1hciAyMiAxMzowODoyOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IEZvcmNlIF9lbmQgYW5kIF9fZW5kIHRvIGJlIGFsaWduZWQgdG8gYQotCWZvdXIgYnl0ZSBib3VuZGFyeS4KLQotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSGFuZGxlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bSBieQotCWJ1aWxkaW5nIGEgYmZkX2RhdGFfbGlua19vcmRlciwgcmF0aGVyIHRoYW4gYnkgc2V0dGluZyB0aGUgc2VjdGlvbgotCWNvbnRlbnRzIGltbWVkaWF0ZWx5LgotCi1Nb24gTWFyIDIxIDE4OjI4OjM3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUNoYW5nZXMgdG8gbWFrZSAtVXIgd29yayBhZ2Fpbi4KLQkqIGxkbWFpbi5jIChhZGRfdG9fc2V0KTogTm93IHRha2VzIHJlbG9jIGFyZ3VtZW50IHJhdGhlciB0aGFuCi0JYml0c2l6ZS4gIENoZWNrIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgaGVyZS4gIElmIGFuIG5ldyBoYXNoCi0JdGFibGUgZW50cnkgaXMgY3JlYXRlZCwgbWFyayBpdCBhcyB1bmRlZmluZWQuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogTm8gbG9uZ2VyIHRha2VzIGJpdHNpemUgYXJndW1lbnQuICBQYXNzCi0JQkZEX1JFTE9DX0NUT1IgdG8gbGRjdG9yX2FkZF9zZXRfZW50cnksIGJ1dCBmaXJzdCBtYWtlIHN1cmUgdGhlCi0JQkZEIGJhY2tlbmQgc3VwcG9ydHMgaXQuCi0JKHJlbG9jX292ZXJmbG93KTogSGFuZGxlIGEgTlVMTCBhYmZkIGFyZ3VtZW50LgotCShyZWxvY19kYW5nZXJvdXMsIHVuYXR0YWNoZWRfcmVsb2MpOiBMaWtld2lzZS4KLQkqIGxkY3Rvci5jOiBJbmNsdWRlIGxkbWFpbi5oLgotCShzdHJ1Y3Qgc2V0X2luZm8pOiBDaGFuZ2UgYml0c2l6ZSBmaWVsZCB0byByZWxvYy4KLQkobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBOb3cgdGFrZXMgcmVsb2MgYXJndW1lbnQgcmF0aGVyIHRoYW4KLQliaXRzaXplLiAgRG9uJ3QgYm90aGVyIHRvIGNoZWNrIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgaGVyZS4KLQkobGRjdG9yX2J1aWxkX3NldHMpOiBHZXQgdGhlIHNpemUgZnJvbSB0aGUgcmVsb2MgaG93dG8uICBJZgotCWdlbmVyYXRpbmcgcmVsb2NhdGVhYmxlIG91dHB1dCwgY2FsbCBsYW5nX2FkZF9yZWxvYyByYXRoZXIgdGhhbgotCWxhbmdfYWRkX2RhdGEuCi0JKiBsZGN0b3IuaCAobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBDaGFuZ2UgZGVjbGFyYXRpb24gdG8gdXNlIHJlbG9jCi0JaW5zdGVhZCBvZiBiaXRzaXplLgotCSogbGRsYW5nLmggKHN0YXRlbWVudF9lbnVtKTogQWRkIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0uCi0JKGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUpOiBOZXcgc3RydWN0dXJlLgotCShsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlKTogQWRkIHJlbG9jX3N0YXRlbWVudCBmaWVsZC4KLQkobGFuZ19hZGRfcmVsb2MpOiBEZWNsYXJlIG5ldyBmdW5jdGlvbi4KLQkqIGxkbGFuZy5jIChsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIpOiBIYW5kbGUKLQlsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtLgotCShtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zLCBwcmludF9zdGF0ZW1lbnQpOiBMaWtld2lzZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zLCBsYW5nX2RvX2Fzc2lnbm1lbnRzKTogTGlrZXdpc2UuCi0JKHByaW50X3JlbG9jX3N0YXRlbWVudCk6IE5ldyBmdW5jdGlvbi4KLQkobGFuZ19hZGRfcmVsb2MpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZHdyaXRlLmMgKGJ1aWxkX2xpbmtfb3JkZXIpOiBIYW5kbGUgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bS4KLQotCSogTWFrZWZpbGUuaW4gKGNkdGVzdC5vdXQsIGNkdGVzdC11ci5vKTogTmV3IHRhcmdldHMuCi0JKGNkdGVzdC11ciwgY2R0ZXN0LXVyLm91dCk6IE5ldyB0YXJnZXRzLgotCShjaGVjay1jZHRlc3QpOiBOb3cgYWxzbyBjaGVjayB0aGF0IC1VciB3b3JrcyBjb3JyZWN0bHkuCi0KLQkqIHNjcmlwdHRlbXAvYWxwaGEuc2M6IEFsaWduIGFsbCBzZWN0aW9ucyB0byAxNiBieXRlIGJvdW5kYXJpZXMuCi0KLVRodSBNYXIgMTcgMTI6NDU6NDEgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogTW92ZSBsYW5nX2NvbW1vbiBjYWxsIGJlZm9yZQotCW1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMsIHRvIGVuc3VyZSB0aGF0IGFueSBhbGlnbm1lbnQKLQljb25zdHJhaW50cyBzZXQgYnkgY29tbW9uIHN5bWJvbHMgYXJlIGNvcGllZCBvdmVyIHRvIHRoZSBvdXRwdXQKLQlzZWN0aW9ucy4KLQotRnJpIE1hciAxMSAyMjoxNzozNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvZWxmMzJwcGMuc2ggKFRFTVBMQVRFX05BTUUpOiBEb24ndCBkZWZpbmUuCi0JKE9USEVSX1JFQURXUklURV9TRUNUSU9OUyk6IFJlbmFtZSAudG9jIHRvIC5nb3QuCi0JKiBNYWtlZmlsZS5pbiAoZW1fZWxmMzJwcGMuYyk6IERlcGVuZCB1cG9uIGdlbmVyaWMuZW0sIG5vdCBwcGMuZW0uCi0JKiBlbXVsdGVtcGwvcHBjLmVtOiBSZW1vdmUgdWdseSBzdHViIGNvZGU7IHR1cm5zIG91dCBub3QgdG8gYmUKLQluZWVkZWQgZm9yIEVMRi4KLQotVHVlIE1hciAgOCAwNDoyMjoyNyAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2YnNkLm1oOiBOZXcgZmlsZS4KLQotTW9uIE1hciAgNyAxNToyMzoyNCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGVsZi5zYzogUGVybWl0IFRFWFRfU1RBUlRfU1lNQk9MUyBhbmQgREFUQV9TVEFSVF9TWU1CT0xTIHRvIGJlCi0JZGVmaW5lZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnMgKFRFWFRfU1RBUlRfU1lNQk9MUyk6IERlZmluZSBfZnRleHQuCi0JKERBVEFfU1RBUlRfU1lNQk9MUyk6IERlZmluZSBfZmRhdGEuCi0KLU1vbiBGZWIgMjggMTA6NTk6MTQgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoY2F0KTogRGVmaW5lIHVzaW5nIEFOU0kgc3R5bGUgaWYgQUxNT1NUX1NUREMgZGVmaW5lZC4KLQotU3VuIEZlYiAyNyAxNjoyOTozOCAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogZW11bHRlbXBsL2hwcGFlbGYuZW0gKGhwcGFlbGZfZmluaXNoKTogVXBkYXRlIGNvbW1lbnRzLiAgVGhpcwotCXdvcmtzIGFnYWluLiAgQXR0YWNoIHNvbWUgb3V0cHV0IHN5bWJvbHMgdG8gdGhlIHN0dWIgZmlsZSBiZmQuCi0KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBJbmNsdWRlIGVsZjMyLWhwcGEuaC4KLQkoZmlsZV9jaGFpbik6IEFkZCBkZWNsLgotCShocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24pOiBEZWxldGUgZGVjbC4KLQkoaHBwYWVsZl9maW5pc2gpOiBSZWVuYWJsZSBjb2RlLiAgRG8gbm90IHBhc3Mgc3ltYm9scwotCWRvd24gdG8gaHBwYV9sb29rX2Zvcl9zdHVic19pbl9zZWN0aW9uLgotCi1TYXQgRmViIDI2IDEwOjU4OjI1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHdyaXRlX21hcCk6IERvbid0IGRlZmluZS4gIFJlbW92ZWQgYWxsIHJlZmVyZW5jZXMuCi0JSnVzdCB1c2UgbWFwX2ZpbGUgb3IgbWFwX2ZpbGVuYW1lIGluc3RlYWQuCi0JKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBVc2UgbWluZm8gdG8gd3JpdGUgbWFwIGluZm9ybWF0aW9uLCBub3QKLQlpbmZvX21zZy4KLQkoY29uc3RydWN0b3JfY2FsbGJhY2spOiBVc2UgZnByaW50ZiB0byB3cml0ZSBtYXAgaW5mb3JtYXRpb24sIG5vdAotCWluZm9fbXNnLgotCSogbGRtYWluLmggKHdyaXRlX21hcCk6IERvbid0IGRlY2xhcmUuCi0JKiBsZGdyYW0ueSAobXJpX3NjcmlwdF9jb21tYW5kKTogUmVtb3ZlZCByZWZlcmVuY2UgdG8gd3JpdGVfbWFwLgotCSogbGRsYW5nLmMgKGxhbmdfb25lX2NvbW1vbik6IExpa2V3aXNlLgotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBMaWtld2lzZS4KLQotRnJpIEZlYiAyNSAxOToxMjowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2VsZi5zYzogRm9yY2UgYWxsIHNlY3Rpb25zIHRvIGJlIGFsaWduZWQuCi0KLQkqIGxkZ3JhbS55IChzZWN0aW9uKTogUmV2ZXJzZSB0aGUgb3JkZXIgb2YgbWVtc3BlY19vcHQgYW5kCi0JZmlsbF9vcHQgdG8gYXZvaWQgYW4gYW1iaWd1aXR5IHdoZW4gYm90aCBhcmUgdXNlZC4KLQkqIGxkLnRleGluZm86IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0KLQkqIGxkZ3JhbS55OiBNb3ZlIGluY2x1ZGUgb2YgbGRsZXguaCBiYWNrIHdpdGggb3RoZXIgaW5jbHVkZXMuCi0JKiBsZGxleC5oIChpbnB1dF90eXBlKTogRG9uJ3QgaW5pdGlhbGl6ZSBlbnVtIGNvbnN0YW50cyB0bwotCXBhcnRpY3VsYXIgdmFsdWVzLgotCSogbGRsZXgubDogVXNlIGEgc3dpdGNoIHRvIHJldHVybiB0aGUgcmlnaHQgdG9rZW4gYmFzZWQgb24KLQlpbnB1dF90eXBlLCByYXRoZXIgdGhhbiBrbm93aW5nIHRoYXQgaW5wdXRfdHlwZSBoYXMgYSB2YWx1ZSBiYXNlZAotCW9uIGEgdG9rZW4gdHlwZS4KLQotCSogbGRncmFtLnkgKGRpcmxpc3RfcHRyKTogUmVtb3ZlZDsgbm90IHVzZWQuCi0JKiBsZXhzdXAuYzogSW5jbHVkZSBsZHZlci5oLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbHQgZGVwZW5kZW5jaWVzLgotCi1GcmkgRmViIDI1IDE4OjU1OjU0IDE5OTQgIFRlZCBMZW1vbiAgKG1lbGxvbkBwZXBwZXIubmNkLmNvbSkKLQotCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogZG9uJ3QgY2FsbCBiZmRfc2V0X2dwX3NpemUuCi0JKGxkbGFuZ19hZGRfZmlsZSk6IGNhbGwgaXQgaGVyZSBpbnN0ZWFkLgotCi1GcmkgRmViIDI1IDE4OjEzOjQ2IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IEluY2x1ZGUgbGRsZXguaCBhZnRlciAldG9rZW4gZGVjbHMsIGZvciBieWFjYy4KLQotRnJpIEZlYiAyNSAxMDo0NzoyNSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotICAgICAgICAqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtOiBGaXJzdCBhdHRlbXB0IHRvIGNsZWFuIHRoaXMgZmlsZSB1cC4KLQlBZGQgY29tbWVudHMgaW4gc2V2ZXJhbCBmdW5jdGlvbnMgYXMgdG8gdGhlaXIgcHVycG9zZSBhbmQKLQlob3cgdGhleSBmdW5jdGlvbiAob3IgbXkgY3VycmVudCBiZXN0IGd1ZXNzKS4gIENsZWFuIHVwIGhvcnJpYmxlCi0Jc3BhY2luZyBhbmQgaW5kZW50aW9uIHRoYXQgbmV2ZXIgc2hvdWxkIGhhdmUgYmVlbiBhY2NlcHRlZCBpbiB0aGUKLQlmaXJzdCBwbGFjZS4gIEFkZCBGSVhNRXMgZm9yIGlzc3VlcyB3aGljaCBuZWVkIHRvIGJlIHJlc29sdmVkLgotCURpc2FibGUgbGlua2VyLXN0dWIgZ2VuZXJhdGlvbiB1bnRpbCBpdCBnZXRzIGZpeGVkLiAgVGhpcyBhbGxvd3MKLQl0aGUgbGlua2VyIHRvIGF0IGxlYXN0IHdvcmsgb24gc2ltcGxlIGNvZGUgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3NpemVfc2VjdGlvbnMpOiBObyBsb25nZXIgc3RhdGljIChQQSBFTEYgY2FsbHMKLQlpdCB2aWEgaHBwYWVsZl9maW5pc2gpLiAgUHJvdG90eXBlIG1vdmVkIGludG8gbGRsYW5nLmguCi0JKGxhbmdfcHJvY2Vzcyk6IE1vdmUgcHJvYmxlbWF0aWMgZXh0cmEgY2FsbCB0byBsYW5nX3NpemVfc2VjdGlvbnMKLQlpbnRvIHRoZSBQQSBFTEYgc3BlY2lmaWMgY29kZS4KLQkqIGVtdWx0ZW1wbC9ocHBhZWxmLmVtIChocHBhZWxmX2ZpbmlzaCk6IEV4dHJhIGNhbGwgdG8KLQlsYW5nX3NpemVfc2VjdGlvbnMgbW92ZWQgaGVyZS4KLQotVGh1IEZlYiAyNCAxNjo0NzozMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAocG93ZXJwYy0qLWVsZiopOiBOZXcgdGFyZ2V0OyB1c2UgcHBjLWVsZjMyLgotCSogY29uZmlnL3BwYy1lbGYzMi5tdDogTmV3IGZpbGUuCi0JKiBlbXVscGFyYW1zL2VsZjMycHBjLnNoOiBOZXcgZmlsZS4KLQkqIGVtdWx0ZW1wbC9wcGMuZW06IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fZWxmMzJwcGMuby4KLQkoZW1fZWxmMzJwcGMuYyk6IE5ldyB0YXJnZXQ7IHVzZXMgZWxmMzJwcGMuc2gsIHBwYy5lbSBhbmQgZWxmLnNjLgotCShFTVVMQVRJT05fT0ZJTEVTKTogQWRkZWQgZGVwZW5kZW5jaWVzIG9uIGxkZXhwLmggYW5kIGxkbGFuZy5oLgotCi1UaHUgRmViIDI0IDEyOjI3OjA3IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogbGV4c3VwLmMgKHBhcnNlX2FyZ3MpOiBVc2Ugc3ltYm9saWMgbnVtYmVycyBmb3IgbG9uZyBvcHRpb25zLgotCUZpeCBtaXN1bmRlcnN0YW5kaW5nIGluIC1ZIGFuZCAtY2FsbF9zaGFyZWQgZXQgYWwuCi0KLQlVc2UgZ2V0b3B0IGluc3RlYWQgb2YgbGV4IGFuZCB5YWNjIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUuCi0KLQkqIGxkLnRleGluZm8gKE9wdGlvbnMpOiBEb2N1bWVudCBjaGFuZ2VzIHRvIG9wdGlvbiBzeW50YXguCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIGxkdmVyLmMgKGhlbHApOiBUd2VhayBkYXNoZXMgaW4gdXNhZ2UgbWVzc2FnZS4KLQkqIGxkZ3JhbS55ICgldW5pb24pOiBSZW1vdmUgdW51c2VkIG1lbWJlcnMuCi0JUmVtb3ZlICV0b2tlbnMgZm9yIGNvbW1hbmQgbGluZSBvcHRpb25zOyBhZGQgb25lcyBmb3IgaW5wdXQgdHlwZXMuCi0JKGNvbW1hbmRfbGluZSk6IFJ1bGVzIHJlbW92ZWQuCi0JKGZpbGUpOiBJbnN0ZWFkIG9mIGNvbW1hbmQgbGluZSwgcmVjb2duaXplIGFuCi0JaW5wdXQgdHlwZSBpbmRpY2F0b3IsIHRoZW4gdXNlIHRoZSBub250ZXJtaW5hbCBmb3IgdGhhdCB0eXBlLgotCShkZWZzeW1fZXhwcik6IE5ldyBub250ZXJtaW5hbCBmcm9tIGNvZGUgZm9ybWVybHkgaW4gY29tbWFuZF9saW5lLgotCSogbGRsZXguaDogRGVjbGFyZSBwYXJzZXIgaW5wdXQgdHlwZSBlbnVtIGFuZCB2YXJpYWJsZS4KLQlEb24ndCBkZWNsYXJlIHBhcnNlX2xpbmUuCi0JKiBsZGxleC5sOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlcy4gIE1ha2Ugc29tZSB1c2VkIG9uZXMgc3RhdGljCi0JYW5kIGNvbW1lbnQgdGhlbS4KLQkoQ09NTUFORCk6IFN0YXJ0IHN0YXRlIGFuZCBpdHMgcnVsZXMgcmVtb3ZlZC4KLQlBdCBzdGFydCBvZiB5eWxleCwgcmV0dXJuIGlucHV0IHN0YXRlIHRva2VuIGlmIGF0IHN0YXJ0IG9mIGlucHV0LgotCShsZXhfcmVkaXJlY3QpOiBEb24ndCBuZWVkIHRvIHNldCB5eW91dC4KLQkobGRsZXhfY29tbWFuZCk6IEZ1bmN0aW9uIHJlbW92ZWQuCi0JKiBsZG1haW4uYyAobWFpbik6IEluc3RlYWQgb2YgY2FsbGluZyBwYXJzZV9saW5lLCBzZXQgdXAgdGhlCi0JcmVkaXJlY3Rpb25zIGFuZCBjYWxsIHl5cGFyc2UgZGlyZWN0bHkuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogSWYgdGhlcmUncyBubyBpbnB1dCBmaWxlbmFtZSwgcHJpbnQgbm90aGluZywgbm90Ci0JImNvbW1hbmQgbGluZSIuCi0JKiBsZXhzdXAuYzogUmVtb3ZlICNpZiAwJ2QgY29kZS4KLQkocGFyc2VfbGluZSk6IEZ1bmN0aW9uIHJlbW92ZWQuCi0JKHBhcnNlX2FyZ3MpOiBSZXdyaXRlIHRvIHVzZSBnZXRvcHRfbG9uZ19vbmx5LgotCShzZXRfZGVmYXVsdF9kaXJsaXN0KTogTmV3IGZ1bmN0aW9uIGZyb20gY29kZSBmb3JtZXJseSBpbgotCWxkZ3JhbS55OmNvbW1hbmRfbGluZS4KLQkoc2V0X3NlY3Rpb25fc3RhcnQpOiBOZXcgZnVuY3Rpb24uCi0JKiBlbXVsdGVtcGwvZ2VuZXJpYy5lbSwgZW11bHRlbXBsL2dsZDk2MC5lbSwgZW11bHRlbXBsL2hwcGFlbGYuZW0sCi0JZW11bHRlbXBsL2xuazk2MC5lbSwgZW11bHRlbXBsL204OGtiY3MuZW06IERvbid0IGVuY2xvc2UKLQljb21waWxlZC1pbiBsaW5rIHNjcmlwdHMgaW4gInsiIGFuZCAifSIsIGFzIHRoZSBncmFtbWFyIG5vIGxvbmdlcgotCXdhbnRzIHRoZW0gdG8gYmUuCi0KLVRodSBGZWIgMjQgMDg6NDM6MjYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobGQuZHZpKTogRGVwZW5kIG9uIGNvbmZpZ2RvYy50ZXhpLCBidXQgZG9uJ3QKLQlyZXF1aXJlIHRoYXQgaXQgYmUgaW4gJChzcmNkaXIpLgotCi1UdWUgRmViIDIyIDA5OjIxOjE4IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IE9ubHkgYWxpZ24gc2VjdGlvbiB0byBhbGlnbm1lbnQKLQlyZXF1aXJlZCBieSBsaW5rZXIgc2NyaXB0LCBub3QgdG8gbWF4aW11bSBhbGlnbm1lbnQgb2YgaW5wdXQKLQlzZWN0aW9ucy4KLQotCSogbGRsYW5nLmggKGxhcmdlc3Rfc2VjdGlvbik6IERvbid0IGRlY2xhcmUuCi0JKiBsZGxhbmcuYyAobGFyZ2VzdF9zZWN0aW9uKTogRG9uJ3QgZGVmaW5lLgotCShzaXplX2lucHV0X3NlY3Rpb24pOiBEb24ndCBzZXQgbGFyZ2VzdF9zZWN0aW9uOyBub3QgdXNlZC4KLQotTW9uIEZlYiAyMSAxNToxNToyOSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChuZXdfYWZpbGUpOiBQYXNzIE5VTEwgYXMgbGFzdCBhcmd1bWVudCB0byBjb25jYXQuCi0KLVRodSBGZWIgMTcgMTU6NTE6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYywgbGRtYWluLmM6IEluY2x1ZGUgbGliaWJlcnR5LmguCi0KLQkqIGxkbWlzYy5oIChjb25jYXQpOiBEb24ndCBkZWNsYXJlLgotCSogbGRtaXNjLmMgKGNvbmNhdCk6IERvbid0IGRlZmluZTsganVzdCB1c2UgdGhlIG9uZSBpbiBsaWJpYmVydHkuCi0KLQkqIGxkLmggKGFzX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFJlbW92ZWQ7IG5vdCB1c2VkLgotCi1UaHUgRmViIDE3IDA5OjMyOjE0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMsIGxkbWFpbi5jLCBsZG1pc2MuYzogVXNlIGJmZF9nZXRfZXJyb3IgYW5kCi0JYmZkX3NldF9lcnJvciBhbmQgbmV3IGVycm9yIG5hbWVzLgotCi1UdWUgRmViIDE1IDIwOjE0OjUzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGxkd3JpdGUuYyAoYnVpbGRfbGlua19vcmRlcik6IElmIHRoZSBjb29rZWQgc2l6ZSBvZiB0aGUgc2VjdGlvbgotCWhhcyBiZWVuIHNldCwgdXNlIGl0LCBmb3IgZGV0ZXJtaW5pbmcgbGlua19vcmRlciBzaXplLgotCShsZHdyaXRlKTogSW4gdGhlIGVycm9yIG1lc3NhZ2UgZGlzcGxheWVkIGlmIGJmZF9maW5hbF9saW5rIGZhaWxzLAotCWluZGljYXRlIHRoYXQgaXQgd2FzIGluIGZhY3QgdGhlIGZpbmFsIGxpbmsgc3RlcCB0aGF0IGZhaWxlZC4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENsZWFyIGJmZF9lcnJvciBiZWZvcmUgY2FsbGluZwotCWJmZF9yZWxheF9zZWN0aW9uLCBpbiBjYXNlIGl0IHJldHVybnMgZmFsc2UgYnV0IGRvZXNuJ3QgZmxhZyBhbgotCWVycm9yLiAgSWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIGluZGljYXRlIHdoaWNoIG9uZSBpdCBpcyBpbiB0aGUKLQllcnJvciBtZXNzYWdlLgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbC1pbmZvKTogRGVwZW5kIG9uIGxkLmluZm8sIGFuZCB1c2UgIiQ8KiIgc28KLQlpdCdsbCBnZXQgcGlja2VkIHVwIGZyb20gJChzcmNkaXIpIGlmIGFwcHJvcHJpYXRlLgotCi1UdWUgRmViIDE1IDE2OjMyOjA0IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvYW91dC5zYzogT25seSBwYWQgLnRleHQgaWYgUEFEX1RFWFQgaXMgc2V0LgotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaCAoUEFEX1RFWFQpOiBTZXQgUEFEX1RFWFQuCi0KLUZyaSBGZWIgMTEgMTc6MDI6NDkgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sIChjb21tZW50KTogSW5jcmVtZW50IGxpbmUgbnVtYmVyIHdoZW4gbmV3bGluZSBpcyByZWFkLgotCi1GcmkgRmViIDExIDE3OjM2OjIwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogVGFrZSBuZXcgYXJndW1lbnQsIGZvcmNlX2xvYWQuICBJZiB0cnVlLAotCXJlbG9hZCB0aGUgZmlsZSBldmVuIGlmIGl0IGlzIGFscmVhZHkgbG9hZGVkLgotCSh3aWxkKTogQ2FsbCBsb29rdXBfbmFtZSB3aXRoIGZvcmNlX2xvYWQgYXJndW1lbnQgb2YgMC4KLQkob3Blbl9pbnB1dF9iZmRzKTogQ2FsbCBsb29rdXBfbmFtZSB3aXRoIGZvcmNlX2xvYWQgYXJndW1lbnQgb2YgMS4KLQkocHJpbnRfc3ltYm9sKTogUmVtb3ZlIGRlY2xhcmF0aW9uIG9mIG5vbi1leGlzdGVudCBmdW5jdGlvbi4KLQkocHJpbnRfb25lX3N5bWJvbCk6IFJldHVybiB0cnVlIHJhdGhlciB0aGFuIGZhbGxpbmcgb2ZmIGVuZC4KLQotVGh1IEZlYiAxMCAxMTo1MjozOCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogVXNlICVsZCB3aGVuIHByaW50aW5nIGxvbmcgdmFsdWVzLgotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IE1vdmUgX2VkYXRhIGFmdGVyIHRoZSAuc2RhdGEgc2VjdGlvbi4KLQlQZXJtaXQgT1RIRVJfQlNTX1NZTUJPTFMgdG8gYmUgZGVmaW5lZC4KLQkqIGVtdWxwYXJhbXMvZWxmMzJtaXBiLnMgKE9USEVSX0JTU19TWU1CT0xTKTogRGVmaW5lIF9mYnNzLgotCi1Nb24gRmViICA3IDE2OjMxOjE1IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBSZW5hbWUgYWxsICJocHBhb3NmIiBmaWxlcyB0byAiaHBwYWVsZiIuCi0JKiBDaGFuZ2UgYWxsICJvc2YiIHJlZmVyZW5jZXMgdG8gImVsZiIgaW4gaHBwYWVsZiBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0KLVN1biBGZWIgIDYgMjA6MzE6NTYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgeGF0ZXhpdCwgbm90IGF0ZXhpdC4KLQlDYWxsIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZS4KLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IENoZWNrIGlmIGJmZF9yZWxheF9zZWN0aW9uIHNldAotCWJmZF9lcnJuby4KLQotU2F0IEZlYiAgNSAwMzo1NDozNCAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGVtdWx0ZW1wbC9sbms5NjAuZW0gKGFwcGVuZCksIGVtdWx0ZW1wbC9ocHBhb3NmLmVtCi0JKGhwcGFvc2ZfZmluaXNoKTogQ2FsbCB4bWFsbG9jLCBub3QgbGRtYWxsb2MuCi0JKiBsZG1haW4uYyAocHJlc2VydmVfb3V0cHV0KTogRnVuY3Rpb24gcmVtb3ZlZC4KLQkobWFpbik6IERvIGl0IGhlcmUgaW5zdGVhZC4KLQotRnJpIEZlYiAgNCAyMzowMjoxOSAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogbGRsYW5nLmggKExBTkdfRk9SX0VBQ0hfe0lOUFVULE9VVFBVVH1fU0VDVElPTik6IERlbGV0ZSAodW51c2VkKQotCUdOVSBDIHNwZWNpZmljIG1hY3Jvcy4KLQotCSogZW11bHRlbXBsL2hwcGFvc2YuZW0gKGhwcGFvc2ZfZmluaXNoKTogRXhwYW5kIHRoZSBvbmx5IHJlbWFpbmluZwotCWNhbGwgdG8gTEFOR19GT1JfRUFDSF9JTlBVVF9TRUNUSU9OLgotCi1GcmkgRmViICA0IDE2OjI2OjA4IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKGxkbWFsbG9jLCB4bWFsbG9jLCBsZHJlYWxsb2MsIHhyZWFsbG9jKTogRnVuY3Rpb25zCi0JZGVsZXRlZDsgd2lsbCB1c2UgbGliaWJlcnR5IHZlcnNpb25zIGluc3RlYWQuCi0JKiBsZGN0b3IuYyBsZGZpbGUuYyBsZGxhbmcuYyBsZG1haW4uYyBsZG1pc2MuYyBsZG1pc2MuaCBsZXhzdXAuYwotCW1yaS5jIE1ha2VmaWxlLmluOiBDaGFuZ2UgY2FsbGVycy4KLQotCSogbGRtaXNjLmMgKHZmaW5mbyk6IFJlbW92ZSBjbGVhbnVwIGNvZGUuCi0JKiBsZG1haW4uYyAocmVtb3ZlX291dHB1dCk6IFB1dCBpdCBoZXJlIChuZXcgZnVuY3Rpb24pLgotCShwcmVzZXJ2ZV9vdXRwdXQpOiBOZXcgZnVuY3Rpb24uCi0JKG1haW4pOiBSZWdpc3RlciByZW1vdmVfb3V0cHV0IGFuZCBwcmVzZXJ2ZV9vdXRwdXQgd2l0aCBhdGV4aXQuCi0JKiBsZG1haW4uYyBsZGdyYW0ueTogQ2FsbCB4ZXhpdCBpbnN0ZWFkIG9mIGV4aXQuCi0JKiBsZG1pc2MuaDogRGVjbGFyZSB4ZXhpdC4KLQotRnJpIEZlYiAgNCAxNToxOTowMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogTG90cyBvZiBuZXcgSDgvNTAwIG1lbW9yeSBtb2RlbHMuCi0KLVN1biBKYW4gMzAgMTQ6MzM6NDAgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogUmVtb3ZlZCBkdXBsaWNhdGUgcnVsZXMuCi0JKHl5d3JhcCk6IFByb3ZpZGUgZGVmYXVsdCBkZWZpbml0aW9uLCBuZWVkZWQgd2l0aCBzb21lIHZlcnNpb25zIG9mCi0JZmxleC4KLQotRnJpIEphbiAyOCAwOToxMjo1NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBGb3IgYCVJJywgaWYgdGhlIGZpbGUgaXMgaW4gYW4gYXJjaGl2ZSwgcHJpbnQKLQl0aGUgYXJjaGl2ZSBmaWxlbmFtZSB0b28uCi0KLQkqIGxkbGV4Lmw6IEFkZCBydWxlIHRvIGNhdGNoIGludmFsaWQgaW5wdXQgY2hhcmFjdGVycyBpbnN0ZWFkIG9mCi0JcHJpbnRpbmcgdGhlbS4gIEluY2x1ZGUgImxkbWFpbi5oIiBmb3IgcHJvZ3JhbV9uYW1lIGRlY2wuCi0JKGxleF93YXJuX2ludmFsaWQpOiBOZXcgZnVuY3Rpb24uCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY3kuCi0KLUZyaSBKYW4gMjggMTI6NTg6NDUgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGNoZWNrKTogRG9uJ3QgYm90aGVyIHJ1bm5pbmcgYW55IHRlc3RzIG9mCi0JY3Jvc3MtbGlua2VyIHVudGlsIHRoZSB0ZXN0IHN1aXRlIG5vIGxvbmdlciBhc3N1bWVzIG5hdGl2ZSBtb2RlLgotCi1UaHUgSmFuIDI3IDE3OjE5OjU0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChwcmludF9vbmVfc3ltYm9sLCBwcmludF9pbnB1dF9zZWN0aW9uKTogIFByaW50Ci0JZ2xvYmFsIHN5bWJvbHMgaW4gc3ltYm9sIHRhYmxlIGFnYWluLgotCi1UaHUgSmFuIDI3IDEyOjM1OjAxIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgbGRtYWluLmggbGRncmFtLnk6IElmIC12IC1WIG9yIC0tdmVyc2lvbiB3YXMgZ2l2ZW4sCi0JZXhpdCBzdWNjZXNzZnVsbHkgaW5zdGVhZCBvZiBjb21wbGFpbmluZyBpZiBubyBpbnB1dCBmaWxlcyBhcmUKLQlnaXZlbi4KLQotVHVlIEphbiAyNSAxMzoxOTo0MSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBGb3JtYXQgdmFyaWFibGUgZGVmaW5pdGlvbnMgY29uc2lzdGVudGx5LgotCShMRF9QUk9HKTogUmVtb3ZlIHVubmVjZXNzYXJ5IHZhcmlhYmxlcyBmcm9tIGxpbmsgY29tbWFuZCwKLQljaGFuZ2UgdmFyaWFibGUgTE9BRExJQkVTIHRvIEVYVFJBTElCUy4KLQotCSogbGRtYWluLmMgKG1haW4pOiBDb21wdXRlIGFuZCBkaXNwbGF5IHRvdGFsIGV4ZWN1dGlvbiB0aW1lLgotCSogbGQudGV4aW5mbyAoLXN0YXRzKTogRG9jdW1lbnQgdGhlIG9wdGlvbi4KLQotTW9uIEphbiAyNCAxMjo1NjozNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChyZWxvY19vdmVyZmxvdyk6IEFkZGVkIG5hbWUsIHJlbG9jX25hbWUgYW5kIGFkZGVuZAotCWFyZ3VtZW50cy4KLQotCSogbGRsYW5nLmMgKGxvb2t1cF9uYW1lKTogU2V0IEJGRCBHUCBzaXplIHRvIC1HIGFyZ3VtZW50IHZhbHVlCi0JYWZ0ZXIgb3BlbmluZyBCRkQuCi0KLQkqIGxkbGFuZy5jIChyZWxheGluZyk6IFJlbW92ZWQgZ2xvYmFsIHZhcmlhYmxlLgotCShsYW5nX3NpemVfc2VjdGlvbnMpOiBJZiB0aGUgY2Fub25pY2FsIHN5bWJvbHMgaGF2ZSBub3QgYWxyZWFkeQotCWJlZW4gcmVhZCBpbiwgcmVhZCB0aGVtIGluIGJlZm9yZSByZWxheGluZy4KLQkqIGxkbGFuZy5oIChyZWxheGluZyk6IFJlbW92ZWQgZGVjbGFyYXRpb24uCi0KLUZyaSBKYW4gMjEgMDA6NDQ6NDQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobmV3X2FmaWxlKTogSW5pdGlhbGl6ZSBsb2FkZWQgZmllbGQgdG8gZmFsc2UuCi0JKGxvb2t1cF9uYW1lKTogSWYgZmlsZSB3YXMgYWxyZWFkeSBsb2FkZWQsIGRvbid0IGNhbGwgdGhlCi0JYWRkX3N5bWJvbHMgZW50cnkgcG9pbnQgYWdhaW4uCi0KLVdlZCBKYW4gMTkgMTM6NTc6MDAgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiBDbGFyaWZ5IHdoYXQgLVQgb3B0aW9uIGRvZXMuCi0KLVR1ZSBKYW4gMTggMTY6MTg6MTUgMTk5NCAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAam9ubnkuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvbTg4a2Jjcy5zYzogRG9uJ3QgdXNlIENSRUFURV9PQkpFQ1RfU1lNQk9MUywgdGhhdCdzCi0JZm9yIGEub3V0LgotCi1UdWUgSmFuIDExIDEzOjIyOjA0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGFkZF9hcmNoaXZlX2VsZW1lbnQpOiBJZiB0cmFjZV9maWxlcyBvcgotCXRyYWNlX2ZpbGVfdHJpZXMsIHByaW50IGZpbGUgbmFtZS4KLQkqIGxkbGFuZy5jIChsb29rdXBfbmFtZSk6IExpa2V3aXNlLgotCShsZGxhbmdfYWRkX2ZpbGUpOiBEb24ndCBwdXQgZmlsZXMgb24gaW5wdXRfYmZkcyBsaXN0IGluIHJldmVyc2UKLQlvcmRlci4KLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBDb3JyZWN0IHR5cG8uCi0KLU1vbiBKYW4gMTAgMTk6NDk6MDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSwgbGRsZXgubDogTWFrZSB0aGUgc3BhY2UgYmV0d2VlbiAtZSwgLXUsIGFuZCAteSBhbmQKLQl0aGVpciBhcmd1bWVudHMgb3B0aW9uYWwsIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBHTlUgbGQuCi0KLUZyaSBKYW4gIDcgMjA6MDA6MjQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuYzogRGVmaW5lIF9fYnNzX3N0YXJ0IGJlZm9yZSB0aGUgLnNic3Mgc2VjdGlvbi4KLQotVGh1IEphbiAgNiAwMDoxMzoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChhZGRfdG9fc2V0KTogQWRkIGJpdHNpemUgYXJndW1lbnQuCi0JKGNvbnN0cnVjdG9yX2NhbGxiYWNrKTogTmV3IGZ1bmN0aW9uLgotCShsaW5rX2NhbGxiYWNrcyk6IEFkZCBjb25zdHJ1Y3Rvcl9jYWxsYmFjay4KLQkqIGxkY3Rvci5jIChzdHJ1Y3Qgc2V0X2luZm8pOiBBZGQgYml0c2l6ZSBmaWVsZC4KLQkobGRjdG9yX2FkZF9zZXRfZW50cnkpOiBBZGQgYml0c2l6ZSBhcmd1bWVudC4KLQkobGRjdG9yX2J1aWxkX3NldHMpOiBCYXNlIHRoZSBzaXplIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgc2V0IG9uCi0JdGhlIGJpdHNpemUsIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyBMT05HLgotCSogbGRjdG9yLmggKGxkY3Rvcl9hZGRfc2V0X2VudHJ5KTogQWRkIGJpdHNpemUgdG8gZGVjbGFyYXRpb24uCi0KLQkqIGxkLmggKFFVQURfU0laRSk6IERlZmluZS4KLQkqIGxkZ3JhbS55IChRVUFEKTogTmV3IHRva2VuLgotCShsZW5ndGgpOiBIYW5kbGUgaXQuCi0JKiBsZGxleC5sOiBSZXR1cm4gUVVBRC4KLQkqIGxleHN1cC5jIChrZXl3b3Jkcyk6IEFkZCBRVUFELgotCSogbGR3cml0ZS5jIChidWlsZF9saW5rX29yZGVyKTogSGFuZGxlIFFVQUQuCi0JKiBsZGxhbmcuYyAocHJpbnRfZGF0YV9zdGF0ZW1lbnQpOiBIYW5kbGUgUVVBRC4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogTGlrZXdpc2UuCi0JKGxhbmdfZG9fYXNzaWdubWVudHMpOiBMaWtld2lzZS4KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90b2tlbik6IEFkZCBRVUFEIHRvIHRhYmxlLgotCSogbGQudGV4aW5mbzogRGVzY3JpYmUgUVVBRC4KLQotCSogc2NyaXB0dGVtcGwvYWxwaGEuc2M6IERvbid0IGNyZWF0ZSAubGl0NCBvciAuc2RhdGEgc2VjdGlvbnMsCi0Jc2luY2UgdGhlIEFscGhhIGRvZXNuJ3QgdXNlIHRoZW0uCi0KLVdlZCBKYW4gIDUgMTc6NDI6MTYgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGVtdWwuaCAobGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogQ29tbWVudCB0aGUgbWVtYmVycy4KLQotU2F0IEphbiAgMSAxMzozOTozMSAxOTk0ICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IEFkZCBzdXBwb3J0IGZvciBWU1RhIG1pY3JvLWtlcm5lbC4KLQkqIGNvbmZpZy92c3RhLm10LCBlbXVscGFyYW1zL3ZzdGEuc2g6IE5ldyBmaWxlcyBmb3IgVlNUYS4KLQotU2F0IEphbiAgMSAxMDo1MzozNSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2FvdXQuc2M6IFBhZCAudGV4dCB0byBEQVRBX0FMSUdOTUVOVCBpZiByZWxvY2F0aW5nOwotCW5lZWRlZCBmb3IgaTM4Nm1hY2guICAoU2hvdWxkIGJlIGEgbm8tb3Agb24gb3RoZXIgc3lzdGVtcy4pCi0KLQkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2ggKFNFR01FTlRfU0laRSk6IEZpeCBhZ2Fpbi4KLQkoUEFHRV9TSVpFKTogRG9uJ3QgZGVmaW5lOyBub3QgdXNlZC4KLQotRnJpIERlYyAzMSAxNjoxMjowNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55ICh5eWVycm9yKTogTWFrZSBhcmd1bWVudCBjb25zdCBjaGFyICosIGFuZCBhY3R1YWxseQotCXByaW50IGl0IG91dCByYXRoZXIgdGhhbiBhc3N1bWluZyBpdCBpcyBhIHN5bnRheCBlcnJvci4KLQkqIGxkbWlzYy5oOiBDaGFuZ2UgZGVjbGFyYXRpb24gb2YgeXllcnJvci4KLQkqIGxkZW11bC5jLCBsZHdyaXRlLmM6IEFkZCAvKkFSR1NVU0VEKi8gYXMgYXBwcm9wcmlhdGUuCi0KLUZyaSBEZWMgMzEgMTE6Mzc6MjggMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBlbXVscGFyYW1zL2kzODZtYWNoLnNoIChOT05QQUdFRF9URVhUX1NUQVJUX0FERFIpOiBEb24ndCBpbmNsdWRlCi0JZXhlYyBoZWFkZXIgb2Zmc2V0LCBzaW5jZSB0aGUgZXhlYyBoZWFkZXIgaXNuJ3QgbG9hZGVkLgotCShQQUdFX1NJWkUsIFNFR01FTlRfU0laRSk6IEFncmVlIHdpdGggYmZkL2kzODZtYWNoMy5jLgotCi1UaHUgRGVjIDMwIDEzOjAxOjQzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCUEgbWFqb3IgcmV3cml0ZSB0byBtb3ZlIHRoZSBidWxrIG9mIHRoZSBsaW5rZXIgaW50byBCRkQgc28gdGhhdAotCW1vcmUgZWZmaWNpZW50IGJhY2tlbmQgY29kZSBjYW4gYmUgd3JpdHRlbiBmb3Igc3BlY2lmaWMgb2JqZWN0Ci0JZmlsZXMuCi0JKiBsZGVycm9yLmMsIGxkZXJyb3IuaCwgbGRpbmRyLmMsIGxkaW5kci5oLCBsZHN5bS5jLCBsZHN5bS5oLAotCWxkd2Fybi5jLCBsZHdhcm4uaCwgcmVsYXguYywgcmVsYXguaDogUmVtb3ZlZC4KLQkqIGxkY3Rvci5jLCBsZGN0b3IuaDogQ29tcGxldGUgcmV3cml0ZS4KLQkqIGxkd3JpdGUuYywgbGR3cml0ZS5oOiBDb21wbGV0ZSByZXdyaXRlLgotCSogbGQuaCAoc3RyaXBfc3ltYm9sc190eXBlLCBzdHJpcF9zeW1ib2xzKTogUmVtb3ZlZC4gIFVzZQotCWxpbmtfaW5mby5zdHJpcCBpbnN0ZWFkLiAgQ2hhbmdlZCBhbGwgdXNlcy4KLQkoZGlzY2FyZF9sb2NhbHNfdHlwZSwgZGlzY2FyZF9sb2NhbHMpOiBSZW1vdmVkLiAgVXNlCi0JbGlua19pbmZvLmRpc2NhcmQgaW5zdGVhZC4gIENoYW5nZWQgYWxsIHVzZXMuCi0JKGxkX2NvbmZpZ190eXBlKTogUmVtb3ZlZCByZWxvY2F0ZWFibGVfb3V0cHV0IGZpZWxkOyB1c2UKLQlsaW5rX2luZm8ucmVsb2NhdGVhYmxlIGluc3RlYWQ7IGNoYW5nZWQgYWxsIHVzZXMuICBBZGRlZCBzdGF0cwotCWZpZWxkLgotCShzZXRfYXN5bWJvbF9jaGFpbiwgZ2V0X2FzeW1ib2xfY2hhaW4sIGdldF9sb2FkZXJfc3ltYm9sLAotCXNldF9sb2FkZXJfc3ltYm9sKTogUmVtb3ZlZC4KLQkqIGxkZXhwLmggKG5vZGVfY2xhc3MpOiBBZGRlZCBldHJlZV9yZWwuCi0JKGV0cmVlX3R5cGUpOiBBZGRlZCByZWwgZmllbGQuCi0JKiBsZGV4cC5jIChleHBfcHJpbnRfdG9rZW4pOiBCcmFja2V0ZWQgdGFibGUgaW5pdGlhbGl6YXRpb24uCi0JKGV4cF9yZWxvcCk6IE5ldyBmdW5jdGlvbi4KLQkoZm9sZF9uYW1lKTogVXNlIGxpbmtlciBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGxkc3ltIGZ1bmN0aW9ucy4KLQkoZXhwX2ZvbGRfdHJlZSk6IExpa2V3aXNlLiAgQWxzbywgaGFuZGxlIGV0cmVlX3JlbCBjYXNlLgotCShleHBfcHJpbnRfdHJlZSk6IEhhbmRsZSBldHJlZV9yZWwuCi0JKiBsZGdyYW0ueSAoc3RyaXBfc3ltYm9scywgZGlzY2FyZF9sb2NhbHMpOiBSZW1vdmVkLgotCShPUFRJT05fc3RhdHMsIE9QVElPTl9ub19rZWVwX21lbW9yeSk6IE5ldyB0b2tlbnMuICBIYW5kbGUgdGhlbS4KLQkoUkVMKTogTmV3IHRva2VuLiAgRG9lcyBub3QgYXBwZWFyIGluIGdyYW1tYXIsIGJ1dCBuZWVkZWQgZm9yCi0JZXhwcmVzc2lvbiBjb2RlLgotCShmaWxlKTogRG9uJ3QgY2FsbCBsYW5nX2ZpbmFsOyBpdCdzIGNhbGxlZCBieSBtYWluIGFueWhvdy4KLQkqIGxkbGV4Lmw6IEFjY2VwdCAtc3RhdHMgYW5kIC1uby1rZWVwLW1lbW9yeSBvcHRpb25zLgotCSogbGRsYW5nLmggKGZpbGxfdHlwZSk6IE1ha2UgdW5zaWduZWQgaW50LCBub3QgdW5zaWduZWQgc2hvcnQuCi0JKiBsZGxhbmcuYzogQ29uc2lzdGVudGx5IHVzZSBmaWxsX3R5cGUgZm9yIGZpbGwgYXJndW1lbnQuCi0JKGxhbmdfaW5pdF9zY3JpcHRfZmlsZSwgc2NyaXB0X2ZpbGUpOiBSZW1vdmVkLgotCShjcmVhdGVfb2JqZWN0X3N5bWJvbHMpOiBSZW1vdmVkLiAgVXNlCi0JbGlua19pbmZvLmNyZWF0ZV9vYmplY3Rfc3ltYm9sc19zZWN0aW9uIGluc3RlYWQuICBDaGFuZ2VkIGFsbAotCXVzZXMuCi0JKGxhbmdfYWRkX2tlZXBzeW1zX2ZpbGUpOiBSZW1vdmVkLgotCShsb29rdXBfbmFtZSk6IENhbGwgYmZkX2xpbmtfYWRkX3N5bWJvbHMgaW5zdGVhZCBvZgotCWxkbWFpbl9vcGVuX2ZpbGVfcmVhZF9zeW1ib2wuCi0JKHdpbGQpOiBEb24ndCBpdGVyYXRlIG92ZXIgc2NyaXB0X2ZpbGUuCi0JKG9wZW5fb3V0cHV0KTogQ3JlYXRlIGxpbmsgaGFzaCB0YWJsZS4KLQkobGFuZ19wbGFjZV91bmRlZmluZWRzKTogUmV3cm90ZS4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogSGFuZGxlIHJlbGF4aW5nIChkb2Vzbid0IHdvcmsgeWV0KS4KLQkobGFuZ19yZWxvY2F0ZV9nbG9iYWxzKTogUmVtb3ZlZC4KLQkobGFuZ19maW5pc2gpOiBVc2UgbGluayBoYXNoIHRhYmxlIHJhdGhlciB0aGFuIGxkc3ltIGZ1bmN0aW9ucy4KLQkobGFuZ19jb21tb24pOiBSZXdyb3RlLgotCShsYW5nX29uZV9jb21tb24pOiBOZXcgZnVuY3Rpb24uCi0JKGxkbGFuZ19hZGRfZmlsZSk6IEFkZCBmaWxlIHRvIGxpbmtfaW5mby5pbnB1dF9iZmRzIGxpc3QuICBTZXQKLQl1c3JkYXRhLgotCShjcmVhdGVfc3ltYm9sKTogUmVtb3ZlZC4KLQkobGFuZ19wcm9jZXNzKTogRG9uJ3QgY2FsbCBsYW5nX2luaXRfc2NyaXB0X2ZpbGUuICBDYWxsCi0JbGRjdG9yX2J1aWxkX3NldHMgcmF0aGVyIHRoYW4gZmluZF9jb25zdHJ1Y3RvcnMuICBEb24ndCBjYWxsCi0JbGFuZ19yZWxvY2F0ZV9nbG9iYWxzLgotCShsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mKTogUmV3cm90ZS4KLQkobGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZik6IFJld3JvdGUuCi0JKiBsZG1haW4uYyAoaGFkX3kpOiBSZW1vdmVkLgotCShscHJlZml4LCBscHJlZml4X2xlbik6IFJlbW92ZWQ7IHVzZSBsaW5rX2luZm8gZmllbGRzIGluc3RlYWQuCi0JQ2hhbmdlZCBhbGwgdXNlcy4KLQkobXVsdGlwbGVfZGVmX2NvdW50LCBjb21tb25zX3BlbmRpbmcsIHVuZGVmaW5lZF9nbG9iYWxfc3ltX2NvdW50LAotCXRvdGFsX3N5bWJvbHNfc2VlbiwgdG90YWxfZmlsZXNfc2Vlbik6IFJlbW92ZWQuCi0JKGxpbmtfY2FsbGJhY2tzLCBsaW5rX2luZm8pOiBOZXcgdmFyaWFibGVzLgotCShtYWluKTogSW5pdGlhbGl6ZSBsaW5rX2luZm8uICBEb24ndCBjYWxsIGluaXRfYmZkX2Vycm9yX3ZlY3RvciBvcgotCWxkc3ltX2luaXQuICBEb24ndCBzZXQgbm93IHVudXNlZCB2YXJpYWJsZXMuICBIYW5kbGUgLXN0YXRzLgotCShnZXRfZW11bGF0aW9uKTogUmVtb3ZlZCBvYnNvbGV0ZSBhbmQgbm9uZnVuY3Rpb25hbCBHTlU5NjAgY29kZS4KLQkoYWRkX3lzeW0pOiBSZXdyb3RlLgotCShyZWFkX2VudHJ5X3N5bWJvbHMsIHJlZml6ZSwgZW50ZXJfZ2xvYmFsX3JlZiwgZW50ZXJfZmlsZV9zeW1ib2xzLAotCXNlYXJjaF9saWJyYXJ5LCBnbnU5NjBfY2hlY2tfZm9ybWF0LCBkZWNvZGVfbGlicmFyeV9zdWJmaWxlLAotCWxpbmVhcl9saWJyYXJ5LCBzeW1kZWZfbGlicmFyeSwgY2xlYXJfc3ltcywgc3ViZmlsZV93YW50ZWRfcCk6Ci0JUmVtb3ZlZC4KLQkoYWRkX2tlZXBzeW1zX2ZpbGUsIGFkZF9hcmNoaXZlX2VsZW1lbnQsIG11bHRpcGxlX2RlZmluaXRpb24sCi0JbXVsdGlwbGVfY29tbW9uLCBhZGRfdG9fc2V0LCB3YXJuaW5nX2NhbGxiYWNrLCB1bmRlZmluZWRfc3ltYm9sLAotCXJlbG9jX292ZXJmbG93LCByZWxvY19kYW5nZXJvdXMsIHVuYXR0YWNoZWRfcmVsb2MsIG5vdGljZV95c3ltKToKLQlOZXcgZnVuY3Rpb25zLgotCSogbGRtaXNjLmMgKHZmaW5mbyk6IEFjY2VwdCBhIHN0cmluZyBmb3IgJVQsIG5vdCBhIHN5bWJvbC4gIERvbid0Ci0JcmVxdWlyZSBzeW1ib2xzIGZvciAlQzsgbG9vayB0aGVtIHVwIGluc3RlYWQuCi0JKiBlbXVsdGVtcGwvaHBwYW9zZi5lbTogUGFzcyBsaW5rX2luZm8gdG8KLQlocHBhX2xvb2tfZm9yX3N0dWJzX2luX3NlY3Rpb24uCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IFJlbW92ZWQgbGRlcnJvci5jLCBsZGluZHIuYywgbGRzeW0uYywgbGR3YXJuLmMsIGFuZAotCXJlbGF4LmMuCi0JKEhGSUxFUyk6IFJlbW92ZWQgbGRlcnJvci5oLCBsZGluZHIuaCwgbGRzeW0uaCwgbGR3YXJuLmgsIGFuZAotCXJlbGF4LmguCi0JKEVNVUxBVElPTl9PRklMRVMpOiBEZXBlbmQgb24gYmZkbGluay5oLCBsZG1haW4uaCwgbGRleHAuaCwKLQlsZGxhbmcuaCBhbmQgbGRjdG9yLmguCi0KLQkqIE1ha2VmaWxlLmluIChsZGxleC5jKTogRG9uJ3QgZGVwZW5kIG9uIGxkZ3JhbS5oLiAgUmVtb3ZlCi0JZGVjbGFyYXRpb25zIG9mIGZyZWUgYW5kIG1hbGxvYyBmcm9tIGZsZXggb3V0cHV0LiAgQ2hhbmdlIG1hbGxvYwotCXRvIGxkbWFsbG9jIGluIGZsZXggb3V0cHV0LgotCi1UaHUgRGVjIDE2IDIxOjE5OjU3IDE5OTMgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBsZG1haW4uYyAobHByZWZpeCk6IENoYW5nZSBkZWZhdWx0IGZyb20gYSBjaGFyIHRvIGEgc3RyaW5nCi0Jd2l0aCBvbmx5IG9uZSBjaGFyYWN0ZXIuCi0JKGxwcmVmaXhfbGVuKTogU2V0IGRlZmF1bHQgdG8gb25lLgotCi0JKiBsZG1haW4uaCAobHByZWZpeF9sZW4pOiBEZWNsYXJlLgotCi0JKiBsZHN5bS5jICh3cml0ZV9maWxlX2xvY2Fscyk6IFVzZSBzdHJuY21wIHJhdGhlciB0aGFuIGEgY2hhcmFjdGVyCi0JY29tcGFyaXNvbiBmb3IgbHByZWZpeC4KLQotCSogZW11bHRtcGwvbTg4a2Jjcy5lbSAoYmVmb3JlX3BhcnNlKTogU2V0IGxwcmVmaXggYW5kIGxwcmVmaXhfbGVuCi0JY29ycmVjdGx5LgotCi0JKiBlbXVsdG1wbC9ocHBhb3NmLmVtOiBJbmNsdWRlIGxkZXhwLmguCi0JKGJlZm9yZV9wYXJzZSk6IFNldCBscHJlZml4IGFuZCBscHJlZml4X2xlbiBjb3JyZWN0bHkuCi0KLVR1ZSBEZWMgMTQgMTc6MTk6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5oOiBEb24ndCBkZWNsYXJlIHl5d3JhcCBpZiBpdCBpcyBhIG1hY3JvLgotCSogbGRsZXgubDogSW5jbHVkZSBzeXNkZXAuaC4KLQkqIGxkbGFuZy5jIChsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIsCi0JbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQpOiBGb3Jnb3QgdG8gdXNlIFBBUkFNUy4KLQotTW9uIERlYyAxMyAxNDozMDowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCAuUEhPTlkgdGFyZ2V0cyB3aGVyZSBhcHByb3ByaWF0ZS4gIEFkZGVkIHNvbWUKLQljb21tZW50cy4gIEFsc286Ci0JKGdjY2xpYmRpciwgdmVyc2lvbik6IFJlbW92ZWQgdW51c2VkIHZhcmlhYmxlcy4KLQkoREVQKTogTmV3IHZhcmlhYmxlLCBzZXQgdG8gbWtkZXAuCi0JKEFMTF9DRkxBR1MpOiBOZXcgdmFyaWFibGUuICBVc2VkIGluIC5jLm8gdGFyZ2V0LgotCShDRklMRVMsIEhGSUxFUywgR0VORVJBVEVEX0NGSUxFUywgR0VORVJBVEVEX0hGSUxFUyk6IE5ldwotCXZhcmlhYmxlcy4KLQkoSEVBREVSUywgTUFOU09VUkNFUywgTERDU09VUkNFUywgR0VORVJBVEVEX1NPVVJDRVMsCi0JR0VORVJBVEVEX0hFQURFUlMsIExEU09VUkNFUywgQkZEX1NPVVJDRVMsIFNPVVJDRVMpOiBSZW1vdmVkCi0JbW9zdGx5IG9ic29sZXRlIHZhcmlhYmxlcy4gIEFkanVzdGVkIHJlbWFpbmluZyB1c2VzLgotCShERUZfRU1VTCk6IFJlbW92ZWQgdmFyaWFibGUuCi0JKGxkbWFpbi5vKTogSGFuZGxlIHVuZGVmaW5lZCBFTVVMIGVycm9yIGNvcnJlY3RseS4KLQkobGRlbXVsLWxpc3QuaCk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzIHJhdGhlciB0aGFuIE1ha2VmaWxlLgotCUNyZWF0ZSB2aWEgdGVtcG9yYXJ5IGZpbGUuCi0JKHZlcjk2MC5jLCByb2xsLCBtYWtlKTogUmVtb3ZlZCBvYnNvbGV0ZSB0YXJnZXRzLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCwgZGVwLCBkZXAtaW4pOiBOZXcgdGFyZ2V0cy4gIFVzZWQgdG8gcmVidWlsZAotCWRlcGVuZGVuY2llcy4KLQkqIGRlcC1pbi5zZWQ6IE5ldyBmaWxlLCB1c2VkIHdoZW4gcmVidWlsZGluZyBkZXBlbmRlbmNpZXMuCi0KLVNhdCBEZWMgMTEgMTQ6NDM6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBkZW5lYi5jeWdudXMuY29tKQotCi0JTWFkZSBtYW55IGNoYW5nZXMgdG8gZWxpbWluYXRlIGdjYyB3YXJuaW5ncy4gIE1hZGUgdmFyaW91cwotCWNvc21ldGljIGNoYW5nZXMsIGRlY2xhcmVkIHZhcmlvdXMgdGhpbmdzIGluIGhlYWRlciBmaWxlcywgcmVtb3ZlZAotCXZhcmlvdXMgZXh0ZXJuIGRlY2xhcmF0aW9ucyBmcm9tIC5jIGZpbGVzLiAgTm8gc3Vic3RhbnRpdmUKLQljaGFuZ2VzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogSWZkZWYgb3V0IGZpbmFsIGNhbGwgdG8KLQlsYW5nX3NpemVfc2VjdGlvbnMgYWdhaW4gKHJldmVydGluZyBjaGFuZ2Ugb2YgTm92ZSAyKSwgc2luY2UgaXQKLQlicmVha3MgdGhlIFN1bjQgbGlua2VyLgotCi1UaHUgRGVjICAyIDE2OjMxOjQ3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW5ldHdhcmUqKTogTmV3IHRhcmdldDsgdXNlIGFscGhhLgotCi1XZWQgRGVjICAxIDE0OjA0OjIwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IEdyb3VwIHRhcmdldHMgYnkgQ1BVLiAgTWVyZ2Ugc29tZSBtNjhrIHRhcmdldAotCWVudHJpZXMgd2l0aCBkaWZmZXJlbnQgQ1BVIHNwZWNzIHRoYXQgdXNlIHRoZSBzYW1lIGxkX3RhcmdldAotCXZhbHVlcy4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3BhcmMqLSotY29mZi4KLQkqIGNvbmZpZy9jb2ZmLXNwYXJjLm10LCBlbXVscGFyYW1zL2NvZmZfc3BhcmMuc2g6IE5ldyBmaWxlcy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9jb2ZmX3NwYXJjLm8uCi0JKGVtX2NvZmZfc3BhcmMuYyk6IEFkZCBkZXBlbmRlbmNpZXMgYW5kIGJ1aWxkIHJ1bGVzLgotCi0JKiBsZG1pc2MuYyAoZXJybm8sIHN5c19uZXJyLCBzeXNfZXJybGlzdCk6IERvbid0IGRlY2xhcmUuCi0KLVdlZCBEZWMgIDEgMTI6MTk6NTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSAoT1BUSU9OX2NhbGxfc2hhcmVkLCBPUFRJT05fbm9uX3NoYXJlZCwgT1BUSU9OX092YWwpOgotCU5ldyB0b2tlbnMuCi0JKGNvbW1hbmRfbGluZV9vcHRpb24pOiBBY2NlcHQgYW5kIGlnbm9yZSB0aGVtIChmb3Igbm93KS4KLQkqIGxkbGV4LmwgKDxDT01NQU5EPik6IEhhbmRsZSAtbm9uX3NoYXJlZCwgLWNhbGxfc2hhcmVkLCBhbmQgLU9uCi0Jd2hlcmUgbiBpcyBhIG51bWJlci4KLQotTW9uIE5vdiAyMiAxNDoxNDoyOSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChzdWJmaWxlX3dhbnRlZF9wKTogSWYgbWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2hpY2ggaXMKLQlub3QgaW4gYmZkX2NvbV9zZWN0aW9uLCBjcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIEJGRCBzbyB0aGF0IGl0Ci0JY2FuIGJlIHBsYWNlZCBpbiB0aGUgcmlnaHQgb3V0cHV0IHNlY3Rpb24uCi0KLUZyaSBOb3YgMTkgMTQ6MTI6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMqLXNnaS1pcml4NSopOiBOZXcgdGFyZ2V0LiAgVXNlIG1pcHNiLWVsZjMyLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcHNiLnNoIChEQVRBX0FERFIpOiBEZWZpbmUuCi0JKE9USEVSX1JFQURPTkxZX1NFQ1RJT05TKTogRGVmaW5lIGZvciAucmVnaW5mby4KLQkoRVhFQ1VUQUJMRV9TWU1CT0xTKTogRGVmaW5lIGZvciBfRFlOQU1JQ19MSU5LLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgRVhFQ1VUQUJMRV9TWU1CT0xTIHdoZW4gbm90IHJlbG9jYXRpbmcuCi0JTW92ZSBPVEhFUl9SRUFET05MWV9TRUNUSU9OUyBhZnRlciBhbGwgdGhlIG90aGVyIHJlYWRvbmx5Ci0Jc2VjdGlvbnMuICBEb24ndCB1c2UgREFUQV9BRERSIHR3aWNlLgotCi0JKiBsZG1haW4uYyAoZW50ZXJfZmlsZV9zeW1ib2xzKTogUmVtb3ZlZCBkdXBsaWNhdGUgdGVzdHMgb2YgcC4gIElmCi0JcCBpcyBpbiBhIGNvbW1vbiBzZWN0aW9uLCBtYWtlIHN1cmUgdGhlIEJGRCBoYXMgYSBzZWN0aW9uIG9mIHRoYXQKLQluYW1lLgotCi0JKiBsZGxhbmcuYyAobGFuZ19jb21tb24pOiBBZGQgbmV3bGluZSB0byBlcnJvciBtZXNzYWdlLgotCi1UaHUgTm92IDExIDE1OjU0OjQxIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogZW11bHBhcmFtcy9tNjhrbHlueC5zaCAoU0NSSVBUX05BTUUpOiBEZWZpbmUgdG8gdXNlIGEKLQlMeW54LXNwZWNpZmljIHNjcmlwdCBpbnN0ZWFkIG9mIG02OGtjb2ZmLgotCShPVVRQVVRfRk9STUFUKTogRGVmaW5lIGFzICJjb2ZmLW02OGstbHlueCIuCi0JKEVOVFJZKTogRGVmaW5lIGFzIF9fbWFpbi4KLQkoVEVYVF9TVEFSVF9BRERSKTogRGVmaW5lIGFzIDAuCi0JKFBBR0VfU0laRSk6IERlZmluZSBhcyAweDEwMDAuCi0JKiBlbXVscGFyYW1zL2kzODZseW54LnNoLCBlbXVscGFyYW1zL3NwYXJjbHlueC5zaDogRml4IGNvbW1lbnQuCi0JKiBzY3JpcHR0ZW1wbC9tNjhrbHlueC5zYzogTmV3IGZpbGUuCi0KLU1vbiBOb3YgIDggMTI6MDA6MTYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbik6IElnbm9yZSAtbWlwczEsIC1taXBzMiBhbmQgLW1pcHMzCi0JYXJndW1lbnRzIHJhdGhlciB0aGFuIHRyZWF0aW5nIHRoZW0gYXMgZW11bGF0aW9uIG5hbWVzLgotCi1GcmkgTm92ICA1IDA5OjAyOjUyIDE5OTMgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAYmx1ZXMuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBTdXBwb3J0IHg4NiB1bml4d2FyZSBhbmQgbmV0d2FyZSBwbHVzIGdlbmVyaWMgbmV0d2FyZS4KLQotRnJpIE5vdiAgNSAyMTo0Nzo1NSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGVtdWxwYXJhbXMvaTM4Nm1hY2guc2ggKFRFWFRfU1RBUlRfQUREUiwgTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSKToKLQlDb3JyZWN0IHZhbHVlcyAoPykuCi0KLVdlZCBOb3YgIDMgMTU6MTA6MTUgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJvdmVyLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBEb24ndCBkZWxldGUgZHZpIG9yIGluZm8gZmlsZXMuCi0JKGxkLmluZm8pOiBVcGRhdGUgZGVwZW5kZW5jeSBsaXN0LgotCShsZC5kdmkpOiBEaXR0by4gIEV4dGVuZCBURVhJTlBVVFMgdG8gZ2V0IGJmZHN1bW0udGV4aS4KLQotV2VkIE5vdiAgMyAxMjowNzozOSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9vdXRwdXQpOiBUYWtlIG5ldyBhcmcsIEZST01fU0NSSVBULgotCVNldCBvdXRwdXRfZmlsZW5hbWUgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBub2RlLgotCShvcGVuX291dHB1dCk6IERvbid0IHNldCBvdXRwdXRfZmlsZW5hbWUuCi0JKGxhbmdfZmluYWwpOiBDcmVhdGUgdGhlIG5ldyBub2RlIGhlcmUuCi0JKiBsZGxhbmcuYywgbGRsYW5nLmgsIGxkZ3JhbS55LCBtcmkuYzogcGFzcyBGUk9NX1NDUklQVC4KLQotVHVlIE5vdiAgMiAxNTo0NTo1MSAxOTkzICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotIAlGcm9tIFBldGUgSG9vZ2VuYm9vbSAoaG9vZ2VuQGNzLnV0YWguZWR1KToKLQotCSogc2NyaXB0dGVtcGwvaHBwYW9zZi5zYzogKF9fX3N0YWNrX3plcm8sIGV0ZXh0LCBfZXRleHQsCi0JZWRhdGEsIF9lZGF0YSwgZW5kKTogQWRkIGRlZmluaXRpb25zIG9mIHRoZXNlIHN5bWJvbHMuCi0JKF9fZW5kKTogIFJlbW92ZSBkZWZpbml0aW9uIG9mIHRoaXMgc3ltYm9sLgotCShfX2RhdGFfc3RhcnQpOiBNb3ZlIGRlZmluaXRpb24gb2YgdGhpcyBzeW1ib2wuCi0KLQkqIGVtdWx0ZW1wbC9ocHBhb3NmLmVtOiAgVmFyaW91cyBmaXhlcyBhbmQgc3VwcG9ydCBmb3IgbGlua2VyIHN0dWIKLQlnZW5lcmF0aW9uLgotCShocHBhb3NmX2ZpbmlzaCwgaHBwYW9zZl9zZWFyY2hfZm9yX3BhZGRpbmdfc3RhdGVtZW50cywKLQlocHBhb3NmX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKTogTmV3IGZ1bmN0aW9ucyBpbgotCXN1cHBvcnQgb2YgbGlua2VyIHN0dWIgZ2VuZXJhdGlvbi4KLQkobGRfaHBwYW9zZl9lbXVsYXRpb24pOiAgUmVkZWZpbmUgdG8gaW5jbHVkZSBuZXcKLQllbXVsYXRpb24tc3BlY2lmaWMgcm91dGluZXMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBSZS1lbmFibGUgbGFzdCBjYWxsIGxhbmdfc2l6ZV9zZWN0aW9ucy4KLQlQYXNzIGFic19vdXRwdXRfc2VjdGlvbiByYXRoZXIgdGhhbiBOVUxMIHRvIGF2b2lkIGludmFsaWRhdGluZwotCWFic29sdXRlIHN5bWJvbHMuCi0KLVRodSBPY3QgMjggMjE6MTY6NDIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGQgZW1faTM4Nm1hY2guby4KLQkoZW1faTM4Nm1hY2guYyk6IE5ldyBydWxlLgotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotbWFjaCopOiBOZXcgY2FzZS4KLQkqIGNvbmZpZy9pMzg2LW1hY2gubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9pMzg2bWFjaC5zaDogTmV3IGZpbGUuCi0KLUZyaSBPY3QgMjkgMTQ6NTU6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBsZC5oIChmbGFnX2lzXyopOiBSZW1vdmVkIG1hY3Jvcy4KLQkqIGxkbWFpbi5jIChlbnRlcl9nbG9iYWxfcmVmKSwgbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOgotCUNvbnNpc3RlbnRseSBjaGVjayB0aGUgQkZEIHN5bWJvbCBmbGFncyBkaXJlY3RseSwgcmF0aGVyIHRoYW4KLQl1c2luZyBmaWxlX2lzXyogbWFjcm9zLgotCi1UaHUgT2N0IDI4IDE5OjA4OjQyIDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChzcGFyYyotKi1seW54b3MqKTogTmV3IHRhcmdldC4KLQkqIE1ha2VmaWxlLmluOiBBZGQgcnVsZSBmb3IgZW1fc3BhcmNseW54LmMuCi0JKEFMTF9FTVVMQVRJT05TKTogQWRkIEx5bnggZW11bGF0aW9ucy4KLQkqIGNvbmZpZy9zcGFyYy1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvc3BhcmNseW54LnNoOiBOZXcgZmlsZS4KLQkqIHNjcmlwdHRlbXBsL3NwYXJjY29mZi5zYzogTmV3IGZpbGUuCi0KLVRodSBPY3QgMjggMTM6NTA6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY3kgZm9yICQoRU1VTEFUSU9OX09GSUxFUykuCi0KLU1vbiBPY3QgMjUgMTY6MDk6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiByZWxheC5jICh3cml0ZV9yZWxheCk6IENoZWNrIHJldHVybiB2YWx1ZSBvZiBiZmRfc2VjbGV0X2xpbmsuCi0KLU1vbiBPY3QgMjUgMDk6MzE6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZSk6IE5ldyB2YXJpYWJsZS4KLQkob3Blbl9vdXRwdXQpOiBTZXQgaXQgYWZ0ZXIgYmZkIG9wZW4gc3VjY2VlZHMuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogVGVzdCBpdC4KLQotCUNoYW5nZXMgZnJvbSBQZXRlciBIb29nZW5ib29tLCBob29nZW5AY3MudXRhaC5lZHU6Ci0KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogU2V0IHRoZSBCU0ZfRklMRSBmbGFnIGZvciBvYmplY3QKLQlzeW1ib2xzLgotCi0JKiBsZGVtdWwuYzogU3VwcG9ydCB3YXMgYWRkZWQgdG8gYWxsb3cgZW11bGF0aW9uLXNwZWNpZmljCi0JcHJvY2Vzc2luZyB0byBvY2N1ci4gIFRoaXMgc3VwcG9ydCB3YXMgYWRkZWQgcHJpbWFyaWx5IGZvciBsaW5rZXIKLQlzdHViIGdlbmVyYXRpb24gaW4gdGhlIGVsZjMyLWhwcGEgZ2xkLgotCShsZGVtdWxfZmluaXNoLCBsZGVtdWxfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMpOiAgTmV3Ci0JZnVuY3Rpb25zLgotCSogbGRlbXVsLmg6IFN1cHBvcnQgd2FzIGFkZGVkIHRvIGFsbG93IGVtdWxhdGlvbi1zcGVjaWZpYwotCXByb2Nlc3NpbmcgdG8gb2NjdXIuIChBcyBkZXNjcmliZWQgYWJvdmUuKSAgQWRkZWQgZmluaXNoIGFuZAotCWNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIGZpZWxkcyB0bwotCWxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBzdHJ1Y3R1cmUuCi0JKiBsZGxhbmcuYzogQWRkIGNhbGxzIHRvIGVtdWxhdGlvbi1zcGVjaWZpYyByb3V0aW5lcy4KLQkobGFuZ19wcm9jZXNzKTogIEFkZCBjYWxsIHRvCi0JbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIGZ1bmN0aW9uLgotCShsYW5nX3Byb2Nlc3MpOiAgQWRkIGNhbGwgdG8gYSBlbXVsYXRpb24tc3BlY2lmaWMgcm91dGluZSAoYW5kCi0Jc29tZSBwcm9jZXNzaW5nIGFmdGVyIHRoZSBjYWxsKS4KLQotRnJpIE9jdCAyMiAyMDo1NDoxMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b29AcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogbWlwcyotIGluc3RlYWQgb2YgbWlwcy0sIG1pcHMqZWwgY2hhbmdlcwotCi1UdWUgT2N0IDE5IDE1OjQ2OjI4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChhbHBoYS0qLW9zZiopOiBOZXcgdGFyZ2V0OyB1c2UgYWxwaGEubXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9hbHBoYS5vLgotCShlbV9hbHBoYS5jKTogTmV3IHRhcmdldDsgdXNlIGFscGhhLnNoIGFuZCBhbHBoYS5zYy4KLQkqIGNvbmZpZy9hbHBoYW9zZi5taCAoTkFUSVZFX0xJQl9ESVJTLCBIT1NUSU5HX0NSVDApOiBEZWZpbmUuCi0JKiBjb25maWcvYWxwaGEubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9hbHBoYS5zaDogTmV3IGZpbGUuCi0JKiBzY3JpcHR0ZW1wbC9hbHBoYS5zYzogTmV3IGZpbGUuCi0KLUZyaSBPY3QgMTUgMDI6MjA6MDQgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfc2l6ZV9zZWN0aW9ucywgbGFuZ19jb21tb24pOiBBTElHTl9OIGNhbid0IGhhbmRsZQotCXR5cGVzIG9mIGRpZmZlcmVudCBzaXplcyAoZWc6IDY0IGFuZCAzMiBiaXRzKSwgc28gY29lcmNlLgotCSogbGQuaCAoQUxJR05fTik6IEFkZCB3YXJuaW5nIGFib3V0IHVzYWdlLgotCi1XZWQgT2N0IDEzIDE2OjAyOjM5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGVudGVyX2dsb2JhbF9yZWYpOiBKdXN0IGlnbm9yZSBhbnkgd2VhayBzeW1ib2wgZm9yCi0Jd2hpY2ggd2UgYWxyZWFkeSBoYXZlIGEgZGVmaW5pdGlvbiwgcmF0aGVyIHRoYW4gY2hlY2tpbmcgaW4KLQlzZXZlcmFsIGRpZmZlcmVudCBwbGFjZXMgd2hldGhlciB0aGUgc3ltYm9sIGlzIHdlYWsuCi0KLVR1ZSBPY3QgMTIgMTc6MzA6NTEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtKi1lbGYqKTogTmV3IHRhcmdldDsgdXNlIG1pcHNiLWVsZjMyLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBPbmx5IHVzZSBPVEhFUl9SRUFET05MWV9TRUNUSU9OUyBhbmQKLQlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgaWYgcmVsb2NhdGluZy4gIFNoZWxsIHZhcmlhYmxlcyBhcmUgbm90Ci0JZXhwYW5kZWQgd2l0aGluIHRoZW0uCi0JKiBjb25maWcvbWlwc2ItZWxmMzIubXQ6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9lbGYzMm1pcGIuc2g6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKGVtX2VsZjMybWlwYi5jKTogTmV3IHRhcmdldC4KLQotVGh1IFNlcCAzMCAxNzowMDozNiAxOTkzICBSb2IgU2F2b3llICAocm9iQGRhcmtzdGFyLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55OiBJbiBpbnB1dF9saXN0LCBjaGFuZ2UgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSB0bwotCWxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtIHNvIG9iamVjdHMgYnJvdWdodCBpbiB1c2luZwotCUlOUFVUKCkgZG8gYSBwYXRoIGxvb2t1cC4KLQotVHVlIFNlcCAyOCAxMzozMToyMyAxOTkzICBTdGFuIFNoZWJzICAoc2hlYnNAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hhbmdlIEx5bnggbGRfdGFyZ2V0IHRvIGJlIHtpMzg2LG02OGt9LWx5bngKLQlpbnN0ZWFkIG9mIHtpMzg2LG02OGt9LWNvZmYuCi0JKiBNYWtlZmlsZS5pbiAoZW1faTM4Nmx5bnguYywgZW1fbTY4a2x5bnguYyk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlnL2kzODYtbHlueC5tdDogTmV3IGZpbGUuCi0JKiBjb25maWcvbTY4ay1seW54Lm10OiBOZXcgZmlsZS4KLQkqIGVtdWxwYXJhbXMvaTM4Nmx5bnguc2g6IE5ldyBmaWxlLgotCSogZW11bHBhcmFtcy9tNjhrbHlueC5zaDogTmV3IGZpbGUuCi0KLQkqIHNjcmlwdHRlbXBsL2kzODZjb2ZmLnNjOiBNYWtlIEVOVFJZIGdldCBpdHMgdmFsdWUgZnJvbSAke0VOVFJZfSwKLQlidXQgZGVmYXVsdGluZyB0byBfc3RhcnQuCi0KLQkqIGxkZW11bC5jLCBsZGZpbGUuYywgbGRsYW5nLmMsIGxkbWFpbi5jLCBsZG1pc2MuYywgbGRtaXNjLmgsCi0JbGRzeW0uYywgbGR3YXJuLmM6IFJlbmFtZSBpbmZvIHRvIGluZm9fbXNnLCB0byBhdm9pZCBjb25mbGljdCB3aXRoCi0JTHlueE9TIGxpYmMuCi0KLVRodSBTZXAgMjMgMTQ6NTE6MDMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvc29sYXJpczIubWg6IE5ldyBmaWxlLiAgRGVmaW5lIEhPU1RJTkdfQ1JUMCBhbmQKLQlIT1NUSU5HX0xJQlMgZm9yIHRlc3RpbmcuCi0KLUZyaSBTZXAgMTcgMTc6NTI6MjQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRmluaXNoIHVwIHN1cHBvcnQgZm9yIGkzODYtc3lzdjQgKHdpdGhvdXQgc2hhcmVkIGxpYnJhcmllcyk6Ci0JKiBsZC5oIChmbGFnX2lzX3dlYWspOiBEZWZpbmUuCi0JKiBsZGxhbmcuYyAocHJpbnRfc3ltYm9sKTogTWVudGlvbiB3aGV0aGVyIHN5bWJvbCBpcyB3ZWFrLgotCShwcmludF9pbnB1dF9zZWN0aW9uKTogUHJpbnQgd2VhayBzeW1ib2xzIGFzIGdsb2JhbHMuCi0JKiBsZG1haW4uYyAocmVmaXplKTogRG8gbm90IHplcm8gb3V0IEJTRl9XRUFLIGZsYWcuCi0JKGVudGVyX2dsb2JhbF9yZWYpOiBEbyBub3Qgd2FybiBpZiBhIHdlYWsgc3ltYm9sIHJlZGVmaW5lcyBhCi0JZ2xvYmFsIHN5bWJvbC4gIERvIG5vdCBsZXQgYSB3ZWFrIHN5bWJvbCByZWRlZmluZSBhIGNvbW1vbiBzeW1ib2wuCi0JKGVudGVyX2ZpbGVfc3ltYm9scyk6IFRyZWF0IHdlYWsgc3ltYm9scyBhcyBnbG9iYWwgc3ltYm9scy4KLQkoc3ViZmlsZV93YW50ZWRfcCk6IERvIG5vdCBwdWxsIGluIGFuIG9iamVjdCBmaWxlIGZyb20gYSBhcmNoaXZlCi0JanVzdCB0byByZXNvbHZlIGFuIHVuZGVmaW5lZCB3ZWFrIHN5bWJvbC4KLQkqIGxkbWlzYy5jICh2ZmluZm8pOiBEb24ndCBuZWVkbGVzc2x5IG1hbGxvYyBzcGFjZSBhZnRlciBhIGZhdGFsCi0JZXJyb3I7IHRoZSBlcnJvciBtaWdodCBiZSB0aGF0IG1hbGxvYyBoYXMgcnVuIG91dCBvZiBzcGFjZS4KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogVHJlYXQgd2VhayBzeW1ib2xzIGFzIGdsb2JhbC4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXN5c3Y0KiwgaVszNF04Ni0qLWVsZiopOiBOZXcgdGFyZ2V0czsKLQl1c2UgaTM4Ni1lbGYuCi0JKiBjb25maWcvaTM4NnY0Lm1oOiBOZXcgZmlsZTsgc2V0IE5BVElWRV9MSUJfRElSUyB0byAvdXNyL2Njcy9saWIuCi0JKiBjb25maWcvaTM4Ni1lbGYubXQ6IE5ldyBmaWxlOyBzZXQgRU1VTCB0byBlbGZfaTM4Ni4KLQkqIGVtdWxwYXJhbXMvZWxmX2kzODYuc2g6IE5ldyBmaWxlLgotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBVc2UgJHtOT1B9IGFzIGZpbGxlciAoZGVmYXVsdHMgdG8gMCkuCi0JKiBNYWtlZmlsZS5pbiAoTkFUSVZFX0xJQl9ESVJTKTogRGVmaW5lIHRvIGJlIGVtcHR5LgotCShBTExfRU1VTEFUSU9OUyk6IEFkZCBlbV9lbGZfaTM4Ni5vLgotCShHRU5TQ1JJUFRTKTogUGFzcyBOQVRJVkVfTElCX0RJUlMgYXMgc2l4dGggYXJndW1lbnQuCi0JKGVtX2VsZl9pMzg2LmMpOiBOZXcgdGFyZ2V0LCBsaWtlIG90aGVyIGVtXyouYyB0YXJnZXRzLgotCSgkKExEX1BST0cpKTogUGFzcyAkKENGTEFHUykgdG8gJChDQykuCi0JKiBnZW5zY3JpcHRzLnNoOiBBY2NlcHQgTkFUSVZFX0xJQl9ESVJTIGFzIHNpeHRoIGFyZ3VtZW50LiAgSWYKLQlub25lbXB0eSwgYW5kIGNvbmZpZ3VyZWQgZm9yIG5hdGl2ZSwgYWRkIGl0IHRvIExJQl9QQVRILgotCi1GcmkgU2VwIDE3IDEzOjA3OjM5IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwve2g4MzAwLnNjLGg4NTAwLnNjLGkzODZjb2ZmLnNjLG02OGtjb2ZmLnNjLHNoLnNjfToKLQlBZGRlZCBzdGF0ZW1lbnRzIHRvIHBhc3Mgc3RhYiBhbmQgc3RhYnN0ciBzZWN0aW9ucyB0aHJvdWdoIGFuZAotCW1hcmsgdGhlbSBhcyBOT0xPQUQsIHdoaWNoIG1ha2VzIEdEQiBoYXBwaWVyLgotCi1XZWQgU2VwIDE1IDE2OjAyOjI5IDE5OTMgIFN0YW4gU2hlYnMgIChzaGVic0BydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgbTY4ay1seW54LWx5bnhvcyBjb25maWcuCi0KLQkqIE1ha2VmaWxlLmluOiBVc2UgJChTSEVMTCkgdG8gcnVuIGdlbnNjcmlwdHMuc2guCi0KLVN1biBTZXAgMTIgMTY6MDQ6NDAgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjeWdudXMuY29tKQotCi0JKiBjb25maWcvY29mZi1oODMwMC5tdDogQWRkIEVNVUw9aDgzMDBoLgotCi0JKiBsZG1haW4uYyAobWFpbik6IENhbGwgc2V0X3NjcmlwdHNfZGlyIGFmdGVyIGFyZ3YgaGFzIGJlZW4gcHJvY2Vzc2VkLgotCi1GcmkgU2VwIDEwIDA5OjM2OjI5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIENYWCBiYWNrIHRvIGcrKy4KLQotRnJpIFNlcCAxMCAwOTozNDoyOSAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRml4ZWQgUlVOVEVTVCogQ1hYIENYWEZMQUdTIG1hY3JvcyBhbmQgY2hlY2sgcnVsZS4KLQotRnJpIFNlcCAxMCAwNzoyNjo1NyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChUQUdTKTogVXNlIHNoZWxsIHdpbGRjYXJkcy4KLQotVHVlIFNlcCAgNyAxODowNDo1NCAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIGFkZCBURVhJTlBVVFMgdmFyaWFibGUgYW5kIHVzZSBpdCBpbiBsZC5kdmkgdGFyZ2V0Ci0KLUZyaSBTZXAgIDMgMTY6NDY6NDEgMTk5MyAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogbGQudGV4aW5mbzogcmUtZW5hYmxlIGluY2x1ZGVkIGNvbmZpZyBmaWxlOyBjb25kaXRpb25hbGl6ZSBkb2MKLQlmb3IgLW9mb3JtYXQgdG8gaW50ZXJhY3QgcHJvcGVybHkgd2l0aCBTaW5nbGVGb3JtYXQgZG9jIGNvbmZpZwotCXZhcjsgcmVuYW1lIEB1cC9AZG93biB0byBAcmFpc2VzZWN0aW9ucy9AbG93ZXJzZWN0aW9ucy4KLQotV2VkIEF1ZyAyNSAxNjoyOTo1NiAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXplIG04ODExMC4KLQotVHVlIEF1ZyAyNCAxODo0OTo0MCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQlGcm9tIFBldGVyIEhvb2dlbmJvb20gPGhvb2dlbkBzaGFmZXIuY3MudXRhaC5lZHU+OgotCSogZW11bHRlbXBsL2hwcGFvc2YuZW0gKGxkX2hwcGFvc2ZfZW11bGF0aW9uKTogQ29ycmVjdCBuYW1lIGZvciBQQQotCUVMRiBlbXVsYXRpb24gaXMgImVsZjMyLWhwcGEiIG5vdCAiZWxmLWJpZyIuCi0JKGhwcGFvc2ZfYmVmb3JlX3BhcnNlKTogUmVtb3ZlIHVubmVlZGVkIHByb2Nlc3Npbmcgb2YgZW52aXJvbm1lbnQKLQl2YXJpYWJsZXMuCi0JKiBzY3JpcHR0ZW1wbC9ocHBhb3NmLnNjOiBJbmNsdWRlIC5ocHBhX2xpbmtlcl9zdHVicyBzZWN0aW9ucyBpbgotCS50ZXh0IHNlZ21lbnQgb2Ygb3V0cHV0IGZpbGUuCi0JKiBlbXVscGFyYW1zL2hwcGFvc2Yuc2ggKE9VVFBVVF9GT1JNQVQpOiBVc2UgZWxmMzItaHBwYS4KLQotVHVlIEF1ZyAyNCAxNjoxNzowMCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAc2VuZGFpLmN5Z251cy5jb20pCi0KLQkqIGxkLmg6IGRlZmluZSBCWVRFX1NJWkUsIFNIT1JUX1NJWkUsIGFuZCBMT05HX1NJWkUgd2hpY2ggYXJlIG5vCi0JICBsb25nZXIgaW4gYmZkLmguCi0KLQkqIGxkbGFuZy5jLCBsZC5oOiB1cGRhdGVkIGNvcHlyaWdodC4KLQotVHVlIEF1ZyAxNyAxNToyMjowMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChvcGVuX291dHB1dCwgbGFuZ19jaGVjayk6IENoZWNrIHJldHVybiB2YWx1ZSBvZgotCWJmZF9zZXRfYXJjaF9tYWNoLgotCi1UdWUgQXVnIDE3IDA3OjAyOjE5IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4NTAwLnNjOiBTdGFydCBhbGwgc2VjdGlvbnMgaW4gYSBkaWZmZXJlbnQgc2VnbWVudC4KLQkqIHNjcmlwdHRlbXBsL3o4a3NpbS5zYzogSGFuZGxlIGNvbnN0cnVjdG9ycwotCi1UaHUgQXVnIDEyIDE2OjA1OjM3IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbjogcmV2ZXJ0IGVhcmxpZXIgY2hhbmdlcyBiYWNrIHRvIGV4ZWN1dGUgcnVudGVzdAotICAgICAgICAgIHdpdGggbWFrZSBjaGVjay4gY2R0ZXN0IGFuZCBib290c3RyYXAgbm93IGZ1bmN0aW9uIGFzIHRoZXkKLQkgIGRpZCB3aXRoaW4gdGhlIE1ha2VmaWxlLgotCi1UaHUgQXVnIDEyIDEwOjIwOjA1IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IAlVcGRhdGUgZGVwZW5kZW5jaWVzLgotCi0JKiBjb25maWd1cmUuaW46IFNldCBFTVVMQVRJT05fT0ZJTEVTIGluIE1ha2VmaWxlIGJhc2VkIG9uCi0JLS13aXRoLXRhcmdldHMgb3B0aW9uLgotCi1UaHUgQXVnIDEyIDA4OjUyOjI5IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjaGVjayB0YXJnZXRzIHJlaW1wbGVtZW50ZWQgdG8gb2xkIHdheS4KLQotV2VkIEF1ZyAxMSAwODoyNjoxMSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9pMzg2di5taCwgY29uZmlnL2lyaXg0Lm1oOiBVc2UgZ2NjCi0JLXByaW50LWxpYmdjYy1maWxlLW5hbWUgcmF0aGVyIHRoYW4gJChsaWJkaXIpL2xpYmdjYy5hLgotCSogY29uZmlnL2kzODZzY28ubWg6IE5ldyBmaWxlOyBjb3B5IG9mIGkzODZ2Lm1oIHRvIGNvcnJlc3BvbmQgdG8KLQliZmQvY29uZmlndXJlLmhvc3QgY2hhbmdlLgotCi1Nb24gQXVnICA5IDE0OjI1OjM1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBIYW5kbGUgLmxpbmUgYW5kIC5kZWJ1Zyogc2VjdGlvbnMuCi0KLQkqIGxkbGV4Lmw6IFVzZSBiZmRfc2Nhbl92bWEsIG5vdCBzdHJ0b3VsLgotCi1GcmkgQXVnICA2IDA4OjU3OjM5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYywgbGRmaWxlLmMsIGxkbGFuZy5jLCBsZXhzdXAuYywgbGRtYWluLmMsIGxkZW11bC5jOgotCVJlbW92ZSBpbml0YWwgY2FwcyBpbiBzb21lIGVycm9yIG1lc3NhZ2VzLCBjaGFuZ2UgImNhbid0IiB0bwotCSJjYW5ub3QiLCBhZGQgbWlzc2luZyBjb2xvbnMuCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogUHJpbnQgIiUlIiBhcyBhIHNpbmdsZSAlLgotCUZvciAnJScgZm9sbG93ZWQgYnkgdW5yZWNvZ25pemVkIGNoYXJhY3RlciwgcHJpbnQgdGhlbSBib3RoCi0JdmVyYmF0aW0gaW5zdGVhZCBvZiBleHBlY3RpbmcgYSBjaGFyICogYXJnLgotCUZvciAnJUMnLCBkb24ndCBwdXQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gcGFyZW5zLgotCi0JKiBsZGV4cC5jIChpbnZhbGlkKTogUGFzcyAiJSUiLCBub3QgIiUgIi4KLQotRnJpIEF1ZyAgNiAxNDozMToyMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL21pcHMuc2M6IEFsd2F5cyBkZWZpbmUgX2Z0ZXh0LCBfZmRhdGEsIF9mYnNzLgotCShCU1NfVkFSKTogUmVtb3ZlZDsgbm93IGFsd2F5cyBkZWZpbmUgX2Zic3MuCi0JKiBlbXVscGFyYW1zL21pcHNpZHQuc2gsIGVtdWxwYXJhbXMvbWlwc2lkdGwuc2ggKEJTU19WQVIpOgotCVJlbW92ZWQuCi0KLVRodSBBdWcgIDUgMTU6NTU6MTkgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IHo4ay1jb2ZmIGlzIHRoZSBzYW1lIGFzIHo4ay1zaW0KLQotV2VkIEF1ZyAgNCAyMTowMDoxOCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiB0ZXN0c3VpdGUvbGliL2xkLmV4cDogbmV3IGZpbGUKLQkqIHRlc3RzdWl0ZS9jb25maWcvdW5peC1sZC5leHA6IG5ldyBmaWxlCi0JKiB0ZXN0c3VpdGUvbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IG5ldyBmaWxlCi0JKiBNYWtlZmlsZS5pbjogYWRkIGRlamFnbnUgc3VwcG9ydCBmb3IgbWFrZSBjaGVjawotCi1XZWQgQXVnICA0IDE3OjUyOjMyIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCAoY29tbWVudCk6IEFkZCBtaXNzaW5nIG5ld2xpbmUgaW4gbWVzc2FnZS4KLQkqIGxkaW5kci5jIChhZGRfaW5kaXJlY3QpOiBEaXR0by4KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBEaXR0by4KLQotVHVlIEF1ZyAgMyAxMDo1Nzo0MSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55LCBsZGxleC5sLCBtcmkuYywgbGR3cml0ZS5jOiBDaGFuZ2UgbXVsdGlwbGUgY29tbW9ucwotCWludG8gZXh0ZXJucy4KLQotCSogbGRtaXNjLmMgKG11bHRpcGxlX3dhcm4pOiBOZXcgZnVuY3Rpb24uCi0JKiBsZG1pc2MuaDogRGVjbGFyZSBpdC4KLQkqIGxkbWFpbi5jIChlbnRlcl9nbG9iYWxfcmVmKTogQ2FsbCBpdC4KLQkqIGxkLmggKGxkX2NvbmZpZ190eXBlKTogQWRkIHdhcm5fY29tbW9uLgotCSogbGRsZXgubCwgbGRncmFtLnk6IFNldCBpdCB3aXRoIC13YXJuLWNvbW1vbiBvcHRpb24uCi0JKiBsZHZlci5jIChoZWxwKTogRG9jdW1lbnQgaXQuCi0KLU1vbiBBdWcgIDIgMTI6MDQ6MzYgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEFkZCBob29rcyBmb3IgLnNkYXRhLCAuc2JzcywgYW5kCi0JdGFyZ2V0LXNwZWNpZmljIHNlY3Rpb25zLCBhbmQgZm9yIGNoYW5naW5nIGRhdGEgc2VjdGlvbiB2bWEuCi0KLU1vbiBKdWwgMjYgMTQ6MDA6MDIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55IChPUFRJT05fUXksIE9QVElPTl9ZLCBPUFRJT05fZG4sIE9QVElPTl9ZUCk6IE5ldwotCXRlcm1pbmFscywgZm9yIFNvbGFyaXMuCi0JKGRpcmxpc3RfcHRyKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBuZXcgb3B0aW9ucy4KLQotCSogbGRsZXgubDogQWNjZXB0IGNvbW1hbmQtbGluZSBvcHRpb25zICItUXkiLCAiLWRuIiwgIi1ZIiwgYW5kCi0JIi1ZUCwuLi4iLgotCi0JKiBjb25maWcvc3VuNHNvbDIubXQ6IFBhc3MgZW11bGF0aW9uIG5hbWUgd2l0aG91dCAiLnNoIi4KLQotCSogZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5jOiBSZW5hbWVkIGZyb20gZWxmMzItc3BhcmMuYy4KLQkqIGNvbmZpZy9zdW40c29sMi5tdCAoZW1fZWxmMzJfc3BhcmMuYyk6IEFkanVzdGVkIGFjY29yZGluZ2x5LgotCi1GcmkgSnVsIDIzIDEzOjUxOjA5IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogc2NyaXB0dGVtcGwvZWxmLnNjOiBBZGQgc3VwcG9ydCBmb3IgLmluaXQsIC5maW5pLCAuY3RvcnMsCi0JLmR0b3JzLCAuZGF0YTEsIC5yb2RhdGExIHNlY3Rpb25zLCBpbnN0ZWFkIG9mIGNvbWJpbmluZyB0aGVtIGludG8KLQlvdGhlciBzZWN0aW9ucy4gIEZvciBgLXInLCBzZXQgYWxsIHNlY3Rpb24gc3RhcnQgYWRkcmVzc2VzIHRvCi0JemVyby4KLQotCSogZW11bHBhcmFtcy9lbGYzMi1zcGFyYy5zaCAoVEVYVF9TVEFSVF9BRERSLAotCU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUik6IFZhbHVlIHNob3VsZCBiZSAweDEwMTAwLgotCShNQVhQQUdFU0laRSk6IFJlbmFtZWQgZnJvbSBQQUdFX1NJWkUuCi0KLVdlZCBKdWwgMjEgMTQ6Mjg6NDIgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZW5zY3JpcHRzLnNoOiBJZiB0aGlzIGlzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiwgc2V0Ci0JQ09NUElMRV9JTi4KLQkqIGVtdWx0ZW1wbC8qLmVtOiBVc2UgaXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY29tcGlsZSBpbiB0aGUKLQlzY3JpcHRzLgotCi0JKiBNYWtlZmlsZS5pbiAoR0VOU0NSSVBUUyk6IFBhc3MgdGhlIGRlZmF1bHQgZW11bGF0aW9uIG5hbWUgdG8KLQlnZW5zY3JpcHRzLnNoLiAgUGFzcyB0aGUgY3VycmVudCBlbXVsYXRpb24gbmFtZSB3aXRob3V0ICIuc2giIG9uCi0JdGhlIGVuZC4KLQkqIGdlbnNjcmlwdHMuc2g6IFRha2UgYW4gZGVmYXVsdCBlbXVsYXRpb24gYXJnLgotCVVzZSB0aGUgY3VycmVudCBlbXVsYXRpb24gbmFtZSBhcyBFTVVMQVRJT05fTkFNRS4KLQlNYWtlIGRlZmF1bHQgbGliIHBhdGggZm9yIGNyb3NzLWNvbXBpbGluZyAnOicsIG5vdCBudWxsLgotCSogZW11bHBhcmFtcy8qLnNoOiBEb24ndCBzZXQgRU1VTEFUSU9OX05BTUUuCi0JKiBsZGVtdWwuYyAobGRlbXVsX2dldF9zY3JpcHQpOiBUYWtlIGlzZmlsZSBhcmcuCi0JUGFzcyBpdCB0byBlbXVsYXRpb24ncyBnZXRfc2NyaXB0IGZ1bmN0aW9uLgotCSogbGRlbXVsLmg6IEFkanVzdCBnZXRfc2NyaXB0IHByb3RvdHlwZXMuCi0JKiBsZGZpbGUuYyAobGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlKTogUmVuYW1lZCBmcm9tIGZpbmRfYV9uYW1lLgotCU5vIGxvbmdlciBzdGF0aWMuCi0JKiBsZGZpbGUuaDogRGVjbGFyZSBpdC4KLQkqIGxkZ3JhbS55OiBBY2NlcHQgYSBzY3JpcHQgb24gdGhlIGNvbW1hbmQgbGluZSBhZ2FpbiwKLQlmb3IgcGFyc2luZyBjb21waWxlZC1pbiBzY3JpcHRzLgotCSogbGRtYWluLmMgKG1haW4pOiBJZiBsZCBzY3JpcHQgaXMgYSBmaWxlLCBwYXJzZSBpdCBhcyBhIC1UCi0Jb3B0aW9uLCBvdGhlcndpc2UgcGFyc2UgaXQgZGlyZWN0bHkuCi0JKiBlbXVsdGVtcGwvKi5lbSAoKmdldF9zY3JpcHQpOiBSZXR1cm4gdGhlIHNjcmlwdHMgdGhlbXNlbHZlcyBpZgotCXRoaXMgaXMgdGhlIGRlZmF1bHQgZW11bGF0aW9uOyBvdGhlcndpc2UgcmV0dXJuIHRoZWlyIGZpbGUgbmFtZXMuCi0JKiBlbXVsdGVtcGwvbTg4a2Jjcy5lbTogTmV3IGZpbGUsIHRvIHRha2UgbTg4a2JjcyAjaWZkZWYgb3V0IG9mCi0JZ2VuZXJpYy5lbS4KLQkqIGVtdWxwYXJhbXMvbTg4a2Jjcy5zaDogVXNlIGl0LgotCi0JKiBsZC5oIChsZF9jb25maWdfdHlwZTo6dW5peF9yZWxvY2F0ZSk6IFJlbW92ZSB1bnVzZWQgZWxlbWVudC4KLQotVHVlIEp1bCAyMCAxMjowMTo0OSAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IERlbGV0ZSBlbV9pMzg2bGludXgubyAoZm9yIHdoaWNoCi0JdGhlcmUncyBubyBjaGFuZ2UgbG9nIGVudHJ5IHlldCwgdHNrIHRzaykgZnJvbSB0aGUgbGlzdCBvZgotCWVtdWxhdGlvbnMgY29tcGlsZWQgaW4gdW50aWwgTWFyayBnZXRzIGFyb3VuZCB0byBjaGVja2luZyBpbgotCWVtdWxwYXJhbXMvaTM4NmxpbnV4LnNoLgotCShsZGVtdWwtbGlzdC5oKTogRGVwZW5kIG9uIE1ha2VmaWxlLCBzbyBpZiBFTVVMQVRJT05fT0ZJTEVTIGlzCi0JY2hhbmdlZCwgdGhpcyBmaWxlIGdldHMgdXBkYXRlZC4KLQotRnJpIEp1bCAxNiAxNDoxNDozMiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkZ3JhbS55IChPUFRJT05fTGZpbGUpOiBOZXcgdG9rZW4uCi0JKGNvbW1hbmRfbGluZV9vcHRpb24pOiBBY2NlcHQgT1BUSU9OX0wgTkFNRSAod2hpdGVzcGFjZSBhZnRlciAtTCkuCi0JKiBsZGxleC5sICg8Q09NTUFORD4pOiBBY2NlcHQgLUwgd2l0aG91dCBGSUxFTkFNRS4KLQotRnJpIEp1bCAxNiAxMzo0NDoyNiAxOTkzICBEb3VnIEV2YW5zICAoZGplQGNhbnVjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGg4LzMwMGggc3VwcG9ydCBuZWVkcyBvd24gLm10IGZpbGUuCi0JY29uZmlnL2NvZmYtaDgzMDBoLm10OiBOZXcgZmlsZS4KLQotVGh1IEp1bCAxNSAxMjo0NDozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jOiBEb24ndCBpbmNsdWRlIHN5cy9zdGF0Lmg7IGl0IGFscmVhZHkgZ290IGluY2x1ZGVkCi0Jc29tZXdoZXJlIGFsb25nIHRoZSB3YXkuCi0KLVRodSBKdWwgMTUgMTQ6NDM6MzQgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBoODMwMGggc3VwcG9ydC4KLQllbXVscGFyYW1zL2g4MzAwaC5zaDogTmV3IGZpbGUuCi0Jc2NyaXB0dGVtcGwvaDgzMDBoLnNjOiBOZXcgZmlsZS4KLQotVGh1IEp1bCAxNSAxMjo0NDozNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9maWxlKTogSW4gZXJyb3IgbWVzc2FnZSwgdXNlIHRoZSBuYW1lIHRoZQotCXVzZXIgZ2F2ZSAoZS5nLiwgIi1sYyIpLCByYXRoZXIgdGhhbiB0aGUgYmFzZSBmaWxlIG5hbWUuCi0KLQkqIGxkZXhwLmMgKGV4cF9mb2xkX3RyZWUpOiBEb24ndCBhc3NpZ24gYW4gaW50IHRvIGFuIGVudW0uCi0KLQkqIGxkbWFpbi5bY2hdOiBSZW1vdmUgaW5pdGlhbCBRXyBmcm9tIGZ1bmN0aW9uIG5hbWVzLgotCSogbGRleHAuYywgbGRpbmRyLmMsIGxkbGFuZy5jOiBDaGFuZ2UgY2FsbGVycy4KLQotCSogbGRmaWxlLmMsIGxkbWFpbi5jLCBsZGdyYW0ueTogUmVuYW1lIG9wdGlvbl92IHRvIHRyYWNlX2ZpbGVfdHJpZXMuCi0KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBNb3ZlIGxvYWRpbmcgb2YgZGVmYXVsdCBzY3JpcHQgZnJvbQotCWhlcmUgdG8gbWFpbi4gIEFkZCBhICIvIiB0byBzdGFydCBvZiBzY3JpcHQgbmFtZSB0byBwcmV2ZW50Ci0JZmluZGluZyBpdCBpbiAiLiIgZmlyc3QuCi0KLQkqIGxkbWFpbi5jIChzZXRfc2NyaXB0c19kaXIpOiBEb24ndCBsb29rIGluICIuIiBmaXJzdC4KLQotCSogbGRncmFtLnksIGxkbGFuZy5jLCBsZHN5bS5jOiBSZW1vdmUgdHJhY2VzIG9mIHVudXNlZCB2YXIKLQlvcHRpb25fbG9uZ21hcC4KLQotVGh1IEp1bCAxNSAxMDo1NTo1OSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlbV9tODhrYmNzLmMpOiBDb3JyZWN0IGRlcGVuZGVuY3kuCi0JKiBzY3JpcHR0ZW1wbC9tODhrYmNzLnNjOiBJdCdzIEFSQ0gsIG5vdCBhcmNoLiAgUmVtb3ZlZCBUQVJHRVQKLQlzdGF0ZW1lbnQuICBDaGFuZ2VkIE9VVFBVVF9GT1JNQVQgdG8gdXNlICR7T1VUUFVUX0ZPUk1BVH0uCi0JKiBlbXVscGFyYW1zL204OGtiY3Muc2g6IEl0J3MgY29mZi1tODhrYmNzLCBub3QgbTg4a2Jjcy4KLQotV2VkIEp1bCAxNCAyMTo0Mjo1MyAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jIChsZGxhbmdfb3Blbl9maWxlLCBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUpLAotCW1haW4uYyAobWFpbik6IFByaW50IHRoZSBlcnJubyBzdHJpbmcgaW4gdGhlIGVycm9yIG1lc3NhZ2UuCi0KLVR1ZSBKdWwgMTMgMjA6MDA6MzAgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgaDgzMDBoIGZvciB0YXJnZXQgY3B1LgotCi0JKiBsZG1pc2MuYyAodmZpbmZvKTogSGF2ZSBkZW1hbmdsZSByZW1vdmUgbGVhZGluZyB1bmRlcnNjb3JlIGlmCi0JcHJlc2VudCAoZGVtYW5nbGUgaXMgc21hcnQgZW5vdWdoIHRvIGtub3cgd2hldGhlciB0byBkbyBpdCBvciBub3QpLgotCi1Nb24gSnVsIDEyIDExOjQ1OjQ4IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHNldF9zY3JpcHRzX2Rpcik6IENoZWNrIC4gYW5kIDxsZCBiaW4gZGlyPi8uLi9saWIgZm9yCi0JbGRzY3JpcHRzLCBhcyB3ZWxsIGFzIDxsZCBiaW4gZGlyPiBhbmQgU0NSSVBURElSLgotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogVXNlIHNpemVvZiBpbnN0ZWFkIG9mIG1hZ2ljIGNvbnN0YW50LgotCi0JKiBsZG1haW4uYyAoZ2V0X2VtdWxhdGlvbiwgY2hlY2tfZm9yX3NjcmlwdHNfZGlyLAotCXNldF9zY3JpcHRzX2Rpcik6ICBOZXcgZnVuY3Rpb25zLgotCShtYWluKTogQ2FsbCB0aGVtLgotCi1Nb24gSnVsIDEyIDEwOjU3OjAzIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBzY3JpcHR0ZW1wbC9lbGYuc2M6IEluY2x1ZGUgLmluaXQsIC5maW5pLCAucm9kYXRhIHNlY3Rpb25zLgotCUNyZWF0ZSBzeW1ib2wgImVuZCIgaW5zdGVhZCBvZiAiX19lbmQiLiAgQ29tbWVudCBvdXQgc29tZSBwYXJ0cwotCXRoYXQgbWF5IG5vdCBiZSBuZWVkZWQgKHlldCkgZm9yIGVsZi4KLQotCSogY29uZmlndXJlLmluOiBBY2NlcHQgc3BhcmMtZWxmIGFuZCBzcGFyYy1zb2xhcmlzMiBjb25maWdzLgotCi1UaHUgSnVsICA4IDE1OjMzOjMyIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSW5jbHVkZSAkKE9USEVSX0VNVUxBVElPTlMpLgotCi0JKiBsZG1pc2MuaCAoZWluZm8sIG1pbmZvLCBpbmZvKTogRG9uJ3QgYm90aGVyIHdpdGggUEFSQU1TIG1hY3JvCi0Jd2hlbiBubyBwcm90b3R5cGUgaXMgYmVpbmcgc3VwcGxpZWQuCi0JKGxkbWFsbG9jLCBsZHJlYWxsb2MpOiBTaXplIGFyZ3VtZW50IGlzIG5vdyBzaXplX3QuCi0KLQkqIGxkbWlzYy5jIChmaW5mbyk6IE5ldyBmdW5jdGlvbiwgYWNjZXB0cyBGSUxFKiBhcmd1bWVudC4KLQkodmZpbmZvLCBjYXNlICd2Jyk6IE5ldyBmb3JtYXQgY2hhcmFjdGVyOyBkaXNwbGF5cyBiZmRfdm1hIGluIGhleAotCXdpdGhvdXQgbGVhZGluZyB6ZXJvcy4KLQkodmZpbmZvLCBjYXNlcyAnUicgYW5kICdDJyk6IFVzZSBmaW5mbygldikgd2hlbiBkaXNwbGF5aW5nIGEKLQliZmRfdm1hIHZhbHVlLCBpbnN0ZWFkIG9mIGZwcmludGYoJXgpIHdoaWNoIHdvbid0IGhvbGQgYSBsb25nIGxvbmcKLQl2YWx1ZS4KLQkoY29uY2F0LCBidXlzdHJpbmcpOiBTdHJpbmcgbGVuZ3RocyBhcmUgc2l6ZV90LgotCShsZG1hbGxvYywgbGRyZWFsbG9jLCB4cmVhbGxvYyk6IFNpemUgYXJndW1lbnQgaXMgbm93IHNpemVfdC4KLQotCSogbGRsYW5nLmMgKG5ld19zdGF0ZW1lbnQpOiBTaXplIGFyZ3VtZW50IGlzIG5vdyBzaXplX3QuICBBZGRlZAotCWZvcndhcmQgZGVjbGFyYXRpb24gd2l0aCBwcm90b3R5cGUuCi0KLVRodSBKdWwgIDggMTA6NTM6NDcgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSAoT1BUSU9OX3YpOiBEb24ndCB0dXJuIG9uIHZlcmJvc2Ugb3V0cHV0LgotCi1XZWQgSnVsICA3IDE3OjEwOjQ1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubDogR2V0IHJpZCBvZiBsb2NhbCB0eXBlZGVmIGZvciBiZmRfdm1hISAgR2V0IGl0IGZyb20KLQliZmQuaCBpbnN0ZWFkLgotCi1XZWQgSnVsICA3IDExOjMzOjEyIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBEb24ndCBpbnN0YWxsIGFzICQodG9vbGRpcikvYmluL2dsZDsKLQljb2xsZWN0MiBkb2Vzbid0IGxvb2sgZm9yIGdsZCBhbnkgbW9yZSBhbnlob3cuCi0KLU1vbiBKdWwgIDUgMTQ6Mjk6NDggMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19yZWxvY2F0ZV9nbG9iYWxzKTogU2tpcCBpbmRpcmVjdCBzeW1ib2xzLCB3aGljaAotCW5vdyBoYXZlIGEgbm9uIE5VTEwgc3JlZnNfY2hhaW4uCi0KLQkqIGNvbmZpZy9ocDMwMGhwdXgubXQ6IFVzZSBlbXVsYXRpb24gaHAzaHB1eCByYXRoZXIgdGhhbgotCWhwMzAwaHB1eCwgc2luY2UgdGhlIGxhdHRlciBkb2VzIG5vdCBleGlzdC4KLQotRnJpIEp1bCAgMiAxODowNjowNSAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGdlbnNjcmlwdHMuc2g6IFB1dCB0aGUgc2NyaXB0cyBpbiB0aGUgbGRzY3JpcHRzIGRpcmVjdG9yeSwgbm90Ci0JZW11bGF0aW9ucy4KLQkqIGNvbmZpZ3VyZS5pbiAobGRzY3JpcHRzKTogTWFrZSwgaW5zdGVhZCBvZiBlbXVsYXRpb25zLgotCSogTWFrZWZpbGUuaW4gKHNjcmlwdGRpcik6IFRha2Ugb2ZmIHRoZSAibGQiIHBhcnQuCi0JKGluc3RhbGwsIGNsZWFuLCBkaXN0Y2xlYW4pOiBVc2UgbGRzY3JpcHRzLCBub3QgZW11bGF0aW9ucy4KLQlJbiB0ZXN0cywgZG9uJ3QgcGFzcyAtTGVtdWxhdGlvbnMuCi0JRG9uJ3QgcGFzcyB0b29sZGlyL2xpYiB0byBnZW5zY3JpcHRzLnNoLgotCSogZ2Vuc2NyaXB0cy5zaDogRG9uJ3QgdGFrZSB0b29sZGlyL2xpYiBhcmcuCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogQWRkICJsZHNjcmlwdHMvIiB0byB0aGUgbmFtZSBvZiB0aGUKLQlkZWZhdWx0IHNjcmlwdCBmaWxlLgotCi1GcmkgSnVsICAyIDE3OjEzOjM1IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIHNjcmlwdHRlbXBsL2g4MzAwLnNjOiBBZGQgLnRvcnMgc2VjdGlvbiBmb3IgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcnMuCi0KLVRodSBKdWwgIDEgMTY6Mzg6NDUgMTk5MyAgRG91ZyBFdmFucyAgKGRqZUBjYW51Y2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL2NvZmYtaDgzMDAubXQ6IEVNVUw9aDgzMDBobXMgLT4gaDgzMDAuCi0KLVdlZCBKdW4gMzAgMTU6NDU6NTUgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoLnkuYyk6IHNraXAgZGVmYXVsdCAueS5jIHJ1bGVzLiBnbnUgbWFrZSBjYW4gbm93Ci0JICBydW4gaW4gcGFyYWxsZWwgd2l0aG91dCBjb2xsaWRpbmcgb24geWFjYydzIHN0YXRpYyBmaWxlIG5hbWVzLgotCSAgV2l0aG91dCB0aGUgc3R1YiBydWxlLCBtYWtlIHdpbGwgdHJ5IHRvIHN0YXJ0IHR3byB5YWNjJ3MKLQkgIGNvbmN1cnJlbnRseSB3aGljaCBmYWlscyBiZWNhdXNlIG9mIHlhY2MncyBzdGF0aWMgZmlsZSBuYW1lcy4KLQotVHVlIEp1biAyOSAxMjoyMDozNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChzdWJmaWxlX3dhbnRlZF9wKTogRG9uJ3QgZHVtcCBjb3JlIGlmIHRoZXJlIGFyZSBubwotCXN5bWJvbHMuCi0KLU1vbiBKdW4gMjggMTI6MjI6MTEgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZW5zY3JpcHRzLnNoIChMSUJfUEFUSCk6IE9ubHkgYWRkIC91c3IvbG9jYWwvbGliIGlmIGl0J3MKLQlkaWZmZXJlbnQgZnJvbSBsaWJkaXIuCi0KLQkqIE1ha2VmaWxlLmluIChzY3JpcHRkaXIpOiBCYXNlIG9uIHRvb2xkaXIsIG5vdCBkYXRhZGlyLgotCi1TYXQgSnVuIDI2IDEyOjAzOjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAoaGVscCk6IE5ldyBmdW5jdGlvbi4KLQkqIGxkdmVyLmg6IERlY2xhcmUgaXQuCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogUmVjb2duaXplIG5ldyBvcHRpb25zIC0taGVscCBhbmQgLS12ZXJzaW9uLgotCi1Nb24gSnVuIDIxIDIwOjM5OjQ4IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoSU5DTFVERVMpOiBEb24ndCBuZWVkIC4uL2luY2x1ZGUgYW55IG1vcmUuCi0KLU1vbiBKdW4gMjEgMTY6Mzg6MzUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogU3VwcG9ydCBuZXcgLW9mb3JtYXQgb3B0aW9uLgotCVJlbW92ZSBhdHRlbXB0IGF0IHN1cHBvcnRpbmcgc2NyaXB0IGZyYWdtZW50cyBvbiB0aGUgY29tbWFuZCBsaW5lLgotCSogbGRsYW5nLmMgKGxhbmdfYWRkX291dHB1dF9mb3JtYXQpOiBUYWtlIG5ldyBhcmcsIEZST01fU0NSSVBULgotCSogbXJpLmMgKG1yaV9mb3JtYXQpLCBsZGdyYW0ueTogQ2hhbmdlIGNhbGxlcnMuCi0JKiBsZGxhbmcuaDogQ2hhbmdlIHByb3RvdHlwZS4KLQotVGh1IEp1biAxNyAxNjo1Mzo1NiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gKHpvb0BjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogY2Fub25pY2FsaXplIGluc3RhbGwuc2g7IGZvciB1c2Ugd2l0aGluCi0JdGhpcyBkaXJlY3RvcnkgKGFuZCBzdWJkaXJzKQotCi1UaHUgSnVuIDE3IDE0OjMzOjA5IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IFR3ZWFrIGdyYW1tYXIgdG8gbWFrZSByZXBvcnRpbmcgb2YgaW52YWxpZCBvcHRpb25zIHdvcmsuCi0KLQkqIE1ha2VmaWxlLmluICguY2Mubyk6IFJlc3RvcmUgLlNVRkZJWEVTIGVudHJ5IGZvciAuY2MKLQlhbmQgLmNjLm8gcnVsZS4KLQotV2VkIEp1biAxNiAxMTo0NTozMiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZmlsZS5jIChsZGZpbGVfb3Blbl9jb21tYW5kKTogRG9uJ3QgdHJ5IC5sZCBleHRlbnNpb24uCi0JSXQgd2Fzbid0IGRvY3VtZW50ZWQgKG9yIGxpa2VseSB1c2VkKSBhbmQgd2FzdGVzIHRpbWUuCi0JKHRyeV9vcGVuKTogSWYgRVhURU4gaXMgZW1wdHksIGRvbid0IHRyeSBpdC4KLQotCSogbGRjdG9yLmMsIGxkZXJyb3IuYywgbGRleHAuYywgbGRmaWxlLmMsIGxkaW5kci5jLCBsZGxhbmcuYywKLQlsZGxleC5sLCBsZG1haW4uYywgbGRtaXNjLmMsIGxkc3ltLmMsIGxkdmVyLmMsIGxkd2Fybi5jLAotCWxkd3JpdGUuYywgbGV4c3VwLmMsIG1yaS5jLCByZWxheC5jOiBSZXBsYWNlIERFRlVOIG1hY3JvIGNhbGxzCi0Jd2l0aCBub3JtYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgotCi0JKiBNb3ZlICouZW0gdG8gZW11bHRlbXBsLyouZW0uICBNb3ZlICouc2ggdG8gZW11bHBhcmFtcy8qLnNoLgotCU1vdmUgKi5zYy1zaCB0byBzY3JpcHR0ZW1wbC8qLnNjLgotCSoge2VtdWx0ZW1wbCxlbXVscGFyYW1zLHNjcmlwdHRlbXBsfS9SRUFETUU6IE5ldyBmaWxlcy4KLQkqIHNoLmVtLCBzdDIwMDAuZW0sIHo4a3NpbS5lbSwgaDgzMDBobXMuZW0sIGg4NTAwaG1zLmVtOiBGaWxlcwotCXJlbW92ZWQsIHJlcGxhY2VkIHdpdGggZ2VuZXJpYy5lbS4KLQkqIGg4MzAwLnNoLCBoODUwMC5zaCwgaDgzMDAuc2MsIGg4NTAwLnNjOiBSZW5hbWVkIGZyb20KLQkgaDhbMzVdMDBobXMuc1tjaF0uICBDaGFuZ2UgdGhlaXIgY29udGVudHMgdG8gb21pdCB0aGUgImhtcyIuCi0KLQkqICouZW0gKCpfZ2V0X3NjcmlwdCk6IFJldHVybiBzY3JpcHQgbmFtZSBpbnN0ZWFkIG9mIHNjcmlwdCBjb250ZW50cy4KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiBDaGFuZ2UgY2FsbGVyLgotCi0JKiBsZGxleC5sLCBsZGdyYW0ueTogUmVjb2duaXplIC1tIG9wdGlvbi4KLQlDaGVjayBmb3IgaW5wdXQgZmlsZXMgYWZ0ZXIgKmFsbCogb3B0aW9ucyBpbiBncmFtbWFyLgotCSogbGRtYWluLmMgKG1haW4pOiBDaGVjayBmb3IgLW0gb3B0aW9ucy4gIEFkZCBkZWZhdWx0IGRpcmVjdG9yeQotCWZvciAtbS4KLQotCSogbWtzY3JpcHQuYzogRmlsZSByZW1vdmVkLgotCSogZ2Vuc2NyaXB0cy5zaDogVGFrZSB0d28gbW9yZSBwYXJhbWV0ZXJzLCB0b29sZGlybGliIGFuZCBsaWJkaXIsCi0JdG8gYWRkIHRvIHRoZSBkZWZhdWx0IExJQl9QQVRILgotCUxvb2sgZm9yIGlucHV0IGZpbGVzIGluIHRoZSBuZXcgc3ViZGlyZWN0b3JpZXMuCi0JQ3JlYXRlIHRoZSBzY3JpcHRzIGluIGVtdWxhdGlvbnMgc3ViZGlyZWN0b3J5IGFuZCBkb24ndCBmaWx0ZXIKLQl0aGVtIHRocm91Z2ggbWtzY3JpcHQuCi0JKiBjb25maWd1cmUuaW46IE1ha2UgdGhlIGVtdWxhdGlvbnMgc3ViZGlyZWN0b3J5LgotCi0JKiBNYWtlZmlsZS5pbjogQWNjb3VudCBmb3IgYWxsIG9mIHRoZSBhYm92ZSBjaGFuZ2VzLgotCVJlbW92ZSB1bnVzZWQgLlNVRkZJWEVTLiAgR2V0IGxpYmdjYy5hIHBhdGggd2l0aCBnY2MKLQktcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSBpbnN0ZWFkIG9mICQobGliZGlyKS9saWJnY2MuYS4KLQlQdXQgQ0ZMQUdTIGxhc3QgaW4gdGhlIGNvbXBpbGF0aW9uIHJ1bGVzLgotCUFkZCAtSS4uL2JmZCB0byBJTkNMVURFUyBzbyBzeXNkZXAuaCBpcyBmb3VuZC4KLQotVHVlIEp1biAxNSAyMzowNDo0NiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChJTkNMVURFUyk6IExvb2sgaW4gLi4vaW5jbHVkZSwgbm90IC4uL2JmZC4KLQotCSogYW91dC5zYy1zaDogQWRkIFNITElCX1BBVEggbGlrZSBTVEFDS1pFUk8uICBNYWtlIFNUQUNLWkVSTwotCWRlcGVuZGVudCBvbiBSRUxPQ0FUSU5HLCBub3QgUkVMT0NBVElPTi4KLQkqIGhwM2hwdXguc2ggKFNITElCX1BBVEgpOiBEZWZpbmUgaXQuCi0KLU1vbiBKdW4gMTQgMTk6MDY6MTUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGZpbGUuYyAodHJ5X29wZW4pOiBJZiBvcGVuaW5nIHdpdGhvdXQgdGhlIGV4dGVuc2lvbiBmYWlscywKLQl0cnkgd2l0aCB0aGUgZXh0ZW5zaW9uIGV2ZW4gaWYgLXYgb3IgLVYgd2FzIGdpdmVuLgotCWhhZF9zY3JpcHQgaXMgaW1wb3J0ZWQgKGZyb20gbGRncmFtLnkpLCBub3QgZXhwb3J0ZWQuCi0KLU1vbiBKdW4gMTQgMTY6MjY6MTAgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0LCB1c2UgSU5TVEFMTF9YRk9STQotCi1UaHUgSnVuIDEwIDE0OjAwOjA2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYyAoZXhwX2ZvbGRfdHJlZSk6IERvbid0IGxvc2UgdGhlIG9sZCBmbGFnIGJpdHMuCi0JKiBsZGdyYW0ueSAoc3RhdGVtZW50X2xpc3Rfb3B0KTogTmV3IG5vbnRlcm1pbmFsLCBlaXRoZXIgZW1wdHkgb3IKLQlzdGF0ZW1lbnRfbGlzdC4KLQkoc2VjdGlvbik6IFVzZSBzdGF0ZW1lbnRfbGlzdF9vcHQsIG5vdCBzdGF0ZW1lbnRfbGlzdC4KLQkqIG02OGtjb2ZmLnNjLXNoOiBHYXRoZXIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQgZGVmaW5lCi0JX19DVE9SX0xJU1RfXyBhbmQgX19EVE9SX0xJU1RfXyBhcHByb3ByaWF0ZWx5LgotCSogc2EyOTIwMC5zYy1zaDogR2F0aGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kIGRlZmluZQotCV9fX0NUT1JfTElTVF9fIGFuZCBfX19EVE9SX0xJU1RfXyBhcHByb3ByaWF0ZWx5LgotCi1Nb24gSnVuICA3IDEyOjUzOjI4IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKElOQ0xVREVTKTogIEFkZCAtSS4uL2JmZCBmb3Igc3lzZGVwLmggYW5kIGJmZC5oLgotCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgdG8gY29uZmlndXJlIHRvIGdldCBzeXNkZXAuaC4KLQotRnJpIEp1biAgNCAxNjoxODoyNCAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgaW5zdGFsbDphbGwgYW5kIGluc3RhbGwtaW5mbzppbmZvCi0JZGVwZW5kZW5jaWVzICh0aGVzZSBjYXVzZSBzb21lIHNwdXJpb3VzIHJlYnVpbGRzIGF0ICdtYWtlIGluc3RhbGwnCi0gICAgICAgIHRpbWUpCi0KLUZyaSBKdW4gIDQgMDg6NTA6MTQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtaWR0LWVjb2ZmbCopOiBOZXcgdGFyZ2V0OyB1c2UgbWlwcy1pZHRsLgotCShtaXBzLWlkdC1lY29mZiopOiBBZGRlZCB0cmFpbGluZyAnKicuCi0JKiBjb25maWcvbWlwcy1pZHRsLm10OiBOZXcgZmlsZTsgdXNlIEVNVUwgb2YgbWlwc2lkdGwuCi0JKiBtaXBzaWR0bC5zaDogTmV3IGZpbGU7IGxpa2UgbWlwc2lkdC5zaCwgYnV0IGxpdHRsZSBlbmRpYW4uCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzaWR0bC5vLgotCi0JKiBjb25maWcvc3VuMy5taCAoSE9TVElOR19MSUJTLCBIT1NUSU5HX0VNVSk6IFJlbW92ZWQgb2Jzb2xldGUgYW5kCi0JaW5jb3JyZWN0IGRlZmluaXRpb25zLgotCi1UdWUgSnVuICAxIDE0OjU2OjEwIDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRzeW0uYyAod3JpdGVfZmlsZV9sb2NhbHMpOiAgV3JpdGUgQlNGX0NPTlNUUlVDVE9SCi0Jc3ltYm9scywgdW5sZXNzIHN0cmlwcGluZy4KLQotVHVlIE1heSAyNSAxNTozNDoyNSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjb25maWd1cmUgbG9va3MgZm9yICMjIyMsIHNvIHJlbW92ZSBsaW5lcyB3aXRoIG1hbnkKLQknIycgY2hhcmFjdGVycy4KLQkqIGNvbmZpZy9pcml4NC5taCwgY29uZmlnL2kzODZ2Lm1oOiBOZXcgZmlsZXM7IHNldCBIT1NUSU5HX0NSVDAKLQlhbmQgSE9TVElOR19MSUJTIGNvcnJlY3RseSBzbyB0aGF0IGBgbWFrZSBjaGVjaycnIHdpbGwgd29yay4KLQotVGh1IE1heSAyMCAxMzo1NjoxNiAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogIERlZmluZSBfZXRleHQsIF9lZGF0YSwgYW5kIF9lbmQsIGluIGFkZGl0aW9uCi0JdG8gZXRleHQsIGVkYXRhLCBhbmQgZW5kLiAgTmVlZGVkIGZvciBJUklYIDQuMC41Ri4KLQlQYXRjaCBmcm9tIG13cEBpY29uaXgub3ouYXUgKE1pY2hhZWwgUGFkZG9uKS4KLQotCSogVmVyc2lvbiAyLjIuMSByZWxlYXNlZC4KLQotVGh1IE1heSAyMCAxMTo0MjowNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1pcHNic2Quc2Mtc2g6IFJlbmFtZWQgZnJvbSBhb3V0LW1pcHNic2Quc2Mtc2guCi0JKiBtaXBzYnNkLnNoIChFTVVMQVRJT05fTkFNRSk6IFVzZSBuZXcgZmlsZSBuYW1lLgotCi1UdWUgTWF5IDE4IDE3OjEwOjI0IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKExERElTVFNUVUZGKTogUmVtb3ZlIGxkLm1tIHNpbmNlIHdlIGNhbid0IGJ1aWxkIGl0Ci0JcHJvcGVybHkgcmlnaHQgbm93LgotCi0JKiBWZXJzaW9uIDIuMiByZWxlYXNlZC4KLQotTW9uIE1heSAxNyAxNTozNzoyOCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYyAobGR2ZXJzaW9uKTogQnVtcCB2ZXJzaW9uIG51bWJlciB0byAyLjIuCi0KLU1vbiBNYXkgMTcgMTI6NDQ6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIE5FV1M6ICBOZXcgZmlsZS4KLQotRnJpIE1heSAxNCAxMToyNjoyNCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6IERvbid0IGRlZmluZSBCU1NfVkFSIHVubGVzcyByZWxvY2F0aW5nLgotCi1XZWQgTWF5IDEyIDEzOjMzOjI5IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1rc2NyaXB0Lm8sIG1rc2NyaXB0KTogQnVpbGQgbWtzY3JpcHQgdmlhCi0JbWtzY3JpcHQubywgcmF0aGVyIHRoYW4gZGlyZWN0bHkgZnJvbSBta3NjcmlwdC5jLgotCi1UdWUgTWF5ICA0IDIxOjU4OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBMb29rIGZvciAke3RhcmdldF9tYWtlZmlsZV9mcmFnfSByZWxhdGl2ZSB0bwotCSR7c3JjZGlyfSwgbm90IHJlbGF0aXZlIHRvIGJ1aWxkIGRpcmVjdG9yeS4KLQotCSogaHBwYW9zZi5lbSwgaHBwYW9zZi5zYy1zaCwgaHBwYW9zZi5zaDogTmV3IGZpbGVzLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaHBwYSotaHAtb3NmLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogSW5jbHVkZSBocHBhb3NmIGVtdWxhdGlvbi4KLQkoZW1faHBwYW9zZi5jKTogQnVpbGQgaXQuCi0JKiBjb25maWcvaHBwYW9zZi5taCwgaHBwYW9zZi5tdDogTmV3IGZpbGVzLgotCi0JKiBsZC5oIChBTElHTl9OKTogUmVuYW1lZCBmcm9tIEFMSUdOLCBiZWNhdXNlIHRoYXQgY29uZmxpY3RlZCB3aXRoCi0Jc29tZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAgQWxsIHVzZXMgY2hhbmdlZC4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgaTM4Ni1haXggY29uZmlndXJhdGlvbnMgYXMgaTM4Ni1jb2ZmCi0JdGFyZ2V0cy4KLQotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgbTY4Ki0qLWhwdXguCi0JKiBhb3V0LnNjLXNoOiBJZiBTVEFDS1pFUk8gYW5kIFJFTE9DQVRJTkcgYXJlIGJvdGggZGVmaW5lZCwgb3V0cHV0Ci0JdGhlIHZhbHVlIG9mIFNUQUNLWkVSTy4KLQkqIE1ha2VmaWxlLmluIChBTExfRU1VTEFUSU9OUyk6IEluY2x1ZGUgaHAzMDAtaHB1eCBlbXVsYXRpb24uCi0JKGVtX2hwM2hwdXguYyk6IEJ1aWxkIGl0LgotCSogaHAzaHB1eC5zaCwgY29uZmlnL2hwMzAwaHB1eC5tdDogTmV3IGZpbGVzLgotCi1UdWUgTWF5ICA0IDEyOjM3OjM1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogUHV0IGNvbnN0cnVjdG9ycyBpbiB0aGUgLmRhdGEgc2VjdGlvbi4KLQkqIE1ha2VmaWxlLmluIChjZHRlc3QpOiBBZGRlZCBkZXBlbmRlbmN5IG9uIGxkLm5ldy4KLQotTW9uIE1heSAgMyAxOTo0MzozOSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2UgZGVmaW5pdGlvbiBvZiAkKHRvb2xkaXIpIHRvIG1hdGNoIEZTRi4KLQkqIHZheC5zaCwgY29uZmlnL3ZheC5tdCwgY29uZmlndXJlLmluLCBNYWtlZmlsZS5pbjoKLQlTdXBwb3J0IFZBWCBVbHRyaXggYW5kIEJTRC4KLQotTW9uIEFwciAyNiAxODozNTo0NyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogc2guZW0sIHNoLnNoLCBzaC5zYy1zaDogTmV3IGZpbGVzIHN1cHBvcnRpbmcgSGl0YWNoaSBTSC4KLQotV2VkIEFwciAxNCAyMTowMTo1MSAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmggKHN0cnVjdCBtZW1vcnlfcmVnaW9uKTogIENoYW5nZSBgbGVuZ3RoJyBhbmQKLQlgb2xkX2xlbmd0aCcgZmllbGRzIHRvIGJmZF9zaXplX3R5cGUuICBFbGltaW5hdGUgdXNlIG9mIGJmZF9vZmZzZXQuCi0JKiBsZGxhbmcuYywgbXJpLmM6ICBDb3JyZXNwb25kaW5nIGNoYW5nZXMsIHBsdXMgbGludC4KLQotVGh1IEFwciAgOCAyMjowODoxOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRm9yIGFsbCBpMzg2IHRhcmdldHMsIGFjY2VwdCBpNDg2IGFzIHdlbGwuCi0KLU1vbiBBcHIgIDUgMTc6MzM6MzkgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAod2lsZF9kb2l0KTogUHJlc2VydmUgYWxsIGZsYWdzIGZvciBhCi0JU0VDX1NIQVJFRF9MSUJSQVJZIHNlY3Rpb24uCi0JKHNpemVfaW5wdXRfc2VjdGlvbik6IENvbnNpZGVyIGFueSBTRUNfSEFTX0NPTlRFTlRTIHNlY3Rpb24gd2hlbgotCWNvbXB1dGluZyBsYXJnZXN0X3NlY3Rpb24uCi0KLUZyaSBBcHIgIDIgMTQ6MzM6NTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogSW5pdGlhbGl6ZSBhbGwKLQlmaWVsZHMgb2YgbmV3bHkgY3JlYXRlZCBzdHJ1Y3R1cmUuCi0KLVdlZCBNYXIgMzEgMTg6MTk6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoZ19zd2l0Y2hfdmFsdWUpOiBOZXcgdmFyaWFibGUuCi0JKiBsZGdyYW0ueSAoT1BUSU9OX0csIE9QVElPTl9HdmFsKTogTmV3IHRva2Vucy4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCAtRyBhbmQgc2V0IGdfc3dpdGNoX3ZhbHVlLgotCSogbGRsZXgubCAoQ09NTUFORCk6IEFjY2VwdCAtRy4KLQkqIGxkbGFuZy5jIChvcGVuX291dHB1dCk6IENhbGwgYmZkX3NldF9ncF9zaXplIG9uIG5ldyBCRkQuCi0KLVR1ZSBNYXIgMzAgMDk6NDA6MjUgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQlTdXBwb3J0IGZvciBsaW5raW5nIGFuZCBsb2FkaW5nIGF0IGRpZmZlcmVudCBwbGFjZXM6Ci0KLQkqIGxkbGV4Lmw6IEFkZCAiQVQiIGtleXdvcmQuCi0JKiBsZGdyYW0ueTogQ2xlYW51cCwgYW5kIHBhcnNlIEFULgotCSogbGRsYW5nLmMgKHByaW50X291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk6IFByaW50IG91dHB1dCBhZGRyZXNzCi0Jb2Ygc2VjdGlvbiBpbiBtYXAuIChsYW5nX3NpemVfc2VjdGlvbnMpOiBGaWxsIHNlY3Rpb25zJyBsbWEgd2l0aAotCWxvYWQgYWRkcmVzcy4KLQkqIGxkbGFuZy5oIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlKTogQWRkIGxvYWRfYmFzZQotCWluZm9ybWF0aW9uLgotCi0JKiBsZGluZHIuYyAoYWRkX2luZGlyZWN0KTogS2VlcCBtb3JlIGluZm9ybWF0aW9uIGluIHRoZSBhbGlhcwotCXN5bWJvbCBjaGFpbi4KLQkqIGxkbGFuZy5jICh3aWxkX2RvaXQpOiAgRG9uJ3QgaW5oZXJpdCBORVZFUl9MT0FEIHNlY3Rpb24KLQlhdHRyaWJ1dGUgZnJvbSBhbiBpbnB1dCBzZWN0aW9uLgotCSogbGRtYWluLmMgKFFfZW50ZXJfZmlsZV9zeW1ib2xzKTogQ29tbW9uIHNlY3Rpb24gaXMgTkVWRVJfTE9BRCBieQotCWRlZmF1bHQuIChRX2VudGVyX2ZpbGVfc3ltYm9zKTogSW5kaXJlY3Qgc3ltYm9scyBub3cgYXJlIGtub3duIGJ5Ci0JdGhlaXIgc2VjdGlvbiwgbm90IGEgc3BlY2lhbCBzeW1ib2wgZmxhZy4KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogSW5kaXJlY3Qgc3ltYm9scyBhcmVuJ3QgbG9jYWwuCi0JKHdyaXRlX2ZpbGVfZ2xvYmFscyk6IFdyaXRlIHRoZSBtYXBwaW5nIGZvciBhbiBpbmRpcmVjdCBzeW1ib2wuCi0JKiByZWxheC5jIChidWlsZF9pdCk6IFdoZW4gZm9yY2VkIHRvIHdyaXRlIGEgTkVWRVJfTE9BRCBzZWN0aW9uLAotCWZpbGwgaXQgd2l0aCB6ZXJvcy4KLQotVHVlIE1hciAyMyAxMzoyNDoxMCAxOTkzICBKZWZmcmV5IE9zaWVyICAoamVmZnJleUBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiAgY2hhbmdlcyBmb3IgcTEKLQotVHVlIE1hciAyMyAwMDoxMzoyOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgZHZpIHRhcmdldCwgZGVmaW5lICYgdXNlIFRFWEkyRFZJLCBhZGQgaW5zdGFsbGNoZWNrCi0KLU1vbiBNYXIgIDggMjA6MzA6MzUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVuYW1lIEhPU1RfQ0MgdG8gQ0NfRk9SX0JVSUxECi0KLVRodSBNYXIgIDQgMTI6NDQ6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLnNjLXNoOiBBZGRlZCB2YXJpYWJsZXMgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4gYnkgYQotCXNwZWNpZmljIGVtdWxhdGlvbi4KLQkqIG1pcHNpZHQuc2g6IE5ldyBmaWxlOyBlbXVsYXRpb24gZm9yIElEVCBNSVBTIGJvYXJkLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fbWlwc2lkdC5vLgotCShlbV9taXBzaWR0LmMpOiBOZXcgdGFyZ2V0LiAgVXNlcyBtaXBzaWR0LnNoIGFuZCBtaXBzLnNjLXNoLgotCSogY29uZmlnL21pcHMtaWR0Lm10OiBOZXcgZmlsZTsgc2V0cyBFTVVMIHRvIG1pcHNpZHQuCi0JKiBjb25maWd1cmUuaW4gKG1pcHMtaWR0LWVjb2ZmKTogTmV3IHRhcmdldDsgdXNlcyBtaXBzLWlkdC4KLQotU2F0IEZlYiAyNyAwMDowMDoxNCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGFvdXQtbWlwc2JzZC5zYy1zaCwgbWlwc2JzZC5zaDogTmV3IGZpbGVzIGZyb20gUmFscGggQ2FtcGJlbGwsCi0JcmFscGhjQHB5cmFtaWQuY29tLgotCSogaTM4NmJzZC5zaCwgY29uZmlnL2kzODZic2QubXQ6IE5ldyBmaWxlcy4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW46IEFkZGVkIHN1cHBvcnQgZm9yIG1pcHNic2QgYW5kIDM4NmJzZC4KLQotVGh1IEZlYiAyNSAxNTozMzoxMCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIG1yaS5jOiAgQWRkIGV4dGVybiBkZWNsYXJhdGlvbiBvZiBzdHJkdXAuCi0JKiBsZHN5bS5jIChLRUVQIG1hY3JvKTogIEFkZCBzcGFjZXMgYXJvdW5kICc9JyBmb3IgdGhlCi0Jc2FrZSBvZiBvbGQgKGUuZy4gUENDKSBjb21waWxlcnMuCi0KLVdlZCBGZWIgMjQgMTk6NDk6MzEgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiAgQnVtcCB0byB2ZXJzaW9uIDIuMS4KLQotRnJpIEZlYiAxMiAwODowOToxMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IGFsbG93IHNlY3Rpb24gdHlwZXMgd2l0aG91dCBhZGRyZXNzICBleHByZXNzaW9ucy4KLQkqIGxkbGFuZy5jIChsYW5nX3JlbG9jYXRlX2dsb2JhbHMpOiBhdm9pZCBwb3NzaWJsZSBoYW5nIHdpdGgKLQl1bmRlZmluZWQgYnV0IHVucmVmZXJlbmNlZCBzeW1ib2xzLgotCSogcmVsYXguYyAocmVsYXhfc2VjdGlvbik6IGRvbid0IGNvbXBsYWluIGlmIHRoZSBzY3JpcHQgZmlsZSBpc24ndAotCXJlbGF4YWJsZSBidXQgLXJlbGF4IGlzIHNldAotCi1UaHUgRmViIDE4IDE3OjU4OjQ1IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBnbzMyIGlzIHRoZSAzcmQgcGFydCBvZiB0aGUgdHJpcGxlLCBub3QgdGhlIDJuZAotCi1XZWQgRmViICAzIDA5OjA1OjU2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwc2JpZy5zaDogTmV3IGZpbGUuICBCaWcgZW5kaWFuIE1JUFMgZW11bGF0aW9uLgotCSogY29uZmlnL21pcHMtYmlnLm10OiBOZXcgZmlsZS4gIFVzZSBtaXBzYmlnIGVtdWxhdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1zZ2ktaXJpeCopOiBVc2UgdGFyZ2V0IG1pcHMtYmlnLgotCSogTWFrZWZpbGUuaW4gKEFMTF9FTVVMQVRJT05TKTogQWRkZWQgZW1fbWlwc2JpZy5vLgotCShlbV9taXBzYmlnLmMpOiBOZXcgdGFyZ2V0LiAgVXNlcyBtaXBzYmlnLnNoLgotCi1UdWUgRmViICAyIDExOjMyOjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbWlwcy5zYy1zaDogUHV0IC5zY29tbW9uIHNlY3Rpb25zIGludG8gLnNic3Mgc2VjdGlvbi4KLQotCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBQcmVzZXJ2ZSBzZWN0aW9uIG9mIGNvbW1vbiBzeW1ib2xzLAotCXJhdGhlciB0aGFuIGFsd2F5cyBwdXR0aW5nIHRoZW0gaW4gYmZkX2NvbV9zZWN0aW9uLgotCSogbGRsYW5nLmMgKGxhbmdfY29tbW9uKTogSWYgYSBjb21tb24gc3ltYm9sIGlzIG5vdCBpbgotCWJmZF9jb21fc2VjdGlvbiwgcHV0IGluIGEgc2VjdGlvbiBvZiB0aGUgc2FtZSBuYW1lLCByYXRoZXIgdGhhbgotCWFsd2F5cyBwdXR0aW5nIGl0IGluIHNlY3Rpb24gQ09NTU9OLgotCi1GcmkgSmFuIDI5IDA5OjU3OjU4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKHN1YmZpbGVfd2FudGVkX3ApOiBJZiB3ZSBhbHJlYWR5IGhhdmUgYSBjb21tb24KLQlkZWZpbml0aW9uIG9mIGEgc3ltYm9sLCBkb24ndCBuZWNlc3NhcmlseSBwdWxsIGluIGFuIG9iamVjdCBmaWxlCi0JdGhhdCBwcm92aWRlcyBhIG5vbi1jb21tb24gZGVmaW5pdGlvbi4KLQotCSogbGRsZXgubCAoQ09NTUFORCk6IEFjY2VwdCAtRUIgYW5kIC1FTCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLAotCXJldHVybmluZyBPUFRJT05fRUIgYW5kIE9QVElPTl9FTC4gIGdjYyBwYXNzZXMgdGhlc2UgdG8gYSBNSVBTCi0JbGlua2VyLgotCSogbGRncmFtLnkgKE9QVElPTl9FQiwgT1BUSU9OX0VMKTogTmV3IHRva2Vucy4KLQkoY29tbWFuZF9saW5lX29wdGlvbik6IEFjY2VwdCBhbmQgaWdub3JlIE9QVElPTl9FQiBhbmQgT1BUSU9OX0VMLgotCi1UaHUgSmFuIDI4IDE1OjEyOjA0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBSZW1vdmUgJCh0b29sZGlyKS9iaW4vZ2xkIGJlZm9yZSBjcmVhdGluZwotCXRoZSBsaW5rIHRvIGl0LgotCi1UdWUgSmFuIDI2IDExOjQ5OjUwIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMsIGxkc3ltLmM6IFVzZSBuZXcgYmZkX2lzX2NvbV9zZWN0aW9uIG1hY3JvIHJhdGhlciB0aGFuCi0JY2hlY2tpbmcgZm9yIGVxdWFsaXR5IHRvIGJmZF9jb21fc2VjdGlvbi4KLQotRnJpIEphbiAyMiAxNDoyMjo0NCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMuc2Mtc2g6IE5ldyBmaWxlLiAgVWx0cml4LCBhbmQgaG9wZWZ1bGx5IG90aGVyIE1JUFMgRUNPRkYKLQl0YXJnZXRzLCBsaW5rZXIgc2NyaXB0LgotCSogbWlwc2xpdC5zaDogTmV3IGZpbGUuICBMaXR0bGUgZW5kaWFuIE1JUFMgZW11bGF0aW9uLgotCSogY29uZmlnL21pcHMtbGl0Lm10OiBOZXcgZmlsZS4gIFVzZSBtaXBzbGl0IGVtdWxhdGlvbi4KLQkqIGNvbmZpZ3VyZS5pbiAobWlwcy1kZWMtdWx0cml4Kik6IFVzZSB0YXJnZXQgbWlwcy1saXQuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0VNVUxBVElPTlMpOiBBZGRlZCBlbV9taXBzbGl0Lm8uCi0JKGVtX21pcHNsaXQuYyk6IE5ldyB0YXJnZXQuICBVc2VzIG1pcHNsaXQuc2guCi0KLVRodSBKYW4gMTQgMTU6MzA6MjcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEluc3RhbGwgbGQgYXMgYm90aCAkKHRvb2xkaXIpL2Jpbi9sZCBhbmQKLQkkKHRvb2xkaXIpL2Jpbi9nbGQsIHNvIHRoYXQgZ2NjIGNhbiBmaW5kIGl0IHdpdGggb3Igd2l0aG91dAotCWNvbGxlY3QyLgotCi1Nb24gSmFuIDExIDE4OjUwOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbGR3cml0ZS5jOiBSZW1vdmVkIHBlcmZvcm1fcmVsb2NhdGlvbiwgY29weV9hbmRfcmVsb2NhdGUsIGFuZAotCXdyaXRlX25vcmVsLiAgQWxsIGxpbmtpbmcgaXMgbm93IGRvbmUgdmlhIHdyaXRlX3JlbGF4LiAgQ2FsbAotCWxkc3ltX3dyaXRlIGJlZm9yZSBjYWxsaW5nIHdyaXRlX3JlbGF4LgotCSogcmVsYXguYzogQWRkZWQgY29weXJpZ2h0LgotCSh3cml0ZV9yZWxheCk6IFJlbmFtZWQgZnJvbSB3cml0ZV9yZWxheG5vcmVsLiAgQWRkZWQgcmVsb2NhdGVhYmxlCi0JYXJndW1lbnQuICBzZWNsZXRfZHVtcCByZW5hbWVkIHRvIGJmZF9zZWNsZXRfbGluay4KLQkqIHJlbGF4Lmg6IEFkZGVkIGNvcHlyaWdodC4KLQotTW9uIEphbiAxMSAxNTo0MTo1NiAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKGRlY29kZV9saWJyYXJ5X3N1YmZpbGUpOiBQYXRjaCBmcm9tCi0JaG9vZ2VuQHNoYWZlci5jcy51dGFoLmVkdSwgZG9uJ3QgcmVyZWFkIGxpYnJhcnkgc3ltYm9sIHRhYmxlcy4KLQotRnJpIEphbiAgOCAxODowNDozMyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy92eHdvcmtzOTYwLm10IHJlbmFtZWQgdG8gY29uZmlnL2k5NjAubXQKLQotCSogY29uZmlndXJlLmluOiBzcGFyYy1hb3V0IGVtdWxhdGVzIGEgc3VuNCwgYXMgZG9lcwotCXNwYXJjKi12eHdvcmtzLCBpOTYwLW5pbmR5IHVzZXMgZ2xkOTYwIGVtdWxhdGlvbgotCi1GcmkgSmFuICA4IDE0OjM5OjA3IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JIEZpeCBzdXBwb3J0IGZvciBOT0xPQUQsIGFkZCBJTkNMVURFCi0JKiBsZGZpbGUuYyAobGRmaWxlX29wZW5fY29tbWFuZF9maWxlKTogcGFzcyBmaWxlIG5hbWUgdG8KLQlsZXhfcHVzaF9maWxlLgotCSogbGRsZXgubCwgbGRncmFtLnk6IHRpZHkgdXAsIHBhcnNlIElOQ0xVREUgYW5kIE5PTE9BRAotCSogbGRsYW5nLmMgKHdpbGRfZG9pdCk6IG1ha2Ugb3V0cHV0IHNlY3Rpb25zIGluaGVyaXQgTkVWRVJfTE9BRAotCWF0dHJpYnV0ZS4KLQotVGh1IEphbiAgNyAxMDoyMjoxOSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcuaDogbm8gbW9yZSBkZWZhdWx0IGVtdWxhdGlvbi4gIE1ha2UgdGhlIGxhY2sKLQlvZiBlbXVsYXRpb24gYSBjb21waWxlIHRpbWUgZXJyb3IKLQotV2VkIEphbiAgNiAwMTowODozNyAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVjb2duaXNlIGFsbCBzcGFyY2xpdGUgdmFyaWFudHMsIG5vdCBqdXN0ICdzcGFyY2xpdGUnCi0KLU1vbiBEZWMgMjggMTE6MTU6MzUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtNjhrY29mZi5zYy1zaDogZGVmaW5lIF9lbmQgYXMgd2VsbCBhcyBlbmQsIGZvciBjb25zaXN0ZW5jeSB3aXRoCi0JYW91dC5zYy1zaC4KLQotCSogY29uZmlndXJlLmluOiBhY2NlcHQgKi1lcmljc3Nvbi1vc2UgZm9yIGFueSBtNjhrIENQVS4KLQotCSogbGR3cml0ZS5jICh3cml0ZV9yZWwpOiBkb24ndCBhbHdheXMgc2V0IFNFQ19IQVNfQ09OVEVOVFMgZmxhZwotCWZvciBlYWNoIG91dHB1dCBzZWN0aW9uLgotCi1Nb24gRGVjIDIxIDE2OjA2OjU5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRleHAuYywgbGRsYW5nLmMsIGxkbWFpbi5jLCBsZHN5bS5jLCBsZHdhcm4uYzogIFVzZSBuZXcKLQltYWNybyBiZmRfYXN5bWJvbF9iZmQgYXMgYXBwcm9wcmlhdGUuCi0JKiBNYWtlZmlsZS5pbjogIFVuLWR1cGxpY2F0ZSBsZGxleC5jIGRlcGVuZGVuY3kuCi0JKiBjb25kaWd1cmUuaW46ICBSZXBsYWNlIG15X2hvc3QgY2FzZSB0YWJsZSBieSBzb3VyY2luZwotCS4uL2JmZC9jb25maWd1cmUuaG9zdC4gIEFsbG93IHN0ZC1ob3N0IGFzIHRoZSBkZWZhdWx0LgotCSogbGRtaXNjLmM6ICBDaGFuZ2UgbG9naWMgZm9yIEMrKyBuYW1lIGRlbWFuZ2xpbmc6ICBUaGVyZSBpcwotCW5vIGluaXRpYWwgJ18nIHRvIHJlbW92ZSBmcm9tIHN0YWItZGVyaXZlZCBmdW5jdGlvbiBuYW1lcy4KLQotU3VuIERlYyAxMyAxNjozMToyNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmMgKGxhbmdfaW5pdF9zY3JpcHRfZmlsZSk6IGRvbid0IGF0dGFjaCB0aGUgb3V0cHV0IGZpbGUKLQlzZWN0aW9ucyB0byB0aGUgc2NyaXB0IGZpbGUuCi0KLVdlZCBEZWMgIDkgMDg6Mzg6MDUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0JKiBsZGxhbmcuYyAod2lsZCk6IHJ1biBleHBhbnNpb24gbG9vcCBvdmVyIGNvbW1hbmQgbGluZSBiZmQgdG9vLgotCShsYW5nX2luaV9zY3JpcHRfZmlsZSk6IGluaXRpYWxpemUgbW9yZSBwYXJ0cyBvZiB0aGUgY29tbWFuZCBsaW5lCi0JYmZkLgotCSogbGRsZXgubDogZml4IERFRklORUQgc3RhcnQgc3RhdGVzLgotCi1Nb24gRGVjICA3IDA4OjQzOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCSAteSBzdXBwb3J0Ci0JKiBsZC50ZXhpbmZvOiBuZXcgZG9jLgotCSogbGRncmFtLnksIGxkbGV4Lmw6IHVuZGVyc3RhbmQgLXk8c3ltYm9sPgotCSogbGRtYWluLmMgKFFfZW50ZXJfZmlsZV9zeW1ib2xzKTogaWYgaGFkIC15LCBsb29rdXAgc3ltYm9sIGFuZAotCXByaW50IGluZm8uIChhZGRfeXN5bSk6IG5ldyBmdW5jdGlvbi4KLQkqIGxkc3ltLmg6IChsZHN5bV90eXBlKTogbmV3IGRlZmluZSBTWU1fWS4KLQotU2F0IE5vdiAyMSAwMzoxNToyNyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGRjdG9yLmgsIGxkZXJyb3IuaCwgbGRleHAuaCwgbGRmaWxlLmgsIGxkaW5kci5oLCBsZGxhbmcuYywKLQlsZGxhbmcuaCwgbGRsZXguaCwgbGRtYWluLmgsIGxkbWlzYy5oLCBsZHN5bS5oLCBsZHZlci5oLCBsZHdhcm4uaCwKLQlsZHdyaXRlLmgsIHJlbGF4Lmg6ICBSZXBsYWNlIGFsbCB1c2VzIG9mIEVYRlVOIGFuZCBQUk9UTyBhbnNpLWdsdWUKLQltYWNyb3Mgd2l0aCBQQVJBTVMuICBSZWNyZWF0aW9uYWwgY2xlYW51cC4gIFVwZGF0ZSBjb3B5cmlnaHRzLgotCi1UdWUgTm92IDEwIDAwOjIzOjM3IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHBhc3MgZG93biB0aGUgYmZkIHNvdXJjZSBkaXJlY3RvcnkgZm9yIGluY2x1ZGVzCi0KLVRodSBOb3YgIDUgMTU6NDE6NTUgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19zaXplX3NlY3Rpb25zKTogZG9uJ3QgY2hhbmdlIHNpemUgYW5kIGFkZHJlc3MgZm9yCi0JU0VDX1NIQVJFRF9MSUJSQVJZIHNlY3Rpb25zIHJhdGhlciB0aGFuIGZvciBTRUNfTkVWRVJfTE9BRAotCXNlY3Rpb25zLgotCi1UaHUgTm92ICA1IDExOjMzOjU3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiByZWxheC5jIChidWlsZF9pdCk6IHJlLWVuYWJsZSB0aGUgcHJvY2Vzc2luZyBvZiBkYXRhX3N0YXRlbWVudHMKLQlpbiBzY3JpcHRzLCBtYWtlcyBjb3VudGVkIGNvbnRydWN0b3IgbGlzdHMgd29yayBhZ2Fpbi4KLQotVGh1IE5vdiAgNSAwNTo0MzowMSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogbGRlbXVsLmg6ICBSZW1vdmUgdXNlcyBvZiBTREVGIGFuZCBQUk9UTyBtYWNyb3MgKHVzZSBQQVJBTVMpLgotCi1UdWUgT2N0IDIwIDEwOjU2OjA2IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4a2NvZmYuc2Mtc2g6IGRvbid0IHVzZSBpbml0aWFsIHVuZGVyc2NvcmVzIGZvciBldGV4dCwgZWRhdGEKLQlhbmQgZW5kLgotCi1Nb24gT2N0IDE5IDA5OjQ1OjM4IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogU3VwcG9ydCBmb3IgaTM4Ni1zeXN2LgotCWNvbmZpZ3VyZS5pbjogY2hlY2sgZm9yIGkzODYtKi1zeXN2KiBhbmQgaTM4Ni0qLXNjbyouCi0JaTM4NmNvZmYuc2Mtc2g6IHJld3JvdGUgdG8gc3VwcG9ydCBTVlIzIGJ5IGRlZmF1bHQuCi0JbGRjdG9yLmMgKGZpbmRfY29uc3RydWN0b3JzKTogcHJlc2VydmUgc3RhdF9wdHIuCi0JbGRsYW5nLmMgKHdpbGRfZG9pdCk6IGluaXRpYWxpemUgdm1hIGFuZCBzaXplIG9mIG5ldyBvdXRwdXQKLQlzZWN0aW9uIHRvIGNvcnJlc3BvbmRpbmcgaW5wdXQgc2VjdGlvbi4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yCi0Jc2hhcmVkIGxpYnJhcnkgc3VwcG9ydC4KLQkobGFuZ19zaXplX3NlY3Rpb25zKTogZG9uJ3QgbW9kaWZ5IHZtYSBhbmQgc2l6ZSBvZiBzZWN0aW9ucyB3aGljaAotCWFyZSBuZXZlciBsb2FkZWQgKGZvciBzaGFyZWQgbGlicmFyaWVzKS4KLQlsZHdyaXRlLmMgKGNvcHlfYW5kX3JlbG9jYXRlKTogY29weSB0aGUgY29udGVudHMgb2YgYW55IHNlY3Rpb24KLQl3aGljaCBoYXMgY29udGVudHMsIG5vdCBqdXN0IHNlY3Rpb25zIHdoaWNoIGFyZSBsb2FkZWQgKGZvciBzaGFyZWQKLQlsaWJyYXJpZXMpLgotCi1UaHUgT2N0IDE1IDE1OjIwOjI2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoc2l6ZV9pbnB1dF9zZWN0aW9uKTogY291bnQgdGhlIHNpemVzIG9mIGFsbCBzZWN0aW9ucwotICAgICAgICB3ZSBhbGxvY2F0ZS4KLQotVGh1IE9jdCAgOCAwOTowNToyNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtaXNjLmMgKGRlbWFuZ2xlLHZmaW5mbyk6IHVzZSB0aGUgbmV3IHVuZGVyc2NvcmUgaW4gYmZkIHRvCi0JdG8gZGVtYW5nbGUgc3ltYm9scyBiZXR0ZXIKLQotVHVlIE9jdCAgNiAxMzowODo1NCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGxkbGFuZy5jIChsYW5nX2ZpbmlzaCk6IGRvbid0IHdhcm4gaWYgLWUgc3RhcnQgc3ltYm9sIGRvZXMgbm90Ci0JZXhpc3Qgd2hlbiBsaW5raW5nIHdpdGggLXIuCi0KLU1vbiBPY3QgIDUgMTQ6MDc6MzcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBhb3V0LnNjLXNoLCBtNjhrY29mZi5zYy1zaDogc2V0IF9fYnNzX3N0YXJ0IHRvIHRoZSBzdGFydCBvZiB0aGUKLQkuYnNzIHNlZ21lbnQuCi0KLU1vbiBPY3QgIDUgMDg6NTU6MTQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChsaW5lYXJfbGlicmFyeSk6IGRvbid0IGV2ZW4gdGhpbmsgYWJvdXQgcHJvY2Vzc2luZwotCWFuIG9iamVjdCBmaWxlIGlmIGl0J3MgYWxyZWFkeSBiZWVuIGRvbmUKLQotVGh1IE9jdCAgMSAyMzoxNDo1OSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdGhlIGhwOTAwMC8zMDAgY29uZmlnIGZpbGUgaXMgbm93IGhwMzAwCi0KLVdlZCBTZXAgMzAgMDc6MzQ6MDkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy96OGtzaW0ubXQ6IG5ldyBmaWxlCi0KLUZyaSBTZXAgMjUgMTM6NDk6NTIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGt5cmlhdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxkZXhwLm8sIGxkY3Rvci5vLCBsZGxhbmcubywgbGRtYWluLm8sIGxkd3JpdGUubywKLQlsZXhzdXAubywgbXJpLm8sIHJlbGF4Lm8pOiBJbmRpY2F0ZSBkZXBlbmRlbmNlIG9uIGxkZ3JhbS5oLgotCi0JKiBsZC5oIChzdHJpcF9zeW1ib2xzX3R5cGUpOiBBZGQgdmFsdWUgU1RSSVBfU09NRS4KLQkqIGxkZ3JhbS55IChPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRSk6IE5ldyB0ZXJtaW5hbCB0b2tlbi4KLQkqIGxkbGFuZy5jIChsYW5nX2FkZF9rZWVwc3ltc19maWxlKTogTmV3IGZ1bmN0aW9uLgotCSogbGRsZXgubDogSGFuZGxlICItcmV0YWluLXN5bWJvbHMtZmlsZSIuCi0JKiBsZHN5bS5jIChrZWVwc3ltc19maWxlLCBrZXB0X3N5bXMpOiBOZXcgdmFycy4KLQkocHJvY2Vzc19rZWVwc3ltcyk6IE5ldyBmdW5jdGlob247IHJlYWRzIGZpbGUsIG1hcmtzIHN5bWJvbHMgZm9yCi0Jc2F2aW5nLgotCSh3cml0ZV9maWxlX2xvY2Fscyk6IEZpbGUgc3ltYm9scyBzaG91bGQgYWx3YXlzIGJlIGtlcHQuCi0JKGxkc3ltX3dyaXRlKTogV2FybiBhYm91dCAiLXJldGFpbi1zeW1ib2xzLWZpbGUiIG92ZXJyaWRpbmcgIi1TIgotCWFuZCAiLXMiLiAgUHJvY2VzcyByZXRhaW4tc3ltYm9scyBmaWxlIGJlZm9yZSBzZXR0aW5nIHN5bXRhYi4KLQkqIGxkc3ltLmggKFNZTV9LRUVQKTogTmV3IGZsYWcgZm9yIGxkc3ltX3R5cGUgZmxhZ3MuCi0JKGtlZXBzeW1zX2ZpbGUsIGtlcHRfc3ltcyk6IERlY2xhcmUgdGhlbS4KLQotCSogbGRtYWluLmMgKG1haW4pOiBOb24tZmF0YWwgZXJyb3JzIHNob3VsZCBzdGlsbCBjYXVzZSBub24temVybwotCWV4aXQgc3RhdHVzIGV2ZW4gd2l0aCAtci4KLQotRnJpIFNlcCAyNSAxMTowODowMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCUFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhlIHo4awotCSogejhrc2ltLmVtLCB6OGtzaW0uc2Mtc2gsIHo4a3NpbS5zaDogbmV3IGZpbGVzCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluOiBtb2RpZmllZCB0byByZWZsZWN0IGFib3ZlCi0KLQkqIGxkbGFuZy5jIChsYW5nX2NoZWNrKTogd2hlbiBsaW5raW5nIGNvbmZsaWN0aW5nIGFyY2hpdGVjdHVyZXMsCi0JbWFrZSB0aGUgb3V0cHV0IGZpbGUgcmVmbGVjdCBhdCBsZWFzdCBvbmUgb2YgdGhlIGJhZCBpbnB1dHMuCi0KLVR1ZSBTZXAgMTUgMTU6MzU6MzggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IGlmICQodG9vbGRpcikgZXhpc3RzLCBpbnN0YWxsIGxkIGluCi0JJCh0b29sZGlyKS9iaW4uCi0KLUZyaSBTZXAgMTEgMTA6MjQ6MjIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IG1vZGlmaWVkIHRvIHN1cHBvcnQgaTM4Ni1jb2ZmCi0JKiBpMzg2Y29mZi5zaDogbmV3IGZpbGUKLQotV2VkIFNlcCAgOSAxMTo1Mjo1OCAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBtNjhrY29mZi5zaCwgbTY4a2NvZmYuc2Mtc2gsIGNvbmZpZy9tNjhrLWNvZmYubXQ6Ci0JYWRkZWQgbTY4ay1jb2ZmIGVtdWxhdGlvbiBtb2RlLCBzdG9sZW4gZnJvbSBhMjlrIGVtdWxhdGlvbi4KLQlBbG1vc3QgY2VydGFpbmx5IHdyb25nLCBidXQgcGVyaGFwcyBiZXR0ZXIgdGhhbiBzdW4zLgotCi1UaHUgU2VwICAzIDE0OjE5OjMwIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIE1ha2VmaWxlLmRvcywgZ2VuZXJpYy5lbSwgZ2Vuc2NyaXB0cy5zaCwKLQlnbGQ5NjAuZW0sIGg4MzAwaG1zLmVtLCBoODMwMHhyYXkuZW0sIGxuazk2MC5lbSwgc3QyMDAwLmVtLAotCXZhbmlsbGEuZW06ICBSZW5hbWUgYWxsIChnZW5lcmF0ZWQpIGxkX18qLmMgZmlsZXMgdG8gZW1fLmMuCi0JVGhpcyBpcyBvbmUgY2hhcmFjdGVyIHNob3J0ZXIsIGFuZCBsZXRzIHBlb3BsZSBidWlsZCBvbgotCVNWUjMgc3lzdGVtLiAobGRfX2g4MzAweHJheS5bY29dIHdhcyB0aGUga2lsbGVyIHRoZXJlOwotCWg4MzAweHJheS5zYy1zaCBpcyBhbHNvIG92ZXJsb25nLCBidXQgc2VlbXMgaGFybWxlc3MuKQotCUJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBKb25hdGhhbiBSeXNocGFuIDxoaXRhY2hpIWFtaXRvIWpvbj4uCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiAgRml4IHR5cG8gbW9zdGNsZWFuIC0+IG1vc3RseWNsZWFuLgotCSogY29uZmlndXJlLmluOiAgQWRkIGhvc3QgaXNjLgotCi0JKiBsZHZlci5jOiAgQ2FsbCBpdCB2ZXJzaW9uIDIuMC4KLQotV2VkIFNlcCAgMiAwMDoyMTozMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBCdW1wIHRvIHZlcnNpb24gMC45OC4KLQkqIFRPRE86ICBOZXcgZmlsZS4KLQotCSogTWFrZWZpbGUuaW46ICBBZGRlZCBtb3N0bHljbGVhbiwgZGlzdGNsZWFuLCByZWFsY2xlYW4gcnVsZXMuCi0KLVR1ZSBTZXAgIDEgMjM6NDI6MTYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYyAoeHJlYWxsb2MpOiAgTmV3IChuZWVkZWQgYnkgLi4vbGliaWJlcnR5L2NwbHVzLmRlbS5jKS4KLQkqIGxkbGV4Lmw6IE1vdmVkIGNvbW1lbnQoKSB0byBlbmQsIHNpbmNlIHNvbWUgY29tcGlsZXJzCi0Jb3RoZXJ3aXNlIGhhdmUgcHJvYmxlbXMgd2l0aCBpbnB1dCgpIHVzZWQgYmVmb3JlIGl0IGlzIGRlZmluZWQuCi0KLVR1ZSBTZXAgIDEgMTc6NDU6NTEgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIFNvbGFyaXMgMiBhbmQgSXJpeCA0IGhvc3Qgc3VwcG9ydC4KLQotTW9uIEF1ZyAzMSAxOToyNzoxMSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgLVMgZmxhZyBmcm9tIHRoZSBGTEVYIGRlZmluaXRpb24KLQotCSogY29uZmlndXJlLmluOiByZXdyb3RlLCB1c2luZyBuZXcgc3R5bGUgY2FzZSBzdGF0ZW1lbnQuICB1c2UKLQltNjhrLm10IGZvciBtNjhrLWFvdXQgc3lzdGVtcwotCi1TdW4gQXVnIDMwIDIxOjM4OjUzIDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG1hcCAibGQiIHRocm91Z2ggcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSB3aGVuCi0JaW5zdGFsbGluZy4KLQotU3VuIEF1ZyAzMCAxODoxMjoxMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgUmVtb3ZlZC4gIFVzZSB0aGUgdmVyc2lvbiBpbiBsaWJpYmVydHkgbm93LgotCSogbGRtaXNjLmM6ICBVc2UgbmV3IGxpYmliZXJ0eSB2ZXJzaW9uIG9mIGNwbHVzX2RlbWFuZ2xlKCkuCi0KLVRodSBBdWcgMjcgMTY6Mzg6NDIgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBnbGQ5NjAuZW0gKGdsZDk2MF9jaG9vc2VfdGFyZ2V0KTogZGVmYXVsdCB0byBsaXR0bGUgZW5kaWFuLCBub3QKLQliaWcgZW5kaWFuLgotCi1XZWQgQXVnIDI2IDE3OjI4OjUxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19wcm9jZXNzKTogZG9uJ3QgcGFzcyBudWxsIHBvaW50ZXJzIHdoZW4KLQlhYnNfb3V0cHV0X3NlY3Rpb24gaXMgd2hhdCBpcyByZXF1aXJlZC4KLQkqIGxkd3JpdGUuYyAobGR3cml0ZSk6IHVzZSBtYWxsb2MgdG8gYWxsb2NhdGUgdGhlIGxhcmdlc3Qgc3BhY2UKLQl1c2VkLCBhbmQgcGFzcyB0aGF0IGRvd24uCi0JKiByZWxheC5jLHJlbGF4LmggKHdyaXRlX3JlbGF4bm9yZWwpOiB1c2UgdGhlIHBhc3NlZCBtYWxsb2MgYXJlYSByYXRoZXIKLQl0aGFuIGFsbG9jYS4KLQotTW9uIEF1ZyAyNCAxNDo0MjowNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL29zZTY4Lm10OiByZW5hbWVkIE9TRSB0byBvc2UuCi0KLVRodSBBdWcgMjAgMTk6NTU6MjIgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIGxkc3ltLmMgKHdyaXRlX2ZpbGVfbG9jYWxzKTogUmVvcmRlciBjaGVjayBmb3IgY29tbW9uIG9yCi0JdW5kZWZpbmVkIHN5bWJvbHMgc28gdGhhdCBpdCB3b3Jrcy4KLQotVHVlIEF1ZyAxOCAxMzo0MTozNiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogYWNjZXB0IGFsbCBtNjhLIGZhbWlseSBtZW1iZXJzLgotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMuCi0KLVRodSBBdWcgMTMgMTE6NDk6MzQgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IG5vdyBwYXJzZXMgY29tbWVudCBjb3JyZWN0bHksIGFkZGVkIH4gdG8gYWNjZXB0YWJsZQotCWNoYXJzIGluIGZpbGVuYW1lcwotCi0JKiBsZGV4cC5jIChleHBfdW5vcCk6IHBhc3MgZG93biBhYnNfb3V0cHV0X3NlY3Rpb24gLSBub3cgY2FuIGhhdmUKLQl1bmFyeSAtdmUgY29uc3RhbnRzLgotCi0JKiBsZGxhbmcuYyAobGFuZ19maW5pc2gpOiB3YXJuIHdoZW4gYW4gZW50cnkgc3ltYm9sIHN1cHBsaWVkIG9uCi0JdGhlIGNvbW1hbmQgbGluZSBjYW4ndCBiZSBmb3VuZC4KLQotRnJpIEF1ZyAgNyAxMjozMToxMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmg6IGFkZCBuZXcgZmllbGQgImxvYWRhYmxlIiB0byBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JKiBsZGxhbmcuYyAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwKTogaW5pdGlsaXplIG5ldwotCWZpZWxkLiAod2lsZF9kb2l0KTogaWYgbmV3IGZpZWxkIGlzIG5vdCBzZXQsIHRoZW4gc3RvcCBvdXRwdXQKLQlzZWN0aW9uIGZyb20gYmVpbmcgbG9hZGFibGUuCi0JKGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTogc2V0IHRoZSBmaWVsZCBmcm9tIHRoZQotCU5PTE9BRCBrZXl3b3JkCi0JKiBsZGdyYW0ueTogbmV3IHN5bmF4IGZvciBOT0xPQUQuIFJlbW92ZXMgYSBzaGlmdC9yZWR1Y2UgdG9vLgotCSogaDgzMDBobXMuc2Mtc2gsIGg4MzAwaG1zLmVtOiBnZXQgLXIgcmlnaHQuCi0KLVRodSBBdWcgIDYgMTg6MzU6MjEgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGludC50ZXhpbmZvOiAgTmV3IGludGVybmFscyBtYW51YWwgKGJlZ2lubmluZ3MgdGhlcmVvZikuCi0JKiBQT1JUSU5HOiAgUmVtb3ZlZCwgbWVyZ2VkIGludG8gbGRpbnQudGV4aW5mby4KLQotVHVlIEF1ZyAgNCAyMToxMjoyOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNkdGVzdC1tYWluLmNjLCBjZHRlc3QtZnVuYy5jYywgY2R0ZXN0LWZvby5oLCBjZHRlc3QtZm9vLmNjLAotCWNkdGVzdC5leHA6ICBBIHRlc3QgcHJvZ3JhbSAoY29waWVkIGZyb20gbGliZysrL3Rlc3QtaW5zdGFsbCkKLQl0aGF0IHRlc3RzIHRoYXQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3JzIGFyZSBoYW5kbGVkCi0JY29ycnJlY3RseS4KLQotTW9uIEF1ZyAgMyAxNDo1ODoxOSAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogaW5zdGFsbCBmcm9tIGxkLm5ldywgcmVuYW1pbmcgZHVyaW5nIHRoZQotCWNvcHksIG9yIGVsc2UgdGhlIG5leHQgJ21ha2UgaW5zdGFsbCcgbmVlZHMgdG8gcmUtbGluayBsZC4KLQotTW9uIEp1bCAyMCAwMzozNzowNiAxOTkyICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogZ2VuZXJhbGlzZSBocCByZWNvZ25pdGlvbiAoZnJvbSBzZWYpLgotCi1TYXQgSnVsIDE4IDE0OjQ2OjA0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgYnNkIGFuZCBocHV4IGhwcGEgY29uZmlndXJhdGlvbnMuCi0JZXJyb3IgbWVzc2FnZXMgZWNobyB0byBzdGRlcnIsIG5vdCBzdGRvdXQKLQotRnJpIEp1bCAxNyAyMjowNjoxMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmRvcywgZ2xkLjEsIGxkLnRleGluZm8sIGxkZW11bC5jLCBsZGZpbGUuYywgbGRsYW5nLmMsCi0JICBsZG1pc2MuYzogcmVtb3ZlZCByY3NpZCdzLgotCi1UdWUgSnVsIDE0IDA4OjM0OjM0IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAobGFuZ19tYXApOiBwcmludCBjaGFuZ2VzIGluIHNpemVzIGR1ZSB0byByZWxheGluZwotCShzaXplX2lucHV0X3NlY3Rpb24pOiBtYWludGFpbiB0aGUgZGVsdGEgaW5mb3JtYXRpb24uCi0JKiBsZGxhbmcuaDogYWRkIG5ldyBmaWVsZCB0byBzdHJ1Y3QgdG8gY29udGFpbiBkZWx0YSBpbmZvLgotCSogcmVsYXguYyAgKHJlbGF4X3NlY3Rpb24pOiBjb21wbGFpbiBpZiBpbnB1dCBub3QgcmVsYXhhYmxlLgotCSogbGRsZXgubCA6IGFkZCAnXycsICcsJyBhbmQgJyQnIHRvIGNoYXJzIHdoaWNoIGNhbiBhcHBlYXIgYXQgdGhlCi0Jc3RhcnQgb2YgYSBmaWxlbmFtZQotCi1Nb24gSnVsIDEzIDE3OjMzOjAwIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyhtYWluKTogcHJldmVudCAtciBhbmQgLXJlbGF4IGZyb20gYmVpbmcgb24gYXQgdGhlIHNhbWUKLQl0aW1lLgotCi1XZWQgSnVsICAxIDE3OjUxOjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZG1haW4uYyAoUV9lbnRlcl9nbG9iYWxfcmVmKSwgbGRpbmRyLmMgKGFkZF9pbmRpcmVjdCk6IGZpeCBmb3IKLQlhbGlhc2luZyBwcm9ibGVtcwotCi0KLVRodSBKdW4gMTggMDk6Mzg6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwaG1zLmVtLCBoODMwMGhtcy5zYy1zaDogIGRvIHRoZSByaWdodCB0aGluZyBmb3IgLXIKLQkqIGxkZXhwLmM6ICBsaW50Ci0JKiBsZGxhbmcuYyhvcGVuX291dHB1dCk6IHNldCB0aGUgdGFyZ2V0IGFyY2ggYW5kIG1hY2hpbmUgYXMgc29vbgotCWFzIHdlIGNhbi4gKGxhbmdfc2l6ZV9zZWN0aW9ucyk6IHVzZSBuZXcgbWFjcm9zIGZvciBzZXR0aW5nIHZtYQotCSogbGR3cml0ZS5jOiBsaW50Ci0KLU1vbiBKdW4gMTUgMDg6NDc6NDMgMTk5MiAgTWljaGFlbCBUaWVtYW5uICAodGllbWFubkBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChteV90YXJnZXQpOiBBY2NlcHQgbTY4MD8wIGZvciB3cnMgYXMgdnh3b3JrczY4LgotCUFsc28gZGVsZXRlZCBhbiB1bnJlYWNoYWJsZSBwYXRoIHRvIHdycy4KLQotV2VkIE1heSAyNyAyMzoyNDoxOSAxOTkyICBNaWNoYWVsIFRpZW1hbm4gICh0aWVtYW5uQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IHVzZSAtZCB0ZXN0IGZvciAkdG9vbGRpciBiZWZvcmUKLQlpbnN0YWxsaW5nIGxkIHRoZXJlIHNvIHRoYXQgJHRvb2xkaXIgY2FuIGJlIGluaGVyaXRlZCBmcm9tCi0JdG9wLWxldmVsIE1ha2VmaWxlLgotCi1XZWQgTWF5IDI3IDE2OjU2OjQ4IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRsYW5nLmM6ICBUd28gbm9uLXN1YnN0YW50aWFsIGNoYW5nZXMgZm9yIHRoZSBzYWtlIG9mCi0JdGhlIG9sZCBQb3J0YWJsZSBDIENvbXBpbGVyLgotCi1XZWQgTWF5IDI3IDE1OjE1OjU4IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgICAgICogbGRncmFtLnksIGxkbGV4Lmw6IHBhcnNlIEFCU09MVVRFCi0JKiBsZGV4cC5jOiBhZGQgc3VwcG9ydCBmb3IgQUJTT0xVVEUKLQotV2VkIE1heSAyNyAxMzowNzoyMCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkZWQgZGVmYXVsdCBkZWZpbml0aW9ucyBmb3IgSE9TVElOR19DUlQwLAotCUhPU1RJTkdfTElCUywgYW5kIEhPU1RJTkdfRU1VLCBiYXNlZCBvbiB0aG9zZSBpbiBjb25maWcvKi5taC4KLQkqIGNvbmZpZy8qLm1oOiAgTWlzY2VsbGFuZW91cyBjbGVhbi11cDogIFJlbW92ZWQgZGVmaW5pdGlvbnMKLQlvZiBZQUNDIChzaW5jZSBpdCBpcyBub3QgbG9uZ2VyIHVzZWQgaW4gdGhlIE1ha2VmaWxlKS4KLQlSZW1vdmUgSE9TVElOR18qIGRlZmluaXRpb25zIHRoYXQgYXJlIHN1YnN1bWVkIGJ5IHRoZQotCW9uZXMgYWRkZWQgdG8gTWFrZWZpbGUuaW4uICBSZW1vdmVkIG1vc3QgZGVmaW5pdGlvbnMgb2YgQ0MuCi0JKiBjb25maWcve3NwYXJjLG5ld3MsaHAzMDBic2QsZGVjc3RhdGlvbn0ubWg6ICBSZW1vdmVkOwotCVRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkLgotCi1GcmkgTWF5IDIyIDEzOjQ3OjE5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFVzZSBzcmNkaXIgaW5zdGVhZCBvZiBWUEFUSCBpbiBsZGdyYW0vbGRsZXgKLQlydWxlcywgc2luY2UgdGhlc2UgYXJlIHVzZWQgd2hlbiBidWlsZGluZyBhIGRpc3RyaWJ1dGlvbi4KLQkqIE1ha2VmaWxlLmluIChsZGxleC5jKTogIERvbid0IHJlLWRpcmVjdCBvdXRwdXQsIHNpbmNlIHRoYXQKLQlsZWF2ZXMgYSBib2d1cyBvdXRwdXQgZmlsZXMgaWYgaXQgZmFpbHMuCi0KLQkqIGNvbmZpZy9zcGFyYy5taDogIEZpeCBIT1NUSU5HX0xJQlMgc28gaXQgaGFzIGEgY2hhbmNlIG9mIHdvcmtpbmcuCi0JKiBsZGxleC5jOiAgRml4IHNvbWUgdW5uZWNlc3NhcnkgZmxleC1zcGVjaWZpYy1pc21zLgotCi1GcmkgTWF5ICA4IDExOjQ5OjQzIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueTogbW92ZSBzcHVyaW91cyBzZW1pY29sb24KLQkqIGxkZXhwLmg6IGZpeCBwcm90b3R5cGUKLQotVGh1IE1heSAgNyAxNzowMToxMiAxOTkyICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaEBmb3dhbnRvbi5jeWdudXMuY29tKQotCi0JKiBsZC50ZXhpbmZvOiByZWZlcmVuY2VzIHRvIGxpbmtlciBub3cgc2F5ICJsZCIgbm90ICJnbGQiLgotCi1XZWQgTWF5ICA2IDEzOjI2OjE5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JY2hhbmdlZCBjYWxsaW5nIGNvbnZlbnRpb24gZm9yIFFfZW50ZXJfZ2xvYmFsX3JlZgotCSogbGRleHAuYywgbGRsYW5nLmMsIGxkbWFpbi5jOiByZWZsZWN0IHRoaXMKLQkqIGxkdmVyLmM6IGJ1bXAgdmVyc2lvbiB0byAxLjk3LjEKLQkqIGxkaW5kci5jIChhZGRfaW5kaXJlY3QpOiB3aGVuIGFuIGVkaWN0IGRlY2xhcmluZyBhbiBpbmRpcmVjdAotCXN5bWJvbCBpcyBmb3VuZCwgbWFrZSBzdXJlIHRoYXQgYW55IGlkZWFzIGFib3V0IHRoZSBzeW1ib2wgYmVpbmcKLQljb21tb24gYXJlIGNoYW5nZWQgaWYgaXQgbm93IGtub3duIHRvIGJlIGRlZmluZWQuCi0JKiBsZG1haW4uYyAobGluZWFyX2xpYnJhcnkpOiBjb21wbGFpbiBvbmNlIGlmIGFyY2hpdmUgaXNuJ3QKLQlyYW5saWJiZWQuCi0JKiBsZGxhbmcuaCwgbGRsYW5nLmM6IG1ha2Ugcm9vbSBmb3IgYW5kIGluaXRpYWxpemUgdGhlIGNvbXBsYWluCi0Jb25jZSBmaWVsZC4KLQotV2VkIE1heSAgNiAxMTowNzozNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB1c2UgZmxleCAmIGJpc29uIGZyb20gLi4vIGlmIHRoZXkgZXhpc3QuCi0KLVR1ZSBNYXkgIDUgMTc6NDc6MzMgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHJlbGF4LmMgKGJ1aWxkX2l0KTogZG9uJ3QgYWxsb2NhdGUgc3BhY2UgaW4gdGhlIG91dHB1dCBmaWxlIGZvcgotCXN0dWZmIGlmIC1SIGZsYWcgYXBwbHlzIHRvIGl0LgotCSogbGRmaWxlLmM6IG1lcmdlIGluIFZNUyBmaWxlbmFtZSBzdXBwb3J0Ci0JKiBsZG1haW4uYyAobWFpbik6IHRha2Ugb3V0IC4vIGZyb20gbGlicmFyeSBwYXRoLCBhbmQgY2xvc2UgZmlsZQotCWJlZm9yZSB1bmxpbmtpbmcuIE1ha2UgbXVsdGlwbGUgZGVmcyBvZiBhIHN5bWJvbCBjcmVhdGUgYW4KLQl1bmV4ZWNhYmxlIGZpbGUuCi0JKiBsZG1pc2MuYzogZmF0YWwgZXJyb3NycyBkZWxldGUgb3V0cHV0IGZpbGUKLQotVHVlIE1heSAgNSAxNDowNTowNSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBJbmNyZWFzZSB2ZXJzaW9uIG51bWJlciB0byAxLjk3LCBmb3IgY29uc2lzdGVuY3kKLQl3aXRoIC4uL2JpbnV0aWxzLgotCi1UdWUgTWF5ICA1IDEyOjEyOjI0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRkxFWCAtPiBMRVguCi0KLQkqIGxkLnRleGluZm86IHt9IC0+IEB7QH0uCi0KLU1vbiBNYXkgIDQgMTc6NTI6NDEgMTk5MiAgUm9sYW5kIEguIFBlc2NoICAocGVzY2hAZm93YW50b24uY3lnbnVzLmNvbSkKLQotCSogbGQudGV4aW5mbzogZGVzY3JpYmUgYWx0ZXJuYXRlLCBNUkktY29tcGF0aWJsZSBsaW5rZXIgc2NyaXB0cwotCShhbmQgYXNzb2NpYXRlZCBjaGFuZ2UgaW4gLWMgb3B0aW9uLCBub3cgdXNlZCBmb3IgdGhlc2Ugc2NyaXB0cykKLQotTW9uIE1heSAgNCAxNjoxMDoxMCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogQnVtcGVkIHZlcnNpb24gdG8gMS45NiAtIG5ldyByZWxlYXNlLCByZXN5bmMgd2l0aCB0aGUKLQliZmQgdG9vICMuCi0JKiBsZGV4cC5jLCBsZGxhbmcuYzogbm93IGJ1aWxkIG1lbW9yeSBzaGFwZSB0cmVlIGluIG9ic3RhY2tzCi0JcmF0aGVyIHRoYW4gd2l0aCByYXcgbWFsbG9jLCBtYWtlcyBpdCBlYXNpZXIgdG8gdHJhY2sgd2hlcmUgbWVtb3J5Ci0JaXMgZ29pbmcuCi0JKiBsZHN5bS5oLCBsZHN5bS5jOiBjcmVhdGUgb2JzdGFjayBmb3IgYWxsIGdsb2JhbCBzeW1ib2xzIHRvby4KLQkqIGxkd3JpdGUuYyAobGR3cml0ZSk6IG1vdmVkIG1hbGxvYyBzbyBvbmx5IHVzZWQgd2hlbiBuZWVkZWQuCi0JKiBzYTI5MjAwLXNjLnNoOiBhZGRlZCBzdXBwb3J0IGZvciAubGl0LCBkYXRhMSBhbmQgZGF0YTIgc2VjdGlvbnMuCi0KLQotRnJpIE1heSAgMSAxODoxNzo1MiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3NwYXJjLm1oOiB1c2UgLi4vZ2NjL2xpYmdjYy5hIG9uIGNoZWNrIGlmIGl0IGV4aXN0cy4KLQotCSogTWFrZWZpbGUuaW46IHVzZSBib290c3RyYXAgZm9yIGNoZWNrLgotCi1GcmkgTWF5ICAxIDEzOjAzOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGdyYW0ueSwgbGRsZXguYywgbXJpLmM6IGFkZGVkIG1vcmUgY29tcGF0aWJsZSB3b3JkczsgQkFTRSwgQUxJQVMgYW5kCi0JUFVCTElDLgotCSogTWFrZWZpbGUuaW46IG5vdyB1c2UgZmxleCwgbm90IGxleAotCSogbGRsZXgubCwgbGRsYW5nLmMsIGxkY3Rvci5jOiBsaW50Ci0KLVdlZCBBcHIgMjIgMTI6NDg6NDIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkbGV4Lmw6IGFkZGVkIENNREZJTEVOQU1FQ0hBUiBzdGF0ZSBzbyB0aGF0IHlvdSBjYW4gbGV4Ci0JZGlmZmVyZW50IHNvcnRzIG9mIGZpbGVuYW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lIHRoYW4gaW4gYSBzY3JpcHQuCi0KLU1vbiBBcHIgMjAgMjI6Mzc6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmV3b3JrIENGTEFHUyBzbyB0aGF0IHRoZXkgY2FuIGJlIHBhc3NlZCBvbiB0aGUKLQkgIG1ha2UgY29tbWFuZCBsaW5lLiAgUmVtb3ZlIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotRnJpIEFwciAxNyAwODo1NzoxNyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVsYXguYzogYWRkZWQgaGFuZGxpbmcgZm9yIG5ldyAicGFkZGluZyIgc2VjbGV0IHR5cGUsIHVzZWQgdG8KLQlmaWxsIG91dCBnYXBzIGJldHdlZW4gc2VjdGlvbi4KLQkqIGxkZ3JhbS55LCBsZGxleC5sOiBub3cgLWRlZnN5bSBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIGRvbmUKLQlwcm9wZXJseS4KLQotV2VkIEFwciAxNSAyMToyMDowNyAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiB0aGUgdG9vbGRpciBjb3B5IG9mIGxkIGdvZXMgZGlyZWN0bHkgaW4gdG9vbGRpci4KLQotV2VkIEFwciAxNSAxNjowOTozMyAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbXJpLmMsIGxkZ3JhbS55LCBsZGxleC5sOiBhZGRlZCBzdXBwb3J0IGZvciBtaW5pbWFsIHN0cmFuZ2UgbGluawotCXNjcmlwdHMuCi0KLVRodSBBcHIgIDkgMDU6NTI6MDIgMTk5MiAgS2VuIFJhZWJ1cm4gIChSYWVidXJuQEN5Z251cy5DT00pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogSW5zdGFsbCBzZWNvbmQgY29weSBpbiAkKHRvb2xkaXIpL2JpbgotCXdpdGhvdXQgJChwcm9ncmFtX3ByZWZpeCksIHNpbmNlIHRoYXQncyB3aGF0IGdjYyBleHBlY3RzLgotCi1TYXQgQXByICA0IDE3OjQ0OjA2IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sLCBsZGdyYW0ueSwgbGRsZXguaDogUmV3cm90ZSBsZXhlci4gTm93IGl0J3MgbXVjaCBuaWNlci4KLQkqIGg4MzAwKjogZml4IGJpdCByb3QgYW5kIGFkZCBzdXBwb3J0IGZvciBoODMwMHhyYXkgdGFyZ2V0Ci0JKiBnbzMyLnNoOiB0YXJnZXQgZW11bGF0aW9uIGZvciBnbzMyLgotCi1Nb24gTWFyIDE2IDE0OjUzOjI5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHJ0bC5jeWdudXMuY29tKQotCi0JKiBnbGQ5NjAuZW0sIGk5NjAuc2Mtc2guIEZpeCBpOTYwIGJpdCByb3QKLQotRnJpIE1hciAxMyAxOTo0NzoyMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGluc3RhbGwgbWFuIHBhZ2UuCi0KLUZyaSBNYXIgMTMgMDg6MjM6NTkgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC08Zm9vPiByZW5hbWVkIHRvIDxmb28+Lm10Ci0JKiBjb25maWcvbWgtPGZvbz4gcmVuYW1lZCB0byA8Zm9vPi5tdAotCSogY29uZmlndXJlLmluIGNoYW5nZWQgdG8gcmVmbGVjdCB0aGlzCi0JKiBnZW5zY3JpcHRzLnNoIG5vdyBtYWtlIC54Ym4gZmlsZXMgcmF0aGVyIHRoYW4gLnhOIGZpbGVzCi0KLVNhdCBNYXIgIDcgMDM6NDA6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmg6IGZpeCBkZWNsIG9mIGxkdmVyc2lvbi4KLQotRnJpIE1hciAgNiAyMjowMDozNSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIGNoZWNrIHRhcmdldC4KLQotRnJpIE1hciAgNiAwNjo1OTowNCAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogbGRtYWluLmMgKFFfZW50ZXJfZmlsZV9zeW1ib2xzKTogbm93IGFsaWFzZXMgd29yayBhZ2FpbgotCi1UaHUgTWFyICA1IDIxOjM5OjI5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWRkZWQgY2xlYW4taW5mbyB0YXJnZXQuCi0KLVRodSBNYXIgIDUgMTY6NTU6NTYgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmMgKGV4cF9wcmludF90cmVlKTogZG9uJ3QgdHJ5IGFuZCBmb2xsb3cgbnVsbCBwb2ludGVycwotCWFyb3VuZC4KLQkqIGxkZ3JhbS55OiByZW1vdmUgMTEgc2hpZnQgcmVkdWNlIGVycm9ycwotCi1UdWUgTWFyICAzIDE1OjQ2OjM5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHRvb2xkaXIgYW5kIHByb2dyYW1fcHJlZml4LgotCi1GcmkgRmViIDI4IDA4OjE3OjQ1IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBsZGxhbmcuYyAoc2l6ZV9pbnB1dF9zZWN0aW9uKTogZG9uJ3QgbW92ZSBhYnNvbHV0ZSBzZWN0aW9ucwotCWFyb3VuZCEKLQotCi1UaHUgRmViIDI3IDA5OjIwOjQxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogeWV0IGFub3RoZXIgY29weSBvZiB0aGlzIC0gbWF5YmUgaXQgc2hvdWxkIGdvIGludG8KLQlsaWJpYmVydHkgPwotCSogbGRncmFtLnk6IG5vdyAtViBhbmQgLXYgaGF2ZSBkaWZmZXJlbnQgYWN0aW9ucwotCSogbGR2ZXIuYzogaWYgLVYsIHByaW50cyBsaXN0IG9mIGVtdWxhdGlvbnMgY29tcGlsZWQgaW4KLQkqIGxkbWlzYy5jOiBzdXBwb3J0IGZvciBjcGx1cyBkZW1hbmdsaW5nCi0KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLVRodSBGZWIgMjAgMTc6NDM6NDYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgQ2hhbmdlIG1rc2NyaXB0IHJ1bGUgaW50byBvbmUgZm9yIC4vbWtzY3JpcHQKLQkoZm9yIHRoZSBzYWtlIG9mIG1ha2VzIHRoYXQgZG9uJ3QgcmVhbGl6ZSB0aGV5J3JlIHRoZSBzYW1lKS4KLQkqIFBPUlRJTkc6ICBBZGQgbW9yZSBkZXRhaWxzLgotCSogZ2Vuc2NyaXB0cy5zaDogIEFkZCBtb3JlIHRhaWxvcmFiaWxpdHkgb2YgREFUQV9BTElHTk1FTlQuCi0KLU1vbiBGZWIgMTcgMTI6MDQ6MzYgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBhbmQgbmV3IGZpbGVzIGhwMzAwYnNkLnNoLCBjb25maWcvbWgtaHAzMDBic2QsCi0JY29uZmlnL210LWhwMzAwYnNkOiAgTmV3IHBvcnQgdG8gaHAzMDAgcnVubmluZyBCU0QuCi0KLVNhdCBGZWIgMTUgMTM6NTk6NTQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQlNYWpvciByZXdyaXRlIG9mIGhvdyBsZCBpcyBjb25maWd1cmVkLiAgVGhlIG1ham9yIGlkZWEKLQlpcyB0byB1c2Ugc2hlbGwgc2NyaXB0cyB0byBnZW5lcmF0ZSBldmVyeXRoaW5nLgotCSogZ2VuZXJpYy5lbSByZXBsYWNlcyBsZHRlbXBsYXRlLgotCSogT3RoZXIgKi5lbSBmaWxlcyByZXBsYWNlIHZhcmlvdXMgKi5jIGZpbGVzLgotCUEgKi5lbSBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgZ2VuZXJhdGVzIHRoZSBjb3JyZXNwb25kaW5nCi0JbGRfXyouYyBmaWxlIHRoYXQgaW1wbGVtZW50cyBhbiBlbXVsYXRpb24uICBUaGlzIGlzIHVzdWFsbHkKLQlhIHN0cmFpZ2h0ICdjYXQnIG9mIGEgaGVyZS1kb2N1bWVudCwgcG9zc2libHkgd2l0aCBzdWJzdGl0dXRpb25zLgotCSogU2NyaXB0IGZpbGVzICgqLnNjKSBhcmUgcGxhY2VzIGJ5ICouc2Mtc2ggc2NyaXB0cy4KLQlBZ2FpbiwgdGhlc2UgYXJlIHNpbXBsZSBzaGVsbCBzY3JpcHRzIHRoYXQgJ2NhdCcKLQloZXJlLWRvY3VtZW50cywgdXN1YWxseSB3aXRoIHNvbWUgc3Vic3RpdHV0aW9ucy4KLQlUaGUgb3V0cHV0IGEgKi5zYy1zaCBpcyBhIHNjcmlwdCBmaWxlLgotCSogRWFjaCBlbXVsYXRpb24gaXMgZGVmaW5lZCBieSBhIHNob3J0IHNoZWxsIHNjcmlwdCB3aXRoCi0JZXh0ZW5zaW9uICouc2ggdGhhdCBzcGVjaWZpZXMgdGhlIGVtdWxhdGlvbi1zcGVjaWZpYwotCXBhcmFtZXRlcnMgKHN1Y2ggYXMgdGhlIG5hbWUgb2YgdGhlICouc2gtc2MgYW5kICouZW0KLQlmaWxlcyB0byB1c2UpLgotCSogZ2Vuc2NyaXB0LnNoIGlzIHRoZSBtYXN0ZXIgc2hlbGwgc2NyaXB0IHVzZWQgdG8gZ2VuZXJhdGUKLQlhbiBlbXVsYXRpb24uICBJdCBpcyBwYXNzZWQgdmFyaW91cyBhcmd1bWVudCwgaW5jbHVkaW5nCi0JdGhlIG5hbWUgYSB0aGUgZW11bGF0aW9uLXNwZWNpaWMgKi5zaCBmaWxlIHRoYXQgaXQKLQkic291cmNlcyIgdG8gc2V0IHZhcmlhYmxlcyB0byBlbXVsYXRpb24tc3BlY2lmYyBwYXJhbWV0ZXJzLgotCSogY29uZmlnL210LWZvbzogIENoYW5nZWQgRU1VTD1HTERGT09fRU1VTEFUSU9OX05BTUUKLQl0byBFTVVMPWZvby4gKFRoZSBHTERGT09fRU1VTEFUSU9OX05BTUVzIGhhdmUgYmVlIHJlbW92ZWQuKQotCSogY29uZmlnL21oLWZvbzogIFJlbmFtZSBMREVNVUxBVElPTiBuYW1lcyBhcyBhcHByb3ByaWF0ZQotCSh1c3VhbGx5ICdnbGRmb28nIC0+IHBsYWluICdmb28nKS4KLQkqIGxkd3JpdGUuYzogIEZpeGVkIGEgdHlwbyBpbiBhIGNvbW1lbnQuCi0JKiBNYWtlZmlsZS5pbjogIE1ham9yIGNoYW5nZXMuICBSZW1vdmVkIHNvbWUgdGhlIHNlZAotCW1hZ2ljIHRvIGNvbnZlcnRzIHNjcmlwdHMsIHNpbmNlIHRoYXQgaXMgbm93IGhhbmRsZWQKLQlieSBnZW5zY3JpcHRzLnNoIGFuZCB0aGUgKi5zYy1zaCBzY2lwdCBnZW5lcmF0b3JzLgotCSogY29uZmlnLmg6ICBSZW1vdmUgYSBidW5jaCBvZiBtYWNyb3MgZGVmaW5pbmcgZW11bGF0aW9ucwotCWFuZCB0YXJnZXRzLiAgVGhpcyBiZWNvbWVzIG9uZSBsZXNzIGZpbGUgdG8gZWRpdCB3aGVuCi0JYWRkaW5nIGVtdWxhdGlvbnMgb3IgdGFyZ2V0cy4KLQkqIGxkZW11bC5oIChzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0KTogIEFkZAotCWVtdWxhdGlvbl9uYW1lIGFuZCB0YXJnZXRfbmFtZSBmaWVsZHMuCi0JKiBsZGVtdWwuYywgbGRlbXVsLmg6ICBEZWZpbmUgc29tZSBkZWZhdWx0IGZ1bmN0aW9ucyB1c2VkCi0JYnkgbW9zdCBlbXVsYXRpb25zIChhbmQgcmVtb3ZlIGZyb20gdGhlICouZW0gc2NyaXB0cykuCi0JKiBsZGVtdWwuYyAobGRlbXVsX2Nob29zZV90YXJnZXQpOiAgU2VhcmNoIHRoZSBuZXcKLQlsZF9lbXVsYXRpb25zIGFycmF5IHVzaW5nIGEgbG9vcCAoaW5zdGVhZCBvZiBhIGhhcmR3aXJlZAotCW5lc3RlZCBpZiBzdGF0ZW1lbnQpLgotCURlZmluZSB0aGUgbGRfZW11bGF0aW9uIGZyb20gdGhlIGF1dG9tYXRpY2FsbHktZ2VlbnJhdGVkCi0JbGRlbXVsLWxpc3QuaC4gIFRoaXMgbWVhbnMgeW91IG5vIGxvbmdlciBoYXZlIHRvIGVkaXQgbGRlbXVsLmMKLQl0byBhZGQgYSBuZXcgZW11bGF0aW9uLgotCSogbGRtYWluLmM6ICBSZXBsYWNlIHtHTEQsTE5LfTk2MF9FTVVMQVRJT05fTkFNRSBieQotCXRoZWlyIGV4cGFuc2lvbnMsIHNpbmNlIHRoZSBmb3JtZXIgbm8gbG9uZ2VyIGV4aXN0LgotCSogUE9SVElORzogIEEgdmVyeSByb3VnaCBmaXJzdCBkcmFmdCBvZiBhIHBvcnRpbmcgZ3VpZGUuCi0KLQkqIGxkZ3JhbS55LCBsZGxleC5sLCBsZXhzdXAuYzogQ2hhbmdlcyB0byBhbGxvdyBhbiBhc3NpZ25tZW50Ci0JdG8gYmUgdGVybWluYXRlZCBieSBhIG5ldy1saW5lIChpbnN0ZWFkIG9mIHJlcXVpcmluZyBhIHNlbWljb2xvbikuCi0KLU1vbiBGZWIgMTAgMTY6MjE6MDIgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmMsIGxkbGFuZy5jOiBhZGRlZCBuZXcgaWRlYSAiYWJzX291dHB1dF9zZWN0aW9uIiwgcmVtb3ZlcwotCXRlc3RzIGZvciBOVUxMIHBvaW50ZXJzIGFsbCBvdmVyIHRoZSBwbGFjZS4KLQkqIGxkbGFuZy5jIChsYW5nX3Byb2Nlc3MpOiByZW1lbWJlciB0byByZWxvY2F0ZSBnbG9iYWwgc3ltYm9scwotCSphZnRlciogcmVsYXhpbmcgaGFzIGRvbmUgaXQgc3R1ZmYuCi0KLVRodSBGZWIgIDYgMTE6NDA6MTUgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC1jb2ZmLWg4MzAwOiB1c2UgRU1VTCBsaWtlIGV2ZXJ5dGhpbmcgZWxzZQotCSogbGRsYW5nLmM6IChwcmludF9wYWRkaW5nX3N0YXRlbWVudCk6IHByaW50IHRoZSByaWdodCBhZGRyZXNzLgotCSogTWFrZWZpbGUuaW4sIGNvbmZpZy5oLCBsZGVtdWwuYzogcmVuYW1lZCAgaDgzMDBoZHMgdG8gaDgzMDBobXMKLQotCi1UdWUgRmViICA0IDE1OjI4OjAxIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZGxleC5sOiBQdXQgcGFjayAtbm9pbmhpYml0LWV4ZWMgYW5kIC1zb3J0LWNvbW1vbgotCSogbGRsYW5nLmMgKHByaW50X2RhdGFfc3RhdGVtZW50KTogcHJpbnQgdGhlIHJpZ2h0IGFkZHJlc3MuCi0KLVRodSBKYW4gMzAgMTc6NTE6NTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgVGhlIHJ1bGUgZm9yIHRlc3RpbmcgbGQgYnkgcmUtbGlua2luZyBpdHNlbGYKLQl2aWEgYW4gaW50ZXJtZWRpYXRlIC1yIGxpbmsgd2FzIG1vdmVkIHRvIHRoZSBsZDEgcnVsZQotCWluc3RlYWQgb2YgdGhlIGxkMiBydWxlLiAgVGhpcyBhbGxvd3MgbGQyIGFuZCBsZDMgdG8gYmUgaWRlbnRpY2FsLAotCXdoaWNoIGFsbG93cyB0aGUgYm9vdHN0cmFwIHJ1bGUgdG8gd29yay4KLQkqIGxkY3Rvci5jIChmaW5kX2NvbnN0cnVjdG9ycyk6ICBEb24ndCBjcmVhdGUgYSBjb25zdHJ1Y3RvcgotCWxpc3QgaWYgaXQgaXMgYWxyZWFkeSBkZWZpbmVkIChhcyB3b3VsZCBoYXBwZW4gaWYgbGQgaXMKLQlpbnZva2VkIGJ5IGNvbGxlY3QpLgotCi1XZWQgSmFuIDI5IDA4OjM1OjM5IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3BhcmMuaDogbm93IHVzZXMgbGliZ2NjLmEKLQkqIGxkbWFpbi5jOiBxdWl0IHVzaW5nIGV4aXQKLQkqICpzYzogdXNlICooQ09NTU9OKSByYXRoZXIgdGhhbiBbQ09NTU9OXQotCSogbGRsZXgubCwgbGV4c3VwLmM6IG11Y2ggdGhpbmtpbmcgbW92ZWQgZnJvbSAubCBhbmQgcHV0IGludG8gLmMsCi0JdG8gYWxsb3cgcHJlcHJvY2Vzc2luZyBvZiAubCBmaWxlLgotCSogTWFrZWZpbGUuaW46IE5ldyBsZGxleC5sIG1hbmdsaW5nCi0JKiBsZGV4cC5jIChmb2xkX2JpbmFyeSk6IHBlcmZvcm0gZXhwcmVzc2lvbnMgd2l0aCAlIGFuZCAvIGluCi0JaW50ZWdlci4KLQkqIGxkZmlsZS5jIChvcGVuX2EpOiBvcGVuIGFyY2hpdmVzIG9uIFZNUyBpbiBhIHNwZWNpYWwgd2F5Ci0KLQotVHVlIEphbiAyOCAxMDoxODoxNiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRncmFtLnk6IG1hcCAtTSBiZWhhdmUgaW4gdGhlIHNhbWUgd2F5IGFzIC1NYXAgKHNldHMgZmlsZSBuYW1lCi0JdG8gYmUgIi0iLgotCSogbGRzeW0uYywgbGRsYW5nLmM6IHJlbWVtYmVyIHRoYXQgc2l6ZSBvZiBhIHNlY3Rpb24gaXMgZGVwZW5kZW50IG9uCi0Jd2hldGhlciBvciBub3QgcmVsYXhpbmcgaGFzIGJlZW4gZG9uZS4KLQkqIGxkbWFpbi5jOiBkb24ndCBvcGVuIGEgbWFwIGZpbGUgaWYgaXQgZG9lc24ndCBoYXZlIGEgbmFtZQotCSogcmVsYXguYzogYWxsIHRoZSBicmFpbnMgaGF2ZSBtb3ZlZCBpbnRvIGJmZC4KLQkqIGxkd3JpdGUuYzogYW1tZW5kIGNvbW1lbnQKLQotRnJpIEphbiAyNCAxNDoyMzo0NiAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZGVkIHJlbGF4LCBhbHNvIG1hZGUgdGhyZWUgc3RhZ2UgZ28gdGhyb3VnaCBhCi0JcGFydGlhbCBsaW5rIHN0YWdlLgotCSogcmVsYXguYyA6IGFkZGVkCi0JKiBjb25maWcuaDogaWYgR05VOTYwIGRlZmluZWQsIHRoZW4gZGVmYXVsdCBlbXVsYXRpb24gbW9kZSBpcwotCUdMRDk2MAotCSogbGRleHAuaCwgbGRleHAuYzogbWFwIHRvIGZpbGUgaG9va3MKLQkqIGxkbGFuZy5jOiBtYXAgdG8gZmlsZSBob29rcwotCSogbGRncmFtLnk6IGFkZGVkIC1NYXAgLXJlbGF4Ci0JKiBsZGxleC5sOiBhZGRlZCAtcmVsYXgsIC1NYXAKLQkqIGxkbWFpbi5jOiBvcGVuIG1hcCBmaWxlCi0JKiBsZG1pc2MuYzogc3VwcG9ydCBmb3IgbWFwIGZpbGUKLQkqIGxkd3JpdGUuYzogbmV3IHJlbGF4IG1hZ2ljCi0KLVRodSBEZWMgMTkgMTg6NDk6NTEgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcvdG0tKi5oOiAgQ2xlYW4gdXAgbWFrZSBvdXRwdXQsIG9ubHkKLQlwYXNzIERFRkFVTFRfRU1VTEFUSU9OIHRvIGxkbWFpbi5jLgotCi1XZWQgRGVjIDE4IDE1OjAyOjQ3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZHZlci5jOiAgQnVtcCB0byB2ZXJzaW9uIDEuOTQuCi0KLVR1ZSBEZWMgMTAgMDQ6MDc6MjMgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaW5mb2RpciBiZWxvbmdzIGluIGRhdGFkaXIuCi0KLU1vbiBEZWMgIDkgMTY6MjY6NDMgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUGFzcyAteSB0byBiaXNvbi4gIChBZ2FpbjsKLQlhY2NpZGVudGFsbHkgZGVsZXRlZCBieSBSaWNoLikKLQkqIG5ld3Muc2MsIGxkZ2xkNjhrLnNjOiAgRGVmaW5lIF9fZW5kIGFzIHdlbGwgYXMgX2VuZC4KLQotU2F0IERlYyAgNyAxNzoxOToyNiAxOTkxICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhYyBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogbGRpbmRyLmg6IGFkZGVkIHRvIGNvbnRhaW4gcHJvdG90eXBlcyBvZiBsZGluZHIuYwotCSogbGRmaWxlLmM6IGluY2x1ZGUgY3R5cGUuaAotCSogbGRtYWluLmM6IGluY2x1ZGUgdGhlIHJlcXVyaWVkIHByb3RvdHlwZSBoZWFkZXJzCi0JKiBsZHdyaXRlLmM6IGdldF9yZWxvY191cHBlcl9ib3VuZCBoYXMgYmVlbiByZW5hbWVkCi0JYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZAotCi1GcmkgRGVjICA2IDIzOjI5OjI2IDE5OTEgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaCBhdCBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHB1bnQgImZ1bmRhbWVudGFsIiBtb2RlIGJlY2F1c2UgaXQgYnJlYWtzIG15IGVtYWNzCi0JICBtYWNyb3MuICBpbnN0YWxsIHVzaW5nIElOU1RBTExfUFJPR1JBTSBhbmQgSU5TVEFMTF9EQVRBLiAgcmVtb3ZlCi0JICBzcGFjZXMgZm9sbG93aW5nIGh5cGhlbnMsIGJzZCBtYWtlIGNhbid0IGNvcGUuICBhZGRlZAotCSAgc3RhbmRhcmRzLnRleHQgc3VwcG9ydCBhbmQgbWFkZSBpdCBsb29rIGxpa2UgYWxsIHRoZSBvdGhlcgotCSAgbWFrZWZpbGVzLgotCi0JKiBjb25maWd1cmUuaW46IGNvbmZpZ3VyZSBub3cgcnVucyBlbnRpcmVseSBpbiBvYmpkaXIgc28gbWFrZSBmaWxlCi0JICBleGlzdGVuY2UgY2hlY2tzIGFnYWluc3QgJHtzcmNkaXJ9LiAgTWFyayB0aGlzIGRpcmVjdG9yeSBhcwotCSAgdGFyZ2V0IGRlcGVuZGVudC4KLQotVGh1IERlYyAgNSAyMjo0NjoxNiAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpZGVzdGRpciBhbmQgZGRlc3RkaXIgZ28gYXdheS4gIEFkZGVkIGNvcHlyaWdodHMKLQkgIGFuZCBzaGlmdCBncGwgdG8gdjIuICBBZGRlZCBDaGFuZ2VMb2cgaWYgaXQgZGlkbid0IGV4aXN0LiBkb2NkaXIKLQkgIGFuZCBtYW5kaXIgbm93IGtleWVkIG9mZiBkYXRhZGlyIGJ5IGRlZmF1bHQuCi0KLVdlZCBEZWMgIDQgMjM6MzY6NTUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmM6ICBCdW1wZWQgdmVyc2lvbiB0byAxLjkzLgotCSogTWFrZWZpbGUuaW46ICBQYXNzIC15IHRvIGJpc29uLgotCi1Nb24gTm92IDI1IDE4OjI4OjQwIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy5oOiBoOCBpcyBub3cgY29mZiwgbm90IGllZWUKLQkqIGg4MzAwaGRzLnNjOiByZWZsZWN0IHRoZSBzYW1lCi0KLVRodSBOb3YgMTQgMTk6NTU6MDkgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkdmVyLmMgKGxkdmVyc2lvbigpKTogIFVwZGF0ZSB0byAxLjkyLgotCSogbGRjdG9yLmM6IFRoZXJlIGFyZSB0d28gcGxhY2VzIGNvbnN0cnVjdG9yIHNldHMKLQljYW4gYmUgZGVmaW5lZC4gIE9uZSBvZiB0aGVtIGNoZWNrZWQgZm9yIGFuIGV4aXN0aW5nCi0JZHVwbGljYXRlLCB0aGUgb3RoZXIgZGlkbid0LiAgVW5mb3J0dW5hdGVseSwgdGhlIGxhdHRlcgotCXdhcyBjYWxsZWQgYWZ0ZXIgdGhlIGZvcm1lciAuLi4KLQlTbywgZmFjdG9yIG91dCBjb2RlIGZvciBpbnNlcnRpbmcgYSBuZXcgZWxlbWVudCBpbnRvCi0JY29uc3RydWN0b3JfbmFtZV9saXN0IChhZnRlciBjaGVja2luZyBmb3IgYSBkdXBsaWNhdGUpCi0JaW50byBhIG5ldyBmdW5jdGlvbiBhZGRfY29uc3RydWN0b3JfbmFtZSwgYW5kIGNhbGwKLQlpdCBmcm9tIGJvdGggYWZvcmVtZW50aW9uZWQgcGxhY2VzIChsZGxhbmdfYWRkX2NvbnN0cnVjdG9yCi0JYW5kIGxkbGFuZ19jaGVja19mb3JfY29uc3RydWN0b3JzKS4KLQotV2VkIE5vdiAxMyAxNToxNzo0MyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZW5hbWUgLmMgZmlsZXMgZ2VuZXJhdGVkIGZyb20gbGR0ZW1wbGF0ZQotCXRvIGhhdmUgbmFtZXMgc3RhcnRpbmcgd2l0aCBsZF9fLiAgVGhpcyBoZWxwcyAnbWFrZSBjbGVhbicuCi0KLVR1ZSBOb3YgMTIgMTg6MzY6NTAgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFRha2Ugb3V0IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgaW5zdGFsbAotCSogbTg4a2Jjcy5zYzogcHV0IGluIGNvbnRydWN0b3IgYmxvY2tzLgotCi1Nb24gTm92IDExIDE4OjQ3OjMzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBsZG1pc2MuYywgbGRtaXNjLmg6ICBSZS13cml0ZSBpbmZvKCkgdG8gdGFrZSBhIGZpbGVuYW1lCi0JcGFyYW1ldGVyLCBhIGZvcm1hdCwgYW5kIGFuIGFyZyBwb2ludGVyLCBhbmQgcmVuYW1lIGl0IHRvCi0JdmZpbmZvKCkuICBXcml0ZSBpbmZvKCkgaW4gdGVybXMgb2YgbmV3IHZmaW5mbygpLgotCU5ldyBlaW5mbygpIGlzIHRoZSBzYW1lIGFzIGluZm8oKSwgZXhjZXB0IGl0IHdyaXRlcyB0byBzdGRlcnIuCi0JKiBsZGVtdWwuYywgbGRleHAuYywgbGRsYW5nLmMsIGxkbG5rOTYwLmMsIGxkbWFpbi5jLCBsZHdyaXRlLmMsCi0JbGRtaXNjLmM6ICBSZXBsYWNlICJlcnJvciIgY2FsbHMgdG8gaW5mbygpIGJ5IG5ldyBlaW5mbygpLgotCi1Nb24gTm92IDExIDA5OjU3OjMyIDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogbGRsZXgubCBsZGdyYW0ueTogbWFkZSAtViBvcHRpb24gZG8gc2FtZSBhcyAtdgotCSogTWFrZWZpbGUuaW46IEFkZGVkICQoTUlOVVNfRykgZmxhZyBzbyBkZWJ1Z2dpbmcgY2FuIGJlCi0JdHVybmVkIG9mZgotCi1TdW4gTm92ICAzIDE2OjM3OjM3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQkgaTM4NiBhb3V0IGNoYW5nZXMgZnJvbSBCb2IgS3VrdXJhCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnLmg6IGFkZGVkIGkzODZhb3V0IHN1cHBvcnQKLQkqIGNvbmZpZ3VyZS5pbjogZml4ZWQgL2gte215aG9zdH0gdHlwbwotCSogbGRncmFtLnk6IC1NTSBub3cgZ2l2ZXMgbW9yZSBib3JpbmcgbWFwLgotCSogbGRsYW5nLmM6IG5vdyBkb2VzIERfUEFHRUQgZmxhZyB0aGUgcmlnaHQgd2F5LgotCSogbGRzeW0uYzogLU1NIGZsYWdzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgotCi1TdW4gTm92ICAzIDE1OjAwOjAzIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBGaXhlZCB0eXBvLiAgQWxzbywgYSBmaXggZm9yIGhwMzAwYnNkLgotCSogbGRsYW5nLmMgKGluaXRfb3MpOiAgQ29tcGVuc2F0ZSBmb3IgQkZEIGNoYW5nZSwKLQl3aGVyZSBiZmRfbWFrZV9zZWN0aW9uIG5vdyByZXR1cm5zIE5VTEwgZm9yIGEgZHVwbGljYXRlCi0Jc2VjdGlvbiByZXF1ZXN0LCBpbnN0ZWFkIG9mIHRoZSBvbGQgc2VjdGlvbi4KLQotVGh1IE9jdCAxNyAxNToyNzoxMyAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR2ZXIuYzogQnVtcCB0byB2ZXJzaW9uIDEuOTEgKGNvbnNpc3RlbnQgd2l0aCBiaW51dGlscykuCi0KLVdlZCBPY3QgMTYgMTI6Mjc6MDggMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcuaCwgbGQuaCwgbGRlbXVsLmMsIGxkZXhwLmMsIGxkZXhwLmgsCi0JbGRncmFtLnksIGxkbGV4LmwsIGxkbG5rOTYwLmMsIGxkbWFpbi5jLCBsZG1pc2MuYywgbGRtaXNjLmgsCi0JbGRzeW0uYywgbGRzeW0uaCwgbGR0ZW1wbGF0ZSwgbGR2YW5pbGxhLmMsIGxkdmVyLmMsIGxkdmVyLmgsCi0JbGR3YXJuLmMsIGxkd2Fybi5oLCBsZHdyaXRlLmMsIGxkd3JpdGUuaCwgbWtzY3JpcHQuYzoKLQlBZGQgb3IgdXBkYXRlIGNvcHlyaWdodCBub3RpY2VzLgotCi1Nb24gT2N0IDE0IDIzOjU1OjI3IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBSRUFETUU6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2VkIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgbmFtZSBzY2hlbWUKLQl0byBiZSBjb25zaXN0ZW50IHdpdGggZ2NjLiAgQWxzbyBjaGFuZ2VkICdpbnN0YWxsJy4KLQotTW9uIE9jdCAxNCAxNzozMDowMiAxOTkxICBSb2xhbmQgSC4gUGVzY2ggIChwZXNjaCBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogbmV3IHRhcmdldHMgbGQubW0sIGxkLm1lCi0KLU1vbiBPY3QgMTQgMTc6Mjc6MjQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBsZHRlbXBsYXRlOiAgTmVlZCB0byB1c2Ugc2VwYXJhdGUgc2NyaXB0cwotCWZvciAtbiBhbmQgLU4gb3B0aW9ucy4gIFlldCBtb3JlIGNvbXBsaWNhdGlvbi4KLQotRnJpIE9jdCAxMSAyMjo0MDo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBBdm9pZCB1c2luZyAkPCBpbiBleHBsaWNpdCBNYWtlIHJ1bGVzIChpdCBkb2Vzbid0Ci0Jd29yaykuICBBZGQgc29tZSBsaW5lcyB0byBhdm9pZCBTdW4gTWFrZSBWUEFUSCBidWdzLgotCi1GcmkgT2N0IDExIDE2OjQyOjIyIDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiBuZXdzLnNjOiBBZGQgYWxpZ25tZW50IGZvciBkYXRhIHNlZ21lbnQuCi0JKiBsZHRlbXBsYXRlOiBBZGQgKHlldCBhbm90aGVyKSBzY3JpcHQgdG8gZ2V0IGZvciAtbiBvciAtTgotCW9wdGlvbnMuICAoVGhlc2UgbmVlZCBkaWZmZXJlbnQgYWxpZ25tZW50IHRoYW4gWk1BR0lDIGZpbGVzLikKLQkqIE1ha2VmaWxlLmluOiAgQWRkIHN0dWZmIGZvciBuZXcgZm9vLnhuIHNjcmlwdHMuCi0JVGhlc2UgYXJlIGdlbmVyYXRlZCBieSByZXBsYWNpbmcgIkFMSUdOKDB4Li4uMDApIiBieSAiLiIuCi0KLUZyaSBPY3QgMTEgMTU6NDM6MDQgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IG5ldyB0YXJnZXRzIGxkLm1zLCBsZC1pbmRleC5tcwotCWxkLnRleGluZm86IHJlbW92ZSB0YWJzLCBvdGhlciBjbGVhbnVwcyBmb3IgdGV4aTJyb2ZmCi0KLUZyaSBPY3QgMTEgMTM6NTE6NTQgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkbWFpbi5jIChtYWluKTogTWFrZSBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkIGJlIHRydWUKLQlieSBkZWZhdWx0LiAgRG9uJ3QgdGhlIFdQX1RFWFQgYW5kIERfUEFHRUQgZmxhZ3Mgb2YKLQlvdXRwdXRfYmZkIGhlcmU7IGl0J3MgdG9vIGxhdGUsIHNvIHNldCBpdCB3aGVuIG91dHB1dF9iZmQKLQlpcyBjcmVhdGVkIChpbiBsZGxhbmcuYykuICBBbHNvIGZpeCBzZXR0aW5nIG9mIEVYRUNfUCBmbGFnCi0JKiBsZGxhbmcuYyAobGRsYW5nX29wZW5fb3V0cHV0KTogIFNldCBvdXRwdXRfYmZkLT5mbGFncyBoZXJlLgotCSogbGRsYW5nLmM6IFJlbW92ZSBzb21lIGR1cGxpY2F0ZSBleHRlcm4gZGVjbGFyYXRpb25zLgotCSogbGRncmFtLnk6IEZpeGVzIHRvIC1OIGFuZCAtbiBvcHRpb25zLgotCSogTWFrZWZpbGUuaW46ICBSZWNvZ25pemUgdXBwZXIgY2FzZSBsZXR0ZXJzIGluIHNlZCBzY3JpcHQKLQl0byByZW1vdmUgYXNzaWdubWVudHMgZnJvbSBzY3JpcHQgZmlsZXMuCi0JKiBsZHRlbXBsYXRlOiAgRG9uJ3QgYXNzdWttZSB0aGF0IC1OIG9yIC1uIG9wdGlvbnMKLQlpbXBseSB1c2Ugb2YgLXIgc2NyaXB0LgotCSogbWtzY3JpcHQuYzogIFR3ZWFraW5nIHRvIGNvcnJlY3RseSBoYW5kbGUgXG4gYW5kIFxcIGluIGlucHV0LgotCi1GcmkgT2N0IDExIDEwOjI5OjI3IDE5OTEgIFN0ZXZlIENoYW1iZXJsYWluICAoc3RldmUgYXQgY3lnbnVzLmNvbSkKLQotCSogbGR0ZW1wbGF0ZTogaW5jbHVkZSBiZmQuaCBiZWZvcmUgc3lzZGVwLmguCi0KLUZyaSBPY3QgMTEgMDQ6MjQ6NDUgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSZXN0cnVjdHVyZSBjb25maWd1cmF0aW9uIHNjaGVtZSBmb3IgYmZkLCBiaW51dGlscywgbGQuCi0KLQkqIGluY2x1ZGUvc3lzL2gtKi5oOiAgTW92ZSB0byBiZmQvaG9zdHMvaC0qLmguCi0JKiBjb25maWd1cmUuaW46ICBSZXZpc2UgdG8gc3ltbGluayBzeXNkZXAuaCB0byAuLi9iZmQvaG9zdHMvaC14eHguaC4KLQlDaGFuZ2Ugc29tZSBjb25maWcgbmFtZXMgdG8gbWF0Y2ggb3RoZXIgZGlycy4KLQkqICouYzogIEluY2x1ZGUgYmZkLmggYmVmb3JlIHN5c2RlcC5oLCBzbyBhbnNpZGVjbCBhbmQgUFJPVE8oKQotCWdldCBkZWZpbmVkIGZpcnN0LgotCSogY29uZmlnLzogIFJlbmFtZSBzb21lIGNvbmZpZyBmaWxlcyB0byBtYXRjaCB1cCBoLSouaCBuYW1lcy4KLQlSZW1vdmUgYWxsIHRoZSBIT1NUX1NZUyBkZWZpbml0aW9ucyBmcm9tIHRoZSBjb25maWcgZmlsZXMuCi0KLVR1ZSBPY3QgIDggMTY6MDA6NTcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIGxkZXhwLmgsIGxkbGFuZy5oOiBDaGFuZ2UgZW51bSBib29sZWFuIC0+IGVudW0gYmZkX2Jvb2xlYW4uCi0JKiBsZHRlbXBsYXRlOiBSZW1vdmUgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggY2FsbHM7Ci0JanVzdCB1c2UgdGhlIFNFQVJDSF9ESVIgY29tbWFuZHMgaW4gdGhlIHNjcmlwdCBmaWxlcy4KLQkqIE1ha2VmaWxlLmluOiBBZGQgTElCX1BBVEggbWFjcm8sIHdoaWNoIGlmIHNldCBpcyB1c2VkIHRvIHJlcGxhY2UKLQl0aGUgU0VBUkNIX0RJUiBjb21tYW5kcyBpbiB0aGUgc2NyaXB0cyAodXNpbmcgdWdseSBzZWQgbWFnaWMpLgotCVRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkIGZvciBjcm9zcy1saW5raW5nLCB3aGVyZSB5b3Ugd291bGQKLQlwbGFjZSBsaWJhcmllcyBpbiBhIGRpZmZlcmVudCBwbGFjZSB0aGFuIG5hdGl2ZSBsaWJyYXJpZXMuCi0JQWxzbywgZW11bGF0aW9ucyBtYWRlIGZyb20gbGR0ZW1wbGF0ZSBub3cgdXNlICQoc3JjZGlyKS4KLQkqIGxkZ2xkYTI5ay5zYzogIENoYW5nZSBTRUFSQ0hfRElSIGNvbW1hbmRzIHRvIGEgY29udmVudGlvbmFsCi0JZm9ybTsgcGVvcGxlIGNhbiB1c2UgdGhlIE1ha2VmaWxlJ3MgTElCX1BBVEggdG8gb3ZlcnJpZGUuCi0KLVR1ZSBPY3QgIDggMTQ6NTE6MjEgMTk5MSAgUm9sYW5kIEguIFBlc2NoICAocGVzY2ggYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGZpeCB0YXJnZXQgbGQuZHZpLCBhZGQgdGFyZ2V0IGxkLmluZm8KLQlsZC50ZXhpbmZvOiBtYWtlIGluZm8gZmlsZW5hbWUgbGQuaW5mbwotCi1GcmkgT2N0ICA0IDIxOjUxOjU4IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEF2b2lkIHVzaW5nICQ8IGluIG5vbi1zdWZmaXggcnVsZXMgKGJyZWFrcyBvbiBTdW4KLQlNYWtlKS4KLQkqIGxkZmlsZS5jLCBsZGxhbmcuYywgbGRtYWluLmMsIGxkd3JpdGUuYzogIENvcGUgd2l0aCByZW5hbWVzIG9mIGEKLQlmZXcgQkZEIHR5cGVzICYgZW51bXMuCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IGNoYW5nZS1sb2cKLWxlZnQtbWFyZ2luOiA4Ci1maWxsLWNvbHVtbjogNzQKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2xkL01ha2VmaWxlLmFtIGIvbGQvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmI1MWYuLjAwMDAwMDAKLS0tIGEvbGQvTWFrZWZpbGUuYW0KKysrIC9kZXYvbnVsbApAQCAtMSw4NzEgKzAsMCBAQAotIyMgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvbWFrZSB0byBnZW5lcmF0ZSBNYWtlZmlsZS5pbgotCi0jIyBGSVhNRTogd29yayBhcm91bmQgYXBwYXJlbnQgYXV0b21ha2UgYnVnLgotSU5UTExJQlMgPSBASU5UTExJQlNACi0KLUFVVE9NQUtFX09QVElPTlMgPSBjeWdudXMgZGVqYWdudQotCi1TVUJESVJTID0gcG8KLQotdG9vbGRpciA9ICQoZXhlY19wcmVmaXgpLyQodGFyZ2V0X2FsaWFzKQotCi1ZQUNDID0gYGlmIFsgLWYgLi4vYmlzb24vYmlzb24gXSA7IHRoZW4gZWNobyAuLi9iaXNvbi9iaXNvbiAteSAtTCQoc3JjZGlyKS8uLi9iaXNvbi8gOyBlbHNlIGVjaG8gYmlzb24gLXkgOyBmaWAKLVlGTEFHUyA9IC1kCi1MRVggPSBgaWYgWyAtZiAuLi9mbGV4L2ZsZXggXSA7IHRoZW4gZWNobyAuLi9mbGV4L2ZsZXggOyBlbHNlIGVjaG8gZmxleCA7IGZpYAotCi0jIFdlIHB1dCB0aGUgc2NyaXB0cyBpbiB0aGUgZGlyZWN0b3J5ICQoc2NyaXB0ZGlyKS9sZHNjcmlwdHMuCi0jIFdlIGNhbid0IHB1dCB0aGUgc2NyaXB0cyBpbiAkKGRhdGFkaXIpIGJlY2F1c2UgdGhlIFNFQVJDSF9ESVIKLSMgZGlyZWN0aXZlcyBuZWVkIHRvIGJlIGRpZmZlcmVudCBmb3IgbmF0aXZlIGFuZCBjcm9zcyBsaW5rZXJzLgotc2NyaXB0ZGlyID0gJCh0b29sZGlyKS9saWIKLQotRU1VTCA9IEBFTVVMQAotRU1VTEFUSU9OX09GSUxFUyA9IEBFTVVMQVRJT05fT0ZJTEVTQAotRU1VTF9FWFRSQV9PRklMRVMgPSBARU1VTF9FWFRSQV9PRklMRVNACi0KLSMgU2VhcmNoIHBhdGggdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIC1sZm9vIGxpYnJhcmllcy4KLSMgSWYgTElCX1BBVEggaXMgZW1wdHksIHRoZSBvbmVzIGluIHRoZSBzY3JpcHQgKGlmIGFueSkgYXJlIGxlZnQgYWxvbmUuCi0jIChUaGUgZGVmYXVsdCBpcyB1c3VhbGx5IC9saWI6L3Vzci9saWI6L3Vzci9sb2NhbC9saWIsIHVubGVzcyBidWlsZGluZwotIyBhIGNyb3NzLWxpbmtlciwgaW4gd2hpY2ggY2FzZSB0aGUgZGVmYXVsdCBpcyBlbXB0eS4gIFNlZSBnZW5zY3JpcHRzLnNoLikKLSMgT3RoZXJ3aXNlLCB0aGV5IGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbmVzIGdpdmVuIGluIExJQl9QQVRILAotIyB3aGljaCBtYXkgaGF2ZSB0aGUgZm9ybTogTElCX1BBVEg9L2xpYjovdXNyL2xvY2FsL2xpYgotTElCX1BBVEggPQotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSCT0gJChCQVNFRElSKS9pbmNsdWRlCi1ERVAgPSBta2RlcAotCi0jIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHRvIGJ1aWxkCi1ET0NWRVIgPSBnZW4KLQotI3N0dWZmIGZvciBzZWxmIGhvc3RpbmcgKGNhbiBiZSBvdmVycmlkZGVuIGluIGNvbmZpZyBmaWxlKS4KLUhPU1RJTkdfQ1JUMCA9IEBIT1NUSU5HX0NSVDBACi1IT1NUSU5HX0xJQlMgPSBASE9TVElOR19MSUJTQAotSE9TVElOR19FTVUgPSAtbSAkKEVNVUwpCi0KLSMgU2V0dXAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLCBpZiB5b3UgaGF2ZSBvbmUKLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyBcCi0JdGhlbiBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotUlVOVEVTVCA9IGBpZiBbIC1mICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCBdIDsgXAotCXRoZW4gZWNobyAkJHtzcmNyb290fS8uLi9kZWphZ251L3J1bnRlc3QgOyBcCi0JZWxzZSBlY2hvIHJ1bnRlc3QgOyBmaWAKLQotUlVOVEVTVEZMQUdTID0KLQotQ0NfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENDKTsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyBnY2MgfCBzZWQgJyQodHJhbnNmb3JtKSc7IFwKLSAgICBmaTsgXAotICBmaWAKLQotQ1hYID0gZ2NjCi1DWFhfRk9SX1RBUkdFVCA9IGAgXAotICBpZiBbIC1mICQkci8uLi9nY2MveGdjYyBdIDsgdGhlbiBcCi0gICAgaWYgWyAtZiAkJHIvLi4vbmV3bGliL01ha2VmaWxlIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy8gLWlkaXJhZnRlciAkJHIvLi4vbmV3bGliL3RhcmctaW5jbHVkZSAtaWRpcmFmdGVyICQke3NyY3Jvb3R9Ly4uL25ld2xpYi9saWJjL2luY2x1ZGUgLW5vc3RkaW5jOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvOyBcCi0gICAgZmk7IFwKLSAgZWxzZSBcCi0gICAgaWYgWyAiQGhvc3RAIiA9ICJAdGFyZ2V0QCIgXSA7IHRoZW4gXAotICAgICAgZWNobyAkKENYWCk7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gZ2NjIHwgc2VkICckKHRyYW5zZm9ybSknOyBcCi0gICAgZmk7IFwKLSAgZmlgCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGxkLW5ldwotaW5mb19URVhJTkZPUyA9IGxkLnRleGluZm8KLW5vaW5zdF9URVhJTkZPUyA9IGxkaW50LnRleGluZm8KLW1hbl9NQU5TID0gbGQuMQotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAkKEhERUZJTkVTKSAkKENGTEFHUykgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotQUxMX0VNVUxBVElPTlMgPSBcCi0JZWEyOWsubyBcCi0JZWFpeHBwYy5vIFwKLQllYWl4cnM2Lm8gXAotCWVhbHBoYS5vIFwKLQllYXJjZWxmLm8gXAotCWVhcm1lbGYubyBcCi0JZWFybWVsZl9vYWJpLm8gXAotCWVhcm1lbGZfbGludXgubyBcCi0JZWFybWVsZl9saW51eDI2Lm8gXAotCWVhcm1hb3V0Yi5vIFwKLQllYXJtYW91dGwubyBcCi0JZWFybWNvZmYubyBcCi0JZWFybXBlLm8gXAotCWVjb2ZmX3NwYXJjLm8gXAotCWVkMTB2ZWxmLm8gXAotCWVkMzB2ZWxmLm8gXAotCWVkMzB2X2UubyBcCi0JZWQzMHZfby5vIFwKLQllZGVsdGE2OC5vIFwKLQllZWJtb24yOWsubyBcCi0JZWVsZjMyX3NwYXJjLm8gXAotCWVlbGYzMl9pOTYwLm8gXAotCWVlbGYzMmI0MzAwLm8gXAotCWVlbGYzMmJtaXAubyBcCi0JZWVsZjMyZWJtaXAubyBcCi0JZWVsZjMyZWxtaXAubyBcCi0JZWVsZjMybDQzMDAubyBcCi0JZWVsZjMybG1pcC5vIFwKLQllZWxmMzJscHBjLm8gXAotCWVlbGYzMnBwYy5vIFwKLQllZWxmMzJwcGNsaW51eC5vIFwKLQllZWxmX2kzODYubyBcCi0JZWVsZl9pMzg2X2JlLm8gXAotCWVnbGQ5NjAubyBcCi0JZWdsZDk2MGNvZmYubyBcCi0JZWVsZjMyZnIzMC5vIFwKLQllZWxmMzJtY29yZS5vIFwKLQllZ28zMi5vIFwKLQllaDgzMDAubyBcCi0JZWg4MzAwaC5vIFwKLQllaDgzMDBzLm8gXAotCWVoODUwMC5vIFwKLQllaDg1MDBiLm8gXAotCWVoODUwMGMubyBcCi0JZWg4NTAwbS5vIFwKLQllaDg1MDBzLm8gXAotCWVocDMwMGJzZC5vIFwKLQllaHAzaHB1eC5vIFwKLQllaHBwYWVsZi5vIFwKLQllaTM4NmFvdXQubyBcCi0JZWkzODZiZW9zLm8gXAotCWVpMzg2YnNkLm8gXAotCWVpMzg2Y29mZi5vIFwKLQllaTM4NmdvMzIubyBcCi0JZWkzODZsaW51eC5vIFwKLQllaTM4Nmx5bngubyBcCi0JZWkzODZtYWNoLm8gXAotCWVpMzg2bW9zcy5vIFwKLQllaTM4Nm1zZG9zLm8gXAotCWVpMzg2bmJzZC5vIFwKLQllaTM4Nm53Lm8gXAotCWVpMzg2cGUubyBcCi0JZWxuazk2MC5vIFwKLQllbTY4azRrbmJzZC5vIFwKLQllbTY4a2FvdXQubyBcCi0JZW02OGthdXgubyBcCi0JZW02OGtjb2ZmLm8gXAotCWVtNjhrZWxmLm8gXAotCWVtNjhrbGludXgubyBcCi0JZW02OGtseW54Lm8gXAotCWVtNjhrbmJzZC5vIFwKLQllbTY4a3Bzb3MubyBcCi0JZW04OGtiY3MubyBcCi0JZW1jb3JlcGUubyBcCi0JZW1pcHNiaWcubyBcCi0JZW1pcHNic2QubyBcCi0JZW1pcHNpZHQubyBcCi0JZW1pcHNpZHRsLm8gXAotCWVtaXBzbGl0Lm8gXAotCWVtaXBzbG5ld3MubyBcCi0JZW5ld3MubyBcCi0JZW5zMzJrbmJzZC5vIFwKLQllcGM1MzJtYWNoYS5vIFwKLQllcHBjbWFjb3MubyBcCi0JZXBwY253Lm8gXAotCWVwcGNwZS5vIFwKLQllcmlzY2l4Lm8gXAotCWVzYTI5MjAwLm8gXAotCWVzaC5vIFwKLQllc2hlbGYubyBcCi0JZXNobGVsZi5vIFwKLQllc2hsLm8gXAotCWVzcGFyY2FvdXQubyBcCi0JZXNwYXJjbGludXgubyBcCi0JZXNwYXJjbHlueC5vIFwKLQllc3BhcmNuYnNkLm8gXAotCWVzdDIwMDAubyBcCi0JZXN1bjMubyBcCi0JZXN1bjQubyBcCi0JZXRpYzMwYW91dC5vIFwKLQlldGljMzBjb2ZmLm8gXAotCWV0aWM4MGNvZmYubyBcCi0JZXZhbmlsbGEubyBcCi0JZXZheC5vIFwKLQlldnN0YS5vIFwKLQlldzY1Lm8gXAotCWV6ODAwMS5vIFwKLQllejgwMDIubwotCi1BTExfNjRfRU1VTEFUSU9OUyA9IFwKLQllZWxmNjRfc3BhcmMubyBcCi0JZWVsZjY0YWxwaGEubwotCi1BTExfRU1VTF9FWFRSQV9PRklMRVMgPSBcCi0JcGUtZGxsLm8gXAotCWRlZmZpbGVwLm8KLQotQ0ZJTEVTID0gbGRjdG9yLmMgbGRlbXVsLmMgbGRleHAuYyBsZGZpbGUuYyBsZGxhbmcuYyBcCi0JbGRtYWluLmMgbGRtaXNjLmMgbGR2ZXIuYyBsZHdyaXRlLmMgbGV4c3VwLmMgXAotCW1yaS5jIGxkY3JlZi5jIHBlLWRsbC5jCi0KLUhGSUxFUyA9IGxkLmggbGRjdG9yLmggbGRlbXVsLmggbGRleHAuaCBsZGZpbGUuaCBcCi0JbGRsYW5nLmggbGRsZXguaCBsZG1haW4uaCBsZG1pc2MuaCBsZHZlci5oIFwKLQlsZHdyaXRlLmggbXJpLmggZGVmZmlsZS5oCi0KLUdFTkVSQVRFRF9DRklMRVMgPSBsZGdyYW0uYyBsZGxleC5jIGRlZmZpbGVwLmMKLUdFTkVSQVRFRF9IRklMRVMgPSBsZGdyYW0uaCBsZGVtdWwtbGlzdC5oIGRlZmZpbGVwLmgKLQotT0ZJTEVTID0gbGRncmFtLm8gbGRsZXgubyBsZXhzdXAubyBsZGxhbmcubyBtcmkubyBsZGN0b3IubyBsZG1haW4ubyBcCi0JbGR3cml0ZS5vIGxkZXhwLm8gIGxkZW11bC5vIGxkdmVyLm8gbGRtaXNjLm8gXAotCWxkZmlsZS5vIGxkY3JlZi5vICR7RU1VTEFUSU9OX09GSUxFU30gJHtFTVVMX0VYVFJBX09GSUxFU30KLQotU1RBR0VTVFVGRiA9ICoubyBsZHNjcmlwdHMvKiBlKi5jCi0KLSMgQXQgdGhlIG1vbWVudCB0aGlzIGlzIGp1c3QgYSBsaXN0IG9mIHRob3NlIGVtdWxhdGlvbiB0ZW1wbGF0ZSBmaWxlcwotIyB0aGF0IGNvbnRhaW4gaW50ZXJuYXRpb25hbGlzZWQgc3RyaW5ncy4KLUVNVUxBVElPTl9GSUxFUyA9IGVtdWx0ZW1wbC9wZS5lbSBlbXVsdGVtcGwvYXJtY29mZi5lbQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChFTVVMQVRJT05fRklMRVMpCi0KLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLWxkbWFpbi5vOiBsZG1haW4uYyBjb25maWcuc3RhdHVzCi0JJChDT01QSUxFKSAtYyAtRERFRkFVTFRfRU1VTEFUSU9OPSciJChFTVVMKSInIC1EU0NSSVBURElSPSciJChzY3JpcHRkaXIpIicgLURUQVJHRVQ9JyJAdGFyZ2V0QCInICQoc3JjZGlyKS9sZG1haW4uYwotCi1sZGVtdWwtbGlzdC5oOiBNYWtlZmlsZQotCShlY2hvICIvKiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuICBETyBOT1QgRURJVCEgKi8iO1wKLQlmb3IgZiBpbiBgZWNobyAiICIgJHtFTVVMQVRJT05fT0ZJTEVTfSAiIiBcCi0JIHwgc2VkIC1lICdzLyBlLyBsZC9nJyAtZSAncy8gbGQvIC9nJyAtZSAncy9bLl1vLy9nJ2A7IGRvIFwKLQkgICAgZWNobyAiZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfJCR7Zn1fZW11bGF0aW9uOyI7IFwKLQlkb25lO1wKLQllY2hvICIiO1wKLQllY2hvICIjZGVmaW5lIEVNVUxBVElPTl9MSVNUIFxcIjtcCi0JZm9yIGYgaW4gYGVjaG8gIiAiICR7RU1VTEFUSU9OX09GSUxFU30gIiIgXAotCSB8IHNlZCAtZSAncy8gZS8gbGQvZycgLWUgJ3MvIGxkLyAvZycgLWUgJ3MvWy5dby8vZydgOyBkbyBcCi0JICAgIGVjaG8gIiAgJmxkXyQke2Z9X2VtdWxhdGlvbiwgXFwiOyBcCi0JZG9uZTtcCi0JZWNobyAiICAwIikgPmxkZW11bC10bXAuaAotCW12IGxkZW11bC10bXAuaCBsZGVtdWwtbGlzdC5oCi0KLSMgVGhlc2UgYWxsIHN0YXJ0IHdpdGggZSBzbyAnbWFrZSBjbGVhbicgY2FuIGZpbmQgdGhlbS4KLQotR0VOU0NSSVBUUyA9ICQoU0hFTEwpICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoICR7c3JjZGlyfSAke2xpYmRpcn0gQGhvc3RAIEB0YXJnZXRAIEB0YXJnZXRfYWxpYXNAICJARU1VTEFUSU9OX0xJQlBBVEhAIiAiQE5BVElWRV9MSUJfRElSU0AiCi1HRU5fREVQRU5EUyA9ICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoICQoc3JjZGlyKS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZAotQFRESVJTQAotCi1lYTI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hMjlrLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hMjlrLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhMjlrICIkKHRkaXJfYTI5aykiCi1lYWl4cHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FpeHBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFpeHBwYyAiJCh0ZGlyX2FpeHBwYykiCi1lYWl4cnM2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FpeHJzNi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFpeHJzNiAiJCh0ZGlyX2FpeHJzNikiCi1lYWxwaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYWxwaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FscGhhLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhbHBoYSAiJCh0ZGlyX2FscGhhKSIKLWVhcmNlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJjZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFyY2VsZiAiJCh0ZGlyX2FyY2VsZikiCi1lYXJtZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZiAiJCh0ZGlyX2FybWVsZikiCi1lYXJtZWxmX29hYmkuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZl9vYWJpLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9vYWJpICIkKHRkaXJfYXJtZWxmKSIKLWVhcm1lbGZfbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtZWxmX2xpbnV4ICIkKHRkaXJfYXJtZWxmX2xpbnV4KSIKLWVhcm1lbGZfbGludXgyNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eDI2ICIkKHRkaXJfYXJtZWxmX2xpbnV4MjYpIgotZWFybWFvdXRiLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWFvdXRiLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1hb3V0YiAiJCh0ZGlyX2FybWFvdXRiKSIKLWVhcm1hb3V0bC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0bC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtYW91dGwgIiQodGRpcl9hcm1hb3V0bCkiCi1lYXJtY29mZi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1jb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hcm1jb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1jb2ZmICIkKHRkaXJfYXJtY29mZikiCi1lYXJtcGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtcGUgIiQodGRpcl9hcm1wZSkiCi1lY29mZl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGNvZmZfc3BhcmMgIiQodGRpcl9jb2ZmX3NwYXJjKSIKLWVkMTB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QxMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQxMHZlbGYgIiQodGRpcl9kMTB2KSIKLWVkMzB2ZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGQzMHZlbGYgIiQodGRpcl9kMzB2KSIKLWVkMzB2X28uYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9vLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X28gIiQodGRpcl9kMzB2KSIKLWVkMzB2X2UuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZDMwdl9lLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2X2UgIiQodGRpcl9kMzB2KSIKLWVkZWx0YTY4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2RlbHRhNjguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGRlbHRhNjggIiQodGRpcl9kZWx0YTY4KSIKLWVlYm1vbjI5ay5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lYm1vbjI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVibW9uMjlrICIkKHRkaXJfZWJtb24yOWspIgotZWVsZjMyZnIzMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZnIzMCAiJCh0ZGlyX2ZyMzApIgotZWVsZjMybWNvcmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJtY29yZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJtY29yZSAiJCh0ZGlyX21jb3JlKSIKLWVtMzJyZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL20zMnJlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTMycmVsZiAiJCh0ZGlyX20zMnIpIgotZWVsZjMyX3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMl9zcGFyYyAiJCh0ZGlyX2VsZjMyX3NwYXJjKSIKLWVlbGYzMl9pOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyX2k5NjAgIiQodGRpcl9lbGYzMl9pOTYwKSIKLWVlbGYzMmI0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYjQzMDAgIiQodGRpcl9lbGYzMmI0MzAwKSIKLWVlbGYzMmJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmJtaXAgIiQodGRpcl9lbGYzMmJtaXApIgotZWVsZjMyYnNtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJic21pcCAiJCh0ZGlyX2VsZjMyYnNtaXApIgotZWVsZjMyZWJtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlYm1pcCAiJCh0ZGlyX2VsZjMyZWJtaXApIgotZWVsZjMyZWxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJlbG1pcCAiJCh0ZGlyX2VsZjMyZWxtaXApIgotZWVsZjMybDQzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJsNDMwMCAiJCh0ZGlyX2VsZjMybDQzMDApIgotZWVsZjMybG1pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybG1pcCAiJCh0ZGlyX2VsZjMybG1pcCkiCi1lZWxmMzJscHBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybHBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJscHBjICIkKHRkaXJfZWxmMzJscHBjKSIKLWVlbGYzMmxzbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybHNtaXAgIiQodGRpcl9lbGYzMmxzbWlwKSIKLWVlbGYzMnBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMnBwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJwcGMgIiQodGRpcl9lbGYzMnBwYykiCi1lZWxmMzJwcGNsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMnBwY2xpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmcHBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMnBwY2xpbnV4ICIkKHRkaXJfZWxmMzJwcGNsaW51eCkiCi1lZWxmNjRhbHBoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NGFscGhhICIkKHRkaXJfZWxmNjRhbHBoYSkiCi1lZWxmNjRfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRfc3BhcmMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjY0X3NwYXJjICIkKHRkaXJfZWxmNjRfc3BhcmMpIgotZWVsZl9pMzg2LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZl9pMzg2LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGZfaTM4NiAiJCh0ZGlyX2VsZl9pMzg2KSIKLWVlbGZfaTM4Nl9iZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGZfaTM4Nl9iZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmX2kzODZfYmUgIiQodGRpcl9lbGZfaTM4Nl9iZSkiCi1lZ2xkOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dsZDk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBnbGQ5NjAgIiQodGRpcl9nbGQ5NjApIgotZWdsZDk2MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ2xkOTYwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2xkOTYwYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ2xkOTYwY29mZiAiJCh0ZGlyX2dsZDk2MGNvZmYpIgotZWdvMzIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZ28zMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ28zMiAiJCh0ZGlyX2dvMzIpIgotZWg4MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDAgIiQodGRpcl9oODMwMCkiCi1laDgzMDBoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4MzAwaC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDBoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODMwMGggIiQodGRpcl9oODMwMGgpIgotZWg4MzAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMHMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDBzICIkKHRkaXJfaDgzMDBzKSIKLWVoODUwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwICIkKHRkaXJfaDg1MDApIgotZWg4NTAwYi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMGIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwYi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBiICIkKHRkaXJfaDg1MDBiKSIKLWVoODUwMGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwYyAiJCh0ZGlyX2g4NTAwYykiCi1laDg1MDBtLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwbS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBtLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMG0gIiQodGRpcl9oODUwMG0pIgotZWg4NTAwcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMHMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBzICIkKHRkaXJfaDg1MDBzKSIKLWVocDMwMGJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDMwMGJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHAzMDBic2QgIiQodGRpcl9ocDMwMGJzZCkiCi1laHAzaHB1eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocDNocHV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocDNocHV4ICIkKHRkaXJfaHAzaHB1eCkiCi1laHBwYWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9ocHBhZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9ocHBhZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9ocHBhZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBocHBhZWxmICIkKHRkaXJfaHBwYWVsZikiCi1laTM4NmFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZhb3V0ICIkKHRkaXJfaTM4NmFvdXQpIgotZWkzODZiZW9zLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZiZW9zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9iZW9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmJlb3MgIiQodGRpcl9pMzg2YmVvcykiCi1laTM4NmJzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YnNkICIkKHRkaXJfaTM4NmJzZCkiCi1laTM4NmNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2Y29mZiAiJCh0ZGlyX2kzODZjb2ZmKSIKLWVpMzg2Z28zMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2Z28zMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmdvMzIuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZnbzMyICIkKHRkaXJfaTM4NmdvMzIpIgotZWkzODZsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bGludXggIiQodGRpcl9pMzg2bGludXgpIgotZWkzODZseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2bHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nmx5bnggIiQodGRpcl9pMzg2bHlueCkiCi1laTM4Nm1hY2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1hY2guc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtYWNoICIkKHRkaXJfaTM4Nm1hY2gpIgotZWkzODZtb3NzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtb3NzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtb3NzICIkKHRkaXJfaTM4Nm1vc3MpIgotZWkzODZtc2Rvcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZtc2Rvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm1zZG9zICIkKHRkaXJfaTM4Nm1zZG9zKSIKLWVpMzg2bmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm5ic2QgIiQodGRpcl9pMzg2bmJzZCkiCi1laTM4Nm53LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bncgIiQodGRpcl9pMzg2bncpIgotZWkzODZwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2cGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NnBlICIkKHRkaXJfaTM4NnBlKSIKLWVsbms5NjAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbG5rOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9sbms5NjAuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGxuazk2MCAiJCh0ZGlyX2xuazk2MCkiCi1lbTY4azRrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrNGtuYnNkICIkKHRkaXJfbTY4azRrbmJzZCkiCi1lbTY4a2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthb3V0ICIkKHRkaXJfbTY4a2FvdXQpIgotZW02OGthdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2F1eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2F1eCAiJCh0ZGlyX202OGthdXgpIgotZW02OGtjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2NvZmYgIiQodGRpcl9tNjhrY29mZikiCi1lbTY4a2VsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrZWxmICIkKHRkaXJfbTY4a2VsZikiCi1lbTY4a2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtsaW51eCAiJCh0ZGlyX202OGtsaW51eCkiCi1lbTY4a2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGtseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbHlueCAiJCh0ZGlyX202OGtseW54KSIKLWVtNjhrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a25ic2QgIiQodGRpcl9tNjhrbmJzZCkiCi1lbTY4a3Bzb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wc29zLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrcHNvcyAiJCh0ZGlyX202OGtwc29zKSIKLWVtODhrYmNzLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL204OGtiY3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG04OGtiY3MgIiQodGRpcl9tODhrYmNzKSIKLWVtY29yZXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21jb3JlcGUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3BlLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9wZS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWNvcmVwZSAiJCh0ZGlyX21jb3JlcGUpIgotZW1pcHNiaWcuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNiaWcuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNiaWcKLWVtaXBzYnNkLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHNic2Quc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNic2QKLWVtaXBzaWR0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL21pcHNlY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2lkdCAiJCh0ZGlyX21pcHNpZHQpIgotZW1pcHNpZHRsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNpZHRsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHRsICIkKHRkaXJfbWlwc2lkdGwpIgotZW1pcHNsaXQuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsaXQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsaXQgIiQodGRpcl9taXBzbGl0KSIKLWVtaXBzbG5ld3MuYzogICQoc3JjZGlyKS9lbXVscGFyYW1zL21pcHNsbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbWlwcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbWlwc2xuZXdzCi1lbW4xMDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtbjEwMzAwICIkKHRkaXJfbW4xMDMwMCkiCi1lbW4xMDIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tbjEwMjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtbjEwMjAwICIkKHRkaXJfbW4xMDIwMCkiCi1lbmV3cy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9uZXdzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBuZXdzICIkKHRkaXJfbmV3cykiCi1lbnMzMmtuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL25zMzJrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbnMzMmtuYnNkICIkKHRkaXJfbnMzMmtuYnNkKSIKLWVwYzUzMm1hY2hhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBjNTMybWFjaGEgIiQodGRpcl9wYzUzMm1hY2hhKSIKLWVwcGNtYWNvcy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNtYWNvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYWl4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9haXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY21hY29zICIkKHRkaXJfcHBjbWFjb3MpIgotZXBwY253LmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY253LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbncuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY253ICIkKHRkaXJfcHBjbncpIgotZXBwY3BlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3BwY3BlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHBjcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHBwY3BlICIkKHRkaXJfcHBjcGUpIgotZXJpc2NpeC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9yaXNjaXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHJpc2NpeCAiJCh0ZGlyX3Jpc2NpeCkiCi1lc2EyOTIwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zYTI5MjAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzYTI5MjAwICIkKHRkaXJfc2EyOTIwMCkiCi1lc2guYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2guc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3NoLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzaCAiJCh0ZGlyX3NoKSIKLWVzaGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hlbGYgIiQodGRpcl9zaGVsZikiCi1lc2hsZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobGVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hsZWxmICIkKHRkaXJfc2hsZWxmKSIKLWVzaGwuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hsLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2hsICIkKHRkaXJfc2hsKSIKLWVzcGFyY2FvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2FvdXQgIiQodGRpcl9zcGFyY2FvdXQpIgotZXNwYXJjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbGludXguZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbGludXggIiQodGRpcl9zcGFyY2xpbnV4KSIKLWVzcGFyY2x5bnguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbHlueCAiJCh0ZGlyX3NwYXJjbHlueCkiCi1lc3BhcmNuYnNkLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNuYnNkICIkKHRkaXJfc3BhcmNuYnNkKSIKLWVzdDIwMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3QyMDAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN0MjAwMCAiJCh0ZGlyX3N0MjAwMCkiCi1lc3VuMy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zdW4zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9zdW5vcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3VuMyAiJCh0ZGlyX3N1bjMpIgotZXN1bjQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuNC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjQgIiQodGRpcl9zdW40KSIKLWV0aWMzMGFvdXQuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzMwYW91dCAiJCh0ZGlyX3RpYzMwYW91dCkiCi1ldGljMzBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGNvZmYgIiQodGRpcl90aWMzMGNvZmYpIgotZXRpYzgwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWM4MGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljODBjb2ZmICIkKHRkaXJfdGljODBjb2ZmKSIKLWV2YW5pbGxhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZhbmlsbGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3ZhbmlsbGEuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZhbmlsbGEgIiQodGRpcl92YW5pbGxhKSIKLWV2YXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdmF4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YXggIiQodGRpcl92YXgpIgotZXZzdGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdnN0YS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdnN0YSAiJCh0ZGlyX3ZzdGEpIgotZXY4NTAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdjg1MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3Y4NTAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHY4NTAgIiQodGRpcl92ODUwKSIKLWV3NjUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdzY1LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC93NjUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHc2NSAiJCh0ZGlyX3c2NSkiCi1lejgwMDEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMSAiJCh0ZGlyX3o4MDAxKSIKLWV6ODAwMi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy96ODAwMi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvejgwMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHo4MDAyICIkKHRkaXJfejgwMDIpIgotCi1sZF9uZXdfU09VUkNFUyA9IGxkZ3JhbS55IGxkbGV4LmwgbGV4c3VwLmMgbGRsYW5nLmMgbXJpLmMgbGRjdG9yLmMgbGRtYWluLmMgXAotCWxkd3JpdGUuYyBsZGV4cC5jIGxkZW11bC5jIGxkdmVyLmMgbGRtaXNjLmMgbGRmaWxlLmMgbGRjcmVmLmMKLWxkX25ld19ERVBFTkRFTkNJRVMgPSAkKEVNVUxBVElPTl9PRklMRVMpICQoRU1VTF9FWFRSQV9PRklMRVMpICQoQkZETElCKSAkKExJQklCRVJUWSkgJChJTlRMREVQUykKLWxkX25ld19MREFERCA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExMSUJTKQotCi0jIFRoZSBnZW5lcmF0ZWQgZW11bGF0aW9uIGZpbGVzIG1vc3RseSBoYXZlIHRoZSBzYW1lIGRlcGVuZGVuY2llcy4KLSQoRU1VTEFUSU9OX09GSUxFUyk6IC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRjdG9yLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaAotCi0jIFRoaXMgaXMgdGhlIHJlYWwgbGliYmZkLmEgY3JlYXRlZCBieSBsaWJ0b29sLgotVEVTVEJGRExJQiA9IEBURVNUQkZETElCQAotCi1jaGVjay1ERUpBR05VOiBzaXRlLmV4cAotCXNyY3Jvb3Q9YGNkICQoc3JjZGlyKSAmJiBwd2RgOyBleHBvcnQgc3Jjcm9vdDsgXAotCXI9YHB3ZGA7IGV4cG9ydCByOyBcCi0JRVhQRUNUPSQoRVhQRUNUKTsgZXhwb3J0IEVYUEVDVDsgXAotCWlmIFsgLWYgJCh0b3BfYnVpbGRkaXIpLy4uL2V4cGVjdC9leHBlY3QgXTsgdGhlbiBcCi0JICBUQ0xfTElCUkFSWT1gY2QgJCh0b3Bfc3JjZGlyKS8uLi90Y2wvbGlicmFyeSAmJiBwd2RgOyBcCi0JICBleHBvcnQgVENMX0xJQlJBUlk7IFwKLQlmaTsgXAotCXJ1bnRlc3Q9JChSVU5URVNUKTsgXAotCWlmICQoU0hFTEwpIC1jICIkJHJ1bnRlc3QgLS12ZXJzaW9uIiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKLQkgICQkcnVudGVzdCAtLXRvb2wgJChERUpBVE9PTCkgLS1zcmNkaXIgJCR7c3Jjcm9vdH0vdGVzdHN1aXRlIFwKLQkJQ0M9IiQoQ0NfRk9SX1RBUkdFVCkiIENGTEFHUz0iJChDRkxBR1MpIiBcCi0JCUNYWD0iJChDWFhfRk9SX1RBUkdFVCkiIENYWEZMQUdTPSIkKENYWEZMQUdTKSIgXAotCQlDQ19GT1JfSE9TVD0iJChDQykiIENGTEFHU19GT1JfSE9TVD0iJChDRkxBR1MpIiBcCi0JCU9GSUxFUz0iJChPRklMRVMpIiBCRkRMSUI9IiQoVEVTVEJGRExJQikiIFwKLQkJTElCSUJFUlRZPSIkKExJQklCRVJUWSkgJChJTlRMTElCUykiIFwKLQkJJChSVU5URVNURkxBR1MpOyBcCi0JZWxzZSBlY2hvICJXQVJOSU5HOiBjb3VsZCBub3QgZmluZCBcYHJ1bnRlc3QnIiAxPiYyOyA6O1wKLQlmaQotCi0jIFJ1bGVzIGZvciB0ZXN0aW5nIGJ5IHJlbGlua2luZyBsZCBpdHNlbGYuCi0jIEEgc2ltaWxhciB0ZXN0IGlzIGluIHRoZSB0ZXN0c3VpdGUuICBUaGlzIHRhcmdldCBpcyBmb3IgZWFzZSBvZiB1c2UKLSMgd2hlbiBwb3J0aW5nIGxkLgotCi1sZC1wYXJ0aWFsLm86IGxkLW5ldyQoRVhFRVhUKQotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkLXBhcnRpYWwubyAtciAkKE9GSUxFUykKLWxkMSQoRVhFRVhUKTogbGQtcGFydGlhbC5vCi0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxJChFWEVFWFQpICQoSE9TVElOR19DUlQwKSBsZC1wYXJ0aWFsLm8gJChURVNUQkZETElCKSAkKExJQklCRVJUWSkgJChIT1NUSU5HX0xJQlMpCi0KLWxkMS1mdWxsJChFWEVFWFQpOiBsZC1uZXcKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDEtZnVsbCQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDIkKEVYRUVYVCk6IGxkMSQoRVhFRVhUKQotCS4vbGQxJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMiQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDMkKEVYRUVYVCk6IGxkMiQoRVhFRVhUKQotCS4vbGQyJChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMyQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgJChPRklMRVMpICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1ib290c3RyYXA6IGxkMyQoRVhFRVhUKQotCWNtcCBsZDIkKEVYRUVYVCkgbGQzJChFWEVFWFQpCi0KLS5QSE9OWTogYm9vdHN0cmFwCi0KLSMgQSB0ZXN0IHByb2dyYW0gZm9yIEMrKyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgotIyBUaGlzIHRlc3QgaXMgbm93IGluIHRoZSB0ZXN0c3VpdGUuCi0jCi0jY2R0ZXN0OiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdCAkKEhPU1RJTkdfQ1JUMCkgXAotIwkgIGNkdGVzdC1tYWluLm8gY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubyAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3Qub3V0OiBjZHRlc3QKLSMJLi9jZHRlc3QgPiBjZHRlc3QudG1wCi0jCW12IGNkdGVzdC50bXAgY2R0ZXN0Lm91dAotIwotI2NkdGVzdC11ci5vOiBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gbGQubmV3Ci0jCS4vbGQubmV3ICQoSE9TVElOR19FTVUpIC1vIGNkdGVzdC11ci5vIC1VciBjZHRlc3QtbWFpbi5vIFwKLSMJICBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vCi0jCi0jY2R0ZXN0LXVyOiBjZHRlc3QtdXIubwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIgJChIT1NUSU5HX0NSVDApIGNkdGVzdC11ci5vIFwKLSMJICAkKEhPU1RJTkdfTElCUykKLSMKLSNjZHRlc3QtdXIub3V0OiBjZHRlc3QtdXIKLSMJLi9jZHRlc3QtdXIgPiBjZHRlc3QtdXIudG1wCi0jCW12IGNkdGVzdC11ci50bXAgY2R0ZXN0LXVyLm91dAotIwotI2NoZWNrLWNkdGVzdDogY2R0ZXN0Lm91dCBjZHRlc3QtdXIub3V0ICQoc3JjZGlyKS9jZHRlc3QuZXhwCi0jCWRpZmYgJChzcmNkaXIpL2NkdGVzdC5leHAgY2R0ZXN0Lm91dAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC11ci5vdXQKLSMKLSMuUEhPTlk6IGNoZWNrLWNkdGVzdAotCi0jIEVORCBPRiBDSEVDSyBUQVJHRVRTCi0KLSMgRE9DVU1FTlRBVElPTiBUQVJHRVRTCi0jIE1hbnVhbCBjb25maWd1cmF0aW9uIGZpbGU7IG5vdCB1c3VhbGx5IGF0dGFjaGVkIHRvIG5vcm1hbCBjb25maWd1cmF0aW9uLAotIyBiZWNhdXNlIGFsbW9zdCBhbGwgY29uZmlncyB1c2UgImdlbiIgdmVyc2lvbiBvZiBtYW51YWwuCi0jICBTZXQgRE9DVkVSIGFib3ZlIHRvIGNoYW5nZS4KLWNvbmZpZ2RvYy50ZXhpOgkke0RPQ1ZFUn0tZG9jLnRleGkKLQlsbiAtcyAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGxuICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aSA+L2Rldi9udWxsIDI+JjEgXAotCSAgfHwgY3AgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpCi0KLWxkdmVyLnRleGk6IE1ha2VmaWxlCi0Jcm0gLWYgJEAKLQllY2hvICdAc2V0IFZFUlNJT04gJChWRVJTSU9OKScgPiAkQAotCi1sZC5pbmZvOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyAkKHNyY2RpcikvbGQudGV4aW5mbwotCi1sZC5kdmk6ICQoc3JjZGlyKS9sZC50ZXhpbmZvIGNvbmZpZ2RvYy50ZXhpIGxkdmVyLnRleGkKLQlURVhJTlBVVFM9JCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvOiQkVEVYSU5QVVRTIFwKLQkgIE1BS0VJTkZPPSIkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgLUkgJChCRkRESVIpL2RvYyIgJChURVhJMkRWSSkgJChzcmNkaXIpL2xkLnRleGluZm8KLQotTUFJTlRBSU5FUkNMRUFORklMRVMgPSBsZHZlci50ZXhpCi0KLSMgV2Ugd2FudCB0byByZWNvbmZpZ3VyZSBpZiBjb25maWd1cmUuaG9zdCBvciBjb25maWd1cmUudGd0IGNoYW5nZXMuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdCAkKHNyY2RpcikvY29uZmlndXJlLnRndAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLQotTU9TVExZQ0xFQU5GSUxFUyA9ICQoU1RBR0VTVFVGRikgbGQxJChFWEVFWFQpIGxkMiQoRVhFRVhUKSBsZDMkKEVYRUVYVCkgXAotCWxkZW11bC1saXN0LmggY3J0YmVnaW4ubyBjcnRlbmQubyBsZC5sb2cgbGQuc3VtCi1tb3N0bHljbGVhbi1sb2NhbDoKLQktcm0gLXJmIHRtcGRpcgotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLmRlcCAuZGVwMQotCi0uUEhPTlk6IGluc3RhbGwtZXhlYy1sb2NhbCBpbnN0YWxsLWRhdGEtbG9jYWwKLQotaW5zdGFsbC1leGVjLWxvY2FsOiBsZC1uZXckKEVYRUVYVCkKLQkkKG1raW5zdGFsbGRpcnMpICQoYmluZGlyKSAkKHRvb2xkaXIpL2JpbgotCUBsaXN0PSckKG5vaW5zdF9QUk9HUkFNUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSAkJHAgJChiaW5kaXIpL2BlY2hvICQkcHxzZWQgLWUgJ3MvJChFWEVFWFQpJCQvLycgLWUgJ3MvLW5ldy8vJ3xzZWQgJyQodHJhbnNmb3JtKSd8c2VkICdzLyQkLyQoRVhFRVhUKS8nYCI7IFwKLQkgICAgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCW49YGVjaG8gbGQgfCBzZWQgJyQodHJhbnNmb3JtKSdgOyBcCi0JaWYgWyAiJChiaW5kaXIpLyQkbiQoRVhFRVhUKSIgIT0gIiQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpIiBdOyB0aGVuIFwKLQkgIHJtIC1mICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCi0JICBsbiAkKGJpbmRpcikvJCRuJChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpID4vZGV2L251bGwgMj4vZGV2L251bGwgXAotCSAgfHwgJChMSUJUT09MKSAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgbGQtbmV3JChFWEVFWFQpICQodG9vbGRpcikvYmluL2xkJChFWEVFWFQpOyBcCi0JZmkKLQotaW5zdGFsbC1kYXRhLWxvY2FsOgotCSQobWtpbnN0YWxsZGlycykgJChzY3JpcHRkaXIpL2xkc2NyaXB0cwotCWZvciBmIGluIGxkc2NyaXB0cy8qOyBkbyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmICQoc2NyaXB0ZGlyKS8kJGYgOyBcCi0JZG9uZQotCi0jIFN0dWZmIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgZGlzdHJpYnV0aW9uLiAgVGhlIGRpc3RzdHVmZgotIyB0YXJnZXQgaXMgcnVuIGJ5IHRoZSB0YXogdGFyZ2V0IGluIC4uL01ha2VmaWxlLmluLgotTERESVNUU1RVRkYgPSBsZGdyYW0uYyBsZGdyYW0uaCBsZGxleC5jCi1kaXN0c3R1ZmY6ICQoTERESVNUU1RVRkYpIGluZm8KLQotRElTVENMRUFORklMRVMgPSB0ZGlycyBzaXRlLmV4cCBzaXRlLmJhawotZGlzdGNsZWFuLWxvY2FsOgotCXJtIC1yZiBsZHNjcmlwdHMKLQotIyBUYXJnZXRzIHRvIHJlYnVpbGQgZGVwZW5kZW5jaWVzIGluIHRoaXMgTWFrZWZpbGUuCi0jIEhhdmUgdG8gZ2V0IHJpZCBvZiAuZGVwMSBoZXJlIHNvIHRoYXQgIiQ/IiBsYXRlciBpbmNsdWRlcyBhbGwgb2YgJChDRklMRVMpLgotLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykgJChHRU5FUkFURURfSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIC5kZXAxCi0JJChNQUtFKSBERVA9JChERVApIC5kZXAxCi0Jc2VkIC1mIGRlcC5zZWQgPC5kZXAxID4uZGVwCi0KLSMgVGhpcyBydWxlIHJlYWxseSB3YW50cyBhIG1rZGVwIHRoYXQgcnVucyAiZ2NjIC1NTSIuCi0uZGVwMTogJChDRklMRVMpICQoR0VORVJBVEVEX0NGSUxFUykKLQlybSAtZiAuZGVwMgotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKLQkkKERFUCkgLWYgLmRlcDIgJChJTkNMVURFUykgJD8KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLQotbGRjdG9yLm86IGxkY3Rvci5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGN0b3IuaAotbGRlbXVsLm86IGxkZW11bC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGVtdWwuaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRlbXVsLWxpc3QuaAotbGRleHAubzogbGRleHAuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggbGRncmFtLmggbGRsYW5nLmgKLWxkZmlsZS5vOiBsZGZpbGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRtYWluLmggbGRncmFtLmggXAotICBsZGxleC5oIGxkZW11bC5oCi1sZGxhbmcubzogbGRsYW5nLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvb2JzdGFjay5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkZ3JhbS5oIGxkZXhwLmggbGRsYW5nLmggbGRlbXVsLmggbGRsZXguaCBsZG1pc2MuaCBcCi0gIGxkY3Rvci5oIGxkZmlsZS5oICQoSU5DRElSKS9mbm1hdGNoLmgKLWxkbWFpbi5vOiBsZG1haW4uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9wcm9ncmVzcy5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkd3JpdGUuaCBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIFwKLSAgbGRsZXguaCBsZGZpbGUuaCBsZGN0b3IuaAotbGRtaXNjLm86IGxkbWlzYy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2RlbWFuZ2xlLmggbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRncmFtLmggbGRsZXguaCBsZG1haW4uaCBsZGZpbGUuaAotbGR2ZXIubzogbGR2ZXIuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGR2ZXIuaCBcCi0gIGxkZW11bC5oIGxkbWFpbi5oCi1sZHdyaXRlLm86IGxkd3JpdGUuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICAkKElOQ0RJUikvbGliaWJlcnR5LmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIGxkd3JpdGUuaCBcCi0gIGxkbWlzYy5oIGxkZ3JhbS5oIGxkbWFpbi5oCi1sZXhzdXAubzogbGV4c3VwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvZ2V0b3B0LmggJChJTkNESVIpL2JmZGxpbmsuaCBsZC5oIGxkbWFpbi5oIFwKLSAgbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBsZGdyYW0uaCBsZGxleC5oIGxkZmlsZS5oIFwKLSAgbGR2ZXIuaCBsZGVtdWwuaAotbXJpLm86IG1yaS5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggbGQuaCBsZGV4cC5oIGxkbGFuZy5oIFwKLSAgbGRtaXNjLmggbXJpLmggbGRncmFtLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi1sZGNyZWYubzogbGRjcmVmLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRtYWluLmggbGRtaXNjLmggbGRleHAuaCBcCi0gIGxkbGFuZy5oCi1wZS1kbGwubzogcGUtZGxsLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaCBsZGVtdWwuaCAkKElOQ0RJUikvY29mZi9pbnRlcm5hbC5oIFwKLSAgLi4vYmZkL2xpYmNvZmYuaCBkZWZmaWxlLmgKLWxkZ3JhbS5vOiBsZGdyYW0uYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGR2ZXIuaCBsZGxhbmcuaCBsZGVtdWwuaCBsZGZpbGUuaCBsZG1pc2MuaCBcCi0gIGxkbWFpbi5oIG1yaS5oIGxkY3Rvci5oIGxkbGV4LmgKLWxkbGV4Lm86IGxkbGV4LmMgLi4vYmZkL2JmZC5oIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggXAotICBsZC5oIGxkZ3JhbS5oIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRmaWxlLmggbGRsZXguaCBcCi0gIGxkbWFpbi5oCi1kZWZmaWxlcC5vOiBkZWZmaWxlcC5jICQoSU5DRElSKS9saWJpYmVydHkuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZG1pc2MuaCBkZWZmaWxlLmgKLQotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9sZC9NYWtlZmlsZS5pbiBiL2xkL01ha2VmaWxlLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGNmNmFhLi4wMDAwMDAwCi0tLSBhL2xkL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTU1NSArMCwwIEBACi0jIE1ha2VmaWxlLmluIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9tYWtlIDEuNCBmcm9tIE1ha2VmaWxlLmFtCi0KLSMgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIFRoaXMgTWFrZWZpbGUuaW4gaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5IGFuZC9vciBkaXN0cmlidXRlIGl0LAotIyB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgbGF3OyB3aXRob3V0Ci0jIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLSMgUEFSVElDVUxBUiBQVVJQT1NFLgotCi0KLVNIRUxMID0gQFNIRUxMQAotCi1zcmNkaXIgPSBAc3JjZGlyQAotdG9wX3NyY2RpciA9IEB0b3Bfc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotCi1iaW5kaXIgPSBAYmluZGlyQAotc2JpbmRpciA9IEBzYmluZGlyQAotbGliZXhlY2RpciA9IEBsaWJleGVjZGlyQAotZGF0YWRpciA9IEBkYXRhZGlyQAotc3lzY29uZmRpciA9IEBzeXNjb25mZGlyQAotc2hhcmVkc3RhdGVkaXIgPSBAc2hhcmVkc3RhdGVkaXJACi1sb2NhbHN0YXRlZGlyID0gQGxvY2Fsc3RhdGVkaXJACi1saWJkaXIgPSBAbGliZGlyQAotaW5mb2RpciA9IEBpbmZvZGlyQAotbWFuZGlyID0gQG1hbmRpckAKLWluY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKLW9sZGluY2x1ZGVkaXIgPSAvdXNyL2luY2x1ZGUKLQotREVTVERJUiA9Ci0KLXBrZ2RhdGFkaXIgPSAkKGRhdGFkaXIpL0BQQUNLQUdFQAotcGtnbGliZGlyID0gJChsaWJkaXIpL0BQQUNLQUdFQAotcGtnaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvQFBBQ0tBR0VACi0KLXRvcF9idWlsZGRpciA9IC4KLQotQUNMT0NBTCA9IEBBQ0xPQ0FMQAotQVVUT0NPTkYgPSBAQVVUT0NPTkZACi1BVVRPTUFLRSA9IEBBVVRPTUFLRUAKLUFVVE9IRUFERVIgPSBAQVVUT0hFQURFUkAKLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAgJChBTV9JTlNUQUxMX1BST0dSQU1fRkxBR1MpCi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi10cmFuc2Zvcm0gPSBAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAKLQotTk9STUFMX0lOU1RBTEwgPSA6Ci1QUkVfSU5TVEFMTCA9IDoKLVBPU1RfSU5TVEFMTCA9IDoKLU5PUk1BTF9VTklOU1RBTEwgPSA6Ci1QUkVfVU5JTlNUQUxMID0gOgotUE9TVF9VTklOU1RBTEwgPSA6Ci1idWlsZF9hbGlhcyA9IEBidWlsZF9hbGlhc0AKLWJ1aWxkX3RyaXBsZXQgPSBAYnVpbGRACi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLXRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNACi10YXJnZXRfdHJpcGxldCA9IEB0YXJnZXRACi1BUyA9IEBBU0AKLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUNDID0gQENDQAotQ0NfRk9SX0JVSUxEID0gQENDX0ZPUl9CVUlMREAKLURBVEFESVJOQU1FID0gQERBVEFESVJOQU1FQAotRExMVE9PTCA9IEBETExUT09MQAotRU1VTEFUSU9OX0xJQlBBVEggPSBARU1VTEFUSU9OX0xJQlBBVEhACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTE9CSlMgPSBASU5UTE9CSlNACi1MRCA9IEBMREAKLUxJQlRPT0wgPSBATElCVE9PTEAKLUxOX1MgPSBATE5fU0AKLU1BSU5UID0gQE1BSU5UQAotTUFLRUlORk8gPSBATUFLRUlORk9ACi1NS0lOU1RBTExESVJTID0gQE1LSU5TVEFMTERJUlNACi1NU0dGTVQgPSBATVNHRk1UQAotTkFUSVZFX0xJQl9ESVJTID0gQE5BVElWRV9MSUJfRElSU0AKLU5NID0gQE5NQAotUEFDS0FHRSA9IEBQQUNLQUdFQAotUE9GSUxFUyA9IEBQT0ZJTEVTQAotUE9TVUIgPSBAUE9TVUJACi1SQU5MSUIgPSBAUkFOTElCQAotVVNFX0lOQ0xVREVEX0xJQklOVEwgPSBAVVNFX0lOQ0xVREVEX0xJQklOVExACi1VU0VfTkxTID0gQFVTRV9OTFNACi1VU0VfU1lNQk9MX1VOREVSU0NPUkUgPSBAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotbCA9IEBsQAotCi1JTlRMTElCUyA9IEBJTlRMTElCU0AKLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cyBkZWphZ251Ci0KLVNVQkRJUlMgPSBwbwotCi10b29sZGlyID0gJChleGVjX3ByZWZpeCkvJCh0YXJnZXRfYWxpYXMpCi0KLVlBQ0MgPSBgaWYgWyAtZiAuLi9iaXNvbi9iaXNvbiBdIDsgdGhlbiBlY2hvIC4uL2Jpc29uL2Jpc29uIC15IC1MJChzcmNkaXIpLy4uL2Jpc29uLyA7IGVsc2UgZWNobyBiaXNvbiAteSA7IGZpYAotWUZMQUdTID0gLWQKLUxFWCA9IGBpZiBbIC1mIC4uL2ZsZXgvZmxleCBdIDsgdGhlbiBlY2hvIC4uL2ZsZXgvZmxleCA7IGVsc2UgZWNobyBmbGV4IDsgZmlgCi0KLSMgV2UgcHV0IHRoZSBzY3JpcHRzIGluIHRoZSBkaXJlY3RvcnkgJChzY3JpcHRkaXIpL2xkc2NyaXB0cy4KLSMgV2UgY2FuJ3QgcHV0IHRoZSBzY3JpcHRzIGluICQoZGF0YWRpcikgYmVjYXVzZSB0aGUgU0VBUkNIX0RJUgotIyBkaXJlY3RpdmVzIG5lZWQgdG8gYmUgZGlmZmVyZW50IGZvciBuYXRpdmUgYW5kIGNyb3NzIGxpbmtlcnMuCi1zY3JpcHRkaXIgPSAkKHRvb2xkaXIpL2xpYgotCi1FTVVMID0gQEVNVUxACi1FTVVMQVRJT05fT0ZJTEVTID0gQEVNVUxBVElPTl9PRklMRVNACi1FTVVMX0VYVFJBX09GSUxFUyA9IEBFTVVMX0VYVFJBX09GSUxFU0AKLQotIyBTZWFyY2ggcGF0aCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgLWxmb28gbGlicmFyaWVzLgotIyBJZiBMSUJfUEFUSCBpcyBlbXB0eSwgdGhlIG9uZXMgaW4gdGhlIHNjcmlwdCAoaWYgYW55KSBhcmUgbGVmdCBhbG9uZS4KLSMgKFRoZSBkZWZhdWx0IGlzIHVzdWFsbHkgL2xpYjovdXNyL2xpYjovdXNyL2xvY2FsL2xpYiwgdW5sZXNzIGJ1aWxkaW5nCi0jIGEgY3Jvc3MtbGlua2VyLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGlzIGVtcHR5LiAgU2VlIGdlbnNjcmlwdHMuc2guKQotIyBPdGhlcndpc2UsIHRoZXkgYXJlIHJlcGxhY2VkIHdpdGggdGhlIG9uZXMgZ2l2ZW4gaW4gTElCX1BBVEgsCi0jIHdoaWNoIG1heSBoYXZlIHRoZSBmb3JtOiBMSUJfUEFUSD0vbGliOi91c3IvbG9jYWwvbGliCi1MSUJfUEFUSCA9IAotCi1CQVNFRElSID0gJChzcmNkaXIpLy4uCi1CRkRESVIgPSAkKEJBU0VESVIpL2JmZAotSU5DRElSID0gJChCQVNFRElSKS9pbmNsdWRlCi1ERVAgPSBta2RlcAotCi0jIFdoYXQgdmVyc2lvbiBvZiB0aGUgbWFudWFsIHRvIGJ1aWxkCi1ET0NWRVIgPSBnZW4KLQotI3N0dWZmIGZvciBzZWxmIGhvc3RpbmcgKGNhbiBiZSBvdmVycmlkZGVuIGluIGNvbmZpZyBmaWxlKS4KLUhPU1RJTkdfQ1JUMCA9IEBIT1NUSU5HX0NSVDBACi1IT1NUSU5HX0xJQlMgPSBASE9TVElOR19MSUJTQAotSE9TVElOR19FTVUgPSAtbSAkKEVNVUwpCi0KLSMgU2V0dXAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLCBpZiB5b3UgaGF2ZSBvbmUKLUVYUEVDVCA9IGBpZiBbIC1mICQkci8uLi9leHBlY3QvZXhwZWN0IF0gOyBcCi0JdGhlbiBlY2hvICQkci8uLi9leHBlY3QvZXhwZWN0IDsgXAotCWVsc2UgZWNobyBleHBlY3QgOyBmaWAKLQotCi1SVU5URVNUID0gYGlmIFsgLWYgJCR7c3Jjcm9vdH0vLi4vZGVqYWdudS9ydW50ZXN0IF0gOyBcCi0JdGhlbiBlY2hvICQke3NyY3Jvb3R9Ly4uL2RlamFnbnUvcnVudGVzdCA7IFwKLQllbHNlIGVjaG8gcnVudGVzdCA7IGZpYAotCi0KLVJVTlRFU1RGTEFHUyA9IAotCi1DQ19GT1JfVEFSR0VUID0gYCBcCi0gIGlmIFsgLWYgJCRyLy4uL2djYy94Z2NjIF0gOyB0aGVuIFwKLSAgICBpZiBbIC1mICQkci8uLi9uZXdsaWIvTWFrZWZpbGUgXSA7IHRoZW4gXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLyAtaWRpcmFmdGVyICQkci8uLi9uZXdsaWIvdGFyZy1pbmNsdWRlIC1pZGlyYWZ0ZXIgJCR7c3Jjcm9vdH0vLi4vbmV3bGliL2xpYmMvaW5jbHVkZSAtbm9zdGRpbmM7IFwKLSAgICBlbHNlIFwKLSAgICAgIGVjaG8gJCRyLy4uL2djYy94Z2NjIC1CJCRyLy4uL2djYy87IFwKLSAgICBmaTsgXAotICBlbHNlIFwKLSAgICBpZiBbICJAaG9zdEAiID0gIkB0YXJnZXRAIiBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQoQ0MpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLUNYWCA9IGdjYwotQ1hYX0ZPUl9UQVJHRVQgPSBgIFwKLSAgaWYgWyAtZiAkJHIvLi4vZ2NjL3hnY2MgXSA7IHRoZW4gXAotICAgIGlmIFsgLWYgJCRyLy4uL25ld2xpYi9NYWtlZmlsZSBdIDsgdGhlbiBcCi0gICAgICBlY2hvICQkci8uLi9nY2MveGdjYyAtQiQkci8uLi9nY2MvIC1pZGlyYWZ0ZXIgJCRyLy4uL25ld2xpYi90YXJnLWluY2x1ZGUgLWlkaXJhZnRlciAkJHtzcmNyb290fS8uLi9uZXdsaWIvbGliYy9pbmNsdWRlIC1ub3N0ZGluYzsgXAotICAgIGVsc2UgXAotICAgICAgZWNobyAkJHIvLi4vZ2NjL3hnY2MgLUIkJHIvLi4vZ2NjLzsgXAotICAgIGZpOyBcCi0gIGVsc2UgXAotICAgIGlmIFsgIkBob3N0QCIgPSAiQHRhcmdldEAiIF0gOyB0aGVuIFwKLSAgICAgIGVjaG8gJChDWFgpOyBcCi0gICAgZWxzZSBcCi0gICAgICBlY2hvIGdjYyB8IHNlZCAnJCh0cmFuc2Zvcm0pJzsgXAotICAgIGZpOyBcCi0gIGZpYAotCi0KLW5vaW5zdF9QUk9HUkFNUyA9IGxkLW5ldwotaW5mb19URVhJTkZPUyA9IGxkLnRleGluZm8KLW5vaW5zdF9URVhJTkZPUyA9IGxkaW50LnRleGluZm8KLW1hbl9NQU5TID0gbGQuMQotCi1JTkNMVURFUyA9IC1EX0dOVV9TT1VSQ0UgLUkuIC1JJChzcmNkaXIpIC1JLi4vYmZkIC1JJChCRkRESVIpIC1JJChJTkNESVIpIC1JJCh0b3Bfc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bCAkKEhERUZJTkVTKSAkKENGTEFHUykgLURMT0NBTEVESVI9IlwiJChwcmVmaXgpL3NoYXJlL2xvY2FsZVwiIgotCi1CRkRMSUIgPSAuLi9iZmQvbGliYmZkLmxhCi1MSUJJQkVSVFkgPSAuLi9saWJpYmVydHkvbGliaWJlcnR5LmEKLQotQUxMX0VNVUxBVElPTlMgPSBcCi0JZWEyOWsubyBcCi0JZWFpeHBwYy5vIFwKLQllYWl4cnM2Lm8gXAotCWVhbHBoYS5vIFwKLQllYXJjZWxmLm8gXAotCWVhcm1lbGYubyBcCi0JZWFybWVsZl9vYWJpLm8gXAotCWVhcm1lbGZfbGludXgubyBcCi0JZWFybWVsZl9saW51eDI2Lm8gXAotCWVhcm1hb3V0Yi5vIFwKLQllYXJtYW91dGwubyBcCi0JZWFybWNvZmYubyBcCi0JZWFybXBlLm8gXAotCWVjb2ZmX3NwYXJjLm8gXAotCWVkMTB2ZWxmLm8gXAotCWVkMzB2ZWxmLm8gXAotCWVkMzB2X2UubyBcCi0JZWQzMHZfby5vIFwKLQllZGVsdGE2OC5vIFwKLQllZWJtb24yOWsubyBcCi0JZWVsZjMyX3NwYXJjLm8gXAotCWVlbGYzMl9pOTYwLm8gXAotCWVlbGYzMmI0MzAwLm8gXAotCWVlbGYzMmJtaXAubyBcCi0JZWVsZjMyZWJtaXAubyBcCi0JZWVsZjMyZWxtaXAubyBcCi0JZWVsZjMybDQzMDAubyBcCi0JZWVsZjMybG1pcC5vIFwKLQllZWxmMzJscHBjLm8gXAotCWVlbGYzMnBwYy5vIFwKLQllZWxmMzJwcGNsaW51eC5vIFwKLQllZWxmX2kzODYubyBcCi0JZWVsZl9pMzg2X2JlLm8gXAotCWVnbGQ5NjAubyBcCi0JZWdsZDk2MGNvZmYubyBcCi0JZWVsZjMyZnIzMC5vIFwKLQllZWxmMzJtY29yZS5vIFwKLQllZ28zMi5vIFwKLQllaDgzMDAubyBcCi0JZWg4MzAwaC5vIFwKLQllaDgzMDBzLm8gXAotCWVoODUwMC5vIFwKLQllaDg1MDBiLm8gXAotCWVoODUwMGMubyBcCi0JZWg4NTAwbS5vIFwKLQllaDg1MDBzLm8gXAotCWVocDMwMGJzZC5vIFwKLQllaHAzaHB1eC5vIFwKLQllaHBwYWVsZi5vIFwKLQllaTM4NmFvdXQubyBcCi0JZWkzODZiZW9zLm8gXAotCWVpMzg2YnNkLm8gXAotCWVpMzg2Y29mZi5vIFwKLQllaTM4NmdvMzIubyBcCi0JZWkzODZsaW51eC5vIFwKLQllaTM4Nmx5bngubyBcCi0JZWkzODZtYWNoLm8gXAotCWVpMzg2bW9zcy5vIFwKLQllaTM4Nm1zZG9zLm8gXAotCWVpMzg2bmJzZC5vIFwKLQllaTM4Nm53Lm8gXAotCWVpMzg2cGUubyBcCi0JZWxuazk2MC5vIFwKLQllbTY4azRrbmJzZC5vIFwKLQllbTY4a2FvdXQubyBcCi0JZW02OGthdXgubyBcCi0JZW02OGtjb2ZmLm8gXAotCWVtNjhrZWxmLm8gXAotCWVtNjhrbGludXgubyBcCi0JZW02OGtseW54Lm8gXAotCWVtNjhrbmJzZC5vIFwKLQllbTY4a3Bzb3MubyBcCi0JZW04OGtiY3MubyBcCi0JZW1jb3JlcGUubyBcCi0JZW1pcHNiaWcubyBcCi0JZW1pcHNic2QubyBcCi0JZW1pcHNpZHQubyBcCi0JZW1pcHNpZHRsLm8gXAotCWVtaXBzbGl0Lm8gXAotCWVtaXBzbG5ld3MubyBcCi0JZW5ld3MubyBcCi0JZW5zMzJrbmJzZC5vIFwKLQllcGM1MzJtYWNoYS5vIFwKLQllcHBjbWFjb3MubyBcCi0JZXBwY253Lm8gXAotCWVwcGNwZS5vIFwKLQllcmlzY2l4Lm8gXAotCWVzYTI5MjAwLm8gXAotCWVzaC5vIFwKLQllc2hlbGYubyBcCi0JZXNobGVsZi5vIFwKLQllc2hsLm8gXAotCWVzcGFyY2FvdXQubyBcCi0JZXNwYXJjbGludXgubyBcCi0JZXNwYXJjbHlueC5vIFwKLQllc3BhcmNuYnNkLm8gXAotCWVzdDIwMDAubyBcCi0JZXN1bjMubyBcCi0JZXN1bjQubyBcCi0JZXRpYzMwYW91dC5vIFwKLQlldGljMzBjb2ZmLm8gXAotCWV0aWM4MGNvZmYubyBcCi0JZXZhbmlsbGEubyBcCi0JZXZheC5vIFwKLQlldnN0YS5vIFwKLQlldzY1Lm8gXAotCWV6ODAwMS5vIFwKLQllejgwMDIubwotCi0KLUFMTF82NF9FTVVMQVRJT05TID0gXAotCWVlbGY2NF9zcGFyYy5vIFwKLQllZWxmNjRhbHBoYS5vCi0KLQotQUxMX0VNVUxfRVhUUkFfT0ZJTEVTID0gXAotCXBlLWRsbC5vIFwKLQlkZWZmaWxlcC5vCi0KLQotQ0ZJTEVTID0gbGRjdG9yLmMgbGRlbXVsLmMgbGRleHAuYyBsZGZpbGUuYyBsZGxhbmcuYyBcCi0JbGRtYWluLmMgbGRtaXNjLmMgbGR2ZXIuYyBsZHdyaXRlLmMgbGV4c3VwLmMgXAotCW1yaS5jIGxkY3JlZi5jIHBlLWRsbC5jCi0KLQotSEZJTEVTID0gbGQuaCBsZGN0b3IuaCBsZGVtdWwuaCBsZGV4cC5oIGxkZmlsZS5oIFwKLQlsZGxhbmcuaCBsZGxleC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkdmVyLmggXAotCWxkd3JpdGUuaCBtcmkuaCBkZWZmaWxlLmgKLQotCi1HRU5FUkFURURfQ0ZJTEVTID0gbGRncmFtLmMgbGRsZXguYyBkZWZmaWxlcC5jCi1HRU5FUkFURURfSEZJTEVTID0gbGRncmFtLmggbGRlbXVsLWxpc3QuaCBkZWZmaWxlcC5oCi0KLU9GSUxFUyA9IGxkZ3JhbS5vIGxkbGV4Lm8gbGV4c3VwLm8gbGRsYW5nLm8gbXJpLm8gbGRjdG9yLm8gbGRtYWluLm8gXAotCWxkd3JpdGUubyBsZGV4cC5vICBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIFwKLQlsZGZpbGUubyBsZGNyZWYubyAke0VNVUxBVElPTl9PRklMRVN9ICR7RU1VTF9FWFRSQV9PRklMRVN9Ci0KLQotU1RBR0VTVFVGRiA9ICoubyBsZHNjcmlwdHMvKiBlKi5jCi0KLSMgQXQgdGhlIG1vbWVudCB0aGlzIGlzIGp1c3QgYSBsaXN0IG9mIHRob3NlIGVtdWxhdGlvbiB0ZW1wbGF0ZSBmaWxlcwotIyB0aGF0IGNvbnRhaW4gaW50ZXJuYXRpb25hbGlzZWQgc3RyaW5ncy4KLUVNVUxBVElPTl9GSUxFUyA9IGVtdWx0ZW1wbC9wZS5lbSBlbXVsdGVtcGwvYXJtY29mZi5lbQotCi1QT1RGSUxFUyA9ICQoQ0ZJTEVTKSAkKEhGSUxFUykgJChFTVVMQVRJT05fRklMRVMpCi0KLSMgVGhlc2UgYWxsIHN0YXJ0IHdpdGggZSBzbyAnbWFrZSBjbGVhbicgY2FuIGZpbmQgdGhlbS4KLQotR0VOU0NSSVBUUyA9ICQoU0hFTEwpICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoICR7c3JjZGlyfSAke2xpYmRpcn0gQGhvc3RAIEB0YXJnZXRAIEB0YXJnZXRfYWxpYXNAICJARU1VTEFUSU9OX0xJQlBBVEhAIiAiQE5BVElWRV9MSUJfRElSU0AiCi1HRU5fREVQRU5EUyA9ICQoc3JjZGlyKS9nZW5zY3JpcHRzLnNoICQoc3JjZGlyKS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZAotCi1sZF9uZXdfU09VUkNFUyA9IGxkZ3JhbS55IGxkbGV4LmwgbGV4c3VwLmMgbGRsYW5nLmMgbXJpLmMgbGRjdG9yLmMgbGRtYWluLmMgXAotCWxkd3JpdGUuYyBsZGV4cC5jIGxkZW11bC5jIGxkdmVyLmMgbGRtaXNjLmMgbGRmaWxlLmMgbGRjcmVmLmMKLQotbGRfbmV3X0RFUEVOREVOQ0lFUyA9ICQoRU1VTEFUSU9OX09GSUxFUykgJChFTVVMX0VYVFJBX09GSUxFUykgJChCRkRMSUIpICQoTElCSUJFUlRZKSAkKElOVExERVBTKQotbGRfbmV3X0xEQUREID0gJChFTVVMQVRJT05fT0ZJTEVTKSAkKEVNVUxfRVhUUkFfT0ZJTEVTKSAkKEJGRExJQikgJChMSUJJQkVSVFkpICQoSU5UTExJQlMpCi0KLSMgVGhpcyBpcyB0aGUgcmVhbCBsaWJiZmQuYSBjcmVhdGVkIGJ5IGxpYnRvb2wuCi1URVNUQkZETElCID0gQFRFU1RCRkRMSUJACi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gbGR2ZXIudGV4aQotCi1NT1NUTFlDTEVBTkZJTEVTID0gJChTVEFHRVNUVUZGKSBsZDEkKEVYRUVYVCkgbGQyJChFWEVFWFQpIGxkMyQoRVhFRVhUKSBcCi0JbGRlbXVsLWxpc3QuaCBjcnRiZWdpbi5vIGNydGVuZC5vIGxkLmxvZyBsZC5zdW0KLQotQ0xFQU5GSUxFUyA9IGRlcC5zZWQgLmRlcCAuZGVwMQotCi0jIFN0dWZmIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIGEgZGlzdHJpYnV0aW9uLiAgVGhlIGRpc3RzdHVmZgotIyB0YXJnZXQgaXMgcnVuIGJ5IHRoZSB0YXogdGFyZ2V0IGluIC4uL01ha2VmaWxlLmluLgotTERESVNUU1RVRkYgPSBsZGdyYW0uYyBsZGdyYW0uaCBsZGxleC5jCi0KLURJU1RDTEVBTkZJTEVTID0gdGRpcnMgc2l0ZS5leHAgc2l0ZS5iYWsKLUFDTE9DQUxfTTQgPSAkKHRvcF9zcmNkaXIpL2FjbG9jYWwubTQKLW1raW5zdGFsbGRpcnMgPSAkKFNIRUxMKSAkKHRvcF9zcmNkaXIpLy4uL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSBjb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi1ub2luc3RfUFJPR1JBTVMgPSAgbGQtbmV3JChFWEVFWFQpCi1QUk9HUkFNUyA9ICAkKG5vaW5zdF9QUk9HUkFNUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotbGRfbmV3X09CSkVDVFMgPSAgbGRncmFtLm8gbGRsZXgubyBsZXhzdXAubyBsZGxhbmcubyBtcmkubyBsZGN0b3IubyBcCi1sZG1haW4ubyBsZHdyaXRlLm8gbGRleHAubyBsZGVtdWwubyBsZHZlci5vIGxkbWlzYy5vIGxkZmlsZS5vIGxkY3JlZi5vCi1sZF9uZXdfTERGTEFHUyA9IAotTEVYX09VVFBVVF9ST09UID0gQExFWF9PVVRQVVRfUk9PVEAKLUxFWExJQiA9IEBMRVhMSUJACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ09NUElMRSA9ICQoQ0MpICQoREVGUykgJChJTkNMVURFUykgJChBTV9DUFBGTEFHUykgJChDUFBGTEFHUykgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKQotTFRDT01QSUxFID0gJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgJChDQ0xEKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpICQoTERGTEFHUykgLW8gJEAKLVRFWEkyRFZJID0gYGlmIHRlc3QgLWYgJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3V0aWwvdGV4aTJkdmk7IHRoZW4gZWNobyAkKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdXRpbC90ZXhpMmR2aTsgZWxzZSBlY2hvIHRleGkyZHZpOyBmaWAKLVRFWElORk9fVEVYID0gJCh0b3Bfc3JjZGlyKS8uLi90ZXhpbmZvL3RleGluZm8udGV4Ci1JTkZPX0RFUFMgPSBsZC5pbmZvCi1EVklTID0gbGQuZHZpCi1URVhJTkZPUyA9IGxkLnRleGluZm8KLW1hbjFkaXIgPSAkKG1hbmRpcikvbWFuMQotTUFOUyA9ICQobWFuX01BTlMpCi0KLU5ST0ZGID0gbnJvZmYKLURJU1RfQ09NTU9OID0gIFJFQURNRSAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFwKLU5FV1MgVE9ETyBhY2luY2x1ZGUubTQgYWNsb2NhbC5tNCBjb25maWcuaW4gY29uZmlndXJlIGNvbmZpZ3VyZS5pbiBcCi1sZGdyYW0uYyBsZGxleC5jCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSAkKGxkX25ld19TT1VSQ0VTKQotT0JKRUNUUyA9ICQobGRfbmV3X09CSkVDVFMpCi0KLWFsbDogYWxsLXJlZGlyZWN0Ci0uU1VGRklYRVM6Ci0uU1VGRklYRVM6IC5TIC5jIC5kdmkgLmluZm8gLmwgLmxvIC5vIC5wcyAucyAudGV4aSAudGV4aW5mbyAudHhpIC55Ci0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotY2xlYW4tbm9pbnN0UFJPR1JBTVM6Ci0JLXRlc3QgLXogIiQobm9pbnN0X1BST0dSQU1TKSIgfHwgcm0gLWYgJChub2luc3RfUFJPR1JBTVMpCi0KLWRpc3RjbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUzoKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotbGQtbmV3JChFWEVFWFQpOiAkKGxkX25ld19PQkpFQ1RTKSAkKGxkX25ld19ERVBFTkRFTkNJRVMpCi0JQHJtIC1mIGxkLW5ldyQoRVhFRVhUKQotCSQoTElOSykgJChsZF9uZXdfTERGTEFHUykgJChsZF9uZXdfT0JKRUNUUykgJChsZF9uZXdfTERBREQpICQoTElCUykKLS5sLmM6Ci0JJChMRVgpICQoQU1fTEZMQUdTKSAkKExGTEFHUykgJDwgJiYgbXYgJChMRVhfT1VUUFVUX1JPT1QpLmMgJEAKLS55LmM6Ci0JJChZQUNDKSAkKEFNX1lGTEFHUykgJChZRkxBR1MpICQ8ICYmIG12IHkudGFiLmMgJCouYwotCWlmIHRlc3QgLWYgeS50YWIuaDsgdGhlbiBcCi0JaWYgY21wIC1zIHkudGFiLmggJCouaDsgdGhlbiBybSAtZiB5LnRhYi5oOyBlbHNlIG12IHkudGFiLmggJCouaDsgZmk7IFwKLQllbHNlIDo7IGZpCi1sZGdyYW0uaDogbGRncmFtLmMKLQotCi1sZC5pbmZvOiBsZC50ZXhpbmZvCi1sZC5kdmk6IGxkLnRleGluZm8KLQotCi1EVklQUyA9IGR2aXBzCi0KLS50ZXhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGkuZHZpOgotCVRFWElOUFVUUz0kKHRvcF9zcmNkaXIpLy4uL3RleGluZm8vdGV4aW5mby50ZXg6JCRURVhJTlBVVFMgXAotCSAgTUFLRUlORk89JyQoTUFLRUlORk8pIC1JICQoc3JjZGlyKScgJChURVhJMkRWSSkgJDwKLQotLnRleGk6Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnRleGluZm8uaW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mbzoKLQlAcm0gLWYgJEAgJEAtWzAtOV0gJEAtWzAtOV1bMC05XQotCSQoTUFLRUlORk8pIC1JICQoc3JjZGlyKSAkPAotCi0udGV4aW5mby5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpLmluZm86Ci0JQHJtIC1mICRAICRALVswLTldICRALVswLTldWzAtOV0KLQkkKE1BS0VJTkZPKSAtSSAkKHNyY2RpcikgJDwKLQotLnR4aS5kdmk6Ci0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mby90ZXhpbmZvLnRleDokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0nJChNQUtFSU5GTykgLUkgJChzcmNkaXIpJyAkKFRFWEkyRFZJKSAkPAotCi0udHhpOgotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpICQ8Ci0uZHZpLnBzOgotCSQoRFZJUFMpICQ8IC1vICRACi0KLWluc3RhbGwtaW5mby1hbTogJChJTkZPX0RFUFMpCi0JQCQoTk9STUFMX0lOU1RBTEwpCi0JJChta2luc3RhbGxkaXJzKSAkKERFU1RESVIpJChpbmZvZGlyKQotCUBsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBmb3IgaWZpbGUgaW4gYGNkICQkZCAmJiBlY2hvICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV1gOyBkbyBcCi0JICAgIGlmIHRlc3QgLWYgJCRkLyQkaWZpbGU7IHRoZW4gXAotCSAgICAgIGVjaG8gIiAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZSI7IFwKLQkgICAgICAkKElOU1RBTExfREFUQSkgJCRkLyQkaWZpbGUgJChERVNURElSKSQoaW5mb2RpcikvJCRpZmlsZTsgXAotCSAgICBlbHNlIDogOyBmaTsgXAotCSAgZG9uZTsgXAotCWRvbmUKLQlAJChQT1NUX0lOU1RBTEwpCi0JQGlmICQoU0hFTEwpIC1jICdpbnN0YWxsLWluZm8gLS12ZXJzaW9uIHwgc2VkIDFxIHwgZmdyZXAgLXMgLXYgLWkgZGViaWFuJyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gXAotCSAgbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCSAgZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICAgIGVjaG8gIiBpbnN0YWxsLWluZm8gLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSAkKERFU1RESVIpJChpbmZvZGlyKS8kJGZpbGUiO1wKLQkgICAgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgJChERVNURElSKSQoaW5mb2RpcikvJCRmaWxlIHx8IDo7XAotCSAgZG9uZTsgXAotCWVsc2UgOiA7IGZpCi0KLXVuaW5zdGFsbC1pbmZvOgotCSQoUFJFX1VOSU5TVEFMTCkKLQlAaWYgJChTSEVMTCkgLWMgJ2luc3RhbGwtaW5mbyAtLXZlcnNpb24gfCBzZWQgMXEgfCBmZ3JlcCAtcyAtdiAtaSBkZWJpYW4nID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICBpaT15ZXM7IFwKLQllbHNlIGlpPTsgZmk7IFwKLQlsaXN0PSckKElORk9fREVQUyknOyBcCi0JZm9yIGZpbGUgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0IC16ICIkaWkiIFwKLQkgICAgfHwgaW5zdGFsbC1pbmZvIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgLS1yZW1vdmUgJCRmaWxlOyBcCi0JZG9uZQotCUAkKE5PUk1BTF9VTklOU1RBTEwpCi0JbGlzdD0nJChJTkZPX0RFUFMpJzsgXAotCWZvciBmaWxlIGluICQkbGlzdDsgZG8gXAotCSAgKGNkICQoREVTVERJUikkKGluZm9kaXIpICYmIHJtIC1mICQkZmlsZSAkJGZpbGUtWzAtOV0gJCRmaWxlLVswLTldWzAtOV0pOyBcCi0JZG9uZQotCi1kaXN0LWluZm86ICQoSU5GT19ERVBTKQotCWxpc3Q9JyQoSU5GT19ERVBTKSc7IFwKLQlmb3IgYmFzZSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRiYXNlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGZvciBmaWxlIGluIGBjZCAkJGQgJiYgZXZhbCBlY2hvICQkYmFzZSpgOyBkbyBcCi0JICAgIHRlc3QgLWYgJChkaXN0ZGlyKS8kJGZpbGUgXAotCSAgICB8fCBsbiAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGRvbmU7IFwKLQlkb25lCi0KLW1vc3RseWNsZWFuLWFtaW5mbzoKLQktcm0gLWYgbGQuYXV4IGxkLmNwIGxkLmNwcyBsZC5kdmkgbGQuZm4gbGQuZm5zIGxkLmt5IGxkLmt5cyBsZC5wcyBcCi0JICBsZC5sb2cgbGQucGcgbGQudG9jIGxkLnRwIGxkLnRwcyBsZC52ciBsZC52cnMgbGQub3AgbGQudHIgXAotCSAgbGQuY3YgbGQuY24KLQotY2xlYW4tYW1pbmZvOgotCi1kaXN0Y2xlYW4tYW1pbmZvOgotCi1tYWludGFpbmVyLWNsZWFuLWFtaW5mbzoKLQlmb3IgaSBpbiAkKElORk9fREVQUyk7IGRvIFwKLQkgIHJtIC1mICQkaTsgXAotCSAgaWYgdGVzdCAiYGVjaG8gJCRpLVswLTldKmAiICE9ICIkJGktWzAtOV0qIjsgdGhlbiBcCi0JICAgIHJtIC1mICQkaS1bMC05XSo7IFwKLQkgIGZpOyBcCi0JZG9uZQotY2xlYW4taW5mbzogbW9zdGx5Y2xlYW4tYW1pbmZvCi0KLWluc3RhbGwtbWFuMToKLQkkKG1raW5zdGFsbGRpcnMpICQoREVTVERJUikkKG1hbjFkaXIpCi0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJChzcmNkaXIpLyQkaTsgdGhlbiBmaWxlPSQoc3JjZGlyKS8kJGk7IFwKLQkgIGVsc2UgZmlsZT0kJGk7IGZpOyBcCi0JICBleHQ9YGVjaG8gJCRpIHwgc2VkIC1lICdzL14uKlxcLi8vJ2A7IFwKLQkgIGluc3Q9YGVjaG8gJCRpIHwgc2VkIC1lICdzL1xcLlswLTlhLXpdKiQkLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGluc3QgfCBzZWQgJyQodHJhbnNmb3JtKSdgLiQkZXh0OyBcCi0JICBlY2hvICIgJChJTlNUQUxMX0RBVEEpICQkZmlsZSAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICAkKElOU1RBTExfREFUQSkgJCRmaWxlICQoREVTVERJUikkKG1hbjFkaXIpLyQkaW5zdDsgXAotCWRvbmUKLQotdW5pbnN0YWxsLW1hbjE6Ci0JQGxpc3Q9JyQobWFuMV9NQU5TKSc7IFwKLQlsMj0nJChtYW5fTUFOUyknOyBmb3IgaSBpbiAkJGwyOyBkbyBcCi0JICBjYXNlICIkJGkiIGluIFwKLQkgICAgKi4xKikgbGlzdD0iJCRsaXN0ICQkaSIgOzsgXAotCSAgZXNhYzsgXAotCWRvbmU7IFwKLQlmb3IgaSBpbiAkJGxpc3Q7IGRvIFwKLQkgIGV4dD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXi4qXFwuLy8nYDsgXAotCSAgaW5zdD1gZWNobyAkJGkgfCBzZWQgLWUgJ3MvXFwuWzAtOWEtel0qJCQvLydgOyBcCi0JICBpbnN0PWBlY2hvICQkaW5zdCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2AuJCRleHQ7IFwKLQkgIGVjaG8gIiBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3QiOyBcCi0JICBybSAtZiAkKERFU1RESVIpJChtYW4xZGlyKS8kJGluc3Q7IFwKLQlkb25lCi1pbnN0YWxsLW1hbjogJChNQU5TKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtbWFuMQotdW5pbnN0YWxsLW1hbjoKLQlAJChOT1JNQUxfVU5JTlNUQUxMKQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHVuaW5zdGFsbC1tYW4xCi0KLSMgVGhpcyBkaXJlY3RvcnkncyBzdWJkaXJlY3RvcmllcyBhcmUgbW9zdGx5IGluZGVwZW5kZW50OyB5b3UgY2FuIGNkCi0jIGludG8gdGhlbSBhbmQgcnVuIGBtYWtlJyB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhpcyBNYWtlZmlsZS4KLSMgVG8gY2hhbmdlIHRoZSB2YWx1ZXMgb2YgYG1ha2UnIHZhcmlhYmxlczogaW5zdGVhZCBvZiBlZGl0aW5nIE1ha2VmaWxlcywKLSMgKDEpIGlmIHRoZSB2YXJpYWJsZSBpcyBzZXQgaW4gYGNvbmZpZy5zdGF0dXMnLCBlZGl0IGBjb25maWcuc3RhdHVzJwotIyAgICAgKHdoaWNoIHdpbGwgY2F1c2UgdGhlIE1ha2VmaWxlcyB0byBiZSByZWdlbmVyYXRlZCB3aGVuIHlvdSBydW4gYG1ha2UnKTsKLSMgKDIpIG90aGVyd2lzZSwgcGFzcyB0aGUgZGVzaXJlZCB2YWx1ZXMgb24gdGhlIGBtYWtlJyBjb21tYW5kIGxpbmUuCi0KLUBTRVRfTUFLRUAKLQotYWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIGluc3RhbGwtZXhlYy1yZWN1cnNpdmUgXAotaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGluc3RhbGwtcmVjdXJzaXZlIHVuaW5zdGFsbC1yZWN1cnNpdmUgaW5zdGFsbC1pbmZvLXJlY3Vyc2l2ZSBcCi1jaGVjay1yZWN1cnNpdmUgaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICBlY2hvICJNYWtpbmcgJCR0YXJnZXQgaW4gJCRzdWJkaXIiOyBcCi0JICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAiLiI7IHRoZW4gXAotCSAgICBkb3Rfc2Vlbj15ZXM7IFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZTsgXAotCWlmIHRlc3QgIiQkZG90X3NlZW4iID0gIm5vIjsgdGhlbiBcCi0JICAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAiJCR0YXJnZXQtYW0iIHx8IGV4aXQgMTsgXAotCWZpOyB0ZXN0IC16ICIkJGZhaWwiCi0KLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZToKLQlAc2V0IGZub3JkICQoTUFLRUZMQUdTKTsgYW1mPSQkMjsgXAotCWRvdF9zZWVuPW5vOyBcCi0JcmV2PScnOyBsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHJldj0iJCRzdWJkaXIgJCRyZXYiOyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAiLiIgJiYgZG90X3NlZW49eWVzOyBcCi0JZG9uZTsgXAotCXRlc3QgIiQkZG90X3NlZW4iID0gIm5vIiAmJiByZXY9Ii4gJCRyZXYiOyBcCi0JdGFyZ2V0PWBlY2hvICRAIHwgc2VkIHMvLXJlY3Vyc2l2ZS8vYDsgXAotCWZvciBzdWJkaXIgaW4gJCRyZXY7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQtYW0iOyBcCi0JICBlbHNlIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldCI7IFwKLQkgIGZpOyBcCi0JICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgJCRsb2NhbF90YXJnZXQpIFwKLQkgICB8fCBjYXNlICIkJGFtZiIgaW4gKj0qKSBleGl0IDE7OyAqayopIGZhaWw9eWVzOzsgKikgZXhpdCAxOzsgZXNhYzsgXAotCWRvbmUgJiYgdGVzdCAteiAiJCRmYWlsIgotdGFncy1yZWN1cnNpdmU6Ci0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0JICB0ZXN0ICIkJHN1YmRpciIgPSAuIHx8IChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSB0YWdzKTsgXAotCWRvbmUKLQotdGFnczogVEFHUwotCi1JRDogJChIRUFERVJTKSAkKFNPVVJDRVMpICQoTElTUCkKLQlsaXN0PSckKFNPVVJDRVMpICQoSEVBREVSUyknOyBcCi0JdW5pcXVlPWBmb3IgaSBpbiAkJGxpc3Q7IGRvIGVjaG8gJCRpOyBkb25lIHwgXAotCSAgYXdrICcgICAgeyBmaWxlc1skJDBdID0gMTsgfSBcCi0JICAgICAgIEVORCB7IGZvciAoaSBpbiBmaWxlcykgcHJpbnQgaTsgfSdgOyBcCi0JaGVyZT1gcHdkYCAmJiBjZCAkKHNyY2RpcikgXAotCSAgJiYgbWtpZCAtZiQkaGVyZS9JRCAkJHVuaXF1ZSAkKExJU1ApCi0KLVRBR1M6IHRhZ3MtcmVjdXJzaXZlICQoSEVBREVSUykgJChTT1VSQ0VTKSBjb25maWcuaW4gJChUQUdTX0RFUEVOREVOQ0lFUykgJChMSVNQKQotCXRhZ3M9OyBcCi0JaGVyZT1gcHdkYDsgXAotCWxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotICAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZiAkJHN1YmRpci9UQUdTICYmIHRhZ3M9IiQkdGFncyAtaSAkJGhlcmUvJCRzdWJkaXIvVEFHUyI7IFwKLSAgIGZpOyBcCi0JZG9uZTsgXAotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQl0ZXN0IC16ICIkKEVUQUdTX0FSR1MpY29uZmlnLmluJCR1bmlxdWUkKExJU1ApJCR0YWdzIiBcCi0JICB8fCAoY2QgJChzcmNkaXIpICYmIGV0YWdzICQoRVRBR1NfQVJHUykgJCR0YWdzIGNvbmZpZy5pbiAkJHVuaXF1ZSAkKExJU1ApIC1vICQkaGVyZS9UQUdTKQotCi1tb3N0bHljbGVhbi10YWdzOgotCi1jbGVhbi10YWdzOgotCi1kaXN0Y2xlYW4tdGFnczoKLQktcm0gLWYgVEFHUyBJRAotCi1tYWludGFpbmVyLWNsZWFuLXRhZ3M6Ci0KLWRpc3RkaXIgPSAkKFBBQ0tBR0UpLSQoVkVSU0lPTikKLXRvcF9kaXN0ZGlyID0gJChkaXN0ZGlyKQotCi0jIFRoaXMgdGFyZ2V0IHVudGFycyB0aGUgZGlzdCBmaWxlIGFuZCB0cmllcyBhIFZQQVRIIGNvbmZpZ3VyYXRpb24uICBUaGVuCi0jIGl0IGd1YXJhbnRlZXMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIHNlbGYtY29udGFpbmVkIGJ5IG1ha2luZyBhbm90aGVyCi0jIHRhcmZpbGUuCi1kaXN0Y2hlY2s6IGRpc3QKLQktcm0gLXJmICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSB6eGYgJChkaXN0ZGlyKS50YXIuZ3oKLQlta2RpciAkKGRpc3RkaXIpLz1idWlsZAotCW1rZGlyICQoZGlzdGRpcikvPWluc3QKLQlkY19pbnN0YWxsX2Jhc2U9YGNkICQoZGlzdGRpcikvPWluc3QgJiYgcHdkYDsgXAotCWNkICQoZGlzdGRpcikvPWJ1aWxkIFwKLQkgICYmIC4uL2NvbmZpZ3VyZSAtLXNyY2Rpcj0uLiAtLXByZWZpeD0kJGRjX2luc3RhbGxfYmFzZSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkdmkgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgaW5zdGFsbCBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsY2hlY2sgXAotCSAgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUBiYW5uZXI9IiQoZGlzdGRpcikudGFyLmd6IGlzIHJlYWR5IGZvciBkaXN0cmlidXRpb24iOyBcCi0JZGFzaGVzPWBlY2hvICIkJGJhbm5lciIgfCBzZWQgcy8uLz0vZ2A7IFwKLQllY2hvICIkJGRhc2hlcyI7IFwKLQllY2hvICIkJGJhbm5lciI7IFwKLQllY2hvICIkJGRhc2hlcyIKLWRpc3Q6IGRpc3RkaXIKLQktY2htb2QgLVIgYStyICQoZGlzdGRpcikKLQlHWklQPSQoR1pJUF9FTlYpICQoVEFSKSBjaG96ZiAkKGRpc3RkaXIpLnRhci5neiAkKGRpc3RkaXIpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi1kaXN0LWFsbDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3RkaXI6ICQoRElTVEZJTEVTKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotCW1rZGlyICQoZGlzdGRpcikKLQktY2htb2QgNzc3ICQoZGlzdGRpcikKLQlAZm9yIGZpbGUgaW4gJChESVNURklMRVMpOyBkbyBcCi0JICBpZiB0ZXN0IC1mICQkZmlsZTsgdGhlbiBkPS47IGVsc2UgZD0kKHNyY2Rpcik7IGZpOyBcCi0JICBpZiB0ZXN0IC1kICQkZC8kJGZpbGU7IHRoZW4gXAotCSAgICBjcCAtcHIgJCQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlOyBcCi0JICBlbHNlIFwKLQkgICAgdGVzdCAtZiAkKGRpc3RkaXIpLyQkZmlsZSBcCi0JICAgIHx8IGxuICQkZC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGUgMj4gL2Rldi9udWxsIFwKLQkgICAgfHwgY3AgLXAgJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSB8fCA6OyBcCi0JICBmaTsgXAotCWRvbmUKLQlmb3Igc3ViZGlyIGluICQoU1VCRElSUyk7IGRvIFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9IC47IHRoZW4gOjsgZWxzZSBcCi0JICAgIHRlc3QgLWQgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IG1rZGlyICQoZGlzdGRpcikvJCRzdWJkaXIgXAotCSAgICB8fCBleGl0IDE7IFwKLQkgICAgY2htb2QgNzc3ICQoZGlzdGRpcikvJCRzdWJkaXI7IFwKLQkgICAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPS4uLyQoZGlzdGRpcikgZGlzdGRpcj0uLi8kKGRpc3RkaXIpLyQkc3ViZGlyIGRpc3RkaXIpIFwKLQkgICAgICB8fCBleGl0IDE7IFwKLQkgIGZpOyBcCi0JZG9uZQotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRvcF9kaXN0ZGlyPSIkKHRvcF9kaXN0ZGlyKSIgZGlzdGRpcj0iJChkaXN0ZGlyKSIgZGlzdC1pbmZvCi0KLURFSkFUT09MID0gJChQQUNLQUdFKQotCi1SVU5URVNUREVGQVVMVEZMQUdTID0gLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQkc3JjZGlyCi1zaXRlLmV4cDogTWFrZWZpbGUKLQlAZWNobyAnTWFraW5nIGEgbmV3IHNpdGUuZXhwIGZpbGUuLi4nCi0JQHRlc3QgISAtZiBzaXRlLmJhayB8fCBybSAtZiBzaXRlLmJhawotCUBlY2hvICcjIyB0aGVzZSB2YXJpYWJsZXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1ha2UgIyMnID4gJEAtdAotCUBlY2hvICcjIERvIG5vdCBlZGl0IGhlcmUuICBJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGVzZSB2YWx1ZXMnID4+ICRALXQKLQlAZWNobyAnIyBlZGl0IHRoZSBsYXN0IHNlY3Rpb24nID4+ICRALXQKLQlAZWNobyAnc2V0IHRvb2wgJChERUpBVE9PTCknID4+ICRALXQKLQlAZWNobyAnc2V0IHNyY2RpciAkKHNyY2RpciknID4+ICRALXQKLQlAZWNobyAnc2V0IG9iamRpcicgYHB3ZGAgPj4gJEAtdAotCUBlY2hvICdzZXQgaG9zdF9hbGlhcyAkKGhvc3RfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCBob3N0X3RyaXBsZXQgJChob3N0X3RyaXBsZXQpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfYWxpYXMgJCh0YXJnZXRfYWxpYXMpJyA+PiAkQC10Ci0JQGVjaG8gJ3NldCB0YXJnZXRfdHJpcGxldCAkKHRhcmdldF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICdzZXQgYnVpbGRfYWxpYXMgJChidWlsZF9hbGlhcyknID4+ICRALXQKLQlAZWNobyAnc2V0IGJ1aWxkX3RyaXBsZXQgJChidWlsZF90cmlwbGV0KScgPj4gJEAtdAotCUBlY2hvICcjIyBBbGwgdmFyaWFibGVzIGFib3ZlIGFyZSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlLiBEbyBOb3QgRWRpdCAjIycgPj4gJEAtdAotCUB0ZXN0ICEgLWYgc2l0ZS5leHAgfHwgc2VkICcxLC9eIyMgQWxsIHZhcmlhYmxlcyBhYm92ZSBhcmUuKiMjLyBkJyBzaXRlLmV4cCA+PiAkQC10Ci0JQHRlc3QgISAtZiBzaXRlLmV4cCB8fCBtdiBzaXRlLmV4cCBzaXRlLmJhawotCUBtdiAkQC10IHNpdGUuZXhwCi1pbmZvLWFtOiAkKElORk9fREVQUykKLWluZm86IGluZm8tcmVjdXJzaXZlCi1kdmktYW06ICQoRFZJUykKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgY2hlY2stREVKQUdOVQotY2hlY2s6IGNoZWNrLXJlY3Vyc2l2ZQotaW5zdGFsbGNoZWNrLWFtOgotaW5zdGFsbGNoZWNrOiBpbnN0YWxsY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsLWluZm8tYW06IAotaW5zdGFsbC1pbmZvOiBpbnN0YWxsLWluZm8tcmVjdXJzaXZlCi1hbGwtcmVjdXJzaXZlLWFtOiBjb25maWcuaAotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGFsbC1yZWN1cnNpdmUKLQotaW5zdGFsbC1leGVjLWFtOiBpbnN0YWxsLWV4ZWMtbG9jYWwKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06IGluc3RhbGwtbWFuIGluc3RhbGwtZGF0YS1sb2NhbAotaW5zdGFsbC1kYXRhOiBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlCi0KLWluc3RhbGwtYW06IGFsbC1hbQotCUAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1kYXRhLWFtCi1pbnN0YWxsOiBpbnN0YWxsLXJlY3Vyc2l2ZQotdW5pbnN0YWxsLWFtOiB1bmluc3RhbGwtbWFuCi11bmluc3RhbGw6IHVuaW5zdGFsbC1yZWN1cnNpdmUKLWFsbC1hbTogTWFrZWZpbGUgJChQUk9HUkFNUykgJChNQU5TKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChtYW5kaXIpL21hbjEKLQotCi1tb3N0bHljbGVhbi1nZW5lcmljOgotCS10ZXN0IC16ICIkKE1PU1RMWUNMRUFORklMRVMpIiB8fCBybSAtZiAkKE1PU1RMWUNMRUFORklMRVMpCi0KLWNsZWFuLWdlbmVyaWM6Ci0JLXRlc3QgLXogIiQoQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoQ0xFQU5GSUxFUykKLQotZGlzdGNsZWFuLWdlbmVyaWM6Ci0JLXJtIC1mIE1ha2VmaWxlICQoQ09ORklHX0NMRUFOX0ZJTEVTKQotCS1ybSAtZiBjb25maWcuY2FjaGUgY29uZmlnLmxvZyBzdGFtcC1oIHN0YW1wLWhbMC05XSoKLQktdGVzdCAteiAiJChESVNUQ0xFQU5GSUxFUykiIHx8IHJtIC1mICQoRElTVENMRUFORklMRVMpCi0KLW1haW50YWluZXItY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAibGRsZXhsbGRncmFtaGxkZ3JhbWMkKE1BSU5UQUlORVJDTEVBTkZJTEVTKSIgfHwgcm0gLWYgbGRsZXhsIGxkZ3JhbWggbGRncmFtYyAkKE1BSU5UQUlORVJDTEVBTkZJTEVTKQotbW9zdGx5Y2xlYW4tYW06ICBtb3N0bHljbGVhbi1oZHIgbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1hbWluZm8gbW9zdGx5Y2xlYW4tdGFncyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLQkJbW9zdGx5Y2xlYW4tbG9jYWwKLQotbW9zdGx5Y2xlYW46IG1vc3RseWNsZWFuLXJlY3Vyc2l2ZQotCi1jbGVhbi1hbTogIGNsZWFuLWhkciBjbGVhbi1ub2luc3RQUk9HUkFNUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1hbWluZm8gY2xlYW4tdGFncyBjbGVhbi1nZW5lcmljIG1vc3RseWNsZWFuLWFtCi0KLWNsZWFuOiBjbGVhbi1yZWN1cnNpdmUKLQotZGlzdGNsZWFuLWFtOiAgZGlzdGNsZWFuLWhkciBkaXN0Y2xlYW4tbm9pbnN0UFJPR1JBTVMgZGlzdGNsZWFuLWNvbXBpbGUgXAotCQlkaXN0Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tYW1pbmZvIGRpc3RjbGVhbi10YWdzIFwKLQkJZGlzdGNsZWFuLWdlbmVyaWMgY2xlYW4tYW0gZGlzdGNsZWFuLWxvY2FsCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RQUk9HUkFNUyBcCi0JCW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtYWludGFpbmVyLWNsZWFuLWxpYnRvb2wgXAotCQltYWludGFpbmVyLWNsZWFuLWFtaW5mbyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0UFJPR1JBTVMgZGlzdGNsZWFuLW5vaW5zdFBST0dSQU1TIFwKLWNsZWFuLW5vaW5zdFBST0dSQU1TIG1haW50YWluZXItY2xlYW4tbm9pbnN0UFJPR1JBTVMgXAotbW9zdGx5Y2xlYW4tY29tcGlsZSBkaXN0Y2xlYW4tY29tcGlsZSBjbGVhbi1jb21waWxlIFwKLW1haW50YWluZXItY2xlYW4tY29tcGlsZSBtb3N0bHljbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJ0b29sIFwKLWNsZWFuLWxpYnRvb2wgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIGluc3RhbGwtaW5mby1hbSB1bmluc3RhbGwtaW5mbyBcCi1tb3N0bHljbGVhbi1hbWluZm8gZGlzdGNsZWFuLWFtaW5mbyBjbGVhbi1hbWluZm8gXAotbWFpbnRhaW5lci1jbGVhbi1hbWluZm8gaW5zdGFsbC1tYW4xIHVuaW5zdGFsbC1tYW4xIGluc3RhbGwtbWFuIFwKLXVuaW5zdGFsbC1tYW4gaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZGF0YS1yZWN1cnNpdmUgXAotaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSB1bmluc3RhbGwtZXhlYy1yZWN1cnNpdmUgaW5zdGFsbGRpcnMtcmVjdXJzaXZlIFwKLXVuaW5zdGFsbGRpcnMtcmVjdXJzaXZlIGFsbC1yZWN1cnNpdmUgY2hlY2stcmVjdXJzaXZlIFwKLWluc3RhbGxjaGVjay1yZWN1cnNpdmUgaW5mby1yZWN1cnNpdmUgZHZpLXJlY3Vyc2l2ZSBcCi1tb3N0bHljbGVhbi1yZWN1cnNpdmUgZGlzdGNsZWFuLXJlY3Vyc2l2ZSBjbGVhbi1yZWN1cnNpdmUgXAotbWFpbnRhaW5lci1jbGVhbi1yZWN1cnNpdmUgdGFncyB0YWdzLXJlY3Vyc2l2ZSBtb3N0bHljbGVhbi10YWdzIFwKLWRpc3RjbGVhbi10YWdzIGNsZWFuLXRhZ3MgbWFpbnRhaW5lci1jbGVhbi10YWdzIGRpc3RkaXIgY2hlY2stREVKQUdOVSBcCi1pbmZvLWFtIGluZm8gZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIFwKLWluc3RhbGwtaW5mby1hbSBpbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtbG9jYWwgXAotaW5zdGFsbC1leGVjLWFtIGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEtbG9jYWwgaW5zdGFsbC1kYXRhLWFtIFwKLWluc3RhbGwtZGF0YSBpbnN0YWxsLWFtIGluc3RhbGwgdW5pbnN0YWxsLWFtIHVuaW5zdGFsbCBhbGwtcmVkaXJlY3QgXAotYWxsLWFtIGFsbCBpbnN0YWxsZGlycy1hbSBpbnN0YWxsZGlycyBtb3N0bHljbGVhbi1nZW5lcmljIFwKLWRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWdlbmVyaWMgbWFpbnRhaW5lci1jbGVhbi1nZW5lcmljIGNsZWFuIFwKLW1vc3RseWNsZWFuIGRpc3RjbGVhbiBtYWludGFpbmVyLWNsZWFuCi0KLQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotbGRtYWluLm86IGxkbWFpbi5jIGNvbmZpZy5zdGF0dXMKLQkkKENPTVBJTEUpIC1jIC1EREVGQVVMVF9FTVVMQVRJT049JyIkKEVNVUwpIicgLURTQ1JJUFRESVI9JyIkKHNjcmlwdGRpcikiJyAtRFRBUkdFVD0nIkB0YXJnZXRAIicgJChzcmNkaXIpL2xkbWFpbi5jCi0KLWxkZW11bC1saXN0Lmg6IE1ha2VmaWxlCi0JKGVjaG8gIi8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gIERPIE5PVCBFRElUISAqLyI7XAotCWZvciBmIGluIGBlY2hvICIgIiAke0VNVUxBVElPTl9PRklMRVN9ICIiIFwKLQkgfCBzZWQgLWUgJ3MvIGUvIGxkL2cnIC1lICdzLyBsZC8gL2cnIC1lICdzL1suXW8vL2cnYDsgZG8gXAotCSAgICBlY2hvICJleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSBsZF8kJHtmfV9lbXVsYXRpb247IjsgXAotCWRvbmU7XAotCWVjaG8gIiI7XAotCWVjaG8gIiNkZWZpbmUgRU1VTEFUSU9OX0xJU1QgXFwiO1wKLQlmb3IgZiBpbiBgZWNobyAiICIgJHtFTVVMQVRJT05fT0ZJTEVTfSAiIiBcCi0JIHwgc2VkIC1lICdzLyBlLyBsZC9nJyAtZSAncy8gbGQvIC9nJyAtZSAncy9bLl1vLy9nJ2A7IGRvIFwKLQkgICAgZWNobyAiICAmbGRfJCR7Zn1fZW11bGF0aW9uLCBcXCI7IFwKLQlkb25lO1wKLQllY2hvICIgIDAiKSA+bGRlbXVsLXRtcC5oCi0JbXYgbGRlbXVsLXRtcC5oIGxkZW11bC1saXN0LmgKLUBURElSU0AKLQotZWEyOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYTI5ay5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYTI5ay5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYTI5ayAiJCh0ZGlyX2EyOWspIgotZWFpeHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhwcGMgIiQodGRpcl9haXhwcGMpIgotZWFpeHJzNi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9haXhyczYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhaXhyczYgIiQodGRpcl9haXhyczYpIgotZWFscGhhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FscGhhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hbHBoYS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYWxwaGEgIiQodGRpcl9hbHBoYSkiCi1lYXJjZWxmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FyY2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcmNlbGYgIiQodGRpcl9hcmNlbGYpIgotZWFybWVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1lbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGYgIiQodGRpcl9hcm1lbGYpIgotZWFybWVsZl9vYWJpLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfb2FiaSAiJCh0ZGlyX2FybWVsZikiCi1lYXJtZWxmX2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtZWxmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWVsZl9saW51eCAiJCh0ZGlyX2FybWVsZl9saW51eCkiCi1lYXJtZWxmX2xpbnV4MjYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtZWxmX2xpbnV4MjYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FybWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBhcm1lbGZfbGludXgyNiAiJCh0ZGlyX2FybWVsZl9saW51eDI2KSIKLWVhcm1hb3V0Yi5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtYW91dGIgIiQodGRpcl9hcm1hb3V0YikiCi1lYXJtYW91dGwuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtYW91dGwuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybWFvdXRsICIkKHRkaXJfYXJtYW91dGwpIgotZWFybWNvZmYuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvYXJtY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYXJtY29mZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYXJtY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gYXJtY29mZiAiJCh0ZGlyX2FybWNvZmYpIgotZWFybXBlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2FybXBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGFybXBlICIkKHRkaXJfYXJtcGUpIgotZWNvZmZfc3BhcmMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBjb2ZmX3NwYXJjICIkKHRkaXJfY29mZl9zcGFyYykiCi1lZDEwdmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMTB2ZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMTB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMTB2ZWxmICIkKHRkaXJfZDEwdikiCi1lZDMwdmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kMzB2ZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZkMzB2LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkMzB2ZWxmICIkKHRkaXJfZDMwdikiCi1lZDMwdl9vLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZfby5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdl9vICIkKHRkaXJfZDMwdikiCi1lZDMwdl9lLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2QzMHZfZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZDMwdl9lICIkKHRkaXJfZDMwdikiCi1lZGVsdGE2OC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9kZWx0YTY4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9kZWx0YTY4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBkZWx0YTY4ICIkKHRkaXJfZGVsdGE2OCkiCi1lZWJtb24yOWsuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWJtb24yOWsuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VibW9uMjlrLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlYm1vbjI5ayAiJCh0ZGlyX2VibW9uMjlrKSIKLWVlbGYzMmZyMzAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmZyMzAgIiQodGRpcl9mcjMwKSIKLWVlbGYzMm1jb3JlLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybWNvcmUgIiQodGRpcl9tY29yZSkiCi1lbTMycmVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tMzJyZWxmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG0zMnJlbGYgIiQodGRpcl9tMzJyKSIKLWVlbGYzMl9zcGFyYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJfc3BhcmMgIiQodGRpcl9lbGYzMl9zcGFyYykiCi1lZWxmMzJfaTk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMl9pOTYwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMl9pOTYwICIkKHRkaXJfZWxmMzJfaTk2MCkiCi1lZWxmMzJiNDMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmI0MzAwICIkKHRkaXJfZWxmMzJiNDMwMCkiCi1lZWxmMzJibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJibWlwICIkKHRkaXJfZWxmMzJibWlwKSIKLWVlbGYzMmJzbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyYnNtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyYnNtaXAgIiQodGRpcl9lbGYzMmJzbWlwKSIKLWVlbGYzMmVibWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZWJtaXAgIiQodGRpcl9lbGYzMmVibWlwKSIKLWVlbGYzMmVsbWlwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMyZWxtaXAgIiQodGRpcl9lbGYzMmVsbWlwKSIKLWVlbGYzMmw0MzAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjMybDQzMDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybDQzMDAgIiQodGRpcl9lbGYzMmw0MzAwKSIKLWVlbGYzMmxtaXAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJsbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxtaXAgIiQodGRpcl9lbGYzMmxtaXApIgotZWVsZjMybHBwYy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMybHBwYyAiJCh0ZGlyX2VsZjMybHBwYykiCi1lZWxmMzJsc21pcC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGYzMmxzbWlwLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGYzMmxzbWlwICIkKHRkaXJfZWxmMzJsc21pcCkiCi1lZWxmMzJwcGMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZjMycHBjICIkKHRkaXJfZWxmMzJwcGMpIgotZWVsZjMycHBjbGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmMzJwcGNsaW51eCAiJCh0ZGlyX2VsZjMycHBjbGludXgpIgotZWVsZjY0YWxwaGEuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmNjRhbHBoYSAiJCh0ZGlyX2VsZjY0YWxwaGEpIgotZWVsZjY0X3NwYXJjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBlbGY2NF9zcGFyYyAiJCh0ZGlyX2VsZjY0X3NwYXJjKSIKLWVlbGZfaTM4Ni5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZWxmX2kzODYgIiQodGRpcl9lbGZfaTM4NikiCi1lZWxmX2kzODZfYmUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGVsZl9pMzg2X2JlICIkKHRkaXJfZWxmX2kzODZfYmUpIgotZWdsZDk2MC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9nbGQ5NjAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dsZDk2MC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTk2MC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gZ2xkOTYwICIkKHRkaXJfZ2xkOTYwKSIKLWVnbGQ5NjBjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dsZDk2MGMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2k5NjAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdsZDk2MGNvZmYgIiQodGRpcl9nbGQ5NjBjb2ZmKSIKLWVnbzMyLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2dvMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGdvMzIgIiQodGRpcl9nbzMyKSIKLWVoODMwMC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDgzMDAuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwICIkKHRkaXJfaDgzMDApIgotZWg4MzAwaC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODMwMGguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4MzAwaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDgzMDBoICIkKHRkaXJfaDgzMDBoKSIKLWVoODMwMHMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDgzMDBzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODMwMHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4MzAwcyAiJCh0ZGlyX2g4MzAwcykiCi1laDg1MDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMCAiJCh0ZGlyX2g4NTAwKSIKLWVoODUwMGIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBiLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMGIuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwYiAiJCh0ZGlyX2g4NTAwYikiCi1laDg1MDBjLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2g4NTAwYy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaDg1MDBjLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBoODUwMGMgIiQodGRpcl9oODUwMGMpIgotZWg4NTAwbS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9oODUwMG0uc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2g4NTAwbS5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaDg1MDBtICIkKHRkaXJfaDg1MDBtKSIKLWVoODUwMHMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaDg1MDBzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9oODUwMHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGg4NTAwcyAiJCh0ZGlyX2g4NTAwcykiCi1laHAzMDBic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaHAzMDBic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGhwMzAwYnNkICIkKHRkaXJfaHAzMDBic2QpIgotZWhwM2hwdXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaHAzaHB1eC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHAzaHB1eCAiJCh0ZGlyX2hwM2hwdXgpIgotZWhwcGFlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaHBwYWVsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvaHBwYWVsZi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaHBwYWVsZiAiJCh0ZGlyX2hwcGFlbGYpIgotZWkzODZhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZhb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2YW91dCAiJCh0ZGlyX2kzODZhb3V0KSIKLWVpMzg2YmVvcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2YmVvcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvYmVvcy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZiZW9zICIkKHRkaXJfaTM4NmJlb3MpIgotZWkzODZic2QuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmJzZCAiJCh0ZGlyX2kzODZic2QpIgotZWkzODZjb2ZmLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmNvZmYgIiQodGRpcl9pMzg2Y29mZikiCi1laTM4NmdvMzIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmdvMzIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2Z28zMiAiJCh0ZGlyX2kzODZnbzMyKSIKLWVpMzg2bGludXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NmxpbnV4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9saW51eC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4NmxpbnV4ICIkKHRkaXJfaTM4NmxpbnV4KSIKLWVpMzg2bHlueC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZseW54ICIkKHRkaXJfaTM4Nmx5bngpIgotZWkzODZtYWNoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2kzODZtYWNoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bWFjaCAiJCh0ZGlyX2kzODZtYWNoKSIKLWVpMzg2bW9zcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bW9zcy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvZWxmLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBpMzg2bW9zcyAiJCh0ZGlyX2kzODZtb3NzKSIKLWVpMzg2bXNkb3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZtc2RvcyAiJCh0ZGlyX2kzODZtc2RvcykiCi1laTM4Nm5ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4Nm5ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZuYnNkICIkKHRkaXJfaTM4Nm5ic2QpIgotZWkzODZudy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9pMzg2bncuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9udy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gaTM4Nm53ICIkKHRkaXJfaTM4Nm53KSIKLWVpMzg2cGUuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvaTM4NnBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IGkzODZwZSAiJCh0ZGlyX2kzODZwZSkiCi1lbG5rOTYwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL2xuazk2MC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbG5rOTYwLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9pOTYwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBsbms5NjAgIiQodGRpcl9sbms5NjApIgotZW02OGs0a25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4azRrbmJzZC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4azRrbmJzZCAiJCh0ZGlyX202OGs0a25ic2QpIgotZW02OGthb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGthb3V0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrYW91dCAiJCh0ZGlyX202OGthb3V0KSIKLWVtNjhrYXV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGthdXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL202OGthdXguc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGthdXggIiQodGRpcl9tNjhrYXV4KSIKLWVtNjhrY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrY29mZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtjb2ZmICIkKHRkaXJfbTY4a2NvZmYpIgotZW02OGtlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a2VsZi5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2VsZiAiJCh0ZGlyX202OGtlbGYpIgotZW02OGtsaW51eC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tNjhrbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtNjhrbGludXggIiQodGRpcl9tNjhrbGludXgpIgotZW02OGtseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtseW54LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a2x5bnggIiQodGRpcl9tNjhrbHlueCkiCi1lbTY4a25ic2QuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvbTY4a25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG02OGtuYnNkICIkKHRkaXJfbTY4a25ic2QpIgotZW02OGtwc29zLmM6CSQoc3JjZGlyKS9lbXVscGFyYW1zL202OGtwc29zLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9lbGYzMi5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcHNvcy5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbTY4a3Bzb3MgIiQodGRpcl9tNjhrcHNvcykiCi1lbTg4a2Jjcy5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tODhrYmNzLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtODhrYmNzICIkKHRkaXJfbTg4a2JjcykiCi1lbWNvcmVwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9tY29yZXBlLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9wZS5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvcGUuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1jb3JlcGUgIiQodGRpcl9tY29yZXBlKSIKLWVtaXBzYmlnLmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzYmlnLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzYmlnCi1lbWlwc2JzZC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzYnNkLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzYnNkLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzYnNkCi1lbWlwc2lkdC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzaWR0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNpZHQgIiQodGRpcl9taXBzaWR0KSIKLWVtaXBzaWR0bC5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzaWR0bC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvbWlwc2Vjb2ZmLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzaWR0bCAiJCh0ZGlyX21pcHNpZHRsKSIKLWVtaXBzbGl0LmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzbGl0LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9taXBzLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBtaXBzbGl0ICIkKHRkaXJfbWlwc2xpdCkiCi1lbWlwc2xuZXdzLmM6ICAkKHNyY2RpcikvZW11bHBhcmFtcy9taXBzbG5ld3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL21pcHMuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG1pcHNsbmV3cwotZW1uMTAzMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDMwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDMwMCAiJCh0ZGlyX21uMTAzMDApIgotZW1uMTAyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbW4xMDIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2VsZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbW4xMDIwMCAiJCh0ZGlyX21uMTAyMDApIgotZW5ld3MuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvbmV3cy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gbmV3cyAiJCh0ZGlyX25ld3MpIgotZW5zMzJrbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9uczMya25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IG5zMzJrbmJzZCAiJCh0ZGlyX25zMzJrbmJzZCkiCi1lcGM1MzJtYWNoYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwYzUzMm1hY2hhICIkKHRkaXJfcGM1MzJtYWNoYSkiCi1lcHBjbWFjb3MuYzoJJChzcmNkaXIpL2VtdWxwYXJhbXMvcHBjbWFjb3Muc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2FpeC5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYWl4LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNtYWNvcyAiJCh0ZGlyX3BwY21hY29zKSIKLWVwcGNudy5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNudy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZWxmMzIuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL253LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNudyAiJCh0ZGlyX3BwY253KSIKLWVwcGNwZS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9wcGNwZS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvcGUuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3BwY3BlLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBwcGNwZSAiJCh0ZGlyX3BwY3BlKSIKLWVyaXNjaXguYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvcmlzY2l4LnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSByaXNjaXggIiQodGRpcl9yaXNjaXgpIgotZXNhMjkyMDAuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2EyOTIwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2EyOTIwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2EyOTIwMCAiJCh0ZGlyX3NhMjkyMDApIgotZXNoLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NoLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9zaC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc2ggIiQodGRpcl9zaCkiCi1lc2hlbGYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc2hlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNoZWxmICIkKHRkaXJfc2hlbGYpIgotZXNobGVsZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy9zaGxlbGYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9lbGYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobGVsZiAiJCh0ZGlyX3NobGVsZikiCi1lc2hsLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NobC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc2guc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNobCAiJCh0ZGlyX3NobCkiCi1lc3BhcmNhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gc3BhcmNhb3V0ICIkKHRkaXJfc3BhcmNhb3V0KSIKLWVzcGFyY2xpbnV4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbGludXguc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2xpbnV4LmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2xpbnV4ICIkKHRkaXJfc3BhcmNsaW51eCkiCi1lc3BhcmNseW54LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3NwYXJjbHlueC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzcGFyY2x5bnggIiQodGRpcl9zcGFyY2x5bngpIgotZXNwYXJjbmJzZC5jOgkkKHNyY2RpcikvZW11bHBhcmFtcy9zcGFyY25ic2Quc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHNwYXJjbmJzZCAiJCh0ZGlyX3NwYXJjbmJzZCkiCi1lc3QyMDAwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N0MjAwMC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvc3QyMDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdDIwMDAgIiQodGRpcl9zdDIwMDApIgotZXN1bjMuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvc3VuMy5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvc3Vub3MuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHN1bjMgIiQodGRpcl9zdW4zKSIKLWVzdW40LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3N1bjQuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL3N1bm9zLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC9hb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSBzdW40ICIkKHRkaXJfc3VuNCkiCi1ldGljMzBhb3V0LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3RpYzMwYW91dC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdGljMzBhb3V0LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB0aWMzMGFvdXQgIiQodGRpcl90aWMzMGFvdXQpIgotZXRpYzMwY29mZi5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy90aWMzMGNvZmYuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3RpYzMwY29mZi5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdGljMzBjb2ZmICIkKHRkaXJfdGljMzBjb2ZmKSIKLWV0aWM4MGNvZmYuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHRpYzgwY29mZiAiJCh0ZGlyX3RpYzgwY29mZikiCi1ldmFuaWxsYS5jOiAkKHNyY2RpcikvZW11bHBhcmFtcy92YW5pbGxhLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC92YW5pbGxhLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC92YW5pbGxhLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2YW5pbGxhICIkKHRkaXJfdmFuaWxsYSkiCi1ldmF4LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZheC5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvYW91dC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gdmF4ICIkKHRkaXJfdmF4KSIKLWV2c3RhLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3ZzdGEuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL2FvdXQuc2MgJHtHRU5fREVQRU5EU30KLQkke0dFTlNDUklQVFN9IHZzdGEgIiQodGRpcl92c3RhKSIKLWV2ODUwLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3Y4NTAuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2VsZjMyLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC92ODUwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB2ODUwICIkKHRkaXJfdjg1MCkiCi1ldzY1LmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3c2NS5zaCBcCi0gICQoc3JjZGlyKS9lbXVsdGVtcGwvZ2VuZXJpYy5lbSAkKHNyY2Rpcikvc2NyaXB0dGVtcGwvdzY1LnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB3NjUgIiQodGRpcl93NjUpIgotZXo4MDAxLmM6ICQoc3JjZGlyKS9lbXVscGFyYW1zL3o4MDAxLnNoIFwKLSAgJChzcmNkaXIpL2VtdWx0ZW1wbC9nZW5lcmljLmVtICQoc3JjZGlyKS9zY3JpcHR0ZW1wbC96ODAwMC5zYyAke0dFTl9ERVBFTkRTfQotCSR7R0VOU0NSSVBUU30gejgwMDEgIiQodGRpcl96ODAwMSkiCi1lejgwMDIuYzogJChzcmNkaXIpL2VtdWxwYXJhbXMvejgwMDIuc2ggXAotICAkKHNyY2RpcikvZW11bHRlbXBsL2dlbmVyaWMuZW0gJChzcmNkaXIpL3NjcmlwdHRlbXBsL3o4MDAwLnNjICR7R0VOX0RFUEVORFN9Ci0JJHtHRU5TQ1JJUFRTfSB6ODAwMiAiJCh0ZGlyX3o4MDAyKSIKLQotIyBUaGUgZ2VuZXJhdGVkIGVtdWxhdGlvbiBmaWxlcyBtb3N0bHkgaGF2ZSB0aGUgc2FtZSBkZXBlbmRlbmNpZXMuCi0kKEVNVUxBVElPTl9PRklMRVMpOiAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gIGxkLmggbGRtYWluLmggbGRlbXVsLmggbGRmaWxlLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkY3Rvci5oIGxkZXhwLmggbGRsYW5nLmggbGRncmFtLmgKLQotY2hlY2stREVKQUdOVTogc2l0ZS5leHAKLQlzcmNyb290PWBjZCAkKHNyY2RpcikgJiYgcHdkYDsgZXhwb3J0IHNyY3Jvb3Q7IFwKLQlyPWBwd2RgOyBleHBvcnQgcjsgXAotCUVYUEVDVD0kKEVYUEVDVCk7IGV4cG9ydCBFWFBFQ1Q7IFwKLQlpZiBbIC1mICQodG9wX2J1aWxkZGlyKS8uLi9leHBlY3QvZXhwZWN0IF07IHRoZW4gXAotCSAgVENMX0xJQlJBUlk9YGNkICQodG9wX3NyY2RpcikvLi4vdGNsL2xpYnJhcnkgJiYgcHdkYDsgXAotCSAgZXhwb3J0IFRDTF9MSUJSQVJZOyBcCi0JZmk7IFwKLQlydW50ZXN0PSQoUlVOVEVTVCk7IFwKLQlpZiAkKFNIRUxMKSAtYyAiJCRydW50ZXN0IC0tdmVyc2lvbiIgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBcCi0JICAkJHJ1bnRlc3QgLS10b29sICQoREVKQVRPT0wpIC0tc3JjZGlyICQke3NyY3Jvb3R9L3Rlc3RzdWl0ZSBcCi0JCUNDPSIkKENDX0ZPUl9UQVJHRVQpIiBDRkxBR1M9IiQoQ0ZMQUdTKSIgXAotCQlDWFg9IiQoQ1hYX0ZPUl9UQVJHRVQpIiBDWFhGTEFHUz0iJChDWFhGTEFHUykiIFwKLQkJQ0NfRk9SX0hPU1Q9IiQoQ0MpIiBDRkxBR1NfRk9SX0hPU1Q9IiQoQ0ZMQUdTKSIgXAotCQlPRklMRVM9IiQoT0ZJTEVTKSIgQkZETElCPSIkKFRFU1RCRkRMSUIpIiBcCi0JCUxJQklCRVJUWT0iJChMSUJJQkVSVFkpICQoSU5UTExJQlMpIiBcCi0JCSQoUlVOVEVTVEZMQUdTKTsgXAotCWVsc2UgZWNobyAiV0FSTklORzogY291bGQgbm90IGZpbmQgXGBydW50ZXN0JyIgMT4mMjsgOjtcCi0JZmkKLQotIyBSdWxlcyBmb3IgdGVzdGluZyBieSByZWxpbmtpbmcgbGQgaXRzZWxmLgotIyBBIHNpbWlsYXIgdGVzdCBpcyBpbiB0aGUgdGVzdHN1aXRlLiAgVGhpcyB0YXJnZXQgaXMgZm9yIGVhc2Ugb2YgdXNlCi0jIHdoZW4gcG9ydGluZyBsZC4KLQotbGQtcGFydGlhbC5vOiBsZC1uZXckKEVYRUVYVCkKLQkuL2xkLW5ldyQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZC1wYXJ0aWFsLm8gLXIgJChPRklMRVMpCi1sZDEkKEVYRUVYVCk6IGxkLXBhcnRpYWwubwotCS4vbGQtbmV3JChFWEVFWFQpICQoSE9TVElOR19FTVUpIC1vIGxkMSQoRVhFRVhUKSAkKEhPU1RJTkdfQ1JUMCkgbGQtcGFydGlhbC5vICQoVEVTVEJGRExJQikgJChMSUJJQkVSVFkpICQoSE9TVElOR19MSUJTKQotCi1sZDEtZnVsbCQoRVhFRVhUKTogbGQtbmV3Ci0JLi9sZC1uZXckKEVYRUVYVCkgJChIT1NUSU5HX0VNVSkgLW8gbGQxLWZ1bGwkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQyJChFWEVFWFQpOiBsZDEkKEVYRUVYVCkKLQkuL2xkMSQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDIkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotbGQzJChFWEVFWFQpOiBsZDIkKEVYRUVYVCkKLQkuL2xkMiQoRVhFRVhUKSAkKEhPU1RJTkdfRU1VKSAtbyBsZDMkKEVYRUVYVCkgJChIT1NUSU5HX0NSVDApICQoT0ZJTEVTKSAkKFRFU1RCRkRMSUIpICQoTElCSUJFUlRZKSAkKEhPU1RJTkdfTElCUykKLQotYm9vdHN0cmFwOiBsZDMkKEVYRUVYVCkKLQljbXAgbGQyJChFWEVFWFQpIGxkMyQoRVhFRVhUKQotCi0uUEhPTlk6IGJvb3RzdHJhcAotCi0jIEEgdGVzdCBwcm9ncmFtIGZvciBDKysgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4KLSMgVGhpcyB0ZXN0IGlzIG5vdyBpbiB0aGUgdGVzdHN1aXRlLgotIwotI2NkdGVzdDogY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vIGxkLm5ldwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QgJChIT1NUSU5HX0NSVDApIFwKLSMJICBjZHRlc3QtbWFpbi5vIGNkdGVzdC1iYXIubyBjZHRlc3QtZm9vLm8gJChIT1NUSU5HX0xJQlMpCi0jCi0jY2R0ZXN0Lm91dDogY2R0ZXN0Ci0jCS4vY2R0ZXN0ID4gY2R0ZXN0LnRtcAotIwltdiBjZHRlc3QudG1wIGNkdGVzdC5vdXQKLSMKLSNjZHRlc3QtdXIubzogY2R0ZXN0LW1haW4ubyBjZHRlc3QtYmFyLm8gY2R0ZXN0LWZvby5vIGxkLm5ldwotIwkuL2xkLm5ldyAkKEhPU1RJTkdfRU1VKSAtbyBjZHRlc3QtdXIubyAtVXIgY2R0ZXN0LW1haW4ubyBcCi0jCSAgY2R0ZXN0LWJhci5vIGNkdGVzdC1mb28ubwotIwotI2NkdGVzdC11cjogY2R0ZXN0LXVyLm8KLSMJLi9sZC5uZXcgJChIT1NUSU5HX0VNVSkgLW8gY2R0ZXN0LXVyICQoSE9TVElOR19DUlQwKSBjZHRlc3QtdXIubyBcCi0jCSAgJChIT1NUSU5HX0xJQlMpCi0jCi0jY2R0ZXN0LXVyLm91dDogY2R0ZXN0LXVyCi0jCS4vY2R0ZXN0LXVyID4gY2R0ZXN0LXVyLnRtcAotIwltdiBjZHRlc3QtdXIudG1wIGNkdGVzdC11ci5vdXQKLSMKLSNjaGVjay1jZHRlc3Q6IGNkdGVzdC5vdXQgY2R0ZXN0LXVyLm91dCAkKHNyY2RpcikvY2R0ZXN0LmV4cAotIwlkaWZmICQoc3JjZGlyKS9jZHRlc3QuZXhwIGNkdGVzdC5vdXQKLSMJZGlmZiAkKHNyY2RpcikvY2R0ZXN0LmV4cCBjZHRlc3QtdXIub3V0Ci0jCi0jLlBIT05ZOiBjaGVjay1jZHRlc3QKLQotIyBFTkQgT0YgQ0hFQ0sgVEFSR0VUUwotCi0jIERPQ1VNRU5UQVRJT04gVEFSR0VUUwotIyBNYW51YWwgY29uZmlndXJhdGlvbiBmaWxlOyBub3QgdXN1YWxseSBhdHRhY2hlZCB0byBub3JtYWwgY29uZmlndXJhdGlvbiwKLSMgYmVjYXVzZSBhbG1vc3QgYWxsIGNvbmZpZ3MgdXNlICJnZW4iIHZlcnNpb24gb2YgbWFudWFsLgotIyAgU2V0IERPQ1ZFUiBhYm92ZSB0byBjaGFuZ2UuCi1jb25maWdkb2MudGV4aToJJHtET0NWRVJ9LWRvYy50ZXhpCi0JbG4gLXMgJHtzcmNkaXJ9LyR7RE9DVkVSfS1kb2MudGV4aSAuL2NvbmZpZ2RvYy50ZXhpID4vZGV2L251bGwgMj4mMSBcCi0JICB8fCBsbiAke3NyY2Rpcn0vJHtET0NWRVJ9LWRvYy50ZXhpIC4vY29uZmlnZG9jLnRleGkgPi9kZXYvbnVsbCAyPiYxIFwKLQkgIHx8IGNwICR7c3JjZGlyfS8ke0RPQ1ZFUn0tZG9jLnRleGkgLi9jb25maWdkb2MudGV4aQotCi1sZHZlci50ZXhpOiBNYWtlZmlsZQotCXJtIC1mICRACi0JZWNobyAnQHNldCBWRVJTSU9OICQoVkVSU0lPTiknID4gJEAKLQotbGQuaW5mbzogJChzcmNkaXIpL2xkLnRleGluZm8gY29uZmlnZG9jLnRleGkgbGR2ZXIudGV4aQotCUBybSAtZiAkQCAkQC1bMC05XSAkQC1bMC05XVswLTldCi0JJChNQUtFSU5GTykgLUkgJChzcmNkaXIpIC1JICQoQkZERElSKS9kb2MgJChzcmNkaXIpL2xkLnRleGluZm8KLQotbGQuZHZpOiAkKHNyY2RpcikvbGQudGV4aW5mbyBjb25maWdkb2MudGV4aSBsZHZlci50ZXhpCi0JVEVYSU5QVVRTPSQodG9wX3NyY2RpcikvLi4vdGV4aW5mbzokJFRFWElOUFVUUyBcCi0JICBNQUtFSU5GTz0iJChNQUtFSU5GTykgLUkgJChzcmNkaXIpIC1JICQoQkZERElSKS9kb2MiICQoVEVYSTJEVkkpICQoc3JjZGlyKS9sZC50ZXhpbmZvCi0KLSMgV2Ugd2FudCB0byByZWNvbmZpZ3VyZSBpZiBjb25maWd1cmUuaG9zdCBvciBjb25maWd1cmUudGd0IGNoYW5nZXMuCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS9jb25maWd1cmUuaG9zdCAkKHNyY2RpcikvY29uZmlndXJlLnRndAotCSQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cyAtLXJlY2hlY2sKLW1vc3RseWNsZWFuLWxvY2FsOgotCS1ybSAtcmYgdG1wZGlyCi0KLS5QSE9OWTogaW5zdGFsbC1leGVjLWxvY2FsIGluc3RhbGwtZGF0YS1sb2NhbAotCi1pbnN0YWxsLWV4ZWMtbG9jYWw6IGxkLW5ldyQoRVhFRVhUKQotCSQobWtpbnN0YWxsZGlycykgJChiaW5kaXIpICQodG9vbGRpcikvYmluCi0JQGxpc3Q9JyQobm9pbnN0X1BST0dSQU1TKSc7IGZvciBwIGluICQkbGlzdDsgZG8gXAotCSAgaWYgdGVzdCAtZiAkJHA7IHRoZW4gXAotCSAgICBlY2hvICIgJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMX1BST0dSQU0pICQkcCAkKGJpbmRpcikvYGVjaG8gJCRwfHNlZCAtZSAncy8kKEVYRUVYVCkkJC8vJyAtZSAncy8tbmV3Ly8nfHNlZCAnJCh0cmFuc2Zvcm0pJ3xzZWQgJ3MvJCQvJChFWEVFWFQpLydgIjsgXAotCSAgICAkKExJQlRPT0wpICAtLW1vZGU9aW5zdGFsbCAkKElOU1RBTExfUFJPR1JBTSkgJCRwICQoYmluZGlyKS9gZWNobyAkJHB8c2VkIC1lICdzLyQoRVhFRVhUKSQkLy8nIC1lICdzLy1uZXcvLyd8c2VkICckKHRyYW5zZm9ybSknfHNlZCAncy8kJC8kKEVYRUVYVCkvJ2A7IFwKLQkgIGVsc2UgOjsgZmk7IFwKLQlkb25lCi0Jbj1gZWNobyBsZCB8IHNlZCAnJCh0cmFuc2Zvcm0pJ2A7IFwKLQlpZiBbICIkKGJpbmRpcikvJCRuJChFWEVFWFQpIiAhPSAiJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkiIF07IHRoZW4gXAotCSAgcm0gLWYgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQkgIGxuICQoYmluZGlyKS8kJG4kKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCkgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCBcCi0JICB8fCAkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTF9QUk9HUkFNKSBsZC1uZXckKEVYRUVYVCkgJCh0b29sZGlyKS9iaW4vbGQkKEVYRUVYVCk7IFwKLQlmaQotCi1pbnN0YWxsLWRhdGEtbG9jYWw6Ci0JJChta2luc3RhbGxkaXJzKSAkKHNjcmlwdGRpcikvbGRzY3JpcHRzCi0JZm9yIGYgaW4gbGRzY3JpcHRzLyo7IGRvIFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkJGYgJChzY3JpcHRkaXIpLyQkZiA7IFwKLQlkb25lCi1kaXN0c3R1ZmY6ICQoTERESVNUU1RVRkYpIGluZm8KLWRpc3RjbGVhbi1sb2NhbDoKLQlybSAtcmYgbGRzY3JpcHRzCi0KLSMgVGFyZ2V0cyB0byByZWJ1aWxkIGRlcGVuZGVuY2llcyBpbiB0aGlzIE1ha2VmaWxlLgotIyBIYXZlIHRvIGdldCByaWQgb2YgLmRlcDEgaGVyZSBzbyB0aGF0ICIkPyIgbGF0ZXIgaW5jbHVkZXMgYWxsIG9mICQoQ0ZJTEVTKS4KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpICQoR0VORVJBVEVEX0hGSUxFUykgY29uZmlnLmgKLQlybSAtZiAuZGVwMQotCSQoTUFLRSkgREVQPSQoREVQKSAuZGVwMQotCXNlZCAtZiBkZXAuc2VkIDwuZGVwMSA+LmRlcAotCi0jIFRoaXMgcnVsZSByZWFsbHkgd2FudHMgYSBta2RlcCB0aGF0IHJ1bnMgImdjYyAtTU0iLgotLmRlcDE6ICQoQ0ZJTEVTKSAkKEdFTkVSQVRFRF9DRklMRVMpCi0Jcm0gLWYgLmRlcDIKLQllY2hvICcjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuJyA+IC5kZXAyCi0JJChERVApIC1mIC5kZXAyICQoSU5DTFVERVMpICQ/Ci0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBTUkNESVJAISQoc3JjZGlyKSEnCi0KLWRlcDogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgTWFrZWZpbGUgPiB0bXAtTWFrZWZpbGUKLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlIE1ha2VmaWxlCi0KLWRlcC1pbjogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmluID4gdG1wLU1ha2VmaWxlLmluCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmluCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5pbiAkKHNyY2RpcikvTWFrZWZpbGUuaW4KLQotZGVwLWFtOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuYW0gPiB0bXAtTWFrZWZpbGUuYW0KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuYW0KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmFtICQoc3JjZGlyKS9NYWtlZmlsZS5hbQotCi0uUEhPTlk6IGRlcCBkZXAtaW4gZGVwLWFtCi0KLSMgV2hhdCBhcHBlYXJzIGJlbG93IGlzIGdlbmVyYXRlZCBieSBhIGhhY2tlZCBta2RlcCB1c2luZyBnY2MgLU1NLgotCi0jIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FIC0tIG1rZGVwIHVzZXMgaXQuCi0jIERPIE5PVCBQVVQgQU5ZVEhJTkcgQUZURVIgVEhJUyBMSU5FLCBJVCBXSUxMIEdPIEFXQVkuCi0KLWxkY3Rvci5vOiBsZGN0b3IuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9iZmRsaW5rLmggXAotICBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmggbGRjdG9yLmgKLWxkZW11bC5vOiBsZGVtdWwuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGRlbXVsLmggXAotICBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbWFpbi5oIGxkZW11bC1saXN0LmgKLWxkZXhwLm86IGxkZXhwLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1haW4uaCBsZG1pc2MuaCBsZGV4cC5oIGxkZ3JhbS5oIGxkbGFuZy5oCi1sZGZpbGUubzogbGRmaWxlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbWFpbi5oIGxkZ3JhbS5oIFwKLSAgbGRsZXguaCBsZGVtdWwuaAotbGRsYW5nLm86IGxkbGFuZy5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL29ic3RhY2suaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZGdyYW0uaCBsZGV4cC5oIGxkbGFuZy5oIGxkZW11bC5oIGxkbGV4LmggbGRtaXNjLmggXAotICBsZGN0b3IuaCBsZGZpbGUuaCAkKElOQ0RJUikvZm5tYXRjaC5oCi1sZG1haW4ubzogbGRtYWluLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKElOQ0RJUikvcHJvZ3Jlc3MuaCAkKElOQ0RJUikvYmZkbGluay5oIGxkLmggbGRtYWluLmggXAotICBsZG1pc2MuaCBsZHdyaXRlLmggbGRncmFtLmggbGRleHAuaCBsZGxhbmcuaCBsZGVtdWwuaCBcCi0gIGxkbGV4LmggbGRmaWxlLmggbGRjdG9yLmgKLWxkbWlzYy5vOiBsZG1pc2MuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoSU5DRElSKS9kZW1hbmdsZS5oIGxkLmggbGRtaXNjLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkZ3JhbS5oIGxkbGV4LmggbGRtYWluLmggbGRmaWxlLmgKLWxkdmVyLm86IGxkdmVyLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBsZC5oIGxkdmVyLmggXAotICBsZGVtdWwuaCBsZG1haW4uaAotbGR3cml0ZS5vOiBsZHdyaXRlLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgJChJTkNESVIpL2xpYmliZXJ0eS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBsZHdyaXRlLmggXAotICBsZG1pc2MuaCBsZGdyYW0uaCBsZG1haW4uaAotbGV4c3VwLm86IGxleHN1cC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChJTkNESVIpL2dldG9wdC5oICQoSU5DRElSKS9iZmRsaW5rLmggbGQuaCBsZG1haW4uaCBcCi0gIGxkbWlzYy5oIGxkZXhwLmggbGRsYW5nLmggbGRncmFtLmggbGRsZXguaCBsZGZpbGUuaCBcCi0gIGxkdmVyLmggbGRlbXVsLmgKLW1yaS5vOiBtcmkuYyAuLi9iZmQvYmZkLmggJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIGxkLmggbGRleHAuaCBsZGxhbmcuaCBcCi0gIGxkbWlzYy5oIG1yaS5oIGxkZ3JhbS5oICQoSU5DRElSKS9saWJpYmVydHkuaAotbGRjcmVmLm86IGxkY3JlZi5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkbWFpbi5oIGxkbWlzYy5oIGxkZXhwLmggXAotICBsZGxhbmcuaAotcGUtZGxsLm86IHBlLWRsbC5jIC4uL2JmZC9iZmQuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9mb3Blbi1zYW1lLmggJChJTkNESVIpL2JmZGxpbmsuaCBcCi0gICQoSU5DRElSKS9saWJpYmVydHkuaCBsZC5oIGxkZXhwLmggbGRsYW5nLmggbGR3cml0ZS5oIFwKLSAgbGRtaXNjLmggbGRncmFtLmggbGRtYWluLmggbGRlbXVsLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCBcCi0gIC4uL2JmZC9saWJjb2ZmLmggZGVmZmlsZS5oCi1sZGdyYW0ubzogbGRncmFtLmMgLi4vYmZkL2JmZC5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCAkKElOQ0RJUikvYmZkbGluay5oIFwKLSAgbGQuaCBsZGV4cC5oIGxkdmVyLmggbGRsYW5nLmggbGRlbXVsLmggbGRmaWxlLmggbGRtaXNjLmggXAotICBsZG1haW4uaCBtcmkuaCBsZGN0b3IuaCBsZGxleC5oCi1sZGxleC5vOiBsZGxleC5jIC4uL2JmZC9iZmQuaCBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZm9wZW4tc2FtZS5oIFwKLSAgbGQuaCBsZGdyYW0uaCBsZG1pc2MuaCBsZGV4cC5oIGxkbGFuZy5oIGxkZmlsZS5oIGxkbGV4LmggXAotICBsZG1haW4uaAotZGVmZmlsZXAubzogZGVmZmlsZXAuYyAkKElOQ0RJUikvbGliaWJlcnR5LmggJChJTkNESVIpL2Fuc2lkZWNsLmggXAotICAuLi9iZmQvYmZkLmggc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2ZvcGVuLXNhbWUuaCBcCi0gIGxkLmggbGRtaXNjLmggZGVmZmlsZS5oCi0KLSMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQotCi0jIFRlbGwgdmVyc2lvbnMgWzMuNTksMy42Mykgb2YgR05VIG1ha2UgdG8gbm90IGV4cG9ydCBhbGwgdmFyaWFibGVzLgotIyBPdGhlcndpc2UgYSBzeXN0ZW0gbGltaXQgKGZvciBTeXNWIGF0IGxlYXN0KSBtYXkgYmUgZXhjZWVkZWQuCi0uTk9FWFBPUlQ6CmRpZmYgLS1naXQgYS9sZC9ORVdTIGIvbGQvTkVXUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY3ODkwZS4uMDAwMDAwMAotLS0gYS9sZC9ORVdTCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS0qLSB0ZXh0IC0qLQotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4xMDoKLQotKiBBZGRlZCBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdW51c2VkIHNlY3Rpb25zLCBlbmFibGVkIGJ5IC0tZ2Mtc2VjdGlvbnMuIAotICBJdCBkb2VzIHJlcXVpcmUgYSBiaXQgb2YgYmFja2VuZCBzdXBwb3J0OyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXJlCi0gIHBwYy1lbGYsIG1pcHMtZWxmLCBhbmQgbW4xMDMwMC1lbGYuICBPdGhlcnMgd2lsbCBpZ25vcmUgdGhlIG9wdGlvbi4KLQotKiBBZGRlZCBTT1JUIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIHRvIHBlcm1pdCBzb3J0aW5nIHNlY3Rpb25zIGJ5IGZpbGUKLSAgbmFtZSBvciBzZWN0aW9uIG5hbWUuCi0KLSogQWRkZWQgRVhURVJOIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlIGFzIGFuIGVxdWl2YWxlbnQgdG8gdGhlIC11Ci0gIGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLSogQWRkZWQgQVNTRVJUIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIEFkZGVkIEVYQ0xVREVfRklMRSB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSBmb3IgZnVydGhlciBjb250cm9sIG92ZXIKLSAgd2lsZGNhcmQgZmlsZSBuYW1lcy4KLQotKiBBZGRlZCAtTyBvcHRpb24gdG8gb3B0aW1pemUgbGlua2VyIG91dHB1dCAoYXMgb2YgdGhpcyB3cml0aW5nLCB0aGlzIG9ubHkKLWFmZmVjdHMgRUxGIHNoYXJlZCBsaWJyYXJ5IGdlbmVyYXRpb24pLgotCi0qIFRoZSAtZSBvcHRpb24gbm93IGFjY2VwdHMgYSBudW1iZXIgYXMgd2VsbCBhcyBhIHN5bWJvbCBuYW1lLgotCi0qIEFkZGVkIC0tbm8tdW5kZWZpbmVkIG9wdGlvbiB0byBkaXNhbGxvdyB1bmRlZmluZWQgc3ltYm9scyB3aGVuIGNyZWF0aW5nIGEKLSAgc2hhcmVkIGxpYnJhcnkuCi0KLSogQWRkZWQgLS1kZW1hbmdsZSBhbmQgLS1uby1kZW1hbmdsZSBvcHRpb25zLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi45OgotCi0qIEFkZGVkIFNRVUFEIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIE5ldyBvcHRpb24gLS1uby13YXJuLW1pc21hdGNoLgotCi0qIFRoZSBNRU1PUlkgY29tbWFuZCBub3cgcGFyc2VzIHRoZSBhdHRyaWJ1dGVzIHRvIGRldGVybWluZSB3aGVyZSBzZWN0aW9ucyB0aGF0Ci0gIGFyZSBub3QgcGxhY2VkIGluIGEgc3BlY2lmaWMgbWVtb3J5IHJlZ2lvbiBhcmUgcGxhY2VkLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi44OgotCi0qIExpbmtlciBzY3JpcHRzIG1heSBub3cgY29udGFpbiBzaGVsbCB3aWxkY2FyZCBjaGFyYWN0ZXJzIGZvciBmaWxlIGFuZCBzZWN0aW9uCi0gIG5hbWVzLgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIHN5bWJvbCB2ZXJzaW9ucyBpbiBFTEYuCi0KLSogVGhlIE5PQ1JPU1NSRUZTIGNvbW1hbmQgd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIFRoZSBMT0FEQUREUiBleHByZXNzaW9uIHdhcyBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBNQVggYW5kIE1JTiBmdW5jdGlvbnMgd2VyZSBhZGRlZCB0byB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZS4KLQotKiBUaGUgT1ZFUkxBWSBjb25zdHJ1Y3Qgd2FzIGFkZGVkIHRvIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi0qIE5ldyBvcHRpb24gLS13YXJuLXNlY3Rpb24tYWxpZ24gdG8gd2FybiB3aGVuIHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uCi0gIGNoYW5nZXMgZHVlIHRvIGFsaWdubWVudCBvZiBhbiBpbnB1dCBzZWN0aW9uLgotCi0qIE5ldyBvcHRpb25zIC0tZmlsdGVyLy1GIGFuZCAtLWF1eGlsaWFyeS8tZi4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuNzoKLQotKiBOZXcgb3B0aW9uIC0tY3JlZiB0byBwcmludCBvdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuCi0KLSogTmV3IG9wdGlvbiAtLXdyYXAgU1lNQk9MLgotCi0qIE5ldyBvcHRpb24gLS1uby13aG9sZS1hcmNoaXZlLCB0byB0dXJuIG9mZiB0aGUgZWZmZWN0IG9mIC0td2hvbGUtYXJjaGl2ZS4KLQotKiBJbnB1dCBzZWN0aW9ucyBhc3NpZ25lZCB0byB0aGUgb3V0cHV0IHNlY3Rpb24gL0RJU0NBUkQvIGluIHRoZSBsaW5rZXIgc2NyaXB0Ci0gIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi0qIFRoZSBTdW5PUyBhbmQgRUxGIGxpbmtlcnMgbm93IG1lcmdlIHN0YWJzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB3aGljaCB1c2VzCi0gIHRoZSBOX0JJTkNMIGFuZCBOX0VJTkNMIHN0YWIgdHlwZXMuICBUaGlzIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcKLSAgaW5mb3JtYXRpb24gZ2VuZXJhdGVkLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi42OgotCi0qIFdoZW4gYW4gRUxGIHNlY3Rpb24gbmFtZSBpcyByZXByZXNlbnRhYmxlIGFzIGEgQyBpZGVudGlmaWVyICh0aGlzIGlzIG5vdCB0cnVlCi1vZiBtb3N0IEVMRiBzZWN0aW9uIG5hbWVzKSwgdGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgZGVmaW5lIHN5bWJvbHMKLV9fc3RhcnRfU0VDTkFNRSBhbmQgX19zdG9wX1NFQ05BTUUsIHdoZXJlIFNFQ05BTUUgaXMgdGhlIHNlY3Rpb24gbmFtZSwgYXQgdGhlCi1iZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICBUaGlzIGlzIHVzZWQgYnkgZ2xpYmMuCi0KLSogV2hlbiBhbiBFTEYgc2VjdGlvbiBuYW1lZCAuZ251Lndhcm5pbmcgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQgZmlsZSwgdGhlCi1jb250ZW50cyBvZiB0aGUgc2VjdGlvbiBhcmUgZGlzcGxheWVkIGFzIGFuIGVycm9yIG1lc3NhZ2UsIGFuZCB0aGUgc2VjdGlvbiBpcwotbm90IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gIFRoaXMgaXMgdXNlZCBieSBnbGliYy4KLQotKiBXaGVuIGFuIEVMRiBzZWN0aW9uIG5hbWVkIC5nbnUud2FybmluZy5TWU1CT0wgaXMgZW5jb3VudGVyZWQgaW4gYW4gaW5wdXQKLWZpbGUsIGFuZCB0aGUgc3ltYm9sIFNZTUJPTCBpcyByZWZlcmVuY2VkIGJ5IHNvbWUgb2JqZWN0IGZpbGUsIHRoZSBjb250ZW50cyBvZgotdGhlIHNlY3Rpb24gYXJlIGRpc3BsYXllZCBhcyBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIHNlY3Rpb24gaXMgbm90IGNvcGllZCBpbnRvCi10aGUgb3V0cHV0IGZpbGUsIHVubGVzcyBkb2luZyBhIHJlbG9jYXRlYWJsZSBvciBzaGFyZWQgbGluay4gIFRoaXMgaXMgdXNlZCBieQotZ2xpYmMuCi0KLSogTmV3IG9wdGlvbnMgLXNwbGl0LWJ5LXJlbG9jIGFuZCAtc3BsaXQtYnktZmlsZS4KLQotKiBUaGUgbGlua2VyIG5vdyBzdXBwb3J0cyBsaW5raW5nIFBJQyBjb21waWxlZCBjb2RlIG9uIFNQQVJDIFN1bk9TLiAgSXQgY2FuCi1hbHNvIGNyZWF0ZSBTUEFSQyBTdW5PUyBzaGFyZWQgbGlicmFyaWVzLCBhbmQsIGxpa2UgdGhlIG5hdGl2ZSBTdW5PUyBsaW5rZXIsCi13aWxsIGRvIHNvIHdoZW5ldmVyIHRoZXJlIGlzIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4gdGhlIGxpbmsgYW5kIG5laXRoZXIgdGhlIC1lCi1ub3IgdGhlIC1yIG9wdGlvbiB3YXMgdXNlZC4KLQotKiBUaGUgLXJwYXRoIG9wdGlvbiBtYXkgYmUgdXNlZCBvbiBTdW5PUyB0byBzZXQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gYmUKLXNlYXJjaGVkIGF0IHJ1biB0aW1lLiAgVGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgb2YgYnVpbGRpbmcgdGhlIGxpc3QgZnJvbSB0aGUKLS1MIG9wdGlvbnMuCi0KLSogVGhlIENPRkYgbGlua2VyIG5vdyBjb21iaW5lcyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIHN0cnVjdHMsIHVuaW9ucywgYW5kCi1lbnVtcywgc28gdGhhdCBldmVuIGlmIHRoZSBzYW1lIHR5cGUgaXMgZGVmaW5lZCBpbiBtdWx0aXBsZSBpbnB1dCBmaWxlcyBpdCB3aWxsCi1vbmx5IGJlIGRlZmluZWQgb25jZSBpbiB0aGUgb3V0cHV0IGZpbGUuICBUaGUgLS10cmFkaXRpb25hbC1mb3JtYXQgc3dpdGNoIHdpbGwKLXByZXZlbnQgdGhpcyBvcHRpbWl6YXRpb24uCi0KLUNoYW5nZXMgaW4gdmVyc2lvbiAyLjU6Ci0KLSogVGhlIGxpbmtlciBub3cgc3VwcG9ydHMgbGlua2luZyBhZ2FpbnN0IFN1bk9TIHNoYXJlZCBsaWJyYXJpZXMuICBJdCBzdGlsbCBjYW4KLW5vdCBsaW5rIFN1bk9TIFBJQyAoUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSkgZmlsZXMsIHNvIGl0IGNhbiBub3QgYmUgdXNlZCB0bwotZ2VuZXJhdGUgc2hhcmVkIGxpYmFyaWVzLgotCi0qIFRoZSBsaW5rZXIgbm93IHN1cHBvcnRzIGxpbmtpbmcgYWdhaW5zdCBFTEYgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlIGkzODYKLShVbml4V2FyZSkgYW5kIFNQQVJDIChTb2xhcmlzKS4gIEl0IGNhbiBhbHNvIGxpbmsgRUxGIFBJQyBmaWxlcywgYW5kIGNhbiBiZQotdXNlZCB0byBnZW5lcmF0ZSBzaGFyZWQgbGlicmFyaWVzLiAgU2hhcmVkIGxpYnJhcnkgZ2VuZXJhdGlvbiBpcyBub3Qgd2VsbAotdGVzdGVkOyBwbGVhc2UgcmVwb3J0IGFueSBwcm9ibGVtcyBlbmNvdW50ZXJlZC4gIFRoZSBsaW5rZXIgaXMgbm93IGVuYWJsZWQgZm9yCi1Tb2xhcmlzIGFnYWluLgotCi0qIEVyaWMgWW91bmdkYWxlIGhhcyBjb250cmlidXRlZCBMaW51eCBzdXBwb3J0IGNvZGUsIGluY2x1ZGluZyBsaW5raW5nIGFnYWluc3QKLUxpbnV4IGEub3V0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgbGlua2VyIHByb2R1Y2VzIExpbnV4IFFNQUdJQyBiaW5hcmllcy4KLQotKiBUaGUgRUxGIGJhY2tlbmQgaGFzIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgbGlua2VyIGNvZGUuICBUbyB1c2UgdGhlIG5ldwotRUxGIGxpbmtlciwgZWFjaCBwYXJ0aWN1bGFyIHRhcmdldCByZXF1aXJlcyBhIHJlbG9jYXRpb24gZnVuY3Rpb24uICBTbyBmYXIsCi10aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIGkzODYgKFVuaXhXYXJlKSwgU1BBUkMgKFNvbGFyaXMpIE1JUFMgKElyaXgKLTUpLCBhbmQgSFBQQSBFTEYgdGFyZ2V0cy4KLQotKiBUaGUgLSggKC0tc3RhcnQtZ3JvdXApIGFuZCAtKSAoLS1lbmQtZ3JvdXApIG9wdGlvbnMgaGF2ZSBiZWVuIGFkZGVkIHRvCi1zdXBwb3J0IHNlYXJjaGluZyBhIGdyb3VwIG9mIGFyY2hpdmVzIGFzIHRob3VnaCB0aGV5IHdlcmUgYSBzaW5nbGUgYXJjaGl2ZS4KLVRoaXMgY2FuIGFsc28gYmUgdXNlZCBpbiBhIGxpbmtlciBzY3JpcHQsIGFzIEdST1VQICggZmlsZXMgKS4KLQotKiBXaGVuIGEgZmlsZSBpcyBuYW1lZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgdGhlIGxpbmtlciBkb2VzIG5vdCByZWNvZ25pemUKLWl0IGFzIGFuIG9iamVjdCBmaWxlLCB0aGUgbGlua2VyIHdpbGwgbm93IHRyZWF0IHRoZSBmaWxlIGFzIGEgbGlua2VyIHNjcmlwdAotZmlsZS4gIEEgbGlua2VyIHNjcmlwdCBuYW1lZCBpbiB0aGlzIHdheSBhdWdtZW50cywgYnV0IGRvZXMgbm90IHJlcGxhY2UsIHRoZQotZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi0qIFRoZSAtd2Fybi1vbmNlIG9wdGlvbiB3YXMgYWRkZWQuICBJdCBjYXVzZXMgdGhlIGxpbmtlciB0byBvbmx5IHdhcm4gb25jZSBwZXIKLXVuZGVmaW5lZCBzeW1ib2wsIHJhdGhlciB0aGFuIG9uY2UgcGVyIHJlZmVyZW5jZS4KLQotKiBUaGUgQ09GRiBiYWNrZW5kIGhhcyBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGxpbmtlciBjb2RlLiAgQXMgd2l0aCBFTEYsIHRvCi11c2UgdGhlIG5ldyBsaW5rZXIsIGVhY2ggcGFydGljdWxhciB0YXJnZXQgcmVxdWlyZXMgYSByZWxvY2F0aW9uIGZ1bmN0aW9uLiAgU28KLWZhciwgdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiB3cml0dGVuIGZvciB0aGUgaTM4NiwgbTY4aywgYTI5ayBhbmQgU0ggdGFyZ2V0cy4KLQotKiBUaGUgLVYgZmxhZyB3YXMgbWFkZSBhIHN5bm9ueW0gZm9yIC12LCBmb3IgU1ZSNCBjb21wYXRpYmlsaXR5LiAgVGhlIG9sZCAtVgotYmVoYXZpb3VyIGlzIGF2YWlsYWJsZSB2aWEgLS12ZXJib3NlLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi40OgotCi0qIE5ldyBsaW5rZXIgY29kZSwgYnkgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIElhbiBUYXlsb3IuICBGb3IgYS5vdXQgYW5kIGVjb2ZmCi0gIGZvcm1hdHMgKHNvIGZhciksIHRoaXMgc2hvdWxkIHJlc3VsdCBpbiBjb25zaWRlcmFibGUgc2F2aW5ncyBpbiB0aW1lCi0gIGFuZCBtZW1vcnkgdXNlZCB3aGlsZSBsaW5raW5nOyBzbGlnaHRseSBwb29yZXIgcGVyZm9ybWFuY2UgdGhhbgotICBiZWZvcmUgZm9yIGZvcm1hdHMgbm90IGNvbnZlcnRlZCB5ZXQuCi0KLSogQ29tbWFuZC1saW5lIHBhcnNpbmcgaXMgbm8gbG9uZ2VyIGRvbmUgd2l0aCBmbGV4LiAgVGhpcyBtZWFucwotICBvZGRiYWxsIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzIHdvbid0IGdldCB0cmVhdGVkIGFzIGFyZ3VtZW50Ci0gIHNlcGFyYXRvcnMuCi0KLSogSFAtUEEgRUxGIHN1cHBvcnQsIGJ5IEplZmYgTGF3LiAgKE5vIFNPTSBzdXBwb3J0IHlldC4pCi0KLSogTWFjaCBpMzg2IHN1cHBvcnQsIGJ5IERhdmlkIE1hY2tlbnppZS4KLQotKiBJcml4IDQgc2hhcmVkIGxpYnJhcmllcyBhcmUgbm93IHN1cHBvcnRlZCAoSXJpeCA1IHVzZXMgRUxGLCBhbmQgRUxGIHNoYXJlZAotICBsaWJyYXJpZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkKS4KLQotKiBDT0ZGIHNoYXJlZCBsaWJyYXJpZXMgKGFzIG9uIFNDTykgc2hvdWxkIHdvcmsgYXMgd2VsbC4KLQotKiBUaGUgbGlua2VyIGlzIGRpc2FibGVkIGZvciBTb2xhcmlzLiAgKEFjdHVhbGx5LCBpdCB3YXMgaW4gMi4zIGFsc28sIEkganVzdAotICBmb3Jnb3QgdG8gbm90ZSBpdC4pICBTb21lIG9mIHRoZWlyIEMgbGlicmFyeSByb3V0aW5lcyBkb24ndCB3b3JrIHdoZW4KLSAgc3RhdGljYWxseSBsaW5rZWQsIGFuZCB0aGUgR05VIGxpbmtlciBkb2Vzbid0IHN1cHBvcnQgZHluYW1pYyBsaW5raW5nIHlldC4KLQotQ2hhbmdlcyBpbiB2ZXJzaW9uIDIuMzoKLQotKiBXZWFrIHN5bWJvbHMgYXJlIG5vdyBzdXBwb3J0ZWQuCi0KLSogRUxGIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuICBUaGUgbGlua2VyIGhhcyBiZWVuIGJvb3RzdHJhcHBlZCBvbgotICBVbml4V2FyZSBhbmQgU29sYXJpcy4KLQotKiBBbHBoYSBPU0YvMSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIChub24gZHluYW1pYyBsaW5raW5nIG9ubHkpLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4yOgotCi0qIFRoZSBgYmZkJyBsaWJyYXJ5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVkdWNlIGEub3V0LWZvcm1hdCBzdHJpbmcKLSAgdGFibGUgc2l6ZS4gIFRoZSBlZmZlY3Qgb2YgdGhpcyBpcyB0aGF0IGZpbGVzIGxpbmtlZCBmcm9tIG1hbnkgaW5wdXQKLSAgZmlsZXMgd2l0aCBkdXBsaWNhdGUgc3ltYm9scyAoYC1nJyBkZWJ1Z2dpbmcgcmVjb3Jkcywgb3IgaWRlbnRpY2FsCi0gIHN0YXRpYyBzeW1ib2xzKSBzaG91bGQgYmUgbXVjaCBzbWFsbGVyLgotCi1DaGFuZ2VzIGluIHZlcnNpb24gMi4xOgotCi0qIFRoZSBsZCAteVNZTUJPTCBmbGFnICh0byB0cmFjZSByZWZlcmVuY2VzIHRvIFNZTUJPTCkgaXMgbm93IGltcGxlbWVudGVkLgotCi0qIFRoZXJlIGlzIG5vdyBzdXBwb3J0IGZvciB3cml0aW5nIEVDT0ZGIGZpbGVzLCBzbyBsZCBhbmQgdGhlCi0gIG90aGVyIHV0aWxpdGllcyBzaG91bGQgd29yayBvbiBSaXNjL1VsdHJpeCBhbmQgSXJpeC4KLQotDAotTG9jYWwgdmFyaWFibGVzOgotZmlsbC1jb2x1bW46IDc5Ci1FbmQ6CmRpZmYgLS1naXQgYS9sZC9SRUFETUUgYi9sZC9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NDdkMDQuLjAwMDAwMDAKLS0tIGEvbGQvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotVGhpcyBpcyB0aGUgR05VIGxpbmtlci4gIEl0IGlzIGRpc3RyaWJ1dGVkIHdpdGggb3RoZXIgImJpbmFyeQotdXRpbGl0aWVzIiB3aGljaCBzaG91bGQgYmUgaW4gLi4vYmludXRpbHMuICBTZWUgLi4vYmludXRpbHMvUkVBRE1FIGZvcgotbW9yZSBnZW5lcmFsIG5vdGVzLCBpbmNsdWRpbmcgd2hlcmUgdG8gc2VuZCBidWcgcmVwb3J0cy4KLQotVGhlcmUgYXJlIG1hbnkgZmVhdHVyZXMgb2YgdGhlIGxpbmtlcjoKLQotKiBUaGUgbGlua2VyIHVzZXMgYSBCaW5hcnkgRmlsZSBEZXNjcmlwdG9yIGxpYnJhcnkgKC4uL2JmZCkKLSAgdGhhdCBpdCB1c2VzIHRvIHJlYWQgYW5kIHdyaXRlIG9iamVjdCBmaWxlcy4gIFRoaXMgaGVscHMKLSAgaW5zdWxhdGUgdGhlIGxpbmtlciBpdHNlbGYgZnJvbSB0aGUgZm9ybWF0IG9mIG9iamVjdCBmaWxlcy4KLQotKiBUaGUgbGlua2VyIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBvYmplY3QgZmlsZQotICBmb3JtYXRzLiAgSXQgY2FuIGV2ZW4gaGFuZGxlIG11bHRpcGxlIGZvcm1hdHMgYXQgb25jZToKLSAgUmVhZCB0d28gaW5wdXQgZm9ybWF0cyBhbmQgd3JpdGUgYSB0aGlyZC4KLQotKiBUaGUgbGlua2VyIGNhbiBiZSBjb25maWd1cmVkIGZvciBjcm9zcy1saW5raW5nLgotCi0qIFRoZSBsaW5rZXIgc3VwcG9ydHMgYSBjb250cm9sIGxhbmd1YWdlLgotCi0qIFRoZXJlIGlzIGEgdXNlciBtYW51YWwgKGxkLnRleGluZm8pLCBhcyB3ZWxsIGFzIHRoZQotICBiZWdpbm5pbmdzIG9mIGFuIGludGVybmFscyBtYW51YWwgKGxkaW50LnRleGluZm8pLgotCi1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi1TZWUgLi4vYmludXRpbHMvUkVBRE1FLgotCi1JZiB5b3Ugd2FudCB0byBtYWtlIGEgY3Jvc3MtbGlua2VyLCB5b3UgbWF5IHdhbnQgdG8gc3BlY2lmeQotYSBkaWZmZXJlbnQgc2VhcmNoIHBhdGggb2YgLWxmb28gbGlicmFyaWVzIHRoYW4gdGhlIGRlZmF1bHQuCi1Zb3UgY2FuIGRvIHRoaXMgYnkgc2V0dGluZyB0aGUgTElCX1BBVEggdmFyaWFibGUgaW4gLi9NYWtlZmlsZS4KLQotVG8gYnVpbGQganVzdCB0aGUgbGlua2VyLCBtYWtlIHRoZSB0YXJnZXQgYWxsLWxkIGZyb20gdGhlIHRvcCBsZXZlbAotZGlyZWN0b3J5IChvbmUgZGlyZWN0b3J5IGFib3ZlIHRoaXMgb25lKS4KLQotUG9ydGluZyB0byBhIG5ldyB0YXJnZXQKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSB0aGUgbGRpbnQudGV4aW5mbyBtYW51YWwuCi0KLVJlcG9ydGluZyBidWdzIGV0YwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNlZSAuLi9iaW51dGlscy9SRUFETUUuCi0KLUtub3duIHByb2JsZW1zCi09PT09PT09PT09PT09PQotCi1UaGUgU29sYXJpcyBsaW5rZXIgbm9ybWFsbHkgZXhwb3J0cyBhbGwgZHluYW1pYyBzeW1ib2xzIGZyb20gYW4KLWV4ZWN1dGFibGUuICBUaGUgR05VIGxpbmtlciBkb2VzIG5vdCBkbyB0aGlzIGJ5IGRlZmF1bHQuICBUaGlzIGlzCi1iZWNhdXNlIHRoZSBHTlUgbGlua2VyIHRyaWVzIHRvIHByZXNlbnQgdGhlIHNhbWUgaW50ZXJmYWNlIGZvciBhbGwKLXNpbWlsYXIgdGFyZ2V0cyAoaW4gdGhpcyBjYXNlLCBhbGwgbmF0aXZlIEVMRiB0YXJnZXRzKS4gIFRoaXMgZG9lcyBub3QKLW1hdHRlciBmb3Igbm9ybWFsIHByb2dyYW1zLCBidXQgaXQgY2FuIG1ha2UgYSBkaWZmZXJlbmNlIGZvciBwcm9ncmFtcwotd2hpY2ggdHJ5IHRvIGRsb3BlbiBhbiBleGVjdXRhYmxlLCBzdWNoIGFzIFBFUkwgb3IgVGNsLiAgWW91IGNhbiBtYWtlCi10aGUgR05VIGxpbmtlciBleHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scyB3aXRoIHRoZSAtRSBvcgotLS1leHBvcnQtZHluYW1pYyBjb21tYW5kIGxpbmUgb3B0aW9uLgotCi1IUC9VWCA5LjAxIGhhcyBhIHNoZWxsIGJ1ZyB0aGF0IGNhdXNlcyB0aGUgbGlua2VyIHNjcmlwdHMgdG8gYmUKLWdlbmVyYXRlZCBpbmNvcnJlY3RseS4gIFRoZSBzeW1wdG9tIG9mIHRoaXMgYXBwZWFycyB0byBiZSAiZmF0YWwgZXJyb3IKLS0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciIGVycm9yIG1lc3NhZ2VzLiAgVGhlcmUgYXJlIHZhcmlvdXMKLXdvcmthcm91bmRzIHRvIHRoaXM6Ci0gICogQnVpbGQgYW5kIGluc3RhbGwgYmFzaCwgYW5kIGJ1aWxkIHdpdGggIm1ha2UgU0hFTEw9YmFzaCIuCi0gICogVXBkYXRlIHRvIGEgdmVyc2lvbiBvZiBIUC9VWCB3aXRoIGEgd29ya2luZyBzaGVsbCAoZS5nLiwgOS4wNSkuCi0gICogUmVwbGFjZSAiKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSIgaW4KLSAgICBnZW5zY3JpcHRzLnNoIHdpdGggInNoICR7c3JjZGlyfS4uLiIgKG5vIHBhcmVucykgYW5kIG1ha2Ugc3VyZSB0aGUKLSAgICBlbXVscGFyYW1zIHNjcmlwdCB1c2VkIGV4cG9ydHMgYW55IHNoZWxsIHZhcmlhYmxlcyBpdCBzZXRzLgpkaWZmIC0tZ2l0IGEvbGQvVE9ETyBiL2xkL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2Q5OGIuLjAwMDAwMDAKLS0tIGEvbGQvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotVm9sdW50ZWVycyB0byB0YWNrbGUgc29tZSBvZiB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHdlbGNvbWU6Ci0KLVN1cHBvcnQgdGhlICJ0cmFkaXRpb25hbCIgQlNEICAtQSBmbGFnIChpbmNyZW1lbnRhbCBsb2FkaW5nKS4KLShUaGVyZSBpcyBhIC1BIGZsYWcgaW4gbGQgbm93LCBidXQgaXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZQotYXJjaGl0ZWN0dXJlLiAgVGhhdCBzaG91bGQgcHJvYmFibHkgYmUgY2hhbmdlZC4pCi0KLVN1cHBvcnQgZm9yIGR5bmFtaWMgbG9hZGluZyAoYSBsYSBkbGQsIGJ1dCBiZmQtYmFzZWQpIHdvdWxkIGJlIG5pY2UuCi0KLUF2b2lkIHJlLW9wZW4gKGFuZCByZS1zZWVraW5nKSBvdXRwdXQgYmZkIGFuZCBhcmNoaXZlcy4KZGlmZiAtLWdpdCBhL2xkL2FjaW5jbHVkZS5tNCBiL2xkL2FjaW5jbHVkZS5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiMDliOS4uMDAwMDAwMAotLS0gYS9sZC9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvbGQvYWNsb2NhbC5tNCBiL2xkL2FjbG9jYWwubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOTM0YjAuLjAwMDAwMDAKLS0tIGEvbGQvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMjAgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgMzUgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotQUNfQ0FDSEVfTE9BRAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotXSkKLQotQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKLVtBQ19QUkVSRVEoMi4xMylkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nXSwKLW5lZWRfbG9ja3M9JGVuYWJsZXZhbCwKLW5lZWRfbG9ja3M9eWVzKQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLV0pCi0KLSMgQUNfTElCVE9PTF9ETE9QRU4gLSBjaGVjayBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbbHRfZGxvcGVuPXllc10pCi0KLSMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwKLVtBQ19FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywKLVtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywKLVtBQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLAotW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwKLVtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1NVQlNUKExEKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBQ19TWVNfTk1fUEFSU0UgLSBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQKLSMgYnkgQyBzeW1ib2wgbmFtZSBmcm9tIG5tLgotQUNfREVGVU4oQUNfU1lTX05NX1BBUlNFLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlLAotWyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotY2hhbmdlcXVvdGUoLClkbmwKLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRhY19zeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotY2hhbmdlcXVvdGUoLClkbmwKLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotY2hhbmdlcXVvdGUoWyxdKWRubAotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotQUNfTVNHX1JFU1VMVCgkYWNfcmVzdWx0KQotXSkKLQotIyBBQ19TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFDX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUgLSBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiB1bmRlcnNjb3JlPwotQUNfREVGVU4oQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSwKLVthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotZmkKLXJtIC1yZiBjb25mdGVzdCoKLV0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCi1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci1BQ19TVUJTVChVU0VfU1lNQk9MX1VOREVSU0NPUkUpZG5sCi1dKQotCi0jIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihBQ19DSEVDS19MSUJNLCBbCi1BQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsKQotQUNfQ0hFQ0tfTElCKG0sIGNvcykKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgWwotICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgWwotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwgTElCTFRETD0iLWxsdGRsIiwgWwotICAgIGNhc2UgIiRlbmFibGVfbHRkbF9pbnN0YWxsIiBpbgotICAgIG5vKSBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkgOzsKLSAgICAiIikgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiIDs7Ci0gICAgZXNhYwotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHgibm8iOyB0aGVuCi0gICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKLSAgZmkKLV0pCi0KLWRubCBvbGQgbmFtZXMKLUFDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19OTV9QQVJTRSwgW2luZGlyKFtBQ19TWVNfTk1fUEFSU0VdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfU1lNQk9MX1VOREVSU0NPUkUsIFtpbmRpcihbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLCBbaW5kaXIoW0FDX1NZU19MSUJUT09MX0NZR1dJTl0pXSlkbmwKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQotCi1kbmwgQU1fUFJPR19MRVgKLWRubCBMb29rIGZvciBmbGV4LCBsZXggb3IgbWlzc2luZywgdGhlbiBydW4gQUNfUFJPR19MRVggYW5kIEFDX0RFQ0xfWVlURVhUCi1BQ19ERUZVTihBTV9QUk9HX0xFWCwKLVttaXNzaW5nX2Rpcj1pZmVsc2UoWyQxXSwsYGNkICRhY19hdXhfZGlyICYmIHB3ZGAsJDEpCi1BQ19DSEVDS19QUk9HUyhMRVgsIGZsZXggbGV4LCAiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIpCi1BQ19QUk9HX0xFWAotQUNfREVDTF9ZWVRFWFRdKQotCi0jIEFkZCAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KLSMgRnJvbSBKaW0gTWV5ZXJpbmcKLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9NQUlOVEFJTkVSX01PREUsCi1bQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHRvIGVuYWJsZSBtYWludGFpbmVyLXNwZWNpZmljIHBvcnRpb25zIG9mIE1ha2VmaWxlc10pCi0gIGRubCBtYWludGFpbmVyLW1vZGUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAotICBBQ19BUkdfRU5BQkxFKG1haW50YWluZXItbW9kZSwKLVsgIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBlbmFibGUgbWFrZSBydWxlcyBhbmQgZGVwZW5kZW5jaWVzIG5vdCB1c2VmdWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGFuZCBzb21ldGltZXMgY29uZnVzaW5nKSB0byB0aGUgY2FzdWFsIGluc3RhbGxlcl0sCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPSRlbmFibGV2YWwsCi0gICAgICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vKQotICBBQ19NU0dfUkVTVUxUKCRVU0VfTUFJTlRBSU5FUl9NT0RFKQotICBBTV9DT05ESVRJT05BTChNQUlOVEFJTkVSX01PREUsIHRlc3QgJFVTRV9NQUlOVEFJTkVSX01PREUgPSB5ZXMpCi0gIE1BSU5UPSRNQUlOVEFJTkVSX01PREVfVFJVRQotICBBQ19TVUJTVChNQUlOVClkbmwKLV0KLSkKLQotIyBEZWZpbmUgYSBjb25kaXRpb25hbC4KLQotQUNfREVGVU4oQU1fQ09ORElUSU9OQUwsCi1bQUNfU1VCU1QoJDFfVFJVRSkKLUFDX1NVQlNUKCQxX0ZBTFNFKQotaWYgJDI7IHRoZW4KLSAgJDFfVFJVRT0KLSAgJDFfRkFMU0U9JyMnCi1lbHNlCi0gICQxX1RSVUU9JyMnCi0gICQxX0ZBTFNFPQotZmldKQotCmRpZmYgLS1naXQgYS9sZC9jb25maWcuaW4gYi9sZC9jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTUwNDYuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIGxleCBkZWNsYXJlcyB5eXRleHQgYXMgYSBjaGFyICogYnkgZGVmYXVsdCwgbm90IGEgY2hhcltdLiAgKi8KLSN1bmRlZiBZWVRFWFRfUE9JTlRFUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9jb3VudCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfQ09VTlQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfbmV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9fX0FSR1pfTkVYVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIF9fYXJnel9zdHJpbmdpZnkgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX1NUUklOR0lGWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGRjZ2V0dGV4dCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9EQ0dFVFRFWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRjd2QgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUQ1dECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cGFnZXNpemUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtdW5tYXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTVVOTUFQCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcHV0ZW52IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BVVEVOVgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNicmsgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0JSSwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHNldGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TRVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRsb2NhbGUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VUTE9DQUxFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0FTRUNNUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8YXJnei5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9BUkdaX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX0RJUkVOVF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5kaXIuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19ESVJfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkRJUl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfVU5JU1REX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dmFsdWVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1ZBTFVFU19ICi0KLS8qIE5hbWUgb2YgcGFja2FnZSAqLwotI3VuZGVmIFBBQ0tBR0UKLQotLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLwotI3VuZGVmIFZFUlNJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb24gKi8KLSN1bmRlZiBIQVZFX1NUUENQWQotCi0vKiBEZWZpbmUgaWYgeW91ciBsb2NhbGUuaCBmaWxlIGNvbnRhaW5zIExDX01FU1NBR0VTLiAqLwotI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMKLQotLyogRGVmaW5lIHRvIDEgaWYgTkxTIGlzIHJlcXVlc3RlZCAqLwotI3VuZGVmIEVOQUJMRV9OTFMKLQotLyogRGVmaW5lIGFzIDEgaWYgeW91IGhhdmUgZ2V0dGV4dCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UgR05VIGdldHRleHQuICovCi0jdW5kZWYgSEFWRV9HRVRURVhUCi0KLS8qIFVzZSBiIG1vZGlmaWVyIHdoZW4gb3BlbmluZyBiaW5hcnkgZmlsZXM/ICovCi0jdW5kZWYgVVNFX0JJTkFSWV9GT1BFTgotCi0vKiBEZWZpbmUgaWYgc3Ryc3RyIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi0KLS8qIERlZmluZSBpZiBmcmVlIGlzIG5vdCBkZWNsYXJlZCBpbiBzeXN0ZW0gaGVhZGVyIGZpbGVzLiAqLwotI3VuZGVmIE5FRURfREVDTEFSQVRJT05fRlJFRQotCi0vKiBEZWZpbmUgaWYgc2JyayBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX1NCUksKLQotLyogRGVmaW5lIGlmIGdldGVudiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOVgotCi0vKiBEZWZpbmUgaWYgZW52aXJvbiBpcyBub3QgZGVjbGFyZWQgaW4gc3lzdGVtIGhlYWRlciBmaWxlcy4gKi8KLSN1bmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlIGIvbGQvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMDc3MjM2Li4wMDAwMDAwCi0tLSBhL2xkL2NvbmZpZ3VyZQorKysgL2Rldi9udWxsCkBAIC0xLDUyNDMgKzAsMCBAQAotIyEgL2Jpbi9zaAotCi0jIEd1ZXNzIHZhbHVlcyBmb3Igc3lzdGVtLWRlcGVuZGVudCB2YXJpYWJsZXMgYW5kIGNyZWF0ZSBNYWtlZmlsZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHVzaW5nIGF1dG9jb25mIHZlcnNpb24gMi4xMyAKLSMgQ29weXJpZ2h0IChDKSAxOTkyLCA5MywgOTQsIDk1LCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMKLSMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgotCi0jIERlZmF1bHRzOgotYWNfaGVscD0KLWFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKLSMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXNoYXJlZFs9UEtHU10gIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXN0YXRpY1s9UEtHU10gIGJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLWZhc3QtaW5zdGFsbFs9UEtHU10gIG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbiBbZGVmYXVsdD15ZXNdIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWdudS1sZCAgICAgICAgICAgYXNzdW1lIHRoZSBDIGNvbXBpbGVyIHVzZXMgR05VIGxkIFtkZWZhdWx0PW5vXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgIGZvcmNlIGxpYnRvb2wgbm90IHRvIGRvIGZpbGUgbG9ja2luZyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9ucyIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1kaXNhYmxlLW5scyAgICAgICAgICAgZG8gbm90IHVzZSBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1pbmNsdWRlZC1nZXR0ZXh0IHVzZSB0aGUgR05VIGdldHRleHQgbGlicmFyeSBpbmNsdWRlZCBoZXJlIgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc2l0ZWZpbGU9Ci1zcmNkaXI9Ci10YXJnZXQ9Tk9ORQotdmVyYm9zZT0KLXhfaW5jbHVkZXM9Tk9ORQoteF9saWJyYXJpZXM9Tk9ORQotYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCi1zYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJwotbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKLWRhdGFkaXI9JyR7cHJlZml4fS9zaGFyZScKLXN5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCi1zaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKLWxvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCi1saWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKLWluY2x1ZGVkaXI9JyR7cHJlZml4fS9pbmNsdWRlJwotb2xkaW5jbHVkZWRpcj0nL3Vzci9pbmNsdWRlJwotaW5mb2Rpcj0nJHtwcmVmaXh9L2luZm8nCi1tYW5kaXI9JyR7cHJlZml4fS9tYW4nCi0KLSMgSW5pdGlhbGl6ZSBzb21lIG90aGVyIHZhcmlhYmxlcy4KLXN1YmRpcnM9Ci1NRkxBR1M9IE1BS0VGTEFHUz0KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNoZWxsIGhlcmUgZG9jdW1lbnQuCi1hY19tYXhfaGVyZV9saW5lcz0xMgotCi1hY19wcmV2PQotZm9yIGFjX29wdGlvbgotZG8KLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJGFjX3ByZXYiOyB0aGVuCi0gICAgZXZhbCAiJGFjX3ByZXY9XCRhY19vcHRpb24iCi0gICAgYWNfcHJldj0KLSAgICBjb250aW51ZQotICBmaQotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0gIC0qPSopIGFjX29wdGFyZz1gZWNobyAiJGFjX29wdGlvbiIgfCBzZWQgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBhY19vcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIEFjY2VwdCB0aGUgaW1wb3J0YW50IEN5Z251cyBjb25maWd1cmUgb3B0aW9ucywgc28gd2UgY2FuIGRpYWdub3NlIHR5cG9zLgotCi0gIGNhc2UgIiRhY19vcHRpb24iIGluCi0KLSAgLWJpbmRpciB8IC0tYmluZGlyIHwgLS1iaW5kaSB8IC0tYmluZCB8IC0tYmluIHwgLS1iaSkKLSAgICBhY19wcmV2PWJpbmRpciA7OwotICAtYmluZGlyPSogfCAtLWJpbmRpcj0qIHwgLS1iaW5kaT0qIHwgLS1iaW5kPSogfCAtLWJpbj0qIHwgLS1iaT0qKQotICAgIGJpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtYnVpbGQgfCAtLWJ1aWxkIHwgLS1idWlsIHwgLS1idWkgfCAtLWJ1KQotICAgIGFjX3ByZXY9YnVpbGQgOzsKLSAgLWJ1aWxkPSogfCAtLWJ1aWxkPSogfCAtLWJ1aWw9KiB8IC0tYnVpPSogfCAtLWJ1PSopCi0gICAgYnVpbGQ9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAotICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKLSAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKLSAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCi0gIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCi0gICAgY2FjaGVfZmlsZT0iJGFjX29wdGFyZyIgOzsKLQotICAtZGF0YWRpciB8IC0tZGF0YWRpciB8IC0tZGF0YWRpIHwgLS1kYXRhZCB8IC0tZGF0YSB8IC0tZGF0IHwgLS1kYSkKLSAgICBhY19wcmV2PWRhdGFkaXIgOzsKLSAgLWRhdGFkaXI9KiB8IC0tZGF0YWRpcj0qIHwgLS1kYXRhZGk9KiB8IC0tZGF0YWQ9KiB8IC0tZGF0YT0qIHwgLS1kYXQ9KiBcCi0gIHwgLS1kYT0qKQotICAgIGRhdGFkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRpc2FibGUtKiB8IC0tZGlzYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSpkaXNhYmxlLS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PW5vIiA7OwotCi0gIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmVuYWJsZS0vLycgLWUgJ3MvPS4qLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stX2EtekEtWjAtOV0vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgICAgICo9KikgOzsKLSAgICAgICopIGFjX29wdGFyZz15ZXMgOzsKLSAgICBlc2FjCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC1leGVjLXByZWZpeCB8IC0tZXhlY19wcmVmaXggfCAtLWV4ZWMtcHJlZml4IHwgLS1leGVjLXByZWZpIFwKLSAgfCAtLWV4ZWMtcHJlZiB8IC0tZXhlYy1wcmUgfCAtLWV4ZWMtcHIgfCAtLWV4ZWMtcCB8IC0tZXhlYy0gXAotICB8IC0tZXhlYyB8IC0tZXhlIHwgLS1leCkKLSAgICBhY19wcmV2PWV4ZWNfcHJlZml4IDs7Ci0gIC1leGVjLXByZWZpeD0qIHwgLS1leGVjX3ByZWZpeD0qIHwgLS1leGVjLXByZWZpeD0qIHwgLS1leGVjLXByZWZpPSogXAotICB8IC0tZXhlYy1wcmVmPSogfCAtLWV4ZWMtcHJlPSogfCAtLWV4ZWMtcHI9KiB8IC0tZXhlYy1wPSogfCAtLWV4ZWMtPSogXAotICB8IC0tZXhlYz0qIHwgLS1leGU9KiB8IC0tZXg9KikKLSAgICBleGVjX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtZ2FzIHwgLS1nYXMgfCAtLWdhIHwgLS1nKQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgtZ2FzLgotICAgIHdpdGhfZ2FzPXllcyA7OwotCi0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlKQotICAgICMgT21pdCBzb21lIGludGVybmFsIG9yIG9ic29sZXRlIG9wdGlvbnMgdG8gbWFrZSB0aGUgbGlzdCBsZXNzIGltcG9zaW5nLgotICAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KLSAgICBjYXQgPDwgRU9GCi1Vc2FnZTogY29uZmlndXJlIFtvcHRpb25zXSBbaG9zdF0KLU9wdGlvbnM6IFtkZWZhdWx0cyBpbiBicmFja2V0cyBhZnRlciBkZXNjcmlwdGlvbnNdCi1Db25maWd1cmF0aW9uOgotICAtLWNhY2hlLWZpbGU9RklMRSAgICAgICBjYWNoZSB0ZXN0IHJlc3VsdHMgaW4gRklMRQotICAtLWhlbHAgICAgICAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKLSAgLS1uby1jcmVhdGUgICAgICAgICAgICAgZG8gbm90IGNyZWF0ZSBvdXRwdXQgZmlsZXMKLSAgLS1xdWlldCwgLS1zaWxlbnQgICAgICAgZG8gbm90IHByaW50IFxgY2hlY2tpbmcuLi4nIG1lc3NhZ2VzCi0gIC0tc2l0ZS1maWxlPUZJTEUgICAgICAgIHVzZSBGSUxFIGFzIHRoZSBzaXRlIGZpbGUKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc2l0ZS1maWxlIHwgLS1zaXRlLWZpbGUgfCAtLXNpdGUtZmlsIHwgLS1zaXRlLWZpIHwgLS1zaXRlLWYpCi0gICAgYWNfcHJldj1zaXRlZmlsZSA7OwotICAtc2l0ZS1maWxlPSogfCAtLXNpdGUtZmlsZT0qIHwgLS1zaXRlLWZpbD0qIHwgLS1zaXRlLWZpPSogfCAtLXNpdGUtZj0qKQotICAgIHNpdGVmaWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT1sZG1haW4uYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJHNpdGVmaWxlIjsgdGhlbgotICBpZiB0ZXN0IC16ICIkQ09ORklHX1NJVEUiOyB0aGVuCi0gICAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgICBlbHNlCi0gICAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgQ09ORklHX1NJVEU9IiRzaXRlZmlsZSIKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotYWNfYXV4X2Rpcj0KLWZvciBhY19kaXIgaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi47IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotYWNfY29uZmlnX2d1ZXNzPSRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcwotYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi1hY19jb25maWd1cmU9JGFjX2F1eF9kaXIvY29uZmlndXJlICMgVGhpcyBzaG91bGQgYmUgQ3lnbnVzIGNvbmZpZ3VyZS4KLQotCi0jIERvIHNvbWUgZXJyb3IgY2hlY2tpbmcgYW5kIGRlZmF1bHRpbmcgZm9yIHRoZSBob3N0IGFuZCB0YXJnZXQgdHlwZS4KLSMgVGhlIGlucHV0cyBhcmU6Ci0jICAgIGNvbmZpZ3VyZSAtLWhvc3Q9SE9TVCAtLXRhcmdldD1UQVJHRVQgLS1idWlsZD1CVUlMRCBOT05PUFQKLSMKLSMgVGhlIHJ1bGVzIGFyZToKLSMgMS4gWW91IGFyZSBub3QgYWxsb3dlZCB0byBzcGVjaWZ5IC0taG9zdCwgLS10YXJnZXQsIGFuZCBub25vcHQgYXQgdGhlCi0jICAgIHNhbWUgdGltZS4KLSMgMi4gSG9zdCBkZWZhdWx0cyB0byBub25vcHQuCi0jIDMuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGhvc3QgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgaG9zdCwKLSMgICAgYXMgZGV0ZXJtaW5lZCBieSBjb25maWcuZ3Vlc3MuCi0jIDQuIFRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBub25vcHQuCi0jIDUuIElmIG5vbm9wdCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRhcmdldCBhbmQgYnVpbGQgZGVmYXVsdCB0byBob3N0LgotCi0jIFRoZSBhbGlhc2VzIHNhdmUgdGhlIG5hbWVzIHRoZSB1c2VyIHN1cHBsaWVkLCB3aGlsZSAkaG9zdCBldGMuCi0jIHdpbGwgZ2V0IGNhbm9uaWNhbGl6ZWQuCi1jYXNlICRob3N0LS0tJHRhcmdldC0tLSRub25vcHQgaW4KLU5PTkUtLS0qLS0tKiB8ICotLS1OT05FLS0tKiB8ICotLS0qLS0tTk9ORSkgOzsKLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotCi0KLSMgTWFrZSBzdXJlIHdlIGNhbiBydW4gY29uZmlnLnN1Yi4KLWlmICR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViIHN1bjQgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIDoKLWVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IHJ1biAkYWNfY29uZmlnX3N1YiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MDU6IGNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiID4mNQotCi1ob3N0X2FsaWFzPSRob3N0Ci1jYXNlICIkaG9zdF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKQotICAgIGlmIGhvc3RfYWxpYXM9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfZ3Vlc3NgOyB0aGVuIDoKLSAgICBlbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBndWVzcyBob3N0IHR5cGU7IHlvdSBtdXN0IHNwZWNpZnkgb25lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaSA7OwotICAqKSBob3N0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1ob3N0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotZWNobyAiJGFjX3QiIiRob3N0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjI2OiBjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiID4mNQotCi10YXJnZXRfYWxpYXM9JHRhcmdldAotY2FzZSAiJHRhcmdldF9hbGlhcyIgaW4KLU5PTkUpCi0gIGNhc2UgJG5vbm9wdCBpbgotICBOT05FKSB0YXJnZXRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgdGFyZ2V0X2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi10YXJnZXQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnZXRfYWxpYXNgCi10YXJnZXRfY3B1PWBlY2hvICR0YXJnZXQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotdGFyZ2V0X3ZlbmRvcj1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLXRhcmdldF9vcz1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkdGFyZ2V0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NDQ6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotdGVzdCAiJGhvc3RfYWxpYXMiICE9ICIkdGFyZ2V0X2FsaWFzIiAmJgotICB0ZXN0ICIkcHJvZ3JhbV9wcmVmaXgkcHJvZ3JhbV9zdWZmaXgkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSBcCi0gICAgTk9ORU5PTkVzLHgseCwgJiYKLSAgcHJvZ3JhbV9wcmVmaXg9JHt0YXJnZXRfYWxpYXN9LQotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Njc5OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjczMjogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODk6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQotc2V0IGR1bW15ICR7TUFLRS1tYWtlfTsgYWNfbWFrZT1gZWNobyAiJDIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0bWFrZSA8PFxFT0YKLWFsbDoKLQlAZWNobyAnYWNfbWFrZXRlbXA9IiR7TUFLRX0iJwotRU9GCi0jIEdOVSBtYWtlIHNvbWV0aW1lcyBwcmludHMgIm1ha2VbMV06IEVudGVyaW5nLi4uIiwgd2hpY2ggd291bGQgY29uZnVzZSB1cy4KLWV2YWwgYCR7TUFLRS1tYWtlfSAtZiBjb25mdGVzdG1ha2UgMj4vZGV2L251bGwgfCBncmVwIHRlbXA9YAotaWYgdGVzdCAtbiAiJGFjX21ha2V0ZW1wIjsgdGhlbgotICBldmFsIGFjX2N2X3Byb2dfbWFrZV8ke2FjX21ha2V9X3NldD15ZXMKLWVsc2UKLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9bm8KLWZpCi1ybSAtZiBjb25mdGVzdG1ha2UKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9wcm9nX21ha2VfJyR7YWNfbWFrZX1fc2V0YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIFNFVF9NQUtFPQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgU0VUX01BS0U9Ik1BS0U9JHtNQUtFLW1ha2V9IgotZmkKLQotCi1QQUNLQUdFPWxkCi0KLVZFUlNJT049Mi45LjQKLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4MzU6IGNoZWNraW5nIGZvciB3b3JraW5nIGFjbG9jYWwiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGFjbG9jYWwgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBQ0xPQ0FMPWFjbG9jYWwKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQUNMT0NBTD0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYWNsb2NhbCIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODQ4OiBjaGVja2luZyBmb3Igd29ya2luZyBhdXRvY29uZiIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2NvbmYgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPQ09ORj1hdXRvY29uZgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPQ09ORj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2NvbmYiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg2MTogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg3NDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2hlYWRlciIgPiY1Ci0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoYXV0b2hlYWRlciAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9IRUFERVI9YXV0b2hlYWRlcgotICAgZWNobyAiJGFjX3QiImZvdW5kIiAxPiY2Ci1lbHNlCi0gICBBVVRPSEVBREVSPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvaGVhZGVyIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4ODc6IGNoZWNraW5nIGZvciB3b3JraW5nIG1ha2VpbmZvIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChtYWtlaW5mbyAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIE1BS0VJTkZPPW1ha2VpbmZvCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIE1BS0VJTkZPPSIkbWlzc2luZ19kaXIvbWlzc2luZyBtYWtlaW5mbyIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXNoYXJlZCBvciAtLWRpc2FibGUtc2hhcmVkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3NoYXJlZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc2hhcmVkIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3NoYXJlZD15ZXMgOzsKLW5vKSBlbmFibGVfc2hhcmVkPW5vIDs7Ci0qKQotICBlbmFibGVfc2hhcmVkPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3NoYXJlZD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc2hhcmVkPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXN0YXRpYyBvciAtLWRpc2FibGUtc3RhdGljIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3N0YXRpYytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfc3RhdGljIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX3N0YXRpYz15ZXMgOzsKLW5vKSBlbmFibGVfc3RhdGljPW5vIDs7Ci0qKQotICBlbmFibGVfc3RhdGljPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX3N0YXRpYz15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfc3RhdGljPXllcwotZmkKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWZhc3QtaW5zdGFsbCBvciAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2Zhc3RfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfZmFzdF9pbnN0YWxsIgotICBwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhYwotZWxzZQotICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJyYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHJhbmxpYjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5NzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwMzM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDg0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTE2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAxMTI3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTEzMjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTU4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTE2MzogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTE3MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTkxOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTIzNDogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjU4OiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNjE6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjk3OiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzEzOiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM1MTogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogCVwoJGFjX3N5bWNvZGVcKSAJIAkqXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxNDogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxODogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDcwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLQotZmkKLQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLWVjaG8gIiRhY190IiIkYWNfcmVzdWx0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTE2OiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTI1OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1Mjg6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5jID4mNQotZmkKLXJtIC1yZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiIDE+JjYKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTU1NDogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgJGhvc3QgIT0gJGJ1aWxkOyB0aGVuCi0gIGFjX3Rvb2xfcHJlZml4PSR7aG9zdF9hbGlhc30tCi1lbHNlCi0gIGFjX3Rvb2xfcHJlZml4PQotZmkKLQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBmbGFncyB0byBwYXNzIHRvIGx0Y29uZmlnLgotbGlidG9vbF9mbGFncz0iLS1jYWNoZS1maWxlPSRjYWNoZV9maWxlIgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLXNoYXJlZCIKLXRlc3QgIiRlbmFibGVfc3RhdGljIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zdGF0aWMiCi10ZXN0ICIkZW5hYmxlX2Zhc3RfaW5zdGFsbCIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtZmFzdC1pbnN0YWxsIgotdGVzdCAiJGx0X2Rsb3BlbiIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1lbmFibGUtZGxvcGVuIgotdGVzdCAiJHNpbGVudCIgPSB5ZXMgJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1zaWxlbnQiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nY2MiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nY2MiCi10ZXN0ICIkYWNfY3ZfcHJvZ19nbnVfbGQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0td2l0aC1nbnUtbGQiCi0KLSMgU29tZSBmbGFncyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNvbXBpbGVyIG9yIGxpbmtlciBmb3IgZ29vZAotIyBsaWJ0b29sIHN1cHBvcnQuCi1jYXNlICIkaG9zdCIgaW4KLSotKi1pcml4NiopCi0gICMgRmluZCBvdXQgd2hpY2ggQUJJIHdlIGFyZSB1c2luZy4KLSAgZWNobyAnI2xpbmUgMTU5NiAiY29uZmlndXJlIicgPiBjb25mdGVzdC4kYWNfZXh0Ci0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU5NzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgIGNhc2UgImAvdXNyL2Jpbi9maWxlIGNvbmZ0ZXN0Lm9gIiBpbgotICAgICozMi1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC0zMiIKLSAgICAgIDs7Ci0gICAgKk4zMiopCi0gICAgICBMRD0iJHtMRC1sZH0gLW4zMiIKLSAgICAgIDs7Ci0gICAgKjY0LWJpdCopCi0gICAgICBMRD0iJHtMRC1sZH0gLTY0IgotICAgICAgOzsKLSAgICBlc2FjCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgOzsKLQotKi0qLXNjbzMuMnY1KikKLSAgIyBPbiBTQ08gT3BlblNlcnZlciA1LCB3ZSBuZWVkIC1iZWxmIHRvIGdldCBmdWxsLWZlYXR1cmVkIGJpbmFyaWVzLgotICBTQVZFX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1iZWxmIgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjE4OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyIG5lZWRzIC1iZWxmIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydsdF9jdl9jY19uZWVkc19iZWxmJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTYyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYzMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgbHRfY3ZfY2NfbmVlZHNfYmVsZj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9jY19uZWVkc19iZWxmIiAxPiY2Ci0gIGlmIHRlc3QgeCIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgIT0geCJ5ZXMiOyB0aGVuCi0gICAgIyB0aGlzIGlzIHByb2JhYmx5IGdjYyAyLjguMCwgZWdjcyAxLjAgb3IgbmV3ZXI7IG5vIG5lZWQgZm9yIC1iZWxmCi0gICAgQ0ZMQUdTPSIkU0FWRV9DRkxBR1MiCi0gIGZpCi0gIDs7Ci0KLSotKi1jeWd3aW4qKQotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1kbGx0b29sOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2NTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19ETExUT09MJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGFjX2N2X3Byb2dfRExMVE9PTD0iJERMTFRPT0wiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0RMTFRPT0w9IiR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLWlmIHRlc3QgLXogIiRhY19jdl9wcm9nX0RMTFRPT0wiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZGxsdG9vbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjg1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSJkbGx0b29sIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIiAmJiBhY19jdl9wcm9nX0RMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi1ETExUT09MPSIkYWNfY3ZfcHJvZ19ETExUT09MIgotaWYgdGVzdCAtbiAiJERMTFRPT0wiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkRExMVE9PTCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLSAgRExMVE9PTD0iZmFsc2UiCi1maQotZmkKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWFzIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iJHthY190b29sX3ByZWZpeH1hcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19BUyI7IHRoZW4KLWlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJhcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgYXM7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc1MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0FTJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBhY19jdl9wcm9nX0FTPSIkQVMiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0FTPSJhcyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiICYmIGFjX2N2X3Byb2dfQVM9ImZhbHNlIgotZmkKLWZpCi1BUz0iJGFjX2N2X3Byb2dfQVMiCi1pZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQVMiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIEFTPSJmYWxzZSIKLWZpCi1maQotCi0KLSAgOzsKLQotZXNhYwotCi0jIGVuYWJsZSB0aGUgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayBzd2l0Y2gKLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxpYnRvb2wtbG9jayBvciAtLWRpc2FibGUtbGlidG9vbC1sb2NrIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX2xpYnRvb2xfbG9jaytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbGlidG9vbF9sb2NrIgotICBuZWVkX2xvY2tzPSRlbmFibGV2YWwKLWVsc2UKLSAgbmVlZF9sb2Nrcz15ZXMKLWZpCi0KLQotaWYgdGVzdCB4IiRuZWVkX2xvY2tzIiA9IHhubzsgdGhlbgotICBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtbG9jayIKLWZpCi0KLQotIyBTYXZlIGNhY2hlLCBzbyB0aGF0IGx0Y29uZmlnIGNhbiBsb2FkIGl0Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi0KLSMgQWN0dWFsbHkgY29uZmlndXJlIGxpYnRvb2wuICBhY19hdXhfZGlyIGlzIHdoZXJlIGluc3RhbGwtc2ggaXMgZm91bmQuCi1DQz0iJENDIiBDRkxBR1M9IiRDRkxBR1MiIENQUEZMQUdTPSIkQ1BQRkxBR1MiIFwKLUxEPSIkTEQiIE5NPSIkTk0iIFJBTkxJQj0iJFJBTkxJQiIgTE5fUz0iJExOX1MiIFwKLURMTFRPT0w9IiRETExUT09MIiBBUz0iJEFTIiBcCi0ke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfYXV4X2Rpci9sdGNvbmZpZyAtLW5vLXJlZXhlYyBcCi0kbGlidG9vbF9mbGFncyAtLW5vLXZlcmlmeSAkYWNfYXV4X2Rpci9sdG1haW4uc2ggJGhvc3QgXAotfHwgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBsaWJ0b29sIGNvbmZpZ3VyZSBmYWlsZWQiIDE+JjI7IGV4aXQgMTsgfQotCi0jIFJlbG9hZCBjYWNoZSwgdGhhdCBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkIGJ5IGx0Y29uZmlnCi1pZiB0ZXN0IC1yICIkY2FjaGVfZmlsZSI7IHRoZW4KLSAgZWNobyAibG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgLiAkY2FjaGVfZmlsZQotZWxzZQotICBlY2hvICJjcmVhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgPiAkY2FjaGVfZmlsZQotZmkKLQotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotCi0jIFJlZGlyZWN0IHRoZSBjb25maWcubG9nIG91dHB1dCBhZ2Fpbiwgc28gdGhhdCB0aGUgbHRjb25maWcgbG9nIGlzIG5vdAotIyBjbG9iYmVyZWQgYnkgdGhlIG5leHQgbWVzc2FnZS4KLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXRhcmdldHMgb3IgLS1kaXNhYmxlLXRhcmdldHMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfdGFyZ2V0cytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfdGFyZ2V0cyIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBlbmFibGUtdGFyZ2V0cyBvcHRpb24gbXVzdCBzcGVjaWZ5IHRhcmdldCBuYW1lcyBvciAnYWxsJyIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjCi1maQotIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLTY0LWJpdC1iZmQgb3IgLS1kaXNhYmxlLTY0LWJpdC1iZmQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfNjRfYml0X2JmZCtzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfNjRfYml0X2JmZCIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpICB3YW50NjQ9dHJ1ZSAgOzsKLSAgbm8pICAgd2FudDY0PWZhbHNlIDs7Ci0gICopICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogYmFkIHZhbHVlICR7ZW5hYmxldmFsfSBmb3IgNjQtYml0LWJmZCBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZWxzZQotICB3YW50NjQ9ZmFsc2UKLWZpCi0KLQotCi0KLQotaWYgdGVzdCAteiAiJHRhcmdldCIgOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCBob3N0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MjE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5NTE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfcHJvZ19yZWplY3RlZD1ubwotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyLyRhY193b3JkIiA9ICIvdXNyL3VjYi9jYyI7IHRoZW4KLSAgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKLQljb250aW51ZQotICAgICAgZmkKLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotaWYgdGVzdCAkYWNfcHJvZ19yZWplY3RlZCA9IHllczsgdGhlbgotICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gIHNldCBkdW1teSAkYWNfY3ZfcHJvZ19DQwotICBzaGlmdAotICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0gICAgIyBXZSBjaG9zZSBhIGRpZmZlcmVudCBjb21waWxlciBmcm9tIHRoZSBib2d1cyBvbmUuCi0gICAgIyBIb3dldmVyLCBpdCBoYXMgdGhlIHNhbWUgYmFzZW5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotICAgICMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIGJhc2VuYW1lOyB1c2UgdGhlIGZ1bGwgZmlsZSBuYW1lLgotICAgIHNoaWZ0Ci0gICAgc2V0IGR1bW15ICIkYWNfZGlyLyRhY193b3JkIiAiJEAiCi0gICAgc2hpZnQKLSAgICBhY19jdl9wcm9nX0NDPSIkQCIKLSAgZmkKLWZpCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAgIGNhc2UgImB1bmFtZSAtc2AiIGluCi0gICAgKndpbjMyKiB8ICpXSU4zMiopCi0gICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNsIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImNsIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotIDs7Ci0gICAgZXNhYwotICBmaQotICB0ZXN0IC16ICIkQ0MiICYmIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbm8gYWNjZXB0YWJsZSBjYyBmb3VuZCBpbiBcJFBBVEgiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDM0OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSAyMDQ1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotbWFpbigpe3JldHVybigwKTt9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA1MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9eWVzCi0gICMgSWYgd2UgY2FuJ3QgcnVuIGEgdHJpdmlhbCBwcm9ncmFtLCB3ZSBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlci4KLSAgaWYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz1ubwotICBlbHNlCi0gICAgYWNfY3ZfcHJvZ19jY19jcm9zcz15ZXMKLSAgZmkKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIGFjX2N2X3Byb2dfY2Nfd29ya3M9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2Nfd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3Byb2dfY2Nfd29ya3MgPSBubzsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IEMgY29tcGlsZXIgY2Fubm90IGNyZWF0ZSBleGVjdXRhYmxlcy4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSBpcyBhIGNyb3NzLWNvbXBpbGVyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDc2OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA4MTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fR05VQ19fCi0gIHllczsKLSNlbmRpZgotRU9GCi1pZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA5MDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIGFjX2N2X3Byb2dfZ2NjPXllcwotZWxzZQotICBhY19jdl9wcm9nX2djYz1ubwotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19nY2MiIDE+JjYKLQotaWYgdGVzdCAkYWNfY3ZfcHJvZ19nY2MgPSB5ZXM7IHRoZW4KLSAgR0NDPXllcwotZWxzZQotICBHQ0M9Ci1maQotCi1hY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLWFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotQ0ZMQUdTPQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTA5OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi0jIEZpbmQgYSBnb29kIGluc3RhbGwgcHJvZ3JhbS4gIFdlIHByZWZlciBhIEMgcHJvZ3JhbSAoZmFzdGVyKSwKLSMgc28gb25lIHNjcmlwdCBpcyBhcyBnb29kIGFzIGFub3RoZXIuICBCdXQgYXZvaWQgdGhlIGJyb2tlbiBvcgotIyBpbmNvbXBhdGlibGUgdmVyc2lvbnM6Ci0jIFN5c1YgL2V0Yy9pbnN0YWxsLCAvdXNyL3NiaW4vaW5zdGFsbAotIyBTdW5PUyAvdXNyL2V0Yy9pbnN0YWxsCi0jIElSSVggL3NiaW4vaW5zdGFsbAotIyBBSVggL2Jpbi9pbnN0YWxsCi0jIEFJWCA0IC91c3IvYmluL2luc3RhbGxic2QsIHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRob3V0IGEgLWcgZmxhZwotIyBBRlMgL3Vzci9hZnN3cy9iaW4vaW5zdGFsbCwgd2hpY2ggbWlzaGFuZGxlcyBub25leGlzdGVudCBhcmdzCi0jIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCi0jIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNTI6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotQUxMX0xJTkdVQVM9Ci1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIwNzogY2hlY2tpbmcgaG93IHRvIHJ1biB0aGUgQyBwcmVwcm9jZXNzb3IiID4mNQotIyBPbiBTdW5zLCBzb21ldGltZXMgJENQUCBuYW1lcyBhIGRpcmVjdG9yeS4KLWlmIHRlc3QgLW4gIiRDUFAiICYmIHRlc3QgLWQgIiRDUFAiOyB0aGVuCi0gIENQUD0KLWZpCi1pZiB0ZXN0IC16ICIkQ1BQIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ1BQJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICAjIFRoaXMgbXVzdCBiZSBpbiBkb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlIHF1b3RlcywgYmVjYXVzZSBDUFAgbWF5IGdldAotICAjIHN1YnN0aXR1dGVkIGludG8gdGhlIE1ha2VmaWxlIGFuZCAiJHtDQy1jY30iIHdpbGwgY29uZnVzZSBtYWtlLgotICBDUFA9IiR7Q0MtY2N9IC1FIgotICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAotICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjI4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjM5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjQ1OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPSIke0NDLWNjfSAtbm9sb2dvIC1FIgotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjU2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLVN5bnRheCBFcnJvcgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjYyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgOgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgQ1BQPS9saWIvY3BwCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotcm0gLWYgY29uZnRlc3QqCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLSAgQ1BQPSIkYWNfY3ZfcHJvZ19DUFAiCi1lbHNlCi0gIGFjX2N2X3Byb2dfQ1BQPSIkQ1BQIgotZmkKLWVjaG8gIiRhY190IiIkQ1BQIiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjg3OiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzA4OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N0ZGMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzEzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMzIxOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz15ZXMKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzMzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJtZW1jaHIiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjM1NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgImZyZWUiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICA6Ci1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyAvYmluL2NjIGluIElyaXgtNC4wLjUgZ2V0cyBub24tQU5TSSBjdHlwZSBtYWNyb3MgdW5sZXNzIHVzaW5nIC1hbnNpLgotaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgOgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzc3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCi0jZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAnQScgKyAoKGMpIC0gJ2EnKSA6IChjKSkKLSNkZWZpbmUgWE9SKGUsIGYpICgoKGUpICYmICEoZikpIHx8ICghKGUpICYmIChmKSkpCi1pbnQgbWFpbiAoKSB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi1pZiAoWE9SIChpc2xvd2VyIChpKSwgSVNMT1dFUiAoaSkpIHx8IHRvdXBwZXIgKGkpICE9IFRPVVBQRVIgKGkpKSBleGl0KDIpOwotZXhpdCAoMCk7IH0KLQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgOgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9zdGRjIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgU1REQ19IRUFERVJTIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQxMjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2NfY29uc3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDE3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLS8qIFVsdHJpeCBtaXBzIGNjIHJlamVjdHMgdGhpcy4gICovCi10eXBlZGVmIGludCBjaGFyc2V0WzJdOyBjb25zdCBjaGFyc2V0IHg7Ci0vKiBTdW5PUyA0LjEuMSBjYyByZWplY3RzIHRoaXMuICAqLwotY2hhciBjb25zdCAqY29uc3QgKmNjcDsKLWNoYXIgKipwOwotLyogTkVDIFNWUjQuMC4yIG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXN0cnVjdCBwb2ludCB7aW50IHgsIHk7fTsKLXN0YXRpYyBzdHJ1Y3QgcG9pbnQgY29uc3QgemVybyA9IHswLDB9OwotLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzLgotICAgSXQgZG9lcyBub3QgbGV0IHlvdSBzdWJ0cmFjdCBvbmUgY29uc3QgWCogcG9pbnRlciBmcm9tIGFub3RoZXIgaW4gYW4gYXJtCi0gICBvZiBhbiBpZi1leHByZXNzaW9uIHdob3NlIGlmLXBhcnQgaXMgbm90IGEgY29uc3RhbnQgZXhwcmVzc2lvbiAqLwotY29uc3QgY2hhciAqZyA9ICJzdHJpbmciOwotY2NwID0gJmcgKyAoZyA/IGctZyA6IDApOwotLyogSFBVWCA3LjAgY2MgcmVqZWN0cyB0aGVzZS4gKi8KLSsrY2NwOwotcCA9IChjaGFyKiopIGNjcDsKLWNjcCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBwOwoteyAvKiBTQ08gMy4ydjQgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLSAgY2hhciAqdDsKLSAgY2hhciBjb25zdCAqcyA9IDAgPyAoY2hhciAqKSAwIDogKGNoYXIgY29uc3QgKikgMDsKLQotICAqdCsrID0gMDsKLX0KLXsgLyogU29tZW9uZSB0aGlua3MgdGhlIFN1biBzdXBwb3NlZGx5LUFOU0kgY29tcGlsZXIgd2lsbCByZWplY3QgdGhpcy4gICovCi0gIGludCB4W10gPSB7MjUsIDE3fTsKLSAgY29uc3QgaW50ICpmb28gPSAmeFswXTsKLSAgKytmb287Ci19Ci17IC8qIFN1biBTQzEuMCBBTlNJIGNvbXBpbGVyIHJlamVjdHMgdGhpcyAtLSBidXQgbm90IHRoZSBhYm92ZS4gKi8KLSAgdHlwZWRlZiBjb25zdCBpbnQgKmlwdHI7Ci0gIGlwdHIgcCA9IDA7Ci0gICsrcDsKLX0KLXsgLyogQUlYIFhMIEMgMS4wMi4wLjAgcmVqZWN0cyB0aGlzIHNheWluZwotICAgICAiay5jIiwgbGluZSAyLjI3OiAxNTA2LTAyNSAoUykgT3BlcmFuZCBtdXN0IGJlIGEgbW9kaWZpYWJsZSBsdmFsdWUuICovCi0gIHN0cnVjdCBzIHsgaW50IGo7IGNvbnN0IGludCAqYXBbM107IH07Ci0gIHN0cnVjdCBzICpiOyBiLT5qID0gNTsKLX0KLXsgLyogVUxUUklYLTMyIFYzLjEgKFJldiA5KSB2Y2MgcmVqZWN0cyB0aGlzICovCi0gIGNvbnN0IGludCBmb28gPSAxMDsKLX0KLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0NjY6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jX2NvbnN0PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2NfY29uc3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2NfY29uc3QgPSBubzsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgY29uc3QgCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGlubGluZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjQ4NzogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19pbmxpbmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19jdl9jX2lubGluZT1ubwotZm9yIGFjX2t3IGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lOyBkbwotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDk0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci19ICRhY19rdyBmb28oKSB7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjUwMTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfaW5saW5lPSRhY19rdzsgYnJlYWsKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1kb25lCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19pbmxpbmUiIDE+JjYKLWNhc2UgIiRhY19jdl9jX2lubGluZSIgaW4KLSAgaW5saW5lIHwgeWVzKSA7OwotICBubykgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIGlubGluZSAKLUVPRgotIDs7Ci0gICopICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBpbmxpbmUgJGFjX2N2X2NfaW5saW5lCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2ZmX3QiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI1Mjc6IGNoZWNraW5nIGZvciBvZmZfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9vZmZfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1MzIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pb2ZmX3RbXmEtekEtWl8wLTldIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl90eXBlX29mZl90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9vZmZfdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfdHlwZV9vZmZfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBvZmZfdCBsb25nCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNpemVfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjU2MDogY2hlY2tpbmcgZm9yIHNpemVfdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfdHlwZV9zaXplX3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTY1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZiBTVERDX0hFQURFUlMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICIoXnxbXmEtekEtWl8wLTldKXNpemVfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfc2l6ZV90PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi1lY2hvICIkYWNfdCIiJGFjX2N2X3R5cGVfc2l6ZV90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3NpemVfdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBzaXplX3QgdW5zaWduZWQKLUVPRgotCi1maQotCi0jIFRoZSBVbHRyaXggNC4yIG1pcHMgYnVpbHRpbiBhbGxvY2EgZGVjbGFyZWQgYnkgYWxsb2NhLmggb25seSB3b3JrcwotIyBmb3IgY29uc3RhbnQgYXJndW1lbnRzLiAgVXNlbGVzcyEKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTk1OiBjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2FsbG9jYV9oJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjYwMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YWxsb2NhLmg+Ci1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSBhbGxvY2EoMiAqIHNpemVvZihpbnQpKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjA3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9oZWFkZXJfYWxsb2NhX2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0FfSCAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjYyODogY2hlY2tpbmcgZm9yIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNjMzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2lmZGVmIF9fR05VQ19fCi0jIGRlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQotI2Vsc2UKLSMgaWZkZWYgX01TQ19WRVIKLSMgIGluY2x1ZGUgPG1hbGxvYy5oPgotIyAgZGVmaW5lIGFsbG9jYSBfYWxsb2NhCi0jIGVsc2UKLSMgIGlmIEhBVkVfQUxMT0NBX0gKLSMgICBpbmNsdWRlIDxhbGxvY2EuaD4KLSMgIGVsc2UKLSMgICBpZmRlZiBfQUlYCi0gI3ByYWdtYSBhbGxvY2EKLSMgICBlbHNlCi0jICAgIGlmbmRlZiBhbGxvY2EgLyogcHJlZGVmaW5lZCBieSBIUCBjYyArT2xpYmNhbGxzICovCi1jaGFyICphbGxvY2EgKCk7Ci0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gKGNoYXIgKikgYWxsb2NhKDEpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI2NjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBIDEKLUVPRgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IG5vOyB0aGVuCi0gICMgVGhlIFNWUjMgbGliUFcgYW5kIFNWUjQgbGlidWNiIGJvdGggY29udGFpbiBpbmNvbXBhdGlibGUgZnVuY3Rpb25zCi0gICMgdGhhdCBjYXVzZSB0cm91YmxlLiAgU29tZSB2ZXJzaW9ucyBkbyBub3QgZXZlbiBjb250YWluIGFsbG9jYSBvcgotICAjIGNvbnRhaW4gYSBidWdneSB2ZXJzaW9uLiAgSWYgeW91IHN0aWxsIHdhbnQgdG8gdXNlIHRoZWlyIGFsbG9jYSwKLSAgIyB1c2UgYXIgdG8gZXh0cmFjdCBhbGxvY2EubyBmcm9tIHRoZW0gaW5zdGVhZCBvZiBjb21waWxpbmcgYWxsb2NhLmMuCi0gIEFMTE9DQT1hbGxvY2EuJHthY19vYmpleHR9Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBDX0FMTE9DQSAxCi1FT0YKLQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjkzOiBjaGVja2luZyB3aGV0aGVyIGFsbG9jYSBuZWVkcyBDcmF5IGhvb2tzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9vc19jcmF5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaWYgZGVmaW5lZChDUkFZKSAmJiAhIGRlZmluZWQoQ1JBWTIpCi13ZWJlY3JheQotI2Vsc2UKLXdlbm90YmVjcmF5Ci0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ3ZWJlY3JheSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT15ZXMKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3Zfb3NfY3JheSIgMT4mNgotaWYgdGVzdCAkYWNfY3Zfb3NfY3JheSA9IHllczsgdGhlbgotZm9yIGFjX2Z1bmMgaW4gX2dldGI2NyBHRVRCNjcgZ2V0YjY3OyBkbwotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3MjM6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjc1MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBDUkFZX1NUQUNLU0VHX0VORCAkYWNfZnVuYwotRU9GCi0KLSAgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1kb25lCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzc4OiBjaGVja2luZyBzdGFjayBkaXJlY3Rpb24gZm9yIEMgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX3N0YWNrX2RpcmVjdGlvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTAKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjc4NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi1maW5kX3N0YWNrX2RpcmVjdGlvbiAoKQotewotICBzdGF0aWMgY2hhciAqYWRkciA9IDA7Ci0gIGF1dG8gY2hhciBkdW1teTsKLSAgaWYgKGFkZHIgPT0gMCkKLSAgICB7Ci0gICAgICBhZGRyID0gJmR1bW15OwotICAgICAgcmV0dXJuIGZpbmRfc3RhY2tfZGlyZWN0aW9uICgpOwotICAgIH0KLSAgZWxzZQotICAgIHJldHVybiAoJmR1bW15ID4gYWRkcikgPyAxIDogLTE7Ci19Ci1tYWluICgpCi17Ci0gIGV4aXQgKGZpbmRfc3RhY2tfZGlyZWN0aW9uKCkgPCAwKTsKLX0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPTEKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1mciBjb25mdGVzdCoKLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249LTEKLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uIiAxPiY2Ci1jYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSBTVEFDS19ESVJFQ1RJT04gJGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uCi1FT0YKLQotZmkKLQotZm9yIGFjX2hkciBpbiB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4MzA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODM1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyODQwOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4Njk6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI4NzQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6Mjg5NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjkyMjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbW1hcCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjkzMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLS8qIFRoYW5rcyB0byBNaWtlIEhhZXJ0ZWwgYW5kIEppbSBBdmVyYSBmb3IgdGhpcyB0ZXN0LgotICAgSGVyZSBpcyBhIG1hdHJpeCBvZiBtbWFwIHBvc3NpYmlsaXRpZXM6Ci0JbW1hcCBwcml2YXRlIG5vdCBmaXhlZAotCW1tYXAgcHJpdmF0ZSBmaXhlZCBhdCBzb21ld2hlcmUgY3VycmVudGx5IHVubWFwcGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotCW1tYXAgc2hhcmVkIG5vdCBmaXhlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHNoYXJlZCBmaXhlZCBhdCBzb21ld2hlcmUgYWxyZWFkeSBtYXBwZWQKLSAgIEZvciBwcml2YXRlIG1hcHBpbmdzLCB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgY2hhbmdlcyBjYW5ub3QgYmUgcmVhZCgpCi0gICBiYWNrIGZyb20gdGhlIGZpbGUsIG5vciBtbWFwJ3MgYmFjayBmcm9tIHRoZSBmaWxlIGF0IGEgZGlmZmVyZW50Ci0gICBhZGRyZXNzLiAgKFRoZXJlIGhhdmUgYmVlbiBzeXN0ZW1zIHdoZXJlIHByaXZhdGUgd2FzIG5vdCBjb3JyZWN0bHkKLSAgIGltcGxlbWVudGVkIGxpa2UgdGhlIGluZmFtb3VzIGkzODYgc3ZyNC4wLCBhbmQgc3lzdGVtcyB3aGVyZSB0aGUKLSAgIFZNIHBhZ2UgY2FjaGUgd2FzIG5vdCBjb2hlcmVudCB3aXRoIHRoZSBmaWxlc3lzdGVtIGJ1ZmZlciBjYWNoZQotICAgbGlrZSBlYXJseSB2ZXJzaW9ucyBvZiBGcmVlQlNEIGFuZCBwb3NzaWJseSBjb250ZW1wb3JhcnkgTmV0QlNELikKLSAgIEZvciBzaGFyZWQgbWFwcGluZ3MsIHdlIHNob3VsZCBjb252ZXJzZWx5IHZlcmlmeSB0aGF0IGNoYW5nZXMgZ2V0Ci0gICBwcm9wb2dhdGVkIGJhY2sgdG8gYWxsIHRoZSBwbGFjZXMgdGhleSdyZSBzdXBwb3NlZCB0byBiZS4KLQotICAgR3JlcCB3YW50cyBwcml2YXRlIGZpeGVkIGFscmVhZHkgbWFwcGVkLgotICAgVGhlIG1haW4gdGhpbmdzIGdyZXAgbmVlZHMgdG8ga25vdyBhYm91dCBtbWFwIGFyZToKLSAgICogZG9lcyBpdCBleGlzdCBhbmQgaXMgaXQgc2FmZSB0byB3cml0ZSBpbnRvIHRoZSBtbWFwJ2QgYXJlYQotICAgKiBob3cgdG8gdXNlIGl0IChCU0QgdmFyaWFudHMpICAqLwotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotLyogVGhpcyBtZXNzIHdhcyBjb3BpZWQgZnJvbSB0aGUgR05VIGdldHBhZ2VzaXplLmguICAqLwotI2lmbmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0jIGlmZGVmIEhBVkVfVU5JU1REX0gKLSMgIGluY2x1ZGUgPHVuaXN0ZC5oPgotIyBlbmRpZgotCi0vKiBBc3N1bWUgdGhhdCBhbGwgc3lzdGVtcyB0aGF0IGNhbiBydW4gY29uZmlndXJlIGhhdmUgc3lzL3BhcmFtLmguICAqLwotIyBpZm5kZWYgSEFWRV9TWVNfUEFSQU1fSAotIyAgZGVmaW5lIEhBVkVfU1lTX1BBUkFNX0ggMQotIyBlbmRpZgotCi0jIGlmZGVmIF9TQ19QQUdFU0laRQotIyAgZGVmaW5lIGdldHBhZ2VzaXplKCkgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jIGVsc2UgLyogbm8gX1NDX1BBR0VTSVpFICovCi0jICBpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICAgaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jICAgaWZkZWYgRVhFQ19QQUdFU0laRQotIyAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBFWEVDX1BBR0VTSVpFCi0jICAgZWxzZSAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICAgIGlmZGVmIE5CUEcKLSMgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEcgKiBDTFNJWkUKLSMgICAgIGlmbmRlZiBDTFNJWkUKLSMgICAgICBkZWZpbmUgQ0xTSVpFIDEKLSMgICAgIGVuZGlmIC8qIG5vIENMU0laRSAqLwotIyAgICBlbHNlIC8qIG5vIE5CUEcgKi8KLSMgICAgIGlmZGVmIE5CUEMKLSMgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBOQlBDCi0jICAgICBlbHNlIC8qIG5vIE5CUEMgKi8KLSMgICAgICBpZmRlZiBQQUdFU0laRQotIyAgICAgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBQQUdFU0laRQotIyAgICAgIGVuZGlmIC8qIFBBR0VTSVpFICovCi0jICAgICBlbmRpZiAvKiBubyBOQlBDICovCi0jICAgIGVuZGlmIC8qIG5vIE5CUEcgKi8KLSMgICBlbmRpZiAvKiBubyBFWEVDX1BBR0VTSVpFICovCi0jICBlbHNlIC8qIG5vIEhBVkVfU1lTX1BBUkFNX0ggKi8KLSMgICBkZWZpbmUgZ2V0cGFnZXNpemUoKSA4MTkyCS8qIHB1bnQgdG90YWxseSAqLwotIyAgZW5kaWYgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyBlbmRpZiAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLQotI2VuZGlmIC8qIG5vIEhBVkVfR0VUUEFHRVNJWkUgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsgdm9pZCAqbWFsbG9jKHVuc2lnbmVkKTsgfQotI2Vsc2UKLWNoYXIgKm1hbGxvYygpOwotI2VuZGlmCi0KLWludAotbWFpbigpCi17Ci0JY2hhciAqZGF0YSwgKmRhdGEyLCAqZGF0YTM7Ci0JaW50IGksIHBhZ2VzaXplOwotCWludCBmZDsKLQotCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKLQotCS8qCi0JICogRmlyc3QsIG1ha2UgYSBmaWxlIHdpdGggc29tZSBrbm93biBnYXJiYWdlIGluIGl0LgotCSAqLwotCWRhdGEgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJKihkYXRhICsgaSkgPSByYW5kKCk7Ci0JdW1hc2soMCk7Ci0JZmQgPSBjcmVhdCgiY29uZnRlc3RtbWFwIiwgMDYwMCk7Ci0JaWYgKGZkIDwgMCkKLQkJZXhpdCgxKTsKLQlpZiAod3JpdGUoZmQsIGRhdGEsIHBhZ2VzaXplKSAhPSBwYWdlc2l6ZSkKLQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0KLQkvKgotCSAqIE5leHQsIHRyeSB0byBtbWFwIHRoZSBmaWxlIGF0IGEgZml4ZWQgYWRkcmVzcyB3aGljaAotCSAqIGFscmVhZHkgaGFzIHNvbWV0aGluZyBlbHNlIGFsbG9jYXRlZCBhdCBpdC4gIElmIHdlIGNhbiwKLQkgKiBhbHNvIG1ha2Ugc3VyZSB0aGF0IHdlIHNlZSB0aGUgc2FtZSBnYXJiYWdlLgotCSAqLwotCWZkID0gb3BlbigiY29uZnRlc3RtbWFwIiwgT19SRFdSKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWRhdGEyID0gbWFsbG9jKDIgKiBwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhMikKLQkJZXhpdCgxKTsKLQlkYXRhMiArPSAocGFnZXNpemUgLSAoKGludCkgZGF0YTIgJiAocGFnZXNpemUgLSAxKSkpICYgKHBhZ2VzaXplIC0gMSk7Ci0JaWYgKGRhdGEyICE9IG1tYXAoZGF0YTIsIHBhZ2VzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCSAgICBNQVBfUFJJVkFURSB8IE1BUF9GSVhFRCwgZmQsIDBMKSkKLQkJZXhpdCgxKTsKLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXNpemU7ICsraSkKLQkJaWYgKCooZGF0YSArIGkpICE9ICooZGF0YTIgKyBpKSkKLQkJCWV4aXQoMSk7Ci0KLQkvKgotCSAqIEZpbmFsbHksIG1ha2Ugc3VyZSB0aGF0IGNoYW5nZXMgdG8gdGhlIG1hcHBlZCBhcmVhCi0JICogZG8gbm90IHBlcmNvbGF0ZSBiYWNrIHRvIHRoZSBmaWxlIGFzIHNlZW4gYnkgcmVhZCgpLgotCSAqIChUaGlzIGlzIGEgYnVnIG9uIHNvbWUgdmFyaWFudHMgb2YgaTM4NiBzdnI0LjAuKQotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEyICsgaSkgPSAqKGRhdGEyICsgaSkgKyAxOwotCWRhdGEzID0gbWFsbG9jKHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEzKQotCQlleGl0KDEpOwotCWlmIChyZWFkKGZkLCBkYXRhMywgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMyArIGkpKQotCQkJZXhpdCgxKTsKLQljbG9zZShmZCk7Ci0JdW5saW5rKCJjb25mdGVzdG1tYXAiKTsKLQlleGl0KDApOwotfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzA3MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX01NQVAgMQotRU9GCi0KLWZpCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgZm9yIGFjX2hkciBpbiBhcmd6LmggbGltaXRzLmggbG9jYWxlLmggbmxfdHlwZXMuaCBtYWxsb2MuaCBzdHJpbmcuaCBcCi11bmlzdGQuaCB2YWx1ZXMuaCBzeXMvcGFyYW0uaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMwOTg6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMTAzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTA4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZm9yIGFjX2Z1bmMgaW4gZ2V0Y3dkIG11bm1hcCBwdXRlbnYgc2V0ZW52IHNldGxvY2FsZSBzdHJjaHIgc3RyY2FzZWNtcCBcCi1fX2FyZ3pfY291bnQgX19hcmd6X3N0cmluZ2lmeSBfX2FyZ3pfbmV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzEzODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzE0MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMTY2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0KLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHkrc2V0fSIgIT0gInNldCI7IHRoZW4KLSAgICAgZm9yIGFjX2Z1bmMgaW4gc3RwY3B5Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMTk1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMyMjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgIGZpCi0gICBpZiB0ZXN0ICIke2FjX2N2X2Z1bmNfc3RwY3B5fSIgPSAieWVzIjsgdGhlbgotICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TVFBDUFkgMQotRU9GCi0KLSAgIGZpCi0KLSAgIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMQ19NRVNTQUdFUyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI1NzogY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhbV9jdl92YWxfTENfTUVTU0FHRVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMjYyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsb2NhbGUuaD4KLWludCBtYWluKCkgewotcmV0dXJuIExDX01FU1NBR0VTCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzI2OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYW1fY3ZfdmFsX0xDX01FU1NBR0VTPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYW1fY3ZfdmFsX0xDX01FU1NBR0VTIiAxPiY2Ci0gICAgaWYgdGVzdCAkYW1fY3ZfdmFsX0xDX01FU1NBR0VTID0geWVzOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9MQ19NRVNTQUdFUyAxCi1FT0YKLQotICAgIGZpCi0gIGZpCi0gICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMyOTA6IGNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAgICMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1ubHMgb3IgLS1kaXNhYmxlLW5scyB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9ubHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX25scyIKLSAgVVNFX05MUz0kZW5hYmxldmFsCi1lbHNlCi0gIFVTRV9OTFM9eWVzCi1maQotCi0gICAgZWNobyAiJGFjX3QiIiRVU0VfTkxTIiAxPiY2Ci0gICAgCi0KLSAgICBVU0VfSU5DTFVERURfTElCSU5UTD1ubwotCi0gICAgICAgIGlmIHRlc3QgIiRVU0VfTkxTIiA9ICJ5ZXMiOyB0aGVuCi0gICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgRU5BQkxFX05MUyAxCi1FT0YKLQotICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzMxMDogY2hlY2tpbmcgd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZCIgPiY1Ci0gICAgICAjIENoZWNrIHdoZXRoZXIgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgb3IgLS13aXRob3V0LWluY2x1ZGVkLWdldHRleHQgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHt3aXRoX2luY2x1ZGVkX2dldHRleHQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfaW5jbHVkZWRfZ2V0dGV4dCIKLSAgbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dD0kd2l0aHZhbAotZWxzZQotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PW5vCi1maQotCi0gICAgICBlY2hvICIkYWNfdCIiJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiIDE+JjYKLQotICAgICAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD0iJG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQiCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgIT0gInllcyI7IHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIAkJbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCWFjX3NhZmU9YGVjaG8gImxpYmludGwuaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGliaW50bC5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzI5OiBjaGVja2luZyBmb3IgbGliaW50bC5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzM0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaWJpbnRsLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMzMzk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzU2OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJjIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNjEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzNjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgMT4mNgotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzM4NDogY2hlY2tpbmcgZm9yIGJpbmR0ZXh0ZG9tYWluIGluIC1saW50bCIgPiY1Ci1hY19saWJfdmFyPWBlY2hvIGludGwnXydiaW5kdGV4dGRvbWFpbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxpbnRsICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzOTIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBiaW5kdGV4dGRvbWFpbigpOwotCi1pbnQgbWFpbigpIHsKLWJpbmR0ZXh0ZG9tYWluKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDAzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDE5OiBjaGVja2luZyBmb3IgZ2V0dGV4dCBpbiBsaWJpbnRsIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MjQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiAoaW50KSBnZXR0ZXh0ICgiIikKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDMxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGw9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JICAgZmkKLQotCSAgIGlmIHRlc3QgIiRndF9jdl9mdW5jX2dldHRleHRfbGliYyIgPSAieWVzIiBcCi0JICAgICAgfHwgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsIiA9ICJ5ZXMiOyB0aGVuCi0JICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfR0VUVEVYVCAxCi1FT0YKLQotCSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ1OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJubyIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCWZvciBhY19mdW5jIGluIGRjZ2V0dGV4dAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ5MzogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzQ5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNTIxOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0JCSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZ21zZ2ZtdCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ21zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTQ4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfR01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRHTVNHRk1UIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gID86LyopCQkJIAotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgZG9zIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvIAotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRhY19kaXIvJGFjX3dvcmQiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX0dNU0dGTVQiICYmIGFjX2N2X3BhdGhfR01TR0ZNVD0iJE1TR0ZNVCIKLSAgOzsKLWVzYWMKLWZpCi1HTVNHRk1UPSIkYWNfY3ZfcGF0aF9HTVNHRk1UIgotaWYgdGVzdCAtbiAiJEdNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkR01TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJ4Z2V0dGV4dCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgeGdldHRleHQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzU4NDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX1hHRVRURVhUJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJFhHRVRURVhUIiBpbgotICAvKikKLSAgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJFhHRVRURVhUIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJyhIRUxQKSdgIjsgdGhlbgotCWFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRhY19kaXIvJGFjX3dvcmQiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfWEdFVFRFWFQiICYmIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IjoiCi0gIDs7Ci1lc2FjCi1maQotWEdFVFRFWFQ9IiRhY19jdl9wYXRoX1hHRVRURVhUIgotaWYgdGVzdCAtbiAiJFhHRVRURVhUIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFhHRVRURVhUIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQljYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50IF9ubF9tc2dfY2F0X2NudHI7Ci0JCQkgICAgICAgcmV0dXJuIF9ubF9tc2dfY2F0X2NudHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNjI0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9LmdtbwotCQkgICBEQVRBRElSTkFNRT1zaGFyZQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCQlJTlNUT0JKRVhUPS5tbwotCSAgICAgIGZpCi0JICAgIGZpCi0JCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0JICAgICAgICAKLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIAkgIAkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgIElOVExPQkpTPSJcJChHRVRUT0JKUykiCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAibXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzY1NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX01TR0ZNVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX01TR0ZNVD0iJE1TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCI7IHRoZW4KLQlhY19jdl9wYXRoX01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9NU0dGTVQiICYmIGFjX2N2X3BhdGhfTVNHRk1UPSJtc2dmbXQiCi0gIDs7Ci1lc2FjCi1maQotTVNHRk1UPSIkYWNfY3ZfcGF0aF9NU0dGTVQiCi1pZiB0ZXN0IC1uICIkTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJE1TR0ZNVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM2OTA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzI2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgIAotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JCQlpZiAkWEdFVFRFWFQgLS1vbWl0LWhlYWRlciAvZGV2L251bGwgMj4gL2Rldi9udWxsOyB0aGVuCi0JICA6IDsKLQllbHNlCi0JICBlY2hvICIkYWNfdCIiZm91bmQgeGdldHRleHQgcHJvZ3JhbXMgaXMgbm90IEdOVSB4Z2V0dGV4dDsgaWdub3JlIGl0IiAxPiY2Ci0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgICAgICAgICAgICAgIGZvciBsYW5nIGluICRBTExfTElOR1VBUzsgZG8KLSAgICAgIEdNT0ZJTEVTPSIkR01PRklMRVMgJGxhbmcuZ21vIgotICAgICAgUE9GSUxFUz0iJFBPRklMRVMgJGxhbmcucG8iCi0gICAgZG9uZQotCi0gICAgICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAgIAotICAKLQotICAgaWYgdGVzdCAieCRDQVRPQkpFWFQiICE9ICJ4IjsgdGhlbgotICAgICBpZiB0ZXN0ICJ4JEFMTF9MSU5HVUFTIiA9ICJ4IjsgdGhlbgotICAgICAgIExJTkdVQVM9Ci0gICAgIGVsc2UKLSAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODE2OiBjaGVja2luZyBmb3IgY2F0YWxvZ3MgdG8gYmUgaW5zdGFsbGVkIiA+JjUKLSAgICAgICBORVdfTElOR1VBUz0KLSAgICAgICBmb3IgbGFuZyBpbiAke0xJTkdVQVM9JEFMTF9MSU5HVUFTfTsgZG8KLSAgICAgICAgIGNhc2UgIiRBTExfTElOR1VBUyIgaW4KLSAgICAgICAgICAqJGxhbmcqKSBORVdfTElOR1VBUz0iJE5FV19MSU5HVUFTICRsYW5nIiA7OwotICAgICAgICAgZXNhYwotICAgICAgIGRvbmUKLSAgICAgICBMSU5HVUFTPSRORVdfTElOR1VBUwotICAgICAgIGVjaG8gIiRhY190IiIkTElOR1VBUyIgMT4mNgotICAgICBmaQotCi0gICAgICAgICAgaWYgdGVzdCAtbiAiJExJTkdVQVMiOyB0aGVuCi0gICAgICAgZm9yIGxhbmcgaW4gJExJTkdVQVM7IGRvIENBVEFMT0dTPSIkQ0FUQUxPR1MgJGxhbmckQ0FUT0JKRVhUIjsgZG9uZQotICAgICBmaQotICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IiNpbmNsdWRlIDxsb2NhbGUuaD4iCi0gICBlbHNlCi0gICAgIElOQ0xVREVfTE9DQUxFX0g9IlwKLS8qIFRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSB0aGUgaGVhZGVyIDxsb2NhbGUuaD4uICBUYWtlIGNhcmUgeW91cnNlbGYuICAqLyIKLSAgIGZpCi0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZiAkc3JjZGlyL3BvMnRibC5zZWQuaW47IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRDQVRPQkpFWFQiID0gIi5jYXQiOyB0aGVuCi0JIGFjX3NhZmU9YGVjaG8gImxpbnV4L3ZlcnNpb24uaCIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODQ0OiBjaGVja2luZyBmb3IgbGludXgvdmVyc2lvbi5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzODQ5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjM4NTQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBtc2dmb3JtYXQ9bGludXgKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1tc2dmb3JtYXQ9eG9wZW4KLWZpCi0KLQotCSAgICAgICAgICAJIHNlZCAtZSAnL14jL2QnICRzcmNkaXIvJG1zZ2Zvcm1hdC1tc2cuc2VkID4gcG8ybXNnLnNlZAotICAgICAgZmkKLSAgICAgICAgICAgIHNlZCAtZSAnL14jLipbXlxcXSQvZCcgLWUgJy9eIyQvZCcgXAotCSAkc3JjZGlyL3BvMnRibC5zZWQuaW4gPiBwbzJ0Ymwuc2VkCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgCi0gICAKLQotICAgTUtJTlNUQUxMRElSUz0iXCQoc3JjZGlyKS8uLi8uLi9ta2luc3RhbGxkaXJzIgotICAgCi0KLSAgICAgIGw9Ci0gICAKLQotICAgICAgICAgICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTE3OiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzOTIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTMzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozOTUwOiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM5NTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozOTYyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5ODE6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM5OTE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLWZvciBhY19wcm9nIGluICdiaXNvbiAteScgYnlhY2MKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDE3OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBhY19jdl9wcm9nX1lBQ0M9IiRZQUNDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ZQUNDPSIkYWNfcHJvZyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotWUFDQz0iJGFjX2N2X3Byb2dfWUFDQyIKLWlmIHRlc3QgLW4gIiRZQUNDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFlBQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkWUFDQyIgJiYgYnJlYWsKLWRvbmUKLXRlc3QgLW4gIiRZQUNDIiB8fCBZQUNDPSJ5YWNjIgotCi1taXNzaW5nX2Rpcj1gY2QgJGFjX2F1eF9kaXIgJiYgcHdkYAotZm9yIGFjX3Byb2cgaW4gZmxleCBsZXgKLWRvCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiRhY19wcm9nIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSAkYWNfcHJvZzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDUzOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iJGFjX3Byb2ciCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUxFWD0iJGFjX2N2X3Byb2dfTEVYIgotaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRMRVgiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi10ZXN0IC1uICIkTEVYIiAmJiBicmVhawotZG9uZQotdGVzdCAtbiAiJExFWCIgfHwgTEVYPSIiJG1pc3NpbmdfZGlyL21pc3NpbmcgZmxleCIiCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiZmxleCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZmxleDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MDg2OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfTEVYJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJExFWCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19MRVg9IiRMRVgiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0xFWD0iZmxleCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfTEVYIiAmJiBhY19jdl9wcm9nX0xFWD0ibGV4IgotZmkKLWZpCi1MRVg9IiRhY19jdl9wcm9nX0xFWCIKLWlmIHRlc3QgLW4gIiRMRVgiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTEVYIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJExFWExJQiIKLXRoZW4KLSAgY2FzZSAiJExFWCIgaW4KLSAgZmxleCopIGFjX2xpYj1mbCA7OwotICAqKSBhY19saWI9bCA7OwotICBlc2FjCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0MTIwOiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1Ci1hY19saWJfdmFyPWBlY2hvICRhY19saWInXyd5eXdyYXAgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1sJGFjX2xpYiAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTI4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgeXl3cmFwKCk7Ci0KLWludCBtYWluKCkgewoteXl3cmFwKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTM5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBMRVhMSUI9Ii1sJGFjX2xpYiIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBsZXggb3V0cHV0IGZpbGUgcm9vdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDE2MjogY2hlY2tpbmcgbGV4IG91dHB1dCBmaWxlIHJvb3QiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfbGV4X3Jvb3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFRoZSBtaW5pbWFsIGxleCBwcm9ncmFtIGlzIGp1c3QgYSBzaW5nbGUgbGluZTogJSUuICBCdXQgc29tZSBicm9rZW4gbGV4ZXMKLSMgKFNvbGFyaXMsIEkgdGhpbmsgaXQgd2FzKSB3YW50IHR3byAlJSBsaW5lcywgc28gYWNjb21tb2RhdGUgdGhlbS4KLWVjaG8gJyUlCi0lJScgfCAkTEVYCi1pZiB0ZXN0IC1mIGxleC55eS5jOyB0aGVuCi0gIGFjX2N2X3Byb2dfbGV4X3Jvb3Q9bGV4Lnl5Ci1lbGlmIHRlc3QgLWYgbGV4eXkuYzsgdGhlbgotICBhY19jdl9wcm9nX2xleF9yb290PWxleHl5Ci1lbHNlCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2Fubm90IGZpbmQgb3V0cHV0IGZyb20gJExFWDsgZ2l2aW5nIHVwIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3Jvb3QiIDE+JjYKLUxFWF9PVVRQVVRfUk9PVD0kYWNfY3ZfcHJvZ19sZXhfcm9vdAotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHl5dGV4dCBpcyBhIHBvaW50ZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxODM6IGNoZWNraW5nIHdoZXRoZXIgeXl0ZXh0IGlzIGEgcG9pbnRlciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIFBPU0lYIHNheXMgbGV4IGNhbiBkZWNsYXJlIHl5dGV4dCBlaXRoZXIgYXMgYSBwb2ludGVyIG9yIGFuIGFycmF5OyB0aGUKLSMgZGVmYXVsdCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIEZpZ3VyZSBvdXQgd2hpY2ggaXQgaXMsIHNpbmNlCi0jIG5vdCBhbGwgaW1wbGVtZW50YXRpb25zIHByb3ZpZGUgdGhlICVwb2ludGVyIGFuZCAlYXJyYXkgZGVjbGFyYXRpb25zLgotYWNfY3ZfcHJvZ19sZXhfeXl0ZXh0X3BvaW50ZXI9bm8KLWVjaG8gJ2V4dGVybiBjaGFyICp5eXRleHQ7JyA+PiRMRVhfT1VUUFVUX1JPT1QuYwotYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9IiRMSUJTICRMRVhMSUIiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTk1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWBjYXQgJExFWF9PVVRQVVRfUk9PVC5jYAotaW50IG1haW4oKSB7Ci0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjAyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlcj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotcm0gLWYgIiR7TEVYX09VVFBVVF9ST09UfS5jIgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfbGV4X3l5dGV4dF9wb2ludGVyIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2xleF95eXRleHRfcG9pbnRlciA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgWVlURVhUX1BPSU5URVIgMQotRU9GCi0KLWZpCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyMjU6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi0KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLQotCi0KLQotCi1mb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB1bmlzdGQuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQyNTk6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MjY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MjY5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZm9yIGFjX2Z1bmMgaW4gc2JyawotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDI5ODogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDMwMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MzI2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1hY19oZWFkZXJfZGlyZW50PW5vCi1mb3IgYWNfaGRyIGluIGRpcmVudC5oIHN5cy9uZGlyLmggc3lzL2Rpci5oIG5kaXIuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM1NTogY2hlY2tpbmcgZm9yICRhY19oZHIgdGhhdCBkZWZpbmVzIERJUiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX2RpcmVudF8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQzNjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPCRhY19oZHI+Ci1pbnQgbWFpbigpIHsKLURJUiAqZGlycCA9IDA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NDM2ODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl9kaXJlbnRfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl9kaXJlbnRfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIGFjX2hlYWRlcl9kaXJlbnQ9JGFjX2hkcjsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotIyBUd28gdmVyc2lvbnMgb2Ygb3BlbmRpciBldCBhbC4gYXJlIGluIC1sZGlyIGFuZCAtbHggb24gU0NPIFhlbml4LgotaWYgdGVzdCAkYWNfaGVhZGVyX2RpcmVudCA9IGRpcmVudC5oOyB0aGVuCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb3BlbmRpciBpbiAtbGRpciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDM5MzogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWxkaXIiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkaXInXydvcGVuZGlyIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGRpciAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDAxICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0MTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1sZGlyIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVsc2UKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvcGVuZGlyIGluIC1seCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDQzNDogY2hlY2tpbmcgZm9yIG9wZW5kaXIgaW4gLWx4IiA+JjUKLWFjX2xpYl92YXI9YGVjaG8geCdfJ29wZW5kaXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLUxJQlM9Ii1seCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NDQyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgb3BlbmRpcigpOwotCi1pbnQgbWFpbigpIHsKLW9wZW5kaXIoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ0NTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1seCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCi0KLQotY2FzZSAiJHtob3N0fSIgaW4KLSotKi1tc2RvcyogfCAqLSotZ28zMiogfCAqLSotbWluZ3czMiogfCAqLSotY3lnd2luKiB8ICotKi13aW5kb3dzKQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgVVNFX0JJTkFSWV9GT1BFTiAxCi1FT0YKLSA7OwotZXNhYwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NDg2OiBjaGVja2luZyB3aGV0aGVyIHN0cnN0ciBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDQ5MSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBzdHJzdHIKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NTEyOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3N0cnN0cj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyPXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc3Ryc3RyID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX1NUUlNUUiAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBmcmVlIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ1MzM6IGNoZWNraW5nIHdoZXRoZXIgZnJlZSBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ1MzggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZnJlZQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ1NTk6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZT1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZnJlZT15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2ZyZWUiIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9mcmVlID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc2JyayBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NTgwOiBjaGVja2luZyB3aGV0aGVyIHNicmsgbXVzdCBiZSBkZWNsYXJlZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYmZkX2N2X2RlY2xfbmVlZGVkX3NicmsnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0NTg1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2Vsc2UKLSNpZmRlZiBIQVZFX1NUUklOR1NfSAotI2luY2x1ZGUgPHN0cmluZ3MuaD4KLSNlbmRpZgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWNoYXIgKigqcGZuKSA9IChjaGFyICooKikpIHNicmsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjA2OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3Nicms9bm8KLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX3Nicms9eWVzCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGJmZF9jdl9kZWNsX25lZWRlZF9zYnJrIiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfc2JyayA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgTkVFRF9ERUNMQVJBVElPTl9TQlJLIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo0NjI3OiBjaGVja2luZyB3aGV0aGVyIGdldGVudiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNDYzMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbHNlCi0jaWZkZWYgSEFWRV9TVFJJTkdTX0gKLSNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZW5kaWYKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotaW50IG1haW4oKSB7Ci1jaGFyICooKnBmbikgPSAoY2hhciAqKCopKSBnZXRlbnYKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0NjUzOiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYmZkX2N2X2RlY2xfbmVlZGVkX2dldGVudj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52PXllcwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52IiAxPiY2Ci1pZiB0ZXN0ICRiZmRfY3ZfZGVjbF9uZWVkZWRfZ2V0ZW52ID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0dFVEVOViAxCi1FT0YKLQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBlbnZpcm9uIG11c3QgYmUgZGVjbGFyZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQ2NzQ6IGNoZWNraW5nIHdoZXRoZXIgZW52aXJvbiBtdXN0IGJlIGRlY2xhcmVkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQ2NzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLWludCBtYWluKCkgewotY2hhciAqKCpwZm4pID0gKGNoYXIgKigqKSkgZW52aXJvbgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjQ3MDA6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj1ubwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBiZmRfY3ZfZGVjbF9uZWVkZWRfZW52aXJvbj15ZXMKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYmZkX2N2X2RlY2xfbmVlZGVkX2Vudmlyb24iIDE+JjYKLWlmIHRlc3QgJGJmZF9jdl9kZWNsX25lZWRlZF9lbnZpcm9uID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04gMQotRU9GCi0KLWZpCi0KLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLWFsbF90YXJnZXRzPQotRU1VTD0KLWFsbF9lbXVscz0KLWFsbF9lbXVsX2V4dHJhcz0KLWFsbF9saWJwYXRoPQotCi1ybSAtZiB0ZGlycwotCi1mb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi1kbwotICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgotICAgIGFsbF90YXJnZXRzPXRydWUKLSAgZWxzZQotICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotICAgIHJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQl0YXJnPSRyZXN1bHQKLSAgICBlbHNlCi0JdGFyZz0kdGFyZ19hbGlhcwotICAgIGZpCi0KLSAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0Ci0KLSAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KLSAgICAgIEVNVUw9JHRhcmdfZW11bAotICAgIGZpCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfZW11bHMgIiBpbgotCSoiIGUke2l9Lm8gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVscz0iJGFsbF9lbXVscyBlJHtpfS5vIgotCSAgZXZhbCByZXN1bHQ9XCR0ZGlyXyRpCi0JICB0ZXN0IC16ICIkcmVzdWx0IiAmJiByZXN1bHQ9JHRhcmdfYWxpYXMKLQkgIGVjaG8gdGRpcl8kaT0kcmVzdWx0ID4+IHRkaXJzCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfbGlicGF0aCAiIGluCi0JKiIgJHtpfSAiKikgOzsKLQkqKQotCSAgaWYgdGVzdCAteiAiJGFsbF9saWJwYXRoIjsgdGhlbgotCSAgICBhbGxfbGlicGF0aD0ke2l9Ci0JICBlbHNlCi0JICAgIGFsbF9saWJwYXRoPSIkYWxsX2xpYnBhdGggJHtpfSIKLQkgIGZpCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19leHRyYV9vZmlsZXM7IGRvCi0JY2FzZSAiICRhbGxfZW11bF9leHRyYXMgIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVsX2V4dHJhcz0iJGFsbF9lbXVsX2V4dHJhcyAke2l9IgotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotICBmaQotZG9uZQotCi0KLQotVERJUlM9dGRpcnMKLQotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHh0cnVlOyB0aGVuCi0gIGlmIHRlc3QgeCR7d2FudDY0fSA9IHh0cnVlOyB0aGVuCi0gICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUykgJChBTExfNjRfRU1VTEFUSU9OUyknCi0gIGVsc2UKLSAgICBFTVVMQVRJT05fT0ZJTEVTPSckKEFMTF9FTVVMQVRJT05TKScKLSAgZmkKLSAgRU1VTF9FWFRSQV9PRklMRVM9JyQoQUxMX0VNVUxfRVhUUkFfT0ZJTEVTKScKLWVsc2UKLSAgRU1VTEFUSU9OX09GSUxFUz0kYWxsX2VtdWxzCi0gIEVNVUxfRVhUUkFfT0ZJTEVTPSRhbGxfZW11bF9leHRyYXMKLWZpCi0KLQotCi1FTVVMQVRJT05fTElCUEFUSD0kYWxsX2xpYnBhdGgKLQotCi1pZiB0ZXN0IHgke2VuYWJsZV9zdGF0aWN9ID0geG5vOyB0aGVuCi0gIFRFU1RCRkRMSUI9Ii0tcnBhdGggLi4vYmZkLy5saWJzIC4uL2JmZC8ubGlicy9saWJiZmQuc28iCi1lbHNlCi0gIFRFU1RCRkRMSUI9Ii4uL2JmZC8ubGlicy9saWJiZmQuYSIKLWZpCi0KLQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLXRlc3QgIngkcHJlZml4IiA9IHhOT05FICYmIHByZWZpeD0kYWNfZGVmYXVsdF9wcmVmaXgKLSMgTGV0IG1ha2UgZXhwYW5kIGV4ZWNfcHJlZml4LgotdGVzdCAieCRleGVjX3ByZWZpeCIgPSB4Tk9ORSAmJiBleGVjX3ByZWZpeD0nJHtwcmVmaXh9JwotCi0jIEFueSBhc3NpZ25tZW50IHRvIFZQQVRIIGNhdXNlcyBTdW4gbWFrZSB0byBvbmx5IGV4ZWN1dGUKLSMgdGhlIGZpcnN0IHNldCBvZiBkb3VibGUtY29sb24gcnVsZXMsIHNvIHJlbW92ZSBpdCBpZiBub3QgbmVlZGVkLgotIyBJZiB0aGVyZSBpcyBhIGNvbG9uIGluIHRoZSBwYXRoLCB3ZSBuZWVkIHRvIGtlZXAgaXQuCi1pZiB0ZXN0ICJ4JHNyY2RpciIgPSB4LjsgdGhlbgotICBhY192cHN1Yj0nL15bIAldKlZQQVRIWyAJXSo9W146XSokL2QnCi1maQotCi10cmFwICdybSAtZiAkQ09ORklHX1NUQVRVUyBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci0KLURFRlM9LURIQVZFX0NPTkZJR19ICi0KLSMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgotOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQotCi1lY2hvIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTCi1ybSAtZiAkQ09ORklHX1NUQVRVUwotY2F0ID4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSMhIC9iaW4vc2gKLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLgotIyBSdW4gdGhpcyBmaWxlIHRvIHJlY3JlYXRlIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi0jIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3MsCi0jIG9uIGhvc3QgYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgOgotIwotIyAkMCAkYWNfY29uZmlndXJlX2FyZ3MKLSMKLSMgQ29tcGlsZXIgb3V0cHV0IHByb2R1Y2VkIGJ5IGNvbmZpZ3VyZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSMgY29uZmlndXJlLCBpcyBpbiAuL2NvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgotCi1hY19jc191c2FnZT0iVXNhZ2U6ICRDT05GSUdfU1RBVFVTIFstLXJlY2hlY2tdIFstLXZlcnNpb25dIFstLWhlbHBdIgotZm9yIGFjX29wdGlvbgotZG8KLSAgY2FzZSAiXCRhY19vcHRpb24iIGluCi0gIC1yZWNoZWNrIHwgLS1yZWNoZWNrIHwgLS1yZWNoZWMgfCAtLXJlY2hlIHwgLS1yZWNoIHwgLS1yZWMgfCAtLXJlIHwgLS1yKQotICAgIGVjaG8gInJ1bm5pbmcgXCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICQwICRhY19jb25maWd1cmVfYXJncyAtLW5vLWNyZWF0ZSAtLW5vLXJlY3Vyc2lvbiIKLSAgICBleGVjIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24gOzsKLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtLXZlciB8IC0tdmUgfCAtLXYpCi0gICAgZWNobyAiJENPTkZJR19TVEFUVVMgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtLWgpCi0gICAgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMCA7OwotICAqKSBlY2hvICJcJGFjX2NzX3VzYWdlIjsgZXhpdCAxIDs7Ci0gIGVzYWMKLWRvbmUKLQotYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKLWFjX2dpdmVuX0lOU1RBTEw9IiRJTlNUQUxMIgotCi10cmFwICdybSAtZnIgYGVjaG8gIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4gY29uZmlnLmg6Y29uZmlnLmluIiB8IHNlZCAicy86W14gXSovL2ciYCBjb25mdGVzdCo7IGV4aXQgMScgMSAyIDE1Ci1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotc2VkICdzLyVAL0BALzsgcy9AJS9AQC87IHMvJWdcJC9AZy87IC9AZ1wkL3MvW1xcXFwmJV0vXFxcXCYvZzsKLSBzL0BALyVALzsgcy9AQC9AJS87IHMvQGdcJC8lZy8nID4gY29uZnRlc3Quc3VicyA8PFxcQ0VPRgotJGFjX3Zwc3ViCi0kZXh0cmFzdWIKLXMlQFNIRUxMQCUkU0hFTEwlZwotcyVAQ0ZMQUdTQCUkQ0ZMQUdTJWcKLXMlQENQUEZMQUdTQCUkQ1BQRkxBR1MlZwotcyVAQ1hYRkxBR1NAJSRDWFhGTEFHUyVnCi1zJUBGRkxBR1NAJSRGRkxBR1MlZwotcyVAREVGU0AlJERFRlMlZwotcyVATERGTEFHU0AlJExERkxBR1MlZwotcyVATElCU0AlJExJQlMlZwotcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCi1zJUBwcmVmaXhAJSRwcmVmaXglZwotcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZwotcyVAYmluZGlyQCUkYmluZGlyJWcKLXMlQHNiaW5kaXJAJSRzYmluZGlyJWcKLXMlQGxpYmV4ZWNkaXJAJSRsaWJleGVjZGlyJWcKLXMlQGRhdGFkaXJAJSRkYXRhZGlyJWcKLXMlQHN5c2NvbmZkaXJAJSRzeXNjb25mZGlyJWcKLXMlQHNoYXJlZHN0YXRlZGlyQCUkc2hhcmVkc3RhdGVkaXIlZwotcyVAbG9jYWxzdGF0ZWRpckAlJGxvY2Fsc3RhdGVkaXIlZwotcyVAbGliZGlyQCUkbGliZGlyJWcKLXMlQGluY2x1ZGVkaXJAJSRpbmNsdWRlZGlyJWcKLXMlQG9sZGluY2x1ZGVkaXJAJSRvbGRpbmNsdWRlZGlyJWcKLXMlQGluZm9kaXJAJSRpbmZvZGlyJWcKLXMlQG1hbmRpckAlJG1hbmRpciVnCi1zJUBob3N0QCUkaG9zdCVnCi1zJUBob3N0X2FsaWFzQCUkaG9zdF9hbGlhcyVnCi1zJUBob3N0X2NwdUAlJGhvc3RfY3B1JWcKLXMlQGhvc3RfdmVuZG9yQCUkaG9zdF92ZW5kb3IlZwotcyVAaG9zdF9vc0AlJGhvc3Rfb3MlZwotcyVAdGFyZ2V0QCUkdGFyZ2V0JWcKLXMlQHRhcmdldF9hbGlhc0AlJHRhcmdldF9hbGlhcyVnCi1zJUB0YXJnZXRfY3B1QCUkdGFyZ2V0X2NwdSVnCi1zJUB0YXJnZXRfdmVuZG9yQCUkdGFyZ2V0X3ZlbmRvciVnCi1zJUB0YXJnZXRfb3NAJSR0YXJnZXRfb3MlZwotcyVAYnVpbGRAJSRidWlsZCVnCi1zJUBidWlsZF9hbGlhc0AlJGJ1aWxkX2FsaWFzJWcKLXMlQGJ1aWxkX2NwdUAlJGJ1aWxkX2NwdSVnCi1zJUBidWlsZF92ZW5kb3JAJSRidWlsZF92ZW5kb3IlZwotcyVAYnVpbGRfb3NAJSRidWlsZF9vcyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBSQU5MSUJAJSRSQU5MSUIlZwotcyVAQ0NAJSRDQyVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQEVYRUVYVEAlJEVYRUVYVCVnCi1zJUBZQUNDQCUkWUFDQyVnCi1zJUBMRVhAJSRMRVglZwotcyVATEVYTElCQCUkTEVYTElCJWcKLXMlQExFWF9PVVRQVVRfUk9PVEAlJExFWF9PVVRQVVRfUk9PVCVnCi1zJUBNQUlOVEFJTkVSX01PREVfVFJVRUAlJE1BSU5UQUlORVJfTU9ERV9UUlVFJWcKLXMlQE1BSU5UQUlORVJfTU9ERV9GQUxTRUAlJE1BSU5UQUlORVJfTU9ERV9GQUxTRSVnCi1zJUBNQUlOVEAlJE1BSU5UJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVASE9TVElOR19DUlQwQCUkSE9TVElOR19DUlQwJWcKLXMlQEhPU1RJTkdfTElCU0AlJEhPU1RJTkdfTElCUyVnCi1zJUBOQVRJVkVfTElCX0RJUlNAJSROQVRJVkVfTElCX0RJUlMlZwotcyVARU1VTEAlJEVNVUwlZwotL0BURElSU0AvciAkVERJUlMKLXMlQFRESVJTQCUlZwotcyVARU1VTEFUSU9OX09GSUxFU0AlJEVNVUxBVElPTl9PRklMRVMlZwotcyVARU1VTF9FWFRSQV9PRklMRVNAJSRFTVVMX0VYVFJBX09GSUxFUyVnCi1zJUBFTVVMQVRJT05fTElCUEFUSEAlJEVNVUxBVElPTl9MSUJQQVRIJWcKLXMlQFRFU1RCRkRMSUJAJSRURVNUQkZETElCJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlLmJhdCBiL2xkL2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NDNiZGIuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLUBlY2hvIG9mZg0KLWVjaG8gQ29uZmlndXJpbmcgbGQgZm9yIGdvMzINCi1lY2hvIFRoaXMgbWFrZWZpbGUgd2lsbCBiZSBidWlsdCBmb3IgR05VSVNIIG1ha2UNCi1yZW0gVGhpcyBiYXRjaCBmaWxlIGFzc3VtZXMgYSB1bml4LXR5cGUgInNlZCIgcHJvZ3JhbQ0KLQ0KLXVwZGF0ZSAuLlxiZmRcaG9zdHNcZ28zMi5oIHN5c2RlcC5oDQotDQotZWNobyAjIE1ha2VmaWxlIGdlbmVyYXRlZCBieSAiY29uZmlndXJlLmJhdCI+IE1ha2VmaWxlDQotZWNobyBMT05HQVJHUyA9IGdjYzphciA+PiBNYWtlZmlsZQ0KLWVjaG8gQ0M9Z2NjID4+IE1ha2VmaWxlDQotZWNobyBob3N0X2FsaWFzPWdvMzIgPj4gTWFrZWZpbGUNCi1lY2hvIHRhcmdldF9hbGlhcz1nbzMyID4+IE1ha2VmaWxlDQotDQotdXBkYXRlIC4uL2JmZC9ob3N0cy9nbzMyLmggc3lzZGVwLmgNCi0NCi1pZiBleGlzdCBjb25maWcuc2VkIGRlbCBjb25maWcuc2VkDQotDQotZWNobyAicy9eCVwkKHNyY2RpcilcL21vdmUtaWYtY2hhbmdlLwl1cGRhdGUvCSI+PiBjb25maWcuc2VkDQotZWNobyAicy86XChbXiAJXVwpLzogXDEvZwkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvXglcICpcLlwvLwlnbzMyIC8JCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvYGVjaG8gXCQoc3JjZGlyKVwvLy9nCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy8gfCBzZWQgJ3MsXF5cXFwuXC8sLCdgLy9nCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL14JY2QgXCQoc3JjZGlyKVsgCV0qOy8vCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICIvXiMjIyMkLyBpXAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJDQyA9IGdjY1wJCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIkVNVUw9Z28zMlwJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiRU1VTEFUSU9OX09GSUxFUz1lZ28zMi5vIGVpMzg2YW91dC5vCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9eU0hFTEwgKj0vIGQJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy8kKFNIRUxMKS9zaC5leGUvZwkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvJyIvXFwiL2cJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy8iJy9cXCIvZwkJCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICIvXmxkbWFpbi5vOiBsZG1haW4uYy8sL2ZpLyB7CQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgIHMvOyAqXFwkLy8JCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAiICBzLy1EU0NSSVBURElSW14gCV0qLy1EU0NSSVBURElSPVxcIi5cXCIvCSI+PiBjb25maWcuc2VkDQotZWNobyAiICBzL2NvbmZpZy5zdGF0dXMvLwkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIiAgL2xkbWFpbi5vOi8gcAkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICIgIC8oQ0MpLyBwCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gIiAgZAkJCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAifQkJCQkJCQkiPj4gY29uZmlnLnNlZA0KLQ0KLWVjaG8gInMvXlNIRUxMLiokL1NIRUxMPXNoLmV4ZS8JCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL2dlbnNjcmlwdHMuc2gvZ2Vuc2NyaXB0cy5kb3MvZwkJCSI+PiBjb25maWcuc2VkDQotDQotZWNobyAicy9ebGRlbXVsLWxpc3QuaC9ub3QtbGRlbXVsLWxpc3QuaC8JCSI+PiBjb25maWcuc2VkDQotDQotc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KLXNlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZQ0KLWRlbCBjb25maWcuc2VkDQotZGVsIGNvbmZpZzIuc2VkDQotDQotZWNobyBzZXQgLWEgPiBnZW5zY3JpcHRzLmRqDQotc2VkIC1lICIvXlthLXpBLVowLTlfXSo9LyBzL14vZXhwb3J0IC8iIC1lICJzLyguIFwoLipcKSkvc2ggXDEvIiAtZSAiL1wuZW0vIGQiIGdlbnNjcmlwdHMuc2ggPj4gZ2Vuc2NyaXB0cy5kag0KLXR5cGUgZW11bHRlbXBsXGdlbmVyaWMuZW0gPj4gZ2Vuc2NyaXB0cy5kag0KLXVwZGF0ZSBnZW5zY3JpcHRzLmRqIGdlbnNjcmlwdHMuZG9zDQotDQotZWNobyBleHRlcm4gbGRfZW11bGF0aW9uX3hmZXJfdHlwZSBsZF9nbzMyX2VtdWxhdGlvbjsgPiBsZGVtdWwtbGlzdC5oMg0KLWVjaG8gZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfaTM4NmFvdXRfZW11bGF0aW9uOyA+PiBsZGVtdWwtbGlzdC5oMg0KLWVjaG8gI2RlZmluZSBFTVVMQVRJT05fTElTVCBcPj5sZGVtdWwtbGlzdC5oMg0KLWVjaG8gICAmbGRfZ28zMl9lbXVsYXRpb24sXD4+bGRlbXVsLWxpc3QuaDINCi1lY2hvICAgJmxkX2kzODZhb3V0X2VtdWxhdGlvbixcPj5sZGVtdWwtbGlzdC5oMg0KLWVjaG8gMD4+bGRlbXVsLWxpc3QuaDINCi0NCi11cGRhdGUgbGRlbXVsLWxpc3QuaDIgbGRlbXVsLWxpc3QuaA0KLQ0KLWlmIGV4aXN0IGxkc2NyaXB0c1xkb3N0ZXN0IGdvdG8gbGRzY3JpcHRzDQotbWtkaXIgbGRzY3JpcHRzDQotZGlyID4gbGRzY3JpcHRzXGRvc3Rlc3QNCi06bGRzY3JpcHRzDQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlLmhvc3QgYi9sZC9jb25maWd1cmUuaG9zdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlYjMxMS4uMDAwMDAwMAotLS0gYS9sZC9jb25maWd1cmUuaG9zdAorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0jIFRoaXMgaXMgdGhlIGxpbmtlciBob3N0IHNwZWNpZmljIGZpbGUuICBUaGlzIGlzIGludm9rZWQgYnkgdGhlCi0jIGF1dG9jb25mIGdlbmVyYXRlZCBjb25maWd1cmUgc2NyaXB0LiAgUHV0dGluZyBpdCBpbiBhIHNlcGFyYXRlIHNoZWxsCi0jIGZpbGUgbGV0cyB1cyBza2lwIHJ1bm5pbmcgYXV0b2NvbmYgd2hlbiBtb2RpZnlpbmcgaG9zdCBzcGVjaWZpYwotIyBpbmZvcm1hdGlvbi4KLQotIyBUaGlzIGZpbGUgc2V0cyB0aGUgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKLSMgIEhERUZJTkVTCQlob3N0IHNwZWNpZmljIGNvbXBpbGVyIGZsYWdzCi0jICBIT1NUSU5HX0NSVDAJCWNydDAubyBmaWxlIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKLSMgIEhPU1RJTkdfTElCUwkJbGlicmFyaWVzIHVzZWQgZm9yIGJvb3RzdHJhcHBpbmcKLSMgIE5BVElWRV9MSUJfRElSUwlsaWJyYXJ5IGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBvbiB0aGlzIGhvc3QKLQotSERFRklORVM9Ci1IT1NUSU5HX0NSVDA9L2xpYi9jcnQwLm8KLUhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMnCi1OQVRJVkVfTElCX0RJUlM9Ci0KLWNhc2UgIiR7aG9zdH0iIGluCi0KLWFscGhhKi0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIGBlZ3JlcCAibGRbXiBdKlwuc28iIFxgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPXNwZWNzXGAgfCBzZWQgLWUgInMsLiotZHluYW1pYy1saW5rZXJbIAldWyAJXSpcKC4qL2xkW14gXSouc28uLlwpLiosXDEsImAgYGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnQxLm9gIGBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0aS5vYCBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1MYGRpcm5hbWUgXGBnY2MgLS1wcmludC1maWxlLW5hbWU9bGliYy5zb1xgYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCBgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydG4ub2AnCi0gIDs7Ci0KLWFscGhhKi0qLW5ldGJzZCopCi0gICMgVGhlIG5ldyBCU0QgYG1ha2UnIGhhcyBhIGJ1ZzogaXQgZG9lc24ndCBwYXNzIGVtcHR5IGFyZ3VtZW50cyBpbgotICAjIHNoZWxsIGNvbW1hbmRzLiAgU28gd2UgbmVlZCB0byBtYWtlIHRoaXMgdmFsdWUgbm9uLWVtcHR5IGluIG9yZGVyCi0gICMgZm9yIHRoZSBnZW5zY3JpcHRzLnNoIGNhbGwgdG8gd29yay4gIFRoZXJlJ3Mgbm90aGluZyBtYWdpYyBhYm91dAotICAjIHRoZSB2YWx1ZSBgL2xpYic7IGl0J3MganVzdCBhIGR1bW15LgotICBOQVRJVkVfTElCX0RJUlM9L2xpYgotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLWFscGhhKi0qLSopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2Njcy9saWIvY3J0MC5vCi0gIE5BVElWRV9MSUJfRElSUz0vdXNyL2Njcy9saWIKLSAgOzsKLQotaVszNDU2XTg2LSotYnNkKiB8IGlbMzQ1Nl04Ni0qLWZyZWVic2QqIHwgaVszNDU2XTg2LSotbmV0YnNkKikKLSAgIyBUaGUgbmV3IEJTRCBgbWFrZScgaGFzIGEgYnVnOiBpdCBkb2Vzbid0IHBhc3MgZW1wdHkgYXJndW1lbnRzIGluCi0gICMgc2hlbGwgY29tbWFuZHMuICBTbyB3ZSBuZWVkIHRvIG1ha2UgdGhpcyB2YWx1ZSBub24tZW1wdHkgaW4gb3JkZXIKLSAgIyBmb3IgdGhlIGdlbnNjcmlwdHMuc2ggY2FsbCB0byB3b3JrLiAgVGhlcmUncyBub3RoaW5nIG1hZ2ljIGFib3V0Ci0gICMgdGhlIHZhbHVlIGAvbGliJzsgaXQncyBqdXN0IGEgZHVtbXkuCi0gIE5BVElWRV9MSUJfRElSUz0vbGliCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotaVszNDU2XTg2LSotc3lzdjQqKQotICBIT1NUSU5HX0NSVDA9Jy91c3IvY2NzL2xpYi9jcnQxLm8gL3Vzci9jY3MvbGliL2NydGkubyAvdXNyL2Njcy9saWIvdmFsdWVzLVhhLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvY2NzL2xpYi9jcnRuLm8nCi0gIE5BVElWRV9MSUJfRElSUz0vdXNyL2Njcy9saWIKLSAgOzsKLQotaVszNDU2XTg2LXNlcXVlbnQtcHR4KiB8IGlbMzQ1Nl04Ni1zZXF1ZW50LXN5c3YqKQotICBIT1NUSU5HX0NSVDA9Jy9saWIvY3J0MC5vIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCcKLSAgOzsKLQotaVszNDU2XTg2LSotc3lzdiopCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQxLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2NydGVuZC5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0ZW5kLm87IGZpYCAvbGliL2NydG4ubycKLSAgOzsKLQotaVszNDU2XTg2LSotc29sYXJpcyopCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDEubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDEubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnQxLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0aS5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0aS5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGkubzsgZmlgIC91c3IvY2NzL2xpYi92YWx1ZXMtWGEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydG4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydG4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRuLm87IGZpYCcKLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1pWzM0NTZdODYtKi1zY28qIHwgaVszNDU2XTg2LSotaXNjKikKLSAgIyBJbiBzb21lIGNvbmZpZ3VyYXRpb25zIGdjYyBkb2VzIG5vdCB1c2UgY3J0YmVnaW4ubyBhbmQgY3J0ZW5kLm8uCi0gICMgSW4gdGhhdCBjYXNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm8gd2lsbCBzaW1wbHkgcHJpbnQKLSAgIyBjcnRiZWdpbi5vLiAgV2UgY3JlYXRlIGR1bW15IGNydGJlZ2luLm8gYW5kIGNydGVuZC5vIGZpbGVzIHRvCi0gICMgaGFuZGxlIHRoaXMuCi0gIGVjaG8gImludCBkdW1teV9jcnRiZWdpbiAoKSB7IHJldHVybiAwOyB9IiA+IGNydGJlZ2luLmMKLSAgJHtDQ30gLWMgY3J0YmVnaW4uYyAtbyBjcnRiZWdpbi5vCi0gIHJtIC1mIGNydGJlZ2luLmMKLSAgZWNobyAiaW50IGR1bW15X2NydGVuZyAoKSB7IHJldHVybiAwOyB9IiA+IGNydGVuZC5jCi0gICR7Q0N9IC1jIGNydGVuZC5jIC1vIGNydGVuZC5vCi0gIHJtIC1mIGNydGVuZC5jCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQxLm8gYGlmIFsgLWYgLi4vZ2NjL2NydGJlZ2luLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC9saWIvY3J0bi5vJwotICA7OwotCi1pWzM0NTZdODYtKi1saW51eCphb3V0KiB8IGlbMzQ1Nl04Ni0qLWxpbnV4b2xkbGQpCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQwLm8KLSAgOzsKLQotaVszNDU2XTg2LSotbGludXgqbGliYzEqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGVuZC5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLWlbMzQ1Nl04Ni0qLWxpbnV4LWdudSopCi0gIEhPU1RJTkdfQ1JUMD0nLWR5bmFtaWMtbGlua2VyIGBmZ3JlcCBsZC1saW51eC5zbyBcYGdjYyAtLXByaW50LWZpbGUtbmFtZT1zcGVjc1xgIHwgc2VkIC1lICJzLC4qLWR5bmFtaWMtbGlua2VyWyAJXVsgCV0qXCguKi9sZC1saW51eC5zby4uXCkuKixcMSwiYCBgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydDEub2AgYGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRpLm9gIGBpZiBbIC1mIC4uL2djYy9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0YmVnaW4ubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLUxgZGlybmFtZSBcYGdjYyAtLXByaW50LWZpbGUtbmFtZT1saWJjLnNvXGBgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIGBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0bi5vYCcKLSAgOzsKLQotaVszNDU2XTg2LSotbHlueG9zKikKLSAgSE9TVElOR19DUlQwPS9saWIvaW5pdDEubwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIC1sbSAvbGliL2luaXRuLm8nCi0gIDs7Ci0KLW1pcHMqLWRlYy1ic2QqKQotICBIT1NUSU5HX0NSVDA9L3Vzci9saWIvY3J0MC5vCi0gIDs7Ci0KLW1pcHMqLXNnaS1pcml4NCopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQxLm8KLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW1pcHMqLXNnaS1pcml4WzU2XSopCi0gIEhPU1RJTkdfQ1JUMD0vdXNyL2xpYi9jcnQxLm8KLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW02OCotKi1saW51eCphb3V0KikKLSAgSE9TVElOR19DUlQwPS91c3IvbGliL2NydDAubwotICA7OwotCi1tNjgqLSotbGludXgqbGliYzEqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLWxpbnV4LnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsaWYgWyAtZiAvdXNyL2xpYi9jcnRiZWdpbi5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRiZWdpbi5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRiZWdpbi5vOyBmaWAnCi0gIEhPU1RJTkdfTElCUz0nYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCAtbGMgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0ZW5kLm8gXTsgdGhlbiBlY2hvIC4uL2djYy9jcnRlbmQubzsgZWxpZiBbIC1mIC91c3IvbGliL2NydGVuZC5vIF07IHRoZW4gZWNobyAvdXNyL2xpYi9jcnRlbmQubzsgZWxzZSBnY2MgLS1wcmludC1maWxlLW5hbWU9Y3J0ZW5kLm87IGZpYCAvdXNyL2xpYi9jcnRuLm8nCi0gIDs7Ci0KLW02OCotKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotbTY4Ki0qLWx5bnhvcyopCi0gIEhPU1RJTkdfQ1JUMD0vbGliL2luaXQxLm8KLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyAtbG0gL2xpYi9pbml0bi5vJwotICA7OwotCi1tNjgqLW1vdG9yb2xhLXN5c3YpCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDAubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDAubzsgZWxpZiBbIC1mIFxgZ2NjIC1wcmludC1maWxlLW5hbWU9XGBjcnQwLm8gXTsgdGhlbiBlY2hvIFxgZ2NjIC1wcmludC1maWxlLW5hbWU9XGBjcnQwLm87IGVsc2UgZWNobyAvbGliL2NydDAubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjODgxIGBpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAnCi0gIDs7Ci0KLW02OCotc3VuLSopCi0gIEhPU1RJTkdfQ1JUMD0nL3Vzci9saWIvY3J0MC5vIC91c3IvbGliL0ZjcnQxLm8gLUwvdXNyL2xpYi9mc29mdC5vJwotICA7OwotCi1tODgqLSotZGd1eCopCi0gIEhERUZJTkVTPS1EX191c2luZ19ER1VYCi0gIEhPU1RJTkdfQ1JUMD0nL2xpYi9jcnQwLm8gLVgnCi0gIEhPU1RJTkdfTElCUz0vdXNyL3NkZS9tODhrYmNzL2xpYi9saWJjLmEKLSAgOzsKLQotbTg4Ki1tb3Rvcm9sYS1zeXN2MykKLSAgSE9TVElOR19DUlQwPScvbGliL2NydDAubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2xpYmdjYy5hIF0gOyB0aGVuIGVjaG8gLi4vZ2NjL2xpYmdjYy5hIDsgZWxzZSBnY2MgLXByaW50LWxpYmdjYy1maWxlLW5hbWU7IGZpYCcKLSAgOzsKLQotcG93ZXJwYyotKi1saW51eC1nbnUqKQotICBIT1NUSU5HX0NSVDA9Jy1keW5hbWljLWxpbmtlciAvbGliL2xkLnNvLjEgL3Vzci9saWIvY3J0MS5vIC91c3IvbGliL2NydGkubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC0tcHJpbnQtZmlsZS1uYW1lPWNydGJlZ2luLm87IGZpYCcKLSAgSE9TVElOR19MSUJTPSdgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIC1sYyBgaWYgWyAtZiAuLi9nY2MvbGliZ2NjLmEgXSA7IHRoZW4gZWNobyAuLi9nY2MvbGliZ2NjLmEgOyBlbHNlIGdjYyAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZTsgZmlgIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtLXByaW50LWZpbGUtbmFtZT1jcnRlbmQubzsgZmlgIC91c3IvbGliL2NydG4ubycKLSAgOzsKLQotcm9tcC0qLSopCi0gIEhERUZJTkVTPS1ETk9fVkFSQVJHUwotICA7OwotCi1zcGFyYyotKi1zb2xhcmlzMiopCi0gIEhPU1RJTkdfQ1JUMD0nYGlmIFsgLWYgLi4vZ2NjL2NydDEubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydDEubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnQxLm87IGZpYCBgaWYgWyAtZiAuLi9nY2MvY3J0aS5vIF07IHRoZW4gZWNobyAuLi9nY2MvY3J0aS5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGkubzsgZmlgIC91c3IvY2NzL2xpYi92YWx1ZXMtWGEubyBgaWYgWyAtZiAuLi9nY2MvY3J0YmVnaW4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGJlZ2luLm87IGVsc2UgZ2NjIC1wcmludC1maWxlLW5hbWU9Y3J0YmVnaW4ubzsgZmlgJwotICBIT1NUSU5HX0xJQlM9J2BpZiBbIC1mIC4uL2djYy9saWJnY2MuYSBdIDsgdGhlbiBlY2hvIC4uL2djYy9saWJnY2MuYSA7IGVsc2UgZ2NjIC1wcmludC1saWJnY2MtZmlsZS1uYW1lOyBmaWAgLWxjIGBpZiBbIC1mIC4uL2djYy9jcnRlbmQubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydGVuZC5vOyBlbHNlIGdjYyAtcHJpbnQtZmlsZS1uYW1lPWNydGVuZC5vOyBmaWAgYGlmIFsgLWYgLi4vZ2NjL2NydG4ubyBdOyB0aGVuIGVjaG8gLi4vZ2NjL2NydG4ubzsgZWxzZSBnY2MgLXByaW50LWZpbGUtbmFtZT1jcnRuLm87IGZpYCcKLSAgTkFUSVZFX0xJQl9ESVJTPS91c3IvY2NzL2xpYgotICA7OwotCi1lc2FjCmRpZmYgLS1naXQgYS9sZC9jb25maWd1cmUuaW4gYi9sZC9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODdiOWUuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlndXJlLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLWRubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0Ci1kbmwKLUFDX1BSRVJFRygyLjEzKQotQUNfSU5JVChsZG1haW4uYykKLQotQUNfQ0FOT05JQ0FMX1NZU1RFTQotCi1BTV9JTklUX0FVVE9NQUtFKGxkLCAyLjkuNCkKLQotQU1fUFJPR19MSUJUT09MCi0KLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9uc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoNjQtYml0LWJmZCwKLVsgIC0tZW5hYmxlLTY0LWJpdC1iZmQgICAgIDY0LWJpdCBzdXBwb3J0IChvbiBob3N0cyB3aXRoIG5hcnJvd2VyIHdvcmQgc2l6ZXMpXSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgIHdhbnQ2ND10cnVlICA7OwotICBubykgICB3YW50NjQ9ZmFsc2UgOzsKLSAgKikgICAgQUNfTVNHX0VSUk9SKGJhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIDY0LWJpdC1iZmQgb3B0aW9uKSA7OwotZXNhY10sW3dhbnQ2ND1mYWxzZV0pZG5sCi0KLUFNX0NPTkZJR19IRUFERVIoY29uZmlnLmg6Y29uZmlnLmluKQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIHRhcmdldCBzeXN0ZW0gdHlwZTsgcGxlYXNlIGNoZWNrIGNvbmZpZy5zdWIuKQotZmkKLWlmIHRlc3QgLXogIiRob3N0IiA7IHRoZW4KLSAgICBBQ19NU0dfRVJST1IoVW5yZWNvZ25pemVkIGhvc3Qgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLikKLWZpCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotQUNfUFJPR19DQwotQUNfUFJPR19JTlNUQUxMCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotQUNfRVhFRVhUCi0KLUFDX1BST0dfWUFDQwotQU1fUFJPR19MRVgKLQotQU1fTUFJTlRBSU5FUl9NT0RFCi0KLS4gJHtzcmNkaXJ9L2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQUNfU1VCU1QoSE9TVElOR19DUlQwKQotQUNfU1VCU1QoSE9TVElOR19MSUJTKQotQUNfU1VCU1QoTkFUSVZFX0xJQl9ESVJTKQotCi1BQ19DSEVDS19IRUFERVJTKHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaCB1bmlzdGQuaCkKLUFDX0NIRUNLX0ZVTkNTKHNicmspCi1BQ19IRUFERVJfRElSRU5UCi0KLUJGRF9CSU5BUllfRk9QRU4KLQotQkZEX05FRURfREVDTEFSQVRJT04oc3Ryc3RyKQotQkZEX05FRURfREVDTEFSQVRJT04oZnJlZSkKLUJGRF9ORUVEX0RFQ0xBUkFUSU9OKHNicmspCi1CRkRfTkVFRF9ERUNMQVJBVElPTihnZXRlbnYpCi1CRkRfTkVFRF9ERUNMQVJBVElPTihlbnZpcm9uKQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotYWxsX3RhcmdldHM9Ci1FTVVMPQotYWxsX2VtdWxzPQotYWxsX2VtdWxfZXh0cmFzPQotYWxsX2xpYnBhdGg9Ci0KLWRubCBXZSBuZWVkIHRvIGdldCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRkaXIgZGVmaW5pdGlvbnMgaW50bwotZG5sIE1ha2VmaWxlLiAgV2UgY2FuJ3QgZG8gaXQgdXNpbmcgQUNfU1VCU1QsIGJlY2F1c2UgYXV0b2NvbmYgZG9lcwotZG5sIG5vdCBwZXJtaXQgbGl0ZXJhbCBuZXdsaW5lcyBpbiBhbiBBQ19TVUJTVCB2YXJpYWJsZXMuICBTbyB3ZSB1c2UgYQotZG5sIGZpbGUuCi1ybSAtZiB0ZGlycwotCi1mb3IgdGFyZ19hbGlhcyBpbiBgZWNobyAkdGFyZ2V0X2FsaWFzICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi1kbwotICBpZiB0ZXN0ICIkdGFyZ19hbGlhcyIgPSAiYWxsIjsgdGhlbgotICAgIGFsbF90YXJnZXRzPXRydWUKLSAgZWxzZQotICAgICMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotICAgIHJlc3VsdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJHRhcmdfYWxpYXMgMj4vZGV2L251bGxgCi0gICAgaWYgdGVzdCAtbiAiJHJlc3VsdCI7IHRoZW4KLQl0YXJnPSRyZXN1bHQKLSAgICBlbHNlCi0JdGFyZz0kdGFyZ19hbGlhcwotICAgIGZpCi0KLSAgICAuICR7c3JjZGlyfS9jb25maWd1cmUudGd0Ci0KLSAgICBpZiB0ZXN0ICIkdGFyZyIgPSAiJHRhcmdldCI7IHRoZW4KLSAgICAgIEVNVUw9JHRhcmdfZW11bAotICAgIGZpCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2VtdWxzICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfZW11bHMgIiBpbgotCSoiIGUke2l9Lm8gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVscz0iJGFsbF9lbXVscyBlJHtpfS5vIgotCSAgZXZhbCByZXN1bHQ9XCR0ZGlyXyRpCi0JICB0ZXN0IC16ICIkcmVzdWx0IiAmJiByZXN1bHQ9JHRhcmdfYWxpYXMKLQkgIGVjaG8gdGRpcl8kaT0kcmVzdWx0ID4+IHRkaXJzCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19lbXVsICR0YXJnX2V4dHJhX2xpYnBhdGg7IGRvCi0JY2FzZSAiICRhbGxfbGlicGF0aCAiIGluCi0JKiIgJHtpfSAiKikgOzsKLQkqKQotCSAgaWYgdGVzdCAteiAiJGFsbF9saWJwYXRoIjsgdGhlbgotCSAgICBhbGxfbGlicGF0aD0ke2l9Ci0JICBlbHNlCi0JICAgIGFsbF9saWJwYXRoPSIkYWxsX2xpYnBhdGggJHtpfSIKLQkgIGZpCi0JICA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBmb3IgaSBpbiAkdGFyZ19leHRyYV9vZmlsZXM7IGRvCi0JY2FzZSAiICRhbGxfZW11bF9leHRyYXMgIiBpbgotCSoiICR7aX0gIiopIDs7Ci0JKikKLQkgIGFsbF9lbXVsX2V4dHJhcz0iJGFsbF9lbXVsX2V4dHJhcyAke2l9IgotCSAgOzsKLQllc2FjCi0gICAgZG9uZQotICBmaQotZG9uZQotCi1BQ19TVUJTVChFTVVMKQotCi1URElSUz10ZGlycwotQUNfU1VCU1RfRklMRShURElSUykKLQotZG5sIEZJWE1FOiBXZSB3aWxsIGJ1aWxkIGEgNjQgYml0IEJGRCBmb3IgYSA2NCBiaXQgaG9zdCBvciBhIDY0IGJpdAotZG5sIHRhcmdldCwgYW5kIGluIHRob3NlIGNhc2VzIHdlIHNob3VsZCBhbHNvIGJ1aWxkIHRoZSA2NCBiaXQKLWRubCBlbXVsYXRpb25zLgotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4dHJ1ZTsgdGhlbgotICBpZiB0ZXN0IHgke3dhbnQ2NH0gPSB4dHJ1ZTsgdGhlbgotICAgIEVNVUxBVElPTl9PRklMRVM9JyQoQUxMX0VNVUxBVElPTlMpICQoQUxMXzY0X0VNVUxBVElPTlMpJwotICBlbHNlCi0gICAgRU1VTEFUSU9OX09GSUxFUz0nJChBTExfRU1VTEFUSU9OUyknCi0gIGZpCi0gIEVNVUxfRVhUUkFfT0ZJTEVTPSckKEFMTF9FTVVMX0VYVFJBX09GSUxFUyknCi1lbHNlCi0gIEVNVUxBVElPTl9PRklMRVM9JGFsbF9lbXVscwotICBFTVVMX0VYVFJBX09GSUxFUz0kYWxsX2VtdWxfZXh0cmFzCi1maQotQUNfU1VCU1QoRU1VTEFUSU9OX09GSUxFUykKLUFDX1NVQlNUKEVNVUxfRVhUUkFfT0ZJTEVTKQotCi1FTVVMQVRJT05fTElCUEFUSD0kYWxsX2xpYnBhdGgKLUFDX1NVQlNUKEVNVUxBVElPTl9MSUJQQVRIKQotCi1pZiB0ZXN0IHgke2VuYWJsZV9zdGF0aWN9ID0geG5vOyB0aGVuCi0gIFRFU1RCRkRMSUI9Ii0tcnBhdGggLi4vYmZkLy5saWJzIC4uL2JmZC8ubGlicy9saWJiZmQuc28iCi1lbHNlCi0gIFRFU1RCRkRMSUI9Ii4uL2JmZC8ubGlicy9saWJiZmQuYSIKLWZpCi1BQ19TVUJTVChURVNUQkZETElCKQotCi1BQ19PVVRQVVQoTWFrZWZpbGUgcG8vTWFrZWZpbGUuaW46cG8vTWFrZS1pbiwKLVtzZWQgLWUgJy9QT1RGSUxFUyA9L3IgcG8vUE9URklMRVMnIHBvL01ha2VmaWxlLmluID4gcG8vTWFrZWZpbGVdKQpkaWZmIC0tZ2l0IGEvbGQvY29uZmlndXJlLnRndCBiL2xkL2NvbmZpZ3VyZS50Z3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDEyZjQuLjAwMDAwMDAKLS0tIGEvbGQvY29uZmlndXJlLnRndAorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0jIFRoaXMgaXMgdGhlIGxpbmtlciB0YXJnZXQgc3BlY2lmaWMgZmlsZS4gIFRoaXMgaXMgaW52b2tlZCBieSB0aGUKLSMgYXV0b2NvbmYgZ2VuZXJhdGVkIGNvbmZpZ3VyZSBzY3JpcHQuICBQdXR0aW5nIGl0IGluIGEgc2VwYXJhdGUgc2hlbGwKLSMgZmlsZSBsZXRzIHVzIHNraXAgcnVubmluZyBhdXRvY29uZiB3aGVuIG1vZGlmeWluZyB0YXJnZXQgc3BlY2lmaWMKLSMgaW5mb3JtYXRpb24uCi0KLSMgVGhpcyBmaWxlIHN3aXRjaGVzIG9uIHRoZSBzaGVsbCB2YXJpYWJsZSAke3Rhcmd9LCBhbmQgc2V0cyB0aGUKLSMgZm9sbG93aW5nIHNoZWxsIHZhcmlhYmxlczoKLSMgIHRhcmdfZW11bAkJbmFtZSBvZiBsaW5rZXIgZW11bGF0aW9uIHRvIHVzZQotIyAgdGFyZ19leHRyYV9lbXVscwlhZGRpdGlvbmFsIGxpbmtlciBlbXVsYXRpb25zIHRvIHByb3ZpZGUKLSMgIHRhcmdfZXh0cmFfbGlicGF0aAlhZGRpdGlvbmFsIGxpbmtlciBlbXVsYXRpb25zIHVzaW5nIExJQl9QQVRICi0jICB0YXJnX2V4dHJhX29maWxlcwlhZGRpdGlvbmFsIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBlbXVsYXRpb24KLQotdGFyZ19leHRyYV9lbXVscz0KLXRhcmdfZXh0cmFfb2ZpbGVzPQotCi1jYXNlICIke3Rhcmd9IiBpbgotYXJtLWVwb2MtcGUpCQl0YXJnX2VtdWw9YXJtX2Vwb2NfcGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1hcm0tKi1wZSkJCXRhcmdfZW11bD1hcm1wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWFyYy0qLWVsZiopCQl0YXJnX2VtdWw9YXJjZWxmIDs7Ci1kMTB2LSotKikJCXRhcmdfZW11bD1kMTB2ZWxmIDs7Ci1kMzB2LSotKmV4dCopCQl0YXJnX2VtdWw9ZDMwdl9lOyB0YXJnX2V4dHJhX2VtdWxzPSJkMzB2ZWxmIGQzMHZfbyIgOzsKLWQzMHYtKi0qb25jaGlwKikJdGFyZ19lbXVsPWQzMHZfbzsgdGFyZ19leHRyYV9lbXVscz0iZDMwdmVsZiBkMzB2X2UiIDs7Ci1kMzB2LSotKikJCXRhcmdfZW11bD1kMzB2ZWxmOyB0YXJnX2V4dHJhX2VtdWxzPSJkMzB2X2UgZDMwdl9vIiA7Owotc3BhcmM2NC0qLWFvdXQqKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYzY0LSotZWxmKikJCXRhcmdfZW11bD1lbGY2NF9zcGFyYyA7Owotc3BhcmMtc3VuLXN1bm9zNCopIAl0YXJnX2VtdWw9c3VuNCA7Owotc3BhcmNsaXRlKi0qLWVsZikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyY2xpdGUqLSotY29mZikJdGFyZ19lbXVsPWNvZmZfc3BhcmMgOzsKLXNwYXJjbGl0ZSotZnVqaXRzdS0qKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYyotKi1hb3V0KQkJdGFyZ19lbXVsPXNwYXJjYW91dCA7Owotc3BhcmMqLSotY29mZikJCXRhcmdfZW11bD1jb2ZmX3NwYXJjIDs7Ci1zcGFyYyotKi1lbGYpCQl0YXJnX2VtdWw9ZWxmMzJfc3BhcmMgOzsKLXNwYXJjKi0qLXN5c3Y0KikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyYyotKi1saW51eCphb3V0KikJdGFyZ19lbXVsPXNwYXJjbGludXgKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMyX3NwYXJjIHN1bjQiCi0JCQl0ZGlyX2VsZjMyX3NwYXJjPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvYW91dC8vJ2AKLQkJCXRkaXJfc3VuND1zcGFyYy1zdW4tc3Vub3M0Ci0JCQk7Owotc3BhcmM2NC0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGY2NF9zcGFyYwotCQkJdGFyZ19leHRyYV9lbXVscz0iZWxmMzJfc3BhcmMgc3BhcmNsaW51eCBzdW40IgotCQkJdGRpcl9lbGYzMl9zcGFyYz1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzLzY0Ly8nYAotCQkJdGRpcl9zcGFyY2xpbnV4PSR7dGRpcl9lbGYzMl9zcGFyY31hb3V0Ci0JCQl0ZGlyX3N1bjQ9c3BhcmMtc3VuLXN1bm9zNAotCQkJOzsKLXNwYXJjKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMl9zcGFyYwotCQkJdGFyZ19leHRyYV9lbXVscz0ic3BhcmNsaW51eCBzdW40IgotCQkJdGRpcl9zcGFyY2xpbnV4PSR7dGFyZ19hbGlhc31hb3V0Ci0JCQl0ZGlyX3N1bjQ9c3BhcmMtc3VuLXN1bm9zNAotCQkJOzsKLXNwYXJjKi0qLWx5bnhvcyopCXRhcmdfZW11bD1zcGFyY2x5bnggOzsKLXNwYXJjKi0qLW5ldGJzZCopCXRhcmdfZW11bD1zcGFyY25ic2QgOzsKLXNwYXJjKi0qLXNvbGFyaXMyKikJdGFyZ19lbXVsPWVsZjMyX3NwYXJjIDs7Ci1zcGFyYyotd3JzLXZ4d29ya3MqKQl0YXJnX2VtdWw9c3BhcmNhb3V0IDs7Ci1zcGFyYyotKi1ydGVtcyopCXRhcmdfZW11bD1zcGFyY2FvdXQgOzsKLWk5NjAtd3JzLXZ4d29ya3M1LjAqKQl0YXJnX2VtdWw9Z2xkOTYwIDs7Ci1pOTYwLXdycy12eHdvcmtzNSopCXRhcmdfZW11bD1nbGQ5NjBjb2ZmIDs7Ci1pOTYwLXdycy12eHdvcmtzKikJdGFyZ19lbXVsPWdsZDk2MCA7OwotaTk2MC0qLWNvZmYpCQl0YXJnX2VtdWw9Z2xkOTYwY29mZiA7OwotaTk2MC1pbnRlbC1uaW5keSkJdGFyZ19lbXVsPWdsZDk2MCA7OwotaTk2MC0qLXJ0ZW1zKikJCXRhcmdfZW11bD1nbGQ5NjBjb2ZmIDs7Ci1pOTYwLSotZWxmKikJCXRhcmdfZW11bD1lbGYzMl9pOTYwIDs7Ci1tMzJyLSotKikJCXRhcmdfZW11bD1tMzJyZWxmIDs7Ci1tNjgqLXN1bi1zdW5vc1szNF0qKQl0YXJnX2VtdWw9c3VuMyA7OwotbTY4Ki13cnMtdnh3b3JrcyopCXRhcmdfZW11bD1zdW4zIDs7Ci1tNjgqLWVyaWNzc29uLW9zZSkJdGFyZ19lbXVsPXN1bjMgOzsKLW02OCotYXBwbGUtYXV4KikJdGFyZ19lbXVsPW02OGthdXggOzsKLSotdGFuZGVtLW5vbmUpCQl0YXJnX2VtdWw9c3QyMDAwIDs7Ci1pWzM0NTZdODYtKi12c3RhKQl0YXJnX2VtdWw9dnN0YSA7OwotaVszNDU2XTg2LWdvMzItcnRlbXMqKQl0YXJnX2VtdWw9aTM4NmdvMzIgOzsKLWlbMzQ1Nl04Ni0qLWdvMzIpCXRhcmdfZW11bD1pMzg2Z28zMiA7OwotaVszNDU2XTg2LSotbXNkb3NkamdwcCopIHRhcmdfZW11bD1pMzg2Z28zMiA7OwotaVszNDU2XTg2LSotYWl4KikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1zY28qKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLWlzYyopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotbHlueG9zKikJdGFyZ19lbXVsPWkzODZseW54IDs7Ci1pWzM0NTZdODYtKi1jb2ZmKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLXJ0ZW1zZWxmKikgIHRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotcnRlbXMqKQl0YXJnX2VtdWw9aTM4NmNvZmYgOzsKLWlbMzQ1Nl04Ni0qLWJzZCkJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLWJzZDM4NikJdGFyZ19lbXVsPWkzODZic2QgOzsKLWlbMzQ1Nl04Ni0qLWJzZGkqKQl0YXJnX2VtdWw9aTM4NmJzZCA7OwotaVszNDU2XTg2LSotYW91dCkJdGFyZ19lbXVsPWkzODZhb3V0IDs7Ci1pWzM0NTZdODYtKi1saW51eCphb3V0KikJdGFyZ19lbXVsPWkzODZsaW51eAotCQkJdGFyZ19leHRyYV9lbXVscz1lbGZfaTM4NgotCQkJdGRpcl9lbGZfaTM4Nj1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2FvdXQvLydgCi0JCQk7OwotaVszNDU2XTg2LSotbGludXhvbGRsZCkJdGFyZ19lbXVsPWkzODZsaW51eDsgdGFyZ19leHRyYV9lbXVscz1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZl9pMzg2Ci0JCQl0YXJnX2V4dHJhX2VtdWxzPWkzODZsaW51eAotCQkJdGRpcl9pMzg2bGludXg9JHt0YXJnX2FsaWFzfWFvdXQKLQkJCTs7Ci1pWzM0NTZdODYtKi1zeXN2NCopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotc29sYXJpczIqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXVuaXh3YXJlKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLXNvbGFyaXMqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLW5ldGJzZCopCXRhcmdfZW11bD1pMzg2bmJzZCA7OwotaVszNDU2XTg2LSotbmV0d2FyZSkJdGFyZ19lbXVsPWkzODZudyA7OwotaVszNDU2XTg2LSotZWxmKikJdGFyZ19lbXVsPWVsZl9pMzg2IDs7Ci1pWzM0NTZdODYtKi1mcmVlYnNkYW91dCogfCBpWzM0NTZdODYtKi1mcmVlYnNkWzEyXS4qIHwgaVszNDU2XTg2LSotZnJlZWJzZFsxMl0pCi0JCQl0YXJnX2VtdWw9aTM4NmJzZCA7OwotaVszNDU2XTg2LSotZnJlZWJzZCopCXRhcmdfZW11bD1lbGZfaTM4NiA7OwotaVszNDU2XTg2LSotc3lzdiopCXRhcmdfZW11bD1pMzg2Y29mZiA7OwotaVszNDU2XTg2LSotcHR4KikJdGFyZ19lbXVsPWkzODZjb2ZmIDs7Ci1pWzM0NTZdODYtKi1tYWNoKikJdGFyZ19lbXVsPWkzODZtYWNoIDs7Ci1pWzM0NTZdODYtKi1nbnUqKQl0YXJnX2VtdWw9ZWxmX2kzODYgOzsKLWlbMzQ1Nl04Ni0qLW1zZG9zKikJdGFyZ19lbXVsPWkzODZtc2RvczsgdGFyZ19leHRyYV9lbXVscz1pMzg2YW91dCA7OwotaVszNDU2XTg2LSotbW9zcyopCXRhcmdfZW11bD1pMzg2bW9zczsgdGFyZ19leHRyYV9lbXVscz1pMzg2bXNkb3MgOzsKLWlbMzQ1Nl04Ni0qLXdpbm50KikJdGFyZ19lbXVsPWkzODZwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWlbMzQ1Nl04Ni0qLXBlKQkJdGFyZ19lbXVsPWkzODZwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWlbMzQ1Nl04Ni0qLWN5Z3dpbiopCXRhcmdfZW11bD1pMzg2cGUgOwotCQkJdGFyZ19leHRyYV9vZmlsZXM9ImRlZmZpbGVwLm8gcGUtZGxsLm8iIDs7Ci1pWzM0NTZdODYtKi1taW5ndzMyKikJdGFyZ19lbXVsPWkzODZwZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWlbMzQ1Nl04Ni0qLWJlb3NwZSopICAgIHRhcmdfZW11bD1pMzg2YmVvcyA7OwotaVszNDU2XTg2LSotYmVvcyopCXRhcmdfZW11bD1lbGZfaTM4Nl9iZSA7OwotbTgqLSotKikJCXRhcmdfZW11bD1tODhrYmNzIDs7Ci1hMjlrLSotdWRpKQkJdGFyZ19lbXVsPXNhMjkyMDAgOzsKLWEyOWstKi1lYm1vbikJCXRhcmdfZW11bD1lYm1vbjI5ayA7OwotYTI5ay0qLSopCQl0YXJnX2VtdWw9YTI5ayA7OwotIyAgYXJtLSotcmlzY2l4KikJCXRhcmdfZW11bD1yaXNjaXggOzsKLWFybS0qLWFvdXQgfCBhcm1lbC0qLWFvdXQpIHRhcmdfZW11bD1hcm1hb3V0bCA7OwotYXJtZWItKi1hb3V0KQkJdGFyZ19lbXVsPWFybWFvdXRiIDs7Ci1hcm0tKi1jb2ZmKQkJdGFyZ19lbXVsPWFybWNvZmYgOzsKLWFybS0qLWVsZikJCXRhcmdfZW11bD1hcm1lbGYgOzsKLWFybS0qLW9hYmkpICAgICAgICAgICAgIHRhcmdfZW11bD1hcm1lbGZfb2FiaSA7OwotYXJtKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1hcm1lbGZfbGludXg7IHRhcmdfZXh0cmFfZW11bHM9ImFybWVsZl9saW51eDI2IGFybWVsZiI7Owotc3Ryb25nYXJtLSotY29mZikJdGFyZ19lbXVsPWFybWNvZmYgOzsKLXN0cm9uZ2FybS0qLWVsZikJdGFyZ19lbXVsPWFybWVsZiA7OwotdGh1bWItKi1jb2ZmKQkJdGFyZ19lbXVsPWFybWNvZmYgOzsKLXRodW1iLSotZWxmKQkJdGFyZ19lbXVsPWFybWVsZiA7OwotdGh1bWItKi1vYWJpKSAgICAgICAgICAgdGFyZ19lbXVsPWFybWVsZl9vYWJpIDs7Ci10aHVtYi1lcG9jLXBlKQkJdGFyZ19lbXVsPWFybV9lcG9jX3BlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotdGh1bWItKi1wZSkJCXRhcmdfZW11bD1hcm1wZSA7Ci0JCQl0YXJnX2V4dHJhX29maWxlcz0iZGVmZmlsZXAubyBwZS1kbGwubyIgOzsKLWg4MzAwLSotaG1zKiB8IGg4MzAwLSotY29mZiopCi0JCQl0YXJnX2VtdWw9aDgzMDA7IHRhcmdfZXh0cmFfZW11bHM9Img4MzAwaCBoODMwMHMiCi0JCQk7OwotaDg1MDAtKi1obXMqIHwgaDg1MDAtKi1jb2ZmKikKLQkJCXRhcmdfZW11bD1oODUwMAotCQkJdGFyZ19leHRyYV9lbXVscz0iaDg1MDBzIGg4NTAwYiBoODUwMG0gaDg1MDBjIgotCQkJOzsKLXNoLSotZWxmKiB8IHNoLSotcnRlbXNlbGYqKQotCQkJdGFyZ19lbXVsPXNoZWxmCi0JCQl0YXJnX2V4dHJhX2VtdWxzPSJzaGxlbGYgc2ggc2hsIgotCQkJOzsKLXNoLSotKnxzaC0qLXJ0ZW1zKikJdGFyZ19lbXVsPXNoOyB0YXJnX2V4dHJhX2VtdWxzPXNobCA7OwotbTY4ay1zb255LSopCQl0YXJnX2VtdWw9bmV3cyA7OwotbTY4ay1ocC1ic2QqKQkJdGFyZ19lbXVsPWhwMzAwYnNkIDs7Ci1tNjgqLW1vdG9yb2xhLXN5c3YqKQl0YXJnX2VtdWw9ZGVsdGE2OCA7OwotbTY4Ki0qLWFvdXQpCQl0YXJnX2VtdWw9bTY4a2FvdXQgOzsKLW02OCotKi1jb2ZmKQkJdGFyZ19lbXVsPW02OGtjb2ZmIDs7Ci1tNjgqLSotZWxmKQkJdGFyZ19lbXVsPW02OGtlbGYgOzsKLW02OCotKi1ocHV4KikJCXRhcmdfZW11bD1ocDNocHV4IDs7Ci1tNjhrLSotbGludXgqYW91dCopCXRhcmdfZW11bD1tNjhrbGludXgKLQkJCXRhcmdfZXh0cmFfZW11bHM9bTY4a2VsZgotCQkJdGRpcl9tNjhrZWxmPWBlY2hvICR7dGFyZ19hbGlhc30gfCBzZWQgLWUgJ3MvYW91dC8vJ2AKLQkJCTs7Ci1tNjhrLSotbGludXgtZ251KikJdGFyZ19lbXVsPW02OGtlbGYKLQkJCXRhcmdfZXh0cmFfZW11bHM9bTY4a2xpbnV4Ci0JCQl0ZGlyX202OGtsaW51eD1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2xpbnV4L2xpbnV4YW91dC8nYAotCQkJOzsKLW02OCotKi1nbnUqKQkJdGFyZ19lbXVsPW02OGtlbGYgOzsKLW02OCotKi1seW54b3MqKQkJdGFyZ19lbXVsPW02OGtseW54IDs7Ci1tNjgqLWhwKi1uZXRic2QqKQl0YXJnX2VtdWw9bTY4azRrbmJzZCA7OwotbTY4Ki0qLW5ldGJzZCopCQl0YXJnX2VtdWw9bTY4a25ic2QgOzsKLW02OCotKi1wc29zKikJCXRhcmdfZW11bD1tNjhrcHNvcyA7OwotbTY4Ki0qLXJ0ZW1zKikJCXRhcmdfZW11bD1tNjhrY29mZiA7OwotaHBwYSotKi0qZWxmKikJCXRhcmdfZW11bD1ocHBhZWxmIDs7Ci1ocHBhKi0qLWxpdGVzKikJCXRhcmdfZW11bD1ocHBhZWxmIDs7Ci1ocHBhKi0qLXJ0ZW1zKikJCXRhcmdfZW11bD1ocHBhZWxmIDs7Ci12YXgtZGVjLXVsdHJpeCogfCB2YXgtZGVjLWJzZCopIHRhcmdfZW11bD12YXggOzsKLW1pcHMqLWRlYy11bHRyaXgqKQl0YXJnX2VtdWw9bWlwc2xpdCA7OwotbWlwcyotZGVjLW9zZiopCQl0YXJnX2VtdWw9bWlwc2xpdCA7OwotbWlwcyotc2dpLWlyaXhbNTZdKikJdGFyZ19lbXVsPWVsZjMyYnNtaXAgOzsKLW1pcHMqLXNnaS1pcml4KikJdGFyZ19lbXVsPW1pcHNiaWcgOzsKLW1pcHMqZWwtKi1lY29mZiopCXRhcmdfZW11bD1taXBzaWR0bCA7OwotbWlwcyotKi1lY29mZiopCQl0YXJnX2VtdWw9bWlwc2lkdCA7OwotbWlwcyotZGVjLWJzZCopCQl0YXJnX2VtdWw9bWlwc2JzZCA7OwotbWlwcyotZGVjLW5ldGJzZCopCXRhcmdfZW11bD1lbGYzMmxtaXAgOzsKLW1pcHMqLSotYnNkKikJCXRhcmdfZW11bD1taXBzYmlnIDs7Ci1taXBzKnZyNDMwMGVsLSotZWxmKikJdGFyZ19lbXVsPWVsZjMybDQzMDAgOzsKLW1pcHMqdnI0MzAwLSotZWxmKikJdGFyZ19lbXVsPWVsZjMyYjQzMDAgOzsKLW1pcHMqdnI0MTAwZWwtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJsNDMwMCA7OwotbWlwcyp2cjQxMDAtKi1lbGYqKQl0YXJnX2VtdWw9ZWxmMzJiNDMwMCA7OwotbWlwcyp2cjUwMDBlbC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmw0MzAwIDs7Ci1taXBzKnZyNTAwMC0qLWVsZiopCXRhcmdfZW11bD1lbGYzMmI0MzAwIDs7Ci1taXBzKmVsLSotZWxmKikJCXRhcmdfZW11bD1lbGYzMmVsbWlwIDs7Ci1taXBzKi0qLWVsZiopCQl0YXJnX2VtdWw9ZWxmMzJlYm1pcCA7OwotbWlwcyplbC0qLXJ0ZW1zKikJdGFyZ19lbXVsPWVsZjMyZWxtaXAgOzsKLW1pcHMqLSotcnRlbXMqKQkJdGFyZ19lbXVsPWVsZjMyZWJtaXAgOzsKLW1pcHMqLSotdnh3b3JrcyopCXRhcmdfZW11bD1lbGYzMmVibWlwIDs7Ci1taXBzKmVsLSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZjMybHNtaXAKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMyYnNtaXAgbWlwc2xpdCBtaXBzYmlnIgotCQkJOzsKLW1pcHMqLSotbGludXgtZ251KikJdGFyZ19lbXVsPWVsZjMyYnNtaXAKLQkJCXRhcmdfZXh0cmFfZW11bHM9ImVsZjMybHNtaXAgbWlwc2JpZyBtaXBzbGl0IgotCQkJOzsKLW1pcHMqLSotbG5ld3MqKQkJdGFyZ19lbXVsPW1pcHNsbmV3cyA7OwotbW4xMDIwMC0qLSopCQl0YXJnX2VtdWw9bW4xMDIwMCA7OwotbW4xMDMwMC0qLSopCQl0YXJnX2VtdWw9bW4xMDMwMCA7OwotYWxwaGEqLSotbGludXhlY29mZiopCXRhcmdfZW11bD1hbHBoYSB0YXJnX2V4dHJhX2VtdWxzPWVsZjY0YWxwaGEKLQkJCXRkaXJfZWxmNjRhbHBoYT1gZWNobyAke3RhcmdfYWxpYXN9IHwgc2VkIC1lICdzL2Vjb2ZmLy8nYAotCQkJOzsKLWFscGhhKi0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGY2NGFscGhhIHRhcmdfZXh0cmFfZW11bHM9YWxwaGEKLQkJCXRkaXJfYWxwaGE9YGVjaG8gJHt0YXJnX2FsaWFzfSB8IHNlZCAtZSAncy9saW51eC9saW51eGVjb2ZmLydgCi0JCQk7OwotYWxwaGEqLSotb3NmKikJCXRhcmdfZW11bD1hbHBoYSA7OwotYWxwaGEqLSotZ251KikJCXRhcmdfZW11bD1lbGY2NGFscGhhIDs7Ci1hbHBoYSotKi1uZXR3YXJlKikJdGFyZ19lbXVsPWFscGhhIDs7Ci1hbHBoYSotKi1uZXRic2QqKQl0YXJnX2VtdWw9ZWxmNjRhbHBoYSA7OwotejhrLSotY29mZikgCQl0YXJnX2VtdWw9ejgwMDI7IHRhcmdfZXh0cmFfZW11bHM9ejgwMDEgOzsKLW5zMzJrLXBjNTMyLW1hY2gqIHwgbnMzMmstcGM1MzItdXgqKQl0YXJnX2VtdWw9cGM1MzJtYWNoYSA7OwotbnMzMmstcGM1MzItbmV0YnNkKiB8IG5zMzJrLXBjNTMyLWxpdGVzKikgdGFyZ19lbXVsPW5zMzJrbmJzZCA7OwotcG93ZXJwYy0qLWxpbnV4LWdudSopCXRhcmdfZW11bD1lbGYzMnBwY2xpbnV4OyB0YXJnX2V4dHJhX2VtdWxzPWVsZjMycHBjOwotCQkJdGFyZ19leHRyYV9saWJwYXRoPWVsZjMycHBjIDs7Ci1wb3dlcnBjLSotZWxmKiB8IHBvd2VycGMtKi1lYWJpKiB8IHBvd2VycGMtKi1zeXN2KiBcCi0gIHwgcG93ZXJwYy0qLW5ldGJzZCogfCBwb3dlcnBjLSotdnh3b3JrcyopCi0JdGFyZ19lbXVsPWVsZjMycHBjIDs7Ci1wb3dlcnBjbGUtKi1lbGYqIHwgcG93ZXJwY2xlLSotZWFiaSogfCBwb3dlcnBjbGUtKi1zb2xhcmlzKiBcCi0gIHwgcG93ZXJwY2xlLSotc3lzdiogfCBwb3dlcnBjbGUtKi12eHdvcmtzKikKLQl0YXJnX2VtdWw9ZWxmMzJscHBjIDs7Ci1wb3dlcnBjbGUtKi1ydGVtcyopCXRhcmdfZW11bD1lbGYzMmxlcHBjIDs7Ci1wb3dlcnBjLSotcnRlbXMqKQl0YXJnX2VtdWw9ZWxmMzJwcGMgOzsKLXBvd2VycGMtKi1tYWNvcyopCXRhcmdfZW11bD1wcGNtYWNvcyA7OwotcG93ZXJwYy0qLW5ldHdhcmUqKQl0YXJnX2VtdWw9cHBjbncgOzsKLXBvd2VycGNsZS0qLXBlKSAgICAgICAgIHRhcmdfZW11bD1wcGNwZSA7OwotcG93ZXJwY2xlLSotd2lubnQqKSAgICAgdGFyZ19lbXVsPXBwY3BlIDs7Ci1wb3dlcnBjbGUtKi1jeWd3aW4qKSAgIHRhcmdfZW11bD1wcGNwZSA7OwotcG93ZXJwYy0qLWFpeCopCQl0YXJnX2VtdWw9YWl4cHBjIDs7Ci1wb3dlcnBjLSotYmVvcyopCXRhcmdfZW11bD1haXhwcGMgOzsKLXJzNjAwMC0qLWFpeCopCQl0YXJnX2VtdWw9YWl4cnM2IDs7Ci10aWMzMC0qLSphb3V0KikJCXRhcmdfZW11bD10aWMzMGFvdXQgOzsKLXRpYzMwLSotKmNvZmYqKQkJdGFyZ19lbXVsPXRpYzMwY29mZiA7OwotdGljODAtKi0qKQkJdGFyZ19lbXVsPXRpYzgwY29mZiA7Owotdjg1MC0qLSopCQl0YXJnX2VtdWw9djg1MCA7Owotdjg1MGUtKi0qKQkJdGFyZ19lbXVsPXY4NTAgOzsKLXY4NTBlYS0qLSopCQl0YXJnX2VtdWw9djg1MCA7OwotdzY1LSotKikJCXRhcmdfZW11bD13NjUgOzsKLWZyMzAtKi0qKQkJdGFyZ19lbXVsPWVsZjMyZnIzMCA7OwotbWNvcmUtKi1wZSkJCXRhcmdfZW11bD1tY29yZXBlIDsKLQkJCXRhcmdfZXh0cmFfb2ZpbGVzPSJkZWZmaWxlcC5vIHBlLWRsbC5vIiA7OwotbWNvcmUtKi1lbGYpCQl0YXJnX2VtdWw9ZWxmMzJtY29yZSA7OwotKi0qLWFvdXQpCQl0YXJnX2VtdWw9JHt0YXJnZXRfY3B1fS0ke3RhcmdldF92ZW5kb3J9IDs7Ci0qLSotY29mZikJCXRhcmdfZW11bD0ke3RhcmdldF9jcHV9LSR7dGFyZ2V0X3ZlbmRvcn0gOzsKLSotKi1uZXR3YXJlKQkJdGFyZ19lbXVsPSR7dGFyZ2V0X2NwdX0tbncgOzsKLSotKi1pZWVlKikJCXRhcmdfZW11bD12YW5pbGxhIDs7Ci0KLSopCi0gIGVjaG8gMj4mMSAiKioqIGxkIGRvZXMgbm90IHN1cHBvcnQgdGFyZ2V0ICR7dGFyZ30iCi0gIGVjaG8gMj4mMSAiKioqIHNlZSBsZC9jb25maWd1cmUudGd0IGZvciBzdXBwb3J0ZWQgdGFyZ2V0cyIKLSAgZXhpdCAxCi0KLWVzYWMKZGlmZiAtLWdpdCBhL2xkL2RlZmZpbGUuaCBiL2xkL2RlZmZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M2YzFjZS4uMDAwMDAwMAotLS0gYS9sZC9kZWZmaWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyogZGVmZmlsZS5oIC0gaGVhZGVyIGZvciAuREVGIGZpbGUgcGFyc2VyCi0gICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IERKIERlbG9yaWUgZGpAY3lnbnVzLmNvbQotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLQotLyogREVGIHN0b3JhZ2UgZGVmaW5pdGlvbnMuICBOb3RlIHRoYXQgYW55IG9yZGluYWwgbWF5IGJlIHplcm8sIGFuZAotICAgYW55IHBvaW50ZXIgbWF5IGJlIE5VTEwsIGlmIG5vdCBkZWZpbmVkIGJ5IHRoZSBERUYgZmlsZS4gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfc2VjdGlvbgotICB7Ci0gICAgY2hhciAqbmFtZTsJCQkvKiBhbHdheXMgc2V0ICovCi0gICAgY2hhciAqY2xhc3M7CQkvKiBtYXkgYmUgTlVMTCAqLwotICAgIGNoYXIgZmxhZ19yZWFkLCBmbGFnX3dyaXRlLCBmbGFnX2V4ZWN1dGUsIGZsYWdfc2hhcmVkOwotICB9Ci1kZWZfZmlsZV9zZWN0aW9uOwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9leHBvcnQKLSAgewotICAgIGNoYXIgKm5hbWU7CQkJLyogYWx3YXlzIHNldCAqLwotICAgIGNoYXIgKmludGVybmFsX25hbWU7CS8qIGFsd2F5cyBzZXQsIG1heSA9PSBuYW1lICovCi0gICAgaW50IG9yZGluYWw7CQkvKiAtMSBpZiBub3Qgc3BlY2lmaWVkICovCi0gICAgaW50IGhpbnQ7Ci0gICAgY2hhciBmbGFnX3ByaXZhdGUsIGZsYWdfY29uc3RhbnQsIGZsYWdfbm9uYW1lLCBmbGFnX2RhdGE7Ci0gIH0KLWRlZl9maWxlX2V4cG9ydDsKLQotdHlwZWRlZiBzdHJ1Y3QgZGVmX2ZpbGVfbW9kdWxlCi0gIHsKLSAgICBzdHJ1Y3QgZGVmX2ZpbGVfbW9kdWxlICpuZXh0OwotICAgIHZvaWQgKnVzZXJfZGF0YTsKLSAgICBjaGFyIG5hbWVbMV07IC8qIGV4dGVuZGVkIHZpYSBtYWxsb2MgKi8KLSAgfQotZGVmX2ZpbGVfbW9kdWxlOwotCi10eXBlZGVmIHN0cnVjdCBkZWZfZmlsZV9pbXBvcnQKLSAgewotICAgIGNoYXIgKmludGVybmFsX25hbWU7CS8qIGFsd2F5cyBzZXQgKi8KLSAgICBkZWZfZmlsZV9tb2R1bGUgKm1vZHVsZTsJLyogYWx3YXlzIHNldCAqLwotICAgIGNoYXIgKm5hbWU7CQkJLyogbWF5IGJlIE5VTEw7IGVpdGhlciB0aGlzIG9yIG9yZGluYWwgd2lsbCBiZSBzZXQgKi8KLSAgICBpbnQgb3JkaW5hbDsJCS8qIG1heSBiZSAtMSAqLwotICB9Ci1kZWZfZmlsZV9pbXBvcnQ7Ci0KLXR5cGVkZWYgc3RydWN0IGRlZl9maWxlCi0gIHsKLQotICAgIC8qIGZyb20gdGhlIE5BTUUgb3IgTElCUkFSWSBjb21tYW5kICovCi0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgaXNfZGxsOwkJCS8qIC0xIGlmIE5BTUUvTElCUkFSWSBub3QgZ2l2ZW4gKi8KLSAgICBiZmRfdm1hIGJhc2VfYWRkcmVzczsJLyogKGJmZF92bWEpKC0xKSBpZiB1bnNwZWNpZmllZCAqLwotCi0gICAgLyogZnJvbSB0aGUgREVTQ1JJUFRJT04gY29tbWFuZCAqLwotICAgIGNoYXIgKmRlc2NyaXB0aW9uOwotCi0gICAgLyogZnJvbSB0aGUgU1RBQ0svSEVBUCBjb21tYW5kLCAtMSBpZiB1bnNwZWNpZmllZCAqLwotICAgIGludCBzdGFja19yZXNlcnZlLCBzdGFja19jb21taXQ7Ci0gICAgaW50IGhlYXBfcmVzZXJ2ZSwgaGVhcF9jb21taXQ7Ci0KLSAgICAvKiBmcm9tIHRoZSBTRUNUSU9OL1NFR01FTlQgY29tbWFuZHMgKi8KLSAgICBpbnQgbnVtX3NlY3Rpb25fZGVmczsKLSAgICBkZWZfZmlsZV9zZWN0aW9uICpzZWN0aW9uX2RlZnM7Ci0KLSAgICAvKiBmcm9tIHRoZSBFWFBPUlRTIGNvbW1hbmRzICovCi0gICAgaW50IG51bV9leHBvcnRzOwotICAgIGRlZl9maWxlX2V4cG9ydCAqZXhwb3J0czsKLQotICAgIC8qIHVzZWQgYnkgaW1wb3J0cyBmb3IgbW9kdWxlIG5hbWVzICovCi0gICAgZGVmX2ZpbGVfbW9kdWxlICptb2R1bGVzOwotCi0gICAgLyogZnJvbSB0aGUgSU1QT1JUUyBjb21tYW5kcyAqLwotICAgIGludCBudW1faW1wb3J0czsKLSAgICBkZWZfZmlsZV9pbXBvcnQgKmltcG9ydHM7Ci0KLSAgICAvKiBmcm9tIHRoZSBWRVJTSU9OIGNvbW1hbmQsIC0xIGlmIG5vdCBzcGVjaWZpZWQgKi8KLSAgICBpbnQgdmVyc2lvbl9tYWpvciwgdmVyc2lvbl9taW5vcjsKLSAgfQotZGVmX2ZpbGU7Ci0KLWV4dGVybiBkZWZfZmlsZSAqZGVmX2ZpbGVfZW1wdHkgUEFSQU1TICgodm9pZCkpOwotCi0vKiBhZGRfdG8gbWF5IGJlIE5VTEwuICBJZiBub3QsIHRoaXMgLmRlZiBpcyBhcHBlbmRlZCB0byBpdCAqLwotZXh0ZXJuIGRlZl9maWxlICpkZWZfZmlsZV9wYXJzZSBQQVJBTVMgKChjb25zdCBjaGFyICpfZmlsZW5hbWUsCi0JCQkJCSBkZWZfZmlsZSAqIF9hZGRfdG8pKTsKLQotZXh0ZXJuIHZvaWQgZGVmX2ZpbGVfZnJlZSBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYpKTsKLQotZXh0ZXJuIGRlZl9maWxlX2V4cG9ydCAqZGVmX2ZpbGVfYWRkX2V4cG9ydCBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9uYW1lLAotCQkJCQkJIGNvbnN0IGNoYXIgKl9pbnRlcm5hbF9uYW1lLAotCQkJCQkJICAgICBpbnQgX29yZGluYWwpKTsKLQotZXh0ZXJuIGRlZl9maWxlX2ltcG9ydCAqZGVmX2ZpbGVfYWRkX2ltcG9ydCBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCi0JCQkJCQkgICAgIGNvbnN0IGNoYXIgKl9uYW1lLAotCQkJCQkJICAgICBjb25zdCBjaGFyICpfZnJvbSwKLQkJCQkJCSAgICAgaW50IF9vcmRpbmFsLAotCQkJCQkgICAgICAgY29uc3QgY2hhciAqX2ltcG9ydGVkX25hbWUpKTsKLQotZXh0ZXJuIHZvaWQgZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSBQQVJBTVMgKChkZWZfZmlsZSAqIF9kZWYsCi0JCQkJCSAgICBjb25zdCBjaGFyICpwYXJhbSwKLQkJCQkJICAgIGludCBsZW4pKTsKLQotI2lmZGVmIERFRl9GSUxFX1BSSU5UCi1leHRlcm4gdm9pZCBkZWZfZmlsZV9wcmludCBQQVJBTVMgKChGSUxFICogX2ZpbGUsCi0JCQkJICAgIGRlZl9maWxlICogX2RlZikpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9kZWZmaWxlcC55IGIvbGQvZGVmZmlsZXAueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFjZGU2Yi4uMDAwMDAwMAotLS0gYS9sZC9kZWZmaWxlcC55CisrKyAvZGV2L251bGwKQEAgLTEsMTAwNCArMCwwIEBACi0leyAvKiBkZWZmaWxlcC55IC0gcGFyc2VyIGZvciAuZGVmIGZpbGVzICovCi0KLS8qICAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJkZWZmaWxlLmgiCi0KLSNkZWZpbmUgVFJBQ0UgMAotCi0jZGVmaW5lIFJPVU5EX1VQKGEsIGIpICgoKGEpKygoYiktMSkpJn4oKGIpLTEpKQotCi0vKiBSZW1hcCBub3JtYWwgeWFjYyBwYXJzZXIgaW50ZXJmYWNlIG5hbWVzICh5eXBhcnNlLCB5eWxleCwgeXllcnJvciwgZXRjKSwKLSAgIGFzIHdlbGwgYXMgZ3JhdHVpdGlvdXNseSBnbG9iYWwgc3ltYm9sIG5hbWVzLCBzbyB3ZSBjYW4gaGF2ZSBtdWx0aXBsZQotICAgeWFjYyBnZW5lcmF0ZWQgcGFyc2VycyBpbiBsZC4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSB0aGUgdmFyaWFibGVzCi0gICBwcm9kdWNlZCBieSB5YWNjLiAgSWYgb3RoZXIgcGFyc2VyIGdlbmVyYXRvcnMgKGJpc29uLCBieWFjYywgZXRjKSBwcm9kdWNlCi0gICBhZGRpdGlvbmFsIGdsb2JhbCBuYW1lcyB0aGF0IGNvbmZsaWN0IGF0IGxpbmsgdGltZSwgdGhlbiB0aG9zZSBwYXJzZXIKLSAgIGdlbmVyYXRvcnMgbmVlZCB0byBiZSBmaXhlZCBpbnN0ZWFkIG9mIGFkZGluZyB0aG9zZSBuYW1lcyB0byB0aGlzIGxpc3QuICovCi0KLSNkZWZpbmUJeXltYXhkZXB0aCBkZWZfbWF4ZGVwdGgKLSNkZWZpbmUJeXlwYXJzZQlkZWZfcGFyc2UKLSNkZWZpbmUJeXlsZXgJZGVmX2xleAotI2RlZmluZQl5eWVycm9yCWRlZl9lcnJvcgotI2RlZmluZQl5eWx2YWwJZGVmX2x2YWwKLSNkZWZpbmUJeXljaGFyCWRlZl9jaGFyCi0jZGVmaW5lCXl5ZGVidWcJZGVmX2RlYnVnCi0jZGVmaW5lCXl5cGFjdAlkZWZfcGFjdAkKLSNkZWZpbmUJeXlyMQlkZWZfcjEJCQkKLSNkZWZpbmUJeXlyMglkZWZfcjIJCQkKLSNkZWZpbmUJeXlkZWYJZGVmX2RlZgkJCi0jZGVmaW5lCXl5Y2hrCWRlZl9jaGsJCQotI2RlZmluZQl5eXBnbwlkZWZfcGdvCQkKLSNkZWZpbmUJeXlhY3QJZGVmX2FjdAkJCi0jZGVmaW5lCXl5ZXhjYQlkZWZfZXhjYQotI2RlZmluZSB5eWVycmZsYWcgZGVmX2VycmZsYWcKLSNkZWZpbmUgeXluZXJycwlkZWZfbmVycnMKLSNkZWZpbmUJeXlwcwlkZWZfcHMKLSNkZWZpbmUJeXlwdglkZWZfcHYKLSNkZWZpbmUJeXlzCWRlZl9zCi0jZGVmaW5lCXl5X3l5cwlkZWZfeXlzCi0jZGVmaW5lCXl5c3RhdGUJZGVmX3N0YXRlCi0jZGVmaW5lCXl5dG1wCWRlZl90bXAKLSNkZWZpbmUJeXl2CWRlZl92Ci0jZGVmaW5lCXl5X3l5dglkZWZfeXl2Ci0jZGVmaW5lCXl5dmFsCWRlZl92YWwKLSNkZWZpbmUJeXlsbG9jCWRlZl9sbG9jCi0jZGVmaW5lIHl5cmVkcwlkZWZfcmVkcwkJLyogV2l0aCBZWURFQlVHIGRlZmluZWQgKi8KLSNkZWZpbmUgeXl0b2tzCWRlZl90b2tzCQkvKiBXaXRoIFlZREVCVUcgZGVmaW5lZCAqLwotI2RlZmluZSB5eWxocwlkZWZfeXlsaHMKLSNkZWZpbmUgeXlsZW4JZGVmX3l5bGVuCi0jZGVmaW5lIHl5ZGVmcmVkIGRlZl95eWRlZnJlZAotI2RlZmluZSB5eWRnb3RvCWRlZl95eWRnb3RvCi0jZGVmaW5lIHl5c2luZGV4IGRlZl95eXNpbmRleAotI2RlZmluZSB5eXJpbmRleCBkZWZfeXlyaW5kZXgKLSNkZWZpbmUgeXlnaW5kZXggZGVmX3l5Z2luZGV4Ci0jZGVmaW5lIHl5dGFibGUJIGRlZl95eXRhYmxlCi0jZGVmaW5lIHl5Y2hlY2sJIGRlZl95eWNoZWNrCi0KLXN0YXRpYyBpbnQgZGVmX2xleCAoKTsKLQotc3RhdGljIHZvaWQgZGVmX2Rlc2NyaXB0aW9uIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZGVmX2V4cG9ydHMgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfaGVhcHNpemUgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9pbXBvcnQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9saWJyYXJ5IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBkZWZfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZGVmX3NlY3Rpb24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9zZWN0aW9uX2FsdCBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZGVmX3N0YWNrc2l6ZSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgZGVmX3ZlcnNpb24gUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIGRlZl9kaXJlY3RpdmUgUEFSQU1TICgoY2hhciAqKSk7Ci1zdGF0aWMgaW50IGRlZl9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGRlZl9lcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgZGVmX2RlYnVnOwotc3RhdGljIGludCBkZWZfbGV4IFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIGludCBsZXhfZm9yY2VkX3Rva2VuID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpsZXhfcGFyc2Vfc3RyaW5nID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpsZXhfcGFyc2Vfc3RyaW5nX2VuZCA9IDA7Ci0KLSV9Ci0KLSV1bmlvbiB7Ci0gIGNoYXIgKmlkOwotICBpbnQgbnVtYmVyOwotfTsKLQotJXRva2VuIE5BTUUsIExJQlJBUlksIERFU0NSSVBUSU9OLCBTVEFDS1NJWkUsIEhFQVBTSVpFLCBDT0RFLCBEQVRBCi0ldG9rZW4gU0VDVElPTlMsIEVYUE9SVFMsIElNUE9SVFMsIFZFUlNJT05LLCBCQVNFLCBDT05TVEFOVCwgUFJJVkFURQotJXRva2VuIFJFQUQgV1JJVEUgRVhFQ1VURSBTSEFSRUQgTk9OQU1FIERJUkVDVElWRQotJXRva2VuIDxpZD4gSUQKLSV0b2tlbiA8bnVtYmVyPiBOVU1CRVIKLSV0eXBlICA8bnVtYmVyPiBvcHRfYmFzZSBvcHRfb3JkaW5hbAotJXR5cGUgIDxudW1iZXI+IGF0dHIgYXR0cl9saXN0IG9wdF9udW1iZXIgZXhwX29wdF9saXN0IGV4cF9vcHQKLSV0eXBlICA8aWQ+IG9wdF9uYW1lIG9wdF9lcXVhbF9uYW1lIAotCi0lJQotCi1zdGFydDogc3RhcnQgY29tbWFuZAotCXwgY29tbWFuZAotCTsKLQotY29tbWFuZDogCi0JCU5BTUUgb3B0X25hbWUgb3B0X2Jhc2UgeyBkZWZfbmFtZSAoJDIsICQzKTsgfQotCXwJTElCUkFSWSBvcHRfbmFtZSBvcHRfYmFzZSB7IGRlZl9saWJyYXJ5ICgkMiwgJDMpOyB9Ci0JfAlERVNDUklQVElPTiBJRCB7IGRlZl9kZXNjcmlwdGlvbiAoJDIpO30KLQl8CVNUQUNLU0laRSBOVU1CRVIgb3B0X251bWJlciB7IGRlZl9zdGFja3NpemUgKCQyLCAkMyk7fQotCXwJSEVBUFNJWkUgTlVNQkVSIG9wdF9udW1iZXIgeyBkZWZfaGVhcHNpemUgKCQyLCAkMyk7fQotCXwJQ09ERSBhdHRyX2xpc3QgeyBkZWZfc2VjdGlvbiAoIkNPREUiLCAkMik7fQotCXwJREFUQSBhdHRyX2xpc3QgIHsgZGVmX3NlY3Rpb24gKCJEQVRBIiwgJDIpO30KLQl8CVNFQ1RJT05TIHNlY2xpc3QKLQl8CUVYUE9SVFMgZXhwbGlzdCAKLQl8CUlNUE9SVFMgaW1wbGlzdAotCXwJVkVSU0lPTksgTlVNQkVSIHsgZGVmX3ZlcnNpb24gKCQyLCAwKTt9Ci0JfAlWRVJTSU9OSyBOVU1CRVIgJy4nIE5VTUJFUiB7IGRlZl92ZXJzaW9uICgkMiwgJDQpO30KLQl8CURJUkVDVElWRSBJRCB7IGRlZl9kaXJlY3RpdmUgKCQyKTt9Ci0JOwotCi0KLWV4cGxpc3Q6Ci0JCS8qIEVNUFRZICovCi0JfAlleHBsaW5lCi0JfAlleHBsaXN0IGV4cGxpbmUKLQk7Ci0KLWV4cGxpbmU6Ci0JCUlEIG9wdF9lcXVhbF9uYW1lIG9wdF9vcmRpbmFsIGV4cF9vcHRfbGlzdAotCQkJeyBkZWZfZXhwb3J0cyAoJDEsICQyLCAkMywgJDQpOyB9Ci0JOwotZXhwX29wdF9saXN0OgotCQlleHBfb3B0IGV4cF9vcHRfbGlzdCB7ICQkID0gJDEgfCAkMjsgfQotCXwJeyAkJCA9IDA7IH0KLQk7Ci1leHBfb3B0OgotCQlOT05BTUUJCXsgJCQgPSAxOyB9Ci0JfAlDT05TVEFOVAl7ICQkID0gMjsgfQotCXwJREFUQQkJeyAkJCA9IDQ7IH0KLQl8CVBSSVZBVEUJCXsgJCQgPSA4OyB9Ci0JOwotaW1wbGlzdDoJCi0JCWltcGxpc3QgaW1wbGluZQotCXwJaW1wbGluZQotCTsKLQotaW1wbGluZToKLSAgICAgICAgICAgICAgIElEICc9JyBJRCAnLicgSUQgJy4nIElEICAgICB7IGRlZl9pbXBvcnQgKCQxLCAkMywgJDUsICQ3LCAtMSk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgSUQgJy4nIE5VTUJFUiB7IGRlZl9pbXBvcnQgKCQxLCAkMywgJDUsICAwLCAkNyk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgSUQgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCQxLCAkMywgIDAsICQ1LCAtMSk7IH0KLSAgICAgICB8ICAgICAgIElEICc9JyBJRCAnLicgTlVNQkVSICAgICAgICB7IGRlZl9pbXBvcnQgKCQxLCAkMywgIDAsICAwLCAkNSk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBJRCAnLicgSUQgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCAkMSwgJDMsICQ1LCAtMSk7IH0KLSAgICAgICB8ICAgICAgIElEICcuJyBJRCAgICAgICAgICAgICAgICAgICB7IGRlZl9pbXBvcnQgKCAwLCAkMSwgIDAsICQzLCAtMSk7IH0KLTsKLQotc2VjbGlzdDoKLQkJc2VjbGlzdCBzZWNsaW5lCi0JfAlzZWNsaW5lCi0JOwotCi1zZWNsaW5lOgotCUlEIGF0dHJfbGlzdCB7IGRlZl9zZWN0aW9uICgkMSwgJDIpO30KLQl8IElEIElEIHsgZGVmX3NlY3Rpb25fYWx0ICgkMSwgJDIpO30KLQk7Ci0KLWF0dHJfbGlzdDoKLQlhdHRyX2xpc3Qgb3B0X2NvbW1hIGF0dHIgeyAkJCA9ICQxIHwgJDM7IH0KLQl8IGF0dHIgeyAkJCA9ICQxOyB9Ci0JOwotCi1vcHRfY29tbWE6Ci0JJywnCi0JfCAKLQk7Ci1vcHRfbnVtYmVyOiAnLCcgTlVNQkVSIHsgJCQ9JDI7fQotCXwJICAgeyAkJD0tMTt9Ci0JOwotCQotYXR0cjoKLQkJUkVBRAl7ICQkID0gMTt9Ci0JfAlXUklURQl7ICQkID0gMjt9CQotCXwJRVhFQ1VURQl7ICQkPTQ7fQotCXwJU0hBUkVECXsgJCQ9ODt9Ci0JOwotCi1vcHRfbmFtZTogSUQJCXsgJCQgPSAkMTsgfQotCXwJCXsgJCQgPSAwOyB9Ci0JOwotCi1vcHRfb3JkaW5hbDogCi0JICAnQCcgTlVNQkVSICAgICB7ICQkID0gJDI7fQotCXwgICAgICAgICAgICAgICAgeyAkJCA9IC0xO30KLQk7Ci0KLW9wdF9lcXVhbF9uYW1lOgotICAgICAgICAgICc9JyBJRAl7ICQkID0gJDI7IH0KLSAgICAgICAgfCAJCXsgJCQgPSAgMDsgfQkJCSAKLQk7Ci0KLW9wdF9iYXNlOiBCQVNFCSc9JyBOVU1CRVIJeyAkJCA9ICQzO30KLQl8CXsgJCQgPSAwO30KLQk7Ci0KLQkKLQotJSUKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVBJCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBGSUxFICp0aGVfZmlsZTsKLXN0YXRpYyBjb25zdCBjaGFyICpkZWZfZmlsZW5hbWU7Ci1zdGF0aWMgaW50IGxpbmVudW1iZXI7Ci1zdGF0aWMgZGVmX2ZpbGUgKmRlZjsKLXN0YXRpYyBpbnQgc2F3X25ld2xpbmU7Ci0KLXN0cnVjdCBkaXJlY3RpdmUKLSAgewotICAgIHN0cnVjdCBkaXJlY3RpdmUgKm5leHQ7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBpbnQgbGVuOwotICB9OwotCi1zdGF0aWMgc3RydWN0IGRpcmVjdGl2ZSAqZGlyZWN0aXZlcyA9IDA7Ci0KLWRlZl9maWxlICoKLWRlZl9maWxlX2VtcHR5ICgpCi17Ci0gIGRlZl9maWxlICpydiA9IChkZWZfZmlsZSAqKSB4bWFsbG9jIChzaXplb2YgKGRlZl9maWxlKSk7Ci0gIG1lbXNldCAocnYsIDAsIHNpemVvZiAoZGVmX2ZpbGUpKTsKLSAgcnYtPmlzX2RsbCA9IC0xOwotICBydi0+YmFzZV9hZGRyZXNzID0gKGJmZF92bWEpICgtMSk7Ci0gIHJ2LT5zdGFja19yZXNlcnZlID0gcnYtPnN0YWNrX2NvbW1pdCA9IC0xOwotICBydi0+aGVhcF9yZXNlcnZlID0gcnYtPmhlYXBfY29tbWl0ID0gLTE7Ci0gIHJ2LT52ZXJzaW9uX21ham9yID0gcnYtPnZlcnNpb25fbWlub3IgPSAtMTsKLSAgcmV0dXJuIHJ2OwotfQotCi1kZWZfZmlsZSAqCi1kZWZfZmlsZV9wYXJzZSAoZmlsZW5hbWUsIGFkZF90bykKLSAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgIGRlZl9maWxlICphZGRfdG87Ci17Ci0gIHN0cnVjdCBkaXJlY3RpdmUgKmQ7Ci0KLSAgdGhlX2ZpbGUgPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gIGRlZl9maWxlbmFtZSA9IGZpbGVuYW1lOwotICBsaW5lbnVtYmVyID0gMTsKLSAgaWYgKCF0aGVfZmlsZSkKLSAgICB7Ci0gICAgICBwZXJyb3IgKGZpbGVuYW1lKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgaWYgKGFkZF90bykKLSAgICB7Ci0gICAgICBkZWYgPSBhZGRfdG87Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZGVmID0gZGVmX2ZpbGVfZW1wdHkgKCk7Ci0gICAgfQotCi0gIHNhd19uZXdsaW5lID0gMTsKLSAgaWYgKGRlZl9wYXJzZSAoKSkKLSAgICB7Ci0gICAgICBkZWZfZmlsZV9mcmVlIChkZWYpOwotICAgICAgZmNsb3NlICh0aGVfZmlsZSk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgZmNsb3NlICh0aGVfZmlsZSk7Ci0KLSAgZm9yIChkID0gZGlyZWN0aXZlczsgZDsgZCA9IGQtPm5leHQpCi0gICAgewotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJBZGRpbmcgZGlyZWN0aXZlICUwOHggYCVzJ1xuIiwgZC0+bmFtZSwgZC0+bmFtZSk7Ci0jZW5kaWYKLSAgICAgIGRlZl9maWxlX2FkZF9kaXJlY3RpdmUgKGRlZiwgZC0+bmFtZSwgZC0+bGVuKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRlZjsKLX0KLQotdm9pZAotZGVmX2ZpbGVfZnJlZSAoZGVmKQotICAgICBkZWZfZmlsZSAqZGVmOwotewotICBpbnQgaTsKLSAgaWYgKCFkZWYpCi0gICAgcmV0dXJuOwotICBpZiAoZGVmLT5uYW1lKQotICAgIGZyZWUgKGRlZi0+bmFtZSk7Ci0gIGlmIChkZWYtPmRlc2NyaXB0aW9uKQotICAgIGZyZWUgKGRlZi0+ZGVzY3JpcHRpb24pOwotCi0gIGlmIChkZWYtPnNlY3Rpb25fZGVmcykKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgZGVmLT5udW1fc2VjdGlvbl9kZWZzOyBpKyspCi0JewotCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLm5hbWUpOwotCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmNsYXNzKQotCSAgICBmcmVlIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcyk7Ci0JfQotICAgICAgZnJlZSAoZGVmLT5zZWN0aW9uX2RlZnMpOwotICAgIH0KLQotICBpZiAoZGVmLT5leHBvcnRzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9leHBvcnRzOyBpKyspCi0JewotCSAgaWYgKGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lCi0JICAgICAgJiYgZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUgIT0gZGVmLT5leHBvcnRzW2ldLm5hbWUpCi0JICAgIGZyZWUgKGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgIGlmIChkZWYtPmV4cG9ydHNbaV0ubmFtZSkKLQkgICAgZnJlZSAoZGVmLT5leHBvcnRzW2ldLm5hbWUpOwotCX0KLSAgICAgIGZyZWUgKGRlZi0+ZXhwb3J0cyk7Ci0gICAgfQotCi0gIGlmIChkZWYtPmltcG9ydHMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IGRlZi0+bnVtX2ltcG9ydHM7IGkrKykKLQl7Ci0JICBpZiAoZGVmLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUKLQkgICAgICAmJiBkZWYtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZSAhPSBkZWYtPmltcG9ydHNbaV0ubmFtZSkKLQkgICAgZnJlZSAoZGVmLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCSAgaWYgKGRlZi0+aW1wb3J0c1tpXS5uYW1lKQotCSAgICBmcmVlIChkZWYtPmltcG9ydHNbaV0ubmFtZSk7Ci0JfQotICAgICAgZnJlZSAoZGVmLT5pbXBvcnRzKTsKLSAgICB9Ci0KLSAgd2hpbGUgKGRlZi0+bW9kdWxlcykKLSAgICB7Ci0gICAgICBkZWZfZmlsZV9tb2R1bGUgKm0gPSBkZWYtPm1vZHVsZXM7Ci0gICAgICBkZWYtPm1vZHVsZXMgPSBkZWYtPm1vZHVsZXMtPm5leHQ7Ci0gICAgICBmcmVlIChtKTsKLSAgICB9Ci0KLSAgZnJlZSAoZGVmKTsKLX0KLQotI2lmZGVmIERFRl9GSUxFX1BSSU5UCi12b2lkCi1kZWZfZmlsZV9wcmludCAoZmlsZSwgZGVmKQotICAgICBGSUxFICpmaWxlOwotICAgICBkZWZfZmlsZSAqZGVmOwotewotICBpbnQgaTsKLSAgZnByaW50ZiAoZmlsZSwgIj4+Pj4gZGVmX2ZpbGUgYXQgMHglMDh4XG4iLCBkZWYpOwotICBpZiAoZGVmLT5uYW1lKQotICAgIGZwcmludGYgKGZpbGUsICIgIG5hbWU6ICVzXG4iLCBkZWYtPm5hbWUgPyBkZWYtPm5hbWUgOiAiKHVuc3BlY2lmaWVkKSIpOwotICBpZiAoZGVmLT5pc19kbGwgIT0gLTEpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgaXMgZGxsOiAlc1xuIiwgZGVmLT5pc19kbGwgPyAieWVzIiA6ICJubyIpOwotICBpZiAoZGVmLT5iYXNlX2FkZHJlc3MgIT0gKGJmZF92bWEpICgtMSkpCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgYmFzZSBhZGRyZXNzOiAweCUwOHhcbiIsIGRlZi0+YmFzZV9hZGRyZXNzKTsKLSAgaWYgKGRlZi0+ZGVzY3JpcHRpb24pCi0gICAgZnByaW50ZiAoZmlsZSwgIiAgZGVzY3JpcHRpb246IGAlcydcbiIsIGRlZi0+ZGVzY3JpcHRpb24pOwotICBpZiAoZGVmLT5zdGFja19yZXNlcnZlICE9IC0xKQotICAgIGZwcmludGYgKGZpbGUsICIgIHN0YWNrIHJlc2VydmU6IDB4JTA4eFxuIiwgZGVmLT5zdGFja19yZXNlcnZlKTsKLSAgaWYgKGRlZi0+c3RhY2tfY29tbWl0ICE9IC0xKQotICAgIGZwcmludGYgKGZpbGUsICIgIHN0YWNrIGNvbW1pdDogMHglMDh4XG4iLCBkZWYtPnN0YWNrX2NvbW1pdCk7Ci0gIGlmIChkZWYtPmhlYXBfcmVzZXJ2ZSAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBoZWFwIHJlc2VydmU6IDB4JTA4eFxuIiwgZGVmLT5oZWFwX3Jlc2VydmUpOwotICBpZiAoZGVmLT5oZWFwX2NvbW1pdCAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICBoZWFwIGNvbW1pdDogMHglMDh4XG4iLCBkZWYtPmhlYXBfY29tbWl0KTsKLQotICBpZiAoZGVmLT5udW1fc2VjdGlvbl9kZWZzID4gMCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiICBzZWN0aW9uIGRlZnM6XG4iKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9zZWN0aW9uX2RlZnM7IGkrKykKLQl7Ci0JICBmcHJpbnRmIChmaWxlLCAiICAgIG5hbWU6IGAlcycsIGNsYXNzOiBgJXMnLCBmbGFnczoiLAotCQkgICBkZWYtPnNlY3Rpb25fZGVmc1tpXS5uYW1lLCBkZWYtPnNlY3Rpb25fZGVmc1tpXS5jbGFzcyk7Ci0JICBpZiAoZGVmLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19yZWFkKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIFIiKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3dyaXRlKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIFciKTsKLQkgIGlmIChkZWYtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX2V4ZWN1dGUpCi0JICAgIGZwcmludGYgKGZpbGUsICIgWCIpOwotCSAgaWYgKGRlZi0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfc2hhcmVkKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIFMiKTsKLQkgIGZwcmludGYgKGZpbGUsICJcbiIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGRlZi0+bnVtX2V4cG9ydHMgPiAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgIGV4cG9ydHM6XG4iKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9leHBvcnRzOyBpKyspCi0JewotCSAgZnByaW50ZiAoZmlsZSwgIiAgICBuYW1lOiBgJXMnLCBpbnQ6IGAlcycsIG9yZGluYWw6ICVkLCBmbGFnczoiLAotCQkgICBkZWYtPmV4cG9ydHNbaV0ubmFtZSwgZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUsCi0JCSAgIGRlZi0+ZXhwb3J0c1tpXS5vcmRpbmFsKTsKLQkgIGlmIChkZWYtPmV4cG9ydHNbaV0uZmxhZ19wcml2YXRlKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIFAiKTsKLQkgIGlmIChkZWYtPmV4cG9ydHNbaV0uZmxhZ19jb25zdGFudCkKLQkgICAgZnByaW50ZiAoZmlsZSwgIiBDIik7Ci0JICBpZiAoZGVmLT5leHBvcnRzW2ldLmZsYWdfbm9uYW1lKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIE4iKTsKLQkgIGlmIChkZWYtPmV4cG9ydHNbaV0uZmxhZ19kYXRhKQotCSAgICBmcHJpbnRmIChmaWxlLCAiIEQiKTsKLQkgIGZwcmludGYgKGZpbGUsICJcbiIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGRlZi0+bnVtX2ltcG9ydHMgPiAwKQotICAgIHsKLSAgICAgIGZwcmludGYgKGZpbGUsICIgIGltcG9ydHM6XG4iKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkZWYtPm51bV9pbXBvcnRzOyBpKyspCi0JewotCSAgZnByaW50ZiAoZmlsZSwgIiAgICBpbnQ6ICVzLCBmcm9tOiBgJXMnLCBuYW1lOiBgJXMnLCBvcmRpbmFsOiAlZFxuIiwKLQkJICAgZGVmLT5pbXBvcnRzW2ldLmludGVybmFsX25hbWUsCi0JCSAgIGRlZi0+aW1wb3J0c1tpXS5tb2R1bGUsCi0JCSAgIGRlZi0+aW1wb3J0c1tpXS5uYW1lLAotCQkgICBkZWYtPmltcG9ydHNbaV0ub3JkaW5hbCk7Ci0JfQotICAgIH0KLSAgaWYgKGRlZi0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLSAgICBmcHJpbnRmIChmaWxlLCAiICB2ZXJzaW9uOiAlZC4lZFxuIiwgZGVmLT52ZXJzaW9uX21ham9yLCBkZWYtPnZlcnNpb25fbWlub3IpOwotICBmcHJpbnRmIChmaWxlLCAiPDw8PCBkZWZfZmlsZSBhdCAweCUwOHhcbiIsIGRlZik7Ci19Ci0jZW5kaWYKLQotZGVmX2ZpbGVfZXhwb3J0ICoKLWRlZl9maWxlX2FkZF9leHBvcnQgKGRlZiwgZXh0ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSwgb3JkaW5hbCkKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLSAgICAgY29uc3QgY2hhciAqZXh0ZXJuYWxfbmFtZTsKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLSAgICAgaW50IG9yZGluYWw7Ci17Ci0gIGRlZl9maWxlX2V4cG9ydCAqZTsKLSAgaW50IG1heF9leHBvcnRzID0gUk9VTkRfVVAoZGVmLT5udW1fZXhwb3J0cywgMzIpOwotICBpZiAoZGVmLT5udW1fZXhwb3J0cyA+PSBtYXhfZXhwb3J0cykKLSAgICB7Ci0gICAgICBtYXhfZXhwb3J0cyA9IFJPVU5EX1VQKGRlZi0+bnVtX2V4cG9ydHMrMSwgMzIpOwotICAgICAgaWYgKGRlZi0+ZXhwb3J0cykKLQlkZWYtPmV4cG9ydHMgPSAoZGVmX2ZpbGVfZXhwb3J0ICopIHhyZWFsbG9jIChkZWYtPmV4cG9ydHMsIG1heF9leHBvcnRzICogc2l6ZW9mIChkZWZfZmlsZV9leHBvcnQpKTsKLSAgICAgIGVsc2UKLQlkZWYtPmV4cG9ydHMgPSAoZGVmX2ZpbGVfZXhwb3J0ICopIHhtYWxsb2MgKG1heF9leHBvcnRzICogc2l6ZW9mIChkZWZfZmlsZV9leHBvcnQpKTsKLSAgICB9Ci0gIGUgPSBkZWYtPmV4cG9ydHMgKyBkZWYtPm51bV9leHBvcnRzOwotICBtZW1zZXQgKGUsIDAsIHNpemVvZiAoZGVmX2ZpbGVfZXhwb3J0KSk7Ci0gIGlmIChpbnRlcm5hbF9uYW1lICYmICFleHRlcm5hbF9uYW1lKQotICAgIGV4dGVybmFsX25hbWUgPSBpbnRlcm5hbF9uYW1lOwotICBpZiAoZXh0ZXJuYWxfbmFtZSAmJiAhaW50ZXJuYWxfbmFtZSkKLSAgICBpbnRlcm5hbF9uYW1lID0gZXh0ZXJuYWxfbmFtZTsKLSAgZS0+bmFtZSA9IHhzdHJkdXAgKGV4dGVybmFsX25hbWUpOwotICBlLT5pbnRlcm5hbF9uYW1lID0geHN0cmR1cCAoaW50ZXJuYWxfbmFtZSk7Ci0gIGUtPm9yZGluYWwgPSBvcmRpbmFsOwotICBkZWYtPm51bV9leHBvcnRzKys7Ci0gIHJldHVybiBlOwotfQotCi1zdGF0aWMgZGVmX2ZpbGVfbW9kdWxlICoKLWRlZl9zdGFzaF9tb2R1bGUgKGRlZiwgbmFtZSkKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgZGVmX2ZpbGVfbW9kdWxlICpzOwotICBmb3IgKHM9ZGVmLT5tb2R1bGVzOyBzOyBzPXMtPm5leHQpCi0gICAgaWYgKHN0cmNtcCAocy0+bmFtZSwgbmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiBzOwotICBzID0gKGRlZl9maWxlX21vZHVsZSAqKSB4bWFsbG9jIChzaXplb2YgKGRlZl9maWxlX21vZHVsZSkgKyBzdHJsZW4gKG5hbWUpKTsKLSAgcy0+bmV4dCA9IGRlZi0+bW9kdWxlczsKLSAgZGVmLT5tb2R1bGVzID0gczsKLSAgcy0+dXNlcl9kYXRhID0gMDsKLSAgc3RyY3B5IChzLT5uYW1lLCBuYW1lKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLWRlZl9maWxlX2ltcG9ydCAqCi1kZWZfZmlsZV9hZGRfaW1wb3J0IChkZWYsIG5hbWUsIG1vZHVsZSwgb3JkaW5hbCwgaW50ZXJuYWxfbmFtZSkKLSAgICAgZGVmX2ZpbGUgKmRlZjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbW9kdWxlOwotICAgICBpbnQgb3JkaW5hbDsKLSAgICAgY29uc3QgY2hhciAqaW50ZXJuYWxfbmFtZTsKLXsKLSAgZGVmX2ZpbGVfaW1wb3J0ICppOwotICBpbnQgbWF4X2ltcG9ydHMgPSBST1VORF9VUChkZWYtPm51bV9pbXBvcnRzLCAxNik7Ci0gIGlmIChkZWYtPm51bV9pbXBvcnRzID49IG1heF9pbXBvcnRzKQotICAgIHsKLSAgICAgIG1heF9pbXBvcnRzID0gUk9VTkRfVVAoZGVmLT5udW1faW1wb3J0cysxLCAxNik7Ci0gICAgICBpZiAoZGVmLT5pbXBvcnRzKQotCWRlZi0+aW1wb3J0cyA9IChkZWZfZmlsZV9pbXBvcnQgKikgeHJlYWxsb2MgKGRlZi0+aW1wb3J0cywgbWF4X2ltcG9ydHMgKiBzaXplb2YgKGRlZl9maWxlX2ltcG9ydCkpOwotICAgICAgZWxzZQotCWRlZi0+aW1wb3J0cyA9IChkZWZfZmlsZV9pbXBvcnQgKikgeG1hbGxvYyAobWF4X2ltcG9ydHMgKiBzaXplb2YgKGRlZl9maWxlX2ltcG9ydCkpOwotICAgIH0KLSAgaSA9IGRlZi0+aW1wb3J0cyArIGRlZi0+bnVtX2ltcG9ydHM7Ci0gIG1lbXNldCAoaSwgMCwgc2l6ZW9mIChkZWZfZmlsZV9pbXBvcnQpKTsKLSAgaWYgKG5hbWUpCi0gICAgaS0+bmFtZSA9IHhzdHJkdXAgKG5hbWUpOwotICBpZiAobW9kdWxlKQotICAgIGktPm1vZHVsZSA9IGRlZl9zdGFzaF9tb2R1bGUoZGVmLCBtb2R1bGUpOwotICBpLT5vcmRpbmFsID0gb3JkaW5hbDsKLSAgaWYgKGludGVybmFsX25hbWUpCi0gICAgaS0+aW50ZXJuYWxfbmFtZSA9IHhzdHJkdXAgKGludGVybmFsX25hbWUpOwotICBlbHNlCi0gICAgaS0+aW50ZXJuYWxfbmFtZSA9IGktPm5hbWU7Ci0gIGRlZi0+bnVtX2ltcG9ydHMrKzsKLSAgcmV0dXJuIGk7Ci19Ci0KLXN0cnVjdAotewotICBjaGFyICpwYXJhbTsKLSAgaW50IHRva2VuOwotfQotZGlyb3B0c1tdID0KLXsKLSAgeyAiLWhlYXAiLCBIRUFQU0laRSB9LAotICB7ICItc3RhY2siLCBTVEFDS1NJWkUgfSwKLSAgeyAiLWF0dHIiLCBTRUNUSU9OUyB9LAotICB7ICItZXhwb3J0IiwgRVhQT1JUUyB9LAotICB7IDAsIDAgfQotfTsKLQotdm9pZAotZGVmX2ZpbGVfYWRkX2RpcmVjdGl2ZSAobXlfZGVmLCBwYXJhbSwgbGVuKQotICAgICBkZWZfZmlsZSAqbXlfZGVmOwotICAgICBjb25zdCBjaGFyICpwYXJhbTsKLSAgICAgaW50IGxlbjsKLXsKLSAgZGVmX2ZpbGUgKnNhdmVfZGVmID0gZGVmOwotICBjb25zdCBjaGFyICpwZW5kID0gcGFyYW0gKyBsZW47Ci0gIGNvbnN0IGNoYXIgKnRlbmQgPSBwYXJhbTsKLSAgaW50IGk7Ci0KLSAgZGVmID0gbXlfZGVmOwotCi0gIHdoaWxlIChwYXJhbSA8IHBlbmQpCi0gICAgewotICAgICAgd2hpbGUgKHBhcmFtIDwgcGVuZCAmJiBpc3NwYWNlICgqcGFyYW0pKQotCXBhcmFtKys7Ci0gICAgICBmb3IgKHRlbmQgPSBwYXJhbSArIDE7Ci0JICAgdGVuZCA8IHBlbmQgJiYgIShpc3NwYWNlICh0ZW5kWy0xXSkgJiYgKnRlbmQgPT0gJy0nKTsKLQkgICB0ZW5kKyspOwotCi0gICAgICBmb3IgKGkgPSAwOyBkaXJvcHRzW2ldLnBhcmFtOyBpKyspCi0JewotCSAgaW50IGxlbiA9IHN0cmxlbiAoZGlyb3B0c1tpXS5wYXJhbSk7Ci0JICBpZiAodGVuZCAtIHBhcmFtID49IGxlbgotCSAgICAgICYmIHN0cm5jbXAgKHBhcmFtLCBkaXJvcHRzW2ldLnBhcmFtLCBsZW4pID09IDAKLQkgICAgICAmJiAocGFyYW1bbGVuXSA9PSAnOicgfHwgcGFyYW1bbGVuXSA9PSAnICcpKQotCSAgICB7Ci0JICAgICAgbGV4X3BhcnNlX3N0cmluZ19lbmQgPSB0ZW5kOwotCSAgICAgIGxleF9wYXJzZV9zdHJpbmcgPSBwYXJhbSArIGxlbiArIDE7Ci0JICAgICAgbGV4X2ZvcmNlZF90b2tlbiA9IGRpcm9wdHNbaV0udG9rZW47Ci0JICAgICAgc2F3X25ld2xpbmUgPSAwOwotCSAgICAgIGRlZl9wYXJzZSAoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKCFkaXJvcHRzW2ldLnBhcmFtKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlaW5mbyAoXygiV2FybmluZzogLmRyZWN0dmUgYCUuKnMnIHVucmVjb2duaXplZFxuIiksCi0JCSB0ZW5kIC0gcGFyYW0sIHBhcmFtKTsKLQl9Ci0gICAgICBsZXhfcGFyc2Vfc3RyaW5nID0gMDsKLSAgICAgIHBhcmFtID0gdGVuZDsKLSAgICB9Ci0KLSAgZGVmID0gc2F2ZV9kZWY7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIFBhcnNlciBDYWxsYmFja3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLWRlZl9uYW1lIChuYW1lLCBiYXNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgYmFzZTsKLXsKLSAgaWYgKGRlZi0+bmFtZSkKLSAgICBmcmVlIChkZWYtPm5hbWUpOwotICBkZWYtPm5hbWUgPSB4c3RyZHVwIChuYW1lKTsKLSAgZGVmLT5iYXNlX2FkZHJlc3MgPSBiYXNlOwotICBkZWYtPmlzX2RsbCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfbGlicmFyeSAobmFtZSwgYmFzZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGJhc2U7Ci17Ci0gIGlmIChkZWYtPm5hbWUpCi0gICAgZnJlZSAoZGVmLT5uYW1lKTsKLSAgZGVmLT5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGRlZi0+YmFzZV9hZGRyZXNzID0gYmFzZTsKLSAgZGVmLT5pc19kbGwgPSAxOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX2Rlc2NyaXB0aW9uICh0ZXh0KQotICAgICBjb25zdCBjaGFyICp0ZXh0OwotewotICBpbnQgbGVuID0gZGVmLT5kZXNjcmlwdGlvbiA/IHN0cmxlbiAoZGVmLT5kZXNjcmlwdGlvbikgOiAwOwotICBsZW4gKz0gc3RybGVuICh0ZXh0KSArIDE7Ci0gIGlmIChkZWYtPmRlc2NyaXB0aW9uKQotICAgIHsKLSAgICAgIGRlZi0+ZGVzY3JpcHRpb24gPSAoY2hhciAqKSB4cmVhbGxvYyAoZGVmLT5kZXNjcmlwdGlvbiwgbGVuKTsKLSAgICAgIHN0cmNhdCAoZGVmLT5kZXNjcmlwdGlvbiwgdGV4dCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgZGVmLT5kZXNjcmlwdGlvbiA9IChjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0gICAgICBzdHJjcHkgKGRlZi0+ZGVzY3JpcHRpb24sIHRleHQpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWRlZl9zdGFja3NpemUgKHJlc2VydmUsIGNvbW1pdCkKLSAgICAgaW50IHJlc2VydmU7Ci0gICAgIGludCBjb21taXQ7Ci17Ci0gIGRlZi0+c3RhY2tfcmVzZXJ2ZSA9IHJlc2VydmU7Ci0gIGRlZi0+c3RhY2tfY29tbWl0ID0gY29tbWl0OwotfQotCi1zdGF0aWMgdm9pZAotZGVmX2hlYXBzaXplIChyZXNlcnZlLCBjb21taXQpCi0gICAgIGludCByZXNlcnZlOwotICAgICBpbnQgY29tbWl0OwotewotICBkZWYtPmhlYXBfcmVzZXJ2ZSA9IHJlc2VydmU7Ci0gIGRlZi0+aGVhcF9jb21taXQgPSBjb21taXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1kZWZfc2VjdGlvbiAobmFtZSwgYXR0cikKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGF0dHI7Ci17Ci0gIGRlZl9maWxlX3NlY3Rpb24gKnM7Ci0gIGludCBtYXhfc2VjdGlvbnMgPSBST1VORF9VUChkZWYtPm51bV9zZWN0aW9uX2RlZnMsIDQpOwotICBpZiAoZGVmLT5udW1fc2VjdGlvbl9kZWZzID49IG1heF9zZWN0aW9ucykKLSAgICB7Ci0gICAgICBtYXhfc2VjdGlvbnMgPSBST1VORF9VUChkZWYtPm51bV9zZWN0aW9uX2RlZnMrMSwgNCk7Ci0gICAgICBpZiAoZGVmLT5zZWN0aW9uX2RlZnMpCi0JZGVmLT5zZWN0aW9uX2RlZnMgPSAoZGVmX2ZpbGVfc2VjdGlvbiAqKSB4cmVhbGxvYyAoZGVmLT5zZWN0aW9uX2RlZnMsIG1heF9zZWN0aW9ucyAqIHNpemVvZiAoZGVmX2ZpbGVfaW1wb3J0KSk7Ci0gICAgICBlbHNlCi0JZGVmLT5zZWN0aW9uX2RlZnMgPSAoZGVmX2ZpbGVfc2VjdGlvbiAqKSB4bWFsbG9jIChtYXhfc2VjdGlvbnMgKiBzaXplb2YgKGRlZl9maWxlX2ltcG9ydCkpOwotICAgIH0KLSAgcyA9IGRlZi0+c2VjdGlvbl9kZWZzICsgZGVmLT5udW1fc2VjdGlvbl9kZWZzOwotICBtZW1zZXQgKHMsIDAsIHNpemVvZiAoZGVmX2ZpbGVfc2VjdGlvbikpOwotICBzLT5uYW1lID0geHN0cmR1cCAobmFtZSk7Ci0gIGlmIChhdHRyICYgMSkKLSAgICBzLT5mbGFnX3JlYWQgPSAxOwotICBpZiAoYXR0ciAmIDIpCi0gICAgcy0+ZmxhZ193cml0ZSA9IDE7Ci0gIGlmIChhdHRyICYgNCkKLSAgICBzLT5mbGFnX2V4ZWN1dGUgPSAxOwotICBpZiAoYXR0ciAmIDgpCi0gICAgcy0+ZmxhZ19zaGFyZWQgPSAxOwotCi0gIGRlZi0+bnVtX3NlY3Rpb25fZGVmcysrOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX3NlY3Rpb25fYWx0IChuYW1lLCBhdHRyKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICphdHRyOwotewotICBpbnQgYXZhbCA9IDA7Ci0gIGZvciAoOyAqYXR0cjsgYXR0cisrKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKmF0dHIpCi0JewotCWNhc2UgJ1InOgotCWNhc2UgJ3InOgotCSAgYXZhbCB8PSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnVyc6Ci0JY2FzZSAndyc6Ci0JICBhdmFsIHw9IDI7Ci0JICBicmVhazsKLQljYXNlICdYJzoKLQljYXNlICd4JzoKLQkgIGF2YWwgfD0gNDsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotCWNhc2UgJ3MnOgotCSAgYXZhbCB8PSA4OwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgZGVmX3NlY3Rpb24gKG5hbWUsIGF2YWwpOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX2V4cG9ydHMgKGV4dGVybmFsX25hbWUsIGludGVybmFsX25hbWUsIG9yZGluYWwsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpleHRlcm5hbF9uYW1lOwotICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotICAgICBpbnQgb3JkaW5hbDsKLSAgICAgaW50IGZsYWdzOwotewotICBkZWZfZmlsZV9leHBvcnQgKmRmZTsKLQotICBpZiAoIWludGVybmFsX25hbWUgJiYgZXh0ZXJuYWxfbmFtZSkKLSAgICBpbnRlcm5hbF9uYW1lID0gZXh0ZXJuYWxfbmFtZTsKLSNpZiBUUkFDRQotICBwcmludGYgKCJkZWZfZXhwb3J0cywgZXh0PSVzIGludD0lc1xuIiwgZXh0ZXJuYWxfbmFtZSwgaW50ZXJuYWxfbmFtZSk7Ci0jZW5kaWYKLQotICBkZmUgPSBkZWZfZmlsZV9hZGRfZXhwb3J0IChkZWYsIGV4dGVybmFsX25hbWUsIGludGVybmFsX25hbWUsIG9yZGluYWwpOwotICBpZiAoZmxhZ3MgJiAxKQotICAgIGRmZS0+ZmxhZ19ub25hbWUgPSAxOwotICBpZiAoZmxhZ3MgJiAyKQotICAgIGRmZS0+ZmxhZ19jb25zdGFudCA9IDE7Ci0gIGlmIChmbGFncyAmIDQpCi0gICAgZGZlLT5mbGFnX2RhdGEgPSAxOwotICBpZiAoZmxhZ3MgJiA4KQotICAgIGRmZS0+ZmxhZ19wcml2YXRlID0gMTsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9pbXBvcnQgKGludGVybmFsX25hbWUsIG1vZHVsZSwgZGxsZXh0LCBuYW1lLCBvcmRpbmFsKQotICAgICBjb25zdCBjaGFyICppbnRlcm5hbF9uYW1lOwotICAgICBjb25zdCBjaGFyICptb2R1bGU7Ci0gICAgIGNvbnN0IGNoYXIgKmRsbGV4dDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IG9yZGluYWw7Ci17Ci0gIGNoYXIgKmJ1ZiA9IDA7Ci0KLSAgaWYgKGRsbGV4dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAobW9kdWxlKSArIHN0cmxlbiAoZGxsZXh0KSArIDIpOwotICAgICAgc3ByaW50ZiAoYnVmLCAiJXMuJXMiLCBtb2R1bGUsIGRsbGV4dCk7Ci0gICAgICBtb2R1bGUgPSBidWY7Ci0gICAgfQotCi0gIGRlZl9maWxlX2FkZF9pbXBvcnQgKGRlZiwgbmFtZSwgbW9kdWxlLCBvcmRpbmFsLCBpbnRlcm5hbF9uYW1lKTsKLSAgaWYgKGJ1ZikKLSAgICBmcmVlIChidWYpOwotfQotCi1zdGF0aWMgdm9pZAotZGVmX3ZlcnNpb24gKG1ham9yLCBtaW5vcikKLSAgICAgaW50IG1ham9yOwotICAgICBpbnQgbWlub3I7Ci17Ci0gIGRlZi0+dmVyc2lvbl9tYWpvciA9IG1ham9yOwotICBkZWYtPnZlcnNpb25fbWlub3IgPSBtaW5vcjsKLX0KLQotc3RhdGljIHZvaWQKLWRlZl9kaXJlY3RpdmUgKHN0cikKLSAgICAgY2hhciAqc3RyOwotewotICBzdHJ1Y3QgZGlyZWN0aXZlICpkID0gKHN0cnVjdCBkaXJlY3RpdmUgKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGlyZWN0aXZlKSk7Ci0gIGQtPm5leHQgPSBkaXJlY3RpdmVzOwotICBkaXJlY3RpdmVzID0gZDsKLSAgZC0+bmFtZSA9IHhzdHJkdXAgKHN0cik7Ci0gIGQtPmxlbiA9IHN0cmxlbiAoc3RyKTsKLX0KLQotc3RhdGljIGludAotZGVmX2Vycm9yIChlcnIpCi0gICAgIGNvbnN0IGNoYXIgKmVycjsKLXsKLSAgZWluZm8gKCIlUDogJXM6JWQ6ICVzXG4iLCBkZWZfZmlsZW5hbWUsIGxpbmVudW1iZXIsIGVycik7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gTGV4aWNhbCBTY2FubmVyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSN1bmRlZiBUUkFDRQotI2RlZmluZSBUUkFDRSAwCi0KLS8qIE5ldmVyIGZyZWVkLCBidXQgYWx3YXlzIHJldXNlZCBhcyBuZWVkZWQsIHNvIG5vIHJlYWwgbGVhayAqLwotc3RhdGljIGNoYXIgKmJ1ZmZlciA9IDA7Ci1zdGF0aWMgaW50IGJ1ZmxlbiA9IDA7Ci1zdGF0aWMgaW50IGJ1ZnB0ciA9IDA7Ci0KLXN0YXRpYyB2b2lkCi1wdXRfYnVmIChjKQotICAgICBjaGFyIGM7Ci17Ci0gIGlmIChidWZwdHIgPT0gYnVmbGVuKQotICAgIHsKLSAgICAgIGJ1ZmxlbiArPSA1MDsJCS8qIG92ZXJseSByZWFzb25hYmxlLCBlaD8gKi8KLSAgICAgIGlmIChidWZmZXIpCi0JYnVmZmVyID0gKGNoYXIgKikgeHJlYWxsb2MgKGJ1ZmZlciwgYnVmbGVuICsgMSk7Ci0gICAgICBlbHNlCi0JYnVmZmVyID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmbGVuICsgMSk7Ci0gICAgfQotICBidWZmZXJbYnVmcHRyKytdID0gYzsKLSAgYnVmZmVyW2J1ZnB0cl0gPSAwOwkJLyogbm90IG9wdGltYWwsIGJ1dCB2ZXJ5IGNvbnZlbmllbnQgKi8KLX0KLQotc3RhdGljIHN0cnVjdAotewotICBjaGFyICpuYW1lOwotICBpbnQgdG9rZW47Ci19Ci10b2tlbnNbXSA9Ci17Ci0gIHsgIkJBU0UiLCBCQVNFIH0sCi0gIHsgIkNPREUiLCBDT0RFIH0sCi0gIHsgIkNPTlNUQU5UIiwgQ09OU1RBTlQgfSwKLSAgeyAiREFUQSIsIERBVEEgfSwKLSAgeyAiREVTQ1JJUFRJT04iLCBERVNDUklQVElPTiB9LAotICB7ICJESVJFQ1RJVkUiLCBESVJFQ1RJVkUgfSwKLSAgeyAiRVhFQ1VURSIsIEVYRUNVVEUgfSwKLSAgeyAiRVhQT1JUUyIsIEVYUE9SVFMgfSwKLSAgeyAiSEVBUFNJWkUiLCBIRUFQU0laRSB9LAotICB7ICJJTVBPUlRTIiwgSU1QT1JUUyB9LAotICB7ICJMSUJSQVJZIiwgTElCUkFSWSB9LAotICB7ICJOQU1FIiwgTkFNRSB9LAotICB7ICJOT05BTUUiLCBOT05BTUUgfSwKLSAgeyAiUFJJVkFURSIsIFBSSVZBVEUgfSwKLSAgeyAiUkVBRCIsIFJFQUQgfSwKLSAgeyAiU0VDVElPTlMiLCBTRUNUSU9OUyB9LAotICB7ICJTRUdNRU5UUyIsIFNFQ1RJT05TIH0sCi0gIHsgIlNIQVJFRCIsIFNIQVJFRCB9LAotICB7ICJTVEFDS1NJWkUiLCBTVEFDS1NJWkUgfSwKLSAgeyAiVkVSU0lPTiIsIFZFUlNJT05LIH0sCi0gIHsgIldSSVRFIiwgV1JJVEUgfSwKLSAgeyAwLCAwIH0KLX07Ci0KLXN0YXRpYyBpbnQKLWRlZl9nZXRjICgpCi17Ci0gIGludCBydjsKLSAgaWYgKGxleF9wYXJzZV9zdHJpbmcpCi0gICAgewotICAgICAgaWYgKGxleF9wYXJzZV9zdHJpbmcgPj0gbGV4X3BhcnNlX3N0cmluZ19lbmQpCi0JcnYgPSBFT0Y7Ci0gICAgICBlbHNlCi0JcnYgPSAqbGV4X3BhcnNlX3N0cmluZysrOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHJ2ID0gZmdldGMgKHRoZV9maWxlKTsKLSAgICB9Ci0gIGlmIChydiA9PSAnXG4nKQotICAgIHNhd19uZXdsaW5lID0gMTsKLSAgcmV0dXJuIHJ2OwotfQotCi1zdGF0aWMgaW50Ci1kZWZfdW5nZXRjIChjKQotICAgICBpbnQgYzsKLXsKLSAgaWYgKGxleF9wYXJzZV9zdHJpbmcpCi0gICAgewotICAgICAgbGV4X3BhcnNlX3N0cmluZy0tOwotICAgICAgcmV0dXJuIGM7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuIHVuZ2V0YyAoYywgdGhlX2ZpbGUpOwotfQotCi1zdGF0aWMgaW50Ci1kZWZfbGV4ICgpCi17Ci0gIGludCBjLCBpLCBxOwotCi0gIGlmIChsZXhfZm9yY2VkX3Rva2VuKQotICAgIHsKLSAgICAgIGkgPSBsZXhfZm9yY2VkX3Rva2VuOwotICAgICAgbGV4X2ZvcmNlZF90b2tlbiA9IDA7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogZm9yY2luZyB0b2tlbiAlZFxuIiwgaSk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBpOwotICAgIH0KLQotICBjID0gZGVmX2dldGMgKCk7Ci0KLSAgLyogdHJpbSBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgd2hpbGUgKGMgIT0gRU9GICYmIChjID09ICcgJyB8fCBjID09ICdcdCcpICYmIHNhd19uZXdsaW5lKQotICAgIGMgPSBkZWZfZ2V0YyAoKTsKLQotICBpZiAoYyA9PSBFT0YpCi0gICAgewotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IEVPRlxuIik7Ci0jZW5kaWYKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICBpZiAoc2F3X25ld2xpbmUgJiYgYyA9PSAnOycpCi0gICAgewotICAgICAgZG8KLQl7Ci0JICBjID0gZGVmX2dldGMgKCk7Ci0JfQotICAgICAgd2hpbGUgKGMgIT0gRU9GICYmIGMgIT0gJ1xuJyk7Ci0gICAgICBpZiAoYyA9PSAnXG4nKQotCXJldHVybiBkZWZfbGV4ICgpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAvKiBtdXN0IGJlIHNvbWV0aGluZyBlbHNlICovCi0gIHNhd19uZXdsaW5lID0gMDsKLQotICBpZiAoaXNkaWdpdCAoYykpCi0gICAgewotICAgICAgYnVmcHRyID0gMDsKLSAgICAgIHdoaWxlIChjICE9IEVPRiAmJiAoaXN4ZGlnaXQgKGMpIHx8IChjID09ICd4JykpKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIGlmIChjICE9IEVPRikKLQlkZWZfdW5nZXRjIChjKTsKLSAgICAgIHl5bHZhbC5udW1iZXIgPSBzdHJ0b3VsIChidWZmZXIsIDAsIDApOwotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBOVU1CRVIgJWRcbiIsIGJ1ZmZlciwgeXlsdmFsLm51bWJlcik7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBOVU1CRVI7Ci0gICAgfQotCi0gIGlmIChpc2FscGhhIChjKSB8fCBzdHJjaHIgKCIkOi1fPyIsIGMpKQotICAgIHsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgKGlzYWxudW0gKGMpIHx8IHN0cmNociAoIiQ6LV8/L0AiLCBjKSkpCi0JewotCSAgcHV0X2J1ZiAoYyk7Ci0JICBjID0gZGVmX2dldGMgKCk7Ci0JfQotICAgICAgaWYgKGMgIT0gRU9GKQotCWRlZl91bmdldGMgKGMpOwotICAgICAgZm9yIChpID0gMDsgdG9rZW5zW2ldLm5hbWU7IGkrKykKLQlpZiAoc3RyY21wICh0b2tlbnNbaV0ubmFtZSwgYnVmZmVyKSA9PSAwKQotCSAgewotI2lmIFRSQUNFCi0JICAgIHByaW50ZiAoImxleDogYCVzJyBpcyBhIHN0cmluZyB0b2tlblxuIiwgYnVmZmVyKTsKLSNlbmRpZgotCSAgICByZXR1cm4gdG9rZW5zW2ldLnRva2VuOwotCSAgfQotI2lmIFRSQUNFCi0gICAgICBwcmludGYgKCJsZXg6IGAlcycgcmV0dXJucyBJRFxuIiwgYnVmZmVyKTsKLSNlbmRpZgotICAgICAgeXlsdmFsLmlkID0geHN0cmR1cCAoYnVmZmVyKTsKLSAgICAgIHJldHVybiBJRDsKLSAgICB9Ci0KLSAgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykKLSAgICB7Ci0gICAgICBxID0gYzsKLSAgICAgIGMgPSBkZWZfZ2V0YyAoKTsKLSAgICAgIGJ1ZnB0ciA9IDA7Ci0gICAgICB3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSBxKQotCXsKLQkgIHB1dF9idWYgKGMpOwotCSAgYyA9IGRlZl9nZXRjICgpOwotCX0KLSAgICAgIHl5bHZhbC5pZCA9IHhzdHJkdXAgKGJ1ZmZlcik7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogYCVzJyByZXR1cm5zIElEXG4iLCBidWZmZXIpOwotI2VuZGlmCi0gICAgICByZXR1cm4gSUQ7Ci0gICAgfQotCi0gIGlmIChjID09ICc9JyB8fCBjID09ICcuJyB8fCBjID09ICdAJyB8fCBjID09ICcsJykKLSAgICB7Ci0jaWYgVFJBQ0UKLSAgICAgIHByaW50ZiAoImxleDogYCVjJyByZXR1cm5zIGl0c2VsZlxuIiwgYyk7Ci0jZW5kaWYKLSAgICAgIHJldHVybiBjOwotICAgIH0KLQotICBpZiAoYyA9PSAnXG4nKQotICAgIHsKLSAgICAgIGxpbmVudW1iZXIrKzsKLSAgICAgIHNhd19uZXdsaW5lID0gMTsKLSAgICB9Ci0KLSAgLypwcmludGYgKCJsZXg6IDB4JTAyeCBpZ25vcmVkXG4iLCBjKTsgKi8KLSAgcmV0dXJuIGRlZl9sZXggKCk7Ci19CmRpZmYgLS1naXQgYS9sZC9kZXAtaW4uc2VkIGIvbGQvZGVwLWluLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4MGViMC4uMDAwMDAwMAotLS0gYS9sZC9kZXAtaW4uc2VkCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotOmxvb3AKLS9cXCQvTgotL1xcJC9iIGxvb3AKLQotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAU1JDRElSQC8hIWcKLXMhXC5cLi9iZmQvaG9zdHMvW14gXSpcLmggISAhZwotCi1zL1xcXG4gKi8gL2cKLQotcy8gKiQvLwotcy8gICovIC9nCi0vOiQvZAotCi1zL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAotICAvZwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9SRUFETUUgYi9sZC9lbXVscGFyYW1zL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNkNmQyNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZSByZWFkIGJ5IGdlbnNjcmlwdHMuc2ggYXMgc2hlbGwgY29tbWFuZHMuCi1UaGV5IHNldCBwYXJhbWV0ZXJzIGZvciB0aGUgZW11bGF0aW9ucy4KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYTI5ay5zaCBiL2xkL2VtdWxwYXJhbXMvYTI5ay5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljOGU4NS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2EyOWsuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWEyOWsKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1hMjlrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FpeHBwYy5zaCBiL2xkL2VtdWxwYXJhbXMvYWl4cHBjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlNjg2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYWl4cHBjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1URU1QTEFURV9OQU1FPWFpeAotU0NSSVBUX05BTUU9YWl4Ci1PVVRQVVRfRk9STUFUPSJhaXhjb2ZmLXJzNjAwMCIKLUFSQ0g9cG93ZXJwYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9haXhyczYuc2ggYi9sZC9lbXVscGFyYW1zL2FpeHJzNi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzYzNmNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FpeHJzNi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVEVNUExBVEVfTkFNRT1haXgKLVNDUklQVF9OQU1FPWFpeAotT1VUUFVUX0ZPUk1BVD0iYWl4Y29mZi1yczYwMDAiCi1BUkNIPXJzNjAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hbHBoYS5zaCBiL2xkL2VtdWxwYXJhbXMvYWxwaGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTkyM2YuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hbHBoYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotU0NSSVBUX05BTUU9YWxwaGEKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZWFscGhhIgotQVJDSD1hbHBoYQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcmNlbGYuc2ggYi9sZC9lbXVscGFyYW1zL2FyY2VsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFjOWMxNy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FyY2VsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJjIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFyYyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcmMiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1NQVhQQUdFU0laRT0weDEwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9YXJjCi1NQUNISU5FPQotRU5UUlk9c3RhcnQKLSNURU1QTEFURV9OQU1FPWVsZjMyCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1fZXBvY19wZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2ZmEyYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybV9lcG9jX3BlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9cGUKLU9VVFBVVF9GT1JNQVQ9ImVwb2MtcGVpLWFybS1saXR0bGUiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZXBvYy1wZWktYXJtLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJlcG9jLXBlaS1hcm0tYmlnIgotVEVNUExBVEVfTkFNRT1wZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaCBiL2xkL2VtdWxwYXJhbXMvYXJtYW91dGIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YWI2ZjEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1hb3V0Yi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YXJtYW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtYXJtLWJpZyIKLUhFQURFUl9TVEFSVF9BRERSPTB4ODAwMAotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSRVNTPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0zMjc2OAotQVJDSD1hcm0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGwuc2ggYi9sZC9lbXVscGFyYW1zL2FybWFvdXRsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAxZjMzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtYW91dGwuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFybWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWFybS1saXR0bGUiCi1IRUFERVJfU1RBUlRfQUREUj0weDgwMDAKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUkVTUz0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MzI3NjgKLUFSQ0g9YXJtCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2FybWNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZGY3ZDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1jb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9YXJtY29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImNvZmYtYXJtLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJjb2ZmLWFybS1iaWciCi1URU1QTEFURV9OQU1FPWFybWNvZmYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODRiNWUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9hcm1lbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnYXJtIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRFTVBMQVRFX05BTUU9YXJtZWxmCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5nbHVlXzd0KSAqKC5nbHVlXzcpJwotT1RIRVJfQlNTX1NZTUJPTFM9J19fYnNzX3N0YXJ0X18gPSAuOycKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0nX2Jzc19lbmRfXyA9IC4gOyBfX2Jzc19lbmRfXyA9IC4gOycKLQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotCi1BUkNIPWFybQotTUFDSElORT0KLU1BWFBBR0VTSVpFPTI1NgotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLQotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXguc2ggYi9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkNzQwYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLUFSQ0g9YXJtCi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZWFybSIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcm0iCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotTUFYUEFHRVNJWkU9MHg4MDAwCi1URU1QTEFURV9OQU1FPWFybWVsZgotCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0KLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLmdsdWVfN3QpICooLmdsdWVfNyknCi1PVEhFUl9CU1NfU1lNQk9MUz0nX19ic3Nfc3RhcnRfXyA9IC47JwotT1RIRVJfQlNTX0VORF9TWU1CT0xTPSdfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7JwotCi0jIFRoaXMgbmVlZHMgdG8gYmUgaGlnaCBlbm91Z2ggc28gdGhhdCB3ZSBjYW4gbG9hZCBsZC5zbyBiZWxvdyBpdCwKLSMgeWV0IGxvdyBlbm91Z2ggdG8gc3RheSBhd2F5IGZyb20gdGhlIG1tYXAgYXJlYSAweDQwMDAwMDAwLgotIyBBbHNvLCBpdCBpcyBzbWFsbCBlbm91Z2ggc28gdGhhdCByZWxvY3Mgd2hpY2ggYXJlIHBvaW50aW5nCi0jIGF0IGFic29sdXRlIDAgd2lsbCBzdGlsbCBiZSBmaXhlZCB1cC4KLVRFWFRfU1RBUlRfQUREUj0weDAyMDAwMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoIGIvbGQvZW11bHBhcmFtcy9hcm1lbGZfbGludXgyNi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1M2RkYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybWVsZl9saW51eDI2LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotQVJDSD1hcm0KLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlYXJtIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ2FybSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0iCi1NQVhQQUdFU0laRT0weDgwMDAKLVRFTVBMQVRFX05BTUU9YXJtZWxmCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi0KLSMgVGhpcyBuZWVkcyB0byBiZSBoaWdoIGVub3VnaCBzbyB0aGF0IHdlIGNhbiBsb2FkIGxkLnNvIGJlbG93IGl0LAotIyB5ZXQgbG93IGVub3VnaCB0byBzdGF5IGF3YXkgZnJvbSB0aGUgbW1hcCBhcmVhIGF0IDB4MDExMDAwMDAuCi0jIEFsc28sIGl0IGlzIHNtYWxsIGVub3VnaCBzbyB0aGF0IHJlbG9jcyB3aGljaCBhcmUgcG9pbnRpbmcKLSMgYXQgYWJzb2x1dGUgMCB3aWxsIHN0aWxsIGJlIGZpeGVkIHVwLgotIyBUaGVzZSB2YWx1ZXMgZ2l2ZSB1cyBhYm91dCAwLjVNQiBmb3IgbGQuc28sIDE2LjVNQiBmb3IgdXNlciAKLSMgcHJvZ3JhbXMsIGFuZCAxNU1CIGZvciBtbWFwIHdoaWNoIHNlZW1zIGEgcmVhc29uYWJsZSBjb21wcm9taXNlLgotVEVYVF9TVEFSVF9BRERSPTB4MDAwODAwMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2ggYi9sZC9lbXVscGFyYW1zL2FybWVsZl9vYWJpLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY4MzI4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvYXJtZWxmX29hYmkuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0tb2FiaSIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdhcm0tb2FiaSIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVhcm0tb2FiaSIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRFTVBMQVRFX05BTUU9YXJtZWxmX29hYmkKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLmdsdWVfN3QpICooLmdsdWVfNyknCi1PVEhFUl9CU1NfU1lNQk9MUz0nX19ic3Nfc3RhcnRfXyA9IC47JwotT1RIRVJfQlNTX0VORF9TWU1CT0xTPSdfYnNzX2VuZF9fID0gLiA7IF9fYnNzX2VuZF9fID0gLiA7JwotIAotIAotQVJDSD1hcm0KLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0yNTYKLUVOVFJZPV9zdGFydAotRU1CRURERUQ9eWVzCi0gCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2FybXBlLnNoIGIvbGQvZW11bHBhcmFtcy9hcm1wZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0NjgwNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2FybXBlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1BUkNIPWFybQotU0NSSVBUX05BTUU9cGUKLU9VVFBVVF9GT1JNQVQ9InBlaS1hcm0tbGl0dGxlIgotTElUVExFX09VVFBVVF9GT1JNQVQ9InBlaS1hcm0tbGl0dGxlIgotQklHX09VVFBVVF9GT1JNQVQ9InBlaS1hcm0tYmlnIgotVEVNUExBVEVfTkFNRT1wZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoIGIvbGQvZW11bHBhcmFtcy9jb2ZmX3NwYXJjLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2Y4NTJhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvY29mZl9zcGFyYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9c3BhcmNjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXNwYXJjIgotIyBmb2xsb3dpbmcgYXJlIGR1YmlvdXMgKGJvcnJvd2VkIGZyb20gc3BhcmMgbHlueCkKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9kMTB2ZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9kMTB2ZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NlNTFmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZDEwdmVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZmQxMHYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWQxMHYiCi1URVhUX1NUQVJUX0FERFI9MHgwMTAwMDAwMAotUkVBRE9OTFlfU1RBUlRfQUREUj0weDAwMDAwMDA0Ci1BUkNIPWQxMHYKLU1BWFBBR0VTSVpFPTMyCi1FTUJFRERFRD10Ci1URU1QTEFURV9OQU1FPWVsZjMyCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QzMHZfZS5zaCBiL2xkL2VtdWxwYXJhbXMvZDMwdl9lLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGFiNWEyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZDMwdl9lLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZmQzMHYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWQzMHYiCi1URVhUX1NUQVJUX0FERFI9MHgwMDAwMDAwMAotREFUQV9TVEFSVF9BRERSPTB4MjAwMDAwMDAKLUVNRU1fU1RBUlRfQUREUj0weDgwMDAwMDAwCi1TVEFDS19TVEFSVF9BRERSPTB4MjAwMDgwMDAKLUVJVF9TVEFSVF9BRERSPTB4ZmZmZmYwMjAKLVRFWFRfU0laRT02NEsKLURBVEFfU0laRT0zMksKLUVNRU1fU0laRT04TQotRUlUX1NJWkU9MzIwCi1URVhUX01FTU9SWT1lbWVtCi1EQVRBX01FTU9SWT1lbWVtCi1CU1NfTUVNT1JZPWVtZW0KLVRFWFRfREVGX1NFQ1RJT049IiIKLURBVEFfREVGX1NFQ1RJT049IiIKLUVNRU1fREVGX1NFQ1RJT049Iihyd3gpIgotQVJDSD1kMzB2Ci1FTUJFRERFRD10CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2QzMHZfby5zaCBiL2xkL2VtdWxwYXJhbXMvZDMwdl9vLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2JjYjQyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZDMwdl9vLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPWVsZmQzMHYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWQzMHYiCi1URVhUX1NUQVJUX0FERFI9MHgwMDAwMDAwMAotREFUQV9TVEFSVF9BRERSPTB4MjAwMDAwMDAKLUVNRU1fU1RBUlRfQUREUj0weDgwMDAwMDAwCi1TVEFDS19TVEFSVF9BRERSPTB4MjAwMDgwMDAKLUVJVF9TVEFSVF9BRERSPTB4ZmZmZmYwMjAKLVRFWFRfU0laRT02NEsKLURBVEFfU0laRT0zMksKLUVNRU1fU0laRT04TQotRUlUX1NJWkU9MzIwCi1URVhUX01FTU9SWT10ZXh0Ci1EQVRBX01FTU9SWT1kYXRhCi1CU1NfTUVNT1JZPWRhdGEKLVRFWFRfREVGX1NFQ1RJT049Iih4KSIKLURBVEFfREVGX1NFQ1RJT049IihydykiCi1FTUVNX0RFRl9TRUNUSU9OPSIiCi1BUkNIPWQzMHYKLUVNQkVEREVEPXQKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZDMwdmVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvZDMwdmVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5ZGU3OC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2QzMHZlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmZDMwdgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItZDMwdiIKLVRFWFRfU1RBUlRfQUREUj0weDAwMDAwMDAwCi1EQVRBX1NUQVJUX0FERFI9MHgyMDAwMDAwMAotRU1FTV9TVEFSVF9BRERSPTB4ODAwMDAwMDAKLVNUQUNLX1NUQVJUX0FERFI9MHgyMDAwODAwMAotRUlUX1NUQVJUX0FERFI9MHhmZmZmZjAyMAotVEVYVF9TSVpFPTIwMDBLCi1EQVRBX1NJWkU9MjAwMEsKLUVNRU1fU0laRT04TQotRUlUX1NJWkU9MzIwCi1URVhUX01FTU9SWT10ZXh0Ci1EQVRBX01FTU9SWT1kYXRhCi1CU1NfTUVNT1JZPWRhdGEKLVRFWFRfREVGX1NFQ1RJT049Iih4KSIKLURBVEFfREVGX1NFQ1RJT049IihydykiCi1FTUVNX0RFRl9TRUNUSU9OPSIiCi1BUkNIPWQzMHYKLUVNQkVEREVEPXQKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZGVsdGE2OC5zaCBiL2xkL2VtdWxwYXJhbXMvZGVsdGE2OC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjNTkwOS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2RlbHRhNjguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWRlbHRhNjgKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ay1zeXN2IgotVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VibW9uMjlrLnNoIGIvbGQvZW11bHBhcmFtcy9lYm1vbjI5ay5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjMmJkMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VibW9uMjlrLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lYm1vbjI5awotT1VUUFVUX0ZPUk1BVD0iY29mZi1hMjlrLWJpZyIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPWEyOWsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJfaTk2MC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJfaTk2MC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYzNmYS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyX2k5NjAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTk2MCIKLUFSQ0g9aTk2MAotTUFDSElORT0KLVRFWFRfU1RBUlRfQUREUj0wCi1FTUJFRERFRD15ZXMKLU1BWFBBR0VTSVpFPTB4MjAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJfc3BhcmMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZTIzMjYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMl9zcGFyYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItc3BhcmMiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLUFMSUdOTUVOVD04Ci1BUkNIPXNwYXJjCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotREFUQV9QTFQ9Ci1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMyYjQzMDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjhkOTguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmI0MzAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weGEwMDIwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLUVYRUNVVEFCTEVfU1lNQk9MUz0nX0RZTkFNSUNfTElOSyA9IDA7JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLURZTkFNSUNfTElOSz1mYWxzZQotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMyYm1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzNjNDExLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJibWlwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLVRFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLURBVEFfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1TSExJQl9URVhUX1NUQVJUX0FERFI9MHg1ZmZlMDAwMAotVEVYVF9EWU5BTUlDPQotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1PVEhFUl9TRUNUSU9OUz0nCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH0KLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfQotJwotQVJDSD1taXBzCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmJzbWlwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWYxMzA3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJic21pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLUVOVFJZPV9fc3RhcnQKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJlYm1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBlYThmZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyZWJtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWJpZ21pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJlbG1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwMDhjOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMyZWxtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJmcjMwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFiZTFmNTMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmZyMzAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1mcjMwIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAKLUFSQ0g9ZnIzMAotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotTk9QPTB4OWZhMAotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nUFJPVklERSAoX19zdGFjayA9IDB4MjAwMDAwKTsnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmw0MzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTBkZTg4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsNDMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHhhMDAyMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCi1PVEhFUl9URVhUX1NFQ1RJT05TPScqKC5taXBzMTYuZm4uKikgKigubWlwczE2LmNhbGwuKiknCi1PVEhFUl9HT1RfU1lNQk9MUz0nCi0gIF9ncCA9IEFMSUdOKDE2KSArIDB4N2ZmMDsKLScKLU9USEVSX0dPVF9TRUNUSU9OUz0nCi0gIC5saXQ4IDogeyAqKC5saXQ4KSB9Ci0gIC5saXQ0IDogeyAqKC5saXQ0KSB9Ci0nCi1URVhUX1NUQVJUX1NZTUJPTFM9J19mdGV4dCA9IC4gOycKLURBVEFfU1RBUlRfU1lNQk9MUz0nX2ZkYXRhID0gLiA7JwotT1RIRVJfQlNTX1NZTUJPTFM9J19mYnNzID0gLjsnCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19EWU5BTUlDX0xJTksgPSAwOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1EWU5BTUlDX0xJTks9ZmFsc2UKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMmxtaXAuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybG1pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzMTJmNC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybG1pcC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlbGYzMi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotU0hMSUJfVEVYVF9TVEFSVF9BRERSPTB4NWZmZTAwMDAKLVRFWFRfRFlOQU1JQz0KLUlOSVRJQUxfUkVBRE9OTFlfU0VDVElPTlM9Jy5yZWdpbmZvIDogeyAqKC5yZWdpbmZvKSB9JwotT1RIRVJfVEVYVF9TRUNUSU9OUz0nKigubWlwczE2LmZuLiopICooLm1pcHMxNi5jYWxsLiopJwotT1RIRVJfR09UX1NZTUJPTFM9JwotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7Ci0nCi1PVEhFUl9HT1RfU0VDVElPTlM9JwotICAubGl0OCA6IHsgKigubGl0OCkgfQotICAubGl0NCA6IHsgKigubGl0NCkgfQotJwotVEVYVF9TVEFSVF9TWU1CT0xTPSdfZnRleHQgPSAuIDsnCi1EQVRBX1NUQVJUX1NZTUJPTFM9J19mZGF0YSA9IC4gOycKLU9USEVSX0JTU19TWU1CT0xTPSdfZmJzcyA9IC47JwotT1RIRVJfU0VDVElPTlM9JwotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9Ci0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH0KLScKLUFSQ0g9bWlwcwotTUFDSElORT0KLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJscHBjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZmZjNjEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMmxwcGMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZnBwYwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwY2xlIgotVEVYVF9TVEFSVF9BRERSPTB4NDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLUFSQ0g9cG93ZXJwYwotTUFDSElORT0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJsc21pcC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkYzhhMS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMybHNtaXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlbGYzMi1saXR0bGVtaXBzIgotVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotREFUQV9BRERSPTB4MTAwMDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA0MDAwMDAKLVNITElCX1RFWFRfU1RBUlRfQUREUj0weDVmZmUwMDAwCi1URVhUX0RZTkFNSUM9Ci1JTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TPScucmVnaW5mbyA6IHsgKigucmVnaW5mbykgfScKLU9USEVSX1RFWFRfU0VDVElPTlM9JyooLm1pcHMxNi5mbi4qKSAqKC5taXBzMTYuY2FsbC4qKScKLU9USEVSX0dPVF9TWU1CT0xTPScKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwOwotJwotT1RIRVJfR09UX1NFQ1RJT05TPScKLSAgLmxpdDggOiB7ICooLmxpdDgpIH0KLSAgLmxpdDQgOiB7ICooLmxpdDQpIH0KLScKLVRFWFRfU1RBUlRfU1lNQk9MUz0nX2Z0ZXh0ID0gLiA7JwotREFUQV9TVEFSVF9TWU1CT0xTPSdfZmRhdGEgPSAuIDsnCi1PVEhFUl9CU1NfU1lNQk9MUz0nX2Zic3MgPSAuOycKLU9USEVSX1NFQ1RJT05TPScKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfQotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9Ci0nCi1BUkNIPW1pcHMKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTlRSWT1fX3N0YXJ0CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2ggYi9sZC9lbXVscGFyYW1zL2VsZjMybWNvcmUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWZkYWUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMm1jb3JlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tY29yZS1iaWciCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItbWNvcmUtYmlnIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVsZjMyLW1jb3JlLWxpdHRsZSIKLVBBR0VfU0laRT0weDEwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHg0MDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCi1BUkNIPW1jb3JlCi1FTUJFRERFRD15ZXMKLQotIyBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgTk9QIHZhbHVlIC0gaXQgbXVzdCB3b3JrIGZvciBib3RoCi0jIGJpZyBlbmRpYW4gYW5kIGxpdHRsZSBlbmRpYW4gc3lzdGVtcy4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMKLSMgbm8gc3ltbWV0cmljYWwgbWNvcmUgb3Bjb2RlIHRoYXQgZnVuY3Rpb25zIGFzIGEgbm9vcC4gIFRoZQotIyBjaG9zZW4gc29sdXRpb24gaXMgdG8gdXNlICJ0c3QgcjAsIHIxNCIuICBUaGlzIGlzIGEgc3ltZXRyaWNhbAotIyB2YWx1ZSwgYW5kIGFwYXJ0IGZyb20gdGhlIGNvcnJ1cHRpb24gb2YgdGhlIEMgYml0LCBpdCBoYXMgbm8gb3RoZXIKLSMgc2lkZSBlZmZlY3RzLiAgU2luY2UgdGhlIGNhcnJ5IGJpdCBpcyBuZXZlciB0ZXN0ZWQgd2l0aG91dCBiZWluZwotIyBleHBsaWNpdGx5IHNldCBmaXJzdCwgYW5kIHNpbmNlIHRoZSBOT1AgY29kZSBpcyBvbmx5IHVzZWQgYXMgYQotIyBmaWxsIHZhbHVlIGJldHdlZW4gaW5kZXBlbmRhbnRseSB2aWFibGUgcGVpY2VzIG9mIGNvZGUsIGl0IHNob3VsZAotIyBub3QgbWF0dGVyLgotTk9QPTB4MGUwZQotCi1PVEhFUl9CU1NfU1lNQk9MUz0iX19ic3Nfc3RhcnRfXyA9IC4gOyIKLU9USEVSX0JTU19FTkRfU1lNQk9MUz0iX19ic3NfZW5kX18gPSAuIDsiCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5ICgyXjE5IGJ5dGVzKS4KLU9USEVSX1JFTE9DQVRJTkdfU0VDVElPTlM9Jy5zdGFjayAweDgwMDAwIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfScKLQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwYy5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZjQyZjEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9lbGYzMnBwYy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotU0NSSVBUX05BTUU9ZWxmcHBjCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1wb3dlcnBjIgotVEVYVF9TVEFSVF9BRERSPTB4MDE4MDAwMDAKLU1BWFBBR0VTSVpFPTB4NDAwMDAKLUFSQ0g9cG93ZXJwYwotTUFDSElORT0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvZWxmMzJwcGNsaW51eC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgwOGU0ZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjMycHBjbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKLVNDUklQVF9OQU1FPWVsZnBwYwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItcG93ZXJwYyIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAwCi1NQVhQQUdFU0laRT0weDQwMDAwCi1BUkNIPXBvd2VycGMKLU1BQ0hJTkU9CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NF9zcGFyYy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBmYmRmZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZjY0X3NwYXJjLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1FTEZTSVpFPTY0Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1PVVRQVVRfRk9STUFUPSJlbGY2NC1zcGFyYyIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwMAotQVJDSD0ic3BhcmM6djkiCi1NQUNISU5FPQotREFUQV9QTFQ9Ci1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1OT1A9MHgwMTAwMDAwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoIGIvbGQvZW11bHBhcmFtcy9lbGY2NGFscGhhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmEyMWYyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmNjRhbHBoYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUVOVFJZPV9fc3RhcnQKLVNDUklQVF9OQU1FPWVsZgotRUxGU0laRT02NAotVEVNUExBVEVfTkFNRT1lbGYzMgotT1VUUFVUX0ZPUk1BVD0iZWxmNjQtYWxwaGEiCi1URVhUX1NUQVJUX0FERFI9IjB4MTIwMDAwMDAwIgotTUFYUEFHRVNJWkU9MHgxMDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0iMHgxMjAwMDAwMDAiCi1BUkNIPWFscGhhCi1NQUNISU5FPQotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotREFUQV9QTFQ9Ci1OT1A9MHg0N2ZmMDQxZgotCi1PVEhFUl9SRUFET05MWV9TRUNUSU9OUz0nLnJlZ2luZm8gOiB7ICooLnJlZ2luZm8pIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2VsZl9pMzg2LnNoIGIvbGQvZW11bHBhcmFtcy9lbGZfaTM4Ni5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmNTY3Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2VsZl9pMzg2LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MDgwNDgwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDgwNDgwMDAKLUFSQ0g9aTM4NgotTUFDSElORT0KLU5PUD0weDkwOTAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2ggYi9sZC9lbXVscGFyYW1zL2VsZl9pMzg2X2JlLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTc3YTA2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZWxmX2kzODZfYmUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotI1NITElCX1RFWFRfU1RBUlRfQUREUj0weDgwMDAwMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotTUFYUEFHRVNJWkU9MHgxMDAwCi1BUkNIPWkzODYKLU1BQ0hJTkU9Ci1OT1A9MHg5MDkwCi1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2dsZDk2MC5zaCBiL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjgxYTc4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZ2xkOTYwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1pOTYwCi1PVVRQVVRfRk9STUFUPSIiCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9aTk2MAotVEVNUExBVEVfTkFNRT1nbGQ5NjAKLUdMRF9TVFlMRT0xCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL2dsZDk2MGNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjAyMjAuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9nbGQ5NjBjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotU0NSSVBUX05BTUU9aTk2MAotT1VUUFVUX0ZPUk1BVD0iIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPWk5NjAKLVRFTVBMQVRFX05BTUU9Z2xkOTYwYwotR0xEX1NUWUxFPTEKLUNPRkZfQ1RPUlM9JwotCV9fX0NUT1JfTElTVF9fID0gLjsKLQlMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpCi0JKiguY3RvcnMpCi0JTE9ORygwKQotCV9fX0NUT1JfRU5EX18gPSAuOwotCV9fX0RUT1JfTElTVF9fID0gLjsKLQlMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpCi0JKiguZHRvcnMpCi0JTE9ORygwKQotCV9fX0RUT1JfRU5EX18gPSAuOwotJwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9nbzMyLnNoIGIvbGQvZW11bHBhcmFtcy9nbzMyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTMzNTdmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvZ28zMi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9Z28zMmNvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtZ28zMiIKLVRFWFRfU1RBUlRfQUREUj0weDEwYTgKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1TRUdNRU5UX1NJWkU9MHgxMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPWkzODYKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDgzMDAuc2ggYi9sZC9lbXVscGFyYW1zL2g4MzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWViM2M0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDgzMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4MzAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4MzAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDgzMDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDgzMDBoLnNoIGIvbGQvZW11bHBhcmFtcy9oODMwMGguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjc5NGUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODMwMGguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4MzAwaAotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODMwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4MzAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4MzAwcy5zaCBiL2xkL2VtdWxwYXJhbXMvaDgzMDBzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjdiNGY1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDgzMDBzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODMwMHMKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDgzMDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODMwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODUwMC5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNGNhODAuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDg1MDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODUwMGIuc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwYi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkM2ZlZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwYi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDg1MDBiCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaDg1MDBjLnNoIGIvbGQvZW11bHBhcmFtcy9oODUwMGMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MGEwNjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9oODUwMGMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWg4NTAwYwotT1VUUFVUX0ZPUk1BVD0iY29mZi1oODUwMCIKLVRFWFRfU1RBUlRfQUREUj0weDgwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPWg4NTAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2g4NTAwbS5zaCBiL2xkL2VtdWxwYXJhbXMvaDg1MDBtLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDlmN2I2Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaDg1MDBtLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1oODUwMG0KLU9VVFBVVF9GT1JNQVQ9ImNvZmYtaDg1MDAiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1oODUwMApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9oODUwMHMuc2ggYi9sZC9lbXVscGFyYW1zL2g4NTAwcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllMjk0YS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2g4NTAwcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9aDg1MDBzCi1PVVRQVVRfRk9STUFUPSJjb2ZmLWg4NTAwIgotVEVYVF9TVEFSVF9BRERSPTB4ODAwMAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9aDg1MDAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaHAzMDBic2Quc2ggYi9sZC9lbXVscGFyYW1zL2hwMzAwYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjVjNTBiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaHAzMDBic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LWhwMzAwYnNkIgotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9NDA5NgotQVJDSD1tNjhrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2hwM2hwdXguc2ggYi9sZC9lbXVscGFyYW1zL2hwM2hwdXguc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmFkZDguLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9ocDNocHV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1ocDMwMGhwdXgiCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT00MDk2Ci1BUkNIPW02OGsKLVNUQUNLWkVSTz0iX19fc3RhY2tfemVybyA9IDB4MjAwMDsgX19EWU5BTUlDID0gMDsiCi0jIFRoaXMgaXMgbmVlZGVkIGZvciBIUFVYIDkuMDsgaXQgaXMgdW5uZWNlc3NhcnkgYnV0IGhhcm1sZXNzIGZvciA4LjAuCi1TSExJQl9QQVRIPSJfX19kbGRfc2hsaWJfcGF0aCA9IDA7IgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9ocHBhZWxmLnNoIGIvbGQvZW11bHBhcmFtcy9ocHBhZWxmLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2I4OWVhLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaHBwYWVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9aHBwYWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItaHBwYSIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAKLVRBUkdFVF9QQUdFX1NJWkU9NDA5NgotQVJDSD1ocHBhCi1TVEFSVD0iJFNUQVJUJCIKLVRFTVBMQVRFX05BTUU9aHBwYWVsZgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2YW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmFvdXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjOWU1NTQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2YW91dC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4NiIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZiZW9zLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2YmVvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODY5ZGE1Zi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZiZW9zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1BUkNIPWkzODYKLVNDUklQVF9OQU1FPWkzODZiZW9zCi1PVVRQVVRfRk9STUFUPSJwZWktaTM4NiIKLVJFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUPSJwZS1pMzg2IgotVEVNUExBVEVfTkFNRT1iZW9zCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZic2Quc2ggYi9sZC9lbXVscGFyYW1zL2kzODZic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzBlMmYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2YnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2LWJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2Y29mZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxN2I3ZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZjb2ZmLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1pMzg2Y29mZgotT1VUUFVUX0ZPUk1BVD0iY29mZi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9aTM4NgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9pMzg2Z28zMi5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmdvMzIuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjE2YzQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2Z28zMi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9aTM4NmdvMzIKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtZ28zMiIKLVRFWFRfU1RBUlRfQUREUj0weDEwYTgKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1TRUdNRU5UX1NJWkU9MHgyMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9aTM4NgotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZsaW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4NmxpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDE2NDIyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4NmxpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2LWxpbnV4IgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCi1BUkNIPWkzODYKLVRFTVBMQVRFX05BTUU9bGludXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2ggYi9sZC9lbXVscGFyYW1zL2kzODZseW54LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODhjMTc1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nmx5bnguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPWkzODZseW54Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLWkzODYtbHlueCIKLSMgVGhpcyBpcyB3aGF0IEx5bnhPUyAvbGliL2luaXQxLm8gd2FudHMuCi1FTlRSWT1fbWFpbgotIyBmb2xsb3dpbmcgYXJlIGR1YmlvdXMKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1URVhUX1NUQVJUX0FERFI9MAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZtYWNoLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bWFjaC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjYjI3Ni4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZtYWNoLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1tYWNoMyIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDIwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgxMDAwMAotU0VHTUVOVF9TSVpFPTB4MTAwMAotUEFEX1RFWFQ9dAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZtb3NzLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bW9zcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlMGUwNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZtb3NzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1pMzg2IgotVEVYVF9TVEFSVF9BRERSPTB4MDAwMDIwMDAKLU1BWFBBR0VTSVpFPTB4MTAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDAwMDIwMDAKLUFSQ0g9aTM4NgotTUFDSElORT0KLU5PUD0weDkwOTAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4Nm1zZG9zLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMTFmYTEuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2bXNkb3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWkzODZtc2RvcwotT1VUUFVUX0ZPUk1BVD0ibXNkb3MiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9MHgwCi1TRUdNRU5UX1NJWkU9MHgxMAotUEFEX1RFWFQ9dAotQVJDSD1pMzg2CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2bmJzZC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTllNmEzOC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL2kzODZuYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1URVhUX1NUQVJUX0FERFI9MHgxMDIwCi1PVVRQVVRfRk9STUFUPSJhLm91dC1pMzg2LW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPWkzODYKLUVYRUNVVEFCTEVfU1lNQk9MUz0nX19EWU5BTUlDID0gMDsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2kzODZudy5zaCBiL2xkL2VtdWxwYXJhbXMvaTM4Nm53LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzBlZDY3Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvaTM4Nm53LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1udwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDA4MDAwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDA4MDAwMDAwCi1BUkNIPWkzODYKLU5PUD0weDkwOTAKLVRFTVBMQVRFX05BTUU9ZWxmMzIKLUdFTkVSQVRFX1NITElCX1NDUklQVD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvaTM4NnBlLnNoIGIvbGQvZW11bHBhcmFtcy9pMzg2cGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OGE4YWQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9pMzg2cGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLUFSQ0g9aTM4NgotU0NSSVBUX05BTUU9cGUKLU9VVFBVVF9GT1JNQVQ9InBlaS1pMzg2IgotUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9InBlLWkzODYiCi1URU1QTEFURV9OQU1FPXBlCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL2xuazk2MC5zaCBiL2xkL2VtdWxwYXJhbXMvbG5rOTYwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2YzZmM0Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbG5rOTYwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1pOTYwCi1PVVRQVVRfRk9STUFUPSIiCi1URVhUX1NUQVJUX0FERFI9Pz8KLVRBUkdFVF9QQUdFX1NJWkU9Pz8KLUFSQ0g9aTk2MAotVEVNUExBVEVfTkFNRT1sbms5NjAKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTMycmVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvbTMycmVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3NzA1YS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL20zMnJlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1URU1QTEFURV9OQU1FPWVsZjMyCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tMzJyIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwCi1BUkNIPW0zMnIKLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0zMgotRU1CRURERUQ9eWVzCi0KLSMgSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSMgdG9wIG9mIHNpbXVsYXRvciBtZW1vcnkgKDhNQikuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPSdQUk9WSURFIChfc3RhY2sgPSAweDgwMDAwMCk7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrNGtuYnNkLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmMyNGMwZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGs0a25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW02OGs0ay1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotQVJDSD1tNjhrCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19fRFlOQU1JQyA9IDA7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrYW91dC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2FvdXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZmFhZjcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrYW91dC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtemVyby1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotU0VHTUVOVF9TSVpFPTB4MjAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDIwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrYXV4LnNoIGIvbGQvZW11bHBhcmFtcy9tNjhrYXV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWU4NmNjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2F1eC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9bTY4a2F1eAotT1VUUFVUX0ZPUk1BVD0iY29mZi1tNjhrLWF1eCIKLVNFR01FTlRfU0laRT0weDQwMDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPSIkU0VHTUVOVF9TSVpFICsgU0laRU9GX0hFQURFUlMiCi1OT05fUEFHRURfVEVYVF9TVEFSVF9BRERSPVNJWkVPRl9IRUFERVJTCi1EQVRBX0FMSUdOTUVOVF89IiguICYgKC0kU0VHTUVOVF9TSVpFIHwgJFRBUkdFVF9QQUdFX1NJWkUtMSkpICsgJFNFR01FTlRfU0laRSIKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrY29mZi5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2NvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdjMGQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9bTY4a2NvZmYKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ayIKLVRFWFRfU1RBUlRfQUREUj0weDEwMDAwMDAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2VsZi5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2VsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNTJjNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL202OGtlbGYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW02OGsiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwMDAwMAotTUFYUEFHRVNJWkU9MHgyMDAwCi1OT05QQUdFRF9URVhUX1NUQVJUX0FERFI9JHtURVhUX1NUQVJUX0FERFJ9Ci1BUkNIPW02OGsKLU1BQ0hJTkU9Ci1OT1A9MHg0ZTc1Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL202OGtsaW51eC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmMzZGFkLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2xpbnV4LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1tNjhrLWxpbnV4IgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCi1BUkNIPW02OGsKLVRFTVBMQVRFX05BTUU9bGludXgKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbTY4a2x5bnguc2ggYi9sZC9lbXVscGFyYW1zL202OGtseW54LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDIwZmViLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTY4a2x5bnguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPW02OGtseW54Ci1PVVRQVVRfRk9STUFUPSJjb2ZmLW02OGstbHlueCIKLSMgVGhpcyBpcyB3aGF0IEx5bnhPUyAvbGliL2luaXQxLm8gd2FudHMuCi1FTlRSWT1fX21haW4KLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9bTY4awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrbmJzZC5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a25ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NDI4MDcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrbmJzZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotVEVYVF9TVEFSVF9BRERSPTB4MjAyMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtbTY4ay1uZXRic2QiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotQVJDSD1tNjhrCi1FWEVDVVRBQkxFX1NZTUJPTFM9J19fRFlOQU1JQyA9IDA7JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tNjhrcHNvcy5zaCBiL2xkL2VtdWxwYXJhbXMvbTY4a3Bzb3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZWI4Y2EuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9tNjhrcHNvcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9cHNvcwotT1VUUFVUX0ZPUk1BVD0iZWxmMzItbTY4ayIKLVRFWFRfU1RBUlRfQUREUj0weDIwMDAwCi1NQVhQQUdFU0laRT0weDEwMDAKLUFSQ0g9bTY4awotVEVNUExBVEVfTkFNRT1lbGYzMgpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tODhrYmNzLnNoIGIvbGQvZW11bHBhcmFtcy9tODhrYmNzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzY3MzdjLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbTg4a2Jjcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9bTg4a2JjcwotT1VUUFVUX0ZPUk1BVD0iY29mZi1tODhrYmNzIgotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPW04OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWNvcmVwZS5zaCBiL2xkL2VtdWxwYXJhbXMvbWNvcmVwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViYWVlOS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21jb3JlcGUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUFSQ0g9bWNvcmUKLVNDUklQVF9OQU1FPW1jb3JlcGUKLU9VVFBVVF9GT1JNQVQ9InBlaS1tY29yZS1iaWciCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0icGVpLW1jb3JlLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJwZWktbWNvcmUtYmlnIgotVEVNUExBVEVfTkFNRT1wZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzYmlnLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmUyOTUzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbWlwc2JpZy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNic2Quc2ggYi9sZC9lbXVscGFyYW1zL21pcHNic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZmIzNWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzYnNkLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzYnNkCi1PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWxpdHRsZSIKLUJJR19PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWJpZyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJhLm91dC1taXBzLWxpdHRsZSIKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLVRBUkdFVF9QQUdFX1NJWkU9NDA5NgotQVJDSD1taXBzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNpZHQuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNpZHQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMTc2ZjUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzaWR0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCi1FTlRSWT1zdGFydAotVEVYVF9TVEFSVF9BRERSPTB4YTAwMTIwMDAKLURBVEFfQUREUj0uCi1URU1QTEFURV9OQU1FPW1pcHNlY29mZgotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNpZHRsLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzaWR0bC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyNzlkZS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21pcHNpZHRsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotU0NSSVBUX05BTUU9bWlwcwotT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLUJJR19PVVRQVVRfRk9STUFUPSJlY29mZi1iaWdtaXBzIgotTElUVExFX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMDAwMAotQVJDSD1taXBzCi1FTlRSWT1zdGFydAotVEVYVF9TVEFSVF9BRERSPTB4YTAwMTIwMDAKLURBVEFfQUREUj0uCi1URU1QTEFURV9OQU1FPW1pcHNlY29mZgotRU1CRURERUQ9eWVzCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2ggYi9sZC9lbXVscGFyYW1zL21pcHNsaXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjIzNDQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzbGl0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1taXBzCi1PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotQklHX09VVFBVVF9GT1JNQVQ9ImVjb2ZmLWJpZ21pcHMiCi1MSVRUTEVfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtbGl0dGxlbWlwcyIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwMDAwCi1BUkNIPW1pcHMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbWlwc2xuZXdzLnNoIGIvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYmI5MWMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9taXBzbG5ld3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVNDUklQVF9OQU1FPW1pcHMKLU9VVFBVVF9GT1JNQVQ9ImVjb2ZmLWxpdHRsZW1pcHMiCi1CSUdfT1VUUFVUX0ZPUk1BVD0iZWNvZmYtYmlnbWlwcyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJlY29mZi1saXR0bGVtaXBzIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAwMDAKLUFSQ0g9bWlwcwotVEVYVF9TVEFSVF9BRERSPTB4ODAwODAwMDAKLURBVEFfQUREUj0uCi1FTUJFRERFRD15ZXMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbW4xMDIwMC5zaCBiL2xkL2VtdWxwYXJhbXMvbW4xMDIwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyNDMyMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL21uMTAyMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1NQUNISU5FPQotU0NSSVBUX05BTUU9ZWxmCi1PVVRQVVRfRk9STUFUPSJlbGYzMi1tbjEwMjAwIgotVEVYVF9TVEFSVF9BRERSPTB4MAotQVJDSD1tbjEwMjAwCi1NQUNISU5FPQotTUFYUEFHRVNJWkU9MQotRU5UUlk9X3N0YXJ0Ci1FTUJFRERFRD15ZXMKLQotIyBIbW1tLCB0aGVyZSdzIGdvdCB0byBiZSBhIGJldHRlciB3YXkuICBUaGlzIHNldHMgdGhlIHN0YWNrIHRvIHRoZQotIyB0b3Agb2YgdGhlIHNpbXVsYXRvciBtZW1vcnkgKDJeMTkgYnl0ZXMpLgotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4ODAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwotCi0jIFRoZXNlIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBDT0ZGIHRvb2xjaGFpbi4KLSMgWFhYIFRoZXNlIHNob3VsZCBkZWZpbml0ZWx5IGRpc2FwcGVhci4KLUNUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCi1DVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCi1EVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JwotRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9tbjEwMzAwLnNoIGIvbGQvZW11bHBhcmFtcy9tbjEwMzAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE0MGU1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvbW4xMDMwMC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLU1BQ0hJTkU9Ci1TQ1JJUFRfTkFNRT1lbGYKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLW1uMTAzMDAiCi1URVhUX1NUQVJUX0FERFI9MHgwCi1BUkNIPW1uMTAzMDAKLU1BQ0hJTkU9Ci1NQVhQQUdFU0laRT0xCi1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwotCi0jIEhtbW0sIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheS4gIFRoaXMgc2V0cyB0aGUgc3RhY2sgdG8gdGhlCi0jIHRvcCBvZiB0aGUgc2ltdWxhdG9yIG1lbW9yeSAoMl4xOSBieXRlcykuCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHg4MDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCi0KLSMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgotIyBYWFggVGhlc2Ugc2hvdWxkIGRlZmluaXRlbHkgZGlzYXBwZWFyLgotQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKLUNUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKLURUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCi1EVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL25ld3Muc2ggYi9sZC9lbXVscGFyYW1zL25ld3Muc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMGRkZjkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9uZXdzLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1uZXdzb3MzIgotVEVYVF9TVEFSVF9BRERSPTAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvbnMzMmtuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9uczMya25ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGZkZjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9uczMya25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LW5zMzJrLW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPW5zMzJrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2ggYi9sZC9lbXVscGFyYW1zL3BjNTMybWFjaGEuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMWQwNzkuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wYzUzMm1hY2hhLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1wYzUzMi1tYWNoIgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0iMHgxMDAyMCIKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAwCi1BUkNIPW5zMzJrCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BwY21hY29zLnNoIGIvbGQvZW11bHBhcmFtcy9wcGNtYWNvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiODAwYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BwY21hY29zLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1URU1QTEFURV9OQU1FPWFpeAotU0NSSVBUX05BTUU9YWl4Ci1PVVRQVVRfRk9STUFUPSJ4Y29mZi1wb3dlcm1hYyIKLUFSQ0g9cG93ZXJwYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9wcGNudy5zaCBiL2xkL2VtdWxwYXJhbXMvcHBjbncuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWFkNDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9wcGNudy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9bncKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXBvd2VycGMiCi1URVhUX1NUQVJUX0FERFI9MHgwNDAwMDAwCi1EQVRBX0FERFI9MHgxMDAwMDAwMAotTUFYUEFHRVNJWkU9MHg0MDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MDQwMDAwMAotQVJDSD1wb3dlcnBjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3BwY3BlLnNoIGIvbGQvZW11bHBhcmFtcy9wcGNwZS5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1MjgyZC4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3BwY3BlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1BUkNIPXBvd2VycGMKLVNDUklQVF9OQU1FPXBwY3BlCi1PVVRQVVRfRk9STUFUPSJwZWktcG93ZXJwY2xlIgotVEVNUExBVEVfTkFNRT1wZQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9yaXNjaXguc2ggYi9sZC9lbXVscGFyYW1zL3Jpc2NpeC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmNmQ5Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3Jpc2NpeC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9cmlzY2l4Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1yaXNjaXgiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTB4ODAwMAotQVJDSD1hcm0KZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc2EyOTIwMC5zaCBiL2xkL2VtdWxwYXJhbXMvc2EyOTIwMC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1MmY5Mi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NhMjkyMDAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPXNhMjkyMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtYTI5ay1iaWciCi1URVhUX1NUQVJUX0FERFI9MHg0MDAwNDAwMAotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLUFSQ0g9YTI5awpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaC5zaCBiL2xkL2VtdWxwYXJhbXMvc2guc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ODQ0ZmIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zaC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9c2gKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtc2giCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1zaApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaGVsZi5zaCBiL2xkL2VtdWxwYXJhbXMvc2hlbGYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGI1ODcuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zaGVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItc2giCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwCi1NQVhQQUdFU0laRT0xMjgKLUFSQ0g9c2gKLU1BQ0hJTkU9Ci1URU1QTEFURV9OQU1FPWVsZjMyCi1HRU5FUkFURV9TSExJQl9TQ1JJUFQ9eWVzCi1FTUJFRERFRD15ZXMKLQotIyBUaGVzZSBhcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgQ09GRiB0b29sY2hhaW4uCi1FTlRSWT1zdGFydAotQ1RPUl9TVEFSVD0nX19fY3RvcnMgPSAuOycKLUNUT1JfRU5EPSdfX19jdG9yc19lbmQgPSAuOycKLURUT1JfU1RBUlQ9J19fX2R0b3JzID0gLjsnCi1EVE9SX0VORD0nX19fZHRvcnNfZW5kID0gLjsnCi1PVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TPScuc3RhY2sgMHgzMDAwMCA6IHsgX3N0YWNrID0gLjsgKiguc3RhY2spIH0nCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NobC5zaCBiL2xkL2VtdWxwYXJhbXMvc2hsLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjBhYWM4Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc2hsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zaAotT1VUUFVUX0ZPUk1BVD0iY29mZi1zaGwiCi1URVhUX1NUQVJUX0FERFI9MHg4MDAwCi1UQVJHRVRfUEFHRV9TSVpFPTEyOAotQVJDSD1zaApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zaGxlbGYuc2ggYi9sZC9lbXVscGFyYW1zL3NobGVsZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyN2Y4Ni4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NobGVsZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLVNDUklQVF9OQU1FPWVsZgotT1VUUFVUX0ZPUk1BVD0iZWxmMzItc2hsIgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotTUFYUEFHRVNJWkU9MTI4Ci1BUkNIPXNoCi1NQUNISU5FPQotVEVNUExBVEVfTkFNRT1lbGYzMgotR0VORVJBVEVfU0hMSUJfU0NSSVBUPXllcwotRU1CRURERUQ9eWVzCi0KLSMgVGhlc2UgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIENPRkYgdG9vbGNoYWluLgotRU5UUlk9c3RhcnQKLUNUT1JfU1RBUlQ9J19fX2N0b3JzID0gLjsnCi1DVE9SX0VORD0nX19fY3RvcnNfZW5kID0gLjsnCi1EVE9SX1NUQVJUPSdfX19kdG9ycyA9IC47JwotRFRPUl9FTkQ9J19fX2R0b3JzX2VuZCA9IC47JwotT1RIRVJfUkVMT0NBVElOR19TRUNUSU9OUz0nLnN0YWNrIDB4MzAwMDAgOiB7IF9zdGFjayA9IC47ICooLnN0YWNrKSB9JwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY2FvdXQuc2ggYi9sZC9lbXVscGFyYW1zL3NwYXJjYW91dC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5YjkyNS4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NwYXJjYW91dC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtc3Vub3MtYmlnIgotQklHX09VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKLUxJVFRMRV9PVVRQVVRfRk9STUFUPSJhLm91dC1zcGFyYy1saXR0bGUiCi1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotQVJDSD1zcGFyYwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoIGIvbGQvZW11bHBhcmFtcy9zcGFyY2xpbnV4LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2NiMGJlYy4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3NwYXJjbGludXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXNwYXJjLWxpbnV4IgotVEFSR0VUX1BBR0VfU0laRT0weDEwMDAKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0wCi1BUkNIPXNwYXJjCi1URU1QTEFURV9OQU1FPWxpbnV4CmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3NwYXJjbHlueC5zaCBiL2xkL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWViMzBiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3BhcmNseW54LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zcGFyY2x5bngKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtc3BhcmMtbHlueCIKLSMgVGhpcyBpcyB3aGF0IEx5bnhPUyAvbGliL2luaXQxLm8gd2FudHMuCi1FTlRSWT1fX21haW4KLSMgZm9sbG93aW5nIGFyZSBkdWJpb3VzCi1UQVJHRVRfUEFHRV9TSVpFPTB4MTAwMAotVEVYVF9TVEFSVF9BRERSPTAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDEwMDAKLUFSQ0g9c3BhcmMKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3BhcmNuYnNkLnNoIGIvbGQvZW11bHBhcmFtcy9zcGFyY25ic2Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyN2RhZjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zcGFyY25ic2Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXNwYXJjLW5ldGJzZCIKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1BUkNIPXNwYXJjCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3N0MjAwMC5zaCBiL2xkL2VtdWxwYXJhbXMvc3QyMDAwLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk4ODMyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvc3QyMDAwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT1zdDIwMDAKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtbTY4ayIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPW02OGsKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvc3VuMy5zaCBiL2xkL2VtdWxwYXJhbXMvc3VuMy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwZjcxZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3N1bjMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLVNDUklQVF9OQU1FPWFvdXQKLU9VVFBVVF9GT1JNQVQ9ImEub3V0LXN1bm9zLWJpZyIKLVRFWFRfU1RBUlRfQUREUj0weDIwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgyMDAwCi1TRUdNRU5UX1NJWkU9MHgyMDAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotQVJDSD1tNjhrCi1URU1QTEFURV9OQU1FPXN1bm9zCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3N1bjQuc2ggYi9sZC9lbXVscGFyYW1zL3N1bjQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDI3NzUuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy9zdW40LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1TQ1JJUFRfTkFNRT1hb3V0Ci1PVVRQVVRfRk9STUFUPSJhLm91dC1zdW5vcy1iaWciCi1URVhUX1NUQVJUX0FERFI9MHgyMDIwCi1UQVJHRVRfUEFHRV9TSVpFPTB4MjAwMAotTk9OUEFHRURfVEVYVF9TVEFSVF9BRERSPTB4MjAwMAotQUxJR05NRU5UPTgKLUFSQ0g9c3BhcmMKLVRFTVBMQVRFX05BTUU9c3Vub3MKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdGljMzBhb3V0LnNoIGIvbGQvZW11bHBhcmFtcy90aWMzMGFvdXQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNGMxM2YuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy90aWMzMGFvdXQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXRpYzMwYW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtdGljMzAiCi1PVVRQVVRfQVJDSD0idG1zMzIwYzMwIgotVEVYVF9TVEFSVF9BRERSPTB4MAotVEFSR0VUX1BBR0VfU0laRT0xMjgKLUFSQ0g9dG1zMzIwYzMwCi1CSUc9MQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy90aWMzMGNvZmYuc2ggYi9sZC9lbXVscGFyYW1zL3RpYzMwY29mZi5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3Nzk0My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3RpYzMwY29mZi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotU0NSSVBUX05BTUU9dGljMzBjb2ZmCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXRpYzMwIgotT1VUUFVUX0FSQ0g9InRtczMyMGMzMCIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXRtczMyMGMzMAotQklHPTEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvdGljODBjb2ZmLnNoIGIvbGQvZW11bHBhcmFtcy90aWM4MGNvZmYuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzAzMjMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy90aWM4MGNvZmYuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIFRoaXMgZmlsZSBpcyBzb3VyY2VkIGJ5IHRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdC4KLSMgVGhlc2UgYXJlIHNoZWxsIHZhcmlhYmxlcyB0aGF0IGFyZSB1c2VkIGxhdGVyIGJ5IGVpdGhlciBnZW5zY3JpcHRzCi0jIG9yIG9uIG9mIHRoZSBzY3JpcHRzIHRoYXQgaXQgc291cmNlcy4KLQotIyBUaGUgbmFtZSBvZiB0aGUgc2NyaXB0dGVtcGwgc2NyaXB0IHRvIHVzZS4gIEluIHRoaXMgY2FzZSwgZ2Vuc2NyaXB0cwotIyB1c2VzIHNjcmlwdHRlbXBsL3RpYzgwY29mZi5zYwotIwotU0NSSVBUX05BTUU9dGljODBjb2ZmCi0KLSMgVGhlIG5hbWUgb2YgdGhlIGVtdWx0ZW1wbCBzY3JpcHQgdG8gdXNlLiAgSWYgc2V0IHRvICJ0ZW1wbGF0ZSIgdGhlbgotIyBnZW5zY3JpcHRzLnNoIHdpbGwgdXNlIHRoZSBzY3JpcHQgZW11bHRlbXBsL3RlbXBsYXRlLmVtLiAgSWYgbm90IHNldCwKLSMgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAiZ2VuZXJpYyIuCi0jCi0jIFRFTVBMQVRFX05BTUU9Ci0KLSMgSWYgdGhpcyBpcyBzZXQgdG8gYW4gbm9uZW1wdHkgc3RyaW5nLCBnZW5zY3JpcHRzLnNoIHdpbGwgaW52b2tlIHRoZQotIyBzY3JpcHR0ZW1wbCBzY3JpcHQgYW4gZXh0cmEgdGltZSB0byBjcmVhdGUgYSBzaGFyZWQgbGlicmFyeSBzY3JpcHQuCi0jCi0jIEdFTkVSQVRFX1NITElCX1NDUklQVD0KLQotIyBUaGUgQkZEIG91dHB1dCBmb3JtYXQgdG8gdXNlLiAgVGhlIHNjcmlwdHRlbXBsIHNjcmlwdCB3aWxsIHVzZSBpdCBpbgotIyBhbiBPVVRQVVRfRk9STUFUIGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0jCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXRpYzgwIgotCi0jIFRoaXMgaXMgbm9ybWFsbHkgc2V0IHRvIGluZGljYXRlIHRoZSBhcmNoaXRlY3R1cmUgdG8gdXNlLCBzdWNoIGFzCi0jICJzcGFyYyIuICBUaGUgc2NyaXB0dGVtcGwgc2NyaXB0IHdpbGwgbm9ybWFsbHkgdXNlIGl0IGluIGFuIE9VVFBVVF9BUkNICi0jIGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0jCi1BUkNIPXRpYzgwCi0KLSMgU29tZSBzY3JpcHR0ZW1wbCBzY3JpcHRzIHVzZSB0aGlzIHRvIHNldCB0aGUgZW50cnkgYWRkcmVzcyBpbiBhbiBFTlRSWQotIyBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotIwotIyBFTlRSWT0KLQotIyBUaGUgc2NyaXB0dGVtcGwgc2NyaXB0IHVzZXMgdGhpcyB0byBzZXQgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlCi0jICIudGV4dCIgc2VjdGlvbi4KLSMKLVRFWFRfU1RBUlRfQUREUj0weDIwMDAwMDAKLQotIyBJZiB0aGlzIGlzIGRlZmluZWQsIHRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCBzZXRzIFRFWFRfU1RBUlRfQUREUiB0bwotIyBpdHMgdmFsdWUgYmVmb3JlIHJ1bm5pbmcgdGhlIHNjcmlwdHRlbXBsIHNjcmlwdCBmb3IgdGhlIC1uIGFuZCAtTgotIyBvcHRpb25zLgotIwotIyBOT05QQUdFRF9URVhUX1NUQVJUX0FERFI9Ci0KLSMgVGhlIGdlbnNjcmlwdHMuc2ggc2NyaXB0IHVzZXMgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgCi0jIERBVEFfQUxJR05NRU5UIHdoZW4gcnVubmluZyB0aGUgc2NyaXB0dGVtcGwgc2NyaXB0LgotIwotIyBTRUdNRU5UX1NJWkU9Ci0KLSMgSWYgU0VHTUVOVF9TSVpFIGlzIG5vdCBkZWZpbmVkLCB0aGUgZ2Vuc2NyaXB0cy5zaCBzY3JpcHQgdXNlcyB0aGlzCi0jIHRvIGRlZmluZSBpdC4KLSMKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3Y4NTAuc2ggYi9sZC9lbXVscGFyYW1zL3Y4NTAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YmZiZDMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHBhcmFtcy92ODUwLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTUFDSElORT0KLVNDUklQVF9OQU1FPXY4NTAKLU9VVFBVVF9GT1JNQVQ9ImVsZjMyLXY4NTAiCi1URVhUX1NUQVJUX0FERFI9MHgxMDAwMDAKLVpEQVRBX1NUQVJUX0FERFI9MHgxNjAKLVJPWkRBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotU0RBVEFfU1RBUlRfQUREUj0iQUxJR04gKDQpIgotUk9TREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1UREFUQV9TVEFSVF9BRERSPSJBTElHTiAoNCkiCi1DQUxMX1RBQkxFX1NUQVJUX0FERFI9IkFMSUdOICg0KSIKLUFSQ0g9djg1MAotTUFYUEFHRVNJWkU9MjU2Ci1FTlRSWT1fc3RhcnQKLUVNQkVEREVEPXllcwpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92YW5pbGxhLnNoIGIvbGQvZW11bHBhcmFtcy92YW5pbGxhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGEzYjcyLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdmFuaWxsYS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9dmFuaWxsYQotVEVYVF9TVEFSVF9BRERSPT8/Ci1UQVJHRVRfUEFHRV9TSVpFPT8/Ci1BUkNIPXVua25vd24KLVRFTVBMQVRFX05BTUU9dmFuaWxsYQpkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92YXguc2ggYi9sZC9lbXVscGFyYW1zL3ZheC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc4NTQ4My4uMDAwMDAwMAotLS0gYS9sZC9lbXVscGFyYW1zL3ZheC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQiCi1URVhUX1NUQVJUX0FERFI9MAotVEFSR0VUX1BBR0VfU0laRT0xMDI0Ci1BUkNIPXZheApkaWZmIC0tZ2l0IGEvbGQvZW11bHBhcmFtcy92c3RhLnNoIGIvbGQvZW11bHBhcmFtcy92c3RhLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYyNDliLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdnN0YS5zaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotU0NSSVBUX05BTUU9YW91dAotT1VUUFVUX0ZPUk1BVD0iYS5vdXQtaTM4NiIKLVRFWFRfU1RBUlRfQUREUj0weDEwMjAKLVRBUkdFVF9QQUdFX1NJWkU9MHgxMDAwCi1TRUdNRU5UX1NJWkU9MHg0MDAwMDAKLU5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUj0weDAKLUFSQ0g9aTM4NgotCmRpZmYgLS1naXQgYS9sZC9lbXVscGFyYW1zL3c2NS5zaCBiL2xkL2VtdWxwYXJhbXMvdzY1LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjAyYjIzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvdzY1LnNoCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1TQ1JJUFRfTkFNRT13NjUKLU9VVFBVVF9GT1JNQVQ9ImNvZmYtdzY1IgotVEVYVF9TVEFSVF9BRERSPTB4MTAwMAotVEFSR0VUX1BBR0VfU0laRT02NAotQVJDSD13NjUKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvejgwMDEuc2ggYi9sZC9lbXVscGFyYW1zL3o4MDAxLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY0NWMzLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvejgwMDEuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLVNDUklQVF9OQU1FPXo4MDAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXo4ayIKLU9VVFBVVF9BUkNIPSJ6ODAwMSIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXo4awotQklHPTEKZGlmZiAtLWdpdCBhL2xkL2VtdWxwYXJhbXMvejgwMDIuc2ggYi9sZC9lbXVscGFyYW1zL3o4MDAyLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTliNWY1Li4wMDAwMDAwCi0tLSBhL2xkL2VtdWxwYXJhbXMvejgwMDIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNDUklQVF9OQU1FPXo4MDAwCi1PVVRQVVRfRk9STUFUPSJjb2ZmLXo4ayIKLU9VVFBVVF9BUkNIPSJ6ODAwMiIKLVRFWFRfU1RBUlRfQUREUj0weDAKLVRBUkdFVF9QQUdFX1NJWkU9MTI4Ci1BUkNIPXo4MDAyCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvUkVBRE1FIGIvbGQvZW11bHRlbXBsL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlYzBhYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1UaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHNvdXJjZWQgYnkgZ2Vuc2NyaXB0cy5zaCwgYWZ0ZXIKLXNldHRpbmcgc29tZSB2YXJpYWJsZXMgdG8gc3Vic3RpdHV0ZSBpbiwgdG8gcHJvZHVjZQotQyBzb3VyY2UgZmlsZXMgdGhhdCBjb250YWluIGp1bXAgdGFibGVzIGZvciBlYWNoIGVtdWxhdGlvbi4KZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9haXguZW0gYi9sZC9lbXVsdGVtcGwvYWl4LmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzc4NTdmLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9haXguZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDU0ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogQUlYIGVtdWxhdGlvbiBjb2RlIGZvciAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgQUlYIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJvYnN0YWNrLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBpbnQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZnJlZSBQQVJBTVMgKChQVFIpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfcmVsb2NzCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLS8qIFRoZSBmaWxlIGFsaWdubWVudCByZXF1aXJlZCBmb3IgZWFjaCBzZWN0aW9uLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGZpbGVfYWxpZ247Ci0KLS8qIFRoZSBtYXhpbXVtIHNpemUgdGhlIHN0YWNrIGlzIHBlcm1pdHRlZCB0byBncm93LiAgVGhpcyBpcyBzdG9yZWQgaW4KLSAgIHRoZSBhLm91dCBoZWFkZXIuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4c3RhY2s7Ci0KLS8qIFRoZSBtYXhpbXVtIGRhdGEgc2l6ZS4gIFRoaXMgaXMgc3RvcmVkIGluIHRoZSBhLm91dCBoZWFkZXIuICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4ZGF0YTsKLQotLyogV2hldGhlciB0byBwZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbi4gICovCi1zdGF0aWMgaW50IGdjID0gMTsKLQotLyogVGhlIG1vZHVsZSB0eXBlIHRvIHVzZS4gICovCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgbW9kdHlwZSA9ICgnMScgPDwgOCkgfCAnTCc7Ci0KLS8qIFdoZXRoZXIgdGhlIC50ZXh0IHNlY3Rpb24gbXVzdCBiZSByZWFkLW9ubHkgKGkuZS4sIG5vIHJlbG9jcwotICAgcGVybWl0dGVkKS4gICovCi1zdGF0aWMgaW50IHRleHRybzsKLQotLyogV2hldGhlciB0byBpbXBsZW1lbnQgVW5peCBsaWtlIGxpbmtlciBzZW1hbnRpY3MuICAqLwotc3RhdGljIGludCB1bml4X2xkOwotCi0vKiBTdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGltcG9ydCBmaWxlIGxpc3QuICAqLwotCi1zdHJ1Y3QgZmlsZWxpc3QKLXsKLSAgc3RydWN0IGZpbGVsaXN0ICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotfTsKLQotLyogTGlzdCBvZiBpbXBvcnQgZmlsZXMuICAqLwotc3RhdGljIHN0cnVjdCBmaWxlbGlzdCAqaW1wb3J0X2ZpbGVzOwotCi0vKiBMaXN0IG9mIGV4cG9ydCBzeW1ib2xzIHJlYWQgZnJvbSB0aGUgZXhwb3J0IGZpbGVzLiAgKi8KLQotc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdAotewotICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICBib29sZWFuIHN5c2NhbGw7Ci19OwotCi1zdGF0aWMgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqZXhwb3J0X3N5bWJvbHM7Ci0KLS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgZG9uZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLSAgY29uZmlnLmhhc19zaGFyZWQgPSB0cnVlOwotfQotCi0vKiBIYW5kbGUgQUlYIHNwZWNpZmljIG9wdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1nbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50IGluZHg7Ci0gIGludCBsb25naW5kOwotICBpbnQgb3B0YzsKLSAgbG9uZyB2YWw7Ci0gIGNoYXIgKmVuZDsKLQotI2RlZmluZSBPUFRJT05fSUdOT1JFICgzMDApCi0jZGVmaW5lIE9QVElPTl9BVVRPSU1QIChPUFRJT05fSUdOT1JFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VSTk9UT0sgKE9QVElPTl9BVVRPSU1QICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VST0sgKE9QVElPTl9FUk5PVE9LICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYUE9SVCAoT1BUSU9OX0VST0sgKyAxKQotI2RlZmluZSBPUFRJT05fSU1QT1JUIChPUFRJT05fRVhQT1JUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0xPQURNQVAgKE9QVElPTl9JTVBPUlQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFYREFUQSAoT1BUSU9OX0xPQURNQVAgKyAxKQotI2RlZmluZSBPUFRJT05fTUFYU1RBQ0sgKE9QVElPTl9NQVhEQVRBICsgMSkKLSNkZWZpbmUgT1BUSU9OX01PRFRZUEUgKE9QVElPTl9NQVhTVEFDSyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT0FVVE9JTVAgKE9QVElPTl9NT0RUWVBFICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PU1RSQ01QQ1QgKE9QVElPTl9OT0FVVE9JTVAgKyAxKQotI2RlZmluZSBPUFRJT05fUEQgKE9QVElPTl9OT1NUUkNNUENUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BUIChPUFRJT05fUEQgKyAxKQotI2RlZmluZSBPUFRJT05fU1RSQ01QQ1QgKE9QVElPTl9QVCArIDEpCi0jZGVmaW5lIE9QVElPTl9VTklYIChPUFRJT05fU1RSQ01QQ1QgKyAxKQotCi0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7Ci0gICAgeyJiYXNpcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJhdXRvaW1wIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BVVRPSU1QfSwKLSAgICB7ImJjb21wcmxkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmNybGQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiY3JvcjMxIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYkQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWERBVEF9LAotICAgIHsiYkUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVH0sCi0gICAgeyJiZXJub3RvayIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJOT1RPS30sCi0gICAgeyJiZXJvayIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJPS30sCi0gICAgeyJiZXJybXNnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmV4cG9ydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUfSwKLSAgICB7ImJmIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk5PVE9LfSwKLSAgICB7ImJnYyIsIG5vX2FyZ3VtZW50LCAmZ2MsIDF9LAotICAgIHsiYmgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiaGFsdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJJIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBPUlR9LAotICAgIHsiYmltcG9ydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QT1JUfSwKLSAgICB7ImJsIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MT0FETUFQfSwKLSAgICB7ImJsb2FkbWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MT0FETUFQfSwKLSAgICB7ImJtYXhkYXRhIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhEQVRBfSwKLSAgICB7ImJtYXhzdGFjayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYU1RBQ0t9LAotICAgIHsiYk0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01PRFRZUEV9LAotICAgIHsiYm1vZHR5cGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01PRFRZUEV9LAotICAgIHsiYm5vYXV0b2ltcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9BVVRPSU1QfSwKLSAgICB7ImJub2RlbGNzZWN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYm5vZW50cnkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJibm9nYyIsIG5vX2FyZ3VtZW50LCAmZ2MsIDB9LAotICAgIHsiYm5zbyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9BVVRPSU1QfSwKLSAgICB7ImJub3N0cmNtcGN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT1NUUkNNUENUfSwKLSAgICB7ImJub3RleHRybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAwfSwKLSAgICB7ImJucm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMH0sCi0gICAgeyJicEQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BEfSwKLSAgICB7ImJwVCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFR9LAotICAgIHsiYnJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDF9LAotICAgIHsiYlMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWFNUQUNLfSwKLSAgICB7ImJzbyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVVUT0lNUH0sCi0gICAgeyJic3RyY21wY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUUkNNUENUfSwKLSAgICB7ImJ0ZXh0cm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMX0sCi0gICAgeyJzdGF0aWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJ1bml4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9VTklYfSwKLSAgICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci0gIH07Ci0KLSAgLyogT3B0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIEFJWCBsaW5rZXIgd2hpY2ggd2UgZG8gbm90IHN1cHBvcnQ6IC1mLAotICAgICAtUywgLXYsIC1aLCAtYmJpbmRjbWRzLCAtYmJpbmRlciwgLWJiaW5kb3B0cywgLWJjYWxscywgLWJjYXBzLAotICAgICAtYmNyb3IxNSwgLWJkZWJ1Z29wdCwgLWJkYmcsIC1iZGVsY3NlY3QsIC1iZXg/LCAtYmZpbGVsaXN0LCAtYmZsLAotICAgICAtYmdjYnlwYXNzLCAtYmdsaW5rLCAtYmluc2VydCwgLWJpLCAtYmxvYWRtYXAsIC1ibCwgLWJtYXAsIC1ibmwsCi0gICAgIC1ibm9iaW5kLCAtYm5vY29tcHJsZCwgLWJub2NybGQsIC1ibm9lcnJtc2csIC1ibm9nbGluaywKLSAgICAgLWJub2xvYWRtYXAsIC1ibmwsIC1ibm9vYmpyZW9yZGVyLCAtYm5vcXVpZXQsIC1ibm9yZW9yZGVyLAotICAgICAtYm5vdHlwY2hrLCAtYm5veCwgLWJxdWlldCwgLWJSLCAtYnJlbmFtZSwgLWJyZW9yZGVyLCAtYnR5cGNoaywKLSAgICAgLWJ4LCAtYlgsIC1ieHJlZi4gICovCi0KLSAgLyogSWYgdGhlIGN1cnJlbnQgb3B0aW9uIHN0YXJ0cyB3aXRoIC1iLCBjaGFuZ2UgdGhlIGZpcnN0IDogdG8gYW4gPS4KLSAgICAgVGhlIEFJWCBsaW5rZXIgdXNlcyA6IHRvIHNlcGFyYXRlIHRoZSBvcHRpb24gZnJvbSB0aGUgYXJndW1lbnQ7Ci0gICAgIGNoYW5naW5nIGl0IHRvID0gbGV0cyB1cyB0cmVhdCBpdCBhcyBhIGdldG9wdCBvcHRpb24uICAqLwotICBpbmR4ID0gb3B0aW5kOwotICBpZiAoaW5keCA9PSAwKQotICAgIGluZHggPSAxOwotICBpZiAoaW5keCA8IGFyZ2MgJiYgc3RybmNtcCAoYXJndltpbmR4XSwgIi1iIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotCi0gICAgICBmb3IgKHMgPSBhcmd2W2luZHhdOyAqcyAhPSAnXDAnOyBzKyspCi0JewotCSAgaWYgKCpzID09ICc6JykKLQkgICAgewotCSAgICAgICpzID0gJz0nOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBXZSBhZGQgcyBhbmQgdSBzbyB0byB0aGUgc2hvcnQgb3B0aW9ucyBsaXN0IHNvIHRoYXQgLXMgYW5kIC11IG9uCi0gICAgIHRoZSBjb21tYW5kIGxpbmUgZG8gbm90IG1hdGNoIC1zdGF0aWMgYW5kIC11bml4LiAgKi8KLQotICBvcHRlcnIgPSAwOwotICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi1EOkg6S1Q6enN1IiwgbG9uZ29wdHMsICZsb25naW5kKTsKLSAgb3B0ZXJyID0gcHJldm9wdGVycjsKLQotICBzd2l0Y2ggKG9wdGMpCi0gICAgewotICAgIGNhc2UgJ3MnOgotICAgIGNhc2UgJ3UnOgotICAgIGRlZmF1bHQ6Ci0gICAgICBvcHRpbmQgPSBwcmV2b3B0aW5kOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIDA6Ci0gICAgICAvKiBMb25nIG9wdGlvbiB3aGljaCBqdXN0IHNldHMgYSBmbGFnLiAgKi8KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRCc6Ci0gICAgICB2YWwgPSBzdHJ0b2wgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLUQgbnVtYmVyICVzXG4iLCBvcHRhcmcpOwotICAgICAgZWxzZSBpZiAodmFsICE9IC0xKQotCWxhbmdfc2VjdGlvbl9zdGFydCAoIi5kYXRhIiwgZXhwX2ludG9wICh2YWwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSCc6Ci0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJwotCSAgfHwgKHZhbCAmICh2YWwgLSAxKSkgIT0gMCkKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1IIG51bWJlciAlc1xuIiwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQlmaWxlX2FsaWduID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdLJzoKLSAgICBjYXNlICd6JzoKLSAgICAgIC8qIEZJWE1FOiBUaGlzIHNob3VsZCB1c2UgdGhlIHBhZ2Ugc2l6ZSBmb3IgdGhlIHRhcmdldCBzeXN0ZW0uICAqLwotICAgICAgZmlsZV9hbGlnbiA9IDQwOTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1QnOgotICAgICAgLyogT24gQUlYIHRoaXMgaXMgdGhlIHNhbWUgYXMgR05VIGxkIC1UdGV4dC4gIFdoZW4gd2Ugc2VlIC1UCi0gICAgICAgICBudW1iZXIsIHdlIGFzc3VtZSB0aGUgQUlYIG9wdGlvbiBpcyBpbnRlbmRlZC4gIE90aGVyd2lzZSwgd2UKLSAgICAgICAgIGFzc3VtZSB0aGUgdXN1YWwgR05VIGxkIC1UIG9wdGlvbiBpcyBpbnRlbmRlZC4gIFdlIGNhbid0IGp1c3QKLSAgICAgICAgIGlnbm9yZSB0aGUgQUlYIG9wdGlvbiwgYmVjYXVzZSBnY2MgcGFzc2VzIGl0IHRvIHRoZSBsaW5rZXIuICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JewotCSAgb3B0aW5kID0gcHJldm9wdGluZDsKLQkgIHJldHVybiAwOwotCX0KLSAgICAgIGxhbmdfc2VjdGlvbl9zdGFydCAoIi50ZXh0IiwgZXhwX2ludG9wICh2YWwpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fSUdOT1JFOgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9BVVRPSU1QOgotICAgICAgbGlua19pbmZvLnN0YXRpY19saW5rID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VSTk9UT0s6Ci0gICAgICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fRVJPSzoKLSAgICAgIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VYUE9SVDoKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3JlYWRfZmlsZSAob3B0YXJnLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0lNUE9SVDoKLSAgICAgIHsKLQlzdHJ1Y3QgZmlsZWxpc3QgKm47Ci0Jc3RydWN0IGZpbGVsaXN0ICoqZmxwcDsKLQotCW4gPSAoc3RydWN0IGZpbGVsaXN0ICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGZpbGVsaXN0KSk7Ci0Jbi0+bmV4dCA9IE5VTEw7Ci0Jbi0+bmFtZSA9IG9wdGFyZzsKLQlmbHBwID0gJmltcG9ydF9maWxlczsKLQl3aGlsZSAoKmZscHAgIT0gTlVMTCkKLQkgIGZscHAgPSAmKCpmbHBwKS0+bmV4dDsKLQkqZmxwcCA9IG47Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0xPQURNQVA6Ci0gICAgICBjb25maWcubWFwX2ZpbGVuYW1lID0gb3B0YXJnOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NQVhEQVRBOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtYm1heGRhdGEgbnVtYmVyICVzXG4iLAotCSAgICAgICBvcHRhcmcpOwotICAgICAgZWxzZQotCW1heGRhdGEgPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01BWFNUQUNLOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtYm1heHN0YWNrIG51bWJlciAlc1xuIiwKLQkgICAgICAgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltYXhzdGFjayA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTU9EVFlQRToKLSAgICAgIGlmICgqb3B0YXJnID09ICdTJykKLQl7Ci0JICBsaW5rX2luZm8uc2hhcmVkID0gdHJ1ZTsKLQkgICsrb3B0YXJnOwotCX0KLSAgICAgIGlmICgqb3B0YXJnID09ICdcMCcgfHwgb3B0YXJnWzFdID09ICdcMCcpCi0JZWluZm8gKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCBtb2R1bGUgdHlwZSAlc1xuIiwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltb2R0eXBlID0gKCpvcHRhcmcgPDwgOCkgfCBvcHRhcmdbMV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PQVVUT0lNUDoKLSAgICAgIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX05PU1RSQ01QQ1Q6Ci0gICAgICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUEQ6Ci0gICAgICAvKiBUaGlzIHNldHMgdGhlIHBhZ2UgdGhhdCB0aGUgLmRhdGEgc2VjdGlvbiBpcyBzdXBwb3NlZCB0bwotICAgICAgICAgc3RhcnQgb24uICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSBzaG91bGQgc3RpbGwgYmUgdGhlCi0gICAgICAgICBvZmZzZXQgd2l0aGluIHRoZSBmaWxlLCBzbyB3ZSBuZWVkIHRvIGJ1aWxkIGFuIGFwcHJvcHJpYXRlCi0gICAgICAgICBleHByZXNzaW9uLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLXBEIG51bWJlciAlc1xuIiwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBldHJlZV90eXBlICp0OwotCi0JICB0ID0gZXhwX2Jpbm9wICgnKycsCi0JCQkgZXhwX2ludG9wICh2YWwpLAotCQkJIGV4cF9iaW5vcCAoJyYnLAotCQkJCSAgICBleHBfbmFtZW9wIChOQU1FLCAiLiIpLAotCQkJCSAgICBleHBfaW50b3AgKDB4ZmZmKSkpOwotCSAgdCA9IGV4cF9iaW5vcCAoJyYnLAotCQkJIGV4cF9iaW5vcCAoJysnLCB0LCBleHBfaW50b3AgKDMxKSksCi0JCQkgZXhwX2ludG9wICh+IChiZmRfdm1hKSAzMSkpOwotCSAgbGFuZ19zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCB0KTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BUOgotICAgICAgLyogVGhpcyBzZXQgdGhlIHBhZ2UgdGhhdCB0aGUgLnRleHQgc2VjdGlvbiBpcyBzdXBwb3NlZCB0byBzdGFydAotICAgICAgICAgb24uICBUaGUgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSBzaG91bGQgc3RpbGwgYmUgdGhlIG9mZnNldAotICAgICAgICAgd2l0aGluIHRoZSBmaWxlLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvICgiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLXBUIG51bWJlciAlc1xuIiwgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBldHJlZV90eXBlICp0OwotCi0JICB0ID0gZXhwX2Jpbm9wICgnKycsCi0JCQkgZXhwX2ludG9wICh2YWwpLAotCQkJIGV4cF9uYW1lb3AgKFNJWkVPRl9IRUFERVJTLCBOVUxMKSk7Ci0JICB0ID0gZXhwX2Jpbm9wICgnJicsCi0JCQkgZXhwX2Jpbm9wICgnKycsIHQsIGV4cF9pbnRvcCAoMzEpKSwKLQkJCSBleHBfaW50b3AgKH4gKGJmZF92bWEpIDMxKSk7Ci0JICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIudGV4dCIsIHQpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU1RSQ01QQ1Q6Ci0gICAgICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1VOSVg6Ci0gICAgICB1bml4X2xkID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBpbnB1dCBmaWxlIGNhbiBub3QgYmUgcmVjb2duaXplZCBhcyBhIEJGRAotICAgb2JqZWN0IG9yIGFuIGFyY2hpdmUuICBJZiB0aGUgZmlsZSBzdGFydHMgd2l0aCAjISwgd2UgbXVzdCB0cmVhdCBpdAotICAgYXMgYW4gaW1wb3J0IGZpbGUuICBUaGlzIGlzIGZvciBBSVggY29tcGF0aWJpbGl0eS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBGSUxFICplOwotICBib29sZWFuIHJldDsKLQotICBlID0gZm9wZW4gKGVudHJ5LT5maWxlbmFtZSwgRk9QRU5fUlQpOwotICBpZiAoZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXQgPSBmYWxzZTsKLQotICBpZiAoZ2V0YyAoZSkgPT0gJyMnICYmIGdldGMgKGUpID09ICchJykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZmlsZWxpc3QgKm47Ci0gICAgICBzdHJ1Y3QgZmlsZWxpc3QgKipmbHBwOwotCi0gICAgICBuID0gKHN0cnVjdCBmaWxlbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbGlzdCkpOwotICAgICAgbi0+bmV4dCA9IE5VTEw7Ci0gICAgICBuLT5uYW1lID0gZW50cnktPmZpbGVuYW1lOwotICAgICAgZmxwcCA9ICZpbXBvcnRfZmlsZXM7Ci0gICAgICB3aGlsZSAoKmZscHAgIT0gTlVMTCkKLQlmbHBwID0gJigqZmxwcCktPm5leHQ7Ci0gICAgICAqZmxwcCA9IG47Ci0KLSAgICAgIHJldCA9IHRydWU7Ci0gICAgICBlbnRyeS0+bG9hZGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgZmNsb3NlIChlKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIGJvb2xlYW4gcjsKLSAgc3RydWN0IHNldF9pbmZvICpwOwotCi0gIC8qIENhbGwgbGRjdG9yX2J1aWxkX3NldHMsIGFmdGVyIHByZXRlbmRpbmcgdGhhdCB0aGlzIGlzIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkbyB0aGlzIGJlY2F1c2UgQUlYIHJlcXVpcmVzIHJlbG9jYXRpb24KLSAgICAgZW50cmllcyBmb3IgYWxsIHJlZmVyZW5jZXMgdG8gc3ltYm9scywgZXZlbiBpbiBhIGZpbmFsCi0gICAgIGV4ZWN1dGFibGUuICBPZiBjb3Vyc2UsIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGlmIHdlIGFyZQotICAgICBwcm9kdWNpbmcgYW4gWENPRkYgb3V0cHV0IGZpbGUuICAqLwotICByID0gbGlua19pbmZvLnJlbG9jYXRlYWJsZTsKLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAieGNvZmYiKSAhPSBOVUxMKQotICAgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSB0cnVlOwotICBsZGN0b3JfYnVpbGRfc2V0cyAoKTsKLSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IHI7Ci0KLSAgLyogRm9yIGVhY2ggc2V0LCByZWNvcmQgdGhlIHNpemUsIHNvIHRoYXQgdGhlIFhDT0ZGIGJhY2tlbmQgY2FuCi0gICAgIG91dHB1dCB0aGUgY29ycmVjdCBjc2VjdCBsZW5ndGguICAqLwotICBmb3IgKHAgPSBzZXRzOyBwICE9IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHdlIG1heSBoYXZlIGJlZW4gaW52b2tlZCBmcm9tCi0JIGNvbGxlY3QsIGFuZCB0aGUgc2V0cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYnVpbHQsIHNvIHdlIGRvCi0JIG5vdCBkbyBhbnl0aGluZy4gICovCi0gICAgICBpZiAocC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAocC0+cmVsb2MgIT0gQkZEX1JFTE9DX0NUT1IpCi0JewotCSAgLyogSGFuZGxlIHRoaXMgaWYgd2UgbmVlZCB0by4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIHNpemUgPSAocC0+Y291bnQgKyAyKSAqIDQ7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBwLT5oLCBzaXplKSkKLQllaW5mbyAoIiVGJVA6IGJmZF94Y29mZl9saW5rX3JlY29yZF9zZXQgZmFpbGVkOiAlRVxuIik7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIHN0cnVjdCBmaWxlbGlzdCAqZmw7Ci0gIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKmVsOwotICBjaGFyICpsaWJwYXRoOwotICBhc2VjdGlvbiAqc3BlY2lhbF9zZWN0aW9uc1s2XTsKLSAgaW50IGk7Ci0KLSAgLyogSGFuZGxlIHRoZSBpbXBvcnQgYW5kIGV4cG9ydCBmaWxlcywgaWYgYW55LiAgKi8KLSAgZm9yIChmbCA9IGltcG9ydF9maWxlczsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+bmV4dCkKLSAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9yZWFkX2ZpbGUgKGZsLT5uYW1lLCB0cnVlKTsKLSAgZm9yIChlbCA9IGV4cG9ydF9zeW1ib2xzOyBlbCAhPSBOVUxMOyBlbCA9IGVsLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBlbC0+bmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWVpbmZvICgiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgb2YgZXhwb3J0IHN5bWJvbCBmYWlsZWQ6ICVFXG4iKTsKLSAgICAgIGlmICghIGJmZF94Y29mZl9leHBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBoLCBlbC0+c3lzY2FsbCkpCi0JZWluZm8gKCIlUCVGOiBiZmRfeGNvZmZfZXhwb3J0X3N5bWJvbCBmYWlsZWQ6ICVFXG4iKTsKLSAgICB9Ci0KLSAgLyogVHJhY2sgZG93biBhbGwgcmVsb2NhdGlvbnMgY2FsbGVkIGZvciBieSB0aGUgbGlua2VyIHNjcmlwdCAodGhlc2UKLSAgICAgYXJlIHR5cGljYWxseSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGVudHJpZXMgY3JlYXRlZCBieQotICAgICBDT05TVFJVQ1RPUlMpIGFuZCBsZXQgdGhlIGJhY2tlbmQga25vdyBpdCB3aWxsIG5lZWQgdG8gY3JlYXRlCi0gICAgIC5sb2FkZXIgcmVsb2NzIGZvciB0aGVtLiAgKi8KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfcmVsb2NzKTsKLQotICAvKiBXZSBuZWVkIHRvIGJ1aWxkIExJQlBBVEggZnJvbSB0aGUgLUwgYXJndW1lbnRzLiAgSWYgYW55IC1ycGF0aAotICAgICBhcmd1bWVudHMgd2VyZSB1c2VkLCB0aG91Z2gsIHdlIHVzZSAtcnBhdGggaW5zdGVhZCwgYXMgYSBHTlUKLSAgICAgZXh0ZW5zaW9uLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aCAhPSBOVUxMKQotICAgIGxpYnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0gIGVsc2UgaWYgKHNlYXJjaF9oZWFkID09IE5VTEwpCi0gICAgbGlicGF0aCA9IChjaGFyICopICIiOwotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotICAgICAgbGVuID0gc3RybGVuIChzZWFyY2hfaGVhZC0+bmFtZSk7Ci0gICAgICBsaWJwYXRoID0geG1hbGxvYyAobGVuICsgMSk7Ci0gICAgICBzdHJjcHkgKGxpYnBhdGgsIHNlYXJjaF9oZWFkLT5uYW1lKTsKLSAgICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQtPm5leHQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JewotCSAgc2l6ZV90IG5sZW47Ci0KLQkgIG5sZW4gPSBzdHJsZW4gKHNlYXJjaC0+bmFtZSk7Ci0JICBsaWJwYXRoID0geHJlYWxsb2MgKGxpYnBhdGgsIGxlbiArIG5sZW4gKyAyKTsKLQkgIGxpYnBhdGhbbGVuXSA9ICc6JzsKLQkgIHN0cmNweSAobGlicGF0aCArIGxlbiArIDEsIHNlYXJjaC0+bmFtZSk7Ci0JICBsZW4gKz0gbmxlbiArIDE7Ci0JfQotICAgIH0KLQotICAvKiBMZXQgdGhlIFhDT0ZGIGJhY2tlbmQgc2V0IHVwIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLwotICBpZiAoISBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBsaWJwYXRoLAotCQkJCQkgZW50cnlfc3ltYm9sLCBmaWxlX2FsaWduLAotCQkJCQkgbWF4c3RhY2ssIG1heGRhdGEsCi0JCQkJCSBnYyAmJiAhIHVuaXhfbGQgPyB0cnVlIDogZmFsc2UsCi0JCQkJCSBtb2R0eXBlLAotCQkJCQkgdGV4dHJvID8gdHJ1ZSA6IGZhbHNlLAotCQkJCQkgdW5peF9sZCwKLQkJCQkJIHNwZWNpYWxfc2VjdGlvbnMpKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNwZWNpYWwgc2VjdGlvbnMsIGFuZCBwdXQgdGhlbSBpbiB0aGUgcmlnaHQKLSAgICAgcGxhY2UgaW4gdGhlIGxpbmsgb3JkZXJpbmcuICBUaGlzIGlzIGVzcGVjaWFsbHkgbWFnaWMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwbHM7Ci0gICAgICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqaXM7Ci0gICAgICBjb25zdCBjaGFyICpvbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RhcnQ7Ci0KLSAgICAgIHNlYyA9IHNwZWNpYWxfc2VjdGlvbnNbaV07Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFJlbW92ZSB0aGlzIHNlY3Rpb24gZnJvbSB0aGUgbGlzdCBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uCi0gICAgICAgICBUaGlzIGFzc3VtZXMgd2Uga25vdyB3aGF0IHRoZSBzY3JpcHQgbG9va3MgbGlrZS4gICovCi0gICAgICBpcyA9IE5VTEw7Ci0gICAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBpZiAob3MgPT0gTlVMTCkKLQllaW5mbyAoIiVQJUY6IGNhbid0IGZpbmQgb3V0cHV0IHNlY3Rpb24gJXNcbiIsCi0JICAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotICAgICAgZm9yIChwbHMgPSAmb3MtPmNoaWxkcmVuLmhlYWQ7ICpwbHMgIT0gTlVMTDsgcGxzID0gJigqcGxzKS0+bmV4dCkKLQl7Ci0JICBpZiAoKCpwbHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCSAgICAgICYmICgqcGxzKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uID09IHNlYykKLQkgICAgewotCSAgICAgIGlzID0gKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICopICpwbHM7Ci0JICAgICAgKnBscyA9ICgqcGxzKS0+bmV4dDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKCgqcGxzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtKQotCSAgICB7Ci0JICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnB3bHM7Ci0KLQkgICAgICBmb3IgKHB3bHMgPSAmKCpwbHMpLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkOwotCQkgICAqcHdscyAhPSBOVUxMOwotCQkgICBwd2xzID0gJigqcHdscyktPm5leHQpCi0JCXsKLQkJICBpZiAoKCpwd2xzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KLQkJICAgICAgJiYgKCpwd2xzKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uID09IHNlYykKLQkJICAgIHsKLQkJICAgICAgaXMgPSAobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKikgKnB3bHM7Ci0JCSAgICAgICpwd2xzID0gKCpwd2xzKS0+bmV4dDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoaXMgIT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9CQotCi0gICAgICBpZiAoaXMgPT0gTlVMTCkKLQllaW5mbyAoIiVQJUY6IGNhbid0IGZpbmQgJXMgaW4gb3V0cHV0IHNlY3Rpb25cbiIsCi0JICAgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzZWMtPm93bmVyLCBzZWMpKTsKLQotICAgICAgLyogTm93IGZpZ3VyZSBvdXQgd2hlcmUgdGhlIHNlY3Rpb24gc2hvdWxkIGdvLiAgKi8KLSAgICAgIHN3aXRjaCAoaSkKLQl7Ci0JZGVmYXVsdDogLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KLQljYXNlIDA6Ci0JICAvKiBfdGV4dCAqLwotCSAgb25hbWUgPSAiLnRleHQiOwotCSAgc3RhcnQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgLyogX2V0ZXh0ICovCi0JICBvbmFtZSA9ICIudGV4dCI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgLyogX2RhdGEgKi8KLQkgIG9uYW1lID0gIi5kYXRhIjsKLQkgIHN0YXJ0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMzoKLQkgIC8qIF9lZGF0YSAqLwotCSAgb25hbWUgPSAiLmRhdGEiOwotCSAgc3RhcnQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JICAvKiBfZW5kIGFuZCBlbmQgKi8KLQkgIG9uYW1lID0gIi5ic3MiOwotCSAgc3RhcnQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKG9uYW1lKTsKLQotICAgICAgaWYgKHN0YXJ0KQotCXsKLQkgIGlzLT5oZWFkZXIubmV4dCA9IG9zLT5jaGlsZHJlbi5oZWFkOwotCSAgb3MtPmNoaWxkcmVuLmhlYWQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBpczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaXMtPmhlYWRlci5uZXh0ID0gTlVMTDsKLQkgIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAoJm9zLT5jaGlsZHJlbiwKLQkJCQkgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgaXMsCi0JCQkJICZpcy0+aGVhZGVyLm5leHQpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJlYWQgYW4gaW1wb3J0IG9yIGV4cG9ydCBmaWxlLiAgRm9yIGFuIGltcG9ydCBmaWxlLCB0aGlzIGlzIGNhbGxlZAotICAgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIGVtdWxhdGlvbiByb3V0aW5lLiAgRm9yIGFuIGV4cG9ydCBmaWxlLAotICAgdGhpcyBpcyBjYWxsZWQgYnkgdGhlIHBhcnNlX2FyZ3MgZW11bGF0aW9uIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcmVhZF9maWxlIChmaWxlbmFtZSwgaW1wb3J0KQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgYm9vbGVhbiBpbXBvcnQ7Ci17Ci0gIHN0cnVjdCBvYnN0YWNrICpvOwotICBGSUxFICpmOwotICBpbnQgbGluZW5vOwotICBpbnQgYzsKLSAgYm9vbGVhbiBrZWVwOwotICBjb25zdCBjaGFyICppbXBwYXRoOwotICBjb25zdCBjaGFyICppbXBmaWxlOwotICBjb25zdCBjaGFyICppbXBtZW1iZXI7Ci0KLSAgbyA9IChzdHJ1Y3Qgb2JzdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvYnN0YWNrKSk7Ci0gIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uIChvLCAwLCAwLCB4bWFsbG9jLCBnbGQke0VNVUxBVElPTl9OQU1FfV9mcmVlKTsKLQotICBmID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SVCk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGVpbmZvICgiJUYlczogJUVcbiIsIGZpbGVuYW1lKTsKLSAgICB9Ci0KLSAga2VlcCA9IGZhbHNlOwotCi0gIGltcHBhdGggPSBOVUxMOwotICBpbXBmaWxlID0gTlVMTDsKLSAgaW1wbWVtYmVyID0gTlVMTDsKLQotICBsaW5lbm8gPSAwOwotICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotICAgICAgYm9vbGVhbiBzeXNjYWxsOwotICAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGlmIChjICE9ICdcbicpCi0JewotCSAgb2JzdGFja18xZ3JvdyAobywgYyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG9ic3RhY2tfMWdyb3cgKG8sICdcMCcpOwotICAgICAgKytsaW5lbm87Ci0KLSAgICAgIHMgPSAoY2hhciAqKSBvYnN0YWNrX2Jhc2UgKG8pOwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JKytzOwotICAgICAgaWYgKCpzID09ICdcMCcKLQkgIHx8ICpzID09ICcqJwotCSAgfHwgKCpzID09ICcjJyAmJiBzWzFdID09ICcgJykKLQkgIHx8ICghIGltcG9ydCAmJiAqcyA9PSAnIycgJiYgc1sxXSA9PSAnIScpKQotCXsKLQkgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgqcyA9PSAnIycgJiYgc1sxXSA9PSAnIScpCi0JewotCSAgcyArPSAyOwotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JICAgICsrczsKLQkgIGlmICgqcyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaW1wcGF0aCA9IE5VTEw7Ci0JICAgICAgaW1wZmlsZSA9IE5VTEw7Ci0JICAgICAgaW1wbWVtYmVyID0gTlVMTDsKLQkgICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcyA9PSAnKCcpCi0JICAgIGVpbmZvICgiJUYlcyVkOiAjISAoW21lbWJlcl0pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gaW1wb3J0IGZpbGVzXG4iLAotCQkgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgY3M7Ci0JICAgICAgY2hhciAqZmlsZTsKLQotCSAgICAgICh2b2lkKSBvYnN0YWNrX2ZpbmlzaCAobyk7Ci0JICAgICAga2VlcCA9IHRydWU7Ci0JICAgICAgaW1wcGF0aCA9IHM7Ci0JICAgICAgZmlsZSA9IE5VTEw7Ci0JICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSAmJiAqcyAhPSAnKCcgJiYgKnMgIT0gJ1wwJykKLQkJewotCQkgIGlmICgqcyA9PSAnLycpCi0JCSAgICBmaWxlID0gcyArIDE7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKLQkJewotCQkgIGZpbGVbLTFdID0gJ1wwJzsKLQkJICBpbXBmaWxlID0gZmlsZTsKLQkJICBpZiAoaW1wcGF0aCA9PSBmaWxlIC0gMSkKLQkJICAgIGltcHBhdGggPSAiLyI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbXBmaWxlID0gaW1wcGF0aDsKLQkJICBpbXBwYXRoID0gIiI7Ci0JCX0KLQkgICAgICBjcyA9ICpzOwotCSAgICAgICpzID0gJ1wwJzsKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNzKSkKLQkJewotCQkgICsrczsKLQkJICBjcyA9ICpzOwotCQl9Ci0JICAgICAgaWYgKGNzICE9ICcoJykKLQkJewotCQkgIGltcG1lbWJlciA9ICIiOwotCQkgIGlmIChjcyAhPSAnXDAnKQotCQkgICAgZWluZm8gKCIlczolZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydCBmaWxlXG4iLAotCQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICArK3M7Ci0JCSAgaW1wbWVtYmVyID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJyknICYmICpzICE9ICdcMCcpCi0JCSAgICArK3M7Ci0JCSAgaWYgKCpzID09ICcpJykKLQkJICAgICpzID0gJ1wwJzsKLQkJICBlbHNlCi0JCSAgICBlaW5mbyAoIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0IGZpbGVcbiIsCi0JCQkgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIHN5bWJvbCB0byBiZSBpbXBvcnRlZCBvciBleHBvcnRlZC4gICovCi0gICAgICBzeW1uYW1lID0gczsKLSAgICAgIHN5c2NhbGwgPSBmYWxzZTsKLSAgICAgIGFkZHJlc3MgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykgJiYgKnMgIT0gJ1wwJykKLQkrK3M7Ci0gICAgICBpZiAoKnMgIT0gJ1wwJykKLQl7Ci0JICBjaGFyICpzZTsKLQotCSAgKnMrKyA9ICdcMCc7Ci0KLQkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgICArK3M7Ci0KLQkgIHNlID0gczsKLQkgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqc2UpICYmICpzZSAhPSAnXDAnKQotCSAgICArK3NlOwotCSAgaWYgKCpzZSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgKnNlKysgPSAnXDAnOwotCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlKSkKLQkJKytzZTsKLQkgICAgICBpZiAoKnNlICE9ICdcMCcpCi0JCWVpbmZvICgiJXMlZDogd2FybmluZzogc3ludGF4IGVycm9yIGluIGltcG9ydC9leHBvcnQgZmlsZVxuIiwKLQkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0KLQkgIGlmIChzID09IHNlKQotCSAgICB7Ci0JICAgICAgLyogVGhlcmUgd2FzIG5vIGFkZHJlc3MgYWZ0ZXIgYWxsLiAgKi8KLQkgICAgfQotCSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAocywgInN2YyIpID09IDAKLQkJICAgfHwgc3RyY2FzZWNtcCAocywgInN5c2NhbGwiKSA9PSAwKQotCSAgICBzeXNjYWxsID0gdHJ1ZTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgKmVuZDsKLQotCSAgICAgIGFkZHJlc3MgPSBzdHJ0b3VsIChzLCAmZW5kLCAwKTsKLQkgICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCQllaW5mbyAoIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0L2V4cG9ydCBmaWxlXG4iLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGltcG9ydCkKLQl7Ci0JICBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpuOwotCi0JICBsZGxhbmdfYWRkX3VuZGVmIChzeW1uYW1lKTsKLQkgIG4gPSAoKHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKikKLQkgICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0KSkpOwotCSAgbi0+bmV4dCA9IGV4cG9ydF9zeW1ib2xzOwotCSAgbi0+bmFtZSA9IGJ1eXN0cmluZyAoc3ltbmFtZSk7Ci0JICBuLT5zeXNjYWxsID0gc3lzY2FsbDsKLQkgIGV4cG9ydF9zeW1ib2xzID0gbjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgc3ltbmFtZSwgZmFsc2UsIGZhbHNlLAotCQkJCSAgICB0cnVlKTsKLQkgIGlmIChoID09IE5VTEwgfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLQkgICAgewotCSAgICAgIC8qIFdlIGNhbiBqdXN0IGlnbm9yZSBhdHRlbXB0cyB0byBpbXBvcnQgYW4gdW5yZWZlcmVuY2VkCi0JCSBzeW1ib2wuICAqLwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfeGNvZmZfaW1wb3J0X3N5bWJvbCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgaCwKLQkJCQkJICAgICBhZGRyZXNzLCBpbXBwYXRoLCBpbXBmaWxlLAotCQkJCQkgICAgIGltcG1lbWJlcikpCi0JCWVpbmZvICgiJVglczolZDogZmFpbGVkIHRvIGltcG9ydCBzeW1ib2wgJXM6ICVFXG4iLAotCQkgICAgICAgZmlsZW5hbWUsIGxpbmVubywgc3ltbmFtZSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0gICAgfQotCi0gIGlmIChvYnN0YWNrX29iamVjdF9zaXplIChvKSA+IDApCi0gICAgewotICAgICAgZWluZm8gKCIlczolZDogd2FybmluZzogaWdub3JpbmcgdW50ZXJtaW5hdGVkIGxhc3QgbGluZVxuIiwKLQkgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwotICAgICAgb2JzdGFja19mcmVlIChvLCBvYnN0YWNrX2Jhc2UgKG8pKTsKLSAgICB9Ci0KLSAgaWYgKCEga2VlcCkKLSAgICB7Ci0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIE5VTEwpOwotICAgICAgZnJlZSAobyk7Ci0gICAgfQotfQotCi0vKiBUaGlzIHJvdXRpbmUgc2F2ZXMgdXMgZnJvbSB3b3JyeWluZyBhYm91dCBkZWNsYXJpbmcgZnJlZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9mcmVlIChwKQotICAgICBQVFIgcDsKLXsKLSAgZnJlZSAocCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb29rcyBmb3IgcmVsb2NhdGlvbnMgYW5kIGFzc2lnbm1lbnRzCi0gICB0byBzeW1ib2xzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfcmVsb2NzIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bSkKLSAgICB7Ci0gICAgICBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyczsKLQotICAgICAgcnMgPSAmcy0+cmVsb2Nfc3RhdGVtZW50OwotICAgICAgaWYgKHJzLT5uYW1lID09IE5VTEwpCi0JZWluZm8gKCIlRiVQOiBvbmx5IHJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBhcmUgcGVybWl0dGVkXG4iKTsKLSAgICAgIGlmICghIGJmZF94Y29mZl9saW5rX2NvdW50X3JlbG9jIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBycy0+bmFtZSkpCi0JZWluZm8gKCIlRiVQOiBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyBmYWlsZWQ6ICVFXG4iKTsKLSAgICB9Ci0KLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSkKLSAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKLQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgYmZkX3hjb2ZmX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCi0JCQkJCQkgIGV4cC0+YXNzaWduLmRzdCkpCi0JICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvICVzOiAlRVxuIiwKLQkJICAgZXhwLT5hc3NpZ24uZHN0KTsKLQl9Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3RyaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5yaHMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIDAsCS8qIGZpbmlzaCAqLwotICAwLAkvKiBjcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyAqLwotICAwLAkvKiBvcGVuX2R5bmFtaWNfYXJjaGl2ZSAqLwotICAwLAkvKiBwbGFjZV9vcnBoYW4gKi8KLSAgMCwJLyogc2V0X3N5bWJvbHMgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncywKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdW5yZWNvZ25pemVkX2ZpbGUKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9hcm1jb2ZmLmVtIGIvbGQvZW11bHRlbXBsL2FybWNvZmYuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTc5OGYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2FybWNvZmYuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwyNzggKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci1zdGF0aWMgaW50ICBnbGQke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUygoaW50LCBjaGFyICoqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUyAoKHZvaWQpKTsKLQotLyogSWYgdHJ1ZSwgdGhlbiBpbnRlcndvcmtpbmcgc3R1YnMgd2hpY2ggc3VwcG9ydCBjYWxscyB0byBvbGQsIG5vbi1pbnRlcndvcmtpbmcKLSAgIGF3YXJlIEFSTSBjb2RlIHNob3VsZCBiZSBnZW5lcmF0ZWQuICAqLwotCi1zdGF0aWMgaW50IHN1cHBvcnRfb2xkX2NvZGUgPSAwOwotc3RhdGljIGNoYXIgKiB0aHVtYl9lbnRyeV9zeW1ib2wgPSBOVUxMOwotCi0jZGVmaW5lIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFCQkzMDAKLSNkZWZpbmUgT1BUSU9OX1RIVU1CX0VOVFJZCQkzMDEKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9Ci17Ci0gIHsic3VwcG9ydC1vbGQtY29kZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1VQUE9SVF9PTERfQ09ERX0sCi0gIHsidGh1bWItZW50cnkiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RIVU1CX0VOVFJZfSwKLSAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotfTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1zdXBwb3J0LW9sZC1jb2RlICAgU3VwcG9ydCBpbnRlcndvcmtpbmcgd2l0aCBvbGQgY29kZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tdGh1bWItZW50cnk9PHN5bT4gIFNldCB0aGUgZW50cnkgcG9pbnQgdG8gYmUgVGh1bWIgc3ltYm9sIDxzeW0+XG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCAgICAgYXJnYzsKLSAgICAgY2hhciAqKiBhcmd2OwotewotICBpbnQgICAgICAgIGxvbmdpbmQ7Ci0gIGludCAgICAgICAgb3B0YzsKLSAgaW50ICAgICAgICBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgICAgICAgIHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCAgICAgICAgd2FudGVycm9yOwotICBzdGF0aWMgaW50IGxhc3RvcHRpbmQgPSAtMTsKLQotICBpZiAobGFzdG9wdGluZCAhPSBvcHRpbmQpCi0gICAgb3B0ZXJyID0gMDsKLSAgCi0gIHdhbnRlcnJvciAgPSBvcHRlcnI7Ci0gIGxhc3RvcHRpbmQgPSBvcHRpbmQ7Ci0KLSAgb3B0YyAgID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi0iLCBsb25nb3B0cywgJiBsb25naW5kKTsKLSAgb3B0ZXJyID0gcHJldm9wdGVycjsKLQotICBzd2l0Y2ggKG9wdGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAod2FudGVycm9yKQotCXhleGl0ICgxKTsKLSAgICAgIG9wdGluZCA9ICBwcmV2b3B0aW5kOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFOgotICAgICAgc3VwcG9ydF9vbGRfY29kZSA9IDE7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1RIVU1CX0VOVFJZOgotICAgICAgdGh1bWJfZW50cnlfc3ltYm9sID0gb3B0YXJnOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgcmV0dXJuIDE7Ci19Ci0MCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlICgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgLyogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YiBzZWN0aW9uICovCi0KLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlIGluZm9ybWF0aW9uICovCi0gIC8qIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZSBvcHRpb24/IGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCEgYmZkX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0JICAgIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8sIHN1cHBvcnRfb2xkX2NvZGUpKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIpLCBpcy0+ZmlsZW5hbWUpOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLwotICBiZmRfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOwotfQotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgewotICAgICAgaWYgKGJmZF9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pKQotCWJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCBQQVJBTVMoKHZvaWQpKQotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLSAgaWYgKHRodW1iX2VudHJ5X3N5bWJvbCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHRodW1iX2VudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotICAgICAgJiYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkCi0JICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICAgICYmIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgYnVmZmVyWzMyXTsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgCi0gICAgICAvKiBTcGVjaWFsIHByb2Nlc2luZyBpcyByZXF1aXJlZCBmb3IgYSBUaHVtYiBlbnRyeSBzeW1ib2wuICBUaGUKLQkgYm90dG9tIGJpdCBvZiBpdHMgYWRkcmVzcyBtdXN0IGJlIHNldC4gICovCi0gICAgICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkgICAgICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkgICAgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JICAgICArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotICAgICAgCi0gICAgICB2YWwgfD0gMTsKLQotICAgICAgLyogTm93IGNvbnZlcnQgdGhpcyB2YWx1ZSBpbnRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiBlbnRyeV9zeW1ib2wKLSAgICAgICAgIHdoZXJlIHRoZSBsYW5nX2ZpbmlzaCgpIGZ1bmN0aW9uIHdpbGwgcGljayBpdCB1cC4gICovCi0gICAgICBidWZmZXJbMF0gPSAnMCc7Ci0gICAgICBidWZmZXJbMV0gPSAneCc7Ci0gICAgICAKLSAgICAgIHNwcmludGZfdm1hIChidWZmZXIgKyAyLCB2YWwpOwotCi0gICAgICBpZiAoZW50cnlfc3ltYm9sICE9IE5VTEwgJiYgZW50cnlfZnJvbV9jbWRsaW5lKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogJy0tdGh1bWItZW50cnkgJXMnIGlzIG92ZXJyaWRpbmcgJy1lICVzJ1xuIiksCi0JICAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCwgZW50cnlfc3ltYm9sKTsKLSAgICAgIGVudHJ5X3N5bWJvbCA9IGJ1ZmZlcjsKLSAgICB9Ci0gIGVsc2UKLSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6IGNvbm5vdCBmaW5kIHRodW1iIHN0YXJ0IHN5bWJvbCAlc1xuIiksIHRodW1iX2VudHJ5X3N5bWJvbCk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgKGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5pc2gsIC8qIGZpbmlzaCAqLwotICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLCAvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBOVUxMLCAvKiBwbGFjZSBvcnBoYW4gKi8KLSAgTlVMTCwgLyogc2V0X3N5bWJvbHMgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncywKLSAgTlVMTCwgLyogdW5yZWNvZ25pc2VkIGZpbGUgKi8KLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fbGlzdF9vcHRpb25zCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvYXJtZWxmLmVtIGIvbGQvZW11bHRlbXBsL2FybWVsZi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzY2ZhNi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYXJtZWxmLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTI3MCArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1FTEZTSVpFPTMyCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIGVtdWxhdGUgdGhlIG9yaWdpbmFsIGdsZCBmb3IgdGhlIGdpdmVuICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWFyY2hfZGlyc190eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbgotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGFzZWN0aW9uICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLXN0YXRpYyBpbnQgIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgUEFSQU1TKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucyBQQVJBTVMgKChGSUxFICopKTsKLXN0YXRpYyB2b2lkIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9maW5pc2ggUEFSQU1TICgodm9pZCkpOwotCi0MCi1zdGF0aWMgaW50IG5vX3BpcGVsaW5lX2tub3dsZWRnZSA9IDA7Ci1zdGF0aWMgY2hhciAqIHRodW1iX2VudHJ5X3N5bWJvbCA9IE5VTEw7Ci0KLSNkZWZpbmUgT1BUSU9OX1RIVU1CX0VOVFJZCQkzMDEKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ29wdHNbXSA9Ci17Ci0gIHsgIm5vLXBpcGVsaW5lLWtub3dsZWRnZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncCd9LAotICB7ICJ0aHVtYi1lbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEhVTUJfRU5UUll9LAotICB7IE5VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwIH0KLX07Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9saXN0X29wdGlvbnMgKGZpbGUpCi0gICAgIEZJTEUgKiBmaWxlOwotewotICBmcHJpbnRmIChmaWxlLCBfKCIgIC1wIC0tbm8tcGlwZWxpbmUta25vd2xlZGdlICBTdG9wIHRoZSBsaW5rZXIga25vd2luZyBhYm91dCB0aGUgcGlwZWxpbmUgbGVuZ3RoXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgICAgLS10aHVtYi1lbnRyeT08c3ltPiAgICAgIFNldCB0aGUgZW50cnkgcG9pbnQgdG8gYmUgVGh1bWIgc3ltYm9sIDxzeW0+XG4iKSk7Ci19Ci0KLXN0YXRpYyBpbnQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpCi0gICAgIGludCAgICAgYXJnYzsKLSAgICAgY2hhciAqKiBhcmd2OwotewotICBpbnQgICAgICAgIGxvbmdpbmQ7Ci0gIGludCAgICAgICAgb3B0YzsKLSAgaW50ICAgICAgICBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgICAgICAgIHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCAgICAgICAgd2FudGVycm9yOwotICBzdGF0aWMgaW50IGxhc3RvcHRpbmQgPSAtMTsKLQotICBpZiAobGFzdG9wdGluZCAhPSBvcHRpbmQpCi0gICAgb3B0ZXJyID0gMDsKLSAgCi0gIHdhbnRlcnJvciAgPSBvcHRlcnI7Ci0gIGxhc3RvcHRpbmQgPSBvcHRpbmQ7Ci0KLSAgb3B0YyAgID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi1wIiwgbG9uZ29wdHMsICYgbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHdhbnRlcnJvcikKLQl4ZXhpdCAoMSk7Ci0gICAgICBvcHRpbmQgPSAgcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAncCc6Ci0gICAgICBub19waXBlbGluZV9rbm93bGVkZ2UgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9USFVNQl9FTlRSWToKLSAgICAgIHRodW1iX2VudHJ5X3N5bWJvbCA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgCi0gIHJldHVybiAxOwotfQotDAotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlICgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSAke0RZTkFNSUNfTElOSy10cnVlfTsKLSAgY29uZmlnLmhhc19zaGFyZWQgPSBgaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCIgOyB0aGVuIGVjaG8gdHJ1ZSA7IGVsc2UgZWNobyBmYWxzZSA7IGZpYDsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGFyY2hpdmUuICBUaGlzIGlzIHdoZXJlIHdlIGtub3cgdGhhdCBFTEYKLSAgIGR5bmFtaWMgbGlicmFyaWVzIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5zby4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gIGNoYXIgKnN0cmluZzsKLQotICBpZiAoISBlbnRyeS0+aXNfYXJjaGl2ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZmlsZW5hbWUgPSBlbnRyeS0+ZmlsZW5hbWU7Ci0KLSAgc3RyaW5nID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChzZWFyY2gtPm5hbWUpCi0JCQkgICAgICsgc3RybGVuIChmaWxlbmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkgICAgICsgc2l6ZW9mICIvbGliLnNvIik7Ci0KLSAgc3ByaW50ZiAoc3RyaW5nLCAiJXMvbGliJXMlcy5zbyIsIHNlYXJjaC0+bmFtZSwgZmlsZW5hbWUsIGFyY2gpOwotCi0gIGlmICghIGxkZmlsZV90cnlfb3Blbl9iZmQgKHN0cmluZywgZW50cnkpKQotICAgIHsKLSAgICAgIGZyZWUgKHN0cmluZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGVudHJ5LT5maWxlbmFtZSA9IHN0cmluZzsKLQotICAvKiBXZSBoYXZlIGZvdW5kIGEgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBpbiB0aGUgbGluay4gIFRoZSBFTEYKLSAgICAgYmFja2VuZCBsaW5rZXIgd2lsbCBjcmVhdGUgYSBEVF9ORUVERUQgZW50cnkgaW4gdGhlIC5keW5hbWljCi0gICAgIHNlY3Rpb24gbmFtaW5nIHRoaXMgZmlsZS4gIElmIHRoaXMgZmlsZSBpbmNsdWRlcyBhIERUX1NPTkFNRQotICAgICBlbnRyeSwgaXQgd2lsbCBiZSB1c2VkLiAgT3RoZXJ3aXNlLCB0aGUgRUxGIGxpbmtlciB3aWxsIGp1c3QgdXNlCi0gICAgIHRoZSBuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIGFuIGFyY2hpdmUgZm91bmQgYnkgc2VhcmNoaW5nLCBsaWtlCi0gICAgIHRoaXMgb25lLCB0aGUgRFRfTkVFREVEIGVudHJ5IHNob3VsZCBjb25zaXN0IG9mIGp1c3QgdGhlIG5hbWUgb2YKLSAgICAgdGhlIGZpbGUsIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24gdXNlZCB0byBmaW5kIGl0LiAgTm90ZQotICAgICB0aGF0IHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGlmIHdlIGhhdmUgYSBkeW5hbWljIG9iamVjdDsgYW4KLSAgICAgYXJjaGl2ZSB3aWxsIG5ldmVyIGJlIHJlZmVyZW5jZWQgYnkgYSBEVF9ORUVERUQgZW50cnkuCi0KLSAgICAgRklYTUU6IFRoaXMgYXBwcm9hY2gtLXVzaW5nIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lLS1pcyBub3QKLSAgICAgdmVyeSBwcmV0dHkuICBJIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRoaW5rIG9mIGFueXRoaW5nIHRoYXQgaXMKLSAgICAgcHJldHR5LCB0aG91Z2guICAqLwotICBpZiAoYmZkX2NoZWNrX2Zvcm1hdCAoZW50cnktPnRoZV9iZmQsIGJmZF9vYmplY3QpCi0gICAgICAmJiAoZW50cnktPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpuZWVkZWRfbmFtZTsKLQotICAgICAgQVNTRVJUIChlbnRyeS0+aXNfYXJjaGl2ZSAmJiBlbnRyeS0+c2VhcmNoX2RpcnNfZmxhZyk7Ci0gICAgICBuZWVkZWRfbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkJICAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkJICAgICAgKyBzaXplb2YgImxpYi5zbyIpOwotICAgICAgc3ByaW50ZiAobmVlZGVkX25hbWUsICJsaWIlcyVzLnNvIiwgZmlsZW5hbWUsIGFyY2gpOwotICAgICAgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUgKGVudHJ5LT50aGVfYmZkLCBuZWVkZWRfbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLS8qIEZvciBhIG5hdGl2ZSBsaW5rZXIsIGNoZWNrIHRoZSBmaWxlIC9ldGMvbGQuc28uY29uZiBmb3IgZGlyZWN0b3JpZXMKLSAgIGluIHdoaWNoIHdlIG1heSBmaW5kIHNoYXJlZCBsaWJyYXJpZXMuICAvZXRjL2xkLnNvLmNvbmYgaXMgcmVhbGx5Ci0gICBvbmx5IG1lYW5pbmdmdWwgb24gTGludXgsIGJ1dCB3ZSBjaGVjayBpdCBvbiBvdGhlciBzeXN0ZW1zIGFueWhvdy4gICovCi0KLXN0YXRpYyBib29sZWFuIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX2xkX3NvX2NvbmYgKG5hbWUsIGZvcmNlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgZm9yY2U7Ci17Ci0gIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkOwotICBzdGF0aWMgY2hhciAqbGRfc29fY29uZjsKLQotICBpZiAoISBpbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBGSUxFICpmOwotCi0gICAgICBmID0gZm9wZW4gKCIvZXRjL2xkLnNvLmNvbmYiLCBGT1BFTl9SVCk7Ci0gICAgICBpZiAoZiAhPSBOVUxMKQotCXsKLQkgIGNoYXIgKmI7Ci0JICBzaXplX3QgbGVuLCBhbGxvYzsKLQkgIGludCBjOwotCi0JICBsZW4gPSAwOwotCSAgYWxsb2MgPSAxMDA7Ci0JICBiID0gKGNoYXIgKikgeG1hbGxvYyAoYWxsb2MpOwotCi0JICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQotCSAgICB7Ci0JICAgICAgaWYgKGxlbiArIDEgPj0gYWxsb2MpCi0JCXsKLQkJICBhbGxvYyAqPSAyOwotCQkgIGIgPSAoY2hhciAqKSB4cmVhbGxvYyAoYiwgYWxsb2MpOwotCQl9Ci0JICAgICAgaWYgKGMgIT0gJzonCi0JCSAgJiYgYyAhPSAnICcKLQkJICAmJiBjICE9ICdcdCcKLQkJICAmJiBjICE9ICdcbicKLQkJICAmJiBjICE9ICcsJykKLQkJewotCQkgIGJbbGVuXSA9IGM7Ci0JCSAgKytsZW47Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAobGVuID4gMCAmJiBiW2xlbiAtIDFdICE9ICc6JykKLQkJICAgIHsKLQkJICAgICAgYltsZW5dID0gJzonOwotCQkgICAgICArK2xlbjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGlmIChsZW4gPiAwICYmIGJbbGVuIC0gMV0gPT0gJzonKQotCSAgICAtLWxlbjsKLQotCSAgaWYgKGxlbiA+IDApCi0JICAgIGJbbGVuXSA9ICdcMCc7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBmcmVlIChiKTsKLQkgICAgICBiID0gTlVMTDsKLQkgICAgfQotCi0JICBmY2xvc2UgKGYpOwotCi0JICBsZF9zb19jb25mID0gYjsKLQl9Ci0KLSAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaWYgKGxkX3NvX2NvbmYgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxkX3NvX2NvbmYsIG5hbWUsIGZvcmNlKTsKLX0KLQotRU9GCi0gIDs7Ci0gIGVzYWMKLWZpCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmFjayBhbmQgZm9ydGgKLSAgIGJldHdlZW4gYWZ0ZXJfb3BlbiBhbmQgY2hlY2tfbmVlZGVkIGFuZCBzdGF0X25lZWRlZCBhbmQgdmVyY2hlY2suICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfbmVlZGVkOwotc3RhdGljIHN0cnVjdCBzdGF0IGdsb2JhbF9zdGF0Owotc3RhdGljIGJvb2xlYW4gZ2xvYmFsX2ZvdW5kOwotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF92ZXJjaGVja19mYWlsZWQ7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbmVlZGVkLCAqbDsKLQotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgewotICAgICAgLyogVGhlIGludGVyd29ya2luZyBiZmQgbXVzdCBiZSB0aGUgbGFzdCBvbmUgdG8gYmUgcHJvY2Vzc2VkICovCi0gICAgICBpZiAoIWlzLT5uZXh0KQotICAgICAgICAgYmZkX2VsZjMyX2FybV9nZXRfYmZkX2Zvcl9pbnRlcndvcmtpbmcgKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbyk7Ci0gICAgfQotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBEVF9ORUVERUQgZW50cmllcyBpbgotICAgICBkeW5hbWljIG9iamVjdHMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgKG9mdGVuIHRoZXJlIHdpbGwgYmUgbm9uZSkuCi0gICAgIEZvciBlYWNoIHN1Y2ggZmlsZSwgd2Ugd2FudCB0byB0cmFjayBkb3duIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgIGxpYnJhcnksIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUgaW4gdGhlIGxpbmsuICBUaGlzIGlzIHdoYXQKLSAgICAgdGhlIHJ1bnRpbWUgZHluYW1pYyBsaW5rZXIgd2lsbCBkby4gIFRyYWNraW5nIHRoZSBmaWxlcyBkb3duIGhlcmUKLSAgICAgcGVybWl0cyBvbmUgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBhbm90aGVyIHdpdGhvdXQgcmVxdWlyaW5nCi0gICAgIHNwZWNpYWwgYWN0aW9uIGJ5IHRoZSBwZXJzb24gZG9pbmcgdGhlIGxpbmsuICBOb3RlIHRoYXQgdGhlCi0gICAgIG5lZWRlZCBsaXN0IGNhbiBhY3R1YWxseSBncm93IHdoaWxlIHdlIGFyZSBzdGVwcGluZyB0aHJvdWdoIHRoaXMKLSAgICAgbG9vcC4gICovCi0gIG5lZWRlZCA9IGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0IChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbGw7Ci0gICAgICBpbnQgZm9yY2U7Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGZpbGUsIHNraXAgaXQuICAqLwotICAgICAgZm9yIChsbCA9IG5lZWRlZDsgbGwgIT0gbDsgbGwgPSBsbC0+bmV4dCkKLQlpZiAoc3RyY21wIChsbC0+bmFtZSwgbC0+bmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGxsICE9IGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLwotICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7Ci0gICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZmluZCB0aGlzIGZpbGUgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZS4gIFdlCi0JIHdhbnQgdG8gc2VhcmNoIGZvciB0aGUgZmlsZSBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgZHluYW1pYwotCSBsaW5rZXIgd2lsbCBzZWFyY2guICBUaGF0IG1lYW5zIHRoYXQgd2Ugd2FudCB0byB1c2UKLQkgcnBhdGhfbGluaywgcnBhdGgsIHRoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0JIExEX0xJQlJBUllfUEFUSCAobmF0aXZlIG9ubHkpLCB0aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JIExJQl9TRUFSQ0hfRElSUy4gIFdlIGRvIG5vdCBzZWFyY2ggdXNpbmcgdGhlIC1MIGFyZ3VtZW50cy4KLQotCSBXZSBzZWFyY2ggdHdpY2UuICBUaGUgZmlyc3QgdGltZSwgd2Ugc2tpcCBvYmplY3RzIHdoaWNoIG1heQotCSBpbnRyb2R1Y2UgdmVyc2lvbiBtaXNtYXRjaGVzLiAgVGhlIHNlY29uZCB0aW1lLCB3ZSBmb3JjZQotCSB0aGVpciB1c2UuICBTZWUgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sgY29tbWVudC4gICovCi0gICAgICBmb3IgKGZvcmNlID0gMDsgZm9yY2UgPCAyOyBmb3JjZSsrKQotCXsKLQkgIGNvbnN0IGNoYXIgKmxpYl9wYXRoOwotCSAgc2l6ZV90IGxlbjsKLQkgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rLAotCQkJCQkJICBsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aCwKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMCi0JICAgICAgJiYgY29tbWFuZF9saW5lLnJwYXRoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsLT5uYW1lLAotCQkJCQkJICAgICAgZm9yY2UpKQotCQlicmVhazsKLQkgICAgfQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9MSUJSQVJZX1BBVEgiKTsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGxlbiA9IHN0cmxlbiAobC0+bmFtZSk7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICB7Ci0JICAgICAgY2hhciAqZmlsZW5hbWU7Ci0KLQkgICAgICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCQljb250aW51ZTsKLQkgICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIGxlbiArIDIpOwotCSAgICAgIHNwcmludGYgKGZpbGVuYW1lLCAiJXMvJXMiLCBzZWFyY2gtPm5hbWUsIGwtPm5hbWUpOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChmaWxlbmFtZSwgZm9yY2UpKQotCQlicmVhazsKLQkgICAgICBmcmVlIChmaWxlbmFtZSk7Ci0JICAgIH0KLQkgIGlmIChzZWFyY2ggIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZiAobC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQl9Ci0KLSAgICAgIGlmIChmb3JjZSA8IDIpCi0JY29udGludWU7Ci0KLSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZCAodHJ5IHVzaW5nIC0tcnBhdGgpXG4iLAotCSAgICAgbC0+bmFtZSwgbC0+YnkpOwotICAgIH0KLX0KLQotLyogU2VhcmNoIGZvciBhIG5lZWRlZCBmaWxlIGluIGEgcGF0aC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChwYXRoLCBuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBjb25zdCBjaGFyICpzOwotICBzaXplX3QgbGVuOwotCi0gIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGVuYW1lLCAqc3NldDsKLQotICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHBhdGggKyBzdHJsZW4gKHBhdGgpOwotCi0gICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHMgLSBwYXRoICsgbGVuICsgMik7Ci0gICAgICBpZiAocyA9PSBwYXRoKQotCXNzZXQgPSBmaWxlbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKGZpbGVuYW1lLCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBmaWxlbmFtZVtzIC0gcGF0aF0gPSAnLyc7Ci0JICBzc2V0ID0gZmlsZW5hbWUgKyAocyAtIHBhdGgpICsgMTsKLQl9Ci0gICAgICBzdHJjcHkgKHNzZXQsIG5hbWUpOwotCi0gICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCi0gICAgICBpZiAoKnMgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgIHBhdGggPSBzICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwkgIAotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBwb3NzaWJsZSBuYW1lIGZvciBhIGR5bmFtaWMgb2JqZWN0Ci0gICBuYW1lZCBieSBhIERUX05FRURFRCBlbnRyeS4gIFRoZSBGT1JDRSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIKLSAgIHRvIHNraXAgdGhlIGNoZWNrIGZvciBhIGNvbmZsaWN0aW5nIHZlcnNpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAobmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgYmZkICphYmZkOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBvYmplY3Qgd291bGQgaW5jbHVkZSBhbnkgY29uZmxpY3RpbmcgbGlicmFyeQotICAgICB2ZXJzaW9ucy4gIElmIEZPUkNFIGlzIHNldCwgdGhlbiB3ZSBza2lwIHRoaXMgY2hlY2s7IHdlIHVzZSB0aGlzCi0gICAgIHRoZSBzZWNvbmQgdGltZSBhcm91bmQsIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IGNvbXBhdGlibGUKLSAgICAgaW5zdGFuY2Ugb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotICBpZiAoISBmb3JjZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKLQotICAgICAgaWYgKCEgYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IChhYmZkLCAmbmVlZGVkKSkKLQllaW5mbyAoIiVGJVA6JUI6IGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKLQotICAgICAgaWYgKG5lZWRlZCAhPSBOVUxMKQotCXsKLQkgIGdsb2JhbF92ZXJjaGVja19uZWVkZWQgPSBuZWVkZWQ7Ci0JICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gZmFsc2U7Ci0JICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrKTsKLQkgIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JICAgICAgLyogUmV0dXJuIGZhbHNlIHRvIGZvcmNlIHRoZSBjYWxsZXIgdG8gbW92ZSBvbiB0byB0cnkKLSAgICAgICAgICAgICAgICAgYW5vdGhlciBmaWxlIG9uIHRoZSBzZWFyY2ggcGF0aC4gICovCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEJ1dCB3YWl0ISAgSXQgZ2V0cyBtdWNoIHdvcnNlLiAgT24gTGludXgsIGlmIGEgc2hhcmVkCi0gICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCB1c2UgbGliYyBhdCBhbGwsIHdlIGFyZSBzdXBwb3NlZCB0byBza2lwCi0gICAgICAgICAgICAgaXQgdGhlIGZpcnN0IHRpbWUgYXJvdW5kIGluIGNhc2Ugd2UgZW5jb3VudGVyIGEgc2hhcmVkCi0gICAgICAgICAgICAgbGlicmFyeSBsYXRlciBvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggZG9lcyB1c2UgdGhlCi0gICAgICAgICAgICAgdmVyc2lvbiBvZiBsaWJjIHRoYXQgd2Ugd2FudC4gIFRoaXMgaXMgbXVjaCB0b28gaG9ycmlibGUKLSAgICAgICAgICAgICB0byB1c2Ugb24gYW55IHN5c3RlbSBvdGhlciB0aGFuIExpbnV4LiAgKi8KLQotRU9GCi1jYXNlICR7dGFyZ2V0fSBpbgotICAqLSotbGludXgtZ251KikKLSAgICBjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLQkgICAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICAgIGlmIChzdHJuY21wIChsLT5uYW1lLCAibGliYy5zbyIsIDcpID09IDApCi0JCWJyZWFrOwotCSAgICBpZiAobCA9PSBOVUxMKQotCSAgICAgIHsKLQkJKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0KLUVPRgotICAgIDs7Ci1lc2FjCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCX0KLSAgICB9Ci0KLSAgLyogV2UndmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCBtYXRjaGluZyB0aGUgRFRfTkVFREVEIGVudHJ5LiAgKi8KLQotICAvKiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlIGlzIG5vIG90aGVyIGlucHV0IGZpbGUgb2YgdGhlCi0gICAgIHNhbWUgbmFtZS4gIFdlIG11c3Qgbm93IGNoZWNrIGFnYWluIHRoYXQgd2UgYXJlIG5vdCBpbmNsdWRpbmcgdGhlCi0gICAgIHNhbWUgZmlsZSB0d2ljZS4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9uIG1hbnkgc3lzdGVtcwotICAgICBsaWJjLnNvIGlzIGEgc3ltbGluayB0bywgZS5nLiwgbGliYy5zby4xLiAgVGhlIFNPTkFNRSBlbnRyeSB3aWxsCi0gICAgIHJlZmVyZW5jZSBsaWJjLnNvLjEuICBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgbGliYy5zbywgd2UKLSAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIGxpYmMuc28uMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBmaWxlLCBhbmQgd2UKLSAgICAgY2FuIG9ubHkgY2hlY2sgdGhhdCB1c2luZyBzdGF0LiAgKi8KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZnbG9iYWxfc3RhdCkgIT0gMCkKLSAgICBlaW5mbyAoIiVGJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIGFiZmQpOwotICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk7Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgewotICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2gKLSAgICAgICAgIHdlIGFyZW4ndCBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUZWxsIHRoZSBFTEYgYmFja2VuZCB0aGF0IGRvbid0IHdhbnQgdGhlIG91dHB1dCBmaWxlIHRvIGhhdmUgYQotICAgICBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZmlsZS4gICovCi0gIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCAiIik7Ci0KLSAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiwgYWJmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzLT50aGVfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc29uYW1lOwotCi0gICAgICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKHNvbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0JICAKLSAgaWYgKHMtPnNlYXJjaF9kaXJzX2ZsYWcKLSAgICAgICYmIHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmY7Ci0KLSAgICAgIGYgPSBzdHJyY2hyIChzLT5maWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChmICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoZiArIDEsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IHJ1bm5pbmcgc3RhdCBvbgotICAgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjb25zdCBjaGFyICpzdWZmaXg7Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgY29uc3QgY2hhciAqZjsKLQotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9zdGF0IChzLT50aGVfYmZkLCAmc3QpICE9IDApCi0gICAgewotICAgICAgZWluZm8gKCIlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiwgcy0+dGhlX2JmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdC5zdF9kZXYgPT0gZ2xvYmFsX3N0YXQuc3RfZGV2Ci0gICAgICAmJiBzdC5zdF9pbm8gPT0gZ2xvYmFsX3N0YXQuc3RfaW5vKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIGlzc3VlIGEgd2FybmluZyBpZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBpbmNsdWRpbmcgdHdvCi0gICAgIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeS4gIEZvciBleGFtcGxlLAotICAgICB0aGVyZSBtYXkgYmUgYSBwcm9ibGVtIGlmIC1sYyBwaWNrcyB1cCBsaWJjLnNvLjYgYnV0IHNvbWUgb3RoZXIKLSAgICAgc2hhcmVkIGxpYnJhcnkgaGFzIGEgRFRfTkVFREVEIGVudHJ5IG9mIGxpYmMuc28uNS4gIFRoaXMgaXMgYQotICAgICBodWVyaXN0aWMgdGVzdCwgYW5kIGl0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBuYW1lIGxvb2tzIGxpa2UKLSAgICAgTkFNRS5zby5WRVJTSU9OLiAgRklYTUU6IERlcGVuZGluZyBvbiBmaWxlIG5hbWVzIGlzIGVycm9yLXByb25lLgotICAgICBJZiB3ZSByZWFsbHkgd2FudCB0byBpc3N1ZSB3YXJuaW5ncyBhYm91dCBtaXhpbmcgdmVyc2lvbiBudW1iZXJzCi0gICAgIG9mIHNoYXJlZCBsaWJyYXJpZXMsIHdlIG5lZWQgdG8gZmluZCBhIGJldHRlciB3YXkuICAqLwotCi0gIGlmIChzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCA9IHN0cnN0ciAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi5zby4iKTsKLSAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBzLT5maWxlbmFtZTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgaWYgKHN0cm5jbXAgKGYsIGdsb2JhbF9uZWVkZWQtPm5hbWUsIHN1ZmZpeCAtIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbWF5IGNvbmZsaWN0IHdpdGggJXNcbiIsCi0JICAgZ2xvYmFsX25lZWRlZC0+bmFtZSwgZ2xvYmFsX25lZWRlZC0+YnksIGYpOwotfQotCi0vKiBPbiBMaW51eCwgaXQncyBwb3NzaWJsZSB0byBoYXZlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotICAgc2hhcmVkIGxpYnJhcnkgbGlua2VkIGFnYWluc3QgZGlmZmVyZW50IHZlcnNpb25zIG9mIGxpYmMuICBUaGUKLSAgIGR5bmFtaWMgbGlua2VyIHNvbWVob3cgdGFncyB3aGljaCBsaWJjIHZlcnNpb24gdG8gdXNlIGluCi0gICAvZXRjL2xkLnNvLmNhY2hlLCBhbmQsIGJhc2VkIG9uIHRoZSBsaWJjIHRoYXQgaXQgc2VlcyBpbiB0aGUKLSAgIGV4ZWN1dGFibGUsIGNob29zZXMgd2hpY2ggdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgdG8gdXNlLgotCi0gICBXZSB0cnkgdG8gZG8gYSBzaW1pbGFyIGNoZWNrIGhlcmUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGlzIHNoYXJlZAotICAgbGlicmFyeSBuZWVkcyBhbnkgb3RoZXIgc2hhcmVkIGxpYnJhcmllcyB3aGljaCBtYXkgY29uZmxpY3Qgd2l0aAotICAgbGlicmFyaWVzIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIElmIGl0IGRvZXMsIHdlCi0gICBza2lwIGl0LCBhbmQgdHJ5IHRvIGZpbmQgYW5vdGhlciBzaGFyZWQgbGlicmFyeSBmYXJ0aGVyIG9uIGRvd24gdGhlCi0gICBsaW5rIHBhdGguCi0KLSAgIFRoaXMgaXMgY2FsbGVkIHZpYSBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUuCi0gICBHTE9CQUxfVkVSQ0hFQ0tfTkVFREVEIGlzIHRoZSBsaXN0IG9mIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBvYmplY3QKLSAgIHdoaWNoIHdlIGFyIGNoZWNraW5nLiAgVGhpcyBzZXRzIEdMT0JBTF9WRVJDSEVDS19GQUlMRUQgaWYgd2UgZmluZAotICAgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBjb25zdCBjaGFyICpzb25hbWUsICpmOwotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLSAgaWYgKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpCi0gICAgcmV0dXJuOwotICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMCi0gICAgICB8fCAoYmZkX2dldF9maWxlX2ZsYWdzIChzLT50aGVfYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzLT50aGVfYmZkKTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgZm9yIChsID0gZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzdWZmaXg7Ci0KLSAgICAgIGlmIChzdHJjbXAgKGYsIGwtPm5hbWUpID09IDApCi0JewotCSAgLyogUHJvYmFibHkgY2FuJ3QgaGFwcGVuLCBidXQgaXQncyBhbiBlYXN5IGNoZWNrLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmNociAobC0+bmFtZSwgJy8nKSAhPSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWZmaXggPSBzdHJzdHIgKGwtPm5hbWUsICIuc28uIik7Ci0gICAgICBpZiAoc3VmZml4ID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICAgICAgaWYgKHN0cm5jbXAgKGYsIGwtPm5hbWUsIHN1ZmZpeCAtIGwtPm5hbWUpID09IDApCi0JewotCSAgLyogSGVyZSB3ZSBrbm93IHRoYXQgUyBpcyBhIGR5bmFtaWMgb2JqZWN0IEZPTy5TTy5WRVIxLCBhbmQKLSAgICAgICAgICAgICB0aGUgb2JqZWN0IHdlIGFyZSBjb25zaWRlcmluZyBuZWVkcyBhIGR5bmFtaWMgb2JqZWN0Ci0gICAgICAgICAgICAgRk9PLlNPLlZFUjIsIGFuZCBWRVIxIGFuZCBWRVIyIGFyZSBkaWZmZXJlbnQuICBUaGlzCi0gICAgICAgICAgICAgYXBwZWFycyB0byBiZSBhIHZlcnNpb24gbWlzbWF0Y2gsIHNvIHdlIHRlbGwgdGhlIGNhbGxlcgotICAgICAgICAgICAgIHRvIHRyeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeS4gICovCi0JICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCByYW5kb20gU0hGX0FMTE9DCi0gICBzZWN0aW9ucyBpbiB0aGUgcmlnaHQgc2VnbWVudC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JvZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZWw7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9pbnRlcnA7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOwotICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOwotICBldHJlZV90eXBlICphZGRyZXNzOwotICBjb25zdCBjaGFyICpzZWNuYW1lLCAqcHM7Ci0gIGNvbnN0IGNoYXIgKm91dHNlY25hbWU7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLwotICBob2xkX3NlY3Rpb24gPSBzOwotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGFscmVhZHkgcGxhY2VkIGEgc2VjdGlvbiB3aXRoIHRoaXMgbmFtZS4gICovCi0gICAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZmluYWwgbGluaywgdGhlbiBhbHdheXMgcHV0IC5nbnUud2FybmluZy5TWU1CT0wKLSAgICAgc2VjdGlvbnMgaW50byB0aGUgLnRleHQgc2VjdGlvbiB0byBnZXQgdGhlbSBvdXQgb2YgdGhlIHdheS4gICovCi0gIGlmICghIGxpbmtfaW5mby5zaGFyZWQKLSAgICAgICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMAotICAgICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgd2lsZF9kb2l0ICgmaG9sZF90ZXh0LT5jaGlsZHJlbiwgcywgaG9sZF90ZXh0LCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBEZWNpZGUgd2hpY2ggc2VnbWVudCB0aGUgc2VjdGlvbiBzaG91bGQgZ28gaW4gYmFzZWQgb24gdGhlCi0gICAgIHNlY3Rpb24gbmFtZSBhbmQgc2VjdGlvbiBmbGFncy4gIFdlIHB1dCBsb2FkYWJsZSAubm90ZSBzZWN0aW9ucwotICAgICByaWdodCBhZnRlciB0aGUgLmludGVycCBzZWN0aW9uLCBzbyB0aGF0IHRoZSBQVF9OT1RFIHNlZ21lbnQgaXMKLSAgICAgc3RvcmVkIHJpZ2h0IGFmdGVyIHRoZSBwcm9ncmFtIGhlYWRlcnMgd2hlcmUgdGhlIE9TIGNhbiByZWFkIGl0Ci0gICAgIGluIHRoZSBmaXJzdCBwYWdlLiAgKi8KLSAgcGxhY2UgPSBOVUxMOwotICBpZiAocy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLm5vdGUiLCA0KSA9PSAwCi0gICAgICAmJiBob2xkX2ludGVycCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9pbnRlcnA7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICAmJiBob2xkX2JzcyAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9ic3M7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICYmIGhvbGRfZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9kYXRhOwotICBlbHNlIGlmIChzdHJuY21wIChzZWNuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkgICAmJiBob2xkX3JlbCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yZWw7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgJiYgKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF9yb2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcm9kYXRhOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfdGV4dDsKLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENob29zZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgc2VjdGlvbi4gIFRoaXMgd2lsbCBiZSBuZWVkZWQgaWYgdGhlCi0gICAgIHNhbWUgc2VjdGlvbiBuYW1lIGFwcGVhcnMgaW4gdGhlIGlucHV0IGZpbGUgd2l0aCBkaWZmZXJlbnQKLSAgICAgbG9hZGFibGUgb3IgYWxsb2NhdGVhYmxlIGNoYXJhY3RlcmlzdGljcy4gICovCi0gIG91dHNlY25hbWUgPSBzZWNuYW1lOwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dHNlY25hbWUpICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICAgIGNoYXIgKm5ld25hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgbGVuID0gc3RybGVuIChvdXRzZWNuYW1lKTsKLSAgICAgIG5ld25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgb3V0c2VjbmFtZSk7Ci0gICAgICBpID0gMDsKLSAgICAgIGRvCi0JewotCSAgc3ByaW50ZiAobmV3bmFtZSArIGxlbiwgIiVkIiwgaSk7Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotICAgICAgb3V0c2VjbmFtZSA9IG5ld25hbWU7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlLiAgVGhpcyBzaHVmZmxpbmcgaXMgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgbG9vayBuZWF0ZXIuICAqLwotICBzbmV3ID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSk7Ci0gIGlmIChzbmV3ID09IE5VTEwpCi0gICAgICBlaW5mbyAoIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiwKLQkgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICBpZiAocGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQk7Ci0gICAgICAqcHBzID0gc25ldy0+bmV4dDsKLSAgICAgIHNuZXctPm5leHQgPSBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQ7Ci0gICAgICBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQgPSBzbmV3OwotICAgIH0KLQotICAvKiBTdGFydCBidWlsZGluZyBhIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgb2xkID0gc3RhdF9wdHI7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICAvKiBJZiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpcyByZXByZXNlbnRhYmxlIGluIEMsIHRoZW4gY3JlYXRlCi0gICAgIHN5bWJvbHMgdG8gbWFyayB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICAqLwotICBmb3IgKHBzID0gb3V0c2VjbmFtZTsgKnBzICE9ICdcMCc7IHBzKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwcykgJiYgKnBzICE9ICdfJykKLSAgICAgIGJyZWFrOwotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0YXJ0XyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RhcnRfJXMiLCBvdXRzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAotCQkJCQkJZXhwX2ludG9wICgoYmZkX3ZtYSkgMQotCQkJCQkJCSAgIDw8IHMtPmFsaWdubWVudF9wb3dlcikpKSk7Ci0gICAgfQotCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgYWRkcmVzcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBhZGRyZXNzID0gZXhwX2ludG9wICgoYmZkX3ZtYSkgMCk7Ci0KLSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJICAgICAgIChiZmRfdm1hKSAwLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0c2VjbmFtZSk7Ci0gIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCi0gIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gICAgKChiZmRfdm1hKSAwLCAiKmRlZmF1bHQqIiwgKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSBOVUxMKTsKLSAgc3RhdF9wdHIgPSAmYWRkOwotCi0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIG91dHNlY25hbWUgKyBzaXplb2YgIl9fc3RvcF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0b3BfJXMiLCBvdXRzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIikpKTsKLSAgICB9Ci0KLSAgLyogTm93IHN0aWNrIHRoZSBuZXcgc3RhdGVtZW50IGxpc3QgcmlnaHQgYWZ0ZXIgUExBQ0UuICAqLwotICAqYWRkLnRhaWwgPSBwbGFjZS0+aGVhZGVyLm5leHQ7Ci0gIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCi0gIHN0YXRfcHRyID0gb2xkOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbiAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKHMtPmhlYWRlci50eXBlICE9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0pCi0gICAgcmV0dXJuOwotCi0gIG9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgaG9sZF9zZWN0aW9uLT5uYW1lKSA9PSAwCi0gICAgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotICAgICAgJiYgKChob2xkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLQkgID09IChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkpKQotICAgIGhvbGRfdXNlID0gb3M7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIudGV4dCIpID09IDApCi0gICAgaG9sZF90ZXh0ID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIucm9kYXRhIikgPT0gMCkKLSAgICBob2xkX3JvZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgIGhvbGRfZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmJzcyIpID09IDApCi0gICAgaG9sZF9ic3MgPSBvczsKLSAgZWxzZSBpZiAoaG9sZF9yZWwgPT0gTlVMTAotCSAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0JICAgJiYgKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAmJiBzdHJuY21wIChvcy0+bmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotICAgIGhvbGRfcmVsID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuaW50ZXJwIikgPT0gMCkKLSAgICBob2xkX2ludGVycCA9IG9zOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGV4cC0+YXNzaWduLmRzdCwKLQkJCQlmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgIGlmIChoID09IE5VTEwpCi0JYnJlYWs7Ci0KLSAgICAgIC8qIFdlIGNhbGwgcmVjb3JkX2xpbmtfYXNzaWdubWVudCBldmVuIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4KLQkgVGhpcyBpcyBiZWNhdXNlIGlmIGl0IGlzIGRlZmluZWQgYnkgYSBkeW5hbWljIG9iamVjdCwgd2UKLQkgYWN0dWFsbHkgd2FudCB0byB1c2UgdGhlIHZhbHVlIGRlZmluZWQgYnkgdGhlIGxpbmtlciBzY3JpcHQsCi0JIG5vdCB0aGUgdmFsdWUgZnJvbSB0aGUgZHluYW1pYyBvYmplY3QgKGJlY2F1c2Ugd2UgYXJlIHNldHRpbmcKLQkgc3ltYm9scyBsaWtlIGV0ZXh0KS4gIElmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBieSBhIHJlZ3VsYXIKLQkgb2JqZWN0LCB0aGVuLCBhcyBpdCBoYXBwZW5zLCBjYWxsaW5nIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkgd2lsbCBkbyBubyBoYXJtLiAgKi8KLQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIChiZmRfZWxmJHtFTEZTSVpFfV9yZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JCSAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgZXhwLT5hc3NpZ24uZHN0LAotCQkgIGV4cC0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX3Byb3ZpZGUgPyB0cnVlIDogZmFsc2UpKSkKLQkgICAgZWluZm8gKCIlUCVGOiBmYWlsZWQgdG8gcmVjb3JkIGFzc2lnbm1lbnQgdG8gJXM6ICVFXG4iLAotCQkgICBleHAtPmFzc2lnbi5kc3QpOwotCX0KLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+YmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdHJpbmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LnJocyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvY2F0ZXMgYW55IGFzc2lnbm1lbnQgc3RhdGVtZW50cywgYW5kCi0gICB0ZWxscyB0aGUgRUxGIGJhY2tlbmQgYWJvdXQgdGhlbSwgaW4gY2FzZSB0aGV5IGFyZSBhc3NpZ25tZW50cyB0bwotICAgc3ltYm9scyB3aGljaCBhcmUgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb25zIGhhdmUgYmVlbiBhdHRhY2hlZCB0byBvdXRwdXQKLSAgIHNlY3Rpb25zLCBidXQgYmVmb3JlIGFueSBzaXplcyBvciBhZGRyZXNzZXMgaGF2ZSBiZWVuIHNldC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBjb25zdCBjaGFyICpycGF0aDsKLSAgYXNlY3Rpb24gKnNpbnRlcnA7Ci0KLSAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIG1ha2UgYW55IHZhcmlhYmxlIGFzc2lnbm1lbnRzLCB3ZSBuZWVkIHRvIGxldAotICAgICB0aGUgRUxGIGJhY2tlbmQga25vdyBhYm91dCB0aGVtIGluIGNhc2UgdGhlIHZhcmlhYmxlcyBhcmUKLSAgICAgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQpOwotCi0gIC8qIExldCB0aGUgRUxGIGJhY2tlbmQgd29yayBvdXQgdGhlIHNpemVzIG9mIGFueSBzZWN0aW9ucyByZXF1aXJlZAotICAgICBieSBkeW5hbWljIGxpbmtpbmcuICAqLwotICBycGF0aCA9IGNvbW1hbmRfbGluZS5ycGF0aDsKLSAgaWYgKHJwYXRoID09IE5VTEwpCi0gICAgcnBhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotICBpZiAoISAoYmZkX2VsZiR7RUxGU0laRX1fc2l6ZV9keW5hbWljX3NlY3Rpb25zCi0gICAgICAgICAob3V0cHV0X2JmZCwgY29tbWFuZF9saW5lLnNvbmFtZSwgcnBhdGgsCi0JICBjb21tYW5kX2xpbmUuZXhwb3J0X2R5bmFtaWMsIGNvbW1hbmRfbGluZS5maWx0ZXJfc2hsaWIsCi0JICAoY29uc3QgY2hhciAqIGNvbnN0ICopIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycywKLQkgICZsaW5rX2luZm8sICZzaW50ZXJwLCBsYW5nX2VsZl92ZXJzaW9uX2luZm8pKSkKLSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIik7Ci0KLSAgLyogTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSBkeW5hbWljIGxpbmtlciB3ZSBhcmUgdXNpbmcuICAqLwotICBpZiAoY29tbWFuZF9saW5lLmludGVycHJldGVyICE9IE5VTEwKLSAgICAgICYmIHNpbnRlcnAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzaW50ZXJwLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXI7Ci0gICAgICBzaW50ZXJwLT5fcmF3X3NpemUgPSBzdHJsZW4gKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcikgKyAxOwotICAgIH0KLQotICAvKiBMb29rIGZvciBhbnkgc2VjdGlvbnMgbmFtZWQgLmdudS53YXJuaW5nLiAgQXMgYSBHTlUgZXh0ZW5zaW9ucywKLSAgICAgd2UgdHJlYXQgc3VjaCBzZWN0aW9ucyBhcyBjb250YWluaW5nIHdhcm5pbmcgbWVzc2FnZXMuICBXZSBwcmludAotICAgICBvdXQgdGhlIHdhcm5pbmcgbWVzc2FnZSwgYW5kIHRoZW4gemVybyBvdXQgdGhlIHNlY3Rpb24gc2l6ZSBzbwotICAgICB0aGF0IGl0IGRvZXMgbm90IGdldCBjb3BpZWQgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JYXNlY3Rpb24gKnM7Ci0JYmZkX3NpemVfdHlwZSBzejsKLQljaGFyICptc2c7Ci0JYm9vbGVhbiByZXQ7Ci0KLQlpZiAoaXMtPmp1c3Rfc3ltc19mbGFnKQotCSAgY29udGludWU7Ci0KLQlzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGlzLT50aGVfYmZkLCAiLmdudS53YXJuaW5nIik7Ci0JaWYgKHMgPT0gTlVMTCkKLQkgIGNvbnRpbnVlOwotCi0Jc3ogPSBiZmRfc2VjdGlvbl9zaXplIChpcy0+dGhlX2JmZCwgcyk7Ci0JbXNnID0geG1hbGxvYyAoKHNpemVfdCkgc3ogKyAxKTsKLQlpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKGlzLT50aGVfYmZkLCBzLCBtc2csIChmaWxlX3B0cikgMCwgc3opKQotCSAgZWluZm8gKCIlRiVCOiBDYW4ndCByZWFkIGNvbnRlbnRzIG9mIHNlY3Rpb24gLmdudS53YXJuaW5nOiAlRVxuIiwKLQkJIGlzLT50aGVfYmZkKTsKLQltc2dbc3pdID0gJ1wwJzsKLQlyZXQgPSBsaW5rX2luZm8uY2FsbGJhY2tzLT53YXJuaW5nICgmbGlua19pbmZvLCBtc2csCi0JCQkJCSAgICAoY29uc3QgY2hhciAqKSBOVUxMLAotCQkJCQkgICAgaXMtPnRoZV9iZmQsIChhc2VjdGlvbiAqKSBOVUxMLAotCQkJCQkgICAgKGJmZF92bWEpIDApOwotCUFTU0VSVCAocmV0KTsKLQlmcmVlIChtc2cpOwotCi0JLyogQ2xvYmJlciB0aGUgc2VjdGlvbiBzaXplLCBzbyB0aGF0IHdlIGRvbid0IHdhc3RlIGNvcHlpbmcgdGhlCi0JICAgd2FybmluZyBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0Jcy0+X3Jhd19zaXplID0gMDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIgc2VjdGlvbiAqLwotCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZSBpbmZvcm1hdGlvbiAqLwotICAvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUgb3B0aW9uPyBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8sCi0JCQkJCQkgICAgICBub19waXBlbGluZV9rbm93bGVkZ2UpKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIpLCBpcy0+ZmlsZW5hbWUpOwotCSAgfQotICAgICAgfQotICB9Ci0KLSAgLyogV2UgaGF2ZSBzZWVuIGl0IGFsbC4gQWxsb2NhdGUgaXQsIGFuZCBjYXJyeSBvbiAqLwotICBiZmRfZWxmMzJfYXJtX2FsbG9jYXRlX2ludGVyd29ya2luZ19zZWN0aW9ucyAoJiBsaW5rX2luZm8pOwotfQotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoIFBBUkFNUygodm9pZCkpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICogaDsKLQotICBpZiAodGh1bWJfZW50cnlfc3ltYm9sID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAKLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdGh1bWJfZW50cnlfc3ltYm9sLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0gICAgICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZmZXJbMzJdOwotICAgICAgYmZkX3ZtYSB2YWw7Ci0gICAgICAKLSAgICAgIC8qIFNwZWNpYWwgcHJvY2VzaW5nIGlzIHJlcXVpcmVkIGZvciBhIFRodW1iIGVudHJ5IHN5bWJvbC4gIFRoZQotCSBib3R0b20gYml0IG9mIGl0cyBhZGRyZXNzIG11c3QgYmUgc2V0LiAgKi8KLSAgICAgIHZhbCA9IChoLT51LmRlZi52YWx1ZQotCSAgICAgKyBiZmRfZ2V0X3NlY3Rpb25fdm1hIChvdXRwdXRfYmZkLAotCQkJCSAgICBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbikKLQkgICAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCk7Ci0gICAgICAKLSAgICAgIHZhbCB8PSAxOwotCi0gICAgICAvKiBOb3cgY29udmVydCB0aGlzIHZhbHVlIGludG8gYSBzdHJpbmcgYW5kIHN0b3JlIGl0IGluIGVudHJ5X3N5bWJvbAotICAgICAgICAgd2hlcmUgdGhlIGxhbmdfZmluaXNoKCkgZnVuY3Rpb24gd2lsbCBwaWNrIGl0IHVwLiAgKi8KLSAgICAgIGJ1ZmZlclswXSA9ICcwJzsKLSAgICAgIGJ1ZmZlclsxXSA9ICd4JzsKLSAgICAgIAotICAgICAgc3ByaW50Zl92bWEgKGJ1ZmZlciArIDIsIHZhbCk7Ci0KLSAgICAgIGlmIChlbnRyeV9zeW1ib2wgIT0gTlVMTCAmJiBlbnRyeV9mcm9tX2NtZGxpbmUpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiAnLS10aHVtYi1lbnRyeSAlcycgaXMgb3ZlcnJpZGluZyAnLWUgJXMnXG4iKSwKLQkgICAgICAgdGh1bWJfZW50cnlfc3ltYm9sLCBlbnRyeV9zeW1ib2wpOwotICAgICAgZW50cnlfc3ltYm9sID0gYnVmZmVyOwotICAgIH0KLSAgZWxzZQotICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogY29ubm90IGZpbmQgdGh1bWIgc3RhcnQgc3ltYm9sICVzXG4iKSwgdGh1bWJfZW50cnlfc3ltYm9sKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCAoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIE5VTEwsIC8qIHNldF9zeW1ib2xzICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIE5VTEwsIC8qIHVucmVjb2duaXNlZCBmaWxlICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucywKLSAgTlVMTCAvKiByZWNvZ25pemVkIGZpbGUgKi8KLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbSBiL2xkL2VtdWx0ZW1wbC9hcm1lbGZfb2FiaS5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhNTBkZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYXJtZWxmX29hYmkuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIFwKLQliZmRfZWxmMzJfYXJtX29hYmlfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9lbGYzMl9hcm1fcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2VsZjMyX2FybV9vYWJpX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0KLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSAoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfc2V0X291dHB1dF9hcmNoICgiYGVjaG8gJHtBUkNIfWAiKTsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIC8qIHdlIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJ3b3JraW5nIHN0dWIgc2VjdGlvbiAqLwotCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZSBpbmZvcm1hdGlvbiAqLwotICAvKiBGSVhNRTogc2hvdWxkIHRoaXMgYmUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUgb3B0aW9uPyBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghYmZkX2VsZjMyX2FybV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uIChpcy0+dGhlX2JmZCwgJmxpbmtfaW5mbywgMCkpCi0JICB7Ci0JICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICAgIGVpbmZvIChfKCJFcnJvcnMgZW5jb3VudGVyZWQgcHJvY2Vzc2luZyBmaWxlICVzIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9lbGYzMl9hcm1fYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuICgpCi17Ci0KLSAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgIHsKLSAgICAgIC8qIFRoZSBpbnRlcndvcmtpbmcgYmZkIG11c3QgYmUgdGhlIGxhc3Qgb25lIHRvIGJlIHByb2Nlc3NlZCAqLwotICAgICAgaWYgKCFpcy0+bmV4dCkKLSAgICAgICAgIGJmZF9lbGYzMl9hcm1fZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCAoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsIC8qIGZpbmlzaCAqLwotICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLCAvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBOVUxMLCAvKiBwbGFjZSBvcnBoYW4gKi8KLSAgTlVMTCwgLyogc2V0X3N5bWJvbHMgKi8KLSAgTlVMTCwKLSAgTlVMTCwgLyogdW5yZWNvZ25pc2VkIGZpbGUgKi8KLSAgTlVMTAotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL2Jlb3MuZW0gYi9sZC9lbXVsdGVtcGwvYmVvcy5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiM2VjMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvYmVvcy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDgzNyArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIFdJTkRPV1NfTlQgKi8KLS8qIFRoZSBvcmlnaW5hbCBmaWxlIGdlbmVyYXRlZCByZXR1cm5lZCBkaWZmZXJlbnQgZGVmYXVsdCBzY3JpcHRzIGRlcGVuZGluZwotICAgb24gd2hldGhlciBjZXJ0YWluIHN3aXRjaGVzIHdlcmUgc2V0LCBidXQgdGhlc2Ugc3dpdGNoZXMgcGVydGFpbiB0byB0aGUKLSAgIExpbnV4IHN5c3RlbSBhbmQgdGhhdCBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgY29mZi4gIEluIHRoZSBOVCBjYXNlLCB3ZQotICAgb25seSBkZXRlcm1pbmUgaWYgdGhlIHN1YnN5c3RlbSBpcyBjb25zb2xlIG9yIHdpbmRvd3MgaW4gb3JkZXIgdG8gc2VsZWN0Ci0gICB0aGUgY29ycmVjdCBlbnRyeSBwb2ludCBieSBkZWZhdWx0LiAqLyAKLSAgCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImdldG9wdC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImNvZmYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliY29mZi5oIgotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIGNoYXIgKmdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqKSk7Ci1zdGF0aWMgaW50IGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi0jaWYgMCAvKiBhcmd1bWVudCB0byBxc29ydCBzbyBkb24ndCBwcm90b3R5cGUgKi8KLXN0YXRpYyBpbnQgc29ydF9ieV9maWxlX25hbWUgUEFSQU1TICgodm9pZCAqLCB2b2lkICopKTsKLXN0YXRpYyBpbnQgc29ydF9ieV9zZWN0aW9uX25hbWUgUEFSQU1TICgodm9pZCAqLCB2b2lkICopKTsKLSNlbmRpZgotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipzb3J0X3NlY3Rpb25zXzEKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiwgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqLCBpbnQsCi0JICAgaW50ICgqKSgpKSk7Ci1zdGF0aWMgdm9pZCBzb3J0X3NlY3Rpb25zIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotCi1zdGF0aWMgc3RydWN0IGludGVybmFsX2V4dHJhX3BlX2FvdXRoZHIgcGU7Ci1zdGF0aWMgaW50IGRsbDsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBvdXRwdXRfZmlsZW5hbWUgPSAiYS5leGUiOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci19Ci0MCi0vKiBQRSBmb3JtYXQgZXh0cmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuICAqLwotCi0vKiBVc2VkIGZvciBzZXR0aW5nIGZsYWdzIGluIHRoZSBQRSBoZWFkZXIuICovCi0jZGVmaW5lIE9QVElPTl9CQVNFX0ZJTEUJCSgzMDAgICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RMTAkJCShPUFRJT05fQkFTRV9GSUxFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0ZJTEVfQUxJR05NRU5UCQkoT1BUSU9OX0RMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTUFHRV9CQVNFCQkoT1BUSU9OX0ZJTEVfQUxJR05NRU5UICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9JTUFHRV9CQVNFICsgMSkKLSNkZWZpbmUgT1BUSU9OX01BSk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01BSk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTgkoT1BUSU9OX01BSk9SX1NVQlNZU1RFTV9WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX09TX1ZFUlNJT04JCShPUFRJT05fTUlOT1JfSU1BR0VfVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTgkoT1BUSU9OX01JTk9SX09TX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU0VDVElPTl9BTElHTk1FTlQJKE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9TVEFDSyAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9TVUJTWVNURU0gICAgICAgICAgICAgICAgKE9QVElPTl9TVEFDSyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUFQCQkJKE9QVElPTl9TVUJTWVNURU0gKyAxKQotCi1zdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nb3B0c1tdID0gewotICAvKiBQRSBvcHRpb25zICovCi0gICAgeyJiYXNlLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0JBU0VfRklMRX0sCi0gICAgeyJkbGwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RMTH0sCi0gICAgeyJmaWxlLWFsaWdubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRklMRV9BTElHTk1FTlR9LAotICAgIHsiaGVhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSEVBUH0sIAotICAgIHsiaW1hZ2UtYmFzZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1BR0VfQkFTRX0sIAotICAgIHsibWFqb3ItaW1hZ2UtdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfSU1BR0VfVkVSU0lPTn0sCi0gICAgeyJtYWpvci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OfSwKLSAgICB7Im1ham9yLXN1YnN5c3RlbS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTn0sCi0gICAgeyJtaW5vci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9JTUFHRV9WRVJTSU9OfSwKLSAgICB7Im1pbm9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX09TX1ZFUlNJT059LAotICAgIHsibWlub3Itc3Vic3lzdGVtLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OfSwKLSAgICB7InNlY3Rpb24tYWxpZ25tZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TRUNUSU9OX0FMSUdOTUVOVH0sCi0gICAgeyJzdGFjayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBQ0t9LAotICAgIHsic3Vic3lzdGVtIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVUJTWVNURU19LAotICAge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAwfQotICB9OwotCi0KLS8qIFBFL1dJTjMyOyBhZGRlZCByb3V0aW5lcyB0byBnZXQgdGhlIHN1YnN5c3RlbSB0eXBlLCBoZWFwIGFuZC9vciBzdGFjawotICAgcGFyYW1ldGVycyB3aGljaCBtYXkgYmUgaW5wdXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdm9pZCAqcHRyOwotICBpbnQgc2l6ZTsKLSAgaW50IHZhbHVlOwotICBjaGFyICpzeW1ib2w7Ci0gIGludCBpbml0ZWQ7Ci19IGRlZmluZm87Ci0KLSNkZWZpbmUgRChmaWVsZCxzeW1ib2wsZGVmKSAgeyZwZS5maWVsZCxzaXplb2YocGUuZmllbGQpLCBkZWYsIHN5bWJvbCwwfQotCi1zdGF0aWMgZGVmaW5mbyBpbml0W10gPQotewotICAvKiBpbWFnZWJhc2UgbXVzdCBiZSBmaXJzdCAqLwotI2RlZmluZSBJTUFHRUJBU0VPRkYgMAotICBEKEltYWdlQmFzZSwiX19pbWFnZV9iYXNlX18iLCBCRU9TX0VYRV9JTUFHRV9CQVNFKSwKLSNkZWZpbmUgRExMT0ZGIDEKLSAgeyZkbGwsIHNpemVvZihkbGwpLCAwLCAiX19kbGxfXyJ9LAotICBEKFNlY3Rpb25BbGlnbm1lbnQsIl9fc2VjdGlvbl9hbGlnbm1lbnRfXyIsIFBFX0RFRl9TRUNUSU9OX0FMSUdOTUVOVCksCi0gIEQoRmlsZUFsaWdubWVudCwiX19maWxlX2FsaWdubWVudF9fIiwgUEVfREVGX0ZJTEVfQUxJR05NRU5UKSwKLSAgRChNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24sIl9fbWFqb3Jfb3NfdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21pbm9yX29zX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9ySW1hZ2VWZXJzaW9uLCJfX21ham9yX2ltYWdlX3ZlcnNpb25fXyIsIDEpLAotICBEKE1pbm9ySW1hZ2VWZXJzaW9uLCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIsIDApLAotICBEKE1ham9yU3Vic3lzdGVtVmVyc2lvbiwiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgNCksCi0gIEQoTWlub3JTdWJzeXN0ZW1WZXJzaW9uLCJfX21pbm9yX3N1YnN5c3RlbV92ZXJzaW9uX18iLCAwKSwKLSAgRChTdWJzeXN0ZW0sIl9fc3Vic3lzdGVtX18iLCAzKSwKLSAgRChTaXplT2ZTdGFja1Jlc2VydmUsIl9fc2l6ZV9vZl9zdGFja19yZXNlcnZlX18iLCAweDIwMDAwMDApLAotICBEKFNpemVPZlN0YWNrQ29tbWl0LCJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iLCAweDEwMDApLAotICBEKFNpemVPZkhlYXBSZXNlcnZlLCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAweDEwMDAwMCksCi0gIEQoU2l6ZU9mSGVhcENvbW1pdCwiX19zaXplX29mX2hlYXBfY29tbWl0X18iLCAweDEwMDApLAotICBEKExvYWRlckZsYWdzLCJfX2xvYWRlcl9mbGFnc19fIiwgMHgwKSwKLSAgeyBOVUxMLCAwLCAwLCBOVUxMLCAwIH0KLX07Ci0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9uYW1lIChuYW1lLCB2YWwpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxvbmcgdmFsOwotewotICBpbnQgaTsKLSAgLyogRmluZCB0aGUgbmFtZSBhbmQgc2V0IGl0LiAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLnB0cjsgaSsrKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIGluaXRbaV0uc3ltYm9sKSA9PSAwKQotCXsKLQkgIGluaXRbaV0udmFsdWUgPSB2YWw7Ci0JICBpbml0W2ldLmluaXRlZCA9IDE7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgYWJvcnQoKTsKLX0KLQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX3N1YnN5c3RlbSAoKQotewotICBjb25zdCBjaGFyICpzdmVyOwotICBpbnQgbGVuOwotICBpbnQgaTsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCAKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICAgY29uc3QgaW50IHZhbHVlOwotICAgICAgY29uc3QgY2hhciAqZW50cnk7Ci0gICAgfQotICB2W10gPQotICAgIHsKLSAgICAgIHsgIm5hdGl2ZSIsIDEsICJfTnRQcm9jZXNzU3RhcnR1cCIgfSwKLSAgICAgIHsgIndpbmRvd3MiLCAyLCAiX1dpbk1haW5DUlRTdGFydHVwIiB9LAotICAgICAgeyAid3dpbmRvd3MiLCAyLCAiX3dXaW5NYWluQ1JUU3RhcnR1cCIgfSwKLSAgICAgIHsgImNvbnNvbGUiLCAzLCAiX21haW5DUlRTdGFydHVwIiB9LAotICAgICAgeyAid2NvbnNvbGUiLCAzLCAiX3dtYWluQ1JUU3RhcnR1cCIgfSwKLSNpZiAwCi0gICAgICAvKiBUaGUgTWljcm9zb2Z0IGxpbmtlciBkb2VzIG5vdCByZWNvZ25pemUgdGhpcy4gICovCi0gICAgICB7ICJvczIiLCA1LCAiIiB9LAotI2VuZGlmCi0gICAgICB7ICJwb3NpeCIsIDcsICJfX19Qb3NpeFByb2Nlc3NTdGFydHVwIn0sCi0gICAgICB7IDAsIDAsIDAgfQotICAgIH07Ci0KLSAgc3ZlciA9IHN0cmNociAob3B0YXJnLCAnOicpOwotICBpZiAoc3ZlciA9PSBOVUxMKQotICAgIGxlbiA9IHN0cmxlbiAob3B0YXJnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmVuZDsKLQotICAgICAgbGVuID0gc3ZlciAtIG9wdGFyZzsKLSAgICAgIHNldF9wZV9uYW1lICgiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgc3RydG91bCAoc3ZlciArIDEsICZlbmQsIDApKTsKLSAgICAgIGlmICgqZW5kID09ICcuJykKLQlzZXRfcGVfbmFtZSAoIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCi0JCSAgICAgc3RydG91bCAoZW5kICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoIiVQOiB3YXJuaW5nOiBiYWQgdmVyc2lvbiBudW1iZXIgaW4gLXN1YnN5c3RlbSBvcHRpb25cbiIpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyB2W2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAob3B0YXJnLCB2W2ldLm5hbWUsIGxlbikgPT0gMAotCSAgJiYgdltpXS5uYW1lW2xlbl0gPT0gJ1wwJykKLQl7Ci0JICBzZXRfcGVfbmFtZSAoIl9fc3Vic3lzdGVtX18iLCB2W2ldLnZhbHVlKTsKLQotCSAgLyogSWYgdGhlIHN1YnN5c3RlbSBpcyB3aW5kb3dzLCB3ZSB1c2UgYSBkaWZmZXJlbnQgZW50cnkKLQkgICAgIHBvaW50LiAgV2UgYWxzbyByZWdpc3RlciB0aGUgZW50cnkgcG9pbnQgYXMgYW4gdW5kZWZpbmVkCi0JICAgICBzeW1ib2wuIGZyb20gbGFuZ19hZGRfZW50cnkoKSBUaGUgcmVhc29uIHdlIGRvCi0JICAgICB0aGlzIGlzIHNvIHRoYXQgdGhlIHVzZXIKLQkgICAgIGRvZXNuJ3QgaGF2ZSB0byBiZWNhdXNlIHRoZXkgd291bGQgaGF2ZSB0byB1c2UgdGhlIC11Ci0JICAgICBzd2l0Y2ggaWYgdGhleSB3ZXJlIHNwZWNpZnlpbmcgYW4gZW50cnkgcG9pbnQgb3RoZXIgdGhhbgotCSAgICAgX21haW5DUlRTdGFydHVwLiAgU3BlY2lmaWNhbGx5LCBpZiBjcmVhdGluZyBhIHdpbmRvd3MKLQkgICAgIGFwcGxpY2F0aW9uLCBlbnRyeSBwb2ludCBfV2luTWFpbkNSVFN0YXJ0dXAgbXVzdCBiZQotCSAgICAgc3BlY2lmaWVkLiAgV2hhdCBJIGhhdmUgZm91bmQgZm9yIG5vbiBjb25zb2xlCi0JICAgICBhcHBsaWNhdGlvbnMgKGVudHJ5IG5vdCBfbWFpbkNSVFN0YXJ0dXApIGlzIHRoYXQgdGhlIC5vYmoKLQkgICAgIHRoYXQgY29udGFpbnMgbWFpbkNSVFN0YXJ0dXAgaXMgYnJvdWdodCBpbiBzaW5jZSBpdCBpcwotCSAgICAgdGhlIGZpcnN0IGVuY291bnRlcmVkIGluIGxpYmMubGliIGFuZCBpdCBoYXMgb3RoZXIKLQkgICAgIHN5bWJvbHMgaW4gaXQgd2hpY2ggd2lsbCBiZSBwdWxsZWQgaW4gYnkgdGhlIGxpbmsKLQkgICAgIHByb2Nlc3MuICBUbyBhdm9pZCB0aGlzLCBhZGRpbmcgLXUgd2l0aCB0aGUgZW50cnkgcG9pbnQKLQkgICAgIG5hbWUgc3BlY2lmaWVkIGZvcmNlcyB0aGUgY29ycmVjdCAub2JqIHRvIGJlIHVzZWQuICBXZQotCSAgICAgY2FuIGF2b2lkIG1ha2luZyB0aGUgdXNlciBkbyB0aGlzIGJ5IGFsd2F5cyBhZGRpbmcgdGhlCi0JICAgICBlbnRyeSBwb2ludCBuYW1lIGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotCSAgbGFuZ19hZGRfZW50cnkgKHZbaV0uZW50cnksIDEpOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgZWluZm8gKCIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iLCBvcHRhcmcpOwotfQotCi0KLQotc3RhdGljIHZvaWQKLXNldF9wZV92YWx1ZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgCi17Ci0gIGNoYXIgKmVuZDsKLSAgc2V0X3BlX25hbWUgKG5hbWUsICBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApKTsKLSAgaWYgKGVuZCA9PSBvcHRhcmcpCi0gICAgewotICAgICAgZWluZm8gKCIlUCVGOiBpbnZhbGlkIGhleCBudW1iZXIgZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iLCBvcHRhcmcpOwotICAgIH0KLQotICBvcHRhcmcgPSBlbmQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfc3RhY2tfaGVhcCAocmVzbmFtZSwgY29tbmFtZSkKLSAgICAgY2hhciAqcmVzbmFtZTsKLSAgICAgY2hhciAqY29tbmFtZTsKLXsKLSAgc2V0X3BlX3ZhbHVlIChyZXNuYW1lKTsKLSAgaWYgKCpvcHRhcmcgPT0gJywnKQotICAgIHsKLSAgICAgIG9wdGFyZysrOwotICAgICAgc2V0X3BlX3ZhbHVlIChjb21uYW1lKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpvcHRhcmcpCi0gICAgewotICAgICAgZWluZm8gKCIlUCVGOiBzdHJhbmdlIGhleCBpbmZvIGZvciBQRSBwYXJhbWV0ZXIgJyVzJ1xuIiwgb3B0YXJnKTsKLSAgICB9Ci19Ci0KLQotCi1zdGF0aWMgaW50Ci1nbGRfJHtFTVVMQVRJT05fTkFNRX1fcGFyc2VfYXJncyhhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBsb25naW5kOwotICBpbnQgb3B0YzsKLSAgaW50IHByZXZvcHRpbmQgPSBvcHRpbmQ7Ci0gIGludCBwcmV2b3B0ZXJyID0gb3B0ZXJyOwotICBpbnQgd2FudGVycm9yOwotICBzdGF0aWMgaW50IGxhc3RvcHRpbmQgPSAtMTsKLQotICBpZiAobGFzdG9wdGluZCAhPSBvcHRpbmQpCi0gICAgb3B0ZXJyID0gMDsKLSAgd2FudGVycm9yID0gb3B0ZXJyOwotCi0gIGxhc3RvcHRpbmQgPSBvcHRpbmQ7Ci0KLSAgb3B0YyA9IGdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsICItIiwgbG9uZ29wdHMsICZsb25naW5kKTsKLSAgb3B0ZXJyID0gcHJldm9wdGVycjsKLQotICBzd2l0Y2ggKG9wdGMpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAod2FudGVycm9yKQotCXhleGl0ICgxKTsKLSAgICAgIG9wdGluZCA9ICBwcmV2b3B0aW5kOwotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjYXNlIE9QVElPTl9CQVNFX0ZJTEU6Ci0gICAgICBsaW5rX2luZm8uYmFzZV9maWxlID0gKFBUUikgZm9wZW4gKG9wdGFyZywgRk9QRU5fV0IpOwotICAgICAgaWYgKGxpbmtfaW5mby5iYXNlX2ZpbGUgPT0gTlVMTCkKLQl7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIlczogQ2FuJ3Qgb3BlbiBiYXNlIGZpbGUgJXNcbiIsCi0JCSAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgIHhleGl0ICgxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogUEUgb3B0aW9ucyAqLwotICAgIGNhc2UgT1BUSU9OX0hFQVA6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAiX19zaXplX29mX2hlYXBfY29tbWl0X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NUQUNLOiAKLSAgICAgIHNldF9wZV9zdGFja19oZWFwICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsICJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NVQlNZU1RFTToKLSAgICAgIHNldF9wZV9zdWJzeXN0ZW0gKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9vc192ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRklMRV9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX2ZpbGVfYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19zZWN0aW9uX2FsaWdubWVudF9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9ETEw6Ci0gICAgICBzZXRfcGVfbmFtZSAoIl9fZGxsX18iLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0lNQUdFX0JBU0U6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX2ltYWdlX2Jhc2VfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gMTsKLX0KLQwKLS8qIEFzc2lnbiB2YWx1ZXMgdG8gdGhlIHNwZWNpYWwgc3ltYm9scyBiZWZvcmUgdGhlIGxpbmtlciBzY3JpcHQgaXMKLSAgIHJlYWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzKCkKLXsKLSAgLyogUnVuIHRocm91Z2ggYW5kIGludmVudCBzeW1ib2xzIGZvciBhbGwgdGhlCi0gICAgIG5hbWVzIGFuZCBpbnNlcnQgdGhlIGRlZmF1bHRzLiAqLwotICBpbnQgajsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzYXZlOwotCi0gIGlmICghaW5pdFtJTUFHRUJBU0VPRkZdLmluaXRlZCkKLSAgICB7Ci0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSAwOwotICAgICAgZWxzZSBpZiAoaW5pdFtETExPRkZdLnZhbHVlKQotCWluaXRbSU1BR0VCQVNFT0ZGXS52YWx1ZSA9IEJFT1NfRExMX0lNQUdFX0JBU0U7Ci0gICAgICBlbHNlCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gQkVPU19FWEVfSU1BR0VfQkFTRTsKLSAgICB9Ci0KLSAgLyogRG9uJ3QgZG8gYW55IHN5bWJvbCBhc3NpZ25tZW50cyBpZiB0aGlzIGlzIGEgcmVsb2NhdGVhYmxlIGxpbmsuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgLyogR2x1ZSB0aGUgYXNzaWdubWVudHMgaW50byB0aGUgYWJzIHNlY3Rpb24gKi8KLSAgc2F2ZSA9IHN0YXRfcHRyOwotCi0gIHN0YXRfcHRyID0gJihhYnNfb3V0cHV0X3NlY3Rpb24tPmNoaWxkcmVuKTsKLQotICBmb3IgKGogPSAwOyBpbml0W2pdLnB0cjsgaisrKQotICAgIHsKLSAgICAgIGxvbmcgdmFsID0gaW5pdFtqXS52YWx1ZTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nICxpbml0W2pdLnN5bWJvbCwgZXhwX2ludG9wICh2YWwpKSk7Ci0gICAgICBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihzaG9ydCkpCi0JKihzaG9ydCAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihpbnQpKQotCSooaW50ICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlIGlmIChpbml0W2pdLnNpemUgPT0gc2l6ZW9mKGxvbmcpKQotCSoobG9uZyAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgLyogVGhpcyBtaWdodCBiZSBhIGxvbmcgbG9uZyBvciBvdGhlciBzcGVjaWFsIHR5cGUuICAqLwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihiZmRfdm1hKSkKLQkqKGJmZF92bWEgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UJYWJvcnQoKTsKLSAgICB9Ci0gIC8qIFJlc3RvcmUgdGhlIHBvaW50ZXIuICovCi0gIHN0YXRfcHRyID0gc2F2ZTsKLSAgCi0gIGlmIChwZS5GaWxlQWxpZ25tZW50ID4KLSAgICAgIHBlLlNlY3Rpb25BbGlnbm1lbnQpCi0gICAgewotICAgICAgZWluZm8gKCIlUDogd2FybmluZywgZmlsZSBhbGlnbm1lbnQgPiBzZWN0aW9uIGFsaWdubWVudC5cbiIpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuKCkKLXsKLSAgLyogUGFzcyB0aGUgd2Fja3kgUEUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaW50byB0aGUgb3V0cHV0IGJmZC4KLSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIGEgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGJ5Ci0gICAgIGluY2x1ZGluZyBhbiBpbnRlcm5hbCBCRkQgaGVhZGVyLiAgKi8KLSAgaWYgKCFjb2ZmX2RhdGEob3V0cHV0X2JmZCktPnBlKQotICAgIHsKLSAgICAgIGVpbmZvICgiJUYlUDogUEUgb3BlcmF0aW9ucyBvbiBub24gUEUgZmlsZS5cbiIpOwotICAgIH0KLQotICBwZV9kYXRhKG91dHB1dF9iZmQpLT5wZV9vcHRoZHIgPSBwZTsKLSAgcGVfZGF0YShvdXRwdXRfYmZkKS0+ZGxsID0gaW5pdFtETExPRkZdLnZhbHVlOwotCi19Ci0MCi0vKiBDYWxsYmFjayBmdW5jdGlvbnMgZm9yIHFzb3J0IGluIHNvcnRfc2VjdGlvbnMuICovCi0KLXN0YXRpYyBpbnQKLXNvcnRfYnlfZmlsZV9uYW1lIChhLCBiKQotICAgICB2b2lkICphOwotICAgICB2b2lkICpiOwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmEgPSBhOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcmIgPSBiOwotICBpbnQgaSwgYV9zZWMsIGJfc2VjOwotCi0gIGkgPSBzdHJjbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLT5teV9hcmNoaXZlLT5maWxlbmFtZSwKLQkgICAgICAoKnJiKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZC0+bXlfYXJjaGl2ZS0+ZmlsZW5hbWUpOwotICBpZiAoaSAhPSAwKQotICAgIHJldHVybiBpOwotCi0gIGkgPSBzdHJjbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT5maWxlbmFtZSwKLQkJICgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT5maWxlbmFtZSk7Ci0gIGlmIChpICE9IDApCi0gICAgcmV0dXJuIGk7Ci0gIC8qIHRoZSB0YWlsIGlkYXRhNC81IGFyZSB0aGUgb25seSBvbmVzIHdpdGhvdXQgcmVsb2NzIHRvIGFuCi0gICAgIGlkYXRhJDYgc2VjdGlvbiB1bmxlc3Mgd2UgYXJlIGltcG9ydGluZyBieSBvcmRpbmFsLCAKLSAgICAgc28gc29ydCB0aGVtIHRvIGxhc3QgdG8gdGVybWluYXRlIHRoZSBJQVQKLSAgICAgYW5kIEhOVCBwcm9wZXJseS4gaWYgbm8gcmVsb2MgdGhpcyBvbmUgaXMgaW1wb3J0IGJ5IG9yZGluYWwKLSAgICAgc28gd2UgaGF2ZSB0byBzb3J0IGJ5IHNlY3Rpb24gY29udGVudHMgKi8KLQotICBpZiAoICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCArICgqcmIpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPnJlbG9jX2NvdW50KSApCi0gICAgewotICAgICAgIGkgPSAgKCgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCA+IAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQpID8gLTEgOiAwKTsKLSAgICAgICBpZiAoIGkgIT0gMCkKLSAgICAgICAgIHJldHVybiBpOwotCi0gICAgICAgIHJldHVybiAgKCgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5yZWxvY19jb3VudCA+IAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+cmVsb2NfY291bnQpID8gMCA6IDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICBpZiAoIChzdHJjbXAoICgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsICIuaWRhdGEkNiIpID09IDApICkKLSAgICAgICAgICByZXR1cm4gMDsgLyogZG9uJ3Qgc29ydCAuaWRhdGEkNiBvciAuaWRhdGEkNyBGSVhNRSBkbGx0b29sIGVsaW1pbmF0ZSAuaWRhdGEkNyAqLwotCi0gICAgICAgaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZCwgCi0gICAgICAgICAoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLCAmYV9zZWMsIChmaWxlX3B0cikgMCwgKGJmZF9zaXplX3R5cGUpc2l6ZW9mKGFfc2VjKSkpCi0gICAgICAgICAgICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuaWRhdGE6ICVFXG4iLAotICAgICAgICAgICAgICAgICAoKnJhKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZCk7Ci0KLSAgICAgICBpZiAoISBiZmRfZ2V0X3NlY3Rpb25fY29udGVudHMgKCgqcmIpLT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLCAKLSAgICAgICAgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbiwgJmJfc2VjLCAoZmlsZV9wdHIpIDAsIChiZmRfc2l6ZV90eXBlKXNpemVvZihiX3NlYykgKSkKLSAgICAgICAgICAgZWluZm8gKCIlRiVCOiBDYW4ndCByZWFkIGNvbnRlbnRzIG9mIHNlY3Rpb24gLmlkYXRhOiAlRVxuIiwKLSAgICAgICAgICAgICAgICAoKnJiKS0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+dGhlX2JmZCk7Ci0KLSAgICAgIGkgPSAgKChhX3NlYyA8IGJfc2VjKSA/IC0xIDogMCk7Ci0gICAgICBpZiAoIGkgIT0gMCkKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgICByZXR1cm4gICgoYV9zZWMgPCBiX3NlYykgPyAwIDogMSk7Ci0gICB9Ci1yZXR1cm4gMDsKLX0KLQotc3RhdGljIGludAotc29ydF9ieV9zZWN0aW9uX25hbWUgKGEsIGIpCi0gICAgIHZvaWQgKmE7Ci0gICAgIHZvaWQgKmI7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYSA9IGE7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyYiA9IGI7Ci0gIGludCBpOwotICBpID0gc3RyY21wICgoKnJhKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lLAotCQkgKCpyYiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbi0+bmFtZSk7Ci0vKiB0aGlzIGlzIGEgaGFjayB0byBtYWtlIC5zdGFiIGFuZCAuc3RhYnN0ciBsYXN0LCBzbyB3ZSBkb24ndCBoYXZlCi0gICB0byBmaXggc3RyaXAvb2JqY29weSBmb3IgLnJlbG9jIHNlY3Rpb25zLgotICAgRklYTUUgc3RyaXBwaW5nIGltYWdlcyB3aXRoIGEgLnJzcmMgc2VjdGlvbiBzdGlsbCBuZWVkcyB0byBiZSBmaXhlZCAqLwotICBpZiAoIGkgIT0gMCkKLSAgICB7Ci0gICAgICBpZiAoKHN0cm5jbXAgKCgqcmEpLT5pbnB1dF9zZWN0aW9uLnNlY3Rpb24tPm5hbWUsICIuc3RhYiIsIDUpID09IDApCi0gICAgICAgICAgICYmIChzdHJuY21wICgoKnJiKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uLT5uYW1lLCAiLnN0YWIiLCA1KSAhPSAwKSkKLSAgICAgICAgIHJldHVybiAxOwotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICByZXR1cm4gaTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBzb3J0X3NlY3Rpb25zIHRvIGEgY29udGlndW91cyBzdWJzZXQgb2YgYSBsaXN0IG9mIHNlY3Rpb25zLgotICAgTkVYVF9BRlRFUiBpcyB0aGUgZWxlbWVudCBhZnRlciB0aGUgbGFzdCBvbmUgdG8gc29ydC4KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IGVsZW1lbnQncyAibmV4dCIgcG9pbnRlci4gICovCi0KLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqCi1zb3J0X3NlY3Rpb25zXzEgKHN0YXJ0cHRyLCBuZXh0X2FmdGVyLCBjb3VudCwgc29ydF9mdW5jKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqc3RhcnRwdHIsKm5leHRfYWZ0ZXI7Ci0gICAgIGludCBjb3VudDsKLSAgICAgaW50ICgqc29ydF9mdW5jKSAoKTsKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnZlYzsKLSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcDsKLSAgaW50IGk7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipyZXQ7Ci0KLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIHN0YXJ0cHRyOwotCi0gIHZlYyA9ICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKikKLQkgeG1hbGxvYyAoY291bnQgKiBzaXplb2YgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpKTsKLQotICBmb3IgKHAgPSAqc3RhcnRwdHIsIGkgPSAwOyBpIDwgY291bnQ7IGkrKywgcCA9IHAtPm5leHQpCi0gICAgdmVjW2ldID0gcDsKLQotICBxc29ydCAodmVjLCBjb3VudCwgc2l6ZW9mICh2ZWNbMF0pLCBzb3J0X2Z1bmMpOwotCi0gIC8qIEZpbGwgaW4gdGhlIG5leHQgcG9pbnRlcnMgYWdhaW4uICovCi0gICpzdGFydHB0ciA9IHZlY1swXTsKLSAgZm9yIChpID0gMDsgaSA8IGNvdW50IC0gMTsgaSsrKQotICAgIHZlY1tpXS0+aGVhZGVyLm5leHQgPSB2ZWNbaSArIDFdOwotICB2ZWNbaV0tPmhlYWRlci5uZXh0ID0gbmV4dF9hZnRlcjsKLSAgcmV0ID0gJnZlY1tpXS0+aGVhZGVyLm5leHQ7Ci0gIGZyZWUgKHZlYyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFNvcnQgdGhlIC5pZGF0YVwkZm9vIGlucHV0IHNlY3Rpb25zIG9mIGFyY2hpdmVzIGludG8gZmlsZW5hbWUgb3JkZXIuCi0gICBUaGUgcmVhc29uIGlzIHNvIGRsbHRvb2wgY2FuIGFycmFuZ2UgdG8gaGF2ZSB0aGUgcGUgZGxsIGltcG9ydCBpbmZvcm1hdGlvbgotICAgZ2VuZXJhdGVkIGNvcnJlY3RseSAtIHRoZSBoZWFkIG9mIHRoZSBsaXN0IGdvZXMgaW50byBkaC5vLCB0aGUgdGFpbCBpbnRvCi0gICBkdC5vLCBhbmQgdGhlIGd1dHMgaW50byBkc1tubm5uXS5vLiAgTm90ZSB0aGF0IHRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZQotICAgLmlkYXRhIHNlY3Rpb24uCi0gICBGSVhNRTogVGhpcyBtYXkgbm8gbG9uZ2VyIGJlIG5lY2Vzc2FyeSB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuICBJbnN0ZWFkIG9mCi0gICBzb3J0aW5nIG9uIGRoLm8sIGRzW25ubm5dLm8sIGR0Lm8sIG9uZSBjb3VsZCwgZm9yIGV4YW1wbGUsIGhhdmUgZGgubyB1c2UKLSAgIC5pZGF0YVwkNGgsIGhhdmUgZHNbbm5ubl0ubyB1c2UgLmlkYXRhXCQ0c1tubm5uXSwgYW5kIGhhdmUgZHQubyB1c2UgLmlkYXRhXCQ0dC4KLSAgIFRoaXMgd291bGQgaGF2ZSB0byBiZSBlbGFib3JhdGVkIHVwb24gdG8gaGFuZGxlIG11bHRpcGxlIGRsbCdzCi0gICBbYXNzdW1pbmcgc3VjaCBhbiBlbG9ib3JhdGlvbiBpcyBwb3NzaWJsZSBvZiBjb3Vyc2VdLgotCi0gICBXZSBhbHNvIHNvcnQgc2VjdGlvbnMgaW4gJ1wkJyB3aWxkIHN0YXRlbWVudHMuICBUaGVzZSBhcmUgY3JlYXRlZCBieSB0aGUKLSAgIHBsYWNlX29ycGhhbnMgcm91dGluZSB0byBpbXBsZW1lbnQgZ3JvdXBlZCBzZWN0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1zb3J0X3NlY3Rpb25zIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBmb3IgKDsgcyA7IHMgPSBzLT5uZXh0KQotICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0gICAgICB7Ci0gICAgICBjYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0Jc29ydF9zZWN0aW9ucyAocy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCWJyZWFrOwotICAgICAgY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0JewotCSAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnAgPSAmcy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZDsKLQotCSAgLyogSXMgdGhpcyB0aGUgLmlkYXRhIHNlY3Rpb24/ICAqLwotCSAgaWYgKHMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSAhPSBOVUxMCi0JICAgICAgJiYgc3RybmNtcCAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCAiLmlkYXRhIiwgNikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIFNvcnQgdGhlIGNoaWxkcmVuLiAgV2Ugd2FudCB0byBzb3J0IGFueSBvYmplY3RzIGluCi0gICAgICAgICAgICAgICAgIHRoZSBzYW1lIGFyY2hpdmUuICBJbiBvcmRlciB0byBoYW5kbGUgdGhlIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIGEgc2luZ2xlIGFyY2hpdmUgbXVsdGlwbGUgdGltZXMsIHdlIHNvcnQKLSAgICAgICAgICAgICAgICAgYWxsIHRoZSBjaGlsZHJlbiBieSBhcmNoaXZlIG5hbWUgYW5kIHRoZW4gYnkgb2JqZWN0Ci0gICAgICAgICAgICAgICAgIG5hbWUuICBBZnRlciBzb3J0aW5nIHRoZW0sIHdlIHJlLXRocmVhZCB0aGUgcG9pbnRlcgotICAgICAgICAgICAgICAgICBjaGFpbi4gICovCi0KLQkgICAgICB3aGlsZSAoKnApCi0JCXsKLQkJICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzdGFydCA9ICpwOwotCQkgIGlmIChzdGFydC0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KLQkJICAgICAgfHwgIXN0YXJ0LT5pbnB1dF9zZWN0aW9uLmlmaWxlLT50aGVfYmZkLT5teV9hcmNoaXZlKQotCQkgICAgcCA9ICYoc3RhcnQtPmhlYWRlci5uZXh0KTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmVuZDsKLQkJICAgICAgaW50IGNvdW50OwotCi0JCSAgICAgIGZvciAoZW5kID0gc3RhcnQsIGNvdW50ID0gMDsKLQkJCSAgIGVuZCAmJiBlbmQtPmhlYWRlci50eXBlID09IGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOwotCQkJICAgZW5kID0gZW5kLT5uZXh0KQotCQkJY291bnQrKzsKLQotCQkgICAgICBwID0gc29ydF9zZWN0aW9uc18xIChwLCBlbmQsIGNvdW50LCBzb3J0X2J5X2ZpbGVfbmFtZSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBicmVhazsKLQkgICAgfQotCi0JICAvKiBJZiB0aGlzIGlzIGEgY29sbGVjdGlvbiBvZiBncm91cGVkIHNlY3Rpb25zLCBzb3J0IHRoZW0uCi0JICAgICBUaGUgbGlua2VyIHNjcmlwdCBtdXN0IGV4cGxpY2l0bHkgbWVudGlvbiAiKiguZm9vXCQpIiBvcgotCSAgICAgIiooLmZvb1wkKikiLiAgRG9uJ3Qgc29ydCB0aGVtIGlmIFwkIGlzIG5vdCB0aGUgbGFzdAotCSAgICAgY2hhcmFjdGVyIChub3Qgc3VyZSBpZiB0aGlzIGlzIHJlYWxseSB1c2VmdWwsIGJ1dCBpdAotCSAgICAgYWxsb3dzIGV4cGxpY2l0bHkgbWVudGlvbmluZyBzb21lIFwkIHNlY3Rpb25zIGFuZCBsZXR0aW5nCi0JICAgICB0aGUgbGlua2VyIGhhbmRsZSB0aGUgcmVzdCkuICAqLwotCSAgaWYgKHMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgY2hhciAqcSA9IHN0cmNociAocy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLCAnXCQnKTsKLQotCSAgICAgIGlmIChxICE9IE5VTEwKLQkJICAmJiAocVsxXSA9PSAnXDAnCi0JCSAgICAgIHx8IChxWzFdID09ICcqJyAmJiBxWzJdID09ICdcMCcpKSkKLQkJewotCQkgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmVuZDsKLQkJICBpbnQgY291bnQ7Ci0KLQkJICBmb3IgKGVuZCA9ICpwLCBjb3VudCA9IDA7IGVuZDsgZW5kID0gZW5kLT5uZXh0KQotCQkgICAgewotCQkgICAgICBpZiAoZW5kLT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkKLQkJCWFib3J0ICgpOwotCQkgICAgICBjb3VudCsrOwotCQkgICAgfQotCQkgICh2b2lkKSBzb3J0X3NlY3Rpb25zXzEgKHAsIGVuZCwgY291bnQsIHNvcnRfYnlfc2VjdGlvbl9uYW1lKTsKLQkJfQotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLX0KLQotc3RhdGljIHZvaWQgIAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uKCkKLXsKLSAgZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc3RhdF9wdHI7Ci0KLSNpZmRlZiBUQVJHRVRfSVNfcHBjcGUKLSAgLyogSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCB0b2MgaW5mb3JtYXRpb24gKi8KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlpZiAoIXBwY19wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uKGlzLT50aGVfYmZkLCAmbGlua19pbmZvKSkKLQkgIHsKLQkgICAgZWluZm8oIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXNcbiIsIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoJmxpbmtfaW5mbyk7Ci0jZWxzZQotI2lmZGVmIFRBUkdFVF9JU19hcm1wZQotICAvKiBGSVhNRTogd2Ugc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBpbnRlcndvcmtpbmcgc3R1YgotICAgICBzZWN0aW9uLgotCi0gICAgIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgZ2x1ZQotICAgICBpbmZvcm1hdGlvbi4gIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBiYXNlZCBvbiBhIGNvbW1hbmQgbGluZQotICAgICBvcHRpb24/ICBrcmtAY3lnbnVzLmNvbSAqLwotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmICghYXJtX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24gKGlzLT50aGVfYmZkLCAmIGxpbmtfaW5mbykpCi0JICB7Ci0JICAgIGVpbmZvICgiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyIsIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGFybV9hbGxvY2F0ZV9pbnRlcndvcmtpbmdfc2VjdGlvbnMgKCYgbGlua19pbmZvKTsKLSNlbmRpZiAvKiBUQVJHRVRfSVNfYXJtcGUgKi8KLSNlbmRpZiAvKiBUQVJHRVRfSVNfcHBjcGUgKi8KLQotICBzb3J0X3NlY3Rpb25zIChzdGF0X3B0ci0+aGVhZCk7Ci19Ci0MCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCBzZWN0aW9ucyB3aXRoIGEgJ1wkJyBpbiB0aGVtCi0gICBpbnRvIHRoZSByaWdodCBwbGFjZS4gIEFueSBzZWN0aW9uIHdpdGggYSAnXCQnIGluIHRoZW0gKGUuZy4gLnRleHRcJGZvbykKLSAgIGdldHMgbWFwcGVkIHRvIHRoZSBvdXRwdXQgc2VjdGlvbiB3aXRoIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgJ1wkJyBvbiBzdHJpcHBlZAotICAgKGUuZy4gLnRleHQpLgotICAgU2VlIHRoZSBNaWNyb3NvZnQgUG9ydGFibGUgRXhlY3V0YWJsZSBhbmQgQ29tbW9uIE9iamVjdCBGaWxlIEZvcm1hdAotICAgU3BlY2lmaWNhdGlvbiA0LjEsIHNlY3Rpb24gNC4yLCBHcm91cGVkIFNlY3Rpb25zLgotCi0gICBGSVhNRTogVGhpcyBpcyBub3cgaGFuZGxlZCBieSB0aGUgbGlua2VyIHNjcmlwdCB1c2luZyB3aWxkY2FyZHMsCi0gICBidXQgSSdtIGxlYXZpbmcgdGhpcyBoZXJlIGluIGNhc2Ugd2Ugd2FudCB0byBlbmFibGUgaXQgZm9yIHNlY3Rpb25zCi0gICB3aGljaCBhcmUgbm90IG1lbnRpb25lZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gIGNoYXIgKm91dHB1dF9zZWNuYW1lLCAqcHM7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpsOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIERvbid0IHByb2Nlc3MgZ3JvdXBlZCBzZWN0aW9ucyB1bmxlc3MgZG9pbmcgYSBmaW5hbCBsaW5rLgotICAgICBJZiB0aGV5J3JlIG1hcmtlZCBhcyBDT01EQVQgc2VjdGlvbnMsIHdlIGRvbid0IHdhbnQgLnRleHRcJGZvbyB0bwotICAgICBlbmQgdXAgaW4gLnRleHQgYW5kIHRoZW4gaGF2ZSAudGV4dCBkaXNhcHBlYXIgYmVjYXVzZSBpdCdzIG1hcmtlZAotICAgICBsaW5rLW9uY2UtZGlzY2FyZC4gICovCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBFdmVyeXRoaW5nIGZyb20gdGhlICdcJCcgb24gZ2V0cyBkZWxldGVkIHNvIGRvbid0IGFsbG93ICdcJCcgYXMgdGhlCi0gICAgIGZpcnN0IGNoYXJhY3Rlci4gICovCi0gIGlmICgqc2VjbmFtZSA9PSAnXCQnKQotICAgIGVpbmZvICgiJVAlRjogc2VjdGlvbiAlcyBoYXMgJ1wkJyBhcyBmaXJzdCBjaGFyYWN0ZXJcbiIsIHNlY25hbWUpOwotICBpZiAoc3RyY2hyIChzZWNuYW1lICsgMSwgJ1wkJykgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogTG9vayB1cCB0aGUgb3V0cHV0IHNlY3Rpb24uICBUaGUgTWljcm9zb2Z0IHNwZWNzIHNheSBzZWN0aW9ucyBuYW1lcyBpbgotICAgICBpbWFnZSBmaWxlcyBuZXZlciBjb250YWluIGEgJ1wkJy4gIEZvcnR1bmF0ZWx5LCBsYW5nXy4uLl9sb29rdXAgY3JlYXRlcwotICAgICB0aGUgc2VjdGlvbiBpZiBpdCBkb2Vzbid0IGV4aXN0LiAgKi8KLSAgb3V0cHV0X3NlY25hbWUgPSBidXlzdHJpbmcgKHNlY25hbWUpOwotICBwcyA9IHN0cmNociAob3V0cHV0X3NlY25hbWUgKyAxLCAnXCQnKTsKLSAgKnBzID0gMDsKLSAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHB1dF9zZWNuYW1lKTsKLQotICAvKiBGaW5kIHRoZSAnXCQnIHdpbGQgc3RhdGVtZW50IGZvciB0aGlzIHNlY3Rpb24uICBXZSBjdXJyZW50bHkgcmVxdWlyZSB0aGUKLSAgICAgbGlua2VyIHNjcmlwdCB0byBleHBsaWNpdGx5IG1lbnRpb24gIiooLmZvb1wkKSIuCi0gICAgIEZJWE1FOiBwcGNwZS5zYyBoYXMgLkNSVFwkZm9vIGluIHRoZSAucmRhdGEgc2VjdGlvbi4gIEFjY29yZGluZyB0byB0aGUKLSAgICAgTWljcm9zb2Z0IGRvY3MgdGhpcyBpc24ndCBjb3JyZWN0IHNvIGl0J3Mgbm90IChjdXJyZW50bHkpIGhhbmRsZWQuICAqLwotCi0gIHBzWzBdID0gJ1wkJzsKLSAgcHNbMV0gPSAwOwotICBmb3IgKGwgPSBvcy0+Y2hpbGRyZW4uaGVhZDsgbDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgaWYgKGwtPmhlYWRlci50eXBlID09IGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bQotCSAgJiYgc3RyY21wIChsLT53aWxkX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsIG91dHB1dF9zZWNuYW1lKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLSAgcHNbMF0gPSAwOwotICBpZiAobCA9PSBOVUxMKQotI2lmIDEKLSAgICBlaW5mbyAoIiVQJUY6ICooJXNcJCkgbWlzc2luZyBmcm9tIGxpbmtlciBzY3JpcHRcbiIsIG91dHB1dF9zZWNuYW1lKTsKLSNlbHNlIC8qIEZJWE1FOiBUaGlzIGJsb2NrIGlzIHVudHJpZWQuICBJdCBleGlzdHMgdG8gY29udmV5IHRoZSBpbnRlbnQsCi0JIHNob3VsZCBvbmUgZGVjaWRlIHRvIG5vdCByZXF1aXJlICooLmZvb1wkKSB0byBhcHBlYXIgaW4gdGhlIGxpbmtlcgotCSBzY3JpcHQuICAqLwotICAgIHsKLSAgICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfd2lsZF9zdGF0ZW1lbnQsCi0JCQkJCQkmb3MtPmNoaWxkcmVuKTsKLSAgICAgIG5ldy0+c2VjdGlvbl9uYW1lID0geG1hbGxvYyAoc3RybGVuIChvdXRwdXRfc2VjbmFtZSkgKyAyKTsKLSAgICAgIHNwcmludGYgKG5ldy0+c2VjdGlvbl9uYW1lLCAiJXNcJCIsIG91dHB1dF9zZWNuYW1lKTsKLSAgICAgIG5ldy0+ZmlsZW5hbWUgPSBOVUxMOwotICAgICAgbGFuZ19saXN0X2luaXQgKCZuZXctPmNoaWxkcmVuKTsKLSAgICAgIGwgPSBuZXc7Ci0gICAgfQotI2VuZGlmCi0KLSAgLyogTGluayB0aGUgaW5wdXQgc2VjdGlvbiBpbiBhbmQgd2UncmUgZG9uZSBmb3Igbm93LgotICAgICBUaGUgc2VjdGlvbnMgc3RpbGwgaGF2ZSB0byBiZSBzb3J0ZWQsIGJ1dCB0aGF0IGhhcyB0byB3YWl0IHVudGlsCi0gICAgIGFsbCBzdWNoIHNlY3Rpb25zIGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkgdXMuICBUaGUgc29ydGluZyBpcyBkb25lIGJ5Ci0gICAgIHNvcnRfc2VjdGlvbnMuICAqLwotICB3aWxkX2RvaXQgKCZsLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCi0gIHJldHVybiB0cnVlOwotfQotDAotc3RhdGljIGNoYXIgKgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsIC8qIGZpbmlzaCAqLwotICBOVUxMLCAvKiBjcmVhdGUgb3V0cHV0IHNlY3Rpb24gc3RhdGVtZW50cyAqLwotICBOVUxMLCAvKiBvcGVuIGR5bmFtaWMgYXJjaGl2ZSAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbSBiL2xkL2VtdWx0ZW1wbC9lbGYzMi5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwNzNkMi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZWxmMzIuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ5ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLSMgVGhpcyBmaWxlIGlzIG5vdyBtaXNuYW1lZCwgYmVjYXVzZSBpdCBzdXBwb3J0cyBib3RoIDMyIGJpdCBhbmQgNjQgYml0Ci0jIEVMRiBlbXVsYXRpb25zLgotdGVzdCAteiAiJHtFTEZTSVpFfSIgJiYgRUxGU0laRT0zMgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiAke0VMRlNJWkV9IGJpdCBFTEYgZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgRUxGIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0KLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NoZWNrX25lZWRlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X3N0YXRfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV92ZXJjaGVjawotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfc3RhdGVtZW50X2Fzc2lnbm1lbnQKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbgotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2BlY2hvICR7QVJDSH0gfCBzZWQgLWUgJ3MvOi4qLy8nYDsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9ICR7RFlOQU1JQ19MSU5LLXRydWV9OwotICBjb25maWcuaGFzX3NoYXJlZCA9IGBpZiB0ZXN0IC1uICIkR0VORVJBVEVfU0hMSUJfU0NSSVBUIiA7IHRoZW4gZWNobyB0cnVlIDsgZWxzZSBlY2hvIGZhbHNlIDsgZmlgOwotfQotCi0vKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgYXJjaGl2ZS4gIFRoaXMgaXMgd2hlcmUgd2Uga25vdyB0aGF0IEVMRgotICAgZHluYW1pYyBsaWJyYXJpZXMgaGF2ZSBhbiBleHRlbnNpb24gb2YgLnNvLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlIChhcmNoLCBzZWFyY2gsIGVudHJ5KQotICAgICBjb25zdCBjaGFyICphcmNoOwotICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgY2hhciAqc3RyaW5nOwotCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmaWxlbmFtZSA9IGVudHJ5LT5maWxlbmFtZTsKLQotICBzdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGZpbGVuYW1lKQotCQkJICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCSAgICAgKyBzaXplb2YgIi9saWIuc28iKTsKLQotICBzcHJpbnRmIChzdHJpbmcsICIlcy9saWIlcyVzLnNvIiwgc2VhcmNoLT5uYW1lLCBmaWxlbmFtZSwgYXJjaCk7Ci0KLSAgaWYgKCEgbGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0gICAgewotICAgICAgZnJlZSAoc3RyaW5nKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCi0gIC8qIFdlIGhhdmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCB0byBpbmNsdWRlIGluIHRoZSBsaW5rLiAgVGhlIEVMRgotICAgICBiYWNrZW5kIGxpbmtlciB3aWxsIGNyZWF0ZSBhIERUX05FRURFRCBlbnRyeSBpbiB0aGUgLmR5bmFtaWMKLSAgICAgc2VjdGlvbiBuYW1pbmcgdGhpcyBmaWxlLiAgSWYgdGhpcyBmaWxlIGluY2x1ZGVzIGEgRFRfU09OQU1FCi0gICAgIGVudHJ5LCBpdCB3aWxsIGJlIHVzZWQuICBPdGhlcndpc2UsIHRoZSBFTEYgbGlua2VyIHdpbGwganVzdCB1c2UKLSAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUuICBGb3IgYW4gYXJjaGl2ZSBmb3VuZCBieSBzZWFyY2hpbmcsIGxpa2UKLSAgICAgdGhpcyBvbmUsIHRoZSBEVF9ORUVERUQgZW50cnkgc2hvdWxkIGNvbnNpc3Qgb2YganVzdCB0aGUgbmFtZSBvZgotICAgICB0aGUgZmlsZSwgd2l0aG91dCB0aGUgcGF0aCBpbmZvcm1hdGlvbiB1c2VkIHRvIGZpbmQgaXQuICBOb3RlCi0gICAgIHRoYXQgd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaWYgd2UgaGF2ZSBhIGR5bmFtaWMgb2JqZWN0OyBhbgotICAgICBhcmNoaXZlIHdpbGwgbmV2ZXIgYmUgcmVmZXJlbmNlZCBieSBhIERUX05FRURFRCBlbnRyeS4KLQotICAgICBGSVhNRTogVGhpcyBhcHByb2FjaC0tdXNpbmcgYmZkX2VsZl9zZXRfZHRfbmVlZGVkX25hbWUtLWlzIG5vdAotICAgICB2ZXJ5IHByZXR0eS4gIEkgaGF2ZW4ndCBiZWVuIGFibGUgdG8gdGhpbmsgb2YgYW55dGhpbmcgdGhhdCBpcwotICAgICBwcmV0dHksIHRob3VnaC4gICovCi0gIGlmIChiZmRfY2hlY2tfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCwgYmZkX29iamVjdCkKLSAgICAgICYmIChlbnRyeS0+dGhlX2JmZC0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotICAgIHsKLSAgICAgIGNoYXIgKm5lZWRlZF9uYW1lOwotCi0gICAgICBBU1NFUlQgKGVudHJ5LT5pc19hcmNoaXZlICYmIGVudHJ5LT5zZWFyY2hfZGlyc19mbGFnKTsKLSAgICAgIG5lZWRlZF9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChmaWxlbmFtZSkKLQkJCQkgICAgICArIHN0cmxlbiAoYXJjaCkKLQkJCQkgICAgICArIHNpemVvZiAibGliLnNvIik7Ci0gICAgICBzcHJpbnRmIChuZWVkZWRfbmFtZSwgImxpYiVzJXMuc28iLCBmaWxlbmFtZSwgYXJjaCk7Ci0gICAgICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoZW50cnktPnRoZV9iZmQsIG5lZWRlZF9uYW1lKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotLyogRm9yIGEgbmF0aXZlIGxpbmtlciwgY2hlY2sgdGhlIGZpbGUgL2V0Yy9sZC5zby5jb25mIGZvciBkaXJlY3RvcmllcwotICAgaW4gd2hpY2ggd2UgbWF5IGZpbmQgc2hhcmVkIGxpYnJhcmllcy4gIC9ldGMvbGQuc28uY29uZiBpcyByZWFsbHkKLSAgIG9ubHkgbWVhbmluZ2Z1bCBvbiBMaW51eCwgYnV0IHdlIGNoZWNrIGl0IG9uIG90aGVyIHN5c3RlbXMgYW55aG93LiAgKi8KLQotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZgotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZiAobmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0gIHN0YXRpYyBjaGFyICpsZF9zb19jb25mOwotCi0gIGlmICghIGluaXRpYWxpemVkKQotICAgIHsKLSAgICAgIEZJTEUgKmY7Ci0KLSAgICAgIGYgPSBmb3BlbiAoIi9ldGMvbGQuc28uY29uZiIsIEZPUEVOX1JUKTsKLSAgICAgIGlmIChmICE9IE5VTEwpCi0JewotCSAgY2hhciAqYjsKLQkgIHNpemVfdCBsZW4sIGFsbG9jOwotCSAgaW50IGM7Ci0KLQkgIGxlbiA9IDA7Ci0JICBhbGxvYyA9IDEwMDsKLQkgIGIgPSAoY2hhciAqKSB4bWFsbG9jIChhbGxvYyk7Ci0KLQkgIHdoaWxlICgoYyA9IGdldGMgKGYpKSAhPSBFT0YpCi0JICAgIHsKLQkgICAgICBpZiAobGVuICsgMSA+PSBhbGxvYykKLQkJewotCQkgIGFsbG9jICo9IDI7Ci0JCSAgYiA9IChjaGFyICopIHhyZWFsbG9jIChiLCBhbGxvYyk7Ci0JCX0KLQkgICAgICBpZiAoYyAhPSAnOicKLQkJICAmJiBjICE9ICcgJwotCQkgICYmIGMgIT0gJ1x0JwotCQkgICYmIGMgIT0gJ1xuJwotCQkgICYmIGMgIT0gJywnKQotCQl7Ci0JCSAgYltsZW5dID0gYzsKLQkJICArK2xlbjsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChsZW4gPiAwICYmIGJbbGVuIC0gMV0gIT0gJzonKQotCQkgICAgewotCQkgICAgICBiW2xlbl0gPSAnOic7Ci0JCSAgICAgICsrbGVuOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgaWYgKGxlbiA+IDAgJiYgYltsZW4gLSAxXSA9PSAnOicpCi0JICAgIC0tbGVuOwotCi0JICBpZiAobGVuID4gMCkKLQkgICAgYltsZW5dID0gJ1wwJzsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZyZWUgKGIpOwotCSAgICAgIGIgPSBOVUxMOwotCSAgICB9Ci0KLQkgIGZjbG9zZSAoZik7Ci0KLQkgIGxkX3NvX2NvbmYgPSBiOwotCX0KLQotICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQotICBpZiAobGRfc29fY29uZiA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAobGRfc29fY29uZiwgbmFtZSwgZm9yY2UpOwotfQotCi1FT0YKLSAgOzsKLSAgZXNhYwotZmkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLS8qIFRoZXNlIHZhcmlhYmxlcyBhcmUgcmVxdWlyZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBiYWNrIGFuZCBmb3J0aAotICAgYmV0d2VlbiBhZnRlcl9vcGVuIGFuZCBjaGVja19uZWVkZWQgYW5kIHN0YXRfbmVlZGVkIGFuZCB2ZXJjaGVjay4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF9uZWVkZWQ7Ci1zdGF0aWMgc3RydWN0IHN0YXQgZ2xvYmFsX3N0YXQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfZm91bmQ7Ci1zdGF0aWMgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpnbG9iYWxfdmVyY2hlY2tfbmVlZGVkOwotc3RhdGljIGJvb2xlYW4gZ2xvYmFsX3ZlcmNoZWNrX2ZhaWxlZDsKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBEVF9ORUVERUQgZW50cmllcyBpbgotICAgICBkeW5hbWljIG9iamVjdHMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgKG9mdGVuIHRoZXJlIHdpbGwgYmUgbm9uZSkuCi0gICAgIEZvciBlYWNoIHN1Y2ggZmlsZSwgd2Ugd2FudCB0byB0cmFjayBkb3duIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgIGxpYnJhcnksIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUgaW4gdGhlIGxpbmsuICBUaGlzIGlzIHdoYXQKLSAgICAgdGhlIHJ1bnRpbWUgZHluYW1pYyBsaW5rZXIgd2lsbCBkby4gIFRyYWNraW5nIHRoZSBmaWxlcyBkb3duIGhlcmUKLSAgICAgcGVybWl0cyBvbmUgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBhbm90aGVyIHdpdGhvdXQgcmVxdWlyaW5nCi0gICAgIHNwZWNpYWwgYWN0aW9uIGJ5IHRoZSBwZXJzb24gZG9pbmcgdGhlIGxpbmsuICBOb3RlIHRoYXQgdGhlCi0gICAgIG5lZWRlZCBsaXN0IGNhbiBhY3R1YWxseSBncm93IHdoaWxlIHdlIGFyZSBzdGVwcGluZyB0aHJvdWdoIHRoaXMKLSAgICAgbG9vcC4gICovCi0gIG5lZWRlZCA9IGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0IChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbGw7Ci0gICAgICBpbnQgZm9yY2U7Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGZpbGUsIHNraXAgaXQuICAqLwotICAgICAgZm9yIChsbCA9IG5lZWRlZDsgbGwgIT0gbDsgbGwgPSBsbC0+bmV4dCkKLQlpZiAoc3RyY21wIChsbC0+bmFtZSwgbC0+bmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGxsICE9IGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLwotICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7Ci0gICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gZmluZCB0aGlzIGZpbGUgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbCB0YWJsZS4gIFdlCi0JIHdhbnQgdG8gc2VhcmNoIGZvciB0aGUgZmlsZSBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGUgZHluYW1pYwotCSBsaW5rZXIgd2lsbCBzZWFyY2guICBUaGF0IG1lYW5zIHRoYXQgd2Ugd2FudCB0byB1c2UKLQkgcnBhdGhfbGluaywgcnBhdGgsIHRoZW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0JIExEX0xJQlJBUllfUEFUSCAobmF0aXZlIG9ubHkpLCB0aGVuIHRoZSBsaW5rZXIgc2NyaXB0Ci0JIExJQl9TRUFSQ0hfRElSUy4gIFdlIGRvIG5vdCBzZWFyY2ggdXNpbmcgdGhlIC1MIGFyZ3VtZW50cy4KLQotCSBXZSBzZWFyY2ggdHdpY2UuICBUaGUgZmlyc3QgdGltZSwgd2Ugc2tpcCBvYmplY3RzIHdoaWNoIG1heQotCSBpbnRyb2R1Y2UgdmVyc2lvbiBtaXNtYXRjaGVzLiAgVGhlIHNlY29uZCB0aW1lLCB3ZSBmb3JjZQotCSB0aGVpciB1c2UuICBTZWUgZ2xkJHtFTVVMQVRJT05fTkFNRX1fdmVyY2hlY2sgY29tbWVudC4gICovCi0gICAgICBmb3IgKGZvcmNlID0gMDsgZm9yY2UgPCAyOyBmb3JjZSsrKQotCXsKLQkgIGNvbnN0IGNoYXIgKmxpYl9wYXRoOwotCSAgc2l6ZV90IGxlbjsKLQkgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rLAotCQkJCQkJICBsLT5uYW1lLCBmb3JjZSkpCi0JICAgIGJyZWFrOwotCSAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aCwKLQkJCQkJCSAgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGhfbGluayA9PSBOVUxMCi0JICAgICAgJiYgY29tbWFuZF9saW5lLnJwYXRoID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBsaWJfcGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsLT5uYW1lLAotCQkJCQkJICAgICAgZm9yY2UpKQotCQlicmVhazsKLQkgICAgfQotRU9GCi1pZiBbICJ4JHtob3N0fSIgPSAieCR7dGFyZ2V0fSIgXSA7IHRoZW4KLSAgY2FzZSAiICR7RU1VTEFUSU9OX0xJQlBBVEh9ICIgaW4KLSAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9MSUJSQVJZX1BBVEgiKTsKLQkgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChsaWJfcGF0aCwgbC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQkgIGxlbiA9IHN0cmxlbiAobC0+bmFtZSk7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICB7Ci0JICAgICAgY2hhciAqZmlsZW5hbWU7Ci0KLQkgICAgICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCQljb250aW51ZTsKLQkgICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIGxlbiArIDIpOwotCSAgICAgIHNwcmludGYgKGZpbGVuYW1lLCAiJXMvJXMiLCBzZWFyY2gtPm5hbWUsIGwtPm5hbWUpOwotCSAgICAgIGlmIChnbGQke0VNVUxBVElPTl9OQU1FfV90cnlfbmVlZGVkIChmaWxlbmFtZSwgZm9yY2UpKQotCQlicmVhazsKLQkgICAgICBmcmVlIChmaWxlbmFtZSk7Ci0JICAgIH0KLQkgIGlmIChzZWFyY2ggIT0gTlVMTCkKLQkgICAgYnJlYWs7Ci1FT0YKLWlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICBjYXNlICIgJHtFTVVMQVRJT05fTElCUEFUSH0gIiBpbgotICAqIiAke0VNVUxBVElPTl9OQU1FfSAiKikKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbGRfc29fY29uZiAobC0+bmFtZSwgZm9yY2UpKQotCSAgICBicmVhazsKLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQl9Ci0KLSAgICAgIGlmIChmb3JjZSA8IDIpCi0JY29udGludWU7Ci0KLSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZCAodHJ5IHVzaW5nIC0tcnBhdGgpXG4iLAotCSAgICAgbC0+bmFtZSwgbC0+YnkpOwotICAgIH0KLX0KLQotLyogU2VhcmNoIGZvciBhIG5lZWRlZCBmaWxlIGluIGEgcGF0aC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfbmVlZGVkIChwYXRoLCBuYW1lLCBmb3JjZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZvcmNlOwotewotICBjb25zdCBjaGFyICpzOwotICBzaXplX3QgbGVuOwotCi0gIGlmIChwYXRoID09IE5VTEwgfHwgKnBhdGggPT0gJ1wwJykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGxlbiA9IHN0cmxlbiAobmFtZSk7Ci0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGNoYXIgKmZpbGVuYW1lLCAqc3NldDsKLQotICAgICAgcyA9IHN0cmNociAocGF0aCwgJzonKTsKLSAgICAgIGlmIChzID09IE5VTEwpCi0JcyA9IHBhdGggKyBzdHJsZW4gKHBhdGgpOwotCi0gICAgICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHMgLSBwYXRoICsgbGVuICsgMik7Ci0gICAgICBpZiAocyA9PSBwYXRoKQotCXNzZXQgPSBmaWxlbmFtZTsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1jcHkgKGZpbGVuYW1lLCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBmaWxlbmFtZVtzIC0gcGF0aF0gPSAnLyc7Ci0JICBzc2V0ID0gZmlsZW5hbWUgKyAocyAtIHBhdGgpICsgMTsKLQl9Ci0gICAgICBzdHJjcHkgKHNzZXQsIG5hbWUpOwotCi0gICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZmlsZW5hbWUsIGZvcmNlKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCi0gICAgICBpZiAoKnMgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgIHBhdGggPSBzICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwkgIAotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBwb3NzaWJsZSBuYW1lIGZvciBhIGR5bmFtaWMgb2JqZWN0Ci0gICBuYW1lZCBieSBhIERUX05FRURFRCBlbnRyeS4gIFRoZSBGT1JDRSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIKLSAgIHRvIHNraXAgdGhlIGNoZWNrIGZvciBhIGNvbmZsaWN0aW5nIHZlcnNpb24uICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAobmFtZSwgZm9yY2UpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGludCBmb3JjZTsKLXsKLSAgYmZkICphYmZkOwotCi0gIGFiZmQgPSBiZmRfb3BlbnIgKG5hbWUsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhpcyBvYmplY3Qgd291bGQgaW5jbHVkZSBhbnkgY29uZmxpY3RpbmcgbGlicmFyeQotICAgICB2ZXJzaW9ucy4gIElmIEZPUkNFIGlzIHNldCwgdGhlbiB3ZSBza2lwIHRoaXMgY2hlY2s7IHdlIHVzZSB0aGlzCi0gICAgIHRoZSBzZWNvbmQgdGltZSBhcm91bmQsIGlmIHdlIGNvdWxkbid0IGZpbmQgYW55IGNvbXBhdGlibGUKLSAgICAgaW5zdGFuY2Ugb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotICBpZiAoISBmb3JjZSkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKm5lZWRlZDsKLQotICAgICAgaWYgKCEgYmZkX2VsZl9nZXRfYmZkX25lZWRlZF9saXN0IChhYmZkLCAmbmVlZGVkKSkKLQllaW5mbyAoIiVGJVA6JUI6IGJmZF9lbGZfZ2V0X2JmZF9uZWVkZWRfbGlzdCBmYWlsZWQ6ICVFXG4iLCBhYmZkKTsKLQotICAgICAgaWYgKG5lZWRlZCAhPSBOVUxMKQotCXsKLQkgIGdsb2JhbF92ZXJjaGVja19uZWVkZWQgPSBuZWVkZWQ7Ci0JICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gZmFsc2U7Ci0JICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrKTsKLQkgIGlmIChnbG9iYWxfdmVyY2hlY2tfZmFpbGVkKQotCSAgICB7Ci0JICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JICAgICAgLyogUmV0dXJuIGZhbHNlIHRvIGZvcmNlIHRoZSBjYWxsZXIgdG8gbW92ZSBvbiB0byB0cnkKLSAgICAgICAgICAgICAgICAgYW5vdGhlciBmaWxlIG9uIHRoZSBzZWFyY2ggcGF0aC4gICovCi0JICAgICAgcmV0dXJuIGZhbHNlOwotCSAgICB9Ci0KLQkgIC8qIEJ1dCB3YWl0ISAgSXQgZ2V0cyBtdWNoIHdvcnNlLiAgT24gTGludXgsIGlmIGEgc2hhcmVkCi0gICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCB1c2UgbGliYyBhdCBhbGwsIHdlIGFyZSBzdXBwb3NlZCB0byBza2lwCi0gICAgICAgICAgICAgaXQgdGhlIGZpcnN0IHRpbWUgYXJvdW5kIGluIGNhc2Ugd2UgZW5jb3VudGVyIGEgc2hhcmVkCi0gICAgICAgICAgICAgbGlicmFyeSBsYXRlciBvbiB3aXRoIHRoZSBzYW1lIG5hbWUgd2hpY2ggZG9lcyB1c2UgdGhlCi0gICAgICAgICAgICAgdmVyc2lvbiBvZiBsaWJjIHRoYXQgd2Ugd2FudC4gIFRoaXMgaXMgbXVjaCB0b28gaG9ycmlibGUKLSAgICAgICAgICAgICB0byB1c2Ugb24gYW55IHN5c3RlbSBvdGhlciB0aGFuIExpbnV4LiAgKi8KLQotRU9GCi1jYXNlICR7dGFyZ2V0fSBpbgotICAqLSotbGludXgtZ251KikKLSAgICBjYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLQkgICAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotCSAgICAgIGlmIChzdHJuY21wIChsLT5uYW1lLCAibGliYy5zbyIsIDcpID09IDApCi0JCWJyZWFrOwotCSAgICBpZiAobCA9PSBOVUxMKQotCSAgICAgIHsKLQkJKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCXJldHVybiBmYWxzZTsKLQkgICAgICB9Ci0JICB9Ci0KLUVPRgotICAgIDs7Ci1lc2FjCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCX0KLSAgICB9Ci0KLSAgLyogV2UndmUgZm91bmQgYSBkeW5hbWljIG9iamVjdCBtYXRjaGluZyB0aGUgRFRfTkVFREVEIGVudHJ5LiAgKi8KLQotICAvKiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZXJlIGlzIG5vIG90aGVyIGlucHV0IGZpbGUgb2YgdGhlCi0gICAgIHNhbWUgbmFtZS4gIFdlIG11c3Qgbm93IGNoZWNrIGFnYWluIHRoYXQgd2UgYXJlIG5vdCBpbmNsdWRpbmcgdGhlCi0gICAgIHNhbWUgZmlsZSB0d2ljZS4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9uIG1hbnkgc3lzdGVtcwotICAgICBsaWJjLnNvIGlzIGEgc3ltbGluayB0bywgZS5nLiwgbGliYy5zby4xLiAgVGhlIFNPTkFNRSBlbnRyeSB3aWxsCi0gICAgIHJlZmVyZW5jZSBsaWJjLnNvLjEuICBJZiB3ZSBoYXZlIGFscmVhZHkgaW5jbHVkZWQgbGliYy5zbywgd2UKLSAgICAgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIGxpYmMuc28uMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBmaWxlLCBhbmQgd2UKLSAgICAgY2FuIG9ubHkgY2hlY2sgdGhhdCB1c2luZyBzdGF0LiAgKi8KLQotICBpZiAoYmZkX3N0YXQgKGFiZmQsICZnbG9iYWxfc3RhdCkgIT0gMCkKLSAgICBlaW5mbyAoIiVGJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIsIGFiZmQpOwotICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9zdGF0X25lZWRlZCk7Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgewotICAgICAgLyogUmV0dXJuIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB3ZSBmb3VuZCB0aGUgZmlsZSwgZXZlbiB0aG91Z2gKLSAgICAgICAgIHdlIGFyZW4ndCBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LiAgKi8KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBUZWxsIHRoZSBFTEYgYmFja2VuZCB0aGF0IGRvbid0IHdhbnQgdGhlIG91dHB1dCBmaWxlIHRvIGhhdmUgYQotICAgICBEVF9ORUVERUQgZW50cnkgZm9yIHRoaXMgZmlsZS4gICovCi0gIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChhYmZkLCAiIik7Ci0KLSAgLyogQWRkIHRoaXMgZmlsZSBpbnRvIHRoZSBzeW1ib2wgdGFibGUuICAqLwotICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoYWJmZCwgJmxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiwgYWJmZCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNlZSBpZiBhbiBpbnB1dCBmaWxlIG1hdGNoZXMgYSBEVF9ORUVERUQgZW50cnkgYnkgbmFtZS4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jaGVja19uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzLT50aGVfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc29uYW1lOwotCi0gICAgICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKHNvbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0JICAKLSAgaWYgKHMtPnNlYXJjaF9kaXJzX2ZsYWcKLSAgICAgICYmIHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmY7Ci0KLSAgICAgIGYgPSBzdHJyY2hyIChzLT5maWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChmICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoZiArIDEsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IHJ1bm5pbmcgc3RhdCBvbgotICAgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc3RhdF9uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjb25zdCBjaGFyICpzdWZmaXg7Ci0gIGNvbnN0IGNoYXIgKnNvbmFtZTsKLSAgY29uc3QgY2hhciAqZjsKLQotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHJldHVybjsKLSAgaWYgKHMtPnRoZV9iZmQgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJmZF9zdGF0IChzLT50aGVfYmZkLCAmc3QpICE9IDApCi0gICAgewotICAgICAgZWluZm8gKCIlUDolQjogYmZkX3N0YXQgZmFpbGVkOiAlRVxuIiwgcy0+dGhlX2JmZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzdC5zdF9kZXYgPT0gZ2xvYmFsX3N0YXQuc3RfZGV2Ci0gICAgICAmJiBzdC5zdF9pbm8gPT0gZ2xvYmFsX3N0YXQuc3RfaW5vKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIFdlIGlzc3VlIGEgd2FybmluZyBpZiBpdCBsb29rcyBsaWtlIHdlIGFyZSBpbmNsdWRpbmcgdHdvCi0gICAgIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBzaGFyZWQgbGlicmFyeS4gIEZvciBleGFtcGxlLAotICAgICB0aGVyZSBtYXkgYmUgYSBwcm9ibGVtIGlmIC1sYyBwaWNrcyB1cCBsaWJjLnNvLjYgYnV0IHNvbWUgb3RoZXIKLSAgICAgc2hhcmVkIGxpYnJhcnkgaGFzIGEgRFRfTkVFREVEIGVudHJ5IG9mIGxpYmMuc28uNS4gIFRoaXMgaXMgYQotICAgICBodWVyaXN0aWMgdGVzdCwgYW5kIGl0IHdpbGwgb25seSB3b3JrIGlmIHRoZSBuYW1lIGxvb2tzIGxpa2UKLSAgICAgTkFNRS5zby5WRVJTSU9OLiAgRklYTUU6IERlcGVuZGluZyBvbiBmaWxlIG5hbWVzIGlzIGVycm9yLXByb25lLgotICAgICBJZiB3ZSByZWFsbHkgd2FudCB0byBpc3N1ZSB3YXJuaW5ncyBhYm91dCBtaXhpbmcgdmVyc2lvbiBudW1iZXJzCi0gICAgIG9mIHNoYXJlZCBsaWJyYXJpZXMsIHdlIG5lZWQgdG8gZmluZCBhIGJldHRlciB3YXkuICAqLwotCi0gIGlmIChzdHJjaHIgKGdsb2JhbF9uZWVkZWQtPm5hbWUsICcvJykgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIHN1ZmZpeCA9IHN0cnN0ciAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgIi5zby4iKTsKLSAgaWYgKHN1ZmZpeCA9PSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ICs9IHNpemVvZiAiLnNvLiIgLSAxOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBzLT5maWxlbmFtZTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgaWYgKHN0cm5jbXAgKGYsIGdsb2JhbF9uZWVkZWQtPm5hbWUsIHN1ZmZpeCAtIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0gICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbWF5IGNvbmZsaWN0IHdpdGggJXNcbiIsCi0JICAgZ2xvYmFsX25lZWRlZC0+bmFtZSwgZ2xvYmFsX25lZWRlZC0+YnksIGYpOwotfQotCi0vKiBPbiBMaW51eCwgaXQncyBwb3NzaWJsZSB0byBoYXZlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotICAgc2hhcmVkIGxpYnJhcnkgbGlua2VkIGFnYWluc3QgZGlmZmVyZW50IHZlcnNpb25zIG9mIGxpYmMuICBUaGUKLSAgIGR5bmFtaWMgbGlua2VyIHNvbWVob3cgdGFncyB3aGljaCBsaWJjIHZlcnNpb24gdG8gdXNlIGluCi0gICAvZXRjL2xkLnNvLmNhY2hlLCBhbmQsIGJhc2VkIG9uIHRoZSBsaWJjIHRoYXQgaXQgc2VlcyBpbiB0aGUKLSAgIGV4ZWN1dGFibGUsIGNob29zZXMgd2hpY2ggdmVyc2lvbiBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgdG8gdXNlLgotCi0gICBXZSB0cnkgdG8gZG8gYSBzaW1pbGFyIGNoZWNrIGhlcmUgYnkgY2hlY2tpbmcgd2hldGhlciB0aGlzIHNoYXJlZAotICAgbGlicmFyeSBuZWVkcyBhbnkgb3RoZXIgc2hhcmVkIGxpYnJhcmllcyB3aGljaCBtYXkgY29uZmxpY3Qgd2l0aAotICAgbGlicmFyaWVzIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgbGluay4gIElmIGl0IGRvZXMsIHdlCi0gICBza2lwIGl0LCBhbmQgdHJ5IHRvIGZpbmQgYW5vdGhlciBzaGFyZWQgbGlicmFyeSBmYXJ0aGVyIG9uIGRvd24gdGhlCi0gICBsaW5rIHBhdGguCi0KLSAgIFRoaXMgaXMgY2FsbGVkIHZpYSBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUuCi0gICBHTE9CQUxfVkVSQ0hFQ0tfTkVFREVEIGlzIHRoZSBsaXN0IG9mIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBvYmplY3QKLSAgIHdoaWNoIHdlIGFyIGNoZWNraW5nLiAgVGhpcyBzZXRzIEdMT0JBTF9WRVJDSEVDS19GQUlMRUQgaWYgd2UgZmluZAotICAgYSBjb25mbGljdGluZyB2ZXJzaW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3ZlcmNoZWNrIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBjb25zdCBjaGFyICpzb25hbWUsICpmOwotICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmw7Ci0KLSAgaWYgKGdsb2JhbF92ZXJjaGVja19mYWlsZWQpCi0gICAgcmV0dXJuOwotICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMCi0gICAgICB8fCAoYmZkX2dldF9maWxlX2ZsYWdzIChzLT50aGVfYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgcmV0dXJuOwotCi0gIHNvbmFtZSA9IGJmZF9lbGZfZ2V0X2R0X3NvbmFtZSAocy0+dGhlX2JmZCk7Ci0gIGlmIChzb25hbWUgPT0gTlVMTCkKLSAgICBzb25hbWUgPSBiZmRfZ2V0X2ZpbGVuYW1lIChzLT50aGVfYmZkKTsKLQotICBmID0gc3RycmNociAoc29uYW1lLCAnLycpOwotICBpZiAoZiAhPSBOVUxMKQotICAgICsrZjsKLSAgZWxzZQotICAgIGYgPSBzb25hbWU7Ci0KLSAgZm9yIChsID0gZ2xvYmFsX3ZlcmNoZWNrX25lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpzdWZmaXg7Ci0KLSAgICAgIGlmIChzdHJjbXAgKGYsIGwtPm5hbWUpID09IDApCi0JewotCSAgLyogUHJvYmFibHkgY2FuJ3QgaGFwcGVuLCBidXQgaXQncyBhbiBlYXN5IGNoZWNrLiAgKi8KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYgKHN0cmNociAobC0+bmFtZSwgJy8nKSAhPSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBzdWZmaXggPSBzdHJzdHIgKGwtPm5hbWUsICIuc28uIik7Ci0gICAgICBpZiAoc3VmZml4ID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIHN1ZmZpeCArPSBzaXplb2YgIi5zby4iIC0gMTsKLQotICAgICAgaWYgKHN0cm5jbXAgKGYsIGwtPm5hbWUsIHN1ZmZpeCAtIGwtPm5hbWUpID09IDApCi0JewotCSAgLyogSGVyZSB3ZSBrbm93IHRoYXQgUyBpcyBhIGR5bmFtaWMgb2JqZWN0IEZPTy5TTy5WRVIxLCBhbmQKLSAgICAgICAgICAgICB0aGUgb2JqZWN0IHdlIGFyZSBjb25zaWRlcmluZyBuZWVkcyBhIGR5bmFtaWMgb2JqZWN0Ci0gICAgICAgICAgICAgRk9PLlNPLlZFUjIsIGFuZCBWRVIxIGFuZCBWRVIyIGFyZSBkaWZmZXJlbnQuICBUaGlzCi0gICAgICAgICAgICAgYXBwZWFycyB0byBiZSBhIHZlcnNpb24gbWlzbWF0Y2gsIHNvIHdlIHRlbGwgdGhlIGNhbGxlcgotICAgICAgICAgICAgIHRvIHRyeSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeS4gICovCi0JICBnbG9iYWxfdmVyY2hlY2tfZmFpbGVkID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIGNvbnN0IGNoYXIgKnJwYXRoOwotICBhc2VjdGlvbiAqc2ludGVycDsKLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBFTEYgYmFja2VuZCBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCk7Ci0KLSAgLyogTGV0IHRoZSBFTEYgYmFja2VuZCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zIHJlcXVpcmVkCi0gICAgIGJ5IGR5bmFtaWMgbGlua2luZy4gICovCi0gIHJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBpZiAocnBhdGggPT0gTlVMTCkKLSAgICBycGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0gIGlmICghIChiZmRfZWxmJHtFTEZTSVpFfV9zaXplX2R5bmFtaWNfc2VjdGlvbnMKLSAgICAgICAgIChvdXRwdXRfYmZkLCBjb21tYW5kX2xpbmUuc29uYW1lLCBycGF0aCwKLQkgIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYywgY29tbWFuZF9saW5lLmZpbHRlcl9zaGxpYiwKLQkgIChjb25zdCBjaGFyICogY29uc3QgKikgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzLAotCSAgJmxpbmtfaW5mbywgJnNpbnRlcnAsIGxhbmdfZWxmX3ZlcnNpb25faW5mbykpKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLQotICAvKiBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIGR5bmFtaWMgbGlua2VyIHdlIGFyZSB1c2luZy4gICovCi0gIGlmIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIgIT0gTlVMTAotICAgICAgJiYgc2ludGVycCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNpbnRlcnAtPmNvbnRlbnRzID0gKGJmZF9ieXRlICopIGNvbW1hbmRfbGluZS5pbnRlcnByZXRlcjsKLSAgICAgIHNpbnRlcnAtPl9yYXdfc2l6ZSA9IHN0cmxlbiAoY29tbWFuZF9saW5lLmludGVycHJldGVyKSArIDE7Ci0gICAgfQotCi0gIC8qIExvb2sgZm9yIGFueSBzZWN0aW9ucyBuYW1lZCAuZ251Lndhcm5pbmcuICBBcyBhIEdOVSBleHRlbnNpb25zLAotICAgICB3ZSB0cmVhdCBzdWNoIHNlY3Rpb25zIGFzIGNvbnRhaW5pbmcgd2FybmluZyBtZXNzYWdlcy4gIFdlIHByaW50Ci0gICAgIG91dCB0aGUgd2FybmluZyBtZXNzYWdlLCBhbmQgdGhlbiB6ZXJvIG91dCB0aGUgc2VjdGlvbiBzaXplIHNvCi0gICAgIHRoYXQgaXQgZG9lcyBub3QgZ2V0IGNvcGllZCBpbnRvIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLSAgewotICAgIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UIChpcykKLSAgICAgIHsKLQlhc2VjdGlvbiAqczsKLQliZmRfc2l6ZV90eXBlIHN6OwotCWNoYXIgKm1zZzsKLQlib29sZWFuIHJldDsKLQotCWlmIChpcy0+anVzdF9zeW1zX2ZsYWcpCi0JICBjb250aW51ZTsKLQotCXMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoaXMtPnRoZV9iZmQsICIuZ251Lndhcm5pbmciKTsKLQlpZiAocyA9PSBOVUxMKQotCSAgY29udGludWU7Ci0KLQlzeiA9IGJmZF9zZWN0aW9uX3NpemUgKGlzLT50aGVfYmZkLCBzKTsKLQltc2cgPSB4bWFsbG9jICgoc2l6ZV90KSBzeiArIDEpOwotCWlmICghIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHMsIG1zZywgKGZpbGVfcHRyKSAwLCBzeikpCi0JICBlaW5mbyAoIiVGJUI6IENhbid0IHJlYWQgY29udGVudHMgb2Ygc2VjdGlvbiAuZ251Lndhcm5pbmc6ICVFXG4iLAotCQkgaXMtPnRoZV9iZmQpOwotCW1zZ1tzel0gPSAnXDAnOwotCXJldCA9IGxpbmtfaW5mby5jYWxsYmFja3MtPndhcm5pbmcgKCZsaW5rX2luZm8sIG1zZywKLQkJCQkJICAgIChjb25zdCBjaGFyICopIE5VTEwsCi0JCQkJCSAgICBpcy0+dGhlX2JmZCwgKGFzZWN0aW9uICopIE5VTEwsCi0JCQkJCSAgICAoYmZkX3ZtYSkgMCk7Ci0JQVNTRVJUIChyZXQpOwotCWZyZWUgKG1zZyk7Ci0KLQkvKiBDbG9iYmVyIHRoZSBzZWN0aW9uIHNpemUsIHNvIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgY29weWluZyB0aGUKLQkgICB3YXJuaW5nIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQlzLT5fcmF3X3NpemUgPSAwOwotICAgICAgfQotICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBiZWZvcmVfYWxsb2NhdGlvbiByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb2NhdGVzIGFueSBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGFuZAotICAgdGVsbHMgdGhlIEVMRiBiYWNrZW5kIGFib3V0IHRoZW0sIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3N0YXRlbWVudF9hc3NpZ25tZW50IChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBpZiAocy0+aGVhZGVyLnR5cGUgPT0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtKQotICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jbGFzcykKLSAgICB7Ci0gICAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgZXhwLT5hc3NpZ24uZHN0LAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICAgICAgaWYgKGggPT0gTlVMTCkKLQlicmVhazsKLQotICAgICAgLyogV2UgY2FsbCByZWNvcmRfbGlua19hc3NpZ25tZW50IGV2ZW4gaWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkLgotCSBUaGlzIGlzIGJlY2F1c2UgaWYgaXQgaXMgZGVmaW5lZCBieSBhIGR5bmFtaWMgb2JqZWN0LCB3ZQotCSBhY3R1YWxseSB3YW50IHRvIHVzZSB0aGUgdmFsdWUgZGVmaW5lZCBieSB0aGUgbGlua2VyIHNjcmlwdCwKLQkgbm90IHRoZSB2YWx1ZSBmcm9tIHRoZSBkeW5hbWljIG9iamVjdCAoYmVjYXVzZSB3ZSBhcmUgc2V0dGluZwotCSBzeW1ib2xzIGxpa2UgZXRleHQpLiAgSWYgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGJ5IGEgcmVndWxhcgotCSBvYmplY3QsIHRoZW4sIGFzIGl0IGhhcHBlbnMsIGNhbGxpbmcgcmVjb3JkX2xpbmtfYXNzaWdubWVudAotCSB3aWxsIGRvIG5vIGhhcm0uICAqLwotCi0gICAgICAvKiBGYWxsIHRocm91Z2guICAqLwotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKHN0cmNtcCAoZXhwLT5hc3NpZ24uZHN0LCAiLiIpICE9IDApCi0JewotCSAgaWYgKCEgKGJmZF9lbGYke0VMRlNJWkV9X3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkJIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBleHAtPmFzc2lnbi5kc3QsCi0JCSAgZXhwLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfcHJvdmlkZSA/IHRydWUgOiBmYWxzZSkpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBQbGFjZSBhbiBvcnBoYW4gc2VjdGlvbi4gIFdlIHVzZSB0aGlzIHRvIHB1dCByYW5kb20gU0hGX0FMTE9DCi0gICBzZWN0aW9ucyBpbiB0aGUgcmlnaHQgc2VnbWVudC4gICovCi0KLXN0YXRpYyBhc2VjdGlvbiAqaG9sZF9zZWN0aW9uOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdXNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfdGV4dDsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JvZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZWw7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9pbnRlcnA7Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWdsZCR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnBsYWNlOwotICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgYWRkOwotICBldHJlZV90eXBlICphZGRyZXNzOwotICBjb25zdCBjaGFyICpzZWNuYW1lLCAqcHM7Ci0gIGNvbnN0IGNoYXIgKm91dHNlY25hbWU7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCi0gIGlmICgocy0+ZmxhZ3MgJiBTRUNfQUxMT0MpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIExvb2sgdGhyb3VnaCB0aGUgc2NyaXB0IHRvIHNlZSB3aGVyZSB0byBwbGFjZSB0aGlzIHNlY3Rpb24uICAqLwotICBob2xkX3NlY3Rpb24gPSBzOwotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGFscmVhZHkgcGxhY2VkIGEgc2VjdGlvbiB3aXRoIHRoaXMgbmFtZS4gICovCi0gICAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZmluYWwgbGluaywgdGhlbiBhbHdheXMgcHV0IC5nbnUud2FybmluZy5TWU1CT0wKLSAgICAgc2VjdGlvbnMgaW50byB0aGUgLnRleHQgc2VjdGlvbiB0byBnZXQgdGhlbSBvdXQgb2YgdGhlIHdheS4gICovCi0gIGlmICghIGxpbmtfaW5mby5zaGFyZWQKLSAgICAgICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMAotICAgICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgd2lsZF9kb2l0ICgmaG9sZF90ZXh0LT5jaGlsZHJlbiwgcywgaG9sZF90ZXh0LCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBEZWNpZGUgd2hpY2ggc2VnbWVudCB0aGUgc2VjdGlvbiBzaG91bGQgZ28gaW4gYmFzZWQgb24gdGhlCi0gICAgIHNlY3Rpb24gbmFtZSBhbmQgc2VjdGlvbiBmbGFncy4gIFdlIHB1dCBsb2FkYWJsZSAubm90ZSBzZWN0aW9ucwotICAgICByaWdodCBhZnRlciB0aGUgLmludGVycCBzZWN0aW9uLCBzbyB0aGF0IHRoZSBQVF9OT1RFIHNlZ21lbnQgaXMKLSAgICAgc3RvcmVkIHJpZ2h0IGFmdGVyIHRoZSBwcm9ncmFtIGhlYWRlcnMgd2hlcmUgdGhlIE9TIGNhbiByZWFkIGl0Ci0gICAgIGluIHRoZSBmaXJzdCBwYWdlLiAgKi8KLSAgcGxhY2UgPSBOVUxMOwotICBpZiAocy0+ZmxhZ3MgJiBTRUNfRVhDTFVERSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19MT0FEKSAhPSAwCi0gICAgICAmJiBzdHJuY21wIChzZWNuYW1lLCAiLm5vdGUiLCA0KSA9PSAwCi0gICAgICAmJiBob2xkX2ludGVycCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9pbnRlcnA7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICAmJiBob2xkX2JzcyAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9ic3M7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICYmIGhvbGRfZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9kYXRhOwotICBlbHNlIGlmIChzdHJuY21wIChzZWNuYW1lLCAiLnJlbCIsIDQpID09IDAKLQkgICAmJiBob2xkX3JlbCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yZWw7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgJiYgKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgJiYgaG9sZF9yb2RhdGEgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfcm9kYXRhOwotICBlbHNlIGlmICgocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3RleHQgIT0gTlVMTCkKLSAgICBwbGFjZSA9IGhvbGRfdGV4dDsKLSAgaWYgKHBsYWNlID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8qIENob29zZSBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgc2VjdGlvbi4gIFRoaXMgd2lsbCBiZSBuZWVkZWQgaWYgdGhlCi0gICAgIHNhbWUgc2VjdGlvbiBuYW1lIGFwcGVhcnMgaW4gdGhlIGlucHV0IGZpbGUgd2l0aCBkaWZmZXJlbnQKLSAgICAgbG9hZGFibGUgb3IgYWxsb2NhdGVhYmxlIGNoYXJhY3RlcmlzdGljcy4gICovCi0gIG91dHNlY25hbWUgPSBzZWNuYW1lOwotICBpZiAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIG91dHNlY25hbWUpICE9IE5VTEwpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGxlbjsKLSAgICAgIGNoYXIgKm5ld25hbWU7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgbGVuID0gc3RybGVuIChvdXRzZWNuYW1lKTsKLSAgICAgIG5ld25hbWUgPSB4bWFsbG9jIChsZW4gKyA1KTsKLSAgICAgIHN0cmNweSAobmV3bmFtZSwgb3V0c2VjbmFtZSk7Ci0gICAgICBpID0gMDsKLSAgICAgIGRvCi0JewotCSAgc3ByaW50ZiAobmV3bmFtZSArIGxlbiwgIiVkIiwgaSk7Ci0JICArK2k7Ci0JfQotICAgICAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotICAgICAgb3V0c2VjbmFtZSA9IG5ld25hbWU7Ci0gICAgfQotCi0gIC8qIENyZWF0ZSB0aGUgc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBwdXQgaXQgaW4gdGhlIHJpZ2h0Ci0gICAgIHBsYWNlLiAgVGhpcyBzaHVmZmxpbmcgaXMgdG8gbWFrZSB0aGUgb3V0cHV0IGZpbGUgbG9vayBuZWF0ZXIuICAqLwotICBzbmV3ID0gYmZkX21ha2Vfc2VjdGlvbiAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSk7Ci0gIGlmIChzbmV3ID09IE5VTEwpCi0gICAgICBlaW5mbyAoIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiwKLQkgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICBpZiAocGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0gICAgewotICAgICAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQk7Ci0gICAgICAqcHBzID0gc25ldy0+bmV4dDsKLSAgICAgIHNuZXctPm5leHQgPSBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQ7Ci0gICAgICBwbGFjZS0+YmZkX3NlY3Rpb24tPm5leHQgPSBzbmV3OwotICAgIH0KLQotICAvKiBTdGFydCBidWlsZGluZyBhIGxpc3Qgb2Ygc3RhdGVtZW50cyBmb3IgdGhpcyBzZWN0aW9uLiAgKi8KLSAgb2xkID0gc3RhdF9wdHI7Ci0gIHN0YXRfcHRyID0gJmFkZDsKLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICAvKiBJZiB0aGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBpcyByZXByZXNlbnRhYmxlIGluIEMsIHRoZW4gY3JlYXRlCi0gICAgIHN5bWJvbHMgdG8gbWFyayB0aGUgc3RhcnQgYW5kIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24uICAqLwotICBmb3IgKHBzID0gb3V0c2VjbmFtZTsgKnBzICE9ICdcMCc7IHBzKyspCi0gICAgaWYgKCEgaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpwcykgJiYgKnBzICE9ICdfJykKLSAgICAgIGJyZWFrOwotICBpZiAoKnBzID09ICdcMCcgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycykKLSAgICB7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotCi0gICAgICBzeW1uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocHMgLSBvdXRzZWNuYW1lICsgc2l6ZW9mICJfX3N0YXJ0XyIpOwotICAgICAgc3ByaW50ZiAoc3ltbmFtZSwgIl9fc3RhcnRfJXMiLCBvdXRzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF91bm9wIChBTElHTl9LLAotCQkJCQkJZXhwX2ludG9wICgoYmZkX3ZtYSkgMQotCQkJCQkJCSAgIDw8IHMtPmFsaWdubWVudF9wb3dlcikpKSk7Ci0gICAgfQotCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgYWRkcmVzcyA9IE5VTEw7Ci0gIGVsc2UKLSAgICBhZGRyZXNzID0gZXhwX2ludG9wICgoYmZkX3ZtYSkgMCk7Ci0KLSAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJICAgICAgIChiZmRfdm1hKSAwLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCSAgICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0c2VjbmFtZSk7Ci0gIHdpbGRfZG9pdCAoJm9zLT5jaGlsZHJlbiwgcywgb3MsIGZpbGUpOwotCi0gIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gICAgKChiZmRfdm1hKSAwLCAiKmRlZmF1bHQqIiwgKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSBOVUxMKTsKLSAgc3RhdF9wdHIgPSAmYWRkOwotCi0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIG91dHNlY25hbWUgKyBzaXplb2YgIl9fc3RvcF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0b3BfJXMiLCBvdXRzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIikpKTsKLSAgICB9Ci0KLSAgLyogTm93IHN0aWNrIHRoZSBuZXcgc3RhdGVtZW50IGxpc3QgcmlnaHQgYWZ0ZXIgUExBQ0UuICAqLwotICAqYWRkLnRhaWwgPSBwbGFjZS0+aGVhZGVyLm5leHQ7Ci0gIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCi0gIHN0YXRfcHRyID0gb2xkOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fcGxhY2Vfc2VjdGlvbiAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLSAgaWYgKHMtPmhlYWRlci50eXBlICE9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0pCi0gICAgcmV0dXJuOwotCi0gIG9zID0gJnMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgaG9sZF9zZWN0aW9uLT5uYW1lKSA9PSAwCi0gICAgICAmJiBvcy0+YmZkX3NlY3Rpb24gIT0gTlVMTAotICAgICAgJiYgKChob2xkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkKLQkgID09IChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgKFNFQ19MT0FEIHwgU0VDX0FMTE9DKSkpKQotICAgIGhvbGRfdXNlID0gb3M7Ci0KLSAgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIudGV4dCIpID09IDApCi0gICAgaG9sZF90ZXh0ID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIucm9kYXRhIikgPT0gMCkKLSAgICBob2xkX3JvZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmRhdGEiKSA9PSAwKQotICAgIGhvbGRfZGF0YSA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLmJzcyIpID09IDApCi0gICAgaG9sZF9ic3MgPSBvczsKLSAgZWxzZSBpZiAoaG9sZF9yZWwgPT0gTlVMTAotCSAgICYmIG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMCi0JICAgJiYgKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQUxMT0MpICE9IDAKLQkgICAmJiBzdHJuY21wIChvcy0+bmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotICAgIGhvbGRfcmVsID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuaW50ZXJwIikgPT0gMCkKLSAgICBob2xkX2ludGVycCA9IG9zOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9J3MvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTFzL14vIi8KLSRzLyQvbiIvCi0nCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJEdFTkVSQVRFX1NITElCX1NDUklQVCIgOyB0aGVuCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotICBlbHNlIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54c2A7Ci1FT0YKLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0gIGVsc2UKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Ci19Ci1FT0YKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhzIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9nZW5lcmljLmVtIGIvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMGM4ZWIuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2dlbmVyaWMuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBlbXVsYXRlIHRoZSBvcmlnaW5hbCBnbGQgZm9yIHRoZSBnaXZlbiAke0VNVUxBVElPTl9OQU1FfQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGNoYXIgKmdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKCJgZWNobyAke0FSQ0h9YCIpOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtIGIvbGQvZW11bHRlbXBsL2dsZDk2MC5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5OThmYi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvZ2xkOTYwLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAxLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAKLSAqIGVtdWxhdGUgdGhlIEludGVscyBwb3J0IG9mICBnbGQKLSAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi0jaWZkZWYgR05VOTYwCi0KLXN0YXRpYyB2b2lkCi1nbGQ5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgc3RhdGljIGNoYXIgKmVudl92YXJpYWJsZXNbXSA9IHsgIkc5NjBMSUIiLCAiRzk2MEJBU0UiLCAwIH07Ci0gIGNoYXIgKipwOwotICBjaGFyICplbnYgOwotCi0gIGZvciAoIHAgPSBlbnZfdmFyaWFibGVzOyAqcDsgcCsrICl7Ci0gICAgZW52ID0gIChjaGFyICopIGdldGVudigqcCk7Ci0gICAgaWYgKGVudikgewotICAgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGNvbmNhdCAoZW52LAotCQkJCSAgICAgICAiL2xpYi9saWJib3V0IiwKLQkJCQkgICAgICAgKGNvbnN0IGNoYXIgKikgTlVMTCksCi0JCQkgICAgICAgZmFsc2UpOwotICAgIH0KLSAgfQotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci19Ci0KLSNlbHNlCS8qIG5vdCBHTlU5NjAgKi8KLQotc3RhdGljIHZvaWQgZ2xkOTYwX2JlZm9yZV9wYXJzZSgpCi17Ci0gIGNoYXIgKmVudiA7Ci0gIGVudiA9ICBnZXRlbnYoIkc5NjBMSUIiKTsKLSAgaWYgKGVudikgewotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoKGVudiwgZmFsc2UpOwotICB9Ci0gIGVudiA9IGdldGVudigiRzk2MEJBU0UiKTsKLSAgaWYgKGVudikKLSAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsICIvbGliIiwgKGNvbnN0IGNoYXIgKikgTlVMTCksIGZhbHNlKTsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF9pOTYwOwotfQotCi0jZW5kaWYJLyogR05VOTYwICovCi0KLQotc3RhdGljIHZvaWQKLWdsZDk2MF9zZXRfb3V0cHV0X2FyY2goKQotewotICBiZmRfc2V0X2FyY2hfbWFjaChvdXRwdXRfYmZkLCBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgYmZkX21hY2hfaTk2MF9jb3JlKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkOTYwX2Nob29zZV90YXJnZXQoKQotewotI2lmZGVmIEdOVTk2MAotCi0gIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7Ci0gIHJldHVybiBiZmRfbWFrZV90YXJnX25hbWUoQkZEX0JPVVRfRk9STUFULCAwKTsKLQotI2Vsc2UKLQotICBjaGFyICpmcm9tX291dHNpZGUgPSBnZXRlbnYoVEFSR0VUX0VOVklST04pOwotICBvdXRwdXRfZmlsZW5hbWUgPSAiYi5vdXQiOwotCi0gIGlmIChmcm9tX291dHNpZGUgIT0gKGNoYXIgKilOVUxMKQotICAgIHJldHVybiBmcm9tX291dHNpZGU7Ci0KLSAgcmV0dXJuICJiLm91dC5saXR0bGUiOwotCi0jZW5kaWYKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkOTYwX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotCi1pZiB0ZXN0IC1uICIkQ09NUElMRV9JTiIKLXRoZW4KLSMgU2NyaXB0cyBjb21waWxlZCBpbi4KLQotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0ncy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMXMvXi8iLwotJHMvJC9uIi8KLScKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHVgOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuYDsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuYDsKLSAgZWxzZQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54YDsKLX0KLUVPRgotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkX2dsZDk2MF9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkOTYwX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCwKLSAgZ2xkOTYwX2Nob29zZV90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZDk2MF9nZXRfc2NyaXB0LAotICAiOTYwIiwKLSAgIiIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9nbGQ5NjBjLmVtIGIvbGQvZW11bHRlbXBsL2dsZDk2MGMuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwY2I1ZWQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2dsZDk2MGMuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiAKLSAqIGVtdWxhdGUgdGhlIEludGVscyBwb3J0IG9mICBnbGQKLSAqLwotCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0KLSNpZmRlZiBHTlU5NjAKLQotc3RhdGljIHZvaWQKLWdsZDk2MF9iZWZvcmVfcGFyc2UoKQotewotICBzdGF0aWMgY2hhciAqZW52X3ZhcmlhYmxlc1tdID0geyAiRzk2MExJQiIsICJHOTYwQkFTRSIsIDAgfTsKLSAgY2hhciAqKnA7Ci0gIGNoYXIgKmVudiA7Ci0KLSAgZm9yICggcCA9IGVudl92YXJpYWJsZXM7ICpwOyBwKysgKXsKLSAgICBlbnYgPSAgKGNoYXIgKikgZ2V0ZW52KCpwKTsKLSAgICBpZiAoZW52KSB7Ci0gICAgICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoY29uY2F0IChlbnYsCi0JCQkJICAgICAgICIvbGliL2xpYmNvZmYiLAotCQkJCSAgICAgICAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgICBmYWxzZSk7Ci0gICAgfQotICB9Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi1zdGF0aWMgdm9pZCBnbGQ5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgY2hhciAqZW52IDsKLSAgZW52ID0gIGdldGVudigiRzk2MExJQiIpOwotICBpZiAoZW52KSB7Ci0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoZW52LCBmYWxzZSk7Ci0gIH0KLSAgZW52ID0gZ2V0ZW52KCJHOTYwQkFTRSIpOwotICBpZiAoZW52KQotICAgIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChjb25jYXQgKGVudiwgIi9saWIiLCAoY29uc3QgY2hhciAqKSBOVUxMKSwKLQkJCSAgICAgZmFsc2UpOwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci19Ci0KLSNlbmRpZgkvKiBHTlU5NjAgKi8KLQotCi1zdGF0aWMgdm9pZAotZ2xkOTYwX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSAhPSBOVUxMCi0gICAgICAmJiAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBjaGFyICpzLCAqczE7Ci0KLSAgICAgIHMgPSBjb25jYXQgKCJpOTYwOiIsIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lLCAoY2hhciAqKSBOVUxMKTsKLSAgICAgIGZvciAoczEgPSBzOyAqczEgIT0gJ1wwJzsgczErKykKLQlpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpzMSkpCi0JICAqczEgPSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKnMxKTsKLSAgICAgIGxkZmlsZV9zZXRfb3V0cHV0X2FyY2ggKHMpOwotICAgICAgZnJlZSAocyk7Ci0gICAgfQotCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0ICgpOwotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQ5NjBfY2hvb3NlX3RhcmdldCgpCi17Ci0jaWZkZWYgR05VOTYwCi0KLSAgb3V0cHV0X2ZpbGVuYW1lID0gImIub3V0IjsKLSAgcmV0dXJuIGJmZF9tYWtlX3RhcmdfbmFtZShCRkRfQk9VVF9GT1JNQVQsIDApOwotCi0jZWxzZQotCi0gIGNoYXIgKmZyb21fb3V0c2lkZSA9IGdldGVudihUQVJHRVRfRU5WSVJPTik7Ci0gIG91dHB1dF9maWxlbmFtZSA9ICJiLm91dCI7Ci0KLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLQotICByZXR1cm4gImNvZmYtSW50ZWwtbGl0dGxlIjsKLQotI2VuZGlmCi19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZDk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9J3MvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTFzL14vIi8KLSRzLyQvbiIvCi0nCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7Ci0gIGVsc2UKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Ci19Ci1FT0YKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9nbGQ5NjBjb2ZmX2VtdWxhdGlvbiA9IAotewotICBnbGQ5NjBfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGQ5NjBfc2V0X291dHB1dF9hcmNoLAotICBnbGQ5NjBfY2hvb3NlX3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkOTYwX2dldF9zY3JpcHQsCi0gICI5NjBjb2ZmIiwKLSAgIiIKLX07Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL2VtdWx0ZW1wbC9ocHBhZWxmLmVtIGIvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwY2ExMTMuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2hwcGFlbGYuZW0KKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQW4gZW11bGF0aW9uIGZvciBIUCBQQS1SSVNDIEVMRiBsaW5rZXJzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRjdG9yLmgiCi0KLS8qIFNlY3Rpb24gaW4gd2hpY2ggd2UgYnVpbGQgc3R1YnMuICAqLwotc3RhdGljIGFzZWN0aW9uICpzdHViX3NlYzsKLXN0YXRpYyBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdHViX2ZpbGU7Ci0KLQotLyogRklYTUUuICBUaGlzIGRvZXNuJ3QgYmVsb25nIGhlcmUuICAqLwotZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBmaWxlX2NoYWluOwotCi0vKiBQZXJmb3JtIHNvbWUgZW11bGF0aW9uIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAgRm9yIFBBIEVMRiB3ZSBzZXQKLSAgIHVwIHRoZSBsb2NhbCBsYWJlbCBwcmVmaXggYW5kIHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfYmVmb3JlX3BhcnNlICgpCi17Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaHBwYTsKLX0KLQotLyogU2V0IHRoZSBvdXRwdXQgYXJjaGl0ZWN0dXJlIGFuZCBtYWNoaW5lLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgdW5zaWduZWQgbG9uZyBtYWNoaW5lID0gMDsKLQotICBiZmRfc2V0X2FyY2hfbWFjaCAob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIG1hY2hpbmUpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGlucHV0IGZpbGVzIGFyZSBvcGVuZWQuICBXZSBjcmVhdGUgYSBuZXcKLSAgIGZha2UgaW5wdXQgZmlsZSB0byBob2xkIHRoZSBzdHViIHNlY3Rpb24uICAqLwotCi1zdGF0aWMgdm9pZAotaHBwYWVsZl9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyAoKQotewotICBzdHViX2ZpbGUgPSBsYW5nX2FkZF9pbnB1dF9maWxlICgibGlua2VyIHN0dWJzIiwKLQkJCQkgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotCQkJCSAgIE5VTEwpOwotICBzdHViX2ZpbGUtPnRoZV9iZmQgPSBiZmRfY3JlYXRlICgibGlua2VyIHN0dWJzIiwgb3V0cHV0X2JmZCk7Ci0gIGlmIChzdHViX2ZpbGUtPnRoZV9iZmQgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X2FyY2hfbWFjaCAoc3R1Yl9maWxlLT50aGVfYmZkLAotCQkJICAgICAgYmZkX2dldF9hcmNoIChvdXRwdXRfYmZkKSwKLQkJCSAgICAgIGJmZF9nZXRfbWFjaCAob3V0cHV0X2JmZCkpKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBjcmVhdGUgQkZEICVFXG4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc3R1Yl9zZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKHN0dWJfZmlsZS0+dGhlX2JmZCwgIi50ZXh0Iik7Ci0gIC8qIERvbid0IHNldCBTRUNfUkVMT0MgdW50aWwgd2UgYWN0dWFsbHkgaGF2ZSByZWxvY2F0aW9ucyBpbiB0aGlzCi0gICAgIHNlY3Rpb24uICAqLwotICBpZiAoc3R1Yl9zZWMgPT0gTlVMTAotICAgICAgfHwgISBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKHN0dWJfZmlsZS0+dGhlX2JmZCwgc3R1Yl9zZWMsCi0JCQkJICAoU0VDX0hBU19DT05URU5UUwotCQkJCSAgIHwgU0VDX0FMTE9DCi0JCQkJICAgfCBTRUNfTE9BRAotCQkJCSAgIHwgU0VDX0NPREUKLQkJCQkgICB8IFNFQ19JTl9NRU1PUlkpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIHN0dWIgc2VjdGlvbjogJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBsZGxhbmdfYWRkX2ZpbGUgKHN0dWJfZmlsZSk7Ci19Ci0KLS8qIFdhbGsgYWxsIHRoZSBsYW5nIHN0YXRlbWVudHMgc3BsaWNpbmcgb3V0IGFueSBwYWRkaW5nIHN0YXRlbWVudHMgZnJvbSAKLSAgIHRoZSBsaXN0LiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfZGVsZXRlX3BhZGRpbmdfc3RhdGVtZW50cyAocywgcHJldikKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnByZXY7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnNwcmV2ID0gTlVMTDsKLSAgZm9yICg7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0KLQkvKiBXZSB3YW50IHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2Ugc2VjdGlvbnMuICAqLwotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwKLQkJCQkJICAgICAmY29uc3RydWN0b3JfbGlzdC5oZWFkKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkLAotCQkJCQkgICAgICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuCi0JCQkJCSAgICAgICBjaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCi0JLyogSHVoPyAgV2hhdCBpcyBhIGxhbmdfd2lsZF9zdGF0ZW1lbnQ/ICAqLwotCWNhc2UgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtOgotCSAgaHBwYWVsZl9kZWxldGVfcGFkZGluZ19zdGF0ZW1lbnRzIChzLT53aWxkX3N0YXRlbWVudC4KLQkJCQkJICAgICAgIGNoaWxkcmVuLmhlYWQsCi0JCQkJCSAgICAgJnMtPndpbGRfc3RhdGVtZW50LgotCQkJCQkgICAgICAgY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQotCS8qIEhlcmUncyB3aGF0IHdlIGFyZSByZWFsbHkgbG9va2luZyBmb3IuICBTcGxpY2UgdGhlc2Ugb3V0IG9mCi0JICAgdGhlIGxpc3QuICAqLwotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKHNwcmV2KQotCSAgICBzcHJldi0+aGVhZGVyLm5leHQgPSBzLT5oZWFkZXIubmV4dDsKLQkgIGVsc2UKLQkgICAgKipwcmV2ID0gKnM7Ci0JICBicmVhazsKLQotCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlc2UgY2FzZXMuICAqLwotCWNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBhYm9ydCAoKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIHNwcmV2ID0gczsKLSAgICB9Ci19Ci0KLS8qIEZpbmFsIGVtdWxhdGlvbiBzcGVjaWZpYyBjYWxsLiAgRm9yIHRoZSBQQSB3ZSB1c2UgdGhpcyBvcHBvcnR1bml0eQotICAgdG8gYnVpbGQgbGlua2VyIHN0dWJzLiAgKi8KLQotc3RhdGljIHZvaWQKLWhwcGFlbGZfZmluaXNoICgpCi17Ci0gIC8qIENhbGwgaW50byB0aGUgQkZEIGJhY2tlbmQgdG8gZG8gdGhlIHJlYWwgd29yay4gICovCi0gIGlmIChlbGYzMl9ocHBhX3NpemVfc3R1YnMgKHN0dWJfZmlsZS0+dGhlX2JmZCwgb3V0cHV0X2JmZCwgJmxpbmtfaW5mbykKLSAgICAgID09IGZhbHNlKQotICAgIHsKLSAgICAgIGVpbmZvICgiJVglUDogY2FuIG5vdCBzaXplIHN0dWIgc2VjdGlvbjogJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgCi0gIC8qIElmIHRoZSBzaXplIG9mIHRoZSBzdHViIHNlY3Rpb24gaXMgbm9uemVybywgdGhlbiB3ZSBuZWVkCi0gICAgIHRvIHJlc2l6ZSB0aGUgc2VjdGlvbnMsIHJlY29tcHV0ZSB0aGUgYXNzaWdubWVudHMsIGFuZCBmaW5hbGx5Ci0gICAgIGJ1aWxkIHRoZSBzdHVicy4gICovCi0gIGlmIChiZmRfc2VjdGlvbl9zaXplIChzdHViX2ZpbGUtPnRoZV9iZmQsIHN0dWJfZmlsZS0+dGhlX2JmZC0+c2VjdGlvbnMpICE9IDApCi0gICAgewotICAgICAgLyogRGVsZXRlIGFsbCB0aGUgcGFkZGluZyBzdGF0ZW1lbnRzLCB0aGV5J3JlIG5vIGxvbmdlciB2YWxpZC4gICovCi0gICAgICBocHBhZWxmX2RlbGV0ZV9wYWRkaW5nX3N0YXRlbWVudHMgKHN0YXRfcHRyLT5oZWFkLCAmc3RhdF9wdHItPmhlYWQpOwotICAgICAgCi0gICAgICAvKiBSZXNpemUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQsIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJnN0YXRfcHRyLT5oZWFkLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotICAgICAgCi0gICAgICAvKiBSZWRvIHNwZWNpYWwgc3R1ZmYuICAqLwotICAgICAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0gICAgICAKLSAgICAgIC8qIERvIHRoZSBhc3NpZ25tZW50cyBhZ2Fpbi4gICovCi0gICAgICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0X3B0ci0+aGVhZCwKLQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLSAgICAgIAotICAgICAgLyogTm93IGJ1aWxkIHRoZSBsaW5rZXIgc3R1YnMuICAqLwotICAgICAgaWYgKGVsZjMyX2hwcGFfYnVpbGRfc3R1YnMgKHN0dWJfZmlsZS0+dGhlX2JmZCwgJmxpbmtfaW5mbykgPT0gZmFsc2UpCi0JewotCSAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGJ1aWxkIHN0dWJzOiAlRVxuIik7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLX0KLQotLyogVGhlIHNjcmlwdCBpdHNlbGYgZ2V0cyBpbnNlcnRlZCBoZXJlLiAgKi8KLQotc3RhdGljIGNoYXIgKgotaHBwYWVsZl9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9J3MvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTFzL14vIi8KLSRzLyQvbiIvCi0nCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1YDsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cmA7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibmA7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bmA7Ci0gIGVsc2UKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGA7Ci19Ci1FT0YKLQotZWxzZQotIyBTY3JpcHRzIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMTsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciI7Ci0gIGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4iOwotICBlbHNlCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCI7Ci19Ci1FT0YKLQotZmkKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9ocHBhZWxmX2VtdWxhdGlvbiA9IAotewotICBocHBhZWxmX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgaHBwYWVsZl9zZXRfb3V0cHV0X2FyY2gsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgaHBwYWVsZl9nZXRfc2NyaXB0LAotICAiaHBwYWVsZiIsCi0gICJlbGYzMi1ocHBhIiwKLSAgaHBwYWVsZl9maW5pc2gsCi0gIGhwcGFlbGZfY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMsCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbGludXguZW0gYi9sZC9lbXVsdGVtcGwvbGludXguZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDg1NWQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL2xpbnV4LmVtCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogTGludXggYS5vdXQgZW11bGF0aW9uIGNvZGUgZm9yICR7RU1VTEFUSU9OX05BTUV9Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICBMaW51eCBzdXBwb3J0IGJ5IEVyaWMgWW91bmdkYWxlIDxlcmljeUBjYWlzLmNhaXMuY29tPgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fb3Blbl9keW5hbWljX2FyY2hpdmUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzZWFyY2hfZGlyc190eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hZGRyZXNzX3N0YXRlbWVudAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzCi0gIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotICBjb25maWcuaGFzX3NoYXJlZCA9IHRydWU7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIGEgZHluYW1pYyBhcmNoaXZlLiAgVGhpcyBpcyB3aGVyZSB3ZSBrbm93IHRoYXQgTGludXgKLSAgIGR5bmFtaWMgbGlicmFyaWVzIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5zYS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGQke0VNVUxBVElPTl9OQU1FfV9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgY2hhciAqc3RyaW5nOwotCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdHJpbmcgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHNlYXJjaC0+bmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkKLQkJCSAgICAgKyBzdHJsZW4gKGFyY2gpCi0JCQkgICAgICsgc2l6ZW9mICIvbGliLnNhIik7Ci0KLSAgc3ByaW50ZiAoc3RyaW5nLCAiJXMvbGliJXMlcy5zYSIsIHNlYXJjaC0+bmFtZSwgZW50cnktPmZpbGVuYW1lLCBhcmNoKTsKLQotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBjcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyByb3V0aW5lIHZpYQotICAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQuICBJdCBsb2NhdGVzIGFueSBhZGRyZXNzIGFzc2lnbm1lbnQgdG8KLSAgIC50ZXh0LCBhbmQgbW9kaWZpZXMgaXQgdG8gaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVycy4gIFRoaXMKLSAgIGNhdXNlcyAtVHRleHQgdG8gbWVhbiB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgaGVhZGVyLCByYXRoZXIKLSAgIHRoYW4gdGhlIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgLnRleHQsIHdoaWNoIGlzIGNvbXBhdGlibGUgd2l0aCBvdGhlcgotICAgTGludXggdG9vbHMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hZGRyZXNzX3N0YXRlbWVudCAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bQotICAgICAgJiYgc3RyY21wIChzLT5hZGRyZXNzX3N0YXRlbWVudC5zZWN0aW9uX25hbWUsICIudGV4dCIpID09IDApCi0gICAgewotICAgICAgQVNTRVJUIChzLT5hZGRyZXNzX3N0YXRlbWVudC5hZGRyZXNzLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfdmFsdWUpOwotICAgICAgcy0+YWRkcmVzc19zdGF0ZW1lbnQuYWRkcmVzcy0+dmFsdWUudmFsdWUgKz0gMHgyMDsKLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSBvcGVuaW5nIHRoZSBpbnB1dCBCRkQncy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyAoKQotewotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hZGRyZXNzX3N0YXRlbWVudCk7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIC8qIExldCB0aGUgYmFja2VuZCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zIHJlcXVpcmVkIGJ5Ci0gICAgIGR5bmFtaWMgbGlua2luZy4gICovCi0gIGlmICghIGJmZF8ke0VNVUxBVElPTl9OQU1FfV9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSdzL1siXFxdL1xcJi9nCi1zLyQvXFxuXFwvCi0xcy9eLyIvCi0kcy8kL24iLwotJwotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dWA7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHJgOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym5gOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG5gOwotICBlbHNlCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhgOwotfQotRU9GCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgTlVMTCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X29wZW5fZHluYW1pY19hcmNoaXZlCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvbG5rOTYwLmVtIGIvbGQvZW11bHRlbXBsL2xuazk2MC5lbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2ZDQ2Yi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvbG5rOTYwLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLSMgVGhpcyBzaGVsbCBzY3JpcHQgZW1pdHMgYSBDIGZpbGUuIC0qLSBDIC0qLQotIyBJdCBkb2VzIHNvbWUgc3Vic3RpdHV0aW9ucy4KLWNhdCA+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLS8qIGludGVsIGNvZmYgbG9hZGVyIGVtdWxhdGlvbiBzcGVjaWZpYyBzdHVmZgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBzdGV2ZUBjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotLyojaW5jbHVkZSAiYXJjaHVyZXMuaCIqLwotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotdHlwZWRlZiBzdHJ1Y3QgbGliX2xpc3QgewotICBjaGFyICpuYW1lOwotICBzdHJ1Y3QgbGliX2xpc3QgKm5leHQ7Ci19IGxpYl9saXN0X3R5cGU7Ci0KLXN0YXRpYyBsaWJfbGlzdF90eXBlICpobGxfbGlzdDsKLXN0YXRpYyBsaWJfbGlzdF90eXBlICoqaGxsX2xpc3RfdGFpbCA9ICZobGxfbGlzdDsKLQotc3RhdGljIGxpYl9saXN0X3R5cGUgKnN5c2xpYl9saXN0Owotc3RhdGljIGxpYl9saXN0X3R5cGUgKipzeXNsaWJfbGlzdF90YWlsID0gJnN5c2xpYl9saXN0OwotCi0KLXN0YXRpYyB2b2lkCi1hcHBlbmQobGlzdCwgbmFtZSkKLSAgICAgbGliX2xpc3RfdHlwZSAqKipsaXN0OwotICAgICBjaGFyICpuYW1lOwotewotICBsaWJfbGlzdF90eXBlICplbGVtZW50ID0gCi0gICAgKGxpYl9saXN0X3R5cGUgKikoeG1hbGxvYyhzaXplb2YobGliX2xpc3RfdHlwZSkpKTsKLQotICBlbGVtZW50LT5uYW1lID0gbmFtZTsKLSAgZWxlbWVudC0+bmV4dCA9IChsaWJfbGlzdF90eXBlICopTlVMTDsKLSAgKipsaXN0ID0gZWxlbWVudDsKLSAgKmxpc3QgPSAmZWxlbWVudC0+bmV4dDsKLQotfQotCi1zdGF0aWMgYm9vbGVhbiBoYWRfaGxsID0gZmFsc2U7Ci1zdGF0aWMgYm9vbGVhbiBoYWRfaGxsX25hbWUgPSBmYWxzZTsKLQotc3RhdGljIHZvaWQKLWxuazk2MF9obGwobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaGFkX2hsbCA9IHRydWU7Ci0gIGlmIChuYW1lICE9IChjaGFyICopTlVMTCkgewotICAgIGhhZF9obGxfbmFtZSA9IHRydWU7Ci0gICAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCBuYW1lKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCAKLWxuazk2MF9zeXNsaWIobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgYXBwZW5kKCZzeXNsaWJfbGlzdF90YWlsLG5hbWUpOwotfQotCi0KLSNpZmRlZiBHTlU5NjAKLQotc3RhdGljIHZvaWQgCi1sbms5NjBfYmVmb3JlX3BhcnNlKCkKLXsKLSAgc3RhdGljIGNoYXIgKmVudl92YXJpYWJsZXNbXSA9IHsgIkc5NjBMSUIiLCAiRzk2MEJBU0UiLCAwIH07Ci0gIGNoYXIgKipwOwotICBjaGFyICplbnYgOwotCi0gIGZvciAoIHAgPSBlbnZfdmFyaWFibGVzOyAqcDsgcCsrICl7Ci0gICAgZW52ID0gIChjaGFyICopIGdldGVudigqcCk7Ci0gICAgaWYgKGVudikgewotICAgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoY29uY2F0KGVudiwiL2xpYi9saWJjb2ZmIiwiIiksIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBlbnY9IChjaGFyICopIGdldGVudigiSTk2MEJBU0UiKTsKLSAgaWYgKCBlbnYgKSB7Ci0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGgoY29uY2F0KGVudiwiL2xpYiIsIiIpLCBmYWxzZSk7Ci0gIH0KLQotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX2k5NjA7Ci0gIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLX0KLQotI2Vsc2UJLyogbm90IEdOVTk2MCAqLwotCi1zdGF0aWMgdm9pZCAKLWxuazk2MF9iZWZvcmVfcGFyc2UoKQotewotICBjaGFyICpuYW1lID0gZ2V0ZW52KCJJOTYwQkFTRSIpOwotCi0gIGlmIChuYW1lID09IChjaGFyICopTlVMTCkgewotICAgIG5hbWUgPSBnZXRlbnYoIkc5NjBCQVNFIik7Ci0gICAgaWYgKG5hbWUgPT0gKGNoYXIgKilOVUxMKSB7Ci0gICAgICBlaW5mbygiJVAlRiBJOTYwQkFTRSBhbmQgRzk2MEJBU0Ugbm90IHNldFxuIik7Ci0gICAgfQotICB9Ci0KLQotICBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aChjb25jYXQobmFtZSwiL2xpYiIsIiIpLCBmYWxzZSk7Ci0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfaTk2MDsKLSAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gYmZkX21hY2hfaTk2MF9jb3JlOwotfQotCi0jZW5kaWYJLyogR05VOTYwICovCi0KLQotc3RhdGljIHZvaWQKLWFkZF9vbihsaXN0LCBzZWFyY2gpCi0gICAgIGxpYl9saXN0X3R5cGUgKmxpc3Q7Ci0gICAgIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgc2VhcmNoOwotewotICB3aGlsZSAobGlzdCkgewotICAgIGxhbmdfYWRkX2lucHV0X2ZpbGUobGlzdC0+bmFtZSwKLQkJCXNlYXJjaCwKLQkJCShjaGFyICopTlVMTCk7Ci0gICAgbGlzdCA9IGxpc3QtPm5leHQ7Ci0gIH0KLX0KLXN0YXRpYyB2b2lkCi1sbms5NjBfYWZ0ZXJfcGFyc2UoKQotewotICAvKiBJZiB0aGVyZSBoYXMgYmVlbiBubyBhcmNoLCBkZWZhdWx0IHRvIC1LQiAqLwotICBpZiAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWVbMF0gPT0wKSB7Ci0gICAgbGRmaWxlX2FkZF9hcmNoKCJLQiIpOwotICB9Ci0KLSAgLyogaWYgdGhlcmUgaGFzIGJlZW4gbm8gaGxsIGxpc3QgdGhlbiBhZGQgb3VyIG93biAqLwotICAKLSAgaWYoaGFkX2hsbCAmJiAhaGFkX2hsbF9uYW1lKSB7Ci0gICAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCJjZyIpOwotICAgIGlmIChsZGZpbGVfb3V0cHV0X21hY2hpbmUgPT0gYmZkX21hY2hfaTk2MF9rYV9zYSB8fAotICAJbGRmaWxlX291dHB1dF9tYWNoaW5lID09IGJmZF9tYWNoX2k5NjBfY2EpIHsKLSAgICAgICAgewotCSAgYXBwZW5kKCZobGxfbGlzdF90YWlsLCJmcGciKTsKLSAgICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgYWRkX29uKGhsbF9saXN0LCBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtKTsKLSAgYWRkX29uKHN5c2xpYl9saXN0LCBsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sbms5NjBfYmVmb3JlX2FsbG9jYXRpb24oKQotewotfQotCi1zdGF0aWMgdm9pZAotbG5rOTYwX2FmdGVyX2FsbG9jYXRpb24oKQotewotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSBmYWxzZSkgewotICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YoIi50ZXh0IiwiX2V0ZXh0Iik7Ci0gICAgbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZigiLmRhdGEiLCJfZWRhdGEiKTsKLSAgICBsYW5nX2Fic19zeW1ib2xfYXRfYmVnaW5uaW5nX29mKCIuYnNzIiwiX2Jzc19zdGFydCIpOwotICAgIGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YoIi5ic3MiLCJfZW5kIik7Ci0gIH0KLX0KLQotCi1zdGF0aWMgc3RydWN0Ci0gewotICAgdW5zaWduZWQgIGxvbmcgbnVtYmVyOwotICAgY2hhciAqbmFtZTsgCi0gfQotbWFjaGluZV90YWJsZVtdID0KLXsKLSAgeyBiZmRfbWFjaF9pOTYwX2NvcmUJLCJDT1JFIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Jfc2IJLCJLQiIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwiU0IiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9tYwksIk1DIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfeGEJLCJYQSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2NhCSwiQ0EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYV9zYQksIktBIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJTQSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2p4CSwiSlgiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9oeAksIkhYIiB9LAotCi0gIHsgYmZkX21hY2hfaTk2MF9jb3JlCSwiY29yZSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2tiX3NiCSwia2IiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9rYl9zYgksInNiIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfbWMJLCJtYyIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX3hhCSwieGEiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9jYQksImNhIiB9LAotICB7IGJmZF9tYWNoX2k5NjBfa2Ffc2EJLCJrYSIgfSwKLSAgeyBiZmRfbWFjaF9pOTYwX2thX3NhCSwic2EiIH0sCi0gIHsgYmZkX21hY2hfaTk2MF9qeAksImp4IiB9LAotICB7IGJmZF9tYWNoX2k5NjBfaHgJLCJoeCIgfSwKLQotICB7IDAsIChjaGFyICopIE5VTEwgfQotfTsKLQotc3RhdGljIHZvaWQKLWxuazk2MF9zZXRfb3V0cHV0X2FyY2goKQotewotICAvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KLSAgdW5zaWduZWQgaW50IGk7Ci0gIGxkZmlsZV9vdXRwdXRfbWFjaGluZSA9IGJmZF9tYWNoX2k5NjBfY29yZTsKLSAgZm9yIChpPSAwOyBtYWNoaW5lX3RhYmxlW2ldLm5hbWUgIT0gKGNoYXIqKU5VTEw7IGkrKykgewotICAgIGlmIChzdHJjbXAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWUsbWFjaGluZV90YWJsZVtpXS5uYW1lKT09MCkgewotICAgICAgbGRmaWxlX291dHB1dF9tYWNoaW5lID0gbWFjaGluZV90YWJsZVtpXS5udW1iZXI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIGxkZmlsZV9vdXRwdXRfbWFjaGluZSk7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWxuazk2MF9jaG9vc2VfdGFyZ2V0KCkKLXsKLSNpZmRlZiBHTlU5NjAKLQotICByZXR1cm4gYmZkX21ha2VfdGFyZ19uYW1lKEJGRF9DT0ZGX0ZPUk1BVCwgMCk7Ci0KLSNlbHNlCi0KLSAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52KFRBUkdFVF9FTlZJUk9OKTsKLSAgaWYgKGZyb21fb3V0c2lkZSAhPSAoY2hhciAqKU5VTEwpCi0gICAgcmV0dXJuIGZyb21fb3V0c2lkZTsKLSNpZmRlZiBMTks5NjBfTElUVExFCi0gIHJldHVybiAiY29mZi1JbnRlbC1saXR0bGUiOwotI2Vsc2UKLSAgcmV0dXJuICJjb2ZmLUludGVsLWJpZyI7Ci0jZW5kaWYKLSNlbmRpZgotCi19Ci0KLXN0YXRpYyBjaGFyICoKLWxuazk2MF9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9J3MvWyJcXF0vXFwmL2cKLXMvJC9cXG5cXC8KLTFzL14vIi8KLSRzLyQvbiIvCi0nCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dWA7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHJgOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym5gOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG5gOwotICBlbHNlCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhgOwotfQotRU9GCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfbG5rOTYwX2VtdWxhdGlvbiA9IAotewotICBsbms5NjBfYmVmb3JlX3BhcnNlLAotICBsbms5NjBfc3lzbGliLAotICBsbms5NjBfaGxsLAotICBsbms5NjBfYWZ0ZXJfcGFyc2UsCi0gIE5VTEwsCQkJLyogYWZ0ZXJfb3BlbiAqLwotICBsbms5NjBfYWZ0ZXJfYWxsb2NhdGlvbiwKLSAgbG5rOTYwX3NldF9vdXRwdXRfYXJjaCwKLSAgbG5rOTYwX2Nob29zZV90YXJnZXQsCi0gIGxuazk2MF9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgbG5rOTYwX2dldF9zY3JpcHQsCi0gICJsbms5NjAiLAotICAiIgotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL21pcHNlY29mZi5lbSBiL2xkL2VtdWx0ZW1wbC9taXBzZWNvZmYuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjAwYzQuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL21pcHNlY29mZi5lbQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi1jYXQgPmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIEhhbmRsZSBlbWJlZGRlZCByZWxvY3MgZm9yIE1JUFMuCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+IGJhc2VkIG9uIGdlbmVyaWMuZW0uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBjaGVja19zZWN0aW9ucyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0jZW5kaWYgLyogbm90IFRBUkdFVF8gKi8KLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBydW4gYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLgotICAgV2UgY3JlYXRlIGEgLnJlbC5zZGF0YSBzZWN0aW9uIGZvciBlYWNoIGlucHV0IGZpbGUgd2l0aCBhIG5vbiB6ZXJvCi0gICAuc2RhdGEgc2VjdGlvbi4gIFRoZSBCRkQgYmFja2VuZCB3aWxsIGZpbGwgaW4gdGhlc2Ugc2VjdGlvbnMgd2l0aAotICAgbWFnaWMgbnVtYmVycyB3aGljaCBjYW4gYmUgdXNlZCB0byByZWxvY2F0ZSB0aGUgZGF0YSBzZWN0aW9uIGF0IHJ1bgotICAgdGltZS4gIFRoaXMgd2lsbCBvbmx5IGRvIHRoZSByaWdodCB0aGluZyBpZiBhbGwgdGhlIGlucHV0IGZpbGVzCi0gICBoYXZlIGJlZW4gY29tcGlsZWQgdXNpbmcgLW1lbWJlZGRlZC1waWMuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiAoKQotewotICBiZmQgKmFiZmQ7Ci0KLSAgaWYgKCEgY29tbWFuZF9saW5lLmVtYmVkZGVkX3JlbG9jcwotICAgICAgfHwgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhYmZkID0gbGlua19pbmZvLmlucHV0X2JmZHM7IGFiZmQgIT0gTlVMTDsgYWJmZCA9IGFiZmQtPmxpbmtfbmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqZGF0YXNlYzsKLQotICAgICAgZGF0YXNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLnNkYXRhIik7Ci0KLSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBhc3N1bWUgdGhhdCB0aGUgcmVsb2NfY291bnQgZmllbGQgaGFzIGFscmVhZHkKLSAgICAgICAgIGJlZW4gc2V0IHVwLiAgV2UgY291bGQgY2FsbCBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kLCBidXQKLSAgICAgICAgIHRoYXQgcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG1lbW9yeSBidWZmZXIgcmF0aGVyIHRoYW4gYSByZWxvYwotICAgICAgICAgY291bnQuICBXZSBkbyBub3Qgd2FudCB0byBjYWxsIGJmZF9jYW5vbmljYWxpemVfcmVsb2MsCi0gICAgICAgICBiZWNhdXNlIGFsdGhvdWdoIGl0IHdvdWxkIGFsd2F5cyB3b3JrIGl0IHdvdWxkIGZvcmNlIHVzIHRvCi0gICAgICAgICByZWFkIGluIHRoZSByZWxvY3MgaW50byBCRkQgY2Fub25pY2FsIGZvcm0sIHdoaWNoIHdvdWxkIHdhc3RlCi0gICAgICAgICBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIGFuZCBtZW1vcnkuICAqLwotICAgICAgaWYgKGRhdGFzZWMgIT0gTlVMTCAmJiBkYXRhc2VjLT5yZWxvY19jb3VudCA+IDApCi0JewotCSAgYXNlY3Rpb24gKnJlbHNlYzsKLQotCSAgcmVsc2VjID0gYmZkX21ha2Vfc2VjdGlvbiAoYWJmZCwgIi5yZWwuc2RhdGEiKTsKLQkgIGlmIChyZWxzZWMgPT0gTlVMTAotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChhYmZkLCByZWxzZWMsCi0JCQkJCSAgKFNFQ19BTExPQwotCQkJCQkgICB8IFNFQ19MT0FECi0JCQkJCSAgIHwgU0VDX0hBU19DT05URU5UUwotCQkJCQkgICB8IFNFQ19JTl9NRU1PUlkpKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgcmVsc2VjLCAyKQotCSAgICAgIHx8ICEgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIHJlbHNlYywKLQkJCQkJIGRhdGFzZWMtPnJlbG9jX2NvdW50ICogNCkpCi0JICAgIGVpbmZvICgiJUYlQjogY2FuIG5vdCBjcmVhdGUgLnJlbC5zZGF0YSBzZWN0aW9uOiAlRVxuIik7Ci0JfQotCi0gICAgICAvKiBEb3VibGUgY2hlY2sgdGhhdCBhbGwgb3RoZXIgZGF0YSBzZWN0aW9ucyBhcmUgZW1wdHksIGFzIGlzCi0gICAgICAgICByZXF1aXJlZCBmb3IgZW1iZWRkZWQgUElDIGNvZGUuICAqLwotICAgICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zIChhYmZkLCBjaGVja19zZWN0aW9ucywgKFBUUikgZGF0YXNlYyk7Ci0gICAgfQotfQotCi0vKiBDaGVjayB0aGF0IG9mIHRoZSBkYXRhIHNlY3Rpb25zLCBvbmx5IHRoZSAuc2RhdGEgc2VjdGlvbiBoYXMKLSAgIHJlbG9jcy4gIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfc2VjdGlvbnMgKGFiZmQsIHNlYywgc2RhdGFzZWMpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIHNkYXRhc2VjOwotewotICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKSAmIFNFQ19DT0RFKSA9PSAwCi0gICAgICAmJiBzZWMgIT0gKGFzZWN0aW9uICopIHNkYXRhc2VjCi0gICAgICAmJiBzZWMtPnJlbG9jX2NvdW50ICE9IDApCi0gICAgZWluZm8gKCIlUCVYOiBzZWN0aW9uICVzIGhhcyByZWxvY3M7IGNhbiBub3QgdXNlIC0tZW1iZWRkZWQtcmVsb2NzXG4iLAotCSAgIGFiZmQsIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIHNlY3Rpb24gc2l6ZXMgYW5kIG9mZnNldHMgaGF2ZQotICAgYmVlbiBzZXQuICBJZiB3ZSBhcmUgZ2VuZXJhdGluZyBlbWJlZGRlZCByZWxvY3MsIGl0IGNhbGxzIGEgc3BlY2lhbAotICAgQkZEIGJhY2tlbmQgcm91dGluZSB0byBkbyB0aGUgd29yay4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9hbGxvY2F0aW9uICgpCi17Ci0gIGJmZCAqYWJmZDsKLQotICBpZiAoISBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzCi0gICAgICB8fCBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICBmb3IgKGFiZmQgPSBsaW5rX2luZm8uaW5wdXRfYmZkczsgYWJmZCAhPSBOVUxMOyBhYmZkID0gYWJmZC0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhc2VjLCAqcmVsc2VjOwotICAgICAgY2hhciAqZXJybXNnOwotCi0gICAgICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKLQotICAgICAgaWYgKGRhdGFzZWMgPT0gTlVMTCB8fCBkYXRhc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWwuc2RhdGEiKTsKLSAgICAgIEFTU0VSVCAocmVsc2VjICE9IE5VTEwpOwotCi0gICAgICBpZiAoISBiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICAgZGF0YXNlYywgcmVsc2VjLAotCQkJCQkJICAgJmVycm1zZykpCi0JewotCSAgaWYgKGVycm1zZyA9PSBOVUxMKQotCSAgICBlaW5mbyAoIiVCJVg6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVFXG4iLAotCQkgICBhYmZkKTsKLQkgIGVsc2UKLQkgICAgZWluZm8gKCIlWCVCOiBjYW4gbm90IGNyZWF0ZSBydW50aW1lIHJlbG9jIGluZm9ybWF0aW9uOiAlc1xuIiwKLQkJICAgYWJmZCwgZXJybXNnKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci1FT0YKLQotaWYgdGVzdCAtbiAiJENPTVBJTEVfSU4iCi10aGVuCi0jIFNjcmlwdHMgY29tcGlsZWQgaW4uCi0KLSMgc2VkIGNvbW1hbmRzIHRvIHF1b3RlIGFuIGxkIHNjcmlwdCBhcyBhIEMgc3RyaW5nLgotc2M9Ii1mICR7c3JjZGlyfS9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZCIKLQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLUVPRgotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkgcmV0dXJuJyA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcudGV4dF9yZWFkX29ubHkpIHJldHVybicgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4nICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG4gICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnICA7IGVsc2UgcmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotc2VkICRzYyBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueCAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotZWNobyAnOyB9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBlJHtFTVVMQVRJT05fTkFNRX0uYwotCi1lbHNlCi0jIFNjcmlwdHMgcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtLgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAxOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1IjsKLSAgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhyIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4iOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biI7Ci0gIGVsc2UKLSAgICByZXR1cm4gImxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54IjsKLX0KLUVPRgotCi1maQotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotCi1zdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0IGxkXyR7RU1VTEFUSU9OX05BTUV9X2VtdWxhdGlvbiA9IAotewotICBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfb3BlbiwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfYWxsb2NhdGlvbiwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdCwKLSAgIiR7RU1VTEFUSU9OX05BTUV9IiwKLSAgIiR7T1VUUFVUX0ZPUk1BVH0iCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvcGUuZW0gYi9sZC9lbXVsdGVtcGwvcGUuZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYTI4OWYuLjAwMDAwMDAKLS0tIGEvbGQvZW11bHRlbXBsL3BlLmVtCisrKyAvZGV2L251bGwKQEAgLTEsMTIzNyArMCwwIEBACi0jIFRoaXMgc2hlbGwgc2NyaXB0IGVtaXRzIGEgQyBmaWxlLiAtKi0gQyAtKi0KLSMgSXQgZG9lcyBzb21lIHN1YnN0aXR1dGlvbnMuCi0oZWNobztlY2hvO2VjaG87ZWNobyk+ZSR7RU1VTEFUSU9OX05BTUV9LmMgIyB0aGVyZSwgbm93IGxpbmUgbnVtYmVycyBtYXRjaCA7LSkKLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0vKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotICAgQ29weXJpZ2h0IDE5OTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIEZvciBXSU5ET1dTX05UICovCi0vKiBUaGUgb3JpZ2luYWwgZmlsZSBnZW5lcmF0ZWQgcmV0dXJuZWQgZGlmZmVyZW50IGRlZmF1bHQgc2NyaXB0cyBkZXBlbmRpbmcKLSAgIG9uIHdoZXRoZXIgY2VydGFpbiBzd2l0Y2hlcyB3ZXJlIHNldCwgYnV0IHRoZXNlIHN3aXRjaGVzIHBlcnRhaW4gdG8gdGhlCi0gICBMaW51eCBzeXN0ZW0gYW5kIHRoYXQgcGFydGljdWxhciB2ZXJzaW9uIG9mIGNvZmYuICBJbiB0aGUgTlQgY2FzZSwgd2UKLSAgIG9ubHkgZGV0ZXJtaW5lIGlmIHRoZSBzdWJzeXN0ZW0gaXMgY29uc29sZSBvciB3aW5kb3dzIGluIG9yZGVyIHRvIHNlbGVjdAotICAgdGhlIGNvcnJlY3QgZW50cnkgcG9pbnQgYnkgZGVmYXVsdC4gKi8gCi0gIAotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRsZXguaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGN0b3IuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKLSNpbmNsdWRlICIuLi9iZmQvbGliYmZkLmgiCi0jaW5jbHVkZSAiZGVmZmlsZS5oIgotCi0jZGVmaW5lIFRBUkdFVF9JU18ke0VNVUxBVElPTl9OQU1FfQotCi0jaWYgZGVmaW5lZChUQVJHRVRfSVNfaTM4NnBlKQotI2RlZmluZSBETExfU1VQUE9SVAotI2VuZGlmCi0KLSNkZWZpbmUJUEVfREVGX1NVQlNZU1RFTQkJMwotCi0jaWZkZWYgVEFSR0VUX0lTX2FybV9lcG9jX3BlCi0jZGVmaW5lIGJmZF9hcm1fcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zIFwKLQliZmRfYXJtX2Vwb2NfcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zCi0jZGVmaW5lIGJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIFwKLQliZmRfYXJtX2Vwb2NfcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nCi0jZGVmaW5lIGJmZF9hcm1fcGVfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiBcCi0JYmZkX2FybV9lcG9jX3BlX3Byb2Nlc3NfYmVmb3JlX2FsbG9jYXRpb24KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBib29sZWFuIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqLCBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZF8ke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqKSk7Ci1zdGF0aWMgaW50IGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaW50ZXJuYWxfZXh0cmFfcGVfYW91dGhkciBwZTsKLXN0YXRpYyBpbnQgZGxsOwotc3RhdGljIGludCBzdXBwb3J0X29sZF9jb2RlID0gMDsKLXN0YXRpYyBjaGFyICogdGh1bWJfZW50cnlfc3ltYm9sID0gTlVMTDsKLWV4dGVybiBkZWZfZmlsZSAqcGVfZGVmX2ZpbGU7Ci1zdGF0aWMgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlICppbWFnZV9iYXNlX3N0YXRlbWVudCA9IDA7Ci0KLXN0YXRpYyBjaGFyICpwZV9vdXRfZGVmX2ZpbGVuYW1lID0gMDsKLWV4dGVybiBpbnQgcGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nOwotZXh0ZXJuIGludCBwZV9kbGxfa2lsbF9hdHM7Ci1leHRlcm4gaW50IHBlX2RsbF9zdGRjYWxsX2FsaWFzZXM7Ci1zdGF0aWMgaW50IHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwID0gLTE7IC8qIDA9ZGlzYWJsZSAxPWVuYWJsZSAqLwotc3RhdGljIGNoYXIgKnBlX2ltcGxpYl9maWxlbmFtZSA9IDA7Ci0KLWV4dGVybiBjb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWU7Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX3BhcnNlKCkKLXsKLSAgb3V0cHV0X2ZpbGVuYW1lID0gImEuZXhlIjsKLSAgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUgPSBiZmRfYXJjaF8ke0FSQ0h9OwotI2lmZGVmIERMTF9TVVBQT1JUCi0gIGNvbmZpZy5oYXNfc2hhcmVkID0gMTsKLSNlbmRpZgotfQotDAotLyogUEUgZm9ybWF0IGV4dHJhIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgKi8KLQotLyogVXNlZCBmb3Igc2V0dGluZyBmbGFncyBpbiB0aGUgUEUgaGVhZGVyLiAqLwotI2RlZmluZSBPUFRJT05fQkFTRV9GSUxFCQkoMzAwICArIDEpCi0jZGVmaW5lIE9QVElPTl9ETEwJCQkoT1BUSU9OX0JBU0VfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9GSUxFX0FMSUdOTUVOVAkJKE9QVElPTl9ETEwgKyAxKQotI2RlZmluZSBPUFRJT05fSU1BR0VfQkFTRQkJKE9QVElPTl9GSUxFX0FMSUdOTUVOVCArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OCShPUFRJT05fSU1BR0VfQkFTRSArIDEpCi0jZGVmaW5lIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OCQkoT1BUSU9OX01BSk9SX0lNQUdFX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT04JKE9QVElPTl9NQUpPUl9PU19WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT04JKE9QVElPTl9NQUpPUl9TVUJTWVNURU1fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9NSU5PUl9PU19WRVJTSU9OCQkoT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT04JKE9QVElPTl9NSU5PUl9PU19WRVJTSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UCShPUFRJT05fTUlOT1JfU1VCU1lTVEVNX1ZFUlNJT04gKyAxKQotI2RlZmluZSBPUFRJT05fU1RBQ0sgICAgICAgICAgICAgICAgICAgIChPUFRJT05fU0VDVElPTl9BTElHTk1FTlQgKyAxKQotI2RlZmluZSBPUFRJT05fU1VCU1lTVEVNICAgICAgICAgICAgICAgIChPUFRJT05fU1RBQ0sgKyAxKQotI2RlZmluZSBPUFRJT05fSEVBUAkJCShPUFRJT05fU1VCU1lTVEVNICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NVUFBPUlRfT0xEX0NPREUJCShPUFRJT05fSEVBUCArIDEpCi0jZGVmaW5lIE9QVElPTl9PVVRfREVGCQkJKE9QVElPTl9TVVBQT1JUX09MRF9DT0RFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYUE9SVF9BTEwJCShPUFRJT05fT1VUX0RFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9FWENMVURFX1NZTUJPTFMJCShPUFRJT05fRVhQT1JUX0FMTCArIDEpCi0jZGVmaW5lIE9QVElPTl9LSUxMX0FUUwkJCShPUFRJT05fRVhDTFVERV9TWU1CT0xTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NURENBTExfQUxJQVNFUwkJKE9QVElPTl9LSUxMX0FUUyArIDEpCi0jZGVmaW5lIE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUAkoT1BUSU9OX1NURENBTExfQUxJQVNFUyArIDEpCi0jZGVmaW5lIE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVAJKE9QVElPTl9FTkFCTEVfU1REQ0FMTF9GSVhVUCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTVBMSUJfRklMRU5BTUUJCShPUFRJT05fRElTQUJMRV9TVERDQUxMX0ZJWFVQICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RIVU1CX0VOVFJZCQkoT1BUSU9OX0lNUExJQl9GSUxFTkFNRSArIDEpCi0KLXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPQotewotICAvKiBQRSBvcHRpb25zICovCi0gIHsiYmFzZS1maWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9CQVNFX0ZJTEV9LAotICB7ImRsbCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRExMfSwKLSAgeyJmaWxlLWFsaWdubWVudCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRklMRV9BTElHTk1FTlR9LAotICB7ImhlYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0hFQVB9LCAKLSAgeyJpbWFnZS1iYXNlIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTUFHRV9CQVNFfSwKLSAgeyJtYWpvci1pbWFnZS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OfSwKLSAgeyJtYWpvci1vcy12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OfSwKLSAgeyJtYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT059LAotICB7Im1pbm9yLWltYWdlLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT059LAotICB7Im1pbm9yLW9zLXZlcnNpb24iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01JTk9SX09TX1ZFUlNJT059LAotICB7Im1pbm9yLXN1YnN5c3RlbS12ZXJzaW9uIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NSU5PUl9TVUJTWVNURU1fVkVSU0lPTn0sCi0gIHsic2VjdGlvbi1hbGlnbm1lbnQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UfSwKLSAgeyJzdGFjayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1RBQ0t9LAotICB7InN1YnN5c3RlbSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1VCU1lTVEVNfSwKLSAgeyJzdXBwb3J0LW9sZC1jb2RlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TVVBQT1JUX09MRF9DT0RFfSwKLSAgeyJ0aHVtYi1lbnRyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVEhVTUJfRU5UUll9LAotI2lmZGVmIERMTF9TVVBQT1JUCi0gIC8qIGdldG9wdCBhbGxvd3MgYWJicmV2aWF0aW9ucywgc28gd2UgZG8gdGhpcyB0byBzdG9wIGl0IGZyb20gdHJlYXRpbmcgLW8KLSAgICAgYXMgYW4gYWJicmV2aWF0aW9uIGZvciB0aGlzIG9wdGlvbiAqLwotICB7Im91dHB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09VVF9ERUZ9LAotICB7Im91dHB1dC1kZWYiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09VVF9ERUZ9LAotICB7ImV4cG9ydC1hbGwtc3ltYm9scyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0FMTH0sCi0gIHsiZXhjbHVkZS1zeW1ib2xzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FWENMVURFX1NZTUJPTFN9LAotICB7ImtpbGwtYXQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0tJTExfQVRTfSwKLSAgeyJhZGQtc3RkY2FsbC1hbGlhcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1REQ0FMTF9BTElBU0VTfSwKLSAgeyJlbmFibGUtc3RkY2FsbC1maXh1cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU5BQkxFX1NURENBTExfRklYVVB9LAotICB7ImRpc2FibGUtc3RkY2FsbC1maXh1cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRElTQUJMRV9TVERDQUxMX0ZJWFVQfSwKLSAgeyJvdXQtaW1wbGliIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBMSUJfRklMRU5BTUV9LAotI2VuZGlmCi0gIHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgMH0KLX07Ci0KLQotLyogUEUvV0lOMzI7IGFkZGVkIHJvdXRpbmVzIHRvIGdldCB0aGUgc3Vic3lzdGVtIHR5cGUsIGhlYXAgYW5kL29yIHN0YWNrCi0gICBwYXJhbWV0ZXJzIHdoaWNoIG1heSBiZSBpbnB1dCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgdm9pZCAqcHRyOwotICBpbnQgc2l6ZTsKLSAgaW50IHZhbHVlOwotICBjaGFyICpzeW1ib2w7Ci0gIGludCBpbml0ZWQ7Ci19IGRlZmluZm87Ci0KLSNkZWZpbmUgRChmaWVsZCxzeW1ib2wsZGVmKSAgeyZwZS5maWVsZCxzaXplb2YocGUuZmllbGQpLCBkZWYsIHN5bWJvbCwwfQotCi1zdGF0aWMgZGVmaW5mbyBpbml0W10gPQotewotICAvKiBpbWFnZWJhc2UgbXVzdCBiZSBmaXJzdCAqLwotI2RlZmluZSBJTUFHRUJBU0VPRkYgMAotICBEKEltYWdlQmFzZSwiX19pbWFnZV9iYXNlX18iLCBOVF9FWEVfSU1BR0VfQkFTRSksCi0jZGVmaW5lIERMTE9GRiAxCi0gIHsmZGxsLCBzaXplb2YoZGxsKSwgMCwgIl9fZGxsX18ifSwKLSAgRChTZWN0aW9uQWxpZ25tZW50LCJfX3NlY3Rpb25fYWxpZ25tZW50X18iLCBQRV9ERUZfU0VDVElPTl9BTElHTk1FTlQpLAotICBEKEZpbGVBbGlnbm1lbnQsIl9fZmlsZV9hbGlnbm1lbnRfXyIsIFBFX0RFRl9GSUxFX0FMSUdOTUVOVCksCi0gIEQoTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uLCJfX21ham9yX29zX3ZlcnNpb25fXyIsIDQpLAotICBEKE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbiwiX19taW5vcl9vc192ZXJzaW9uX18iLCAwKSwKLSAgRChNYWpvckltYWdlVmVyc2lvbiwiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iLCAxKSwKLSAgRChNaW5vckltYWdlVmVyc2lvbiwiX19taW5vcl9pbWFnZV92ZXJzaW9uX18iLCAwKSwKLSAgRChNYWpvclN1YnN5c3RlbVZlcnNpb24sIl9fbWFqb3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsIDQpLAotICBEKE1pbm9yU3Vic3lzdGVtVmVyc2lvbiwiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwgMCksCi0gIEQoU3Vic3lzdGVtLCJfX3N1YnN5c3RlbV9fIiwgUEVfREVGX1NVQlNZU1RFTSksCi0gIEQoU2l6ZU9mU3RhY2tSZXNlcnZlLCJfX3NpemVfb2Zfc3RhY2tfcmVzZXJ2ZV9fIiwgMHgyMDAwMDAwKSwKLSAgRChTaXplT2ZTdGFja0NvbW1pdCwiX19zaXplX29mX3N0YWNrX2NvbW1pdF9fIiwgMHgxMDAwKSwKLSAgRChTaXplT2ZIZWFwUmVzZXJ2ZSwiX19zaXplX29mX2hlYXBfcmVzZXJ2ZV9fIiwgMHgxMDAwMDApLAotICBEKFNpemVPZkhlYXBDb21taXQsIl9fc2l6ZV9vZl9oZWFwX2NvbW1pdF9fIiwgMHgxMDAwKSwKLSAgRChMb2FkZXJGbGFncywiX19sb2FkZXJfZmxhZ3NfXyIsIDB4MCksCi0gIHsgTlVMTCwgMCwgMCwgTlVMTCwgMCB9Ci19OwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucyAoZmlsZSkKLSAgICAgRklMRSAqIGZpbGU7Ci17Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1iYXNlX2ZpbGUgPGJhc2VmaWxlPiAgICAgICAgICAgICBHZW5lcmF0ZSBhIGJhc2UgZmlsZSBmb3IgcmVsb2NhdGFibGUgRExMc1xuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tZGxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IGltYWdlIGJhc2UgdG8gdGhlIGRlZmF1bHQgZm9yIERMTHNcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWZpbGUtYWxpZ25tZW50IDxzaXplPiAgICAgICAgICAgIFNldCBmaWxlIGFsaWdubWVudFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0taGVhcCA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICAgU2V0IGluaXRpYWwgc2l6ZSBvZiB0aGUgaGVhcFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0taW1hZ2UtYmFzZSA8YWRkcmVzcz4gICAgICAgICAgICAgU2V0IHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIGV4ZWN1dGFibGVcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1ham9yLWltYWdlLXZlcnNpb24gPG51bWJlcj4gICAgIFNldCB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWFqb3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgdmVyc2lvblxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tbWFqb3Itc3Vic3lzdGVtLXZlcnNpb24gPG51bWJlcj4gU2V0IG1pbmltdW0gcmVxdWlyZWQgT1Mgc3Vic3lzdGVtIHZlcnNpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1pbm9yLWltYWdlLXZlcnNpb24gPG51bWJlcj4gICAgIFNldCByZXZpc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGVcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLW1pbm9yLW9zLXZlcnNpb24gPG51bWJlcj4gICAgICAgIFNldCBtaW5pbXVtIHJlcXVpcmVkIE9TIHJldmlzaW9uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gcmV2aXNpb25cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXNlY3Rpb24tYWxpZ25tZW50IDxzaXplPiAgICAgICAgIFNldCBzZWN0aW9uIGFsaWdubWVudFxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tc3RhY2sgPHNpemU+ICAgICAgICAgICAgICAgICAgICAgU2V0IHNpemUgb2YgdGhlIGluaXRpYWwgc3RhY2tcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXN1YnN5c3RlbSA8bmFtZT5bOjx2ZXJzaW9uPl0gICAgIFNldCByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gWyYgdmVyc2lvbl1cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXN1cHBvcnQtb2xkLWNvZGUgICAgICAgICAgICAgICAgIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkIGNvZGVcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLXRodW1iLWVudHJ5PTxzeW1ib2w+ICAgICAgICAgICAgIFNldCB0aGUgZW50cnkgcG9pbnQgdG8gYmUgVGh1bWIgPHN5bWJvbD5cbiIpKTsKLSNpZmRlZiBETExfU1VQUE9SVAotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tYWRkLXN0ZGNhbGwtYWxpYXMgICAgICAgICAgICAgICAgRXhwb3J0IHN5bWJvbHMgd2l0aCBhbmQgd2l0aG91dCBAbm5cbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCAgICAgICAgICAgIERvbid0IGxpbmsgX3N5bSB0byBfc3ltQG5uXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1lbmFibGUtc3RkY2FsbC1maXh1cCAgICAgICAgICAgICBMaW5rIF9zeW0gdG8gX3N5bUBubiB3aXRob3V0IHdhcm5pbmdzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1leGNsdWRlLXN5bWJvbHMgc3ltLHN5bSwuLi4gICAgICBFeGNsdWRlIHN5bWJvbHMgZnJvbSBhdXRvbWF0aWMgZXhwb3J0XG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1leHBvcnQtYWxsLXN5bWJvbHMgICAgICAgICAgICAgICBBdXRvbWF0aWNhbGx5IGV4cG9ydCBhbGwgZ2xvYmFscyB0byBETExcbiIpKTsKLSAgZnByaW50ZiAoZmlsZSwgXygiICAtLWtpbGwtYXQgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBAbm4gZnJvbSBleHBvcnRlZCBzeW1ib2xzXG4iKSk7Ci0gIGZwcmludGYgKGZpbGUsIF8oIiAgLS1vdXQtaW1wbGliIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBpbXBvcnQgbGlicmFyeVxuIikpOwotICBmcHJpbnRmIChmaWxlLCBfKCIgIC0tb3V0cHV0LWRlZiA8ZmlsZT4gICAgICAgICAgICAgICAgR2VuZXJhdGUgYSAuREVGIGZpbGUgZm9yIHRoZSBidWlsdCBETExcbiIpKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZAotc2V0X3BlX25hbWUgKG5hbWUsIHZhbCkKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbG9uZyB2YWw7Ci17Ci0gIGludCBpOwotICAvKiBGaW5kIHRoZSBuYW1lIGFuZCBzZXQgaXQuICovCi0gIGZvciAoaSA9IDA7IGluaXRbaV0ucHRyOyBpKyspCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgaW5pdFtpXS5zeW1ib2wpID09IDApCi0JewotCSAgaW5pdFtpXS52YWx1ZSA9IHZhbDsKLQkgIGluaXRbaV0uaW5pdGVkID0gMTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotICBhYm9ydCgpOwotfQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfc3Vic3lzdGVtICgpCi17Ci0gIGNvbnN0IGNoYXIgKnN2ZXI7Ci0gIGludCBsZW47Ci0gIGludCBpOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IAotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICBjb25zdCBpbnQgdmFsdWU7Ci0gICAgICBjb25zdCBjaGFyICplbnRyeTsKLSAgICB9Ci0gIHZbXSA9Ci0gICAgewotICAgICAgeyAibmF0aXZlIiwgMSwgIl9OdFByb2Nlc3NTdGFydHVwIiB9LAotICAgICAgeyAid2luZG93cyIsIDIsICJfV2luTWFpbkNSVFN0YXJ0dXAiIH0sCi0gICAgICB7ICJjb25zb2xlIiwgMywgIl9tYWluQ1JUU3RhcnR1cCIgfSwKLSNpZiAwCi0gICAgICAvKiBUaGUgTWljcm9zb2Z0IGxpbmtlciBkb2VzIG5vdCByZWNvZ25pemUgdGhpcy4gICovCi0gICAgICB7ICJvczIiLCA1LCAiIiB9LAotI2VuZGlmCi0gICAgICB7ICJwb3NpeCIsIDcsICJfX19Qb3NpeFByb2Nlc3NTdGFydHVwIn0sCi0gICAgICB7IDAsIDAsIDAgfQotICAgIH07Ci0KLSAgc3ZlciA9IHN0cmNociAob3B0YXJnLCAnOicpOwotICBpZiAoc3ZlciA9PSBOVUxMKQotICAgIGxlbiA9IHN0cmxlbiAob3B0YXJnKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGNoYXIgKmVuZDsKLQotICAgICAgbGVuID0gc3ZlciAtIG9wdGFyZzsKLSAgICAgIHNldF9wZV9uYW1lICgiX19tYWpvcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIiwKLQkJICAgc3RydG91bCAoc3ZlciArIDEsICZlbmQsIDApKTsKLSAgICAgIGlmICgqZW5kID09ICcuJykKLQlzZXRfcGVfbmFtZSAoIl9fbWlub3Jfc3Vic3lzdGVtX3ZlcnNpb25fXyIsCi0JCSAgICAgc3RydG91bCAoZW5kICsgMSwgJmVuZCwgMCkpOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGJhZCB2ZXJzaW9uIG51bWJlciBpbiAtc3Vic3lzdGVtIG9wdGlvblxuIikpOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyB2W2ldLm5hbWU7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAob3B0YXJnLCB2W2ldLm5hbWUsIGxlbikgPT0gMAotCSAgJiYgdltpXS5uYW1lW2xlbl0gPT0gJ1wwJykKLQl7Ci0JICBzZXRfcGVfbmFtZSAoIl9fc3Vic3lzdGVtX18iLCB2W2ldLnZhbHVlKTsKLQotCSAgbGFuZ19hZGRfZW50cnkgKHZbaV0uZW50cnksIDEpOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLSAgCi0gIGVpbmZvIChfKCIlUCVGOiBpbnZhbGlkIHN1YnN5c3RlbSB0eXBlICVzXG4iKSwgb3B0YXJnKTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkCi1zZXRfcGVfdmFsdWUgKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIAotewotICBjaGFyICplbmQ7Ci0gIAotICBzZXRfcGVfbmFtZSAobmFtZSwgIHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCkpOwotICAKLSAgaWYgKGVuZCA9PSBvcHRhcmcpCi0gICAgZWluZm8gKF8oIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBmb3IgUEUgcGFyYW1ldGVyICclcydcbiIpLCBvcHRhcmcpOwotCi0gIG9wdGFyZyA9IGVuZDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9wZV9zdGFja19oZWFwIChyZXNuYW1lLCBjb21uYW1lKQotICAgICBjaGFyICpyZXNuYW1lOwotICAgICBjaGFyICpjb21uYW1lOwotewotICBzZXRfcGVfdmFsdWUgKHJlc25hbWUpOwotICAKLSAgaWYgKCpvcHRhcmcgPT0gJywnKQotICAgIHsKLSAgICAgIG9wdGFyZysrOwotICAgICAgc2V0X3BlX3ZhbHVlIChjb21uYW1lKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCpvcHRhcmcpCi0gICAgZWluZm8gKF8oIiVQJUY6IHN0cmFuZ2UgaGV4IGluZm8gZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iKSwgb3B0YXJnKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9wYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGxvbmdpbmQ7Ci0gIGludCBvcHRjOwotICBpbnQgcHJldm9wdGluZCA9IG9wdGluZDsKLSAgaW50IHByZXZvcHRlcnIgPSBvcHRlcnI7Ci0gIGludCB3YW50ZXJyb3I7Ci0gIHN0YXRpYyBpbnQgbGFzdG9wdGluZCA9IC0xOwotCi0gIGlmIChsYXN0b3B0aW5kICE9IG9wdGluZCkKLSAgICBvcHRlcnIgPSAwOwotICB3YW50ZXJyb3IgPSBvcHRlcnI7Ci0KLSAgbGFzdG9wdGluZCA9IG9wdGluZDsKLQotICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi0iLCBsb25nb3B0cywgJmxvbmdpbmQpOwotICBvcHRlcnIgPSBwcmV2b3B0ZXJyOwotCi0gIHN3aXRjaCAob3B0YykKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmICh3YW50ZXJyb3IpCi0JeGV4aXQgKDEpOwotICAgICAgb3B0aW5kID0gIHByZXZvcHRpbmQ7Ci0gICAgICByZXR1cm4gMDsKLQotICAgIGNhc2UgT1BUSU9OX0JBU0VfRklMRToKLSAgICAgIGxpbmtfaW5mby5iYXNlX2ZpbGUgPSAoUFRSKSBmb3BlbiAob3B0YXJnLCBGT1BFTl9XQik7Ci0gICAgICBpZiAobGlua19pbmZvLmJhc2VfZmlsZSA9PSBOVUxMKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBDYW4ndCBvcGVuIGJhc2UgZmlsZSAlc1xuIiksCi0JCSAgIHByb2dyYW1fbmFtZSwgb3B0YXJnKTsKLQkgIHhleGl0ICgxKTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAgLyogUEUgb3B0aW9ucyAqLwotICAgIGNhc2UgT1BUSU9OX0hFQVA6IAotICAgICAgc2V0X3BlX3N0YWNrX2hlYXAgKCJfX3NpemVfb2ZfaGVhcF9yZXNlcnZlX18iLCAiX19zaXplX29mX2hlYXBfY29tbWl0X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NUQUNLOiAKLSAgICAgIHNldF9wZV9zdGFja19oZWFwICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIsICJfX3NpemVfb2Zfc3RhY2tfY29tbWl0X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NVQlNZU1RFTToKLSAgICAgIHNldF9wZV9zdWJzeXN0ZW0gKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9PU19WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9vc192ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX09TX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX29zX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fTUFKT1JfU1VCU1lTVEVNX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21ham9yX3N1YnN5c3RlbV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX1NVQlNZU1RFTV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19taW5vcl9zdWJzeXN0ZW1fdmVyc2lvbl9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9NQUpPUl9JTUFHRV9WRVJTSU9OOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19tYWpvcl9pbWFnZV92ZXJzaW9uX18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX01JTk9SX0lNQUdFX1ZFUlNJT046Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX21pbm9yX2ltYWdlX3ZlcnNpb25fXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRklMRV9BTElHTk1FTlQ6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX2ZpbGVfYWxpZ25tZW50X18iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NFQ1RJT05fQUxJR05NRU5UOgotICAgICAgc2V0X3BlX3ZhbHVlICgiX19zZWN0aW9uX2FsaWdubWVudF9fIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9ETEw6Ci0gICAgICBzZXRfcGVfbmFtZSAoIl9fZGxsX18iLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0lNQUdFX0JBU0U6Ci0gICAgICBzZXRfcGVfdmFsdWUgKCJfX2ltYWdlX2Jhc2VfXyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fU1VQUE9SVF9PTERfQ09ERToKLSAgICAgIHN1cHBvcnRfb2xkX2NvZGUgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fVEhVTUJfRU5UUlk6Ci0gICAgICB0aHVtYl9lbnRyeV9zeW1ib2wgPSBvcHRhcmc7Ci0gICAgICBicmVhazsKLSNpZmRlZiBETExfU1VQUE9SVAotICAgIGNhc2UgT1BUSU9OX09VVF9ERUY6Ci0gICAgICBwZV9vdXRfZGVmX2ZpbGVuYW1lID0geHN0cmR1cCAob3B0YXJnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0VYUE9SVF9BTEw6Ci0gICAgICBwZV9kbGxfZXhwb3J0X2V2ZXJ5dGhpbmcgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRVhDTFVERV9TWU1CT0xTOgotICAgICAgcGVfZGxsX2FkZF9leGNsdWRlcyAob3B0YXJnKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX0tJTExfQVRTOgotICAgICAgcGVfZGxsX2tpbGxfYXRzID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BUSU9OX1NURENBTExfQUxJQVNFUzoKLSAgICAgIHBlX2RsbF9zdGRjYWxsX2FsaWFzZXMgPSAxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPUFRJT05fRU5BQkxFX1NURENBTExfRklYVVA6Ci0gICAgICBwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9ESVNBQkxFX1NURENBTExfRklYVVA6Ci0gICAgICBwZV9lbmFibGVfc3RkY2FsbF9maXh1cCA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QVElPTl9JTVBMSUJfRklMRU5BTUU6Ci0gICAgICBwZV9pbXBsaWJfZmlsZW5hbWUgPSB4c3RyZHVwIChvcHRhcmcpOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICB9Ci0gIHJldHVybiAxOwotfQotDAotLyogQXNzaWduIHZhbHVlcyB0byB0aGUgc3BlY2lhbCBzeW1ib2xzIGJlZm9yZSB0aGUgbGlua2VyIHNjcmlwdCBpcwotICAgcmVhZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgKCkKLXsKLSAgLyogUnVuIHRocm91Z2ggYW5kIGludmVudCBzeW1ib2xzIGZvciBhbGwgdGhlCi0gICAgIG5hbWVzIGFuZCBpbnNlcnQgdGhlIGRlZmF1bHRzLiAqLwotICBpbnQgajsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpzYXZlOwotCi0gIGlmICghaW5pdFtJTUFHRUJBU0VPRkZdLmluaXRlZCkKLSAgICB7Ci0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlpbml0W0lNQUdFQkFTRU9GRl0udmFsdWUgPSAwOwotICAgICAgZWxzZSBpZiAoaW5pdFtETExPRkZdLnZhbHVlIHx8IGxpbmtfaW5mby5zaGFyZWQpCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gTlRfRExMX0lNQUdFX0JBU0U7Ci0gICAgICBlbHNlCi0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gTlRfRVhFX0lNQUdFX0JBU0U7Ci0gICAgfQotCi0gIC8qIERvbid0IGRvIGFueSBzeW1ib2wgYXNzaWdubWVudHMgaWYgdGhpcyBpcyBhIHJlbG9jYXRlYWJsZSBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIC8qIEdsdWUgdGhlIGFzc2lnbm1lbnRzIGludG8gdGhlIGFicyBzZWN0aW9uICovCi0gIHNhdmUgPSBzdGF0X3B0cjsKLQotICBzdGF0X3B0ciA9ICYoYWJzX291dHB1dF9zZWN0aW9uLT5jaGlsZHJlbik7Ci0KLSAgZm9yIChqID0gMDsgaW5pdFtqXS5wdHI7IGorKykKLSAgICB7Ci0gICAgICBsb25nIHZhbCA9IGluaXRbal0udmFsdWU7Ci0gICAgICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKnJ2OwotICAgICAgcnYgPSBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JyAsaW5pdFtqXS5zeW1ib2wsIGV4cF9pbnRvcCAodmFsKSkpOwotICAgICAgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2Yoc2hvcnQpKQotCSooc2hvcnQgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoaW50KSkKLQkqKGludCAqKWluaXRbal0ucHRyID0gdmFsOwotICAgICAgZWxzZSBpZiAoaW5pdFtqXS5zaXplID09IHNpemVvZihsb25nKSkKLQkqKGxvbmcgKilpbml0W2pdLnB0ciA9IHZhbDsKLSAgICAgIC8qIFRoaXMgbWlnaHQgYmUgYSBsb25nIGxvbmcgb3Igb3RoZXIgc3BlY2lhbCB0eXBlLiAgKi8KLSAgICAgIGVsc2UgaWYgKGluaXRbal0uc2l6ZSA9PSBzaXplb2YoYmZkX3ZtYSkpCi0JKihiZmRfdm1hICopaW5pdFtqXS5wdHIgPSB2YWw7Ci0gICAgICBlbHNlCWFib3J0KCk7Ci0gICAgICBpZiAoaiA9PSBJTUFHRUJBU0VPRkYpCi0JaW1hZ2VfYmFzZV9zdGF0ZW1lbnQgPSBydjsKLSAgICB9Ci0gIC8qIFJlc3RvcmUgdGhlIHBvaW50ZXIuICovCi0gIHN0YXRfcHRyID0gc2F2ZTsKLSAgCi0gIGlmIChwZS5GaWxlQWxpZ25tZW50ID4KLSAgICAgIHBlLlNlY3Rpb25BbGlnbm1lbnQpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nLCBmaWxlIGFsaWdubWVudCA+IHNlY3Rpb24gYWxpZ25tZW50LlxuIikpOwotICAgIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGxpbmtlciBzY3JpcHQgYW5kIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucwotICAgaGF2ZSBiZWVuIHJlYWQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX3BhcnNlICgpCi17Ci0gIC8qIFRoZSBXaW5kb3dzIGxpYnJhcmllcyBhcmUgZGVzaWduZWQgZm9yIHRoZSBsaW5rZXIgdG8gdHJlYXQgdGhlCi0gICAgIGVudHJ5IHBvaW50IGFzIGFuIHVuZGVmaW5lZCBzeW1ib2wuICBPdGhlcndpc2UsIHRoZSAub2JqIHRoYXQKLSAgICAgZGVmaW5lcyBtYWluQ1JUU3RhcnR1cCBpcyBicm91Z2h0IGluIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0Ci0gICAgIGVuY291bnRlcmVkIGluIGxpYmMubGliIGFuZCBpdCBoYXMgb3RoZXIgc3ltYm9scyBpbiBpdCB3aGljaCB3aWxsCi0gICAgIGJlIHB1bGxlZCBpbiBieSB0aGUgbGluayBwcm9jZXNzLiAgVG8gYXZvaWQgdGhpcywgd2UgYWN0IGFzCi0gICAgIHRob3VnaCB0aGUgdXNlciBzcGVjaWZpZWQgLXUgd2l0aCB0aGUgZW50cnkgcG9pbnQgc3ltYm9sLgotCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBsaW5rZXIgc2NyaXB0IGFuZCBjb21tYW5kIGxpbmUKLSAgICAgb3B0aW9ucyBoYXZlIGJlZW4gcmVhZCwgc28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByaWdodCBlbnRyeQotICAgICBwb2ludC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgaW5wdXQgZmlsZXMgYXJlCi0gICAgIG9wZW5lZCwgc28gcmVnaXN0ZXJpbmcgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQgd2lsbCBtYWtlIGEKLSAgICAgZGlmZmVyZW5jZS4gICovCi0KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiBlbnRyeV9zeW1ib2wgIT0gTlVMTCkKLSAgICBsZGxhbmdfYWRkX3VuZGVmIChlbnRyeV9zeW1ib2wpOwotfQotCi1zdGF0aWMgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnBlX3VuZGVmX2ZvdW5kX3N5bTsKLQotc3RhdGljIGJvb2xlYW4KLXBlX3VuZGVmX2NkZWNsX21hdGNoIChoLCBzdHJpbmcpCi0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBQVFIgc3RyaW5nOwotewotICBpbnQgc2wgPSBzdHJsZW4gKHN0cmluZyk7Ci0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgJiYgc3RybmNtcCAoaC0+cm9vdC5zdHJpbmcsIHN0cmluZywgc2wpID09IDAKLSAgICAgICYmIGgtPnJvb3Quc3RyaW5nW3NsXSA9PSAnQCcpCi0gIHsKLSAgICBwZV91bmRlZl9mb3VuZF9zeW0gPSBoOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQKLXBlX2ZpeHVwX3N0ZGNhbGxzICgpCi17Ci0gIHN0YXRpYyBpbnQgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAwOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqdW5kZWYsICpzeW07Ci0gIGNoYXIgKmF0OwotICBmb3IgKHVuZGVmID0gbGlua19pbmZvLmhhc2gtPnVuZGVmczsgdW5kZWY7IHVuZGVmPXVuZGVmLT5uZXh0KQotICAgIGlmICh1bmRlZi0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLSAgICB7Ci0gICAgICBhdCA9IHN0cmNociAodW5kZWYtPnJvb3Quc3RyaW5nLCAnQCcpOwotICAgICAgaWYgKGF0KQotICAgICAgewotCS8qIFRoZSBzeW1ib2wgaXMgYSBzdGRjYWxsIHN5bWJvbCwgc28gbGV0J3MgbG9vayBmb3IgYSBjZGVjbAotCSAgIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHJlc29sdmUgdG8gdGhhdCAqLwotCWNoYXIgKmNuYW1lID0geHN0cmR1cCAodW5kZWYtPnJvb3Quc3RyaW5nKTsKLQlhdCA9IHN0cmNociAoY25hbWUsICdAJyk7Ci0JKmF0ID0gMDsKLQlzeW0gPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGNuYW1lLCAwLCAwLCAxKTsKLQlpZiAoc3ltICYmIHN5bS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpCi0JewotCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOwotCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAotCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgY25hbWUpOwotCSAgICAgIGlmICghIGdhdmVfd2FybmluZ19tZXNzYWdlKQotCQl7Ci0JCSAgZ2F2ZV93YXJuaW5nX21lc3NhZ2UgPSAxOwotCQkgIGVpbmZvKF8oIlVzZSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwIHRvIGRpc2FibGUgdGhlc2Ugd2FybmluZ3NcbiIpKTsKLQkJICBlaW5mbyhfKCJVc2UgLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSBmaXh1cHNcbiIpKTsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotCS8qIFRoZSBzeW1ib2wgaXMgYSBjZGVjbCBzeW1ib2wsIHNvIHdlIGxvb2sgZm9yIHN0ZGNhbGwKLQkgICBzeW1ib2xzIC0gd2hpY2ggbWVhbnMgc2Nhbm5pbmcgdGhlIHdob2xlIHN5bWJvbCB0YWJsZSAqLwotCXBlX3VuZGVmX2ZvdW5kX3N5bSA9IDA7Ci0JYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIHBlX3VuZGVmX2NkZWNsX21hdGNoLAotCQkJCShQVFIpIHVuZGVmLT5yb290LnN0cmluZyk7Ci0Jc3ltID0gcGVfdW5kZWZfZm91bmRfc3ltOwotCWlmIChzeW0pCi0JewotCSAgdW5kZWYtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JICB1bmRlZi0+dS5kZWYudmFsdWUgPSBzeW0tPnUuZGVmLnZhbHVlOwotCSAgdW5kZWYtPnUuZGVmLnNlY3Rpb24gPSBzeW0tPnUuZGVmLnNlY3Rpb247Ci0JICBpZiAocGVfZW5hYmxlX3N0ZGNhbGxfZml4dXAgPT0gLTEpCi0JICAgIHsKLQkgICAgICBlaW5mbyAoXygiV2FybmluZzogcmVzb2x2aW5nICVzIGJ5IGxpbmtpbmcgdG8gJXNcbiIpLAotCQkgICAgIHVuZGVmLT5yb290LnN0cmluZywgc3ltLT5yb290LnN0cmluZyk7Ci0JICAgICAgaWYgKCEgZ2F2ZV93YXJuaW5nX21lc3NhZ2UpCi0JCXsKLQkJICBnYXZlX3dhcm5pbmdfbWVzc2FnZSA9IDE7Ci0JCSAgZWluZm8oXygiVXNlIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSB3YXJuaW5nc1xuIikpOwotCQkgIGVpbmZvKF8oIlVzZSAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIGZpeHVwc1xuIikpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgLyogUGFzcyB0aGUgd2Fja3kgUEUgY29tbWFuZCBsaW5lIG9wdGlvbnMgaW50byB0aGUgb3V0cHV0IGJmZC4KLSAgICAgRklYTUU6IFRoaXMgc2hvdWxkIGJlIGRvbmUgdmlhIGEgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGJ5Ci0gICAgIGluY2x1ZGluZyBhbiBpbnRlcm5hbCBCRkQgaGVhZGVyLiAgKi8KLSAgCi0gIGlmICghY29mZl9kYXRhIChvdXRwdXRfYmZkKS0+cGUpCi0gICAgZWluZm8gKF8oIiVGJVA6IFBFIG9wZXJhdGlvbnMgb24gbm9uIFBFIGZpbGUuXG4iKSk7Ci0KLSAgcGVfZGF0YSAob3V0cHV0X2JmZCktPnBlX29wdGhkciA9IHBlOwotICBwZV9kYXRhIChvdXRwdXRfYmZkKS0+ZGxsID0gaW5pdFtETExPRkZdLnZhbHVlOwotCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgaWYgKHBlX2VuYWJsZV9zdGRjYWxsX2ZpeHVwKSAvKiAtMT13YXJuIG9yIDE9ZGlzYWJsZSAqLwotICAgIHBlX2ZpeHVwX3N0ZGNhbGxzICgpOwotCi0gIHBlX3Byb2Nlc3NfaW1wb3J0X2RlZnMob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHBlX2RsbF9idWlsZF9zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoVEFSR0VUX0lTX2FybXBlKSB8fCBkZWZpbmVkKFRBUkdFVF9JU19hcm1fZXBvY19wZSkKLSAgewotICAgIC8qIEZpbmQgYSBCRkQgdGhhdCBjYW4gaG9sZCB0aGUgaW50ZXJ3b3JraW5nIHN0dWJzLiAgKi8KLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKGJmZF9hcm1fcGVfZ2V0X2JmZF9mb3JfaW50ZXJ3b3JraW5nIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8pKQotCSAgYnJlYWs7Ci0gICAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHsKLSAgICBzdGF0aWMgaW50IHNlcXVlbmNlID0gMDsKLSAgICBpbnQgaXNfbXNfYXJjaDsKLSAgICBiZmQgKmN1cl9hcmNoID0gMCwgKmVsdDsKLSAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppczI7Ci0gICAgLyogQ2FyZWZ1bCAtIHRoaXMgaXMgYSBzaGVsbCBzY3JpcHQuICBXYXRjaCB0aG9zZSBkb2xsYXIgc2lnbnMhICovCi0gICAgLyogTWljcm9zb2Z0IGltcG9ydCBsaWJyYXJpZXMgaGF2ZSBldmVyeSBtZW1iZXIgbmFtZWQgdGhlIHNhbWUsCi0gICAgICAgYW5kIG5vdCBpbiB0aGUgcmlnaHQgb3JkZXIgZm9yIHVzIHRvIGxpbmsgdGhlbSBjb3JyZWN0bHkuICBXZQotICAgICAgIG11c3QgZGV0ZWN0IHRoZXNlIGFuZCByZW5hbWUgdGhlIG1lbWJlcnMgc28gdGhhdCB0aGV5J2xsIGxpbmsKLSAgICAgICBjb3JyZWN0bHkuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygb2JqZWN0czogdGhlIGhlYWQsIHRoZQotICAgICAgIHRodW5rcywgYW5kIHRoZSBzZW50aW5lbChzKS4gIFRoZSBoZWFkIGlzIGVhc3k7IGl0J3MgdGhlIG9uZQotICAgICAgIHdpdGggaWRhdGEyLiAgV2UgYXNzdW1lIHRoYXQgdGhlIHNlbnRpbmVscyB3b24ndCBoYXZlIHJlbG9jcywKLSAgICAgICBhbmQgdGhlIHRodW5rcyB3aWxsLiAgSXQncyBlYXNpZXIgdGhhbiBjaGVja2luZyB0aGUgc3ltYm9sCi0gICAgICAgdGFibGUgZm9yIGV4dGVybmFsIHJlZmVyZW5jZXMuICovCi0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWlmIChpcy0+dGhlX2JmZC0+bXlfYXJjaGl2ZSkKLQkgIHsKLQkgICAgYmZkICphcmNoID0gaXMtPnRoZV9iZmQtPm15X2FyY2hpdmU7Ci0JICAgIGlmIChjdXJfYXJjaCAhPSBhcmNoKQotCSAgICAgIHsKLQkJY3VyX2FyY2ggPSBhcmNoOwotCQlpc19tc19hcmNoID0gMTsKLQkJZm9yIChpczIgPSBpczsKLQkJICAgICBpczIgJiYgaXMyLT50aGVfYmZkLT5teV9hcmNoaXZlID09IGFyY2g7Ci0JCSAgICAgaXMyID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKilpczItPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHN0cmNtcCAoaXMtPnRoZV9iZmQtPmZpbGVuYW1lLCBpczItPnRoZV9iZmQtPmZpbGVuYW1lKSkKLQkJICAgICAgaXNfbXNfYXJjaCA9IDA7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICBpZiAoaXNfbXNfYXJjaCkKLQkgICAgICB7Ci0JCWludCBpZGF0YTIgPSAwLCBpLCByZWxvY19jb3VudD0wOwotCQlhc2VjdGlvbiAqc2VjOwotCQljaGFyICpuZXdfbmFtZSwgc2VxOwotCQlmb3IgKHNlYyA9IGlzLT50aGVfYmZkLT5zZWN0aW9uczsgc2VjOyBzZWMgPSBzZWMtPm5leHQpCi0JCSAgewotCQkgICAgaWYgKHN0cmNtcCAoc2VjLT5uYW1lLCAiLmlkYXRhXCQyIikgPT0gMCkKLQkJICAgICAgaWRhdGEyID0gMTsKLQkJICAgIHJlbG9jX2NvdW50ICs9IHNlYy0+cmVsb2NfY291bnQ7Ci0JCSAgfQotCi0JCWlmIChpZGF0YTIpIC8qIC5pZGF0YTIgaXMgdGhlIFRPQyAqLwotCQkgIHNlcSA9ICdhJzsKLQkJZWxzZSBpZiAocmVsb2NfY291bnQgPiAwKSAvKiB0aHVua3MgKi8KLQkJICBzZXEgPSAnYic7Ci0JCWVsc2UgLyogc2VudGluZWwgKi8KLQkJICBzZXEgPSAnYyc7Ci0KLQkJbmV3X25hbWUgPSBiZmRfYWxsb2MgKGlzLT50aGVfYmZkLAotCQkJCSAgICAgIHN0cmxlbiAoaXMtPnRoZV9iZmQtPmZpbGVuYW1lKSsyKTsKLQkJc3ByaW50ZiAobmV3X25hbWUsICIlcy4lYyIsIGlzLT50aGVfYmZkLT5maWxlbmFtZSwgc2VxKTsKLQkJaXMtPnRoZV9iZmQtPmZpbGVuYW1lID0gbmV3X25hbWU7Ci0KLQkJbmV3X25hbWUgPSBiZmRfYWxsb2MoaXMtPnRoZV9iZmQsIHN0cmxlbihpcy0+ZmlsZW5hbWUpKzIpOwotCQlzcHJpbnRmIChuZXdfbmFtZSwgIiVzLiVjIiwgaXMtPmZpbGVuYW1lLCBzZXEpOwotCQlpcy0+ZmlsZW5hbWUgPSBuZXdfbmFtZTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gIH0KLX0KLQwKLXN0YXRpYyB2b2lkICAKLWdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci0jaWZkZWYgVEFSR0VUX0lTX3BwY3BlCi0gIC8qIEhlcmUgd2UgcnVtbWFnZSB0aHJvdWdoIHRoZSBmb3VuZCBiZmRzIHRvIGNvbGxlY3QgdG9jIGluZm9ybWF0aW9uICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCFwcGNfcHJvY2Vzc19iZWZvcmVfYWxsb2NhdGlvbiAoaXMtPnRoZV9iZmQsICZsaW5rX2luZm8pKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIiksIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIHBwY19hbGxvY2F0ZV90b2Nfc2VjdGlvbiAoJmxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX3BwY3BlICovCi0KLSNpZiBkZWZpbmVkKFRBUkdFVF9JU19hcm1wZSkgfHwgZGVmaW5lZChUQVJHRVRfSVNfYXJtX2Vwb2NfcGUpCi0gIC8qIEZJWE1FOiB3ZSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGludGVyd29ya2luZyBzdHViCi0gICAgIHNlY3Rpb24uCi0KLSAgICAgSGVyZSB3ZSBydW1tYWdlIHRocm91Z2ggdGhlIGZvdW5kIGJmZHMgdG8gY29sbGVjdCBnbHVlCi0gICAgIGluZm9ybWF0aW9uLiAgRklYTUU6IHNob3VsZCB0aGlzIGJlIGJhc2VkIG9uIGEgY29tbWFuZCBsaW5lCi0gICAgIG9wdGlvbj8gIGtya0BjeWdudXMuY29tICovCi0gIHsKLSAgICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgICB7Ci0JaWYgKCEgYmZkX2FybV9wZV9wcm9jZXNzX2JlZm9yZV9hbGxvY2F0aW9uCi0JICAgIChpcy0+dGhlX2JmZCwgJiBsaW5rX2luZm8sIHN1cHBvcnRfb2xkX2NvZGUpKQotCSAgewotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICBlaW5mbyAoXygiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyBmb3IgaW50ZXJ3b3JraW5nIiksCi0JCSAgIGlzLT5maWxlbmFtZSk7Ci0JICB9Ci0gICAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNlZW4gaXQgYWxsLiBBbGxvY2F0ZSBpdCwgYW5kIGNhcnJ5IG9uICovCi0gIGJmZF9hcm1fcGVfYWxsb2NhdGVfaW50ZXJ3b3JraW5nX3NlY3Rpb25zICgmIGxpbmtfaW5mbyk7Ci0jZW5kaWYgLyogVEFSR0VUX0lTX2FybXBlICovCi19Ci0MCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5wdXQgZmlsZSBpc24ndCByZWNvZ25pemVkIGFzIGEgQkZELiAgV2UKLSAgIGNoZWNrIGhlcmUgZm9yIC5ERUYgZmlsZXMgYW5kIHB1bGwgdGhlbSBpbiBhdXRvbWF0aWNhbGx5LiAqLwotCi1zdGF0aWMgaW50Ci1zYXdfb3B0aW9uKGNoYXIgKm9wdGlvbikKLXsKLSAgaW50IGk7Ci0gIGZvciAoaT0wOyBpbml0W2ldLnB0cjsgaSsrKQotICAgIGlmIChzdHJjbXAgKGluaXRbaV0uc3ltYm9sLCBvcHRpb24pID09IDApCi0gICAgICByZXR1cm4gaW5pdFtpXS5pbml0ZWQ7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3VucmVjb2duaXplZF9maWxlKGVudHJ5KQotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSNpZmRlZiBETExfU1VQUE9SVAotICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotCi0gIGlmIChzdHJjbXAgKGV4dCwgIi5kZWYiKSA9PSAwIHx8IHN0cmNtcCAoZXh0LCAiLkRFRiIpID09IDApCi0gIHsKLSAgICBpZiAocGVfZGVmX2ZpbGUgPT0gMCkKLSAgICAgIHBlX2RlZl9maWxlID0gZGVmX2ZpbGVfZW1wdHkgKCk7Ci0gICAgZGVmX2ZpbGVfcGFyc2UgKGVudHJ5LT5maWxlbmFtZSwgcGVfZGVmX2ZpbGUpOwotICAgIGlmIChwZV9kZWZfZmlsZSkKLSAgICB7Ci0gICAgICBpbnQgaSwgYnVmbGVuPTAsIGxlbjsKLSAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIGxlbiA9IHN0cmxlbihwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgIGlmIChidWZsZW4gPCBsZW4rMikKLQkgICAgYnVmbGVuID0gbGVuKzI7Ci0JfQotICAgICAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmbGVuKTsKLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCXsKLQkgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCSAgc3ByaW50ZihidWYsICJfJXMiLCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQotCSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgYnVmLCB0cnVlLCB0cnVlLCB0cnVlKTsKLQkgIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0JICAgICAgaC0+dS51bmRlZi5hYmZkID0gTlVMTDsKLQkgICAgICBiZmRfbGlua19hZGRfdW5kZWYgKGxpbmtfaW5mby5oYXNoLCBoKTsKLQkgICAgfQotCX0KLSAgICAgIGZyZWUgKGJ1Zik7Ci0KLSAgICAgIC8qIGRlZl9maWxlX3ByaW50IChzdGRvdXQsIHBlX2RlZl9maWxlKTsgKi8KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+aXNfZGxsID09IDEpCi0JbGlua19pbmZvLnNoYXJlZCA9IDE7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+YmFzZV9hZGRyZXNzICE9IChiZmRfdm1hKSgtMSkpCi0gICAgICB7Ci0JcGUuSW1hZ2VCYXNlID0KLQlwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSA9Ci0JaW5pdFtJTUFHRUJBU0VPRkZdLnZhbHVlID0gcGVfZGVmX2ZpbGUtPmJhc2VfYWRkcmVzczsKLQlpbml0W0lNQUdFQkFTRU9GRl0uaW5pdGVkID0gMTsKLQlpZiAoaW1hZ2VfYmFzZV9zdGF0ZW1lbnQpCi0JICBpbWFnZV9iYXNlX3N0YXRlbWVudC0+ZXhwID0KLQkgICAgZXhwX2Fzc29wICgnPScsICJfX2ltYWdlX2Jhc2VfXyIsIGV4cF9pbnRvcCAocGUuSW1hZ2VCYXNlKSk7Ci0gICAgICB9Ci0KLSNpZiAwCi0gICAgICAvKiBOb3Qgc3VyZSBpZiB0aGVzZSAqc2hvdWxkKiBiZSBzZXQgKi8KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLSAgICAgIHsKLQlwZS5NYWpvckltYWdlVmVyc2lvbiA9IHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yOwotCXBlLk1pbm9ySW1hZ2VWZXJzaW9uID0gcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3I7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c3RhY2tfcmVzZXJ2ZSAhPSAtMQotCSAgJiYgISBzYXdfb3B0aW9uICgiX19zaXplX29mX3N0YWNrX3Jlc2VydmVfXyIpKQotICAgICAgewotCXBlLlNpemVPZlN0YWNrUmVzZXJ2ZSA9IHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlOwotCWlmIChwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0ICE9IC0xKQotCSAgcGUuU2l6ZU9mU3RhY2tDb21taXQgPSBwZV9kZWZfZmlsZS0+c3RhY2tfY29tbWl0OwotICAgICAgfQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUgIT0gLTEKLQkgICYmICEgc2F3X29wdGlvbiAoIl9fc2l6ZV9vZl9oZWFwX3Jlc2VydmVfXyIpKQotICAgICAgewotCXBlLlNpemVPZkhlYXBSZXNlcnZlID0gcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZTsKLQlpZiAocGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0ICE9IC0xKQotCSAgcGUuU2l6ZU9mSGVhcENvbW1pdCA9IHBlX2RlZl9maWxlLT5oZWFwX2NvbW1pdDsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotI2VuZGlmCi0gIHJldHVybiBmYWxzZTsKLSAgCi19Ci0KLXN0YXRpYyBib29sZWFuCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fcmVjb2duaXplZF9maWxlKGVudHJ5KQotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSNpZmRlZiBETExfU1VQUE9SVAotI2lmZGVmIFRBUkdFVF9JU19pMzg2cGUKLSAgcGVfZGxsX2lkX3RhcmdldCAoInBlaS1pMzg2Iik7Ci0jZW5kaWYKLSAgaWYgKGJmZF9nZXRfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCkgPT0gYmZkX29iamVjdCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpleHQgPSBlbnRyeS0+ZmlsZW5hbWUgKyBzdHJsZW4gKGVudHJ5LT5maWxlbmFtZSkgLSA0OwotICAgICAgaWYgKHN0cmNtcCAoZXh0LCAiLmRsbCIpID09IDAgfHwgc3RyY21wIChleHQsICIuRExMIikgPT0gMCkKLQlyZXR1cm4gcGVfaW1wbGllZF9pbXBvcnRfZGxsIChlbnRyeS0+ZmlsZW5hbWUpOwotICAgIH0KLSNlbmRpZgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGRfJHtFTVVMQVRJT05fTkFNRX1fZmluaXNoICgpCi17Ci0jaWYgZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKQotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqIGg7Ci0KLSAgaWYgKHRodW1iX2VudHJ5X3N5bWJvbCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHRodW1iX2VudHJ5X3N5bWJvbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIAotICAgICAgaWYgKGggIT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwKLQkgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCSAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLQl7Ci0JICBzdGF0aWMgY2hhciBidWZmZXJbMzJdOwotCSAgYmZkX3ZtYSB2YWw7Ci0JICAKLQkgIC8qIFNwZWNpYWwgcHJvY2VzaW5nIGlzIHJlcXVpcmVkIGZvciBhIFRodW1iIGVudHJ5IHN5bWJvbC4gIFRoZQotCSAgICAgYm90dG9tIGJpdCBvZiBpdHMgYWRkcmVzcyBtdXN0IGJlIHNldC4gICovCi0JICB2YWwgPSAoaC0+dS5kZWYudmFsdWUKLQkJICsgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwKLQkJCQkJaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24pCi0JCSArIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9vZmZzZXQpOwotCSAgCi0JICB2YWwgfD0gMTsKLQkgIAotCSAgLyogTm93IGNvbnZlcnQgdGhpcyB2YWx1ZSBpbnRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiBlbnRyeV9zeW1ib2wKLQkgICAgIHdoZXJlIHRoZSBsYW5nX2ZpbmlzaCgpIGZ1bmN0aW9uIHdpbGwgcGljayBpdCB1cC4gICovCi0JICBidWZmZXJbMF0gPSAnMCc7Ci0JICBidWZmZXJbMV0gPSAneCc7Ci0JICAKLQkgIHNwcmludGZfdm1hIChidWZmZXIgKyAyLCB2YWwpOwotCSAgCi0JICBpZiAoZW50cnlfc3ltYm9sICE9IE5VTEwgJiYgZW50cnlfZnJvbV9jbWRsaW5lKQotCSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICctLXRodW1iLWVudHJ5ICVzJyBpcyBvdmVycmlkaW5nICctZSAlcydcbiIpLAotCQkgICB0aHVtYl9lbnRyeV9zeW1ib2wsIGVudHJ5X3N5bWJvbCk7Ci0JICBlbnRyeV9zeW1ib2wgPSBidWZmZXI7Ci0JfQotICAgICAgZWxzZQotCWVpbmZvIChfKCIlUDogd2FybmluZzogY29ubm90IGZpbmQgdGh1bWIgc3RhcnQgc3ltYm9sICVzXG4iKSwgdGh1bWJfZW50cnlfc3ltYm9sKTsKLSAgICB9Ci0jZW5kaWYgLyogZGVmaW5lZChUQVJHRVRfSVNfYXJtcGUpIHx8IGRlZmluZWQoVEFSR0VUX0lTX2FybV9lcG9jX3BlKSAqLwotCi0jaWZkZWYgRExMX1NVUFBPUlQKLSAgaWYgKGxpbmtfaW5mby5zaGFyZWQpCi0gICAgewotICAgICAgcGVfZGxsX2ZpbGxfc2VjdGlvbnMgKG91dHB1dF9iZmQsICZsaW5rX2luZm8pOwotICAgICAgaWYgKHBlX2ltcGxpYl9maWxlbmFtZSkKLQlwZV9kbGxfZ2VuZXJhdGVfaW1wbGliIChwZV9kZWZfZmlsZSwgcGVfaW1wbGliX2ZpbGVuYW1lKTsKLSAgICB9Ci0gIGlmIChwZV9vdXRfZGVmX2ZpbGVuYW1lKQotICAgIHBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSAocGVfb3V0X2RlZl9maWxlbmFtZSk7Ci0jZW5kaWYKLX0KLQotDAotLyogUGxhY2UgYW4gb3JwaGFuIHNlY3Rpb24uCi0KLSAgIFdlIHVzZSB0aGlzIHRvIHB1dCBzZWN0aW9ucyBpbiBhIHJlYXNvbmFibGUgcGxhY2UgaW4gdGhlIGZpbGUsIGFuZAotICAgdG8gZW5zdXJlIHRoYXQgdGhleSBhcmUgYWxpZ25lZCBhcyByZXF1aXJlZC4KLQotICAgV2UgaGFuZGxlIGdyb3VwZWQgc2VjdGlvbnMgaGVyZSBhcyB3ZWxsLiAgQSBzZWN0aW9uIG5hbWVkIC5mb28kbm4KLSAgIGdvZXMgaW50byB0aGUgb3V0cHV0IHNlY3Rpb24gLmZvby4gIEFsbCBncm91cGVkIHNlY3Rpb25zIGFyZSBzb3J0ZWQKLSAgIGJ5IG5hbWUuCi0KLSAgIEdyb3VwZWQgc2VjdGlvbnMgZm9yIHRoZSBkZWZhdWx0IHNlY3Rpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZQotICAgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IHVzaW5nIHdpbGRjYXJkcywgYW5kIGFyZSBzb3J0ZWQgYnkKLSAgIHNvcnRfc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgYXNlY3Rpb24gKmhvbGRfc2VjdGlvbjsKLXN0YXRpYyBjaGFyICpob2xkX3NlY3Rpb25fbmFtZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3VzZTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3RleHQ7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9yZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2RhdGE7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF9ic3M7Ci0KLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHJhbmRvbSBTSEZfQUxMT0MKLSAgIHNlY3Rpb25zIGluIHRoZSByaWdodCBzZWdtZW50LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BsYWNlX29ycGhhbiAoZmlsZSwgcykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgYXNlY3Rpb24gKnM7Ci17Ci0gIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gIGNoYXIgKmRvbGxhcjsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLQotICBob2xkX3NlY3Rpb24gPSBzOwotCi0gIGhvbGRfc2VjdGlvbl9uYW1lID0geHN0cmR1cCAoc2VjbmFtZSk7Ci0gIGRvbGxhciA9IHN0cmNociAoaG9sZF9zZWN0aW9uX25hbWUsICckJyk7Ci0gIGlmIChkb2xsYXIgIT0gTlVMTCkKLSAgICAqZG9sbGFyID0gJ1wwJzsKLQotICBob2xkX3VzZSA9IE5VTEw7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChnbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgICAgIGNoYXIgKm91dHNlY25hbWU7Ci0gICAgICBhc2VjdGlvbiAqc25ldywgKipwcHM7Ci0gICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0gICAgICBldHJlZV90eXBlICphZGRyZXNzOwotCi0gICAgICAvKiBUcnkgdG8gcHV0IHRoZSBuZXcgb3V0cHV0IHNlY3Rpb24gaW4gYSByZWFzb25hYmxlIHBsYWNlIGJhc2VkCi0JIG9uIHRoZSBzZWN0aW9uIG5hbWUgYW5kIHNlY3Rpb24gZmxhZ3MuICAqLwotICAgICAgcGxhY2UgPSBOVUxMOwotICAgICAgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLQkgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX2JzczsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgPT0gMAotCSAgICAgICAmJiBob2xkX2RhdGEgIT0gTlVMTCkKLQlwbGFjZSA9IGhvbGRfZGF0YTsKLSAgICAgIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19DT0RFKSA9PSAwCi0JICAgICAgICYmIChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICAgICAmJiBob2xkX3JkYXRhICE9IE5VTEwpCi0JcGxhY2UgPSBob2xkX3JkYXRhOwotICAgICAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSAhPSAwCi0JICAgICAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotCXBsYWNlID0gaG9sZF90ZXh0OwotCi0gICAgICAvKiBDaG9vc2UgYSB1bmlxdWUgbmFtZSBmb3IgdGhlIHNlY3Rpb24uICBUaGlzIHdpbGwgYmUgbmVlZGVkIGlmCi0JIHRoZSBzYW1lIHNlY3Rpb24gbmFtZSBhcHBlYXJzIGluIHRoZSBpbnB1dCBmaWxlIHdpdGgKLQkgZGlmZmVyZW50IGxvYWRhYmxlIG9yIGFsbG9jYXRlYWJsZSBjaGFyYWN0ZXJpc3RpY3MuICAqLwotICAgICAgb3V0c2VjbmFtZSA9IHhzdHJkdXAgKGhvbGRfc2VjdGlvbl9uYW1lKTsKLSAgICAgIGlmIChiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgb3V0c2VjbmFtZSkgIT0gTlVMTCkKLQl7Ci0JICB1bnNpZ25lZCBpbnQgbGVuOwotCSAgY2hhciAqbmV3bmFtZTsKLQkgIHVuc2lnbmVkIGludCBpOwotCi0JICBsZW4gPSBzdHJsZW4gKG91dHNlY25hbWUpOwotCSAgbmV3bmFtZSA9IHhtYWxsb2MgKGxlbiArIDUpOwotCSAgc3RyY3B5IChuZXduYW1lLCBvdXRzZWNuYW1lKTsKLQkgIGkgPSAwOwotCSAgZG8KLQkgICAgewotCSAgICAgIHNwcmludGYgKG5ld25hbWUgKyBsZW4sICIlZCIsIGkpOwotCSAgICAgICsraTsKLQkgICAgfQotCSAgd2hpbGUgKGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBuZXduYW1lKSAhPSBOVUxMKTsKLQotCSAgZnJlZSAob3V0c2VjbmFtZSk7Ci0JICBvdXRzZWNuYW1lID0gbmV3bmFtZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gZnJlZSBPVVRTRUNOQU1FLCBhcyBpdCBtYXkgZ2V0IGF0dGFjaGVkIHRvCi0JIHRoZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnQuICAqLwotCi0gICAgICAvKiBDcmVhdGUgdGhlIHNlY3Rpb24gaW4gdGhlIG91dHB1dCBmaWxlLCBhbmQgcHV0IGl0IGluIHRoZQotCSByaWdodCBwbGFjZS4gIFRoaXMgc2h1ZmZsaW5nIGlzIHRvIG1ha2UgdGhlIG91dHB1dCBmaWxlIGxvb2sKLQkgbmVhdGVyLiAgKi8KLSAgICAgIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBvdXRzZWNuYW1lKTsKLSAgICAgIGlmIChzbmV3ID09IE5VTEwpCi0JZWluZm8gKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIsCi0JICAgICAgIG91dHB1dF9iZmQtPnh2ZWMtPm5hbWUsIG91dHNlY25hbWUpOwotICAgICAgaWYgKHBsYWNlICE9IE5VTEwgJiYgcGxhY2UtPmJmZF9zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgZm9yIChwcHMgPSAmb3V0cHV0X2JmZC0+c2VjdGlvbnM7ICpwcHMgIT0gc25ldzsgcHBzID0gJigqcHBzKS0+bmV4dCkKLQkgICAgOwotCSAgKnBwcyA9IHNuZXctPm5leHQ7Ci0JICBzbmV3LT5uZXh0ID0gcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0OwotCSAgcGxhY2UtPmJmZF9zZWN0aW9uLT5uZXh0ID0gc25ldzsKLQl9Ci0KLSAgICAgIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICAgICAgb2xkID0gc3RhdF9wdHI7Ci0gICAgICBzdGF0X3B0ciA9ICZhZGQ7Ci0gICAgICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gICAgICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLQlhZGRyZXNzID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICAvKiBBbGwgc2VjdGlvbnMgaW4gYW4gZXhlY3V0YWJsZSBtdXN0IGJlIGFsaWduZWQgdG8gYSBwYWdlCi0JICAgICBib3VuZGFyeS4gICovCi0JICBhZGRyZXNzID0gZXhwX3Vub3AgKEFMSUdOX0ssCi0JCQkgICAgICBleHBfbmFtZW9wIChOQU1FLCAiX19zZWN0aW9uX2FsaWdubWVudF9fIikpOwotCX0KLQotICAgICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKG91dHNlY25hbWUsIGFkZHJlc3MsIDAsCi0JCQkJCSAgIChiZmRfdm1hKSAwLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLQotICAgICAgaG9sZF91c2UgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKG91dHNlY25hbWUpOwotCi0gICAgICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudAotCSgoYmZkX3ZtYSkgMCwgIipkZWZhdWx0KiIsCi0JIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7Ci0KLSAgICAgIC8qIE5vdyBzdGljayB0aGUgbmV3IHN0YXRlbWVudCBsaXN0IHJpZ2h0IGFmdGVyIFBMQUNFLiAgKi8KLSAgICAgIGlmIChwbGFjZSAhPSBOVUxMKQotCXsKLQkgICphZGQudGFpbCA9IHBsYWNlLT5oZWFkZXIubmV4dDsKLQkgIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCX0KLQotICAgICAgc3RhdF9wdHIgPSBvbGQ7Ci0gICAgfQotCi0gIGlmIChkb2xsYXIgPT0gTlVMTCkKLSAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwbDsKLSAgICAgIGJvb2xlYW4gZm91bmRfZG9sbGFyOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGxpc3Q7Ci0KLSAgICAgIC8qIFRoZSBzZWN0aW9uIG5hbWUgaGFzIGEgJyQnLiAgU29ydCBpdCB3aXRoIHRoZSBvdGhlciAnJCcKLSAgICAgICAgIHNlY3Rpb25zLiAgKi8KLQotICAgICAgZm91bmRfZG9sbGFyID0gZmFsc2U7Ci0gICAgICBmb3IgKHBsID0gJmhvbGRfdXNlLT5jaGlsZHJlbi5oZWFkOyAqcGwgIT0gTlVMTDsgcGwgPSAmKCpwbCktPm5leHQpCi0JewotCSAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmxzOwotCSAgY29uc3QgY2hhciAqbG5hbWU7Ci0KLQkgIGlmICgoKnBsKS0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pCi0JICAgIGNvbnRpbnVlOwotCi0JICBscyA9ICYoKnBsKS0+aW5wdXRfc2VjdGlvbjsKLQotCSAgbG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobHMtPmlmaWxlLT50aGVfYmZkLCBscy0+c2VjdGlvbik7Ci0JICBpZiAoc3RyY2hyIChsbmFtZSwgJyQnKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKGZvdW5kX2RvbGxhcikKLQkJYnJlYWs7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGZvdW5kX2RvbGxhciA9IHRydWU7Ci0JICAgICAgaWYgKHN0cmNtcCAoc2VjbmFtZSwgbG5hbWUpIDwgMCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbGlzdCk7Ci0gICAgICB3aWxkX2RvaXQgKCZsaXN0LCBzLCBob2xkX3VzZSwgZmlsZSk7Ci0gICAgICBpZiAobGlzdC5oZWFkICE9IE5VTEwpCi0JewotCSAgQVNTRVJUIChsaXN0LmhlYWQtPm5leHQgPT0gTlVMTCk7Ci0JICBsaXN0LmhlYWQtPm5leHQgPSAqcGw7Ci0JICAqcGwgPSBsaXN0LmhlYWQ7Ci0JfQotICAgIH0KLQotICBmcmVlIChob2xkX3NlY3Rpb25fbmFtZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb25fbmFtZSkgPT0gMAotICAgICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICYmICgoaG9sZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpCi0JICA9PSAob3MtPmJmZF9zZWN0aW9uLT5mbGFncyAmIChTRUNfTE9BRCB8IFNFQ19BTExPQykpKSkKLSAgICBob2xkX3VzZSA9IG9zOwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnRleHQiKSA9PSAwKQotICAgIGhvbGRfdGV4dCA9IG9zOwotICBlbHNlIGlmIChzdHJjbXAgKG9zLT5uYW1lLCAiLnJkYXRhIikgPT0gMCkKLSAgICBob2xkX3JkYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotfQotDAotc3RhdGljIGNoYXIgKgotZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLUVPRgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotIyBzZWQgY29tbWFuZHMgdG8gcXVvdGUgYW4gbGQgc2NyaXB0IGFzIGEgQyBzdHJpbmcuCi1zYz0iLWYgJHtzcmNkaXJ9L2VtdWx0ZW1wbC9zdHJpbmdpZnkuc2VkIgotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybgotRU9GCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dSAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4nID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ciAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuJyAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym4gICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybicgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54biAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICcgIDsgZWxzZSByZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1zZWQgJHNjIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54ICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi1lY2hvICc7IH0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IGUke0VNVUxBVElPTl9OQU1FfS5jCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF8ke0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBnbGRfJHtFTVVMQVRJT05fTkFNRX1fYWZ0ZXJfcGFyc2UsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2dldF9zY3JpcHQsCi0gICIke0VNVUxBVElPTl9OQU1FfSIsCi0gICIke09VVFBVVF9GT1JNQVR9IiwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2ZpbmlzaCwgLyogZmluaXNoICovCi0gIE5VTEwsIC8qIGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiBzdGF0ZW1lbnRzICovCi0gIE5VTEwsIC8qIG9wZW4gZHluYW1pYyBhcmNoaXZlICovCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9wbGFjZV9vcnBoYW4sCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV9zZXRfc3ltYm9scywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3BhcnNlX2FyZ3MsCi0gIGdsZF8ke0VNVUxBVElPTl9OQU1FfV91bnJlY29nbml6ZWRfZmlsZSwKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X2xpc3Rfb3B0aW9ucywKLSAgZ2xkXyR7RU1VTEFUSU9OX05BTUV9X3JlY29nbml6ZWRfZmlsZQotfTsKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N0cmluZ2lmeS5zZWQgYi9sZC9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUyNmQzZi4uMDAwMDAwMAotLS0gYS9sZC9lbXVsdGVtcGwvc3RyaW5naWZ5LnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotcy9bIlxcXS9cXCYvZwotcy8kL1xcblxcLwotMSBzL14vIi8KLSQgcy8kL24iLwpkaWZmIC0tZ2l0IGEvbGQvZW11bHRlbXBsL3N1bm9zLmVtIGIvbGQvZW11bHRlbXBsL3N1bm9zLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWE1YzAxLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC9zdW5vcy5lbQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDEgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogVGhpcyBmaWxlIGlzIGlzIGdlbmVyYXRlZCBieSBhIHNoZWxsIHNjcmlwdC4gIERPIE5PVCBFRElUISAqLwotCi0vKiBTdW5PUyBlbXVsYXRpb24gY29kZSBmb3IgJHtFTVVMQVRJT05fTkFNRX0KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIDxzYWNAY3lnbnVzLmNvbT4KLSAgIFN1bk9TIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTXyR7RU1VTEFUSU9OX05BTUV9Ci0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi0jaWZkZWYgSEFWRV9ESVJFTlRfSAotIyBpbmNsdWRlIDxkaXJlbnQuaD4KLSNlbHNlCi0jIGRlZmluZSBkaXJlbnQgZGlyZWN0Ci0jIGlmZGVmIEhBVkVfU1lTX05ESVJfSAotIyAgaW5jbHVkZSA8c3lzL25kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9TWVNfRElSX0gKLSMgIGluY2x1ZGUgPHN5cy9kaXIuaD4KLSMgZW5kaWYKLSMgaWZkZWYgSEFWRV9ORElSX0gKLSMgIGluY2x1ZGUgPG5kaXIuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMKLSAgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbwotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9zZWFyY2hfZGlyCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBib29sZWFuICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZAotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIHZvaWQgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZCR7RU1VTEFUSU9OX05BTUV9X2NvdW50X25lZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGQke0VNVUxBVElPTl9OQU1FfV9zZXRfbmVlZAotICBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyBjaGFyICpnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9iZWZvcmVfcGFyc2UoKQotewotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoXyR7QVJDSH07Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotICBjb25maWcuaGFzX3NoYXJlZCA9IHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGhhdmUgYmVlbiBwYXJzZWQsCi0gICBidXQgYmVmb3JlIHRoZSBsaW5rZXIgc2NyaXB0IGhhcyBiZWVuIHJlYWQuICBJZiB0aGlzIGlzIGEgbmF0aXZlCi0gICBsaW5rZXIsIHdlIGFkZCB0aGUgZGlyZWN0b3JpZXMgaW4gTERfTElCUkFSWV9QQVRIIHRvIHRoZSBzZWFyY2gKLSAgIGxpc3QuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2V0X3N5bWJvbHMgKCkKLXsKLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgY29uc3QgY2hhciAqZW52OwotCi0gIGVudiA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX0xJQlJBUllfUEFUSCIpOwotICBpZiAoZW52ICE9IE5VTEwpCi0gICAgewotICAgICAgY2hhciAqbDsKLQotICAgICAgbCA9IHhzdHJkdXAgKGVudik7Ci0gICAgICB3aGlsZSAoMSkKLQl7Ci0JICBjaGFyICpjOwotCi0JICBjID0gc3RyY2hyIChsLCAnOicpOwotCSAgaWYgKGMgIT0gTlVMTCkKLQkgICAgKmMrKyA9ICdcMCc7Ci0JICBpZiAoKmwgIT0gJ1wwJykKLQkgICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGwsIGZhbHNlKTsKLQkgIGlmIChjID09IE5VTEwpCi0JICAgIGJyZWFrOwotCSAgbCA9IGM7Ci0JfQotICAgIH0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLX0KLQotLyogRGVzcGl0ZSB0aGUgbmFtZSwgd2UgdXNlIHRoaXMgcm91dGluZSB0byBzZWFyY2ggZm9yIGR5bmFtaWMKLSAgIGxpYnJhcmllcy4gIE9uIFN1bk9TIHRoaXMgcmVxdWlyZXMgYSBkaXJlY3Rvcnkgc2VhcmNoLiAgV2UgbmVlZCB0bwotICAgZmluZCB0aGUgLnNvIGZpbGUgd2l0aCB0aGUgaGlnaGVzdCB2ZXJzaW9uIG51bWJlci4gIFRoZSB1c2VyIG1heQotICAgcmVzdHJpY3QgdGhlIG1ham9yIHZlcnNpb24gYnkgc2F5aW5nLCBlLmcuLCAtbGMuMS4gIEFsc28sIGlmIHdlCi0gICBmaW5kIGEgLnNvIGZpbGUsIHdlIG5lZWQgdG8gbG9vayBmb3IgYSB0aGUgc2FtZSBmaWxlIGFmdGVyCi0gICByZXBsYWNpbmcgLnNvIHdpdGggLnNhOyBpZiBpdCBleGlzdHMsIGl0IHdpbGwgYmUgYW4gYXJjaGl2ZSB3aGljaAotICAgcHJvdmlkZSBzb21lIGluaXRpYWxpemF0aW9ucyBmb3IgZGF0YSBzeW1ib2xzLCBhbmQgd2UgbmVlZCB0bwotICAgc2VhcmNoIGl0IGFmdGVyIGluY2x1ZGluZyB0aGUgLnNvIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMgKCkKLXsKLSAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX3NvKTsKLX0KLQotLyogU2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIGEgLnNvIGZpbGUgZm9yIGVhY2ggbGlicmFyeSBzZWFyY2guICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9zbyAoaW5wKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppbnA7Ci17Ci0gIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgY2hhciAqZm91bmQgPSBOVUxMOwotICBjaGFyICphbGM7Ci0gIHN0cnVjdCBzdGF0IHN0OwotCi0gIGlmICghIGlucC0+c2VhcmNoX2RpcnNfZmxhZwotICAgICAgfHwgISBpbnAtPmlzX2FyY2hpdmUKLSAgICAgIHx8ICEgaW5wLT5keW5hbWljKQotICAgIHJldHVybjsKLQotICBBU1NFUlQgKHN0cm5jbXAgKGlucC0+bG9jYWxfc3ltX25hbWUsICItbCIsIDIpID09IDApOwotCi0gIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0gICAgewotICAgICAgYm9vbGVhbiBmb3VuZF9zdGF0aWM7Ci0KLSAgICAgIGZvdW5kID0gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2RpciAoc2VhcmNoLT5uYW1lLCBpbnAtPmZpbGVuYW1lLAotCQkJCQkgICAgICAgJmZvdW5kX3N0YXRpYyk7Ci0gICAgICBpZiAoZm91bmQgIT0gTlVMTCB8fCBmb3VuZF9zdGF0aWMpCi0JYnJlYWs7Ci0gICAgfQotCi0gIGlmIChmb3VuZCA9PSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGRpZCBub3QgZmluZCBhIG1hdGNoaW5nIC5zbyBmaWxlLiAgVGhpcyBpc24ndCBhbiBlcnJvciwKLQkgc2luY2UgdGhlcmUgbWlnaHQgc3RpbGwgYmUgYSBtYXRjaGluZyAuYSBmaWxlLCB3aGljaCB3aWxsIGJlCi0JIGZvdW5kIGJ5IHRoZSB1c3VhbCBzZWFyY2guICAqLwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBSZXBsYWNlIHRoZSBmaWxlbmFtZSB3aXRoIHRoZSBvbmUgd2UgaGF2ZSBmb3VuZC4gICovCi0gIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIHN0cmxlbiAoZm91bmQpICsgMik7Ci0gIHNwcmludGYgKGFsYywgIiVzLyVzIiwgc2VhcmNoLT5uYW1lLCBmb3VuZCk7Ci0gIGlucC0+ZmlsZW5hbWUgPSBhbGM7Ci0KLSAgLyogVHVybiBvZmYgdGhlIHNlYXJjaF9kaXJzX2ZsYWcgdG8gcHJldmVudCBsZGZpbGVfb3Blbl9maWxlIGZyb20KLSAgICAgc2VhcmNoaW5nIGZvciB0aGlzIGZpbGUgYWdhaW4uICAqLwotICBpbnAtPnNlYXJjaF9kaXJzX2ZsYWcgPSBmYWxzZTsKLQotICBmcmVlIChmb3VuZCk7Ci0KLSAgLyogTm93IGxvb2sgZm9yIHRoZSBzYW1lIGZpbGUgbmFtZSwgYnV0IHdpdGggLnNhIGluc3RlYWQgb2YgLnNvLiAgSWYKLSAgICAgZm91bmQsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBpbnB1dCBmaWxlcy4gICovCi0gIGFsYyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoaW5wLT5maWxlbmFtZSkgKyAxKTsKLSAgc3RyY3B5IChhbGMsIGlucC0+ZmlsZW5hbWUpOwotICBzdHJzdHIgKGFsYyArIHN0cmxlbiAoc2VhcmNoLT5uYW1lKSwgIi5zbyIpWzJdID0gJ2EnOwotICBpZiAoc3RhdCAoYWxjLCAmc3QpICE9IDApCi0gICAgZnJlZSAoYWxjKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnNhOwotCi0gICAgICAvKiBBZGQgdGhlIC5zYSBmaWxlIHRvIHRoZSBzdGF0ZW1lbnQgbGlzdCBqdXN0IGJlZm9yZSB0aGUgLnNvCi0JIGZpbGUuICBUaGlzIGlzIHJlYWxseSBhIGhhY2suICAqLwotICAgICAgc2EgPSAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikKLQkgICAgeG1hbGxvYyAoc2l6ZW9mIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKSkpOwotICAgICAgKnNhID0gKmlucDsKLQotICAgICAgaW5wLT5maWxlbmFtZSA9IGFsYzsKLSAgICAgIGlucC0+bG9jYWxfc3ltX25hbWUgPSBhbGM7Ci0KLSAgICAgIGlucC0+aGVhZGVyLm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBzYTsKLSAgICAgIGlucC0+bmV4dF9yZWFsX2ZpbGUgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBzYTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBhIGRpcmVjdG9yeSBmb3IgYSAuc28gZmlsZS4gICovCi0KLXN0YXRpYyBjaGFyICoKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9kaXIgKGRpcm5hbWUsIGZpbGVuYW1lLCBmb3VuZF9zdGF0aWMpCi0gICAgIGNvbnN0IGNoYXIgKmRpcm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAgICBib29sZWFuICpmb3VuZF9zdGF0aWM7Ci17Ci0gIGludCBmb3JjZV9tYWosIGZvcmNlX21pbjsKLSAgY29uc3QgY2hhciAqZG90OwotICB1bnNpZ25lZCBpbnQgbGVuOwotICBjaGFyICphbGM7Ci0gIGNoYXIgKmZvdW5kOwotICBpbnQgbWF4X21haiwgbWF4X21pbjsKLSAgRElSICpkaXI7Ci0gIHN0cnVjdCBkaXJlbnQgKmVudHJ5OwotICB1bnNpZ25lZCBpbnQgZGlybmFtZWxlbjsKLSAgY2hhciAqZnVsbF9wYXRoOwotICBpbnQgc3RhdHZhbDsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgKmZvdW5kX3N0YXRpYyA9IGZhbHNlOwotCi0gIGZvcmNlX21haiA9IC0xOwotICBmb3JjZV9taW4gPSAtMTsKLSAgZG90ID0gc3RyY2hyIChmaWxlbmFtZSwgJy4nKTsKLSAgaWYgKGRvdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIGxlbiA9IHN0cmxlbiAoZmlsZW5hbWUpOwotICAgICAgYWxjID0gTlVMTDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmb3JjZV9tYWogPSBhdG9pIChkb3QgKyAxKTsKLQotICAgICAgbGVuID0gZG90IC0gZmlsZW5hbWU7Ci0gICAgICBhbGMgPSAoY2hhciAqKSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgICAgIHN0cm5jcHkgKGFsYywgZmlsZW5hbWUsIGxlbik7Ci0gICAgICBhbGNbbGVuXSA9ICdcMCc7Ci0gICAgICBmaWxlbmFtZSA9IGFsYzsKLQotICAgICAgZG90ID0gc3RyY2hyIChkb3QgKyAxLCAnLicpOwotICAgICAgaWYgKGRvdCAhPSBOVUxMKQotCWZvcmNlX21pbiA9IGF0b2kgKGRvdCArIDEpOwotICAgIH0KLQotICBmb3VuZCA9IE5VTEw7Ci0gIG1heF9tYWogPSBtYXhfbWluID0gMDsKLQotICBkaXIgPSBvcGVuZGlyIChkaXJuYW1lKTsKLSAgaWYgKGRpciA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICBkaXJuYW1lbGVuID0gc3RybGVuIChkaXJuYW1lKTsKLSAgCi0gIHdoaWxlICgoZW50cnkgPSByZWFkZGlyIChkaXIpKSAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgICBpbnQgZm91bmRfbWFqLCBmb3VuZF9taW47Ci0KLSAgICAgIGlmIChzdHJuY21wIChlbnRyeS0+ZF9uYW1lLCAibGliIiwgMykgIT0gMAotCSAgfHwgc3RybmNtcCAoZW50cnktPmRfbmFtZSArIDMsIGZpbGVuYW1lLCBsZW4pICE9IDApCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChkb3QgPT0gTlVMTAotCSAgJiYgc3RyY21wIChlbnRyeS0+ZF9uYW1lICsgMyArIGxlbiwgIi5hIikgPT0gMCkKLQl7Ci0JICAqZm91bmRfc3RhdGljID0gdHJ1ZTsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogV2UgYWNjZXB0IGxpYmZvby5zbyB3aXRob3V0IGEgdmVyc2lvbiBudW1iZXIsIGV2ZW4gdGhvdWdoIHRoZQotICAgICAgICAgbmF0aXZlIGxpbmtlciBkb2VzIG5vdC4gIFRoaXMgaXMgbW9yZSBjb252ZW5pZW50IGZvciBwYWNrYWdlcwotICAgICAgICAgd2hpY2gganVzdCBnZW5lcmF0ZSAuc28gZmlsZXMgZm9yIHNoYXJlZCBsaWJyYXJpZXMsIGFzIG9uIEVMRgotICAgICAgICAgc3lzdGVtcy4gICovCi0gICAgICBpZiAoc3RybmNtcCAoZW50cnktPmRfbmFtZSArIDMgKyBsZW4sICIuc28iLCAzKSAhPSAwKQotCWNvbnRpbnVlOwotICAgICAgaWYgKGVudHJ5LT5kX25hbWVbNiArIGxlbl0gPT0gJ1wwJykKLQk7Ci0gICAgICBlbHNlIGlmIChlbnRyeS0+ZF9uYW1lWzYgKyBsZW5dID09ICcuJwotCSAgICAgICAmJiBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgZW50cnktPmRfbmFtZVs3ICsgbGVuXSkpCi0JOwotICAgICAgZWxzZQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKHMgPSBlbnRyeS0+ZF9uYW1lICsgNiArIGxlbjsgKnMgIT0gJ1wwJzsgcysrKQotCWlmICgqcyAhPSAnLicgJiYgISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgYnJlYWs7Ci0gICAgICBpZiAoKnMgIT0gJ1wwJykKLQljb250aW51ZTsKLQotICAgICAgLyogV2UndmUgZm91bmQgYSAuc28gZmlsZS4gIFdvcmsgb3V0IHRoZSBtYWpvciBhbmQgbWlub3IKLQkgdmVyc2lvbiBudW1iZXJzLiAgKi8KLSAgICAgIGZvdW5kX21haiA9IDA7Ci0gICAgICBmb3VuZF9taW4gPSAwOwotICAgICAgc3NjYW5mIChlbnRyeS0+ZF9uYW1lICsgMyArIGxlbiwgIi5zby4lZC4lZCIsCi0JICAgICAgJmZvdW5kX21haiwgJmZvdW5kX21pbik7Ci0KLSAgICAgIGlmICgoZm9yY2VfbWFqICE9IC0xICYmIGZvcmNlX21haiAhPSBmb3VuZF9tYWopCi0JICB8fCAoZm9yY2VfbWluICE9IC0xICYmIGZvcmNlX21pbiAhPSBmb3VuZF9taW4pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHN1cmUgdGhlIGZpbGUgcmVhbGx5IGV4aXN0cyAoaWdub3JlIGJyb2tlbiBzeW1saW5rcykuICAqLwotICAgICAgZnVsbF9wYXRoID0geG1hbGxvYyAoZGlybmFtZWxlbiArIDEgKyBzdHJsZW4gKGVudHJ5LT5kX25hbWUpICsgMSk7Ci0gICAgICBzcHJpbnRmIChmdWxsX3BhdGgsICIlcy8lcyIsIGRpcm5hbWUsIGVudHJ5LT5kX25hbWUpOwotICAgICAgc3RhdHZhbCA9IHN0YXQgKGZ1bGxfcGF0aCwgJnN0KTsKLSAgICAgIGZyZWUgKGZ1bGxfcGF0aCk7Ci0gICAgICBpZiAoc3RhdHZhbCAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSd2ZSBmb3VuZCBhIG1hdGNoIGZvciB0aGUgbmFtZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gIFNlZQotCSBpZiB0aGlzIGlzIHRoZSB2ZXJzaW9uIHdlIHNob3VsZCB1c2UuICBJZiB0aGUgbWFqb3IgYW5kIG1pbm9yCi0JIHZlcnNpb25zIG1hdGNoLCB3ZSB1c2UgdGhlIGxhc3QgZW50cnkgaW4gYWxwaGFiZXRpY2FsIG9yZGVyOwotCSBJIGRvbid0IGtub3cgaWYgdGhpcyBpcyBob3cgU3VuT1MgZGlzdGluZ3Vpc2hlcyBsaWJjLnNvLjEuOAotCSBmcm9tIGxpYmMuc28uMS44LjEsIGJ1dCBpdCBvdWdodCB0byBzdWZmaWNlLiAgKi8KLSAgICAgIGlmIChmb3VuZCA9PSBOVUxMCi0JICB8fCAoZm91bmRfbWFqID4gbWF4X21haikKLQkgIHx8IChmb3VuZF9tYWogPT0gbWF4X21hagotCSAgICAgICYmIChmb3VuZF9taW4gPiBtYXhfbWluCi0JCSAgfHwgKGZvdW5kX21pbiA9PSBtYXhfbWluCi0JCSAgICAgICYmIHN0cmNtcCAoZW50cnktPmRfbmFtZSwgZm91bmQpID4gMCkpKSkKLQl7Ci0JICBpZiAoZm91bmQgIT0gTlVMTCkKLQkgICAgZnJlZSAoZm91bmQpOwotCSAgZm91bmQgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGVudHJ5LT5kX25hbWUpICsgMSk7Ci0JICBzdHJjcHkgKGZvdW5kLCBlbnRyeS0+ZF9uYW1lKTsKLQkgIG1heF9tYWogPSBmb3VuZF9tYWo7Ci0JICBtYXhfbWluID0gZm91bmRfbWluOwotCX0KLSAgICB9Ci0KLSAgY2xvc2VkaXIgKGRpcik7Ci0KLSAgaWYgKGFsYyAhPSBOVUxMKQotICAgIGZyZWUgKGFsYyk7Ci0KLSAgcmV0dXJuIGZvdW5kOwotfQotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmFjayBhbmQgZm9ydGgKLSAgIGJldHdlZW4gYWZ0ZXJfb3BlbiBhbmQgY2hlY2tfbmVlZGVkLiAgKi8KLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqZ2xvYmFsX25lZWRlZDsKLXN0YXRpYyBib29sZWFuIGdsb2JhbF9mb3VuZDsKLQotLyogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2FmdGVyX29wZW4gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBsZF9uZWVkIGVudHJpZXMgaW4gZHluYW1pYwotICAgICBvYmplY3RzIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgRm9yIGVhY2ggc3VjaCBmaWxlLCB3ZSB3YW50IHRvCi0gICAgIHRyYWNrIGRvd24gdGhlIGNvcnJlc3BvbmRpbmcgbGlicmFyeSwgYW5kIGluY2x1ZGUgdGhlIHN5bWJvbAotICAgICB0YWJsZSBpbiB0aGUgbGluay4gIFRoaXMgaXMgd2hhdCB0aGUgcnVudGltZSBkeW5hbWljIGxpbmtlciB3aWxsCi0gICAgIGRvLiAgVHJhY2tpbmcgdGhlIGZpbGVzIGRvd24gaGVyZSBwZXJtaXRzIG9uZSBkeW5hbWljIG9iamVjdCB0bwotICAgICBpbmNsdWRlIGFub3RoZXIgd2l0aG91dCByZXF1aXJpbmcgc3BlY2lhbCBhY3Rpb24gYnkgdGhlIHBlcnNvbgotICAgICBkb2luZyB0aGUgbGluay4gIE5vdGUgdGhhdCB0aGUgbmVlZGVkIGxpc3QgY2FuIGFjdHVhbGx5IGdyb3cKLSAgICAgd2hpbGUgd2UgYXJlIHN0ZXBwaW5nIHRocm91Z2ggdGhpcyBsb29wLiAgKi8KLSAgbmVlZGVkID0gYmZkX3N1bm9zX2dldF9uZWVkZWRfbGlzdCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci0gIGZvciAobCA9IG5lZWRlZDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmxsOwotICAgICAgY29uc3QgY2hhciAqbG5hbWU7Ci0gICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgICAgIGxuYW1lID0gbC0+bmFtZTsKLQotICAgICAgLyogSWYgd2UndmUgYWxyZWFkeSBzZWVuIHRoaXMgZmlsZSwgc2tpcCBpdC4gICovCi0gICAgICBmb3IgKGxsID0gbmVlZGVkOyBsbCAhPSBsOyBsbCA9IGxsLT5uZXh0KQotCWlmIChzdHJjbXAgKGxsLT5uYW1lLCBsbmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGxsICE9IGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLwotICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7Ci0gICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkKTsKLSAgICAgIGlmIChnbG9iYWxfZm91bmQpCi0JY29udGludWU7Ci0KLSAgICAgIGlmIChzdHJuY21wIChsbmFtZSwgIi1sIiwgMikgIT0gMCkKLQl7Ci0JICBiZmQgKmFiZmQ7Ci0KLQkgIGFiZmQgPSBiZmRfb3BlbnIgKGxuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotCSAgaWYgKGFiZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICghIGJmZF9jaGVja19mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpKQotCQl7Ci0JCSAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0JCSAgYWJmZCA9IE5VTEw7Ci0JCX0KLQkgICAgfQotCSAgaWYgKGFiZmQgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0JCXsKLQkJICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLQkJICBhYmZkID0gTlVMTDsKLQkJfQotCSAgICB9Ci0JICBpZiAoYWJmZCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgLyogV2UndmUgZm91bmQgdGhlIG5lZWRlZCBkeW5hbWljIG9iamVjdC4gICovCi0JICAgICAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotCQllaW5mbyAoIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iLCBhYmZkKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZWluZm8gKCIlUDogd2FybmluZzogJXMsIG5lZWRlZCBieSAlQiwgbm90IGZvdW5kXG4iLAotCQkgICAgIGxuYW1lLCBsLT5ieSk7Ci0JICAgIH0KLQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICBsbmFtZSArPSAyOwotCi0gICAgICAvKiBXZSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlIGZpbGUgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlCi0JIGR5bmFtaWMgbGlua2VyIHdpbGwgc2VhcmNoLiAgVGhhdCBtZWFucyB0aGF0IHdlIHdhbnQgdG8gdXNlCi0JIHJwYXRoX2xpbmssIHJwYXRoIG9yIC1MLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotCSBMRF9MSUJSQVJZX1BBVEggKG5hdGl2ZSBvbmx5KSwgdGhlbiAoaWYgcnBhdGggd2FzIHVzZWQpIHRoZQotCSBsaW5rZXIgc2NyaXB0IExJQl9TRUFSQ0hfRElSUy4gICovCi0gICAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmssCi0JCQkJCSAgICAgIGxuYW1lKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLQl7Ci0JICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAoY29tbWFuZF9saW5lLnJwYXRoLCBsbmFtZSkpCi0JICAgIGNvbnRpbnVlOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICBpZiAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoc2VhcmNoLT5uYW1lLCBsbmFtZSkpCi0JICAgICAgYnJlYWs7Ci0JICBpZiAoc2VhcmNoICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCX0KLUVPRgotaWYgWyAieCR7aG9zdH0iID0gIngke3RhcmdldH0iIF0gOyB0aGVuCi0gIGNhc2UgIiAke0VNVUxBVElPTl9MSUJQQVRIfSAiIGluCi0gICoiICR7RU1VTEFUSU9OX05BTUV9ICIqKQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgICAgIHsKLQljb25zdCBjaGFyICpsaWJfcGF0aDsKLQotCWxpYl9wYXRoID0gKGNvbnN0IGNoYXIgKikgZ2V0ZW52ICgiTERfTElCUkFSWV9QQVRIIik7Ci0JaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NlYXJjaF9uZWVkZWQgKGxpYl9wYXRoLCBsbmFtZSkpCi0JICBjb250aW51ZTsKLSAgICAgIH0KLUVPRgotICA7OwotICBlc2FjCi1maQotY2F0ID4+ZSR7RU1VTEFUSU9OX05BTUV9LmMgPDxFT0YKLSAgICAgIGlmIChjb21tYW5kX2xpbmUucnBhdGggIT0gTlVMTCkKLQl7Ci0JICBmb3IgKHNlYXJjaCA9IHNlYXJjaF9oZWFkOyBzZWFyY2ggIT0gTlVMTDsgc2VhcmNoID0gc2VhcmNoLT5uZXh0KQotCSAgICB7Ci0JICAgICAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkJY29udGludWU7Ci0JICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKHNlYXJjaC0+bmFtZSwgbG5hbWUpKQotCQlicmVhazsKLQkgICAgfQotCSAgaWYgKHNlYXJjaCAhPSBOVUxMKQotCSAgICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGVpbmZvICgiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG5vdCBmb3VuZFxuIiwKLQkgICAgIGwtPm5hbWUsIGwtPmJ5KTsKLSAgICB9Ci19Ci0KLS8qIFNlYXJjaCBmb3IgYSBuZWVkZWQgZmlsZSBpbiBhIHBhdGguICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX25lZWRlZCAocGF0aCwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgY2hhciAqczsKLQotICBpZiAocGF0aCA9PSBOVUxMIHx8ICpwYXRoID09ICdcMCcpCi0gICAgcmV0dXJuIGZhbHNlOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpkaXI7Ci0gICAgICBjaGFyICpkaXJjb3B5OwotCi0gICAgICBzID0gc3RyY2hyIChwYXRoLCAnOicpOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQl7Ci0JICBkaXJjb3B5ID0gTlVMTDsKLQkgIGRpciA9IHBhdGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGRpcmNvcHkgPSAoY2hhciAqKSB4bWFsbG9jIChzIC0gcGF0aCArIDEpOwotCSAgbWVtY3B5IChkaXJjb3B5LCBwYXRoLCBzIC0gcGF0aCk7Ci0JICBkaXJjb3B5W3MgLSBwYXRoXSA9ICdcMCc7Ci0JICBkaXIgPSBkaXJjb3B5OwotCX0KLQotICAgICAgaWYgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3RyeV9uZWVkZWQgKGRpciwgbmFtZSkpCi0JcmV0dXJuIHRydWU7Ci0KLSAgICAgIGlmIChkaXJjb3B5ICE9IE5VTEwpCi0JZnJlZSAoZGlyY29weSk7Ci0KLSAgICAgIGlmIChzID09IE5VTEwpCi0JYnJlYWs7Ci0gICAgICBwYXRoID0gcyArIDE7Ci0gICAgfQotCi0gIHJldHVybiBmYWxzZTsJICAKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggcG9zc2libGUgZGlyZWN0b3J5IGZvciBhIG5lZWRlZAotICAgZHluYW1pYyBvYmplY3QuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fdHJ5X25lZWRlZCAoZGlyLCBuYW1lKQotICAgICBjb25zdCBjaGFyICpkaXI7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNoYXIgKmZpbGU7Ci0gIGNoYXIgKmFsYzsKLSAgYm9vbGVhbiBpZ25vcmU7Ci0gIGJmZCAqYWJmZDsKLQotICBmaWxlID0gZ2xkJHtFTVVMQVRJT05fTkFNRX1fc2VhcmNoX2RpciAoZGlyLCBuYW1lLCAmaWdub3JlKTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYWxjID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChkaXIpICsgc3RybGVuIChmaWxlKSArIDIpOwotICBzcHJpbnRmIChhbGMsICIlcy8lcyIsIGRpciwgZmlsZSk7Ci0gIGZyZWUgKGZpbGUpOwotICBhYmZkID0gYmZkX29wZW5yIChhbGMsIGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0gIGlmIChhYmZkID09IE5VTEwpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KSkKLSAgICB7Ci0gICAgICAodm9pZCkgYmZkX2Nsb3NlIChhYmZkKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIGlmICgoYmZkX2dldF9maWxlX2ZsYWdzIChhYmZkKSAmIERZTkFNSUMpID09IDApCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIC8qIFdlJ3ZlIGZvdW5kIHRoZSBuZWVkZWQgZHluYW1pYyBvYmplY3QuICAqLwotCi0gIC8qIEFkZCB0aGlzIGZpbGUgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvICgiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIsIGFiZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgd2UgaGF2ZSBhbHJlYWR5IGluY2x1ZGVkIGEgbmVlZGVkIG9iamVjdCBpbiB0aGUgbGluay4gIFRoaXMKLSAgIGRvZXMgbm90IGhhdmUgdG8gYmUgcHJlY2lzZSwgYXMgaXQgZG9lcyBubyBoYXJtIHRvIGluY2x1ZGUgYQotICAgZHluYW1pYyBvYmplY3QgbW9yZSB0aGFuIG9uY2UuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fY2hlY2tfbmVlZGVkIChzKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzOwotewotICBpZiAocy0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICByZXR1cm47Ci0gIGlmIChzdHJuY21wIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAiLWwiLCAyKSAhPSAwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotCWdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc25hbWUsICpsbmFtZTsKLSAgICAgIGNvbnN0IGNoYXIgKnNkb3QsICpsZG90OwotICAgICAgaW50IGxtYWosIGxtaW4sIHNtYWosIHNtaW47Ci0KLSAgICAgIGxuYW1lID0gZ2xvYmFsX25lZWRlZC0+bmFtZSArIDI7Ci0KLSAgICAgIHNuYW1lID0gc3RycmNociAocy0+ZmlsZW5hbWUsICcvJyk7Ci0gICAgICBpZiAoc25hbWUgPT0gTlVMTCkKLQlzbmFtZSA9IHMtPmZpbGVuYW1lOwotICAgICAgZWxzZQotCSsrc25hbWU7Ci0KLSAgICAgIGlmIChzdHJuY21wIChzbmFtZSwgImxpYiIsIDMpICE9IDApCi0JcmV0dXJuOwotICAgICAgc25hbWUgKz0gMzsKLQotICAgICAgbGRvdCA9IHN0cmNociAobG5hbWUsICcuJyk7Ci0gICAgICBpZiAobGRvdCA9PSBOVUxMKQotCWxkb3QgPSBsbmFtZSArIHN0cmxlbiAobG5hbWUpOwotCi0gICAgICBzZG90ID0gc3Ryc3RyIChzbmFtZSwgIi5zby4iKTsKLSAgICAgIGlmIChzZG90ID09IE5VTEwpCi0JcmV0dXJuOwotCi0gICAgICBpZiAoc2RvdCAtIHNuYW1lICE9IGxkb3QgLSBsbmFtZQotCSAgfHwgc3RybmNtcCAobG5hbWUsIHNuYW1lLCBzZG90IC0gc25hbWUpICE9IDApCi0JcmV0dXJuOwotCi0gICAgICBsbWFqID0gbG1pbiA9IC0xOwotICAgICAgc3NjYW5mIChsZG90LCAiLiVkLiVkIiwgJmxtYWosICZsbWluKTsKLSAgICAgIHNtYWogPSBzbWluID0gLTE7Ci0gICAgICBzc2NhbmYgKHNkb3QsICIuc28uJWQuJWQiLCAmc21haiwgJnNtaW4pOwotICAgICAgaWYgKChzbWFqICE9IGxtYWogJiYgc21haiAhPSAtMSAmJiBsbWFqICE9IC0xKQotCSAgfHwgKHNtaW4gIT0gbG1pbiAmJiBzbWluICE9IC0xICYmIGxtaW4gIT0gLTEpKQotCXJldHVybjsKLQotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8qIFdlIG5lZWQgdG8gdXNlIHN0YXRpYyB2YXJpYWJsZXMgdG8gcGFzcyBpbmZvcm1hdGlvbiBhcm91bmQgdGhlIGNhbGwKLSAgIHRvIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSWNrLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZpbmRfYXNzaWduOwotc3RhdGljIGJvb2xlYW4gZm91bmRfYXNzaWduOwotCi0vKiBXZSBuZWVkIHRvIHVzZSBzdGF0aWMgdmFyaWFibGVzIHRvIHBhc3MgaW5mb3JtYXRpb24gYXJvdW5kIHRoZSBjYWxsCi0gICB0byBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUuICBJY2suICAqLwotCi1zdGF0aWMgYmZkX3NpemVfdHlwZSBuZWVkX3NpemU7Ci1zdGF0aWMgYmZkX3NpemVfdHlwZSBuZWVkX2VudHJpZXM7Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfY29udGVudHM7Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfcGluZm87Ci1zdGF0aWMgYmZkX2J5dGUgKm5lZWRfcG5hbWVzOwotCi0vKiBUaGUgc2l6ZSBvZiBvbmUgZW50cnkgaW4gdGhlIC5uZWVkIHNlY3Rpb24sIG5vdCBpbmNsdWRpbmcgdGhlIGZpbGUKLSAgIG5hbWUuICAqLwotCi0jZGVmaW5lIE5FRURfRU5UUllfU0laRSAoMTYpCi0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fYmVmb3JlX2FsbG9jYXRpb24gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmhkeW4gPSBOVUxMOwotICBhc2VjdGlvbiAqc25lZWQ7Ci0gIGFzZWN0aW9uICpzcnVsZXM7Ci0gIGFzZWN0aW9uICpzZHluOwotCi0gIC8qIFRoZSBTdW5PUyBuYXRpdmUgbGlua2VyIGNyZWF0ZXMgYSBzaGFyZWQgbGlicmFyeSB3aGVuZXZlciB0aGVyZQotICAgICBhcmUgYW55IHVuZGVmaW5lZCBzeW1ib2xzIGluIGEgbGluaywgdW5sZXNzIC1lIGlzIHVzZWQuICBUaGlzIGlzCi0gICAgIHByZXR0eSB3ZWlyZCwgYnV0IHdlIGFyZSBjb21wYXRpYmxlLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnNoYXJlZCAmJiAhIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgJiYgISBlbnRyeV9mcm9tX2NtZGxpbmUpCi0gICAgewotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gICAgICAKLSAgICAgIGZvciAoaCA9IGxpbmtfaW5mby5oYXNoLT51bmRlZnM7IGggIT0gTlVMTDsgaCA9IGgtPm5leHQpCi0JewotCSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQKLQkgICAgICAmJiBoLT51LnVuZGVmLmFiZmQgIT0gTlVMTAotCSAgICAgICYmIChoLT51LnVuZGVmLmFiZmQtPmZsYWdzICYgRFlOQU1JQykgPT0gMAotCSAgICAgICYmIHN0cmNtcCAoaC0+cm9vdC5zdHJpbmcsICJfX0RZTkFNSUMiKSAhPSAwCi0JICAgICAgJiYgc3RyY21wIChoLT5yb290LnN0cmluZywgIl9fR0xPQkFMX09GRlNFVF9UQUJMRV8iKSAhPSAwKQotCSAgICB7Ci0JICAgICAgZmluZF9hc3NpZ24gPSBoLT5yb290LnN0cmluZzsKLQkgICAgICBmb3VuZF9hc3NpZ24gPSBmYWxzZTsKLQkgICAgICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50KTsKLQkgICAgICBpZiAoISBmb3VuZF9hc3NpZ24pCi0JCXsKLQkJICBsaW5rX2luZm8uc2hhcmVkID0gdHJ1ZTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAobGlua19pbmZvLnNoYXJlZCkKLSAgICB7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICAgICAgLyogU2V0IHRoZSAudGV4dCBzZWN0aW9uIHRvIHN0YXJ0IGF0IDB4MjAsIG5vdCAweDIwMjAuICBGSVhNRToKLSAgICAgICAgIFRoaXMgaXMgdG9vIG1hZ2ljYWwuICAqLwotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIudGV4dCIpOwotICAgICAgaWYgKG9zLT5hZGRyX3RyZWUgPT0gTlVMTCkKLQlvcy0+YWRkcl90cmVlID0gZXhwX2ludG9wICgweDIwKTsKLSAgICB9Ci0KLSAgLyogV2UgbmVlZCB0byBjcmVhdGUgYSBfX0RZTkFNSUMgc3ltYm9sLiAgV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUKLSAgICAgbGlua2VyIHNjcmlwdCBiZWNhdXNlIHdlIHdhbnQgdG8gc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3RhcnQgb2YKLSAgICAgdGhlIGR5bmFtaWMgc2VjdGlvbiBpZiB0aGVyZSBpcyBvbmUsIG9yIHRvIHplcm8gaWYgdGhlcmUgaXNuJ3QKLSAgICAgb25lLiAgV2UgbmVlZCB0byBjcmVhdGUgdGhlIHN5bWJvbCBiZWZvcmUgY2FsbGluZwotICAgICBzaXplX2R5bmFtaWNfc2VjdGlvbnMsIGFsdGhvdWdoIHdlIGNhbid0IHNldCB0aGUgdmFsdWUgdW50aWwKLSAgICAgYWZ0ZXJ3YXJkLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICB7Ci0gICAgICBoZHluID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCAiX19EWU5BTUlDIiwgdHJ1ZSwgZmFsc2UsCi0JCQkJICAgZmFsc2UpOwotICAgICAgaWYgKGhkeW4gPT0gTlVMTCkKLQllaW5mbyAoIiVQJUY6IGJmZF9saW5rX2hhc2hfbG9va3VwOiAlRVxuIik7Ci0gICAgICBpZiAoISBiZmRfc3Vub3NfcmVjb3JkX2xpbmtfYXNzaWdubWVudCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJICAgICAgIl9fRFlOQU1JQyIpKQotCWVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvIF9fRFlOQU1JQzogJUVcbiIpOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmUgZ29pbmcgdG8gbWFrZSBhbnkgdmFyaWFibGUgYXNzaWdubWVudHMsIHdlIG5lZWQgdG8gbGV0Ci0gICAgIHRoZSBiYWNrZW5kIGxpbmtlciBrbm93IGFib3V0IHRoZW0gaW4gY2FzZSB0aGUgdmFyaWFibGVzIGFyZQotICAgICByZWZlcnJlZCB0byBieSBkeW5hbWljIG9iamVjdHMuICAqLwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9hc3NpZ25tZW50KTsKLQotICAvKiBMZXQgdGhlIGJhY2tlbmQgbGlua2VyIHdvcmsgb3V0IHRoZSBzaXplcyBvZiBhbnkgc2VjdGlvbnMKLSAgICAgcmVxdWlyZWQgYnkgZHluYW1pYyBsaW5raW5nLiAgKi8KLSAgaWYgKCEgYmZkX3N1bm9zX3NpemVfZHluYW1pY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgJnNkeW4sCi0JCQkJCSAmc25lZWQsICZzcnVsZXMpKQotICAgIGVpbmZvICgiJVAlRjogZmFpbGVkIHRvIHNldCBkeW5hbWljIHNlY3Rpb24gc2l6ZXM6ICVFXG4iKTsKLQotICBpZiAoc25lZWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgdXAgdGhlIC5uZWVkIHNlY3Rpb24uICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBsZF9uZWVkCi0JIGZpZWxkIGluIGluY2x1ZGUvYW91dC9zdW40LmguICAqLwotCi0gICAgICBuZWVkX2VudHJpZXMgPSAwOwotICAgICAgbmVlZF9zaXplID0gMDsKLQotICAgICAgbGFuZ19mb3JfZWFjaF9pbnB1dF9maWxlIChnbGQke0VNVUxBVElPTl9OQU1FfV9jb3VudF9uZWVkKTsKLQotICAgICAgLyogV2Ugc2hvdWxkIG9ubHkgaGF2ZSBhIC5uZWVkIHNlY3Rpb24gaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUKLQkgZHluYW1pYyBvYmplY3QuICAqLwotICAgICAgQVNTRVJUIChuZWVkX2VudHJpZXMgIT0gMCk7Ci0KLSAgICAgIHNuZWVkLT5fcmF3X3NpemUgPSBuZWVkX3NpemU7Ci0gICAgICBzbmVlZC0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAobmVlZF9zaXplKTsKLQotICAgICAgbmVlZF9jb250ZW50cyA9IHNuZWVkLT5jb250ZW50czsKLSAgICAgIG5lZWRfcGluZm8gPSBzbmVlZC0+Y29udGVudHM7Ci0gICAgICBuZWVkX3BuYW1lcyA9IHNuZWVkLT5jb250ZW50cyArIG5lZWRfZW50cmllcyAqIDE2OwotCi0gICAgICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9uZWVkKTsKLQotICAgICAgQVNTRVJUICgoYmZkX3NpemVfdHlwZSkgKG5lZWRfcG5hbWVzIC0gc25lZWQtPmNvbnRlbnRzKSA9PSBuZWVkX3NpemUpOwotICAgIH0KLQotICBpZiAoc3J1bGVzICE9IE5VTEwpCi0gICAgewotICAgICAgLyogU2V0IHVwIHRoZSAucnVsZXMgc2VjdGlvbi4gIFRoaXMgaXMganVzdCBhIFBBVEggbGlrZSBzdHJpbmcKLQkgb2YgdGhlIC1MIGFyZ3VtZW50cyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgV2UgcGVybWl0IHRoZQotCSB1c2VyIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yaWVzIHVzaW5nIHRoZSAtcnBhdGggY29tbWFuZCBsaW5lCi0JIG9wdGlvbi4gICovCi0gICAgICBpZiAoY29tbWFuZF9saW5lLnJwYXRoKQotCXsKLQkgIHNydWxlcy0+X3Jhd19zaXplID0gc3RybGVuIChjb21tYW5kX2xpbmUucnBhdGgpOwotCSAgc3J1bGVzLT5jb250ZW50cyA9IChiZmRfYnl0ZSAqKSBjb21tYW5kX2xpbmUucnBhdGg7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHVuc2lnbmVkIGludCBzaXplOwotCSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0JICBzaXplID0gMDsKLQkgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JICAgIGlmIChzZWFyY2gtPmNtZGxpbmUpCi0JICAgICAgc2l6ZSArPSBzdHJsZW4gKHNlYXJjaC0+bmFtZSkgKyAxOwotCSAgc3J1bGVzLT5fcmF3X3NpemUgPSBzaXplOwotCSAgaWYgKHNpemUgPiAwKQotCSAgICB7Ci0JICAgICAgY2hhciAqcDsKLQotCSAgICAgIHNydWxlcy0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgeG1hbGxvYyAoc2l6ZSk7Ci0JICAgICAgcCA9IChjaGFyICopIHNydWxlcy0+Y29udGVudHM7Ci0JICAgICAgKnAgPSAnXDAnOwotCSAgICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JCXsKLQkJICBpZiAoc2VhcmNoLT5jbWRsaW5lKQotCQkgICAgewotCQkgICAgICBpZiAocCAhPSAoY2hhciAqKSBzcnVsZXMtPmNvbnRlbnRzKQotCQkJKnArKyA9ICc6JzsKLQkJICAgICAgc3RyY3B5IChwLCBzZWFyY2gtPm5hbWUpOwotCQkgICAgICBwICs9IHN0cmxlbiAocCk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogV2UgbXVzdCBhc3NpZ24gYSB2YWx1ZSB0byBfX0RZTkFNSUMuICBJdCBzaG91bGQgYmUgemVybyBpZiB3ZSBhcmUKLSAgICAgbm90IGRvaW5nIGEgZHluYW1pYyBsaW5rLCBvciB0aGUgc3RhcnQgb2YgdGhlIC5keW5hbWljIHNlY3Rpb24gaWYKLSAgICAgd2UgYXJlIGRvaW5nIG9uZS4gICovCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaGR5bi0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLSAgICAgIGhkeW4tPnUuZGVmLnZhbHVlID0gMDsKLSAgICAgIGlmIChzZHluICE9IE5VTEwpCi0JaGR5bi0+dS5kZWYuc2VjdGlvbiA9IHNkeW47Ci0gICAgICBlbHNlCi0JaGR5bi0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgZG9lcyBvbmUgb2YgdHdvIHRoaW5nczogaWYgdGhlCi0gICB2YXJpYWJsZSBmaW5kX2Fzc2lnbiBpcyBzZXQsIGl0IHNldHMgZm91bmRfYXNzaWduIGlmIGl0IGZpbmRzIGFuCi0gICBhc3NpZ25tZW50IHRvIHRoYXQgdmFyaWFibGU7IG90aGVyd2lzZSBpdCB0ZWxscyB0aGUgYmFja2VuZCBsaW5rZXIKLSAgIGFib3V0IGFsbCBhc3NpZ25tZW50IHN0YXRlbWVudHMsIGluIGNhc2UgdGhleSBhcmUgYXNzaWdubWVudHMgdG8KLSAgIHN5bWJvbHMgd2hpY2ggYXJlIHJlZmVycmVkIHRvIGJ5IGR5bmFtaWMgb2JqZWN0cy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2Fzc2lnbm1lbnQgKHMpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnM7Ci17Ci0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0KLSAgICAgICYmIChmaW5kX2Fzc2lnbiA9PSBOVUxMIHx8ICEgZm91bmRfYXNzaWduKSkKLSAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotfQotCi0vKiBMb29rIHRocm91Z2ggYW4gZXhwcmVzc2lvbiBmb3IgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgaWYgKGZpbmRfYXNzaWduICE9IE5VTEwpCi0JewotCSAgaWYgKHN0cmNtcCAoZmluZF9hc3NpZ24sIGV4cC0+YXNzaWduLmRzdCkgPT0gMCkKLQkgICAgZm91bmRfYXNzaWduID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIGJmZF9zdW5vc19yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICBleHAtPmFzc2lnbi5kc3QpKQotCSAgICBlaW5mbyAoIiVQJUY6IGZhaWxlZCB0byByZWNvcmQgYXNzaWdubWVudCB0byAlczogJUVcbiIsCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkJHtFTVVMQVRJT05fTkFNRX1fZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGQke0VNVUxBVElPTl9OQU1FfV9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZCR7RU1VTEFUSU9OX05BTUV9X2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgLm5lZWQgc2VjdGlvbiwgYW5kIHRoZSBudW1iZXIgb2YgZW50cmllcy4KLSAgIFRoZSBiYWNrZW5kIHdpbGwgc2V0IHRoZSBsZF9uZWVkIGZpZWxkIG9mIHRoZSBkeW5hbWljIGxpbmtpbmcKLSAgIGluZm9ybWF0aW9uIHRvIHBvaW50IHRvIHRoZSAubmVlZCBzZWN0aW9uLiAgU2VlIGluY2x1ZGUvYW91dC9zdW40LmgKLSAgIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X2NvdW50X25lZWQgKGlucCkKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqaW5wOwotewotICBpZiAoaW5wLT50aGVfYmZkICE9IE5VTEwKLSAgICAgICYmIChpbnAtPnRoZV9iZmQtPmZsYWdzICYgRFlOQU1JQykgIT0gMCkKLSAgICB7Ci0gICAgICArK25lZWRfZW50cmllczsKLSAgICAgIG5lZWRfc2l6ZSArPSBORUVEX0VOVFJZX1NJWkU7Ci0gICAgICBpZiAoISBpbnAtPmlzX2FyY2hpdmUpCi0JbmVlZF9zaXplICs9IHN0cmxlbiAoaW5wLT5maWxlbmFtZSkgKyAxOwotICAgICAgZWxzZQotCXsKLQkgIEFTU0VSVCAoaW5wLT5sb2NhbF9zeW1fbmFtZVswXSA9PSAnLScKLQkJICAmJiBpbnAtPmxvY2FsX3N5bV9uYW1lWzFdID09ICdsJyk7Ci0JICBuZWVkX3NpemUgKz0gc3RybGVuIChpbnAtPmxvY2FsX3N5bV9uYW1lICsgMikgKyAxOwotCX0KLSAgICB9Ci19Ci0KLS8qIEZpbGwgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSAubmVlZCBzZWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9uZWVkIChpbnApCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlucDsKLXsKLSAgaWYgKGlucC0+dGhlX2JmZCAhPSBOVUxMCi0gICAgICAmJiAoaW5wLT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBjOwotCi0gICAgICAvKiBUbyByZWFsbHkgZmlsbCBpbiB0aGUgLm5lZWQgc2VjdGlvbiBjb250ZW50cywgd2UgbmVlZCB0byBrbm93Ci0JIHRoZSBmaW5hbCBmaWxlIHBvc2l0aW9uIG9mIHRoZSBzZWN0aW9uLCBidXQgd2UgZG9uJ3QuCi0JIEluc3RlYWQsIHdlIHVzZSBvZmZzZXRzLCBhbmQgcmVseSBvbiB0aGUgQkZEIGJhY2tlbmQgdG8KLQkgZmluaXNoIHRoZSBzZWN0aW9uIHVwIGNvcnJlY3RseS4gIEZJWE1FOiBUYWxrIGFib3V0IGxhY2sgb2YKLQkgcmVmZXJlbnRpYWwgbG9jYWxpdHkuICAqLwotICAgICAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgbmVlZF9wbmFtZXMgLSBuZWVkX2NvbnRlbnRzLCBuZWVkX3BpbmZvKTsKLSAgICAgIGlmICghIGlucC0+aXNfYXJjaGl2ZSkKLQl7Ci0JICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDQpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDAsIG5lZWRfcGluZm8gKyA4KTsKLQkgIGJmZF9wdXRfMTYgKG91dHB1dF9iZmQsIChiZmRfdm1hKSAwLCBuZWVkX3BpbmZvICsgMTApOwotCSAgc3RyY3B5IChuZWVkX3BuYW1lcywgaW5wLT5maWxlbmFtZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNoYXIgKnZlcnN0cjsKLQkgIGludCBtYWosIG1pbjsKLQotCSAgYmZkX3B1dF8zMiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIDB4ODAwMDAwMDAsIG5lZWRfcGluZm8gKyA0KTsKLQkgIG1haiA9IDA7Ci0JICBtaW4gPSAwOwotCSAgdmVyc3RyID0gc3Ryc3RyIChpbnAtPmZpbGVuYW1lLCAiLnNvLiIpOwotCSAgaWYgKHZlcnN0ciAhPSBOVUxMKQotCSAgICBzc2NhbmYgKHZlcnN0ciwgIi5zby4lZC4lZCIsICZtYWosICZtaW4pOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIG1haiwgbmVlZF9waW5mbyArIDgpOwotCSAgYmZkX3B1dF8xNiAob3V0cHV0X2JmZCwgKGJmZF92bWEpIG1pbiwgbmVlZF9waW5mbyArIDEwKTsKLQkgIHN0cmNweSAobmVlZF9wbmFtZXMsIGlucC0+bG9jYWxfc3ltX25hbWUgKyAyKTsKLQl9Ci0KLSAgICAgIGMgPSAobmVlZF9waW5mbyAtIG5lZWRfY29udGVudHMpIC8gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgaWYgKGMgKyAxID49IG5lZWRfZW50cmllcykKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgMCwgbmVlZF9waW5mbyArIDEyKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCAoYmZkX3ZtYSkgKGMgKyAxKSAqIE5FRURfRU5UUllfU0laRSwKLQkJICAgIG5lZWRfcGluZm8gKyAxMik7Ci0KLSAgICAgIG5lZWRfcGluZm8gKz0gTkVFRF9FTlRSWV9TSVpFOwotICAgICAgbmVlZF9wbmFtZXMgKz0gc3RybGVuIChuZWVkX3BuYW1lcykgKyAxOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgKgotZ2xkJHtFTVVMQVRJT05fTkFNRX1fZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotRU9GCi0KLWlmIHRlc3QgLW4gIiRDT01QSUxFX0lOIgotdGhlbgotIyBTY3JpcHRzIGNvbXBpbGVkIGluLgotCi0jIHNlZCBjb21tYW5kcyB0byBxdW90ZSBhbiBsZCBzY3JpcHQgYXMgYSBDIHN0cmluZy4KLXNjPSdzL1siXFxdL1xcJi9nCi1zLyQvXFxuXFwvCi0xcy9eLyIvCi0kcy8kL24iLwotJwotCi1jYXQgPj5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54dWA7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHJgOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiBgc2VkICIkc2MiIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54Ym5gOwotICBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkKLSAgICByZXR1cm4gYHNlZCAiJHNjIiBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueG5gOwotICBlbHNlCi0gICAgcmV0dXJuIGBzZWQgIiRzYyIgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhgOwotfQotRU9GCi0KLWVsc2UKLSMgU2NyaXB0cyByZWFkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi17CQkJICAgICAKLSAgKmlzZmlsZSA9IDE7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHUiOwotICBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpCi0gICAgcmV0dXJuICJsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIiOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhibiI7Ci0gIGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LnhuIjsKLSAgZWxzZQotICAgIHJldHVybiAibGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngiOwotfQotRU9GCi0KLWZpCi0KLWNhdCA+PmUke0VNVUxBVElPTl9OQU1FfS5jIDw8RU9GCi0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfJHtFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9uID0gCi17Ci0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9hZnRlcl9vcGVuLAotICBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X2JlZm9yZV9hbGxvY2F0aW9uLAotICBnbGQke0VNVUxBVElPTl9OQU1FfV9nZXRfc2NyaXB0LAotICAiJHtFTVVMQVRJT05fTkFNRX0iLAotICAiJHtPVVRQVVRfRk9STUFUfSIsCi0gIE5VTEwsIC8qIGZpbmlzaCAqLwotICBnbGQke0VNVUxBVElPTl9OQU1FfV9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cywKLSAgTlVMTCwgLyogb3Blbl9keW5hbWljX2xpYnJhcnkgKi8KLSAgTlVMTCwgLyogcGxhY2Vfb3JwaGFuICovCi0gIGdsZCR7RU1VTEFUSU9OX05BTUV9X3NldF9zeW1ib2xzCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9lbXVsdGVtcGwvdmFuaWxsYS5lbSBiL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUzNmZiLi4wMDAwMDAwCi0tLSBhL2xkL2VtdWx0ZW1wbC92YW5pbGxhLmVtCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyBUaGlzIHNoZWxsIHNjcmlwdCBlbWl0cyBhIEMgZmlsZS4gLSotIEMgLSotCi0jIEl0IGRvZXMgc29tZSBzdWJzdGl0dXRpb25zLgotY2F0ID5lJHtFTVVMQVRJT05fTkFNRX0uYyA8PEVPRgotLyogQSB2YW5pbGxhIGVtdWxhdGlvbiB3aXRoIG5vIGRlZmF1bHRzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHN0ZXZlQGN5Z251cy5jb20KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi1zdGF0aWMgdm9pZCB2YW5pbGxhX2JlZm9yZV9wYXJzZSgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkCi12YW5pbGxhX3NldF9vdXRwdXRfYXJjaCgpCi17Ci0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZSAqLwotICB1bnNpZ25lZCBsb25nICBtYWNoaW5lID0gMDsKLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmUsIG1hY2hpbmUpOwotfQotCi1zdGF0aWMgY2hhciAqCi12YW5pbGxhX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsKLSAgKmlzZmlsZSA9IDA7Ci0gIHJldHVybiAiIjsKLX0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF92YW5pbGxhX2VtdWxhdGlvbiA9IAotewotICB2YW5pbGxhX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBhZnRlcl9vcGVuX2RlZmF1bHQsCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgdmFuaWxsYV9zZXRfb3V0cHV0X2FyY2gsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgdmFuaWxsYV9nZXRfc2NyaXB0LAotICAidmFuaWxsYSIsCi0gICJhLm91dC1zdW5vcy1iaWciCi19OwotRU9GCmRpZmYgLS1naXQgYS9sZC9nZW4tZG9jLnRleGkgYi9sZC9nZW4tZG9jLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzY3MjcuLjAwMDAwMDAKLS0tIGEvbGQvZ2VuLWRvYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gVkFSUzoKLUBjIDEuIEluY2x1c2l2ZW5lc3Mgb2YgdGhpcyBtYW51YWwKLUBzZXQgR0VORVJJQwotCi1AYyAyLiBTcGVjaWZpYyB0YXJnZXQgbWFjaGluZXMKLUBzZXQgSDgzMDAKLUBzZXQgSTk2MAotCi1AYyAzLiBQcm9wZXJ0aWVzIG9mIHRoaXMgY29uZmlndXJhdGlvbgotQGNsZWFyIFNpbmdsZUZvcm1hdAotQHNldCBVc2VzRW52VmFycwotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBDT05GSUdVUkFUSU9OIFZBUlMKLQpkaWZmIC0tZ2l0IGEvbGQvZ2Vuc2NyaXB0cy5zaCBiL2xkL2dlbnNjcmlwdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgyOTRhZjcuLjAwMDAwMDAKLS0tIGEvbGQvZ2Vuc2NyaXB0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0jIS9iaW4vc2gKLSMgZ2Vuc2NyaXB0cy5zaCAtIGdlbmVyYXRlIHRoZSBsZC1lbXVsYXRpb24tdGFyZ2V0IHNwZWNpZmljIGZpbGVzCi0jCi0jIFVzYWdlOiBnZW5zY3JpcHRzLnNoIHNyY2RpciBsaWJkaXIgaG9zdCB0YXJnZXQgdGFyZ2V0X2FsaWFzIFwKLSMgZGVmYXVsdF9lbXVsYXRpb24gbmF0aXZlX2xpYl9kaXJzIHRoaXNfZW11bGF0aW9uIHRvb2xfZGlyCi0jCi0jIFNhbXBsZSB1c2FnZToKLSMgZ2Vuc2NyaXB0cy5zaCAvZGptL2xkLWRldm8vZGV2by9sZCAvdXNyL2xvY2FsL2xpYiBzcGFyYy1zdW4tc3Vub3M0LjEuMyBcCi0jIHNwYXJjLXN1bi1zdW5vczQuMS4zIHNwYXJjLXN1bi1zdW5vczQuMS4zIHN1bjQgIiIgc3VuMyBzcGFyYy1zdW4tc3Vub3M0LjEuMwotIyBwcm9kdWNlcyBzdW4zLnggc3VuMy54Ym4gc3VuMy54biBzdW4zLnhyIHN1bjMueHUgZW1fc3VuMy5jCi0KLXNyY2Rpcj0kMQotbGliZGlyPSQyCi1ob3N0PSQzCi10YXJnZXQ9JDQKLXRhcmdldF9hbGlhcz0kNQotRU1VTEFUSU9OX0xJQlBBVEg9JDYKLU5BVElWRV9MSUJfRElSUz0kNwotRU1VTEFUSU9OX05BTUU9JDgKLXRvb2xfbGliPWBlY2hvICR7bGliZGlyfSB8IHNlZCAtZSAnc3wvbGliJHx8J2AvJHs5LSR0YXJnZXRfYWxpYXN9L2xpYgotCi0jIEluY2x1ZGUgdGhlIGVtdWxhdGlvbi1zcGVjaWZpYyBwYXJhbWV0ZXJzOgotLiAke3NyY2Rpcn0vZW11bHBhcmFtcy8ke0VNVUxBVElPTl9OQU1FfS5zaAotCi1pZiB0ZXN0IC1kIGxkc2NyaXB0czsgdGhlbgotICB0cnVlCi1lbHNlCi0gIG1rZGlyIGxkc2NyaXB0cwotZmkKLQotIyBTZXQgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGgsIGZvciBsaWJyYXJpZXMgbmFtZWQgYnkgLWxmb28uCi0jIElmIExJQl9QQVRIIGlzIGRlZmluZWQgKGUuZy4sIGJ5IE1ha2VmaWxlKSBhbmQgbm9uLWVtcHR5LCBpdCBpcyB1c2VkLgotIyBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGlzIHNldCBoZXJlLgotIwotIyBUaGUgZm9ybWF0IGlzIHRoZSB1c3VhbCBsaXN0IG9mIGNvbG9uLXNlcGFyYXRlZCBkaXJlY3Rvcmllcy4KLSMgVG8gZm9yY2UgYSBsb2dpY2FsbHkgZW1wdHkgTElCX1BBVEgsIGRvIExJQlBBVEg9IjoiLgotCi1pZiBbICJ4JHtMSUJfUEFUSH0iID0gIngiIF0gOyB0aGVuCi0gICMgQ3Jvc3MsIG9yIG5hdGl2ZSBub24tZGVmYXVsdCBlbXVsYXRpb24gbm90IHJlcXVlc3RpbmcgTElCX1BBVEguCi0gIExJQl9QQVRIPQotCi0gIGlmIFsgIngke2hvc3R9IiA9ICJ4JHt0YXJnZXR9IiBdIDsgdGhlbgotICAgIGNhc2UgIiAkRU1VTEFUSU9OX0xJQlBBVEggIiBpbgotICAgICAgKiIgJHtFTVVMQVRJT05fTkFNRX0gIiopCi0gICAgICAgICMgTmF0aXZlLCBhbmQgZGVmYXVsdCBvciBlbXVsYXRpb24gcmVxdWVzdGluZyBMSUJfUEFUSC4KLSAgICAgICAgTElCX1BBVEg9L2xpYjovdXNyL2xpYgotICAgICAgICBpZiBbIC1uICIke05BVElWRV9MSUJfRElSU30iIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9OiR7TkFUSVZFX0xJQl9ESVJTfQotICAgICAgICBmaQotICAgICAgICBpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbGliIF07IHRoZW4KLQkgIExJQl9QQVRIPSR7TElCX1BBVEh9OiR7bGliZGlyfQotICAgICAgICBmaQotICAgICAgICBpZiBbICIke2xpYmRpcn0iICE9IC91c3IvbG9jYWwvbGliIF0gOyB0aGVuCi0JICBMSUJfUEFUSD0ke0xJQl9QQVRIfTovdXNyL2xvY2FsL2xpYgotICAgICAgICBmaQotICAgIGVzYWMKLSAgZmkKLWZpCi0KLSMgQWx3YXlzIHNlYXJjaCAkKHRvb2xkaXIpL2xpYiwgYWthIC91c3IvbG9jYWwvVEFSR0VUL2xpYi4KLUxJQl9QQVRIPSR7TElCX1BBVEh9OiR7dG9vbF9saWJ9Ci0KLUxJQl9TRUFSQ0hfRElSUz1gZWNobyAke0xJQl9QQVRIfSB8IHRyICc6JyAnICcgfCBzZWQgLWUgJ3MvXChbXiBdW14gXSpcKS9TRUFSQ0hfRElSKFwxKTsvZydgCi0KLSMgR2VuZXJhdGUgNSBvciA2IHNjcmlwdCBmaWxlcyBmcm9tIGEgbWFzdGVyIHNjcmlwdCB0ZW1wbGF0ZSBpbgotIyAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2guICBXaGljaCBvbmUgb2YgdGhlIDUgb3IgNgotIyBzY3JpcHQgZmlsZXMgaXMgYWN0dWFsbHkgdXNlZCBkZXBlbmRzIG9uIGNvbW1hbmQgbGluZSBvcHRpb25zIGdpdmVuCi0jIHRvIGxkLiAgKFNDUklQVF9OQU1FIHdhcyBzZXQgaW4gdGhlIGVtdWxwYXJhbXNfZmlsZS4pCi0jCi0jIEEgLnggc2NyaXB0IGZpbGUgaXMgdGhlIGRlZmF1bHQgc2NyaXB0LgotIyBBIC54ciBzY3JpcHQgaXMgZm9yIGxpbmtpbmcgd2l0aG91dCByZWxvY2F0aW9uICgtciBmbGFnKS4KLSMgQSAueHUgc2NyaXB0IGlzIGxpa2UgLnhyLCBidXQgKmRvKiBjcmVhdGUgY29uc3RydWN0b3JzICgtVXIgZmxhZykuCi0jIEEgLnhuIHNjcmlwdCBpcyBmb3IgbGlua2luZyB3aXRoIC1uIGZsYWcgKG1peCB0ZXh0IGFuZCBkYXRhIG9uIHNhbWUgcGFnZSkuCi0jIEEgLnhibiBzY3JpcHQgaXMgZm9yIGxpbmtpbmcgd2l0aCAtTiBmbGFnIChtaXggdGV4dCBhbmQgZGF0YSBvbiBzYW1lIHBhZ2UpLgotIyBBIC54cyBzY3JpcHQgaXMgZm9yIGdlbmVyYXRpbmcgYSBzaGFyZWQgbGlicmFyeSB3aXRoIHRoZSAtLXNoYXJlZAotIyAgIGZsYWc7IGl0IGlzIG9ubHkgZ2VuZXJhdGVkIGlmICRHRU5FUkFURV9TSExJQl9TQ1JJUFQgaXMgc2V0IGJ5IHRoZQotIyAgIGVtdWxhdGlvbiBwYXJhbWV0ZXJzLgotCi1TRUdNRU5UX1NJWkU9JHtTRUdNRU5UX1NJWkUtJHtUQVJHRVRfUEFHRV9TSVpFfX0KLQotIyBEZXRlcm1pbmUgREFUQV9BTElHTk1FTlQgZm9yIHRoZSA1IHZhcmlhbnRzLCB1c2luZwotIyB2YWx1ZXMgc3BlY2lmaWVkIGluIHRoZSBlbXVscGFyYW1zLzxlbXVsYXRpb24+LnNoIGZpbGUgb3IgZGVmYXVsdC4KLQotREFUQV9BTElHTk1FTlRfPSIke0RBVEFfQUxJR05NRU5UXy0ke0RBVEFfQUxJR05NRU5ULUFMSUdOKCR7U0VHTUVOVF9TSVpFfSl9fSIKLURBVEFfQUxJR05NRU5UX249IiR7REFUQV9BTElHTk1FTlRfbi0ke0RBVEFfQUxJR05NRU5UX319IgotREFUQV9BTElHTk1FTlRfTj0iJHtEQVRBX0FMSUdOTUVOVF9OLSR7REFUQV9BTElHTk1FTlQtLn19IgotREFUQV9BTElHTk1FTlRfcj0iJHtEQVRBX0FMSUdOTUVOVF9yLSR7REFUQV9BTElHTk1FTlQtfX0iCi1EQVRBX0FMSUdOTUVOVF91PSIke0RBVEFfQUxJR05NRU5UX3UtJHtEQVRBX0FMSUdOTUVOVF9yfX0iCi0KLUxEX0ZMQUc9cgotREFUQV9BTElHTk1FTlQ9JHtEQVRBX0FMSUdOTUVOVF9yfQotREVGQVVMVF9EQVRBX0FMSUdOTUVOVD0iQUxJR04oJHtTRUdNRU5UX1NJWkV9KSIKLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueHIKLQotTERfRkxBRz11Ci1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX3V9Ci1DT05TVFJVQ1RJTkc9IiAiCi0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9Lnh1Ci0KLUxEX0ZMQUc9Ci1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX30KLVJFTE9DQVRJTkc9IiAiCi0oLiAke3NyY2Rpcn0vc2NyaXB0dGVtcGwvJHtTQ1JJUFRfTkFNRX0uc2MpIHwgc2VkIC1lICcvXiAqJC9kJyA+IFwKLSAgbGRzY3JpcHRzLyR7RU1VTEFUSU9OX05BTUV9LngKLQotTERfRkxBRz1uCi1EQVRBX0FMSUdOTUVOVD0ke0RBVEFfQUxJR05NRU5UX259Ci1URVhUX1NUQVJUX0FERFI9JHtOT05QQUdFRF9URVhUX1NUQVJUX0FERFItJHtURVhUX1NUQVJUX0FERFJ9fQotKC4gJHtzcmNkaXJ9L3NjcmlwdHRlbXBsLyR7U0NSSVBUX05BTUV9LnNjKSB8IHNlZCAtZSAnL14gKiQvZCcgPiBcCi0gIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54bgotCi1MRF9GTEFHPU4KLURBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfTn0KLSguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICBsZHNjcmlwdHMvJHtFTVVMQVRJT05fTkFNRX0ueGJuCi0KLWlmIHRlc3QgLW4gIiRHRU5FUkFURV9TSExJQl9TQ1JJUFQiOyB0aGVuCi0gIExEX0ZMQUc9c2hhcmVkCi0gIERBVEFfQUxJR05NRU5UPSR7REFUQV9BTElHTk1FTlRfcy0ke0RBVEFfQUxJR05NRU5UX319Ci0gIENSRUFURV9TSExJQj0iICIKLSAgIyBOb3RlIHRoYXQgVEVYVF9TVEFSVF9BRERSIGlzIHNldCB0byBOT05QQUdFRF9URVhUX1NUQVJUX0FERFIuCi0gICguICR7c3JjZGlyfS9zY3JpcHR0ZW1wbC8ke1NDUklQVF9OQU1FfS5zYykgfCBzZWQgLWUgJy9eICokL2QnID4gXAotICAgIGxkc2NyaXB0cy8ke0VNVUxBVElPTl9OQU1FfS54cwotZmkKLQotZm9yIGkgaW4gJEVNVUxBVElPTl9MSUJQQVRIIDsgZG8KLSAgdGVzdCAiJGkiID0gIiRFTVVMQVRJT05fTkFNRSIgJiYgQ09NUElMRV9JTj10cnVlCi1kb25lCi0KLSMgR2VuZXJhdGUgZSR7RU1VTEFUSU9OX05BTUV9LmMuCi0uICR7c3JjZGlyfS9lbXVsdGVtcGwvJHtURU1QTEFURV9OQU1FLWdlbmVyaWN9LmVtCmRpZmYgLS1naXQgYS9sZC9oOC1kb2MudGV4aSBiL2xkL2g4LWRvYy50ZXhpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M2MmExLi4wMDAwMDAwCi0tLSBhL2xkL2g4LWRvYy50ZXhpCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gVkFSUzoKLUBjIDEuIEluY2x1c2l2ZW5lc3Mgb2YgdGhpcyBtYW51YWwKLUBjbGVhciBHRU5FUklDCi0KLUBjIDIuIFNwZWNpZmljIHRhcmdldCBtYWNoaW5lcwotQHNldCBIODMwMAotQHNldCBIaXRhY2hpCi1AY2xlYXIgSTk2MAotCi1AYyAzLiBQcm9wZXJ0aWVzIG9mIHRoaXMgY29uZmlndXJhdGlvbgotQHNldCBTaW5nbGVGb3JtYXQKLUBjbGVhciBVc2VzRW52VmFycwotQGMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGVuZCBDT05GSUdVUkFUSU9OIFZBUlMKLQpkaWZmIC0tZ2l0IGEvbGQvbGQuMSBiL2xkL2xkLjEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTE2YjkuLjAwMDAwMDAKLS0tIGEvbGQvbGQuMQorKysgL2Rldi9udWxsCkBAIC0xLDExMTUgKzAsMCBAQAotLlwiIENvcHlyaWdodCAoYykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0uXCIgU2VlIHNlY3Rpb24gQ09QWUlORyBmb3IgY29uZGl0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24KLS5USCBsZCAxICIxNyBBdWd1c3QgMTk5MiIgImN5Z251cyBzdXBwb3J0IiAiR05VIERldmVsb3BtZW50IFRvb2xzIgotLmRlIEJQCi0uc3AKLS50aSBcLS4yaQotXCgqKgotLi4KLQotLlNIIE5BTUUKLWxkIFwtIHRoZSBHTlUgbGlua2VyCi0KLS5TSCBTWU5PUFNJUwotLmh5IDAKLS5uYQotLlRQCi0uQiBsZCAKLS5SQiAiW1x8IiBcLW8gIgotLkkgb3V0cHV0XGMKLVwmXHxdIFxjCi0uSSBvYmpmaWxlXGMKLVwmLlx8Llx8LgotLmJyCi0uUkIgIltcfCIgXC1BXGMKLS5JIGFyY2hpdGVjdHVyZVxjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1iXCAiXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLUJzdGF0aWMgIlx8XSIgIAotLlJCICJbXHwiIFwtQmR5bmFtaWMgIlx8XSIgIAotLlJCICJbXHwiIFwtQnN5bWJvbGljICJcfF0iICAKLS5SQiAiW1x8IiAiXC1jXCAiXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmXHxdIAotLlJCICJbXHwiIFwtXC1jcmVmICJcfF0iCi0uUkIgIltcfCIgXC1kIHwgXC1kYyB8IFwtZHBcYwotXHxdCi0uYnIKLS5SQiAiW1x8IiAiXC1kZWZzeW1cICJcYwotLkkgc3ltYm9sXGMKLVwmID0gXGMKLS5JIGV4cHJlc3Npb25cYwotXCZcfF0KLS5SQiAiW1x8IiBcLVwtZGVtYW5nbGUgIlx8XSIKLS5SQiAiW1x8IiBcLVwtbm9cLWRlbWFuZ2xlICJcfF0iCi0uUkIgIltcfCIgIlwtZVwgIlxjCi0uSSBlbnRyeVxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLWVtYmVkZGVkXC1yZWxvY3MgIlx8XSIKLS5SQiAiW1x8IiBcLUUgIlx8XSIgCi0uUkIgIltcfCIgXC1leHBvcnRcLWR5bmFtaWMgIlx8XSIKLS5SQiAiW1x8IiAiXC1mXCAiXGMKLS5JIG5hbWVcYwotXCZcfF0KLS5SQiAiW1x8IiAiXC1cLWF1eGlsaWFyeVwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtRlwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtXC1maWx0ZXJcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLWZvcm1hdFwgIlxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1nICJcfF0iIAotLlJCICJbXHwiIFwtRwotLkkgc2l6ZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLWhcICJcYwotLkkgbmFtZVxjCi1cJlx8XQotLlJCICJbXHwiICJcLXNvbmFtZVwgIlxjCi0uSSBuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1cLWhlbHAgIlx8XSIKLS5SQiAiW1x8IiBcLWkgIlx8XSIKLS5SQiAiW1x8IiBcLWxcYwotLkkgYXJcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1MXGMKLS5JIHNlYXJjaGRpclxjCi1cJlx8XSAKLS5SQiAiW1x8IiBcLU0gIlx8XSIgCi0uUkIgIltcfCIgXC1NYXAKLS5JIG1hcGZpbGVcYwotXCZcfF0gCi0uUkIgIltcfCIgXC1tCi0uSSBlbXVsYXRpb25cYwotXCZcfF0gCi0uUkIgIltcfCIgXC1uIHwgXC1OICJcfF0iIAotLlJCICJbXHwiIFwtbm9pbmhpYml0LWV4ZWMgIlx8XSIgCi0uUkIgIltcfCIgXC1ub1wta2VlcFwtbWVtb3J5ICJcfF0iIAotLlJCICJbXHwiIFwtbm9cLXdhcm5cLW1pc21hdGNoICJcfF0iIAotLlJCICJbXHwiIFwtT1xjCi0uSSBsZXZlbFxjCi1cJlx8XQotLlJCICJbXHwiICJcLW9mb3JtYXRcICJcYwotLkkgb3V0cHV0LWZvcm1hdFxjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1SXCAiXGMKLS5JIGZpbGVuYW1lXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1yZWxheCAiXHxdIgotLlJCICJbXHwiIFwtciB8IFwtVXIgIlx8XSIgCi0uUkIgIltcfCIgIlwtcnBhdGhcICJcYwotLkkgZGlyZWN0b3J5XGMKLVwmXHxdCi0uUkIgIltcfCIgIlwtcnBhdGhcLWxpbmtcICJcYwotLkkgZGlyZWN0b3J5XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1TICJcfF0iIAotLlJCICJbXHwiIFwtcyAiXHxdIiAKLS5SQiAiW1x8IiBcLXNoYXJlZCAiXHxdIiAKLS5SQiAiW1x8IiBcLXNvcnRcLWNvbW1vbiAiXHxdIiAKLS5SQiAiW1x8IiAiXC1zcGxpdFwtYnlcLXJlbG9jXCAiXGMKLS5JIGNvdW50XGMKLVwmXHxdCi0uUkIgIltcfCIgXC1zcGxpdFwtYnlcLWZpbGUgIlx8XSIgCi0uUkIgIltcfCIgIlwtVFwgIlxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlx8XSAgCi0uUkIgIltcfCIgIlwtVHRleHRcICJcYwotLkkgdGV4dG9yZ1xjCi1cJlx8XSAKLS5SQiAiW1x8IiAiXC1UZGF0YVwgIlxjCi0uSSBkYXRhb3JnXGMKLVwmXHxdIAotLlJCICJbXHwiICJcLVRic3NcICJcYwotLkkgYnNzb3JnXGMKLVwmXHxdCi0uUkIgIltcfCIgXC10ICJcfF0iIAotLlJCICJbXHwiICJcLXVcICJcYwotLkkgc3ltXGMKLVwmXQotLlJCICJbXHwiIFwtViAiXHxdIgotLlJCICJbXHwiIFwtdiAiXHxdIgotLlJCICJbXHwiIFwtXC12ZXJib3NlICJcfF0iCi0uUkIgIltcfCIgXC1cLXZlcnNpb24gIlx8XSIKLS5SQiAiW1x8IiBcLXdhcm5cLWNvbW1vbiAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLWNvbnN0cnVjdG9ycyAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLW11bHRpcGxlXC1ncCAiXHxdIiAKLS5SQiAiW1x8IiBcLXdhcm5cLW9uY2UgIlx8XSIgCi0uUkIgIltcfCIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbiAiXHxdIiAKLS5SQiAiW1x8IiBcLVwtd2hvbGVcLWFyY2hpdmUgIlx8XSIgCi0uUkIgIltcfCIgXC1cLW5vXC13aG9sZVwtYXJjaGl2ZSAiXHxdIiAKLS5SQiAiW1x8IiAiXC1cLXdyYXBcICJcYwotLkkgc3ltYm9sXGMKLVwmXHxdCi0uUkIgIltcfCIgXC1YICJcfF0iIAotLlJCICJbXHwiIFwteCAiXHxdIiAKLS5hZCBiCi0uaHkgMQotLlNIIERFU0NSSVBUSU9OCi1cYwotLkIgbGRcYwotXCYgY29tYmluZXMgYSBudW1iZXIgb2Ygb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzLCByZWxvY2F0ZXMKLXRoZWlyIGRhdGEgYW5kIHRpZXMgdXAgc3ltYm9sIHJlZmVyZW5jZXMuIE9mdGVuIHRoZSBsYXN0IHN0ZXAgaW4KLWJ1aWxkaW5nIGEgbmV3IGNvbXBpbGVkIHByb2dyYW0gdG8gcnVuIGlzIGEgY2FsbCB0byBcYwotLkIgbGRcYwotXCYuCi0KLVxjCi0uQiBsZFxjCi1cJiBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIAotdG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCi1UaGlzIG1hbiBwYWdlIGRvZXMgbm90IGRlc2NyaWJlIHRoZSBjb21tYW5kIGxhbmd1YWdlOyBzZWUgdGhlIGBcfFxjCi0uQiBsZFxjCi1cfCcgZW50cnkgaW4gYFx8XGMKLS5CIGluZm9cYwotXHwnLCBvciB0aGUgbWFudWFsCi0uSQotbGQ6IHRoZSBHTlUgbGlua2VyCi1cJiwgZm9yIGZ1bGwgZGV0YWlscyBvbiB0aGUgY29tbWFuZCBsYW5ndWFnZSBhbmQgb24gb3RoZXIgYXNwZWN0cyBvZgotdGhlIEdOVSBsaW5rZXIuIAotCi1UaGlzIHZlcnNpb24gb2YgXGMKLS5CIGxkXGMKLVwmIHVzZXMgdGhlIGdlbmVyYWwgcHVycG9zZSBCRkQgbGlicmFyaWVzCi10byBvcGVyYXRlIG9uIG9iamVjdCBmaWxlcy4gVGhpcyBhbGxvd3MgXGMKLS5CIGxkXGMKLVwmIHRvIHJlYWQsIGNvbWJpbmUsIGFuZAotd3JpdGUgb2JqZWN0IGZpbGVzIGluIG1hbnkgZGlmZmVyZW50IGZvcm1hdHNcKGVtXCZmb3IgZXhhbXBsZSwgQ09GRiBvcgotXGMKLS5CIGEub3V0XGMKLVwmLiAgRGlmZmVyZW50IGZvcm1hdHMgbWF5IGJlIGxpbmtlZCB0b2dldGhlciB0byBwcm9kdWNlIGFueQotYXZhaWxhYmxlIGtpbmQgb2Ygb2JqZWN0IGZpbGUuICBZb3UgY2FuIHVzZSBgXHxcYwotLkIgb2JqZHVtcCBcLWlcYwotXHwnIHRvIGdldCBhIGxpc3Qgb2YgZm9ybWF0cyBzdXBwb3J0ZWQgb24gdmFyaW91cyBhcmNoaXRlY3R1cmVzOyBzZWUgCi0uQlIgb2JqZHVtcCAoIDEgKS4KLQotQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBHTlUgbGlua2VyIGlzIG1vcmUgaGVscGZ1bCB0aGFuIG90aGVyCi1saW5rZXJzIGluIHByb3ZpZGluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiAgTWFueSBsaW5rZXJzIGFiYW5kb24KLWV4ZWN1dGlvbiBpbW1lZGlhdGVseSB1cG9uIGVuY291bnRlcmluZyBhbiBlcnJvcjsgd2hlbmV2ZXIgcG9zc2libGUsCi1cYwotLkIgbGRcYwotXCYgY29udGludWVzIGV4ZWN1dGluZywgYWxsb3dpbmcgeW91IHRvIGlkZW50aWZ5IG90aGVyIGVycm9ycwotKG9yLCBpbiBzb21lIGNhc2VzLCB0byBnZXQgYW4gb3V0cHV0IGZpbGUgaW4gc3BpdGUgb2YgdGhlIGVycm9yKS4KLQotVGhlIEdOVSBsaW5rZXIgXGMKLS5CIGxkXGMKLVwmIGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKLWFuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoteW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZSwKLWFuZCB0aHJvdWdoIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLQotLlNIIE9QVElPTlMKLVRoZSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucyBtYXkgc2VlbSBpbnRpbWlkYXRpbmcsIGJ1dCBpbgotYWN0dWFsIHByYWN0aWNlIGZldyBvZiB0aGVtIGFyZSB1c2VkIGluIGFueSBwYXJ0aWN1bGFyIGNvbnRleHQuCi1Gb3IgaW5zdGFuY2UsIGEgZnJlcXVlbnQgdXNlIG9mIFxjCi0uQiBsZFxjCi1cJiBpcyB0byBsaW5rIHN0YW5kYXJkIFVuaXgKLW9iamVjdCBmaWxlcyBvbiBhIHN0YW5kYXJkLCBzdXBwb3J0ZWQgVW5peCBzeXN0ZW0uICBPbiBzdWNoIGEgc3lzdGVtLCB0bwotbGluayBhIGZpbGUgXGMKLS5CIGhlbGxvLm9cYwotXCY6Ci0uc3AKLS5icgotJFwgbGRcIFwtb1wgb3V0cHV0XCAvbGliL2NydDAub1wgaGVsbG8ub1wgXC1sYwotLmJyCi0uc3AKLVRoaXMgdGVsbHMgXGMKLS5CIGxkXGMKLVwmIHRvIHByb2R1Y2UgYSBmaWxlIGNhbGxlZCBcYwotLkIgb3V0cHV0XGMKLVwmIGFzIHRoZQotcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgXGMKLS5CIC9saWIvY3J0MC5vXGMKLVwmIHdpdGggXGMKLS5CIGhlbGxvLm9cYwotXCYgYW5kCi10aGUgbGlicmFyeSBcYwotLkIgbGliYy5hXGMKLVwmIHdoaWNoIHdpbGwgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBzZWFyY2gKLWRpcmVjdG9yaWVzLgotCi1UaGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdG8gXGMKLS5CIGxkXGMKLVwmIG1heSBiZSBzcGVjaWZpZWQgaW4gYW55IG9yZGVyLCBhbmQKLW1heSBiZSByZXBlYXRlZCBhdCB3aWxsLiAgRm9yIHRoZSBtb3N0IHBhcnQsIHJlcGVhdGluZyBhbiBvcHRpb24gd2l0aCBhCi1kaWZmZXJlbnQgYXJndW1lbnQgd2lsbCBlaXRoZXIgaGF2ZSBubyBmdXJ0aGVyIGVmZmVjdCwgb3Igb3ZlcnJpZGUgcHJpb3IKLW9jY3VycmVuY2VzICh0aG9zZSBmdXJ0aGVyIHRvIHRoZSBsZWZ0IG9uIHRoZSBjb21tYW5kIGxpbmUpIG9mIGFuCi1vcHRpb24uICAKLQotVGhlIGV4Y2VwdGlvbnNcKGVtXCZ3aGljaCBtYXkgbWVhbmluZ2Z1bGx5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2VcKGVtXCZhcmUKLVxjCi0uQiBcLUFcYwotXCYsIFxjCi0uQiBcLWJcYwotXCYgKG9yIGl0cyBzeW5vbnltIFxjCi0uQiBcLWZvcm1hdFxjCi1cJiksIFxjCi0uQiBcLWRlZnN5bVxjCi1cJiwKLVxjCi0uQiBcLUxcYwotXCYsIFxjCi0uQiBcLWxcYwotXCYsIFxjCi0uQiBcLVJcYwotXCYsIGFuZCBcYwotLkIgXC11XGMKLVwmLgotCi1UaGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgdG8gYmUgbGlua2VkIHRvZ2V0aGVyLCBzaG93biBhcyBcYwotLkkgb2JqZmlsZVxjCi1cJiwKLW1heSBmb2xsb3csIHByZWNlZGUsIG9yIGJlIG1peGVkIGluIHdpdGggY29tbWFuZC1saW5lIG9wdGlvbnM7IHNhdmUgdGhhdAotYW4gXGMKLS5JIG9iamZpbGVcYwotXCYgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbiBhbiBvcHRpb24gZmxhZyBhbmQKLWl0cyBhcmd1bWVudC4KLQotVXN1YWxseSB0aGUgbGlua2VyIGlzIGludm9rZWQgd2l0aCBhdCBsZWFzdCBvbmUgb2JqZWN0IGZpbGUsIGJ1dCBvdGhlcgotZm9ybXMgb2YgYmluYXJ5IGlucHV0IGZpbGVzIGNhbiBhbHNvIGJlIHNwZWNpZmllZCB3aXRoIFxjCi0uQiBcLWxcYwotXCYsCi1cYwotLkIgXC1SXGMKLVwmLCBhbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgXGMKLS5JIG5vXGMKLVwmIGJpbmFyeSBpbnB1dAotZmlsZXMgYXQgYWxsIGFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQKLWlzc3VlcyB0aGUgbWVzc2FnZSBgXHxcYwotLkIgTm8gaW5wdXQgZmlsZXNcYwotXHwnLgotCi1PcHRpb24gYXJndW1lbnRzIG11c3QgZWl0aGVyIGZvbGxvdyB0aGUgb3B0aW9uIGxldHRlciB3aXRob3V0IGludGVydmVuaW5nCi13aGl0ZXNwYWNlLCBvciBiZSBnaXZlbiBhcyBzZXBhcmF0ZSBhcmd1bWVudHMgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQotb3B0aW9uIHRoYXQgcmVxdWlyZXMgdGhlbS4KLQotLlRQCi0uQkkgIi1BIiAiYXJjaGl0ZWN0dXJlIgotSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBcYwotLkIgbGRcYwotXCYsIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKLUludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgXGMKLS5CIGxkXGMKLVwmIGNvbmZpZ3VyYXRpb24sIHRoZQotXGMKLS5JIGFyY2hpdGVjdHVyZVxjCi1cJiBhcmd1bWVudCBpcyBvbmUgb2YgdGhlIHR3by1sZXR0ZXIgbmFtZXMgaWRlbnRpZnlpbmcKLW1lbWJlcnMgb2YgdGhlIDk2MCBmYW1pbHk7IHRoZSBvcHRpb24gc3BlY2lmaWVzIHRoZSBkZXNpcmVkIG91dHB1dAotdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55IGluY29tcGF0aWJsZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGlucHV0IGZpbGVzLgotSXQgYWxzbyBtb2RpZmllcyB0aGUgbGlua2VyJ3Mgc2VhcmNoIHN0cmF0ZWd5IGZvciBhcmNoaXZlIGxpYnJhcmllcywgdG8KLXN1cHBvcnQgdGhlIHVzZSBvZiBsaWJyYXJpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyCi1hcmNoaXRlY3R1cmUsIGJ5IGluY2x1ZGluZyBpbiB0aGUgc2VhcmNoIGxvb3AgbmFtZXMgc3VmZml4ZWQgd2l0aCB0aGUKLXN0cmluZyBpZGVudGlmeWluZyB0aGUgYXJjaGl0ZWN0dXJlLgotCi1Gb3IgZXhhbXBsZSwgaWYgeW91ciBcYwotLkIgbGRcYwotXCYgY29tbWFuZCBsaW5lIGluY2x1ZGVkIGBcfFxjCi0uQiBcLUFDQVxjCi1cfCcgYXMKLXdlbGwgYXMgYFx8XGMKLS5CIFwtbHRyeVxjCi1cfCcsIHRoZSBsaW5rZXIgd291bGQgbG9vayAoaW4gaXRzIGJ1aWx0LWluIHNlYXJjaAotcGF0aHMsIGFuZCBpbiBhbnkgcGF0aHMgeW91IHNwZWNpZnkgd2l0aCBcYwotLkIgXC1MXGMKLVwmKSBmb3IgYSBsaWJyYXJ5IHdpdGgKLXRoZSBuYW1lcwotLnNwCi0uYnIKLXRyeQotLmJyCi1saWJ0cnkuYQotLmJyCi10cnljYQotLmJyCi1saWJ0cnljYS5hCi0uYnIKLS5zcAotCi1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIGBcfFxjCi0uQiBcLUFDQVxjCi1cfCcuCi0KLUZ1dHVyZSByZWxlYXNlcyBvZiBcYwotLkIgbGRcYwotXCYgbWF5IHN1cHBvcnQgc2ltaWxhciBmdW5jdGlvbmFsaXR5IGZvcgotb3RoZXIgYXJjaGl0ZWN0dXJlIGZhbWlsaWVzLgotCi1Zb3UgY2FuIG1lYW5pbmdmdWxseSB1c2UgXGMKLS5CIFwtQVxjCi1cJiBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgaWYKLWFuIGFyY2hpdGVjdHVyZSBmYW1pbHkgYWxsb3dzIGNvbWJpbmF0aW9uIG9mIHRhcmdldCBhcmNoaXRlY3R1cmVzOyBlYWNoCi11c2Ugd2lsbCBhZGQgYW5vdGhlciBwYWlyIG9mIG5hbWUgdmFyaWFudHMgdG8gc2VhcmNoIGZvciB3aGVuIFxjCi0uQiBcLWwKLXNwZWNpZmllcyBhIGxpYnJhcnkuCi0KLS5UUAotLkJJICJcLWIgIiAiaW5wdXQtZm9ybWF0IgotU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzIHRoYXQgZm9sbG93IHRoaXMgb3B0aW9uCi1vbiB0aGUgY29tbWFuZCBsaW5lLiAgWW91IGRvbid0IHVzdWFsbHkgbmVlZCB0byBzcGVjaWZ5IHRoaXMsIGFzCi1cYwotLkIgbGRcYwotXCYgaXMgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYSBkZWZhdWx0IGlucHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCi0uSSBpbnB1dC1mb3JtYXRcYwotXCYgaXMgYSB0ZXh0IHN0cmluZywgdGhlCi1uYW1lIG9mIGEgcGFydGljdWxhciBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBCRkQgbGlicmFyaWVzLiAgCi1cYwotLkIgXC1mb3JtYXQgXGMKLS5JIGlucHV0LWZvcm1hdFxjCi1cJlxjCi1cJiBoYXMgdGhlIHNhbWUgZWZmZWN0LCBhcyBkb2VzIHRoZSBzY3JpcHQgY29tbWFuZAotLkJSIFRBUkdFVCAuCi0KLVlvdSBtYXkgd2FudCB0byB1c2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSBsaW5raW5nIGZpbGVzIHdpdGggYW4gdW51c3VhbAotYmluYXJ5IGZvcm1hdC4gIFlvdSBjYW4gYWxzbyB1c2UgXGMKLS5CIFwtYlxjCi1cJiB0byBzd2l0Y2ggZm9ybWF0cyBleHBsaWNpdGx5ICh3aGVuCi1saW5raW5nIG9iamVjdCBmaWxlcyBvZiBkaWZmZXJlbnQgZm9ybWF0cyksIGJ5IGluY2x1ZGluZwotXGMKLS5CIFwtYiBcYwotLkkgaW5wdXQtZm9ybWF0XGMKLVwmXGMKLVwmIGJlZm9yZSBlYWNoIGdyb3VwIG9mIG9iamVjdCBmaWxlcyBpbiBhCi1wYXJ0aWN1bGFyIGZvcm1hdC4gIAotCi1UaGUgZGVmYXVsdCBmb3JtYXQgaXMgdGFrZW4gZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIEdOVVRBUkdFVFxjCi1cJi4gIFlvdSBjYW4gYWxzbyBkZWZpbmUgdGhlIGlucHV0Ci1mb3JtYXQgZnJvbSBhIHNjcmlwdCwgdXNpbmcgdGhlIGNvbW1hbmQgXGMKLS5CIFRBUkdFVFxjCi1cJi4KLQotLlRQCi0uQiBcLUJzdGF0aWMgCi1EbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbgotcGxhdGZvcm1zIGZvciB3aGljaCBzaGFyZWQgbGlicmFyaWVzIGFyZSBzdXBwb3J0ZWQuCi0KLS5UUAotLkIgXC1CZHluYW1pYwotTGluayBhZ2FpbnN0IGR5bmFtaWMgbGlicmFyaWVzLiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgb24gcGxhdGZvcm1zCi1mb3Igd2hpY2ggc2hhcmVkIGxpYnJhcmllcyBhcmUgc3VwcG9ydGVkLiAgVGhpcyBvcHRpb24gaXMgbm9ybWFsbHkgdGhlCi1kZWZhdWx0IG9uIHN1Y2ggcGxhdGZvcm1zLgotCi0uVFAKLS5CIFwtQnN5bWJvbGljCi1XaGVuIGNyZWF0aW5nIGEgc2hhcmVkIGxpYnJhcnksIGJpbmQgcmVmZXJlbmNlcyB0byBnbG9iYWwgc3ltYm9scyB0bwotdGhlIGRlZmluaXRpb24gd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgaWYgYW55LiAgTm9ybWFsbHksIGl0IGlzCi1wb3NzaWJsZSBmb3IgYSBwcm9ncmFtIGxpbmtlZCBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdG8gb3ZlcnJpZGUgdGhlCi1kZWZpbml0aW9uIHdpdGhpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwKLW9uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotCi0uVFAKLS5CSSAiXC1jICIgImNvbW1hbmRmaWxlIgotRGlyZWN0cyBcYwotLkIgbGRcYwotXCYgdG8gcmVhZCBsaW5rIGNvbW1hbmRzIGZyb20gdGhlIGZpbGUKLVxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJi4gIFRoZXNlIGNvbW1hbmRzIHdpbGwgY29tcGxldGVseSBvdmVycmlkZSBcYwotLkIgbGRcYwotXCYncwotZGVmYXVsdCBsaW5rIGZvcm1hdCAocmF0aGVyIHRoYW4gYWRkaW5nIHRvIGl0KTsgXGMKLS5JIGNvbW1hbmRmaWxlXGMKLVwmIG11c3QKLXNwZWNpZnkgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gZGVzY3JpYmUgdGhlIHRhcmdldCBmb3JtYXQuCi0KLQotWW91IG1heSBhbHNvIGluY2x1ZGUgYSBzY3JpcHQgb2YgbGluayBjb21tYW5kcyBkaXJlY3RseSBpbiB0aGUgY29tbWFuZAotbGluZSBieSBicmFja2V0aW5nIGl0IGJldHdlZW4gYFx8XGMKLS5CIHtcYwotXHwnIGFuZCBgXHxcYwotLkIgfVxjCi1cfCcgY2hhcmFjdGVycy4KLQotLlRQCi0uQiBcLVwtY3JlZgotT3V0cHV0IGEgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgSWYgYSBsaW5rZXIgbWFwIGZpbGUgaXMgYmVpbmcKLWdlbmVyYXRlZCwgdGhlIGNyb3NzIHJlZmVyZW5jZSB0YWJsZSBpcyBwcmludGVkIHRvIHRoZSBtYXAgZmlsZS4KLU90aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgotCi0uVFAKLS5CIFwtZCAKLS5UUAotLkIgXC1kYwotLlRQCi0uQiBcLWRwCi1UaGVzZSB0aHJlZSBvcHRpb25zIGFyZSBlcXVpdmFsZW50OyBtdWx0aXBsZSBmb3JtcyBhcmUgc3VwcG9ydGVkIGZvcgotY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMuICBVc2UgYW55IG9mIHRoZW0gdG8gbWFrZSBcYwotLkIgbGQKLWFzc2lnbiBzcGFjZSB0byBjb21tb24gc3ltYm9scyBldmVuIGlmIGEgcmVsb2NhdGFibGUgb3V0cHV0IGZpbGUgaXMKLXNwZWNpZmllZCAoXGMKLS5CIFwtclxjCi1cJikuICBUaGUgc2NyaXB0IGNvbW1hbmQKLVxjCi0uQiBGT1JDRV9DT01NT05fQUxMT0NBVElPTlxjCi1cJiBoYXMgdGhlIHNhbWUgZWZmZWN0LgotCi0uVFAKLS5CSSAiLWRlZnN5bSAiICJzeW1ib2wiICJcZlIgPSBcZlAiIGV4cHJlc3Npb24KLUNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQotYWRkcmVzcyBnaXZlbiBieSBcYwotLkkgZXhwcmVzc2lvblxjCi1cJi4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uIGFzIG1hbnkKLXRpbWVzIGFzIG5lY2Vzc2FyeSB0byBkZWZpbmUgbXVsdGlwbGUgc3ltYm9scyBpbiB0aGUgY29tbWFuZCBsaW5lLiAgQQotbGltaXRlZCBmb3JtIG9mIGFyaXRobWV0aWMgaXMgc3VwcG9ydGVkIGZvciB0aGUgXGMKLS5JIGV4cHJlc3Npb25cYwotXCYgaW4gdGhpcwotY29udGV4dDogeW91IG1heSBnaXZlIGEgaGV4YWRlY2ltYWwgY29uc3RhbnQgb3IgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcKLXN5bWJvbCwgb3IgdXNlIFxjCi0uQiArXGMKLVwmIGFuZCBcYwotLkIgXC1cYwotXCYgdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCi1jb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgotdXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQuCi0KLS5UUAotLkIgXC1cLWRlbWFuZ2xlCi0uVFAKLS5CIFwtXC1ub1wtZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvcgotbWVzc2FnZXMgYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdAotdHJpZXMgdG8gcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwotdW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMKLUMrKyBtYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwKLWRlbWFuZ2xlIGJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotLkIgQ09MTEVDVF9OT19ERU1BTkdMRQotaXMgc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLQotLlRQCi0uQkkgIi1lICIgImVudHJ5IlxjCi1cJiAKLVVzZSBcYwotLkkgZW50cnlcYwotXCYgYXMgdGhlIGV4cGxpY2l0IHN5bWJvbCBmb3IgYmVnaW5uaW5nIGV4ZWN1dGlvbiBvZiB5b3VyCi1wcm9ncmFtLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBlbnRyeSBwb2ludC4gIFNlZSB0aGUgYFx8XGMKLS5CIGxkXGMKLVx8JyBlbnRyeSBpbiBgXHxcYwotLkIgaW5mb1xjCi1cfCcgZm9yIGEKLWRpc2N1c3Npb24gb2YgZGVmYXVsdHMgYW5kIG90aGVyIHdheXMgb2Ygc3BlY2lmeWluZyB0aGUKLWVudHJ5IHBvaW50LgotCi0uVFAKLS5CIFwtZW1iZWRkZWRcLXJlbG9jcwotVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIHdoZW4gbGlua2luZyBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLAotZ2VuZXJhdGVkIGJ5IHRoZQotLkIgXC1tZW1iZWRkZWRcLXBpYwotb3B0aW9uIHRvIHRoZSBHTlUgY29tcGlsZXIgYW5kIGFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvCi1jcmVhdGUgYSB0YWJsZSB3aGljaCBtYXkgYmUgdXNlZCBhdCBydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoCi13YXMgc3RhdGljYWxseSBpbml0aWFsaXplZCB0byBwb2ludGVyIHZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbgotdGVzdHN1aXRlL2xkLWVtcGljIGZvciBkZXRhaWxzLgotCi0uVFAKLS5CIFwtRQotLlRQCi0uQiBcLWV4cG9ydFwtZHluYW1pYwotV2hlbiBjcmVhdGluZyBhbiBFTEYgZmlsZSwgYWRkIGFsbCBzeW1ib2xzIHRvIHRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZS4KLU5vcm1hbGx5LCB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgY29udGFpbnMgb25seSBzeW1ib2xzIHdoaWNoIGFyZSB1c2VkCi1ieSBhIGR5bmFtaWMgb2JqZWN0LiAgVGhpcyBvcHRpb24gaXMgbmVlZGVkIGZvciBzb21lIHVzZXMgb2YKLS5JIGRsb3Blbi4KLQotLlRQCi0uQkkgIi1mICIgIm5hbWUiCi0uVFAKLS5CSSAiLS1hdXhpbGlhcnkgIiAibmFtZSIKLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfQVVYSUxJQVJZIGZpZWxkCi10byB0aGUgc3BlY2lmaWVkIG5hbWUuICBUaGlzIHRlbGxzIHRoZSBkeW5hbWljIGxpbmtlciB0aGF0IHRoZSBzeW1ib2wKLXRhYmxlIG9mIHRoZSBzaGFyZWQgb2JqZWN0IHNob3VsZCBiZSB1c2VkIGFzIGFuIGF1eGlsaWFyeSBmaWx0ZXIgb24gdGhlCi1zeW1ib2wgdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3QKLS5JIG5hbWUuCi0KLS5UUAotLkJJICItRiAiICJuYW1lIgotLlRQCi0uQkkgIi0tZmlsdGVyICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX0ZJTFRFUiBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgVGhpcyB0ZWxscyB0aGUgZHluYW1pYyBsaW5rZXIgdGhhdCB0aGUgc3ltYm9sIHRhYmxlCi1vZiB0aGUgc2hhcmVkIG9iamVjdCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlciBvbiB0aGUgc3ltYm9sIHRhYmxlIG9mCi10aGUgc2hhcmVkIG9iamVjdAotLkkgbmFtZS4KLQotLlRQCi0uQkkgIlwtZm9ybWF0ICIgImlucHV0XC1mb3JtYXQiCi1TeW5vbnltIGZvciBcYwotLkIgXC1iXGMKLVwmIFxjCi0uSSBpbnB1dFwtZm9ybWF0XGMKLVwmLgotCi0uVFAKLS5CIFwtZwotQWNjZXB0ZWQsIGJ1dCBpZ25vcmVkOyBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHRvb2xzLgotCi0uVFAKLS5CSSAiXC1HICIgInNpemUiXGMKLVNldCB0aGUgbWF4aW11bSBzaXplIG9mIG9iamVjdHMgdG8gYmUgb3B0aW1pemVkIHVzaW5nIHRoZSBHUCByZWdpc3RlcgotdG8KLS5JIHNpemUKLXVuZGVyIE1JUFMgRUNPRkYuICBJZ25vcmVkIGZvciBvdGhlciBvYmplY3QgZmlsZSBmb3JtYXRzLgotCi0uVFAKLS5CSSAiLWggIiAibmFtZSIKLS5UUAotLkJJICItc29uYW1lICIgIm5hbWUiCi1XaGVuIGNyZWF0aW5nIGFuIEVMRiBzaGFyZWQgb2JqZWN0LCBzZXQgdGhlIGludGVybmFsIERUX1NPTkFNRSBmaWVsZCB0bwotdGhlIHNwZWNpZmllZCBuYW1lLiAgV2hlbiBhbiBleGVjdXRhYmxlIGlzIGxpbmtlZCB3aXRoIGEgc2hhcmVkIG9iamVjdAotd2hpY2ggaGFzIGEgRFRfU09OQU1FIGZpZWxkLCB0aGVuIHdoZW4gdGhlIGV4ZWN1dGFibGUgaXMgcnVuIHRoZSBkeW5hbWljCi1saW5rZXIgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIHNoYXJlZCBvYmplY3Qgc3BlY2lmaWVkIGJ5IHRoZSBEVF9TT05BTUUKLWZpZWxkIHJhdGhlciB0aGFuIHRoZSB1c2luZyB0aGUgZmlsZSBuYW1lIGdpdmVuIHRvIHRoZSBsaW5rZXIuCi0KLS5UUAotLkIgXC1cLWhlbHAKLVByaW50IGEgc3VtbWFyeSBvZiB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgb24gdGhlIHN0YW5kYXJkIG91dHB1dCBhbmQgZXhpdC4KLVRoaXMgb3B0aW9uIGFuZAotLkIgXC1cLXZlcnNpb24KLWJlZ2luIHdpdGggdHdvIGRhc2hlcyBpbnN0ZWFkIG9mIG9uZQotZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBHTlUgcHJvZ3JhbXMuICBUaGUgb3RoZXIgb3B0aW9ucyBzdGFydCB3aXRoCi1vbmx5IG9uZSBkYXNoIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgbGlua2Vycy4KLQotLlRQCi0uQiBcLWkKLVBlcmZvcm0gYW4gaW5jcmVtZW50YWwgbGluayAoc2FtZSBhcyBvcHRpb24gXGMKLS5CIFwtclxjCi1cJikuCi0KLS5UUAotLkJJICJcLWwiICJhciJcYwotXCYgCi1BZGQgYW4gYXJjaGl2ZSBmaWxlIFxjCi0uSSBhclxjCi1cJiB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rLiAgVGhpcyAKLW9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLiAgXGMKLS5CIGxkXGMKLVwmIHdpbGwgc2VhcmNoIGl0cwotcGF0aC1saXN0IGZvciBvY2N1cnJlbmNlcyBvZiBcYwotLkIgbGliXGMKLS5JIGFyXGMKLVwmLmFcYwotXCYgZm9yIGV2ZXJ5IFxjCi0uSSBhcgotc3BlY2lmaWVkLgotCi0uVFAKLS5CSSAiXC1MIiAic2VhcmNoZGlyIgotVGhpcyBjb21tYW5kIGFkZHMgcGF0aCBcYwotLkkgc2VhcmNoZGlyXGMKLVwmIHRvIHRoZSBsaXN0IG9mIHBhdGhzIHRoYXQKLVxjCi0uQiBsZFxjCi1cJiB3aWxsIHNlYXJjaCBmb3IgYXJjaGl2ZSBsaWJyYXJpZXMuICBZb3UgbWF5IHVzZSB0aGlzIG9wdGlvbgotYW55IG51bWJlciBvZiB0aW1lcy4KLQotVGhlIGRlZmF1bHQgc2V0IG9mIHBhdGhzIHNlYXJjaGVkICh3aXRob3V0IGJlaW5nIHNwZWNpZmllZCB3aXRoCi1cYwotLkIgXC1MXGMKLVwmKSBkZXBlbmRzIG9uIHdoYXQgZW11bGF0aW9uIG1vZGUgXGMKLS5CIGxkXGMKLVwmIGlzIHVzaW5nLCBhbmQgaW4KLXNvbWUgY2FzZXMgYWxzbyBvbiBob3cgaXQgd2FzIGNvbmZpZ3VyZWQuICAgIFRoZQotcGF0aHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIGEgbGluayBzY3JpcHQgd2l0aCB0aGUgXGMKLS5CIFNFQVJDSF9ESVIKLWNvbW1hbmQuCi0KLS5UUAotLkIgXC1NIAotUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KLWFib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYwotLkIgbGRcYwotXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKLWNvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCi0KLS5UUAotLkJJICJcLU1hcCAiICJtYXBmaWxlIlxjCi1QcmludCB0byB0aGUgZmlsZQotLkkgbWFwZmlsZQotYSBsaW5rIG1hcFwoZW1cJmRpYWdub3N0aWMgaW5mb3JtYXRpb24KLWFib3V0IHdoZXJlIHN5bWJvbHMgYXJlIG1hcHBlZCBieSBcYwotLkIgbGRcYwotXCYsIGFuZCBpbmZvcm1hdGlvbiBvbiBnbG9iYWwKLWNvbW1vbiBzdG9yYWdlIGFsbG9jYXRpb24uCi0KLS5UUAotLkJJICJcLW0gIiAiZW11bGF0aW9uIlxjCi1FbXVsYXRlIHRoZQotLkkgZW11bGF0aW9uCi1saW5rZXIuICBZb3UgY2FuIGxpc3QgdGhlIGF2YWlsYWJsZSBlbXVsYXRpb25zIHdpdGggdGhlCi0uSSBcLVwtdmVyYm9zZQotb3IKLS5JIFwtVgotb3B0aW9ucy4gIFRoaXMgb3B0aW9uIG92ZXJyaWRlcyB0aGUgY29tcGlsZWQtaW4gZGVmYXVsdCwgd2hpY2ggaXMgdGhlCi1zeXN0ZW0gZm9yIHdoaWNoIHlvdSBjb25maWd1cmVkCi0uQlIgbGQgLgotCi0uVFAKLS5CIFwtTiAKLXNwZWNpZmllcyByZWFkYWJsZSBhbmQgd3JpdGFibGUgXGMKLS5CIHRleHRcYwotXCYgYW5kIFxjCi0uQiBkYXRhXGMKLVwmIHNlY3Rpb25zLiBJZgotdGhlIG91dHB1dCBmb3JtYXQgc3VwcG9ydHMgVW5peCBzdHlsZSBtYWdpYyBudW1iZXJzLCB0aGUgb3V0cHV0IGlzCi1tYXJrZWQgYXMgXGMKLS5CIE9NQUdJQ1xjCi1cJi4KLQotV2hlbiB5b3UgdXNlIHRoZSBgXHxcYwotLkIgXC1OXGMKLVwmXHwnIG9wdGlvbiwgdGhlIGxpbmtlciBkb2VzIG5vdCBwYWdlLWFsaWduIHRoZQotZGF0YSBzZWdtZW50LgotCi0uVFAKLS5CIFwtbiAKLXNldHMgdGhlIHRleHQgc2VnbWVudCB0byBiZSByZWFkIG9ubHksIGFuZCBcYwotLkIgTk1BR0lDXGMKLVwmIGlzIHdyaXR0ZW4KLWlmIHBvc3NpYmxlLgotCi0uVFAKLS5CIFwtbm9pbmhpYml0XC1leGVjCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKLWVycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2Vzcy4gIFdpdGggdGhpcyBmbGFnLCB5b3UgY2FuIHNwZWNpZnkgdGhhdAoteW91IHdpc2ggdGhlIG91dHB1dCBmaWxlIHJldGFpbmVkIGV2ZW4gYWZ0ZXIgbm9uLWZhdGFsIGVycm9ycy4KLQotLlRQCi0uQiBcLW5vXC1rZWVwXC1tZW1vcnkKLVRoZSBsaW5rZXIgbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nCi10aGUgc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUKLWxpbmtlciB0byBpbnN0ZWFkIG9wdGltaXplIGZvciBtZW1vcnkgdXNhZ2UsIGJ5IHJlcmVhZGluZyB0aGUgc3ltYm9sCi10YWJsZXMgYXMgbmVjZXNzYXJ5LiAgVGhpcyBtYXkgYmUgcmVxdWlyZWQgaWYgdGhlIGxpbmtlciBydW5zIG91dCBvZgotbWVtb3J5IHNwYWNlIHdoaWxlIGxpbmtpbmcgYSBsYXJnZSBleGVjdXRhYmxlLgotCi0uVFAKLS5CIFwtbm9cLXdhcm5cLW1pc21hdGNoCi1Ob3JtYWxseSB0aGUgbGlua2VyIHdpbGwgZ2l2ZSBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIGxpbmsgdG9nZXRoZXIKLWlucHV0IGZpbGVzIHRoYXQgYXJlIG1pc21hdGNoZWQgZm9yIHNvbWUgcmVhc29uLCBwZXJoYXBzIGJlY2F1c2UgdGhleQotaGF2ZSBiZWVuIGNvbXBpbGVkIGZvciBkaWZmZXJlbnQgcHJvY2Vzc29ycyBvciBmb3IgZGlmZmVyZW50Ci1lbmRpYW5uZXNzZXMuICBUaGlzIG9wdGlvbiB0ZWxscyB0aGUgbGlua2VyIHRoYXQgaXQgc2hvdWxkIHNpbGVudGx5Ci1wZXJtaXQgc3VjaCBwb3NzaWJsZSBlcnJvcnMuICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGgKLWNhcmUsIGluIGNhc2VzIHdoZW4geW91IGhhdmUgdGFrZW4gc29tZSBzcGVjaWFsIGFjdGlvbiB0aGF0IGVuc3VyZXMKLXRoYXQgdGhlIGxpbmtlciBlcnJvcnMgYXJlIGluYXBwcm9wcmlhdGUuCi0KLS5UUAotLkJJICJcLW8gIiAib3V0cHV0IgotLkkgb3V0cHV0XGMKLVwmIGlzIGEgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgXGMKLS5CIGxkXGMKLVwmOyBpZiB0aGlzCi1vcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgYFx8XGMKLS5CIGEub3V0XGMKLVx8JyBpcyB1c2VkIGJ5IGRlZmF1bHQuICBUaGUKLXNjcmlwdCBjb21tYW5kIFxjCi0uQiBPVVRQVVRcYwotXCYgY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotLlRQCi0uQkkgIlwtTyIgImxldmVsIgotR2VuZXJhdGUgb3B0aW1pemVkIG91dHB1dCBmaWxlcy4gIFRoaXMgbWlnaHQgdXNlIHNpZ25pZmljYW50bHkgbW9yZQotdGltZSBhbmQgdGhlcmVmb3JlIHByb2JhYmx5IHNob3VsZCBiZSBlbmFibGVkIG9ubHkgZm9yIGdlbmVyYXRpbmcgdGhlCi1maW5hbCBiaW5hcnkuCi1cYwotLkkgbGV2ZWxcYwotXCYgaXMgc3VwcG9zZWQgdG8gYmUgYSBudW1lcmljIHZhbHVlLiAgQW55IHZhbHVlIGdyZWF0ZXIgdGhhbiB6ZXJvIGVuYWJsZXMKLXRoZSBvcHRpbWl6YXRpb25zLgotCi0uVFAKLS5CSSAiXC1vZm9ybWF0ICIgIm91dHB1dFwtZm9ybWF0IgotU3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBvYmplY3QgZmlsZS4KLVlvdSBkb24ndCB1c3VhbGx5IG5lZWQgdG8gc3BlY2lmeSB0aGlzLCBhcwotXGMKLS5CIGxkXGMKLVwmIGlzIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBhcyBhIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0aGUgbW9zdAotdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4gIFxjCi0uSSBvdXRwdXQtZm9ybWF0XGMKLVwmIGlzIGEgdGV4dCBzdHJpbmcsIHRoZQotbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgQkZEIGxpYnJhcmllcy4gIAotVGhlIHNjcmlwdCBjb21tYW5kCi0uQiBPVVRQVVRfRk9STUFUCi1jYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQgdGhpcyBvcHRpb24gb3ZlcnJpZGVzIGl0LgotCi0uVFAKLS5CSSAiXC1SICIgImZpbGVuYW1lIgotUmVhZCBzeW1ib2wgbmFtZXMgYW5kIHRoZWlyIGFkZHJlc3NlcyBmcm9tIFxjCi0uSSBmaWxlbmFtZVxjCi1cJiwgYnV0IGRvIG5vdAotcmVsb2NhdGUgaXQgb3IgaW5jbHVkZSBpdCBpbiB0aGUgb3V0cHV0LiAgVGhpcyBhbGxvd3MgeW91ciBvdXRwdXQgZmlsZQotdG8gcmVmZXIgc3ltYm9saWNhbGx5IHRvIGFic29sdXRlIGxvY2F0aW9ucyBvZiBtZW1vcnkgZGVmaW5lZCBpbiBvdGhlcgotcHJvZ3JhbXMuCi0KLS5UUAotLkIgXC1yZWxheAotQW4gb3B0aW9uIHdpdGggbWFjaGluZSBkZXBlbmRlbnQgZWZmZWN0cy4gIEN1cnJlbnRseSB0aGlzIG9wdGlvbiBpcyBvbmx5Ci1zdXBwb3J0ZWQgb24gdGhlIEg4LzMwMC4KLQotT24gc29tZSBwbGF0Zm9ybXMsIHVzZSB0aGlzIG9wdGlvbiB0byBwZXJmb3JtIGdsb2JhbCBvcHRpbWl6YXRpb25zIHRoYXQKLWJlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZyBpbiB5b3VyIHByb2dyYW0sIHN1Y2gKLWFzIHJlbGF4aW5nIGFkZHJlc3MgbW9kZXMgYW5kIHN5bnRoZXNpemluZyBuZXcgaW5zdHJ1Y3Rpb25zIGluIHRoZQotb3V0cHV0IG9iamVjdCBmaWxlLiAgCi0KLU9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQsIGBcfFxjCi0uQiBcLXJlbGF4XGMKLVwmXHwnIGlzIGFjY2VwdGVkLCBidXQgaGFzIG5vIGVmZmVjdC4KLQotLlRQCi0uQiBcLXIgCi1HZW5lcmF0ZXMgcmVsb2NhdGFibGUgb3V0cHV0XChlbVwmaS5lLiwgZ2VuZXJhdGUgYW4gb3V0cHV0IGZpbGUgdGhhdCBjYW4gaW4KLXR1cm4gc2VydmUgYXMgaW5wdXQgdG8gXGMKLS5CIGxkXGMKLVwmLiAgVGhpcyBpcyBvZnRlbiBjYWxsZWQgXGMKLS5JIHBhcnRpYWwKLWxpbmtpbmdcYwotXCYuICBBcyBhIHNpZGUgZWZmZWN0LCBpbiBlbnZpcm9ubWVudHMgdGhhdCBzdXBwb3J0IHN0YW5kYXJkIFVuaXgKLW1hZ2ljIG51bWJlcnMsIHRoaXMgb3B0aW9uIGFsc28gc2V0cyB0aGUgb3V0cHV0IGZpbGUncyBtYWdpYyBudW1iZXIgdG8KLVxjCi0uQiBPTUFHSUNcYwotXCYuCi1JZiB0aGlzIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhbiBhYnNvbHV0ZSBmaWxlIGlzIHByb2R1Y2VkLiAgV2hlbgotbGlua2luZyBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIFxjCi0uSSB3aWxsIG5vdFxjCi1cJiByZXNvbHZlIHJlZmVyZW5jZXMgdG8KLWNvbnN0cnVjdG9yczsgXGMKLS5CIFwtVXJcYwotXCYgaXMgYW4gYWx0ZXJuYXRpdmUuIAotCi1UaGlzIG9wdGlvbiBkb2VzIHRoZSBzYW1lIGFzIFxjCi0uQiBcLWlcYwotXCYuCi0KLS5UUAotLkIgXC1ycGF0aFwgXGZJZGlyZWN0b3J5Ci1BZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCi1saW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgCi0uQiBcLXJwYXRoCi1hcmd1bWVudHMgYXJlIGNvbmNhdGVuYXRlZCBhbmQgcGFzc2VkIHRvIHRoZSBydW50aW1lIGxpbmtlciwgd2hpY2ggdXNlcwotdGhlbSB0byBsb2NhdGUgc2hhcmVkIG9iamVjdHMgYXQgcnVudGltZS4gIFRoZQotLkIgXC1ycGF0aAotb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkKLXNoYXJlZCBvYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YKLXRoZQotLkIgXC1ycGF0aFwtbGluawotb3B0aW9uLiAgSWYKLS5CIFwtcnBhdGgKLWlzIG5vdCB1c2VkIHdoZW4gbGlua2luZyBhbiBFTEYgZXhlY3V0YWJsZSwgdGhlIGNvbnRlbnRzIG9mIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGUKLS5CIExEX1JVTl9QQVRICi13aWxsIGJlIHVzZWQgaWYgaXQgaXMgZGVmaW5lZC4KLQotVGhlCi0uQiBcLXJwYXRoCi1vcHRpb24gbWF5IGFsc28gYmUgdXNlZCBvbiBTdW5PUy4gIEJ5IGRlZmF1bHQsIG9uIFN1bk9TLCB0aGUgbGlua2VyCi13aWxsIGZvcm0gYSBydW50aW1lIHNlYXJjaCBwYXRoIG91dCBvZiBhbGwgdGhlCi0uQiBcLUwKLW9wdGlvbnMgaXQgaXMgZ2l2ZW4uICBJZiBhCi0uQiBcLXJwYXRoCi1vcHRpb24gaXMgdXNlZCwgdGhlIHJ1bnRpbWUgc2VhcmNoIHBhdGggd2lsbCBiZSBmb3JtZWQgZXhjbHVzaXZlbHkKLXVzaW5nIHRoZQotLkIgXC1ycGF0aAotb3B0aW9ucywgaWdub3JpbmcKLXRoZQotLkIgXC1MCi1vcHRpb25zLiAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdXNpbmcgZ2NjLCB3aGljaCBhZGRzIG1hbnkKLS5CIFwtTAotb3B0aW9ucyB3aGljaCBtYXkgYmUgb24gTkZTIG1vdW50ZWQgZmlsZXN5c3RlbXMuCi0KLS5UUAotLkIgXC1ycGF0aFwtbGlua1wgXGZJZGlyZWN0b3J5Ci1XaGVuIHVzaW5nIEVMRiBvciBTdW5PUywgb25lIHNoYXJlZCBsaWJyYXJ5IG1heSByZXF1aXJlIGFub3RoZXIuICBUaGlzCi1oYXBwZW5zIHdoZW4gYW4KLS5CIGxkXCBcLXNoYXJlZAotbGluayBpbmNsdWRlcyBhIHNoYXJlZCBsaWJyYXJ5IGFzIG9uZSBvZiB0aGUgaW5wdXQgZmlsZXMuCi0KLVdoZW4gdGhlIGxpbmtlciBlbmNvdW50ZXJzIHN1Y2ggYSBkZXBlbmRlbmN5IHdoZW4gZG9pbmcgYSBub24tc2hhcmVkLAotbm9uLXJlbG9jYXRlYWJsZSBsaW5rLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJ5IHRvIGxvY2F0ZSB0aGUgcmVxdWlyZWQKLXNoYXJlZCBsaWJyYXJ5IGFuZCBpbmNsdWRlIGl0IGluIHRoZSBsaW5rLCBpZiBpdCBpcyBub3QgaW5jbHVkZWQKLWV4cGxpY2l0bHkuICBJbiBzdWNoIGEgY2FzZSwgdGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24gc3BlY2lmaWVzIHRoZSBmaXJzdCBzZXQgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoLiAgVGhlCi0uQiBcLXJwYXRoXC1saW5rCi1vcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMgZWl0aGVyIGJ5IHNwZWNpZnlpbmcKLWEgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieSBhcHBlYXJpbmcgbXVsdGlwbGUgdGltZXMuCi0KLUlmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCi13YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgotCi0uVFAKLS5CIFwtUyAKLU9taXRzIGRlYnVnZ2VyIHN5bWJvbCBpbmZvcm1hdGlvbiAoYnV0IG5vdCBhbGwgc3ltYm9scykgZnJvbSB0aGUgb3V0cHV0IGZpbGUuCi0KLS5UUAotLkIgXC1zIAotT21pdHMgYWxsIHN5bWJvbCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvdXRwdXQgZmlsZS4KLQotLlRQCi0uQiBcLXNoYXJlZAotQ3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuICBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBvbiBFTEYgYW5kCi1TdW5PUyBwbGF0Zm9ybXMgKG9uIFN1bk9TIGl0IGlzIG5vdCByZXF1aXJlZCwgYXMgdGhlIGxpbmtlciB3aWxsCi1hdXRvbWF0aWNhbGx5IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IHdoZW4gdGhlcmUgYXJlIHVuZGVmaW5lZCBzeW1ib2xzCi1hbmQgdGhlCi0uQiBcLWUKLW9wdGlvbiBpcyBub3QgdXNlZCkuCi0KLS5UUAotLkIgXC1zb3J0XC1jb21tb24KLU5vcm1hbGx5LCB3aGVuCi0uQiBsZAotcGxhY2VzIHRoZSBnbG9iYWwgY29tbW9uIHN5bWJvbHMgaW4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dCBzZWN0aW9ucywKLWl0IHNvcnRzIHRoZW0gYnkgc2l6ZS4gIEZpcnN0IGNvbWUgYWxsIHRoZSBvbmUgYnl0ZSBzeW1ib2xzLCB0aGVuIGFsbAotdGhlIHR3byBieXRlcywgdGhlbiBhbGwgdGhlIGZvdXIgYnl0ZXMsIGFuZCB0aGVuIGV2ZXJ5dGhpbmcgZWxzZS4KLVRoaXMgaXMgdG8gcHJldmVudCBnYXBzIGJldHdlZW4gc3ltYm9scyBkdWUgdG8KLWFsaWdubWVudCBjb25zdHJhaW50cy4gIFRoaXMgb3B0aW9uIGRpc2FibGVzIHRoYXQgc29ydGluZy4KLQotLlRQCi0uQiBcLXNwbGl0XC1ieVwtcmVsb2NcIFxmSWNvdW50Ci1UcnlzIHRvIGNyZWF0ZXMgZXh0cmEgc2VjdGlvbnMgaW4gdGhlIG91dHB1dCBmaWxlIHNvIHRoYXQgbm8gc2luZ2xlCi1vdXRwdXQgc2VjdGlvbiBpbiB0aGUgZmlsZSBjb250YWlucyBtb3JlIHRoYW4KLS5JIGNvdW50Ci1yZWxvY2F0aW9ucy4KLVRoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCi1jZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCi1jYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLgotTm90ZSB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIHdvcmsgd2l0aCBvYmplY3QgZmlsZSBmb3JtYXRzIHdoaWNoIGRvIG5vdAotc3VwcG9ydCBhcmJpdHJhcnkgc2VjdGlvbnMuICBUaGUgbGlua2VyIHdpbGwgbm90IHNwbGl0IHVwIGluZGl2aWR1YWwKLWlucHV0IHNlY3Rpb25zIGZvciByZWRpc3RyaWJ1dGlvbiwgc28gaWYgYSBzaW5nbGUgaW5wdXQgc2VjdGlvbgotY29udGFpbnMgbW9yZSB0aGFuCi0uSSBjb3VudAotcmVsb2NhdGlvbnMgb25lIG91dHB1dCBzZWN0aW9uIHdpbGwgY29udGFpbiB0aGF0IG1hbnkgcmVsb2NhdGlvbnMuCi0KLS5UUAotLkIgXC1zcGxpdFwtYnlcLWZpbGUKLVNpbWlsYXIgdG8KLS5CIFwtc3BsaXRcLWJ5XC1yZWxvYwotYnV0IGNyZWF0ZXMgYSBuZXcgb3V0cHV0IHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZS4KLQotLlRQCi0uQkkgIlwtVGJzcyAiICJvcmciXGMKLS5UUAotLkJJICJcLVRkYXRhICIgIm9yZyJcYwotLlRQCi0uQkkgIlwtVHRleHQgIiAib3JnIlxjCi1Vc2UgXGMKLS5JIG9yZ1xjCi1cJiBhcyB0aGUgc3RhcnRpbmcgYWRkcmVzcyBmb3JcKGVtXCZyZXNwZWN0aXZlbHlcKGVtXCZ0aGUKLVxjCi0uQiBic3NcYwotXCYsIFxjCi0uQiBkYXRhXGMKLVwmLCBvciB0aGUgXGMKLS5CIHRleHRcYwotXCYgc2VnbWVudCBvZiB0aGUgb3V0cHV0IGZpbGUuCi1cYwotLkkgb3JnXGMKLVwmIG11c3QgYmUgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLgotCi0uVFAKLS5CSSAiXC1UICIgImNvbW1hbmRmaWxlIgotRXF1aXZhbGVudCB0byBcYwotLkIgXC1jIFxjCi0uSSBjb21tYW5kZmlsZVxjCi1cJlxjCi1cJjsgc3VwcG9ydGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKLW90aGVyIHRvb2xzLiAgCi0KLS5UUAotLkIgXC10IAotUHJpbnRzIG5hbWVzIG9mIGlucHV0IGZpbGVzIGFzIFxjCi0uQiBsZFxjCi1cJiBwcm9jZXNzZXMgdGhlbS4KLQotLlRQCi0uQkkgIlwtdSAiICJzeW0iCi1Gb3JjZXMgXGMKLS5JIHN5bVxjCi1cJiB0byBiZSBlbnRlcmVkIGluIHRoZSBvdXRwdXQgZmlsZSBhcyBhbiB1bmRlZmluZWQgc3ltYm9sLgotVGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbCBtb2R1bGVzIGZyb20KLXN0YW5kYXJkIGxpYnJhcmllcy4gIFxjCi0uQiBcLXVcYwotXCYgbWF5IGJlIHJlcGVhdGVkIHdpdGggZGlmZmVyZW50IG9wdGlvbgotYXJndW1lbnRzIHRvIGVudGVyIGFkZGl0aW9uYWwgdW5kZWZpbmVkIHN5bWJvbHMuCi0KLS5UUAotLkIgXC1VciAKLUZvciBhbnl0aGluZyBvdGhlciB0aGFuIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gaXMgZXF1aXZhbGVudCB0bwotXGMKLS5CIFwtclxjCi1cJjogaXQgZ2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dFwoZW1cJmkuZS4sIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCi10dXJuIHNlcnZlIGFzIGlucHV0IHRvIFxjCi0uQiBsZFxjCi1cJi4gIFdoZW4gbGlua2luZyBDKysgcHJvZ3JhbXMsIFxjCi0uQiBcLVVyCi0uSSB3aWxsXGMKLVwmIHJlc29sdmUgcmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMsIHVubGlrZSBcYwotLkIgXC1yXGMKLVwmLgotCi0uVFAKLS5CIFwtXC12ZXJib3NlCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkCi1hbmQgbGlzdCB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi1EaXNwbGF5IHdoaWNoIGlucHV0IGZpbGVzIGNhbiBhbmQgY2FuIG5vdCBiZSBvcGVuZWQuCi0KLS5UUAotLkIgXC12LCBcLVYKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBcYwotLkIgbGRcYwotXCYuCi1UaGUKLS5CIFwtVgotb3B0aW9uIGFsc28gbGlzdHMgdGhlIHN1cHBvcnRlZCBlbXVsYXRpb25zLgotCi0uVFAKLS5CIFwtXC12ZXJzaW9uCi1EaXNwbGF5IHRoZSB2ZXJzaW9uIG51bWJlciBmb3IgXGMKLS5CIGxkCi1hbmQgZXhpdC4KLQotLlRQCi0uQiBcLXdhcm5cLWNvbW1vbgotV2FybiB3aGVuIGEgY29tbW9uIHN5bWJvbCBpcyBjb21iaW5lZCB3aXRoIGFub3RoZXIgY29tbW9uIHN5bWJvbCBvciB3aXRoCi1hIHN5bWJvbCBkZWZpbml0aW9uLiAgVW5peCBsaW5rZXJzIGFsbG93IHRoaXMgc29tZXdoYXQgc2xvcHB5IHByYWN0aWNlLAotYnV0IGxpbmtlcnMgb24gc29tZSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyBkbyBub3QuICBUaGlzIG9wdGlvbiBhbGxvd3MKLXlvdSB0byBmaW5kIHBvdGVudGlhbCBwcm9ibGVtcyBmcm9tIGNvbWJpbmluZyBnbG9iYWwgc3ltYm9scy4KLQotLlRQCi0uQiBcLXdhcm5cLWNvbnN0cnVjdG9ycwotV2FybiBpZiBhbnkgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhcmUgdXNlZC4gIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGEKLWZldyBvYmplY3QgZmlsZSBmb3JtYXRzLiAgRm9yIGZvcm1hdHMgbGlrZSBDT0ZGIG9yIEVMRiwgdGhlIGxpbmtlciBjYW4KLW5vdCBkZXRlY3QgdGhlIHVzZSBvZiBnbG9iYWwgY29uc3RydWN0b3JzLgotCi0uVFAKLS5CIFwtd2FyblwtbXVsdGlwbGVcLWdwCi1XYXJuIGlmIHRoZSBvdXRwdXQgZmlsZSByZXF1aXJlcyBtdWx0aXBsZSBnbG9iYWwtcG9pbnRlciB2YWx1ZXMuICBUaGlzCi1vcHRpb24gaXMgb25seSBtZWFuaW5nZnVsIGZvciBjZXJ0YWluIHByb2Nlc3NvcnMsIHN1Y2ggYXMgdGhlIEFscGhhLgotCi0uVFAKLS5CIFwtd2Fyblwtb25jZQotT25seSB3YXJuIG9uY2UgZm9yIGVhY2ggdW5kZWZpbmVkIHN5bWJvbCwgcmF0aGVyIHRoYW4gb25jZSBwZXIgbW9kdWxlCi13aGljaCByZWZlcnMgdG8gaXQuCi0KLS5UUAotLkIgXC13YXJuXC1zZWN0aW9uXC1hbGlnbgotV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKLWFsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgotVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0Ci1pcywgaWYgdGhlIFNFQ1RJT05TIGNvbW1hbmQgZG9lcyBub3Qgc3BlY2lmeSBhIHN0YXJ0IGFkZHJlc3MgZm9yIHRoZQotc2VjdGlvbi4KLQotLlRQCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLUZvciBlYWNoIGFyY2hpdmUgbWVudGlvbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgdGhlCi0uQiBcLVwtd2hvbGVcLWFyY2hpdmUKLW9wdGlvbiwgaW5jbHVkZSBldmVyeSBvYmplY3QgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpbiB0aGUgbGluaywgcmF0aGVyCi10aGFuIHNlYXJjaGluZyB0aGUgYXJjaGl2ZSBmb3IgdGhlIHJlcXVpcmVkIG9iamVjdCBmaWxlcy4gIFRoaXMgaXMKLW5vcm1hbGx5IHVzZWQgdG8gdHVybiBhbiBhcmNoaXZlIGZpbGUgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBmb3JjaW5nCi1ldmVyeSBvYmplY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBzaGFyZWQgbGlicmFyeS4KLQotLlRQCi0uQiBcLVwtbm9cLXdob2xlXC1hcmNoaXZlCi1UdXJuIG9mZiB0aGUgZWZmZWN0IG9mIHRoZQotLkIgXC1cLXdob2xlXC1hcmNoaXZlCi1vcHRpb24gZm9yIGFyY2hpdmVzIHdoaWNoIGFwcGVhciBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi0uVFAKLS5CSSAiLS13cmFwICIgInN5bWJvbCIKLVVzZSBhIHdyYXBwZXIgZnVuY3Rpb24gZm9yIAotLkkgc3ltYm9sLgotQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLS5JIHN5bWJvbAotd2lsbCBiZSByZXNvbHZlZCB0bwotLkJJICJfX3dyYXBfIiAic3ltYm9sIi4KLUFueSB1bmRlZmluZWQgcmVmZXJlbmNlIHRvCi0uQkkgIl9fcmVhbF8iICJzeW1ib2wiCi13aWxsIGJlIHJlc29sdmVkIHRvCi0uSSBzeW1ib2wuCi0KLS5UUAotLkIgXC1YIAotRGVsZXRlIGFsbCB0ZW1wb3JhcnkgbG9jYWwgc3ltYm9scy4gIEZvciBtb3N0IHRhcmdldHMsIHRoaXMgaXMgYWxsIGxvY2FsCi1zeW1ib2xzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggYFx8XGMKLS5CIExcYwotXHwnLgotCi0uVFAKLS5CIFwteAotRGVsZXRlIGFsbCBsb2NhbCBzeW1ib2xzLgotCi0uUFAKLQotLlNIIEVOVklST05NRU5UCi1cYwotWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mCi0uQiBsZFxjCi1cJiB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBcYwotLkIgR05VVEFSR0VUXGMKLVwmLgotCi1cYwotLkIgR05VVEFSR0VUXGMKLVwmIGRldGVybWluZXMgdGhlIGlucHV0LWZpbGUgb2JqZWN0IGZvcm1hdCBpZiB5b3UgZG9uJ3QKLXVzZSBcYwotLkIgXC1iXGMKLVwmIChvciBpdHMgc3lub255bSBcYwotLkIgXC1mb3JtYXRcYwotXCYpLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKLW9mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdC4gIElmIHRoZXJlIGlzIG5vCi1cYwotLkIgR05VVEFSR0VUXGMKLVwmIGluIHRoZSBlbnZpcm9ubWVudCwgXGMKLS5CIGxkXGMKLVwmIHVzZXMgdGhlIG5hdHVyYWwgZm9ybWF0Ci1vZiB0aGUgaG9zdC4gSWYgXGMKLS5CIEdOVVRBUkdFVFxjCi1cJiBpcyBzZXQgdG8gXGMKLS5CIGRlZmF1bHRcYwotXCYgdGhlbiBCRkQgYXR0ZW1wdHMgdG8gZGlzY292ZXIgdGhlCi1pbnB1dCBmb3JtYXQgYnkgZXhhbWluaW5nIGJpbmFyeSBpbnB1dCBmaWxlczsgdGhpcyBtZXRob2Qgb2Z0ZW4KLXN1Y2NlZWRzLCBidXQgdGhlcmUgYXJlIHBvdGVudGlhbCBhbWJpZ3VpdGllcywgc2luY2UgdGhlcmUgaXMgbm8gbWV0aG9kCi1vZiBlbnN1cmluZyB0aGF0IHRoZSBtYWdpYyBudW1iZXIgdXNlZCB0byBmbGFnIG9iamVjdC1maWxlIGZvcm1hdHMgaXMKLXVuaXF1ZS4gIEhvd2V2ZXIsIHRoZSBjb25maWd1cmF0aW9uIHByb2NlZHVyZSBmb3IgQkZEIG9uIGVhY2ggc3lzdGVtCi1wbGFjZXMgdGhlIGNvbnZlbnRpb25hbCBmb3JtYXQgZm9yIHRoYXQgc3lzdGVtIGZpcnN0IGluIHRoZSBzZWFyY2gtbGlzdCwKLXNvIGFtYmlndWl0aWVzIGFyZSByZXNvbHZlZCBpbiBmYXZvciBvZiBjb252ZW50aW9uLgotCi0uUFAKLQotLlNIICJTRUUgQUxTTyIKLQotLkJSIG9iamR1bXAgKCAxICkKLS5icgotLmJyCi0uUkIgImBcfCIgbGQgIlx8JyBhbmQgYFx8IiBiaW51dGlscyAiXHwnIgotZW50cmllcyBpbgotLkIgaW5mb1xjCi0uYnIKLS5JIAotbGQ6IHRoZSBHTlUgbGlua2VyXGMKLSwgU3RldmUgQ2hhbWJlcmxhaW4gYW5kIFJvbGFuZCBQZXNjaDsKLS5JCi1UaGUgR05VIEJpbmFyeSBVdGlsaXRpZXNcYwotLCBSb2xhbmQgSC4gUGVzY2guCi0KLS5TSCBDT1BZSU5HCi1Db3B5cmlnaHQgKGMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0uUFAKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCB0aGF0IHRoZQotZW50aXJlIHJlc3VsdGluZyBkZXJpdmVkIHdvcmsgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIGEKLXBlcm1pc3Npb24gbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZS4KLS5QUAotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdHJhbnNsYXRpb25zIG9mIHRoaXMKLW1hbnVhbCBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UsIHVuZGVyIHRoZSBhYm92ZSBjb25kaXRpb25zIGZvciBtb2RpZmllZAotdmVyc2lvbnMsIGV4Y2VwdCB0aGF0IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgbWF5IGJlIGluY2x1ZGVkIGluCi10cmFuc2xhdGlvbnMgYXBwcm92ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBpbnN0ZWFkIG9mIGluCi10aGUgb3JpZ2luYWwgRW5nbGlzaC4KZGlmZiAtLWdpdCBhL2xkL2xkLmggYi9sZC9sZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2E3NDYyLi4wMDAwMDAwCi0tLSBhL2xkL2xkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyogbGQuaCAtLSBnZW5lcmFsIGxpbmtlciBoZWFkZXIgZmlsZQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmbmRlZiBMRF9ICi0jZGVmaW5lIExEX0gKLQotI2lmZGVmIEhBVkVfTE9DQUxFX0gKLSMgaW5jbHVkZSA8bG9jYWxlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9OTFMKLSMgaW5jbHVkZSA8bGliaW50bC5oPgotIyBkZWZpbmUgXyhTdHJpbmcpIGdldHRleHQgKFN0cmluZykKLSMgaWZkZWYgZ2V0dGV4dF9ub29wCi0jICBkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AgKFN0cmluZykKLSMgZWxzZQotIyAgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSMgZW5kaWYKLSNlbHNlCi0vKiBTdHVicyB0aGF0IGRvIHNvbWV0aGluZyBjbG9zZSBlbm91Z2guICAqLwotIyBkZWZpbmUgdGV4dGRvbWFpbihTdHJpbmcpIChTdHJpbmcpCi0jIGRlZmluZSBnZXR0ZXh0KFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGRnZXR0ZXh0KERvbWFpbixNZXNzYWdlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGRjZ2V0dGV4dChEb21haW4sTWVzc2FnZSxUeXBlKSAoTWVzc2FnZSkKLSMgZGVmaW5lIGJpbmR0ZXh0ZG9tYWluKERvbWFpbixEaXJlY3RvcnkpIChEb21haW4pCi0jIGRlZmluZSBfKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIE5fKFN0cmluZykgKFN0cmluZykKLSNlbmRpZgotCi0vKiBMb29rIGluIHRoaXMgZW52aXJvbm1lbnQgbmFtZSBmb3IgdGhlIGxpbmtlciB0byBwcmV0ZW5kIHRvIGJlICovCi0jZGVmaW5lIEVNVUxBVElPTl9FTlZJUk9OICJMREVNVUxBVElPTiIKLS8qIElmIGluIHRoZXJlIGxvb2sgZm9yIHRoZSBzdHJpbmdzOiAqLwotCi0vKiBMb29rIGluIHRoaXMgdmFyaWFibGUgZm9yIGEgdGFyZ2V0IGZvcm1hdCAqLwotI2RlZmluZSBUQVJHRVRfRU5WSVJPTiAiR05VVEFSR0VUIgotCi0vKiBJbnB1dCBzZWN0aW9ucyB3aGljaCBhcmUgcHV0IGluIGEgc2VjdGlvbiBvZiB0aGlzIG5hbWUgYXJlIGFjdHVhbGx5Ci0gICBkaXNjYXJkZWQuICAqLwotI2RlZmluZSBESVNDQVJEX1NFQ1RJT05fTkFNRSAiL0RJU0NBUkQvIgotCi0vKiBBIHdpbGRjYXJkIHNwZWNpZmljYXRpb24uICBUaGlzIGlzIG9ubHkgdXNlZCBpbiBsZGdyYW0ueSwgYnV0IGl0Ci0gICB3aW5kcyB1cCBpbiBsZGdyYW0uaCwgc28gd2UgbmVlZCB0byBkZWZpbmUgaXQgb3V0c2lkZS4gICovCi0KLXN0cnVjdCB3aWxkY2FyZF9zcGVjCi17Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKmV4Y2x1ZGVfbmFtZTsKLSAgYm9vbGVhbiBzb3J0ZWQ7Ci19OwotCi0vKiBFeHRyYSBpbmZvcm1hdGlvbiB3ZSBob2xkIG9uIHNlY3Rpb25zICovCi10eXBlZGVmIHN0cnVjdCAgdXNlcl9zZWN0aW9uX3N0cnVjdAotewotICAvKiBQb2ludGVyIHRvIHRoZSBzZWN0aW9uIHdoZXJlIHRoaXMgZGF0YSB3aWxsIGdvICovCi0gIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKmZpbGU7Ci19IHNlY3Rpb25fdXNlcmRhdGFfdHlwZTsKLQotCi0jZGVmaW5lIGdldF91c2VyZGF0YSh4KSAoKHgpLT51c2VyZGF0YSkKLQotI2RlZmluZSBCWVRFX1NJWkUJKDEpCi0jZGVmaW5lIFNIT1JUX1NJWkUJKDIpCi0jZGVmaW5lIExPTkdfU0laRQkoNCkKLSNkZWZpbmUgUVVBRF9TSVpFCSg4KQotCi0vKiBBTElHTiBtYWNybyBjaGFuZ2VkIHRvIEFMSUdOX04gdG8gYXZvaWQJKi8KLS8qIGNvbmZsaWN0IGluIC91c3IvaW5jbHVkZS9tYWNoaW5lL21hY2hwYXJhbS5oICovCi0vKiBXQVJOSU5HOiBJZiBUSElTIGlzIGEgNjQgYml0IGFkZHJlc3MgYW5kIEJPVU5EQVJZIGlzIGEgMzIgYml0IGludCwKLSAgIHlvdSBtdXN0IGNvZXJjZSBib3VuZGFyeSB0byB0aGUgc2FtZSB0eXBlIGFzIFRISVMuCi0gICA/Pz8gSXMgdGhlcmUgYSBwb3J0YWJsZSB3YXkgdG8gYXZvaWQgdGhpcy4gICovCi0jZGVmaW5lIEFMSUdOX04odGhpcywgYm91bmRhcnkpIFwKLSAgKCgoICh0aGlzKSArICgoYm91bmRhcnkpIC0xKSkgJiAofigoYm91bmRhcnkpLTEpKSkpCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIDEgPT4gYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYHJlbG9jYXRhYmxlX291dHB1dCcuICAqLwotICBib29sZWFuIGZvcmNlX2NvbW1vbl9kZWZpbml0aW9uOwotICBib29sZWFuIHJlbGF4OwotCi0gIC8qIE5hbWUgb2YgcnVudGltZSBpbnRlcnByZXRlciB0byBpbnZva2UuICAqLwotICBjaGFyICppbnRlcnByZXRlcjsKLQotICAvKiBOYW1lIHRvIGdpdmUgcnVudGltZSBsaWJhcnkgZnJvbSB0aGUgLXNvbmFtZSBhcmd1bWVudC4gICovCi0gIGNoYXIgKnNvbmFtZTsKLQotICAvKiBSdW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGggZnJvbSB0aGUgLXJwYXRoIGFyZ3VtZW50LiAgKi8KLSAgY2hhciAqcnBhdGg7Ci0KLSAgLyogTGluayB0aW1lIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aCBmcm9tIHRoZSAtcnBhdGgtbGluawotICAgICBhcmd1bWVudC4gICovCi0gIGNoYXIgKnJwYXRoX2xpbms7Ci0KLSAgLyogQmlnIG9yIGxpdHRsZSBlbmRpYW4gYXMgc2V0IG9uIGNvbW1hbmQgbGluZS4gICovCi0gIGVudW0geyBFTkRJQU5fVU5TRVQgPSAwLCBFTkRJQU5fQklHLCBFTkRJQU5fTElUVExFIH0gZW5kaWFuOwotCi0gIC8qIElmIHRydWUsIGV4cG9ydCBhbGwgc3ltYm9scyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgYW4gRUxGCi0gICAgIGV4ZWN1dGFibGUuICAqLwotICBib29sZWFuIGV4cG9ydF9keW5hbWljOwotCi0gIC8qIElmIHRydWUsIGJ1aWxkIE1JUFMgZW1iZWRkZWQgUElDIHJlbG9jYXRpb24gdGFibGVzIGluIHRoZSBvdXRwdXQKLSAgICAgZmlsZS4gICovCi0gIGJvb2xlYW4gZW1iZWRkZWRfcmVsb2NzOwotCi0gIC8qIElmIHRydWUsIGZvcmNlIGdlbmVyYXRpb24gb2YgYSBmaWxlIHdpdGggYSAuZXhlIGZpbGUuICovCi0gIGJvb2xlYW4gZm9yY2VfZXhlX3N1ZmZpeDsKLQotICAvKiBJZiB0cnVlLCBnZW5lcmF0ZSBhIGNyb3NzIHJlZmVyZW5jZSByZXBvcnQuICAqLwotICBib29sZWFuIGNyZWY7Ci0KLSAgLyogSWYgdHJ1ZSAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBib29sZWFuIHdhcm5fbWlzbWF0Y2g7Ci0KLSAgLyogUmVtb3ZlIHVucmVmZXJlbmNlZCBzZWN0aW9ucz8gICovCi0gIGJvb2xlYW4gZ2Nfc2VjdGlvbnM7Ci0KLSAgLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0IHdob3NlIHN5bWJvbCB0YWJsZSBzaG91bGQgYmUgZmlsdGVyZWQgd2l0aAotICAgICB0aGlzIHNoYXJlZCBvYmplY3QuICBGcm9tIHRoZSAtLWZpbHRlciBvcHRpb24uICAqLwotICBjaGFyICpmaWx0ZXJfc2hsaWI7Ci0KLSAgLyogTmFtZSBvZiBzaGFyZWQgb2JqZWN0IGZvciB3aG9zZSBzeW1ib2wgdGFibGUgdGhpcyBzaGFyZWQgb2JqZWN0Ci0gICAgIGlzIGFuIGF1eGlsaWFyeSBmaWx0ZXIuICBGcm9tIHRoZSAtLWF1eGlsaWFyeSBvcHRpb24uICAqLwotICBjaGFyICoqYXV4aWxpYXJ5X2ZpbHRlcnM7Ci0KLSAgLyogQSB2ZXJzaW9uIHN5bWJvbCB0byBiZSBhcHBsaWVkIHRvIHRoZSBzeW1ib2wgbmFtZXMgZm91bmQgaW4gdGhlCi0gICAgIC5leHBvcnRzIHNlY3Rpb25zLiAgKi8KLSAgY2hhciAqdmVyc2lvbl9leHBvcnRzX3NlY3Rpb247Ci0KLSAgLyogSWYgdHJ1ZSAodGhlIGRlZmF1bHQpIGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzLCBvbmNlIGNvbXB1dGUsCi0gICAgIGZwb3Igb3ZlcmxhcHMuICAqLwotICBib29sZWFuIGNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzOwotICAKLX0gYXJnc190eXBlOwotCi1leHRlcm4gYXJnc190eXBlIGNvbW1hbmRfbGluZTsKLQotdHlwZWRlZiBpbnQgdG9rZW5fY29kZV90eXBlOwotCi10eXBlZGVmIHN0cnVjdCAKLXsKLSAgYmZkX3NpemVfdHlwZSBzcGVjaWZpZWRfZGF0YV9zaXplOwotICBib29sZWFuIG1hZ2ljX2RlbWFuZF9wYWdlZDsKLSAgYm9vbGVhbiBtYWtlX2V4ZWN1dGFibGU7Ci0KLSAgLyogSWYgdHJ1ZSwgZG9pbmcgYSBkeW5hbWljIGxpbmsuICAqLwotICBib29sZWFuIGR5bmFtaWNfbGluazsKLQotICAvKiBJZiB0cnVlLCAtc2hhcmVkIGlzIHN1cHBvcnRlZC4gICovCi0gIC8qID8/PyBBIGJldHRlciB3YXkgdG8gZG8gdGhpcyBpcyBwZXJoYXBzIHRvIGRlZmluZSB0aGlzIGluIHRoZQotICAgICBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3Qgc2luY2UgdGhpcyBpcyByZWFsbHkgYSB0YXJnZXQgZGVwZW5kZW50Ci0gICAgIHBhcmFtZXRlci4gICovCi0gIGJvb2xlYW4gaGFzX3NoYXJlZDsKLQotICAvKiBJZiB0cnVlLCBidWlsZCBjb25zdHJ1Y3RvcnMuICAqLwotICBib29sZWFuIGJ1aWxkX2NvbnN0cnVjdG9yczsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGFib3V0IGFueSBjb25zdHJ1Y3RvcnMuICAqLwotICBib29sZWFuIHdhcm5fY29uc3RydWN0b3JzOwotCi0gIC8qIElmIHRydWUsIHdhcm4gYWJvdXQgbWVyZ2luZyBjb21tb24gc3ltYm9scyB3aXRoIG90aGVycy4gICovCi0gIGJvb2xlYW4gd2Fybl9jb21tb247Ci0KLSAgLyogSWYgdHJ1ZSwgb25seSB3YXJuIG9uY2UgYWJvdXQgYSBwYXJ0aWN1bGFyIHVuZGVmaW5lZCBzeW1ib2wuICAqLwotICBib29sZWFuIHdhcm5fb25jZTsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGlmIG11bHRpcGxlIGdsb2JhbC1wb2ludGVycyBhcmUgbmVlZGVkIChBbHBoYQotICAgICBvbmx5KS4gICovCi0gIGJvb2xlYW4gd2Fybl9tdWx0aXBsZV9ncDsKLQotICAvKiBJZiB0cnVlLCB3YXJuIGlmIHRoZSBzdGFydGluZyBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uCi0gICAgIGNoYW5nZXMgZHVlIHRvIHRoZSBhbGlnbm1lbnQgb2YgYW4gaW5wdXQgc2VjdGlvbi4gICovCi0gIGJvb2xlYW4gd2Fybl9zZWN0aW9uX2FsaWduOwotCi0gIGJvb2xlYW4gc29ydF9jb21tb247Ci0KLSAgYm9vbGVhbiB0ZXh0X3JlYWRfb25seTsKLQotICBjaGFyICptYXBfZmlsZW5hbWU7Ci0gIEZJTEUgKm1hcF9maWxlOwotCi0gIGJvb2xlYW4gc3RhdHM7Ci0KLSAgaW50IHNwbGl0X2J5X3JlbG9jOwotICBib29sZWFuIHNwbGl0X2J5X2ZpbGU7Ci19IGxkX2NvbmZpZ190eXBlOwotCi1leHRlcm4gbGRfY29uZmlnX3R5cGUgY29uZmlnOwotCi10eXBlZGVmIGVudW0KLXsKLSAgbGFuZ19maXJzdF9waGFzZV9lbnVtLAotICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLSAgbGFuZ19maW5hbF9waGFzZV9lbnVtCi19IGxhbmdfcGhhc2VfdHlwZTsKLQotZXh0ZXJuIGJvb2xlYW4gaGFkX3NjcmlwdDsKLWV4dGVybiBib29sZWFuIGZvcmNlX21ha2VfZXhlY3V0YWJsZTsKLQotLyogTm9uLXplcm8gaWYgd2UgYXJlIHByb2Nlc3NpbmcgYSAtLWRlZnN5bSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuICAqLwotZXh0ZXJuIGludCBwYXJzaW5nX2RlZnN5bTsKLQotZXh0ZXJuIGludCB5eXBhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLQotZXh0ZXJuIHZvaWQgYWRkX2NyZWYgUEFSQU1TICgoY29uc3QgY2hhciAqLCBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotZXh0ZXJuIHZvaWQgb3V0cHV0X2NyZWYgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCBjaGVja19ub2Nyb3NzcmVmcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGQudGV4aW5mbyBiL2xkL2xkLnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNWY3YTIuLjAwMDAwMDAKLS0tIGEvbGQvbGQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDQzNjYgKzAsMCBAQAotXGlucHV0IHRleGluZm8KLUBzZXRmaWxlbmFtZSBsZC5pbmZvCi1Ac3luY29kZWluZGV4IGt5IGNwCi1AaW5jbHVkZSBjb25maWdkb2MudGV4aQotQGMgKGNvbmZpZ2RvYy50ZXhpIGlzIGdlbmVyYXRlZCBieSB0aGUgTWFrZWZpbGUpCi1AaW5jbHVkZSBsZHZlci50ZXhpCi0KLUBjIEBzbWFsbGJvb2sKLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogTGQ6IChsZCkuICAgICAgICAgICAgICAgICAgICAgICBUaGUgR05VIGxpbmtlci4KLUVORC1JTkZPLURJUi1FTlRSWQotQGVuZCBmb3JtYXQKLUBlbmQgaWZpbmZvCi0KLUBpZmluZm8KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIEBzY3tnbnV9IGxpbmtlciBMRCB2ZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfS4KLQotQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIG1ha2UgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mCi10aGlzIG1hbnVhbCBwcm92aWRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQotYXJlIHByZXNlcnZlZCBvbiBhbGwgY29waWVzLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGlzCi1tYW51YWwgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZm9yIHZlcmJhdGltIGNvcHlpbmcsIHByb3ZpZGVkIGFsc28gdGhhdAotdGhlIGVudGlyZSByZXN1bHRpbmcgZGVyaXZlZCB3b3JrIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBhCi1wZXJtaXNzaW9uIG5vdGljZSBpZGVudGljYWwgdG8gdGhpcyBvbmUuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRyYW5zbGF0aW9ucyBvZiB0aGlzIG1hbnVhbAotaW50byBhbm90aGVyIGxhbmd1YWdlLCB1bmRlciB0aGUgYWJvdmUgY29uZGl0aW9ucyBmb3IgbW9kaWZpZWQgdmVyc2lvbnMuCi0KLUBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBwcm9jZXNzIHRoaXMgZmlsZSB0aHJvdWdoIFRleCBhbmQgcHJpbnQgdGhlCi1yZXN1bHRzLCBwcm92aWRlZCB0aGUgcHJpbnRlZCBkb2N1bWVudCBjYXJyaWVzIGNvcHlpbmcgcGVybWlzc2lvbgotbm90aWNlIGlkZW50aWNhbCB0byB0aGlzIG9uZSBleGNlcHQgZm9yIHRoZSByZW1vdmFsIG9mIHRoaXMgcGFyYWdyYXBoCi0odGhpcyBwYXJhZ3JhcGggbm90IGJlaW5nIHJlbGV2YW50IHRvIHRoZSBwcmludGVkIG1hbnVhbCkuCi0KLUBlbmQgaWdub3JlCi1AZW5kIGlmaW5mbwotQGlmdGV4Ci1AZmluYWxvdXQKLUBzZXRjaGFwdGVybmV3cGFnZSBvZGQKLUBzZXR0aXRsZSBVc2luZyBMRCwgdGhlIEdOVSBsaW5rZXIKLUB0aXRsZXBhZ2UKLUB0aXRsZSBVc2luZyBsZAotQHN1YnRpdGxlIFRoZSBHTlUgbGlua2VyCi1Ac3AgMQotQHN1YnRpdGxlIEBjb2Rle2xkfSB2ZXJzaW9uIDIKLUBzdWJ0aXRsZSBWZXJzaW9uIEB2YWx1ZXtWRVJTSU9OfQotQGF1dGhvciBTdGV2ZSBDaGFtYmVybGFpbgotQGF1dGhvciBJYW4gTGFuY2UgVGF5bG9yCi1AYXV0aG9yIEN5Z251cyBTb2x1dGlvbnMKLUBwYWdlCi0KLUB0ZXgKLXtccGFyc2tpcD0wcHQKLVxoZmlsbCBDeWdudXMgU29sdXRpb25zXHBhcgotXGhmaWxsIGlhblxAY3lnbnVzLmNvbSwgZG9jXEBjeWdudXMuY29tXHBhcgotXGhmaWxsIHtcaXQgVXNpbmcgTEQsIHRoZSBHTlUgbGlua2VyfVxwYXIKLVxoZmlsbCBFZGl0ZWQgYnkgSmVmZnJleSBPc2llciAoamVmZnJleVxAY3lnbnVzLmNvbSlccGFyCi19Ci1cZ2xvYmFsXHBhcmluZGVudD0wcHQgJSBTdGV2ZSBsaWtlcyBpdCB0aGlzIHdheS4KLUBlbmQgdGV4Ci0KLUB2c2tpcCAwcHQgcGx1cyAxZmlsbGwKLUNvcHlyaWdodCBAY29weXJpZ2h0e30gMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSBjb25kaXRpb25zIGZvciB2ZXJiYXRpbSBjb3B5aW5nLCBwcm92aWRlZCBhbHNvIHRoYXQKLXRoZSBlbnRpcmUgcmVzdWx0aW5nIGRlcml2ZWQgd29yayBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgYQotcGVybWlzc2lvbiBub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lLgotCi1QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB0cmFuc2xhdGlvbnMgb2YgdGhpcyBtYW51YWwKLWludG8gYW5vdGhlciBsYW5ndWFnZSwgdW5kZXIgdGhlIGFib3ZlIGNvbmRpdGlvbnMgZm9yIG1vZGlmaWVkIHZlcnNpb25zLgotQGVuZCB0aXRsZXBhZ2UKLUBlbmQgaWZ0ZXgKLUBjIEZJWE1FOiBUYWxrIGFib3V0IGltcG9ydGFuY2Ugb2YgKm9yZGVyKiBvZiBhcmdzLCBjbWRzIHRvIGxpbmtlciEKLQotQGlmaW5mbwotQG5vZGUgVG9wCi1AdG9wIFVzaW5nIGxkCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBAc2N7Z251fSBsaW5rZXIgbGQgdmVyc2lvbiBAdmFsdWV7VkVSU0lPTn0uCi0KLUBtZW51Ci0qIE92ZXJ2aWV3OjogICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3Ci0qIEludm9jYXRpb246OiAgICAgICAgICAgICAgICAgIEludm9jYXRpb24KLSogU2NyaXB0czo6ICAgICAgICAgICAgICAgICAgICAgTGlua2VyIFNjcmlwdHMKLUBpZnNldCBHRU5FUklDCi0qIE1hY2hpbmUgRGVwZW5kZW50OjogICAgICAgICAgIE1hY2hpbmUgRGVwZW5kZW50IEZlYXR1cmVzCi1AZW5kIGlmc2V0Ci1AaWZjbGVhciBHRU5FUklDCi1AaWZzZXQgSDgzMDAKLSogSDgvMzAwOjogICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIHRoZSBIOC8zMDAKLUBlbmQgaWZzZXQKLUBpZnNldCBIaXRhY2hpCi0qIEhpdGFjaGk6OiAgICAgICAgICAgICAgICAgICAgIGxkIGFuZCBvdGhlciBIaXRhY2hpIG1pY3JvcwotQGVuZCBpZnNldAotQGlmc2V0IEk5NjAKLSogaTk2MDo6ICAgICAgICAgICAgICAgICAgICAgICAgbGQgYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotKiBCRkQ6OiAgICAgICAgICAgICAgICAgICAgICAgICBCRkQKLUBlbmQgaWZjbGVhcgotQGMgRm9sbG93aW5nIGJsYW5rIGxpbmUgcmVxdWlyZWQgZm9yIHJlbWFpbmluZyBidWcgaW4gbWFrZWluZm8gY29uZHMvbWVudXMKLQotKiBSZXBvcnRpbmcgQnVnczo6ICAgICAgICAgICAgICBSZXBvcnRpbmcgQnVncwotKiBNUkk6OiAgICAgICAgICAgICAgICAgICAgICAgICBNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXMKLSogSW5kZXg6OiAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgKLUBlbmQgbWVudQotQGVuZCBpZmluZm8KLQotQG5vZGUgT3ZlcnZpZXcKLUBjaGFwdGVyIE92ZXJ2aWV3Ci0KLUBjaW5kZXggQHNje2dudX0gbGlua2VyCi1AY2luZGV4IHdoYXQgaXMgdGhpcz8KLUBjb2Rle2xkfSBjb21iaW5lcyBhIG51bWJlciBvZiBvYmplY3QgYW5kIGFyY2hpdmUgZmlsZXMsIHJlbG9jYXRlcwotdGhlaXIgZGF0YSBhbmQgdGllcyB1cCBzeW1ib2wgcmVmZXJlbmNlcy4gVXN1YWxseSB0aGUgbGFzdCBzdGVwIGluCi1jb21waWxpbmcgYSBwcm9ncmFtIGlzIHRvIHJ1biBAY29kZXtsZH0uCi0KLUBjb2Rle2xkfSBhY2NlcHRzIExpbmtlciBDb21tYW5kIExhbmd1YWdlIGZpbGVzIHdyaXR0ZW4gaW4KLWEgc3VwZXJzZXQgb2YgQVQmVCdzIExpbmsgRWRpdG9yIENvbW1hbmQgTGFuZ3VhZ2Ugc3ludGF4LAotdG8gcHJvdmlkZSBleHBsaWNpdCBhbmQgdG90YWwgY29udHJvbCBvdmVyIHRoZSBsaW5raW5nIHByb2Nlc3MuCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotVGhpcyB2ZXJzaW9uIG9mIEBjb2Rle2xkfSB1c2VzIHRoZSBnZW5lcmFsIHB1cnBvc2UgQkZEIGxpYnJhcmllcwotdG8gb3BlcmF0ZSBvbiBvYmplY3QgZmlsZXMuIFRoaXMgYWxsb3dzIEBjb2Rle2xkfSB0byByZWFkLCBjb21iaW5lLCBhbmQKLXdyaXRlIG9iamVjdCBmaWxlcyBpbiBtYW55IGRpZmZlcmVudCBmb3JtYXRzLS0tZm9yIGV4YW1wbGUsIENPRkYgb3IKLUBjb2Rle2Eub3V0fS4gIERpZmZlcmVudCBmb3JtYXRzIG1heSBiZSBsaW5rZWQgdG9nZXRoZXIgdG8gcHJvZHVjZSBhbnkKLWF2YWlsYWJsZSBraW5kIG9mIG9iamVjdCBmaWxlLiAgQHhyZWZ7QkZEfSwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1AZW5kIGlmY2xlYXIKLQotQXNpZGUgZnJvbSBpdHMgZmxleGliaWxpdHksIHRoZSBAc2N7Z251fSBsaW5rZXIgaXMgbW9yZSBoZWxwZnVsIHRoYW4gb3RoZXIKLWxpbmtlcnMgaW4gcHJvdmlkaW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uICBNYW55IGxpbmtlcnMgYWJhbmRvbgotZXhlY3V0aW9uIGltbWVkaWF0ZWx5IHVwb24gZW5jb3VudGVyaW5nIGFuIGVycm9yOyB3aGVuZXZlciBwb3NzaWJsZSwKLUBjb2Rle2xkfSBjb250aW51ZXMgZXhlY3V0aW5nLCBhbGxvd2luZyB5b3UgdG8gaWRlbnRpZnkgb3RoZXIgZXJyb3JzCi0ob3IsIGluIHNvbWUgY2FzZXMsIHRvIGdldCBhbiBvdXRwdXQgZmlsZSBpbiBzcGl0ZSBvZiB0aGUgZXJyb3IpLgotCi1Abm9kZSBJbnZvY2F0aW9uCi1AY2hhcHRlciBJbnZvY2F0aW9uCi0KLVRoZSBAc2N7Z251fSBsaW5rZXIgQGNvZGV7bGR9IGlzIG1lYW50IHRvIGNvdmVyIGEgYnJvYWQgcmFuZ2Ugb2Ygc2l0dWF0aW9ucywKLWFuZCB0byBiZSBhcyBjb21wYXRpYmxlIGFzIHBvc3NpYmxlIHdpdGggb3RoZXIgbGlua2Vycy4gIEFzIGEgcmVzdWx0LAoteW91IGhhdmUgbWFueSBjaG9pY2VzIHRvIGNvbnRyb2wgaXRzIGJlaGF2aW9yLgotCi1AaWZzZXQgVXNlc0VudlZhcnMKLUBtZW51Ci0qIE9wdGlvbnM6OiAgICAgICAgICAgICAgICAgICAgIENvbW1hbmQgTGluZSBPcHRpb25zCi0qIEVudmlyb25tZW50OjogICAgICAgICAgICAgICAgIEVudmlyb25tZW50IFZhcmlhYmxlcwotQGVuZCBtZW51Ci0KLUBub2RlIE9wdGlvbnMKLUBzZWN0aW9uIENvbW1hbmQgTGluZSBPcHRpb25zCi1AZW5kIGlmc2V0Ci0KLUBjaW5kZXggY29tbWFuZCBsaW5lCi1AY2luZGV4IG9wdGlvbnMKLVRoZSBsaW5rZXIgc3VwcG9ydHMgYSBwbGV0aG9yYSBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucywgYnV0IGluIGFjdHVhbAotcHJhY3RpY2UgZmV3IG9mIHRoZW0gYXJlIHVzZWQgaW4gYW55IHBhcnRpY3VsYXIgY29udGV4dC4KLUBjaW5kZXggc3RhbmRhcmQgVW5peCBzeXN0ZW0KLUZvciBpbnN0YW5jZSwgYSBmcmVxdWVudCB1c2Ugb2YgQGNvZGV7bGR9IGlzIHRvIGxpbmsgc3RhbmRhcmQgVW5peAotb2JqZWN0IGZpbGVzIG9uIGEgc3RhbmRhcmQsIHN1cHBvcnRlZCBVbml4IHN5c3RlbS4gIE9uIHN1Y2ggYSBzeXN0ZW0sIHRvCi1saW5rIGEgZmlsZSBAY29kZXtoZWxsby5vfToKLQotQHNtYWxsZXhhbXBsZQotbGQgLW8gQHZhcntvdXRwdXR9IC9saWIvY3J0MC5vIGhlbGxvLm8gLWxjCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGlzIHRlbGxzIEBjb2Rle2xkfSB0byBwcm9kdWNlIGEgZmlsZSBjYWxsZWQgQHZhcntvdXRwdXR9IGFzIHRoZQotcmVzdWx0IG9mIGxpbmtpbmcgdGhlIGZpbGUgQGNvZGV7L2xpYi9jcnQwLm99IHdpdGggQGNvZGV7aGVsbG8ub30gYW5kCi10aGUgbGlicmFyeSBAY29kZXtsaWJjLmF9LCB3aGljaCB3aWxsIGNvbWUgZnJvbSB0aGUgc3RhbmRhcmQgc2VhcmNoCi1kaXJlY3Rvcmllcy4gIChTZWUgdGhlIGRpc2N1c3Npb24gb2YgdGhlIEBzYW1wey1sfSBvcHRpb24gYmVsb3cuKQotCi1Tb21lIG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBAY29kZXtsZH0gbWF5IGJlIHNwZWNpZmllZCBhdCBhbnkKLXBvaW50IGluIHRoZSBjb21tYW5kIGxpbmUuICBIb3dldmVyLCBvcHRpb25zIHdoaWNoIHJlZmVyIHRvIGZpbGVzLCBzdWNoCi1hcyBAc2FtcHstbH0gb3IgQHNhbXB7LVR9LCBjYXVzZSB0aGUgZmlsZSB0byBiZSByZWFkIGF0IHRoZSBwb2ludCBhdAotd2hpY2ggdGhlIG9wdGlvbiBhcHBlYXJzIGluIHRoZSBjb21tYW5kIGxpbmUsIHJlbGF0aXZlIHRvIHRoZSBvYmplY3QKLWZpbGVzIGFuZCBvdGhlciBmaWxlIG9wdGlvbnMuICBSZXBlYXRpbmcgbm9uLWZpbGUgb3B0aW9ucyB3aXRoIGEKLWRpZmZlcmVudCBhcmd1bWVudCB3aWxsIGVpdGhlciBoYXZlIG5vIGZ1cnRoZXIgZWZmZWN0LCBvciBvdmVycmlkZSBwcmlvcgotb2NjdXJyZW5jZXMgKHRob3NlIGZ1cnRoZXIgdG8gdGhlIGxlZnQgb24gdGhlIGNvbW1hbmQgbGluZSkgb2YgdGhhdAotb3B0aW9uLiAgT3B0aW9ucyB3aGljaCBtYXkgYmUgbWVhbmluZ2Z1bGx5IHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSBhcmUKLW5vdGVkIGluIHRoZSBkZXNjcmlwdGlvbnMgYmVsb3cuCi0KLUBjaW5kZXggb2JqZWN0IGZpbGVzCi1Ob24tb3B0aW9uIGFyZ3VtZW50cyBhcmUgb2JqZWN0IGZpbGVzIG9yIGFyY2hpdmVzIHdoaWNoIGFyZSB0byBiZSBsaW5rZWQKLXRvZ2V0aGVyLiAgVGhleSBtYXkgZm9sbG93LCBwcmVjZWRlLCBvciBiZSBtaXhlZCBpbiB3aXRoIGNvbW1hbmQtbGluZQotb3B0aW9ucywgZXhjZXB0IHRoYXQgYW4gb2JqZWN0IGZpbGUgYXJndW1lbnQgbWF5IG5vdCBiZSBwbGFjZWQgYmV0d2VlbgotYW4gb3B0aW9uIGFuZCBpdHMgYXJndW1lbnQuCi0KLVVzdWFsbHkgdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggYXQgbGVhc3Qgb25lIG9iamVjdCBmaWxlLCBidXQgeW91IGNhbgotc3BlY2lmeSBvdGhlciBmb3JtcyBvZiBiaW5hcnkgaW5wdXQgZmlsZXMgdXNpbmcgQHNhbXB7LWx9LCBAc2FtcHstUn0sCi1hbmQgdGhlIHNjcmlwdCBjb21tYW5kIGxhbmd1YWdlLiAgSWYgQGVtcGh7bm99IGJpbmFyeSBpbnB1dCBmaWxlcyBhdCBhbGwKLWFyZSBzcGVjaWZpZWQsIHRoZSBsaW5rZXIgZG9lcyBub3QgcHJvZHVjZSBhbnkgb3V0cHV0LCBhbmQgaXNzdWVzIHRoZQotbWVzc2FnZSBAc2FtcHtObyBpbnB1dCBmaWxlc30uCi0KLUlmIHRoZSBsaW5rZXIgY2FuIG5vdCByZWNvZ25pemUgdGhlIGZvcm1hdCBvZiBhbiBvYmplY3QgZmlsZSwgaXQgd2lsbAotYXNzdW1lIHRoYXQgaXQgaXMgYSBsaW5rZXIgc2NyaXB0LiAgQSBzY3JpcHQgc3BlY2lmaWVkIGluIHRoaXMgd2F5Ci1hdWdtZW50cyB0aGUgbWFpbiBsaW5rZXIgc2NyaXB0IHVzZWQgZm9yIHRoZSBsaW5rIChlaXRoZXIgdGhlIGRlZmF1bHQKLWxpbmtlciBzY3JpcHQgb3IgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdXNpbmcgQHNhbXB7LVR9KS4gIFRoaXMgZmVhdHVyZQotcGVybWl0cyB0aGUgbGlua2VyIHRvIGxpbmsgYWdhaW5zdCBhIGZpbGUgd2hpY2ggYXBwZWFycyB0byBiZSBhbiBvYmplY3QKLW9yIGFuIGFyY2hpdmUsIGJ1dCBhY3R1YWxseSBtZXJlbHkgZGVmaW5lcyBzb21lIHN5bWJvbCB2YWx1ZXMsIG9yIHVzZXMKLUBjb2Rle0lOUFVUfSBvciBAY29kZXtHUk9VUH0gdG8gbG9hZCBvdGhlciBvYmplY3RzLiAgTm90ZSB0aGF0Ci1zcGVjaWZ5aW5nIGEgc2NyaXB0IGluIHRoaXMgd2F5IHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gYXVnbWVudCB0aGUgbWFpbgotbGlua2VyIHNjcmlwdDsgaWYgeW91IHdhbnQgdG8gdXNlIHNvbWUgY29tbWFuZCB0aGF0IGxvZ2ljYWxseSBjYW4gb25seQotYXBwZWFyIG9uY2UsIHN1Y2ggYXMgdGhlIEBjb2Rle1NFQ1RJT05TfSBvciBAY29kZXtNRU1PUll9IGNvbW1hbmQsIHlvdQotbXVzdCByZXBsYWNlIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNpbmcgdGhlIEBzYW1wey1UfSBvcHRpb24uCi1AeHJlZntTY3JpcHRzfS4KLQotRm9yIG9wdGlvbnMgd2hvc2UgbmFtZXMgYXJlIGEgc2luZ2xlIGxldHRlciwKLW9wdGlvbiBhcmd1bWVudHMgbXVzdCBlaXRoZXIgZm9sbG93IHRoZSBvcHRpb24gbGV0dGVyIHdpdGhvdXQgaW50ZXJ2ZW5pbmcKLXdoaXRlc3BhY2UsIG9yIGJlIGdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlCi1vcHRpb24gdGhhdCByZXF1aXJlcyB0aGVtLgotCi1Gb3Igb3B0aW9ucyB3aG9zZSBuYW1lcyBhcmUgbXVsdGlwbGUgbGV0dGVycywgZWl0aGVyIG9uZSBkYXNoIG9yIHR3byBjYW4KLXByZWNlZGUgdGhlIG9wdGlvbiBuYW1lOyBmb3IgZXhhbXBsZSwgQHNhbXB7LS1vZm9ybWF0fSBhbmQKLUBzYW1wey0tb2Zvcm1hdH0gYXJlIGVxdWl2YWxlbnQuICBBcmd1bWVudHMgdG8gbXVsdGlwbGUtbGV0dGVyIG9wdGlvbnMKLW11c3QgZWl0aGVyIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBvcHRpb24gbmFtZSBieSBhbiBlcXVhbHMgc2lnbiwgb3IgYmUKLWdpdmVuIGFzIHNlcGFyYXRlIGFyZ3VtZW50cyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIG9wdGlvbiB0aGF0Ci1yZXF1aXJlcyB0aGVtLiAgRm9yIGV4YW1wbGUsIEBzYW1wey0tb2Zvcm1hdCBzcmVjfSBhbmQKLUBzYW1wey0tb2Zvcm1hdD1zcmVjfSBhcmUgZXF1aXZhbGVudC4gIFVuaXF1ZSBhYmJyZXZpYXRpb25zIG9mIHRoZSBuYW1lcwotb2YgbXVsdGlwbGUtbGV0dGVyIG9wdGlvbnMgYXJlIGFjY2VwdGVkLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggLWFAdmFye2tleXdvcmR9Ci1AaXRlbSAtYUB2YXJ7a2V5d29yZH0KLVRoaXMgb3B0aW9uIGlzIHN1cHBvcnRlZCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gIFRoZSBAdmFye2tleXdvcmR9Ci1hcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0aGUgc3RyaW5ncyBAc2FtcHthcmNoaXZlfSwgQHNhbXB7c2hhcmVkfSwgb3IKLUBzYW1we2RlZmF1bHR9LiAgQHNhbXB7LWFhcmNoaXZlfSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0bwotQHNhbXB7LUJzdGF0aWN9LCBhbmQgdGhlIG90aGVyIHR3byBrZXl3b3JkcyBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQKLXRvIEBzYW1wey1CZHluYW1pY30uICBUaGlzIG9wdGlvbiBtYXkgYmUgdXNlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgotCi1AaWZzZXQgSTk2MAotQGNpbmRleCBhcmNoaXRlY3R1cmVzCi1Aa2luZGV4IC1BQHZhcnthcmNofQotQGl0ZW0gLUFAdmFye2FyY2hpdGVjdHVyZX0KLUBraW5kZXggLS1hcmNoaXRlY3R1cmU9QHZhcnthcmNofQotQGl0ZW14IC0tYXJjaGl0ZWN0dXJlPUB2YXJ7YXJjaGl0ZWN0dXJlfQotSW4gdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBAY29kZXtsZH0sIHRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBvbmx5IGZvciB0aGUKLUludGVsIDk2MCBmYW1pbHkgb2YgYXJjaGl0ZWN0dXJlcy4gIEluIHRoYXQgQGNvZGV7bGR9IGNvbmZpZ3VyYXRpb24sIHRoZQotQHZhcnthcmNoaXRlY3R1cmV9IGFyZ3VtZW50IGlkZW50aWZpZXMgdGhlIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlIGluCi10aGUgOTYwIGZhbWlseSwgZW5hYmxpbmcgc29tZSBzYWZlZ3VhcmRzIGFuZCBtb2RpZnlpbmcgdGhlCi1hcmNoaXZlLWxpYnJhcnkgc2VhcmNoIHBhdGguICBAeHJlZntpOTYwLCxAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAKLWZhbWlseX0sIGZvciBkZXRhaWxzLgotCi1GdXR1cmUgcmVsZWFzZXMgb2YgQGNvZGV7bGR9IG1heSBzdXBwb3J0IHNpbWlsYXIgZnVuY3Rpb25hbGl0eSBmb3IKLW90aGVyIGFyY2hpdGVjdHVyZSBmYW1pbGllcy4KLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1AY2luZGV4IGJpbmFyeSBpbnB1dCBmb3JtYXQKLUBraW5kZXggLWIgQHZhcntmb3JtYXR9Ci1Aa2luZGV4IC0tZm9ybWF0PUB2YXJ7Zm9ybWF0fQotQGNpbmRleCBpbnB1dCBmb3JtYXQKLUBjaW5kZXggaW5wdXQgZm9ybWF0Ci1AaXRlbSAtYiBAdmFye2lucHV0LWZvcm1hdH0KLUBpdGVteCAtLWZvcm1hdD1AdmFye2lucHV0LWZvcm1hdH0KLUBjb2Rle2xkfSBtYXkgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUga2luZCBvZiBvYmplY3QKLWZpbGUuICBJZiB5b3VyIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGUKLUBzYW1wey1ifSBvcHRpb24gdG8gc3BlY2lmeSB0aGUgYmluYXJ5IGZvcm1hdCBmb3IgaW5wdXQgb2JqZWN0IGZpbGVzCi10aGF0IGZvbGxvdyB0aGlzIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgRXZlbiB3aGVuIEBjb2Rle2xkfSBpcwotY29uZmlndXJlZCB0byBzdXBwb3J0IGFsdGVybmF0aXZlIG9iamVjdCBmb3JtYXRzLCB5b3UgZG9uJ3QgdXN1YWxseSBuZWVkCi10byBzcGVjaWZ5IHRoaXMsIGFzIEBjb2Rle2xkfSBzaG91bGQgYmUgY29uZmlndXJlZCB0byBleHBlY3QgYXMgYQotZGVmYXVsdCBpbnB1dCBmb3JtYXQgdGhlIG1vc3QgdXN1YWwgZm9ybWF0IG9uIGVhY2ggbWFjaGluZS4KLUB2YXJ7aW5wdXQtZm9ybWF0fSBpcyBhIHRleHQgc3RyaW5nLCB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0Ci1zdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAoWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUgYmluYXJ5Ci1mb3JtYXRzIHdpdGggQHNhbXB7b2JqZHVtcCAtaX0uKQotQHhyZWZ7QkZEfS4KLQotWW91IG1heSB3YW50IHRvIHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIGxpbmtpbmcgZmlsZXMgd2l0aCBhbiB1bnVzdWFsCi1iaW5hcnkgZm9ybWF0LiAgWW91IGNhbiBhbHNvIHVzZSBAc2FtcHstYn0gdG8gc3dpdGNoIGZvcm1hdHMgZXhwbGljaXRseSAod2hlbgotbGlua2luZyBvYmplY3QgZmlsZXMgb2YgZGlmZmVyZW50IGZvcm1hdHMpLCBieSBpbmNsdWRpbmcKLUBzYW1wey1iIEB2YXJ7aW5wdXQtZm9ybWF0fX0gYmVmb3JlIGVhY2ggZ3JvdXAgb2Ygb2JqZWN0IGZpbGVzIGluIGEKLXBhcnRpY3VsYXIgZm9ybWF0LiAgCi0KLVRoZSBkZWZhdWx0IGZvcm1hdCBpcyB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotQGNvZGV7R05VVEFSR0VUfS4KLUBpZnNldCBVc2VzRW52VmFycwotQHhyZWZ7RW52aXJvbm1lbnR9LgotQGVuZCBpZnNldAotWW91IGNhbiBhbHNvIGRlZmluZSB0aGUgaW5wdXQgZm9ybWF0IGZyb20gYSBzY3JpcHQsIHVzaW5nIHRoZSBjb21tYW5kCi1AY29kZXtUQVJHRVR9OyBzZWUgQHJlZntGb3JtYXQgQ29tbWFuZHN9LgotQGVuZCBpZmNsZWFyCi0KLUBraW5kZXggLWMgQHZhcntNUkktY21kZmlsZX0KLUBraW5kZXggLS1tcmktc2NyaXB0PUB2YXJ7TVJJLWNtZGZpbGV9Ci1AY2luZGV4IGNvbXBhdGliaWxpdHksIE1SSQotQGl0ZW0gLWMgQHZhcntNUkktY29tbWFuZGZpbGV9Ci1AaXRlbXggLS1tcmktc2NyaXB0PUB2YXJ7TVJJLWNvbW1hbmRmaWxlfQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsaW5rZXJzIHByb2R1Y2VkIGJ5IE1SSSwgQGNvZGV7bGR9IGFjY2VwdHMgc2NyaXB0Ci1maWxlcyB3cml0dGVuIGluIGFuIGFsdGVybmF0ZSwgcmVzdHJpY3RlZCBjb21tYW5kIGxhbmd1YWdlLCBkZXNjcmliZWQgaW4KLUByZWZ7TVJJLCxNUkkgQ29tcGF0aWJsZSBTY3JpcHQgRmlsZXN9LiAgSW50cm9kdWNlIE1SSSBzY3JpcHQgZmlsZXMgd2l0aAotdGhlIG9wdGlvbiBAc2FtcHstY307IHVzZSB0aGUgQHNhbXB7LVR9IG9wdGlvbiB0byBydW4gbGlua2VyCi1zY3JpcHRzIHdyaXR0ZW4gaW4gdGhlIGdlbmVyYWwtcHVycG9zZSBAY29kZXtsZH0gc2NyaXB0aW5nIGxhbmd1YWdlLgotSWYgQHZhcntNUkktY21kZmlsZX0gZG9lcyBub3QgZXhpc3QsIEBjb2Rle2xkfSBsb29rcyBmb3IgaXQgaW4gdGhlIGRpcmVjdG9yaWVzCi1zcGVjaWZpZWQgYnkgYW55IEBzYW1wey1MfSBvcHRpb25zLgotCi1AY2luZGV4IGNvbW1vbiBhbGxvY2F0aW9uCi1Aa2luZGV4IC1kCi1Aa2luZGV4IC1kYwotQGtpbmRleCAtZHAKLUBpdGVtIC1kIAotQGl0ZW14IC1kYwotQGl0ZW14IC1kcAotVGhlc2UgdGhyZWUgb3B0aW9ucyBhcmUgZXF1aXZhbGVudDsgbXVsdGlwbGUgZm9ybXMgYXJlIHN1cHBvcnRlZCBmb3IKLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBsaW5rZXJzLiAgVGhleSBhc3NpZ24gc3BhY2UgdG8gY29tbW9uIHN5bWJvbHMKLWV2ZW4gaWYgYSByZWxvY2F0YWJsZSBvdXRwdXQgZmlsZSBpcyBzcGVjaWZpZWQgKHdpdGggQHNhbXB7LXJ9KS4gIFRoZQotc2NyaXB0IGNvbW1hbmQgQGNvZGV7Rk9SQ0VfQ09NTU9OX0FMTE9DQVRJT059IGhhcyB0aGUgc2FtZSBlZmZlY3QuCi1AeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzfS4KLQotQGNpbmRleCBlbnRyeSBwb2ludCwgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLWUgQHZhcntlbnRyeX0KLUBraW5kZXggLS1lbnRyeT1AdmFye2VudHJ5fQotQGl0ZW0gLWUgQHZhcntlbnRyeX0gCi1AaXRlbXggLS1lbnRyeT1AdmFye2VudHJ5fQotVXNlIEB2YXJ7ZW50cnl9IGFzIHRoZSBleHBsaWNpdCBzeW1ib2wgZm9yIGJlZ2lubmluZyBleGVjdXRpb24gb2YgeW91cgotcHJvZ3JhbSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgZW50cnkgcG9pbnQuICBJZiB0aGVyZSBpcyBubyBzeW1ib2wKLW5hbWVkIEB2YXJ7ZW50cnl9LCB0aGUgbGlua2VyIHdpbGwgdHJ5IHRvIHBhcnNlIEB2YXJ7ZW50cnl9IGFzIGEgbnVtYmVyLAotYW5kIHVzZSB0aGF0IGFzIHRoZSBlbnRyeSBhZGRyZXNzICh0aGUgbnVtYmVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgaW4KLWJhc2UgMTA7IHlvdSBtYXkgdXNlIGEgbGVhZGluZyBAc2FtcHsweH0gZm9yIGJhc2UgMTYsIG9yIGEgbGVhZGluZwotQHNhbXB7MH0gZm9yIGJhc2UgOCkuICBAeHJlZntFbnRyeSBQb2ludH0sIGZvciBhIGRpc2N1c3Npb24gb2YgZGVmYXVsdHMKLWFuZCBvdGhlciB3YXlzIG9mIHNwZWNpZnlpbmcgdGhlIGVudHJ5IHBvaW50LgotCi1AY2luZGV4IGR5bmFtaWMgc3ltYm9sIHRhYmxlCi1Aa2luZGV4IC1FCi1Aa2luZGV4IC0tZXhwb3J0LWR5bmFtaWMKLUBpdGVtIC1FCi1AaXRlbXggLS1leHBvcnQtZHluYW1pYwotV2hlbiBjcmVhdGluZyBhIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlLCBhZGQgYWxsIHN5bWJvbHMgdG8gdGhlCi1keW5hbWljIHN5bWJvbCB0YWJsZS4gIFRoZSBkeW5hbWljIHN5bWJvbCB0YWJsZSBpcyB0aGUgc2V0IG9mIHN5bWJvbHMKLXdoaWNoIGFyZSB2aXNpYmxlIGZyb20gZHluYW1pYyBvYmplY3RzIGF0IHJ1biB0aW1lLgotCi1JZiB5b3UgZG8gbm90IHVzZSB0aGlzIG9wdGlvbiwgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIHdpbGwgbm9ybWFsbHkKLWNvbnRhaW4gb25seSB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZSByZWZlcmVuY2VkIGJ5IHNvbWUgZHluYW1pYyBvYmplY3QKLW1lbnRpb25lZCBpbiB0aGUgbGluay4KLQotSWYgeW91IHVzZSBAY29kZXtkbG9wZW59IHRvIGxvYWQgYSBkeW5hbWljIG9iamVjdCB3aGljaCBuZWVkcyB0byByZWZlcgotYmFjayB0byB0aGUgc3ltYm9scyBkZWZpbmVkIGJ5IHRoZSBwcm9ncmFtLCByYXRoZXIgdGhhbiBzb21lIG90aGVyCi1keW5hbWljIG9iamVjdCwgdGhlbiB5b3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIHVzZSB0aGlzIG9wdGlvbiB3aGVuCi1saW5raW5nIHRoZSBwcm9ncmFtIGl0c2VsZi4KLQotQGNpbmRleCBiaWctZW5kaWFuIG9iamVjdHMKLUBjaW5kZXggZW5kaWFubmVzcwotQGtpbmRleCAtRUIKLUBpdGVtIC1FQgotTGluayBiaWctZW5kaWFuIG9iamVjdHMuICBUaGlzIGFmZmVjdHMgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdC4KLQotQGNpbmRleCBsaXR0bGUtZW5kaWFuIG9iamVjdHMKLUBraW5kZXggLUVMCi1AaXRlbSAtRUwKLUxpbmsgbGl0dGxlLWVuZGlhbiBvYmplY3RzLiAgVGhpcyBhZmZlY3RzIHRoZSBkZWZhdWx0IG91dHB1dCBmb3JtYXQuCi0KLUBraW5kZXggLWYKLUBraW5kZXggLS1hdXhpbGlhcnkKLUBpdGVtIC1mCi1AaXRlbXggLS1hdXhpbGlhcnkgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9BVVhJTElBUlkgZmllbGQKLXRvIHRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbAotdGFibGUgb2YgdGhlIHNoYXJlZCBvYmplY3Qgc2hvdWxkIGJlIHVzZWQgYXMgYW4gYXV4aWxpYXJ5IGZpbHRlciBvbiB0aGUKLXN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LgotCi1JZiB5b3UgbGF0ZXIgbGluayBhIHByb2dyYW0gYWdhaW5zdCB0aGlzIGZpbHRlciBvYmplY3QsIHRoZW4sIHdoZW4geW91Ci1ydW4gdGhlIHByb2dyYW0sIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHNlZSB0aGUgRFRfQVVYSUxJQVJZIGZpZWxkLiAgSWYKLXRoZSBkeW5hbWljIGxpbmtlciByZXNvbHZlcyBhbnkgc3ltYm9scyBmcm9tIHRoZSBmaWx0ZXIgb2JqZWN0LCBpdCB3aWxsCi1maXJzdCBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBpbiB0aGUgc2hhcmVkIG9iamVjdAotQHZhcntuYW1lfS4gIElmIHRoZXJlIGlzIG9uZSwgaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmluaXRpb24KLWluIHRoZSBmaWx0ZXIgb2JqZWN0LiAgVGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfSBuZWVkIG5vdCBleGlzdC4KLVRodXMgdGhlIHNoYXJlZCBvYmplY3QgQHZhcntuYW1lfSBtYXkgYmUgdXNlZCB0byBwcm92aWRlIGFuIGFsdGVybmF0aXZlCi1pbXBsZW1lbnRhdGlvbiBvZiBjZXJ0YWluIGZ1bmN0aW9ucywgcGVyaGFwcyBmb3IgZGVidWdnaW5nIG9yIGZvcgotbWFjaGluZSBzcGVjaWZpYyBwZXJmb3JtYW5jZS4KLQotVGhpcyBvcHRpb24gbWF5IGJlIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZS4gIFRoZSBEVF9BVVhJTElBUlkgZW50cmllcwotd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBvbiB0aGUgY29tbWFuZCBsaW5lLgotCi1Aa2luZGV4IC1GCi1Aa2luZGV4IC0tZmlsdGVyCi1AaXRlbSAtRiBAdmFye25hbWV9Ci1AaXRlbXggLS1maWx0ZXIgQHZhcntuYW1lfQotV2hlbiBjcmVhdGluZyBhbiBFTEYgc2hhcmVkIG9iamVjdCwgc2V0IHRoZSBpbnRlcm5hbCBEVF9GSUxURVIgZmllbGQgdG8KLXRoZSBzcGVjaWZpZWQgbmFtZS4gIFRoaXMgdGVsbHMgdGhlIGR5bmFtaWMgbGlua2VyIHRoYXQgdGhlIHN5bWJvbCB0YWJsZQotb2YgdGhlIHNoYXJlZCBvYmplY3Qgd2hpY2ggaXMgYmVpbmcgY3JlYXRlZCBzaG91bGQgYmUgdXNlZCBhcyBhIGZpbHRlcgotb24gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LgotCi1JZiB5b3UgbGF0ZXIgbGluayBhIHByb2dyYW0gYWdhaW5zdCB0aGlzIGZpbHRlciBvYmplY3QsIHRoZW4sIHdoZW4geW91Ci1ydW4gdGhlIHByb2dyYW0sIHRoZSBkeW5hbWljIGxpbmtlciB3aWxsIHNlZSB0aGUgRFRfRklMVEVSIGZpZWxkLiAgVGhlCi1keW5hbWljIGxpbmtlciB3aWxsIHJlc29sdmUgc3ltYm9scyBhY2NvcmRpbmcgdG8gdGhlIHN5bWJvbCB0YWJsZSBvZiB0aGUKLWZpbHRlciBvYmplY3QgYXMgdXN1YWwsIGJ1dCBpdCB3aWxsIGFjdHVhbGx5IGxpbmsgdG8gdGhlIGRlZmluaXRpb25zCi1mb3VuZCBpbiB0aGUgc2hhcmVkIG9iamVjdCBAdmFye25hbWV9LiAgVGh1cyB0aGUgZmlsdGVyIG9iamVjdCBjYW4gYmUKLXVzZWQgdG8gc2VsZWN0IGEgc3Vic2V0IG9mIHRoZSBzeW1ib2xzIHByb3ZpZGVkIGJ5IHRoZSBvYmplY3QKLUB2YXJ7bmFtZX0uCi0KLVNvbWUgb2xkZXIgbGlua2VycyB1c2VkIHRoZSBAY29kZXstRn0gb3B0aW9uIHRocm91Z2hvdXQgYSBjb21waWxhdGlvbgotdG9vbGNoYWluIGZvciBzcGVjaWZ5aW5nIG9iamVjdC1maWxlIGZvcm1hdCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0Ci1vYmplY3QgZmlsZXMuICBUaGUgQHNje2dudX0gbGlua2VyIHVzZXMgb3RoZXIgbWVjaGFuaXNtcyBmb3IgdGhpcwotcHVycG9zZTogdGhlIEBjb2Rley1ifSwgQGNvZGV7LS1mb3JtYXR9LCBAY29kZXstLW9mb3JtYXR9IG9wdGlvbnMsIHRoZQotQGNvZGV7VEFSR0VUfSBjb21tYW5kIGluIGxpbmtlciBzY3JpcHRzLCBhbmQgdGhlIEBjb2Rle0dOVVRBUkdFVH0KLWVudmlyb25tZW50IHZhcmlhYmxlLiAgVGhlIEBzY3tnbnV9IGxpbmtlciB3aWxsIGlnbm9yZSB0aGUgQGNvZGV7LUZ9Ci1vcHRpb24gd2hlbiBub3QgY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QuCi0KLUBjaW5kZXggZmluYWxpemF0aW9uIGZ1bmN0aW9uCi1Aa2luZGV4IC1maW5pCi1AaXRlbSAtZmluaSBAdmFye25hbWV9Ci1XaGVuIGNyZWF0aW5nIGFuIEVMRiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QsIGNhbGwgTkFNRSB3aGVuIHRoZQotZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzIHVubG9hZGVkLCBieSBzZXR0aW5nIERUX0ZJTkkgdG8gdGhlCi1hZGRyZXNzIG9mIHRoZSBmdW5jdGlvbi4gIEJ5IGRlZmF1bHQsIHRoZSBsaW5rZXIgdXNlcyBAY29kZXtfZmluaX0gYXMKLXRoZSBmdW5jdGlvbiB0byBjYWxsLgotCi1Aa2luZGV4IC1nCi1AaXRlbSAtZwotSWdub3JlZC4gIFByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgdG9vbHMuCi0KLUBraW5kZXggLUcKLUBraW5kZXggLS1ncHNpemUKLUBjaW5kZXggb2JqZWN0IHNpemUKLUBpdGVtIC1HQHZhcnt2YWx1ZX0KLUBpdGVteCAtLWdwc2l6ZT1AdmFye3ZhbHVlfQotU2V0IHRoZSBtYXhpbXVtIHNpemUgb2Ygb2JqZWN0cyB0byBiZSBvcHRpbWl6ZWQgdXNpbmcgdGhlIEdQIHJlZ2lzdGVyIHRvCi1AdmFye3NpemV9LiAgVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIG9iamVjdCBmaWxlIGZvcm1hdHMgc3VjaCBhcwotTUlQUyBFQ09GRiB3aGljaCBzdXBwb3J0cyBwdXR0aW5nIGxhcmdlIGFuZCBzbWFsbCBvYmplY3RzIGludG8gZGlmZmVyZW50Ci1zZWN0aW9ucy4gIFRoaXMgaXMgaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQGNpbmRleCBydW50aW1lIGxpYnJhcnkgbmFtZQotQGtpbmRleCAtaEB2YXJ7bmFtZX0KLUBraW5kZXggLXNvbmFtZT1AdmFye25hbWV9Ci1AaXRlbSAtaEB2YXJ7bmFtZX0KLUBpdGVteCAtc29uYW1lPUB2YXJ7bmFtZX0KLVdoZW4gY3JlYXRpbmcgYW4gRUxGIHNoYXJlZCBvYmplY3QsIHNldCB0aGUgaW50ZXJuYWwgRFRfU09OQU1FIGZpZWxkIHRvCi10aGUgc3BlY2lmaWVkIG5hbWUuICBXaGVuIGFuIGV4ZWN1dGFibGUgaXMgbGlua2VkIHdpdGggYSBzaGFyZWQgb2JqZWN0Ci13aGljaCBoYXMgYSBEVF9TT05BTUUgZmllbGQsIHRoZW4gd2hlbiB0aGUgZXhlY3V0YWJsZSBpcyBydW4gdGhlIGR5bmFtaWMKLWxpbmtlciB3aWxsIGF0dGVtcHQgdG8gbG9hZCB0aGUgc2hhcmVkIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIERUX1NPTkFNRQotZmllbGQgcmF0aGVyIHRoYW4gdGhlIHVzaW5nIHRoZSBmaWxlIG5hbWUgZ2l2ZW4gdG8gdGhlIGxpbmtlci4KLQotQGtpbmRleCAtaQotQGNpbmRleCBpbmNyZW1lbnRhbCBsaW5rCi1AaXRlbSAtaQotUGVyZm9ybSBhbiBpbmNyZW1lbnRhbCBsaW5rIChzYW1lIGFzIG9wdGlvbiBAc2FtcHstcn0pLgotCi1AY2luZGV4IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCi1Aa2luZGV4IC1pbml0Ci1AaXRlbSAtaW5pdCBAdmFye25hbWV9Ci1XaGVuIGNyZWF0aW5nIGFuIEVMRiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QsIGNhbGwgTkFNRSB3aGVuIHRoZQotZXhlY3V0YWJsZSBvciBzaGFyZWQgb2JqZWN0IGlzIGxvYWRlZCwgYnkgc2V0dGluZyBEVF9JTklUIHRvIHRoZSBhZGRyZXNzCi1vZiB0aGUgZnVuY3Rpb24uICBCeSBkZWZhdWx0LCB0aGUgbGlua2VyIHVzZXMgQGNvZGV7X2luaXR9IGFzIHRoZQotZnVuY3Rpb24gdG8gY2FsbC4KLQotQGNpbmRleCBhcmNoaXZlIGZpbGVzLCBmcm9tIGNtZCBsaW5lCi1Aa2luZGV4IC1sQHZhcnthcmNoaXZlfQotQGtpbmRleCAtLWxpYnJhcnk9QHZhcnthcmNoaXZlfQotQGl0ZW0gLWxAdmFye2FyY2hpdmV9Ci1AaXRlbXggLS1saWJyYXJ5PUB2YXJ7YXJjaGl2ZX0KLUFkZCBhcmNoaXZlIGZpbGUgQHZhcnthcmNoaXZlfSB0byB0aGUgbGlzdCBvZiBmaWxlcyB0byBsaW5rLiAgVGhpcwotb3B0aW9uIG1heSBiZSB1c2VkIGFueSBudW1iZXIgb2YgdGltZXMuICBAY29kZXtsZH0gd2lsbCBzZWFyY2ggaXRzCi1wYXRoLWxpc3QgZm9yIG9jY3VycmVuY2VzIG9mIEBjb2Rle2xpYkB2YXJ7YXJjaGl2ZX0uYX0gZm9yIGV2ZXJ5Ci1AdmFye2FyY2hpdmV9IHNwZWNpZmllZC4KLQotT24gc3lzdGVtcyB3aGljaCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMsIEBjb2Rle2xkfSBtYXkgYWxzbyBzZWFyY2ggZm9yCi1saWJyYXJpZXMgd2l0aCBleHRlbnNpb25zIG90aGVyIHRoYW4gQGNvZGV7LmF9LiAgU3BlY2lmaWNhbGx5LCBvbiBFTEYKLWFuZCBTdW5PUyBzeXN0ZW1zLCBAY29kZXtsZH0gd2lsbCBzZWFyY2ggYSBkaXJlY3RvcnkgZm9yIGEgbGlicmFyeSB3aXRoCi1hbiBleHRlbnNpb24gb2YgQGNvZGV7LnNvfSBiZWZvcmUgc2VhcmNoaW5nIGZvciBvbmUgd2l0aCBhbiBleHRlbnNpb24gb2YKLUBjb2Rley5hfS4gIEJ5IGNvbnZlbnRpb24sIGEgQGNvZGV7LnNvfSBleHRlbnNpb24gaW5kaWNhdGVzIGEgc2hhcmVkCi1saWJyYXJ5LgotCi1UaGUgbGlua2VyIHdpbGwgc2VhcmNoIGFuIGFyY2hpdmUgb25seSBvbmNlLCBhdCB0aGUgbG9jYXRpb24gd2hlcmUgaXQgaXMKLXNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYgdGhlIGFyY2hpdmUgZGVmaW5lcyBhIHN5bWJvbCB3aGljaAotd2FzIHVuZGVmaW5lZCBpbiBzb21lIG9iamVjdCB3aGljaCBhcHBlYXJlZCBiZWZvcmUgdGhlIGFyY2hpdmUgb24gdGhlCi1jb21tYW5kIGxpbmUsIHRoZSBsaW5rZXIgd2lsbCBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBmaWxlKHMpIGZyb20gdGhlCi1hcmNoaXZlLiAgSG93ZXZlciwgYW4gdW5kZWZpbmVkIHN5bWJvbCBpbiBhbiBvYmplY3QgYXBwZWFyaW5nIGxhdGVyIG9uCi10aGUgY29tbWFuZCBsaW5lIHdpbGwgbm90IGNhdXNlIHRoZSBsaW5rZXIgdG8gc2VhcmNoIHRoZSBhcmNoaXZlIGFnYWluLgotCi1TZWUgdGhlIEBjb2Rley0ofSBvcHRpb24gZm9yIGEgd2F5IHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gc2VhcmNoCi1hcmNoaXZlcyBtdWx0aXBsZSB0aW1lcy4KLQotWW91IG1heSBsaXN0IHRoZSBzYW1lIGFyY2hpdmUgbXVsdGlwbGUgdGltZXMgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotQGlmc2V0IEdFTkVSSUMKLVRoaXMgdHlwZSBvZiBhcmNoaXZlIHNlYXJjaGluZyBpcyBzdGFuZGFyZCBmb3IgVW5peCBsaW5rZXJzLiAgSG93ZXZlciwKLWlmIHlvdSBhcmUgdXNpbmcgQGNvZGV7bGR9IG9uIEFJWCwgbm90ZSB0aGF0IGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZQotYmVoYXZpb3VyIG9mIHRoZSBBSVggbGlua2VyLgotQGVuZCBpZnNldAotCi1AY2luZGV4IHNlYXJjaCBkaXJlY3RvcnksIGZyb20gY21kIGxpbmUKLUBraW5kZXggLUxAdmFye2Rpcn0KLUBraW5kZXggLS1saWJyYXJ5LXBhdGg9QHZhcntkaXJ9Ci1AaXRlbSAtTEB2YXJ7c2VhcmNoZGlyfSAKLUBpdGVteCAtLWxpYnJhcnktcGF0aD1AdmFye3NlYXJjaGRpcn0KLUFkZCBwYXRoIEB2YXJ7c2VhcmNoZGlyfSB0byB0aGUgbGlzdCBvZiBwYXRocyB0aGF0IEBjb2Rle2xkfSB3aWxsIHNlYXJjaAotZm9yIGFyY2hpdmUgbGlicmFyaWVzIGFuZCBAY29kZXtsZH0gY29udHJvbCBzY3JpcHRzLiAgWW91IG1heSB1c2UgdGhpcwotb3B0aW9uIGFueSBudW1iZXIgb2YgdGltZXMuICBUaGUgZGlyZWN0b3JpZXMgYXJlIHNlYXJjaGVkIGluIHRoZSBvcmRlcgotaW4gd2hpY2ggdGhleSBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBEaXJlY3RvcmllcyBzcGVjaWZpZWQKLW9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIHNlYXJjaGVkIGJlZm9yZSB0aGUgZGVmYXVsdCBkaXJlY3Rvcmllcy4gIEFsbAotQGNvZGV7LUx9IG9wdGlvbnMgYXBwbHkgdG8gYWxsIEBjb2Rley1sfSBvcHRpb25zLCByZWdhcmRsZXNzIG9mIHRoZQotb3JkZXIgaW4gd2hpY2ggdGhlIG9wdGlvbnMgYXBwZWFyLgotCi1AaWZzZXQgVXNlc0VudlZhcnMKLVRoZSBkZWZhdWx0IHNldCBvZiBwYXRocyBzZWFyY2hlZCAod2l0aG91dCBiZWluZyBzcGVjaWZpZWQgd2l0aAotQHNhbXB7LUx9KSBkZXBlbmRzIG9uIHdoaWNoIGVtdWxhdGlvbiBtb2RlIEBjb2Rle2xkfSBpcyB1c2luZywgYW5kIGluCi1zb21lIGNhc2VzIGFsc28gb24gaG93IGl0IHdhcyBjb25maWd1cmVkLiAgQHhyZWZ7RW52aXJvbm1lbnR9LgotQGVuZCBpZnNldAotCi1UaGUgcGF0aHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGluIGEgbGluayBzY3JpcHQgd2l0aCB0aGUKLUBjb2Rle1NFQVJDSF9ESVJ9IGNvbW1hbmQuICBEaXJlY3RvcmllcyBzcGVjaWZpZWQgdGhpcyB3YXkgYXJlIHNlYXJjaGVkCi1hdCB0aGUgcG9pbnQgaW4gd2hpY2ggdGhlIGxpbmtlciBzY3JpcHQgYXBwZWFycyBpbiB0aGUgY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IGVtdWxhdGlvbgotQGtpbmRleCAtbSBAdmFye2VtdWxhdGlvbn0KLUBpdGVtIC1tQHZhcntlbXVsYXRpb259Ci1FbXVsYXRlIHRoZSBAdmFye2VtdWxhdGlvbn0gbGlua2VyLiAgWW91IGNhbiBsaXN0IHRoZSBhdmFpbGFibGUKLWVtdWxhdGlvbnMgd2l0aCB0aGUgQHNhbXB7LS12ZXJib3NlfSBvciBAc2FtcHstVn0gb3B0aW9ucy4KLQotSWYgdGhlIEBzYW1wey1tfSBvcHRpb24gaXMgbm90IHVzZWQsIHRoZSBlbXVsYXRpb24gaXMgdGFrZW4gZnJvbSB0aGUKLUBjb2Rle0xERU1VTEFUSU9OfSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgdGhhdCBpcyBkZWZpbmVkLgotCi1PdGhlcndpc2UsIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBkZXBlbmRzIHVwb24gaG93IHRoZSBsaW5rZXIgd2FzCi1jb25maWd1cmVkLgotCi1AY2luZGV4IGxpbmsgbWFwCi1Aa2luZGV4IC1NCi1Aa2luZGV4IC0tcHJpbnQtbWFwCi1AaXRlbSAtTQotQGl0ZW14IC0tcHJpbnQtbWFwCi1QcmludCBhIGxpbmsgbWFwIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICBBIGxpbmsgbWFwIHByb3ZpZGVzCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgbGluaywgaW5jbHVkaW5nIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1XaGVyZSBvYmplY3QgZmlsZXMgYW5kIHN5bWJvbHMgYXJlIG1hcHBlZCBpbnRvIG1lbW9yeS4KLUBpdGVtCi1Ib3cgY29tbW9uIHN5bWJvbHMgYXJlIGFsbG9jYXRlZC4KLUBpdGVtCi1BbGwgYXJjaGl2ZSBtZW1iZXJzIGluY2x1ZGVkIGluIHRoZSBsaW5rLCB3aXRoIGEgbWVudGlvbiBvZiB0aGUgc3ltYm9sCi13aGljaCBjYXVzZWQgdGhlIGFyY2hpdmUgbWVtYmVyIHRvIGJlIGJyb3VnaHQgaW4uCi1AZW5kIGl0ZW1pemUKLQotQGtpbmRleCAtbgotQGNpbmRleCByZWFkLW9ubHkgdGV4dAotQGNpbmRleCBOTUFHSUMKLUBraW5kZXggLS1ubWFnaWMKLUBpdGVtIC1uCi1AaXRlbXggLS1ubWFnaWMKLVNldCB0aGUgdGV4dCBzZWdtZW50IHRvIGJlIHJlYWQgb25seSwgYW5kIG1hcmsgdGhlIG91dHB1dCBhcwotQGNvZGV7Tk1BR0lDfSBpZiBwb3NzaWJsZS4KLQotQGtpbmRleCAtTgotQGtpbmRleCAtLW9tYWdpYwotQGNpbmRleCByZWFkL3dyaXRlIGZyb20gY21kIGxpbmUKLUBjaW5kZXggT01BR0lDCi1AaXRlbSAtTiAKLUBpdGVteCAtLW9tYWdpYwotU2V0IHRoZSB0ZXh0IGFuZCBkYXRhIHNlY3Rpb25zIHRvIGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4gIEFsc28sIGRvCi1ub3QgcGFnZS1hbGlnbiB0aGUgZGF0YSBzZWdtZW50LiAgSWYgdGhlIG91dHB1dCBmb3JtYXQgc3VwcG9ydHMgVW5peAotc3R5bGUgbWFnaWMgbnVtYmVycywgbWFyayB0aGUgb3V0cHV0IGFzIEBjb2Rle09NQUdJQ30uCi0KLUBraW5kZXggLW8gQHZhcntvdXRwdXR9Ci1Aa2luZGV4IC0tb3V0cHV0PUB2YXJ7b3V0cHV0fQotQGNpbmRleCBuYW1pbmcgdGhlIG91dHB1dCBmaWxlCi1AaXRlbSAtbyBAdmFye291dHB1dH0KLUBpdGVteCAtLW91dHB1dD1AdmFye291dHB1dH0KLVVzZSBAdmFye291dHB1dH0gYXMgdGhlIG5hbWUgZm9yIHRoZSBwcm9ncmFtIHByb2R1Y2VkIGJ5IEBjb2Rle2xkfTsgaWYgdGhpcwotb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIEBmaWxle2Eub3V0fSBpcyB1c2VkIGJ5IGRlZmF1bHQuICBUaGUKLXNjcmlwdCBjb21tYW5kIEBjb2Rle09VVFBVVH0gY2FuIGFsc28gc3BlY2lmeSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KLQotQGtpbmRleCAtTyBAdmFye2xldmVsfQotQGNpbmRleCBnZW5lcmF0aW5nIG9wdGltaXplZCBvdXRwdXQKLUBpdGVtIC1PIEB2YXJ7bGV2ZWx9Ci1JZiBAdmFye2xldmVsfSBpcyBhIG51bWVyaWMgdmFsdWVzIGdyZWF0ZXIgdGhhbiB6ZXJvIEBjb2Rle2xkfSBvcHRpbWl6ZXMKLXRoZSBvdXRwdXQuICBUaGlzIG1pZ2h0IHRha2Ugc2lnbmlmaWNhbnRseSBsb25nZXIgYW5kIHRoZXJlZm9yZSBwcm9iYWJseQotc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBmb3IgdGhlIGZpbmFsIGJpbmFyeS4KLQotQGNpbmRleCBwYXJ0aWFsIGxpbmsKLUBjaW5kZXggcmVsb2NhdGFibGUgb3V0cHV0Ci1Aa2luZGV4IC1yCi1Aa2luZGV4IC0tcmVsb2NhdGVhYmxlCi1AaXRlbSAtcgotQGl0ZW14IC0tcmVsb2NhdGVhYmxlCi1HZW5lcmF0ZSByZWxvY2F0YWJsZSBvdXRwdXQtLS1pLmUuLCBnZW5lcmF0ZSBhbiBvdXRwdXQgZmlsZSB0aGF0IGNhbiBpbgotdHVybiBzZXJ2ZSBhcyBpbnB1dCB0byBAY29kZXtsZH0uICBUaGlzIGlzIG9mdGVuIGNhbGxlZCBAZGZue3BhcnRpYWwKLWxpbmtpbmd9LiAgQXMgYSBzaWRlIGVmZmVjdCwgaW4gZW52aXJvbm1lbnRzIHRoYXQgc3VwcG9ydCBzdGFuZGFyZCBVbml4Ci1tYWdpYyBudW1iZXJzLCB0aGlzIG9wdGlvbiBhbHNvIHNldHMgdGhlIG91dHB1dCBmaWxlJ3MgbWFnaWMgbnVtYmVyIHRvCi1AY29kZXtPTUFHSUN9LgotQGMgOyBzZWUgQGNvZGV7LU59LiAKLUlmIHRoaXMgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIGFuIGFic29sdXRlIGZpbGUgaXMgcHJvZHVjZWQuICBXaGVuCi1saW5raW5nIEMrKyBwcm9ncmFtcywgdGhpcyBvcHRpb24gQGVtcGh7d2lsbCBub3R9IHJlc29sdmUgcmVmZXJlbmNlcyB0bwotY29uc3RydWN0b3JzOyB0byBkbyB0aGF0LCB1c2UgQHNhbXB7LVVyfS4KLQotVGhpcyBvcHRpb24gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBAc2FtcHstaX0uCi0KLUBraW5kZXggLVIgQHZhcntmaWxlfQotQGtpbmRleCAtLWp1c3Qtc3ltYm9scz1AdmFye2ZpbGV9Ci1AY2luZGV4IHN5bWJvbC1vbmx5IGlucHV0Ci1AaXRlbSAtUiBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IC0tanVzdC1zeW1ib2xzPUB2YXJ7ZmlsZW5hbWV9Ci1SZWFkIHN5bWJvbCBuYW1lcyBhbmQgdGhlaXIgYWRkcmVzc2VzIGZyb20gQHZhcntmaWxlbmFtZX0sIGJ1dCBkbyBub3QKLXJlbG9jYXRlIGl0IG9yIGluY2x1ZGUgaXQgaW4gdGhlIG91dHB1dC4gIFRoaXMgYWxsb3dzIHlvdXIgb3V0cHV0IGZpbGUKLXRvIHJlZmVyIHN5bWJvbGljYWxseSB0byBhYnNvbHV0ZSBsb2NhdGlvbnMgb2YgbWVtb3J5IGRlZmluZWQgaW4gb3RoZXIKLXByb2dyYW1zLiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24gbW9yZSB0aGFuIG9uY2UuCi0KLUZvciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgRUxGIGxpbmtlcnMsIGlmIHRoZSBAY29kZXstUn0gb3B0aW9uIGlzCi1mb2xsb3dlZCBieSBhIGRpcmVjdG9yeSBuYW1lLCByYXRoZXIgdGhhbiBhIGZpbGUgbmFtZSwgaXQgaXMgdHJlYXRlZCBhcwotdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uLgotCi1Aa2luZGV4IC1zCi1Aa2luZGV4IC0tc3RyaXAtYWxsCi1AY2luZGV4IHN0cmlwIGFsbCBzeW1ib2xzCi1AaXRlbSAtcyAKLUBpdGVteCAtLXN0cmlwLWFsbAotT21pdCBhbGwgc3ltYm9sIGluZm9ybWF0aW9uIGZyb20gdGhlIG91dHB1dCBmaWxlLgotCi1Aa2luZGV4IC1TCi1Aa2luZGV4IC0tc3RyaXAtZGVidWcKLUBjaW5kZXggc3RyaXAgZGVidWdnZXIgc3ltYm9scwotQGl0ZW0gLVMgCi1AaXRlbXggLS1zdHJpcC1kZWJ1ZwotT21pdCBkZWJ1Z2dlciBzeW1ib2wgaW5mb3JtYXRpb24gKGJ1dCBub3QgYWxsIHN5bWJvbHMpIGZyb20gdGhlIG91dHB1dCBmaWxlLgotCi1Aa2luZGV4IC10Ci1Aa2luZGV4IC0tdHJhY2UKLUBjaW5kZXggaW5wdXQgZmlsZXMsIGRpc3BsYXlpbmcKLUBpdGVtIC10IAotQGl0ZW14IC0tdHJhY2UKLVByaW50IHRoZSBuYW1lcyBvZiB0aGUgaW5wdXQgZmlsZXMgYXMgQGNvZGV7bGR9IHByb2Nlc3NlcyB0aGVtLgotCi1Aa2luZGV4IC1UIEB2YXJ7c2NyaXB0fQotQGtpbmRleCAtLXNjcmlwdD1AdmFye3NjcmlwdH0KLUBjaW5kZXggc2NyaXB0IGZpbGVzCi1AaXRlbSAtVCBAdmFye3NjcmlwdGZpbGV9Ci1AaXRlbXggLS1zY3JpcHQ9QHZhcntzY3JpcHRmaWxlfQotVXNlIEB2YXJ7c2NyaXB0ZmlsZX0gYXMgdGhlIGxpbmtlciBzY3JpcHQuICBUaGlzIHNjcmlwdCByZXBsYWNlcwotQGNvZGV7bGR9J3MgZGVmYXVsdCBsaW5rZXIgc2NyaXB0IChyYXRoZXIgdGhhbiBhZGRpbmcgdG8gaXQpLCBzbwotQHZhcntjb21tYW5kZmlsZX0gbXVzdCBzcGVjaWZ5IGV2ZXJ5dGhpbmcgbmVjZXNzYXJ5IHRvIGRlc2NyaWJlIHRoZQotb3V0cHV0IGZpbGUuICBZb3UgbXVzdCB1c2UgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIGEgY29tbWFuZAotd2hpY2ggY2FuIG9ubHkgYXBwZWFyIG9uY2UgaW4gYSBsaW5rZXIgc2NyaXB0LCBzdWNoIGFzIHRoZQotQGNvZGV7U0VDVElPTlN9IG9yIEBjb2Rle01FTU9SWX0gY29tbWFuZC4gIEB4cmVme1NjcmlwdHN9LiAgSWYKLUB2YXJ7c2NyaXB0ZmlsZX0gZG9lcyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBAY29kZXtsZH0KLWxvb2tzIGZvciBpdCBpbiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IGFueSBwcmVjZWRpbmcgQHNhbXB7LUx9Ci1vcHRpb25zLiAgTXVsdGlwbGUgQHNhbXB7LVR9IG9wdGlvbnMgYWNjdW11bGF0ZS4KLQotQGtpbmRleCAtdSBAdmFye3N5bWJvbH0KLUBraW5kZXggLS11bmRlZmluZWQ9QHZhcntzeW1ib2x9Ci1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2wKLUBpdGVtIC11IEB2YXJ7c3ltYm9sfQotQGl0ZW14IC0tdW5kZWZpbmVkPUB2YXJ7c3ltYm9sfQotRm9yY2UgQHZhcntzeW1ib2x9IHRvIGJlIGVudGVyZWQgaW4gdGhlIG91dHB1dCBmaWxlIGFzIGFuIHVuZGVmaW5lZAotc3ltYm9sLiAgRG9pbmcgdGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbAotbW9kdWxlcyBmcm9tIHN0YW5kYXJkIGxpYnJhcmllcy4gIEBzYW1wey11fSBtYXkgYmUgcmVwZWF0ZWQgd2l0aAotZGlmZmVyZW50IG9wdGlvbiBhcmd1bWVudHMgdG8gZW50ZXIgYWRkaXRpb25hbCB1bmRlZmluZWQgc3ltYm9scy4gIFRoaXMKLW9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBAY29kZXtFWFRFUk59IGxpbmtlciBzY3JpcHQgY29tbWFuZC4KLQotQGtpbmRleCAtVXIKLUBjaW5kZXggY29uc3RydWN0b3JzCi1AaXRlbSAtVXIgCi1Gb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBDKysgcHJvZ3JhbXMsIHRoaXMgb3B0aW9uIGlzIGVxdWl2YWxlbnQgdG8KLUBzYW1wey1yfTogaXQgZ2VuZXJhdGVzIHJlbG9jYXRhYmxlIG91dHB1dC0tLWkuZS4sIGFuIG91dHB1dCBmaWxlIHRoYXQgY2FuIGluCi10dXJuIHNlcnZlIGFzIGlucHV0IHRvIEBjb2Rle2xkfS4gIFdoZW4gbGlua2luZyBDKysgcHJvZ3JhbXMsIEBzYW1wey1Vcn0KLUBlbXBoe2RvZXN9IHJlc29sdmUgcmVmZXJlbmNlcyB0byBjb25zdHJ1Y3RvcnMsIHVubGlrZSBAc2FtcHstcn0uCi1JdCBkb2VzIG5vdCB3b3JrIHRvIHVzZSBAc2FtcHstVXJ9IG9uIGZpbGVzIHRoYXQgd2VyZSB0aGVtc2VsdmVzIGxpbmtlZAotd2l0aCBAc2FtcHstVXJ9OyBvbmNlIHRoZSBjb25zdHJ1Y3RvciB0YWJsZSBoYXMgYmVlbiBidWlsdCwgaXQgY2Fubm90Ci1iZSBhZGRlZCB0by4gIFVzZSBAc2FtcHstVXJ9IG9ubHkgZm9yIHRoZSBsYXN0IHBhcnRpYWwgbGluaywgYW5kCi1Ac2FtcHstcn0gZm9yIHRoZSBvdGhlcnMuCi0KLUBraW5kZXggLXYKLUBraW5kZXggLVYKLUBraW5kZXggLS12ZXJzaW9uCi1AY2luZGV4IHZlcnNpb24KLUBpdGVtIC12Ci1AaXRlbXggLS12ZXJzaW9uCi1AaXRlbXggLVYKLURpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIGZvciBAY29kZXtsZH0uICBUaGUgQGNvZGV7LVZ9IG9wdGlvbiBhbHNvCi1saXN0cyB0aGUgc3VwcG9ydGVkIGVtdWxhdGlvbnMuCi0KLUBraW5kZXggLXgKLUBraW5kZXggLS1kaXNjYXJkLWFsbAotQGNpbmRleCBkZWxldGluZyBsb2NhbCBzeW1ib2xzCi1AaXRlbSAteAotQGl0ZW14IC0tZGlzY2FyZC1hbGwKLURlbGV0ZSBhbGwgbG9jYWwgc3ltYm9scy4KLQotQGtpbmRleCAtWAotQGtpbmRleCAtLWRpc2NhcmQtbG9jYWxzCi1AY2luZGV4IGxvY2FsIHN5bWJvbHMsIGRlbGV0aW5nCi1AY2luZGV4IEwsIGRlbGV0aW5nIHN5bWJvbHMgYmVnaW5uaW5nCi1AaXRlbSAtWCAKLUBpdGVteCAtLWRpc2NhcmQtbG9jYWxzCi1EZWxldGUgYWxsIHRlbXBvcmFyeSBsb2NhbCBzeW1ib2xzLiAgRm9yIG1vc3QgdGFyZ2V0cywgdGhpcyBpcyBhbGwgbG9jYWwKLXN5bWJvbHMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aCBAc2FtcHtMfS4KLQotQGtpbmRleCAteSBAdmFye3N5bWJvbH0KLUBraW5kZXggLS10cmFjZS1zeW1ib2w9QHZhcntzeW1ib2x9Ci1AY2luZGV4IHN5bWJvbCB0cmFjaW5nCi1AaXRlbSAteSBAdmFye3N5bWJvbH0KLUBpdGVteCAtLXRyYWNlLXN5bWJvbD1AdmFye3N5bWJvbH0KLVByaW50IHRoZSBuYW1lIG9mIGVhY2ggbGlua2VkIGZpbGUgaW4gd2hpY2ggQHZhcntzeW1ib2x9IGFwcGVhcnMuICBUaGlzCi1vcHRpb24gbWF5IGJlIGdpdmVuIGFueSBudW1iZXIgb2YgdGltZXMuICBPbiBtYW55IHN5c3RlbXMgaXQgaXMgbmVjZXNzYXJ5Ci10byBwcmVwZW5kIGFuIHVuZGVyc2NvcmUuCi0KLVRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGFuIHVuZGVmaW5lZCBzeW1ib2wgaW4geW91ciBsaW5rIGJ1dAotZG9uJ3Qga25vdyB3aGVyZSB0aGUgcmVmZXJlbmNlIGlzIGNvbWluZyBmcm9tLgotCi1Aa2luZGV4IC1ZIEB2YXJ7cGF0aH0KLUBpdGVtIC1ZIEB2YXJ7cGF0aH0KLUFkZCBAdmFye3BhdGh9IHRvIHRoZSBkZWZhdWx0IGxpYnJhcnkgc2VhcmNoIHBhdGguICBUaGlzIG9wdGlvbiBleGlzdHMKLWZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkuCi0KLUBraW5kZXggLXogQHZhcntrZXl3b3JkfQotQGl0ZW0gLXogQHZhcntrZXl3b3JkfQotVGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC0oCi1AY2luZGV4IGdyb3VwcyBvZiBhcmNoaXZlcwotQGl0ZW0gLSggQHZhcnthcmNoaXZlc30gLSkKLUBpdGVteCAtLXN0YXJ0LWdyb3VwIEB2YXJ7YXJjaGl2ZXN9IC0tZW5kLWdyb3VwCi1UaGUgQHZhcnthcmNoaXZlc30gc2hvdWxkIGJlIGEgbGlzdCBvZiBhcmNoaXZlIGZpbGVzLiAgVGhleSBtYXkgYmUKLWVpdGhlciBleHBsaWNpdCBmaWxlIG5hbWVzLCBvciBAc2FtcHstbH0gb3B0aW9ucy4KLQotVGhlIHNwZWNpZmllZCBhcmNoaXZlcyBhcmUgc2VhcmNoZWQgcmVwZWF0ZWRseSB1bnRpbCBubyBuZXcgdW5kZWZpbmVkCi1yZWZlcmVuY2VzIGFyZSBjcmVhdGVkLiAgTm9ybWFsbHksIGFuIGFyY2hpdmUgaXMgc2VhcmNoZWQgb25seSBvbmNlIGluCi10aGUgb3JkZXIgdGhhdCBpdCBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIGEgc3ltYm9sIGluIHRoYXQKLWFyY2hpdmUgaXMgbmVlZGVkIHRvIHJlc29sdmUgYW4gdW5kZWZpbmVkIHN5bWJvbCByZWZlcnJlZCB0byBieSBhbgotb2JqZWN0IGluIGFuIGFyY2hpdmUgdGhhdCBhcHBlYXJzIGxhdGVyIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBsaW5rZXIKLXdvdWxkIG5vdCBiZSBhYmxlIHRvIHJlc29sdmUgdGhhdCByZWZlcmVuY2UuICBCeSBncm91cGluZyB0aGUgYXJjaGl2ZXMsCi10aGV5IGFsbCBiZSBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIGFsbCBwb3NzaWJsZSByZWZlcmVuY2VzIGFyZQotcmVzb2x2ZWQuCi0KLVVzaW5nIHRoaXMgb3B0aW9uIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGNvc3QuICBJdCBpcyBiZXN0IHRvIHVzZQotaXQgb25seSB3aGVuIHRoZXJlIGFyZSB1bmF2b2lkYWJsZSBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gdHdvIG9yCi1tb3JlIGFyY2hpdmVzLgotCi1Aa2luZGV4IC1hc3NlcnQgQHZhcntrZXl3b3JkfQotQGl0ZW0gLWFzc2VydCBAdmFye2tleXdvcmR9Ci1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBTdW5PUyBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC1CZHluYW1pYwotQGtpbmRleCAtZHkKLUBraW5kZXggLWNhbGxfc2hhcmVkCi1AaXRlbSAtQmR5bmFtaWMKLUBpdGVteCAtZHkKLUBpdGVteCAtY2FsbF9zaGFyZWQKLUxpbmsgYWdhaW5zdCBkeW5hbWljIGxpYnJhcmllcy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIG9uIHBsYXRmb3JtcwotZm9yIHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gIFRoaXMgb3B0aW9uIGlzIG5vcm1hbGx5IHRoZQotZGVmYXVsdCBvbiBzdWNoIHBsYXRmb3Jtcy4gIFRoZSBkaWZmZXJlbnQgdmFyaWFudHMgb2YgdGhpcyBvcHRpb24gYXJlCi1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgc3lzdGVtcy4gIFlvdSBtYXkgdXNlIHRoaXMgb3B0aW9uCi1tdWx0aXBsZSB0aW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lOiBpdCBhZmZlY3RzIGxpYnJhcnkgc2VhcmNoaW5nIGZvcgotQGNvZGV7LWx9IG9wdGlvbnMgd2hpY2ggZm9sbG93IGl0LgotCi1Aa2luZGV4IC1Cc3RhdGljCi1Aa2luZGV4IC1kbgotQGtpbmRleCAtbm9uX3NoYXJlZAotQGtpbmRleCAtc3RhdGljCi1AaXRlbSAtQnN0YXRpYyAKLUBpdGVteCAtZG4KLUBpdGVteCAtbm9uX3NoYXJlZAotQGl0ZW14IC1zdGF0aWMKLURvIG5vdCBsaW5rIGFnYWluc3Qgc2hhcmVkIGxpYnJhcmllcy4gIFRoaXMgaXMgb25seSBtZWFuaW5nZnVsIG9uCi1wbGF0Zm9ybXMgZm9yIHdoaWNoIHNoYXJlZCBsaWJyYXJpZXMgYXJlIHN1cHBvcnRlZC4gIFRoZSBkaWZmZXJlbnQKLXZhcmlhbnRzIG9mIHRoaXMgb3B0aW9uIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHZhcmlvdXMgc3lzdGVtcy4gIFlvdQotbWF5IHVzZSB0aGlzIG9wdGlvbiBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgY29tbWFuZCBsaW5lOiBpdCBhZmZlY3RzCi1saWJyYXJ5IHNlYXJjaGluZyBmb3IgQGNvZGV7LWx9IG9wdGlvbnMgd2hpY2ggZm9sbG93IGl0LgotCi1Aa2luZGV4IC1Cc3ltYm9saWMKLUBpdGVtIC1Cc3ltYm9saWMKLVdoZW4gY3JlYXRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYmluZCByZWZlcmVuY2VzIHRvIGdsb2JhbCBzeW1ib2xzIHRvIHRoZQotZGVmaW5pdGlvbiB3aXRoaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBpZiBhbnkuICBOb3JtYWxseSwgaXQgaXMgcG9zc2libGUKLWZvciBhIHByb2dyYW0gbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgbGlicmFyeSB0byBvdmVycmlkZSB0aGUgZGVmaW5pdGlvbgotd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiBFTEYKLXBsYXRmb3JtcyB3aGljaCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuCi0KLUBraW5kZXggLS1jaGVjay1zZWN0aW9ucwotQGtpbmRleCAtLW5vLWNoZWNrLXNlY3Rpb25zCi1AaXRlbSAtLWNoZWNrLXNlY3Rpb25zCi1AaXRlbXggLS1uby1jaGVjay1zZWN0aW9ucwotQXNrcyB0aGUgbGlua2VyIEBlbXBoe25vdH0gdG8gY2hlY2sgc2VjdGlvbiBhZGRyZXNzZXMgYWZ0ZXIgdGhleSBoYXZlCi1iZWVuIGFzc2lnbmVkIHRvIHNlZSBpZiB0aGVyZSBhbnkgb3ZlcmxhcHMuICBOb3JtYWxseSB0aGUgbGlua2VyIHdpbGwKLXBlcmZvcm0gdGhpcyBjaGVjaywgYW5kIGlmIGl0IGZpbmRzIGFueSBvdmVybGFwcyBpdCB3aWxsIHByb2R1Y2UKLXN1aXRhYmxlIGVycm9yIG1lc3NhZ2VzLiAgVGhlIGxpbmtlciBkb2VzIGtub3cgYWJvdXQsIGFuZCBkb2VzIG1ha2UKLWFsbG93YW5jZXMgZm9yIHNlY3Rpb25zIGluIG92ZXJsYXlzLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGNhbiBiZQotcmVzdG9yZWQgYnkgdXNpbmcgdGhlIGNvbW1hbmQgbGluZSBzd2l0Y2ggQHNhbXB7LS1jaGVjay1zZWN0aW9uc30uCi0KLUBjaW5kZXggY3Jvc3MgcmVmZXJlbmNlIHRhYmxlCi1Aa2luZGV4IC0tY3JlZgotQGl0ZW0gLS1jcmVmCi1PdXRwdXQgYSBjcm9zcyByZWZlcmVuY2UgdGFibGUuICBJZiBhIGxpbmtlciBtYXAgZmlsZSBpcyBiZWluZwotZ2VuZXJhdGVkLCB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGlzIHByaW50ZWQgdG8gdGhlIG1hcCBmaWxlLgotT3RoZXJ3aXNlLCBpdCBpcyBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCi0KLVRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlIGlzIGludGVudGlvbmFsbHkgc2ltcGxlLCBzbyB0aGF0IGl0IG1heSBiZQotZWFzaWx5IHByb2Nlc3NlZCBieSBhIHNjcmlwdCBpZiBuZWNlc3NhcnkuICBUaGUgc3ltYm9scyBhcmUgcHJpbnRlZCBvdXQsCi1zb3J0ZWQgYnkgbmFtZS4gIEZvciBlYWNoIHN5bWJvbCwgYSBsaXN0IG9mIGZpbGUgbmFtZXMgaXMgZ2l2ZW4uICBJZiB0aGUKLXN5bWJvbCBpcyBkZWZpbmVkLCB0aGUgZmlyc3QgZmlsZSBsaXN0ZWQgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZQotZGVmaW5pdGlvbi4gIFRoZSByZW1haW5pbmcgZmlsZXMgY29udGFpbiByZWZlcmVuY2VzIHRvIHRoZSBzeW1ib2wuCi0KLUBjaW5kZXggc3ltYm9scywgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLS1kZWZzeW0gQHZhcntzeW1ib2x9PUB2YXJ7ZXhwfQotQGl0ZW0gLS1kZWZzeW0gQHZhcntzeW1ib2x9PUB2YXJ7ZXhwcmVzc2lvbn0KLUNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgaW4gdGhlIG91dHB1dCBmaWxlLCBjb250YWluaW5nIHRoZSBhYnNvbHV0ZQotYWRkcmVzcyBnaXZlbiBieSBAdmFye2V4cHJlc3Npb259LiAgWW91IG1heSB1c2UgdGhpcyBvcHRpb24gYXMgbWFueQotdGltZXMgYXMgbmVjZXNzYXJ5IHRvIGRlZmluZSBtdWx0aXBsZSBzeW1ib2xzIGluIHRoZSBjb21tYW5kIGxpbmUuICBBCi1saW1pdGVkIGZvcm0gb2YgYXJpdGhtZXRpYyBpcyBzdXBwb3J0ZWQgZm9yIHRoZSBAdmFye2V4cHJlc3Npb259IGluIHRoaXMKLWNvbnRleHQ6IHlvdSBtYXkgZ2l2ZSBhIGhleGFkZWNpbWFsIGNvbnN0YW50IG9yIHRoZSBuYW1lIG9mIGFuIGV4aXN0aW5nCi1zeW1ib2wsIG9yIHVzZSBAY29kZXsrfSBhbmQgQGNvZGV7LX0gdG8gYWRkIG9yIHN1YnRyYWN0IGhleGFkZWNpbWFsCi1jb25zdGFudHMgb3Igc3ltYm9scy4gIElmIHlvdSBuZWVkIG1vcmUgZWxhYm9yYXRlIGV4cHJlc3Npb25zLCBjb25zaWRlcgotdXNpbmcgdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIGZyb20gYSBzY3JpcHQgKEBweHJlZntBc3NpZ25tZW50cywsCi1Bc3NpZ25tZW50OiBTeW1ib2wgRGVmaW5pdGlvbnN9KS4gIEBlbXBoe05vdGU6fSB0aGVyZSBzaG91bGQgYmUgbm8gd2hpdGUKLXNwYWNlIGJldHdlZW4gQHZhcntzeW1ib2x9LCB0aGUgZXF1YWxzIHNpZ24gKGBgQGtleXs9fScnKSwgYW5kCi1AdmFye2V4cHJlc3Npb259LgotCi1AY2luZGV4IGRlbWFuZ2xpbmcsIGZyb20gY29tbWFuZCBsaW5lCi1Aa2luZGV4IC0tZGVtYW5nbGUKLUBraW5kZXggLS1uby1kZW1hbmdsZQotQGl0ZW0gLS1kZW1hbmdsZQotQGl0ZW14IC0tbm8tZGVtYW5nbGUKLVRoZXNlIG9wdGlvbnMgY29udHJvbCB3aGV0aGVyIHRvIGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyBpbiBlcnJvciBtZXNzYWdlcwotYW5kIG90aGVyIG91dHB1dC4gIFdoZW4gdGhlIGxpbmtlciBpcyB0b2xkIHRvIGRlbWFuZ2xlLCBpdCB0cmllcyB0bwotcHJlc2VudCBzeW1ib2wgbmFtZXMgaW4gYSByZWFkYWJsZSBmYXNoaW9uOiBpdCBzdHJpcHMgbGVhZGluZwotdW5kZXJzY29yZXMgaWYgdGhleSBhcmUgdXNlZCBieSB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LCBhbmQgY29udmVydHMgQysrCi1tYW5nbGVkIHN5bWJvbCBuYW1lcyBpbnRvIHVzZXIgcmVhZGFibGUgbmFtZXMuICBUaGUgbGlua2VyIHdpbGwgZGVtYW5nbGUKLWJ5IGRlZmF1bHQgdW5sZXNzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBAc2FtcHtDT0xMRUNUX05PX0RFTUFOR0xFfSBpcwotc2V0LiAgVGhlc2Ugb3B0aW9ucyBtYXkgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KLQotQGNpbmRleCBkeW5hbWljIGxpbmtlciwgZnJvbSBjb21tYW5kIGxpbmUKLUBraW5kZXggLS1keW5hbWljLWxpbmtlciBAdmFye2ZpbGV9Ci1AaXRlbSAtLWR5bmFtaWMtbGlua2VyIEB2YXJ7ZmlsZX0KLVNldCB0aGUgbmFtZSBvZiB0aGUgZHluYW1pYyBsaW5rZXIuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuCi1nZW5lcmF0aW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBFTEYgZXhlY3V0YWJsZXMuICBUaGUgZGVmYXVsdCBkeW5hbWljCi1saW5rZXIgaXMgbm9ybWFsbHkgY29ycmVjdDsgZG9uJ3QgdXNlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZQotZG9pbmcuCi0KLUBjaW5kZXggTUlQUyBlbWJlZGRlZCBQSUMgY29kZQotQGtpbmRleCAtLWVtYmVkZGVkLXJlbG9jcwotQGl0ZW0gLS1lbWJlZGRlZC1yZWxvY3MKLVRoaXMgb3B0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCB3aGVuIGxpbmtpbmcgTUlQUyBlbWJlZGRlZCBQSUMgY29kZSwKLWdlbmVyYXRlZCBieSB0aGUgLW1lbWJlZGRlZC1waWMgb3B0aW9uIHRvIHRoZSBAc2N7Z251fSBjb21waWxlciBhbmQKLWFzc2VtYmxlci4gIEl0IGNhdXNlcyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHRhYmxlIHdoaWNoIG1heSBiZSB1c2VkIGF0Ci1ydW50aW1lIHRvIHJlbG9jYXRlIGFueSBkYXRhIHdoaWNoIHdhcyBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHRvIHBvaW50ZXIKLXZhbHVlcy4gIFNlZSB0aGUgY29kZSBpbiB0ZXN0c3VpdGUvbGQtZW1waWMgZm9yIGRldGFpbHMuCi0KLUBraW5kZXggLS1mb3JjZS1leGUtc3VmZml4Ci1AaXRlbSAgLS1mb3JjZS1leGUtc3VmZml4Ci1NYWtlIHN1cmUgdGhhdCBhbiBvdXRwdXQgZmlsZSBoYXMgYSAuZXhlIHN1ZmZpeC4KLQotSWYgYSBzdWNjZXNzZnVsbHkgYnVpbHQgZnVsbHkgbGlua2VkIG91dHB1dCBmaWxlIGRvZXMgbm90IGhhdmUgYQotQGNvZGV7LmV4ZX0gb3IgQGNvZGV7LmRsbH0gc3VmZml4LCB0aGlzIG9wdGlvbiBmb3JjZXMgdGhlIGxpbmtlciB0byBjb3B5Ci10aGUgb3V0cHV0IGZpbGUgdG8gb25lIG9mIHRoZSBzYW1lIG5hbWUgd2l0aCBhIEBjb2Rley5leGV9IHN1ZmZpeC4gVGhpcwotb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIHVubW9kaWZpZWQgVW5peCBtYWtlZmlsZXMgb24gYSBNaWNyb3NvZnQKLVdpbmRvd3MgaG9zdCwgc2luY2Ugc29tZSB2ZXJzaW9ucyBvZiBXaW5kb3dzIHdvbid0IHJ1biBhbiBpbWFnZSB1bmxlc3MKLWl0IGVuZHMgaW4gYSBAY29kZXsuZXhlfSBzdWZmaXguCi0KLUBraW5kZXggLS1nYy1zZWN0aW9ucwotQGtpbmRleCAtLW5vLWdjLXNlY3Rpb25zCi1AY2luZGV4IGdhcmJhZ2UgY29sbGVjdGlvbgotQGl0ZW0gLS1uby1nYy1zZWN0aW9ucwotQGl0ZW14IC0tZ2Mtc2VjdGlvbnMKLUVuYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdW51c2VkIGlucHV0IHNlY3Rpb25zLiAgSXQgaXMgaWdub3JlZCBvbgotdGFyZ2V0cyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoaXMgb3B0aW9uLiAgVGhpcyBvcHRpb24gaXMgbm90IGNvbXBhdGlibGUKLXdpdGggQHNhbXB7LXJ9LCBub3Igc2hvdWxkIGl0IGJlIHVzZWQgd2l0aCBkeW5hbWljIGxpbmtpbmcuICBUaGUgZGVmYXVsdAotYmVoYXZpb3VyIChvZiBub3QgcGVyZm9ybWluZyB0aGlzIGdhcmJhZ2UgY29sbGVjdGlvbikgY2FuIGJlIHJlc3RvcmVkIGJ5Ci1zcGVjaWZ5aW5nIEBzYW1wey0tbm8tZ2Mtc2VjdGlvbnN9IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0KLUBjaW5kZXggaGVscAotQGNpbmRleCB1c2FnZQotQGtpbmRleCAtLWhlbHAKLUBpdGVtIC0taGVscAotUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBleGl0LgotCi1Aa2luZGV4IC1NYXAKLUBpdGVtIC1NYXAgQHZhcnttYXBmaWxlfQotUHJpbnQgYSBsaW5rIG1hcCB0byB0aGUgZmlsZSBAdmFye21hcGZpbGV9LiAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUKLUBzYW1wey1NfSBvcHRpb24sIGFib3ZlLgotCi1AY2luZGV4IG1lbW9yeSB1c2FnZQotQGtpbmRleCAtLW5vLWtlZXAtbWVtb3J5Ci1AaXRlbSAtLW5vLWtlZXAtbWVtb3J5Ci1AY29kZXtsZH0gbm9ybWFsbHkgb3B0aW1pemVzIGZvciBzcGVlZCBvdmVyIG1lbW9yeSB1c2FnZSBieSBjYWNoaW5nIHRoZQotc3ltYm9sIHRhYmxlcyBvZiBpbnB1dCBmaWxlcyBpbiBtZW1vcnkuICBUaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdG8KLWluc3RlYWQgb3B0aW1pemUgZm9yIG1lbW9yeSB1c2FnZSwgYnkgcmVyZWFkaW5nIHRoZSBzeW1ib2wgdGFibGVzIGFzCi1uZWNlc3NhcnkuICBUaGlzIG1heSBiZSByZXF1aXJlZCBpZiBAY29kZXtsZH0gcnVucyBvdXQgb2YgbWVtb3J5IHNwYWNlCi13aGlsZSBsaW5raW5nIGEgbGFyZ2UgZXhlY3V0YWJsZS4KLQotQGtpbmRleCAtLW5vLXVuZGVmaW5lZAotQGl0ZW0gLS1uby11bmRlZmluZWQKLU5vcm1hbGx5IHdoZW4gY3JlYXRpbmcgYSBub24tc3ltYm9saWMgc2hhcmVkIGxpYnJhcnksIHVuZGVmaW5lZCBzeW1ib2xzCi1hcmUgYWxsb3dlZCBhbmQgbGVmdCB0byBiZSByZXNvbHZlZCBieSB0aGUgcnVudGltZSBsb2FkZXIuICBUaGlzIG9wdGlvbgotZGlzYWxsb3dzIHN1Y2ggdW5kZWZpbmVkIHN5bWJvbHMuCi0KLUBraW5kZXggLS1uby13YXJuLW1pc21hdGNoCi1AaXRlbSAtLW5vLXdhcm4tbWlzbWF0Y2gKLU5vcm1hbGx5IEBjb2Rle2xkfSB3aWxsIGdpdmUgYW4gZXJyb3IgaWYgeW91IHRyeSB0byBsaW5rIHRvZ2V0aGVyIGlucHV0Ci1maWxlcyB0aGF0IGFyZSBtaXNtYXRjaGVkIGZvciBzb21lIHJlYXNvbiwgcGVyaGFwcyBiZWNhdXNlIHRoZXkgaGF2ZQotYmVlbiBjb21waWxlZCBmb3IgZGlmZmVyZW50IHByb2Nlc3NvcnMgb3IgZm9yIGRpZmZlcmVudCBlbmRpYW5uZXNzZXMuCi1UaGlzIG9wdGlvbiB0ZWxscyBAY29kZXtsZH0gdGhhdCBpdCBzaG91bGQgc2lsZW50bHkgcGVybWl0IHN1Y2ggcG9zc2libGUKLWVycm9ycy4gIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBjYXJlLCBpbiBjYXNlcyB3aGVuIHlvdQotaGF2ZSB0YWtlbiBzb21lIHNwZWNpYWwgYWN0aW9uIHRoYXQgZW5zdXJlcyB0aGF0IHRoZSBsaW5rZXIgZXJyb3JzIGFyZQotaW5hcHByb3ByaWF0ZS4KLQotQGtpbmRleCAtLW5vLXdob2xlLWFyY2hpdmUKLUBpdGVtIC0tbm8td2hvbGUtYXJjaGl2ZQotVHVybiBvZmYgdGhlIGVmZmVjdCBvZiB0aGUgQGNvZGV7LS13aG9sZS1hcmNoaXZlfSBvcHRpb24gZm9yIHN1YnNlcXVlbnQKLWFyY2hpdmUgZmlsZXMuCi0KLUBjaW5kZXggb3V0cHV0IGZpbGUgYWZ0ZXIgZXJyb3JzCi1Aa2luZGV4IC0tbm9pbmhpYml0LWV4ZWMKLUBpdGVtIC0tbm9pbmhpYml0LWV4ZWMKLVJldGFpbiB0aGUgZXhlY3V0YWJsZSBvdXRwdXQgZmlsZSB3aGVuZXZlciBpdCBpcyBzdGlsbCB1c2FibGUuCi1Ob3JtYWxseSwgdGhlIGxpbmtlciB3aWxsIG5vdCBwcm9kdWNlIGFuIG91dHB1dCBmaWxlIGlmIGl0IGVuY291bnRlcnMKLWVycm9ycyBkdXJpbmcgdGhlIGxpbmsgcHJvY2VzczsgaXQgZXhpdHMgd2l0aG91dCB3cml0aW5nIGFuIG91dHB1dCBmaWxlCi13aGVuIGl0IGlzc3VlcyBhbnkgZXJyb3Igd2hhdHNvZXZlci4KLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Aa2luZGV4IC0tb2Zvcm1hdAotQGl0ZW0gLS1vZm9ybWF0IEB2YXJ7b3V0cHV0LWZvcm1hdH0KLUBjb2Rle2xkfSBtYXkgYmUgY29uZmlndXJlZCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUga2luZCBvZiBvYmplY3QKLWZpbGUuICBJZiB5b3VyIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRoaXMgd2F5LCB5b3UgY2FuIHVzZSB0aGUKLUBzYW1wey0tb2Zvcm1hdH0gb3B0aW9uIHRvIHNwZWNpZnkgdGhlIGJpbmFyeSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQKLW9iamVjdCBmaWxlLiAgRXZlbiB3aGVuIEBjb2Rle2xkfSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgYWx0ZXJuYXRpdmUKLW9iamVjdCBmb3JtYXRzLCB5b3UgZG9uJ3QgdXN1YWxseSBuZWVkIHRvIHNwZWNpZnkgdGhpcywgYXMgQGNvZGV7bGR9Ci1zaG91bGQgYmUgY29uZmlndXJlZCB0byBwcm9kdWNlIGFzIGEgZGVmYXVsdCBvdXRwdXQgZm9ybWF0IHRoZSBtb3N0Ci11c3VhbCBmb3JtYXQgb24gZWFjaCBtYWNoaW5lLiAgQHZhcntvdXRwdXQtZm9ybWF0fSBpcyBhIHRleHQgc3RyaW5nLCB0aGUKLW5hbWUgb2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIEJGRCBsaWJyYXJpZXMuICAoWW91IGNhbgotbGlzdCB0aGUgYXZhaWxhYmxlIGJpbmFyeSBmb3JtYXRzIHdpdGggQHNhbXB7b2JqZHVtcCAtaX0uKSAgVGhlIHNjcmlwdAotY29tbWFuZCBAY29kZXtPVVRQVVRfRk9STUFUfSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBvdXRwdXQgZm9ybWF0LCBidXQKLXRoaXMgb3B0aW9uIG92ZXJyaWRlcyBpdC4gIEB4cmVme0JGRH0uCi1AZW5kIGlmY2xlYXIKLQotQGtpbmRleCAtcW1hZ2ljCi1AaXRlbSAtcW1hZ2ljCi1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBMaW51eCBjb21wYXRpYmlsaXR5LgotCi1Aa2luZGV4IC1ReQotQGl0ZW0gLVF5Ci1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkuCi0KLUBraW5kZXggLS1yZWxheAotQGNpbmRleCBzeW50aGVzaXppbmcgbGlua2VyCi1AY2luZGV4IHJlbGF4aW5nIGFkZHJlc3NpbmcgbW9kZXMKLUBpdGVtIC0tcmVsYXgKLUFuIG9wdGlvbiB3aXRoIG1hY2hpbmUgZGVwZW5kZW50IGVmZmVjdHMuICAKLUBpZnNldCBHRU5FUklDCi1UaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBvbiBhIGZldyB0YXJnZXRzLgotQGVuZCBpZnNldAotQGlmc2V0IEg4MzAwCi1AeHJlZntIOC8zMDAsLEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMH0uCi1AZW5kIGlmc2V0Ci1AaWZzZXQgSTk2MAotQHhyZWZ7aTk2MCwsIEBjb2Rle2xkfSBhbmQgdGhlIEludGVsIDk2MCBmYW1pbHl9LgotQGVuZCBpZnNldAotCi0KLU9uIHNvbWUgcGxhdGZvcm1zLCB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIHBlcmZvcm1zIGdsb2JhbAotb3B0aW1pemF0aW9ucyB0aGF0IGJlY29tZSBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVzb2x2ZXMgYWRkcmVzc2luZwotaW4gdGhlIHByb2dyYW0sIHN1Y2ggYXMgcmVsYXhpbmcgYWRkcmVzcyBtb2RlcyBhbmQgc3ludGhlc2l6aW5nIG5ldwotaW5zdHJ1Y3Rpb25zIGluIHRoZSBvdXRwdXQgb2JqZWN0IGZpbGUuCi0KLU9uIHNvbWUgcGxhdGZvcm1zIHRoZXNlIGxpbmsgdGltZSBnbG9iYWwgb3B0aW1pemF0aW9ucyBtYXkgbWFrZSBzeW1ib2xpYwotZGVidWdnaW5nIG9mIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSBpbXBvc3NpYmxlLgotQGlmc2V0IEdFTkVSSUMKLVRoaXMgaXMga25vd24gdG8gYmUKLXRoZSBjYXNlIGZvciB0aGUgTWF0c3VzaGl0YSBNTjEwMjAwIGFuZCBNTjEwMzAwIGZhbWlseSBvZiBwcm9jZXNzb3JzLgotQGVuZCBpZnNldAotCi1AaWZzZXQgR0VORVJJQwotT24gcGxhdGZvcm1zIHdoZXJlIHRoaXMgaXMgbm90IHN1cHBvcnRlZCwgQHNhbXB7LS1yZWxheH0gaXMgYWNjZXB0ZWQsCi1idXQgaWdub3JlZC4KLUBlbmQgaWZzZXQKLQotQGNpbmRleCByZXRhaW5pbmcgc3BlY2lmaWVkIHN5bWJvbHMKLUBjaW5kZXggc3RyaXBwaW5nIGFsbCBidXQgc29tZSBzeW1ib2xzCi1AY2luZGV4IHN5bWJvbHMsIHJldGFpbmluZyBzZWxlY3RpdmVseQotQGl0ZW0gLS1yZXRhaW4tc3ltYm9scy1maWxlIEB2YXJ7ZmlsZW5hbWV9Ci1SZXRhaW4gQGVtcGh7b25seX0gdGhlIHN5bWJvbHMgbGlzdGVkIGluIHRoZSBmaWxlIEB2YXJ7ZmlsZW5hbWV9LAotZGlzY2FyZGluZyBhbGwgb3RoZXJzLiAgQHZhcntmaWxlbmFtZX0gaXMgc2ltcGx5IGEgZmxhdCBmaWxlLCB3aXRoIG9uZQotc3ltYm9sIG5hbWUgcGVyIGxpbmUuICBUaGlzIG9wdGlvbiBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBlbnZpcm9ubWVudHMKLUBpZnNldCBHRU5FUklDCi0oc3VjaCBhcyBWeFdvcmtzKQotQGVuZCBpZnNldAotd2hlcmUgYSBsYXJnZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGlzIGFjY3VtdWxhdGVkIGdyYWR1YWxseSwgdG8gY29uc2VydmUKLXJ1bi10aW1lIG1lbW9yeS4KLQotQHNhbXB7LS1yZXRhaW4tc3ltYm9scy1maWxlfSBkb2VzIEBlbXBoe25vdH0gZGlzY2FyZCB1bmRlZmluZWQgc3ltYm9scywKLW9yIHN5bWJvbHMgbmVlZGVkIGZvciByZWxvY2F0aW9ucy4KLQotWW91IG1heSBvbmx5IHNwZWNpZnkgQHNhbXB7LS1yZXRhaW4tc3ltYm9scy1maWxlfSBvbmNlIGluIHRoZSBjb21tYW5kCi1saW5lLiAgSXQgb3ZlcnJpZGVzIEBzYW1wey1zfSBhbmQgQHNhbXB7LVN9LgotCi1AaWZzZXQgR0VORVJJQwotQGl0ZW0gLXJwYXRoIEB2YXJ7ZGlyfQotQGNpbmRleCBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGgKLUBraW5kZXggLXJwYXRoCi1BZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aC4gIFRoaXMgaXMgdXNlZCB3aGVuCi1saW5raW5nIGFuIEVMRiBleGVjdXRhYmxlIHdpdGggc2hhcmVkIG9iamVjdHMuICBBbGwgQGNvZGV7LXJwYXRofQotYXJndW1lbnRzIGFyZSBjb25jYXRlbmF0ZWQgYW5kIHBhc3NlZCB0byB0aGUgcnVudGltZSBsaW5rZXIsIHdoaWNoIHVzZXMKLXRoZW0gdG8gbG9jYXRlIHNoYXJlZCBvYmplY3RzIGF0IHJ1bnRpbWUuICBUaGUgQGNvZGV7LXJwYXRofSBvcHRpb24gaXMKLWFsc28gdXNlZCB3aGVuIGxvY2F0aW5nIHNoYXJlZCBvYmplY3RzIHdoaWNoIGFyZSBuZWVkZWQgYnkgc2hhcmVkCi1vYmplY3RzIGV4cGxpY2l0bHkgaW5jbHVkZWQgaW4gdGhlIGxpbms7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlCi1AY29kZXstcnBhdGgtbGlua30gb3B0aW9uLiAgSWYgQGNvZGV7LXJwYXRofSBpcyBub3QgdXNlZCB3aGVuIGxpbmtpbmcgYW4KLUVMRiBleGVjdXRhYmxlLCB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi1AY29kZXtMRF9SVU5fUEFUSH0gd2lsbCBiZSB1c2VkIGlmIGl0IGlzIGRlZmluZWQuCi0KLVRoZSBAY29kZXstcnBhdGh9IG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VkIG9uIFN1bk9TLiAgQnkgZGVmYXVsdCwgb24KLVN1bk9TLCB0aGUgbGlua2VyIHdpbGwgZm9ybSBhIHJ1bnRpbWUgc2VhcmNoIHBhdGNoIG91dCBvZiBhbGwgdGhlCi1AY29kZXstTH0gb3B0aW9ucyBpdCBpcyBnaXZlbi4gIElmIGEgQGNvZGV7LXJwYXRofSBvcHRpb24gaXMgdXNlZCwgdGhlCi1ydW50aW1lIHNlYXJjaCBwYXRoIHdpbGwgYmUgZm9ybWVkIGV4Y2x1c2l2ZWx5IHVzaW5nIHRoZSBAY29kZXstcnBhdGh9Ci1vcHRpb25zLCBpZ25vcmluZyB0aGUgQGNvZGV7LUx9IG9wdGlvbnMuICBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB1c2luZwotZ2NjLCB3aGljaCBhZGRzIG1hbnkgQGNvZGV7LUx9IG9wdGlvbnMgd2hpY2ggbWF5IGJlIG9uIE5GUyBtb3VudGVkCi1maWxlc3lzdGVtcy4KLQotRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBFTEYgbGlua2VycywgaWYgdGhlIEBjb2Rley1SfSBvcHRpb24gaXMKLWZvbGxvd2VkIGJ5IGEgZGlyZWN0b3J5IG5hbWUsIHJhdGhlciB0aGFuIGEgZmlsZSBuYW1lLCBpdCBpcyB0cmVhdGVkIGFzCi10aGUgQGNvZGV7LXJwYXRofSBvcHRpb24uCi1AZW5kIGlmc2V0Ci0KLUBpZnNldCBHRU5FUklDCi1AY2luZGV4IGxpbmstdGltZSBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGgKLUBraW5kZXggLXJwYXRoLWxpbmsKLUBpdGVtIC1ycGF0aC1saW5rIEB2YXJ7RElSfQotV2hlbiB1c2luZyBFTEYgb3IgU3VuT1MsIG9uZSBzaGFyZWQgbGlicmFyeSBtYXkgcmVxdWlyZSBhbm90aGVyLiAgVGhpcwotaGFwcGVucyB3aGVuIGFuIEBjb2Rle2xkIC1zaGFyZWR9IGxpbmsgaW5jbHVkZXMgYSBzaGFyZWQgbGlicmFyeSBhcyBvbmUKLW9mIHRoZSBpbnB1dCBmaWxlcy4KLQotV2hlbiB0aGUgbGlua2VyIGVuY291bnRlcnMgc3VjaCBhIGRlcGVuZGVuY3kgd2hlbiBkb2luZyBhIG5vbi1zaGFyZWQsCi1ub24tcmVsb2NhdGFibGUgbGluaywgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyeSB0byBsb2NhdGUgdGhlIHJlcXVpcmVkCi1zaGFyZWQgbGlicmFyeSBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbGluaywgaWYgaXQgaXMgbm90IGluY2x1ZGVkCi1leHBsaWNpdGx5LiAgSW4gc3VjaCBhIGNhc2UsIHRoZSBAY29kZXstcnBhdGgtbGlua30gb3B0aW9uCi1zcGVjaWZpZXMgdGhlIGZpcnN0IHNldCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2guICBUaGUKLUBjb2Rley1ycGF0aC1saW5rfSBvcHRpb24gbWF5IHNwZWNpZnkgYSBzZXF1ZW5jZSBvZiBkaXJlY3RvcnkgbmFtZXMKLWVpdGhlciBieSBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBuYW1lcyBzZXBhcmF0ZWQgYnkgY29sb25zLCBvciBieQotYXBwZWFyaW5nIG11bHRpcGxlIHRpbWVzLgotCi1UaGUgbGlua2VyIHVzZXMgdGhlIGZvbGxvd2luZyBzZWFyY2ggcGF0aHMgdG8gbG9jYXRlIHJlcXVpcmVkIHNoYXJlZAotbGlicmFyaWVzLgotQGVudW1lcmF0ZQotQGl0ZW0KLUFueSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgQGNvZGV7LXJwYXRoLWxpbmt9IG9wdGlvbnMuCi1AaXRlbQotQW55IGRpcmVjdG9yaWVzIHNwZWNpZmllZCBieSBAY29kZXstcnBhdGh9IG9wdGlvbnMuICBUaGUgZGlmZmVyZW5jZQotYmV0d2VlbiBAY29kZXstcnBhdGh9IGFuZCBAY29kZXstcnBhdGgtbGlua30gaXMgdGhhdCBkaXJlY3Rvcmllcwotc3BlY2lmaWVkIGJ5IEBjb2Rley1ycGF0aH0gb3B0aW9ucyBhcmUgaW5jbHVkZWQgaW4gdGhlIGV4ZWN1dGFibGUgYW5kCi11c2VkIGF0IHJ1bnRpbWUsIHdoZXJlYXMgdGhlIEBjb2Rley1ycGF0aC1saW5rfSBvcHRpb24gaXMgb25seSBlZmZlY3RpdmUKLWF0IGxpbmsgdGltZS4KLUBpdGVtCi1PbiBhbiBFTEYgc3lzdGVtLCBpZiB0aGUgQGNvZGV7LXJwYXRofSBhbmQgQGNvZGV7cnBhdGgtbGlua30gb3B0aW9ucwotd2VyZSBub3QgdXNlZCwgc2VhcmNoIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0xEX1JVTl9QQVRIfS4KLUBpdGVtCi1PbiBTdW5PUywgaWYgdGhlIEBjb2Rley1ycGF0aH0gb3B0aW9uIHdhcyBub3QgdXNlZCwgc2VhcmNoIGFueQotZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHVzaW5nIEBjb2Rley1MfSBvcHRpb25zLgotQGl0ZW0KLUZvciBhIG5hdGl2ZSBsaW5rZXIsIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLUBjb2Rle0xEX0xJQlJBUllfUEFUSH0uCi1AaXRlbQotVGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMsIG5vcm1hbGx5IEBmaWxley9saWJ9IGFuZCBAZmlsZXsvdXNyL2xpYn0uCi1AaXRlbQotRm9yIGEgbmF0aXZlIGxpbmtlciBvbiBhbiBFTEYgc3lzdGVtLCBpZiB0aGUgZmlsZSBAZmlsZXsvZXRjL2xkLnNvLmNvbmZ9Ci1leGlzdHMsIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIGZvdW5kIGluIHRoYXQgZmlsZS4KLUBlbmQgZW51bWVyYXRlCi0KLUlmIHRoZSByZXF1aXJlZCBzaGFyZWQgbGlicmFyeSBpcyBub3QgZm91bmQsIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhCi13YXJuaW5nIGFuZCBjb250aW51ZSB3aXRoIHRoZSBsaW5rLgotQGVuZCBpZnNldAotCi1Aa2luZGV4IC1zaGFyZWQKLUBraW5kZXggLUJzaGFyZWFibGUKLUBpdGVtIC1zaGFyZWQKLUBpdGVteCAtQnNoYXJlYWJsZQotQGNpbmRleCBzaGFyZWQgbGlicmFyaWVzCi1DcmVhdGUgYSBzaGFyZWQgbGlicmFyeS4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIG9uIEVMRiwgWENPRkYKLWFuZCBTdW5PUyBwbGF0Zm9ybXMuICBPbiBTdW5PUywgdGhlIGxpbmtlciB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEKLXNoYXJlZCBsaWJyYXJ5IGlmIHRoZSBAY29kZXstZX0gb3B0aW9uIGlzIG5vdCB1c2VkIGFuZCB0aGVyZSBhcmUKLXVuZGVmaW5lZCBzeW1ib2xzIGluIHRoZSBsaW5rLgotCi1AaXRlbSAtLXNvcnQtY29tbW9uCi1Aa2luZGV4IC0tc29ydC1jb21tb24KLVRoaXMgb3B0aW9uIHRlbGxzIEBjb2Rle2xkfSB0byBzb3J0IHRoZSBjb21tb24gc3ltYm9scyBieSBzaXplIHdoZW4gaXQKLXBsYWNlcyB0aGVtIGluIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgc2VjdGlvbnMuICBGaXJzdCBjb21lIGFsbCB0aGUgb25lCi1ieXRlIHN5bWJvbHMsIHRoZW4gYWxsIHRoZSB0d28gYnl0ZXMsIHRoZW4gYWxsIHRoZSBmb3VyIGJ5dGVzLCBhbmQgdGhlbgotZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBpcyB0byBwcmV2ZW50IGdhcHMgYmV0d2VlbiBzeW1ib2xzIGR1ZSB0bwotYWxpZ25tZW50IGNvbnN0cmFpbnRzLgotCi1Aa2luZGV4IC0tc3BsaXQtYnktZmlsZQotQGl0ZW0gLS1zcGxpdC1ieS1maWxlCi1TaW1pbGFyIHRvIEBjb2Rley0tc3BsaXQtYnktcmVsb2N9IGJ1dCBjcmVhdGVzIGEgbmV3IG91dHB1dCBzZWN0aW9uIGZvcgotZWFjaCBpbnB1dCBmaWxlLgotCi1Aa2luZGV4IC0tc3BsaXQtYnktcmVsb2MKLUBpdGVtIC0tc3BsaXQtYnktcmVsb2MgQHZhcntjb3VudH0KLVRyeXMgdG8gY3JlYXRlcyBleHRyYSBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgc28gdGhhdCBubyBzaW5nbGUKLW91dHB1dCBzZWN0aW9uIGluIHRoZSBmaWxlIGNvbnRhaW5zIG1vcmUgdGhhbiBAdmFye2NvdW50fSByZWxvY2F0aW9ucy4KLVRoaXMgaXMgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBodWdlIHJlbG9jYXRhYmxlIGZvciBkb3dubG9hZGluZyBpbnRvCi1jZXJ0YWluIHJlYWwgdGltZSBrZXJuZWxzIHdpdGggdGhlIENPRkYgb2JqZWN0IGZpbGUgZm9ybWF0OyBzaW5jZSBDT0ZGCi1jYW5ub3QgcmVwcmVzZW50IG1vcmUgdGhhbiA2NTUzNSByZWxvY2F0aW9ucyBpbiBhIHNpbmdsZSBzZWN0aW9uLiAgTm90ZQotdGhhdCB0aGlzIHdpbGwgZmFpbCB0byB3b3JrIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3QKLXN1cHBvcnQgYXJiaXRyYXJ5IHNlY3Rpb25zLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzcGxpdCB1cCBpbmRpdmlkdWFsCi1pbnB1dCBzZWN0aW9ucyBmb3IgcmVkaXN0cmlidXRpb24sIHNvIGlmIGEgc2luZ2xlIGlucHV0IHNlY3Rpb24gY29udGFpbnMKLW1vcmUgdGhhbiBAdmFye2NvdW50fSByZWxvY2F0aW9ucyBvbmUgb3V0cHV0IHNlY3Rpb24gd2lsbCBjb250YWluIHRoYXQKLW1hbnkgcmVsb2NhdGlvbnMuCi0KLUBraW5kZXggLS1zdGF0cwotQGl0ZW0gLS1zdGF0cwotQ29tcHV0ZSBhbmQgZGlzcGxheSBzdGF0aXN0aWNzIGFib3V0IHRoZSBvcGVyYXRpb24gb2YgdGhlIGxpbmtlciwgc3VjaAotYXMgZXhlY3V0aW9uIHRpbWUgYW5kIG1lbW9yeSB1c2FnZS4KLQotQGtpbmRleCAtLXRyYWRpdGlvbmFsLWZvcm1hdAotQGNpbmRleCB0cmFkaXRpb25hbCBmb3JtYXQKLUBpdGVtIC0tdHJhZGl0aW9uYWwtZm9ybWF0Ci1Gb3Igc29tZSB0YXJnZXRzLCB0aGUgb3V0cHV0IG9mIEBjb2Rle2xkfSBpcyBkaWZmZXJlbnQgaW4gc29tZSB3YXlzIGZyb20KLXRoZSBvdXRwdXQgb2Ygc29tZSBleGlzdGluZyBsaW5rZXIuICBUaGlzIHN3aXRjaCByZXF1ZXN0cyBAY29kZXtsZH0gdG8KLXVzZSB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0IGluc3RlYWQuCi0KLUBjaW5kZXggZGJ4Ci1Gb3IgZXhhbXBsZSwgb24gU3VuT1MsIEBjb2Rle2xkfSBjb21iaW5lcyBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUKLXN5bWJvbCBzdHJpbmcgdGFibGUuICBUaGlzIGNhbiByZWR1Y2UgdGhlIHNpemUgb2YgYW4gb3V0cHV0IGZpbGUgd2l0aAotZnVsbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYnkgb3ZlciAzMCBwZXJjZW50LiAgVW5mb3J0dW5hdGVseSwgdGhlIFN1bk9TCi1AY29kZXtkYnh9IHByb2dyYW0gY2FuIG5vdCByZWFkIHRoZSByZXN1bHRpbmcgcHJvZ3JhbSAoQGNvZGV7Z2RifSBoYXMgbm8KLXRyb3VibGUpLiAgVGhlIEBzYW1wey0tdHJhZGl0aW9uYWwtZm9ybWF0fSBzd2l0Y2ggdGVsbHMgQGNvZGV7bGR9IHRvIG5vdAotY29tYmluZSBkdXBsaWNhdGUgZW50cmllcy4KLQotQGtpbmRleCAtVGJzcyBAdmFye29yZ30KLUBraW5kZXggLVRkYXRhIEB2YXJ7b3JnfQotQGtpbmRleCAtVHRleHQgQHZhcntvcmd9Ci1AY2luZGV4IHNlZ21lbnQgb3JpZ2lucywgY21kIGxpbmUKLUBpdGVtIC1UYnNzIEB2YXJ7b3JnfQotQGl0ZW14IC1UZGF0YSBAdmFye29yZ30KLUBpdGVteCAtVHRleHQgQHZhcntvcmd9Ci1Vc2UgQHZhcntvcmd9IGFzIHRoZSBzdGFydGluZyBhZGRyZXNzIGZvci0tLXJlc3BlY3RpdmVseS0tLXRoZQotQGNvZGV7YnNzfSwgQGNvZGV7ZGF0YX0sIG9yIHRoZSBAY29kZXt0ZXh0fSBzZWdtZW50IG9mIHRoZSBvdXRwdXQgZmlsZS4KLUB2YXJ7b3JnfSBtdXN0IGJlIGEgc2luZ2xlIGhleGFkZWNpbWFsIGludGVnZXI7Ci1mb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIGxpbmtlcnMsIHlvdSBtYXkgb21pdCB0aGUgbGVhZGluZwotQHNhbXB7MHh9IHVzdWFsbHkgYXNzb2NpYXRlZCB3aXRoIGhleGFkZWNpbWFsIHZhbHVlcy4KLQotQGtpbmRleCAtLXZlcmJvc2UKLUBjaW5kZXggdmVyYm9zZQotQGl0ZW0gLS1kbGwtdmVyYm9zZQotQGl0ZW14IC0tdmVyYm9zZQotRGlzcGxheSB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIEBjb2Rle2xkfSBhbmQgbGlzdCB0aGUgbGlua2VyIGVtdWxhdGlvbnMKLXN1cHBvcnRlZC4gIERpc3BsYXkgd2hpY2ggaW5wdXQgZmlsZXMgY2FuIGFuZCBjYW5ub3QgYmUgb3BlbmVkLiAgRGlzcGxheQotdGhlIGxpbmtlciBzY3JpcHQgaWYgdXNpbmcgYSBkZWZhdWx0IGJ1aWx0aW4gc2NyaXB0LgotCi1Aa2luZGV4IC0tdmVyc2lvbi1zY3JpcHQ9QHZhcnt2ZXJzaW9uLXNjcmlwdGZpbGV9Ci1AY2luZGV4IHZlcnNpb24gc2NyaXB0LCBzeW1ib2wgdmVyc2lvbnMKLUBpdGVteCAtLXZlcnNpb24tc2NyaXB0PUB2YXJ7dmVyc2lvbi1zY3JpcHRmaWxlfQotU3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZlcnNpb24gc2NyaXB0IHRvIHRoZSBsaW5rZXIuICBUaGlzIGlzIHR5cGljYWxseQotdXNlZCB3aGVuIGNyZWF0aW5nIHNoYXJlZCBsaWJyYXJpZXMgdG8gc3BlY2lmeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgdmVyc2lvbiBoZWlyYXJjaHkgZm9yIHRoZSBsaWJyYXJ5IGJlaW5nIGNyZWF0ZWQuICBUaGlzIG9wdGlvbgotaXMgb25seSBtZWFuaW5nZnVsIG9uIEVMRiBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzLgotQHhyZWZ7VkVSU0lPTn0uCi0KLUBraW5kZXggLS13YXJuLWNvbW9uCi1AY2luZGV4IHdhcm5pbmdzLCBvbiBjb21iaW5pbmcgc3ltYm9scwotQGNpbmRleCBjb21iaW5pbmcgc3ltYm9scywgd2FybmluZ3Mgb24KLUBpdGVtIC0td2Fybi1jb21tb24KLVdhcm4gd2hlbiBhIGNvbW1vbiBzeW1ib2wgaXMgY29tYmluZWQgd2l0aCBhbm90aGVyIGNvbW1vbiBzeW1ib2wgb3Igd2l0aAotYSBzeW1ib2wgZGVmaW5pdGlvbi4gIFVuaXggbGlua2VycyBhbGxvdyB0aGlzIHNvbWV3aGF0IHNsb3BweSBwcmFjdGljZSwKLWJ1dCBsaW5rZXJzIG9uIHNvbWUgb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMgZG8gbm90LiAgVGhpcyBvcHRpb24gYWxsb3dzCi15b3UgdG8gZmluZCBwb3RlbnRpYWwgcHJvYmxlbXMgZnJvbSBjb21iaW5pbmcgZ2xvYmFsIHN5bWJvbHMuCi1VbmZvcnR1bmF0ZWx5LCBzb21lIEMgbGlicmFyaWVzIHVzZSB0aGlzIHByYWN0aWNlLCBzbyB5b3UgbWF5IGdldCBzb21lCi13YXJuaW5ncyBhYm91dCBzeW1ib2xzIGluIHRoZSBsaWJyYXJpZXMgYXMgd2VsbCBhcyBpbiB5b3VyIHByb2dyYW1zLgotCi1UaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgZ2xvYmFsIHN5bWJvbHMsIGlsbHVzdHJhdGVkIGhlcmUgYnkgQyBleGFtcGxlczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBpbnQgaSA9IDE7Ci1BIGRlZmluaXRpb24sIHdoaWNoIGdvZXMgaW4gdGhlIGluaXRpYWxpemVkIGRhdGEgc2VjdGlvbiBvZiB0aGUgb3V0cHV0Ci1maWxlLgotCi1AaXRlbSBleHRlcm4gaW50IGk7Ci1BbiB1bmRlZmluZWQgcmVmZXJlbmNlLCB3aGljaCBkb2VzIG5vdCBhbGxvY2F0ZSBzcGFjZS4KLVRoZXJlIG11c3QgYmUgZWl0aGVyIGEgZGVmaW5pdGlvbiBvciBhIGNvbW1vbiBzeW1ib2wgZm9yIHRoZQotdmFyaWFibGUgc29tZXdoZXJlLgotCi1AaXRlbSBpbnQgaTsKLUEgY29tbW9uIHN5bWJvbC4gIElmIHRoZXJlIGFyZSBvbmx5IChvbmUgb3IgbW9yZSkgY29tbW9uIHN5bWJvbHMgZm9yIGEKLXZhcmlhYmxlLCBpdCBnb2VzIGluIHRoZSB1bmluaXRpYWxpemVkIGRhdGEgYXJlYSBvZiB0aGUgb3V0cHV0IGZpbGUuCi1UaGUgbGlua2VyIG1lcmdlcyBtdWx0aXBsZSBjb21tb24gc3ltYm9scyBmb3IgdGhlIHNhbWUgdmFyaWFibGUgaW50byBhCi1zaW5nbGUgc3ltYm9sLiAgSWYgdGhleSBhcmUgb2YgZGlmZmVyZW50IHNpemVzLCBpdCBwaWNrcyB0aGUgbGFyZ2VzdAotc2l6ZS4gIFRoZSBsaW5rZXIgdHVybnMgYSBjb21tb24gc3ltYm9sIGludG8gYSBkZWNsYXJhdGlvbiwgaWYgdGhlcmUgaXMKLWEgZGVmaW5pdGlvbiBvZiB0aGUgc2FtZSB2YXJpYWJsZS4KLUBlbmQgdGFibGUKLQotVGhlIEBzYW1wey0td2Fybi1jb21tb259IG9wdGlvbiBjYW4gcHJvZHVjZSBmaXZlIGtpbmRzIG9mIHdhcm5pbmdzLgotRWFjaCB3YXJuaW5nIGNvbnNpc3RzIG9mIGEgcGFpciBvZiBsaW5lczogdGhlIGZpcnN0IGRlc2NyaWJlcyB0aGUgc3ltYm9sCi1qdXN0IGVuY291bnRlcmVkLCBhbmQgdGhlIHNlY29uZCBkZXNjcmliZXMgdGhlIHByZXZpb3VzIHN5bWJvbAotZW5jb3VudGVyZWQgd2l0aCB0aGUgc2FtZSBuYW1lLiAgT25lIG9yIGJvdGggb2YgdGhlIHR3byBzeW1ib2xzIHdpbGwgYmUKLWEgY29tbW9uIHN5bWJvbC4KLQotQGVudW1lcmF0ZQotQGl0ZW0KLVR1cm5pbmcgYSBjb21tb24gc3ltYm9sIGludG8gYSByZWZlcmVuY2UsIGJlY2F1c2UgdGhlcmUgaXMgYWxyZWFkeSBhCi1kZWZpbml0aW9uIGZvciB0aGUgc3ltYm9sLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkZGVuIGJ5IGRlZmluaXRpb24KLUB2YXJ7ZmlsZX0oQHZhcntzZWN0aW9ufSk6IHdhcm5pbmc6IGRlZmluZWQgaGVyZQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0KLVR1cm5pbmcgYSBjb21tb24gc3ltYm9sIGludG8gYSByZWZlcmVuY2UsIGJlY2F1c2UgYSBsYXRlciBkZWZpbml0aW9uIGZvcgotdGhlIHN5bWJvbCBpcyBlbmNvdW50ZXJlZC4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGNhc2UsCi1leGNlcHQgdGhhdCB0aGUgc3ltYm9scyBhcmUgZW5jb3VudGVyZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkaW5nIGNvbW1vbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIGlzIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1NZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgc2FtZS1zaXplZCBjb21tb24gc3ltYm9sLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogbXVsdGlwbGUgY29tbW9uCi0gICBvZiBgQHZhcntzeW1ib2x9JwotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogcHJldmlvdXMgY29tbW9uIGlzIGhlcmUKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtCi1NZXJnaW5nIGEgY29tbW9uIHN5bWJvbCB3aXRoIGEgcHJldmlvdXMgbGFyZ2VyIGNvbW1vbiBzeW1ib2wuCi1Ac21hbGxleGFtcGxlCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBjb21tb24gb2YgYEB2YXJ7c3ltYm9sfScKLSAgIG92ZXJyaWRkZW4gYnkgbGFyZ2VyIGNvbW1vbgotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogbGFyZ2VyIGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbQotTWVyZ2luZyBhIGNvbW1vbiBzeW1ib2wgd2l0aCBhIHByZXZpb3VzIHNtYWxsZXIgY29tbW9uIHN5bWJvbC4gIFRoaXMgaXMKLXRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBjYXNlLCBleGNlcHQgdGhhdCB0aGUgc3ltYm9scyBhcmUKLWVuY291bnRlcmVkIGluIGEgZGlmZmVyZW50IG9yZGVyLgotQHNtYWxsZXhhbXBsZQotQHZhcntmaWxlfShAdmFye3NlY3Rpb259KTogd2FybmluZzogY29tbW9uIG9mIGBAdmFye3N5bWJvbH0nCi0gICBvdmVycmlkaW5nIHNtYWxsZXIgY29tbW9uCi1AdmFye2ZpbGV9KEB2YXJ7c2VjdGlvbn0pOiB3YXJuaW5nOiBzbWFsbGVyIGNvbW1vbiBpcyBoZXJlCi1AZW5kIHNtYWxsZXhhbXBsZQotQGVuZCBlbnVtZXJhdGUKLQotQGtpbmRleCAtLXdhcm4tY29uc3RydWN0b3JzCi1AaXRlbSAtLXdhcm4tY29uc3RydWN0b3JzCi1XYXJuIGlmIGFueSBnbG9iYWwgY29uc3RydWN0b3JzIGFyZSB1c2VkLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBmb3IgYSBmZXcKLW9iamVjdCBmaWxlIGZvcm1hdHMuICBGb3IgZm9ybWF0cyBsaWtlIENPRkYgb3IgRUxGLCB0aGUgbGlua2VyIGNhbiBub3QKLWRldGVjdCB0aGUgdXNlIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMuCi0KLUBraW5kZXggLS13YXJuLW11bHRpcGxlLWdwCi1AaXRlbSAtLXdhcm4tbXVsdGlwbGUtZ3AKLVdhcm4gaWYgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIgdmFsdWVzIGFyZSByZXF1aXJlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi1UaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgY2VydGFpbiBwcm9jZXNzb3JzLCBzdWNoIGFzIHRoZSBBbHBoYS4KLVNwZWNpZmljYWxseSwgc29tZSBwcm9jZXNzb3JzIHB1dCBsYXJnZS12YWx1ZWQgY29uc3RhbnRzIGluIGEgc3BlY2lhbAotc2VjdGlvbi4gIEEgc3BlY2lhbCByZWdpc3RlciAodGhlIGdsb2JhbCBwb2ludGVyKSBwb2ludHMgaW50byB0aGUgbWlkZGxlCi1vZiB0aGlzIHNlY3Rpb24sIHNvIHRoYXQgY29uc3RhbnRzIGNhbiBiZSBsb2FkZWQgZWZmaWNpZW50bHkgdmlhIGEKLWJhc2UtcmVnaXN0ZXIgcmVsYXRpdmUgYWRkcmVzc2luZyBtb2RlLiAgU2luY2UgdGhlIG9mZnNldCBpbgotYmFzZS1yZWdpc3RlciByZWxhdGl2ZSBtb2RlIGlzIGZpeGVkIGFuZCByZWxhdGl2ZWx5IHNtYWxsIChlLmcuLCAxNgotYml0cyksIHRoaXMgbGltaXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbnN0YW50IHBvb2wuICBUaHVzLCBpbgotbGFyZ2UgcHJvZ3JhbXMsIGl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byB1c2UgbXVsdGlwbGUgZ2xvYmFsIHBvaW50ZXIKLXZhbHVlcyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGFkZHJlc3MgYWxsIHBvc3NpYmxlIGNvbnN0YW50cy4gIFRoaXMKLW9wdGlvbiBjYXVzZXMgYSB3YXJuaW5nIHRvIGJlIGlzc3VlZCB3aGVuZXZlciB0aGlzIGNhc2Ugb2NjdXJzLgotCi1Aa2luZGV4IC0td2Fybi1vbmNlCi1AY2luZGV4IHdhcm5pbmdzLCBvbiB1bmRlZmluZWQgc3ltYm9scwotQGNpbmRleCB1bmRlZmluZWQgc3ltYm9scywgd2FybmluZ3Mgb24KLUBpdGVtIC0td2Fybi1vbmNlCi1Pbmx5IHdhcm4gb25jZSBmb3IgZWFjaCB1bmRlZmluZWQgc3ltYm9sLCByYXRoZXIgdGhhbiBvbmNlIHBlciBtb2R1bGUKLXdoaWNoIHJlZmVycyB0byBpdC4KLQotQGtpbmRleCAtLXdhcm4tc2VjdGlvbi1hbGlnbgotQGNpbmRleCB3YXJuaW5ncywgb24gc2VjdGlvbiBhbGlnbm1lbnQKLUBjaW5kZXggc2VjdGlvbiBhbGlnbm1lbnQsIHdhcm5pbmdzIG9uCi1AaXRlbSAtLXdhcm4tc2VjdGlvbi1hbGlnbgotV2FybiBpZiB0aGUgYWRkcmVzcyBvZiBhbiBvdXRwdXQgc2VjdGlvbiBpcyBjaGFuZ2VkIGJlY2F1c2Ugb2YKLWFsaWdubWVudC4gIFR5cGljYWxseSwgdGhlIGFsaWdubWVudCB3aWxsIGJlIHNldCBieSBhbiBpbnB1dCBzZWN0aW9uLgotVGhlIGFkZHJlc3Mgd2lsbCBvbmx5IGJlIGNoYW5nZWQgaWYgaXQgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB0aGF0Ci1pcywgaWYgdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGRvZXMgbm90IHNwZWNpZnkgYSBzdGFydCBhZGRyZXNzIGZvcgotdGhlIHNlY3Rpb24gKEBweHJlZntTRUNUSU9OU30pLgotCi1Aa2luZGV4IC0td2hvbGUtYXJjaGl2ZQotQGNpbmRleCBpbmNsdWRpbmcgYW4gZW50aXJlIGFyY2hpdmUKLUBpdGVtIC0td2hvbGUtYXJjaGl2ZQotRm9yIGVhY2ggYXJjaGl2ZSBtZW50aW9uZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlciB0aGUKLUBjb2Rley0td2hvbGUtYXJjaGl2ZX0gb3B0aW9uLCBpbmNsdWRlIGV2ZXJ5IG9iamVjdCBmaWxlIGluIHRoZSBhcmNoaXZlCi1pbiB0aGUgbGluaywgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIHRoZSBhcmNoaXZlIGZvciB0aGUgcmVxdWlyZWQgb2JqZWN0Ci1maWxlcy4gIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCB0byB0dXJuIGFuIGFyY2hpdmUgZmlsZSBpbnRvIGEgc2hhcmVkCi1saWJyYXJ5LCBmb3JjaW5nIGV2ZXJ5IG9iamVjdCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIHNoYXJlZAotbGlicmFyeS4gIFRoaXMgb3B0aW9uIG1heSBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlLgotCi1Aa2luZGV4IC0td3JhcAotQGl0ZW0gLS13cmFwIEB2YXJ7c3ltYm9sfQotVXNlIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgQHZhcntzeW1ib2x9LiAgQW55IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8KLUB2YXJ7c3ltYm9sfSB3aWxsIGJlIHJlc29sdmVkIHRvIEBjb2Rle19fd3JhcF9AdmFye3N5bWJvbH19LiAgQW55Ci11bmRlZmluZWQgcmVmZXJlbmNlIHRvIEBjb2Rle19fcmVhbF9AdmFye3N5bWJvbH19IHdpbGwgYmUgcmVzb2x2ZWQgdG8KLUB2YXJ7c3ltYm9sfS4KLQotVGhpcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgd3JhcHBlciBmb3IgYSBzeXN0ZW0gZnVuY3Rpb24uICBUaGUKLXdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBAY29kZXtfX3dyYXBfQHZhcntzeW1ib2x9fS4gIElmIGl0Ci13aXNoZXMgdG8gY2FsbCB0aGUgc3lzdGVtIGZ1bmN0aW9uLCBpdCBzaG91bGQgY2FsbAotQGNvZGV7X19yZWFsX0B2YXJ7c3ltYm9sfX0uCi0KLUhlcmUgaXMgYSB0cml2aWFsIGV4YW1wbGU6Ci0KLUBzbWFsbGV4YW1wbGUKLXZvaWQgKgotX193cmFwX21hbGxvYyAoaW50IGMpCi1AewotICBwcmludGYgKCJtYWxsb2MgY2FsbGVkIHdpdGggJWxkXG4iLCBjKTsKLSAgcmV0dXJuIF9fcmVhbF9tYWxsb2MgKGMpOwotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUlmIHlvdSBsaW5rIG90aGVyIGNvZGUgd2l0aCB0aGlzIGZpbGUgdXNpbmcgQGNvZGV7LS13cmFwIG1hbGxvY30sIHRoZW4KLWFsbCBjYWxscyB0byBAY29kZXttYWxsb2N9IHdpbGwgY2FsbCB0aGUgZnVuY3Rpb24gQGNvZGV7X193cmFwX21hbGxvY30KLWluc3RlYWQuICBUaGUgY2FsbCB0byBAY29kZXtfX3JlYWxfbWFsbG9jfSBpbiBAY29kZXtfX3dyYXBfbWFsbG9jfSB3aWxsCi1jYWxsIHRoZSByZWFsIEBjb2Rle21hbGxvY30gZnVuY3Rpb24uCi0KLVlvdSBtYXkgd2lzaCB0byBwcm92aWRlIGEgQGNvZGV7X19yZWFsX21hbGxvY30gZnVuY3Rpb24gYXMgd2VsbCwgc28gdGhhdAotbGlua3Mgd2l0aG91dCB0aGUgQGNvZGV7LS13cmFwfSBvcHRpb24gd2lsbCBzdWNjZWVkLiAgSWYgeW91IGRvIHRoaXMsCi15b3Ugc2hvdWxkIG5vdCBwdXQgdGhlIGRlZmluaXRpb24gb2YgQGNvZGV7X19yZWFsX21hbGxvY30gaW4gdGhlIHNhbWUKLWZpbGUgYXMgQGNvZGV7X193cmFwX21hbGxvY307IGlmIHlvdSBkbywgdGhlIGFzc2VtYmxlciBtYXkgcmVzb2x2ZSB0aGUKLWNhbGwgYmVmb3JlIHRoZSBsaW5rZXIgaGFzIGEgY2hhbmNlIHRvIHdyYXAgaXQgdG8gQGNvZGV7bWFsbG9jfS4KLQotQGVuZCB0YWJsZQotCi1Ac3Vic2VjdGlvbiBPcHRpb25zIHNwZWNpZmljIHRvIGkzODYgUEUgdGFyZ2V0cwotCi1UaGUgaTM4NiBQRSBsaW5rZXIgc3VwcG9ydHMgdGhlIEBjb2Rley1zaGFyZWR9IG9wdGlvbiwgd2hpY2ggY2F1c2VzCi10aGUgb3V0cHV0IHRvIGJlIGEgZHluYW1pY2FsbHkgbGlua2VkIGxpYnJhcnkgKERMTCkgaW5zdGVhZCBvZiBhCi1ub3JtYWwgZXhlY3V0YWJsZS4gIFlvdSBzaG91bGQgbmFtZSB0aGUgb3V0cHV0IEBjb2RleyouZGxsfSB3aGVuIHlvdQotdXNlIHRoaXMgb3B0aW9uLiAgSW4gYWRkaXRpb24sIHRoZSBsaW5rZXIgZnVsbHkgc3VwcG9ydHMgdGhlIHN0YW5kYXJkCi1AY29kZXsqLmRlZn0gZmlsZXMsIHdoaWNoIG1heSBiZSBzcGVjaWZpZWQgb24gdGhlIGxpbmtlciBjb21tYW5kIGxpbmUKLWxpa2UgYW4gb2JqZWN0IGZpbGUgKGluIGZhY3QsIGl0IHNob3VsZCBwcmVjZWRlIGFyY2hpdmVzIGl0IGV4cG9ydHMKLXN5bWJvbHMgZnJvbSwgdG8gZW5zdXJlIHRoYXQgdGhleSBnZXQgbGlua2VkIGluLCBqdXN0IGxpa2UgYSBub3JtYWwKLW9iamVjdCBmaWxlKS4KLQotSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgY29tbW9uIHRvIGFsbCB0YXJnZXRzLCB0aGUgaTM4NiBQRSBsaW5rZXIKLXN1cHBvcnQgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgaTM4NgotUEUgdGFyZ2V0LiAgT3B0aW9ucyB0aGF0IHRha2UgdmFsdWVzIG1heSBiZSBzZXBhcmF0ZWQgZnJvbSB0aGVpcgotdmFsdWVzIGJ5IGVpdGhlciBhIHNwYWNlIG9yIGFuIGVxdWFscyBzaWduLgotCi1AdGFibGUgQGNvZGUKLQotQGtpbmRleCAtLWFkZC1zdGRjYWxsLWFsaWFzCi1AaXRlbSAtLWFkZC1zdGRjYWxsLWFsaWFzCi1JZiBnaXZlbiwgc3ltYm9scyB3aXRoIGEgc3RkY2FsbCBzdWZmaXggKEBAQHZhcntubn0pIHdpbGwgYmUgZXhwb3J0ZWQKLWFzLWlzIGFuZCBhbHNvIHdpdGggdGhlIHN1ZmZpeCBzdHJpcHBlZC4KLQotQGtpbmRleCAtLWJhc2UtZmlsZQotQGl0ZW0gLS1iYXNlLWZpbGUgQHZhcntmaWxlfQotVXNlIEB2YXJ7ZmlsZX0gYXMgdGhlIG5hbWUgb2YgYSBmaWxlIGluIHdoaWNoIHRvIHNhdmUgdGhlIGJhc2UKLWFkZHJlc3NlcyBvZiBhbGwgdGhlIHJlbG9jYXRpb25zIG5lZWRlZCBmb3IgZ2VuZXJhdGluZyBETExzIHdpdGgKLUBmaWxle2RsbHRvb2x9LgotCi1Aa2luZGV4IC0tZGxsCi1AaXRlbSAtLWRsbAotQ3JlYXRlIGEgRExMIGluc3RlYWQgb2YgYSByZWd1bGFyIGV4ZWN1dGFibGUuICBZb3UgbWF5IGFsc28gdXNlCi1AY29kZXstc2hhcmVkfSBvciBzcGVjaWZ5IGEgQGNvZGV7TElCUkFSWX0gaW4gYSBnaXZlbiBAY29kZXsuZGVmfQotZmlsZS4KLQotQGtpbmRleCAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwCi1Aa2luZGV4IC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwCi1AaXRlbSAtLWVuYWJsZS1zdGRjYWxsLWZpeHVwCi1AaXRlbXggLS1kaXNhYmxlLXN0ZGNhbGwtZml4dXAKLUlmIHRoZSBsaW5rIGZpbmRzIGEgc3ltYm9sIHRoYXQgaXQgY2Fubm90IHJlc29sdmUsIGl0IHdpbGwgYXR0ZW1wdCB0bwotZG8gImZ1enp5IGxpbmtpbmciIGJ5IGxvb2tpbmcgZm9yIGFub3RoZXIgZGVmaW5lZCBzeW1ib2wgdGhhdCBkaWZmZXJzCi1vbmx5IGluIHRoZSBmb3JtYXQgb2YgdGhlIHN5bWJvbCBuYW1lIChjZGVjbCB2cyBzdGRjYWxsKSBhbmQgd2lsbAotcmVzb2x2ZSB0aGF0IHN5bWJvbCBieSBsaW5raW5nIHRvIHRoZSBtYXRjaC4gIEZvciBleGFtcGxlLCB0aGUKLXVuZGVmaW5lZCBzeW1ib2wgQGNvZGV7X2Zvb30gbWlnaHQgYmUgbGlua2VkIHRvIHRoZSBmdW5jdGlvbgotQGNvZGV7X2Zvb0BAMTJ9LCBvciB0aGUgdW5kZWZpbmVkIHN5bWJvbCBAY29kZXtfYmFyQEAxNn0gbWlnaHQgYmUgbGlua2VkCi10byB0aGUgZnVuY3Rpb24gQGNvZGV7X2Jhcn0uICBXaGVuIHRoZSBsaW5rZXIgZG9lcyB0aGlzLCBpdCBwcmludHMgYQotd2FybmluZywgc2luY2UgaXQgbm9ybWFsbHkgc2hvdWxkIGhhdmUgZmFpbGVkIHRvIGxpbmssIGJ1dCBzb21ldGltZXMKLWltcG9ydCBsaWJyYXJpZXMgZ2VuZXJhdGVkIGZyb20gdGhpcmQtcGFydHkgZGxscyBtYXkgbmVlZCB0aGlzIGZlYXR1cmUKLXRvIGJlIHVzYWJsZS4gIElmIHlvdSBzcGVjaWZ5IEBjb2Rley0tZW5hYmxlLXN0ZGNhbGwtZml4dXB9LCB0aGlzCi1mZWF0dXJlIGlzIGZ1bGx5IGVuYWJsZWQgYW5kIHdhcm5pbmdzIGFyZSBub3QgcHJpbnRlZC4gIElmIHlvdSBzcGVjaWZ5Ci1AY29kZXstLWRpc2FibGUtc3RkY2FsbC1maXh1cH0sIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBhbmQgc3VjaAotbWlzbWF0Y2hlcyBhcmUgY29uc2lkZXJlZCB0byBiZSBlcnJvcnMuCi0KLUBjaW5kZXggRExMcywgY3JlYXRpbmcKLUBraW5kZXggLS1leHBvcnQtYWxsLXN5bWJvbHMKLUBpdGVtIC0tZXhwb3J0LWFsbC1zeW1ib2xzCi1JZiBnaXZlbiwgYWxsIGdsb2JhbCBzeW1ib2xzIGluIHRoZSBvYmplY3RzIHVzZWQgdG8gYnVpbGQgYSBETEwgd2lsbAotYmUgZXhwb3J0ZWQgYnkgdGhlIERMTC4gIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBkZWZhdWx0IGlmIHRoZXJlCi1vdGhlcndpc2Ugd291bGRuJ3QgYmUgYW55IGV4cG9ydGVkIHN5bWJvbHMuICBXaGVuIHN5bWJvbHMgYXJlCi1leHBsaWNpdGx5IGV4cG9ydGVkIHZpYSBERUYgZmlsZXMgb3IgaW1wbGljaXRseSBleHBvcnRlZCB2aWEgZnVuY3Rpb24KLWF0dHJpYnV0ZXMsIHRoZSBkZWZhdWx0IGlzIHRvIG5vdCBleHBvcnQgYW55dGhpbmcgZWxzZSB1bmxlc3MgdGhpcwotb3B0aW9uIGlzIGdpdmVuLiAgTm90ZSB0aGF0IHRoZSBzeW1ib2xzIEBjb2Rle0RsbE1haW5AQDEyfSwKLUBjb2Rle0RsbEVudHJ5UG9pbnRAQDB9LCBhbmQgQGNvZGV7aW1wdXJlX3B0cn0gd2lsbCBub3QgYmUgYXV0b21hdGljYWxseQotZXhwb3J0ZWQuCi0KLUBraW5kZXggLS1leGNsdWRlLXN5bWJvbHMKLUBpdGVtIC0tZXhjbHVkZS1zeW1ib2xzIEB2YXJ7c3ltYm9sLHN5bWJvbCwuLi59Ci1TcGVjaWZpZXMgYSBsaXN0IG9mIHN5bWJvbHMgd2hpY2ggc2hvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5Ci1leHBvcnRlZC4gIFRoZSBzeW1ib2wgbmFtZXMgbWF5IGJlIGRlbGltaXRlZCBieSBjb21tYXMgb3IgY29sb25zLgotCi1Aa2luZGV4IC0tZmlsZS1hbGlnbm1lbnQKLUBpdGVtIC0tZmlsZS1hbGlnbm1lbnQKLVNwZWNpZnkgdGhlIGZpbGUgYWxpZ25tZW50LiAgU2VjdGlvbnMgaW4gdGhlIGZpbGUgd2lsbCBhbHdheXMgYmVnaW4gYXQKLWZpbGUgb2Zmc2V0cyB3aGljaCBhcmUgbXVsdGlwbGVzIG9mIHRoaXMgbnVtYmVyLiAgVGhpcyBkZWZhdWx0cyB0bwotNTEyLgotCi1AY2luZGV4IGhlYXAgc2l6ZQotQGtpbmRleCAtLWhlYXAKLUBpdGVtIC0taGVhcCBAdmFye3Jlc2VydmV9Ci1AaXRlbXggLS1oZWFwIEB2YXJ7cmVzZXJ2ZX0sQHZhcntjb21taXR9Ci1TcGVjaWZ5IHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlc2VydmUgKGFuZCBvcHRpb25hbGx5IGNvbW1pdCkgdG8gYmUKLXVzZWQgYXMgaGVhcCBmb3IgdGhpcyBwcm9ncmFtLiAgVGhlIGRlZmF1bHQgaXMgMU1iIHJlc2VydmVkLCA0SwotY29tbWl0dGVkLgotCi1AY2luZGV4IGltYWdlIGJhc2UKLUBraW5kZXggLS1pbWFnZS1iYXNlCi1AaXRlbSAtLWltYWdlLWJhc2UgQHZhcnt2YWx1ZX0KLVVzZSBAdmFye3ZhbHVlfSBhcyB0aGUgYmFzZSBhZGRyZXNzIG9mIHlvdXIgcHJvZ3JhbSBvciBkbGwuICBUaGlzIGlzCi10aGUgbG93ZXN0IG1lbW9yeSBsb2NhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdXIgcHJvZ3JhbSBvciBkbGwKLWlzIGxvYWRlZC4gIFRvIHJlZHVjZSB0aGUgbmVlZCB0byByZWxvY2F0ZSBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZSBvZgoteW91ciBkbGxzLCBlYWNoIHNob3VsZCBoYXZlIGEgdW5pcXVlIGJhc2UgYWRkcmVzcyBhbmQgbm90IG92ZXJsYXAgYW55Ci1vdGhlciBkbGxzLiAgVGhlIGRlZmF1bHQgaXMgMHg0MDAwMDAgZm9yIGV4ZWN1dGFibGVzLCBhbmQgMHgxMDAwMDAwMAotZm9yIGRsbHMuCi0KLUBraW5kZXggLS1raWxsLWF0Ci1AaXRlbSAtLWtpbGwtYXQKLUlmIGdpdmVuLCB0aGUgc3RkY2FsbCBzdWZmaXhlcyAoQEBAdmFye25ufSkgd2lsbCBiZSBzdHJpcHBlZCBmcm9tCi1zeW1ib2xzIGJlZm9yZSB0aGV5IGFyZSBleHBvcnRlZC4KLQotQGtpbmRleCAtLW1ham9yLWltYWdlLXZlcnNpb24KLUBpdGVtIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAiaW1hZ2UgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAxLgotCi1Aa2luZGV4IC0tbWFqb3Itb3MtdmVyc2lvbgotQGl0ZW0gLS1tYWpvci1vcy12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtYWpvciBudW1iZXIgb2YgdGhlICJvcyB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDQuCi0KLUBraW5kZXggLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbgotQGl0ZW0gLS1tYWpvci1zdWJzeXN0ZW0tdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSAic3Vic3lzdGVtIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gNC4KLQotQGtpbmRleCAtLW1pbm9yLWltYWdlLXZlcnNpb24KLUBpdGVtIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAiaW1hZ2UgdmVyc2lvbiIuICBEZWZhdWx0cyB0byAwLgotCi1Aa2luZGV4IC0tbWlub3Itb3MtdmVyc2lvbgotQGl0ZW0gLS1taW5vci1vcy12ZXJzaW9uIEB2YXJ7dmFsdWV9Ci1TZXRzIHRoZSBtaW5vciBudW1iZXIgb2YgdGhlICJvcyB2ZXJzaW9uIi4gIERlZmF1bHRzIHRvIDAuCi0KLUBraW5kZXggLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbgotQGl0ZW0gLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbiBAdmFye3ZhbHVlfQotU2V0cyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSAic3Vic3lzdGVtIHZlcnNpb24iLiAgRGVmYXVsdHMgdG8gMC4KLQotQGNpbmRleCBERUYgZmlsZXMsIGNyZWF0aW5nCi1AY2luZGV4IERMTHMsIGNyZWF0aW5nCi1Aa2luZGV4IC0tb3V0cHV0LWRlZgotQGl0ZW0gLS1vdXRwdXQtZGVmIEB2YXJ7ZmlsZX0KLVRoZSBsaW5rZXIgd2lsbCBjcmVhdGUgdGhlIGZpbGUgQHZhcntmaWxlfSB3aGljaCB3aWxsIGNvbnRhaW4gYSBERUYKLWZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgRExMIHRoZSBsaW5rZXIgaXMgZ2VuZXJhdGluZy4gIFRoaXMgREVGIGZpbGUKLSh3aGljaCBzaG91bGQgYmUgY2FsbGVkIEBjb2RleyouZGVmfSkgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGFuIGltcG9ydAotbGlicmFyeSB3aXRoIEBjb2Rle2RsbHRvb2x9IG9yIG1heSBiZSB1c2VkIGFzIGEgcmVmZXJlbmNlIHRvCi1hdXRvbWF0aWNhbGx5IG9yIGltcGxpY2l0bHkgZXhwb3J0ZWQgc3ltYm9scy4KLQotQGtpbmRleCAtLXNlY3Rpb24tYWxpZ25tZW50Ci1AaXRlbSAtLXNlY3Rpb24tYWxpZ25tZW50Ci1TZXRzIHRoZSBzZWN0aW9uIGFsaWdubWVudC4gIFNlY3Rpb25zIGluIG1lbW9yeSB3aWxsIGFsd2F5cyBiZWdpbiBhdAotYWRkcmVzc2VzIHdoaWNoIGFyZSBhIG11bHRpcGxlIG9mIHRoaXMgbnVtYmVyLiAgRGVmYXVsdHMgdG8gMHgxMDAwLgotCi1AY2luZGV4IHN0YWNrIHNpemUKLUBraW5kZXggLS1zdGFjawotQGl0ZW0gLS1zdGFjayBAdmFye3Jlc2VydmV9Ci1AaXRlbXggLS1zdGFjayBAdmFye3Jlc2VydmV9LEB2YXJ7Y29tbWl0fQotU3BlY2lmeSB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZXNlcnZlIChhbmQgb3B0aW9uYWxseSBjb21taXQpIHRvIGJlCi11c2VkIGFzIHN0YWNrIGZvciB0aGlzIHByb2dyYW0uICBUaGUgZGVmYXVsdCBpcyAzMk1iIHJlc2VydmVkLCA0SwotY29tbWl0dGVkLgotCi1Aa2luZGV4IC0tc3Vic3lzdGVtCi1AaXRlbSAtLXN1YnN5c3RlbSBAdmFye3doaWNofQotQGl0ZW14IC0tc3Vic3lzdGVtIEB2YXJ7d2hpY2h9OkB2YXJ7bWFqb3J9Ci1AaXRlbXggLS1zdWJzeXN0ZW0gQHZhcnt3aGljaH06QHZhcnttYWpvcn0uQHZhcnttaW5vcn0KLVNwZWNpZmllcyB0aGUgc3Vic3lzdGVtIHVuZGVyIHdoaWNoIHlvdXIgcHJvZ3JhbSB3aWxsIGV4ZWN1dGUuICBUaGUKLWxlZ2FsIHZhbHVlcyBmb3IgQHZhcnt3aGljaH0gYXJlIEBjb2Rle25hdGl2ZX0sIEBjb2Rle3dpbmRvd3N9LAotQGNvZGV7Y29uc29sZX0sIGFuZCBAY29kZXtwb3NpeH0uICBZb3UgbWF5IG9wdGlvbmFsbHkgc2V0IHRoZQotc3Vic3lzdGVtIHZlcnNpb24gYWxzby4KLQotQGVuZCB0YWJsZQotCi1AaWZzZXQgVXNlc0VudlZhcnMKLUBub2RlIEVudmlyb25tZW50Ci1Ac2VjdGlvbiBFbnZpcm9ubWVudCBWYXJpYWJsZXMKLQotWW91IGNhbiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIEBjb2Rle2xkfSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLUBjb2Rle0dOVVRBUkdFVH0sIEBjb2Rle0xERU1VTEFUSU9OfSwgYW5kIEBjb2Rle0NPTExFQ1RfTk9fREVNQU5HTEV9LgotCi1Aa2luZGV4IEdOVVRBUkdFVAotQGNpbmRleCBkZWZhdWx0IGlucHV0IGZvcm1hdAotQGNvZGV7R05VVEFSR0VUfSBkZXRlcm1pbmVzIHRoZSBpbnB1dC1maWxlIG9iamVjdCBmb3JtYXQgaWYgeW91IGRvbid0Ci11c2UgQHNhbXB7LWJ9IChvciBpdHMgc3lub255bSBAc2FtcHstLWZvcm1hdH0pLiAgSXRzIHZhbHVlIHNob3VsZCBiZSBvbmUKLW9mIHRoZSBCRkQgbmFtZXMgZm9yIGFuIGlucHV0IGZvcm1hdCAoQHB4cmVme0JGRH0pLiAgSWYgdGhlcmUgaXMgbm8KLUBjb2Rle0dOVVRBUkdFVH0gaW4gdGhlIGVudmlyb25tZW50LCBAY29kZXtsZH0gdXNlcyB0aGUgbmF0dXJhbCBmb3JtYXQKLW9mIHRoZSB0YXJnZXQuIElmIEBjb2Rle0dOVVRBUkdFVH0gaXMgc2V0IHRvIEBjb2Rle2RlZmF1bHR9IHRoZW4gQkZECi1hdHRlbXB0cyB0byBkaXNjb3ZlciB0aGUgaW5wdXQgZm9ybWF0IGJ5IGV4YW1pbmluZyBiaW5hcnkgaW5wdXQgZmlsZXM7Ci10aGlzIG1ldGhvZCBvZnRlbiBzdWNjZWVkcywgYnV0IHRoZXJlIGFyZSBwb3RlbnRpYWwgYW1iaWd1aXRpZXMsIHNpbmNlCi10aGVyZSBpcyBubyBtZXRob2Qgb2YgZW5zdXJpbmcgdGhhdCB0aGUgbWFnaWMgbnVtYmVyIHVzZWQgdG8gc3BlY2lmeQotb2JqZWN0LWZpbGUgZm9ybWF0cyBpcyB1bmlxdWUuICBIb3dldmVyLCB0aGUgY29uZmlndXJhdGlvbiBwcm9jZWR1cmUgZm9yCi1CRkQgb24gZWFjaCBzeXN0ZW0gcGxhY2VzIHRoZSBjb252ZW50aW9uYWwgZm9ybWF0IGZvciB0aGF0IHN5c3RlbSBmaXJzdAotaW4gdGhlIHNlYXJjaC1saXN0LCBzbyBhbWJpZ3VpdGllcyBhcmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY29udmVudGlvbi4KLQotQGtpbmRleCBMREVNVUxBVElPTgotQGNpbmRleCBkZWZhdWx0IGVtdWxhdGlvbgotQGNpbmRleCBlbXVsYXRpb24sIGRlZmF1bHQKLUBjb2Rle0xERU1VTEFUSU9OfSBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IGVtdWxhdGlvbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZQotQHNhbXB7LW19IG9wdGlvbi4gIFRoZSBlbXVsYXRpb24gY2FuIGFmZmVjdCB2YXJpb3VzIGFzcGVjdHMgb2YgbGlua2VyCi1iZWhhdmlvdXIsIHBhcnRpY3VsYXJseSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgWW91IGNhbiBsaXN0IHRoZQotYXZhaWxhYmxlIGVtdWxhdGlvbnMgd2l0aCB0aGUgQHNhbXB7LS12ZXJib3NlfSBvciBAc2FtcHstVn0gb3B0aW9ucy4gIElmCi10aGUgQHNhbXB7LW19IG9wdGlvbiBpcyBub3QgdXNlZCwgYW5kIHRoZSBAY29kZXtMREVNVUxBVElPTn0gZW52aXJvbm1lbnQKLXZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLCB0aGUgZGVmYXVsdCBlbXVsYXRpb24gZGVwZW5kcyB1cG9uIGhvdyB0aGUKLWxpbmtlciB3YXMgY29uZmlndXJlZC4KLUBlbmQgaWZzZXQKLQotQGtpbmRleCBDT0xMRUNUX05PX0RFTUFOR0xFCi1AY2luZGV4IGRlbWFuZ2xpbmcsIGRlZmF1bHQKLU5vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgZGVmYXVsdCB0byBkZW1hbmdsaW5nIHN5bWJvbHMuICBIb3dldmVyLCBpZgotQGNvZGV7Q09MTEVDVF9OT19ERU1BTkdMRX0gaXMgc2V0IGluIHRoZSBlbnZpcm9ubWVudCwgdGhlbiBpdCB3aWxsCi1kZWZhdWx0IHRvIG5vdCBkZW1hbmdsaW5nIHN5bWJvbHMuICBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQgaW4KLWEgc2ltaWxhciBmYXNoaW9uIGJ5IHRoZSBAY29kZXtnY2N9IGxpbmtlciB3cmFwcGVyIHByb2dyYW0uICBUaGUgZGVmYXVsdAotbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIEBzYW1wey0tZGVtYW5nbGV9IGFuZCBAc2FtcHstLW5vLWRlbWFuZ2xlfQotb3B0aW9ucy4KLQotQG5vZGUgU2NyaXB0cwotQGNoYXB0ZXIgTGlua2VyIFNjcmlwdHMKLQotQGNpbmRleCBzY3JpcHRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHRzCi1AY2luZGV4IGNvbW1hbmQgZmlsZXMKLUV2ZXJ5IGxpbmsgaXMgY29udHJvbGxlZCBieSBhIEBkZm57bGlua2VyIHNjcmlwdH0uICBUaGlzIHNjcmlwdCBpcwotd3JpdHRlbiBpbiB0aGUgbGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2UuCi0KLVRoZSBtYWluIHB1cnBvc2Ugb2YgdGhlIGxpbmtlciBzY3JpcHQgaXMgdG8gZGVzY3JpYmUgaG93IHRoZSBzZWN0aW9ucyBpbgotdGhlIGlucHV0IGZpbGVzIHNob3VsZCBiZSBtYXBwZWQgaW50byB0aGUgb3V0cHV0IGZpbGUsIGFuZCB0byBjb250cm9sCi10aGUgbWVtb3J5IGxheW91dCBvZiB0aGUgb3V0cHV0IGZpbGUuICBNb3N0IGxpbmtlciBzY3JpcHRzIGRvIG5vdGhpbmcKLW1vcmUgdGhhbiB0aGlzLiAgSG93ZXZlciwgd2hlbiBuZWNlc3NhcnksIHRoZSBsaW5rZXIgc2NyaXB0IGNhbiBhbHNvCi1kaXJlY3QgdGhlIGxpbmtlciB0byBwZXJmb3JtIG1hbnkgb3RoZXIgb3BlcmF0aW9ucywgdXNpbmcgdGhlIGNvbW1hbmRzCi1kZXNjcmliZWQgYmVsb3cuCi0KLVRoZSBsaW5rZXIgYWx3YXlzIHVzZXMgYSBsaW5rZXIgc2NyaXB0LiAgSWYgeW91IGRvIG5vdCBzdXBwbHkgb25lCi15b3Vyc2VsZiwgdGhlIGxpbmtlciB3aWxsIHVzZSBhIGRlZmF1bHQgc2NyaXB0IHRoYXQgaXMgY29tcGlsZWQgaW50byB0aGUKLWxpbmtlciBleGVjdXRhYmxlLiAgWW91IGNhbiB1c2UgdGhlIEBzYW1wey0tdmVyYm9zZX0gY29tbWFuZCBsaW5lIG9wdGlvbgotdG8gZGlzcGxheSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LiAgQ2VydGFpbiBjb21tYW5kIGxpbmUgb3B0aW9ucywKLXN1Y2ggYXMgQHNhbXB7LXJ9IG9yIEBzYW1wey1OfSwgd2lsbCBhZmZlY3QgdGhlIGRlZmF1bHQgbGlua2VyIHNjcmlwdC4KLQotWW91IG1heSBzdXBwbHkgeW91ciBvd24gbGlua2VyIHNjcmlwdCBieSB1c2luZyB0aGUgQHNhbXB7LVR9IGNvbW1hbmQKLWxpbmUgb3B0aW9uLiAgV2hlbiB5b3UgZG8gdGhpcywgeW91ciBsaW5rZXIgc2NyaXB0IHdpbGwgcmVwbGFjZSB0aGUKLWRlZmF1bHQgbGlua2VyIHNjcmlwdC4KLQotWW91IG1heSBhbHNvIHVzZSBsaW5rZXIgc2NyaXB0cyBpbXBsaWNpdGx5IGJ5IG5hbWluZyB0aGVtIGFzIGlucHV0IGZpbGVzCi10byB0aGUgbGlua2VyLCBhcyB0aG91Z2ggdGhleSB3ZXJlIGZpbGVzIHRvIGJlIGxpbmtlZC4gIEB4cmVme0ltcGxpY2l0Ci1MaW5rZXIgU2NyaXB0c30uCi0KLUBtZW51Ci0qIEJhc2ljIFNjcmlwdCBDb25jZXB0czo6CUJhc2ljIExpbmtlciBTY3JpcHQgQ29uY2VwdHMKLSogU2NyaXB0IEZvcm1hdDo6CQlMaW5rZXIgU2NyaXB0IEZvcm1hdAotKiBTaW1wbGUgRXhhbXBsZTo6CQlTaW1wbGUgTGlua2VyIFNjcmlwdCBFeGFtcGxlCi0qIFNpbXBsZSBDb21tYW5kczo6CQlTaW1wbGUgTGlua2VyIFNjcmlwdCBDb21tYW5kcwotKiBBc3NpZ25tZW50czo6CQkJQXNzaWduaW5nIFZhbHVlcyB0byBTeW1ib2xzCi0qIFNFQ1RJT05TOjoJCQlTRUNUSU9OUyBDb21tYW5kCi0qIE1FTU9SWTo6CQkJTUVNT1JZIENvbW1hbmQKLSogUEhEUlM6OgkJCVBIRFJTIENvbW1hbmQKLSogVkVSU0lPTjo6CQkJVkVSU0lPTiBDb21tYW5kCi0qIEV4cHJlc3Npb25zOjoJCQlFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cwotKiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0czo6CUltcGxpY2l0IExpbmtlciBTY3JpcHRzCi1AZW5kIG1lbnUKLQotQG5vZGUgQmFzaWMgU2NyaXB0IENvbmNlcHRzCi1Ac2VjdGlvbiBCYXNpYyBMaW5rZXIgU2NyaXB0IENvbmNlcHRzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgY29uY2VwdHMKLVdlIG5lZWQgdG8gZGVmaW5lIHNvbWUgYmFzaWMgY29uY2VwdHMgYW5kIHZvY2FidWxhcnkgaW4gb3JkZXIgdG8KLWRlc2NyaWJlIHRoZSBsaW5rZXIgc2NyaXB0IGxhbmd1YWdlLgotCi1UaGUgbGlua2VyIGNvbWJpbmVzIGlucHV0IGZpbGVzIGludG8gYSBzaW5nbGUgb3V0cHV0IGZpbGUuICBUaGUgb3V0cHV0Ci1maWxlIGFuZCBlYWNoIGlucHV0IGZpbGUgYXJlIGluIGEgc3BlY2lhbCBkYXRhIGZvcm1hdCBrbm93biBhcyBhbgotQGRmbntvYmplY3QgZmlsZSBmb3JtYXR9LiAgRWFjaCBmaWxlIGlzIGNhbGxlZCBhbiBAZGZue29iamVjdCBmaWxlfS4KLVRoZSBvdXRwdXQgZmlsZSBpcyBvZnRlbiBjYWxsZWQgYW4gQGRmbntleGVjdXRhYmxlfSwgYnV0IGZvciBvdXIKLXB1cnBvc2VzIHdlIHdpbGwgYWxzbyBjYWxsIGl0IGFuIG9iamVjdCBmaWxlLiAgRWFjaCBvYmplY3QgZmlsZSBoYXMsCi1hbW9uZyBvdGhlciB0aGluZ3MsIGEgbGlzdCBvZiBAZGZue3NlY3Rpb25zfS4gIFdlIHNvbWV0aW1lcyByZWZlciB0byBhCi1zZWN0aW9uIGluIGFuIGlucHV0IGZpbGUgYXMgYW4gQGRmbntpbnB1dCBzZWN0aW9ufTsgc2ltaWxhcmx5LCBhIHNlY3Rpb24KLWluIHRoZSBvdXRwdXQgZmlsZSBpcyBhbiBAZGZue291dHB1dCBzZWN0aW9ufS4KLQotRWFjaCBzZWN0aW9uIGluIGFuIG9iamVjdCBmaWxlIGhhcyBhIG5hbWUgYW5kIGEgc2l6ZS4gIE1vc3Qgc2VjdGlvbnMKLWFsc28gaGF2ZSBhbiBhc3NvY2lhdGVkIGJsb2NrIG9mIGRhdGEsIGtub3duIGFzIHRoZSBAZGZue3NlY3Rpb24KLWNvbnRlbnRzfS4gIEEgc2VjdGlvbiBtYXkgYmUgbWFya2VkIGFzIEBkZm57bG9hZGFibGV9LCB3aGljaCBtZWFuIHRoYXQKLXRoZSBjb250ZW50cyBzaG91bGQgYmUgbG9hZGVkIGludG8gbWVtb3J5IHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIHJ1bi4KLUEgc2VjdGlvbiB3aXRoIG5vIGNvbnRlbnRzIG1heSBiZSBAZGZue2FsbG9jYXRhYmxlfSwgd2hpY2ggbWVhbnMgdGhhdCBhbgotYXJlYSBpbiBtZW1vcnkgc2hvdWxkIGJlIHNldCBhc2lkZSwgYnV0IG5vdGhpbmcgaW4gcGFydGljdWxhciBzaG91bGQgYmUKLWxvYWRlZCB0aGVyZSAoaW4gc29tZSBjYXNlcyB0aGlzIG1lbW9yeSBtdXN0IGJlIHplcm9lZCBvdXQpLiAgQSBzZWN0aW9uCi13aGljaCBpcyBuZWl0aGVyIGxvYWRhYmxlIG5vciBhbGxvY2F0YWJsZSB0eXBpY2FsbHkgY29udGFpbnMgc29tZSBzb3J0Ci1vZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCi0KLUV2ZXJ5IGxvYWRhYmxlIG9yIGFsbG9jYXRhYmxlIG91dHB1dCBzZWN0aW9uIGhhcyB0d28gYWRkcmVzc2VzLiAgVGhlCi1maXJzdCBpcyB0aGUgQGRmbntWTUF9LCBvciB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzLiAgVGhpcyBpcyB0aGUgYWRkcmVzcwotdGhlIHNlY3Rpb24gd2lsbCBoYXZlIHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIHJ1bi4gIFRoZSBzZWNvbmQgaXMgdGhlCi1AZGZue0xNQX0sIG9yIGxvYWQgbWVtb3J5IGFkZHJlc3MuICBUaGlzIGlzIHRoZSBhZGRyZXNzIGF0IHdoaWNoIHRoZQotc2VjdGlvbiB3aWxsIGJlIGxvYWRlZC4gIEluIG1vc3QgY2FzZXMgdGhlIHR3byBhZGRyZXNzZXMgd2lsbCBiZSB0aGUKLXNhbWUuICBBbiBleGFtcGxlIG9mIHdoZW4gdGhleSBtaWdodCBiZSBkaWZmZXJlbnQgaXMgd2hlbiBhIGRhdGEgc2VjdGlvbgotaXMgbG9hZGVkIGludG8gUk9NLCBhbmQgdGhlbiBjb3BpZWQgaW50byBSQU0gd2hlbiB0aGUgcHJvZ3JhbSBzdGFydHMgdXAKLSh0aGlzIHRlY2huaXF1ZSBpcyBvZnRlbiB1c2VkIHRvIGluaXRpYWxpemUgZ2xvYmFsIHZhcmlhYmxlcyBpbiBhIFJPTQotYmFzZWQgc3lzdGVtKS4gIEluIHRoaXMgY2FzZSB0aGUgUk9NIGFkZHJlc3Mgd291bGQgYmUgdGhlIExNQSwgYW5kIHRoZQotUkFNIGFkZHJlc3Mgd291bGQgYmUgdGhlIFZNQS4KLQotWW91IGNhbiBzZWUgdGhlIHNlY3Rpb25zIGluIGFuIG9iamVjdCBmaWxlIGJ5IHVzaW5nIHRoZSBAY29kZXtvYmpkdW1wfQotcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstaH0gb3B0aW9uLgotCi1FdmVyeSBvYmplY3QgZmlsZSBhbHNvIGhhcyBhIGxpc3Qgb2YgQGRmbntzeW1ib2xzfSwga25vd24gYXMgdGhlCi1AZGZue3N5bWJvbCB0YWJsZX0uICBBIHN5bWJvbCBtYXkgYmUgZGVmaW5lZCBvciB1bmRlZmluZWQuICBFYWNoIHN5bWJvbAotaGFzIGEgbmFtZSwgYW5kIGVhY2ggZGVmaW5lZCBzeW1ib2wgaGFzIGFuIGFkZHJlc3MsIGFtb25nIG90aGVyCi1pbmZvcm1hdGlvbi4gIElmIHlvdSBjb21waWxlIGEgQyBvciBDKysgcHJvZ3JhbSBpbnRvIGFuIG9iamVjdCBmaWxlLCB5b3UKLXdpbGwgZ2V0IGEgZGVmaW5lZCBzeW1ib2wgZm9yIGV2ZXJ5IGRlZmluZWQgZnVuY3Rpb24gYW5kIGdsb2JhbCBvcgotc3RhdGljIHZhcmlhYmxlLiAgRXZlcnkgdW5kZWZpbmVkIGZ1bmN0aW9uIG9yIGdsb2JhbCB2YXJpYWJsZSB3aGljaCBpcwotcmVmZXJlbmNlZCBpbiB0aGUgaW5wdXQgZmlsZSB3aWxsIGJlY29tZSBhbiB1bmRlZmluZWQgc3ltYm9sLgotCi1Zb3UgY2FuIHNlZSB0aGUgc3ltYm9scyBpbiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7bm19Ci1wcm9ncmFtLCBvciBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoIHRoZSBAc2FtcHstdH0KLW9wdGlvbi4KLQotQG5vZGUgU2NyaXB0IEZvcm1hdAotQHNlY3Rpb24gTGlua2VyIFNjcmlwdCBGb3JtYXQKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBmb3JtYXQKLUxpbmtlciBzY3JpcHRzIGFyZSB0ZXh0IGZpbGVzLgotCi1Zb3Ugd3JpdGUgYSBsaW5rZXIgc2NyaXB0IGFzIGEgc2VyaWVzIG9mIGNvbW1hbmRzLiAgRWFjaCBjb21tYW5kIGlzCi1laXRoZXIgYSBrZXl3b3JkLCBwb3NzaWJseSBmb2xsb3dlZCBieSBhcmd1bWVudHMsIG9yIGFuIGFzc2lnbm1lbnQgdG8gYQotc3ltYm9sLiAgWW91IG1heSBzZXBhcmF0ZSBjb21tYW5kcyB1c2luZyBzZW1pY29sb25zLiAgV2hpdGVzcGFjZSBpcwotZ2VuZXJhbGx5IGlnbm9yZWQuCi0KLVN0cmluZ3Mgc3VjaCBhcyBmaWxlIG9yIGZvcm1hdCBuYW1lcyBjYW4gbm9ybWFsbHkgYmUgZW50ZXJlZCBkaXJlY3RseS4KLUlmIHRoZSBmaWxlIG5hbWUgY29udGFpbnMgYSBjaGFyYWN0ZXIgc3VjaCBhcyBhIGNvbW1hIHdoaWNoIHdvdWxkCi1vdGhlcndpc2Ugc2VydmUgdG8gc2VwYXJhdGUgZmlsZSBuYW1lcywgeW91IG1heSBwdXQgdGhlIGZpbGUgbmFtZSBpbgotZG91YmxlIHF1b3Rlcy4gIFRoZXJlIGlzIG5vIHdheSB0byB1c2UgYSBkb3VibGUgcXVvdGUgY2hhcmFjdGVyIGluIGEKLWZpbGUgbmFtZS4KLQotWW91IG1heSBpbmNsdWRlIGNvbW1lbnRzIGluIGxpbmtlciBzY3JpcHRzIGp1c3QgYXMgaW4gQywgZGVsaW1pdGVkIGJ5Ci1Ac2FtcHsvKn0gYW5kIEBzYW1weyovfS4gIEFzIGluIEMsIGNvbW1lbnRzIGFyZSBzeW50YWN0aWNhbGx5IGVxdWl2YWxlbnQKLXRvIHdoaXRlc3BhY2UuCi0KLUBub2RlIFNpbXBsZSBFeGFtcGxlCi1Ac2VjdGlvbiBTaW1wbGUgTGlua2VyIFNjcmlwdCBFeGFtcGxlCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgZXhhbXBsZQotQGNpbmRleCBleGFtcGxlIG9mIGxpbmtlciBzY3JpcHQKLU1hbnkgbGlua2VyIHNjcmlwdHMgYXJlIGZhaXJseSBzaW1wbGUuCi0KLVRoZSBzaW1wbGVzdCBwb3NzaWJsZSBsaW5rZXIgc2NyaXB0IGhhcyBqdXN0IG9uZSBjb21tYW5kOgotQHNhbXB7U0VDVElPTlN9LiAgWW91IHVzZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgdG8gZGVzY3JpYmUgdGhlCi1tZW1vcnkgbGF5b3V0IG9mIHRoZSBvdXRwdXQgZmlsZS4KLQotVGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIGlzIGEgcG93ZXJmdWwgY29tbWFuZC4gIEhlcmUgd2Ugd2lsbAotZGVzY3JpYmUgYSBzaW1wbGUgdXNlIG9mIGl0LiAgTGV0J3MgYXNzdW1lIHlvdXIgcHJvZ3JhbSBjb25zaXN0cyBvbmx5IG9mCi1jb2RlLCBpbml0aWFsaXplZCBkYXRhLCBhbmQgdW5pbml0aWFsaXplZCBkYXRhLiAgVGhlc2Ugd2lsbCBiZSBpbiB0aGUKLUBzYW1wey50ZXh0fSwgQHNhbXB7LmRhdGF9LCBhbmQgQHNhbXB7LmJzc30gc2VjdGlvbnMsIHJlc3BlY3RpdmVseS4KLUxldCdzIGFzc3VtZSBmdXJ0aGVyIHRoYXQgdGhlc2UgYXJlIHRoZSBvbmx5IHNlY3Rpb25zIHdoaWNoIGFwcGVhciBpbgoteW91ciBpbnB1dCBmaWxlcy4KLQotRm9yIHRoaXMgZXhhbXBsZSwgbGV0J3Mgc2F5IHRoYXQgdGhlIGNvZGUgc2hvdWxkIGJlIGxvYWRlZCBhdCBhZGRyZXNzCi0weDEwMDAwLCBhbmQgdGhhdCB0aGUgZGF0YSBzaG91bGQgc3RhcnQgYXQgYWRkcmVzcyAweDgwMDAwMDAuICBIZXJlIGlzIGEKLWxpbmtlciBzY3JpcHQgd2hpY2ggd2lsbCBkbyB0aGF0OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLUB7Ci0gIC4gPSAweDEwMDAwOwotICAudGV4dCA6IEB7ICooLnRleHQpIEB9Ci0gIC4gPSAweDgwMDAwMDA7Ci0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0KLSAgLmJzcyA6IEB7ICooLmJzcykgQH0KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1Zb3Ugd3JpdGUgdGhlIEBzYW1we1NFQ1RJT05TfSBjb21tYW5kIGFzIHRoZSBrZXl3b3JkIEBzYW1we1NFQ1RJT05TfSwKLWZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIHN5bWJvbCBhc3NpZ25tZW50cyBhbmQgb3V0cHV0IHNlY3Rpb24KLWRlc2NyaXB0aW9ucyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMuCi0KLVRoZSBmaXJzdCBsaW5lIGluIHRoZSBhYm92ZSBleGFtcGxlIHNldHMgdGhlIHNwZWNpYWwgc3ltYm9sIEBzYW1wey59LAotd2hpY2ggaXMgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBJZiB5b3UgZG8gbm90IHNwZWNpZnkgdGhlIGFkZHJlc3Mgb2YgYW4KLW91dHB1dCBzZWN0aW9uIGluIHNvbWUgb3RoZXIgd2F5IChvdGhlciB3YXlzIGFyZSBkZXNjcmliZWQgbGF0ZXIpLCB0aGUKLWFkZHJlc3MgaXMgc2V0IGZyb20gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIuICBUaGUKLWxvY2F0aW9uIGNvdW50ZXIgaXMgdGhlbiBpbmNyZW1lbnRlZCBieSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uCi0KLVRoZSBmaXJzdCBsaW5lIGluc2lkZSB0aGUgQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQgb2YgdGhlIGFib3ZlIGV4YW1wbGUKLXNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWFsIHN5bWJvbCBAc2FtcHsufSwgd2hpY2ggaXMgdGhlIGxvY2F0aW9uCi1jb3VudGVyLiAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzIG9mIGFuIG91dHB1dCBzZWN0aW9uIGluIHNvbWUKLW90aGVyIHdheSAob3RoZXIgd2F5cyBhcmUgZGVzY3JpYmVkIGxhdGVyKSwgdGhlIGFkZHJlc3MgaXMgc2V0IGZyb20gdGhlCi1jdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLiAgVGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgdGhlbgotaW5jcmVtZW50ZWQgYnkgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgQXQgdGhlIHN0YXJ0IG9mIHRoZQotQHNhbXB7U0VDVElPTlN9IGNvbW1hbmQsIHRoZSBsb2NhdGlvbiBjb3VudGVyIGhhcyB0aGUgdmFsdWUgQHNhbXB7MH0uCi0KLVRoZSBzZWNvbmQgbGluZSBkZWZpbmVzIGFuIG91dHB1dCBzZWN0aW9uLCBAc2FtcHsudGV4dH0uICBUaGUgY29sb24gaXMKLXJlcXVpcmVkIHN5bnRheCB3aGljaCBtYXkgYmUgaWdub3JlZCBmb3Igbm93LiAgV2l0aGluIHRoZSBjdXJseSBicmFjZXMKLWFmdGVyIHRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lLCB5b3UgbGlzdCB0aGUgbmFtZXMgb2YgdGhlIGlucHV0IHNlY3Rpb25zCi13aGljaCBzaG91bGQgYmUgcGxhY2VkIGludG8gdGhpcyBvdXRwdXQgc2VjdGlvbi4gIFRoZSBAc2FtcHsqfSBpcyBhCi13aWxkY2FyZCB3aGljaCBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICBUaGUgZXhwcmVzc2lvbiBAc2FtcHsqKC50ZXh0KX0KLW1lYW5zIGFsbCBAc2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgaW4gYWxsIGlucHV0IGZpbGVzLgotCi1TaW5jZSB0aGUgbG9jYXRpb24gY291bnRlciBpcyBAc2FtcHsweDEwMDAwfSB3aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgotQHNhbXB7LnRleHR9IGlzIGRlZmluZWQsIHRoZSBsaW5rZXIgd2lsbCBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi1Ac2FtcHsudGV4dH0gc2VjdGlvbiBpbiB0aGUgb3V0cHV0IGZpbGUgdG8gYmUgQHNhbXB7MHgxMDAwMH0uCi0KLVRoZSByZW1haW5pbmcgbGluZXMgZGVmaW5lIHRoZSBAc2FtcHsuZGF0YX0gYW5kIEBzYW1wey5ic3N9IHNlY3Rpb25zIGluCi10aGUgb3V0cHV0IGZpbGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2UgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbgotYXQgYWRkcmVzcyBAc2FtcHsweDgwMDAwMDB9LiAgQWZ0ZXIgdGhlIGxpbmtlciBwbGFjZXMgdGhlIEBzYW1wey5kYXRhfQotb3V0cHV0IHNlY3Rpb24sIHRoZSB2YWx1ZSBvZiB0aGUgbG9jYXRpb24gY291bnRlciB3aWxsIGJlCi1Ac2FtcHsweDgwMDAwMDB9IHBsdXMgdGhlIHNpemUgb2YgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbi4gIFRoZQotZWZmZWN0IGlzIHRoYXQgdGhlIGxpbmtlciB3aWxsIHBsYWNlIHRoZSBAc2FtcHsuYnNzfSBvdXRwdXQgc2VjdGlvbgotaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIEBzYW1wey5kYXRhfSBvdXRwdXQgc2VjdGlvbiBpbiBtZW1vcnkKLQotVGhlIGxpbmtlciB3aWxsIGVuc3VyZSB0aGF0IGVhY2ggb3V0cHV0IHNlY3Rpb24gaGFzIHRoZSByZXF1aXJlZAotYWxpZ25tZW50LCBieSBpbmNyZWFzaW5nIHRoZSBsb2NhdGlvbiBjb3VudGVyIGlmIG5lY2Vzc2FyeS4gIEluIHRoaXMKLWV4YW1wbGUsIHRoZSBzcGVjaWZpZWQgYWRkcmVzc2VzIGZvciB0aGUgQHNhbXB7LnRleHR9IGFuZCBAc2FtcHsuZGF0YX0KLXNlY3Rpb25zIHdpbGwgcHJvYmFibHkgc2F0aXNmeSBhbnkgYWxpZ25tZW50IGNvbnN0cmFpbnRzLCBidXQgdGhlIGxpbmtlcgotbWF5IGhhdmUgdG8gY3JlYXRlIGEgc21hbGwgZ2FwIGJldHdlZW4gdGhlIEBzYW1wey5kYXRhfSBhbmQgQHNhbXB7LmJzc30KLXNlY3Rpb25zLgotCi1UaGF0J3MgaXQhICBUaGF0J3MgYSBzaW1wbGUgYW5kIGNvbXBsZXRlIGxpbmtlciBzY3JpcHQuCi0KLUBub2RlIFNpbXBsZSBDb21tYW5kcwotQHNlY3Rpb24gU2ltcGxlIExpbmtlciBTY3JpcHQgQ29tbWFuZHMKLUBjaW5kZXggbGlua2VyIHNjcmlwdCBzaW1wbGUgY29tbWFuZHMKLUluIHRoaXMgc2VjdGlvbiB3ZSBkZXNjcmliZSB0aGUgc2ltcGxlIGxpbmtlciBzY3JpcHQgY29tbWFuZHMuCi0KLUBtZW51Ci0qIEVudHJ5IFBvaW50OjoJCQlTZXR0aW5nIHRoZSBlbnRyeSBwb2ludAotKiBGaWxlIENvbW1hbmRzOjoJCUNvbW1hbmRzIGRlYWxpbmcgd2l0aCBmaWxlcwotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci0qIEZvcm1hdCBDb21tYW5kczo6CQlDb21tYW5kcyBkZWFsaW5nIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cwotQGVuZCBpZmNsZWFyCi0KLSogTWlzY2VsbGFuZW91cyBDb21tYW5kczo6CU90aGVyIGxpbmtlciBzY3JpcHQgY29tbWFuZHMKLUBlbmQgbWVudQotCi1Abm9kZSBFbnRyeSBQb2ludAotQHN1YnNlY3Rpb24gU2V0dGluZyB0aGUgZW50cnkgcG9pbnQKLUBraW5kZXggRU5UUlkoQHZhcntzeW1ib2x9KQotQGNpbmRleCBzdGFydCBvZiBleGVjdXRpb24KLUBjaW5kZXggZmlyc3QgaW5zdHJ1Y3Rpb24KLUBjaW5kZXggZW50cnkgcG9pbnQKLVRoZSBmaXJzdCBpbnN0cnVjdGlvbiB0byBleGVjdXRlIGluIGEgcHJvZ3JhbSBpcyBjYWxsZWQgdGhlIEBkZm57ZW50cnkKLXBvaW50fS4gIFlvdSBjYW4gdXNlIHRoZSBAY29kZXtFTlRSWX0gbGlua2VyIHNjcmlwdCBjb21tYW5kIHRvIHNldCB0aGUKLWVudHJ5IHBvaW50LiAgVGhlIGFyZ3VtZW50IGlzIGEgc3ltYm9sIG5hbWU6Ci1Ac21hbGxleGFtcGxlCi1FTlRSWShAdmFye3N5bWJvbH0pCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRvIHNldCB0aGUgZW50cnkgcG9pbnQuICBUaGUgbGlua2VyIHdpbGwgc2V0IHRoZQotZW50cnkgcG9pbnQgYnkgdHJ5aW5nIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIGluIG9yZGVyLCBhbmQKLXN0b3BwaW5nIHdoZW4gb25lIG9mIHRoZW0gc3VjY2VlZHM6Ci1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSAKLXRoZSBAc2FtcHstZX0gQHZhcntlbnRyeX0gY29tbWFuZC1saW5lIG9wdGlvbjsKLUBpdGVtIAotdGhlIEBjb2Rle0VOVFJZKEB2YXJ7c3ltYm9sfSl9IGNvbW1hbmQgaW4gYSBsaW5rZXIgc2NyaXB0OwotQGl0ZW0gCi10aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBAY29kZXtzdGFydH0sIGlmIGRlZmluZWQ7Ci1AaXRlbSAKLXRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiwgaWYgcHJlc2VudDsKLUBpdGVtIAotVGhlIGFkZHJlc3MgQGNvZGV7MH0uCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgRmlsZSBDb21tYW5kcwotQHN1YnNlY3Rpb24gQ29tbWFuZHMgZGVhbGluZyB3aXRoIGZpbGVzCi1AY2luZGV4IGxpbmtlciBzY3JpcHQgZmlsZSBjb21tYW5kcwotU2V2ZXJhbCBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzIGRlYWwgd2l0aCBmaWxlcy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBJTkNMVURFIEB2YXJ7ZmlsZW5hbWV9Ci1Aa2luZGV4IElOQ0xVREUgQHZhcntmaWxlbmFtZX0KLUBjaW5kZXggaW5jbHVkaW5nIGEgbGlua2VyIHNjcmlwdAotSW5jbHVkZSB0aGUgbGlua2VyIHNjcmlwdCBAdmFye2ZpbGVuYW1lfSBhdCB0aGlzIHBvaW50LiAgVGhlIGZpbGUgd2lsbAotYmUgc2VhcmNoZWQgZm9yIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGFueSBkaXJlY3Rvcnkgc3BlY2lmaWVkCi13aXRoIHRoZSBAY29kZXstTH0gb3B0aW9uLiAgWW91IGNhbiBuZXN0IGNhbGxzIHRvIEBjb2Rle0lOQ0xVREV9IHVwIHRvCi0xMCBsZXZlbHMgZGVlcC4KLQotQGl0ZW0gSU5QVVQoQHZhcntmaWxlfSwgQHZhcntmaWxlfSwgQGRvdHN7fSkKLUBpdGVteCBJTlBVVChAdmFye2ZpbGV9IEB2YXJ7ZmlsZX0gQGRvdHN7fSkKLUBraW5kZXggSU5QVVQoQHZhcntmaWxlc30pCi1AY2luZGV4IGlucHV0IGZpbGVzIGluIGxpbmtlciBzY3JpcHRzCi1AY2luZGV4IGlucHV0IG9iamVjdCBmaWxlcyBpbiBsaW5rZXIgc2NyaXB0cwotQGNpbmRleCBsaW5rZXIgc2NyaXB0IGlucHV0IG9iamVjdCBmaWxlcwotVGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kIGRpcmVjdHMgdGhlIGxpbmtlciB0byBpbmNsdWRlIHRoZSBuYW1lZCBmaWxlcwotaW4gdGhlIGxpbmssIGFzIHRob3VnaCB0aGV5IHdlcmUgbmFtZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBhbHdheXMgd2FudCB0byBpbmNsdWRlIEBmaWxle3N1YnIub30gYW55IHRpbWUgeW91IGRvCi1hIGxpbmssIGJ1dCB5b3UgY2FuJ3QgYmUgYm90aGVyZWQgdG8gcHV0IGl0IG9uIGV2ZXJ5IGxpbmsgY29tbWFuZCBsaW5lLAotdGhlbiB5b3UgY2FuIHB1dCBAc2FtcHtJTlBVVCAoc3Vici5vKX0gaW4geW91ciBsaW5rZXIgc2NyaXB0LgotCi1JbiBmYWN0LCBpZiB5b3UgbGlrZSwgeW91IGNhbiBsaXN0IGFsbCBvZiB5b3VyIGlucHV0IGZpbGVzIGluIHRoZSBsaW5rZXIKLXNjcmlwdCwgYW5kIHRoZW4gaW52b2tlIHRoZSBsaW5rZXIgd2l0aCBub3RoaW5nIGJ1dCBhIEBzYW1wey1UfSBvcHRpb24uCi0KLVRoZSBsaW5rZXIgd2lsbCBmaXJzdCB0cnkgdG8gb3BlbiB0aGUgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBJZgotaXQgaXMgbm90IGZvdW5kLCB0aGUgbGlua2VyIHdpbGwgc2VhcmNoIHRocm91Z2ggdGhlIGFyY2hpdmUgbGlicmFyeQotc2VhcmNoIHBhdGguICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBzYW1wey1MfSBpbiBAcmVme09wdGlvbnMsLENvbW1hbmQKLUxpbmUgT3B0aW9uc30uCi0KLUlmIHlvdSB1c2UgQHNhbXB7SU5QVVQgKC1sQHZhcntmaWxlfSl9LCBAY29kZXtsZH0gd2lsbCB0cmFuc2Zvcm0gdGhlCi1uYW1lIHRvIEBjb2Rle2xpYkB2YXJ7ZmlsZX0uYX0sIGFzIHdpdGggdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudAotQHNhbXB7LWx9LgotCi1XaGVuIHlvdSB1c2UgdGhlIEBjb2Rle0lOUFVUfSBjb21tYW5kIGluIGFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQsIHRoZQotZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluayBhdCB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIGxpbmtlcgotc2NyaXB0IGZpbGUgaXMgaW5jbHVkZWQuICBUaGlzIGNhbiBhZmZlY3QgYXJjaGl2ZSBzZWFyY2hpbmcuCi0KLUBpdGVtIEdST1VQKEB2YXJ7ZmlsZX0sIEB2YXJ7ZmlsZX0sIEBkb3Rze30pCi1AaXRlbXggR1JPVVAoQHZhcntmaWxlfSBAdmFye2ZpbGV9IEBkb3Rze30pCi1Aa2luZGV4IEdST1VQKEB2YXJ7ZmlsZXN9KQotQGNpbmRleCBncm91cGluZyBpbnB1dCBmaWxlcwotVGhlIEBjb2Rle0dST1VQfSBjb21tYW5kIGlzIGxpa2UgQGNvZGV7SU5QVVR9LCBleGNlcHQgdGhhdCB0aGUgbmFtZWQKLWZpbGVzIHNob3VsZCBhbGwgYmUgYXJjaGl2ZXMsIGFuZCB0aGV5IGFyZSBzZWFyY2hlZCByZXBlYXRlZGx5IHVudGlsIG5vCi1uZXcgdW5kZWZpbmVkIHJlZmVyZW5jZXMgYXJlIGNyZWF0ZWQuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEBzYW1wey0ofQotaW4gQHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30uCi0KLUBpdGVtIE9VVFBVVChAdmFye2ZpbGVuYW1lfSkKLUBraW5kZXggT1VUUFVUKEB2YXJ7ZmlsZW5hbWV9KQotQGNpbmRleCBvdXRwdXQgZmlsZSBuYW1lIGluIGxpbmtlciBzY3JpcG90Ci1UaGUgQGNvZGV7T1VUUFVUfSBjb21tYW5kIG5hbWVzIHRoZSBvdXRwdXQgZmlsZS4gIFVzaW5nCi1AY29kZXtPVVRQVVQoQHZhcntmaWxlbmFtZX0pfSBpbiB0aGUgbGlua2VyIHNjcmlwdCBpcyBleGFjdGx5IGxpa2UgdXNpbmcKLUBzYW1wey1vIEB2YXJ7ZmlsZW5hbWV9fSBvbiB0aGUgY29tbWFuZCBsaW5lIChAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZAotTGluZSBPcHRpb25zfSkuICBJZiBib3RoIGFyZSB1c2VkLCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0YWtlcwotcHJlY2VkZW5jZS4KLQotWW91IGNhbiB1c2UgdGhlIEBjb2Rle09VVFBVVH0gY29tbWFuZCB0byBkZWZpbmUgYSBkZWZhdWx0IG5hbWUgZm9yIHRoZQotb3V0cHV0IGZpbGUgb3RoZXIgdGhhbiB0aGUgdXN1YWwgZGVmYXVsdCBvZiBAZmlsZXthLm91dH0uCi0KLUBpdGVtIFNFQVJDSF9ESVIoQHZhcntwYXRofSkKLUBraW5kZXggU0VBUkNIX0RJUihAdmFye3BhdGh9KQotQGNpbmRleCBsaWJyYXJ5IHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKLUBjaW5kZXggYXJjaGl2ZSBzZWFyY2ggcGF0aCBpbiBsaW5rZXIgc2NyaXB0Ci1AY2luZGV4IHNlYXJjaCBwYXRoIGluIGxpbmtlciBzY3JpcHQKLVRoZSBAY29kZXtTRUFSQ0hfRElSfSBjb21tYW5kIGFkZHMgQHZhcntwYXRofSB0byB0aGUgbGlzdCBvZiBwYXRocyB3aGVyZQotQGNvZGV7bGR9IGxvb2tzIGZvciBhcmNoaXZlIGxpYnJhcmllcy4gIFVzaW5nCi1AY29kZXtTRUFSQ0hfRElSKEB2YXJ7cGF0aH0pfSBpcyBleGFjdGx5IGxpa2UgdXNpbmcgQHNhbXB7LUwgQHZhcntwYXRofX0KLW9uIHRoZSBjb21tYW5kIGxpbmUgKEBweHJlZntPcHRpb25zLCxDb21tYW5kIExpbmUgT3B0aW9uc30pLiAgSWYgYm90aAotYXJlIHVzZWQsIHRoZW4gdGhlIGxpbmtlciB3aWxsIHNlYXJjaCBib3RoIHBhdGhzLiAgUGF0aHMgc3BlY2lmaWVkIHVzaW5nCi10aGUgY29tbWFuZCBsaW5lIG9wdGlvbiBhcmUgc2VhcmNoZWQgZmlyc3QuCi0KLUBpdGVtIFNUQVJUVVAoQHZhcntmaWxlbmFtZX0pCi1Aa2luZGV4IFNUQVJUVVAoQHZhcntmaWxlbmFtZX0pCi1AY2luZGV4IGZpcnN0IGlucHV0IGZpbGUKLVRoZSBAY29kZXtTVEFSVFVQfSBjb21tYW5kIGlzIGp1c3QgbGlrZSB0aGUgQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGV4Y2VwdAotdGhhdCBAdmFye2ZpbGVuYW1lfSB3aWxsIGJlY29tZSB0aGUgZmlyc3QgaW5wdXQgZmlsZSB0byBiZSBsaW5rZWQsIGFzCi10aG91Z2ggaXQgd2VyZSBzcGVjaWZpZWQgZmlyc3Qgb24gdGhlIGNvbW1hbmQgbGluZS4gIFRoaXMgbWF5IGJlIHVzZWZ1bAotd2hlbiB1c2luZyBhIHN5c3RlbSBpbiB3aGljaCB0aGUgZW50cnkgcG9pbnQgaXMgYWx3YXlzIHRoZSBzdGFydCBvZiB0aGUKLWZpcnN0IGZpbGUuCi1AZW5kIHRhYmxlCi0KLUBpZmNsZWFyIFNpbmdsZUZvcm1hdAotQG5vZGUgRm9ybWF0IENvbW1hbmRzCi1Ac3Vic2VjdGlvbiBDb21tYW5kcyBkZWFsaW5nIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cwotQSBjb3VwbGUgb2YgbGlua2VyIHNjcmlwdCBjb21tYW5kcyBkZWFsIHdpdGggb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pCi1AaXRlbXggT1VUUFVUX0ZPUk1BVChAdmFye2RlZmF1bHR9LCBAdmFye2JpZ30sIEB2YXJ7bGl0dGxlfSkKLUBraW5kZXggT1VUUFVUX0ZPUk1BVChAdmFye2JmZG5hbWV9KQotQGNpbmRleCBvdXRwdXQgZmlsZSBmb3JtYXQgaW4gbGlua2VyIHNjcmlwdAotVGhlIEBjb2Rle09VVFBVVF9GT1JNQVR9IGNvbW1hbmQgbmFtZXMgdGhlIEJGRCBmb3JtYXQgdG8gdXNlIGZvciB0aGUKLW91dHB1dCBmaWxlIChAcHhyZWZ7QkZEfSkuICBVc2luZyBAY29kZXtPVVRQVVRfRk9STUFUKEB2YXJ7YmZkbmFtZX0pfSBpcwotZXhhY3RseSBsaWtlIHVzaW5nIEBzYW1wey1vZm9ybWF0IEB2YXJ7YmZkbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUKLShAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIGJvdGggYXJlIHVzZWQsIHRoZSBjb21tYW5kCi1saW5lIG9wdGlvbiB0YWtlcyBwcmVjZWRlbmNlLgotCi1Zb3UgY2FuIHVzZSBAY29kZXtPVVRQVVRfRk9STUFUfSB3aXRoIHRocmVlIGFyZ3VtZW50cyB0byB1c2UgZGlmZmVyZW50Ci1mb3JtYXRzIGJhc2VkIG9uIHRoZSBAc2FtcHstRUJ9IGFuZCBAc2FtcHstRUx9IGNvbW1hbmQgbGluZSBvcHRpb25zLgotVGhpcyBwZXJtaXRzIHRoZSBsaW5rZXIgc2NyaXB0IHRvIHNldCB0aGUgb3V0cHV0IGZvcm1hdCBiYXNlZCBvbiB0aGUKLWRlc2lyZWQgZW5kaWFubmVzcy4KLQotSWYgbmVpdGhlciBAc2FtcHstRUJ9IG5vciBAc2FtcHstRUx9IGFyZSB1c2VkLCB0aGVuIHRoZSBvdXRwdXQgZm9ybWF0Ci13aWxsIGJlIHRoZSBmaXJzdCBhcmd1bWVudCwgQHZhcntkZWZhdWx0fS4gIElmIEBzYW1wey1FQn0gaXMgdXNlZCwgdGhlCi1vdXRwdXQgZm9ybWF0IHdpbGwgYmUgdGhlIHNlY29uZCBhcmd1bWVudCwgQHZhcntiaWd9LiAgSWYgQHNhbXB7LUVMfSBpcwotdXNlZCwgdGhlIG91dHB1dCBmb3JtYXQgd2lsbCBiZSB0aGUgdGhpcmQgYXJndW1lbnQsIEB2YXJ7bGl0dGxlfS4KLQotRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgZm9yIHRoZSBNSVBTIEVMRiB0YXJnZXQgdXNlcyB0aGlzCi1jb21tYW5kOgotQHNtYWxsZXhhbXBsZQotT1VUUFVUX0ZPUk1BVChlbGYzMi1iaWdtaXBzLCBlbGYzMi1iaWdtaXBzLCBlbGYzMi1saXR0bGVtaXBzKQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgc2F5cyB0aGF0IHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgdGhlIG91dHB1dCBmaWxlIGlzCi1Ac2FtcHtlbGYzMi1iaWdtaXBzfSwgYnV0IGlmIHRoZSB1c2VyIHVzZXMgdGhlIEBzYW1wey1FTH0gY29tbWFuZCBsaW5lCi1vcHRpb24sIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIEBzYW1we2VsZjMyLWxpdHRsZW1pcHN9Ci1mb3JtYXQuCi0KLUBpdGVtIFRBUkdFVChAdmFye2JmZG5hbWV9KQotQGtpbmRleCBUQVJHRVQoQHZhcntiZmRuYW1lfSkKLUBjaW5kZXggaW5wdXQgZmlsZSBmb3JtYXQgaW4gbGlua2VyIHNjcmlwdAotVGhlIEBjb2Rle1RBUkdFVH0gY29tbWFuZCBuYW1lcyB0aGUgQkZEIGZvcm1hdCB0byB1c2Ugd2hlbiByZWFkaW5nIGlucHV0Ci1maWxlcy4gIEl0IGFmZmVjdHMgc3Vic2VxdWVudCBAY29kZXtJTlBVVH0gYW5kIEBjb2Rle0dST1VQfSBjb21tYW5kcy4KLVRoaXMgY29tbWFuZCBpcyBsaWtlIHVzaW5nIEBzYW1wey1iIEB2YXJ7YmZkbmFtZX19IG9uIHRoZSBjb21tYW5kIGxpbmUKLShAcHhyZWZ7T3B0aW9ucywsQ29tbWFuZCBMaW5lIE9wdGlvbnN9KS4gIElmIHRoZSBAY29kZXtUQVJHRVR9IGNvbW1hbmQKLWlzIHVzZWQgYnV0IEBjb2Rle09VVFBVVF9GT1JNQVR9IGlzIG5vdCwgdGhlbiB0aGUgbGFzdCBAY29kZXtUQVJHRVR9Ci1jb21tYW5kIGlzIGFsc28gdXNlZCB0byBzZXQgdGhlIGZvcm1hdCBmb3IgdGhlIG91dHB1dCBmaWxlLiAgQHhyZWZ7QkZEfS4KLUBlbmQgdGFibGUKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBNaXNjZWxsYW5lb3VzIENvbW1hbmRzCi1Ac3Vic2VjdGlvbiBPdGhlciBsaW5rZXIgc2NyaXB0IGNvbW1hbmRzCi1UaGVyZSBhcmUgYSBmZXcgb3RoZXIgbGlua2VyIHNjcmlwdHMgY29tbWFuZHMuCi0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQVNTRVJUKEB2YXJ7ZXhwfSwgQHZhcnttZXNzYWdlfSkKLUBraW5kZXggQVNTRVJUCi1AY2luZGV4IGFzc2VydGlvbiBpbiBsaW5rZXIgc2NyaXB0Ci1FbnN1cmUgdGhhdCBAdmFye2V4cH0gaXMgbm9uLXplcm8uICBJZiBpdCBpcyB6ZXJvLCB0aGVuIGV4aXQgdGhlIGxpbmtlcgotd2l0aCBhbiBlcnJvciBjb2RlLCBhbmQgcHJpbnQgQHZhcnttZXNzYWdlfS4KLQotQGl0ZW0gRVhURVJOKEB2YXJ7c3ltYm9sfSBAdmFye3N5bWJvbH0gQGRvdHN7fSkKLUBraW5kZXggRVhURVJOCi1AY2luZGV4IHVuZGVmaW5lZCBzeW1ib2wgaW4gbGlua2VyIHNjcmlwdAotRm9yY2UgQHZhcntzeW1ib2x9IHRvIGJlIGVudGVyZWQgaW4gdGhlIG91dHB1dCBmaWxlIGFzIGFuIHVuZGVmaW5lZAotc3ltYm9sLiAgRG9pbmcgdGhpcyBtYXksIGZvciBleGFtcGxlLCB0cmlnZ2VyIGxpbmtpbmcgb2YgYWRkaXRpb25hbAotbW9kdWxlcyBmcm9tIHN0YW5kYXJkIGxpYnJhcmllcy4gIFlvdSBtYXkgbGlzdCBzZXZlcmFsIEB2YXJ7c3ltYm9sfXMgZm9yCi1lYWNoIEBjb2Rle0VYVEVSTn0sIGFuZCB5b3UgbWF5IHVzZSBAY29kZXtFWFRFUk59IG11bHRpcGxlIHRpbWVzLiAgVGhpcwotY29tbWFuZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHRoZSBAc2FtcHstdX0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotQGl0ZW0gRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KLUBraW5kZXggRk9SQ0VfQ09NTU9OX0FMTE9DQVRJT04KLUBjaW5kZXggY29tbW9uIGFsbG9jYXRpb24gaW4gbGlua2VyIHNjcmlwdAotVGhpcyBjb21tYW5kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdGhlIEBzYW1wey1kfSBjb21tYW5kLWxpbmUgb3B0aW9uOgotdG8gbWFrZSBAY29kZXtsZH0gYXNzaWduIHNwYWNlIHRvIGNvbW1vbiBzeW1ib2xzIGV2ZW4gaWYgYSByZWxvY2F0YWJsZQotb3V0cHV0IGZpbGUgaXMgc3BlY2lmaWVkIChAc2FtcHstcn0pLgotCi1AaXRlbSBOT0NST1NTUkVGUyhAdmFye3NlY3Rpb259IEB2YXJ7c2VjdGlvbn0gQGRvdHN7fSkKLUBraW5kZXggTk9DUk9TU1JFRlMoQHZhcntzZWN0aW9uc30pCi1AY2luZGV4IGNyb3NzIHJlZmVyZW5jZXMKLVRoaXMgY29tbWFuZCBtYXkgYmUgdXNlZCB0byB0ZWxsIEBjb2Rle2xkfSB0byBpc3N1ZSBhbiBlcnJvciBhYm91dCBhbnkKLXJlZmVyZW5jZXMgYW1vbmcgY2VydGFpbiBvdXRwdXQgc2VjdGlvbnMuCi0KLUluIGNlcnRhaW4gdHlwZXMgb2YgcHJvZ3JhbXMsIHBhcnRpY3VsYXJseSBvbiBlbWJlZGRlZCBzeXN0ZW1zIHdoZW4KLXVzaW5nIG92ZXJsYXlzLCB3aGVuIG9uZSBzZWN0aW9uIGlzIGxvYWRlZCBpbnRvIG1lbW9yeSwgYW5vdGhlciBzZWN0aW9uCi13aWxsIG5vdCBiZS4gIEFueSBkaXJlY3QgcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gc2VjdGlvbnMgd291bGQgYmUKLWVycm9ycy4gIEZvciBleGFtcGxlLCBpdCB3b3VsZCBiZSBhbiBlcnJvciBpZiBjb2RlIGluIG9uZSBzZWN0aW9uIGNhbGxlZAotYSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZSBvdGhlciBzZWN0aW9uLgotCi1UaGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGNvbW1hbmQgdGFrZXMgYSBsaXN0IG9mIG91dHB1dCBzZWN0aW9uIG5hbWVzLiAgSWYKLUBjb2Rle2xkfSBkZXRlY3RzIGFueSBjcm9zcyByZWZlcmVuY2VzIGJldHdlZW4gdGhlIHNlY3Rpb25zLCBpdCByZXBvcnRzCi1hbiBlcnJvciBhbmQgcmV0dXJucyBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLiAgTm90ZSB0aGF0IHRoZQotQGNvZGV7Tk9DUk9TU1JFRlN9IGNvbW1hbmQgdXNlcyBvdXRwdXQgc2VjdGlvbiBuYW1lcywgbm90IGlucHV0IHNlY3Rpb24KLW5hbWVzLgotCi1AaWZjbGVhciBTaW5nbGVGb3JtYXQKLUBpdGVtIE9VVFBVVF9BUkNIKEB2YXJ7YmZkYXJjaH0pCi1Aa2luZGV4IE9VVFBVVF9BUkNIKEB2YXJ7YmZkYXJjaH0pCi1AY2luZGV4IG1hY2hpbmUgYXJjaGl0ZWN0dXJlCi1AY2luZGV4IGFyY2hpdGVjdHVyZQotU3BlY2lmeSBhIHBhcnRpY3VsYXIgb3V0cHV0IG1hY2hpbmUgYXJjaGl0ZWN0dXJlLiAgVGhlIGFyZ3VtZW50IGlzIG9uZQotb2YgdGhlIG5hbWVzIHVzZWQgYnkgdGhlIEJGRCBsaWJyYXJ5IChAcHhyZWZ7QkZEfSkuICBZb3UgY2FuIHNlZSB0aGUKLWFyY2hpdGVjdHVyZSBvZiBhbiBvYmplY3QgZmlsZSBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0gcHJvZ3JhbSB3aXRoCi10aGUgQHNhbXB7LWZ9IG9wdGlvbi4KLUBlbmQgaWZjbGVhcgotQGVuZCB0YWJsZQotCi1Abm9kZSBBc3NpZ25tZW50cwotQHNlY3Rpb24gQXNzaWduaW5nIFZhbHVlcyB0byBTeW1ib2xzCi1AY2luZGV4IGFzc2lnbm1lbnQgaW4gc2NyaXB0cwotQGNpbmRleCBzeW1ib2wgZGVmaW5pdGlvbiwgc2NyaXB0cwotQGNpbmRleCB2YXJpYWJsZXMsIGRlZmluaW5nCi1Zb3UgbWF5IGFzc2lnbiBhIHZhbHVlIHRvIGEgc3ltYm9sIGluIGEgbGlua2VyIHNjcmlwdC4gIFRoaXMgd2lsbCBkZWZpbmUKLXRoZSBzeW1ib2wgYXMgYSBnbG9iYWwgc3ltYm9sLgotCi1AbWVudQotKiBTaW1wbGUgQXNzaWdubWVudHM6OgkJU2ltcGxlIEFzc2lnbm1lbnRzCi0qIFBST1ZJREU6OgkJCVBST1ZJREUKLUBlbmQgbWVudQotCi1Abm9kZSBTaW1wbGUgQXNzaWdubWVudHMKLUBzdWJzZWN0aW9uIFNpbXBsZSBBc3NpZ25tZW50cwotCi1Zb3UgbWF5IGFzc2lnbiB0byBhIHN5bWJvbCB1c2luZyBhbnkgb2YgdGhlIEMgYXNzaWdubWVudCBvcGVyYXRvcnM6Ci0KLUB0YWJsZSBAY29kZQotQGl0ZW0gQHZhcntzeW1ib2x9ID0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ICs9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSAtPSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gKj0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9IC89IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGl0ZW14IEB2YXJ7c3ltYm9sfSA8PD0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9ID4+PSBAdmFye2V4cHJlc3Npb259IDsKLUBpdGVteCBAdmFye3N5bWJvbH0gJj0gQHZhcntleHByZXNzaW9ufSA7Ci1AaXRlbXggQHZhcntzeW1ib2x9IHw9IEB2YXJ7ZXhwcmVzc2lvbn0gOwotQGVuZCB0YWJsZQotCi1UaGUgZmlyc3QgY2FzZSB3aWxsIGRlZmluZSBAdmFye3N5bWJvbH0gdG8gdGhlIHZhbHVlIG9mCi1AdmFye2V4cHJlc3Npb259LiAgSW4gdGhlIG90aGVyIGNhc2VzLCBAdmFye3N5bWJvbH0gbXVzdCBhbHJlYWR5IGJlCi1kZWZpbmVkLCBhbmQgdGhlIHZhbHVlIHdpbGwgYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuCi0KLVRoZSBzcGVjaWFsIHN5bWJvbCBuYW1lIEBzYW1wey59IGluZGljYXRlcyB0aGUgbG9jYXRpb24gY291bnRlci4gIFlvdQotbWF5IG9ubHkgdXNlIHRoaXMgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQuCi0KLVRoZSBzZW1pY29sb24gYWZ0ZXIgQHZhcntleHByZXNzaW9ufSBpcyByZXF1aXJlZC4KLQotRXhwcmVzc2lvbnMgYXJlIGRlZmluZWQgYmVsb3c7IHNlZSBAcmVme0V4cHJlc3Npb25zfS4KLQotWW91IG1heSB3cml0ZSBzeW1ib2wgYXNzaWdubWVudHMgYXMgY29tbWFuZHMgaW4gdGhlaXIgb3duIHJpZ2h0LCBvciBhcwotc3RhdGVtZW50cyB3aXRoaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZCwgb3IgYXMgcGFydCBvZiBhbiBvdXRwdXQKLXNlY3Rpb24gZGVzY3JpcHRpb24gaW4gYSBAY29kZXtTRUNUSU9OU30gY29tbWFuZC4KLQotVGhlIHNlY3Rpb24gb2YgdGhlIHN5bWJvbCB3aWxsIGJlIHNldCBmcm9tIHRoZSBzZWN0aW9uIG9mIHRoZQotZXhwcmVzc2lvbjsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBAcmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZSBzaG93aW5nIHRoZSB0aHJlZSBkaWZmZXJlbnQgcGxhY2VzIHRoYXQgc3ltYm9sCi1hc3NpZ25tZW50cyBtYXkgYmUgdXNlZDoKLQotQHNtYWxsZXhhbXBsZQotZmxvYXRpbmdfcG9pbnQgPSAwOwotU0VDVElPTlMKLUB7Ci0gIC50ZXh0IDoKLSAgICBAewotICAgICAgKigudGV4dCkKLSAgICAgIF9ldGV4dCA9IC47Ci0gICAgQH0KLSAgX2JkYXRhID0gKC4gKyAzKSAmIH4gNDsKLSAgLmRhdGEgOiBAeyAqKC5kYXRhKSBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLUluIHRoaXMgZXhhbXBsZSwgdGhlIHN5bWJvbCBAc2FtcHtmbG9hdGluZ19wb2ludH0gd2lsbCBiZSBkZWZpbmVkIGFzCi16ZXJvLiAgVGhlIHN5bWJvbCBAc2FtcHtfZXRleHR9IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgYWRkcmVzcyBmb2xsb3dpbmcKLXRoZSBsYXN0IEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9uLiAgVGhlIHN5bWJvbCBAc2FtcHtfYmRhdGF9IHdpbGwgYmUKLWRlZmluZWQgYXMgdGhlIGFkZHJlc3MgZm9sbG93aW5nIHRoZSBAc2FtcHsudGV4dH0gb3V0cHV0IHNlY3Rpb24gYWxpZ25lZAotdXB3YXJkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgotCi1Abm9kZSBQUk9WSURFCi1Ac3Vic2VjdGlvbiBQUk9WSURFCi1AY2luZGV4IFBST1ZJREUKLUluIHNvbWUgY2FzZXMsIGl0IGlzIGRlc2lyYWJsZSBmb3IgYSBsaW5rZXIgc2NyaXB0IHRvIGRlZmluZSBhIHN5bWJvbAotb25seSBpZiBpdCBpcyByZWZlcmVuY2VkIGFuZCBpcyBub3QgZGVmaW5lZCBieSBhbnkgb2JqZWN0IGluY2x1ZGVkIGluCi10aGUgbGluay4gIEZvciBleGFtcGxlLCB0cmFkaXRpb25hbCBsaW5rZXJzIGRlZmluZWQgdGhlIHN5bWJvbAotQHNhbXB7ZXRleHR9LiAgSG93ZXZlciwgQU5TSSBDIHJlcXVpcmVzIHRoYXQgdGhlIHVzZXIgYmUgYWJsZSB0byB1c2UKLUBzYW1we2V0ZXh0fSBhcyBhIGZ1bmN0aW9uIG5hbWUgd2l0aG91dCBlbmNvdW50ZXJpbmcgYW4gZXJyb3IuICBUaGUKLUBjb2Rle1BST1ZJREV9IGtleXdvcmQgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGEgc3ltYm9sLCBzdWNoIGFzCi1Ac2FtcHtldGV4dH0sIG9ubHkgaWYgaXQgaXMgcmVmZXJlbmNlZCBidXQgbm90IGRlZmluZWQuICBUaGUgc3ludGF4IGlzCi1AY29kZXtQUk9WSURFKEB2YXJ7c3ltYm9sfSA9IEB2YXJ7ZXhwcmVzc2lvbn0pfS4KLQotSGVyZSBpcyBhbiBleGFtcGxlIG9mIHVzaW5nIEBjb2Rle1BST1ZJREV9IHRvIGRlZmluZSBAc2FtcHtldGV4dH06Ci1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgLnRleHQgOgotICAgIEB7Ci0gICAgICAqKC50ZXh0KQotICAgICAgX2V0ZXh0ID0gLjsKLSAgICAgIFBST1ZJREUoZXRleHQgPSAuKTsKLSAgICBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgaWYgdGhlIHByb2dyYW0gZGVmaW5lcyBAc2FtcHtfZXRleHR9ICh3aXRoIGEgbGVhZGluZwotdW5kZXJzY29yZSksIHRoZSBsaW5rZXIgd2lsbCBnaXZlIGEgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvci4gIElmLCBvbgotdGhlIG90aGVyIGhhbmQsIHRoZSBwcm9ncmFtIGRlZmluZXMgQHNhbXB7ZXRleHR9ICh3aXRoIG5vIGxlYWRpbmcKLXVuZGVyc2NvcmUpLCB0aGUgbGlua2VyIHdpbGwgc2lsZW50bHkgdXNlIHRoZSBkZWZpbml0aW9uIGluIHRoZSBwcm9ncmFtLgotSWYgdGhlIHByb2dyYW0gcmVmZXJlbmNlcyBAc2FtcHtldGV4dH0gYnV0IGRvZXMgbm90IGRlZmluZSBpdCwgdGhlCi1saW5rZXIgd2lsbCB1c2UgdGhlIGRlZmluaXRpb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUBub2RlIFNFQ1RJT05TCi1Ac2VjdGlvbiBTRUNUSU9OUyBjb21tYW5kCi1Aa2luZGV4IFNFQ1RJT05TCi1UaGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgdGVsbHMgdGhlIGxpbmtlciBob3cgdG8gbWFwIGlucHV0IHNlY3Rpb25zCi1pbnRvIG91dHB1dCBzZWN0aW9ucywgYW5kIGhvdyB0byBwbGFjZSB0aGUgb3V0cHV0IHNlY3Rpb25zIGluIG1lbW9yeS4KLQotVGhlIGZvcm1hdCBvZiB0aGUgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQgaXM6Ci1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgQHZhcntzZWN0aW9ucy1jb21tYW5kfQotICBAdmFye3NlY3Rpb25zLWNvbW1hbmR9Ci0gIEBkb3Rze30KLUB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1FYWNoIEB2YXJ7c2VjdGlvbnMtY29tbWFuZH0gbWF5IG9mIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbQotYW4gQGNvZGV7RU5UUll9IGNvbW1hbmQgKEBweHJlZntFbnRyeSBQb2ludCwsRW50cnkgY29tbWFuZH0pCi1AaXRlbQotYSBzeW1ib2wgYXNzaWdubWVudCAoQHB4cmVme0Fzc2lnbm1lbnRzfSkKLUBpdGVtCi1hbiBvdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotQGl0ZW0KLWFuIG92ZXJsYXkgZGVzY3JpcHRpb24KLUBlbmQgaXRlbWl6ZQotCi1UaGUgQGNvZGV7RU5UUll9IGNvbW1hbmQgYW5kIHN5bWJvbCBhc3NpZ25tZW50cyBhcmUgcGVybWl0dGVkIGluc2lkZSB0aGUKLUBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGZvciBjb252ZW5pZW5jZSBpbiB1c2luZyB0aGUgbG9jYXRpb24gY291bnRlciBpbgotdGhvc2UgY29tbWFuZHMuICBUaGlzIGNhbiBhbHNvIG1ha2UgdGhlIGxpbmtlciBzY3JpcHQgZWFzaWVyIHRvCi11bmRlcnN0YW5kIGJlY2F1c2UgeW91IGNhbiB1c2UgdGhvc2UgY29tbWFuZHMgYXQgbWVhbmluZ2Z1bCBwb2ludHMgaW4KLXRoZSBsYXlvdXQgb2YgdGhlIG91dHB1dCBmaWxlLgotCi1PdXRwdXQgc2VjdGlvbiBkZXNjcmlwdGlvbnMgYW5kIG92ZXJsYXkgZGVzY3JpcHRpb25zIGFyZSBkZXNjcmliZWQKLWJlbG93LgotCi1JZiB5b3UgZG8gbm90IHVzZSBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kIGluIHlvdXIgbGlua2VyIHNjcmlwdCwgdGhlCi1saW5rZXIgd2lsbCBwbGFjZSBlYWNoIGlucHV0IHNlY3Rpb24gaW50byBhbiBpZGVudGljYWxseSBuYW1lZCBvdXRwdXQKLXNlY3Rpb24gaW4gdGhlIG9yZGVyIHRoYXQgdGhlIHNlY3Rpb25zIGFyZSBmaXJzdCBlbmNvdW50ZXJlZCBpbiB0aGUKLWlucHV0IGZpbGVzLiAgSWYgYWxsIGlucHV0IHNlY3Rpb25zIGFyZSBwcmVzZW50IGluIHRoZSBmaXJzdCBmaWxlLCBmb3IKLWV4YW1wbGUsIHRoZSBvcmRlciBvZiBzZWN0aW9ucyBpbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBtYXRjaCB0aGUgb3JkZXIKLWluIHRoZSBmaXJzdCBpbnB1dCBmaWxlLiAgVGhlIGZpcnN0IHNlY3Rpb24gd2lsbCBiZSBhdCBhZGRyZXNzIHplcm8uCi0KLUBtZW51Ci0qIE91dHB1dCBTZWN0aW9uIERlc2NyaXB0aW9uOjoJT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLSogT3V0cHV0IFNlY3Rpb24gTmFtZTo6CQlPdXRwdXQgc2VjdGlvbiBuYW1lCi0qIE91dHB1dCBTZWN0aW9uIEFkZHJlc3M6OglPdXRwdXQgc2VjdGlvbiBhZGRyZXNzCi0qIElucHV0IFNlY3Rpb246OgkJSW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbgotKiBPdXRwdXQgU2VjdGlvbiBEYXRhOjoJCU91dHB1dCBzZWN0aW9uIGRhdGEKLSogT3V0cHV0IFNlY3Rpb24gS2V5d29yZHM6OglPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcwotKiBPdXRwdXQgU2VjdGlvbiBEaXNjYXJkaW5nOjoJT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZwotKiBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzOjoJT3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlcwotKiBPdmVybGF5IERlc2NyaXB0aW9uOjoJCU92ZXJsYXkgZGVzY3JpcHRpb24KLUBlbmQgbWVudQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBEZXNjcmlwdGlvbgotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLVRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tzIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cCAKLUB2YXJ7c2VjdGlvbn0gW0B2YXJ7YWRkcmVzc31dIFsoQHZhcnt0eXBlfSldIDogW0FUKEB2YXJ7bG1hfSldCi0gIEB7Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICBAZG90c3t9Ci0gIEB9IFs+QHZhcntyZWdpb259XSBbOkB2YXJ7cGhkcn0gOkB2YXJ7cGhkcn0gQGRvdHN7fV0gWz1AdmFye2ZpbGxleHB9XQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTW9zdCBvdXRwdXQgc2VjdGlvbnMgZG8gbm90IHVzZSBtb3N0IG9mIHRoZSBvcHRpb25hbCBzZWN0aW9uIGF0dHJpYnV0ZXMuCi0KLVRoZSB3aGl0ZXNwYWNlIGFyb3VuZCBAdmFye3NlY3Rpb259IGlzIHJlcXVpcmVkLCBzbyB0aGF0IHRoZSBzZWN0aW9uCi1uYW1lIGlzIHVuYW1iaWd1b3VzLiAgVGhlIGNvbG9uIGFuZCB0aGUgY3VybHkgYnJhY2VzIGFyZSBhbHNvIHJlcXVpcmVkLgotVGhlIGxpbmUgYnJlYWtzIGFuZCBvdGhlciB3aGl0ZSBzcGFjZSBhcmUgb3B0aW9uYWwuCi0KLUVhY2ggQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfSBtYXkgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLUBpdGVtaXplIEBidWxsZXQKLUBpdGVtCi1hIHN5bWJvbCBhc3NpZ25tZW50IChAcHhyZWZ7QXNzaWdubWVudHN9KQotQGl0ZW0KLWFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24gKEBweHJlZntJbnB1dCBTZWN0aW9ufSkKLUBpdGVtCi1kYXRhIHZhbHVlcyB0byBpbmNsdWRlIGRpcmVjdGx5IChAcHhyZWZ7T3V0cHV0IFNlY3Rpb24gRGF0YX0pCi1AaXRlbQotYSBzcGVjaWFsIG91dHB1dCBzZWN0aW9uIGtleXdvcmQgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBLZXl3b3Jkc30pCi1AZW5kIGl0ZW1pemUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gTmFtZQotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gbmFtZQotQGNpbmRleCBuYW1lLCBzZWN0aW9uCi1AY2luZGV4IHNlY3Rpb24gbmFtZQotVGhlIG5hbWUgb2YgdGhlIG91dHB1dCBzZWN0aW9uIGlzIEB2YXJ7c2VjdGlvbn0uICBAdmFye3NlY3Rpb259IG11c3QKLW1lZXQgdGhlIGNvbnN0cmFpbnRzIG9mIHlvdXIgb3V0cHV0IGZvcm1hdC4gIEluIGZvcm1hdHMgd2hpY2ggb25seQotc3VwcG9ydCBhIGxpbWl0ZWQgbnVtYmVyIG9mIHNlY3Rpb25zLCBzdWNoIGFzIEBjb2Rle2Eub3V0fSwgdGhlIG5hbWUKLW11c3QgYmUgb25lIG9mIHRoZSBuYW1lcyBzdXBwb3J0ZWQgYnkgdGhlIGZvcm1hdCAoQGNvZGV7YS5vdXR9LCBmb3IKLWV4YW1wbGUsIGFsbG93cyBvbmx5IEBzYW1wey50ZXh0fSwgQHNhbXB7LmRhdGF9IG9yIEBzYW1wey5ic3N9KS4gSWYgdGhlCi1vdXRwdXQgZm9ybWF0IHN1cHBvcnRzIGFueSBudW1iZXIgb2Ygc2VjdGlvbnMsIGJ1dCB3aXRoIG51bWJlcnMgYW5kIG5vdAotbmFtZXMgKGFzIGlzIHRoZSBjYXNlIGZvciBPYXN5cyksIHRoZSBuYW1lIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhCi1xdW90ZWQgbnVtZXJpYyBzdHJpbmcuICBBIHNlY3Rpb24gbmFtZSBtYXkgY29uc2lzdCBvZiBhbnkgc2VxdWVuY2Ugb2YKLWNoYXJhY3RlcnMsIGJ1dCBhIG5hbWUgd2hpY2ggY29udGFpbnMgYW55IHVudXN1YWwgY2hhcmFjdGVycyBzdWNoIGFzCi1jb21tYXMgbXVzdCBiZSBxdW90ZWQuCi0KLVRoZSBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gaXMgc3BlY2lhbDsgQHJlZntPdXRwdXQgU2VjdGlvbgotRGlzY2FyZGluZ30uCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEFkZHJlc3MKLUBzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIGFkZHJlc3MKLUBjaW5kZXggYWRkcmVzcywgc2VjdGlvbgotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MKLVRoZSBAdmFye2FkZHJlc3N9IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBWTUEgKHRoZSB2aXJ0dWFsIG1lbW9yeQotYWRkcmVzcykgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgSWYgeW91IGRvIG5vdCBwcm92aWRlIEB2YXJ7YWRkcmVzc30sCi10aGUgbGlua2VyIHdpbGwgc2V0IGl0IGJhc2VkIG9uIEB2YXJ7cmVnaW9ufSBpZiBwcmVzZW50LCBvciBvdGhlcndpc2UKLWJhc2VkIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBsb2NhdGlvbiBjb3VudGVyLgotCi1JZiB5b3UgcHJvdmlkZSBAdmFye2FkZHJlc3N9LCB0aGUgYWRkcmVzcyBvZiB0aGUgb3V0cHV0IHNlY3Rpb24gd2lsbCBiZQotc2V0IHRvIHByZWNpc2VseSB0aGF0LiAgSWYgeW91IHByb3ZpZGUgbmVpdGhlciBAdmFye2FkZHJlc3N9IG5vcgotQHZhcntyZWdpb259LCB0aGVuIHRoZSBhZGRyZXNzIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiB3aWxsIGJlIHNldCB0byB0aGUKLWN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgYWxpZ25lZCB0byB0aGUgYWxpZ25tZW50Ci1yZXF1aXJlbWVudHMgb2YgdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGUKLW91dHB1dCBzZWN0aW9uIGlzIHRoZSBzdHJpY3Rlc3QgYWxpZ25tZW50IG9mIGFueSBpbnB1dCBzZWN0aW9uIGNvbnRhaW5lZAotd2l0aGluIHRoZSBvdXRwdXQgc2VjdGlvbi4KLQotRm9yIGV4YW1wbGUsCi1Ac21hbGxleGFtcGxlCi0udGV4dCAuIDogQHsgKigudGV4dCkgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLWFuZAotQHNtYWxsZXhhbXBsZQotLnRleHQgOiBAeyAqKC50ZXh0KSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotYXJlIHN1YnRseSBkaWZmZXJlbnQuICBUaGUgZmlyc3Qgd2lsbCBzZXQgdGhlIGFkZHJlc3Mgb2YgdGhlCi1Ac2FtcHsudGV4dH0gb3V0cHV0IHNlY3Rpb24gdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uCi1jb3VudGVyLiAgVGhlIHNlY29uZCB3aWxsIHNldCBpdCB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIgYWxpZ25lZCB0byB0aGUgc3RyaWN0ZXN0IGFsaWdubWVudCBvZiBhIEBzYW1wey50ZXh0fSBpbnB1dAotc2VjdGlvbi4KLQotVGhlIEB2YXJ7YWRkcmVzc30gbWF5IGJlIGFuIGFyYml0cmFyeSBleHByZXNzaW9uOyBAcmVme0V4cHJlc3Npb25zfS4KLUZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhbGlnbiB0aGUgc2VjdGlvbiBvbiBhIDB4MTAgYnl0ZSBib3VuZGFyeSwKLXNvIHRoYXQgdGhlIGxvd2VzdCBmb3VyIGJpdHMgb2YgdGhlIHNlY3Rpb24gYWRkcmVzcyBhcmUgemVybywgeW91IGNvdWxkCi1kbyBzb21ldGhpbmcgbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotLnRleHQgQUxJR04oMHgxMCkgOiBAeyAqKC50ZXh0KSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhpcyB3b3JrcyBiZWNhdXNlIEBjb2Rle0FMSUdOfSByZXR1cm5zIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNvdW50ZXIKLWFsaWduZWQgdXB3YXJkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0KLVNwZWNpZnlpbmcgQHZhcnthZGRyZXNzfSBmb3IgYSBzZWN0aW9uIHdpbGwgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUKLWxvY2F0aW9uIGNvdW50ZXIuCi0KLUBub2RlIElucHV0IFNlY3Rpb24KLUBzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24KLUBjaW5kZXggaW5wdXQgc2VjdGlvbnMKLUBjaW5kZXggbWFwcGluZyBpbnB1dCBzZWN0aW9ucyB0byBvdXRwdXQgc2VjdGlvbnMKLVRoZSBtb3N0IGNvbW1vbiBvdXRwdXQgc2VjdGlvbiBjb21tYW5kIGlzIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24uCi0KLVRoZSBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGlzIHRoZSBtb3N0IGJhc2ljIGxpbmtlciBzY3JpcHQgb3BlcmF0aW9uLgotWW91IHVzZSBvdXRwdXQgc2VjdGlvbnMgdG8gdGVsbCB0aGUgbGlua2VyIGhvdyB0byBsYXkgb3V0IHlvdXIgcHJvZ3JhbQotaW4gbWVtb3J5LiAgWW91IHVzZSBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9ucyB0byB0ZWxsIHRoZSBsaW5rZXIgaG93IHRvCi1tYXAgdGhlIGlucHV0IGZpbGVzIGludG8geW91ciBtZW1vcnkgbGF5b3V0LgotCi1AbWVudQotKiBJbnB1dCBTZWN0aW9uIEJhc2ljczo6CUlucHV0IHNlY3Rpb24gYmFzaWNzCi0qIElucHV0IFNlY3Rpb24gV2lsZGNhcmRzOjoJSW5wdXQgc2VjdGlvbiB3aWxkY2FyZCBwYXR0ZXJucwotKiBJbnB1dCBTZWN0aW9uIENvbW1vbjo6CUlucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCi0qIElucHV0IFNlY3Rpb24gS2VlcDo6CQlJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KLSogSW5wdXQgU2VjdGlvbiBFeGFtcGxlOjoJSW5wdXQgc2VjdGlvbiBleGFtcGxlCi1AZW5kIG1lbnUKLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBCYXNpY3MKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gYmFzaWNzCi1AY2luZGV4IGlucHV0IHNlY3Rpb24gYmFzaWNzCi1BbiBpbnB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIGNvbnNpc3RzIG9mIGEgZmlsZSBuYW1lIG9wdGlvbmFsbHkgZm9sbG93ZWQKLWJ5IGEgbGlzdCBvZiBzZWN0aW9uIG5hbWVzIGluIHBhcmVudGhlc2VzLgotCi1UaGUgZmlsZSBuYW1lIGFuZCB0aGUgc2VjdGlvbiBuYW1lIG1heSBiZSB3aWxkY2FyZCBwYXR0ZXJucywgd2hpY2ggd2UKLWRlc2NyaWJlIGZ1cnRoZXIgYmVsb3cgKEBweHJlZntJbnB1dCBTZWN0aW9uIFdpbGRjYXJkc30pLgotCi1UaGUgbW9zdCBjb21tb24gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBpcyB0byBpbmNsdWRlIGFsbCBpbnB1dAotc2VjdGlvbnMgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24uICBGb3IgZXhhbXBsZSwgdG8KLWluY2x1ZGUgYWxsIGlucHV0IEBzYW1wey50ZXh0fSBzZWN0aW9ucywgeW91IHdvdWxkIHdyaXRlOgotQHNtYWxsZXhhbXBsZQotKigudGV4dCkKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLUhlcmUgdGhlIEBzYW1weyp9IGlzIGEgd2lsZGNhcmQgd2hpY2ggbWF0Y2hlcyBhbnkgZmlsZSBuYW1lLiAgVG8gZXhjbHVkZSBhIGZpbGUKLWZyb20gbWF0Y2hpbmcgdGhlIGZpbGUgbmFtZSB3aWxkY2FyZCwgRVhDTFVERV9GSUxFIG1heSBiZSB1c2VkIHRvIG1hdGNoIGFsbCBmaWxlcwotZXhjZXB0IHRoZSBvbmUgc3BlY2lmaWVkIGJ5IEVYQ0xVREVfRklMRS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi1AZW5kIHNtYWxsZXhhbXBsZQotd2lsbCBjYXVzZSBhbGwgLmN0b3JzIHNlY3Rpb25zIGZyb20gYWxsIGZpbGVzIGV4Y2VwdCBjcnRlbmQubyB0byBiZSBpbmNsdWRlZC4KLQotVGhlcmUgYXJlIHR3byB3YXlzIHRvIGluY2x1ZGUgbW9yZSB0aGFuIG9uZSBzZWN0aW9uOgotQHNtYWxsZXhhbXBsZQotKigudGV4dCAucmRhdGEpCi0qKC50ZXh0KSAqKC5yZGF0YSkKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLVRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBAc2FtcHsudGV4dH0gYW5kCi1Ac2FtcHsucmRhdGF9IGlucHV0IHNlY3Rpb25zIHdpbGwgYXBwZWFyIGluIHRoZSBvdXRwdXQgc2VjdGlvbi4gIEluIHRoZQotZmlyc3QgZXhhbXBsZSwgdGhleSB3aWxsIGJlIGludGVybWluZ2xlZC4gIEluIHRoZSBzZWNvbmQgZXhhbXBsZSwgYWxsCi1Ac2FtcHsudGV4dH0gaW5wdXQgc2VjdGlvbnMgd2lsbCBhcHBlYXIgZmlyc3QsIGZvbGxvd2VkIGJ5IGFsbAotQHNhbXB7LnJkYXRhfSBpbnB1dCBzZWN0aW9ucy4KLQotWW91IGNhbiBzcGVjaWZ5IGEgZmlsZSBuYW1lIHRvIGluY2x1ZGUgc2VjdGlvbnMgZnJvbSBhIHBhcnRpY3VsYXIgZmlsZS4KLVlvdSB3b3VsZCBkbyB0aGlzIGlmIG9uZSBvciBtb3JlIG9mIHlvdXIgZmlsZXMgY29udGFpbiBzcGVjaWFsIGRhdGEgdGhhdAotbmVlZHMgdG8gYmUgYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGluIG1lbW9yeS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotZGF0YS5vKC5kYXRhKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IHVzZSBhIGZpbGUgbmFtZSB3aXRob3V0IGEgbGlzdCBvZiBzZWN0aW9ucywgdGhlbiBhbGwgc2VjdGlvbnMgaW4KLXRoZSBpbnB1dCBmaWxlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhpcyBpcyBub3QKLWNvbW1vbmx5IGRvbmUsIGJ1dCBpdCBtYXkgYnkgdXNlZnVsIG9uIG9jY2FzaW9uLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi1kYXRhLm8KLUBlbmQgc21hbGxleGFtcGxlCi0KLVdoZW4geW91IHVzZSBhIGZpbGUgbmFtZSB3aGljaCBkb2VzIG5vdCBjb250YWluIGFueSB3aWxkIGNhcmQKLWNoYXJhY3RlcnMsIHRoZSBsaW5rZXIgd2lsbCBmaXJzdCBzZWUgaWYgeW91IGFsc28gc3BlY2lmaWVkIHRoZSBmaWxlCi1uYW1lIG9uIHRoZSBsaW5rZXIgY29tbWFuZCBsaW5lIG9yIGluIGFuIEBjb2Rle0lOUFVUfSBjb21tYW5kLiAgSWYgeW91Ci1kaWQgbm90LCB0aGUgbGlua2VyIHdpbGwgYXR0ZW1wdCB0byBvcGVuIHRoZSBmaWxlIGFzIGFuIGlucHV0IGZpbGUsIGFzCi10aG91Z2ggaXQgYXBwZWFyZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIE5vdGUgdGhhdCB0aGlzIGRpZmZlcnMgZnJvbSBhbgotQGNvZGV7SU5QVVR9IGNvbW1hbmQsIGJlY2F1c2UgdGhlIGxpbmtlciB3aWxsIG5vdCBzZWFyY2ggZm9yIHRoZSBmaWxlIGluCi10aGUgYXJjaGl2ZSBzZWFyY2ggcGF0aC4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBXaWxkY2FyZHMKLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gd2lsZGNhcmQgcGF0dGVybnMKLUBjaW5kZXggaW5wdXQgc2VjdGlvbiB3aWxkY2FyZHMKLUBjaW5kZXggd2lsZGNhcmQgZmlsZSBuYW1lIHBhdHRlcm5zCi1AY2luZGV4IGZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucwotQGNpbmRleCBzZWN0aW9uIG5hbWUgd2lsZGNhcmQgcGF0dGVybnMKLUluIGFuIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb24sIGVpdGhlciB0aGUgZmlsZSBuYW1lIG9yIHRoZSBzZWN0aW9uCi1uYW1lIG9yIGJvdGggbWF5IGJlIHdpbGRjYXJkIHBhdHRlcm5zLgotCi1UaGUgZmlsZSBuYW1lIG9mIEBzYW1weyp9IHNlZW4gaW4gbWFueSBleGFtcGxlcyBpcyBhIHNpbXBsZSB3aWxkY2FyZAotcGF0dGVybiBmb3IgdGhlIGZpbGUgbmFtZS4KLQotVGhlIHdpbGRjYXJkIHBhdHRlcm5zIGFyZSBsaWtlIHRob3NlIHVzZWQgYnkgdGhlIFVuaXggc2hlbGwuCi0KLUB0YWJsZSBAc2FtcAotQGl0ZW0gKgotbWF0Y2hlcyBhbnkgbnVtYmVyIG9mIGNoYXJhY3RlcnMKLUBpdGVtID8KLW1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIKLUBpdGVtIFtAdmFye2NoYXJzfV0KLW1hdGNoZXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgYW55IG9mIHRoZSBAdmFye2NoYXJzfTsgdGhlIEBzYW1wey19Ci1jaGFyYWN0ZXIgbWF5IGJlIHVzZWQgdG8gc3BlY2lmeSBhIHJhbmdlIG9mIGNoYXJhY3RlcnMsIGFzIGluCi1Ac2FtcHtbYS16XX0gdG8gbWF0Y2ggYW55IGxvd2VyIGNhc2UgbGV0dGVyCi1AaXRlbSBcCi1xdW90ZXMgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIKLUBlbmQgdGFibGUKLQotV2hlbiBhIGZpbGUgbmFtZSBpcyBtYXRjaGVkIHdpdGggYSB3aWxkY2FyZCwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMKLXdpbGwgbm90IG1hdGNoIGEgQHNhbXB7L30gY2hhcmFjdGVyICh1c2VkIHRvIHNlcGFyYXRlIGRpcmVjdG9yeSBuYW1lcyBvbgotVW5peCkuICBBIHBhdHRlcm4gY29uc2lzdGluZyBvZiBhIHNpbmdsZSBAc2FtcHsqfSBjaGFyYWN0ZXIgaXMgYW4KLWV4Y2VwdGlvbjsgaXQgd2lsbCBhbHdheXMgbWF0Y2ggYW55IGZpbGUgbmFtZSwgd2hldGhlciBpdCBjb250YWlucyBhCi1Ac2FtcHsvfSBvciBub3QuICBJbiBhIHNlY3Rpb24gbmFtZSwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgd2lsbCBtYXRjaAotYSBAc2FtcHsvfSBjaGFyYWN0ZXIuCi0KLUZpbGUgbmFtZSB3aWxkY2FyZCBwYXR0ZXJucyBvbmx5IG1hdGNoIGZpbGVzIHdoaWNoIGFyZSBleHBsaWNpdGx5Ci1zcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSBvciBpbiBhbiBAY29kZXtJTlBVVH0gY29tbWFuZC4gIFRoZSBsaW5rZXIKLWRvZXMgbm90IHNlYXJjaCBkaXJlY3RvcmllcyB0byBleHBhbmQgd2lsZGNhcmRzLgotCi1JZiBhIGZpbGUgbmFtZSBtYXRjaGVzIG1vcmUgdGhhbiBvbmUgd2lsZGNhcmQgcGF0dGVybiwgb3IgaWYgYSBmaWxlIG5hbWUKLWFwcGVhcnMgZXhwbGljaXRseSBhbmQgaXMgYWxzbyBtYXRjaGVkIGJ5IGEgd2lsZGNhcmQgcGF0dGVybiwgdGhlIGxpbmtlcgotd2lsbCB1c2UgdGhlIGZpcnN0IG1hdGNoIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgRm9yIGV4YW1wbGUsIHRoaXMKLXNlcXVlbmNlIG9mIGlucHV0IHNlY3Rpb24gZGVzY3JpcHRpb25zIGlzIHByb2JhYmx5IGluIGVycm9yLCBiZWNhdXNlIHRoZQotQGZpbGV7ZGF0YS5vfSBydWxlIHdpbGwgbm90IGJlIHVzZWQ6Ci1Ac21hbGxleGFtcGxlCi0uZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0uZGF0YTEgOiBAeyBkYXRhLm8oLmRhdGEpIEB9Ci1AZW5kIHNtYWxsZXhhbXBsZQotCi1AY2luZGV4IFNPUlQKLU5vcm1hbGx5LCB0aGUgbGlua2VyIHdpbGwgcGxhY2UgZmlsZXMgYW5kIHNlY3Rpb25zIG1hdGNoZWQgYnkgd2lsZGNhcmRzCi1pbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgc2VlbiBkdXJpbmcgdGhlIGxpbmsuICBZb3UgY2FuIGNoYW5nZQotdGhpcyBieSB1c2luZyB0aGUgQGNvZGV7U09SVH0ga2V5d29yZCwgd2hpY2ggYXBwZWFycyBiZWZvcmUgYSB3aWxkY2FyZAotcGF0dGVybiBpbiBwYXJlbnRoZXNlcyAoZS5nLiwgQGNvZGV7U09SVCgudGV4dCopfSkuICBXaGVuIHRoZQotQGNvZGV7U09SVH0ga2V5d29yZCBpcyB1c2VkLCB0aGUgbGlua2VyIHdpbGwgc29ydCB0aGUgZmlsZXMgb3Igc2VjdGlvbnMKLWludG8gYXNjZW5kaW5nIG9yZGVyIGJ5IG5hbWUgYmVmb3JlIHBsYWNpbmcgdGhlbSBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUlmIHlvdSBldmVyIGdldCBjb25mdXNlZCBhYm91dCB3aGVyZSBpbnB1dCBzZWN0aW9ucyBhcmUgZ29pbmcsIHVzZSB0aGUKLUBzYW1wey1NfSBsaW5rZXIgb3B0aW9uIHRvIGdlbmVyYXRlIGEgbWFwIGZpbGUuICBUaGUgbWFwIGZpbGUgc2hvd3MKLXByZWNpc2VseSBob3cgaW5wdXQgc2VjdGlvbnMgYXJlIG1hcHBlZCB0byBvdXRwdXQgc2VjdGlvbnMuCi0KLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgd2lsZGNhcmQgcGF0dGVybnMgbWlnaHQgYmUgdXNlZCB0byBwYXJ0aXRpb24KLWZpbGVzLiAgVGhpcyBsaW5rZXIgc2NyaXB0IGRpcmVjdHMgdGhlIGxpbmtlciB0byBwbGFjZSBhbGwgQHNhbXB7LnRleHR9Ci1zZWN0aW9ucyBpbiBAc2FtcHsudGV4dH0gYW5kIGFsbCBAc2FtcHsuYnNzfSBzZWN0aW9ucyBpbiBAc2FtcHsuYnNzfS4KLVRoZSBsaW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gZnJvbSBhbGwgZmlsZXMgYmVnaW5uaW5nCi13aXRoIGFuIHVwcGVyIGNhc2UgY2hhcmFjdGVyIGluIEBzYW1wey5EQVRBfTsgZm9yIGFsbCBvdGhlciBmaWxlcywgdGhlCi1saW5rZXIgd2lsbCBwbGFjZSB0aGUgQHNhbXB7LmRhdGF9IHNlY3Rpb24gaW4gQHNhbXB7LmRhdGF9LgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAewotICAudGV4dCA6IEB7ICooLnRleHQpIEB9Ci0gIC5EQVRBIDogQHsgW0EtWl0qKC5kYXRhKSBAfQotICAuZGF0YSA6IEB7ICooLmRhdGEpIEB9Ci0gIC5ic3MgOiBAeyAqKC5ic3MpIEB9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBDb21tb24KLUBzdWJzdWJzZWN0aW9uIElucHV0IHNlY3Rpb24gZm9yIGNvbW1vbiBzeW1ib2xzCi1AY2luZGV4IGNvbW1vbiBzeW1ib2wgcGxhY2VtZW50Ci1AY2luZGV4IHVuaW5pdGlhbGl6ZWQgZGF0YSBwbGFjZW1lbnQKLUEgc3BlY2lhbCBub3RhdGlvbiBpcyBuZWVkZWQgZm9yIGNvbW1vbiBzeW1ib2xzLCBiZWNhdXNlIGluIG1hbnkgb2JqZWN0Ci1maWxlIGZvcm1hdHMgY29tbW9uIHN5bWJvbHMgZG8gbm90IGhhdmUgYSBwYXJ0aWN1bGFyIGlucHV0IHNlY3Rpb24uICBUaGUKLWxpbmtlciB0cmVhdHMgY29tbW9uIHN5bWJvbHMgYXMgdGhvdWdoIHRoZXkgYXJlIGluIGFuIGlucHV0IHNlY3Rpb24KLW5hbWVkIEBzYW1we0NPTU1PTn0uCi0KLVlvdSBtYXkgdXNlIGZpbGUgbmFtZXMgd2l0aCB0aGUgQHNhbXB7Q09NTU9OfSBzZWN0aW9uIGp1c3QgYXMgd2l0aCBhbnkKLW90aGVyIGlucHV0IHNlY3Rpb25zLiAgWW91IGNhbiB1c2UgdGhpcyB0byBwbGFjZSBjb21tb24gc3ltYm9scyBmcm9tIGEKLXBhcnRpY3VsYXIgaW5wdXQgZmlsZSBpbiBvbmUgc2VjdGlvbiB3aGlsZSBjb21tb24gc3ltYm9scyBmcm9tIG90aGVyCi1pbnB1dCBmaWxlcyBhcmUgcGxhY2VkIGluIGFub3RoZXIgc2VjdGlvbi4KLQotSW4gbW9zdCBjYXNlcywgY29tbW9uIHN5bWJvbHMgaW4gaW5wdXQgZmlsZXMgd2lsbCBiZSBwbGFjZWQgaW4gdGhlCi1Ac2FtcHsuYnNzfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZS4gIEZvciBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotLmJzcyBAeyAqKC5ic3MpICooQ09NTU9OKSBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGNpbmRleCBzY29tbW9uIHNlY3Rpb24KLUBjaW5kZXggc21hbGwgY29tbW9uIHN5bWJvbHMKLVNvbWUgb2JqZWN0IGZpbGUgZm9ybWF0cyBoYXZlIG1vcmUgdGhhbiBvbmUgdHlwZSBvZiBjb21tb24gc3ltYm9sLiAgRm9yCi1leGFtcGxlLCB0aGUgTUlQUyBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IGRpc3Rpbmd1aXNoZXMgc3RhbmRhcmQgY29tbW9uCi1zeW1ib2xzIGFuZCBzbWFsbCBjb21tb24gc3ltYm9scy4gIEluIHRoaXMgY2FzZSwgdGhlIGxpbmtlciB3aWxsIHVzZSBhCi1kaWZmZXJlbnQgc3BlY2lhbCBzZWN0aW9uIG5hbWUgZm9yIG90aGVyIHR5cGVzIG9mIGNvbW1vbiBzeW1ib2xzLiAgSW4KLXRoZSBjYXNlIG9mIE1JUFMgRUxGLCB0aGUgbGlua2VyIHVzZXMgQHNhbXB7Q09NTU9OfSBmb3Igc3RhbmRhcmQgY29tbW9uCi1zeW1ib2xzIGFuZCBAc2FtcHsuc2NvbW1vbn0gZm9yIHNtYWxsIGNvbW1vbiBzeW1ib2xzLiAgVGhpcyBwZXJtaXRzIHlvdQotdG8gbWFwIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgY29tbW9uIHN5bWJvbHMgaW50byBtZW1vcnkgYXQgZGlmZmVyZW50Ci1sb2NhdGlvbnMuCi0KLUBjaW5kZXggW0NPTU1PTl0KLVlvdSB3aWxsIHNvbWV0aW1lcyBzZWUgQHNhbXB7W0NPTU1PTl19IGluIG9sZCBsaW5rZXIgc2NyaXB0cy4gIFRoaXMKLW5vdGF0aW9uIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiAgSXQgaXMgZXF1aXZhbGVudCB0bwotQHNhbXB7KihDT01NT04pfS4KLQotQG5vZGUgSW5wdXQgU2VjdGlvbiBLZWVwCi1Ac3Vic3Vic2VjdGlvbiBJbnB1dCBzZWN0aW9uIGFuZCBnYXJiYWdlIGNvbGxlY3Rpb24KLUBjaW5kZXggS0VFUAotQGNpbmRleCBnYXJiYWdlIGNvbGxlY3Rpb24KLVdoZW4gbGluay10aW1lIGdhcmJhZ2UgY29sbGVjdGlvbiBpcyBpbiB1c2UgKEBzYW1wey0tZ2Mtc2VjdGlvbnN9KSwKLWl0IGlzIG9mdGVuIHVzZWZ1bCB0byBtYXJrIHNlY3Rpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBlbGltaW5hdGVkLiAKLVRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHN1cnJvdW5kaW5nIGFuIGlucHV0IHNlY3Rpb24ncyB3aWxkY2FyZCBlbnRyeQotd2l0aCBAY29kZXtLRUVQKCl9LCBhcyBpbiBAY29kZXtLRUVQKCooLmluaXQpKX0gb3IKLUBjb2Rle0tFRVAoU09SVCgqKSguY3RvcnMpKX0uCi0KLUBub2RlIElucHV0IFNlY3Rpb24gRXhhbXBsZQotQHN1YnN1YnNlY3Rpb24gSW5wdXQgc2VjdGlvbiBleGFtcGxlCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgYSBjb21wbGV0ZSBsaW5rZXIgc2NyaXB0LiAgSXQgdGVsbHMgdGhlIGxpbmtlcgotdG8gcmVhZCBhbGwgb2YgdGhlIHNlY3Rpb25zIGZyb20gZmlsZSBAZmlsZXthbGwub30gYW5kIHBsYWNlIHRoZW0gYXQgdGhlCi1zdGFydCBvZiBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXRhfSB3aGljaCBzdGFydHMgYXQgbG9jYXRpb24KLUBzYW1wezB4MTAwMDB9LiAgQWxsIG9mIHNlY3Rpb24gQHNhbXB7LmlucHV0MX0gZnJvbSBmaWxlIEBmaWxle2Zvby5vfQotZm9sbG93cyBpbW1lZGlhdGVseSwgaW4gdGhlIHNhbWUgb3V0cHV0IHNlY3Rpb24uICBBbGwgb2Ygc2VjdGlvbgotQHNhbXB7LmlucHV0Mn0gZnJvbSBAZmlsZXtmb28ub30gZ29lcyBpbnRvIG91dHB1dCBzZWN0aW9uCi1Ac2FtcHtvdXRwdXRifSwgZm9sbG93ZWQgYnkgc2VjdGlvbiBAc2FtcHsuaW5wdXQxfSBmcm9tIEBmaWxle2ZvbzEub30uCi1BbGwgb2YgdGhlIHJlbWFpbmluZyBAc2FtcHsuaW5wdXQxfSBhbmQgQHNhbXB7LmlucHV0Mn0gc2VjdGlvbnMgZnJvbSBhbnkKLWZpbGVzIGFyZSB3cml0dGVuIHRvIG91dHB1dCBzZWN0aW9uIEBzYW1we291dHB1dGN9LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7Ci0gIG91dHB1dGEgMHgxMDAwMCA6Ci0gICAgQHsKLSAgICBhbGwubwotICAgIGZvby5vICguaW5wdXQxKQotICAgIEB9Ci0gIG91dHB1dGIgOgotICAgIEB7Ci0gICAgZm9vLm8gKC5pbnB1dDIpCi0gICAgZm9vMS5vICguaW5wdXQxKQotICAgIEB9Ci0gIG91dHB1dGMgOgotICAgIEB7Ci0gICAgKiguaW5wdXQxKQotICAgICooLmlucHV0MikKLSAgICBAfQotQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlICAgICAgICAKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGF0YQotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGF0YQotQGNpbmRleCBkYXRhCi1AY2luZGV4IHNlY3Rpb24gZGF0YQotQGNpbmRleCBvdXRwdXQgc2VjdGlvbiBkYXRhCi1Aa2luZGV4IEJZVEUoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggU0hPUlQoQHZhcntleHByZXNzaW9ufSkKLUBraW5kZXggTE9ORyhAdmFye2V4cHJlc3Npb259KQotQGtpbmRleCBRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Aa2luZGV4IFNRVUFEKEB2YXJ7ZXhwcmVzc2lvbn0pCi1Zb3UgY2FuIGluY2x1ZGUgZXhwbGljaXQgYnl0ZXMgb2YgZGF0YSBpbiBhbiBvdXRwdXQgc2VjdGlvbiBieSB1c2luZwotQGNvZGV7QllURX0sIEBjb2Rle1NIT1JUfSwgQGNvZGV7TE9OR30sIEBjb2Rle1FVQUR9LCBvciBAY29kZXtTUVVBRH0gYXMKLWFuIG91dHB1dCBzZWN0aW9uIGNvbW1hbmQuICBFYWNoIGtleXdvcmQgaXMgZm9sbG93ZWQgYnkgYW4gZXhwcmVzc2lvbiBpbgotcGFyZW50aGVzZXMgcHJvdmlkaW5nIHRoZSB2YWx1ZSB0byBzdG9yZSAoQHB4cmVme0V4cHJlc3Npb25zfSkuICBUaGUKLXZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHN0b3JlZCBhdCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgbG9jYXRpb24KLWNvdW50ZXIuCi0KLVRoZSBAY29kZXtCWVRFfSwgQGNvZGV7U0hPUlR9LCBAY29kZXtMT05HfSwgYW5kIEBjb2Rle1FVQUR9IGNvbW1hbmRzCi1zdG9yZSBvbmUsIHR3bywgZm91ciwgYW5kIGVpZ2h0IGJ5dGVzIChyZXNwZWN0aXZlbHkpLiAgQWZ0ZXIgc3RvcmluZyB0aGUKLWJ5dGVzLCB0aGUgbG9jYXRpb24gY291bnRlciBpcyBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzCi1zdG9yZWQuCi0KLUZvciBleGFtcGxlLCB0aGlzIHdpbGwgc3RvcmUgdGhlIGJ5dGUgMSBmb2xsb3dlZCBieSB0aGUgZm91ciBieXRlIHZhbHVlCi1vZiB0aGUgc3ltYm9sIEBzYW1we2FkZHJ9OgotQHNtYWxsZXhhbXBsZQotQllURSgxKQotTE9ORyhhZGRyKQotQGVuZCBzbWFsbGV4YW1wbGUKLQotV2hlbiB1c2luZyBhIDY0IGJpdCBob3N0IG9yIHRhcmdldCwgQGNvZGV7UVVBRH0gYW5kIEBjb2Rle1NRVUFEfSBhcmUgdGhlCi1zYW1lOyB0aGV5IGJvdGggc3RvcmUgYW4gOCBieXRlLCBvciA2NCBiaXQsIHZhbHVlLiAgV2hlbiBib3RoIGhvc3QgYW5kCi10YXJnZXQgYXJlIDMyIGJpdHMsIGFuIGV4cHJlc3Npb24gaXMgY29tcHV0ZWQgYXMgMzIgYml0cy4gIEluIHRoaXMgY2FzZQotQGNvZGV7UVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHplcm8gZXh0ZW5kZWQgdG8gNjQgYml0cywgYW5kCi1AY29kZXtTUVVBRH0gc3RvcmVzIGEgMzIgYml0IHZhbHVlIHNpZ24gZXh0ZW5kZWQgdG8gNjQgYml0cy4KLQotSWYgdGhlIG9iamVjdCBmaWxlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IGZpbGUgaGFzIGFuIGV4cGxpY2l0IGVuZGlhbm5lc3MsCi13aGljaCBpcyB0aGUgbm9ybWFsIGNhc2UsIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZCBpbiB0aGF0IGVuZGlhbm5lc3MuCi1XaGVuIHRoZSBvYmplY3QgZmlsZSBmb3JtYXQgZG9lcyBub3QgaGF2ZSBhbiBleHBsaWNpdCBlbmRpYW5uZXNzLCBhcyBpcwotdHJ1ZSBvZiwgZm9yIGV4YW1wbGUsIFMtcmVjb3JkcywgdGhlIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZQotZW5kaWFubmVzcyBvZiB0aGUgZmlyc3QgaW5wdXQgb2JqZWN0IGZpbGUuCi0KLUBraW5kZXggRklMTChAdmFye2V4cHJlc3Npb259KQotQGNpbmRleCBob2xlcywgZmlsbGluZwotQGNpbmRleCB1bnNwZWNpZmllZCBtZW1vcnkKLVlvdSBtYXkgdXNlIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kIHRvIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciB0aGUKLWN1cnJlbnQgc2VjdGlvbi4gIEl0IGlzIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gaW4gcGFyZW50aGVzZXMuICBBbnkKLW90aGVyd2lzZSB1bnNwZWNpZmllZCByZWdpb25zIG9mIG1lbW9yeSB3aXRoaW4gdGhlIHNlY3Rpb24gKGZvciBleGFtcGxlLAotZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIGlucHV0IHNlY3Rpb25zKSBhcmUgZmlsbGVkCi13aXRoIHRoZSB0d28gbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZXMgb2YgdGhlIGV4cHJlc3Npb24sIHJlcGVhdGVkIGFzCi1uZWNlc3NhcnkuICBBIEBjb2Rle0ZJTEx9IHN0YXRlbWVudCBjb3ZlcnMgbWVtb3J5IGxvY2F0aW9ucyBhZnRlciB0aGUKLXBvaW50IGF0IHdoaWNoIGl0IG9jY3VycyBpbiB0aGUgc2VjdGlvbiBkZWZpbml0aW9uOyBieSBpbmNsdWRpbmcgbW9yZQotdGhhbiBvbmUgQGNvZGV7RklMTH0gc3RhdGVtZW50LCB5b3UgY2FuIGhhdmUgZGlmZmVyZW50IGZpbGwgcGF0dGVybnMgaW4KLWRpZmZlcmVudCBwYXJ0cyBvZiBhbiBvdXRwdXQgc2VjdGlvbi4KLQotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBmaWxsIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5IHdpdGggdGhlCi12YWx1ZSBAc2FtcHsweDkwOTB9OgotQHNtYWxsZXhhbXBsZQotRklMTCgweDkwOTApCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1UaGUgQGNvZGV7RklMTH0gY29tbWFuZCBpcyBzaW1pbGFyIHRvIHRoZSBAc2FtcHs9QHZhcntmaWxsZXhwfX0gb3V0cHV0Ci1zZWN0aW9uIGF0dHJpYnV0ZSAoQHB4cmVme091dHB1dCBTZWN0aW9uIEZpbGx9KSwgYnV0IGl0IG9ubHkgYWZmZWN0cyB0aGUKLXBhcnQgb2YgdGhlIHNlY3Rpb24gZm9sbG93aW5nIHRoZSBAY29kZXtGSUxMfSBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKLWVudGlyZSBzZWN0aW9uLiAgSWYgYm90aCBhcmUgdXNlZCwgdGhlIEBjb2Rle0ZJTEx9IGNvbW1hbmQgdGFrZXMKLXByZWNlZGVuY2UuCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIEtleXdvcmRzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBrZXl3b3JkcwotVGhlcmUgYXJlIGEgY291cGxlIG9mIGtleXdvcmRzIHdoaWNoIGNhbiBhcHBlYXIgYXMgb3V0cHV0IHNlY3Rpb24KLWNvbW1hbmRzLgotCi1AdGFibGUgQGNvZGUKLUBraW5kZXggQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi1AY2luZGV4IGlucHV0IGZpbGVuYW1lIHN5bWJvbHMKLUBjaW5kZXggZmlsZW5hbWUgc3ltYm9scwotQGl0ZW0gQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi1UaGUgY29tbWFuZCB0ZWxscyB0aGUgbGlua2VyIHRvIGNyZWF0ZSBhIHN5bWJvbCBmb3IgZWFjaCBpbnB1dCBmaWxlLgotVGhlIG5hbWUgb2YgZWFjaCBzeW1ib2wgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnB1dAotZmlsZS4gIFRoZSBzZWN0aW9uIG9mIGVhY2ggc3ltYm9sIHdpbGwgYmUgdGhlIG91dHB1dCBzZWN0aW9uIGluIHdoaWNoCi10aGUgQGNvZGV7Q1JFQVRFX09CSkVDVF9TWU1CT0xTfSBjb21tYW5kIGFwcGVhcnMuCi0KLVRoaXMgaXMgY29udmVudGlvbmFsIGZvciB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LiAgSXQgaXMgbm90Ci1ub3JtYWxseSB1c2VkIGZvciBhbnkgb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0LgotCi1Aa2luZGV4IENPTlNUUlVDVE9SUwotQGNpbmRleCBDKysgY29uc3RydWN0b3JzLCBhcnJhbmdpbmcgaW4gbGluawotQGNpbmRleCBjb25zdHJ1Y3RvcnMsIGFycmFuZ2luZyBpbiBsaW5rCi1AaXRlbSBDT05TVFJVQ1RPUlMKLVdoZW4gbGlua2luZyB1c2luZyB0aGUgYS5vdXQgb2JqZWN0IGZpbGUgZm9ybWF0LCB0aGUgbGlua2VyIHVzZXMgYW4KLXVudXN1YWwgc2V0IGNvbnN0cnVjdCB0byBzdXBwb3J0IEMrKyBnbG9iYWwgY29uc3RydWN0b3JzIGFuZAotZGVzdHJ1Y3RvcnMuICBXaGVuIGxpbmtpbmcgb2JqZWN0IGZpbGUgZm9ybWF0cyB3aGljaCBkbyBub3Qgc3VwcG9ydAotYXJiaXRyYXJ5IHNlY3Rpb25zLCBzdWNoIGFzIEVDT0ZGIGFuZCBYQ09GRiwgdGhlIGxpbmtlciB3aWxsCi1hdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBDKysgZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYnkgbmFtZS4KLUZvciB0aGVzZSBvYmplY3QgZmlsZSBmb3JtYXRzLCB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfSBjb21tYW5kIHRlbGxzIHRoZQotbGlua2VyIHRvIHBsYWNlIGNvbnN0cnVjdG9yIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgc2VjdGlvbiB3aGVyZSB0aGUKLUBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBhcHBlYXJzLiAgVGhlIEBjb2Rle0NPTlNUUlVDVE9SU30gY29tbWFuZCBpcwotaWdub3JlZCBmb3Igb3RoZXIgb2JqZWN0IGZpbGUgZm9ybWF0cy4KLQotVGhlIHN5bWJvbCBAd3tAY29kZXtfX0NUT1JfTElTVF9ffX0gbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBnbG9iYWwKLWNvbnN0cnVjdG9ycywgYW5kIHRoZSBzeW1ib2wgQHd7QGNvZGV7X19EVE9SX0xJU1R9fSBtYXJrcyB0aGUgZW5kLiAgVGhlCi1maXJzdCB3b3JkIGluIHRoZSBsaXN0IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcywgZm9sbG93ZWQgYnkgdGhlIGFkZHJlc3MKLW9mIGVhY2ggY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciwgZm9sbG93ZWQgYnkgYSB6ZXJvIHdvcmQuICBUaGUKLWNvbXBpbGVyIG11c3QgYXJyYW5nZSB0byBhY3R1YWxseSBydW4gdGhlIGNvZGUuICBGb3IgdGhlc2Ugb2JqZWN0IGZpbGUKLWZvcm1hdHMgQHNje2dudX0gQysrIG5vcm1hbGx5IGNhbGxzIGNvbnN0cnVjdG9ycyBmcm9tIGEgc3Vicm91dGluZQotQGNvZGV7X19tYWlufTsgYSBjYWxsIHRvIEBjb2Rle19fbWFpbn0gaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvCi10aGUgc3RhcnR1cCBjb2RlIGZvciBAY29kZXttYWlufS4gIEBzY3tnbnV9IEMrKyBub3JtYWxseSBydW5zCi1kZXN0cnVjdG9ycyBlaXRoZXIgYnkgdXNpbmcgQGNvZGV7YXRleGl0fSwgb3IgZGlyZWN0bHkgZnJvbSB0aGUgZnVuY3Rpb24KLUBjb2Rle2V4aXR9LgotCi1Gb3Igb2JqZWN0IGZpbGUgZm9ybWF0cyBzdWNoIGFzIEBjb2Rle0NPRkZ9IG9yIEBjb2Rle0VMRn0gd2hpY2ggc3VwcG9ydAotYXJiaXRyYXJ5IHNlY3Rpb24gbmFtZXMsIEBzY3tnbnV9IEMrKyB3aWxsIG5vcm1hbGx5IGFycmFuZ2UgdG8gcHV0IHRoZQotYWRkcmVzc2VzIG9mIGdsb2JhbCBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGludG8gdGhlIEBjb2Rley5jdG9yc30KLWFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLiAgUGxhY2luZyB0aGUgZm9sbG93aW5nIHNlcXVlbmNlIGludG8geW91cgotbGlua2VyIHNjcmlwdCB3aWxsIGJ1aWxkIHRoZSBzb3J0IG9mIHRhYmxlIHdoaWNoIHRoZSBAc2N7Z251fSBDKysKLXJ1bnRpbWUgY29kZSBleHBlY3RzIHRvIHNlZS4KLQotQHNtYWxsZXhhbXBsZQotICAgICAgX19DVE9SX0xJU1RfXyA9IC47Ci0gICAgICBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKQotICAgICAgKiguY3RvcnMpCi0gICAgICBMT05HKDApCi0gICAgICBfX0NUT1JfRU5EX18gPSAuOwotICAgICAgX19EVE9SX0xJU1RfXyA9IC47Ci0gICAgICBMT05HKChfX0RUT1JfRU5EX18gLSBfX0RUT1JfTElTVF9fKSAvIDQgLSAyKQotICAgICAgKiguZHRvcnMpCi0gICAgICBMT05HKDApCi0gICAgICBfX0RUT1JfRU5EX18gPSAuOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotSWYgeW91IGFyZSB1c2luZyB0aGUgQHNje2dudX0gQysrIHN1cHBvcnQgZm9yIGluaXRpYWxpemF0aW9uIHByaW9yaXR5LAotd2hpY2ggcHJvdmlkZXMgc29tZSBjb250cm9sIG92ZXIgdGhlIG9yZGVyIGluIHdoaWNoIGdsb2JhbCBjb25zdHJ1Y3RvcnMKLWFyZSBydW4sIHlvdSBtdXN0IHNvcnQgdGhlIGNvbnN0cnVjdG9ycyBhdCBsaW5rIHRpbWUgdG8gZW5zdXJlIHRoYXQgdGhleQotYXJlIGV4ZWN1dGVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiAgV2hlbiB1c2luZyB0aGUgQGNvZGV7Q09OU1RSVUNUT1JTfQotY29tbWFuZCwgdXNlIEBzYW1we1NPUlQoQ09OU1RSVUNUT1JTKX0gaW5zdGVhZC4gIFdoZW4gdXNpbmcgdGhlCi1AY29kZXsuY3RvcnN9IGFuZCBAY29kZXsuZHRvcnN9IHNlY3Rpb25zLCB1c2UgQHNhbXB7KihTT1JUKC5jdG9ycykpfSBhbmQKLUBzYW1weyooU09SVCguZHRvcnMpKX0gaW5zdGVhZCBvZiBqdXN0IEBzYW1weyooLmN0b3JzKX0gYW5kCi1Ac2FtcHsqKC5kdG9ycyl9LgotCi1Ob3JtYWxseSB0aGUgY29tcGlsZXIgYW5kIGxpbmtlciB3aWxsIGhhbmRsZSB0aGVzZSBpc3N1ZXMgYXV0b21hdGljYWxseSwKLWFuZCB5b3Ugd2lsbCBub3QgbmVlZCB0byBjb25jZXJuIHlvdXJzZWxmIHdpdGggdGhlbS4gIEhvd2V2ZXIsIHlvdSBtYXkKLW5lZWQgdG8gY29uc2lkZXIgdGhpcyBpZiB5b3UgYXJlIHVzaW5nIEMrKyBhbmQgd3JpdGluZyB5b3VyIG93biBsaW5rZXIKLXNjcmlwdHMuCi0KLUBlbmQgdGFibGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRGlzY2FyZGluZwotQHN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZGlzY2FyZGluZwotQGNpbmRleCBkaXNjYXJkaW5nIHNlY3Rpb25zCi1AY2luZGV4IHNlY3Rpb25zLCBkaXNjYXJkaW5nCi1AY2luZGV4IHJlbW92aW5nIHNlY3Rpb25zCi1UaGUgbGlua2VyIHdpbGwgbm90IGNyZWF0ZSBvdXRwdXQgc2VjdGlvbiB3aGljaCBkbyBub3QgaGF2ZSBhbnkKLWNvbnRlbnRzLiAgVGhpcyBpcyBmb3IgY29udmVuaWVuY2Ugd2hlbiByZWZlcnJpbmcgdG8gaW5wdXQgc2VjdGlvbnMgdGhhdAotbWF5IG9yIG1heSBub3QgYmUgcHJlc2VudCBpbiBhbnkgb2YgdGhlIGlucHV0IGZpbGVzLiAgRm9yIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0uZm9vIEB7ICooLmZvbykgQH0KLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgb25seSBjcmVhdGUgYSBAc2FtcHsuZm9vfSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSBpZiB0aGVyZSBpcyBhCi1Ac2FtcHsuZm9vfSBzZWN0aW9uIGluIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlLgotCi1JZiB5b3UgdXNlIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gaW5wdXQgc2VjdGlvbiBkZXNjcmlwdGlvbiBhcyBhbiBvdXRwdXQKLXNlY3Rpb24gY29tbWFuZCwgc3VjaCBhcyBhIHN5bWJvbCBhc3NpZ25tZW50LCB0aGVuIHRoZSBvdXRwdXQgc2VjdGlvbgotd2lsbCBhbHdheXMgYmUgY3JlYXRlZCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgaW5wdXQgc2VjdGlvbnMuCi0KLUBjaW5kZXggL0RJU0NBUkQvCi1UaGUgc3BlY2lhbCBvdXRwdXQgc2VjdGlvbiBuYW1lIEBzYW1wey9ESVNDQVJEL30gbWF5IGJlIHVzZWQgdG8gZGlzY2FyZAotaW5wdXQgc2VjdGlvbnMuICBBbnkgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGFuIG91dHB1dAotc2VjdGlvbiBuYW1lZCBAc2FtcHsvRElTQ0FSRC99IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLgotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBBdHRyaWJ1dGVzCi1Ac3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBhdHRyaWJ1dGVzCi1AY2luZGV4IG91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZXMKLVdlIHNob3dlZCBhYm92ZSB0aGF0IHRoZSBmdWxsIGRlc2NyaXB0aW9uIG9mIGFuIG91dHB1dCBzZWN0aW9uIGxvb2tlZAotbGlrZSB0aGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwIAotQHZhcntzZWN0aW9ufSBbQHZhcnthZGRyZXNzfV0gWyhAdmFye3R5cGV9KV0gOiBbQVQoQHZhcntsbWF9KV0KLSAgQHsKLSAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgQHZhcntvdXRwdXQtc2VjdGlvbi1jb21tYW5kfQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfSA6QHZhcntwaGRyfSBAZG90c3t9XSBbPUB2YXJ7ZmlsbGV4cH1dCi1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotV2UndmUgYWxyZWFkeSBkZXNjcmliZWQgQHZhcntzZWN0aW9ufSwgQHZhcnthZGRyZXNzfSwgYW5kCi1AdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9LiAgSW4gdGhpcyBzZWN0aW9uIHdlIHdpbGwgZGVzY3JpYmUgdGhlCi1yZW1haW5pbmcgc2VjdGlvbiBhdHRyaWJ1dGVzLgotCi1AbWVudSAKLSogT3V0cHV0IFNlY3Rpb24gVHlwZTo6CQlPdXRwdXQgc2VjdGlvbiB0eXBlCi0qIE91dHB1dCBTZWN0aW9uIExNQTo6CQlPdXRwdXQgc2VjdGlvbiBMTUEKLSogT3V0cHV0IFNlY3Rpb24gUmVnaW9uOjoJT3V0cHV0IHNlY3Rpb24gcmVnaW9uCi0qIE91dHB1dCBTZWN0aW9uIFBoZHI6OgkJT3V0cHV0IHNlY3Rpb24gcGhkcgotKiBPdXRwdXQgU2VjdGlvbiBGaWxsOjoJCU91dHB1dCBzZWN0aW9uIGZpbGwKLUBlbmQgbWVudQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBUeXBlCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiB0eXBlCi1FYWNoIG91dHB1dCBzZWN0aW9uIG1heSBoYXZlIGEgdHlwZS4gIFRoZSB0eXBlIGlzIGEga2V5d29yZCBpbgotcGFyZW50aGVzZXMuICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBkZWZpbmVkOgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIE5PTE9BRAotVGhlIHNlY3Rpb24gc2hvdWxkIGJlIG1hcmtlZCBhcyBub3QgbG9hZGFibGUsIHNvIHRoYXQgaXQgd2lsbCBub3QgYmUKLWxvYWRlZCBpbnRvIG1lbW9yeSB3aGVuIHRoZSBwcm9ncmFtIGlzIHJ1bi4KLUBpdGVtIERTRUNUCi1AaXRlbXggQ09QWQotQGl0ZW14IElORk8KLUBpdGVteCBPVkVSTEFZCi1UaGVzZSB0eXBlIG5hbWVzIGFyZSBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGFuZCBhcmUKLXJhcmVseSB1c2VkLiAgVGhleSBhbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3Q6IHRoZSBzZWN0aW9uIHNob3VsZCBiZQotbWFya2VkIGFzIG5vdCBhbGxvY2F0YWJsZSwgc28gdGhhdCBubyBtZW1vcnkgaXMgYWxsb2NhdGVkIGZvciB0aGUKLXNlY3Rpb24gd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4uCi1AZW5kIHRhYmxlCi0KLUBraW5kZXggTk9MT0FECi1AY2luZGV4IHByZXZlbnQgdW5uZWNlc3NhcnkgbG9hZGluZwotQGNpbmRleCBsb2FkaW5nLCBwcmV2ZW50aW5nCi1UaGUgbGlua2VyIG5vcm1hbGx5IHNldHMgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gb3V0cHV0IHNlY3Rpb24gYmFzZWQgb24KLXRoZSBpbnB1dCBzZWN0aW9ucyB3aGljaCBtYXAgaW50byBpdC4gIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieSB1c2luZwotdGhlIHNlY3Rpb24gdHlwZS4gIEZvciBleGFtcGxlLCBpbiB0aGUgc2NyaXB0IHNhbXBsZSBiZWxvdywgdGhlCi1Ac2FtcHtST019IHNlY3Rpb24gaXMgYWRkcmVzc2VkIGF0IG1lbW9yeSBsb2NhdGlvbiBAc2FtcHswfSBhbmQgZG9lcyBub3QKLW5lZWQgdG8gYmUgbG9hZGVkIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLiAgVGhlIGNvbnRlbnRzIG9mIHRoZQotQHNhbXB7Uk9NfSBzZWN0aW9uIHdpbGwgYXBwZWFyIGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUgYXMgdXN1YWwuCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7Ci0gIFJPTSAwIChOT0xPQUQpIDogQHsgQGRvdHN7fSBAfQotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gTE1BCi1Ac3Vic3Vic2VjdGlvbiBPdXRwdXQgc2VjdGlvbiBMTUEKLUBraW5kZXggQVQoQHZhcntsbWF9KQotQGNpbmRleCBsb2FkIGFkZHJlc3MKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MKLUV2ZXJ5IHNlY3Rpb24gaGFzIGEgdmlydHVhbCBhZGRyZXNzIChWTUEpIGFuZCBhIGxvYWQgYWRkcmVzcyAoTE1BKTsgc2VlCi1AcmVme0Jhc2ljIFNjcmlwdCBDb25jZXB0c30uICBUaGUgYWRkcmVzcyBleHByZXNzaW9uIHdoaWNoIG1heSBhcHBlYXIgaW4KLWFuIG91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uIHNldHMgdGhlIFZNQSAoQHB4cmVme091dHB1dCBTZWN0aW9uCi1BZGRyZXNzfSkuCi0KLVRoZSBsaW5rZXIgd2lsbCBub3JtYWxseSBzZXQgdGhlIExNQSBlcXVhbCB0byB0aGUgVk1BLiAgWW91IGNhbiBjaGFuZ2UKLXRoYXQgYnkgdXNpbmcgdGhlIEBjb2Rle0FUfSBrZXl3b3JkLiAgVGhlIGV4cHJlc3Npb24gQHZhcntsbWF9IHRoYXQKLWZvbGxvd3MgdGhlIEBjb2Rle0FUfSBrZXl3b3JkIHNwZWNpZmllcyB0aGUgbG9hZCBhZGRyZXNzIG9mIHRoZSBzZWN0aW9uLgotCi1AY2luZGV4IFJPTSBpbml0aWFsaXplZCBkYXRhCi1AY2luZGV4IGluaXRpYWxpemVkIGRhdGEgaW4gUk9NCi1UaGlzIGZlYXR1cmUgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBlYXN5IHRvIGJ1aWxkIGEgUk9NIGltYWdlLiAgRm9yCi1leGFtcGxlLCB0aGUgZm9sbG93aW5nIGxpbmtlciBzY3JpcHQgY3JlYXRlcyB0aHJlZSBvdXRwdXQgc2VjdGlvbnM6IG9uZQotY2FsbGVkIEBzYW1wey50ZXh0fSwgd2hpY2ggc3RhcnRzIGF0IEBjb2RlezB4MTAwMH0sIG9uZSBjYWxsZWQKLUBzYW1wey5tZGF0YX0sIHdoaWNoIGlzIGxvYWRlZCBhdCB0aGUgZW5kIG9mIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbgotZXZlbiB0aG91Z2ggaXRzIFZNQSBpcyBAY29kZXsweDIwMDB9LCBhbmQgb25lIGNhbGxlZCBAc2FtcHsuYnNzfSB0byBob2xkCi11bmluaXRpYWxpemVkIGRhdGEgYXQgYWRkcmVzcyBAY29kZXsweDMwMDB9LiAgVGhlIHN5bWJvbCBAY29kZXtfZGF0YX0gaXMKLWRlZmluZWQgd2l0aCB0aGUgdmFsdWUgQGNvZGV7MHgyMDAwfSwgd2hpY2ggc2hvd3MgdGhhdCB0aGUgbG9jYXRpb24KLWNvdW50ZXIgaG9sZHMgdGhlIFZNQSB2YWx1ZSwgbm90IHRoZSBMTUEgdmFsdWUuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgLnRleHQgMHgxMDAwIDogQHsgKigudGV4dCkgX2V0ZXh0ID0gLiA7IEB9Ci0gIC5tZGF0YSAweDIwMDAgOiAKLSAgICBBVCAoIEFERFIgKC50ZXh0KSArIFNJWkVPRiAoLnRleHQpICkKLSAgICBAeyBfZGF0YSA9IC4gOyAqKC5kYXRhKTsgX2VkYXRhID0gLiA7ICBAfQotICAuYnNzIDB4MzAwMCA6Ci0gICAgQHsgX2JzdGFydCA9IC4gOyAgKiguYnNzKSAqKENPTU1PTikgOyBfYmVuZCA9IC4gO0B9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIHJ1bi10aW1lIGluaXRpYWxpemF0aW9uIGNvZGUgZm9yIHVzZSB3aXRoIGEgcHJvZ3JhbSBnZW5lcmF0ZWQgd2l0aAotdGhpcyBsaW5rZXIgc2NyaXB0IHdvdWxkIGluY2x1ZGUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgdG8gY29weQotdGhlIGluaXRpYWxpemVkIGRhdGEgZnJvbSB0aGUgUk9NIGltYWdlIHRvIGl0cyBydW50aW1lIGFkZHJlc3MuICBOb3RpY2UKLWhvdyB0aGlzIGNvZGUgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBzeW1ib2xzIGRlZmluZWQgYnkgdGhlIGxpbmtlcgotc2NyaXB0LgotCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLWV4dGVybiBjaGFyIF9ldGV4dCwgX2RhdGEsIF9lZGF0YSwgX2JzdGFydCwgX2JlbmQ7Ci1jaGFyICpzcmMgPSAmX2V0ZXh0OwotY2hhciAqZHN0ID0gJl9kYXRhOwotCi0vKiBST00gaGFzIGRhdGEgYXQgZW5kIG9mIHRleHQ7IGNvcHkgaXQuICovCi13aGlsZSAoZHN0IDwgJl9lZGF0YSkgQHsKLSAgKmRzdCsrID0gKnNyYysrOwotQH0KLQotLyogWmVybyBic3MgKi8KLWZvciAoZHN0ID0gJl9ic3RhcnQ7IGRzdDwgJl9iZW5kOyBkc3QrKykKLSAgKmRzdCA9IDA7Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1Abm9kZSBPdXRwdXQgU2VjdGlvbiBSZWdpb24KLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHJlZ2lvbgotQGtpbmRleCA+QHZhcntyZWdpb259Ci1AY2luZGV4IHNlY3Rpb24sIGFzc2lnbmluZyB0byBtZW1vcnkgcmVnaW9uCi1AY2luZGV4IG1lbW9yeSByZWdpb25zIGFuZCBzZWN0aW9ucwotWW91IGNhbiBhc3NpZ24gYSBzZWN0aW9uIHRvIGEgcHJldmlvdXNseSBkZWZpbmVkIHJlZ2lvbiBvZiBtZW1vcnkgYnkKLXVzaW5nIEBzYW1wez5AdmFye3JlZ2lvbn19LiAgQHhyZWZ7TUVNT1JZfS4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgQHsgcm9tIDogT1JJR0lOID0gMHgxMDAwLCBMRU5HVEggPSAweDEwMDAgQH0KLVNFQ1RJT05TIEB7IFJPTSA6IEB7ICooLnRleHQpIEB9ID5yb20gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE91dHB1dCBTZWN0aW9uIFBoZHIKLUBzdWJzdWJzZWN0aW9uIE91dHB1dCBzZWN0aW9uIHBoZHIKLUBraW5kZXggOkB2YXJ7cGhkcn0KLUBjaW5kZXggc2VjdGlvbiwgYXNzaWduaW5nIHRvIHByb2dyYW0gaGVhZGVyCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycyBhbmQgc2VjdGlvbnMKLVlvdSBjYW4gYXNzaWduIGEgc2VjdGlvbiB0byBhIHByZXZpb3VzbHkgZGVmaW5lZCBwcm9ncmFtIHNlZ21lbnQgYnkKLXVzaW5nIEBzYW1wezpAdmFye3BoZHJ9fS4gIEB4cmVme1BIRFJTfS4gIElmIGEgc2VjdGlvbiBpcyBhc3NpZ25lZCB0bwotb25lIG9yIG1vcmUgc2VnbWVudHMsIHRoZW4gYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGVkIHNlY3Rpb25zIHdpbGwgYmUKLWFzc2lnbmVkIHRvIHRob3NlIHNlZ21lbnRzIGFzIHdlbGwsIHVubGVzcyB0aGV5IHVzZSBhbiBleHBsaWNpdGx5Ci1AY29kZXs6QHZhcntwaGRyfX0gbW9kaWZpZXIuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gdGVsbCB0aGUKLWxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueSBzZWdtZW50IGF0IGFsbC4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1QSERSUyBAeyB0ZXh0IFBUX0xPQUQgOyBAfQotU0VDVElPTlMgQHsgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dCBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vZGUgT3V0cHV0IFNlY3Rpb24gRmlsbAotQHN1YnN1YnNlY3Rpb24gT3V0cHV0IHNlY3Rpb24gZmlsbAotQGtpbmRleCA9QHZhcntmaWxsZXhwfQotQGNpbmRleCBzZWN0aW9uIGZpbGwgcGF0dGVybgotQGNpbmRleCBmaWxsIHBhdHRlcm4sIGVudGlyZSBzZWN0aW9uCi1Zb3UgY2FuIHNldCB0aGUgZmlsbCBwYXR0ZXJuIGZvciBhbiBlbnRpcmUgc2VjdGlvbiBieSB1c2luZwotQHNhbXB7PUB2YXJ7ZmlsbGV4cH19LiAgQHZhcntmaWxsZXhwfSBpcyBhbiBleHByZXNzaW9uCi0oQHB4cmVme0V4cHJlc3Npb25zfSkuICBBbnkgb3RoZXJ3aXNlIHVuc3BlY2lmaWVkIHJlZ2lvbnMgb2YgbWVtb3J5Ci13aXRoaW4gdGhlIG91dHB1dCBzZWN0aW9uIChmb3IgZXhhbXBsZSwgZ2FwcyBsZWZ0IGR1ZSB0byB0aGUgcmVxdWlyZWQKLWFsaWdubWVudCBvZiBpbnB1dCBzZWN0aW9ucykgd2lsbCBiZSBmaWxsZWQgd2l0aCB0aGUgdHdvIGxlYXN0Ci1zaWduaWZpY2FudCBieXRlcyBvZiB0aGUgdmFsdWUsIHJlcGVhdGVkIGFzIG5lY2Vzc2FyeS4KLQotWW91IGNhbiBhbHNvIGNoYW5nZSB0aGUgZmlsbCB2YWx1ZSB3aXRoIGEgQGNvZGV7RklMTH0gY29tbWFuZCBpbiB0aGUKLW91dHB1dCBzZWN0aW9uIGNvbW1hbmRzOyBzZWUgQHJlZntPdXRwdXQgU2VjdGlvbiBEYXRhfS4KLQotSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1TRUNUSU9OUyBAeyAudGV4dCA6IEB7ICooLnRleHQpIEB9ID0weDkwOTAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE92ZXJsYXkgRGVzY3JpcHRpb24KLUBzdWJzZWN0aW9uIE92ZXJsYXkgZGVzY3JpcHRpb24KLUBraW5kZXggT1ZFUkxBWQotQGNpbmRleCBvdmVybGF5cwotQW4gb3ZlcmxheSBkZXNjcmlwdGlvbiBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBkZXNjcmliZSBzZWN0aW9ucyB3aGljaAotYXJlIHRvIGJlIGxvYWRlZCBhcyBwYXJ0IG9mIGEgc2luZ2xlIG1lbW9yeSBpbWFnZSBidXQgYXJlIHRvIGJlIHJ1biBhdAotdGhlIHNhbWUgbWVtb3J5IGFkZHJlc3MuICBBdCBydW4gdGltZSwgc29tZSBzb3J0IG9mIG92ZXJsYXkgbWFuYWdlciB3aWxsCi1jb3B5IHRoZSBvdmVybGFpZCBzZWN0aW9ucyBpbiBhbmQgb3V0IG9mIHRoZSBydW50aW1lIG1lbW9yeSBhZGRyZXNzIGFzCi1yZXF1aXJlZCwgcGVyaGFwcyBieSBzaW1wbHkgbWFuaXB1bGF0aW5nIGFkZHJlc3NpbmcgYml0cy4gIFRoaXMgYXBwcm9hY2gKLWNhbiBiZSB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIGEgY2VydGFpbiByZWdpb24gb2YgbWVtb3J5IGlzIGZhc3RlcgotdGhhbiBhbm90aGVyLgotCi1PdmVybGF5cyBhcmUgZGVzY3JpYmVkIHVzaW5nIHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kLiAgVGhlCi1AY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIHVzZWQgd2l0aGluIGEgQGNvZGV7U0VDVElPTlN9IGNvbW1hbmQsIGxpa2UgYW4KLW91dHB1dCBzZWN0aW9uIGRlc2NyaXB0aW9uLiAgVGhlIGZ1bGwgc3ludGF4IG9mIHRoZSBAY29kZXtPVkVSTEFZfQotY29tbWFuZCBpcyBhcyBmb2xsb3dzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1PVkVSTEFZIFtAdmFye3N0YXJ0fV0gOiBbTk9DUk9TU1JFRlNdIFtBVCAoIEB2YXJ7bGRhZGRyfSApXQotICBAewotICAgIEB2YXJ7c2VjbmFtZTF9Ci0gICAgICBAewotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQGRvdHN7fQotICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotICAgIEB2YXJ7c2VjbmFtZTJ9Ci0gICAgICBAewotICAgICAgICBAdmFye291dHB1dC1zZWN0aW9uLWNvbW1hbmR9Ci0gICAgICAgIEB2YXJ7b3V0cHV0LXNlY3Rpb24tY29tbWFuZH0KLSAgICAgICAgQGRvdHN7fQotICAgICAgQH0gWzpAdmFye3BoZHJ9QGRvdHN7fV0gWz1AdmFye2ZpbGx9XQotICAgIEBkb3Rze30KLSAgQH0gWz5AdmFye3JlZ2lvbn1dIFs6QHZhcntwaGRyfUBkb3Rze31dIFs9QHZhcntmaWxsfV0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUV2ZXJ5dGhpbmcgaXMgb3B0aW9uYWwgZXhjZXB0IEBjb2Rle09WRVJMQVl9IChhIGtleXdvcmQpLCBhbmQgZWFjaAotc2VjdGlvbiBtdXN0IGhhdmUgYSBuYW1lIChAdmFye3NlY25hbWUxfSBhbmQgQHZhcntzZWNuYW1lMn0gYWJvdmUpLiAgVGhlCi1zZWN0aW9uIGRlZmluaXRpb25zIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0gY29uc3RydWN0IGFyZSBpZGVudGljYWwgdG8KLXRob3NlIHdpdGhpbiB0aGUgZ2VuZXJhbCBAY29kZXtTRUNUSU9OU30gY29udHJ1Y3QgKEBweHJlZntTRUNUSU9OU30pLAotZXhjZXB0IHRoYXQgbm8gYWRkcmVzc2VzIGFuZCBubyBtZW1vcnkgcmVnaW9ucyBtYXkgYmUgZGVmaW5lZCBmb3IKLXNlY3Rpb25zIHdpdGhpbiBhbiBAY29kZXtPVkVSTEFZfS4KLQotVGhlIHNlY3Rpb25zIGFyZSBhbGwgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIHN0YXJ0aW5nIGFkZHJlc3MuICBUaGUgbG9hZAotYWRkcmVzc2VzIG9mIHRoZSBzZWN0aW9ucyBhcmUgYXJyYW5nZWQgc3VjaCB0aGF0IHRoZXkgYXJlIGNvbnNlY3V0aXZlIGluCi1tZW1vcnkgc3RhcnRpbmcgYXQgdGhlIGxvYWQgYWRkcmVzcyB1c2VkIGZvciB0aGUgQGNvZGV7T1ZFUkxBWX0gYXMgYQotd2hvbGUgKGFzIHdpdGggbm9ybWFsIHNlY3Rpb24gZGVmaW5pdGlvbnMsIHRoZSBsb2FkIGFkZHJlc3MgaXMgb3B0aW9uYWwsCi1hbmQgZGVmYXVsdHMgdG8gdGhlIHN0YXJ0IGFkZHJlc3M7IHRoZSBzdGFydCBhZGRyZXNzIGlzIGFsc28gb3B0aW9uYWwsCi1hbmQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIpLgotCi1JZiB0aGUgQGNvZGV7Tk9DUk9TU1JFRlN9IGtleXdvcmQgaXMgdXNlZCwgYW5kIHRoZXJlIGFueSByZWZlcmVuY2VzCi1hbW9uZyB0aGUgc2VjdGlvbnMsIHRoZSBsaW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuICBTaW5jZSB0aGUgc2VjdGlvbnMKLWFsbCBydW4gYXQgdGhlIHNhbWUgYWRkcmVzcywgaXQgbm9ybWFsbHkgZG9lcyBub3QgbWFrZSBzZW5zZSBmb3Igb25lCi1zZWN0aW9uIHRvIHJlZmVyIGRpcmVjdGx5IHRvIGFub3RoZXIuICBAeHJlZntNaXNjZWxsYW5lb3VzIENvbW1hbmRzLAotTk9DUk9TU1JFRlN9LgotCi1Gb3IgZWFjaCBzZWN0aW9uIHdpdGhpbiB0aGUgQGNvZGV7T1ZFUkxBWX0sIHRoZSBsaW5rZXIgYXV0b21hdGljYWxseQotZGVmaW5lcyB0d28gc3ltYm9scy4gIFRoZSBzeW1ib2wgQGNvZGV7X19sb2FkX3N0YXJ0X0B2YXJ7c2VjbmFtZX19IGlzCi1kZWZpbmVkIGFzIHRoZSBzdGFydGluZyBsb2FkIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24uICBUaGUgc3ltYm9sCi1AY29kZXtfX2xvYWRfc3RvcF9AdmFye3NlY25hbWV9fSBpcyBkZWZpbmVkIGFzIHRoZSBmaW5hbCBsb2FkIGFkZHJlc3Mgb2YKLXRoZSBzZWN0aW9uLiAgQW55IGNoYXJhY3RlcnMgd2l0aGluIEB2YXJ7c2VjbmFtZX0gd2hpY2ggYXJlIG5vdCBsZWdhbAotd2l0aGluIEMgaWRlbnRpZmllcnMgYXJlIHJlbW92ZWQuICBDIChvciBhc3NlbWJsZXIpIGNvZGUgbWF5IHVzZSB0aGVzZQotc3ltYm9scyB0byBtb3ZlIHRoZSBvdmVybGFpZCBzZWN0aW9ucyBhcm91bmQgYXMgbmVjZXNzYXJ5LgotCi1BdCB0aGUgZW5kIG9mIHRoZSBvdmVybGF5LCB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXIgaXMgc2V0IHRvCi10aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgb3ZlcmxheSBwbHVzIHRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IHNlY3Rpb24uCi0KLUhlcmUgaXMgYW4gZXhhbXBsZS4gIFJlbWVtYmVyIHRoYXQgdGhpcyB3b3VsZCBhcHBlYXIgaW5zaWRlIGEKLUBjb2Rle1NFQ1RJT05TfSBjb25zdHJ1Y3QuCi1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLSAgT1ZFUkxBWSAweDEwMDAgOiBBVCAoMHg0MDAwKQotICAgQHsKLSAgICAgLnRleHQwIEB7IG8xLyoubygudGV4dCkgQH0KLSAgICAgLnRleHQxIEB7IG8yLyoubygudGV4dCkgQH0KLSAgIEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1UaGlzIHdpbGwgZGVmaW5lIGJvdGggQHNhbXB7LnRleHQwfSBhbmQgQHNhbXB7LnRleHQxfSB0byBzdGFydCBhdAotYWRkcmVzcyAweDEwMDAuICBAc2FtcHsudGV4dDB9IHdpbGwgYmUgbG9hZGVkIGF0IGFkZHJlc3MgMHg0MDAwLCBhbmQKLUBzYW1wey50ZXh0MX0gd2lsbCBiZSBsb2FkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgQHNhbXB7LnRleHQwfS4gIFRoZQotZm9sbG93aW5nIHN5bWJvbHMgd2lsbCBiZSBkZWZpbmVkOiBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDB9LAotQGNvZGV7X19sb2FkX3N0b3BfdGV4dDB9LCBAY29kZXtfX2xvYWRfc3RhcnRfdGV4dDF9LAotQGNvZGV7X19sb2FkX3N0b3BfdGV4dDF9LgotCi1DIGNvZGUgdG8gY29weSBvdmVybGF5IEBjb2Rley50ZXh0MX0gaW50byB0aGUgb3ZlcmxheSBhcmVhIG1pZ2h0IGxvb2sKLWxpa2UgdGhlIGZvbGxvd2luZy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi0gIGV4dGVybiBjaGFyIF9fbG9hZF9zdGFydF90ZXh0MSwgX19sb2FkX3N0b3BfdGV4dDE7Ci0gIG1lbWNweSAoKGNoYXIgKikgMHgxMDAwLCAmX19sb2FkX3N0YXJ0X3RleHQxLAotICAgICAgICAgICZfX2xvYWRfc3RvcF90ZXh0MSAtICZfX2xvYWRfc3RhcnRfdGV4dDEpOwotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotTm90ZSB0aGF0IHRoZSBAY29kZXtPVkVSTEFZfSBjb21tYW5kIGlzIGp1c3Qgc3ludGFjdGljIHN1Z2FyLCBzaW5jZQotZXZlcnl0aGluZyBpdCBkb2VzIGNhbiBiZSBkb25lIHVzaW5nIHRoZSBtb3JlIGJhc2ljIGNvbW1hbmRzLiAgVGhlIGFib3ZlCi1leGFtcGxlIGNvdWxkIGhhdmUgYmVlbiB3cml0dGVuIGlkZW50aWNhbGx5IGFzIGZvbGxvd3MuCi0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotICAudGV4dDAgMHgxMDAwIDogQVQgKDB4NDAwMCkgQHsgbzEvKi5vKC50ZXh0KSBAfQotICBfX2xvYWRfc3RhcnRfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKTsKLSAgX19sb2FkX3N0b3BfdGV4dDAgPSBMT0FEQUREUiAoLnRleHQwKSArIFNJWkVPRiAoLnRleHQwKTsKLSAgLnRleHQxIDB4MTAwMCA6IEFUICgweDQwMDAgKyBTSVpFT0YgKC50ZXh0MCkpIEB7IG8yLyoubygudGV4dCkgQH0KLSAgX19sb2FkX3N0YXJ0X3RleHQxID0gTE9BREFERFIgKC50ZXh0MSk7Ci0gIF9fbG9hZF9zdG9wX3RleHQxID0gTE9BREFERFIgKC50ZXh0MSkgKyBTSVpFT0YgKC50ZXh0MSk7Ci0gIC4gPSAweDEwMDAgKyBNQVggKFNJWkVPRiAoLnRleHQwKSwgU0laRU9GICgudGV4dDEpKTsKLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIE1FTU9SWQotQHNlY3Rpb24gTUVNT1JZIGNvbW1hbmQKLUBraW5kZXggTUVNT1JZCi1AY2luZGV4IG1lbW9yeSByZWdpb25zCi1AY2luZGV4IHJlZ2lvbnMgb2YgbWVtb3J5Ci1AY2luZGV4IGFsbG9jYXRpbmcgbWVtb3J5Ci1AY2luZGV4IGRpc2NvbnRpbnVvdXMgbWVtb3J5Ci1UaGUgbGlua2VyJ3MgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBlcm1pdHMgYWxsb2NhdGlvbiBvZiBhbGwgYXZhaWxhYmxlCi1tZW1vcnkuICBZb3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgdGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZC4KLQotVGhlIEBjb2Rle01FTU9SWX0gY29tbWFuZCBkZXNjcmliZXMgdGhlIGxvY2F0aW9uIGFuZCBzaXplIG9mIGJsb2NrcyBvZgotbWVtb3J5IGluIHRoZSB0YXJnZXQuICBZb3UgY2FuIHVzZSBpdCB0byBkZXNjcmliZSB3aGljaCBtZW1vcnkgcmVnaW9ucwotbWF5IGJlIHVzZWQgYnkgdGhlIGxpbmtlciwgYW5kIHdoaWNoIG1lbW9yeSByZWdpb25zIGl0IG11c3QgYXZvaWQuICBZb3UKLWNhbiB0aGVuIGFzc2lnbiBzZWN0aW9ucyB0byBwYXJ0aWN1bGFyIG1lbW9yeSByZWdpb25zLiAgVGhlIGxpbmtlciB3aWxsCi1zZXQgc2VjdGlvbiBhZGRyZXNzZXMgYmFzZWQgb24gdGhlIG1lbW9yeSByZWdpb25zLCBhbmQgd2lsbCB3YXJuIGFib3V0Ci1yZWdpb25zIHRoYXQgYmVjb21lIHRvbyBmdWxsLiAgVGhlIGxpbmtlciB3aWxsIG5vdCBzaHVmZmxlIHNlY3Rpb25zCi1hcm91bmQgdG8gZml0IGludG8gdGhlIGF2YWlsYWJsZSByZWdpb25zLgotCi1BIGxpbmtlciBzY3JpcHQgbWF5IGNvbnRhaW4gYXQgbW9zdCBvbmUgdXNlIG9mIHRoZSBAY29kZXtNRU1PUll9Ci1jb21tYW5kLiAgSG93ZXZlciwgeW91IGNhbiBkZWZpbmUgYXMgbWFueSBibG9ja3Mgb2YgbWVtb3J5IHdpdGhpbiBpdCBhcwoteW91IHdpc2guICBUaGUgc3ludGF4IGlzOgotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgCi0gIEB7Ci0gICAgQHZhcntuYW1lfSBbKEB2YXJ7YXR0cn0pXSA6IE9SSUdJTiA9IEB2YXJ7b3JpZ2lufSwgTEVOR1RIID0gQHZhcntsZW59Ci0gICAgQGRvdHN7fQotICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEB2YXJ7bmFtZX0gaXMgYSBuYW1lIHVzZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQgdG8gcmVmZXIgdG8gdGhlCi1yZWdpb24uICBUaGUgcmVnaW9uIG5hbWUgaGFzIG5vIG1lYW5pbmcgb3V0c2lkZSBvZiB0aGUgbGlua2VyIHNjcmlwdC4KLVJlZ2lvbiBuYW1lcyBhcmUgc3RvcmVkIGluIGEgc2VwYXJhdGUgbmFtZSBzcGFjZSwgYW5kIHdpbGwgbm90IGNvbmZsaWN0Ci13aXRoIHN5bWJvbCBuYW1lcywgZmlsZSBuYW1lcywgb3Igc2VjdGlvbiBuYW1lcy4gIEVhY2ggbWVtb3J5IHJlZ2lvbgotbXVzdCBoYXZlIGEgZGlzdGluY3QgbmFtZS4KLQotQGNpbmRleCBtZW1vcnkgcmVnaW9uIGF0dHJpYnV0ZXMKLVRoZSBAdmFye2F0dHJ9IHN0cmluZyBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzcGVjaWZ5Ci13aGV0aGVyIHRvIHVzZSBhIHBhcnRpY3VsYXIgbWVtb3J5IHJlZ2lvbiBmb3IgYW4gaW5wdXQgc2VjdGlvbiB3aGljaCBpcwotbm90IGV4cGxpY2l0bHkgbWFwcGVkIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgQXMgZGVzY3JpYmVkIGluCi1AcmVme1NFQ1RJT05TfSwgaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFuIG91dHB1dCBzZWN0aW9uIGZvciBzb21lIGlucHV0Ci1zZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgY3JlYXRlIGFuIG91dHB1dCBzZWN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotdGhlIGlucHV0IHNlY3Rpb24uICBJZiB5b3UgZGVmaW5lIHJlZ2lvbiBhdHRyaWJ1dGVzLCB0aGUgbGlua2VyIHdpbGwgdXNlCi10aGVtIHRvIHNlbGVjdCB0aGUgbWVtb3J5IHJlZ2lvbiBmb3IgdGhlIG91dHB1dCBzZWN0aW9uIHRoYXQgaXQgY3JlYXRlcy4KLQotVGhlIEB2YXJ7YXR0cn0gc3RyaW5nIG11c3QgY29uc2lzdCBvbmx5IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKLUB0YWJsZSBAc2FtcAotQGl0ZW0gUgotUmVhZC1vbmx5IHNlY3Rpb24KLUBpdGVtIFcKLVJlYWQvd3JpdGUgc2VjdGlvbgotQGl0ZW0gWAotRXhlY3V0YWJsZSBzZWN0aW9uCi1AaXRlbSBBCi1BbGxvY2F0YWJsZSBzZWN0aW9uCi1AaXRlbSBJCi1Jbml0aWFsaXplZCBzZWN0aW9uCi1AaXRlbSBMCi1TYW1lIGFzIEBzYW1we0l9Ci1AaXRlbSAhCi1JbnZlcnQgdGhlIHNlbnNlIG9mIGFueSBvZiB0aGUgcHJlY2VkaW5nIGF0dHJpYnV0ZXMKLUBlbmQgdGFibGUKLQotSWYgYSB1bm1hcHBlZCBzZWN0aW9uIG1hdGNoZXMgYW55IG9mIHRoZSBsaXN0ZWQgYXR0cmlidXRlcyBvdGhlciB0aGFuCi1Ac2FtcHshfSwgaXQgd2lsbCBiZSBwbGFjZWQgaW4gdGhlIG1lbW9yeSByZWdpb24uICBUaGUgQHNhbXB7IX0KLWF0dHJpYnV0ZSByZXZlcnNlcyB0aGlzIHRlc3QsIHNvIHRoYXQgYW4gdW5tYXBwZWQgc2VjdGlvbiB3aWxsIGJlIHBsYWNlZAotaW4gdGhlIG1lbW9yeSByZWdpb24gb25seSBpZiBpdCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIGxpc3RlZAotYXR0cmlidXRlcy4KLQotQGtpbmRleCBPUklHSU4gPQotQGtpbmRleCBvID0KLUBraW5kZXggb3JnID0KLVRoZSBAdmFye29yaWdpbn0gaXMgYW4gZXhwcmVzc2lvbiBmb3IgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG1lbW9yeQotcmVnaW9uLiAgVGhlIGV4cHJlc3Npb24gbXVzdCBldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkKLWFsbG9jYXRpb24gaXMgcGVyZm9ybWVkLCB3aGljaCBtZWFucyB0aGF0IHlvdSBtYXkgbm90IHVzZSBhbnkgc2VjdGlvbgotcmVsYXRpdmUgc3ltYm9scy4gIFRoZSBrZXl3b3JkIEBjb2Rle09SSUdJTn0gbWF5IGJlIGFiYnJldmlhdGVkIHRvCi1AY29kZXtvcmd9IG9yIEBjb2Rle299IChidXQgbm90LCBmb3IgZXhhbXBsZSwgQGNvZGV7T1JHfSkuCi0KLUBraW5kZXggTEVOR1RIID0KLUBraW5kZXggbGVuID0KLUBraW5kZXggbCA9Ci1UaGUgQHZhcntsZW59IGlzIGFuIGV4cHJlc3Npb24gZm9yIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkKLXJlZ2lvbi4gIEFzIHdpdGggdGhlIEB2YXJ7b3JpZ2lufSBleHByZXNzaW9uLCB0aGUgZXhwcmVzc2lvbiBtdXN0Ci1ldmFsdWF0ZSB0byBhIGNvbnN0YW50IGJlZm9yZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBwZXJmb3JtZWQuICBUaGUKLWtleXdvcmQgQGNvZGV7TEVOR1RIfSBtYXkgYmUgYWJicmV2aWF0ZWQgdG8gQGNvZGV7bGVufSBvciBAY29kZXtsfS4KLQotSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3ZSBzcGVjaWZ5IHRoYXQgdGhlcmUgYXJlIHR3byBtZW1vcnkgcmVnaW9ucwotYXZhaWxhYmxlIGZvciBhbGxvY2F0aW9uOiBvbmUgc3RhcnRpbmcgYXQgQHNhbXB7MH0gZm9yIDI1NiBraWxvYnl0ZXMsCi1hbmQgdGhlIG90aGVyIHN0YXJ0aW5nIGF0IEBzYW1wezB4NDAwMDAwMDB9IGZvciBmb3VyIG1lZ2FieXRlcy4gIFRoZQotbGlua2VyIHdpbGwgcGxhY2UgaW50byB0aGUgQHNhbXB7cm9tfSBtZW1vcnkgcmVnaW9uIGV2ZXJ5IHNlY3Rpb24gd2hpY2gKLWlzIG5vdCBleHBsaWNpdGx5IG1hcHBlZCBpbnRvIGEgbWVtb3J5IHJlZ2lvbiwgYW5kIGlzIGVpdGhlciByZWFkLW9ubHkKLW9yIGV4ZWN1dGFibGUuICBUaGUgbGlua2VyIHdpbGwgcGxhY2Ugb3RoZXIgc2VjdGlvbnMgd2hpY2ggYXJlIG5vdAotZXhwbGljaXRseSBtYXBwZWQgaW50byBhIG1lbW9yeSByZWdpb24gaW50byB0aGUgQHNhbXB7cmFtfSBtZW1vcnkKLXJlZ2lvbi4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1NRU1PUlkgCi0gIEB7Ci0gICAgcm9tIChyeCkgIDogT1JJR0lOID0gMCwgTEVOR1RIID0gMjU2SwotICAgIHJhbSAoIXJ4KSA6IG9yZyA9IDB4NDAwMDAwMDAsIGwgPSA0TQotICBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotT25jZSB5b3UgZGVmaW5lIGEgbWVtb3J5IHJlZ2lvbiwgeW91IGNhbiBkaXJlY3QgdGhlIGxpbmtlciB0byBwbGFjZQotc3BlY2lmaWMgb3V0cHV0IHNlY3Rpb25zIGludG8gdGhhdCBtZW1vcnkgcmVnaW9uIGJ5IHVzaW5nIHRoZQotQHNhbXB7PkB2YXJ7cmVnaW9ufX0gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCi1hIG1lbW9yeSByZWdpb24gbmFtZWQgQHNhbXB7bWVtfSwgeW91IHdvdWxkIHVzZSBAc2FtcHs+bWVtfSBpbiB0aGUKLW91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24uICBAeHJlZntPdXRwdXQgU2VjdGlvbiBSZWdpb259LiAgSWYgbm8gYWRkcmVzcwotd2FzIHNwZWNpZmllZCBmb3IgdGhlIG91dHB1dCBzZWN0aW9uLCB0aGUgbGlua2VyIHdpbGwgc2V0IHRoZSBhZGRyZXNzIHRvCi10aGUgbmV4dCBhdmFpbGFibGUgYWRkcmVzcyB3aXRoaW4gdGhlIG1lbW9yeSByZWdpb24uICBJZiB0aGUgY29tYmluZWQKLW91dHB1dCBzZWN0aW9ucyBkaXJlY3RlZCB0byBhIG1lbW9yeSByZWdpb24gYXJlIHRvbyBsYXJnZSBmb3IgdGhlCi1yZWdpb24sIHRoZSBsaW5rZXIgd2lsbCBpc3N1ZSBhbiBlcnJvciBtZXNzYWdlLgotCi1Abm9kZSBQSERSUwotQHNlY3Rpb24gUEhEUlMgQ29tbWFuZAotQGtpbmRleCBQSERSUwotQGNpbmRleCBwcm9ncmFtIGhlYWRlcnMKLUBjaW5kZXggRUxGIHByb2dyYW0gaGVhZGVycwotQGNpbmRleCBwcm9ncmFtIHNlZ21lbnRzCi1AY2luZGV4IHNlZ21lbnRzLCBFTEYKLVRoZSBFTEYgb2JqZWN0IGZpbGUgZm9ybWF0IHVzZXMgQGRmbntwcm9ncmFtIGhlYWRlcnN9LCBhbHNvIGtub3dzIGFzCi1AZGZue3NlZ21lbnRzfS4gIFRoZSBwcm9ncmFtIGhlYWRlcnMgZGVzY3JpYmUgaG93IHRoZSBwcm9ncmFtIHNob3VsZCBiZQotbG9hZGVkIGludG8gbWVtb3J5LiAgWW91IGNhbiBwcmludCB0aGVtIG91dCBieSB1c2luZyB0aGUgQGNvZGV7b2JqZHVtcH0KLXByb2dyYW0gd2l0aCB0aGUgQHNhbXB7LXB9IG9wdGlvbi4KLQotV2hlbiB5b3UgcnVuIGFuIEVMRiBwcm9ncmFtIG9uIGEgbmF0aXZlIEVMRiBzeXN0ZW0sIHRoZSBzeXN0ZW0gbG9hZGVyCi1yZWFkcyB0aGUgcHJvZ3JhbSBoZWFkZXJzIGluIG9yZGVyIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGxvYWQgdGhlCi1wcm9ncmFtLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgcHJvZ3JhbSBoZWFkZXJzIGFyZSBzZXQgY29ycmVjdGx5LgotVGhpcyBtYW51YWwgZG9lcyBub3QgZGVzY3JpYmUgdGhlIGRldGFpbHMgb2YgaG93IHRoZSBzeXN0ZW0gbG9hZGVyCi1pbnRlcnByZXRzIHByb2dyYW0gaGVhZGVyczsgZm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgRUxGIEFCSS4KLQotVGhlIGxpbmtlciB3aWxsIGNyZWF0ZSByZWFzb25hYmxlIHByb2dyYW0gaGVhZGVycyBieSBkZWZhdWx0LiAgSG93ZXZlciwKLWluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IHRoZSBwcm9ncmFtIGhlYWRlcnMgbW9yZQotcHJlY2lzZWx5LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGZvciB0aGlzIHB1cnBvc2UuICBXaGVuCi10aGUgbGlua2VyIHNlZXMgdGhlIEBjb2Rle1BIRFJTfSBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LCBpdCB3aWxsCi1ub3QgY3JlYXRlIGFueSBwcm9ncmFtIGhlYWRlcnMgb3RoZXIgdGhhbiB0aGUgb25lcyBzcGVjaWZpZWQuCi0KLVRoZSBsaW5rZXIgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgQGNvZGV7UEhEUlN9IGNvbW1hbmQgd2hlbgotZ2VuZXJhdGluZyBhbiBFTEYgb3V0cHV0IGZpbGUuICBJbiBvdGhlciBjYXNlcywgdGhlIGxpbmtlciB3aWxsIHNpbXBseQotaWdub3JlIEBjb2Rle1BIRFJTfS4KLQotVGhpcyBpcyB0aGUgc3ludGF4IG9mIHRoZSBAY29kZXtQSERSU30gY29tbWFuZC4gIFRoZSB3b3JkcyBAY29kZXtQSERSU30sCi1AY29kZXtGSUxFSERSfSwgQGNvZGV7QVR9LCBhbmQgQGNvZGV7RkxBR1N9IGFyZSBrZXl3b3Jkcy4KLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi1QSERSUwotQHsKLSAgQHZhcntuYW1lfSBAdmFye3R5cGV9IFsgRklMRUhEUiBdIFsgUEhEUlMgXSBbIEFUICggQHZhcnthZGRyZXNzfSApIF0KLSAgICAgICAgWyBGTEFHUyAoIEB2YXJ7ZmxhZ3N9ICkgXSA7Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIEB2YXJ7bmFtZX0gaXMgdXNlZCBvbmx5IGZvciByZWZlcmVuY2UgaW4gdGhlIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kCi1vZiB0aGUgbGlua2VyIHNjcmlwdC4gIEl0IGlzIG5vdCBwdXQgaW50byB0aGUgb3V0cHV0IGZpbGUuICBQcm9ncmFtCi1oZWFkZXIgbmFtZXMgYXJlIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG5hbWUgc3BhY2UsIGFuZCB3aWxsIG5vdCBjb25mbGljdAotd2l0aCBzeW1ib2wgbmFtZXMsIGZpbGUgbmFtZXMsIG9yIHNlY3Rpb24gbmFtZXMuICBFYWNoIHByb2dyYW0gaGVhZGVyCi1tdXN0IGhhdmUgYSBkaXN0aW5jdCBuYW1lLgotCi1DZXJ0YWluIHByb2dyYW0gaGVhZGVyIHR5cGVzIGRlc2NyaWJlIHNlZ21lbnRzIG9mIG1lbW9yeSB3aGljaCB0aGUKLXN5c3RlbSBsb2FkZXIgd2lsbCBsb2FkIGZyb20gdGhlIGZpbGUuICBJbiB0aGUgbGlua2VyIHNjcmlwdCwgeW91Ci1zcGVjaWZ5IHRoZSBjb250ZW50cyBvZiB0aGVzZSBzZWdtZW50cyBieSBwbGFjaW5nIGFsbG9jYXRhYmxlIG91dHB1dAotc2VjdGlvbnMgaW4gdGhlIHNlZ21lbnRzLiAgWW91IHVzZSB0aGUgQHNhbXB7OkB2YXJ7cGhkcn19IG91dHB1dCBzZWN0aW9uCi1hdHRyaWJ1dGUgdG8gcGxhY2UgYSBzZWN0aW9uIGluIGEgcGFydGljdWxhciBzZWdtZW50LiAgQHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIFBoZHJ9LgotCi1JdCBpcyBub3JtYWwgdG8gcHV0IGNlcnRhaW4gc2VjdGlvbnMgaW4gbW9yZSB0aGFuIG9uZSBzZWdtZW50LiAgVGhpcwotbWVyZWx5IGltcGxpZXMgdGhhdCBvbmUgc2VnbWVudCBvZiBtZW1vcnkgY29udGFpbnMgYW5vdGhlci4gIFlvdSBtYXkKLXJlcGVhdCBAc2FtcHs6QHZhcntwaGRyfX0sIHVzaW5nIGl0IG9uY2UgZm9yIGVhY2ggc2VnbWVudCB3aGljaCBzaG91bGQKLWNvbnRhaW4gdGhlIHNlY3Rpb24uCi0KLUlmIHlvdSBwbGFjZSBhIHNlY3Rpb24gaW4gb25lIG9yIG1vcmUgc2VnbWVudHMgdXNpbmcgQHNhbXB7OkB2YXJ7cGhkcn19LAotdGhlbiB0aGUgbGlua2VyIHdpbGwgcGxhY2UgYWxsIHN1YnNlcXVlbnQgYWxsb2NhdGFibGUgc2VjdGlvbnMgd2hpY2ggZG8KLW5vdCBzcGVjaWZ5IEBzYW1wezpAdmFye3BoZHJ9fSBpbiB0aGUgc2FtZSBzZWdtZW50cy4gIFRoaXMgaXMgZm9yCi1jb252ZW5pZW5jZSwgc2luY2UgZ2VuZXJhbGx5IGEgd2hvbGUgc2V0IG9mIGNvbnRpZ3VvdXMgc2VjdGlvbnMgd2lsbCBiZQotcGxhY2VkIGluIGEgc2luZ2xlIHNlZ21lbnQuICBZb3UgY2FuIHVzZSBAY29kZXs6Tk9ORX0gdG8gb3ZlcnJpZGUgdGhlCi1kZWZhdWx0IHNlZ21lbnQgYW5kIHRlbGwgdGhlIGxpbmtlciB0byBub3QgcHV0IHRoZSBzZWN0aW9uIGluIGFueQotc2VnbWVudCBhdCBhbGwuCi0KLUBraW5kZXggRklMRUhEUgotQGtpbmRleCBQSERSUwotWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZJTEVIRFJ9IGFuZCBAY29kZXtQSERSU30ga2V5d29yZHMgYXBwZWFyIGFmdGVyCi10aGUgcHJvZ3JhbSBoZWFkZXIgdHlwZSB0byBmdXJ0aGVyIGRlc2NyaWJlIHRoZSBjb250ZW50cyBvZiB0aGUgc2VnbWVudC4KLVRoZSBAY29kZXtGSUxFSERSfSBrZXl3b3JkIG1lYW5zIHRoYXQgdGhlIHNlZ21lbnQgc2hvdWxkIGluY2x1ZGUgdGhlIEVMRgotZmlsZSBoZWFkZXIuICBUaGUgQGNvZGV7UEhEUlN9IGtleXdvcmQgbWVhbnMgdGhhdCB0aGUgc2VnbWVudCBzaG91bGQKLWluY2x1ZGUgdGhlIEVMRiBwcm9ncmFtIGhlYWRlcnMgdGhlbXNlbHZlcy4KLQotVGhlIEB2YXJ7dHlwZX0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLiAgVGhlIG51bWJlcnMgaW5kaWNhdGUgdGhlCi12YWx1ZSBvZiB0aGUga2V5d29yZC4KLQotQHRhYmxlIEBhc2lzCi1AaXRlbSBAY29kZXtQVF9OVUxMfSAoMCkKLUluZGljYXRlcyBhbiB1bnVzZWQgcHJvZ3JhbSBoZWFkZXIuCi0KLUBpdGVtIEBjb2Rle1BUX0xPQUR9ICgxKQotSW5kaWNhdGVzIHRoYXQgdGhpcyBwcm9ncmFtIGhlYWRlciBkZXNjcmliZXMgYSBzZWdtZW50IHRvIGJlIGxvYWRlZCBmcm9tCi10aGUgZmlsZS4KLQotQGl0ZW0gQGNvZGV7UFRfRFlOQU1JQ30gKDIpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIGR5bmFtaWMgbGlua2luZyBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQuCi0KLUBpdGVtIEBjb2Rle1BUX0lOVEVSUH0gKDMpCi1JbmRpY2F0ZXMgYSBzZWdtZW50IHdoZXJlIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIGludGVycHJldGVyIG1heSBiZQotZm91bmQuCi0KLUBpdGVtIEBjb2Rle1BUX05PVEV9ICg0KQotSW5kaWNhdGVzIGEgc2VnbWVudCBob2xkaW5nIG5vdGUgaW5mb3JtYXRpb24uCi0KLUBpdGVtIEBjb2Rle1BUX1NITElCfSAoNSkKLUEgcmVzZXJ2ZWQgcHJvZ3JhbSBoZWFkZXIgdHlwZSwgZGVmaW5lZCBidXQgbm90IHNwZWNpZmllZCBieSB0aGUgRUxGCi1BQkkuCi0KLUBpdGVtIEBjb2Rle1BUX1BIRFJ9ICg2KQotSW5kaWNhdGVzIGEgc2VnbWVudCB3aGVyZSB0aGUgcHJvZ3JhbSBoZWFkZXJzIG1heSBiZSBmb3VuZC4KLQotQGl0ZW0gQHZhcntleHByZXNzaW9ufQotQW4gZXhwcmVzc2lvbiBnaXZpbmcgdGhlIG51bWVyaWMgdHlwZSBvZiB0aGUgcHJvZ3JhbSBoZWFkZXIuICBUaGlzIG1heQotYmUgdXNlZCBmb3IgdHlwZXMgbm90IGRlZmluZWQgYWJvdmUuCi1AZW5kIHRhYmxlCi0KLVlvdSBjYW4gc3BlY2lmeSB0aGF0IGEgc2VnbWVudCBzaG91bGQgYmUgbG9hZGVkIGF0IGEgcGFydGljdWxhciBhZGRyZXNzCi1pbiBtZW1vcnkgYnkgdXNpbmcgYW4gQGNvZGV7QVR9IGV4cHJlc3Npb24uICBUaGlzIGlzIGlkZW50aWNhbCB0byB0aGUKLUBjb2Rle0FUfSBjb21tYW5kIHVzZWQgYXMgYW4gb3V0cHV0IHNlY3Rpb24gYXR0cmlidXRlIChAcHhyZWZ7T3V0cHV0Ci1TZWN0aW9uIExNQX0pLiAgVGhlIEBjb2Rle0FUfSBjb21tYW5kIGZvciBhIHByb2dyYW0gaGVhZGVyIG92ZXJyaWRlcyB0aGUKLW91dHB1dCBzZWN0aW9uIGF0dHJpYnV0ZS4KLQotVGhlIGxpbmtlciB3aWxsIG5vcm1hbGx5IHNldCB0aGUgc2VnbWVudCBmbGFncyBiYXNlZCBvbiB0aGUgc2VjdGlvbnMKLXdoaWNoIGNvbXByaXNlIHRoZSBzZWdtZW50LiAgWW91IG1heSB1c2UgdGhlIEBjb2Rle0ZMQUdTfSBrZXl3b3JkIHRvCi1leHBsaWNpdGx5IHNwZWNpZnkgdGhlIHNlZ21lbnQgZmxhZ3MuICBUaGUgdmFsdWUgb2YgQHZhcntmbGFnc30gbXVzdCBiZQotYW4gaW50ZWdlci4gIEl0IGlzIHVzZWQgdG8gc2V0IHRoZSBAY29kZXtwX2ZsYWdzfSBmaWVsZCBvZiB0aGUgcHJvZ3JhbQotaGVhZGVyLgotCi1IZXJlIGlzIGFuIGV4YW1wbGUgb2YgQGNvZGV7UEhEUlN9LiAgVGhpcyBzaG93cyBhIHR5cGljYWwgc2V0IG9mIHByb2dyYW0KLWhlYWRlcnMgdXNlZCBvbiBhIG5hdGl2ZSBFTEYgc3lzdGVtLgotCi1AZXhhbXBsZQotQGdyb3VwCi1QSERSUwotQHsKLSAgaGVhZGVycyBQVF9QSERSIFBIRFJTIDsKLSAgaW50ZXJwIFBUX0lOVEVSUCA7Ci0gIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIDsKLSAgZGF0YSBQVF9MT0FEIDsKLSAgZHluYW1pYyBQVF9EWU5BTUlDIDsKLUB9Ci0KLVNFQ1RJT05TCi1AewotICAuID0gU0laRU9GX0hFQURFUlM7Ci0gIC5pbnRlcnAgOiBAeyAqKC5pbnRlcnApIEB9IDp0ZXh0IDppbnRlcnAKLSAgLnRleHQgOiBAeyAqKC50ZXh0KSBAfSA6dGV4dAotICAucm9kYXRhIDogQHsgKigucm9kYXRhKSBAfSAvKiBkZWZhdWx0cyB0byA6dGV4dCAqLwotICBAZG90c3t9Ci0gIC4gPSAuICsgMHgxMDAwOyAvKiBtb3ZlIHRvIGEgbmV3IHBhZ2UgaW4gbWVtb3J5ICovCi0gIC5kYXRhIDogQHsgKiguZGF0YSkgQH0gOmRhdGEKLSAgLmR5bmFtaWMgOiBAeyAqKC5keW5hbWljKSBAfSA6ZGF0YSA6ZHluYW1pYwotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBleGFtcGxlCi0KLUBub2RlIFZFUlNJT04KLUBzZWN0aW9uIFZFUlNJT04gQ29tbWFuZAotQGtpbmRleCBWRVJTSU9OIEB7c2NyaXB0IHRleHRAfQotQGNpbmRleCBzeW1ib2wgdmVyc2lvbnMKLUBjaW5kZXggdmVyc2lvbiBzY3JpcHQKLUBjaW5kZXggdmVyc2lvbnMgb2Ygc3ltYm9scwotVGhlIGxpbmtlciBzdXBwb3J0cyBzeW1ib2wgdmVyc2lvbnMgd2hlbiB1c2luZyBFTEYuICBTeW1ib2wgdmVyc2lvbnMgYXJlCi1vbmx5IHVzZWZ1bCB3aGVuIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgZHluYW1pYyBsaW5rZXIgY2FuIHVzZQotc3ltYm9sIHZlcnNpb25zIHRvIHNlbGVjdCBhIHNwZWNpZmljIHZlcnNpb24gb2YgYSBmdW5jdGlvbiB3aGVuIGl0IHJ1bnMKLWEgcHJvZ3JhbSB0aGF0IG1heSBoYXZlIGJlZW4gbGlua2VkIGFnYWluc3QgYW4gZWFybGllciB2ZXJzaW9uIG9mIHRoZQotc2hhcmVkIGxpYnJhcnkuCi0KLVlvdSBjYW4gaW5jbHVkZSBhIHZlcnNpb24gc2NyaXB0IGRpcmVjdGx5IGluIHRoZSBtYWluIGxpbmtlciBzY3JpcHQsIG9yCi15b3UgY2FuIHN1cHBseSB0aGUgdmVyc2lvbiBzY3JpcHQgYXMgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdC4gIFlvdSBjYW4KLWFsc28gdXNlIHRoZSBAc2FtcHstLXZlcnNpb24tc2NyaXB0fSBsaW5rZXIgb3B0aW9uLgotCi1UaGUgc3ludGF4IG9mIHRoZSBAY29kZXtWRVJTSU9OfSBjb21tYW5kIGlzIHNpbXBseQotQHNtYWxsZXhhbXBsZQotVkVSU0lPTiBAeyB2ZXJzaW9uLXNjcmlwdC1jb21tYW5kcyBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLQotVGhlIGZvcm1hdCBvZiB0aGUgdmVyc2lvbiBzY3JpcHQgY29tbWFuZHMgaXMgaWRlbnRpY2FsIHRvIHRoYXQgdXNlZCBieQotU3VuJ3MgbGlua2VyIGluIFNvbGFyaXMgMi41LiAgVGhlIHZlcnNpb24gc2NyaXB0IGRlZmluZXMgYSB0cmVlIG9mCi12ZXJzaW9uIG5vZGVzLiAgWW91IHNwZWNpZnkgdGhlIG5vZGUgbmFtZXMgYW5kIGludGVyZGVwZW5kZW5jaWVzIGluIHRoZQotdmVyc2lvbiBzY3JpcHQuICBZb3UgY2FuIHNwZWNpZnkgd2hpY2ggc3ltYm9scyBhcmUgYm91bmQgdG8gd2hpY2gKLXZlcnNpb24gbm9kZXMsIGFuZCB5b3UgY2FuIHJlZHVjZSBhIHNwZWNpZmllZCBzZXQgb2Ygc3ltYm9scyB0byBsb2NhbAotc2NvcGUgc28gdGhhdCB0aGV5IGFyZSBub3QgZ2xvYmFsbHkgdmlzaWJsZSBvdXRzaWRlIG9mIHRoZSBzaGFyZWQKLWxpYnJhcnkuCi0KLVRoZSBlYXNpZXN0IHdheSB0byBkZW1vbnN0cmF0ZSB0aGUgdmVyc2lvbiBzY3JpcHQgbGFuZ3VhZ2UgaXMgd2l0aCBhIGZldwotZXhhbXBsZXMuCi0KLUBzbWFsbGV4YW1wbGUKLVZFUlNfMS4xIEB7Ci0JIGdsb2JhbDoKLQkJIGZvbzE7Ci0JIGxvY2FsOgotCQkgb2xkKjsgCi0JCSBvcmlnaW5hbCo7IAotCQkgbmV3KjsgCi1AfTsKLQotVkVSU18xLjIgQHsKLQkJIGZvbzI7Ci1AfSBWRVJTXzEuMTsKLQotVkVSU18yLjAgQHsKLQkJIGJhcjE7IGJhcjI7Ci1AfSBWRVJTXzEuMjsKLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoaXMgZXhhbXBsZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIHRocmVlIHZlcnNpb24gbm9kZXMuICBUaGUgZmlyc3QKLXZlcnNpb24gbm9kZSBkZWZpbmVkIGlzIEBzYW1we1ZFUlNfMS4xfTsgaXQgaGFzIG5vIG90aGVyIGRlcGVuZGVuY2llcy4KLVRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28xfSB0byBAc2FtcHtWRVJTXzEuMX0uICBJdCByZWR1Y2VzCi1hIG51bWJlciBvZiBzeW1ib2xzIHRvIGxvY2FsIHNjb3BlIHNvIHRoYXQgdGhleSBhcmUgbm90IHZpc2libGUgb3V0c2lkZQotb2YgdGhlIHNoYXJlZCBsaWJyYXJ5LgotCi1OZXh0LCB0aGUgdmVyc2lvbiBzY3JpcHQgZGVmaW5lcyBub2RlIEBzYW1we1ZFUlNfMS4yfS4gIFRoaXMgbm9kZQotZGVwZW5kcyB1cG9uIEBzYW1we1ZFUlNfMS4xfS4gIFRoZSBzY3JpcHQgYmluZHMgdGhlIHN5bWJvbCBAc2FtcHtmb28yfQotdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMn0uCi0KLUZpbmFsbHksIHRoZSB2ZXJzaW9uIHNjcmlwdCBkZWZpbmVzIG5vZGUgQHNhbXB7VkVSU18yLjB9LiAgVGhpcyBub2RlCi1kZXBlbmRzIHVwb24gQHNhbXB7VkVSU18xLjJ9LiAgVGhlIHNjcmlwdHMgYmluZHMgdGhlIHN5bWJvbHMgQHNhbXB7YmFyMX0KLWFuZCBAc2FtcHtiYXIyfSBhcmUgYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzIuMH0uCi0KLVdoZW4gdGhlIGxpbmtlciBmaW5kcyBhIHN5bWJvbCBkZWZpbmVkIGluIGEgbGlicmFyeSB3aGljaCBpcyBub3QKLXNwZWNpZmljYWxseSBib3VuZCB0byBhIHZlcnNpb24gbm9kZSwgaXQgd2lsbCBlZmZlY3RpdmVseSBiaW5kIGl0IHRvIGFuCi11bnNwZWNpZmllZCBiYXNlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBZb3UgY2FuIGJpbmQgYWxsIG90aGVyd2lzZQotdW5zcGVjaWZpZWQgc3ltYm9scyB0byBhIGdpdmVuIHZlcnNpb24gbm9kZSBieSB1c2luZyBAc2FtcHtnbG9iYWw6ICp9Ci1zb21ld2hlcmUgaW4gdGhlIHZlcnNpb24gc2NyaXB0LgotCi1UaGUgbmFtZXMgb2YgdGhlIHZlcnNpb24gbm9kZXMgaGF2ZSBubyBzcGVjaWZpYyBtZWFuaW5nIG90aGVyIHRoYW4gd2hhdAotdGhleSBtaWdodCBzdWdnZXN0IHRvIHRoZSBwZXJzb24gcmVhZGluZyB0aGVtLiAgVGhlIEBzYW1wezIuMH0gdmVyc2lvbgotY291bGQganVzdCBhcyB3ZWxsIGhhdmUgYXBwZWFyZWQgaW4gYmV0d2VlbiBAc2FtcHsxLjF9IGFuZCBAc2FtcHsxLjJ9LgotSG93ZXZlciwgdGhpcyB3b3VsZCBiZSBhIGNvbmZ1c2luZyB3YXkgdG8gd3JpdGUgYSB2ZXJzaW9uIHNjcmlwdC4KLQotV2hlbiB5b3UgbGluayBhbiBhcHBsaWNhdGlvbiBhZ2FpbnN0IGEgc2hhcmVkIGxpYnJhcnkgdGhhdCBoYXMgdmVyc2lvbmVkCi1zeW1ib2xzLCB0aGUgYXBwbGljYXRpb24gaXRzZWxmIGtub3dzIHdoaWNoIHZlcnNpb24gb2YgZWFjaCBzeW1ib2wgaXQKLXJlcXVpcmVzLCBhbmQgaXQgYWxzbyBrbm93cyB3aGljaCB2ZXJzaW9uIG5vZGVzIGl0IG5lZWRzIGZyb20gZWFjaAotc2hhcmVkIGxpYnJhcnkgaXQgaXMgbGlua2VkIGFnYWluc3QuICBUaHVzIGF0IHJ1bnRpbWUsIHRoZSBkeW5hbWljCi1sb2FkZXIgY2FuIG1ha2UgYSBxdWljayBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbGlicmFyaWVzIHlvdSBoYXZlCi1saW5rZWQgYWdhaW5zdCBkbyBpbiBmYWN0IHN1cHBseSBhbGwgb2YgdGhlIHZlcnNpb24gbm9kZXMgdGhhdCB0aGUKLWFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byByZXNvbHZlIGFsbCBvZiB0aGUgZHluYW1pYyBzeW1ib2xzLiAgSW4gdGhpcwotd2F5IGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgZHluYW1pYyBsaW5rZXIgdG8ga25vdyB3aXRoIGNlcnRhaW50eSB0aGF0Ci1hbGwgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IGl0IG5lZWRzIHdpbGwgYmUgcmVzb2x2YWJsZSB3aXRob3V0IGhhdmluZyB0bwotc2VhcmNoIGZvciBlYWNoIHN5bWJvbCByZWZlcmVuY2UuCi0KLVRoZSBzeW1ib2wgdmVyc2lvbmluZyBpcyBpbiBlZmZlY3QgYSBtdWNoIG1vcmUgc29waGlzdGljYXRlZCB3YXkgb2YKLWRvaW5nIG1pbm9yIHZlcnNpb24gY2hlY2tpbmcgdGhhdCBTdW5PUyBkb2VzLiAgVGhlIGZ1bmRhbWVudGFsIHByb2JsZW0KLXRoYXQgaXMgYmVpbmcgYWRkcmVzc2VkIGhlcmUgaXMgdGhhdCB0eXBpY2FsbHkgcmVmZXJlbmNlcyB0byBleHRlcm5hbAotZnVuY3Rpb25zIGFyZSBib3VuZCBvbiBhbiBhcy1uZWVkZWQgYmFzaXMsIGFuZCBhcmUgbm90IGFsbCBib3VuZCB3aGVuCi10aGUgYXBwbGljYXRpb24gc3RhcnRzIHVwLiAgSWYgYSBzaGFyZWQgbGlicmFyeSBpcyBvdXQgb2YgZGF0ZSwgYQotcmVxdWlyZWQgaW50ZXJmYWNlIG1heSBiZSBtaXNzaW5nOyB3aGVuIHRoZSBhcHBsaWNhdGlvbiB0cmllcyB0byB1c2UKLXRoYXQgaW50ZXJmYWNlLCBpdCBtYXkgc3VkZGVubHkgYW5kIHVuZXhwZWN0ZWRseSBmYWlsLiAgV2l0aCBzeW1ib2wKLXZlcnNpb25pbmcsIHRoZSB1c2VyIHdpbGwgZ2V0IGEgd2FybmluZyB3aGVuIHRoZXkgc3RhcnQgdGhlaXIgcHJvZ3JhbSBpZgotdGhlIGxpYnJhcmllcyBiZWluZyB1c2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uIGFyZSB0b28gb2xkLgotCi1UaGVyZSBhcmUgc2V2ZXJhbCBHTlUgZXh0ZW5zaW9ucyB0byBTdW4ncyB2ZXJzaW9uaW5nIGFwcHJvYWNoLiAgVGhlCi1maXJzdCBvZiB0aGVzZSBpcyB0aGUgYWJpbGl0eSB0byBiaW5kIGEgc3ltYm9sIHRvIGEgdmVyc2lvbiBub2RlIGluIHRoZQotc291cmNlIGZpbGUgd2hlcmUgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluc3RlYWQgb2YgaW4gdGhlIHZlcnNpb25pbmcKLXNjcmlwdC4gIFRoaXMgd2FzIGRvbmUgbWFpbmx5IHRvIHJlZHVjZSB0aGUgYnVyZGVuIG9uIHRoZSBsaWJyYXJ5Ci1tYWludGFpbmVyLiAgWW91IGNhbiBkbyB0aGlzIGJ5IHB1dHRpbmcgc29tZXRoaW5nIGxpa2U6Ci1Ac21hbGxleGFtcGxlCi1fX2FzbV9fKCIuc3ltdmVyIG9yaWdpbmFsX2Zvbyxmb29AQFZFUlNfMS4xIik7Ci1AZW5kIHNtYWxsZXhhbXBsZQotQG5vaW5kZW50Ci1pbiB0aGUgQyBzb3VyY2UgZmlsZS4gIFRoaXMgcmVuYW1lcyB0aGUgZnVuY3Rpb24gQHNhbXB7b3JpZ2luYWxfZm9vfSB0bwotYmUgYW4gYWxpYXMgZm9yIEBzYW1we2Zvb30gYm91bmQgdG8gdGhlIHZlcnNpb24gbm9kZSBAc2FtcHtWRVJTXzEuMX0uCi1UaGUgQHNhbXB7bG9jYWw6fSBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gcHJldmVudCB0aGUgc3ltYm9sCi1Ac2FtcHtvcmlnaW5hbF9mb299IGZyb20gYmVpbmcgZXhwb3J0ZWQuCi0KLVRoZSBzZWNvbmQgR05VIGV4dGVuc2lvbiBpcyB0byBhbGxvdyBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZQotZnVuY3Rpb24gdG8gYXBwZWFyIGluIGEgZ2l2ZW4gc2hhcmVkIGxpYnJhcnkuICBJbiB0aGlzIHdheSB5b3UgY2FuIG1ha2UKLWFuIGluY29tcGF0aWJsZSBjaGFuZ2UgdG8gYW4gaW50ZXJmYWNlIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgbWFqb3IKLXZlcnNpb24gbnVtYmVyIG9mIHRoZSBzaGFyZWQgbGlicmFyeSwgd2hpbGUgc3RpbGwgYWxsb3dpbmcgYXBwbGljYXRpb25zCi1saW5rZWQgYWdhaW5zdCB0aGUgb2xkIGludGVyZmFjZSB0byBjb250aW51ZSB0byBmdW5jdGlvbi4KLQotVG8gZG8gdGhpcywgeW91IG11c3QgdXNlIG11bHRpcGxlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZXMgaW4gdGhlCi1zb3VyY2UgZmlsZS4gIEhlcmUgaXMgYW4gZXhhbXBsZToKLQotQHNtYWxsZXhhbXBsZQotX19hc21fXygiLnN5bXZlciBvcmlnaW5hbF9mb28sZm9vQEAiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28xLGZvb0BAVkVSU18xLjIiKTsKLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQEBAVkVSU18yLjAiKTsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUluIHRoaXMgZXhhbXBsZSwgQHNhbXB7Zm9vQEB9IHJlcHJlc2VudHMgdGhlIHN5bWJvbCBAc2FtcHtmb299IGJvdW5kIHRvIHRoZQotdW5zcGVjaWZpZWQgYmFzZSB2ZXJzaW9uIG9mIHRoZSBzeW1ib2wuICBUaGUgc291cmNlIGZpbGUgdGhhdCBjb250YWlucyB0aGlzCi1leGFtcGxlIHdvdWxkIGRlZmluZSA0IEMgZnVuY3Rpb25zOiBAc2FtcHtvcmlnaW5hbF9mb299LCBAc2FtcHtvbGRfZm9vfSwKLUBzYW1we29sZF9mb28xfSwgYW5kIEBzYW1we25ld19mb299LgotCi1XaGVuIHlvdSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIGEgZ2l2ZW4gc3ltYm9sLCB0aGVyZSBuZWVkcyB0byBiZQotc29tZSB3YXkgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmVyc2lvbiB0byB3aGljaCBleHRlcm5hbCByZWZlcmVuY2VzIHRvCi10aGlzIHN5bWJvbCB3aWxsIGJlIGJvdW5kLiAgWW91IGNhbiBkbyB0aGlzIHdpdGggdGhlCi1Ac2FtcHtmb29AQEBAVkVSU18yLjB9IHR5cGUgb2YgQHNhbXB7LnN5bXZlcn0gZGlyZWN0aXZlLiAgWW91IGNhbiBvbmx5Ci1kZWNsYXJlIG9uZSB2ZXJzaW9uIG9mIGEgc3ltYm9sIGFzIHRoZSBkZWZhdWx0IGluIHRoaXMgbWFubmVyOyBvdGhlcndpc2UKLXlvdSB3b3VsZCBlZmZlY3RpdmVseSBoYXZlIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHN5bWJvbC4KLQotSWYgeW91IHdpc2ggdG8gYmluZCBhIHJlZmVyZW5jZSB0byBhIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIHN5bWJvbAotd2l0aGluIHRoZSBzaGFyZWQgbGlicmFyeSwgeW91IGNhbiB1c2UgdGhlIGFsaWFzZXMgb2YgY29udmVuaWVuY2UKLShpLmUuIEBzYW1we29sZF9mb299KSwgb3IgeW91IGNhbiB1c2UgdGhlIEBzYW1wey5zeW12ZXJ9IGRpcmVjdGl2ZSB0bwotc3BlY2lmaWNhbGx5IGJpbmQgdG8gYW4gZXh0ZXJuYWwgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24uCi0KLUBub2RlIEV4cHJlc3Npb25zCi1Ac2VjdGlvbiBFeHByZXNzaW9ucyBpbiBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBleHByZXNzaW9ucwotQGNpbmRleCBhcml0aG1ldGljCi1UaGUgc3ludGF4IGZvciBleHByZXNzaW9ucyBpbiB0aGUgbGlua2VyIHNjcmlwdCBsYW5ndWFnZSBpcyBpZGVudGljYWwgdG8KLXRoYXQgb2YgQyBleHByZXNzaW9ucy4gIEFsbCBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGFzIGludGVnZXJzLiAgQWxsCi1leHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGluIHRoZSBzYW1lIHNpemUsIHdoaWNoIGlzIDMyIGJpdHMgaWYgYm90aCB0aGUKLWhvc3QgYW5kIHRhcmdldCBhcmUgMzIgYml0cywgYW5kIGlzIG90aGVyd2lzZSA2NCBiaXRzLgotCi1Zb3UgY2FuIHVzZSBhbmQgc2V0IHN5bWJvbCB2YWx1ZXMgaW4gZXhwcmVzc2lvbnMuCi0KLVRoZSBsaW5rZXIgZGVmaW5lcyBzZXZlcmFsIHNwZWNpYWwgcHVycG9zZSBidWlsdGluIGZ1bmN0aW9ucyBmb3IgdXNlIGluCi1leHByZXNzaW9ucy4KLQotQG1lbnUKLSogQ29uc3RhbnRzOjoJCQlDb25zdGFudHMKLSogU3ltYm9sczo6CQkJU3ltYm9sIE5hbWVzCi0qIExvY2F0aW9uIENvdW50ZXI6OgkJVGhlIExvY2F0aW9uIENvdW50ZXIKLSogT3BlcmF0b3JzOjoJCQlPcGVyYXRvcnMKLSogRXZhbHVhdGlvbjo6CQkJRXZhbHVhdGlvbgotKiBFeHByZXNzaW9uIFNlY3Rpb246OgkJVGhlIFNlY3Rpb24gb2YgYW4gRXhwcmVzc2lvbgotKiBCdWlsdGluIEZ1bmN0aW9uczo6CQlCdWlsdGluIEZ1bmN0aW9ucwotQGVuZCBtZW51Ci0KLUBub2RlIENvbnN0YW50cwotQHN1YnNlY3Rpb24gQ29uc3RhbnRzCi1AY2luZGV4IGludGVnZXIgbm90YXRpb24KLUBjaW5kZXggY29uc3RhbnRzIGluIGxpbmtlciBzY3JpcHRzCi1BbGwgY29uc3RhbnRzIGFyZSBpbnRlZ2Vycy4KLQotQXMgaW4gQywgdGhlIGxpbmtlciBjb25zaWRlcnMgYW4gaW50ZWdlciBiZWdpbm5pbmcgd2l0aCBAc2FtcHswfSB0byBiZQotb2N0YWwsIGFuZCBhbiBpbnRlZ2VyIGJlZ2lubmluZyB3aXRoIEBzYW1wezB4fSBvciBAc2FtcHswWH0gdG8gYmUKLWhleGFkZWNpbWFsLiAgVGhlIGxpbmtlciBjb25zaWRlcnMgb3RoZXIgaW50ZWdlcnMgdG8gYmUgZGVjaW1hbC4KLQotQGNpbmRleCBzY2FsZWQgaW50ZWdlcnMKLUBjaW5kZXggSyBhbmQgTSBpbnRlZ2VyIHN1ZmZpeGVzCi1AY2luZGV4IE0gYW5kIEsgaW50ZWdlciBzdWZmaXhlcwotQGNpbmRleCBzdWZmaXhlcyBmb3IgaW50ZWdlcnMKLUBjaW5kZXggaW50ZWdlciBzdWZmaXhlcwotSW4gYWRkaXRpb24sIHlvdSBjYW4gdXNlIHRoZSBzdWZmaXhlcyBAY29kZXtLfSBhbmQgQGNvZGV7TX0gdG8gc2NhbGUgYQotY29uc3RhbnQgYnkKLUBjIFRFWEkyUk9GRi1LSUxMCi1AaWZpbmZvCi1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLUBjb2RlezEwMjR9IG9yIEBjb2RlezEwMjQqMTAyNH0KLUBjIFRFWEkyUk9GRi1LSUxMCi1AZW5kIGlmaW5mbwotQHRleAotJHtccm0gMTAyNH0kIG9yICR7XHJtIDEwMjR9XjIkCi1AZW5kIHRleAotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1yZXNwZWN0aXZlbHkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGFsbCByZWZlciB0byB0aGUgc2FtZSBxdWFudGl0eToKLUBzbWFsbGV4YW1wbGUKLSAgX2ZvdXJrXzEgPSA0SzsKLSAgX2ZvdXJrXzIgPSA0MDk2OwotICBfZm91cmtfMyA9IDB4MTAwMDsKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBub2RlIFN5bWJvbHMKLUBzdWJzZWN0aW9uIFN5bWJvbCBOYW1lcwotQGNpbmRleCBzeW1ib2wgbmFtZXMKLUBjaW5kZXggbmFtZXMKLUBjaW5kZXggcXVvdGVkIHN5bWJvbCBuYW1lcwotQGtpbmRleCAiCi1Vbmxlc3MgcXVvdGVkLCBzeW1ib2wgbmFtZXMgc3RhcnQgd2l0aCBhIGxldHRlciwgdW5kZXJzY29yZSwgb3IgcGVyaW9kCi1hbmQgbWF5IGluY2x1ZGUgbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgcGVyaW9kcywgYW5kIGh5cGhlbnMuCi1VbnF1b3RlZCBzeW1ib2wgbmFtZXMgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbnkga2V5d29yZHMuICBZb3UgY2FuCi1zcGVjaWZ5IGEgc3ltYm9sIHdoaWNoIGNvbnRhaW5zIG9kZCBjaGFyYWN0ZXJzIG9yIGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEKLWtleXdvcmQgYnkgc3Vycm91bmRpbmcgdGhlIHN5bWJvbCBuYW1lIGluIGRvdWJsZSBxdW90ZXM6Ci1Ac21hbGxleGFtcGxlCi0gICJTRUNUSU9OIiA9IDk7Ci0gICJ3aXRoIGEgc3BhY2UiID0gImFsc28gd2l0aCBhIHNwYWNlIiArIDEwOwotQGVuZCBzbWFsbGV4YW1wbGUKLQotU2luY2Ugc3ltYm9scyBjYW4gY29udGFpbiBtYW55IG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMsIGl0IGlzIHNhZmVzdAotdG8gZGVsaW1pdCBzeW1ib2xzIHdpdGggc3BhY2VzLiAgRm9yIGV4YW1wbGUsIEBzYW1we0EtQn0gaXMgb25lIHN5bWJvbCwKLXdoZXJlYXMgQHNhbXB7QSAtIEJ9IGlzIGFuIGV4cHJlc3Npb24gaW52b2x2aW5nIHN1YnRyYWN0aW9uLgotCi1Abm9kZSBMb2NhdGlvbiBDb3VudGVyCi1Ac3Vic2VjdGlvbiBUaGUgTG9jYXRpb24gQ291bnRlcgotQGtpbmRleCAuCi1AY2luZGV4IGRvdAotQGNpbmRleCBsb2NhdGlvbiBjb3VudGVyCi1AY2luZGV4IGN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uCi1UaGUgc3BlY2lhbCBsaW5rZXIgdmFyaWFibGUgQGRmbntkb3R9IEBzYW1wey59IGFsd2F5cyBjb250YWlucyB0aGUKLWN1cnJlbnQgb3V0cHV0IGxvY2F0aW9uIGNvdW50ZXIuICBTaW5jZSB0aGUgQGNvZGV7Ln0gYWx3YXlzIHJlZmVycyB0byBhCi1sb2NhdGlvbiBpbiBhbiBvdXRwdXQgc2VjdGlvbiwgaXQgbWF5IG9ubHkgYXBwZWFyIGluIGFuIGV4cHJlc3Npb24KLXdpdGhpbiBhIEBjb2Rle1NFQ1RJT05TfSBjb21tYW5kLiAgVGhlIEBjb2Rley59IHN5bWJvbCBtYXkgYXBwZWFyCi1hbnl3aGVyZSB0aGF0IGFuIG9yZGluYXJ5IHN5bWJvbCBpcyBhbGxvd2VkIGluIGFuIGV4cHJlc3Npb24uCi0KLUBjaW5kZXggaG9sZXMKLUFzc2lnbmluZyBhIHZhbHVlIHRvIEBjb2Rley59IHdpbGwgY2F1c2UgdGhlIGxvY2F0aW9uIGNvdW50ZXIgdG8gYmUKLW1vdmVkLiAgVGhpcyBtYXkgYmUgdXNlZCB0byBjcmVhdGUgaG9sZXMgaW4gdGhlIG91dHB1dCBzZWN0aW9uLiAgVGhlCi1sb2NhdGlvbiBjb3VudGVyIG1heSBuZXZlciBiZSBtb3ZlZCBiYWNrd2FyZHMuCi0KLUBzbWFsbGV4YW1wbGUKLVNFQ1RJT05TCi1AewotICBvdXRwdXQgOgotICAgIEB7Ci0gICAgICBmaWxlMSgudGV4dCkKLSAgICAgIC4gPSAuICsgMTAwMDsKLSAgICAgIGZpbGUyKC50ZXh0KQotICAgICAgLiArPSAxMDAwOwotICAgICAgZmlsZTMoLnRleHQpCi0gICAgQH0gPSAweDEyMzQ7Ci1AfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSW4gdGhlIHByZXZpb3VzIGV4YW1wbGUsIHRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUxfSBpcwotbG9jYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgc2VjdGlvbiBAc2FtcHtvdXRwdXR9LiAgSXQgaXMKLWZvbGxvd2VkIGJ5IGEgMTAwMCBieXRlIGdhcC4gIFRoZW4gdGhlIEBzYW1wey50ZXh0fSBzZWN0aW9uIGZyb20KLUBmaWxle2ZpbGUyfSBhcHBlYXJzLCBhbHNvIHdpdGggYSAxMDAwIGJ5dGUgZ2FwIGZvbGxvd2luZyBiZWZvcmUgdGhlCi1Ac2FtcHsudGV4dH0gc2VjdGlvbiBmcm9tIEBmaWxle2ZpbGUzfS4gIFRoZSBub3RhdGlvbiBAc2FtcHs9IDB4MTIzNH0KLXNwZWNpZmllcyB3aGF0IGRhdGEgdG8gd3JpdGUgaW4gdGhlIGdhcHMgKEBweHJlZntPdXRwdXQgU2VjdGlvbiBGaWxsfSkuCi0KLUBjaW5kZXggZG90IGluc2lkZSBzZWN0aW9ucwotTm90ZTogQGNvZGV7Ln0gYWN0dWFsbHkgcmVmZXJzIHRvIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUKLWN1cnJlbnQgY29udGFpbmluZyBvYmplY3QuICBOb3JtYWxseSB0aGlzIGlzIHRoZSBAY29kZXtTRUNUSU9OU30KLXN0YXRlbWVudCwgd2hvZXMgc3RhcnQgYWRkcmVzcyBpcyAwLCBoZW5jZSBAY29kZXsufSBjYW4gYmUgdXNlZCBhcyBhbgotYWJzb2x1dGUgYWRkcmVzcy4gIElmIEBjb2Rley59IGlzIHVzZWQgaW5zaWRlIGEgc2VjdGlvbiBkZXNjcmlwdGlvbgotaG93ZXZlciwgaXQgcmVmZXJzIHRvIHRoZSBieXRlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGF0IHNlY3Rpb24sCi1ub3QgYW4gYWJzb2x1dGUgYWRkcmVzcy4gIFRodXMgaW4gYSBzY3JpcHQgbGlrZSB0aGlzOgotCi1Ac21hbGxleGFtcGxlCi1TRUNUSU9OUwotQHsKLSAgICAuID0gMHgxMDAKLSAgICAudGV4dDogQHsKLSAgICAgICooLnRleHQpCi0gICAgICAuID0gMHgyMDAKLSAgICBAfQotICAgIC4gPSAweDUwMAotICAgIC5kYXRhOiBAewotICAgICAgKiguZGF0YSkKLSAgICAgIC4gKz0gMHg2MDAKLSAgICBAfQotQH0KLUBlbmQgc21hbGxleGFtcGxlCi0KLVRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbiB3aWxsIGJlIGFzc2lnbmVkIGEgc3RhcnRpbmcgYWRkcmVzcyBvZiAweDEwMAotYW5kIGEgc2l6ZSBvZiBleGFjdGx5IDB4MjAwIGJ5dGVzLCBldmVuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggZGF0YSBpbgotdGhlIEBzYW1wey50ZXh0fSBpbnB1dCBzZWN0aW9ucyB0byBmaWxsIHRoaXMgYXJlYS4gIChJZiB0aGVyZSBpcyB0b28KLW11Y2ggZGF0YSwgYW4gZXJyb3Igd2lsbCBiZSBwcm9kdWNlZCBiZWNhdXNlIHRoaXMgd291bGQgYmUgYW4gYXR0ZW1wdCB0bwotbW92ZSBAY29kZXsufSBiYWNrd2FyZHMpLiAgVGhlIEBzYW1wey5kYXRhfSBzZWN0aW9uIHdpbGwgc3RhcnQgYXQgMHg1MDAKLWFuZCBpdCB3aWxsIGhhdmUgYW4gZXh0cmEgMHg2MDAgYnl0ZXMgd29ydGggb2Ygc3BhY2UgYWZ0ZXIgdGhlIGVuZCBvZgotdGhlIHZhbHVlcyBmcm9tIHRoZSBAc2FtcHsuZGF0YX0gaW5wdXQgc2VjdGlvbnMgYW5kIGJlZm9yZSB0aGUgZW5kIG9mCi10aGUgQHNhbXB7LmRhdGF9IG91dHB1dCBzZWN0aW9uIGl0c2VsZi4KLQotQG5lZWQgMjAwMAotQG5vZGUgT3BlcmF0b3JzCi1Ac3Vic2VjdGlvbiBPcGVyYXRvcnMKLUBjaW5kZXggb3BlcmF0b3JzIGZvciBhcml0aG1ldGljCi1AY2luZGV4IGFyaXRobWV0aWMgb3BlcmF0b3JzCi1AY2luZGV4IHByZWNlZGVuY2UgaW4gZXhwcmVzc2lvbnMKLVRoZSBsaW5rZXIgcmVjb2duaXplcyB0aGUgc3RhbmRhcmQgQyBzZXQgb2YgYXJpdGhtZXRpYyBvcGVyYXRvcnMsIHdpdGgKLXRoZSBzdGFuZGFyZCBiaW5kaW5ncyBhbmQgcHJlY2VkZW5jZSBsZXZlbHM6Ci1AYyBURVhJMlJPRkYtS0lMTAotQGlmaW5mbwotQGMgRU5EIFRFWEkyUk9GRi1LSUxMCi1Ac21hbGxleGFtcGxlCi1wcmVjZWRlbmNlICAgICAgYXNzb2NpYXRpdml0eSAgIE9wZXJhdG9ycyAgICAgICAgICAgICAgICBOb3RlcwotKGhpZ2hlc3QpCi0xICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgICEgIC0gIH4gICAgICAgICAgICAgICAgICAoMSkKLTIgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgKiAgLyAgJQotMyAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICArICAtCi00ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgID4+ICA8PAotNSAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICA9PSAgIT0gID4gIDwgIDw9ICA+PQotNiAgICAgICAgICAgICAgIGxlZnQgICAgICAgICAgICAmCi03ICAgICAgICAgICAgICAgbGVmdCAgICAgICAgICAgIHwKLTggICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgJiYKLTkgICAgICAgICAgICAgICBsZWZ0ICAgICAgICAgICAgfHwKLTEwICAgICAgICAgICAgICByaWdodCAgICAgICAgICAgPyA6Ci0xMSAgICAgICAgICAgICAgcmlnaHQgICAgICAgICAgICY9ICArPSAgLT0gICo9ICAvPSAgICAgICAoMikKLShsb3dlc3QpCi1AZW5kIHNtYWxsZXhhbXBsZQotTm90ZXM6Ci0oMSkgUHJlZml4IG9wZXJhdG9ycyAKLSgyKSBAeHJlZntBc3NpZ25tZW50c30uCi1AYyBURVhJMlJPRkYtS0lMTAotQGVuZCBpZmluZm8KLUB0ZXgKLVx2c2tpcCBcYmFzZWxpbmVza2lwCi0lImxpc3BuYXJyb3dpbmciIGlzIHRoZSBleHRyYSBpbmRlbnQgdXNlZCBnZW5lcmFsbHkgZm9yIHNtYWxsZXhhbXBsZQotXGhza2lwXGxpc3BuYXJyb3dpbmdcdmJveHtcb2ZmaW50ZXJsaW5lc2tpcAotXGhydWxlCi1caGFsaWduCi17XHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwgI1wgXGhmaWwmXHZydWxlIyZcc3RydXRcaGZpbFwge1x0dCAjfVwgXGhmaWwmXHZydWxlI1xjcgotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0mUHJlY2VkZW5jZSYmICBBc3NvY2lhdGl2aXR5ICAmJntccm0gT3BlcmF0b3JzfSZcY3IKLWhlaWdodDJwdCZcb21pdCYmXG9taXQmJlxvbWl0JlxjcgotXG5vYWxpZ257XGhydWxlfQotaGVpZ2h0MnB0JlxvbWl0JiZcb21pdCYmXG9taXQmXGNyCi0maGlnaGVzdCYmJiYmXGNyCi0lICcxNzYgaXMgdGlsZGUsICd+JyBpbiB0dCBmb250Ci0mMSYmbGVmdCYmXHFxdWFkLSAgICAgICAgICBcY2hhcicxNzZcICAgICAgIVxxcXVhZFxkYWcmXGNyIAotJjImJmxlZnQmJiogICAgICAgICAgLyAgICAgICAgXCUmXGNyCi0mMyYmbGVmdCYmKyAgICAgICAgICAtJlxjcgotJjQmJmxlZnQmJj4+ICAgICAgICAgPDwmXGNyCi0mNSYmbGVmdCYmPT0gICAgICAgICAhPSAgICAgICA+ICAgICAgPCAgICAgIDw9ICAgICAgPj0mXGNyCi0mNiYmbGVmdCYmXCYmXGNyCi0mNyYmbGVmdCYmfCZcY3IKLSY4JiZsZWZ0JiZ7XCZcJn0mXGNyCi0mOSYmbGVmdCYmfHwmXGNyCi0mMTAmJnJpZ2h0JiY/ICAgICAgICA6JlxjcgotJjExJiZyaWdodCYmXHFxdWFkXCY9ICAgICAgKz0gICAgICAgLT0gICAgICo9ICAgICAvPVxxcXVhZFxkZGFnJlxjcgotJmxvd2VzdCYmJiYmXGNyCi1oZWlnaHQycHQmXG9taXQmJlxvbWl0JiZcb21pdCZcY3J9Ci1caHJ1bGV9Ci1AZW5kIHRleAotQGlmdGV4Ci17Ci1Ab2JleWxpbmVzQHBhcnNraXA9MHB0QHBhcmluZGVudD0wcHQKLUBkYWdAcXVhZCBQcmVmaXggb3BlcmF0b3JzLgotQGRkYWdAcXVhZCBAeHJlZntBc3NpZ25tZW50c30uCi19Ci1AZW5kIGlmdGV4Ci1AYyBFTkQgVEVYSTJST0ZGLUtJTEwKLQotQG5vZGUgRXZhbHVhdGlvbgotQHN1YnNlY3Rpb24gRXZhbHVhdGlvbgotQGNpbmRleCBsYXp5IGV2YWx1YXRpb24KLUBjaW5kZXggZXhwcmVzc2lvbiBldmFsdWF0aW9uIG9yZGVyCi1UaGUgbGlua2VyIGV2YWx1YXRlcyBleHByZXNzaW9ucyBsYXppbHkuICBJdCBvbmx5IGNvbXB1dGVzIHRoZSB2YWx1ZSBvZgotYW4gZXhwcmVzc2lvbiB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5LgotCi1UaGUgbGlua2VyIG5lZWRzIHNvbWUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlIHZhbHVlIG9mIHRoZSBzdGFydAotYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgYW5kIHRoZSBvcmlnaW5zIGFuZCBsZW5ndGhzIG9mIG1lbW9yeQotcmVnaW9ucywgaW4gb3JkZXIgdG8gZG8gYW55IGxpbmtpbmcgYXQgYWxsLiAgVGhlc2UgdmFsdWVzIGFyZSBjb21wdXRlZAotYXMgc29vbiBhcyBwb3NzaWJsZSB3aGVuIHRoZSBsaW5rZXIgcmVhZHMgaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUhvd2V2ZXIsIG90aGVyIHZhbHVlcyAoc3VjaCBhcyBzeW1ib2wgdmFsdWVzKSBhcmUgbm90IGtub3duIG9yIG5lZWRlZAotdW50aWwgYWZ0ZXIgc3RvcmFnZSBhbGxvY2F0aW9uLiAgU3VjaCB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBsYXRlciwgd2hlbgotb3RoZXIgaW5mb3JtYXRpb24gKHN1Y2ggYXMgdGhlIHNpemVzIG9mIG91dHB1dCBzZWN0aW9ucykgaXMgYXZhaWxhYmxlCi1mb3IgdXNlIGluIHRoZSBzeW1ib2wgYXNzaWdubWVudCBleHByZXNzaW9uLgotCi1UaGUgc2l6ZXMgb2Ygc2VjdGlvbnMgY2Fubm90IGJlIGtub3duIHVudGlsIGFmdGVyIGFsbG9jYXRpb24sIHNvCi1hc3NpZ25tZW50cyBkZXBlbmRlbnQgdXBvbiB0aGVzZSBhcmUgbm90IHBlcmZvcm1lZCB1bnRpbCBhZnRlcgotYWxsb2NhdGlvbi4KLQotU29tZSBleHByZXNzaW9ucywgc3VjaCBhcyB0aG9zZSBkZXBlbmRpbmcgdXBvbiB0aGUgbG9jYXRpb24gY291bnRlcgotQHNhbXB7Ln0sIG11c3QgYmUgZXZhbHVhdGVkIGR1cmluZyBzZWN0aW9uIGFsbG9jYXRpb24uCi0KLUlmIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbiBpcyByZXF1aXJlZCwgYnV0IHRoZSB2YWx1ZSBpcyBub3QKLWF2YWlsYWJsZSwgdGhlbiBhbiBlcnJvciByZXN1bHRzLiAgRm9yIGV4YW1wbGUsIGEgc2NyaXB0IGxpa2UgdGhlCi1mb2xsb3dpbmcKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMKLSAgQHsKLSAgICAudGV4dCA5K3RoaXNfaXNudF9jb25zdGFudCA6IAotICAgICAgQHsgKigudGV4dCkgQH0KLSAgQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi1Abm9pbmRlbnQKLXdpbGwgY2F1c2UgdGhlIGVycm9yIG1lc3NhZ2UgQHNhbXB7bm9uIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yIGluaXRpYWwKLWFkZHJlc3N9LgotCi1Abm9kZSBFeHByZXNzaW9uIFNlY3Rpb24KLUBzdWJzZWN0aW9uIFRoZSBTZWN0aW9uIG9mIGFuIEV4cHJlc3Npb24KLUBjaW5kZXggZXhwcmVzc2lvbiBzZWN0aW9ucwotQGNpbmRleCBhYnNvbHV0ZSBleHByZXNzaW9ucwotQGNpbmRleCByZWxhdGl2ZSBleHByZXNzaW9ucwotQGNpbmRleCBhYnNvbHV0ZSBhbmQgcmVsb2NhdGFibGUgc3ltYm9scwotQGNpbmRleCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUgc3ltYm9scwotQGNpbmRleCBzeW1ib2xzLCByZWxvY2F0YWJsZSBhbmQgYWJzb2x1dGUKLVdoZW4gdGhlIGxpbmtlciBldmFsdWF0ZXMgYW4gZXhwcmVzc2lvbiwgdGhlIHJlc3VsdCBpcyBlaXRoZXIgYWJzb2x1dGUKLW9yIHJlbGF0aXZlIHRvIHNvbWUgc2VjdGlvbi4gIEEgcmVsYXRpdmUgZXhwcmVzc2lvbiBpcyBleHByZXNzZWQgYXMgYQotZml4ZWQgb2Zmc2V0IGZyb20gdGhlIGJhc2Ugb2YgYSBzZWN0aW9uLgotCi1UaGUgcG9zaXRpb24gb2YgdGhlIGV4cHJlc3Npb24gd2l0aGluIHRoZSBsaW5rZXIgc2NyaXB0IGRldGVybWluZXMKLXdoZXRoZXIgaXQgaXMgYWJzb2x1dGUgb3IgcmVsYXRpdmUuICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgd2l0aGluCi1hbiBvdXRwdXQgc2VjdGlvbiBkZWZpbml0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24uICBBbiBleHByZXNzaW9uIHdoaWNoIGFwcGVhcnMgZWxzZXdoZXJlIHdpbGwgYmUgYWJzb2x1dGUuCi0KLUEgc3ltYm9sIHNldCB0byBhIHJlbGF0aXZlIGV4cHJlc3Npb24gd2lsbCBiZSByZWxvY2F0YWJsZSBpZiB5b3UgcmVxdWVzdAotcmVsb2NhdGFibGUgb3V0cHV0IHVzaW5nIHRoZSBAc2FtcHstcn0gb3B0aW9uLiAgVGhhdCBtZWFucyB0aGF0IGEKLWZ1cnRoZXIgbGluayBvcGVyYXRpb24gbWF5IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbC4gIFRoZSBzeW1ib2wncwotc2VjdGlvbiB3aWxsIGJlIHRoZSBzZWN0aW9uIG9mIHRoZSByZWxhdGl2ZSBleHByZXNzaW9uLgotCi1BIHN5bWJvbCBzZXQgdG8gYW4gYWJzb2x1dGUgZXhwcmVzc2lvbiB3aWxsIHJldGFpbiB0aGUgc2FtZSB2YWx1ZQotdGhyb3VnaCBhbnkgZnVydGhlciBsaW5rIG9wZXJhdGlvbi4gIFRoZSBzeW1ib2wgd2lsbCBiZSBhYnNvbHV0ZSwgYW5kCi13aWxsIG5vdCBoYXZlIGFueSBwYXJ0aWN1bGFyIGFzc29jaWF0ZWQgc2VjdGlvbi4KLQotWW91IGNhbiB1c2UgdGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7QUJTT0xVVEV9IHRvIGZvcmNlIGFuIGV4cHJlc3Npb24KLXRvIGJlIGFic29sdXRlIHdoZW4gaXQgd291bGQgb3RoZXJ3aXNlIGJlIHJlbGF0aXZlLiAgRm9yIGV4YW1wbGUsIHRvCi1jcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW5kIG9mIHRoZSBvdXRwdXQKLXNlY3Rpb24gQHNhbXB7LmRhdGF9OgotQHNtYWxsZXhhbXBsZQotU0VDVElPTlMKLSAgQHsKLSAgICAuZGF0YSA6IEB7ICooLmRhdGEpIF9lZGF0YSA9IEFCU09MVVRFKC4pOyBAfQotICBAfQotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotSWYgQHNhbXB7QUJTT0xVVEV9IHdlcmUgbm90IHVzZWQsIEBzYW1we19lZGF0YX0gd291bGQgYmUgcmVsYXRpdmUgdG8gdGhlCi1Ac2FtcHsuZGF0YX0gc2VjdGlvbi4KLQotQG5vZGUgQnVpbHRpbiBGdW5jdGlvbnMKLUBzdWJzZWN0aW9uIEJ1aWx0aW4gRnVuY3Rpb25zCi1AY2luZGV4IGZ1bmN0aW9ucyBpbiBleHByZXNzaW9ucwotVGhlIGxpbmtlciBzY3JpcHQgbGFuZ3VhZ2UgaW5jbHVkZXMgYSBudW1iZXIgb2YgYnVpbHRpbiBmdW5jdGlvbnMgZm9yCi11c2UgaW4gbGlua2VyIHNjcmlwdCBleHByZXNzaW9ucy4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBBQlNPTFVURShAdmFye2V4cH0pCi1Aa2luZGV4IEFCU09MVVRFKEB2YXJ7ZXhwfSkKLUBjaW5kZXggZXhwcmVzc2lvbiwgYWJzb2x1dGUKLVJldHVybiB0aGUgYWJzb2x1dGUgKG5vbi1yZWxvY2F0YWJsZSwgYXMgb3Bwb3NlZCB0byBub24tbmVnYXRpdmUpIHZhbHVlCi1vZiB0aGUgZXhwcmVzc2lvbiBAdmFye2V4cH0uICBQcmltYXJpbHkgdXNlZnVsIHRvIGFzc2lnbiBhbiBhYnNvbHV0ZQotdmFsdWUgdG8gYSBzeW1ib2wgd2l0aGluIGEgc2VjdGlvbiBkZWZpbml0aW9uLCB3aGVyZSBzeW1ib2wgdmFsdWVzIGFyZQotbm9ybWFsbHkgc2VjdGlvbiByZWxhdGl2ZS4gIEB4cmVme0V4cHJlc3Npb24gU2VjdGlvbn0uCi0KLUBpdGVtIEFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggQUREUihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBhZGRyZXNzICh0aGUgVk1BKSBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufS4gIFlvdXIKLXNjcmlwdCBtdXN0IHByZXZpb3VzbHkgaGF2ZSBkZWZpbmVkIHRoZSBsb2NhdGlvbiBvZiB0aGF0IHNlY3Rpb24uICBJbgotdGhlIGZvbGxvd2luZyBleGFtcGxlLCBAY29kZXtzeW1ib2xfMX0gYW5kIEBjb2Rle3N5bWJvbF8yfSBhcmUgYXNzaWduZWQKLWlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TIEB7IEBkb3Rze30KLSAgLm91dHB1dDEgOgotICAgIEB7IAotICAgIHN0YXJ0X29mX291dHB1dF8xID0gQUJTT0xVVEUoLik7Ci0gICAgQGRvdHN7fQotICAgIEB9Ci0gIC5vdXRwdXQgOgotICAgIEB7Ci0gICAgc3ltYm9sXzEgPSBBRERSKC5vdXRwdXQxKTsKLSAgICBzeW1ib2xfMiA9IHN0YXJ0X29mX291dHB1dF8xOwotICAgIEB9Ci1AZG90c3t9IEB9Ci1AZW5kIGdyb3VwCi1AZW5kIHNtYWxsZXhhbXBsZQotCi1AaXRlbSBBTElHTihAdmFye2V4cH0pCi1Aa2luZGV4IEFMSUdOKEB2YXJ7ZXhwfSkKLUBjaW5kZXggcm91bmQgdXAgbG9jYXRpb24gY291bnRlcgotQGNpbmRleCBhbGlnbiBsb2NhdGlvbiBjb3VudGVyCi1SZXR1cm4gdGhlIGxvY2F0aW9uIGNvdW50ZXIgKEBjb2Rley59KSBhbGlnbmVkIHRvIHRoZSBuZXh0IEB2YXJ7ZXhwfQotYm91bmRhcnkuICBAdmFye2V4cH0gbXVzdCBiZSBhbiBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGEgcG93ZXIgb2YKLXR3by4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotQHNtYWxsZXhhbXBsZQotKC4gKyBAdmFye2V4cH0gLSAxKSAmIH4oQHZhcntleHB9IC0gMSkKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBjb2Rle0FMSUdOfSBkb2Vzbid0IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGxvY2F0aW9uIGNvdW50ZXItLS1pdCBqdXN0Ci1kb2VzIGFyaXRobWV0aWMgb24gaXQuICBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggYWxpZ25zIHRoZSBvdXRwdXQKLUBjb2Rley5kYXRhfSBzZWN0aW9uIHRvIHRoZSBuZXh0IEBjb2RlezB4MjAwMH0gYnl0ZSBib3VuZGFyeSBhZnRlciB0aGUKLXByZWNlZGluZyBzZWN0aW9uIGFuZCBzZXRzIGEgdmFyaWFibGUgd2l0aGluIHRoZSBzZWN0aW9uIHRvIHRoZSBuZXh0Ci1AY29kZXsweDgwMDB9IGJvdW5kYXJ5IGFmdGVyIHRoZSBpbnB1dCBzZWN0aW9uczoKLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAuZGF0YSBBTElHTigweDIwMDApOiBAewotICAgICooLmRhdGEpCi0gICAgdmFyaWFibGUgPSBBTElHTigweDgwMDApOwotICBAfQotQGRvdHN7fSBAfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLUBub2luZGVudAotVGhlIGZpcnN0IHVzZSBvZiBAY29kZXtBTElHTn0gaW4gdGhpcyBleGFtcGxlIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YKLWEgc2VjdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgYXMgdGhlIG9wdGlvbmFsIEB2YXJ7YWRkcmVzc30gYXR0cmlidXRlIG9mCi1hIHNlY3Rpb24gZGVmaW5pdGlvbiAoQHB4cmVme091dHB1dCBTZWN0aW9uIEFkZHJlc3N9KS4gIFRoZSBzZWNvbmQgdXNlCi1vZiBAY29kZXtBTElHTn0gaXMgdXNlZCB0byBkZWZpbmVzIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbC4KLQotVGhlIGJ1aWx0aW4gZnVuY3Rpb24gQGNvZGV7TkVYVH0gaXMgY2xvc2VseSByZWxhdGVkIHRvIEBjb2Rle0FMSUdOfS4KLQotQGl0ZW0gQkxPQ0soQHZhcntleHB9KQotQGtpbmRleCBCTE9DSyhAdmFye2V4cH0pCi1UaGlzIGlzIGEgc3lub255bSBmb3IgQGNvZGV7QUxJR059LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIGxpbmtlcgotc2NyaXB0cy4gIEl0IGlzIG1vc3Qgb2Z0ZW4gc2VlbiB3aGVuIHNldHRpbmcgdGhlIGFkZHJlc3Mgb2YgYW4gb3V0cHV0Ci1zZWN0aW9uLgotCi1AaXRlbSBERUZJTkVEKEB2YXJ7c3ltYm9sfSkKLUBraW5kZXggREVGSU5FRChAdmFye3N5bWJvbH0pCi1AY2luZGV4IHN5bWJvbCBkZWZhdWx0cwotUmV0dXJuIDEgaWYgQHZhcntzeW1ib2x9IGlzIGluIHRoZSBsaW5rZXIgZ2xvYmFsIHN5bWJvbCB0YWJsZSBhbmQgaXMKLWRlZmluZWQsIG90aGVyd2lzZSByZXR1cm4gMC4gIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcHJvdmlkZQotZGVmYXVsdCB2YWx1ZXMgZm9yIHN5bWJvbHMuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBzY3JpcHQgZnJhZ21lbnQKLXNob3dzIGhvdyB0byBzZXQgYSBnbG9iYWwgc3ltYm9sIEBzYW1we2JlZ2lufSB0byB0aGUgZmlyc3QgbG9jYXRpb24gaW4KLXRoZSBAc2FtcHsudGV4dH0gc2VjdGlvbi0tLWJ1dCBpZiBhIHN5bWJvbCBjYWxsZWQgQHNhbXB7YmVnaW59IGFscmVhZHkKLWV4aXN0ZWQsIGl0cyB2YWx1ZSBpcyBwcmVzZXJ2ZWQ6Ci0KLUBzbWFsbGV4YW1wbGUKLUBncm91cAotU0VDVElPTlMgQHsgQGRvdHN7fQotICAudGV4dCA6IEB7Ci0gICAgYmVnaW4gPSBERUZJTkVEKGJlZ2luKSA/IGJlZ2luIDogLiA7Ci0gICAgQGRvdHN7fQotICBAfQotICBAZG90c3t9Ci1AfQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQGl0ZW0gTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBraW5kZXggTE9BREFERFIoQHZhcntzZWN0aW9ufSkKLUBjaW5kZXggc2VjdGlvbiBsb2FkIGFkZHJlc3MgaW4gZXhwcmVzc2lvbgotUmV0dXJuIHRoZSBhYnNvbHV0ZSBMTUEgb2YgdGhlIG5hbWVkIEB2YXJ7c2VjdGlvbn0uICBUaGlzIGlzIG5vcm1hbGx5Ci10aGUgc2FtZSBhcyBAY29kZXtBRERSfSwgYnV0IGl0IG1heSBiZSBkaWZmZXJlbnQgaWYgdGhlIEBjb2Rle0FUfQotYXR0cmlidXRlIGlzIHVzZWQgaW4gdGhlIG91dHB1dCBzZWN0aW9uIGRlZmluaXRpb24gKEBweHJlZntPdXRwdXQKLVNlY3Rpb24gTE1BfSkuCi0KLUBraW5kZXggTUFYCi1AaXRlbSBNQVgoQHZhcntleHAxfSwgQHZhcntleHAyfSkKLVJldHVybnMgdGhlIG1heGltdW0gb2YgQHZhcntleHAxfSBhbmQgQHZhcntleHAyfS4KLQotQGtpbmRleCBNSU4KLUBpdGVtIE1JTihAdmFye2V4cDF9LCBAdmFye2V4cDJ9KQotUmV0dXJucyB0aGUgbWluaW11bSBvZiBAdmFye2V4cDF9IGFuZCBAdmFye2V4cDJ9LgotCi1AaXRlbSBORVhUKEB2YXJ7ZXhwfSkKLUBraW5kZXggTkVYVChAdmFye2V4cH0pCi1AY2luZGV4IHVuYWxsb2NhdGVkIGFkZHJlc3MsIG5leHQKLVJldHVybiB0aGUgbmV4dCB1bmFsbG9jYXRlZCBhZGRyZXNzIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiBAdmFye2V4cH0uCi1UaGlzIGZ1bmN0aW9uIGlzIGNsb3NlbHkgcmVsYXRlZCB0byBAY29kZXtBTElHTihAdmFye2V4cH0pfTsgdW5sZXNzIHlvdQotdXNlIHRoZSBAY29kZXtNRU1PUll9IGNvbW1hbmQgdG8gZGVmaW5lIGRpc2NvbnRpbnVvdXMgbWVtb3J5IGZvciB0aGUKLW91dHB1dCBmaWxlLCB0aGUgdHdvIGZ1bmN0aW9ucyBhcmUgZXF1aXZhbGVudC4KLQotQGl0ZW0gU0laRU9GKEB2YXJ7c2VjdGlvbn0pCi1Aa2luZGV4IFNJWkVPRihAdmFye3NlY3Rpb259KQotQGNpbmRleCBzZWN0aW9uIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgbmFtZWQgQHZhcntzZWN0aW9ufSwgaWYgdGhhdCBzZWN0aW9uIGhhcwotYmVlbiBhbGxvY2F0ZWQuICBJZiB0aGUgc2VjdGlvbiBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHdoZW4gdGhpcyBpcwotZXZhbHVhdGVkLCB0aGUgbGlua2VyIHdpbGwgcmVwb3J0IGFuIGVycm9yLiAgSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLAotQGNvZGV7c3ltYm9sXzF9IGFuZCBAY29kZXtzeW1ib2xfMn0gYXJlIGFzc2lnbmVkIGlkZW50aWNhbCB2YWx1ZXM6Ci1Ac21hbGxleGFtcGxlCi1AZ3JvdXAKLVNFQ1RJT05TQHsgQGRvdHN7fQotICAub3V0cHV0IEB7Ci0gICAgLnN0YXJ0ID0gLiA7Ci0gICAgQGRvdHN7fQotICAgIC5lbmQgPSAuIDsKLSAgICBAfQotICBzeW1ib2xfMSA9IC5lbmQgLSAuc3RhcnQgOwotICBzeW1ib2xfMiA9IFNJWkVPRigub3V0cHV0KTsKLUBkb3Rze30gQH0KLUBlbmQgZ3JvdXAKLUBlbmQgc21hbGxleGFtcGxlCi0KLUBpdGVtIFNJWkVPRl9IRUFERVJTCi1AaXRlbXggc2l6ZW9mX2hlYWRlcnMKLUBraW5kZXggU0laRU9GX0hFQURFUlMKLUBjaW5kZXggaGVhZGVyIHNpemUKLVJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgb3V0cHV0IGZpbGUncyBoZWFkZXJzLiAgVGhpcyBpcwotaW5mb3JtYXRpb24gd2hpY2ggYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgdGhlIG91dHB1dCBmaWxlLiAgWW91IGNhbiB1c2UKLXRoaXMgbnVtYmVyIHdoZW4gc2V0dGluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2VjdGlvbiwgaWYgeW91Ci1jaG9vc2UsIHRvIGZhY2lsaXRhdGUgcGFnaW5nLgotCi1AY2luZGV4IG5vdCBlbm91Z2ggcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzCi1AY2luZGV4IHByb2dyYW0gaGVhZGVycywgbm90IGVub3VnaCByb29tCi1XaGVuIHByb2R1Y2luZyBhbiBFTEYgb3V0cHV0IGZpbGUsIGlmIHRoZSBsaW5rZXIgc2NyaXB0IHVzZXMgdGhlCi1AY29kZXtTSVpFT0ZfSEVBREVSU30gYnVpbHRpbiBmdW5jdGlvbiwgdGhlIGxpbmtlciBtdXN0IGNvbXB1dGUgdGhlCi1udW1iZXIgb2YgcHJvZ3JhbSBoZWFkZXJzIGJlZm9yZSBpdCBoYXMgZGV0ZXJtaW5lZCBhbGwgdGhlIHNlY3Rpb24KLWFkZHJlc3NlcyBhbmQgc2l6ZXMuICBJZiB0aGUgbGlua2VyIGxhdGVyIGRpc2NvdmVycyB0aGF0IGl0IG5lZWRzCi1hZGRpdGlvbmFsIHByb2dyYW0gaGVhZGVycywgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgQHNhbXB7bm90IGVub3VnaAotcm9vbSBmb3IgcHJvZ3JhbSBoZWFkZXJzfS4gIFRvIGF2b2lkIHRoaXMgZXJyb3IsIHlvdSBtdXN0IGF2b2lkIHVzaW5nCi10aGUgQGNvZGV7U0laRU9GX0hFQURFUlN9IGZ1bmN0aW9uLCBvciB5b3UgbXVzdCByZXdvcmsgeW91ciBsaW5rZXIKLXNjcmlwdCB0byBhdm9pZCBmb3JjaW5nIHRoZSBsaW5rZXIgdG8gdXNlIGFkZGl0aW9uYWwgcHJvZ3JhbSBoZWFkZXJzLCBvcgoteW91IG11c3QgZGVmaW5lIHRoZSBwcm9ncmFtIGhlYWRlcnMgeW91cnNlbGYgdXNpbmcgdGhlIEBjb2Rle1BIRFJTfQotY29tbWFuZCAoQHB4cmVme1BIRFJTfSkuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEltcGxpY2l0IExpbmtlciBTY3JpcHRzCi1Ac2VjdGlvbiBJbXBsaWNpdCBMaW5rZXIgU2NyaXB0cwotQGNpbmRleCBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0cwotSWYgeW91IHNwZWNpZnkgYSBsaW5rZXIgaW5wdXQgZmlsZSB3aGljaCB0aGUgbGlua2VyIGNhbiBub3QgcmVjb2duaXplIGFzCi1hbiBvYmplY3QgZmlsZSBvciBhbiBhcmNoaXZlIGZpbGUsIGl0IHdpbGwgdHJ5IHRvIHJlYWQgdGhlIGZpbGUgYXMgYQotbGlua2VyIHNjcmlwdC4gIElmIHRoZSBmaWxlIGNhbiBub3QgYmUgcGFyc2VkIGFzIGEgbGlua2VyIHNjcmlwdCwgdGhlCi1saW5rZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuCi0KLUFuIGltcGxpY2l0IGxpbmtlciBzY3JpcHQgd2lsbCBub3QgcmVwbGFjZSB0aGUgZGVmYXVsdCBsaW5rZXIgc2NyaXB0LgotCi1UeXBpY2FsbHkgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3b3VsZCBjb250YWluIG9ubHkgc3ltYm9sCi1hc3NpZ25tZW50cywgb3IgdGhlIEBjb2Rle0lOUFVUfSwgQGNvZGV7R1JPVVB9LCBvciBAY29kZXtWRVJTSU9OfQotY29tbWFuZHMuCi0KLUFueSBpbnB1dCBmaWxlcyByZWFkIGJlY2F1c2Ugb2YgYW4gaW1wbGljaXQgbGlua2VyIHNjcmlwdCB3aWxsIGJlIHJlYWQKLWF0IHRoZSBwb3NpdGlvbiBpbiB0aGUgY29tbWFuZCBsaW5lIHdoZXJlIHRoZSBpbXBsaWNpdCBsaW5rZXIgc2NyaXB0IHdhcwotcmVhZC4gIFRoaXMgY2FuIGFmZmVjdCBhcmNoaXZlIHNlYXJjaGluZy4KLQotQGlmc2V0IEdFTkVSSUMKLUBub2RlIE1hY2hpbmUgRGVwZW5kZW50Ci1AY2hhcHRlciBNYWNoaW5lIERlcGVuZGVudCBGZWF0dXJlcwotCi1AY2luZGV4IG1hY2hpbmUgZGVwZW5kZW5jaWVzCi1AY29kZXtsZH0gaGFzIGFkZGl0aW9uYWwgZmVhdHVyZXMgb24gc29tZSBwbGF0Zm9ybXM7IHRoZSBmb2xsb3dpbmcKLXNlY3Rpb25zIGRlc2NyaWJlIHRoZW0uICBNYWNoaW5lcyB3aGVyZSBAY29kZXtsZH0gaGFzIG5vIGFkZGl0aW9uYWwKLWZ1bmN0aW9uYWxpdHkgYXJlIG5vdCBsaXN0ZWQuCi0KLUBtZW51Ci0qIEg4LzMwMDo6ICAgICAgICAgICAgICAgICAgICAgIEBjb2Rle2xkfSBhbmQgdGhlIEg4LzMwMAotKiBpOTYwOjogICAgICAgICAgICAgICAgICAgICAgICBAY29kZXtsZH0gYW5kIHRoZSBJbnRlbCA5NjAgZmFtaWx5Ci0qIEFSTTo6CQkJCUBjb2Rle2xkfSBhbmQgdGhlIEFSTSBmYW1pbHkKLUBlbmQgbWVudQotQGVuZCBpZnNldAotCi1AYyBGSVhNRSEgIFRoaXMgY291bGQgdXNlIEByYWlzZXNlY3Rpb25zL0Bsb3dlcnNlY3Rpb25zLCBidXQgdGhlcmUgc2VlbXMgdG8gYmUgYSBjb25mbGljdAotQGMgICAgICAgICBiZXR3ZWVuIHRob3NlIGFuZCBub2RlLWRlZmF1bHRpbmcuCi1AaWZzZXQgSDgzMDAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgSDgvMzAwCi1Ac2VjdGlvbiBAY29kZXtsZH0gYW5kIHRoZSBIOC8zMDAKLQotQGNpbmRleCBIOC8zMDAgc3VwcG9ydAotRm9yIHRoZSBIOC8zMDAsIEBjb2Rle2xkfSBjYW4gcGVyZm9ybSB0aGVzZSBnbG9iYWwgb3B0aW1pemF0aW9ucyB3aGVuCi15b3Ugc3BlY2lmeSB0aGUgQHNhbXB7LS1yZWxheH0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotQHRhYmxlIEBlbXBoCi1AY2luZGV4IHJlbGF4aW5nIG9uIEg4LzMwMAotQGl0ZW0gcmVsYXhpbmcgYWRkcmVzcyBtb2RlcwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXtqc3J9IGFuZCBAY29kZXtqbXB9IGluc3RydWN0aW9ucyB3aG9zZQotdGFyZ2V0cyBhcmUgd2l0aGluIGVpZ2h0IGJpdHMsIGFuZCB0dXJucyB0aGVtIGludG8gZWlnaHQtYml0Ci1wcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YnNyfSBhbmQgQGNvZGV7YnJhfSBpbnN0cnVjdGlvbnMsCi1yZXNwZWN0aXZlbHkuCi0KLUBjaW5kZXggc3ludGhlc2l6aW5nIG9uIEg4LzMwMAotQGl0ZW0gc3ludGhlc2l6aW5nIGluc3RydWN0aW9ucwotQGMgRklYTUU6IHNwZWNpZmljYWxseSBtb3YuYiwgb3IgYW55IG1vdiBpbnN0cnVjdGlvbnMgcmVhbGx5PwotQGNvZGV7bGR9IGZpbmRzIGFsbCBAY29kZXttb3YuYn0gaW5zdHJ1Y3Rpb25zIHdoaWNoIHVzZSB0aGUKLXNpeHRlZW4tYml0IGFic29sdXRlIGFkZHJlc3MgZm9ybSwgYnV0IHJlZmVyIHRvIHRoZSB0b3AKLXBhZ2Ugb2YgbWVtb3J5LCBhbmQgY2hhbmdlcyB0aGVtIHRvIHVzZSB0aGUgZWlnaHQtYml0IGFkZHJlc3MgZm9ybS4KLShUaGF0IGlzOiB0aGUgbGlua2VyIHR1cm5zIEBzYW1we21vdi5iIEBjb2Rle0BAfUB2YXJ7YWF9OjE2fSBpbnRvCi1Ac2FtcHttb3YuYiBAY29kZXtAQH1AdmFye2FhfTo4fSB3aGVuZXZlciB0aGUgYWRkcmVzcyBAdmFye2FhfSBpcyBpbiB0aGUKLXRvcCBwYWdlIG9mIG1lbW9yeSkuCi1AZW5kIHRhYmxlCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQGlmc2V0IEhpdGFjaGkKLUBjIFRoaXMgc3R1ZmYgaXMgcG9pbnRsZXNzIHRvIHNheSB1bmxlc3MgeW91J3JlIGVzcGVjaWFsbHkgY29uY2VybmVkCi1AYyB3aXRoIEhpdGFjaGkgY2hpcHM7IGRvbid0IGVuYWJsZSBpdCBmb3IgZ2VuZXJpYyBjYXNlLCBwbGVhc2UuCi1Abm9kZSBIaXRhY2hpCi1AY2hhcHRlciBAY29kZXtsZH0gYW5kIG90aGVyIEhpdGFjaGkgY2hpcHMKLQotQGNvZGV7bGR9IGFsc28gc3VwcG9ydHMgdGhlIEg4LzMwMEgsIHRoZSBIOC81MDAsIGFuZCB0aGUgSGl0YWNoaSBTSC4gIE5vCi1zcGVjaWFsIGZlYXR1cmVzLCBjb21tYW5kcywgb3IgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlIHJlcXVpcmVkIGZvcgotdGhlc2UgY2hpcHMuCi1AZW5kIGlmc2V0Ci1AZW5kIGlmY2xlYXIKLQotQGlmc2V0IEk5NjAKLUBpZmNsZWFyIEdFTkVSSUMKLUByYWlzZXNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQG5vZGUgaTk2MAotQHNlY3Rpb24gQGNvZGV7bGR9IGFuZCB0aGUgSW50ZWwgOTYwIGZhbWlseQotCi1AY2luZGV4IGk5NjAgc3VwcG9ydAotCi1Zb3UgY2FuIHVzZSB0aGUgQHNhbXB7LUFAdmFye2FyY2hpdGVjdHVyZX19IGNvbW1hbmQgbGluZSBvcHRpb24gdG8KLXNwZWNpZnkgb25lIG9mIHRoZSB0d28tbGV0dGVyIG5hbWVzIGlkZW50aWZ5aW5nIG1lbWJlcnMgb2YgdGhlIDk2MAotZmFtaWx5OyB0aGUgb3B0aW9uIHNwZWNpZmllcyB0aGUgZGVzaXJlZCBvdXRwdXQgdGFyZ2V0LCBhbmQgd2FybnMgb2YgYW55Ci1pbmNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBpbnB1dCBmaWxlcy4gIEl0IGFsc28gbW9kaWZpZXMgdGhlCi1saW5rZXIncyBzZWFyY2ggc3RyYXRlZ3kgZm9yIGFyY2hpdmUgbGlicmFyaWVzLCB0byBzdXBwb3J0IHRoZSB1c2Ugb2YKLWxpYnJhcmllcyBzcGVjaWZpYyB0byBlYWNoIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlLCBieSBpbmNsdWRpbmcgaW4gdGhlCi1zZWFyY2ggbG9vcCBuYW1lcyBzdWZmaXhlZCB3aXRoIHRoZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGFyY2hpdGVjdHVyZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdXIgQGNvZGV7bGR9IGNvbW1hbmQgbGluZSBpbmNsdWRlZCBAd3tAc2FtcHstQUNBfX0gYXMKLXdlbGwgYXMgQHd7QHNhbXB7LWx0cnl9fSwgdGhlIGxpbmtlciB3b3VsZCBsb29rIChpbiBpdHMgYnVpbHQtaW4gc2VhcmNoCi1wYXRocywgYW5kIGluIGFueSBwYXRocyB5b3Ugc3BlY2lmeSB3aXRoIEBzYW1wey1MfSkgZm9yIGEgbGlicmFyeSB3aXRoCi10aGUgbmFtZXMKLQotQHNtYWxsZXhhbXBsZQotQGdyb3VwCi10cnkKLWxpYnRyeS5hCi10cnljYQotbGlidHJ5Y2EuYQotQGVuZCBncm91cAotQGVuZCBzbWFsbGV4YW1wbGUKLQotQG5vaW5kZW50Ci1UaGUgZmlyc3QgdHdvIHBvc3NpYmlsaXRpZXMgd291bGQgYmUgY29uc2lkZXJlZCBpbiBhbnkgZXZlbnQ7IHRoZSBsYXN0Ci10d28gYXJlIGR1ZSB0byB0aGUgdXNlIG9mIEB3e0BzYW1wey1BQ0F9fS4KLQotWW91IGNhbiBtZWFuaW5nZnVsbHkgdXNlIEBzYW1wey1BfSBtb3JlIHRoYW4gb25jZSBvbiBhIGNvbW1hbmQgbGluZSwgc2luY2UKLXRoZSA5NjAgYXJjaGl0ZWN0dXJlIGZhbWlseSBhbGxvd3MgY29tYmluYXRpb24gb2YgdGFyZ2V0IGFyY2hpdGVjdHVyZXM7IGVhY2gKLXVzZSB3aWxsIGFkZCBhbm90aGVyIHBhaXIgb2YgbmFtZSB2YXJpYW50cyB0byBzZWFyY2ggZm9yIHdoZW4gQHd7QHNhbXB7LWx9fQotc3BlY2lmaWVzIGEgbGlicmFyeS4KLQotQGNpbmRleCBAY29kZXstLXJlbGF4fSBvbiBpOTYwCi1AY2luZGV4IHJlbGF4aW5nIG9uIGk5NjAKLUBjb2Rle2xkfSBzdXBwb3J0cyB0aGUgQHNhbXB7LS1yZWxheH0gb3B0aW9uIGZvciB0aGUgaTk2MCBmYW1pbHkuICBJZgoteW91IHNwZWNpZnkgQHNhbXB7LS1yZWxheH0sIEBjb2Rle2xkfSBmaW5kcyBhbGwgQGNvZGV7YmFseH0gYW5kCi1AY29kZXtjYWx4fSBpbnN0cnVjdGlvbnMgd2hvc2UgdGFyZ2V0cyBhcmUgd2l0aGluIDI0IGJpdHMsIGFuZCB0dXJucwotdGhlbSBpbnRvIDI0LWJpdCBwcm9ncmFtLWNvdW50ZXIgcmVsYXRpdmUgQGNvZGV7YmFsfSBhbmQgQGNvZGV7Y2FsfQotaW5zdHJ1Y3Rpb25zLCByZXNwZWN0aXZlbHkuICBAY29kZXtsZH0gYWxzbyB0dXJucyBAY29kZXtjYWx9Ci1pbnN0cnVjdGlvbnMgaW50byBAY29kZXtiYWx9IGluc3RydWN0aW9ucyB3aGVuIGl0IGRldGVybWluZXMgdGhhdCB0aGUKLXRhcmdldCBzdWJyb3V0aW5lIGlzIGEgbGVhZiByb3V0aW5lICh0aGF0IGlzLCB0aGUgdGFyZ2V0IHN1YnJvdXRpbmUgZG9lcwotbm90IGl0c2VsZiBjYWxsIGFueSBzdWJyb3V0aW5lcykuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLUBlbmQgaWZzZXQKLQotQGlmY2xlYXIgR0VORVJJQwotQHJhaXNlc2VjdGlvbnMKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBBUk0KLUBzZWN0aW9uIEBjb2Rle2xkfSdzIHN1cHBvcnQgZm9yIGludGVyd29ya2luZyBiZXR3ZWVuIEFSTSBhbmQgVGh1bWIgY29kZQotCi1AY2luZGV4IEFSTSBpbnRlcndvcmtpbmcgc3VwcG9ydAotQGtpbmRleCAtLXN1cHBvcnQtb2xkLWNvZGUKLUZvciB0aGUgQVJNLCBAY29kZXtsZH0gd2lsbCBnZW5lcmF0ZSBjb2RlIHN0dWJzIHRvIGFsbG93IGZ1bmN0aW9ucyBjYWxscwotYmV0d2VlbSBBUk0gYW5kIFRodW1iIGNvZGUuICBUaGVzZSBzdHVicyBvbmx5IHdvcmsgd2l0aCBjb2RlIHRoYXQgaGFzCi1iZWVuIGNvbXBpbGVkIGFuZCBhc3NlbWJsZWQgd2l0aCB0aGUgQHNhbXB7LW10aHVtYi1pbnRlcndvcmt9IGNvbW1hbmQKLWxpbmUgb3B0aW9uLiAgSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGxpbmsgd2l0aCBvbGQgQVJNIG9iamVjdCBmaWxlcyBvcgotbGlicmFyaWVzLCB3aGljaCBoYXZlIG5vdCBiZWVuIGNvbXBpbGVkIHdpdGggdGhlIC1tdGh1bWItaW50ZXJ3b3JrCi1vcHRpb24gdGhlbiB0aGUgQHNhbXB7LS1zdXBwb3J0LW9sZC1jb2RlfSBjb21tYW5kIGxpbmUgc3dpdGNoIHNob3VsZCBiZQotZ2l2ZW4gdG8gdGhlIGxpbmtlci4gIFRoaXMgd2lsbCBtYWtlIGl0IGdlbmVyYXRlIGxhcmdlciBzdHViIGZ1bmN0aW9ucwotd2hpY2ggd2lsbCB3b3JrIHdpdGggbm9uLWludGVyd29ya2luZyBhd2FyZSBBUk0gY29kZS4gIE5vdGUsIGhvd2V2ZXIsCi10aGUgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgZ2VuZXJhdGluZyBzdHVicyBmb3IgZnVuY3Rpb24gY2FsbHMgdG8KLW5vbi1pbnRlcndvcmtpbmcgYXdhcmUgVGh1bWIgY29kZS4KLQotQGNpbmRleCB0aHVtYiBlbnRyeSBwb2ludAotQGNpbmRleCBlbnRyeSBwb2ludCwgdGh1bWIKLUBraW5kZXggLS10aHVtYi1lbnRyeT1AdmFye2VudHJ5fQotVGhlIEBzYW1wey0tdGh1bWItZW50cnl9IHN3aXRjaCBpcyBhIGR1cGxpY2F0ZSBvZiB0aGUgZ2VuZXJpYwotQHNhbXB7LS1lbnRyeX0gc3dpdGNoLCBpbiB0aGF0IGl0IHNldHMgdGhlIHByb2dyYW0ncyBzdGFydGluZyBhZGRyZXNzLiAgCi1CdXQgaXQgYWxzbyBzZXRzIHRoZSBib3R0b20gYml0IG9mIHRoZSBhZGRyZXNzLCBzbyB0aGF0IGl0IGNhbiBiZQotYnJhbmNoZWQgdG8gdXNpbmcgYSBCWCBpbnN0cnVjdGlvbiwgYW5kIHRoZSBwcm9ncmFtIHdpbGwgc3RhcnQKLWV4ZWN1dGluZyBpbiBUaHVtYiBtb2RlIHN0cmFpZ2h0IGF3YXkuCi0KLUBpZmNsZWFyIEdFTkVSSUMKLUBsb3dlcnNlY3Rpb25zCi1AZW5kIGlmY2xlYXIKLQotQGlmY2xlYXIgU2luZ2xlRm9ybWF0Ci1Abm9kZSBCRkQKLUBjaGFwdGVyIEJGRAotCi1AY2luZGV4IGJhY2sgZW5kCi1AY2luZGV4IG9iamVjdCBmaWxlIG1hbmFnZW1lbnQKLUBjaW5kZXggb2JqZWN0IGZvcm1hdHMgYXZhaWxhYmxlCi1Aa2luZGV4IG9iamR1bXAgLWkKLVRoZSBsaW5rZXIgYWNjZXNzZXMgb2JqZWN0IGFuZCBhcmNoaXZlIGZpbGVzIHVzaW5nIHRoZSBCRkQgbGlicmFyaWVzLgotVGhlc2UgbGlicmFyaWVzIGFsbG93IHRoZSBsaW5rZXIgdG8gdXNlIHRoZSBzYW1lIHJvdXRpbmVzIHRvIG9wZXJhdGUgb24KLW9iamVjdCBmaWxlcyB3aGF0ZXZlciB0aGUgb2JqZWN0IGZpbGUgZm9ybWF0LiAgQSBkaWZmZXJlbnQgb2JqZWN0IGZpbGUKLWZvcm1hdCBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieSBjcmVhdGluZyBhIG5ldyBCRkQgYmFjayBlbmQgYW5kIGFkZGluZwotaXQgdG8gdGhlIGxpYnJhcnkuICBUbyBjb25zZXJ2ZSBydW50aW1lIG1lbW9yeSwgaG93ZXZlciwgdGhlIGxpbmtlciBhbmQKLWFzc29jaWF0ZWQgdG9vbHMgYXJlIHVzdWFsbHkgY29uZmlndXJlZCB0byBzdXBwb3J0IG9ubHkgYSBzdWJzZXQgb2YgdGhlCi1vYmplY3QgZmlsZSBmb3JtYXRzIGF2YWlsYWJsZS4gIFlvdSBjYW4gdXNlIEBjb2Rle29iamR1bXAgLWl9Ci0oQHB4cmVme29iamR1bXAsLG9iamR1bXAsYmludXRpbHMuaW5mbyxUaGUgR05VIEJpbmFyeSBVdGlsaXRpZXN9KSB0bwotbGlzdCBhbGwgdGhlIGZvcm1hdHMgYXZhaWxhYmxlIGZvciB5b3VyIGNvbmZpZ3VyYXRpb24uCi0KLUBjaW5kZXggQkZEIHJlcXVpcmVtZW50cwotQGNpbmRleCByZXF1aXJlbWVudHMgZm9yIEJGRAotQXMgd2l0aCBtb3N0IGltcGxlbWVudGF0aW9ucywgQkZEIGlzIGEgY29tcHJvbWlzZSBiZXR3ZWVuCi1zZXZlcmFsIGNvbmZsaWN0aW5nIHJlcXVpcmVtZW50cy4gVGhlIG1ham9yIGZhY3RvciBpbmZsdWVuY2luZwotQkZEIGRlc2lnbiB3YXMgZWZmaWNpZW5jeTogYW55IHRpbWUgdXNlZCBjb252ZXJ0aW5nIGJldHdlZW4KLWZvcm1hdHMgaXMgdGltZSB3aGljaCB3b3VsZCBub3QgaGF2ZSBiZWVuIHNwZW50IGhhZCBCRkQgbm90Ci1iZWVuIGludm9sdmVkLiBUaGlzIGlzIHBhcnRseSBvZmZzZXQgYnkgYWJzdHJhY3Rpb24gcGF5YmFjazsgc2luY2UKLUJGRCBzaW1wbGlmaWVzIGFwcGxpY2F0aW9ucyBhbmQgYmFjayBlbmRzLCBtb3JlIHRpbWUgYW5kIGNhcmUKLW1heSBiZSBzcGVudCBvcHRpbWl6aW5nIGFsZ29yaXRobXMgZm9yIGEgZ3JlYXRlciBzcGVlZC4KLQotT25lIG1pbm9yIGFydGlmYWN0IG9mIHRoZSBCRkQgc29sdXRpb24gd2hpY2ggeW91IHNob3VsZCBiZWFyIGluCi1taW5kIGlzIHRoZSBwb3RlbnRpYWwgZm9yIGluZm9ybWF0aW9uIGxvc3MuICBUaGVyZSBhcmUgdHdvIHBsYWNlcyB3aGVyZQotdXNlZnVsIGluZm9ybWF0aW9uIGNhbiBiZSBsb3N0IHVzaW5nIHRoZSBCRkQgbWVjaGFuaXNtOiBkdXJpbmcKLWNvbnZlcnNpb24gYW5kIGR1cmluZyBvdXRwdXQuIEB4cmVme0JGRCBpbmZvcm1hdGlvbiBsb3NzfS4KLQotQG1lbnUKLSogQkZEIG91dGxpbmU6OiAgICAgICAgICAgICAgICAgSG93IGl0IHdvcmtzOiBhbiBvdXRsaW5lIG9mIEJGRAotQGVuZCBtZW51Ci0KLUBub2RlIEJGRCBvdXRsaW5lCi1Ac2VjdGlvbiBIb3cgaXQgd29ya3M6IGFuIG91dGxpbmUgb2YgQkZECi1AY2luZGV4IG9wZW5pbmcgb2JqZWN0IGZpbGVzCi1AaW5jbHVkZSBiZmRzdW1tLnRleGkKLUBlbmQgaWZjbGVhcgotCi1Abm9kZSBSZXBvcnRpbmcgQnVncwotQGNoYXB0ZXIgUmVwb3J0aW5nIEJ1Z3MKLUBjaW5kZXggYnVncyBpbiBAY29kZXtsZH0KLUBjaW5kZXggcmVwb3J0aW5nIGJ1Z3MgaW4gQGNvZGV7bGR9Ci0KLVlvdXIgYnVnIHJlcG9ydHMgcGxheSBhbiBlc3NlbnRpYWwgcm9sZSBpbiBtYWtpbmcgQGNvZGV7bGR9IHJlbGlhYmxlLgotCi1SZXBvcnRpbmcgYSBidWcgbWF5IGhlbHAgeW91IGJ5IGJyaW5naW5nIGEgc29sdXRpb24gdG8geW91ciBwcm9ibGVtLCBvcgotaXQgbWF5IG5vdC4gIEJ1dCBpbiBhbnkgY2FzZSB0aGUgcHJpbmNpcGFsIGZ1bmN0aW9uIG9mIGEgYnVnIHJlcG9ydCBpcwotdG8gaGVscCB0aGUgZW50aXJlIGNvbW11bml0eSBieSBtYWtpbmcgdGhlIG5leHQgdmVyc2lvbiBvZiBAY29kZXtsZH0KLXdvcmsgYmV0dGVyLiAgQnVnIHJlcG9ydHMgYXJlIHlvdXIgY29udHJpYnV0aW9uIHRvIHRoZSBtYWludGVuYW5jZSBvZgotQGNvZGV7bGR9LgotCi1JbiBvcmRlciBmb3IgYSBidWcgcmVwb3J0IHRvIHNlcnZlIGl0cyBwdXJwb3NlLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotaW5mb3JtYXRpb24gdGhhdCBlbmFibGVzIHVzIHRvIGZpeCB0aGUgYnVnLgotCi1AbWVudQotKiBCdWcgQ3JpdGVyaWE6OiAgICAgICAgICAgICAgICBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLSogQnVnIFJlcG9ydGluZzo6ICAgICAgICAgICAgICAgSG93IHRvIHJlcG9ydCBidWdzCi1AZW5kIG1lbnUKLQotQG5vZGUgQnVnIENyaXRlcmlhCi1Ac2VjdGlvbiBIYXZlIHlvdSBmb3VuZCBhIGJ1Zz8KLUBjaW5kZXggYnVnIGNyaXRlcmlhCi0KLUlmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3UgaGF2ZSBmb3VuZCBhIGJ1ZywgaGVyZSBhcmUgc29tZSBndWlkZWxpbmVzOgotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AY2luZGV4IGZhdGFsIHNpZ25hbAotQGNpbmRleCBsaW5rZXIgY3Jhc2gKLUBjaW5kZXggY3Jhc2ggb2YgbGlua2VyCi1AaXRlbQotSWYgdGhlIGxpbmtlciBnZXRzIGEgZmF0YWwgc2lnbmFsLCBmb3IgYW55IGlucHV0IHdoYXRldmVyLCB0aGF0IGlzIGEKLUBjb2Rle2xkfSBidWcuICBSZWxpYWJsZSBsaW5rZXJzIG5ldmVyIGNyYXNoLgotCi1AY2luZGV4IGVycm9yIG9uIHZhbGlkIGlucHV0Ci1AaXRlbQotSWYgQGNvZGV7bGR9IHByb2R1Y2VzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHZhbGlkIGlucHV0LCB0aGF0IGlzIGEgYnVnLgotCi1AY2luZGV4IGludmFsaWQgaW5wdXQKLUBpdGVtCi1JZiBAY29kZXtsZH0gZG9lcyBub3QgcHJvZHVjZSBhbiBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIGlucHV0LCB0aGF0Ci1tYXkgYmUgYSBidWcuICBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGUgbGlua2VyIGNhbiBub3QgdmVyaWZ5IHRoYXQKLW9iamVjdCBmaWxlcyBhcmUgY29ycmVjdC4KLQotQGl0ZW0KLUlmIHlvdSBhcmUgYW4gZXhwZXJpZW5jZWQgdXNlciBvZiBsaW5rZXJzLCB5b3VyIHN1Z2dlc3Rpb25zIGZvcgotaW1wcm92ZW1lbnQgb2YgQGNvZGV7bGR9IGFyZSB3ZWxjb21lIGluIGFueSBjYXNlLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIEJ1ZyBSZXBvcnRpbmcKLUBzZWN0aW9uIEhvdyB0byByZXBvcnQgYnVncwotQGNpbmRleCBidWcgcmVwb3J0cwotQGNpbmRleCBAY29kZXtsZH0gYnVncywgcmVwb3J0aW5nCi0KLUEgbnVtYmVyIG9mIGNvbXBhbmllcyBhbmQgaW5kaXZpZHVhbHMgb2ZmZXIgc3VwcG9ydCBmb3IgQHNje2dudX0KLXByb2R1Y3RzLiAgSWYgeW91IG9idGFpbmVkIEBjb2Rle2xkfSBmcm9tIGEgc3VwcG9ydCBvcmdhbml6YXRpb24sIHdlCi1yZWNvbW1lbmQgeW91IGNvbnRhY3QgdGhhdCBvcmdhbml6YXRpb24gZmlyc3QuCi0KLVlvdSBjYW4gZmluZCBjb250YWN0IGluZm9ybWF0aW9uIGZvciBtYW55IHN1cHBvcnQgY29tcGFuaWVzIGFuZAotaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgQGZpbGV7ZXRjL1NFUlZJQ0V9IGluIHRoZSBAc2N7Z251fSBFbWFjcwotZGlzdHJpYnV0aW9uLgotCi1PdGhlcndpc2UsIHNlbmQgYnVnIHJlcG9ydHMgZm9yIEBjb2Rle2xkfSB0bwotQHNhbXB7YnVnLWdudS11dGlsc0BAZ251Lm9yZ30uCi0KLVRoZSBmdW5kYW1lbnRhbCBwcmluY2lwbGUgb2YgcmVwb3J0aW5nIGJ1Z3MgdXNlZnVsbHkgaXMgdGhpczoKLUBzdHJvbmd7cmVwb3J0IGFsbCB0aGUgZmFjdHN9LiAgSWYgeW91IGFyZSBub3Qgc3VyZSB3aGV0aGVyIHRvIHN0YXRlIGEKLWZhY3Qgb3IgbGVhdmUgaXQgb3V0LCBzdGF0ZSBpdCEKLQotT2Z0ZW4gcGVvcGxlIG9taXQgZmFjdHMgYmVjYXVzZSB0aGV5IHRoaW5rIHRoZXkga25vdyB3aGF0IGNhdXNlcyB0aGUKLXByb2JsZW0gYW5kIGFzc3VtZSB0aGF0IHNvbWUgZGV0YWlscyBkbyBub3QgbWF0dGVyLiAgVGh1cywgeW91IG1pZ2h0Ci1hc3N1bWUgdGhhdCB0aGUgbmFtZSBvZiBhIHN5bWJvbCB5b3UgdXNlIGluIGFuIGV4YW1wbGUgZG9lcyBub3QgbWF0dGVyLgotV2VsbCwgcHJvYmFibHkgaXQgZG9lcyBub3QsIGJ1dCBvbmUgY2Fubm90IGJlIHN1cmUuICBQZXJoYXBzIHRoZSBidWcgaXMKLWEgc3RyYXkgbWVtb3J5IHJlZmVyZW5jZSB3aGljaCBoYXBwZW5zIHRvIGZldGNoIGZyb20gdGhlIGxvY2F0aW9uIHdoZXJlCi10aGF0IG5hbWUgaXMgc3RvcmVkIGluIG1lbW9yeTsgcGVyaGFwcywgaWYgdGhlIG5hbWUgd2VyZSBkaWZmZXJlbnQsIHRoZQotY29udGVudHMgb2YgdGhhdCBsb2NhdGlvbiB3b3VsZCBmb29sIHRoZSBsaW5rZXIgaW50byBkb2luZyB0aGUgcmlnaHQKLXRoaW5nIGRlc3BpdGUgdGhlIGJ1Zy4gIFBsYXkgaXQgc2FmZSBhbmQgZ2l2ZSBhIHNwZWNpZmljLCBjb21wbGV0ZQotZXhhbXBsZS4gIFRoYXQgaXMgdGhlIGVhc2llc3QgdGhpbmcgZm9yIHlvdSB0byBkbywgYW5kIHRoZSBtb3N0IGhlbHBmdWwuCi0KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSBwdXJwb3NlIG9mIGEgYnVnIHJlcG9ydCBpcyB0byBlbmFibGUgdXMgdG8gZml4IHRoZSBidWcgaWYKLWl0IGlzIG5ldyB0byB1cy4gIFRoZXJlZm9yZSwgYWx3YXlzIHdyaXRlIHlvdXIgYnVnIHJlcG9ydHMgb24gdGhlIGFzc3VtcHRpb24KLXRoYXQgdGhlIGJ1ZyBoYXMgbm90IGJlZW4gcmVwb3J0ZWQgcHJldmlvdXNseS4KLQotU29tZXRpbWVzIHBlb3BsZSBnaXZlIGEgZmV3IHNrZXRjaHkgZmFjdHMgYW5kIGFzaywgYGBEb2VzIHRoaXMgcmluZyBhCi1iZWxsPycnICBUaG9zZSBidWcgcmVwb3J0cyBhcmUgdXNlbGVzcywgYW5kIHdlIHVyZ2UgZXZlcnlvbmUgdG8KLUBlbXBoe3JlZnVzZSB0byByZXNwb25kIHRvIHRoZW19IGV4Y2VwdCB0byBjaGlkZSB0aGUgc2VuZGVyIHRvIHJlcG9ydAotYnVncyBwcm9wZXJseS4KLQotVG8gZW5hYmxlIHVzIHRvIGZpeCB0aGUgYnVnLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYWxsIHRoZXNlIHRoaW5nczoKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLVRoZSB2ZXJzaW9uIG9mIEBjb2Rle2xkfS4gIEBjb2Rle2xkfSBhbm5vdW5jZXMgaXQgaWYgeW91IHN0YXJ0IGl0IHdpdGgKLXRoZSBAc2FtcHstLXZlcnNpb259IGFyZ3VtZW50LgotCi1XaXRob3V0IHRoaXMsIHdlIHdpbGwgbm90IGtub3cgd2hldGhlciB0aGVyZSBpcyBhbnkgcG9pbnQgaW4gbG9va2luZyBmb3IKLXRoZSBidWcgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBAY29kZXtsZH0uCi0KLUBpdGVtCi1BbnkgcGF0Y2hlcyB5b3UgbWF5IGhhdmUgYXBwbGllZCB0byB0aGUgQGNvZGV7bGR9IHNvdXJjZSwgaW5jbHVkaW5nIGFueQotcGF0Y2hlcyBtYWRlIHRvIHRoZSBAY29kZXtCRkR9IGxpYnJhcnkuCi0KLUBpdGVtCi1UaGUgdHlwZSBvZiBtYWNoaW5lIHlvdSBhcmUgdXNpbmcsIGFuZCB0aGUgb3BlcmF0aW5nIHN5c3RlbSBuYW1lIGFuZAotdmVyc2lvbiBudW1iZXIuCi0KLUBpdGVtCi1XaGF0IGNvbXBpbGVyIChhbmQgaXRzIHZlcnNpb24pIHdhcyB1c2VkIHRvIGNvbXBpbGUgQGNvZGV7bGR9LS0tZS5nLgotYGBAY29kZXtnY2MtMi43fScnLgotCi1AaXRlbQotVGhlIGNvbW1hbmQgYXJndW1lbnRzIHlvdSBnYXZlIHRoZSBsaW5rZXIgdG8gbGluayB5b3VyIGV4YW1wbGUgYW5kCi1vYnNlcnZlIHRoZSBidWcuICBUbyBndWFyYW50ZWUgeW91IHdpbGwgbm90IG9taXQgc29tZXRoaW5nIGltcG9ydGFudCwKLWxpc3QgdGhlbSBhbGwuICBBIGNvcHkgb2YgdGhlIE1ha2VmaWxlIChvciB0aGUgb3V0cHV0IGZyb20gbWFrZSkgaXMKLXN1ZmZpY2llbnQuCi0KLUlmIHdlIHdlcmUgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBhcmd1bWVudHMsIHdlIHdvdWxkIHByb2JhYmx5IGd1ZXNzIHdyb25nCi1hbmQgdGhlbiB3ZSBtaWdodCBub3QgZW5jb3VudGVyIHRoZSBidWcuCi0KLUBpdGVtCi1BIGNvbXBsZXRlIGlucHV0IGZpbGUsIG9yIHNldCBvZiBpbnB1dCBmaWxlcywgdGhhdCB3aWxsIHJlcHJvZHVjZSB0aGUKLWJ1Zy4gIEl0IGlzIGdlbmVyYWxseSBtb3N0IGhlbHBmdWwgdG8gc2VuZCB0aGUgYWN0dWFsIG9iamVjdCBmaWxlcywKLXV1ZW5jb2RlZCBpZiBuZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdGhyb3VnaCB0aGUgbWFpbCBzeXN0ZW0uICBNYWtpbmcgdGhlbQotYXZhaWxhYmxlIGZvciBhbm9ueW1vdXMgRlRQIGlzIG5vdCBhcyBnb29kLCBidXQgbWF5IGJlIHRoZSBvbmx5Ci1yZWFzb25hYmxlIGNob2ljZSBmb3IgbGFyZ2Ugb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgc291cmNlIGZpbGVzIHdlcmUgYXNzZW1ibGVkIHVzaW5nIEBjb2Rle2dhc30gb3IgY29tcGlsZWQgdXNpbmcKLUBjb2Rle2djY30sIHRoZW4gaXQgbWF5IGJlIE9LIHRvIHNlbmQgdGhlIHNvdXJjZSBmaWxlcyByYXRoZXIgdGhhbiB0aGUKLW9iamVjdCBmaWxlcy4gIEluIHRoaXMgY2FzZSwgYmUgc3VyZSB0byBzYXkgZXhhY3RseSB3aGF0IHZlcnNpb24gb2YKLUBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3YXMgdXNlZCB0byBwcm9kdWNlIHRoZSBvYmplY3QgZmlsZXMuICBBbHNvIHNheQotaG93IEBjb2Rle2dhc30gb3IgQGNvZGV7Z2NjfSB3ZXJlIGNvbmZpZ3VyZWQuCi0KLUBpdGVtCi1BIGRlc2NyaXB0aW9uIG9mIHdoYXQgYmVoYXZpb3IgeW91IG9ic2VydmUgdGhhdCB5b3UgYmVsaWV2ZSBpcwotaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGBgSXQgZ2V0cyBhIGZhdGFsIHNpZ25hbC4nJwotCi1PZiBjb3Vyc2UsIGlmIHRoZSBidWcgaXMgdGhhdCBAY29kZXtsZH0gZ2V0cyBhIGZhdGFsIHNpZ25hbCwgdGhlbiB3ZQotd2lsbCBjZXJ0YWlubHkgbm90aWNlIGl0LiAgQnV0IGlmIHRoZSBidWcgaXMgaW5jb3JyZWN0IG91dHB1dCwgd2UgbWlnaHQKLW5vdCBub3RpY2UgdW5sZXNzIGl0IGlzIGdsYXJpbmdseSB3cm9uZy4gIFlvdSBtaWdodCBhcyB3ZWxsIG5vdCBnaXZlIHVzCi1hIGNoYW5jZSB0byBtYWtlIGEgbWlzdGFrZS4KLQotRXZlbiBpZiB0aGUgcHJvYmxlbSB5b3UgZXhwZXJpZW5jZSBpcyBhIGZhdGFsIHNpZ25hbCwgeW91IHNob3VsZCBzdGlsbAotc2F5IHNvIGV4cGxpY2l0bHkuICBTdXBwb3NlIHNvbWV0aGluZyBzdHJhbmdlIGlzIGdvaW5nIG9uLCBzdWNoIGFzLCB5b3VyCi1jb3B5IG9mIEBjb2Rle2xkfSBpcyBvdXQgb2Ygc3luY2gsIG9yIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgYnVnIGluIHRoZQotQyBsaWJyYXJ5IG9uIHlvdXIgc3lzdGVtLiAgKFRoaXMgaGFzIGhhcHBlbmVkISkgIFlvdXIgY29weSBtaWdodCBjcmFzaAotYW5kIG91cnMgd291bGQgbm90LiAgSWYgeW91IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2hlbiBvdXJzCi1mYWlscyB0byBjcmFzaCwgd2Ugd291bGQga25vdyB0aGF0IHRoZSBidWcgd2FzIG5vdCBoYXBwZW5pbmcgZm9yIHVzLiAgSWYKLXlvdSBoYWQgbm90IHRvbGQgdXMgdG8gZXhwZWN0IGEgY3Jhc2gsIHRoZW4gd2Ugd291bGQgbm90IGJlIGFibGUgdG8gZHJhdwotYW55IGNvbmNsdXNpb24gZnJvbSBvdXIgb2JzZXJ2YXRpb25zLgotCi1AaXRlbQotSWYgeW91IHdpc2ggdG8gc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoZSBAY29kZXtsZH0gc291cmNlLCBzZW5kIHVzIGNvbnRleHQKLWRpZmZzLCBhcyBnZW5lcmF0ZWQgYnkgQGNvZGV7ZGlmZn0gd2l0aCB0aGUgQHNhbXB7LXV9LCBAc2FtcHstY30sIG9yCi1Ac2FtcHstcH0gb3B0aW9uLiAgQWx3YXlzIHNlbmQgZGlmZnMgZnJvbSB0aGUgb2xkIGZpbGUgdG8gdGhlIG5ldyBmaWxlLgotSWYgeW91IGV2ZW4gZGlzY3VzcyBzb21ldGhpbmcgaW4gdGhlIEBjb2Rle2xkfSBzb3VyY2UsIHJlZmVyIHRvIGl0IGJ5Ci1jb250ZXh0LCBub3QgYnkgbGluZSBudW1iZXIuCi0KLVRoZSBsaW5lIG51bWJlcnMgaW4gb3VyIGRldmVsb3BtZW50IHNvdXJjZXMgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4geW91cgotc291cmNlcy4gIFlvdXIgbGluZSBudW1iZXJzIHdvdWxkIGNvbnZleSBubyB1c2VmdWwgaW5mb3JtYXRpb24gdG8gdXMuCi1AZW5kIGl0ZW1pemUKLQotSGVyZSBhcmUgc29tZSB0aGluZ3MgdGhhdCBhcmUgbm90IG5lY2Vzc2FyeToKLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0KLUEgZGVzY3JpcHRpb24gb2YgdGhlIGVudmVsb3BlIG9mIHRoZSBidWcuCi0KLU9mdGVuIHBlb3BsZSB3aG8gZW5jb3VudGVyIGEgYnVnIHNwZW5kIGEgbG90IG9mIHRpbWUgaW52ZXN0aWdhdGluZwotd2hpY2ggY2hhbmdlcyB0byB0aGUgaW5wdXQgZmlsZSB3aWxsIG1ha2UgdGhlIGJ1ZyBnbyBhd2F5IGFuZCB3aGljaAotY2hhbmdlcyB3aWxsIG5vdCBhZmZlY3QgaXQuCi0KLVRoaXMgaXMgb2Z0ZW4gdGltZSBjb25zdW1pbmcgYW5kIG5vdCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSB0aGUgd2F5IHdlCi13aWxsIGZpbmQgdGhlIGJ1ZyBpcyBieSBydW5uaW5nIGEgc2luZ2xlIGV4YW1wbGUgdW5kZXIgdGhlIGRlYnVnZ2VyCi13aXRoIGJyZWFrcG9pbnRzLCBub3QgYnkgcHVyZSBkZWR1Y3Rpb24gZnJvbSBhIHNlcmllcyBvZiBleGFtcGxlcy4KLVdlIHJlY29tbWVuZCB0aGF0IHlvdSBzYXZlIHlvdXIgdGltZSBmb3Igc29tZXRoaW5nIGVsc2UuCi0KLU9mIGNvdXJzZSwgaWYgeW91IGNhbiBmaW5kIGEgc2ltcGxlciBleGFtcGxlIHRvIHJlcG9ydCBAZW1waHtpbnN0ZWFkfQotb2YgdGhlIG9yaWdpbmFsIG9uZSwgdGhhdCBpcyBhIGNvbnZlbmllbmNlIGZvciB1cy4gIEVycm9ycyBpbiB0aGUKLW91dHB1dCB3aWxsIGJlIGVhc2llciB0byBzcG90LCBydW5uaW5nIHVuZGVyIHRoZSBkZWJ1Z2dlciB3aWxsIHRha2UKLWxlc3MgdGltZSwgYW5kIHNvIG9uLgotCi1Ib3dldmVyLCBzaW1wbGlmaWNhdGlvbiBpcyBub3Qgdml0YWw7IGlmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGlzLAotcmVwb3J0IHRoZSBidWcgYW55d2F5IGFuZCBzZW5kIHVzIHRoZSBlbnRpcmUgdGVzdCBjYXNlIHlvdSB1c2VkLgotCi1AaXRlbQotQSBwYXRjaCBmb3IgdGhlIGJ1Zy4KLQotQSBwYXRjaCBmb3IgdGhlIGJ1ZyBkb2VzIGhlbHAgdXMgaWYgaXQgaXMgYSBnb29kIG9uZS4gIEJ1dCBkbyBub3Qgb21pdAotdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUgdGVzdCBjYXNlLCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0Ci1hIHBhdGNoIGlzIGFsbCB3ZSBuZWVkLiAgV2UgbWlnaHQgc2VlIHByb2JsZW1zIHdpdGggeW91ciBwYXRjaCBhbmQgZGVjaWRlCi10byBmaXggdGhlIHByb2JsZW0gYW5vdGhlciB3YXksIG9yIHdlIG1pZ2h0IG5vdCB1bmRlcnN0YW5kIGl0IGF0IGFsbC4KLQotU29tZXRpbWVzIHdpdGggYSBwcm9ncmFtIGFzIGNvbXBsaWNhdGVkIGFzIEBjb2Rle2xkfSBpdCBpcyB2ZXJ5IGhhcmQgdG8KLWNvbnN0cnVjdCBhbiBleGFtcGxlIHRoYXQgd2lsbCBtYWtlIHRoZSBwcm9ncmFtIGZvbGxvdyBhIGNlcnRhaW4gcGF0aAotdGhyb3VnaCB0aGUgY29kZS4gIElmIHlvdSBkbyBub3Qgc2VuZCB1cyB0aGUgZXhhbXBsZSwgd2Ugd2lsbCBub3QgYmUKLWFibGUgdG8gY29uc3RydWN0IG9uZSwgc28gd2Ugd2lsbCBub3QgYmUgYWJsZSB0byB2ZXJpZnkgdGhhdCB0aGUgYnVnIGlzCi1maXhlZC4KLQotQW5kIGlmIHdlIGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQgYnVnIHlvdSBhcmUgdHJ5aW5nIHRvIGZpeCwgb3Igd2h5IHlvdXIKLXBhdGNoIHNob3VsZCBiZSBhbiBpbXByb3ZlbWVudCwgd2Ugd2lsbCBub3QgaW5zdGFsbCBpdC4gIEEgdGVzdCBjYXNlIHdpbGwKLWhlbHAgdXMgdG8gdW5kZXJzdGFuZC4KLQotQGl0ZW0KLUEgZ3Vlc3MgYWJvdXQgd2hhdCB0aGUgYnVnIGlzIG9yIHdoYXQgaXQgZGVwZW5kcyBvbi4KLQotU3VjaCBndWVzc2VzIGFyZSB1c3VhbGx5IHdyb25nLiAgRXZlbiB3ZSBjYW5ub3QgZ3Vlc3MgcmlnaHQgYWJvdXQgc3VjaAotdGhpbmdzIHdpdGhvdXQgZmlyc3QgdXNpbmcgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIGZhY3RzLgotQGVuZCBpdGVtaXplCi0KLUBub2RlIE1SSQotQGFwcGVuZGl4IE1SSSBDb21wYXRpYmxlIFNjcmlwdCBGaWxlcwotQGNpbmRleCBNUkkgY29tcGF0aWJpbGl0eQotVG8gYWlkIHVzZXJzIG1ha2luZyB0aGUgdHJhbnNpdGlvbiB0byBAc2N7Z251fSBAY29kZXtsZH0gZnJvbSB0aGUgTVJJCi1saW5rZXIsIEBjb2Rle2xkfSBjYW4gdXNlIE1SSSBjb21wYXRpYmxlIGxpbmtlciBzY3JpcHRzIGFzIGFuCi1hbHRlcm5hdGl2ZSB0byB0aGUgbW9yZSBnZW5lcmFsLXB1cnBvc2UgbGlua2VyIHNjcmlwdGluZyBsYW5ndWFnZQotZGVzY3JpYmVkIGluIEByZWZ7U2NyaXB0c30uICBNUkkgY29tcGF0aWJsZSBsaW5rZXIgc2NyaXB0cyBoYXZlIGEgbXVjaAotc2ltcGxlciBjb21tYW5kIHNldCB0aGFuIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2Ugb3RoZXJ3aXNlIHVzZWQgd2l0aAotQGNvZGV7bGR9LiAgQHNje2dudX0gQGNvZGV7bGR9IHN1cHBvcnRzIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgTVJJCi1saW5rZXIgY29tbWFuZHM7IHRoZXNlIGNvbW1hbmRzIGFyZSBkZXNjcmliZWQgaGVyZS4KLQotSW4gZ2VuZXJhbCwgTVJJIHNjcmlwdHMgYXJlbid0IG9mIG11Y2ggdXNlIHdpdGggdGhlIEBjb2Rle2Eub3V0fSBvYmplY3QKLWZpbGUgZm9ybWF0LCBzaW5jZSBpdCBvbmx5IGhhcyB0aHJlZSBzZWN0aW9ucyBhbmQgTVJJIHNjcmlwdHMgbGFjayBzb21lCi1mZWF0dXJlcyB0byBtYWtlIHVzZSBvZiB0aGVtLgotCi1Zb3UgY2FuIHNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYW4gTVJJLWNvbXBhdGlibGUgc2NyaXB0IHVzaW5nIHRoZQotQHNhbXB7LWN9IGNvbW1hbmQtbGluZSBvcHRpb24uCi0KLUVhY2ggY29tbWFuZCBpbiBhbiBNUkktY29tcGF0aWJsZSBzY3JpcHQgb2NjdXBpZXMgaXRzIG93biBsaW5lOyBlYWNoCi1jb21tYW5kIGxpbmUgc3RhcnRzIHdpdGggdGhlIGtleXdvcmQgdGhhdCBpZGVudGlmaWVzIHRoZSBjb21tYW5kICh0aG91Z2gKLWJsYW5rIGxpbmVzIGFyZSBhbHNvIGFsbG93ZWQgZm9yIHB1bmN0dWF0aW9uKS4gIElmIGEgbGluZSBvZiBhbgotTVJJLWNvbXBhdGlibGUgc2NyaXB0IGJlZ2lucyB3aXRoIGFuIHVucmVjb2duaXplZCBrZXl3b3JkLCBAY29kZXtsZH0KLWlzc3VlcyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGNvbnRpbnVlcyBwcm9jZXNzaW5nIHRoZSBzY3JpcHQuCi0KLUxpbmVzIGJlZ2lubmluZyB3aXRoIEBzYW1weyp9IGFyZSBjb21tZW50cy4KLQotWW91IGNhbiB3cml0ZSB0aGVzZSBjb21tYW5kcyB1c2luZyBhbGwgdXBwZXItY2FzZSBsZXR0ZXJzLCBvciBhbGwKLWxvd2VyIGNhc2U7IGZvciBleGFtcGxlLCBAc2FtcHtjaGlwfSBpcyB0aGUgc2FtZSBhcyBAc2FtcHtDSElQfS4KLVRoZSBmb2xsb3dpbmcgbGlzdCBzaG93cyBvbmx5IHRoZSB1cHBlci1jYXNlIGZvcm0gb2YgZWFjaCBjb21tYW5kLgotCi1AdGFibGUgQGNvZGUKLUBjaW5kZXggQGNvZGV7QUJTT0xVVEV9IChNUkkpCi1AaXRlbSBBQlNPTFVURSBAdmFye3NlY25hbWV9Ci1AaXRlbXggQUJTT0xVVEUgQHZhcntzZWNuYW1lfSwgQHZhcntzZWNuYW1lfSwgQGRvdHN7fSBAdmFye3NlY25hbWV9Ci1Ob3JtYWxseSwgQGNvZGV7bGR9IGluY2x1ZGVzIGluIHRoZSBvdXRwdXQgZmlsZSBhbGwgc2VjdGlvbnMgZnJvbSBhbGwKLXRoZSBpbnB1dCBmaWxlcy4gIEhvd2V2ZXIsIGluIGFuIE1SSS1jb21wYXRpYmxlIHNjcmlwdCwgeW91IGNhbiB1c2UgdGhlCi1AY29kZXtBQlNPTFVURX0gY29tbWFuZCB0byByZXN0cmljdCB0aGUgc2VjdGlvbnMgdGhhdCB3aWxsIGJlIHByZXNlbnQgaW4KLXlvdXIgb3V0cHV0IHByb2dyYW0uICBJZiB0aGUgQGNvZGV7QUJTT0xVVEV9IGNvbW1hbmQgaXMgdXNlZCBhdCBhbGwgaW4gYQotc2NyaXB0LCB0aGVuIG9ubHkgdGhlIHNlY3Rpb25zIG5hbWVkIGV4cGxpY2l0bHkgaW4gQGNvZGV7QUJTT0xVVEV9Ci1jb21tYW5kcyB3aWxsIGFwcGVhciBpbiB0aGUgbGlua2VyIG91dHB1dC4gIFlvdSBjYW4gc3RpbGwgdXNlIG90aGVyCi1pbnB1dCBzZWN0aW9ucyAod2hhdGV2ZXIgeW91IHNlbGVjdCBvbiB0aGUgY29tbWFuZCBsaW5lLCBvciB1c2luZwotQGNvZGV7TE9BRH0pIHRvIHJlc29sdmUgYWRkcmVzc2VzIGluIHRoZSBvdXRwdXQgZmlsZS4KLQotQGNpbmRleCBAY29kZXtBTElBU30gKE1SSSkKLUBpdGVtIEFMSUFTIEB2YXJ7b3V0LXNlY25hbWV9LCBAdmFye2luLXNlY25hbWV9Ci1Vc2UgdGhpcyBjb21tYW5kIHRvIHBsYWNlIHRoZSBkYXRhIGZyb20gaW5wdXQgc2VjdGlvbiBAdmFye2luLXNlY25hbWV9Ci1pbiBhIHNlY3Rpb24gY2FsbGVkIEB2YXJ7b3V0LXNlY25hbWV9IGluIHRoZSBsaW5rZXIgb3V0cHV0IGZpbGUuCi0KLUB2YXJ7aW4tc2VjbmFtZX0gbWF5IGJlIGFuIGludGVnZXIuCi0KLUBjaW5kZXggQGNvZGV7QUxJR059IChNUkkpCi1AaXRlbSBBTElHTiBAdmFye3NlY25hbWV9ID0gQHZhcntleHByZXNzaW9ufQotQWxpZ24gdGhlIHNlY3Rpb24gY2FsbGVkIEB2YXJ7c2VjbmFtZX0gdG8gQHZhcntleHByZXNzaW9ufS4gIFRoZQotQHZhcntleHByZXNzaW9ufSBzaG91bGQgYmUgYSBwb3dlciBvZiB0d28uCi0KLUBjaW5kZXggQGNvZGV7QkFTRX0gKE1SSSkKLUBpdGVtIEJBU0UgQHZhcntleHByZXNzaW9ufQotVXNlIHRoZSB2YWx1ZSBvZiBAdmFye2V4cHJlc3Npb259IGFzIHRoZSBsb3dlc3QgYWRkcmVzcyAob3RoZXIgdGhhbgotYWJzb2x1dGUgYWRkcmVzc2VzKSBpbiB0aGUgb3V0cHV0IGZpbGUuCi0KLUBjaW5kZXggQGNvZGV7Q0hJUH0gKE1SSSkKLUBpdGVtIENISVAgQHZhcntleHByZXNzaW9ufQotQGl0ZW14IENISVAgQHZhcntleHByZXNzaW9ufSwgQHZhcntleHByZXNzaW9ufQotVGhpcyBjb21tYW5kIGRvZXMgbm90aGluZzsgaXQgaXMgYWNjZXB0ZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eS4KLQotQGNpbmRleCBAY29kZXtFTkR9IChNUkkpCi1AaXRlbSBFTkQKLVRoaXMgY29tbWFuZCBkb2VzIG5vdGhpbmcgd2hhdGV2ZXI7IGl0J3Mgb25seSBhY2NlcHRlZCBmb3IgY29tcGF0aWJpbGl0eS4KLQotQGNpbmRleCBAY29kZXtGT1JNQVR9IChNUkkpCi1AaXRlbSBGT1JNQVQgQHZhcntvdXRwdXQtZm9ybWF0fQotU2ltaWxhciB0byB0aGUgQGNvZGV7T1VUUFVUX0ZPUk1BVH0gY29tbWFuZCBpbiB0aGUgbW9yZSBnZW5lcmFsIGxpbmtlcgotbGFuZ3VhZ2UsIGJ1dCByZXN0cmljdGVkIHRvIG9uZSBvZiB0aGVzZSBvdXRwdXQgZm9ybWF0czogCi0KLUBlbnVtZXJhdGUKLUBpdGVtIAotUy1yZWNvcmRzLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we1N9Ci0KLUBpdGVtCi1JRUVFLCBpZiBAdmFye291dHB1dC1mb3JtYXR9IGlzIEBzYW1we0lFRUV9Ci0KLUBpdGVtCi1DT0ZGICh0aGUgQHNhbXB7Y29mZi1tNjhrfSB2YXJpYW50IGluIEJGRCksIGlmIEB2YXJ7b3V0cHV0LWZvcm1hdH0gaXMKLUBzYW1we0NPRkZ9Ci1AZW5kIGVudW1lcmF0ZQotCi1AY2luZGV4IEBjb2Rle0xJU1R9IChNUkkpCi1AaXRlbSBMSVNUIEB2YXJ7YW55dGhpbmd9QGRvdHN7fQotUHJpbnQgKHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgZmlsZSkgYSBsaW5rIG1hcCwgYXMgcHJvZHVjZWQgYnkgdGhlCi1AY29kZXtsZH0gY29tbWFuZC1saW5lIG9wdGlvbiBAc2FtcHstTX0uCi0KLVRoZSBrZXl3b3JkIEBjb2Rle0xJU1R9IG1heSBiZSBmb2xsb3dlZCBieSBhbnl0aGluZyBvbiB0aGUKLXNhbWUgbGluZSwgd2l0aCBubyBjaGFuZ2UgaW4gaXRzIGVmZmVjdC4KLQotQGNpbmRleCBAY29kZXtMT0FEfSAoTVJJKQotQGl0ZW0gTE9BRCBAdmFye2ZpbGVuYW1lfQotQGl0ZW14IExPQUQgQHZhcntmaWxlbmFtZX0sIEB2YXJ7ZmlsZW5hbWV9LCBAZG90c3t9IEB2YXJ7ZmlsZW5hbWV9Ci1JbmNsdWRlIG9uZSBvciBtb3JlIG9iamVjdCBmaWxlIEB2YXJ7ZmlsZW5hbWV9IGluIHRoZSBsaW5rOyB0aGlzIGhhcyB0aGUKLXNhbWUgZWZmZWN0IGFzIHNwZWNpZnlpbmcgQHZhcntmaWxlbmFtZX0gZGlyZWN0bHkgb24gdGhlIEBjb2Rle2xkfQotY29tbWFuZCBsaW5lLgotCi1AY2luZGV4IEBjb2Rle05BTUV9IChNUkkpCi1AaXRlbSBOQU1FIEB2YXJ7b3V0cHV0LW5hbWV9Ci1AdmFye291dHB1dC1uYW1lfSBpcyB0aGUgbmFtZSBmb3IgdGhlIHByb2dyYW0gcHJvZHVjZWQgYnkgQGNvZGV7bGR9OyB0aGUKLU1SSS1jb21wYXRpYmxlIGNvbW1hbmQgQGNvZGV7TkFNRX0gaXMgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZC1saW5lCi1vcHRpb24gQHNhbXB7LW99IG9yIHRoZSBnZW5lcmFsIHNjcmlwdCBsYW5ndWFnZSBjb21tYW5kIEBjb2Rle09VVFBVVH0uCi0KLUBjaW5kZXggQGNvZGV7T1JERVJ9IChNUkkpCi1AaXRlbSBPUkRFUiBAdmFye3NlY25hbWV9LCBAdmFye3NlY25hbWV9LCBAZG90c3t9IEB2YXJ7c2VjbmFtZX0KLUBpdGVteCBPUkRFUiBAdmFye3NlY25hbWV9IEB2YXJ7c2VjbmFtZX0gQHZhcntzZWNuYW1lfQotTm9ybWFsbHksIEBjb2Rle2xkfSBvcmRlcnMgdGhlIHNlY3Rpb25zIGluIGl0cyBvdXRwdXQgZmlsZSBpbiB0aGUKLW9yZGVyIGluIHdoaWNoIHRoZXkgZmlyc3QgYXBwZWFyIGluIHRoZSBpbnB1dCBmaWxlcy4gIEluIGFuIE1SSS1jb21wYXRpYmxlCi1zY3JpcHQsIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBvcmRlcmluZyB3aXRoIHRoZSBAY29kZXtPUkRFUn0gY29tbWFuZC4gIFRoZQotc2VjdGlvbnMgeW91IGxpc3Qgd2l0aCBAY29kZXtPUkRFUn0gd2lsbCBhcHBlYXIgZmlyc3QgaW4geW91ciBvdXRwdXQKLWZpbGUsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuCi0KLUBjaW5kZXggQGNvZGV7UFVCTElDfSAoTVJJKQotQGl0ZW0gUFVCTElDIEB2YXJ7bmFtZX09QHZhcntleHByZXNzaW9ufQotQGl0ZW14IFBVQkxJQyBAdmFye25hbWV9LEB2YXJ7ZXhwcmVzc2lvbn0KLUBpdGVteCBQVUJMSUMgQHZhcntuYW1lfSBAdmFye2V4cHJlc3Npb259Ci1TdXBwbHkgYSB2YWx1ZSAoQHZhcntleHByZXNzaW9ufSkgZm9yIGV4dGVybmFsIHN5bWJvbAotQHZhcntuYW1lfSB1c2VkIGluIHRoZSBsaW5rZXIgaW5wdXQgZmlsZXMuCi0KLUBjaW5kZXggQGNvZGV7U0VDVH0gKE1SSSkKLUBpdGVtIFNFQ1QgQHZhcntzZWNuYW1lfSwgQHZhcntleHByZXNzaW9ufQotQGl0ZW14IFNFQ1QgQHZhcntzZWNuYW1lfT1AdmFye2V4cHJlc3Npb259Ci1AaXRlbXggU0VDVCBAdmFye3NlY25hbWV9IEB2YXJ7ZXhwcmVzc2lvbn0KLVlvdSBjYW4gdXNlIGFueSBvZiB0aGVzZSB0aHJlZSBmb3JtcyBvZiB0aGUgQGNvZGV7U0VDVH0gY29tbWFuZCB0bwotc3BlY2lmeSB0aGUgc3RhcnQgYWRkcmVzcyAoQHZhcntleHByZXNzaW9ufSkgZm9yIHNlY3Rpb24gQHZhcntzZWNuYW1lfS4KLUlmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgQGNvZGV7U0VDVH0gc3RhdGVtZW50IGZvciB0aGUgc2FtZQotQHZhcntzZWNuYW1lfSwgb25seSB0aGUgQGVtcGh7Zmlyc3R9IHNldHMgdGhlIHN0YXJ0IGFkZHJlc3MuCi1AZW5kIHRhYmxlCi0KLUBub2RlIEluZGV4Ci1AdW5udW1iZXJlZCBJbmRleAotCi1AcHJpbnRpbmRleCBjcAotCi1AdGV4Ci0lIEkgdGhpbmsgc29tZXRoaW5nIGxpa2UgQGNvbG9waG9uIHNob3VsZCBiZSBpbiB0ZXhpbmZvLiAgSW4gdGhlCi0lIG1lYW50aW1lOgotXGxvbmdcZGVmXGNvbG9waG9ue1xoYm94IHRvMHB0e31cdmZpbGwKLVxjZW50ZXJsaW5le1RoZSBib2R5IG9mIHRoaXMgbWFudWFsIGlzIHNldCBpbn0KLVxjZW50ZXJsaW5le1xmb250bmFtZVx0ZW5ybSx9Ci1cY2VudGVybGluZXt3aXRoIGhlYWRpbmdzIGluIHtcYmZcZm9udG5hbWVcdGVuYmZ9fQotXGNlbnRlcmxpbmV7YW5kIGV4YW1wbGVzIGluIHtcdHRcZm9udG5hbWVcdGVudHR9Ln0KLVxjZW50ZXJsaW5le3tcaXRcZm9udG5hbWVcdGVuaXRcL30gYW5kfQotXGNlbnRlcmxpbmV7e1xzbFxmb250bmFtZVx0ZW5zbFwvfX0KLVxjZW50ZXJsaW5le2FyZSB1c2VkIGZvciBlbXBoYXNpcy59XHZmaWxsfQotXHBhZ2VcY29sb3Bob24KLSUgQmxhbWU6IGRvY0BjeWdudXMuY29tLCAyOG1hcjkxLgotQGVuZCB0ZXgKLQotCi1AY29udGVudHMKLUBieWUKLQotCmRpZmYgLS1naXQgYS9sZC9sZGNyZWYuYyBiL2xkL2xkY3JlZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmUwZDJkLi4wMDAwMDAwCi0tLSBhL2xkL2xkY3JlZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8qIGxkY3JlZi5jIC0tIG91dHB1dCBhIGNyb3NzIHJlZmVyZW5jZSB0YWJsZQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGhvbGRzIHJvdXRpbmVzIHRoYXQgbWFuYWdlIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUuCi0gICBUaGUgdGFibGUgaXMgdXNlZCB0byBnZW5lcmF0ZSBjcm9zcyByZWZlcmVuY2UgcmVwb3J0cy4gIEl0IGlzIGFsc28KLSAgIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBOT0NST1NTUkVGUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLQotLyogV2Uga2VlcCBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSBmb3IgZWFjaCByZWZlcmVuY2UgdG8gYQotICAgc3ltYm9sIGZyb20gYSBnaXZlbiBvYmplY3QuICAqLwotCi1zdHJ1Y3QgY3JlZl9yZWYKLXsKLSAgLyogVGhlIG5leHQgcmVmZXJlbmNlLiAgKi8KLSAgc3RydWN0IGNyZWZfcmVmICpuZXh0OwotICAvKiBUaGUgb2JqZWN0LiAgKi8KLSAgYmZkICphYmZkOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgZGVmaW5lZC4gICovCi0gIHVuc2lnbmVkIGludCBkZWYgOiAxOwotICAvKiBUcnVlIGlmIHRoZSBzeW1ib2wgaXMgY29tbW9uLiAgKi8KLSAgdW5zaWduZWQgaW50IGNvbW1vbiA6IDE7Ci0gIC8qIFRydWUgaWYgdGhlIHN5bWJvbCBpcyB1bmRlZmluZWQuICAqLwotICB1bnNpZ25lZCBpbnQgdW5kZWYgOiAxOwotfTsKLQotLyogV2Uga2VlcCBhIGhhc2ggdGFibGUgb2Ygc3ltYm9scy4gIEVhY2ggZW50cnkgbG9va3MgbGlrZSB0aGlzLiAgKi8KLQotc3RydWN0IGNyZWZfaGFzaF9lbnRyeQotewotICBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgcm9vdDsKLSAgLyogVGhlIGRlbWFuZ2xlZCBuYW1lLiAgKi8KLSAgY2hhciAqZGVtYW5nbGVkOwotICAvKiBSZWZlcmVuY2VzIHRvIGFuZCBkZWZpbml0aW9ucyBvZiB0aGlzIHN5bWJvbC4gICovCi0gIHN0cnVjdCBjcmVmX3JlZiAqcmVmczsKLX07Ci0KLS8qIFRoaXMgaXMgd2hhdCB0aGUgaGFzaCB0YWJsZSBsb29rcyBsaWtlLiAgKi8KLQotc3RydWN0IGNyZWZfaGFzaF90YWJsZQotewotICBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgcm9vdDsKLX07Ci0KLS8qIExvY2FsIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKmNyZWZfaGFzaF9uZXdmdW5jCi0gIFBBUkFNUyAoKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBjcmVmX2ZpbGxfYXJyYXkgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyBpbnQgY3JlZl9zb3J0X2FycmF5IFBBUkFNUyAoKGNvbnN0IFBUUiwgY29uc3QgUFRSKSk7Ci1zdGF0aWMgdm9pZCBvdXRwdXRfb25lX2NyZWYgUEFSQU1TICgoRklMRSAqLCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopKTsKLXN0YXRpYyBib29sZWFuIGNoZWNrX25vY3Jvc3NyZWYgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3JlZnMKLSAgUEFSQU1TICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqLCBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCSAgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICopKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3JlbG9jX3JlZnMgUEFSQU1TICgoYmZkICosIGFzZWN0aW9uICosIFBUUikpOwotCi0vKiBMb29rIHVwIGFuIGVudHJ5IGluIHRoZSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi0jZGVmaW5lIGNyZWZfaGFzaF9sb29rdXAodGFibGUsIHN0cmluZywgY3JlYXRlLCBjb3B5KQkJXAotICAoKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKikJCQkJCVwKLSAgIGJmZF9oYXNoX2xvb2t1cCAoJih0YWJsZSktPnJvb3QsIChzdHJpbmcpLCAoY3JlYXRlKSwgKGNvcHkpKSkKLQotLyogVHJhdmVyc2UgdGhlIGNyZWYgaGFzaCB0YWJsZS4gICovCi0KLSNkZWZpbmUgY3JlZl9oYXNoX3RyYXZlcnNlKHRhYmxlLCBmdW5jLCBpbmZvKQkJCQlcCi0gIChiZmRfaGFzaF90cmF2ZXJzZQkJCQkJCQlcCi0gICAoJih0YWJsZSktPnJvb3QsCQkJCQkJCVwKLSAgICAoYm9vbGVhbiAoKikgUEFSQU1TICgoc3RydWN0IGJmZF9oYXNoX2VudHJ5ICosIFBUUikpKSAoZnVuYyksCVwKLSAgICAoaW5mbykpKQotCi0vKiBUaGUgY3JlZiBoYXNoIHRhYmxlLiAgKi8KLQotc3RhdGljIHN0cnVjdCBjcmVmX2hhc2hfdGFibGUgY3JlZl90YWJsZTsKLQotLyogV2hldGhlciB0aGUgY3JlZiBoYXNoIHRhYmxlIGhhcyBiZWVuIGluaXRpYWxpemVkLiAgKi8KLQotc3RhdGljIGJvb2xlYW4gY3JlZl9pbml0aWFsaXplZDsKLQotLyogVGhlIG51bWJlciBvZiBzeW1ib2xzIHNlZW4gc28gZmFyLiAgKi8KLQotc3RhdGljIHNpemVfdCBjcmVmX3N5bWNvdW50OwotCi0vKiBDcmVhdGUgYW4gZW50cnkgaW4gYSBjcmVmIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICoKLWNyZWZfaGFzaF9uZXdmdW5jIChlbnRyeSwgdGFibGUsIHN0cmluZykKLSAgICAgc3RydWN0IGJmZF9oYXNoX2VudHJ5ICplbnRyeTsKLSAgICAgc3RydWN0IGJmZF9oYXNoX3RhYmxlICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpyZXQgPSAoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKSBlbnRyeTsKLQotICAvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBieSBhCi0gICAgIHN1YmNsYXNzLiAgKi8KLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldCA9ICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKQotCSAgIGJmZF9oYXNoX2FsbG9jYXRlICh0YWJsZSwgc2l6ZW9mIChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5KSkpOwotICBpZiAocmV0ID09IE5VTEwpCi0gICAgcmV0dXJuIChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0OwotCi0gIC8qIENhbGwgdGhlIGFsbG9jYXRpb24gbWV0aG9kIG9mIHRoZSBzdXBlcmNsYXNzLiAgKi8KLSAgcmV0ID0gKChzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICopCi0JIGJmZF9oYXNoX25ld2Z1bmMgKChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgcmV0LCB0YWJsZSwgc3RyaW5nKSk7Ci0gIGlmIChyZXQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBTZXQgbG9jYWwgZmllbGRzLiAgKi8KLSAgICAgIHJldC0+ZGVtYW5nbGVkID0gTlVMTDsKLSAgICAgIHJldC0+cmVmcyA9IE5VTEw7Ci0KLSAgICAgIC8qIEtlZXAgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY3JlYXRlZCBpbiB0aGUgaGFzaAotICAgICAgICAgdGFibGUuICAqLwotICAgICAgKytjcmVmX3N5bWNvdW50OwotICAgIH0KLQotICByZXR1cm4gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSByZXQ7Ci19Ci0KLS8qIEFkZCBhIHN5bWJvbCB0byB0aGUgY3JlZiBoYXNoIHRhYmxlLiAgVGhpcyBpcyBjYWxsZWQgZm9yIGV2ZXJ5Ci0gICBzeW1ib2wgdGhhdCBpcyBzZWVuIGR1cmluZyB0aGUgbGluay4gICovCi0KLS8qQVJHU1VTRUQqLwotdm9pZAotYWRkX2NyZWYgKG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICBzdHJ1Y3QgY3JlZl9yZWYgKnI7Ci0KLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0ICgmY3JlZl90YWJsZS5yb290LCBjcmVmX2hhc2hfbmV3ZnVuYykpCi0JZWluZm8gKF8oIiVYJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgb2YgY3JlZiB0YWJsZSBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgICBjcmVmX2luaXRpYWxpemVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgaCA9IGNyZWZfaGFzaF9sb29rdXAgKCZjcmVmX3RhYmxlLCBuYW1lLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChoID09IE5VTEwpCi0gICAgZWluZm8gKF8oIiVYJVA6IGNyZWZfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCi0gIGZvciAociA9IGgtPnJlZnM7IHIgIT0gTlVMTDsgciA9IHItPm5leHQpCi0gICAgaWYgKHItPmFiZmQgPT0gYWJmZCkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChyID09IE5VTEwpCi0gICAgewotICAgICAgciA9IChzdHJ1Y3QgY3JlZl9yZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpyKTsKLSAgICAgIHItPm5leHQgPSBoLT5yZWZzOwotICAgICAgaC0+cmVmcyA9IHI7Ci0gICAgICByLT5hYmZkID0gYWJmZDsKLSAgICAgIHItPmRlZiA9IGZhbHNlOwotICAgICAgci0+Y29tbW9uID0gZmFsc2U7Ci0gICAgICByLT51bmRlZiA9IGZhbHNlOwotICAgIH0KLQotICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLSAgICByLT51bmRlZiA9IHRydWU7Ci0gIGVsc2UgaWYgKGJmZF9pc19jb21fc2VjdGlvbiAoc2VjdGlvbikpCi0gICAgci0+Y29tbW9uID0gdHJ1ZTsKLSAgZWxzZQotICAgIHItPmRlZiA9IHRydWU7Ci19Ci0KLS8qIENvcHkgdGhlIGFkZHJlc3NlcyBvZiB0aGUgaGFzaCB0YWJsZSBlbnRyaWVzIGludG8gYW4gYXJyYXkuICBUaGlzCi0gICBpcyBjYWxsZWQgdmlhIGNyZWZfaGFzaF90cmF2ZXJzZS4gIFdlIGFsc28gZmlsbCBpbiB0aGUgZGVtYW5nbGVkCi0gICBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWNyZWZfZmlsbF9hcnJheSAoaCwgZGF0YSkKLSAgICAgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqaDsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKioqcHBoID0gKHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKioqKSBkYXRhOwotCi0gIEFTU0VSVCAoaC0+ZGVtYW5nbGVkID09IE5VTEwpOwotICBoLT5kZW1hbmdsZWQgPSBkZW1hbmdsZSAoaC0+cm9vdC5zdHJpbmcpOwotCi0gICoqcHBoID0gaDsKLQotICArKypwcGg7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFNvcnQgYW4gYXJyYXkgb2YgY3JlZiBoYXNoIHRhYmxlIGVudHJpZXMgYnkgbmFtZS4gICovCi0KLXN0YXRpYyBpbnQKLWNyZWZfc29ydF9hcnJheSAoYTEsIGEyKQotICAgICBjb25zdCBQVFIgYTE7Ci0gICAgIGNvbnN0IFBUUiBhMjsKLXsKLSAgY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKnAxID0gKGNvbnN0IHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKiopIGExOwotICBjb25zdCBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICoqcDIgPSAoY29uc3Qgc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikgYTI7Ci0KLSAgcmV0dXJuIHN0cmNtcCAoKCpwMSktPmRlbWFuZ2xlZCwgKCpwMiktPmRlbWFuZ2xlZCk7Ci19Ci0KLS8qIFdyaXRlIG91dCB0aGUgY3JlZiB0YWJsZS4gICovCi0KLSNkZWZpbmUgRklMRUNPTCAoNTApCi0KLXZvaWQKLW91dHB1dF9jcmVmIChmcCkKLSAgICAgRklMRSAqZnA7Ci17Ci0gIGludCBsZW47Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKipjc3ltcywgKipjc3ltX2ZpbGwsICoqY3N5bSwgKipjc3ltX2VuZDsKLSAgY29uc3QgY2hhciAqbXNnOwotCi0gIGZwcmludGYgKGZwLCBfKCJcbkNyb3NzIFJlZmVyZW5jZSBUYWJsZVxuXG4iKSk7Ci0gIG1zZyA9IF8oIlN5bWJvbCIpOwotICBmcHJpbnRmIChmcCwgbXNnKTsKLSAgbGVuID0gc3RybGVuIChtc2cpOwotICB3aGlsZSAobGVuIDwgRklMRUNPTCkKLSAgICB7Ci0gICAgICBwdXRjICgnICcgLCBmcCk7Ci0gICAgICArK2xlbjsKLSAgICB9Ci0gIGZwcmludGYgKGZwLCBfKCJGaWxlXG4iKSk7Ci0KLSAgaWYgKCEgY3JlZl9pbml0aWFsaXplZCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChmcCwgXygiTm8gc3ltYm9sc1xuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjc3ltcyA9ICgoc3RydWN0IGNyZWZfaGFzaF9lbnRyeSAqKikKLQkgICB4bWFsbG9jIChjcmVmX3N5bWNvdW50ICogc2l6ZW9mICgqY3N5bXMpKSk7Ci0KLSAgY3N5bV9maWxsID0gY3N5bXM7Ci0gIGNyZWZfaGFzaF90cmF2ZXJzZSAoJmNyZWZfdGFibGUsIGNyZWZfZmlsbF9hcnJheSwgJmNzeW1fZmlsbCk7Ci0gIEFTU0VSVCAoKHNpemVfdCkgKGNzeW1fZmlsbCAtIGNzeW1zKSA9PSBjcmVmX3N5bWNvdW50KTsKLQotICBxc29ydCAoY3N5bXMsIGNyZWZfc3ltY291bnQsIHNpemVvZiAoKmNzeW1zKSwgY3JlZl9zb3J0X2FycmF5KTsKLQotICBjc3ltX2VuZCA9IGNzeW1zICsgY3JlZl9zeW1jb3VudDsKLSAgZm9yIChjc3ltID0gY3N5bXM7IGNzeW0gPCBjc3ltX2VuZDsgY3N5bSsrKQotICAgIG91dHB1dF9vbmVfY3JlZiAoZnAsICpjc3ltKTsKLX0KLQotLyogT3V0cHV0IG9uZSBlbnRyeSBpbiB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLW91dHB1dF9vbmVfY3JlZiAoZnAsIGgpCi0gICAgIEZJTEUgKmZwOwotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotewotICBpbnQgbGVuOwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGw7Ci0gIHN0cnVjdCBjcmVmX3JlZiAqcjsKLQotICBobCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgaC0+cm9vdC5zdHJpbmcsIGZhbHNlLAotCQkJICAgICBmYWxzZSwgdHJ1ZSk7Ci0gIGlmIChobCA9PSBOVUxMKQotICAgIGVpbmZvICgiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIsCi0JICAgaC0+cm9vdC5zdHJpbmcpOwotICBlbHNlCi0gICAgewotICAgICAgLyogSWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCBpbiBhIGR5bmFtaWMgb2JqZWN0IGJ1dCBuZXZlcgotCSByZWZlcmVuY2VkIGJ5IGEgbm9ybWFsIG9iamVjdCwgdGhlbiBkb24ndCBwcmludCBpdC4gICovCi0gICAgICBpZiAoaGwtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkKQotCXsKLQkgIGlmIChobC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgcmV0dXJuOwotCSAgaWYgKGhsLT51LmRlZi5zZWN0aW9uLT5vd25lciAhPSBOVUxMCi0JICAgICAgJiYgKGhsLT51LmRlZi5zZWN0aW9uLT5vd25lci0+ZmxhZ3MgJiBEWU5BTUlDKSAhPSAwKQotCSAgICB7Ci0JICAgICAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLQkJaWYgKChyLT5hYmZkLT5mbGFncyAmIERZTkFNSUMpID09IDApCi0JCSAgYnJlYWs7Ci0JICAgICAgaWYgKHIgPT0gTlVMTCkKLQkJcmV0dXJuOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChmcCwgIiVzICIsIGgtPmRlbWFuZ2xlZCk7Ci0gIGxlbiA9IHN0cmxlbiAoaC0+ZGVtYW5nbGVkKSArIDE7Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoci0+ZGVmKQotCXsKLQkgIHdoaWxlIChsZW4gPCBGSUxFQ09MKQotCSAgICB7Ci0JICAgICAgcHV0YyAoJyAnLCBmcCk7Ci0JICAgICAgKytsZW47Ci0JICAgIH0KLQkgIGxmaW5mbyAoZnAsICIlQlxuIiwgci0+YWJmZCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICB9Ci0KLSAgZm9yIChyID0gaC0+cmVmczsgciAhPSBOVUxMOyByID0gci0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoISByLT5kZWYpCi0JewotCSAgd2hpbGUgKGxlbiA8IEZJTEVDT0wpCi0JICAgIHsKLQkgICAgICBwdXRjICgnICcsIGZwKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCSAgbGZpbmZvIChmcCwgIiVCXG4iLCByLT5hYmZkKTsKLQkgIGxlbiA9IDA7Ci0JfQotICAgIH0KLQotICBBU1NFUlQgKGxlbiA9PSAwKTsKLX0KLQotLyogQ2hlY2sgZm9yIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlcy4gICovCi0KLXZvaWQKLWNoZWNrX25vY3Jvc3NyZWZzICgpCi17Ci0gIGlmICghIGNyZWZfaW5pdGlhbGl6ZWQpCi0gICAgcmV0dXJuOwotCi0gIGNyZWZfaGFzaF90cmF2ZXJzZSAoJmNyZWZfdGFibGUsIGNoZWNrX25vY3Jvc3NyZWYsIChQVFIpIE5VTEwpOwotfQotCi0vKiBDaGVjayBvbmUgc3ltYm9sIHRvIHNlZSBpZiBpdCBpcyBhIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotY2hlY2tfbm9jcm9zc3JlZiAoaCwgaWdub3JlKQotICAgICBzdHJ1Y3QgY3JlZl9oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaWdub3JlOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGw7Ci0gIGFzZWN0aW9uICpkZWZzZWM7Ci0gIGNvbnN0IGNoYXIgKmRlZnNlY25hbWU7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuY3JzOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuY3I7Ci0KLSAgaGwgPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGgtPnJvb3Quc3RyaW5nLCBmYWxzZSwKLQkJCSAgICAgZmFsc2UsIHRydWUpOwotICBpZiAoaGwgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVA6IHN5bWJvbCBgJVQnIG1pc3NpbmcgZnJvbSBtYWluIGhhc2ggdGFibGVcbiIpLAotCSAgICAgaC0+cm9vdC5zdHJpbmcpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gIGlmIChobC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2RlZmluZWQKLSAgICAgICYmIGhsLT50eXBlICE9IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBkZWZzZWMgPSBobC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0gIGlmIChkZWZzZWMgPT0gTlVMTCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgZGVmc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChkZWZzZWMtPm93bmVyLCBkZWZzZWMpOwotCi0gIGZvciAobmNycyA9IG5vY3Jvc3NyZWZfbGlzdDsgbmNycyAhPSBOVUxMOyBuY3JzID0gbmNycy0+bmV4dCkKLSAgICBmb3IgKG5jciA9IG5jcnMtPmxpc3Q7IG5jciAhPSBOVUxMOyBuY3IgPSBuY3ItPm5leHQpCi0gICAgICBpZiAoc3RyY21wIChuY3ItPm5hbWUsIGRlZnNlY25hbWUpID09IDApCi0JY2hlY2tfcmVmcyAoaCwgaGwsIG5jcnMpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGUgc3RydWN0IGlzIHVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiBmcm9tIGNoZWNrX3JlZnMgdG8KLSAgIGNoZWNrX3JlbG9jX3JlZnMgdGhyb3VnaCBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi1zdHJ1Y3QgY2hlY2tfcmVmc19pbmZvCi17Ci0gIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gIGFzZWN0aW9uICpkZWZzZWM7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWZzICpuY3JzOwotICBhc3ltYm9sICoqYXN5bWJvbHM7Ci0gIGJvb2xlYW4gc2FtZTsKLX07Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIHN5bWJvbCBkZWZpbmVkIGluIGEgc2VjdGlvbiB3aGljaAotICAgcHJvaGliaXRzIGNyb3NzIHJlZmVyZW5jZXMuICBXZSBuZWVkIHRvIGxvb2sgdGhyb3VnaCBhbGwgcmVmZXJlbmNlcwotICAgdG8gdGhpcyBzeW1ib2wsIGFuZCBlbnN1cmUgdGhhdCB0aGUgcmVmZXJlbmNlcyBhcmUgbm90IGZyb20KLSAgIHByb2hpYml0ZWQgc2VjdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfcmVmcyAoaCwgaGwsIG5jcnMpCi0gICAgIHN0cnVjdCBjcmVmX2hhc2hfZW50cnkgKmg7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpobDsKLSAgICAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm5jcnM7Ci17Ci0gIHN0cnVjdCBjcmVmX3JlZiAqcmVmOwotCi0gIGZvciAocmVmID0gaC0+cmVmczsgcmVmICE9IE5VTEw7IHJlZiA9IHJlZi0+bmV4dCkKLSAgICB7Ci0gICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpsaTsKLSAgICAgIGFzeW1ib2wgKiphc3ltYm9sczsKLSAgICAgIHN0cnVjdCBjaGVja19yZWZzX2luZm8gaW5mbzsKLQotICAgICAgLyogV2UgbmVlZCB0byBsb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zIGZvciB0aGlzIEJGRCwgdG8gc2VlCi0gICAgICAgICBpZiBhbnkgb2YgdGhlIHJlbG9jYXRpb25zIHdoaWNoIHJlZmVyIHRvIHRoaXMgc3ltYm9sIGFyZSBmcm9tCi0gICAgICAgICBhIHByb2hpYml0ZWQgc2VjdGlvbi4gIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIGRvIHRoaXMgZXZlbiBmb3IKLSAgICAgICAgIHRoZSBCRkQgaW4gd2hpY2ggdGhlIHN5bWJvbCBpcyBkZWZpbmVkLCBzaW5jZSBldmVuIGEgc2luZ2xlCi0gICAgICAgICBCRkQgbWlnaHQgY29udGFpbiBhIHByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlOyBmb3IgdGhpcwotICAgICAgICAgY2FzZSwgd2Ugc2V0IHRoZSBTQU1FIGZpZWxkIGluIElORk8sIHdoaWNoIHdpbGwgY2F1c2UKLSAgICAgICAgIENIRUNLX1JFTE9DU19SRUZTIHRvIGNoZWNrIGZvciByZWxvY2F0aW9ucyBhZ2FpbnN0IHRoZQotICAgICAgICAgc2VjdGlvbiBhcyB3ZWxsIGFzIGFnYWluc3QgdGhlIHN5bWJvbC4gICovCi0KLSAgICAgIGxpID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgcmVmLT5hYmZkLT51c3JkYXRhOwotICAgICAgaWYgKGxpICE9IE5VTEwgJiYgbGktPmFzeW1ib2xzICE9IE5VTEwpCi0JYXN5bWJvbHMgPSBsaS0+YXN5bWJvbHM7Ci0gICAgICBlbHNlCi0JewotCSAgbG9uZyBzeW1zaXplOwotCSAgbG9uZyBzeW1ib2xfY291bnQ7Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAocmVmLT5hYmZkKTsKLQkgIGlmIChzeW1zaXplIDwgMCkKLQkgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM7ICVFXG4iKSwgcmVmLT5hYmZkKTsKLQkgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKHJlZi0+YWJmZCwgYXN5bWJvbHMpOwotCSAgaWYgKHN5bWJvbF9jb3VudCA8IDApCi0JICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIHJlZi0+YWJmZCk7Ci0JICBpZiAobGkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGxpLT5hc3ltYm9scyA9IGFzeW1ib2xzOwotCSAgICAgIGxpLT5zeW1ib2xfY291bnQgPSBzeW1ib2xfY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluZm8uaCA9IGg7Ci0gICAgICBpbmZvLmRlZnNlYyA9IGhsLT51LmRlZi5zZWN0aW9uOwotICAgICAgaW5mby5uY3JzID0gbmNyczsKLSAgICAgIGluZm8uYXN5bWJvbHMgPSBhc3ltYm9sczsKLSAgICAgIGlmIChyZWYtPmFiZmQgPT0gaGwtPnUuZGVmLnNlY3Rpb24tPm93bmVyKQotCWluZm8uc2FtZSA9IHRydWU7Ci0gICAgICBlbHNlCi0JaW5mby5zYW1lID0gZmFsc2U7Ci0gICAgICBiZmRfbWFwX292ZXJfc2VjdGlvbnMgKHJlZi0+YWJmZCwgY2hlY2tfcmVsb2NfcmVmcywgKFBUUikgJmluZm8pOwotCi0gICAgICBpZiAobGkgPT0gTlVMTCkKLQlmcmVlIChhc3ltYm9scyk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgSU5GTy0+SCBpcyBhIHN5bWJvbAotICAgZGVmaW5lZCBpbiBJTkZPLT5ERUZTRUNOQU1FLiAgSWYgdGhpcyBzZWN0aW9uIG1hcHMgaW50byBhbnkgb2YgdGhlCi0gICBzZWN0aW9ucyBsaXN0ZWQgaW4gSU5GTy0+TkNSUywgb3RoZXIgdGhhbiBJTkZPLT5ERUZTRUNOQU1FLCB0aGVuIHdlCi0gICBsb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zLiAgSWYgYW55IG9mIHRoZSByZWxvY2F0aW9ucyBhcmUgdG8KLSAgIElORk8tPkgsIHRoZW4gd2UgcmVwb3J0IGEgcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZXJyb3IuICAqLwotCi1zdGF0aWMgdm9pZAotY2hlY2tfcmVsb2NfcmVmcyAoYWJmZCwgc2VjLCBpYXJnKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBpYXJnOwotewotICBzdHJ1Y3QgY2hlY2tfcmVmc19pbmZvICppbmZvID0gKHN0cnVjdCBjaGVja19yZWZzX2luZm8gKikgaWFyZzsKLSAgYXNlY3Rpb24gKm91dHNlYzsKLSAgY29uc3QgY2hhciAqb3V0c2VjbmFtZTsKLSAgYXNlY3Rpb24gKm91dGRlZnNlYzsKLSAgY29uc3QgY2hhciAqb3V0ZGVmc2VjbmFtZTsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmNyOwotICBjb25zdCBjaGFyICpzeW1uYW1lOwotICBsb25nIHJlbHNpemU7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudDsKLSAgYXJlbGVudCAqKnAsICoqcGVuZDsKLQotICBvdXRzZWMgPSBzZWMtPm91dHB1dF9zZWN0aW9uOwotICBvdXRzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHNlYy0+b3duZXIsIG91dHNlYyk7Ci0KLSAgb3V0ZGVmc2VjID0gaW5mby0+ZGVmc2VjLT5vdXRwdXRfc2VjdGlvbjsKLSAgb3V0ZGVmc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRkZWZzZWMtPm93bmVyLCBvdXRkZWZzZWMpOwotCi0gIC8qIFRoZSBzZWN0aW9uIHdoZXJlIHRoZSBzeW1ib2wgaXMgZGVmaW5lZCBpcyBwZXJtaXR0ZWQuICAqLwotICBpZiAoc3RyY21wIChvdXRzZWNuYW1lLCBvdXRkZWZzZWNuYW1lKSA9PSAwKQotICAgIHJldHVybjsKLQotICBmb3IgKG5jciA9IGluZm8tPm5jcnMtPmxpc3Q7IG5jciAhPSBOVUxMOyBuY3IgPSBuY3ItPm5leHQpCi0gICAgaWYgKHN0cmNtcCAob3V0c2VjbmFtZSwgbmNyLT5uYW1lKSA9PSAwKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKG5jciA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBUaGlzIHNlY3Rpb24gaXMgb25lIGZvciB3aGljaCBjcm9zcyByZWZlcmVuY2VzIGFyZSBwcm9oaWJpdGVkLgotICAgICBMb29rIHRocm91Z2ggdGhlIHJlbG9jYXRpb25zLCBhbmQgc2VlIGlmIGFueSBvZiB0aGVtIGFyZSB0bwotICAgICBJTkZPLT5ILiAgKi8KLQotICBzeW1uYW1lID0gaW5mby0+aC0+cm9vdC5zdHJpbmc7Ci0KLSAgcmVsc2l6ZSA9IGJmZF9nZXRfcmVsb2NfdXBwZXJfYm91bmQgKGFiZmQsIHNlYyk7Ci0gIGlmIChyZWxzaXplIDwgMCkKLSAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgcmVsb2NzOiAlRVxuIiksIGFiZmQpOwotICBpZiAocmVsc2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICByZWxwcCA9IChhcmVsZW50ICoqKSB4bWFsbG9jIChyZWxzaXplKTsKLSAgcmVsY291bnQgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChhYmZkLCBzZWMsIHJlbHBwLCBpbmZvLT5hc3ltYm9scyk7Ci0gIGlmIChyZWxjb3VudCA8IDApCi0gICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKLQotICBwID0gcmVscHA7Ci0gIHBlbmQgPSBwICsgcmVsY291bnQ7Ci0gIGZvciAoOyBwIDwgcGVuZCAmJiAqcCAhPSBOVUxMOyBwKyspCi0gICAgewotICAgICAgYXJlbGVudCAqcSA9ICpwOwotCi0gICAgICBpZiAocS0+c3ltX3B0cl9wdHIgIT0gTlVMTAotCSAgJiYgKnEtPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkgICYmIChzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKCpxLT5zeW1fcHRyX3B0ciksIHN5bW5hbWUpID09IDAKLQkgICAgICB8fCAoaW5mby0+c2FtZQotCQkgICYmIGJmZF9nZXRfc2VjdGlvbiAoKnEtPnN5bV9wdHJfcHRyKSA9PSBpbmZvLT5kZWZzZWMpKSkKLQl7Ci0JICAvKiBXZSBmb3VuZCBhIHJlbG9jIGZvciB0aGUgc3ltYm9sLiAgVGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0gICAgICAgICAgICAgaW4gT1VUU0VDTkFNRS4gIFRoaXMgcmVsb2MgaXMgZnJvbSBhIHNlY3Rpb24gd2hpY2ggaXMKLSAgICAgICAgICAgICBtYXBwZWQgaW50byBhIHNlY3Rpb24gZnJvbSB3aGljaCByZWZlcmVuY2VzIHRvIE9VVFNFQ05BTUUKLSAgICAgICAgICAgICBhcmUgcHJvaGliaXRlZC4gIFdlIG11c3QgcmVwb3J0IGFuIGVycm9yLiAgKi8KLQkgIGVpbmZvIChfKCIlWCVDOiBwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tICVzIHRvIGAlVCcgaW4gJXNcbiIpLAotCQkgYWJmZCwgc2VjLCBxLT5hZGRyZXNzLCBvdXRzZWNuYW1lLAotCQkgYmZkX2FzeW1ib2xfbmFtZSAoKnEtPnN5bV9wdHJfcHRyKSwgb3V0ZGVmc2VjbmFtZSk7Ci0JfQotICAgIH0KLQotICBmcmVlIChyZWxwcCk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGN0b3IuYyBiL2xkL2xkY3Rvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQzNGI4Li4wMDAwMDAwCi0tLSBhL2xkL2xkY3Rvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qIGxkY3Rvci5jIC0tIGNvbnN0cnVjdG9yIHN1cHBvcnQgcm91dGluZXMKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBCeSBTdGV2ZSBDaGFtYmVybGFpbiA8c2FjQGN5Z251cy5jb20+Ci0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotCi1zdGF0aWMgaW50IGN0b3JfcHJpbyBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgY3Rvcl9jbXAgUEFSQU1TICgoY29uc3QgUFRSLCBjb25zdCBQVFIpKTsKLQotLyogVGhlIGxpc3Qgb2Ygc3RhdGVtZW50cyBuZWVkZWQgdG8gaGFuZGxlIGNvbnN0cnVjdG9ycy4gIFRoZXNlIGFyZQotICAgaW52b2tlZCBieSB0aGUgY29tbWFuZCBDT05TVFJVQ1RPUlMgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGNvbnN0cnVjdG9yX2xpc3Q7Ci0KLS8qIFdoZXRoZXIgdGhlIGNvbnN0cnVjdG9ycyBzaG91bGQgYmUgc29ydGVkLiAgTm90ZSB0aGF0IHRoaXMgaXMKLSAgIGdsb2JhbCBmb3IgdGhlIGVudGlyZSBsaW5rOyB3ZSBhc3N1bWUgdGhhdCB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlCi0gICBDT05TVFJVQ1RPUlMgY29tbWFuZCBpbiB0aGUgbGlua2VyIHNjcmlwdC4gICovCi1ib29sZWFuIGNvbnN0cnVjdG9yc19zb3J0ZWQ7Ci0KLS8qIFRoZSBzZXRzIHdlIGhhdmUgc2Vlbi4gICovCi1zdHJ1Y3Qgc2V0X2luZm8gKnNldHM7Ci0KLS8qIEFkZCBhbiBlbnRyeSB0byBhIHNldC4gIEggaXMgdGhlIGVudHJ5IGluIHRoZSBsaW5rZXIgaGFzaCB0YWJsZS4KLSAgIFJFTE9DIGlzIHRoZSByZWxvY2F0aW9uIHRvIHVzZSBmb3IgYW4gZW50cnkgaW4gdGhlIHNldC4gIFNFQ1RJT04KLSAgIGFuZCBWQUxVRSBhcmUgdGhlIHZhbHVlIHRvIGFkZC4gIFRoaXMgaXMgY2FsbGVkIGR1cmluZyB0aGUgZmlyc3QKLSAgIHBoYXNlIG9mIHRoZSBsaW5rLCB3aGVuIHdlIGFyZSBzdGlsbCBnYXRoZXJpbmcgc3ltYm9scyB0b2dldGhlci4KLSAgIFdlIGp1c3QgcmVjb3JkIHRoZSBpbmZvcm1hdGlvbiBub3cuICBUaGUgbGRjdG9yX2ZpbmRfY29uc3RydWN0b3JzCi0gICBmdW5jdGlvbiB3aWxsIGNvbnN0cnVjdCB0aGUgc2V0cy4gICovCi0KLXZvaWQKLWxkY3Rvcl9hZGRfc2V0X2VudHJ5IChoLCByZWxvYywgbmFtZSwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzdHJ1Y3Qgc2V0X2luZm8gKnA7Ci0gIHN0cnVjdCBzZXRfZWxlbWVudCAqZTsKLSAgc3RydWN0IHNldF9lbGVtZW50ICoqZXBwOwotCi0gIGZvciAocCA9IHNldHM7IHAgIT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICBpZiAocC0+aCA9PSBoKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKHAgPT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMKQotICAgIHsKLSAgICAgIHAgPSAoc3RydWN0IHNldF9pbmZvICopIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IHNldF9pbmZvKSk7Ci0gICAgICBwLT5uZXh0ID0gc2V0czsKLSAgICAgIHNldHMgPSBwOwotICAgICAgcC0+aCA9IGg7Ci0gICAgICBwLT5yZWxvYyA9IHJlbG9jOwotICAgICAgcC0+Y291bnQgPSAwOwotICAgICAgcC0+ZWxlbWVudHMgPSBOVUxMOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChwLT5yZWxvYyAhPSByZWxvYykKLQl7Ci0JICBlaW5mbyAoXygiJVAlWDogRGlmZmVyZW50IHJlbG9jcyB1c2VkIGluIHNldCAlc1xuIiksIGgtPnJvb3Quc3RyaW5nKTsKLQkgIHJldHVybjsKLQl9Ci0KLSAgICAgIC8qIERvbid0IHBlcm1pdCBhIHNldCB0byBiZSBjb25zdHJ1Y3RlZCBmcm9tIGRpZmZlcmVudCBvYmplY3QKLSAgICAgICAgIGZpbGUgZm9ybWF0cy4gIFRoZSBzYW1lIHJlbG9jIG1heSBoYXZlIGRpZmZlcmVudCByZXN1bHRzLiAgV2UKLSAgICAgICAgIGFjdHVhbGx5IGNvdWxkIHNvbWV0aW1lcyBoYW5kbGUgdGhpcywgYnV0IHRoZSBjYXNlIGlzCi0gICAgICAgICB1bmxpa2VseSB0byBldmVyIGFyaXNlLiAgU29tZXRpbWVzIGNvbnN0cnVjdG9yIHN5bWJvbHMgYXJlIGluCi0gICAgICAgICB1bnVzdWFsIHNlY3Rpb25zLCBzdWNoIGFzIHRoZSBhYnNvbHV0ZSBzZWN0aW9uLS10aGlzIGFwcGVhcnMKLSAgICAgICAgIHRvIGJlIHRoZSBjYXNlIGluIExpbnV4IGEub3V0LS1hbmQgaW4gc3VjaCBjYXNlcyB3ZSBqdXN0Ci0gICAgICAgICBhc3N1bWUgZXZlcnl0aGluZyBpcyBPSy4gICovCi0gICAgICBpZiAocC0+ZWxlbWVudHMgIT0gTlVMTAotCSAgJiYgc2VjdGlvbi0+b3duZXIgIT0gTlVMTAotCSAgJiYgcC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoYmZkX2dldF90YXJnZXQgKHNlY3Rpb24tPm93bmVyKSwKLQkJICAgICBiZmRfZ2V0X3RhcmdldCAocC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyKSkgIT0gMCkKLQl7Ci0JICBlaW5mbyAoXygiJVAlWDogRGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgY29tcG9zaW5nIHNldCAlc1xuIiksCi0JCSBoLT5yb290LnN0cmluZyk7Ci0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBlID0gKHN0cnVjdCBzZXRfZWxlbWVudCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBzZXRfZWxlbWVudCkpOwotICBlLT5uZXh0ID0gTlVMTDsKLSAgZS0+bmFtZSA9IG5hbWU7Ci0gIGUtPnNlY3Rpb24gPSBzZWN0aW9uOwotICBlLT52YWx1ZSA9IHZhbHVlOwotCi0gIGZvciAoZXBwID0gJnAtPmVsZW1lbnRzOyAqZXBwICE9IE5VTEw7IGVwcCA9ICYoKmVwcCktPm5leHQpCi0gICAgOwotICAqZXBwID0gZTsKLQotICArK3AtPmNvdW50OwotfQotCi0vKiBHZXQgdGhlIHByaW9yaXR5IG9mIGEgZysrIGdsb2JhbCBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGZyb20gdGhlCi0gICBzeW1ib2wgbmFtZS4gICovCi0KLXN0YXRpYyBpbnQKLWN0b3JfcHJpbyAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgLyogVGhlIG5hbWUgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlIF9HTE9CQUxfJEkkNjU1MzUkdGVzdDAyX19Gdi4KLSAgICAgVGhlcmUgbWlnaHQgYmUgZXh0cmEgbGVhZGluZyB1bmRlcnNjb3JlcywgYW5kIHRoZSAkIGNoYXJhY3RlcnMKLSAgICAgbWlnaHQgYmUgc29tZXRoaW5nIGVsc2UuICBUaGUgSSBtaWdodCBiZSBhIEQuICAqLwotCi0gIHdoaWxlICgqbmFtZSA9PSAnXycpCi0gICAgKytuYW1lOwotCi0gIGlmIChzdHJuY21wIChuYW1lLCAiR0xPQkFMXyIsICBzaXplb2YgIkdMT0JBTF8iIC0gMSkgIT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbmFtZSArPSBzaXplb2YgIkdMT0JBTF8iIC0gMTsKLQotICBpZiAobmFtZVswXSAhPSBuYW1lWzJdKQotICAgIHJldHVybiAtMTsKLSAgaWYgKG5hbWVbMV0gIT0gJ0knICYmIG5hbWVbMV0gIT0gJ0QnKQotICAgIHJldHVybiAtMTsKLSAgaWYgKCEgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpIG5hbWVbM10pKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gYXRvaSAobmFtZSArIDMpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc29ydCBjb25zdHJ1Y3RvciBlbGVtZW50cyBieSBwcmlvcml0eS4gIEl0Ci0gICBpcyBjYWxsZWQgdmlhIHFzb3J0LiAgKi8KLQotc3RhdGljIGludAotY3Rvcl9jbXAgKHAxLCBwMikKLSAgICAgY29uc3QgUFRSIHAxOwotICAgICBjb25zdCBQVFIgcDI7Ci17Ci0gIGNvbnN0IHN0cnVjdCBzZXRfZWxlbWVudCAqKnBlMSA9IChjb25zdCBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiopIHAxOwotICBjb25zdCBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKipwZTIgPSAoY29uc3Qgc3RydWN0IHNldF9lbGVtZW50ICoqKSBwMjsKLSAgY29uc3QgY2hhciAqbjE7Ci0gIGNvbnN0IGNoYXIgKm4yOwotICBpbnQgcHJpbzE7Ci0gIGludCBwcmlvMjsKLQotICBuMSA9ICgqcGUxKS0+bmFtZTsKLSAgaWYgKG4xID09IE5VTEwpCi0gICAgbjEgPSAiIjsKLSAgbjIgPSAoKnBlMiktPm5hbWU7Ci0gIGlmIChuMiA9PSBOVUxMKQotICAgIG4yID0gIiI7Ci0KLSAgLyogV2UgbmVlZCB0byBzb3J0IGluIHJldmVyc2Ugb3JkZXIgYnkgcHJpb3JpdHkuICBXaGVuIHR3bwotICAgICBjb25zdHJ1Y3RvcnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSwgd2Ugc2hvdWxkIG1haW50YWluIHRoZWlyCi0gICAgIGN1cnJlbnQgcmVsYXRpdmUgcG9zaXRpb24uICAqLwotCi0gIHByaW8xID0gY3Rvcl9wcmlvIChuMSk7Ci0gIHByaW8yID0gY3Rvcl9wcmlvIChuMik7Ci0KLSAgLyogV2Ugc29ydCBpbiByZXZlcnNlIG9yZGVyIGJlY2F1c2UgdGhhdCBpcyB3aGF0IGcrKyBleHBlY3RzLiAgKi8KLSAgaWYgKHByaW8xIDwgcHJpbzIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UgaWYgKHByaW8xID4gcHJpbzIpCi0gICAgcmV0dXJuIC0xOwotCi0gIC8qIEZvcmNlIGEgc3RhYmxlIHNvcnQuICAqLwotCi0gIGlmIChwZTEgPCBwZTIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChwZTEgPiBwZTIpCi0gICAgcmV0dXJuIDE7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGZpcnN0IHBoYXNlIG9mIHRoZSBsaW5rIGFuZAotICAgYmVmb3JlIHRoZSBzZWNvbmQgcGhhc2UuICBBdCB0aGlzIHBvaW50IGFsbCBzZXQgaW5mb3JtYXRpb24gaGFzCi0gICBiZWVuIGdhdGhlcmVkLiAgV2Ugbm93IHB1dCB0aGUgc3RhdGVtZW50cyB0byBidWlsZCB0aGUgc2V0cwotICAgdGhlbXNlbHZlcyBpbnRvIGNvbnN0cnVjdG9yX2xpc3QuICAqLwotCi12b2lkCi1sZGN0b3JfYnVpbGRfc2V0cyAoKQotewotICBzdGF0aWMgYm9vbGVhbiBjYWxsZWQ7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqb2xkOwotICBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICBzdHJ1Y3Qgc2V0X2luZm8gKnA7Ci0KLSAgLyogVGhlIGVtdWxhdGlvbiBjb2RlIG1heSBjYWxsIHVzIGRpcmVjdGx5LCBidXQgd2Ugb25seSB3YW50IHRvIGRvCi0gICAgIHRoaXMgb25jZS4gICovCi0gIGlmIChjYWxsZWQpCi0gICAgcmV0dXJuOwotICBjYWxsZWQgPSB0cnVlOwotCi0gIGlmIChjb25zdHJ1Y3RvcnNfc29ydGVkKQotICAgIHsKLSAgICAgIGZvciAocCA9IHNldHM7IHAgIT0gTlVMTDsgcCA9IHAtPm5leHQpCi0JewotCSAgaW50IGMsIGk7Ci0JICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmU7Ci0JICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKiphcnJheTsKLQotCSAgaWYgKHAtPmVsZW1lbnRzID09IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCi0JICBjID0gMDsKLQkgIGZvciAoZSA9IHAtPmVsZW1lbnRzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotCSAgICArK2M7Ci0KLQkgIGFycmF5ID0gKHN0cnVjdCBzZXRfZWxlbWVudCAqKikgeG1hbGxvYyAoYyAqIHNpemVvZiAqYXJyYXkpOwotCi0JICBpID0gMDsKLQkgIGZvciAoZSA9IHAtPmVsZW1lbnRzOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KQotCSAgICB7Ci0JICAgICAgYXJyYXlbaV0gPSBlOwotCSAgICAgICsraTsKLQkgICAgfQotCi0JICBxc29ydCAoYXJyYXksIGMsIHNpemVvZiAqYXJyYXksIGN0b3JfY21wKTsKLQotCSAgZSA9IGFycmF5WzBdOwotCSAgcC0+ZWxlbWVudHMgPSBlOwotCSAgZm9yIChpID0gMDsgaSA8IGMgLSAxOyBpKyspCi0JICAgIGFycmF5W2ldLT5uZXh0ID0gYXJyYXlbaSArIDFdOwotCSAgYXJyYXlbaV0tPm5leHQgPSBOVUxMOwotCi0JICBmcmVlIChhcnJheSk7Ci0JfQotICAgIH0KLQotICBvbGQgPSBzdGF0X3B0cjsKLSAgc3RhdF9wdHIgPSAmY29uc3RydWN0b3JfbGlzdDsKLQotICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gIGhlYWRlcl9wcmludGVkID0gZmFsc2U7Ci0gIGZvciAocCA9IHNldHM7IHAgIT0gKHN0cnVjdCBzZXRfaW5mbyAqKSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2V0X2VsZW1lbnQgKmU7Ci0gICAgICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLSAgICAgIGludCByZWxvY19zaXplLCBzaXplOwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHdlIG1heSBoYXZlIGJlZW4gaW52b2tlZCBmcm9tCi0JIGNvbGxlY3QsIGFuZCB0aGUgc2V0cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYnVpbHQsIHNvIHdlIGRvCi0JIG5vdCBkbyBhbnl0aGluZy4gICovCi0gICAgICBpZiAocC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBGb3IgZWFjaCBzZXQgd2UgYnVpbGQ6Ci0JICAgc2V0OgotCSAgICAgLmxvbmcgbnVtYmVyX29mX2VsZW1lbnRzCi0JICAgICAubG9uZyBlbGVtZW50MAotCSAgICAgLi4uCi0JICAgICAubG9uZyBlbGVtZW50TgotCSAgICAgLmxvbmcgMAotCSBleGNlcHQgdGhhdCB3ZSB1c2UgdGhlIHJpZ2h0IHNpemUgaW5zdGVhZCBvZiAubG9uZy4gIFdoZW4KLQkgZ2VuZXJhdGluZyByZWxvY2F0ZWFibGUgb3V0cHV0LCB3ZSBnZW5lcmF0ZSByZWxvY3MgaW5zdGVhZCBvZgotCSBhZGRyZXNzZXMuICAqLwotICAgICAgaG93dG8gPSBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKG91dHB1dF9iZmQsIHAtPnJlbG9jKTsKLSAgICAgIGlmIChob3d0byA9PSAocmVsb2NfaG93dG9fdHlwZSAqKSBOVUxMKQotCXsKLQkgIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCSAgICB7Ci0JICAgICAgZWluZm8gKF8oIiVQJVg6ICVzIGRvZXMgbm90IHN1cHBvcnQgcmVsb2MgJXMgZm9yIHNldCAlc1xuIiksCi0JCSAgICAgYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLAotCQkgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChwLT5yZWxvYyksCi0JCSAgICAgcC0+aC0+cm9vdC5zdHJpbmcpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoaXMgaXMgbm90IGEgcmVsb2NhdGVhYmxlIGxpbmssIGFsbCB3ZSBuZWVkIGlzIHRoZQotCSAgICAgc2l6ZSwgd2hpY2ggd2UgY2FuIGdldCBmcm9tIHRoZSBpbnB1dCBCRkQuICAqLwotCSAgaWYgKHAtPmVsZW1lbnRzLT5zZWN0aW9uLT5vd25lciAhPSBOVUxMKQotCSAgICBob3d0byA9IGJmZF9yZWxvY190eXBlX2xvb2t1cCAocC0+ZWxlbWVudHMtPnNlY3Rpb24tPm93bmVyLAotCQkJCQkgICBwLT5yZWxvYyk7Ci0JICBpZiAoaG93dG8gPT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVpbmZvIChfKCIlUCVYOiAlcyBkb2VzIG5vdCBzdXBwb3J0IHJlbG9jICVzIGZvciBzZXQgJXNcbiIpLAotCQkgICAgIGJmZF9nZXRfdGFyZ2V0IChwLT5lbGVtZW50cy0+c2VjdGlvbi0+b3duZXIpLAotCQkgICAgIGJmZF9nZXRfcmVsb2NfY29kZV9uYW1lIChwLT5yZWxvYyksCi0JCSAgICAgcC0+aC0+cm9vdC5zdHJpbmcpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0JfQotCi0gICAgICByZWxvY19zaXplID0gYmZkX2dldF9yZWxvY19zaXplIChob3d0byk7Ci0gICAgICBzd2l0Y2ggKHJlbG9jX3NpemUpCi0JewotCWNhc2UgMTogc2l6ZSA9IEJZVEU7IGJyZWFrOwotCWNhc2UgMjogc2l6ZSA9IFNIT1JUOyBicmVhazsKLQljYXNlIDQ6IHNpemUgPSBMT05HOyBicmVhazsKLQljYXNlIDg6Ci0JICBpZiAoaG93dG8tPmNvbXBsYWluX29uX292ZXJmbG93ID09IGNvbXBsYWluX292ZXJmbG93X3NpZ25lZCkKLQkgICAgc2l6ZSA9IFNRVUFEOwotCSAgZWxzZQotCSAgICBzaXplID0gUVVBRDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBlaW5mbyAoXygiJVAlWDogVW5zdXBwb3J0ZWQgc2l6ZSAlZCBmb3Igc2V0ICVzXG4iKSwKLQkJIGJmZF9nZXRfcmVsb2Nfc2l6ZSAoaG93dG8pLCBwLT5oLT5yb290LnN0cmluZyk7Ci0JICBzaXplID0gTE9ORzsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICIuIiwKLQkJCQkgICAgICBleHBfdW5vcCAoQUxJR05fSywKLQkJCQkJCWV4cF9pbnRvcCAocmVsb2Nfc2l6ZSkpKSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgcC0+aC0+cm9vdC5zdHJpbmcsCi0JCQkJICAgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSkpOwotICAgICAgbGFuZ19hZGRfZGF0YSAoc2l6ZSwgZXhwX2ludG9wICgoYmZkX3ZtYSkgcC0+Y291bnQpKTsKLQotICAgICAgZm9yIChlID0gcC0+ZWxlbWVudHM7IGUgIT0gKHN0cnVjdCBzZXRfZWxlbWVudCAqKSBOVUxMOyBlID0gZS0+bmV4dCkKLQl7Ci0JICBpZiAoY29uZmlnLm1hcF9maWxlICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpbnQgbGVuOwotCi0JICAgICAgaWYgKCEgaGVhZGVyX3ByaW50ZWQpCi0JCXsKLQkJICBtaW5mbyAoXygiXG5TZXQgICAgICAgICAgICAgICAgIFN5bWJvbFxuXG4iKSk7Ci0JCSAgaGVhZGVyX3ByaW50ZWQgPSB0cnVlOwotCQl9Ci0KLQkgICAgICBtaW5mbyAoIiVzIiwgcC0+aC0+cm9vdC5zdHJpbmcpOwotCSAgICAgIGxlbiA9IHN0cmxlbiAocC0+aC0+cm9vdC5zdHJpbmcpOwotCi0JICAgICAgaWYgKGxlbiA+PSAxOSkKLQkJewotCQkgIHByaW50X25sICgpOwotCQkgIGxlbiA9IDA7Ci0JCX0KLQkgICAgICB3aGlsZSAobGVuIDwgMjApCi0JCXsKLQkJICBwcmludF9zcGFjZSAoKTsKLQkJICArK2xlbjsKLQkJfQotCi0JICAgICAgaWYgKGUtPm5hbWUgIT0gTlVMTCkKLQkJbWluZm8gKCIlVFxuIiwgZS0+bmFtZSk7Ci0JICAgICAgZWxzZQotCQltaW5mbyAoIiVHXG4iLCBlLT5zZWN0aW9uLT5vd25lciwgZS0+c2VjdGlvbiwgZS0+dmFsdWUpOwotCSAgICB9Ci0KLSAgICAgICAgICAvKiBOZWVkIFNFQ19LRUVQIGZvciAtLWdjLXNlY3Rpb25zICovCi0JICBpZiAoISBiZmRfaXNfYWJzX3NlY3Rpb24gKGUtPnNlY3Rpb24pKQotCSAgICBlLT5zZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLQotCSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0JICAgIGxhbmdfYWRkX3JlbG9jIChwLT5yZWxvYywgaG93dG8sIGUtPnNlY3Rpb24sIGUtPm5hbWUsCi0JCQkgICAgZXhwX2ludG9wIChlLT52YWx1ZSkpOwotCSAgZWxzZQotCSAgICBsYW5nX2FkZF9kYXRhIChzaXplLCBleHBfcmVsb3AgKGUtPnNlY3Rpb24sIGUtPnZhbHVlKSk7Ci0JfQotCi0gICAgICBsYW5nX2FkZF9kYXRhIChzaXplLCBleHBfaW50b3AgKDApKTsKLSAgICB9Ci0KLSAgc3RhdF9wdHIgPSBvbGQ7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGN0b3IuaCBiL2xkL2xkY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODczZjc3Li4wMDAwMDAwCi0tLSBhL2xkL2xkY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyogbGRjdG9yLmggLSBsaW5rZXIgY29uc3RydWN0b3Igc3VwcG9ydAotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExEQ1RPUl9ICi0jZGVmaW5lIExEQ1RPUl9ICi0KLS8qIExpc3Qgb2Ygc3RhdGVtZW50cyBuZWVkZWQgdG8gaGFuZGxlIGNvbnN0cnVjdG9ycyAqLwotZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjb25zdHJ1Y3Rvcl9saXN0OwotCi0vKiBXaGV0aGVyIHRoZSBjb25zdHJ1Y3RvcnMgc2hvdWxkIGJlIHNvcnRlZC4gIE5vdGUgdGhhdCB0aGlzIGlzCi0gICBnbG9iYWwgZm9yIHRoZSBlbnRpcmUgbGluazsgd2UgYXNzdW1lIHRoYXQgdGhlcmUgaXMgb25seSBhIHNpbmdsZQotICAgQ09OU1RSVUNUT1JTIGNvbW1hbmQgaW4gdGhlIGxpbmtlciBzY3JpcHQuICAqLwotZXh0ZXJuIGJvb2xlYW4gY29uc3RydWN0b3JzX3NvcnRlZDsKLQotLyogV2Uga2VlcCBhIGxpc3Qgb2YgdGhlc2Ugc3RydWN0dXJlcyBmb3IgZWFjaCBzZXQgd2UgYnVpbGQuICAqLwotCi1zdHJ1Y3Qgc2V0X2luZm8KLXsKLSAgc3RydWN0IHNldF9pbmZvICpuZXh0OwkJLyogTmV4dCBzZXQuICAqLwotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsJLyogSGFzaCB0YWJsZSBlbnRyeS4gICovCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsJLyogUmVsb2MgdG8gdXNlIGZvciBhbiBlbnRyeS4gICovCi0gIHNpemVfdCBjb3VudDsJCQkJLyogTnVtYmVyIG9mIGVsZW1lbnRzLiAgKi8KLSAgc3RydWN0IHNldF9lbGVtZW50ICplbGVtZW50czsJCS8qIEVsZW1lbnRzIGluIHNldC4gICovCi19OwotCi1zdHJ1Y3Qgc2V0X2VsZW1lbnQKLXsKLSAgc3RydWN0IHNldF9lbGVtZW50ICpuZXh0OwkJLyogTmV4dCBlbGVtZW50LiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsJCQkvKiBOYW1lIGluIHNldCAobWF5IGJlIE5VTEwpLiAgKi8KLSAgYXNlY3Rpb24gKnNlY3Rpb247CQkJLyogU2VjdGlvbiBvZiB2YWx1ZSBpbiBzZXQuICAqLwotICBiZmRfdm1hIHZhbHVlOwkJCS8qIFZhbHVlIGluIHNldC4gICovCi19OwotCi0vKiBUaGUgc2V0cyB3ZSBoYXZlIHNlZW4uICAqLwotCi1leHRlcm4gc3RydWN0IHNldF9pbmZvICpzZXRzOwotCi1leHRlcm4gdm9pZCBsZGN0b3JfYWRkX3NldF9lbnRyeSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCQkgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkJICBjb25zdCBjaGFyICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLWV4dGVybiB2b2lkIGxkY3Rvcl9idWlsZF9zZXRzIFBBUkFNUyAoKHZvaWQpKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9sZC9sZGVtdWwuYyBiL2xkL2xkZW11bC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWIwNDMyLi4wMDAwMDAwCi0tLSBhL2xkL2xkZW11bC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk4ICswLDAgQEAKLS8qIGxkZW11bC5jIC0tIGNsZWFyaW5nIGhvdXNlIGZvciBsZCBlbXVsYXRpb24gc3RhdGVzCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLWxpc3QuaCIKLQotbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqbGRfZW11bGF0aW9uOwotCi12b2lkCi1sZGVtdWxfaGxsKG5hbWUpCi0gICAgIGNoYXIgKm5hbWU7Ci17Ci0gIGxkX2VtdWxhdGlvbi0+aGxsKG5hbWUpOwotfQotCi0KLXZvaWQgbGRlbXVsX3N5c2xpYihuYW1lKQotICAgICBjaGFyICpuYW1lOwotewotICBsZF9lbXVsYXRpb24tPnN5c2xpYihuYW1lKTsKLX0KLQotdm9pZAotbGRlbXVsX2FmdGVyX3BhcnNlKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5hZnRlcl9wYXJzZSgpOwotfQotCi12b2lkCi1sZGVtdWxfYmVmb3JlX3BhcnNlKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5iZWZvcmVfcGFyc2UoKTsKLX0KLQotdm9pZAotbGRlbXVsX2FmdGVyX29wZW4gKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5hZnRlcl9vcGVuICgpOwotfQotCi12b2lkIAotbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24oKQotewotICBsZF9lbXVsYXRpb24tPmFmdGVyX2FsbG9jYXRpb24oKTsKLX0KLQotdm9pZCAKLWxkZW11bF9iZWZvcmVfYWxsb2NhdGlvbigpCi17Ci0gIGlmIChsZF9lbXVsYXRpb24tPmJlZm9yZV9hbGxvY2F0aW9uKQotICAgIGxkX2VtdWxhdGlvbi0+YmVmb3JlX2FsbG9jYXRpb24oKTsKLX0KLQotCi12b2lkCi1sZGVtdWxfc2V0X291dHB1dF9hcmNoKCkKLXsKLSAgbGRfZW11bGF0aW9uLT5zZXRfb3V0cHV0X2FyY2goKTsKLX0KLQotdm9pZAotbGRlbXVsX2ZpbmlzaCgpCi17Ci0gIGlmIChsZF9lbXVsYXRpb24tPmZpbmlzaCkKLSAgICBsZF9lbXVsYXRpb24tPmZpbmlzaCgpOwotfQotCi12b2lkCi1sZGVtdWxfc2V0X3N5bWJvbHMoKQotewotICBpZiAobGRfZW11bGF0aW9uLT5zZXRfc3ltYm9scykKLSAgICBsZF9lbXVsYXRpb24tPnNldF9zeW1ib2xzKCk7Ci19Ci0KLXZvaWQKLWxkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cygpCi17Ci0gIGlmIChsZF9lbXVsYXRpb24tPmNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKQotICAgIGxkX2VtdWxhdGlvbi0+Y3JlYXRlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudHMoKTsKLX0KLQotY2hhciAqCi1sZGVtdWxfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewotICByZXR1cm4gbGRfZW11bGF0aW9uLT5nZXRfc2NyaXB0KGlzZmlsZSk7Ci19Ci0KLWJvb2xlYW4KLWxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSAoYXJjaCwgc2VhcmNoLCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXJjaDsKLSAgICAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLXsKLSAgaWYgKGxkX2VtdWxhdGlvbi0+b3Blbl9keW5hbWljX2FyY2hpdmUpCi0gICAgcmV0dXJuICgqbGRfZW11bGF0aW9uLT5vcGVuX2R5bmFtaWNfYXJjaGl2ZSkgKGFyY2gsIHNlYXJjaCwgZW50cnkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2xlYW4KLWxkZW11bF9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBpZiAobGRfZW11bGF0aW9uLT5wbGFjZV9vcnBoYW4pCi0gICAgcmV0dXJuICgqbGRfZW11bGF0aW9uLT5wbGFjZV9vcnBoYW4pIChmaWxlLCBzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQKLWxkZW11bF9wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIC8qIFRyeSBhbmQgdXNlIHRoZSBlbXVsYXRpb24gcGFyc2VyIGlmIHRoZXJlIGlzIG9uZS4gKi8KLSAgaWYgKGxkX2VtdWxhdGlvbi0+cGFyc2VfYXJncykKLSAgICB7Ci0gICAgICByZXR1cm4gbGRfZW11bGF0aW9uLT5wYXJzZV9hcmdzIChhcmdjLCBhcmd2KTsKLSAgICB9Ci0gIHJldHVybiAwOwotfQotCi0vKiBMZXQgdGhlIGVtdWxhdGlvbiBjb2RlIGhhbmRsZSBhbiB1bnJlY29nbml6ZWQgZmlsZS4gICovCi0KLWJvb2xlYW4KLWxkZW11bF91bnJlY29nbml6ZWRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAobGRfZW11bGF0aW9uLT51bnJlY29nbml6ZWRfZmlsZSkKLSAgICByZXR1cm4gKCpsZF9lbXVsYXRpb24tPnVucmVjb2duaXplZF9maWxlKSAoZW50cnkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIExldCB0aGUgZW11bGF0aW9uIGNvZGUgaGFuZGxlIGEgcmVjb2duaXplZCBmaWxlLiAgKi8KLQotYm9vbGVhbgotbGRlbXVsX3JlY29nbml6ZWRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAobGRfZW11bGF0aW9uLT5yZWNvZ25pemVkX2ZpbGUpCi0gICAgcmV0dXJuICgqbGRfZW11bGF0aW9uLT5yZWNvZ25pemVkX2ZpbGUpIChlbnRyeSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotY2hhciAqCi1sZGVtdWxfY2hvb3NlX3RhcmdldCgpCi17Ci0gIHJldHVybiBsZF9lbXVsYXRpb24tPmNob29zZV90YXJnZXQoKTsKLX0KLQotLyogVGhlIGRlZmF1bHQgY2hvb3NlX3RhcmdldCBmdW5jdGlvbi4gICovCi0KLWNoYXIgKgotbGRlbXVsX2RlZmF1bHRfdGFyZ2V0KCkKLXsKLSAgY2hhciAqZnJvbV9vdXRzaWRlID0gZ2V0ZW52IChUQVJHRVRfRU5WSVJPTik7Ci0gIGlmIChmcm9tX291dHNpZGUgIT0gKGNoYXIgKilOVUxMKQotICAgIHJldHVybiBmcm9tX291dHNpZGU7Ci0gIHJldHVybiBsZF9lbXVsYXRpb24tPnRhcmdldF9uYW1lOwotfQotCi12b2lkIAotYWZ0ZXJfcGFyc2VfZGVmYXVsdCgpCi17Ci0KLX0KLQotdm9pZAotYWZ0ZXJfb3Blbl9kZWZhdWx0ICgpCi17Ci19Ci0KLXZvaWQKLWFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCgpCi17Ci0KLX0KLQotdm9pZAotYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCgpCi17Ci0KLX0KLQotdm9pZAotc2V0X291dHB1dF9hcmNoX2RlZmF1bHQoKQotewotICAvKiBTZXQgdGhlIG91dHB1dCBhcmNoaXRlY3R1cmUgYW5kIG1hY2hpbmUgaWYgcG9zc2libGUgKi8KLSAgYmZkX3NldF9hcmNoX21hY2gob3V0cHV0X2JmZCwKLQkgICAgICAgICAgICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwgbGRmaWxlX291dHB1dF9tYWNoaW5lKTsKLX0KLQotLypBUkdTVVNFRCovCi12b2lkCi1zeXNsaWJfZGVmYXVsdChpZ25vcmUpCi0gICAgIGNoYXIgICppZ25vcmU7Ci17Ci0gIGluZm9fbXNnIChfKCIlUyBTWVNMSUIgaWdub3JlZFxuIikpOwotfQotCi0vKkFSR1NVU0VEKi8KLXZvaWQKLWhsbF9kZWZhdWx0KGlnbm9yZSkKLSAgICAgY2hhciAgKmlnbm9yZTsKLXsKLSAgaW5mb19tc2cgKF8oIiVTIEhMTCBpZ25vcmVkXG4iKSk7Ci19Ci0KLWxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKmxkX2VtdWxhdGlvbnNbXSA9IHsgRU1VTEFUSU9OX0xJU1QgfTsKLQotdm9pZAotbGRlbXVsX2Nob29zZV9tb2RlKHRhcmdldCkKLSAgICAgY2hhciAqdGFyZ2V0OwotewotICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiplcHRyID0gbGRfZW11bGF0aW9uczsKLSAgICAvKiBJZ25vcmUgImdsZCIgcHJlZml4LiAqLwotICAgIGlmICh0YXJnZXRbMF0gPT0gJ2cnICYmIHRhcmdldFsxXSA9PSAnbCcgJiYgdGFyZ2V0WzJdID09ICdkJykKLQl0YXJnZXQgKz0gMzsKLSAgICBmb3IgKDsgKmVwdHI7IGVwdHIrKykKLSAgICAgIHsKLQlpZiAoc3RyY21wKHRhcmdldCwgKCplcHRyKS0+ZW11bGF0aW9uX25hbWUpID09IDApCi0JICB7Ci0JICAgIGxkX2VtdWxhdGlvbiA9ICplcHRyOwotCSAgICByZXR1cm47Ci0JICB9Ci0gICAgICB9Ci0gICAgZWluZm8gKF8oIiVQOiB1bnJlY29nbmlzZWQgZW11bGF0aW9uIG1vZGU6ICVzXG4iKSwgdGFyZ2V0KTsKLSAgICBlaW5mbyAoXygiU3VwcG9ydGVkIGVtdWxhdGlvbnM6ICIpKTsKLSAgICBsZGVtdWxfbGlzdF9lbXVsYXRpb25zIChzdGRlcnIpOwotICAgIGVpbmZvICgiJUZcbiIpOwotfQotCi12b2lkCi1sZGVtdWxfbGlzdF9lbXVsYXRpb25zIChmKQotICAgICBGSUxFICpmOwotewotICBsZF9lbXVsYXRpb25feGZlcl90eXBlICoqZXB0ciA9IGxkX2VtdWxhdGlvbnM7Ci0gIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCi0gIGZvciAoOyAqZXB0cjsgZXB0cisrKQotICAgIHsKLSAgICAgIGlmIChmaXJzdCkKLQlmaXJzdCA9IGZhbHNlOwotICAgICAgZWxzZQotCWZwcmludGYgKGYsICIgIik7Ci0gICAgICBmcHJpbnRmIChmLCAiJXMiLCAoKmVwdHIpLT5lbXVsYXRpb25fbmFtZSk7Ci0gICAgfQotfQotCi12b2lkCi1sZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyAoZikKLSAgICAgRklMRSAqIGY7Ci17Ci0gIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiogZXB0cjsKLSAgaW50IG9wdGlvbnNfZm91bmQgPSAwOwotICAKLSAgZm9yIChlcHRyID0gbGRfZW11bGF0aW9uczsgKiBlcHRyOyBlcHRyICsrKQotICAgIHsKLSAgICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKiBlbXVsID0gKiBlcHRyOwotICAgICAgCi0gICAgICBpZiAoZW11bC0+bGlzdF9vcHRpb25zKQotCXsKLQkgIGZwcmludGYgKGYsICIlczogXG4iLCBlbXVsLT5lbXVsYXRpb25fbmFtZSk7Ci0gICAgICAKLQkgIGVtdWwtPmxpc3Rfb3B0aW9ucyAoZik7Ci0KLQkgIG9wdGlvbnNfZm91bmQgPSAxOwotCX0KLSAgICB9Ci0gIAotICBpZiAoISBvcHRpb25zX2ZvdW5kKQotICAgIGZwcmludGYgKGYsIF8oIiAgbm8gZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnMuXG4iKSk7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGVtdWwuaCBiL2xkL2xkZW11bC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBkZTA2Li4wMDAwMDAwCi0tLSBhL2xkL2xkZW11bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qIGxkLWVtdWwuaCAtIExpbmtlciBlbXVsYXRpb24gaGVhZGVyIGZpbGUKLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgKi8KLQotI2lmbmRlZiBMREVNVUxfSAotI2RlZmluZSBMREVNVUxfSAotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0Owotc3RydWN0IHNlYXJjaF9kaXJzOwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGxkZW11bF9obGwgUEFSQU1TICgoY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfc3lzbGliIFBBUkFNUyAoKGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9zZXRfb3V0cHV0X2FyY2ggUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIGNoYXIgKmxkZW11bF9jaG9vc2VfdGFyZ2V0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkZW11bF9jaG9vc2VfbW9kZSBQQVJBTVMgKChjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZW11bF9saXN0X2VtdWxhdGlvbnMgUEFSQU1TICgoRklMRSAqKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfbGlzdF9lbXVsYXRpb25fb3B0aW9ucyBQQVJBTVMgKChGSUxFICopKTsKLWV4dGVybiBjaGFyICpsZGVtdWxfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGVtdWxfc2V0X3N5bWJvbHMgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBib29sZWFuIGxkZW11bF9wbGFjZV9vcnBoYW4KLSAgUEFSQU1TICgoc3RydWN0IGxhbmdfaW5wdXRfc3RhdGVtZW50X3N0cnVjdCAqLCBhc2VjdGlvbiAqKSk7Ci1leHRlcm4gaW50IGxkZW11bF9wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX3VucmVjb2duaXplZF9maWxlCi0gIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGJvb2xlYW4gbGRlbXVsX3JlY29nbml6ZWRfZmlsZQotICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBib29sZWFuIGxkZW11bF9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBzZWFyY2hfZGlycyAqLAotCSAgIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotZXh0ZXJuIGNoYXIgKmxkZW11bF9kZWZhdWx0X3RhcmdldCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBhZnRlcl9wYXJzZV9kZWZhdWx0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGFmdGVyX29wZW5fZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBhZnRlcl9hbGxvY2F0aW9uX2RlZmF1bHQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgYmVmb3JlX2FsbG9jYXRpb25fZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBzeXNsaWJfZGVmYXVsdCBQQVJBTVMgKChjaGFyKikpOwotZXh0ZXJuIHZvaWQgaGxsX2RlZmF1bHQgUEFSQU1TICgoY2hhciopKTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGRfZW11bGF0aW9uX3hmZXJfc3RydWN0Ci17Ci0gIC8qIFJ1biBiZWZvcmUgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIGFuZCBzY3JpcHQgZmlsZS4KLSAgICAgU2V0IHRoZSBhcmNoaXRlY3R1cmUsIG1heWJlIG90aGVyIHRoaW5ncy4gICovCi0gIHZvaWQgICAoKmJlZm9yZV9wYXJzZSkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIEhhbmRsZSB0aGUgU1lTTElCIChsb3cgbGV2ZWwgbGlicmFyeSkgc2NyaXB0IGNvbW1hbmQuICAqLwotICB2b2lkICAgKCpzeXNsaWIpIFBBUkFNUyAoKGNoYXIgKikpOwotCi0gIC8qIEhhbmRsZSB0aGUgSExMIChoaWdoIGxldmVsIGxpYnJhcnkpIHNjcmlwdCBjb21tYW5kLiAgKi8KLSAgdm9pZCAgICgqaGxsKSBQQVJBTVMgKChjaGFyICopKTsKLQotICAvKiBSdW4gYWZ0ZXIgcGFyc2luZyB0aGUgY29tbWFuZCBsaW5lIGFuZCBzY3JpcHQgZmlsZS4gICovCi0gIHZvaWQgICAoKmFmdGVyX3BhcnNlKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUnVuIGFmdGVyIG9wZW5pbmcgYWxsIGlucHV0IGZpbGVzLCBhbmQgbG9hZGluZyB0aGUgc3ltYm9scy4gICovCi0gIHZvaWQgICAoKmFmdGVyX29wZW4pIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gYWZ0ZXIgYWxsb2NhdGluZyBvdXRwdXQgc2VjdGlvbnMuICAqLwotICB2b2lkICAgKCphZnRlcl9hbGxvY2F0aW9uKSBQQVJBTVMgKCAodm9pZCkpOwotCi0gIC8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSBhbmQgbWFjaGluZSBpZiBwb3NzaWJsZS4gICovCi0gIHZvaWQgICAoKnNldF9vdXRwdXRfYXJjaCkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIERlY2lkZSB3aGljaCB0YXJnZXQgbmFtZSB0byB1c2UuICAqLwotICBjaGFyICogKCpjaG9vc2VfdGFyZ2V0KSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUnVuIGJlZm9yZSBhbGxvY2F0aW5nIG91dHB1dCBzZWN0aW9ucy4gICovCi0gIHZvaWQgICAoKmJlZm9yZV9hbGxvY2F0aW9uKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogUmV0dXJuIHRoZSBhcHByb3ByaWF0ZSBsaW5rZXIgc2NyaXB0LiAgKi8KLSAgY2hhciAqICgqZ2V0X3NjcmlwdCkgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotICAvKiBUaGUgbmFtZSBvZiB0aGlzIGVtdWxhdGlvbi4gICovCi0gIGNoYXIgKmVtdWxhdGlvbl9uYW1lOwotCi0gIC8qIFRoZSBvdXRwdXQgZm9ybWF0LiAgKi8KLSAgY2hhciAqdGFyZ2V0X25hbWU7Ci0KLSAgLyogUnVuIGFmdGVyIGFzc2lnbmluZyB2YWx1ZXMgZnJvbSB0aGUgc2NyaXB0LiAgKi8KLSAgdm9pZAkoKmZpbmlzaCkgUEFSQU1TICgodm9pZCkpOwotCi0gIC8qIENyZWF0ZSBhbnkgb3V0cHV0IHNlY3Rpb25zIG5lZWRlZCBieSB0aGUgdGFyZ2V0LiAgKi8KLSAgdm9pZAkoKmNyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzKSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSAgLyogVHJ5IHRvIG9wZW4gYSBkeW5hbWljIGxpYnJhcnkuICBBUkNIIGlzIGFuIGFyY2hpdGVjdHVyZSBuYW1lLCBhbmQKLSAgICAgaXMgbm9ybWFsbHkgdGhlIGVtcHR5IHN0cmluZy4gIEVOVFJZIGlzIHRoZSBsYW5nX2lucHV0X3N0YXRlbWVudAotICAgICB0aGF0IHNob3VsZCBiZSBvcGVuZWQuICAqLwotICBib29sZWFuICgqb3Blbl9keW5hbWljX2FyY2hpdmUpCi0gICAgUEFSQU1TICgoY29uc3QgY2hhciAqYXJjaCwgc3RydWN0IHNlYXJjaF9kaXJzICosCi0JICAgICBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICplbnRyeSkpOwotCi0gIC8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgUmV0dXJuIHRydWUgaWYgaXQgd2FzIHBsYWNlZCwgZmFsc2UgaWYKLSAgICAgdGhlIGRlZmF1bHQgYWN0aW9uIHNob3VsZCBiZSB0YWtlbi4gIFRoaXMgZmllbGQgbWF5IGJlIE5VTEwsIGluCi0gICAgIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgYWN0aW9uIHdpbGwgYWx3YXlzIGJlIHRha2VuLiAgKi8KLSAgYm9vbGVhbiAoKnBsYWNlX29ycGhhbikKLSAgICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICosIGFzZWN0aW9uICopKTsKLQotICAvKiBSdW4gYWZ0ZXIgYXNzaWduaW5nIHBhcnNpbmcgd2l0aCB0aGUgYXJncywgYnV0IGJlZm9yZSAKLSAgICAgcmVhZGluZyB0aGUgc2NyaXB0LiAgVXNlZCB0byBpbml0aWFsaXplIHN5bWJvbHMgdXNlZCBpbiB0aGUgc2NyaXB0LiAqLwotICB2b2lkCSgqc2V0X3N5bWJvbHMpIFBBUkFNUyAoKHZvaWQpKTsKLQotICAvKiBSdW4gdG8gcGFyc2UgYXJncyB3aGljaCB0aGUgYmFzZSBsaW5rZXIgZG9lc24ndAotICAgICB1bmRlcnN0YW5kLiBSZXR1cm4gbm9uIHplcm8gb24gc3VjZXNzLiAqLwotICBpbnQgKCpwYXJzZV9hcmdzKSBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLQotICAvKiBSdW4gdG8gaGFuZGxlIGZpbGVzIHdoaWNoIGFyZSBub3QgcmVjb2duaXplZCBhcyBvYmplY3QgZmlsZXMgb3IKLSAgICAgYXJjaGl2ZXMuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgaGFuZGxlZC4gICovCi0gIGJvb2xlYW4gKCp1bnJlY29nbml6ZWRfZmlsZSkKLSAgICBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLQotICAvKiBSdW4gdG8gbGlzdCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgd2hpY2ggcGFyc2VfYXJncyBoYW5kbGVzLiAgKi8KLSAgdm9pZCAoKiBsaXN0X29wdGlvbnMpIFBBUkFNUyAoKEZJTEUgKikpOwotCi0gIC8qIFJ1biB0byBzcGVjaWFsbHkgaGFuZGxlIGZpbGVzIHdoaWNoICphcmUqIHJlY29nbml6ZWQgYXMgb2JqZWN0Ci0gICAgIGZpbGVzIG9yIGFyY2hpdmVzLiAgUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIGhhbmRsZWQuICAqLwotICBib29sZWFuICgqcmVjb2duaXplZF9maWxlKQotICAgIFBBUkFNUyAoKHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QgKikpOwotCi19IGxkX2VtdWxhdGlvbl94ZmVyX3R5cGU7Ci0KLXR5cGVkZWYgZW51bSAKLXsKLSAgaW50ZWxfaWM5NjBfbGRfbW9kZV9lbnVtLAotICBkZWZhdWx0X21vZGVfZW51bSAsCi0gIGludGVsX2dsZDk2MF9sZF9tb2RlX2VudW0KLX0gbGFuZ19lbXVsYXRpb25fbW9kZV9lbnVtX3R5cGU7Ci0KLWV4dGVybiBsZF9lbXVsYXRpb25feGZlcl90eXBlICpsZF9lbXVsYXRpb25zW107Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRleHAuYyBiL2xkL2xkZXhwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOWQ3MjYuLjAwMDAwMDAKLS0tIGEvbGQvbGRleHAuYworKysgL2Rldi9udWxsCkBAIC0xLDk4NSArMCwwIEBACi0vKiBUaGlzIG1vZHVsZSBoYW5kbGVzIGV4cHJlc3Npb24gdHJlZXMuCi1Db3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi1Xcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzYWNAY3lnbnVzLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1UaGlzIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2Ygd29ya2luZyBvdXQgdGhlIGNvbnRlbnRzIG9mIGV4cHJlc3Npb25zLgotCi1JdCBoYXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgcmVsYXRpdmUvYWJzbmVzcyBvZiBhIHN5bWJvbCBldGMuIFRoaXMgaXMKLWRvbmUgYnkga2VlcGluZyBhbGwgdmFsdWVzIGluIGEgc3RydWN0IChhbiBldHJlZV92YWx1ZV90eXBlKSB3aGljaAotY29udGFpbnMgYSB2YWx1ZSwgYSBzZWN0aW9uIHRvIHdoaWNoIGl0IGlzIHJlbGF0aXZlIGFuZCBhIHZhbGlkIGJpdC4KLQotKi8KLQotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotCi1zdGF0aWMgdm9pZCBleHBfcHJpbnRfdG9rZW4gUEFSQU1TICgodG9rZW5fY29kZV90eXBlIGNvZGUpKTsKLXN0YXRpYyB2b2lkIG1ha2VfYWJzIFBBUkFNUyAoKGV0cmVlX3ZhbHVlX3R5cGUgKnB0cikpOwotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgbmV3X2FicyBQQVJBTVMgKChiZmRfdm1hIHZhbHVlKSk7Ci1zdGF0aWMgdm9pZCBjaGVjayBQQVJBTVMgKChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcywKLQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKm9wKSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBuZXdfcmVsCi0gIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUsIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb24pKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIG5ld19yZWxfZnJvbV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZF92bWEgdmFsdWUsIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKnNlY3Rpb24pKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIGZvbGRfYmluYXJ5Ci0gIFBBUkFNUyAoKGV0cmVlX3R5cGUgKnRyZWUsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uLAotCSAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmUsCi0JICAgYmZkX3ZtYSBkb3QsIGJmZF92bWEgKmRvdHApKTsKLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlIGZvbGRfbmFtZQotICBQQVJBTVMgKChldHJlZV90eXBlICp0cmVlLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbiwKLQkgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lLAotCSAgIGJmZF92bWEgZG90KSk7Ci1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSBleHBfZm9sZF90cmVlX25vX2RvdAotICBQQVJBTVMgKChldHJlZV90eXBlICp0cmVlLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbiwKLQkgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lKSk7Ci0KLXN0YXRpYyB2b2lkCi1leHBfcHJpbnRfdG9rZW4gKGNvZGUpCi0gICAgIHRva2VuX2NvZGVfdHlwZSBjb2RlOwotewotICBzdGF0aWMgQ09OU1Qgc3RydWN0Ci0gICAgewotICAgICAgdG9rZW5fY29kZV90eXBlIGNvZGU7Ci0gICAgICBjaGFyICpuYW1lOwotICAgIH0gdGFibGVbXSA9Ci0gICAgICB7Ci0JeyBJTlQsCSJpbnQiIH0sCi0JeyBSRUwsICJyZWxvY2F0ZWFibGUiIH0sCi0JeyBOQU1FLCJOQU1FIiB9LAotCXsgUExVU0VRLCIrPSIgfSwKLQl7IE1JTlVTRVEsIi09IiB9LAotCXsgTVVMVEVRLCIqPSIgfSwKLQl7IERJVkVRLCIvPSIgfSwKLQl7IExTSElGVEVRLCI8PD0iIH0sCi0JeyBSU0hJRlRFUSwiPj49IiB9LAotCXsgQU5ERVEsIiY9IiB9LAotCXsgT1JFUSwifD0iIH0sCi0JeyBPUk9SLCJ8fCIgfSwKLQl7IEFOREFORCwiJiYiIH0sCi0JeyBFUSwiPT0iIH0sCi0JeyBORSwiIT0iIH0sCi0JeyBMRSwiPD0iIH0sCi0JeyBHRSwiPj0iIH0sCi0JeyBMU0hJRlQsIjw8IiB9LAotCXsgUlNISUZULCI+Pj0iIH0sCi0JeyBBTElHTl9LLCJBTElHTiIgfSwKLQl7IEJMT0NLLCJCTE9DSyIgfSwKLQl7IFNFQ1RJT05TLCJTRUNUSU9OUyIgfSwKLQl7IFNJWkVPRl9IRUFERVJTLCJTSVpFT0ZfSEVBREVSUyIgfSwKLQl7IE5FWFQsIk5FWFQiIH0sCi0JeyBTSVpFT0YsIlNJWkVPRiIgfSwKLQl7IEFERFIsIkFERFIiIH0sCi0JeyBMT0FEQUREUiwiTE9BREFERFIiIH0sCi0JeyBNRU1PUlksIk1FTU9SWSIgfSwKLQl7IERFRklORUQsIkRFRklORUQiIH0sCi0JeyBUQVJHRVRfSywiVEFSR0VUIiB9LAotCXsgU0VBUkNIX0RJUiwiU0VBUkNIX0RJUiIgfSwKLQl7IE1BUCwiTUFQIiB9LAotCXsgUVVBRCwiUVVBRCIgfSwKLQl7IFNRVUFELCJTUVVBRCIgfSwKLQl7IExPTkcsIkxPTkciIH0sCi0JeyBTSE9SVCwiU0hPUlQiIH0sCi0JeyBCWVRFLCJCWVRFIiB9LAotCXsgRU5UUlksIkVOVFJZIiB9LAotCXsgMCwoY2hhciAqKU5VTEwgfQotICAgICAgfTsKLSAgdW5zaWduZWQgaW50IGlkeDsKLQotICBmb3IgKGlkeCA9IDA7IHRhYmxlW2lkeF0ubmFtZSAhPSAoY2hhciopTlVMTDsgaWR4KyspIHsKLSAgICBpZiAodGFibGVbaWR4XS5jb2RlID09IGNvZGUpIHsKLSAgICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCAiJXMiLCB0YWJsZVtpZHhdLm5hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAvKiBOb3QgaW4gdGFibGUsIGp1c3QgcHJpbnQgaXQgYWxvbmUgKi8KLSAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsICIlYyIsY29kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIAotbWFrZV9hYnMgKHB0cikKLSAgICAgZXRyZWVfdmFsdWVfdHlwZSAqcHRyOwotewotICAgIGFzZWN0aW9uICpzID0gcHRyLT5zZWN0aW9uLT5iZmRfc2VjdGlvbjsKLSAgICBwdHItPnZhbHVlICs9IHMtPnZtYTsKLSAgICBwdHItPnNlY3Rpb24gPSBhYnNfb3V0cHV0X3NlY3Rpb247Ci19Ci0KLXN0YXRpYyBldHJlZV92YWx1ZV90eXBlCi1uZXdfYWJzICh2YWx1ZSkKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSBuZXc7Ci0gIG5ldy52YWxpZF9wID0gdHJ1ZTsKLSAgbmV3LnNlY3Rpb24gPSBhYnNfb3V0cHV0X3NlY3Rpb247Ci0gIG5ldy52YWx1ZSA9IHZhbHVlOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgdm9pZCAKLWNoZWNrIChvcywgbmFtZSwgb3ApCi0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpvcDsKLXsKLSAgaWYgKG9zID09IE5VTEwpCi0gICAgZWluZm8gKF8oIiVGJVA6ICVzIHVzZXMgdW5kZWZpbmVkIHNlY3Rpb24gJXNcbiIpLCBvcCwgbmFtZSk7Ci0gIGlmICghIG9zLT5wcm9jZXNzZWQpCi0gICAgZWluZm8gKF8oIiVGJVA6ICVzIGZvcndhcmQgcmVmZXJlbmNlIG9mIHNlY3Rpb24gJXNcbiIpLCBvcCwgbmFtZSk7Ci19Ci0KLWV0cmVlX3R5cGUgKgotZXhwX2ludG9wICh2YWx1ZSkKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgZXRyZWVfdHlwZSAqbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyhzaXplb2YobmV3LT52YWx1ZSkpOwotICBuZXctPnR5cGUubm9kZV9jb2RlID0gSU5UOwotICBuZXctPnZhbHVlLnZhbHVlID0gdmFsdWU7Ci0gIG5ldy0+dHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfdmFsdWU7Ci0gIHJldHVybiBuZXc7Ci0KLX0KLQotLyogQnVpbGQgYW4gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgYW4gdW5uYW1lZCByZWxvY2F0ZWFibGUgdmFsdWUuICAqLwotCi1ldHJlZV90eXBlICoKLWV4cF9yZWxvcCAoc2VjdGlvbiwgdmFsdWUpCi0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBldHJlZV90eXBlICpuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+cmVsKSk7Ci0gIG5ldy0+dHlwZS5ub2RlX2NvZGUgPSBSRUw7Ci0gIG5ldy0+dHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfcmVsOwotICBuZXctPnJlbC5zZWN0aW9uID0gc2VjdGlvbjsKLSAgbmV3LT5yZWwudmFsdWUgPSB2YWx1ZTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUKLW5ld19yZWwgKHZhbHVlLCBzZWN0aW9uKQotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzZWN0aW9uOwotewotICBldHJlZV92YWx1ZV90eXBlIG5ldzsKLSAgbmV3LnZhbGlkX3AgPSB0cnVlOwotICBuZXcudmFsdWUgPSB2YWx1ZTsKLSAgbmV3LnNlY3Rpb24gPSBzZWN0aW9uOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZQotbmV3X3JlbF9mcm9tX3NlY3Rpb24gKHZhbHVlLCBzZWN0aW9uKQotICAgICBiZmRfdm1hIHZhbHVlOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzZWN0aW9uOwotewotICBldHJlZV92YWx1ZV90eXBlIG5ldzsKLSAgbmV3LnZhbGlkX3AgPSB0cnVlOwotICBuZXcudmFsdWUgPSB2YWx1ZTsKLSAgbmV3LnNlY3Rpb24gPSBzZWN0aW9uOwotCi0gICAgbmV3LnZhbHVlIC09IHNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0KLSAgcmV0dXJuIG5ldzsKLX0KLQotc3RhdGljIGV0cmVlX3ZhbHVlX3R5cGUgCi1mb2xkX2JpbmFyeSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotICAgICBiZmRfdm1hIGRvdDsKLSAgICAgYmZkX3ZtYSAqZG90cDsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YmluYXJ5LmxocywgY3VycmVudF9zZWN0aW9uLAotCQkJICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gIGlmIChyZXN1bHQudmFsaWRfcCkKLSAgICB7Ci0gICAgICBldHJlZV92YWx1ZV90eXBlIG90aGVyOwotCi0gICAgICBvdGhlciA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmJpbmFyeS5yaHMsCi0JCQkgICAgIGN1cnJlbnRfc2VjdGlvbiwKLQkJCSAgICAgYWxsb2NhdGlvbl9kb25lLCBkb3QsZG90cCkgOwotICAgICAgaWYgKG90aGVyLnZhbGlkX3ApCi0JewotCSAgLyogSWYgdGhlIHZhbHVlcyBhcmUgZnJvbSBkaWZmZXJlbnQgc2VjdGlvbnMsIG9yIHRoaXMgaXMgYW4KLQkgICAgIGFic29sdXRlIGV4cHJlc3Npb24sIG1ha2UgYm90aCB0aGUgc291cmNlIGFyZ3VtZW50cwotCSAgICAgYWJzb2x1dGUuICBIb3dldmVyLCBhZGRpbmcgb3Igc3VidHJhY3RpbmcgYW4gYWJzb2x1dGUKLQkgICAgIHZhbHVlIGZyb20gYSByZWxhdGl2ZSB2YWx1ZSBpcyBtZWFuaW5nZnVsLCBhbmQgaXMgYW4KLQkgICAgIGV4Y2VwdGlvbi4gICovCi0JICBpZiAoY3VycmVudF9zZWN0aW9uICE9IGFic19vdXRwdXRfc2VjdGlvbgotCSAgICAgICYmIChvdGhlci5zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbgotCQkgIHx8IChyZXN1bHQuc2VjdGlvbiA9PSBhYnNfb3V0cHV0X3NlY3Rpb24KLQkJICAgICAgJiYgdHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJysnKSkKLQkgICAgICAmJiAodHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJysnCi0JCSAgfHwgdHJlZS0+dHlwZS5ub2RlX2NvZGUgPT0gJy0nKSkKLQkgICAgewotCSAgICAgIGV0cmVlX3ZhbHVlX3R5cGUgaG9sZDsKLQotCSAgICAgIC8qIElmIHRoZXJlIGlzIG9ubHkgb25lIGFic29sdXRlIHRlcm0sIG1ha2Ugc3VyZSBpdCBpcyB0aGUKLQkJIHNlY29uZCBvbmUuICAqLwotCSAgICAgIGlmIChvdGhlci5zZWN0aW9uICE9IGFic19vdXRwdXRfc2VjdGlvbikKLQkJewotCQkgIGhvbGQgPSByZXN1bHQ7Ci0JCSAgcmVzdWx0ID0gb3RoZXI7Ci0JCSAgb3RoZXIgPSBob2xkOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHJlc3VsdC5zZWN0aW9uICE9IG90aGVyLnNlY3Rpb24KLQkJICAgfHwgY3VycmVudF9zZWN0aW9uID09IGFic19vdXRwdXRfc2VjdGlvbikKLQkgICAgewotCSAgICAgIG1ha2VfYWJzKCZyZXN1bHQpOwotCSAgICAgIG1ha2VfYWJzKCZvdGhlcik7Ci0JICAgIH0KLQotCSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY29kZSkgCi0JICAgIHsKLQkgICAgY2FzZSAnJSc6Ci0JICAgICAgaWYgKG90aGVyLnZhbHVlID09IDApCi0JCWVpbmZvIChfKCIlRiVTICUlIGJ5IHplcm9cbiIpKTsKLQkgICAgICByZXN1bHQudmFsdWUgPSAoKGJmZF9zaWduZWRfdm1hKSByZXN1bHQudmFsdWUKLQkJCSAgICAgICUgKGJmZF9zaWduZWRfdm1hKSBvdGhlci52YWx1ZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnLyc6Ci0JICAgICAgaWYgKG90aGVyLnZhbHVlID09IDApCi0JCWVpbmZvIChfKCIlRiVTIC8gYnkgemVyb1xuIikpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9ICgoYmZkX3NpZ25lZF92bWEpIHJlc3VsdC52YWx1ZQotCQkJICAgICAgLyAoYmZkX3NpZ25lZF92bWEpIG90aGVyLnZhbHVlKTsKLQkgICAgICBicmVhazsKLQotI2RlZmluZSBCT1AoeCx5KSBjYXNlIHggOiByZXN1bHQudmFsdWUgPSByZXN1bHQudmFsdWUgeSBvdGhlci52YWx1ZTsgYnJlYWs7Ci0JICAgICAgQk9QKCcrJywrKTsKLQkgICAgICBCT1AoJyonLCopOwotCSAgICAgIEJPUCgnLScsLSk7Ci0JICAgICAgQk9QKExTSElGVCw8PCk7Ci0JICAgICAgQk9QKFJTSElGVCw+Pik7Ci0JICAgICAgQk9QKEVRLD09KTsKLQkgICAgICBCT1AoTkUsIT0pOwotCSAgICAgIEJPUCgnPCcsPCk7Ci0JICAgICAgQk9QKCc+Jyw+KTsKLQkgICAgICBCT1AoTEUsPD0pOwotCSAgICAgIEJPUChHRSw+PSk7Ci0JICAgICAgQk9QKCcmJywmKTsKLQkgICAgICBCT1AoJ14nLF4pOwotCSAgICAgIEJPUCgnfCcsfCk7Ci0JICAgICAgQk9QKEFOREFORCwmJik7Ci0JICAgICAgQk9QKE9ST1IsfHwpOwotCi0JICAgIGNhc2UgTUFYX0s6Ci0JICAgICAgaWYgKHJlc3VsdC52YWx1ZSA8IG90aGVyLnZhbHVlKQotCQlyZXN1bHQgPSBvdGhlcjsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIE1JTl9LOgotCSAgICAgIGlmIChyZXN1bHQudmFsdWUgPiBvdGhlci52YWx1ZSkKLQkJcmVzdWx0ID0gb3RoZXI7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgZGVmYXVsdDoKLQkgICAgICBGQUlMKCk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWV0cmVlX3ZhbHVlX3R5cGUgCi1pbnZhbGlkICgpCi17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgbmV3OwotICBuZXcudmFsaWRfcCA9IGZhbHNlOwotICByZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSAKLWZvbGRfbmFtZSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotICAgICBsYW5nX3BoYXNlX3R5cGUgIGFsbG9jYXRpb25fZG9uZTsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OwotICBzd2l0Y2ggKHRyZWUtPnR5cGUubm9kZV9jb2RlKSAKLSAgICAgIHsKLSAgICAgIGNhc2UgU0laRU9GX0hFQURFUlM6Ci0JaWYgKGFsbG9jYXRpb25fZG9uZSAhPSBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pIAotCSAgewotCSAgICByZXN1bHQgPSBuZXdfYWJzICgoYmZkX3ZtYSkKLQkJCSAgICAgIGJmZF9zaXplb2ZfaGVhZGVycyAob3V0cHV0X2JmZCwKLQkJCQkJCSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSkpOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLQkgIH0KLQlicmVhazsKLSAgICAgIGNhc2UgREVGSU5FRDoKLQlpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgIHJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JZWxzZQotCSAgewotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotCSAgICBoID0gYmZkX3dyYXBwZWRfbGlua19oYXNoX2xvb2t1cCAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywKLQkJCQkJICAgICAgdHJlZS0+bmFtZS5uYW1lLAotCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCSAgICByZXN1bHQudmFsdWUgPSAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotCQkJICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCQkJCXx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0JCQkJfHwgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbikpOwotCSAgICByZXN1bHQuc2VjdGlvbiA9IDA7Ci0JICAgIHJlc3VsdC52YWxpZF9wID0gdHJ1ZTsKLQkgIH0KLQlicmVhazsKLSAgICAgIGNhc2UgTkFNRToKLQlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCWlmICh0cmVlLT5uYW1lLm5hbWVbMF0gPT0gJy4nICYmIHRyZWUtPm5hbWUubmFtZVsxXSA9PSAwKQotCSAgewotCSAgICBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgICAgICByZXN1bHQgPSBuZXdfcmVsX2Zyb21fc2VjdGlvbihkb3QsIGN1cnJlbnRfc2VjdGlvbik7Ci0JICAgIGVsc2UKLQkgICAgICByZXN1bHQgPSBpbnZhbGlkKCk7Ci0JICB9Ci0JZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSkKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLQkgICAgaCA9IGJmZF93cmFwcGVkX2xpbmtfaGFzaF9sb29rdXAgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sCi0JCQkJCSAgICAgIHRyZWUtPm5hbWUubmFtZSwKLQkJCQkJICAgICAgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkgICAgaWYgKGggIT0gTlVMTAotCQkmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkJICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKSkKLQkgICAgICB7Ci0JCWlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKGgtPnUuZGVmLnNlY3Rpb24pKQotCQkgIHJlc3VsdCA9IG5ld19hYnMgKGgtPnUuZGVmLnZhbHVlKTsKLQkJZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmluYWxfcGhhc2VfZW51bQotCQkJIHx8IGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSkKLQkJICB7Ci0JCSAgICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0KLQkJICAgIG91dHB1dF9zZWN0aW9uID0gaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb247Ci0JCSAgICBpZiAob3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQkJICAgICAgZWluZm8gKF8oIiVYJVM6IHVucmVzb2x2YWJsZSBzeW1ib2wgYCVzJyByZWZlcmVuY2VkIGluIGV4cHJlc3Npb25cbiIpLAotCQkJICAgICB0cmVlLT5uYW1lLm5hbWUpOwotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQlsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCQkJb3MgPSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwCi0JCQkgICAgICAoYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsCi0JCQkJCQkgICAgIG91dHB1dF9zZWN0aW9uKSkpOwotCi0JCQkvKiBGSVhNRTogSXMgdGhpcyBjb3JyZWN0IGlmIHRoaXMgc2VjdGlvbiBpcwotCQkJICAgYmVpbmcgbGlua2VkIHdpdGggLVI/ICAqLwotCQkJcmVzdWx0ID0gbmV3X3JlbCAoKGgtPnUuZGVmLnZhbHVlCi0JCQkJCSAgICsgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCQkJCSAgb3MpOwotCQkgICAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfZmluYWxfcGhhc2VfZW51bSkKLQkgICAgICBlaW5mbyAoXygiJUYlUzogdW5kZWZpbmVkIHN5bWJvbCBgJXMnIHJlZmVyZW5jZWQgaW4gZXhwcmVzc2lvblxuIiksCi0JCSAgICAgdHJlZS0+bmFtZS5uYW1lKTsKLQkgIH0KLQlicmVhazsKLQotICAgICAgY2FzZSBBRERSOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgewotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKLQkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJBRERSIik7Ci0JICAgIHJlc3VsdCA9IG5ld19yZWwgKDAsIG9zKTsKLQkgIH0KLQllbHNlCi0JICByZXN1bHQgPSBpbnZhbGlkICgpOwotCWJyZWFrOwotCi0gICAgICBjYXNlIExPQURBRERSOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgewotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKLQkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJMT0FEQUREUiIpOwotCSAgICBpZiAob3MtPmxvYWRfYmFzZSA9PSBOVUxMKQotCSAgICAgIHJlc3VsdCA9IG5ld19yZWwgKDAsIG9zKTsKLQkgICAgZWxzZQotCSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWVfbm9fZG90IChvcy0+bG9hZF9iYXNlLAotCQkJCQkgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCQkJICAgICBhbGxvY2F0aW9uX2RvbmUpOwotCSAgfQotCWVsc2UKLQkgIHJlc3VsdCA9IGludmFsaWQgKCk7Ci0JYnJlYWs7Ci0KLSAgICAgIGNhc2UgU0laRU9GOgotCWlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCSAgewotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotCSAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAodHJlZS0+bmFtZS5uYW1lKTsKLQkgICAgY2hlY2sgKG9zLCB0cmVlLT5uYW1lLm5hbWUsICJTSVpFT0YiKTsKLQkgICAgcmVzdWx0ID0gbmV3X2FicyAob3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUpOwotCSAgfQotCWVsc2UKLQkgIHJlc3VsdCA9IGludmFsaWQgKCk7Ci0JYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0JRkFJTCgpOwotCWJyZWFrOwotICAgICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci1ldHJlZV92YWx1ZV90eXBlIAotZXhwX2ZvbGRfdHJlZSAodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotICAgICBsYW5nX3BoYXNlX3R5cGUgIGFsbG9jYXRpb25fZG9uZTsKLSAgICAgYmZkX3ZtYSBkb3Q7Ci0gICAgIGJmZF92bWEgKmRvdHA7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OwotCi0gIGlmICh0cmVlID09IE5VTEwpCi0gICAgewotICAgICAgcmVzdWx0LnZhbGlkX3AgPSBmYWxzZTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIHN3aXRjaCAodHJlZS0+dHlwZS5ub2RlX2NsYXNzKSAKLSAgICB7Ci0gICAgY2FzZSBldHJlZV92YWx1ZToKLSAgICAgIHJlc3VsdCA9IG5ld19yZWwgKHRyZWUtPnZhbHVlLnZhbHVlLCBjdXJyZW50X3NlY3Rpb24pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3JlbDoKLSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maW5hbF9waGFzZV9lbnVtKQotCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0gICAgICBlbHNlCi0JcmVzdWx0ID0gbmV3X3JlbCAoKHRyZWUtPnJlbC52YWx1ZQotCQkJICAgKyB0cmVlLT5yZWwuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJICAgKyB0cmVlLT5yZWwuc2VjdGlvbi0+b3V0cHV0X29mZnNldCksCi0JCQkgIGN1cnJlbnRfc2VjdGlvbik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYXNzZXJ0OgotICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YXNzZXJ0X3MuY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3NlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCi0JewotCSAgaWYgKCEgcmVzdWx0LnZhbHVlKQotCSAgICBlaW5mbyAoIiVGJVA6ICVzXG4iLCB0cmVlLT5hc3NlcnRfcy5tZXNzYWdlKTsKLQkgIHJldHVybiByZXN1bHQ7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX3VuYXJ5OgotICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+dW5hcnkuY2hpbGQsCi0JCQkgICAgICBjdXJyZW50X3NlY3Rpb24sCi0JCQkgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCi0JewotCSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY29kZSkgCi0JICAgIHsKLQkgICAgY2FzZSBBTElHTl9LOgotCSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgIT0gbGFuZ19maXJzdF9waGFzZV9lbnVtKQotCQlyZXN1bHQgPSBuZXdfcmVsX2Zyb21fc2VjdGlvbiAoQUxJR05fTiAoZG90LCByZXN1bHQudmFsdWUpLAotCQkJCQkgICAgICAgY3VycmVudF9zZWN0aW9uKTsKLQkgICAgICBlbHNlCi0JCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBBQlNPTFVURToKLQkgICAgICBpZiAoYWxsb2NhdGlvbl9kb25lICE9IGxhbmdfZmlyc3RfcGhhc2VfZW51bSAmJiByZXN1bHQudmFsaWRfcCkKLQkJewotCQkgIHJlc3VsdC52YWx1ZSArPSByZXN1bHQuc2VjdGlvbi0+YmZkX3NlY3Rpb24tPnZtYTsKLQkJICByZXN1bHQuc2VjdGlvbiA9IGFic19vdXRwdXRfc2VjdGlvbjsKLQkJfQotCSAgICAgIGVsc2UgCi0JCXJlc3VsdC52YWxpZF9wID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnfic6Ci0JICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9IH5yZXN1bHQudmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnISc6Ci0JICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9ICFyZXN1bHQudmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnLSc6Ci0JICAgICAgbWFrZV9hYnMgKCZyZXN1bHQpOwotCSAgICAgIHJlc3VsdC52YWx1ZSA9IC1yZXN1bHQudmFsdWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBORVhUOgotCSAgICAgIC8qIFJldHVybiBuZXh0IHBsYWNlIGFsaWduZWQgdG8gdmFsdWUuICAqLwotCSAgICAgIGlmIChhbGxvY2F0aW9uX2RvbmUgPT0gbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0pCi0JCXsKLQkJICBtYWtlX2FicyAoJnJlc3VsdCk7Ci0JCSAgcmVzdWx0LnZhbHVlID0gQUxJR05fTiAoZG90LCByZXN1bHQudmFsdWUpOwotCQl9Ci0JICAgICAgZWxzZQotCQlyZXN1bHQudmFsaWRfcCA9IGZhbHNlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgRkFJTCAoKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+dHJpbmFyeS5jb25kLCBjdXJyZW50X3NlY3Rpb24sCi0JCQkgICAgICBhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gICAgICBpZiAocmVzdWx0LnZhbGlkX3ApCi0JcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAoKHJlc3VsdC52YWx1ZQotCQkJCSA/IHRyZWUtPnRyaW5hcnkubGhzCi0JCQkJIDogdHJlZS0+dHJpbmFyeS5yaHMpLAotCQkJCWN1cnJlbnRfc2VjdGlvbiwKLQkJCQlhbGxvY2F0aW9uX2RvbmUsIGRvdCwgZG90cCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgcmVzdWx0ID0gZm9sZF9iaW5hcnkgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLAotCQkJICAgIGRvdCwgZG90cCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgIGNhc2UgZXRyZWVfcHJvdmlkZToKLSAgICAgIGlmICh0cmVlLT5hc3NpZ24uZHN0WzBdID09ICcuJyAmJiB0cmVlLT5hc3NpZ24uZHN0WzFdID09IDApCi0JewotCSAgLyogQXNzaWdubWVudCB0byBkb3QgY2FuIG9ubHkgYmUgZG9uZSBkdXJpbmcgYWxsb2NhdGlvbiAqLwotCSAgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlKQotCSAgICBlaW5mbyAoXygiJUYlUyBjYW4gbm90IFBST1ZJREUgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iKSk7Ci0JICBpZiAoYWxsb2NhdGlvbl9kb25lID09IGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtCi0JICAgICAgfHwgKGFsbG9jYXRpb25fZG9uZSA9PSBsYW5nX2ZpbmFsX3BoYXNlX2VudW0KLQkJICAmJiBjdXJyZW50X3NlY3Rpb24gPT0gYWJzX291dHB1dF9zZWN0aW9uKSkKLQkgICAgewotCSAgICAgIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKHRyZWUtPmFzc2lnbi5zcmMsCi0JCQkJICAgICAgY3VycmVudF9zZWN0aW9uLAotCQkJCSAgICAgIGxhbmdfYWxsb2NhdGluZ19waGFzZV9lbnVtLCBkb3QsCi0JCQkJICAgICAgZG90cCk7Ci0JICAgICAgaWYgKCEgcmVzdWx0LnZhbGlkX3ApCi0JCWVpbmZvIChfKCIlRiVTIGludmFsaWQgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyXG4iKSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGN1cnJlbnRfc2VjdGlvbiA9PSBOVUxMKQotCQkgICAgZWluZm8gKF8oIiVGJVMgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyIGludmFsaWQgb3V0c2lkZSBvZiBTRUNUSU9OXG4iKSk7Ci0JCSAgZWxzZQotCQkgICAgewotCQkgICAgICBiZmRfdm1hIG5leHRkb3Q7Ci0KLQkJICAgICAgbmV4dGRvdCA9IChyZXN1bHQudmFsdWUKLQkJCQkgKyBjdXJyZW50X3NlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWEpOwotCQkgICAgICBpZiAobmV4dGRvdCA8IGRvdAotCQkJICAmJiBjdXJyZW50X3NlY3Rpb24gIT0gYWJzX291dHB1dF9zZWN0aW9uKQotCQkJewotCQkJICBlaW5mbyAoXygiJUYlUyBjYW5ub3QgbW92ZSBsb2NhdGlvbiBjb3VudGVyIGJhY2t3YXJkcyAoZnJvbSAlViB0byAlVilcbiIpLAotCQkJCSBkb3QsIG5leHRkb3QpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQkqZG90cCA9IG5leHRkb3Q7IAotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgcmVzdWx0ID0gZXhwX2ZvbGRfdHJlZSAodHJlZS0+YXNzaWduLnNyYywKLQkJCQkgIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLAotCQkJCSAgZG90LCBkb3RwKTsKLQkgIGlmIChyZXN1bHQudmFsaWRfcCkKLQkgICAgewotCSAgICAgIGJvb2xlYW4gY3JlYXRlOwotCSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0JICAgICAgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9hc3NpZ24pCi0JCWNyZWF0ZSA9IHRydWU7Ci0JICAgICAgZWxzZQotCQljcmVhdGUgPSBmYWxzZTsKLQkgICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCB0cmVlLT5hc3NpZ24uZHN0LAotCQkJCQljcmVhdGUsIGZhbHNlLCBmYWxzZSk7Ci0JICAgICAgaWYgKGggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICopIE5VTEwpCi0JCXsKLQkJICBpZiAodHJlZS0+dHlwZS5ub2RlX2NsYXNzID09IGV0cmVlX2Fzc2lnbikKLQkJICAgIGVpbmZvIChfKCIlUCVGOiVzOiBoYXNoIGNyZWF0aW9uIGZhaWxlZFxuIiksCi0JCQkgICB0cmVlLT5hc3NpZ24uZHN0KTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHRyZWUtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9wcm92aWRlCi0JCSAgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkCi0JCSAgICAgICAmJiBoLT50eXBlICE9IGJmZF9saW5rX2hhc2hfY29tbW9uKQotCQl7Ci0JCSAgLyogRG8gbm90aGluZy4gIFRoZSBzeW1ib2wgd2FzIGRlZmluZWQgYnkgc29tZQotCQkgICAgIG9iamVjdC4gICovCi0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICAvKiBGSVhNRTogU2hvdWxkIHdlIHdvcnJ5IGlmIHRoZSBzeW1ib2wgaXMgYWxyZWFkeQotCQkgICAgIGRlZmluZWQ/ICAqLwotCQkgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0JCSAgaC0+dS5kZWYudmFsdWUgPSByZXN1bHQudmFsdWU7Ci0JCSAgaC0+dS5kZWYuc2VjdGlvbiA9IHJlc3VsdC5zZWN0aW9uLT5iZmRfc2VjdGlvbjsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX25hbWU6Ci0gICAgICByZXN1bHQgPSBmb2xkX25hbWUgKHRyZWUsIGN1cnJlbnRfc2VjdGlvbiwgYWxsb2NhdGlvbl9kb25lLCBkb3QpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgRkFJTCAoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgZXRyZWVfdmFsdWVfdHlwZSAKLWV4cF9mb2xkX3RyZWVfbm9fZG90ICh0cmVlLCBjdXJyZW50X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqY3VycmVudF9zZWN0aW9uOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotcmV0dXJuIGV4cF9mb2xkX3RyZWUodHJlZSwgY3VycmVudF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUsIChiZmRfdm1hKQotCQkgICAgIDAsIChiZmRfdm1hICopTlVMTCk7Ci19Ci0KLWV0cmVlX3R5cGUgKgotZXhwX2Jpbm9wIChjb2RlLCBsaHMsIHJocykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGV0cmVlX3R5cGUgKmxoczsKLSAgICAgZXRyZWVfdHlwZSAqcmhzOwotewotICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OwotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0KLSAgdmFsdWUudHlwZS5ub2RlX2NvZGUgPSBjb2RlOwotICB2YWx1ZS5iaW5hcnkubGhzID0gbGhzOwotICB2YWx1ZS5iaW5hcnkucmhzID0gcmhzOwotICB2YWx1ZS50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9iaW5hcnk7Ci0gIHIgPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsCi0JCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICBsYW5nX2ZpcnN0X3BoYXNlX2VudW0gKTsKLSAgaWYgKHIudmFsaWRfcCkKLSAgICB7Ci0gICAgICByZXR1cm4gZXhwX2ludG9wKHIudmFsdWUpOwotICAgIH0KLSAgbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPmJpbmFyeSkpOwotICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT5iaW5hcnkpKTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotZXRyZWVfdHlwZSAqCi1leHBfdHJpbm9wIChjb2RlLCBjb25kLCBsaHMsIHJocykKLSAgICAgaW50IGNvZGU7Ci0gICAgIGV0cmVlX3R5cGUgKmNvbmQ7Ci0gICAgIGV0cmVlX3R5cGUgKmxoczsKLSAgICAgZXRyZWVfdHlwZSAqcmhzOwotewotICBldHJlZV90eXBlIHZhbHVlLCAqbmV3OwotICBldHJlZV92YWx1ZV90eXBlIHI7Ci0gIHZhbHVlLnR5cGUubm9kZV9jb2RlID0gY29kZTsKLSAgdmFsdWUudHJpbmFyeS5saHMgPSBsaHM7Ci0gIHZhbHVlLnRyaW5hcnkuY29uZCA9IGNvbmQ7Ci0gIHZhbHVlLnRyaW5hcnkucmhzID0gcmhzOwotICB2YWx1ZS50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV90cmluYXJ5OwotICByPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsICAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZQotCQkJCSAgICAqKU5VTEwsbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLSAgaWYgKHIudmFsaWRfcCkgewotICAgIHJldHVybiBleHBfaW50b3Aoci52YWx1ZSk7Ci0gIH0KLSAgbmV3ID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuZXctPnRyaW5hcnkpKTsKLSAgbWVtY3B5KChjaGFyICopbmV3LChjaGFyICopICZ2YWx1ZSwgc2l6ZW9mKG5ldy0+dHJpbmFyeSkpOwotICByZXR1cm4gbmV3OwotfQotCi0KLWV0cmVlX3R5cGUgKgotZXhwX3Vub3AgKGNvZGUsIGNoaWxkKQotICAgICBpbnQgY29kZTsKLSAgICAgZXRyZWVfdHlwZSAqY2hpbGQ7Ci17Ci0gIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7Ci0KLSAgZXRyZWVfdmFsdWVfdHlwZSByOwotICB2YWx1ZS51bmFyeS50eXBlLm5vZGVfY29kZSA9IGNvZGU7Ci0gIHZhbHVlLnVuYXJ5LmNoaWxkID0gY2hpbGQ7Ci0gIHZhbHVlLnVuYXJ5LnR5cGUubm9kZV9jbGFzcyA9IGV0cmVlX3VuYXJ5OwotICByID0gZXhwX2ZvbGRfdHJlZV9ub19kb3QoJnZhbHVlLGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIGxhbmdfZmlyc3RfcGhhc2VfZW51bSk7Ci0gIGlmIChyLnZhbGlkX3ApIHsKLSAgICByZXR1cm4gZXhwX2ludG9wKHIudmFsdWUpOwotICB9Ci0gIG5ldyA9IChldHJlZV90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobmV3LT51bmFyeSkpOwotICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT51bmFyeSkpOwotICByZXR1cm4gbmV3OwotfQotCi0KLWV0cmVlX3R5cGUgKgotZXhwX25hbWVvcCAoY29kZSwgbmFtZSkKLSAgICAgaW50IGNvZGU7Ci0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcjsKLSAgdmFsdWUubmFtZS50eXBlLm5vZGVfY29kZSA9IGNvZGU7Ci0gIHZhbHVlLm5hbWUubmFtZSA9IG5hbWU7Ci0gIHZhbHVlLm5hbWUudHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfbmFtZTsKLQotCi0gIHIgPSBleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsCi0JCQkgICAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKU5VTEwsCi0JCQkgICBsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOwotICBpZiAoci52YWxpZF9wKSB7Ci0gICAgcmV0dXJuIGV4cF9pbnRvcChyLnZhbHVlKTsKLSAgfQotICBuZXcgPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+bmFtZSkpOwotICBtZW1jcHkoKGNoYXIgKiluZXcsIChjaGFyICopJnZhbHVlLCBzaXplb2YobmV3LT5uYW1lKSk7Ci0gIHJldHVybiBuZXc7Ci0KLX0KLQotCi0KLQotZXRyZWVfdHlwZSAqCi1leHBfYXNzb3AgKGNvZGUsIGRzdCwgc3JjKQotICAgICBpbnQgY29kZTsKLSAgICAgQ09OU1QgY2hhciAqZHN0OwotICAgICBldHJlZV90eXBlICpzcmM7Ci17Ci0gIGV0cmVlX3R5cGUgdmFsdWUsICpuZXc7Ci0KLSAgdmFsdWUuYXNzaWduLnR5cGUubm9kZV9jb2RlID0gY29kZTsKLQotCi0gIHZhbHVlLmFzc2lnbi5zcmMgPSBzcmM7Ci0gIHZhbHVlLmFzc2lnbi5kc3QgPSBkc3Q7Ci0gIHZhbHVlLmFzc2lnbi50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9hc3NpZ247Ci0KLSNpZiAwCi0gIGlmIChleHBfZm9sZF90cmVlX25vX2RvdCgmdmFsdWUsICZyZXN1bHQpKSB7Ci0gICAgcmV0dXJuIGV4cF9pbnRvcChyZXN1bHQpOwotICB9Ci0jZW5kaWYKLSAgbmV3ID0gKGV0cmVlX3R5cGUqKSBzdGF0X2FsbG9jIChzaXplb2YgKG5ldy0+YXNzaWduKSk7Ci0gIG1lbWNweSgoY2hhciAqKW5ldywgKGNoYXIgKikmdmFsdWUsIHNpemVvZihuZXctPmFzc2lnbikpOwotICByZXR1cm4gbmV3OwotfQotCi0vKiBIYW5kbGUgUFJPVklERS4gICovCi0KLWV0cmVlX3R5cGUgKgotZXhwX3Byb3ZpZGUgKGRzdCwgc3JjKQotICAgICBjb25zdCBjaGFyICpkc3Q7Ci0gICAgIGV0cmVlX3R5cGUgKnNyYzsKLXsKLSAgZXRyZWVfdHlwZSAqbjsKLQotICBuID0gKGV0cmVlX3R5cGUgKikgc3RhdF9hbGxvYyAoc2l6ZW9mIChuLT5hc3NpZ24pKTsKLSAgbi0+YXNzaWduLnR5cGUubm9kZV9jb2RlID0gJz0nOwotICBuLT5hc3NpZ24udHlwZS5ub2RlX2NsYXNzID0gZXRyZWVfcHJvdmlkZTsKLSAgbi0+YXNzaWduLnNyYyA9IHNyYzsKLSAgbi0+YXNzaWduLmRzdCA9IGRzdDsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIEhhbmRsZSBBU1NFUlQuICAqLwotCi1ldHJlZV90eXBlICoKLWV4cF9hc3NlcnQgKGV4cCwgbWVzc2FnZSkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotICAgICBjb25zdCBjaGFyICptZXNzYWdlOwotewotICBldHJlZV90eXBlICpuOwotCi0gIG4gPSAoZXRyZWVfdHlwZSAqKSBzdGF0X2FsbG9jIChzaXplb2YgKG4tPmFzc2VydF9zKSk7Ci0gIG4tPmFzc2VydF9zLnR5cGUubm9kZV9jb2RlID0gJyEnOwotICBuLT5hc3NlcnRfcy50eXBlLm5vZGVfY2xhc3MgPSBldHJlZV9hc3NlcnQ7Ci0gIG4tPmFzc2VydF9zLmNoaWxkID0gZXhwOwotICBuLT5hc3NlcnRfcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgCi1leHBfcHJpbnRfdHJlZSAodHJlZSkKLSAgICAgZXRyZWVfdHlwZSAqdHJlZTsKLXsKLSAgc3dpdGNoICh0cmVlLT50eXBlLm5vZGVfY2xhc3MpIHsKLSAgY2FzZSBldHJlZV92YWx1ZToKLSAgICBtaW5mbyAoIjB4JXYiLCB0cmVlLT52YWx1ZS52YWx1ZSk7Ci0gICAgcmV0dXJuOwotICBjYXNlIGV0cmVlX3JlbDoKLSAgICBpZiAodHJlZS0+cmVsLnNlY3Rpb24tPm93bmVyICE9IE5VTEwpCi0gICAgICBtaW5mbyAoIiVCOiIsIHRyZWUtPnJlbC5zZWN0aW9uLT5vd25lcik7Ci0gICAgbWluZm8gKCIlcysweCV2IiwgdHJlZS0+cmVsLnNlY3Rpb24tPm5hbWUsIHRyZWUtPnJlbC52YWx1ZSk7Ci0gICAgcmV0dXJuOwotICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSNpZiAwCi0gICAgaWYgKHRyZWUtPmFzc2lnbi5kc3QtPnNkZWZzICE9IChhc3ltYm9sICopTlVMTCl7Ci0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMgKCV4KSAiLHRyZWUtPmFzc2lnbi5kc3QtPm5hbWUsCi0JICAgICAgdHJlZS0+YXNzaWduLmRzdC0+c2RlZnMtPnZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMgKFVOREVGSU5FRCkiLHRyZWUtPmFzc2lnbi5kc3QtPm5hbWUpOwotICAgIH0KLSNlbmRpZgotICAgIGZwcmludGYoY29uZmlnLm1hcF9maWxlLCIlcyIsdHJlZS0+YXNzaWduLmRzdCk7Ci0gICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnR5cGUubm9kZV9jb2RlKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT5hc3NpZ24uc3JjKTsKLSAgICBicmVhazsKLSAgY2FzZSBldHJlZV9wcm92aWRlOgotICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlBST1ZJREUgKCVzLCAiLCB0cmVlLT5hc3NpZ24uZHN0KTsKLSAgICBleHBfcHJpbnRfdHJlZSAodHJlZS0+YXNzaWduLnNyYyk7Ci0gICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiKSIpOwotICAgIGJyZWFrOwotICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCIpOwotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPmJpbmFyeS5saHMpOwotICAgIGV4cF9wcmludF90b2tlbih0cmVlLT50eXBlLm5vZGVfY29kZSk7Ci0gICAgZXhwX3ByaW50X3RyZWUodHJlZS0+YmluYXJ5LnJocyk7Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIikiKTsKLSAgICBicmVhazsKLSAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPnRyaW5hcnkuY29uZCk7Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIj8iKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT50cmluYXJ5Lmxocyk7Ci0gICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIjoiKTsKLSAgICBleHBfcHJpbnRfdHJlZSh0cmVlLT50cmluYXJ5LnJocyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgZXRyZWVfdW5hcnk6Ci0gICAgZXhwX3ByaW50X3Rva2VuKHRyZWUtPnVuYXJ5LnR5cGUubm9kZV9jb2RlKTsKLSAgICBpZiAodHJlZS0+dW5hcnkuY2hpbGQpIAotICAgIHsKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKCIpOwotICAgIGV4cF9wcmludF90cmVlKHRyZWUtPnVuYXJ5LmNoaWxkKTsKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiKSIpOwotICB9Ci0gICAgCi0gICAgYnJlYWs7Ci0KLSAgY2FzZSBldHJlZV9hc3NlcnQ6Ci0gICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiQVNTRVJUICgiKTsKLSAgICBleHBfcHJpbnRfdHJlZSAodHJlZS0+YXNzZXJ0X3MuY2hpbGQpOwotICAgIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiwgJXMpIiwgdHJlZS0+YXNzZXJ0X3MubWVzc2FnZSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBldHJlZV91bmRlZjoKLSAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiPz8/Pz8/Pz8iKTsKLSAgICBicmVhazsKLSAgY2FzZSBldHJlZV9uYW1lOgotICAgIGlmICh0cmVlLT50eXBlLm5vZGVfY29kZSA9PSBOQU1FKSB7Ci0gICAgICBmcHJpbnRmKGNvbmZpZy5tYXBfZmlsZSwiJXMiLCB0cmVlLT5uYW1lLm5hbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGV4cF9wcmludF90b2tlbih0cmVlLT50eXBlLm5vZGVfY29kZSk7Ci0gICAgICBpZiAodHJlZS0+bmFtZS5uYW1lKQotICAgICAgZnByaW50Zihjb25maWcubWFwX2ZpbGUsIiglcykiLCB0cmVlLT5uYW1lLm5hbWUpOwotICAgIH0KLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBGQUlMKCk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotYmZkX3ZtYQotZXhwX2dldF92bWEgKHRyZWUsIGRlZiwgbmFtZSwgYWxsb2NhdGlvbl9kb25lKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBiZmRfdm1hIGRlZjsKLSAgICAgY2hhciAqbmFtZTsKLSAgICAgbGFuZ19waGFzZV90eXBlIGFsbG9jYXRpb25fZG9uZTsKLXsKLSAgZXRyZWVfdmFsdWVfdHlwZSByOwotCi0gIGlmICh0cmVlICE9IE5VTEwpCi0gICAgewotICAgICAgciA9IGV4cF9mb2xkX3RyZWVfbm9fZG90ICh0cmVlLCBhYnNfb3V0cHV0X3NlY3Rpb24sIGFsbG9jYXRpb25fZG9uZSk7Ci0gICAgICBpZiAoISByLnZhbGlkX3AgJiYgbmFtZSAhPSBOVUxMKQotCWVpbmZvIChfKCIlRiVTIG5vbmNvbnN0YW50IGV4cHJlc3Npb24gZm9yICVzXG4iKSwgbmFtZSk7Ci0gICAgICByZXR1cm4gci52YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gZGVmOwotfQotCi1pbnQgCi1leHBfZ2V0X3ZhbHVlX2ludCAodHJlZSxkZWYsbmFtZSwgYWxsb2NhdGlvbl9kb25lKQotICAgICBldHJlZV90eXBlICp0cmVlOwotICAgICBpbnQgZGVmOwotICAgICBjaGFyICpuYW1lOwotICAgICBsYW5nX3BoYXNlX3R5cGUgYWxsb2NhdGlvbl9kb25lOwotewotICByZXR1cm4gKGludClleHBfZ2V0X3ZtYSh0cmVlLChiZmRfdm1hKWRlZixuYW1lLCBhbGxvY2F0aW9uX2RvbmUpOwotfQotCi0KLWJmZF92bWEKLWV4cF9nZXRfYWJzX2ludCAodHJlZSwgZGVmLCBuYW1lLCBhbGxvY2F0aW9uX2RvbmUpCi0gICAgIGV0cmVlX3R5cGUgKnRyZWU7Ci0gICAgIGludCBkZWY7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfcGhhc2VfdHlwZSBhbGxvY2F0aW9uX2RvbmU7Ci17Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzOwotICByZXMgPSBleHBfZm9sZF90cmVlX25vX2RvdCAodHJlZSwgYWJzX291dHB1dF9zZWN0aW9uLCBhbGxvY2F0aW9uX2RvbmUpOwotCi0gIGlmIChyZXMudmFsaWRfcCkKLSAgICB7Ci0gICAgICByZXMudmFsdWUgKz0gcmVzLnNlY3Rpb24tPmJmZF9zZWN0aW9uLT52bWE7Ci0gICAgfQotICBlbHNlIHsKLSAgICBlaW5mbyAoXygiJUYlUyBub24gY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIpLG5hbWUpOwotICB9Ci0gIHJldHVybiByZXMudmFsdWU7Ci19CmRpZmYgLS1naXQgYS9sZC9sZGV4cC5oIGIvbGQvbGRleHAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlOGRkZi4uMDAwMDAwMAotLS0gYS9sZC9sZGV4cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qIGxkZXhwLmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExERVhQX0gKLSNkZWZpbmUgTERFWFBfSAotCi0vKiBUaGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gdHJlZSAqLwotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGJmZF92bWEgdmFsdWU7Ci0gIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9zdHJ1Y3QgKnNlY3Rpb247Ci0gIGJvb2xlYW4gdmFsaWRfcDsKLX0gZXRyZWVfdmFsdWVfdHlwZTsKLQotCi0KLXR5cGVkZWYgc3RydWN0IAotewotICBpbnQgbm9kZV9jb2RlOwotICBlbnVtIHsgZXRyZWVfYmluYXJ5LAotCSAgIGV0cmVlX3RyaW5hcnksCi0JICAgZXRyZWVfdW5hcnksCi0JICAgZXRyZWVfbmFtZSwKLQkgICBldHJlZV9hc3NpZ24sCi0JICAgZXRyZWVfcHJvdmlkZSwKLQkgICBldHJlZV91bmRlZiwKLQkgICBldHJlZV91bnNwZWMsCi0JICAgZXRyZWVfdmFsdWUsCi0JICAgZXRyZWVfYXNzZXJ0LAotCSAgIGV0cmVlX3JlbCB9IG5vZGVfY2xhc3M7Ci19IG5vZGVfdHlwZTsKLQotCi0KLXR5cGVkZWYgdW5pb24gZXRyZWVfdW5pb24gCi17Ci0gIG5vZGVfdHlwZSB0eXBlOwotICBzdHJ1Y3QgewotICAgIG5vZGVfdHlwZSB0eXBlOwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpsaHM7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKnJoczsKLSAgfSBiaW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmNvbmQ7Ci0gICAgdW5pb24gZXRyZWVfdW5pb24gKmxoczsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqcmhzOwotICB9IHRyaW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgQ09OU1QgY2hhciAqZHN0OwotICAgIHVuaW9uIGV0cmVlX3VuaW9uICpzcmM7Ci0gIH0gYXNzaWduOwotCi0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgdW5pb24gICBldHJlZV91bmlvbiAqY2hpbGQ7Ci0gIH0gdW5hcnk7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICBDT05TVCBjaGFyICpuYW1lOwotICB9IG5hbWU7Ci0gIHN0cnVjdCB7Ci0gICAgbm9kZV90eXBlIHR5cGU7Ci0gICAgYmZkX3ZtYSB2YWx1ZTsKLSAgfSB2YWx1ZTsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICBiZmRfdm1hIHZhbHVlOwotICB9IHJlbDsKLSAgc3RydWN0IHsKLSAgICBub2RlX3R5cGUgdHlwZTsKLSAgICB1bmlvbiBldHJlZV91bmlvbiAqY2hpbGQ7Ci0gICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLSAgfSBhc3NlcnRfczsKLX0gZXRyZWVfdHlwZTsKLQotCi1ldHJlZV90eXBlICpleHBfaW50b3AgUEFSQU1TICgoYmZkX3ZtYSkpOwotZXRyZWVfdHlwZSAqZXhwX3JlbG9wIFBBUkFNUyAoKGFzZWN0aW9uICosIGJmZF92bWEpKTsKLWV0cmVlX3ZhbHVlX3R5cGUgaW52YWxpZCBQQVJBTVMgKCh2b2lkKSk7Ci1ldHJlZV92YWx1ZV90eXBlIGV4cF9mb2xkX3RyZWUgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBzdHJ1Y3QKLQkJCQkJbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfc3RydWN0ICosCi0JCQkJCWxhbmdfcGhhc2VfdHlwZSwKLQkJCQkJYmZkX3ZtYSwgYmZkX3ZtYSAqKSk7Ci1ldHJlZV90eXBlICpleHBfYmlub3AgUEFSQU1TICgoaW50LCBldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX3RyaW5vcCBQQVJBTVMgKChpbnQsZXRyZWVfdHlwZSAqLCBldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX3Vub3AgUEFSQU1TICgoaW50LCBldHJlZV90eXBlICopKTsKLWV0cmVlX3R5cGUgKmV4cF9uYW1lb3AgUEFSQU1TICgoaW50LCBDT05TVCBjaGFyICopKTsKLWV0cmVlX3R5cGUgKmV4cF9hc3NvcCBQQVJBTVMgKChpbnQsIENPTlNUIGNoYXIgKiwgZXRyZWVfdHlwZSAqKSk7Ci1ldHJlZV90eXBlICpleHBfcHJvdmlkZSBQQVJBTVMgKChjb25zdCBjaGFyICosIGV0cmVlX3R5cGUgKikpOwotZXRyZWVfdHlwZSAqZXhwX2Fzc2VydCBQQVJBTVMgKChldHJlZV90eXBlICosIGNvbnN0IGNoYXIgKikpOwotdm9pZCBleHBfcHJpbnRfdHJlZSBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLWJmZF92bWEgZXhwX2dldF92bWEgUEFSQU1TICgoZXRyZWVfdHlwZSAqLCBiZmRfdm1hLCBjaGFyICosIGxhbmdfcGhhc2VfdHlwZSkpOwotaW50IGV4cF9nZXRfdmFsdWVfaW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKiwgaW50LCBjaGFyICosbGFuZ19waGFzZV90eXBlKSk7Ci1iZmRfdm1hIGV4cF9nZXRfYWJzX2ludCBQQVJBTVMgKChldHJlZV90eXBlICosIGludCwgY2hhciAqLGxhbmdfcGhhc2VfdHlwZSkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkZmlsZS5jIGIvbGQvbGRmaWxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmEzMWYuLjAwMDAwMDAKLS0tIGEvbGQvbGRmaWxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi0gbGRmaWxlLmMKLQotIGxvb2sgYWZ0ZXIgYWxsIHRoZSBmaWxlIHN0dWZmCi0KLSAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotY29uc3QgY2hhciAqbGRmaWxlX2lucHV0X2ZpbGVuYW1lOwotYm9vbGVhbiBsZGZpbGVfYXNzdW1lZF9zY3JpcHQgPSBmYWxzZTsKLWNvbnN0IGNoYXIgKmxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gIiI7Ci11bnNpZ25lZCBsb25nIGxkZmlsZV9vdXRwdXRfbWFjaGluZTsKLWVudW0gYmZkX2FyY2hpdGVjdHVyZSBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZTsKLXNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaF9oZWFkOwotCi0jaWZuZGVmIE1QVwotI2lmZGVmIFZNUwotY2hhciAqc2xhc2ggPSAiIjsKLSNlbHNlCi0jaWYgZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLWNoYXIgKnNsYXNoID0gIlxcIjsKLSNlbHNlCi1jaGFyICpzbGFzaCA9ICIvIjsKLSNlbmRpZgotI2VuZGlmCi0jZWxzZSAvKiBNUFcgKi8KLS8qIFRoZSBNUFcgcGF0aCBjaGFyIGlzIGEgY29sb24uICovCi1jaGFyICpzbGFzaCA9ICI6IjsKLSNlbmRpZiAvKiBNUFcgKi8KLQotLyogTE9DQUwgKi8KLQotc3RhdGljIHNlYXJjaF9kaXJzX3R5cGUgKipzZWFyY2hfdGFpbF9wdHIgPSAmc2VhcmNoX2hlYWQ7Ci0KLXR5cGVkZWYgc3RydWN0IHNlYXJjaF9hcmNoIAotewotICBjaGFyICpuYW1lOyAKLSAgc3RydWN0IHNlYXJjaF9hcmNoICpuZXh0OwotfSBzZWFyY2hfYXJjaF90eXBlOwotCi1zdGF0aWMgc2VhcmNoX2FyY2hfdHlwZSAqc2VhcmNoX2FyY2hfaGVhZDsKLXN0YXRpYyBzZWFyY2hfYXJjaF90eXBlICoqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSAmc2VhcmNoX2FyY2hfaGVhZDsKLSAKLXN0YXRpYyBib29sZWFuIGxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmFyY2gsIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKLQkgICBjb25zdCBjaGFyICpsaWIsIGNvbnN0IGNoYXIgKnN1ZmZpeCkpOwotc3RhdGljIEZJTEUgKnRyeV9vcGVuIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmV4dGVuKSk7Ci0KLXZvaWQKLWxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIChuYW1lLCBjbWRsaW5lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGNtZGxpbmU7Ci17Ci0gIHNlYXJjaF9kaXJzX3R5cGUgKm5ldzsKLQotICBuZXcgPSAoc2VhcmNoX2RpcnNfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHNlYXJjaF9kaXJzX3R5cGUpKTsKLSAgbmV3LT5uZXh0ID0gTlVMTDsKLSAgbmV3LT5uYW1lID0gbmFtZTsKLSAgbmV3LT5jbWRsaW5lID0gY21kbGluZTsKLSAgKnNlYXJjaF90YWlsX3B0ciA9IG5ldzsKLSAgc2VhcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLX0KLQotLyogVHJ5IHRvIG9wZW4gYSBCRkQgZm9yIGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnQuICAqLwotCi1ib29sZWFuCi1sZGZpbGVfdHJ5X29wZW5fYmZkIChhdHRlbXB0LCBlbnRyeSkKLSAgICAgY29uc3QgY2hhciAqYXR0ZW1wdDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGVudHJ5LT50aGVfYmZkID0gYmZkX29wZW5yIChhdHRlbXB0LCBlbnRyeS0+dGFyZ2V0KTsKLQotICBpZiAodHJhY2VfZmlsZV90cmllcykKLSAgICB7Ci0gICAgICBpZiAoZW50cnktPnRoZV9iZmQgPT0gTlVMTCkKLQlpbmZvX21zZyAoXygiYXR0ZW1wdCB0byBvcGVuICVzIGZhaWxlZFxuIiksIGF0dGVtcHQpOwotICAgICAgZWxzZQotCWluZm9fbXNnIChfKCJhdHRlbXB0IHRvIG9wZW4gJXMgc3VjY2VlZGVkXG4iKSwgYXR0ZW1wdCk7Ci0gICAgfQotCi0gIGlmIChlbnRyeS0+dGhlX2JmZCAhPSBOVUxMKQotICAgIHJldHVybiB0cnVlOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KQotCWVpbmZvIChfKCIlRiVQOiBpbnZhbGlkIEJGRCB0YXJnZXQgYCVzJ1xuIiksIGVudHJ5LT50YXJnZXQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotLyogU2VhcmNoIGZvciBhbmQgb3BlbiB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgRU5UUlkuICBJZiBpdCBpcyBhbgotICAgYXJjaGl2ZSwgdXNlIEFSQ0gsIExJQiBhbmQgU1VGRklYIHRvIG1vZGlmeSB0aGUgZmlsZSBuYW1lLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWxkZmlsZV9vcGVuX2ZpbGVfc2VhcmNoIChhcmNoLCBlbnRyeSwgbGliLCBzdWZmaXgpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotICAgICBjb25zdCBjaGFyICpsaWI7Ci0gICAgIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLXsKLSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotCi0gIC8qIElmIHRoaXMgaXMgbm90IGFuIGFyY2hpdmUsIHRyeSB0byBvcGVuIGl0IGluIHRoZSBjdXJyZW50Ci0gICAgIGRpcmVjdG9yeSBmaXJzdC4gICovCi0gIGlmICghIGVudHJ5LT5pc19hcmNoaXZlKQotICAgIHsKLSAgICAgIGlmIChsZGZpbGVfdHJ5X29wZW5fYmZkIChlbnRyeS0+ZmlsZW5hbWUsIGVudHJ5KSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsKLSAgICAgICBzZWFyY2ggIT0gKHNlYXJjaF9kaXJzX3R5cGUgKilOVUxMOwotICAgICAgIHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkgCi0gICAgewotICAgICAgY2hhciAqc3RyaW5nOwotCi0gICAgICBpZiAoZW50cnktPmR5bmFtaWMgJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotCXsKLQkgIGlmIChsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpKQotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLSAgICAgIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJCSArIHN0cmxlbiAoc2xhc2gpCi0JCQkJICsgc3RybGVuIChsaWIpCi0JCQkJICsgc3RybGVuIChlbnRyeS0+ZmlsZW5hbWUpCi0JCQkJICsgc3RybGVuIChhcmNoKQotCQkJCSArIHN0cmxlbiAoc3VmZml4KQotCQkJCSArIDEpOwotCi0gICAgICBpZiAoZW50cnktPmlzX2FyY2hpdmUpCi0Jc3ByaW50ZiAoc3RyaW5nLCAiJXMlcyVzJXMlcyVzIiwgc2VhcmNoLT5uYW1lLCBzbGFzaCwKLQkJIGxpYiwgZW50cnktPmZpbGVuYW1lLCBhcmNoLCBzdWZmaXgpOwotICAgICAgZWxzZSBpZiAoZW50cnktPmZpbGVuYW1lWzBdID09ICcvJyB8fCBlbnRyeS0+ZmlsZW5hbWVbMF0gPT0gJy4nCi0jaWYgZGVmaW5lZCAoX19NU0RPU19fKSB8fCBkZWZpbmVkIChfV0lOMzIpCi0JICAgICAgIHx8IGVudHJ5LT5maWxlbmFtZVswXSA9PSAnXFwnIAotCSAgICAgICB8fCAoaXNhbHBoYSAoZW50cnktPmZpbGVuYW1lWzBdKSAKLQkgICAgICAgICAgICYmIGVudHJ5LT5maWxlbmFtZVsxXSA9PSAnOicpCi0jZW5kaWYKLQkgICkKLQlzdHJjcHkgKHN0cmluZywgZW50cnktPmZpbGVuYW1lKTsKLSAgICAgIGVsc2UKLQlzcHJpbnRmIChzdHJpbmcsICIlcyVzJXMiLCBzZWFyY2gtPm5hbWUsIHNsYXNoLCBlbnRyeS0+ZmlsZW5hbWUpOwotCi0gICAgICBpZiAobGRmaWxlX3RyeV9vcGVuX2JmZCAoc3RyaW5nLCBlbnRyeSkpCi0JewotCSAgZW50cnktPmZpbGVuYW1lID0gc3RyaW5nOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotCi0gICAgICBmcmVlIChzdHJpbmcpOwotICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIE9wZW4gdGhlIGlucHV0IGZpbGUgc3BlY2lmaWVkIGJ5IEVOVFJZLiAgKi8KLQotdm9pZAotbGRmaWxlX29wZW5fZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBpZiAoZW50cnktPnRoZV9iZmQgIT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpCi0gICAgewotICAgICAgaWYgKGxkZmlsZV90cnlfb3Blbl9iZmQgKGVudHJ5LT5maWxlbmFtZSwgZW50cnkpKQotCXJldHVybjsKLSAgICAgIGlmIChzdHJjbXAgKGVudHJ5LT5maWxlbmFtZSwgZW50cnktPmxvY2FsX3N5bV9uYW1lKSAhPSAwKQotCWVpbmZvIChfKCIlRiVQOiBjYW5ub3Qgb3BlbiAlcyBmb3IgJXM6ICVFXG4iKSwKLQkgICAgICAgZW50cnktPmZpbGVuYW1lLCBlbnRyeS0+bG9jYWxfc3ltX25hbWUpOwotICAgICAgZWxzZQotCWVpbmZvKF8oIiVGJVA6IGNhbm5vdCBvcGVuICVzOiAlRVxuIiksIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc2VhcmNoX2FyY2hfdHlwZSAqYXJjaDsKLQotICAgICAgLyogVHJ5IHRvIG9wZW4gPGZpbGVuYW1lPjxzdWZmaXg+IG9yIGxpYjxmaWxlbmFtZT48c3VmZml4Pi5hICovCi0gICAgICBmb3IgKGFyY2ggPSBzZWFyY2hfYXJjaF9oZWFkOwotCSAgIGFyY2ggIT0gKHNlYXJjaF9hcmNoX3R5cGUgKikgTlVMTDsKLQkgICBhcmNoID0gYXJjaC0+bmV4dCkKLQl7Ci0JICBpZiAobGRmaWxlX29wZW5fZmlsZV9zZWFyY2ggKGFyY2gtPm5hbWUsIGVudHJ5LCAibGliIiwgIi5hIikpCi0JICAgIHJldHVybjsKLSNpZmRlZiBWTVMKLQkgIGlmIChsZGZpbGVfb3Blbl9maWxlX3NlYXJjaCAoYXJjaC0+bmFtZSwgZW50cnksICI6bGliIiwgIi5hIikpCi0JICAgIHJldHVybjsKLSNlbmRpZgotCX0KLSAgICAgIGVpbmZvIChfKCIlRiVQOiBjYW5ub3QgZmluZCAlc1xuIiksIGVudHJ5LT5sb2NhbF9zeW1fbmFtZSk7Ci0gICAgfQotfQotCi0vKiBUcnkgdG8gb3BlbiBOQU1FOyBpZiB0aGF0IGZhaWxzLCB0cnkgTkFNRSB3aXRoIEVYVEVOIGFwcGVuZGVkIHRvIGl0LiAgKi8KLQotc3RhdGljIEZJTEUgKgotdHJ5X29wZW4gKG5hbWUsIGV4dGVuKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBjb25zdCBjaGFyICpleHRlbjsKLXsKLSAgRklMRSAqcmVzdWx0OwotICBjaGFyIGJ1ZmZbMTAwMF07Ci0KLSAgcmVzdWx0ID0gZm9wZW4gKG5hbWUsICJyIik7Ci0gIGlmICh0cmFjZV9maWxlX3RyaWVzKQotICAgIHsKLSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQlpbmZvX21zZyAoXygiY2Fubm90IGZpbmQgc2NyaXB0IGZpbGUgJXNcbiIpLCBuYW1lKTsKLSAgICAgIGVsc2UKLQlpbmZvX21zZyAoXygib3BlbmVkIHNjcmlwdCBmaWxlICVzXG4iKSwgbmFtZSk7Ci0gICAgfQotCi0gIGlmIChyZXN1bHQgIT0gTlVMTCkKLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIGlmICgqZXh0ZW4pCi0gICAgewotICAgICAgc3ByaW50ZiAoYnVmZiwgIiVzJXMiLCBuYW1lLCBleHRlbik7Ci0gICAgICByZXN1bHQgPSBmb3BlbiAoYnVmZiwgInIiKTsKLSAgICAgIGlmICh0cmFjZV9maWxlX3RyaWVzKQotCXsKLQkgIGlmIChyZXN1bHQgPT0gTlVMTCkKLQkgICAgaW5mb19tc2cgKF8oImNhbm5vdCBmaW5kIHNjcmlwdCBmaWxlICVzXG4iKSwgYnVmZik7Ci0JICBlbHNlCi0JICAgIGluZm9fbXNnIChfKCJvcGVuZWQgc2NyaXB0IGZpbGUgJXNcbiIpLCBidWZmKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFRyeSB0byBvcGVuIE5BTUU7IGlmIHRoYXQgZmFpbHMsIGxvb2sgZm9yIGl0IGluIGFueSBkaXJlY3RvcmllcwotICAgc3BlY2lmaWVkIHdpdGggLUwsIHdpdGhvdXQgYW5kIHdpdGggRVhURU5EIGFwcHBlbmRlZC4gICovCi0KLUZJTEUgKgotbGRmaWxlX2ZpbmRfY29tbWFuZF9maWxlIChuYW1lLCBleHRlbmQpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKmV4dGVuZDsKLXsKLSAgc2VhcmNoX2RpcnNfdHlwZSAqc2VhcmNoOwotICBGSUxFICpyZXN1bHQ7Ci0gIGNoYXIgYnVmZmVyWzEwMDBdOwotCi0gIC8qIEZpcnN0IHRyeSByYXcgbmFtZSAqLwotICByZXN1bHQgPSB0cnlfb3BlbihuYW1lLCIiKTsKLSAgaWYgKHJlc3VsdCA9PSAoRklMRSAqKU5VTEwpIHsKLSAgICAvKiBUcnkgbm93IHByZWZpeGVzICovCi0gICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsKLQkgc2VhcmNoICE9IChzZWFyY2hfZGlyc190eXBlICopTlVMTDsKLQkgc2VhcmNoID0gc2VhcmNoLT5uZXh0KSB7Ci0gICAgICBzcHJpbnRmKGJ1ZmZlciwiJXMlcyVzIiwgc2VhcmNoLT5uYW1lLCBzbGFzaCwgbmFtZSk7Ci0gICAgICByZXN1bHQgPSB0cnlfb3BlbihidWZmZXIsIGV4dGVuZCk7Ci0gICAgICBpZiAocmVzdWx0KWJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkCi1sZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIEZJTEUgKmxkbGV4X2lucHV0X3N0YWNrOwotICBsZGxleF9pbnB1dF9zdGFjayA9IGxkZmlsZV9maW5kX2NvbW1hbmRfZmlsZShuYW1lLCAiIik7Ci0KLSAgaWYgKGxkbGV4X2lucHV0X3N0YWNrID09IChGSUxFICopTlVMTCkgewotICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0gICAgZWluZm8oXygiJVAlRjogY2Fubm90IG9wZW4gbGlua2VyIHNjcmlwdCBmaWxlICVzOiAlRVxuIiksbmFtZSk7Ci0gIH0KLSAgbGV4X3B1c2hfZmlsZShsZGxleF9pbnB1dF9zdGFjaywgbmFtZSk7Ci0gIAotICBsZGZpbGVfaW5wdXRfZmlsZW5hbWUgPSBuYW1lOwotICBsaW5lbm8gPSAxOwotICBoYWRfc2NyaXB0ID0gdHJ1ZTsKLX0KLQotCi0KLQotCi0jaWZkZWYgR05VOTYwCi1zdGF0aWMKLWNoYXIgKgotZ251OTYwX21hcF9hcmNobmFtZSggbmFtZSApCi1jaGFyICpuYW1lOwotewotICBzdHJ1Y3QgdGFiZW50cnkgeyBjaGFyICpjbWRfc3dpdGNoOyBjaGFyICphcmNoOyB9OwotICBzdGF0aWMgc3RydWN0IHRhYmVudHJ5IGFyY2hfdGFiW10gPSB7Ci0JIiIsICAgIiIsCi0JIktBIiwgImthIiwKLQkiS0IiLCAia2IiLAotCSJLQyIsICJtYyIsCS8qIFN5bm9ueW0gZm9yIE1DICovCi0JIk1DIiwgIm1jIiwKLQkiQ0EiLCAiY2EiLAotCSJTQSIsICJrYSIsCS8qIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEtBICovCi0JIlNCIiwgImtiIiwJLyogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gS0IgKi8KLQlOVUxMLCAiIgotICB9OwotICBzdHJ1Y3QgdGFiZW50cnkgKnRwOwotICAKLQotICBmb3IgKCB0cCA9IGFyY2hfdGFiOyB0cC0+Y21kX3N3aXRjaCAhPSBOVUxMOyB0cCsrICl7Ci0gICAgaWYgKCAhc3RyY21wKG5hbWUsdHAtPmNtZF9zd2l0Y2gpICl7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoIHRwLT5jbWRfc3dpdGNoID09IE5VTEwgKXsKLSAgICBlaW5mbyhfKCIlUCVGOiB1bmtub3duIGFyY2hpdGVjdHVyZTogJXNcbiIpLG5hbWUpOwotICB9Ci0gIHJldHVybiB0cC0+YXJjaDsKLX0KLQotCi0KLXZvaWQKLWxkZmlsZV9hZGRfYXJjaChuYW1lKQotY2hhciAqbmFtZTsKLXsKLSAgc2VhcmNoX2FyY2hfdHlwZSAqbmV3ID0KLSAgICAoc2VhcmNoX2FyY2hfdHlwZSAqKXhtYWxsb2MoKGJmZF9zaXplX3R5cGUpKHNpemVvZihzZWFyY2hfYXJjaF90eXBlKSkpOwotCi0KLSAgaWYgKCpuYW1lICE9ICdcMCcpIHsKLSAgICBpZiAobGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWVbMF0gIT0gJ1wwJykgewotICAgICAgZWluZm8oXygiJVAlRjogdGFyZ2V0IGFyY2hpdGVjdHVyZSByZXNwZWNpZmllZFxuIikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9IG5hbWU7Ci0gIH0KLQotICBuZXctPm5leHQgPSAoc2VhcmNoX2FyY2hfdHlwZSopTlVMTDsKLSAgbmV3LT5uYW1lID0gZ251OTYwX21hcF9hcmNobmFtZSggbmFtZSApOwotICAqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSBuZXc7Ci0gIHNlYXJjaF9hcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLQotfQotCi0jZWxzZQkvKiBub3QgR05VOTYwICovCi0KLQotdm9pZAotbGRmaWxlX2FkZF9hcmNoIChpbl9uYW1lKQotICAgICBDT05TVCBjaGFyICogaW5fbmFtZTsKLXsKLSAgY2hhciAqbmFtZSA9IGJ1eXN0cmluZyhpbl9uYW1lKTsKLSAgc2VhcmNoX2FyY2hfdHlwZSAqbmV3ID0KLSAgICAoc2VhcmNoX2FyY2hfdHlwZSAqKSB4bWFsbG9jIChzaXplb2YgKHNlYXJjaF9hcmNoX3R5cGUpKTsKLQotICBsZGZpbGVfb3V0cHV0X21hY2hpbmVfbmFtZSA9IGluX25hbWU7Ci0KLSAgbmV3LT5uYW1lID0gbmFtZTsKLSAgbmV3LT5uZXh0ID0gKHNlYXJjaF9hcmNoX3R5cGUqKU5VTEw7Ci0gIHdoaWxlICgqbmFtZSkKLSAgICB7Ci0gICAgICBpZiAoaXN1cHBlciAoKHVuc2lnbmVkIGNoYXIpICpuYW1lKSkKLQkqbmFtZSA9IHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqbmFtZSk7Ci0gICAgICBuYW1lKys7Ci0gICAgfQotICAqc2VhcmNoX2FyY2hfdGFpbF9wdHIgPSBuZXc7Ci0gIHNlYXJjaF9hcmNoX3RhaWxfcHRyID0gJm5ldy0+bmV4dDsKLQotfQotI2VuZGlmCi0KLS8qIFNldCB0aGUgb3V0cHV0IGFyY2hpdGVjdHVyZSAqLwotdm9pZAotbGRmaWxlX3NldF9vdXRwdXRfYXJjaCAoc3RyaW5nKQotICAgICBDT05TVCBjaGFyICpzdHJpbmc7Ci17Ci0gIGNvbnN0IGJmZF9hcmNoX2luZm9fdHlwZSAqYXJjaCA9IGJmZF9zY2FuX2FyY2goc3RyaW5nKTsKLQotICBpZiAoYXJjaCkgewotICAgIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYXJjaC0+YXJjaDsKLSAgICBsZGZpbGVfb3V0cHV0X21hY2hpbmUgPSBhcmNoLT5tYWNoOwotICAgIGxkZmlsZV9vdXRwdXRfbWFjaGluZV9uYW1lID0gYXJjaC0+cHJpbnRhYmxlX25hbWU7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgZWluZm8oXygiJVAlRjogY2Fubm90IHJlcHJlc2VudCBtYWNoaW5lIGAlcydcbiIpLCBzdHJpbmcpOwotICB9Ci19CmRpZmYgLS1naXQgYS9sZC9sZGZpbGUuaCBiL2xkL2xkZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNjOWNlLi4wMDAwMDAwCi0tLSBhL2xkL2xkZmlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyogbGRmaWxlLmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmxkZmlsZV9pbnB1dF9maWxlbmFtZTsKLWV4dGVybiBib29sZWFuIGxkZmlsZV9hc3N1bWVkX3NjcmlwdDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGxkZmlsZV9vdXRwdXRfbWFjaGluZTsKLWV4dGVybiBlbnVtIGJmZF9hcmNoaXRlY3R1cmUgbGRmaWxlX291dHB1dF9hcmNoaXRlY3R1cmU7Ci1leHRlcm4gY29uc3QgY2hhciAqbGRmaWxlX291dHB1dF9tYWNoaW5lX25hbWU7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvcgotICAgbGlicmFyaWVzLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgc2VhcmNoX2RpcnMgCi17Ci0gIC8qIE5leHQgZGlyZWN0b3J5IG9uIGxpc3QuICAqLwotICBzdHJ1Y3Qgc2VhcmNoX2RpcnMgKm5leHQ7Ci0gIC8qIE5hbWUgb2YgZGlyZWN0b3J5LiAgKi8KLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgLyogdHJ1ZSBpZiB0aGlzIGlzIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gICovCi0gIGJvb2xlYW4gY21kbGluZTsKLX0gc2VhcmNoX2RpcnNfdHlwZTsKLQotZXh0ZXJuIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaF9oZWFkOwotCi0jaWYgQU5TSV9QUk9UT1RZUEVTCi1zdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0OwotI2VuZGlmCi0KLWV4dGVybiB2b2lkIGxkZmlsZV9hZGRfYXJjaCBQQVJBTVMgKChDT05TVCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkZmlsZV9hZGRfbGlicmFyeV9wYXRoIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgYm9vbGVhbiBjbWRsaW5lKSk7Ci1leHRlcm4gdm9pZCBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbGRmaWxlX29wZW5fZmlsZSBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBib29sZWFuIGxkZmlsZV90cnlfb3Blbl9iZmQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfc3RydWN0ICopKTsKLWV4dGVybiBGSUxFICpsZGZpbGVfZmluZF9jb21tYW5kX2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZXh0ZW5kKSk7Ci1leHRlcm4gdm9pZCBsZGZpbGVfc2V0X291dHB1dF9hcmNoIFBBUkFNUyAoKENPTlNUIGNoYXIgKikpOwpkaWZmIC0tZ2l0IGEvbGQvbGRncmFtLnkgYi9sZC9sZGdyYW0ueQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyYjlmYi4uMDAwMDAwMAotLS0gYS9sZC9sZGdyYW0ueQorKysgL2Rldi9udWxsCkBAIC0xLDExMDMgKzAsMCBAQAotLyogQSBZQUNDIGdyYW1tZXIgdG8gcGFyc2UgYSBzdXBlcnNldCBvZiB0aGUgQVQmVCBsaW5rZXIgc2NyaXB0aW5nIGxhbmd1YXVlLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIG9mIEN5Z251cyBTdXBwb3J0IChzdGV2ZUBjeWdudXMuY29tKS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGxkLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0lewotLyoKLQotICovCi0KLSNkZWZpbmUgRE9OVERFQ0xBUkVfTUFMTE9DCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGQuaCIgICAgCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZHZlci5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkZW11bC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgIm1yaS5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkbGV4LmgiCi0KLSNpZm5kZWYgWVlERUJVRwotI2RlZmluZSBZWURFQlVHIDEKLSNlbmRpZgotCi1zdGF0aWMgZW51bSBzZWN0aW9uX3R5cGUgc2VjdHlwZTsKLQotbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnJlZ2lvbjsKLQotc3RydWN0IHdpbGRjYXJkX3NwZWMgY3VycmVudF9maWxlOwotYm9vbGVhbiBsZGdyYW1fd2FudF9maWxlbmFtZSA9IHRydWU7Ci1ib29sZWFuIGhhZF9zY3JpcHQgPSBmYWxzZTsKLWJvb2xlYW4gZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0KLWJvb2xlYW4gbGRncmFtX2luX3NjcmlwdCA9IGZhbHNlOwotYm9vbGVhbiBsZGdyYW1faGFkX2VxdWFscyA9IGZhbHNlOwotYm9vbGVhbiBsZGdyYW1faGFkX2tlZXAgPSBmYWxzZTsKLWNoYXIgKmxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyA9IE5VTEw7Ci0KLSNkZWZpbmUgRVJST1JfTkFNRV9NQVggMjAKLXN0YXRpYyBjaGFyICplcnJvcl9uYW1lc1tFUlJPUl9OQU1FX01BWF07Ci1zdGF0aWMgaW50IGVycm9yX2luZGV4OwotI2RlZmluZSBQVVNIX0VSUk9SKHgpIGlmIChlcnJvcl9pbmRleCA8IEVSUk9SX05BTUVfTUFYKSBlcnJvcl9uYW1lc1tlcnJvcl9pbmRleF0gPSB4OyBlcnJvcl9pbmRleCsrOwotI2RlZmluZSBQT1BfRVJST1IoKSAgIGVycm9yX2luZGV4LS07Ci0lfQotJXVuaW9uIHsKLSAgYmZkX3ZtYSBpbnRlZ2VyOwotICBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICpjbmFtZTsKLSAgc3RydWN0IHdpbGRjYXJkX3NwZWMgd2lsZGNhcmQ7Ci0gIGludCB0b2tlbjsKLSAgdW5pb24gZXRyZWVfdW5pb24gKmV0cmVlOwotICBzdHJ1Y3QgcGhkcl9pbmZvCi0gICAgewotICAgICAgYm9vbGVhbiBmaWxlaGRyOwotICAgICAgYm9vbGVhbiBwaGRyczsKLSAgICAgIHVuaW9uIGV0cmVlX3VuaW9uICphdDsKLSAgICAgIHVuaW9uIGV0cmVlX3VuaW9uICpmbGFnczsKLSAgICB9IHBoZHI7Ci0gIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm5vY3Jvc3NyZWY7Ci0gIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqc2VjdGlvbl9waGRyOwotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmRlZmxpc3Q7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqdmVyc3ltczsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJzbm9kZTsKLX0KLQotJXR5cGUgPGV0cmVlPiBleHAgb3B0X2V4cF93aXRoX3R5cGUgbXVzdGJlX2V4cCBvcHRfYXQgcGhkcl90eXBlIHBoZHJfdmFsCi0ldHlwZSA8ZXRyZWU+IG9wdF9leHBfd2l0aG91dF90eXBlCi0ldHlwZSA8aW50ZWdlcj4gZmlsbF9vcHQKLSV0eXBlIDxuYW1lPiBtZW1zcGVjX29wdCBjYXNlc3ltbGlzdAotJXR5cGUgPGNuYW1lPiB3aWxkY2FyZF9uYW1lCi0ldHlwZSA8d2lsZGNhcmQ+IHdpbGRjYXJkX3NwZWMKLSV0b2tlbiA8aW50ZWdlcj4gSU5UICAKLSV0b2tlbiA8bmFtZT4gTkFNRSBMTkFNRQotJXR5cGUgPGludGVnZXI+IGxlbmd0aAotJXR5cGUgPHBoZHI+IHBoZHJfcXVhbGlmaWVycwotJXR5cGUgPG5vY3Jvc3NyZWY+IG5vY3Jvc3NyZWZfbGlzdAotJXR5cGUgPHNlY3Rpb25fcGhkcj4gcGhkcl9vcHQKLSV0eXBlIDxpbnRlZ2VyPiBvcHRfbm9jcm9zc3JlZnMKLQotJXJpZ2h0IDx0b2tlbj4gUExVU0VRIE1JTlVTRVEgTVVMVEVRIERJVkVRICAnPScgTFNISUZURVEgUlNISUZURVEgICBBTkRFUSBPUkVRIAotJXJpZ2h0IDx0b2tlbj4gJz8nICc6JwotJWxlZnQgPHRva2VuPiBPUk9SCi0lbGVmdCA8dG9rZW4+ICBBTkRBTkQKLSVsZWZ0IDx0b2tlbj4gJ3wnCi0lbGVmdCA8dG9rZW4+ICAnXicKLSVsZWZ0ICA8dG9rZW4+ICcmJwotJWxlZnQgPHRva2VuPiAgRVEgTkUKLSVsZWZ0ICA8dG9rZW4+ICc8JyAnPicgTEUgR0UKLSVsZWZ0ICA8dG9rZW4+IExTSElGVCBSU0hJRlQKLQotJWxlZnQgIDx0b2tlbj4gJysnICctJwotJWxlZnQgIDx0b2tlbj4gJyonICcvJyAnJScKLQotJXJpZ2h0IFVOQVJZCi0ldG9rZW4gRU5EIAotJWxlZnQgPHRva2VuPiAnKCcKLSV0b2tlbiA8dG9rZW4+IEFMSUdOX0sgQkxPQ0sgQklORCBRVUFEIFNRVUFEIExPTkcgU0hPUlQgQllURQotJXRva2VuIFNFQ1RJT05TIFBIRFJTIFNPUlQKLSV0b2tlbiAneycgJ30nCi0ldG9rZW4gU0laRU9GX0hFQURFUlMgT1VUUFVUX0ZPUk1BVCBGT1JDRV9DT01NT05fQUxMT0NBVElPTiBPVVRQVVRfQVJDSAotJXRva2VuIFNJWkVPRl9IRUFERVJTCi0ldG9rZW4gSU5DTFVERQotJXRva2VuIE1FTU9SWSBERUZTWU1FTkQKLSV0b2tlbiBOT0xPQUQgRFNFQ1QgQ09QWSBJTkZPIE9WRVJMQVkKLSV0b2tlbiBOQU1FIExOQU1FIERFRklORUQgVEFSR0VUX0sgU0VBUkNIX0RJUiBNQVAgRU5UUlkKLSV0b2tlbiA8aW50ZWdlcj4gTkVYVAotJXRva2VuIFNJWkVPRiBBRERSIExPQURBRERSIE1BWF9LIE1JTl9LCi0ldG9rZW4gU1RBUlRVUCBITEwgU1lTTElCIEZMT0FUIE5PRkxPQVQgTk9DUk9TU1JFRlMKLSV0b2tlbiBPUklHSU4gRklMTAotJXRva2VuIExFTkdUSCBDUkVBVEVfT0JKRUNUX1NZTUJPTFMgSU5QVVQgR1JPVVAgT1VUUFVUIENPTlNUUlVDVE9SUwotJXRva2VuIEFMSUdOTU9EIEFUIFBST1ZJREUKLSV0eXBlIDx0b2tlbj4gYXNzaWduX29wIGF0eXBlIGF0dHJpYnV0ZXNfb3B0Ci0ldHlwZSA8bmFtZT4gIGZpbGVuYW1lCi0ldG9rZW4gQ0hJUCBMSVNUIFNFQ1QgQUJTT0xVVEUgIExPQUQgTkVXTElORSBFTkRXT1JEIE9SREVSIE5BTUVXT1JEIEFTU0VSVF9LCi0ldG9rZW4gRk9STUFUIFBVQkxJQyBERUZTWU1FTkQgQkFTRSBBTElBUyBUUlVOQ0FURSBSRUwKLSV0b2tlbiBJTlBVVF9TQ1JJUFQgSU5QVVRfTVJJX1NDUklQVCBJTlBVVF9ERUZTWU0gQ0FTRSBFWFRFUk4gU1RBUlQKLSV0b2tlbiA8bmFtZT4gVkVSU19UQUcgVkVSU19JREVOVElGSUVSCi0ldG9rZW4gR0xPQkFMIExPQ0FMIFZFUlNJT05LIElOUFVUX1ZFUlNJT05fU0NSSVBUCi0ldG9rZW4gS0VFUAotJXRva2VuIEVYQ0xVREVfRklMRQotJXR5cGUgPHZlcnN5bXM+IHZlcnNfZGVmbnMKLSV0eXBlIDx2ZXJzbm9kZT4gdmVyc190YWcKLSV0eXBlIDxkZWZsaXN0PiB2ZXJkZXAKLQotJSUKLQotZmlsZToJCi0JCUlOUFVUX1NDUklQVCBzY3JpcHRfZmlsZQotCXwJSU5QVVRfTVJJX1NDUklQVCBtcmlfc2NyaXB0X2ZpbGUKLQl8CUlOUFVUX1ZFUlNJT05fU0NSSVBUIHZlcnNpb25fc2NyaXB0X2ZpbGUKLQl8CUlOUFVUX0RFRlNZTSBkZWZzeW1fZXhwcgotCTsKLQotCi1maWxlbmFtZTogIE5BTUU7Ci0KLQotZGVmc3ltX2V4cHI6Ci0JCXsgbGRsZXhfZGVmc3ltKCk7IH0KLQkJTkFNRSAnPScgZXhwCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSgpOwotCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQoZXhwX2Fzc29wKCQzLCQyLCQ0KSk7Ci0JCX0KLQotLyogU1lOVEFYIFdJVEhJTiBBTiBNUkkgU0NSSVBUIEZJTEUgKi8gIAotbXJpX3NjcmlwdF9maWxlOgotCQl7Ci0JCSAgbGRsZXhfbXJpX3NjcmlwdCAoKTsKLQkJICBQVVNIX0VSUk9SIChfKCJNUkkgc3R5bGUgc2NyaXB0IikpOwotCQl9Ci0JICAgICBtcmlfc2NyaXB0X2xpbmVzCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBtcmlfZHJhd190cmVlICgpOwotCQkgIFBPUF9FUlJPUiAoKTsKLQkJfQotCTsKLQotbXJpX3NjcmlwdF9saW5lczoKLQkJbXJpX3NjcmlwdF9saW5lcyBtcmlfc2NyaXB0X2NvbW1hbmQgTkVXTElORQotICAgICAgICAgIHwKLQk7Ci0KLW1yaV9zY3JpcHRfY29tbWFuZDoKLQkJQ0hJUCAgZXhwIAotCXwJQ0hJUCAgZXhwICcsJyBleHAKLQl8CU5BTUUgCXsKLQkJCWVpbmZvKF8oIiVQJUY6IHVucmVjb2duaXNlZCBrZXl3b3JkIGluIE1SSSBzdHlsZSBzY3JpcHQgJyVzJ1xuIiksJDEpOwotCQkJfQotCXwJTElTVCAgCXsKLQkJCWNvbmZpZy5tYXBfZmlsZW5hbWUgPSAiLSI7Ci0JCQl9Ci0gICAgICAgIHwgICAgICAgT1JERVIgb3JkZXJuYW1lbGlzdAotCXwgICAgICAgRU5EV09SRCAKLSAgICAgICAgfCAgICAgICBQVUJMSUMgTkFNRSAnPScgZXhwCi0gCQkJeyBtcmlfcHVibGljKCQyLCAkNCk7IH0KLSAgICAgICAgfCAgICAgICBQVUJMSUMgTkFNRSAnLCcgZXhwCi0gCQkJeyBtcmlfcHVibGljKCQyLCAkNCk7IH0KLSAgICAgICAgfCAgICAgICBQVUJMSUMgTkFNRSAgZXhwIAotIAkJCXsgbXJpX3B1YmxpYygkMiwgJDMpOyB9Ci0JfCAJRk9STUFUIE5BTUUKLQkJCXsgbXJpX2Zvcm1hdCgkMik7IH0KLQl8CVNFQ1QgTkFNRSAnLCcgZXhwCi0JCQl7IG1yaV9vdXRwdXRfc2VjdGlvbigkMiwgJDQpO30KLQl8CVNFQ1QgTkFNRSAgZXhwCi0JCQl7IG1yaV9vdXRwdXRfc2VjdGlvbigkMiwgJDMpO30KLQl8CVNFQ1QgTkFNRSAnPScgZXhwCi0JCQl7IG1yaV9vdXRwdXRfc2VjdGlvbigkMiwgJDQpO30KLQl8CUFMSUdOX0sgTkFNRSAnPScgZXhwCi0JCQl7IG1yaV9hbGlnbigkMiwkNCk7IH0KLQl8CUFMSUdOX0sgTkFNRSAnLCcgZXhwCi0JCQl7IG1yaV9hbGlnbigkMiwkNCk7IH0KLQl8CUFMSUdOTU9EIE5BTUUgJz0nIGV4cAotCQkJeyBtcmlfYWxpZ25tb2QoJDIsJDQpOyB9Ci0JfAlBTElHTk1PRCBOQU1FICcsJyBleHAKLQkJCXsgbXJpX2FsaWdubW9kKCQyLCQ0KTsgfQotCXwJQUJTT0xVVEUgbXJpX2Fic19uYW1lX2xpc3QKLQl8CUxPQUQJIG1yaV9sb2FkX25hbWVfbGlzdAotCXwgICAgICAgTkFNRVdPUkQgTkFNRSAKLQkJCXsgbXJpX25hbWUoJDIpOyB9ICAgCi0JfAlBTElBUyBOQU1FICcsJyBOQU1FCi0JCQl7IG1yaV9hbGlhcygkMiwkNCwwKTt9Ci0JfAlBTElBUyBOQU1FICcsJyBJTlQKLQkJCXsgbXJpX2FsaWFzKCQyLDAsKGludCkgJDQpO30KLQl8CUJBU0UgICAgIGV4cAotCQkJeyBtcmlfYmFzZSgkMik7IH0KLSAgICAgICAgfCAgICAgICBUUlVOQ0FURSBJTlQKLQkJeyAgbXJpX3RydW5jYXRlKCh1bnNpZ25lZCBpbnQpICQyKTsgfQotCXwJQ0FTRSBjYXNlc3ltbGlzdAotCXwJRVhURVJOIGV4dGVybl9uYW1lX2xpc3QKLQl8CUlOQ0xVREUgZmlsZW5hbWUKLQkJeyBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKCQyKTsgfSBtcmlfc2NyaXB0X2xpbmVzIEVORAotCXwJU1RBUlQgTkFNRQotCQl7IGxhbmdfYWRkX2VudHJ5ICgkMiwgZmFsc2UpOyB9Ci0gICAgICAgIHwKLQk7Ci0KLW9yZGVybmFtZWxpc3Q6Ci0JICAgICAgb3JkZXJuYW1lbGlzdCAnLCcgTkFNRSAgICAgICAgIHsgbXJpX29yZGVyKCQzKTsgfQotCXwgICAgIG9yZGVybmFtZWxpc3QgIE5BTUUgICAgICAgICB7IG1yaV9vcmRlcigkMik7IH0KLSAgICAgIAl8Ci0JOwotCi1tcmlfbG9hZF9uYW1lX2xpc3Q6Ci0JCU5BTUUKLQkJCXsgbXJpX2xvYWQoJDEpOyB9Ci0JfAltcmlfbG9hZF9uYW1lX2xpc3QgJywnIE5BTUUgeyBtcmlfbG9hZCgkMyk7IH0KLQk7Ci0KLW1yaV9hYnNfbmFtZV9saXN0OgotIAkJTkFNRQotIAkJCXsgbXJpX29ubHlfbG9hZCgkMSk7IH0KLQl8CW1yaV9hYnNfbmFtZV9saXN0ICcsJyAgTkFNRQotIAkJCXsgbXJpX29ubHlfbG9hZCgkMyk7IH0KLQk7Ci0KLWNhc2VzeW1saXN0OgotCSAgLyogZW1wdHkgKi8geyAkJCA9IE5VTEw7IH0KLQl8IE5BTUUKLQl8IGNhc2VzeW1saXN0ICcsJyBOQU1FCi0JOwotCi1leHRlcm5fbmFtZV9saXN0OgotCSAgTkFNRQotCQkJeyBsZGxhbmdfYWRkX3VuZGVmICgkMSk7IH0KLQl8IGV4dGVybl9uYW1lX2xpc3QgTkFNRQotCQkJeyBsZGxhbmdfYWRkX3VuZGVmICgkMik7IH0KLQl8IGV4dGVybl9uYW1lX2xpc3QgJywnIE5BTUUKLQkJCXsgbGRsYW5nX2FkZF91bmRlZiAoJDMpOyB9Ci0JOwotCi1zY3JpcHRfZmlsZToKLQl7Ci0JIGxkbGV4X2JvdGgoKTsKLQl9Ci0gICAgICAgaWZpbGVfbGlzdAotCXsKLQlsZGxleF9wb3BzdGF0ZSgpOwotCX0KLSAgICAgICAgOwotCi0KLWlmaWxlX2xpc3Q6Ci0gICAgICAgaWZpbGVfbGlzdCBpZmlsZV9wMQotICAgICAgICB8Ci0JOwotCi0KLQotaWZpbGVfcDE6Ci0JCW1lbW9yeQotCXwJc2VjdGlvbnMKLQl8CXBoZHJzCi0JfAlzdGFydHVwCi0JfAloaWdoX2xldmVsX2xpYnJhcnkKLQl8CWxvd19sZXZlbF9saWJyYXJ5Ci0JfAlmbG9hdGluZ19wb2ludF9zdXBwb3J0Ci0JfAlzdGF0ZW1lbnRfYW55d2hlcmUKLQl8CXZlcnNpb24KLSAgICAgICAgfAkgJzsnCi0JfAlUQVJHRVRfSyAnKCcgTkFNRSAnKScKLQkJeyBsYW5nX2FkZF90YXJnZXQoJDMpOyB9Ci0JfAlTRUFSQ0hfRElSICcoJyBmaWxlbmFtZSAnKScKLQkJeyBsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoJDMsIGZhbHNlKTsgfQotCXwJT1VUUFVUICcoJyBmaWxlbmFtZSAnKScKLQkJeyBsYW5nX2FkZF9vdXRwdXQoJDMsIDEpOyB9Ci0gICAgICAgIHwJT1VUUFVUX0ZPUk1BVCAnKCcgTkFNRSAnKScKLQkJICB7IGxhbmdfYWRkX291dHB1dF9mb3JtYXQgKCQzLCAoY2hhciAqKSBOVUxMLAotCQkJCQkgICAgKGNoYXIgKikgTlVMTCwgMSk7IH0KLQl8CU9VVFBVVF9GT1JNQVQgJygnIE5BTUUgJywnIE5BTUUgJywnIE5BTUUgJyknCi0JCSAgeyBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0ICgkMywgJDUsICQ3LCAxKTsgfQotICAgICAgICB8CU9VVFBVVF9BUkNIICcoJyBOQU1FICcpJwotCQkgIHsgbGRmaWxlX3NldF9vdXRwdXRfYXJjaCgkMyk7IH0KLQl8CUZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OCi0JCXsgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uID0gdHJ1ZSA7IH0KLQl8CUlOUFVUICcoJyBpbnB1dF9saXN0ICcpJwotCXwJR1JPVVAKLQkJICB7IGxhbmdfZW50ZXJfZ3JvdXAgKCk7IH0KLQkJICAgICcoJyBpbnB1dF9saXN0ICcpJwotCQkgIHsgbGFuZ19sZWF2ZV9ncm91cCAoKTsgfQotICAgICAJfAlNQVAgJygnIGZpbGVuYW1lICcpJwotCQl7IGxhbmdfYWRkX21hcCgkMyk7IH0KLQl8CUlOQ0xVREUgZmlsZW5hbWUgCi0JCXsgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlKCQyKTsgfSBpZmlsZV9saXN0IEVORAotCXwJTk9DUk9TU1JFRlMgJygnIG5vY3Jvc3NyZWZfbGlzdCAnKScKLQkJewotCQkgIGxhbmdfYWRkX25vY3Jvc3NyZWYgKCQzKTsKLQkJfQotCXwJRVhURVJOICcoJyBleHRlcm5fbmFtZV9saXN0ICcpJwotCTsKLQotaW5wdXRfbGlzdDoKLQkJTkFNRQotCQl7IGxhbmdfYWRkX2lucHV0X2ZpbGUoJDEsbGFuZ19pbnB1dF9maWxlX2lzX3NlYXJjaF9maWxlX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQl8CWlucHV0X2xpc3QgJywnIE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQzLGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlpbnB1dF9saXN0IE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQyLGxhbmdfaW5wdXRfZmlsZV9pc19zZWFyY2hfZmlsZV9lbnVtLAotCQkJCSAoY2hhciAqKU5VTEwpOyB9Ci0JfAlMTkFNRQotCQl7IGxhbmdfYWRkX2lucHV0X2ZpbGUoJDEsbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLQkJCQkgKGNoYXIgKilOVUxMKTsgfQotCXwJaW5wdXRfbGlzdCAnLCcgTE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQzLGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQl8CWlucHV0X2xpc3QgTE5BTUUKLQkJeyBsYW5nX2FkZF9pbnB1dF9maWxlKCQyLGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCi0JCQkJIChjaGFyICopTlVMTCk7IH0KLQk7Ci0KLXNlY3Rpb25zOgotCQlTRUNUSU9OUyAneycgc2VjX29yX2dyb3VwX3AxICd9JwotCTsKLQotc2VjX29yX2dyb3VwX3AxOgotCQlzZWNfb3JfZ3JvdXBfcDEgc2VjdGlvbgotCXwJc2VjX29yX2dyb3VwX3AxIHN0YXRlbWVudF9hbnl3aGVyZQotCXwKLQk7Ci0KLXN0YXRlbWVudF9hbnl3aGVyZToKLQkJRU5UUlkgJygnIE5BTUUgJyknCi0JCXsgbGFuZ19hZGRfZW50cnkgKCQzLCBmYWxzZSk7IH0KLQl8CWFzc2lnbm1lbnQgZW5kCi0JOwotCi0vKiBUaGUgJyonIGFuZCAnPycgY2FzZXMgYXJlIHRoZXJlIGJlY2F1c2UgdGhlIGxleGVyIHJldHVybnMgdGhlbSBhcwotICAgc2VwYXJhdGUgdG9rZW5zIHJhdGhlciB0aGFuIGFzIE5BTUUuICAqLwotd2lsZGNhcmRfbmFtZToKLQkJTkFNRQotCQkJewotCQkJICAkJCA9ICQxOwotCQkJfQotCXwJJyonCi0JCQl7Ci0JCQkgICQkID0gIioiOwotCQkJfQotCXwJJz8nCi0JCQl7Ci0JCQkgICQkID0gIj8iOwotCQkJfQotCTsKLQotd2lsZGNhcmRfc3BlYzoKLQkJd2lsZGNhcmRfbmFtZQotCQkJewotCQkJICAkJC5uYW1lID0gJDE7Ci0JCQkgICQkLnNvcnRlZCA9IGZhbHNlOwotCQkJICAkJC5leGNsdWRlX25hbWUgPSBOVUxMOwotCQkJfQotCXwgCUVYQ0xVREVfRklMRSAnKCcgd2lsZGNhcmRfbmFtZSAnKScgd2lsZGNhcmRfbmFtZQotCQkJewotCQkJICAkJC5uYW1lID0gJDU7Ci0JCQkgICQkLnNvcnRlZCA9IGZhbHNlOwotCQkJICAkJC5leGNsdWRlX25hbWUgPSAkMzsKLQkJCX0KLQl8CVNPUlQgJygnIHdpbGRjYXJkX25hbWUgJyknCi0JCQl7Ci0JCQkgICQkLm5hbWUgPSAkMzsKLQkJCSAgJCQuc29ydGVkID0gdHJ1ZTsKLQkJCSAgJCQuZXhjbHVkZV9uYW1lID0gTlVMTDsKLQkJCX0KLQl8CVNPUlQgJygnIEVYQ0xVREVfRklMRSAnKCcgd2lsZGNhcmRfbmFtZSAnKScgd2lsZGNhcmRfbmFtZSAnKScKLQkJCXsKLQkJCSAgJCQubmFtZSA9ICQ3OwotCQkJICAkJC5zb3J0ZWQgPSB0cnVlOwotCQkJICAkJC5leGNsdWRlX25hbWUgPSAkNTsKLQkJCX0KLQk7Ci0KLQotZmlsZV9OQU1FX2xpc3Q6Ci0JCXdpbGRjYXJkX3NwZWMKLQkJCXsKLQkJCSAgbGFuZ19hZGRfd2lsZCAoJDEubmFtZSwgJDEuc29ydGVkLAotCQkJCQkgY3VycmVudF9maWxlLm5hbWUsCi0JCQkJCSBjdXJyZW50X2ZpbGUuc29ydGVkLAotCQkJCQkgbGRncmFtX2hhZF9rZWVwLCAkMS5leGNsdWRlX25hbWUpOwotCQkJfQotCXwJZmlsZV9OQU1FX2xpc3Qgb3B0X2NvbW1hIHdpbGRjYXJkX3NwZWMKLQkJCXsKLQkJCSAgbGFuZ19hZGRfd2lsZCAoJDMubmFtZSwgJDMuc29ydGVkLAotCQkJCQkgY3VycmVudF9maWxlLm5hbWUsCi0JCQkJCSBjdXJyZW50X2ZpbGUuc29ydGVkLAotCQkJCQkgbGRncmFtX2hhZF9rZWVwLCAkMy5leGNsdWRlX25hbWUpOwotCQkJfQotCTsKLQotaW5wdXRfc2VjdGlvbl9zcGVjX25vX2tlZXA6Ci0JCU5BTUUKLQkJCXsKLQkJCSAgbGFuZ19hZGRfd2lsZCAoTlVMTCwgZmFsc2UsICQxLCBmYWxzZSwKLQkJCQkJIGxkZ3JhbV9oYWRfa2VlcCwgTlVMTCk7Ci0JCQl9Ci0gICAgICAgIHwJJ1snCi0JCQl7Ci0JCQkgIGN1cnJlbnRfZmlsZS5uYW1lID0gTlVMTDsKLQkJCSAgY3VycmVudF9maWxlLnNvcnRlZCA9IGZhbHNlOwotCQkJfQotCQlmaWxlX05BTUVfbGlzdCAnXScKLQl8CXdpbGRjYXJkX3NwZWMKLQkJCXsKLQkJCSAgY3VycmVudF9maWxlID0gJDE7Ci0JCQkgIC8qICcqJyBtYXRjaGVzIGFueSBmaWxlIG5hbWUuICAqLwotCQkJICBpZiAoc3RyY21wIChjdXJyZW50X2ZpbGUubmFtZSwgIioiKSA9PSAwKQotCQkJICAgIGN1cnJlbnRfZmlsZS5uYW1lID0gTlVMTDsKLQkJCX0KLQkJJygnIGZpbGVfTkFNRV9saXN0ICcpJwotCTsKLQotaW5wdXRfc2VjdGlvbl9zcGVjOgotCQlpbnB1dF9zZWN0aW9uX3NwZWNfbm9fa2VlcAotCXwJS0VFUCAnKCcKLQkJCXsgbGRncmFtX2hhZF9rZWVwID0gdHJ1ZTsgfQotCQlpbnB1dF9zZWN0aW9uX3NwZWNfbm9fa2VlcCAnKScKLQkJCXsgbGRncmFtX2hhZF9rZWVwID0gZmFsc2U7IH0KLQk7Ci0KLXN0YXRlbWVudDoKLQkgIAlhc3NpZ25tZW50IGVuZAotCXwJQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0JCXsKLSAJCWxhbmdfYWRkX2F0dHJpYnV0ZShsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtKTsgCi0JICAgICAgCX0KLSAgICAgICAgfAknOycKLSAgICAgICAgfAlDT05TVFJVQ1RPUlMKLQkJewotIAkJCi0JCSAgbGFuZ19hZGRfYXR0cmlidXRlKGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtKTsgCi0JCX0KLQl8IFNPUlQgJygnIENPTlNUUlVDVE9SUyAnKScKLQkJewotCQkgIGNvbnN0cnVjdG9yc19zb3J0ZWQgPSB0cnVlOwotCQkgIGxhbmdfYWRkX2F0dHJpYnV0ZSAobGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW0pOwotCQl9Ci0JfCBpbnB1dF9zZWN0aW9uX3NwZWMKLSAgICAgICAgfCBsZW5ndGggJygnIG11c3RiZV9leHAgJyknCi0gICAgICAgIAkgICAgICAgIHsKLQkJCWxhbmdfYWRkX2RhdGEoKGludCkgJDEsJDMpOwotCQkJfQotICAKLQl8IEZJTEwgJygnIG11c3RiZV9leHAgJyknCi0JCQl7Ci0JCQkgIGxhbmdfYWRkX2ZpbGwKLQkJCSAgICAoZXhwX2dldF92YWx1ZV9pbnQoJDMsCi0JCQkJCSAgICAgICAwLAotCQkJCQkgICAgICAgImZpbGwgdmFsdWUiLAotCQkJCQkgICAgICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKSk7Ci0JCQl9Ci0JOwotCi1zdGF0ZW1lbnRfbGlzdDoKLQkJc3RhdGVtZW50X2xpc3Qgc3RhdGVtZW50Ci0gIAl8ICAJc3RhdGVtZW50Ci0JOwotICAKLXN0YXRlbWVudF9saXN0X29wdDoKLQkJLyogZW1wdHkgKi8KLQl8CXN0YXRlbWVudF9saXN0Ci0JOwotCi1sZW5ndGg6Ci0JCVFVQUQKLQkJCXsgJCQgPSAkMTsgfQotCXwJU1FVQUQKLQkJCXsgJCQgPSAkMTsgfQotCXwJTE9ORwotCQkJeyAkJCA9ICQxOyB9Ci0JfCAJU0hPUlQKLQkJCXsgJCQgPSAkMTsgfQotCXwJQllURQotCQkJeyAkJCA9ICQxOyB9Ci0JOwotCi1maWxsX29wdDoKLSAgICAgICAgICAnPScgbXVzdGJlX2V4cAotCQl7Ci0JCSAgJCQgPQkgZXhwX2dldF92YWx1ZV9pbnQoJDIsCi0JCQkJCSAgIDAsCi0JCQkJCSAgICJmaWxsIHZhbHVlIiwKLQkJCQkJICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLQkJfQotCXwgCXsgJCQgPSAwOyB9Ci0JOwotCi0JCQotCi1hc3NpZ25fb3A6Ci0JCVBMVVNFUQotCQkJeyAkJCA9ICcrJzsgfQotCXwJTUlOVVNFUQotCQkJeyAkJCA9ICctJzsgfQotCXwgCU1VTFRFUQotCQkJeyAkJCA9ICcqJzsgfQotCXwgCURJVkVRCi0JCQl7ICQkID0gJy8nOyB9Ci0JfCAJTFNISUZURVEKLQkJCXsgJCQgPSBMU0hJRlQ7IH0KLQl8IAlSU0hJRlRFUQotCQkJeyAkJCA9IFJTSElGVDsgfQotCXwgCUFOREVRCi0JCQl7ICQkID0gJyYnOyB9Ci0JfCAJT1JFUQotCQkJeyAkJCA9ICd8JzsgfQotCi0JOwotCi1lbmQ6CSc7JyB8ICcsJwotCTsKLQotCi1hc3NpZ25tZW50OgotCQlOQU1FICc9JyBtdXN0YmVfZXhwCi0JCXsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCQyLCAkMSwgJDMpKTsKLQkJfQotCXwJTkFNRSBhc3NpZ25fb3AgbXVzdGJlX2V4cAotCQl7Ci0JCSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsICQxLAotCQkJCQkJICBleHBfYmlub3AgKCQyLAotCQkJCQkJCSAgICAgZXhwX25hbWVvcCAoTkFNRSwKLQkJCQkJCQkJCSAkMSksCi0JCQkJCQkJICAgICAkMykpKTsKLQkJfQotCXwJUFJPVklERSAnKCcgTkFNRSAnPScgbXVzdGJlX2V4cCAnKScKLQkJewotCQkgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9wcm92aWRlICgkMywgJDUpKTsKLQkJfQotCTsKLQotCi1vcHRfY29tbWE6Ci0JCScsJwl8CTsKLQotCi1tZW1vcnk6Ci0JCU1FTU9SWSAneycgbWVtb3J5X3NwZWMgbWVtb3J5X3NwZWNfbGlzdCAnfScKLQk7Ci0KLW1lbW9yeV9zcGVjX2xpc3Q6Ci0JCW1lbW9yeV9zcGVjX2xpc3QgbWVtb3J5X3NwZWMKLQl8CW1lbW9yeV9zcGVjX2xpc3QgJywnIG1lbW9yeV9zcGVjCi0JfAotCTsKLQotCi1tZW1vcnlfc3BlYzogCQlOQU1FCi0JCQl7IHJlZ2lvbiA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAoJDEpOyB9Ci0JCWF0dHJpYnV0ZXNfb3B0ICc6JwotCQlvcmlnaW5fc3BlYyBvcHRfY29tbWEgbGVuZ3RoX3NwZWMKLQotCTsgb3JpZ2luX3NwZWM6Ci0JT1JJR0lOICc9JyBtdXN0YmVfZXhwCi0JCXsgcmVnaW9uLT5jdXJyZW50ID0KLQkJIHJlZ2lvbi0+b3JpZ2luID0KLQkJIGV4cF9nZXRfdm1hKCQzLCAwTCwib3JpZ2luIiwgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLX0KLQk7Ci0KLWxlbmd0aF9zcGVjOgotICAgICAgICAgICAgIExFTkdUSCAnPScgbXVzdGJlX2V4cAotICAgICAgICAgICAgICAgeyByZWdpb24tPmxlbmd0aCA9IGV4cF9nZXRfdm1hKCQzLAotCQkJCQkgICAgICAgfigoYmZkX3ZtYSkwKSwKLQkJCQkJICAgICAgICJsZW5ndGgiLAotCQkJCQkgICAgICAgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLQkJfQotCTsKLQotYXR0cmlidXRlc19vcHQ6Ci0JCS8qIGVtcHR5ICovCi0JCSAgeyAvKiBkdW1teSBhY3Rpb24gdG8gYXZvaWQgYmlzb24gMS4yNSBlcnJvciBtZXNzYWdlICovIH0KLQl8CScoJyBhdHRyaWJ1dGVzX2xpc3QgJyknCi0JOwotCi1hdHRyaWJ1dGVzX2xpc3Q6Ci0JCWF0dHJpYnV0ZXNfc3RyaW5nCi0JfAlhdHRyaWJ1dGVzX2xpc3QgYXR0cmlidXRlc19zdHJpbmcKLQk7Ci0KLWF0dHJpYnV0ZXNfc3RyaW5nOgotCQlOQU1FCi0JCSAgeyBsYW5nX3NldF9mbGFncyAocmVnaW9uLCAkMSwgMCk7IH0KLQl8CSchJyBOQU1FCi0JCSAgeyBsYW5nX3NldF9mbGFncyAocmVnaW9uLCAkMiwgMSk7IH0KLQk7Ci0KLXN0YXJ0dXA6Ci0JU1RBUlRVUCAnKCcgZmlsZW5hbWUgJyknCi0JCXsgbGFuZ19zdGFydHVwKCQzKTsgfQotCTsKLQotaGlnaF9sZXZlbF9saWJyYXJ5OgotCQlITEwgJygnIGhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3QgJyknCi0JfAlITEwgJygnICcpJwotCQkJeyBsZGVtdWxfaGxsKChjaGFyICopTlVMTCk7IH0KLQk7Ci0KLWhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Q6Ci0JCWhpZ2hfbGV2ZWxfbGlicmFyeV9OQU1FX2xpc3Qgb3B0X2NvbW1hIGZpbGVuYW1lCi0JCQl7IGxkZW11bF9obGwoJDMpOyB9Ci0JfAlmaWxlbmFtZQotCQkJeyBsZGVtdWxfaGxsKCQxKTsgfQotCi0JOwotCi1sb3dfbGV2ZWxfbGlicmFyeToKLQlTWVNMSUIgJygnIGxvd19sZXZlbF9saWJyYXJ5X05BTUVfbGlzdCAnKScKLQk7IGxvd19sZXZlbF9saWJyYXJ5X05BTUVfbGlzdDoKLQkJbG93X2xldmVsX2xpYnJhcnlfTkFNRV9saXN0IG9wdF9jb21tYSBmaWxlbmFtZQotCQkJeyBsZGVtdWxfc3lzbGliKCQzKTsgfQotCXwKLQk7Ci0KLWZsb2F0aW5nX3BvaW50X3N1cHBvcnQ6Ci0JCUZMT0FUCi0JCQl7IGxhbmdfZmxvYXQodHJ1ZSk7IH0KLQl8CU5PRkxPQVQKLQkJCXsgbGFuZ19mbG9hdChmYWxzZSk7IH0KLQk7Ci0JCQotbm9jcm9zc3JlZl9saXN0OgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgJCQgPSBOVUxMOwotCQl9Ci0JfAlOQU1FIG5vY3Jvc3NyZWZfbGlzdAotCQl7Ci0JCSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbjsKLQotCQkgIG4gPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotCQkgIG4tPm5hbWUgPSAkMTsKLQkJICBuLT5uZXh0ID0gJDI7Ci0JCSAgJCQgPSBuOwotCQl9Ci0JfAlOQU1FICcsJyBub2Nyb3NzcmVmX2xpc3QKLQkJewotCQkgIHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKm47Ci0KLQkJICBuID0gKHN0cnVjdCBsYW5nX25vY3Jvc3NyZWYgKikgeG1hbGxvYyAoc2l6ZW9mICpuKTsKLQkJICBuLT5uYW1lID0gJDE7Ci0JCSAgbi0+bmV4dCA9ICQzOwotCQkgICQkID0gbjsKLQkJfQotCTsKLQotbXVzdGJlX2V4cDoJCSB7IGxkbGV4X2V4cHJlc3Npb24oKTsgfQotCQlleHAKLQkJCSB7IGxkbGV4X3BvcHN0YXRlKCk7ICQkPSQyO30KLQk7Ci0KLWV4cAk6Ci0JCSctJyBleHAgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSBleHBfdW5vcCgnLScsICQyKTsgfQotCXwJJygnIGV4cCAnKScKLQkJCXsgJCQgPSAkMjsgfQotCXwJTkVYVCAnKCcgZXhwICcpJyAlcHJlYyBVTkFSWQotCQkJeyAkJCA9IGV4cF91bm9wKChpbnQpICQxLCQzKTsgfQotCXwJJyEnIGV4cCAlcHJlYyBVTkFSWQotCQkJeyAkJCA9IGV4cF91bm9wKCchJywgJDIpOyB9Ci0JfAknKycgZXhwICVwcmVjIFVOQVJZCi0JCQl7ICQkID0gJDI7IH0KLQl8CSd+JyBleHAgJXByZWMgVU5BUlkKLQkJCXsgJCQgPSBleHBfdW5vcCgnficsICQyKTt9Ci0KLQl8CWV4cCAnKicgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCcqJywgJDEsICQzKTsgfQotCXwJZXhwICcvJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJy8nLCAkMSwgJDMpOyB9Ci0JfAlleHAgJyUnIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcCgnJScsICQxLCAkMyk7IH0KLQl8CWV4cCAnKycgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKCcrJywgJDEsICQzKTsgfQotCXwJZXhwICctJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJy0nICwgJDEsICQzKTsgfQotCXwJZXhwIExTSElGVCBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoTFNISUZUICwgJDEsICQzKTsgfQotCXwJZXhwIFJTSElGVCBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoUlNISUZUICwgJDEsICQzKTsgfQotCXwJZXhwIEVRIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChFUSAsICQxLCAkMyk7IH0KLQl8CWV4cCBORSBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoTkUgLCAkMSwgJDMpOyB9Ci0JfAlleHAgTEUgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKExFICwgJDEsICQzKTsgfQotICAJfAlleHAgR0UgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKEdFICwgJDEsICQzKTsgfQotCXwJZXhwICc8JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJzwnICwgJDEsICQzKTsgfQotCXwJZXhwICc+JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJz4nICwgJDEsICQzKTsgfQotCXwJZXhwICcmJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJyYnICwgJDEsICQzKTsgfQotCXwJZXhwICdeJyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJ14nICwgJDEsICQzKTsgfQotCXwJZXhwICd8JyBleHAKLQkJCXsgJCQgPSBleHBfYmlub3AoJ3wnICwgJDEsICQzKTsgfQotCXwJZXhwICc/JyBleHAgJzonIGV4cAotCQkJeyAkJCA9IGV4cF90cmlub3AoJz8nICwgJDEsICQzLCAkNSk7IH0KLQl8CWV4cCBBTkRBTkQgZXhwCi0JCQl7ICQkID0gZXhwX2Jpbm9wKEFOREFORCAsICQxLCAkMyk7IH0KLQl8CWV4cCBPUk9SIGV4cAotCQkJeyAkJCA9IGV4cF9iaW5vcChPUk9SICwgJDEsICQzKTsgfQotCXwJREVGSU5FRCAnKCcgTkFNRSAnKScKLQkJCXsgJCQgPSBleHBfbmFtZW9wKERFRklORUQsICQzKTsgfQotCXwJSU5UCi0JCQl7ICQkID0gZXhwX2ludG9wKCQxKTsgfQotICAgICAgICB8CVNJWkVPRl9IRUFERVJTCi0JCQl7ICQkID0gZXhwX25hbWVvcChTSVpFT0ZfSEVBREVSUywwKTsgfQotCi0JfAlTSVpFT0YgJygnIE5BTUUgJyknCi0JCQl7ICQkID0gZXhwX25hbWVvcChTSVpFT0YsJDMpOyB9Ci0JfAlBRERSICcoJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoQUREUiwkMyk7IH0KLQl8CUxPQURBRERSICcoJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9uYW1lb3AoTE9BREFERFIsJDMpOyB9Ci0JfAlBQlNPTFVURSAnKCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF91bm9wKEFCU09MVVRFLCAkMyk7IH0KLQl8CUFMSUdOX0sgJygnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfdW5vcChBTElHTl9LLCQzKTsgfQotCXwJQkxPQ0sgJygnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfdW5vcChBTElHTl9LLCQzKTsgfQotCXwJTkFNRQotCQkJeyAkJCA9IGV4cF9uYW1lb3AoTkFNRSwkMSk7IH0KLQl8CU1BWF9LICcoJyBleHAgJywnIGV4cCAnKScKLQkJCXsgJCQgPSBleHBfYmlub3AgKE1BWF9LLCAkMywgJDUgKTsgfQotCXwJTUlOX0sgJygnIGV4cCAnLCcgZXhwICcpJwotCQkJeyAkJCA9IGV4cF9iaW5vcCAoTUlOX0ssICQzLCAkNSApOyB9Ci0JfAlBU1NFUlRfSyAnKCcgZXhwICcsJyBOQU1FICcpJwotCQkJeyAkJCA9IGV4cF9hc3NlcnQgKCQzLCAkNSk7IH0KLQk7Ci0KLQotb3B0X2F0OgotCQlBVCAnKCcgZXhwICcpJyB7ICQkID0gJDM7IH0KLQl8CXsgJCQgPSAwOyB9Ci0JOwotCi1zZWN0aW9uOglOQU1FIAkJeyBsZGxleF9leHByZXNzaW9uKCk7IH0KLQkJb3B0X2V4cF93aXRoX3R5cGUgCi0JCW9wdF9hdCAgIAl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9zY3JpcHQgKCk7IH0KLQkJJ3snCi0JCQl7Ci0JCQkgIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KCQxLCAkMywKLQkJCQkJCQkgICAgICBzZWN0eXBlLAotCQkJCQkJCSAgICAgIDAsIDAsIDAsICQ0KTsKLQkJCX0KLQkJc3RhdGVtZW50X2xpc3Rfb3B0IAkKLSAJCSd9JyB7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCW1lbXNwZWNfb3B0IHBoZHJfb3B0IGZpbGxfb3B0Ci0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoJDEzLCAkMTEsICQxMik7Ci0JCX0KLQkJb3B0X2NvbW1hCi0JfAlPVkVSTEFZCi0JCQl7IGxkbGV4X2V4cHJlc3Npb24gKCk7IH0KLQkJb3B0X2V4cF93aXRob3V0X3R5cGUgb3B0X25vY3Jvc3NyZWZzIG9wdF9hdAotCQkJeyBsZGxleF9wb3BzdGF0ZSAoKTsgbGRsZXhfc2NyaXB0ICgpOyB9Ci0JCSd7JyAKLQkJCXsKLQkJCSAgbGFuZ19lbnRlcl9vdmVybGF5ICgkMywgJDUsIChpbnQpICQ0KTsKLQkJCX0KLQkJb3ZlcmxheV9zZWN0aW9uCi0JCSd9JwotCQkJeyBsZGxleF9wb3BzdGF0ZSAoKTsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQltZW1zcGVjX29wdCBwaGRyX29wdCBmaWxsX29wdAotCQkJewotCQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJCSAgbGFuZ19sZWF2ZV9vdmVybGF5ICgkMTQsICQxMiwgJDEzKTsKLQkJCX0KLQkJb3B0X2NvbW1hCi0JfAkvKiBUaGUgR1JPVVAgY2FzZSBpcyBqdXN0IGVub3VnaCB0byBzdXBwb3J0IHRoZSBnY2MKLQkJICAgc3ZyMy5pZmlsZSBzY3JpcHQuICBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZnVsbAotCQkgICBzdXBwb3J0LiAgSSdtIG5vdCBldmVuIHN1cmUgd2hhdCBHUk9VUCBpcyBzdXBwb3NlZAotCQkgICB0byBtZWFuLiAgKi8KLQkJR1JPVVAgeyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCW9wdF9leHBfd2l0aF90eXBlCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgIi4iLCAkMykpOwotCQl9Ci0JCSd7JyBzZWNfb3JfZ3JvdXBfcDEgJ30nCi0JOwotCi10eXBlOgotCSAgIE5PTE9BRCAgeyBzZWN0eXBlID0gbm9sb2FkX3NlY3Rpb247IH0KLQl8ICBEU0VDVCAgIHsgc2VjdHlwZSA9IGRzZWN0X3NlY3Rpb247IH0KLQl8ICBDT1BZICAgIHsgc2VjdHlwZSA9IGNvcHlfc2VjdGlvbjsgfQotCXwgIElORk8gICAgeyBzZWN0eXBlID0gaW5mb19zZWN0aW9uOyB9Ci0JfCAgT1ZFUkxBWSB7IHNlY3R5cGUgPSBvdmVybGF5X3NlY3Rpb247IH0KLQk7Ci0KLWF0eXBlOgotCSAJJygnIHR5cGUgJyknCi0gIAl8IAkvKiBFTVBUWSAqLyB7IHNlY3R5cGUgPSBub3JtYWxfc2VjdGlvbjsgfQotICAJfCAJJygnICcpJyB7IHNlY3R5cGUgPSBub3JtYWxfc2VjdGlvbjsgfQotCTsKLQotb3B0X2V4cF93aXRoX3R5cGU6Ci0JCWV4cCBhdHlwZSAnOicJCXsgJCQgPSAkMTsgfQotCXwJYXR5cGUgJzonCQl7ICQkID0gKGV0cmVlX3R5cGUgKilOVUxMOyAgfQotCXwJLyogVGhlIEJJTkQgY2FzZXMgYXJlIHRvIHN1cHBvcnQgdGhlIGdjYyBzdnIzLmlmaWxlCi0JCSAgIHNjcmlwdC4gIFRoZXkgYXJlbid0IGludGVuZGVkIHRvIGltcGxlbWVudCBmdWxsCi0JCSAgIHN1cHBvcnQgZm9yIHRoZSBCSU5EIGtleXdvcmQuICBJJ20gbm90IGV2ZW4gc3VyZQotCQkgICB3aGF0IEJJTkQgaXMgc3VwcG9zZWQgdG8gbWVhbi4gICovCi0JCUJJTkQgJygnIGV4cCAnKScgYXR5cGUgJzonIHsgJCQgPSAkMzsgfQotCXwJQklORCAnKCcgZXhwICcpJyBCTE9DSyAnKCcgZXhwICcpJyBhdHlwZSAnOicKLQkJeyAkJCA9ICQzOyB9Ci0JOwotCi1vcHRfZXhwX3dpdGhvdXRfdHlwZToKLQkJZXhwICc6JwkJeyAkJCA9ICQxOyB9Ci0JfAknOicJCXsgJCQgPSAoZXRyZWVfdHlwZSAqKSBOVUxMOyAgfQotCTsKLQotb3B0X25vY3Jvc3NyZWZzOgotCQkvKiBlbXB0eSAqLwotCQkJeyAkJCA9IDA7IH0KLQl8CU5PQ1JPU1NSRUZTCi0JCQl7ICQkID0gMTsgfQotCTsKLQotbWVtc3BlY19vcHQ6Ci0JCSc+JyBOQU1FCi0JCXsgJCQgPSAkMjsgfQotCXwJeyAkJCA9ICIqZGVmYXVsdCoiOyB9Ci0JOwotCi1waGRyX29wdDoKLQkJLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gTlVMTDsKLQkJfQotCXwJcGhkcl9vcHQgJzonIE5BTUUKLQkJewotCQkgIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqbjsKLQotCQkgIG4gPSAoKHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKQotCQkgICAgICAgeG1hbGxvYyAoc2l6ZW9mICpuKSk7Ci0JCSAgbi0+bmFtZSA9ICQzOwotCQkgIG4tPnVzZWQgPSBmYWxzZTsKLQkJICBuLT5uZXh0ID0gJDE7Ci0JCSAgJCQgPSBuOwotCQl9Ci0JOwotCi1vdmVybGF5X3NlY3Rpb246Ci0JCS8qIGVtcHR5ICovCi0JfAlvdmVybGF5X3NlY3Rpb24KLQkJTkFNRQotCQkJewotCQkJICBsZGxleF9zY3JpcHQgKCk7Ci0JCQkgIGxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uICgkMik7Ci0JCQl9Ci0JCSd7JyBzdGF0ZW1lbnRfbGlzdF9vcHQgJ30nCi0JCQl7IGxkbGV4X3BvcHN0YXRlICgpOyBsZGxleF9leHByZXNzaW9uICgpOyB9Ci0JCXBoZHJfb3B0IGZpbGxfb3B0Ci0JCQl7Ci0JCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkJICBsYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiAoJDksICQ4KTsKLQkJCX0KLQkJb3B0X2NvbW1hCi0JOwotCi1waGRyczoKLQkJUEhEUlMgJ3snIHBoZHJfbGlzdCAnfScKLQk7Ci0KLXBoZHJfbGlzdDoKLQkJLyogZW1wdHkgKi8KLQl8CXBoZHJfbGlzdCBwaGRyCi0JOwotCi1waGRyOgotCQlOQU1FIHsgbGRsZXhfZXhwcmVzc2lvbiAoKTsgfQotCQkgIHBoZHJfdHlwZSBwaGRyX3F1YWxpZmllcnMgeyBsZGxleF9wb3BzdGF0ZSAoKTsgfQotCQkgICc7JwotCQl7Ci0JCSAgbGFuZ19uZXdfcGhkciAoJDEsICQzLCAkNC5maWxlaGRyLCAkNC5waGRycywgJDQuYXQsCi0JCQkJICQ0LmZsYWdzKTsKLQkJfQotCTsKLQotcGhkcl90eXBlOgotCQlleHAKLQkJewotCQkgICQkID0gJDE7Ci0KLQkJICBpZiAoJDEtPnR5cGUubm9kZV9jbGFzcyA9PSBldHJlZV9uYW1lCi0JCSAgICAgICYmICQxLT50eXBlLm5vZGVfY29kZSA9PSBOQU1FKQotCQkgICAgewotCQkgICAgICBjb25zdCBjaGFyICpzOwotCQkgICAgICB1bnNpZ25lZCBpbnQgaTsKLQkJICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaGRyX3R5cGVzW10gPQotCQkJewotCQkJICAiUFRfTlVMTCIsICJQVF9MT0FEIiwgIlBUX0RZTkFNSUMiLAotCQkJICAiUFRfSU5URVJQIiwgIlBUX05PVEUiLCAiUFRfU0hMSUIiLAotCQkJICAiUFRfUEhEUiIKLQkJCX07Ci0KLQkJICAgICAgcyA9ICQxLT5uYW1lLm5hbWU7Ci0JCSAgICAgIGZvciAoaSA9IDA7Ci0JCQkgICBpIDwgc2l6ZW9mIHBoZHJfdHlwZXMgLyBzaXplb2YgcGhkcl90eXBlc1swXTsKLQkJCSAgIGkrKykKLQkJCWlmIChzdHJjbXAgKHMsIHBoZHJfdHlwZXNbaV0pID09IDApCi0JCQkgIHsKLQkJCSAgICAkJCA9IGV4cF9pbnRvcCAoaSk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIH0KLQkJICAgIH0KLQkJfQotCTsKLQotcGhkcl9xdWFsaWZpZXJzOgotCQkvKiBlbXB0eSAqLwotCQl7Ci0JCSAgbWVtc2V0ICgmJCQsIDAsIHNpemVvZiAoc3RydWN0IHBoZHJfaW5mbykpOwotCQl9Ci0JfAlOQU1FIHBoZHJfdmFsIHBoZHJfcXVhbGlmaWVycwotCQl7Ci0JCSAgJCQgPSAkMzsKLQkJICBpZiAoc3RyY21wICgkMSwgIkZJTEVIRFIiKSA9PSAwICYmICQyID09IE5VTEwpCi0JCSAgICAkJC5maWxlaGRyID0gdHJ1ZTsKLQkJICBlbHNlIGlmIChzdHJjbXAgKCQxLCAiUEhEUlMiKSA9PSAwICYmICQyID09IE5VTEwpCi0JCSAgICAkJC5waGRycyA9IHRydWU7Ci0JCSAgZWxzZSBpZiAoc3RyY21wICgkMSwgIkZMQUdTIikgPT0gMCAmJiAkMiAhPSBOVUxMKQotCQkgICAgJCQuZmxhZ3MgPSAkMjsKLQkJICBlbHNlCi0JCSAgICBlaW5mbyAoXygiJVglUDolUzogUEhEUlMgc3ludGF4IGVycm9yIGF0IGAlcydcbiIpLCAkMSk7Ci0JCX0KLQl8CUFUICcoJyBleHAgJyknIHBoZHJfcXVhbGlmaWVycwotCQl7Ci0JCSAgJCQgPSAkNTsKLQkJICAkJC5hdCA9ICQzOwotCQl9Ci0JOwotCi1waGRyX3ZhbDoKLQkJLyogZW1wdHkgKi8KLQkJewotCQkgICQkID0gTlVMTDsKLQkJfQotCXwgJygnIGV4cCAnKScKLQkJewotCQkgICQkID0gJDI7Ci0JCX0KLQk7Ci0KLS8qIFRoaXMgc3ludGF4IGlzIHVzZWQgd2l0aGluIGFuIGV4dGVybmFsIHZlcnNpb24gc2NyaXB0IGZpbGUuICAqLwotCi12ZXJzaW9uX3NjcmlwdF9maWxlOgotCQl7Ci0JCSAgbGRsZXhfdmVyc2lvbl9maWxlICgpOwotCQkgIFBVU0hfRVJST1IgKF8oIlZFUlNJT04gc2NyaXB0IikpOwotCQl9Ci0JCXZlcnNfbm9kZXMKLQkJewotCQkgIGxkbGV4X3BvcHN0YXRlICgpOwotCQkgIFBPUF9FUlJPUiAoKTsKLQkJfQotCTsKLQotLyogVGhpcyBpcyB1c2VkIHdpdGhpbiBhIG5vcm1hbCBsaW5rZXIgc2NyaXB0IGZpbGUuICAqLwotCi12ZXJzaW9uOgotCQl7Ci0JCSAgbGRsZXhfdmVyc2lvbl9zY3JpcHQgKCk7Ci0JCX0KLQkJVkVSU0lPTksgJ3snIHZlcnNfbm9kZXMgJ30nCi0JCXsKLQkJICBsZGxleF9wb3BzdGF0ZSAoKTsKLQkJfQotCTsKLQotdmVyc19ub2RlczoKLQkJdmVyc19ub2RlCi0JfAl2ZXJzX25vZGVzIHZlcnNfbm9kZQotCTsKLQotdmVyc19ub2RlOgotCQlWRVJTX1RBRyAneycgdmVyc190YWcgJ30nICc7JwotCQl7Ci0JCSAgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKCQxLCAkMywgTlVMTCk7Ci0JCX0KLQl8CVZFUlNfVEFHICd7JyB2ZXJzX3RhZyAnfScgdmVyZGVwICc7JwotCQl7Ci0JCSAgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKCQxLCAkMywgJDUpOwotCQl9Ci0JOwotCi12ZXJkZXA6Ci0JCVZFUlNfVEFHCi0JCXsKLQkJICAkJCA9IGxhbmdfYWRkX3ZlcnNfZGVwZW5kIChOVUxMLCAkMSk7Ci0JCX0KLQl8CXZlcmRlcCBWRVJTX1RBRwotCQl7Ci0JCSAgJCQgPSBsYW5nX2FkZF92ZXJzX2RlcGVuZCAoJDEsICQyKTsKLQkJfQotCTsKLQotdmVyc190YWc6Ci0JCS8qIGVtcHR5ICovCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoTlVMTCwgTlVMTCk7Ci0JCX0KLQl8CXZlcnNfZGVmbnMgJzsnCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoJDEsIE5VTEwpOwotCQl9Ci0JfAlHTE9CQUwgJzonIHZlcnNfZGVmbnMgJzsnCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoJDMsIE5VTEwpOwotCQl9Ci0JfAlMT0NBTCAnOicgdmVyc19kZWZucyAnOycKLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19ub2RlIChOVUxMLCAkMyk7Ci0JCX0KLQl8CUdMT0JBTCAnOicgdmVyc19kZWZucyAnOycgTE9DQUwgJzonIHZlcnNfZGVmbnMgJzsnCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfbm9kZSAoJDMsICQ3KTsKLQkJfQotCTsKLQotdmVyc19kZWZuczoKLQkJVkVSU19JREVOVElGSUVSCi0JCXsKLQkJICAkJCA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKE5VTEwsICQxLCBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcpOwotCQl9Ci0JfAl2ZXJzX2RlZm5zICc7JyBWRVJTX0lERU5USUZJRVIKLQkJewotCQkgICQkID0gbGFuZ19uZXdfdmVyc19yZWdleCAoJDEsICQzLCBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcpOwotCQl9Ci0JfAlFWFRFUk4gTkFNRSAneycKLQkJCXsKLQkJCSAgJDxuYW1lPiQgPSBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmc7Ci0JCQkgIGxkZ3JhbV92ZXJzX2N1cnJlbnRfbGFuZyA9ICQyOwotCQkJfQotCQl2ZXJzX2RlZm5zICd9JwotCQkJewotCQkJICBsZGdyYW1fdmVyc19jdXJyZW50X2xhbmcgPSAkPG5hbWU+NDsKLQkJCX0KLQk7Ci0KLSUlCi12b2lkCi15eWVycm9yKGFyZykgCi0gICAgIGNvbnN0IGNoYXIgKmFyZzsKLXsgCi0gIGlmIChsZGZpbGVfYXNzdW1lZF9zY3JpcHQpCi0gICAgZWluZm8gKF8oIiVQOiVzOiBmaWxlIGZvcm1hdCBub3QgcmVjb2duaXplZDsgdHJlYXRpbmcgYXMgbGlua2VyIHNjcmlwdFxuIiksCi0JICAgbGRmaWxlX2lucHV0X2ZpbGVuYW1lKTsKLSAgaWYgKGVycm9yX2luZGV4ID4gMCAmJiBlcnJvcl9pbmRleCA8IEVSUk9SX05BTUVfTUFYKQotICAgICBlaW5mbyAoIiVQJUY6JVM6ICVzIGluICVzXG4iLCBhcmcsIGVycm9yX25hbWVzW2Vycm9yX2luZGV4LTFdKTsKLSAgZWxzZQotICAgICBlaW5mbyAoIiVQJUY6JVM6ICVzXG4iLCBhcmcpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRpbnQudGV4aW5mbyBiL2xkL2xkaW50LnRleGluZm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWE3ODguLjAwMDAwMDAKLS0tIGEvbGQvbGRpbnQudGV4aW5mbworKysgL2Rldi9udWxsCkBAIC0xLDU2NCArMCwwIEBACi1caW5wdXQgdGV4aW5mbwotQHNldGZpbGVuYW1lIGxkaW50LmluZm8KLQotQGlmaW5mbwotQGZvcm1hdAotU1RBUlQtSU5GTy1ESVItRU5UUlkKLSogTGQtSW50ZXJuYWxzOiAobGRpbnQpLglUaGUgR05VIGxpbmtlciBpbnRlcm5hbHMuCi1FTkQtSU5GTy1ESVItRU5UUlkKLUBlbmQgZm9ybWF0Ci1AZW5kIGlmaW5mbwotCi1AaWZpbmZvCi1UaGlzIGZpbGUgZG9jdW1lbnRzIHRoZSBpbnRlcm5hbHMgb2YgdGhlIEdOVSBsaW5rZXIgbGQuCi0KLUNvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotQ29udHJpYnV0ZWQgYnkgQ3lnbnVzIFN1cHBvcnQuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGlnbm9yZQotUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHByb2Nlc3MgdGhpcyBmaWxlIHRocm91Z2ggVGV4IGFuZCBwcmludCB0aGUKLXJlc3VsdHMsIHByb3ZpZGVkIHRoZSBwcmludGVkIGRvY3VtZW50IGNhcnJpZXMgY29weWluZyBwZXJtaXNzaW9uCi1ub3RpY2UgaWRlbnRpY2FsIHRvIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhlIHJlbW92YWwgb2YgdGhpcyBwYXJhZ3JhcGgKLSh0aGlzIHBhcmFncmFwaCBub3QgYmVpbmcgcmVsZXZhbnQgdG8gdGhlIHByaW50ZWQgbWFudWFsKS4KLQotQGVuZCBpZ25vcmUKLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBjb3B5IG9yIGRpc3RyaWJ1dGUgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhpcwotbWFudWFsIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIChmb3Igd2hpY2ggcHVycG9zZSB0aGlzIHRleHQgbWF5IGJlCi1yZWdhcmRlZCBhcyBhIHByb2dyYW0gaW4gdGhlIGxhbmd1YWdlIFRlWCkuCi1AZW5kIGlmaW5mbwotCi1AaWZ0ZXgKLUBmaW5hbG91dAotQHNldGNoYXB0ZXJuZXdwYWdlIG9mZgotQHNldHRpdGxlIEdOVSBMaW5rZXIgSW50ZXJuYWxzCi1AdGl0bGVwYWdlCi1AdGl0bGV7QSBndWlkZSB0byB0aGUgaW50ZXJuYWxzIG9mIHRoZSBHTlUgbGlua2VyfQotQGF1dGhvciBQZXIgQm90aG5lciwgU3RldmUgQ2hhbWJlcmxhaW4sIElhbiBMYW5jZSBUYXlsb3IsIERKIERlbG9yaWUKLUBhdXRob3IgQ3lnbnVzIFN1cHBvcnQKLUBwYWdlCi0KLUB0ZXgKLVxkZWZcJCMxJHt7IzF9fSAgJSBLbHVnZTogY29sbGVjdCBSQ1MgcmV2aXNpb24gaW5mbyB3aXRob3V0ICQuLi4kCi1ceGRlZlxtYW52ZXJze1wkUmV2aXNpb24kfSAgJSBGb3IgdXNlIGluIGhlYWRlcnMsIGZvb3RlcnMgdG9vCi17XHBhcnNraXA9MHB0Ci1caGZpbGwgQ3lnbnVzIFN1cHBvcnRccGFyCi1caGZpbGwgXG1hbnZlcnNccGFyCi1caGZpbGwgXFRlWHt9aW5mbyBcdGV4aW5mb3ZlcnNpb25ccGFyCi19Ci1AZW5kIHRleAotCi1AdnNraXAgMHB0IHBsdXMgMWZpbGxsCi1Db3B5cmlnaHQgQGNvcHlyaWdodHt9IDE5OTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBtYWtlIGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcyBvZgotdGhpcyBtYW51YWwgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKLWFyZSBwcmVzZXJ2ZWQgb24gYWxsIGNvcGllcy4KLQotQGVuZCB0aXRsZXBhZ2UKLUBlbmQgaWZ0ZXgKLQotQG5vZGUgVG9wCi1AdG9wCi0KLVRoaXMgZmlsZSBkb2N1bWVudHMgdGhlIGludGVybmFscyBvZiB0aGUgR05VIGxpbmtlciBAY29kZXtsZH0uICBJdCBpcyBhCi1jb2xsZWN0aW9uIG9mIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24gd2l0aCBsaXR0bGUgZm9ybSBhdCB0aGlzIHBvaW50LgotTW9zdGx5LCBpdCBpcyBhIHJlcG9zaXRvcnkgaW50byB3aGljaCB5b3UgY2FuIHB1dCBpbmZvcm1hdGlvbiBhYm91dAotR05VIEBjb2Rle2xkfSBhcyB5b3UgZGlzY292ZXIgaXQgKG9yIGFzIHlvdSBkZXNpZ24gY2hhbmdlcyB0byBAY29kZXtsZH0pLgotCi1AbWVudQotKiBSRUFETUU6OgkJCVRoZSBSRUFETUUgRmlsZQotKiBFbXVsYXRpb25zOjoJCQlIb3cgbGlua2VyIGVtdWxhdGlvbnMgYXJlIGdlbmVyYXRlZAotKiBFbXVsYXRpb24gV2Fsa3Rocm91Z2g6OglBIFdhbGt0aHJvdWdoIG9mIGEgVHlwaWNhbCBFbXVsYXRpb24KLUBlbmQgbWVudQotCi1Abm9kZSBSRUFETUUKLUBjaGFwdGVyIFRoZSBAZmlsZXtSRUFETUV9IEZpbGUKLQotQ2hlY2sgdGhlIEBmaWxle1JFQURNRX0gZmlsZTsgaXQgb2Z0ZW4gaGFzIHVzZWZ1bCBpbmZvcm1hdGlvbiB0aGF0IGRvZXMgbm90Ci1hcHBlYXIgYW55d2hlcmUgZWxzZSBpbiB0aGUgZGlyZWN0b3J5LgotCi1Abm9kZSBFbXVsYXRpb25zCi1AY2hhcHRlciBIb3cgbGlua2VyIGVtdWxhdGlvbnMgYXJlIGdlbmVyYXRlZAotCi1FYWNoIGxpbmtlciB0YXJnZXQgaGFzIGFuIEBkZm57ZW11bGF0aW9ufS4gIFRoZSBlbXVsYXRpb24gaW5jbHVkZXMgdGhlCi1kZWZhdWx0IGxpbmtlciBzY3JpcHQsIGFuZCBjZXJ0YWluIGVtdWxhdGlvbnMgYWxzbyBtb2RpZnkgY2VydGFpbiB0eXBlcwotb2YgbGlua2VyIGJlaGF2aW91ci4KLQotRW11bGF0aW9ucyBhcmUgY3JlYXRlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MgYnkgdGhlIHNoZWxsIHNjcmlwdAotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0uCi0KLVRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgc3RhcnRzIGJ5IHJlYWRpbmcgYSBmaWxlIGluIHRoZQotQGZpbGV7ZW11bHBhcmFtc30gZGlyZWN0b3J5LiAgVGhpcyBpcyBhIHNoZWxsIHNjcmlwdCB3aGljaCBzZXRzIHZhcmlvdXMKLXNoZWxsIHZhcmlhYmxlcyB1c2VkIGJ5IEBmaWxle2dlbnNjcmlwdHMuc2h9IGFuZCB0aGUgb3RoZXIgc2hlbGwgc2NyaXB0cwotaXQgaW52b2tlcy4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIGludm9rZSBhIHNoZWxsIHNjcmlwdCBpbiB0aGUKLUBmaWxle3NjcmlwdHRlbXBsfSBkaXJlY3RvcnkgaW4gb3JkZXIgdG8gY3JlYXRlIGRlZmF1bHQgbGlua2VyIHNjcmlwdHMKLXdyaXR0ZW4gaW4gdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLiAgVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQKLXdpbGwgYmUgaW52b2tlZCA1IChvciwgaW4gc29tZSBjYXNlcywgNikgdGltZXMsIHdpdGggZGlmZmVyZW50Ci1hc3NpZ25tZW50cyB0byBzaGVsbCB2YXJpYWJsZXMsIHRvIGNyZWF0ZSBkaWZmZXJlbnQgZGVmYXVsdCBzY3JpcHRzLgotVGhlIGNob2ljZSBvZiBzY3JpcHQgaXMgbWFkZSBiYXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCi0KLUFmdGVyIGNyZWF0aW5nIHRoZSBzY3JpcHRzLCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsIGludm9rZSB5ZXQgYW5vdGhlcgotc2hlbGwgc2NyaXB0LCB0aGlzIHRpbWUgaW4gdGhlIEBmaWxle2VtdWx0ZW1wbH0gZGlyZWN0b3J5LiAgVGhhdCBzaGVsbAotc2NyaXB0IHdpbGwgY3JlYXRlIHRoZSBlbXVsYXRpb24gc291cmNlIGZpbGUsIHdoaWNoIGNvbnRhaW5zIEMgY29kZS4KLVRoaXMgQyBjb2RlIHBlcm1pdHMgdGhlIGxpbmtlciBlbXVsYXRpb24gdG8gb3ZlcnJpZGUgdmFyaW91cyBsaW5rZXIKLWJlaGF2aW91cnMuICBNb3N0IHRhcmdldHMgdXNlIHRoZSBnZW5lcmljIGVtdWxhdGlvbiBjb2RlLCB3aGljaCBpcyBpbgotQGZpbGV7ZW11bHRlbXBsL2dlbmVyaWMuZW19LgotCi1UbyBzdW1tYXJpemUsIEBmaWxle2dlbnNjcmlwdHMuc2h9IHJlYWRzIHRocmVlIHNoZWxsIHNjcmlwdHM6IGFuCi1lbXVsYXRpb24gcGFyYW1ldGVycyBzY3JpcHQgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeSwgYSBsaW5rZXIKLXNjcmlwdCBnZW5lcmF0aW9uIHNjcmlwdCBpbiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IGRpcmVjdG9yeSwgYW5kIGFuCi1lbXVsYXRpb24gc291cmNlIGZpbGUgZ2VuZXJhdGlvbiBzY3JpcHQgaW4gdGhlIEBmaWxle2VtdWx0ZW1wbH0KLWRpcmVjdG9yeS4KLQotRm9yIGV4YW1wbGUsIHRoZSBTdW4gNCBsaW5rZXIgc2V0cyB1cCB2YXJpYWJsZXMgaW4KLUBmaWxle2VtdWxwYXJhbXMvc3VuNC5zaH0sIGNyZWF0ZXMgbGlua2VyIHNjcmlwdHMgdXNpbmcKLUBmaWxle3NjcmlwdHRlbXBsL2FvdXQuc2N9LCBhbmQgY3JlYXRlcyB0aGUgZW11bGF0aW9uIGNvZGUgdXNpbmcKLUBmaWxle2VtdWx0ZW1wbC9zdW5vcy5lbX0uCi0KLU5vdGUgdGhhdCB0aGUgbGlua2VyIGNhbiBzdXBwb3J0IHNldmVyYWwgZW11bGF0aW9ucyBzaW11bHRhbmVvdXNseSwKLWRlcGVuZGluZyB1cG9uIGhvdyBpdCBpcyBjb25maWd1cmVkLiAgQW4gZW11bGF0aW9uIGNhbiBiZSBzZWxlY3RlZCB3aXRoCi10aGUgQGNvZGV7LW19IG9wdGlvbi4gIFRoZSBAY29kZXstVn0gb3B0aW9uIHdpbGwgbGlzdCBhbGwgc3VwcG9ydGVkCi1lbXVsYXRpb25zLgotCi1AbWVudQotKiBlbXVsYXRpb24gcGFyYW1ldGVyczo6ICAgICAgICBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHRzCi0qIGxpbmtlciBzY3JpcHRzOjogICAgICAgICAgICAgIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzCi0qIGxpbmtlciBlbXVsYXRpb25zOjogICAgICAgICAgIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0cwotQGVuZCBtZW51Ci0KLUBub2RlIGVtdWxhdGlvbiBwYXJhbWV0ZXJzCi1Ac2VjdGlvbiBAZmlsZXtlbXVscGFyYW1zfSBzY3JpcHRzCi0KLUVhY2ggdGFyZ2V0IHNlbGVjdHMgYSBwYXJ0aWN1bGFyIGZpbGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IGRpcmVjdG9yeQotYnkgc2V0dGluZyB0aGUgc2hlbGwgdmFyaWFibGUgQGNvZGV7dGFyZ19lbXVsfSBpbiBAZmlsZXtjb25maWd1cmUudGd0fS4KLVRoaXMgc2hlbGwgdmFyaWFibGUgaXMgdXNlZCBieSB0aGUgQGZpbGV7Y29uZmlndXJlfSBzY3JpcHQgdG8gY29udHJvbAotYnVpbGRpbmcgYW4gZW11bGF0aW9uIHNvdXJjZSBmaWxlLgotCi1DZXJ0YWluIGNvbnZlbnRpb25zIGFyZSBlbmZvcmNlZC4gIFN1cHBvc2UgdGhlIEBjb2Rle3RhcmdfZW11bH0gdmFyaWFibGUKLWlzIHNldCB0byBAdmFye2VtdWx9IGluIEBmaWxle2NvbmZpZ3VyZS50Z3R9LiAgVGhlIG5hbWUgb2YgdGhlIGVtdWxhdGlvbgotc2hlbGwgc2NyaXB0IHdpbGwgYmUgQGZpbGV7ZW11bHBhcmFtcy9AdmFye2VtdWx9LnNofS4gIFRoZQotQGZpbGV7TWFrZWZpbGV9IG11c3QgaGF2ZSBhIHRhcmdldCBuYW1lZCBAZmlsZXtlQHZhcntlbXVsfS5jfTsgdGhpcwotdGFyZ2V0IG11c3QgZGVwZW5kIHVwb24gQGZpbGV7ZW11bHBhcmFtcy9AdmFye2VtdWx9LnNofSwgYXMgd2VsbCBhcyB0aGUKLWFwcHJvcHJpYXRlIHNjcmlwdHMgaW4gdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBhbmQgQGZpbGV7ZW11bHRlbXBsfQotZGlyZWN0b3JpZXMuICBUaGUgQGZpbGV7TWFrZWZpbGV9IHRhcmdldCBtdXN0IGludm9rZSBAY29kZXtHRU5TQ1JJUFRTfQotd2l0aCB0d28gYXJndW1lbnRzOiBAdmFye2VtdWx9LCBhbmQgdGhlIHZhbHVlIG9mIHRoZSBtYWtlIHZhcmlhYmxlCi1AY29kZXt0ZGlyX0B2YXJ7ZW11bH19LiAgVGhlIHZhbHVlIG9mIHRoZSBsYXR0ZXIgdmFyaWFibGUgd2lsbCBiZSBzZXQgYnkKLXRoZSBAZmlsZXtjb25maWd1cmV9IHNjcmlwdCwgYW5kIGlzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IHRhcmdldAotZGlyZWN0b3J5IHRvIHNlYXJjaC4KLQotQnkgY29udmVudGlvbiwgdGhlIEBmaWxle2VtdWxwYXJhbXMvQHZhcntlbXVsfS5zaH0gc2hlbGwgc2NyaXB0IHNob3VsZAotb25seSBzZXQgc2hlbGwgdmFyaWFibGVzLiAgSXQgbWF5IHNldCBzaGVsbCB2YXJpYWJsZXMgd2hpY2ggYXJlIHRvIGJlCi1pbnRlcnByZXRlZCBieSB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IGFuZCB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzLgotQ2VydGFpbiBzaGVsbCB2YXJpYWJsZXMgYXJlIGludGVycHJldGVkIGRpcmVjdGx5IGJ5IHRoZQotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0LgotCi1IZXJlIGlzIGEgbGlzdCBvZiBzaGVsbCB2YXJpYWJsZXMgaW50ZXJwcmV0ZWQgYnkgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0sCi1hcyB3ZWxsIGFzIHNvbWUgY29udmVudGlvbmFsIHNoZWxsIHZhcmlhYmxlcyBpbnRlcnByZXRlZCBieSB0aGUKLUBmaWxle3NjcmlwdHRlbXBsfSBhbmQgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzLgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIFNDUklQVF9OQU1FCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHRvIHVzZS4gIElmCi1AY29kZXtTQ1JJUFRfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7c2NyaXB0fSwgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCB1c2UKLXRoZSBzY3JpcHQgQGZpbGV7c2NyaXB0dGVtbC9AdmFye3NjcmlwdH0uc2N9LgotCi1AaXRlbSBURU1QTEFURV9OQU1FCi1UaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBAZmlsZXtlbXVsdGVtbHB9IHNjcmlwdCB0byB1c2UuICBJZgotQGNvZGV7VEVNUExBVEVfTkFNRX0gaXMgc2V0IHRvIEB2YXJ7dGVtcGxhdGV9LCBAZmlsZXtnZW5zY3JpcHRzLnNofSB3aWxsCi11c2UgdGhlIHNjcmlwdCBAZmlsZXtlbXVsdGVtcGwvQHZhcnt0ZW1wbGF0ZX0uZW19LiAgSWYgdGhpcyB2YXJpYWJsZSBpcwotbm90IHNldCwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgQHNhbXB7Z2VuZXJpY30uCi0KLUBpdGVtIEdFTkVSQVRFX1NITElCX1NDUklQVAotSWYgdGhpcyBpcyBzZXQgdG8gYSBub25lbXB0eSBzdHJpbmcsIEBmaWxle2dlbnNjcmlwdHMuc2h9IHdpbGwgaW52b2tlCi10aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBhbiBleHRyYSB0aW1lIHRvIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5Ci1zY3JpcHQuICBAcmVme2xpbmtlciBzY3JpcHRzfS4KLQotQGl0ZW0gT1VUUFVUX0ZPUk1BVAotVGhpcyBpcyBub3JtYWxseSBzZXQgdG8gaW5kaWNhdGUgdGhlIEJGRCBvdXRwdXQgZm9ybWF0IHVzZSAoZS5nLiwKLUBzYW1weyJhLm91dC1zdW5vcy1iaWcifS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHdpbGwgbm9ybWFsbHkKLXVzZSBpdCBpbiBhbiBAY29kZXtPVVRQVVRfRk9STUFUfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1AaXRlbSBBUkNICi1UaGlzIGlzIG5vcm1hbGx5IHNldCB0byBpbmRpY2F0ZSB0aGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSAoZS5nLiwKLUBzYW1we3NwYXJjfSkuICBUaGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aWxsIG5vcm1hbGx5IHVzZSBpdCBpbiBhbgotQGNvZGV7T1VUUFVUX0FSQ0h9IGV4cHJlc3Npb24gaW4gdGhlIGxpbmtlciBzY3JpcHQuCi0KLUBpdGVtIEVOVFJZCi1Tb21lIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzIHVzZSB0aGlzIHRvIHNldCB0aGUgZW50cnkgYWRkcmVzcywgaW4gYW4KLUBjb2Rle0VOVFJZfSBleHByZXNzaW9uIGluIHRoZSBsaW5rZXIgc2NyaXB0LgotCi1AaXRlbSBURVhUX1NUQVJUX0FERFIKLVNvbWUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdHMgdXNlIHRoaXMgdG8gc2V0IHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZQotQHNhbXB7LnRleHR9IHNlY3Rpb24uCi0KLUBpdGVtIE5PTlBBR0VEX1RFWFRfU1RBUlRfQUREUgotSWYgdGhpcyBpcyBkZWZpbmVkLCB0aGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHNldHMKLUBjb2Rle1RFWFRfU1RBUlRfQUREUn0gdG8gaXRzIHZhbHVlIGJlZm9yZSBydW5uaW5nIHRoZQotQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBmb3IgdGhlIEBjb2Rley1ufSBhbmQgQGNvZGV7LU59IG9wdGlvbnMKLShAcHhyZWZ7bGlua2VyIHNjcmlwdHN9KS4KLQotQGl0ZW0gU0VHTUVOVF9TSVpFCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHVzZXMgdGhpcyB0byBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YKLUBjb2Rle0RBVEFfQUxJR05NRU5UfSB3aGVuIHJ1bm5pbmcgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQuCi0KLUBpdGVtIFRBUkdFVF9QQUdFX1NJWkUKLUlmIEBjb2Rle1NFR01FTlRfU0laRX0gaXMgbm90IGRlZmluZWQsIHRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQKLXVzZXMgdGhpcyB0byBkZWZpbmUgaXQuCi0KLUBpdGVtIEFMSUdOTUVOVAotU29tZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0cyBzZXQgdGhpcyB0byBhIG51bWJlciB0byBwYXNzIHRvCi1AY29kZXtBTElHTn0gdG8gc2V0IHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoZSBAY29kZXtlbmR9IHN5bWJvbC4KLUBlbmQgdGFibGUKLQotQG5vZGUgbGlua2VyIHNjcmlwdHMKLUBzZWN0aW9uIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHRzCi0KLUVhY2ggbGlua2VyIHRhcmdldCB1c2VzIGEgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB0byBnZW5lcmF0ZSB0aGUKLWRlZmF1bHQgbGlua2VyIHNjcmlwdHMuICBUaGUgbmFtZSBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCBpcwotc2V0IGJ5IHRoZSBAY29kZXtTQ1JJUFRfTkFNRX0gdmFyaWFibGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdC4KLUlmIEBjb2Rle1NDUklQVF9OQU1FfSBpcyBzZXQgdG8gQHZhcntzY3JpcHR9LCBAY29kZXtnZW5zY3JpcHRzLnNofSB3aWxsCi1pbnZva2UgQGZpbGV7c2NyaXB0dGVtcGwvQHZhcntzY3JpcHR9LnNjfS4KLQotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIGludm9rZSB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9Ci1zY3JpcHQgNSBvciA2IHRpbWVzLiAgRWFjaCB0aW1lIGl0IHdpbGwgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQotQGNvZGV7TERfRkxBR30gdG8gYSBkaWZmZXJlbnQgdmFsdWUuICBXaGVuIHRoZSBsaW5rZXIgaXMgcnVuLCB0aGUKLW9wdGlvbnMgdXNlZCB3aWxsIGRpcmVjdCBpdCB0byBzZWxlY3QgYSBwYXJ0aWN1bGFyIHNjcmlwdC4gIChTY3JpcHQKLXNlbGVjdGlvbiBpcyBjb250cm9sbGVkIGJ5IHRoZSBAY29kZXtnZXRfc2NyaXB0fSBlbXVsYXRpb24gZW50cnkgcG9pbnQ7Ci10aGlzIGRlc2NyaWJlcyB0aGUgY29udmVudGlvbmFsIGJlaGF2aW91cikuCi0KLVRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IHNob3VsZCBqdXN0IHdyaXRlIGEgbGlua2VyIHNjcmlwdCwgd3JpdHRlbgotaW4gdGhlIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlLCB0byBzdGFuZGFyZCBvdXRwdXQuICBJZiB0aGUgZW11bGF0aW9uCi1uYW1lLS10aGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHBhcmFtc30gZmlsZSB3aXRob3V0IHRoZSBAZmlsZXsuc2N9Ci1leHRlbnNpb24tLWlzIEB2YXJ7ZW11bH0sIHRoZW4gdGhlIG91dHB1dCB3aWxsIGJlIGRpcmVjdGVkIHRvCi1AZmlsZXtsZHNjcmlwdHMvQHZhcntlbXVsfS5AdmFye2V4dGVuc2lvbn19IGluIHRoZSBidWlsZCBkaXJlY3RvcnksCi13aGVyZSBAdmFye2V4dGVuc2lvbn0gY2hhbmdlcyBlYWNoIHRpbWUgdGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMKLWludm9rZWQuCi0KLUhlcmUgaXMgdGhlIGxpc3Qgb2YgdmFsdWVzIGFzc2lnbmVkIHRvIEBjb2Rle0xEX0ZMQUd9LgotCi1AdGFibGUgQGNvZGUKLUBpdGVtIChlbXB0eSkKLVRoZSBzY3JpcHQgZ2VuZXJhdGVkIGlzIHVzZWQgYnkgZGVmYXVsdCAod2hlbiBub25lIG9mIHRoZSBmb2xsb3dpbmcKLWNhc2VzIGFwcGx5KS4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueH0uCi1AaXRlbSBuCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggdGhlCi1AY29kZXstbn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54bn0uCi1AaXRlbSBOCi1UaGUgc2NyaXB0IGdlbmVyYXRlZCBpcyB1c2VkIHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkIHdpdGggdGhlCi1AY29kZXstTn0gb3B0aW9uLiAgVGhlIG91dHB1dCBoYXMgYW4gZXh0ZW5zaW9uIG9mIEBmaWxley54Ym59LgotQGl0ZW0gcgotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LXJ9IG9wdGlvbi4gIFRoZSBvdXRwdXQgaGFzIGFuIGV4dGVuc2lvbiBvZiBAZmlsZXsueHJ9LgotQGl0ZW0gdQotVGhlIHNjcmlwdCBnZW5lcmF0ZWQgaXMgdXNlZCB3aGVuIHRoZSBsaW5rZXIgaXMgaW52b2tlZCB3aXRoIHRoZQotQGNvZGV7LVVyfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YgQGZpbGV7Lnh1fS4KLUBpdGVtIHNoYXJlZAotVGhlIEBmaWxle3NjcmlwdHRlbXBsfSBzY3JpcHQgaXMgb25seSBpbnZva2VkIHdpdGggQGNvZGV7TERfRkxBR30gc2V0IHRvCi10aGlzIHZhbHVlIGlmIEBjb2Rle0dFTkVSQVRFX1NITElCX1NDUklQVH0gaXMgZGVmaW5lZCBpbiB0aGUKLUBmaWxle2VtdWxwYXJhbXN9IGZpbGUuICBUaGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgbXVzdCBhcnJhbmdlIHRvIHVzZQotdGhpcyBzY3JpcHQgYXQgdGhlIGFwcHJvcHJpYXRlIHRpbWUsIG5vcm1hbGx5IHdoZW4gdGhlIGxpbmtlciBpcyBpbnZva2VkCi13aXRoIHRoZSBAY29kZXstc2hhcmVkfSBvcHRpb24uICBUaGUgb3V0cHV0IGhhcyBhbiBleHRlbnNpb24gb2YKLUBmaWxley54c30uCi1AZW5kIHRhYmxlCi0KLUJlc2lkZXMgdGhlIHNoZWxsIHZhcmlhYmxlcyBzZXQgYnkgdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdCwgYW5kIHRoZQotQGNvZGV7TERfRkxBR30gdmFyaWFibGUsIHRoZSBAZmlsZXtnZW5zY3JpcHRzLnNofSBzY3JpcHQgd2lsbCBzZXQKLWNlcnRhaW4gdmFyaWFibGVzIGZvciBlYWNoIHJ1biBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdC4KLQotQHRhYmxlIEBjb2RlCi1AaXRlbSBSRUxPQ0FUSU5HCi1UaGlzIHdpbGwgYmUgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyB3aGVuIHRoZSBsaW5rZXIgaXMgZG9pbmcgYSBmaW5hbAotcmVsb2NhdGlvbiAoZS5nLiwgYWxsIHNjcmlwdHMgb3RoZXIgdGhhbiBAY29kZXstcn0gYW5kIEBjb2Rley1Vcn0pLgotCi1AaXRlbSBDT05TVFJVQ1RJTkcKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGxpbmtlciBpcyBidWlsZGluZwotZ2xvYmFsIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyAoZS5nLiwgYWxsIHNjcmlwdHMgb3RoZXIgdGhhbgotQGNvZGV7LXJ9KS4KLQotQGl0ZW0gREFUQV9BTElHTk1FTlQKLVRoaXMgd2lsbCBiZSBzZXQgdG8gYW4gQGNvZGV7QUxJR059IGV4cHJlc3Npb24gd2hlbiB0aGUgb3V0cHV0IHNob3VsZCBiZQotcGFnZSBhbGlnbmVkLCBvciB0byBAc2FtcHsufSB3aGVuIGdlbmVyYXRpbmcgdGhlIEBjb2Rley1OfSBzY3JpcHQuCi0KLUBpdGVtIENSRUFURV9TSExJQgotVGhpcyB3aWxsIGJlIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiBnZW5lcmF0aW5nIGEgQGNvZGV7LXNoYXJlZH0KLXNjcmlwdC4KLUBlbmQgdGFibGUKLQotVGhlIGNvbnZlbnRpb25hbCB3YXkgdG8gd3JpdGUgYSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0IGlzIHRvIGZpcnN0Ci1zZXQgYSBmZXcgc2hlbGwgdmFyaWFibGVzLCBhbmQgdGhlbiB3cml0ZSBvdXQgYSBsaW5rZXIgc2NyaXB0IHVzaW5nCi1AY29kZXtjYXR9IHdpdGggYSBoZXJlIGRvY3VtZW50LiAgVGhlIGxpbmtlciBzY3JpcHQgd2lsbCB1c2UgdmFyaWFibGUKLXN1YnN0aXR1dGlvbnMsIGJhc2VkIG9uIHRoZSBhYm92ZSB2YXJpYWJsZXMgYW5kIHRob3NlIHNldCBpbiB0aGUKLUBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdCwgdG8gY29udHJvbCBpdHMgYmVoYXZpb3VyLgotCi1XaGVuIHRoZXJlIGFyZSBwYXJ0cyBvZiB0aGUgQGZpbGV7c2NyaXB0dGVtcGx9IHNjcmlwdCB3aGljaCBzaG91bGQgb25seQotYmUgcnVuIHdoZW4gZG9pbmcgYSBmaW5hbCByZWxvY2F0aW9uLCB0aGV5IHNob3VsZCBiZSBlbmNsb3NlZCB3aXRoaW4gYQotdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJhc2VkIG9uIEBjb2Rle1JFTE9DQVRJTkd9LiAgRm9yIGV4YW1wbGUsIG9uIG1hbnkKLXRhcmdldHMgc3BlY2lhbCBzeW1ib2xzIHN1Y2ggYXMgQGNvZGV7X2VuZH0gc2hvdWxkIGJlIGRlZmluZWQgd2hlbiBkb2luZwotYSBmaW5hbCBsaW5rLiAgTmF0dXJhbGx5LCB0aG9zZSBzeW1ib2xzIHNob3VsZCBub3QgYmUgZGVmaW5lZCB3aGVuIGRvaW5nCi1hIHJlbG9jYXRlYWJsZSBsaW5rIHVzaW5nIEBjb2Rley1yfS4gIFRoZSBAZmlsZXtzY3JpcHR0ZW1wbH0gc2NyaXB0Ci1jb3VsZCB1c2UgYSBjb25zdHJ1Y3QgbGlrZSB0aGlzIHRvIGRlZmluZSB0aG9zZSBzeW1ib2xzOgotQHNtYWxsZXhhbXBsZQotICAkQHtSRUxPQ0FUSU5HKyBfZW5kID0gLjtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoaXMgd2lsbCBkbyB0aGUgc3ltYm9sIGFzc2lnbm1lbnQgb25seSBpZiB0aGUgQGNvZGV7UkVMT0NBVElOR30KLXZhcmlhYmxlIGlzIGRlZmluZWQuCi0KLVRoZSBiYXNpYyBqb2Igb2YgdGhlIGxpbmtlciBzY3JpcHQgaXMgdG8gcHV0IHRoZSBzZWN0aW9ucyBpbiB0aGUgY29ycmVjdAotb3JkZXIsIGFuZCBhdCB0aGUgY29ycmVjdCBtZW1vcnkgYWRkcmVzc2VzLiAgRm9yIHNvbWUgdGFyZ2V0cywgdGhlCi1saW5rZXIgc2NyaXB0IG1heSBoYXZlIHRvIGRvIHNvbWUgb3RoZXIgb3BlcmF0aW9ucy4KLQotRm9yIGV4YW1wbGUsIG9uIG1vc3QgTUlQUyBwbGF0Zm9ybXMsIHRoZSBsaW5rZXIgaXMgcmVzcG9uc2libGUgZm9yCi1kZWZpbmluZyB0aGUgc3BlY2lhbCBzeW1ib2wgQGNvZGV7X2dwfSwgdXNlZCB0byBpbml0aWFsaXplIHRoZQotQGNvZGV7JGdwfSByZWdpc3Rlci4gIEl0IG11c3QgYmUgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgc21hbGwgZGF0YQotc2VjdGlvbiBwbHVzIEBjb2RlezB4ODAwMH0uICBOYXR1cmFsbHksIGl0IHNob3VsZCBvbmx5IGJlIGRlZmluZWQgd2hlbgotZG9pbmcgYSBmaW5hbCByZWxvY2F0aW9uLiAgVGhpcyB3aWxsIHR5cGljYWxseSBiZSBkb25lIGxpa2UgdGhpczoKLUBzbWFsbGV4YW1wbGUKLSAgJEB7UkVMT0NBVElORysgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO0B9Ci1AZW5kIHNtYWxsZXhhbXBsZQotVGhpcyBsaW5lIHdvdWxkIGFwcGVhciBqdXN0IGJlZm9yZSB0aGUgc2VjdGlvbnMgd2hpY2ggY29tcG9zZSB0aGUgc21hbGwKLWRhdGEgc2VjdGlvbiAoQHNhbXB7LnNkYXRhfSwgQHNhbXB7LnNic3N9KS4gIEFsbCB0aG9zZSBzZWN0aW9ucyB3b3VsZCBiZQotY29udGlndW91cyBpbiBtZW1vcnkuCi0KLU1hbnkgQ09GRiBzeXN0ZW1zIGJ1aWxkIGNvbnN0cnVjdG9yIHRhYmxlcyBpbiB0aGUgbGlua2VyIHNjcmlwdC4gIFRoZQotY29tcGlsZXIgd2lsbCBhcnJhbmdlIHRvIG91dHB1dCB0aGUgYWRkcmVzcyBvZiBlYWNoIGdsb2JhbCBjb25zdHJ1Y3RvcgotaW4gYSBAc2FtcHsuY3Rvcn0gc2VjdGlvbiwgYW5kIHRoZSBhZGRyZXNzIG9mIGVhY2ggZ2xvYmFsIGRlc3RydWN0b3IgaW4KLWEgQHNhbXB7LmR0b3J9IHNlY3Rpb24gKHRoaXMgaXMgZG9uZSBieSBkZWZpbmluZwotQGNvZGV7QVNNX09VVFBVVF9DT05TVFJVQ1RPUn0gYW5kIEBjb2Rle0FTTV9PVVRQVVRfREVTVFJVQ1RPUn0gaW4gdGhlCi1AY29kZXtnY2N9IGNvbmZpZ3VyYXRpb24gZmlsZXMpLiAgVGhlIEBjb2Rle2djY30gcnVudGltZSBzdXBwb3J0Ci1yb3V0aW5lcyBleHBlY3QgdGhlIGNvbnN0cnVjdG9yIHRhYmxlIHRvIGJlIG5hbWVkIEBjb2Rle19fQ1RPUl9MSVNUX199LgotVGhleSBleHBlY3QgaXQgdG8gYmUgYSBsaXN0IG9mIHdvcmRzLCB3aXRoIHRoZSBmaXJzdCB3b3JkIGJlaW5nIHRoZQotY291bnQgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzLiAgVGhlcmUgc2hvdWxkIGJlIGEgdHJhaWxpbmcgemVybyB3b3JkLgotKEFjdHVhbGx5LCB0aGUgY291bnQgbWF5IGJlIC0xIGlmIHRoZSB0cmFpbGluZyB3b3JkIGlzIHByZXNlbnQsIGFuZCB0aGUKLXRyYWlsaW5nIHdvcmQgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGNvdW50IGlzIGNvcnJlY3QsIGJ1dCwgYXMgdGhlCi1AY29kZXtnY2N9IGJlaGF2aW91ciBoYXMgY2hhbmdlZCBzbGlnaHRseSBvdmVyIHRoZSB5ZWFycywgaXQgaXMgc2FmZXN0Ci10byBwcm92aWRlIGJvdGgpLiAgSGVyZSBpcyBhIHR5cGljYWwgd2F5IHRoYXQgbWlnaHQgYmUgaGFuZGxlZCBpbiBhCi1AZmlsZXtzY3JpcHR0ZW1wbH0gZmlsZS4KLUBzbWFsbGV4YW1wbGUKLSAgICAkQHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO0B9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycylAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygwKUB9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO0B9Ci0gICAgJEB7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjtAfQotICAgICRAe0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMilAfQotICAgICRAe0NPTlNUUlVDVElORysgKiguZHRvcnMpQH0KLSAgICAkQHtDT05TVFJVQ1RJTkcrIExPTkcoMClAfQotICAgICRAe0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB1c2Ugb2YgQGNvZGV7Q09OU1RSVUNUSU5HfSBlbnN1cmVzIHRoYXQgdGhlc2UgbGlua2VyIHNjcmlwdCBjb21tYW5kcwotd2lsbCBvbmx5IGFwcGVhciB3aGVuIHRoZSBsaW5rZXIgaXMgc3VwcG9zZWQgdG8gYmUgYnVpbGRpbmcgdGhlCi1jb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0YWJsZXMuICBUaGlzIGV4YW1wbGUgaXMgd3JpdHRlbiBmb3IgYSB0YXJnZXQKLXdoaWNoIHVzZXMgNCBieXRlIHBvaW50ZXJzLgotCi1FbWJlZGRlZCBzeXN0ZW1zIG9mdGVuIG5lZWQgdG8gc2V0IGEgc3RhY2sgYWRkcmVzcy4gIFRoaXMgaXMgbm9ybWFsbHkKLWJlc3QgZG9uZSBieSB1c2luZyB0aGUgQGNvZGV7UFJPVklERX0gY29uc3RydWN0IHdpdGggYSBkZWZhdWx0IHN0YWNrCi1hZGRyZXNzLiAgVGhpcyBwZXJtaXRzIHRoZSB1c2VyIHRvIGVhc2lseSBvdmVycmlkZSB0aGUgc3RhY2sgYWRkcmVzcwotdXNpbmcgdGhlIEBjb2Rley0tZGVmc3ltfSBvcHRpb24uICBIZXJlIGlzIGFuIGV4YW1wbGU6Ci1Ac21hbGxleGFtcGxlCi0gICRAe1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fc3RhY2sgPSAweDgwMDAwMDAwKTtAfQotQGVuZCBzbWFsbGV4YW1wbGUKLVRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sIEBjb2Rle19fc3RhY2t9IHdvdWxkIHRoZW4gYmUgdXNlZCBpbiB0aGUgc3RhcnR1cAotY29kZSB0byBpbml0aWFsaXplIHRoZSBzdGFjayBwb2ludGVyLgotCi1Abm9kZSBsaW5rZXIgZW11bGF0aW9ucwotQHNlY3Rpb24gQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHRzCi0KLUVhY2ggbGlua2VyIHRhcmdldCB1c2VzIGFuIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IHRvIGdlbmVyYXRlIHRoZQotZW11bGF0aW9uIGNvZGUuICBUaGUgbmFtZSBvZiB0aGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgaXMgc2V0IGJ5IHRoZQotQGNvZGV7VEVNUExBVEVfTkFNRX0gdmFyaWFibGUgaW4gdGhlIEBmaWxle2VtdWxwYXJhbXN9IHNjcmlwdC4gIElmIHRoZQotQGNvZGV7VEVNUExBVEVfTkFNRX0gdmFyaWFibGUgaXMgbm90IHNldCwgdGhlIGRlZmF1bHQgaXMKLUBzYW1we2dlbmVyaWN9LiAgSWYgdGhlIHZhbHVlIG9mIEBjb2Rle1RFTVBMQVRFX05BTUV9IGlzIEB2YXJ7dGVtcGxhdGV9LAotQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gd2lsbCB1c2UgQGZpbGV7ZW11bHRlbXBsL0B2YXJ7dGVtcGxhdGV9LmVtfS4KLQotTW9zdCB0YXJnZXRzIHVzZSB0aGUgZ2VuZXJpYyBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCwKLUBmaWxle2VtdWx0ZW1wbC9nZW5lcmljLmVtfS4gIEEgZGlmZmVyZW50IEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IGlzCi1vbmx5IG5lZWRlZCBpZiB0aGUgbGlua2VyIG11c3Qgc3VwcG9ydCB1bnVzdWFsIGFjdGlvbnMsIHN1Y2ggYXMgbGlua2luZwotYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzLgotCi1UaGUgQGZpbGV7ZW11bHRlbXBsfSBzY3JpcHQgaXMgbm9ybWFsbHkgd3JpdHRlbiBhcyBhIHNpbXBsZSBpbnZvY2F0aW9uCi1vZiBAY29kZXtjYXR9IHdpdGggYSBoZXJlIGRvY3VtZW50LiAgVGhlIGRvY3VtZW50IHdpbGwgdXNlIGEgZmV3Ci12YXJpYWJsZSBzdWJzdGl0dXRpb25zLiAgVHlwaWNhbGx5IGVhY2ggZnVuY3Rpb24gbmFtZXMgdXNlcyBhCi1zdWJzdGl0dXRpb24gaW52b2x2aW5nIEBjb2Rle0VNVUxBVElPTl9OQU1FfSwgZm9yIGVhc2Ugb2YgZGVidWdnaW5nIHdoZW4KLXRoZSBsaW5rZXIgc3VwcG9ydHMgbXVsdGlwbGUgZW11bGF0aW9ucy4KLQotRXZlcnkgZnVuY3Rpb24gYW5kIHZhcmlhYmxlIGluIHRoZSBlbWl0dGVkIGZpbGUgc2hvdWxkIGJlIHN0YXRpYy4gIFRoZQotb25seSBnbG9iYWxseSB2aXNpYmxlIG9iamVjdCBtdXN0IGJlIG5hbWVkCi1AY29kZXtsZF9AdmFye0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb259LCB3aGVyZSBAdmFye0VNVUxBVElPTl9OQU1FfSBpcwotdGhlIG5hbWUgb2YgdGhlIGVtdWxhdGlvbiBzZXQgaW4gQGZpbGV7Y29uZmlndXJlLnRndH0gKHRoaXMgaXMgYWxzbyB0aGUKLW5hbWUgb2YgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUgd2l0aG91dCB0aGUgQGZpbGV7LnNofSBleHRlbnNpb24pLgotVGhlIEBmaWxle2dlbnNjcmlwdHMuc2h9IHNjcmlwdCB3aWxsIHNldCB0aGUgc2hlbGwgdmFyaWFibGUKLUBjb2Rle0VNVUxBVElPTl9OQU1FfSBiZWZvcmUgaW52b2tpbmcgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0LgotCi1UaGUgQGNvZGV7bGRfQHZhcntFTVVMQVRJT05fTkFNRX1fZW11bGF0aW9ufSB2YXJpYWJsZSBtdXN0IGJlIGEKLUBjb2Rle3N0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3R9LCBhcyBkZWZpbmVkIGluIEBmaWxle2xkZW11bC5ofS4KLUl0IGRlZmluZXMgYSBzZXQgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIGludm9rZWQgYnkgdGhlIGxpbmtlciwKLWFzIHdlbGwgYXMgc3RyaW5ncyBmb3IgdGhlIGVtdWxhdGlvbiBuYW1lIChub3JtYWxseSBzZXQgZnJvbSB0aGUgc2hlbGwKLXZhcmlhYmxlIEBjb2Rle0VNVUxBVElPTl9OQU1FfSBhbmQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBuYW1lIChub3JtYWxseQotc2V0IGZyb20gdGhlIHNoZWxsIHZhcmlhYmxlIEBjb2Rle09VVFBVVF9GT1JNQVR9IHdoaWNoIGlzIG5vcm1hbGx5IHNldAotYnkgdGhlIEBmaWxle2VtdWxwYXJhbXN9IGZpbGUpLgotCi1UaGUgQGZpbGV7Z2Vuc2NyaXB0cy5zaH0gc2NyaXB0IHdpbGwgc2V0IHRoZSBzaGVsbCB2YXJpYWJsZQotQGNvZGV7Q09NUElMRV9JTn0gd2hlbiBpdCBpbnZva2VzIHRoZSBAZmlsZXtlbXVsdGVtcGx9IHNjcmlwdCBmb3IgdGhlCi1kZWZhdWx0IGVtdWxhdGlvbi4gIEluIHRoaXMgY2FzZSwgdGhlIEBmaWxle2VtdWx0ZW1wbH0gc2NyaXB0IHNob3VsZAotaW5jbHVkZSB0aGUgbGlua2VyIHNjcmlwdHMgZGlyZWN0bHksIGFuZCByZXR1cm4gdGhlbSBmcm9tIHRoZQotQGNvZGV7Z2V0X3NjcmlwdHN9IGVudHJ5IHBvaW50LiAgV2hlbiB0aGUgZW11bGF0aW9uIGlzIG5vdCB0aGUgZGVmYXVsdCwKLXRoZSBAY29kZXtnZXRfc2NyaXB0c30gZW50cnkgcG9pbnQgc2hvdWxkIGp1c3QgcmV0dXJuIGEgZmlsZSBuYW1lLiAgU2VlCi1AZmlsZXtlbXVsdGVtcGwvZ2VuZXJpYy5lbX0gZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgaXMgZG9uZS4KLQotQXQgc29tZSBwb2ludCwgdGhlIGxpbmtlciBlbXVsYXRpb24gZW50cnkgcG9pbnRzIHNob3VsZCBiZSBkb2N1bWVudGVkLgotCi1Abm9kZSBFbXVsYXRpb24gV2Fsa3Rocm91Z2gKLUBjaGFwdGVyIEEgV2Fsa3Rocm91Z2ggb2YgYSBUeXBpY2FsIEVtdWxhdGlvbgotCi1UaGlzIGNoYXB0ZXIgaXMgdG8gaGVscCBwZW9wbGUgd2hvIGFyZSBuZXcgdG8gdGhlIHdheSBlbXVsYXRpb25zCi1pbnRlcmFjdCB3aXRoIHRoZSBsaW5rZXIsIG9yIHdobyBhcmUgc3VkZGVubHkgdGhydXN0IGludG8gdGhlIHBvc2l0aW9uCi1vZiBoYXZpbmcgdG8gd29yayB3aXRoIGV4aXN0aW5nIGVtdWxhdGlvbnMuICBJdCB3aWxsIGRpc2N1c3MgdGhlIGZpbGVzCi15b3UgbmVlZCB0byBiZSBhd2FyZSBvZi4gIEl0IHdpbGwgdGVsbCB5b3Ugd2hlbiB0aGUgZ2l2ZW4gImhvb2tzIiBpbgotdGhlIGVtdWxhdGlvbiB3aWxsIGJlIGNhbGxlZC4gIEl0IHdpbGwsIGhvcGVmdWxseSwgZ2l2ZSB5b3UgZW5vdWdoCi1pbmZvcm1hdGlvbiBhYm91dCB3aGVuIGFuZCBob3cgdGhpbmdzIGhhcHBlbiB0aGF0IHlvdSdsbCBiZSBhYmxlIHRvCi1nZXQgYnkuICBBcyBhbHdheXMsIHRoZSBzb3VyY2UgaXMgdGhlIGRlZmluaXRpdmUgcmVmZXJlbmNlIHRvIHRoaXMuCi0KLVRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGxpbmtlciBpcyBpbiBAZmlsZXtsZG1haW4uY30gd2hlcmUKLUBjb2Rle21haW59IGlzIGRlZmluZWQuICBUaGUgYnVsayBvZiB0aGUgY29kZSB0aGF0J3MgZW11bGF0aW9uCi1zcGVjaWZpYyB3aWxsIGluaXRpYWxseSBiZSBpbiBAY29kZXtlbXVsdGVtcGwvQHZhcntlbXVsYXRpb259LmVtfSBidXQKLXdpbGwgZW5kIHVwIGluIEBjb2Rle2VAdmFye2VtdWxhdGlvbn0uY30gd2hlbiB0aGUgYnVpbGQgaXMgZG9uZS4KLU1vc3Qgb2YgdGhlIHdvcmsgdG8gc2VsZWN0IGFuZCBpbnRlcmZhY2Ugd2l0aCBlbXVsYXRpb25zIGlzIGluCi1AY29kZXtsZGVtdWwuaH0gYW5kIEBjb2Rle2xkZW11bC5jfS4gIFNwZWNpZmljYWxseSwgQGNvZGV7bGRlbXVsLmh9Ci1kZWZpbmVzIHRoZSBAY29kZXtsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3R9IHN0cnVjdHVyZSB5b3VyIGVtdWxhdGlvbgotZXhwb3J0cy4KLQotWW91ciBlbXVsYXRpb24gZmlsZSBleHBvcnRzIGEgc3ltYm9sCi1AY29kZXtsZF9AdmFye0VNVUxBVElPTl9OQU1FfV9lbXVsYXRpb259LiAgSWYgeW91ciBlbXVsYXRpb24gaXMKLXNlbGVjdGVkIChpdCB1c3VhbGx5IGlzLCBzaW5jZSB1c3VhbGx5IHRoZXJlJ3Mgb25seSBvbmUpLAotQGNvZGV7bGRlbXVsLmN9IHNldHMgdGhlIHZhcmlhYmxlIEB2YXJ7bGRfZW11bGF0aW9ufSB0byBwb2ludCB0byBpdC4KLUBjb2Rle2xkZW11bC5jfSBhbHNvIGRlZmluZXMgYSBudW1iZXIgb2YgQVBJIGZ1bmN0aW9ucyB0aGF0IGludGVyZmFjZQotdG8geW91ciBlbXVsYXRpb24sIGxpa2UgQGNvZGV7bGRlbXVsX2FmdGVyX3BhcnNlfSB3aGljaCBzaW1wbHkgY2FsbHMKLXlvdXIgQGNvZGV7bGRfQHZhcntFTVVMQVRJT059X2VtdWxhdGlvbi5hZnRlcl9wYXJzZX0gZnVuY3Rpb24uICBGb3IKLXRoZSByZXN0IG9mIHRoaXMgc2VjdGlvbiwgdGhlIGZ1bmN0aW9ucyB3aWxsIGJlIG1lbnRpb25lZCwgYnV0IHlvdQotc2hvdWxkIGFzc3VtZSB0aGUgaW5kaXJlY3QgcmVmZXJlbmNlIHRvIHlvdXIgZW11bGF0aW9uIGFsc28uCi0KLVdlIHdpbGwgYWxzbyBza2lwIG9yIGdsb3NzIG92ZXIgcGFydHMgb2YgdGhlIGxpbmsgcHJvY2VzcyB0aGF0IGRvbid0Ci1yZWxhdGUgdG8gZW11bGF0aW9ucywgbGlrZSBzZXR0aW5nIHVwIGludGVybmF0aW9uYWxpemF0aW9uLgotCi1BZnRlciBpbml0aWFsaXphdGlvbiwgQGNvZGV7bWFpbn0gc2VsZWN0cyBhbiBlbXVsYXRpb24gYnkgcHJlLXNjYW5uaW5nCi10aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gIEl0IGNhbGxzIEBjb2Rle2xkZW11bF9jaG9vc2VfdGFyZ2V0fSB0bwotY2hvb3NlIGEgdGFyZ2V0LiAgSWYgeW91IHNldCBAY29kZXtjaG9vc2VfdGFyZ2V0fSB0bwotQGNvZGV7bGRlbXVsX2RlZmF1bHRfdGFyZ2V0fSwgaXQgcGlja3MgeW91ciBAY29kZXt0YXJnZXRfbmFtZX0gYnkKLWRlZmF1bHQuCi0KLUBjb2Rle21haW59IGNhbGxzIEBjb2Rle2xkZW11bF9iZWZvcmVfcGFyc2V9LCB0aGVuIEBjb2Rle3BhcnNlX2FyZ3N9LgotQGNvZGV7cGFyc2VfYXJnc30gY2FsbHMgQGNvZGV7bGRlbXVsX3BhcnNlX2FyZ3N9IGZvciBlYWNoIGFyZywgd2hpY2gKLW11c3QgdXBkYXRlIHRoZSBAY29kZXtnZXRvcHR9IGdsb2JhbHMgaWYgaXQgcmVjb2duaXplcyB0aGUgYXJndW1lbnQuCi1JZiB0aGUgZW11bGF0aW9uIGRvZXNuJ3QgcmVjb2duaXplIGl0LCB0aGVuIHBhcnNlX2FyZ3MgY2hlY2tzIHRvIHNlZQotaWYgaXQgcmVjb2duaXplcyBpdC4KLQotTm93IHRoYXQgdGhlIGVtdWxhdGlvbiBoYXMgaGFkIGFjY2VzcyB0byBhbGwgaXRzIGNvbW1hbmQtbGluZSBvcHRpb25zLAotQGNvZGV7bWFpbn0gY2FsbHMgQGNvZGV7bGRlbXVsX3NldF9zeW1ib2xzfS4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGFueQotaW5pdGlhbGl6YXRpb24gdGhhdCBtYXkgYmUgYWZmZWN0ZWQgYnkgb3B0aW9ucy4gIEl0IGlzIGFsc28gc3VwcG9zZWQKLXRvIHNldCB1cCBhbnkgdmFyaWFibGVzIG5lZWRlZCBieSB0aGUgZW11bGF0aW9uIHNjcmlwdC4KLQotQGNvZGV7bWFpbn0gbm93IGNhbGxzIEBjb2Rle2xkZW11bF9nZXRfc2NyaXB0fSB0byBnZXQgdGhlIGVtdWxhdGlvbgotc2NyaXB0IHRvIHVzZSAoYmFzZWQgb24gYXJndW1lbnRzLCBubyBkb3VidCwgQHB4cmVme0VtdWxhdGlvbnN9KSBhbmQKLXJ1bnMgaXQuICBXaGlsZSBwYXJzaW5nLCBAY29kZXtsZGdyYW0ueX0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX2hsbH0gb3IKLUBjb2Rle2xkZW11bF9zeXNsaWJ9IHRvIGhhbmRsZSB0aGUgQGNvZGV7SExMfSBvciBAY29kZXtTWVNMSUJ9Ci1jb21tYW5kcy4gIEl0IG1heSBjYWxsIEBjb2Rle2xkZW11bF91bnJlY29nbml6ZWRfZmlsZX0gaWYgeW91IGFza2VkCi10aGUgbGlua2VyIHRvIGxpbmsgYSBmaWxlIGl0IGRvZXNuJ3QgcmVjb2duaXplLiAgSXQgd2lsbCBjYWxsCi1AY29kZXtsZGVtdWxfcmVjb2duaXplZF9maWxlfSBmb3IgZWFjaCBmaWxlIGl0IGRvZXMgcmVjb2duaXplLCBpbiBjYXNlCi10aGUgZW11bGF0aW9uIHdhbnRzIHRvIGhhbmRsZSBzb21lIGZpbGVzIHNwZWNpYWxseS4gIEFsbCB0aGUgd2hpbGUsCi1pdCdzIGxvYWRpbmcgdGhlIGZpbGVzIChwb3NzaWJseSBjYWxsaW5nCi1AY29kZXtsZGVtdWxfb3Blbl9keW5hbWljX2FyY2hpdmV9KSBhbmQgc3ltYm9scyBhbmQgc3R1ZmYuICBBZnRlciBpdCdzCi1kb25lIHJlYWRpbmcgdGhlIHNjcmlwdCwgQGNvZGV7bWFpbn0gY2FsbHMgQGNvZGV7bGRlbXVsX2FmdGVyX3BhcnNlfS4KLVVzZSB0aGUgYWZ0ZXItcGFyc2UgaG9vayB0byBzZXQgdXAgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHN0dWZmIHRoZQotc2NyaXB0IG1pZ2h0IGhhdmUgc2V0IHVwLCBsaWtlIHRoZSBlbnRyeSBwb2ludC4KLQotQGNvZGV7bWFpbn0gbmV4dCBjYWxscyBAY29kZXtsYW5nX3Byb2Nlc3N9IGluIEBjb2Rle2xkbGFuZy5jfS4gIFRoaXMKLWFwcGVhcnMgdG8gYmUgdGhlIG1haW4gY29yZSBvZiB0aGUgbGlua2luZyBpdHNlbGYsIGFzIGZhciBhcyBlbXVsYXRpb24KLWhvb2tzIGFyZSBjb25jZXJuZWQoKikuICBJdCBmaXJzdCBvcGVucyB0aGUgb3V0cHV0IGZpbGUncyBCRkQsIGNhbGxpbmcKLUBjb2Rle2xkZW11bF9zZXRfb3V0cHV0X2FyY2h9LCBhbmQgY2FsbHMKLUBjb2Rle2xkZW11bF9jcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50c30gaW4gY2FzZSB5b3UgbmVlZCB0byB1c2UKLW90aGVyIG1lYW5zIHRvIGZpbmQgb3IgY3JlYXRlIG9iamVjdCBmaWxlcyAoaS5lLiBzaGFyZWQgbGlicmFyaWVzCi1mb3VuZCBvbiBhIHBhdGgsIG9yIGZha2Ugc3R1YiBvYmplY3RzKS4gIERlc3BpdGUgdGhlIG5hbWUsIG5vYm9keQotY3JlYXRlcyBvdXRwdXQgc2VjdGlvbnMgaGVyZS4KLQotKCopIEluIG1vc3QgY2FzZXMsIHRoZSBCRkQgbGlicmFyeSBkb2VzIHRoZSBidWxrIG9mIHRoZSBhY3R1YWwKLWxpbmtpbmcsIGhhbmRsaW5nIHN5bWJvbCB0YWJsZXMsIHN5bWJvbCByZXNvbHV0aW9uLCByZWxvY2F0aW9ucywgYW5kCi1idWlsZGluZyB0aGUgZmluYWwgb3V0cHV0IGZpbGUuICBTZWUgdGhlIEJGRCByZWZlcmVuY2UgZm9yIGFsbCB0aGUKLWRldGFpbHMuICBZb3VyIGVtdWxhdGlvbiBpcyB1c3VhbGx5IGNvbmNlcm5lZCBtb3JlIHdpdGggbWFuYWdpbmcKLXRoaW5ncyBhdCB0aGUgZmlsZSBhbmQgc2VjdGlvbiBsZXZlbCwgbGlrZSAicHV0IHRoaXMgaGVyZSwgYWRkIHRoaXMKLXNlY3Rpb24iLCBldGMuCi0KLU5leHQsIHRoZSBvYmplY3RzIHRvIGJlIGxpbmtlZCBhcmUgb3BlbmVkIGFuZCBCRkRzIGNyZWF0ZWQgZm9yIHRoZW0sCi1hbmQgQGNvZGV7bGRlbXVsX2FmdGVyX29wZW59IGlzIGNhbGxlZC4gIEF0IHRoaXMgcG9pbnQsIHlvdSBoYXZlIGFsbAotdGhlIG9iamVjdHMgYW5kIHN5bWJvbHMgbG9hZGVkLCBidXQgbm9uZSBvZiB0aGUgZGF0YSBoYXMgYmVlbiBwbGFjZWQKLXlldC4KLQotTmV4dCBjb21lcyB0aGUgQmlnIExpbmtpbmcgVGhpbmd5IChleGNlcHQgZm9yIHRoZSBwYXJ0cyBCRkQgZG9lcykuCi1BbGwgaW5wdXQgc2VjdGlvbnMgYXJlIG1hcHBlZCB0byBvdXRwdXQgc2VjdGlvbnMgYWNjb3JkaW5nIHRvIHRoZQotc2NyaXB0LiAgSWYgYSBzZWN0aW9uIGRvZXNuJ3QgZ2V0IG1hcHBlZCBieSBkZWZhdWx0LAotQGNvZGV7bGRlbXVsX3BsYWNlX29ycGhhbn0gd2lsbCBnZXQgY2FsbGVkIHRvIGZpZ3VyZSBvdXQgd2hlcmUgaXQgZ29lcy4KLU5leHQgaXQgZmlndXJlcyBvdXQgdGhlIG9mZnNldHMgZm9yIGVhY2ggc2VjdGlvbiwgY2FsbGluZwotQGNvZGV7bGRlbXVsX2JlZm9yZV9hbGxvY2F0aW9ufSBiZWZvcmUgYW5kCi1AY29kZXtsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbn0gYWZ0ZXIgZGVjaWRpbmcgd2hlcmUgZWFjaCBpbnB1dCBzZWN0aW9uCi1lbmRzIHVwIGluIHRoZSBvdXRwdXQgc2VjdGlvbnMuCi0KLVRoZSBsYXN0IHBhcnQgb2YgQGNvZGV7bGFuZ19wcm9jZXNzfSBpcyB0byBmaWd1cmUgb3V0IGFsbCB0aGUgc3ltYm9scycKLXZhbHVlcy4gIEFmdGVyIGFzc2lnbmluZyBmaW5hbCB2YWx1ZXMgdG8gdGhlIHN5bWJvbHMsCi1AY29kZXtsZGVtdWxfZmluaXNofSBpcyBjYWxsZWQsIGFuZCBhZnRlciB0aGF0LCBhbnkgdW5kZWZpbmVkIHN5bWJvbHMKLWFyZSB0dXJuZWQgaW50byBmYXRhbCBlcnJvcnMuCi0KLU9LLCBiYWNrIHRvIEBjb2Rle21haW59LCB3aGljaCBjYWxscyBAY29kZXtsZHdyaXRlfSBpbgotQGZpbGV7bGR3cml0ZS5jfS4gIEBjb2Rle2xkd3JpdGV9IGNhbGxzIEJGRCdzIGZpbmFsX2xpbmssIHdoaWNoIGRvZXMKLWFsbCB0aGUgcmVsb2NhdGlvbiBmaXh1cHMgYW5kIHdyaXRlcyB0aGUgb3V0cHV0IGJmZCB0byBkaXNrLCBhbmQgd2UncmUKLWRvbmUuCi0KLUluIHN1bW1hcnksCi0KLUBpdGVtaXplIEBidWxsZXQKLQotQGl0ZW0gQGNvZGV7bWFpbigpfSBpbiBAZmlsZXtsZG1haW4uY30KLUBpdGVtIEBmaWxle2VtdWx0ZW1wbC9AdmFye0VNVUxBVElPTn0uZW19IGhhcyB5b3VyIGNvZGUKLUBpdGVtIEBjb2Rle2xkZW11bF9jaG9vc2VfdGFyZ2V0fSAoZGVmYXVsdHMgdG8geW91ciBAY29kZXt0YXJnZXRfbmFtZX0pCi1AaXRlbSBAY29kZXtsZGVtdWxfYmVmb3JlX3BhcnNlfQotQGl0ZW0gUGFyc2UgYXJndiwgY2FsbHMgQGNvZGV7bGRlbXVsX3BhcnNlX2FyZ3N9IGZvciBlYWNoCi1AaXRlbSBAY29kZXtsZGVtdWxfc2V0X3N5bWJvbHN9Ci1AaXRlbSBAY29kZXtsZGVtdWxfZ2V0X3NjcmlwdH0KLUBpdGVtIHBhcnNlIHNjcmlwdAotCi1AaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfaGxsfSBvciBAY29kZXtsZGVtdWxfc3lzbGlifQotQGl0ZW0gbWF5IGNhbGwgQGNvZGV7bGRlbXVsX29wZW5fZHluYW1pY19hcmNoaXZlfQotQGVuZCBpdGVtaXplCi0KLUBpdGVtIEBjb2Rle2xkZW11bF9hZnRlcl9wYXJzZX0KLUBpdGVtIEBjb2Rle2xhbmdfcHJvY2VzcygpfSBpbiBAZmlsZXtsZGxhbmcuY30KLQotQGl0ZW1pemUgQGJ1bGxldAotQGl0ZW0gY3JlYXRlIEBjb2Rle291dHB1dF9iZmR9Ci1AaXRlbSBAY29kZXtsZGVtdWxfc2V0X291dHB1dF9hcmNofQotQGl0ZW0gQGNvZGV7bGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzfQotQGl0ZW0gcmVhZCBvYmplY3RzLCBjcmVhdGUgaW5wdXQgYmZkcyAtIGFsbCBzeW1ib2xzIGV4aXN0LCBidXQgaGF2ZSBubyB2YWx1ZXMKLUBpdGVtIG1heSBjYWxsIEBjb2Rle2xkZW11bF91bnJlY29nbml6ZWRfZmlsZX0KLUBpdGVtIHdpbGwgY2FsbCBAY29kZXtsZGVtdWxfcmVjb2duaXplZF9maWxlfQotQGl0ZW0gQGNvZGV7bGRlbXVsX2FmdGVyX29wZW59Ci1AaXRlbSBtYXAgaW5wdXQgc2VjdGlvbnMgdG8gb3V0cHV0IHNlY3Rpb25zCi1AaXRlbSBtYXkgY2FsbCBAY29kZXtsZGVtdWxfcGxhY2Vfb3JwaGFufSBmb3IgcmVtYWluaW5nIHNlY3Rpb25zCi1AaXRlbSBAY29kZXtsZGVtdWxfYmVmb3JlX2FsbG9jYXRpb259Ci1AaXRlbSBnaXZlcyBpbnB1dCBzZWN0aW9ucyBvZmZzZXRzIGludG8gb3V0cHV0IHNlY3Rpb25zLCBwbGFjZXMgb3V0cHV0IHNlY3Rpb25zCi1AaXRlbSBAY29kZXtsZGVtdWxfYWZ0ZXJfYWxsb2NhdGlvbn0gLSBzZWN0aW9uIGFkZHJlc3NlcyB2YWxpZAotQGl0ZW0gYXNzaWducyB2YWx1ZXMgdG8gc3ltYm9scwotQGl0ZW0gQGNvZGV7bGRlbXVsX2ZpbmlzaH0gLSBzeW1ib2wgdmFsdWVzIHZhbGlkCi1AZW5kIGl0ZW1pemUKLQotQGl0ZW0gb3V0cHV0IGJmZCBpcyB3cml0dGVuIHRvIGRpc2sKLQotQGVuZCBpdGVtaXplCi0KLUBjb250ZW50cwotQGJ5ZQpkaWZmIC0tZ2l0IGEvbGQvbGRsYW5nLmMgYi9sZC9sZGxhbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjNDMxYy4uMDAwMDAwMAotLS0gYS9sZC9sZGxhbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2MjYgKzAsMCBAQAotLyogTGlua2VyIGNvbW1hbmQgbGFuZ3VhZ2Ugc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAib2JzdGFjay5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImZubWF0Y2guaCIKLSNpbmNsdWRlICJkZW1hbmdsZS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLyogRk9SV0FSRFMgKi8KLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpuZXdfc3RhdGVtZW50IFBBUkFNUyAoKGVudW0gc3RhdGVtZW50X2VudW0sCi0JCQkJCQkJIHNpemVfdCwKLQkJCQkJCQkgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlKikpOwotCi0KLS8qIExPQ0FMUyAqLwotc3RhdGljIHN0cnVjdCBvYnN0YWNrIHN0YXRfb2JzdGFjazsKLQotI2RlZmluZSBvYnN0YWNrX2NodW5rX2FsbG9jIHhtYWxsb2MKLSNkZWZpbmUgb2JzdGFja19jaHVua19mcmVlIGZyZWUKLXN0YXRpYyBDT05TVCBjaGFyICpzdGFydHVwX2ZpbGU7Ci1zdGF0aWMgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGlucHV0X2ZpbGVfY2hhaW47Ci1zdGF0aWMgYm9vbGVhbiBwbGFjZWRfY29tbW9ucyA9IGZhbHNlOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmRlZmF1bHRfY29tbW9uX3NlY3Rpb247Ci1zdGF0aWMgYm9vbGVhbiBtYXBfb3B0aW9uX2Y7Ci1zdGF0aWMgYmZkX3ZtYSBwcmludF9kb3Q7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlyc3RfZmlsZTsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci1zdGF0aWMgQ09OU1QgY2hhciAqY3VycmVudF90YXJnZXQ7Ci1zdGF0aWMgQ09OU1QgY2hhciAqb3V0cHV0X3RhcmdldDsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgc3RhdGVtZW50X2xpc3Q7Ci1zdGF0aWMgc3RydWN0IGxhbmdfcGhkciAqbGFuZ19waGRyX2xpc3Q7Ci0KLXN0YXRpYyB2b2lkIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcgotICBQQVJBTVMgKCh2b2lkICgqZnVuYykgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiksCi0JICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcykpOwotc3RhdGljIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKm5ld19hZmlsZQotICBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlIGZpbGVfdHlwZSwKLQkgICBjb25zdCBjaGFyICp0YXJnZXQsIGJvb2xlYW4gYWRkX3RvX2xpc3QpKTsKLXN0YXRpYyB2b2lkIGluaXRfb3MgUEFSQU1TICgobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqcykpOwotc3RhdGljIHZvaWQgZXhwX2luaXRfb3MgUEFSQU1TICgoZXRyZWVfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBzZWN0aW9uX2FscmVhZHlfbGlua2VkIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyBib29sZWFuIHdpbGRjYXJkcCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp3aWxkX3NvcnQKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwKLQkgICBhc2VjdGlvbiAqKSk7Ci1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqbG9va3VwX25hbWUgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIHZvaWQgbG9hZF9zeW1ib2xzIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5LAotCQkJCSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICopKTsKLXN0YXRpYyB2b2lkIHdpbGQgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzLAotCQkJICBjb25zdCBjaGFyICpzZWN0aW9uLCBjb25zdCBjaGFyICpmaWxlLAotCQkJICBjb25zdCBjaGFyICp0YXJnZXQsCi0JCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dCkpOwotc3RhdGljIGJmZCAqb3Blbl9vdXRwdXQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotc3RhdGljIHZvaWQgbGRsYW5nX29wZW5fb3V0cHV0IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgb3Blbl9pbnB1dF9iZmRzCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXRlbWVudCwgYm9vbGVhbikpOwotc3RhdGljIHZvaWQgbGFuZ19yZWFzb25hYmxlX2RlZmF1bHRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfcGxhY2VfdW5kZWZpbmVkcyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnMsCi0JICAgY29uc3QgY2hhciAqdGFyZ2V0LAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgcHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCkpOwotc3RhdGljIHZvaWQgcHJpbnRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKmFzc2lnbm1lbnQsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3V0cHV0X3NlY3Rpb24pKTsKLXN0YXRpYyB2b2lkIHByaW50X2lucHV0X3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpzdGF0bSkpOwotc3RhdGljIGJvb2xlYW4gcHJpbnRfb25lX3N5bWJvbCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIHByaW50X2lucHV0X3NlY3Rpb24gUEFSQU1TICgobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmluKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9maWxsX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKmZpbGwpKTsKLXN0YXRpYyB2b2lkIHByaW50X2RhdGFfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZSAqZGF0YSkpOwotc3RhdGljIHZvaWQgcHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICopKTsKLXN0YXRpYyB2b2lkIHByaW50X3JlbG9jX3N0YXRlbWVudCBQQVJBTVMgKChsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlICpyZWxvYykpOwotc3RhdGljIHZvaWQgcHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlICpzKSk7Ci1zdGF0aWMgdm9pZCBwcmludF93aWxkX3N0YXRlbWVudAotICBQQVJBTVMgKChsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKncsCi0JICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3MpKTsKLXN0YXRpYyB2b2lkIHByaW50X2dyb3VwCi0gIFBBUkFNUyAoKGxhbmdfZ3JvdXBfc3RhdGVtZW50X3R5cGUgKiwgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcywKLQkJCQkgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnRfbGlzdCBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzLAotCQkJCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9zdGF0ZW1lbnRzIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBiZmRfdm1hIGluc2VydF9wYWQgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnRoaXNfcHRyLAotCQkJCSAgIGZpbGxfdHlwZSBmaWxsLCB1bnNpZ25lZCBpbnQgcG93ZXIsCi0JCQkJICAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICBiZmRfdm1hIGRvdCkpOwotc3RhdGljIGJmZF92bWEgc2l6ZV9pbnB1dF9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKip0aGlzX3B0ciwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JICAgZmlsbF90eXBlIGZpbGwsIGJmZF92bWEgZG90LCBib29sZWFuIHJlbGF4KSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2ZpbmlzaCBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBpZ25vcmVfYmZkX2Vycm9ycyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotc3RhdGljIHZvaWQgbGFuZ19jaGVjayBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2NvbW1vbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgYm9vbGVhbiBsYW5nX29uZV9jb21tb24gUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKiwgUFRSKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3BsYWNlX29ycGhhbnMgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCB0b3Bvd2VyIFBBUkFNUyAoKGludCkpOwotc3RhdGljIHZvaWQgbGFuZ19zZXRfc3RhcnRvZiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCByZXNldF9tZW1vcnlfcmVnaW9ucyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX3JlY29yZF9waGRycyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3dpbGQKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3NlY3Rpb25zXzEgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBsYW5nX2djX3NlY3Rpb25zIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGxhbmdfZG9fdmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGFuZ19jaGVja19zZWN0aW9uX2FkZHJlc3NlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLXR5cGVkZWYgdm9pZCAoKmNhbGxiYWNrX3QpIFBBUkFNUyAoKGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqLAotCQkJCSAgICBhc2VjdGlvbiAqLCBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosCi0JCQkJICAgIHZvaWQgKikpOwotc3RhdGljIHZvaWQgd2Fsa193aWxkX3NlY3Rpb24KLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwKLQkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGNhbGxiYWNrX3QsIHZvaWQgKikpOwotc3RhdGljIHZvaWQgd2Fsa193aWxkX2ZpbGUKLSAgUEFSQU1TICgobGFuZ193aWxkX3N0YXRlbWVudF90eXBlICosIGNvbnN0IGNoYXIgKiwKLQkgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICosIGNhbGxiYWNrX3QsIHZvaWQgKikpOwotCQkJCQkKLS8qIEVYUE9SVFMgKi8KLWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmFic19vdXRwdXRfc2VjdGlvbjsKLWxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc3RhdF9wdHIgPSAmc3RhdGVtZW50X2xpc3Q7Ci1sYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgZmlsZV9jaGFpbiA9IHsgMCB9OwotY29uc3QgY2hhciAqZW50cnlfc3ltYm9sID0gTlVMTDsKLWJvb2xlYW4gZW50cnlfZnJvbV9jbWRsaW5lOwotYm9vbGVhbiBsYW5nX2hhc19pbnB1dF9maWxlID0gZmFsc2U7Ci1ib29sZWFuIGhhZF9vdXRwdXRfZmlsZW5hbWUgPSBmYWxzZTsKLWJvb2xlYW4gbGFuZ19mbG9hdF9mbGFnID0gZmFsc2U7Ci1ib29sZWFuIGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlID0gZmFsc2U7Ci1zdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbm9jcm9zc3JlZl9saXN0OwotCi1ldHJlZV90eXBlICpiYXNlOyAvKiBSZWxvY2F0aW9uIGJhc2UgLSBvciBudWxsICovCi0KLQotI2lmIGRlZmluZWQoX19TVERDX18pIHx8IGRlZmluZWQoQUxNT1NUX1NUREMpCi0jZGVmaW5lIGNhdChhLGIpIGEjI2IKLSNlbHNlCi0jZGVmaW5lIGNhdChhLGIpIGEvKiovYgotI2VuZGlmCi0KLSNkZWZpbmUgbmV3X3N0YXQoeCx5KSAoY2F0KHgsX3R5cGUpKikgbmV3X3N0YXRlbWVudChjYXQoeCxfZW51bSksIHNpemVvZihjYXQoeCxfdHlwZSkpLHkpCi0KLSNkZWZpbmUgb3V0c2lkZV9zZWN0aW9uX2FkZHJlc3MocSkgKCAocSktPm91dHB1dF9vZmZzZXQgKyAocSktPm91dHB1dF9zZWN0aW9uLT52bWEpCi0KLSNkZWZpbmUgb3V0c2lkZV9zeW1ib2xfYWRkcmVzcyhxKSAoKHEpLT52YWx1ZSArICAgb3V0c2lkZV9zZWN0aW9uX2FkZHJlc3MocS0+c2VjdGlvbikpCi0KLSNkZWZpbmUgU0VDVElPTl9OQU1FX01BUF9MRU5HVEggKDE2KQotCi1QVFIKLXN0YXRfYWxsb2MgKHNpemUpCi0gICAgIHNpemVfdCBzaXplOwotewotICByZXR1cm4gb2JzdGFja19hbGxvYyAoJnN0YXRfb2JzdGFjaywgc2l6ZSk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBHZW5lcmljIHRyYXZlcnNhbCByb3V0aW5lcyBmb3IgZmluZGluZyBtYXRjaGluZyBzZWN0aW9ucy4KLSovCi0KLXN0YXRpYyB2b2lkCi13YWxrX3dpbGRfc2VjdGlvbiAocHRyLCBzZWN0aW9uLCBmaWxlLCBjYWxsYmFjaywgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGNhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIC8qIERvbid0IHByb2Nlc3Mgc2VjdGlvbnMgZnJvbSBmaWxlcyB3aGljaCB3ZXJlIGV4Y2x1ZGVkLiAqLwotICBpZiAocHRyLT5leGNsdWRlX2ZpbGVuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgYm9vbGVhbiBtYXRjaDsKLQotICAgICAgaWYgKHdpbGRjYXJkcCAocHRyLT5leGNsdWRlX2ZpbGVuYW1lKSkKLSAgICAgICAgIG1hdGNoID0gZm5tYXRjaCAocHRyLT5leGNsdWRlX2ZpbGVuYW1lLCBmaWxlLT5maWxlbmFtZSwgMCkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgIG1hdGNoID0gc3RyY21wIChwdHItPmV4Y2x1ZGVfZmlsZW5hbWUsIGZpbGUtPmZpbGVuYW1lKSA9PSAwID8gdHJ1ZSA6IGZhbHNlOwotCi0gICAgICBpZiAobWF0Y2gpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKGZpbGUtPmp1c3Rfc3ltc19mbGFnID09IGZhbHNlKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGFzZWN0aW9uICpzOwotICAgICAgYm9vbGVhbiB3aWxkY2FyZDsKLQotICAgICAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQl3aWxkY2FyZCA9IGZhbHNlOwotICAgICAgZWxzZQotCXdpbGRjYXJkID0gd2lsZGNhcmRwIChzZWN0aW9uKTsKLQotICAgICAgZm9yIChzID0gZmlsZS0+dGhlX2JmZC0+c2VjdGlvbnM7IHMgIT0gTlVMTDsgcyA9IHMtPm5leHQpCi0JewotCSAgYm9vbGVhbiBtYXRjaDsKLQotCSAgaWYgKHNlY3Rpb24gPT0gTlVMTCkKLQkgICAgbWF0Y2ggPSB0cnVlOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotCSAgICAgIG5hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmlsZS0+dGhlX2JmZCwgcyk7Ci0JICAgICAgaWYgKHdpbGRjYXJkKQotCQltYXRjaCA9IGZubWF0Y2ggKHNlY3Rpb24sIG5hbWUsIDApID09IDAgPyB0cnVlIDogZmFsc2U7Ci0JICAgICAgZWxzZQotCQltYXRjaCA9IHN0cmNtcCAoc2VjdGlvbiwgbmFtZSkgPT0gMCA/IHRydWUgOiBmYWxzZTsKLQkgICAgfQotCi0JICBpZiAobWF0Y2gpCi0JICAgICgqY2FsbGJhY2spIChwdHIsIHMsIGZpbGUsIGRhdGEpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEhhbmRsZSBhIHdpbGQgc3RhdGVtZW50IGZvciBhIHNpbmdsZSBmaWxlIEYuICAqLwotCi1zdGF0aWMgdm9pZAotd2Fsa193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKnM7Ci0gICAgIGNvbnN0IGNoYXIgKnNlY3Rpb247Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmY7Ci0gICAgIGNhbGxiYWNrX3QgY2FsbGJhY2s7Ci0gICAgIHZvaWQgKmRhdGE7Ci17Ci0gIGlmIChmLT50aGVfYmZkID09IE5VTEwKLSAgICAgIHx8ICEgYmZkX2NoZWNrX2Zvcm1hdCAoZi0+dGhlX2JmZCwgYmZkX2FyY2hpdmUpKQotICAgIHdhbGtfd2lsZF9zZWN0aW9uIChzLCBzZWN0aW9uLCBmLCBjYWxsYmFjaywgZGF0YSk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBiZmQgKm1lbWJlcjsKLQotICAgICAgLyogVGhpcyBpcyBhbiBhcmNoaXZlIGZpbGUuICBXZSBtdXN0IG1hcCBlYWNoIG1lbWJlciBvZiB0aGUKLQkgYXJjaGl2ZSBzZXBhcmF0ZWx5LiAgKi8KLSAgICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGYtPnRoZV9iZmQsIChiZmQgKikgTlVMTCk7Ci0gICAgICB3aGlsZSAobWVtYmVyICE9IE5VTEwpCi0JewotCSAgLyogV2hlbiBsb29rdXBfbmFtZSBpcyBjYWxsZWQsIGl0IHdpbGwgY2FsbCB0aGUgYWRkX3N5bWJvbHMKLQkgICAgIGVudHJ5IHBvaW50IGZvciB0aGUgYXJjaGl2ZS4gIEZvciBlYWNoIGVsZW1lbnQgb2YgdGhlCi0JICAgICBhcmNoaXZlIHdoaWNoIGlzIGluY2x1ZGVkLCBCRkQgd2lsbCBjYWxsIGxkbGFuZ19hZGRfZmlsZSwKLQkgICAgIHdoaWNoIHdpbGwgc2V0IHRoZSB1c3JkYXRhIGZpZWxkIG9mIHRoZSBtZW1iZXIgdG8gdGhlCi0JICAgICBsYW5nX2lucHV0X3N0YXRlbWVudC4gICovCi0JICBpZiAobWVtYmVyLT51c3JkYXRhICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICB3YWxrX3dpbGRfc2VjdGlvbiAocywgc2VjdGlvbiwKLQkJCQkgKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgbWVtYmVyLT51c3JkYXRhLAotCQkJCSBjYWxsYmFjaywgZGF0YSk7Ci0JICAgIH0KLQotCSAgbWVtYmVyID0gYmZkX29wZW5yX25leHRfYXJjaGl2ZWRfZmlsZSAoZi0+dGhlX2JmZCwgbWVtYmVyKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotd2Fsa193aWxkIChzLCBzZWN0aW9uLCBmaWxlLCBjYWxsYmFjaywgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBjYWxsYmFja190IGNhbGxiYWNrOwotICAgICB2b2lkICpkYXRhOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gIGlmIChmaWxlID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgLyogUGVyZm9ybSB0aGUgaXRlcmF0aW9uIG92ZXIgYWxsIGZpbGVzIGluIHRoZSBsaXN0LiAgKi8KLSAgICAgIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGZpbGVfY2hhaW4uaGVhZDsKLQkgICBmICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0JICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHQpCi0JewotCSAgd2Fsa193aWxkX2ZpbGUgKHMsIHNlY3Rpb24sIGYsIGNhbGxiYWNrLCBkYXRhKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICh3aWxkY2FyZHAgKGZpbGUpKQotICAgIHsKLSAgICAgIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGZpbGVfY2hhaW4uaGVhZDsKLQkgICBmICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0JICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHQpCi0JewotCSAgaWYgKGZubWF0Y2ggKGZpbGUsIGYtPmZpbGVuYW1lLCBGTk1fRklMRV9OQU1FKSA9PSAwKQotCSAgICB3YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBQZXJmb3JtIHRoZSBpdGVyYXRpb24gb3ZlciBhIHNpbmdsZSBmaWxlLiAgKi8KLSAgICAgIGYgPSBsb29rdXBfbmFtZSAoZmlsZSk7Ci0gICAgICB3YWxrX3dpbGRfZmlsZSAocywgc2VjdGlvbiwgZiwgY2FsbGJhY2ssIGRhdGEpOwotICAgIH0KLX0gIAotICAgICAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCB3YWxrcyB0aGUgcGFyc2UgdHJlZSBhbmQgY2FsbHMgdGhlIHByb3ZpZGVkCi0gIGZ1bmN0aW9uIGZvciBlYWNoIG5vZGUKLSovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsIHMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgZnVuYyAocyk7Ci0KLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsIGNvbnN0cnVjdG9yX2xpc3QuaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIKLQkgICAgKGZ1bmMsCi0JICAgICBzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50X3dvcmtlcgotCSAgICAoZnVuYywKLQkgICAgIHMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnRfd29ya2VyIChmdW5jLAotCQkJCQkgIHMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19maWxsX3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZnVuYykKLSAgICAgdm9pZCAoKmZ1bmMpIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotewotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudF93b3JrZXIgKGZ1bmMsCi0JCQkJICBzdGF0ZW1lbnRfbGlzdC5oZWFkKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLWxhbmdfbGlzdF9pbml0IChsaXN0KQotICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKmxpc3Q7Ci17Ci0gIGxpc3QtPmhlYWQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICBsaXN0LT50YWlsID0gJmxpc3QtPmhlYWQ7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIGJ1aWxkIGEgbmV3IHN0YXRlbWVudCBub2RlIGZvciB0aGUgcGFyc2UgdHJlZQotCi0gKi8KLQotc3RhdGljCi1sYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoKLW5ld19zdGF0ZW1lbnQgKHR5cGUsIHNpemUsIGxpc3QpCi0gICAgIGVudW0gc3RhdGVtZW50X2VudW0gdHlwZTsKLSAgICAgc2l6ZV90IHNpemU7Ci0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqIGxpc3Q7Ci17Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ldyA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopCi0gIHN0YXRfYWxsb2MgKHNpemUpOwotCi0gIG5ldy0+aGVhZGVyLnR5cGUgPSB0eXBlOwotICBuZXctPmhlYWRlci5uZXh0ID0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsKLSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kIChsaXN0LCBuZXcsICZuZXctPmhlYWRlci5uZXh0KTsKLSAgcmV0dXJuIG5ldzsKLX0KLQotLyoKLSAgQnVpbGQgYSBuZXcgaW5wdXQgZmlsZSBub2RlIGZvciB0aGUgbGFuZ3VhZ2UuIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMKLSAgaW4gd2hpY2ggd2UgdHJlYXQgYW4gaW5wdXQgZmlsZSwgZWcsIHdlIG9ubHkgbG9vayBhdCBzeW1ib2xzLCBvcgotICBwcmVmaXggaXQgd2l0aCBhIC1sIGV0Yy4KLQotICBXZSBjYW4gYmUgc3VwcGxpZWQgd2l0aCByZXF1ZXN0cyBmb3IgaW5wdXQgZmlsZXMgbW9yZSB0aGFuIG9uY2U7Ci0gIHRoZXkgbWF5LCBmb3IgZXhhbXBsZSBiZSBzcGxpdCBvdmVyIHNlcnZlcmFsIGxpbmVzIGxpa2UgZm9vLm8oLnRleHQpCi0gIGZvby5vKC5kYXRhKSBldGMsIHNvIHdoZW4gYXNrZWQgZm9yIGEgZmlsZSB3ZSBjaGVjayB0aGF0IHdlIGhhdm4ndAotICBnb3QgaXQgYWxyZWFkeSBzbyB3ZSBkb24ndCBkdXBsaWNhdGUgdGhlIGJmZC4KLQotICovCi1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqCi1uZXdfYWZpbGUgKG5hbWUsIGZpbGVfdHlwZSwgdGFyZ2V0LCBhZGRfdG9fbGlzdCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBmaWxlX3R5cGU7Ci0gICAgIENPTlNUIGNoYXIgKnRhcmdldDsKLSAgICAgYm9vbGVhbiBhZGRfdG9fbGlzdDsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqcDsKLQotICBpZiAoYWRkX3RvX2xpc3QpCi0gICAgcCA9IG5ld19zdGF0IChsYW5nX2lucHV0X3N0YXRlbWVudCwgc3RhdF9wdHIpOwotICBlbHNlCi0gICAgewotICAgICAgcCA9ICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKQotCSAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSkpKTsKLSAgICAgIHAtPmhlYWRlci5uZXh0ID0gTlVMTDsKLSAgICB9Ci0KLSAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IHRydWU7Ci0gIHAtPnRhcmdldCA9IHRhcmdldDsKLSAgc3dpdGNoIChmaWxlX3R5cGUpCi0gICAgewotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX3N5bWJvbHNfb25seV9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IHRydWU7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IHRydWU7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfaW5wdXRfZmlsZV9pc19mYWtlX2VudW06Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5pc19hcmNoaXZlID0gZmFsc2U7Ci0gICAgICBwLT5yZWFsID0gZmFsc2U7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfbF9lbnVtOgotICAgICAgcC0+aXNfYXJjaGl2ZSA9IHRydWU7Ci0gICAgICBwLT5maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5yZWFsID0gdHJ1ZTsKLSAgICAgIHAtPmxvY2FsX3N5bV9uYW1lID0gY29uY2F0ICgiLWwiLCBuYW1lLCAoY29uc3QgY2hhciAqKSBOVUxMKTsKLSAgICAgIHAtPmp1c3Rfc3ltc19mbGFnID0gZmFsc2U7Ci0gICAgICBwLT5zZWFyY2hfZGlyc19mbGFnID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9maWxlX2lzX21hcmtlcl9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IGZhbHNlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bToKLSAgICAgIHAtPmZpbGVuYW1lID0gbmFtZTsKLSAgICAgIHAtPmlzX2FyY2hpdmUgPSBmYWxzZTsKLSAgICAgIHAtPnJlYWwgPSB0cnVlOwotICAgICAgcC0+bG9jYWxfc3ltX25hbWUgPSBuYW1lOwotICAgICAgcC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgICAgIHAtPnNlYXJjaF9kaXJzX2ZsYWcgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtOgotICAgICAgcC0+ZmlsZW5hbWUgPSBuYW1lOwotICAgICAgcC0+aXNfYXJjaGl2ZSA9IGZhbHNlOwotICAgICAgcC0+cmVhbCA9IHRydWU7Ci0gICAgICBwLT5sb2NhbF9zeW1fbmFtZSA9IG5hbWU7Ci0gICAgICBwLT5qdXN0X3N5bXNfZmxhZyA9IGZhbHNlOwotICAgICAgcC0+c2VhcmNoX2RpcnNfZmxhZyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEZBSUwgKCk7Ci0gICAgfQotICBwLT50aGVfYmZkID0gKGJmZCAqKSBOVUxMOwotICBwLT5hc3ltYm9scyA9IChhc3ltYm9sICoqKSBOVUxMOwotICBwLT5uZXh0X3JlYWxfZmlsZSA9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gIHAtPm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICBwLT5zeW1ib2xfY291bnQgPSAwOwotICBwLT5keW5hbWljID0gY29uZmlnLmR5bmFtaWNfbGluazsKLSAgcC0+d2hvbGVfYXJjaGl2ZSA9IHdob2xlX2FyY2hpdmU7Ci0gIHAtPmxvYWRlZCA9IGZhbHNlOwotICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZpbnB1dF9maWxlX2NoYWluLAotCQkJIChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIHAsCi0JCQkgJnAtPm5leHRfcmVhbF9maWxlKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLWxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKgotbGFuZ19hZGRfaW5wdXRfZmlsZSAobmFtZSwgZmlsZV90eXBlLCB0YXJnZXQpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGxhbmdfaW5wdXRfZmlsZV9lbnVtX3R5cGUgZmlsZV90eXBlOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci17Ci0gIGxhbmdfaGFzX2lucHV0X2ZpbGUgPSB0cnVlOwotICByZXR1cm4gbmV3X2FmaWxlIChuYW1lLCBmaWxlX3R5cGUsIHRhcmdldCwgdHJ1ZSk7Ci19Ci0KLS8qIEJ1aWxkIGVub3VnaCBzdGF0ZSBzbyB0aGF0IHRoZSBwYXJzZXIgY2FuIGJ1aWxkIGl0cyB0cmVlICovCi12b2lkCi1sYW5nX2luaXQgKCkKLXsKLSAgb2JzdGFja19iZWdpbiAoJnN0YXRfb2JzdGFjaywgMTAwMCk7Ci0KLSAgc3RhdF9wdHIgPSAmc3RhdGVtZW50X2xpc3Q7Ci0KLSAgbGFuZ19saXN0X2luaXQgKHN0YXRfcHRyKTsKLQotICBsYW5nX2xpc3RfaW5pdCAoJmlucHV0X2ZpbGVfY2hhaW4pOwotICBsYW5nX2xpc3RfaW5pdCAoJmxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLSAgbGFuZ19saXN0X2luaXQgKCZmaWxlX2NoYWluKTsKLSAgZmlyc3RfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKChjaGFyICopIE5VTEwsCi0JCQkJICAgIGxhbmdfaW5wdXRfZmlsZV9pc19tYXJrZXJfZW51bSwKLQkJCQkgICAgKGNoYXIgKikgTlVMTCk7Ci0gIGFic19vdXRwdXRfc2VjdGlvbiA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoQkZEX0FCU19TRUNUSU9OX05BTUUpOwotCi0gIGFic19vdXRwdXRfc2VjdGlvbi0+YmZkX3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCi19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIEEgcmVnaW9uIGlzIGFuIGFyZWEgb2YgbWVtb3J5IGRlY2xhcmVkIHdpdGggdGhlCi0gTUVNT1JZIHsgIG5hbWU6b3JnPWV4cCwgbGVuPWV4cCAuLi4gfQotIHN5bnRheC4KLQotIFdlIG1haW50YWluIGEgbGlzdCBvZiBhbGwgdGhlIHJlZ2lvbnMgaGVyZQotCi0gSWYgbm8gcmVnaW9ucyBhcmUgc3BlY2lmaWVkIGluIHRoZSBzY3JpcHQsIHRoZW4gdGhlIGRlZmF1bHQgaXMgdXNlZAotIHdoaWNoIGlzIGNyZWF0ZWQgd2hlbiBsb29rZWQgdXAgdG8gYmUgdGhlIGVudGlyZSBkYXRhIHNwYWNlCi0qLwotCi1zdGF0aWMgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKmxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0Owotc3RhdGljIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICoqbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3RfdGFpbCA9ICZsYW5nX21lbW9yeV9yZWdpb25fbGlzdDsKLQotbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKgotbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqQ09OU1QgbmFtZTsKLXsKLSAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnA7Ci0KLSAgZm9yIChwID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0gICAgICAgcCAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChwLT5uYW1lLCBuYW1lKSA9PSAwKQotCXsKLQkgIHJldHVybiBwOwotCX0KLSAgICB9Ci0KLSNpZiAwCi0gIC8qIFRoaXMgY29kZSB1c2VkIHRvIGFsd2F5cyB1c2UgdGhlIGZpcnN0IHJlZ2lvbiBpbiB0aGUgbGlzdCBhcyB0aGUKLSAgICAgZGVmYXVsdCByZWdpb24uICBJIGNoYW5nZWQgaXQgdG8gaW5zdGVhZCB1c2UgYSByZWdpb24KLSAgICAgZW5jb21wYXNzaW5nIGFsbCBvZiBtZW1vcnkgYXMgdGhlIGRlZmF1bHQgcmVnaW9uLiAgVGhpcyBwZXJtaXRzCi0gICAgIE5PTE9BRCBzZWN0aW9ucyB0byB3b3JrIHJlYXNvbmFibHkgd2l0aG91dCByZXF1aXJpbmcgYSByZWdpb24uCi0gICAgIFBlb3BsZSBzaG91bGQgc3BlY2lmeSB3aGF0IHJlZ2lvbiB0aGV5IG1lYW4sIGlmIHRoZXkgcmVhbGx5IHdhbnQKLSAgICAgYSByZWdpb24uICAqLwotICBpZiAoc3RyY21wIChuYW1lLCAiKmRlZmF1bHQqIikgPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobGFuZ19tZW1vcnlfcmVnaW9uX2xpc3QgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEwpCi0JewotCSAgcmV0dXJuIGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotCX0KLSAgICB9Ci0jZW5kaWYKLQotICB7Ci0gICAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKm5ldyA9Ci0gICAgKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUpKTsKLQotICAgIG5ldy0+bmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7Ci0gICAgbmV3LT5uZXh0ID0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0KLSAgICAqbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3RfdGFpbCA9IG5ldzsKLSAgICBsYW5nX21lbW9yeV9yZWdpb25fbGlzdF90YWlsID0gJm5ldy0+bmV4dDsKLSAgICBuZXctPm9yaWdpbiA9IDA7Ci0gICAgbmV3LT5mbGFncyA9IDA7Ci0gICAgbmV3LT5ub3RfZmxhZ3MgPSAwOwotICAgIG5ldy0+bGVuZ3RoID0gfihiZmRfc2l6ZV90eXBlKTA7Ci0gICAgbmV3LT5jdXJyZW50ID0gMDsKLSAgICBuZXctPmhhZF9mdWxsX21lc3NhZ2UgPSBmYWxzZTsKLQotICAgIHJldHVybiBuZXc7Ci0gIH0KLX0KLQotCi1sYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqCi1sYW5nX21lbW9yeV9kZWZhdWx0IChzZWN0aW9uKQotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLXsKLSAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnA7Ci0KLSAgZmxhZ3dvcmQgc2VjX2ZsYWdzID0gc2VjdGlvbi0+ZmxhZ3M7Ci0KLSAgLyogT3ZlcnJpZGUgU0VDX0RBVEEgdG8gbWVhbiBhIHdyaXRhYmxlIHNlY3Rpb24uICAqLwotICBpZiAoKHNlY19mbGFncyAmIChTRUNfQUxMT0MgfCBTRUNfUkVBRE9OTFkgfCBTRUNfQ09ERSkpID09IFNFQ19BTExPQykKLSAgICBzZWNfZmxhZ3MgfD0gU0VDX0RBVEE7Ci0KLSAgZm9yIChwID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0gICAgICAgcCAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoKHAtPmZsYWdzICYgc2VjX2ZsYWdzKSAhPSAwCi0JICAmJiAocC0+bm90X2ZsYWdzICYgc2VjX2ZsYWdzKSA9PSAwKQotCXsKLQkgIHJldHVybiBwOwotCX0KLSAgICB9Ci0gIHJldHVybiBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwICgiKmRlZmF1bHQqIik7Ci19Ci0KLWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKgotbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChuYW1lKQotICAgICBDT05TVCBjaGFyICpDT05TVCBuYW1lOwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICp1OwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpsb29rdXA7Ci0KLSAgZm9yICh1ID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuaGVhZDsKLSAgICAgICB1ICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gICAgICAgdSA9IGxvb2t1cC0+bmV4dCkKLSAgICB7Ci0gICAgICBsb29rdXAgPSAmdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICAgaWYgKHN0cmNtcCAobmFtZSwgbG9va3VwLT5uYW1lKSA9PSAwKQotCXsKLQkgIHJldHVybiBsb29rdXA7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci19Ci0KLWxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKgotbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwIChuYW1lKQotICAgICBDT05TVCBjaGFyICpDT05TVCBuYW1lOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpsb29rdXA7Ci0KLSAgbG9va3VwID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kIChuYW1lKTsKLSAgaWYgKGxvb2t1cCA9PSAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMKQotICAgIHsKLQotICAgICAgbG9va3VwID0gKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikKLQluZXdfc3RhdCAobGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLSAgICAgIGxvb2t1cC0+cmVnaW9uID0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICBsb29rdXAtPmZpbGwgPSAwOwotICAgICAgbG9va3VwLT5ibG9ja192YWx1ZSA9IDE7Ci0gICAgICBsb29rdXAtPm5hbWUgPSBuYW1lOwotCi0gICAgICBsb29rdXAtPm5leHQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBOVUxMOwotICAgICAgbG9va3VwLT5iZmRfc2VjdGlvbiA9IChhc2VjdGlvbiAqKSBOVUxMOwotICAgICAgbG9va3VwLT5wcm9jZXNzZWQgPSBmYWxzZTsKLSAgICAgIGxvb2t1cC0+c2VjdHlwZSA9IG5vcm1hbF9zZWN0aW9uOwotICAgICAgbG9va3VwLT5hZGRyX3RyZWUgPSAoZXRyZWVfdHlwZSAqKSBOVUxMOwotICAgICAgbGFuZ19saXN0X2luaXQgKCZsb29rdXAtPmNoaWxkcmVuKTsKLQotICAgICAgbG9va3VwLT5tZW1zcGVjID0gKENPTlNUIGNoYXIgKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+ZmxhZ3MgPSAwOwotICAgICAgbG9va3VwLT5zdWJzZWN0aW9uX2FsaWdubWVudCA9IC0xOwotICAgICAgbG9va3VwLT5zZWN0aW9uX2FsaWdubWVudCA9IC0xOwotICAgICAgbG9va3VwLT5sb2FkX2Jhc2UgPSAodW5pb24gZXRyZWVfdW5pb24gKikgTlVMTDsKLSAgICAgIGxvb2t1cC0+cGhkcnMgPSBOVUxMOwotCi0gICAgICBsYW5nX3N0YXRlbWVudF9hcHBlbmQgKCZsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCSAgICAgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgbG9va3VwLAotCQkJICAgICAmbG9va3VwLT5uZXh0KTsKLSAgICB9Ci0gIHJldHVybiBsb29rdXA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1sYW5nX21hcF9mbGFncyAoZmxhZykKLSAgICAgZmxhZ3dvcmQgZmxhZzsKLXsKLSAgaWYgKGZsYWcgJiBTRUNfQUxMT0MpCi0gICAgbWluZm8gKCJhIik7Ci0KLSAgaWYgKGZsYWcgJiBTRUNfQ09ERSkKLSAgICBtaW5mbyAoIngiKTsKLQotICBpZiAoZmxhZyAmIFNFQ19SRUFET05MWSkKLSAgICBtaW5mbyAoInIiKTsKLQotICBpZiAoZmxhZyAmIFNFQ19EQVRBKQotICAgIG1pbmZvICgidyIpOwotCi0gIGlmIChmbGFnICYgU0VDX0xPQUQpCi0gICAgbWluZm8gKCJsIik7Ci19Ci0KLXZvaWQKLWxhbmdfbWFwICgpCi17Ci0gIGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICptOwotCi0gIG1pbmZvIChfKCJcbk1lbW9yeSBDb25maWd1cmF0aW9uXG5cbiIpKTsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiJS0xNnMgJS0xOHMgJS0xOHMgJXNcbiIsCi0JICAgXygiTmFtZSIpLCBfKCJPcmlnaW4iKSwgXygiTGVuZ3RoIiksIF8oIkF0dHJpYnV0ZXMiKSk7Ci0KLSAgZm9yIChtID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xpc3Q7Ci0gICAgICAgbSAhPSAobGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKikgTlVMTDsKLSAgICAgICBtID0gbS0+bmV4dCkKLSAgICB7Ci0gICAgICBjaGFyIGJ1ZlsxMDBdOwotICAgICAgaW50IGxlbjsKLQotICAgICAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiJS0xNnMgIiwgbS0+bmFtZSk7Ci0KLSAgICAgIHNwcmludGZfdm1hIChidWYsIG0tPm9yaWdpbik7Ci0gICAgICBtaW5mbyAoIjB4JXMgIiwgYnVmKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmKTsKLSAgICAgIHdoaWxlIChsZW4gPCAxNikKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgbWluZm8gKCIweCVWIiwgbS0+bGVuZ3RoKTsKLSAgICAgIGlmIChtLT5mbGFncyB8fCBtLT5ub3RfZmxhZ3MpCi0JewotI2lmbmRlZiBCRkQ2NAotCSAgbWluZm8gKCIgICAgICAgICIpOwotI2VuZGlmCi0JICBpZiAobS0+ZmxhZ3MpCi0JICAgIHsKLQkgICAgICBwcmludF9zcGFjZSAoKTsKLQkgICAgICBsYW5nX21hcF9mbGFncyAobS0+ZmxhZ3MpOwotCSAgICB9Ci0KLQkgIGlmIChtLT5ub3RfZmxhZ3MpCi0JICAgIHsKLQkgICAgICBtaW5mbyAoIiAhIik7Ci0JICAgICAgbGFuZ19tYXBfZmxhZ3MgKG0tPm5vdF9mbGFncyk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHByaW50X25sICgpOwotICAgIH0KLQotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsIF8oIlxuTGlua2VyIHNjcmlwdCBhbmQgbWVtb3J5IG1hcFxuXG4iKSk7Ci0KLSAgcHJpbnRfc3RhdGVtZW50cyAoKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbiBvdXRwdXQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi1pbml0X29zIChzKQotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpzOwotewotICBzZWN0aW9uX3VzZXJkYXRhX3R5cGUgKm5ldzsKLQotICBpZiAocy0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHN0cmNtcCAocy0+bmFtZSwgRElTQ0FSRF9TRUNUSU9OX05BTUUpID09IDApCi0gICAgZWluZm8gKF8oIiVQJUY6IElsbGVnYWwgdXNlIG9mIGAlcycgc2VjdGlvbiIpLCBESVNDQVJEX1NFQ1RJT05fTkFNRSk7Ci0KLSAgbmV3ID0gKChzZWN0aW9uX3VzZXJkYXRhX3R5cGUgKikKLQkgc3RhdF9hbGxvYyAoc2l6ZW9mIChzZWN0aW9uX3VzZXJkYXRhX3R5cGUpKSk7Ci0KLSAgcy0+YmZkX3NlY3Rpb24gPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAob3V0cHV0X2JmZCwgcy0+bmFtZSk7Ci0gIGlmIChzLT5iZmRfc2VjdGlvbiA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLSAgICBzLT5iZmRfc2VjdGlvbiA9IGJmZF9tYWtlX3NlY3Rpb24gKG91dHB1dF9iZmQsIHMtPm5hbWUpOwotICBpZiAocy0+YmZkX3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIiksCi0JICAgICBvdXRwdXRfYmZkLT54dmVjLT5uYW1lLCBzLT5uYW1lKTsKLSAgICB9Ci0gIHMtPmJmZF9zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IHMtPmJmZF9zZWN0aW9uOwotCi0gIC8qIFdlIGluaXRpYWxpemUgYW4gb3V0cHV0IHNlY3Rpb25zIG91dHB1dCBvZmZzZXQgdG8gbWludXMgaXRzIG93biAqLwotICAvKiB2bWEgdG8gYWxsb3cgdXMgdG8gb3V0cHV0IGEgc2VjdGlvbiB0aHJvdWdoIGl0c2VsZiAqLwotICBzLT5iZmRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IDA7Ci0gIGdldF91c2VyZGF0YSAocy0+YmZkX3NlY3Rpb24pID0gKFBUUikgbmV3OwotCi0gIC8qIElmIHRoZXJlIGlzIGEgYmFzZSBhZGRyZXNzLCBtYWtlIHN1cmUgdGhhdCBhbnkgc2VjdGlvbnMgaXQgbWlnaHQKLSAgICAgbWVudGlvbiBhcmUgaW5pdGlhbGl6ZWQuICAqLwotICBpZiAocy0+YWRkcl90cmVlICE9IE5VTEwpCi0gICAgZXhwX2luaXRfb3MgKHMtPmFkZHJfdHJlZSk7Ci19Ci0KLS8qIE1ha2Ugc3VyZSB0aGF0IGFsbCBvdXRwdXQgc2VjdGlvbnMgbWVudGlvbmVkIGluIGFuIGV4cHJlc3Npb24gYXJlCi0gICBpbml0aWFsaXplZC4gICovCi0KLXN0YXRpYyB2b2lkCi1leHBfaW5pdF9vcyAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIHN3aXRjaCAoZXhwLT50eXBlLm5vZGVfY2xhc3MpCi0gICAgewotICAgIGNhc2UgZXRyZWVfYXNzaWduOgotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+YXNzaWduLnNyYyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgZXRyZWVfYmluYXJ5OgotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+YmluYXJ5Lmxocyk7Ci0gICAgICBleHBfaW5pdF9vcyAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZXhwX2luaXRfb3MgKGV4cC0+dHJpbmFyeS5jb25kKTsKLSAgICAgIGV4cF9pbml0X29zIChleHAtPnRyaW5hcnkubGhzKTsKLSAgICAgIGV4cF9pbml0X29zIChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGV4cF9pbml0X29zIChleHAtPnVuYXJ5LmNoaWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9uYW1lOgotICAgICAgc3dpdGNoIChleHAtPnR5cGUubm9kZV9jb2RlKQotCXsKLQljYXNlIEFERFI6Ci0JY2FzZSBMT0FEQUREUjoKLQljYXNlIFNJWkVPRjoKLQkgIHsKLQkgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci0KLQkgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKGV4cC0+bmFtZS5uYW1lKTsKLQkgICAgaWYgKG9zICE9IE5VTEwgJiYgb3MtPmJmZF9zZWN0aW9uID09IE5VTEwpCi0JICAgICAgaW5pdF9vcyAob3MpOwotCSAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogU2VjdGlvbnMgbWFya2VkIHdpdGggdGhlIFNFQ19MSU5LX09OQ0UgZmxhZyBzaG91bGQgb25seSBiZSBsaW5rZWQKLSAgIG9uY2UgaW50byB0aGUgb3V0cHV0LiAgVGhpcyByb3V0aW5lIGNoZWNrcyBlYWNoIHNlY3Rpb25zLCBhbmQKLSAgIGFycmFuZ2VzIHRvIGRpc2NhcmQgaXQgaWYgYSBzZWN0aW9uIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkKLSAgIGJlZW4gbGlua2VkLiAgVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCBhbGwgcmVsZXZhbnQgc2VjdGlvbnMgaGF2ZSB0aGUKLSAgIFNFQ19MSU5LX09OQ0UgZmxhZyBzZXQ7IHRoYXQgaXMsIGl0IGRvZXMgbm90IGRlcGVuZCBzb2xlbHkgdXBvbiB0aGUKLSAgIHNlY3Rpb24gbmFtZS4gIFRoaXMgaXMgY2FsbGVkIHZpYSBiZmRfbWFwX292ZXJfc2VjdGlvbnMuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB2b2lkCi1zZWN0aW9uX2FscmVhZHlfbGlua2VkIChhYmZkLCBzZWMsIGRhdGEpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGRhdGE7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZGF0YTsKLSAgc3RydWN0IHNlY19saW5rX29uY2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2VjX2xpbmtfb25jZSAqbmV4dDsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgfTsKLSAgc3RhdGljIHN0cnVjdCBzZWNfbGlua19vbmNlICpzZWNfbGlua19vbmNlX2xpc3Q7Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBjb25zdCBjaGFyICpuYW1lOwotICBzdHJ1Y3Qgc2VjX2xpbmtfb25jZSAqbDsKLQotICAvKiBJZiB3ZSBhcmUgb25seSByZWFkaW5nIHN5bWJvbHMgZnJvbSB0aGlzIG9iamVjdCwgdGhlbiB3ZSB3YW50IHRvCi0gICAgIGRpc2NhcmQgYWxsIHNlY3Rpb25zLiAgKi8KLSAgaWYgKGVudHJ5LT5qdXN0X3N5bXNfZmxhZykKLSAgICB7Ci0gICAgICBzZWMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICAgIHNlYy0+b3V0cHV0X29mZnNldCA9IHNlYy0+dm1hOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJZiB3ZSBhcmVuJ3QgYnVpbGRpbmcgY29uc3RydWN0b3JzLCBkb24ndCBkaXNjYXJkIGxpbmsgb25jZQotICAgICBzZWN0aW9ucy4gIE90aGVyd2lzZSB3ZSBjYW4gZ2V0IGNvbmZ1c2VkIHdoZW4gZ2VuZXJhdGluZyByZWxvY3MuICAqLwotICBpZiAoISBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHJldHVybjsKLQotICBmbGFncyA9IGJmZF9nZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgc2VjKTsKLQotICBpZiAoKGZsYWdzICYgU0VDX0xJTktfT05DRSkgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChhYmZkLCBzZWMpOwotCi0gIGZvciAobCA9IHNlY19saW5rX29uY2VfbGlzdDsgbCAhPSBOVUxMOyBsID0gbC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAoc3RyY21wIChuYW1lLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAobC0+c2VjLT5vd25lciwgbC0+c2VjKSkgPT0gMCkKLQl7Ci0JICAvKiBUaGUgc2VjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGxpbmtlZC4gIFNlZSBpZiB3ZSBzaG91bGQKLSAgICAgICAgICAgICBpc3N1ZSBhIHdhcm5pbmcuICAqLwotCSAgc3dpdGNoIChmbGFncyAmIFNFQ19MSU5LX0RVUExJQ0FURVMpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBhYm9ydCAoKTsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfRElTQ0FSRDoKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIFNFQ19MSU5LX0RVUExJQ0FURVNfT05FX09OTFk6Ci0JICAgICAgZWluZm8gKF8oIiVQOiAlQjogd2FybmluZzogaWdub3JpbmcgZHVwbGljYXRlIHNlY3Rpb24gYCVzJ1xuIiksCi0JCSAgICAgYWJmZCwgbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfQ09OVEVOVFM6Ci0JICAgICAgLyogRklYTUU6IFdlIHNob3VsZCByZWFsbHkgZGlnIG91dCB0aGUgY29udGVudHMgb2YgYm90aAotICAgICAgICAgICAgICAgICBzZWN0aW9ucyBhbmQgbWVtY21wIHRoZW0uICBUaGUgQ09GRi9QRSBzcGVjIHNheXMgdGhhdAotICAgICAgICAgICAgICAgICB0aGUgTWljcm9zb2Z0IGxpbmtlciBkb2VzIG5vdCBpbXBsZW1lbnQgdGhpcwotICAgICAgICAgICAgICAgICBjb3JyZWN0bHksIHNvIEknbSBub3QgZ29pbmcgdG8gYm90aGVyIGRvaW5nIGl0Ci0gICAgICAgICAgICAgICAgIGVpdGhlci4gICovCi0JICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkgICAgY2FzZSBTRUNfTElOS19EVVBMSUNBVEVTX1NBTUVfU0laRToKLQkgICAgICBpZiAoYmZkX3NlY3Rpb25fc2l6ZSAoYWJmZCwgc2VjKQotCQkgICE9IGJmZF9zZWN0aW9uX3NpemUgKGwtPnNlYy0+b3duZXIsIGwtPnNlYykpCi0JCWVpbmZvIChfKCIlUDogJUI6IHdhcm5pbmc6IGR1cGxpY2F0ZSBzZWN0aW9uIGAlcycgaGFzIGRpZmZlcmVudCBzaXplXG4iKSwKLQkJICAgICAgIGFiZmQsIG5hbWUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0KLQkgIC8qIFNldCB0aGUgb3V0cHV0X3NlY3Rpb24gZmllbGQgc28gdGhhdCB3aWxkX2RvaXQgZG9lcyBub3QKLQkgICAgIGNyZWF0ZSBhIGxhbmdfaW5wdXRfc2VjdGlvbiBzdHJ1Y3R1cmUgZm9yIHRoaXMgc2VjdGlvbi4gICovCi0JICBzZWMtPm91dHB1dF9zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgLyogVGhpcyBpcyB0aGUgZmlyc3Qgc2VjdGlvbiB3aXRoIHRoaXMgbmFtZS4gIFJlY29yZCBpdC4gICovCi0KLSAgbCA9IChzdHJ1Y3Qgc2VjX2xpbmtfb25jZSAqKSB4bWFsbG9jIChzaXplb2YgKmwpOwotICBsLT5zZWMgPSBzZWM7Ci0gIGwtPm5leHQgPSBzZWNfbGlua19vbmNlX2xpc3Q7Ci0gIHNlY19saW5rX29uY2VfbGlzdCA9IGw7Ci19Ci0MCi0vKiBUaGUgd2lsZCByb3V0aW5lcy4KLQotICAgVGhlc2UgZXhwYW5kIHN0YXRlbWVudHMgbGlrZSAqKC50ZXh0KSBhbmQgZm9vLm8gdG8gYSBsaXN0IG9mCi0gICBleHBsaWNpdCBhY3Rpb25zLCBsaWtlIGZvby5vKC50ZXh0KSwgYmFyLm8oLnRleHQpIGFuZAotICAgZm9vLm8oLnRleHQsIC5kYXRhKS4gICovCi0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSBQQVRURVJOIGFyZ3VtZW50IGlzIGEgd2lsZGNhcmQgcGF0dGVybi4KLSAgIEFsdGhvdWdoIGJhY2tzbGFzaGVzIGFyZSB0cmVhdGVkIHNwZWNpYWxseSBpZiBhIHBhdHRlcm4gY29udGFpbnMKLSAgIHdpbGRjYXJkcywgd2UgZG8gbm90IGNvbnNpZGVyIHRoZSBtZXJlIHByZXNlbmNlIG9mIGEgYmFja3NsYXNoIHRvCi0gICBiZSBlbm91Z2ggdG8gY2F1c2UgdGhlIHRoZSBwYXR0ZXJuIHRvIGJlIHRyZWF0ZWQgYXMgYSB3aWxkY2FyZC4KLSAgIFRoYXQgbGV0cyB1cyBoYW5kbGUgRE9TIGZpbGVuYW1lcyBtb3JlIG5hdHVyYWxseS4gICovCi0KLXN0YXRpYyBib29sZWFuCi13aWxkY2FyZHAgKHBhdHRlcm4pCi0gICAgIGNvbnN0IGNoYXIgKnBhdHRlcm47Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0KLSAgZm9yIChzID0gcGF0dGVybjsgKnMgIT0gJ1wwJzsgKytzKQotICAgIGlmICgqcyA9PSAnPycKLQl8fCAqcyA9PSAnKicKLQl8fCAqcyA9PSAnWycpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBBZGQgU0VDVElPTiB0byB0aGUgb3V0cHV0IHNlY3Rpb24gT1VUUFVULiAgRG8gdGhpcyBieSBjcmVhdGluZyBhCi0gICBsYW5nX2lucHV0X3NlY3Rpb24gc3RhdGVtZW50IHdoaWNoIGlzIHBsYWNlZCBhdCBQVFIuICBGSUxFIGlzIHRoZQotICAgaW5wdXQgZmlsZSB3aGljaCBob2xkcyBTRUNUSU9OLiAgKi8KLQotdm9pZAotd2lsZF9kb2l0IChwdHIsIHNlY3Rpb24sIG91dHB1dCwgZmlsZSkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpwdHI7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXQ7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci17Ci0gIGZsYWd3b3JkIGZsYWdzOwotICBib29sZWFuIGRpc2NhcmQ7Ci0KLSAgZmxhZ3MgPSBiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKHNlY3Rpb24tPm93bmVyLCBzZWN0aW9uKTsKLQotICBkaXNjYXJkID0gZmFsc2U7Ci0KLSAgLyogSWYgd2UgYXJlIGRvaW5nIGEgZmluYWwgbGluaywgZGlzY2FyZCBzZWN0aW9ucyBtYXJrZWQgd2l0aAotICAgICBTRUNfRVhDTFVERS4gICovCi0gIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLSAgICAgICYmIChmbGFncyAmIFNFQ19FWENMVURFKSAhPSAwKQotICAgIGRpc2NhcmQgPSB0cnVlOwotCi0gIC8qIERpc2NhcmQgaW5wdXQgc2VjdGlvbnMgd2hpY2ggYXJlIGFzc2lnbmVkIHRvIGEgc2VjdGlvbiBuYW1lZAotICAgICBESVNDQVJEX1NFQ1RJT05fTkFNRS4gICovCi0gIGlmIChzdHJjbXAgKG91dHB1dC0+bmFtZSwgRElTQ0FSRF9TRUNUSU9OX05BTUUpID09IDApCi0gICAgZGlzY2FyZCA9IHRydWU7Ci0KLSAgLyogRGlzY2FyZCBkZWJ1Z2dpbmcgc2VjdGlvbnMgaWYgd2UgYXJlIHN0cmlwcGluZyBkZWJ1Z2dpbmcKLSAgICAgaW5mb3JtYXRpb24uICAqLwotICBpZiAoKGxpbmtfaW5mby5zdHJpcCA9PSBzdHJpcF9kZWJ1Z2dlciB8fCBsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfYWxsKQotICAgICAgJiYgKGZsYWdzICYgU0VDX0RFQlVHR0lORykgIT0gMCkKLSAgICBkaXNjYXJkID0gdHJ1ZTsKLQotICBpZiAoZGlzY2FyZCkKLSAgICB7Ci0gICAgICBpZiAoc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICAvKiBUaGlzIHByZXZlbnRzIGZ1dHVyZSBjYWxscyBmcm9tIGFzc2lnbmluZyB0aGlzIHNlY3Rpb24uICAqLwotCSAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBiZmRfYWJzX3NlY3Rpb25fcHRyOwotCX0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgYm9vbGVhbiBmaXJzdDsKLSAgICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICpuZXc7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLQotICAgICAgaWYgKG91dHB1dC0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKLQl7Ci0JICBpbml0X29zIChvdXRwdXQpOwotCSAgZmlyc3QgPSB0cnVlOwotCX0KLSAgICAgIGVsc2UKLQlmaXJzdCA9IGZhbHNlOwotCi0gICAgICAvKiBBZGQgYSBzZWN0aW9uIHJlZmVyZW5jZSB0byB0aGUgbGlzdCAqLwotICAgICAgbmV3ID0gbmV3X3N0YXQgKGxhbmdfaW5wdXRfc2VjdGlvbiwgcHRyKTsKLQotICAgICAgbmV3LT5zZWN0aW9uID0gc2VjdGlvbjsKLSAgICAgIG5ldy0+aWZpbGUgPSBmaWxlOwotICAgICAgc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gPSBvdXRwdXQtPmJmZF9zZWN0aW9uOwotCi0gICAgICBmbGFncyA9IHNlY3Rpb24tPmZsYWdzOwotCi0gICAgICAvKiBXZSBkb24ndCBjb3B5IHRoZSBTRUNfTkVWRVJfTE9BRCBmbGFnIGZyb20gYW4gaW5wdXQgc2VjdGlvbgotCSB0byBhbiBvdXRwdXQgc2VjdGlvbiwgYmVjYXVzZSB3ZSB3YW50IHRvIGJlIGFibGUgdG8gaW5jbHVkZSBhCi0JIFNFQ19ORVZFUl9MT0FEIHNlY3Rpb24gaW4gdGhlIG1pZGRsZSBvZiBhbiBvdGhlcndpc2UgbG9hZGVkCi0JIHNlY3Rpb24gKEkgZG9uJ3Qga25vdyB3aHkgd2Ugd2FudCB0byBkbyB0aGlzLCBidXQgd2UgZG8pLgotCSBidWlsZF9saW5rX29yZGVyIGluIGxkd3JpdGUuYyBoYW5kbGVzIHRoaXMgY2FzZSBieSB0dXJuaW5nCi0JIHRoZSBlbWJlZGRlZCBTRUNfTkVWRVJfTE9BRCBzZWN0aW9uIGludG8gYSBmaWxsLiAgKi8KLQotICAgICAgZmxhZ3MgJj0gfiBTRUNfTkVWRVJfTE9BRDsKLQotICAgICAgLyogSWYgZmluYWwgbGluaywgZG9uJ3QgY29weSB0aGUgU0VDX0xJTktfT05DRSBmbGFncywgdGhleSd2ZQotCSBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLiAgT25lIHJlYXNvbiB0byBkbyB0aGlzIGlzIHRoYXQgb24gcGUKLQkgZm9ybWF0IHRhcmdldHMsIC50ZXh0JGZvbyBzZWN0aW9ucyBnbyBpbnRvIC50ZXh0IGFuZCBpdCdzIG9kZAotCSB0byBzZWUgLnRleHQgd2l0aCBTRUNfTElOS19PTkNFIHNldC4gICovCi0KLSAgICAgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0JZmxhZ3MgJj0gfiAoU0VDX0xJTktfT05DRSB8IFNFQ19MSU5LX0RVUExJQ0FURVMpOwotCi0gICAgICAvKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgaW5wdXQgc2VjdGlvbiwgYW5kIHRoZSBTRUNfUkVBRE9OTFkKLSAgICAgICAgIGZsYWcgaXMgbm90IGN1cnJlbnRseSBzZXQsIHRoZW4gZG9uJ3Qgc2V0IGl0IGp1c3QgYmVjYXVzZSB0aGUKLSAgICAgICAgIGlucHV0IHNlY3Rpb24gaGFzIGl0IHNldC4gICovCi0KLSAgICAgIGlmICghIGZpcnN0ICYmIChzZWN0aW9uLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0JZmxhZ3MgJj0gfiBTRUNfUkVBRE9OTFk7Ci0KLSAgICAgIHNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT5mbGFncyB8PSBmbGFnczsKLQotICAgICAgLyogSWYgU0VDX1JFQURPTkxZIGlzIG5vdCBzZXQgaW4gdGhlIGlucHV0IHNlY3Rpb24sIHRoZW4gY2xlYXIKLSAgICAgICAgIGl0IGZyb20gdGhlIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgICAgIGlmICgoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpID09IDApCi0Jc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPmZsYWdzICY9IH5TRUNfUkVBRE9OTFk7Ci0KLSAgICAgIHN3aXRjaCAob3V0cHV0LT5zZWN0eXBlKQotCXsKLQljYXNlIG5vcm1hbF9zZWN0aW9uOgotCSAgYnJlYWs7Ci0JY2FzZSBkc2VjdF9zZWN0aW9uOgotCWNhc2UgY29weV9zZWN0aW9uOgotCWNhc2UgaW5mb19zZWN0aW9uOgotCWNhc2Ugb3ZlcmxheV9zZWN0aW9uOgotCSAgb3V0cHV0LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJj0gflNFQ19BTExPQzsKLQkgIGJyZWFrOwotCWNhc2Ugbm9sb2FkX3NlY3Rpb246Ci0JICBvdXRwdXQtPmJmZF9zZWN0aW9uLT5mbGFncyAmPSB+U0VDX0xPQUQ7Ci0JICBvdXRwdXQtPmJmZF9zZWN0aW9uLT5mbGFncyB8PSBTRUNfTkVWRVJfTE9BRDsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKHNlY3Rpb24tPmFsaWdubWVudF9wb3dlciA+IG91dHB1dC0+YmZkX3NlY3Rpb24tPmFsaWdubWVudF9wb3dlcikKLQlvdXRwdXQtPmJmZF9zZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIgPSBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgICAgIC8qIElmIHN1cHBsaWVkIGFuIGFsaWdtZW50LCB0aGVuIGZvcmNlIGl0LiAgKi8KLSAgICAgIGlmIChvdXRwdXQtPnNlY3Rpb25fYWxpZ25tZW50ICE9IC0xKQotCW91dHB1dC0+YmZkX3NlY3Rpb24tPmFsaWdubWVudF9wb3dlciA9IG91dHB1dC0+c2VjdGlvbl9hbGlnbm1lbnQ7Ci0gICAgfQotfQotCi0vKiBIYW5kbGUgd2lsZGNhcmQgc29ydGluZy4gIFRoaXMgcmV0dXJucyB0aGUgbGFuZ19pbnB1dF9zZWN0aW9uIHdoaWNoCi0gICBzaG91bGQgZm9sbG93IHRoZSBvbmUgd2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSBmb3IgU0VDVElPTiBhbmQgRklMRSwKLSAgIGJhc2VkIG9uIHRoZSBzb3J0aW5nIHJlcXVpcmVtZW50cyBvZiBXSUxELiAgSXQgcmV0dXJucyBOVUxMIGlmIHRoZQotICAgbmV3IHNlY3Rpb24gc2hvdWxkIGp1c3QgZ28gYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBsaXN0LiAgKi8KLQotc3RhdGljIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKgotd2lsZF9zb3J0ICh3aWxkLCBmaWxlLCBzZWN0aW9uKQotICAgICBsYW5nX3dpbGRfc3RhdGVtZW50X3R5cGUgKndpbGQ7Ci0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotewotICBjb25zdCBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKmw7Ci0KLSAgaWYgKCEgd2lsZC0+ZmlsZW5hbWVzX3NvcnRlZCAmJiAhIHdpbGQtPnNlY3Rpb25zX3NvcnRlZCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBzZWN0aW9uX25hbWUgPSBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoZmlsZS0+dGhlX2JmZCwgc2VjdGlvbik7Ci0gIGZvciAobCA9IHdpbGQtPmNoaWxkcmVuLmhlYWQ7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKmxzOwotCi0gICAgICBpZiAobC0+aGVhZGVyLnR5cGUgIT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0pCi0JY29udGludWU7Ci0gICAgICBscyA9ICZsLT5pbnB1dF9zZWN0aW9uOwotCi0gICAgICAvKiBTb3J0aW5nIGJ5IGZpbGVuYW1lIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBzb3J0aW5nIGJ5IHNlY3Rpb24KLSAgICAgICAgIG5hbWUuICAqLwotCi0gICAgICBpZiAod2lsZC0+ZmlsZW5hbWVzX3NvcnRlZCkKLQl7Ci0JICBjb25zdCBjaGFyICpmbiwgKmxuOwotCSAgYm9vbGVhbiBmYSwgbGE7Ci0JICBpbnQgaTsKLQotCSAgLyogVGhlIFBFIHN1cHBvcnQgZm9yIHRoZSAuaWRhdGEgc2VjdGlvbiBhcyBnZW5lcmF0ZWQgYnkKLSAgICAgICAgICAgICBkbGx0b29sIGFzc3VtZXMgdGhhdCBmaWxlcyB3aWxsIGJlIHNvcnRlZCBieSB0aGUgbmFtZSBvZgotICAgICAgICAgICAgIHRoZSBhcmNoaXZlIGFuZCB0aGVuIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICBhcmNoaXZlLiAgKi8KLQotCSAgaWYgKGZpbGUtPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmIGJmZF9teV9hcmNoaXZlIChmaWxlLT50aGVfYmZkKSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgZm4gPSBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoZmlsZS0+dGhlX2JmZCkpOwotCSAgICAgIGZhID0gdHJ1ZTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZm4gPSBmaWxlLT5maWxlbmFtZTsKLQkgICAgICBmYSA9IGZhbHNlOwotCSAgICB9Ci0KLQkgIGlmIChscy0+aWZpbGUtPnRoZV9iZmQgIT0gTlVMTAotCSAgICAgICYmIGJmZF9teV9hcmNoaXZlIChscy0+aWZpbGUtPnRoZV9iZmQpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBsbiA9IGJmZF9nZXRfZmlsZW5hbWUgKGJmZF9teV9hcmNoaXZlIChscy0+aWZpbGUtPnRoZV9iZmQpKTsKLQkgICAgICBsYSA9IHRydWU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGxuID0gbHMtPmlmaWxlLT5maWxlbmFtZTsKLQkgICAgICBsYSA9IGZhbHNlOwotCSAgICB9Ci0KLQkgIGkgPSBzdHJjbXAgKGZuLCBsbik7Ci0JICBpZiAoaSA+IDApCi0JICAgIGNvbnRpbnVlOwotCSAgZWxzZSBpZiAoaSA8IDApCi0JICAgIGJyZWFrOwotCi0JICBpZiAoZmEgfHwgbGEpCi0JICAgIHsKLQkgICAgICBpZiAoZmEpCi0JCWZuID0gZmlsZS0+ZmlsZW5hbWU7Ci0JICAgICAgaWYgKGxhKQotCQlsbiA9IGxzLT5pZmlsZS0+ZmlsZW5hbWU7Ci0KLQkgICAgICBpID0gc3RyY21wIChmbiwgbG4pOwotCSAgICAgIGlmIChpID4gMCkKLQkJY29udGludWU7Ci0JICAgICAgZWxzZSBpZiAoaSA8IDApCi0JCWJyZWFrOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBIZXJlIGVpdGhlciB0aGUgZmlsZXMgYXJlIG5vdCBzb3J0ZWQgYnkgbmFtZSwgb3Igd2UgYXJlCi0gICAgICAgICBsb29raW5nIGF0IHRoZSBzZWN0aW9ucyBmb3IgdGhpcyBmaWxlLiAgKi8KLQotICAgICAgaWYgKHdpbGQtPnNlY3Rpb25zX3NvcnRlZCkKLQl7Ci0JICBpZiAoc3RyY21wIChzZWN0aW9uX25hbWUsCi0JCSAgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChscy0+aWZpbGUtPnRoZV9iZmQsCi0JCQkJCSAgICBscy0+c2VjdGlvbikpCi0JICAgICAgPCAwKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBsOwotfQotCi0vKiBFeHBhbmQgYSB3aWxkIHN0YXRlbWVudCBmb3IgYSBwYXJ0aWN1bGFyIEZJTEUuICBTRUNUSU9OIG1heSBiZQotICAgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBhIHdpbGQgY2FyZC4gICovCi0KLXN0YXRpYyB2b2lkCi1vdXRwdXRfc2VjdGlvbl9jYWxsYmFjayAocHRyLCBzZWN0aW9uLCBmaWxlLCBvdXRwdXQpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqcHRyOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZTsKLSAgICAgdm9pZCAqb3V0cHV0OwotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpiZWZvcmU7Ci0gIAotICAvKiBJZiB0aGUgd2lsZCBwYXR0ZXJuIHdhcyBtYXJrZWQgS0VFUCwgdGhlIG1lbWJlciBzZWN0aW9ucwotICAgICBzaG91bGQgYmUgYXMgd2VsbC4gICovCi0gIGlmIChwdHItPmtlZXBfc2VjdGlvbnMpCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0tFRVA7Ci0gIAotICBiZWZvcmUgPSB3aWxkX3NvcnQgKHB0ciwgZmlsZSwgc2VjdGlvbik7Ci0gIAotICAvKiBIZXJlIEJFRk9SRSBwb2ludHMgdG8gdGhlIGxhbmdfaW5wdXRfc2VjdGlvbiB3aGljaAotICAgICBzaG91bGQgZm9sbG93IHRoZSBvbmUgd2UgYXJlIGFib3V0IHRvIGFkZC4gIElmIEJFRk9SRQotICAgICBpcyBOVUxMLCB0aGVuIHRoZSBzZWN0aW9uIHNob3VsZCBqdXN0IGdvIGF0IHRoZSBlbmQKLSAgICAgb2YgdGhlIGN1cnJlbnQgbGlzdC4gICovCi0gIAotICBpZiAoYmVmb3JlID09IE5VTEwpCi0gICAgd2lsZF9kb2l0ICgmcHRyLT5jaGlsZHJlbiwgc2VjdGlvbiwgCi0JICAgICAgIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIG91dHB1dCwgCi0JICAgICAgIGZpbGUpOwotICBlbHNlCi0gICAgewotICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGxpc3Q7Ci0gICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqcHA7Ci0gICAgICAKLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbGlzdCk7Ci0gICAgICB3aWxkX2RvaXQgKCZsaXN0LCBzZWN0aW9uLCAKLQkJIChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICopIG91dHB1dCwgCi0JCSBmaWxlKTsKLSAgICAgIAotICAgICAgLyogSWYgd2UgYXJlIGRpc2NhcmRpbmcgdGhlIHNlY3Rpb24sIExJU1QuSEVBRCB3aWxsCi0JIGJlIE5VTEwuICAqLwotICAgICAgaWYgKGxpc3QuaGVhZCAhPSBOVUxMKQotCXsKLQkgIEFTU0VSVCAobGlzdC5oZWFkLT5uZXh0ID09IE5VTEwpOwotCSAgCi0JICBmb3IgKHBwID0gJnB0ci0+Y2hpbGRyZW4uaGVhZDsKLQkgICAgICAgKnBwICE9IGJlZm9yZTsKLQkgICAgICAgcHAgPSAmKCpwcCktPm5leHQpCi0JICAgIEFTU0VSVCAoKnBwICE9IE5VTEwpOwotCSAgCi0JICBsaXN0LmhlYWQtPm5leHQgPSAqcHA7Ci0JICAqcHAgPSBsaXN0LmhlYWQ7Ci0JfQotICAgIH0KLX0KLQotLyogVGhpcyBpcyBwYXNzZWQgYSBmaWxlIG5hbWUgd2hpY2ggbXVzdCBoYXZlIGJlZW4gc2VlbiBhbHJlYWR5IGFuZAotICAgYWRkZWQgdG8gdGhlIHN0YXRlbWVudCB0cmVlLiAgV2Ugd2lsbCBzZWUgaWYgaXQgaGFzIGJlZW4gb3BlbmVkCi0gICBhbHJlYWR5IGFuZCBoYWQgaXRzIHN5bWJvbHMgcmVhZC4gIElmIG5vdCB0aGVuIHdlJ2xsIHJlYWQgaXQuICAqLwotCi1zdGF0aWMgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqCi1sb29rdXBfbmFtZSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqc2VhcmNoOwotCi0gIGZvciAoc2VhcmNoID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgaW5wdXRfZmlsZV9jaGFpbi5oZWFkOwotICAgICAgIHNlYXJjaCAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOwotICAgICAgIHNlYXJjaCA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIHNlYXJjaC0+bmV4dF9yZWFsX2ZpbGUpCi0gICAgewotICAgICAgaWYgKHNlYXJjaC0+ZmlsZW5hbWUgPT0gKGNoYXIgKikgTlVMTCAmJiBuYW1lID09IChjaGFyICopIE5VTEwpCi0JcmV0dXJuIHNlYXJjaDsKLSAgICAgIGlmIChzZWFyY2gtPmZpbGVuYW1lICE9IChjaGFyICopIE5VTEwKLQkgICYmIG5hbWUgIT0gKGNoYXIgKikgTlVMTAotCSAgJiYgc3RyY21wIChzZWFyY2gtPmZpbGVuYW1lLCBuYW1lKSA9PSAwKQotCWJyZWFrOwotICAgIH0KLQotICBpZiAoc2VhcmNoID09IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEwpCi0gICAgc2VhcmNoID0gbmV3X2FmaWxlIChuYW1lLCBsYW5nX2lucHV0X2ZpbGVfaXNfZmlsZV9lbnVtLCBkZWZhdWx0X3RhcmdldCwKLQkJCWZhbHNlKTsKLQotICAvKiBJZiB3ZSBoYXZlIGFscmVhZHkgYWRkZWQgdGhpcyBmaWxlLCBvciB0aGlzIGZpbGUgaXMgbm90IHJlYWwKLSAgICAgKEZJWE1FOiBjYW4gdGhhdCBldmVyIGFjdHVhbGx5IGhhcHBlbj8pIG9yIHRoZSBuYW1lIGlzIE5VTEwKLSAgICAgKEZJWE1FOiBjYW4gdGhhdCBldmVyIGFjdHVhbGx5IGhhcHBlbj8pIGRvbid0IGFkZCB0aGlzIGZpbGUuICAqLwotICBpZiAoc2VhcmNoLT5sb2FkZWQKLSAgICAgIHx8ICEgc2VhcmNoLT5yZWFsCi0gICAgICB8fCBzZWFyY2gtPmZpbGVuYW1lID09IChjb25zdCBjaGFyICopIE5VTEwpCi0gICAgcmV0dXJuIHNlYXJjaDsKLQotICBsb2FkX3N5bWJvbHMgKHNlYXJjaCwgKGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqKSBOVUxMKTsKLQotICByZXR1cm4gc2VhcmNoOwotfQotCi0vKiBHZXQgdGhlIHN5bWJvbHMgZm9yIGFuIGlucHV0IGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotbG9hZF9zeW1ib2xzIChlbnRyeSwgcGxhY2UpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotICAgICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKnBsYWNlOwotewotICBjaGFyICoqbWF0Y2hpbmc7Ci0KLSAgaWYgKGVudHJ5LT5sb2FkZWQpCi0gICAgcmV0dXJuOwotCi0gIGxkZmlsZV9vcGVuX2ZpbGUgKGVudHJ5KTsKLQotICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChlbnRyeS0+dGhlX2JmZCwgYmZkX2FyY2hpdmUpCi0gICAgICAmJiAhIGJmZF9jaGVja19mb3JtYXRfbWF0Y2hlcyAoZW50cnktPnRoZV9iZmQsIGJmZF9vYmplY3QsICZtYXRjaGluZykpCi0gICAgewotICAgICAgYmZkX2Vycm9yX3R5cGUgZXJyOwotICAgICAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlICpob2xkOwotCi0gICAgICBlcnIgPSBiZmRfZ2V0X2Vycm9yICgpOwotICAgICAgaWYgKGVyciA9PSBiZmRfZXJyb3JfZmlsZV9hbWJpZ3VvdXNseV9yZWNvZ25pemVkKQotCXsKLQkgIGNoYXIgKipwOwotCi0JICBlaW5mbyAoXygiJUI6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iKSwgZW50cnktPnRoZV9iZmQpOwotCSAgZWluZm8gKF8oIiVCOiBtYXRjaGluZyBmb3JtYXRzOiIpLCBlbnRyeS0+dGhlX2JmZCk7Ci0JICBmb3IgKHAgPSBtYXRjaGluZzsgKnAgIT0gTlVMTDsgcCsrKQotCSAgICBlaW5mbyAoIiAlcyIsICpwKTsKLQkgIGVpbmZvICgiJUZcbiIpOwotCX0KLSAgICAgIGVsc2UgaWYgKGVyciAhPSBiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZAotCSAgICAgICB8fCBwbGFjZSA9PSBOVUxMKQotCWVpbmZvIChfKCIlRiVCOiBmaWxlIG5vdCByZWNvZ25pemVkOiAlRVxuIiksIGVudHJ5LT50aGVfYmZkKTsKLQotICAgICAgYmZkX2Nsb3NlIChlbnRyeS0+dGhlX2JmZCk7Ci0gICAgICBlbnRyeS0+dGhlX2JmZCA9IE5VTEw7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGUgZW11bGF0aW9uIGhhcyBzb21lIHNwZWNpYWwga25vd2xlZGdlLiAgKi8KLQotICAgICAgaWYgKGxkZW11bF91bnJlY29nbml6ZWRfZmlsZSAoZW50cnkpKQotCXJldHVybjsKLQotICAgICAgLyogVHJ5IHRvIGludGVycHJldCB0aGUgZmlsZSBhcyBhIGxpbmtlciBzY3JpcHQuICAqLwotCi0gICAgICBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKGVudHJ5LT5maWxlbmFtZSk7Ci0KLSAgICAgIGhvbGQgPSBzdGF0X3B0cjsKLSAgICAgIHN0YXRfcHRyID0gcGxhY2U7Ci0KLSAgICAgIGxkZmlsZV9hc3N1bWVkX3NjcmlwdCA9IHRydWU7Ci0gICAgICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9zY3JpcHQ7Ci0gICAgICB5eXBhcnNlICgpOwotICAgICAgbGRmaWxlX2Fzc3VtZWRfc2NyaXB0ID0gZmFsc2U7Ci0KLSAgICAgIHN0YXRfcHRyID0gaG9sZDsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAobGRlbXVsX3JlY29nbml6ZWRfZmlsZSAoZW50cnkpKQotICAgIHJldHVybjsKLQotICAvKiBXZSBkb24ndCBjYWxsIGxkbGFuZ19hZGRfZmlsZSBmb3IgYW4gYXJjaGl2ZS4gIEluc3RlYWQsIHRoZQotICAgICBhZGRfc3ltYm9scyBlbnRyeSBwb2ludCB3aWxsIGNhbGwgbGRsYW5nX2FkZF9maWxlLCB2aWEgdGhlCi0gICAgIGFkZF9hcmNoaXZlX2VsZW1lbnQgY2FsbGJhY2ssIGZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIGFyY2hpdmUKLSAgICAgd2hpY2ggaXMgdXNlZC4gICovCi0gIHN3aXRjaCAoYmZkX2dldF9mb3JtYXQgKGVudHJ5LT50aGVfYmZkKSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfb2JqZWN0OgotICAgICAgbGRsYW5nX2FkZF9maWxlIChlbnRyeSk7Ci0gICAgICBpZiAodHJhY2VfZmlsZXMgfHwgdHJhY2VfZmlsZV90cmllcykKLQlpbmZvX21zZyAoIiVJXG4iLCBlbnRyeSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX2FyY2hpdmU6Ci0gICAgICBpZiAoZW50cnktPndob2xlX2FyY2hpdmUpCi0JewotCSAgYmZkICptZW1iZXIgPSBiZmRfb3BlbnJfbmV4dF9hcmNoaXZlZF9maWxlIChlbnRyeS0+dGhlX2JmZCwKLQkJCQkJCSAgICAgIChiZmQgKikgTlVMTCk7Ci0JICB3aGlsZSAobWVtYmVyICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAoISBiZmRfY2hlY2tfZm9ybWF0IChtZW1iZXIsIGJmZF9vYmplY3QpKQotCQllaW5mbyAoXygiJUYlQjogb2JqZWN0ICVCIGluIGFyY2hpdmUgaXMgbm90IG9iamVjdFxuIiksCi0JCSAgICAgICBlbnRyeS0+dGhlX2JmZCwgbWVtYmVyKTsKLQkgICAgICBpZiAoISAoKCpsaW5rX2luZm8uY2FsbGJhY2tzLT5hZGRfYXJjaGl2ZV9lbGVtZW50KQotCQkgICAgICgmbGlua19pbmZvLCBtZW1iZXIsICItLXdob2xlLWFyY2hpdmUiKSkpCi0JCWFib3J0ICgpOwotCSAgICAgIGlmICghIGJmZF9saW5rX2FkZF9zeW1ib2xzIChtZW1iZXIsICZsaW5rX2luZm8pKQotCQllaW5mbyAoXygiJUYlQjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIpLCBtZW1iZXIpOwotCSAgICAgIG1lbWJlciA9IGJmZF9vcGVucl9uZXh0X2FyY2hpdmVkX2ZpbGUgKGVudHJ5LT50aGVfYmZkLAotCQkJCQkJICAgICBtZW1iZXIpOwotCSAgICB9Ci0KLQkgIGVudHJ5LT5sb2FkZWQgPSB0cnVlOwotCi0JICByZXR1cm47Ci0JfQotICAgIH0KLQotICBpZiAoISBiZmRfbGlua19hZGRfc3ltYm9scyAoZW50cnktPnRoZV9iZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvIChfKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIGVudHJ5LT50aGVfYmZkKTsKLQotICBlbnRyeS0+bG9hZGVkID0gdHJ1ZTsKLX0KLQotICAgICAKLQotLyogSGFuZGxlIGEgd2lsZCBzdGF0ZW1lbnQuICBTRUNUSU9OIG9yIEZJTEUgb3IgYm90aCBtYXkgYmUgTlVMTCwKLSAgIGluZGljYXRpbmcgdGhhdCBpdCBpcyBhIHdpbGRjYXJkLiAgU2VwYXJhdGUgbGFuZ19pbnB1dF9zZWN0aW9uCi0gICBzdGF0ZW1lbnRzIGFyZSBjcmVhdGVkIGZvciBlYWNoIHBhcnQgb2YgdGhlIGV4cGFuc2lvbjsgdGhleSBhcmUKLSAgIGFkZGVkIGFmdGVyIHRoZSB3aWxkIHN0YXRlbWVudCBTLiAgT1VUUFVUIGlzIHRoZSBvdXRwdXQgc2VjdGlvbi4gICovCi0KLXN0YXRpYyB2b2lkCi13aWxkIChzLCBzZWN0aW9uLCBmaWxlLCB0YXJnZXQsIG91dHB1dCkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICBjb25zdCBjaGFyICp0YXJnZXQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dDsKLXsKLSAgd2Fsa193aWxkIChzLCBzZWN0aW9uLCBmaWxlLCBvdXRwdXRfc2VjdGlvbl9jYWxsYmFjaywgKHZvaWQgKikgb3V0cHV0KTsKLQotICBpZiAoc2VjdGlvbiAhPSAoY2hhciAqKSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHNlY3Rpb24sICJDT01NT04iKSA9PSAwCi0gICAgICAmJiBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID09IE5VTEwpCi0gICAgewotICAgICAgLyogUmVtZW1iZXIgdGhlIHNlY3Rpb24gdGhhdCBjb21tb24gaXMgZ29pbmcgdG8gaW4gY2FzZSB3ZSBsYXRlcgotICAgICAgICAgZ2V0IHNvbWV0aGluZyB3aGljaCBkb2Vzbid0IGtub3cgd2hlcmUgdG8gcHV0IGl0LiAgKi8KLSAgICAgIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPSBvdXRwdXQ7Ci0gICAgfQotfQotCi0vKiBPcGVuIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXN0YXRpYyBiZmQgKgotb3Blbl9vdXRwdXQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGJmZCAqb3V0cHV0OwotCi0gIGlmIChvdXRwdXRfdGFyZ2V0ID09IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGN1cnJlbnRfdGFyZ2V0ICE9IChjaGFyICopIE5VTEwpCi0Jb3V0cHV0X3RhcmdldCA9IGN1cnJlbnRfdGFyZ2V0OwotICAgICAgZWxzZQotCW91dHB1dF90YXJnZXQgPSBkZWZhdWx0X3RhcmdldDsKLSAgICB9Ci0gIG91dHB1dCA9IGJmZF9vcGVudyAobmFtZSwgb3V0cHV0X3RhcmdldCk7Ci0KLSAgaWYgKG91dHB1dCA9PSAoYmZkICopIE5VTEwpCi0gICAgewotICAgICAgaWYgKGJmZF9nZXRfZXJyb3IgKCkgPT0gYmZkX2Vycm9yX2ludmFsaWRfdGFyZ2V0KQotCXsKLQkgIGVpbmZvIChfKCIlUCVGOiB0YXJnZXQgJXMgbm90IGZvdW5kXG4iKSwgb3V0cHV0X3RhcmdldCk7Ci0JfQotICAgICAgZWluZm8gKF8oIiVQJUY6IGNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzOiAlRVxuIiksIG5hbWUpOwotICAgIH0KLQotICBkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZSA9IHRydWU7Ci0KLSAgLyogIG91dHB1dC0+ZmxhZ3MgfD0gRF9QQUdFRDsqLwotCi0gIGlmICghIGJmZF9zZXRfZm9ybWF0IChvdXRwdXQsIGJmZF9vYmplY3QpKQotICAgIGVpbmZvIChfKCIlUCVGOiVzOiBjYW4gbm90IG1ha2Ugb2JqZWN0IGZpbGU6ICVFXG4iKSwgbmFtZSk7Ci0gIGlmICghIGJmZF9zZXRfYXJjaF9tYWNoIChvdXRwdXQsCi0JCQkgICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSwKLQkJCSAgIGxkZmlsZV9vdXRwdXRfbWFjaGluZSkpCi0gICAgZWluZm8gKF8oIiVQJUY6JXM6IGNhbiBub3Qgc2V0IGFyY2hpdGVjdHVyZTogJUVcbiIpLCBuYW1lKTsKLQotICBsaW5rX2luZm8uaGFzaCA9IGJmZF9saW5rX2hhc2hfdGFibGVfY3JlYXRlIChvdXRwdXQpOwotICBpZiAobGlua19pbmZvLmhhc2ggPT0gKHN0cnVjdCBiZmRfbGlua19oYXNoX3RhYmxlICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJUY6IGNhbiBub3QgY3JlYXRlIGxpbmsgaGFzaCB0YWJsZTogJUVcbiIpKTsKLQotICBiZmRfc2V0X2dwX3NpemUgKG91dHB1dCwgZ19zd2l0Y2hfdmFsdWUpOwotICByZXR1cm4gb3V0cHV0OwotfQotCi0KLQotCi1zdGF0aWMgdm9pZAotbGRsYW5nX29wZW5fb3V0cHV0IChzdGF0ZW1lbnQpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzdGF0ZW1lbnQ7Ci17Ci0gIHN3aXRjaCAoc3RhdGVtZW50LT5oZWFkZXIudHlwZSkKLSAgICB7Ci0gICAgY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIEFTU0VSVCAob3V0cHV0X2JmZCA9PSAoYmZkICopIE5VTEwpOwotICAgICAgb3V0cHV0X2JmZCA9IG9wZW5fb3V0cHV0IChzdGF0ZW1lbnQtPm91dHB1dF9zdGF0ZW1lbnQubmFtZSk7Ci0gICAgICBsZGVtdWxfc2V0X291dHB1dF9hcmNoICgpOwotICAgICAgaWYgKGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgJiYgIWxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gRF9QQUdFRDsKLSAgICAgIGVsc2UKLQlvdXRwdXRfYmZkLT5mbGFncyAmPSB+RF9QQUdFRDsKLSAgICAgIGlmIChjb25maWcudGV4dF9yZWFkX29ubHkpCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gV1BfVEVYVDsKLSAgICAgIGVsc2UKLQlvdXRwdXRfYmZkLT5mbGFncyAmPSB+V1BfVEVYVDsKLSAgICAgIGlmIChsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0KQotCW91dHB1dF9iZmQtPmZsYWdzIHw9IEJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci0gICAgICBlbHNlCi0Jb3V0cHV0X2JmZC0+ZmxhZ3MgJj0gfkJGRF9UUkFESVRJT05BTF9GT1JNQVQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0gICAgICBjdXJyZW50X3RhcmdldCA9IHN0YXRlbWVudC0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiBPcGVuIGFsbCB0aGUgaW5wdXQgZmlsZXMuICAqLwotCi1zdGF0aWMgdm9pZAotb3Blbl9pbnB1dF9iZmRzIChzLCBmb3JjZSkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLSAgICAgYm9vbGVhbiBmb3JjZTsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIG9wZW5faW5wdXRfYmZkcyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLCBmb3JjZSk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBvcGVuX2lucHV0X2JmZHMgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLCBmb3JjZSk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIC8qIE1heWJlIHdlIHNob3VsZCBsb2FkIHRoZSBmaWxlJ3Mgc3ltYm9scyAqLwotCSAgaWYgKHMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lCi0JICAgICAgJiYgISB3aWxkY2FyZHAgKHMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lKSkKLQkgICAgKHZvaWQpIGxvb2t1cF9uYW1lIChzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSk7Ci0JICBvcGVuX2lucHV0X2JmZHMgKHMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsIGZvcmNlKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKnVuZGVmczsKLQotCSAgICAvKiBXZSBtdXN0IGNvbnRpbnVhbGx5IHNlYXJjaCB0aGUgZW50cmllcyBpbiB0aGUgZ3JvdXAKLSAgICAgICAgICAgICAgIHVudGlsIG5vIG5ldyBzeW1ib2xzIGFyZSBhZGRlZCB0byB0aGUgbGlzdCBvZiB1bmRlZmluZWQKLSAgICAgICAgICAgICAgIHN5bWJvbHMuICAqLwotCi0JICAgIGRvCi0JICAgICAgewotCQl1bmRlZnMgPSBsaW5rX2luZm8uaGFzaC0+dW5kZWZzX3RhaWw7Ci0JCW9wZW5faW5wdXRfYmZkcyAocy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsIHRydWUpOwotCSAgICAgIH0KLQkgICAgd2hpbGUgKHVuZGVmcyAhPSBsaW5rX2luZm8uaGFzaC0+dW5kZWZzX3RhaWwpOwotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX3RhcmdldF9zdGF0ZW1lbnRfZW51bToKLQkgIGN1cnJlbnRfdGFyZ2V0ID0gcy0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQ7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfaW5wdXRfc3RhdGVtZW50X2VudW06Ci0JICBpZiAocy0+aW5wdXRfc3RhdGVtZW50LnJlYWwgPT0gdHJ1ZSkKLQkgICAgewotCSAgICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBhZGQ7Ci0KLQkgICAgICBzLT5pbnB1dF9zdGF0ZW1lbnQudGFyZ2V0ID0gY3VycmVudF90YXJnZXQ7Ci0KLQkgICAgICAvKiBJZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGZyb20gd2l0aGluIGEgZ3JvdXAsIGFuZCB0aGlzCi0gICAgICAgICAgICAgICAgIGlzIGFuIGFyY2hpdmUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBzZWFyY2hlZCwgdGhlbgotICAgICAgICAgICAgICAgICBmb3JjZSBpdCB0byBiZSByZXNlYXJjaGVkLiAgKi8KLQkgICAgICBpZiAoZm9yY2UKLQkJICAmJiBzLT5pbnB1dF9zdGF0ZW1lbnQubG9hZGVkCi0JCSAgJiYgYmZkX2NoZWNrX2Zvcm1hdCAocy0+aW5wdXRfc3RhdGVtZW50LnRoZV9iZmQsCi0JCQkJICAgICAgIGJmZF9hcmNoaXZlKSkKLQkJcy0+aW5wdXRfc3RhdGVtZW50LmxvYWRlZCA9IGZhbHNlOwotCi0JICAgICAgbGFuZ19saXN0X2luaXQgKCZhZGQpOwotCi0JICAgICAgbG9hZF9zeW1ib2xzICgmcy0+aW5wdXRfc3RhdGVtZW50LCAmYWRkKTsKLQotCSAgICAgIGlmIChhZGQuaGVhZCAhPSBOVUxMKQotCQl7Ci0JCSAgKmFkZC50YWlsID0gcy0+bmV4dDsKLQkJICBzLT5uZXh0ID0gYWRkLmhlYWQ7Ci0JCX0KLQkgICAgfQotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLS8qIElmIHRoZXJlIGFyZSBbQ09NTU9OU10gc3RhdGVtZW50cywgcHV0IGEgd2lsZCBvbmUgaW50byB0aGUgYnNzIHNlY3Rpb24gKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfcmVhc29uYWJsZV9kZWZhdWx0cyAoKQotewotI2lmIDAKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLnRleHQiKTsKLSAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbG9va3VwICgiLmRhdGEiKTsKLQotICBkZWZhdWx0X2NvbW1vbl9zZWN0aW9uID0KLSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKCIuYnNzIik7Ci0KLQotICBpZiAocGxhY2VkX2NvbW1vbnMgPT0gZmFsc2UpCi0gICAgewotICAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPQotICAgICAgbmV3X3N0YXQgKGxhbmdfd2lsZF9zdGF0ZW1lbnQsCi0JCSZkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLT5jaGlsZHJlbik7Ci0KLSAgICAgIG5ldy0+c2VjdGlvbl9uYW1lID0gIkNPTU1PTiI7Ci0gICAgICBuZXctPmZpbGVuYW1lID0gKGNoYXIgKikgTlVMTDsKLSAgICAgIGxhbmdfbGlzdF9pbml0ICgmbmV3LT5jaGlsZHJlbik7Ci0gICAgfQotI2VuZGlmCi0KLX0KLQotLyoKLSBBZGQgdGhlIHN1cHBsaWVkIG5hbWUgdG8gdGhlIHN5bWJvbCB0YWJsZSBhcyBhbiB1bmRlZmluZWQgcmVmZXJlbmNlLgotIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBjaGFpbiBhcyB3ZSBvcGVuIGlucHV0IGJmZHMKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3QKLXsKLSAgc3RydWN0IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0ICpuZXh0OwotICBjaGFyICpuYW1lOwotfSAgICAgICAgICAgICAgICAgICAgICAgbGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZTsKLQotc3RhdGljIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKmxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0KLXZvaWQKLWxkbGFuZ19hZGRfdW5kZWYgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKkNPTlNUIG5hbWU7Ci17Ci0gIGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X3R5cGUgKm5ldyA9Ci0gICAgKChsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICopCi0gICAgIHN0YXRfYWxsb2MgKHNpemVvZiAobGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSkpKTsKLQotICBuZXctPm5leHQgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOwotICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkID0gbmV3OwotCi0gIG5ldy0+bmFtZSA9IGJ1eXN0cmluZyAobmFtZSk7Ci19Ci0KLS8qIFJ1biB0aHJvdWdoIHRoZSBsaXN0IG9mIHVuZGVmaW5lZHMgY3JlYXRlZCBhYm92ZSBhbmQgcGxhY2UgdGhlbQotICAgaW50byB0aGUgbGlua2VyIGhhc2ggdGFibGUgYXMgdW5kZWZpbmVkIHN5bWJvbHMgYmVsb25naW5nIHRvIHRoZQotICAgc2NyaXB0IGZpbGUuCi0qLwotc3RhdGljIHZvaWQKLWxhbmdfcGxhY2VfdW5kZWZpbmVkcyAoKQotewotICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICpwdHI7Ci0KLSAgZm9yIChwdHIgPSBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF9oZWFkOwotICAgICAgIHB0ciAhPSAobGRsYW5nX3VuZGVmX2NoYWluX2xpc3RfdHlwZSAqKSBOVUxMOwotICAgICAgIHB0ciA9IHB0ci0+bmV4dCkKLSAgICB7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgcHRyLT5uYW1lLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLQllaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotICAgICAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JewotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkOwotCSAgaC0+dS51bmRlZi5hYmZkID0gTlVMTDsKLQkgIGJmZF9saW5rX2FkZF91bmRlZiAobGlua19pbmZvLmhhc2gsIGgpOwotCX0KLSAgICB9Ci19Ci0KLS8qIE9wZW4gaW5wdXQgZmlsZXMgYW5kIGF0dGF0Y2ggdG8gb3V0cHV0IHNlY3Rpb25zICovCi1zdGF0aWMgdm9pZAotbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAocywgdGFyZ2V0LCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzOwotICAgICBDT05TVCBjaGFyICp0YXJnZXQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci17Ci0gIGZvciAoOyBzICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0JewotCi0KLQljYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLQkgIHdpbGQgKCZzLT53aWxkX3N0YXRlbWVudCwgcy0+d2lsZF9zdGF0ZW1lbnQuc2VjdGlvbl9uYW1lLAotCQlzLT53aWxkX3N0YXRlbWVudC5maWxlbmFtZSwgdGFyZ2V0LAotCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCi0JICBicmVhazsKLQljYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotCSAgbWFwX2lucHV0X3RvX291dHB1dF9zZWN0aW9ucyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCQl0YXJnZXQsCi0JCQkJCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkJdGFyZ2V0LAotCQkJCQkmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCSAgdGFyZ2V0ID0gcy0+dGFyZ2V0X3N0YXRlbWVudC50YXJnZXQ7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0JICBtYXBfaW5wdXRfdG9fb3V0cHV0X3NlY3Rpb25zIChzLT5ncm91cF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkJdGFyZ2V0LAotCQkJCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JY2FzZSBsYW5nX3JlbG9jX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgIT0gTlVMTAotCSAgICAgICYmIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24gPT0gTlVMTCkKLQkgICAgaW5pdF9vcyAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotCSAgaWYgKG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAhPSBOVUxMCi0JICAgICAgJiYgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBpbml0X29zIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotCi0JICAvKiBNYWtlIHN1cmUgdGhhdCBhbnkgc2VjdGlvbnMgbWVudGlvbmVkIGluIHRoZSBhc3NpZ25tZW50Ci0gICAgICAgICAgICAgYXJlIGluaXRpYWxpemVkLiAgKi8KLQkgIGV4cF9pbml0X29zIChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHApOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X2VudW06Ci0JICBGQUlMICgpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICAvKiBNYXJrIHRoZSBzcGVjaWZpZWQgc2VjdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBhZGRyZXNzICovCi0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0KLQkgICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAKLQkJKHMtPmFkZHJlc3Nfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSk7Ci0KLQkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIGluaXRfb3MgKG9zKTsKLQkgICAgb3MtPmFkZHJfdHJlZSA9IHMtPmFkZHJlc3Nfc3RhdGVtZW50LmFkZHJlc3M7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpCi0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci17Ci0gIGFzZWN0aW9uICpzZWN0aW9uID0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLSAgaW50IGxlbjsKLQotICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ICE9IGFic19vdXRwdXRfc2VjdGlvbikKLSAgICB7Ci0gICAgICBtaW5mbyAoIlxuJXMiLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPm5hbWUpOwotCi0gICAgICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotCXsKLQkgIHByaW50X2RvdCA9IHNlY3Rpb24tPnZtYTsKLQotCSAgbGVuID0gc3RybGVuIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPm5hbWUpOwotCSAgaWYgKGxlbiA+PSBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCAtIDEpCi0JICAgIHsKLQkgICAgICBwcmludF9ubCAoKTsKLQkgICAgICBsZW4gPSAwOwotCSAgICB9Ci0JICB3aGlsZSAobGVuIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEgpCi0JICAgIHsKLQkgICAgICBwcmludF9zcGFjZSAoKTsKLQkgICAgICArK2xlbjsKLQkgICAgfQotCi0JICBtaW5mbyAoIjB4JVYgJVciLCBzZWN0aW9uLT52bWEsIHNlY3Rpb24tPl9yYXdfc2l6ZSk7Ci0KLQkgIGlmIChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmxvYWRfYmFzZSAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgYmZkX3ZtYSBhZGRyOwotCi0JICAgICAgYWRkciA9IGV4cF9nZXRfYWJzX2ludCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5sb2FkX2Jhc2UsIDAsCi0JCQkJICAgICAgImxvYWQgYmFzZSIsIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0JICAgICAgbWluZm8gKF8oIiBsb2FkIGFkZHJlc3MgMHglViIpLCBhZGRyKTsKLQkgICAgfQotCX0KLQotICAgICAgcHJpbnRfbmwgKCk7Ci0gICAgfQotCi0gIHByaW50X3N0YXRlbWVudF9saXN0IChvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmNoaWxkcmVuLmhlYWQsCi0JCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYXNzaWdubWVudCAoYXNzaWdubWVudCwgb3V0cHV0X3NlY3Rpb24pCi0gICAgIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqIGFzc2lnbm1lbnQ7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbjsKLXsKLSAgaW50IGk7Ci0gIGV0cmVlX3ZhbHVlX3R5cGUgcmVzdWx0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotICAgIHByaW50X3NwYWNlICgpOwotCi0gIHJlc3VsdCA9IGV4cF9mb2xkX3RyZWUgKGFzc2lnbm1lbnQtPmV4cC0+YXNzaWduLnNyYywgb3V0cHV0X3NlY3Rpb24sCi0JCQkgIGxhbmdfZmluYWxfcGhhc2VfZW51bSwgcHJpbnRfZG90LCAmcHJpbnRfZG90KTsKLSAgaWYgKHJlc3VsdC52YWxpZF9wKQotICAgIG1pbmZvICgiMHglViIsIHJlc3VsdC52YWx1ZSArIHJlc3VsdC5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIG1pbmZvICgiKnVuZGVmKiAgICIpOwotI2lmZGVmIEJGRDY0Ci0gICAgICBtaW5mbyAoIiAgICAgICAgIik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgbWluZm8gKCIgICAgICAgICAgICAgICAgIik7Ci0KLSAgZXhwX3ByaW50X3RyZWUgKGFzc2lnbm1lbnQtPmV4cCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9pbnB1dF9zdGF0ZW1lbnQgKHN0YXRtKQotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICogc3RhdG07Ci17Ci0gIGlmIChzdGF0bS0+ZmlsZW5hbWUgIT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJMT0FEICVzXG4iLCBzdGF0bS0+ZmlsZW5hbWUpOwotICAgIH0KLX0KLQotLyogUHJpbnQgYWxsIHN5bWJvbHMgZGVmaW5lZCBpbiBhIHBhcnRpY3VsYXIgc2VjdGlvbi4gIFRoaXMgaXMgY2FsbGVkCi0gICB2aWEgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZS4gICovCi0KLXN0YXRpYyBib29sZWFuIAotcHJpbnRfb25lX3N5bWJvbCAoaGFzaF9lbnRyeSwgcHRyKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaGFzaF9lbnRyeTsKLSAgICAgUFRSIHB0cjsKLXsKLSAgYXNlY3Rpb24gKnNlYyA9IChhc2VjdGlvbiAqKSBwdHI7Ci0KLSAgaWYgKChoYXNoX2VudHJ5LT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgIHx8IGhhc2hfZW50cnktPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgc2VjID09IGhhc2hfZW50cnktPnUuZGVmLnNlY3Rpb24pCi0gICAgewotICAgICAgaW50IGk7Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSDsgaSsrKQotCXByaW50X3NwYWNlICgpOwotICAgICAgbWluZm8gKCIweCVWICAgIiwKLQkgICAgIChoYXNoX2VudHJ5LT51LmRlZi52YWx1ZQotCSAgICAgICsgaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X29mZnNldAotCSAgICAgICsgaGFzaF9lbnRyeS0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24tPnZtYSkpOwotCi0gICAgICBtaW5mbyAoIiAgICAgICAgICAgICAlVFxuIiwgaGFzaF9lbnRyeS0+cm9vdC5zdHJpbmcpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW5wdXQgc2VjdGlvbiB0byB0aGUgbWFwIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5wdXRfc2VjdGlvbiAoaW4pCi0gICAgIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICogaW47Ci17Ci0gIGFzZWN0aW9uICppID0gaW4tPnNlY3Rpb247Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZSA9IGktPl9jb29rZWRfc2l6ZSAhPSAwID8gaS0+X2Nvb2tlZF9zaXplIDogaS0+X3Jhd19zaXplOwotCi0gIGlmIChzaXplICE9IDApCi0gICAgewotICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgICAgIG1pbmZvICgiJXMiLCBpLT5uYW1lKTsKLQotICAgICAgaWYgKGktPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0JewotCSAgaW50IGxlbjsKLQotCSAgbGVuID0gMSArIHN0cmxlbiAoaS0+bmFtZSk7Ci0JICBpZiAobGVuID49IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIIC0gMSkKLQkgICAgewotCSAgICAgIHByaW50X25sICgpOwotCSAgICAgIGxlbiA9IDA7Ci0JICAgIH0KLQkgIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKLQkgICAgewotCSAgICAgIHByaW50X3NwYWNlICgpOwotCSAgICAgICsrbGVuOwotCSAgICB9Ci0KLQkgIG1pbmZvICgiMHglViAlVyAlQlxuIiwKLQkJIGktPm91dHB1dF9zZWN0aW9uLT52bWEgKyBpLT5vdXRwdXRfb2Zmc2V0LCBzaXplLAotCQkgaS0+b3duZXIpOwotCi0JICBpZiAoaS0+X2Nvb2tlZF9zaXplICE9IDAgJiYgaS0+X2Nvb2tlZF9zaXplICE9IGktPl9yYXdfc2l6ZSkKLQkgICAgewotCSAgICAgIGxlbiA9IFNFQ1RJT05fTkFNRV9NQVBfTEVOR1RIICsgMzsKLSNpZmRlZiBCRkQ2NAotCSAgICAgIGxlbiArPSAxNjsKLSNlbHNlCi0JICAgICAgbGVuICs9IDg7Ci0jZW5kaWYKLQkgICAgICB3aGlsZSAobGVuID4gMCkKLQkJewotCQkgIHByaW50X3NwYWNlICgpOwotCQkgIC0tbGVuOwotCQl9Ci0KLQkgICAgICBtaW5mbyAoXygiJVcgKHNpemUgYmVmb3JlIHJlbGF4aW5nKVxuIiksIGktPl9yYXdfc2l6ZSk7Ci0JICAgIH0KLQotCSAgYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIHByaW50X29uZV9zeW1ib2wsIChQVFIpIGkpOwotCi0JICBwcmludF9kb3QgPSBpLT5vdXRwdXRfc2VjdGlvbi0+dm1hICsgaS0+b3V0cHV0X29mZnNldCArIHNpemU7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXByaW50X2ZpbGxfc3RhdGVtZW50IChmaWxsKQotICAgICBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKiBmaWxsOwotewotICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICIgRklMTCBtYXNrIDB4JXhcbiIsIGZpbGwtPmZpbGwpOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfZGF0YV9zdGF0ZW1lbnQgKGRhdGEpCi0gICAgIGxhbmdfZGF0YV9zdGF0ZW1lbnRfdHlwZSAqIGRhdGE7Ci17Ci0gIGludCBpOwotICBiZmRfdm1hIGFkZHI7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLSAgY29uc3QgY2hhciAqbmFtZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEg7IGkrKykKLSAgICBwcmludF9zcGFjZSAoKTsKLQotICBhZGRyID0gZGF0YS0+b3V0cHV0X3ZtYTsKLSAgaWYgKGRhdGEtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgYWRkciArPSBkYXRhLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHN3aXRjaCAoZGF0YS0+dHlwZSkKLSAgICB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIGNhc2UgQllURToKLSAgICAgIHNpemUgPSBCWVRFX1NJWkU7Ci0gICAgICBuYW1lID0gIkJZVEUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSE9SVDoKLSAgICAgIHNpemUgPSBTSE9SVF9TSVpFOwotICAgICAgbmFtZSA9ICJTSE9SVCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIExPTkc6Ci0gICAgICBzaXplID0gTE9OR19TSVpFOwotICAgICAgbmFtZSA9ICJMT05HIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUVVBRDoKLSAgICAgIHNpemUgPSBRVUFEX1NJWkU7Ci0gICAgICBuYW1lID0gIlFVQUQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTUVVBRDoKLSAgICAgIHNpemUgPSBRVUFEX1NJWkU7Ci0gICAgICBuYW1lID0gIlNRVUFEIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICBtaW5mbyAoIjB4JVYgJVcgJXMgMHgldiIsIGFkZHIsIHNpemUsIG5hbWUsIGRhdGEtPnZhbHVlKTsKLQotICBpZiAoZGF0YS0+ZXhwLT50eXBlLm5vZGVfY2xhc3MgIT0gZXRyZWVfdmFsdWUpCi0gICAgewotICAgICAgcHJpbnRfc3BhY2UgKCk7Ci0gICAgICBleHBfcHJpbnRfdHJlZSAoZGF0YS0+ZXhwKTsKLSAgICB9Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHNpemU7Ci19Ci0KLS8qIFByaW50IGFuIGFkZHJlc3Mgc3RhdGVtZW50LiAgVGhlc2UgYXJlIGdlbmVyYXRlZCBieSBvcHRpb25zIGxpa2UKLSAgIC1UdGV4dC4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hZGRyZXNzX3N0YXRlbWVudCAoYWRkcmVzcykKLSAgICAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICphZGRyZXNzOwotewotICBtaW5mbyAoXygiQWRkcmVzcyBvZiBzZWN0aW9uICVzIHNldCB0byAiKSwgYWRkcmVzcy0+c2VjdGlvbl9uYW1lKTsKLSAgZXhwX3ByaW50X3RyZWUgKGFkZHJlc3MtPmFkZHJlc3MpOwotICBwcmludF9ubCAoKTsKLX0KLQotLyogUHJpbnQgYSByZWxvYyBzdGF0ZW1lbnQuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfcmVsb2Nfc3RhdGVtZW50IChyZWxvYykKLSAgICAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcmVsb2M7Ci17Ci0gIGludCBpOwotICBiZmRfdm1hIGFkZHI7Ci0gIGJmZF9zaXplX3R5cGUgc2l6ZTsKLQotICBmb3IgKGkgPSAwOyBpIDwgU0VDVElPTl9OQU1FX01BUF9MRU5HVEg7IGkrKykKLSAgICBwcmludF9zcGFjZSAoKTsKLQotICBhZGRyID0gcmVsb2MtPm91dHB1dF92bWE7Ci0gIGlmIChyZWxvYy0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICBhZGRyICs9IHJlbG9jLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotCi0gIHNpemUgPSBiZmRfZ2V0X3JlbG9jX3NpemUgKHJlbG9jLT5ob3d0byk7Ci0KLSAgbWluZm8gKCIweCVWICVXIFJFTE9DICVzICIsIGFkZHIsIHNpemUsIHJlbG9jLT5ob3d0by0+bmFtZSk7Ci0KLSAgaWYgKHJlbG9jLT5uYW1lICE9IE5VTEwpCi0gICAgbWluZm8gKCIlcysiLCByZWxvYy0+bmFtZSk7Ci0gIGVsc2UKLSAgICBtaW5mbyAoIiVzKyIsIHJlbG9jLT5zZWN0aW9uLT5uYW1lKTsKLQotICBleHBfcHJpbnRfdHJlZSAocmVsb2MtPmFkZGVuZF9leHApOwotCi0gIHByaW50X25sICgpOwotCi0gIHByaW50X2RvdCA9IGFkZHIgKyBzaXplOwotfSAgCi0KLXN0YXRpYyB2b2lkCi1wcmludF9wYWRkaW5nX3N0YXRlbWVudCAocykKLSAgICAgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlICpzOwotewotICBpbnQgbGVuOwotICBiZmRfdm1hIGFkZHI7Ci0KLSAgbWluZm8gKCIgKmZpbGwqIik7Ci0KLSAgbGVuID0gc2l6ZW9mICIgKmZpbGwqIiAtIDE7Ci0gIHdoaWxlIChsZW4gPCBTRUNUSU9OX05BTUVfTUFQX0xFTkdUSCkKLSAgICB7Ci0gICAgICBwcmludF9zcGFjZSAoKTsKLSAgICAgICsrbGVuOwotICAgIH0KLQotICBhZGRyID0gcy0+b3V0cHV0X29mZnNldDsKLSAgaWYgKHMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwpCi0gICAgYWRkciArPSBzLT5vdXRwdXRfc2VjdGlvbi0+dm1hOwotICBtaW5mbyAoIjB4JVYgJVciLCBhZGRyLCBzLT5zaXplKTsKLQotICBpZiAocy0+ZmlsbCAhPSAwKQotICAgIG1pbmZvICgiICV1Iiwgcy0+ZmlsbCk7Ci0KLSAgcHJpbnRfbmwgKCk7Ci0KLSAgcHJpbnRfZG90ID0gYWRkciArIHMtPnNpemU7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF93aWxkX3N0YXRlbWVudCAodywgb3MpCi0gICAgIGxhbmdfd2lsZF9zdGF0ZW1lbnRfdHlwZSAqIHc7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvczsKLXsKLSAgcHJpbnRfc3BhY2UgKCk7Ci0KLSAgaWYgKHctPmZpbGVuYW1lc19zb3J0ZWQpCi0gICAgbWluZm8gKCJTT1JUKCIpOwotICBpZiAody0+ZXhjbHVkZV9maWxlbmFtZSAhPSBOVUxMKQotICAgIG1pbmZvICgiRVhDTFVERV9GSUxFICggJXMgKSIsIHctPmV4Y2x1ZGVfZmlsZW5hbWUpOwotICBpZiAody0+ZmlsZW5hbWUgIT0gTlVMTCkKLSAgICBtaW5mbyAoIiVzIiwgdy0+ZmlsZW5hbWUpOwotICBlbHNlCi0gICAgbWluZm8gKCIqIik7Ci0gIGlmICh3LT5maWxlbmFtZXNfc29ydGVkKQotICAgIG1pbmZvICgiKSIpOwotCi0gIG1pbmZvICgiKCIpOwotICBpZiAody0+c2VjdGlvbnNfc29ydGVkKQotICAgIG1pbmZvICgiU09SVCgiKTsKLSAgaWYgKHctPnNlY3Rpb25fbmFtZSAhPSBOVUxMKQotICAgIG1pbmZvICgiJXMiLCB3LT5zZWN0aW9uX25hbWUpOwotICBlbHNlCi0gICAgbWluZm8gKCIqIik7Ci0gIGlmICh3LT5zZWN0aW9uc19zb3J0ZWQpCi0gICAgbWluZm8gKCIpIik7Ci0gIG1pbmZvICgiKSIpOwotCi0gIHByaW50X25sICgpOwotCi0gIHByaW50X3N0YXRlbWVudF9saXN0ICh3LT5jaGlsZHJlbi5oZWFkLCBvcyk7Ci19Ci0KLS8qIFByaW50IGEgZ3JvdXAgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2dyb3VwIChzLCBvcykKLSAgICAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSAqczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlNUQVJUIEdST1VQXG4iKTsKLSAgcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMtPmNoaWxkcmVuLmhlYWQsIG9zKTsKLSAgZnByaW50ZiAoY29uZmlnLm1hcF9maWxlLCAiRU5EIEdST1VQXG4iKTsKLX0KLQotLyogUHJpbnQgdGhlIGxpc3Qgb2Ygc3RhdGVtZW50cyBpbiBTLgotICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZvciBhbnkgc3RhdGVtZW50IHR5cGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhdGVtZW50X2xpc3QgKHMsIG9zKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLXsKLSAgd2hpbGUgKHMgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBwcmludF9zdGF0ZW1lbnQgKHMsIG9zKTsKLSAgICAgIHMgPSBzLT5uZXh0OwotICAgIH0KLX0KLQotLyogUHJpbnQgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiBzdGF0ZW1lbnQgbGlzdCBTLgotICAgVGhpcyBjYW4gYmUgY2FsbGVkIGZvciBhbnkgc3RhdGVtZW50IHR5cGUuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhdGVtZW50IChzLCBvcykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqb3M7Ci17Ci0gIHN3aXRjaCAocy0+aGVhZGVyLnR5cGUpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsIF8oIkZhaWwgd2l0aCAlZFxuIiksIHMtPmhlYWRlci50eXBlKTsKLSAgICAgIEZBSUwgKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfY29uc3RydWN0b3JzX3N0YXRlbWVudF9lbnVtOgotICAgICAgaWYgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCAhPSBOVUxMKQotCXsKLQkgIGlmIChjb25zdHJ1Y3RvcnNfc29ydGVkKQotCSAgICBtaW5mbyAoIiBTT1JUIChDT05TVFJVQ1RPUlMpXG4iKTsKLQkgIGVsc2UKLQkgICAgbWluZm8gKCIgQ09OU1RSVUNUT1JTXG4iKTsKLQkgIHByaW50X3N0YXRlbWVudF9saXN0IChjb25zdHJ1Y3Rvcl9saXN0LmhlYWQsIG9zKTsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfd2lsZF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X3dpbGRfc3RhdGVtZW50ICgmcy0+d2lsZF9zdGF0ZW1lbnQsIG9zKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfYWRkcmVzc19zdGF0ZW1lbnQgKCZzLT5hZGRyZXNzX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0gICAgICBtaW5mbyAoIiBDUkVBVEVfT0JKRUNUX1NZTUJPTFNcbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9maWxsX3N0YXRlbWVudCAoJnMtPmZpbGxfc3RhdGVtZW50KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfZGF0YV9zdGF0ZW1lbnQgKCZzLT5kYXRhX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9yZWxvY19zdGF0ZW1lbnQgKCZzLT5yZWxvY19zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLSAgICAgIHByaW50X2lucHV0X3NlY3Rpb24gKCZzLT5pbnB1dF9zZWN0aW9uKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotICAgICAgcHJpbnRfcGFkZGluZ19zdGF0ZW1lbnQgKCZzLT5wYWRkaW5nX3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgKCZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9hc3NpZ25tZW50ICgmcy0+YXNzaWdubWVudF9zdGF0ZW1lbnQsIG9zKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0gICAgICBmcHJpbnRmIChjb25maWcubWFwX2ZpbGUsICJUQVJHRVQoJXMpXG4iLCBzLT50YXJnZXRfc3RhdGVtZW50LnRhcmdldCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotICAgICAgbWluZm8gKCJPVVRQVVQoJXMiLCBzLT5vdXRwdXRfc3RhdGVtZW50Lm5hbWUpOwotICAgICAgaWYgKG91dHB1dF90YXJnZXQgIT0gTlVMTCkKLQltaW5mbyAoIiAlcyIsIG91dHB1dF90YXJnZXQpOwotICAgICAgbWluZm8gKCIpXG4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHByaW50X2lucHV0X3N0YXRlbWVudCAoJnMtPmlucHV0X3N0YXRlbWVudCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGxhbmdfZ3JvdXBfc3RhdGVtZW50X2VudW06Ci0gICAgICBwcmludF9ncm91cCAoJnMtPmdyb3VwX3N0YXRlbWVudCwgb3MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X2VudW06Ci0gICAgICBGQUlMICgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfc3RhdGVtZW50cyAoKQotewotICBwcmludF9zdGF0ZW1lbnRfbGlzdCAoc3RhdGVtZW50X2xpc3QuaGVhZCwgYWJzX291dHB1dF9zZWN0aW9uKTsKLX0KLQotLyogUHJpbnQgdGhlIGZpcnN0IE4gc3RhdGVtZW50cyBpbiBzdGF0ZW1lbnQgbGlzdCBTIHRvIFNUREVSUi4KLSAgIElmIE4gPT0gMCwgbm90aGluZyBpcyBwcmludGVkLgotICAgSWYgTiA8IDAsIHRoZSBlbnRpcmUgbGlzdCBpcyBwcmludGVkLgotICAgSW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gR0RCLiAgKi8KLQotdm9pZAotZHByaW50X3N0YXRlbWVudCAocywgbikKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci0gICAgIGludCBuOwotewotICBGSUxFICptYXBfc2F2ZSA9IGNvbmZpZy5tYXBfZmlsZTsKLQotICBjb25maWcubWFwX2ZpbGUgPSBzdGRlcnI7Ci0KLSAgaWYgKG4gPCAwKQotICAgIHByaW50X3N0YXRlbWVudF9saXN0IChzLCBhYnNfb3V0cHV0X3NlY3Rpb24pOwotICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKHMgJiYgLS1uID49IDApCi0JewotCSAgcHJpbnRfc3RhdGVtZW50IChzLCBhYnNfb3V0cHV0X3NlY3Rpb24pOwotCSAgcyA9IHMtPm5leHQ7Ci0JfQotICAgIH0KLQotICBjb25maWcubWFwX2ZpbGUgPSBtYXBfc2F2ZTsKLX0KLQotc3RhdGljIGJmZF92bWEKLWluc2VydF9wYWQgKHRoaXNfcHRyLCBmaWxsLCBwb3dlciwgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LCBkb3QpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiogdGhpc19wdHI7Ci0gICAgIGZpbGxfdHlwZSBmaWxsOwotICAgICB1bnNpZ25lZCBpbnQgcG93ZXI7Ci0gICAgIGFzZWN0aW9uICogb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICAgICBiZmRfdm1hIGRvdDsKLXsKLSAgLyogQWxpZ24gdGhpcyBzZWN0aW9uIGZpcnN0IHRvIHRoZQotICAgICBpbnB1dCBzZWN0aW9ucyByZXF1aXJlbWVudCwgdGhlbgotICAgICB0byB0aGUgb3V0cHV0IHNlY3Rpb24ncyByZXF1aXJlbWVudC4KLSAgICAgSWYgdGhpcyBhbGlnbm1lbnQgaXMgPiB0aGFuIGFueSBzZWVuIGJlZm9yZSwKLSAgICAgdGhlbiByZWNvcmQgaXQgdG9vLiBQZXJmb3JtIHRoZSBhbGlnbm1lbnQgYnkKLSAgICAgaW5zZXJ0aW5nIGEgbWFnaWMgJ3BhZGRpbmcnIHN0YXRlbWVudC4KLSAgICAgKi8KLQotICB1bnNpZ25lZCBpbnQgYWxpZ25tZW50X25lZWRlZCA9IGFsaWduX3Bvd2VyIChkb3QsIHBvd2VyKSAtIGRvdDsKLQotICBpZiAoYWxpZ25tZW50X25lZWRlZCAhPSAwKQotICAgIHsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKm5ldyA9Ci0JKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopCi0JIHN0YXRfYWxsb2MgKHNpemVvZiAobGFuZ19wYWRkaW5nX3N0YXRlbWVudF90eXBlKSkpOwotCi0gICAgICAvKiBMaW5rIGludG8gZXhpc3RpbmcgY2hhaW4gKi8KLSAgICAgIG5ldy0+aGVhZGVyLm5leHQgPSAqdGhpc19wdHI7Ci0gICAgICAqdGhpc19wdHIgPSBuZXc7Ci0gICAgICBuZXctPmhlYWRlci50eXBlID0gbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9IG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldCA9Ci0JZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT52bWE7Ci0gICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LmZpbGwgPSBmaWxsOwotICAgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplID0gYWxpZ25tZW50X25lZWRlZDsKLSAgICB9Ci0KLQotICAvKiBSZW1lbWJlciB0aGUgbW9zdCByZXN0cmljdGl2ZSBhbGlnbm1lbnQgKi8KLSAgaWYgKHBvd2VyID4gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgewotICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5hbGlnbm1lbnRfcG93ZXIgPSBwb3dlcjsKLSAgICB9Ci0gIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+X3Jhd19zaXplICs9IGFsaWdubWVudF9uZWVkZWQ7Ci0gIHJldHVybiBhbGlnbm1lbnRfbmVlZGVkICsgZG90OwotCi19Ci0KLS8qIFdvcmsgb3V0IGhvdyBtdWNoIHRoaXMgc2VjdGlvbiB3aWxsIG1vdmUgdGhlIGRvdCBwb2ludCAqLwotc3RhdGljIGJmZF92bWEKLXNpemVfaW5wdXRfc2VjdGlvbiAodGhpc19wdHIsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgZmlsbCwgZG90LCByZWxheCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKiB0aGlzX3B0cjsKLSAgICAgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudDsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIGJmZF92bWEgZG90OwotICAgICBib29sZWFuIHJlbGF4OwotewotICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqaXMgPSAmKCgqdGhpc19wdHIpLT5pbnB1dF9zZWN0aW9uKTsKLSAgYXNlY3Rpb24gKmkgPSBpcy0+c2VjdGlvbjsKLQotICBpZiAoaXMtPmlmaWxlLT5qdXN0X3N5bXNfZmxhZyA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5zdWJzZWN0aW9uX2FsaWdubWVudCAhPSAtMSkKLSAgICAgICBpLT5hbGlnbm1lbnRfcG93ZXIgPQotCW91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+c3Vic2VjdGlvbl9hbGlnbm1lbnQ7Ci0KLSAgICAgIGRvdCA9IGluc2VydF9wYWQgKHRoaXNfcHRyLCBmaWxsLCBpLT5hbGlnbm1lbnRfcG93ZXIsCi0JCQlvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLCBkb3QpOwotCi0gICAgICAvKiBSZW1lbWJlciB3aGVyZSBpbiB0aGUgb3V0cHV0IHNlY3Rpb24gdGhpcyBpbnB1dCBzZWN0aW9uIGdvZXMgKi8KLQotICAgICAgaS0+b3V0cHV0X29mZnNldCA9IGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLQotICAgICAgLyogTWFyayBob3cgYmlnIHRoZSBvdXRwdXQgc2VjdGlvbiBtdXN0IGJlIHRvIGNvbnRhaW4gdGhpcyBub3cKLQkgKi8KLSAgICAgIGlmIChpLT5fY29va2VkX3NpemUgIT0gMCkKLQlkb3QgKz0gaS0+X2Nvb2tlZF9zaXplOwotICAgICAgZWxzZQotCWRvdCArPSBpLT5fcmF3X3NpemU7Ci0gICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBkb3QgLSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uLT52bWE7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaS0+b3V0cHV0X29mZnNldCA9IGktPnZtYSAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLSAgICB9Ci0KLSAgcmV0dXJuIGRvdDsKLX0KLQotLyogQ2hlY2sgdG8gc2VlIGlmIGFueSBhbGxvY2F0ZWQgc2VjdGlvbnMgb3ZlcmxhcCB3aXRoIG90aGVyIGFsbG9jYXRlZAotICAgc2VjdGlvbnMuICBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgbGlua2VyIHNjcmlwdCBzcGVjaWZpY2FsbHkgc3BlY2lmaWVzCi0gICB0aGUgb3V0cHV0IHNlY3Rpb24gYWRkcmVzc2VzIG9mIHRoZSB0d28gc2VjdGlvbnMuICAqLwotc3RhdGljIHZvaWQKLWxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgKCkKLXsKLSAgYXNlY3Rpb24gKiBzOwotCi0gIC8qIFNjYW4gYWxsIHNlY3Rpb25zIGluIHRoZSBvdXRwdXQgbGlzdC4gICovCi0gIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIC8qIElnbm9yZSBzZWN0aW9ucyB3aGljaCBhcmUgbm90IGxvYWRlZCBvciB3aGljaCBoYXZlIG5vIGNvbnRlbnRzLiAgKi8KLSAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgcykgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKQotCSYmIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHMpICE9IDApCi0gICAgICB7Ci0JYXNlY3Rpb24gKiBvczsKLQotCS8qIE9uY2Ugd2UgcmVhY2ggc2VjdGlvbiAncycgc3RvcCBvdXIgc2VhY2guICBUaGlzIHByZXZlbnRzIHR3bwotCSAgIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSBiZWluZyBwcm9kdWNlZCwgb25lIGZvciAnc2VjdGlvbiBBIG92ZXJsYXBzCi0JICAgc2VjdGlvbiBCJyBhbmQgb25lIGZvciAnc2VjdGlvbiBCIG92ZXJsYXBzIHNlY3Rpb24gQScuICAqLwotCWZvciAob3MgPSBvdXRwdXRfYmZkLT5zZWN0aW9uczsgb3MgIT0gczsgb3MgPSBvcy0+bmV4dCkKLQkgIHsKLQkgICAgYmZkX3ZtYSBzX3N0YXJ0OwotCSAgICBiZmRfdm1hIHNfZW5kOwotCSAgICBiZmRfdm1hIG9zX3N0YXJ0OwotCSAgICBiZmRfdm1hIG9zX2VuZDsKLQotCSAgICAvKiBPbmx5IGNvbnNpZGVyIGxvYWRhYmxlIHNlY3Rpb25zIHdpdGggcmVhbCBjb250ZW50cy4gICovCi0JICAgIGlmICgoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MpCi0JCSAgJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSA9PSAwKQotCQl8fCBiZmRfc2VjdGlvbl9zaXplIChvdXRwdXRfYmZkLCBvcykgPT0gMCkKLQkgICAgICBjb250aW51ZTsKLQotCSAgICAvKiBXZSBtdXN0IGNoZWNrIHRoZSBzZWN0aW9ucycgTE1BIGFkZHJlc3NlcyBub3QgdGhlaXIKLQkgICAgICAgVk1BIGFkZHJlc3NlcyBiZWNhdXNlIG92ZXJsYXkgc2VjdGlvbnMgY2FuIGhhdmUKLQkgICAgICAgb3ZlcmxhcHBpbmcgVk1BcyBidXQgdGhleSBtdXN0IGhhdmUgZGlzdGluY3QgTE1Bcy4gICovCi0JICAgIHNfc3RhcnQgID0gYmZkX3NlY3Rpb25fbG1hIChvdXRwdXRfYmZkLCBzKTsKLQkgICAgb3Nfc3RhcnQgPSBiZmRfc2VjdGlvbl9sbWEgKG91dHB1dF9iZmQsIG9zKTsKLQkgICAgc19lbmQgICAgPSBzX3N0YXJ0ICArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHMpIC0gMTsKLQkgICAgb3NfZW5kICAgPSBvc19zdGFydCArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIG9zKSAtIDE7Ci0KLQkgICAgLyogTG9vayBmb3IgYW4gb3ZlcmxhcC4gICovCi0JICAgIGlmICgoc19lbmQgPCBvc19zdGFydCkgfHwgKHNfc3RhcnQgPiBvc19lbmQpKQotCSAgICAgIGNvbnRpbnVlOwotCSAgICAKLQkgICAgZWluZm8gKAotXygiJVglUDogc2VjdGlvbiAlcyBbJVYgLT4gJVZdIG92ZXJsYXBzIHNlY3Rpb24gJXMgWyVWIC0+ICVWXVxuIiksCi0JCSAgIHMtPm5hbWUsIHNfc3RhcnQsIHNfZW5kLCBvcy0+bmFtZSwgb3Nfc3RhcnQsIG9zX2VuZCk7Ci0KLQkgICAgLyogT25jZSB3ZSBoYXZlIGZvdW5kIG9uZSBvdmVybGFwIGZvciB0aGlzIHNlY3Rpb24sCi0JICAgICAgIHN0b3AgbG9va2luZyBmb3Igb3RoZXJzLiAgKi8KLQkgICAgYnJlYWs7Ci0JICB9Ci0gICAgICB9Ci19Ci0KLS8qIFRoaXMgdmFyaWFibGUgaW5kaWNhdGVzIHdoZXRoZXIgYmZkX3JlbGF4X3NlY3Rpb24gc2hvdWxkIGJlIGNhbGxlZAotICAgYWdhaW4uICAqLwotCi1zdGF0aWMgYm9vbGVhbiByZWxheF9hZ2FpbjsKLQotLyogU2V0IHRoZSBzaXplcyBmb3IgYWxsIHRoZSBvdXRwdXQgc2VjdGlvbnMuICAqLwotCi1iZmRfdm1hCi1sYW5nX3NpemVfc2VjdGlvbnMgKHMsIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwgcHJldiwgZmlsbCwgZG90LCByZWxheCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiogcHJldjsKLSAgICAgZmlsbF90eXBlIGZpbGw7Ci0gICAgIGJmZF92bWEgZG90OwotICAgICBib29sZWFuIHJlbGF4OwotewotICAvKiBTaXplIHVwIHRoZSBzZWN0aW9ucyBmcm9tIHRoZWlyIGNvbnN0aXR1ZW50IHBhcnRzLiAgKi8KLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIGFmdGVyOwotCSAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvcyA9ICZzLT5vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0KLQkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICAgIC8qIFRoaXMgc2VjdGlvbiB3YXMgbmV2ZXIgYWN0dWFsbHkgY3JlYXRlZC4gICovCi0JICAgICAgYnJlYWs7Ci0KLQkgICAgLyogSWYgdGhpcyBpcyBhIENPRkYgc2hhcmVkIGxpYnJhcnkgc2VjdGlvbiwgdXNlIHRoZSBzaXplIGFuZAotCSAgICAgICBhZGRyZXNzIGZyb20gdGhlIGlucHV0IHNlY3Rpb24uICBGSVhNRTogVGhpcyBpcyBDT0ZGCi0JICAgICAgIHNwZWNpZmljOyBpdCB3b3VsZCBiZSBjbGVhbmVyIGlmIHRoZXJlIHdlcmUgc29tZSBvdGhlciB3YXkKLQkgICAgICAgdG8gZG8gdGhpcywgYnV0IG5vdGhpbmcgc2ltcGxlIGNvbWVzIHRvIG1pbmQuICAqLwotCSAgICBpZiAoKG9zLT5iZmRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfQ09GRl9TSEFSRURfTElCUkFSWSkgIT0gMCkKLQkgICAgICB7Ci0JCWFzZWN0aW9uICogaW5wdXQ7Ci0KLQkJaWYgKG9zLT5jaGlsZHJlbi5oZWFkID09IE5VTEwKLQkJICAgIHx8IG9zLT5jaGlsZHJlbi5oZWFkLT5uZXh0ICE9IE5VTEwKLQkJICAgIHx8IG9zLT5jaGlsZHJlbi5oZWFkLT5oZWFkZXIudHlwZSAhPSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bSkKLQkJICBlaW5mbyAoXygiJVAlWDogSW50ZXJuYWwgZXJyb3Igb24gQ09GRiBzaGFyZWQgbGlicmFyeSBzZWN0aW9uICVzXG4iKSwKLQkJCSBvcy0+bmFtZSk7Ci0KLQkJaW5wdXQgPSBvcy0+Y2hpbGRyZW4uaGVhZC0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOwotCQliZmRfc2V0X3NlY3Rpb25fdm1hIChvcy0+YmZkX3NlY3Rpb24tPm93bmVyLAotCQkJCSAgICAgb3MtPmJmZF9zZWN0aW9uLAotCQkJCSAgICAgYmZkX3NlY3Rpb25fdm1hIChpbnB1dC0+b3duZXIsIGlucHV0KSk7Ci0JCW9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplID0gaW5wdXQtPl9yYXdfc2l6ZTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCi0JICAgIGlmIChiZmRfaXNfYWJzX3NlY3Rpb24gKG9zLT5iZmRfc2VjdGlvbikpCi0JICAgICAgewotCQkvKiBObyBtYXR0ZXIgd2hhdCBoYXBwZW5zLCBhbiBhYnMgc2VjdGlvbiBzdGFydHMgYXQgemVyby4gICovCi0JCUFTU0VSVCAob3MtPmJmZF9zZWN0aW9uLT52bWEgPT0gMCk7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlpZiAob3MtPmFkZHJfdHJlZSA9PSAoZXRyZWVfdHlwZSAqKSBOVUxMKQotCQkgIHsKLQkJICAgIC8qIE5vIGFkZHJlc3Mgc3BlY2lmaWVkIGZvciB0aGlzIHNlY3Rpb24sIGdldCBvbmUKLQkJICAgICAgIGZyb20gdGhlIHJlZ2lvbiBzcGVjaWZpY2F0aW9uLiAgKi8KLQkJICAgIGlmIChvcy0+cmVnaW9uID09IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMCi0JCQl8fCAoKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikKLQkJCSAgICAgICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkgIT0gMCkKLQkJCSAgICAmJiBvcy0+cmVnaW9uLT5uYW1lWzBdID09ICcqJwotCQkJICAgICYmIHN0cmNtcCAob3MtPnJlZ2lvbi0+bmFtZSwgIipkZWZhdWx0KiIpID09IDApKQotCQkgICAgICB7Ci0JCQlvcy0+cmVnaW9uID0gbGFuZ19tZW1vcnlfZGVmYXVsdCAob3MtPmJmZF9zZWN0aW9uKTsKLQkJICAgICAgfQotCi0JCSAgICAvKiBJZiBhIGxvYWRhYmxlIHNlY3Rpb24gaXMgdXNpbmcgdGhlIGRlZmF1bHQgbWVtb3J5Ci0JCSAgICAgICByZWdpb24sIGFuZCBzb21lIG5vbiBkZWZhdWx0IG1lbW9yeSByZWdpb25zIHdlcmUKLQkJICAgICAgIGRlZmluZWQsIGlzc3VlIGEgd2FybmluZy4gICovCi0JCSAgICBpZiAoKGJmZF9nZXRfc2VjdGlvbl9mbGFncyAob3V0cHV0X2JmZCwgb3MtPmJmZF9zZWN0aW9uKQotCQkJICYgKFNFQ19BTExPQyB8IFNFQ19MT0FEKSkgIT0gMAotCQkJJiYgISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0JCQkmJiBzdHJjbXAgKG9zLT5yZWdpb24tPm5hbWUsICIqZGVmYXVsdCoiKSA9PSAwCi0JCQkmJiBsYW5nX21lbW9yeV9yZWdpb25fbGlzdCAhPSBOVUxMCi0JCQkmJiAoc3RyY21wIChsYW5nX21lbW9yeV9yZWdpb25fbGlzdC0+bmFtZSwgIipkZWZhdWx0KiIpICE9IDAKLQkJCSAgICB8fCBsYW5nX21lbW9yeV9yZWdpb25fbGlzdC0+bmV4dCAhPSBOVUxMKSkKLQkJICAgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBubyBtZW1vcnkgcmVnaW9uIHNwZWNpZmllZCBmb3Igc2VjdGlvbiBgJXMnXG4iKSwKLQkJCSAgICAgYmZkX2dldF9zZWN0aW9uX25hbWUgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikpOwotCi0JCSAgICBkb3QgPSBvcy0+cmVnaW9uLT5jdXJyZW50OwotIAotCQkgICAgaWYgKG9zLT5zZWN0aW9uX2FsaWdubWVudCA9PSAtMSkKLQkJICAgICAgewotCQkJYmZkX3ZtYSBvbGRkb3Q7Ci0KLQkJCW9sZGRvdCA9IGRvdDsKLQkJCWRvdCA9IGFsaWduX3Bvd2VyIChkb3QsIG9zLT5iZmRfc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyKTsKLQotCQkJaWYgKGRvdCAhPSBvbGRkb3QgJiYgY29uZmlnLndhcm5fc2VjdGlvbl9hbGlnbikKLQkJCSAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjaGFuZ2luZyBzdGFydCBvZiBzZWN0aW9uICVzIGJ5ICV1IGJ5dGVzXG4iKSwKLQkJCQkgb3MtPm5hbWUsICh1bnNpZ25lZCBpbnQpIChkb3QgLSBvbGRkb3QpKTsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZQotCQkgIHsKLQkJICAgIGV0cmVlX3ZhbHVlX3R5cGUgcjsKLQotCQkgICAgciA9IGV4cF9mb2xkX3RyZWUgKG9zLT5hZGRyX3RyZWUsCi0JCQkJICAgICAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICAgICAgbGFuZ19hbGxvY2F0aW5nX3BoYXNlX2VudW0sCi0JCQkJICAgICAgIGRvdCwgJmRvdCk7Ci0JCSAgICBpZiAoci52YWxpZF9wID09IGZhbHNlKQotCQkgICAgICB7Ci0JCQllaW5mbyAoXygiJUYlUzogbm9uIGNvbnN0YW50IGFkZHJlc3MgZXhwcmVzc2lvbiBmb3Igc2VjdGlvbiAlc1xuIiksCi0JCQkgICAgICAgb3MtPm5hbWUpOwotCQkgICAgICB9Ci0JCSAgICBkb3QgPSByLnZhbHVlICsgci5zZWN0aW9uLT5iZmRfc2VjdGlvbi0+dm1hOwotCQkgIH0KLQkJCi0JCS8qIFRoZSBzZWN0aW9uIHN0YXJ0cyBoZXJlLgotCQkgICBGaXJzdCwgYWxpZ24gdG8gd2hhdCB0aGUgc2VjdGlvbiBuZWVkcy4gICovCi0KLQkJaWYgKG9zLT5zZWN0aW9uX2FsaWdubWVudCAhPSAtMSkKLQkJICBkb3QgPSBhbGlnbl9wb3dlciAoZG90LCBvcy0+c2VjdGlvbl9hbGlnbm1lbnQpOwotCi0JCWJmZF9zZXRfc2VjdGlvbl92bWEgKDAsIG9zLT5iZmRfc2VjdGlvbiwgZG90KTsKLQkJCi0JCW9zLT5iZmRfc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IDA7Ci0JICAgICAgfQotCi0JICAgICh2b2lkKSBsYW5nX3NpemVfc2VjdGlvbnMgKG9zLT5jaGlsZHJlbi5oZWFkLCBvcywgJm9zLT5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICAgICBvcy0+ZmlsbCwgZG90LCByZWxheCk7Ci0JICAgIAotCSAgICAvKiBJZ25vcmUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHNlY3Rpb25zLCB1c2UgdGhlIHZtYSBhbmQgc2l6ZSB0bwotCSAgICAgICBhbGlnbiBhZ2FpbnN0LiAgKi8KLQotCSAgICBhZnRlciA9IEFMSUdOX04gKG9zLT5iZmRfc2VjdGlvbi0+dm1hICsKLQkJCSAgICAgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUsCi0JCQkgICAgIC8qIFRoZSBjb2VyY2lvbiBoZXJlIGlzIGltcG9ydGFudCwgc2VlIGxkLmguICAqLwotCQkJICAgICAoYmZkX3ZtYSkgb3MtPmJsb2NrX3ZhbHVlKTsKLQotCSAgICBpZiAoYmZkX2lzX2Fic19zZWN0aW9uIChvcy0+YmZkX3NlY3Rpb24pKQotCSAgICAgIEFTU0VSVCAoYWZ0ZXIgPT0gb3MtPmJmZF9zZWN0aW9uLT52bWEpOwotCSAgICBlbHNlCi0JICAgICAgb3MtPmJmZF9zZWN0aW9uLT5fcmF3X3NpemUgPSBhZnRlciAtIG9zLT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgICBkb3QgPSBvcy0+YmZkX3NlY3Rpb24tPnZtYSArIG9zLT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplOwotCSAgICBvcy0+cHJvY2Vzc2VkID0gdHJ1ZTsKLQotCSAgICAvKiBVcGRhdGUgZG90IGluIHRoZSByZWdpb24gPwotCSAgICAgICBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlIHNlY3Rpb24gaXMgZ29pbmcgdG8gYmUgYWxsb2NhdGVkLAotCSAgICAgICBzaW5jZSB1bmFsbG9jYXRlZCBzZWN0aW9ucyBkbyBub3QgY29udHJpYnV0ZSB0byB0aGUgcmVnaW9uJ3MKLQkgICAgICAgb3ZlcmFsbCBzaXplIGluIG1lbW9yeS4gICovCi0JICAgIGlmIChvcy0+cmVnaW9uICE9IChsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqKSBOVUxMCi0JCSYmIChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKG91dHB1dF9iZmQsIG9zLT5iZmRfc2VjdGlvbikKLQkJJiAoU0VDX0FMTE9DIHwgU0VDX0xPQUQpKSkKLQkgICAgICB7Ci0JCW9zLT5yZWdpb24tPmN1cnJlbnQgPSBkb3Q7Ci0JCQotCQkvKiBNYWtlIHN1cmUgdGhpcyBpc24ndCBzaWxseS4gICovCi0JCWlmIChvcy0+cmVnaW9uLT5jdXJyZW50IDwgb3MtPnJlZ2lvbi0+b3JpZ2luCi0JCSAgICB8fCAob3MtPnJlZ2lvbi0+Y3VycmVudCAtIG9zLT5yZWdpb24tPm9yaWdpbgotCQkJPiBvcy0+cmVnaW9uLT5sZW5ndGgpKQotCQkgIHsKLQkJICAgIGlmIChvcy0+YWRkcl90cmVlICE9IChldHJlZV90eXBlICopIE5VTEwpCi0JCSAgICAgIHsKLQkJCWVpbmZvIChfKCIlWCVQOiBhZGRyZXNzIDB4JXYgb2YgJUIgc2VjdGlvbiAlcyBpcyBub3Qgd2l0aGluIHJlZ2lvbiAlc1xuIiksCi0JCQkgICAgICAgb3MtPnJlZ2lvbi0+Y3VycmVudCwKLQkJCSAgICAgICBvcy0+YmZkX3NlY3Rpb24tPm93bmVyLAotCQkJICAgICAgIG9zLT5iZmRfc2VjdGlvbi0+bmFtZSwKLQkJCSAgICAgICBvcy0+cmVnaW9uLT5uYW1lKTsKLQkJICAgICAgfQotCQkgICAgZWxzZQotCQkgICAgICB7Ci0JCQllaW5mbyAoXygiJVglUDogcmVnaW9uICVzIGlzIGZ1bGwgKCVCIHNlY3Rpb24gJXMpXG4iKSwKLQkJCSAgICAgICBvcy0+cmVnaW9uLT5uYW1lLAotCQkJICAgICAgIG9zLT5iZmRfc2VjdGlvbi0+b3duZXIsCi0JCQkgICAgICAgb3MtPmJmZF9zZWN0aW9uLT5uYW1lKTsKLQkJICAgICAgfQotCQkgICAgLyogUmVzZXQgdGhlIHJlZ2lvbiBwb2ludGVyLiAgKi8KLQkJICAgIG9zLT5yZWdpb24tPmN1cnJlbnQgPSBvcy0+cmVnaW9uLT5vcmlnaW47Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGRvdCA9IGxhbmdfc2l6ZV9zZWN0aW9ucyAoY29uc3RydWN0b3JfbGlzdC5oZWFkLAotCQkJCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICZzLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICBmaWxsLAotCQkJCSAgICBkb3QsIHJlbGF4KTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2RhdGFfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGludCBzaXplID0gMDsKLQotCSAgICBzLT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfdm1hID0gZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCSAgICBzLT5kYXRhX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbiA9Ci0JICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbjsKLQotCSAgICBzd2l0Y2ggKHMtPmRhdGFfc3RhdGVtZW50LnR5cGUpCi0JICAgICAgewotCSAgICAgIGNhc2UgUVVBRDoKLQkgICAgICBjYXNlIFNRVUFEOgotCQlzaXplID0gUVVBRF9TSVpFOwotCQlicmVhazsKLQkgICAgICBjYXNlIExPTkc6Ci0JCXNpemUgPSBMT05HX1NJWkU7Ci0JCWJyZWFrOwotCSAgICAgIGNhc2UgU0hPUlQ6Ci0JCXNpemUgPSBTSE9SVF9TSVpFOwotCQlicmVhazsKLQkgICAgICBjYXNlIEJZVEU6Ci0JCXNpemUgPSBCWVRFX1NJWkU7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQotCSAgICBkb3QgKz0gc2l6ZTsKLQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemU7Ci0JICAgIC8qIFRoZSBvdXRwdXQgc2VjdGlvbiBnZXRzIGNvbnRlbnRzLCBhbmQgdGhlbiB3ZSBpbnNwZWN0IGZvcgotCSAgICAgICBhbnkgZmxhZ3Mgc2V0IGluIHRoZSBpbnB1dCBzY3JpcHQgd2hpY2ggb3ZlcnJpZGUgYW55IEFMTE9DLiAgKi8KLQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0hBU19DT05URU5UUzsKLQkgICAgaWYgKCEob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5mbGFncyAmIFNFQ19ORVZFUl9MT0FEKSkgewotCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPmZsYWdzIHw9IFNFQ19BTExPQyB8IFNFQ19MT0FEOwotCSAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bToKLQkgIHsKLQkgICAgaW50IHNpemU7Ci0KLQkgICAgcy0+cmVsb2Nfc3RhdGVtZW50Lm91dHB1dF92bWEgPQotCSAgICAgIGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLQkgICAgcy0+cmVsb2Nfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uID0KLQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotCSAgICBzaXplID0gYmZkX2dldF9yZWxvY19zaXplIChzLT5yZWxvY19zdGF0ZW1lbnQuaG93dG8pOwotCSAgICBkb3QgKz0gc2l6ZTsKLQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplICs9IHNpemU7Ci0JICB9Ci0JICBicmVhazsKLSAgICAgCi0JY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0KLQkgIGRvdCA9IGxhbmdfc2l6ZV9zZWN0aW9ucyAocy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQkJCQkgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAmcy0+d2lsZF9zdGF0ZW1lbnQuY2hpbGRyZW4uaGVhZCwKLQotCQkJCSAgICBmaWxsLCBkb3QsIHJlbGF4KTsKLQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X2VudW06Ci0JICBsaW5rX2luZm8uY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gPQotCSAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQkgIHsKLQkgICAgYXNlY3Rpb24gKmk7Ci0KLQkgICAgaSA9ICgqcHJldiktPmlucHV0X3NlY3Rpb24uc2VjdGlvbjsKLQkgICAgaWYgKCEgcmVsYXgpCi0JICAgICAgewotCQlpZiAoaS0+X2Nvb2tlZF9zaXplID09IDApCi0JCSAgaS0+X2Nvb2tlZF9zaXplID0gaS0+X3Jhd19zaXplOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJYm9vbGVhbiBhZ2FpbjsKLQotCQlpZiAoISBiZmRfcmVsYXhfc2VjdGlvbiAoaS0+b3duZXIsIGksICZsaW5rX2luZm8sICZhZ2FpbikpCi0JCSAgZWluZm8gKF8oIiVQJUY6IGNhbid0IHJlbGF4IHNlY3Rpb246ICVFXG4iKSk7Ci0JCWlmIChhZ2FpbikKLQkJICByZWxheF9hZ2FpbiA9IHRydWU7Ci0JICAgICAgfQotCSAgICBkb3QgPSBzaXplX2lucHV0X3NlY3Rpb24gKHByZXYsCi0JCQkJICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LAotCQkJCSAgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+ZmlsbCwKLQkJCQkgICAgICBkb3QsIHJlbGF4KTsKLQkgIH0KLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19maWxsX3N0YXRlbWVudF9lbnVtOgotCSAgcy0+ZmlsbF9zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24gPSBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotCi0JICBmaWxsID0gcy0+ZmlsbF9zdGF0ZW1lbnQuZmlsbDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBiZmRfdm1hIG5ld2RvdCA9IGRvdDsKLQotCSAgICBleHBfZm9sZF90cmVlIChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHAsCi0JCQkgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkgICBsYW5nX2FsbG9jYXRpbmdfcGhhc2VfZW51bSwKLQkJCSAgIGRvdCwKLQkJCSAgICZuZXdkb3QpOwotCi0JICAgIGlmIChuZXdkb3QgIT0gZG90KQotCSAgICAgIHsKLQkJLyogVGhlIGFzc2lnbm1lbnQgY2hhbmdlZCBkb3QuICBJbnNlcnQgYSBwYWQuICAqLwotCQlpZiAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50ID09IGFic19vdXRwdXRfc2VjdGlvbikKLQkJICB7Ci0JCSAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGFuIG91dHB1dCBzZWN0aW9uLCB0aGVuIGp1c3QgYWRqdXN0Ci0JCSAgICAgICB0aGUgZGVmYXVsdCBtZW1vcnkgYWRkcmVzcy4gICovCi0JCSAgICBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwICgiKmRlZmF1bHQqIiktPmN1cnJlbnQgPSBuZXdkb3Q7Ci0JCSAgfQotCQllbHNlIGlmICghcmVsYXgpCi0JCSAgewotCQkgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqbmV3ID0KLQkJICAgICAgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopCi0JCSAgICAgICBzdGF0X2FsbG9jIChzaXplb2YgKGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZSkpKTsKLQotCQkgICAgLyogTGluayBpbnRvIGV4aXN0aW5nIGNoYWluLiAgKi8KLQkJICAgIG5ldy0+aGVhZGVyLm5leHQgPSAqcHJldjsKLQkJICAgICpwcmV2ID0gbmV3OwotCQkgICAgbmV3LT5oZWFkZXIudHlwZSA9IGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bTsKLQkJICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb24gPQotCQkgICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQtPmJmZF9zZWN0aW9uOwotCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfb2Zmc2V0ID0KLQkJICAgICAgZG90IC0gb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+dm1hOwotCQkgICAgbmV3LT5wYWRkaW5nX3N0YXRlbWVudC5maWxsID0gZmlsbDsKLQkJICAgIG5ldy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZSA9IG5ld2RvdCAtIGRvdDsKLQkJICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZSArPQotCQkgICAgICBuZXctPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7Ci0JCSAgfQotCi0JCWRvdCA9IG5ld2RvdDsKLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19wYWRkaW5nX3N0YXRlbWVudF9lbnVtOgotCSAgLyogSWYgd2UgYXJlIHJlbGF4aW5nLCBhbmQgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHBhc3MsIHNvbWUKLQkgICAgIHBhZGRpbmcgc3RhdGVtZW50cyBtYXkgaGF2ZSBiZWVuIGluc2VydGVkIGR1cmluZyBwcmV2aW91cwotCSAgICAgcGFzc2VzLiAgV2UgbWF5IGhhdmUgdG8gbW92ZSB0aGUgcGFkZGluZyBzdGF0ZW1lbnQgdG8gYSBuZXcKLQkgICAgIGxvY2F0aW9uIGlmIGRvdCBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgYXQgdGhpcyBwb2ludCBpbiB0aGlzCi0JICAgICBwYXNzIHRoYW4gaXQgZGlkIGF0IHRoaXMgcG9pbnQgaW4gdGhlIHByZXZpb3VzIHBhc3MuICAqLwotCSAgcy0+cGFkZGluZ19zdGF0ZW1lbnQub3V0cHV0X29mZnNldCA9Ci0JICAgIGRvdCAtIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC0+YmZkX3NlY3Rpb24tPnZtYTsKLQkgIGRvdCArPSBzLT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOwotCSAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LT5iZmRfc2VjdGlvbi0+X3Jhd19zaXplICs9Ci0JICAgIHMtPnBhZGRpbmdfc3RhdGVtZW50LnNpemU7Ci0JICBicmVhazsKLQotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIGRvdCA9IGxhbmdfc2l6ZV9zZWN0aW9ucyAocy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgJnMtPmdyb3VwX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkLAotCQkJCSAgICBmaWxsLCBkb3QsIHJlbGF4KTsKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIEZBSUwgKCk7Ci0JICBicmVhazsKLQotCSAgLyogVGhpcyBjYW4gb25seSBnZXQgaGVyZSB3aGVuIHJlbGF4aW5nIGlzIHR1cm5lZCBvbi4gICovCi0KLQljYXNlIGxhbmdfYWRkcmVzc19zdGF0ZW1lbnRfZW51bToKLQkgIGJyZWFrOwotCX0KLSAgICAgIHByZXYgPSAmcy0+aGVhZGVyLm5leHQ7Ci0gICAgfQotICByZXR1cm4gZG90OwotfQotCi1iZmRfdm1hCi1sYW5nX2RvX2Fzc2lnbm1lbnRzIChzLCBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsIGZpbGwsIGRvdCkKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqIHM7Ci0gICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKiBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQ7Ci0gICAgIGZpbGxfdHlwZSBmaWxsOwotICAgICBiZmRfdm1hIGRvdDsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bToKLQkgIGRvdCA9IGxhbmdfZG9fYXNzaWdubWVudHMgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCwKLQkJCQkgICAgIG91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkJCQkgICAgIGZpbGwsCi0JCQkJICAgICBkb3QpOwotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0KLQkgICAgICAmKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCk7Ci0KLQkgICAgaWYgKG9zLT5iZmRfc2VjdGlvbiAhPSBOVUxMKQotCSAgICAgIHsKLQkJZG90ID0gb3MtPmJmZF9zZWN0aW9uLT52bWE7Ci0JCSh2b2lkKSBsYW5nX2RvX2Fzc2lnbm1lbnRzIChvcy0+Y2hpbGRyZW4uaGVhZCwgb3MsCi0JCQkJCSAgICBvcy0+ZmlsbCwgZG90KTsKLQkJZG90ID0gb3MtPmJmZF9zZWN0aW9uLT52bWEgKyBvcy0+YmZkX3NlY3Rpb24tPl9yYXdfc2l6ZTsKLQkgICAgICB9Ci0JICAgIGlmIChvcy0+bG9hZF9iYXNlKSAKLQkgICAgICB7Ci0JCS8qIElmIG5vdGhpbmcgaGFzIGJlZW4gcGxhY2VkIGludG8gdGhlIG91dHB1dCBzZWN0aW9uIHRoZW4KLQkJICAgaXQgd29uJ3QgaGF2ZSBhIGJmZF9zZWN0aW9uLiAqLwotCQlpZiAob3MtPmJmZF9zZWN0aW9uKSAKLQkJICB7Ci0JCSAgICBvcy0+YmZkX3NlY3Rpb24tPmxtYSAKLQkJICAgICAgPSBleHBfZ2V0X2Fic19pbnQob3MtPmxvYWRfYmFzZSwgMCwibG9hZCBiYXNlIiwgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0KLQkgIGRvdCA9IGxhbmdfZG9fYXNzaWdubWVudHMgKHMtPndpbGRfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICBmaWxsLCBkb3QpOwotCi0JICBicmVhazsKLQotCWNhc2UgbGFuZ19vYmplY3Rfc3ltYm9sc19zdGF0ZW1lbnRfZW51bToKLQljYXNlIGxhbmdfb3V0cHV0X3N0YXRlbWVudF9lbnVtOgotCWNhc2UgbGFuZ190YXJnZXRfc3RhdGVtZW50X2VudW06Ci0jaWYgMAotCWNhc2UgbGFuZ19jb21tb25fc3RhdGVtZW50X2VudW06Ci0jZW5kaWYKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBldHJlZV92YWx1ZV90eXBlIHZhbHVlOwotCi0JICAgIHZhbHVlID0gZXhwX2ZvbGRfdHJlZSAocy0+ZGF0YV9zdGF0ZW1lbnQuZXhwLAotCQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCQkgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0sIGRvdCwgJmRvdCk7Ci0JICAgIHMtPmRhdGFfc3RhdGVtZW50LnZhbHVlID0gdmFsdWUudmFsdWU7Ci0JICAgIGlmICh2YWx1ZS52YWxpZF9wID09IGZhbHNlKQotCSAgICAgIGVpbmZvIChfKCIlRiVQOiBpbnZhbGlkIGRhdGEgc3RhdGVtZW50XG4iKSk7Ci0JICB9Ci0JICBzd2l0Y2ggKHMtPmRhdGFfc3RhdGVtZW50LnR5cGUpCi0JICAgIHsKLQkgICAgY2FzZSBRVUFEOgotCSAgICBjYXNlIFNRVUFEOgotCSAgICAgIGRvdCArPSBRVUFEX1NJWkU7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgTE9ORzoKLQkgICAgICBkb3QgKz0gTE9OR19TSVpFOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFNIT1JUOgotCSAgICAgIGRvdCArPSBTSE9SVF9TSVpFOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEJZVEU6Ci0JICAgICAgZG90ICs9IEJZVEVfU0laRTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQljYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0JICB7Ci0JICAgIGV0cmVlX3ZhbHVlX3R5cGUgdmFsdWU7Ci0KLQkgICAgdmFsdWUgPSBleHBfZm9sZF90cmVlIChzLT5yZWxvY19zdGF0ZW1lbnQuYWRkZW5kX2V4cCwKLQkJCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkJICAgbGFuZ19maW5hbF9waGFzZV9lbnVtLCBkb3QsICZkb3QpOwotCSAgICBzLT5yZWxvY19zdGF0ZW1lbnQuYWRkZW5kX3ZhbHVlID0gdmFsdWUudmFsdWU7Ci0JICAgIGlmICh2YWx1ZS52YWxpZF9wID09IGZhbHNlKQotCSAgICAgIGVpbmZvIChfKCIlRiVQOiBpbnZhbGlkIHJlbG9jIHN0YXRlbWVudFxuIikpOwotCSAgfQotCSAgZG90ICs9IGJmZF9nZXRfcmVsb2Nfc2l6ZSAocy0+cmVsb2Nfc3RhdGVtZW50Lmhvd3RvKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bToKLQkgIHsKLQkgICAgYXNlY3Rpb24gKmluID0gcy0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uOwotCi0JICAgIGlmIChpbi0+X2Nvb2tlZF9zaXplICE9IDApCi0JICAgICAgZG90ICs9IGluLT5fY29va2VkX3NpemU7Ci0JICAgIGVsc2UKLQkgICAgICBkb3QgKz0gaW4tPl9yYXdfc2l6ZTsKLQkgIH0KLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtOgotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2ZpbGxfc3RhdGVtZW50X2VudW06Ci0JICBmaWxsID0gcy0+ZmlsbF9zdGF0ZW1lbnQuZmlsbDsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF9lbnVtOgotCSAgewotCSAgICBleHBfZm9sZF90cmVlIChzLT5hc3NpZ25tZW50X3N0YXRlbWVudC5leHAsCi0JCQkgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0sCi0JCQkgICBkb3QsCi0JCQkgICAmZG90KTsKLQkgIH0KLQotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW06Ci0JICBkb3QgKz0gcy0+cGFkZGluZ19zdGF0ZW1lbnQuc2l6ZTsKLQkgIGJyZWFrOwotCi0JY2FzZSBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtOgotCSAgZG90ID0gbGFuZ19kb19hc3NpZ25tZW50cyAocy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQsCi0JCQkJICAgICBvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JCQkJICAgICBmaWxsLCBkb3QpOwotCi0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBGQUlMICgpOwotCSAgYnJlYWs7Ci0JY2FzZSBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X2VudW06Ci0JICBicmVhazsKLQl9Ci0KLSAgICB9Ci0gIHJldHVybiBkb3Q7Ci19Ci0KLS8qIEZpeCBhbnkgLnN0YXJ0b2YuIG9yIC5zaXplb2YuIHN5bWJvbHMuICBXaGVuIHRoZSBhc3NlbWJsZXJzIHNlZSB0aGUKLSAgIG9wZXJhdG9yIC5zdGFydG9mLiAoc2VjdGlvbl9uYW1lKSwgaXQgcHJvZHVjZXMgYW4gdW5kZWZpbmVkIHN5bWJvbAotICAgLnN0YXJ0b2Yuc2VjdGlvbl9uYW1lLiAgU2ltaWxhcmx5LCB3aGVuIGl0IHNlZXMKLSAgIC5zaXplb2YuIChzZWN0aW9uX25hbWUpLCBpdCBwcm9kdWNlcyBhbiB1bmRlZmluZWQgc3ltYm9sCi0gICAuc2l6ZW9mLnNlY3Rpb25fbmFtZS4gIEZvciBhbGwgdGhlIG91dHB1dCBzZWN0aW9ucywgd2UgbG9vayBmb3IKLSAgIHN1Y2ggc3ltYm9scywgYW5kIHNldCB0aGVtIHRvIHRoZSBjb3JyZWN0IHZhbHVlLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfc2V0X3N0YXJ0b2YgKCkKLXsKLSAgYXNlY3Rpb24gKnM7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAocyA9IG91dHB1dF9iZmQtPnNlY3Rpb25zOyBzICE9IE5VTEw7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gICAgICBjaGFyICpidWY7Ci0gICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICAgICAgc2VjbmFtZSA9IGJmZF9nZXRfc2VjdGlvbl9uYW1lIChvdXRwdXRfYmZkLCBzKTsKLSAgICAgIGJ1ZiA9IHhtYWxsb2MgKDEwICsgc3RybGVuIChzZWNuYW1lKSk7Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi5zdGFydG9mLiVzIiwgc2VjbmFtZSk7Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBidWYsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICBpZiAoaCAhPSBOVUxMICYmIGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JewotCSAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQkgIGgtPnUuZGVmLnZhbHVlID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgcyk7Ci0JICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQl9Ci0KLSAgICAgIHNwcmludGYgKGJ1ZiwgIi5zaXplb2YuJXMiLCBzZWNuYW1lKTsKLSAgICAgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIGJ1ZiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgIGlmIChoICE9IE5VTEwgJiYgaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotCSAgaWYgKHMtPl9jb29rZWRfc2l6ZSAhPSAwKQotCSAgICBoLT51LmRlZi52YWx1ZSA9IHMtPl9jb29rZWRfc2l6ZTsKLQkgIGVsc2UKLQkgICAgaC0+dS5kZWYudmFsdWUgPSBzLT5fcmF3X3NpemU7Ci0JICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLQl9Ci0KLSAgICAgIGZyZWUgKGJ1Zik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotbGFuZ19maW5pc2ggKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGJvb2xlYW4gd2FybjsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSB8fCBsaW5rX2luZm8uc2hhcmVkKQotICAgIHdhcm4gPSBmYWxzZTsKLSAgZWxzZQotICAgIHdhcm4gPSB0cnVlOwotCi0gIGlmIChlbnRyeV9zeW1ib2wgPT0gKGNoYXIgKikgTlVMTCkKLSAgICB7Ci0gICAgICAvKiBObyBlbnRyeSBoYXMgYmVlbiBzcGVjaWZpZWQuICBMb29rIGZvciBzdGFydCwgYnV0IGRvbid0IHdhcm4KLQkgaWYgd2UgZG9uJ3QgZmluZCBpdC4gICovCi0gICAgICBlbnRyeV9zeW1ib2wgPSAic3RhcnQiOwotICAgICAgd2FybiA9IGZhbHNlOwotICAgIH0KLQotICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBlbnRyeV9zeW1ib2wsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gIGlmIChoICE9IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMCi0gICAgICAmJiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotICAgICAgJiYgaC0+dS5kZWYuc2VjdGlvbi0+b3V0cHV0X3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmRfdm1hIHZhbDsKLQotICAgICAgdmFsID0gKGgtPnUuZGVmLnZhbHVlCi0JICAgICArIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJICAgIGgtPnUuZGVmLnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uKQotCSAgICAgKyBoLT51LmRlZi5zZWN0aW9uLT5vdXRwdXRfb2Zmc2V0KTsKLSAgICAgIGlmICghIGJmZF9zZXRfc3RhcnRfYWRkcmVzcyAob3V0cHV0X2JmZCwgdmFsKSkKLQllaW5mbyAoXygiJVAlRjolczogY2FuJ3Qgc2V0IHN0YXJ0IGFkZHJlc3NcbiIpLCBlbnRyeV9zeW1ib2wpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGJmZF92bWEgdmFsOwotICAgICAgQ09OU1QgY2hhciAqc2VuZDsKLQotICAgICAgLyogV2UgY291bGRuJ3QgZmluZCB0aGUgZW50cnkgc3ltYm9sLiAgVHJ5IHBhcnNpbmcgaXQgYXMgYQotICAgICAgICAgbnVtYmVyLiAgKi8KLSAgICAgIHZhbCA9IGJmZF9zY2FuX3ZtYSAoZW50cnlfc3ltYm9sLCAmc2VuZCwgMCk7Ci0gICAgICBpZiAoKnNlbmQgPT0gJ1wwJykKLQl7Ci0JICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dHB1dF9iZmQsIHZhbCkpCi0JICAgIGVpbmZvIChfKCIlUCVGOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIikpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBhc2VjdGlvbiAqdHM7Ci0KLQkgIC8qIENhbid0IGZpbmQgdGhlIGVudHJ5IHN5bWJvbCwgYW5kIGl0J3Mgbm90IGEgbnVtYmVyLiAgVXNlCi0JICAgICB0aGUgZmlyc3QgYWRkcmVzcyBpbiB0aGUgdGV4dCBzZWN0aW9uLiAgKi8KLQkgIHRzID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsICIudGV4dCIpOwotCSAgaWYgKHRzICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHdhcm4pCi0JCWVpbmZvIChfKCIlUDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sICVzOyBkZWZhdWx0aW5nIHRvICVWXG4iKSwKLQkJICAgICAgIGVudHJ5X3N5bWJvbCwgYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgdHMpKTsKLQkgICAgICBpZiAoISBiZmRfc2V0X3N0YXJ0X2FkZHJlc3MgKG91dHB1dF9iZmQsCi0JCQkJCSAgIGJmZF9nZXRfc2VjdGlvbl92bWEgKG91dHB1dF9iZmQsCi0JCQkJCQkJCXRzKSkpCi0JCWVpbmZvIChfKCIlUCVGOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIikpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAod2FybikKLQkJZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IG5vdCBzZXR0aW5nIHN0YXJ0IGFkZHJlc3NcbiIpLAotCQkgICAgICAgZW50cnlfc3ltYm9sKTsKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIFRoaXMgaXMgYSBzbWFsbCBmdW5jdGlvbiB1c2VkIHdoZW4gd2Ugd2FudCB0byBpZ25vcmUgZXJyb3JzIGZyb20KLSAgIEJGRC4gICovCi0KLXN0YXRpYyB2b2lkCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi1pZ25vcmVfYmZkX2Vycm9ycyAoY29uc3QgY2hhciAqcywgLi4uKQotI2Vsc2UKLWlnbm9yZV9iZmRfZXJyb3JzIChzKQotICAgICBjb25zdCBjaGFyICpzOwotI2VuZGlmCi17Ci0gIC8qIERvbid0IGRvIGFueXRoaW5nLiAgKi8KLX0KLQotLyogQ2hlY2sgdGhhdCB0aGUgYXJjaGl0ZWN0dXJlIG9mIGFsbCB0aGUgaW5wdXQgZmlsZXMgaXMgY29tcGF0aWJsZQotICAgd2l0aCB0aGUgb3V0cHV0IGZpbGUuICBBbHNvIGNhbGwgdGhlIGJhY2tlbmQgdG8gbGV0IGl0IGRvIGFueQotICAgb3RoZXIgY2hlY2tpbmcgdGhhdCBpcyBuZWVkZWQuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19jaGVjayAoKQotewotICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpmaWxlOwotICBiZmQgKmlucHV0X2JmZDsKLSAgQ09OU1QgYmZkX2FyY2hfaW5mb190eXBlICpjb21wYXRpYmxlOwotCi0gIGZvciAoZmlsZSA9IGZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBmaWxlICE9IChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopIE5VTEw7Ci0gICAgICAgZmlsZSA9IGZpbGUtPmlucHV0X3N0YXRlbWVudC5uZXh0KQotICAgIHsKLSAgICAgIGlucHV0X2JmZCA9IGZpbGUtPmlucHV0X3N0YXRlbWVudC50aGVfYmZkOwotICAgICAgY29tcGF0aWJsZSA9IGJmZF9hcmNoX2dldF9jb21wYXRpYmxlIChpbnB1dF9iZmQsCi0JCQkJCSAgICBvdXRwdXRfYmZkKTsKLSAgICAgIGlmIChjb21wYXRpYmxlID09IE5VTEwpCi0JewotCSAgaWYgKGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQotCSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICVzIGFyY2hpdGVjdHVyZSBvZiBpbnB1dCBmaWxlIGAlQicgaXMgaW5jb21wYXRpYmxlIHdpdGggJXMgb3V0cHV0XG4iKSwKLQkJICAgYmZkX3ByaW50YWJsZV9uYW1lIChpbnB1dF9iZmQpLCBpbnB1dF9iZmQsCi0JCSAgIGJmZF9wcmludGFibGVfbmFtZSAob3V0cHV0X2JmZCkpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfZXJyb3JfaGFuZGxlcl90eXBlIHBmbiA9IE5VTEw7Ci0KLQkgIC8qIElmIHdlIGFyZW4ndCBzdXBwb3NlZCB0byB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQKLSAgICAgICAgICAgICBmaWxlcywgdGVtcG9yYXJpbHkgc2V0IHRoZSBCRkQgZXJyb3IgaGFuZGxlciB0byBhCi0gICAgICAgICAgICAgZnVuY3Rpb24gd2hpY2ggd2lsbCBkbyBub3RoaW5nLiAgV2Ugc3RpbGwgd2FudCB0byBjYWxsCi0gICAgICAgICAgICAgYmZkX21lcmdlX3ByaXZhdGVfYmZkX2RhdGEsIHNpbmNlIGl0IG1heSBzZXQgdXAKLSAgICAgICAgICAgICBpbmZvcm1hdGlvbiB3aGljaCBpcyBuZWVkZWQgaW4gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQkgIGlmICghIGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQotCSAgICBwZm4gPSBiZmRfc2V0X2Vycm9yX2hhbmRsZXIgKGlnbm9yZV9iZmRfZXJyb3JzKTsKLQkgIGlmICghIGJmZF9tZXJnZV9wcml2YXRlX2JmZF9kYXRhIChpbnB1dF9iZmQsIG91dHB1dF9iZmQpKQotCSAgICB7Ci0JICAgICAgaWYgKGNvbW1hbmRfbGluZS53YXJuX21pc21hdGNoKQotCQllaW5mbyAoXygiJUUlWDogZmFpbGVkIHRvIG1lcmdlIHRhcmdldCBzcGVjaWZpYyBkYXRhIG9mIGZpbGUgJUJcbiIpLAotCQkgICAgICAgaW5wdXRfYmZkKTsKLQkgICAgfQotCSAgaWYgKCEgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2gpCi0JICAgIGJmZF9zZXRfZXJyb3JfaGFuZGxlciAocGZuKTsKLQl9Ci0gICAgfQotfQotCi0vKiBMb29rIHRocm91Z2ggYWxsIHRoZSBnbG9iYWwgY29tbW9uIHN5bWJvbHMgYW5kIGF0dGFjaCB0aGVtIHRvIHRoZQotICAgY29ycmVjdCBzZWN0aW9uLiAgVGhlIC1zb3J0LWNvbW1vbiBjb21tYW5kIGxpbmUgc3dpdGNoIG1heSBiZSB1c2VkCi0gICB0byByb3VnaGx5IHNvcnQgdGhlIGVudHJpZXMgYnkgc2l6ZS4gICovCi0KLXN0YXRpYyB2b2lkCi1sYW5nX2NvbW1vbiAoKQotewotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgISBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24pCi0gICAgcmV0dXJuOwotCi0gIGlmICghIGNvbmZpZy5zb3J0X2NvbW1vbikKLSAgICBiZmRfbGlua19oYXNoX3RyYXZlcnNlIChsaW5rX2luZm8uaGFzaCwgbGFuZ19vbmVfY29tbW9uLCAoUFRSKSBOVUxMKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIGludCBwb3dlcjsKLQotICAgICAgZm9yIChwb3dlciA9IDQ7IHBvd2VyID49IDA7IHBvd2VyLS0pCi0JYmZkX2xpbmtfaGFzaF90cmF2ZXJzZSAobGlua19pbmZvLmhhc2gsIGxhbmdfb25lX2NvbW1vbiwKLQkJCQkoUFRSKSAmcG93ZXIpOwotICAgIH0KLX0KLQotLyogUGxhY2Ugb25lIGNvbW1vbiBzeW1ib2wgaW4gdGhlIGNvcnJlY3Qgc2VjdGlvbi4gICovCi0KLXN0YXRpYyBib29sZWFuCi1sYW5nX29uZV9jb21tb24gKGgsIGluZm8pCi0gICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICBQVFIgaW5mbzsKLXsKLSAgdW5zaWduZWQgaW50IHBvd2VyX29mX3R3bzsKLSAgYmZkX3ZtYSBzaXplOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLQotICBpZiAoaC0+dHlwZSAhPSBiZmRfbGlua19oYXNoX2NvbW1vbikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzaXplID0gaC0+dS5jLnNpemU7Ci0gIHBvd2VyX29mX3R3byA9IGgtPnUuYy5wLT5hbGlnbm1lbnRfcG93ZXI7Ci0KLSAgaWYgKGNvbmZpZy5zb3J0X2NvbW1vbgotICAgICAgJiYgcG93ZXJfb2ZfdHdvIDwgKHVuc2lnbmVkIGludCkgKihpbnQgKikgaW5mbykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBzZWN0aW9uID0gaC0+dS5jLnAtPnNlY3Rpb247Ci0KLSAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgPSBBTElHTl9OIChzZWN0aW9uLT5fY29va2VkX3NpemUsCi0JCQkJICAgKGJmZF9zaXplX3R5cGUpICgxIDw8IHBvd2VyX29mX3R3bykpOwotCi0gIC8qIEFkanVzdCB0aGUgYWxpZ25tZW50IGlmIG5lY2Vzc2FyeS4gICovCi0gIGlmIChwb3dlcl9vZl90d28gPiBzZWN0aW9uLT5hbGlnbm1lbnRfcG93ZXIpCi0gICAgc2VjdGlvbi0+YWxpZ25tZW50X3Bvd2VyID0gcG93ZXJfb2ZfdHdvOwotCi0gIC8qIENoYW5nZSB0aGUgc3ltYm9sIGZyb20gY29tbW9uIHRvIGRlZmluZWQuICAqLwotICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICBoLT51LmRlZi5zZWN0aW9uID0gc2VjdGlvbjsKLSAgaC0+dS5kZWYudmFsdWUgPSBzZWN0aW9uLT5fY29va2VkX3NpemU7Ci0KLSAgLyogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24uICAqLwotICBzZWN0aW9uLT5fY29va2VkX3NpemUgKz0gc2l6ZTsKLQotICAvKiBNYWtlIHN1cmUgdGhlIHNlY3Rpb24gaXMgYWxsb2NhdGVkIGluIG1lbW9yeSwgYW5kIG1ha2Ugc3VyZSB0aGF0Ci0gICAgIGl0IGlzIG5vIGxvbmdlciBhIGNvbW1vbiBzZWN0aW9uLiAgKi8KLSAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0FMTE9DOwotICBzZWN0aW9uLT5mbGFncyAmPSB+IFNFQ19JU19DT01NT047Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0YXRpYyBib29sZWFuIGhlYWRlcl9wcmludGVkOwotICAgICAgaW50IGxlbjsKLSAgICAgIGNoYXIgKm5hbWU7Ci0gICAgICBjaGFyIGJ1Zls1MF07Ci0KLSAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQotCXsKLQkgIG1pbmZvIChfKCJcbkFsbG9jYXRpbmcgY29tbW9uIHN5bWJvbHNcbiIpKTsKLQkgIG1pbmZvIChfKCJDb21tb24gc3ltYm9sICAgICAgIHNpemUgICAgICAgICAgICAgIGZpbGVcblxuIikpOwotCSAgaGVhZGVyX3ByaW50ZWQgPSB0cnVlOwotCX0KLQotICAgICAgbmFtZSA9IGRlbWFuZ2xlIChoLT5yb290LnN0cmluZyk7Ci0gICAgICBtaW5mbyAoIiVzIiwgbmFtZSk7Ci0gICAgICBsZW4gPSBzdHJsZW4gKG5hbWUpOwotICAgICAgZnJlZSAobmFtZSk7Ci0KLSAgICAgIGlmIChsZW4gPj0gMTkpCi0JewotCSAgcHJpbnRfbmwgKCk7Ci0JICBsZW4gPSAwOwotCX0KLSAgICAgIHdoaWxlIChsZW4gPCAyMCkKLQl7Ci0JICBwcmludF9zcGFjZSAoKTsKLQkgICsrbGVuOwotCX0KLQotICAgICAgbWluZm8gKCIweCIpOwotICAgICAgaWYgKHNpemUgPD0gMHhmZmZmZmZmZikKLQlzcHJpbnRmIChidWYsICIlbHgiLCAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0gICAgICBlbHNlCi0Jc3ByaW50Zl92bWEgKGJ1Ziwgc2l6ZSk7Ci0gICAgICBtaW5mbyAoIiVzIiwgYnVmKTsKLSAgICAgIGxlbiA9IHN0cmxlbiAoYnVmKTsKLQotICAgICAgd2hpbGUgKGxlbiA8IDE2KQotCXsKLQkgIHByaW50X3NwYWNlICgpOwotCSAgKytsZW47Ci0JfQotCi0gICAgICBtaW5mbyAoIiVCXG4iLCBzZWN0aW9uLT5vd25lcik7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKgotcnVuIHRocm91Z2ggdGhlIGlucHV0IGZpbGVzIGFuZCBlbnN1cmUgdGhhdCBldmVyeSBpbnB1dAotc2VjdGlvbiBoYXMgc29tZXdoZXJlIHRvIGdvLiBJZiBvbmUgaXMgZm91bmQgd2l0aG91dAotYSBkZXN0aW5hdGlvbiB0aGVuIGNyZWF0ZSBhbiBpbnB1dCByZXF1ZXN0IGFuZCBwbGFjZSBpdAotaW50byB0aGUgc3RhdGVtZW50IHRyZWUuCi0qLwotCi1zdGF0aWMgdm9pZAotbGFuZ19wbGFjZV9vcnBoYW5zICgpCi17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0KLSAgZm9yIChmaWxlID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZV9jaGFpbi5oZWFkOwotICAgICAgIGZpbGUgIT0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgTlVMTDsKLSAgICAgICBmaWxlID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikgZmlsZS0+bmV4dCkKLSAgICB7Ci0gICAgICBhc2VjdGlvbiAqczsKLQotICAgICAgZm9yIChzID0gZmlsZS0+dGhlX2JmZC0+c2VjdGlvbnM7Ci0JICAgcyAhPSAoYXNlY3Rpb24gKikgTlVMTDsKLQkgICBzID0gcy0+bmV4dCkKLQl7Ci0JICBpZiAocy0+b3V0cHV0X3NlY3Rpb24gPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JICAgIHsKLQkgICAgICAvKiBUaGlzIHNlY3Rpb24gb2YgdGhlIGZpbGUgaXMgbm90IGF0dGF0Y2hlZCwgcm9vdAotCSAgICAgICAgIGFyb3VuZCBmb3IgYSBzZW5zaWJsZSBwbGFjZSBmb3IgaXQgdG8gZ28gKi8KLQotCSAgICAgIGlmIChmaWxlLT5qdXN0X3N5bXNfZmxhZykKLQkJewotCQkgIC8qIFdlIGFyZSBvbmx5IHJldHJpZXZpbmcgc3ltYm9sIHZhbHVlcyBmcm9tIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUuICBXZSB3YW50IHRoZSBzeW1ib2xzIHRvIGFjdCBhcyB0aG91Z2ggdGhlCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgaW4gdGhlIGZpbGUgYXJlIGFic29sdXRlLiAgKi8KLQkJICBzLT5vdXRwdXRfc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0JCSAgcy0+b3V0cHV0X29mZnNldCA9IHMtPnZtYTsKLQkJfQotCSAgICAgIGVsc2UgaWYgKHN0cmNtcCAocy0+bmFtZSwgIkNPTU1PTiIpID09IDApCi0JCXsKLQkJICAvKiBUaGlzIGlzIGEgbG9uZWx5IGNvbW1vbiBzZWN0aW9uIHdoaWNoIG11c3QgaGF2ZQotCQkgICAgIGNvbWUgZnJvbSBhbiBhcmNoaXZlLiAgV2UgYXR0YWNoIHRvIHRoZSBzZWN0aW9uCi0JCSAgICAgd2l0aCB0aGUgd2lsZGNhcmQuICAqLwotCQkgIGlmICghIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUKLQkJICAgICAgfHwgY29tbWFuZF9saW5lLmZvcmNlX2NvbW1vbl9kZWZpbml0aW9uKQotCQkgICAgewotCQkgICAgICBpZiAoZGVmYXVsdF9jb21tb25fc2VjdGlvbiA9PSBOVUxMKQotCQkJewotI2lmIDAKLQkJCSAgLyogVGhpcyBtZXNzYWdlIGhhcHBlbnMgd2hlbiB1c2luZyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZyMy5pZmlsZSBsaW5rZXIgc2NyaXB0LCBzbyBJIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgaXQuICAqLwotCQkJICBpbmZvX21zZyAoXygiJVA6IG5vIFtDT01NT05dIGNvbW1hbmQsIGRlZmF1bHRpbmcgdG8gLmJzc1xuIikpOwotI2VuZGlmCi0JCQkgIGRlZmF1bHRfY29tbW9uX3NlY3Rpb24gPQotCQkJICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAoIi5ic3MiKTsKLQotCQkJfQotCQkgICAgICB3aWxkX2RvaXQgKCZkZWZhdWx0X2NvbW1vbl9zZWN0aW9uLT5jaGlsZHJlbiwgcywKLQkJCQkgZGVmYXVsdF9jb21tb25fc2VjdGlvbiwgZmlsZSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsZGVtdWxfcGxhY2Vfb3JwaGFuIChmaWxlLCBzKSkKLQkJOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zID0KLQkJICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKHMtPm5hbWUpOwotCi0JCSAgd2lsZF9kb2l0ICgmb3MtPmNoaWxkcmVuLCBzLCBvcywgZmlsZSk7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLQotdm9pZAotbGFuZ19zZXRfZmxhZ3MgKHB0ciwgZmxhZ3MsIGludmVydCkKLSAgICAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnB0cjsKLSAgICAgQ09OU1QgY2hhciAqZmxhZ3M7Ci0gICAgIGludCBpbnZlcnQ7Ci17Ci0gIGZsYWd3b3JkICpwdHJfZmxhZ3M7Ci0KLSAgcHRyX2ZsYWdzID0gaW52ZXJ0ID8gJnB0ci0+bm90X2ZsYWdzIDogJnB0ci0+ZmxhZ3M7Ci0gIHdoaWxlICgqZmxhZ3MpCi0gICAgewotICAgICAgc3dpdGNoICgqZmxhZ3MpCi0JewotCWNhc2UgJ0EnOiBjYXNlICdhJzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX0FMTE9DOwotCSAgYnJlYWs7Ci0KLQljYXNlICdSJzogY2FzZSAncic6Ci0JICAqcHRyX2ZsYWdzIHw9IFNFQ19SRUFET05MWTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnVyc6IGNhc2UgJ3cnOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfREFUQTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnWCc6IGNhc2UgJ3gnOgotCSAgKnB0cl9mbGFncyB8PSBTRUNfQ09ERTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnTCc6IGNhc2UgJ2wnOgotCWNhc2UgJ0knOiBjYXNlICdpJzoKLQkgICpwdHJfZmxhZ3MgfD0gU0VDX0xPQUQ7Ci0JICBicmVhazsKLQotCWRlZmF1bHQ6Ci0JICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBzeW50YXggaW4gZmxhZ3NcbiIpKTsKLQkgIGJyZWFrOwotCX0KLSAgICAgIGZsYWdzKys7Ci0gICAgfQotfQotCi0vKiBDYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBpbnB1dCBmaWxlLiAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAotICAgb24gYW4gYXJjaGl2ZSwgYnV0IG5vdCBvbiB0aGUgZWxlbWVudHMuICAqLwotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGZ1bmMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKLQotICBmb3IgKGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBpbnB1dF9maWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgZiAhPSBOVUxMOwotICAgICAgIGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmLT5uZXh0X3JlYWxfZmlsZSkKLSAgICBmdW5jIChmKTsKLX0KLQotLyogQ2FsbCBhIGZ1bmN0aW9uIG9uIGVhY2ggZmlsZS4gIFRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBhbGwKLSAgIHRoZSBlbGVtZW50cyBvZiBhbiBhcmNoaXZlIHdoaWNoIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGluaywgYnV0IHdpbGwKLSAgIG5vdCBiZSBjYWxsZWQgb24gdGhlIGFyY2hpdmUgZmlsZSBpdHNlbGYuICAqLwotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX2ZpbGUgKGZ1bmMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKTsKLXsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZjsKLQotICBmb3IgKGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmaWxlX2NoYWluLmhlYWQ7Ci0gICAgICAgZiAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMOwotICAgICAgIGYgPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBmLT5uZXh0KQotICAgIHsKLSAgICAgIGZ1bmMgKGYpOwotICAgIH0KLX0KLQotI2lmIDAKLQotLyogTm90IHVzZWQuICAqLwotCi12b2lkCi1sYW5nX2Zvcl9lYWNoX2lucHV0X3NlY3Rpb24gKGZ1bmMpCi0gICAgIHZvaWQgKCpmdW5jKSBQQVJBTVMgKChiZmQgKiBhYiwgYXNlY3Rpb24gKiBhcykpOwotewotICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmOwotCi0gIGZvciAoZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGZpbGVfY2hhaW4uaGVhZDsKLSAgICAgICBmICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEw7Ci0gICAgICAgZiA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGYtPm5leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnM7Ci0KLSAgICAgIGZvciAocyA9IGYtPnRoZV9iZmQtPnNlY3Rpb25zOwotCSAgIHMgIT0gKGFzZWN0aW9uICopIE5VTEw7Ci0JICAgcyA9IHMtPm5leHQpCi0JewotCSAgZnVuYyAoZi0+dGhlX2JmZCwgcyk7Ci0JfQotICAgIH0KLX0KLQotI2VuZGlmCi0KLXZvaWQKLWxkbGFuZ19hZGRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiBlbnRyeTsKLXsKLSAgYmZkICoqcHA7Ci0KLSAgbGFuZ19zdGF0ZW1lbnRfYXBwZW5kICgmZmlsZV9jaGFpbiwKLQkJCSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBlbnRyeSwKLQkJCSAmZW50cnktPm5leHQpOwotCi0gIC8qIFRoZSBCRkQgbGlua2VyIG5lZWRzIHRvIGhhdmUgYSBsaXN0IG9mIGFsbCBpbnB1dCBCRkRzIGludm9sdmVkIGluCi0gICAgIGEgbGluay4gICovCi0gIEFTU0VSVCAoZW50cnktPnRoZV9iZmQtPmxpbmtfbmV4dCA9PSAoYmZkICopIE5VTEwpOwotICBBU1NFUlQgKGVudHJ5LT50aGVfYmZkICE9IG91dHB1dF9iZmQpOwotICBmb3IgKHBwID0gJmxpbmtfaW5mby5pbnB1dF9iZmRzOwotICAgICAgICpwcCAhPSAoYmZkICopIE5VTEw7Ci0gICAgICAgcHAgPSAmKCpwcCktPmxpbmtfbmV4dCkKLSAgICA7Ci0gICpwcCA9IGVudHJ5LT50aGVfYmZkOwotICBlbnRyeS0+dGhlX2JmZC0+dXNyZGF0YSA9IChQVFIpIGVudHJ5OwotICBiZmRfc2V0X2dwX3NpemUgKGVudHJ5LT50aGVfYmZkLCBnX3N3aXRjaF92YWx1ZSk7Ci0KLSAgLyogTG9vayB0aHJvdWdoIHRoZSBzZWN0aW9ucyBhbmQgY2hlY2sgZm9yIGFueSB3aGljaCBzaG91bGQgbm90IGJlCi0gICAgIGluY2x1ZGVkIGluIHRoZSBsaW5rLiAgV2UgbmVlZCB0byBkbyB0aGlzIG5vdywgc28gdGhhdCB3ZSBjYW4KLSAgICAgbm90aWNlIHdoZW4gdGhlIGJhY2tlbmQgbGlua2VyIHRyaWVzIHRvIHJlcG9ydCBtdWx0aXBsZQotICAgICBkZWZpbml0aW9uIGVycm9ycyBmb3Igc3ltYm9scyB3aGljaCBhcmUgaW4gc2VjdGlvbnMgd2UgYXJlbid0Ci0gICAgIGdvaW5nIHRvIGxpbmsuICBGSVhNRTogSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGVudGlyZWx5IGlnbm9yZQotICAgICBzeW1ib2xzIHdoaWNoIGFyZSBkZWZpbmVkIGluIHNlY3Rpb25zIHdoaWNoIGFyZSBnb2luZyB0byBiZQotICAgICBkaXNjYXJkZWQuICBUaGlzIHdvdWxkIHJlcXVpcmUgbW9kaWZ5aW5nIHRoZSBiYWNrZW5kIGxpbmtlciBmb3IKLSAgICAgZWFjaCBiYWNrZW5kIHdoaWNoIG1pZ2h0IHNldCB0aGUgU0VDX0xJTktfT05DRSBmbGFnLiAgSWYgd2UgZG8KLSAgICAgdGhpcywgd2Ugc2hvdWxkIHByb2JhYmx5IGhhbmRsZSBTRUNfRVhDTFVERSBpbiB0aGUgc2FtZSB3YXkuICAqLwotCi0gIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoZW50cnktPnRoZV9iZmQsIHNlY3Rpb25fYWxyZWFkeV9saW5rZWQsIChQVFIpIGVudHJ5KTsKLX0KLQotdm9pZAotbGFuZ19hZGRfb3V0cHV0IChuYW1lLCBmcm9tX3NjcmlwdCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZyb21fc2NyaXB0OwotewotICAvKiBNYWtlIC1vIG9uIGNvbW1hbmQgbGluZSBvdmVycmlkZSBPVVRQVVQgaW4gc2NyaXB0LiAgKi8KLSAgaWYgKGhhZF9vdXRwdXRfZmlsZW5hbWUgPT0gZmFsc2UgfHwgIWZyb21fc2NyaXB0KQotICAgIHsKLSAgICAgIG91dHB1dF9maWxlbmFtZSA9IG5hbWU7Ci0gICAgICBoYWRfb3V0cHV0X2ZpbGVuYW1lID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmN1cnJlbnRfc2VjdGlvbjsKLQotc3RhdGljIGludAotdG9wb3dlciAoeCkKLSAgICAgaW50IHg7Ci17Ci0gIHVuc2lnbmVkIGludCBpID0gMTsKLSAgaW50IGw7Ci0KLSAgaWYgKHggPCAwKQotICAgIHJldHVybiAtMTsKLQotICBmb3IgKGwgPSAwOyBsIDwgMzI7IGwrKykgCi0gICAgewotICAgICAgaWYgKGkgPj0gKHVuc2lnbmVkIGludCkgeCkKLQlyZXR1cm4gbDsKLSAgICAgIGkgPDw9IDE7Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi12b2lkCi1sYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUsCi0JCQkJICAgICBhZGRyZXNzX2V4cCwgc2VjdHlwZSwgYmxvY2tfdmFsdWUsCi0JCQkJICAgICBhbGlnbiwgc3ViYWxpZ24sIGViYXNlKQotICAgICBjb25zdCBjaGFyICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqIGFkZHJlc3NfZXhwOwotICAgICBlbnVtIHNlY3Rpb25fdHlwZSBzZWN0eXBlOwotICAgICBiZmRfdm1hIGJsb2NrX3ZhbHVlOwotICAgICBldHJlZV90eXBlICphbGlnbjsKLSAgICAgZXRyZWVfdHlwZSAqc3ViYWxpZ247Ci0gICAgIGV0cmVlX3R5cGUgKmViYXNlOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBjdXJyZW50X3NlY3Rpb24gPQotICAgb3MgPQotICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCAob3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X25hbWUpOwotCi0KLQotICAvKiBBZGQgdGhpcyBzdGF0ZW1lbnQgdG8gdHJlZSAqLwotICAvKiAgYWRkX3N0YXRlbWVudChsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9lbnVtLAotICAgICAgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50KTsqLwotICAvKiBNYWtlIG5leHQgdGhpbmdzIGNoYWluIGludG8gc3ViY2hhaW4gb2YgdGhpcyAqLwotCi0gIGlmIChvcy0+YWRkcl90cmVlID09Ci0gICAgICAoZXRyZWVfdHlwZSAqKSBOVUxMKQotICB7Ci0gICAgb3MtPmFkZHJfdHJlZSA9Ci0gICAgIGFkZHJlc3NfZXhwOwotICB9Ci0gIG9zLT5zZWN0eXBlID0gc2VjdHlwZTsKLSAgaWYgKHNlY3R5cGUgIT0gbm9sb2FkX3NlY3Rpb24pCi0gICAgb3MtPmZsYWdzID0gU0VDX05PX0ZMQUdTOwotICBlbHNlCi0gICAgb3MtPmZsYWdzID0gU0VDX05FVkVSX0xPQUQ7Ci0gIG9zLT5ibG9ja192YWx1ZSA9IGJsb2NrX3ZhbHVlID8gYmxvY2tfdmFsdWUgOiAxOwotICBzdGF0X3B0ciA9ICZvcy0+Y2hpbGRyZW47Ci0KLSAgb3MtPnN1YnNlY3Rpb25fYWxpZ25tZW50ID0gdG9wb3dlcigKLSAgIGV4cF9nZXRfdmFsdWVfaW50KHN1YmFsaWduLCAtMSwKLQkJICAgICAic3Vic2VjdGlvbiBhbGlnbm1lbnQiLAotCQkgICAgIDApKTsKLSAgb3MtPnNlY3Rpb25fYWxpZ25tZW50ID0gdG9wb3dlcigKLSAgIGV4cF9nZXRfdmFsdWVfaW50KGFsaWduLCAtMSwKLQkJICAgICAic2VjdGlvbiBhbGlnbm1lbnQiLCAwKSk7Ci0KLSAgb3MtPmxvYWRfYmFzZSA9IGViYXNlOwotfQotCi0KLXZvaWQKLWxhbmdfZmluYWwgKCkKLXsKLSAgbGFuZ19vdXRwdXRfc3RhdGVtZW50X3R5cGUgKm5ldyA9Ci0gICAgbmV3X3N0YXQgKGxhbmdfb3V0cHV0X3N0YXRlbWVudCwgc3RhdF9wdHIpOwotCi0gIG5ldy0+bmFtZSA9IG91dHB1dF9maWxlbmFtZTsKLX0KLQotLyogUmVzZXQgdGhlIGN1cnJlbnQgY291bnRlcnMgaW4gdGhlIHJlZ2lvbnMgKi8KLXN0YXRpYyB2b2lkCi1yZXNldF9tZW1vcnlfcmVnaW9ucyAoKQotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotCi0gIGZvciAocCA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9saXN0OwotICAgICAgIHAgIT0gKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICopIE5VTEw7Ci0gICAgICAgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgcC0+b2xkX2xlbmd0aCA9IChiZmRfc2l6ZV90eXBlKSAocC0+Y3VycmVudCAtIHAtPm9yaWdpbik7Ci0gICAgICBwLT5jdXJyZW50ID0gcC0+b3JpZ2luOwotICAgIH0KLX0KLQotLyogRXhwYW5kIGEgd2lsZCBzdGF0ZW1lbnQgZm9yIGEgcGFydGljdWxhciBGSUxFLCBtYXJraW5nIGl0cyBzZWN0aW9ucyBLRUVQCi0gICBhcyBuZWVkZWQuICBTRUNUSU9OIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgd2lsZCBjYXJkLiAgKi8KLQotc3RhdGljIHZvaWQKLWdjX3NlY3Rpb25fY2FsbGJhY2sgKHB0ciwgc2VjdGlvbiwgZmlsZSwgZGF0YSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpwdHI7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICpmaWxlOwotICAgICB2b2lkICpkYXRhOwotewotICAvKiBJZiB0aGUgd2lsZCBwYXR0ZXJuIHdhcyBtYXJrZWQgS0VFUCwgdGhlIG1lbWJlciBzZWN0aW9ucwotICAgICBzaG91bGQgYmUgYXMgd2VsbC4gICovCi0gIGlmIChwdHItPmtlZXBfc2VjdGlvbnMpCi0gICAgc2VjdGlvbi0+ZmxhZ3MgfD0gU0VDX0tFRVA7Ci19Ci0KLS8qIEhhbmRsZSBhIHdpbGQgc3RhdGVtZW50LCBtYXJraW5nIGl0IGFnYWluc3QgR0MuICBTRUNUSU9OIG9yIEZJTEUgb3IgYm90aAotICAgbWF5IGJlIE5VTEwsIGluZGljYXRpbmcgdGhhdCBpdCBpcyBhIHdpbGRjYXJkLiAgKi8KLQotc3RhdGljIHZvaWQKLWxhbmdfZ2Nfd2lsZCAocywgc2VjdGlvbiwgZmlsZSkKLSAgICAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpzOwotICAgICBjb25zdCBjaGFyICpzZWN0aW9uOwotICAgICBjb25zdCBjaGFyICpmaWxlOwotewotICB3YWxrX3dpbGQgKHMsIHNlY3Rpb24sIGZpbGUsIGdjX3NlY3Rpb25fY2FsbGJhY2ssIE5VTEwpOwotfQotCi0vKiBJdGVyYXRlIG92ZXIgc2VjdGlvbnMgbWFya2luZyB0aGVtIGFnYWluc3QgR0MuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19nY19zZWN0aW9uc18xIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICogczsKLXsKLSAgZm9yICg7IHMgIT0gKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgTlVMTDsgcyA9IHMtPm5leHQpCi0gICAgewotICAgICAgc3dpdGNoIChzLT5oZWFkZXIudHlwZSkKLQl7Ci0JY2FzZSBsYW5nX3dpbGRfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2djX3dpbGQgKCZzLT53aWxkX3N0YXRlbWVudCwKLQkJCXMtPndpbGRfc3RhdGVtZW50LnNlY3Rpb25fbmFtZSwKLQkJCXMtPndpbGRfc3RhdGVtZW50LmZpbGVuYW1lKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19jb25zdHJ1Y3RvcnNfc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2djX3NlY3Rpb25zXzEgKGNvbnN0cnVjdG9yX2xpc3QuaGVhZCk7Ci0JICBicmVhazsKLQljYXNlIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW06Ci0JICBsYW5nX2djX3NlY3Rpb25zXzEgKHMtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkKTsKLQkgIGJyZWFrOwotCWNhc2UgbGFuZ19ncm91cF9zdGF0ZW1lbnRfZW51bToKLQkgIGxhbmdfZ2Nfc2VjdGlvbnNfMSAocy0+Z3JvdXBfc3RhdGVtZW50LmNoaWxkcmVuLmhlYWQpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1sYW5nX2djX3NlY3Rpb25zICgpCi17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICBsZGxhbmdfdW5kZWZfY2hhaW5fbGlzdF90eXBlICp1bGlzdCwgZmFrZV9saXN0X3N0YXJ0OwotCi0gIC8qIEtlZXAgYWxsIHNlY3Rpb25zIHNvIG1hcmtlZCBpbiB0aGUgbGluayBzY3JpcHQuICAqLwotCi0gIGxhbmdfZ2Nfc2VjdGlvbnNfMSAoc3RhdGVtZW50X2xpc3QuaGVhZCk7Ci0KLSAgLyogS2VlcCBhbGwgc2VjdGlvbnMgY29udGFpbmluZyBzeW1ib2xzIHVuZGVmaW5lZCBvbiB0aGUgY29tbWFuZC1saW5lLgotICAgICBIYW5kbGUgdGhlIGVudHJ5IHN5bWJvbCBhdCB0aGUgc2FtZSB0aW1lLiAgKi8KLQotICBmYWtlX2xpc3Rfc3RhcnQubmV4dCA9IGxkbGFuZ191bmRlZl9jaGFpbl9saXN0X2hlYWQ7Ci0gIGlmIChlbnRyeV9zeW1ib2wgPT0gTlVMTCkKLSAgICBmYWtlX2xpc3Rfc3RhcnQubmFtZSA9ICJzdGFydCI7Ci0gIGVsc2UKLSAgICBmYWtlX2xpc3Rfc3RhcnQubmFtZSA9IChjaGFyICopIGVudHJ5X3N5bWJvbDsKLQotICBmb3IgKHVsaXN0ID0gJmZha2VfbGlzdF9zdGFydDsgdWxpc3Q7IHVsaXN0ID0gdWxpc3QtPm5leHQpCi0gICAgewotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgdWxpc3QtPm5hbWUsIAotCQkJCWZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCi0gICAgICBpZiAoaCAhPSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTAotICAgICAgICAgICYmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgICAgICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhaykKLQkgICYmICEgYmZkX2lzX2Fic19zZWN0aW9uIChoLT51LmRlZi5zZWN0aW9uKSkKLQl7Ci0JICBoLT51LmRlZi5zZWN0aW9uLT5mbGFncyB8PSBTRUNfS0VFUDsKLQl9Ci0gICAgfQotCi0gIGJmZF9nY19zZWN0aW9ucyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbyk7Ci19Ci0KLXZvaWQKLWxhbmdfcHJvY2VzcyAoKQotewotICBsYW5nX3JlYXNvbmFibGVfZGVmYXVsdHMgKCk7Ci0gIGN1cnJlbnRfdGFyZ2V0ID0gZGVmYXVsdF90YXJnZXQ7Ci0KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGxkbGFuZ19vcGVuX291dHB1dCk7CS8qIE9wZW4gdGhlIG91dHB1dCBmaWxlICovCi0KLSAgbGRlbXVsX2NyZWF0ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRzICgpOwotCi0gIC8qIEFkZCB0byB0aGUgaGFzaCB0YWJsZSBhbGwgdW5kZWZpbmVkcyBvbiB0aGUgY29tbWFuZCBsaW5lICovCi0gIGxhbmdfcGxhY2VfdW5kZWZpbmVkcyAoKTsKLQotICAvKiBDcmVhdGUgYSBiZmQgZm9yIGVhY2ggaW5wdXQgZmlsZSAqLwotICBjdXJyZW50X3RhcmdldCA9IGRlZmF1bHRfdGFyZ2V0OwotICBvcGVuX2lucHV0X2JmZHMgKHN0YXRlbWVudF9saXN0LmhlYWQsIGZhbHNlKTsKLQotICBsZGVtdWxfYWZ0ZXJfb3BlbiAoKTsKLQotICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSdyZSBub3QgbWl4aW5nIGFyY2hpdGVjdHVyZXMuICBXZSBjYWxsIHRoaXMKLSAgICAgYWZ0ZXIgYWxsIHRoZSBpbnB1dCBmaWxlcyBoYXZlIGJlZW4gb3BlbmVkLCBidXQgYmVmb3JlIHdlIGRvIGFueQotICAgICBvdGhlciBwcm9jZXNzaW5nLCBzbyB0aGF0IGFueSBvcGVyYXRpb25zIG1lcmdlX3ByaXZhdGVfYmZkX2RhdGEKLSAgICAgZG9lcyBvbiB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBrbm93biBkdXJpbmcgdGhlIHJlc3Qgb2YgdGhlCi0gICAgIGxpbmsuICAqLwotICBsYW5nX2NoZWNrICgpOwotCi0gIC8qIEhhbmRsZSAuZXhwb3J0cyBpbnN0ZWFkIG9mIGEgdmVyc2lvbiBzY3JpcHQgaWYgd2UncmUgdG9sZCB0byBkbyBzby4gICovCi0gIGlmIChjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24pCi0gICAgbGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiAoKTsKLQotICAvKiBCdWlsZCBhbGwgc2V0cyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gZ2F0aGVyZWQgZnJvbSB0aGUgaW5wdXQKLSAgICAgZmlsZXMuICAqLwotICBsZGN0b3JfYnVpbGRfc2V0cyAoKTsKLQotICAvKiBSZW1vdmUgdW5yZWZlcmVuY2VkIHNlY3Rpb25zIGlmIGFza2VkIHRvLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucykKLSAgICBsYW5nX2djX3NlY3Rpb25zICgpOwotCi0gIC8qIFNpemUgdXAgdGhlIGNvbW1vbiBkYXRhICovCi0gIGxhbmdfY29tbW9uICgpOwotCi0gIC8qIFJ1biB0aHJvdWdoIHRoZSBjb250b3VycyBvZiB0aGUgc2NyaXB0IGFuZCBhdHRhY2ggaW5wdXQgc2VjdGlvbnMKLSAgICAgdG8gdGhlIGNvcnJlY3Qgb3V0cHV0IHNlY3Rpb25zCi0gICAgICovCi0gIG1hcF9pbnB1dF90b19vdXRwdXRfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsIChjaGFyICopIE5VTEwsCi0JCQkJKGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKikgTlVMTCk7Ci0KLQotICAvKiBGaW5kIGFueSBzZWN0aW9ucyBub3QgYXR0YWNoZWQgZXhwbGljaXRseSBhbmQgaGFuZGxlIHRoZW0gKi8KLSAgbGFuZ19wbGFjZV9vcnBoYW5zICgpOwotCi0gIGxkZW11bF9iZWZvcmVfYWxsb2NhdGlvbiAoKTsKLQotICAvKiBXZSBtdXN0IHJlY29yZCB0aGUgcHJvZ3JhbSBoZWFkZXJzIGJlZm9yZSB3ZSB0cnkgdG8gZml4IHRoZQotICAgICBzZWN0aW9uIHBvc2l0aW9ucywgc2luY2UgdGhleSB3aWxsIGFmZmVjdCBTSVpFT0ZfSEVBREVSUy4gICovCi0gIGxhbmdfcmVjb3JkX3BoZHJzICgpOwotCi0gIC8qIE5vdyBydW4gYXJvdW5kIGFuZCByZWxheCBpZiB3ZSBjYW4gKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5yZWxheCkKLSAgICB7Ci0gICAgICAvKiBGaXJzdCB0aW1lIHJvdW5kIGlzIGEgdHJpYWwgcnVuIHRvIGdldCB0aGUgJ3dvcnN0IGNhc2UnCi0JIGFkZHJlc3NlcyBvZiB0aGUgb2JqZWN0cyBpZiB0aGVyZSB3YXMgbm8gcmVsYXhpbmcuICAqLwotICAgICAgbGFuZ19zaXplX3NlY3Rpb25zIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkJICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICYoc3RhdGVtZW50X2xpc3QuaGVhZCksIDAsIChiZmRfdm1hKSAwLCBmYWxzZSk7Ci0KLSAgICAgIC8qIEtlZXAgcmVsYXhpbmcgdW50aWwgYmZkX3JlbGF4X3NlY3Rpb24gZ2l2ZXMgdXAuICAqLwotICAgICAgZG8KLQl7Ci0JICByZXNldF9tZW1vcnlfcmVnaW9ucyAoKTsKLQotCSAgcmVsYXhfYWdhaW4gPSBmYWxzZTsKLQotCSAgLyogTm90ZTogcGUtZGxsLmMgZG9lcyBzb21ldGhpbmcgbGlrZSB0aGlzIGFsc28uICBJZiB5b3UgZmluZAotCSAgICAgeW91IG5lZWQgdG8gY2hhbmdlIHRoaXMgY29kZSwgeW91IHByb2JhYmx5IG5lZWQgdG8gY2hhbmdlCi0JICAgICBwZS1kbGwuYyBhbHNvLiAgREogKi8KLQotCSAgLyogRG8gYWxsIHRoZSBhc3NpZ25tZW50cyB3aXRoIG91ciBjdXJyZW50IGd1ZXNzZXMgYXMgdG8KLQkgICAgIHNlY3Rpb24gc2l6ZXMuICAqLwotCSAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdGVtZW50X2xpc3QuaGVhZCwKLQkJCSAgICAgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAgICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotCi0JICAvKiBQZXJmb3JtIGFub3RoZXIgcmVsYXggcGFzcyAtIHRoaXMgdGltZSB3ZSBrbm93IHdoZXJlIHRoZQotCSAgICAgZ2xvYmFscyBhcmUsIHNvIGNhbiBtYWtlIGJldHRlciBndWVzcy4gICovCi0JICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgICAgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAgICAmKHN0YXRlbWVudF9saXN0LmhlYWQpLCAwLCAoYmZkX3ZtYSkgMCwgdHJ1ZSk7Ci0JfQotICAgICAgd2hpbGUgKHJlbGF4X2FnYWluKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBTaXplIHVwIHRoZSBzZWN0aW9ucy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRlbWVudF9saXN0LmhlYWQsCi0JCQkgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJihzdGF0ZW1lbnRfbGlzdC5oZWFkKSwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLSAgICB9Ci0KLSAgLyogU2VlIGlmIGFueXRoaW5nIHNwZWNpYWwgc2hvdWxkIGJlIGRvbmUgbm93IHdlIGtub3cgaG93IGJpZwotICAgICBldmVyeXRoaW5nIGlzLiAgKi8KLSAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0KLSAgLyogRml4IGFueSAuc3RhcnRvZi4gb3IgLnNpemVvZi4gc3ltYm9scy4gICovCi0gIGxhbmdfc2V0X3N0YXJ0b2YgKCk7Ci0KLSAgLyogRG8gYWxsIHRoZSBhc3NpZ25tZW50cywgbm93IHRoYXQgd2Uga25vdyB0aGUgZmluYWwgcmVzdGluZ3BsYWNlcwotICAgICBvZiBhbGwgdGhlIHN5bWJvbHMgKi8KLQotICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0ZW1lbnRfbGlzdC5oZWFkLAotCQkgICAgICAgYWJzX291dHB1dF9zZWN0aW9uLAotCQkgICAgICAgKGZpbGxfdHlwZSkgMCwgKGJmZF92bWEpIDApOwotCi0gIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBtYWtlIHNlbnNlLiAgKi8KLSAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgY29tbWFuZF9saW5lLmNoZWNrX3NlY3Rpb25fYWRkcmVzc2VzKQotICAgIGxhbmdfY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgKCk7Ci0gIAotICAvKiBGaW5hbCBzdHVmZnMgKi8KLQotICBsZGVtdWxfZmluaXNoICgpOwotICBsYW5nX2ZpbmlzaCAoKTsKLX0KLQotLyogRVhQT1JURUQgVE8gWUFDQyAqLwotCi12b2lkCi1sYW5nX2FkZF93aWxkIChzZWN0aW9uX25hbWUsIHNlY3Rpb25zX3NvcnRlZCwgZmlsZW5hbWUsIGZpbGVuYW1lc19zb3J0ZWQsCi0JICAgICAgIGtlZXBfc2VjdGlvbnMsIGV4Y2x1ZGVfZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmNvbnN0IHNlY3Rpb25fbmFtZTsKLSAgICAgYm9vbGVhbiBzZWN0aW9uc19zb3J0ZWQ7Ci0gICAgIGNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lOwotICAgICBib29sZWFuIGZpbGVuYW1lc19zb3J0ZWQ7Ci0gICAgIGJvb2xlYW4ga2VlcF9zZWN0aW9uczsKLSAgICAgY29uc3QgY2hhciAqZXhjbHVkZV9maWxlbmFtZTsKLXsKLSAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ193aWxkX3N0YXRlbWVudCwKLQkJCQkJICAgIHN0YXRfcHRyKTsKLQotICBpZiAoc2VjdGlvbl9uYW1lICE9IChjaGFyICopIE5VTEwgJiYgc3RyY21wIChzZWN0aW9uX25hbWUsICJDT01NT04iKSA9PSAwKQotICAgIHsKLSAgICAgIHBsYWNlZF9jb21tb25zID0gdHJ1ZTsKLSAgICB9Ci0gIGlmIChmaWxlbmFtZSAhPSBOVUxMICYmICEgd2lsZGNhcmRwIChmaWxlbmFtZSkpCi0gICAgewotICAgICAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IHRydWU7Ci0gICAgfQotICBuZXctPnNlY3Rpb25fbmFtZSA9IHNlY3Rpb25fbmFtZTsKLSAgbmV3LT5zZWN0aW9uc19zb3J0ZWQgPSBzZWN0aW9uc19zb3J0ZWQ7Ci0gIG5ldy0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgbmV3LT5maWxlbmFtZXNfc29ydGVkID0gZmlsZW5hbWVzX3NvcnRlZDsKLSAgbmV3LT5rZWVwX3NlY3Rpb25zID0ga2VlcF9zZWN0aW9uczsKLSAgbmV3LT5leGNsdWRlX2ZpbGVuYW1lID0gZXhjbHVkZV9maWxlbmFtZTsKLSAgbGFuZ19saXN0X2luaXQgKCZuZXctPmNoaWxkcmVuKTsKLX0KLQotdm9pZAotbGFuZ19zZWN0aW9uX3N0YXJ0IChuYW1lLCBhZGRyZXNzKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICogYWRkcmVzczsKLXsKLSAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlICphZCA9IG5ld19zdGF0IChsYW5nX2FkZHJlc3Nfc3RhdGVtZW50LCBzdGF0X3B0cik7Ci0KLSAgYWQtPnNlY3Rpb25fbmFtZSA9IG5hbWU7Ci0gIGFkLT5hZGRyZXNzID0gYWRkcmVzczsKLX0KLQotLyogU2V0IHRoZSBzdGFydCBzeW1ib2wgdG8gTkFNRS4gIENNRExJTkUgaXMgbm9uemVybyBpZiB0aGlzIGlzIGNhbGxlZAotICAgYmVjYXVzZSBvZiBhIC1lIGFyZ3VtZW50IG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIHplcm8gaWYgdGhpcyBpcwotICAgY2FsbGVkIGJ5IEVOVFJZIGluIGEgbGlua2VyIHNjcmlwdC4gIENvbW1hbmQgbGluZSBhcmd1bWVudHMgdGFrZQotICAgcHJlY2VkZW5jZS4gICovCi0KLXZvaWQKLWxhbmdfYWRkX2VudHJ5IChuYW1lLCBjbWRsaW5lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBib29sZWFuIGNtZGxpbmU7Ci17Ci0gIGlmIChlbnRyeV9zeW1ib2wgPT0gTlVMTAotICAgICAgfHwgY21kbGluZQotICAgICAgfHwgISBlbnRyeV9mcm9tX2NtZGxpbmUpCi0gICAgewotICAgICAgZW50cnlfc3ltYm9sID0gbmFtZTsKLSAgICAgIGVudHJ5X2Zyb21fY21kbGluZSA9IGNtZGxpbmU7Ci0gICAgfQotfQotCi12b2lkCi1sYW5nX2FkZF90YXJnZXQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF90eXBlICpuZXcgPSBuZXdfc3RhdCAobGFuZ190YXJnZXRfc3RhdGVtZW50LAotCQkJCQkgICAgICBzdGF0X3B0cik7Ci0KLSAgbmV3LT50YXJnZXQgPSBuYW1lOwotCi19Ci0KLXZvaWQKLWxhbmdfYWRkX21hcCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKm5hbWUpCi0JewotCSAgY2FzZSAnRic6Ci0JICBtYXBfb3B0aW9uX2YgPSB0cnVlOwotCSAgYnJlYWs7Ci0JfQotICAgICAgbmFtZSsrOwotICAgIH0KLX0KLQotdm9pZAotbGFuZ19hZGRfZmlsbCAoZXhwKQotICAgICBpbnQgZXhwOwotewotICBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX2ZpbGxfc3RhdGVtZW50LAotCQkJCQkgICAgc3RhdF9wdHIpOwotCi0gIG5ldy0+ZmlsbCA9IGV4cDsKLX0KLQotdm9pZAotbGFuZ19hZGRfZGF0YSAodHlwZSwgZXhwKQotICAgICBpbnQgdHlwZTsKLSAgICAgdW5pb24gZXRyZWVfdW5pb24gKmV4cDsKLXsKLQotICBsYW5nX2RhdGFfc3RhdGVtZW50X3R5cGUgKm5ldyA9IG5ld19zdGF0IChsYW5nX2RhdGFfc3RhdGVtZW50LAotCQkJCQkgICAgc3RhdF9wdHIpOwotCi0gIG5ldy0+ZXhwID0gZXhwOwotICBuZXctPnR5cGUgPSB0eXBlOwotCi19Ci0KLS8qIENyZWF0ZSBhIG5ldyByZWxvYyBzdGF0ZW1lbnQuICBSRUxPQyBpcyB0aGUgQkZEIHJlbG9jYXRpb24gdHlwZSB0bwotICAgZ2VuZXJhdGUuICBIT1dUTyBpcyB0aGUgY29ycmVzcG9uZGluZyBob3d0byBzdHJ1Y3R1cmUgKHdlIGNvdWxkCi0gICBsb29rIHRoaXMgdXAsIGJ1dCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IGRvbmUgc28pLiAgU0VDVElPTiBpcyB0aGUKLSAgIHNlY3Rpb24gdG8gZ2VuZXJhdGUgYSByZWxvYyBhZ2FpbnN0LCBvciBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZQotICAgc3ltYm9sIHRvIGdlbmVyYXRlIGEgcmVsb2MgYWdhaW5zdC4gIEV4YWN0bHkgb25lIG9mIFNFQ1RJT04gYW5kCi0gICBOQU1FIG11c3QgYmUgTlVMTC4gIEFEREVORCBpcyBhbiBleHByZXNzaW9uIGZvciB0aGUgYWRkZW5kLiAgKi8KLQotdm9pZAotbGFuZ19hZGRfcmVsb2MgKHJlbG9jLCBob3d0bywgc2VjdGlvbiwgbmFtZSwgYWRkZW5kKQotICAgICBiZmRfcmVsb2NfY29kZV9yZWFsX3R5cGUgcmVsb2M7Ci0gICAgIHJlbG9jX2hvd3RvX3R5cGUgKmhvd3RvOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgdW5pb24gZXRyZWVfdW5pb24gKmFkZGVuZDsKLXsKLSAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcCA9IG5ld19zdGF0IChsYW5nX3JlbG9jX3N0YXRlbWVudCwgc3RhdF9wdHIpOwotICAKLSAgcC0+cmVsb2MgPSByZWxvYzsKLSAgcC0+aG93dG8gPSBob3d0bzsKLSAgcC0+c2VjdGlvbiA9IHNlY3Rpb247Ci0gIHAtPm5hbWUgPSBuYW1lOwotICBwLT5hZGRlbmRfZXhwID0gYWRkZW5kOwotCi0gIHAtPmFkZGVuZF92YWx1ZSA9IDA7Ci0gIHAtPm91dHB1dF9zZWN0aW9uID0gTlVMTDsKLSAgcC0+b3V0cHV0X3ZtYSA9IDA7Ci19Ci0KLWxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqCi1sYW5nX2FkZF9hc3NpZ25tZW50IChleHApCi0gICAgIGV0cmVlX3R5cGUgKiBleHA7Ci17Ci0gIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSAqbmV3ID0gbmV3X3N0YXQgKGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnQsCi0JCQkJCQkgIHN0YXRfcHRyKTsKLQotICBuZXctPmV4cCA9IGV4cDsKLSAgcmV0dXJuIG5ldzsKLX0KLQotdm9pZAotbGFuZ19hZGRfYXR0cmlidXRlIChhdHRyaWJ1dGUpCi0gICAgIGVudW0gc3RhdGVtZW50X2VudW0gYXR0cmlidXRlOwotewotICBuZXdfc3RhdGVtZW50IChhdHRyaWJ1dGUsIHNpemVvZiAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSksIHN0YXRfcHRyKTsKLX0KLQotdm9pZAotbGFuZ19zdGFydHVwIChuYW1lKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotewotICBpZiAoc3RhcnR1cF9maWxlICE9IChjaGFyICopIE5VTEwpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVQJUZtdWx0aXBsZSBTVEFSVFVQIGZpbGVzXG4iKSk7Ci0gICAgfQotICBmaXJzdF9maWxlLT5maWxlbmFtZSA9IG5hbWU7Ci0gIGZpcnN0X2ZpbGUtPmxvY2FsX3N5bV9uYW1lID0gbmFtZTsKLSAgZmlyc3RfZmlsZS0+cmVhbCA9IHRydWU7Ci0KLSAgc3RhcnR1cF9maWxlID0gbmFtZTsKLX0KLQotdm9pZAotbGFuZ19mbG9hdCAobWF5YmUpCi0gICAgIGJvb2xlYW4gbWF5YmU7Ci17Ci0gIGxhbmdfZmxvYXRfZmxhZyA9IG1heWJlOwotfQotCi12b2lkCi1sYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoZmlsbCwgbWVtc3BlYywgcGhkcnMpCi0gICAgIGJmZF92bWEgZmlsbDsKLSAgICAgY29uc3QgY2hhciAqbWVtc3BlYzsKLSAgICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwaGRyczsKLXsKLSAgY3VycmVudF9zZWN0aW9uLT5maWxsID0gZmlsbDsKLSAgY3VycmVudF9zZWN0aW9uLT5yZWdpb24gPSBsYW5nX21lbW9yeV9yZWdpb25fbG9va3VwIChtZW1zcGVjKTsKLSAgY3VycmVudF9zZWN0aW9uLT5waGRycyA9IHBoZHJzOwotICBzdGF0X3B0ciA9ICZzdGF0ZW1lbnRfbGlzdDsKLX0KLQotLyoKLSBDcmVhdGUgYW4gYWJzb2x1dGUgc3ltYm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgd2l0aCB0aGUgdmFsdWUgb2YgdGhlCi0gYWRkcmVzcyBvZiBmaXJzdCBieXRlIG9mIHRoZSBzZWN0aW9uIG5hbWVkLgotCi0gSWYgdGhlIHN5bWJvbCBhbHJlYWR5IGV4aXN0cywgdGhlbiBkbyBub3RoaW5nLgotKi8KLXZvaWQKLWxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YgKHNlY25hbWUsIG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnNlY25hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIG5hbWUsIHRydWUsIHRydWUsIHRydWUpOwotICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotCi0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3Ci0gICAgICB8fCBoLT50eXBlID09IGJmZF9saW5rX2hhc2hfdW5kZWZpbmVkKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0KLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX2RlZmluZWQ7Ci0KLSAgICAgIHNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCBzZWNuYW1lKTsKLSAgICAgIGlmIChzZWMgPT0gKGFzZWN0aW9uICopIE5VTEwpCi0JaC0+dS5kZWYudmFsdWUgPSAwOwotICAgICAgZWxzZQotCWgtPnUuZGVmLnZhbHVlID0gYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgc2VjKTsKLQotICAgICAgaC0+dS5kZWYuc2VjdGlvbiA9IGJmZF9hYnNfc2VjdGlvbl9wdHI7Ci0gICAgfQotfQotCi0vKgotIENyZWF0ZSBhbiBhYnNvbHV0ZSBzeW1ib2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUKLSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHNlY3Rpb24gbmFtZWQuCi0KLSBJZiB0aGUgc3ltYm9sIGFscmVhZHkgZXhpc3RzLCB0aGVuIGRvIG5vdGhpbmcuCi0qLwotdm9pZAotbGFuZ19hYnNfc3ltYm9sX2F0X2VuZF9vZiAoc2VjbmFtZSwgbmFtZSkKLSAgICAgY29uc3QgY2hhciAqc2VjbmFtZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIGlmIChoID09IChzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgaWYgKGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcKLSAgICAgIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYzsKLQotICAgICAgaC0+dHlwZSA9IGJmZF9saW5rX2hhc2hfZGVmaW5lZDsKLQotICAgICAgc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKG91dHB1dF9iZmQsIHNlY25hbWUpOwotICAgICAgaWYgKHNlYyA9PSAoYXNlY3Rpb24gKikgTlVMTCkKLQloLT51LmRlZi52YWx1ZSA9IDA7Ci0gICAgICBlbHNlCi0JaC0+dS5kZWYudmFsdWUgPSAoYmZkX2dldF9zZWN0aW9uX3ZtYSAob3V0cHV0X2JmZCwgc2VjKQotCQkJICArIGJmZF9zZWN0aW9uX3NpemUgKG91dHB1dF9iZmQsIHNlYykpOwotCi0gICAgICBoLT51LmRlZi5zZWN0aW9uID0gYmZkX2Fic19zZWN0aW9uX3B0cjsKLSAgICB9Ci19Ci0KLXZvaWQKLWxhbmdfc3RhdGVtZW50X2FwcGVuZCAobGlzdCwgZWxlbWVudCwgZmllbGQpCi0gICAgIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqIGxpc3Q7Ci0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBlbGVtZW50OwotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICoqIGZpZWxkOwotewotICAqKGxpc3QtPnRhaWwpID0gZWxlbWVudDsKLSAgbGlzdC0+dGFpbCA9IGZpZWxkOwotfQotCi0vKiBTZXQgdGhlIG91dHB1dCBmb3JtYXQgdHlwZS4gIC1vZm9ybWF0IG92ZXJyaWRlcyBzY3JpcHRzLiAgKi8KLQotdm9pZAotbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCAoZm9ybWF0LCBiaWcsIGxpdHRsZSwgZnJvbV9zY3JpcHQpCi0gICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLSAgICAgY29uc3QgY2hhciAqYmlnOwotICAgICBjb25zdCBjaGFyICpsaXR0bGU7Ci0gICAgIGludCBmcm9tX3NjcmlwdDsKLXsKLSAgaWYgKG91dHB1dF90YXJnZXQgPT0gTlVMTCB8fCAhZnJvbV9zY3JpcHQpCi0gICAgewotICAgICAgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0JJRwotCSAgJiYgYmlnICE9IE5VTEwpCi0JZm9ybWF0ID0gYmlnOwotICAgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fTElUVExFCi0JICAgICAgICYmIGxpdHRsZSAhPSBOVUxMKQotCWZvcm1hdCA9IGxpdHRsZTsKLQotICAgICAgb3V0cHV0X3RhcmdldCA9IGZvcm1hdDsKLSAgICB9Ci19Ci0KLS8qIEVudGVyIGEgZ3JvdXAuICBUaGlzIGNyZWF0ZXMgYSBuZXcgbGFuZ19ncm91cF9zdGF0ZW1lbnQsIGFuZCBzZXRzCi0gICBzdGF0X3B0ciB0byBidWlsZCBuZXcgc3RhdGVtZW50cyB3aXRoaW4gdGhlIGdyb3VwLiAgKi8KLQotdm9pZAotbGFuZ19lbnRlcl9ncm91cCAoKQotewotICBsYW5nX2dyb3VwX3N0YXRlbWVudF90eXBlICpnOwotCi0gIGcgPSBuZXdfc3RhdCAobGFuZ19ncm91cF9zdGF0ZW1lbnQsIHN0YXRfcHRyKTsKLSAgbGFuZ19saXN0X2luaXQgKCZnLT5jaGlsZHJlbik7Ci0gIHN0YXRfcHRyID0gJmctPmNoaWxkcmVuOwotfQotCi0vKiBMZWF2ZSBhIGdyb3VwLiAgVGhpcyBqdXN0IHJlc2V0cyBzdGF0X3B0ciB0byBzdGFydCB3cml0aW5nIHRvIHRoZQotICAgcmVndWxhciBsaXN0IG9mIHN0YXRlbWVudHMgYWdhaW4uICBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCB3b3JrIGlmCi0gICBncm91cHMgY2FuIG9jY3VyIGluc2lkZSBhbnl0aGluZyBlbHNlIHdoaWNoIGNhbiBhZGp1c3Qgc3RhdF9wdHIsCi0gICBidXQgY3VycmVudGx5IHRoZXkgY2FuJ3QuICAqLwotCi12b2lkCi1sYW5nX2xlYXZlX2dyb3VwICgpCi17Ci0gIHN0YXRfcHRyID0gJnN0YXRlbWVudF9saXN0OwotfQotCi0vKiBBZGQgYSBuZXcgcHJvZ3JhbSBoZWFkZXIuICBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCBlbnRyeSBpbiBhIFBIRFJTCi0gICBjb21tYW5kIGluIGEgbGlua2VyIHNjcmlwdC4gICovCi0KLXZvaWQKLWxhbmdfbmV3X3BoZHIgKG5hbWUsIHR5cGUsIGZpbGVoZHIsIHBoZHJzLCBhdCwgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKnR5cGU7Ci0gICAgIGJvb2xlYW4gZmlsZWhkcjsKLSAgICAgYm9vbGVhbiBwaGRyczsKLSAgICAgZXRyZWVfdHlwZSAqYXQ7Ci0gICAgIGV0cmVlX3R5cGUgKmZsYWdzOwotewotICBzdHJ1Y3QgbGFuZ19waGRyICpuLCAqKnBwOwotCi0gIG4gPSAoc3RydWN0IGxhbmdfcGhkciAqKSBzdGF0X2FsbG9jIChzaXplb2YgKHN0cnVjdCBsYW5nX3BoZHIpKTsKLSAgbi0+bmV4dCA9IE5VTEw7Ci0gIG4tPm5hbWUgPSBuYW1lOwotICBuLT50eXBlID0gZXhwX2dldF92YWx1ZV9pbnQgKHR5cGUsIDAsICJwcm9ncmFtIGhlYWRlciB0eXBlIiwKLQkJCSAgICAgICBsYW5nX2ZpbmFsX3BoYXNlX2VudW0pOwotICBuLT5maWxlaGRyID0gZmlsZWhkcjsKLSAgbi0+cGhkcnMgPSBwaGRyczsKLSAgbi0+YXQgPSBhdDsKLSAgbi0+ZmxhZ3MgPSBmbGFnczsKLQotICBmb3IgKHBwID0gJmxhbmdfcGhkcl9saXN0OyAqcHAgIT0gTlVMTDsgcHAgPSAmKCpwcCktPm5leHQpCi0gICAgOwotICAqcHAgPSBuOwotfQotCi0vKiBSZWNvcmQgdGhlIHByb2dyYW0gaGVhZGVyIGluZm9ybWF0aW9uIGluIHRoZSBvdXRwdXQgQkZELiAgRklYTUU6IFdlCi0gICBzaG91bGQgbm90IGJlIGNhbGxpbmcgYW4gRUxGIHNwZWNpZmljIGZ1bmN0aW9uIGhlcmUuICAqLwotCi1zdGF0aWMgdm9pZAotbGFuZ19yZWNvcmRfcGhkcnMgKCkKLXsKLSAgdW5zaWduZWQgaW50IGFsYzsKLSAgYXNlY3Rpb24gKipzZWNzOwotICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKmxhc3Q7Ci0gIHN0cnVjdCBsYW5nX3BoZHIgKmw7Ci0gIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnU7Ci0KLSAgYWxjID0gMTA7Ci0gIHNlY3MgPSAoYXNlY3Rpb24gKiopIHhtYWxsb2MgKGFsYyAqIHNpemVvZiAoYXNlY3Rpb24gKikpOwotICBsYXN0ID0gTlVMTDsKLSAgZm9yIChsID0gbGFuZ19waGRyX2xpc3Q7IGwgIT0gTlVMTDsgbCA9IGwtPm5leHQpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGM7Ci0gICAgICBmbGFnd29yZCBmbGFnczsKLSAgICAgIGJmZF92bWEgYXQ7Ci0KLSAgICAgIGMgPSAwOwotICAgICAgZm9yICh1ID0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQuaGVhZDsKLQkgICB1ICE9IE5VTEw7Ci0JICAgdSA9IHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5uZXh0KQotCXsKLQkgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm9zOwotCSAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwbDsKLQotCSAgb3MgPSAmdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0JICBwbCA9IG9zLT5waGRyczsKLQkgIGlmIChwbCAhPSBOVUxMKQotCSAgICBsYXN0ID0gcGw7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAob3MtPnNlY3R5cGUgPT0gbm9sb2FkX3NlY3Rpb24KLQkJICB8fCBvcy0+YmZkX3NlY3Rpb24gPT0gTlVMTAotCQkgIHx8IChvcy0+YmZkX3NlY3Rpb24tPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotCQljb250aW51ZTsKLQkgICAgICBwbCA9IGxhc3Q7Ci0JICAgIH0KLQotCSAgaWYgKG9zLT5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCSAgICBjb250aW51ZTsKLQotCSAgZm9yICg7IHBsICE9IE5VTEw7IHBsID0gcGwtPm5leHQpCi0JICAgIHsKLQkgICAgICBpZiAoc3RyY21wIChwbC0+bmFtZSwgbC0+bmFtZSkgPT0gMCkKLQkJewotCQkgIGlmIChjID49IGFsYykKLQkJICAgIHsKLQkJICAgICAgYWxjICo9IDI7Ci0JCSAgICAgIHNlY3MgPSAoKGFzZWN0aW9uICoqKQotCQkJICAgICAgeHJlYWxsb2MgKHNlY3MsIGFsYyAqIHNpemVvZiAoYXNlY3Rpb24gKikpKTsKLQkJICAgIH0KLQkJICBzZWNzW2NdID0gb3MtPmJmZF9zZWN0aW9uOwotCQkgICsrYzsKLQkJICBwbC0+dXNlZCA9IHRydWU7Ci0JCX0KLQkgICAgfQotCX0KLQotICAgICAgaWYgKGwtPmZsYWdzID09IE5VTEwpCi0JZmxhZ3MgPSAwOwotICAgICAgZWxzZQotCWZsYWdzID0gZXhwX2dldF92bWEgKGwtPmZsYWdzLCAwLCAicGhkciBmbGFncyIsCi0JCQkgICAgIGxhbmdfZmluYWxfcGhhc2VfZW51bSk7Ci0KLSAgICAgIGlmIChsLT5hdCA9PSBOVUxMKQotCWF0ID0gMDsKLSAgICAgIGVsc2UKLQlhdCA9IGV4cF9nZXRfdm1hIChsLT5hdCwgMCwgInBoZHIgbG9hZCBhZGRyZXNzIiwKLQkJCSAgbGFuZ19maW5hbF9waGFzZV9lbnVtKTsKLQotICAgICAgaWYgKCEgYmZkX3JlY29yZF9waGRyIChvdXRwdXRfYmZkLCBsLT50eXBlLAotCQkJICAgICBsLT5mbGFncyA9PSBOVUxMID8gZmFsc2UgOiB0cnVlLAotCQkJICAgICBmbGFncywKLQkJCSAgICAgbC0+YXQgPT0gTlVMTCA/IGZhbHNlIDogdHJ1ZSwKLQkJCSAgICAgYXQsIGwtPmZpbGVoZHIsIGwtPnBoZHJzLCBjLCBzZWNzKSkKLQllaW5mbyAoXygiJUYlUDogYmZkX3JlY29yZF9waGRyIGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci0KLSAgZnJlZSAoc2Vjcyk7Ci0KLSAgLyogTWFrZSBzdXJlIGFsbCB0aGUgcGhkciBhc3NpZ25tZW50cyBzdWNjZWVkZWQuICAqLwotICBmb3IgKHUgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5oZWFkOwotICAgICAgIHUgIT0gTlVMTDsKLSAgICAgICB1ID0gdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Lm5leHQpCi0gICAgewotICAgICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwbDsKLQotICAgICAgaWYgKHUtPm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudC5iZmRfc2VjdGlvbiA9PSBOVUxMKQotCWNvbnRpbnVlOwotCi0gICAgICBmb3IgKHBsID0gdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50LnBoZHJzOwotCSAgIHBsICE9IE5VTEw7Ci0JICAgcGwgPSBwbC0+bmV4dCkKLQlpZiAoISBwbC0+dXNlZCAmJiBzdHJjbXAgKHBsLT5uYW1lLCAiTk9ORSIpICE9IDApCi0JICBlaW5mbyAoXygiJVglUDogc2VjdGlvbiBgJXMnIGFzc2lnbmVkIHRvIG5vbi1leGlzdGVudCBwaGRyIGAlcydcbiIpLAotCQkgdS0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Lm5hbWUsIHBsLT5uYW1lKTsKLSAgICB9Ci19Ci0KLS8qIFJlY29yZCBhIGxpc3Qgb2Ygc2VjdGlvbnMgd2hpY2ggbWF5IG5vdCBiZSBjcm9zcyByZWZlcmVuY2VkLiAgKi8KLQotdm9pZAotbGFuZ19hZGRfbm9jcm9zc3JlZiAobCkKLSAgICAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbDsKLXsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZnMgKm47Ci0KLSAgbiA9IChzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5uZXh0ID0gbm9jcm9zc3JlZl9saXN0OwotICBuLT5saXN0ID0gbDsKLSAgbm9jcm9zc3JlZl9saXN0ID0gbjsKLQotICAvKiBTZXQgbm90aWNlX2FsbCBzbyB0aGF0IHdlIGdldCBpbmZvcm1lZCBhYm91dCBhbGwgc3ltYm9scy4gICovCi0gIGxpbmtfaW5mby5ub3RpY2VfYWxsID0gdHJ1ZTsKLX0KLQwKLS8qIE92ZXJsYXkgaGFuZGxpbmcuICBXZSBoYW5kbGUgb3ZlcmxheXMgd2l0aCBzb21lIHN0YXRpYyB2YXJpYWJsZXMuICAqLwotCi0vKiBUaGUgb3ZlcmxheSB2aXJ0dWFsIGFkZHJlc3MuICAqLwotc3RhdGljIGV0cmVlX3R5cGUgKm92ZXJsYXlfdm1hOwotCi0vKiBUaGUgb3ZlcmxheSBsb2FkIGFkZHJlc3MuICAqLwotc3RhdGljIGV0cmVlX3R5cGUgKm92ZXJsYXlfbG1hOwotCi0vKiBXaGV0aGVyIG5vY3Jvc3NyZWZzIGlzIHNldCBmb3IgdGhpcyBvdmVybGF5LiAgKi8KLXN0YXRpYyBpbnQgb3ZlcmxheV9ub2Nyb3NzcmVmczsKLQotLyogQW4gZXhwcmVzc2lvbiBmb3IgdGhlIG1heGltdW0gc2VjdGlvbiBzaXplIHNlZW4gc28gZmFyLiAgKi8KLXN0YXRpYyBldHJlZV90eXBlICpvdmVybGF5X21heDsKLQotLyogQSBsaXN0IG9mIGFsbCB0aGUgc2VjdGlvbnMgaW4gdGhpcyBvdmVybGF5LiAgKi8KLQotc3RydWN0IG92ZXJsYXlfbGlzdAotewotICBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpuZXh0OwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpvdmVybGF5X2xpc3Q7Ci0KLS8qIFN0YXJ0IGhhbmRsaW5nIGFuIG92ZXJsYXkuICAqLwotCi12b2lkCi1sYW5nX2VudGVyX292ZXJsYXkgKHZtYV9leHByLCBsbWFfZXhwciwgbm9jcm9zc3JlZnMpCi0gICAgIGV0cmVlX3R5cGUgKnZtYV9leHByOwotICAgICBldHJlZV90eXBlICpsbWFfZXhwcjsKLSAgICAgaW50IG5vY3Jvc3NyZWZzOwotewotICAvKiBUaGUgZ3JhbW1hciBzaG91bGQgcHJldmVudCBuZXN0ZWQgb3ZlcmxheXMgZnJvbSBvY2N1cnJpbmcuICAqLwotICBBU1NFUlQgKG92ZXJsYXlfdm1hID09IE5VTEwKLQkgICYmIG92ZXJsYXlfbG1hID09IE5VTEwKLQkgICYmIG92ZXJsYXlfbGlzdCA9PSBOVUxMCi0JICAmJiBvdmVybGF5X21heCA9PSBOVUxMKTsKLQotICBvdmVybGF5X3ZtYSA9IHZtYV9leHByOwotICBvdmVybGF5X2xtYSA9IGxtYV9leHByOwotICBvdmVybGF5X25vY3Jvc3NyZWZzID0gbm9jcm9zc3JlZnM7Ci19Ci0KLS8qIFN0YXJ0IGEgc2VjdGlvbiBpbiBhbiBvdmVybGF5LiAgV2UgaGFuZGxlIHRoaXMgYnkgY2FsbGluZwotICAgbGFuZ19lbnRlcl9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQgd2l0aCB0aGUgY29ycmVjdCBWTUEgYW5kIExNQS4gICovCi0KLXZvaWQKLWxhbmdfZW50ZXJfb3ZlcmxheV9zZWN0aW9uIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpuOwotICBldHJlZV90eXBlICpzaXplOwotCi0gIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChuYW1lLCBvdmVybGF5X3ZtYSwgbm9ybWFsX3NlY3Rpb24sCi0JCQkJICAgICAgIDAsIDAsIDAsIG92ZXJsYXlfbG1hKTsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBzZWN0aW9uLCB0aGVuIGJhc2UgdGhlIFZNQSBhbmQgTE1BIG9mIGZ1dHVyZQotICAgICBzZWN0aW9ucyBvbiB0aGlzIG9uZS4gIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBldmVuIGlmIGAuJyBpcwotICAgICB1c2VkIGluIHRoZSBhZGRyZXNzZXMuICAqLwotICBpZiAob3ZlcmxheV9saXN0ID09IE5VTEwpCi0gICAgewotICAgICAgb3ZlcmxheV92bWEgPSBleHBfbmFtZW9wIChBRERSLCBuYW1lKTsKLSAgICAgIG92ZXJsYXlfbG1hID0gZXhwX25hbWVvcCAoTE9BREFERFIsIG5hbWUpOwotICAgIH0KLQotICAvKiBSZW1lbWJlciB0aGUgc2VjdGlvbi4gICovCi0gIG4gPSAoc3RydWN0IG92ZXJsYXlfbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKm4pOwotICBuLT5vcyA9IGN1cnJlbnRfc2VjdGlvbjsKLSAgbi0+bmV4dCA9IG92ZXJsYXlfbGlzdDsKLSAgb3ZlcmxheV9saXN0ID0gbjsKLQotICBzaXplID0gZXhwX25hbWVvcCAoU0laRU9GLCBuYW1lKTsKLQotICAvKiBBZGp1c3QgdGhlIExNQSBmb3IgdGhlIG5leHQgc2VjdGlvbi4gICovCi0gIG92ZXJsYXlfbG1hID0gZXhwX2Jpbm9wICgnKycsIG92ZXJsYXlfbG1hLCBzaXplKTsKLQotICAvKiBBcnJhbmdlIHRvIHdvcmsgb3V0IHRoZSBtYXhpbXVtIHNlY3Rpb24gZW5kIGFkZHJlc3MuICAqLwotICBpZiAob3ZlcmxheV9tYXggPT0gTlVMTCkKLSAgICBvdmVybGF5X21heCA9IHNpemU7Ci0gIGVsc2UKLSAgICBvdmVybGF5X21heCA9IGV4cF9iaW5vcCAoTUFYX0ssIG92ZXJsYXlfbWF4LCBzaXplKTsKLX0KLQotLyogRmluaXNoIGEgc2VjdGlvbiBpbiBhbiBvdmVybGF5LiAgVGhlcmUgaXNuJ3QgYW55IHNwZWNpYWwgdG8gZG8KLSAgIGhlcmUuICAqLwotCi12b2lkCi1sYW5nX2xlYXZlX292ZXJsYXlfc2VjdGlvbiAoZmlsbCwgcGhkcnMpCi0gICAgIGJmZF92bWEgZmlsbDsKLSAgICAgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICpwaGRyczsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgY2hhciAqY2xlYW4sICpzMjsKLSAgY29uc3QgY2hhciAqczE7Ci0gIGNoYXIgKmJ1ZjsKLQotICBuYW1lID0gY3VycmVudF9zZWN0aW9uLT5uYW1lOwotCi0gIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChmaWxsLCAiKmRlZmF1bHQqIiwgcGhkcnMpOwotCi0gIC8qIERlZmluZSB0aGUgbWFnaWMgc3ltYm9scy4gICovCi0KLSAgY2xlYW4gPSB4bWFsbG9jIChzdHJsZW4gKG5hbWUpICsgMSk7Ci0gIHMyID0gY2xlYW47Ci0gIGZvciAoczEgPSBuYW1lOyAqczEgIT0gJ1wwJzsgczErKykKLSAgICBpZiAoaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpICpzMSkgfHwgKnMxID09ICdfJykKLSAgICAgICpzMisrID0gKnMxOwotICAqczIgPSAnXDAnOwotCi0gIGJ1ZiA9IHhtYWxsb2MgKHN0cmxlbiAoY2xlYW4pICsgc2l6ZW9mICJfX2xvYWRfc3RhcnRfIik7Ci0gIHNwcmludGYgKGJ1ZiwgIl9fbG9hZF9zdGFydF8lcyIsIGNsZWFuKTsKLSAgbGFuZ19hZGRfYXNzaWdubWVudCAoZXhwX2Fzc29wICgnPScsIGJ1ZiwKLQkJCQkgIGV4cF9uYW1lb3AgKExPQURBRERSLCBuYW1lKSkpOwotCi0gIGJ1ZiA9IHhtYWxsb2MgKHN0cmxlbiAoY2xlYW4pICsgc2l6ZW9mICJfX2xvYWRfc3RvcF8iKTsKLSAgc3ByaW50ZiAoYnVmLCAiX19sb2FkX3N0b3BfJXMiLCBjbGVhbik7Ci0gIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBidWYsCi0JCQkJICBleHBfYmlub3AgKCcrJywKLQkJCQkJICAgICBleHBfbmFtZW9wIChMT0FEQUREUiwgbmFtZSksCi0JCQkJCSAgICAgZXhwX25hbWVvcCAoU0laRU9GLCBuYW1lKSkpKTsKLQotICBmcmVlIChjbGVhbik7Ci19Ci0KLS8qIEZpbmlzaCBhbiBvdmVybGF5LiAgSWYgdGhlcmUgYXJlIGFueSBvdmVybGF5IHdpZGUgc2V0dGluZ3MsIHRoaXMKLSAgIGxvb2tzIHRocm91Z2ggYWxsIHRoZSBzZWN0aW9ucyBpbiB0aGUgb3ZlcmxheSBhbmQgc2V0cyB0aGVtLiAgKi8KLQotdm9pZAotbGFuZ19sZWF2ZV9vdmVybGF5IChmaWxsLCBtZW1zcGVjLCBwaGRycykKLSAgICAgYmZkX3ZtYSBmaWxsOwotICAgICBjb25zdCBjaGFyICptZW1zcGVjOwotICAgICBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKnBoZHJzOwotewotICBsYW5nX21lbW9yeV9yZWdpb25fdHlwZSAqcmVnaW9uOwotICBzdHJ1Y3Qgb3ZlcmxheV9saXN0ICpsOwotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpub2Nyb3NzcmVmOwotCi0gIGlmIChtZW1zcGVjID09IE5VTEwpCi0gICAgcmVnaW9uID0gTlVMTDsKLSAgZWxzZQotICAgIHJlZ2lvbiA9IGxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAgKG1lbXNwZWMpOwotCi0gIG5vY3Jvc3NyZWYgPSBOVUxMOwotCi0gIGwgPSBvdmVybGF5X2xpc3Q7Ci0gIHdoaWxlIChsICE9IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG92ZXJsYXlfbGlzdCAqbmV4dDsKLQotICAgICAgaWYgKGZpbGwgIT0gMCAmJiBsLT5vcy0+ZmlsbCA9PSAwKQotCWwtPm9zLT5maWxsID0gZmlsbDsKLSAgICAgIGlmIChyZWdpb24gIT0gTlVMTCAmJiBsLT5vcy0+cmVnaW9uID09IE5VTEwpCi0JbC0+b3MtPnJlZ2lvbiA9IHJlZ2lvbjsKLSAgICAgIGlmIChwaGRycyAhPSBOVUxMICYmIGwtPm9zLT5waGRycyA9PSBOVUxMKQotCWwtPm9zLT5waGRycyA9IHBoZHJzOwotCi0gICAgICBpZiAob3ZlcmxheV9ub2Nyb3NzcmVmcykKLQl7Ci0JICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICpuYzsKLQotCSAgbmMgPSAoc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqKSB4bWFsbG9jIChzaXplb2YgKm5jKTsKLQkgIG5jLT5uYW1lID0gbC0+b3MtPm5hbWU7Ci0JICBuYy0+bmV4dCA9IG5vY3Jvc3NyZWY7Ci0JICBub2Nyb3NzcmVmID0gbmM7Ci0JfQotCi0gICAgICBuZXh0ID0gbC0+bmV4dDsKLSAgICAgIGZyZWUgKGwpOwotICAgICAgbCA9IG5leHQ7Ci0gICAgfQotCi0gIGlmIChub2Nyb3NzcmVmICE9IE5VTEwpCi0gICAgbGFuZ19hZGRfbm9jcm9zc3JlZiAobm9jcm9zc3JlZik7Ci0KLSAgLyogVXBkYXRlIC4gZm9yIHRoZSBlbmQgb2YgdGhlIG92ZXJsYXkuICAqLwotICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9JywgIi4iLAotCQkJCSAgZXhwX2Jpbm9wICgnKycsIG92ZXJsYXlfdm1hLCBvdmVybGF5X21heCkpKTsKLQotICBvdmVybGF5X3ZtYSA9IE5VTEw7Ci0gIG92ZXJsYXlfbG1hID0gTlVMTDsKLSAgb3ZlcmxheV9ub2Nyb3NzcmVmcyA9IDA7Ci0gIG92ZXJsYXlfbGlzdCA9IE5VTEw7Ci0gIG92ZXJsYXlfbWF4ID0gTlVMTDsKLX0KLQwKLS8qIFZlcnNpb24gaGFuZGxpbmcuICBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciBFTEYuICAqLwotCi0vKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBob2xkcyB0aGUgdmVyc2lvbiB0cmVlIHRoYXQgd2UgYnVpbGQuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKmxhbmdfZWxmX3ZlcnNpb25faW5mbzsKLQotc3RhdGljIGludAotbGFuZ192ZXJzX21hdGNoX2xhbmdfYyAoZXhwciwgc3ltKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmV4cHI7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bTsKLXsKLSAgaWYgKGV4cHItPnBhdHRlcm5bMF0gPT0gJyonICYmIGV4cHItPnBhdHRlcm5bMV0gPT0gJ1wwJykKLSAgICByZXR1cm4gMTsKLSAgcmV0dXJuIGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIHN5bSwgMCkgPT0gMDsKLX0KLQotc3RhdGljIGludAotbGFuZ192ZXJzX21hdGNoX2xhbmdfY3BsdXNwbHVzIChleHByLCBzeW0pCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqZXhwcjsKLSAgICAgY29uc3QgY2hhciAqc3ltOwotewotICBjaGFyICphbHRfc3ltOwotICBpbnQgcmVzdWx0OwotCi0gIGlmIChleHByLT5wYXR0ZXJuWzBdID09ICcqJyAmJiBleHByLT5wYXR0ZXJuWzFdID09ICdcMCcpCi0gICAgcmV0dXJuIDE7Ci0KLSAgYWx0X3N5bSA9IGNwbHVzX2RlbWFuZ2xlKHN5bSwgLyogRE1HTF9OT19UUEFSQU1TICovIDApOwotICBpZiAoIWFsdF9zeW0pCi0gICAgewotICAgICAgLyogY3BsdXNfZGVtYW5nbGUgKGFsc28pIHJldHVybnMgTlVMTCB3aGVuIGl0IGlzIG5vdCBhIEMrKyBzeW1ib2wuCi0JIFNob3VsZCB3ZSBlYXJseSBvdXQgZmFsc2UgaW4gdGhpcyBjYXNlPyAgKi8KLSAgICAgIHJlc3VsdCA9IGZubWF0Y2ggKGV4cHItPnBhdHRlcm4sIHN5bSwgMCkgPT0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBhbHRfc3ltLCAwKSA9PSAwOwotICAgICAgZnJlZSAoYWx0X3N5bSk7Ci0gICAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWxhbmdfdmVyc19tYXRjaF9sYW5nX2phdmEgKGV4cHIsIHN5bSkKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpleHByOwotICAgICBjb25zdCBjaGFyICpzeW07Ci17Ci0gIGNoYXIgKmFsdF9zeW07Ci0gIGludCByZXN1bHQ7Ci0KLSAgaWYgKGV4cHItPnBhdHRlcm5bMF0gPT0gJyonICYmIGV4cHItPnBhdHRlcm5bMV0gPT0gJ1wwJykKLSAgICByZXR1cm4gMTsKLQotICBhbHRfc3ltID0gY3BsdXNfZGVtYW5nbGUoc3ltLCBETUdMX0pBVkEpOwotICBpZiAoIWFsdF9zeW0pCi0gICAgewotICAgICAgLyogY3BsdXNfZGVtYW5nbGUgKGFsc28pIHJldHVybnMgTlVMTCB3aGVuIGl0IGlzIG5vdCBhIEphdmEgc3ltYm9sLgotCSBTaG91bGQgd2UgZWFybHkgb3V0IGZhbHNlIGluIHRoaXMgY2FzZT8gICovCi0gICAgICByZXN1bHQgPSBmbm1hdGNoIChleHByLT5wYXR0ZXJuLCBzeW0sIDApID09IDA7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gZm5tYXRjaCAoZXhwci0+cGF0dGVybiwgYWx0X3N5bSwgMCkgPT0gMDsKLSAgICAgIGZyZWUgKGFsdF9zeW0pOwotICAgIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lIG9yIG1hdGNoIGV4cHJlc3Npb24uICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKgotbGFuZ19uZXdfdmVyc19yZWdleCAob3JpZywgbmV3LCBsYW5nKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKm9yaWc7Ci0gICAgIGNvbnN0IGNoYXIgKm5ldzsKLSAgICAgY29uc3QgY2hhciAqbGFuZzsKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICpyZXQ7Ci0KLSAgcmV0ID0gKHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqKSB4bWFsbG9jIChzaXplb2YgKnJldCk7Ci0gIHJldC0+bmV4dCA9IG9yaWc7Ci0gIHJldC0+cGF0dGVybiA9IG5ldzsKLQotICBpZiAobGFuZyA9PSBOVUxMIHx8IHN0cmNhc2VjbXAgKGxhbmcsICJDIikgPT0gMCkKLSAgICByZXQtPm1hdGNoID0gbGFuZ192ZXJzX21hdGNoX2xhbmdfYzsKLSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobGFuZywgIkMrKyIpID09IDApCi0gICAgcmV0LT5tYXRjaCA9IGxhbmdfdmVyc19tYXRjaF9sYW5nX2NwbHVzcGx1czsKLSAgZWxzZSBpZiAoc3RyY2FzZWNtcCAobGFuZywgIkphdmEiKSA9PSAwKQotICAgIHJldC0+bWF0Y2ggPSBsYW5nX3ZlcnNfbWF0Y2hfbGFuZ19qYXZhOwotICBlbHNlCi0gICAgewotICAgICAgZWluZm8gKF8oIiVYJVA6IHVua25vd24gbGFuZ3VhZ2UgYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iKSwKLQkgICAgIGxhbmcpOwotICAgICAgcmV0LT5tYXRjaCA9IGxhbmdfdmVyc19tYXRjaF9sYW5nX2M7Ci0gICAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGZvciBlYWNoIHNldCBvZiB2YXJpYWJsZSBuYW1lcyBhbmQgbWF0Y2gKLSAgIGV4cHJlc3Npb25zLiAgKi8KLQotc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICoKLWxhbmdfbmV3X3ZlcnNfbm9kZSAoZ2xvYmFscywgbG9jYWxzKQotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmdsb2JhbHM7Ci0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqbG9jYWxzOwotewotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX3RyZWUgKnJldDsKLQotICByZXQgPSAoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgcmV0LT5uZXh0ID0gTlVMTDsKLSAgcmV0LT5uYW1lID0gTlVMTDsKLSAgcmV0LT52ZXJudW0gPSAwOwotICByZXQtPmdsb2JhbHMgPSBnbG9iYWxzOwotICByZXQtPmxvY2FscyA9IGxvY2FsczsKLSAgcmV0LT5kZXBzID0gTlVMTDsKLSAgcmV0LT5uYW1lX2luZHggPSAodW5zaWduZWQgaW50KSAtMTsKLSAgcmV0LT51c2VkID0gMDsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBzdGF0aWMgdmFyaWFibGUga2VlcHMgdHJhY2sgb2YgdmVyc2lvbiBpbmRpY2VzLiAgKi8KLQotc3RhdGljIGludCB2ZXJzaW9uX2luZGV4OwotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIGtub3cgdGhlIG5hbWUgYW5kIGRlcGVuZGVuY2llcyBvZiB0aGUKLSAgIHZlcnNpb24uICAqLwotCi12b2lkCi1sYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZSAobmFtZSwgdmVyc2lvbiwgZGVwcykKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICp2ZXJzaW9uOwotICAgICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKmRlcHM7Ci17Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdCwgKipwcDsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICplMTsKLQotICAvKiBNYWtlIHN1cmUgdGhpcyBub2RlIGhhcyBhIHVuaXF1ZSBuYW1lLiAgKi8KLSAgZm9yICh0ID0gbGFuZ19lbGZfdmVyc2lvbl9pbmZvOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KQotICAgIGlmIChzdHJjbXAgKHQtPm5hbWUsIG5hbWUpID09IDApCi0gICAgICBlaW5mbyAoXygiJVglUDogZHVwbGljYXRlIHZlcnNpb24gdGFnIGAlcydcbiIpLCBuYW1lKTsKLQotICAvKiBDaGVjayB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBtYXRjaCBuYW1lcywgYW5kIG1ha2Ugc3VyZSB0aGVyZQotICAgICBhcmVuJ3QgYW55IGR1cGxpY2F0ZXMuICAqLwotCi0gIGZvciAoZTEgPSB2ZXJzaW9uLT5nbG9iYWxzOyBlMSAhPSBOVUxMOyBlMSA9IGUxLT5uZXh0KQotICAgIHsKLSAgICAgIGZvciAodCA9IGxhbmdfZWxmX3ZlcnNpb25faW5mbzsgdCAhPSBOVUxMOyB0ID0gdC0+bmV4dCkKLQl7Ci0JICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmUyOwotCi0JICBmb3IgKGUyID0gdC0+bG9jYWxzOyBlMiAhPSBOVUxMOyBlMiA9IGUyLT5uZXh0KQotCSAgICBpZiAoc3RyY21wIChlMS0+cGF0dGVybiwgZTItPnBhdHRlcm4pID09IDApCi0JICAgICAgZWluZm8gKF8oIiVYJVA6IGR1cGxpY2F0ZSBleHByZXNzaW9uIGAlcycgaW4gdmVyc2lvbiBpbmZvcm1hdGlvblxuIiksCi0JCSAgICAgZTEtPnBhdHRlcm4pOwotCX0KLSAgICB9Ci0KLSAgZm9yIChlMSA9IHZlcnNpb24tPmxvY2FsczsgZTEgIT0gTlVMTDsgZTEgPSBlMS0+bmV4dCkKLSAgICB7Ci0gICAgICBmb3IgKHQgPSBsYW5nX2VsZl92ZXJzaW9uX2luZm87IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0JewotCSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICplMjsKLQotCSAgZm9yIChlMiA9IHQtPmdsb2JhbHM7IGUyICE9IE5VTEw7IGUyID0gZTItPm5leHQpCi0JICAgIGlmIChzdHJjbXAgKGUxLT5wYXR0ZXJuLCBlMi0+cGF0dGVybikgPT0gMCkKLQkgICAgICBlaW5mbyAoXygiJVglUDogZHVwbGljYXRlIGV4cHJlc3Npb24gYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iKSwKLQkJICAgICBlMS0+cGF0dGVybik7Ci0JfQotICAgIH0KLQotICB2ZXJzaW9uLT5kZXBzID0gZGVwczsKLSAgdmVyc2lvbi0+bmFtZSA9IG5hbWU7Ci0gICsrdmVyc2lvbl9pbmRleDsKLSAgdmVyc2lvbi0+dmVybnVtID0gdmVyc2lvbl9pbmRleDsKLQotICBmb3IgKHBwID0gJmxhbmdfZWxmX3ZlcnNpb25faW5mbzsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0KQotICAgIDsKLSAgKnBwID0gdmVyc2lvbjsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBzZWUgYSB2ZXJzaW9uIGRlcGVuZGVuY3kuICAqLwotCi1zdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKgotbGFuZ19hZGRfdmVyc19kZXBlbmQgKGxpc3QsIG5hbWUpCi0gICAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqbGlzdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpyZXQ7Ci0gIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqdDsKLQotICByZXQgPSAoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICopIHhtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgcmV0LT5uZXh0ID0gbGlzdDsKLQotICBmb3IgKHQgPSBsYW5nX2VsZl92ZXJzaW9uX2luZm87IHQgIT0gTlVMTDsgdCA9IHQtPm5leHQpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAodC0+bmFtZSwgbmFtZSkgPT0gMCkKLQl7Ci0JICByZXQtPnZlcnNpb25fbmVlZGVkID0gdDsKLQkgIHJldHVybiByZXQ7Ci0JfQotICAgIH0KLQotICBlaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIGZpbmQgdmVyc2lvbiBkZXBlbmRlbmN5IGAlcydcbiIpLCBuYW1lKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZAotbGFuZ19kb192ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiAoKQotewotICBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmdyZWcgPSBOVUxMLCAqbHJlZzsKLQotICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAoaXMpCi0gICAgewotICAgICAgYXNlY3Rpb24gKnNlYyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpcy0+dGhlX2JmZCwgIi5leHBvcnRzIik7Ci0gICAgICBjaGFyICpjb250ZW50cywgKnA7Ci0gICAgICBiZmRfc2l6ZV90eXBlIGxlbjsKLQotICAgICAgaWYgKHNlYyA9PSBOVUxMKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgbGVuID0gYmZkX3NlY3Rpb25fc2l6ZSAoaXMtPnRoZV9iZmQsIHNlYyk7Ci0gICAgICBjb250ZW50cyA9IHhtYWxsb2MgKGxlbik7Ci0gICAgICBpZiAoIWJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoaXMtPnRoZV9iZmQsIHNlYywgY29udGVudHMsIDAsIGxlbikpCi0JZWluZm8gKF8oIiVYJVA6IHVuYWJsZSB0byByZWFkIC5leHBvcnRzIHNlY3Rpb24gY29udGVudHMiKSwgc2VjKTsKLQotICAgICAgcCA9IGNvbnRlbnRzOwotICAgICAgd2hpbGUgKHAgPCBjb250ZW50cytsZW4pCi0JewotCSAgZ3JlZyA9IGxhbmdfbmV3X3ZlcnNfcmVnZXggKGdyZWcsIHAsIE5VTEwpOwotCSAgcCA9IHN0cmNociAocCwgJ1wwJykgKyAxOwotCX0KLQotICAgICAgLyogRG8gbm90IGZyZWUgdGhlIGNvbnRlbnRzLCBhcyB3ZSB1c2VkIHRoZW0gY3JlYXRpbmcgdGhlIHJlZ2V4LiAgKi8KLQotICAgICAgLyogRG8gbm90IGluY2x1ZGUgdGhpcyBzZWN0aW9uIGluIHRoZSBsaW5rLiAgKi8KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoaXMtPnRoZV9iZmQsIHNlYywKLQliZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGlzLT50aGVfYmZkLCBzZWMpIHwgU0VDX0VYQ0xVREUpOwotICAgIH0KLQotICBscmVnID0gbGFuZ19uZXdfdmVyc19yZWdleCAoTlVMTCwgIioiLCBOVUxMKTsKLSAgbGFuZ19yZWdpc3Rlcl92ZXJzX25vZGUgKGNvbW1hbmRfbGluZS52ZXJzaW9uX2V4cG9ydHNfc2VjdGlvbiwKLQkJCSAgIGxhbmdfbmV3X3ZlcnNfbm9kZSAoZ3JlZywgbHJlZyksIE5VTEwpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRsYW5nLmggYi9sZC9sZGxhbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2MzkzOC4uMDAwMDAwMAotLS0gYS9sZC9sZGxhbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKiBsZGxhbmcuaCAtIGxpbmtlciBjb21tYW5kIGxhbmd1YWdlIHN1cHBvcnQKLSAgIENvcHlyaWdodCAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0gICAKLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMSwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0gICAKLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gICAKLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLSAgIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTERMQU5HX0gKLSNkZWZpbmUgTERMQU5HX0gKLQotdHlwZWRlZiBlbnVtCi17Ci0gIGxhbmdfaW5wdXRfZmlsZV9pc19sX2VudW0sCi0gIGxhbmdfaW5wdXRfZmlsZV9pc19zeW1ib2xzX29ubHlfZW51bSwKLSAgbGFuZ19pbnB1dF9maWxlX2lzX21hcmtlcl9lbnVtLAotICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotICBsYW5nX2lucHV0X2ZpbGVfaXNfc2VhcmNoX2ZpbGVfZW51bSwKLSAgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bQotfSBsYW5nX2lucHV0X2ZpbGVfZW51bV90eXBlOwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBmaWxsX3R5cGU7Ci10eXBlZGVmIHN0cnVjdCBzdGF0ZW1lbnRfbGlzdAotewotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqaGVhZDsKLSAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKip0YWlsOwotfSBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QKLXsKLSAgY2hhciAqbmFtZTsKLSAgc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpuZXh0OwotICBiZmRfdm1hIG9yaWdpbjsKLSAgYmZkX3NpemVfdHlwZSBsZW5ndGg7Ci0gIGJmZF92bWEgY3VycmVudDsKLSAgYmZkX3NpemVfdHlwZSBvbGRfbGVuZ3RoOwotICBmbGFnd29yZCBmbGFnczsKLSAgZmxhZ3dvcmQgbm90X2ZsYWdzOwotICBib29sZWFuIGhhZF9mdWxsX21lc3NhZ2U7Ci19IGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlIDsKLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3N0cnVjdCAKLXsKLSAgdW5pb24gIGxhbmdfc3RhdGVtZW50X3VuaW9uICAqbmV4dDsKLSAgZW51bSBzdGF0ZW1lbnRfZW51bQotICAgIHsKLSAgICAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19hZGRyZXNzX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0sCi0gICAgICBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19maWxsX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19kYXRhX3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfZW51bSwKLSAgICAgIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9lbnVtLAotICAgICAgbGFuZ19vdXRwdXRfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX3BhZGRpbmdfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2dyb3VwX3N0YXRlbWVudF9lbnVtLAotCi0gICAgICBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X2VudW0sCi0gICAgICBsYW5nX2NvbnN0cnVjdG9yc19zdGF0ZW1lbnRfZW51bQotICAgIH0gdHlwZTsKLX0gbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgCi17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5pb24gZXRyZWVfdW5pb24gKmV4cDsKLX0gbGFuZ19hc3NpZ25tZW50X3N0YXRlbWVudF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IGxhbmdfdGFyZ2V0X3N0YXRlbWVudF9zdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBjb25zdCBjaGFyICp0YXJnZXQ7Ci19IGxhbmdfdGFyZ2V0X3N0YXRlbWVudF90eXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IGxhbmdfb3V0cHV0X3N0YXRlbWVudF9zdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBjb25zdCBjaGFyICpuYW1lOwotfSBsYW5nX291dHB1dF9zdGF0ZW1lbnRfdHlwZTsKLQotLyogU2VjdGlvbiB0eXBlcyBzcGVjaWZpZWQgaW4gYSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotZW51bSBzZWN0aW9uX3R5cGUKLXsKLSAgbm9ybWFsX3NlY3Rpb24sCi0gIGRzZWN0X3NlY3Rpb24sCi0gIGNvcHlfc2VjdGlvbiwKLSAgbm9sb2FkX3NlY3Rpb24sCi0gIGluZm9fc2VjdGlvbiwKLSAgb3ZlcmxheV9zZWN0aW9uCi19OwotCi0vKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhIGxpc3Qgb2YgcHJvZ3JhbSBoZWFkZXJzIGRlc2NyaWJpbmcgc2VnbWVudHMKLSAgIGluIHdoaWNoIHRoaXMgc2VjdGlvbiBzaG91bGQgYmUgcGxhY2VkLiAgKi8KLQotc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0Ci17Ci0gIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgYm9vbGVhbiB1c2VkOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfc3RydWN0IAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIHVuaW9uIGV0cmVlX3VuaW9uICphZGRyX3RyZWU7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjaGlsZHJlbjsKLSAgY29uc3QgY2hhciAqbWVtc3BlYzsKLSAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgYm9vbGVhbiBwcm9jZXNzZWQ7Ci0gICAgCi0gIGFzZWN0aW9uICpiZmRfc2VjdGlvbjsKLSAgZmxhZ3dvcmQgZmxhZ3M7CQkvKiBPciB0b2dldGhlciBvZiBhbGwgaW5wdXQgc2VjdGlvbnMgKi8KLSAgZW51bSBzZWN0aW9uX3R5cGUgc2VjdHlwZTsKLSAgc3RydWN0IG1lbW9yeV9yZWdpb25fc3RydWN0ICpyZWdpb247Ci0gIHNpemVfdCBibG9ja192YWx1ZTsKLSAgZmlsbF90eXBlIGZpbGw7Ci0KLSAgaW50IHN1YnNlY3Rpb25fYWxpZ25tZW50OyAgLyogYWxpZ25tZW50IG9mIGNvbXBvbmVudHMgKi8KLSAgaW50IHNlY3Rpb25fYWxpZ25tZW50OyAgLyogYWxpZ25tZW50IG9mIHN0YXJ0IG9mIHNlY3Rpb24gKi8KLQotICB1bmlvbiBldHJlZV91bmlvbiAqbG9hZF9iYXNlOwotCi0gIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqcGhkcnM7Ci19IGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotfSBsYW5nX2NvbW1vbl9zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotfSBsYW5nX29iamVjdF9zeW1ib2xzX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGZpbGxfdHlwZSBmaWxsOwotICBpbnQgc2l6ZTsKLSAgYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotfSBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgdW5zaWduZWQgaW50IHR5cGU7Ci0gIHVuaW9uICBldHJlZV91bmlvbiAqZXhwOwotICBiZmRfdm1hIHZhbHVlOwotICBhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0gIGJmZF92bWEgb3V0cHV0X3ZtYTsKLX0gbGFuZ19kYXRhX3N0YXRlbWVudF90eXBlOwotCi0vKiBHZW5lcmF0ZSBhIHJlbG9jIGluIHRoZSBvdXRwdXQgZmlsZS4gICovCi0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLQotICAvKiBSZWxvYyB0byBnZW5lcmF0ZS4gICovCi0gIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYzsKLQotICAvKiBSZWxvYyBob3d0byBzdHJ1Y3R1cmUuICAqLwotICByZWxvY19ob3d0b190eXBlICpob3d0bzsKLQotICAvKiBTZWN0aW9uIHRvIGdlbmVyYXRlIHJlbG9jIGFnYWluc3QuICBFeGFjdGx5IG9uZSBvZiBzZWN0aW9uIGFuZAotICAgICBuYW1lIG11c3QgYmUgTlVMTC4gICovCi0gIGFzZWN0aW9uICpzZWN0aW9uOwotCi0gIC8qIE5hbWUgb2Ygc3ltYm9sIHRvIGdlbmVyYXRlIHJlbG9jIGFnYWluc3QuICBFeGFjdGx5IG9uZSBvZiBzZWN0aW9uCi0gICAgIGFuZCBuYW1lIG11c3QgYmUgTlVMTC4gICovCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgLyogRXhwcmVzc2lvbiBmb3IgYWRkZW5kLiAgKi8KLSAgdW5pb24gZXRyZWVfdW5pb24gKmFkZGVuZF9leHA7Ci0KLSAgLyogUmVzb2x2ZWQgYWRkZW5kLiAgKi8KLSAgYmZkX3ZtYSBhZGRlbmRfdmFsdWU7Ci0KLSAgLyogT3V0cHV0IHNlY3Rpb24gd2hlcmUgcmVsb2Mgc2hvdWxkIGJlIHBlcmZvcm1lZC4gICovCi0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLQotICAvKiBWTUEgd2l0aGluIG91dHB1dCBzZWN0aW9uLiAgKi8KLSAgYmZkX3ZtYSBvdXRwdXRfdm1hOwotfSBsYW5nX3JlbG9jX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBsYW5nX2lucHV0X3N0YXRlbWVudF9zdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICAvKiBOYW1lIG9mIHRoaXMgZmlsZS4gICovCi0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICAvKiBOYW1lIHRvIHVzZSBmb3IgdGhlIHN5bWJvbCBnaXZpbmcgYWRkcmVzcyBvZiB0ZXh0IHN0YXJ0ICovCi0gIC8qIFVzdWFsbHkgdGhlIHNhbWUgYXMgZmlsZW5hbWUsIGJ1dCBmb3IgYSBmaWxlIHNwZWMnZCB3aXRoIC1sCi0gICAgIHRoaXMgaXMgdGhlIC1sIHN3aXRjaCBpdHNlbGYgcmF0aGVyIHRoYW4gdGhlIGZpbGVuYW1lLiAgKi8KLSAgY29uc3QgY2hhciAqbG9jYWxfc3ltX25hbWU7Ci0gICAgCi0gIGJmZCAqdGhlX2JmZDsKLSAgICAKLSAgYm9vbGVhbiBjbG9zZWQ7Ci0gIGZpbGVfcHRyIHBhc3NpdmVfcG9zaXRpb247Ci0gICAgCi0gIC8qIFN5bWJvbCB0YWJsZSBvZiB0aGUgZmlsZS4gICovCi0gIGFzeW1ib2wgKiphc3ltYm9sczsKLSAgdW5zaWduZWQgaW50IHN5bWJvbF9jb3VudDsKLSAgICAKLSAgLyogUG9pbnQgdG8gdGhlIG5leHQgZmlsZSAtIHdoYXRldmVyIGl0IGlzLCB3YW5kZXJzIHVwIGFuZCBkb3duCi0gICAgIGFyY2hpdmVzICovCi0gICAgCi0gIHVuaW9uIGxhbmdfc3RhdGVtZW50X3VuaW9uICAqbmV4dDsKLSAgLyogUG9pbnQgdG8gdGhlIG5leHQgZmlsZSwgYnV0IHNraXBzIGFyY2hpdmUgY29udGVudHMgKi8KLSAgdW5pb24gIGxhbmdfc3RhdGVtZW50X3VuaW9uICAqbmV4dF9yZWFsX2ZpbGU7Ci0gICAgCi0gIGJvb2xlYW4gaXNfYXJjaGl2ZTsKLSAgICAKLSAgLyogMSBtZWFucyBzZWFyY2ggYSBzZXQgb2YgZGlyZWN0b3JpZXMgZm9yIHRoaXMgZmlsZS4gICovCi0gIGJvb2xlYW4gc2VhcmNoX2RpcnNfZmxhZzsKLSAgICAKLSAgLyogMSBtZWFucyB0aGlzIGlzIGJhc2UgZmlsZSBvZiBpbmNyZW1lbnRhbCBsb2FkLgotICAgICBEbyBub3QgbG9hZCB0aGlzIGZpbGUncyB0ZXh0IG9yIGRhdGEuCi0gICAgIEFsc28gZGVmYXVsdCB0ZXh0X3N0YXJ0IHRvIGFmdGVyIHRoaXMgZmlsZSdzIGJzcy4gKi8KLSAgICAKLSAgYm9vbGVhbiBqdXN0X3N5bXNfZmxhZzsKLQotICAvKiBXaGV0aGVyIHRvIHNlYXJjaCBmb3IgdGhpcyBlbnRyeSBhcyBhIGR5bmFtaWMgYXJjaGl2ZS4gICovCi0gIGJvb2xlYW4gZHluYW1pYzsKLQotICAvKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGVudGlyZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlLiAgKi8KLSAgYm9vbGVhbiB3aG9sZV9hcmNoaXZlOwotCi0gIGJvb2xlYW4gbG9hZGVkOwotICAgIAotICAvKiAgICB1bnNpZ25lZCBpbnQgZ2xvYmFsc19pbl90aGlzX2ZpbGU7Ki8KLSAgY29uc3QgY2hhciAqdGFyZ2V0OwotICBib29sZWFuIHJlYWw7Ci19IGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGU7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gIGxhbmdfc3RhdGVtZW50X2hlYWRlcl90eXBlIGhlYWRlcjsKLSAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlmaWxlOwotICAKLX0gbGFuZ19pbnB1dF9zZWN0aW9uX3R5cGU7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKmZpbGU7Ci19IGxhbmdfYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgbGFuZ193aWxkX3N0YXRlbWVudF9zdHJ1Y3QKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICBjb25zdCBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIGJvb2xlYW4gc2VjdGlvbnNfc29ydGVkOwotICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgYm9vbGVhbiBmaWxlbmFtZXNfc29ydGVkOwotICBib29sZWFuIGtlZXBfc2VjdGlvbnM7Ci0gIGNvbnN0IGNoYXIgKmV4Y2x1ZGVfZmlsZW5hbWU7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjaGlsZHJlbjsKLX0gbGFuZ193aWxkX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdCBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3N0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGNvbnN0ICBjaGFyICpzZWN0aW9uX25hbWU7Ci0gIHVuaW9uICBldHJlZV91bmlvbiAqYWRkcmVzczsKLX0gbGFuZ19hZGRyZXNzX3N0YXRlbWVudF90eXBlOwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGJmZF92bWEgb3V0cHV0X29mZnNldDsKLSAgc2l6ZV90IHNpemU7Ci0gIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbjsKLSAgZmlsbF90eXBlIGZpbGw7Ci19IGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZTsKLQotLyogQSBncm91cCBzdGF0ZW1lbnQgY29sbGVjdHMgYSBzZXQgb2YgbGlicmFyaWVzIHRvZ2V0aGVyLiAgVGhlCi0gICBsaWJyYXJpZXMgYXJlIHNlYXJjaGVkIG11bHRpcGxlIHRpbWVzLCB1bnRpbCBubyBuZXcgdW5kZWZpbmVkCi0gICBzeW1ib2xzIGFyZSBmb3VuZC4gIFRoZSBlZmZlY3QgaXMgdG8gc2VhcmNoIGEgZ3JvdXAgb2YgbGlicmFyaWVzIGFzCi0gICB0aG91Z2ggdGhleSB3ZXJlIGEgc2luZ2xlIGxpYnJhcnkuICAqLwotCi10eXBlZGVmIHN0cnVjdAotewotICBsYW5nX3N0YXRlbWVudF9oZWFkZXJfdHlwZSBoZWFkZXI7Ci0gIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBjaGlsZHJlbjsKLX0gbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZTsKLQotdHlwZWRlZiB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAKLXsKLSAgbGFuZ19zdGF0ZW1lbnRfaGVhZGVyX3R5cGUgaGVhZGVyOwotICB1bmlvbiBsYW5nX3N0YXRlbWVudF91bmlvbiAqbmV4dDsKLSAgbGFuZ193aWxkX3N0YXRlbWVudF90eXBlIHdpbGRfc3RhdGVtZW50OwotICBsYW5nX2RhdGFfc3RhdGVtZW50X3R5cGUgZGF0YV9zdGF0ZW1lbnQ7Ci0gIGxhbmdfcmVsb2Nfc3RhdGVtZW50X3R5cGUgcmVsb2Nfc3RhdGVtZW50OwotICBsYW5nX2FkZHJlc3Nfc3RhdGVtZW50X3R5cGUgYWRkcmVzc19zdGF0ZW1lbnQ7Ci0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotICBsYW5nX2FmaWxlX2FzZWN0aW9uX3BhaXJfc3RhdGVtZW50X3R5cGUgYWZpbGVfYXNlY3Rpb25fcGFpcl9zdGF0ZW1lbnQ7Ci0gIGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfdHlwZSBhc3NpZ25tZW50X3N0YXRlbWVudDsKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSBpbnB1dF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfdGFyZ2V0X3N0YXRlbWVudF90eXBlIHRhcmdldF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfb3V0cHV0X3N0YXRlbWVudF90eXBlIG91dHB1dF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlIGlucHV0X3NlY3Rpb247Ci0gIGxhbmdfY29tbW9uX3N0YXRlbWVudF90eXBlIGNvbW1vbl9zdGF0ZW1lbnQ7Ci0gIGxhbmdfb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50X3R5cGUgb2JqZWN0X3N5bWJvbHNfc3RhdGVtZW50OwotICBsYW5nX2ZpbGxfc3RhdGVtZW50X3R5cGUgZmlsbF9zdGF0ZW1lbnQ7Ci0gIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfdHlwZSBwYWRkaW5nX3N0YXRlbWVudDsKLSAgbGFuZ19ncm91cF9zdGF0ZW1lbnRfdHlwZSBncm91cF9zdGF0ZW1lbnQ7Ci19IGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGU7Ci0KLS8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvZ3JhbSBoZWFkZXIsIGZyb20gdGhlCi0gICBQSERSUyBjb21tYW5kIGluIHRoZSBsaW5rZXIgc2NyaXB0LiAgKi8KLQotc3RydWN0IGxhbmdfcGhkcgotewotICBzdHJ1Y3QgbGFuZ19waGRyICpuZXh0OwotICBjb25zdCBjaGFyICpuYW1lOwotICB1bnNpZ25lZCBsb25nIHR5cGU7Ci0gIGJvb2xlYW4gZmlsZWhkcjsKLSAgYm9vbGVhbiBwaGRyczsKLSAgZXRyZWVfdHlwZSAqYXQ7Ci0gIGV0cmVlX3R5cGUgKmZsYWdzOwotfTsKLQotLyogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIGEgbGlzdCBvZiBzZWN0aW9ucyB3aGljaCBtYXkgbm90Ci0gICBjcm9zcyByZWZlcmVuY2UgZWFjaCBvdGhlci4gICovCi0KLXN0cnVjdCBsYW5nX25vY3Jvc3NyZWYKLXsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbmV4dDsKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLS8qIFRoZSBsaXN0IG9mIG5vY3Jvc3NyZWYgbGlzdHMuICAqLwotCi1zdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcwotewotICBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbmV4dDsKLSAgc3RydWN0IGxhbmdfbm9jcm9zc3JlZiAqbGlzdDsKLX07Ci0KLWV4dGVybiBzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmcyAqbm9jcm9zc3JlZl9saXN0OwotCi1leHRlcm4gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqYWJzX291dHB1dF9zZWN0aW9uOwotZXh0ZXJuIGJvb2xlYW4gbGFuZ19oYXNfaW5wdXRfZmlsZTsKLWV4dGVybiBldHJlZV90eXBlICpiYXNlOwotZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqc3RhdF9wdHI7Ci1leHRlcm4gYm9vbGVhbiBkZWxldGVfb3V0cHV0X2ZpbGVfb25fZmFpbHVyZTsKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmVudHJ5X3N5bWJvbDsKLWV4dGVybiBib29sZWFuIGVudHJ5X2Zyb21fY21kbGluZTsKLQotZXh0ZXJuIHZvaWQgbGFuZ19pbml0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QgKmxhbmdfbWVtb3J5X3JlZ2lvbl9sb29rdXAKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqY29uc3QpKTsKLWV4dGVybiBzdHJ1Y3QgbWVtb3J5X3JlZ2lvbl9zdHJ1Y3QgKmxhbmdfbWVtb3J5X3JlZ2lvbl9kZWZhdWx0Ci0gIFBBUkFNUyAoKGFzZWN0aW9uICopKTsKLWV4dGVybiB2b2lkIGxhbmdfbWFwIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxhbmdfc2V0X2ZsYWdzIFBBUkFNUyAoKGxhbmdfbWVtb3J5X3JlZ2lvbl90eXBlICosIGNvbnN0IGNoYXIgKiwKLQkJCQkgICAgaW50KSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9vdXRwdXQgUEFSQU1TICgoY29uc3QgY2hhciAqLCBpbnQgZnJvbV9zY3JpcHQpKTsKLWV4dGVybiB2b2lkIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9uYW1lLAotCSAgIGV0cmVlX3R5cGUgKiBhZGRyZXNzX2V4cCwKLQkgICBlbnVtIHNlY3Rpb25fdHlwZSBzZWN0eXBlLAotCSAgIGJmZF92bWEgYmxvY2tfdmFsdWUsCi0JICAgZXRyZWVfdHlwZSAqYWxpZ24sCi0JICAgZXRyZWVfdHlwZSAqc3ViYWxpZ24sCi0JICAgZXRyZWVfdHlwZSAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2ZpbmFsIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxhbmdfcHJvY2VzcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3NlY3Rpb25fc3RhcnQgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bmlvbiBldHJlZV91bmlvbiAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9lbnRyeSBQQVJBTVMgKChjb25zdCBjaGFyICosIGJvb2xlYW4pKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX3RhcmdldCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX3dpbGQKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuLCBjb25zdCBjaGFyICosIGJvb2xlYW4sIGJvb2xlYW4sIGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfbWFwIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfZmlsbCBQQVJBTVMgKChpbnQpKTsKLWV4dGVybiBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X3R5cGUgKiBsYW5nX2FkZF9hc3NpZ25tZW50IFBBUkFNUyAoKHVuaW9uIGV0cmVlX3VuaW9uICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX2F0dHJpYnV0ZSBQQVJBTVMgKChlbnVtIHN0YXRlbWVudF9lbnVtKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3N0YXJ0dXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2Zsb2F0IFBBUkFNUyAoKGVudW0gYmZkX2Jvb2xlYW4pKTsKLWV4dGVybiB2b2lkIGxhbmdfbGVhdmVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50Ci0gIFBBUkFNUyAoKGJmZF92bWEsIGNvbnN0IGNoYXIgKiwgc3RydWN0IGxhbmdfb3V0cHV0X3NlY3Rpb25fcGhkcl9saXN0ICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWJzX3N5bWJvbF9hdF9lbmRfb2YgUEFSQU1TICgoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWJzX3N5bWJvbF9hdF9iZWdpbm5pbmdfb2YgUEFSQU1TICgoY29uc3QgY2hhciAqLAotCQkJCQkJICAgICBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfc3RhdGVtZW50X2FwcGVuZCBQQVJBTVMgKChzdHJ1Y3Qgc3RhdGVtZW50X2xpc3QgKiwKLQkJCQkJICAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKiwKLQkJCQkJICAgdW5pb24gbGFuZ19zdGF0ZW1lbnRfdW5pb24gKiopKTsKLWV4dGVybiB2b2lkIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZQotICBQQVJBTVMgKCh2b2lkICgqZG90aGlzKSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSkpOwotZXh0ZXJuIHZvaWQgbGFuZ19mb3JfZWFjaF9maWxlCi0gIFBBUkFNUyAoKHZvaWQgKCpkb3RoaXMpIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopKSk7Ci1leHRlcm4gYmZkX3ZtYSBsYW5nX2RvX2Fzc2lnbm1lbnRzCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiBzLAotCSAgIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKm91dHB1dF9zZWN0aW9uX3N0YXRlbWVudCwKLQkgICBmaWxsX3R5cGUgZmlsbCwKLQkgICBiZmRfdm1hIGRvdCkpOwotCi0jZGVmaW5lIExBTkdfRk9SX0VBQ0hfSU5QVVRfU1RBVEVNRU5UKHN0YXRlbWVudCkJCVwKLSAgZXh0ZXJuIGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSBmaWxlX2NoYWluOwkJCVwKLSAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqc3RhdGVtZW50OwkJCQlcCi0gIGZvciAoc3RhdGVtZW50ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKilmaWxlX2NoYWluLmhlYWQ7XAotICAgICAgIHN0YXRlbWVudCAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKU5VTEw7CQlcCi0gICAgICAgc3RhdGVtZW50ID0gKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKilzdGF0ZW1lbnQtPm5leHQpXAotICAKLWV4dGVybiB2b2lkIGxhbmdfcHJvY2VzcyBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxhbmdfYWRkX2ZpbGUgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1leHRlcm4gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqbGFuZ19vdXRwdXRfc2VjdGlvbl9maW5kCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiBjb25zdCkpOwotZXh0ZXJuIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmxhbmdfYWRkX2lucHV0X2ZpbGUKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgbGFuZ19pbnB1dF9maWxlX2VudW1fdHlwZSBmaWxlX3R5cGUsCi0JICAgY29uc3QgY2hhciAqdGFyZ2V0KSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9rZWVwc3ltc19maWxlIFBBUkFNUyAoKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSk7Ci1leHRlcm4gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqCi0gIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X2xvb2t1cCBQQVJBTVMgKChjb25zdCBjaGFyICogY29uc3QgbmFtZSkpOwotZXh0ZXJuIHZvaWQgbGRsYW5nX2FkZF91bmRlZiBQQVJBTVMgKChjb25zdCBjaGFyICpjb25zdCBuYW1lKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAotCQkJCQkgICAgY29uc3QgY2hhciAqLCBpbnQgZnJvbV9zY3JpcHQpKTsKLWV4dGVybiB2b2lkIGxhbmdfbGlzdF9pbml0IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX2RhdGEgUEFSQU1TICgoaW50IHR5cGUsIHVuaW9uIGV0cmVlX3VuaW9uICopKTsKLWV4dGVybiB2b2lkIGxhbmdfYWRkX3JlbG9jCi0gIFBBUkFNUyAoKGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSByZWxvYywgcmVsb2NfaG93dG9fdHlwZSAqaG93dG8sCi0JICAgYXNlY3Rpb24gKnNlY3Rpb24sIGNvbnN0IGNoYXIgKm5hbWUsIHVuaW9uIGV0cmVlX3VuaW9uICphZGRlbmQpKTsKLWV4dGVybiB2b2lkIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50Ci0gIFBBUkFNUyAoKHZvaWQgKCpmdW5jKSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSkpOwotZXh0ZXJuIFBUUiBzdGF0X2FsbG9jIFBBUkFNUyAoKHNpemVfdCBzaXplKSk7Ci1leHRlcm4gdm9pZCBkcHJpbnRfc3RhdGVtZW50IFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKiwgaW50KSk7Ci1leHRlcm4gYmZkX3ZtYSBsYW5nX3NpemVfc2VjdGlvbnMKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqcywKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQsCi0JICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnByZXYsIGZpbGxfdHlwZSBmaWxsLAotCSAgIGJmZF92bWEgZG90LCBib29sZWFuIHJlbGF4KSk7Ci1leHRlcm4gdm9pZCBsYW5nX2VudGVyX2dyb3VwIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxhbmdfbGVhdmVfZ3JvdXAgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgd2lsZF9kb2l0Ci0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X2xpc3RfdHlwZSAqcHRyLCBhc2VjdGlvbiAqc2VjdGlvbiwKLQkgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvdXRwdXQsCi0JICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZmlsZSkpOwotZXh0ZXJuIHZvaWQgbGFuZ19uZXdfcGhkcgotICBQQVJBTVMgKChjb25zdCBjaGFyICosIGV0cmVlX3R5cGUgKiwgYm9vbGVhbiwgYm9vbGVhbiwgZXRyZWVfdHlwZSAqLAotCSAgIGV0cmVlX3R5cGUgKikpOwotZXh0ZXJuIHZvaWQgbGFuZ19hZGRfbm9jcm9zc3JlZiBQQVJBTVMgKChzdHJ1Y3QgbGFuZ19ub2Nyb3NzcmVmICopKTsKLWV4dGVybiB2b2lkIGxhbmdfZW50ZXJfb3ZlcmxheSBQQVJBTVMgKChldHJlZV90eXBlICosIGV0cmVlX3R5cGUgKiwgaW50KSk7Ci1leHRlcm4gdm9pZCBsYW5nX2VudGVyX292ZXJsYXlfc2VjdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxhbmdfbGVhdmVfb3ZlcmxheV9zZWN0aW9uCi0gIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBsYW5nX291dHB1dF9zZWN0aW9uX3BoZHJfbGlzdCAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX2xlYXZlX292ZXJsYXkKLSAgUEFSQU1TICgoYmZkX3ZtYSwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikpOwotCi1leHRlcm4gc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpsYW5nX2VsZl92ZXJzaW9uX2luZm87Ci0KLWV4dGVybiBzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2V4cHIgKmxhbmdfbmV3X3ZlcnNfcmVnZXgKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9lbGZfdmVyc2lvbl90cmVlICpsYW5nX25ld192ZXJzX25vZGUKLSAgUEFSQU1TICgoc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9leHByICosIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZXhwciAqKSk7Ci1leHRlcm4gc3RydWN0IGJmZF9lbGZfdmVyc2lvbl9kZXBzICpsYW5nX2FkZF92ZXJzX2RlcGVuZAotICBQQVJBTVMgKChzdHJ1Y3QgYmZkX2VsZl92ZXJzaW9uX2RlcHMgKiwgY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBsYW5nX3JlZ2lzdGVyX3ZlcnNfbm9kZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fdHJlZSAqLAotCSAgIHN0cnVjdCBiZmRfZWxmX3ZlcnNpb25fZGVwcyAqKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGRsZXguaCBiL2xkL2xkbGV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNDQ0Y2EuLjAwMDAwMDAKLS0tIGEvbGQvbGRsZXguaAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qIGxkbGV4LmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExETEVYX0gKLSNkZWZpbmUgTERMRVhfSAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyogVGhlIGluaXRpYWwgcGFyc2VyIHN0YXRlcy4gICovCi10eXBlZGVmIGVudW0gaW5wdXRfZW51bSB7Ci0gIGlucHV0X3NlbGVjdGVkLAkJLyogV2UndmUgc2V0IHRoZSBpbml0aWFsIHN0YXRlLiAgKi8KLSAgaW5wdXRfc2NyaXB0LAotICBpbnB1dF9tcmlfc2NyaXB0LAotICBpbnB1dF92ZXJzaW9uX3NjcmlwdCwKLSAgaW5wdXRfZGVmc3ltCi19IGlucHV0X3R5cGU7Ci0KLWV4dGVybiBpbnB1dF90eXBlIHBhcnNlcl9pbnB1dDsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBsaW5lbm87Ci1leHRlcm4gY29uc3QgY2hhciAqbGV4X3N0cmluZzsKLQotLyogSW4gbGRsZXgubC4gICovCi1leHRlcm4gaW50IHl5bGV4IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxleF9wdXNoX2ZpbGUgUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxleF9yZWRpcmVjdCBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiB2b2lkIGxkbGV4X3NjcmlwdCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9tcmlfc2NyaXB0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X3ZlcnNpb25fc2NyaXB0IFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X3ZlcnNpb25fZmlsZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9kZWZzeW0gUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfZXhwcmVzc2lvbiBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZGxleF9ib3RoIFBBUkFNUyAoKHZvaWQpKTsKLWV4dGVybiB2b2lkIGxkbGV4X2NvbW1hbmQgUEFSQU1TICgodm9pZCkpOwotZXh0ZXJuIHZvaWQgbGRsZXhfcG9wc3RhdGUgUEFSQU1TICgodm9pZCkpOwotCi0vKiBJbiBsZXhzdXAuYy4gICovCi1leHRlcm4gaW50IGxleF9pbnB1dCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBsZXhfdW5wdXQgUEFSQU1TICgoaW50KSk7Ci0jaWZuZGVmIHl5d3JhcAotZXh0ZXJuIGludCB5eXdyYXAgUEFSQU1TICgodm9pZCkpOwotI2VuZGlmCi1leHRlcm4gdm9pZCBwYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkbGV4LmwgYi9sZC9sZGxleC5sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVmODBmLi4wMDAwMDAwCi0tLSBhL2xkL2xkbGV4LmwKKysrIC9kZXYvbnVsbApAQCAtMSw2NjIgKzAsMCBAQAotJXsKLQotLyogQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qCi1UaGlzIHdhcyB3cml0dGVuIGJ5IHN0ZXZlIGNoYW1iZXJsYWluCi0gICAgICAgICAgICAgICAgICAgIHNhY0BjeWdudXMuY29tCi0qLwotCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIE1QVwotLyogUHJldmVudCBlbnVtIHJlZGVmaW5pdGlvbiBwcm9ibGVtcy4gKi8KLSNkZWZpbmUgVFJVRV9GQUxTRV9BTFJFQURZX0RFRklORUQKLSNlbmRpZiAvKiBNUFcgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi0vKiBUaGUgdHlwZSBvZiB0b3AtbGV2ZWwgcGFyc2VyIGlucHV0LgotICAgeXlsZXggYW5kIHl5cGFyc2UgKGluZGlyZWN0bHkpIGJvdGggY2hlY2sgdGhpcy4gICovCi1pbnB1dF90eXBlIHBhcnNlcl9pbnB1dDsKLQotLyogTGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgaW5wdXQgZmlsZS4KLSAgIChGSVhNRSBBY3R1YWxseSwgaXQgZG9lc24ndCBhcHBlYXIgdG8gZ2V0IHJlc2V0IGZvciBlYWNoIGZpbGU/KSAgKi8KLXVuc2lnbmVkIGludCBsaW5lbm8gPSAxOwotCi0vKiBUaGUgc3RyaW5nIHdlIGFyZSBjdXJyZW50bHkgbGV4aW5nLCBvciBOVUxMIGlmIHdlIGFyZSByZWFkaW5nIGEKLSAgIGZpbGUuICAqLwotY29uc3QgY2hhciAqbGV4X3N0cmluZyA9IE5VTEw7Ci0KLS8qIFN1cHBvcnQgZm9yIGZsZXggcmVhZGluZyBmcm9tIG1vcmUgdGhhbiBvbmUgaW5wdXQgZmlsZSAoc3RyZWFtKS4KLSAgIGBpbmNsdWRlX3N0YWNrJyBpcyBmbGV4J3MgaW5wdXQgc3RhdGUgZm9yIGVhY2ggb3BlbiBmaWxlOwotICAgYGZpbGVfbmFtZV9zdGFjaycgaXMgdGhlIGZpbGUgbmFtZXMuICBgbGluZW5vX3N0YWNrJyBpcyB0aGUgY3VycmVudAotICAgbGluZSBudW1iZXJzLgotCi0gICBJZiBgaW5jbHVkZV9zdGFja19wdHInIGlzIDAsIHdlIGhhdmVuJ3Qgc3RhcnRlZCByZWFkaW5nIGFueXRoaW5nIHlldC4KLSAgIE90aGVyd2lzZSwgc3RhY2sgZWxlbWVudHMgMCB0aHJvdWdoIGBpbmNsdWRlX3N0YWNrX3B0ciAtIDEnIGFyZSB2YWxpZC4gICovCi0KLSN1bmRlZiBZWV9JTlBVVAotI2RlZmluZSBZWV9JTlBVVChidWYscmVzdWx0LG1heF9zaXplKSB5eV9pbnB1dChidWYsICZyZXN1bHQsIG1heF9zaXplKQotCi0jZGVmaW5lIE1BWF9JTkNMVURFX0RFUFRIIDEwCi1zdGF0aWMgWVlfQlVGRkVSX1NUQVRFIGluY2x1ZGVfc3RhY2tbTUFYX0lOQ0xVREVfREVQVEhdOwotc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVfbmFtZV9zdGFja1tNQVhfSU5DTFVERV9ERVBUSF07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGxpbmVub19zdGFja1tNQVhfSU5DTFVERV9ERVBUSF07Ci1zdGF0aWMgdW5zaWduZWQgaW50IGluY2x1ZGVfc3RhY2tfcHRyID0gMDsKLXN0YXRpYyBpbnQgdmVyc19ub2RlX25lc3RpbmcgPSAwOwotCi1zdGF0aWMgWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKnN0cmluZywKLQkJCQkJCQlzaXplX3Qgc2l6ZSkpOwotc3RhdGljIHZvaWQgeXlfaW5wdXQgUEFSQU1TICgoY2hhciAqLCBpbnQgKnJlc3VsdCwgaW50IG1heF9zaXplKSk7Ci0KLXN0YXRpYyB2b2lkIGNvbW1lbnQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgbGV4X3dhcm5faW52YWxpZCBQQVJBTVMgKChjaGFyICp3aGVyZSwgY2hhciAqd2hhdCkpOwotCi0vKiBTVEFURVMgCi0JRVhQUkVTU0lPTglkZWZpbml0ZWx5IGluIGFuIGV4cHJlc3Npb24KLQlTQ1JJUFQJCWRlZmluaXRlbHkgaW4gYSBzY3JpcHQKLQlCT1RICQllaXRoZXIgRVhQUkVTU0lPTiBvciBTQ1JJUFQKLQlERUZTWU1FWFAJaW4gYW4gYXJndW1lbnQgdG8gLWRlZnN5bQotICAgICAgICBNUkkgICAgICAgICAgICAgaW4gYW4gTVJJIHNjcmlwdAotCVZFUlNfU1RBUlQJc3RhcnRpbmcgYSBTdW4gc3R5bGUgbWFwZmlsZQotCVZFUlNfU0NSSVBUCWEgU3VuIHN0eWxlIG1hcGZpbGUKLQlWRVJTX05PREUJYSBub2RlIHdpdGhpbiBhIFN1biBzdHlsZSBtYXBmaWxlCi0qLwotI2RlZmluZSBSVE9LRU4oeCkgIHsgIHl5bHZhbC50b2tlbiA9IHg7IHJldHVybiB4OyB9Ci0KLS8qIFNvbWUgdmVyc2lvbnMgb2YgZmxleCB3YW50IHRoaXMuICAqLwotI2lmbmRlZiB5eXdyYXAKLWludCB5eXdyYXAgKCkgeyByZXR1cm4gMTsgfQotI2VuZGlmCi0lfQotCi0lYSA0MDAwCi0lbyA1MDAwCi0KLUNNREZJTEVOQU1FQ0hBUiAgIFtfYS16QS1aMC05XC9cLlxcX1wrXCRcOlxbXF1cXFwsXD1cJlwhXDxcPlwtXH5dCi1DTURGSUxFTkFNRUNIQVIxICBbX2EtekEtWjAtOVwvXC5cXF9cK1wkXDpcW1xdXFxcLFw9XCZcIVw8XD5cfl0KLUZJTEVOQU1FQ0hBUjEJW19hLXpBLVpcL1wuXFxcJFxfXH5dCi1TWU1CT0xDSEFSTiAgICAgW19hLXpBLVpcL1wuXFxcJFxfXH4wLTldCi1GSUxFTkFNRUNIQVIJW19hLXpBLVowLTlcL1wuXC1cX1wrXD1cJFw6XFtcXVxcXCxcfl0KLVdJTERDSEFSCVtfYS16QS1aMC05XC9cLlwtXF9cK1w9XCRcOlxbXF1cXFwsXH5cP1wqXQotV0hJVEUJCVsgXHRcblxyXSsgCi0KLU5PQ0ZJTEVOQU1FQ0hBUglbX2EtekEtWjAtOVwvXC5cLVxfXCtcJFw6XFtcXVxcXH5dCi0KLVZfVEFHIFsuJF9hLXpBLVpdWy5fYS16QS1aMC05XSoKLVZfSURFTlRJRklFUiBbKj8uJF9hLXpBLVpdWyo/LiRfYS16QS1aMC05XSoKLQotJXMgU0NSSVBUCi0lcyBFWFBSRVNTSU9OCi0lcyBCT1RICi0lcyBERUZTWU1FWFAKLSVzIE1SSQotJXMgVkVSU19TVEFSVAotJXMgVkVSU19TQ1JJUFQKLSVzIFZFUlNfTk9ERQotJSUKLQotICBpZiAocGFyc2VyX2lucHV0ICE9IGlucHV0X3NlbGVjdGVkKQotICAgIHsKLSAgICAgIC8qIFRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgaW5wdXQgZGV0ZXJtaW5lcyB0aGUgaW5pdGlhbCBwYXJzZXIgc3RhdGUuICAqLwotICAgICAgaW5wdXRfdHlwZSB0ID0gcGFyc2VyX2lucHV0OwotICAgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfc2VsZWN0ZWQ7Ci0gICAgICBzd2l0Y2ggKHQpCi0JewotCWNhc2UgaW5wdXRfc2NyaXB0OiByZXR1cm4gSU5QVVRfU0NSSVBUOyBicmVhazsKLQljYXNlIGlucHV0X21yaV9zY3JpcHQ6IHJldHVybiBJTlBVVF9NUklfU0NSSVBUOyBicmVhazsKLQljYXNlIGlucHV0X3ZlcnNpb25fc2NyaXB0OiByZXR1cm4gSU5QVVRfVkVSU0lPTl9TQ1JJUFQ7IGJyZWFrOwotCWNhc2UgaW5wdXRfZGVmc3ltOiByZXR1cm4gSU5QVVRfREVGU1lNOyBicmVhazsKLQlkZWZhdWx0OiBhYm9ydCAoKTsKLQl9Ci0gICAgfQotCi08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTj4iLyoiCXsgY29tbWVudCgpOyB9Ci0KLQotPERFRlNZTUVYUD4iLSIgICAgICAgICAgICAgICAgICB7IFJUT0tFTignLScpO30KLTxERUZTWU1FWFA+IisiICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oJysnKTt9Ci08REVGU1lNRVhQPntGSUxFTkFNRUNIQVIxfXtTWU1CT0xDSEFSTn0qICAgeyB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOyByZXR1cm4gTkFNRTsgfQotPERFRlNZTUVYUD4iPSIgICAgICAgICAgICAgICAgICB7IFJUT0tFTignPScpOyB9Ci0KLTxNUkksRVhQUkVTU0lPTj4iJCIoWzAtOUEtRmEtZl0pKyB7Ci0gIAkJCQl5eWx2YWwuaW50ZWdlciA9IGJmZF9zY2FuX3ZtYSAoeXl0ZXh0KzEsIDAsMTYpOwotCQkJCXJldHVybiBJTlQ7Ci0JCQl9Ci0KLTxNUkksRVhQUkVTU0lPTj4oWzAtOUEtRmEtZl0pKyhIfGh8WHx4fEJ8YnxPfG98RHxkKSB7Ci0JCQkJICAgaW50IGliYXNlIDsKLQkJCQkgICBzd2l0Y2ggKHl5dGV4dFt5eWxlbmctMV0pIHsKLQkJCQkgICAgY2FzZSAnWCc6IAotCQkJCSAgICBjYXNlICd4JzoKLQkJCQkgICAgY2FzZSAnSCc6Ci0JCQkJICAgIGNhc2UgJ2gnOgotCQkJCSAgICAgaWJhc2UgPSAxNjsKLQkJCQkgICAgIGJyZWFrOwotCQkJCSAgICBjYXNlICdPJzoKLQkJCQkgICAgY2FzZSAnbyc6Ci0JCQkJICAgICBpYmFzZSA9IDg7Ci0JCQkJICAgICBicmVhazsKLQkJCQkgICAgY2FzZSAnQic6Ci0JCQkJICAgIGNhc2UgJ2InOgotCQkJCSAgICAgaWJhc2UgPSAyOwotCQkJCSAgICAgYnJlYWs7Ci0JCQkJICAgIGRlZmF1bHQ6Ci0JCQkJICAgICBpYmFzZSA9IDEwOwotCQkJCSAgIH0KLQkJCQkgICB5eWx2YWwuaW50ZWdlciA9IGJmZF9zY2FuX3ZtYSAoeXl0ZXh0LCAwLAotCQkJCQkJCQkgIGliYXNlKTsKLQkJCQkgICByZXR1cm4gSU5UOwotCQkJCSB9Ci08U0NSSVBULERFRlNZTUVYUCxNUkksQk9USCxFWFBSRVNTSU9OPigoKCIkInwiMHgiKShbMC05QS1GYS1mXSkrKXwoKFswLTldKSspKShNfEt8bXxrKT8gewotCQkJCSAgY2hhciAqcyA9IHl5dGV4dDsKLQotCQkJCSAgaWYgKCpzID09ICckJykKLQkJCQkgICAgKytzOwotCQkJCSAgeXlsdmFsLmludGVnZXIgPSBiZmRfc2Nhbl92bWEgKHMsIDAsIDApOwotCQkJCSAgaWYgKHl5dGV4dFt5eWxlbmctMV0gPT0gJ00nCi0JCQkJICAgICAgfHwgeXl0ZXh0W3l5bGVuZy0xXSA9PSAnbScpCi0JCQkJICAgIHl5bHZhbC5pbnRlZ2VyICo9IDEwMjQgKiAxMDI0OwotCQkJCSAgaWYgKHl5dGV4dFt5eWxlbmctMV0gPT0gJ0snIAotCQkJCSAgICAgIHx8IHl5dGV4dFt5eWxlbmctMV09PSdrJykKLQkJCQkgICAgeXlsdmFsLmludGVnZXIgKj0gMTAyNDsKLQkJCQkgIHJldHVybiBJTlQ7Ci0JCQkJfQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJdIgkJeyBSVE9LRU4oJ10nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IlsiCQl7IFJUT0tFTignWycpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPDw9Igl7IFJUT0tFTihMU0hJRlRFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+Pj0iCXsgUlRPS0VOKFJTSElGVEVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Inx8Igl7IFJUT0tFTihPUk9SKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij09Igl7IFJUT0tFTihFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIhPSIJeyBSVE9LRU4oTkUpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iPj0iCXsgUlRPS0VOKEdFKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ijw9Igl7IFJUT0tFTihMRSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8PCIJeyBSVE9LRU4oTFNISUZUKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij4+Igl7IFJUT0tFTihSU0hJRlQpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKz0iCXsgUlRPS0VOKFBMVVNFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiItPSIJeyBSVE9LRU4oTUlOVVNFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIqPSIJeyBSVE9LRU4oTVVMVEVRKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii89Igl7IFJUT0tFTihESVZFUSk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiImPSIJeyBSVE9LRU4oQU5ERVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4ifD0iCXsgUlRPS0VOKE9SRVEpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJiYiCXsgUlRPS0VOKEFOREFORCk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI+IgkJeyBSVE9LRU4oJz4nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IiwiCQl7IFJUT0tFTignLCcpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJiIJCXsgUlRPS0VOKCcmJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ8IgkJeyBSVE9LRU4oJ3wnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+In4iCQl7IFJUT0tFTignficpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iISIJCXsgUlRPS0VOKCchJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI/IgkJeyBSVE9LRU4oJz8nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+IioiCQl7IFJUT0tFTignKicpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iKyIJCXsgUlRPS0VOKCcrJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiItIgkJeyBSVE9LRU4oJy0nKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ii8iCQl7IFJUT0tFTignLycpO30KLTxCT1RILFNDUklQVCxFWFBSRVNTSU9OLE1SST4iJSIJCXsgUlRPS0VOKCclJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI8IgkJeyBSVE9LRU4oJzwnKTt9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+Ij0iICAgICAgICAgIHsgUlRPS0VOKCc9Jyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiJ9IgkJCXsgUlRPS0VOKCd9JykgOyB9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTixNUkk+InsiCQkJeyBSVE9LRU4oJ3snKTsgfQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIpIgkJCXsgUlRPS0VOKCcpJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiIoIgkJCXsgUlRPS0VOKCcoJyk7fQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI6IgkJeyBSVE9LRU4oJzonKTsgfQotPEJPVEgsU0NSSVBULEVYUFJFU1NJT04sTVJJPiI7IgkJeyBSVE9LRU4oJzsnKTt9Ci08Qk9USCxTQ1JJUFQ+Ik1FTU9SWSIJCXsgUlRPS0VOKE1FTU9SWSk7fQotPEJPVEgsU0NSSVBUPiJPUklHSU4iCQl7IFJUT0tFTihPUklHSU4pO30KLTxCT1RILFNDUklQVD4iVkVSU0lPTiIJCXsgUlRPS0VOKFZFUlNJT05LKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQkxPQ0siCQl7IFJUT0tFTihCTE9DSyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkJJTkQiCQl7IFJUT0tFTihCSU5EKTt9Ci08Qk9USCxTQ1JJUFQ+IkxFTkdUSCIJCXsgUlRPS0VOKExFTkdUSCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkFMSUdOIgkJCXsgUlRPS0VOKEFMSUdOX0spO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJBRERSIgkJCXsgUlRPS0VOKEFERFIpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJMT0FEQUREUiIJCXsgUlRPS0VOKExPQURBRERSKTt9Ci08RVhQUkVTU0lPTixCT1RIPiJNQVgiCQkJeyBSVE9LRU4oTUFYX0spOyB9Ci08RVhQUkVTU0lPTixCT1RIPiJNSU4iCQkJeyBSVE9LRU4oTUlOX0spOyB9Ci08RVhQUkVTU0lPTixCT1RIPiJBU1NFUlQiCQl7IFJUT0tFTihBU1NFUlRfSyk7IH0KLTxCT1RILFNDUklQVD4iRU5UUlkiCQkJeyBSVE9LRU4oRU5UUlkpO30KLTxCT1RILFNDUklQVCxNUkk+IkVYVEVSTiIJCXsgUlRPS0VOKEVYVEVSTik7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik5FWFQiCQkJeyBSVE9LRU4oTkVYVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+InNpemVvZl9oZWFkZXJzIgl7IFJUT0tFTihTSVpFT0ZfSEVBREVSUyk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IlNJWkVPRl9IRUFERVJTIgl7IFJUT0tFTihTSVpFT0ZfSEVBREVSUyk7fQotPEJPVEgsU0NSSVBUPiJNQVAiCQkJeyBSVE9LRU4oTUFQKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iU0laRU9GIgkJeyBSVE9LRU4oU0laRU9GKTt9Ci08Qk9USCxTQ1JJUFQ+IlRBUkdFVCIJCXsgUlRPS0VOKFRBUkdFVF9LKTt9Ci08Qk9USCxTQ1JJUFQ+IlNFQVJDSF9ESVIiCQl7IFJUT0tFTihTRUFSQ0hfRElSKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9VVFBVVCIJCXsgUlRPS0VOKE9VVFBVVCk7fQotPEJPVEgsU0NSSVBUPiJJTlBVVCIJCQl7IFJUT0tFTihJTlBVVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkdST1VQIgkJeyBSVE9LRU4oR1JPVVApO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJERUZJTkVEIgkJeyBSVE9LRU4oREVGSU5FRCk7fQotPEJPVEgsU0NSSVBUPiJDUkVBVEVfT0JKRUNUX1NZTUJPTFMiCXsgUlRPS0VOKENSRUFURV9PQkpFQ1RfU1lNQk9MUyk7fQotPEJPVEgsU0NSSVBUPiJDT05TVFJVQ1RPUlMiCQl7IFJUT0tFTiggQ09OU1RSVUNUT1JTKTt9Ci08Qk9USCxTQ1JJUFQ+IkZPUkNFX0NPTU1PTl9BTExPQ0FUSU9OIiB7IFJUT0tFTihGT1JDRV9DT01NT05fQUxMT0NBVElPTik7fQotPEJPVEgsU0NSSVBUPiJTRUNUSU9OUyIJCXsgUlRPS0VOKFNFQ1RJT05TKTt9Ci08Qk9USCxTQ1JJUFQ+IkZJTEwiCQkJeyBSVE9LRU4oRklMTCk7fQotPEJPVEgsU0NSSVBUPiJTVEFSVFVQIgkJeyBSVE9LRU4oU1RBUlRVUCk7fQotPEJPVEgsU0NSSVBUPiJPVVRQVVRfRk9STUFUIgkJeyBSVE9LRU4oT1VUUFVUX0ZPUk1BVCk7fQotPEJPVEgsU0NSSVBUPiJPVVRQVVRfQVJDSCIJCXsgUlRPS0VOKCBPVVRQVVRfQVJDSCk7fQotPEJPVEgsU0NSSVBUPiJITEwiCQkJeyBSVE9LRU4oSExMKTt9Ci08Qk9USCxTQ1JJUFQ+IlNZU0xJQiIJCXsgUlRPS0VOKFNZU0xJQik7fQotPEJPVEgsU0NSSVBUPiJGTE9BVCIJCQl7IFJUT0tFTihGTE9BVCk7fQotPEJPVEgsU0NSSVBUPiJRVUFEIgkJCXsgUlRPS0VOKCBRVUFEKTt9Ci08Qk9USCxTQ1JJUFQ+IlNRVUFEIgkJCXsgUlRPS0VOKCBTUVVBRCk7fQotPEJPVEgsU0NSSVBUPiJMT05HIgkJCXsgUlRPS0VOKCBMT05HKTt9Ci08Qk9USCxTQ1JJUFQ+IlNIT1JUIgkJCXsgUlRPS0VOKCBTSE9SVCk7fQotPEJPVEgsU0NSSVBUPiJCWVRFIgkJCXsgUlRPS0VOKCBCWVRFKTt9Ci08Qk9USCxTQ1JJUFQ+Ik5PRkxPQVQiCQl7IFJUT0tFTihOT0ZMT0FUKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iTk9DUk9TU1JFRlMiCXsgUlRPS0VOKE5PQ1JPU1NSRUZTKTt9Ci08Qk9USCxTQ1JJUFQ+Ik9WRVJMQVkiCQkJeyBSVE9LRU4oT1ZFUkxBWSk7IH0KLTxCT1RILFNDUklQVD4iU09SVCIJCQl7IFJUT0tFTihTT1JUKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+Ik5PTE9BRCIJeyBSVE9LRU4oTk9MT0FEKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iRFNFQ1QiCQl7IFJUT0tFTihEU0VDVCk7fQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQ+IkNPUFkiCQl7IFJUT0tFTihDT1BZKTt9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iSU5GTyIJCXsgUlRPS0VOKElORk8pO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJPVkVSTEFZIgl7IFJUT0tFTihPVkVSTEFZKTt9Ci08Qk9USCxTQ1JJUFQ+Im8iCQkJeyBSVE9LRU4oT1JJR0lOKTt9Ci08Qk9USCxTQ1JJUFQ+Im9yZyIJCQl7IFJUT0tFTihPUklHSU4pO30KLTxCT1RILFNDUklQVD4ibCIJCQl7IFJUT0tFTiggTEVOR1RIKTt9Ci08Qk9USCxTQ1JJUFQ+ImxlbiIJCQl7IFJUT0tFTiggTEVOR1RIKTt9Ci08Qk9USCxTQ1JJUFQ+IklOQ0xVREUiCQkJeyBSVE9LRU4oSU5DTFVERSk7fQotPEJPVEgsU0NSSVBUPiJQSERSUyIJCQl7IFJUT0tFTiAoUEhEUlMpOyB9Ci08RVhQUkVTU0lPTixCT1RILFNDUklQVD4iQVQiCQkJeyBSVE9LRU4oQVQpO30KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJQUk9WSURFIgkJeyBSVE9LRU4oUFJPVklERSk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJLRUVQIgkJeyBSVE9LRU4oS0VFUCk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBUPiJFWENMVURFX0ZJTEUiICAgICAgICB7IFJUT0tFTihFWENMVURFX0ZJTEUpOyB9Ci08TVJJPiIjIi4qXG4/CQkJeyArKyBsaW5lbm87IH0KLTxNUkk+IlxuIgkgICAgICAgICAgICAgICAgeyArKyBsaW5lbm87ICBSVE9LRU4oTkVXTElORSk7IH0KLTxNUkk+IioiLioJCQl7IC8qIE1yaSBjb21tZW50IGxpbmUgKi8gfQotPE1SST4iOyIuKgkJCXsgLyogTXJpIGNvbW1lbnQgbGluZSAqLyB9Ci08TVJJPiJFTkQiICAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVORFdPUkQpOyB9Ci08TVJJPiJBTElHTk1PRCIJCXsgUlRPS0VOKEFMSUdOTU9EKTt9Ci08TVJJPiJBTElHTiIJCXsgUlRPS0VOKEFMSUdOX0spO30KLTxNUkk+IkNISVAiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0hJUCk7IH0KLTxNUkk+IkJBU0UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQkFTRSk7IH0KLTxNUkk+IkFMSUFTIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEFMSUFTKTsgfQotPE1SST4iVFJVTkNBVEUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oVFJVTkNBVEUpOyB9Ci08TVJJPiJMT0FEIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExPQUQpOyB9Ci08TVJJPiJQVUJMSUMiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFBVQkxJQyk7IH0KLTxNUkk+Ik9SREVSIiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oT1JERVIpOyB9Ci08TVJJPiJOQU1FIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKE5BTUVXT1JEKTsgfQotPE1SST4iRk9STUFUIiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihGT1JNQVQpOyB9Ci08TVJJPiJDQVNFIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKENBU0UpOyB9Ci08TVJJPiJTVEFSVCIgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFNUQVJUKTsgfQotPE1SST4iTElTVCIuKiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihMSVNUKTsgLyogTElTVCBhbmQgaWdub3JlIHRvIGVuZCBvZiBsaW5lICovIH0KLTxNUkk+IlNFQ1QiCQkJeyBSVE9LRU4oU0VDVCk7IH0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBULE1SST4iQUJTT0xVVEUiCQkJeyBSVE9LRU4oQUJTT0xVVEUpOyB9Ci08TVJJPiJlbmQiICAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVORFdPUkQpOyB9Ci08TVJJPiJhbGlnbm1vZCIJCXsgUlRPS0VOKEFMSUdOTU9EKTt9Ci08TVJJPiJhbGlnbiIJCXsgUlRPS0VOKEFMSUdOX0spO30KLTxNUkk+ImNoaXAiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQ0hJUCk7IH0KLTxNUkk+ImJhc2UiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oQkFTRSk7IH0KLTxNUkk+ImFsaWFzIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEFMSUFTKTsgfQotPE1SST4idHJ1bmNhdGUiICAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oVFJVTkNBVEUpOyB9Ci08TVJJPiJsb2FkIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExPQUQpOyB9Ci08TVJJPiJwdWJsaWMiICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKFBVQkxJQyk7IH0KLTxNUkk+Im9yZGVyIiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oT1JERVIpOyB9Ci08TVJJPiJuYW1lIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKE5BTUVXT1JEKTsgfQotPE1SST4iZm9ybWF0IiAgICAgICAgICAgICAgICAgICB7IFJUT0tFTihGT1JNQVQpOyB9Ci08TVJJPiJjYXNlIiAgICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKENBU0UpOyB9Ci08TVJJPiJleHRlcm4iICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKEVYVEVSTik7IH0KLTxNUkk+InN0YXJ0IiAgICAgICAgICAgICAgICAgICAgeyBSVE9LRU4oU1RBUlQpOyB9Ci08TVJJPiJsaXN0Ii4qICAgICAgICAgICAgICAgICAgIHsgUlRPS0VOKExJU1QpOyAvKiBMSVNUIGFuZCBpZ25vcmUgdG8gZW5kIG9mIGxpbmUgKi8gfQotPE1SST4ic2VjdCIJCQl7IFJUT0tFTihTRUNUKTsgfQotPEVYUFJFU1NJT04sQk9USCxTQ1JJUFQsTVJJPiJhYnNvbHV0ZSIJCQl7IFJUT0tFTihBQlNPTFVURSk7IH0KLQotPE1SST57RklMRU5BTUVDSEFSMX17Tk9DRklMRU5BTUVDSEFSfSoJewotLyogRmlsZW5hbWUgd2l0aG91dCBjb21tYXMsIG5lZWRlZCB0byBwYXJzZSBtcmkgc3R1ZmYgKi8KLQkJCQkgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KTsgCi0JCQkJICByZXR1cm4gTkFNRTsKLQkJCQl9Ci0KLQotPEJPVEgsRVhQUkVTU0lPTj57RklMRU5BTUVDSEFSMX17RklMRU5BTUVDSEFSfSoJewotCQkJCSB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyh5eXRleHQpOyAKLQkJCQkgIHJldHVybiBOQU1FOwotCQkJCX0KLTxCT1RILEVYUFJFU1NJT04+Ii1sIntGSUxFTkFNRUNIQVJ9KyB7Ci0JCQkJICB5eWx2YWwubmFtZSA9IGJ1eXN0cmluZyAoeXl0ZXh0ICsgMik7Ci0JCQkJICByZXR1cm4gTE5BTUU7Ci0JCQkJfQotPFNDUklQVD57V0lMRENIQVJ9KiB7Ci0JCS8qIEFubm95aW5nbHksIHRoaXMgcGF0dGVybiBjYW4gbWF0Y2ggY29tbWVudHMsIGFuZCB3ZSBoYXZlCi0JCSAgIGxvbmdlc3QgbWF0Y2ggaXNzdWVzIHRvIGNvbnNpZGVyLiAgU28gaWYgdGhlIGZpcnN0IHR3bwotCQkgICBjaGFyYWN0ZXJzIGFyZSBhIGNvbW1lbnQgb3BlbmluZywgcHV0IHRoZSBpbnB1dCBiYWNrIGFuZAotCQkgICB0cnkgYWdhaW4uICAqLwotCQlpZiAoeXl0ZXh0WzBdID09ICcvJyAmJiB5eXRleHRbMV0gPT0gJyonKQotCQkgIHsKLQkJICAgIHl5bGVzcygyKTsKLQkJICAgIGNvbW1lbnQgKCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgewotCQkgICAgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KTsKLQkJICAgIHJldHVybiBOQU1FOwotCQkgIH0KLQl9Ci0KLTxFWFBSRVNTSU9OLEJPVEgsU0NSSVBULFZFUlNfTk9ERT4iXCIiW15cIl0qIlwiIiB7Ci0JCQkJCS8qIE5vIG1hdHRlciB0aGUgc3RhdGUsIHF1b3RlcwotCQkJCQkgICBnaXZlIHdoYXQncyBpbnNpZGUgKi8KLQkJCQkJeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcoeXl0ZXh0KzEpOwotCQkJCQl5eWx2YWwubmFtZVt5eWxlbmctMl0gPSAwOwotCQkJCQlyZXR1cm4gTkFNRTsKLQkJCQl9Ci08Qk9USCxTQ1JJUFQsRVhQUkVTU0lPTj4iXG4iCQl7IGxpbmVubysrO30KLTxNUkksQk9USCxTQ1JJUFQsRVhQUkVTU0lPTj5bIFx0XHJdKwl7IH0KLQotPFZFUlNfTk9ERSxWRVJTX1NDUklQVD5bOiw7XQl7IHJldHVybiAqeXl0ZXh0OyB9Ci0KLTxWRVJTX05PREU+Z2xvYmFsCQl7IFJUT0tFTihHTE9CQUwpOyB9Ci0KLTxWRVJTX05PREU+bG9jYWwJCXsgUlRPS0VOKExPQ0FMKTsgfQotCi08VkVSU19OT0RFPmV4dGVybgkJeyBSVE9LRU4oRVhURVJOKTsgfQotCi08VkVSU19OT0RFPntWX0lERU5USUZJRVJ9CXsgeXlsdmFsLm5hbWUgPSBidXlzdHJpbmcgKHl5dGV4dCk7Ci0JCQkJICByZXR1cm4gVkVSU19JREVOVElGSUVSOyB9Ci0KLTxWRVJTX1NDUklQVD57Vl9UQUd9CQl7IHl5bHZhbC5uYW1lID0gYnV5c3RyaW5nICh5eXRleHQpOwotCQkJCSAgcmV0dXJuIFZFUlNfVEFHOyB9Ci0KLTxWRVJTX1NUQVJUPiJ7IgkJCXsgQkVHSU4oVkVSU19TQ1JJUFQpOyByZXR1cm4gKnl5dGV4dDsgfQotCi08VkVSU19TQ1JJUFQ+InsiCQl7IEJFR0lOKFZFUlNfTk9ERSk7IAotCQkJCSAgdmVyc19ub2RlX25lc3RpbmcgPSAwOwotCQkJCSAgcmV0dXJuICp5eXRleHQ7Ci0JCQkJfQotPFZFUlNfU0NSSVBUPiJ9IgkJeyByZXR1cm4gKnl5dGV4dDsgfQotPFZFUlNfTk9ERT4ieyIJCQl7IHZlcnNfbm9kZV9uZXN0aW5nKys7IHJldHVybiAqeXl0ZXh0OyB9Ci08VkVSU19OT0RFPiJ9IgkJCXsgaWYgKC0tdmVyc19ub2RlX25lc3RpbmcgPCAwKQotCQkJCSAgICBCRUdJTihWRVJTX1NDUklQVCk7Ci0JCQkJICByZXR1cm4gKnl5dGV4dDsKLQkJCQl9Ci0KLTxWRVJTX1NUQVJULFZFUlNfTk9ERSxWRVJTX1NDUklQVD5bXG5dCQl7IGxpbmVubysrOyB9Ci0KLTxWRVJTX1NUQVJULFZFUlNfTk9ERSxWRVJTX1NDUklQVD4jLioJCXsgLyogRWF0IHVwIGNvbW1lbnRzICovIH0KLQotPFZFUlNfU1RBUlQsVkVSU19OT0RFLFZFUlNfU0NSSVBUPlsgXHRccl0rICAgCXsgLyogRWF0IHVwIHdoaXRlc3BhY2UgKi8gfQotCi08PEVPRj4+IHsKLSAgaW5jbHVkZV9zdGFja19wdHItLTsKLSAgICAKLSAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID09IDApIAotICB7Ci0gICAgeXl0ZXJtaW5hdGUoKTsKLSAgfQotICBlbHNlIAotICB7Ci0gICAgeXlfc3dpdGNoX3RvX2J1ZmZlcihpbmNsdWRlX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSk7Ci0KLSAgfQotICBCRUdJTihTQ1JJUFQpOwotICBsZGZpbGVfaW5wdXRfZmlsZW5hbWUgPSBmaWxlX25hbWVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHIgLSAxXTsKLSAgbGluZW5vID0gbGluZW5vX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyIC0gMV07Ci0KLSAgcmV0dXJuIEVORDsKLX0KLQotPFNDUklQVCxNUkksVkVSU19TVEFSVCxWRVJTX1NDUklQVCxWRVJTX05PREU+LglsZXhfd2Fybl9pbnZhbGlkKCIgaW4gc2NyaXB0IiwgeXl0ZXh0KTsKLTxFWFBSRVNTSU9OLERFRlNZTUVYUCxCT1RIPi4JbGV4X3dhcm5faW52YWxpZCgiIGluIGV4cHJlc3Npb24iLCB5eXRleHQpOwotICAgIAotJSUKLQwKLQotLyogU3dpdGNoIGZsZXggdG8gcmVhZGluZyBzY3JpcHQgZmlsZSBOQU1FLCBvcGVuIG9uIEZJTEUsCi0gICBzYXZpbmcgdGhlIGN1cnJlbnQgaW5wdXQgaW5mbyBvbiB0aGUgaW5jbHVkZSBzdGFjay4gICovCi0KLXZvaWQKLWxleF9wdXNoX2ZpbGUgKGZpbGUsIG5hbWUpCi0gICAgIEZJTEUgKmZpbGU7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChpbmNsdWRlX3N0YWNrX3B0ciA+PSBNQVhfSU5DTFVERV9ERVBUSCkgCi0gICAgewotICAgICAgZWluZm8oIiVGOmluY2x1ZGVzIG5lc3RlZCB0b28gZGVlcGx5XG4iKTsKLSAgICB9Ci0gIGZpbGVfbmFtZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSBuYW1lOwotICBsaW5lbm9fc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gMTsKLSAgaW5jbHVkZV9zdGFja1tpbmNsdWRlX3N0YWNrX3B0cl0gPSBZWV9DVVJSRU5UX0JVRkZFUjsKLQotICBpbmNsdWRlX3N0YWNrX3B0cisrOwotICB5eWluID0gZmlsZTsKLSAgeXlfc3dpdGNoX3RvX2J1ZmZlcih5eV9jcmVhdGVfYnVmZmVyKHl5aW4sIFlZX0JVRl9TSVpFKSk7Ci0gIEJFR0lOIChTQ1JJUFQpOwotfQotCi0vKiBSZXR1cm4gYSBuZXdseSBjcmVhdGVkIGZsZXggaW5wdXQgYnVmZmVyIGNvbnRhaW5pbmcgU1RSSU5HLAotICAgd2hpY2ggaXMgU0laRSBieXRlcyBsb25nLiAgKi8KLQotc3RhdGljIFlZX0JVRkZFUl9TVEFURSAKLXl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIChzdHJpbmcsIHNpemUpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLSAgICAgc2l6ZV90IHNpemU7Ci17Ci0gIFlZX0JVRkZFUl9TVEFURSBiOwotCi0gIC8qIENhbGxzIHRvIG0tYWxsb2MgZ2V0IHR1cm5lZCBieSBzZWQgaW50byB4bS1hbGxvYy4gICovCi0gIGIgPSAoWVlfQlVGRkVSX1NUQVRFKSBtYWxsb2MgKHNpemVvZiAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSkpOwotICBiLT55eV9pbnB1dF9maWxlID0gMDsKLSAgYi0+eXlfYnVmX3NpemUgPSBzaXplOwotCi0gIC8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKLSAgICAgd2UgbmVlZCB0byBwdXQgaW4gMiBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICAqLwotICBiLT55eV9jaF9idWYgPSAoY2hhciAqKSBtYWxsb2MgKCh1bnNpZ25lZCkgKGItPnl5X2J1Zl9zaXplICsgMykpOwotCi0gIGItPnl5X2NoX2J1ZlswXSA9ICdcbic7Ci0gIHN0cmNweSAoYi0+eXlfY2hfYnVmKzEsIHN0cmluZyk7Ci0gIGItPnl5X2NoX2J1ZltzaXplKzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOwotICBiLT55eV9jaF9idWZbc2l6ZSsyXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKLSAgYi0+eXlfbl9jaGFycyA9IHNpemUrMTsKLSAgYi0+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMV07Ci0KLSAgLyogZmxleCAyLjQuNyBjaGFuZ2VkIHRoZSBpbnRlcmZhY2UuICBGSVhNRTogV2Ugc2hvdWxkIG5vdCBiZSB1c2luZwotICAgICBhIGZsZXggaW50ZXJuYWwgaW50ZXJmYWNlIGluIHRoZSBmaXJzdCBwbGFjZSEgICovCi0jaWZkZWYgWVlfQlVGRkVSX05FVwotICBiLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKLSNlbHNlCi0gIGItPnl5X2VvZl9zdGF0dXMgPSBFT0ZfTk9UX1NFRU47Ci0jZW5kaWYKLQotICByZXR1cm4gYjsKLX0KLQotLyogU3dpdGNoIGZsZXggdG8gcmVhZGluZyBmcm9tIFNUUklORywgc2F2aW5nIHRoZSBjdXJyZW50IGlucHV0IGluZm8KLSAgIG9uIHRoZSBpbmNsdWRlIHN0YWNrLiAgKi8KLQotdm9pZAotbGV4X3JlZGlyZWN0IChzdHJpbmcpCi0gICAgIENPTlNUIGNoYXIgKnN0cmluZzsKLXsKLSAgWVlfQlVGRkVSX1NUQVRFIHRtcDsKLQotICB5eV9pbml0ID0gMDsKLSAgaWYgKGluY2x1ZGVfc3RhY2tfcHRyID49IE1BWF9JTkNMVURFX0RFUFRIKSAKLSAgICB7Ci0gICAgICBlaW5mbygiJUY6IG1hY3JvcyBuZXN0ZWQgdG9vIGRlZXBseVxuIik7Ci0gICAgfQotICBmaWxlX25hbWVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gInJlZGlyZWN0IjsKLSAgbGluZW5vX3N0YWNrW2luY2x1ZGVfc3RhY2tfcHRyXSA9IDA7Ci0gIGluY2x1ZGVfc3RhY2tbaW5jbHVkZV9zdGFja19wdHJdID0gWVlfQ1VSUkVOVF9CVUZGRVI7Ci0gIGluY2x1ZGVfc3RhY2tfcHRyKys7Ci0gIHRtcCA9IHl5X2NyZWF0ZV9zdHJpbmdfYnVmZmVyIChzdHJpbmcsIHN0cmxlbiAoc3RyaW5nKSk7Ci0gIHl5X3N3aXRjaF90b19idWZmZXIgKHRtcCk7Ci0gIEJFR0lOIChTQ1JJUFQpOwotfQotDAotLyogRnVuY3Rpb25zIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudCBmbGV4IHN0YXJ0IGNvbmRpdGlvbiwKLSAgIHNhdmluZyB0aGUgY3VycmVudCBzdGFydCBjb25kaXRpb24gb24gYHN0YXRlX3N0YWNrJy4gICovCi0KLXN0YXRpYyBpbnQgc3RhdGVfc3RhY2tbTUFYX0lOQ0xVREVfREVQVEggKiAyXTsKLXN0YXRpYyBpbnQgKnN0YXRlX3N0YWNrX3AgPSBzdGF0ZV9zdGFjazsKLQotdm9pZAotbGRsZXhfc2NyaXB0ICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoU0NSSVBUKTsKLX0KLQotdm9pZAotbGRsZXhfbXJpX3NjcmlwdCAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKE1SSSk7Ci19Ci0KLXZvaWQKLWxkbGV4X3ZlcnNpb25fc2NyaXB0ICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoVkVSU19TVEFSVCk7Ci19Ci0KLXZvaWQKLWxkbGV4X3ZlcnNpb25fZmlsZSAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKFZFUlNfU0NSSVBUKTsKLX0KLQotdm9pZAotbGRsZXhfZGVmc3ltICgpCi17Ci0gICooc3RhdGVfc3RhY2tfcCkrKyA9IHl5X3N0YXJ0OwotICBCRUdJTiAoREVGU1lNRVhQKTsKLX0KLQkgICAKLXZvaWQKLWxkbGV4X2V4cHJlc3Npb24gKCkKLXsKLSAgKihzdGF0ZV9zdGFja19wKSsrID0geXlfc3RhcnQ7Ci0gIEJFR0lOIChFWFBSRVNTSU9OKTsKLX0KLQotdm9pZAotbGRsZXhfYm90aCAoKQotewotICAqKHN0YXRlX3N0YWNrX3ApKysgPSB5eV9zdGFydDsKLSAgQkVHSU4gKEJPVEgpOwotfQotCi12b2lkCi1sZGxleF9wb3BzdGF0ZSAoKQotewotICB5eV9zdGFydCA9ICooLS1zdGF0ZV9zdGFja19wKTsKLX0KLQwKLQotLyogUGxhY2UgdXAgdG8gTUFYX1NJWkUgY2hhcmFjdGVycyBpbiBCVUYgYW5kIHJldHVybiBpbiAqUkVTVUxUCi0gICBlaXRoZXIgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQsIG9yIDAgdG8gaW5kaWNhdGUgRU9GLiAgKi8KLQotc3RhdGljIHZvaWQKLXl5X2lucHV0IChidWYsIHJlc3VsdCwgbWF4X3NpemUpCi0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50ICpyZXN1bHQ7Ci0gICAgIGludCBtYXhfc2l6ZTsKLXsKLSAgKnJlc3VsdCA9IDA7IAotICBpZiAoeXlfY3VycmVudF9idWZmZXItPnl5X2lucHV0X2ZpbGUpCi0gICAgewotICAgICAgaWYgKHl5aW4pCi0JewotCSAgKnJlc3VsdCA9IHJlYWQgKGZpbGVubyAoeXlpbiksIChjaGFyICopIGJ1ZiwgbWF4X3NpemUpOwotCSAgaWYgKCpyZXN1bHQgPCAwKSAKLQkgICAgZWluZm8gKCIlRiVQOiByZWFkIGluIGZsZXggc2Nhbm5lciBmYWlsZWRcbiIpOwotCX0KLSAgICB9Ci19Ci0KLS8qIEVhdCB0aGUgcmVzdCBvZiBhIEMtc3R5bGUgY29tbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1jb21tZW50ICgpCi17Ci0gIGludCBjOwotCi0gIHdoaWxlICgxKQotICB7Ci0gICAgYyA9IGlucHV0KCk7Ci0gICAgd2hpbGUgKGMgIT0gJyonICYmIGMgIT0gRU9GKSAKLSAgICB7Ci0gICAgICBpZiAoYyA9PSAnXG4nKQotCWxpbmVubysrOwotICAgICAgYyA9IGlucHV0KCk7Ci0gICAgfQotCi0gICAgaWYgKGMgPT0gJyonKQotICAgIHsKLSAgICAgIGMgPSBpbnB1dCgpOwotICAgICAgd2hpbGUgKGMgPT0gJyonKQotICAgICAgIGMgPSBpbnB1dCgpOwotICAgICAgaWYgKGMgPT0gJy8nKQotICAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIHRoZSBlbmQgKi8KLSAgICB9Ci0KLSAgICBpZiAoYyA9PSAnXG4nKQotICAgICAgbGluZW5vKys7Ci0KLSAgICBpZiAoYyA9PSBFT0YpCi0gICAgewotICAgICAgZWluZm8oICIlRiVQOiBFT0YgaW4gY29tbWVudFxuIik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLyogV2FybiB0aGUgdXNlciBhYm91dCBhIGdhcmJhZ2UgY2hhcmFjdGVyIFdIQVQgaW4gdGhlIGlucHV0Ci0gICBpbiBjb250ZXh0IFdIRVJFLiAgKi8KLQotc3RhdGljIHZvaWQKLWxleF93YXJuX2ludmFsaWQgKHdoZXJlLCB3aGF0KQotICAgICBjaGFyICp3aGVyZSwgKndoYXQ7Ci17Ci0gIGNoYXIgYnVmWzVdOwotCi0gIC8qIElmIHdlIGhhdmUgZm91bmQgYW4gaW5wdXQgZmlsZSB3aG9zZSBmb3JtYXQgd2UgZG8gbm90IHJlY29nbml6ZSwKLSAgICAgYW5kIHdlIGFyZSB0aGVyZWZvcmUgdHJlYXRpbmcgaXQgYXMgYSBsaW5rZXIgc2NyaXB0LCBhbmQgd2UgZmluZAotICAgICBhbiBpbnZhbGlkIGNoYXJhY3RlciwgdGhlbiBtb3N0IGxpa2VseSB0aGlzIGlzIGEgcmVhbCBvYmplY3QgZmlsZQotICAgICBvZiBzb21lIGRpZmZlcmVudCBmb3JtYXQuICBUcmVhdCBpdCBhcyBzdWNoLiAgKi8KLSAgaWYgKGxkZmlsZV9hc3N1bWVkX3NjcmlwdCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfZmlsZV9ub3RfcmVjb2duaXplZCk7Ci0gICAgICBlaW5mbyAoIiVGJXM6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iLCBsZGZpbGVfaW5wdXRfZmlsZW5hbWUpOwotICAgIH0KLQotICBpZiAoISBpc3ByaW50ICgodW5zaWduZWQgY2hhcikgKndoYXQpKQotICAgIHsKLSAgICAgIHNwcmludGYgKGJ1ZiwgIlxcJTAzbyIsICh1bnNpZ25lZCBpbnQpICp3aGF0KTsKLSAgICAgIHdoYXQgPSBidWY7Ci0gICAgfQotCi0gIGVpbmZvICgiJVA6JVM6IGlnbm9yaW5nIGludmFsaWQgY2hhcmFjdGVyIGAlcyclc1xuIiwgd2hhdCwgd2hlcmUpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbGRtYWluLmMgYi9sZC9sZG1haW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlZjNlNS4uMDAwMDAwMAotLS0gYS9sZC9sZG1haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMDQgKzAsMCBAQAotLyogTWFpbiBwcm9ncmFtIG9mIEdOVSBsaW5rZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgInByb2dyZXNzLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZHdyaXRlLmgiCi0jaW5jbHVkZSAibGRncmFtLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotCi0vKiBTb21ld2hlcmUgYWJvdmUsIHN5cy9zdGF0LmggZ290IGluY2x1ZGVkIC4gLiAuIC4gKi8KLSNpZiAhZGVmaW5lZChTX0lTRElSKSAmJiBkZWZpbmVkKFNfSUZESVIpCi0jZGVmaW5lCVNfSVNESVIobSkgKCgobSkgJiBTX0lGTVQpID09IFNfSUZESVIpCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaWZkZWYgSEFWRV9TQlJLCi0jaWZkZWYgTkVFRF9ERUNMQVJBVElPTl9TQlJLCi1leHRlcm4gUFRSIHNicmsgKCk7Ci0jZW5kaWYKLSNlbmRpZgotCi1zdGF0aWMgY2hhciAqZ2V0X2VtdWxhdGlvbiBQQVJBTVMgKChpbnQsIGNoYXIgKiopKTsKLXN0YXRpYyB2b2lkIHNldF9zY3JpcHRzX2RpciBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIEVYUE9SVFMgKi8KLQotY2hhciAqZGVmYXVsdF90YXJnZXQ7Ci1jb25zdCBjaGFyICpvdXRwdXRfZmlsZW5hbWUgPSAiYS5vdXQiOwotCi0vKiBOYW1lIHRoaXMgcHJvZ3JhbSB3YXMgaW52b2tlZCBieS4gICovCi1jaGFyICpwcm9ncmFtX25hbWU7Ci0KLS8qIFRoZSBmaWxlIHRoYXQgd2UncmUgY3JlYXRpbmcgKi8KLWJmZCAqb3V0cHV0X2JmZCA9IDA7Ci0KLS8qIFNldCBieSAtRyBhcmd1bWVudCwgZm9yIE1JUFMgRUNPRkYgdGFyZ2V0LiAgKi8KLWludCBnX3N3aXRjaF92YWx1ZSA9IDg7Ci0KLS8qIE5vbnplcm8gbWVhbnMgcHJpbnQgbmFtZXMgb2YgaW5wdXQgZmlsZXMgYXMgcHJvY2Vzc2VkLiAgKi8KLWJvb2xlYW4gdHJhY2VfZmlsZXM7Ci0KLS8qIE5vbnplcm8gbWVhbnMgc2FtZSwgYnV0IG5vdGUgb3BlbiBmYWlsdXJlcywgdG9vLiAgKi8KLWJvb2xlYW4gdHJhY2VfZmlsZV90cmllczsKLQotLyogTm9uemVybyBtZWFucyB2ZXJzaW9uIG51bWJlciB3YXMgcHJpbnRlZCwgc28gZXhpdCBzdWNjZXNzZnVsbHkKLSAgIGluc3RlYWQgb2YgY29tcGxhaW5pbmcgaWYgbm8gaW5wdXQgZmlsZXMgYXJlIGdpdmVuLiAgKi8KLWJvb2xlYW4gdmVyc2lvbl9wcmludGVkOwotCi0vKiBOb256ZXJvIG1lYW5zIGxpbmsgaW4gZXZlcnkgbWVtYmVyIG9mIGFuIGFyY2hpdmUuICAqLwotYm9vbGVhbiB3aG9sZV9hcmNoaXZlOwotCi0vKiBUcnVlIGlmIHdlIHNob3VsZCBkZW1hbmdsZSBzeW1ib2wgbmFtZXMuICAqLwotYm9vbGVhbiBkZW1hbmdsaW5nOwotCi1hcmdzX3R5cGUgY29tbWFuZF9saW5lOwotCi1sZF9jb25maWdfdHlwZSBjb25maWc7Ci0KLXN0YXRpYyB2b2lkIHJlbW92ZV9vdXRwdXQgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gY2hlY2tfZm9yX3NjcmlwdHNfZGlyIFBBUkFNUyAoKGNoYXIgKmRpcikpOwotc3RhdGljIGJvb2xlYW4gYWRkX2FyY2hpdmVfZWxlbWVudCBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBiZmQgKiwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGJvb2xlYW4gbXVsdGlwbGVfZGVmaW5pdGlvbiBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgICAgY29uc3QgY2hhciAqLAotCQkJCQkgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEsCi0JCQkJCSAgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gbXVsdGlwbGVfY29tbW9uIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCWNvbnN0IGNoYXIgKiwgYmZkICosCi0JCQkJCWVudW0gYmZkX2xpbmtfaGFzaF90eXBlLCBiZmRfdm1hLAotCQkJCQliZmQgKiwgZW51bSBiZmRfbGlua19oYXNoX3R5cGUsCi0JCQkJCWJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIGFkZF90b19zZXQgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqLAotCQkJCSAgIGJmZF9yZWxvY19jb2RlX3JlYWxfdHlwZSwKLQkJCQkgICBiZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gY29uc3RydWN0b3JfY2FsbGJhY2sgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJICAgICBib29sZWFuIGNvbnN0cnVjdG9yLAotCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIHdhcm5pbmdfY2FsbGJhY2sgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwKLQkJCQkJIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBiZmQgKiwKLQkJCQkJIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLXN0YXRpYyB2b2lkIHdhcm5pbmdfZmluZF9yZWxvYyBQQVJBTVMgKChiZmQgKiwgYXNlY3Rpb24gKiwgUFRSKSk7Ci1zdGF0aWMgYm9vbGVhbiB1bmRlZmluZWRfc3ltYm9sIFBBUkFNUyAoKHN0cnVjdCBiZmRfbGlua19pbmZvICosCi0JCQkJCSBjb25zdCBjaGFyICosIGJmZCAqLAotCQkJCQkgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gcmVsb2Nfb3ZlcmZsb3cgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCQkJCSAgICAgICBjb25zdCBjaGFyICosIGJmZF92bWEsCi0JCQkJICAgICAgIGJmZCAqLCBhc2VjdGlvbiAqLCBiZmRfdm1hKSk7Ci1zdGF0aWMgYm9vbGVhbiByZWxvY19kYW5nZXJvdXMgUEFSQU1TICgoc3RydWN0IGJmZF9saW5rX2luZm8gKiwgY29uc3QgY2hhciAqLAotCQkJCQliZmQgKiwgYXNlY3Rpb24gKiwgYmZkX3ZtYSkpOwotc3RhdGljIGJvb2xlYW4gdW5hdHRhY2hlZF9yZWxvYyBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLAotCQkJCQkgY29uc3QgY2hhciAqLCBiZmQgKiwgYXNlY3Rpb24gKiwKLQkJCQkJIGJmZF92bWEpKTsKLXN0YXRpYyBib29sZWFuIG5vdGljZSBQQVJBTVMgKChzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqLCBjb25zdCBjaGFyICosCi0JCQkgICAgICAgYmZkICosIGFzZWN0aW9uICosIGJmZF92bWEpKTsKLQotc3RhdGljIHN0cnVjdCBiZmRfbGlua19jYWxsYmFja3MgbGlua19jYWxsYmFja3MgPQotewotICBhZGRfYXJjaGl2ZV9lbGVtZW50LAotICBtdWx0aXBsZV9kZWZpbml0aW9uLAotICBtdWx0aXBsZV9jb21tb24sCi0gIGFkZF90b19zZXQsCi0gIGNvbnN0cnVjdG9yX2NhbGxiYWNrLAotICB3YXJuaW5nX2NhbGxiYWNrLAotICB1bmRlZmluZWRfc3ltYm9sLAotICByZWxvY19vdmVyZmxvdywKLSAgcmVsb2NfZGFuZ2Vyb3VzLAotICB1bmF0dGFjaGVkX3JlbG9jLAotICBub3RpY2UKLX07Ci0KLXN0cnVjdCBiZmRfbGlua19pbmZvIGxpbmtfaW5mbzsKLQwKLXN0YXRpYyB2b2lkCi1yZW1vdmVfb3V0cHV0ICgpCi17Ci0gIGlmIChvdXRwdXRfZmlsZW5hbWUpIAotICAgIHsKLSAgICAgIGlmIChvdXRwdXRfYmZkICYmIG91dHB1dF9iZmQtPmlvc3RyZWFtKQotCWZjbG9zZSgoRklMRSAqKShvdXRwdXRfYmZkLT5pb3N0cmVhbSkpOwotICAgICAgaWYgKGRlbGV0ZV9vdXRwdXRfZmlsZV9vbl9mYWlsdXJlKQotCXVubGluayAob3V0cHV0X2ZpbGVuYW1lKTsKLSAgICB9Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICplbXVsYXRpb247Ci0gIGxvbmcgc3RhcnRfdGltZSA9IGdldF9ydW5fdGltZSAoKTsKLQotI2lmIGRlZmluZWQgKEhBVkVfU0VUTE9DQUxFKSAmJiBkZWZpbmVkIChIQVZFX0xDX01FU1NBR0VTKQotICBzZXRsb2NhbGUgKExDX01FU1NBR0VTLCAiIik7Ci0jZW5kaWYKLSAgYmluZHRleHRkb21haW4gKFBBQ0tBR0UsIExPQ0FMRURJUik7Ci0gIHRleHRkb21haW4gKFBBQ0tBR0UpOwotCi0gIHByb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0gIHhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICBTVEFSVF9QUk9HUkVTUyAocHJvZ3JhbV9uYW1lLCAwKTsKLQotICBiZmRfaW5pdCAoKTsKLQotICBiZmRfc2V0X2Vycm9yX3Byb2dyYW1fbmFtZSAocHJvZ3JhbV9uYW1lKTsKLQotICB4YXRleGl0IChyZW1vdmVfb3V0cHV0KTsKLQotICAvKiBTZXQgdGhlIGRlZmF1bHQgQkZEIHRhcmdldCBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCB0YXJnZXQuICBEb2luZwotICAgICB0aGlzIHBlcm1pdHMgdGhlIGxpbmtlciB0byBiZSBjb25maWd1cmVkIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0LAotICAgICBhbmQgbGlua2VkIGFnYWluc3QgYSBzaGFyZWQgQkZEIGxpYnJhcnkgd2hpY2ggd2FzIGNvbmZpZ3VyZWQgZm9yCi0gICAgIGEgZGlmZmVyZW50IHRhcmdldC4gIFRoZSBtYWNybyBUQVJHRVQgaXMgZGVmaW5lZCBieSBNYWtlZmlsZS4gICovCi0gIGlmICghIGJmZF9zZXRfZGVmYXVsdF90YXJnZXQgKFRBUkdFVCkpCi0gICAgewotICAgICAgZWluZm8gKF8oIiVYJVA6IGNhbid0IHNldCBCRkQgZGVmYXVsdCB0YXJnZXQgdG8gYCVzJzogJUVcbiIpLCBUQVJHRVQpOwotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBkYXRhIGFib3V0IG9wdGlvbnMuICAqLwotICB0cmFjZV9maWxlcyA9IHRyYWNlX2ZpbGVfdHJpZXMgPSB2ZXJzaW9uX3ByaW50ZWQgPSBmYWxzZTsKLSAgd2hvbGVfYXJjaGl2ZSA9IGZhbHNlOwotICBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID0gdHJ1ZTsKLSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotICBjb25maWcuaGFzX3NoYXJlZCA9IGZhbHNlOwotICBjb21tYW5kX2xpbmUuZm9yY2VfY29tbW9uX2RlZmluaXRpb24gPSBmYWxzZTsKLSAgY29tbWFuZF9saW5lLmludGVycHJldGVyID0gTlVMTDsKLSAgY29tbWFuZF9saW5lLnJwYXRoID0gTlVMTDsKLSAgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2ggPSB0cnVlOwotICBjb21tYW5kX2xpbmUuY2hlY2tfc2VjdGlvbl9hZGRyZXNzZXMgPSB0cnVlOwotCi0gIC8qIFdlIGluaXRpYWxpemUgREVNQU5HTElORyBiYXNlZCBvbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICAgQ09MTEVDVF9OT19ERU1BTkdMRS4gIFRoZSBnY2MgY29sbGVjdDIgcHJvZ3JhbSB3aWxsIGRlbWFuZ2xlIHRoZQotICAgICBvdXRwdXQgb2YgdGhlIGxpbmtlciwgdW5sZXNzIENPTExFQ1RfTk9fREVNQU5HTEUgaXMgc2V0IGluIHRoZQotICAgICBlbnZpcm9ubWVudC4gIEFjdGluZyB0aGUgc2FtZSB3YXkgaGVyZSBsZXRzIHVzIHByb3ZpZGUgdGhlIHNhbWUKLSAgICAgaW50ZXJmYWNlIGJ5IGRlZmF1bHQuICAqLwotICBkZW1hbmdsaW5nID0gZ2V0ZW52ICgiQ09MTEVDVF9OT19ERU1BTkdMRSIpID09IE5VTEw7Ci0KLSAgbGlua19pbmZvLmNhbGxiYWNrcyA9ICZsaW5rX2NhbGxiYWNrczsKLSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IGZhbHNlOwotICBsaW5rX2luZm8uc2hhcmVkID0gZmFsc2U7Ci0gIGxpbmtfaW5mby5zeW1ib2xpYyA9IGZhbHNlOwotICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSBmYWxzZTsKLSAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IGZhbHNlOwotICBsaW5rX2luZm8ub3B0aW1pemUgPSBmYWxzZTsKLSAgbGlua19pbmZvLm5vX3VuZGVmaW5lZCA9IGZhbHNlOwotICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9ub25lOwotICBsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfbm9uZTsKLSAgbGlua19pbmZvLmtlZXBfbWVtb3J5ID0gdHJ1ZTsKLSAgbGlua19pbmZvLmlucHV0X2JmZHMgPSBOVUxMOwotICBsaW5rX2luZm8uY3JlYXRlX29iamVjdF9zeW1ib2xzX3NlY3Rpb24gPSBOVUxMOwotICBsaW5rX2luZm8uaGFzaCA9IE5VTEw7Ci0gIGxpbmtfaW5mby5rZWVwX2hhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IGZhbHNlOwotICBsaW5rX2luZm8ubm90aWNlX2hhc2ggPSBOVUxMOwotICBsaW5rX2luZm8ud3JhcF9oYXNoID0gTlVMTDsKLSAgbGlua19pbmZvLm1wYzg2MGMwID0gMDsKLSAgLyogU1ZSNCBsaW5rZXJzIHNlZW0gdG8gc2V0IERUX0lOSVQgYW5kIERUX0ZJTkkgYmFzZWQgb24gbWFnaWMgX2luaXQKLSAgICAgYW5kIF9maW5pIHN5bWJvbHMuICBXZSBhcmUgY29tcGF0aWJsZS4gICovCi0gIGxpbmtfaW5mby5pbml0X2Z1bmN0aW9uID0gIl9pbml0IjsKLSAgbGlua19pbmZvLmZpbmlfZnVuY3Rpb24gPSAiX2ZpbmkiOwotCi0gIGxkZmlsZV9hZGRfYXJjaCAoIiIpOwotCi0gIGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSBmYWxzZTsKLSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IHRydWU7Ci0gIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IHRydWU7Ci0gIGNvbmZpZy5tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotCi0gIGVtdWxhdGlvbiA9IGdldF9lbXVsYXRpb24gKGFyZ2MsIGFyZ3YpOwotICBsZGVtdWxfY2hvb3NlX21vZGUgKGVtdWxhdGlvbik7Ci0gIGRlZmF1bHRfdGFyZ2V0ID0gbGRlbXVsX2Nob29zZV90YXJnZXQgKCk7Ci0gIGxhbmdfaW5pdCAoKTsKLSAgbGRlbXVsX2JlZm9yZV9wYXJzZSAoKTsKLSAgbGFuZ19oYXNfaW5wdXRfZmlsZSA9IGZhbHNlOwotICBwYXJzZV9hcmdzIChhcmdjLCBhcmd2KTsKLQotICBsZGVtdWxfc2V0X3N5bWJvbHMgKCk7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgewotICAgICAgaWYgKGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucykKLQllaW5mbyAoIiVQJUY6IC0tZ2Mtc2VjdGlvbnMgYW5kIC1yIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIik7Ci0gICAgICBpZiAobGlua19pbmZvLm1wYzg2MGMwKQotCWVpbmZvIChfKCIlUCVGOiAtciBhbmQgLS1tcGM4NjBjMCBtYXkgbm90IGJlIHVzZWQgdG9nZXRoZXJcbiIpKTsKLSAgICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5yZWxheCkKLQllaW5mbyAoXygiJVAlRjogLS1yZWxheCBhbmQgLXIgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKSk7Ci0gICAgICBpZiAobGlua19pbmZvLnNoYXJlZCkKLQllaW5mbyAoXygiJVAlRjogLXIgYW5kIC1zaGFyZWQgbWF5IG5vdCBiZSB1c2VkIHRvZ2V0aGVyXG4iKSk7Ci0gICAgfQotCi0gIC8qIFRyZWF0IGxkIC1yIC1zIGFzIGxkIC1yIC1TIC14IChpLmUuLCBzdHJpcCBhbGwgbG9jYWwgc3ltYm9scykuICBJCi0gICAgIGRvbid0IHNlZSBob3cgZWxzZSB0aGlzIGNhbiBiZSBoYW5kbGVkLCBzaW5jZSBpbiB0aGlzIGNhc2Ugd2UKLSAgICAgbXVzdCBwcmVzZXJ2ZSBhbGwgZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMuICAqLwotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiBsaW5rX2luZm8uc3RyaXAgPT0gc3RyaXBfYWxsKQotICAgIHsKLSAgICAgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2RlYnVnZ2VyOwotICAgICAgaWYgKGxpbmtfaW5mby5kaXNjYXJkID09IGRpc2NhcmRfbm9uZSkKLQlsaW5rX2luZm8uZGlzY2FyZCA9IGRpc2NhcmRfYWxsOwotICAgIH0KLQotICAvKiBUaGlzIGVzc2VudGlhbGx5IGFkZHMgYW5vdGhlciAtTCBkaXJlY3Rvcnkgc28gdGhpcyBtdXN0IGJlIGRvbmUgYWZ0ZXIKLSAgICAgdGhlIC1MJ3MgaW4gYXJndiBoYXZlIGJlZW4gcHJvY2Vzc2VkLiAgKi8KLSAgc2V0X3NjcmlwdHNfZGlyICgpOwotCi0gIGlmIChoYWRfc2NyaXB0ID09IGZhbHNlKQotICAgIHsKLSAgICAgIC8qIFJlYWQgdGhlIGVtdWxhdGlvbidzIGFwcHJvcHJpYXRlIGRlZmF1bHQgc2NyaXB0LiAgKi8KLSAgICAgIGludCBpc2ZpbGU7Ci0gICAgICBjaGFyICpzID0gbGRlbXVsX2dldF9zY3JpcHQgKCZpc2ZpbGUpOwotCi0gICAgICBpZiAoaXNmaWxlKQotCWxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAocyk7Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKHRyYWNlX2ZpbGVfdHJpZXMpCi0JICAgIHsKLQkgICAgICBpbmZvX21zZyAoXygidXNpbmcgaW50ZXJuYWwgbGlua2VyIHNjcmlwdDpcbiIpKTsKLQkgICAgICBpbmZvX21zZyAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkgICAgICBpbmZvX21zZyAocyk7Ci0JICAgICAgaW5mb19tc2cgKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQkgICAgfQotCSAgbGV4X3N0cmluZyA9IHM7Ci0JICBsZXhfcmVkaXJlY3QgKHMpOwotCX0KLSAgICAgIHBhcnNlcl9pbnB1dCA9IGlucHV0X3NjcmlwdDsKLSAgICAgIHl5cGFyc2UgKCk7Ci0gICAgICBsZXhfc3RyaW5nID0gTlVMTDsKLSAgICB9Ci0KLSAgbGFuZ19maW5hbCAoKTsKLQotICBpZiAobGFuZ19oYXNfaW5wdXRfZmlsZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAodmVyc2lvbl9wcmludGVkKQotCXhleGl0ICgwKTsKLSAgICAgIGVpbmZvIChfKCIlUCVGOiBubyBpbnB1dCBmaWxlc1xuIikpOwotICAgIH0KLQotICBpZiAodHJhY2VfZmlsZXMpCi0gICAgewotICAgICAgaW5mb19tc2cgKF8oIiVQOiBtb2RlICVzXG4iKSwgZW11bGF0aW9uKTsKLSAgICB9Ci0KLSAgbGRlbXVsX2FmdGVyX3BhcnNlICgpOwotCi0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZW5hbWUpCi0gICAgewotICAgICAgaWYgKHN0cmNtcCAoY29uZmlnLm1hcF9maWxlbmFtZSwgIi0iKSA9PSAwKQotCXsKLQkgIGNvbmZpZy5tYXBfZmlsZSA9IHN0ZG91dDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgY29uZmlnLm1hcF9maWxlID0gZm9wZW4gKGNvbmZpZy5tYXBfZmlsZW5hbWUsIEZPUEVOX1dUKTsKLQkgIGlmIChjb25maWcubWFwX2ZpbGUgPT0gKEZJTEUgKikgTlVMTCkKLQkgICAgewotCSAgICAgIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9zeXN0ZW1fY2FsbCk7Ci0JICAgICAgZWluZm8gKF8oIiVQJUY6IGNhbm5vdCBvcGVuIG1hcCBmaWxlICVzOiAlRVxuIiksCi0JCSAgICAgY29uZmlnLm1hcF9maWxlbmFtZSk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0KLSAgbGFuZ19wcm9jZXNzICgpOwotCi0gIC8qIFByaW50IGVycm9yIG1lc3NhZ2VzIGZvciBhbnkgbWlzc2luZyBzeW1ib2xzLCBmb3IgYW55IHdhcm5pbmcKLSAgICAgc3ltYm9scywgYW5kIHBvc3NpYmx5IG11bHRpcGxlIGRlZmluaXRpb25zICovCi0KLQotICBpZiAoY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHsKLSAgICAgIC8qIExvb2sgZm9yIGEgdGV4dCBzZWN0aW9uIGFuZCBtYXJrIHRoZSByZWFkb25seSBhdHRyaWJ1dGUgaW4gaXQgKi8KLSAgICAgIGFzZWN0aW9uICpmb3VuZCA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChvdXRwdXRfYmZkLCAiLnRleHQiKTsKLQotICAgICAgaWYgKGZvdW5kICE9IChhc2VjdGlvbiAqKSBOVUxMKQotCXsKLQkgIGZvdW5kLT5mbGFncyB8PSBTRUNfUkVBRE9OTFk7Ci0JfQotICAgIH0KLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSkKLSAgICBvdXRwdXRfYmZkLT5mbGFncyAmPSB+RVhFQ19QOwotICBlbHNlCi0gICAgb3V0cHV0X2JmZC0+ZmxhZ3MgfD0gRVhFQ19QOwotCi0gIGxkd3JpdGUgKCk7Ci0KLSAgaWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMKQotICAgIGxhbmdfbWFwICgpOwotICBpZiAoY29tbWFuZF9saW5lLmNyZWYpCi0gICAgb3V0cHV0X2NyZWYgKGNvbmZpZy5tYXBfZmlsZSAhPSBOVUxMID8gY29uZmlnLm1hcF9maWxlIDogc3Rkb3V0KTsKLSAgaWYgKG5vY3Jvc3NyZWZfbGlzdCAhPSBOVUxMKQotICAgIGNoZWNrX25vY3Jvc3NyZWZzICgpOwotCi0gIC8qIEV2ZW4gaWYgd2UncmUgcHJvZHVjaW5nIHJlbG9jYXRlYWJsZSBvdXRwdXQsIHNvbWUgbm9uLWZhdGFsIGVycm9ycyBzaG91bGQKLSAgICAgYmUgcmVwb3J0ZWQgaW4gdGhlIGV4aXQgc3RhdHVzLiAgKFdoYXQgbm9uLWZhdGFsIGVycm9ycywgaWYgYW55LCBkbyB3ZQotICAgICB3YW50IHRvIGlnbm9yZSBmb3IgcmVsb2NhdGVhYmxlIG91dHB1dD8pICAqLwotCi0gIGlmIChjb25maWcubWFrZV9leGVjdXRhYmxlID09IGZhbHNlICYmIGZvcmNlX21ha2VfZXhlY3V0YWJsZSA9PSBmYWxzZSkKLSAgICB7Ci0gICAgICBpZiAodHJhY2VfZmlsZXMgPT0gdHJ1ZSkKLQl7Ci0JICBlaW5mbyAoXygiJVA6IGxpbmsgZXJyb3JzIGZvdW5kLCBkZWxldGluZyBleGVjdXRhYmxlIGAlcydcbiIpLAotCQkgb3V0cHV0X2ZpbGVuYW1lKTsKLQl9Ci0KLSAgICAgIC8qIFRoZSBmaWxlIHdpbGwgYmUgcmVtb3ZlZCBieSByZW1vdmVfb3V0cHV0LiAgKi8KLQotICAgICAgeGV4aXQgKDEpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmICghIGJmZF9jbG9zZSAob3V0cHV0X2JmZCkpCi0JZWluZm8gKF8oIiVGJUI6IGZpbmFsIGNsb3NlIGZhaWxlZDogJUVcbiIpLCBvdXRwdXRfYmZkKTsKLQotICAgICAgLyogSWYgdGhlIC0tZm9yY2UtZXhlLXN1ZmZpeCBpcyBlbmFibGVkLCBhbmQgd2UncmUgbWFraW5nIGFuCi0JIGV4ZWN1dGFibGUgZmlsZSBhbmQgaXQgZG9lc24ndCBlbmQgaW4gLmV4ZSwgY29weSBpdCB0byBvbmUgd2hpY2ggZG9lcy4gKi8KLQotICAgICAgaWYgKCEgbGlua19pbmZvLnJlbG9jYXRlYWJsZSAmJiBjb21tYW5kX2xpbmUuZm9yY2VfZXhlX3N1ZmZpeCkKLQl7Ci0JICBpbnQgbGVuID0gc3RybGVuIChvdXRwdXRfZmlsZW5hbWUpOwotCSAgaWYgKGxlbiA8IDQgCi0JICAgICAgfHwgKHN0cmNhc2VjbXAgKG91dHB1dF9maWxlbmFtZSArIGxlbiAtIDQsICIuZXhlIikgIT0gMAotCQkgICYmIHN0cmNhc2VjbXAgKG91dHB1dF9maWxlbmFtZSArIGxlbiAtIDQsICIuZGxsIikgIT0gMCkpCi0JICAgIHsKLQkgICAgICBGSUxFICpzcmM7Ci0JICAgICAgRklMRSAqZHN0OwotCSAgICAgIGNvbnN0IGludCBic2l6ZSA9IDQwOTY7Ci0JICAgICAgY2hhciAqYnVmID0geG1hbGxvYyAoYnNpemUpOwotCSAgICAgIGludCBsOwotCSAgICAgIGNoYXIgKmRzdF9uYW1lID0geG1hbGxvYyAobGVuICsgNSk7Ci0JICAgICAgc3RyY3B5IChkc3RfbmFtZSwgb3V0cHV0X2ZpbGVuYW1lKTsKLQkgICAgICBzdHJjYXQgKGRzdF9uYW1lLCAiLmV4ZSIpOwotCSAgICAgIHNyYyA9IGZvcGVuIChvdXRwdXRfZmlsZW5hbWUsIEZPUEVOX1JCKTsKLQkgICAgICBkc3QgPSBmb3BlbiAoZHN0X25hbWUsIEZPUEVOX1dCKTsKLQotCSAgICAgIGlmICghc3JjKQotCQllaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIHNvdXJjZSBvZiBjb3B5IGAlcydcbiIpLCBvdXRwdXRfZmlsZW5hbWUpOwotCSAgICAgIGlmICghZHN0KQotCQllaW5mbyAoXygiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIGRlc3RpbmF0aW9uIG9mIGNvcHkgYCVzJ1xuIiksIGRzdF9uYW1lKTsKLQkgICAgICB3aGlsZSAoKGwgPSBmcmVhZCAoYnVmLCAxLCBic2l6ZSwgc3JjKSkgPiAwKQotCQl7Ci0JCSAgaW50IGRvbmUgPSBmd3JpdGUgKGJ1ZiwgMSwgbCwgZHN0KTsKLQkJICBpZiAoZG9uZSAhPSBsKQotCQkgICAgewotCQkgICAgICBlaW5mbyAoXygiJVA6IEVycm9yIHdyaXRpbmcgZmlsZSBgJXMnXG4iKSwgZHN0X25hbWUpOwotCQkgICAgfQotCQl9Ci0JICAgICAgZmNsb3NlIChzcmMpOwotCSAgICAgIGlmIChmY2xvc2UgKGRzdCkgPT0gRU9GKQotCQl7Ci0JCSAgZWluZm8gKF8oIiVQOiBFcnJvciBjbG9zaW5nIGZpbGUgYCVzJ1xuIiksIGRzdF9uYW1lKTsKLQkJfQotCSAgICAgIGZyZWUgKGRzdF9uYW1lKTsKLQkgICAgICBmcmVlIChidWYpOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBFTkRfUFJPR1JFU1MgKHByb2dyYW1fbmFtZSk7Ci0KLSAgaWYgKGNvbmZpZy5zdGF0cykKLSAgICB7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBjaGFyICpsaW0gPSAoY2hhciAqKSBzYnJrICgwKTsKLSNlbmRpZgotICAgICAgbG9uZyBydW5fdGltZSA9IGdldF9ydW5fdGltZSAoKSAtIHN0YXJ0X3RpbWU7Ci0KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IHRvdGFsIHRpbWUgaW4gbGluazogJWxkLiUwNmxkXG4iKSwKLQkgICAgICAgcHJvZ3JhbV9uYW1lLCBydW5fdGltZSAvIDEwMDAwMDAsIHJ1bl90aW1lICUgMTAwMDAwMCk7Ci0jaWZkZWYgSEFWRV9TQlJLCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIiVzOiBkYXRhIHNpemUgJWxkXG4iKSwgcHJvZ3JhbV9uYW1lLAotCSAgICAgICAobG9uZykgKGxpbSAtIChjaGFyICopICZlbnZpcm9uKSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgLyogUHJldmVudCByZW1vdmVfb3V0cHV0IGZyb20gZG9pbmcgYW55dGhpbmcsIGFmdGVyIGEgc3VjY2Vzc2Z1bCBsaW5rLiAgKi8KLSAgb3V0cHV0X2ZpbGVuYW1lID0gTlVMTDsKLQotICB4ZXhpdCAoMCk7Ci0gIHJldHVybiAwOwotfQotCi0vKiBXZSBuZWVkIHRvIGZpbmQgYW55IGV4cGxpY2l0bHkgZ2l2ZW4gZW11bGF0aW9uIGluIG9yZGVyIHRvIGluaXRpYWxpemUgdGhlCi0gICBzdGF0ZSB0aGF0J3MgbmVlZGVkIGJ5IHRoZSBsZXgmeWFjYyBhcmd1bWVudCBwYXJzZXIgKHBhcnNlX2FyZ3MpLiAgKi8KLQotc3RhdGljIGNoYXIgKgotZ2V0X2VtdWxhdGlvbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBjaGFyICplbXVsYXRpb247Ci0gIGludCBpOwotCi0gIGVtdWxhdGlvbiA9IGdldGVudiAoRU1VTEFUSU9OX0VOVklST04pOwotICBpZiAoZW11bGF0aW9uID09IE5VTEwpCi0gICAgZW11bGF0aW9uID0gREVGQVVMVF9FTVVMQVRJT047Ci0KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoIXN0cm5jbXAgKGFyZ3ZbaV0sICItbSIsIDIpKQotCXsKLQkgIGlmIChhcmd2W2ldWzJdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiAtbSBFTVVMICovCi0JICAgICAgaWYgKGkgPCBhcmdjIC0gMSkKLQkJewotCQkgIGVtdWxhdGlvbiA9IGFyZ3ZbaSArIDFdOwotCQkgIGkrKzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIGVpbmZvKF8oIiVQJUY6IG1pc3NpbmcgYXJndW1lbnQgdG8gLW1cbiIpKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczEiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAoYXJndltpXSwgIi1taXBzMiIpID09IDAKLQkJICAgfHwgc3RyY21wIChhcmd2W2ldLCAiLW1pcHMzIikgPT0gMAotCQkgICB8fCBzdHJjbXAgKGFyZ3ZbaV0sICItbWlwczQiKSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogRklYTUU6IFRoZSBhcmd1bWVudHMgLW1pcHMxLCAtbWlwczIgYW5kIC1taXBzMyBhcmUKLQkJIHBhc3NlZCB0byB0aGUgbGlua2VyIGJ5IHNvbWUgTUlQUyBjb21waWxlcnMuICBUaGV5Ci0JCSBnZW5lcmFsbHkgdGVsbCB0aGUgbGlua2VyIHRvIHVzZSBhIHNsaWdodGx5IGRpZmZlcmVudAotCQkgbGlicmFyeSBwYXRoLiAgUGVyaGFwcyBzb21lZGF5IHRoZXNlIHNob3VsZCBiZQotCQkgaW1wbGVtZW50ZWQgYXMgZW11bGF0aW9uczsgdW50aWwgdGhlbiwgd2UganVzdCBpZ25vcmUKLQkJIHRoZSBhcmd1bWVudHMgYW5kIGhvcGUgdGhhdCBub2JvZHkgZXZlciBjcmVhdGVzCi0JCSBlbXVsYXRpb25zIG5hbWVkIGlwczEsIGlwczIgb3IgaXBzMy4gICovCi0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAoYXJndltpXSwgIi1tNDg2IikgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEZJWE1FOiBUaGUgYXJndW1lbnQgLW00ODYgaXMgcGFzc2VkIHRvIHRoZSBsaW5rZXIgb24KLQkJIHNvbWUgTGludXggc3lzdGVtcy4gIEhvcGUgdGhhdCBub2JvZHkgY3JlYXRlcyBhbgotCQkgZW11bGF0aW9uIG5hbWVkIDQ4Ni4gICovCi0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIC1tRU1VTCAqLwotCSAgICAgIGVtdWxhdGlvbiA9ICZhcmd2W2ldWzJdOwotCSAgICB9Ci0JfQotICAgIH0KLQotICByZXR1cm4gZW11bGF0aW9uOwotfQotCi0vKiBJZiBkaXJlY3RvcnkgRElSIGNvbnRhaW5zIGFuICJsZHNjcmlwdHMiIHN1YmRpcmVjdG9yeSwKLSAgIGFkZCBESVIgdG8gdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggYW5kIHJldHVybiB0cnVlLAotICAgZWxzZSByZXR1cm4gZmFsc2UuICAqLwotCi1zdGF0aWMgYm9vbGVhbgotY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpCi0gICAgIGNoYXIgKmRpcjsKLXsKLSAgc2l6ZV90IGRpcmxlbjsKLSAgY2hhciAqYnVmOwotICBzdHJ1Y3Qgc3RhdCBzOwotICBib29sZWFuIHJlczsKLQotICBkaXJsZW4gPSBzdHJsZW4gKGRpcik7Ci0gIC8qIHNpemVvZiBjb3VudHMgdGhlIHRlcm1pbmF0aW5nIE5VTC4gICovCi0gIGJ1ZiA9IChjaGFyICopIHhtYWxsb2MgKGRpcmxlbiArIHNpemVvZigiL2xkc2NyaXB0cyIpKTsKLSAgc3ByaW50ZiAoYnVmLCAiJXMvbGRzY3JpcHRzIiwgZGlyKTsKLQotICByZXMgPSBzdGF0IChidWYsICZzKSA9PSAwICYmIFNfSVNESVIgKHMuc3RfbW9kZSk7Ci0gIGZyZWUgKGJ1Zik7Ci0gIGlmIChyZXMpCi0gICAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKGRpciwgZmFsc2UpOwotICByZXR1cm4gcmVzOwotfQotCi0vKiBTZXQgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBmaW5kaW5nIHNjcmlwdCBmaWxlcy4KLSAgIExpYnJhcmllcyB3aWxsIGJlIHNlYXJjaGVkIGZvciBoZXJlIHRvbywgYnV0IHRoYXQncyBvay4KLSAgIFdlIGxvb2sgZm9yIHRoZSAibGRzY3JpcHRzIiBkaXJlY3RvcnkgaW46Ci0KLSAgIFNDUklQVERJUiAocGFzc2VkIGZyb20gTWFrZWZpbGUpCi0gICB0aGUgZGlyIHdoZXJlIHRoaXMgcHJvZ3JhbSBpcyAoZm9yIHVzaW5nIGl0IGZyb20gdGhlIGJ1aWxkIHRyZWUpCi0gICB0aGUgZGlyIHdoZXJlIHRoaXMgcHJvZ3JhbSBpcy8uLi9saWIgKGZvciBpbnN0YWxsaW5nIHRoZSB0b29sIHN1aXRlIGVsc2V3aGVyZSkgKi8KLQotc3RhdGljIHZvaWQKLXNldF9zY3JpcHRzX2RpciAoKQotewotICBjaGFyICplbmQsICpkaXI7Ci0gIHNpemVfdCBkaXJsZW47Ci0KLSAgaWYgKGNoZWNrX2Zvcl9zY3JpcHRzX2RpciAoU0NSSVBURElSKSkKLSAgICByZXR1cm47CQkJLyogV2UndmUgYmVlbiBpbnN0YWxsZWQgbm9ybWFsbHkuICAqLwotCi0gIC8qIExvb2sgZm9yICJsZHNjcmlwdHMiIGluIHRoZSBkaXIgd2hlcmUgb3VyIGJpbmFyeSBpcy4gICovCi0gIGVuZCA9IHN0cnJjaHIgKHByb2dyYW1fbmFtZSwgJy8nKTsKLQotICBpZiAoZW5kID09IE5VTEwpCi0gICAgewotICAgICAgLyogRG9uJ3QgbG9vayBmb3IgbGRzY3JpcHRzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFRoZXJlIGlzCi0gICAgICAgICB0b28gbXVjaCBwb3RlbnRpYWwgZm9yIGNvbmZ1c2lvbi4gICovCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRpcmxlbiA9IGVuZCAtIHByb2dyYW1fbmFtZTsKLSAgLyogTWFrZSBhIGNvcHkgb2YgcHJvZ3JhbV9uYW1lIGluIGRpci4KLSAgICAgTGVhdmUgcm9vbSBmb3IgbGF0ZXIgIi8uLi9saWIiLiAgKi8KLSAgZGlyID0gKGNoYXIgKikgeG1hbGxvYyAoZGlybGVuICsgOCk7Ci0gIHN0cm5jcHkgKGRpciwgcHJvZ3JhbV9uYW1lLCBkaXJsZW4pOwotICBkaXJbZGlybGVuXSA9ICdcMCc7Ci0KLSAgaWYgKGNoZWNrX2Zvcl9zY3JpcHRzX2RpciAoZGlyKSkKLSAgICByZXR1cm47CQkJLyogRG9uJ3QgZnJlZSBkaXIuICAqLwotCi0gIC8qIExvb2sgZm9yICJsZHNjcmlwdHMiIGluIDx0aGUgZGlyIHdoZXJlIG91ciBiaW5hcnkgaXM+Ly4uL2xpYi4gICovCi0gIHN0cmNweSAoZGlyICsgZGlybGVuLCAiLy4uL2xpYiIpOwotICBpZiAoY2hlY2tfZm9yX3NjcmlwdHNfZGlyIChkaXIpKQotICAgIHJldHVybjsKLQotICBmcmVlIChkaXIpOwkJCS8qIFdlbGwsIHdlIHRyaWVkLiAgKi8KLX0KLQotdm9pZAotYWRkX3lzeW0gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChsaW5rX2luZm8ubm90aWNlX2hhc2ggPT0gKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKSBOVUxMKQotICAgIHsKLSAgICAgIGxpbmtfaW5mby5ub3RpY2VfaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCQkgICAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKGxpbmtfaW5mby5ub3RpY2VfaGFzaCwKLQkJCQkgICBiZmRfaGFzaF9uZXdmdW5jLAotCQkJCSAgIDYxKSkKLQllaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfSAgICAgIAotCi0gIGlmIChiZmRfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5ub3RpY2VfaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSkKLSAgICAgID09IChzdHJ1Y3QgYmZkX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLX0KLQotLyogUmVjb3JkIGEgc3ltYm9sIHRvIGJlIHdyYXBwZWQsIGZyb20gdGhlIC0td3JhcCBvcHRpb24uICAqLwotCi12b2lkCi1hZGRfd3JhcCAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgaWYgKGxpbmtfaW5mby53cmFwX2hhc2ggPT0gTlVMTCkKLSAgICB7Ci0gICAgICBsaW5rX2luZm8ud3JhcF9oYXNoID0gKChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUgKikKLQkJCSAgICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0gICAgICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0X24gKGxpbmtfaW5mby53cmFwX2hhc2gsCi0JCQkJICAgYmZkX2hhc2hfbmV3ZnVuYywKLQkJCQkgICA2MSkpCi0JZWluZm8gKF8oIiVQJUY6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLSAgaWYgKGJmZF9oYXNoX2xvb2t1cCAobGlua19pbmZvLndyYXBfaGFzaCwgbmFtZSwgdHJ1ZSwgdHJ1ZSkgPT0gTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIpKTsKLX0KLQotLyogSGFuZGxlIHRoZSAtcmV0YWluLXN5bWJvbHMtZmlsZSBvcHRpb24uICAqLwotCi12b2lkCi1hZGRfa2VlcHN5bXNfZmlsZSAoZmlsZW5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotewotICBGSUxFICpmaWxlOwotICBjaGFyICpidWY7Ci0gIHNpemVfdCBidWZzaXplOwotICBpbnQgYzsKLQotICBpZiAobGlua19pbmZvLnN0cmlwID09IHN0cmlwX3NvbWUpCi0gICAgZWluZm8gKF8oIiVYJVA6IGVycm9yOiBkdXBsaWNhdGUgcmV0YWluLXN5bWJvbHMtZmlsZVxuIikpOwotCi0gIGZpbGUgPSBmb3BlbiAoZmlsZW5hbWUsICJyIik7Ci0gIGlmIChmaWxlID09IChGSUxFICopIE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGVpbmZvICgiJVglUDogJXM6ICVFXG4iLCBmaWxlbmFtZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGxpbmtfaW5mby5rZWVwX2hhc2ggPSAoKHN0cnVjdCBiZmRfaGFzaF90YWJsZSAqKQotCQkJIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGJmZF9oYXNoX3RhYmxlKSkpOwotICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0IChsaW5rX2luZm8ua2VlcF9oYXNoLCBiZmRfaGFzaF9uZXdmdW5jKSkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfdGFibGVfaW5pdCBmYWlsZWQ6ICVFXG4iKSk7Ci0KLSAgYnVmc2l6ZSA9IDEwMDsKLSAgYnVmID0gKGNoYXIgKikgeG1hbGxvYyAoYnVmc2l6ZSk7Ci0KLSAgYyA9IGdldGMgKGZpbGUpOwotICB3aGlsZSAoYyAhPSBFT0YpCi0gICAgewotICAgICAgd2hpbGUgKGlzc3BhY2UgKGMpKQotCWMgPSBnZXRjIChmaWxlKTsKLQotICAgICAgaWYgKGMgIT0gRU9GKQotCXsKLQkgIHNpemVfdCBsZW4gPSAwOwotCi0JICB3aGlsZSAoISBpc3NwYWNlIChjKSAmJiBjICE9IEVPRikKLQkgICAgewotCSAgICAgIGJ1ZltsZW5dID0gYzsKLQkgICAgICArK2xlbjsKLQkgICAgICBpZiAobGVuID49IGJ1ZnNpemUpCi0JCXsKLQkJICBidWZzaXplICo9IDI7Ci0JCSAgYnVmID0geHJlYWxsb2MgKGJ1ZiwgYnVmc2l6ZSk7Ci0JCX0KLQkgICAgICBjID0gZ2V0YyAoZmlsZSk7Ci0JICAgIH0KLQotCSAgYnVmW2xlbl0gPSAnXDAnOwotCi0JICBpZiAoYmZkX2hhc2hfbG9va3VwIChsaW5rX2luZm8ua2VlcF9oYXNoLCBidWYsIHRydWUsIHRydWUpCi0JICAgICAgPT0gKHN0cnVjdCBiZmRfaGFzaF9lbnRyeSAqKSBOVUxMKQotCSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2hhc2hfbG9va3VwIGZvciBpbnNlcnRpb24gZmFpbGVkOiAlRVxuIikpOwotCX0KLSAgICB9Ci0KLSAgaWYgKGxpbmtfaW5mby5zdHJpcCAhPSBzdHJpcF9ub25lKQotICAgIGVpbmZvIChfKCIlUDogYC1yZXRhaW4tc3ltYm9scy1maWxlJyBvdmVycmlkZXMgYC1zJyBhbmQgYC1TJ1xuIikpOwotCi0gIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX3NvbWU7Ci19Ci0MCi0vKiBDYWxsYmFja3MgZnJvbSB0aGUgQkZEIGxpbmtlciByb3V0aW5lcy4gICovCi0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkZWNpZGVkIHRvIGluY2x1ZGUgYW4gYXJjaGl2ZSBtZW1iZXIgaW4KLSAgIGEgbGluay4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLWFkZF9hcmNoaXZlX2VsZW1lbnQgKGluZm8sIGFiZmQsIG5hbWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmlucHV0OwotCi0gIGlucHV0ID0gKChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopCi0JICAgeG1hbGxvYyAoc2l6ZW9mIChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlKSkpOwotICBpbnB1dC0+ZmlsZW5hbWUgPSBhYmZkLT5maWxlbmFtZTsKLSAgaW5wdXQtPmxvY2FsX3N5bV9uYW1lID0gYWJmZC0+ZmlsZW5hbWU7Ci0gIGlucHV0LT50aGVfYmZkID0gYWJmZDsKLSAgaW5wdXQtPmFzeW1ib2xzID0gTlVMTDsKLSAgaW5wdXQtPm5leHQgPSBOVUxMOwotICBpbnB1dC0+anVzdF9zeW1zX2ZsYWcgPSBmYWxzZTsKLSAgaW5wdXQtPmxvYWRlZCA9IGZhbHNlOwotICBpbnB1dC0+c2VhcmNoX2RpcnNfZmxhZyA9IGZhbHNlOwotCi0gIC8qIEZJWE1FOiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IHNldDogaGVhZGVyLm5leHQsCi0gICAgIGhlYWRlci50eXBlLCBjbG9zZWQsIHBhc3NpdmVfcG9zaXRpb24sIHN5bWJvbF9jb3VudCwKLSAgICAgbmV4dF9yZWFsX2ZpbGUsIGlzX2FyY2hpdmUsIHRhcmdldCwgcmVhbC4gIFRoaXMgYml0IG9mIGNvZGUgaXMKLSAgICAgZnJvbSB0aGUgb2xkIGRlY29kZV9saWJyYXJ5X3N1YmZpbGUgZnVuY3Rpb24uICBJIGRvbid0IGtub3cKLSAgICAgd2hldGhlciBhbnkgb2YgdGhvc2UgZmllbGRzIG1hdHRlcnMuICAqLwotCi0gIGxkbGFuZ19hZGRfZmlsZSAoaW5wdXQpOwotCi0gIGlmIChjb25maWcubWFwX2ZpbGUgIT0gKEZJTEUgKikgTlVMTCkKLSAgICB7Ci0gICAgICBzdGF0aWMgYm9vbGVhbiBoZWFkZXJfcHJpbnRlZDsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotICAgICAgYmZkICpmcm9tOwotICAgICAgaW50IGxlbjsKLQotICAgICAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQotICAgICAgaWYgKGggPT0gTlVMTCkKLQlmcm9tID0gTlVMTDsKLSAgICAgIGVsc2UKLQl7Ci0JICBzd2l0Y2ggKGgtPnR5cGUpCi0JICAgIHsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBmcm9tID0gTlVMTDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfZGVmaW5lZDoKLQkgICAgY2FzZSBiZmRfbGlua19oYXNoX2RlZndlYWs6Ci0JICAgICAgZnJvbSA9IGgtPnUuZGVmLnNlY3Rpb24tPm93bmVyOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ6Ci0JICAgIGNhc2UgYmZkX2xpbmtfaGFzaF91bmRlZndlYWs6Ci0JICAgICAgZnJvbSA9IGgtPnUudW5kZWYuYWJmZDsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIGJmZF9saW5rX2hhc2hfY29tbW9uOgotCSAgICAgIGZyb20gPSBoLT51LmMucC0+c2VjdGlvbi0+b3duZXI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGlmICghIGhlYWRlcl9wcmludGVkKQotCXsKLQkgIGNoYXIgYnVmWzEwMF07Ci0KLQkgIHNwcmludGYgKGJ1ZiwgIiUtMjlzICVzXG5cbiIsIF8oIkFyY2hpdmUgbWVtYmVyIGluY2x1ZGVkIiksCi0JCSAgIF8oImJlY2F1c2Ugb2YgZmlsZSAoc3ltYm9sKSIpKTsKLQkgIG1pbmZvICgiJXMiLCBidWYpOwotCSAgaGVhZGVyX3ByaW50ZWQgPSB0cnVlOwotCX0KLQotICAgICAgaWYgKGJmZF9teV9hcmNoaXZlIChhYmZkKSA9PSBOVUxMKQotCXsKLQkgIG1pbmZvICgiJXMiLCBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSk7Ci0JICBsZW4gPSBzdHJsZW4gKGJmZF9nZXRfZmlsZW5hbWUgKGFiZmQpKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWluZm8gKCIlcyglcykiLCBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoYWJmZCkpLAotCQkgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpOwotCSAgbGVuID0gKHN0cmxlbiAoYmZkX2dldF9maWxlbmFtZSAoYmZkX215X2FyY2hpdmUgKGFiZmQpKSkKLQkJICsgc3RybGVuIChiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKSkKLQkJICsgMik7Ci0JfQotCi0gICAgICBpZiAobGVuID49IDI5KQotCXsKLQkgIHByaW50X25sICgpOwotCSAgbGVuID0gMDsKLQl9Ci0gICAgICB3aGlsZSAobGVuIDwgMzApCi0JewotCSAgcHJpbnRfc3BhY2UgKCk7Ci0JICArK2xlbjsKLQl9Ci0KLSAgICAgIGlmIChmcm9tICE9IE5VTEwpCi0JbWluZm8gKCIlQiAiLCBmcm9tKTsKLSAgICAgIGlmIChoICE9IE5VTEwpCi0JbWluZm8gKCIoJVQpXG4iLCBoLT5yb290LnN0cmluZyk7Ci0gICAgICBlbHNlCi0JbWluZm8gKCIoJXMpXG4iLCBuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKHRyYWNlX2ZpbGVzIHx8IHRyYWNlX2ZpbGVfdHJpZXMpCi0gICAgaW5mb19tc2cgKCIlSVxuIiwgaW5wdXQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIEJGRCBoYXMgZGlzY292ZXJlZCBhIHN5bWJvbCB3aGljaCBpcyBkZWZpbmVkCi0gICBtdWx0aXBsZSB0aW1lcy4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW11bHRpcGxlX2RlZmluaXRpb24gKGluZm8sIG5hbWUsIG9iZmQsIG9zZWMsIG92YWwsIG5iZmQsIG5zZWMsIG52YWwpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGFzZWN0aW9uICpvc2VjOwotICAgICBiZmRfdm1hIG92YWw7Ci0gICAgIGJmZCAqbmJmZDsKLSAgICAgYXNlY3Rpb24gKm5zZWM7Ci0gICAgIGJmZF92bWEgbnZhbDsKLXsKLSAgLyogSWYgZWl0aGVyIHNlY3Rpb24gaGFzIHRoZSBvdXRwdXRfc2VjdGlvbiBmaWVsZCBzZXQgdG8KLSAgICAgYmZkX2Fic19zZWN0aW9uX3B0ciwgaXQgbWVhbnMgdGhhdCB0aGUgc2VjdGlvbiBpcyBiZWluZwotICAgICBkaXNjYXJkZWQsIGFuZCB0aGlzIGlzIG5vdCByZWFsbHkgYSBtdWx0aXBsZSBkZWZpbml0aW9uIGF0IGFsbC4KLSAgICAgRklYTUU6IEl0IHdvdWxkIGJlIGNsZWFuZXIgdG8gc29tZWhvdyBpZ25vcmUgc3ltYm9scyBkZWZpbmVkIGluCi0gICAgIHNlY3Rpb25zIHdoaWNoIGFyZSBiZWluZyBkaXNjYXJkZWQuICAqLwotICBpZiAoKG9zZWMtPm91dHB1dF9zZWN0aW9uICE9IE5VTEwKLSAgICAgICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAob3NlYykKLSAgICAgICAmJiBiZmRfaXNfYWJzX3NlY3Rpb24gKG9zZWMtPm91dHB1dF9zZWN0aW9uKSkKLSAgICAgIHx8IChuc2VjLT5vdXRwdXRfc2VjdGlvbiAhPSBOVUxMCi0JICAmJiAhIGJmZF9pc19hYnNfc2VjdGlvbiAobnNlYykKLQkgICYmIGJmZF9pc19hYnNfc2VjdGlvbiAobnNlYy0+b3V0cHV0X3NlY3Rpb24pKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBlaW5mbyAoXygiJVglQzogbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiBgJVQnXG4iKSwKLQkgbmJmZCwgbnNlYywgbnZhbCwgbmFtZSk7Ci0gIGlmIChvYmZkICE9IChiZmQgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJUQ6IGZpcnN0IGRlZmluZWQgaGVyZVxuIiksIG9iZmQsIG9zZWMsIG92YWwpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyBhIGRlZmluaXRpb24gb2YgYSBjb21tb24gc3ltYm9sLCBvcgotICAgd2hlbiBhIGNvbW1vbiBzeW1ib2wgaXMgZm91bmQgZm9yIGEgc3ltYm9sIHRoYXQgaXMgYWxyZWFkeSBkZWZpbmVkLAotICAgb3Igd2hlbiB0d28gY29tbW9uIHN5bWJvbHMgYXJlIGZvdW5kLiAgV2Ugb25seSBkbyBzb21ldGhpbmcgaWYKLSAgIC13YXJuLWNvbW1vbiB3YXMgdXNlZC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLW11bHRpcGxlX2NvbW1vbiAoaW5mbywgbmFtZSwgb2JmZCwgb3R5cGUsIG9zaXplLCBuYmZkLCBudHlwZSwgbnNpemUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKm9iZmQ7Ci0gICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG90eXBlOwotICAgICBiZmRfdm1hIG9zaXplOwotICAgICBiZmQgKm5iZmQ7Ci0gICAgIGVudW0gYmZkX2xpbmtfaGFzaF90eXBlIG50eXBlOwotICAgICBiZmRfdm1hIG5zaXplOwotewotICBpZiAoISBjb25maWcud2Fybl9jb21tb24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG50eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotICAgICAgfHwgbnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrCi0gICAgICB8fCBudHlwZSA9PSBiZmRfbGlua19oYXNoX2luZGlyZWN0KQotICAgIHsKLSAgICAgIEFTU0VSVCAob3R5cGUgPT0gYmZkX2xpbmtfaGFzaF9jb21tb24pOwotICAgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBkZWZpbml0aW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBjb21tb25cbiIpLAotCSAgICAgbmJmZCwgbmFtZSk7Ci0gICAgICBpZiAob2JmZCAhPSBOVUxMKQotCWVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG90eXBlID09IGJmZF9saW5rX2hhc2hfZGVmaW5lZAotCSAgIHx8IG90eXBlID09IGJmZF9saW5rX2hhc2hfZGVmd2VhawotCSAgIHx8IG90eXBlID09IGJmZF9saW5rX2hhc2hfaW5kaXJlY3QpCi0gICAgewotICAgICAgQVNTRVJUIChudHlwZSA9PSBiZmRfbGlua19oYXNoX2NvbW1vbik7Ci0gICAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRkZW4gYnkgZGVmaW5pdGlvblxuIiksCi0JICAgICBuYmZkLCBuYW1lKTsKLSAgICAgIGlmIChvYmZkICE9IE5VTEwpCi0JZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBkZWZpbmVkIGhlcmVcbiIpLCBvYmZkKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBBU1NFUlQgKG90eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uICYmIG50eXBlID09IGJmZF9saW5rX2hhc2hfY29tbW9uKTsKLSAgICAgIGlmIChvc2l6ZSA+IG5zaXplKQotCXsKLQkgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGRlbiBieSBsYXJnZXIgY29tbW9uXG4iKSwKLQkJIG5iZmQsIG5hbWUpOwotCSAgaWYgKG9iZmQgIT0gTlVMTCkKLQkgICAgZWluZm8gKF8oIiVCOiB3YXJuaW5nOiBsYXJnZXIgY29tbW9uIGlzIGhlcmVcbiIpLCBvYmZkKTsKLQl9Ci0gICAgICBlbHNlIGlmIChuc2l6ZSA+IG9zaXplKQotCXsKLQkgIGVpbmZvIChfKCIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBzbWFsbGVyIGNvbW1vblxuIiksCi0JCSBuYmZkLCBuYW1lKTsKLQkgIGlmIChvYmZkICE9IE5VTEwpCi0JICAgIGVpbmZvIChfKCIlQjogd2FybmluZzogc21hbGxlciBjb21tb24gaXMgaGVyZVxuIiksIG9iZmQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IG11bHRpcGxlIGNvbW1vbiBvZiBgJVQnXG4iKSwgbmJmZCwgbmFtZSk7Ci0JICBpZiAob2JmZCAhPSBOVUxMKQotCSAgICBlaW5mbyAoXygiJUI6IHdhcm5pbmc6IHByZXZpb3VzIGNvbW1vbiBpcyBoZXJlXG4iKSwgb2JmZCk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBCRkQgaGFzIGRpc2NvdmVyZWQgYSBzZXQgZWxlbWVudC4gIEggaXMgdGhlCi0gICBlbnRyeSBpbiB0aGUgbGlua2VyIGhhc2ggdGFibGUgZm9yIHRoZSBzZXQuICBTRUNUSU9OIGFuZCBWQUxVRQotICAgcmVwcmVzZW50IGEgdmFsdWUgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBzZXQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi1hZGRfdG9fc2V0IChpbmZvLCBoLCByZWxvYywgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLSAgICAgYmZkX3JlbG9jX2NvZGVfcmVhbF90eXBlIHJlbG9jOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAoY29uZmlnLndhcm5fY29uc3RydWN0b3JzKQotICAgIGVpbmZvIChfKCIlUDogd2FybmluZzogZ2xvYmFsIGNvbnN0cnVjdG9yICVzIHVzZWRcbiIpLAotCSAgIGgtPnJvb3Quc3RyaW5nKTsKLQotICBpZiAoISBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHJldHVybiB0cnVlOwotCi0gIGxkY3Rvcl9hZGRfc2V0X2VudHJ5IChoLCByZWxvYywgKGNvbnN0IGNoYXIgKikgTlVMTCwgc2VjdGlvbiwgdmFsdWUpOwotCi0gIGlmIChoLT50eXBlID09IGJmZF9saW5rX2hhc2hfbmV3KQotICAgIHsKLSAgICAgIGgtPnR5cGUgPSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZDsKLSAgICAgIGgtPnUudW5kZWYuYWJmZCA9IGFiZmQ7Ci0gICAgICAvKiBXZSBkb24ndCBjYWxsIGJmZF9saW5rX2FkZF91bmRlZiB0byBhZGQgdGhpcyB0byB0aGUgbGlzdCBvZgotCSB1bmRlZmluZWQgc3ltYm9scyBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBkZWZpbmUgaXQKLQkgb3Vyc2VsdmVzLiAgKi8KLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gQkZEIGhhcyBkaXNjb3ZlcmVkIGEgY29uc3RydWN0b3IuICBUaGlzIGlzIG9ubHkKLSAgIGNhbGxlZCBmb3Igc29tZSBvYmplY3QgZmlsZSBmb3JtYXRzLS10aG9zZSB3aGljaCBkbyBub3QgaGFuZGxlCi0gICBjb25zdHJ1Y3RvcnMgaW4gc29tZSBtb3JlIGNsZXZlciBmYXNoaW9uLiAgVGhpcyBpcyBzaW1pbGFyIHRvCi0gICBhZGRpbmcgYW4gZWxlbWVudCB0byBhIHNldCwgYnV0IGxlc3MgZ2VuZXJhbC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1jb25zdHJ1Y3Rvcl9jYWxsYmFjayAoaW5mbywgY29uc3RydWN0b3IsIG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgYm9vbGVhbiBjb25zdHJ1Y3RvcjsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgY2hhciAqczsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIGNoYXIgc2V0X25hbWVbMSArIHNpemVvZiAiX19DVE9SX0xJU1RfXyJdOwotCi0gIGlmIChjb25maWcud2Fybl9jb25zdHJ1Y3RvcnMpCi0gICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBnbG9iYWwgY29uc3RydWN0b3IgJXMgdXNlZFxuIiksIG5hbWUpOwotCi0gIGlmICghIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgLyogRW5zdXJlIHRoYXQgQkZEX1JFTE9DX0NUT1IgZXhpc3RzIG5vdywgc28gdGhhdCB3ZSBjYW4gZ2l2ZSBhCi0gICAgIHVzZWZ1bCBlcnJvciBtZXNzYWdlLiAgKi8KLSAgaWYgKGJmZF9yZWxvY190eXBlX2xvb2t1cCAob3V0cHV0X2JmZCwgQkZEX1JFTE9DX0NUT1IpID09IE5VTEwKLSAgICAgICYmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlCi0JICB8fCBiZmRfcmVsb2NfdHlwZV9sb29rdXAgKGFiZmQsIEJGRF9SRUxPQ19DVE9SKSA9PSBOVUxMKSkKLSAgICBlaW5mbyAoXygiJVAlRjogQkZEIGJhY2tlbmQgZXJyb3I6IEJGRF9SRUxPQ19DVE9SIHVuc3VwcG9ydGVkXG4iKSk7Ci0KLSAgcyA9IHNldF9uYW1lOwotICBpZiAoYmZkX2dldF9zeW1ib2xfbGVhZGluZ19jaGFyIChhYmZkKSAhPSAnXDAnKQotICAgICpzKysgPSBiZmRfZ2V0X3N5bWJvbF9sZWFkaW5nX2NoYXIgKGFiZmQpOwotICBpZiAoY29uc3RydWN0b3IpCi0gICAgc3RyY3B5IChzLCAiX19DVE9SX0xJU1RfXyIpOwotICBlbHNlCi0gICAgc3RyY3B5IChzLCAiX19EVE9SX0xJU1RfXyIpOwotCi0gIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAoaW5mby0+aGFzaCwgc2V0X25hbWUsIHRydWUsIHRydWUsIHRydWUpOwotICBpZiAoaCA9PSAoc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotICBpZiAoaC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX25ldykKLSAgICB7Ci0gICAgICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQ7Ci0gICAgICBoLT51LnVuZGVmLmFiZmQgPSBhYmZkOwotICAgICAgLyogV2UgZG9uJ3QgY2FsbCBiZmRfbGlua19hZGRfdW5kZWYgdG8gYWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2YKLQkgdW5kZWZpbmVkIHN5bWJvbHMgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gZGVmaW5lIGl0Ci0JIG91cnNlbHZlcy4gICovCi0gICAgfQotCi0gIGxkY3Rvcl9hZGRfc2V0X2VudHJ5IChoLCBCRkRfUkVMT0NfQ1RPUiwgbmFtZSwgc2VjdGlvbiwgdmFsdWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQSBzdHJ1Y3R1cmUgdXNlZCBieSB3YXJuaW5nX2NhbGxiYWNrIHRvIHBhc3MgaW5mb3JtYXRpb24gdGhyb3VnaAotICAgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbwotewotICBib29sZWFuIGZvdW5kOwotICBjb25zdCBjaGFyICp3YXJuaW5nOwotICBjb25zdCBjaGFyICpzeW1ib2w7Ci0gIGFzeW1ib2wgKiphc3ltYm9sczsKLX07Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSByZWZlcmVuY2UgdG8gYSB3YXJuaW5nIHN5bWJvbC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGJvb2xlYW4KLXdhcm5pbmdfY2FsbGJhY2sgKGluZm8sIHdhcm5pbmcsIHN5bWJvbCwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKndhcm5pbmc7Ci0gICAgIGNvbnN0IGNoYXIgKnN5bWJvbDsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICAvKiBUaGlzIGlzIGEgaGFjayB0byBzdXBwb3J0IHdhcm5fbXVsdGlwbGVfZ3AuICBGSVhNRTogVGhpcyBzaG91bGQKLSAgICAgaGF2ZSBhIGNsZWFuZXIgaW50ZXJmYWNlLCBidXQgd2hhdD8gICovCi0gIGlmICghIGNvbmZpZy53YXJuX211bHRpcGxlX2dwCi0gICAgICAmJiBzdHJjbXAgKHdhcm5pbmcsICJ1c2luZyBtdWx0aXBsZSBncCB2YWx1ZXMiKSA9PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChzZWN0aW9uICE9IE5VTEwpCi0gICAgZWluZm8gKCIlQzogJXNcbiIsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MsIHdhcm5pbmcpOwotICBlbHNlIGlmIChhYmZkID09IE5VTEwpCi0gICAgZWluZm8gKCIlUDogJXNcbiIsIHdhcm5pbmcpOwotICBlbHNlIGlmIChzeW1ib2wgPT0gTlVMTCkKLSAgICBlaW5mbyAoIiVCOiAlc1xuIiwgYWJmZCwgd2FybmluZyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLSAgICAgIGFzeW1ib2wgKiphc3ltYm9sczsKLSAgICAgIHN0cnVjdCB3YXJuaW5nX2NhbGxiYWNrX2luZm8gaW5mbzsKLQotICAgICAgLyogTG9vayB0aHJvdWdoIHRoZSByZWxvY3MgdG8gc2VlIGlmIHdlIGNhbiBmaW5kIGEgcGxhdXNpYmxlCi0JIGFkZHJlc3MuICAqLwotCi0gICAgICBlbnRyeSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGFiZmQtPnVzcmRhdGE7Ci0gICAgICBpZiAoZW50cnkgIT0gTlVMTCAmJiBlbnRyeS0+YXN5bWJvbHMgIT0gTlVMTCkKLQlhc3ltYm9scyA9IGVudHJ5LT5hc3ltYm9sczsKLSAgICAgIGVsc2UKLQl7Ci0JICBsb25nIHN5bXNpemU7Ci0JICBsb25nIHN5bWJvbF9jb3VudDsKLQotCSAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQkgIGlmIChzeW1zaXplIDwgMCkKLQkgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgYWJmZCk7Ci0JICBhc3ltYm9scyA9IChhc3ltYm9sICoqKSB4bWFsbG9jIChzeW1zaXplKTsKLQkgIHN5bWJvbF9jb3VudCA9IGJmZF9jYW5vbmljYWxpemVfc3ltdGFiIChhYmZkLCBhc3ltYm9scyk7Ci0JICBpZiAoc3ltYm9sX2NvdW50IDwgMCkKLQkgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iKSwgYWJmZCk7Ci0JICBpZiAoZW50cnkgIT0gTlVMTCkKLQkgICAgewotCSAgICAgIGVudHJ5LT5hc3ltYm9scyA9IGFzeW1ib2xzOwotCSAgICAgIGVudHJ5LT5zeW1ib2xfY291bnQgPSBzeW1ib2xfY291bnQ7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluZm8uZm91bmQgPSBmYWxzZTsKLSAgICAgIGluZm8ud2FybmluZyA9IHdhcm5pbmc7Ci0gICAgICBpbmZvLnN5bWJvbCA9IHN5bWJvbDsKLSAgICAgIGluZm8uYXN5bWJvbHMgPSBhc3ltYm9sczsKLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgd2FybmluZ19maW5kX3JlbG9jLCAoUFRSKSAmaW5mbyk7Ci0KLSAgICAgIGlmICghIGluZm8uZm91bmQpCi0JZWluZm8gKCIlQjogJXNcbiIsIGFiZmQsIHdhcm5pbmcpOwotCi0gICAgICBpZiAoZW50cnkgPT0gTlVMTCkKLQlmcmVlIChhc3ltYm9scyk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB3YXJuaW5nX2NhbGxiYWNrIGZvciBlYWNoIHNlY3Rpb24uICBJdCBjaGVja3MgdGhlCi0gICByZWxvY3Mgb2YgdGhlIHNlY3Rpb24gdG8gc2VlIGlmIGl0IGNhbiBmaW5kIGEgcmVmZXJlbmNlIHRvIHRoZQotICAgc3ltYm9sIHdoaWNoIHRyaWdnZXJlZCB0aGUgd2FybmluZy4gIElmIGl0IGNhbiwgaXQgdXNlcyB0aGUgcmVsb2MKLSAgIHRvIGdpdmUgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIGEgZmlsZSBhbmQgbGluZSBudW1iZXIuICAqLwotCi1zdGF0aWMgdm9pZAotd2FybmluZ19maW5kX3JlbG9jIChhYmZkLCBzZWMsIGlhcmcpCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlYzsKLSAgICAgUFRSIGlhcmc7Ci17Ci0gIHN0cnVjdCB3YXJuaW5nX2NhbGxiYWNrX2luZm8gKmluZm8gPSAoc3RydWN0IHdhcm5pbmdfY2FsbGJhY2tfaW5mbyAqKSBpYXJnOwotICBsb25nIHJlbHNpemU7Ci0gIGFyZWxlbnQgKipyZWxwcDsKLSAgbG9uZyByZWxjb3VudDsKLSAgYXJlbGVudCAqKnAsICoqcGVuZDsKLQotICBpZiAoaW5mby0+Zm91bmQpCi0gICAgcmV0dXJuOwotCi0gIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChhYmZkLCBzZWMpOwotICBpZiAocmVsc2l6ZSA8IDApCi0gICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIpLCBhYmZkKTsKLSAgaWYgKHJlbHNpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcmVscHAgPSAoYXJlbGVudCAqKikgeG1hbGxvYyAocmVsc2l6ZSk7Ci0gIHJlbGNvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9yZWxvYyAoYWJmZCwgc2VjLCByZWxwcCwgaW5mby0+YXN5bWJvbHMpOwotICBpZiAocmVsY291bnQgPCAwKQotICAgIGVpbmZvIChfKCIlQiVGOiBjb3VsZCBub3QgcmVhZCByZWxvY3M6ICVFXG4iKSwgYWJmZCk7Ci0KLSAgcCA9IHJlbHBwOwotICBwZW5kID0gcCArIHJlbGNvdW50OwotICBmb3IgKDsgcCA8IHBlbmQgJiYgKnAgIT0gTlVMTDsgcCsrKQotICAgIHsKLSAgICAgIGFyZWxlbnQgKnEgPSAqcDsKLQotICAgICAgaWYgKHEtPnN5bV9wdHJfcHRyICE9IE5VTEwKLQkgICYmICpxLT5zeW1fcHRyX3B0ciAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKGJmZF9hc3ltYm9sX25hbWUgKCpxLT5zeW1fcHRyX3B0ciksIGluZm8tPnN5bWJvbCkgPT0gMCkKLQl7Ci0JICAvKiBXZSBmb3VuZCBhIHJlbG9jIGZvciB0aGUgc3ltYm9sIHdlIGFyZSBsb29raW5nIGZvci4gICovCi0JICBlaW5mbyAoIiVDOiAlc1xuIiwgYWJmZCwgc2VjLCBxLT5hZGRyZXNzLCBpbmZvLT53YXJuaW5nKTsKLQkgIGluZm8tPmZvdW5kID0gdHJ1ZTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZnJlZSAocmVscHApOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIHVuZGVmaW5lZCBzeW1ib2wgaXMgZm91bmQuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBib29sZWFuCi11bmRlZmluZWRfc3ltYm9sIChpbmZvLCBuYW1lLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBzdGF0aWMgY2hhciAqZXJyb3JfbmFtZTsKLSAgc3RhdGljIHVuc2lnbmVkIGludCBlcnJvcl9jb3VudDsKLQotI2RlZmluZSBNQVhfRVJST1JTX0lOX0FfUk9XIDUKLQotICBpZiAoY29uZmlnLndhcm5fb25jZSkKLSAgICB7Ci0gICAgICBzdGF0aWMgc3RydWN0IGJmZF9oYXNoX3RhYmxlICpoYXNoOwotCi0gICAgICAvKiBPbmx5IHdhcm4gb25jZSBhYm91dCBhIHBhcnRpY3VsYXIgdW5kZWZpbmVkIHN5bWJvbC4gICovCi0KLSAgICAgIGlmIChoYXNoID09IE5VTEwpCi0JewotCSAgaGFzaCA9ICgoc3RydWN0IGJmZF9oYXNoX3RhYmxlICopCi0JCSAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2hhc2hfdGFibGUpKSk7Ci0JICBpZiAoISBiZmRfaGFzaF90YWJsZV9pbml0IChoYXNoLCBiZmRfaGFzaF9uZXdmdW5jKSkKLQkgICAgZWluZm8gKF8oIiVGJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIikpOwotCX0KLQotICAgICAgaWYgKGJmZF9oYXNoX2xvb2t1cCAoaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKQotCXJldHVybiB0cnVlOwotCi0gICAgICBpZiAoYmZkX2hhc2hfbG9va3VwIChoYXNoLCBuYW1lLCB0cnVlLCB0cnVlKSA9PSBOVUxMKQotCWVpbmZvIChfKCIlRiVQOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIikpOwotICAgIH0KLQotICAvKiBXZSBuZXZlciBwcmludCBtb3JlIHRoYW4gYSByZWFzb25hYmxlIG51bWJlciBvZiBlcnJvcnMgaW4gYSByb3cKLSAgICAgZm9yIGEgc2luZ2xlIHN5bWJvbC4gICovCi0gIGlmIChlcnJvcl9uYW1lICE9IChjaGFyICopIE5VTEwKLSAgICAgICYmIHN0cmNtcCAobmFtZSwgZXJyb3JfbmFtZSkgPT0gMCkKLSAgICArK2Vycm9yX2NvdW50OwotICBlbHNlCi0gICAgewotICAgICAgZXJyb3JfY291bnQgPSAwOwotICAgICAgaWYgKGVycm9yX25hbWUgIT0gKGNoYXIgKikgTlVMTCkKLQlmcmVlIChlcnJvcl9uYW1lKTsKLSAgICAgIGVycm9yX25hbWUgPSBidXlzdHJpbmcgKG5hbWUpOwotICAgIH0KLQotICBpZiAoc2VjdGlvbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChlcnJvcl9jb3VudCA8IE1BWF9FUlJPUlNfSU5fQV9ST1cpCi0JZWluZm8gKF8oIiVYJUM6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIiksCi0JICAgICAgIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MsIG5hbWUpOwotICAgICAgZWxzZSBpZiAoZXJyb3JfY291bnQgPT0gTUFYX0VSUk9SU19JTl9BX1JPVykKLQllaW5mbyAoXygiJUQ6IG1vcmUgdW5kZWZpbmVkIHJlZmVyZW5jZXMgdG8gYCVUJyBmb2xsb3dcbiIpLAotCSAgICAgICBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzLCBuYW1lKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JfY291bnQgPCBNQVhfRVJST1JTX0lOX0FfUk9XKQotCWVpbmZvIChfKCIlWCVCOiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGAlVCdcbiIpLAotCSAgICAgICBhYmZkLCBuYW1lKTsKLSAgICAgIGVsc2UgaWYgKGVycm9yX2NvdW50ID09IE1BWF9FUlJPUlNfSU5fQV9ST1cpCi0JZWluZm8gKF8oIiVCOiBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzIHRvIGAlVCcgZm9sbG93XG4iKSwKLQkgICAgICAgYWJmZCwgbmFtZSk7Ci0gICAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcmVsb2Mgb3ZlcmZsb3dzLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcmVsb2Nfb3ZlcmZsb3cgKGluZm8sIG5hbWUsIHJlbG9jX25hbWUsIGFkZGVuZCwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnJlbG9jX25hbWU7Ci0gICAgIGJmZF92bWEgYWRkZW5kOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIGFkZHJlc3M7Ci17Ci0gIGlmIChhYmZkID09IChiZmQgKikgTlVMTCkKLSAgICBlaW5mbyAoXygiJVAlWDogZ2VuZXJhdGVkIikpOwotICBlbHNlCi0gICAgZWluZm8gKCIlWCVDOiIsIGFiZmQsIHNlY3Rpb24sIGFkZHJlc3MpOwotICBlaW5mbyAoXygiIHJlbG9jYXRpb24gdHJ1bmNhdGVkIHRvIGZpdDogJXMgJVQiKSwgcmVsb2NfbmFtZSwgbmFtZSk7Ci0gIGlmIChhZGRlbmQgIT0gMCkKLSAgICBlaW5mbyAoIisldiIsIGFkZGVuZCk7Ci0gIGVpbmZvICgiXG4iKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBkYW5nZXJvdXMgcmVsb2NhdGlvbiBpcyBtYWRlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotcmVsb2NfZGFuZ2Vyb3VzIChpbmZvLCBtZXNzYWdlLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKQotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLSAgICAgY29uc3QgY2hhciAqbWVzc2FnZTsKLSAgICAgYmZkICphYmZkOwotICAgICBhc2VjdGlvbiAqc2VjdGlvbjsKLSAgICAgYmZkX3ZtYSBhZGRyZXNzOwotewotICBpZiAoYWJmZCA9PSAoYmZkICopIE5VTEwpCi0gICAgZWluZm8gKF8oIiVQJVg6IGdlbmVyYXRlZCIpKTsKLSAgZWxzZQotICAgIGVpbmZvICgiJVglQzoiLCBhYmZkLCBzZWN0aW9uLCBhZGRyZXNzKTsKLSAgZWluZm8gKF8oImRhbmdlcm91cyByZWxvY2F0aW9uOiAlc1xuIiksIG1lc3NhZ2UpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHJlbG9jIGlzIGJlaW5nIGdlbmVyYXRlZCBhdHRhY2hlZCB0byBhIHN5bWJvbAotICAgdGhhdCBpcyBub3QgYmVpbmcgb3V0cHV0LiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotdW5hdHRhY2hlZF9yZWxvYyAoaW5mbywgbmFtZSwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcykKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgIGJmZCAqYWJmZDsKLSAgICAgYXNlY3Rpb24gKnNlY3Rpb247Ci0gICAgIGJmZF92bWEgYWRkcmVzczsKLXsKLSAgaWYgKGFiZmQgPT0gKGJmZCAqKSBOVUxMKQotICAgIGVpbmZvIChfKCIlUCVYOiBnZW5lcmF0ZWQiKSk7Ci0gIGVsc2UKLSAgICBlaW5mbyAoIiVYJUM6IiwgYWJmZCwgc2VjdGlvbiwgYWRkcmVzcyk7Ci0gIGVpbmZvIChfKCIgcmVsb2MgcmVmZXJzIHRvIHN5bWJvbCBgJVQnIHdoaWNoIGlzIG5vdCBiZWluZyBvdXRwdXRcbiIpLCBuYW1lKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGlmIGxpbmtfaW5mby5ub3RpY2VfYWxsIGlzIHNldCwgb3Igd2hlbiBhIHN5bWJvbCBpbgotICAgbGlua19pbmZvLm5vdGljZV9oYXNoIGlzIGZvdW5kLiAgU3ltYm9scyBhcmUgcHV0IGluIG5vdGljZV9oYXNoCi0gICB1c2luZyB0aGUgLXkgb3B0aW9uLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLW5vdGljZSAoaW5mbywgbmFtZSwgYWJmZCwgc2VjdGlvbiwgdmFsdWUpCi0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWN0aW9uOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBpZiAoISBpbmZvLT5ub3RpY2VfYWxsCi0gICAgICB8fCAoaW5mby0+bm90aWNlX2hhc2ggIT0gTlVMTAotCSAgJiYgYmZkX2hhc2hfbG9va3VwIChpbmZvLT5ub3RpY2VfaGFzaCwgbmFtZSwgZmFsc2UsIGZhbHNlKSAhPSBOVUxMKSkKLSAgICB7Ci0gICAgICBpZiAoYmZkX2lzX3VuZF9zZWN0aW9uIChzZWN0aW9uKSkKLQllaW5mbyAoIiVCOiByZWZlcmVuY2UgdG8gJXNcbiIsIGFiZmQsIG5hbWUpOwotICAgICAgZWxzZQotCWVpbmZvICgiJUI6IGRlZmluaXRpb24gb2YgJXNcbiIsIGFiZmQsIG5hbWUpOwotICAgIH0KLQotICBpZiAoY29tbWFuZF9saW5lLmNyZWYgfHwgbm9jcm9zc3JlZl9saXN0ICE9IE5VTEwpCi0gICAgYWRkX2NyZWYgKG5hbWUsIGFiZmQsIHNlY3Rpb24sIHZhbHVlKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2xkL2xkbWFpbi5oIGIvbGQvbGRtYWluLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MWJmM2QuLjAwMDAwMDAKLS0tIGEvbGQvbGRtYWluLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBsZG1haW4uaCAtCi0gICBDb3B5cmlnaHQgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDEsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExETUFJTl9ICi0jZGVmaW5lIExETUFJTl9ICi0KLWV4dGVybiBjaGFyICpwcm9ncmFtX25hbWU7Ci1leHRlcm4gYmZkICpvdXRwdXRfYmZkOwotZXh0ZXJuIGNoYXIgKmRlZmF1bHRfdGFyZ2V0OwotZXh0ZXJuIGJvb2xlYW4gdHJhY2VfZmlsZXM7Ci1leHRlcm4gYm9vbGVhbiB0cmFjZV9maWxlX3RyaWVzOwotZXh0ZXJuIGJvb2xlYW4gdmVyc2lvbl9wcmludGVkOwotZXh0ZXJuIGJvb2xlYW4gd2hvbGVfYXJjaGl2ZTsKLWV4dGVybiBib29sZWFuIGRlbWFuZ2xpbmc7Ci1leHRlcm4gaW50IGdfc3dpdGNoX3ZhbHVlOwotZXh0ZXJuIGNvbnN0IGNoYXIgKm91dHB1dF9maWxlbmFtZTsKLWV4dGVybiBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyBsaW5rX2luZm87Ci0KLWV4dGVybiB2b2lkIGFkZF95c3ltIFBBUkFNUyAoKGNvbnN0IGNoYXIgKikpOwotZXh0ZXJuIHZvaWQgYWRkX3dyYXAgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1leHRlcm4gdm9pZCBhZGRfa2VlcHN5bXNfZmlsZSBQQVJBTVMgKChjb25zdCBjaGFyICpmaWxlbmFtZSkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL2xkbWlzYy5jIGIvbGQvbGRtaXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYWIyMjguLjAwMDAwMDAKLS0tIGEvbGQvbGRtaXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLyogbGRtaXNjLmMKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDE5OTkKLSAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBTdGV2ZSBDaGFtYmVybGFpbiBvZiBDeWdudXMgU3VwcG9ydC4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImRlbWFuZ2xlLmgiCi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNkZWZpbmUgVVNFX1NUREFSRyAxCi0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNkZWZpbmUgVVNFX1NUREFSRyAwCi0jZW5kaWYKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotCi1zdGF0aWMgdm9pZCB2ZmluZm8gUEFSQU1TICgoRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpKTsKLQotLyoKLSAlJSBsaXRlcmFsICUKLSAlRiBlcnJvciBpcyBmYXRhbAotICVQIHByaW50IHByb2dyYW0gbmFtZQotICVTIHByaW50IHNjcmlwdCBmaWxlIGFuZCBsaW5lbnVtYmVyCi0gJUUgY3VycmVudCBiZmQgZXJyb3Igb3IgZXJybm8KLSAlSSBmaWxlbmFtZSBmcm9tIGEgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZQotICVCIGZpbGVuYW1lIGZyb20gYSBiZmQKLSAlVCBzeW1ib2wgbmFtZQotICVYIG5vIG9iamVjdCBvdXRwdXQsIGZhaWwgcmV0dXJuCi0gJVYgaGV4IGJmZF92bWEKLSAldiBoZXggYmZkX3ZtYSwgbm8gbGVhZGluZyB6ZXJvcwotICVXIGhleCBiZmRfdm1hIHdpdGggMHggd2l0aCBubyBsZWFkaW5nIHplcm9zIHRha2luZyB1cCA4IHNwYWNlcwotICVDIGNsZXZlciBmaWxlbmFtZTpsaW5lbnVtYmVyIHdpdGggZnVuY3Rpb24KLSAlRCBsaWtlICVDLCBidXQgbm8gZnVuY3Rpb24gbmFtZQotICVHIGxpa2UgJUQsIGJ1dCBvbmx5IGZ1bmN0aW9uIG5hbWUKLSAlUiBpbmZvIGFib3V0IGEgcmVsZW50Ci0gJXMgYXJiaXRyYXJ5IHN0cmluZywgbGlrZSBwcmludGYKLSAlZCBpbnRlZ2VyLCBsaWtlIHByaW50ZgotICV1IGludGVnZXIsIGxpa2UgcHJpbnRmCi0qLwotCi1jaGFyICoKLWRlbWFuZ2xlIChzdHJpbmcpCi0gICAgIGNvbnN0IGNoYXIgKnN0cmluZzsKLXsKLSAgY2hhciAqcmVzOwotCi0gIGlmIChvdXRwdXRfYmZkICE9IE5VTEwKLSAgICAgICYmIGJmZF9nZXRfc3ltYm9sX2xlYWRpbmdfY2hhciAob3V0cHV0X2JmZCkgPT0gc3RyaW5nWzBdKQotICAgICsrc3RyaW5nOwotCi0gIC8qIFRoaXMgaXMgYSBoYWNrIGZvciBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIG9uIFhDT0ZGLCBvciB0aGUgTVMgUEUgICAqLwotICAvKiBmb3JtYXQuICBYY29mZiBoYXMgYSBzaW5nbGUgJy4nLCB3aGlsZSB0aGUgTlQgUEUgZm9yIFBQQyBoYXMgJy4uJy4gKi8KLSAgLyogU28gd2UgcmVtb3ZlIGFsbCBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHdoaWxlKHN0cmluZ1swXSA9PSAnLicpCi0gICAgKytzdHJpbmc7Ci0KLSAgcmVzID0gY3BsdXNfZGVtYW5nbGUgKHN0cmluZywgRE1HTF9BTlNJIHwgRE1HTF9QQVJBTVMpOwotICByZXR1cm4gcmVzID8gcmVzIDogeHN0cmR1cCAoc3RyaW5nKTsKLX0KLQotc3RhdGljIHZvaWQKLXZmaW5mbyAoZnAsIGZtdCwgYXJnKQotICAgICBGSUxFICpmcDsKLSAgICAgY29uc3QgY2hhciAqZm10OwotICAgICB2YV9saXN0IGFyZzsKLXsKLSAgYm9vbGVhbiBmYXRhbCA9IGZhbHNlOwotCi0gIHdoaWxlICgqZm10ICE9ICdcMCcpCi0gICAgewotICAgICAgd2hpbGUgKCpmbXQgIT0gJyUnICYmICpmbXQgIT0gJ1wwJykgCi0JewotCSAgcHV0YyAoKmZtdCwgZnApOwotCSAgZm10Kys7Ci0JfQotCi0gICAgICBpZiAoKmZtdCA9PSAnJScpIAotCXsKLQkgIGZtdCArKzsKLQkgIHN3aXRjaCAoKmZtdCsrKSAKLQkgICAgewotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYgKGZwLCIlJSVjIiwgZm10Wy0xXSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnJSc6Ci0JICAgICAgLyogbGl0ZXJhbCAlICovCi0JICAgICAgcHV0YyAoJyUnLCBmcCk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnWCc6Ci0JICAgICAgLyogbm8gb2JqZWN0IG91dHB1dCwgZmFpbCByZXR1cm4gKi8KLQkgICAgICBjb25maWcubWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnVic6Ci0JICAgICAgLyogaGV4IGJmZF92bWEgKi8KLQkgICAgICB7Ci0JCWJmZF92bWEgdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7Ci0JCWZwcmludGZfdm1hIChmcCwgdmFsdWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd2JzoKLQkgICAgICAvKiBoZXggYmZkX3ZtYSwgbm8gbGVhZGluZyB6ZXJvcyAqLwotCSAgICAgIHsKLQkJY2hhciBidWZbMTAwXTsKLQkJY2hhciAqcCA9IGJ1ZjsKLQkJYmZkX3ZtYSB2YWx1ZSA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQkJc3ByaW50Zl92bWEgKHAsIHZhbHVlKTsKLQkJd2hpbGUgKCpwID09ICcwJykKLQkJICBwKys7Ci0JCWlmICghKnApCi0JCSAgcC0tOwotCQlmcHV0cyAocCwgZnApOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdXJzoKLQkgICAgICAvKiBoZXggYmZkX3ZtYSB3aXRoIDB4IHdpdGggbm8gbGVhZGluZyB6ZXJvZXMgdGFraW5nIHVwCi0gICAgICAgICAgICAgICAgIDggc3BhY2VzLiAgKi8KLQkgICAgICB7Ci0JCWNoYXIgYnVmWzEwMF07Ci0JCWJmZF92bWEgdmFsdWU7Ci0JCWNoYXIgKnA7Ci0JCWludCBsZW47Ci0KLQkJdmFsdWUgPSB2YV9hcmcgKGFyZywgYmZkX3ZtYSk7Ci0JCXNwcmludGZfdm1hIChidWYsIHZhbHVlKTsKLQkJZm9yIChwID0gYnVmOyAqcCA9PSAnMCc7ICsrcCkKLQkJICA7Ci0JCWlmICgqcCA9PSAnXDAnKQotCQkgIC0tcDsKLQkJbGVuID0gc3RybGVuIChwKTsKLQkJd2hpbGUgKGxlbiA8IDgpCi0JCSAgewotCQkgICAgcHV0YyAoJyAnLCBmcCk7Ci0JCSAgICArK2xlbjsKLQkJICB9Ci0JCWZwcmludGYgKGZwLCAiMHglcyIsIHApOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdUJzoKLQkgICAgICAvKiBTeW1ib2wgbmFtZS4gICovCi0JICAgICAgewotCQljb25zdCBjaGFyICpuYW1lID0gdmFfYXJnIChhcmcsIGNvbnN0IGNoYXIgKik7Ci0KLQkJaWYgKG5hbWUgPT0gKGNvbnN0IGNoYXIgKikgTlVMTCB8fCAqbmFtZSA9PSAwKQotCQkgIGZwcmludGYgKGZwLCBfKCJubyBzeW1ib2wiKSk7Ci0JCWVsc2UgaWYgKCEgZGVtYW5nbGluZykKLQkJICBmcHJpbnRmIChmcCwgIiVzIiwgbmFtZSk7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBjaGFyICpkZW1hbmdsZWQ7Ci0KLQkJICAgIGRlbWFuZ2xlZCA9IGRlbWFuZ2xlIChuYW1lKTsKLQkJICAgIGZwcmludGYgKGZwLCAiJXMiLCBkZW1hbmdsZWQpOwotCQkgICAgZnJlZSAoZGVtYW5nbGVkKTsKLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0InOgotCSAgICAgIC8qIGZpbGVuYW1lIGZyb20gYSBiZmQgKi8KLQkgICAgICB7IAotCQliZmQgKmFiZmQgPSB2YV9hcmcgKGFyZywgYmZkICopOwotCQlpZiAoYWJmZC0+bXlfYXJjaGl2ZSkKLQkJICBmcHJpbnRmIChmcCwgIiVzKCVzKSIsIGFiZmQtPm15X2FyY2hpdmUtPmZpbGVuYW1lLAotCQkJICAgYWJmZC0+ZmlsZW5hbWUpOwotCQllbHNlCi0JCSAgZnByaW50ZiAoZnAsICIlcyIsIGFiZmQtPmZpbGVuYW1lKTsKLQkgICAgICB9Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnRic6Ci0JICAgICAgLyogZXJyb3IgaXMgZmF0YWwgKi8KLQkgICAgICBmYXRhbCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnUCc6Ci0JICAgICAgLyogcHJpbnQgcHJvZ3JhbSBuYW1lICovCi0JICAgICAgZnByaW50ZiAoZnAsICIlcyIsIHByb2dyYW1fbmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSAnRSc6Ci0JICAgICAgLyogY3VycmVudCBiZmQgZXJyb3Igb3IgZXJybm8gKi8KLQkgICAgICBmcHJpbnRmIChmcCwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ0knOgotCSAgICAgIC8qIGZpbGVuYW1lIGZyb20gYSBsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICovCi0JICAgICAgewotCQlsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICppOwotCi0JCWkgPSB2YV9hcmcgKGFyZywgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKTsKLQkJaWYgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSAhPSBOVUxMKQotCQkgIGZwcmludGYgKGZwLCAiKCVzKSIsCi0JCQkgICBiZmRfZ2V0X2ZpbGVuYW1lIChiZmRfbXlfYXJjaGl2ZSAoaS0+dGhlX2JmZCkpKTsKLQkJZnByaW50ZiAoZnAsICIlcyIsIGktPmxvY2FsX3N5bV9uYW1lKTsKLQkJaWYgKGJmZF9teV9hcmNoaXZlIChpLT50aGVfYmZkKSA9PSBOVUxMCi0JCSAgICAmJiBzdHJjbXAgKGktPmxvY2FsX3N5bV9uYW1lLCBpLT5maWxlbmFtZSkgIT0gMCkKLQkJICBmcHJpbnRmIChmcCwgIiAoJXMpIiwgaS0+ZmlsZW5hbWUpOwotCSAgICAgIH0KLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdTJzoKLQkgICAgICAvKiBwcmludCBzY3JpcHQgZmlsZSBhbmQgbGluZW51bWJlciAqLwotCSAgICAgIGlmIChwYXJzaW5nX2RlZnN5bSkKLQkJZnByaW50ZiAoZnAsICItLWRlZnN5bSAlcyIsIGxleF9zdHJpbmcpOwotCSAgICAgIGVsc2UgaWYgKGxkZmlsZV9pbnB1dF9maWxlbmFtZSAhPSBOVUxMKQotCQlmcHJpbnRmIChmcCwgIiVzOiV1IiwgbGRmaWxlX2lucHV0X2ZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICAgIGVsc2UKLQkJZnByaW50ZiAoZnAsIF8oImJ1aWx0IGluIGxpbmtlciBzY3JpcHQ6JXUiKSwgbGluZW5vKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICdSJzoKLQkgICAgICAvKiBQcmludCBhbGwgdGhhdCdzIGludGVyZXN0aW5nIGFib3V0IGEgcmVsZW50ICovCi0JICAgICAgewotCQlhcmVsZW50ICpyZWxlbnQgPSB2YV9hcmcgKGFyZywgYXJlbGVudCAqKTsKLQkKLQkJbGZpbmZvIChmcCwgIiVzKzB4JXYgKHR5cGUgJXMpIiwKLQkJCSgqKHJlbGVudC0+c3ltX3B0cl9wdHIpKS0+bmFtZSwKLQkJCXJlbGVudC0+YWRkZW5kLAotCQkJcmVsZW50LT5ob3d0by0+bmFtZSk7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCQotCSAgICBjYXNlICdDJzoKLQkgICAgY2FzZSAnRCc6Ci0JICAgIGNhc2UgJ0cnOgotCSAgICAgIC8qIENsZXZlciBmaWxlbmFtZTpsaW5lbnVtYmVyIHdpdGggZnVuY3Rpb24gbmFtZSBpZiBwb3NzaWJsZSwKLQkJIG9yIHNlY3Rpb24gbmFtZSBhcyBhIGxhc3QgcmVzb3J0LiAgVGhlIGFyZ3VtZW50cyBhcmUgYSBCRkQsCi0JCSBhIHNlY3Rpb24sIGFuZCBhbiBvZmZzZXQuICAqLwotCSAgICAgIHsKLQkJc3RhdGljIGJmZCAqbGFzdF9iZmQ7Ci0JCXN0YXRpYyBjaGFyICpsYXN0X2ZpbGUgPSBOVUxMOwotCQlzdGF0aWMgY2hhciAqbGFzdF9mdW5jdGlvbiA9IE5VTEw7Ci0JCWJmZCAqYWJmZDsKLQkJYXNlY3Rpb24gKnNlY3Rpb247Ci0JCWJmZF92bWEgb2Zmc2V0OwotCQlsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICplbnRyeTsKLQkJYXN5bWJvbCAqKmFzeW1ib2xzOwotCQljb25zdCBjaGFyICpmaWxlbmFtZTsKLQkJY29uc3QgY2hhciAqZnVuY3Rpb25uYW1lOwotCQl1bnNpZ25lZCBpbnQgbGluZW51bWJlcjsKLQkJYm9vbGVhbiBkaXNjYXJkX2xhc3Q7Ci0KLQkJYWJmZCA9IHZhX2FyZyAoYXJnLCBiZmQgKik7Ci0JCXNlY3Rpb24gPSB2YV9hcmcgKGFyZywgYXNlY3Rpb24gKik7Ci0JCW9mZnNldCA9IHZhX2FyZyAoYXJnLCBiZmRfdm1hKTsKLQotCQllbnRyeSA9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIGFiZmQtPnVzcmRhdGE7Ci0JCWlmIChlbnRyeSAhPSAobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSBOVUxMCi0JCSAgICAmJiBlbnRyeS0+YXN5bWJvbHMgIT0gKGFzeW1ib2wgKiopIE5VTEwpCi0JCSAgYXN5bWJvbHMgPSBlbnRyeS0+YXN5bWJvbHM7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBsb25nIHN5bXNpemU7Ci0JCSAgICBsb25nIHN5bWJvbF9jb3VudDsKLQotCQkgICAgc3ltc2l6ZSA9IGJmZF9nZXRfc3ltdGFiX3VwcGVyX2JvdW5kIChhYmZkKTsKLQkJICAgIGlmIChzeW1zaXplIDwgMCkKLQkJICAgICAgZWluZm8gKF8oIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHNcbiIpLCBhYmZkKTsKLQkJICAgIGFzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCQkgICAgc3ltYm9sX2NvdW50ID0gYmZkX2Nhbm9uaWNhbGl6ZV9zeW10YWIgKGFiZmQsIGFzeW1ib2xzKTsKLQkJICAgIGlmIChzeW1ib2xfY291bnQgPCAwKQotCQkgICAgICBlaW5mbyAoXygiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sc1xuIiksIGFiZmQpOwotCQkgICAgaWYgKGVudHJ5ICE9IChsYW5nX2lucHV0X3N0YXRlbWVudF90eXBlICopIE5VTEwpCi0JCSAgICAgIHsKLQkJCWVudHJ5LT5hc3ltYm9scyA9IGFzeW1ib2xzOwotCQkJZW50cnktPnN5bWJvbF9jb3VudCA9IHN5bWJvbF9jb3VudDsKLQkJICAgICAgfQotCQkgIH0KLQotCQlkaXNjYXJkX2xhc3QgPSB0cnVlOwotCQlpZiAoYmZkX2ZpbmRfbmVhcmVzdF9saW5lIChhYmZkLCBzZWN0aW9uLCBhc3ltYm9scywgb2Zmc2V0LAotCQkJCQkgICAmZmlsZW5hbWUsICZmdW5jdGlvbm5hbWUsCi0JCQkJCSAgICZsaW5lbnVtYmVyKSkKLQkJICB7Ci0JCSAgICBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgZm10Wy0xXSA9PSAnRycpCi0JCSAgICAgIHsKLQkJCWxmaW5mbyAoZnAsICIlQjoiLCBhYmZkKTsKLQkJCWlmIChmaWxlbmFtZSAhPSBOVUxMCi0JCQkgICAgJiYgc3RyY21wIChmaWxlbmFtZSwgYmZkX2dldF9maWxlbmFtZSAoYWJmZCkpICE9IDApCi0JCQkgIGZwcmludGYgKGZwLCAiJXM6IiwgZmlsZW5hbWUpOwotCQkJbGZpbmZvIChmcCwgIiVUIiwgZnVuY3Rpb25uYW1lKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAoZnVuY3Rpb25uYW1lICE9IE5VTEwgJiYgZm10Wy0xXSA9PSAnQycpCi0JCSAgICAgIHsKLQkJCWlmIChmaWxlbmFtZSA9PSAoY2hhciAqKSBOVUxMKQotCQkJICBmaWxlbmFtZSA9IGFiZmQtPmZpbGVuYW1lOwotCi0JCQlpZiAobGFzdF9iZmQgPT0gTlVMTAotCQkJICAgIHx8IGxhc3RfZmlsZSA9PSBOVUxMCi0JCQkgICAgfHwgbGFzdF9mdW5jdGlvbiA9PSBOVUxMCi0JCQkgICAgfHwgbGFzdF9iZmQgIT0gYWJmZAotCQkJICAgIHx8IHN0cmNtcCAobGFzdF9maWxlLCBmaWxlbmFtZSkgIT0gMAotCQkJICAgIHx8IHN0cmNtcCAobGFzdF9mdW5jdGlvbiwgZnVuY3Rpb25uYW1lKSAhPSAwKQotCQkJICB7Ci0JCQkgICAgLyogV2UgdXNlIGFiZmQtPmZpbGVuYW1lIGluIHRoaXMgaW5pdGlhbCBsaW5lLAotCQkJICAgICAgIGluIGNhc2UgZmlsZW5hbWUgaXMgYSAuaCBmaWxlIG9yIHNvbWV0aGluZwotCQkJICAgICAgIHNpbWlsYXJseSB1bmhlbHBmdWwuICAqLwotCQkJICAgIGxmaW5mbyAoZnAsIF8oIiVCOiBJbiBmdW5jdGlvbiBgJVQnOlxuIiksCi0JCQkJICAgIGFiZmQsIGZ1bmN0aW9ubmFtZSk7Ci0KLQkJCSAgICBsYXN0X2JmZCA9IGFiZmQ7Ci0JCQkgICAgaWYgKGxhc3RfZmlsZSAhPSBOVUxMKQotCQkJICAgICAgZnJlZSAobGFzdF9maWxlKTsKLQkJCSAgICBsYXN0X2ZpbGUgPSBidXlzdHJpbmcgKGZpbGVuYW1lKTsKLQkJCSAgICBpZiAobGFzdF9mdW5jdGlvbiAhPSBOVUxMKQotCQkJICAgICAgZnJlZSAobGFzdF9mdW5jdGlvbik7Ci0JCQkgICAgbGFzdF9mdW5jdGlvbiA9IGJ1eXN0cmluZyAoZnVuY3Rpb25uYW1lKTsKLQkJCSAgfQotCQkJZGlzY2FyZF9sYXN0ID0gZmFsc2U7Ci0JCQlpZiAobGluZW51bWJlciAhPSAwKQotCQkJICBmcHJpbnRmIChmcCwgIiVzOiV1IiwgZmlsZW5hbWUsIGxpbmVudW1iZXIpOwotCQkJZWxzZQotCQkJICBsZmluZm8gKGZwLCAiJXMoJXMrMHgldikiLCBmaWxlbmFtZSwgc2VjdGlvbi0+bmFtZSwKLQkJCQkgIG9mZnNldCk7Ci0JCSAgICAgIH0KLQkJICAgIGVsc2UgaWYgKGZpbGVuYW1lID09IE5VTEwKLQkJCSAgICAgfHwgc3RyY21wIChmaWxlbmFtZSwgYWJmZC0+ZmlsZW5hbWUpID09IDApCi0JCSAgICAgIHsKLQkJCWxmaW5mbyAoZnAsICIlQiglcysweCV2KSIsIGFiZmQsIHNlY3Rpb24tPm5hbWUsCi0JCQkJb2Zmc2V0KTsKLQkJCWlmIChsaW5lbnVtYmVyICE9IDApCi0JCQkgIGxmaW5mbyAoZnAsICI6JXUiLCBsaW5lbnVtYmVyKTsKLQkJICAgICAgfQotCQkgICAgZWxzZSBpZiAobGluZW51bWJlciAhPSAwKSAKLQkJICAgICAgbGZpbmZvIChmcCwgIiVCOiVzOiV1IiwgYWJmZCwgZmlsZW5hbWUsIGxpbmVudW1iZXIpOwotCQkgICAgZWxzZQotCQkgICAgICBsZmluZm8gKGZwLCAiJUIoJXMrMHgldik6JXMiLCBhYmZkLCBzZWN0aW9uLT5uYW1lLAotCQkJICAgICAgb2Zmc2V0LCBmaWxlbmFtZSk7Ci0JCSAgfQotCQllbHNlCi0JCSAgbGZpbmZvIChmcCwgIiVCKCVzKzB4JXYpIiwgYWJmZCwgc2VjdGlvbi0+bmFtZSwgb2Zmc2V0KTsKLQotCQlpZiAoZGlzY2FyZF9sYXN0KQotCQkgIHsKLQkJICAgIGxhc3RfYmZkID0gTlVMTDsKLQkJICAgIGlmIChsYXN0X2ZpbGUgIT0gTlVMTCkKLQkJICAgICAgewotCQkJZnJlZSAobGFzdF9maWxlKTsKLQkJCWxhc3RfZmlsZSA9IE5VTEw7Ci0JCSAgICAgIH0KLQkJICAgIGlmIChsYXN0X2Z1bmN0aW9uICE9IE5VTEwpCi0JCSAgICAgIHsKLQkJCWZyZWUgKGxhc3RfZnVuY3Rpb24pOwotCQkJbGFzdF9mdW5jdGlvbiA9IE5VTEw7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCQkKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgLyogYXJiaXRyYXJ5IHN0cmluZywgbGlrZSBwcmludGYgKi8KLQkgICAgICBmcHJpbnRmIChmcCwgIiVzIiwgdmFfYXJnIChhcmcsIGNoYXIgKikpOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNhc2UgJ2QnOgotCSAgICAgIC8qIGludGVnZXIsIGxpa2UgcHJpbnRmICovCi0JICAgICAgZnByaW50ZiAoZnAsICIlZCIsIHZhX2FyZyAoYXJnLCBpbnQpKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlICd1JzoKLQkgICAgICAvKiB1bnNpZ25lZCBpbnRlZ2VyLCBsaWtlIHByaW50ZiAqLwotCSAgICAgIGZwcmludGYgKGZwLCAiJXUiLCB2YV9hcmcgKGFyZywgdW5zaWduZWQgaW50KSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChmYXRhbCA9PSB0cnVlKSAKLSAgICB4ZXhpdCgxKTsKLX0KLQotLyogRm9ybWF0IGluZm8gbWVzc2FnZSBhbmQgcHJpbnQgb24gc3Rkb3V0LiAqLwotCi0vKiAoWW91IHdvdWxkIHRoaW5rIHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBqdXN0ICJpbmZvIiwgYnV0IHRoZW4geW91Ci0gICB3b3VsZCBob3NlZCBieSBMeW54T1MsIHdoaWNoIGRlZmluZXMgdGhhdCBuYW1lIGluIGl0cyBsaWJjLikgICovCi0KLXZvaWQKLSNpZiBVU0VfU1REQVJHCi1pbmZvX21zZyAoY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotaW5mb19tc2cgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBjb25zdCBjaGFyICpmbXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoc3Rkb3V0LCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotLyogKCdlJyBmb3IgZXJyb3IuKSBGb3JtYXQgaW5mbyBtZXNzYWdlIGFuZCBwcmludCBvbiBzdGRlcnIuICovCi0KLXZvaWQKLSNpZiBVU0VfU1REQVJHCi1laW5mbyAoY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotZWluZm8gKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZzsKLQotI2lmICEgVVNFX1NUREFSRwotICBjb25zdCBjaGFyICpmbXQ7Ci0KLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoc3RkZXJyLCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotdm9pZCAKLWluZm9fYXNzZXJ0IChmaWxlLCBsaW5lKQotICAgICBjb25zdCBjaGFyICpmaWxlOwotICAgICB1bnNpZ25lZCBpbnQgbGluZTsKLXsKLSAgZWluZm8gKF8oIiVGJVA6IGludGVybmFsIGVycm9yICVzICVkXG4iKSwgZmlsZSwgbGluZSk7Ci19Ci0KLWNoYXIgKgotYnV5c3RyaW5nICh4KQotICAgICBDT05TVCBjaGFyICpDT05TVCB4OwotewotICBzaXplX3QgbCA9IHN0cmxlbih4KSsxOwotICBjaGFyICpyID0geG1hbGxvYyhsKTsKLSAgbWVtY3B5KHIsIHgsbCk7Ci0gIHJldHVybiByOwotfQotCi0vKiAoJ20nIGZvciBtYXApIEZvcm1hdCBpbmZvIG1lc3NhZ2UgYW5kIHByaW50IG9uIG1hcC4gKi8KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLW1pbmZvIChjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1taW5mbyAodmFfYWxpc3QpCi0gICAgIHZhX2RjbAotI2VuZGlmCi17Ci0gIHZhX2xpc3QgYXJnOwotCi0jaWYgISBVU0VfU1REQVJHCi0gIGNvbnN0IGNoYXIgKmZtdDsKLSAgdmFfc3RhcnQgKGFyZyk7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoY29uZmlnLm1hcF9maWxlLCBmbXQsIGFyZyk7Ci0gIHZhX2VuZCAoYXJnKTsKLX0KLQotdm9pZAotI2lmIFVTRV9TVERBUkcKLWxmaW5mbyAoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0jZWxzZQotbGZpbmZvICh2YV9hbGlzdCkKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgdmFfbGlzdCBhcmc7Ci0KLSNpZiAhIFVTRV9TVERBUkcKLSAgRklMRSAqZmlsZTsKLSAgY29uc3QgY2hhciAqZm10OwotCi0gIHZhX3N0YXJ0IChhcmcpOwotICBmaWxlID0gdmFfYXJnIChhcmcsIEZJTEUgKik7Ci0gIGZtdCA9IHZhX2FyZyAoYXJnLCBjb25zdCBjaGFyICopOwotI2Vsc2UKLSAgdmFfc3RhcnQgKGFyZywgZm10KTsKLSNlbmRpZgotCi0gIHZmaW5mbyAoZmlsZSwgZm10LCBhcmcpOwotICB2YV9lbmQgKGFyZyk7Ci19Ci0MCi0vKiBGdW5jdGlvbnMgdG8gcHJpbnQgdGhlIGxpbmsgbWFwLiAgKi8KLQotdm9pZCAKLXByaW50X3NwYWNlICgpCi17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIiAiKTsKLX0KLQotdm9pZCAKLXByaW50X25sICgpCi17Ci0gIGZwcmludGYgKGNvbmZpZy5tYXBfZmlsZSwgIlxuIik7Ci19CmRpZmYgLS1naXQgYS9sZC9sZG1pc2MuaCBiL2xkL2xkbWlzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWIzYjRmLi4wMDAwMDAwCi0tLSBhL2xkL2xkbWlzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyogbGRtaXNjLmggLQotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExETUlTQ19ICi0jZGVmaW5lIExETUlTQ19ICi0KLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLWV4dGVybiB2b2lkIGVpbmZvIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci1leHRlcm4gdm9pZCBtaW5mbyBQQVJBTVMgKChjb25zdCBjaGFyICosIC4uLikpOwotZXh0ZXJuIHZvaWQgaW5mb19tc2cgUEFSQU1TICgoY29uc3QgY2hhciAqLCAuLi4pKTsKLWV4dGVybiB2b2lkIGxmaW5mbyBQQVJBTVMgKChGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKSk7Ci0jZWxzZQotLyogVkFSQVJHUyovCi1leHRlcm4gdm9pZCBlaW5mbyAoKTsKLS8qIFZBUkFSR1MqLwotZXh0ZXJuIHZvaWQgbWluZm8gKCk7Ci0vKiBWQVJBUkdTKi8KLWV4dGVybiB2b2lkIGluZm9fbXNnICgpOwotLypWQVJBUkdTKi8KLWV4dGVybiB2b2lkIGxmaW5mbyAoKTsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCBpbmZvX2Fzc2VydCBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCkpOwotZXh0ZXJuIHZvaWQgeXllcnJvciBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLWV4dGVybiBQVFIgeG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiBQVFIgeHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLWV4dGVybiB2b2lkIHhleGl0IFBBUkFNUyAoKGludCkpOwotZXh0ZXJuIGNoYXIgKmJ1eXN0cmluZyBQQVJBTVMgKChDT05TVCBjaGFyICpDT05TVCkpOwotCi0jZGVmaW5lIEFTU0VSVCh4KSBcCi1kbyB7IGlmICghKHgpKSBpbmZvX2Fzc2VydChfX0ZJTEVfXyxfX0xJTkVfXyk7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRkFJTCgpIFwKLWRvIHsgaW5mb19hc3NlcnQoX19GSUxFX18sX19MSU5FX18pOyB9IHdoaWxlICgwKQotCi1leHRlcm4gdm9pZCBwcmludF9zcGFjZSBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gdm9pZCBwcmludF9ubCBQQVJBTVMgKCh2b2lkKSk7Ci1leHRlcm4gY2hhciAqZGVtYW5nbGUgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvbGR2ZXIuYyBiL2xkL2xkdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNjAwYTIuLjAwMDAwMDAKLS0tIGEvbGQvbGR2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIGxkdmVyLmMgLS0gUHJpbnQgbGlua2VyIHZlcnNpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDkyLCA5MywgOTQsIDk1LCAxOTk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGR2ZXIuaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLQotY29uc3QgY2hhciAqbGRfcHJvZ3JhbV92ZXJzaW9uID0gVkVSU0lPTjsKLQotdm9pZAotbGR2ZXJzaW9uIChub2lzeSkKLSAgICAgaW50IG5vaXN5OwotewotICBmcHJpbnRmIChzdGRvdXQsIF8oIkdOVSBsZCB2ZXJzaW9uICVzICh3aXRoIEJGRCAlcylcbiIpLAotCSAgIGxkX3Byb2dyYW1fdmVyc2lvbiwgQkZEX1ZFUlNJT04pOwotCi0gIGlmIChub2lzeSkgCi0gICAgewotICAgICAgbGRfZW11bGF0aW9uX3hmZXJfdHlwZSAqKnB0ciA9IGxkX2VtdWxhdGlvbnM7Ci0gICAgCi0gICAgICBwcmludGYgKF8oIiAgU3VwcG9ydGVkIGVtdWxhdGlvbnM6XG4iKSk7Ci0gICAgICB3aGlsZSAoKnB0cikgCi0JewotCSAgcHJpbnRmICgiICAgJXNcbiIsICgqcHRyKS0+ZW11bGF0aW9uX25hbWUpOwotCSAgcHRyKys7Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL2xkdmVyLmggYi9sZC9sZHZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTdiNmJjLi4wMDAwMDAwCi0tLSBhL2xkL2xkdmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiBsZHZlci5oIC0tIEhlYWRlciBmaWxlIGZvciBsZHZlci5jLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk1LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi1leHRlcm4gY29uc3QgY2hhciAqbGRfcHJvZ3JhbV92ZXJzaW9uOwotCi12b2lkIGxkdmVyc2lvbiBQQVJBTVMgKChpbnQpKTsKZGlmZiAtLWdpdCBhL2xkL2xkd3JpdGUuYyBiL2xkL2xkd3JpdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU2MTE5YS4uMDAwMDAwMAotLS0gYS9sZC9sZHdyaXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzAgKzAsMCBAQAotLyogbGR3cml0ZS5jIC0tIHdyaXRlIG91dCB0aGUgbGlua2VkIGZpbGUKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OAotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIHNhY0BjeWdudXMuY29tCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlICJsZC5oIgotI2luY2x1ZGUgImxkZXhwLmgiCi0jaW5jbHVkZSAibGRsYW5nLmgiCi0jaW5jbHVkZSAibGR3cml0ZS5oIgotI2luY2x1ZGUgImxkbWlzYy5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotI2luY2x1ZGUgImxkbWFpbi5oIgotCi1zdGF0aWMgdm9pZCBidWlsZF9saW5rX29yZGVyIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGFzZWN0aW9uICpjbG9uZV9zZWN0aW9uIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBpbnQgKikpOwotc3RhdGljIHZvaWQgc3BsaXRfc2VjdGlvbnMgUEFSQU1TICgoYmZkICosIHN0cnVjdCBiZmRfbGlua19pbmZvICopKTsKLQotLyogQnVpbGQgbGlua19vcmRlciBzdHJ1Y3R1cmVzIGZvciB0aGUgQkZEIGxpbmtlci4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9saW5rX29yZGVyIChzdGF0ZW1lbnQpCi0gICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKnN0YXRlbWVudDsKLXsKLSAgc3dpdGNoIChzdGF0ZW1lbnQtPmhlYWRlci50eXBlKQotICAgIHsKLSAgICBjYXNlIGxhbmdfZGF0YV9zdGF0ZW1lbnRfZW51bToKLSAgICAgIHsKLQlhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0Jc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotCWJmZF92bWEgdmFsdWU7Ci0JYm9vbGVhbiBiaWdfZW5kaWFuID0gZmFsc2U7Ci0KLQlvdXRwdXRfc2VjdGlvbiA9IHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQub3V0cHV0X3NlY3Rpb247Ci0JQVNTRVJUIChvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0KLQlsaW5rX29yZGVyID0gYmZkX25ld19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbik7Ci0JaWYgKGxpbmtfb3JkZXIgPT0gTlVMTCkKLQkgIGVpbmZvIChfKCIlUCVGOiBiZmRfbmV3X2xpbmtfb3JkZXIgZmFpbGVkXG4iKSk7Ci0KLQlsaW5rX29yZGVyLT50eXBlID0gYmZkX2RhdGFfbGlua19vcmRlcjsKLQlsaW5rX29yZGVyLT5vZmZzZXQgPSBzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50Lm91dHB1dF92bWE7Ci0JbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzID0gKGJmZF9ieXRlICopIHhtYWxsb2MgKFFVQURfU0laRSk7Ci0KLQl2YWx1ZSA9IHN0YXRlbWVudC0+ZGF0YV9zdGF0ZW1lbnQudmFsdWU7Ci0KLQkvKiBJZiB0aGUgZW5kaWFubmVzcyBvZiB0aGUgb3V0cHV0IEJGRCBpcyBub3Qga25vd24sIHRoZW4gd2UKLQkgICBiYXNlIHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBkYXRhIG9uIHRoZSBmaXJzdCBpbnB1dCBmaWxlLgotCSAgIEJ5IGNvbnZlbnRpb24sIHRoZSBiZmRfcHV0IHJvdXRpbmVzIGZvciBhbiB1bmtub3duCi0JICAgZW5kaWFubmVzcyBhcmUgYmlnIGVuZGlhbiwgc28gd2UgbXVzdCBzd2FwIGhlcmUgaWYgdGhlCi0JICAgaW5wdXQgZmlsZSBpcyBsaXR0bGUgZW5kaWFuLiAgKi8KLQlpZiAoYmZkX2JpZ19lbmRpYW4gKG91dHB1dF9iZmQpKQotCSAgYmlnX2VuZGlhbiA9IHRydWU7Ci0JZWxzZSBpZiAoYmZkX2xpdHRsZV9lbmRpYW4gKG91dHB1dF9iZmQpKQotCSAgYmlnX2VuZGlhbiA9IGZhbHNlOwotCWVsc2UKLQkgIHsKLQkgICAgYm9vbGVhbiBzd2FwOwotCi0JICAgIHN3YXAgPSBmYWxzZTsKLQkgICAgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX0JJRykKLQkgICAgICBiaWdfZW5kaWFuID0gdHJ1ZTsKLQkgICAgZWxzZSBpZiAoY29tbWFuZF9saW5lLmVuZGlhbiA9PSBFTkRJQU5fTElUVExFKQotCSAgICAgIHsKLQkJYmlnX2VuZGlhbiA9IGZhbHNlOwotCQlzd2FwID0gdHJ1ZTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKGNvbW1hbmRfbGluZS5lbmRpYW4gPT0gRU5ESUFOX1VOU0VUKQotCSAgICAgIHsKLQkJYmlnX2VuZGlhbiA9IHRydWU7Ci0JCXsKLQkJICBMQU5HX0ZPUl9FQUNIX0lOUFVUX1NUQVRFTUVOVCAocykKLQkJICAgIHsKLQkJICAgICAgaWYgKHMtPnRoZV9iZmQgIT0gTlVMTCkKLQkJCXsKLQkJCSAgaWYgKGJmZF9saXR0bGVfZW5kaWFuIChzLT50aGVfYmZkKSkKLQkJCSAgICB7Ci0JCQkgICAgICBiaWdfZW5kaWFuID0gZmFsc2U7Ci0JCQkgICAgICBzd2FwID0gdHJ1ZTsKLQkJCSAgICB9Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgfQotCQl9Ci0JICAgICAgfQotCi0JICAgIGlmIChzd2FwKQotCSAgICAgIHsKLQkJYmZkX2J5dGUgYnVmZmVyWzhdOwotCi0JCXN3aXRjaCAoc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC50eXBlKQotCQkgIHsKLQkJICBjYXNlIFFVQUQ6Ci0JCSAgY2FzZSBTUVVBRDoKLQkJICAgIGlmIChzaXplb2YgKGJmZF92bWEpID49IFFVQURfU0laRSkKLQkJICAgICAgewotCQkJYmZkX3B1dGw2NCAodmFsdWUsIGJ1ZmZlcik7Ci0JCQl2YWx1ZSA9IGJmZF9nZXRiNjQgKGJ1ZmZlcik7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQkJICBjYXNlIExPTkc6Ci0JCSAgICBiZmRfcHV0bDMyICh2YWx1ZSwgYnVmZmVyKTsKLQkJICAgIHZhbHVlID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgU0hPUlQ6Ci0JCSAgICBiZmRfcHV0bDE2ICh2YWx1ZSwgYnVmZmVyKTsKLQkJICAgIHZhbHVlID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgQllURToKLQkJICAgIGJyZWFrOwotCQkgIGRlZmF1bHQ6Ci0JCSAgICBhYm9ydCAoKTsKLQkJICB9Ci0JICAgICAgfQotCSAgfQotCi0JQVNTRVJUIChvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0Jc3dpdGNoIChzdGF0ZW1lbnQtPmRhdGFfc3RhdGVtZW50LnR5cGUpCi0JICB7Ci0JICBjYXNlIFFVQUQ6Ci0JICBjYXNlIFNRVUFEOgotCSAgICBpZiAoc2l6ZW9mIChiZmRfdm1hKSA+PSBRVUFEX1NJWkUpCi0JICAgICAgYmZkX3B1dF82NCAob3V0cHV0X2JmZCwgdmFsdWUsIGxpbmtfb3JkZXItPnUuZGF0YS5jb250ZW50cyk7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWJmZF92bWEgaGlnaDsKLQotCQlpZiAoc3RhdGVtZW50LT5kYXRhX3N0YXRlbWVudC50eXBlID09IFFVQUQpCi0JCSAgaGlnaCA9IDA7Ci0JCWVsc2UgaWYgKCh2YWx1ZSAmIDB4ODAwMDAwMDApID09IDApCi0JCSAgaGlnaCA9IDA7Ci0JCWVsc2UKLQkJICBoaWdoID0gKGJmZF92bWEpIC0xOwotCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCBoaWdoLAotCQkJICAgIChsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMKLQkJCSAgICAgKyAoYmlnX2VuZGlhbiA/IDAgOiA0KSkpOwotCQliZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWx1ZSwKLQkJCSAgICAobGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzCi0JCQkgICAgICsgKGJpZ19lbmRpYW4gPyA0IDogMCkpKTsKLQkgICAgICB9Ci0JICAgIGxpbmtfb3JkZXItPnNpemUgPSBRVUFEX1NJWkU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBMT05HOgotCSAgICBiZmRfcHV0XzMyIChvdXRwdXRfYmZkLCB2YWx1ZSwgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzKTsKLQkgICAgbGlua19vcmRlci0+c2l6ZSA9IExPTkdfU0laRTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlIFNIT1JUOgotCSAgICBiZmRfcHV0XzE2IChvdXRwdXRfYmZkLCB2YWx1ZSwgbGlua19vcmRlci0+dS5kYXRhLmNvbnRlbnRzKTsKLQkgICAgbGlua19vcmRlci0+c2l6ZSA9IFNIT1JUX1NJWkU7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSBCWVRFOgotCSAgICBiZmRfcHV0XzggKG91dHB1dF9iZmQsIHZhbHVlLCBsaW5rX29yZGVyLT51LmRhdGEuY29udGVudHMpOwotCSAgICBsaW5rX29yZGVyLT5zaXplID0gQllURV9TSVpFOwotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgIGFib3J0ICgpOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW06Ci0gICAgICB7Ci0JbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcnM7Ci0JYXNlY3Rpb24gKm91dHB1dF9zZWN0aW9uOwotCXN0cnVjdCBiZmRfbGlua19vcmRlciAqbGlua19vcmRlcjsKLQotCXJzID0gJnN0YXRlbWVudC0+cmVsb2Nfc3RhdGVtZW50OwotCi0Jb3V0cHV0X3NlY3Rpb24gPSBycy0+b3V0cHV0X3NlY3Rpb247Ci0JQVNTRVJUIChvdXRwdXRfc2VjdGlvbi0+b3duZXIgPT0gb3V0cHV0X2JmZCk7Ci0KLQlsaW5rX29yZGVyID0gYmZkX25ld19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbik7Ci0JaWYgKGxpbmtfb3JkZXIgPT0gTlVMTCkKLQkgIGVpbmZvIChfKCIlUCVGOiBiZmRfbmV3X2xpbmtfb3JkZXIgZmFpbGVkXG4iKSk7Ci0KLQlsaW5rX29yZGVyLT5vZmZzZXQgPSBycy0+b3V0cHV0X3ZtYTsKLQlsaW5rX29yZGVyLT5zaXplID0gYmZkX2dldF9yZWxvY19zaXplIChycy0+aG93dG8pOwotCi0JbGlua19vcmRlci0+dS5yZWxvYy5wID0KLQkgICgoc3RydWN0IGJmZF9saW5rX29yZGVyX3JlbG9jICopCi0JICAgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYmZkX2xpbmtfb3JkZXJfcmVsb2MpKSk7Ci0KLQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPnJlbG9jID0gcnMtPnJlbG9jOwotCWxpbmtfb3JkZXItPnUucmVsb2MucC0+YWRkZW5kID0gcnMtPmFkZGVuZF92YWx1ZTsKLQotCWlmIChycy0+bmFtZSA9PSBOVUxMKQotCSAgewotCSAgICBsaW5rX29yZGVyLT50eXBlID0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcjsKLQkgICAgaWYgKHJzLT5zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKQotCSAgICAgIGxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uID0gcnMtPnNlY3Rpb247Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWxpbmtfb3JkZXItPnUucmVsb2MucC0+dS5zZWN0aW9uID0gcnMtPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uOwotCQlsaW5rX29yZGVyLT51LnJlbG9jLnAtPmFkZGVuZCArPSBycy0+c2VjdGlvbi0+b3V0cHV0X29mZnNldDsKLQkgICAgICB9Ci0JICB9Ci0JZWxzZQotCSAgewotCSAgICBsaW5rX29yZGVyLT50eXBlID0gYmZkX3N5bWJvbF9yZWxvY19saW5rX29yZGVyOwotCSAgICBsaW5rX29yZGVyLT51LnJlbG9jLnAtPnUubmFtZSA9IHJzLT5uYW1lOwotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGxhbmdfaW5wdXRfc2VjdGlvbl9lbnVtOgotICAgICAgLyogQ3JlYXRlIGEgbmV3IGxpbmtfb3JkZXIgaW4gdGhlIG91dHB1dCBzZWN0aW9uIHdpdGggdGhpcwotCSBhdHRhY2hlZCAqLwotICAgICAgaWYgKHN0YXRlbWVudC0+aW5wdXRfc2VjdGlvbi5pZmlsZS0+anVzdF9zeW1zX2ZsYWcgPT0gZmFsc2UpCi0JewotCSAgYXNlY3Rpb24gKmkgPSBzdGF0ZW1lbnQtPmlucHV0X3NlY3Rpb24uc2VjdGlvbjsKLQkgIGFzZWN0aW9uICpvdXRwdXRfc2VjdGlvbiA9IGktPm91dHB1dF9zZWN0aW9uOwotCi0JICBBU1NFUlQgKG91dHB1dF9zZWN0aW9uLT5vd25lciA9PSBvdXRwdXRfYmZkKTsKLQotCSAgaWYgKChvdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotCi0JICAgICAgbGlua19vcmRlciA9IGJmZF9uZXdfbGlua19vcmRlciAob3V0cHV0X2JmZCwgb3V0cHV0X3NlY3Rpb24pOwotCi0JICAgICAgaWYgKGktPmZsYWdzICYgU0VDX05FVkVSX0xPQUQpCi0JCXsKLQkJICAvKiBXZSd2ZSBnb3QgYSBuZXZlciBsb2FkIHNlY3Rpb24gaW5zaWRlIG9uZSB3aGljaAotCQkgICAgIGlzIGdvaW5nIHRvIGJlIG91dHB1dCwgd2UnbGwgY2hhbmdlIGl0IGludG8gYQotCQkgICAgIGZpbGwgbGlua19vcmRlciAqLwotCQkgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfZmlsbF9saW5rX29yZGVyOwotCQkgIGxpbmtfb3JkZXItPnUuZmlsbC52YWx1ZSA9IDA7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBsaW5rX29yZGVyLT50eXBlID0gYmZkX2luZGlyZWN0X2xpbmtfb3JkZXI7Ci0JCSAgbGlua19vcmRlci0+dS5pbmRpcmVjdC5zZWN0aW9uID0gaTsKLQkJICBBU1NFUlQgKGktPm91dHB1dF9zZWN0aW9uID09IG91dHB1dF9zZWN0aW9uKTsKLQkJfQotCSAgICAgIGlmIChpLT5fY29va2VkX3NpemUpCi0JCWxpbmtfb3JkZXItPnNpemUgPSBpLT5fY29va2VkX3NpemU7Ci0JICAgICAgZWxzZQotCQlsaW5rX29yZGVyLT5zaXplID0gYmZkX2dldF9zZWN0aW9uX3NpemVfYmVmb3JlX3JlbG9jIChpKTsKLQkgICAgICBsaW5rX29yZGVyLT5vZmZzZXQgPSBpLT5vdXRwdXRfb2Zmc2V0OwotCSAgICB9Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGxhbmdfcGFkZGluZ19zdGF0ZW1lbnRfZW51bToKLSAgICAgIC8qIE1ha2UgYSBuZXcgbGlua19vcmRlciB3aXRoIHRoZSByaWdodCBmaWxsZXIgKi8KLSAgICAgIHsKLQlhc2VjdGlvbiAqb3V0cHV0X3NlY3Rpb247Ci0Jc3RydWN0IGJmZF9saW5rX29yZGVyICpsaW5rX29yZGVyOwotCi0Jb3V0cHV0X3NlY3Rpb24gPSBzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9zZWN0aW9uOwotCUFTU0VSVCAoc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5vdXRwdXRfc2VjdGlvbi0+b3duZXIKLQkJPT0gb3V0cHV0X2JmZCk7Ci0JaWYgKChvdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfSEFTX0NPTlRFTlRTKSAhPSAwKQotCSAgewotCSAgICBsaW5rX29yZGVyID0gYmZkX25ld19saW5rX29yZGVyIChvdXRwdXRfYmZkLCBvdXRwdXRfc2VjdGlvbik7Ci0JICAgIGxpbmtfb3JkZXItPnR5cGUgPSBiZmRfZmlsbF9saW5rX29yZGVyOwotCSAgICBsaW5rX29yZGVyLT5zaXplID0gc3RhdGVtZW50LT5wYWRkaW5nX3N0YXRlbWVudC5zaXplOwotCSAgICBsaW5rX29yZGVyLT5vZmZzZXQgPSBzdGF0ZW1lbnQtPnBhZGRpbmdfc3RhdGVtZW50Lm91dHB1dF9vZmZzZXQ7Ci0JICAgIGxpbmtfb3JkZXItPnUuZmlsbC52YWx1ZSA9IHN0YXRlbWVudC0+cGFkZGluZ19zdGF0ZW1lbnQuZmlsbDsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8qIEFsbCB0aGUgb3RoZXIgb25lcyBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogQ2FsbCBCRkQgdG8gd3JpdGUgb3V0IHRoZSBsaW5rZWQgZmlsZS4gICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyogV2FuZGVyIGFyb3VuZCB0aGUgaW5wdXQgc2VjdGlvbnMsIG1ha2Ugc3VyZSB0aGF0Ci0gICB3ZSdsbCBuZXZlciB0cnkgYW5kIGNyZWF0ZSBhbiBvdXRwdXQgc2VjdGlvbiB3aXRoIG1vcmUgcmVsb2NzCi0gICB0aGFuIHdpbGwgZml0Li4gRG8gdGhpcyBieSBhbHdheXMgYXNzdW1pbmcgdGhlIHdvcnN0IGNhc2UsIGFuZAotICAgY3JlYXRpbmcgbmV3IG91dHB1dCBzZWN0aW9ucyB3aXRoIGFsbCB0aGUgcmlnaHQgYml0cyAqLwotI2RlZmluZSBURVNUSVQgMQotc3RhdGljIGFzZWN0aW9uICoKLWNsb25lX3NlY3Rpb24gKGFiZmQsIHMsIGNvdW50KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzOwotICAgICBpbnQgKmNvdW50OwotewotI2RlZmluZSBTU0laRSA4Ci0gIGNoYXIgc25hbWVbU1NJWkVdOwkJLyogPz8gIGZpbmQgdGhlIG5hbWUgZm9yIHRoaXMgc2l6ZSAqLwotICBhc2VjdGlvbiAqbjsKLSAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0gIC8qIEludmVudCBhIHNlY3Rpb24gbmFtZSAtIHVzZSBmaXJzdCBmaXZlCi0gICAgIGNoYXJzIG9mIGJhc2Ugc2VjdGlvbiBuYW1lIGFuZCBhIGRpZ2l0IHN1ZmZpeCAqLwotICBkbwotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBpOwotICAgICAgY2hhciBiWzZdOwotICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAoYikgLSAxICYmIHMtPm5hbWVbaV07IGkrKykKLQliW2ldID0gcy0+bmFtZVtpXTsKLSAgICAgIGJbaV0gPSAwOwotICAgICAgc3ByaW50ZiAoc25hbWUsICIlcyVkIiwgYiwgKCpjb3VudCkrKyk7Ci0gICAgfQotICB3aGlsZSAoYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsIHNuYW1lKSk7Ci0KLSAgbiA9IGJmZF9tYWtlX3NlY3Rpb25fYW55d2F5IChhYmZkLCB4c3RyZHVwIChzbmFtZSkpOwotCi0gIC8qIENyZWF0ZSBhIHN5bWJvbCBvZiB0aGUgc2FtZSBuYW1lICovCi0KLSAgaCA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8uaGFzaCwKLQkJCSAgICBzbmFtZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICBoLT50eXBlID0gYmZkX2xpbmtfaGFzaF9kZWZpbmVkOwotICBoLT51LmRlZi52YWx1ZSA9IDA7Ci0gIGgtPnUuZGVmLnNlY3Rpb24gPSBuICAgOwotCi0KLSAgbi0+ZmxhZ3MgPSBzLT5mbGFnczsKLSAgbi0+dm1hID0gcy0+dm1hOwotICBuLT51c2VyX3NldF92bWEgPSBzLT51c2VyX3NldF92bWE7Ci0gIG4tPmxtYSA9IHMtPmxtYTsKLSAgbi0+X2Nvb2tlZF9zaXplID0gMDsKLSAgbi0+X3Jhd19zaXplID0gMDsKLSAgbi0+b3V0cHV0X29mZnNldCA9IHMtPm91dHB1dF9vZmZzZXQ7Ci0gIG4tPm91dHB1dF9zZWN0aW9uID0gbjsKLSAgbi0+b3JlbG9jYXRpb24gPSAwOwotICBuLT5yZWxvY19jb3VudCA9IDA7Ci0gIG4tPmFsaWdubWVudF9wb3dlciA9IHMtPmFsaWdubWVudF9wb3dlcjsKLSAgcmV0dXJuIG47Ci19Ci0KLSNpZiBURVNUSU5HCi1zdGF0aWMgdm9pZCAKLWRzIChzKQotICAgICBhc2VjdGlvbiAqczsKLXsKLSAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsID0gcy0+bGlua19vcmRlcl9oZWFkOwotICBwcmludGYgKCJ2bWEgJXggc2l6ZSAleFxuIiwgcy0+dm1hLCBzLT5fcmF3X3NpemUpOwotICB3aGlsZSAobCkKLSAgICB7Ci0gICAgICBpZiAobC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQl7Ci0JICBwcmludGYgKCIlOHggJXNcbiIsIGwtPm9mZnNldCwgbC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vd25lci0+ZmlsZW5hbWUpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBwcmludGYgKF8oIiU4eCBzb21ldGhpbmcgZWxzZVxuIiksIGwtPm9mZnNldCk7Ci0JfQotICAgICAgbCA9IGwtPm5leHQ7Ci0gICAgfQotICBwcmludGYgKCJcbiIpOwotfQotZHVtcCAocywgYTEsIGEyKQotICAgICBjaGFyICpzOwotICAgICBhc2VjdGlvbiAqYTE7Ci0gICAgIGFzZWN0aW9uICphMjsKLXsKLSAgcHJpbnRmICgiJXNcbiIsIHMpOwotICBkcyAoYTEpOwotICBkcyAoYTIpOwotfQotCi1zdGF0aWMgdm9pZCAKLXNhbml0eV9jaGVjayAoYWJmZCkKLSAgICAgYmZkICphYmZkOwotewotICBhc2VjdGlvbiAqczsKLSAgZm9yIChzID0gYWJmZC0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19vcmRlciAqcDsKLSAgICAgIGJmZF92bWEgcHJldiA9IDA7Ci0gICAgICBmb3IgKHAgPSBzLT5saW5rX29yZGVyX2hlYWQ7IHA7IHAgPSBwLT5uZXh0KQotCXsKLQkgIGlmIChwLT5vZmZzZXQgPiAxMDAwMDApCi0JICAgIGFib3J0ICgpOwotCSAgaWYgKHAtPm9mZnNldCA8IHByZXYpCi0JICAgIGFib3J0ICgpOwotCSAgcHJldiA9IHAtPm9mZnNldDsKLQl9Ci0gICAgfQotfQotI2Vsc2UKLSNkZWZpbmUgc2FuaXR5X2NoZWNrKGEpCi0jZGVmaW5lIGR1bXAoYSwgYiwgYykKLSNlbmRpZgotCi1zdGF0aWMgdm9pZCAKLXNwbGl0X3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBhc2VjdGlvbiAqb3JpZ2luYWxfc2VjOwotICBpbnQgbnNlY3MgPSBhYmZkLT5zZWN0aW9uX2NvdW50OwotICBzYW5pdHlfY2hlY2sgKGFiZmQpOwotICAvKiBsb29rIHRocm91Z2ggYWxsIHRoZSBvcmlnaW5hbCBzZWN0aW9ucyAqLwotICBmb3IgKG9yaWdpbmFsX3NlYyA9IGFiZmQtPnNlY3Rpb25zOwotICAgICAgIG9yaWdpbmFsX3NlYyAmJiBuc2VjczsKLSAgICAgICBvcmlnaW5hbF9zZWMgPSBvcmlnaW5hbF9zZWMtPm5leHQsIG5zZWNzLS0pCi0gICAgewotICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0gICAgICBpbnQgY291bnQgPSAwOwotICAgICAgaW50IGxpbmVzID0gMDsKLSAgICAgIGludCByZWxvY3MgPSAwOwotICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICoqcHA7Ci0gICAgICBiZmRfdm1hIHZtYSA9IG9yaWdpbmFsX3NlYy0+dm1hOwotICAgICAgYmZkX3ZtYSBzaGlmdF9vZmZzZXQgPSAwOwotICAgICAgYXNlY3Rpb24gKmN1cnNvciA9IG9yaWdpbmFsX3NlYzsKLQotICAgICAgLyogY291bnQgdXAgdGhlIHJlbG9jYXRpb25zIGFuZCBsaW5lIGVudHJpZXMgdG8gc2VlIGlmCi0JIGFueXRoaW5nIHdvdWxkIGJlIHRvbyBiaWcgdG8gZml0ICovCi0gICAgICBmb3IgKHBwID0gJihjdXJzb3ItPmxpbmtfb3JkZXJfaGVhZCk7ICpwcDsgcHAgPSAmKCgqcHApLT5uZXh0KSkKLQl7Ci0JICBzdHJ1Y3QgYmZkX2xpbmtfb3JkZXIgKnAgPSAqcHA7Ci0JICBpbnQgdGhpc2xpbmVzID0gMDsKLQkgIGludCB0aGlzcmVsb2NzID0gMDsKLQkgIGlmIChwLT50eXBlID09IGJmZF9pbmRpcmVjdF9saW5rX29yZGVyKQotCSAgICB7Ci0JICAgICAgYXNlY3Rpb24gKnNlYzsKLQotCSAgICAgIHNlYyA9IHAtPnUuaW5kaXJlY3Quc2VjdGlvbjsKLQotCSAgICAgIGlmIChpbmZvLT5zdHJpcCA9PSBzdHJpcF9ub25lCi0JCSAgfHwgaW5mby0+c3RyaXAgPT0gc3RyaXBfc29tZSkKLQkJdGhpc2xpbmVzID0gc2VjLT5saW5lbm9fY291bnQ7Ci0KLQkgICAgICBpZiAoaW5mby0+cmVsb2NhdGVhYmxlKQotCQl0aGlzcmVsb2NzID0gc2VjLT5yZWxvY19jb3VudDsKLQotCSAgICB9Ci0JICBlbHNlIGlmIChpbmZvLT5yZWxvY2F0ZWFibGUKLQkJICAgJiYgKHAtPnR5cGUgPT0gYmZkX3NlY3Rpb25fcmVsb2NfbGlua19vcmRlcgotCQkgICAgICAgfHwgcC0+dHlwZSA9PSBiZmRfc3ltYm9sX3JlbG9jX2xpbmtfb3JkZXIpKQotCSAgICB0aGlzcmVsb2NzKys7Ci0KLQkgIGlmICghIGZpcnN0Ci0JICAgICAgJiYgKHRoaXNyZWxvY3MgKyByZWxvY3MgPiBjb25maWcuc3BsaXRfYnlfcmVsb2MKLQkJICB8fCB0aGlzbGluZXMgKyBsaW5lcyA+IGNvbmZpZy5zcGxpdF9ieV9yZWxvYwotCQkgIHx8IGNvbmZpZy5zcGxpdF9ieV9maWxlKSkKLQkgICAgewotCSAgICAgIC8qIGNyZWF0ZSBhIG5ldyBzZWN0aW9uIGFuZCBwdXQgdGhpcyBsaW5rIG9yZGVyIGFuZCB0aGUKLQkJIGZvbGxvd2luZyBsaW5rIG9yZGVycyBpbnRvIGl0ICovCi0JICAgICAgc3RydWN0IGJmZF9saW5rX29yZGVyICpsID0gcDsKLQkgICAgICBhc2VjdGlvbiAqbiA9IGNsb25lX3NlY3Rpb24gKGFiZmQsIGN1cnNvciwgJmNvdW50KTsKLQkgICAgICAqcHAgPSBOVUxMOwkvKiBTbmlwIG9mZiBsaW5rIG9yZGVycyBmcm9tIG9sZCBzZWN0aW9uICovCi0JICAgICAgbi0+bGlua19vcmRlcl9oZWFkID0gbDsJLyogYXR0YWNoIHRvIG5ldyBzZWN0aW9uICovCi0JICAgICAgcHAgPSAmbi0+bGlua19vcmRlcl9oZWFkOwotCi0JICAgICAgLyogY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBvcmlnaW5hbCBzZWN0aW9uIGFuZAotCQkgdXBkYXRlIHRoZSB2bWEgb2YgdGhlIG5ldyBvbmUgKi8KLQotCSAgICAgIGR1bXAgKCJiZWZvcmUgc25pcCIsIGN1cnNvciwgbik7Ci0KLQkgICAgICBuLT5fcmF3X3NpemUgPSBjdXJzb3ItPl9yYXdfc2l6ZSAtIGwtPm9mZnNldDsKLQkgICAgICBjdXJzb3ItPl9yYXdfc2l6ZSA9IGwtPm9mZnNldDsKLQotCSAgICAgIHZtYSArPSBjdXJzb3ItPl9yYXdfc2l6ZTsKLQkgICAgICBuLT5sbWEgPSBuLT52bWEgPSB2bWE7Ci0KLQkgICAgICBzaGlmdF9vZmZzZXQgPSBsLT5vZmZzZXQ7Ci0KLQkgICAgICAvKiBydW4gZG93biB0aGUgY2hhaW4gYW5kIGNoYW5nZSB0aGUgb3V0cHV0IHNlY3Rpb24gdG8KLQkJIHRoZSByaWdodCBvbmUsIHVwZGF0ZSB0aGUgb2Zmc2V0cyB0b28gKi8KLQotCSAgICAgIHdoaWxlIChsKQotCQl7Ci0JCSAgbC0+b2Zmc2V0IC09IHNoaWZ0X29mZnNldDsKLQkJICBpZiAobC0+dHlwZSA9PSBiZmRfaW5kaXJlY3RfbGlua19vcmRlcikKLQkJICAgIHsKLQkJICAgICAgbC0+dS5pbmRpcmVjdC5zZWN0aW9uLT5vdXRwdXRfc2VjdGlvbiA9IG47Ci0JCSAgICAgIGwtPnUuaW5kaXJlY3Quc2VjdGlvbi0+b3V0cHV0X29mZnNldCA9IGwtPm9mZnNldDsKLQkJICAgIH0KLQkJICBsID0gbC0+bmV4dDsKLQkJfQotCSAgICAgIGR1bXAgKCJhZnRlciBzbmlwIiwgY3Vyc29yLCBuKTsKLQkgICAgICBjdXJzb3IgPSBuOwotCSAgICAgIHJlbG9jcyA9IHRoaXNyZWxvY3M7Ci0JICAgICAgbGluZXMgPSB0aGlzbGluZXM7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbG9jcyArPSB0aGlzcmVsb2NzOwotCSAgICAgIGxpbmVzICs9IHRoaXNsaW5lczsKLQkgICAgfQotCi0JICBmaXJzdCA9IGZhbHNlOwotCX0KLSAgICB9Ci0gIHNhbml0eV9jaGVjayAoYWJmZCk7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQKLWxkd3JpdGUgKCkKLXsKLSAgLyogUmVzZXQgZXJyb3IgaW5kaWNhdG9yLCB3aGljaCBjYW4gdHlwaWNhbGx5IHNvbWV0aGluZyBsaWtlIGludmFsaWQKLSAgICAgZm9ybWF0IGZyb20gb3Blbm5pbmcgdXAgdGhlIC5vIGZpbGVzICovCi0gIGJmZF9zZXRfZXJyb3IgKGJmZF9lcnJvcl9ub19lcnJvcik7Ci0gIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50IChidWlsZF9saW5rX29yZGVyKTsKLQotICBpZiAoY29uZmlnLnNwbGl0X2J5X3JlbG9jIHx8IGNvbmZpZy5zcGxpdF9ieV9maWxlKQotICAgIHNwbGl0X3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgaWYgKCFiZmRfZmluYWxfbGluayAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbykpCi0gICAgewotICAgICAgLyogSWYgdGhlcmUgd2FzIGFuIGVycm9yIHJlY29yZGVkLCBwcmludCBpdCBvdXQuICBPdGhlcndpc2UgYXNzdW1lCi0JIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UgbGlrZSB1bmtub3duIHN5bWJvbCB3YXMgcHJpbnRlZAotCSBvdXQuICAqLwotCi0gICAgICBpZiAoYmZkX2dldF9lcnJvciAoKSAhPSBiZmRfZXJyb3Jfbm9fZXJyb3IpCi0JZWluZm8gKF8oIiVGJVA6IGZpbmFsIGxpbmsgZmFpbGVkOiAlRVxuIiksIG91dHB1dF9iZmQpOwotICAgICAgZWxzZQotCXhleGl0KDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL2xkd3JpdGUuaCBiL2xkL2xkd3JpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhkOGI1Mi4uMDAwMDAwMAotLS0gYS9sZC9sZHdyaXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKiBsZHdyaXRlLmggLQotICAgQ29weXJpZ2h0IDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLSAgIEdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIEdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdm9pZCBsZHdyaXRlIFBBUkFNUyAoKHZvaWQpKTsKZGlmZiAtLWdpdCBhL2xkL2xleHN1cC5jIGIvbGQvbGV4c3VwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDc4NWIuLjAwMDAwMDAKLS0tIGEvbGQvbGV4c3VwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTU2ICswLDAgQEAKLS8qIFBhcnNlIG9wdGlvbnMgZm9yIHRoZSBHTlUgbGlua2VyLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLUdMRCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLUdMRCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdMRDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZGxleC5oIgotI2luY2x1ZGUgImxkZmlsZS5oIgotI2luY2x1ZGUgImxkdmVyLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0KLSNpZm5kZWYgUEFUSF9TRVBBUkFUT1IKLSNpZiBkZWZpbmVkIChfX01TRE9TX18pIHx8IChkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19DWUdXSU4zMl9fKSkKLSNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgJzsnCi0jZWxzZQotI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAnOicKLSNlbmRpZgotI2VuZGlmCi0KLS8qIFNvbWV3aGVyZSBhYm92ZSwgc3lzL3N0YXQuaCBnb3QgaW5jbHVkZWQgLiAuIC4gLiAqLwotI2lmICFkZWZpbmVkKFNfSVNESVIpICYmIGRlZmluZWQoU19JRkRJUikKLSNkZWZpbmUJU19JU0RJUihtKSAoKChtKSAmIFNfSUZNVCkgPT0gU19JRkRJUikKLSNlbmRpZgotCi0vKiBPbWl0IGFyZ3MgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5IG9mIGNsYXNoaW5nIHdpdGggYSBzeXN0ZW0gaGVhZGVyCi0gICB0aGF0IG1pZ2h0IGRpc2FncmVlIGFib3V0IGNvbnN0cy4gICovCi11bnNpZ25lZCBsb25nIHN0cnRvdWwgKCk7Ci0KLXN0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2Rpcmxpc3QgUEFSQU1TICgoY2hhciAqZGlybGlzdF9wdHIpKTsKLXN0YXRpYyB2b2lkIHNldF9zZWN0aW9uX3N0YXJ0IFBBUkFNUyAoKGNoYXIgKnNlY3QsIGNoYXIgKnZhbHN0cikpOwotc3RhdGljIHZvaWQgaGVscCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIE5vbi16ZXJvIGlmIHdlIGFyZSBwcm9jZXNzaW5nIGEgLS1kZWZzeW0gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KLWludCBwYXJzaW5nX2RlZnN5bSA9IDA7Ci0KLS8qIENvZGVzIHVzZWQgZm9yIHRoZSBsb25nIG9wdGlvbnMgd2l0aCBubyBzaG9ydCBzeW5vbnltcy4gIDE1MCBpc24ndAotICAgc3BlY2lhbDsgaXQncyBqdXN0IGFuIGFyYml0cmFyeSBub24tQVNDSUkgY2hhciB2YWx1ZS4gICovCi0KLSNkZWZpbmUgT1BUSU9OX0FTU0VSVAkJCTE1MAotI2RlZmluZSBPUFRJT05fQ0FMTF9TSEFSRUQJCShPUFRJT05fQVNTRVJUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0NSRUYJCQkoT1BUSU9OX0NBTExfU0hBUkVEICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RFRlNZTQkJCShPUFRJT05fQ1JFRiArIDEpCi0jZGVmaW5lIE9QVElPTl9ERU1BTkdMRQkJCShPUFRJT05fREVGU1lNICsgMSkKLSNkZWZpbmUgT1BUSU9OX0RZTkFNSUNfTElOS0VSCQkoT1BUSU9OX0RFTUFOR0xFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VCCQkJKE9QVElPTl9EWU5BTUlDX0xJTktFUiArIDEpCi0jZGVmaW5lIE9QVElPTl9FTAkJCShPUFRJT05fRUIgKyAxKQotI2RlZmluZSBPUFRJT05fRU1CRURERURfUkVMT0NTCQkoT1BUSU9OX0VMICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYUE9SVF9EWU5BTUlDCQkoT1BUSU9OX0VNQkVEREVEX1JFTE9DUyArIDEpCi0jZGVmaW5lIE9QVElPTl9IRUxQCQkJKE9QVElPTl9FWFBPUlRfRFlOQU1JQyArIDEpCi0jZGVmaW5lIE9QVElPTl9JR05PUkUJCQkoT1BUSU9OX0hFTFAgKyAxKQotI2RlZmluZSBPUFRJT05fTUFQCQkJKE9QVElPTl9JR05PUkUgKyAxKQotI2RlZmluZSBPUFRJT05fTk9fREVNQU5HTEUJCShPUFRJT05fTUFQICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX0tFRVBfTUVNT1JZCQkoT1BUSU9OX05PX0RFTUFOR0xFICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1dBUk5fTUlTTUFUQ0gJCShPUFRJT05fTk9fS0VFUF9NRU1PUlkgKyAxKQotI2RlZmluZSBPUFRJT05fTk9JTkhJQklUX0VYRUMJCShPUFRJT05fTk9fV0FSTl9NSVNNQVRDSCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT05fU0hBUkVECQkoT1BUSU9OX05PSU5ISUJJVF9FWEVDICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkUJCShPUFRJT05fTk9OX1NIQVJFRCArIDEpCi0jZGVmaW5lIE9QVElPTl9PRk9STUFUCQkJKE9QVElPTl9OT19XSE9MRV9BUkNISVZFICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFTEFYCQkJKE9QVElPTl9PRk9STUFUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1JFVEFJTl9TWU1CT0xTX0ZJTEUJKE9QVElPTl9SRUxBWCArIDEpCi0jZGVmaW5lIE9QVElPTl9SUEFUSAkJCShPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRSArIDEpCi0jZGVmaW5lIE9QVElPTl9SUEFUSF9MSU5LCQkoT1BUSU9OX1JQQVRIICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NIQVJFRAkJCShPUFRJT05fUlBBVEhfTElOSyArIDEpCi0jZGVmaW5lIE9QVElPTl9TT05BTUUJCQkoT1BUSU9OX1NIQVJFRCArIDEpCi0jZGVmaW5lIE9QVElPTl9TT1JUX0NPTU1PTgkJKE9QVElPTl9TT05BTUUgKyAxKQotI2RlZmluZSBPUFRJT05fU1RBVFMJCQkoT1BUSU9OX1NPUlRfQ09NTU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NZTUJPTElDCQkJKE9QVElPTl9TVEFUUyArIDEpCi0jZGVmaW5lIE9QVElPTl9UQVNLX0xJTksJCShPUFRJT05fU1lNQk9MSUMgKyAxKQotI2RlZmluZSBPUFRJT05fVEJTUwkJCShPUFRJT05fVEFTS19MSU5LICsgMSkKLSNkZWZpbmUgT1BUSU9OX1REQVRBCQkJKE9QVElPTl9UQlNTICsgMSkKLSNkZWZpbmUgT1BUSU9OX1RURVhUCQkJKE9QVElPTl9UREFUQSArIDEpCi0jZGVmaW5lIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVQJKE9QVElPTl9UVEVYVCArIDEpCi0jZGVmaW5lIE9QVElPTl9VUgkJCShPUFRJT05fVFJBRElUSU9OQUxfRk9STUFUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUkJPU0UJCQkoT1BUSU9OX1VSICsgMSkKLSNkZWZpbmUgT1BUSU9OX1ZFUlNJT04JCQkoT1BUSU9OX1ZFUkJPU0UgKyAxKQotI2RlZmluZSBPUFRJT05fVkVSU0lPTl9TQ1JJUFQJCShPUFRJT05fVkVSU0lPTiArIDEpCi0jZGVmaW5lIE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTgkoT1BUSU9OX1ZFUlNJT05fU0NSSVBUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fQ09NTU9OCQkoT1BUSU9OX1ZFUlNJT05fRVhQT1JUU19TRUNUSU9OICsgMSkKLSNkZWZpbmUgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTCShPUFRJT05fV0FSTl9DT01NT04gKyAxKQotI2RlZmluZSBPUFRJT05fV0FSTl9NVUxUSVBMRV9HUAkJKE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SUyArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX09OQ0UJCShPUFRJT05fV0FSTl9NVUxUSVBMRV9HUCArIDEpCi0jZGVmaW5lIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR04JKE9QVElPTl9XQVJOX09OQ0UgKyAxKQotI2RlZmluZSBPUFRJT05fU1BMSVRfQllfUkVMT0MJCShPUFRJT05fV0FSTl9TRUNUSU9OX0FMSUdOICsgMSkKLSNkZWZpbmUgT1BUSU9OX1NQTElUX0JZX0ZJTEUgCSAgICAJKE9QVElPTl9TUExJVF9CWV9SRUxPQyArIDEpCi0jZGVmaW5lIE9QVElPTl9XSE9MRV9BUkNISVZFCQkoT1BUSU9OX1NQTElUX0JZX0ZJTEUgKyAxKQotI2RlZmluZSBPUFRJT05fV1JBUAkJCShPUFRJT05fV0hPTEVfQVJDSElWRSArIDEpCi0jZGVmaW5lIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYCQkoT1BUSU9OX1dSQVAgKyAxKQotI2RlZmluZSBPUFRJT05fR0NfU0VDVElPTlMJCShPUFRJT05fRk9SQ0VfRVhFX1NVRkZJWCArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19HQ19TRUNUSU9OUwkJKE9QVElPTl9HQ19TRUNUSU9OUyArIDEpCi0jZGVmaW5lIE9QVElPTl9DSEVDS19TRUNUSU9OUwkJKE9QVElPTl9OT19HQ19TRUNUSU9OUyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT19DSEVDS19TRUNUSU9OUwkoT1BUSU9OX0NIRUNLX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX01QQzg2MEMwICAgICAgICAgICAgICAgICAoT1BUSU9OX05PX0NIRUNLX1NFQ1RJT05TICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PX1VOREVGSU5FRAkJKE9QVElPTl9NUEM4NjBDMCArIDEpCi0jZGVmaW5lIE9QVElPTl9JTklUICAgICAgICAgICAgICAgICAgICAgKE9QVElPTl9OT19VTkRFRklORUQgKyAxKQotI2RlZmluZSBPUFRJT05fRklOSSAgICAgICAgICAgICAgICAgICAgIChPUFRJT05fSU5JVCArIDEpCi0KLS8qIFRoZSBsb25nIG9wdGlvbnMuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBib3RoIHRoZSBvcHRpb24KLSAgIHBhcnNpbmcgYW5kIHRoZSBoZWxwIHRleHQuICAqLwotCi1zdHJ1Y3QgbGRfb3B0aW9uCi17Ci0gIC8qIFRoZSBsb25nIG9wdGlvbiBpbmZvcm1hdGlvbi4gICovCi0gIHN0cnVjdCBvcHRpb24gb3B0OwotICAvKiBUaGUgc2hvcnQgb3B0aW9uIHdpdGggdGhlIHNhbWUgbWVhbmluZyAoJ1wwJyBpZiBub25lKS4gICovCi0gIGNoYXIgc2hvcnRvcHQ7Ci0gIC8qIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCAoTlVMTCBpZiBub25lKS4gICovCi0gIGNvbnN0IGNoYXIgKmFyZzsKLSAgLyogVGhlIGRvY3VtZW50YXRpb24gc3RyaW5nLiAgSWYgdGhpcyBpcyBOVUxMLCB0aGlzIGlzIGEgc3lub255bSBmb3IKLSAgICAgdGhlIHByZXZpb3VzIG9wdGlvbi4gICovCi0gIGNvbnN0IGNoYXIgKmRvYzsKLSAgZW51bQotICAgIHsKLSAgICAgIC8qIFVzZSBvbmUgZGFzaCBiZWZvcmUgbG9uZyBvcHRpb24gbmFtZS4gICovCi0gICAgICBPTkVfREFTSCwKLSAgICAgIC8qIFVzZSB0d28gZGFzaGVzIGJlZm9yZSBsb25nIG9wdGlvbiBuYW1lLiAgKi8KLSAgICAgIFRXT19EQVNIRVMsCi0gICAgICAvKiBEb24ndCBtZW50aW9uIHRoaXMgb3B0aW9uIGluIC0taGVscCBvdXRwdXQuICAqLwotICAgICAgTk9fSEVMUAotICAgIH0gY29udHJvbDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbGRfb3B0aW9uIGxkX29wdGlvbnNbXSA9Ci17Ci0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdhJywgTl8oIktFWVdPUkQiKSwgTl8oIlNoYXJlZCBsaWJyYXJ5IGNvbnRyb2wgZm9yIEhQL1VYIGNvbXBhdGliaWxpdHkiKSwKLSAgICAgIE9ORV9EQVNIIH0sCi0gIHsgeyJhcmNoaXRlY3R1cmUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0EnfSwKLSAgICAgICdBJywgTl8oIkFSQ0giKSwgTl8oIlNldCBhcmNoaXRlY3R1cmUiKSAsIFRXT19EQVNIRVMgfSwKLSAgeyB7ImZvcm1hdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnYid9LAotICAgICAgJ2InLCBOXygiVEFSR0VUIiksIE5fKCJTcGVjaWZ5IHRhcmdldCBmb3IgZm9sbG93aW5nIGlucHV0IGZpbGVzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im1yaS1zY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2MnfSwKLSAgICAgICdjJywgTl8oIkZJTEUiKSwgTl8oIlJlYWQgTVJJIGZvcm1hdCBsaW5rZXIgc2NyaXB0IiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRjIiwgbm9fYXJndW1lbnQsIE5VTEwsICdkJ30sCi0gICAgICAnZCcsIE5VTEwsIE5fKCJGb3JjZSBjb21tb24gc3ltYm9scyB0byBiZSBkZWZpbmVkIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJkcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7ImVudHJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdlJ30sCi0gICAgICAnZScsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgc3RhcnQgYWRkcmVzcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJleHBvcnQtZHluYW1pYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUX0RZTkFNSUN9LAotICAgICAgJ0UnLCBOVUxMLCBOXygiRXhwb3J0IGFsbCBkeW5hbWljIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiRUIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VCfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGJpZy1lbmRpYW4gb2JqZWN0cyIpLCBPTkVfREFTSCB9LAotICB7IHsiRUwiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VMfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJMaW5rIGxpdHRsZS1lbmRpYW4gb2JqZWN0cyIpLCBPTkVfREFTSCB9LAotICB7IHsiYXV4aWxpYXJ5IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdmJ30sCi0gICAgICAnZicsIE5fKCJTSExJQiIpLCBOXygiQXV4aWxpYXJ5IGZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7ImZpbHRlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRid9LAotICAgICAgJ0YnLCBOXygiU0hMSUIiKSwgTl8oIkZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHtOVUxMLCBub19hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAnZycsIE5VTEwsIE5fKCJJZ25vcmVkIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJncHNpemUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ0cnfSwKLSAgICAgICdHJywgTl8oIlNJWkUiKSwgTl8oIlNtYWxsIGRhdGEgc2l6ZSAoaWYgbm8gc2l6ZSwgc2FtZSBhcyAtLXNoYXJlZCkiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7InNvbmFtZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU09OQU1FfSwKLSAgICAgICdoJywgTl8oIkZJTEVOQU1FIiksIE5fKCJTZXQgaW50ZXJuYWwgbmFtZSBvZiBzaGFyZWQgbGlicmFyeSIpLCBPTkVfREFTSCB9LAotICB7IHsibGlicmFyeSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnbCd9LAotICAgICAgJ2wnLCBOXygiTElCTkFNRSIpLCBOXygiU2VhcmNoIGZvciBsaWJyYXJ5IExJQk5BTUUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibGlicmFyeS1wYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdMJ30sCi0gICAgICAnTCcsIE5fKCJESVJFQ1RPUlkiKSwgTl8oIkFkZCBESVJFQ1RPUlkgdG8gbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdtJywgTl8oIkVNVUxBVElPTiIpLCBOXygiU2V0IGVtdWxhdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsicHJpbnQtbWFwIiwgbm9fYXJndW1lbnQsIE5VTEwsICdNJ30sCi0gICAgICAnTScsIE5VTEwsIE5fKCJQcmludCBtYXAgZmlsZSBvbiBzdGFuZGFyZCBvdXRwdXQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm1hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsICduJ30sCi0gICAgICAnbicsIE5VTEwsIE5fKCJEbyBub3QgcGFnZSBhbGlnbiBkYXRhIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im9tYWdpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnTid9LAotICAgICAgJ04nLCBOVUxMLCBOXygiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSwgZG8gbm90IG1ha2UgdGV4dCByZWFkb25seSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdvJ30sCi0gICAgICAnbycsIE5fKCJGSUxFIiksIE5fKCJTZXQgb3V0cHV0IGZpbGUgbmFtZSIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdPJywgTlVMTCwgTl8oIk9wdGltaXplIG91dHB1dCBmaWxlIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJReSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJJZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InJlbG9jYXRlYWJsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCAncid9LAotICAgICAgJ3InLCBOVUxMLCBOXygiR2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdpJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7Imp1c3Qtc3ltYm9scyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUid9LAotICAgICAgJ1InLCBOXygiRklMRSIpLCBOXygiSnVzdCBsaW5rIHN5bWJvbHMgKGlmIGRpcmVjdG9yeSwgc2FtZSBhcyAtLXJwYXRoKSIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsic3RyaXAtYWxsIiwgbm9fYXJndW1lbnQsIE5VTEwsICdzJ30sCi0gICAgICAncycsIE5VTEwsIE5fKCJTdHJpcCBhbGwgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJzdHJpcC1kZWJ1ZyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAotICAgICAgJ1MnLCBOVUxMLCBOXygiU3RyaXAgZGVidWdnaW5nIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhY2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3QnfSwKLSAgICAgICd0JywgTlVMTCwgTl8oIlRyYWNlIGZpbGUgb3BlbnMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic2NyaXB0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdUJ30sCi0gICAgICAnVCcsIE5fKCJGSUxFIiksIE5fKCJSZWFkIGxpbmtlciBzY3JpcHQiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidW5kZWZpbmVkIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd1J30sCi0gICAgICAndScsIE5fKCJTWU1CT0wiKSwgTl8oIlN0YXJ0IHdpdGggdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBTWU1CT0wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiVXIiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1VSfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJCdWlsZCBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0YWJsZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7InZlcnNpb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT059LAotICAgICAgJ3YnLCBOVUxMLCBOXygiUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIG5vX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdWJywgTlVMTCwgTl8oIlByaW50IHZlcnNpb24gYW5kIGVtdWxhdGlvbiBpbmZvcm1hdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsiZGlzY2FyZC1hbGwiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKLSAgICAgICd4JywgTlVMTCwgTl8oIkRpc2NhcmQgYWxsIGxvY2FsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiZGlzY2FyZC1sb2NhbHMiLCBub19hcmd1bWVudCwgTlVMTCwgJ1gnfSwKLSAgICAgICdYJywgTlVMTCwgTl8oIkRpc2NhcmQgdGVtcG9yYXJ5IGxvY2FsIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhY2Utc3ltYm9sIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd5J30sCi0gICAgICAneScsIE5fKCJTWU1CT0wiKSwgTl8oIlRyYWNlIG1lbnRpb25zIG9mIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsge05VTEwsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnXDAnfSwKLSAgICAgICdZJywgTl8oIlBBVEgiKSwgTl8oIkRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIpLCBPTkVfREFTSCB9LAotICB7IHtOVUxMLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1wwJ30sCi0gICAgICAneicsIE5fKCJLRVlXT1JEIiksIE5fKCJJZ25vcmVkIGZvciBTb2xhcmlzIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InN0YXJ0LWdyb3VwIiwgbm9fYXJndW1lbnQsIE5VTEwsICcoJ30sCi0gICAgICAnKCcsIE5VTEwsIE5fKCJTdGFydCBhIGdyb3VwIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImVuZC1ncm91cCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnKSd9LAotICAgICAgJyknLCBOVUxMLCBOXygiRW5kIGEgZ3JvdXAiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsiYXNzZXJ0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BU1NFUlR9LAotICAgICAgJ1wwJywgTl8oIktFWVdPUkQiKSwgTl8oIklnbm9yZWQgZm9yIFN1bk9TIGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7IkJkeW5hbWljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiTGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImR5Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9DQUxMX1NIQVJFRH0sCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsiY2FsbF9zaGFyZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NBTExfU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJCc3RhdGljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEbyBub3QgbGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImRuIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJub25fc2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT05fU0hBUkVEfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE9ORV9EQVNIIH0sCi0gIHsgeyJzdGF0aWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgT05FX0RBU0ggfSwKLSAgeyB7IkJzeW1ib2xpYyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fU1lNQk9MSUN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkJpbmQgZ2xvYmFsIHJlZmVyZW5jZXMgbG9jYWxseSIpLCBPTkVfREFTSCB9LAotICB7IHsiY2hlY2stc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0NIRUNLX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJDaGVjayBzZWN0aW9uIGFkZHJlc3NlcyBmb3Igb3ZlcmxhcHMgKGRlZmF1bHQpIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7Im5vLWNoZWNrLXNlY3Rpb25zIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19DSEVDS19TRUNUSU9OU30sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGNoZWNrIHNlY3Rpb24gYWRkcmVzc2VzIGZvciBvdmVybGFwcyIpLAotICAgICAgVFdPX0RBU0hFUyB9LAotICB7IHsiY3JlZiIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQ1JFRn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiT3V0cHV0IGNyb3NzIHJlZmVyZW5jZSB0YWJsZSIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkZWZzeW0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0RFRlNZTX0sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MPUVYUFJFU1NJT04iKSwgTl8oIkRlZmluZSBhIHN5bWJvbCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkZW1hbmdsZSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fREVNQU5HTEV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJkeW5hbWljLWxpbmtlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRFlOQU1JQ19MSU5LRVJ9LAotICAgICAgJ1wwJywgTl8oIlBST0dSQU0iKSwgTl8oIlNldCB0aGUgZHluYW1pYyBsaW5rZXIgdG8gdXNlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImVtYmVkZGVkLXJlbG9jcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRU1CRURERURfUkVMT0NTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJHZW5lcmF0ZSBlbWJlZGRlZCByZWxvY3MiKSwgVFdPX0RBU0hFU30sCi0gIHsgeyJmaW5pIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9GSU5JfSwKLSAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiQ2FsbCBTWU1CT0wgYXQgdW5sb2FkLXRpbWUiKSwgT05FX0RBU0ggfSwKLSAgeyB7ImZvcmNlLWV4ZS1zdWZmaXgiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0ZPUkNFX0VYRV9TVUZGSVh9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkZvcmNlIGdlbmVyYXRpb24gb2YgZmlsZSB3aXRoIC5leGUgc3VmZml4IiksIFRXT19EQVNIRVN9LAotICB7IHsiZ2Mtc2VjdGlvbnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0dDX1NFQ1RJT05TfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJSZW1vdmUgdW51c2VkIHNlY3Rpb25zIChvbiBzb21lIHRhcmdldHMpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1nYy1zZWN0aW9ucyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fR0NfU0VDVElPTlN9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkRvbid0IHJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKGRlZmF1bHQpIiksCi0gICAgICBUV09fREFTSEVTIH0sCi0gIHsgeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9IRUxQfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJQcmludCBvcHRpb24gaGVscCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJpbml0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTklUfSwKLSAgICAgJ1wwJywgTl8oIlNZTUJPTCIpLCBOXygiQ2FsbCBTWU1CT0wgYXQgbG9hZC10aW1lIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJNYXAiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BUH0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiV3JpdGUgYSBtYXAgZmlsZSIpLCBPTkVfREFTSCB9LAotICB7IHsibm8tZGVtYW5nbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX0RFTUFOR0xFIH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiRG8gbm90IGRlbWFuZ2xlIHN5bWJvbCBuYW1lcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby1rZWVwLW1lbW9yeSIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9fS0VFUF9NRU1PUll9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlVzZSBsZXNzIG1lbW9yeSBhbmQgbW9yZSBkaXNrIEkvTyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby11bmRlZmluZWQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PX1VOREVGSU5FRH0sCi0gICAgICdcMCcsIE5VTEwsIE5fKCJBbGxvdyBubyB1bmRlZmluZWQgc3ltYm9scyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJuby13YXJuLW1pc21hdGNoIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XQVJOX01JU01BVENIfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJEb24ndCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQgZmlsZXMiKSwgVFdPX0RBU0hFU30sCi0gIHsgeyJuby13aG9sZS1hcmNoaXZlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT19XSE9MRV9BUkNISVZFfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJUdXJuIG9mZiAtLXdob2xlLWFyY2hpdmUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm9pbmhpYml0LWV4ZWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PSU5ISUJJVF9FWEVDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJDcmVhdGUgYW4gb3V0cHV0IGZpbGUgZXZlbiBpZiBlcnJvcnMgb2NjdXIiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsibm9pbmhpYml0X2V4ZWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PSU5ISUJJVF9FWEVDfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7Im9mb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX09GT1JNQVR9LAotICAgICAgJ1wwJywgTl8oIlRBUkdFVCIpLCBOXygiU3BlY2lmeSB0YXJnZXQgb2Ygb3V0cHV0IGZpbGUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicW1hZ2ljIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIklnbm9yZWQgZm9yIExpbnV4IGNvbXBhdGliaWxpdHkiKSwgT05FX0RBU0ggfSwKLSAgeyB7InJlbGF4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9SRUxBWH0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiUmVsYXggYnJhbmNoZXMgb24gY2VydGFpbiB0YXJnZXRzIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InJldGFpbi1zeW1ib2xzLWZpbGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwKLSAgICAgICBPUFRJT05fUkVUQUlOX1NZTUJPTFNfRklMRX0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiS2VlcCBvbmx5IHN5bWJvbHMgbGlzdGVkIGluIEZJTEUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsicnBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1JQQVRIfSwKLSAgICAgICdcMCcsIE5fKCJQQVRIIiksIE5fKCJTZXQgcnVudGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBPTkVfREFTSCB9LAotICB7IHsicnBhdGgtbGluayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUlBBVEhfTElOS30sCi0gICAgICAnXDAnLCBOXygiUEFUSCIpLCBOXygiU2V0IGxpbmsgdGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIpLCBPTkVfREFTSCB9LAotICB7IHsic2hhcmVkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSEFSRUR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IiksIE9ORV9EQVNIIH0sCi0gIHsgeyJCc2hhcmVhYmxlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TSEFSRUQgfSwgLyogRnJlZUJTRC4gICovCi0gICAgICAnXDAnLCBOVUxMLCBOVUxMLCBPTkVfREFTSCB9LAotICB7IHsic29ydC1jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPUlRfQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJTb3J0IGNvbW1vbiBzeW1ib2xzIGJ5IHNpemUiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic29ydF9jb21tb24iLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NPUlRfQ09NTU9OfSwKLSAgICAgICdcMCcsIE5VTEwsIE5VTEwsIE5PX0hFTFAgfSwKLSAgeyB7InNwbGl0LWJ5LWZpbGUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NQTElUX0JZX0ZJTEV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBmb3IgZWFjaCBmaWxlIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7InNwbGl0LWJ5LXJlbG9jIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9TUExJVF9CWV9SRUxPQ30sCi0gICAgICAnXDAnLCBOXygiQ09VTlQiKSwgTl8oIlNwbGl0IG91dHB1dCBzZWN0aW9ucyBldmVyeSBDT1VOVCByZWxvY3MiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsic3RhdHMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUQVRTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJQcmludCBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ0YXNrLWxpbmsiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RBU0tfTElOS30sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJEbyB0YXNrIGxldmVsIGxpbmtpbmciKSwgVFdPX0RBU0hFUyB9LAotICB7IHsidHJhZGl0aW9uYWwtZm9ybWF0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9UUkFESVRJT05BTF9GT1JNQVR9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIlVzZSBzYW1lIGZvcm1hdCBhcyBuYXRpdmUgbGlua2VyIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7IlRic3MiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1RCU1N9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC5ic3Mgc2VjdGlvbiIpLCBPTkVfREFTSCB9LAotICB7IHsiVGRhdGEiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1REQVRBfSwKLSAgICAgICdcMCcsIE5fKCJBRERSRVNTIiksIE5fKCJTZXQgYWRkcmVzcyBvZiAuZGF0YSBzZWN0aW9uIiksIE9ORV9EQVNIIH0sCi0gIHsgeyJUdGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fVFRFWFR9LAotICAgICAgJ1wwJywgTl8oIkFERFJFU1MiKSwgTl8oIlNldCBhZGRyZXNzIG9mIC50ZXh0IHNlY3Rpb24iKSwgT05FX0RBU0ggfSwKLSAgeyB7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUkJPU0V9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIk91dHB1dCBsb3RzIG9mIGluZm9ybWF0aW9uIGR1cmluZyBsaW5rIiksIFRXT19EQVNIRVMgfSwKLSAgeyB7ImRsbC12ZXJib3NlIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9WRVJCT1NFfSwgLyogTGludXguICAqLwotICAgICAgJ1wwJywgTlVMTCwgTlVMTCwgTk9fSEVMUCB9LAotICB7IHsidmVyc2lvbi1zY3JpcHQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1ZFUlNJT05fU0NSSVBUIH0sCi0gICAgICAnXDAnLCBOXygiRklMRSIpLCBOXygiUmVhZCB2ZXJzaW9uIGluZm9ybWF0aW9uIHNjcmlwdCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ2ZXJzaW9uLWV4cG9ydHMtc2VjdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLAotICAgICBPUFRJT05fVkVSU0lPTl9FWFBPUlRTX1NFQ1RJT04gfSwKLSAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJUYWtlIGV4cG9ydCBzeW1ib2xzIGxpc3QgZnJvbSAuZXhwb3J0cywgdXNpbmdcblx0XHRcdFx0U1lNQk9MIGFzIHRoZSB2ZXJzaW9uLiIpLAotICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tY29tbW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX0NPTU1PTn0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBhYm91dCBkdXBsaWNhdGUgY29tbW9uIHN5bWJvbHMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1jb25zdHJ1Y3RvcnMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fQ09OU1RSVUNUT1JTfSwKLSAgICAgICdcMCcsIE5VTEwsIE5fKCJXYXJuIGlmIGdsb2JhbCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYXJlIHNlZW4iKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indhcm4tbXVsdGlwbGUtZ3AiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fTVVMVElQTEVfR1B9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgdGhlIG11bHRpcGxlIEdQIHZhbHVlcyBhcmUgdXNlZCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJ3YXJuLW9uY2UiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dBUk5fT05DRX0sCi0gICAgICAnXDAnLCBOVUxMLCBOXygiV2FybiBvbmx5IG9uY2UgcGVyIHVuZGVmaW5lZCBzeW1ib2wiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid2Fybi1zZWN0aW9uLWFsaWduIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR059LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIldhcm4gaWYgc3RhcnQgb2Ygc2VjdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQiKSwKLSAgICAgIFRXT19EQVNIRVMgfSwKLSAgeyB7Indob2xlLWFyY2hpdmUiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1dIT0xFX0FSQ0hJVkV9LAotICAgICAgJ1wwJywgTlVMTCwgTl8oIkluY2x1ZGUgYWxsIG9iamVjdHMgZnJvbSBmb2xsb3dpbmcgYXJjaGl2ZXMiKSwgVFdPX0RBU0hFUyB9LAotICB7IHsid3JhcCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fV1JBUH0sCi0gICAgICAnXDAnLCBOXygiU1lNQk9MIiksIE5fKCJVc2Ugd3JhcHBlciBmdW5jdGlvbnMgZm9yIFNZTUJPTCIpLCBUV09fREFTSEVTIH0sCi0gIHsgeyJtcGM4NjBjMCIsIG9wdGlvbmFsX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTVBDODYwQzB9LAotICAgICAgJ1wwJywgTl8oIls9V09SRFNdIiksIE5fKCJNb2RpZnkgcHJvYmxlbWF0aWMgYnJhbmNoZXMgaW4gbGFzdCBXT1JEUyAoMS0xMCxcblx0XHRcdFx0ZGVmYXVsdCA1KSB3b3JkcyBvZiBhIHBhZ2UiKSwgVFdPX0RBU0hFUyB9Ci19OwotCi0jZGVmaW5lIE9QVElPTl9DT1VOVCAoKGludCkgKHNpemVvZiBsZF9vcHRpb25zIC8gc2l6ZW9mIGxkX29wdGlvbnNbMF0pKQotCi0vKiBUZXN0ICJzdHJpbmciIGZvciBjb250YWluaW5nIGEgc3RyaW5nIG9mIGRpZ2l0cyB0aGF0IGZvcm0gYSBudW1iZXIKLWJldHdlZW4gIm1pbiIgYW5kICJtYXgiLiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9yICJlcnIiLiAqLwotc3RhdGljCi1pbnQgaXNfbnVtKCBjaGFyICpzdHJpbmcsIGludCBtaW4sIGludCBtYXgsIGludCBlcnIpCi17Ci0gIGludCByZXN1bHQgPSAwOwotCi0gIGZvciAoIDsgKnN0cmluZzsgKytzdHJpbmcpCi0gIHsKLSAgICBpZiAoIWlzZGlnaXQoKnN0cmluZykpCi0gICAgewotICAgICAgcmVzdWx0ID0gZXJyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJlc3VsdCA9IHJlc3VsdCAqIDEwICsgKCpzdHJpbmcgLSAnMCcpOwotICB9Ci0gIGlmIChyZXN1bHQgPCBtaW4gfHwgcmVzdWx0ID4gbWF4KQotICAgIHJlc3VsdCA9IGVycjsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkCi1wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBpLCBpcywgaWw7Ci0gIGludCBpbmdyb3VwID0gMDsKLSAgY2hhciAqZGVmYXVsdF9kaXJsaXN0ID0gTlVMTDsKLSAgY2hhciBzaG9ydG9wdHNbT1BUSU9OX0NPVU5UICogMyArIDJdOwotICBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW09QVElPTl9DT1VOVCArIDFdOwotICBpbnQgbGFzdF9vcHRpbmQ7Ci0KLSAgLyogU3RhcnRpbmcgdGhlIHNob3J0IG9wdGlvbiBzdHJpbmcgd2l0aCAnLScgaXMgZm9yIHByb2dyYW1zIHRoYXQKLSAgICAgZXhwZWN0IG9wdGlvbnMgYW5kIG90aGVyIEFSR1YtZWxlbWVudHMgaW4gYW55IG9yZGVyIGFuZCB0aGF0IGNhcmUgYWJvdXQKLSAgICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50Ci0gICAgIGFzIGlmIGl0IHdlcmUgdGhlIGFyZ3VtZW50IG9mIGFuIG9wdGlvbiB3aXRoIGNoYXJhY3RlciBjb2RlIDEuICAqLwotICBzaG9ydG9wdHNbMF0gPSAnLSc7Ci0gIGlzID0gMTsKLSAgaWwgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgT1BUSU9OX0NPVU5UOyBpKyspCi0gICAgewotICAgICAgaWYgKGxkX29wdGlvbnNbaV0uc2hvcnRvcHQgIT0gJ1wwJykKLQl7Ci0JICBzaG9ydG9wdHNbaXNdID0gbGRfb3B0aW9uc1tpXS5zaG9ydG9wdDsKLQkgICsraXM7Ci0JICBpZiAobGRfb3B0aW9uc1tpXS5vcHQuaGFzX2FyZyA9PSByZXF1aXJlZF9hcmd1bWVudAotCSAgICAgIHx8IGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JICAgIHsKLQkgICAgICBzaG9ydG9wdHNbaXNdID0gJzonOwotCSAgICAgICsraXM7Ci0JICAgICAgaWYgKGxkX29wdGlvbnNbaV0ub3B0Lmhhc19hcmcgPT0gb3B0aW9uYWxfYXJndW1lbnQpCi0JCXsKLQkJICBzaG9ydG9wdHNbaXNdID0gJzonOwotCQkgICsraXM7Ci0JCX0KLQkgICAgfQotCX0KLSAgICAgIGlmIChsZF9vcHRpb25zW2ldLm9wdC5uYW1lICE9IE5VTEwpCi0JewotCSAgbG9uZ29wdHNbaWxdID0gbGRfb3B0aW9uc1tpXS5vcHQ7Ci0JICArK2lsOwotCX0KLSAgICB9Ci0gIHNob3J0b3B0c1tpc10gPSAnXDAnOwotICBsb25nb3B0c1tpbF0ubmFtZSA9IE5VTEw7Ci0KLSAgLyogVGhlIC1HIG9wdGlvbiBpcyBhbWJpZ3VvdXMgb24gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIFNvbWV0aW1lcyBpdAotICAgICBzcGVjaWZpZXMgdGhlIGxhcmdlc3QgZGF0YSBzaXplIHRvIHB1dCBpbnRvIHRoZSBzbWFsbCBkYXRhCi0gICAgIHNlY3Rpb24uICBTb21ldGltZXMgaXQgaXMgZXF1aXZhbGVudCB0byAtLXNoYXJlZC4gIFVuZm9ydHVuYXRlbHksCi0gICAgIHRoZSBmaXJzdCBmb3JtIHRha2VzIGFuIGFyZ3VtZW50LCB3aGlsZSB0aGUgc2Vjb25kIGRvZXMgbm90LgotCi0gICAgIFdlIG5lZWQgdG8gcGVybWl0IHRoZSAtLXNoYXJlZCBmb3JtIGJlY2F1c2Ugb24gc29tZSBwbGF0Zm9ybXMsCi0gICAgIHN1Y2ggYXMgU29sYXJpcywgZ2NjIC1zaGFyZWQgd2lsbCBwYXNzIC1HIHRvIHRoZSBsaW5rZXIuCi0KLSAgICAgVG8gcGVybWl0IGVpdGhlciB1c2FnZSwgd2UgbG9vayB0aHJvdWdoIHRoZSBhcmd1bWVudCBsaXN0LiAgSWYgd2UKLSAgICAgZmluZCAtRyBub3QgZm9sbG93ZWQgYnkgYSBudW1iZXIsIHdlIGNoYW5nZSBpdCBpbnRvIC0tc2hhcmVkLgotICAgICBUaGlzIHdpbGwgd29yayBmb3IgbW9zdCBub3JtYWwgY2FzZXMuICAqLwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIGlmIChzdHJjbXAgKGFyZ3ZbaV0sICItRyIpID09IDAKLQkmJiAoaSArIDEgPj0gYXJnYwotCSAgICB8fCAhIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSBhcmd2W2kgKyAxXVswXSkpKQotICAgICAgYXJndltpXSA9IChjaGFyICopICItLXNoYXJlZCI7Ci0KLSAgLyogQmVjYXVzZSB3ZSBwZXJtaXQgbG9uZyBvcHRpb25zIHRvIHN0YXJ0IHdpdGggYSBzaW5nbGUgZGFzaCwgYW5kCi0gICAgIHdlIGhhdmUgYSAtLWxpYnJhcnkgb3B0aW9uLCBhbmQgdGhlIC1sIG9wdGlvbiBpcyBjb252ZW50aW9uYWxseQotICAgICB1c2VkIHdpdGggYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGFyZ3VtZW50LCB3ZSBjYW4gaGF2ZSBiYWQKLSAgICAgcmVzdWx0cyBpZiBzb21lYm9keSB0cmllcyB0byB1c2UgLWwgd2l0aCBhIGxpYnJhcnkgd2hvc2UgbmFtZQotICAgICBoYXBwZW5zIHRvIHN0YXJ0IHdpdGggImlicmFyeSIsIGFzIGluIC1saS4gIFdlIGF2b2lkIHByb2JsZW1zIGJ5Ci0gICAgIHNpbXBseSB0dXJuaW5nIC1sIGludG8gLS1saWJyYXJ5LiAgVGhpcyBtZWFucyB0aGF0IHVzZXJzIHdpbGwKLSAgICAgaGF2ZSB0byB1c2UgdHdvIGRhc2hlcyBpbiBvcmRlciB0byB1c2UgLS1saWJyYXJ5LCB3aGljaCBpcyBPSwotICAgICBzaW5jZSB0aGF0J3MgaG93IGl0IGlzIGRvY3VtZW50ZWQuCi0KLSAgICAgRklYTUU6IEl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHByb2JsZW0gY2FuIGFyaXNlIGZvciBvdGhlciBzaG9ydAotICAgICBvcHRpb25zIGFzIHdlbGwsIGFsdGhvdWdoIHRoZSB1c2VyIGRvZXMgYWx3YXlzIGhhdmUgdGhlIHJlY291cnNlCi0gICAgIG9mIGFkZGluZyBhIHNwYWNlIGJldHdlZW4gdGhlIG9wdGlvbiBhbmQgdGhlIGFyZ3VtZW50LiAgKi8KLSAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXJndltpXVswXSA9PSAnLScKLQkgICYmIGFyZ3ZbaV1bMV0gPT0gJ2wnCi0JICAmJiBhcmd2W2ldWzJdICE9ICdcMCcpCi0JewotCSAgY2hhciAqbjsKLQotCSAgbiA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoYXJndltpXSkgKyAyMCk7Ci0JICBzcHJpbnRmIChuLCAiLS1saWJyYXJ5PSVzIiwgYXJndltpXSArIDIpOwotCSAgYXJndltpXSA9IG47Ci0JfQotICAgIH0KLQotICBsYXN0X29wdGluZCA9IC0xOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBpbnQgbG9uZ2luZDsKLSAgICAgIGludCBvcHRjOwotCi0gICAgICAvKiBVc2luZyBsYXN0X29wdGluZCBsZXRzIHVzIGF2b2lkIGNhbGxpbmcgbGRlbXVsX3BhcnNlX2FyZ3MKLQkgbXVsdGlwbGUgdGltZXMgb24gYSBzaW5nbGUgb3B0aW9uLCB3aGljaCB3b3VsZCBsZWFkIHRvCi0JIGNvbmZ1c2lvbiBpbiB0aGUgaW50ZXJuYWwgc3RhdGljIHZhcmlhYmxlcyBtYWludGFpbmVkIGJ5Ci0JIGdldG9wdC4gIFRoaXMgY291bGQgb3RoZXJ3aXNlIGhhcHBlbiBmb3IgYW4gYXJndW1lbnQgbGlrZQotCSAtbngsIGluIHdoaWNoIHRoZSAtbiBpcyBwYXJzZWQgYXMgYSBzaW5nbGUgb3B0aW9uLCBhbmQgd2UKLQkgbG9vcCBhcm91bmQgdG8gcGljayB1cCB0aGUgLXguICAqLwotICAgICAgaWYgKG9wdGluZCAhPSBsYXN0X29wdGluZCkKLQl7Ci0JICBpZiAobGRlbXVsX3BhcnNlX2FyZ3MgKGFyZ2MsIGFyZ3YpKQotCSAgICBjb250aW51ZTsKLQkgIGxhc3Rfb3B0aW5kID0gb3B0aW5kOwotCX0KLQotICAgICAgLyogZ2V0b3B0X2xvbmdfb25seSBpcyBsaWtlIGdldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJwotCSBjYW4gaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4gICovCi0gICAgICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgc2hvcnRvcHRzLCBsb25nb3B0cywgJmxvbmdpbmQpOwotCi0gICAgICBpZiAob3B0YyA9PSAtMSkKLQlicmVhazsKLSAgICAgIHN3aXRjaCAob3B0YykKLQl7Ci0JZGVmYXVsdDoKLQkgIHhleGl0ICgxKTsKLQljYXNlIDE6CQkJLyogRmlsZSBuYW1lLiAgKi8KLQkgIGxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywgbGFuZ19pbnB1dF9maWxlX2lzX2ZpbGVfZW51bSwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSUdOT1JFOgotCSAgYnJlYWs7Ci0JY2FzZSAnYSc6Ci0JICAvKiBGb3IgSFAvVVggY29tcGF0aWJpbGl0eS4gIEFjdHVhbGx5IC1hIHNoYXJlZCBzaG91bGQgbWVhbgotICAgICAgICAgICAgIGBgdXNlIG9ubHkgc2hhcmVkIGxpYnJhcmllcycnIGJ1dCwgdGhlbiwgd2UgZG9uJ3QKLSAgICAgICAgICAgICBjdXJyZW50bHkgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzIG9uIEhQL1VYIGFueWhvdy4gICovCi0JICBpZiAoc3RyY21wIChvcHRhcmcsICJhcmNoaXZlIikgPT0gMCkKLQkgICAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgZWxzZSBpZiAoc3RyY21wIChvcHRhcmcsICJzaGFyZWQiKSA9PSAwCi0JCSAgIHx8IHN0cmNtcCAob3B0YXJnLCAiZGVmYXVsdCIpID09IDApCi0JICAgIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogdW5yZWNvZ25pemVkIC1hIG9wdGlvbiBgJXMnXG4iKSwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0FTU0VSVDoKLQkgIC8qIEZJWE1FOiBXZSBqdXN0IGlnbm9yZSB0aGVzZSwgYnV0IHdlIHNob3VsZCBoYW5kbGUgdGhlbS4gICovCi0JICBpZiAoc3RyY21wIChvcHRhcmcsICJkZWZpbml0aW9ucyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibm9kZWZpbml0aW9ucyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAibm9zeW1ib2xpYyIpID09IDApCi0JICAgIDsKLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAicHVyZS10ZXh0IikgPT0gMCkKLQkgICAgOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogdW5yZWNvZ25pemVkIC1hc3NlcnQgb3B0aW9uIGAlcydcbiIpLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSAnQSc6Ci0JICBsZGZpbGVfYWRkX2FyY2ggKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdiJzoKLQkgIGxhbmdfYWRkX3RhcmdldCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ2MnOgotCSAgbGRmaWxlX29wZW5fY29tbWFuZF9maWxlIChvcHRhcmcpOwotCSAgcGFyc2VyX2lucHV0ID0gaW5wdXRfbXJpX3NjcmlwdDsKLQkgIHl5cGFyc2UgKCk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9DQUxMX1NIQVJFRDoKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9OX1NIQVJFRDoKLQkgIGNvbmZpZy5keW5hbWljX2xpbmsgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0NSRUY6Ci0JICBjb21tYW5kX2xpbmUuY3JlZiA9IHRydWU7Ci0JICBsaW5rX2luZm8ubm90aWNlX2FsbCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdkJzoKLQkgIGNvbW1hbmRfbGluZS5mb3JjZV9jb21tb25fZGVmaW5pdGlvbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9ERUZTWU06Ci0JICBsZXhfc3RyaW5nID0gb3B0YXJnOwotCSAgbGV4X3JlZGlyZWN0IChvcHRhcmcpOwotCSAgcGFyc2VyX2lucHV0ID0gaW5wdXRfZGVmc3ltOwotCSAgcGFyc2luZ19kZWZzeW0gPSAxOwotCSAgeXlwYXJzZSAoKTsKLQkgIHBhcnNpbmdfZGVmc3ltID0gMDsKLQkgIGxleF9zdHJpbmcgPSBOVUxMOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fREVNQU5HTEU6Ci0JICBkZW1hbmdsaW5nID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0RZTkFNSUNfTElOS0VSOgotCSAgY29tbWFuZF9saW5lLmludGVycHJldGVyID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fRUI6Ci0JICBjb21tYW5kX2xpbmUuZW5kaWFuID0gRU5ESUFOX0JJRzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VMOgotCSAgY29tbWFuZF9saW5lLmVuZGlhbiA9IEVORElBTl9MSVRUTEU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9FTUJFRERFRF9SRUxPQ1M6Ci0JICBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX0VYUE9SVF9EWU5BTUlDOgotCWNhc2UgJ0UnOiAvKiBIUC9VWCBjb21wYXRpYmlsaXR5LiAgKi8KLQkgIGNvbW1hbmRfbGluZS5leHBvcnRfZHluYW1pYyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdlJzoKLQkgIGxhbmdfYWRkX2VudHJ5IChvcHRhcmcsIHRydWUpOwotCSAgYnJlYWs7Ci0JY2FzZSAnZic6Ci0JICBpZiAoY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzID09IE5VTEwpCi0JICAgIHsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPQotCQkoY2hhciAqKikgeG1hbGxvYyAoMiAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzWzBdID0gb3B0YXJnOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyc1sxXSA9IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGludCBjOwotCSAgICAgIGNoYXIgKipwOwotCi0JICAgICAgYyA9IDA7Ci0JICAgICAgZm9yIChwID0gY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzOyAqcCAhPSBOVUxMOyBwKyspCi0JCSsrYzsKLQkgICAgICBjb21tYW5kX2xpbmUuYXV4aWxpYXJ5X2ZpbHRlcnMgPQotCQkoY2hhciAqKikgeHJlYWxsb2MgKGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVycywKLQkJCQkgICAgKGMgKyAyKSAqIHNpemVvZiAoY2hhciAqKSk7Ci0JICAgICAgY29tbWFuZF9saW5lLmF1eGlsaWFyeV9maWx0ZXJzW2NdID0gb3B0YXJnOwotCSAgICAgIGNvbW1hbmRfbGluZS5hdXhpbGlhcnlfZmlsdGVyc1tjICsgMV0gPSBOVUxMOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdGJzoKLQkgIGNvbW1hbmRfbGluZS5maWx0ZXJfc2hsaWIgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9GT1JDRV9FWEVfU1VGRklYOgotCSAgY29tbWFuZF9saW5lLmZvcmNlX2V4ZV9zdWZmaXggPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnRyc6Ci0JICB7Ci0JICAgIGNoYXIgKmVuZDsKLQkgICAgZ19zd2l0Y2hfdmFsdWUgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotCSAgICBpZiAoKmVuZCkKLQkgICAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBudW1iZXIgYCVzJ1xuIiksIG9wdGFyZyk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlICdnJzoKLQkgIC8qIElnbm9yZS4gICovCi0JICBicmVhazsKLQljYXNlIE9QVElPTl9HQ19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5nY19zZWN0aW9ucyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9IRUxQOgotCSAgaGVscCAoKTsKLQkgIHhleGl0ICgwKTsKLQkgIGJyZWFrOwotCWNhc2UgJ0wnOgotCSAgbGRmaWxlX2FkZF9saWJyYXJ5X3BhdGggKG9wdGFyZywgdHJ1ZSk7Ci0JICBicmVhazsKLQljYXNlICdsJzoKLQkgIGxhbmdfYWRkX2lucHV0X2ZpbGUgKG9wdGFyZywgbGFuZ19pbnB1dF9maWxlX2lzX2xfZW51bSwKLQkJCSAgICAgICAoY2hhciAqKSBOVUxMKTsKLQkgIGJyZWFrOwotCWNhc2UgJ00nOgotCSAgY29uZmlnLm1hcF9maWxlbmFtZSA9ICItIjsKLQkgIGJyZWFrOwotCWNhc2UgJ20nOgotCSAgLyogSWdub3JlLiAgV2FzIGhhbmRsZWQgaW4gYSBwcmUtcGFyc2UuICAgKi8KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX01BUDoKLQkgIGNvbmZpZy5tYXBfZmlsZW5hbWUgPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IGZhbHNlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnbic6Ci0JICBjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19ERU1BTkdMRToKLQkgIGRlbWFuZ2xpbmcgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX0dDX1NFQ1RJT05TOgotCSAgY29tbWFuZF9saW5lLmdjX3NlY3Rpb25zID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19LRUVQX01FTU9SWToKLQkgIGxpbmtfaW5mby5rZWVwX21lbW9yeSA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fTk9fVU5ERUZJTkVEOgotCSAgbGlua19pbmZvLm5vX3VuZGVmaW5lZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19XQVJOX01JU01BVENIOgotCSAgY29tbWFuZF9saW5lLndhcm5fbWlzbWF0Y2ggPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PSU5ISUJJVF9FWEVDOgotCSAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX05PX1dIT0xFX0FSQ0hJVkU6Ci0JICB3aG9sZV9hcmNoaXZlID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICdPJzoKLQkgIC8qIEZJWE1FICItTzxub24tZGlnaXRzPiA8dmFsdWU+IiB1c2VkIHRvIHNldCB0aGUgYWRkcmVzcyBvZgotCSAgICAgc2VjdGlvbiA8bm9uLWRpZ2l0cz4uICBXYXMgdGhpcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi0JICAgICBzb21ldGhpbmcsIG9yIGNhbiB3ZSBjcmVhdGUgYSBuZXcgb3B0aW9uIHRvIGRvIHRoYXQKLQkgICAgICh3aXRoIGEgc3ludGF4IHNpbWlsYXIgdG8gLWRlZnN5bSk/Ci0JICAgICBnZXRvcHQgY2FuJ3QgaGFuZGxlIHR3byBhcmdzIHRvIGFuIG9wdGlvbiB3aXRob3V0IGtsdWRnZXMuICAqLwotCi0JICAvKiBFbmFibGUgb3B0aW1pemF0aW9ucyBvZiBvdXRwdXQgZmlsZXMuICAqLwotCSAgbGlua19pbmZvLm9wdGltaXplID0gc3RydG91bCAob3B0YXJnLCBOVUxMLCAwKSA/IHRydWUgOiBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgJ28nOgotCSAgbGFuZ19hZGRfb3V0cHV0IChvcHRhcmcsIDApOyAKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX09GT1JNQVQ6Ci0JICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0IChvcHRhcmcsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDApOwotCSAgYnJlYWs7Ci0JY2FzZSAnaSc6Ci0JY2FzZSAncic6Ci0JICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLQkgIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSBmYWxzZTsKLQkgIGNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQgPSBmYWxzZTsKLQkgIGNvbmZpZy50ZXh0X3JlYWRfb25seSA9IGZhbHNlOwotCSAgY29uZmlnLmR5bmFtaWNfbGluayA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnUic6Ci0JICAvKiBUaGUgR05VIGxpbmtlciB0cmFkaXRpb25hbGx5IHVzZXMgLVIgdG8gbWVhbiB0byBpbmNsdWRlCi0JICAgICBvbmx5IHRoZSBzeW1ib2xzIGZyb20gYSBmaWxlLiAgVGhlIFNvbGFyaXMgbGlua2VyIHVzZXMgLVIKLQkgICAgIHRvIHNldCB0aGUgcGF0aCB1c2VkIGJ5IHRoZSBydW50aW1lIGxpbmtlciB0byBmaW5kCi0JICAgICBsaWJyYXJpZXMuICBUaGlzIGlzIHRoZSBHTlUgbGlua2VyIC1ycGF0aCBhcmd1bWVudC4gIFdlCi0JICAgICB0cnkgdG8gc3VwcG9ydCBib3RoIHNpbXVsdGFuZW91c2x5IGJ5IGNoZWNraW5nIHRoZSBmaWxlCi0JICAgICBuYW1lZC4gIElmIGl0IGlzIGEgZGlyZWN0b3J5LCByYXRoZXIgdGhhbiBhIHJlZ3VsYXIgZmlsZSwKLQkgICAgIHdlIGFzc3VtZSAtcnBhdGggd2FzIG1lYW50LiAgKi8KLQkgIHsKLQkgICAgc3RydWN0IHN0YXQgczsKLQotCSAgICBpZiAoc3RhdCAob3B0YXJnLCAmcykgPj0gMAotCQkmJiAhIFNfSVNESVIgKHMuc3RfbW9kZSkpCi0JICAgICAgewotCQlsYW5nX2FkZF9pbnB1dF9maWxlIChvcHRhcmcsCi0JCQkJICAgICBsYW5nX2lucHV0X2ZpbGVfaXNfc3ltYm9sc19vbmx5X2VudW0sCi0JCQkJICAgICAoY2hhciAqKSBOVUxMKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgfQotCSAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLQljYXNlIE9QVElPTl9SUEFUSDoKLQkgIGlmIChjb21tYW5kX2xpbmUucnBhdGggPT0gTlVMTCkKLQkgICAgY29tbWFuZF9saW5lLnJwYXRoID0gYnV5c3RyaW5nIChvcHRhcmcpOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc2l6ZV90IHJwYXRoX2xlbiA9IHN0cmxlbiAoY29tbWFuZF9saW5lLnJwYXRoKTsKLQkgICAgICBzaXplX3Qgb3B0YXJnX2xlbiA9IHN0cmxlbiAob3B0YXJnKTsKLQkgICAgICBjaGFyICpidWY7Ci0JICAgICAgY2hhciAqY3AgPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0KLQkgICAgICAvKiBGaXJzdCBzZWUgd2hldGhlciBPUFRBUkcgaXMgYWxyZWFkeSBpbiB0aGUgcGF0aC4gICovCi0JICAgICAgZG8KLQkJewotCQkgIHNpemVfdCBpZHggPSAwOwotCQkgIHdoaWxlIChvcHRhcmdbaWR4XSAhPSAnXDAnICYmIG9wdGFyZ1tpZHhdID09IGNwW2lkeF0pCi0JCSAgICArK2lkeDsKLQkJICBpZiAob3B0YXJnW2lkeF0gPT0gJ1wwJwotCQkgICAgICAmJiAoY3BbaWR4XSA9PSAnXDAnIHx8IGNwW2lkeF0gPT0gJzonKSkKLQkJICAgIC8qIFdlIGZvdW5kIGl0LiAgKi8KLQkJICAgIGJyZWFrOwotCi0JCSAgLyogTm90IHlldCBmb3VuZC4gICovCi0JCSAgY3AgPSBzdHJjaHIgKGNwLCAnOicpOwotCQkgIGlmIChjcCAhPSBOVUxMKQotCQkgICAgKytjcDsKLQkJfQotCSAgICAgIHdoaWxlIChjcCAhPSBOVUxMKTsKLQotCSAgICAgIGlmIChjcCA9PSBOVUxMKQotCQl7Ci0JCSAgYnVmID0geG1hbGxvYyAocnBhdGhfbGVuICsgb3B0YXJnX2xlbiArIDIpOwotCQkgIHNwcmludGYgKGJ1ZiwgIiVzOiVzIiwgY29tbWFuZF9saW5lLnJwYXRoLCBvcHRhcmcpOwotCQkgIGZyZWUgKGNvbW1hbmRfbGluZS5ycGF0aCk7Ci0JCSAgY29tbWFuZF9saW5lLnJwYXRoID0gYnVmOwotCQl9Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1JQQVRIX0xJTks6Ci0JICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTCkKLQkgICAgY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPSBidXlzdHJpbmcgKG9wdGFyZyk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICpidWY7Ci0KLQkgICAgICBidWYgPSB4bWFsbG9jIChzdHJsZW4gKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rKQotCQkJICAgICArIHN0cmxlbiAob3B0YXJnKQotCQkJICAgICArIDIpOwotCSAgICAgIHNwcmludGYgKGJ1ZiwgIiVzOiVzIiwgY29tbWFuZF9saW5lLnJwYXRoX2xpbmssIG9wdGFyZyk7Ci0JICAgICAgZnJlZSAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmspOwotCSAgICAgIGNvbW1hbmRfbGluZS5ycGF0aF9saW5rID0gYnVmOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9SRUxBWDoKLQkgIGNvbW1hbmRfbGluZS5yZWxheCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9SRVRBSU5fU1lNQk9MU19GSUxFOgotCSAgYWRkX2tlZXBzeW1zX2ZpbGUgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICdTJzoKLQkgIGxpbmtfaW5mby5zdHJpcCA9IHN0cmlwX2RlYnVnZ2VyOwotCSAgYnJlYWs7Ci0JY2FzZSAncyc6Ci0JICBsaW5rX2luZm8uc3RyaXAgPSBzdHJpcF9hbGw7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9TSEFSRUQ6Ci0JICBpZiAoY29uZmlnLmhhc19zaGFyZWQpCi0JICAgIGxpbmtfaW5mby5zaGFyZWQgPSB0cnVlOwotCSAgZWxzZQotCSAgICBlaW5mbyAoXygiJVAlRjogLXNoYXJlZCBub3Qgc3VwcG9ydGVkXG4iKSk7Ci0JICBicmVhazsKLQljYXNlICdoJzoJCS8qIFVzZWQgb24gU29sYXJpcy4gICovCi0JY2FzZSBPUFRJT05fU09OQU1FOgotCSAgY29tbWFuZF9saW5lLnNvbmFtZSA9IG9wdGFyZzsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NPUlRfQ09NTU9OOgotCSAgY29uZmlnLnNvcnRfY29tbW9uID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NUQVRTOgotCSAgY29uZmlnLnN0YXRzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1NZTUJPTElDOgotCSAgbGlua19pbmZvLnN5bWJvbGljID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgdHJhY2VfZmlsZXMgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAnVCc6Ci0JICBsZGZpbGVfb3Blbl9jb21tYW5kX2ZpbGUgKG9wdGFyZyk7Ci0JICBwYXJzZXJfaW5wdXQgPSBpbnB1dF9zY3JpcHQ7Ci0JICB5eXBhcnNlICgpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEJTUzoKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLmJzcyIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9UREFUQToKLQkgIHNldF9zZWN0aW9uX3N0YXJ0ICgiLmRhdGEiLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVFRFWFQ6Ci0JICBzZXRfc2VjdGlvbl9zdGFydCAoIi50ZXh0Iiwgb3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1RSQURJVElPTkFMX0ZPUk1BVDoKLQkgIGxpbmtfaW5mby50cmFkaXRpb25hbF9mb3JtYXQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVEFTS19MSU5LOgotCSAgbGlua19pbmZvLnRhc2tfbGluayA9IHRydWU7Ci0JICAvKiBGYWxsIHRocm91Z2ggLSBkbyBhbiBpbXBsaWVkIC1yIG9wdGlvbi4gICovCi0JY2FzZSBPUFRJT05fVVI6Ci0JICBsaW5rX2luZm8ucmVsb2NhdGVhYmxlID0gdHJ1ZTsKLQkgIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPSB0cnVlOwotCSAgY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCA9IGZhbHNlOwotCSAgY29uZmlnLnRleHRfcmVhZF9vbmx5ID0gZmFsc2U7Ci0JICBjb25maWcuZHluYW1pY19saW5rID0gZmFsc2U7Ci0JICBicmVhazsKLQljYXNlICd1JzoKLQkgIGxkbGFuZ19hZGRfdW5kZWYgKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJCT1NFOgotCSAgbGR2ZXJzaW9uICgxKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICB0cmFjZV9maWxlX3RyaWVzID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgJ3YnOgotCSAgbGR2ZXJzaW9uICgwKTsKLQkgIHZlcnNpb25fcHJpbnRlZCA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlICdWJzoKLQkgIGxkdmVyc2lvbiAoMSk7Ci0JICB2ZXJzaW9uX3ByaW50ZWQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTjoKLQkgIC8qIFRoaXMgb3V0cHV0IGlzIGludGVuZGVkIHRvIGZvbGxvdyB0aGUgR05VIHN0YW5kYXJkcyBkb2N1bWVudC4gICovCi0JICBwcmludGYgKCJHTlUgbGQgJXNcbiIsIGxkX3Byb2dyYW1fdmVyc2lvbik7Ci0JICBwcmludGYgKF8oIkNvcHlyaWdodCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLlxuIikpOwotCSAgcHJpbnRmIChfKCJcCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgdGhlIHRlcm1zIG9mXG5cCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dyYW0gaGFzIGFic29sdXRlbHkgbm8gd2FycmFudHkuXG4iKSk7Ci0JICB7Ci0JICAgIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgKipwdHIgPSBsZF9lbXVsYXRpb25zOwotICAgIAotCSAgICBwcmludGYgKF8oIiAgU3VwcG9ydGVkIGVtdWxhdGlvbnM6XG4iKSk7Ci0JICAgIHdoaWxlICgqcHRyKSAKLQkgICAgICB7Ci0JCXByaW50ZiAoIiAgICVzXG4iLCAoKnB0ciktPmVtdWxhdGlvbl9uYW1lKTsKLQkJcHRyKys7Ci0JICAgICAgfQotCSAgfQotCSAgeGV4aXQgKDApOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fVkVSU0lPTl9TQ1JJUFQ6Ci0JICAvKiBUaGlzIG9wdGlvbiBpbmRpY2F0ZXMgYSBzbWFsbCBzY3JpcHQgdGhhdCBvbmx5IHNwZWNpZmllcwotICAgICAgICAgICAgIHZlcnNpb24gaW5mb3JtYXRpb24uICBSZWFkIGl0LCBidXQgZG9uJ3QgYXNzdW1lIHRoYXQKLSAgICAgICAgICAgICB3ZSd2ZSBzZWVuIGEgbGlua2VyIHNjcmlwdC4gICovCi0JICB7Ci0JICAgIGJvb2xlYW4gaG9sZF9oYWRfc2NyaXB0OwotCi0JICAgIGhvbGRfaGFkX3NjcmlwdCA9IGhhZF9zY3JpcHQ7Ci0JICAgIGxkZmlsZV9vcGVuX2NvbW1hbmRfZmlsZSAob3B0YXJnKTsKLQkgICAgaGFkX3NjcmlwdCA9IGhvbGRfaGFkX3NjcmlwdDsKLQkgICAgcGFyc2VyX2lucHV0ID0gaW5wdXRfdmVyc2lvbl9zY3JpcHQ7Ci0JICAgIHl5cGFyc2UgKCk7Ci0JICB9Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9WRVJTSU9OX0VYUE9SVFNfU0VDVElPTjoKLQkgIC8qIFRoaXMgb3B0aW9uIHJlY29yZHMgYSB2ZXJzaW9uIHN5bWJvbCB0byBiZSBhcHBsaWVkIHRvIHRoZQotCSAgICAgc3ltYm9scyBsaXN0ZWQgZm9yIGV4cG9ydCB0byBiZSBmb3VuZCBpbiB0aGUgb2JqZWN0IGZpbGVzCi0JICAgICAuZXhwb3J0cyBzZWN0aW9ucy4gICovCi0JICBjb21tYW5kX2xpbmUudmVyc2lvbl9leHBvcnRzX3NlY3Rpb24gPSBvcHRhcmc7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX0NPTU1PTjoKLQkgIGNvbmZpZy53YXJuX2NvbW1vbiA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX0NPTlNUUlVDVE9SUzoKLQkgIGNvbmZpZy53YXJuX2NvbnN0cnVjdG9ycyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX01VTFRJUExFX0dQOgotCSAgY29uZmlnLndhcm5fbXVsdGlwbGVfZ3AgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSBPUFRJT05fV0FSTl9PTkNFOgotCSAgY29uZmlnLndhcm5fb25jZSA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9XQVJOX1NFQ1RJT05fQUxJR046Ci0JICBjb25maWcud2Fybl9zZWN0aW9uX2FsaWduID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dIT0xFX0FSQ0hJVkU6Ci0JICB3aG9sZV9hcmNoaXZlID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgT1BUSU9OX1dSQVA6Ci0JICBhZGRfd3JhcCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1gnOgotCSAgbGlua19pbmZvLmRpc2NhcmQgPSBkaXNjYXJkX2w7Ci0JICBicmVhazsKLQljYXNlICd4JzoKLQkgIGxpbmtfaW5mby5kaXNjYXJkID0gZGlzY2FyZF9hbGw7Ci0JICBicmVhazsKLQljYXNlICdZJzoKLQkgIGlmIChzdHJuY21wIChvcHRhcmcsICJQLCIsIDIpID09IDApCi0JICAgIG9wdGFyZyArPSAyOwotCSAgZGVmYXVsdF9kaXJsaXN0ID0geHN0cmR1cCAob3B0YXJnKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3knOgotCSAgYWRkX3lzeW0gKG9wdGFyZyk7Ci0JICBicmVhazsKLQljYXNlICd6JzoKLQkgIC8qIFdlIGFjY2VwdCBhbmQgaWdub3JlIHRoaXMgb3B0aW9uIGZvciBTb2xhcmlzCi0gICAgICAgICAgICAgY29tcGF0aWJpbGl0eS4gIEFjdHVhbGx5LCBvbiBTb2xhcmlzLCBvcHRhcmcgaXMgbm90Ci0gICAgICAgICAgICAgaWdub3JlZC4gIFNvbWVkYXkgd2Ugc2hvdWxkIGhhbmRsZSBpdCBjb3JyZWN0bHkuICBGSVhNRS4gICovCi0JICBicmVhazsKLQljYXNlIE9QVElPTl9TUExJVF9CWV9SRUxPQzoKLQkgIGNvbmZpZy5zcGxpdF9ieV9yZWxvYyA9IGF0b2kgKG9wdGFyZyk7Ci0JICBicmVhazsgCi0JY2FzZSBPUFRJT05fU1BMSVRfQllfRklMRToKLQkgIGNvbmZpZy5zcGxpdF9ieV9maWxlID0gdHJ1ZTsKLQkgIGJyZWFrOyAKLQljYXNlIE9QVElPTl9DSEVDS19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IHRydWU7Ci0JICBicmVhazsKLQljYXNlIE9QVElPTl9OT19DSEVDS19TRUNUSU9OUzoKLQkgIGNvbW1hbmRfbGluZS5jaGVja19zZWN0aW9uX2FkZHJlc3NlcyA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAnKCc6Ci0JICBpZiAoaW5ncm91cCkKLQkgICAgewotCSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkJICAgICAgIF8oIiVzOiBtYXkgbm90IG5lc3QgZ3JvdXBzICgtLWhlbHAgZm9yIHVzYWdlKVxuIiksCi0JCSAgICAgICBwcm9ncmFtX25hbWUpOwotCSAgICAgIHhleGl0ICgxKTsKLQkgICAgfQotCSAgbGFuZ19lbnRlcl9ncm91cCAoKTsKLQkgIGluZ3JvdXAgPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSAnKSc6Ci0JICBpZiAoISBpbmdyb3VwKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLAotCQkgICAgICAgXygiJXM6IGdyb3VwIGVuZGVkIGJlZm9yZSBpdCBiZWdhbiAoLS1oZWxwIGZvciB1c2FnZSlcbiIpLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lKTsKLQkgICAgICB4ZXhpdCAoMSk7Ci0JICAgIH0KLQkgIGxhbmdfbGVhdmVfZ3JvdXAgKCk7Ci0JICBpbmdyb3VwID0gMDsKLQkgIGJyZWFrOwotICAgICAgY2FzZSBPUFRJT05fTVBDODYwQzA6Ci0gICAgICAgICAgbGlua19pbmZvLm1wYzg2MGMwID0gMjA7ICAgICAgLyogZGVmYXVsdCB2YWx1ZSAoaW4gYnl0ZXMpICovCi0gICAgICAgICAgaWYgKG9wdGFyZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdW5zaWduZWQgd29yZHM7Ci0KLSAgICAgICAgICAgICAgd29yZHMgPSBpc19udW0gKG9wdGFyZywgMSwgMTAsIDApOwotICAgICAgICAgICAgICBpZiAod29yZHMgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIkludmFsaWQgYXJndW1lbnQgdG8gb3B0aW9uIFwibXBjODYwYzBcIlxuIikpOwotICAgICAgICAgICAgICAgICAgeGV4aXQgKDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbGlua19pbmZvLm1wYzg2MGMwID0gd29yZHMgKiA0OyAgIC8qIGNvbnZlcnQgd29yZHMgdG8gYnl0ZXMgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICBjb21tYW5kX2xpbmUucmVsYXggPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotCi0JY2FzZSBPUFRJT05fSU5JVDoKLQkgIGxpbmtfaW5mby5pbml0X2Z1bmN0aW9uID0gb3B0YXJnOwotCSAgYnJlYWs7Ci0JICAKLQljYXNlIE9QVElPTl9GSU5JOgotCSAgbGlua19pbmZvLmZpbmlfZnVuY3Rpb24gPSBvcHRhcmc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChpbmdyb3VwKQotICAgIGxhbmdfbGVhdmVfZ3JvdXAgKCk7Ci0KLSAgaWYgKGRlZmF1bHRfZGlybGlzdCAhPSBOVUxMKQotICAgIHNldF9kZWZhdWx0X2Rpcmxpc3QgKGRlZmF1bHRfZGlybGlzdCk7Ci0KLX0KLQotLyogQWRkIHRoZSAoY29sb24tc2VwYXJhdGVkKSBlbGVtZW50cyBvZiBESVJMSVNUX1BUUiB0byB0aGUKLSAgIGxpYnJhcnkgc2VhcmNoIHBhdGguICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2RlZmF1bHRfZGlybGlzdCAoZGlybGlzdF9wdHIpCi0gICAgIGNoYXIgKmRpcmxpc3RfcHRyOwotewotICBjaGFyICpwOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIHAgPSBzdHJjaHIgKGRpcmxpc3RfcHRyLCBQQVRIX1NFUEFSQVRPUik7Ci0gICAgICBpZiAocCAhPSBOVUxMKQotCSpwID0gJ1wwJzsKLSAgICAgIGlmICgqZGlybGlzdF9wdHIgIT0gJ1wwJykKLQlsZGZpbGVfYWRkX2xpYnJhcnlfcGF0aCAoZGlybGlzdF9wdHIsIHRydWUpOwotICAgICAgaWYgKHAgPT0gTlVMTCkKLQlicmVhazsKLSAgICAgIGRpcmxpc3RfcHRyID0gcCArIDE7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc2V0X3NlY3Rpb25fc3RhcnQgKHNlY3QsIHZhbHN0cikKLSAgICAgY2hhciAqc2VjdCwgKnZhbHN0cjsKLXsKLSAgY2hhciAqZW5kOwotICB1bnNpZ25lZCBsb25nIHZhbCA9IHN0cnRvdWwgKHZhbHN0ciwgJmVuZCwgMTYpOwotICBpZiAoKmVuZCkKLSAgICBlaW5mbyAoXygiJVAlRjogaW52YWxpZCBoZXggbnVtYmVyIGAlcydcbiIpLCB2YWxzdHIpOwotICBsYW5nX3NlY3Rpb25fc3RhcnQgKHNlY3QsIGV4cF9pbnRvcCAodmFsKSk7Ci19Ci0MCi0vKiBQcmludCBoZWxwIG1lc3NhZ2VzIGZvciB0aGUgb3B0aW9ucy4gICovCi0KLXN0YXRpYyB2b2lkCi1oZWxwICgpCi17Ci0gIGludCBpOwotICBjb25zdCBjaGFyICoqdGFyZ2V0cywgKipwcDsKLQotICBwcmludGYgKF8oIlVzYWdlOiAlcyBbb3B0aW9uc10gZmlsZS4uLlxuIiksIHByb2dyYW1fbmFtZSk7Ci0KLSAgcHJpbnRmIChfKCJPcHRpb25zOlxuIikpOwotICBmb3IgKGkgPSAwOyBpIDwgT1BUSU9OX0NPVU5UOyBpKyspCi0gICAgewotICAgICAgaWYgKGxkX29wdGlvbnNbaV0uZG9jICE9IE5VTEwpCi0JewotCSAgYm9vbGVhbiBjb21tYTsKLQkgIGludCBsZW47Ci0JICBpbnQgajsKLQotCSAgcHJpbnRmICgiICAiKTsKLQotCSAgY29tbWEgPSBmYWxzZTsKLQkgIGxlbiA9IDI7Ci0KLQkgIGogPSBpOwotCSAgZG8KLQkgICAgewotCSAgICAgIGlmIChsZF9vcHRpb25zW2pdLnNob3J0b3B0ICE9ICdcMCcKLQkJICAmJiBsZF9vcHRpb25zW2pdLmNvbnRyb2wgIT0gTk9fSEVMUCkKLQkJewotCQkgIHByaW50ZiAoIiVzLSVjIiwgY29tbWEgPyAiLCAiIDogIiIsIGxkX29wdGlvbnNbal0uc2hvcnRvcHQpOwotCQkgIGxlbiArPSAoY29tbWEgPyAyIDogMCkgKyAyOwotCQkgIGlmIChsZF9vcHRpb25zW2pdLmFyZyAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBpZiAobGRfb3B0aW9uc1tqXS5vcHQuaGFzX2FyZyAhPSBvcHRpb25hbF9hcmd1bWVudCkKLQkJCXsKLQkJCSAgcHJpbnRmICgiICIpOwotCQkJICArK2xlbjsKLQkJCX0KLQkJICAgICAgcHJpbnRmICgiJXMiLCBfKGxkX29wdGlvbnNbal0uYXJnKSk7Ci0JCSAgICAgIGxlbiArPSBzdHJsZW4gKF8obGRfb3B0aW9uc1tqXS5hcmcpKTsKLQkJICAgIH0KLQkJICBjb21tYSA9IHRydWU7Ci0JCX0KLQkgICAgICArK2o7Ci0JICAgIH0KLQkgIHdoaWxlIChqIDwgT1BUSU9OX0NPVU5UICYmIGxkX29wdGlvbnNbal0uZG9jID09IE5VTEwpOwotCi0JICBqID0gaTsKLQkgIGRvCi0JICAgIHsKLQkgICAgICBpZiAobGRfb3B0aW9uc1tqXS5vcHQubmFtZSAhPSBOVUxMCi0JCSAgJiYgbGRfb3B0aW9uc1tqXS5jb250cm9sICE9IE5PX0hFTFApCi0JCXsKLQkJICBwcmludGYgKCIlcy0lcyVzIiwKLQkJCSAgY29tbWEgPyAiLCAiIDogIiIsCi0JCQkgIGxkX29wdGlvbnNbal0uY29udHJvbCA9PSBUV09fREFTSEVTID8gIi0iIDogIiIsCi0JCQkgIGxkX29wdGlvbnNbal0ub3B0Lm5hbWUpOwotCQkgIGxlbiArPSAoKGNvbW1hID8gMiA6IDApCi0JCQkgICsgMQotCQkJICArIChsZF9vcHRpb25zW2pdLmNvbnRyb2wgPT0gVFdPX0RBU0hFUyA/IDEgOiAwKQotCQkJICArIHN0cmxlbiAobGRfb3B0aW9uc1tqXS5vcHQubmFtZSkpOwotCQkgIGlmIChsZF9vcHRpb25zW2pdLmFyZyAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBwcmludGYgKCIgJXMiLCBfKGxkX29wdGlvbnNbal0uYXJnKSk7Ci0JCSAgICAgIGxlbiArPSAxICsgc3RybGVuIChfKGxkX29wdGlvbnNbal0uYXJnKSk7Ci0JCSAgICB9Ci0JCSAgY29tbWEgPSB0cnVlOwotCQl9Ci0JICAgICAgKytqOwotCSAgICB9Ci0JICB3aGlsZSAoaiA8IE9QVElPTl9DT1VOVCAmJiBsZF9vcHRpb25zW2pdLmRvYyA9PSBOVUxMKTsKLQotCSAgaWYgKGxlbiA+PSAzMCkKLQkgICAgewotCSAgICAgIHByaW50ZiAoIlxuIik7Ci0JICAgICAgbGVuID0gMDsKLQkgICAgfQotCi0JICBmb3IgKDsgbGVuIDwgMzA7IGxlbisrKQotCSAgICBwdXRjaGFyICgnICcpOwotCi0JICBwcmludGYgKCIlc1xuIiwgXyhsZF9vcHRpb25zW2ldLmRvYykpOwotCX0KLSAgICB9Ci0KLSAgLyogTm90ZTogVmFyaW91cyB0b29scyAoc3VjaCBhcyBsaWJ0b29sKSBkZXBlbmQgdXBvbiB0aGUKLSAgICAgZm9ybWF0IG9mIHRoZSBsaXN0aW5ncyBiZWxvdyAtIGRvIG5vdCBjaGFuZ2UgdGhlbS4gICovCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoXygiJXM6IHN1cHBvcnRlZCB0YXJnZXRzOiIpLCBwcm9ncmFtX25hbWUpOwotICB0YXJnZXRzID0gYmZkX3RhcmdldF9saXN0ICgpOwotICBmb3IgKHBwID0gdGFyZ2V0czsgKnBwICE9IE5VTEw7IHBwKyspCi0gICAgcHJpbnRmICgiICVzIiwgKnBwKTsKLSAgZnJlZSAodGFyZ2V0cyk7Ci0gIHByaW50ZiAoIlxuIik7Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgcHJpbnRmIChfKCIlczogc3VwcG9ydGVkIGVtdWxhdGlvbnM6ICIpLCBwcm9ncmFtX25hbWUpOwotICBsZGVtdWxfbGlzdF9lbXVsYXRpb25zIChzdGRvdXQpOwotICBwcmludGYgKCJcbiIpOwotCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIHByaW50ZiAoXygiJXM6IGVtdWxhdGlvbiBzcGVjaWZpYyBvcHRpb25zOlxuIiksIHByb2dyYW1fbmFtZSk7Ci0gIGxkZW11bF9saXN0X2VtdWxhdGlvbl9vcHRpb25zIChzdGRvdXQpOwotICBwcmludGYgKCJcbiIpOwotICAKLSAgcHJpbnRmIChfKCJcblJlcG9ydCBidWdzIHRvIGJ1Zy1nbnUtdXRpbHNAZ251Lm9yZ1xuIikpOwotfQpkaWZmIC0tZ2l0IGEvbGQvbWFjLWxkLnIgYi9sZC9tYWMtbGQucgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMxNmZjNS4uMDAwMDAwMAotLS0gYS9sZC9tYWMtbGQucgorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qIFJlc291cmNlcyBmb3IgR05VIExELiAqLwotCi0jaW5jbHVkZSAiU3lzVHlwZXMuciIKLQotLyogVmVyc2lvbiByZXNvdXJjZXMuICovCi0KLXJlc291cmNlICd2ZXJzJyAoMSkgIHsKLQkwLAotCTAsCi0JMCwKLQkwLAotCXZlclVzLAotCVZFUlNJT05fU1RSSU5HLAotCVZFUlNJT05fU1RSSU5HICAiIChDKSAxOTg2LTk1IEZTRiwgSW5jLiIKLX07Ci0KLXJlc291cmNlICd2ZXJzJyAoMiwgcHVyZ2VhYmxlKSAgewotCTAsCi0JMCwKLQkwLAotCTAsCi0JdmVyVXMsCi0JVkVSU0lPTl9TVFJJTkcsCi0JIkdMRCAiIFZFUlNJT05fU1RSSU5HICIgZm9yIE1QVyIKLX07Ci0KLSNpZmRlZiBXQU5UX0NGUkcKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotCXsKLQkJa1Bvd2VyUEMsCi0JCWtGdWxsTGliLAotCQlrTm9WZXJzaW9uTnVtLCBrTm9WZXJzaW9uTnVtLAotCQkwLCAwLAotCQlrSXNBcHAsIGtPbkRpc2tGbGF0LCBrWmVyb09mZnNldCwga1dob2xlRm9yaywKLQkJUFJPR19OQU1FCi0JfQotfTsKLQotI2VuZGlmIC8qIFdBTlRfQ0ZSRyAqLwpkaWZmIC0tZ2l0IGEvbGQvbXB3LWNvbmZpZy5pbiBiL2xkL21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNTQyY2MuLjAwMDAwMDAKLS0tIGEvbGQvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3IgTEQuCi0KLUlmICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iID1+IC9tNjhrLWFwcGxlLW1hY29zLwotCVNldCBlbXVsbmFtZSBtNjhrY29mZgotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVtNjhrY29mZi5jIGVtNjhrY29mZi5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlbTY4a2NvZmYuYy5vCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL3Bvd2VycGMtYXBwbGUtbWFjb3MvCi0JU2V0IGVtdWxuYW1lIHBwY21hY29zCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZXBwY21hYy5jIGVwcGNtYWNvcy5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlcHBjbWFjb3MuYy5vCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL2kzODYtXE9wdGlvbi14LWdvMzIvCi0JU2V0IGVtdWxuYW1lIGkzODZnbzMyCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJtcHctZWkzODZnbzMyLmMgZWkzODZnbzMyLmMKLQlTZXQgZW11bGF0aW9uX29maWxlcyAie299ImVpMzg2Z28zMi5jLm8KLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvbWlwcy1cT3B0aW9uLXgtZWNvZmYvCi0JU2V0IGVtdWxuYW1lIG1pcHNpZHQKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1pZHRtaXBzLmMgZW1pcHNpZHQuYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZW1pcHNpZHQuYy5vCi0KLUVsc2UgSWYgInt0YXJnZXRfY2Fub25pY2FsfSIgPX4gL21pcHMtXE9wdGlvbi14LVxPcHRpb24teC8KLQlTZXQgZW11bG5hbWUgZWxmMzJlYm1pcAotCWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0ibXB3LWVsZm1pcHMuYyBlZWxmMzJlYm1pcC5jCi0JU2V0IGVtdWxhdGlvbl9vZmlsZXMgIntvfSJlZWxmMzJlYm1pcC5jLm8KLQotRWxzZSBJZiAie3RhcmdldF9jYW5vbmljYWx9IiA9fiAvc2gtXE9wdGlvbi14LWhtcy8KLQlTZXQgZW11bG5hbWUgc2gKLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9Im1wdy1lc2guYyBlc2guYwotCVNldCBlbXVsYXRpb25fb2ZpbGVzICJ7b30iZXNoLmMubwotRW5kIElmCi0KLUVjaG8gJy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gIERPIE5PVCBFRElUISAqLycgPiAie299ImxkZW11bC10bXAuaAotRWNobyAiZXh0ZXJuIGxkX2VtdWxhdGlvbl94ZmVyX3R5cGUgbGRfe2VtdWxuYW1lfV9lbXVsYXRpb247IiA+PiAie299ImxkZW11bC10bXAuaAotRWNobyAnI2RlZmluZSBFTVVMQVRJT05fTElTVCBcJwkJCQk+PiAie299ImxkZW11bC10bXAuaAotRWNobyAiICAmbGRfe2VtdWxuYW1lfV9lbXVsYXRpb24sIFwiCQkJPj4gIntvfSJsZGVtdWwtdG1wLmgKLUVjaG8gJyAgMCcJCQkJCQk+PiAie299ImxkZW11bC10bXAuaAotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJsZGVtdWwtdG1wLmggIntvfSJsZGVtdWwtbGlzdC5oCi0KLUVjaG8gJyMgRnJvbSBtcHctY29uZmlnLmluJwkJCQkgPiAie299Im1rLnRtcAotRWNobyAiRU1VTCA9ICIge2VtdWxuYW1lfQkJCQk+PiAie299Im1rLnRtcAotRWNobyAiRU1VTEFUSU9OX09GSUxFUyA9ICIge2VtdWxhdGlvbl9vZmlsZXN9CQk+PiAie299Im1rLnRtcAotRWNobyAndmVyc2lvbiA9ICcgYFNlYXJjaCAnbGQgdmVyc2lvbiAnIHtzcmNkaXJ9bGR2ZXIuYyB8IHNlZCAtZSAncy8uKmxkIHZlcnNpb24gXChbXiBdKlwpLiovXDEvJ2AgPj4gIntvfSJtay50bXAKLUVjaG8gIlRERUZJTkVTID0gIgkJCQkJPj4gIntvfSJtay50bXAKLUVjaG8gJyMgRW5kIGZyb20gbXB3LWNvbmZpZy5pbicJCQkJPj4gIntvfSJtay50bXAKLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLUVjaG8gJyNpbmNsdWRlICJtcHcuaCInCQkJCQk+PiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCmRpZmYgLS1naXQgYS9sZC9tcHctZWxmbWlwcy5jIGIvbGQvbXB3LWVsZm1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhYjA1Ni4uMDAwMDAwMAotLS0gYS9sZC9tcHctZWxmbWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQzOSArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIDMyIGJpdCBFTEYgZW11bGF0aW9uIGNvZGUgZm9yIGVsZjMyZWJtaXAKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTMsIDk0LCA5NSwgMTk5NiwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgRUxGIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX2VsZjMyZWJtaXAKLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2luY2x1ZGUgImJmZGxpbmsuaCIKLQotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRtYWluLmgiCi0jaW5jbHVkZSAibGRlbXVsLmgiCi0jaW5jbHVkZSAibGRmaWxlLmgiCi0jaW5jbHVkZSAibGRtaXNjLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLQotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGJvb2xlYW4gZ2xkZWxmMzJlYm1pcF9vcGVuX2R5bmFtaWNfYXJjaGl2ZQotICBQQVJBTVMgKChjb25zdCBjaGFyICosIHNlYXJjaF9kaXJzX3R5cGUgKiwgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2FmdGVyX29wZW4gUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9jaGVja19uZWVkZWQKLSAgUEFSQU1TICgobGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX3N0YXRfbmVlZGVkCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKikpOwotc3RhdGljIGJvb2xlYW4gZ2xkZWxmMzJlYm1pcF9zZWFyY2hfbmVlZGVkCi0gIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgYm9vbGVhbiBnbGRlbGYzMmVibWlwX3RyeV9uZWVkZWQgUEFSQU1TICgoY29uc3QgY2hhciAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRlbGYzMmVibWlwX2JlZm9yZV9hbGxvY2F0aW9uIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudAotICBQQVJBTVMgKChsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICopKTsKLXN0YXRpYyB2b2lkIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCBQQVJBTVMgKChldHJlZV90eXBlICopKTsKLXN0YXRpYyBib29sZWFuIGdsZGVsZjMyZWJtaXBfcGxhY2Vfb3JwaGFuCi0gIFBBUkFNUyAoKGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKiwgYXNlY3Rpb24gKikpOwotc3RhdGljIHZvaWQgZ2xkZWxmMzJlYm1pcF9wbGFjZV9zZWN0aW9uCi0gIFBBUkFNUyAoKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZGVsZjMyZWJtaXBfZ2V0X3NjcmlwdCBQQVJBTVMgKChpbnQgKmlzZmlsZSkpOwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9iZWZvcmVfcGFyc2UoKQotewotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX21pcHM7Ci0gIGNvbmZpZy5keW5hbWljX2xpbmsgPSB0cnVlOwotfQotCi0vKiBUcnkgdG8gb3BlbiBhIGR5bmFtaWMgYXJjaGl2ZS4gIFRoaXMgaXMgd2hlcmUgd2Uga25vdyB0aGF0IEVMRgotICAgZHluYW1pYyBsaWJyYXJpZXMgaGF2ZSBhbiBleHRlbnNpb24gb2YgLnNvLiAgKi8KLQotc3RhdGljIGJvb2xlYW4KLWdsZGVsZjMyZWJtaXBfb3Blbl9keW5hbWljX2FyY2hpdmUgKGFyY2gsIHNlYXJjaCwgZW50cnkpCi0gICAgIGNvbnN0IGNoYXIgKmFyY2g7Ci0gICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqZW50cnk7Ci17Ci0gIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwotICBjaGFyICpzdHJpbmc7Ci0KLSAgaWYgKCEgZW50cnktPmlzX2FyY2hpdmUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZpbGVuYW1lID0gZW50cnktPmZpbGVuYW1lOwotCi0gIHN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKQotCQkJICAgICArIHN0cmxlbiAoZmlsZW5hbWUpCi0JCQkgICAgICsgc3RybGVuIChhcmNoKQotCQkJICAgICArIHNpemVvZiAiL2xpYi5zbyIpOwotCi0gIHNwcmludGYgKHN0cmluZywgIiVzL2xpYiVzJXMuc28iLCBzZWFyY2gtPm5hbWUsIGZpbGVuYW1lLCBhcmNoKTsKLQotICBpZiAoISBsZGZpbGVfdHJ5X29wZW5fYmZkIChzdHJpbmcsIGVudHJ5KSkKLSAgICB7Ci0gICAgICBmcmVlIChzdHJpbmcpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICBlbnRyeS0+ZmlsZW5hbWUgPSBzdHJpbmc7Ci0KLSAgLyogV2UgaGF2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IHRvIGluY2x1ZGUgaW4gdGhlIGxpbmsuICBUaGUgRUxGCi0gICAgIGJhY2tlbmQgbGlua2VyIHdpbGwgY3JlYXRlIGEgRFRfTkVFREVEIGVudHJ5IGluIHRoZSAuZHluYW1pYwotICAgICBzZWN0aW9uIG5hbWluZyB0aGlzIGZpbGUuICBJZiB0aGlzIGZpbGUgaW5jbHVkZXMgYSBEVF9TT05BTUUKLSAgICAgZW50cnksIGl0IHdpbGwgYmUgdXNlZC4gIE90aGVyd2lzZSwgdGhlIEVMRiBsaW5rZXIgd2lsbCBqdXN0IHVzZQotICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZS4gIEZvciBhbiBhcmNoaXZlIGZvdW5kIGJ5IHNlYXJjaGluZywgbGlrZQotICAgICB0aGlzIG9uZSwgdGhlIERUX05FRURFRCBlbnRyeSBzaG91bGQgY29uc2lzdCBvZiBqdXN0IHRoZSBuYW1lIG9mCi0gICAgIHRoZSBmaWxlLCB3aXRob3V0IHRoZSBwYXRoIGluZm9ybWF0aW9uIHVzZWQgdG8gZmluZCBpdC4gIE5vdGUKLSAgICAgdGhhdCB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhpcyBpZiB3ZSBoYXZlIGEgZHluYW1pYyBvYmplY3Q7IGFuCi0gICAgIGFyY2hpdmUgd2lsbCBuZXZlciBiZSByZWZlcmVuY2VkIGJ5IGEgRFRfTkVFREVEIGVudHJ5LgotCi0gICAgIEZJWE1FOiBUaGlzIGFwcHJvYWNoLS11c2luZyBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZS0taXMgbm90Ci0gICAgIHZlcnkgcHJldHR5LiAgSSBoYXZlbid0IGJlZW4gYWJsZSB0byB0aGluayBvZiBhbnl0aGluZyB0aGF0IGlzCi0gICAgIHByZXR0eSwgdGhvdWdoLiAgKi8KLSAgaWYgKGJmZF9jaGVja19mb3JtYXQgKGVudHJ5LT50aGVfYmZkLCBiZmRfb2JqZWN0KQotICAgICAgJiYgKGVudHJ5LT50aGVfYmZkLT5mbGFncyAmIERZTkFNSUMpICE9IDApCi0gICAgewotICAgICAgY2hhciAqbmVlZGVkX25hbWU7Ci0KLSAgICAgIEFTU0VSVCAoZW50cnktPmlzX2FyY2hpdmUgJiYgZW50cnktPnNlYXJjaF9kaXJzX2ZsYWcpOwotICAgICAgbmVlZGVkX25hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKGZpbGVuYW1lKQotCQkJCSAgICAgICsgc3RybGVuIChhcmNoKQotCQkJCSAgICAgICsgc2l6ZW9mICJsaWIuc28iKTsKLSAgICAgIHNwcmludGYgKG5lZWRlZF9uYW1lLCAibGliJXMlcy5zbyIsIGZpbGVuYW1lLCBhcmNoKTsKLSAgICAgIGJmZF9lbGZfc2V0X2R0X25lZWRlZF9uYW1lIChlbnRyeS0+dGhlX2JmZCwgbmVlZGVkX25hbWUpOwotICAgIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiBUaGVzZSB2YXJpYWJsZXMgYXJlIHJlcXVpcmVkIHRvIHBhc3MgaW5mb3JtYXRpb24gYmFjayBhbmQgZm9ydGgKLSAgIGJldHdlZW4gYWZ0ZXJfb3BlbiBhbmQgY2hlY2tfbmVlZGVkIGFuZCBzdGF0X25lZWRlZC4gICovCi0KLXN0YXRpYyBzdHJ1Y3QgYmZkX2xpbmtfbmVlZGVkX2xpc3QgKmdsb2JhbF9uZWVkZWQ7Ci1zdGF0aWMgc3RydWN0IHN0YXQgZ2xvYmFsX3N0YXQ7Ci1zdGF0aWMgYm9vbGVhbiBnbG9iYWxfZm91bmQ7Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2FmdGVyX29wZW4gKCkKLXsKLSAgc3RydWN0IGJmZF9saW5rX25lZWRlZF9saXN0ICpuZWVkZWQsICpsOwotCi0gIC8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzIHdoZW4gZG9pbmcgYSBmaW5hbCBsaW5rLiAgKi8KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgfHwgbGlua19pbmZvLnNoYXJlZCkKLSAgICByZXR1cm47Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFwcGVhciBpbiBEVF9ORUVERUQgZW50cmllcyBpbgotICAgICBkeW5hbWljIG9iamVjdHMgaW5jbHVkZWQgaW4gdGhlIGxpbmsgKG9mdGVuIHRoZXJlIHdpbGwgYmUgbm9uZSkuCi0gICAgIEZvciBlYWNoIHN1Y2ggZmlsZSwgd2Ugd2FudCB0byB0cmFjayBkb3duIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgIGxpYnJhcnksIGFuZCBpbmNsdWRlIHRoZSBzeW1ib2wgdGFibGUgaW4gdGhlIGxpbmsuICBUaGlzIGlzIHdoYXQKLSAgICAgdGhlIHJ1bnRpbWUgZHluYW1pYyBsaW5rZXIgd2lsbCBkby4gIFRyYWNraW5nIHRoZSBmaWxlcyBkb3duIGhlcmUKLSAgICAgcGVybWl0cyBvbmUgZHluYW1pYyBvYmplY3QgdG8gaW5jbHVkZSBhbm90aGVyIHdpdGhvdXQgcmVxdWlyaW5nCi0gICAgIHNwZWNpYWwgYWN0aW9uIGJ5IHRoZSBwZXJzb24gZG9pbmcgdGhlIGxpbmsuICBOb3RlIHRoYXQgdGhlCi0gICAgIG5lZWRlZCBsaXN0IGNhbiBhY3R1YWxseSBncm93IHdoaWxlIHdlIGFyZSBzdGVwcGluZyB0aHJvdWdoIHRoaXMKLSAgICAgbG9vcC4gICovCi0gIG5lZWRlZCA9IGJmZF9lbGZfZ2V0X25lZWRlZF9saXN0IChvdXRwdXRfYmZkLCAmbGlua19pbmZvKTsKLSAgZm9yIChsID0gbmVlZGVkOyBsICE9IE5VTEw7IGwgPSBsLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19uZWVkZWRfbGlzdCAqbGw7Ci0gICAgICBjb25zdCBjaGFyICpsaWJfcGF0aDsKLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBzZWFyY2hfZGlyc190eXBlICpzZWFyY2g7Ci0KLSAgICAgIC8qIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiB0aGlzIGZpbGUsIHNraXAgaXQuICAqLwotICAgICAgZm9yIChsbCA9IG5lZWRlZDsgbGwgIT0gbDsgbGwgPSBsbC0+bmV4dCkKLQlpZiAoc3RyY21wIChsbC0+bmFtZSwgbC0+bmFtZSkgPT0gMCkKLQkgIGJyZWFrOwotICAgICAgaWYgKGxsICE9IGwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFNlZSBpZiB0aGlzIGZpbGUgd2FzIGluY2x1ZGVkIGluIHRoZSBsaW5rIGV4cGxpY2l0bHkuICAqLwotICAgICAgZ2xvYmFsX25lZWRlZCA9IGw7Ci0gICAgICBnbG9iYWxfZm91bmQgPSBmYWxzZTsKLSAgICAgIGxhbmdfZm9yX2VhY2hfaW5wdXRfZmlsZSAoZ2xkZWxmMzJlYm1pcF9jaGVja19uZWVkZWQpOwotICAgICAgaWYgKGdsb2JhbF9mb3VuZCkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgbmVlZCB0byBmaW5kIHRoaXMgZmlsZSBhbmQgaW5jbHVkZSB0aGUgc3ltYm9sIHRhYmxlLiAgV2UKLQkgd2FudCB0byBzZWFyY2ggZm9yIHRoZSBmaWxlIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoZSBkeW5hbWljCi0JIGxpbmtlciB3aWxsIHNlYXJjaC4gIFRoYXQgbWVhbnMgdGhhdCB3ZSB3YW50IHRvIHVzZQotCSBycGF0aF9saW5rLCBycGF0aCwgdGhlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKLQkgTERfTElCUkFSWV9QQVRIIChuYXRpdmUgb25seSksIHRoZW4gdGhlIGxpbmtlciBzY3JpcHQKLQkgTElCX1NFQVJDSF9ESVJTLiAgV2UgZG8gbm90IHNlYXJjaCB1c2luZyB0aGUgLUwgYXJndW1lbnRzLiAgKi8KLSAgICAgIGlmIChnbGRlbGYzMmVibWlwX3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aF9saW5rLAotCQkJCQkgICAgICBsLT5uYW1lKSkKLQljb250aW51ZTsKLSAgICAgIGlmIChnbGRlbGYzMmVibWlwX3NlYXJjaF9uZWVkZWQgKGNvbW1hbmRfbGluZS5ycGF0aCwgbC0+bmFtZSkpCi0JY29udGludWU7Ci0gICAgICBpZiAoY29tbWFuZF9saW5lLnJwYXRoX2xpbmsgPT0gTlVMTAotCSAgJiYgY29tbWFuZF9saW5lLnJwYXRoID09IE5VTEwpCi0JewotCSAgbGliX3BhdGggPSAoY29uc3QgY2hhciAqKSBnZXRlbnYgKCJMRF9SVU5fUEFUSCIpOwotCSAgaWYgKGdsZGVsZjMyZWJtaXBfc2VhcmNoX25lZWRlZCAobGliX3BhdGgsIGwtPm5hbWUpKQotCSAgICBjb250aW51ZTsKLQl9Ci0gICAgICBsZW4gPSBzdHJsZW4gKGwtPm5hbWUpOwotICAgICAgZm9yIChzZWFyY2ggPSBzZWFyY2hfaGVhZDsgc2VhcmNoICE9IE5VTEw7IHNlYXJjaCA9IHNlYXJjaC0+bmV4dCkKLQl7Ci0JICBjaGFyICpmaWxlbmFtZTsKLQotCSAgaWYgKHNlYXJjaC0+Y21kbGluZSkKLQkgICAgY29udGludWU7Ci0JICBmaWxlbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoc2VhcmNoLT5uYW1lKSArIGxlbiArIDIpOwotCSAgc3ByaW50ZiAoZmlsZW5hbWUsICIlcy8lcyIsIHNlYXJjaC0+bmFtZSwgbC0+bmFtZSk7Ci0JICBpZiAoZ2xkZWxmMzJlYm1pcF90cnlfbmVlZGVkIChmaWxlbmFtZSkpCi0JICAgIGJyZWFrOwotCSAgZnJlZSAoZmlsZW5hbWUpOwotCX0KLSAgICAgIGlmIChzZWFyY2ggIT0gTlVMTCkKLQljb250aW51ZTsKLQotICAgICAgZWluZm8gKF8oIiVQOiB3YXJuaW5nOiAlcywgbmVlZGVkIGJ5ICVCLCBub3QgZm91bmRcbiIpLAotCSAgICAgbC0+bmFtZSwgbC0+YnkpOwotICAgIH0KLX0KLQotLyogU2VhcmNoIGZvciBhIG5lZWRlZCBmaWxlIGluIGEgcGF0aC4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGRlbGYzMmVibWlwX3NlYXJjaF9uZWVkZWQgKHBhdGgsIG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKnBhdGg7Ci0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGNvbnN0IGNoYXIgKnM7Ci0gIHNpemVfdCBsZW47Ci0KLSAgaWYgKHBhdGggPT0gTlVMTCB8fCAqcGF0aCA9PSAnXDAnKQotICAgIHJldHVybiBmYWxzZTsKLSAgbGVuID0gc3RybGVuIChuYW1lKTsKLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgY2hhciAqZmlsZW5hbWUsICpzc2V0OwotCi0gICAgICBzID0gc3RyY2hyIChwYXRoLCAnOicpOwotICAgICAgaWYgKHMgPT0gTlVMTCkKLQlzID0gcGF0aCArIHN0cmxlbiAocGF0aCk7Ci0KLSAgICAgIGZpbGVuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAocyAtIHBhdGggKyBsZW4gKyAyKTsKLSAgICAgIGlmIChzID09IHBhdGgpCi0Jc3NldCA9IGZpbGVuYW1lOwotICAgICAgZWxzZQotCXsKLQkgIG1lbWNweSAoZmlsZW5hbWUsIHBhdGgsIHMgLSBwYXRoKTsKLQkgIGZpbGVuYW1lW3MgLSBwYXRoXSA9ICcvJzsKLQkgIHNzZXQgPSBmaWxlbmFtZSArIChzIC0gcGF0aCkgKyAxOwotCX0KLSAgICAgIHN0cmNweSAoc3NldCwgbmFtZSk7Ci0KLSAgICAgIGlmIChnbGRlbGYzMmVibWlwX3RyeV9uZWVkZWQgKGZpbGVuYW1lKSkKLQlyZXR1cm4gdHJ1ZTsKLQotICAgICAgZnJlZSAoZmlsZW5hbWUpOwotCi0gICAgICBpZiAoKnMgPT0gJ1wwJykKLQlicmVhazsKLSAgICAgIHBhdGggPSBzICsgMTsKLSAgICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwkgIAotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZWFjaCBwb3NzaWJsZSBuYW1lIGZvciBhIGR5bmFtaWMgb2JqZWN0Ci0gICBuYW1lZCBieSBhIERUX05FRURFRCBlbnRyeS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGRlbGYzMmVibWlwX3RyeV9uZWVkZWQgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGJmZCAqYWJmZDsKLQotICBhYmZkID0gYmZkX29wZW5yIChuYW1lLCBiZmRfZ2V0X3RhcmdldCAob3V0cHV0X2JmZCkpOwotICBpZiAoYWJmZCA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCEgYmZkX2NoZWNrX2Zvcm1hdCAoYWJmZCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgKHZvaWQpIGJmZF9jbG9zZSAoYWJmZCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBpZiAoKGJmZF9nZXRfZmlsZV9mbGFncyAoYWJmZCkgJiBEWU5BTUlDKSA9PSAwKQotICAgIHsKLSAgICAgICh2b2lkKSBiZmRfY2xvc2UgKGFiZmQpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAvKiBXZSd2ZSBmb3VuZCBhIGR5bmFtaWMgb2JqZWN0IG1hdGNoaW5nIHRoZSBEVF9ORUVERUQgZW50cnkuICAqLwotCi0gIC8qIFdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgdGhlcmUgaXMgbm8gb3RoZXIgaW5wdXQgZmlsZSBvZiB0aGUKLSAgICAgc2FtZSBuYW1lLiAgV2UgbXVzdCBub3cgY2hlY2sgYWdhaW4gdGhhdCB3ZSBhcmUgbm90IGluY2x1ZGluZyB0aGUKLSAgICAgc2FtZSBmaWxlIHR3aWNlLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2Ugb24gbWFueSBzeXN0ZW1zCi0gICAgIGxpYmMuc28gaXMgYSBzeW1saW5rIHRvLCBlLmcuLCBsaWJjLnNvLjEuICBUaGUgU09OQU1FIGVudHJ5IHdpbGwKLSAgICAgcmVmZXJlbmNlIGxpYmMuc28uMS4gIElmIHdlIGhhdmUgYWxyZWFkeSBpbmNsdWRlZCBsaWJjLnNvLCB3ZQotICAgICBkb24ndCB3YW50IHRvIGluY2x1ZGUgbGliYy5zby4xIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGZpbGUsIGFuZCB3ZQotICAgICBjYW4gb25seSBjaGVjayB0aGF0IHVzaW5nIHN0YXQuICAqLwotCi0gIGlmIChiZmRfc3RhdCAoYWJmZCwgJmdsb2JhbF9zdGF0KSAhPSAwKQotICAgIGVpbmZvIChfKCIlRiVQOiVCOiBiZmRfc3RhdCBmYWlsZWQ6ICVFXG4iKSwgYWJmZCk7Ci0gIGdsb2JhbF9mb3VuZCA9IGZhbHNlOwotICBsYW5nX2Zvcl9lYWNoX2lucHV0X2ZpbGUgKGdsZGVsZjMyZWJtaXBfc3RhdF9uZWVkZWQpOwotICBpZiAoZ2xvYmFsX2ZvdW5kKQotICAgIHsKLSAgICAgIC8qIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRoYXQgd2UgZm91bmQgdGhlIGZpbGUsIGV2ZW4gdGhvdWdoCi0gICAgICAgICB3ZSBhcmVuJ3QgZ29pbmcgdG8gZG8gYW55dGhpbmcgd2l0aCBpdC4gICovCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgLyogVGVsbCB0aGUgRUxGIGJhY2tlbmQgdGhhdCBkb24ndCB3YW50IHRoZSBvdXRwdXQgZmlsZSB0byBoYXZlIGEKLSAgICAgRFRfTkVFREVEIGVudHJ5IGZvciB0aGlzIGZpbGUuICAqLwotICBiZmRfZWxmX3NldF9kdF9uZWVkZWRfbmFtZSAoYWJmZCwgIiIpOwotCi0gIC8qIEFkZCB0aGlzIGZpbGUgaW50byB0aGUgc3ltYm9sIHRhYmxlLiAgKi8KLSAgaWYgKCEgYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsICZsaW5rX2luZm8pKQotICAgIGVpbmZvIChfKCIlRiVCOiBjb3VsZCBub3QgcmVhZCBzeW1ib2xzOiAlRVxuIiksIGFiZmQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IG5hbWUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9jaGVja19uZWVkZWQgKHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKnM7Ci17Ci0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotCi0gIGlmIChzLT5maWxlbmFtZSAhPSBOVUxMCi0gICAgICAmJiBzdHJjbXAgKHMtPmZpbGVuYW1lLCBnbG9iYWxfbmVlZGVkLT5uYW1lKSA9PSAwKQotICAgIHsKLSAgICAgIGdsb2JhbF9mb3VuZCA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChzLT50aGVfYmZkICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgY2hhciAqc29uYW1lOwotCi0gICAgICBzb25hbWUgPSBiZmRfZWxmX2dldF9kdF9zb25hbWUgKHMtPnRoZV9iZmQpOwotICAgICAgaWYgKHNvbmFtZSAhPSBOVUxMCi0JICAmJiBzdHJjbXAgKHNvbmFtZSwgZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLQl7Ci0JICBnbG9iYWxfZm91bmQgPSB0cnVlOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0JICAKLSAgaWYgKHMtPnNlYXJjaF9kaXJzX2ZsYWcKLSAgICAgICYmIHMtPmZpbGVuYW1lICE9IE5VTEwKLSAgICAgICYmIHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSA9PSBOVUxMKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmY7Ci0KLSAgICAgIGYgPSBzdHJyY2hyIChzLT5maWxlbmFtZSwgJy8nKTsKLSAgICAgIGlmIChmICE9IE5VTEwKLQkgICYmIHN0cmNtcCAoZiArIDEsIGdsb2JhbF9uZWVkZWQtPm5hbWUpID09IDApCi0JewotCSAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLQkgIHJldHVybjsKLQl9Ci0gICAgfQotfQotCi0vKiBTZWUgaWYgYW4gaW5wdXQgZmlsZSBtYXRjaGVzIGEgRFRfTkVFREVEIGVudHJ5IGJ5IHJ1bm5pbmcgc3RhdCBvbgotICAgdGhlIGZpbGUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9zdGF0X25lZWRlZCAocykKLSAgICAgbGFuZ19pbnB1dF9zdGF0ZW1lbnRfdHlwZSAqczsKLXsKLSAgc3RydWN0IHN0YXQgc3Q7Ci0gIGNvbnN0IGNoYXIgKnN1ZmZpeDsKLSAgY29uc3QgY2hhciAqc29uYW1lOwotICBjb25zdCBjaGFyICpmOwotCi0gIGlmIChnbG9iYWxfZm91bmQpCi0gICAgcmV0dXJuOwotICBpZiAocy0+dGhlX2JmZCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICBpZiAoYmZkX3N0YXQgKHMtPnRoZV9iZmQsICZzdCkgIT0gMCkKLSAgICB7Ci0gICAgICBlaW5mbyAoXygiJVA6JUI6IGJmZF9zdGF0IGZhaWxlZDogJUVcbiIpLCBzLT50aGVfYmZkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKHN0LnN0X2RldiA9PSBnbG9iYWxfc3RhdC5zdF9kZXYKLSAgICAgICYmIHN0LnN0X2lubyA9PSBnbG9iYWxfc3RhdC5zdF9pbm8pCi0gICAgewotICAgICAgZ2xvYmFsX2ZvdW5kID0gdHJ1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogV2UgaXNzdWUgYSB3YXJuaW5nIGlmIGl0IGxvb2tzIGxpa2Ugd2UgYXJlIGluY2x1ZGluZyB0d28KLSAgICAgZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBzYW1lIHNoYXJlZCBsaWJyYXJ5LiAgRm9yIGV4YW1wbGUsCi0gICAgIHRoZXJlIG1heSBiZSBhIHByb2JsZW0gaWYgLWxjIHBpY2tzIHVwIGxpYmMuc28uNiBidXQgc29tZSBvdGhlcgotICAgICBzaGFyZWQgbGlicmFyeSBoYXMgYSBEVF9ORUVERUQgZW50cnkgb2YgbGliYy5zby41LiAgVGhpcyBpcyBhCi0gICAgIGh1ZXJpc3RpYyB0ZXN0LCBhbmQgaXQgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIG5hbWUgbG9va3MgbGlrZQotICAgICBOQU1FLnNvLlZFUlNJT04uICBGSVhNRTogRGVwZW5kaW5nIG9uIGZpbGUgbmFtZXMgaXMgZXJyb3ItcHJvbmUuCi0gICAgIElmIHdlIHJlYWxseSB3YW50IHRvIGlzc3VlIHdhcm5pbmdzIGFib3V0IG1peGluZyB2ZXJzaW9uIG51bWJlcnMKLSAgICAgb2Ygc2hhcmVkIGxpYnJhcmllcywgd2UgbmVlZCB0byBmaW5kIGEgYmV0dGVyIHdheS4gICovCi0KLSAgaWYgKHN0cmNociAoZ2xvYmFsX25lZWRlZC0+bmFtZSwgJy8nKSAhPSBOVUxMKQotICAgIHJldHVybjsKLSAgc3VmZml4ID0gc3Ryc3RyIChnbG9iYWxfbmVlZGVkLT5uYW1lLCAiLnNvLiIpOwotICBpZiAoc3VmZml4ID09IE5VTEwpCi0gICAgcmV0dXJuOwotICBzdWZmaXggKz0gc2l6ZW9mICIuc28uIiAtIDE7Ci0KLSAgc29uYW1lID0gYmZkX2VsZl9nZXRfZHRfc29uYW1lIChzLT50aGVfYmZkKTsKLSAgaWYgKHNvbmFtZSA9PSBOVUxMKQotICAgIHNvbmFtZSA9IHMtPmZpbGVuYW1lOwotCi0gIGYgPSBzdHJyY2hyIChzb25hbWUsICcvJyk7Ci0gIGlmIChmICE9IE5VTEwpCi0gICAgKytmOwotICBlbHNlCi0gICAgZiA9IHNvbmFtZTsKLQotICBpZiAoc3RybmNtcCAoZiwgZ2xvYmFsX25lZWRlZC0+bmFtZSwgc3VmZml4IC0gZ2xvYmFsX25lZWRlZC0+bmFtZSkgPT0gMCkKLSAgICBlaW5mbyAoXygiJVA6IHdhcm5pbmc6ICVzLCBuZWVkZWQgYnkgJUIsIG1heSBjb25mbGljdCB3aXRoICVzXG4iKSwKLQkgICBnbG9iYWxfbmVlZGVkLT5uYW1lLCBnbG9iYWxfbmVlZGVkLT5ieSwgZik7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9ucyBoYXZlIGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0Ci0gICBzZWN0aW9ucywgYnV0IGJlZm9yZSBhbnkgc2l6ZXMgb3IgYWRkcmVzc2VzIGhhdmUgYmVlbiBzZXQuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9iZWZvcmVfYWxsb2NhdGlvbiAoKQotewotICBjb25zdCBjaGFyICpycGF0aDsKLSAgYXNlY3Rpb24gKnNpbnRlcnA7Ci0KLSAgLyogSWYgd2UgYXJlIGdvaW5nIHRvIG1ha2UgYW55IHZhcmlhYmxlIGFzc2lnbm1lbnRzLCB3ZSBuZWVkIHRvIGxldAotICAgICB0aGUgRUxGIGJhY2tlbmQga25vdyBhYm91dCB0aGVtIGluIGNhc2UgdGhlIHZhcmlhYmxlcyBhcmUKLSAgICAgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZGVsZjMyZWJtaXBfZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCk7Ci0KLSAgLyogTGV0IHRoZSBFTEYgYmFja2VuZCB3b3JrIG91dCB0aGUgc2l6ZXMgb2YgYW55IHNlY3Rpb25zIHJlcXVpcmVkCi0gICAgIGJ5IGR5bmFtaWMgbGlua2luZy4gICovCi0gIHJwYXRoID0gY29tbWFuZF9saW5lLnJwYXRoOwotICBpZiAocnBhdGggPT0gTlVMTCkKLSAgICBycGF0aCA9IChjb25zdCBjaGFyICopIGdldGVudiAoIkxEX1JVTl9QQVRIIik7Ci0gIGlmICghIGJmZF9lbGYzMl9zaXplX2R5bmFtaWNfc2VjdGlvbnMgKG91dHB1dF9iZmQsCi0JCQkJCQkgY29tbWFuZF9saW5lLnNvbmFtZSwKLQkJCQkJCSBycGF0aCwKLQkJCQkJCSBjb21tYW5kX2xpbmUuZXhwb3J0X2R5bmFtaWMsCi0JCQkJCQkgJmxpbmtfaW5mbywKLQkJCQkJCSAmc2ludGVycCkpCi0gICAgZWluZm8gKF8oIiVQJUY6IGZhaWxlZCB0byBzZXQgZHluYW1pYyBzZWN0aW9uIHNpemVzOiAlRVxuIikpOwotCi0gIC8qIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgZHluYW1pYyBsaW5rZXIgd2UgYXJlIHVzaW5nLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5pbnRlcnByZXRlciAhPSBOVUxMCi0gICAgICAmJiBzaW50ZXJwICE9IE5VTEwpCi0gICAgewotICAgICAgc2ludGVycC0+Y29udGVudHMgPSAoYmZkX2J5dGUgKikgY29tbWFuZF9saW5lLmludGVycHJldGVyOwotICAgICAgc2ludGVycC0+X3Jhd19zaXplID0gc3RybGVuIChjb21tYW5kX2xpbmUuaW50ZXJwcmV0ZXIpICsgMTsKLSAgICB9Ci0KLSAgLyogTG9vayBmb3IgYW55IHNlY3Rpb25zIG5hbWVkIC5nbnUud2FybmluZy4gIEFzIGEgR05VIGV4dGVuc2lvbnMsCi0gICAgIHdlIHRyZWF0IHN1Y2ggc2VjdGlvbnMgYXMgY29udGFpbmluZyB3YXJuaW5nIG1lc3NhZ2VzLiAgV2UgcHJpbnQKLSAgICAgb3V0IHRoZSB3YXJuaW5nIG1lc3NhZ2UsIGFuZCB0aGVuIHplcm8gb3V0IHRoZSBzZWN0aW9uIHNpemUgc28KLSAgICAgdGhhdCBpdCBkb2VzIG5vdCBnZXQgY29waWVkIGludG8gdGhlIG91dHB1dCBmaWxlLiAgKi8KLQotICB7Ci0gICAgTEFOR19GT1JfRUFDSF9JTlBVVF9TVEFURU1FTlQgKGlzKQotICAgICAgewotCWFzZWN0aW9uICpzOwotCWJmZF9zaXplX3R5cGUgc3o7Ci0JY2hhciAqbXNnOwotCWJvb2xlYW4gcmV0OwotCi0JaWYgKGlzLT5qdXN0X3N5bXNfZmxhZykKLQkgIGNvbnRpbnVlOwotCi0JcyA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChpcy0+dGhlX2JmZCwgIi5nbnUud2FybmluZyIpOwotCWlmIChzID09IE5VTEwpCi0JICBjb250aW51ZTsKLQotCXN6ID0gYmZkX3NlY3Rpb25fc2l6ZSAoaXMtPnRoZV9iZmQsIHMpOwotCW1zZyA9IHhtYWxsb2MgKChzaXplX3QpIHN6ICsgMSk7Ci0JaWYgKCEgYmZkX2dldF9zZWN0aW9uX2NvbnRlbnRzIChpcy0+dGhlX2JmZCwgcywgbXNnLCAoZmlsZV9wdHIpIDAsIHN6KSkKLQkgIGVpbmZvIChfKCIlRiVCOiBDYW4ndCByZWFkIGNvbnRlbnRzIG9mIHNlY3Rpb24gLmdudS53YXJuaW5nOiAlRVxuIiksCi0JCSBpcy0+dGhlX2JmZCk7Ci0JbXNnW3N6XSA9ICdcMCc7Ci0JcmV0ID0gbGlua19pbmZvLmNhbGxiYWNrcy0+d2FybmluZyAoJmxpbmtfaW5mbywgbXNnLAotCQkJCQkgICAgKGNvbnN0IGNoYXIgKikgTlVMTCwKLQkJCQkJICAgIGlzLT50aGVfYmZkLCAoYXNlY3Rpb24gKikgTlVMTCwKLQkJCQkJICAgIChiZmRfdm1hKSAwKTsKLQlBU1NFUlQgKHJldCk7Ci0JZnJlZSAobXNnKTsKLQotCS8qIENsb2JiZXIgdGhlIHNlY3Rpb24gc2l6ZSwgc28gdGhhdCB3ZSBkb24ndCB3YXN0ZSBjb3B5aW5nIHRoZQotCSAgIHdhcm5pbmcgaW50byB0aGUgb3V0cHV0IGZpbGUuICAqLwotCXMtPl9yYXdfc2l6ZSA9IDA7Ci0gICAgICB9Ci0gIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIHJvdXRpbmUgdmlhCi0gICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudC4gIEl0IGxvY2F0ZXMgYW55IGFzc2lnbm1lbnQgc3RhdGVtZW50cywgYW5kCi0gICB0ZWxscyB0aGUgRUxGIGJhY2tlbmQgYWJvdXQgdGhlbSwgaW4gY2FzZSB0aGV5IGFyZSBhc3NpZ25tZW50cyB0bwotICAgc3ltYm9scyB3aGljaCBhcmUgcmVmZXJyZWQgdG8gYnkgZHluYW1pYyBvYmplY3RzLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZGVsZjMyZWJtaXBfZmluZF9zdGF0ZW1lbnRfYXNzaWdubWVudCAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfYXNzaWdubWVudF9zdGF0ZW1lbnRfZW51bSkKLSAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKHMtPmFzc2lnbm1lbnRfc3RhdGVtZW50LmV4cCk7Ci19Ci0KLS8qIExvb2sgdGhyb3VnaCBhbiBleHByZXNzaW9uIGZvciBhbiBhc3NpZ25tZW50IHN0YXRlbWVudC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWJyZWFrOwotCi0gICAgICAvKiBXZSBjYWxsIHJlY29yZF9saW5rX2Fzc2lnbm1lbnQgZXZlbiBpZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQuCi0JIFRoaXMgaXMgYmVjYXVzZSBpZiBpdCBpcyBkZWZpbmVkIGJ5IGEgZHluYW1pYyBvYmplY3QsIHdlCi0JIGFjdHVhbGx5IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSBkZWZpbmVkIGJ5IHRoZSBsaW5rZXIgc2NyaXB0LAotCSBub3QgdGhlIHZhbHVlIGZyb20gdGhlIGR5bmFtaWMgb2JqZWN0IChiZWNhdXNlIHdlIGFyZSBzZXR0aW5nCi0JIHN5bWJvbHMgbGlrZSBldGV4dCkuICBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQgYnkgYSByZWd1bGFyCi0JIG9iamVjdCwgdGhlbiwgYXMgaXQgaGFwcGVucywgY2FsbGluZyByZWNvcmRfbGlua19hc3NpZ25tZW50Ci0JIHdpbGwgZG8gbm8gaGFybS4gICovCi0KLSAgICAgIC8qIEZhbGwgdGhyb3VnaC4gICovCi0gICAgY2FzZSBldHJlZV9hc3NpZ246Ci0gICAgICBpZiAoc3RyY21wIChleHAtPmFzc2lnbi5kc3QsICIuIikgIT0gMCkKLQl7Ci0JICBpZiAoISAoYmZkX2VsZjMyX3JlY29yZF9saW5rX2Fzc2lnbm1lbnQKLQkJIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBleHAtPmFzc2lnbi5kc3QsCi0JCSAgZXhwLT50eXBlLm5vZGVfY2xhc3MgPT0gZXRyZWVfcHJvdmlkZSA/IHRydWUgOiBmYWxzZSkpKQotCSAgICBlaW5mbyAoXygiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvICVzOiAlRVxuIiksCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmFzc2lnbi5zcmMpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGV0cmVlX2JpbmFyeToKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkubGhzKTsKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkuY29uZCk7Ci0gICAgICBnbGRlbGYzMmVibWlwX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dHJpbmFyeS5saHMpOwotICAgICAgZ2xkZWxmMzJlYm1pcF9maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZGVsZjMyZWJtaXBfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT51bmFyeS5jaGlsZCk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgICB9Ci19Ci0KLS8qIFBsYWNlIGFuIG9ycGhhbiBzZWN0aW9uLiAgV2UgdXNlIHRoaXMgdG8gcHV0IHJhbmRvbSBTSEZfQUxMT0MKLSAgIHNlY3Rpb25zIGluIHRoZSByaWdodCBzZWdtZW50LiAgKi8KLQotc3RhdGljIGFzZWN0aW9uICpob2xkX3NlY3Rpb247Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF91c2U7Ci1zdGF0aWMgbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfdHlwZSAqaG9sZF90ZXh0Owotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfcm9kYXRhOwotc3RhdGljIGxhbmdfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50X3R5cGUgKmhvbGRfZGF0YTsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX2JzczsKLXN0YXRpYyBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpob2xkX3JlbDsKLQotLypBUkdTVVNFRCovCi1zdGF0aWMgYm9vbGVhbgotZ2xkZWxmMzJlYm1pcF9wbGFjZV9vcnBoYW4gKGZpbGUsIHMpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGU7Ci0gICAgIGFzZWN0aW9uICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpwbGFjZTsKLSAgYXNlY3Rpb24gKnNuZXcsICoqcHBzOwotICBsYW5nX3N0YXRlbWVudF9saXN0X3R5cGUgKm9sZDsKLSAgbGFuZ19zdGF0ZW1lbnRfbGlzdF90eXBlIGFkZDsKLSAgZXRyZWVfdHlwZSAqYWRkcmVzczsKLSAgY29uc3QgY2hhciAqc2VjbmFtZSwgKnBzOwotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAoKHMtPmZsYWdzICYgU0VDX0FMTE9DKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNjcmlwdCB0byBzZWUgd2hlcmUgdG8gcGxhY2UgdGhpcyBzZWN0aW9uLiAgKi8KLSAgaG9sZF9zZWN0aW9uID0gczsKLSAgaG9sZF91c2UgPSBOVUxMOwotICBsYW5nX2Zvcl9lYWNoX3N0YXRlbWVudCAoZ2xkZWxmMzJlYm1pcF9wbGFjZV9zZWN0aW9uKTsKLQotICBpZiAoaG9sZF91c2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGFscmVhZHkgcGxhY2VkIGEgc2VjdGlvbiB3aXRoIHRoaXMgbmFtZS4gICovCi0gICAgICB3aWxkX2RvaXQgKCZob2xkX3VzZS0+Y2hpbGRyZW4sIHMsIGhvbGRfdXNlLCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICBzZWNuYW1lID0gYmZkX2dldF9zZWN0aW9uX25hbWUgKHMtPm93bmVyLCBzKTsKLQotICAvKiBJZiB0aGlzIGlzIGEgZmluYWwgbGluaywgdGhlbiBhbHdheXMgcHV0IC5nbnUud2FybmluZy5TWU1CT0wKLSAgICAgc2VjdGlvbnMgaW50byB0aGUgLnRleHQgc2VjdGlvbiB0byBnZXQgdGhlbSBvdXQgb2YgdGhlIHdheS4gICovCi0gIGlmICghIGxpbmtfaW5mby5zaGFyZWQKLSAgICAgICYmICEgbGlua19pbmZvLnJlbG9jYXRlYWJsZQotICAgICAgJiYgc3RybmNtcCAoc2VjbmFtZSwgIi5nbnUud2FybmluZy4iLCBzaXplb2YgIi5nbnUud2FybmluZy4iIC0gMSkgPT0gMAotICAgICAgJiYgaG9sZF90ZXh0ICE9IE5VTEwpCi0gICAgewotICAgICAgd2lsZF9kb2l0ICgmaG9sZF90ZXh0LT5jaGlsZHJlbiwgcywgaG9sZF90ZXh0LCBmaWxlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAvKiBEZWNpZGUgd2hpY2ggc2VnbWVudCB0aGUgc2VjdGlvbiBzaG91bGQgZ28gaW4gYmFzZWQgb24gdGhlCi0gICAgIHNlY3Rpb24gbmFtZSBhbmQgc2VjdGlvbiBmbGFncy4gICovCi0gIHBsYWNlID0gTlVMTDsKLSAgaWYgKChzLT5mbGFncyAmIFNFQ19IQVNfQ09OVEVOVFMpID09IDAKLSAgICAgICYmIGhvbGRfYnNzICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2JzczsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX1JFQURPTkxZKSA9PSAwCi0JICAgJiYgaG9sZF9kYXRhICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX2RhdGE7Ci0gIGVsc2UgaWYgKHN0cm5jbXAgKHNlY25hbWUsICIucmVsIiwgNCkgPT0gMAotCSAgICYmIGhvbGRfcmVsICE9IE5VTEwpCi0gICAgcGxhY2UgPSBob2xkX3JlbDsKLSAgZWxzZSBpZiAoKHMtPmZsYWdzICYgU0VDX0NPREUpID09IDAKLQkgICAmJiAocy0+ZmxhZ3MgJiBTRUNfUkVBRE9OTFkpICE9IDAKLQkgICAmJiBob2xkX3JvZGF0YSAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF9yb2RhdGE7Ci0gIGVsc2UgaWYgKChzLT5mbGFncyAmIFNFQ19SRUFET05MWSkgIT0gMAotCSAgICYmIGhvbGRfdGV4dCAhPSBOVUxMKQotICAgIHBsYWNlID0gaG9sZF90ZXh0OwotICBpZiAocGxhY2UgPT0gTlVMTCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgLyogQ3JlYXRlIHRoZSBzZWN0aW9uIGluIHRoZSBvdXRwdXQgZmlsZSwgYW5kIHB1dCBpdCBpbiB0aGUgcmlnaHQKLSAgICAgcGxhY2UuICBUaGlzIHNodWZmbGluZyBpcyB0byBtYWtlIHRoZSBvdXRwdXQgZmlsZSBsb29rIG5lYXRlci4gICovCi0gIHNuZXcgPSBiZmRfbWFrZV9zZWN0aW9uIChvdXRwdXRfYmZkLCBzZWNuYW1lKTsKLSAgaWYgKHNuZXcgPT0gTlVMTCkKLSAgICAgIGVpbmZvIChfKCIlUCVGOiBvdXRwdXQgZm9ybWF0ICVzIGNhbm5vdCByZXByZXNlbnQgc2VjdGlvbiBjYWxsZWQgJXNcbiIpLAotCSAgICAgb3V0cHV0X2JmZC0+eHZlYy0+bmFtZSwgc2VjbmFtZSk7Ci0gIGlmIChwbGFjZS0+YmZkX3NlY3Rpb24gIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKHBwcyA9ICZvdXRwdXRfYmZkLT5zZWN0aW9uczsgKnBwcyAhPSBzbmV3OyBwcHMgPSAmKCpwcHMpLT5uZXh0KQotCTsKLSAgICAgICpwcHMgPSBzbmV3LT5uZXh0OwotICAgICAgc25ldy0+bmV4dCA9IHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dDsKLSAgICAgIHBsYWNlLT5iZmRfc2VjdGlvbi0+bmV4dCA9IHNuZXc7Ci0gICAgfQotCi0gIC8qIFN0YXJ0IGJ1aWxkaW5nIGEgbGlzdCBvZiBzdGF0ZW1lbnRzIGZvciB0aGlzIHNlY3Rpb24uICAqLwotICBvbGQgPSBzdGF0X3B0cjsKLSAgc3RhdF9wdHIgPSAmYWRkOwotICBsYW5nX2xpc3RfaW5pdCAoc3RhdF9wdHIpOwotCi0gIC8qIElmIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uIGlzIHJlcHJlc2VudGFibGUgaW4gQywgdGhlbiBjcmVhdGUKLSAgICAgc3ltYm9scyB0byBtYXJrIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgc2VjdGlvbi4gICovCi0gIGZvciAocHMgPSBzZWNuYW1lOyAqcHMgIT0gJ1wwJzsgcHMrKykKLSAgICBpZiAoISBpc2FsbnVtICgqcHMpICYmICpwcyAhPSAnXycpCi0gICAgICBicmVhazsKLSAgaWYgKCpwcyA9PSAnXDAnICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMpCi0gICAgewotICAgICAgY2hhciAqc3ltbmFtZTsKLQotICAgICAgc3ltbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHBzIC0gc2VjbmFtZSArIHNpemVvZiAiX19zdGFydF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0YXJ0XyVzIiwgc2VjbmFtZSk7Ci0gICAgICBsYW5nX2FkZF9hc3NpZ25tZW50IChleHBfYXNzb3AgKCc9Jywgc3ltbmFtZSwKLQkJCQkgICAgICBleHBfdW5vcCAoQUxJR05fSywKLQkJCQkJCWV4cF9pbnRvcCAoKGJmZF92bWEpIDEKLQkJCQkJCQkgICA8PCBzLT5hbGlnbm1lbnRfcG93ZXIpKSkpOwotICAgIH0KLQotICBpZiAoISBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIGFkZHJlc3MgPSBOVUxMOwotICBlbHNlCi0gICAgYWRkcmVzcyA9IGV4cF9pbnRvcCAoKGJmZF92bWEpIDApOwotCi0gIGxhbmdfZW50ZXJfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50IChzZWNuYW1lLCBhZGRyZXNzLCAwLAotCQkJCSAgICAgICAoYmZkX3ZtYSkgMCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCwKLQkJCQkgICAgICAgKGV0cmVlX3R5cGUgKikgTlVMTCk7Ci0KLSAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF9sb29rdXAgKHNlY25hbWUpOwotICB3aWxkX2RvaXQgKCZvcy0+Y2hpbGRyZW4sIHMsIG9zLCBmaWxlKTsKLQotICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAoKGJmZF92bWEpIDAsICIqZGVmYXVsdCoiKTsKLSAgc3RhdF9wdHIgPSAmYWRkOwotCi0gIGlmICgqcHMgPT0gJ1wwJyAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzKQotICAgIHsKLSAgICAgIGNoYXIgKnN5bW5hbWU7Ci0KLSAgICAgIHN5bW5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChwcyAtIHNlY25hbWUgKyBzaXplb2YgIl9fc3RvcF8iKTsKLSAgICAgIHNwcmludGYgKHN5bW5hbWUsICJfX3N0b3BfJXMiLCBzZWNuYW1lKTsKLSAgICAgIGxhbmdfYWRkX2Fzc2lnbm1lbnQgKGV4cF9hc3NvcCAoJz0nLCBzeW1uYW1lLAotCQkJCSAgICAgIGV4cF9uYW1lb3AgKE5BTUUsICIuIikpKTsKLSAgICB9Ci0KLSAgLyogTm93IHN0aWNrIHRoZSBuZXcgc3RhdGVtZW50IGxpc3QgcmlnaHQgYWZ0ZXIgUExBQ0UuICAqLwotICAqYWRkLnRhaWwgPSBwbGFjZS0+aGVhZGVyLm5leHQ7Ci0gIHBsYWNlLT5oZWFkZXIubmV4dCA9IGFkZC5oZWFkOwotCi0gIHN0YXRfcHRyID0gb2xkOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotZ2xkZWxmMzJlYm1pcF9wbGFjZV9zZWN0aW9uIChzKQotICAgICBsYW5nX3N0YXRlbWVudF91bmlvbl90eXBlICpzOwotewotICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLQotICBpZiAocy0+aGVhZGVyLnR5cGUgIT0gbGFuZ19vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnRfZW51bSkKLSAgICByZXR1cm47Ci0KLSAgb3MgPSAmcy0+b3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50OwotCi0gIGlmIChzdHJjbXAgKG9zLT5uYW1lLCBob2xkX3NlY3Rpb24tPm5hbWUpID09IDApCi0gICAgaG9sZF91c2UgPSBvczsKLQotICBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi50ZXh0IikgPT0gMCkKLSAgICBob2xkX3RleHQgPSBvczsKLSAgZWxzZSBpZiAoc3RyY21wIChvcy0+bmFtZSwgIi5yb2RhdGEiKSA9PSAwKQotICAgIGhvbGRfcm9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuZGF0YSIpID09IDApCi0gICAgaG9sZF9kYXRhID0gb3M7Ci0gIGVsc2UgaWYgKHN0cmNtcCAob3MtPm5hbWUsICIuYnNzIikgPT0gMCkKLSAgICBob2xkX2JzcyA9IG9zOwotICBlbHNlIGlmIChob2xkX3JlbCA9PSBOVUxMCi0JICAgJiYgb3MtPmJmZF9zZWN0aW9uICE9IE5VTEwKLQkgICAmJiBzdHJuY21wIChvcy0+bmFtZSwgIi5yZWwiLCA0KSA9PSAwKQotICAgIGhvbGRfcmVsID0gb3M7Ci19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZGVsZjMyZWJtaXBfZ2V0X3NjcmlwdChpc2ZpbGUpCi0gICAgIGludCAqaXNmaWxlOwotewkJCSAgICAgCi0gICppc2ZpbGUgPSAwOwotCi0gIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUgJiYgY29uZmlnLmJ1aWxkX2NvbnN0cnVjdG9ycyA9PSB0cnVlKQotICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCi1PVVRQVVRfQVJDSChtaXBzKVxuXAotRU5UUlkoX3N0YXJ0KVxuXAotIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlc1xuXAotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZ1xuXAotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZFxuXAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKLSAgLmludGVycCAgIDAgOiB7ICooLmludGVycCkgCX1cblwKLSAgLnJlZ2luZm8gICAgIDAgOiB7ICooLnJlZ2luZm8pIH1cblwKLSAgLmR5bmFtaWMgICAgIDAgOiB7ICooLmR5bmFtaWMpIH1cblwKLSAgLmR5bnN0ciAgICAgIDAgOiB7ICooLmR5bnN0cikJCX1cblwKLSAgLmR5bnN5bSAgICAgIDAgOiB7ICooLmR5bnN5bSkJCX1cblwKLSAgLmhhc2ggICAgICAgIDAgOiB7ICooLmhhc2gpCQl9XG5cCi0gIC5yZWwudGV4dCAgICAwIDogeyAqKC5yZWwudGV4dCkJCX1cblwKLSAgLnJlbGEudGV4dCAgIDAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKLSAgLnJlbC5kYXRhICAgIDAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAotICAucmVsYS5kYXRhICAgMCA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAotICAucmVsLnJvZGF0YSAgMCA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKLSAgLnJlbGEucm9kYXRhIDAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAotICAucmVsLmdvdCAgICAgMCA6IHsgKigucmVsLmdvdCkJCX1cblwKLSAgLnJlbGEuZ290ICAgIDAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAotICAucmVsLmN0b3JzICAgMCA6IHsgKigucmVsLmN0b3JzKQl9XG5cCi0gIC5yZWxhLmN0b3JzICAwIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCi0gIC5yZWwuZHRvcnMgICAwIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKLSAgLnJlbGEuZHRvcnMgIDAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKLSAgLnJlbC5pbml0ICAgIDAgOiB7ICooLnJlbC5pbml0KQl9XG5cCi0gIC5yZWxhLmluaXQgICAwIDogeyAqKC5yZWxhLmluaXQpCX1cblwKLSAgLnJlbC5maW5pICAgIDAgOiB7ICooLnJlbC5maW5pKQl9XG5cCi0gIC5yZWxhLmZpbmkgICAwIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKLSAgLnJlbC5ic3MgICAgIDAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCi0gIC5yZWxhLmJzcyAgICAwIDogeyAqKC5yZWxhLmJzcykJCX1cblwKLSAgLnJlbC5wbHQgICAgIDAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCi0gIC5yZWxhLnBsdCAgICAwIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKLSAgLnJvZGF0YSAgMCA6IHsgKigucm9kYXRhKSAgfVxuXAotICAucm9kYXRhMSAwIDogeyAqKC5yb2RhdGExKSB9XG5cCi0gIC5pbml0ICAgICAgICAwIDogeyAqKC5pbml0KQl9ID0wXG5cCi0gIC50ZXh0ICAgIDAgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHViKVxuXAotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAotICAgICooLmdudS53YXJuaW5nKVxuXAotICB9ID0wXG5cCi0gIC5maW5pICAgIDAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAotICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCi0gIC5kYXRhICAwIDpcblwKLSAge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmRhdGExIDAgOiB7ICooLmRhdGExKSB9XG5cCi0gIC5jdG9ycyAgICAgICAwIDogeyAqKC5jdG9ycykgICB9XG5cCi0gIC5kdG9ycyAgICAgICAwIDogeyAqKC5kdG9ycykgICB9XG5cCi0gIC5nb3QgICAgICAgICAwIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAwIDogeyAqKC5zZGF0YSkgfVxuXAotICAuc2JzcyAgICAwIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgIDAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgLiAgKi9cblwKLSAgLmdwdGFiLnNkYXRhIDogeyAqKC5ncHRhYi5kYXRhKSAqKC5ncHRhYi5zZGF0YSkgfVxuXAotICAuZ3B0YWIuc2JzcyA6IHsgKiguZ3B0YWIuYnNzKSAqKC5ncHRhYi5zYnNzKSB9XG5cCi19XG5cbiI7Ci0gIGVsc2UgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSkKLSAgICByZXR1cm4gIk9VVFBVVF9GT1JNQVQoXCJlbGYzMi1iaWdtaXBzXCIsIFwiZWxmMzItYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWxmMzItbGl0dGxlbWlwc1wiKVxuXAotT1VUUFVUX0FSQ0gobWlwcylcblwKLUVOVFJZKF9zdGFydClcblwKLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXNcblwKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmdcblwKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGRcblwKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL1xuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLyogUmVhZC1vbmx5IHNlY3Rpb25zLCBtZXJnZWQgaW50byB0ZXh0IHNlZ21lbnQ6ICovXG5cCi0gIC5pbnRlcnAgICAwIDogeyAqKC5pbnRlcnApIAl9XG5cCi0gIC5yZWdpbmZvICAgICAwIDogeyAqKC5yZWdpbmZvKSB9XG5cCi0gIC5keW5hbWljICAgICAwIDogeyAqKC5keW5hbWljKSB9XG5cCi0gIC5keW5zdHIgICAgICAwIDogeyAqKC5keW5zdHIpCQl9XG5cCi0gIC5keW5zeW0gICAgICAwIDogeyAqKC5keW5zeW0pCQl9XG5cCi0gIC5oYXNoICAgICAgICAwIDogeyAqKC5oYXNoKQkJfVxuXAotICAucmVsLnRleHQgICAgMCA6IHsgKigucmVsLnRleHQpCQl9XG5cCi0gIC5yZWxhLnRleHQgICAwIDogeyAqKC5yZWxhLnRleHQpIAl9XG5cCi0gIC5yZWwuZGF0YSAgICAwIDogeyAqKC5yZWwuZGF0YSkJCX1cblwKLSAgLnJlbGEuZGF0YSAgIDAgOiB7ICooLnJlbGEuZGF0YSkgCX1cblwKLSAgLnJlbC5yb2RhdGEgIDAgOiB7ICooLnJlbC5yb2RhdGEpIAl9XG5cCi0gIC5yZWxhLnJvZGF0YSAwIDogeyAqKC5yZWxhLnJvZGF0YSkgCX1cblwKLSAgLnJlbC5nb3QgICAgIDAgOiB7ICooLnJlbC5nb3QpCQl9XG5cCi0gIC5yZWxhLmdvdCAgICAwIDogeyAqKC5yZWxhLmdvdCkJCX1cblwKLSAgLnJlbC5jdG9ycyAgIDAgOiB7ICooLnJlbC5jdG9ycykJfVxuXAotICAucmVsYS5jdG9ycyAgMCA6IHsgKigucmVsYS5jdG9ycykJfVxuXAotICAucmVsLmR0b3JzICAgMCA6IHsgKigucmVsLmR0b3JzKQl9XG5cCi0gIC5yZWxhLmR0b3JzICAwIDogeyAqKC5yZWxhLmR0b3JzKQl9XG5cCi0gIC5yZWwuaW5pdCAgICAwIDogeyAqKC5yZWwuaW5pdCkJfVxuXAotICAucmVsYS5pbml0ICAgMCA6IHsgKigucmVsYS5pbml0KQl9XG5cCi0gIC5yZWwuZmluaSAgICAwIDogeyAqKC5yZWwuZmluaSkJfVxuXAotICAucmVsYS5maW5pICAgMCA6IHsgKigucmVsYS5maW5pKQl9XG5cCi0gIC5yZWwuYnNzICAgICAwIDogeyAqKC5yZWwuYnNzKQkJfVxuXAotICAucmVsYS5ic3MgICAgMCA6IHsgKigucmVsYS5ic3MpCQl9XG5cCi0gIC5yZWwucGx0ICAgICAwIDogeyAqKC5yZWwucGx0KQkJfVxuXAotICAucmVsYS5wbHQgICAgMCA6IHsgKigucmVsYS5wbHQpCQl9XG5cCi0gIC5yb2RhdGEgIDAgOiB7ICooLnJvZGF0YSkgIH1cblwKLSAgLnJvZGF0YTEgMCA6IHsgKigucm9kYXRhMSkgfVxuXAotICAuaW5pdCAgICAgICAgMCA6IHsgKiguaW5pdCkJfSA9MFxuXAotICAudGV4dCAgICAwIDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3R1YilcblwKLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi9cblwKLSAgICAqKC5nbnUud2FybmluZylcblwKLSAgfSA9MFxuXAotICAuZmluaSAgICAwIDogeyAqKC5maW5pKSAgICB9ID0wXG5cCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvXG5cCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICBJdCB3b3VsZFxuXAotICAgICBiZSBtb3JlIGNvcnJlY3QgdG8gZG8gdGhpczpcblwKLSAgICAgVGhlIGN1cnJlbnQgZXhwcmVzc2lvbiBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIHRoZSBjYXNlIG9mIGFcblwKLSAgICAgdGV4dCBzZWdtZW50IGVuZGluZyBwcmVjaXNlbHkgYXQgdGhlIGVuZCBvZiBhIHBhZ2U7IGl0IGNhdXNlcyB0aGVcblwKLSAgICAgZGF0YSBzZWdtZW50IHRvIHNraXAgYSBwYWdlLiAgVGhlIGFib3ZlIGV4cHJlc3Npb24gZG9lcyBub3QgaGF2ZVxuXAotICAgICB0aGlzIHByb2JsZW0sIGJ1dCBpdCB3aWxsIGN1cnJlbnRseSAoMi85NSkgY2F1c2UgQkZEIHRvIGFsbG9jYXRlXG5cCi0gICAgIGEgc2luZ2xlIHNlZ21lbnQsIGNvbWJpbmluZyBib3RoIHRleHQgYW5kIGRhdGEsIGZvciB0aGlzIGNhc2UuXG5cCi0gICAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXh0IHNlZ21lbnQgZnJvbSBiZWluZyBzaGFyZWQgYW1vbmdcblwKLSAgICAgbXVsdGlwbGUgZXhlY3V0aW9ucyBvZiB0aGUgcHJvZ3JhbTsgSSB0aGluayB0aGF0IGlzIG1vcmVcblwKLSAgICAgaW1wb3J0YW50IHRoYW4gbG9zaW5nIGEgcGFnZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIChub3RlXG5cCi0gICAgIHRoYXQgbm8gYWN0dWFsIG1lbW9yeSBpcyBsb3N0OyB0aGUgcGFnZSB3aGljaCBpcyBza2lwcGVkIGNhbiBub3RcblwKLSAgICAgYmUgcmVmZXJlbmNlZCkuICAqL1xuXAotICAuZGF0YSAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICB9XG5cCi0gIC5kYXRhMSAwIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgMCA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgMCA6IHsgKiguZHRvcnMpICAgfVxuXAotICAuZ290ICAgICAgICAgMCA6XG5cCi0gIHtcblwKLSAgICAqKC5nb3QucGx0KSAqKC5nb3QpXG5cCi0gICB9XG5cCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzXG5cCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc29cblwKLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi9cblwKLSAgLnNkYXRhICAgMCA6IHsgKiguc2RhdGEpIH1cblwKLSAgLnNic3MgICAgMCA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfVxuXAotICAuYnNzICAgICAwIDpcblwKLSAge1xuXAotICAgKiguZHluYnNzKVxuXAotICAgKiguYnNzKVxuXAotICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuXG5cCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovXG5cCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH1cblwKLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfVxuXAotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy5cblwKLSAgICAgU3ltYm9scyBpbiB0aGUgLmRlYnVnIERXQVJGIHNlY3Rpb24gYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG5cCi0gICAgIHNlY3Rpb24gc28gd2UgYmVnaW4gLmRlYnVnIGF0IDAuICBJdCdzIG5vdCBjbGVhciB5ZXQgd2hhdCBuZWVkcyB0byBoYXBwZW5cblwKLSAgICAgZm9yIHRoZSBvdGhlcnMuICAgKi9cblwKLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9XG5cCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9XG5cCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9XG5cCi0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfVxuXAotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfVxuXAotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfVxuXAotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotICBlbHNlIGlmICghY29uZmlnLnRleHRfcmVhZF9vbmx5KQotICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCi1PVVRQVVRfQVJDSChtaXBzKVxuXAotRU5UUlkoX3N0YXJ0KVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWVsZi9saWIpO1xuXAotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj9cblwKLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKLSAgLiA9IDB4MDQwMDAwMDtcblwKLSAgLmludGVycCAgICAgOiB7ICooLmludGVycCkgCX1cblwKLSAgLnJlZ2luZm8gICAgICAgOiB7ICooLnJlZ2luZm8pIH1cblwKLSAgLmR5bmFtaWMgICAgICAgOiB7ICooLmR5bmFtaWMpIH1cblwKLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX1cblwKLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX1cblwKLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9XG5cCi0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX1cblwKLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX1cblwKLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9XG5cCi0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCi0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKLSAgLnJlbC5pbml0ICAgICAgOiB7ICooLnJlbC5pbml0KQl9XG5cCi0gIC5yZWxhLmluaXQgICAgIDogeyAqKC5yZWxhLmluaXQpCX1cblwKLSAgLnJlbC5maW5pICAgICAgOiB7ICooLnJlbC5maW5pKQl9XG5cCi0gIC5yZWxhLmZpbmkgICAgIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCi0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX1cblwKLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCi0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKLSAgLnJvZGF0YSAgICA6IHsgKigucm9kYXRhKSAgfVxuXAotICAucm9kYXRhMSAgIDogeyAqKC5yb2RhdGExKSB9XG5cCi0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9ID0wXG5cCi0gIC50ZXh0ICAgICAgOlxuXAotICB7XG5cCi0gICAgX2Z0ZXh0ID0gLiA7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHViKVxuXAotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAotICAgICooLmdudS53YXJuaW5nKVxuXAotICB9ID0wXG5cCi0gIF9ldGV4dCA9IC47XG5cCi0gIFBST1ZJREUgKGV0ZXh0ID0gLik7XG5cCi0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAotICAgICAgIC4gPSAuO1xuXAotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAotICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCi0gIC4gKz0gLiAtIDB4MDQwMDAwMDtcblwKLSAgLmRhdGEgICAgOlxuXAotICB7XG5cCi0gICAgX2ZkYXRhID0gLiA7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgICAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgICAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwO1xuXAotICAuZ290ICAgICAgICAgICA6XG5cCi0gIHtcblwKLSAgICAqKC5nb3QucGx0KSAqKC5nb3QpXG5cCi0gICB9XG5cCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzXG5cCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc29cblwKLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi9cblwKLSAgLnNkYXRhICAgICA6IHsgKiguc2RhdGEpIH1cblwKLSAgLmxpdDggOiB7ICooLmxpdDgpIH1cblwKLSAgLmxpdDQgOiB7ICooLmxpdDQpIH1cblwKLSAgX2VkYXRhICA9ICAuO1xuXAotICBQUk9WSURFIChlZGF0YSA9IC4pO1xuXAotICBfX2Jzc19zdGFydCA9IC47XG5cCi0gIF9mYnNzID0gLjtcblwKLSAgLnNic3MgICAgICA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfVxuXAotICAuYnNzICAgICAgIDpcblwKLSAge1xuXAotICAgKiguZHluYnNzKVxuXAotICAgKiguYnNzKVxuXAotICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgX2VuZCA9IC4gO1xuXAotICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuXG5cCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovXG5cCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH1cblwKLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfVxuXAotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy5cblwKLSAgICAgU3ltYm9scyBpbiB0aGUgLmRlYnVnIERXQVJGIHNlY3Rpb24gYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG5cCi0gICAgIHNlY3Rpb24gc28gd2UgYmVnaW4gLmRlYnVnIGF0IDAuICBJdCdzIG5vdCBjbGVhciB5ZXQgd2hhdCBuZWVkcyB0byBoYXBwZW5cblwKLSAgICAgZm9yIHRoZSBvdGhlcnMuICAgKi9cblwKLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9XG5cCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9XG5cCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9XG5cCi0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfVxuXAotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfVxuXAotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfVxuXAotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLSAgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpCi0gICAgcmV0dXJuICJPVVRQVVRfRk9STUFUKFwiZWxmMzItYmlnbWlwc1wiLCBcImVsZjMyLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVsZjMyLWxpdHRsZW1pcHNcIilcblwKLU9VVFBVVF9BUkNIKG1pcHMpXG5cCi1FTlRSWShfc3RhcnQpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtZWxmL2xpYik7XG5cCi0vKiBEbyB3ZSBuZWVkIGFueSBvZiB0aGVzZSBmb3IgZWxmP1xuXAotICAgX19EWU5BTUlDID0gMDsgICAgKi9cblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqL1xuXAotICAuID0gMHgwNDAwMDAwO1xuXAotICAuaW50ZXJwICAgICA6IHsgKiguaW50ZXJwKSAJfVxuXAotICAucmVnaW5mbyAgICAgICA6IHsgKigucmVnaW5mbykgfVxuXAotICAuZHluYW1pYyAgICAgICA6IHsgKiguZHluYW1pYykgfVxuXAotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfVxuXAotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfVxuXAotICAuaGFzaCAgICAgICAgICA6IHsgKiguaGFzaCkJCX1cblwKLSAgLnJlbC50ZXh0ICAgICAgOiB7ICooLnJlbC50ZXh0KQkJfVxuXAotICAucmVsYS50ZXh0ICAgICA6IHsgKigucmVsYS50ZXh0KSAJfVxuXAotICAucmVsLmRhdGEgICAgICA6IHsgKigucmVsLmRhdGEpCQl9XG5cCi0gIC5yZWxhLmRhdGEgICAgIDogeyAqKC5yZWxhLmRhdGEpIAl9XG5cCi0gIC5yZWwucm9kYXRhICAgIDogeyAqKC5yZWwucm9kYXRhKSAJfVxuXAotICAucmVsYS5yb2RhdGEgICA6IHsgKigucmVsYS5yb2RhdGEpIAl9XG5cCi0gIC5yZWwuZ290ICAgICAgIDogeyAqKC5yZWwuZ290KQkJfVxuXAotICAucmVsYS5nb3QgICAgICA6IHsgKigucmVsYS5nb3QpCQl9XG5cCi0gIC5yZWwuY3RvcnMgICAgIDogeyAqKC5yZWwuY3RvcnMpCX1cblwKLSAgLnJlbGEuY3RvcnMgICAgOiB7ICooLnJlbGEuY3RvcnMpCX1cblwKLSAgLnJlbC5kdG9ycyAgICAgOiB7ICooLnJlbC5kdG9ycykJfVxuXAotICAucmVsYS5kdG9ycyAgICA6IHsgKigucmVsYS5kdG9ycykJfVxuXAotICAucmVsLmluaXQgICAgICA6IHsgKigucmVsLmluaXQpCX1cblwKLSAgLnJlbGEuaW5pdCAgICAgOiB7ICooLnJlbGEuaW5pdCkJfVxuXAotICAucmVsLmZpbmkgICAgICA6IHsgKigucmVsLmZpbmkpCX1cblwKLSAgLnJlbGEuZmluaSAgICAgOiB7ICooLnJlbGEuZmluaSkJfVxuXAotICAucmVsLmJzcyAgICAgICA6IHsgKigucmVsLmJzcykJCX1cblwKLSAgLnJlbGEuYnNzICAgICAgOiB7ICooLnJlbGEuYnNzKQkJfVxuXAotICAucmVsLnBsdCAgICAgICA6IHsgKigucmVsLnBsdCkJCX1cblwKLSAgLnJlbGEucGx0ICAgICAgOiB7ICooLnJlbGEucGx0KQkJfVxuXAotICAucm9kYXRhICAgIDogeyAqKC5yb2RhdGEpICB9XG5cCi0gIC5yb2RhdGExICAgOiB7ICooLnJvZGF0YTEpIH1cblwKLSAgLmluaXQgICAgICAgICAgOiB7ICooLmluaXQpCX0gPTBcblwKLSAgLnRleHQgICAgICA6XG5cCi0gIHtcblwKLSAgICBfZnRleHQgPSAuIDtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0dWIpXG5cCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovXG5cCi0gICAgKiguZ251Lndhcm5pbmcpXG5cCi0gIH0gPTBcblwKLSAgX2V0ZXh0ID0gLjtcblwKLSAgUFJPVklERSAoZXRleHQgPSAuKTtcblwKLSAgLmZpbmkgICAgICA6IHsgKiguZmluaSkgICAgfSA9MFxuXAotICAvKiBBZGp1c3QgdGhlIGFkZHJlc3MgZm9yIHRoZSBkYXRhIHNlZ21lbnQuICBXZSB3YW50IHRvIGFkanVzdCB1cCB0b1xuXAotICAgICB0aGUgc2FtZSBhZGRyZXNzIHdpdGhpbiB0aGUgcGFnZSBvbiB0aGUgbmV4dCBwYWdlIHVwLiAgSXQgd291bGRcblwKLSAgICAgYmUgbW9yZSBjb3JyZWN0IHRvIGRvIHRoaXM6XG5cCi0gICAgICAgLiA9IDB4MTAwMDAwMDA7XG5cCi0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhXG5cCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlXG5cCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmVcblwKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZVxuXAotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLlxuXAotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nXG5cCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlXG5cCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZVxuXAotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90XG5cCi0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi9cblwKLSAgLiArPSAweDEwMDAwMDAwIC0gMHgwNDAwMDAwO1xuXAotICAuZGF0YSAgICA6XG5cCi0gIHtcblwKLSAgICBfZmRhdGEgPSAuIDtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfVxuXAotICAuY3RvcnMgICAgICAgICA6IHsgKiguY3RvcnMpICAgfVxuXAotICAuZHRvcnMgICAgICAgICA6IHsgKiguZHRvcnMpICAgfVxuXAotICBfZ3AgPSBBTElHTigxNikgKyAweDdmZjA7XG5cCi0gIC5nb3QgICAgICAgICAgIDpcblwKLSAge1xuXAotICAgICooLmdvdC5wbHQpICooLmdvdClcblwKLSAgIH1cblwKLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHNcblwKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzb1xuXAotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqL1xuXAotICAuc2RhdGEgICAgIDogeyAqKC5zZGF0YSkgfVxuXAotICAubGl0OCA6IHsgKigubGl0OCkgfVxuXAotICAubGl0NCA6IHsgKigubGl0NCkgfVxuXAotICBfZWRhdGEgID0gIC47XG5cCi0gIFBST1ZJREUgKGVkYXRhID0gLik7XG5cCi0gIF9fYnNzX3N0YXJ0ID0gLjtcblwKLSAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyAgICAgIDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9XG5cCi0gIC5ic3MgICAgICAgOlxuXAotICB7XG5cCi0gICAqKC5keW5ic3MpXG5cCi0gICAqKC5ic3MpXG5cCi0gICAqKENPTU1PTilcblwKLSAgfVxuXAotICBfZW5kID0gLiA7XG5cCi0gIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW5cblwKLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi9cblwKLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfVxuXAotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9XG5cCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLlxuXAotICAgICBTeW1ib2xzIGluIHRoZSAuZGVidWcgRFdBUkYgc2VjdGlvbiBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGVcblwKLSAgICAgc2VjdGlvbiBzbyB3ZSBiZWdpbiAuZGVidWcgYXQgMC4gIEl0J3Mgbm90IGNsZWFyIHlldCB3aGF0IG5lZWRzIHRvIGhhcHBlblxuXAotICAgICBmb3IgdGhlIG90aGVycy4gICAqL1xuXAotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH1cblwKLSAgLmRlYnVnX3NyY2luZm8gIDAgOiB7ICooLmRlYnVnX3NyY2luZm8pIH1cblwKLSAgLmRlYnVnX2FyYW5nZXMgIDAgOiB7ICooLmRlYnVnX2FyYW5nZXMpIH1cblwKLSAgLmRlYnVnX3B1Ym5hbWVzIDAgOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9XG5cCi0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9XG5cCi0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9XG5cCi0gIC8qIFRoZXNlIG11c3QgYXBwZWFyIHJlZ2FyZGxlc3Mgb2YgIC4gICovXG5cCi0gIC5ncHRhYi5zZGF0YSA6IHsgKiguZ3B0YWIuZGF0YSkgKiguZ3B0YWIuc2RhdGEpIH1cblwKLSAgLmdwdGFiLnNic3MgOiB7ICooLmdwdGFiLmJzcykgKiguZ3B0YWIuc2JzcykgfVxuXAotfVxuXG4iOwotICBlbHNlIGlmIChsaW5rX2luZm8uc2hhcmVkKQotICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCi1PVVRQVVRfQVJDSChtaXBzKVxuXAotRU5UUlkoX3N0YXJ0KVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWVsZi9saWIpO1xuXAotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj9cblwKLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKLSAgLiA9IDB4NWZmZTAwMDAgKyBTSVpFT0ZfSEVBREVSUztcblwKLSAgLnJlZ2luZm8gICAgICAgOiB7ICooLnJlZ2luZm8pIH1cblwKLSAgLmR5bmFtaWMgICAgICAgOiB7ICooLmR5bmFtaWMpIH1cblwKLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX1cblwKLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX1cblwKLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9XG5cCi0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX1cblwKLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX1cblwKLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9XG5cCi0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCi0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKLSAgLnJlbC5pbml0ICAgICAgOiB7ICooLnJlbC5pbml0KQl9XG5cCi0gIC5yZWxhLmluaXQgICAgIDogeyAqKC5yZWxhLmluaXQpCX1cblwKLSAgLnJlbC5maW5pICAgICAgOiB7ICooLnJlbC5maW5pKQl9XG5cCi0gIC5yZWxhLmZpbmkgICAgIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCi0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX1cblwKLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCi0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKLSAgLnJvZGF0YSAgICA6IHsgKigucm9kYXRhKSAgfVxuXAotICAucm9kYXRhMSAgIDogeyAqKC5yb2RhdGExKSB9XG5cCi0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9ID0wXG5cCi0gIC50ZXh0ICAgICAgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHViKVxuXAotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAotICAgICooLmdudS53YXJuaW5nKVxuXAotICB9ID0wXG5cCi0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAotICAgICAgIC4gPSAweDEwMDAwMDAwO1xuXAotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAotICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCi0gIC4gKz0gMHgxMDAwMDtcblwKLSAgLmRhdGEgICAgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgICAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgICAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwO1xuXAotICAuZ290ICAgICAgICAgICA6XG5cCi0gIHtcblwKLSAgICAqKC5nb3QucGx0KSAqKC5nb3QpXG5cCi0gICB9XG5cCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzXG5cCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc29cblwKLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi9cblwKLSAgLnNkYXRhICAgICA6IHsgKiguc2RhdGEpIH1cblwKLSAgLmxpdDggOiB7ICooLmxpdDgpIH1cblwKLSAgLmxpdDQgOiB7ICooLmxpdDQpIH1cblwKLSAgLnNic3MgICAgICA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfVxuXAotICAuYnNzICAgICAgIDpcblwKLSAge1xuXAotICAgKiguZHluYnNzKVxuXAotICAgKiguYnNzKVxuXAotICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuXG5cCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovXG5cCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH1cblwKLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfVxuXAotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy5cblwKLSAgICAgU3ltYm9scyBpbiB0aGUgLmRlYnVnIERXQVJGIHNlY3Rpb24gYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG5cCi0gICAgIHNlY3Rpb24gc28gd2UgYmVnaW4gLmRlYnVnIGF0IDAuICBJdCdzIG5vdCBjbGVhciB5ZXQgd2hhdCBuZWVkcyB0byBoYXBwZW5cblwKLSAgICAgZm9yIHRoZSBvdGhlcnMuICAgKi9cblwKLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9XG5cCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9XG5cCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9XG5cCi0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfVxuXAotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfVxuXAotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfVxuXAotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLSAgZWxzZQotICAgIHJldHVybiAiT1VUUFVUX0ZPUk1BVChcImVsZjMyLWJpZ21pcHNcIiwgXCJlbGYzMi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlbGYzMi1saXR0bGVtaXBzXCIpXG5cCi1PVVRQVVRfQVJDSChtaXBzKVxuXAotRU5UUlkoX3N0YXJ0KVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWVsZi9saWIpO1xuXAotLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj9cblwKLSAgIF9fRFlOQU1JQyA9IDA7ICAgICovXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi9cblwKLSAgLiA9IDB4MDQwMDAwMDtcblwKLSAgLmludGVycCAgICAgOiB7ICooLmludGVycCkgCX1cblwKLSAgLnJlZ2luZm8gICAgICAgOiB7ICooLnJlZ2luZm8pIH1cblwKLSAgLmR5bmFtaWMgICAgICAgOiB7ICooLmR5bmFtaWMpIH1cblwKLSAgLmR5bnN0ciAgICAgICAgOiB7ICooLmR5bnN0cikJCX1cblwKLSAgLmR5bnN5bSAgICAgICAgOiB7ICooLmR5bnN5bSkJCX1cblwKLSAgLmhhc2ggICAgICAgICAgOiB7ICooLmhhc2gpCQl9XG5cCi0gIC5yZWwudGV4dCAgICAgIDogeyAqKC5yZWwudGV4dCkJCX1cblwKLSAgLnJlbGEudGV4dCAgICAgOiB7ICooLnJlbGEudGV4dCkgCX1cblwKLSAgLnJlbC5kYXRhICAgICAgOiB7ICooLnJlbC5kYXRhKQkJfVxuXAotICAucmVsYS5kYXRhICAgICA6IHsgKigucmVsYS5kYXRhKSAJfVxuXAotICAucmVsLnJvZGF0YSAgICA6IHsgKigucmVsLnJvZGF0YSkgCX1cblwKLSAgLnJlbGEucm9kYXRhICAgOiB7ICooLnJlbGEucm9kYXRhKSAJfVxuXAotICAucmVsLmdvdCAgICAgICA6IHsgKigucmVsLmdvdCkJCX1cblwKLSAgLnJlbGEuZ290ICAgICAgOiB7ICooLnJlbGEuZ290KQkJfVxuXAotICAucmVsLmN0b3JzICAgICA6IHsgKigucmVsLmN0b3JzKQl9XG5cCi0gIC5yZWxhLmN0b3JzICAgIDogeyAqKC5yZWxhLmN0b3JzKQl9XG5cCi0gIC5yZWwuZHRvcnMgICAgIDogeyAqKC5yZWwuZHRvcnMpCX1cblwKLSAgLnJlbGEuZHRvcnMgICAgOiB7ICooLnJlbGEuZHRvcnMpCX1cblwKLSAgLnJlbC5pbml0ICAgICAgOiB7ICooLnJlbC5pbml0KQl9XG5cCi0gIC5yZWxhLmluaXQgICAgIDogeyAqKC5yZWxhLmluaXQpCX1cblwKLSAgLnJlbC5maW5pICAgICAgOiB7ICooLnJlbC5maW5pKQl9XG5cCi0gIC5yZWxhLmZpbmkgICAgIDogeyAqKC5yZWxhLmZpbmkpCX1cblwKLSAgLnJlbC5ic3MgICAgICAgOiB7ICooLnJlbC5ic3MpCQl9XG5cCi0gIC5yZWxhLmJzcyAgICAgIDogeyAqKC5yZWxhLmJzcykJCX1cblwKLSAgLnJlbC5wbHQgICAgICAgOiB7ICooLnJlbC5wbHQpCQl9XG5cCi0gIC5yZWxhLnBsdCAgICAgIDogeyAqKC5yZWxhLnBsdCkJCX1cblwKLSAgLnJvZGF0YSAgICA6IHsgKigucm9kYXRhKSAgfVxuXAotICAucm9kYXRhMSAgIDogeyAqKC5yb2RhdGExKSB9XG5cCi0gIC5pbml0ICAgICAgICAgIDogeyAqKC5pbml0KQl9ID0wXG5cCi0gIC50ZXh0ICAgICAgOlxuXAotICB7XG5cCi0gICAgX2Z0ZXh0ID0gLiA7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHViKVxuXAotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqL1xuXAotICAgICooLmdudS53YXJuaW5nKVxuXAotICB9ID0wXG5cCi0gIF9ldGV4dCA9IC47XG5cCi0gIFBST1ZJREUgKGV0ZXh0ID0gLik7XG5cCi0gIC5maW5pICAgICAgOiB7ICooLmZpbmkpICAgIH0gPTBcblwKLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG9cblwKLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkXG5cCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOlxuXAotICAgICAgIC4gPSAweDEwMDAwMDAwO1xuXAotICAgICBUaGUgY3VycmVudCBleHByZXNzaW9uIGRvZXMgbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlIGNhc2Ugb2YgYVxuXAotICAgICB0ZXh0IHNlZ21lbnQgZW5kaW5nIHByZWNpc2VseSBhdCB0aGUgZW5kIG9mIGEgcGFnZTsgaXQgY2F1c2VzIHRoZVxuXAotICAgICBkYXRhIHNlZ21lbnQgdG8gc2tpcCBhIHBhZ2UuICBUaGUgYWJvdmUgZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlXG5cCi0gICAgIHRoaXMgcHJvYmxlbSwgYnV0IGl0IHdpbGwgY3VycmVudGx5ICgyLzk1KSBjYXVzZSBCRkQgdG8gYWxsb2NhdGVcblwKLSAgICAgYSBzaW5nbGUgc2VnbWVudCwgY29tYmluaW5nIGJvdGggdGV4dCBhbmQgZGF0YSwgZm9yIHRoaXMgY2FzZS5cblwKLSAgICAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIHRleHQgc2VnbWVudCBmcm9tIGJlaW5nIHNoYXJlZCBhbW9uZ1xuXAotICAgICBtdWx0aXBsZSBleGVjdXRpb25zIG9mIHRoZSBwcm9ncmFtOyBJIHRoaW5rIHRoYXQgaXMgbW9yZVxuXAotICAgICBpbXBvcnRhbnQgdGhhbiBsb3NpbmcgYSBwYWdlIG9mIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgKG5vdGVcblwKLSAgICAgdGhhdCBubyBhY3R1YWwgbWVtb3J5IGlzIGxvc3Q7IHRoZSBwYWdlIHdoaWNoIGlzIHNraXBwZWQgY2FuIG5vdFxuXAotICAgICBiZSByZWZlcmVuY2VkKS4gICovXG5cCi0gIC4gKz0gMHgxMDAwMDAwMCAtIDB4MDQwMDAwMDtcblwKLSAgLmRhdGEgICAgOlxuXAotICB7XG5cCi0gICAgX2ZkYXRhID0gLiA7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAuZGF0YTEgICA6IHsgKiguZGF0YTEpIH1cblwKLSAgLmN0b3JzICAgICAgICAgOiB7ICooLmN0b3JzKSAgIH1cblwKLSAgLmR0b3JzICAgICAgICAgOiB7ICooLmR0b3JzKSAgIH1cblwKLSAgX2dwID0gQUxJR04oMTYpICsgMHg3ZmYwO1xuXAotICAuZ290ICAgICAgICAgICA6XG5cCi0gIHtcblwKLSAgICAqKC5nb3QucGx0KSAqKC5nb3QpXG5cCi0gICB9XG5cCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzXG5cCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc29cblwKLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi9cblwKLSAgLnNkYXRhICAgICA6IHsgKiguc2RhdGEpIH1cblwKLSAgLmxpdDggOiB7ICooLmxpdDgpIH1cblwKLSAgLmxpdDQgOiB7ICooLmxpdDQpIH1cblwKLSAgX2VkYXRhICA9ICAuO1xuXAotICBQUk9WSURFIChlZGF0YSA9IC4pO1xuXAotICBfX2Jzc19zdGFydCA9IC47XG5cCi0gIF9mYnNzID0gLjtcblwKLSAgLnNic3MgICAgICA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfVxuXAotICAuYnNzICAgICAgIDpcblwKLSAge1xuXAotICAgKiguZHluYnNzKVxuXAotICAgKiguYnNzKVxuXAotICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgX2VuZCA9IC4gO1xuXAotICBQUk9WSURFIChlbmQgPSAuKTtcblwKLSAgLyogVGhlc2UgYXJlIG5lZWRlZCBmb3IgRUxGIGJhY2tlbmRzIHdoaWNoIGhhdmUgbm90IHlldCBiZWVuXG5cCi0gICAgIGNvbnZlcnRlZCB0byB0aGUgbmV3IHN0eWxlIGxpbmtlci4gICovXG5cCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH1cblwKLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfVxuXAotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy5cblwKLSAgICAgU3ltYm9scyBpbiB0aGUgLmRlYnVnIERXQVJGIHNlY3Rpb24gYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlXG5cCi0gICAgIHNlY3Rpb24gc28gd2UgYmVnaW4gLmRlYnVnIGF0IDAuICBJdCdzIG5vdCBjbGVhciB5ZXQgd2hhdCBuZWVkcyB0byBoYXBwZW5cblwKLSAgICAgZm9yIHRoZSBvdGhlcnMuICAgKi9cblwKLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9XG5cCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9XG5cCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9XG5cCi0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfVxuXAotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfVxuXAotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfVxuXAotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICAuICAqL1xuXAotICAuZ3B0YWIuc2RhdGEgOiB7ICooLmdwdGFiLmRhdGEpICooLmdwdGFiLnNkYXRhKSB9XG5cCi0gIC5ncHRhYi5zYnNzIDogeyAqKC5ncHRhYi5ic3MpICooLmdwdGFiLnNic3MpIH1cblwKLX1cblxuIjsKLX0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9lbGYzMmVibWlwX2VtdWxhdGlvbiA9IAotewotICBnbGRlbGYzMmVibWlwX2JlZm9yZV9wYXJzZSwKLSAgc3lzbGliX2RlZmF1bHQsCi0gIGhsbF9kZWZhdWx0LAotICBhZnRlcl9wYXJzZV9kZWZhdWx0LAotICBnbGRlbGYzMmVibWlwX2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkZWxmMzJlYm1pcF9iZWZvcmVfYWxsb2NhdGlvbiwKLSAgZ2xkZWxmMzJlYm1pcF9nZXRfc2NyaXB0LAotICAiZWxmMzJlYm1pcCIsCi0gICJlbGYzMi1iaWdtaXBzIiwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgZ2xkZWxmMzJlYm1pcF9vcGVuX2R5bmFtaWNfYXJjaGl2ZSwKLSAgZ2xkZWxmMzJlYm1pcF9wbGFjZV9vcnBoYW4KLX07CmRpZmYgLS1naXQgYS9sZC9tcHctZXBwY21hYy5jIGIvbGQvbXB3LWVwcGNtYWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwOWE0MS4uMDAwMDAwMAotLS0gYS9sZC9tcHctZXBwY21hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNCArMCwwIEBACi0vKiBUaGlzIGZpbGUgaXMgaXMgZ2VuZXJhdGVkIGJ5IGEgc2hlbGwgc2NyaXB0LiAgRE8gTk9UIEVESVQhICovCi0KLS8qIEFJWCBlbXVsYXRpb24gY29kZSBmb3IgcHBjbWFjb3MKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MywgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gPHNhY0BjeWdudXMuY29tPgotICAgQUlYIHN1cHBvcnQgYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgVEFSR0VUX0lTX3BwY21hY29zCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJnZXRvcHQuaCIKLSNpbmNsdWRlICJiZmRsaW5rLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkY3Rvci5oIgotI2luY2x1ZGUgImxkZ3JhbS5oIgotCi1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIGludCBnbGRwcGNtYWNvc19wYXJzZV9hcmdzIFBBUkFNUyAoKGludCwgY2hhciAqKikpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfYWZ0ZXJfb3BlbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19iZWZvcmVfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19yZWFkX2ZpbGUgUEFSQU1TICgoY29uc3QgY2hhciAqLCBib29sZWFuKSk7Ci1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19mcmVlIFBBUkFNUyAoKFBUUikpOwotc3RhdGljIHZvaWQgZ2xkcHBjbWFjb3NfZmluZF9yZWxvY3MKLSAgUEFSQU1TICgobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSk7Ci1zdGF0aWMgdm9pZCBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IFBBUkFNUyAoKGV0cmVlX3R5cGUgKikpOwotc3RhdGljIGNoYXIgKmdsZHBwY21hY29zX2dldF9zY3JpcHQgUEFSQU1TICgoaW50ICppc2ZpbGUpKTsKLQotLyogVGhlIGZpbGUgYWxpZ25tZW50IHJlcXVpcmVkIGZvciBlYWNoIHNlY3Rpb24uICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZmlsZV9hbGlnbjsKLQotLyogVGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2sgaXMgcGVybWl0dGVkIHRvIGdyb3cuICBUaGlzIGlzIHN0b3JlZCBpbgotICAgdGhlIGEub3V0IGhlYWRlci4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhzdGFjazsKLQotLyogVGhlIG1heGltdW0gZGF0YSBzaXplLiAgVGhpcyBpcyBzdG9yZWQgaW4gdGhlIGEub3V0IGhlYWRlci4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhkYXRhOwotCi0vKiBXaGV0aGVyIHRvIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgZ2MgPSAxOwotCi0vKiBUaGUgbW9kdWxlIHR5cGUgdG8gdXNlLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtb2R0eXBlID0gKCcxJyA8PCA4KSB8ICdMJzsKLQotLyogV2hldGhlciB0aGUgLnRleHQgc2VjdGlvbiBtdXN0IGJlIHJlYWQtb25seSAoaS5lLiwgbm8gcmVsb2NzCi0gICBwZXJtaXR0ZWQpLiAgKi8KLXN0YXRpYyBpbnQgdGV4dHJvOwotCi0vKiBXaGV0aGVyIHRvIGltcGxlbWVudCBVbml4IGxpa2UgbGlua2VyIHNlbWFudGljcy4gICovCi1zdGF0aWMgaW50IHVuaXhfbGQ7Ci0KLS8qIFN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgaW1wb3J0IGZpbGUgbGlzdC4gICovCi0KLXN0cnVjdCBmaWxlbGlzdAotewotICBzdHJ1Y3QgZmlsZWxpc3QgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci19OwotCi0vKiBMaXN0IG9mIGltcG9ydCBmaWxlcy4gICovCi1zdGF0aWMgc3RydWN0IGZpbGVsaXN0ICppbXBvcnRfZmlsZXM7Ci0KLS8qIExpc3Qgb2YgZXhwb3J0IHN5bWJvbHMgcmVhZCBmcm9tIHRoZSBleHBvcnQgZmlsZXMuICAqLwotCi1zdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0Ci17Ci0gIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKm5leHQ7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGJvb2xlYW4gc3lzY2FsbDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICpleHBvcnRfc3ltYm9sczsKLQotLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBkb25lLiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfcG93ZXJwYzsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi0vKiBIYW5kbGUgQUlYIHNwZWNpZmljIG9wdGlvbnMuICAqLwotCi1zdGF0aWMgaW50Ci1nbGRwcGNtYWNvc19wYXJzZV9hcmdzIChhcmdjLCBhcmd2KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBwcmV2b3B0aW5kID0gb3B0aW5kOwotICBpbnQgcHJldm9wdGVyciA9IG9wdGVycjsKLSAgaW50IGluZHg7Ci0gIGludCBsb25naW5kOwotICBpbnQgb3B0YzsKLSAgbG9uZyB2YWw7Ci0gIGNoYXIgKmVuZDsKLQotI2RlZmluZSBPUFRJT05fSUdOT1JFICgzMDApCi0jZGVmaW5lIE9QVElPTl9BVVRPSU1QIChPUFRJT05fSUdOT1JFICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VSTk9UT0sgKE9QVElPTl9BVVRPSU1QICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VST0sgKE9QVElPTl9FUk5PVE9LICsgMSkKLSNkZWZpbmUgT1BUSU9OX0VYUE9SVCAoT1BUSU9OX0VST0sgKyAxKQotI2RlZmluZSBPUFRJT05fSU1QT1JUIChPUFRJT05fRVhQT1JUICsgMSkKLSNkZWZpbmUgT1BUSU9OX0xPQURNQVAgKE9QVElPTl9JTVBPUlQgKyAxKQotI2RlZmluZSBPUFRJT05fTUFYREFUQSAoT1BUSU9OX0xPQURNQVAgKyAxKQotI2RlZmluZSBPUFRJT05fTUFYU1RBQ0sgKE9QVElPTl9NQVhEQVRBICsgMSkKLSNkZWZpbmUgT1BUSU9OX01PRFRZUEUgKE9QVElPTl9NQVhTVEFDSyArIDEpCi0jZGVmaW5lIE9QVElPTl9OT0FVVE9JTVAgKE9QVElPTl9NT0RUWVBFICsgMSkKLSNkZWZpbmUgT1BUSU9OX05PU1RSQ01QQ1QgKE9QVElPTl9OT0FVVE9JTVAgKyAxKQotI2RlZmluZSBPUFRJT05fUEQgKE9QVElPTl9OT1NUUkNNUENUICsgMSkKLSNkZWZpbmUgT1BUSU9OX1BUIChPUFRJT05fUEQgKyAxKQotI2RlZmluZSBPUFRJT05fU1RSQ01QQ1QgKE9QVElPTl9QVCArIDEpCi0jZGVmaW5lIE9QVElPTl9VTklYIChPUFRJT05fU1RSQ01QQ1QgKyAxKQotCi0gIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7Ci0gICAgeyJiYXNpcyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJhdXRvaW1wIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9BVVRPSU1QfSwKLSAgICB7ImJjb21wcmxkIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmNybGQiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiY3JvcjMxIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYkQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWERBVEF9LAotICAgIHsiYkUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0VYUE9SVH0sCi0gICAgeyJiZXJub3RvayIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJOT1RPS30sCi0gICAgeyJiZXJvayIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVJPS30sCi0gICAgeyJiZXJybXNnIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYmV4cG9ydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fRVhQT1JUfSwKLSAgICB7ImJmIiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9FUk5PVE9LfSwKLSAgICB7ImJnYyIsIG5vX2FyZ3VtZW50LCAmZ2MsIDF9LAotICAgIHsiYmgiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJiaGFsdCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSUdOT1JFfSwKLSAgICB7ImJJIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JTVBPUlR9LAotICAgIHsiYmltcG9ydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fSU1QT1JUfSwKLSAgICB7ImJsIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MT0FETUFQfSwKLSAgICB7ImJsb2FkbWFwIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9MT0FETUFQfSwKLSAgICB7ImJtYXhkYXRhIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIE9QVElPTl9NQVhEQVRBfSwKLSAgICB7ImJtYXhzdGFjayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTUFYU1RBQ0t9LAotICAgIHsiYk0iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01PRFRZUEV9LAotICAgIHsiYm1vZHR5cGUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01PRFRZUEV9LAotICAgIHsiYm5vYXV0b2ltcCIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9BVVRPSU1QfSwKLSAgICB7ImJub2RlbGNzZWN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9JR05PUkV9LAotICAgIHsiYm5vZW50cnkiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX0lHTk9SRX0sCi0gICAgeyJibm9nYyIsIG5vX2FyZ3VtZW50LCAmZ2MsIDB9LAotICAgIHsiYm5zbyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fTk9BVVRPSU1QfSwKLSAgICB7ImJub3N0cmNtcGN0Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9OT1NUUkNNUENUfSwKLSAgICB7ImJub3RleHRybyIsIG5vX2FyZ3VtZW50LCAmdGV4dHJvLCAwfSwKLSAgICB7ImJucm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMH0sCi0gICAgeyJicEQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1BEfSwKLSAgICB7ImJwVCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fUFR9LAotICAgIHsiYnJvIiwgbm9fYXJndW1lbnQsICZ0ZXh0cm8sIDF9LAotICAgIHsiYlMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgT1BUSU9OX01BWFNUQUNLfSwKLSAgICB7ImJzbyIsIG5vX2FyZ3VtZW50LCBOVUxMLCBPUFRJT05fQVVUT0lNUH0sCi0gICAgeyJic3RyY21wY3QiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX1NUUkNNUENUfSwKLSAgICB7ImJ0ZXh0cm8iLCBub19hcmd1bWVudCwgJnRleHRybywgMX0sCi0gICAgeyJzdGF0aWMiLCBub19hcmd1bWVudCwgTlVMTCwgT1BUSU9OX05PQVVUT0lNUH0sCi0gICAgeyJ1bml4Iiwgbm9fYXJndW1lbnQsIE5VTEwsIE9QVElPTl9VTklYfSwKLSAgICB7TlVMTCwgbm9fYXJndW1lbnQsIE5VTEwsIDB9Ci0gIH07Ci0KLSAgLyogT3B0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIEFJWCBsaW5rZXIgd2hpY2ggd2UgZG8gbm90IHN1cHBvcnQ6IC1mLAotICAgICAtUywgLXYsIC1aLCAtYmJpbmRjbWRzLCAtYmJpbmRlciwgLWJiaW5kb3B0cywgLWJjYWxscywgLWJjYXBzLAotICAgICAtYmNyb3IxNSwgLWJkZWJ1Z29wdCwgLWJkYmcsIC1iZGVsY3NlY3QsIC1iZXg/LCAtYmZpbGVsaXN0LCAtYmZsLAotICAgICAtYmdjYnlwYXNzLCAtYmdsaW5rLCAtYmluc2VydCwgLWJpLCAtYmxvYWRtYXAsIC1ibCwgLWJtYXAsIC1ibmwsCi0gICAgIC1ibm9iaW5kLCAtYm5vY29tcHJsZCwgLWJub2NybGQsIC1ibm9lcnJtc2csIC1ibm9nbGluaywKLSAgICAgLWJub2xvYWRtYXAsIC1ibmwsIC1ibm9vYmpyZW9yZGVyLCAtYm5vcXVpZXQsIC1ibm9yZW9yZGVyLAotICAgICAtYm5vdHlwY2hrLCAtYm5veCwgLWJxdWlldCwgLWJSLCAtYnJlbmFtZSwgLWJyZW9yZGVyLCAtYnR5cGNoaywKLSAgICAgLWJ4LCAtYlgsIC1ieHJlZi4gICovCi0KLSAgLyogSWYgdGhlIGN1cnJlbnQgb3B0aW9uIHN0YXJ0cyB3aXRoIC1iLCBjaGFuZ2UgdGhlIGZpcnN0IDogdG8gYW4gPS4KLSAgICAgVGhlIEFJWCBsaW5rZXIgdXNlcyA6IHRvIHNlcGFyYXRlIHRoZSBvcHRpb24gZnJvbSB0aGUgYXJndW1lbnQ7Ci0gICAgIGNoYW5naW5nIGl0IHRvID0gbGV0cyB1cyB0cmVhdCBpdCBhcyBhIGdldG9wdCBvcHRpb24uICAqLwotICBpbmR4ID0gb3B0aW5kOwotICBpZiAoaW5keCA9PSAwKQotICAgIGluZHggPSAxOwotICBpZiAoaW5keCA8IGFyZ2MgJiYgc3RybmNtcCAoYXJndltpbmR4XSwgIi1iIiwgMikgPT0gMCkKLSAgICB7Ci0gICAgICBjaGFyICpzOwotCi0gICAgICBmb3IgKHMgPSBhcmd2W2luZHhdOyAqcyAhPSAnXDAnOyBzKyspCi0JewotCSAgaWYgKCpzID09ICc6JykKLQkgICAgewotCSAgICAgICpzID0gJz0nOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBvcHRlcnIgPSAwOwotICBvcHRjID0gZ2V0b3B0X2xvbmdfb25seSAoYXJnYywgYXJndiwgIi1EOkg6S1Q6eiIsIGxvbmdvcHRzLCAmbG9uZ2luZCk7Ci0gIG9wdGVyciA9IHByZXZvcHRlcnI7Ci0KLSAgc3dpdGNoIChvcHRjKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgb3B0aW5kID0gcHJldm9wdGluZDsKLSAgICAgIHJldHVybiAwOwotCi0gICAgY2FzZSAwOgotICAgICAgLyogTG9uZyBvcHRpb24gd2hpY2gganVzdCBzZXRzIGEgZmxhZy4gICovCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgdmFsID0gc3RydG9sIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLUQgbnVtYmVyICVzXG4iKSwgb3B0YXJnKTsKLSAgICAgIGVsc2UgaWYgKHZhbCAhPSAtMSkKLQlsYW5nX3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIGV4cF9pbnRvcCAodmFsKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0gnOgotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcKLQkgIHx8ICh2YWwgJiAodmFsIC0gMSkpICE9IDApCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1IIG51bWJlciAlc1xuIiksIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JZmlsZV9hbGlnbiA9IHZhbDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnSyc6Ci0gICAgY2FzZSAneic6Ci0gICAgICAvKiBGSVhNRTogVGhpcyBzaG91bGQgdXNlIHRoZSBwYWdlIHNpemUgZm9yIHRoZSB0YXJnZXQgc3lzdGVtLiAgKi8KLSAgICAgIGZpbGVfYWxpZ24gPSA0MDk2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIC8qIE9uIEFJWCB0aGlzIGlzIHRoZSBzYW1lIGFzIEdOVSBsZCAtVHRleHQuICBXaGVuIHdlIHNlZSAtVAotICAgICAgICAgbnVtYmVyLCB3ZSBhc3N1bWUgdGhlIEFJWCBvcHRpb24gaXMgaW50ZW5kZWQuICBPdGhlcndpc2UsIHdlCi0gICAgICAgICBhc3N1bWUgdGhlIHVzdWFsIEdOVSBsZCAtVCBvcHRpb24gaXMgaW50ZW5kZWQuICBXZSBjYW4ndCBqdXN0Ci0gICAgICAgICBpZ25vcmUgdGhlIEFJWCBvcHRpb24sIGJlY2F1c2UgZ2NjIHBhc3NlcyBpdCB0byB0aGUgbGlua2VyLiAgKi8KLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCXsKLQkgIG9wdGluZCA9IHByZXZvcHRpbmQ7Ci0JICByZXR1cm4gMDsKLQl9Ci0gICAgICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIudGV4dCIsIGV4cF9pbnRvcCAodmFsKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0lHTk9SRToKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fQVVUT0lNUDoKLSAgICAgIGxpbmtfaW5mby5zdGF0aWNfbGluayA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FUk5PVE9LOgotICAgICAgZm9yY2VfbWFrZV9leGVjdXRhYmxlID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX0VST0s6Ci0gICAgICBmb3JjZV9tYWtlX2V4ZWN1dGFibGUgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9FWFBPUlQ6Ci0gICAgICBnbGRwcGNtYWNvc19yZWFkX2ZpbGUgKG9wdGFyZywgZmFsc2UpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9JTVBPUlQ6Ci0gICAgICB7Ci0Jc3RydWN0IGZpbGVsaXN0ICpuOwotCXN0cnVjdCBmaWxlbGlzdCAqKmZscHA7Ci0KLQluID0gKHN0cnVjdCBmaWxlbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbGlzdCkpOwotCW4tPm5leHQgPSBOVUxMOwotCW4tPm5hbWUgPSBvcHRhcmc7Ci0JZmxwcCA9ICZpbXBvcnRfZmlsZXM7Ci0Jd2hpbGUgKCpmbHBwICE9IE5VTEwpCi0JICBmbHBwID0gJigqZmxwcCktPm5leHQ7Ci0JKmZscHAgPSBuOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9MT0FETUFQOgotICAgICAgY29uZmlnLm1hcF9maWxlbmFtZSA9IG9wdGFyZzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fTUFYREFUQToKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtYm1heGRhdGEgbnVtYmVyICVzXG4iKSwKLQkgICAgICAgb3B0YXJnKTsKLSAgICAgIGVsc2UKLQltYXhkYXRhID0gdmFsOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9NQVhTVEFDSzoKLSAgICAgIHZhbCA9IHN0cnRvdWwgKG9wdGFyZywgJmVuZCwgMCk7Ci0gICAgICBpZiAoKmVuZCAhPSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCAtYm1heHN0YWNrIG51bWJlciAlc1xuIiksCi0JICAgICAgIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbWF4c3RhY2sgPSB2YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX01PRFRZUEU6Ci0gICAgICBpZiAoKm9wdGFyZyA9PSAnUycpCi0JewotCSAgbGlua19pbmZvLnNoYXJlZCA9IHRydWU7Ci0JICArK29wdGFyZzsKLQl9Ci0gICAgICBpZiAoKm9wdGFyZyA9PSAnXDAnIHx8IG9wdGFyZ1sxXSA9PSAnXDAnKQotCWVpbmZvIChfKCIlUDogd2FybmluZzogaWdub3JpbmcgaW52YWxpZCBtb2R1bGUgdHlwZSAlc1xuIiksIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JbW9kdHlwZSA9ICgqb3B0YXJnIDw8IDgpIHwgb3B0YXJnWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT0FVVE9JTVA6Ci0gICAgICBsaW5rX2luZm8uc3RhdGljX2xpbmsgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE9QVElPTl9OT1NUUkNNUENUOgotICAgICAgbGlua19pbmZvLnRyYWRpdGlvbmFsX2Zvcm1hdCA9IHRydWU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1BEOgotICAgICAgLyogVGhpcyBzZXRzIHRoZSBwYWdlIHRoYXQgdGhlIC5kYXRhIHNlY3Rpb24gaXMgc3VwcG9zZWQgdG8KLSAgICAgICAgIHN0YXJ0IG9uLiAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2Ugc2hvdWxkIHN0aWxsIGJlIHRoZQotICAgICAgICAgb2Zmc2V0IHdpdGhpbiB0aGUgZmlsZSwgc28gd2UgbmVlZCB0byBidWlsZCBhbiBhcHByb3ByaWF0ZQotICAgICAgICAgZXhwcmVzc2lvbi4gICovCi0gICAgICB2YWwgPSBzdHJ0b3VsIChvcHRhcmcsICZlbmQsIDApOwotICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQllaW5mbyAoXygiJVA6IHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgLXBEIG51bWJlciAlc1xuIiksIG9wdGFyZyk7Ci0gICAgICBlbHNlCi0JewotCSAgZXRyZWVfdHlwZSAqdDsKLQotCSAgdCA9IGV4cF9iaW5vcCAoJysnLAotCQkJIGV4cF9pbnRvcCAodmFsKSwKLQkJCSBleHBfYmlub3AgKCcmJywKLQkJCQkgICAgZXhwX25hbWVvcCAoTkFNRSwgIi4iKSwKLQkJCQkgICAgZXhwX2ludG9wICgweGZmZikpKTsKLQkgIHQgPSBleHBfYmlub3AgKCcmJywKLQkJCSBleHBfYmlub3AgKCcrJywgdCwgZXhwX2ludG9wICg3KSksCi0JCQkgZXhwX2ludG9wICh+IChiZmRfdm1hKSA3KSk7Ci0JICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIuZGF0YSIsIHQpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fUFQ6Ci0gICAgICAvKiBUaGlzIHNldCB0aGUgcGFnZSB0aGF0IHRoZSAudGV4dCBzZWN0aW9uIGlzIHN1cHBvc2VkIHRvIHN0YXJ0Ci0gICAgICAgICBvbi4gIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYWdlIHNob3VsZCBzdGlsbCBiZSB0aGUgb2Zmc2V0Ci0gICAgICAgICB3aXRoaW4gdGhlIGZpbGUuICAqLwotICAgICAgdmFsID0gc3RydG91bCAob3B0YXJnLCAmZW5kLCAwKTsKLSAgICAgIGlmICgqZW5kICE9ICdcMCcpCi0JZWluZm8gKF8oIiVQOiB3YXJuaW5nOiBpZ25vcmluZyBpbnZhbGlkIC1wVCBudW1iZXIgJXNcbiIpLCBvcHRhcmcpOwotICAgICAgZWxzZQotCXsKLQkgIGV0cmVlX3R5cGUgKnQ7Ci0KLQkgIHQgPSBleHBfYmlub3AgKCcrJywKLQkJCSBleHBfaW50b3AgKHZhbCksCi0JCQkgZXhwX25hbWVvcCAoU0laRU9GX0hFQURFUlMsIE5VTEwpKTsKLQkgIHQgPSBleHBfYmlub3AgKCcmJywKLQkJCSBleHBfYmlub3AgKCcrJywgdCwgZXhwX2ludG9wICg3KSksCi0JCQkgZXhwX2ludG9wICh+IChiZmRfdm1hKSA3KSk7Ci0JICBsYW5nX3NlY3Rpb25fc3RhcnQgKCIudGV4dCIsIHQpOwotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBPUFRJT05fU1RSQ01QQ1Q6Ci0gICAgICBsaW5rX2luZm8udHJhZGl0aW9uYWxfZm9ybWF0ID0gZmFsc2U7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgT1BUSU9OX1VOSVg6Ci0gICAgICB1bml4X2xkID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICByZXR1cm4gMTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBpbnB1dCBmaWxlIGNhbiBub3QgYmUgcmVjb2duaXplZCBhcyBhIEJGRAotICAgb2JqZWN0IG9yIGFuIGFyY2hpdmUuICBJZiB0aGUgZmlsZSBzdGFydHMgd2l0aCAjISwgd2UgbXVzdCB0cmVhdCBpdAotICAgYXMgYW4gaW1wb3J0IGZpbGUuICBUaGlzIGlzIGZvciBBSVggY29tcGF0aWJpbGl0eS4gICovCi0KLXN0YXRpYyBib29sZWFuCi1nbGRwcGNtYWNvc191bnJlY29nbml6ZWRfZmlsZSAoZW50cnkpCi0gICAgIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmVudHJ5OwotewotICBGSUxFICplOwotICBib29sZWFuIHJldDsKLQotICBlID0gZm9wZW4gKGVudHJ5LT5maWxlbmFtZSwgRk9QRU5fUlQpOwotICBpZiAoZSA9PSBOVUxMKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXQgPSBmYWxzZTsKLQotICBpZiAoZ2V0YyAoZSkgPT0gJyMnICYmIGdldGMgKGUpID09ICchJykKLSAgICB7Ci0gICAgICBzdHJ1Y3QgZmlsZWxpc3QgKm47Ci0gICAgICBzdHJ1Y3QgZmlsZWxpc3QgKipmbHBwOwotCi0gICAgICBuID0gKHN0cnVjdCBmaWxlbGlzdCAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBmaWxlbGlzdCkpOwotICAgICAgbi0+bmV4dCA9IE5VTEw7Ci0gICAgICBuLT5uYW1lID0gZW50cnktPmZpbGVuYW1lOwotICAgICAgZmxwcCA9ICZpbXBvcnRfZmlsZXM7Ci0gICAgICB3aGlsZSAoKmZscHAgIT0gTlVMTCkKLQlmbHBwID0gJigqZmxwcCktPm5leHQ7Ci0gICAgICAqZmxwcCA9IG47Ci0KLSAgICAgIHJldCA9IHRydWU7Ci0gICAgICBlbnRyeS0+bG9hZGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgZmNsb3NlIChlKTsKLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgaW5wdXQgZmlsZXMgaGF2ZSBiZWVuIG9wZW5lZC4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19hZnRlcl9vcGVuICgpCi17Ci0gIGJvb2xlYW4gcjsKLSAgc3RydWN0IHNldF9pbmZvICpwOwotCi0gIC8qIENhbGwgbGRjdG9yX2J1aWxkX3NldHMsIGFmdGVyIHByZXRlbmRpbmcgdGhhdCB0aGlzIGlzIGEKLSAgICAgcmVsb2NhdGVhYmxlIGxpbmsuICBXZSBkbyB0aGlzIGJlY2F1c2UgQUlYIHJlcXVpcmVzIHJlbG9jYXRpb24KLSAgICAgZW50cmllcyBmb3IgYWxsIHJlZmVyZW5jZXMgdG8gc3ltYm9scywgZXZlbiBpbiBhIGZpbmFsCi0gICAgIGV4ZWN1dGFibGUuICBPZiBjb3Vyc2UsIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIGlmIHdlIGFyZQotICAgICBwcm9kdWNpbmcgYW4gWENPRkYgb3V0cHV0IGZpbGUuICAqLwotICByID0gbGlua19pbmZvLnJlbG9jYXRlYWJsZTsKLSAgaWYgKHN0cnN0ciAoYmZkX2dldF90YXJnZXQgKG91dHB1dF9iZmQpLCAieGNvZmYiKSAhPSBOVUxMKQotICAgIGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPSB0cnVlOwotICBsZGN0b3JfYnVpbGRfc2V0cyAoKTsKLSAgbGlua19pbmZvLnJlbG9jYXRlYWJsZSA9IHI7Ci0KLSAgLyogRm9yIGVhY2ggc2V0LCByZWNvcmQgdGhlIHNpemUsIHNvIHRoYXQgdGhlIFhDT0ZGIGJhY2tlbmQgY2FuCi0gICAgIG91dHB1dCB0aGUgY29ycmVjdCBjc2VjdCBsZW5ndGguICAqLwotICBmb3IgKHAgPSBzZXRzOyBwICE9IChzdHJ1Y3Qgc2V0X2luZm8gKikgTlVMTDsgcCA9IHAtPm5leHQpCi0gICAgewotICAgICAgYmZkX3NpemVfdHlwZSBzaXplOwotCi0gICAgICAvKiBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQsIHdlIG1heSBoYXZlIGJlZW4gaW52b2tlZCBmcm9tCi0JIGNvbGxlY3QsIGFuZCB0aGUgc2V0cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYnVpbHQsIHNvIHdlIGRvCi0JIG5vdCBkbyBhbnl0aGluZy4gICovCi0gICAgICBpZiAocC0+aC0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQKLQkgIHx8IHAtPmgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9kZWZ3ZWFrKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAocC0+cmVsb2MgIT0gQkZEX1JFTE9DX0NUT1IpCi0JewotCSAgLyogSGFuZGxlIHRoaXMgaWYgd2UgbmVlZCB0by4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIHNpemUgPSAocC0+Y291bnQgKyAyKSAqIDQ7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfbGlua19yZWNvcmRfc2V0IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBwLT5oLCBzaXplKSkKLQllaW5mbyAoXygiJUYlUDogYmZkX3hjb2ZmX2xpbmtfcmVjb3JkX3NldCBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc2VjdGlvbnMgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dAotICAgc2VjdGlvbnMsIGJ1dCBiZWZvcmUgYW55IHNpemVzIG9yIGFkZHJlc3NlcyBoYXZlIGJlZW4gc2V0LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2JlZm9yZV9hbGxvY2F0aW9uICgpCi17Ci0gIHN0cnVjdCBmaWxlbGlzdCAqZmw7Ci0gIHN0cnVjdCBleHBvcnRfc3ltYm9sX2xpc3QgKmVsOwotICBjaGFyICpsaWJwYXRoOwotICBhc2VjdGlvbiAqc3BlY2lhbF9zZWN0aW9uc1s2XTsKLSAgaW50IGk7Ci0KLSAgLyogSGFuZGxlIHRoZSBpbXBvcnQgYW5kIGV4cG9ydCBmaWxlcywgaWYgYW55LiAgKi8KLSAgZm9yIChmbCA9IGltcG9ydF9maWxlczsgZmwgIT0gTlVMTDsgZmwgPSBmbC0+bmV4dCkKLSAgICBnbGRwcGNtYWNvc19yZWFkX2ZpbGUgKGZsLT5uYW1lLCB0cnVlKTsKLSAgZm9yIChlbCA9IGV4cG9ydF9zeW1ib2xzOyBlbCAhPSBOVUxMOyBlbCA9IGVsLT5uZXh0KQotICAgIHsKLSAgICAgIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpoOwotCi0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBlbC0+bmFtZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWVpbmZvIChfKCIlUCVGOiBiZmRfbGlua19oYXNoX2xvb2t1cCBvZiBleHBvcnQgc3ltYm9sIGZhaWxlZDogJUVcbiIpKTsKLSAgICAgIGlmICghIGJmZF94Y29mZl9leHBvcnRfc3ltYm9sIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBoLCBlbC0+c3lzY2FsbCkpCi0JZWluZm8gKF8oIiVQJUY6IGJmZF94Y29mZl9leHBvcnRfc3ltYm9sIGZhaWxlZDogJUVcbiIpKTsKLSAgICB9Ci0KLSAgLyogVHJhY2sgZG93biBhbGwgcmVsb2NhdGlvbnMgY2FsbGVkIGZvciBieSB0aGUgbGlua2VyIHNjcmlwdCAodGhlc2UKLSAgICAgYXJlIHR5cGljYWxseSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGVudHJpZXMgY3JlYXRlZCBieQotICAgICBDT05TVFJVQ1RPUlMpIGFuZCBsZXQgdGhlIGJhY2tlbmQga25vdyBpdCB3aWxsIG5lZWQgdG8gY3JlYXRlCi0gICAgIC5sb2FkZXIgcmVsb2NzIGZvciB0aGVtLiAgKi8KLSAgbGFuZ19mb3JfZWFjaF9zdGF0ZW1lbnQgKGdsZHBwY21hY29zX2ZpbmRfcmVsb2NzKTsKLQotICAvKiBXZSBuZWVkIHRvIGJ1aWxkIExJQlBBVEggZnJvbSB0aGUgLUwgYXJndW1lbnRzLiAgSWYgYW55IC1ycGF0aAotICAgICBhcmd1bWVudHMgd2VyZSB1c2VkLCB0aG91Z2gsIHdlIHVzZSAtcnBhdGggaW5zdGVhZCwgYXMgYSBHTlUKLSAgICAgZXh0ZW5zaW9uLiAgKi8KLSAgaWYgKGNvbW1hbmRfbGluZS5ycGF0aCAhPSBOVUxMKQotICAgIGxpYnBhdGggPSBjb21tYW5kX2xpbmUucnBhdGg7Ci0gIGVsc2UgaWYgKHNlYXJjaF9oZWFkID09IE5VTEwpCi0gICAgbGlicGF0aCA9IChjaGFyICopICIiOwotICBlbHNlCi0gICAgewotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIHNlYXJjaF9kaXJzX3R5cGUgKnNlYXJjaDsKLQotICAgICAgbGVuID0gc3RybGVuIChzZWFyY2hfaGVhZC0+bmFtZSk7Ci0gICAgICBsaWJwYXRoID0geG1hbGxvYyAobGVuICsgMSk7Ci0gICAgICBzdHJjcHkgKGxpYnBhdGgsIHNlYXJjaF9oZWFkLT5uYW1lKTsKLSAgICAgIGZvciAoc2VhcmNoID0gc2VhcmNoX2hlYWQtPm5leHQ7IHNlYXJjaCAhPSBOVUxMOyBzZWFyY2ggPSBzZWFyY2gtPm5leHQpCi0JewotCSAgc2l6ZV90IG5sZW47Ci0KLQkgIG5sZW4gPSBzdHJsZW4gKHNlYXJjaC0+bmFtZSk7Ci0JICBsaWJwYXRoID0geHJlYWxsb2MgKGxpYnBhdGgsIGxlbiArIG5sZW4gKyAyKTsKLQkgIGxpYnBhdGhbbGVuXSA9ICc6JzsKLQkgIHN0cmNweSAobGlicGF0aCArIGxlbiArIDEsIHNlYXJjaC0+bmFtZSk7Ci0JICBsZW4gKz0gbmxlbiArIDE7Ci0JfQotICAgIH0KLQotICAvKiBMZXQgdGhlIFhDT0ZGIGJhY2tlbmQgc2V0IHVwIHRoZSAubG9hZGVyIHNlY3Rpb24uICAqLwotICBpZiAoISBiZmRfeGNvZmZfc2l6ZV9keW5hbWljX3NlY3Rpb25zIChvdXRwdXRfYmZkLCAmbGlua19pbmZvLCBsaWJwYXRoLAotCQkJCQkgZW50cnlfc3ltYm9sLCBmaWxlX2FsaWduLAotCQkJCQkgbWF4c3RhY2ssIG1heGRhdGEsCi0JCQkJCSBnYyAmJiAhIHVuaXhfbGQgPyB0cnVlIDogZmFsc2UsCi0JCQkJCSBtb2R0eXBlLAotCQkJCQkgdGV4dHJvID8gdHJ1ZSA6IGZhbHNlLAotCQkJCQkgdW5peF9sZCwKLQkJCQkJIHNwZWNpYWxfc2VjdGlvbnMpKQotICAgIGVpbmZvIChfKCIlUCVGOiBmYWlsZWQgdG8gc2V0IGR5bmFtaWMgc2VjdGlvbiBzaXplczogJUVcbiIpKTsKLQotICAvKiBMb29rIHRocm91Z2ggdGhlIHNwZWNpYWwgc2VjdGlvbnMsIGFuZCBwdXQgdGhlbSBpbiB0aGUgcmlnaHQKLSAgICAgcGxhY2UgaW4gdGhlIGxpbmsgb3JkZXJpbmcuICBUaGlzIGlzIGVzcGVjaWFsbHkgbWFnaWMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgICBsYW5nX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudF90eXBlICpvczsKLSAgICAgIGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKipwbHM7Ci0gICAgICBsYW5nX2lucHV0X3NlY3Rpb25fdHlwZSAqaXM7Ci0gICAgICBjb25zdCBjaGFyICpvbmFtZTsKLSAgICAgIGJvb2xlYW4gc3RhcnQ7Ci0KLSAgICAgIHNlYyA9IHNwZWNpYWxfc2VjdGlvbnNbaV07Ci0gICAgICBpZiAoc2VjID09IE5VTEwpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFJlbW92ZSB0aGlzIHNlY3Rpb24gZnJvbSB0aGUgbGlzdCBvZiB0aGUgb3V0cHV0IHNlY3Rpb24uCi0gICAgICAgICBUaGlzIGFzc3VtZXMgd2Uga25vdyB3aGF0IHRoZSBzY3JpcHQgbG9va3MgbGlrZS4gICovCi0gICAgICBpcyA9IE5VTEw7Ci0gICAgICBvcyA9IGxhbmdfb3V0cHV0X3NlY3Rpb25fZmluZCAoc2VjLT5vdXRwdXRfc2VjdGlvbi0+bmFtZSk7Ci0gICAgICBpZiAob3MgPT0gTlVMTCkKLQllaW5mbyAoXygiJVAlRjogY2FuJ3QgZmluZCBvdXRwdXQgc2VjdGlvbiAlc1xuIiksCi0JICAgICAgIHNlYy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUpOwotICAgICAgZm9yIChwbHMgPSAmb3MtPmNoaWxkcmVuLmhlYWQ7ICpwbHMgIT0gTlVMTDsgcGxzID0gJigqcGxzKS0+bmV4dCkKLQl7Ci0JICBpZiAoKCpwbHMpLT5oZWFkZXIudHlwZSA9PSBsYW5nX2lucHV0X3NlY3Rpb25fZW51bQotCSAgICAgICYmICgqcGxzKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uID09IHNlYykKLQkgICAgewotCSAgICAgIGlzID0gKGxhbmdfaW5wdXRfc2VjdGlvbl90eXBlICopICpwbHM7Ci0JICAgICAgKnBscyA9ICgqcGxzKS0+bmV4dDsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgaWYgKCgqcGxzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ193aWxkX3N0YXRlbWVudF9lbnVtKQotCSAgICB7Ci0JICAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKnB3bHM7Ci0KLQkgICAgICBmb3IgKHB3bHMgPSAmKCpwbHMpLT53aWxkX3N0YXRlbWVudC5jaGlsZHJlbi5oZWFkOwotCQkgICAqcHdscyAhPSBOVUxMOwotCQkgICBwd2xzID0gJigqcHdscyktPm5leHQpCi0JCXsKLQkJICBpZiAoKCpwd2xzKS0+aGVhZGVyLnR5cGUgPT0gbGFuZ19pbnB1dF9zZWN0aW9uX2VudW0KLQkJICAgICAgJiYgKCpwd2xzKS0+aW5wdXRfc2VjdGlvbi5zZWN0aW9uID09IHNlYykKLQkJICAgIHsKLQkJICAgICAgaXMgPSAobGFuZ19pbnB1dF9zZWN0aW9uX3R5cGUgKikgKnB3bHM7Ci0JCSAgICAgICpwd2xzID0gKCpwd2xzKS0+bmV4dDsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBpZiAoaXMgIT0gTlVMTCkKLQkJYnJlYWs7Ci0JICAgIH0KLQl9CQotCi0gICAgICBpZiAoaXMgPT0gTlVMTCkKLQllaW5mbyAoXygiJVAlRjogY2FuJ3QgZmluZCAlcyBpbiBvdXRwdXQgc2VjdGlvblxuIiksCi0JICAgICAgIGJmZF9nZXRfc2VjdGlvbl9uYW1lIChzZWMtPm93bmVyLCBzZWMpKTsKLQotICAgICAgLyogTm93IGZpZ3VyZSBvdXQgd2hlcmUgdGhlIHNlY3Rpb24gc2hvdWxkIGdvLiAgKi8KLSAgICAgIHN3aXRjaCAoaSkKLQl7Ci0JZGVmYXVsdDogLyogdG8gYXZvaWQgd2FybmluZ3MgKi8KLQljYXNlIDA6Ci0JICAvKiBfdGV4dCAqLwotCSAgb25hbWUgPSAiLnRleHQiOwotCSAgc3RhcnQgPSB0cnVlOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgLyogX2V0ZXh0ICovCi0JICBvbmFtZSA9ICIudGV4dCI7Ci0JICBzdGFydCA9IGZhbHNlOwotCSAgYnJlYWs7Ci0JY2FzZSAyOgotCSAgLyogX2RhdGEgKi8KLQkgIG9uYW1lID0gIi5kYXRhIjsKLQkgIHN0YXJ0ID0gdHJ1ZTsKLQkgIGJyZWFrOwotCWNhc2UgMzoKLQkgIC8qIF9lZGF0YSAqLwotCSAgb25hbWUgPSAiLmRhdGEiOwotCSAgc3RhcnQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JICAvKiBfZW5kIGFuZCBlbmQgKi8KLQkgIG9uYW1lID0gIi5ic3MiOwotCSAgc3RhcnQgPSBmYWxzZTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgb3MgPSBsYW5nX291dHB1dF9zZWN0aW9uX2ZpbmQgKG9uYW1lKTsKLQotICAgICAgaWYgKHN0YXJ0KQotCXsKLQkgIGlzLT5oZWFkZXIubmV4dCA9IG9zLT5jaGlsZHJlbi5oZWFkOwotCSAgb3MtPmNoaWxkcmVuLmhlYWQgPSAobGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqKSBpczsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaXMtPmhlYWRlci5uZXh0ID0gTlVMTDsKLQkgIGxhbmdfc3RhdGVtZW50X2FwcGVuZCAoJm9zLT5jaGlsZHJlbiwKLQkJCQkgKGxhbmdfc3RhdGVtZW50X3VuaW9uX3R5cGUgKikgaXMsCi0JCQkJICZpcy0+aGVhZGVyLm5leHQpOwotCX0KLSAgICB9Ci19Ci0KLS8qIFJlYWQgYW4gaW1wb3J0IG9yIGV4cG9ydCBmaWxlLiAgRm9yIGFuIGltcG9ydCBmaWxlLCB0aGlzIGlzIGNhbGxlZAotICAgYnkgdGhlIGJlZm9yZV9hbGxvY2F0aW9uIGVtdWxhdGlvbiByb3V0aW5lLiAgRm9yIGFuIGV4cG9ydCBmaWxlLAotICAgdGhpcyBpcyBjYWxsZWQgYnkgdGhlIHBhcnNlX2FyZ3MgZW11bGF0aW9uIHJvdXRpbmUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfcmVhZF9maWxlIChmaWxlbmFtZSwgaW1wb3J0KQotICAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKLSAgICAgYm9vbGVhbiBpbXBvcnQ7Ci17Ci0gIHN0cnVjdCBvYnN0YWNrICpvOwotICBGSUxFICpmOwotICBpbnQgbGluZW5vOwotICBpbnQgYzsKLSAgYm9vbGVhbiBrZWVwOwotICBjb25zdCBjaGFyICppbXBwYXRoOwotICBjb25zdCBjaGFyICppbXBmaWxlOwotICBjb25zdCBjaGFyICppbXBtZW1iZXI7Ci0KLSAgbyA9IChzdHJ1Y3Qgb2JzdGFjayAqKSB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBvYnN0YWNrKSk7Ci0gIG9ic3RhY2tfc3BlY2lmeV9hbGxvY2F0aW9uIChvLCAwLCAwLCB4bWFsbG9jLCBnbGRwcGNtYWNvc19mcmVlKTsKLQotICBmID0gZm9wZW4gKGZpbGVuYW1lLCBGT1BFTl9SVCk7Ci0gIGlmIChmID09IE5VTEwpCi0gICAgewotICAgICAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX3N5c3RlbV9jYWxsKTsKLSAgICAgIGVpbmZvICgiJUYlczogJUVcbiIsIGZpbGVuYW1lKTsKLSAgICB9Ci0KLSAga2VlcCA9IGZhbHNlOwotCi0gIGltcHBhdGggPSBOVUxMOwotICBpbXBmaWxlID0gTlVMTDsKLSAgaW1wbWVtYmVyID0gTlVMTDsKLQotICBsaW5lbm8gPSAwOwotICB3aGlsZSAoKGMgPSBnZXRjIChmKSkgIT0gRU9GKQotICAgIHsKLSAgICAgIGNoYXIgKnM7Ci0gICAgICBjaGFyICpzeW1uYW1lOwotICAgICAgYm9vbGVhbiBzeXNjYWxsOwotICAgICAgYmZkX3ZtYSBhZGRyZXNzOwotICAgICAgc3RydWN0IGJmZF9saW5rX2hhc2hfZW50cnkgKmg7Ci0KLSAgICAgIGlmIChjICE9ICdcbicpCi0JewotCSAgb2JzdGFja18xZ3JvdyAobywgYyk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIG9ic3RhY2tfMWdyb3cgKG8sICdcMCcpOwotICAgICAgKytsaW5lbm87Ci0KLSAgICAgIHMgPSAoY2hhciAqKSBvYnN0YWNrX2Jhc2UgKG8pOwotICAgICAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JKytzOwotICAgICAgaWYgKCpzID09ICdcMCcKLQkgIHx8ICpzID09ICcqJwotCSAgfHwgKCpzID09ICcjJyAmJiBzWzFdID09ICcgJykKLQkgIHx8ICghIGltcG9ydCAmJiAqcyA9PSAnIycgJiYgc1sxXSA9PSAnIScpKQotCXsKLQkgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmICgqcyA9PSAnIycgJiYgc1sxXSA9PSAnIScpCi0JewotCSAgcyArPSAyOwotCSAgd2hpbGUgKGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykpCi0JICAgICsrczsKLQkgIGlmICgqcyA9PSAnXDAnKQotCSAgICB7Ci0JICAgICAgaW1wcGF0aCA9IE5VTEw7Ci0JICAgICAgaW1wZmlsZSA9IE5VTEw7Ci0JICAgICAgaW1wbWVtYmVyID0gTlVMTDsKLQkgICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotCSAgICB9Ci0JICBlbHNlIGlmICgqcyA9PSAnKCcpCi0JICAgIGVpbmZvIChfKCIlRiVzJWQ6ICMhIChbbWVtYmVyXSkgaXMgbm90IHN1cHBvcnRlZCBpbiBpbXBvcnQgZmlsZXNcbiIpLAotCQkgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgY3M7Ci0JICAgICAgY2hhciAqZmlsZTsKLQotCSAgICAgICh2b2lkKSBvYnN0YWNrX2ZpbmlzaCAobyk7Ci0JICAgICAga2VlcCA9IHRydWU7Ci0JICAgICAgaW1wcGF0aCA9IHM7Ci0JICAgICAgZmlsZSA9IE5VTEw7Ci0JICAgICAgd2hpbGUgKCEgaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpICpzKSAmJiAqcyAhPSAnKCcgJiYgKnMgIT0gJ1wwJykKLQkJewotCQkgIGlmICgqcyA9PSAnLycpCi0JCSAgICBmaWxlID0gcyArIDE7Ci0JCSAgKytzOwotCQl9Ci0JICAgICAgaWYgKGZpbGUgIT0gTlVMTCkKLQkJewotCQkgIGZpbGVbLTFdID0gJ1wwJzsKLQkJICBpbXBmaWxlID0gZmlsZTsKLQkJICBpZiAoaW1wcGF0aCA9PSBmaWxlIC0gMSkKLQkJICAgIGltcHBhdGggPSAiLyI7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbXBmaWxlID0gaW1wcGF0aDsKLQkJICBpbXBwYXRoID0gIiI7Ci0JCX0KLQkgICAgICBjcyA9ICpzOwotCSAgICAgICpzID0gJ1wwJzsKLQkgICAgICB3aGlsZSAoaXNzcGFjZSAoKHVuc2lnbmVkIGNoYXIpIGNzKSkKLQkJewotCQkgICsrczsKLQkJICBjcyA9ICpzOwotCQl9Ci0JICAgICAgaWYgKGNzICE9ICcoJykKLQkJewotCQkgIGltcG1lbWJlciA9ICIiOwotCQkgIGlmIChjcyAhPSAnXDAnKQotCQkgICAgZWluZm8gKF8oIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0IGZpbGVcbiIpLAotCQkJICAgZmlsZW5hbWUsIGxpbmVubyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICArK3M7Ci0JCSAgaW1wbWVtYmVyID0gczsKLQkJICB3aGlsZSAoKnMgIT0gJyknICYmICpzICE9ICdcMCcpCi0JCSAgICArK3M7Ci0JCSAgaWYgKCpzID09ICcpJykKLQkJICAgICpzID0gJ1wwJzsKLQkJICBlbHNlCi0JCSAgICBlaW5mbyAoXygiJXM6JWQ6IHdhcm5pbmc6IHN5bnRheCBlcnJvciBpbiBpbXBvcnQgZmlsZVxuIiksCi0JCQkgICBmaWxlbmFtZSwgbGluZW5vKTsKLQkJfQotCSAgICB9Ci0KLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgLyogVGhpcyBpcyBhIHN5bWJvbCB0byBiZSBpbXBvcnRlZCBvciBleHBvcnRlZC4gICovCi0gICAgICBzeW1uYW1lID0gczsKLSAgICAgIHN5c2NhbGwgPSBmYWxzZTsKLSAgICAgIGFkZHJlc3MgPSAoYmZkX3ZtYSkgLTE7Ci0KLSAgICAgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqcykgJiYgKnMgIT0gJ1wwJykKLQkrK3M7Ci0gICAgICBpZiAoKnMgIT0gJ1wwJykKLQl7Ci0JICBjaGFyICpzZTsKLQotCSAgKnMrKyA9ICdcMCc7Ci0KLQkgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnMpKQotCSAgICArK3M7Ci0KLQkgIHNlID0gczsKLQkgIHdoaWxlICghIGlzc3BhY2UgKCh1bnNpZ25lZCBjaGFyKSAqc2UpICYmICpzZSAhPSAnXDAnKQotCSAgICArK3NlOwotCSAgaWYgKCpzZSAhPSAnXDAnKQotCSAgICB7Ci0JICAgICAgKnNlKysgPSAnXDAnOwotCSAgICAgIHdoaWxlIChpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKnNlKSkKLQkJKytzZTsKLQkgICAgICBpZiAoKnNlICE9ICdcMCcpCi0JCWVpbmZvIChfKCIlcyVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0L2V4cG9ydCBmaWxlXG4iKSwKLQkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0KLQkgIGlmIChzdHJjYXNlY21wIChzLCAic3ZjIikgPT0gMAotCSAgICAgIHx8IHN0cmNhc2VjbXAgKHMsICJzeXNjYWxsIikgPT0gMCkKLQkgICAgc3lzY2FsbCA9IHRydWU7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBjaGFyICplbmQ7Ci0KLQkgICAgICBhZGRyZXNzID0gc3RydG91bCAocywgJmVuZCwgMCk7Ci0JICAgICAgaWYgKCplbmQgIT0gJ1wwJykKLQkJZWluZm8gKF8oIiVzOiVkOiB3YXJuaW5nOiBzeW50YXggZXJyb3IgaW4gaW1wb3J0L2V4cG9ydCBmaWxlXG4iKSwKLQkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8pOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAoISBpbXBvcnQpCi0JewotCSAgc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCAqbjsKLQotCSAgbGRsYW5nX2FkZF91bmRlZiAoc3ltbmFtZSk7Ci0JICBuID0gKChzdHJ1Y3QgZXhwb3J0X3N5bWJvbF9saXN0ICopCi0JICAgICAgIHhtYWxsb2MgKHNpemVvZiAoc3RydWN0IGV4cG9ydF9zeW1ib2xfbGlzdCkpKTsKLQkgIG4tPm5leHQgPSBleHBvcnRfc3ltYm9sczsKLQkgIG4tPm5hbWUgPSBidXlzdHJpbmcgKHN5bW5hbWUpOwotCSAgbi0+c3lzY2FsbCA9IHN5c2NhbGw7Ci0JICBleHBvcnRfc3ltYm9scyA9IG47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGggPSBiZmRfbGlua19oYXNoX2xvb2t1cCAobGlua19pbmZvLmhhc2gsIHN5bW5hbWUsIGZhbHNlLCBmYWxzZSwKLQkJCQkgICAgdHJ1ZSk7Ci0JICBpZiAoaCA9PSBOVUxMIHx8IGgtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF9uZXcpCi0JICAgIHsKLQkgICAgICAvKiBXZSBjYW4ganVzdCBpZ25vcmUgYXR0ZW1wdHMgdG8gaW1wb3J0IGFuIHVucmVmZXJlbmNlZAotCQkgc3ltYm9sLiAgKi8KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCEgYmZkX3hjb2ZmX2ltcG9ydF9zeW1ib2wgKG91dHB1dF9iZmQsICZsaW5rX2luZm8sIGgsCi0JCQkJCSAgICAgYWRkcmVzcywgaW1wcGF0aCwgaW1wZmlsZSwKLQkJCQkJICAgICBpbXBtZW1iZXIpKQotCQllaW5mbyAoXygiJVglczolZDogZmFpbGVkIHRvIGltcG9ydCBzeW1ib2wgJXM6ICVFXG4iKSwKLQkJICAgICAgIGZpbGVuYW1lLCBsaW5lbm8sIHN5bW5hbWUpOwotCSAgICB9Ci0JfQotCi0gICAgICBvYnN0YWNrX2ZyZWUgKG8sIG9ic3RhY2tfYmFzZSAobykpOwotICAgIH0KLQotICBpZiAob2JzdGFja19vYmplY3Rfc2l6ZSAobykgPiAwKQotICAgIHsKLSAgICAgIGVpbmZvIChfKCIlczolZDogd2FybmluZzogaWdub3JpbmcgdW50ZXJtaW5hdGVkIGxhc3QgbGluZVxuIiksCi0JICAgICBmaWxlbmFtZSwgbGluZW5vKTsKLSAgICAgIG9ic3RhY2tfZnJlZSAobywgb2JzdGFja19iYXNlIChvKSk7Ci0gICAgfQotCi0gIGlmICghIGtlZXApCi0gICAgewotICAgICAgb2JzdGFja19mcmVlIChvLCBOVUxMKTsKLSAgICAgIGZyZWUgKG8pOwotICAgIH0KLX0KLQotLyogVGhpcyByb3V0aW5lIHNhdmVzIHVzIGZyb20gd29ycnlpbmcgYWJvdXQgZGVjbGFyaW5nIGZyZWUuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkcHBjbWFjb3NfZnJlZSAocCkKLSAgICAgUFRSIHA7Ci17Ci0gIGZyZWUgKHApOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgYmVmb3JlX2FsbG9jYXRpb24gcm91dGluZSB2aWEKLSAgIGxhbmdfZm9yX2VhY2hfc3RhdGVtZW50LiAgSXQgbG9va3MgZm9yIHJlbG9jYXRpb25zIGFuZCBhc3NpZ25tZW50cwotICAgdG8gc3ltYm9scy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRwcGNtYWNvc19maW5kX3JlbG9jcyAocykKLSAgICAgbGFuZ19zdGF0ZW1lbnRfdW5pb25fdHlwZSAqczsKLXsKLSAgaWYgKHMtPmhlYWRlci50eXBlID09IGxhbmdfcmVsb2Nfc3RhdGVtZW50X2VudW0pCi0gICAgewotICAgICAgbGFuZ19yZWxvY19zdGF0ZW1lbnRfdHlwZSAqcnM7Ci0KLSAgICAgIHJzID0gJnMtPnJlbG9jX3N0YXRlbWVudDsKLSAgICAgIGlmIChycy0+bmFtZSA9PSBOVUxMKQotCWVpbmZvIChfKCIlRiVQOiBvbmx5IHJlbG9jYXRpb25zIGFnYWluc3Qgc3ltYm9scyBhcmUgcGVybWl0dGVkXG4iKSk7Ci0gICAgICBpZiAoISBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyAob3V0cHV0X2JmZCwgJmxpbmtfaW5mbywgcnMtPm5hbWUpKQotCWVpbmZvIChfKCIlRiVQOiBiZmRfeGNvZmZfbGlua19jb3VudF9yZWxvYyBmYWlsZWQ6ICVFXG4iKSk7Ci0gICAgfQotCi0gIGlmIChzLT5oZWFkZXIudHlwZSA9PSBsYW5nX2Fzc2lnbm1lbnRfc3RhdGVtZW50X2VudW0pCi0gICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAocy0+YXNzaWdubWVudF9zdGF0ZW1lbnQuZXhwKTsKLX0KLQotLyogTG9vayB0aHJvdWdoIGFuIGV4cHJlc3Npb24gZm9yIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50LiAgKi8KLQotc3RhdGljIHZvaWQKLWdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cCkKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqaDsKLQotICBzd2l0Y2ggKGV4cC0+dHlwZS5ub2RlX2NsYXNzKQotICAgIHsKLSAgICBjYXNlIGV0cmVlX3Byb3ZpZGU6Ci0gICAgICBoID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGxpbmtfaW5mby5oYXNoLCBleHAtPmFzc2lnbi5kc3QsCi0JCQkJZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICBpZiAoaCA9PSBOVUxMKQotCWJyZWFrOwotICAgICAgLyogRmFsbCB0aHJvdWdoLiAgKi8KLSAgICBjYXNlIGV0cmVlX2Fzc2lnbjoKLSAgICAgIGlmIChzdHJjbXAgKGV4cC0+YXNzaWduLmRzdCwgIi4iKSAhPSAwKQotCXsKLQkgIGlmICghIGJmZF94Y29mZl9yZWNvcmRfbGlua19hc3NpZ25tZW50IChvdXRwdXRfYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICBleHAtPmFzc2lnbi5kc3QpKQotCSAgICBlaW5mbyAoXygiJVAlRjogZmFpbGVkIHRvIHJlY29yZCBhc3NpZ25tZW50IHRvICVzOiAlRVxuIiksCi0JCSAgIGV4cC0+YXNzaWduLmRzdCk7Ci0JfQotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5hc3NpZ24uc3JjKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV9iaW5hcnk6Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPmJpbmFyeS5saHMpOwotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT5iaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV90cmluYXJ5OgotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5LmNvbmQpOwotICAgICAgZ2xkcHBjbWFjb3NfZmluZF9leHBfYXNzaWdubWVudCAoZXhwLT50cmluYXJ5Lmxocyk7Ci0gICAgICBnbGRwcGNtYWNvc19maW5kX2V4cF9hc3NpZ25tZW50IChleHAtPnRyaW5hcnkucmhzKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBldHJlZV91bmFyeToKLSAgICAgIGdsZHBwY21hY29zX2ZpbmRfZXhwX2Fzc2lnbm1lbnQgKGV4cC0+dW5hcnkuY2hpbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGRwcGNtYWNvc19nZXRfc2NyaXB0KGlzZmlsZSkKLSAgICAgaW50ICppc2ZpbGU7Ci17CQkJICAgICAKLSAgKmlzZmlsZSA9IDA7Ci0KLSAgaWYgKGxpbmtfaW5mby5yZWxvY2F0ZWFibGUgPT0gdHJ1ZSAmJiBjb25maWcuYnVpbGRfY29uc3RydWN0b3JzID09IHRydWUpCi0gICAgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcInhjb2ZmLXBvd2VybWFjXCIpXG5cCi1PVVRQVVRfQVJDSChwb3dlcnBjKVxuXAotRU5UUlkoX19zdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCi0gIC50ZXh0IDAgOiB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5wcilcblwKLSAgICAqKC5ybylcblwKLSAgICAqKC5kYilcblwKLSAgICAqKC5nbClcblwKLSAgICAqKC54bylcblwKLSAgICAqKC50aSlcblwKLSAgICAqKC50YilcblwKLSAgfVxuXAotICAuZGF0YSAwIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgKigucncpXG5cCi0gICAgKiguc3YpXG5cCi0gICAgKigudWEpXG5cCi0gICAgLiA9IEFMSUdOKDQpO1xuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICAgICooLmRzKVxuXAotICAgICooLnRjMClcblwKLSAgICAqKC50YylcblwKLSAgICAqKC50ZClcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKC5icylcblwKLSAgICAqKC51YylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAubG9hZGVyIDAgOiB7XG5cCi0gICAgKigubG9hZGVyKVxuXAotICB9XG5cCi0gIC5kZWJ1ZyAwIDoge1xuXAotICAgICooLmRlYnVnKVxuXAotICB9XG5cCi19XG5cbiIKLSAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAotT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKLUVOVFJZKF9fc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAucGFkIDAgOiB7ICooLnBhZCkgfVxuXAotICAudGV4dCAwIDoge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucHIpXG5cCi0gICAgKigucm8pXG5cCi0gICAgKiguZGIpXG5cCi0gICAgKiguZ2wpXG5cCi0gICAgKigueG8pXG5cCi0gICAgKigudGkpXG5cCi0gICAgKigudGIpXG5cCi0gIH1cblwKLSAgLmRhdGEgMCA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICooLnJ3KVxuXAotICAgICooLnN2KVxuXAotICAgICooLnVhKVxuXAotICAgIC4gPSBBTElHTig0KTtcblwKLSAgICAqKC5kcylcblwKLSAgICAqKC50YzApXG5cCi0gICAgKigudGMpXG5cCi0gICAgKigudGQpXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKiguYnMpXG5cCi0gICAgKigudWMpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgLmxvYWRlciAwIDoge1xuXAotICAgICooLmxvYWRlcilcblwKLSAgfVxuXAotICAuZGVidWcgMCA6IHtcblwKLSAgICAqKC5kZWJ1ZylcblwKLSAgfVxuXAotfVxuXG4iCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcInhjb2ZmLXBvd2VybWFjXCIpXG5cCi1PVVRQVVRfQVJDSChwb3dlcnBjKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFwcGxlLW1hY29zL2xpYik7XG5cCi1FTlRSWShfX3N0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKLSAgLnRleHQgICA6IHtcblwKLSAgICBQUk9WSURFIChfdGV4dCA9IC4pO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucHIpXG5cCi0gICAgKigucm8pXG5cCi0gICAgKiguZGIpXG5cCi0gICAgKiguZ2wpXG5cCi0gICAgKigueG8pXG5cCi0gICAgKigudGkpXG5cCi0gICAgKigudGIpXG5cCi0gICAgUFJPVklERSAoX2V0ZXh0ID0gLik7XG5cCi0gIH1cblwKLSAgLmRhdGEgMCA6IHtcblwKLSAgICBQUk9WSURFIChfZGF0YSA9IC4pO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgKigucncpXG5cCi0gICAgKiguc3YpXG5cCi0gICAgKigudWEpXG5cCi0gICAgLiA9IEFMSUdOKDQpO1xuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICAgICooLmRzKVxuXAotICAgICooLnRjMClcblwKLSAgICAqKC50YylcblwKLSAgICAqKC50ZClcblwKLSAgICBQUk9WSURFIChfZWRhdGEgPSAuKTtcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKC5icylcblwKLSAgICAqKC51YylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICBQUk9WSURFIChfZW5kID0gLik7XG5cCi0gICAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIH1cblwKLSAgLmxvYWRlciAwIDoge1xuXAotICAgICooLmxvYWRlcilcblwKLSAgfVxuXAotICAuZGVidWcgMCA6IHtcblwKLSAgICAqKC5kZWJ1ZylcblwKLSAgfVxuXAotfVxuXG4iCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy5tYWdpY19kZW1hbmRfcGFnZWQpIHJldHVybgotIk9VVFBVVF9GT1JNQVQoXCJ4Y29mZi1wb3dlcm1hY1wiKVxuXAotT1VUUFVUX0FSQ0gocG93ZXJwYylcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvcG93ZXJwYy1hcHBsZS1tYWNvcy9saWIpO1xuXAotRU5UUlkoX19zdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC5wYWQgMCA6IHsgKigucGFkKSB9XG5cCi0gIC50ZXh0ICAgOiB7XG5cCi0gICAgUFJPVklERSAoX3RleHQgPSAuKTtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnByKVxuXAotICAgICooLnJvKVxuXAotICAgICooLmRiKVxuXAotICAgICooLmdsKVxuXAotICAgICooLnhvKVxuXAotICAgICooLnRpKVxuXAotICAgICooLnRiKVxuXAotICAgIFBST1ZJREUgKF9ldGV4dCA9IC4pO1xuXAotICB9XG5cCi0gIC5kYXRhIDAgOiB7XG5cCi0gICAgUFJPVklERSAoX2RhdGEgPSAuKTtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICooLnJ3KVxuXAotICAgICooLnN2KVxuXAotICAgICooLnVhKVxuXAotICAgIC4gPSBBTElHTig0KTtcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgICAqKC5kcylcblwKLSAgICAqKC50YzApXG5cCi0gICAgKigudGMpXG5cCi0gICAgKigudGQpXG5cCi0gICAgUFJPVklERSAoX2VkYXRhID0gLik7XG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKiguYnMpXG5cCi0gICAgKigudWMpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgUFJPVklERSAoX2VuZCA9IC4pO1xuXAotICAgIFBST1ZJREUgKGVuZCA9IC4pO1xuXAotICB9XG5cCi0gIC5sb2FkZXIgMCA6IHtcblwKLSAgICAqKC5sb2FkZXIpXG5cCi0gIH1cblwKLSAgLmRlYnVnIDAgOiB7XG5cCi0gICAgKiguZGVidWcpXG5cCi0gIH1cblwKLX1cblxuIgotICA7IGVsc2UgcmV0dXJuCi0iT1VUUFVUX0ZPUk1BVChcInhjb2ZmLXBvd2VybWFjXCIpXG5cCi1PVVRQVVRfQVJDSChwb3dlcnBjKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9wb3dlcnBjLWFwcGxlLW1hY29zL2xpYik7XG5cCi1FTlRSWShfX3N0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnBhZCAwIDogeyAqKC5wYWQpIH1cblwKLSAgLnRleHQgICA6IHtcblwKLSAgICBQUk9WSURFIChfdGV4dCA9IC4pO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucHIpXG5cCi0gICAgKigucm8pXG5cCi0gICAgKiguZGIpXG5cCi0gICAgKiguZ2wpXG5cCi0gICAgKigueG8pXG5cCi0gICAgKigudGkpXG5cCi0gICAgKigudGIpXG5cCi0gICAgUFJPVklERSAoX2V0ZXh0ID0gLik7XG5cCi0gIH1cblwKLSAgLmRhdGEgMCA6IHtcblwKLSAgICBQUk9WSURFIChfZGF0YSA9IC4pO1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgKigucncpXG5cCi0gICAgKiguc3YpXG5cCi0gICAgKigudWEpXG5cCi0gICAgLiA9IEFMSUdOKDQpO1xuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICAgICooLmRzKVxuXAotICAgICooLnRjMClcblwKLSAgICAqKC50YylcblwKLSAgICAqKC50ZClcblwKLSAgICBQUk9WSURFIChfZWRhdGEgPSAuKTtcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKC5icylcblwKLSAgICAqKC51YylcblwKLSAgICAqKENPTU1PTilcblwKLSAgICBQUk9WSURFIChfZW5kID0gLik7XG5cCi0gICAgUFJPVklERSAoZW5kID0gLik7XG5cCi0gIH1cblwKLSAgLmxvYWRlciAwIDoge1xuXAotICAgICooLmxvYWRlcilcblwKLSAgfVxuXAotICAuZGVidWcgMCA6IHtcblwKLSAgICAqKC5kZWJ1ZylcblwKLSAgfVxuXAotfVxuXG4iCi07IH0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9wcGNtYWNvc19lbXVsYXRpb24gPSAKLXsKLSAgZ2xkcHBjbWFjb3NfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGdsZHBwY21hY29zX2FmdGVyX29wZW4sCi0gIGFmdGVyX2FsbG9jYXRpb25fZGVmYXVsdCwKLSAgc2V0X291dHB1dF9hcmNoX2RlZmF1bHQsCi0gIGxkZW11bF9kZWZhdWx0X3RhcmdldCwKLSAgZ2xkcHBjbWFjb3NfYmVmb3JlX2FsbG9jYXRpb24sCi0gIGdsZHBwY21hY29zX2dldF9zY3JpcHQsCi0gICJwcGNtYWNvcyIsCi0gICJ4Y29mZi1wb3dlcm1hYyIsCi0gIDAsCS8qIGZpbmlzaCAqLwotICAwLAkvKiBjcmVhdGVfb3V0cHV0X3NlY3Rpb25fc3RhdGVtZW50cyAqLwotICAwLAkvKiBvcGVuX2R5bmFtaWNfYXJjaGl2ZSAqLwotICAwLAkvKiBwbGFjZV9vcnBoYW4gKi8KLSAgMCwJLyogc2V0X3N5bWJvbHMgKi8KLSAgZ2xkcHBjbWFjb3NfcGFyc2VfYXJncywKLSAgZ2xkcHBjbWFjb3NfdW5yZWNvZ25pemVkX2ZpbGUKLX07CmRpZmYgLS1naXQgYS9sZC9tcHctZXNoLmMgYi9sZC9tcHctZXNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYmM1ZjUuLjAwMDAwMDAKLS0tIGEvbGQvbXB3LWVzaC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogZW11bGF0ZSB0aGUgb3JpZ2luYWwgZ2xkIGZvciB0aGUgZ2l2ZW4gc2gKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgU3RldmUgQ2hhbWJlcmxhaW4gc3RldmVAY3lnbnVzLmNvbQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jZGVmaW5lIFRBUkdFVF9JU19zaAotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotc3RhdGljIHZvaWQgZ2xkc2hfYmVmb3JlX3BhcnNlIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjaGFyICpnbGRzaF9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGRzaF9iZWZvcmVfcGFyc2UoKQotewotI2lmbmRlZiBUQVJHRVRfCQkJLyogSS5lLiwgaWYgbm90IGdlbmVyaWMuICAqLwotICBsZGZpbGVfb3V0cHV0X2FyY2hpdGVjdHVyZSA9IGJmZF9hcmNoX3NoOwotI2VuZGlmIC8qIG5vdCBUQVJHRVRfICovCi19Ci0KLXN0YXRpYyBjaGFyICoKLWdsZHNoX2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLWNvbmNhdCgKLSJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAotT1VUUFVUX0FSQ0goc2gpXG5cCi1NRU1PUllcblwKLXtcblwKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmtcblwKLX1cblwKLSAiLCIgU0VDVElPTlNcblwKLXtcblwKLSAiLCIgIC50ZXh0IDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3RyaW5ncylcblwKLSAgfSBcblwKLSAgLnRvcnMgOlxuXAotICB7XG5cCi0gICAgX19fY3RvcnMgPSAuIDtcblwKLSAgICAqKC5jdG9ycylcblwKLSAgICBfX19jdG9yc19lbmQgPSAuIDtcblwKLSAgICBfX19kdG9ycyA9IC4gO1xuXAotICAgICooLmR0b3JzKVxuXAotICAgIF9fX2R0b3JzX2VuZCA9IC4gO1xuXAotICB9IFxuXAotICIsIiAgLmRhdGEgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgfSBcblwKLSAiLCIgLmJzcyA6XG5cCi0gIHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH0gXG5cCi0gIiwiIC5zdGFjayAgIDpcblwKLSAge1xuXAotICAgICooLnN0YWNrKVxuXAotICB9IFxuXAotICIsIiAuc3RhYiAwICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFiKVxuXAotICB9XG5cCi0gIiwiIC5zdGFic3RyIDAgIDpcblwKLSAge1xuXAotICAgICooLnN0YWJzdHIpXG5cCi0gIH1cblwKLX1cblxuIiwgTlVMTCkKLSAgOyBlbHNlIGlmIChsaW5rX2luZm8ucmVsb2NhdGVhYmxlID09IHRydWUpIHJldHVybgotY29uY2F0ICgKLSJPVVRQVVRfRk9STUFUKFwiY29mZi1zaFwiKVxuXAotT1VUUFVUX0FSQ0goc2gpXG5cCi0gIiwiIE1FTU9SWVxuXAote1xuXAotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAotfVxuXAotICIsIiBTRUNUSU9OU1xuXAote1xuXAotICIsIiAgLnRleHQgOlxuXAotICB7XG5cCi0gICAgKigudGV4dClcblwKLSAgICAqKC5zdHJpbmdzKVxuXAotICB9IFxuXAotICIsIiAgIC50b3JzIDpcblwKLSAge1xuXAotICAgIF9fX2N0b3JzID0gLiA7XG5cCi0gICAgKiguY3RvcnMpXG5cCi0gICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCi0gICAgX19fZHRvcnMgPSAuIDtcblwKLSAgICAqKC5kdG9ycylcblwKLSAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKLSAgfSBcblwKLSAiLCIgICAuZGF0YSA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICB9IFxuXAotICIsIiAgIC5ic3MgOlxuXAotICB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9IFxuXAotICIsIiAgIC5zdGFjayAgIDpcblwKLSAge1xuXAotICAgICooLnN0YWNrKVxuXAotICB9IFxuXAotICIsIiAgIC5zdGFiIDAgIDpcblwKLSAge1xuXAotICAgICooLnN0YWIpXG5cCi0gIH1cblwKLSAiLCIgICAuc3RhYnN0ciAwICA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFic3RyKVxuXAotICB9XG5cCi19XG5cbiIsIE5VTEwpCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJjb2ZmLXNoXCIpXG5cCi1PVVRQVVRfQVJDSChzaClcblwKLU1FTU9SWVxuXAote1xuXAotICByYW0gOiBvID0gMHgxMDAwLCBsID0gNTEya1xuXAotfVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAiLCIgICAudGV4dCA6XG5cCi0gIHtcblwKLSAgICAqKC50ZXh0KVxuXAotICAgICooLnN0cmluZ3MpXG5cCi0gICAgIF9ldGV4dCA9IC4gOyBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAudG9ycyA6XG5cCi0gIHtcblwKLSAgICBfX19jdG9ycyA9IC4gO1xuXAotICAgICooLmN0b3JzKVxuXAotICAgIF9fX2N0b3JzX2VuZCA9IC4gO1xuXAotICAgIF9fX2R0b3JzID0gLiA7XG5cCi0gICAgKiguZHRvcnMpXG5cCi0gICAgX19fZHRvcnNfZW5kID0gLiA7XG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmRhdGEgOlxuXAotICB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICAgX2VkYXRhID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5ic3MgOlxuXAotICB7XG5cCi0gICAgIF9ic3Nfc3RhcnQgPSAuIDsgXG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICAgICBfZW5kID0gLiA7ICBcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuc3RhY2sgIDB4MzAwMDAgICA6XG5cCi0gIHtcblwKLSAgICAgX3N0YWNrID0gLiA7IFxuXAotICAgICooLnN0YWNrKVxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFiIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYilcblwKLSAgfVxuXAotICIsIiAgIC5zdGFic3RyIDAgKE5PTE9BRCkgOlxuXAotICB7XG5cCi0gICAgKiguc3RhYnN0cilcblwKLSAgfVxuXAotfVxuXG4iLCBOVUxMKQotICA7IGVsc2UgaWYgKCFjb25maWcubWFnaWNfZGVtYW5kX3BhZ2VkKSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKLU9VVFBVVF9BUkNIKHNoKVxuXAotTUVNT1JZXG5cCi17XG5cCi0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCi19XG5cCi1TRUNUSU9OU1xuXAote1xuXAotICIsIiAgIC50ZXh0IDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3RyaW5ncylcblwKLSAgICAgX2V0ZXh0ID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC50b3JzIDpcblwKLSAge1xuXAotICAgIF9fX2N0b3JzID0gLiA7XG5cCi0gICAgKiguY3RvcnMpXG5cCi0gICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCi0gICAgX19fZHRvcnMgPSAuIDtcblwKLSAgICAqKC5kdG9ycylcblwKLSAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuZGF0YSA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICBfZWRhdGEgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmJzcyA6XG5cCi0gIHtcblwKLSAgICAgX2Jzc19zdGFydCA9IC4gOyBcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgIF9lbmQgPSAuIDsgIFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFjayAgMHgzMDAwMCAgIDpcblwKLSAge1xuXAotICAgICBfc3RhY2sgPSAuIDsgXG5cCi0gICAgKiguc3RhY2spXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWIgMCAoTk9MT0FEKSA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFiKVxuXAotICB9XG5cCi0gIiwiICAgLnN0YWJzdHIgMCAoTk9MT0FEKSA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFic3RyKVxuXAotICB9XG5cCi19XG5cbiIsIE5VTEwpCi0gIDsgZWxzZSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImNvZmYtc2hcIilcblwKLU9VVFBVVF9BUkNIKHNoKVxuXAotTUVNT1JZXG5cCi17XG5cCi0gIHJhbSA6IG8gPSAweDEwMDAsIGwgPSA1MTJrXG5cCi19XG5cCi1TRUNUSU9OU1xuXAote1xuXAotICIsIiAgIC50ZXh0IDpcblwKLSAge1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKiguc3RyaW5ncylcblwKLSAgICAgX2V0ZXh0ID0gLiA7IFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC50b3JzIDpcblwKLSAge1xuXAotICAgIF9fX2N0b3JzID0gLiA7XG5cCi0gICAgKiguY3RvcnMpXG5cCi0gICAgX19fY3RvcnNfZW5kID0gLiA7XG5cCi0gICAgX19fZHRvcnMgPSAuIDtcblwKLSAgICAqKC5kdG9ycylcblwKLSAgICBfX19kdG9yc19lbmQgPSAuIDtcblwKLSAgfSAgPiByYW1cblwKLSAiLCIgICAuZGF0YSA6XG5cCi0gIHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgICBfZWRhdGEgPSAuIDsgXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLmJzcyA6XG5cCi0gIHtcblwKLSAgICAgX2Jzc19zdGFydCA9IC4gOyBcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gICAgIF9lbmQgPSAuIDsgIFxuXAotICB9ICA+IHJhbVxuXAotICIsIiAgIC5zdGFjayAgMHgzMDAwMCAgIDpcblwKLSAge1xuXAotICAgICBfc3RhY2sgPSAuIDsgXG5cCi0gICAgKiguc3RhY2spXG5cCi0gIH0gID4gcmFtXG5cCi0gIiwiICAgLnN0YWIgMCAoTk9MT0FEKSA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFiKVxuXAotICB9XG5cCi0gIiwiICAgLnN0YWJzdHIgMCAoTk9MT0FEKSA6XG5cCi0gIHtcblwKLSAgICAqKC5zdGFic3RyKVxuXAotICB9XG5cCi19XG5cbiIsIE5VTEwpCi07IH0KLQotc3RydWN0IGxkX2VtdWxhdGlvbl94ZmVyX3N0cnVjdCBsZF9zaF9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkc2hfYmVmb3JlX3BhcnNlLAotICBzeXNsaWJfZGVmYXVsdCwKLSAgaGxsX2RlZmF1bHQsCi0gIGFmdGVyX3BhcnNlX2RlZmF1bHQsCi0gIGFmdGVyX29wZW5fZGVmYXVsdCwKLSAgYWZ0ZXJfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBzZXRfb3V0cHV0X2FyY2hfZGVmYXVsdCwKLSAgbGRlbXVsX2RlZmF1bHRfdGFyZ2V0LAotICBiZWZvcmVfYWxsb2NhdGlvbl9kZWZhdWx0LAotICBnbGRzaF9nZXRfc2NyaXB0LAotICAic2giLAotICAiY29mZi1zaCIKLX07CmRpZmYgLS1naXQgYS9sZC9tcHctaWR0bWlwcy5jIGIvbGQvbXB3LWlkdG1pcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhkZGM3MC4uMDAwMDAwMAotLS0gYS9sZC9tcHctaWR0bWlwcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBpcyBnZW5lcmF0ZWQgYnkgYSBzaGVsbCBzY3JpcHQuICBETyBOT1QgRURJVCEgKi8KLQotLyogSGFuZGxlIGVtYmVkZGVkIHJlbG9jcyBmb3IgTUlQUy4KLSAgIENvcHlyaWdodCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4gYmFzZWQgb24gZ2VuZXJpYy5lbS4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2RlZmluZSBUQVJHRVRfSVNfbWlwc2lkdAotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYmZkbGluay5oIgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJsZGZpbGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLQotc3RhdGljIHZvaWQgZ2xkbWlwc2lkdF9iZWZvcmVfcGFyc2UgUEFSQU1TICgodm9pZCkpOwotc3RhdGljIHZvaWQgZ2xkbWlwc2lkdF9hZnRlcl9vcGVuIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNoZWNrX3NlY3Rpb25zIFBBUkFNUyAoKGJmZCAqLCBhc2VjdGlvbiAqLCBQVFIpKTsKLXN0YXRpYyB2b2lkIGdsZG1pcHNpZHRfYWZ0ZXJfYWxsb2NhdGlvbiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgY2hhciAqZ2xkbWlwc2lkdF9nZXRfc2NyaXB0IFBBUkFNUyAoKGludCAqaXNmaWxlKSk7Ci0KLXN0YXRpYyB2b2lkCi1nbGRtaXBzaWR0X2JlZm9yZV9wYXJzZSgpCi17Ci0jaWZuZGVmIFRBUkdFVF8JCQkvKiBJLmUuLCBpZiBub3QgZ2VuZXJpYy4gICovCi0gIGxkZmlsZV9vdXRwdXRfYXJjaGl0ZWN0dXJlID0gYmZkX2FyY2hfbWlwczsKLSNlbmRpZiAvKiBub3QgVEFSR0VUXyAqLwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHJ1biBhZnRlciBhbGwgdGhlIGlucHV0IGZpbGVzIGhhdmUgYmVlbiBvcGVuZWQuCi0gICBXZSBjcmVhdGUgYSAucmVsLnNkYXRhIHNlY3Rpb24gZm9yIGVhY2ggaW5wdXQgZmlsZSB3aXRoIGEgbm9uIHplcm8KLSAgIC5zZGF0YSBzZWN0aW9uLiAgVGhlIEJGRCBiYWNrZW5kIHdpbGwgZmlsbCBpbiB0aGVzZSBzZWN0aW9ucyB3aXRoCi0gICBtYWdpYyBudW1iZXJzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbG9jYXRlIHRoZSBkYXRhIHNlY3Rpb24gYXQgcnVuCi0gICB0aW1lLiAgVGhpcyB3aWxsIG9ubHkgZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIGFsbCB0aGUgaW5wdXQgZmlsZXMKLSAgIGhhdmUgYmVlbiBjb21waWxlZCB1c2luZyAtbWVtYmVkZGVkLXBpYy4gICovCi0KLXN0YXRpYyB2b2lkCi1nbGRtaXBzaWR0X2FmdGVyX29wZW4gKCkKLXsKLSAgYmZkICphYmZkOwotCi0gIGlmICghIGNvbW1hbmRfbGluZS5lbWJlZGRlZF9yZWxvY3MKLSAgICAgIHx8IGxpbmtfaW5mby5yZWxvY2F0ZWFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoYWJmZCA9IGxpbmtfaW5mby5pbnB1dF9iZmRzOyBhYmZkICE9IE5VTEw7IGFiZmQgPSBhYmZkLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXNlY3Rpb24gKmRhdGFzZWM7Ci0KLSAgICAgIGRhdGFzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5zZGF0YSIpOwotCi0gICAgICAvKiBOb3RlIHRoYXQgd2UgYXNzdW1lIHRoYXQgdGhlIHJlbG9jX2NvdW50IGZpZWxkIGhhcyBhbHJlYWR5Ci0gICAgICAgICBiZWVuIHNldCB1cC4gIFdlIGNvdWxkIGNhbGwgYmZkX2dldF9yZWxvY191cHBlcl9ib3VuZCwgYnV0Ci0gICAgICAgICB0aGF0IHJldHVybnMgdGhlIHNpemUgb2YgYSBtZW1vcnkgYnVmZmVyIHJhdGhlciB0aGFuIGEgcmVsb2MKLSAgICAgICAgIGNvdW50LiAgV2UgZG8gbm90IHdhbnQgdG8gY2FsbCBiZmRfY2Fub25pY2FsaXplX3JlbG9jLAotICAgICAgICAgYmVjYXVzZSBhbHRob3VnaCBpdCB3b3VsZCBhbHdheXMgd29yayBpdCB3b3VsZCBmb3JjZSB1cyB0bwotICAgICAgICAgcmVhZCBpbiB0aGUgcmVsb2NzIGludG8gQkZEIGNhbm9uaWNhbCBmb3JtLCB3aGljaCB3b3VsZCB3YXN0ZQotICAgICAgICAgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZSBhbmQgbWVtb3J5LiAgKi8KLSAgICAgIGlmIChkYXRhc2VjICE9IE5VTEwgJiYgZGF0YXNlYy0+cmVsb2NfY291bnQgPiAwKQotCXsKLQkgIGFzZWN0aW9uICpyZWxzZWM7Ci0KLQkgIHJlbHNlYyA9IGJmZF9tYWtlX3NlY3Rpb24gKGFiZmQsICIucmVsLnNkYXRhIik7Ci0JICBpZiAocmVsc2VjID09IE5VTEwKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9mbGFncyAoYWJmZCwgcmVsc2VjLAotCQkJCQkgIChTRUNfQUxMT0MKLQkJCQkJICAgfCBTRUNfTE9BRAotCQkJCQkgICB8IFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkJICAgfCBTRUNfSU5fTUVNT1JZKSkKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9hbGlnbm1lbnQgKGFiZmQsIHJlbHNlYywgMikKLQkgICAgICB8fCAhIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCByZWxzZWMsCi0JCQkJCSBkYXRhc2VjLT5yZWxvY19jb3VudCAqIDQpKQotCSAgICBlaW5mbyAoXygiJUYlQjogY2FuIG5vdCBjcmVhdGUgLnJlbC5zZGF0YSBzZWN0aW9uOiAlRVxuIikpOwotCX0KLQotICAgICAgLyogRG91YmxlIGNoZWNrIHRoYXQgYWxsIG90aGVyIGRhdGEgc2VjdGlvbnMgYXJlIGVtcHR5LCBhcyBpcwotICAgICAgICAgcmVxdWlyZWQgZm9yIGVtYmVkZGVkIFBJQyBjb2RlLiAgKi8KLSAgICAgIGJmZF9tYXBfb3Zlcl9zZWN0aW9ucyAoYWJmZCwgY2hlY2tfc2VjdGlvbnMsIChQVFIpIGRhdGFzZWMpOwotICAgIH0KLX0KLQotLyogQ2hlY2sgdGhhdCBvZiB0aGUgZGF0YSBzZWN0aW9ucywgb25seSB0aGUgLnNkYXRhIHNlY3Rpb24gaGFzCi0gICByZWxvY3MuICBUaGlzIGlzIGNhbGxlZCB2aWEgYmZkX21hcF9vdmVyX3NlY3Rpb25zLiAgKi8KLQotc3RhdGljIHZvaWQKLWNoZWNrX3NlY3Rpb25zIChhYmZkLCBzZWMsIHNkYXRhc2VjKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGFzZWN0aW9uICpzZWM7Ci0gICAgIFBUUiBzZGF0YXNlYzsKLXsKLSAgaWYgKChiZmRfZ2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYykgJiBTRUNfQ09ERSkgPT0gMAotICAgICAgJiYgc2VjICE9IChhc2VjdGlvbiAqKSBzZGF0YXNlYwotICAgICAgJiYgc2VjLT5yZWxvY19jb3VudCAhPSAwKQotICAgIGVpbmZvIChfKCIlRiVYOiBzZWN0aW9uICVzIGhhcyByZWxvY3M7IGNhbiBub3QgdXNlIC0tZW1iZWRkZWQtcmVsb2NzXG4iKSwKLQkgICBhYmZkLCBiZmRfZ2V0X3NlY3Rpb25fbmFtZSAoYWJmZCwgc2VjKSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIHRoZSBzZWN0aW9uIHNpemVzIGFuZCBvZmZzZXRzIGhhdmUKLSAgIGJlZW4gc2V0LiAgSWYgd2UgYXJlIGdlbmVyYXRpbmcgZW1iZWRkZWQgcmVsb2NzLCBpdCBjYWxscyBhIHNwZWNpYWwKLSAgIEJGRCBiYWNrZW5kIHJvdXRpbmUgdG8gZG8gdGhlIHdvcmsuICAqLwotCi1zdGF0aWMgdm9pZAotZ2xkbWlwc2lkdF9hZnRlcl9hbGxvY2F0aW9uICgpCi17Ci0gIGJmZCAqYWJmZDsKLQotICBpZiAoISBjb21tYW5kX2xpbmUuZW1iZWRkZWRfcmVsb2NzCi0gICAgICB8fCBsaW5rX2luZm8ucmVsb2NhdGVhYmxlKQotICAgIHJldHVybjsKLQotICBmb3IgKGFiZmQgPSBsaW5rX2luZm8uaW5wdXRfYmZkczsgYWJmZCAhPSBOVUxMOyBhYmZkID0gYWJmZC0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIGFzZWN0aW9uICpkYXRhc2VjLCAqcmVsc2VjOwotICAgICAgY2hhciAqZXJybXNnOwotCi0gICAgICBkYXRhc2VjID0gYmZkX2dldF9zZWN0aW9uX2J5X25hbWUgKGFiZmQsICIuc2RhdGEiKTsKLQotICAgICAgaWYgKGRhdGFzZWMgPT0gTlVMTCB8fCBkYXRhc2VjLT5yZWxvY19jb3VudCA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICByZWxzZWMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYWJmZCwgIi5yZWwuc2RhdGEiKTsKLSAgICAgIEFTU0VSVCAocmVsc2VjICE9IE5VTEwpOwotCi0gICAgICBpZiAoISBiZmRfbWlwc19lY29mZl9jcmVhdGVfZW1iZWRkZWRfcmVsb2NzIChhYmZkLCAmbGlua19pbmZvLAotCQkJCQkJICAgZGF0YXNlYywgcmVsc2VjLAotCQkJCQkJICAgJmVycm1zZykpCi0JewotCSAgaWYgKGVycm1zZyA9PSBOVUxMKQotCSAgICBlaW5mbyAoXygiJUIlWDogY2FuIG5vdCBjcmVhdGUgcnVudGltZSByZWxvYyBpbmZvcm1hdGlvbjogJUVcbiIpLAotCQkgICBhYmZkKTsKLQkgIGVsc2UKLQkgICAgZWluZm8gKF8oIiVYJUI6IGNhbiBub3QgY3JlYXRlIHJ1bnRpbWUgcmVsb2MgaW5mb3JtYXRpb246ICVzXG4iKSwKLQkJICAgYWJmZCwgZXJybXNnKTsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciAqCi1nbGRtaXBzaWR0X2dldF9zY3JpcHQoaXNmaWxlKQotICAgICBpbnQgKmlzZmlsZTsKLXsJCQkgICAgIAotICAqaXNmaWxlID0gMDsKLQotICBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlICYmIGNvbmZpZy5idWlsZF9jb25zdHJ1Y3RvcnMgPT0gdHJ1ZSkKLSAgICByZXR1cm4KLWNvbmNhdCgKLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgICooLmZpbmkpXG5cCi0gICAgO1xuXAotICAgIDtcblwKLSAgfVxuXAotICIsIiAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICB9XG5cCi0gIiwiICAuc2RhdGEgOiB7XG5cCi0gICAgKiguc2RhdGEpXG5cCi0gIH1cblwKLSAgLnNic3MgOiB7XG5cCi0gICAgKiguc2JzcylcblwKLSAgICAqKC5zY29tbW9uKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi19XG5cbiIsIE5VTEwpCi0gIDsgZWxzZSBpZiAobGlua19pbmZvLnJlbG9jYXRlYWJsZSA9PSB0cnVlKSByZXR1cm4KLSJPVVRQVVRfRk9STUFUKFwiZWNvZmYtYmlnbWlwc1wiLCBcImVjb2ZmLWJpZ21pcHNcIixcblwKLQkgICAgICBcImVjb2ZmLWxpdHRsZW1pcHNcIilcblwKLSBTRUFSQ0hfRElSKC91c3IvbG9jYWwvbWlwcy1pZHQtZWNvZmYvbGliKTtcblwKLUVOVFJZKHN0YXJ0KVxuXAotU0VDVElPTlNcblwKLXtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgICooLmZpbmkpXG5cCi0gICAgO1xuXAotICAgIDtcblwKLSAgfVxuXAotICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgfVxuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICB9XG5cCi0gIC5saXQ0IDoge1xuXAotICAgICooLmxpdDQpXG5cCi0gIH1cblwKLSAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0gIC5zYnNzIDoge1xuXAotICAgICooLnNic3MpXG5cCi0gICAgKiguc2NvbW1vbilcblwKLSAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotfVxuXG4iCi0gIDsgZWxzZSBpZiAoIWNvbmZpZy50ZXh0X3JlYWRfb25seSkgcmV0dXJuCi1jb25jYXQoCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC4gPSAweGEwMDEyMDAwO1xuXAotICAudGV4dCA6IHtcblwKLSAgICAgX2Z0ZXh0ID0gLiA7XG5cCi0gICAgKiguaW5pdClcblwKLSAgICAgZXByb2wgID0gIC47XG5cCi0gICAgKigudGV4dClcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgPSAuKTtcblwKLSAgICAqKC5yZWwuc2RhdGEpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0b3AgPSAuKTtcblwKLSAgICAqKC5maW5pKVxuXAotICAgICBldGV4dCAgPSAgLjtcblwKLSAgICAgX2V0ZXh0ICA9ICAuO1xuXAotIiwiICB9XG5cCi0gIC4gPSAuO1xuXAotICAucmRhdGEgOiB7XG5cCi0gICAgKigucmRhdGEpXG5cCi0gIH1cblwKLSAgIF9mZGF0YSA9IEFMSUdOKDE2KTtcblwKLSAgLmRhdGEgOiB7XG5cCi0gICAgKiguZGF0YSlcblwKLSAgICBDT05TVFJVQ1RPUlNcblwKLSAgfVxuXAotICAgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO1xuXAotICAubGl0OCA6IHtcblwKLSAgICAqKC5saXQ4KVxuXAotICB9XG5cCi0gIC5saXQ0IDoge1xuXAotICAgICooLmxpdDQpXG5cCi0gIH1cblwKLSAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0iLCIgICBlZGF0YSAgPSAgLjtcblwKLSAgIF9lZGF0YSAgPSAgLjtcblwKLSAgIF9mYnNzID0gLjtcblwKLSAgLnNic3MgOiB7XG5cCi0gICAgKiguc2JzcylcblwKLSAgICAqKC5zY29tbW9uKVxuXAotICB9XG5cCi0gIC5ic3MgOiB7XG5cCi0gICAgKiguYnNzKVxuXAotICAgICooQ09NTU9OKVxuXAotICB9XG5cCi0gICBlbmQgPSAuO1xuXAotICAgX2VuZCA9IC47XG5cCi19XG5cbiIKLSwgTlVMTCkKLSAgOyBlbHNlIGlmICghY29uZmlnLm1hZ2ljX2RlbWFuZF9wYWdlZCkgcmV0dXJuCi1jb25jYXQgKAotIk9VVFBVVF9GT1JNQVQoXCJlY29mZi1iaWdtaXBzXCIsIFwiZWNvZmYtYmlnbWlwc1wiLFxuXAotCSAgICAgIFwiZWNvZmYtbGl0dGxlbWlwc1wiKVxuXAotIFNFQVJDSF9ESVIoL3Vzci9sb2NhbC9taXBzLWlkdC1lY29mZi9saWIpO1xuXAotRU5UUlkoc3RhcnQpXG5cCi1TRUNUSU9OU1xuXAote1xuXAotICAuID0gMHhhMDAxMjAwMDtcblwKLSAgLnRleHQgOiB7XG5cCi0gICAgIF9mdGV4dCA9IC4gO1xuXAotICAgICooLmluaXQpXG5cCi0gICAgIGVwcm9sICA9ICAuO1xuXAotICAgICooLnRleHQpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0YXJ0ID0gLik7XG5cCi0gICAgKigucmVsLnNkYXRhKVxuXAotICAgIFBST1ZJREUgKF9fcnVudGltZV9yZWxvY19zdG9wID0gLik7XG5cCi0gICAgKiguZmluaSlcblwKLSAgICAgZXRleHQgID0gIC47XG5cCi0gICAgIF9ldGV4dCAgPSAgLjtcblwKLSAiLCIgIH1cblwKLSAgLiA9IC47XG5cCi0gIC5yZGF0YSA6IHtcblwKLSAgICAqKC5yZGF0YSlcblwKLSAgfVxuXAotICAgX2ZkYXRhID0gQUxJR04oMTYpO1xuXAotICAuZGF0YSA6IHtcblwKLSAgICAqKC5kYXRhKVxuXAotICAgIENPTlNUUlVDVE9SU1xuXAotICB9XG5cCi0gICBfZ3AgPSBBTElHTigxNikgKyAweDgwMDA7XG5cCi0gIC5saXQ4IDoge1xuXAotICAgICooLmxpdDgpXG5cCi0gIiwiICB9XG5cCi0gIC5saXQ0IDoge1xuXAotICAgICooLmxpdDQpXG5cCi0gIH1cblwKLSAgLnNkYXRhIDoge1xuXAotICAgICooLnNkYXRhKVxuXAotICB9XG5cCi0gICBlZGF0YSAgPSAgLjtcblwKLSAgIF9lZGF0YSAgPSAgLjtcblwKLSAgIF9mYnNzID0gLjtcblwKLSAgLnNic3MgOiB7XG5cCi0gICAgKiguc2JzcylcblwKLSAgICAqKC5zY29tbW9uKVxuXAotICIsIiAgfVxuXAotICAuYnNzIDoge1xuXAotICAgICooLmJzcylcblwKLSAgICAqKENPTU1PTilcblwKLSAgfVxuXAotICAgZW5kID0gLjtcblwKLSAgIF9lbmQgPSAuO1xuXAotfVxuXG4iCi0sIE5VTEwpCi0gIDsgZWxzZSByZXR1cm4KLWNvbmNhdCAoCi0iT1VUUFVUX0ZPUk1BVChcImVjb2ZmLWJpZ21pcHNcIiwgXCJlY29mZi1iaWdtaXBzXCIsXG5cCi0JICAgICAgXCJlY29mZi1saXR0bGVtaXBzXCIpXG5cCi0gU0VBUkNIX0RJUigvdXNyL2xvY2FsL21pcHMtaWR0LWVjb2ZmL2xpYik7XG5cCi1FTlRSWShzdGFydClcblwKLVNFQ1RJT05TXG5cCi17XG5cCi0gIC4gPSAweGEwMDEyMDAwO1xuXAotICAudGV4dCA6IHtcblwKLSAgICAgX2Z0ZXh0ID0gLiA7XG5cCi0gICAgKiguaW5pdClcblwKLSAgICAgZXByb2wgID0gIC47XG5cCi0gICAgKigudGV4dClcblwKLSAgICBQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgPSAuKTtcblwKLSAgICAqKC5yZWwuc2RhdGEpXG5cCi0gICAgUFJPVklERSAoX19ydW50aW1lX3JlbG9jX3N0b3AgPSAuKTtcblwKLSAgICAqKC5maW5pKVxuXAotICAgICBldGV4dCAgPSAgLjtcblwKLSAgICAgX2V0ZXh0ICA9ICAuO1xuXAotICIsIiAgfVxuXAotICAuID0gLjtcblwKLSAgLnJkYXRhIDoge1xuXAotICAgICooLnJkYXRhKVxuXAotICB9XG5cCi0gICBfZmRhdGEgPSBBTElHTigxNik7XG5cCi0gIC5kYXRhIDoge1xuXAotICAgICooLmRhdGEpXG5cCi0gICAgQ09OU1RSVUNUT1JTXG5cCi0gIH1cblwKLSAgIF9ncCA9IEFMSUdOKDE2KSArIDB4ODAwMDtcblwKLSAgLmxpdDggOiB7XG5cCi0gICAgKigubGl0OClcblwKLSAgfVxuXAotICAubGl0NCA6IHtcblwKLSAgICAqKC5saXQ0KVxuXAotICIsIiAgfVxuXAotICAuc2RhdGEgOiB7XG5cCi0gICAgKiguc2RhdGEpXG5cCi0gIH1cblwKLSAgIGVkYXRhICA9ICAuO1xuXAotICAgX2VkYXRhICA9ICAuO1xuXAotICAgX2Zic3MgPSAuO1xuXAotICAuc2JzcyA6IHtcblwKLSAgICAqKC5zYnNzKVxuXAotICAgICooLnNjb21tb24pXG5cCi0gIH1cblwKLSAgLmJzcyA6IHtcblwKLSAgICAqKC5ic3MpXG5cCi0gICAgKihDT01NT04pXG5cCi0gIH1cblwKLSAgIGVuZCA9IC47XG5cCi0gICBfZW5kID0gLjtcblwKLX1cblxuIgotLCBOVUxMKQotOyB9Ci0KLXN0cnVjdCBsZF9lbXVsYXRpb25feGZlcl9zdHJ1Y3QgbGRfbWlwc2lkdF9lbXVsYXRpb24gPSAKLXsKLSAgZ2xkbWlwc2lkdF9iZWZvcmVfcGFyc2UsCi0gIHN5c2xpYl9kZWZhdWx0LAotICBobGxfZGVmYXVsdCwKLSAgYWZ0ZXJfcGFyc2VfZGVmYXVsdCwKLSAgZ2xkbWlwc2lkdF9hZnRlcl9vcGVuLAotICBnbGRtaXBzaWR0X2FmdGVyX2FsbG9jYXRpb24sCi0gIHNldF9vdXRwdXRfYXJjaF9kZWZhdWx0LAotICBsZGVtdWxfZGVmYXVsdF90YXJnZXQsCi0gIGJlZm9yZV9hbGxvY2F0aW9uX2RlZmF1bHQsCi0gIGdsZG1pcHNpZHRfZ2V0X3NjcmlwdCwKLSAgIm1pcHNpZHQiLAotICAiZWNvZmYtYmlnbWlwcyIKLX07CmRpZmYgLS1naXQgYS9sZC9tcHctbWFrZS5zZWQgYi9sZC9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MTk3MDguLjAwMDAwMDAKLS0tIGEvbGQvbXB3LW1ha2Uuc2VkCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotIyBTZWQgY29tbWFuZHMgdG8gZmluaXNoIHRyYW5zbGF0aW5nIHRoZSBsZCBNYWtlZmlsZS5pbiBpbnRvIE1QVyBzeW50YXguCi0KLS9IREVGSU5FUy9zL0BIREVGSU5FU0AvLwotCi0vXnRhcmdldF9hbGlhcyA9IEB0YXJnZXRfYWxpYXNAL3MvXi8jLwotCi0vXkVNVUwgPSBARU1VTEAvcy9eLyMvCi0KLS9eRU1VTEFUSU9OX09GSUxFUyA9IEBFTVVMQVRJT05fT0ZJTEVTQC9zL14vIy8KLQotIyBGaXhhZGQgdG8gdGhlIGluY2x1ZGUgcGF0aHMuCi0vXklOQ0xVREVTID0gLiokL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0vQkZERElSL3MvLWkge0JGRERJUn0gLy1pICJ7QkZERElSfSI6IC8KLS9JTkNESVIvcy8taSB7SU5DRElSfSAvLWkgIntJTkNESVJ9IjogLwotCi0jIFVzZSBieWFjYyBpbnN0ZWFkIG9mIGJpc29uIChmb3Igbm93IGFueXdheSkuCi0vQklTT04vcy9eQklTT04gPS4qJC9CSVNPTiA9IGJ5YWNjLwotIy9CSVNPTkZMQUdTL3MvXkJJU09ORkxBR1MgPS4qJC9CSVNPTkZMQUdTID0gLwotCi0jIFN1cHByZXNzIHRoZSBzdXBwcmVzc2lvbiBvZiBzbWFydCBtYWtlcy4KLS9eXC55XC5jL2QKLQotIyBIYWNrIHVwIGxkbWFpbiBjb21waWxlLgotL14ie299ImxkbWFpbi5jLm8gXFxPcHRpb24tZiAuKiBjb25maWcuc3RhdHVzJC8sL14kL2NcCi0ie299ImxkbWFpbi5jLm8gXFxPcHRpb24tZiAgIntzfSJsZG1haW4uY1wKLQl7Q0N9IEBEQVNIX0NfRkxBR0AgLWQgREVGQVVMVF9FTVVMQVRJT049e2RxfXtFTVVMfXtkcX0gLWQgU0NSSVBURElSPXtkcX17c2NyaXB0ZGlyfXtkcX0ge0FMTF9DRkxBR1N9ICJ7c30ibGRtYWluLmMgLW8gIntvfSJsZG1haW4uYy5vXAotCi0KLSMgUmVtb3ZlIGxkZW11bC1saXN0LmggYnVpbGQsIHJlbHkgb24gY29uZmlndXJlIHRvIG1ha2Ugb25lLgotL15sZGVtdWwtbGlzdC5oIC8sL1JlbmFtZSAteSAie3N9ImxkZW11bC10bXAuaCAvZAotCi0jIEZpeCBwYXRobmFtZXMgdG8gZ2VuZXJhdGVkIGZpbGVzLgotL2NvbmZpZy5oL3MvIntzfSJjb25maWdcLmgvIntvfSJjb25maWcuaC9nCi0vY29uZmlnLmgvcy9eY29uZmlnXC5oLyJ7b30iY29uZmlnLmgvCi0KLS95LnRhYi5jL3MvIntzfSJ5XC50YWJcLmMvIntvfSJ5LnRhYi5jL2cKLS95LnRhYi5jL3MvXnlcLnRhYlwuYy8ie299InkudGFiLmMvCi0veS50YWIuaC9zLyJ7c30ieVwudGFiXC5oLyJ7b30ieS50YWIuaC9nCi0veS50YWIuaC9zL155XC50YWJcLmgvIntvfSJ5LnRhYi5oLwotCi0vbGRncmFtLmMvcy8ie3N9ImxkZ3JhbVwuYy8ie299ImxkZ3JhbS5jL2cKLS9sZGdyYW0uYy9zL15sZGdyYW1cLmMvIntvfSJsZGdyYW0uYy8KLQotL2xkZ3JhbS5oL3MvIntzfSJsZGdyYW1cLmgvIntvfSJsZGdyYW0uaC9nCi0vbGRncmFtLmgvcy9ebGRncmFtXC5oLyJ7b30ibGRncmFtLmgvCi0KLS9sZGxleC5jL3MvIntzfSJsZGxleFwuYy8ie299ImxkbGV4LmMvZwotL2xkbGV4LmMvcy9ebGRsZXhcLmMvIntvfSJsZGxleC5jLwotCi0vbGRsZXguYy5uZXcvcy8ie3N9ImxkbGV4XC5jXC5uZXcvIntvfSJsZGxleC5jLm5ldy9nCi0KLS9sZXgueXkuYy9zLyJ7c30ibGV4XC55eVwuYy8ie299ImxleC55eS5jL2cKLQotL2xkZW11bC1saXN0Lmgvcy8ie3N9ImxkZW11bC1saXN0XC5oLyJ7b30ibGRlbXVsLWxpc3QuaC9nCi0vbGRlbXVsLWxpc3QuaC9zL15sZGVtdWwtbGlzdFwuaC8ie299ImxkZW11bC1saXN0LmgvCi0KLSMgRWRpdCBwYXRobmFtZXMgdG8gZW11bGF0aW9uIGZpbGVzLgotLyJ7c30iZS4qXC5jL3MvIntzfSJlXChbLV9hLXowLTldKlwpXC5jLyJ7b30iZVwxLmMvZwotL15lLipcLmMvcy9eZVwoWy1fYS16MC05XSpcKVwuYy8ie299ImVcMS5jLwotCi0jIFdlIGNhbid0IHJ1biBnZW5zY3JpcHRzLCBzbyBkb24ndCB0cnkuCi0ve0dFTlNDUklQVFN9L3Mve0dFTlNDUklQVFN9L251bGwtY29tbWFuZC8KLQotIyBDb21tZW50IG91dCB0aGUgVERJUlMgYml0cy4KLS9eVERJUlNAL3MvXi8jLwotCi0jIFBvaW50IGF0IHRoZSBCRkQgbGlicmFyeSBkaXJlY3RseS4KLS9AQkZETElCQC9zL0BCRkRMSUJALzo6YmZkOmxpYmJmZC5vLwotCi0jIERvbid0IG5lZWQgdGhpcy4KLS9ASExERkxBR1NAL3MvQEhMREZMQUdTQC8vCi0KLSMvc2VkLipmcmVlLywvPiAie299ImxkbGV4LmMubmV3L2NcCi0jCVwJQ2F0ZW5hdGUgIntvfSJsZXgueXkuYyA+IntvfSJsZGxleC5jLm5ldwotCi0jIFRoZSByZXNvdXJjZSBmaWxlIGlzIGNhbGxlZCBtYWMtbGQuci4KLS97TERfUFJPR30uci9zL3tMRF9QUk9HfVwuci9tYWMtbGQuci8KLQotL15pbnN0YWxsIFxcT3B0aW9uLWYgLywvXiQvY1wKLWluc3RhbGwgXFxPcHRpb24tZiAgYWxsIGluc3RhbGwtb25seVwKLVwKLWluc3RhbGwtb25seSBcXE9wdGlvbi1mXAotCU5ld0ZvbGRlclJlY3Vyc2l2ZSAie2JpbmRpcn0iXAotCUR1cGxpY2F0ZSAteSA6bGQubmV3ICJ7YmluZGlyfSJsZFwKLQotCi0jIFJlbW92ZSBkZXBlbmRlbmN5IHJlYnVpbGRpbmcgY3J1ZC4KLS9eLmRlcCAvLC8jIC5QSE9OWSAvZAotCi0jIFJlbW92ZSB0aGUgbGludGxvZyBhY3Rpb24sIHBpcGUgc3ltYm9scyBpbiBjb2x1bW4gMSBsb3NlLgotL15saW50bG9nIFxcT3B0aW9uLWYvLC9eJC9kCi0KLS9eTWFrZWZpbGUgXFxPcHRpb24tZi8sL14kL2QKLS9eIntvfSJjb25maWcuaCBcXE9wdGlvbi1mLywvXiQvZAotL15jb25maWcuc3RhdHVzIFxcT3B0aW9uLWYvLC9eJC9kCmRpZmYgLS1naXQgYS9sZC9tcmkuYyBiL2xkL21yaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGFhZWEyLi4wMDAwMDAwCi0tLSBhL2xkL21yaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qIG1yaS5jIC0tIGhhbmRsZSBNUkkgc3R5bGUgbGlua2VyIHNjcmlwdHMKLSAgIENvcHlyaWdodCAoQykgMTk5MSwgOTIsIDkzLCA5NCwgOTUsIDk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi1HTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1HTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLS8qIFRoaXMgYml0IGRvZXMgdGhlIHRyZWUgZGVjb3JhdGlvbiB3aGVuIE1SSSBzdHlsZSBsaW5rIHNjcmlwdHMgYXJlIHBhcnNlZCAqLwotCi0vKgotICBjb250cmlidXRlZCBieSBTdGV2ZSBDaGFtYmVybGFpbgotICAJCSBzYWNAY3lnbnVzLmNvbQotCi0qLwotCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiIAotI2luY2x1ZGUgImxkLmgiCi0jaW5jbHVkZSAibGRleHAuaCIKLSNpbmNsdWRlICJsZGxhbmcuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJtcmkuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgewotICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqbmV4dDsKLSAgQ09OU1QgY2hhciAqbmFtZTsKLSAgQ09OU1QgY2hhciAqYWxpYXM7Ci0gIGV0cmVlX3R5cGUgKnZtYTsKLSAgZXRyZWVfdHlwZSAqYWxpZ247Ci0gIGV0cmVlX3R5cGUgKnN1YmFsaWduOwotICBpbnQgb2tfdG9fbG9hZDsKLX0gOwotCi11bnNpZ25lZCBpbnQgc3ltYm9sX3RydW5jYXRlID0gMTAwMDA7Ci1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqb3JkZXI7Ci1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqb25seV9sb2FkOwotc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKmFkZHJlc3M7Ci1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYWxpYXM7Ci0KLXN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphbGlnbm1lbnQ7Ci1zdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqc3ViYWxpZ25tZW50OwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsb29rdXAKLSAgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0KSk7Ci1zdGF0aWMgdm9pZCBtcmlfYWRkX3RvX2xpc3QgUEFSQU1TICgoc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipsaXN0LAotCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgZXRyZWVfdHlwZSAqdm1hLAotCQkJCSAgICAgY29uc3QgY2hhciAqemFsaWFzLCBldHJlZV90eXBlICphbGlnbiwKLQkJCQkgICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduKSk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKgotbG9va3VwIChuYW1lLCBsaXN0KQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKmxpc3Q7Ci17Ci0KLSAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipwdHIgPSBsaXN0OwotICB3aGlsZSAoKnB0cikgCi0gIHsKLSAgICBpZiAoc3RyY21wKG5hbWUsICgqcHRyKS0+bmFtZSkgPT0gMCkgewotICAgICAgLyogSWYgdGhpcyBpcyBhIG1hdGNoLCBkZWxldGUgaXQsIHdlIG9ubHkga2VlcCB0aGUgbGFzdCBpbnN0YW5jZQotCSBvZiBhbnkgbmFtZSAqLwotICAgICAgKnB0ciA9ICgqcHRyKS0+bmV4dDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICBwdHIgPSAmKCgqcHRyKS0+bmV4dCk7Ci0gICAgfQotICB9Ci0KLSAgKnB0ciA9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKXhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0KSk7Ci0gIHJldHVybiBwdHI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tcmlfYWRkX3RvX2xpc3QgKGxpc3QsIG5hbWUsIHZtYSwgemFsaWFzLCBhbGlnbiwgc3ViYWxpZ24pCi0gICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICoqbGlzdDsKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqdm1hOwotICAgICBDT05TVCBjaGFyICp6YWxpYXM7Ci0gICAgIGV0cmVlX3R5cGUgKmFsaWduOwotICAgICBldHJlZV90eXBlICpzdWJhbGlnbjsKLXsKLSAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKipwdHIgPSBsb29rdXAobmFtZSxsaXN0KTsKLSAgKCpwdHIpLT5uYW1lID0gbmFtZTsKLSAgKCpwdHIpLT52bWEgPSB2bWE7Ci0gICgqcHRyKS0+bmV4dCA9IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEw7Ci0gICgqcHRyKS0+b2tfdG9fbG9hZCA9IDA7Ci0gICgqcHRyKS0+YWxpYXMgPSB6YWxpYXM7Ci0gICgqcHRyKS0+YWxpZ24gPSBhbGlnbjsKLSAgKCpwdHIpLT5zdWJhbGlnbiA9IHN1YmFsaWduOwotfQotCi0KLXZvaWQKLW1yaV9vdXRwdXRfc2VjdGlvbiAobmFtZSwgdm1hKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICp2bWE7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmYWRkcmVzcywgbmFtZSwgdm1hLCAwLDAsMCk7Ci19Ci0KLS8qIGlmIGFueSBBQlNPTFVURSA8bmFtZT4gYXJlIGluIHRoZSBzY3JpcHQsIG9ubHkgbG9hZCB0aG9zZSBmaWxlcwotbWFya2VkIHRodXMgKi8KLQotdm9pZAotbXJpX29ubHlfbG9hZCAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgbXJpX2FkZF90b19saXN0KCZvbmx5X2xvYWQsIG5hbWUsIDAsIDAsMCwwKTsKLX0KLQotCi12b2lkCi1tcmlfYmFzZSAoZXhwKQotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIGJhc2UgPSBleHA7Ci19Ci0KLXN0YXRpYyBpbnQgZG9uZV90cmVlID0gMDsKLQotdm9pZAotbXJpX2RyYXdfdHJlZSAoKQotewotICBpZiAoZG9uZV90cmVlKSByZXR1cm47Ci0KLSAgLyogV2UgZG9uJ3QgYm90aGVyIHdpdGggbWVtb3J5IHJlZ2lvbnMuICAqLwotI2lmIDAKLSAgLyogQ3JlYXRlIHRoZSByZWdpb25zICovCi0gewotICAgbGFuZ19tZW1vcnlfcmVnaW9uX3R5cGUgKnI7Ci0gICByID0gbGFuZ19tZW1vcnlfcmVnaW9uX2xvb2t1cCgibG9uZyIpOwotICAgci0+Y3VycmVudCA9IHItPm9yaWdpbiA9IGV4cF9nZXRfdm1hKGJhc2UsIChiZmRfdm1hKTAsICJvcmlnaW4iLAotCQkJCQlsYW5nX2ZpcnN0X3BoYXNlX2VudW0pOwotICAgci0+bGVuZ3RoID0gKGJmZF9zaXplX3R5cGUpIGV4cF9nZXRfdm1hKDAsIChiZmRfdm1hKSB+KChiZmRfc2l6ZV90eXBlKTApLAotCQkJCQkgICAibGVuZ3RoIiwgbGFuZ19maXJzdF9waGFzZV9lbnVtKTsKLSB9Ci0jZW5kaWYKLSAgCi0gIC8qIE5vdyBidWlsZCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIGxkbGFuZyBtYWNoaW5lICovCi0KLQotICAvKiBBdHRhdGNoIHRoZSBhZGRyZXNzZXMgb2YgYW55IHdoaWNoIGhhdmUgYWRkcmVzc2VzLCBhbmQgYWRkIHRoZQotICAgICBvbmVzIG5vdCBtZW50aW9uZWQgKi8KLSAgaWYgKGFkZHJlc3MgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTCkgewotICAgIHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICphbGlzdDsKLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqb2xpc3Q7Ci0gICAgaWYgKG9yZGVyID09IChzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqKU5VTEwpIHsKLSAgICAgIG9yZGVyID0gYWRkcmVzczsKLSAgICB9Ci0KLSAgICBmb3IgKGFsaXN0ID0gYWRkcmVzczsKLQkgYWxpc3QgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0KilOVUxMOwotCSBhbGlzdCA9IGFsaXN0LT5uZXh0KSAKLSAgICB7Ci0gICAgICBpbnQgZG9uZSA9IDA7Ci0gICAgICBmb3IgKG9saXN0ID0gb3JkZXI7Ci0JICAgZG9uZSA9PSAwICYmCi0JICAgb2xpc3QgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTDsKLQkgICBvbGlzdCA9IG9saXN0LT5uZXh0KSAKLSAgICAgIHsKLQlpZiAoc3RyY21wKGFsaXN0LT5uYW1lLCBvbGlzdC0+bmFtZSkgPT0gMCkgCi0JewotCSAgb2xpc3QtPnZtYSA9IGFsaXN0LT52bWE7Ci0JICBkb25lID0gMTsKLQl9Ci0gICAgICB9Ci0gICAgICBpZiAoIWRvbmUpIHsKLQkvKiBhZGQgdGhpcyBvbnRvIGVuZCBvZiBvcmRlciBsaXN0ICovCi0JbXJpX2FkZF90b19saXN0KCZvcmRlciwgYWxpc3QtPm5hbWUsIGFsaXN0LT52bWEsIDAsMCwwKTsKLSAgICAgIH0KLQotICAgIH0KLQotICB9Ci0KLSAgLyogSWYgd2UncmUgb25seSBzdXBwb3NlZCB0byBsb2FkIGEgc3Vic2V0IG9mIHRoZW0gaW4sIHRoZW4gcHJ1bmUKLSAgICAgdGhlIGxpc3QuICAqLwotCi0gIGlmIChvbmx5X2xvYWQgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTCkgCi0gIHsKLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqcHRyMTsKLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqcHRyMjsKLSAgICBpZiAob3JkZXIgPT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0KilOVUxMKQotICAgICBvcmRlciA9IG9ubHlfbG9hZDsKLSAgICAKLSAgICAvKiBTZWUgaWYgdGhpcyBuYW1lIGlzIGluIHRoZSBsaXN0LCBpZiBpdCBpcyB0aGVuIHdlIGNhbiBsb2FkIGl0Ci0gICAgICovCi0gICAgZm9yIChwdHIxID0gb25seV9sb2FkOyBwdHIxOyBwdHIxID0gcHRyMS0+bmV4dCkgCi0gICAgewotICAgICAgZm9yIChwdHIyPSBvcmRlcjsgcHRyMjsgcHRyMj1wdHIyLT5uZXh0KSAKLSAgICAgIHsKLQlpZiAoc3RyY21wKHB0cjItPm5hbWUsIHB0cjEtPm5hbWUpPT0wKSB7Ci0JICBwdHIyLT5va190b19sb2FkID0gMTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGVsc2UgCi0gIHsKLSAgICAvKiBObyBvbmx5IGxvYWQgbGlzdCwgc28gZXZlcnl0aGluZyBpcyBvayB0byBsb2FkICovCi0gICAgc3RydWN0IHNlY3Rpb25fbmFtZV9zdHJ1Y3QgKnB0cjsKLSAgICBmb3IgKHB0ciA9IG9yZGVyOyBwdHI7IHB0cj1wdHItPm5leHQpIHsKLSAgICAgIHB0ci0+b2tfdG9fbG9hZCA9IDE7Ci0gICAgfQotICB9Ci0KLQotCi0gIC8qIENyZWF0ZSB0aGUgb3JkZXIgb2Ygc2VjdGlvbnMgdG8gbG9hZCAqLwotICBpZiAob3JkZXIgIT0gKHN0cnVjdCBzZWN0aW9uX25hbWVfc3RydWN0ICopTlVMTCkgCi0gIHsKLSAgICAvKiBCZWVuIHRvbGQgdG8gb3V0cHV0IHRoZSBzZWN0aW9ucyBpbiBhIGNlcnRhaW4gb3JkZXIgKi8KLSAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqcCA9IG9yZGVyOwotICAgIHdoaWxlIChwKSAKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgc2VjdGlvbl9uYW1lX3N0cnVjdCAqYXB0cjsKLSAgICAgIGV0cmVlX3R5cGUgKmFsaWduID0gMDsKLSAgICAgIGV0cmVlX3R5cGUgKnN1YmFsaWduID0gMDsKLSAgICAgIC8qIFNlZSBpZiBhbiBhbGlnbm1lbnQgaGFzIGJlZW4gc3BlY2lmaWVkICovCi0KLSAgICAgIGZvciAoYXB0ciA9IGFsaWdubWVudDsgYXB0cjsgYXB0cj0gYXB0ci0+bmV4dCkKLSAgICAgIHsKLQlpZiAoc3RyY21wKGFwdHItPm5hbWUsIHAtPm5hbWUpPT0wKSB7Ci0JICBhbGlnbiA9ICBhcHRyLT5hbGlnbjsKLQl9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoYXB0ciA9IHN1YmFsaWdubWVudDsgYXB0cjsgYXB0cj0gYXB0ci0+bmV4dCkKLSAgICAgIHsKLQlpZiAoc3RyY21wKGFwdHItPm5hbWUsIHAtPm5hbWUpPT0wKSB7Ci0JICBzdWJhbGlnbiA9ICBhcHRyLT5zdWJhbGlnbjsKLQl9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChiYXNlID09IDApIHsKLQliYXNlID0gcC0+dm1hID8gcC0+dm1hIDpleHBfbmFtZW9wKE5BTUUsICIuIik7Ci0gICAgICB9Ci0gICAgICBsYW5nX2VudGVyX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCAocC0+bmFtZSwgYmFzZSwKLQkJCQkJICAgcC0+b2tfdG9fbG9hZCA/IDAgOiBub2xvYWRfc2VjdGlvbiwKLQkJCQkJICAgMSwgYWxpZ24sIHN1YmFsaWduLAotCQkJCQkgICAoZXRyZWVfdHlwZSAqKSBOVUxMKTsKLSAgICAgIGJhc2UgPSAwOwotICAgICAgbGFuZ19hZGRfd2lsZCAocC0+bmFtZSwgZmFsc2UsIChjaGFyICopTlVMTCwgZmFsc2UsIGZhbHNlLCBOVUxMKTsKLSAgICAgIC8qIElmIHRoZXJlIGlzIGFuIGFsaWFzIGZvciB0aGlzIHNlY3Rpb24sIGFkZCBpdCB0b28gKi8KLSAgICAgIGZvciAoYXB0ciA9IGFsaWFzOyBhcHRyOyBhcHRyID0gYXB0ci0+bmV4dCkgewotCi0JaWYgKHN0cmNtcChhcHRyLT5hbGlhcywgcC0+bmFtZSk9PSAwKSB7Ci0JICBsYW5nX2FkZF93aWxkIChhcHRyLT5uYW1lLCBmYWxzZSwgKGNoYXIgKilOVUxMLCBmYWxzZSwgZmFsc2UsIE5VTEwpOwotCX0KLSAgICAgIH0KLQotICAgICAgbGFuZ19sZWF2ZV9vdXRwdXRfc2VjdGlvbl9zdGF0ZW1lbnQKLQkoMCwgIipkZWZhdWx0KiIsIChzdHJ1Y3QgbGFuZ19vdXRwdXRfc2VjdGlvbl9waGRyX2xpc3QgKikgTlVMTCk7Ci0KLSAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLSAgfQotCi0KLSAgZG9uZV90cmVlID0gMTsKLQotfQotdm9pZAotbXJpX2xvYWQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGJhc2UgPSAwOwotICBsYW5nX2FkZF9pbnB1dF9maWxlKG5hbWUsCi0JCSAgICAgIGxhbmdfaW5wdXRfZmlsZV9pc19maWxlX2VudW0sIChjaGFyICopTlVMTCk7Ci0gIC8qICBsYW5nX2xlYXZlX291dHB1dF9zZWN0aW9uX3N0YXRlbWVudCgwLCIqZGVmYXVsdCoiKTsqLwotfQotCi0KLXZvaWQKLW1yaV9vcmRlciAobmFtZSkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLXsKLSAgbXJpX2FkZF90b19saXN0KCZvcmRlciwgbmFtZSwgMCwgMCwwLDApOwotfQotCi12b2lkIAotbXJpX2FsaWFzICh3YW50LCBpcywgaXNuKQotICAgICBDT05TVCBjaGFyICp3YW50OwotICAgICBDT05TVCBjaGFyICppczsKLSAgICAgaW50IGlzbjsKLXsKLSAgaWYgKCFpcykgewotICAgIC8qIFNvbWUgc2VjdGlvbnMgYXJlIGRpZ2l0cyAtICovCi0gICAgY2hhciBidWZbMjBdOwotICAgIHNwcmludGYoYnVmLCAiJWQiLCBpc24pOwotICAgIGlzID0geHN0cmR1cCAoYnVmKTsKLSAgICBpZiAoaXMgPT0gTlVMTCkKLSAgICAgIGFib3J0ICgpOwotICB9Ci0gIG1yaV9hZGRfdG9fbGlzdCgmYWxpYXMsIGlzLCAwLCB3YW50LDAsMCk7Ci0KLX0KLQotCi12b2lkIAotbXJpX25hbWUgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGxhbmdfYWRkX291dHB1dChuYW1lLCAxKTsKLQotfQotCi0KLXZvaWQKLW1yaV9mb3JtYXQgKG5hbWUpCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci17Ci0gIGlmIChzdHJjbXAobmFtZSwgIlMiKSA9PSAwKQotICB7Ci0gICAgbGFuZ19hZGRfb3V0cHV0X2Zvcm1hdCgic3JlYyIsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDEpOwotICB9Ci0gIGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiSUVFRSIpID09IDApCi0gIHsKLSAgICBsYW5nX2FkZF9vdXRwdXRfZm9ybWF0KCJpZWVlIiwgKGNoYXIgKikgTlVMTCwgKGNoYXIgKikgTlVMTCwgMSk7Ci0gIH0KLSAgZWxzZSBpZiAoc3RyY21wKG5hbWUsICJDT0ZGIikgPT0gMCkKLSAgewotICAgIGxhbmdfYWRkX291dHB1dF9mb3JtYXQoImNvZmYtbTY4ayIsIChjaGFyICopIE5VTEwsIChjaGFyICopIE5VTEwsIDEpOwotICB9Ci0gIGVsc2UgewotICAgIGVpbmZvKF8oIiVQJUY6IHVua25vd24gZm9ybWF0IHR5cGUgJXNcbiIpLCBuYW1lKTsKLSAgfQotfQotCi0KLXZvaWQKLW1yaV9wdWJsaWMgKG5hbWUsIGV4cCkKLSAgICAgQ09OU1QgY2hhciAqbmFtZTsKLSAgICAgZXRyZWVfdHlwZSAqZXhwOwotewotICBsYW5nX2FkZF9hc3NpZ25tZW50KGV4cF9hc3NvcCgnPScsIG5hbWUsIGV4cCkpOwotfQotCi12b2lkIAotbXJpX2FsaWduIChuYW1lLCBleHApCi0gICAgIENPTlNUIGNoYXIgKm5hbWU7Ci0gICAgIGV0cmVlX3R5cGUgKmV4cDsKLXsKLSAgbXJpX2FkZF90b19saXN0KCZhbGlnbm1lbnQsIG5hbWUsMCwwLGV4cCwwKTsKLX0KLQotdm9pZCAKLW1yaV9hbGlnbm1vZCAobmFtZSwgZXhwKQotICAgICBDT05TVCBjaGFyICpuYW1lOwotICAgICBldHJlZV90eXBlICpleHA7Ci17Ci0gIG1yaV9hZGRfdG9fbGlzdCgmc3ViYWxpZ25tZW50LCBuYW1lLDAsMCwwLGV4cCk7Ci19Ci0KLQotdm9pZCAKLW1yaV90cnVuY2F0ZSAoZXhwKQotICAgICB1bnNpZ25lZCBpbnQgZXhwOwotewotICBzeW1ib2xfdHJ1bmNhdGUgPSBleHA7Ci19CmRpZmYgLS1naXQgYS9sZC9tcmkuaCBiL2xkL21yaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNmMGYzLi4wMDAwMDAwCi0tLSBhL2xkL21yaS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyogbXJpLmggLS0gaGVhZGVyIGZpbGUgZm9yIE1SSSBzY3JpcHRpbmcgZnVuY3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5MywgOTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdMRCwgdGhlIEdudSBMaW5rZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpZm5kZWYgTVJJX0gKLSNkZWZpbmUgTVJJX0gKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBzeW1ib2xfdHJ1bmNhdGU7Ci0KLWV4dGVybiB2b2lkIG1yaV9vdXRwdXRfc2VjdGlvbiBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lLCBldHJlZV90eXBlICp2bWEpKTsKLWV4dGVybiB2b2lkIG1yaV9vbmx5X2xvYWQgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX2Jhc2UgUEFSQU1TICgoZXRyZWVfdHlwZSAqZXhwKSk7Ci1leHRlcm4gdm9pZCBtcmlfbG9hZCBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfb3JkZXIgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSkpOwotZXh0ZXJuIHZvaWQgbXJpX2FsaWFzIFBBUkFNUyAoKGNvbnN0IGNoYXIgKndhbnQsIGNvbnN0IGNoYXIgKmlzLCBpbnQgaXNuKSk7Ci1leHRlcm4gdm9pZCBtcmlfbmFtZSBQQVJBTVMgKChjb25zdCBjaGFyICpuYW1lKSk7Ci1leHRlcm4gdm9pZCBtcmlfZm9ybWF0IFBBUkFNUyAoKGNvbnN0IGNoYXIgKm5hbWUpKTsKLWV4dGVybiB2b2lkIG1yaV9wdWJsaWMgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgZXRyZWVfdHlwZSAqZXhwKSk7Ci1leHRlcm4gdm9pZCBtcmlfYWxpZ24gUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgZXRyZWVfdHlwZSAqZXhwKSk7Ci1leHRlcm4gdm9pZCBtcmlfYWxpZ25tb2QgUEFSQU1TICgoY29uc3QgY2hhciAqbmFtZSwgZXRyZWVfdHlwZSAqZXhwKSk7Ci1leHRlcm4gdm9pZCBtcmlfdHJ1bmNhdGUgUEFSQU1TICgodW5zaWduZWQgaW50IGV4cCkpOwotZXh0ZXJuIHZvaWQgbXJpX2RyYXdfdHJlZSBQQVJBTVMgKCh2b2lkKSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGQvcGUtZGxsLmMgYi9sZC9wZS1kbGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1MmQ2Ni4uMDAwMDAwMAotLS0gYS9sZC9wZS1kbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDE3ODYgKzAsMCBAQAotLyogUm91dGluZXMgdG8gaGVscCBidWlsZCBQRUktZm9ybWF0IERMTHMgKFdpbjMyIGV0YykKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgREogRGVsb3JpZSA8ZGpAY3lnbnVzLmNvbT4KLQotICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0xELCB0aGUgR251IExpbmtlci4KLQotICAgR0xEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0xEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggR0xEOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgImJmZGxpbmsuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotCi0jaW5jbHVkZSAibGQuaCIKLSNpbmNsdWRlICJsZGV4cC5oIgotI2luY2x1ZGUgImxkbGFuZy5oIgotI2luY2x1ZGUgImxkd3JpdGUuaCIKLSNpbmNsdWRlICJsZG1pc2MuaCIKLSNpbmNsdWRlICJsZGdyYW0uaCIKLSNpbmNsdWRlICJsZG1haW4uaCIKLSNpbmNsdWRlICJsZGVtdWwuaCIKLSNpbmNsdWRlICJjb2ZmL2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vYmZkL2xpYmNvZmYuaCIKLSNpbmNsdWRlICJkZWZmaWxlLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIFRoaXMgZmlsZSB0dXJucyBhIHJlZ3VsYXIgV2luZG93cyBQRSBpbWFnZSBpbnRvIGEgRExMLiAgQmVjYXVzZSBvZgotIHRoZSBjb21wbGV4aXR5IG9mIHRoaXMgb3BlcmF0aW9uLCBpdCBoYXMgYmVlbiBicm9rZW4gZG93biBpbnRvIGEKLSBudW1iZXIgb2Ygc2VwYXJhdGUgbW9kdWxlcyB3aGljaCBhcmUgYWxsIGNhbGxlZCBieSB0aGUgbWFpbiBmdW5jdGlvbgotIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgcmUtZW50cmFudCBhbmQgaXMKLSBub3JtYWxseSBvbmx5IGNhbGxlZCBvbmNlLCBzbyBzdGF0aWMgdmFyaWFibGVzIGFyZSB1c2VkIHRvIHJlZHVjZQotIHRoZSBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlcyByZXF1aXJlZC4KLQotIFNlZSBhbHNvOiBsZC9lbXVsdGVtcGwvcGUuZW0KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZm9yIGVtdWx0ZW1wbC9wZS5lbSAqLwotCi1kZWZfZmlsZSAqcGVfZGVmX2ZpbGUgPSAwOwotaW50IHBlX2RsbF9leHBvcnRfZXZlcnl0aGluZyA9IDA7Ci1pbnQgcGVfZGxsX2RvX2RlZmF1bHRfZXhjbHVkZXMgPSAxOwotaW50IHBlX2RsbF9raWxsX2F0cyA9IDA7Ci1pbnQgcGVfZGxsX3N0ZGNhbGxfYWxpYXNlcyA9IDA7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIHN0YXRpYyB2YXJpYWJsZXMgYW5kIHR5cGVzCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBiZmRfdm1hIGltYWdlX2Jhc2U7Ci0KLXN0YXRpYyBiZmQgKmZpbGxlcl9iZmQ7Ci1zdGF0aWMgc3RydWN0IHNlYyAqZWRhdGFfcywgKnJlbG9jX3M7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqZWRhdGFfZCwgKnJlbG9jX2Q7Ci1zdGF0aWMgaW50IGVkYXRhX3N6LCByZWxvY19zejsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICp0YXJnZXRfbmFtZTsKLSAgY2hhciAqb2JqZWN0X3RhcmdldDsKLSAgaW50IGltYWdlYmFzZV9yZWxvYzsKLSAgaW50IHBlX2FyY2g7Ci0gIGludCBiZmRfYXJjaDsKLSAgaW50IHVuZGVyc2NvcmVkOwotfSBwZV9kZXRhaWxzX3R5cGU7Ci0KLSNkZWZpbmUgUEVfQVJDSF9pMzg2CTEKLQotc3RhdGljIHBlX2RldGFpbHNfdHlwZSBwZV9kZXRhaWxfbGlzdFtdID0gewotICB7Ci0gICAgInBlaS1pMzg2IiwKLSAgICAicGUtaTM4NiIsCi0gICAgNyAvKiBSX0lNQUdFQkFTRSAqLywKLSAgICBQRV9BUkNIX2kzODYsCi0gICAgYmZkX2FyY2hfaTM4NiwKLSAgICAxCi0gIH0sCi0gIHsgMCB9Ci19OwotCi1zdGF0aWMgcGVfZGV0YWlsc190eXBlICpwZV9kZXRhaWxzOwotCi0jZGVmaW5lIFUoc3RyKSAocGVfZGV0YWlscy0+dW5kZXJzY29yZWQgPyAiXyIgc3RyIDogc3RyKQotCi12b2lkCi1wZV9kbGxfaWRfdGFyZ2V0ICh0YXJnZXQpCi0gICAgIGNoYXIgKnRhcmdldDsKLXsKLSAgaW50IGk7Ci0gIGZvciAoaT0wOyBwZV9kZXRhaWxfbGlzdFtpXS50YXJnZXRfbmFtZTsgaSsrKQotICAgIGlmIChzdHJjbXAgKHBlX2RldGFpbF9saXN0W2ldLnRhcmdldF9uYW1lLCB0YXJnZXQpID09IDApCi0gICAgICB7Ci0JcGVfZGV0YWlscyA9IHBlX2RldGFpbF9saXN0K2k7Ci0JcmV0dXJuOwotICAgICAgfQotICBlaW5mbyAoXygiJVhVbnN1cHBvcnRlZCBQRUkgYXJjaGl0ZWN0dXJlOiAlc1xuIiksIHRhcmdldCk7Ci0gIGV4aXQgKDEpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBIZWxwZXIgZnVuY3Rpb25zIGZvciBxc29ydC4gIFJlbG9jcyBtdXN0IGJlIHNvcnRlZCBzbyB0aGF0IHdlIGNhbiB3cml0ZQotIHRoZW0gb3V0IGJ5IHBhZ2VzLgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGJmZF92bWEgdm1hOwotICBjaGFyIHR5cGU7Ci0gIHNob3J0IGV4dHJhOwotfSByZWxvY19kYXRhX3R5cGU7Ci0KLXN0YXRpYyBpbnQKLXJlbG9jX3NvcnQgKHZhLCB2YikKLSAgICAgY29uc3Qgdm9pZCAqdmEsICp2YjsKLXsKLSAgYmZkX3ZtYSBhID0gKChyZWxvY19kYXRhX3R5cGUgKikgdmEpLT52bWE7Ci0gIGJmZF92bWEgYiA9ICgocmVsb2NfZGF0YV90eXBlICopIHZiKS0+dm1hOwotICByZXR1cm4gKGEgPiBiKSA/IDEgOiAoKGEgPCBiKSA/IC0xIDogMCk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBlX2V4cG9ydF9zb3J0ICh2YSwgdmIpCi0gICAgIGNvbnN0IHZvaWQgKnZhLCAqdmI7Ci17Ci0gIGRlZl9maWxlX2V4cG9ydCAqYSA9IChkZWZfZmlsZV9leHBvcnQgKikgdmE7Ci0gIGRlZl9maWxlX2V4cG9ydCAqYiA9IChkZWZfZmlsZV9leHBvcnQgKikgdmI7Ci0gIHJldHVybiBzdHJjbXAgKGEtPm5hbWUsIGItPm5hbWUpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBSZWFkIGFuZCBwcm9jZXNzIHRoZSAuREVGIGZpbGUKLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlc2UgY29ycmVzcG9uZCB0byB0aGUgZW50cmllcyBpbiBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tdLiAgSSB1c2UKLSAgIGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSB0byB0YWcgd2hldGhlciBvciBub3QgdGhlIHN5bWJvbCB3YXMKLSAgIGRlZmluZWQsIHNpbmNlIHdlIGNhbid0IGV4cG9ydCBzeW1ib2xzIHdlIGRvbid0IGhhdmUuICovCi0KLXN0YXRpYyBiZmRfdm1hICpleHBvcnRlZF9zeW1ib2xfb2Zmc2V0czsKLXN0YXRpYyBzdHJ1Y3Qgc2VjICoqZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zOwotCi1zdGF0aWMgaW50IGV4cG9ydF90YWJsZV9zaXplOwotc3RhdGljIGludCBjb3VudF9leHBvcnRlZDsKLXN0YXRpYyBpbnQgY291bnRfZXhwb3J0ZWRfYnluYW1lOwotc3RhdGljIGludCBjb3VudF93aXRoX29yZGluYWxzOwotc3RhdGljIGNvbnN0IGNoYXIgKmRsbF9uYW1lOwotc3RhdGljIGludCBtaW5fb3JkaW5hbCwgbWF4X29yZGluYWw7Ci1zdGF0aWMgaW50ICpleHBvcnRlZF9zeW1ib2xzOwotCi10eXBlZGVmIHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0Ci0gIHsKLSAgICBjaGFyICpzdHJpbmc7Ci0gICAgc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QgKm5leHQ7Ci0gIH0KLWV4Y2x1ZGVfbGlzdF9zdHJ1Y3Q7Ci1zdGF0aWMgc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QgKmV4Y2x1ZGVzID0gMDsKLQotdm9pZAotcGVfZGxsX2FkZF9leGNsdWRlcyAobmV3X2V4Y2x1ZGVzKQotICAgICBjb25zdCBjaGFyICpuZXdfZXhjbHVkZXM7Ci17Ci0gIGNoYXIgKmxvY2FsX2NvcHk7Ci0gIGNoYXIgKmV4Y2x1ZGVfc3RyaW5nOwotCi0gIGxvY2FsX2NvcHkgPSB4c3RyZHVwIChuZXdfZXhjbHVkZXMpOwotCi0gIGV4Y2x1ZGVfc3RyaW5nID0gc3RydG9rIChsb2NhbF9jb3B5LCAiLDoiKTsKLSAgZm9yICg7IGV4Y2x1ZGVfc3RyaW5nOyBleGNsdWRlX3N0cmluZyA9IHN0cnRvayAoTlVMTCwgIiw6IikpCi0gICAgewotICAgICAgc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QgKm5ld19leGNsdWRlOwotCi0gICAgICBuZXdfZXhjbHVkZSA9ICgoc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QgKikKLQkJICAgICB4bWFsbG9jIChzaXplb2YgKHN0cnVjdCBleGNsdWRlX2xpc3Rfc3RydWN0KSkpOwotICAgICAgbmV3X2V4Y2x1ZGUtPnN0cmluZyA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAoZXhjbHVkZV9zdHJpbmcpICsgMSk7Ci0gICAgICBzdHJjcHkgKG5ld19leGNsdWRlLT5zdHJpbmcsIGV4Y2x1ZGVfc3RyaW5nKTsKLSAgICAgIG5ld19leGNsdWRlLT5uZXh0ID0gZXhjbHVkZXM7Ci0gICAgICBleGNsdWRlcyA9IG5ld19leGNsdWRlOwotICAgIH0KLQotICBmcmVlIChsb2NhbF9jb3B5KTsKLX0KLQotc3RhdGljIGludAotYXV0b19leHBvcnQgKGQsIG4pCi0gICAgIGRlZl9maWxlICpkOwotICAgICBjb25zdCBjaGFyICpuOwotewotICBpbnQgaTsKLSAgc3RydWN0IGV4Y2x1ZGVfbGlzdF9zdHJ1Y3QgKmV4OwotICBmb3IgKGkgPSAwOyBpIDwgZC0+bnVtX2V4cG9ydHM7IGkrKykKLSAgICBpZiAoc3RyY21wIChkLT5leHBvcnRzW2ldLm5hbWUsIG4pID09IDApCi0gICAgICByZXR1cm4gMDsKLSAgaWYgKHBlX2RsbF9kb19kZWZhdWx0X2V4Y2x1ZGVzKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG4sICJEbGxNYWluQDEyIikgPT0gMCkKLQlyZXR1cm4gMDsKLSAgICAgIGlmIChzdHJjbXAgKG4sICJEbGxFbnRyeVBvaW50QDAiKSA9PSAwKQotCXJldHVybiAwOwotICAgICAgaWYgKHN0cmNtcCAobiwgImltcHVyZV9wdHIiKSA9PSAwKQotCXJldHVybiAwOwotICAgIH0KLSAgZm9yIChleCA9IGV4Y2x1ZGVzOyBleDsgZXggPSBleC0+bmV4dCkKLSAgICBpZiAoc3RyY21wIChuLCBleC0+c3RyaW5nKSA9PSAwKQotICAgICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZAotcHJvY2Vzc19kZWZfZmlsZSAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGksIGo7Ci0gIHN0cnVjdCBiZmRfbGlua19oYXNoX2VudHJ5ICpibGhlOwotICBiZmQgKmI7Ci0gIHN0cnVjdCBzZWMgKnM7Ci0gIGRlZl9maWxlX2V4cG9ydCAqZT0wOwotCi0gIGlmICghcGVfZGVmX2ZpbGUpCi0gICAgcGVfZGVmX2ZpbGUgPSBkZWZfZmlsZV9lbXB0eSAoKTsKLQotICAvKiBGaXJzdCwgcnVuIGFyb3VuZCB0byBhbGwgdGhlIG9iamVjdHMgbG9va2luZyBmb3IgdGhlIC5kcmVjdHZlCi0gICAgIHNlY3Rpb25zLCBhbmQgcHVzaCB0aG9zZSBpbnRvIHRoZSBkZWYgZmlsZSB0b28gKi8KLQotICBmb3IgKGIgPSBpbmZvLT5pbnB1dF9iZmRzOyBiOyBiID0gYi0+bGlua19uZXh0KQotICAgIHsKLSAgICAgIHMgPSBiZmRfZ2V0X3NlY3Rpb25fYnlfbmFtZSAoYiwgIi5kcmVjdHZlIik7Ci0gICAgICBpZiAocykKLQl7Ci0JICBpbnQgc2l6ZSA9IGJmZF9nZXRfc2VjdGlvbl9zaXplX2JlZm9yZV9yZWxvYyAocyk7Ci0JICBjaGFyICpidWYgPSB4bWFsbG9jIChzaXplKTsKLQkgIGJmZF9nZXRfc2VjdGlvbl9jb250ZW50cyAoYiwgcywgYnVmLCAwLCBzaXplKTsKLQkgIGRlZl9maWxlX2FkZF9kaXJlY3RpdmUgKHBlX2RlZl9maWxlLCBidWYsIHNpemUpOwotCSAgZnJlZSAoYnVmKTsKLQl9Ci0gICAgfQotCi0gIC8qIE5vdywgbWF5YmUgZXhwb3J0IGV2ZXJ5dGhpbmcgZWxzZSB0aGUgZGVmYXVsdCB3YXkgKi8KLQotICBpZiAocGVfZGxsX2V4cG9ydF9ldmVyeXRoaW5nIHx8IHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cyA9PSAwKQotICAgIHsKLSAgICAgIGZvciAoYiA9IGluZm8tPmlucHV0X2JmZHM7IGI7IGIgPSBiLT5saW5rX25leHQpCi0JewotCSAgYXN5bWJvbCAqKnN5bWJvbHM7Ci0JICBpbnQgbnN5bXMsIHN5bXNpemU7Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYik7Ci0JICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgbnN5bXMgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYiwgc3ltYm9scyk7Ci0KLQkgIGZvciAoaiA9IDA7IGogPCBuc3ltczsgaisrKQotCSAgICB7Ci0JICAgICAgaWYgKChzeW1ib2xzW2pdLT5mbGFncyAmIChCU0ZfRlVOQ1RJT04gfCBCU0ZfR0xPQkFMKSkKLQkJICA9PSAoQlNGX0ZVTkNUSU9OIHwgQlNGX0dMT0JBTCkpCi0JCXsKLQkJICBjb25zdCBjaGFyICpzbiA9IHN5bWJvbHNbal0tPm5hbWU7Ci0JCSAgaWYgKCpzbiA9PSAnXycpCi0JCSAgICBzbisrOwotCQkgIGlmIChhdXRvX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHNuKSkKLQkJICAgIGRlZl9maWxlX2FkZF9leHBvcnQgKHBlX2RlZl9maWxlLCBzbiwgMCwgLTEpOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jdW5kZWYgTkUKLSNkZWZpbmUgTkUgcGVfZGVmX2ZpbGUtPm51bV9leHBvcnRzCi0KLSAgLyogQ2Fub25pY2FsaXplIHRoZSBleHBvcnQgbGlzdCAqLwotCi0gIGlmIChwZV9kbGxfa2lsbF9hdHMpCi0gICAgewotICAgICAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0JewotCSAgaWYgKHN0cmNociAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSwgJ0AnKSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgd2lsbCBwcmVzZXJ2ZSBpbnRlcm5hbF9uYW1lLCB3aGljaCBtYXkgaGF2ZSBiZWVuIHBvaW50aW5nCi0JICAgICAgICAgdG8gdGhlIHNhbWUgbWVtb3J5IGFzIG5hbWUsIG9yIG1pZ2h0IG5vdCBoYXZlICovCi0JICAgICAgY2hhciAqdG1wID0geHN0cmR1cCAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ubmFtZSk7Ci0JICAgICAgKihzdHJjaHIgKHRtcCwgJ0AnKSkgPSAwOwotCSAgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUgPSB0bXA7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGlmIChwZV9kbGxfc3RkY2FsbF9hbGlhc2VzKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBORTsgaSsrKQotCXsKLQkgIGlmIChzdHJjaHIgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUsICdAJykpCi0JICAgIHsKLQkgICAgICBjaGFyICp0bXAgPSB4c3RyZHVwIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lKTsKLQkgICAgICAqKHN0cmNociAodG1wLCAnQCcpKSA9IDA7Ci0JICAgICAgaWYgKGF1dG9fZXhwb3J0IChwZV9kZWZfZmlsZSwgdG1wKSkKLQkJZGVmX2ZpbGVfYWRkX2V4cG9ydCAocGVfZGVmX2ZpbGUsIHRtcCwKLQkJCQkgICAgIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUsIC0xKTsKLQkgICAgICBlbHNlCi0JCWZyZWUgKHRtcCk7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gIGUgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0czsgLyogY29udmVuaWVuY2UsIGJ1dCB3YXRjaCBvdXQgZm9yIGl0IGNoYW5naW5nICovCi0KLSAgZXhwb3J0ZWRfc3ltYm9sX29mZnNldHMgPSAoYmZkX3ZtYSAqKSB4bWFsbG9jIChORSAqIHNpemVvZiAoYmZkX3ZtYSkpOwotICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnMgPSAoc3RydWN0IHNlYyAqKikgeG1hbGxvYyAoTkUgKiBzaXplb2YgKHN0cnVjdCBzZWMgKikpOwotCi0gIG1lbXNldCAoZXhwb3J0ZWRfc3ltYm9sX3NlY3Rpb25zLCAwLCBORSAqIHNpemVvZiAoc3RydWN0IHNlYyAqKSk7Ci0gIG1heF9vcmRpbmFsID0gMDsKLSAgbWluX29yZGluYWwgPSA2NTUzNjsKLSAgY291bnRfZXhwb3J0ZWQgPSAwOwotICBjb3VudF9leHBvcnRlZF9ieW5hbWUgPSAwOwotICBjb3VudF93aXRoX29yZGluYWxzID0gMDsKLQotICBxc29ydCAocGVfZGVmX2ZpbGUtPmV4cG9ydHMsIE5FLCBzaXplb2YgKHBlX2RlZl9maWxlLT5leHBvcnRzWzBdKSwgcGVfZXhwb3J0X3NvcnQpOwotICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IE5FOyBpKyspCi0gICAgewotICAgICAgaWYgKGkgPiAwICYmIHN0cmNtcCAoZVtpXS5uYW1lLCBlW2kgLSAxXS5uYW1lKSA9PSAwKQotCXsKLQkgIC8qIFRoaXMgaXMgYSBkdXBsaWNhdGUgKi8KLQkgIGlmIChlW2ogLSAxXS5vcmRpbmFsICE9IC0xCi0JICAgICAgJiYgZVtpXS5vcmRpbmFsICE9IC0xCi0JICAgICAgJiYgZVtqIC0gMV0ub3JkaW5hbCAhPSBlW2ldLm9yZGluYWwpCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIGVpbmZvIChfKCIlWEVycm9yLCBkdXBsaWNhdGUgRVhQT1JUIHdpdGggb3JpZGluYWxzOiAlcyAoJWQgdnMgJWQpXG4iKSwKLQkJICAgICBlW2ogLSAxXS5uYW1lLCBlW2ogLSAxXS5vcmRpbmFsLCBlW2ldLm9yZGluYWwpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIGVpbmZvIChfKCJXYXJuaW5nLCBkdXBsaWNhdGUgRVhQT1JUOiAlc1xuIiksCi0JCSAgICAgZVtqIC0gMV0ubmFtZSk7Ci0JICAgIH0KLQkgIGlmIChlW2ldLm9yZGluYWwpCi0JICAgIGVbaiAtIDFdLm9yZGluYWwgPSBlW2ldLm9yZGluYWw7Ci0JICBlW2ogLSAxXS5mbGFnX3ByaXZhdGUgfD0gZVtpXS5mbGFnX3ByaXZhdGU7Ci0JICBlW2ogLSAxXS5mbGFnX2NvbnN0YW50IHw9IGVbaV0uZmxhZ19jb25zdGFudDsKLQkgIGVbaiAtIDFdLmZsYWdfbm9uYW1lIHw9IGVbaV0uZmxhZ19ub25hbWU7Ci0JICBlW2ogLSAxXS5mbGFnX2RhdGEgfD0gZVtpXS5mbGFnX2RhdGE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChpICE9IGopCi0JICAgIGVbal0gPSBlW2ldOwotCSAgaisrOwotCX0KLSAgICB9Ci0gIHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cyA9IGo7CS8qID09IE5FICovCi0KLSAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0gICAgewotICAgICAgY2hhciAqbmFtZSA9IChjaGFyICopIHhtYWxsb2MgKHN0cmxlbiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSkgKyAyKTsKLSAgICAgIGlmIChwZV9kZXRhaWxzLT51bmRlcnNjb3JlZCkKLQl7Ci0JICAqbmFtZSA9ICdfJzsKLQkgIHN0cmNweSAobmFtZSArIDEsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGVsc2UKLQlzdHJjcHkgKG5hbWUsIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCi0gICAgICBibGhlID0gYmZkX2xpbmtfaGFzaF9sb29rdXAgKGluZm8tPmhhc2gsCi0JCQkJICAgbmFtZSwKLQkJCQkgICBmYWxzZSwgZmFsc2UsIHRydWUpOwotCi0gICAgICBpZiAoYmxoZSAmJiAoYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX2RlZmluZWQpKQotCXsKLQkgIGNvdW50X2V4cG9ydGVkKys7Ci0JICBpZiAoIXBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmZsYWdfbm9uYW1lKQotCSAgICBjb3VudF9leHBvcnRlZF9ieW5hbWUrKzsKLQkgIGV4cG9ydGVkX3N5bWJvbF9vZmZzZXRzW2ldID0gYmxoZS0+dS5kZWYudmFsdWU7Ci0JICBleHBvcnRlZF9zeW1ib2xfc2VjdGlvbnNbaV0gPSBibGhlLT51LmRlZi5zZWN0aW9uOwotCSAgaWYgKHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgIT0gLTEpCi0JICAgIHsKLQkgICAgICBpZiAobWF4X29yZGluYWwgPCBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsKQotCQltYXhfb3JkaW5hbCA9IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWw7Ci0JICAgICAgaWYgKG1pbl9vcmRpbmFsID4gcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCkKLQkJbWluX29yZGluYWwgPSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsOwotCSAgICAgIGNvdW50X3dpdGhfb3JkaW5hbHMrKzsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKGJsaGUgJiYgYmxoZS0+dHlwZSA9PSBiZmRfbGlua19oYXNoX3VuZGVmaW5lZCkKLQl7Ci0JICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgZWluZm8gKF8oIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIG5vdCBkZWZpbmVkXG4iKSwKLQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJsaGUpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIGVpbmZvIChfKCIlWENhbm5vdCBleHBvcnQgJXM6IHN5bWJvbCB3cm9uZyB0eXBlICglZCB2cyAlZClcbiIpLAotCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0uaW50ZXJuYWxfbmFtZSwKLQkJIGJsaGUtPnR5cGUsIGJmZF9saW5rX2hhc2hfZGVmaW5lZCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBlaW5mbyAoXygiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGZvdW5kXG4iKSwKLQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUpOwotCX0KLSAgICAgIGZyZWUgKG5hbWUpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gQnVpbGQgdGhlIGJmZCB0aGF0IHdpbGwgY29udGFpbiAuZWRhdGEgYW5kIC5yZWxvYyBzZWN0aW9ucwotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfZmlsbGVyX2JmZCAoaW5jbHVkZV9lZGF0YSkKLSAgICAgaW50IGluY2x1ZGVfZWRhdGE7Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZpbGxlcl9maWxlOwotICBmaWxsZXJfZmlsZSA9IGxhbmdfYWRkX2lucHV0X2ZpbGUgKCJkbGwgc3R1ZmYiLAotCQkJCSAgICAgbGFuZ19pbnB1dF9maWxlX2lzX2Zha2VfZW51bSwKLQkJCQkgICAgIE5VTEwpOwotICBmaWxsZXJfZmlsZS0+dGhlX2JmZCA9IGZpbGxlcl9iZmQgPSBiZmRfY3JlYXRlICgiZGxsIHN0dWZmIiwgb3V0cHV0X2JmZCk7Ci0gIGlmIChmaWxsZXJfYmZkID09IE5VTEwKLSAgICAgIHx8ICFiZmRfc2V0X2FyY2hfbWFjaCAoZmlsbGVyX2JmZCwKLQkJCSAgICAgYmZkX2dldF9hcmNoIChvdXRwdXRfYmZkKSwKLQkJCSAgICAgYmZkX2dldF9tYWNoIChvdXRwdXRfYmZkKSkpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSBCRkQgJUVcbiIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBpZiAoaW5jbHVkZV9lZGF0YSkKLSAgICB7Ci0gICAgICBlZGF0YV9zID0gYmZkX21ha2Vfc2VjdGlvbl9vbGRfd2F5IChmaWxsZXJfYmZkLCAiLmVkYXRhIik7Ci0gICAgICBpZiAoZWRhdGFfcyA9PSBOVUxMCi0JICB8fCAhYmZkX3NldF9zZWN0aW9uX2ZsYWdzIChmaWxsZXJfYmZkLCBlZGF0YV9zLAotCQkJCSAgICAgKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgICAgICB8IFNFQ19BTExPQwotCQkJCSAgICAgIHwgU0VDX0xPQUQKLQkJCQkgICAgICB8IFNFQ19LRUVQCi0JCQkJICAgICAgfCBTRUNfSU5fTUVNT1JZKSkpCi0JewotCSAgZWluZm8gKCIlWCVQOiBjYW4gbm90IGNyZWF0ZSAuZWRhdGEgc2VjdGlvbjogJUVcbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChmaWxsZXJfYmZkLCBlZGF0YV9zLCBlZGF0YV9zeik7Ci0gICAgfQotCi0gIHJlbG9jX3MgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGZpbGxlcl9iZmQsICIucmVsb2MiKTsKLSAgaWYgKHJlbG9jX3MgPT0gTlVMTAotICAgICAgfHwgIWJmZF9zZXRfc2VjdGlvbl9mbGFncyAoZmlsbGVyX2JmZCwgcmVsb2NfcywKLQkJCQkgKFNFQ19IQVNfQ09OVEVOVFMKLQkJCQkgIHwgU0VDX0FMTE9DCi0JCQkJICB8IFNFQ19MT0FECi0JCQkJICB8IFNFQ19LRUVQCi0JCQkJICB8IFNFQ19JTl9NRU1PUlkpKSkKLSAgICB7Ci0gICAgICBlaW5mbyAoIiVYJVA6IGNhbiBub3QgY3JlYXRlIC5yZWxvYyBzZWN0aW9uOiAlRVxuIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgcmVsb2NfcywgMCk7Ci0KLSAgbGRsYW5nX2FkZF9maWxlIChmaWxsZXJfZmlsZSk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEdhdGhlciBhbGwgdGhlIGV4cG9ydGVkIHN5bWJvbHMgYW5kIGJ1aWxkIHRoZSAuZWRhdGEgc2VjdGlvbgotCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZAotZ2VuZXJhdGVfZWRhdGEgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIGludCBpLCBuZXh0X29yZGluYWw7Ci0gIGludCBuYW1lX3RhYmxlX3NpemUgPSAwOwotICBjb25zdCBjaGFyICpkbG5wOwotCi0gIC8qIEZpcnN0LCB3ZSBuZWVkIHRvIGtub3cgaG93IG1hbnkgZXhwb3J0ZWQgc3ltYm9scyB0aGVyZSBhcmUsCi0gICAgIGFuZCB3aGF0IHRoZSByYW5nZSBvZiBvcmRpbmFscyBpcy4gKi8KLQotICBpZiAocGVfZGVmX2ZpbGUtPm5hbWUpCi0gICAgewotICAgICAgZGxsX25hbWUgPSBwZV9kZWZfZmlsZS0+bmFtZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBkbGxfbmFtZSA9IGFiZmQtPmZpbGVuYW1lOwotICAgICAgZm9yIChkbG5wID0gZGxsX25hbWU7ICpkbG5wOyBkbG5wKyspCi0JewotCSAgaWYgKCpkbG5wID09ICdcXCcgfHwgKmRsbnAgPT0gJy8nIHx8ICpkbG5wID09ICc6JykKLQkgICAgZGxsX25hbWUgPSBkbG5wICsgMTsKLQl9Ci0gICAgfQotCi0gIGlmIChjb3VudF93aXRoX29yZGluYWxzICYmIG1heF9vcmRpbmFsID4gY291bnRfZXhwb3J0ZWQpCi0gICAgewotICAgICAgaWYgKG1pbl9vcmRpbmFsID4gbWF4X29yZGluYWwgLSBjb3VudF9leHBvcnRlZCArIDEpCi0JbWluX29yZGluYWwgPSBtYXhfb3JkaW5hbCAtIGNvdW50X2V4cG9ydGVkICsgMTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBtaW5fb3JkaW5hbCA9IDE7Ci0gICAgICBtYXhfb3JkaW5hbCA9IGNvdW50X2V4cG9ydGVkOwotICAgIH0KLSAgZXhwb3J0X3RhYmxlX3NpemUgPSBtYXhfb3JkaW5hbCAtIG1pbl9vcmRpbmFsICsgMTsKLQotICBleHBvcnRlZF9zeW1ib2xzID0gKGludCAqKSB4bWFsbG9jIChleHBvcnRfdGFibGVfc2l6ZSAqIHNpemVvZiAoaW50KSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBleHBvcnRfdGFibGVfc2l6ZTsgaSsrKQotICAgIGV4cG9ydGVkX3N5bWJvbHNbaV0gPSAtMTsKLQotICAvKiBOb3cgd2UgbmVlZCB0byBhc3NpZ24gb3JkaW5hbHMgdG8gdGhvc2UgdGhhdCBkb24ndCBoYXZlIHRoZW0gKi8KLSAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0gICAgewotICAgICAgaWYgKGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSkKLQl7Ci0JICBpZiAocGVfZGVmX2ZpbGUtPmV4cG9ydHNbaV0ub3JkaW5hbCAhPSAtMSkKLQkgICAgewotCSAgICAgIGludCBlaSA9IHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm9yZGluYWwgLSBtaW5fb3JkaW5hbDsKLQkgICAgICBpbnQgcGkgPSBleHBvcnRlZF9zeW1ib2xzW2VpXTsKLQkgICAgICBpZiAocGkgIT0gLTEpCi0JCXsKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIGVpbmZvIChfKCIlWEVycm9yLCBvcmlkaW5hbCB1c2VkIHR3aWNlOiAlZCAoJXMgdnMgJXMpXG4iKSwKLQkJCSBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsLAotCQkJIHBlX2RlZl9maWxlLT5leHBvcnRzW2ldLm5hbWUsCi0JCQkgcGVfZGVmX2ZpbGUtPmV4cG9ydHNbcGldLm5hbWUpOwotCQl9Ci0JICAgICAgZXhwb3J0ZWRfc3ltYm9sc1tlaV0gPSBpOwotCSAgICB9Ci0JICBuYW1lX3RhYmxlX3NpemUgKz0gc3RybGVuIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5uYW1lKSArIDE7Ci0JfQotICAgIH0KLQotICBuZXh0X29yZGluYWwgPSBtaW5fb3JkaW5hbDsKLSAgZm9yIChpID0gMDsgaSA8IE5FOyBpKyspCi0gICAgaWYgKGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tpXSkKLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsID09IC0xKQotCXsKLQkgIHdoaWxlIChleHBvcnRlZF9zeW1ib2xzW25leHRfb3JkaW5hbCAtIG1pbl9vcmRpbmFsXSAhPSAtMSkKLQkgICAgbmV4dF9vcmRpbmFsKys7Ci0JICBleHBvcnRlZF9zeW1ib2xzW25leHRfb3JkaW5hbCAtIG1pbl9vcmRpbmFsXSA9IGk7Ci0JICBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tpXS5vcmRpbmFsID0gbmV4dF9vcmRpbmFsOwotCX0KLQotICAvKiBPSywgbm93IHdlIGNhbiBhbGxvY2F0ZSBzb21lIG1lbW9yeSAqLwotCi0gIGVkYXRhX3N6ID0gKDQwCQkvKiBkaXJlY3RvcnkgKi8KLQkgICAgICArIDQgKiBleHBvcnRfdGFibGVfc2l6ZQkvKiBhZGRyZXNzZXMgKi8KLQkgICAgICArIDQgKiBjb3VudF9leHBvcnRlZF9ieW5hbWUJLyogbmFtZSBwdHJzICovCi0JICAgICAgKyAyICogY291bnRfZXhwb3J0ZWRfYnluYW1lCS8qIG9yZGluYWxzICovCi0JICAgICAgKyBuYW1lX3RhYmxlX3NpemUgKyBzdHJsZW4gKGRsbF9uYW1lKSArIDEpOwotfQotCi1zdGF0aWMgdm9pZAotZmlsbF9lZGF0YSAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGksIGhpbnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKmVkaXJlY3Rvcnk7Ci0gIHVuc2lnbmVkIGxvbmcgKmVhZGRyZXNzZXM7Ci0gIHVuc2lnbmVkIGxvbmcgKmVuYW1lcHRyczsKLSAgdW5zaWduZWQgc2hvcnQgKmVvcmRpbmFsczsKLSAgdW5zaWduZWQgY2hhciAqZW5hbWVzdHI7Ci0gIHRpbWVfdCBub3c7Ci0KLSAgdGltZSAoJm5vdyk7Ci0KLSAgZWRhdGFfZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGVkYXRhX3N6KTsKLQotICAvKiBOb3RlIHVzZSBvZiBhcnJheSBwb2ludGVyIG1hdGggaGVyZSAqLwotICBlZGlyZWN0b3J5ID0gZWRhdGFfZDsKLSAgZWFkZHJlc3NlcyA9ICh1bnNpZ25lZCBsb25nICopIChlZGF0YV9kICsgNDApOwotICBlbmFtZXB0cnMgPSBlYWRkcmVzc2VzICsgZXhwb3J0X3RhYmxlX3NpemU7Ci0gIGVvcmRpbmFscyA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoZW5hbWVwdHJzICsgY291bnRfZXhwb3J0ZWRfYnluYW1lKTsKLSAgZW5hbWVzdHIgPSAoY2hhciAqKSAoZW9yZGluYWxzICsgY291bnRfZXhwb3J0ZWRfYnluYW1lKTsKLQotI2RlZmluZSBFUlZBKHB0cikgKCgodW5zaWduZWQgY2hhciAqKShwdHIpIC0gZWRhdGFfZCkgKyBlZGF0YV9zLT5vdXRwdXRfc2VjdGlvbi0+dm1hIC0gaW1hZ2VfYmFzZSkKLQotICBtZW1zZXQgKGVkYXRhX2QsIDAsIDQwKTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgbm93LCBlZGF0YV9kICsgNCk7Ci0gIGlmIChwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciAhPSAtMSkKLSAgICB7Ci0gICAgICBiZmRfcHV0XzE2IChhYmZkLCBwZV9kZWZfZmlsZS0+dmVyc2lvbl9tYWpvciwgZWRhdGFfZCArIDgpOwotICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3IsIGVkYXRhX2QgKyAxMCk7Ci0gICAgfQotICBiZmRfcHV0XzMyIChhYmZkLCBFUlZBIChlbmFtZXN0ciksIGVkYXRhX2QgKyAxMik7Ci0gIHN0cmNweSAoZW5hbWVzdHIsIGRsbF9uYW1lKTsKLSAgZW5hbWVzdHIgKz0gc3RybGVuIChlbmFtZXN0cikgKyAxOwotICBiZmRfcHV0XzMyIChhYmZkLCBtaW5fb3JkaW5hbCwgZWRhdGFfZCArIDE2KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgZXhwb3J0X3RhYmxlX3NpemUsIGVkYXRhX2QgKyAyMCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIGNvdW50X2V4cG9ydGVkX2J5bmFtZSwgZWRhdGFfZCArIDI0KTsKLSAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZWFkZHJlc3NlcyksIGVkYXRhX2QgKyAyOCk7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVuYW1lcHRycyksIGVkYXRhX2QgKyAzMik7Ci0gIGJmZF9wdXRfMzIgKGFiZmQsIEVSVkEgKGVvcmRpbmFscyksIGVkYXRhX2QgKyAzNik7Ci0KLSAgLyogT2ssIG5vdyBmb3IgdGhlIGZpbGxpbmcgaW4gcGFydCAqLwotICBoaW50ID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IGV4cG9ydF90YWJsZV9zaXplOyBpKyspCi0gICAgewotICAgICAgaW50IHMgPSBleHBvcnRlZF9zeW1ib2xzW2ldOwotICAgICAgaWYgKHMgIT0gLTEpCi0JewotCSAgc3RydWN0IHNlYyAqc3NlYyA9IGV4cG9ydGVkX3N5bWJvbF9zZWN0aW9uc1tzXTsKLQkgIHVuc2lnbmVkIGxvbmcgc3J2YSA9IChleHBvcnRlZF9zeW1ib2xfb2Zmc2V0c1tzXQotCQkJCSsgc3NlYy0+b3V0cHV0X3NlY3Rpb24tPnZtYQotCQkJCSsgc3NlYy0+b3V0cHV0X29mZnNldCk7Ci0KLQkgIGJmZF9wdXRfMzIgKGFiZmQsIHNydmEgLSBpbWFnZV9iYXNlLCAodm9pZCAqKSAoZWFkZHJlc3NlcyArIGkpKTsKLQkgIGlmICghcGVfZGVmX2ZpbGUtPmV4cG9ydHNbc10uZmxhZ19ub25hbWUpCi0JICAgIHsKLQkgICAgICBjaGFyICplbmFtZSA9IHBlX2RlZl9maWxlLT5leHBvcnRzW3NdLm5hbWU7Ci0JICAgICAgYmZkX3B1dF8zMiAoYWJmZCwgRVJWQSAoZW5hbWVzdHIpLCAodm9pZCAqKSBlbmFtZXB0cnMpOwotCSAgICAgIHN0cmNweSAoZW5hbWVzdHIsIGVuYW1lKTsKLQkgICAgICBlbmFtZXN0ciArPSBzdHJsZW4gKGVuYW1lc3RyKSArIDE7Ci0JICAgICAgYmZkX3B1dF8xNiAoYWJmZCwgaSwgKHZvaWQgKikgZW9yZGluYWxzKTsKLQkgICAgICBlbmFtZXB0cnMrKzsKLQkgICAgICBwZV9kZWZfZmlsZS0+ZXhwb3J0c1tzXS5oaW50ID0gaGludCsrOwotCSAgICB9Ci0JICBlb3JkaW5hbHMrKzsKLQl9Ci0gICAgfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSBHYXRoZXIgYWxsIHRoZSByZWxvY2F0aW9ucyBhbmQgYnVpbGQgdGhlIC5yZWxvYyBzZWN0aW9uCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkCi1nZW5lcmF0ZV9yZWxvYyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLQotICAvKiBmb3IgLnJlbG9jIHN0dWZmICovCi0gIHJlbG9jX2RhdGFfdHlwZSAqcmVsb2NfZGF0YTsKLSAgaW50IHRvdGFsX3JlbG9jcyA9IDA7Ci0gIGludCBpOwotICB1bnNpZ25lZCBsb25nIHNlY19wYWdlID0gKHVuc2lnbmVkIGxvbmcpICgtMSk7Ci0gIHVuc2lnbmVkIGxvbmcgcGFnZV9wdHIsIHBhZ2VfY291bnQ7Ci0gIGludCBiaTsKLSAgYmZkICpiOwotICBzdHJ1Y3Qgc2VjICpzOwotCi0gIHRvdGFsX3JlbG9jcyA9IDA7Ci0gIGZvciAoYiA9IGluZm8tPmlucHV0X2JmZHM7IGI7IGIgPSBiLT5saW5rX25leHQpCi0gICAgZm9yIChzID0gYi0+c2VjdGlvbnM7IHM7IHMgPSBzLT5uZXh0KQotICAgICAgdG90YWxfcmVsb2NzICs9IHMtPnJlbG9jX2NvdW50OwotCi0gIHJlbG9jX2RhdGEgPSAocmVsb2NfZGF0YV90eXBlICopIHhtYWxsb2MgKHRvdGFsX3JlbG9jcyAqIHNpemVvZiAocmVsb2NfZGF0YV90eXBlKSk7Ci0KLSAgdG90YWxfcmVsb2NzID0gMDsKLSAgYmkgPSAwOwotICBmb3IgKGJpID0gMCwgYiA9IGluZm8tPmlucHV0X2JmZHM7IGI7IGJpKyssIGIgPSBiLT5saW5rX25leHQpCi0gICAgewotICAgICAgYXJlbGVudCAqKnJlbG9jczsKLSAgICAgIGludCByZWxzaXplLCBucmVsb2NzLCBpOwotCi0gICAgICBmb3IgKHMgPSBiLT5zZWN0aW9uczsgczsgcyA9IHMtPm5leHQpCi0JewotCSAgdW5zaWduZWQgbG9uZyBzZWNfdm1hID0gcy0+b3V0cHV0X3NlY3Rpb24tPnZtYSArIHMtPm91dHB1dF9vZmZzZXQ7Ci0JICBhc3ltYm9sICoqc3ltYm9sczsKLQkgIGludCBuc3ltcywgc3ltc2l6ZTsKLQotCSAgLyogaWYgaXQncyBub3QgbG9hZGVkLCB3ZSBkb24ndCBuZWVkIHRvIHJlbG9jYXRlIGl0IHRoaXMgd2F5ICovCi0JICBpZiAoIShzLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNfTE9BRCkpCi0JICAgIGNvbnRpbnVlOwotCi0JICAvKiBJIGRvbid0IGtub3cgd2h5IHRoZXJlIHdvdWxkIGJlIGEgcmVsb2MgZm9yIHRoZXNlLCBidXQgSSd2ZQotCSAgICAgc2VlbiBpdCBoYXBwZW4gLSBESiAqLwotCSAgaWYgKHMtPm91dHB1dF9zZWN0aW9uID09ICZiZmRfYWJzX3NlY3Rpb24pCi0JICAgIGNvbnRpbnVlOwotCi0JICBpZiAocy0+b3V0cHV0X3NlY3Rpb24tPnZtYSA9PSAwKQotCSAgICB7Ci0JICAgICAgLyogSHVoPyAgU2hvdWxkbid0IGhhcHBlbiwgYnV0IHB1bnQgaWYgaXQgZG9lcyAqLwotCSAgICAgIGVpbmZvICgiREo6IHplcm8gdm1hIHNlY3Rpb24gcmVsb2MgZGV0ZWN0ZWQ6IGAlcycgIyVkIGY9JWRcbiIsCi0JCSAgICAgcy0+b3V0cHV0X3NlY3Rpb24tPm5hbWUsIHMtPm91dHB1dF9zZWN0aW9uLT5pbmRleCwKLQkJICAgICBzLT5vdXRwdXRfc2VjdGlvbi0+ZmxhZ3MpOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIHN5bXNpemUgPSBiZmRfZ2V0X3N5bXRhYl91cHBlcl9ib3VuZCAoYik7Ci0JICBzeW1ib2xzID0gKGFzeW1ib2wgKiopIHhtYWxsb2MgKHN5bXNpemUpOwotCSAgbnN5bXMgPSBiZmRfY2Fub25pY2FsaXplX3N5bXRhYiAoYiwgc3ltYm9scyk7Ci0KLQkgIHJlbHNpemUgPSBiZmRfZ2V0X3JlbG9jX3VwcGVyX2JvdW5kIChiLCBzKTsKLQkgIHJlbG9jcyA9IChhcmVsZW50ICoqKSB4bWFsbG9jICgoc2l6ZV90KSByZWxzaXplKTsKLQkgIG5yZWxvY3MgPSBiZmRfY2Fub25pY2FsaXplX3JlbG9jIChiLCBzLCByZWxvY3MsIHN5bWJvbHMpOwotCi0JICBmb3IgKGkgPSAwOyBpIDwgbnJlbG9jczsgaSsrKQotCSAgICB7Ci0JICAgICAgaWYgKCFyZWxvY3NbaV0tPmhvd3RvLT5wY19yZWxhdGl2ZQotCQkgICYmIHJlbG9jc1tpXS0+aG93dG8tPnR5cGUgIT0gcGVfZGV0YWlscy0+aW1hZ2ViYXNlX3JlbG9jKQotCQl7Ci0JCSAgYmZkX3ZtYSBzeW1fdm1hOwotCQkgIHN0cnVjdCBzeW1ib2xfY2FjaGVfZW50cnkgKnN5bSA9ICpyZWxvY3NbaV0tPnN5bV9wdHJfcHRyOwotCQkgIHN5bV92bWEgPSAocmVsb2NzW2ldLT5hZGRlbmQKLQkJCSAgICAgKyBzeW0tPnZhbHVlCi0JCQkgICAgICsgc3ltLT5zZWN0aW9uLT52bWEKLQkJCSAgICAgKyBzeW0tPnNlY3Rpb24tPm91dHB1dF9vZmZzZXQKLQkJCSAgICAgKyBzeW0tPnNlY3Rpb24tPm91dHB1dF9zZWN0aW9uLT52bWEpOwotCQkgIHJlbG9jX2RhdGFbdG90YWxfcmVsb2NzXS52bWEgPSBzZWNfdm1hICsgcmVsb2NzW2ldLT5hZGRyZXNzOwotCQkgIHN3aXRjaCAocmVsb2NzW2ldLT5ob3d0by0+Yml0c2l6ZSoxMDAwCi0JCQkgICsgcmVsb2NzW2ldLT5ob3d0by0+cmlnaHRzaGlmdCkKLQkJICAgIHsKLQkJICAgIGNhc2UgMzIwMDA6Ci0JCSAgICAgIHJlbG9jX2RhdGFbdG90YWxfcmVsb2NzXS50eXBlID0gMzsKLQkJICAgICAgdG90YWxfcmVsb2NzKys7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICAgICAgZWluZm8gKF8oIiVYRXJyb3I6ICVkLWJpdCByZWxvYyBpbiBkbGxcbiIpLAotCQkJICAgICByZWxvY3NbaV0tPmhvd3RvLT5iaXRzaXplKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCSAgZnJlZSAocmVsb2NzKTsKLQkgIC8qIFdhcm5pbmc6IHRoZSBhbGxvY2F0ZWQgc3ltYm9scyBhcmUgcmVtZW1iZXJlZCBpbiBCRkQgYW5kIHJldXNlZAotCSAgICAgbGF0ZXIsIHNvIGRvbid0IGZyZWUgdGhlbSEgKi8KLQkgIC8qIGZyZWUgKHN5bWJvbHMpOyAqLwotCX0KLSAgICB9Ci0KLSAgLyogQXQgdGhpcyBwb2ludCwgd2UgaGF2ZSB0b3RhbF9yZWxvY3MgcmVsb2NhdGlvbiBhZGRyZXNzZXMgaW4KLSAgICAgcmVsb2NfYWRkcmVzc2VzLCB3aGljaCBhcmUgYWxsIHN1aXRhYmxlIGZvciB0aGUgLnJlbG9jIHNlY3Rpb24uCi0gICAgIFdlIG11c3Qgbm93IGNyZWF0ZSB0aGUgbmV3IHNlY3Rpb25zLiAqLwotCi0gIHFzb3J0IChyZWxvY19kYXRhLCB0b3RhbF9yZWxvY3MsIHNpemVvZiAoKnJlbG9jX2RhdGEpLCByZWxvY19zb3J0KTsKLQotICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfcmVsb2NzOyBpKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyB0aGlzX3BhZ2UgPSAocmVsb2NfZGF0YVtpXS52bWEgPj4gMTIpOwotICAgICAgaWYgKHRoaXNfcGFnZSAhPSBzZWNfcGFnZSkKLQl7Ci0JICByZWxvY19zeiA9IChyZWxvY19zeiArIDMpICYgfjM7CS8qIDQtYnl0ZSBhbGlnbiAqLwotCSAgcmVsb2Nfc3ogKz0gODsKLQkgIHNlY19wYWdlID0gdGhpc19wYWdlOwotCX0KLSAgICAgIHJlbG9jX3N6ICs9IDI7Ci0gICAgfQotICByZWxvY19zeiA9IChyZWxvY19zeiArIDMpICYgfjM7CS8qIDQtYnl0ZSBhbGlnbiAqLwotCi0gIHJlbG9jX2QgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jIChyZWxvY19zeik7Ci0KLSAgc2VjX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgKC0xKTsKLSAgcmVsb2Nfc3ogPSAwOwotICBwYWdlX3B0ciA9ICh1bnNpZ25lZCBsb25nKSAoLTEpOwotICBwYWdlX2NvdW50ID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHRvdGFsX3JlbG9jczsgaSsrKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgcnZhID0gcmVsb2NfZGF0YVtpXS52bWEgLSBpbWFnZV9iYXNlOwotICAgICAgdW5zaWduZWQgbG9uZyB0aGlzX3BhZ2UgPSAocnZhICYgfjB4ZmZmKTsKLSAgICAgIGlmICh0aGlzX3BhZ2UgIT0gc2VjX3BhZ2UpCi0JewotCSAgd2hpbGUgKHJlbG9jX3N6ICYgMykKLQkgICAgcmVsb2NfZFtyZWxvY19zeisrXSA9IDA7Ci0JICBpZiAocGFnZV9wdHIgIT0gKHVuc2lnbmVkIGxvbmcpICgtMSkpCi0JICAgIGJmZF9wdXRfMzIgKGFiZmQsIHJlbG9jX3N6IC0gcGFnZV9wdHIsIHJlbG9jX2QgKyBwYWdlX3B0ciArIDQpOwotCSAgYmZkX3B1dF8zMiAoYWJmZCwgdGhpc19wYWdlLCByZWxvY19kICsgcmVsb2Nfc3opOwotCSAgcGFnZV9wdHIgPSByZWxvY19zejsKLQkgIHJlbG9jX3N6ICs9IDg7Ci0JICBzZWNfcGFnZSA9IHRoaXNfcGFnZTsKLQkgIHBhZ2VfY291bnQgPSAwOwotCX0KLSAgICAgIGJmZF9wdXRfMTYgKGFiZmQsIChydmEgJiAweGZmZikgKyAocmVsb2NfZGF0YVtpXS50eXBlPDwxMiksCi0JCSAgcmVsb2NfZCArIHJlbG9jX3N6KTsKLSAgICAgIHJlbG9jX3N6ICs9IDI7Ci0gICAgICBpZiAocmVsb2NfZGF0YVtpXS50eXBlID09IDQpCi0JewotCSAgYmZkX3B1dF8xNiAoYWJmZCwgcmVsb2NfZGF0YVtpXS5leHRyYSwgcmVsb2NfZCArIHJlbG9jX3N6KTsKLQkgIHJlbG9jX3N6ICs9IDI7Ci0JfQotICAgICAgcGFnZV9jb3VudCsrOwotICAgIH0KLSAgd2hpbGUgKHJlbG9jX3N6ICYgMykKLSAgICByZWxvY19kW3JlbG9jX3N6KytdID0gMDsKLSAgaWYgKHBhZ2VfcHRyICE9ICh1bnNpZ25lZCBsb25nKSAoLTEpKQotICAgIGJmZF9wdXRfMzIgKGFiZmQsIHJlbG9jX3N6IC0gcGFnZV9wdHIsIHJlbG9jX2QgKyBwYWdlX3B0ciArIDQpOwotICB3aGlsZSAocmVsb2Nfc3ogPCByZWxvY19zLT5fcmF3X3NpemUpCi0gICAgcmVsb2NfZFtyZWxvY19zeisrXSA9IDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIEdpdmVuIHRoZSBleGl0aW5nIGRlZl9maWxlIHN0cnVjdHVyZSwgcHJpbnQgb3V0IGEgLkRFRiBmaWxlIHRoYXQKLSBjb3JyZXNwb25kcyB0byBpdC4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKLXF1b3RlcHV0IChzLCBmLCBuZWVkc19xdW90ZXMpCi0gICAgIGNoYXIgKnM7Ci0gICAgIEZJTEUgKiBmOwotICAgICBpbnQgbmVlZHNfcXVvdGVzOwotewotICBjaGFyICpjcDsKLSAgZm9yIChjcCA9IHM7ICpjcDsgY3ArKykKLSAgICBpZiAoKmNwID09ICdcJycKLQl8fCAqY3AgPT0gJyInCi0JfHwgKmNwID09ICdcXCcKLQl8fCBpc3NwYWNlICgodW5zaWduZWQgY2hhcikgKmNwKQotCXx8ICpjcCA9PSAnLCcKLQl8fCAqY3AgPT0gJzsnKQotICAgICAgbmVlZHNfcXVvdGVzID0gMTsKLSAgaWYgKG5lZWRzX3F1b3RlcykKLSAgICB7Ci0gICAgICBwdXRjICgnIicsIGYpOwotICAgICAgd2hpbGUgKCpzKQotCXsKLQkgIGlmICgqcyA9PSAnIicgfHwgKnMgPT0gJ1xcJykKLQkgICAgcHV0YyAoJ1xcJywgZik7Ci0JICBwdXRjICgqcywgZik7Ci0JICBzKys7Ci0JfQotICAgICAgcHV0YyAoJyInLCBmKTsKLSAgICB9Ci0gIGVsc2UKLSAgICBmcHV0cyAocywgZik7Ci19Ci0KLXZvaWQKLXBlX2RsbF9nZW5lcmF0ZV9kZWZfZmlsZSAocGVfb3V0X2RlZl9maWxlbmFtZSkKLSAgICAgY2hhciAqcGVfb3V0X2RlZl9maWxlbmFtZTsKLXsKLSAgaW50IGk7Ci0gIEZJTEUgKm91dCA9IGZvcGVuIChwZV9vdXRfZGVmX2ZpbGVuYW1lLCAidyIpOwotICBpZiAob3V0ID09IE5VTEwpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGVpbmZvIChfKCIlczogQ2FuJ3Qgb3BlbiBvdXRwdXQgZGVmIGZpbGUgJXNcbiIpLAotCSAgICAgcHJvZ3JhbV9uYW1lLCBwZV9vdXRfZGVmX2ZpbGVuYW1lKTsKLSAgICB9Ci0KLSAgaWYgKHBlX2RlZl9maWxlKQotICAgIHsKLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+bmFtZSkKLQl7Ci0JICBpZiAocGVfZGVmX2ZpbGUtPmlzX2RsbCkKLQkgICAgZnByaW50ZiAob3V0LCAiTElCUkFSWSAiKTsKLQkgIGVsc2UKLQkgICAgZnByaW50ZiAob3V0LCAiTkFNRSAiKTsKLQkgIHF1b3RlcHV0IChwZV9kZWZfZmlsZS0+bmFtZSwgb3V0LCAxKTsKLQkgIGlmIChwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSkKLQkgICAgZnByaW50ZiAob3V0LCAiIEJBU0U9MHglbHgiLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSBwZV9kYXRhIChvdXRwdXRfYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZSk7Ci0JICBmcHJpbnRmIChvdXQsICJcbiIpOwotCX0KLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5kZXNjcmlwdGlvbikKLQl7Ci0JICBmcHJpbnRmIChvdXQsICJERVNDUklQVElPTiAiKTsKLQkgIHF1b3RlcHV0IChwZV9kZWZfZmlsZS0+ZGVzY3JpcHRpb24sIG91dCwgMSk7Ci0JICBmcHJpbnRmIChvdXQsICJcbiIpOwotCX0KLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT52ZXJzaW9uX21pbm9yICE9IC0xKQotCWZwcmludGYgKG91dCwgIlZFUlNJT04gJWQuJWRcbiIsIHBlX2RlZl9maWxlLT52ZXJzaW9uX21ham9yLAotCQkgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWlub3IpOwotICAgICAgZWxzZSBpZiAocGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiVkVSU0lPTiAlZFxuIiwgcGVfZGVmX2ZpbGUtPnZlcnNpb25fbWFqb3IpOwotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUgIT0gLTEgfHwgcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJcbiIpOwotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPnN0YWNrX2NvbW1pdCAhPSAtMSkKLQlmcHJpbnRmIChvdXQsICJTVEFDS1NJWkUgMHgleCwweCV4XG4iLAotCQkgcGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUsIHBlX2RlZl9maWxlLT5zdGFja19jb21taXQpOwotICAgICAgZWxzZSBpZiAocGVfZGVmX2ZpbGUtPnN0YWNrX3Jlc2VydmUgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiU1RBQ0tTSVpFIDB4JXhcbiIsIHBlX2RlZl9maWxlLT5zdGFja19yZXNlcnZlKTsKLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+aGVhcF9jb21taXQgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiSEVBUFNJWkUgMHgleCwweCV4XG4iLAotCQkgcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSwgcGVfZGVmX2ZpbGUtPmhlYXBfY29tbWl0KTsKLSAgICAgIGVsc2UgaWYgKHBlX2RlZl9maWxlLT5oZWFwX3Jlc2VydmUgIT0gLTEpCi0JZnByaW50ZiAob3V0LCAiSEVBUFNJWkUgMHgleFxuIiwgcGVfZGVmX2ZpbGUtPmhlYXBfcmVzZXJ2ZSk7Ci0KLSAgICAgIGlmIChwZV9kZWZfZmlsZS0+bnVtX3NlY3Rpb25fZGVmcyA+IDApCi0JewotCSAgZnByaW50ZiAob3V0LCAiXG5TRUNUSU9OU1xuXG4iKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBwZV9kZWZfZmlsZS0+bnVtX3NlY3Rpb25fZGVmczsgaSsrKQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiICAgICIpOwotCSAgICAgIHF1b3RlcHV0IChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLm5hbWUsIG91dCwgMCk7Ci0JICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MpCi0JCXsKLQkJICBmcHJpbnRmIChvdXQsICIgQ0xBU1MgIik7Ci0JCSAgcXVvdGVwdXQgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uY2xhc3MsIG91dCwgMCk7Ci0JCX0KLQkgICAgICBpZiAocGVfZGVmX2ZpbGUtPnNlY3Rpb25fZGVmc1tpXS5mbGFnX3JlYWQpCi0JCWZwcmludGYgKG91dCwgIiBSRUFEIik7Ci0JICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ193cml0ZSkKLQkJZnByaW50ZiAob3V0LCAiIFdSSVRFIik7Ci0JICAgICAgaWYgKHBlX2RlZl9maWxlLT5zZWN0aW9uX2RlZnNbaV0uZmxhZ19leGVjdXRlKQotCQlmcHJpbnRmIChvdXQsICIgRVhFQ1VURSIpOwotCSAgICAgIGlmIChwZV9kZWZfZmlsZS0+c2VjdGlvbl9kZWZzW2ldLmZsYWdfc2hhcmVkKQotCQlmcHJpbnRmIChvdXQsICIgU0hBUkVEIik7Ci0JICAgICAgZnByaW50ZiAob3V0LCAiXG4iKTsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKHBlX2RlZl9maWxlLT5udW1fZXhwb3J0cyA+IDApCi0JewotCSAgZnByaW50ZiAob3V0LCAiXG5FWFBPUlRTXG5cbiIpOwotCSAgZm9yIChpID0gMDsgaSA8IHBlX2RlZl9maWxlLT5udW1fZXhwb3J0czsgaSsrKQotCSAgICB7Ci0JICAgICAgZGVmX2ZpbGVfZXhwb3J0ICplID0gcGVfZGVmX2ZpbGUtPmV4cG9ydHMgKyBpOwotCSAgICAgIGZwcmludGYgKG91dCwgIiAgICAiKTsKLQkgICAgICBxdW90ZXB1dCAoZS0+bmFtZSwgb3V0LCAwKTsKLQkgICAgICBpZiAoZS0+aW50ZXJuYWxfbmFtZSAmJiBzdHJjbXAgKGUtPmludGVybmFsX25hbWUsIGUtPm5hbWUpKQotCQl7Ci0JCSAgZnByaW50ZiAob3V0LCAiID0gIik7Ci0JCSAgcXVvdGVwdXQgKGUtPmludGVybmFsX25hbWUsIG91dCwgMCk7Ci0JCX0KLQkgICAgICBpZiAoZS0+b3JkaW5hbCAhPSAtMSkKLQkJZnByaW50ZiAob3V0LCAiIEAlZCIsIGUtPm9yZGluYWwpOwotCSAgICAgIGlmIChlLT5mbGFnX3ByaXZhdGUpCi0JCWZwcmludGYgKG91dCwgIiBQUklWQVRFIik7Ci0JICAgICAgaWYgKGUtPmZsYWdfY29uc3RhbnQpCi0JCWZwcmludGYgKG91dCwgIiBDT05TVEFOVCIpOwotCSAgICAgIGlmIChlLT5mbGFnX25vbmFtZSkKLQkJZnByaW50ZiAob3V0LCAiIE5PTkFNRSIpOwotCSAgICAgIGlmIChlLT5mbGFnX2RhdGEpCi0JCWZwcmludGYgKG91dCwgIiBEQVRBIik7Ci0KLQkgICAgICBmcHJpbnRmIChvdXQsICJcbiIpOwotCSAgICB9Ci0JfQotCi0gICAgICBpZiAocGVfZGVmX2ZpbGUtPm51bV9pbXBvcnRzID4gMCkKLQl7Ci0JICBmcHJpbnRmIChvdXQsICJcbklNUE9SVFNcblxuIik7Ci0JICBmb3IgKGkgPSAwOyBpIDwgcGVfZGVmX2ZpbGUtPm51bV9pbXBvcnRzOyBpKyspCi0JICAgIHsKLQkgICAgICBkZWZfZmlsZV9pbXBvcnQgKmltID0gcGVfZGVmX2ZpbGUtPmltcG9ydHMgKyBpOwotCSAgICAgIGZwcmludGYgKG91dCwgIiAgICAiKTsKLQkgICAgICBpZiAoaW0tPmludGVybmFsX25hbWUKLQkJICAmJiAoIWltLT5uYW1lIHx8IHN0cmNtcCAoaW0tPmludGVybmFsX25hbWUsIGltLT5uYW1lKSkpCi0JCXsKLQkJICBxdW90ZXB1dCAoaW0tPmludGVybmFsX25hbWUsIG91dCwgMCk7Ci0JCSAgZnByaW50ZiAob3V0LCAiID0gIik7Ci0JCX0KLQkgICAgICBxdW90ZXB1dCAoaW0tPm1vZHVsZS0+bmFtZSwgb3V0LCAwKTsKLQkgICAgICBmcHJpbnRmIChvdXQsICIuIik7Ci0JICAgICAgaWYgKGltLT5uYW1lKQotCQlxdW90ZXB1dCAoaW0tPm5hbWUsIG91dCwgMCk7Ci0JICAgICAgZWxzZQotCQlmcHJpbnRmIChvdXQsICIlZCIsIGltLT5vcmRpbmFsKTsKLQkgICAgICBmcHJpbnRmIChvdXQsICJcbiIpOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIGZwcmludGYgKG91dCwgXygiOyBubyBjb250ZW50cyBhdmFpbGFibGVcbiIpKTsKLQotICBpZiAoZmNsb3NlIChvdXQpID09IEVPRikKLSAgICB7Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZWluZm8gKF8oIiVQOiBFcnJvciBjbG9zaW5nIGZpbGUgYCVzJ1xuIiksIHBlX291dF9kZWZfZmlsZW5hbWUpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gR2VuZXJhdGUgdGhlIGltcG9ydCBsaWJyYXJ5Ci0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhc3ltYm9sICoqc3ltdGFiOwotc3RhdGljIGludCBzeW1wdHI7Ci1zdGF0aWMgaW50IHRtcF9zZXE7Ci1zdGF0aWMgY29uc3QgY2hhciAqZGxsX2ZpbGVuYW1lOwotc3RhdGljIGNoYXIgKmRsbF9zeW1uYW1lOwotCi0jZGVmaW5lIFVORFNFQyAoYXNlY3Rpb24gKikgJmJmZF91bmRfc2VjdGlvbgotCi1zdGF0aWMgYXNlY3Rpb24gKgotcXVpY2tfc2VjdGlvbihhYmZkLCBuYW1lLCBmbGFncywgYWxpZ24pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgaW50IGZsYWdzOwotICAgICBpbnQgYWxpZ247Ci17Ci0gIGFzZWN0aW9uICpzZWM7Ci0gIGFzeW1ib2wgKnN5bTsKLQotICBzZWMgPSBiZmRfbWFrZV9zZWN0aW9uX29sZF93YXkgKGFiZmQsIG5hbWUpOwotICBiZmRfc2V0X3NlY3Rpb25fZmxhZ3MgKGFiZmQsIHNlYywgZmxhZ3MKLQkJCQkgIHwgU0VDX0FMTE9DCi0JCQkJICB8IFNFQ19MT0FECi0JCQkJICB8IFNFQ19LRUVQCi0JCQkgKTsKLSAgYmZkX3NldF9zZWN0aW9uX2FsaWdubWVudCAoYWJmZCwgc2VjLCBhbGlnbik7Ci0gIC8qIHJlbWVtYmVyIHRvIHVuZG8gdGhpcyBiZWZvcmUgdHJ5aW5nIHRvIGxpbmsgaW50ZXJuYWxseSEgKi8KLSAgc2VjLT5vdXRwdXRfc2VjdGlvbiA9IHNlYzsKLQotICBzeW0gPSBiZmRfbWFrZV9lbXB0eV9zeW1ib2wgKGFiZmQpOwotICBzeW10YWJbc3ltcHRyKytdID0gc3ltOwotICBzeW0tPm5hbWUgPSBzZWMtPm5hbWU7Ci0gIHN5bS0+c2VjdGlvbiA9IHNlYzsKLSAgc3ltLT5mbGFncyA9IEJTRl9MT0NBTDsKLSAgc3ltLT52YWx1ZSA9IDA7Ci0KLSAgcmV0dXJuIHNlYzsKLX0KLQotc3RhdGljIHZvaWQKLXF1aWNrX3N5bWJvbCAoYWJmZCwgbjEsIG4yLCBuMywgc2VjLCBmbGFncywgYWRkcikKLSAgICAgYmZkICphYmZkOwotICAgICBjaGFyICpuMTsKLSAgICAgY2hhciAqbjI7Ci0gICAgIGNoYXIgKm4zOwotICAgICBhc2VjdGlvbiAqc2VjOwotICAgICBpbnQgZmxhZ3M7Ci0gICAgIGludCBhZGRyOwotewotICBhc3ltYm9sICpzeW07Ci0gIGNoYXIgKm5hbWUgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKG4xKSArIHN0cmxlbiAobjIpICsgc3RybGVuIChuMykgKyAxKTsKLSAgc3RyY3B5IChuYW1lLCBuMSk7Ci0gIHN0cmNhdCAobmFtZSwgbjIpOwotICBzdHJjYXQgKG5hbWUsIG4zKTsKLSAgc3ltID0gYmZkX21ha2VfZW1wdHlfc3ltYm9sIChhYmZkKTsKLSAgc3ltLT5uYW1lID0gbmFtZTsKLSAgc3ltLT5zZWN0aW9uID0gc2VjOwotICBzeW0tPmZsYWdzID0gZmxhZ3M7Ci0gIHN5bS0+dmFsdWUgPSBhZGRyOwotICBzeW10YWJbc3ltcHRyKytdID0gc3ltOwotfQotCi1zdGF0aWMgYXJlbGVudCAqcmVsdGFiID0gMDsKLXN0YXRpYyBpbnQgcmVsY291bnQgPSAwLCByZWxzaXplID0gMDsKLQotc3RhdGljIHZvaWQKLXF1aWNrX3JlbG9jIChhYmZkLCBhZGRyZXNzLCB3aGljaF9ob3d0bywgc3ltaWR4KQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGludCBhZGRyZXNzOwotICAgICBpbnQgd2hpY2hfaG93dG87Ci0gICAgIGludCBzeW1pZHg7Ci17Ci0gIGlmIChyZWxjb3VudCA+PSAocmVsc2l6ZS0xKSkKLSAgICB7Ci0gICAgICByZWxzaXplICs9IDEwOwotICAgICAgaWYgKHJlbHRhYikKLQlyZWx0YWIgPSAoYXJlbGVudCAqKSB4cmVhbGxvYyAocmVsdGFiLCByZWxzaXplICogc2l6ZW9mIChhcmVsZW50KSk7Ci0gICAgICBlbHNlCi0JcmVsdGFiID0gKGFyZWxlbnQgKikgeG1hbGxvYyAocmVsc2l6ZSAqIHNpemVvZiAoYXJlbGVudCkpOwotICAgIH0KLSAgcmVsdGFiW3JlbGNvdW50XS5hZGRyZXNzID0gYWRkcmVzczsKLSAgcmVsdGFiW3JlbGNvdW50XS5hZGRlbmQgPSAwOwotICByZWx0YWJbcmVsY291bnRdLmhvd3RvID0gYmZkX3JlbG9jX3R5cGVfbG9va3VwIChhYmZkLCB3aGljaF9ob3d0byk7Ci0gIHJlbHRhYltyZWxjb3VudF0uc3ltX3B0cl9wdHIgPSBzeW10YWIgKyBzeW1pZHg7Ci0gIHJlbGNvdW50Kys7Ci19Ci0KLXN0YXRpYyB2b2lkCi1zYXZlX3JlbG9jcyAoYXNlY3Rpb24gKnNlYykKLXsKLSAgaW50IGk7Ci0gIHNlYy0+cmVsb2NhdGlvbiA9IHJlbHRhYjsKLSAgc2VjLT5yZWxvY19jb3VudCA9IHJlbGNvdW50OwotICBzZWMtPm9yZWxvY2F0aW9uID0gKGFyZWxlbnQgKiopIHhtYWxsb2MgKChyZWxjb3VudCsxKSAqIHNpemVvZiAoYXJlbGVudCAqKSk7Ci0gIGZvciAoaT0wOyBpPHJlbGNvdW50OyBpKyspCi0gICAgc2VjLT5vcmVsb2NhdGlvbltpXSA9IHNlYy0+cmVsb2NhdGlvbiArIGk7Ci0gIHNlYy0+b3JlbG9jYXRpb25bcmVsY291bnRdID0gMDsKLSAgc2VjLT5mbGFncyB8PSBTRUNfUkVMT0M7Ci0gIHJlbHRhYiA9IDA7Ci0gIHJlbGNvdW50ID0gcmVsc2l6ZSA9IDA7Ci19Ci0KLS8qCi0gKgkuc2VjdGlvbgkuaWRhdGEkMgotICoJLmdsb2JhbAkJX19oZWFkX215X2RsbAotICogX19oZWFkX215X2RsbDoKLSAqCS5ydmEJCWhuYW1lCi0gKgkubG9uZwkJMAotICoJLmxvbmcJCTAKLSAqCS5ydmEJCV9fbXlfZGxsX2luYW1lCi0gKgkucnZhCQlmdGh1bmsKLSAqCi0gKgkuc2VjdGlvbgkuaWRhdGEkNQotICoJLmxvbmcJCTAKLSAqIGZ0aHVuazoKLSAqCi0gKgkuc2VjdGlvbgkuaWRhdGEkNAotICoJLmxvbmcJCTAKLSAqIGhuYW1lOgotICovCi0KLXN0YXRpYyBiZmQgKgotbWFrZV9oZWFkIChwYXJlbnQpCi0gICAgIGJmZCAqcGFyZW50OwotewotICBhc2VjdGlvbiAqaWQyLCAqaWQ1LCAqaWQ0OwotICB1bnNpZ25lZCBjaGFyICpkMiwgKmQ1LCAqZDQ7Ci0gIGNoYXIgKm9uYW1lOwotICBiZmQgKmFiZmQ7Ci0KLSAgb25hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIHNwcmludGYgKG9uYW1lLCAiZCUwNmQubyIsIHRtcF9zZXEpOwotICB0bXBfc2VxKys7Ci0KLSAgYWJmZCA9IGJmZF9jcmVhdGUgKG9uYW1lLCBwYXJlbnQpOwotICBiZmRfZmluZF90YXJnZXQgKHBlX2RldGFpbHMtPm9iamVjdF90YXJnZXQsIGFiZmQpOwotICBiZmRfbWFrZV93cml0YWJsZSAoYWJmZCk7Ci0KLSAgYmZkX3NldF9mb3JtYXQgKGFiZmQsIGJmZF9vYmplY3QpOwotICBiZmRfc2V0X2FyY2hfbWFjaCAoYWJmZCwgcGVfZGV0YWlscy0+YmZkX2FyY2gsIDApOwotCi0gIHN5bXB0ciA9IDA7Ci0gIHN5bXRhYiA9IChhc3ltYm9sICoqKSB4bWFsbG9jICg2ICogc2l6ZW9mIChhc3ltYm9sICopKTsKLSAgaWQyID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQyIiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNSA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDQgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCJfaGVhZF8iKSwgZGxsX3N5bW5hbWUsICIiLCBpZDIsIEJTRl9HTE9CQUwsIDApOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIiIpLCBkbGxfc3ltbmFtZSwgIl9pbmFtZSIsIFVORFNFQywgQlNGX0dMT0JBTCwgMCk7Ci0KLSAgLyogT0ssIHBheSBhdHRlbnRpb24gaGVyZS4gIEkgZ290IGNvbmZ1c2VkIG15c2VsZiBsb29raW5nIGJhY2sgYXQKLSAgICAgaXQuICBXZSBjcmVhdGUgYSBmb3VyLWJ5dGUgc2VjdGlvbiB0byBtYXJrIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAgIGxpc3QsIGFuZCB3ZSBpbmNsdWRlIGFuIG9mZnNldCBvZiA0IGluIHRoZSBzZWN0aW9uLCBzbyB0aGF0IHRoZQotICAgICBwb2ludGVyIHRvIHRoZSBsaXN0IHBvaW50cyB0byB0aGUgKmVuZCogb2YgdGhpcyBzZWN0aW9uLCB3aGljaCBpcwotICAgICB0aGUgc3RhcnQgb2YgdGhlIGxpc3Qgb2Ygc2VjdGlvbnMgZnJvbSBvdGhlciBvYmplY3RzLiAqLwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDIsIDIwKTsKLSAgZDIgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICgyMCk7Ci0gIGlkMi0+Y29udGVudHMgPSBkMjsKLSAgbWVtc2V0IChkMiwgMCwgMjApOwotICBkMlswXSA9IGQyWzE2XSA9IDQ7IC8qIHJlbG9jIGFkZGVuZCAqLwotICBxdWlja19yZWxvYyAoYWJmZCwgIDAsIEJGRF9SRUxPQ19SVkEsIDIpOwotICBxdWlja19yZWxvYyAoYWJmZCwgMTIsIEJGRF9SRUxPQ19SVkEsIDQpOwotICBxdWlja19yZWxvYyAoYWJmZCwgMTYsIEJGRF9SRUxPQ19SVkEsIDEpOwotICBzYXZlX3JlbG9jcyAoaWQyKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ1LCA0KTsKLSAgZDUgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ1LT5jb250ZW50cyA9IGQ1OwotICBtZW1zZXQgKGQ1LCAwLCA0KTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ0LCA0KTsKLSAgZDQgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ0LT5jb250ZW50cyA9IGQ0OwotICBtZW1zZXQgKGQ0LCAwLCA0KTsKLQotICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgc3ltdGFiLCBzeW1wdHIpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQyLCBkMiwgMCwgMjApOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNSwgZDUsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNCwgZDQsIDAsIDQpOwotICAKLSAgYmZkX21ha2VfcmVhZGFibGUgKGFiZmQpOwotICByZXR1cm4gYWJmZDsKLX0KLQotLyoKLSAqCS5zZWN0aW9uCS5pZGF0YSQ0Ci0gKgkubG9uZwkJMAotICoJLnNlY3Rpb24JLmlkYXRhJDUKLSAqCS5sb25nCQkwCi0gKgkuc2VjdGlvbglpZGF0YSQ3Ci0gKgkuZ2xvYmFsCQlfX215X2RsbF9pbmFtZQotICpfX215X2RsbF9pbmFtZToKLSAqCS5hc2NpegkJIm15LmRsbCIKLSAqLwotCi1zdGF0aWMgYmZkICoKLW1ha2VfdGFpbCAocGFyZW50KQotICAgICBiZmQgKnBhcmVudDsKLXsKLSAgYXNlY3Rpb24gKmlkNCwgKmlkNSwgKmlkNzsKLSAgdW5zaWduZWQgY2hhciAqZDQsICpkNSwgKmQ3OwotICBpbnQgbGVuOwotICBjaGFyICpvbmFtZTsKLSAgYmZkICphYmZkOwotCi0gIG9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotICBzcHJpbnRmIChvbmFtZSwgImQlMDZkLm8iLCB0bXBfc2VxKTsKLSAgdG1wX3NlcSsrOwotCi0gIGFiZmQgPSBiZmRfY3JlYXRlIChvbmFtZSwgcGFyZW50KTsKLSAgYmZkX2ZpbmRfdGFyZ2V0IChwZV9kZXRhaWxzLT5vYmplY3RfdGFyZ2V0LCBhYmZkKTsKLSAgYmZkX21ha2Vfd3JpdGFibGUgKGFiZmQpOwotCi0gIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIHBlX2RldGFpbHMtPmJmZF9hcmNoLCAwKTsKLQotICBzeW1wdHIgPSAwOwotICBzeW10YWIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoNSAqIHNpemVvZiAoYXN5bWJvbCAqKSk7Ci0gIGlkNCA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNCIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDUgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDUiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ3ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiIiksIGRsbF9zeW1uYW1lLCAiX2luYW1lIiwgaWQ3LCBCU0ZfR0xPQkFMLCAwKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ0LCA0KTsKLSAgZDQgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ0LT5jb250ZW50cyA9IGQ0OwotICBtZW1zZXQgKGQ0LCAwLCA0KTsKLQotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ1LCA0KTsKLSAgZDUgPSAodW5zaWduZWQgY2hhciAqKSB4bWFsbG9jICg0KTsKLSAgaWQ1LT5jb250ZW50cyA9IGQ1OwotICBtZW1zZXQgKGQ1LCAwLCA0KTsKLQotICBsZW4gPSBzdHJsZW4gKGRsbF9maWxlbmFtZSkrMTsKLSAgaWYgKGxlbiAmIDEpCi0gICAgbGVuICsrOwotICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoYWJmZCwgaWQ3LCBsZW4pOwotICBkNyA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0gIGlkNy0+Y29udGVudHMgPSBkNzsKLSAgc3RyY3B5IChkNywgZGxsX2ZpbGVuYW1lKTsKLQotICBiZmRfc2V0X3N5bXRhYiAoYWJmZCwgc3ltdGFiLCBzeW1wdHIpOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ0LCBkNCwgMCwgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ1LCBkNSwgMCwgNCk7Ci0gIGJmZF9zZXRfc2VjdGlvbl9jb250ZW50cyAoYWJmZCwgaWQ3LCBkNywgMCwgbGVuKTsKLQotICBiZmRfbWFrZV9yZWFkYWJsZSAoYWJmZCk7Ci0gIHJldHVybiBhYmZkOwotfQotCi0vKgotICoJLnRleHQKLSAqCS5nbG9iYWwJCV9mdW5jdGlvbgotICoJLmdsb2JhbAkJX19faW1wX2Z1bmN0aW9uCi0gKgkuZ2xvYmFsCQlfX2ltcF9fZnVuY3Rpb24KLSAqX2Z1bmN0aW9uOgotICoJam1wCQkqX19pbXBfX2Z1bmN0aW9uOgotICoKLSAqCS5zZWN0aW9uCWlkYXRhJDcKLSAqCS5sb25nCQlfX2hlYWRfbXlfZGxsCi0gKgotICoJLnNlY3Rpb24JLmlkYXRhJDUKLSAqX19faW1wX2Z1bmN0aW9uOgotICpfX2ltcF9fZnVuY3Rpb246Ci0gKmlhdD8KLSAqCS5zZWN0aW9uCS5pZGF0YSQ0Ci0gKmlhdD8KLSAqCS5zZWN0aW9uCS5pZGF0YSQ2Ci0gKklEPG9yZGluYWw+OgotICoJLnNob3J0CQk8aGludD4KLSAqCS5hc2NpegkJImZ1bmN0aW9uIiB4bGF0ZT8gKGFkZCB1bmRlcnNjb3JlLCBraWxsIGF0KQotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGptcF9peDg2X2J5dGVzW10gPSB7Ci0gIDB4ZmYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4OTAKLX07Ci0KLQotc3RhdGljIGJmZCAqCi1tYWtlX29uZSAoZXhwLCBwYXJlbnQpCi0gICAgIGRlZl9maWxlX2V4cG9ydCAqZXhwOwotICAgICBiZmQgKnBhcmVudDsKLXsKLSAgYXNlY3Rpb24gKnR4LCAqaWQ3LCAqaWQ1LCAqaWQ0LCAqaWQ2OwotICB1bnNpZ25lZCBjaGFyICp0ZCwgKmQ3LCAqZDUsICpkNCwgKmQ2OwotICBpbnQgbGVuOwotICBjaGFyICpvbmFtZTsKLSAgYmZkICphYmZkOwotICB1bnNpZ25lZCBjaGFyICpqbXBfYnl0ZXM7Ci0gIGludCBqbXBfYnl0ZV9jb3VudDsKLQotICBzd2l0Y2ggKHBlX2RldGFpbHMtPnBlX2FyY2gpCi0gICAgewotICAgIGNhc2UgUEVfQVJDSF9pMzg2OgotICAgICAgam1wX2J5dGVzID0gam1wX2l4ODZfYnl0ZXM7Ci0gICAgICBqbXBfYnl0ZV9jb3VudCA9IHNpemVvZiAoam1wX2l4ODZfYnl0ZXMpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIG9uYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoMjApOwotICBzcHJpbnRmIChvbmFtZSwgImQlMDZkLm8iLCB0bXBfc2VxKTsKLSAgdG1wX3NlcSsrOwotCi0gIGFiZmQgPSBiZmRfY3JlYXRlIChvbmFtZSwgcGFyZW50KTsKLSAgYmZkX2ZpbmRfdGFyZ2V0IChwZV9kZXRhaWxzLT5vYmplY3RfdGFyZ2V0LCBhYmZkKTsKLSAgYmZkX21ha2Vfd3JpdGFibGUgKGFiZmQpOwotCi0gIGJmZF9zZXRfZm9ybWF0IChhYmZkLCBiZmRfb2JqZWN0KTsKLSAgYmZkX3NldF9hcmNoX21hY2ggKGFiZmQsIHBlX2RldGFpbHMtPmJmZF9hcmNoLCAwKTsKLQotICBzeW1wdHIgPSAwOwotICBzeW10YWIgPSAoYXN5bWJvbCAqKikgeG1hbGxvYyAoMTAgKiBzaXplb2YgKGFzeW1ib2wgKikpOwotICB0eCAgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLnRleHQiLCAgICBTRUNfQ09ERXxTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ3ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ3IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIGlkNSA9IHF1aWNrX3NlY3Rpb24gKGFiZmQsICIuaWRhdGEkNSIsIFNFQ19IQVNfQ09OVEVOVFMsIDIpOwotICBpZDQgPSBxdWlja19zZWN0aW9uIChhYmZkLCAiLmlkYXRhJDQiLCBTRUNfSEFTX0NPTlRFTlRTLCAyKTsKLSAgaWQ2ID0gcXVpY2tfc2VjdGlvbiAoYWJmZCwgIi5pZGF0YSQ2IiwgU0VDX0hBU19DT05URU5UUywgMik7Ci0gIHF1aWNrX3N5bWJvbCAoYWJmZCwgVSgiIiksIGV4cC0+aW50ZXJuYWxfbmFtZSwgIiIsIHR4LCBCU0ZfR0xPQkFMLCAwKTsKLSAgcXVpY2tfc3ltYm9sIChhYmZkLCBVKCJfaGVhZF8iKSwgZGxsX3N5bW5hbWUsICIiLCBVTkRTRUMsIEJTRl9HTE9CQUwsIDApOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIl9faW1wXyIpLCBleHAtPmludGVybmFsX25hbWUsICIiLCBpZDUsIEJTRl9HTE9CQUwsIDApOwotICBxdWlja19zeW1ib2wgKGFiZmQsIFUoIl9pbXBfXyIpLCBleHAtPmludGVybmFsX25hbWUsICIiLCBpZDUsIEJTRl9HTE9CQUwsIDApOwotCi0gIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCB0eCwgam1wX2J5dGVfY291bnQpOwotICB0ZCA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGptcF9ieXRlX2NvdW50KTsKLSAgdHgtPmNvbnRlbnRzID0gdGQ7Ci0gIG1lbWNweSAodGQsIGptcF9ieXRlcywgam1wX2J5dGVfY291bnQpOwotICBzd2l0Y2ggKHBlX2RldGFpbHMtPnBlX2FyY2gpCi0gICAgewotICAgIGNhc2UgUEVfQVJDSF9pMzg2OgotICAgICAgcXVpY2tfcmVsb2MgKGFiZmQsIDIsIEJGRF9SRUxPQ18zMiwgMik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIHNhdmVfcmVsb2NzICh0eCk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNywgNCk7Ci0gIGQ3ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNy0+Y29udGVudHMgPSBkNzsKLSAgbWVtc2V0IChkNywgMCwgNCk7Ci0gIHF1aWNrX3JlbG9jIChhYmZkLCAwLCBCRkRfUkVMT0NfUlZBLCA2KTsKLSAgc2F2ZV9yZWxvY3MgKGlkNyk7Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNSwgNCk7Ci0gIGQ1ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNS0+Y29udGVudHMgPSBkNTsKLSAgbWVtc2V0IChkNSwgMCwgNCk7Ci0gIGlmIChleHAtPmZsYWdfbm9uYW1lKQotICAgIHsKLSAgICAgIGQ1WzBdID0gZXhwLT5vcmRpbmFsOwotICAgICAgZDVbMV0gPSBleHAtPm9yZGluYWwgPj4gODsKLSAgICAgIGQ1WzNdID0gMHg4MDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBxdWlja19yZWxvYyAoYWJmZCwgMCwgQkZEX1JFTE9DX1JWQSwgNCk7Ci0gICAgICBzYXZlX3JlbG9jcyAoaWQ1KTsKLSAgICB9Ci0KLSAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGFiZmQsIGlkNCwgNCk7Ci0gIGQ0ID0gKHVuc2lnbmVkIGNoYXIgKikgeG1hbGxvYyAoNCk7Ci0gIGlkNC0+Y29udGVudHMgPSBkNDsKLSAgbWVtc2V0IChkNCwgMCwgNCk7Ci0gIGlmIChleHAtPmZsYWdfbm9uYW1lKQotICAgIHsKLSAgICAgIGQ1WzBdID0gZXhwLT5vcmRpbmFsOwotICAgICAgZDVbMV0gPSBleHAtPm9yZGluYWwgPj4gODsKLSAgICAgIGQ1WzNdID0gMHg4MDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBxdWlja19yZWxvYyAoYWJmZCwgMCwgQkZEX1JFTE9DX1JWQSwgNCk7Ci0gICAgICBzYXZlX3JlbG9jcyAoaWQ0KTsKLSAgICB9Ci0KLSAgaWYgKGV4cC0+ZmxhZ19ub25hbWUpCi0gICAgewotICAgICAgbGVuID0gMDsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDYsIDApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxlbiA9IHN0cmxlbiAoZXhwLT5uYW1lKSArIDM7Ci0gICAgICBpZiAobGVuICYgMSkKLQlsZW4rKzsKLSAgICAgIGJmZF9zZXRfc2VjdGlvbl9zaXplIChhYmZkLCBpZDYsIGxlbik7Ci0gICAgICBkNiA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGxlbik7Ci0gICAgICBpZDYtPmNvbnRlbnRzID0gZDY7Ci0gICAgICBtZW1zZXQgKGQ2LCAwLCBsZW4pOwotICAgICAgZDZbMF0gPSBleHAtPmhpbnQgJiAweGZmOwotICAgICAgZDZbMV0gPSBleHAtPmhpbnQgPj4gODsKLSAgICAgIHN0cmNweSAoZDYrMiwgZXhwLT5uYW1lKTsKLSAgICB9Ci0KLSAgYmZkX3NldF9zeW10YWIgKGFiZmQsIHN5bXRhYiwgc3ltcHRyKTsKLQotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIHR4LCB0ZCwgMCwgam1wX2J5dGVfY291bnQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNywgZDcsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNSwgZDUsIDAsIDQpOwotICBiZmRfc2V0X3NlY3Rpb25fY29udGVudHMgKGFiZmQsIGlkNCwgZDQsIDAsIDQpOwotICBpZiAoIWV4cC0+ZmxhZ19ub25hbWUpCi0gICAgYmZkX3NldF9zZWN0aW9uX2NvbnRlbnRzIChhYmZkLCBpZDYsIGQ2LCAwLCBsZW4pOwotCi0gIGJmZF9tYWtlX3JlYWRhYmxlIChhYmZkKTsKLSAgcmV0dXJuIGFiZmQ7Ci19Ci0KLXZvaWQKLXBlX2RsbF9nZW5lcmF0ZV9pbXBsaWIgKGRlZiwgaW1wZmlsZW5hbWUpCi0gICAgIGRlZl9maWxlICpkZWY7Ci0gICAgIGNoYXIgKmltcGZpbGVuYW1lOwotewotICBpbnQgaTsKLSAgYmZkICphcl9oZWFkOwotICBiZmQgKmFyX3RhaWw7Ci0gIGJmZCAqb3V0YXJjaDsKLSAgYmZkICpoZWFkID0gMDsKLQotICBkbGxfZmlsZW5hbWUgPSBkZWYtPm5hbWU7Ci0gIGlmIChkbGxfZmlsZW5hbWUgPT0gMCkKLSAgICB7Ci0gICAgICBkbGxfZmlsZW5hbWUgPSBkbGxfbmFtZTsKLSAgICAgIGZvciAoaT0wOyBpbXBmaWxlbmFtZVtpXTsgaSsrKQotCWlmIChpbXBmaWxlbmFtZVtpXSA9PSAnLycgfHwgaW1wZmlsZW5hbWVbaV0gPT0gJ1xcJykKLQkgIGRsbF9maWxlbmFtZSA9IGltcGZpbGVuYW1lKzE7Ci0gICAgfQotICBkbGxfc3ltbmFtZSA9IHhzdHJkdXAgKGRsbF9maWxlbmFtZSk7Ci0gIGZvciAoaT0wOyBkbGxfc3ltbmFtZVtpXTsgaSsrKQotICAgIGlmICghaXNhbG51bSAoKHVuc2lnbmVkIGNoYXIpIGRsbF9zeW1uYW1lW2ldKSkKLSAgICAgIGRsbF9zeW1uYW1lW2ldID0gJ18nOwotCi0gIHVubGluayAoaW1wZmlsZW5hbWUpOwotCi0gIG91dGFyY2ggPSBiZmRfb3BlbncgKGltcGZpbGVuYW1lLCAwKTsKLQotICBpZiAoIW91dGFyY2gpCi0gICAgewotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGVpbmZvIChfKCIlWENhbid0IG9wZW4gLmxpYiBmaWxlOiAlc1xuIiksIGltcGZpbGVuYW1lKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgZWluZm8gKF8oIkNyZWF0aW5nIGxpYnJhcnkgZmlsZTogJXNcbiIpLCBpbXBmaWxlbmFtZSk7Ci0gIAotICBiZmRfc2V0X2Zvcm1hdCAob3V0YXJjaCwgYmZkX2FyY2hpdmUpOwotICBvdXRhcmNoLT5oYXNfYXJtYXAgPSAxOwotCi0gIC8qIFdvcmsgb3V0IGEgcmVhc29uYWJsZSBzaXplIG9mIHRoaW5ncyB0byBwdXQgb250byBvbmUgbGluZS4gKi8KLQotICBhcl9oZWFkID0gbWFrZV9oZWFkIChvdXRhcmNoKTsKLQotICBmb3IgKGkgPSAwOyBpPGRlZi0+bnVtX2V4cG9ydHM7IGkrKykKLSAgICB7Ci0gICAgICAvKiBUaGUgaW1wb3J0IGxpYnJhcnkgZG9lc24ndCBrbm93IGFib3V0IHRoZSBpbnRlcm5hbCBuYW1lICovCi0gICAgICBjaGFyICppbnRlcm5hbCA9IGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lOwotICAgICAgYmZkICpuOwotICAgICAgZGVmLT5leHBvcnRzW2ldLmludGVybmFsX25hbWUgPSBkZWYtPmV4cG9ydHNbaV0ubmFtZTsKLSAgICAgIG4gPSBtYWtlX29uZSAoZGVmLT5leHBvcnRzK2ksIG91dGFyY2gpOwotICAgICAgbi0+bmV4dCA9IGhlYWQ7Ci0gICAgICBoZWFkID0gbjsKLSAgICAgIGRlZi0+ZXhwb3J0c1tpXS5pbnRlcm5hbF9uYW1lID0gaW50ZXJuYWw7Ci0gICAgfQotCi0gIGFyX3RhaWwgPSBtYWtlX3RhaWwgKG91dGFyY2gpOwotCi0gIGlmIChhcl9oZWFkID09IE5VTEwgfHwgYXJfdGFpbCA9PSBOVUxMKQotICAgIHJldHVybjsKLQotICAvKiBOb3cgc3RpY2sgdGhlbSBhbGwgaW50byB0aGUgYXJjaGl2ZSAqLwotCi0gIGFyX2hlYWQtPm5leHQgPSBoZWFkOwotICBhcl90YWlsLT5uZXh0ID0gYXJfaGVhZDsKLSAgaGVhZCA9IGFyX3RhaWw7Ci0KLSAgaWYgKCEgYmZkX3NldF9hcmNoaXZlX2hlYWQgKG91dGFyY2gsIGhlYWQpKQotICAgIGVpbmZvICgiJVhiZmRfc2V0X2FyY2hpdmVfaGVhZDogJXNcbiIsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLSAgCi0gIGlmICghIGJmZF9jbG9zZSAob3V0YXJjaCkpCi0gICAgZWluZm8gKCIlWGJmZF9jbG9zZSAlczogJXNcbiIsIGltcGZpbGVuYW1lLCBiZmRfZXJybXNnIChiZmRfZ2V0X2Vycm9yICgpKSk7Ci0KLSAgd2hpbGUgKGhlYWQgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBiZmQgKm4gPSBoZWFkLT5uZXh0OwotICAgICAgYmZkX2Nsb3NlIChoZWFkKTsKLSAgICAgIGhlYWQgPSBuOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLWFkZF9iZmRfdG9fbGluayAoYWJmZCwgbmFtZSwgbGlua19pbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIGNoYXIgKm5hbWU7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGxhbmdfaW5wdXRfc3RhdGVtZW50X3R5cGUgKmZha2VfZmlsZTsKLSAgZmFrZV9maWxlID0gbGFuZ19hZGRfaW5wdXRfZmlsZSAobmFtZSwKLQkJCQkgICBsYW5nX2lucHV0X2ZpbGVfaXNfZmFrZV9lbnVtLAotCQkJCSAgIE5VTEwpOwotICBmYWtlX2ZpbGUtPnRoZV9iZmQgPSBhYmZkOwotICBsZGxhbmdfYWRkX2ZpbGUgKGZha2VfZmlsZSk7Ci0gIGlmICghYmZkX2xpbmtfYWRkX3N5bWJvbHMgKGFiZmQsIGxpbmtfaW5mbykpCi0gICAgZWluZm8gKCIlWGFkZHN5bSAlczogJXNcbiIsIG5hbWUsIGJmZF9lcnJtc2cgKGJmZF9nZXRfZXJyb3IgKCkpKTsKLX0KLQotdm9pZAotcGVfcHJvY2Vzc19pbXBvcnRfZGVmcyAob3V0cHV0X2JmZCwgbGlua19pbmZvKQotICAgICBiZmQgKm91dHB1dF9iZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICpsaW5rX2luZm87Ci17Ci0gIGRlZl9maWxlX21vZHVsZSAqbW9kdWxlOwotICBwZV9kbGxfaWRfdGFyZ2V0KGJmZF9nZXRfdGFyZ2V0IChvdXRwdXRfYmZkKSk7Ci0KLSAgaWYgKCFwZV9kZWZfZmlsZSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChtb2R1bGUgPSBwZV9kZWZfZmlsZS0+bW9kdWxlczsgbW9kdWxlOyBtb2R1bGUgPSBtb2R1bGUtPm5leHQpCi0gICAgewotICAgICAgaW50IGksIGRvX3RoaXNfZGxsOwotCi0gICAgICBkbGxfZmlsZW5hbWUgPSBtb2R1bGUtPm5hbWU7Ci0gICAgICBkbGxfc3ltbmFtZSA9IHhzdHJkdXAgKG1vZHVsZS0+bmFtZSk7Ci0gICAgICBmb3IgKGk9MDsgZGxsX3N5bW5hbWVbaV07IGkrKykKLQlpZiAoIWlzYWxudW0gKGRsbF9zeW1uYW1lW2ldKSkKLQkgIGRsbF9zeW1uYW1lW2ldID0gJ18nOwotCi0gICAgICBkb190aGlzX2RsbCA9IDA7Ci0KLSAgICAgIGZvciAoaT0wOyBpPHBlX2RlZl9maWxlLT5udW1faW1wb3J0czsgaSsrKQotCWlmIChwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5tb2R1bGUgPT0gbW9kdWxlKQotCSAgewotCSAgICBkZWZfZmlsZV9leHBvcnQgZXhwOwotCSAgICBzdHJ1Y3QgYmZkX2xpbmtfaGFzaF9lbnRyeSAqYmxoZTsKLQotCSAgICAvKiBzZWUgaWYgd2UgbmVlZCB0aGlzIGltcG9ydCAqLwotCSAgICBjaGFyICpuYW1lID0gKGNoYXIgKikgeG1hbGxvYyAoc3RybGVuIChwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lKSArIDIpOwotCSAgICBzcHJpbnRmIChuYW1lLCAiJXMlcyIsIFUoIiIpLCBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5pbnRlcm5hbF9uYW1lKTsKLQkgICAgYmxoZSA9IGJmZF9saW5rX2hhc2hfbG9va3VwIChsaW5rX2luZm8tPmhhc2gsIG5hbWUsCi0JCQkJCSBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkgICAgZnJlZSAobmFtZSk7Ci0JICAgIGlmIChibGhlICYmIGJsaGUtPnR5cGUgPT0gYmZkX2xpbmtfaGFzaF91bmRlZmluZWQpCi0JICAgICAgewotCQliZmQgKm9uZTsKLQkJLyogd2UgZG8gKi8KLQkJaWYgKCFkb190aGlzX2RsbCkKLQkJICB7Ci0JCSAgICBiZmQgKmFyX2hlYWQgPSBtYWtlX2hlYWQgKG91dHB1dF9iZmQpOwotCQkgICAgYWRkX2JmZF90b19saW5rIChhcl9oZWFkLCBhcl9oZWFkLT5maWxlbmFtZSwgbGlua19pbmZvKTsKLQkJICAgIGRvX3RoaXNfZGxsID0gMTsKLQkJICB9Ci0JCWV4cC5pbnRlcm5hbF9uYW1lID0gcGVfZGVmX2ZpbGUtPmltcG9ydHNbaV0uaW50ZXJuYWxfbmFtZTsKLQkJZXhwLm5hbWUgPSBwZV9kZWZfZmlsZS0+aW1wb3J0c1tpXS5uYW1lOwotCQlleHAub3JkaW5hbCA9IHBlX2RlZl9maWxlLT5pbXBvcnRzW2ldLm9yZGluYWw7Ci0JCWV4cC5oaW50ID0gZXhwLm9yZGluYWwgPj0gMCA/IGV4cC5vcmRpbmFsIDogMDsKLQkJZXhwLmZsYWdfcHJpdmF0ZSA9IDA7Ci0JCWV4cC5mbGFnX2NvbnN0YW50ID0gMDsKLQkJZXhwLmZsYWdfZGF0YSA9IDA7Ci0JCWV4cC5mbGFnX25vbmFtZSA9IGV4cC5uYW1lID8gMCA6IDE7Ci0JCW9uZSA9IG1ha2Vfb25lICgmZXhwLCBvdXRwdXRfYmZkKTsKLQkJYWRkX2JmZF90b19saW5rIChvbmUsIG9uZS0+ZmlsZW5hbWUsIGxpbmtfaW5mbyk7Ci0JICAgICAgfQotCSAgfQotICAgICAgaWYgKGRvX3RoaXNfZGxsKQotCXsKLQkgIGJmZCAqYXJfdGFpbCA9IG1ha2VfdGFpbCAob3V0cHV0X2JmZCk7Ci0JICBhZGRfYmZkX3RvX2xpbmsgKGFyX3RhaWwsIGFyX3RhaWwtPmZpbGVuYW1lLCBsaW5rX2luZm8pOwotCX0KLQotICAgICAgZnJlZSAoZGxsX3N5bW5hbWUpOwotICAgIH0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gV2Ugd2VyZSBoYW5kZWQgYSAqLkRMTCBmaWxlLiAgUGFyc2UgaXQgYW5kIHR1cm4gaXQgaW50byBhIHNldCBvZgotIElNUE9SVFMgZGlyZWN0aXZlcyBpbiB0aGUgZGVmIGZpbGUuICBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMKLSBoYW5kbGVkLCBmYWxzZSBpZiBub3QuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBlX2dldDE2IChhYmZkLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgd2hlcmU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYlsyXTsKLSAgYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCk7Ci0gIGJmZF9yZWFkIChiLCAxLCAyLCBhYmZkKTsKLSAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXBlX2dldDMyIChhYmZkLCB3aGVyZSkKLSAgICAgYmZkICphYmZkOwotICAgICBpbnQgd2hlcmU7Ci17Ci0gIHVuc2lnbmVkIGNoYXIgYls0XTsKLSAgYmZkX3NlZWsgKGFiZmQsIHdoZXJlLCBTRUVLX1NFVCk7Ci0gIGJmZF9yZWFkIChiLCAxLCA0LCBhYmZkKTsKLSAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKLX0KLQotI2lmIDAgLyogVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wZV9hczE2IChwdHIpCi0gICAgIHZvaWQgKnB0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqYiA9IHB0cjsKLSAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wZV9hczMyIChwdHIpCi0gICAgIHZvaWQgKnB0cjsKLXsKLSAgdW5zaWduZWQgY2hhciAqYiA9IHB0cjsKLSAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCkgKyAoYlsyXTw8MTYpICsgKGJbM108PDI0KTsKLX0KLQotYm9vbGVhbgotcGVfaW1wbGllZF9pbXBvcnRfZGxsIChmaWxlbmFtZSkKLSAgICAgY2hhciAqZmlsZW5hbWU7Ci17Ci0gIGJmZCAqZGxsOwotICB1bnNpZ25lZCBsb25nIHBlX2hlYWRlcl9vZmZzZXQsIG9wdGhkcl9vZnMsIG51bV9lbnRyaWVzLCBpOwotICB1bnNpZ25lZCBsb25nIGV4cG9ydF9ydmEsIGV4cG9ydF9zaXplLCBuc2VjdGlvbnMsIHNlY3B0ciwgZXhwcHRyOwotICB1bnNpZ25lZCBjaGFyICpleHBkYXRhLCAqZXJ2YTsKLSAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG9yZGluYWxzLCBuZXhwLCBvcmRiYXNlOwotICBjaGFyICpkbGxfbmFtZTsKLQotICAvKiBObywgSSBjYW4ndCB1c2UgYmZkIGhlcmUuICBrZXJuZWwzMi5kbGwgcHV0cyBpdHMgZXhwb3J0IHRhYmxlIGluCi0gICAgIHRoZSBtaWRkbGUgb2YgdGhlIC5yZGF0YSBzZWN0aW9uLiAqLwotCi0gIGRsbCA9IGJmZF9vcGVuciAoZmlsZW5hbWUsIHBlX2RldGFpbHMtPnRhcmdldF9uYW1lKTsKLSAgaWYgKCFkbGwpCi0gICAgewotICAgICAgZWluZm8gKCIlWG9wZW4gJXM6ICVzXG4iLCBmaWxlbmFtZSwgYmZkX2Vycm1zZyAoYmZkX2dldF9lcnJvciAoKSkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgLyogUEVJIGRsbHMgc2VlbSB0byBiZSBiZmRfb2JqZWN0cyAqLwotICBpZiAoIWJmZF9jaGVja19mb3JtYXQgKGRsbCwgYmZkX29iamVjdCkpCi0gICAgewotICAgICAgZWluZm8gKCIlWCVzOiB0aGlzIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGEgRExMXG4iLCBmaWxlbmFtZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gIGRsbF9uYW1lID0gZmlsZW5hbWU7Ci0gIGZvciAoaT0wOyBmaWxlbmFtZVtpXTsgaSsrKQotICAgIGlmIChmaWxlbmFtZVtpXSA9PSAnLycgfHwgZmlsZW5hbWVbaV0gPT0gJ1xcJyB8fCBmaWxlbmFtZVtpXSA9PSAnOicpCi0gICAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArIDE7Ci0KLSAgcGVfaGVhZGVyX29mZnNldCA9IHBlX2dldDMyIChkbGwsIDB4M2MpOwotICBvcHRoZHJfb2ZzID0gcGVfaGVhZGVyX29mZnNldCArIDQgKyAyMDsKLSAgbnVtX2VudHJpZXMgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgOTIpOwotICBpZiAobnVtX2VudHJpZXMgPCAxKSAvKiBubyBleHBvcnRzICovCi0gICAgcmV0dXJuIGZhbHNlOwotICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKLSAgZXhwb3J0X3NpemUgPSBwZV9nZXQzMiAoZGxsLCBvcHRoZHJfb2ZzICsgMTAwKTsKLSAgbnNlY3Rpb25zID0gcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAyKTsKLSAgc2VjcHRyID0gKHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsgMjAgKwotCSAgICBwZV9nZXQxNiAoZGxsLCBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDE2KSk7Ci0gIGV4cHB0ciA9IDA7Ci0gIGZvciAoaT0wOyBpPG5zZWN0aW9uczsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgc25hbWVbOF07Ci0gICAgICB1bnNpZ25lZCBsb25nIHNlY3B0cjEgPSBzZWNwdHIgKyA0MCAqIGk7Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhZGRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDEyKTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdnNpemUgPSBwZV9nZXQzMiAoZGxsLCBzZWNwdHIxICsgMTYpOwotICAgICAgdW5zaWduZWQgbG9uZyBmcHRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDIwKTsKLSAgICAgIGJmZF9zZWVrKGRsbCwgc2VjcHRyMSwgU0VFS19TRVQpOwotICAgICAgYmZkX3JlYWQoc25hbWUsIDEsIDgsIGRsbCk7Ci0gICAgICBpZiAodmFkZHIgPD0gZXhwb3J0X3J2YSAmJiB2YWRkcit2c2l6ZSA+IGV4cG9ydF9ydmEpCi0JewotCSAgZXhwcHRyID0gZnB0ciArIChleHBvcnRfcnZhIC0gdmFkZHIpOwotCSAgaWYgKGV4cG9ydF9ydmEgKyBleHBvcnRfc2l6ZSA+IHZhZGRyICsgdnNpemUpCi0JICAgIGV4cG9ydF9zaXplID0gdnNpemUgLSAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgZXhwZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopIHhtYWxsb2MgKGV4cG9ydF9zaXplKTsKLSAgYmZkX3NlZWsgKGRsbCwgZXhwcHRyLCBTRUVLX1NFVCk7Ci0gIGJmZF9yZWFkIChleHBkYXRhLCAxLCBleHBvcnRfc2l6ZSwgZGxsKTsKLSAgZXJ2YSA9IGV4cGRhdGEgLSBleHBvcnRfcnZhOwotCi0gIGlmIChwZV9kZWZfZmlsZSA9PSAwKQotICAgIHBlX2RlZl9maWxlID0gZGVmX2ZpbGVfZW1wdHkoKTsKLQotICBuZXhwID0gcGVfYXMzMiAoZXhwZGF0YSsyNCk7Ci0gIG5hbWVfcnZhcyA9IHBlX2FzMzIgKGV4cGRhdGErMzIpOwotICBvcmRpbmFscyA9IHBlX2FzMzIgKGV4cGRhdGErMzYpOwotICBvcmRiYXNlID0gcGVfYXMzMiAoZXhwZGF0YSsxNik7Ci0gIGZvciAoaT0wOyBpPG5leHA7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG5hbWVfcnZhID0gcGVfYXMzMiAoZXJ2YStuYW1lX3J2YXMraSo0KTsKLSAgICAgIGRlZl9maWxlX2ltcG9ydCAqaW1wOwotICAgICAgaW1wID0gZGVmX2ZpbGVfYWRkX2ltcG9ydCAocGVfZGVmX2ZpbGUsIGVydmErbmFtZV9ydmEsIGRsbF9uYW1lLAotCQkJCSBpLCAwKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotIFRoZXNlIGFyZSB0aGUgbWFpbiBmdW5jdGlvbnMsIGNhbGxlZCBmcm9tIHRoZSBlbXVsYXRpb24uICBUaGUgZmlyc3QKLSBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGJmZHMgYXJlIHJlYWQsIHNvIHdlIGNhbiBndWVzcyBhdCBob3cgbXVjaCBzcGFjZQotIHdlIG5lZWQuICBUaGUgc2Vjb25kIGlzIGNhbGxlZCBhZnRlciBldmVyeXRoaW5nIGlzIHBsYWNlZCwgc28gd2UKLSBjYW4gcHV0IHRoZSByaWdodCB2YWx1ZXMgaW4gcGxhY2UuCi0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLXBlX2RsbF9idWlsZF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcGVfZGxsX2lkX3RhcmdldCAoYmZkX2dldF90YXJnZXQgKGFiZmQpKTsKLSAgcHJvY2Vzc19kZWZfZmlsZSAoYWJmZCwgaW5mbyk7Ci0KLSAgZ2VuZXJhdGVfZWRhdGEgKGFiZmQsIGluZm8pOwotICBidWlsZF9maWxsZXJfYmZkICgxKTsKLX0KLQotdm9pZAotcGVfZXhlX2J1aWxkX3NlY3Rpb25zIChhYmZkLCBpbmZvKQotICAgICBiZmQgKmFiZmQ7Ci0gICAgIHN0cnVjdCBiZmRfbGlua19pbmZvICppbmZvOwotewotICBwZV9kbGxfaWRfdGFyZ2V0IChiZmRfZ2V0X3RhcmdldCAoYWJmZCkpOwotICBidWlsZF9maWxsZXJfYmZkICgwKTsKLX0KLQotdm9pZAotcGVfZGxsX2ZpbGxfc2VjdGlvbnMgKGFiZmQsIGluZm8pCi0gICAgIGJmZCAqYWJmZDsKLSAgICAgc3RydWN0IGJmZF9saW5rX2luZm8gKmluZm87Ci17Ci0gIHBlX2RsbF9pZF90YXJnZXQgKGJmZF9nZXRfdGFyZ2V0IChhYmZkKSk7Ci0gIGltYWdlX2Jhc2UgPSBwZV9kYXRhIChhYmZkKS0+cGVfb3B0aGRyLkltYWdlQmFzZTsKLQotICBnZW5lcmF0ZV9yZWxvYyAoYWJmZCwgaW5mbyk7Ci0gIGlmIChyZWxvY19zeiA+IDApCi0gICAgewotICAgICAgYmZkX3NldF9zZWN0aW9uX3NpemUgKGZpbGxlcl9iZmQsIHJlbG9jX3MsIHJlbG9jX3N6KTsKLQotICAgICAgLyogUmVzaXplIHRoZSBzZWN0aW9ucy4gICovCi0gICAgICBsYW5nX3NpemVfc2VjdGlvbnMgKHN0YXRfcHRyLT5oZWFkLCBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICZzdGF0X3B0ci0+aGVhZCwgMCwgKGJmZF92bWEpIDAsIGZhbHNlKTsKLQotICAgICAgLyogUmVkbyBzcGVjaWFsIHN0dWZmLiAgKi8KLSAgICAgIGxkZW11bF9hZnRlcl9hbGxvY2F0aW9uICgpOwotCi0gICAgICAvKiBEbyB0aGUgYXNzaWdubWVudHMgYWdhaW4uICAqLwotICAgICAgbGFuZ19kb19hc3NpZ25tZW50cyAoc3RhdF9wdHItPmhlYWQsCi0JCQkgICBhYnNfb3V0cHV0X3NlY3Rpb24sCi0JCQkgICAoZmlsbF90eXBlKSAwLCAoYmZkX3ZtYSkgMCk7Ci0gICAgfQotCi0gIGZpbGxfZWRhdGEgKGFiZmQsIGluZm8pOwotCi0gIHBlX2RhdGEgKGFiZmQpLT5kbGwgPSAxOwotCi0gIGVkYXRhX3MtPmNvbnRlbnRzID0gZWRhdGFfZDsKLSAgcmVsb2Nfcy0+Y29udGVudHMgPSByZWxvY19kOwotfQotCi12b2lkCi1wZV9leGVfZmlsbF9zZWN0aW9ucyAoYWJmZCwgaW5mbykKLSAgICAgYmZkICphYmZkOwotICAgICBzdHJ1Y3QgYmZkX2xpbmtfaW5mbyAqaW5mbzsKLXsKLSAgcGVfZGxsX2lkX3RhcmdldCAoYmZkX2dldF90YXJnZXQgKGFiZmQpKTsKLSAgaW1hZ2VfYmFzZSA9IHBlX2RhdGEgKGFiZmQpLT5wZV9vcHRoZHIuSW1hZ2VCYXNlOwotCi0gIGdlbmVyYXRlX3JlbG9jIChhYmZkLCBpbmZvKTsKLSAgaWYgKHJlbG9jX3N6ID4gMCkKLSAgICB7Ci0gICAgICBiZmRfc2V0X3NlY3Rpb25fc2l6ZSAoZmlsbGVyX2JmZCwgcmVsb2NfcywgcmVsb2Nfc3opOwotCi0gICAgICAvKiBSZXNpemUgdGhlIHNlY3Rpb25zLiAgKi8KLSAgICAgIGxhbmdfc2l6ZV9zZWN0aW9ucyAoc3RhdF9wdHItPmhlYWQsIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgJnN0YXRfcHRyLT5oZWFkLCAwLCAoYmZkX3ZtYSkgMCwgZmFsc2UpOwotCi0gICAgICAvKiBSZWRvIHNwZWNpYWwgc3R1ZmYuICAqLwotICAgICAgbGRlbXVsX2FmdGVyX2FsbG9jYXRpb24gKCk7Ci0KLSAgICAgIC8qIERvIHRoZSBhc3NpZ25tZW50cyBhZ2Fpbi4gICovCi0gICAgICBsYW5nX2RvX2Fzc2lnbm1lbnRzIChzdGF0X3B0ci0+aGVhZCwKLQkJCSAgIGFic19vdXRwdXRfc2VjdGlvbiwKLQkJCSAgIChmaWxsX3R5cGUpIDAsIChiZmRfdm1hKSAwKTsKLSAgICB9Ci0gIHJlbG9jX3MtPmNvbnRlbnRzID0gcmVsb2NfZDsKLX0KZGlmZiAtLWdpdCBhL2xkL3BvL01ha2UtaW4gYi9sZC9wby9NYWtlLWluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjkxMDkwLi4wMDAwMDAwCi0tLSBhL2xkL3BvL01ha2UtaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotIyBNYWtlZmlsZSBmb3IgcHJvZ3JhbSBzb3VyY2UgZGlyZWN0b3J5IGluIEdOVSBOTFMgdXRpbGl0aWVzIHBhY2thZ2UuCi0jIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBnbnUuYWkubWl0LmVkdT4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotUEFDS0FHRSA9IEBQQUNLQUdFQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1TSEVMTCA9IC9iaW4vc2gKLUBTRVRfTUFLRUAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLQotcHJlZml4ID0gQHByZWZpeEAKLWV4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAotZGF0YWRpciA9ICQocHJlZml4KS9AREFUQURJUk5BTUVACi1sb2NhbGVkaXIgPSAkKGRhdGFkaXIpL2xvY2FsZQotZ251bG9jYWxlZGlyID0gJChwcmVmaXgpL3NoYXJlL2xvY2FsZQotZ2V0dGV4dHNyY2RpciA9ICQocHJlZml4KS9zaGFyZS9nZXR0ZXh0L3BvCi1zdWJkaXIgPSBwbwotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotTUtJTlNUQUxMRElSUyA9IEBNS0lOU1RBTExESVJTQAotCi1DQyA9IEBDQ0AKLUdFTkNBVCA9IEBHRU5DQVRACi1HTVNHRk1UID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBHTVNHRk1UQAotTVNHRk1UID0gQE1TR0ZNVEAKLVhHRVRURVhUID0gUEFUSD0uLi9zcmM6JCRQQVRIIEBYR0VUVEVYVEAKLU1TR01FUkdFID0gUEFUSD0uLi9zcmM6JCRQQVRIIG1zZ21lcmdlCi0KLURFRlMgPSBAREVGU0AKLUNGTEFHUyA9IEBDRkxBR1NACi1DUFBGTEFHUyA9IEBDUFBGTEFHU0AKLQotSU5DTFVERVMgPSAtSS4uIC1JJCh0b3Bfc3JjZGlyKS9pbnRsCi0KLUNPTVBJTEUgPSAkKENDKSAtYyAkKERFRlMpICQoSU5DTFVERVMpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKFhDRkxBR1MpCi0KLVNPVVJDRVMgPSBjYXQtaWQtdGJsLmMKLVBPRklMRVMgPSBAUE9GSUxFU0AKLUdNT0ZJTEVTID0gQEdNT0ZJTEVTQAotRElTVEZJTEVTID0gQ2hhbmdlTG9nIE1ha2VmaWxlLmluLmluIFBPVEZJTEVTLmluICQoUEFDS0FHRSkucG90IFwKLXN0YW1wLWNhdC1pZCAkKFBPRklMRVMpICQoR01PRklMRVMpICQoU09VUkNFUykKLQotUE9URklMRVMgPSBcCi0KLUNBVEFMT0dTID0gQENBVEFMT0dTQAotQ0FUT0JKRVhUID0gQENBVE9CSkVYVEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLQotLlNVRkZJWEVTOgotLlNVRkZJWEVTOiAuYyAubyAucG8gLnBveCAuZ21vIC5tbyAubXNnIC5jYXQKLQotLmMubzoKLQkkKENPTVBJTEUpICQ8Ci0KLS5wby5wb3g6Ci0JJChNQUtFKSAkKFBBQ0tBR0UpLnBvdAotCSQoTVNHTUVSR0UpICQ8ICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCAtbyAkKi5wb3gKLQotLnBvLm1vOgotCSQoTVNHRk1UKSAtbyAkQCAkPAotCi0ucG8uZ21vOgotCWZpbGU9JChzcmNkaXIpL2BlY2hvICQqIHwgc2VkICdzLC4qLywsJ2AuZ21vIFwKLQkgICYmIHJtIC1mICQkZmlsZSAmJiAkKEdNU0dGTVQpIC1vICQkZmlsZSAkPAotCi0ucG8uY2F0OgotCXNlZCAtZiAuLi9pbnRsL3BvMm1zZy5zZWQgPCAkPCA+ICQqLm1zZyBcCi0JICAmJiBybSAtZiAkQCAmJiAkKEdFTkNBVCkgJEAgJCoubXNnCi0KLQotYWxsOiBhbGwtQFVTRV9OTFNACi0KLWFsbC15ZXM6ICQoQ0FUQUxPR1MpIEBNQUlOVEAgJChQQUNLQUdFKS5wb3QKLWFsbC1ubzoKLQotJChzcmNkaXIpLyQoUEFDS0FHRSkucG90OiAkKFBPVEZJTEVTKQotCSQoWEdFVFRFWFQpIC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWRpcmVjdG9yeT0kKHRvcF9zcmNkaXIpIFwKLQkgIC0tYWRkLWNvbW1lbnRzIC1DIC0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyBcCi0JICAtLWZpbGVzLWZyb209JChzcmNkaXIpL1BPVEZJTEVTLmluCi0Jcm0gLWYgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0JbXYgJChQQUNLQUdFKS5wbyAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QKLQotJChzcmNkaXIpL2NhdC1pZC10YmwuYzogc3RhbXAtY2F0LWlkOyBAOgotJChzcmNkaXIpL3N0YW1wLWNhdC1pZDogJChQQUNLQUdFKS5wb3QKLQlybSAtZiBjYXQtaWQtdGJsLnRtcAotCXNlZCAtZiAuLi9pbnRsL3BvMnRibC5zZWQgJChzcmNkaXIpLyQoUEFDS0FHRSkucG90IFwKLQkJfCBzZWQgLWUgInMvQFBBQ0tBR0UgTkFNRUAvJChQQUNLQUdFKS8iID4gY2F0LWlkLXRibC50bXAKLQlpZiBjbXAgLXMgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgdGhlbiBcCi0JICBybSBjYXQtaWQtdGJsLnRtcDsgXAotCWVsc2UgXAotCSAgZWNobyBjYXQtaWQtdGJsLmMgY2hhbmdlZDsgXAotCSAgcm0gLWYgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCSAgbXYgY2F0LWlkLXRibC50bXAgJChzcmNkaXIpL2NhdC1pZC10YmwuYzsgXAotCWZpCi0JY2QgJChzcmNkaXIpICYmIHJtIC1mIHN0YW1wLWNhdC1pZCAmJiBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWNhdC1pZAotCi0KLWluc3RhbGw6IGluc3RhbGwtZXhlYyBpbnN0YWxsLWRhdGEKLWluc3RhbGwtZXhlYzoKLWluc3RhbGwtaW5mbzoKLWluc3RhbGwtZGF0YTogaW5zdGFsbC1kYXRhLUBVU0VfTkxTQAotaW5zdGFsbC1kYXRhLW5vOiBhbGwKLWluc3RhbGwtZGF0YS15ZXM6IGFsbAotCWlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAkKE1LSU5TVEFMTERJUlMpICQoZGF0YWRpcik7IFwKLQllbHNlIFwKLQkgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkKGRhdGFkaXIpOyBcCi0JZmkKLQlAY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGNhc2UgIiQkY2F0IiBpbiBcCi0JICAgICouZ21vKSBkZXN0ZGlyPSQoZ251bG9jYWxlZGlyKTs7IFwKLQkgICAgKikgICAgIGRlc3RkaXI9JChsb2NhbGVkaXIpOzsgXAotCSAgZXNhYzsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBkaXI9JCRkZXN0ZGlyLyQkbGFuZy9MQ19NRVNTQUdFUzsgXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkJGRpcjsgXAotCSAgZWxzZSBcCi0JICAgICQodG9wX3NyY2RpcikvbWtpbnN0YWxsZGlycyAkJGRpcjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQ7IHRoZW4gXAotCSAgICAkKElOU1RBTExfREFUQSkgJCRjYXQgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdCBhcyAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKSI7IFwKLQkgIGVsc2UgXAotCSAgICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBmaTsgXAotCSAgaWYgdGVzdCAtciAkJGNhdC5tOyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0Lm0gJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQkY2F0Lm0gYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgIGVsc2UgXAotCSAgICBpZiB0ZXN0IC1yICQoc3JjZGlyKS8kJGNhdC5tIDsgdGhlbiBcCi0JICAgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdC5tIFwKLQkJJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgICAgIGVjaG8gImluc3RhbGxpbmcgJChzcmNkaXIpLyQkY2F0IGFzIiBcCi0JCSAgICIkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tIjsgXAotCSAgICBlbHNlIFwKLQkgICAgICB0cnVlOyBcCi0JICAgIGZpOyBcCi0JICBmaTsgXAotCWRvbmUKLQlpZiB0ZXN0ICIkKFBBQ0tBR0UpIiA9ICJnZXR0ZXh0IjsgdGhlbiBcCi0JICBpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgICAkKE1LSU5TVEFMTERJUlMpICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChnZXR0ZXh0c3JjZGlyKTsgXAotCSAgZmk7IFwKLQkgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWFrZWZpbGUuaW4uaW4gXAotCQkJICAkKGdldHRleHRzcmNkaXIpL01ha2VmaWxlLmluLmluOyBcCi0JZWxzZSBcCi0JICA6IDsgXAotCWZpCi0KLSMgRGVmaW5lIHRoaXMgYXMgZW1wdHkgdW50aWwgSSBmb3VuZCBhIHVzZWZ1bCBhcHBsaWNhdGlvbi4KLWluc3RhbGxjaGVjazoKLQotdW5pbnN0YWxsOgotCWNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBsYW5nPWBlY2hvICQkY2F0IHwgc2VkICdzL1wkKENBVE9CSkVYVCkkJC8vJ2A7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQobG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgcm0gLWYgJChnbnVsb2NhbGVkaXIpLyQkbGFuZy9MQ19NRVNTQUdFUy8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKS5tOyBcCi0JZG9uZQotCXJtIC1mICQoZ2V0dGV4dHNyY2RpcikvcG8tTWFrZWZpbGUuaW4uaW4KLQotY2hlY2s6IGFsbAotCi1jYXQtaWQtdGJsLm86IC4uL2ludGwvbGliZ2V0dGV4dC5oCi0KLWR2aSBpbmZvIHRhZ3MgVEFHUyBJRDoKLQotbW9zdGx5Y2xlYW46Ci0Jcm0gLWYgY29yZSBjb3JlLiogKi5wb3ggJChQQUNLQUdFKS5wbyAqLm9sZC5wbyBjYXQtaWQtdGJsLnRtcAotCXJtIC1mciAqLm8KLQotY2xlYW46IG1vc3RseWNsZWFuCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZSBNYWtlZmlsZS5pbiBQT1RGSUxFUyAqLm1vICoubXNnICouY2F0ICouY2F0Lm0KLQotbWFpbnRhaW5lci1jbGVhbjogZGlzdGNsZWFuCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0Jcm0gLWYgJChHTU9GSUxFUykKLQotZGlzdGRpciA9IC4uLyQoUEFDS0FHRSktJChWRVJTSU9OKS8kKHN1YmRpcikKLWRpc3QgZGlzdGRpcjogdXBkYXRlLXBvICQoRElTVEZJTEVTKQotCWRpc3RzPSIkKERJU1RGSUxFUykiOyBcCi0JZm9yIGZpbGUgaW4gJCRkaXN0czsgZG8gXAotCSAgbG4gJChzcmNkaXIpLyQkZmlsZSAkKGRpc3RkaXIpIDI+IC9kZXYvbnVsbCBcCi0JICAgIHx8IGNwIC1wICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKTsgXAotCWRvbmUKLQotdXBkYXRlLXBvOiBNYWtlZmlsZQotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQlQQVRIPWBwd2RgLy4uL3NyYzokJFBBVEg7IFwKLQljZCAkKHNyY2Rpcik7IFwKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBtdiAkJGxhbmcucG8gJCRsYW5nLm9sZC5wbzsgXAotCSAgZWNobyAiJCRsYW5nOiI7IFwKLQkgIGlmICQoTVNHTUVSR0UpICQkbGFuZy5vbGQucG8gJChQQUNLQUdFKS5wb3QgLW8gJCRsYW5nLnBvOyB0aGVuIFwKLQkgICAgcm0gLWYgJCRsYW5nLm9sZC5wbzsgXAotCSAgZWxzZSBcCi0JICAgIGVjaG8gIm1zZ21lcmdlIGZvciAkJGNhdCBmYWlsZWQhIjsgXAotCSAgICBybSAtZiAkJGxhbmcucG87IFwKLQkgICAgbXYgJCRsYW5nLm9sZC5wbyAkJGxhbmcucG87IFwKLQkgIGZpOyBcCi0JZG9uZQotCi1QT1RGSUxFUzogUE9URklMRVMuaW4KLQkoIGlmIHRlc3QgJ3gkKHNyY2RpciknICE9ICd4Lic7IHRoZW4gXAotCSAgICBwb3NyY3ByZWZpeD0nJCh0b3Bfc3JjZGlyKS8nOyBcCi0JICBlbHNlIFwKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyI7IFwKLQkgIGZpOyBcCi0JICBybSAtZiAkQC10ICRAIFwKLQkgICAgJiYgKHNlZCAtZSAnL14jL2QnIC1lICcvXlsgCV0qJCQvZCcgXAotCQkgICAgLWUgInNALipACSQkcG9zcmNwcmVmaXgmIFxcXFxAIiA8ICQoc3JjZGlyKS8kQC5pbiBcCi0JCXwgc2VkIC1lICckJHMvXFwkJC8vJykgPiAkQC10IFwKLQkgICAgJiYgY2htb2QgYS13ICRALXQgXAotCSAgICAmJiBtdiAkQC10ICRAICkKLQotUE9URklMRVMuaW46IEBNQUlOVEAgLi4vTWFrZWZpbGUKLQljZCAuLiAmJiAkKE1BS0UpIHBvL1BPVEZJTEVTLmluCi0KLU1ha2VmaWxlOiBNYWtlLWluIC4uL2NvbmZpZy5zdGF0dXMgUE9URklMRVMKLQljZCAuLiBcCi0JICAmJiBDT05GSUdfRklMRVM9JChzdWJkaXIpL01ha2VmaWxlLmluOiQoc3ViZGlyKS9NYWtlLWluIFwKLQkgICAgIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIG5vdCB0byBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvbGQvcG8vUE9URklMRVMuaW4gYi9sZC9wby9QT1RGSUxFUy5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhMGM4ZS4uMDAwMDAwMAotLS0gYS9sZC9wby9QT1RGSUxFUy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLWRlZmZpbGUuaAotZW11bHRlbXBsL2FybWNvZmYuZW0KLWVtdWx0ZW1wbC9wZS5lbQotbGQuaAotbGRjcmVmLmMKLWxkY3Rvci5jCi1sZGN0b3IuaAotbGRlbXVsLmMKLWxkZW11bC5oCi1sZGV4cC5jCi1sZGV4cC5oCi1sZGZpbGUuYwotbGRmaWxlLmgKLWxkbGFuZy5jCi1sZGxhbmcuaAotbGRsZXguaAotbGRtYWluLmMKLWxkbWFpbi5oCi1sZG1pc2MuYwotbGRtaXNjLmgKLWxkdmVyLmMKLWxkdmVyLmgKLWxkd3JpdGUuYwotbGR3cml0ZS5oCi1sZXhzdXAuYwotbXJpLmMKLW1yaS5oCi1wZS1kbGwuYwpkaWZmIC0tZ2l0IGEvbGQvcG8vbGQucG90IGIvbGQvcG8vbGQucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzAzNGNlLi4wMDAwMDAwCi0tLSBhL2xkL3BvL2xkLnBvdAorKysgL2Rldi9udWxsCkBAIC0xLDE0MjUgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDYtMDMgMDM6MTEtMDcwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGVtdWx0ZW1wbC9hcm1jb2ZmLmVtOjY1Ci1tc2dpZCAiICAtLXN1cHBvcnQtb2xkLWNvZGUgICBTdXBwb3J0IGludGVyd29ya2luZyB3aXRoIG9sZCBjb2RlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL2FybWNvZmYuZW06MTMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIkVycm9ycyBlbmNvdW50ZXJlZCBwcm9jZXNzaW5nIGZpbGUgJXMiCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjE5OAotbXNnaWQgIiIKLSIgIC0tYmFzZV9maWxlIDxiYXNlZmlsZT4gICAgICAgICAgICAgR2VuZXJhdGUgYSBiYXNlIGZpbGUgZm9yIHJlbG9jYXRhYmxlICIKLSJETExzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjE5OQotbXNnaWQgIiIKLSIgIC0tZGxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IGltYWdlIGJhc2UgdG8gdGhlIGRlZmF1bHQgZm9yIERMTHNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjAwCi1tc2dpZCAiICAtLWZpbGUtYWxpZ25tZW50IDxzaXplPiAgICAgICAgICAgIFNldCBmaWxlIGFsaWdubWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDEKLW1zZ2lkICIgIC0taGVhcCA8c2l6ZT4gICAgICAgICAgICAgICAgICAgICAgU2V0IGluaXRpYWwgc2l6ZSBvZiB0aGUgaGVhcFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDIKLW1zZ2lkICIiCi0iICAtLWltYWdlLWJhc2UgPGFkZHJlc3M+ICAgICAgICAgICAgIFNldCBzdGFydCBhZGRyZXNzIG9mIHRoZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwMwotbXNnaWQgIiIKLSIgIC0tbWFqb3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwNAotbXNnaWQgIiAgLS1tYWpvci1vcy12ZXJzaW9uIDxudW1iZXI+ICAgICAgICBTZXQgbWluaW11bSByZXF1aXJlZCBPUyB2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwNQotbXNnaWQgIiIKLSIgIC0tbWFqb3Itc3Vic3lzdGVtLXZlcnNpb24gPG51bWJlcj4gU2V0IG1pbmltdW0gcmVxdWlyZWQgT1Mgc3Vic3lzdGVtICIKLSJ2ZXJzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwNgotbXNnaWQgIiIKLSIgIC0tbWlub3ItaW1hZ2UtdmVyc2lvbiA8bnVtYmVyPiAgICAgU2V0IHJldmlzaW9uIG51bWJlciBvZiB0aGUgZXhlY3V0YWJsZVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMDcKLW1zZ2lkICIgIC0tbWlub3Itb3MtdmVyc2lvbiA8bnVtYmVyPiAgICAgICAgU2V0IG1pbmltdW0gcmVxdWlyZWQgT1MgcmV2aXNpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjA4Ci1tc2dpZCAiIgotIiAgLS1taW5vci1zdWJzeXN0ZW0tdmVyc2lvbiA8bnVtYmVyPiBTZXQgbWluaW11bSByZXF1aXJlZCBPUyBzdWJzeXN0ZW0gIgotInJldmlzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIwOQotbXNnaWQgIiAgLS1zZWN0aW9uLWFsaWdubWVudCA8c2l6ZT4gICAgICAgICBTZXQgc2VjdGlvbiBhbGlnbm1lbnRcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjEwCi1tc2dpZCAiICAtLXN0YWNrIDxzaXplPiAgICAgICAgICAgICAgICAgICAgIFNldCBzaXplIG9mIHRoZSBpbml0aWFsIHN0YWNrXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxMQotbXNnaWQgIiIKLSIgIC0tc3Vic3lzdGVtIDxuYW1lPls6PHZlcnNpb24+XSAgICAgU2V0IHJlcXVpcmVkIE9TIHN1YnN5c3RlbSBbJiB2ZXJzaW9uXVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTIKLW1zZ2lkICIiCi0iICAtLXN1cHBvcnQtb2xkLWNvZGUgICAgICAgICAgICAgICAgIFN1cHBvcnQgaW50ZXJ3b3JraW5nIHdpdGggb2xkIGNvZGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjE0Ci1tc2dpZCAiIgotIiAgLS1hZGQtc3RkY2FsbC1hbGlhcyAgICAgICAgICAgICAgICBFeHBvcnQgc3ltYm9scyB3aXRoIGFuZCB3aXRob3V0IEBublxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTUKLW1zZ2lkICIgIC0tZGlzYWJsZS1zdGRjYWxsLWZpeHVwICAgICAgICAgICAgRG9uJ3QgbGluayBfc3ltIHRvIF9zeW1Abm5cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjE2Ci1tc2dpZCAiIgotIiAgLS1lbmFibGUtc3RkY2FsbC1maXh1cCAgICAgICAgICAgICBMaW5rIF9zeW0gdG8gX3N5bUBubiB3aXRob3V0IHdhcm5pbmdzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIxNwotbXNnaWQgIiIKLSIgIC0tZXhjbHVkZS1zeW1ib2xzIHN5bSxzeW0sLi4uICAgICAgRXhjbHVkZSBzeW1ib2xzIGZyb20gYXV0b21hdGljIGV4cG9ydFxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMTgKLW1zZ2lkICIiCi0iICAtLWV4cG9ydC1hbGwtc3ltYm9scyAgICAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgZXhwb3J0IGFsbCBnbG9iYWxzIHRvICIKLSJETExcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MjE5Ci1tc2dpZCAiICAtLWtpbGwtYXQgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBAbm4gZnJvbSBleHBvcnRlZCBzeW1ib2xzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjIyMAotbXNnaWQgIiAgLS1vdXQtaW1wbGliIDxmaWxlPiAgICAgICAgICAgICAgICBHZW5lcmF0ZSBpbXBvcnQgbGlicmFyeVxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbToyMjEKLW1zZ2lkICIiCi0iICAtLW91dHB1dC1kZWYgPGZpbGU+ICAgICAgICAgICAgICAgIEdlbmVyYXRlIGEgLkRFRiBmaWxlIGZvciB0aGUgYnVpbHQgRExMXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjI4NAotbXNnaWQgIiVQOiB3YXJuaW5nOiBiYWQgdmVyc2lvbiBudW1iZXIgaW4gLXN1YnN5c3RlbSBvcHRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06MzAwCi1tc2dpZCAiJVAlRjogaW52YWxpZCBzdWJzeXN0ZW0gdHlwZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTozMTUKLW1zZ2lkICIlUCVGOiBpbnZhbGlkIGhleCBudW1iZXIgZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjMzMwotbXNnaWQgIiVQJUY6IHN0cmFuZ2UgaGV4IGluZm8gZm9yIFBFIHBhcmFtZXRlciAnJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjM3MgotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogQ2FuJ3Qgb3BlbiBiYXNlIGZpbGUgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBlbXVsdGVtcGwvcGUuZW06NTA1Ci1tc2dpZCAiJVA6IHdhcm5pbmcsIGZpbGUgYWxpZ25tZW50ID4gc2VjdGlvbiBhbGlnbm1lbnQuXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjU3NSBlbXVsdGVtcGwvcGUuZW06NjAxCi0jLCBjLWZvcm1hdAotbXNnaWQgIldhcm5pbmc6IHJlc29sdmluZyAlcyBieSBsaW5raW5nIHRvICVzXG4iCi1tc2dzdHIgIiIKLQotIzogZW11bHRlbXBsL3BlLmVtOjU4MCBlbXVsdGVtcGwvcGUuZW06NjA2Ci1tc2dpZCAiVXNlIC0tZW5hYmxlLXN0ZGNhbGwtZml4dXAgdG8gZGlzYWJsZSB0aGVzZSB3YXJuaW5nc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo1ODEgZW11bHRlbXBsL3BlLmVtOjYwNwotbXNnaWQgIlVzZSAtLWRpc2FibGUtc3RkY2FsbC1maXh1cCB0byBkaXNhYmxlIHRoZXNlIGZpeHVwc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo2MjMKLW1zZ2lkICIlRiVQOiBQRSBvcGVyYXRpb25zIG9uIG5vbiBQRSBmaWxlLlxuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo3MjQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo3NDcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiRXJyb3JzIGVuY291bnRlcmVkIHByb2Nlc3NpbmcgZmlsZSAlcyBmb3IgaW50ZXJ3b3JraW5nIgotbXNnc3RyICIiCi0KLSM6IGVtdWx0ZW1wbC9wZS5lbTo4MDIgbGRsYW5nLmM6MTY1NyBsZGxhbmcuYzozOTM0IGxkbGFuZy5jOjM5NjggbGRtYWluLmM6OTkyCi1tc2dpZCAiJVAlRjogYmZkX2xpbmtfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjE2MgotbXNnaWQgIiVYJVA6IGJmZF9oYXNoX3RhYmxlX2luaXQgb2YgY3JlZiB0YWJsZSBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MTY4Ci1tc2dpZCAiJVglUDogY3JlZl9oYXNoX2xvb2t1cCBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MjM5Ci1tc2dpZCAiIgotIlxuIgotIkNyb3NzIFJlZmVyZW5jZSBUYWJsZVxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjI0MAotbXNnaWQgIlN5bWJvbCIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzoyNDgKLW1zZ2lkICJGaWxlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6MjUyCi1tc2dpZCAiTm8gc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3JlZi5jOjM2OQotbXNnaWQgIiVQOiBzeW1ib2wgYCVUJyBtaXNzaW5nIGZyb20gbWFpbiBoYXNoIHRhYmxlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjcmVmLmM6NDQxCi1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczsgJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzo0NDUgbGRtYWluLmM6MTA2MCBsZG1haW4uYzoxMDY0Ci1tc2dpZCAiJUIlRjogY291bGQgbm90IHJlYWQgc3ltYm9sczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGNyZWYuYzo1MTcgbGRjcmVmLmM6NTI0IGxkbWFpbi5jOjExMTAgbGRtYWluLmM6MTExNwotbXNnaWQgIiVCJUY6IGNvdWxkIG5vdCByZWFkIHJlbG9jczogJUVcbiIKLW1zZ3N0ciAiIgotCi0jLiBXZSBmb3VuZCBhIHJlbG9jIGZvciB0aGUgc3ltYm9sLiAgVGhlIHN5bWJvbCBpcyBkZWZpbmVkCi0jLiBpbiBPVVRTRUNOQU1FLiAgVGhpcyByZWxvYyBpcyBmcm9tIGEgc2VjdGlvbiB3aGljaCBpcwotIy4gbWFwcGVkIGludG8gYSBzZWN0aW9uIGZyb20gd2hpY2ggcmVmZXJlbmNlcyB0byBPVVRTRUNOQU1FCi0jLiBhcmUgcHJvaGliaXRlZC4gIFdlIG11c3QgcmVwb3J0IGFuIGVycm9yLgotIzogbGRjcmVmLmM6NTQyCi1tc2dpZCAiJVglQzogcHJvaGliaXRlZCBjcm9zcyByZWZlcmVuY2UgZnJvbSAlcyB0byBgJVQnIGluICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjdG9yLmM6ODkKLW1zZ2lkICIlUCVYOiBEaWZmZXJlbnQgcmVsb2NzIHVzZWQgaW4gc2V0ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRjdG9yLmM6MTA2Ci1tc2dpZCAiJVAlWDogRGlmZmVyZW50IG9iamVjdCBmaWxlIGZvcm1hdHMgY29tcG9zaW5nIHNldCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkY3Rvci5jOjI4OCBsZGN0b3IuYzozMDIKLW1zZ2lkICIlUCVYOiAlcyBkb2VzIG5vdCBzdXBwb3J0IHJlbG9jICVzIGZvciBzZXQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzozMjMKLW1zZ2lkICIlUCVYOiBVbnN1cHBvcnRlZCBzaXplICVkIGZvciBzZXQgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGN0b3IuYzozNDQKLW1zZ2lkICIiCi0iXG4iCi0iU2V0ICAgICAgICAgICAgICAgICBTeW1ib2xcbiIKLSJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGVtdWwuYzoyMjMKLW1zZ2lkICIlUyBTWVNMSUIgaWdub3JlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjIzMQotbXNnaWQgIiVTIEhMTCBpZ25vcmVkXG4iCi1tc2dzdHIgIiIKLQotIzogbGRlbXVsLmM6MjUyCi1tc2dpZCAiJVA6IHVucmVjb2duaXNlZCBlbXVsYXRpb24gbW9kZTogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGVtdWwuYzoyNTMKLW1zZ2lkICJTdXBwb3J0ZWQgZW11bGF0aW9uczogIgotbXNnc3RyICIiCi0KLSM6IGxkZW11bC5jOjI5NwotbXNnaWQgIiAgbm8gZW11bGF0aW9uIHNwZWNpZmljIG9wdGlvbnMuXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzoxNTYKLW1zZ2lkICIlRiVQOiAlcyB1c2VzIHVuZGVmaW5lZCBzZWN0aW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzoxNTgKLW1zZ2lkICIlRiVQOiAlcyBmb3J3YXJkIHJlZmVyZW5jZSBvZiBzZWN0aW9uICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzoyNzAKLW1zZ2lkICIlRiVTICUlIGJ5IHplcm9cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjI3NwotbXNnaWQgIiVGJVMgLyBieSB6ZXJvXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo0MDAKLW1zZ2lkICIlWCVTOiB1bnJlc29sdmFibGUgc3ltYm9sIGAlcycgcmVmZXJlbmNlZCBpbiBleHByZXNzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo0MTkKLW1zZ2lkICIlRiVTOiB1bmRlZmluZWQgc3ltYm9sIGAlcycgcmVmZXJlbmNlZCBpbiBleHByZXNzaW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo2MDAKLW1zZ2lkICIlRiVTIGNhbiBub3QgUFJPVklERSBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYxMAotbXNnaWQgIiVGJVMgaW52YWxpZCBhc3NpZ25tZW50IHRvIGxvY2F0aW9uIGNvdW50ZXJcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjYxNAotbXNnaWQgIiVGJVMgYXNzaWdubWVudCB0byBsb2NhdGlvbiBjb3VudGVyIGludmFsaWQgb3V0c2lkZSBvZiBTRUNUSU9OXG4iCi1tc2dzdHIgIiIKLQotIzogbGRleHAuYzo2MjQKLW1zZ2lkICIlRiVTIGNhbm5vdCBtb3ZlIGxvY2F0aW9uIGNvdW50ZXIgYmFja3dhcmRzIChmcm9tICVWIHRvICVWKVxuIgotbXNnc3RyICIiCi0KLSM6IGxkZXhwLmM6NjUyCi1tc2dpZCAiJVAlRjolczogaGFzaCBjcmVhdGlvbiBmYWlsZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjk0OQotbXNnaWQgIiVGJVMgbm9uY29uc3RhbnQgZXhwcmVzc2lvbiBmb3IgJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGV4cC5jOjk4MgotbXNnaWQgIiVGJVMgbm9uIGNvbnN0YW50IGV4cHJlc3Npb24gZm9yICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MTA5Ci0jLCBjLWZvcm1hdAotbXNnaWQgImF0dGVtcHQgdG8gb3BlbiAlcyBmYWlsZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzoxMTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiYXR0ZW1wdCB0byBvcGVuICVzIHN1Y2NlZWRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjExOQotbXNnaWQgIiVGJVA6IGludmFsaWQgQkZEIHRhcmdldCBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjA0Ci1tc2dpZCAiJUYlUDogY2Fubm90IG9wZW4gJXMgZm9yICVzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjIwNwotbXNnaWQgIiVGJVA6IGNhbm5vdCBvcGVuICVzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjIyNQotbXNnaWQgIiVGJVA6IGNhbm5vdCBmaW5kICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MjQzIGxkZmlsZS5jOjI1OAotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW5ub3QgZmluZCBzY3JpcHQgZmlsZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjI0NSBsZGZpbGUuYzoyNjAKLSMsIGMtZm9ybWF0Ci1tc2dpZCAib3BlbmVkIHNjcmlwdCBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRmaWxlLmM6MzAzCi1tc2dpZCAiJVAlRjogY2Fubm90IG9wZW4gbGlua2VyIHNjcmlwdCBmaWxlICVzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjM0NAotbXNnaWQgIiVQJUY6IHVua25vd24gYXJjaGl0ZWN0dXJlOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkZmlsZS5jOjM2MQotbXNnaWQgIiVQJUY6IHRhcmdldCBhcmNoaXRlY3R1cmUgcmVzcGVjaWZpZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGZpbGUuYzo0MTQKLW1zZ2lkICIlUCVGOiBjYW5ub3QgcmVwcmVzZW50IG1hY2hpbmUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjcyMwotbXNnaWQgIiIKLSJcbiIKLSJNZW1vcnkgQ29uZmlndXJhdGlvblxuIgotIlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjcyNQotbXNnaWQgIk5hbWUiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NzI1Ci1tc2dpZCAiT3JpZ2luIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjcyNQotbXNnaWQgIkxlbmd0aCIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzo3MjUKLW1zZ2lkICJBdHRyaWJ1dGVzIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjc2NwotbXNnaWQgIiIKLSJcbiIKLSJMaW5rZXIgc2NyaXB0IGFuZCBtZW1vcnkgbWFwXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Nzg0Ci1tc2dpZCAiJVAlRjogSWxsZWdhbCB1c2Ugb2YgYCVzJyBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjc5NAotbXNnaWQgIiVQJUY6IG91dHB1dCBmb3JtYXQgJXMgY2Fubm90IHJlcHJlc2VudCBzZWN0aW9uIGNhbGxlZCAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjkxNQotbXNnaWQgIiVQOiAlQjogd2FybmluZzogaWdub3JpbmcgZHVwbGljYXRlIHNlY3Rpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjkyOQotbXNnaWQgIiVQOiAlQjogd2FybmluZzogZHVwbGljYXRlIHNlY3Rpb24gYCVzJyBoYXMgZGlmZmVyZW50IHNpemVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxMzIwCi1tc2dpZCAiJUI6IGZpbGUgbm90IHJlY29nbml6ZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTMyMQotbXNnaWQgIiVCOiBtYXRjaGluZyBmb3JtYXRzOiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxMzI4Ci1tc2dpZCAiJUYlQjogZmlsZSBub3QgcmVjb2duaXplZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxMzgxCi1tc2dpZCAiJUYlQjogb2JqZWN0ICVCIGluIGFyY2hpdmUgaXMgbm90IG9iamVjdFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjEzODcgbGRsYW5nLmM6MTM5OQotbXNnaWQgIiVGJUI6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTQ1MgotbXNnaWQgIiVQJUY6IHRhcmdldCAlcyBub3QgZm91bmRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDU0Ci1tc2dpZCAiJVAlRjogY2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXM6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTQ2MgotbXNnaWQgIiVQJUY6JXM6IGNhbiBub3QgbWFrZSBvYmplY3QgZmlsZTogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxNDY2Ci1tc2dpZCAiJVAlRjolczogY2FuIG5vdCBzZXQgYXJjaGl0ZWN0dXJlOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE0NzAKLW1zZ2lkICIlUCVGOiBjYW4gbm90IGNyZWF0ZSBsaW5rIGhhc2ggdGFibGU6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MTc4MAotbXNnaWQgIiBsb2FkIGFkZHJlc3MgMHglViIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoxOTA5Ci1tc2dpZCAiJVcgKHNpemUgYmVmb3JlIHJlbGF4aW5nKVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjE5ODgKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWRkcmVzcyBvZiBzZWN0aW9uICVzIHNldCB0byAiCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MjEyNwotIywgYy1mb3JtYXQKLW1zZ2lkICJGYWlsIHdpdGggJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyMzU3Ci1tc2dpZCAiJVglUDogc2VjdGlvbiAlcyBbJVYgLT4gJVZdIG92ZXJsYXBzIHNlY3Rpb24gJXMgWyVWIC0+ICVWXVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI0MDgKLW1zZ2lkICIlUCVYOiBJbnRlcm5hbCBlcnJvciBvbiBDT0ZGIHNoYXJlZCBsaWJyYXJ5IHNlY3Rpb24gJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNDQ5Ci1tc2dpZCAiJVA6IHdhcm5pbmc6IG5vIG1lbW9yeSByZWdpb24gc3BlY2lmaWVkIGZvciBzZWN0aW9uIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNDYyCi1tc2dpZCAiJVA6IHdhcm5pbmc6IGNoYW5naW5nIHN0YXJ0IG9mIHNlY3Rpb24gJXMgYnkgJXUgYnl0ZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNDc2Ci1tc2dpZCAiJUYlUzogbm9uIGNvbnN0YW50IGFkZHJlc3MgZXhwcmVzc2lvbiBmb3Igc2VjdGlvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI1MjgKLW1zZ2lkICIlWCVQOiBhZGRyZXNzIDB4JXYgb2YgJUIgc2VjdGlvbiAlcyBpcyBub3Qgd2l0aGluIHJlZ2lvbiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI1MzYKLW1zZ2lkICIlWCVQOiByZWdpb24gJXMgaXMgZnVsbCAoJUIgc2VjdGlvbiAlcylcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNjM4Ci1tc2dpZCAiJVAlRjogY2FuJ3QgcmVsYXggc2VjdGlvbjogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyNzk5Ci1tc2dpZCAiJUYlUDogaW52YWxpZCBkYXRhIHN0YXRlbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI4MjgKLW1zZ2lkICIlRiVQOiBpbnZhbGlkIHJlbG9jIHN0YXRlbWVudFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI5NjIKLW1zZ2lkICIlUCVGOiVzOiBjYW4ndCBzZXQgc3RhcnQgYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjI5NzUgbGRsYW5nLmM6Mjk5MgotbXNnaWQgIiVQJUY6IGNhbid0IHNldCBzdGFydCBhZGRyZXNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mjk4NwotbXNnaWQgIiVQOiB3YXJuaW5nOiBjYW5ub3QgZmluZCBlbnRyeSBzeW1ib2wgJXM7IGRlZmF1bHRpbmcgdG8gJVZcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZGxhbmcuYzoyOTk3Ci1tc2dpZCAiJVA6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbCAlczsgbm90IHNldHRpbmcgc3RhcnQgYWRkcmVzc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjMwMzkKLW1zZ2lkICIiCi0iJVA6IHdhcm5pbmc6ICVzIGFyY2hpdGVjdHVyZSBvZiBpbnB1dCBmaWxlIGAlQicgaXMgaW5jb21wYXRpYmxlIHdpdGggJXMgIgotIm91dHB1dFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjMwNTcKLW1zZ2lkICIlRSVYOiBmYWlsZWQgdG8gbWVyZ2UgdGFyZ2V0IHNwZWNpZmljIGRhdGEgb2YgZmlsZSAlQlxuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjMxNDIKLW1zZ2lkICIiCi0iXG4iCi0iQWxsb2NhdGluZyBjb21tb24gc3ltYm9sc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbGFuZy5jOjMxNDMKLW1zZ2lkICIiCi0iQ29tbW9uIHN5bWJvbCAgICAgICBzaXplICAgICAgICAgICAgICBmaWxlXG4iCi0iXG4iCi1tc2dzdHIgIiIKLQotIy4gVGhpcyBtZXNzYWdlIGhhcHBlbnMgd2hlbiB1c2luZyB0aGUKLSMuIHN2cjMuaWZpbGUgbGlua2VyIHNjcmlwdCwgc28gSSBoYXZlCi0jLiBkaXNhYmxlZCBpdC4KLSM6IGxkbGFuZy5jOjMyMzIKLW1zZ2lkICIlUDogbm8gW0NPTU1PTl0gY29tbWFuZCwgZGVmYXVsdGluZyB0byAuYnNzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6MzI5NQotbXNnaWQgIiVQJUY6IGludmFsaWQgc3ludGF4IGluIGZsYWdzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6Mzg5MQotbXNnaWQgIiVQJUZtdWx0aXBsZSBTVEFSVFVQIGZpbGVzXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDE1MwotbXNnaWQgIiVGJVA6IGJmZF9yZWNvcmRfcGhkciBmYWlsZWQ6ICVFXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDE3MgotbXNnaWQgIiVYJVA6IHNlY3Rpb24gYCVzJyBhc3NpZ25lZCB0byBub24tZXhpc3RlbnQgcGhkciBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDQ3MQotbXNnaWQgIiVYJVA6IHVua25vd24gbGFuZ3VhZ2UgYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDUyMAotbXNnaWQgIiVYJVA6IGR1cGxpY2F0ZSB2ZXJzaW9uIHRhZyBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDUzMyBsZGxhbmcuYzo0NTQ2Ci1tc2dpZCAiJVglUDogZHVwbGljYXRlIGV4cHJlc3Npb24gYCVzJyBpbiB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDU4MwotbXNnaWQgIiVYJVA6IHVuYWJsZSB0byBmaW5kIHZlcnNpb24gZGVwZW5kZW5jeSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRsYW5nLmM6NDYwNQotbXNnaWQgIiVYJVA6IHVuYWJsZSB0byByZWFkIC5leHBvcnRzIHNlY3Rpb24gY29udGVudHMiCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTkyCi1tc2dpZCAiJVglUDogY2FuJ3Qgc2V0IEJGRCBkZWZhdWx0IHRhcmdldCB0byBgJXMnOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjI1OAotbXNnaWQgIiVQJUY6IC1yIGFuZCAtLW1wYzg2MGMwIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjI2MAotbXNnaWQgIiVQJUY6IC0tcmVsYXggYW5kIC1yIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjI2MgotbXNnaWQgIiVQJUY6IC1yIGFuZCAtc2hhcmVkIG1heSBub3QgYmUgdXNlZCB0b2dldGhlclxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjI5MQotbXNnaWQgInVzaW5nIGludGVybmFsIGxpbmtlciBzY3JpcHQ6XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MzEwCi1tc2dpZCAiJVAlRjogbm8gaW5wdXQgZmlsZXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzozMTUKLW1zZ2lkICIlUDogbW9kZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjMzMwotbXNnaWQgIiVQJUY6IGNhbm5vdCBvcGVuIG1hcCBmaWxlICVzOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjM3OQotbXNnaWQgIiVQOiBsaW5rIGVycm9ycyBmb3VuZCwgZGVsZXRpbmcgZXhlY3V0YWJsZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MzkwCi1tc2dpZCAiJUYlQjogZmluYWwgY2xvc2UgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQxNAotbXNnaWQgIiVYJVA6IHVuYWJsZSB0byBvcGVuIGZvciBzb3VyY2Ugb2YgY29weSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDE2Ci1tc2dpZCAiJVglUDogdW5hYmxlIHRvIG9wZW4gZm9yIGRlc3RpbmF0aW9uIG9mIGNvcHkgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQyMgotbXNnaWQgIiVQOiBFcnJvciB3cml0aW5nIGZpbGUgYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQyOCBwZS1kbGwuYzo5ODEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVA6IEVycm9yIGNsb3NpbmcgZmlsZSBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6NDQ1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiB0b3RhbCB0aW1lIGluIGxpbms6ICVsZC4lMDZsZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQ0OAotIywgYy1mb3JtYXQKLW1zZ2lkICIlczogZGF0YSBzaXplICVsZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjQ4OQotbXNnaWQgIiVQJUY6IG1pc3NpbmcgYXJndW1lbnQgdG8gLW1cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo2MDMgbGRtYWluLmM6NjI0IGxkbWFpbi5jOjY1NQotbXNnaWQgIiVQJUY6IGJmZF9oYXNoX3RhYmxlX2luaXQgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjYwOCBsZG1haW4uYzo2MjcKLW1zZ2lkICIlUCVGOiBiZmRfaGFzaF9sb29rdXAgZmFpbGVkOiAlRVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjY0MgotbXNnaWQgIiVYJVA6IGVycm9yOiBkdXBsaWNhdGUgcmV0YWluLXN5bWJvbHMtZmlsZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjY4NgotbXNnaWQgIiVQJUY6IGJmZF9oYXNoX2xvb2t1cCBmb3IgaW5zZXJ0aW9uIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo2OTEKLW1zZ2lkICIlUDogYC1yZXRhaW4tc3ltYm9scy1maWxlJyBvdmVycmlkZXMgYC1zJyBhbmQgYC1TJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjc2OAotbXNnaWQgIkFyY2hpdmUgbWVtYmVyIGluY2x1ZGVkIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjc2OQotbXNnaWQgImJlY2F1c2Ugb2YgZmlsZSAoc3ltYm9sKSIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4NDEKLW1zZ2lkICIlWCVDOiBtdWx0aXBsZSBkZWZpbml0aW9uIG9mIGAlVCdcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4NDQKLW1zZ2lkICIlRDogZmlyc3QgZGVmaW5lZCBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODczCi1tc2dpZCAiJUI6IHdhcm5pbmc6IGRlZmluaXRpb24gb2YgYCVUJyBvdmVycmlkaW5nIGNvbW1vblxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg3NgotbXNnaWQgIiVCOiB3YXJuaW5nOiBjb21tb24gaXMgaGVyZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg4MwotbXNnaWQgIiVCOiB3YXJuaW5nOiBjb21tb24gb2YgYCVUJyBvdmVycmlkZGVuIGJ5IGRlZmluaXRpb25cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo4ODYKLW1zZ2lkICIlQjogd2FybmluZzogZGVmaW5lZCBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6ODkzCi1tc2dpZCAiJUI6IHdhcm5pbmc6IGNvbW1vbiBvZiBgJVQnIG92ZXJyaWRkZW4gYnkgbGFyZ2VyIGNvbW1vblxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjg5NgotbXNnaWQgIiVCOiB3YXJuaW5nOiBsYXJnZXIgY29tbW9uIGlzIGhlcmVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzo5MDAKLW1zZ2lkICIlQjogd2FybmluZzogY29tbW9uIG9mIGAlVCcgb3ZlcnJpZGluZyBzbWFsbGVyIGNvbW1vblxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjkwMwotbXNnaWQgIiVCOiB3YXJuaW5nOiBzbWFsbGVyIGNvbW1vbiBpcyBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTA3Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IG11bHRpcGxlIGNvbW1vbiBvZiBgJVQnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTA5Ci1tc2dpZCAiJUI6IHdhcm5pbmc6IHByZXZpb3VzIGNvbW1vbiBpcyBoZXJlXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6OTMxIGxkbWFpbi5jOjk3MAotbXNnaWQgIiVQOiB3YXJuaW5nOiBnbG9iYWwgY29uc3RydWN0b3IgJXMgdXNlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjk4MAotbXNnaWQgIiVQJUY6IEJGRCBiYWNrZW5kIGVycm9yOiBCRkRfUkVMT0NfQ1RPUiB1bnN1cHBvcnRlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjExNjYKLW1zZ2lkICIlRiVQOiBiZmRfaGFzaF90YWJsZV9pbml0IGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMTczCi1tc2dpZCAiJUYlUDogYmZkX2hhc2hfbG9va3VwIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMTkyCi1tc2dpZCAiJVglQzogdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBgJVQnXG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTE5NQotbXNnaWQgIiVEOiBtb3JlIHVuZGVmaW5lZCByZWZlcmVuY2VzIHRvIGAlVCcgZm9sbG93XG4iCi1tc2dzdHIgIiIKLQotIzogbGRtYWluLmM6MTIwMQotbXNnaWQgIiVYJUI6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYCVUJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyMDQKLW1zZ2lkICIlQjogbW9yZSB1bmRlZmluZWQgcmVmZXJlbmNlcyB0byBgJVQnIGZvbGxvd1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyMjUgbGRtYWluLmM6MTI0NyBsZG1haW4uYzoxMjY3Ci1tc2dpZCAiJVAlWDogZ2VuZXJhdGVkIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyMjgKLW1zZ2lkICIgcmVsb2NhdGlvbiB0cnVuY2F0ZWQgdG8gZml0OiAlcyAlVCIKLW1zZ3N0ciAiIgotCi0jOiBsZG1haW4uYzoxMjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgImRhbmdlcm91cyByZWxvY2F0aW9uOiAlc1xuIgotbXNnc3RyICIiCi0KLSM6IGxkbWFpbi5jOjEyNzAKLW1zZ2lkICIgcmVsb2MgcmVmZXJzIHRvIHN5bWJvbCBgJVQnIHdoaWNoIGlzIG5vdCBiZWluZyBvdXRwdXRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzoxNzgKLW1zZ2lkICJubyBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGRtaXNjLmM6MjQyCi0jLCBjLWZvcm1hdAotbXNnaWQgImJ1aWx0IGluIGxpbmtlciBzY3JpcHQ6JXUiCi1tc2dzdHIgIiIKLQotIzogbGRtaXNjLmM6MjkyIGxkbWlzYy5jOjI5NgotbXNnaWQgIiVCJUY6IGNvdWxkIG5vdCByZWFkIHN5bWJvbHNcbiIKLW1zZ3N0ciAiIgotCi0jLiBXZSB1c2UgYWJmZC0+ZmlsZW5hbWUgaW4gdGhpcyBpbml0aWFsIGxpbmUsCi0jLiBpbiBjYXNlIGZpbGVuYW1lIGlzIGEgLmggZmlsZSBvciBzb21ldGhpbmcKLSMuIHNpbWlsYXJseSB1bmhlbHBmdWwuCi0jOiBsZG1pc2MuYzozMzIKLW1zZ2lkICIlQjogSW4gZnVuY3Rpb24gYCVUJzpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZG1pc2MuYzo0NjQKLW1zZ2lkICIlRiVQOiBpbnRlcm5hbCBlcnJvciAlcyAlZFxuIgotbXNnc3RyICIiCi0KLSM6IGxkdmVyLmM6MzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiR05VIGxkIHZlcnNpb24gJXMgKHdpdGggQkZEICVzKVxuIgotbXNnc3RyICIiCi0KLSM6IGxkdmVyLmM6NDIgbGV4c3VwLmM6ODcyCi1tc2dpZCAiICBTdXBwb3J0ZWQgZW11bGF0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZHdyaXRlLmM6NTkgbGR3cml0ZS5jOjE5NQotbXNnaWQgIiVQJUY6IGJmZF9uZXdfbGlua19vcmRlciBmYWlsZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZHdyaXRlLmM6MzY1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiU4eCBzb21ldGhpbmcgZWxzZVxuIgotbXNnc3RyICIiCi0KLSM6IGxkd3JpdGUuYzo1MjYKLW1zZ2lkICIlRiVQOiBmaW5hbCBsaW5rIGZhaWxlZDogJUVcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTIgbGV4c3VwLmM6MjM1IGxleHN1cC5jOjI0MQotbXNnaWQgIktFWVdPUkQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTUyCi1tc2dpZCAiU2hhcmVkIGxpYnJhcnkgY29udHJvbCBmb3IgSFAvVVggY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTUKLW1zZ2lkICJBUkNIIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1NQotbXNnaWQgIlNldCBhcmNoaXRlY3R1cmUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTU3IGxleHN1cC5jOjMwMAotbXNnaWQgIlRBUkdFVCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNTcKLW1zZ2lkICJTcGVjaWZ5IHRhcmdldCBmb3IgZm9sbG93aW5nIGlucHV0IGZpbGVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1OSBsZXhzdXAuYzoxOTggbGV4c3VwLmM6MjA4IGxleHN1cC5jOjIxNyBsZXhzdXAuYzoyODQKLSM6IGxleHN1cC5jOjMwNyBsZXhzdXAuYzozNDEKLW1zZ2lkICJGSUxFIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE1OQotbXNnaWQgIlJlYWQgTVJJIGZvcm1hdCBsaW5rZXIgc2NyaXB0IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE2MQotbXNnaWQgIkZvcmNlIGNvbW1vbiBzeW1ib2xzIHRvIGJlIGRlZmluZWQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTY1IGxleHN1cC5jOjMzMSBsZXhzdXAuYzozMzMgbGV4c3VwLmM6MzM1Ci1tc2dpZCAiQUREUkVTUyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjUKLW1zZ2lkICJTZXQgc3RhcnQgYWRkcmVzcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjcKLW1zZ2lkICJFeHBvcnQgYWxsIGR5bmFtaWMgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNjkKLW1zZ2lkICJMaW5rIGJpZy1lbmRpYW4gb2JqZWN0cyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzEKLW1zZ2lkICJMaW5rIGxpdHRsZS1lbmRpYW4gb2JqZWN0cyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzMgbGV4c3VwLmM6MTc2Ci1tc2dpZCAiU0hMSUIiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTczCi1tc2dpZCAiQXV4aWxpYXJ5IGZpbHRlciBmb3Igc2hhcmVkIG9iamVjdCBzeW1ib2wgdGFibGUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTc2Ci1tc2dpZCAiRmlsdGVyIGZvciBzaGFyZWQgb2JqZWN0IHN5bWJvbCB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxNzgKLW1zZ2lkICJJZ25vcmVkIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4MAotbXNnaWQgIlNJWkUiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTgwCi1tc2dpZCAiU21hbGwgZGF0YSBzaXplIChpZiBubyBzaXplLCBzYW1lIGFzIC0tc2hhcmVkKSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODMKLW1zZ2lkICJGSUxFTkFNRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODMKLW1zZ2lkICJTZXQgaW50ZXJuYWwgbmFtZSBvZiBzaGFyZWQgbGlicmFyeSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODUKLW1zZ2lkICJMSUJOQU1FIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4NQotbXNnaWQgIlNlYXJjaCBmb3IgbGlicmFyeSBMSUJOQU1FIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4NwotbXNnaWQgIkRJUkVDVE9SWSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxODcKLW1zZ2lkICJBZGQgRElSRUNUT1JZIHRvIGxpYnJhcnkgc2VhcmNoIHBhdGgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTg5Ci1tc2dpZCAiRU1VTEFUSU9OIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE4OQotbXNnaWQgIlNldCBlbXVsYXRpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTkxCi1tc2dpZCAiUHJpbnQgbWFwIGZpbGUgb24gc3RhbmRhcmQgb3V0cHV0IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjE5MwotbXNnaWQgIkRvIG5vdCBwYWdlIGFsaWduIGRhdGEiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTk1Ci1tc2dpZCAiRG8gbm90IHBhZ2UgYWxpZ24gZGF0YSwgZG8gbm90IG1ha2UgdGV4dCByZWFkb25seSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxOTgKLW1zZ2lkICJTZXQgb3V0cHV0IGZpbGUgbmFtZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMDAKLW1zZ2lkICJPcHRpbWl6ZSBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMDIKLW1zZ2lkICJJZ25vcmVkIGZvciBTVlI0IGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjA0Ci1tc2dpZCAiR2VuZXJhdGUgcmVsb2NhdGVhYmxlIG91dHB1dCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMDgKLW1zZ2lkICJKdXN0IGxpbmsgc3ltYm9scyAoaWYgZGlyZWN0b3J5LCBzYW1lIGFzIC0tcnBhdGgpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIxMQotbXNnaWQgIlN0cmlwIGFsbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIxMwotbXNnaWQgIlN0cmlwIGRlYnVnZ2luZyBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIxNQotbXNnaWQgIlRyYWNlIGZpbGUgb3BlbnMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE3Ci1tc2dpZCAiUmVhZCBsaW5rZXIgc2NyaXB0IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIxOSBsZXhzdXAuYzoyMzEgbGV4c3VwLmM6MzI3IGxleHN1cC5jOjM0NCBsZXhzdXAuYzozNjEKLW1zZ2lkICJTWU1CT0wiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjE5Ci1tc2dpZCAiU3RhcnQgd2l0aCB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIFNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjEKLW1zZ2lkICJCdWlsZCBnbG9iYWwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0YWJsZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjIzCi1tc2dpZCAiUHJpbnQgdmVyc2lvbiBpbmZvcm1hdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjUKLW1zZ2lkICJQcmludCB2ZXJzaW9uIGFuZCBlbXVsYXRpb24gaW5mb3JtYXRpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjI3Ci1tc2dpZCAiRGlzY2FyZCBhbGwgbG9jYWwgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMjkKLW1zZ2lkICJEaXNjYXJkIHRlbXBvcmFyeSBsb2NhbCBzeW1ib2xzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzMQotbXNnaWQgIlRyYWNlIG1lbnRpb25zIG9mIFNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzMgbGV4c3VwLmM6MzA5IGxleHN1cC5jOjMxMQotbXNnaWQgIlBBVEgiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjMzCi1tc2dpZCAiRGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgU29sYXJpcyBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzNQotbXNnaWQgIklnbm9yZWQgZm9yIFNvbGFyaXMgY29tcGF0aWJpbGl0eSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyMzcKLW1zZ2lkICJTdGFydCBhIGdyb3VwIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjIzOQotbXNnaWQgIkVuZCBhIGdyb3VwIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI0MQotbXNnaWQgIklnbm9yZWQgZm9yIFN1bk9TIGNvbXBhdGliaWxpdHkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjQzCi1tc2dpZCAiTGluayBhZ2FpbnN0IHNoYXJlZCBsaWJyYXJpZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjQ5Ci1tc2dpZCAiRG8gbm90IGxpbmsgYWdhaW5zdCBzaGFyZWQgbGlicmFyaWVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI1NwotbXNnaWQgIkJpbmQgZ2xvYmFsIHJlZmVyZW5jZXMgbG9jYWxseSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNTkKLW1zZ2lkICJDaGVjayBzZWN0aW9uIGFkZHJlc3NlcyBmb3Igb3ZlcmxhcHMgKGRlZmF1bHQpIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI2MQotbXNnaWQgIkRvIG5vdCBjaGVjayBzZWN0aW9uIGFkZHJlc3NlcyBmb3Igb3ZlcmxhcHMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjY0Ci1tc2dpZCAiT3V0cHV0IGNyb3NzIHJlZmVyZW5jZSB0YWJsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjYKLW1zZ2lkICJTWU1CT0w9RVhQUkVTU0lPTiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyNjYKLW1zZ2lkICJEZWZpbmUgYSBzeW1ib2wiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjY4Ci1tc2dpZCAiRGVtYW5nbGUgc3ltYm9sIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3MAotbXNnaWQgIlBST0dSQU0iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjcwCi1tc2dpZCAiU2V0IHRoZSBkeW5hbWljIGxpbmtlciB0byB1c2UiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjcyCi1tc2dpZCAiR2VuZXJhdGUgZW1iZWRkZWQgcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3NAotbXNnaWQgIkZvcmNlIGdlbmVyYXRpb24gb2YgZmlsZSB3aXRoIC5leGUgc3VmZml4IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI3NgotbXNnaWQgIlJlbW92ZSB1bnVzZWQgc2VjdGlvbnMgKG9uIHNvbWUgdGFyZ2V0cykiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjc5Ci1tc2dpZCAiRG9uJ3QgcmVtb3ZlIHVudXNlZCBzZWN0aW9ucyAoZGVmYXVsdCkiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MjgyCi1tc2dpZCAiUHJpbnQgb3B0aW9uIGhlbHAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjg0Ci1tc2dpZCAiV3JpdGUgYSBtYXAgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyODYKLW1zZ2lkICJEbyBub3QgZGVtYW5nbGUgc3ltYm9sIG5hbWVzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI4OAotbXNnaWQgIlVzZSBsZXNzIG1lbW9yeSBhbmQgbW9yZSBkaXNrIEkvTyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyOTAKLW1zZ2lkICJBbGxvdyBubyB1bmRlZmluZWQgc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoyOTIKLW1zZ2lkICJEb24ndCB3YXJuIGFib3V0IG1pc21hdGNoZWQgaW5wdXQgZmlsZXMiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6Mjk0Ci1tc2dpZCAiVHVybiBvZmYgLS13aG9sZS1hcmNoaXZlIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjI5NgotbXNnaWQgIkNyZWF0ZSBhbiBvdXRwdXQgZmlsZSBldmVuIGlmIGVycm9ycyBvY2N1ciIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMDAKLW1zZ2lkICJTcGVjaWZ5IHRhcmdldCBvZiBvdXRwdXQgZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMDIKLW1zZ2lkICJJZ25vcmVkIGZvciBMaW51eCBjb21wYXRpYmlsaXR5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMwNAotbXNnaWQgIlJlbGF4IGJyYW5jaGVzIG9uIGNlcnRhaW4gdGFyZ2V0cyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMDcKLW1zZ2lkICJLZWVwIG9ubHkgc3ltYm9scyBsaXN0ZWQgaW4gRklMRSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMDkKLW1zZ2lkICJTZXQgcnVudGltZSBzaGFyZWQgbGlicmFyeSBzZWFyY2ggcGF0aCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMTEKLW1zZ2lkICJTZXQgbGluayB0aW1lIHNoYXJlZCBsaWJyYXJ5IHNlYXJjaCBwYXRoIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxMwotbXNnaWQgIkNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMxNwotbXNnaWQgIlNvcnQgY29tbW9uIHN5bWJvbHMgYnkgc2l6ZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMjEKLW1zZ2lkICJTcGxpdCBvdXRwdXQgc2VjdGlvbnMgZm9yIGVhY2ggZmlsZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMjMKLW1zZ2lkICJDT1VOVCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMjMKLW1zZ2lkICJTcGxpdCBvdXRwdXQgc2VjdGlvbnMgZXZlcnkgQ09VTlQgcmVsb2NzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyNQotbXNnaWQgIlByaW50IG1lbW9yeSB1c2FnZSBzdGF0aXN0aWNzIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMyNwotbXNnaWQgIkRvIHRhc2sgbGV2ZWwgbGlua2luZyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMjkKLW1zZ2lkICJVc2Ugc2FtZSBmb3JtYXQgYXMgbmF0aXZlIGxpbmtlciIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzEKLW1zZ2lkICJTZXQgYWRkcmVzcyBvZiAuYnNzIHNlY3Rpb24iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzMzCi1tc2dpZCAiU2V0IGFkZHJlc3Mgb2YgLmRhdGEgc2VjdGlvbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozMzUKLW1zZ2lkICJTZXQgYWRkcmVzcyBvZiAudGV4dCBzZWN0aW9uIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjMzNwotbXNnaWQgIk91dHB1dCBsb3RzIG9mIGluZm9ybWF0aW9uIGR1cmluZyBsaW5rIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM0MQotbXNnaWQgIlJlYWQgdmVyc2lvbiBpbmZvcm1hdGlvbiBzY3JpcHQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzQ0Ci1tc2dpZCAiIgotIlRha2UgZXhwb3J0IHN5bWJvbHMgbGlzdCBmcm9tIC5leHBvcnRzLCB1c2luZ1xuIgotIlx0XHRcdFx0U1lNQk9MIGFzIHRoZSB2ZXJzaW9uLiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNDcKLW1zZ2lkICJXYXJuIGFib3V0IGR1cGxpY2F0ZSBjb21tb24gc3ltYm9scyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNDkKLW1zZ2lkICJXYXJuIGlmIGdsb2JhbCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgYXJlIHNlZW4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzUyCi1tc2dpZCAiV2FybiBpZiB0aGUgbXVsdGlwbGUgR1AgdmFsdWVzIGFyZSB1c2VkIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM1NAotbXNnaWQgIldhcm4gb25seSBvbmNlIHBlciB1bmRlZmluZWQgc3ltYm9sIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjM1NgotbXNnaWQgIldhcm4gaWYgc3RhcnQgb2Ygc2VjdGlvbiBjaGFuZ2VzIGR1ZSB0byBhbGlnbm1lbnQiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MzU5Ci1tc2dpZCAiSW5jbHVkZSBhbGwgb2JqZWN0cyBmcm9tIGZvbGxvd2luZyBhcmNoaXZlcyIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNjEKLW1zZ2lkICJVc2Ugd3JhcHBlciBmdW5jdGlvbnMgZm9yIFNZTUJPTCIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNjMKLW1zZ2lkICJbPVdPUkRTXSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzozNjMKLW1zZ2lkICIiCi0iTW9kaWZ5IHByb2JsZW1hdGljIGJyYW5jaGVzIGluIGxhc3QgV09SRFMgKDEtMTAsXG4iCi0iXHRcdFx0XHRkZWZhdWx0IDUpIHdvcmRzIG9mIGEgcGFnZSIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo1MjUKLW1zZ2lkICIlUCVGOiB1bnJlY29nbml6ZWQgLWEgb3B0aW9uIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo1MzgKLW1zZ2lkICIlUCVGOiB1bnJlY29nbml6ZWQgLWFzc2VydCBvcHRpb24gYCVzJ1xuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjYyOQotbXNnaWQgIiVQJUY6IGludmFsaWQgbnVtYmVyIGAlcydcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo4MDEKLW1zZ2lkICIlUCVGOiAtc2hhcmVkIG5vdCBzdXBwb3J0ZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo4NjUKLW1zZ2lkICJDb3B5cmlnaHQgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo4NjYKLW1zZ2lkICIiCi0iVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZlxuIgotInRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFRoaXMgcHJvZ3JhbSBoYXMgYWJzb2x1dGVseSBubyB3YXJyYW50eS5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzo5NTcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IG1heSBub3QgbmVzdCBncm91cHMgKC0taGVscCBmb3IgdXNhZ2UpXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6OTY4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVzOiBncm91cCBlbmRlZCBiZWZvcmUgaXQgYmVnYW4gKC0taGVscCBmb3IgdXNhZ2UpXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6OTg0Ci1tc2dpZCAiSW52YWxpZCBhcmd1bWVudCB0byBvcHRpb24gXCJtcGM4NjBjMFwiXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTAzMQotbXNnaWQgIiVQJUY6IGludmFsaWQgaGV4IG51bWJlciBgJXMnXG4iCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTA0MwotIywgYy1mb3JtYXQKLW1zZ2lkICJVc2FnZTogJXMgW29wdGlvbnNdIGZpbGUuLi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMDQ1Ci1tc2dpZCAiT3B0aW9uczpcbiIKLW1zZ3N0ciAiIgotCi0jOiBsZXhzdXAuYzoxMTIyCi0jLCBjLWZvcm1hdAotbXNnaWQgIiIKLSIlczogc3VwcG9ydGVkIHRhcmdldHM6XG4iCi0iICAiCi1tc2dzdHIgIiIKLQotIzogbGV4c3VwLmM6MTEzMAotIywgYy1mb3JtYXQKLW1zZ2lkICIiCi0iJXM6IHN1cHBvcnRlZCBlbXVsYXRpb25zOlxuIgotIiAgIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjExMzUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IGVtdWxhdGlvbiBzcGVjaWZpYyBvcHRpb25zOlxuIgotbXNnc3RyICIiCi0KLSM6IGxleHN1cC5jOjExMzkKLW1zZ2lkICIiCi0iXG4iCi0iUmVwb3J0IGJ1Z3MgdG8gYnVnLWdudS11dGlsc0BnbnUub3JnXG4iCi1tc2dzdHIgIiIKLQotIzogbXJpLmM6MzQyCi1tc2dpZCAiJVAlRjogdW5rbm93biBmb3JtYXQgdHlwZSAlc1xuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjExNAotIywgYy1mb3JtYXQKLW1zZ2lkICIlWFVuc3VwcG9ydGVkIFBFSSBhcmNoaXRlY3R1cmU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6MzQ2Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYRXJyb3IsIGR1cGxpY2F0ZSBFWFBPUlQgd2l0aCBvcmlkaW5hbHM6ICVzICglZCB2cyAlZClcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzozNTIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiV2FybmluZywgZHVwbGljYXRlIEVYUE9SVDogJXNcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo0MDUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgbm90IGRlZmluZWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo0MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJVhDYW5ub3QgZXhwb3J0ICVzOiBzeW1ib2wgd3JvbmcgdHlwZSAoJWQgdnMgJWQpXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6NDE4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYQ2Fubm90IGV4cG9ydCAlczogc3ltYm9sIG5vdCBmb3VuZFxuIgotbXNnc3RyICIiCi0KLSM6IHBlLWRsbC5jOjU0MwotIywgYy1mb3JtYXQKLW1zZ2lkICIlWEVycm9yLCBvcmlkaW5hbCB1c2VkIHR3aWNlOiAlZCAoJXMgdnMgJXMpXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6NzM1Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYRXJyb3I6ICVkLWJpdCByZWxvYyBpbiBkbGxcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzo4NTQKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiJXM6IENhbid0IG9wZW4gb3V0cHV0IGRlZiBmaWxlICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6OTc2Ci1tc2dpZCAiOyBubyBjb250ZW50cyBhdmFpbGFibGVcbiIKLW1zZ3N0ciAiIgotCi0jOiBwZS1kbGwuYzoxNDI4Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiVYQ2FuJ3Qgb3BlbiAubGliIGZpbGU6ICVzXG4iCi1tc2dzdHIgIiIKLQotIzogcGUtZGxsLmM6MTQzMwotIywgYy1mb3JtYXQKLW1zZ2lkICJDcmVhdGluZyBsaWJyYXJ5IGZpbGU6ICVzXG4iCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL1JFQURNRSBiL2xkL3NjcmlwdHRlbXBsL1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZhZDJlOS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgbGlua2VyIHNjcmlwdCB0ZW1wbGF0ZXMuCi1nZW5zY3JpcHRzLnNoIHNldHMgc29tZSBzaGVsbCB2YXJpYWJsZXMsIHRoZW4gc291cmNlcwotRU1VTEFUSU9OLnNjLCB0byBnZW5lcmF0ZSBFTVVMQVRJT04ue3gseHIseHUseG4seGJufSAtLSB0aGUgc2NyaXB0Ci1maWxlcyBmb3IgZGVmYXVsdCwgLXIsIC1VciwgLW4sIC1OLgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYTI5ay5zYyBiL2xkL3NjcmlwdHRlbXBsL2EyOWsuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MjViMWUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvYTI5ay5zYworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotU0VDVElPTlMKLXsKLSAgLnRleHQgOiB7Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIF9fZXRleHQgID0gIC59OwotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmxpdCkKLSAgICAqKC5zaGRhdGEpCi0gIH0KLSAgLnNoYnNzIFNJWkVPRigudGV4dCkgKyBBRERSKC50ZXh0KSA6CXsKLSAgICAqKC5zaGJzcykKLSAgfSAKLSAgLmRhdGEgIDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2VkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICAgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpIDoKLSAgeyAJCQkJCQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAgICR7UkVMT0NBVElORysgX19lbmQgPSBBTElHTigweDgpfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9haXguc2MgYi9sZC9zY3JpcHR0ZW1wbC9haXguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNGI2MTcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvYWl4LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBBSVggbGlua2VyIHNjcmlwdC4KLSMgQUlYIGFsd2F5cyB1c2VzIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgc2VjdGlvbiBWTUEgYXBwZWFycyB0byBiZQotIyB1bmltcG9ydGFudC4gIFRoZSBuYXRpdmUgbGlua2VyIGFsaWducyB0aGUgc2VjdGlvbnMgb24gYm91bmRhcmllcwotIyBzcGVjaWZpZWQgYnkgdGhlIC1IIG9wdGlvbi4KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLUVOVFJZKF9fc3RhcnQpCi1TRUNUSU9OUwotewotICAucGFkIDAgOiB7ICooLnBhZCkgfQotICAudGV4dCAke1JFTE9DQVRJTkctMH0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF90ZXh0ID0gLik7fQotICAgICooLnRleHQpCi0gICAgKigucHIpCi0gICAgKigucm8pCi0gICAgKiguZGIpCi0gICAgKiguZ2wpCi0gICAgKigueG8pCi0gICAgKigudGkpCi0gICAgKigudGIpCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9ldGV4dCA9IC4pO30KLSAgfQotICAuZGF0YSAwIDogewotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfZGF0YSA9IC4pO30KLSAgICAqKC5kYXRhKQotICAgICooLnJ3KQotICAgICooLnN2KQotICAgICooLnVhKQotICAgIC4gPSBBTElHTig0KTsKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgKiguZHMpCi0gICAgKigudGMwKQotICAgICooLnRjKQotICAgICooLnRkKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfZWRhdGEgPSAuKTt9Ci0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC50b2Nic3MpCi0gICAgKiguYnNzKQotICAgICooLmJzKQotICAgICooLnVjKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfZW5kID0gLik7fQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0gIH0KLSAgLmxvYWRlciAwIDogewotICAgICooLmxvYWRlcikKLSAgfQotICAuZGVidWcgMCA6IHsKLSAgICAqKC5kZWJ1ZykKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9hbHBoYS5zYyBiL2xkL3NjcmlwdHRlbXBsL2FscGhhLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGExMGM0Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2FscGhhLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBBbHBoYSBzeXN0ZW1zLgotIyBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0jIFRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZW11bGF0aW9uIGZpbGUuICBUaGUKLSMgZGVmYXVsdHMgYXJlIGFwcHJvcHJpYXRlIGZvciBhbiBBbHBoYSBydW5uaW5nIE9TRi8xLgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fX3N0YXJ0Ci10ZXN0IC16ICIkVEVYVF9TVEFSVF9BRERSIiAmJiBURVhUX1NUQVJUX0FERFI9IjB4MTIwMDAwMDAwICsgU0laRU9GX0hFQURFUlMiCi1pZiB0ZXN0ICJ4JExEX0ZMQUciID0gInhuIiAtbyAieCRMRF9GTEFHIiA9ICJ4TiI7IHRoZW4KLSAgREFUQV9BRERSPS4KLWVsc2UKLSAgdGVzdCAteiAiJERBVEFfQUREUiIgJiYgREFUQV9BRERSPTB4MTQwMDAwMDAwCi1maQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfU1RBUlRfQUREUn07fQotICAudGV4dCA6IHsKLSAgICAke1JFTE9DQVRJTkcrIF9mdGV4dCA9IC4gfTsKLSAgICAke1JFTE9DQVRJTkcrIF9faXN0YXJ0ID0gLiB9OwotICAgICR7UkVMT0NBVElORysgKiguaW5pdCkgfQotICAgICR7UkVMT0NBVElORysgTE9ORyAoMHg2YmZhODAwMSl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBlcHJvbCAgPSAgLn07Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIF9fZnN0YXJ0ID0gLiB9OwotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBMT05HICgweDZiZmE4MDAxKX0KLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCAgPSAgLn07Ci0gIH0KLSAgLnJkYXRhIDogewotICAgICooLnJkYXRhKQotICB9Ci0gIC5yY29uc3QgOiB7Ci0gICAgKigucmNvbnN0KQotICB9Ci0gIC5wZGF0YSA6IHsKLSAgICAke1JFTE9DQVRJTkcrIF9mcGRhdGEgPSAuO30KLSAgICAqKC5wZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSfTt9Ci0gIC5kYXRhIDogewotICAgICR7UkVMT0NBVElORysgX2ZkYXRhID0gLjt9Ci0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gIH0KLSAgLnhkYXRhIDogewotICAgICooLnhkYXRhKQotICB9Ci0gICR7UkVMT0NBVElORysgX2dwID0gQUxJR04gKDE2KSArIDB4ODAwMDt9Ci0gIC5saXQ4IDogewotICAgICooLmxpdDgpCi0gIH0KLSAgLmxpdGEgOiB7Ci0gICAgKigubGl0YSkKLSAgfQotICAuc2RhdGEgOiB7Ci0gICAgKiguc2RhdGEpCi0gIH0KLSAgJHtSRUxPQ0FUSU5HKyBfRURBVEEgID0gIC47fQotICAke1JFTE9DQVRJTkcrIF9GQlNTID0gLjt9Ci0gIC5zYnNzIDogewotICAgICooLnNic3MpCi0gICAgKiguc2NvbW1vbikKLSAgfQotICAuYnNzIDogewotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYW91dC5zYyBiL2xkL3NjcmlwdHRlbXBsL2FvdXQuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZGJiMzcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvYW91dC5zYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtBTElHTk1FTlR9IiAmJiBBTElHTk1FTlQ9IjQiCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLSR7U0hMSUJfUEFUSCske1JFTE9DQVRJTkcrJHtTSExJQl9QQVRIfX19Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc3RhY2sgPSAwKTt9Ci1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDoKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLnRleHQpCi0gICAgLyogVGhlIG5leHQgc2l4IHNlY3Rpb25zIGFyZSBmb3IgU3VuT1MgZHluYW1pYyBsaW5raW5nLiAgVGhlIG9yZGVyCi0gICAgICAgaXMgaW1wb3J0YW50LiAgKi8KLSAgICAqKC5keW5yZWwpCi0gICAgKiguaGFzaCkKLSAgICAqKC5keW5zeW0pCi0gICAgKiguZHluc3RyKQotICAgICooLnJ1bGVzKQotICAgICooLm5lZWQpCi0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORytfX2V0ZXh0ID0gLjt9Ci0gICAgJHtQQURfVEVYVCske1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O319Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUxJR05NRU5UfTt9Ci0gIC5kYXRhIDoKLSAgewotICAgIC8qIFRoZSBmaXJzdCB0aHJlZSBzZWN0aW9ucyBhcmUgZm9yIFN1bk9TIGR5bmFtaWMgbGlua2luZy4gICovCi0gICAgKiguZHluYW1pYykKLSAgICAqKC5nb3QpCi0gICAgKigucGx0KQotICAgICooLmRhdGEpCi0gICAgKigubGludXgtZHluYW1pYykgLyogRm9yIExpbnV4IGR5bmFtaWMgbGlua2luZy4gICovCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzIDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7QUxJR05NRU5UfSk7fQotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIH07Ci0gICAke1JFTE9DQVRJTkcrX19lbmQgPSAuIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYXJtYW91dC5zYyBiL2xkL3NjcmlwdHRlbXBsL2FybWFvdXQuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Mjc2YTguLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvYXJtYW91dC5zYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ci1TRUNUSU9OUwotewotICAudGV4dCAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDoKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICR7UkVMT0NBVElORytfX3N0ZXh0XyA9IC47fQotICAgICooLnRleHQpCi0gICAgJHtQQURfVEVYVCske1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O319Ci0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrJHtEQVRBX0FMSUdOTUVOVH19IDoKLSAgewotICAgICR7UkVMT0NBVElORytfX3NkYXRhXyA9IC47fQotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAgICR7UkVMT0NBVElORytfX2VkYXRhICA9ICAuO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIgKC5kYXRhKX0gOgotICB7Ci0gICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvYXJtY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2FybWNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDcxNjkuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvYXJtY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgQVJNIENPRkYuCi0jIEJhc2VkIG9uIGkzODZjb2ZmLnNjIGJ5IElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1pZiB0ZXN0IC16ICIke0RBVEFfQUREUn0iOyB0aGVuCi0gIGlmIHRlc3QgIiRMRF9GTEFHIiA9ICJOIiB8fCB0ZXN0ICIkTERfRkxBRyIgPSAibiI7IHRoZW4KLSAgICBEQVRBX0FERFI9LgotICBmaQotZmkKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC8qIFdlIHN0YXJ0IGF0IDB4ODAwMCBiZWNhdXNlIGdkYiBhc3N1bWVzIGl0IChzZWUgRlJBTUVfQ0hBSU4pLgotICAgICBUaGlzIGlzIGFuIGFydGlmYWN0IG9mIHRoZSBBUk0gRGVtb24gbW9uaXRvciB1c2luZyB0aGUgYm90dG9tIDMyawotICAgICBhcyB3b3Jrc3BhY2UgKHNoYXJlZCB3aXRoIHRoZSBGUCBpbnN0cnVjdGlvbiBlbXVsYXRvciBpZgotICAgICBwcmVzZW50KTogKi8KLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAweDgwMDB9IDogewotICAgICooLmluaXQpCi0gICAgKigudGV4dCkKLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAqKC5yZGF0YSkKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyR7REFUQV9BRERSLTB4NDAwMDAgKyAoLiAmIDB4ZmZmYzBmZmYpfX0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyAgX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIF9fZGF0YV9lbmRfXyA9IC4gO30KLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydF9fID0gLiA7fQotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgICAke1JFTE9DQVRJTkcrIF9fYnNzX2VuZF9fID0gLiA7fQotICB9Ci0KLSAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLjt9Ci0gICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYyBiL2xkL3NjcmlwdHRlbXBsL2RlbHRhNjguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OTYzMDUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZGVsdGE2OC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoX3N0YXJ0KQotJHtSRUxPQ0FUSU5HKyR7TElCX1NFQVJDSF9ESVJTfX0KLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAweDIwMDAgKyBTSVpFT0ZfSEVBREVSU30gOgotICAgIHsKLSAgICAgICR7UkVMT0NBVElORysgX18udGV4dC5zdGFydCA9IC59OwotICAgICAgKigudGV4dCkKLSAgICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICAgJHtSRUxPQ0FUSU5HKyBfZXRleHQgID0gIC47fQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZXh0LmVuZCA9IC59OwotICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX0NUT1JfRU5EX18gLSBfX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfRU5EX18gPSAuO30KLSAgICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gICAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIFNJWkVPRigudGV4dCkgKyBBRERSKC50ZXh0KSArIDB4NDAwMDAwfSA6Ci0gICAgewotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5kYXRhLnN0YXJ0ID0gLn07Ci0gICAgICAqKC5kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSAgPSAgLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmRhdGEuZW5kID0gLn07Ci0gICAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gICAgeyAJCQkJCQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5ic3Muc3RhcnQgPSAufTsKLSAgICAgICooLmJzcykKLSAgICAgICooQ09NTU9OKQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5ic3MuZW5kID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrIGVuZCA9IEFMSUdOKDB4OCl9OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gQUxJR04oMHg4KX07Ci0gICAgfQotICAuY29tbWVudCAke1JFTE9DQVRJTkcrIDB9IDoKLSAgICB7Ci0gICAgICAqKC5jb21tZW50KQotICAgIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWJtb24yOWsuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwNTBlZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lYm1vbjI5ay5zYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1FTlRSWShzdGFydCkKLQotU0VDVElPTlMgewotICAudGV4dCAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fSA6IAotICAgIHsKLQkqKC50ZXh0KTsKLQkke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07Ci0gICAgfQotICBkYXRhICR7UkVMT0NBVElORysweDgwMDAyMDAwfSA6Ci0gICAgewotCSooLmRhdGEpOwotCSooLm1zdGFjayk7IAotCSooLnNoYnNzKTsKLQkqKC5yc3RhY2spOwotCSooLm1zdGFjayk7Ci0JJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgIH0KLSAgLmJzcyAgLiA6Ci0gICAgeyAKLQkqKENPTU1PTikgCQotCSooLmJzcyk7Ci0JJHtSRUxPQ0FUSU5HK19lbmQgPSAufTsKLSAgICB9IAotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9lbGYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9lbGYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjRhYzYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZWxmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLSMKLSMgVW51c3VhbCB2YXJpYWJsZXMgY2hlY2tlZCBieSB0aGlzIGNvZGU6Ci0jCU5PUCAtIHR3byBieXRlIG9wY29kZSBmb3Igbm8tb3AgKGRlZmF1bHRzIHRvIDApCi0jCURBVEFfQUREUiAtIGlmIGVuZC1vZi10ZXh0LXBsdXMtb25lLXBhZ2UgaXNuJ3QgcmlnaHQgZm9yIGRhdGEgc3RhcnQKLSMJSU5JVElBTF9SRUFET05MWV9TRUNUSU9OUyAtIGF0IHN0YXJ0IG9mIHRleHQgc2VnbWVudAotIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLnJvZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLm1pbGxpKQotIwlPVEhFUl9URVhUX1NFQ1RJT05TIC0gdGhlc2UgZ2V0IHB1dCBpbiAudGV4dCB3aGVuIHJlbG9jYXRpbmcKLSMJT1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAuZGF0YSAuYnNzIC5jdG9ycyAuc2RhdGEgLi4uCi0jCQkoZS5nLiwgLlBBUklTQy5nbG9iYWwpCi0jCU9USEVSX1NFQ1RJT05TIC0gYXQgdGhlIGVuZAotIwlFWEVDVVRBQkxFX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgbXVzdCBiZSBkZWZpbmVkIGZvciBhbgotIwkJZXhlY3V0YWJsZSAoZS5nLiwgX0RZTkFNSUNfTElOSykKLSMJVEVYVF9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkudGV4dCBzZWN0aW9uLgotIwlEQVRBX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5kYXRhIHNlY3Rpb24uCi0jCU9USEVSX0dPVF9TWU1CT0xTIC0gc3ltYm9scyBkZWZpbmVkIGp1c3QgYmVmb3JlIC5nb3QuCi0jCU9USEVSX0dPVF9TRUNUSU9OUyAtIHNlY3Rpb25zIGp1c3QgYWZ0ZXIgLmdvdCBhbmQgLnNkYXRhLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCURBVEFfUExUIC0gLnBsdCBzaG91bGQgYmUgaW4gZGF0YSBzZWdtZW50LCBub3QgdGV4dCBzZWdtZW50LgotIwlURVhUX0RZTkFNSUMgLSAuZHluYW1pYyBpbiB0ZXh0IHNlZ21lbnQsIG5vdCBkYXRhIHNlZ21lbnQuCi0jCUVNQkVEREVEIC0gd2hldGhlciB0aGlzIGlzIGZvciBhbiBlbWJlZGRlZCBzeXN0ZW0uIAotIwlTSExJQl9URVhUX1NUQVJUX0FERFIgLSBpZiBzZXQsIGFkZCB0byBTSVpFT0ZfSEVBREVSUyB0byBzZXQKLSMJCXN0YXJ0IGFkZHJlc3Mgb2Ygc2hhcmVkIGxpYnJhcnkuCi0jCUlOUFVUX0ZJTEVTIC0gSU5QVVQgY29tbWFuZCBvZiBmaWxlcyB0byBhbHdheXMgaW5jbHVkZQotIwlXUklUQUJMRV9ST0RBVEEgLSBpZiBzZXQsIHRoZSAucm9kYXRhIHNlY3Rpb24gc2hvdWxkIGJlIHdyaXRhYmxlCi0jCi0jIFdoZW4gYWRkaW5nIHNlY3Rpb25zLCBkbyBub3RlIHRoYXQgdGhlIG5hbWVzIG9mIHNvbWUgc2VjdGlvbnMgYXJlIHVzZWQKLSMgd2hlbiBzcGVjaWZ5aW5nIHRoZSBzdGFydCBhZGRyZXNzIG9mIHRoZSBuZXh0LgotIwotCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1pZiBbIC16ICIkTUFDSElORSIgXTsgdGhlbiBPVVRQVVRfQVJDSD0ke0FSQ0h9OyBlbHNlIE9VVFBVVF9BUkNIPSR7QVJDSH06JHtNQUNISU5FfTsgZmkKLXRlc3QgLXogIiR7RUxGU0laRX0iICYmIEVMRlNJWkU9MzIKLXRlc3QgLXogIiR7QUxJR05NRU5UfSIgJiYgQUxJR05NRU5UPSIke0VMRlNJWkV9IC8gOCIKLXRlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgotSU5URVJQPSIuaW50ZXJwICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIAl9IgotUExUPSIucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucGx0KQl9IgotRFlOQU1JQz0iLmR5bmFtaWMgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluYW1pYykgfSIKLVJPREFUQT0iLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YSkgJHtSRUxPQ0FUSU5HKyooLnJvZGF0YS4qKX0gJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS5yKil9IH0iCi1DVE9SPSIuY3RvcnMgJHtDT05TVFJVQ1RJTkctMH0gOiAKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9TVEFSVH19Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgotICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcwotICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKLSAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCi0gICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KLSAgICAgICBpcyBpbi4gICovCi0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KLSAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCi0gICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCi0gICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCi0KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfRU5EfX0KLSAgfSIKLQotRFRPUj0iIC5kdG9ycyAgICAgICAke0NPTlNUUlVDVElORy0wfSA6Ci0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfU1RBUlR9fQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX0VORH19Ci0gIH0iCi0KLSMgaWYgdGhpcyBpcyBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLCBkb24ndCBhZGQgU0laRU9GX0hFQURFUlMuCi1pZiBbIC16ICIkRU1CRURERUQiIF07IHRoZW4KLSAgIHRlc3QgLXogIiR7VEVYVF9CQVNFX0FERFJFU1N9IiAmJiBURVhUX0JBU0VfQUREUkVTUz0iJHtURVhUX1NUQVJUX0FERFJ9ICsgU0laRU9GX0hFQURFUlMiCi1lbHNlCi0gICB0ZXN0IC16ICIke1RFWFRfQkFTRV9BRERSRVNTfSIgJiYgVEVYVF9CQVNFX0FERFJFU1M9IiR7VEVYVF9TVEFSVF9BRERSfSIKLWZpCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7T1VUUFVUX0FSQ0h9KQotRU5UUlkoJHtFTlRSWX0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1JFTE9DQVRJTkcrLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICR7U1RBQ0taRVJPKyR7U1RBQ0taRVJPfX0gJHtTSExJQl9QQVRIKyR7U0hMSUJfUEFUSH19ICAqL30KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkcrJHtJTlBVVF9GSUxFU319Ci0ke1JFTE9DQVRJTkctIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcwotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZwotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovfQotCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtDUkVBVEVfU0hMSUItJHtSRUxPQ0FUSU5HKy4gPSAke1RFWFRfQkFTRV9BRERSRVNTfTt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9ICR7U0hMSUJfVEVYVF9TVEFSVF9BRERSOi0wfSArIFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCLSR7SU5URVJQfX0KLSAgJHtJTklUSUFMX1JFQURPTkxZX1NFQ1RJT05TfQotICAke1RFWFRfRFlOQU1JQyske0RZTkFNSUN9fQotICAuaGFzaCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikJCX0KLSAgLmdudS52ZXJzaW9uICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb24pCX0KLSAgLmdudS52ZXJzaW9uX2QgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9kKQl9Ci0gIC5nbnUudmVyc2lvbl9yICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fcikJfQotICAucmVsLnRleHQgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWwudGV4dCkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwudGV4dC4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZ251LmxpbmtvbmNlLnQqKX0KLSAgICB9Ci0gIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEudGV4dCkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLnRleHQuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UudCopfQotICAgIH0KLSAgLnJlbC5kYXRhICAgICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmRhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLmdudS5saW5rb25jZS5kKil9Ci0gICAgfQotICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLmRhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLmQqKX0KLSAgICB9Ci0gIC5yZWwucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbC5yb2RhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsLnJvZGF0YS4qKX0KLSAgICAgICR7UkVMT0NBVElORysqKC5yZWwuZ251LmxpbmtvbmNlLnIqKX0KLSAgICB9Ci0gIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEucm9kYXRhKQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEucm9kYXRhLiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLnIqKX0KLSAgICB9Ci0gIC5yZWwuZ290ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmluaXQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuaW5pdCkJfQotICAucmVsYS5pbml0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpCX0KLSAgLnJlbC5maW5pICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmZpbmkpCX0KLSAgLnJlbGEuZmluaSAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5maW5pKQl9Ci0gIC5yZWwuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5ic3MpCQl9Ci0gIC5yZWxhLmJzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKQkJfQotICAucmVsLnBsdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkJCX0KLSAgLmluaXQgICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgS0VFUCAoKiguaW5pdCkpCX0gPSR7Tk9QLTB9Ci0gICR7REFUQV9QTFQtJHtQTFR9fQotICAudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysqKC50ZXh0LiopfQotICAgICooLnN0dWIpCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgJHtSRUxPQ0FUSU5HKyooLmdudS5saW5rb25jZS50Kil9Ci0gICAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfVEVYVF9TRUNUSU9OU319Ci0gIH0gPSR7Tk9QLTB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotICAuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOiB7IEtFRVAgKCooLmZpbmkpKQkJfSA9JHtOT1AtMH0KLSAgJHtXUklUQUJMRV9ST0RBVEEtJHtST0RBVEF9fQotICAucm9kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRE9OTFlfU0VDVElPTlN9fQotCi0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArICguICYgKCR7TUFYUEFHRVNJWkV9IC0gMSkpfTt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9ICR7U0hMSUJfREFUQV9BRERSLUFMSUdOKCR7TUFYUEFHRVNJWkV9KSArICguICYgKCR7TUFYUEFHRVNJWkV9IC0gMSkpfTt9fQotCi0gIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysqKC5kYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuZCopfQotICAgICR7Q09OU1RSVUNUSU5HK1NPUlQoQ09OU1RSVUNUT1JTKX0KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAuZWhfZnJhbWUgOiB7ICooLmVoX2ZyYW1lKSB9Ci0gIC5nY2NfZXhjZXB0X3RhYmxlIDogeyAqKC5nY2NfZXhjZXB0X3RhYmxlKSB9Ci0gICR7V1JJVEFCTEVfUk9EQVRBKyR7Uk9EQVRBfX0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVBRFdSSVRFX1NFQ1RJT05TfX0KLSAgJHtSRUxPQ0FUSU5HKyR7Q1RPUn19Ci0gICR7UkVMT0NBVElORyske0RUT1J9fQotICAke0RBVEFfUExUKyR7UExUfX0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfR09UX1NZTUJPTFN9fQotICAuZ290ICAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nb3QucGx0KSAqKC5nb3QpIH0KLSAgJHtURVhUX0RZTkFNSUMtJHtEWU5BTUlDfX0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNkYXRhKSAqKC5zZGF0YS4qKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX0dPVF9TRUNUSU9OU319Ci0gICR7UkVMT0NBVElORytfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZWRhdGEgPSAuKTt9Ci0gICR7UkVMT0NBVElORytfX2Jzc19zdGFydCA9IC47fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319Ci0gIC5zYnNzICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2JzcykgKiguc2NvbW1vbikgfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAqKC5keW5ic3MpCi0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgIC8qIEFsaWduIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIC5ic3Mgc2VjdGlvbiBvY2N1cGllcyBzcGFjZSB1cCB0bwotICAgICAgX2VuZC4gIEFsaWduIGFmdGVyIC5ic3MgdG8gZW5zdXJlIGNvcnJlY3QgYWxpZ25tZW50IGV2ZW4gaWYgdGhlCi0gICAgICAuYnNzIHNlY3Rpb24gZGlzYXBwZWFycyBiZWNhdXNlIHRoZXJlIGFyZSBubyBpbnB1dCBzZWN0aW9ucy4gICovCi0gICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7QUxJR05NRU5UfSk7fQotICB9Ci0gICR7UkVMT0NBVElORysuID0gQUxJR04oJHtBTElHTk1FTlR9KTt9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfRU5EX1NZTUJPTFN9fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotCi0gIC8qIFN0YWJzIGRlYnVnZ2luZyBzZWN0aW9ucy4gICovCi0gIC5zdGFiIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIgMCA6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAgOiB7ICooLnN0YWIuZXhjbCkgfQotICAuc3RhYi5leGNsc3RyIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleCAwIDogeyAqKC5zdGFiLmluZGV4KSB9Ci0gIC5zdGFiLmluZGV4c3RyIDAgOiB7ICooLnN0YWIuaW5kZXhzdHIpIH0KLQotICAuY29tbWVudCAwIDogeyAqKC5jb21tZW50KSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfUkVMT0NBVElOR19TRUNUSU9OU319Ci0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KLSAgJHtPVEhFUl9TRUNUSU9OU30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYyBiL2xkL3NjcmlwdHRlbXBsL2VsZmQxMHYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMmVlZjQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZWxmZDEwdi5zYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAucm9kYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MubWlsbGkpCi0jCU9USEVSX1JFQURXUklURV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLmRhdGEgLmJzcyAuY3RvcnMgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKLSMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KLSMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCi0jCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLnRleHQgc2VjdGlvbi4KLSMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuZGF0YSBzZWN0aW9uLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCURBVEFfUExUIC0gLnBsdCBzaG91bGQgYmUgaW4gZGF0YSBzZWdtZW50LCBub3QgdGV4dCBzZWdtZW50LgotIwlFTUJFRERFRCAtIHdoZXRoZXIgdGhpcyBpcyBmb3IgYW4gZW1iZWRkZWQgc3lzdGVtLiAKLSMKLSMgV2hlbiBhZGRpbmcgc2VjdGlvbnMsIGRvIG5vdGUgdGhhdCB0aGUgbmFtZXMgb2Ygc29tZSBzZWN0aW9ucyBhcmUgdXNlZAotIyB3aGVuIHNwZWNpZnlpbmcgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQuCi0jCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotdGVzdCAteiAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iICYmIEJJR19PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgLXogIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IiAmJiBMSVRUTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1pZiBbIC16ICIkTUFDSElORSIgXTsgdGhlbiBPVVRQVVRfQVJDSD0ke0FSQ0h9OyBlbHNlIE9VVFBVVF9BUkNIPSR7QVJDSH06JHtNQUNISU5FfTsgZmkKLXRlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgotSU5URVJQPSIuaW50ZXJwICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5pbnRlcnApIAl9IgotUExUPSIucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucGx0KQl9IgotCi0KLUNUT1I9Ii5jdG9ycyAke0NPTlNUUlVDVElORy0wfSA6IAotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX1NUQVJUfX0KLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCi0gICAgICAgdGhlIGNvbnN0cnVjdG9ycywgc28gd2UgbWFrZSBzdXJlIGl0IGlzCi0gICAgICAgZmlyc3QuICBCZWNhdXNlIHRoaXMgaXMgYSB3aWxkY2FyZCwgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciBpZiB0aGUgdXNlciBkb2VzIG5vdAotICAgICAgIGFjdHVhbGx5IGxpbmsgYWdhaW5zdCBjcnRiZWdpbi5vOyB0aGUKLSAgICAgICBsaW5rZXIgd29uJ3QgbG9vayBmb3IgYSBmaWxlIHRvIG1hdGNoIGEKLSAgICAgICB3aWxkY2FyZC4gIFRoZSB3aWxkY2FyZCBhbHNvIG1lYW5zIHRoYXQgaXQKLSAgICAgICBkb2Vzbid0IG1hdHRlciB3aGljaCBkaXJlY3RvcnkgY3J0YmVnaW4ubwotICAgICAgIGlzIGluLiAgKi8KLQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5jdG9ycykpCi0KLSAgICAvKiBXZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIC5jdG9yIHNlY3Rpb24gZnJvbQotICAgICAgIGZyb20gdGhlIGNydGVuZC5vIGZpbGUgdW50aWwgYWZ0ZXIgdGhlIHNvcnRlZCBjdG9ycy4KLSAgICAgICBUaGUgLmN0b3Igc2VjdGlvbiBmcm9tIHRoZSBjcnRlbmQgZmlsZSBjb250YWlucyB0aGUKLSAgICAgICBlbmQgb2YgY3RvcnMgbWFya2VyIGFuZCBpdCBtdXN0IGJlIGxhc3QgKi8KLQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5jdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5jdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguY3RvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7Q1RPUl9FTkR9fQotICB9IgotCi1EVE9SPSIgLmR0b3JzICAgICAgICR7Q09OU1RSVUNUSU5HLTB9IDoKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9TVEFSVH19Ci0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmR0b3JzKSkKLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORyske0RUT1JfRU5EfX0KLSAgfSIKLQotCi0jIGlmIHRoaXMgaXMgZm9yIGFuIGVtYmVkZGVkIHN5c3RlbSwgZG9uJ3QgYWRkIFNJWkVPRl9IRUFERVJTLgotaWYgWyAteiAiJEVNQkVEREVEIiBdOyB0aGVuCi0gICB0ZXN0IC16ICIke1JFQURPTkxZX0JBU0VfQUREUkVTU30iICYmIFJFQURPTkxZX0JBU0VfQUREUkVTUz0iJHtSRUFET05MWV9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTIgotZWxzZQotICAgdGVzdCAteiAiJHtSRUFET05MWV9CQVNFX0FERFJFU1N9IiAmJiBSRUFET05MWV9CQVNFX0FERFJFU1M9IiR7UkVBRE9OTFlfU1RBUlRfQUREUn0iCi1maQotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke09VVFBVVF9BUkNIfSkKLUVOVFJZKCR7RU5UUll9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL30KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7UkVBRE9OTFlfQkFTRV9BRERSRVNTfTt9fQotICAke0NSRUFURV9TSExJQiske1JFTE9DQVRJTkcrLiA9IFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCLSR7SU5URVJQfX0KLSAgLmhhc2ggICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguaGFzaCkJCX0KLSAgLmR5bnN5bSAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpCQl9Ci0gIC5yZWwudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC50ZXh0KQkJfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnRleHQpIAl9Ci0gIC5yZWwuZGF0YSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5kYXRhKQkJfQotICAucmVsYS5kYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmRhdGEpIAl9Ci0gIC5yZWwucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5yb2RhdGEpIAl9Ci0gIC5yZWxhLnJvZGF0YSAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucm9kYXRhKSAJfQotICAucmVsLmdvdCAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZ290KQkJfQotICAucmVsYS5nb3QgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKQl9Ci0gIC5yZWxhLmN0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuY3RvcnMpCX0KLSAgLnJlbC5kdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbC5pbml0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmluaXQpCX0KLSAgLnJlbGEuaW5pdCAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5pbml0KQl9Ci0gIC5yZWwuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5maW5pKQl9Ci0gIC5yZWxhLmZpbmkgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZmluaSkJfQotICAucmVsLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCQl9Ci0gICR7REFUQV9QTFQtJHtQTFR9fQotICAucm9kYXRhICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YSkgKiguZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yb2RhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFET05MWV9TRUNUSU9OU319Ci0KLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgKi8KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi1BTElHTig0KTt9fQotCi0gIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5kYXRhKQotICAgICooLmRhdGEuKikKLSAgICAqKC5nbnUubGlua29uY2UuZCopCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0gICR7UkVMT0NBVElORyske0NUT1J9fQotICAke1JFTE9DQVRJTkcrJHtEVE9SfX0KLSAgLmdvdCAgICAgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gIC5keW5hbWljICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bmFtaWMpIH0KLSAgJHtEQVRBX1BMVCske1BMVH19Ci0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YSkgfQotICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVkYXRhID0gLik7fQotICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HKyR7T1RIRVJfQlNTX1NZTUJPTFN9fQotICAuc2JzcyAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNic3MpICooLnNjb21tb24pIH0KLSAgLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIDt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0KLSAgLyogU3RhYnMgZGVidWdnaW5nIHNlY3Rpb25zLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0gIC5zdGFiLmV4Y2wgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIgMCA6IHsgKiguc3RhYi5leGNsc3RyKSB9Ci0gIC5zdGFiLmluZGV4IDAgOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMCA6IHsgKiguc3RhYi5pbmRleHN0cikgfQotCi0gIC5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcgICAgICAgICAgMCA6IHsgKiguZGVidWcpIH0KLSAgLmxpbmUgICAgICAgICAgIDAgOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUxPQ0FUSU5HX1NFQ1RJT05TfX0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotCi0KLSAgLyogSG1tbSwgdGhlcmUncyBnb3QgdG8gYmUgYSBiZXR0ZXIgd2F5LiAgVGhpcyBzZXRzIHRoZSBzdGFjayB0byB0aGUKLSAgICAgdG9wIG9mIHRoZSBzaW11bGF0b3IgbWVtb3J5IChpLmUuIHRvcCBvZiA2NEsgZGF0YSBzcGFjZSkuICovCi0gIC5zdGFjayAweDAwMDA3RkZFIDogeyBfc3RhY2sgPSAuOyAqKC5zdGFjaykgfQotCi0gIC50ZXh0ICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDoKLSAgewotICAgICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfU1lNQk9MU319Ci0gICAgS0VFUCAoKiguaW5pdCkpCi0gICAgS0VFUCAoKiguZmluaSkpCi0gICAgKigudGV4dCkKLSAgICAqKC50ZXh0LiopCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgKiguZ251LmxpbmtvbmNlLnQqKQotICB9ID0ke05PUC0wfQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYyBiL2xkL3NjcmlwdHRlbXBsL2VsZmQzMHYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjkyODMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvZWxmZDMwdi5zYworKysgL2Rldi9udWxsCkBAIC0xLDIxOSArMCwwIEBACi0KLUNUT1I9Ii5jdG9ycyAke0NPTlNUUlVDVElORy0wfSA6IAotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuOyB9Ci0gICAgLyogZ2NjIHVzZXMgY3J0YmVnaW4ubyB0byBmaW5kIHRoZSBzdGFydCBvZgotICAgICAgIHRoZSBjb25zdHJ1Y3RvcnMsIHNvIHdlIG1ha2Ugc3VyZSBpdCBpcwotICAgICAgIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QKLSAgICAgICBhY3R1YWxseSBsaW5rIGFnYWluc3QgY3J0YmVnaW4ubzsgdGhlCi0gICAgICAgbGlua2VyIHdvbid0IGxvb2sgZm9yIGEgZmlsZSB0byBtYXRjaCBhCi0gICAgICAgd2lsZGNhcmQuICBUaGUgd2lsZGNhcmQgYWxzbyBtZWFucyB0aGF0IGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgd2hpY2ggZGlyZWN0b3J5IGNydGJlZ2luLm8KLSAgICAgICBpcyBpbi4gICovCi0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotCi0gICAgLyogV2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlIHRoZSAuY3RvciBzZWN0aW9uIGZyb20KLSAgICAgICBmcm9tIHRoZSBjcnRlbmQubyBmaWxlIHVudGlsIGFmdGVyIHRoZSBzb3J0ZWQgY3RvcnMuCi0gICAgICAgVGhlIC5jdG9yIHNlY3Rpb24gZnJvbSB0aGUgY3J0ZW5kIGZpbGUgY29udGFpbnMgdGhlCi0gICAgICAgZW5kIG9mIGN0b3JzIG1hcmtlciBhbmQgaXQgbXVzdCBiZSBsYXN0ICovCi0KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjsgfQotICB9ICR7UkVMT0NBVElORysgPiAke0RBVEFfTUVNT1JZfX0iCi0KLURUT1I9IiAgLmR0b3JzCSR7Q09OU1RSVUNUSU5HLTB9IDoKLSAgewotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjsgfQotICAgIEtFRVAgKCpjcnRiZWdpbi5vKC5kdG9ycykpCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqKC5kdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19IgotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotTUVNT1JZCi17Ci0gIHRleHQgJHtURVhUX0RFRl9TRUNUSU9OfSA6IE9SSUdJTiA9ICR7VEVYVF9TVEFSVF9BRERSfSwgTEVOR1RIID0gJHtURVhUX1NJWkV9Ci0gIGRhdGEgJHtEQVRBX0RFRl9TRUNUSU9OfSA6IE9SSUdJTiA9ICR7REFUQV9TVEFSVF9BRERSfSwgTEVOR1RIID0gJHtEQVRBX1NJWkV9Ci0gIGVtZW0gJHtFTUVNX0RFRl9TRUNUSU9OfSA6IE9SSUdJTiA9ICR7RU1FTV9TVEFSVF9BRERSfSwgTEVOR1RIID0gJHtFTUVNX1NJWkV9Ci0gIGVpdAkJCSAgIDogT1JJR0lOID0gJHtFSVRfU1RBUlRfQUREUn0sICBMRU5HVEggPSAke0VJVF9TSVpFfQotfQotCi1TRUNUSU9OUwotewotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgJHtURVhUX0RZTkFNSUMrJHtEWU5BTUlDfX0KLSAgLmhhc2gJCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmhhc2gpIH0KLSAgLmR5bnN5bQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pIH0KLSAgLmR5bnN0cgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zdHIpIH0KLSAgLmdudS52ZXJzaW9uCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uKSB9Ci0gIC5nbnUudmVyc2lvbl9kCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fZCkgfQotICAuZ251LnZlcnNpb25fcgkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KLQotICAucmVsYS50ZXh0CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEudGV4dCkgKigucmVsYS5nbnUubGlua29uY2UudCopIH0KLSAgLnJlbGEuZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmRhdGEpICooLnJlbGEuZ251LmxpbmtvbmNlLmQqKSB9Ci0gIC5yZWxhLnJvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnJvZGF0YSkgKigucmVsYS5nbnUubGlua29uY2UuciopIH0KLSAgLnJlbGEuc3RleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zdGVzdCkgfQotICAucmVsYS5ldGV4dAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmV0ZXN0KSB9Ci0gIC5yZWxhLnNkYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2RhdGEpIH0KLSAgLnJlbGEuZWRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5lZGF0YSkgfQotICAucmVsYS5laXRfdgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmVpdF92KSB9Ci0gIC5yZWxhLnNic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zYnNzKSB9Ci0gIC5yZWxhLmVic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5lYnNzKSB9Ci0gIC5yZWxhLnNyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zcm9kYXRhKSB9Ci0gIC5yZWxhLmVyb2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5lcm9kYXRhKSB9Ci0gIC5yZWxhLmdvdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmdvdCkgfQotICAucmVsYS5jdG9ycwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmN0b3JzKSB9Ci0gIC5yZWxhLmR0b3JzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpIH0KLSAgLnJlbGEuaW5pdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmluaXQpIH0KLSAgLnJlbGEuZmluaQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmZpbmkpIH0KLSAgLnJlbGEuYnNzCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKSB9Ci0gIC5yZWxhLnBsdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLnBsdCkgfQotCi0gIC5yZWwuZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZGF0YSkgKigucmVsLmdudS5saW5rb25jZS5kKikgfQotICAucmVsLnJvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucm9kYXRhKSAqKC5yZWwuZ251LmxpbmtvbmNlLnIqKSB9Ci0gIC5yZWwuc3RleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnN0ZXN0KSB9Ci0gIC5yZWwuZXRleHQJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmV0ZXN0KSB9Ci0gIC5yZWwuc2RhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnNkYXRhKSB9Ci0gIC5yZWwuZWRhdGEJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVkYXRhKSB9Ci0gIC5yZWwuc2JzcwkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuc2JzcykgfQotICAucmVsLmVic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmVic3MpIH0KLSAgLnJlbC5laXRfdgkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZWl0X3YpIH0KLSAgLnJlbC5zcm9kYXRhCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5zcm9kYXRhKSB9Ci0gIC5yZWwuZXJvZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZXJvZGF0YSkgfQotICAucmVsLmdvdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZ290KSB9Ci0gIC5yZWwuY3RvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmN0b3JzKSB9Ci0gIC5yZWwuZHRvcnMJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmR0b3JzKSB9Ci0gIC5yZWwuaW5pdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuaW5pdCkgfQotICAucmVsLmZpbmkJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmZpbmkpIH0KLSAgLnJlbC5ic3MJCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmJzcykgfQotICAucmVsLnBsdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwucGx0KSB9Ci0KLSAgLmluaXQJCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmluaXQpIH0gPSR7Tk9QLTB9Ci0gICR7REFUQV9QTFQtJHtQTFR9fQotCi0gIC8qIEludGVybmFsIHRleHQgc3BhY2UgKi8KLSAgLnN0ZXh0CSR7UkVMT0NBVElORy0wfSA6IHsgKiguc3RleHQpIH0JCSR7UkVMT0NBVElORysgPiB0ZXh0fQotCi0gIC8qIEludGVybmFsIHRleHQgc3BhY2Ugb3IgZXh0ZXJuYWwgbWVtb3J5ICovCi0gIC50ZXh0IDoKLSAgewotICAgICooLnRleHQpCi0gICAgKiguZ251LmxpbmtvbmNlLnQqKQotICAgICooLmluaXQpCi0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+ICR7VEVYVF9NRU1PUll9fQotCi0gIC8qIEludGVybmFsIGRhdGEgc3BhY2UgKi8KLSAgLnNyb2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zcm9kYXRhKSB9CSR7UkVMT0NBVElORysgPiBkYXRhfQotICAuc2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YSkgfQkJJHtSRUxPQ0FUSU5HKyA+IGRhdGF9Ci0KLSAgLyogSW50ZXJuYWwgZGF0YSBzcGFjZSBvciBleHRlcm5hbCBtZW1vcnkgKi8KLSAgLnJvZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YSkgfQkke1JFTE9DQVRJTkcrID4gJHtEQVRBX01FTU9SWX19Ci0KLSAgLyogQysrIGV4Y2VwdGlvbiBzdXBwb3J0LiAgKi8KLSAgLmVoX2ZyYW1lCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZWhfZnJhbWUpIH0JJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQotCi0gICR7UkVMT0NBVElORyske0NUT1J9fQotICAke1JFTE9DQVRJTkcrJHtEVE9SfX0KLQotICAuZGF0YQkJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICooLmRhdGEpCi0gICAgKiguZ251LmxpbmtvbmNlLmQqKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQotCi0gIC8qIEV4dGVybmFsIG1lbW9yeSAqLwotICAuZXRleHQJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ldGV4dF9zdGFydCA9IC4pIDsgfQotICAgICooLmV0ZXh0KQotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ldGV4dF9lbmQgPSAuKSA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gZW1lbX0KLQotICAuZXJvZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmVyb2RhdGEpIH0JJHtSRUxPQ0FUSU5HKyA+IGVtZW19Ci0gIC5lZGF0YQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmVkYXRhKSB9CQkke1JFTE9DQVRJTkcrID4gZW1lbX0KLQotICAuc2JzcwkJJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19zYnNzX3N0YXJ0ID0gLikgOyB9Ci0gICAgKiguc2JzcykKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fc2Jzc19lbmQgPSAuKSA7ICB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IGRhdGF9Ci0KLSAgLmVic3MJCSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fZWJzc19zdGFydCA9IC4pIDsgfQotICAgICooLmVic3MpCi0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2Vic3NfZW5kID0gLikgOyAgfQotICB9ICR7UkVMT0NBVElORysgPiBkYXRhfQotCi0gIC5ic3MJCSR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUgKF9fYnNzX3N0YXJ0ID0gLikgOyB9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19ic3NfZW5kID0gLikgOyB9Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+ICR7REFUQV9NRU1PUll9fQotCi0gIC5laXRfdgkke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFIChfX2VpdF9zdGFydCA9IC4pIDsgfQotICAgICooLmVpdF92KQotICAgICR7UkVMT0NBVElORysgUFJPVklERSAoX19laXRfZW5kID0gLikgOyB9Ci0gIH0gJHtSRUxPQ0FUSU5HKyA+IGVpdH0KLQotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYgkJIDAgOiB7ICooLnN0YWIpIH0KLSAgLnN0YWJzdHIJIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbAkgMCA6IHsgKiguc3RhYi5leGNsKSB9Ci0gIC5zdGFiLmV4Y2xzdHIJIDAgOiB7ICooLnN0YWIuZXhjbHN0cikgfQotICAuc3RhYi5pbmRleAkgMCA6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0KLSAgLmNvbW1lbnQJIDAgOiB7ICooLmNvbW1lbnQpIH0KLQotICAvKiBEV0FSRiBkZWJ1ZyBzZWN0aW9ucy4KLSAgICAgU3ltYm9scyBpbiB0aGUgRFdBUkYgZGVidWdnaW5nIHNlY3Rpb25zIGFyZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCi0gICAgIG9mIHRoZSBzZWN0aW9uIHNvIHdlIGJlZ2luIHRoZW0gYXQgMC4gICovCi0KLSAgLyogRFdBUkYgMSAqLwotICAuZGVidWcJIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lCQkgMCA6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMS4xIGFuZCBEV0FSRiAyICovCi0gIC5kZWJ1Z19hcmFuZ2VzICAwIDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwIDogeyAqKC5kZWJ1Z19wdWJuYW1lcykgfQotCi0gIC8qIERXQVJGIDIgKi8KLSAgLmRlYnVnX2luZm8gICAgIDAgOiB7ICooLmRlYnVnX2luZm8pIH0KLSAgLmRlYnVnX2FiYnJldiAgIDAgOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCA6IHsgKiguZGVidWdfbGluZSkgfQotICAuZGVidWdfZnJhbWUgICAgMCA6IHsgKiguZGVidWdfZnJhbWUpIH0KLSAgLmRlYnVnX3N0ciAgICAgIDAgOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCA6IHsgKiguZGVidWdfbG9jKSB9Ci0gIC5kZWJ1Z19tYWNpbmZvICAwIDogeyAqKC5kZWJ1Z19tYWNpbmZvKSB9Ci0KLSAgUFJPVklERSAoX19zdGFjayA9ICR7U1RBQ0tfU1RBUlRfQUREUn0pOwotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2VsZnBwYy5zYyBiL2xkL3NjcmlwdHRlbXBsL2VsZnBwYy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhYjhmOC4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9lbGZwcGMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotIwotIyBVbnVzdWFsIHZhcmlhYmxlcyBjaGVja2VkIGJ5IHRoaXMgY29kZToKLSMJTk9QIC0gdHdvIGJ5dGUgb3Bjb2RlIGZvciBuby1vcCAoZGVmYXVsdHMgdG8gMCkKLSMJREFUQV9BRERSIC0gaWYgZW5kLW9mLXRleHQtcGx1cy1vbmUtcGFnZSBpc24ndCByaWdodCBmb3IgZGF0YSBzdGFydAotIwlPVEhFUl9SRUFET05MWV9TRUNUSU9OUyAtIG90aGVyIHRoYW4gLnRleHQgLmluaXQgLnJvZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLm1pbGxpKQotIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLmN0b3JzIC5zZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLmdsb2JhbCkKLSMJT1RIRVJfU0VDVElPTlMgLSBhdCB0aGUgZW5kCi0jCUVYRUNVVEFCTEVfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBtdXN0IGJlIGRlZmluZWQgZm9yIGFuCi0jCQlleGVjdXRhYmxlIChlLmcuLCBfRFlOQU1JQ19MSU5LKQotIwlURVhUX1NUQVJUX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS50ZXh0IHNlY3Rpb24uCi0jCURBVEFfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmRhdGEgc2VjdGlvbi4KLSMJT1RIRVJfQlNTX1NZTUJPTFMgLSBzeW1ib2xzIHRoYXQgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKLSMJCS5ic3Mgc2VjdGlvbiBiZXNpZGVzIF9fYnNzX3N0YXJ0LgotIwotIyBXaGVuIGFkZGluZyBzZWN0aW9ucywgZG8gbm90ZSB0aGF0IHRoZSBuYW1lcyBvZiBzb21lIHNlY3Rpb25zIGFyZSB1c2VkCi0jIHdoZW4gc3BlY2lmeWluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dC4KLSMKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci10ZXN0IC16ICIke0JJR19PVVRQVVRfRk9STUFUfSIgJiYgQklHX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAteiAiJHtMSVRUTEVfT1VUUFVUX0ZPUk1BVH0iICYmIExJVFRMRV9PVVRQVVRfRk9STUFUPSR7T1VUUFVUX0ZPUk1BVH0KLXRlc3QgIiRMRF9GTEFHIiA9ICJOIiAmJiBEQVRBX0FERFI9LgotU0JTUzI9Ii5zYnNzMiAke1JFTE9DQVRJTkctMH0gOiB7ICooLnNic3MyKSB9IgotU0RBVEEyPSIuc2RhdGEyICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEyKSB9IgotSU5URVJQPSIuaW50ZXJwICR7UkVMT0NBVElORy0wfSA6IHsgKiguaW50ZXJwKSB9IgotUExUPSIucGx0ICR7UkVMT0NBVElORy0wfSA6IHsgKigucGx0KSB9IgotQ1RPUj0iLmN0b3JzICR7Q09OU1RSVUNUSU5HLTB9IDogCi0gIHsKLSAgICAke0NPTlNUUlVDVElORyske0NUT1JfU1RBUlR9fQotICAgIC8qIGdjYyB1c2VzIGNydGJlZ2luLm8gdG8gZmluZCB0aGUgc3RhcnQgb2YKLSAgICAgICB0aGUgY29uc3RydWN0b3JzLCBzbyB3ZSBtYWtlIHN1cmUgaXQgaXMKLSAgICAgICBmaXJzdC4gIEJlY2F1c2UgdGhpcyBpcyBhIHdpbGRjYXJkLCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIGlmIHRoZSB1c2VyIGRvZXMgbm90Ci0gICAgICAgYWN0dWFsbHkgbGluayBhZ2FpbnN0IGNydGJlZ2luLm87IHRoZQotICAgICAgIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdAotICAgICAgIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIGRpcmVjdG9yeSBjcnRiZWdpbi5vCi0gICAgICAgaXMgaW4uICAqLwotCi0gICAgS0VFUCAoKmNydGJlZ2luLm8oLmN0b3JzKSkKLQotICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaW5jbHVkZSB0aGUgLmN0b3Igc2VjdGlvbiBmcm9tCi0gICAgICAgZnJvbSB0aGUgY3J0ZW5kLm8gZmlsZSB1bnRpbCBhZnRlciB0aGUgc29ydGVkIGN0b3JzLgotICAgICAgIFRoZSAuY3RvciBzZWN0aW9uIGZyb20gdGhlIGNydGVuZCBmaWxlIGNvbnRhaW5zIHRoZQotICAgICAgIGVuZCBvZiBjdG9ycyBtYXJrZXIgYW5kIGl0IG11c3QgYmUgbGFzdCAqLwotCi0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmN0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmN0b3JzLiopKSkKLSAgICBLRUVQICgqKC5jdG9ycykpCi0gICAgJHtDT05TVFJVQ1RJTkcrJHtDVE9SX0VORH19Ci0gIH0iCi0KLURUT1I9IiAuZHRvcnMgICAgICAgJHtDT05TVFJVQ1RJTkctMH0gOgotICB7Ci0gICAgJHtDT05TVFJVQ1RJTkcrJHtEVE9SX1NUQVJUfX0KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooRVhDTFVERV9GSUxFICgqY3J0ZW5kLm8pIC5kdG9ycykpCi0gICAgS0VFUCAoKihTT1JUKC5kdG9ycy4qKSkpCi0gICAgS0VFUCAoKiguZHRvcnMpKQotICAgICR7Q09OU1RSVUNUSU5HKyR7RFRPUl9FTkR9fQotICB9IgotCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoJHtFTlRSWX0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1JFTE9DQVRJTkcrLyogRG8gd2UgbmVlZCBhbnkgb2YgdGhlc2UgZm9yIGVsZj8KLSAgIF9fRFlOQU1JQyA9IDA7ICR7U1RBQ0taRVJPKyR7U1RBQ0taRVJPfX0gJHtTSExJQl9QQVRIKyR7U0hMSUJfUEFUSH19ICAqL30KLSR7UkVMT0NBVElORyske0VYRUNVVEFCTEVfU1lNQk9MU319Ci0ke1JFTE9DQVRJTkctIC8qIEZvciBzb21lIHJlYXNvbiwgdGhlIFNvbGFyaXMgbGlua2VyIG1ha2VzIGJhZCBleGVjdXRhYmxlcwotICBpZiBnbGQgLXIgaXMgdXNlZCBhbmQgdGhlIGludGVybWVkaWF0ZSBmaWxlIGhhcyBzZWN0aW9ucyBzdGFydGluZwotICBhdCBub24temVybyBhZGRyZXNzZXMuICBDb3VsZCBiZSBhIFNvbGFyaXMgbGQgYnVnLCBjb3VsZCBiZSBhIEdOVSBsZAotICBidWcuICBCdXQgZm9yIG5vdyBhc3NpZ25pbmcgdGhlIHplcm8gdm1hcyB3b3Jrcy4gICovfQotCi0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19zdGFjayA9IDApO30KLSR7UkVMT0NBVElORytQUk9WSURFIChfX19zdGFjayA9IDApO30KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQotICAuaGFzaAkJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyCSR7UkVMT0NBVElORy0wfSA6IHsgKiguZHluc3RyKQkJfQotICAuZ251LnZlcnNpb24gJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbikgICAgICB9Ci0gIC5nbnUudmVyc2lvbl9kICR7UkVMT0NBVElORy0wfSA6IHsgKiguZ251LnZlcnNpb25fZCkgIH0KLSAgLmdudS52ZXJzaW9uX3IgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5nbnUudmVyc2lvbl9yKSAgfQotICAucmVsYS50ZXh0ICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLnRleHQpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS50ZXh0LiopfQotICAgICAgJHtSRUxPQ0FUSU5HKyooLnJlbGEuZ251LmxpbmtvbmNlLnQqKX0KLSAgICB9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOgotICAgIHsKLSAgICAgICooLnJlbGEuZGF0YSkKLSAgICAgICR7UkVMT0NBVElORysqKC5yZWxhLmRhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuZCopfQotICAgIH0KLSAgLnJlbGEucm9kYXRhICR7UkVMT0NBVElORy0wfSA6Ci0gICAgewotICAgICAgKigucmVsYS5yb2RhdGEpCi0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5yb2RhdGEuKil9Ci0gICAgICAke1JFTE9DQVRJTkcrKigucmVsYS5nbnUubGlua29uY2UuciopfQotICAgIH0KLSAgLnJlbGEuZ290CSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QpCX0KLSAgLnJlbGEuZ290MQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290MSkJfQotICAucmVsYS5nb3QyCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5nb3QyKQl9Ci0gIC5yZWxhLmN0b3JzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsYS5kdG9ycwkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZHRvcnMpCX0KLSAgLnJlbGEuaW5pdAkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuaW5pdCkJfQotICAucmVsYS5maW5pCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5maW5pKQl9Ci0gIC5yZWxhLmJzcwkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuYnNzKQl9Ci0gIC5yZWxhLnBsdAkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEucGx0KQl9Ci0gIC5yZWxhLnNkYXRhCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zZGF0YSkJfQotICAucmVsYS5zYnNzCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zYnNzKQl9Ci0gIC5yZWxhLnNkYXRhMgkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuc2RhdGEyKQl9Ci0gIC5yZWxhLnNic3MyCSR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5zYnNzMikJfQotICAudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysqKC50ZXh0LiopfQotICAgIC8qIC5nbnUud2FybmluZyBzZWN0aW9ucyBhcmUgaGFuZGxlZCBzcGVjaWFsbHkgYnkgZWxmMzIuZW0uICAqLwotICAgICooLmdudS53YXJuaW5nKQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UudCopfQotICB9ID0ke05PUC0wfQotICAuaW5pdAkJJHtSRUxPQ0FUSU5HLTB9IDogeyBLRUVQICgqKC5pbml0KSkJfSA9JHtOT1AtMH0KLSAgLmZpbmkJCSR7UkVMT0NBVElORy0wfSA6IHsgS0VFUCAoKiguZmluaSkpCX0gPSR7Tk9QLTB9Ci0gIC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyooLnJvZGF0YS4qKX0KLSAgICAke1JFTE9DQVRJTkcrKiguZ251LmxpbmtvbmNlLnIqKX0KLSAgfQotICAucm9kYXRhMQkke1JFTE9DQVRJTkctMH0gOiB7ICooLnJvZGF0YTEpIH0KLSAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9IC47fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZXRleHQgPSAuKTt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChfX2V0ZXh0ID0gLik7fQotICAke0NSRUFURV9TSExJQi0ke1NEQVRBMn19Ci0gICR7Q1JFQVRFX1NITElCLSR7U0JTUzJ9fQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFET05MWV9TRUNUSU9OU319Ci0KLSAgLyogQWRqdXN0IHRoZSBhZGRyZXNzIGZvciB0aGUgZGF0YSBzZWdtZW50LiAgV2Ugd2FudCB0byBhZGp1c3QgdXAgdG8KLSAgICAgdGhlIHNhbWUgYWRkcmVzcyB3aXRoaW4gdGhlIHBhZ2Ugb24gdGhlIG5leHQgcGFnZSB1cC4gIEl0IHdvdWxkCi0gICAgIGJlIG1vcmUgY29ycmVjdCB0byBkbyB0aGlzOgotICAgICAgICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItQUxJR04oJHtNQVhQQUdFU0laRX0pICsgKEFMSUdOKDgpICYgKCR7TUFYUEFHRVNJWkV9IC0gMSkpfTt9Ci0gICAgIFRoZSBjdXJyZW50IGV4cHJlc3Npb24gZG9lcyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSBvZiBhCi0gICAgIHRleHQgc2VnbWVudCBlbmRpbmcgcHJlY2lzZWx5IGF0IHRoZSBlbmQgb2YgYSBwYWdlOyBpdCBjYXVzZXMgdGhlCi0gICAgIGRhdGEgc2VnbWVudCB0byBza2lwIGEgcGFnZS4gIFRoZSBhYm92ZSBleHByZXNzaW9uIGRvZXMgbm90IGhhdmUKLSAgICAgdGhpcyBwcm9ibGVtLCBidXQgaXQgd2lsbCBjdXJyZW50bHkgKDIvOTUpIGNhdXNlIEJGRCB0byBhbGxvY2F0ZQotICAgICBhIHNpbmdsZSBzZWdtZW50LCBjb21iaW5pbmcgYm90aCB0ZXh0IGFuZCBkYXRhLCBmb3IgdGhpcyBjYXNlLgotICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgdGV4dCBzZWdtZW50IGZyb20gYmVpbmcgc2hhcmVkIGFtb25nCi0gICAgIG11bHRpcGxlIGV4ZWN1dGlvbnMgb2YgdGhlIHByb2dyYW07IEkgdGhpbmsgdGhhdCBpcyBtb3JlCi0gICAgIGltcG9ydGFudCB0aGFuIGxvc2luZyBhIHBhZ2Ugb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAobm90ZQotICAgICB0aGF0IG5vIGFjdHVhbCBtZW1vcnkgaXMgbG9zdDsgdGhlIHBhZ2Ugd2hpY2ggaXMgc2tpcHBlZCBjYW4gbm90Ci0gICAgIGJlIHJlZmVyZW5jZWQpLiAgKi8KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUi0gQUxJR04oOCkgKyAke01BWFBBR0VTSVpFfX07fQotCi0gIC5kYXRhICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7REFUQV9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysqKC5kYXRhLiopfQotICAgICR7UkVMT0NBVElORysqKC5nbnUubGlua29uY2UuZCopfQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgfQotICAuZGF0YTEgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlN9fQotCi0gIC5nb3QxCQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdDEpIH0KLSAgLmR5bmFtaWMJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5hbWljKSB9Ci0KLSAgLyogUHV0IC5jdG9ycyBhbmQgLmR0b3JzIG5leHQgdG8gdGhlIC5nb3QyIHNlY3Rpb24sIHNvIHRoYXQgdGhlIHBvaW50ZXJzCi0gICAgIGdldCByZWxvY2F0ZWQgd2l0aCAtbXJlbG9jYXRhYmxlLiBBbHNvIHB1dCBpbiB0aGUgLmZpeHVwIHBvaW50ZXJzLgotICAgICBUaGUgY3VycmVudCBjb21waWxlciBubyBsb25nZXIgbmVlZHMgdGhpcywgYnV0IGtlZXAgaXQgYXJvdW5kIGZvciAyLjcuMiAgKi8KLQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0dPVDJfU1RBUlRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19HT1QyX1NUQVJUXyA9IC4pO30KLSAgLmdvdDIJCSR7UkVMT0NBVElORy0wfSA6ICB7ICooLmdvdDIpIH0KLQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19DVE9SX0xJU1RfXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX0NUT1JfTElTVF9fID0gLik7fQotICAgICAgICAgICAgICAgICR7UkVMT0NBVElORyske0NUT1J9fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19DVE9SX0VORF9fID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fQ1RPUl9FTkRfXyA9IC4pO30KLQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19EVE9SX0xJU1RfXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX0RUT1JfTElTVF9fID0gLik7fQotICAgICAgICAgICAgICAgICR7UkVMT0NBVElORyske0RUT1J9fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19EVE9SX0VORF9fID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19fRFRPUl9FTkRfXyA9IC4pO30KLQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0ZJWFVQX1NUQVJUXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fRklYVVBfU1RBUlRfID0gLik7fQotICAuZml4dXAJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5maXh1cCkgfQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX0ZJWFVQX0VORF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfX0ZJWFVQX0VORF8gPSAuKTt9Ci0JCSR7UkVMT0NBVElORytQUk9WSURFIChfR09UMl9FTkRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19HT1QyX0VORF8gPSAuKTt9Ci0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1RfU1RBUlRfID0gLik7fQotCQkke1JFTE9DQVRJTkcrUFJPVklERSAoX19HT1RfU1RBUlRfID0gLik7fQotICAuZ290CQkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdCkgfQotICAuZ290LnBsdAkke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpIH0KLSAgJHtDUkVBVEVfU0hMSUIrJHtTREFUQTJ9fQotICAke0NSRUFURV9TSExJQiske1NCU1MyfX0KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9HT1RfRU5EXyA9IC4pO30KLQkJJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fR09UX0VORF8gPSAuKTt9Ci0KLSAgLyogV2Ugd2FudCB0aGUgc21hbGwgZGF0YSBzZWN0aW9ucyB0b2dldGhlciwgc28gc2luZ2xlLWluc3RydWN0aW9uIG9mZnNldHMKLSAgICAgY2FuIGFjY2VzcyB0aGVtIGFsbCwgYW5kIGluaXRpYWxpemVkIGRhdGEgYWxsIGJlZm9yZSB1bmluaXRpYWxpemVkLCBzbwotICAgICB3ZSBjYW4gc2hvcnRlbiB0aGUgb24tZGlzayBzZWdtZW50IHNpemUuICAqLwotICAuc2RhdGEJJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zZGF0YSkgfQotICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVkYXRhID0gLik7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19lZGF0YSA9IC4pO30KLSAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDoKLSAgewotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3Nic3Nfc3RhcnQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX3Nic3Nfc3RhcnQgPSAuKTt9Ci0gICAgKiguc2JzcykKLSAgICAqKC5zY29tbW9uKQotICAgICooLmR5bnNic3MpCi0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fc2Jzc19lbmQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fX3Nic3NfZW5kID0gLik7fQotICB9Ci0gICR7UExUfQotICAuYnNzICAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAke1JFTE9DQVRJTkcrJHtPVEhFUl9CU1NfU1lNQk9MU319Ci0gICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19ic3Nfc3RhcnQgPSAuKTt9Ci0gICAke1JFTE9DQVRJTkcrUFJPVklERSAoX19fYnNzX3N0YXJ0ID0gLik7fQotICAgKiguZHluYnNzKQotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gIH0KLSAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIDt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlbmQgPSAuKTt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChfX2VuZCA9IC4pO30KLQotICAvKiBUaGVzZSBhcmUgbmVlZGVkIGZvciBFTEYgYmFja2VuZHMgd2hpY2ggaGF2ZSBub3QgeWV0IGJlZW4KLSAgICAgY29udmVydGVkIHRvIHRoZSBuZXcgc3R5bGUgbGlua2VyLiAgKi8KLSAgLnN0YWIgMCA6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwIDogeyAqKC5zdGFic3RyKSB9Ci0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotCi0gIC8qIERXQVJGIDEgKi8KLSAgLmRlYnVnICAgICAgICAgIDAgOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwIDogeyAqKC5saW5lKSB9Ci0KLSAgLyogR05VIERXQVJGIDEgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfc3JjaW5mbyAgMCA6IHsgKiguZGVidWdfc3JjaW5mbykgfQotICAuZGVidWdfc2ZuYW1lcyAgMCA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLQotICAvKiBEV0FSRiAyICovCi0gIC5kZWJ1Z19pbmZvICAgICAwIDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwIDogeyAqKC5kZWJ1Z19hYmJyZXYpIH0KLSAgLmRlYnVnX2xpbmUgICAgIDAgOiB7ICooLmRlYnVnX2xpbmUpIH0KLSAgLmRlYnVnX2ZyYW1lICAgIDAgOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwIDogeyAqKC5kZWJ1Z19zdHIpIH0KLSAgLmRlYnVnX2xvYyAgICAgIDAgOiB7ICooLmRlYnVnX2xvYykgfQotICAuZGVidWdfbWFjaW5mbyAgMCA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgOiB7ICooLmRlYnVnX3dlYWtuYW1lcykgfQotICAuZGVidWdfZnVuY25hbWVzIDAgOiB7ICooLmRlYnVnX2Z1bmNuYW1lcykgfQotICAuZGVidWdfdHlwZW5hbWVzIDAgOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgOiB7ICooLmRlYnVnX3Zhcm5hbWVzKSB9Ci0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAke1JFTE9DQVRJTkd9LiAgKi8KLSAgJHtPVEhFUl9TRUNUSU9OU30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvZ28zMmNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9nbzMyY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmNjA3Ni4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9nbzMyY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgMzg2IGdvMzIKLSMgREogRGVsb3JpZSAoZGpAY3Ryb24uY29tKQotCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPXN0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMCtTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuIDsgX2V0ZXh0ID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gQUxJR04oMHgyMDApO30KLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrICR7REFUQV9BTElHTk1FTlR9fSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICooLmN0b3IpfQotICAgICR7UkVMT0NBVElORysgKiguZHRvcil9Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAuIDsgX2VkYXRhID0gLn07Ci0gICAgJHtSRUxPQ0FUSU5HKyAuID0gQUxJR04oMHgyMDApO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuIDsgX2VuZCA9IC59OwotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKDB4MjAwKTt9Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDgzMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODMwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmODc2ZS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODMwMC5zYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoIl9zdGFydCIpCi0KLU1FTU9SWQotewotCS8qIDB4YzQgaXMgYSBtYWdpYyBlbnRyeS4gIFdlIHNob3VsZCBoYXZlIHRoZSBsaW5rZXIganVzdAotCSAgIHNraXAgb3ZlciBpdCBvbmUgZGF5Li4uICovCi0JdmVjdG9ycyA6IG8gPSAweDAwMDAsIGwgPSAweGM0Ci0JbWFnaWN2ZWN0b3JzIDogbyA9IDB4YzQsIGwgPSAweDNjCi0JcmFtICAgIDogbyA9IDB4MDEwMCwgbCA9IDB4ZmRmYwotCS8qIFRoZSBzdGFjayBzdGFydHMgYXQgdGhlIHRvcCBvZiBtYWluIHJhbS4gICovCi0JdG9wcmFtIDogbyA9IDB4ZmVmYywgbCA9IDB4NAotCS8qIEF0IHRoZSB2ZXJ5IHRvIG9mIHRoZSBhZGRyZXNzIHNwYWNlIGlzIHRoZSA4LWJpdCBhcmVhLiAgKi8KLQllaWdodCA6IG8gPSAweGZmMDAsIGwgPSAweDEwMAotfQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udmVjdG9ycyA6IHsKLQkvKiBVc2Ugc29tZXRoaW5nIGxpa2UgdGhpcyB0byBwbGFjZSBhIHNwZWNpZmljIGZ1bmN0aW9uJ3MgYWRkcmVzcwotCSAgIGludG8gdGhlIHZlY3RvciB0YWJsZS4gCi0KLQlTSE9SVChBQlNPTFVURShfZm9vYmFyKSkgKi8KLQotCSooLnZlY3RvcnMpCi0gICAgICAgIH0gJHtSRUxPQ0FUSU5HKyA+IHZlY3RvcnN9Ci0KLS50ZXh0IDoJeyAJCQkJCQotCSooLnJvZGF0YSkgCQkJCQotCSooLnRleHQpIAkJCQkKLQkqKC5zdHJpbmdzKQotICAgCSR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0udG9ycyA6IHsKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotLmRhdGEgOiB7Ci0JKiguZGF0YSkKLQkqKC50aW55KQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uYnNzIDogewotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gO30KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLS5laWdodCA6IHsKLQkqKC5laWdodCkKLQl9ICR7UkVMT0NBVElORysgPiBlaWdodH0KLS5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFiIF0KLQl9Ci0uc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYnN0ciBdCi0JfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODMwMGguc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODMwMGguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2ZkODYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBoLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKGg4MzAwaCkKLUVOVFJZKCJfc3RhcnQiKQotCi0vKiBUaGUgbWVtb3J5IHNpemUgaXMgMjU2S0IgdG8gY29pbmNpZGUgd2l0aCB0aGUgc2ltdWxhdG9yLgotICAgRG9uJ3QgY2hhbmdlIGVpdGhlciB3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBvdGhlci4gICovCi0KLU1FTU9SWQotewotICAgICAgICAvKiAweGM0IGlzIGEgbWFnaWMgZW50cnkuICBXZSBzaG91bGQgaGF2ZSB0aGUgbGlua2VyIGp1c3QKLSAgICAgICAgICAgc2tpcCBvdmVyIGl0IG9uZSBkYXkuLi4gKi8KLSAgICAgICAgdmVjdG9ycyA6IG8gPSAweDAwMDAsIGwgPSAweGM0Ci0gICAgICAgIG1hZ2ljdmVjdG9ycyA6IG8gPSAweGM0LCBsID0gMHgzYwotCS8qIFdlIHN0aWxsIG9ubHkgdXNlIDI1NmsgYXMgdGhlIG1haW4gcmFtIHNpemUuICAqLwotCXJhbSAgICA6IG8gPSAweDAxMDAsIGwgPSAweDNmZWZjCi0JLyogVGhlIHN0YWNrIHN0YXJ0cyBhdCB0aGUgdG9wIG9mIG1haW4gcmFtLiAgKi8KLQl0b3ByYW0gOiBvID0gMHgzZmZmYywgbCA9IDB4NAotCS8qIFRoaXMgaG9sZHMgdmFyaWFibGVzIGluIHRoZSAidGlueSIgc2VjdGlvbnMuICAqLwotCXRpbnkgICA6IG8gPSAweGZmODAwMCwgbCA9IDB4N2YwMAotCS8qIEF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgYWRkcmVzcyBzcGFjZSBpcyB0aGUgOC1iaXQgYXJlYS4gICovCi0JZWlnaHQgIDogbyA9IDB4ZmZmZjAwLCBsID0gMHgxMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgOiB7Ci0JLyogVXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gcGxhY2UgYSBzcGVjaWZpYyBmdW5jdGlvbidzIGFkZHJlc3MKLQkgICBpbnRvIHRoZSB2ZWN0b3IgdGFibGUuCi0KLQlMT05HKEFCU09MVVRFKF9mb29iYXIpKSAqLwotCi0JKigudmVjdG9ycykKLQl9ICR7UkVMT0NBVElORysgPiB2ZWN0b3JzfQotLnRleHQgOgl7IAkJCQkJCi0JKigucm9kYXRhKSAJCQkJCi0JKigudGV4dCkgCQkJCQotCSooLnN0cmluZ3MpCi0gICAJJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS50b3JzIDogewotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uZGF0YSA6IHsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uYnNzIDogewotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gO30KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLS50aW55IDogewotCSooLnRpbnkpCi0JfSAke1JFTE9DQVRJTkcrID4gdGlueX0KLS5laWdodCA6IHsKLQkqKC5laWdodCkKLQl9ICR7UkVMT0NBVElORysgPiBlaWdodH0KLS5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFiIF0KLQl9Ci0uc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYnN0ciBdCi0JfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODMwMHMuc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODMwMHMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDc0ZmMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDgzMDBzLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKGg4MzAwcykKLUVOVFJZKCJfc3RhcnQiKQotCi0vKiBUaGUgbWVtb3J5IHNpemUgaXMgMjU2S0IgdG8gY29pbmNpZGUgd2l0aCB0aGUgc2ltdWxhdG9yLgotICAgRG9uJ3QgY2hhbmdlIGVpdGhlciB3aXRob3V0IGNvbnNpZGVyaW5nIHRoZSBvdGhlci4gICovCi0KLU1FTU9SWQotewotICAgICAgICAvKiAweGM0IGlzIGEgbWFnaWMgZW50cnkuICBXZSBzaG91bGQgaGF2ZSB0aGUgbGlua2VyIGp1c3QKLSAgICAgICAgICAgc2tpcCBvdmVyIGl0IG9uZSBkYXkuLi4gKi8KLSAgICAgICAgdmVjdG9ycyA6IG8gPSAweDAwMDAsIGwgPSAweGM0Ci0gICAgICAgIG1hZ2ljdmVjdG9ycyA6IG8gPSAweGM0LCBsID0gMHgzYwotCS8qIFdlIHN0aWxsIG9ubHkgdXNlIDI1NmsgYXMgdGhlIG1haW4gcmFtIHNpemUuICAqLwotCXJhbSAgICA6IG8gPSAweDAxMDAsIGwgPSAweDNmZWZjCi0JLyogVGhlIHN0YWNrIHN0YXJ0cyBhdCB0aGUgdG9wIG9mIG1haW4gcmFtLiAgKi8KLQl0b3ByYW0gOiBvID0gMHgzZmZmYywgbCA9IDB4NAotCS8qIFRoaXMgaG9sZHMgdmFyaWFibGVzIGluIHRoZSAidGlueSIgc2VjdGlvbnMuICAqLwotCXRpbnkgICA6IG8gPSAweGZmODAwMCwgbCA9IDB4N2YwMAotCS8qIEF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgYWRkcmVzcyBzcGFjZSBpcyB0aGUgOC1iaXQgYXJlYS4gICovCi0JZWlnaHQgIDogbyA9IDB4ZmZmZjAwLCBsID0gMHgxMDAKLX0KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnZlY3RvcnMgOiB7Ci0JLyogVXNlIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gcGxhY2UgYSBzcGVjaWZpYyBmdW5jdGlvbidzIGFkZHJlc3MKLQkgICBpbnRvIHRoZSB2ZWN0b3IgdGFibGUuCi0KLQlMT05HKEFCU09MVVRFKF9mb29iYXIpKSAqLwotCi0JKigudmVjdG9ycykKLQl9ICR7UkVMT0NBVElORysgPiB2ZWN0b3JzfQotLnRleHQgOgl7IAkJCQkJCi0JKigucm9kYXRhKSAJCQkJCi0JKigudGV4dCkgCQkJCQotCSooLnN0cmluZ3MpCi0gICAJJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS50b3JzIDogewotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uZGF0YSA6IHsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0uYnNzIDogewotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gO30KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgOiB7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gJHtSRUxPQ0FUSU5HKyA+IHRvcHJhbX0KLS50aW55IDogewotCSooLnRpbnkpCi0JfSAke1JFTE9DQVRJTkcrID4gdGlueX0KLS5laWdodCA6IHsKLQkqKC5laWdodCkKLQl9ICR7UkVMT0NBVElORysgPiBlaWdodH0KLS5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsKLQlbIC5zdGFiIF0KLQl9Ci0uc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7Ci0JWyAuc3RhYnN0ciBdCi0JfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmEzOWVlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvZGUgYW5kIGRhdGEgNjRrIHRvdGFsICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7UkVMT0NBVElORysgMHgwMDAwIH0gOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLQotICAgCSAke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfQotCi0KLS5kYXRhICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gCi0KLS5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5yZGF0YSk7IAotCSAgKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci19IAotCi0uYnNzICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSR7UkVMT0NBVElORysgX19zdGFydF9ic3MgPSAuIDsgfQotCSooLmJzcykKLQkqKENPTU1PTikKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAuIDsgIH0KLQl9Ci0KLS5zdGFjayAgJHtSRUxPQ0FUSU5HKyAweGZmZjB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwYi5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwYi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1ZmEyYy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGIuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29kZSBhbmQgZGF0YSwgYm90aCBsYXJnZXIgdGhhbiA2NGsgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwfSA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCi0gICAJICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLQl9Ci0KLQotLmRhdGEgICR7UkVMT0NBVElORysgMHgyMDAwMH0gOgotCXsKLQkqKC5kYXRhKQotCSR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLQl9IAotCi0ucmRhdGEgICR7UkVMT0NBVElORysgMHgzMDAwMH0gOgotCXsKLQkqKC5yZGF0YSk7IAotCSAgKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci19IAotCi0uYnNzICAke1JFTE9DQVRJTkcrIDB4NDAwMDB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0KLQotLnN0YWNrICAke1JFTE9DQVRJTkcrIDB4NTAwMDB9IDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotCSooLnN0YWNrKQotCX0gCi0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwYy5zYyBiL2xkL3NjcmlwdHRlbXBsL2g4NTAwYy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4ODBlMy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9oODUwMGMuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotLyogQ29tcGFjdCBtb2RlbCAtIGNvZGUgPCA2NGssIGRhdGEgPiA2NGsgKi8KLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgMHgxMDAwMCA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCSAgKiguc3RyaW5ncykKLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotCi0uZGF0YSAweDIwMDAwIDoKLQl7Ci0JKiguZGF0YSkKLQkke1JFTE9DQVRJTkcrIF9lZGF0YSA9IC4gOyB9Ci0JfSAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0ucmRhdGEgMHgzMDAwMCAgOiB7Ci0JKigucmRhdGEpOyAKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci19ICAke1JFTE9DQVRJTkcrID4gcmFtfQotCi0uYnNzICAweDQwMDAwIDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0JKiguYnNzKQotCSooQ09NTU9OKQotCSR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotCX0gJHtSRUxPQ0FUSU5HKyA+cmFtfQotLnN0YWNrIDB4NWZmZjAgOgotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAke1JFTE9DQVRJTkcrID4gdG9wcmFtfQotCi0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgotCi0KLQotCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9oODUwMG0uc2MgYi9sZC9zY3JpcHR0ZW1wbC9oODUwMG0uc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MGE0YTcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBtLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLS8qIENvZGUgYW5kIGRhdGEsIGJvdGggbGFyZ2VyIHRoYW4gNjRrICovCi0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS50ZXh0ICR7UkVMT0NBVElORysgMHgxMDAwMH0gOgotCXsgCQkJCQkKLQkgICooLnRleHQpIAkJCQkKLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0KLQotCi0uZGF0YSAgJHtSRUxPQ0FUSU5HKyAweDIwMDAwfSA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gCi0KLS5yZGF0YSAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkqKC5yZGF0YSk7IAotCSAgKiguc3RyaW5ncykKLQlfX19jdG9ycyA9IC4gOwotCSooLmN0b3JzKQotCV9fX2N0b3JzX2VuZCA9IC4gOwotCV9fX2R0b3JzID0gLiA7Ci0JKiguZHRvcnMpCi0JX19fZHRvcnNfZW5kID0gLiA7Ci0JfSAKLQotLmJzcyAgJHtSRUxPQ0FUSU5HKyAuIH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfQotCi0uc3RhY2sgICR7UkVMT0NBVElORysgMHgyZmZmMH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAKLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaDg1MDBzLnNjIGIvbGQvc2NyaXB0dGVtcGwvaDg1MDBzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTYxNWQ4Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2g4NTAwcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0vKiBDb2RlIGFuZCBkYXRhLCBib3RoIDY0ayAqLwotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCAke1JFTE9DQVRJTkcrIDB4MTAwMDAgfSA6Ci0JeyAJCQkJCQotCSooLnRleHQpIAkJCQkKLSAgIAkke1JFTE9DQVRJTkcrIF9ldGV4dCA9IC4gOyB9Ci0JfQotCi0ucmRhdGEgICR7UkVMT0NBVElORysgMHgyMDAwMCB9IDoKLQl7Ci0JKigucmRhdGEpOyAKLQkqKC5zdHJpbmdzKQotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLQl9Ci0KLS5kYXRhICAke1JFTE9DQVRJTkcrIC4gfSA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gCi0KLS5ic3MgICR7UkVMT0NBVElORysgLn0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9fc3RhcnRfYnNzID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfQotCi0uc3RhY2sgICR7UkVMT0NBVElORysgMHgyZmZmMH0gOgotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JfSAKLQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYyBiL2xkL3NjcmlwdHRlbXBsL2hwcGFlbGYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWNlMDguLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaHBwYWVsZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLURBVEFfQUREUj0weDQwMDAwMDAwCi10ZXN0ICIkTERfRkxBRyIgPSAiTiIgJiYgREFUQV9BRERSPS4KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotRU5UUlkoIlwkU1RBUlRcJCIpCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotU0VDVElPTlMKLXsKLSAgLnRleHQgMHgxMDAwICR7UkVMT0NBVElORysrJHtURVhUX1NUQVJUX0FERFJ9fToKLSAgewotICAgICR7UkVMT0NBVElORytfX3RleHRfc3RhcnQgPSAufTsKLSAgICBDUkVBVEVfT0JKRUNUX1NZTUJPTFMKLSAgICAqKC5QQVJJU0Muc3R1YnMpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrZXRleHQgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07Ci0gIH0KLSAgJHtSRUxPQ0FUSU5HKy4gPSAke0RBVEFfQUREUn07fQotICAuZGF0YSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrIC4gPSAuICsgMHgxMDAwIH07Ci0gICAgJHtSRUxPQ0FUSU5HK19fZGF0YV9zdGFydCA9IC59OwotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICAgICR7UkVMT0NBVElORytlZGF0YSA9IC59OwotICAgICR7UkVMT0NBVElORytfZWRhdGEgPSAufTsKLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSfSArIFNJWkVPRiguZGF0YSk7fQotICAuYnNzIDoKLSAgewotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrZW5kID0gLiB9OwotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSAuIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4NmJlb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmZmRlMS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2YmVvcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFBFLgotCi1pZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KLSAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotZmkKLQotIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKLSMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCi1pZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgotICBSX1RFWFQ9JyooLnRleHQkKiknCi0gIFJfREFUQT0nKiguZGF0YSQqKScKLSAgUl9SREFUQT0nKigucmRhdGEkKiknCi0gIFJfSURBVEE9JwotICAgICooLmlkYXRhJDIpCi0gICAgKiguaWRhdGEkMykKLSAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCi0gICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOwotICAgICooLmlkYXRhJDQpCi0gICAgKiguaWRhdGEkNSkKLSAgICAqKC5pZGF0YSQ2KQotICAgICooLmlkYXRhJDcpJwotICBSX0NSVD0nKiguQ1JUJCopJwotICBSX1JTUkM9JyooLnJzcmMkKiknCi0gIFJfRVhDPScqKC5leGMkKiknCi1lbHNlCi0gIFJfVEVYVD0KLSAgUl9EQVRBPQotICBSX1JEQVRBPQotICBSX0lEQVRBPQotICBSX0NSVD0KLSAgUl9SU1JDPQotICBSX0VYQz0KLWZpCi0KLWNhdCA8PEVPRgotJHtSRUxPQ0FUSU5HK09VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSl9Ci0ke1JFTE9DQVRJTkctT1VUUFVUX0ZPUk1BVCgke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSl9Ci0KLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWShfX3N0YXJ0KQotJHtSRUxPQ0FUSU5HK2hlYWRlciA9IC47fQotJHtSRUxPQ0FUSU5HK19fZmx0dXNlZCA9IC47IC8qIHNldCB1cCBmbG9hdGluZyBwdCBmb3IgTVMgLm9ialwncyAqL30KLSR7UkVMT0NBVElORytfX2xkdXNlZCA9IC47fQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBfX2ltYWdlX2Jhc2VfXyArIF9fc2VjdGlvbl9hbGlnbm1lbnRfXyB9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrIF9fdGV4dF9zdGFydF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JfVEVYVH0KLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KLSAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9fdGV4dF9lbmRfXyA9IC47fQotICAgICooLmdjY19leGNlcHRfdGFibGUpCi0gIH0KLQotICAvKiBUaGUgQ3lnd2luMzIgbGlicmFyeSB1c2VzIGEgc2VjdGlvbiB0byBhdm9pZCBjb3B5aW5nIGNlcnRhaW4gZGF0YQotICAgICBvbiBmb3JrLiAgVGhpcyB1c2VkIHRvIGJlIG5hbWVkICIuZGF0YSRub2NvcHkiLiAgVGhlIGxpbmtlciB1c2VkCi0gICAgIHRvIGluY2x1ZGUgdGhpcyBiZXR3ZWVuIF9fZGF0YV9zdGFydF9fIGFuZCBfX2RhdGFfZW5kX18sIGJ1dCB0aGF0Ci0gICAgIGJyZWFrcyBidWlsZGluZyB0aGUgY3lnd2luMzIgZGxsLiAgSW5zdGVhZCwgd2UgbmFtZSB0aGUgc2VjdGlvbgotICAgICAiLmRhdGFfY3lnd2luX25vY29weSIgYW5kIGV4cGxpY3RseSBpbmNsdWRlIGl0IGFmdGVyIF9fZGF0YV9lbmRfXy4gKi8KLQotICAuZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOiAKLSAgewotICAgICR7UkVMT0NBVElORytfX2RhdGFfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICooLmRhdGEyKQotICAgICR7Ul9EQVRBfQotICAgICR7UkVMT0NBVElORytfX2RhdGFfZW5kX18gPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HKyooLmRhdGFfY3lnd2luX25vY29weSl9Ci0gIH0KLQotICAuYnNzICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnRfXyA9IC4gO30KLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgLyogbGluay5leGUgYXBwYXJlbnRseSBwdWxscyBpbiAub2JqJ3MgYmVjYXVzZSBvZiBVTkRFRiBjb21tb24KLQlzeW1ib2xzLCB3aGljaCBpcyBub3QgdGhlIGNvZmYgd2F5LCBidXQgdGhhdCdzIE1TIGZvciB5b3UuICovCi0gICAgKiguQ1JUXCRYQ0EpCi0gICAgKiguQ1JUXCRYQ1opCi0gICAgKiguQ1JUXCRYSUEpCi0gICAgKiguQ1JUXCRYSVopCi0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX2VuZF9fID0gLiA7fQotICB9Ci0KLSAgLnJkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5yZGF0YSkKLSAgICAke1JfUkRBVEF9Ci0gICAgKiguZWhfZnJhbWUpCi0gIH0KLQotICAuZWRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgICooLmVkYXRhKQotICB9Ci0KLSAgL0RJU0NBUkQvIDoKLSAgewotICAgICooLmRlYnVnXCRTKQotICAgICooLmRlYnVnXCRUKQotICAgICooLmRlYnVnXCRGKQotICAgICooLmRyZWN0dmUpCi0gICAgKiguZGVidWcqKQotICB9Ci0KLSAgLmlkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBUaGlzIGNhbm5vdCBjdXJyZW50bHkgYmUgaGFuZGxlZCB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuCi0JU2VlIHBlLmVtOnNvcnRfc2VjdGlvbnMuICAqLwotICAgICR7Ul9JREFUQX0KLSAgfQotICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JfQ1JUfQotICB9Ci0KLSAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotICB9Ci0KLSAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yZWxvYykKLSAgfQotCi0gIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yc3JjKQotICAgICR7Ul9SU1JDfQotICB9Ci0KLSAgLmV4YyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7IAkJCQkJCi0gICAgKiguZXhjKQotICAgICR7Ul9FWEN9Ci0gIH0KLQotICAuc3RhYiAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotCi0gIC5zdGFic3RyICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnKSB9Ci0gIC5saW5lICAgICAgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmxpbmUpIH0KLQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfc2ZuYW1lcykgfQotCi0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19hcmFuZ2VzKSB9Ci0gIC5kZWJ1Z19wdWJuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19pbmZvKSB9Ci0gIC5kZWJ1Z19hYmJyZXYgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2FiYnJldikgfQotICAuZGVidWdfbGluZSAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX2ZyYW1lKSB9Ci0gIC5kZWJ1Z19zdHIgICAgICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3N0cikgfQotICAuZGVidWdfbG9jICAgICAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfbWFjaW5mbykgfQotCi0gIC8qIFNHSS9NSVBTIERXQVJGIDIgZXh0ZW5zaW9ucyAqLwotICAuZGVidWdfd2Vha25hbWVzIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7ICooLmRlYnVnX3R5cGVuYW1lcykgfQotICAuZGVidWdfdmFybmFtZXMgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTM4NmNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiMWI3OS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9pMzg2Y29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgMzg2IENPRkYuICBUaGlzIHdvcmtzIG9uIFNWUjMuMiBhbmQgU0NPIFVuaXggMy4yLjIuCi0jIElhbiBUYXlsb3IgPGlhbkBjeWdudXMuY29tPi4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKX0KLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAke1JFTE9DQVRJTkctICR7SU5JVH19Ci0gICR7UkVMT0NBVElORy0gJHtGSU5JfX0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2Z28zMi5zYyBiL2xkL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmQzZDA5Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL2kzODZnbzMyLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBpMzg2IGdvMzIgKERKR1BQKQotCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPXN0YXJ0Ci1FWEU9JHtDT05TVFJVQ1RJTkcrJHtSRUxPQ0FUSU5HKy1leGV9fQotCi0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUNUT1I9Jy5jdG9yIDogeyAqKC5jdG9yKSB9JwotRFRPUj0nLmR0b3IgOiB7ICooLmR0b3IpIH0nCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSR7RVhFfSIpCi0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrICR7VEFSR0VUX1BBR0VfU0laRX0rU0laRU9GX0hFQURFUlN9IDogewotICAgICooLnRleHQpCi0gICAgKiguY29uc3QqKQotICAgICooLnJvKikKLSAgICAke1JFTE9DQVRJTkcrZXRleHQgID0gIC4gOyBfZXRleHQgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrLiA9IEFMSUdOKCR7U0VHTUVOVF9TSVpFfSk7fQotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgJHtEQVRBX0FMSUdOTUVOVH19IDogewotICAgICR7UkVMT0NBVElORytkamdwcF9maXJzdF9jdG9yID0gLiA7Ci0gICAgKiguY3RvcikKLSAgICBkamdwcF9sYXN0X2N0b3IgPSAuIDt9Ci0gICAgJHtSRUxPQ0FUSU5HK2RqZ3BwX2ZpcnN0X2R0b3IgPSAuIDsKLSAgICAqKC5kdG9yKQotICAgIGRqZ3BwX2xhc3RfZHRvciA9IC4gO30KLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgZWRhdGEgID0gIC4gOyBfZWRhdGEgPSAufTsKLSAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTigke1NFR01FTlRfU0laRX0pO30KLSAgfQotICAke0NPTlNUUlVDVElORyske1JFTE9DQVRJTkctJENUT1J9fQotICAke0NPTlNUUlVDVElORyske1JFTE9DQVRJTkctJERUT1J9fQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuIDsgX2VuZCA9IC59OwotICAgICR7UkVMT0NBVElORysgLiA9IEFMSUdOKCR7U0VHTUVOVF9TSVpFfSk7fQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL2kzODZseW54LnNjIGIvbGQvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjcyYTQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4Nmx5bnguc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9pMzg2bXNkb3Muc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMzEyZTcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTM4Nm1zZG9zLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrZXRleHQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KLSAgfQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5yb2RhdGEpCi0gICAgKiguZGF0YSkKLSAgICAke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0gICAgJHtSRUxPQ0FUSU5HK2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC59OwotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfZW5kID0gQUxJR04oNCkgfTsKLSAgICR7UkVMT0NBVElORytfX2VuZCA9IEFMSUdOKDQpIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYyBiL2xkL3NjcmlwdHRlbXBsL2k5NjAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzM1NTUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvaTk2MC5zYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLWNhdCA8PEVPRgotU0VDVElPTlMKLXsgCi0gICAgLnRleHQgOiAKLSAgICB7IAotCSR7R0xEX1NUWUxFKyBDUkVBVEVfT0JKRUNUX1NZTUJPTFN9Ci0JKigudGV4dCkgCi0JJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAufTsKLQkke0NPTlNUUlVDVElORyske0NPRkZfQ1RPUlN9fQotICAgIH0gIAotICAgIC5kYXRhIDoKLSAgICB7IAotIAkqKC5kYXRhKSAKLQkke0NPTlNUUlVDVElORytDT05TVFJVQ1RPUlN9Ci0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAufTsKLSAgICB9ICAKLSAgICAuYnNzIDoKLSAgICB7IAotCSR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC59OwotCSooLmJzcykJIAotCSooQ09NTU9OKSAKLQkke1JFTE9DQVRJTkcrIF9lbmQgPSAufTsKLSAgICB9IAotfSAKLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYyBiL2xkL3NjcmlwdHRlbXBsL202OGthdXguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDI4MGUuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTY4a2F1eC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgQS9VWC4KLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1JTklUPScuaW5pdCA6IHsgKiguaW5pdCkgfScKLUZJTkk9Jy5maW5pIDogeyAqKC5maW5pKSB9JwotQ1RPUlM9Jy5jdG9ycyA6IHsgKiguY3RvcnMpIH0nCi1EVE9SUz0nLmR0b3JzIDogeyAqKC5kdG9ycykgfScKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAkVEVYVF9TVEFSVF9BRERSfSA6IHsKLSAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIC4gPSBBTElHTig0KTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLjt9Ci0gIH0gPTB4NEU3MTRFNzEKLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAkREFUQV9BTElHTk1FTlR9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLjt9Ci0gIH0KLSAgLmJzcyA6IHsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAuO30KLSAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLSAgfQotICAke1JFTE9DQVRJTkctICR7SU5JVH19Ci0gICR7UkVMT0NBVElORy0gJHtGSU5JfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0NUT1JTfX0KLSAgJHtSRUxPQ0FUSU5HLSAke0RUT1JTfX0KLQotICAuY29tbWVudCAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLmNvbW1lbnQgXSBbIC5pZGVudCBdIH0KLSAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogeyBbIC5zdGFiIF0gfQotICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiB7IFsgLnN0YWJzdHIgXSB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL202OGtjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjhjNmYuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbTY4a2NvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci1QUk9WSURFIChfX3N0YWNrID0gMCk7IAotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAweDEwMDAwMDB9IDogewotICAgICooLnRleHQpCi0gICAgJHtDT05TVFJVQ1RJTkcrIC4gPSBBTElHTig0KTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19DVE9SX0VORF9fIC0gX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19EVE9SX0VORF9fIC0gX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19EVE9SX0VORF9fID0gLjt9Ci0gIH0KLSAgLmRhdGEgOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzIDogeyAJCQkJCQotICAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgICR7UkVMT0NBVElORysgZW5kID0gQUxJR04oMHg4KX07Ci0gICAgICR7UkVMT0NBVElORysgX2VuZCA9IEFMSUdOKDB4OCl9OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbTY4a2x5bnguc2MgYi9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkMjI0NS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9tNjhrbHlueC5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXRlc3QgLXogIiRFTlRSWSIgJiYgRU5UUlk9X3N0YXJ0Ci1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLUVOVFJZKCR7RU5UUll9KQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIFNJWkVPRl9IRUFERVJTfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0NUT1JfRU5EX18gLSBfX19DVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmN0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19EVE9SX0VORF9fIC0gX19fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfRU5EX18gPSAuO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICB9Ci0gIC5kYXRhICR7UkVMT0NBVElORysgMHg0MDAwMDAgKyAoLiAmIDB4ZmZjMDBmZmYpfSA6IHsKLSAgICAqKC5kYXRhIC5kYXRhMikKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL204OGtiY3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9tODhrYmNzLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTJiMTRkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL204OGtiY3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIFRoZXNlIGFyZSBzdWJzdGl0dXRlZCBpbiBhcyB2YXJpYWJsZXMgaW4gb3JkZXIgdG8gZ2V0ICd9JyBpbiBhIHNoZWxsCi0jIGNvbmRpdGlvbmFsIGV4cGFuc2lvbi4KLUlOSVQ9Jy5pbml0IDogeyAqKC5pbml0KSB9JwotRklOST0nLmZpbmkgOiB7ICooLmZpbmkpIH0nCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLUVOVFJZKF9fc3RhcnQpCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0gIC50ZXh0ICR7UkVMT0NBVElORysgKDB4MjAwMDcgKyBTSVpFT0ZfSEVBREVSUykgJn4gN30gOgotICAgIHsKLSAgICAgICR7UkVMT0NBVElORysgX18udGV4dC5zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0LnN0YXJ0ID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrICooLmluaXQpfQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0LmVuZCA9IC59OwotICAgICAgKigudGV4dCkgCQkJCQotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy50ZGVzY19zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyAqKC50ZGVzYyl9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLnRleHRfZW5kID0gLn0JOwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0cC5zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfXy5pbml0cC5lbmQgPSAufTsKLSAgICAgICR7UkVMT0NBVElORysgX18uZmluaV9zdGFydCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyAqKC5maW5pKSB9Ci0gICAgICAke1JFTE9DQVRJTkcrIF9fLmZpbmlfZW5kID0gLn07Ci0gICAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07Ci0gICAgfSAgCQkJCQkKLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyBORVhUICgweDQwMDAwMCkgKyAoKFNJWkVPRigudGV4dCkgKyBBRERSKC50ZXh0KSkgJSAweDIwMDApfSA6Ci0gICAgeyAJCQkJCQotICAgICAgKiguZGF0YSkKLSAgICAgICR7UkVMT0NBVElORytfZWRhdGEgID0gIC59OwotICAgIH0gIAkJCQkJCi0gIC5ic3MgJHtSRUxPQ0FUSU5HKyBTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgICB7IAkJCi0gICAgICAqKC5ic3MpCQotICAgICAgKihDT01NT04pIAkKLSAgICAgICR7UkVMT0NBVElORysgX2VuZCA9IC59OwotICAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IC59OwotICAgIH0KLSAgJHtSRUxPQ0FUSU5HLSAke0lOSVR9fQotICAke1JFTE9DQVRJTkctICR7RklOSX19Ci0gIC5jb21tZW50ICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgICooLmNvbW1lbnQpCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYyBiL2xkL3NjcmlwdHRlbXBsL21jb3JlcGUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NzEzMzguLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbWNvcmVwZS5zYworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIE1Db3JlIFBFLgotCi1pZiB0ZXN0IC16ICIke1JFTE9DQVRFQUJMRV9PVVRQVVRfRk9STUFUfSI7IHRoZW4KLSAgUkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotZmkKLQotIyBXZSBjYW4ndCBlYXNpbHkgYW5kIHBvcnRhYmx5IGdldCBhbiB1bnF1b3RlZCAkIGluIGEgc2hlbGwKLSMgc3Vic3RpdHV0aW9uLCBzbyB3ZSBkbyB0aGlzIGluc3RlYWQuCi0jIFNvcnRpbmcgb2YgdGhlIC5mb28kKiBzZWN0aW9ucyBpcyByZXF1aXJlZCBieSB0aGUgZGVmaW5pdGlvbiBvZgotIyBncm91cGVkIHNlY3Rpb25zIGluIFBFLgotIyBTb3J0aW5nIG9mIHRoZSBmaWxlIG5hbWVzIGluIFJfSURBVEEgaXMgcmVxdWlyZWQgYnkgdGhlCi0jIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGxsdG9vbCAodGhpcyBjb3VsZCBwcm9iYWJseSBiZSBjaGFuZ2VkIHRvCi0jIHVzZSBncm91cGVkIHNlY3Rpb25zIGluc3RlYWQpLgotaWYgdGVzdCAiJHtSRUxPQ0FUSU5HfSI7IHRoZW4KLSAgUl9URVhUPScqKFNPUlQoLnRleHQkKikpJwotICBSX0RBVEE9JyooU09SVCguZGF0YSQqKSknCi0gIFJfUkRBVEE9JyooU09SVCgucmRhdGEkKikpJwotICBSX0lEQVRBPScKLSAgICBTT1JUKCopKC5pZGF0YSQyKQotICAgIFNPUlQoKikoLmlkYXRhJDMpCi0gICAgLyogVGhlc2UgemVyb2VzIG1hcmsgdGhlIGVuZCBvZiB0aGUgaW1wb3J0IGxpc3QuICAqLwotICAgIExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsKLSAgICBTT1JUKCopKC5pZGF0YSQ0KQotICAgIFNPUlQoKikoLmlkYXRhJDUpCi0gICAgU09SVCgqKSguaWRhdGEkNikKLSAgICBTT1JUKCopKC5pZGF0YSQ3KScKLSAgUl9DUlQ9JyooU09SVCguQ1JUJCopKScKLSAgUl9SU1JDPScqKFNPUlQoLnJzcmMkKikpJwotZWxzZQotICBSX1RFWFQ9Ci0gIFJfREFUQT0KLSAgUl9SREFUQT0KLSAgUl9JREFUQT0KLSAgUl9DUlQ9Ci0gIFJfUlNSQz0KLWZpCi0KLWNhdCA8PEVPRgotJHtSRUxPQ0FUSU5HK09VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgCSAgICAgICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9Iil9Ci0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoX21haW5DUlRTdGFydHVwKQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JfVEVYVH0KLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KLSAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLmJzcyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORytfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gIC5yZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKigucmRhdGEpCi0gICAgJHtSX1JEQVRBfQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0KLSAgLmVkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5lZGF0YSkKLSAgfQotCi0gIC9ESVNDQVJELyA6Ci0gIHsKLSAgICAqKC5kZWJ1Z1wkUykKLSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAqKC5kZWJ1Z1wkRikKLSAgICAqKC5kcmVjdHZlKQotICB9Ci0KLSAgLmlkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBUaGlzIGNhbm5vdCBjdXJyZW50bHkgYmUgaGFuZGxlZCB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuCi0JU2VlIHBlLmVtOnNvcnRfc2VjdGlvbnMuICAqLwotICAgICR7Ul9JREFUQX0KLSAgfQotICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JfQ1JUfQotICB9Ci0KLSAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotICB9Ci0KLSAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yZWxvYykKLSAgfQotCi0gIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yc3JjKQotICAgICR7Ul9SU1JDfQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotCi0gIC5zdGFjayAweDgwMDAwIDoKLSAgewotICAgIF9zdGFjayA9IC47Ci0gICAgKiguc3RhY2spCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWlwcy5zYyBiL2xkL3NjcmlwdHRlbXBsL21pcHMuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MGFlZWQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbWlwcy5zYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgTUlQUyBzeXN0ZW1zLgotIyBJYW4gTGFuY2UgVGF5bG9yIDxpYW5AY3lnbnVzLmNvbT4uCi0jIFRoZXNlIHZhcmlhYmxlcyBtYXkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgZW11bGF0aW9uIGZpbGUuICBUaGUKLSMgZGVmYXVsdHMgYXJlIGFwcHJvcHJpYXRlIGZvciBhIERFQ3N0YXRpb24gcnVubmluZyBVbHRyaXguCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9fc3RhcnQKLQotaWYgWyAteiAiJEVNQkVEREVEIiBdOyB0aGVuCi0gIHRlc3QgLXogIiRURVhUX1NUQVJUX0FERFIiICYmIFRFWFRfU1RBUlRfQUREUj0iMHg0MDAwMDAgKyBTSVpFT0ZfSEVBREVSUyIKLWVsc2UKLSAgdGVzdCAteiAiJFRFWFRfU1RBUlRfQUREUiIgJiYgVEVYVF9TVEFSVF9BRERSPSIweDQwMDAwMCIKLWZpCi1pZiB0ZXN0ICJ4JExEX0ZMQUciID0gInhuIiAtbyAieCRMRF9GTEFHIiA9ICJ4TiI7IHRoZW4KLSAgREFUQV9BRERSPS4KLWVsc2UKLSAgdGVzdCAteiAiJERBVEFfQUREUiIgJiYgREFUQV9BRERSPTB4MTAwMDAwMDAKLWZpCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOiB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfZnRleHQgPSAuIH07Ci0gICAgKiguaW5pdCkKLSAgICAke1JFTE9DQVRJTkcrIGVwcm9sICA9ICAufTsKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RhcnQgPSAuKTt9Ci0gICAgKigucmVsLnNkYXRhKQotICAgICR7UkVMT0NBVElORytQUk9WSURFIChfX3J1bnRpbWVfcmVsb2Nfc3RvcCA9IC4pO30KLSAgICAqKC5maW5pKQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC59OwotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ICA9ICAufTsKLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BRERSfTt9Ci0gIC5yZGF0YSA6IHsKLSAgICAqKC5yZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIF9mZGF0YSA9IEFMSUdOKDE2KTt9Ci0gIC5kYXRhIDogewotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gICR7UkVMT0NBVElORysgX2dwID0gQUxJR04oMTYpICsgMHg4MDAwO30KLSAgLmxpdDggOiB7Ci0gICAgKigubGl0OCkKLSAgfQotICAubGl0NCA6IHsKLSAgICAqKC5saXQ0KQotICB9Ci0gIC5zZGF0YSA6IHsKLSAgICAqKC5zZGF0YSkKLSAgfQotICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAuO30KLSAgJHtSRUxPQ0FUSU5HKyBfZWRhdGEgID0gIC47fQotICAke1JFTE9DQVRJTkcrIF9mYnNzID0gLjt9Ci0gIC5zYnNzIDogewotICAgICooLnNic3MpCi0gICAgKiguc2NvbW1vbikKLSAgfQotICAuYnNzIDogewotICAgICooLmJzcykKLSAgICAqKENPTU1PTikKLSAgfQotICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAke1JFTE9DQVRJTkcrIF9lbmQgPSAuO30KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYyBiL2xkL3NjcmlwdHRlbXBsL21pcHNic2Quc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjJiMzMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvbWlwc2JzZC5zYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIsICIke0JJR19PVVRQVVRfRk9STUFUfSIsCi0JICAgICAgIiR7TElUVExFX09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0KLSR7UkVMT0NBVElORyske0xJQl9TRUFSQ0hfRElSU319Ci1TRUNUSU9OUwotewotICAke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfTt9Ci0gIC50ZXh0IDoKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLnRleHQpCi0gICAgJHtSRUxPQ0FUSU5HK2V0ZXh0ID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICB9Ci0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrZWRhdGEgID0gIC47fQotICB9Ci0gIC5ic3MgOgotICB7Ci0gICAqKC5ic3MpCi0gICAqKENPTU1PTikKLSAgICR7UkVMT0NBVElORytlbmQgPSAuIH07Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvbncuc2MgYi9sZC9zY3JpcHR0ZW1wbC9udy5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1NTIyYy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9udy5zYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0jCi0jIFVudXN1YWwgdmFyaWFibGVzIGNoZWNrZWQgYnkgdGhpcyBjb2RlOgotIwlOT1AgLSB0d28gYnl0ZSBvcGNvZGUgZm9yIG5vLW9wIChkZWZhdWx0cyB0byAwKQotIwlEQVRBX0FERFIgLSBpZiBlbmQtb2YtdGV4dC1wbHVzLW9uZS1wYWdlIGlzbid0IHJpZ2h0IGZvciBkYXRhIHN0YXJ0Ci0jCU9USEVSX1JFQURPTkxZX1NFQ1RJT05TIC0gb3RoZXIgdGhhbiAudGV4dCAuaW5pdCAuY3RvcnMgLnJvZGF0YSAuLi4KLSMJCShlLmcuLCAuUEFSSVNDLm1pbGxpKQotIwlPVEhFUl9SRUFEV1JJVEVfU0VDVElPTlMgLSBvdGhlciB0aGFuIC5kYXRhIC5ic3MgLnNkYXRhIC4uLgotIwkJKGUuZy4sIC5QQVJJU0MuZ2xvYmFsKQotIwlPVEhFUl9TRUNUSU9OUyAtIGF0IHRoZSBlbmQKLSMJRVhFQ1VUQUJMRV9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IG11c3QgYmUgZGVmaW5lZCBmb3IgYW4KLSMJCWV4ZWN1dGFibGUgKGUuZy4sIF9EWU5BTUlDX0xJTkspCi0jCVRFWFRfU1RBUlRfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLnRleHQgc2VjdGlvbi4KLSMJREFUQV9TVEFSVF9TWU1CT0xTIC0gc3ltYm9scyB0aGF0IGFwcGVhciBhdCB0aGUgc3RhcnQgb2YgdGhlCi0jCQkuZGF0YSBzZWN0aW9uLgotIwlPVEhFUl9CU1NfU1lNQk9MUyAtIHN5bWJvbHMgdGhhdCBhcHBlYXIgYXQgdGhlIHN0YXJ0IG9mIHRoZQotIwkJLmJzcyBzZWN0aW9uIGJlc2lkZXMgX19ic3Nfc3RhcnQuCi0jCURBVEFfUExUIC0gLnBsdCBzaG91bGQgYmUgaW4gZGF0YSBzZWdtZW50LCBub3QgdGV4dCBzZWdtZW50LgotIwotIyBXaGVuIGFkZGluZyBzZWN0aW9ucywgZG8gbm90ZSB0aGF0IHRoZSBuYW1lcyBvZiBzb21lIHNlY3Rpb25zIGFyZSB1c2VkCi0jIHdoZW4gc3BlY2lmeWluZyB0aGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbmV4dC4KLSMKLXRlc3QgLXogIiR7QklHX09VVFBVVF9GT1JNQVR9IiAmJiBCSUdfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci10ZXN0IC16ICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIgJiYgTElUVExFX09VVFBVVF9GT1JNQVQ9JHtPVVRQVVRfRk9STUFUfQotdGVzdCAiJExEX0ZMQUciID0gIk4iICYmIERBVEFfQUREUj0uCi1JTlRFUlA9Ii5pbnRlcnAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmludGVycCkgCX0iCi1QTFQ9Ii5wbHQgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5wbHQpCX0iCi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iLCAiJHtCSUdfT1VUUFVUX0ZPUk1BVH0iLAotCSAgICAgICIke0xJVFRMRV9PVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HKy8qIERvIHdlIG5lZWQgYW55IG9mIHRoZXNlIGZvciBlbGY/Ci0gICBfX0RZTkFNSUMgPSAwOyAke1NUQUNLWkVSTyske1NUQUNLWkVST319ICR7U0hMSUJfUEFUSCske1NITElCX1BBVEh9fSAgKi99Ci0ke1JFTE9DQVRJTkcrJHtFWEVDVVRBQkxFX1NZTUJPTFN9fQotJHtSRUxPQ0FUSU5HLSAvKiBGb3Igc29tZSByZWFzb24sIHRoZSBTb2xhcmlzIGxpbmtlciBtYWtlcyBiYWQgZXhlY3V0YWJsZXMKLSAgaWYgZ2xkIC1yIGlzIHVzZWQgYW5kIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBoYXMgc2VjdGlvbnMgc3RhcnRpbmcKLSAgYXQgbm9uLXplcm8gYWRkcmVzc2VzLiAgQ291bGQgYmUgYSBTb2xhcmlzIGxkIGJ1ZywgY291bGQgYmUgYSBHTlUgbGQKLSAgYnVnLiAgQnV0IGZvciBub3cgYXNzaWduaW5nIHRoZSB6ZXJvIHZtYXMgd29ya3MuICAqL30KLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAke0NSRUFURV9TSExJQi0ke1JFTE9DQVRJTkcrLiA9ICR7VEVYVF9TVEFSVF9BRERSfSArIFNJWkVPRl9IRUFERVJTO319Ci0gICR7Q1JFQVRFX1NITElCKyR7UkVMT0NBVElORysuID0gU0laRU9GX0hFQURFUlM7fX0KLSAgJHtDUkVBVEVfU0hMSUItJHtJTlRFUlB9fQotICAuaGFzaCAgICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5zeW0pCQl9Ci0gIC5keW5zdHIgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR5bnN0cikJCX0KLSAgLnJlbC50ZXh0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnRleHQpCQl9Ci0gIC5yZWxhLnRleHQgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEudGV4dCkgCX0KLSAgLnJlbC5kYXRhICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLmRhdGEpCQl9Ci0gIC5yZWxhLmRhdGEgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZGF0YSkgCX0KLSAgLnJlbC5yb2RhdGEgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnJvZGF0YSkgCX0KLSAgLnJlbGEucm9kYXRhICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5yb2RhdGEpIAl9Ci0gIC5yZWwuZ290ICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLnJlbGEuZ290KQkJfQotICAucmVsLmN0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuY3RvcnMpCX0KLSAgLnJlbGEuY3RvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuZHRvcnMpCX0KLSAgLnJlbGEuZHRvcnMgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5kdG9ycykJfQotICAucmVsLmJzcyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yZWxhLmJzcykJCX0KLSAgLnJlbC5wbHQgICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsLnBsdCkJCX0KLSAgLnJlbGEucGx0ICAgICR7UkVMT0NBVElORy0wfSA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmluaXQpCX0gPSR7Tk9QLTB9Ci0gICR7REFUQV9QTFQtJHtQTFR9fQotICAudGV4dCAgICAke1JFTE9DQVRJTkctMH0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9TWU1CT0xTfX0KLSAgICAqKC50ZXh0KQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0NUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCUxPTkcoKF9fQ1RPUl9FTkRfXyAtIF9fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKwkqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCUxPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCV9fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKwlfX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCUxPTkcoKF9fRFRPUl9FTkRfXyAtIF9fRFRPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKwkqKC5kdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCUxPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrCV9fRFRPUl9FTkRfXyA9IC47fQotICB9Ci0gICR7UkVMT0NBVElORytfZXRleHQgPSAuO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGV0ZXh0ID0gLik7fQotICAuZmluaSAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmZpbmkpICAgIH0gPSR7Tk9QLTB9Ci0gIC5jdG9ycyAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguY3RvcnMpICAgfQotICAuZHRvcnMgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmR0b3JzKSAgIH0KLSAgLnJvZGF0YSAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5yb2RhdGEpICB9Ci0gIC5yb2RhdGExICR7UkVMT0NBVElORy0wfSA6IHsgKigucm9kYXRhMSkgfQotICAke1JFTE9DQVRJTkcrJHtPVEhFUl9SRUFET05MWV9TRUNUSU9OU319Ci0KLSAgLyogUmVhZC13cml0ZSBzZWN0aW9uLCBtZXJnZWQgaW50byBkYXRhIHNlZ21lbnQ6ICovCi0gICR7UkVMT0NBVElORysuID0gJHtEQVRBX0FERFItIEFMSUdOKDgpICsgJHtNQVhQQUdFU0laRX19O30KLSAgLmRhdGEgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICAke1JFTE9DQVRJTkcrJHtEQVRBX1NUQVJUX1NZTUJPTFN9fQotICAgICooLmRhdGEpCi0gICAgJHtDT05TVFJVQ1RJTkcrQ09OU1RSVUNUT1JTfQotICB9Ci0gIC5kYXRhMSAke1JFTE9DQVRJTkctMH0gOiB7ICooLmRhdGExKSB9Ci0gICR7UkVMT0NBVElORyske09USEVSX1JFQURXUklURV9TRUNUSU9OU319Ci0gIC5nb3QgICAgICAgICAke1JFTE9DQVRJTkctMH0gOiB7ICooLmdvdC5wbHQpICooLmdvdCkgfQotICAuZHluYW1pYyAgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5keW5hbWljKSB9Ci0gICR7REFUQV9QTFQrJHtQTFR9fQotICAvKiBXZSB3YW50IHRoZSBzbWFsbCBkYXRhIHNlY3Rpb25zIHRvZ2V0aGVyLCBzbyBzaW5nbGUtaW5zdHJ1Y3Rpb24gb2Zmc2V0cwotICAgICBjYW4gYWNjZXNzIHRoZW0gYWxsLCBhbmQgaW5pdGlhbGl6ZWQgZGF0YSBhbGwgYmVmb3JlIHVuaW5pdGlhbGl6ZWQsIHNvCi0gICAgIHdlIGNhbiBzaG9ydGVuIHRoZSBvbi1kaXNrIHNlZ21lbnQgc2l6ZS4gICovCi0gIC5zZGF0YSAgICR7UkVMT0NBVElORy0wfSA6IHsgKiguc2RhdGEpIH0KLSAgJHtSRUxPQ0FUSU5HK19lZGF0YSAgPSAgLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChlZGF0YSA9IC4pO30KLSAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0ID0gLjt9Ci0gICR7UkVMT0NBVElORyske09USEVSX0JTU19TWU1CT0xTfX0KLSAgLnNic3MgICAgJHtSRUxPQ0FUSU5HLTB9IDogeyAqKC5zYnNzKSAqKC5zY29tbW9uKSB9Ci0gIC5ic3MgICAgICR7UkVMT0NBVElORy0wfSA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICB9Ci0gICR7UkVMT0NBVElORytfZW5kID0gLiA7fQotICAke1JFTE9DQVRJTkcrUFJPVklERSAoZW5kID0gLik7fQotCi0gIC8qIFRoZXNlIGFyZSBuZWVkZWQgZm9yIEVMRiBiYWNrZW5kcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbgotICAgICBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBzdHlsZSBsaW5rZXIuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLQotICAvKiBUaGVzZSBtdXN0IGFwcGVhciByZWdhcmRsZXNzIG9mICR7UkVMT0NBVElOR30uICAqLwotICAke09USEVSX1NFQ1RJT05TfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9wZS5zYyBiL2xkL3NjcmlwdHRlbXBsL3BlLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjEyZDQyLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3BlLnNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgUEUuCi0KLWlmIHRlc3QgLXogIiR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9IjsgdGhlbgotICBSRUxPQ0FURUFCTEVfT1VUUFVUX0ZPUk1BVD0ke09VVFBVVF9GT1JNQVR9Ci1maQotCi0jIFdlIGNhbid0IGVhc2lseSBhbmQgcG9ydGFibHkgZ2V0IGFuIHVucXVvdGVkICQgaW4gYSBzaGVsbAotIyBzdWJzdGl0dXRpb24sIHNvIHdlIGRvIHRoaXMgaW5zdGVhZC4KLSMgU29ydGluZyBvZiB0aGUgLmZvbyQqIHNlY3Rpb25zIGlzIHJlcXVpcmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mCi0jIGdyb3VwZWQgc2VjdGlvbnMgaW4gUEUuCi0jIFNvcnRpbmcgb2YgdGhlIGZpbGUgbmFtZXMgaW4gUl9JREFUQSBpcyByZXF1aXJlZCBieSB0aGUKLSMgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBkbGx0b29sICh0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGNoYW5nZWQgdG8KLSMgdXNlIGdyb3VwZWQgc2VjdGlvbnMgaW5zdGVhZCkuCi1pZiB0ZXN0ICIke1JFTE9DQVRJTkd9IjsgdGhlbgotICBSX1RFWFQ9JyooU09SVCgudGV4dCQqKSknCi0gIFJfREFUQT0nKihTT1JUKC5kYXRhJCopKScKLSAgUl9SREFUQT0nKihTT1JUKC5yZGF0YSQqKSknCi0gIFJfSURBVEE9JwotICAgIFNPUlQoKikoLmlkYXRhJDIpCi0gICAgU09SVCgqKSguaWRhdGEkMykKLSAgICAvKiBUaGVzZSB6ZXJvZXMgbWFyayB0aGUgZW5kIG9mIHRoZSBpbXBvcnQgbGlzdC4gICovCi0gICAgTE9ORyAoMCk7IExPTkcgKDApOyBMT05HICgwKTsgTE9ORyAoMCk7IExPTkcgKDApOwotICAgIFNPUlQoKikoLmlkYXRhJDQpCi0gICAgU09SVCgqKSguaWRhdGEkNSkKLSAgICBTT1JUKCopKC5pZGF0YSQ2KQotICAgIFNPUlQoKikoLmlkYXRhJDcpJwotICBSX0NSVD0nKihTT1JUKC5DUlQkKikpJwotICBSX1JTUkM9JyooU09SVCgucnNyYyQqKSknCi1lbHNlCi0gIFJfVEVYVD0KLSAgUl9EQVRBPQotICBSX1JEQVRBPQotICBSX0lEQVRBPQotICBSX0NSVD0KLSAgUl9SU1JDPQotZmkKLQotY2F0IDw8RU9GCi0ke1JFTE9DQVRJTkcrT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KX0KLSR7UkVMT0NBVElORy1PVVRQVVRfRk9STUFUKCR7UkVMT0NBVEVBQkxFX09VVFBVVF9GT1JNQVR9KX0KLSR7T1VUUFVUX0FSQ0grT1VUUFVUX0FSQ0goJHtPVVRQVVRfQVJDSH0pfQotCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoX21haW5DUlRTdGFydHVwKQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrIF9faW1hZ2VfYmFzZV9fICsgX19zZWN0aW9uX2FsaWdubWVudF9fIH0gOiAKLSAgewotICAgICR7UkVMT0NBVElORysgKiguaW5pdCl9Ci0gICAgKigudGV4dCkKLSAgICAke1JfVEVYVH0KLSAgICAqKC5nbHVlXzd0KQotICAgICooLmdsdWVfNykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuOyBfX0NUT1JfTElTVF9fID0gLiA7IAotCQkJTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0xJU1RfXyA9IC47IF9fRFRPUl9MSVNUX18gPSAuIDsgCi0JCQlMT05HICgtMSk7ICooLmR0b3JzKTsgKiguZHRvcik7ICBMT05HICgwKTsgfQotICAgICR7UkVMT0NBVElORysgKiguZmluaSl9Ci0gICAgLyogPz8/IFdoeSBpcyAuZ2NjX2V4YyBoZXJlPyAgKi8KLSAgICAke1JFTE9DQVRJTkcrICooLmdjY19leGMpfQotICAgICR7UkVMT0NBVElORysgZXRleHQgPSAuO30KLSAgICAqKC5nY2NfZXhjZXB0X3RhYmxlKQotICB9Ci0KLSAgLyogVGhlIEN5Z3dpbjMyIGxpYnJhcnkgdXNlcyBhIHNlY3Rpb24gdG8gYXZvaWQgY29weWluZyBjZXJ0YWluIGRhdGEKLSAgICAgb24gZm9yay4gIFRoaXMgdXNlZCB0byBiZSBuYW1lZCAiLmRhdGEkbm9jb3B5Ii4gIFRoZSBsaW5rZXIgdXNlZAotICAgICB0byBpbmNsdWRlIHRoaXMgYmV0d2VlbiBfX2RhdGFfc3RhcnRfXyBhbmQgX19kYXRhX2VuZF9fLCBidXQgdGhhdAotICAgICBicmVha3MgYnVpbGRpbmcgdGhlIGN5Z3dpbjMyIGRsbC4gIEluc3RlYWQsIHdlIG5hbWUgdGhlIHNlY3Rpb24KLSAgICAgIi5kYXRhX2N5Z3dpbl9ub2NvcHkiIGFuZCBleHBsaWN0bHkgaW5jbHVkZSBpdCBhZnRlciBfX2RhdGFfZW5kX18uICovCi0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDogCi0gIHsKLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhMikKLSAgICAke1JfREFUQX0KLSAgICAke1JFTE9DQVRJTkcrX19kYXRhX2VuZF9fID0gLiA7fQotICAgICR7UkVMT0NBVElORysqKC5kYXRhX2N5Z3dpbl9ub2NvcHkpfQotICB9Ci0KLSAgLmJzcyAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fYnNzX3N0YXJ0X18gPSAuIDt9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORytfX2Jzc19lbmRfXyA9IC4gO30KLSAgfQotCi0gIC5yZGF0YSAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gOgotICB7Ci0gICAgKigucmRhdGEpCi0gICAgJHtSX1JEQVRBfQotICAgICooLmVoX2ZyYW1lKQotICB9Ci0KLSAgLmVkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAqKC5lZGF0YSkKLSAgfQotCi0gIC9ESVNDQVJELyA6Ci0gIHsKLSAgICAqKC5kZWJ1Z1wkUykKLSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAqKC5kZWJ1Z1wkRikKLSAgICAqKC5kcmVjdHZlKQotICB9Ci0KLSAgLmlkYXRhICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsKLSAgICAvKiBUaGlzIGNhbm5vdCBjdXJyZW50bHkgYmUgaGFuZGxlZCB3aXRoIGdyb3VwZWQgc2VjdGlvbnMuCi0JU2VlIHBlLmVtOnNvcnRfc2VjdGlvbnMuICAqLwotICAgICR7Ul9JREFUQX0KLSAgfQotICAuQ1JUICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JfQ1JUfQotICB9Ci0KLSAgLmVuZGp1bmsgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9IDoKLSAgewotICAgIC8qIGVuZCBpcyBkZXByZWNhdGVkLCBkb24ndCB1c2UgaXQgKi8KLSAgICAke1JFTE9DQVRJTkcrIGVuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC47fQotICAgICR7UkVMT0NBVElORysgX19lbmRfXyA9IC47fQotICB9Ci0KLSAgLnJlbG9jICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yZWxvYykKLSAgfQotCi0gIC5yc3JjICR7UkVMT0NBVElORytCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5yc3JjKQotICAgICR7Ul9SU1JDfQotICB9Ci0KLSAgLnN0YWIgJHtSRUxPQ0FUSU5HK0JMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXyl9ICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLQotICAuc3RhYnN0ciAke1JFTE9DQVRJTkcrQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKX0gJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3BwY3BlLnNjIGIvbGQvc2NyaXB0dGVtcGwvcHBjcGUuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZmJlMzMuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvcHBjcGUuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotIyBBIFBFIGxpbmtlciBzY3JpcHQgZm9yIFBvd2VyUEMuCi0jIExvb3NlbHkgYmFzZWQgb24gU3RldmUgQ2hhbWJlcmxhaW4ncyBwZS5zYy4KLSMgQWxsIG5ldyBtaXN0YWtlcyBzaG91bGQgYmUgY3JlZGl0ZWQgdG8gS2ltIEtudXR0aWxhIChrcmtAY3lnbnVzLmNvbSkKLSMKLSMgVGhlc2UgYXJlIHN1YnN0aXR1dGVkIGluIGFzIHZhcmlhYmxlcyBpbiBvcmRlciB0byBnZXQgJ30nIGluIGEgc2hlbGwKLSMgY29uZGl0aW9uYWwgZXhwYW5zaW9uLgotSU5JVD0nLmluaXQgOiB7ICooLmluaXQpIH0nCi1GSU5JPScuZmluaSA6IHsgKiguZmluaSkgfScKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgke09VVFBVVF9GT1JNQVR9KQotJHtMSUJfU0VBUkNIX0RJUlN9Ci0KLS8qIE11Y2ggb2YgdGhpcyBsYXlvdXQgd2FzIGRldGVybWluZWQgYnkgZGVsdmluZyBpbnRvIC5leGUgZmlsZXMgZm9yCi0gICB0aGUgYm94IGdlbmVyYXRlZCBieSBvdGhlciBjb21waWxlcnMvbGlua2Vycy9ldGMuIFRoaXMgbWVhbnMgdGhhdAotICAgaWYgYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZGlkIG5vdCBoYXBwZW4gdG8gYXBwZWFyIGluIG9uZSBvZiB0aGUgCi0gICBzdWJqZWN0IGZpbGVzLCB0aGVuIGl0IG1heSBub3QgYmUgeWV0IHN1cHBvcnRlZC4KLSovCi0KLS8qIEl0J3MgIm1haW5DUlRTdGFydHVwIiwgbm90ICJfbWFpbkNSVFN0YXJ0dXAiLCBhbmQgaXQncyBsb2NhdGVkIGluCi0gICBvbmUgb2YgdGhlIHR3byAubGliIGZpbGVzIChsaWJjLmxpYiBhbmQga2VybmVsMzIubGliKSB0aGF0IGN1cnJlbnRseQotICAgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBsaW5rIGxpbmUuIFRoaXMgbWVhbnMgdGhhdCB5b3UgbXVzdCB1c2UgCi0gICAiLXUgbWFpbkNSVFN0YXJ0dXAiIHRvIG1ha2Ugc3VyZSBpdCBnZXRzIGluY2x1ZGVkIGluIHRoZSBsaW5rLgotKi8KLQotRU5UUlkobWFpbkNSVFN0YXJ0dXApCi0KLVNFQ1RJT05TCi17Ci0KLSAgLyogdGV4dCAtIHRoZSB1c3VhbCBtZWFuaW5nICovCi0gIC50ZXh0ICR7UkVMT0NBVElORysgX19pbWFnZV9iYXNlX18gKyBfX3NlY3Rpb25fYWxpZ25tZW50X18gfSA6IAotCXsKLQkgICAgJHtSRUxPQ0FUSU5HKyAqKC5pbml0KTt9Ci0JICAgICooLnRleHQpCi0JICAgICooLmdjY19leGNlcHRfdGFibGUpCi0JICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47IF9fQ1RPUl9MSVNUX18gPSAuIDsgCi0JCSAgICAgICAgTE9ORyAoLTEpOyAqKC5jdG9ycyk7ICooLmN0b3IpOyBMT05HICgwKTsgfQotICAgICAgICAgICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjsgX19EVE9SX0xJU1RfXyA9IC4gOyAKLQkJCUxPTkcgKC0xKTsgKiguZHRvcnMpOyAqKC5kdG9yKTsgIExPTkcgKDApOyB9Ci0JICAgICR7UkVMT0NBVElORysgKiguZmluaSk7fQotCSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLQl9Ci0KLSAgLyogcmRhdGEgLSBSZWFkIE9ubHkgUnVudGltZSBEYXRhCi0gICAgIENUUiBzZWN0aW9uczogQWxsIG9mIHRoZSBDUlQgKHJlYWQgb25seSBDIHJ1bnRpbWUgZGF0YSkgc2VjdGlvbnMgCi0JYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUgLnJkYXRhIChyZWFkIG9ubHkgcnVudGltZSBkYXRhKSAKLQlzZWN0aW9uLCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyLiBEb24ndCBrbm93IGlmIGl0IG1hdHRlcnMgb3Igbm90LgotCU5vdCBhbGwgc2VjdGlvbnMgYXJlIGFsd2F5cyBwcmVzZW50IGVpdGhlci4KLSAgICAgLnJkYXRhOiBjb21waWxlciBnZW5lcmF0ZWQgcmVhZCBvbmx5IGRhdGEKLSAgICAgLnhkYXRhOiBjb21waWxlciBnZW5lcmF0ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlLiAoTW9zdCBkb2NzCi0Jc2VlbSB0byBzdWdnZXN0IHRoYXQgdGhpcyBzZWN0aW9uIGlzIG5vdyBkZXByZWNhdGVkIGluZmF2b3IKLQlvZiB0aGUgeWRhdGEgc2VjdGlvbikKLSAgICAgLmVkYXRhOiBUaGUgZXhwb3J0ZWQgbmFtZXMgdGFibGUuCi0gICovCi0gIC5yZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7Ci0JICAgICooLkNSVFwkWENBKTsKLQkgICAgKiguQ1JUXCRYQ0MpOwotCSAgICAqKC5DUlRcJFhDWik7Ci0JICAgICooLkNSVFwkWElBKTsKLQkgICAgKiguQ1JUXCRYSUMpOwotCSAgICAqKC5DUlRcJFhJWik7Ci0JICAgICooLkNSVFwkWExBKTsKLQkgICAgKiguQ1JUXCRYTFopOwotCSAgICAqKC5DUlRcJFhQQSk7Ci0JICAgICooLkNSVFwkWFBYKTsKLQkgICAgKiguQ1JUXCRYUFopOwotCSAgICAqKC5DUlRcJFhUQSk7Ci0JICAgICooLkNSVFwkWFRaKTsKLQkgICAgKigucmRhdGEpOwotCSAgICAqKC54ZGF0YSk7Ci0JfQotCi0gIC5lZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7Ci0gICAgCSAgICAqKC5lZGF0YSk7Ci0JfQotCi0gIC8qIGRhdGEgLSBpbml0aWFsaXplZCBkYXRhCi0gICAgIC55ZGF0YTogZXhjZXB0aW9uIGhhbmRsaW5nIGluZm9ybWF0aW9uLgotICAgICAuZGF0YTogdGhlIHVzdWFsIG1lYW5pbmcuCi0gICAgIC5kYXRhMjogbW9yZSBvZiB0aGUgc2FtZS4KLSAgICAgLmJzczogRm9yIHNvbWUgcmVhc29uLCBic3MgYXBwZWFycyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZGF0YQotCXNlY3Rpb24sIGFzIG9wcG9zZWQgdG8gYmVpbmcgZ2l2ZW4gYSBzZWN0aW9uIG9mIGl0J3Mgb3duLgotICAgICBDT01NT046Ci0gICovCi0gIC5kYXRhIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOiAKLQl7Ci0JICAgIF9fZGF0YV9zdGFydF9fID0gLiA7IAotCSAgICAqKC55ZGF0YSk7Ci0JICAgICooLmRhdGEpOwotCSAgICAqKC5kYXRhMik7Ci0JICAgIF9fYnNzX3N0YXJ0X18gPSAuIDsKLQkgICAgKiguYnNzKSA7Ci0JICAgICooQ09NTU9OKTsKLQkgICAgX19ic3NfZW5kX18gPSAuIDsKLQkgICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAgLn07Ci0gCSAgICBfX2RhdGFfZW5kX18gPSAuIDsgCi0JfQotCi0gIC8qIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgdGFibGUuIEEgc2VxdWVuY2Ugb2YgNSB3b3JkIGVudHJpZXMuIFNlY3Rpb24KLSAgICAgYWRkcmVzcyBhbmQgZXh0ZW50IGFyZSBwbGFjZWQgaW4gdGhlIERhdGFEaXJlY3RvcnkuCi0gICovCi0gIC5wZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgICooLnBkYXRhKQotIAkgICAgOwotCX0KLQotICAvKiBUaGUgaWRhdGEgc2VjdGlvbiBpcyBjaG9jayBmdWxsIG9mIG1hZ2ljIGJpdHMuIAotCTEuIEJvdW5kYXJpZXMgYXJvdW5kIHZhcmlvdXMgaWRhdGEgcGFydHMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZQotCSAgIHNvbWUgb2YgdGhlIGZpZWxkcyBvZiB0aGUgRGF0YURpcmVjdG9yeS4gSW4gcGFydGljdWxhciwgdGhlCi0JICAgbWFnaWMgZm9yIDIsIDQgYW5kIDUgYXJlIGtub3duIHRvIGJlIHVzZWQuIFNvbWUgY29tcGlsZXJzCi0JICAgYXBwZWFyIHRvIGdlbmVyYXRlIG1hZ2ljIHNlY3Rpb24gc3ltYm9scyBmb3IgdGhpcyBwdXJwb3NlLgotCSAgIFdoZXJlIHdlIGNhbiwgd2UgY2F0Y2ggc3VjaCBzeW1ib2xzIGFuZCB1c2Ugb3VyIG93bi4gVGhpcyBvZgotCSAgIGNvdXJzZSBpcyBzb21ldGhpbmcgbGVzcyB0aGFuIGEgcGVyZmVjdCBzdHJhdGVneS4KLQkyLiBUaGUgdGFibGUgb2YgY29udGVudHMgaXMgcGxhY2VkIGltbWVkaWF0ZWx5IGFmdGVyIGlkYXRhNC4KLQkgICBUaGUgIi5wcml2YXRlLnRvYyIgc2VjdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0aGUgcHBjIGJmZC4gVGhlCi0JICAgLnRvYyB2YXJpYWJsZSBpcyBnZW5lcmF0ZWQgYnkgZ2FzLCBhbmQgcmVzb2x2ZWQgaGVyZS4gSXQgaXMKLQkgICB1c2VkIHRvIGluaXRpYWxpemVkIGZ1bmN0aW9uIGRlc2NyaXB0b3JzIChhbmQgYW55b25lIGVsc2Ugd2hvCi0JICAgbmVlZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1vZHVsZSdzIHRvYykuIFRoZSBvbmx5IHRoaW5nIAotCSAgIGludGVyZXN0aW5nIGFib3V0IGl0IGF0IGFsbD8gTW9zdCBwcGMgaW5zdHJ1Y3Rpb25zIHVzaW5nIGl0Ci0JICAgaGF2ZSBhIDE2Yml0IGRpc3BsYWNlbWVudCBmaWVsZC4gVGhlIGNvbnZlbnRpb24gZm9yIGFkZHJlc3NpbmcKLQkgICBpcyB0byBpbml0aWFsaXplIHRoZSAudG9jIHZhbHVlIHRvIDMySyBwYXN0IHRoZSBzdGFydCBvZiB0aGUKLQkgICBhY3R1YWwgdG9jLCBhbmQgc3VidHJhY3QgMzJLIGZyb20gYWxsIHJlZmVyZW5jZXMsIHRodXMgdXNpbmcKLQkgICB0aGUgZW50aXJlIDY0SyByYW5nZS4gTmF0dXJhbGx5LCB0aGUgcmVsb2MgY29kZSBtdXN0IGFncmVlCi0JICAgb24gdGhpcyBudW1iZXIgb3IgeW91IGdldCBwcmV0dHkgc3R1cGlkIHJlc3VsdHMuCi0gICovCi0gIC5pZGF0YSBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgIF9faWRhdGEyX21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkMik7Ci0JICAgIF9faWRhdGEzX21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkMyk7Ci0JICAgIF9faWRhdGE0X21hZ2ljX18gPSAuOwotCSAgICAqKC5pZGF0YVwkNCk7Ci0JICAgIC4gPSBBTElHTig0KTsKLQkgICAgLnRvYyA9IC4gKyAzMjc2ODsKLQkgICAgKigucHJpdmF0ZS50b2MpOwotCSAgICBfX2lkYXRhNV9tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDUpOwotCSAgICBfX2lkYXRhNl9tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDYpOwotCSAgICBfX2lkYXRhN19tYWdpY19fID0gLjsKLQkgICAgKiguaWRhdGFcJDcpOwotCSAgICA7Ci0JfQotCi0gIC8qIHJlbGRhdGEgLS0gZGF0YSB0aGF0IHJlcXVpcmVzIHJlbG9jYXRpb24KLSAgKi8KLSAgLnJlbGRhdGEgQkxPQ0soX19zZWN0aW9uX2FsaWdubWVudF9fKSA6Ci0JeyAJCQkJCQotCSAgICAqKC5yZWxkYXRhKQotIAkgICAgOwotCX0KLQotCi0gIC8qIFJlc291cmNlcyAqLwotICAucnNyYyBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDoKLQl7IAkJCQkJCi0JICAgICooLnJzcmNcJDAxKQotCSAgICAqKC5yc3JjXCQwMikKLQkgICAgOwotCX0KLQotICAuc3RhYiBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pICAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotCi0gIC5zdGFic3RyIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotCi0gIC8qIFRoZSAucmVsb2Mgc2VjdGlvbiBpcyBjdXJyZW50bHkgZ2VuZXJhdGVkIGJ5IHRoZSBkbGx0b29sIGZyb20gU3RldmUgCi0gICAgIENoYW1iZXJsYWluIGluIGEgc2Vjb25kIHBhc3Mgb2YgbGlua2luZy4gU2VjdGlvbiBhZGRyZXNzIGFuZCBleHRlbnQKLSAgICAgYXJlIHBsYWNlZCBpbiB0aGUgRGF0YURpcmVjdG9yeS4KLSAgKi8KLSAgLnJlbG9jIEJMT0NLKF9fc2VjdGlvbl9hbGlnbm1lbnRfXykgOgotCXsgCQkJCQkKLQkgICAgKigucmVsb2MpCi0JICAgIDsKLQl9Ci0KLSAgLyogV2UgZG9uJ3QgZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggY29kZXZpZXcgZGVidWdnZXIgc3VwcG9ydCBvciB0aGUKLSAgICAgZGlyZWN0aXZlIHNlY3Rpb24gKHlldCkuIEhvcGVmdWxseSwgd2UganVuayB0aGVtIGNvcnJlY3RseS4gCi0gICovCi0gIC9ESVNDQVJELyBCTE9DSyhfX3NlY3Rpb25fYWxpZ25tZW50X18pIDogCi0JewotICAgIAkgICAgKiguZGVidWdcJFMpCi0gICAgCSAgICAqKC5kZWJ1Z1wkVCkKLSAgICAJICAgICooLmRlYnVnXCRGKQotICAgIAkgICAgKiguZHJlY3R2ZSkKLSAgICAJICAgIDsKLSAgIAl9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3Bzb3Muc2MgYi9sZC9zY3JpcHR0ZW1wbC9wc29zLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjhjNmM3Li4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3Bzb3Muc2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoJHtPVVRQVVRfRk9STUFUfSkKLU9VVFBVVF9BUkNIKCR7QVJDSH0pCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotCi1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkc6LTB9ICR7UkVMT0NBVElORyske1RFWFRfU1RBUlRfQUREUn19IDogewotICAgICR7UkVMT0NBVElORysgc3RhcnQgPSBERUZJTkVEKF9TVEFSVCkgPyBfU1RBUlQgOiBERUZJTkVEKF9zdGFydCkgPyBfc3RhcnQgOiAuO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX190ZXh0ID0gLik7fQotICAgICooLnRleHQpOwotICAgICooY29kZSk7Ci0gICAgKihjb25zdCk7Ci0gICAgKihzdHJpbmdzKTsKLSAgICAqKHBTT1MpOwotICAgICoocFJPQkUpOwotICAgICoocE5BKTsKLSAgICAqKHBISUxFKTsKLSAgICAqKHBSRVBDKTsKLSAgICAqKHBSUEMpOwotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCk7fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMik7fQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5kdG9ycyk7fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2V0ZXh0ID0gLik7fQotICAgICR7UkVMT0NBVElORysgUFJPVklERShfZXRleHQgPSAuKTt9Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HOi0wfSA6ICR7UkVMT0NBVElORysgQVQoQUREUigudGV4dCkgKyBTSVpFT0YoLnRleHQpKX0gewotICAgICR7UkVMT0NBVElORysgUFJPVklERShfX2RhdGEgPSAuKTt9Ci0gICAgKiguZGF0YSk7Ci0gICAgKih2YXJzKTsKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19lZGF0YSA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX2VkYXRhID0gLik7fQotICB9Ci0gIC5ic3MgJHtSRUxPQ0FUSU5HOi0wfSA6Ci0gIHsgCQkJCQkKLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19ic3MgPSAuKTt9Ci0gICAgKiguYnNzKTsKLSAgICAqKHplcm92YXJzKTsKLSAgICAqKENPTU1PTik7Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9fZWJzcyA9IC4pO30KLSAgICAke1JFTE9DQVRJTkcrIFBST1ZJREUoX19lbmQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9lbmQgPSAuKTt9Ci0gICAgJHtSRUxPQ0FUSU5HKyBQUk9WSURFKF9GcmVlTWVtU3RhcnQgPSAuKTt9Ci0gIH0KLSAgLnN0YWIgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICAqKC5zdGFiKTsKLSAgfQotICAuc3RhYnN0ciAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgKiguc3RhYnN0cik7Ci0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvcmlzY2l4LnNjIGIvbGQvc2NyaXB0dGVtcGwvcmlzY2l4LnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODAxYTBjLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3Jpc2NpeC5zYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi0ke1JFTE9DQVRJTkcrJHtMSUJfU0VBUkNIX0RJUlN9fQotJHtSRUxPQ0FUSU5HK19fRFlOQU1JQyAgPSAgMDt9Ci0ke1NUQUNLWkVSTyske1JFTE9DQVRJTkcrJHtTVEFDS1pFUk99fX0KLSR7U0hMSUJfUEFUSCske1JFTE9DQVRJTkcrJHtTSExJQl9QQVRIfX19Ci1TRUNUSU9OUwotewotICAudGV4dCAke1JFTE9DQVRJTkcrJHtURVhUX1NUQVJUX0FERFJ9fToKLSAgewotICAgIENSRUFURV9PQkpFQ1RfU1lNQk9MUwotICAgICooLnRleHQpCi0gICAgJHtQQURfVEVYVCske1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O319Ci0gICAgJHtSRUxPQ0FUSU5HK19ldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgICAke1JFTE9DQVRJTkcrX19ldGV4dCA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgfQotICAuZGF0YSAgJHtSRUxPQ0FUSU5HKyR7REFUQV9BTElHTk1FTlR9fSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSA9ICAuO30KLSAgfQotICAuYnNzICR7UkVMT0NBVElORytTSVpFT0YoLmRhdGEpICsgQUREUiguZGF0YSl9IDoKLSAgewotICAgJHtSRUxPQ0FUSU5HKyBfX2Jzc19zdGFydCA9IC59OwotICAgKiguYnNzKQotICAgKihDT01NT04pCi0gICAke1JFTE9DQVRJTkcrX2VuZCA9IEFMSUdOKDQpIH07Ci0gICAke1JFTE9DQVRJTkcrX19lbmQgPSBBTElHTig0KSB9OwotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MgYi9sZC9zY3JpcHR0ZW1wbC9zYTI5MjAwLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmYyNjdlLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3NhMjkyMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotRU5UUlkoc3RhcnQpCi0KLVNFQ1RJT05TIHsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyR7VEVYVF9TVEFSVF9BRERSfX0gOiAKLSAgICB7Ci0JKigudGV4dCk7Ci0JKigudGV4dDEpOwotCSooLnRleHQyKTsKLQkke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLn07Ci0gICAgfQotICAubGl0IEFMSUdOKDQpIDoKLSAgIHsKLQkqKC5saXQpOwotCSR7UkVMT0NBVElORytfZWxpdCA9IC59OwotICAgfQotICAuZGF0YSBBTElHTig0KSA6Ci0gICAgewotCSooLmRhdGEpOwotCSooLmRhdGExKTsKLQkqKC5kYXRhMik7Ci0JJHtSRUxPQ0FUSU5HK19lZGF0YSA9IC59OwotCSR7Q09OU1RSVUNUSU5HK0NPTlNUUlVDVE9SU30KLQkke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLQkke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLQkke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotCSR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotCSR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0JJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0JJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0JJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLQkke0NPTlNUUlVDVElORysgTE9ORygwKX0KLQkke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgIH0KLQotICAuYnNzICBBTElHTig0KSA6Ci0gICAgeyAKLQkqKENPTU1PTikgCQotCSooLmJzcykKLQkke1JFTE9DQVRJTkcrX2VuZCA9IC59OwotICAgIH0gCi19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3NoLnNjIGIvbGQvc2NyaXB0dGVtcGwvc2guc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNmRkMjEuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc2guc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1UT1JTPSIudG9ycyA6Ci0gIHsKLSAgICBfX19jdG9ycyA9IC4gOwotICAgICooLmN0b3JzKQotICAgIF9fX2N0b3JzX2VuZCA9IC4gOwotICAgIF9fX2R0b3JzID0gLiA7Ci0gICAgKiguZHRvcnMpCi0gICAgX19fZHRvcnNfZW5kID0gLiA7Ci0gIH0gPiByYW0iCi0KLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi1PVVRQVVRfQVJDSCgke0FSQ0h9KQotCi1NRU1PUlkKLXsKLSAgcmFtIDogbyA9IDB4MTAwMCwgbCA9IDUxMmsKLX0KLQotU0VDVElPTlMKLXsKLSAgLnRleHQgOgotICB7Ci0gICAgKigudGV4dCkKLSAgICAqKC5zdHJpbmdzKQotICAgICR7UkVMT0NBVElORysgX2V0ZXh0ID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAke0NPTlNUUlVDVElORyske1RPUlN9fQotICAuZGF0YSA6Ci0gIHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX2VkYXRhID0gLiA7IH0KLSAgfSAke1JFTE9DQVRJTkcrID4gcmFtfQotICAuYnNzIDoKLSAgewotICAgICR7UkVMT0NBVElORysgX2Jzc19zdGFydCA9IC4gOyB9Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgX2VuZCA9IC4gOyAgfQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5zdGFjayAke1JFTE9DQVRJTkcrIDB4MzAwMDAgfSAgOgotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfc3RhY2sgPSAuIDsgfQotICAgICooLnN0YWNrKQotICB9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5zdGFiIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICAqKC5zdGFiKQotICB9Ci0gIC5zdGFic3RyIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICAqKC5zdGFic3RyKQotICB9Ci19Ci1FT0YKLQotCi0KLQpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjIGIvbGQvc2NyaXB0dGVtcGwvc3BhcmNjb2ZmLnNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJiN2FkLi4wMDAwMDAwCi0tLSBhL2xkL3NjcmlwdHRlbXBsL3NwYXJjY29mZi5zYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgTGlua2VyIHNjcmlwdCBmb3IgU3BhcmMgQ09GRi4KLSMgQmFzZWQgb24gaTM4NmNvZmYuc2MgYnkgSWFuIFRheWxvciA8aWFuQGN5Z251cy5jb20+LgotdGVzdCAteiAiJEVOVFJZIiAmJiBFTlRSWT1fc3RhcnQKLWNhdCA8PEVPRgotT1VUUFVUX0ZPUk1BVCgiJHtPVVRQVVRfRk9STUFUfSIpCi0ke0xJQl9TRUFSQ0hfRElSU30KLQotRU5UUlkoJHtFTlRSWX0pCi0KLVNFQ1RJT05TCi17Ci0gIC50ZXh0ICR7UkVMT0NBVElORysgU0laRU9GX0hFQURFUlN9IDogewotICAgICooLmluaXQpCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fQ1RPUl9FTkRfXyAtIF9fX0NUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguY3RvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0VORF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0RUT1JfTElTVF9fID0gLjt9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoKF9fX0RUT1JfRU5EX18gLSBfX19EVE9SX0xJU1RfXykgLyA0IC0gMil9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygwKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICooLmZpbmkpCi0gICAgJHtSRUxPQ0FUSU5HKyBldGV4dCAgPSAgLn07Ci0gIH0KLSAgLmRhdGEgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMCArICguICYgMHhmZmMwMGZmZil9IDogewotICAgICooLmRhdGEpCi0gICAgJHtSRUxPQ0FUSU5HKyBlZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyAke1JFTE9DQVRJTkcrIFNJWkVPRiguZGF0YSkgKyBBRERSKC5kYXRhKX0gOgotICB7IAkJCQkJCi0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICR7UkVMT0NBVElORysgZW5kID0gLn07Ci0gIH0KLSAgLnN0YWIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6IAotICB7Ci0gICAgWyAuc3RhYiBdCi0gIH0KLSAgLnN0YWJzdHIgIDAgJHtSRUxPQ0FUSU5HKyhOT0xPQUQpfSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MgYi9sZC9zY3JpcHR0ZW1wbC9zcGFyY2x5bnguc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjFlMWQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvc3BhcmNseW54LnNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotIyBMaW5rZXIgc2NyaXB0IGZvciBTcGFyYyBMeW54T1MuCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9zdGFydAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyBTSVpFT0ZfSEVBREVSU30gOiB7Ci0gICAgKiguaW5pdCkKLSAgICAqKC50ZXh0KQotICAgICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKChfX19DVE9SX0VORF9fIC0gX19fQ1RPUl9MSVNUX18pIC8gNCAtIDIpfQotICAgICR7Q09OU1RSVUNUSU5HKyAqKC5jdG9ycyl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIExPTkcoMCl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrIF9fX0NUT1JfRU5EX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygoX19fRFRPUl9FTkRfXyAtIF9fX0RUT1JfTElTVF9fKSAvIDQgLSAyKX0KLSAgICAke0NPTlNUUlVDVElORysgKiguZHRvcnMpfQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19EVE9SX0VORF9fID0gLjt9Ci0gICAgKiguZmluaSkKLSAgICAke1JFTE9DQVRJTkcrIGV0ZXh0ICA9ICAufTsKLSAgfQotICAuZGF0YSAke1JFTE9DQVRJTkcrIDB4NDAwMDAwICsgKC4gJiAweGZmYzAwZmZmKX0gOiB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrIGVkYXRhICA9ICAufTsKLSAgfQotICAuYnNzICR7UkVMT0NBVElORysgU0laRU9GKC5kYXRhKSArIEFERFIoLmRhdGEpfSA6Ci0gIHsgCQkJCQkKLSAgICAqKC5ic3MpCi0gICAgKihDT01NT04pCi0gICAgJHtSRUxPQ0FUSU5HKyBlbmQgPSAufTsKLSAgfQotICAuc3RhYiAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgMCAke1JFTE9DQVRJTkcrKE5PTE9BRCl9IDoKLSAgewotICAgIFsgLnN0YWJzdHIgXQotICB9Ci19Ci1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3N0MjAwMC5zYyBiL2xkL3NjcmlwdHRlbXBsL3N0MjAwMC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlMTMyYS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC9zdDIwMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCSAgKiguc3RyaW5ncykKLSAgIAkgIF9ldGV4dCA9IC47Ci0JKiguZGF0YSkKLQlfZWRhdGEgPSAuOwotCSooLmJzcykKLQkqKENPTU1PTikKLQkgX2VuZCA9IC47Ci0KLX0KLQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYyBiL2xkL3NjcmlwdHRlbXBsL3RpYzMwYW91dC5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiYWVkMy4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC90aWMzMGFvdXQuc2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotJHtTVEFDS1pFUk8rJHtSRUxPQ0FUSU5HKyR7U1RBQ0taRVJPfX19Ci0ke1JFTE9DQVRJTkcrUFJPVklERSAoX19zdGFjayA9IDApO30KLVNFQ1RJT05TCi17Ci0gICR7UkVMT0NBVElORysuID0gJHtURVhUX1NUQVJUX0FERFJ9O30KLSAgLnRleHQgOgotICB7Ci0gICAgQ1JFQVRFX09CSkVDVF9TWU1CT0xTCi0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICAgJHtSRUxPQ0FUSU5HK19fZXRleHQgPSAuO30KLSAgICAke1BBRF9URVhUKyR7UkVMT0NBVElORysuID0gJHtEQVRBX0FMSUdOTUVOVH07fX0KLSAgfQotICAke1JFTE9DQVRJTkcrLiA9ICR7REFUQV9BTElHTk1FTlR9O30KLSAgLmRhdGEgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAke1JFTE9DQVRJTkcrX2VkYXRhICA9ICAuO30KLSAgICAke1JFTE9DQVRJTkcrX19lZGF0YSAgPSAgLjt9Ci0gIH0KLSAgLmJzcyA6Ci0gIHsKLSAgICR7UkVMT0NBVElORysgX19ic3Nfc3RhcnQgPSAufTsKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgJHtSRUxPQ0FUSU5HK19lbmQgPSBBTElHTig0KSB9OwotICAgJHtSRUxPQ0FUSU5HK19fZW5kID0gQUxJR04oNCkgfTsKLSAgfQotfQotRU9GCmRpZmYgLS1naXQgYS9sZC9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MgYi9sZC9zY3JpcHR0ZW1wbC90aWMzMGNvZmYuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMmQ0ZjcuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdGljMzBjb2ZmLnNjCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLU9VVFBVVF9BUkNIKCIke09VVFBVVF9BUkNIfSIpCi0KLU1FTU9SWQotewotCXJvbSA6IE9SSUdJTiA9IDB4MDAwMDAzMDAsIExFTkdUSCA9IDE2awotCXJhbSA6IE9SSUdJTiA9IDB4MDAwMDAzMDAgKyAxNmssIExFTkdUSCA9IDE2awotCXJhbWJsazAgOiBPUklHSU4gPSAweDAyMDI2MDAwLCBMRU5HVEggPSAweDEwMDAKLQlyYW1ibGsxIDogT1JJR0lOID0gMHgwMjAyNzAwMCwgTEVOR1RIID0gMHgxMDAwCi19Ci0KLVNFQ1RJT05TIAkJCQkKLXsgCQkJCQkKLS52ZWN0b3JzIDB4MDAwMDAwMDAgOgotewotCSoodmVjdG9ycykKLX0KLQotLnRleHQgOiAKLXsKLQkqKC50ZXh0KQotfSA+IHJvbQotCi0uY29uc3QgOgotewotCSooLmNvbnN0KQotCV9fZXRleHQgPSAuIDsKLX0gPiByb20KLQotLm1kYXRhIDogQVQoIEFERFIoLmNvbnN0KSArIFNJWkVPRiguY29uc3QpICkKLXsKLQlfX2RhdGEgPSAuIDsKLQkqKC5kYXRhKTsKLQlfX2VkYXRhID0gLiA7Ci19ID4gcmFtCi0KLS5ic3MgOgotewotCV9fYnNzID0gLiA7Ci0JKiguYnNzKTsKLQkqKENPTU1PTik7Ci0JX19lYnNzID0gLiA7Ci19ID4gcmFtCi0KLS5yYW0wIDoKLXsKLQkqKHJhbTApCi19ID4gcmFtYmxrMAotCi0ucmFtMSA6Ci17Ci0JKihyYW0xKQotfSA+IHJhbWJsazEKLQotfQotCi1FT0YKZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYyBiL2xkL3NjcmlwdHRlbXBsL3RpYzgwY29mZi5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2ZjY1My4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC90aWM4MGNvZmYuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0jIExpbmtlciBzY3JpcHQgZm9yIFRJIFRNUzMyMEM4MCAodGljODApIENPRkYuCi0jCi0jIEJlc2lkZXMgdGhlIHNoZWxsIHZhcmlhYmxlcyBzZXQgYnkgdGhlIGVtdWxwYXJhbXMgc2NyaXB0LCBhbmQgdGhlIExEX0ZMQUcKLSMgdmFyaWFibGUsIHRoZSBnZW5zY3JpcHRzLnNoIHNjcmlwdCB3aWxsIHNldCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBmb3IgZWFjaAotIyB0aW1lIHRoaXMgc2NyaXB0IGlzIHJ1biB0byBnZW5lcmF0ZSBvbmUgb2YgdGhlIGxpbmtlciBzY3JpcHRzIGZvciBsZHNjcmlwdHM6Ci0jCi0jIFJFTE9DQVRJTkc6IFNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgd2hlbiB0aGUgbGlua2VyIGlzIGdvaW5nIHRvIGJlIGRvaW5nCi0jIGEgZmluYWwgcmVsb2NhdGlvbi4KLSMKLSMgQ09OU1RSVUNUSU5HOiBTZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gdGhlIGxpbmtlciBpcyBnb2luZyB0byBiZQotIyBidWlsZGluZyBnbG9iYWwgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3IgdGFibGVzLgotIwotIyBEQVRBX0FMSUdOTUVOVDogU2V0IHRvIGFuIEFMSUdOIGV4cHJlc3Npb24gd2hlbiB0aGUgb3V0cHV0IHNob3VsZCBiZSBwYWdlCi0jIGFsaWduZWQsIG9yIHRvICIuIiB3aGVuIGdlbmVyYXRpbmcgdGhlIC1OIHNjcmlwdC4KLSMKLSMgQ1JFQVRFX1NITElCOiBTZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIHdoZW4gZ2VuZXJhdGluZyBhIHNjcmlwdCBmb3IKLSMgdGhlIC1zaGFyZWQgbGlua2VyIGFyZy4KLQotdGVzdCAteiAiJFRFWFRfU1RBUlRfQUREUiIgJiYgVEVYVF9TVEFSVF9BRERSPSIweDgwMDAwICsgU0laRU9GX0hFQURFUlMiCi10ZXN0IC16ICIkRU5UUlkiICYmIEVOVFJZPV9fc3RhcnQKLQotY2F0IDw8RU9GCi1PVVRQVVRfRk9STUFUKCIke09VVFBVVF9GT1JNQVR9IikKLSR7TElCX1NFQVJDSF9ESVJTfQotCi1FTlRSWSgke0VOVFJZfSkKLQotU0VDVElPTlMKLXsKLSAgLnRleHQgJHtSRUxPQ0FUSU5HKyAkVEVYVF9TVEFSVF9BRERSfSA6IHsKLSAgICAqKC5pbml0KQotICAgICooLmZpbmkpCi0gICAgKigudGV4dCkKLSAgfQotICAuY29uc3QgQUxJR04oNCkgOiB7Ci0gICAgKiguY29uc3QpCi0gIH0KLSAgLmN0b3JzIEFMSUdOKDQpIDogewotICAgICR7Q09OU1RSVUNUSU5HKyAuID0gQUxJR04oNCk7fQotICAgICR7Q09OU1RSVUNUSU5HKyBfX19DVE9SX0xJU1RfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKC0xKX0KLSAgICAqKC5jdG9ycykKLSAgICAke0NPTlNUUlVDVElORysgX19fQ1RPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICB9Ci0gIC5kdG9ycyBBTElHTig0KSA6IHsKLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9MSVNUX18gPSAuO30KLSAgICAke0NPTlNUUlVDVElORysgTE9ORygtMSl9Ci0gICAgJHtDT05TVFJVQ1RJTkcrICooLmR0b3JzKX0KLSAgICAke0NPTlNUUlVDVElORysgX19fRFRPUl9FTkRfXyA9IC47fQotICAgICR7Q09OU1RSVUNUSU5HKyBMT05HKDApfQotICB9Ci0gICR7UkVMT0NBVElORysgZXRleHQgID0gIC47fQotICAuZGF0YSA6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysgX19lZGF0YSAgPSAgLn07Ci0gIH0KLSAgLmJzcyA6IHsgCQkJCQkKLSAgICAke1JFTE9DQVRJTkcrIF9fYnNzX3N0YXJ0ID0gLn07Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICAgICAke1JFTE9DQVRJTkcrIF9lbmQgPSBBTElHTigweDgpfTsKLSAgICAgJHtSRUxPQ0FUSU5HKyBfX2VuZCA9IEFMSUdOKDB4OCl9OwotICB9Ci0gIC5zdGFiICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOiAKLSAgewotICAgIFsgLnN0YWIgXQotICB9Ci0gIC5zdGFic3RyICAwICR7UkVMT0NBVElORysoTk9MT0FEKX0gOgotICB7Ci0gICAgWyAuc3RhYnN0ciBdCi0gIH0KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdjg1MC5zYyBiL2xkL3NjcmlwdHRlbXBsL3Y4NTAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjA5NTQuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdjg1MC5zYworKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi1jYXQgPDwgRU9GCi1PVVRQVVRfRk9STUFUKCJlbGYzMi12ODUwIiwgImVsZjMyLXY4NTAiLAotCSAgICAgICJlbGYzMi12ODUwIikKLU9VVFBVVF9BUkNIKHY4NTApCi1FTlRSWShfc3RhcnQpCi1TRUFSQ0hfRElSKC4pOwotLyovY3JpdHRlcnMvc2x1Zy9ncm9zc21hbi9pbnN0YWxsL3N1bjQvdjg1MC1lbGYvbGliKi8KLVNFQ1RJT05TCi17Ci0gIC8qIFRoaXMgc2F2ZXMgYSBsaXR0bGUgc3BhY2UgaW4gdGhlIEVMRiBmaWxlLCBzaW5jZSB0aGUgemRhIHN0YXJ0cwotICAgICBhdCBhIGhpZ2hlciBsb2NhdGlvbiB0aGF0IHRoZSBFTEYgaGVhZGVycyB0YWtlIHVwLiAgKi8KLQotICAuemRhdGEgJHtaREFUQV9TVEFSVF9BRERSfSA6IHsKLQkqKC56ZGF0YSkKLQkqKC56YnNzKQotCSoocmVzemRhdGEpCi0JKiguemNvbW1vbikKLSAgfQotCi0gIC8qIFRoaXMgaXMgdGhlIHJlYWQgb25seSBwYXJ0IG9mIHRoZSB6ZXJvIGRhdGEgYXJlYS4KLSAgICAgSGF2aW5nIGl0IGFzIGEgc2VwZXJhdGUgc2VjdGlvbiBwcmV2ZW50cyBpdHMKLSAgICAgYXR0cmlidXRlcyBmcm9tIGJlaW5nIGluaGVyaXRlZCBieSB0aGUgemRhdGEKLSAgICAgc2VjdGlvbi4gIFNwZWNpZmljYWxseSBpdCBwcmV2ZW50cyB0aGUgemRhdGEKLSAgICAgc2VjdGlvbiBmcm9tIGJlaW5nIG1hcmtlZCBSRUFET05MWS4gICovCi0KLSAgLnJvemRhdGEgJHtST1pEQVRBX1NUQVJUX0FERFJ9IDogewotCSooLnJvemRhdGEpCi0JKihyb216ZGF0YSkKLQkqKHJvbXpic3MpCi0gIH0KLQotICAvKiBSZWFkLW9ubHkgc2VjdGlvbnMsIG1lcmdlZCBpbnRvIHRleHQgc2VnbWVudDogKi8KLSAgLiA9ICR7VEVYVF9TVEFSVF9BRERSfTsKLSAgLmludGVycAk6IHsgKiguaW50ZXJwKSB9Ci0gIC5oYXNoCQk6IHsgKiguaGFzaCkgfQotICAuZHluc3ltCTogeyAqKC5keW5zeW0pIH0KLSAgLmR5bnN0cgk6IHsgKiguZHluc3RyKSB9Ci0gIC5yZWwudGV4dAk6IHsgKigucmVsLnRleHQpIH0KLSAgLnJlbGEudGV4dAk6IHsgKigucmVsYS50ZXh0KSB9Ci0gIC5yZWwuZGF0YQk6IHsgKigucmVsLmRhdGEpIH0KLSAgLnJlbGEuZGF0YQk6IHsgKigucmVsYS5kYXRhKSB9Ci0gIC5yZWwucm9kYXRhCTogeyAqKC5yZWwucm9kYXRhKSB9Ci0gIC5yZWxhLnJvZGF0YQk6IHsgKigucmVsYS5yb2RhdGEpIH0KLSAgLnJlbC5nb3QJOiB7ICooLnJlbC5nb3QpIH0KLSAgLnJlbGEuZ290CTogeyAqKC5yZWxhLmdvdCkgfQotICAucmVsLmN0b3JzCTogeyAqKC5yZWwuY3RvcnMpIH0KLSAgLnJlbGEuY3RvcnMJOiB7ICooLnJlbGEuY3RvcnMpIH0KLSAgLnJlbC5kdG9ycwk6IHsgKigucmVsLmR0b3JzKSB9Ci0gIC5yZWxhLmR0b3JzCTogeyAqKC5yZWxhLmR0b3JzKSB9Ci0gIC5yZWwuaW5pdAk6IHsgKigucmVsLmluaXQpIH0KLSAgLnJlbGEuaW5pdAk6IHsgKigucmVsYS5pbml0KSB9Ci0gIC5yZWwuZmluaQk6IHsgKigucmVsLmZpbmkpIH0KLSAgLnJlbGEuZmluaQk6IHsgKigucmVsYS5maW5pKSB9Ci0gIC5yZWwuYnNzCTogeyAqKC5yZWwuYnNzKSB9Ci0gIC5yZWxhLmJzcwk6IHsgKigucmVsYS5ic3MpIH0KLSAgLnJlbC5wbHQJOiB7ICooLnJlbC5wbHQpIH0KLSAgLnJlbGEucGx0CTogeyAqKC5yZWxhLnBsdCkgfQotICAuaW5pdAkJOiB7IEtFRVAgKCooLmluaXQpKSB9ID0wCi0gIC5wbHQJCTogeyAqKC5wbHQpIH0KLQotICAudGV4dAkJOiB7Ci0gICAgKigudGV4dCkKLSAgICAke1JFTE9DQVRJTkcrKigudGV4dC4qKX0KLSAgICAvKiAuZ251Lndhcm5pbmcgc2VjdGlvbnMgYXJlIGhhbmRsZWQgc3BlY2lhbGx5IGJ5IGVsZjMyLmVtLiAgKi8KLSAgICAqKC5nbnUud2FybmluZykKLSAgICAqKC5nbnUubGlua29uY2UudCopCi0gIH0gPTAKLQotICAke1JFTE9DQVRJTkcrX2V0ZXh0ID0gLjt9Ci0gICR7UkVMT0NBVElORytQUk9WSURFIChldGV4dCA9IC4pO30KLQotICAgLyogVGhpcyBpcyBzcGVjaWFsIGNvZGUgYXJlYSBhdCB0aGUgZW5kIG9mIHRoZSBub3JtYWwgdGV4dCBzZWN0aW9uLgotICAgICAgSXQgY29udGFpbnMgYSBzbWFsbCBsb29rdXAgdGFibGUgYXQgdGhlIHN0YXJ0IGZvbGxvd2VkIGJ5IHRoZQotICAgICAgY29kZSBwb2ludGVkIHRvIGJ5IGVudHJpZXMgaW4gdGhlIGxvb2t1cCB0YWJsZS4gICovCi0KLSAgLmNhbGxfdGFibGVfZGF0YSAke0NBTExfVEFCTEVfU1RBUlRfQUREUn0gOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK1BST1ZJREUoX19jdGJwID0gLik7fQotICAgICooLmNhbGxfdGFibGVfZGF0YSkKLSAgfSA9IDB4ZmYgICAvKiBmaWxsIGdhcHMgd2l0aCAweGZmICovCi0gIC5jYWxsX3RhYmxlX3RleHQgOiB7Ci0gICAgKiguY2FsbF90YWJsZV90ZXh0KQotICB9Ci0KLSAgLmZpbmkJCTogeyBLRUVQICgqKC5maW5pKSkgICAgfSA9MAotICAucm9kYXRhCTogeyAqKC5yb2RhdGEpICR7UkVMT0NBVElORysqKC5yb2RhdGEuKil9ICooLmdudS5saW5rb25jZS5yKikgfQotICAucm9kYXRhMQk6IHsgKigucm9kYXRhMSkgfQotCi0gIC5kYXRhCQk6IHsKLSAgICAqKC5kYXRhKQotICAgICR7UkVMT0NBVElORysqKC5kYXRhLiopfQotICAgICooLmdudS5saW5rb25jZS5kKikKLSAgICBDT05TVFJVQ1RPUlMKLSAgfQotICAuZGF0YTEJOiB7ICooLmRhdGExKSB9Ci0gIC5jdG9ycwk6IHsKLSAgICAke1JFTE9DQVRJTkcrX19fY3RvcnMgPSAuO30KLSAgICBLRUVQICgqKEVYQ0xVREVfRklMRSAoKmNydGVuZC5vKSAuY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCpjcnRlbmQoLmN0b3JzKSkKLSAgICAke1JFTE9DQVRJTkcrX19fY3RvcnNfZW5kID0gLjt9Ci0gIH0KLQotICAuZHRvcnMJOiB7Ci0gICAgJHtSRUxPQ0FUSU5HK19fX2R0b3JzID0gLjt9Ci0gICAgS0VFUCAoKihFWENMVURFX0ZJTEUgKCpjcnRlbmQubykgLmR0b3JzKSkKLSAgICBLRUVQICgqKFNPUlQoLmR0b3JzLiopKSkKLSAgICBLRUVQICgqY3J0ZW5kLm8oLmR0b3JzKSkKLSAgICAke1JFTE9DQVRJTkcrX19fZHRvcnNfZW5kID0gLjt9Ci0gIH0KLQotICAuZ290CQk6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gIC5keW5hbWljCTogeyAqKC5keW5hbWljKSB9Ci0KLSAgLnRkYXRhICR7VERBVEFfU1RBUlRfQUREUn0gOiB7Ci0JJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZXAgPSAuKTt9Ci0JKigudGJ5dGUpCi0JKigudGNvbW1vbl9ieXRlKQotCSooLnRkYXRhKQotCSooLnRic3MpCi0JKigudGNvbW1vbikKLSAgfQotCi0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICR7U0RBVEFfU1RBUlRfQUREUn0gOiB7Ci0JJHtSRUxPQ0FUSU5HK1BST1ZJREUgKF9fZ3AgPSAuICsgMHg4MDAwKTt9Ci0JKiguc2RhdGEpCi0gICB9Ci0KLSAgLyogU2VlIGNvbW1lbnQgYWJvdXQgLnJvemRhdGEuICovCi0gIC5yb3NkYXRhICR7Uk9TREFUQV9TVEFSVF9BRERSfSA6IHsKLQkqKC5yb3NkYXRhKQotICB9Ci0KLSAgLyogV2UgcGxhY2UgdGhlIC5zYnNzIGRhdGEgc2VjdGlvbiBBRlRFUiB0aGUgLnJvc2RhdGEgc2VjdGlvbiwgc28gdGhhdAotICAgICBpdCBjYW4gZGlyZWN0bHkgcHJlY2VlZCB0aGUgLmJzcyBzZWN0aW9uLiAgVGhpcyBhbGxvd3MgcnVudGltZSBzdGFydHVwCi0gICAgIGNvZGUgdG8gaW5pdGlhbGlzZSBhbGwgdGhlIHplcm8tZGF0YSBzZWN0aW9ucyBieSBzaW1wbHkgdGFraW5nIHRoZQotICAgICB2YWx1ZSBvZiAnX2VkYXRhJyBhbmQgemVyb2luZyB1bnRpbCBpdCByZWFjaGVzICdfZW5kJyAgKi8KLSAgLnNic3MgOiB7Ci0JJHtSRUxPQ0FUSU5HK19fc2Jzc19zdGFydCA9IC47fQotCSooLnNic3MpCi0JKiguc2NvbW1vbikKLSAgfQotCi0gICR7UkVMT0NBVElORytfZWRhdGEgID0gREVGSU5FRCAoX19zYnNzX3N0YXJ0KSA/IF9fc2Jzc19zdGFydCA6IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVkYXRhID0gX2VkYXRhKTt9Ci0KLSAgLmJzcyAgICAgICA6Ci0gIHsKLQkke1JFTE9DQVRJTkcrX19ic3Nfc3RhcnQgPSBERUZJTkVEIChfX3Nic3Nfc3RhcnQpID8gX19zYnNzX3N0YXJ0IDogLiA7fQotCSR7UkVMT0NBVElORytfX3JlYWxfYnNzX3N0YXJ0ID0gLiA7fQotCSooLmR5bmJzcykKLQkqKC5ic3MpCi0JKihDT01NT04pCi0gIH0KLQotICAke1JFTE9DQVRJTkcrX2VuZCA9IC4gO30KLSAgJHtSRUxPQ0FUSU5HK1BST1ZJREUgKGVuZCA9IC4pO30KLQotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAwCQk6IHsgKiguc3RhYikgfQotICAuc3RhYnN0ciAwCQk6IHsgKiguc3RhYnN0cikgfQotICAuc3RhYi5leGNsIDAJCTogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0ciAwCTogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXggMAkJOiB7ICooLnN0YWIuaW5kZXgpIH0KLSAgLnN0YWIuaW5kZXhzdHIgMAk6IHsgKiguc3RhYi5pbmRleHN0cikgfQotICAuY29tbWVudCAwCQk6IHsgKiguY29tbWVudCkgfQotCi0gIC8qIERXQVJGIGRlYnVnIHNlY3Rpb25zLgotICAgICBTeW1ib2xzIGluIHRoZSBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbnMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKLSAgICAgb2YgdGhlIHNlY3Rpb24gc28gd2UgYmVnaW4gdGhlbSBhdCAwLiAgKi8KLQotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwCTogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMAk6IHsgKigubGluZSkgfQotCi0gIC8qIEdOVSBEV0FSRiAxIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3NyY2luZm8gIDAJOiB7ICooLmRlYnVnX3NyY2luZm8pIH0KLSAgLmRlYnVnX3NmbmFtZXMgIDAJOiB7ICooLmRlYnVnX3NmbmFtZXMpIH0KLQotICAvKiBEV0FSRiAxLjEgYW5kIERXQVJGIDIgKi8KLSAgLmRlYnVnX2FyYW5nZXMgIDAJOiB7ICooLmRlYnVnX2FyYW5nZXMpIH0KLSAgLmRlYnVnX3B1Ym5hbWVzIDAJOiB7ICooLmRlYnVnX3B1Ym5hbWVzKSB9Ci0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMAk6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMAk6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwCTogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwCTogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMAk6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwCTogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAJOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLQotICAvKiBTR0kvTUlQUyBEV0FSRiAyIGV4dGVuc2lvbnMgKi8KLSAgLmRlYnVnX3dlYWtuYW1lcyAwCTogeyAqKC5kZWJ1Z193ZWFrbmFtZXMpIH0KLSAgLmRlYnVnX2Z1bmNuYW1lcyAwCTogeyAqKC5kZWJ1Z19mdW5jbmFtZXMpIH0KLSAgLmRlYnVnX3R5cGVuYW1lcyAwCTogeyAqKC5kZWJ1Z190eXBlbmFtZXMpIH0KLSAgLmRlYnVnX3Zhcm5hbWVzICAwCTogeyAqKC5kZWJ1Z192YXJuYW1lcykgfQotCi0gIC8qIFVzZXIgc3RhY2sgKi8KLSAgLnN0YWNrIDB4MjAwMDAwCTogewotCSR7UkVMT0NBVElORytfX3N0YWNrID0gLjt9Ci0JKiguc3RhY2spCi0gIH0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi8KLX0KLUVPRgpkaWZmIC0tZ2l0IGEvbGQvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYyBiL2xkL3NjcmlwdHRlbXBsL3ZhbmlsbGEuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTg0ODAuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvdmFuaWxsYS5zYworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSMgTm90aGluZyB0byBkby4KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3c2NS5zYyBiL2xkL3NjcmlwdHRlbXBsL3c2NS5zYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwNDQ5NS4uMDAwMDAwMAotLS0gYS9sZC9zY3JpcHR0ZW1wbC93NjUuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goJHtBUkNIfSkKLQotTUVNT1JZIHsKLQlyYW0gICA6IG8gPSAweDEwMDAsIGwgPSA1MTJrCi0JfQotCi1TRUNUSU9OUyAJCQkJCi17IAkJCQkJCi0udGV4dCA6Ci0JeyAJCQkJCQotCSAgKigudGV4dCkgCQkJCQotCSAgKiguc3RyaW5ncykKLSAgIAkgJHtSRUxPQ0FUSU5HKyBfZXRleHQgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLQotCi0udG9ycyAgIDogewotCV9fX2N0b3JzID0gLiA7Ci0JKiguY3RvcnMpCi0JX19fY3RvcnNfZW5kID0gLiA7Ci0JX19fZHRvcnMgPSAuIDsKLQkqKC5kdG9ycykKLQlfX19kdG9yc19lbmQgPSAuIDsKLX0gICR7UkVMT0NBVElORysgPiByYW19Ci0KLS5kYXRhICA6Ci0JewotCSooLmRhdGEpCi0JJHtSRUxPQ0FUSU5HKyBfZWRhdGEgPSAuIDsgfQotCX0gJHtSRUxPQ0FUSU5HKyA+IHJhbX0KLS5ic3MgIDoKLQl7Ci0JJHtSRUxPQ0FUSU5HKyBfYnNzX3N0YXJ0ID0gLiA7IH0KLQkqKC5ic3MpCi0JKihDT01NT04pCi0JJHtSRUxPQ0FUSU5HKyBfZW5kID0gLiA7ICB9Ci0JfSAke1JFTE9DQVRJTkcrID5yYW19Ci0uc3RhY2sgJHtSRUxPQ0FUSU5HKyAweDMwMDAwIH0gIDogCi0JewotCSR7UkVMT0NBVElORysgX3N0YWNrID0gLiA7IH0KLQkqKC5zdGFjaykKLQl9ICR7UkVMT0NBVElORysgPiByYW19Ci0gIC5zdGFiICAuIChOT0xPQUQpIDogCi0gIHsKLSAgICBbIC5zdGFiIF0KLSAgfQotICAuc3RhYnN0ciAgLiAoTk9MT0FEKSA6Ci0gIHsKLSAgICBbIC5zdGFic3RyIF0KLSAgfQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3NjcmlwdHRlbXBsL3o4MDAwLnNjIGIvbGQvc2NyaXB0dGVtcGwvejgwMDAuc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODc5MzAuLjAwMDAwMDAKLS0tIGEvbGQvc2NyaXB0dGVtcGwvejgwMDAuc2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1jYXQgPDxFT0YKLU9VVFBVVF9GT1JNQVQoIiR7T1VUUFVUX0ZPUk1BVH0iKQotT1VUUFVUX0FSQ0goIiR7T1VUUFVUX0FSQ0h9IikKLUVOVFJZKF9zdGFydCkKLQotU0VDVElPTlMgCQkJCQoteyAJCQkJCQotLnRleHQgJHtCSUcrICR7UkVMT0NBVElORysgMHgwMDAwMDAwfX0gOiB7IAkJCQkJCi0JICAqKC50ZXh0KSAJCQkJCi0JICAqKC5zdHJpbmdzKQotCSAgKigucmRhdGEpCi0JfQotCi0uY3RvcnMgJHtCSUcrICR7UkVMT0NBVElORysgMHgyMDAwMDAwfX0gIDogCi0JewotCSAgJHtSRUxPQ0FUSU5HKyBfX19jdG9ycyA9IC4gOyAgfQotCSAgKiguY3RvcnMpOwotCSAgJHtSRUxPQ0FUSU5HKyBfX19jdG9yc19lbmQgPSAuIDsgfQotCSAgX19fZHRvcnMgPSAuIDsKLQkgICooLmR0b3JzKTsKLQkgICR7UkVMT0NBVElORysgX19fZHRvcnNfZW5kID0gLiA7IH0KLQl9IAotCi0uZGF0YSAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDMwMDAwMDB9fSA6IHsKLQkqKC5kYXRhKQotCX0KLQotLmJzcyAke0JJRysgJHtSRUxPQ0FUSU5HKyAweDQwMDAwMDB9fSA6IAotICB7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX3N0YXJ0X2JzcyA9IC4gOyB9Ci0gICAgKiguYnNzKTsKLSAgICAqKENPTU1PTik7Ci0gICAgJHtSRUxPQ0FUSU5HKyBfX2VuZF9ic3MgPSAuIDsgfQotICB9Ci0KLS5oZWFwICR7QklHKyAke1JFTE9DQVRJTkcrIDB4NTAwMDAwMH19IDogewotCSR7UkVMT0NBVElORysgX19zdGFydF9oZWFwID0gLiA7IH0KLQkke1JFTE9DQVRJTkcrIC4gPSAuICsgMjBrICA7IH0KLQkke1JFTE9DQVRJTkcrIF9fZW5kX2hlYXAgPSAuIDsgfQotCX0gCi0KLS5zdGFjayAke1JFTE9DQVRJTkcrIDB4ZjAwMCB9ICA6IAotCXsKLQkke1JFTE9DQVRJTkcrIF9zdGFjayA9IC4gOyB9Ci0JKiguc3RhY2spCi0JJHtSRUxPQ0FUSU5HKyBfX3N0YWNrX3RvcCA9IC4gOyB9Ci0JfSAKLQotfQotRU9GCi0KLQotCi0KZGlmZiAtLWdpdCBhL2xkL3N0YW1wLWguaW4gYi9sZC9zdGFtcC1oLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg4ZjcwLi4wMDAwMDAwCi0tLSBhL2xkL3N0YW1wLWguaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10aW1lc3RhbXAKZGlmZiAtLWdpdCBhL2xkL3N5c2RlcC5oIGIvbGQvc3lzZGVwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjY2MxMjIuLjAwMDAwMDAKLS0tIGEvbGQvc3lzZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKiBzeXNkZXAuaCAtLSBoYW5kbGUgaG9zdCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBHTlUgbGlua2VyCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTEQsIHRoZSBHbnUgTGlua2VyLgotCi0gICBHTEQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAgIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICBHTEQgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHTEQ7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZuZGVmIExEX1NZU0RFUF9ICi0jZGVmaW5lIExEX1NZU0RFUF9ICi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2Vsc2UKLWV4dGVybiBjaGFyICpzdHJjaHIgKCk7Ci1leHRlcm4gY2hhciAqc3RycmNociAoKTsKLSNlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWZkZWYgVVNFX0JJTkFSWV9GT1BFTgotI2luY2x1ZGUgImZvcGVuLWJpbi5oIgotI2Vsc2UKLSNpbmNsdWRlICJmb3Blbi1zYW1lLmgiCi0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fU1RSU1RSCi1leHRlcm4gY2hhciAqc3Ryc3RyICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0ZSRUUKLWV4dGVybiB2b2lkIGZyZWUgKCk7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfREVDTEFSQVRJT05fR0VURU5WCi1leHRlcm4gY2hhciAqZ2V0ZW52ICgpOwotI2VuZGlmCi0KLSNpZmRlZiBORUVEX0RFQ0xBUkFUSU9OX0VOVklST04KLWV4dGVybiBjaGFyICoqZW52aXJvbjsKLSNlbmRpZgotCi0jZW5kaWYgLyogISBkZWZpbmVkIChMRF9TWVNERVBfSCkgKi8KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cgYi9sZC90ZXN0c3VpdGUvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTgxOTY1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3NjIgKzAsMCBAQAotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLWNoZWNrcy9hc20uczogVXNlIGEgc3ltYm9sIG5hbWUgZm9yIC5sY29tbS4KLQkqIGxkLWNoZWNrcy9jaGVja3MuZXhwOiBVc2UgZGlmZmVyZW50IG5hbWVzIGZvciB0aGUgdHdvIHRlc3RzLgotCURvbid0IGFkZCBleHRyYSB0ZXh0IHdoZW4gaW52b2tpbmcgZmFpbC4KLQotMTk5OS0wNi0xMiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvcGhkcnMuZXhwOiBDaGFuZ2UgdGFyZ2V0IGNoZWNrIGZyb20gIiotKi1saW51eGFvdXQqIgotCXRvICIqLSotbGludXgqYW91dCoiLgotCSogbGQtc2NyaXB0cy93ZWFrLmV4cDogTGlrZXdpc2UuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTGlrZXdpc2UuICBTaW1wbGlmeSBjb25kaXRpb24gYSBiaXQuCi0KLVdlZCBKdW4gIDkgMTI6MDI6MzMgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2M6IEF2b2lkIGBpbXBsaWNpdCBpbnQnIHdhcm5pbmcuCi0JKiBsZC1zaGFyZWQvc2gxLmM6IEZpeCB0eXBvLgotCi0xOTk5LTA2LTA0ICBILkouIEx1ICA8aGpsQGdudS5vcmc+Ci0KLQkqIGxpYi9sZC1saWIuZXhwIChkZWZhdWx0X2xkX25tKTogQ2xlYXIgbm1fb3V0cHV0IGZpcnN0IGlmCi0JbmVjZXNzYXJ5LgotCi0xOTk5LTA1LTE3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogQWRkIHhmYWlsIGZvciBtY29yZS1lbGYuCi0KLTE5OTktMDUtMTEgIERKIERlbG9yaWUgIDxkakBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEbyBub3QgcnVuIHRlc3RzIGZvciBQRSBiYXNlZCBwb3J0cy4KLQotMTk5OS0wMy0wNSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6IERvIG5vdCBydW4gdGVzdHMgZm9yIENPRkYgb3IgUEUKLQliYXNlZCBwb3J0cy4KLQotMTk5OS0wMi0xNyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlcyBmb3IgU3Ryb25nQVJNCi0JdGFyZ2V0cy4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIGV4cGVjdGVkIGZhaWx1cmVzIGZvciBTdHJvbmdBUk0gdGFyZ2V0cy4KLQotCSogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6IEFkZCBleHBlY3RlZCBmYWlsdXJlIGZvciBBUk0tQ09GRgotCXRhcmdldHMuIAotCi0xOTk5LTAyLTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1jaGVja3MvYXNtLnM6IFVzZSAubG9uZyBpbnN0ZWFkIG9mIC53b3JkLgotCVJlcGxhY2UgY3VzdG9tIHNlY3Rpb24gbmFtZXMgd2l0aCAudGV4dCwgLmRhdGEgYW5kIC5ic3MuCi0JKiBsZC1jaGVja3Mvc2NyaXB0OiBSZXBsYWNlIGN1c3RvbSBzZWN0aW9uIG5hbWVzIHdpdGggLnRleHQsIC5kYXRhCi0JYW5kIC5ic3MuIAotCSogbGQtY2hlY2tzL2NoZWNrcy5leHA6IFJlcGxhY2UgY3VzdG9tIHNlY3Rpb24gbmFtZXMgd2l0aCAudGV4dCwKLQkuZGF0YSBhbmQgLmJzcy4gCi0KLTE5OTktMDItMTEgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLWNoZWNrczogTmV3IGRpcmVjdG9yeTogIFRlc3RzIGZvciB0aGUgbGlua2VyJ3MKLQktLWNoZWNrLXNlY3Rpb25zIG9wdGlvbi4KLQkqIGxkLWNoZWNrcy9jaGVja3MuZXhwOiBOZXcgZmlsZS4KLQkqIGxkLWNoZWNrcy9zY3JpcHQ6IEJvZ3VzIGxpbmtlciBzY3JpcHQuCi0JKiBsZC1jaGVja3MvYXNtLnM6IFNpbXBsZSB0ZXN0IGFzc2VtYmxlciBmaWxlLgotCi1UdWUgRmViICAyIDE5OjE1OjAyIDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHA6ICBEaXNhYmxlIHRlc3QgZm9yIHVuc3VwcG9ydGVkCi0gICAgICAgIHRhcmdldHMuICBDaGFuZ2UgdGVzdHMgdG8gY2hlY2sgZm9yIGFic2VuY2Ugb2Ygc3ltYm9scyBpbnN0ZWFkCi0gICAgICAgIG9mIGFkZHJlc3MgemVyby4KLQotTW9uIEphbiAxOCAwMzo0NDo1MiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoZ2V0X2xpbmtfZmlsZXMpOiBRdW90ZSB0YXJnZXRfdHJpcGxldCBhbmQgQ0MKLQl3aGVuIGludm9raW5nIHNoZWxsLgotCShnZXRfdGFyZ2V0X2VtdWwpOiBMaWtld2lzZS4KLQotMTk5OS0wMS0wMyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cCAoZ2V0X2xpbmtfZmlsZXMsIGdldF90YXJnZXRfZW11bCk6IE5ldyBwcm9jczsKLQlydW4gc2hlbGwgY29tbWFuZHMgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGNvbmZpZ3VyZS5ob3N0IGFuZAotCWNvbmZpZ3VyZS50Z3QgaW4gdGhlIHNvdXJjZSB0cmVlLgotCSh0b3AgbGV2ZWwpOiBVc2UgdGhlbSB0byBnZXQgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHJ1biB0ZXN0cywgaWYKLQlub3Qgb3RoZXJ3aXNlIHByb3ZpZGVkLgotCi0JKiBsZC1zaGFyZWQvZWxmLW9mZnNldC5sZDogTmV3IGZpbGUuICBCdWlsZHMgYSBzaGFyZWQgbGlicmFyeSwgYnV0Ci0JZ2l2ZXMgbm9uLXplcm8gYWRkcmVzc2VzIGZvciBtZW1vcnkgcmVnaW9uLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0aGUgbm9uLVBJQyBub24tQUlYIHRlc3QgYWdhaW4gdXNpbmcKLQl0aGUgbmV3IGxpbmtlciBzY3JpcHQuCi0KLVR1ZSBEZWMgIDggMjI6NTY6MDUgMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRGVsZXRlIHhmYWlscyBmb3IgUFBDIExpbnV4IHRhcmdldHMsCi0JbmV3ZXIgZ2xpYmMgbGV0cyBsaW5rIHN1Y2NlZWQuCi0KLVN1biBEZWMgIDYgMTI6NTk6MzcgMTk5OCAgSC5KLiBMdSAgPGhqbEBnbnUub3JnPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxLmM6IEFkZCBtaXNzaW5nIHJldHVybiB0eXBlcyBhbmQgdmFsdWVzLgotCSogbGQtZWxmdmVycy92ZXJzMi5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczMuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM0LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzNS5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczYuYzogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM3LmM6IExpa2V3aXNlLgotCSogbGQtZWxmdmVycy92ZXJzOS5jOiBMaWtld2lzZS4KLQkqIGxkLWVsZnZlcnMvdmVyczE1LmM6IExpa2V3aXNlLgotCi1GcmkgT2N0IDIzIDE2OjI4OjI5IDE5OTggQ2F0aGVyaW5lIE1vb3JlICA8Y2xtQGN5Z251cy5jb20+Ci0KLSAgICAgICAqIGxkLXNlbGVjdGl2ZTogIE5ldyBkaXJlY3Rvcnkgd2l0aCBuZXcgZmlsZXMgdG8gdGVzdAotICAgICAgIHNlbGVjdGl2ZSBsaW5raW5nLgotCi0gICAgICAgKiBsaWIvbGQtbGliLmV4cCAobGRfbm0pOiAgU3RyaXAgbGVhZGluZyB1bmRlcnNjb3JlIGZyb20gJG5hbWUuCi0gICAgIAotU3VuIE9jdCAgNCAyMjoxNzowNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVyczE2LmRzeW06IFdvcmsgY29ycmVjdGx5IG9uIGEgc3lzdGVtIHdpdGhvdXQKLQl2ZXJzaW9uZWQgc3lzdGVtIGxpYnJhcmllcy4KLQotTW9uIFNlcCAyOCAyMTozMToxMiAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBSdW4gdGVzdHMgb24gYWxwaGEtbGludXguCi0JKiBsZC1lbGZ2ZXJzLyouc3ltLCBsZC1lbGZ2ZXJzLyouZHN5bTogQWRqdXN0IHBhdHRlcnMgdG8gbWF0Y2gKLQlBbHBoYSdzIHVzZSBvZiBzdF9vdGhlci4KLQotMTk5OC0wOS0yNyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHAgKHZlcnMxNiwgdmVyczE2YSk6IE5ldyB0ZXN0cy4KLQkqIGxkLWVsZnZlcnMve3ZlcnMxNi4qLCB2ZXJzMTZhLip9OiBOZXcgZmlsZXMuCi0KLVRodSBTZXAgMTcgMTc6MTg6MTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IE1ha2UgdW5kZWZpbmVkIGxpbmUgdGVzdCBiZSBhbiB4ZmFpbAotCWZvciBhcm0vdGh1bmIgZWxmIHRvb2xjaGFpbnMuCi0KLVdlZCBTZXAgIDkgMTQ6MTA6MTUgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IGNoYW5nZSB0ZXN0IGZvciBlbGYvZHdhcmYyIHRhcmdldHMuCi0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFybS1lbGYgbm93IHBhc3NlcyB0aGlzIHRlc3QuCi0KLVdlZCBBdWcgMTkgMTE6NTk6MTkgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIGFybS90aHVtYi1lbGYgZXhwZWN0ZWQgZmFpbHVyZXMuCi0JCi1UaHUgQXVnIDEzIDEyOjQxOjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IERvbid0IHJ1biB0aGUgLS1zdGF0aWMgYm9vdHN0cmFwCi0JdGVzdCBpZiB3ZSBkb24ndCBoYXZlIGEgc3RhdGljIGxpYmJmZC5hLgotCi1XZWQgQXVnIDEyIDE1OjE5OjM1IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCUJhc2VkIG9uIHBhdGNoIGZyb20gSC5KLiBMdSA8aGpsQGdudS5vcmc+OgotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlscyBmb3IgQWxwaGEgRUxGIHRhcmdldHMuCi0KLU1vbiBBdWcgMTAgMTU6NDI6MjAgMTk5OCAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy93ZWFrLnQgKC50ZXh0LCAuZGF0YSk6IEZvY3VzIGRhdGEgdG8gYmUgdXNlZC4KLQkoL0RJU0NBUkQvKTogQWxsIHRoZSByZXN0LgotCSogbGQtc2NyaXB0cy93ZWFrMS5zLCBsZC1zY3JpcHRzL3dlYWsyLnM6IFB1dCBzdHVmZiBpbiAuZGF0YS4KLQotRnJpIEp1bCAyNCAxODozNzoxNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9kZWZhdWx0LmV4cDogQ3JlYXRlIHRtcGRpci9nYXMgc3ViZGlyZWN0b3J5LCBhZGQgYQotCXN5bWxpbmsgdG8gYXMtbmV3LCBhbmQgc2V0IGdjY19nYXNfZmxhZyB2YXJpYWJsZS4KLQkqIGxpYi9sZC1saWIuZXhwIChkZWZhdWx0X2xkX2NvbXBpbGUpOiBJZiB0aGUgY29tcGlsZXIgYXBwZWFycyB0bwotCWJlIGdjYywgdXNlIGdjY19nYXNfZmxhZyB3aGVuIGNvbXBpbGluZy4KLQotVGh1IEp1bCAyMyAxMjoyMzoyOSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHA6IEp1c3QgY2hlY2sgZm9yIGk/ODYgcmF0aGVyIHRoYW4gY2hlY2tpbmcKLQlmb3IgaTM4NiwgaTQ4NiwgYW5kIGk1ODYuCi0JKG9iamR1bXBfdmVyc2lvbnN0dWZmKTogSWYgd2UgY2FuJ3QgZmluZCB0aGUgbGluZSwgZHVtcCB0aGUgZmlsZS4KLQotRnJpIEp1bCAgMyAwMDoyNzo0MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvcGhkcnMuZXhwOiBSdW4gdGVzdCBvbiAqLSotZWFiaSouCi0JKiBsZC1zY3JpcHRzL3dlYWsuZXhwOiBMaWtld2lzZS4KLQotV2VkIEp1bCAgMSAxMDo1MTo0NiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgeGZhaWwgZm9yIHY4NTAuCi0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBhcm0gYW5kIHRodW1iIFBFIHRvb2xjaGFpbnMgbm93IHBhc3MKLQl0aGVzZSB0ZXN0cy4KLQotRnJpIEp1biAxOSAxNzoxMjo1MiAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvd2Vhay5leHA6IE5ldyB0ZXN0LgotCSogbGQtc2NyaXB0cy93ZWFrLnQ6IE5ldyBmaWxlLgotCSogbGQtc2NyaXB0cy93ZWFrMS5zOiBOZXcgZmlsZS4KLQkqIGxkLXNjcmlwdHMvd2VhazIuczogTmV3IGZpbGUuCi0KLVR1ZSBKdW4gMTYgMTI6NDA6MzggMTk5OCAgR2VvZmYgS2VhdGluZyAgPGdlb2Zma0BvemVtYWlsLmNvbS5hdT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cDogUnVuIHRlc3RzIG9uIHBvd2VycGMgRUxGIHRhcmdldHMuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTGlrZXdpc2UuCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMxLmRzeW06IEFsbG93IGZvciAuc2RhdGEuCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBQb3dlclBDIExpbnV4LgotCi1GcmkgTWF5IDI5IDE1OjAyOjUwIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHhmYWlscyBmb3IgcG93ZXJwYyotKi1lYWJpLgotIAkocnVuX3NyZWNfdGVzdCk6IE9uIG1uMTAyMDAsIGRlZmluZSBfX3RydW5jc2lwc2kyX2RvX2QyLgotCSogbGQtc3JlYy9zcjEuYyAoX19tYWluKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIHZvaWQuCi0JKiBsZC1zcmVjL3NyMy5jYyAoX19tYWluKTogTGlrZXdpc2UuCi0JKF9fYnVpbHRpbl9kZWxldGUsIF9fYnVpbHRpbl9uZXcpOiBMaWtld2lzZS4KLQkoX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluKTogUmV0dXJuIDAuCi0JKF9fZ2V0X2VoX2NvbnRleHQpOiBMaWtld2lzZS4KLQotVGh1IE1heSAyMSAxNToyMTozMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogQWRkIHN1cHBvcnQgZm9yIHRodW1iLXBlIHRhcmdldC4KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzdXBwb3J0IGZvciBhcm0tcGUgYW5kIHRodW1iLXBlIHRhcmdldHMuCi0KLU1vbiBNYXkgIDQgMTc6NTQ6MjAgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSZW1vdmUgc2V0dXBfeGZhaWxzIGZvciBtNjhrLWxpbnV4LgotCi1Nb24gTWF5ICA0IDE3OjEyOjA2IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkL21haW4uYyAoc2hsaWJfb3ZlcnJpZGRlbmNhbGwyKTogTmV3IGZ1bmN0aW9uLgotCShtYWluKTogQ2FsbCBzaGxpYl9zaGxpYmNhbGwyLgotCSogbGQtc2hhcmVkL3NoMS5jIChzaGxpYl9zaGxpYmNhbGwyKTogTmV3IGZ1bmN0aW9uLgotCShzaGxpYl9vdmVycmlkZGVuY2FsbDIpOiBOZXcgZnVuY3Rpb24uCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmRhdDogQWRkIG91dHB1dCBsaW5lIGZvciBuZXcgdGVzdC4KLQkqIGxkLXNoYXJlZC9zdW40LmRhdDogTGlrZXdpc2UuCi0KLQkqIGxkLXNyZWMvc3IzLmNjIChfX2dldF9laF9jb250ZXh0KTogTmV3IGZ1bmN0aW9uLgotCi1UdWUgQXByICA3IDEyOjUwOjE3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC1mb28uaCAoY2xhc3MgRm9vKTogRGVjbGFyZSBsZW4gdG8gYmUgc3RhdGljIHRvCi0JYXZvaWQgY29tcGlsZXIgd2FybmluZy4KLQkqIGxkLXNyZWMvc3IzLmNjIChjbGFzcyBGb28pOiBMaWtld2lzZS4KLQotVHVlIEZlYiAxMCAxNjo0Mjo0MCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3IzLmNjIChfX2dldF9keW5hbWljX2hhbmRsZXJfY2hhaW4pOiBOZXcgZnVuY3Rpb24uCi0KLU1vbiBGZWIgIDIgMTQ6MTc6NDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3BoZHJzLmV4cDogQWRqdXN0IHBoZHJzX3JlZ2V4cCBmb3IgYSA2NCBiaXQgdGFyZ2V0LgotCi1UaHUgRGVjIDE4IDExOjEzOjI4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IER1cGxpY2F0ZWQgQXJtIHBhdGNoIGZvciBUaHVtYiB0YXJnZXRzLgotCi1UdWUgRGVjICAyIDA5OjUwOjE5IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFwcGxpZWQgcGF0Y2ggZnJvbSBUb255LlRob21wc29uQGFybS5jb20gd2hpY2gKLQlmaXhlcyBBUk0gdGVzdHMuCi0KLU1vbiBEZWMgIDEgMTY6MTI6MDUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIGV4cGVjdGVkIGZhaWx1cmVzIG9mIHRlc3RzIDEgYW5kIDIgZm9yIEFSTQotCWNvZmYgdGFyZ2V0cy4KLQotV2VkIE5vdiAxMiAxNDoxODozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QtZm9vLmggKGNsYXNzIEZvbyk6IERlY2xhcmUgbGVuIHRvIGJlIGludCB0bwotCWF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuCi0JKiBsZC1zcmVjL3NyMy5jYyAoY2xhc3MgRm9vKTogTGlrZXdpc2UuCi0KLU1vbiBOb3YgMTAgMTQ6MjU6NDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsaWIvbGQtbGliLmV4cCAoZGVmYXVsdF9sZF9zaW1wbGVfbGluayk6IFBlcm1pdCB0aGUgbGlua2VyIHRvCi0JaGF2ZSBhbnkgbmFtZSB3aGVuIGxvb2tpbmcgZm9yIGVudHJ5IHN5bWJvbCB3YXJuaW5ncy4KLQotCSogbGQtc3JlYy9zcjMuY2MgKF9fZWhfcGMpOiBEZWZpbmUuCi0KLU1vbiBPY3QgMjAgMTQ6MzY6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyMy5jYzogQWRkIGRlZmluaXRpb25zIGZvciB0ZXJtaW5hdGUsIF9fdGVybWluYXRlLCBhbmQKLSAJX190aHJvdywgc2luY2UgdGhlIGN1cnJlbnQgZysrIGV4cGVjdHMgdGhlbSB0byBiZSBkZWZpbmVkLgotCi1GcmkgT2N0ICAzIDEyOjI0OjAzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZWxmdmVycy92ZXJzLmV4cCAob2JqZHVtcF9lbXB0eXZlcnN0dWZmKTogQWNjZXB0IHRoZSBvdXRwdXQKLQlmaWxlIGlmIHRoZSBzdHJpbmcgbGliYyBhcHBlYXJzIGluIGl0LgotCShvYmpkdW1wX3ZlcnNpb25zdHVmZik6IEFjY2VwdCB1bmV4cGVjdGVkIGxpbmVzIGluIHRoZSBvdXRwdXQKLQlmaWxlLiAgQ29tcGFyZSBsaW5lcyB1c2luZyBzdHJpbmcgbWF0Y2guCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM2LnZlcjogUGVybWl0IGFueSB2YWx1ZSBpbiB0aGUgdm5hX290aGVyIGZpZWxkLgotCi1UdWUgQXVnIDEyIDE2OjAxOjIyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IENvcnJlY3Qgc3RyaW5nIHF1b3RpbmcuCi0KLVNhdCBBdWcgIDkgMDA6NTY6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IENoYW5nZSBsZCwgYXMsIG5tIGFuZCBzdHJpcCBmcm9tIC5uZXcgdG8KLQktbmV3LiAgTG9hZCBsZC1saWIuZXhwIHJhdGhlciB0aGFuIGxkLmV4cC4KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBVc2UgbGQtbmV3IHJhdGhlciB0aGFuIGxkLm5ldy4KLQkqIGxpYi9sZC1saWIuZXhwOiBSZW5hbWUgZnJvbSBsaWIvbGQuZXhwLCBmb3IgdGhlIGJlbmVmaXQgb2YKLQlEZWphR251IGNoYW5nZXMuCi0KLVRodSBKdW4gMjYgMTI6MDc6MDMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBVc2UgZWdyZXAgcmF0aGVyIHRoYW4gZ3JlcCB3aGVuIGxvb2tpbmcgZm9yCi0JYW4gYWx0ZXJuYXRpb24uICBGcm9tIEdyZWcgTWFyZ28gPGdtYXJnb0BkbC5jb20+LgotCi1XZWQgSnVuIDI1IDEyOjQ3OjIyIDE5OTcgIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBtNjhrLWxpbnV4IG9uIHRlc3RzCi0Jd2l0aCBub24gUElDIHNoYXJlZCBsaWJyYXJpZXMuCi0KLUZyaSBKdW4gIDYgMTc6MzU6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnM2LnZlcjogVXBkYXRlIGZvciByZWNlbnQgZWxmbGluay5oIHBhdGNoIHRvCi0JdmVyc2lvbiBoYW5kbGluZy4KLQotV2VkIEp1biAgNCAxMjowNjo0OCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERlZmluZSBfX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluIGFzIHdlbGwuCi0KLUZyaSBNYXkgMzAgMTI6MjE6MzkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEZWZpbmUgX19nZXRfZHluYW1pY19oYW5kbGVyX2NoYWluIHdoZW4KLQlsaW5raW5nLgotCi1Nb24gTWF5IDEyIDExOjE3OjU1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBVc2UgJGJhc2VfZGlyIHJhdGhlciB0aGFuICRvYmpkaXIgd2hlbgotCXNldHRpbmcgbGQuICBGcm9tIEpvaG4gRGF2aWQgQW5nbGluIDxkYXZlQGhpYXVseTEuaGlhLm5yYy5jYT4uCi0KLUZyaSBBcHIgMjUgMDk6MDc6MDAgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBEZWZpbmUgdmFyaW91cyBvdXQgb2YgbGluZSBwcm9sb2d1ZS9lcGlsb2d1ZQotCWZ1bmN0aW9ucyBmb3IgdGhlIG1uMTAyMDAgdG8gYXZvaWQgbmVlZGluZyBsaWJnY2MuYS4KLQotV2VkIE1hciAyNiAxMzo1NjoxMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERvbid0IGV4cGVjdCBmYWlsdXJlcyBvbiBtaXBzKi0qLWVsZiouCi0KLU1vbiBNYXIgMTcgMTk6Mjc6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbGZ2ZXJzL3ZlcnMuZXhwOiBEb24ndCBydW4gb24gU3VuT1Mgb3IgQUlYLgotCi1XZWQgTWFyIDEyIDIxOjQ0OjE5IDE5OTcgIEVyaWMgWW91bmdkYWxlICA8ZXJpY0BhbmRhbnRlLmppYy5jb20+Ci0KLQkqIGxkLWVsZnZlcnMvdmVycy5leHAsICo6IE5ldyB0ZXN0cyBmb3Igc3ltYm9sIHZlcnNpb25pbmcuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCBhciBhbmQgc3RyaXAuCi0KLUZyaSBGZWIgIDcgMTY6NDc6MDIgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBVc2UgcHJ1bmVfd2FybmluZ3MgaW5zdGVhZCBvZgotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IERpdHRvLgotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IERpdHRvLgotCSogbGQtc2gvc2guZXhwOiBEaXR0by4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBEaXR0by4KLQkqIGxkLXNyZWMvc3JlYy5leHA6IERpdHRvLgotCSogbGliL2xkLmV4cDogRGl0dG8uCi0KLVdlZCBKYW4gMjkgMDA6NDc6MjkgMTk5NyAgQm9iIE1hbnNvbiAgPG1hbnNvbkBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIGxkLWNkdGVzdC9jZHRlc3QuZXhwOiBQdXQgYSBzbGFzaCBiZXR3ZWVuICRzcmNkaXIvJHN1YmRpci4KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LmV4cDogRGl0dG8uCi0JKiBsZC1zaC9zaC5leHA6IERpdHRvLgotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IERpdHRvLgotCSogbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwOiBEaXR0by4KLQkqIGxpYi9sZC5leHA6IERpdHRvLgotCi1Nb24gRGVjIDMwIDE3OjA4OjA0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9jcm9zc3JlZi5leHA6IEZpeCBxdW90aW5nIGZvciAtLWRlZnN5bSAkZ2xvYmFsJC4KLQotVHVlIE9jdCAgMSAxNTo1MjozMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfdmVyc2lvbik6IEZpeCBmb3IgY3VycmVudCB2ZXJzaW9uCi0JcHJpbnRpbmcuCi0KLUZyaSBTZXAgMTMgMTU6NTE6NDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogRGVmaW5lICRnbG9iYWwkIGZvciBocHBhLWVsZi4KLQotVGh1IEF1ZyAgOCAxNDoyOTozMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3MyLnQ6IE1hcCBYQ09GRiBzZWN0aW9ucyB0byAudGV4dCBvciAuZGF0YS4KLQotCSogbGliL2xkLmV4cDogVXNlIHZlcmJvc2UgLWxvZyBpbnN0ZWFkIG9mIGNhbGxpbmcgYm90aCB2ZXJib3NlIGFuZAotCXNlbmRfbG9nLgotCi1XZWQgQXVnICA3IDE4OjAwOjU4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9waGRycy5leHA6IE5ldyB0ZXN0LgotCSogbGQtc2NyaXB0cy9waGRycy5zLCBsZC1zY3JpcHRzL3BoZHJzLnQ6IE5ldyBmaWxlcy4KLQotU3VuIEF1ZyAgNCAyMTo1ODoxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwOiBPbiBhMjlrIHRhcmdldHMsIHVzZSAtLWRlZnN5bSB0byBkZWZpbmUKLQlWX1NQSUxMIGFuZCBWX0ZJTEwuCi0KLVRodSBBdWcgIDEgMTQ6MTA6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cDogTmV3IHRlc3QuCi0JKiBsZC1zY3JpcHRzL3tjcm9zczEuYywgY3Jvc3MyLmMsIGNyb3NzMy5jfTogTmV3IGZpbGVzLgotCSogbGQtc2NyaXB0cy97Y3Jvc3MxLnQsIGNyb3NzMi50fTogTmV3IGZpbGVzLgotCi1TYXQgSnVuIDI5IDEzOjQwOjExIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2gvc2guZXhwOiBGaXggZGVidWdnaW5nIG1lc3NhZ2VzLgotCSogbGQtc2gvc2gxLnM6IFVzZSAuYWxpZ24gNC4KLQotV2VkIE1heSAgMSAxNjo0NToxMyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoL3NoLmV4cDogVXNlIC1PIHdoZW4gY29tcGlsaW5nIHdpdGggLW1yZWxheC4KLQotTW9uIEFwciAyOSAxMDozMzoxMCAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0aGUgc2hhcmVkIGxpYnJhcnkgdGVzdHMgb24KLSAJTGludXgvbTY4ay4KLQotRnJpIEFwciAgNSAxNjoyMDo1NSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBSdW4gdGhlIHNoYXJlZCBsaWJyYXJ5IHRlc3RzIG9uIExpbnV4LgotCi1Nb24gRmViIDI2IDEyOjQ1OjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IERvbid0IHVzZSAtZnBpYyBvbiBNSVBTIHRhcmdldHMuCi0KLVdlZCBKYW4gMzEgMTU6MDk6NTcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgeGZhaWxzIGZvciBocHBhKi0qLSplbGYqLgotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IExpa2V3aXNlLgotCi1GcmkgSmFuIDI2IDE4OjQzOjAzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEVMRiB0YXJnZXRzIHNob3VsZCBub3cgcGFzcyB0aGUKLQl1bmRlZmluZWQgbGluZSB0ZXN0LgotCi1UaHUgSmFuIDI1IDE1OjM2OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtZW1waWMvZW1waWMuZXhwOiBVcGRhdGUgZm9yIGNoYW5nZSB0byBNSVBTIGRpc2Fzc2VtYmxlci4KLQotTW9uIEphbiAxNSAxNTowNTo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBFeHBlY3QgZmFpbHVyZSBmb3IgbWlwcyotKi1pcml4NSoKLQl3aGVuIGRvaW5nIHRoZSAtLXN0YXRpYyB0ZXN0LgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IFJ1biB0ZXN0cyBvbiBtaXBzKi0qLWlyaXg1Ki4KLQotRnJpIERlYyAyOSAxMjozMzowOSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBPbiBBSVgsIGRvbid0IHBhc3MgdGhlIC1iSSBvcHRpb24KLQl3aGVuIGNyZWF0aW5nIGxkLXBhcnRpYWwuby4KLQotVHVlIERlYyAyNiAxNzozNzoyMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IElmIHBvd2VycGMqLSotZWFiaSosIHVzZSAtLWRlZnN5bSB0byBkZWZpbmUKLQlfX2VhYmkuCi0KLVR1ZSBEZWMgMTkgMTg6MDE6MDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWxzIGZvciBYQ09GRiB0YXJnZXRzLgotCi1GcmkgRGVjIDE1IDE2OjM2OjE3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogT24gYTI5ayB0YXJnZXRzLCB1c2UgLS1kZWZzeW0gdG8gZGVmaW5lCi0JVl9TUElMTCBhbmQgVl9GSUxMLgotCSogbGQtc3JlYy9zcjEuYyAoVl9TUElMTCwgVl9GSUxMKTogUmVtb3ZlIGRlZmluaXRpb25zLgotCSogbGQtc3JlYy9zcjMuY2M6IExpa2V3aXNlLgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBSZW1vdmUgaTk2MCBDT0ZGIHNldHVwX3hmYWlsLgotCi1TYXQgRGVjICAyIDAxOjIwOjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogRG9uJ3QgdXNlIFtdIGluIHNldHVwX3hmYWlsIGV4cHJlc3Npb25zLgotCi1GcmkgRGVjICAxIDEzOjE4OjE4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogQWRkIHNldHVwX3hmYWlscyBmb3IgTUlQUyBFTEYgdGFyZ2V0cy4KLQotV2VkIE5vdiAyOSAxMzowMToxMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNyZWMvc3JlYy5leHA6IEFkZCBzZXR1cF94ZmFpbCBmb3IgaTk2MCBDT0ZGIHRhcmdldHMuCi0KLU1vbiBOb3YgMjcgMTQ6MzY6MTEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zcmVjL3NyZWMuZXhwOiBBZGQgc2V0dXBfeGZhaWwgY2FsbHMgZm9yIGlbMzQ1XTg2LSotYW91dCouCi0KLQkqIGxkLXNyZWMvc3IxLmMgKFZfU1BJTEwsIFZfRklMTCk6IERlZmluZS4KLQkqIGxkLXNyZWMvc3IzLmNjOiBMaWtld2lzZS4KLQotVHVlIE5vdiAyMSAxNjowNTo1MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogVXBkYXRlIGZvciBjaGFuZ2VzIGluIG9iamR1bXAgb3V0cHV0LgotCi1XZWQgTm92IDE1IDE3OjQyOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc3JlYy9zcmVjLmV4cDogTmV3IHRlc3RzLgotCSogbGQtc3JlYy9zcjEuYywgbGQtc3JlYy9zcjIuYywgbGQtc3JlYy9zcjMuY2M6IE5ldyBmaWxlcy4KLQkqIGxpYi9sZC5leHAgKGxkX3NpbXBsZV9saW5rKTogRGlzY2FyZCB3YXJuaW5ncyBhYm91dCBub3QgYmVpbmcKLQlhYmxlIHRvIGZpbmQgdGhlIGVudHJ5IHN5bWJvbC4KLQotVHVlIE5vdiAxNCAyMDowMzo1NCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNoL3NoMi5jIChfX21haW4pOiBEZWZpbmUuCi0KLU1vbiBOb3YgIDYgMTQ6Mzk6MTggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1lbXBpYy9lbXBpYy5leHA6IEFjY2VwdCBhIC4gaW4gdGhlIGFkZHJlc3Mgc3ltYm9sLgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRlc3RzIG9uIHJzNjAwMCotKi1haXgqIGFuZAotCXBvd2VycGMqLSotYWl4Ki4gIEFkZCBjb2RlIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBleHBvcnRzIGZpbGVzLAotCWFuZCBwYXNzIGFwcHJvcHJpYXRlIGNvbXBpbGF0aW9uIGZsYWdzLCBhbmQgdGVzdCBhZ2FpbnN0Ci0JYXBwcm9wcmlhdGUgZXhwZWN0ZWQgb3V0cHV0LgotCSogbGQtc2hhcmVkL3hjb2ZmLmRhdDogTmV3IGZpbGUuCi0JKiBsZC1zaGFyZWQvbWFpbi5jOiBQdXQgI2lmbmRlZiBYQ09GRl9URVNUIGFyb3VuZCB0ZXN0cyB0aGF0IGNhbgotCW5vdCBiZSBsaW5rZWQgdXNpbmcgWENPRkYuICBVc2Ugc2hsaWJfc2hsaWJ2YXIxIGFzIGEgc2FtcGxlCi0JZnVuY3Rpb24gcG9pbnRlciwgcmF0aGVyIHRoYW4gc2hsaWJfbWFpbnZhci4KLQkqIGxkLXNoYXJlZC9zaDEuYzogTGlrZXdpc2UuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmRhdDogVXBkYXRlIGZvciBjaGFuZ2UgZnJvbSB1c2luZyBzaGxpYl9tYWludmFyCi0JdG8gdXNpbmcgc2hsaWJfc2hsaWJ2YXIxLgotCSogbGQtc2hhcmVkL3N1bjQuZGF0OiBMaWtld2lzZS4KLQotU2F0IE9jdCAyOCAwMTo1NDoyNSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXNjcmlwdHMvc2NyaXB0LnQ6IFB1dCAucHIgaW4gLnRleHQsIGFuZCAucncgaW4gLmRhdGEsIGZvcgotCWNvbnZlbmllbmNlIHdoZW4gdGVzdGluZyBYQ09GRi4KLQotVGh1IE9jdCAyNiAyMjo1MzoxNyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBPbiBBSVgsIHBhc3MgLWJJL2xpYi9zeXNjYWxscy5leHAKLQlhbG9uZyB3aXRoIC0tc3RhdGljLgotCi0JKiBsZC1zY3JpcHRzL3NjcmlwdC5zOiBNYWtlIHN5bWJvbHMgZ2xvYmFsLgotCi1GcmkgT2N0IDIwIDEyOjIyOjE2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHA6IEFkZCBzZXR1cF94ZmFpbHMgZm9yIGFybSotKi1wZSouCi0KLUZyaSBTZXAgMjkgMTE6MDY6MTAgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogVXNlIC1lIHdoZW4gaW52b2tpbmcgdGhlIGxpbmtlciwgdG8KLQlwcmV2ZW50IHRoZSBTdW5PUyBsaW5rZXIgZnJvbSB0cnlpbmcgdG8gY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkuCi0KLVRodSBTZXAgMjggMTI6Mzc6MTQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogUnVuIHRoZSB0ZXN0cyBvbiBzcGFyYyotKi1zdW5vczQqLiAgQWRkCi0JYXBwcm9wcmlhdGUgbW9kaWZpY2F0aW9ucyBhbmQgc2V0dXBfeGZhaWxzLgotCSogbGQtc2hhcmVkL3N1bjQuZGF0OiBOZXcgZmlsZS4KLQotTW9uIFNlcCAxOCAxNDoxMjo1NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKGRlZmF1bHRfbGRfdmVyc2lvbik6IENhbGwgcHJ1bmVfc3lzdGVtX2NydWQuCi0JKGRlZmF1bHRfbGRfcmVsb2NhdGUsIGRlZmF1bHRfbGRfbGluayk6IExpa2V3aXNlLgotCShkZWZhdWx0X2xkX3NpbXBsZV9saW5rLCBkZWZhdWx0X2xkX2NvbXBpbGUpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9sZF9hc3NlbWJsZSwgZGVmYXVsdF9sZF9ubSk6IExpa2V3aXNlLgotCi1GcmkgU2VwICA4IDE3OjE1OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IElmIHRoZSBjb21waWxlciBkb2VzIG5vdCBleGlzdCwgbWFyayB0aGUKLQl0ZXN0cyBhcyB1bnRlc3RlZCByYXRoZXIgdGhhbiB1bnJlc29sdmVkLgotCi1XZWQgQXVnIDIzIDEwOjQ2OjM4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogbGQtc2gvc2guZXhwOiBDYWxsIHBydW5lX3N5c3RlbV9jcnVkIG9uIHRoZSBvdXRwdXQgb2YgY21wLgotCi1UdWUgQXVnIDE1IDE3OjM1OjM1IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9zY3JpcHQuZXhwOiBTcGxpdCBzY3JpcHQgdmVyaWZpY2F0aW9uIGludG8gYSBwcm9jLgotCUFkZCBzaW1wbGUgdGVzdCBvZiBNUkkgc2NyaXB0LgotCSogbGQtc2NyaXB0cy9zY3JpcHRtLnQ6IE5ldyBmaWxlLgotCi1XZWQgSnVsIDI2IDExOjM4OjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2gvc2guZXhwOiBNYXJrIGBTSCBjb25maXJtIHJlbGF4aW5nJyB0ZXN0IHVucmVzb2x2ZWQgd2hlbgotCWFwcHJvcHJpYXRlLgotCi1Nb24gSnVsIDI0IDE1OjM0OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL2RlZmF1bHQuZXhwOiBEZWZpbmUgb2JqY29weSBpZiBpdCBpcyBub3QgZGVmaW5lZC4KLQkqIGxkLXNoLyo6IE5ldyB0ZXN0cyBmb3IgU0ggcmVsYXhpbmcuCi0KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogSWYgJENDIGRvZXMgbm90IGV4aXN0LCBjYWxsIHVudGVzdGVkIHJhdGhlcgotCXRoYW4gdW5yZXNvbHZlZC4KLQotVGh1IEp1bCAyMCAxNTowOToyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBJZiAkQ0MgZG9lcyBub3QgZXhpc3QsIG1hcmsgdGhlCi0JdGVzdHMgYXMgdW50ZXN0ZWQgcmF0aGVyIHRoYW4gdW5yZXNvbHZlZC4gIENsZWFyIEVMRiB4ZmFpbHMgZm9yCi0JbWlwcyosIG5vdCBqdXN0IG1pcHMuCi0KLVR1ZSBKdWwgMTggMTI6MDA6NDEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cDogQWRkIHNldHVwX3hmYWlsIGZvciBzaC0qLSogZm9yCi0JdW5kZWZpbmVkIGxpbmUgdGVzdC4KLQotRnJpIEp1bCAxNCAxMzowNzo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGxkLXVuZGVmaW5lZC91bmRlZmluZWQuZXhwOiBOZXcgdGVzdCwgdG8gY2hlY2sgcmVwb3J0aW5nIG9mCi0JdW5kZWZpbmVkIHN5bWJvbHMuCi0JKiBsZC11bmRlZmluZWQvdW5kZWZpbmVkLmM6IE5ldyBmaWxlLgotCi1Nb24gSnVsIDEwIDExOjEzOjM5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwOiBJZiBhIHRlc3QgZmFpbHMsIHJlcG9ydCBpdCBjb3JyZWN0bHk6Ci0JZG9uJ3QgdHJ5IHRvIHJ1biB0aGUgbmV4dCB0ZXN0LCBhbmQgZG9uJ3QgcmVwb3J0IGEgcGFzcyBhcyB3ZWxsIGFzCi0JYSBmYWlsLgotCi1Nb24gSnVsICAzIDE0OjI2OjM3IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGxkL3Rlc3RzdWl0ZS92ZXJzYWRvcy8odDEsdDIpLmxkOiBFbmQgaW4gbmV3bGluZXMuCi0KLU1vbiBNYXkgMjIgMjA6MTk6MzggMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogSWYgY2MgYXJndW1lbnQgaXMgbXVsdGlwbGUKLQl3b3JkcywgdXNlIG9ubHkgdGhlIGZpcnN0IHdoZW4gdHJ5aW5nIHRvIHZlcmlmeSB0aGUgYXZhaWxhYmlsaXR5Ci0Jb2YgdGhlIGNvbXBpbGVyLgotCi1Nb24gRmViICA2IDExOjQ2OjQ5IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbGQtc2NyaXB0cy9kZWZpbmVkLnQ6IE1lbnRpb24gLmRhdGEgYW5kIC5ic3MgZXhwbGljaXRseS4KLQotVHVlIEphbiAyNCAxNDo1MTo0OCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBJZiBub3QgaW4gdGhlIGxkIGJ1aWxkIGRpcmVjdG9yeSwKLQljYWxsIHVudGVzdGVkIGZvciBlYWNoIHRlc3QsIHJhdGhlciB0aGFuIGlnbm9yaW5nIGl0LiAgSWYgb25lIHRlc3QKLQlmYWlscywgZ28gb24gdG8gdGhlIG5leHQgb25lIGluc3RlYWQgb2YgcmV0dXJuaW5nLgotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IElmIGNvbXBpbGF0aW9ucyBmYWlsLCBtYXJrIHRlc3RzIGFzCi0JdW5yZXNvbHZlZC4KLQkqIGxkLWVtcGljL2VtcGljLmV4cDogTGlrZXdpc2UuICBBbHNvLCBhbHdheXMgcGFzcyB0aGUgc2FtZSB0ZXN0Ci0JbmFtZSB0byBwYXNzIG9yIGZhaWwuCi0JKiBsZC1zaGFyZWQvc2hhcmVkLmV4cDogTGlrZXdpc2UuICBBbHNvLCBhbHdheXMgcnVuIGFsbCB0ZXN0cy4KLQkqIGxkLXNjcmlwdHMvZGVmaW5lZC5leHA6IElmIGFzIG9yIG5tIGZhaWwsIG1hcmsgdGVzdCBhcwotCXVucmVzb2x2ZWQuICBBbHdheXMgcGFzcyB0aGUgc2FtZSB0ZXN0IG5hbWUgdG8gcGFzcyBvciBmYWlsLgotCSogbGQtc2NyaXB0cy9zY3JpcHQuZXhwOiBMaWtld2lzZS4KLQkqIGxkLXNjcmlwdHMvc2l6ZW9mLmV4cDogTGlrZXdpc2UuCi0KLVdlZCBKYW4gMTEgMTE6NDg6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1zY3JpcHRzL3NpemVvZi5leHA6IE5ldyB0ZXN0LCBiYXNlZCBvbiBidWcgcmVwb3J0IGZyb20KLQlhbmRlcnMuYmxvbWRlbGxAY29udHJvbC5sdGguc2UuCi0JKiBsZC1zY3JpcHRzL3NpemVvZi5zOiBOZXcgZmlsZS4KLQkqIGxkLXNjcmlwdHMvc2l6ZW9mLnQ6IE5ldyBmaWxlLgotCi1XZWQgSmFuICA0IDE4OjU2OjI3IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cDogVXNlIFt3aGljaCAkbGRdIHJhdGhlciB0aGFuIFtmaWxlIGV4aXN0cyAkbGRdIHRvIHNlZQotCWlmIHRoZSBsaW5rZXIgZXhpc3RzLgotCi1XZWQgRGVjIDE0IDE2OjM5OjAzIDE5OTQgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIGxpYi9sZC5leHAgKHBydW5lX3N5c3RlbV9jcnVkKTogRGVmaW5lIGlmIG5vdCBhbHJlYWR5IGRlZmluZWQsCi0JaW4gY2FzZSB0aGUgdXNlciBpc24ndCB1c2luZyB0aGUgbmV3ZXN0IERlamFHbnUgdmVyc2lvbiB0aGF0IHdlCi0JaGF2ZW4ndCByZWxlYXNlZCB0byB0aGUgbmV0IHlldC4KLQotRnJpIERlYyAgMiAxNDoxNzowMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHJ0bC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IERlZmluZSBvYmpkdW1wIGlmIGl0IGlzIG5vdCBkZWZpbmVkLgotCSogbGQtZW1waWMvKjogTmV3IHRlc3RzIHRvIHRlc3QgLW1lbWJlZGRlZC1waWMgY29kZS4KLQotTW9uIE5vdiAyOCAxMToyNDozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGxkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwOiBQYXNzIGNtcCBvdXRwdXQgdGhyb3VnaAotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogbGQtY2R0ZXN0L2NkdGVzdC5leHA6IFBhc3MgZGlmZiBvdXRwdXQgdGhyb3VnaAotCXBydW5lX3N5c3RlbV9jcnVkLgotCSogbGQtc2hhcmVkL3NoYXJlZC5leHA6IExpa2V3aXNlLgotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbW92ZSB1bnVzZWQgYW5kIHVzZWxlc3MgcHJvYyBsZF9sb2FkLgotCi1TdW4gT2N0IDMwIDEzOjAyOjM0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9jb21waWxlKTogUmVtb3ZlIHRoZSBvdXRwdXQgZmlsZSBiZWZvcmUKLQljb21waWxpbmcuCi0KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZXhwOiBNb3ZlIGNvbW1vbiB0ZXN0IGNvZGUgaW50byBhIHByb2NlZHVyZS4KLQlBZGQgdGVzdHMgZm9yIGNvbXBpbGluZyB0aGUgbm9uIHNoYXJlZCBjb2RlIFBJQy4KLQkqIGxkLXNoYXJlZC9tYWluLmMgKG1haW4pOiBDYWxsIG1haW5fY2FsbGVkLCBhbmQgcHJpbnQgdGhlIHJlc3VsdC4KLQkqIGxkLXNoYXJlZC9zaGFyZWQuZGF0OiBBZGp1c3QgYWNjb3JkaW5nbHkuCi0KLVRodSBPY3QgMjcgMTc6MzA6MTIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBzYW5ndWluZS5jeWdudXMuY29tPgotCi0JKiBsZC1zaGFyZWQ6IE5ldyBkaXJlY3RvcnksIHdpdGggbmV3IGZpbGVzIHRvIHRlc3QgZ2VuZXJhdGluZyBFTEYKLQlzaGFyZWQgbGlicmFyaWVzLgotCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX2NvbXBpbGUpOiBJZiB0aGUgY29tcGlsYXRpb24gd29ya2VkLCBidXQKLQlubyBvYmplY3QgZmlsZSB3YXMgY3JlYXRlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZSBjb21waWxlciBmb29saXNobHkKLQlpZ25vcmVkIHRoZSAtbyBzd2l0Y2ggd2hlbiBjb21waWxpbmcsIGFuZCBtb3ZlIHRoZSByZXN1bHRpbmcKLQlvYmplY3QgaWYgaXQgZGlkLgotCi1UaHUgU2VwIDI5IDEyOjM2OjUxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogVk1TIGRvZXMgbm90IHBlcm1pdHMgYC4nIGluIGRpcmVjdG9yeSBuYW1lcy4gIFJlbmFtZWQKLQlsZC5ib290c3RyYXAgdG8gbGQtYm9vdHN0cmFwLCBsZC5jZHRlc3QgdG8gbGQtY2R0ZXN0LCBhbmQKLQlsZC5zY3JpcHRzIHRvIGxkLXNjcmlwdHMuCi0KLVdlZCBTZXAgMjggMTI6MTg6NTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFNldCB2YXJpYWJsZXMgYXMgYW5kIG5tLiAgQ3JlYXRlIHRtcGRpciBpZgotCWl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0JKiBsZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cDogRG9uJ3QgY3JlYXRlIHRtcGRpciBoZXJlLgotCSogbGQuY2R0ZXN0L2NkdGVzdC5leHA6IExpa2V3aXNlLgotCSogbGQuc2NyaXB0cy9kZWZpbmVkLmV4cDogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBzZXQgYXMgYW5kIG5tCi0JaGVyZS4gIENoYW5nZSBwZXJyb3IgZm9yIG5vIHZhcmlhYmxlcyBmb3VuZCB0byBmYWlsLgotCSogbGQuc2NyaXB0cy9zY3JpcHQuZXhwOiBOZXcgdGVzdC4KLQkqIGxkLnNjcmlwdHMvc2NyaXB0LnQsIGxkLnNjcmlwdHMvc2NyaXB0LnM6IE5ldyBmaWxlcy4KLQotVHVlIFNlcCAyNyAxNDo1OTo1MSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIGxkLnNjcmlwdHM6IE5ldyBkaXJlY3RvcnkuCi0JKiBsZC5zY3JpcHRzL2RlZmluZWQuZXhwLCBsZC5zY3JpcHRzL2RlZmluZWQuczogTmV3IGZpbGVzLgotCSogbGQuc2NyaXB0cy9kZWZpbmVkLnQ6IE5ldyBmaWxlLgotCSogbGliL2xkLmV4cCAoZGVmYXVsdF9sZF9zaW1wbGVfbGluayk6IE5ldyBmdW5jdGlvbi4KLQkoZGVmYXVsdF9sZF9hc3NlbWJsZSwgZGVmYXVsdF9sZF9ubSk6IE5ldyBmdW5jdGlvbnMuCi0JKiBjb25maWcvZGVmYXVsdC5leHA6IFJlbmFtZSBmcm9tIHVuaXgtbGQuZXhwLgotCShsZF9zaW1wbGVfbGluaywgbGRfYXNzZW1ibGUsIGxkX25tKTogTmV3IGZ1bmN0aW9ucy4KLQotCSogY29uZmlnL3VuaXgtbGQuZXhwOiBTZXQgbGQgdXNpbmcgZmluZGZpbGUuCi0JKiBsaWIvbGQuZXhwIChkZWZhdWx0X2xkX3JlbG9jYXRlKTogUmV0dXJuIGEgdmFsdWUuICBDaGFuZ2UgZm9ybWF0Ci0Jb2YgbG9nIG1lc3NhZ2VzLgotCShkZWZhdWx0X2xkX2NvbXBpbGUpOiBMaWtld2lzZS4KLQkoZGVmYXVsdF9sZF9saW5rKTogTGlrZXdpc2UuICBBbHNvLCBkb24ndCBpbmNsdWRlICRCRkRMSUIgYW5kCi0JJExJQklCRVJUWSBpbiBsaW5rLgotCSogbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IFJld3JpdGUuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogUmV3cml0ZS4KLQkqIGxkLmNkdGVzdC9jZHRlc3QtZm9vLmNjOiBVcGRhdGUgZnJvbSB0b3AgbGV2ZWwgbGQgZGlyZWN0b3J5LgotCSogbGQuY2R0ZXN0L2NkdGVzdC1mb28uaDogTGlrZXdpc2UuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LW1haW4uY2M6IExpa2V3aXNlLgotCi1GcmkgTWF5IDI3IDA5OjM1OjA0IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjeWdudXMuY29tKQotCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogRG9uJ3QgbG9vayBmb3IgJHJlc3VsdCBiZWZvcmUgaXQncwotCWRlZmluZWQuCi0KLVR1ZSBNYXkgMTcgMTU6MDY6NDkgMTk5NCAgQmlsbCBDb3ggIChiaWxsQHJ0bC5jeWdudXMuY29tKQotCi0JKiBsZC5ib290c3RyYXAvYm9vdHN0cmFwLmV4cCwgbGliL2xkLmV4cDogUmVwbGFjZSBlcnJvciBwcm9jCi0JICBjYWxscyB3aXRoIHBlcnJvciBjYWxscy4KLQotV2VkIE1heSAxMSAxNjo0Nzo0NiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AcnRsLmN5Z251cy5jb20pCi0KLQkqIGxkLmNkdGVzdC9jZHRlc3QtYmFyLmNjOiBSZW5hbWVkIGZyb20gY2R0ZXN0LWZ1bmMuY2MuCi0JKiBsZC5jZHRlc3QvY2R0ZXN0LmV4cDogQWRqdXN0ZWQuCi0KLUZyaSBKYW4gMjggMTM6MjU6NDEgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogbGliL2xkLmV4cCAoc2ltcGxlX2RpZmYpOiBJbmRpY2F0ZSBmYWlsdXJlIGlmIGZpbGVzIGhhdmUKLQlkaWZmZXJlbnQgbnVtYmVycyBvZiBsaW5lcy4gIERvbid0IG11Y2sgd2l0aCAkZGlmZmVyZW5jZXMgdG8gYXZvaWQKLQlpbmRpY2F0aW5nIGEgcGFzcywganVzdCByZXR1cm4uCi0KLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3Qve2NkdGVzdC1mb28uaCxjZHRlc3QtZm9vLmNjLGNkdGVzdC1tYWluLmNjfToKLQlGaXggdGVzdCBjYXNlIHRvIGJlIHZhbGlkIEFOU0kgQysrLiAgRG9uJ3QgcmVxdWlyZSB1c2Ugb2YgaGVhZGVyCi0JZmlsZXMsIHNvICIuLi9nY2MveGdjYyAtQi4uL2djYy8iIGNhbiBiZSB1c2VkIGZvciBDWFguCi0JKiB0ZXN0c3VpdGUvbGQuY2R0ZXN0L2NkdGVzdC5leHA6IENvbWJpbmUgInJtIiBsaW5lcy4gIEFkZCBzb21lCi0JY29tbWVudGFyeSBvbiB0aGluZ3MgdGhhdCBhcmUgc3RpbGwgYnJva2VuIHdpdGggdGhpcyB0ZXN0IGNhc2UuCi0KLUZyaSBTZXAgMTAgMDk6NTg6MjMgMTk5MyAgSmVmZnJleSBXaGVhdCAgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLQotCSogdGVzdHN1aXRlL2xkLmNkdGVzdC9jZHRlc3QuZXhwOiBBZGRlZCBDWFhGTEFHUyB0byBjb21waWxlIHN0YWdlLgotCi1UaHUgQXVnIDEyIDE2OjA1OjM3IDE5OTMgIEplZmZyZXkgV2hlYXQgIChjYXNzaWR5QGN5Z251cy5jb20pCi0KLQkqIHRlc3RzdWl0ZS9saWIvbGQuZXhwOiBhZGQgY29tcGlsZXIgYW5kIGxpbmtlciBzdXBwb3J0Ci0JKiB0ZXN0c3VpdGUvY29uZmlnL3VuaXgtbGQuZXhwOiBhZGQgY29tcGlsZXIgYW5kIGxpbmtlciBzdXBwb3J0Ci0JKiB0ZXN0c3VpdGUvbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IGZpeGVkIHRvIGRvIHBhcnRpYWwgbGlua3MKLQkqIHRlc3RzdWl0ZS9sZC5jZHRlc3QvY2R0ZXN0LmV4cDogY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0ZXN0c2Nhc2UKLQotV2VkIEF1ZyAgNCAyMTowMDoxOCAxOTkzICBKZWZmcmV5IFdoZWF0ICAoY2Fzc2lkeUBjeWdudXMuY29tKQotCi0JKiB0ZXN0c3VpdGUvbGliL2xkLmV4cDogbmV3IGZpbGUKLQkqIHRlc3RzdWl0ZS9jb25maWcvdW5peC1sZC5leHA6IG5ldyBmaWxlCi0JKiB0ZXN0c3VpdGUvbGQuYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHA6IG5ldyBmaWxlCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwIGIvbGQvdGVzdHN1aXRlL2NvbmZpZy9kZWZhdWx0LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEwZmRlYS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvY29uZmlnL2RlZmF1bHQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLSMgQmFzaWMgZXhwZWN0IHNjcmlwdCBmb3IgTEQgUmVncmVzc2lvbiBUZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NywgOTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBKZWZmcmV5IFdoZWF0IChjYXNzaWR5QGN5Z251cy5jb20pCi0jCi0KLWlmICFbaW5mbyBleGlzdHMgbGRdIHRoZW4gewotICAgIHNldCBsZCBbZmluZGZpbGUgJGJhc2VfZGlyL2xkLW5ldyAkYmFzZV9kaXIvbGQtbmV3IFt0cmFuc2Zvcm0gbGRdXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIGFzXSB0aGVuIHsKLSAgICBzZXQgYXMgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9nYXMvYXMtbmV3ICRiYXNlX2Rpci8uLi9nYXMvYXMtbmV3IFt0cmFuc2Zvcm0gYXNdXQotfQotCi1pZiAhW2luZm8gZXhpc3RzIG5tXSB0aGVuIHsKLSAgICBzZXQgbm0gW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9ubS1uZXcgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL25tLW5ldyBbdHJhbnNmb3JtIG5tXV0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBvYmpkdW1wXSB0aGVuIHsKLSAgICBzZXQgb2JqZHVtcCBbZmluZGZpbGUgJGJhc2VfZGlyLy4uL2JpbnV0aWxzL29iamR1bXBdCi19Ci0KLWlmICFbaW5mbyBleGlzdHMgb2JqY29weV0gdGhlbiB7Ci0gICAgc2V0IG9iamNvcHkgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9vYmpjb3B5XQotfQotCi1pZiAhW2luZm8gZXhpc3RzIGFyXSB0aGVuIHsKLSAgICBzZXQgYXIgW2ZpbmRmaWxlICRiYXNlX2Rpci8uLi9iaW51dGlscy9hcl0KLX0KLQotaWYgIVtpbmZvIGV4aXN0cyBzdHJpcF0gdGhlbiB7Ci0gICAgc2V0IHN0cmlwIFtmaW5kZmlsZSAkYmFzZV9kaXIvLi4vYmludXRpbHMvc3RyaXAtbmV3ICRiYXNlX2Rpci8uLi9iaW51dGlscy9zdHJpcC1uZXcgW3RyYW5zZm9ybSBzdHJpcF1dCi19Ci0KLWlmIHshW2ZpbGUgaXNkaXJlY3RvcnkgdG1wZGlyXX0gdGhlbiB7Ci0gICAgY2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyIiBzdGF0dXMKLX0KLQotIyBNYWtlIGEgc3ltbGluayBmcm9tIHRtcGRpci9hcyB0byB0aGUgYXNzZW1ibGVyIGluIHRoZSBidWlsZCB0cmVlLCBzbwotIyB0aGF0IHdlIGNhbiB1c2UgYSAtQiBvcHRpb24gdG8gZ2NjIHRvIGZvcmNlIGl0IHRvIHVzZSB0aGUgbmV3bHkKLSMgYnVpbHQgYXNzZW1ibGVyLgotaWYgeyFbZmlsZSBpc2RpcmVjdG9yeSB0bXBkaXIvZ2FzXX0gdGhlbiB7Ci0gICAgY2F0Y2ggImV4ZWMgbWtkaXIgdG1wZGlyL2dhcyIgc3RhdHVzCi0gICAgY2F0Y2ggImV4ZWMgbG4gLXMgLi4vLi4vLi4vZ2FzL2FzLW5ldyB0bXBkaXIvZ2FzL2FzIiBzdGF0dXMKLX0KLXNldCBnY2NfZ2FzX2ZsYWcgIi1CW3B3ZF0vdG1wZGlyL2dhcy8iCi0KLSMgbG9hZCB0aGUgdXRpbGl0eSBwcm9jZWR1cmVzCi1sb2FkX2xpYiBsZC1saWIuZXhwCi0KLXByb2MgZ2V0X2xpbmtfZmlsZXMge3Zhcm5hbWV9IHsKLSAgICBnbG9iYWwgJHZhcm5hbWUKLSAgICBnbG9iYWwgdGFyZ2V0X3RyaXBsZXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIENDCi0gICAgaWYgIVtpbmZvIGV4aXN0cyAkdmFybmFtZV0gewotCXNldCBzdGF0dXMgW2NhdGNoICJleGVjIHNoIC1jIFwiaG9zdD0nJHRhcmdldF90cmlwbGV0JyAmJiBDQz0nJENDJyAmJiAuICRzcmNkaXIvLi4vY29uZmlndXJlLmhvc3QgJiYgZXZhbCBlY2hvIFxcJCR2YXJuYW1lXCIiIHJlc3VsdF0KLQlpZiAkc3RhdHVzIHsgZXJyb3IgIkVycm9yIGdldHRpbmcgbmF0aXZlIGxpbmsgZmlsZXM6ICRyZXN1bHQiIH0KLQlzZXQgJHZhcm5hbWUgJHJlc3VsdAotICAgIH0KLX0KLQotcHJvYyBnZXRfdGFyZ2V0X2VtdWwge30gewotICAgIGdsb2JhbCB0YXJnZXRfdHJpcGxldAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBzZXQgc3RhdHVzIFtjYXRjaCAiZXhlYyBzaCAtYyBcInRhcmc9JyR0YXJnZXRfdHJpcGxldCcgJiYgLiAkc3JjZGlyLy4uL2NvbmZpZ3VyZS50Z3QgJiYgZWNobyBcXFwkdGFyZ19lbXVsXCIiIHJlc3VsdF0KLSAgICBpZiAkc3RhdHVzIHsgZXJyb3IgIkVycm9yIGdldHRpbmcgZW11bGF0aW9uIG5hbWU6ICRyZXN1bHQiIH0KLSAgICByZXR1cm4gJHJlc3VsdAotfQotCi1pZiBbaXNuYXRpdmVdIHsKLSAgICBmb3JlYWNoIHgge0hPU1RJTkdfQ1JUMCBIT1NUSU5HX0xJQlN9IHsKLQlnZXRfbGlua19maWxlcyAkeAotICAgIH0KLX0gZWxzZSB7Ci0gICAgZm9yZWFjaCB4IHtIT1NUSU5HX0NSVDAgSE9TVElOR19MSUJTfSB7IHNldCAkeCAiIiB9Ci19Ci1pZiAhW2luZm8gZXhpc3RzIEhPU1RJTkdfRU1VXSB7IHNldCBIT1NUSU5HX0VNVSAiLW0gW2dldF90YXJnZXRfZW11bF0iIH0KLQotIwotIyBsZF92ZXJzaW9uIC0tIGV4dHJhY3QgYW5kIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBsZCBjb21waWxlciAoR0NDKQotIwotcHJvYyBsZF92ZXJzaW9uIHt9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBkZWZhdWx0X2xkX3ZlcnNpb24gJGxkCi19Ci0KLSMKLSMgbGRfZXhpdCAtLSBqdXN0IGEgc3R1YiBmb3IgbGQKLSMKLXByb2MgbGRfZXhpdCB7fSB7Ci19Ci0KLSMKLSMgbGRfc3RhcnQgCi0jCXJlbGluayB0aGUgbGlua2VyCi0jCi1wcm9jIGxkX3N0YXJ0IHsgbGQgdGFyZ2V0IH0gewotCSMKLX0KLQotIwotIyBsZF9yZWxvY2F0ZSAKLSMJbGluayBhbiBvYmplY3QgdXNpbmcgcmVsb2NhdGlvbgotIwotcHJvYyBsZF9yZWxvY2F0ZSB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotCWRlZmF1bHRfbGRfcmVsb2NhdGUgJGxkICR0YXJnZXQgJG9iamVjdHMKLX0KLQotIwotIyBsZF9saW5rIAotIwlsaW5rIGEgcHJvZ3JhbSB1c2luZyBsZAotIwotcHJvYyBsZF9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0JZGVmYXVsdF9sZF9saW5rICRsZCAkdGFyZ2V0ICRvYmplY3RzCi19Ci0KLSMKLSMgbGRfc2ltcGxlX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkLCB3aXRob3V0IGluY2x1ZGluZyBhbnkgbGlicmFyaWVzCi0jCi1wcm9jIGxkX3NpbXBsZV9saW5rIHsgbGQgdGFyZ2V0IG9iamVjdHMgfSB7Ci0JZGVmYXVsdF9sZF9zaW1wbGVfbGluayAkbGQgJHRhcmdldCAkb2JqZWN0cwotfQotCi0jCi0jIGxkX2NvbXBpbGUgCi0jCWNvbXBpbGUgYW4gb2JqZWN0IHVzaW5nICRjYwotIwotcHJvYyBsZF9jb21waWxlIHsgY2Mgc291cmNlIG9iamVjdCB9IHsKLQlkZWZhdWx0X2xkX2NvbXBpbGUgJGNjICRzb3VyY2UgJG9iamVjdCAKLX0KLQotIwotIyBsZF9hc3NlbWJsZQotIwlhc3NlbWJsZSBhIGZpbGUKLSMKLXByb2MgbGRfYXNzZW1ibGUgeyBhcyBzb3VyY2Ugb2JqZWN0IH0gewotCWRlZmF1bHRfbGRfYXNzZW1ibGUgJGFzICRzb3VyY2UgJG9iamVjdCAKLX0KLQotIwotIyBsZF9ubQotIwlydW4gbm0gb24gYSBmaWxlCi0jCi1wcm9jIGxkX25tIHsgbm0gb2JqZWN0IH0gewotCWRlZmF1bHRfbGRfbm0gJG5tICRvYmplY3QKLX0KLQotIwotIyBsZF9leGVjCi0jCWV4ZWN1dGUgaXRoZSB0YXJnZXQKLSMKLXByb2MgbGRfZXhlYyB7IHRhcmdldCBvdXRwdXQgfSB7Ci0JZGVmYXVsdF9sZF9leGVjICR0YXJnZXQgJG91dHB1dAotfQotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtYm9vdHN0cmFwL2Jvb3RzdHJhcC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNGI4MjAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWJvb3RzdHJhcC9ib290c3RyYXAuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgQm9vdHN0cmFwIFRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSmVmZnJleSBXaGVhdCAoY2Fzc2lkeUBjeWdudXMuY29tKQotIyBSZXdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgTWFrZSBzdXJlIHRoYXQgbGQgY2FuIGJvb3RzdHJhcCBpdHNlbGYuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gewotICAgIHJldHVybgotfQotCi0jIEJvb3RzdHJhcCBsZC4gIEZpcnN0IGxpbmsgdGhlIG9iamVjdCBmaWxlcyB0b2dldGhlciB1c2luZyAtciwgaW4KLSMgb3JkZXIgdG8gdGVzdCAtci4gIFRoZW4gbGluayB0aGUgcmVzdWx0IGludG8gYW4gZXhlY3V0YWJsZSwgbGQxLCB0bwotIyByZWFsbHkgdGVzdCAtci4gIFVzZSBsZDEgdG8gbGluayBhIGZyZXNoIGxkLCBsZDIuICBVc2UgbGQyIHRvIGxpbmsgYQotIyBuZXcgbGQsIGxkMy4gIGxkMiBhbmQgbGQzIHNob3VsZCBiZSBpZGVudGljYWwuCi0KLWZvcmVhY2ggZmxhZ3MgeyIiICItLXN0YXRpYyIgIi0tdHJhZGl0aW9uYWwtZm9ybWF0IiAiLS1uby1rZWVwLW1lbW9yeSJ9IHsKLSAgICBpZiB7IiRmbGFncyIgIT0gIiJ9IHsgCi0Jc2V0IHRlc3RuYW1lICJib290c3RyYXAgd2l0aCAkZmxhZ3MiCi0gICAgfSBlbHNlIHsKLQlzZXQgdGVzdG5hbWUgImJvb3RzdHJhcCIKLSAgICB9Ci0KLSAgICAjIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gaWYgd2UgaGF2ZSB0aGUgbGQgYnVpbGQgZGlyZWN0b3J5LAotICAgICMgc2luY2Ugd2UgbmVlZCB0aGUgb2JqZWN0IGZpbGVzLgotICAgIGlmIHskbGQgIT0gIiRvYmpkaXIvbGQtbmV3In0gewotCXVudGVzdGVkICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgIyBJZiB3ZSBvbmx5IGhhdmUgYSBzaGFyZWQgbGliYmZkLCB3ZSBwcm9iYWJseSBjYW4ndCBydW4gdGhlCi0gICAgIyAtLXN0YXRpYyB0ZXN0LgotICAgIGlmIHsgJGZsYWdzID09ICItLXN0YXRpYyIgJiYgISBbc3RyaW5nIG1hdGNoICIqbGliYmZkLmEqIiAkQkZETElCXSB9IHRoZW4gewotCXVudGVzdGVkICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgaWYgIVtsZF9yZWxvY2F0ZSAkbGQgdG1wZGlyL2xkLXBhcnRpYWwubyAiJGZsYWdzICRPRklMRVMiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgICMgT24gQUlYLCB5b3UgbmVlZCB0byBzcGVjaWZ5IGFuIGltcG9ydCBsaXN0IHdoZW4gdXNpbmcgLS1zdGF0aWMuCi0gICAgIyBZb3Ugb25seSB3YW50IHRoZSBpbXBvcnQgbGlzdCB3aGVuIGNyZWF0aW5nIHRoZSBmaW5hbAotICAgICMgZXhlY3V0YWJsZS4KLSAgICBpZiBbaXN0YXJnZXQgIiotKi1haXgqIl0gewotCWlmIHsiJGZsYWdzIiA9PSAiLS1zdGF0aWMifSB7Ci0JICAgIHNldCBmbGFncyAiLS1zdGF0aWMgLWJJOi9saWIvc3lzY2FsbHMuZXhwIgotCX0KLSAgICB9Ci0KLSAgICAjIE9uIElyaXggNSwgbGlua2luZyB3aXRoIC0tc3RhdGljIG9ubHkgd29ya3MgaWYgYWxsIHRoZSBmaWxlcyBhcmUKLSAgICAjIGNvbXBpbGVkIHVzaW5nIC1ub25fc2hhcmVkLgotICAgIGlmIHsiJGZsYWdzIiA9PSAiLS1zdGF0aWMifSB7Ci0Jc2V0dXBfeGZhaWwgIm1pcHMqLSotaXJpeDUqIgotICAgIH0KLQotICAgIGlmICFbbGRfbGluayAkbGQgdG1wZGlyL2xkMSAiJGZsYWdzIHRtcGRpci9sZC1wYXJ0aWFsLm8gJEJGRExJQiAkTElCSUJFUlRZIl0gewotCWZhaWwgJHRlc3RuYW1lCi0JY29udGludWUKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2xpbmsgdG1wZGlyL2xkMSB0bXBkaXIvbGQyICIkZmxhZ3MgJE9GSUxFUyAkQkZETElCICRMSUJJQkVSVFkiXSB7Ci0JZmFpbCAkdGVzdG5hbWUKLQljb250aW51ZQotICAgIH0KLQotICAgIGlmICFbbGRfbGluayB0bXBkaXIvbGQyIHRtcGRpci9sZDMgIiRmbGFncyAkT0ZJTEVTICRCRkRMSUIgJExJQklCRVJUWSJdIHsKLQlmYWlsICR0ZXN0bmFtZQotCWNvbnRpbnVlCi0gICAgfQotCi0gICAgc2VuZF9sb2cgImNtcCB0bXBkaXIvbGQyIHRtcGRpci9sZDNcbiIKLSAgICB2ZXJib3NlICJjbXAgdG1wZGlyL2xkMiB0bXBkaXIvbGQzIgotICAgIGNhdGNoICJleGVjIGNtcCB0bXBkaXIvbGQyIHRtcGRpci9sZDMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtYmFyLmNjIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtYmFyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTAwMGUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWJhci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vIHRlc3QgcHJvZ3JhbSBmb3IgQ2xhc3MgRm9vCi0KLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLXN0YXRpYyBGb28gc3RhdGljX2ZvbyggInN0YXRpY19mb28iKTsgCi0KLUZvbyBmKCkKLXsKLSAgICBGb28geDsKLSAgICByZXR1cm4geDsKLX0KLQotdm9pZCBnKCkKLXsKLSAgICBGb28gb3RoZXJfZm9vMSA9IEZvbyggIm90aGVyX2ZvbzEiKSwgb3RoZXJfZm9vMiA9IEZvbyggIm90aGVyX2ZvbzIiKTsKLSAgICBvdGhlcl9mb28yID0gb3RoZXJfZm9vMTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE1ZTMzYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1mb28uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vLyBDbGFzcyBGb28KLSNwcmFnbWEgaW1wbGVtZW50YXRpb24KLQotCi0vLyBXZSBkb24ndCB1c2UgaGVhZGVyIGZpbGVzLCBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gc2VlLCB3aGV0aGVyIHRoZQotLy8gY29tcGlsZXIgaXMgaW5zdGFsbGVkIHByb3Blcmx5LgotLy8KLSNpZiAoX19HTlVHX18gPT0gMikKLXR5cGVkZWYgX19TSVpFX1RZUEVfXyBzaXplX3Q7Ci0jZWxzZQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90OwotI2VuZGlmCi0KLWV4dGVybiAiQyIgewotICAgIGNoYXIgKnN0cm5jcHkgKGNoYXIqIGRlc3QsIGNvbnN0IGNoYXIqIGRlc3QsIHNpemVfdCBsZW4pOwotICAgIGludCBwcmludGYgKGNvbnN0IGNoYXIqLCAuLi4pOwotfTsKLQotI2luY2x1ZGUgImNkdGVzdC1mb28uaCIKLQotaW50IEZvbzo6Zm9vcyA9IDA7Ci0KLXZvaWQgRm9vOjppbml0X2ZvbyAoKQotewotICAgIHByaW50ZiAoIkJST0tFTkxZIGNhbGxpbmcgRm9vOjppbml0X2ZvbyBmcm9tIF9faW5pdF9zdGFydDsgc2l6ZV9vZihGb28pID0gJWRcbiIsIHNpemVvZihGb28pKTsKLSAgICBmb29zID0gRk9PTElTSF9OVU1CRVI7Ci19Ci0KLQotRm9vOjpGb28gKCkKLXsKLSAgICBpID0gKytmb29zOwotICAgIHN0cm5jcHkgKG1lc3NhZ2UsICJkZWZhdWx0LWZvbyIsIGxlbik7Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICgiQ29uc3RydWN0aW5nIEZvbyglZCkgXCJkZWZhdWx0LWZvb1wiIGF0ICUwOHhcbiIsIGksIHRoaXMpOwotI2Vsc2UKLSAgICBwcmludGYgKCJDb25zdHJ1Y3RpbmcgRm9vKCVkKSBcImRlZmF1bHQtZm9vXCJcbiIsIGkpOwotI2VuZGlmCi19Ci0KLUZvbzo6Rm9vIChjaGFyKiBtc2cpCi17Ci0gICAgaSA9ICsrZm9vczsKLSAgICBzdHJuY3B5KCBtZXNzYWdlLCBtc2csIGxlbik7Ci0jaWZkZWYgV0lUSF9BRERSCi0gICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiBhdCAlMDh4XG4iLCBpLCBtZXNzYWdlLCB0aGlzKTsKLSNlbHNlCi0gICAgcHJpbnRmICggIkNvbnN0cnVjdGluZyBGb28oJWQpIFwiJXNcIlxuIiwgaSwgbWVzc2FnZSk7Ci0jZW5kaWYKLX0KLQotCi1Gb286OkZvbyAoY29uc3QgRm9vJiBmb28pCi17Ci0gICAgaSA9ICsrZm9vczsKLSNpZmRlZiBXSVRIX0FERFIKLSAgICBwcmludGYgKCJJbml0aWFsaXppbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB3aXRoIEZvbyglZCkgJTA4eFxuIiwgCi0JICAgIGksIGZvby5tZXNzYWdlLCB0aGlzLCBmb28uaSwgJmZvbyk7Ci0jZWxzZQotICAgcHJpbnRmICgiSW5pdGlhbGl6aW5nIEZvbyglZCkgXCIlc1wiIHdpdGggRm9vKCVkKVxuIixpLCBmb28ubWVzc2FnZSwgZm9vLmkpOwotI2VuZGlmCi0gICAgZm9yICggaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotfQotCi0KLUZvbyYgRm9vOjpvcGVyYXRvcj0gKGNvbnN0IEZvbyYgZm9vKQotewotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgYXQgJTA4eCB0byBGb28oJWQpICUwOHhcbiIsIAotCSAgICBmb28uaSwgZm9vLm1lc3NhZ2UsICZmb28sIGksIHRoaXMpOwotI2Vsc2UKLSAgIHByaW50ZiAoIkNvcHlpbmcgRm9vKCVkKSBcIiVzXCIgdG8gRm9vKCVkKVxuIiwgZm9vLmksIGZvby5tZXNzYWdlLCBpKTsKLSNlbmRpZgotICAgIGZvciAoIGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspIG1lc3NhZ2Vba10gPSBmb28ubWVzc2FnZVtrXTsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLQotRm9vOjp+Rm9vICgpCi17Ci0gICAgZm9vcy0tOwotI2lmZGVmIFdJVEhfQUREUgotICAgIHByaW50ZiAoIkRlc3RydWN0aW5nIEZvbyglZCkgXCIlc1wiIGF0ICUwOHggKHJlbWFpbmluZyBmb29zOiAlZClcbiIsCi0JICAgIGksIG1lc3NhZ2UsIHRoaXMsIGZvb3MpOwotI2Vsc2UKLSAgICBwcmludGYgKCJEZXN0cnVjdGluZyBGb28oJWQpIFwiJXNcIiAocmVtYWluaW5nIGZvb3M6ICVkKVxuIiwKLQkgICAgaSwgbWVzc2FnZSwgZm9vcyk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LWZvby5oIGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZmU1MmEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QtZm9vLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vLyBDbGFzcyBGb28KLQotI3ByYWdtYSBpbnRlcmZhY2UKLQotI2RlZmluZSBGT09MSVNIX05VTUJFUiAtNDcxMQotCi0jaWZuZGVmIEZPT19NU0dfTEVOCi0jZGVmaW5lIEZPT19NU0dfTEVOIDgwCi0jZW5kaWYKLSAKLWNsYXNzIEZvbyB7Ci0gICAgc3RhdGljIGludCBmb29zOwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuID0gRk9PX01TR19MRU47Ci0gICAgY2hhciBtZXNzYWdlW2xlbl07Ci1wdWJsaWM6IAotICAgIHN0YXRpYyB2b2lkIGluaXRfZm9vICgpOwotICAgIHN0YXRpYyBpbnQgbmJfZm9vcygpIHsgcmV0dXJuIGZvb3M7IH0KLSAgICBGb28oKTsKLSAgICBGb28oIGNoYXIqIG1lc3NhZ2UpOwotICAgIEZvbyhjb25zdCBGb28mKTsKLSAgICBGb28gJiBvcGVyYXRvcj0gKGNvbnN0IEZvbyYpOwotICAgIH5Gb28gKCk7Ci19OyAKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC1tYWluLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzg4MWRhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LW1haW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBtYWluIHByb2dyYW0gZm9yIENsYXNzIEZvbwotCi1leHRlcm4gIkMiIHsKLS8vIFNvbWUgPGFzc2VydC5oPiBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gU1VOT1MgNC4xKSBhcmUgYnJva2VuLAotLy8gaW4gdGhhdCB0aGV5IHJlcXVpcmUgPHN0ZGlvLmg+LiAgQnV0LCBpZiBnY2MvZysrIGlzIGluc3RhbGxlZAotLy8gY29ycmVjdGx5LCB5b3Ugc2hvdWxkIGdldCBnY2MncyBhc3NlcnQuaC4KLS8vIElmIHRoZSBjb21waWxlIGZhaWxzLCBpdCBtZWFucyB0aGUgd3JvbmcgaW5jbHVkZSBmaWxlcyBhcmUgaW4gdXNlIQotI2luY2x1ZGUgPGFzc2VydC5oPgotfTsKLSNpbmNsdWRlICJjZHRlc3QtZm9vLmgiCi0KLWV4dGVybiAiQyIgdm9pZCBfX2luaXRfc3RhcnQoKTsKLQotZXh0ZXJuIEZvbyBmKHZvaWQpOwotZXh0ZXJuIHZvaWQgZyh2b2lkKTsKLQotLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgKm5vdCogYmUgY2FsbGVkIGJ5IHRoZSBlbnZpcm9ubWVudC4gIFRoZXJlIGlzCi0gICBubyB3YXkgaW4gQysrIHRvIGBgcnVuIHNvbWV0aGluZyBhZnRlciB0aGUgaW5pdGlhbGl6ZXJzIGJ1dCBiZWZvcmUgbWFpbigpJycuCi0gICBUaGUgbGlicmFyeSB0aGF0IGRlcGVuZHMgb24gdGhpcyAoTklIQ0wpIGlzIGJyb2tlbi4gIC0tIEpvaG4gR2lsbW9yZSAKLSAgIFdlIGxlYXZlIHRoaXMgaGVyZSB0byB0ZXN0IHRoYXQgZnV0dXJlIGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVyCi0gICBkbyBub3QgcmUtaW50cm9kdWNlIHRoaXMgbG9zaW5nIGBgZmVhdHVyZScnLiAgKi8KLXZvaWQgCi1fX2luaXRfc3RhcnQoKQotewotICAgIEZvbzo6aW5pdF9mb28oKTsKLX0KLQotc3RhdGljIEZvbyBzdGF0aWNfZm9vKCAic3RhdGljX2ZvbyIpOyAKLQotaW50IG1haW4oKSAKLXsgCi0gICAgYXNzZXJ0IChGb286Om5iX2Zvb3MoKSA9PSAyKTsKLSAgICBGb28gYXV0b21hdGljX2ZvbyggImF1dG9tYXRpY19mb28iKTsKLSAgICBGb28gYmxhX2ZvbyA9IGYoKTsKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOwotICAgIGcoKTsKLSAgICBhc3NlcnQgKEZvbzo6bmJfZm9vcygpID09IDQpOwotICAgIC8vIGBhdXRvbWF0aWNfZm9vJyBhbmQgYGJsYV9mb28nIGFyZSBkZXN0cnVjdGVkIGhlcmUgCi19IAotIApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWJlMGRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jZHRlc3QvY2R0ZXN0LmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLUNvbnN0cnVjdGluZyBGb28oMSkgInN0YXRpY19mb28iCi1Db25zdHJ1Y3RpbmcgRm9vKDIpICJzdGF0aWNfZm9vIgotQ29uc3RydWN0aW5nIEZvbygzKSAiYXV0b21hdGljX2ZvbyIKLUNvbnN0cnVjdGluZyBGb28oNCkgImRlZmF1bHQtZm9vIgotSW5pdGlhbGl6aW5nIEZvbyg1KSAiZGVmYXVsdC1mb28iIHdpdGggRm9vKDQpCi1EZXN0cnVjdGluZyBGb28oNCkgImRlZmF1bHQtZm9vIiAocmVtYWluaW5nIGZvb3M6IDQpCi1Db25zdHJ1Y3RpbmcgRm9vKDUpICJvdGhlcl9mb28xIgotQ29uc3RydWN0aW5nIEZvbyg2KSAib3RoZXJfZm9vMiIKLUNvcHlpbmcgRm9vKDUpICJvdGhlcl9mb28xIiB0byBGb28oNikKLURlc3RydWN0aW5nIEZvbyg2KSAib3RoZXJfZm9vMSIgKHJlbWFpbmluZyBmb29zOiA1KQotRGVzdHJ1Y3RpbmcgRm9vKDUpICJvdGhlcl9mb28xIiAocmVtYWluaW5nIGZvb3M6IDQpCi1EZXN0cnVjdGluZyBGb28oNSkgImRlZmF1bHQtZm9vIiAocmVtYWluaW5nIGZvb3M6IDMpCi1EZXN0cnVjdGluZyBGb28oMykgImF1dG9tYXRpY19mb28iIChyZW1haW5pbmcgZm9vczogMikKLURlc3RydWN0aW5nIEZvbygyKSAic3RhdGljX2ZvbyIgKHJlbWFpbmluZyBmb29zOiAxKQotRGVzdHJ1Y3RpbmcgRm9vKDEpICJzdGF0aWNfZm9vIiAocmVtYWluaW5nIGZvb3M6IDApCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtY2R0ZXN0L2NkdGVzdC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmUzNWUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNkdGVzdC9jZHRlc3QuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgY2R0ZXN0IFRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTkzLDE5OTQsMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IEplZmZyZXkgV2hlYXQgKGNhc3NpZHlAY3lnbnVzLmNvbSkKLSMgUmV3cml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIE1ha2Ugc3VyZSB0aGF0IGNvbnN0cnVjdG9ycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLXNldCB0ZXN0MSAiY2R0ZXN0Igotc2V0IHRlc3QyICJjZHRlc3Qgd2l0aCAtVXIiCi0KLSMgVGhpcyB0ZXN0IHJlcXVpcmVzIHJ1bm5pbmcgdGhlIGV4ZWN1dGFibGUgZ2VuZXJhdGVkIGJ5IGxkLgotaWYgIVtpc25hdGl2ZV0gewotICAgIHJldHVybgotfQotCi1pZiB7IFt3aGljaCAkQ1hYXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvY2R0ZXN0LWZvby5jYyB0bXBkaXIvY2R0ZXN0LWZvby5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDWFggJENYWEZMQUdTIC1mZ251LWxpbmtlciIgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC1iYXIuY2MgdG1wZGlyL2NkdGVzdC1iYXIub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ1hYICRDWFhGTEFHUyAtZmdudS1saW5rZXIiICRzcmNkaXIvJHN1YmRpci9jZHRlc3QtbWFpbi5jYyB0bXBkaXIvY2R0ZXN0LW1haW4ub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX2xpbmsgJGxkIHRtcGRpci9jZHRlc3Qge3RtcGRpci9jZHRlc3QtZm9vLm8gdG1wZGlyL2NkdGVzdC1iYXIubyB0bXBkaXIvY2R0ZXN0LW1haW4ub31dIHsKLSAgICBmYWlsICR0ZXN0MQotfSBlbHNlIHsKLSAgICBzZW5kX2xvZyAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXRcbiIKLSAgICB2ZXJib3NlICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIKLSAgICBjYXRjaCAiZXhlYyB0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIgZXhlY19vdXRwdXQKLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQlmYWlsICR0ZXN0MQotICAgIH0gZWxzZSB7Ci0Jc2VuZF9sb2cgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXRcbiIKLQl2ZXJib3NlICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0IgotCWNhdGNoICJleGVjIGRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiIGV4ZWNfb3V0cHV0Ci0Jc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3QxCi0JfSBlbHNlIHsKLQkgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkgICAgZmFpbCAkdGVzdDEKLQl9Ci0gICAgfQotfQotCi1pZiAhW2xkX3JlbG9jYXRlICRsZCB0bXBkaXIvY2R0ZXN0Lm8gey1VciB0bXBkaXIvY2R0ZXN0LWZvby5vIHRtcGRpci9jZHRlc3QtYmFyLm8gdG1wZGlyL2NkdGVzdC1tYWluLm99XSB7Ci0gICAgZmFpbCAkdGVzdDIKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9saW5rICRsZCB0bXBkaXIvY2R0ZXN0IHRtcGRpci9jZHRlc3Qub10gewotCWZhaWwgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAidG1wZGlyL2NkdGVzdCA+dG1wZGlyL2NkdGVzdC5vdXRcbiIKLQl2ZXJib3NlICJ0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIKLQljYXRjaCAiZXhlYyB0bXBkaXIvY2R0ZXN0ID50bXBkaXIvY2R0ZXN0Lm91dCIgZXhlY19vdXRwdXQKLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCSAgICBzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIgMQotCSAgICBmYWlsICR0ZXN0MgotCX0gZWxzZSB7Ci0JICAgIHNlbmRfbG9nICJkaWZmIHRtcGRpci9jZHRlc3Qub3V0ICRzcmNkaXIvJHN1YmRpci9jZHRlc3QuZGF0XG4iCi0JICAgIHZlcmJvc2UgImRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiCi0JICAgIGNhdGNoICJleGVjIGRpZmYgdG1wZGlyL2NkdGVzdC5vdXQgJHNyY2Rpci8kc3ViZGlyL2NkdGVzdC5kYXQiIGV4ZWNfb3V0cHV0Ci0JICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQkJcGFzcyAkdGVzdDIKLQkgICAgfSBlbHNlIHsKLQkJc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCQl2ZXJib3NlICIkZXhlY19vdXRwdXQiIDEKLQkJZmFpbCAkdGVzdDIKLQkgICAgfQotCX0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9hc20ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ1ZTE3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtY2hlY2tzL2FzbS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLnRleHQKLQkuZ2xvYmFsIGZvbwotZm9vOgotCS5sb25nIDB4MTIzNDU2NzgKLQotLmRhdGEKLQkuZ2xvYmFsIGJhcgotYmFyOgotCS5sb25nIDB4ODc2NTQzMjEKLQotCS5sY29tbSBkdW1teSwgMHgxMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9jaGVja3MuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZhZmUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3MvY2hlY2tzLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgTEQgc2VjdGlvbiBjaGVja3MgdGVzdHMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBOaWNrIENsaWZ0b24gKG5pY2tjQGN5Z251cy5jb20pCi0KLXByb2Mgc2VjdGlvbl9jaGVjayB7fSB7Ci0gICAgZ2xvYmFsIGxkX2ZsYWdzCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICAKLSAgICBzZXQgdGVzdCAiY2hlY2sgc2VjdGlvbnMgMSIKLSAgICAKLSAgICBzZXQgbGRmbGFncyAiLS1jaGVjay1zZWN0aW9ucyIKLQotICAgIGlmIHsgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL2FzbS5zIHRtcGRpci9hc20ub119IHsKLQl1bnJlc29sdmVkICR0ZXN0Ci0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL2FzbS54ICIkbGRmbGFncyB0bXBkaXIvYXNtLm8iXSB7Ci0JZmFpbCAkdGVzdAotICAgIH0gZWxzZSB7Ci0JcGFzcyAkdGVzdAotICAgIH0KLQotICAgIHNldCB0ZXN0ICJjaGVjayBzZWN0aW9ucyAyIgotCi0gICAgIyBDaGFuZ2UgdGhlIGxpbmtlciBmbGFncyBzbyB0aGF0IG91ciAiYnVnZ3kiIGxpbmtlcgotICAgICMgc2NyaXB0IGlzIHVzZWQuCi0gICAgc2V0IGxkZmxhZ3MgIi0tY2hlY2stc2VjdGlvbnMgLVQgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdCAtZSBmb28iCi0KLSAgICAjIFBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YgaW52b2tpbmcgbGRfc2ltcGxlX2xpbmsKLSAgICAjIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWFzc2FnZSB0aGUgb3V0cHV0IGZ1dGhlci4KLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgLW8gdG1wZGlyL2FzbS54ICRsZGZsYWdzIHRtcGRpci9hc20ubyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgICMgTWFrZSBzdXJlIHRoYXQgd2UgZ290IHNvbWUgb3V0cHV0IGZyb20gdGhlIGxpbmtlcgotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlmYWlsICR0ZXN0Ci0gICAgfSAKLQotICAgICMgTm93IHJlbW92ZSBvdXIgZXhwZWN0ZWQgZXJyb3IgbWVzc2FnZQotICAgIHJlZ3N1YiAtYWxsICIuKjogc2VjdGlvbiAuZGF0YSAuKiBvdmVybGFwcyBzZWN0aW9uIC50ZXh0IC4qIiAkZXhlY19vdXRwdXQgIiIgZXhlY19vdXRwdXQKLQotICAgICMgQW5kIGNoZWNrIHRvIHNlZSBpZiBhbnl0aGluZyBlbHNlLCAodW5leHBlY3RlZCkgd2FzIGxlZnQKLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcGFzcyAkdGVzdAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICJVbmV4cGVjdGVkIGxpbmtlciBtZXNzYWdlKHMpOiAkZXhlY19vdXRwdXQiCi0JZmFpbCAkdGVzdAotICAgIH0KLX0KLQotc2VjdGlvbl9jaGVjawotCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1jaGVja3Mvc2NyaXB0IGIvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YzZhMDguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWNoZWNrcy9zY3JpcHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVNFQ1RJT05TIHsKLSAgICAgICAgLnRleHQgMHgxMDAgOiAgICAgICAgICAgICB7ICooLnRleHQpIH0KLQkuZGF0YSAweDEwMCA6IEFUICgweDEwMCkgIHsgKiguZGF0YSkgfQotCS5ic3MgIDB4MTAwIDogQVQgKDB4NDAwMCkgeyAqKC5ic3MpICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZmFhOTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVycy5leHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MDggKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzaW9uIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgRXJpYyBZb3VuZ2RhbGUgKGVyaWNAYW5kYW50ZS5qaWMuY29tKQotCi0jCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gdGhlbiB7cmV0dXJufQotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gb24gYSBjb3VwbGUgb2YgRUxGIHBsYXRmb3Jtcy4KLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotIyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHRlc3QgdGhhdCBpcyB1c2VkIGluIGxkLXNoYXJlZCwgQlRXLgotaWYgeyAhW2lzdGFyZ2V0IGk/ODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotdW5peHdhcmVdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpPzg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk/ODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtNjhrLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgbWlwcyotKi1pcml4NSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjLSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotZWxmXSBcCi0gICAgICYmICFbaXN0YXJnZXQgc3BhcmMqLSotc29sYXJpczIqXQotICAgICAmJiAhW2lzdGFyZ2V0IGFscGhhKi0qLWxpbnV4Kl0gfSB7Ci0gICAgcmV0dXJuCi19Ci0KLWlmIHsgW2lzdGFyZ2V0IGk/ODYtKi1saW51eGFvdXQqXSBcCi0gICAgIHx8IFtpc3RhcmdldCBpPzg2LSotbGludXhvbGRsZCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0IG02OGstKi1saW51eGFvdXQqXSB9IHsKLSAgICByZXR1cm4KLX0KLQotaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotICAgIHJldHVybgotfQotCi1zZXQgZGlmZiBkaWZmCi1zZXQgdG1wZGlyIHRtcGRpcgotc2V0IFZPQkpEVU1QX0ZMQUdTIC0tcHJpdmF0ZS1oZWFkZXJzCi1zZXQgRE9CSkRVTVBfRkxBR1MgLS1keW5hbWljLXN5bXMKLXNldCBTT0JKRFVNUF9GTEFHUyAtLXN5bXMKLXNldCBzaGFyZWQgLS1zaGFyZWQKLXNldCBzY3JpcHQgLS12ZXJzaW9uLXNjcmlwdAotCi1wcm9jIHRlc3RfYXIgeyB0ZXN0IGxpYiBvYmplY3QgZXhwZWN0IH0gewotICAgIGdsb2JhbCBhcgotICAgIGdsb2JhbCBubQotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBkaWZmCi0KLSAgICB2ZXJib3NlIC1sb2cgIiRhciAtY3IgJHRtcGRpci8kbGliICR0bXBkaXIvJG9iamVjdCIKLSAgICBjYXRjaCAiZXhlYyAkYXIgLWNyICR0bXBkaXIvJGxpYiAkdG1wZGlyLyRvYmplY3QiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIAotICAgIHZlcmJvc2UgLWxvZyAiJG5tIC0tcHJpbnQtYXJtYXAgJHRtcGRpci8kbGliIHwgZ3JlcCBcIiBpbiBcIiB8IGVncmVwIFwiVkVSU1xcfGJhclxcfGZvb1wiIHwgc29ydCA+ICR0bXBkaXIvbm0ub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG5tIC0tcHJpbnQtYXJtYXAgJHRtcGRpci8kbGliIHwgZ3JlcCBcXFwgaW5cXFwgIHwgZWdyZXAgVkVSU1xcXHxiYXJcXFx8Zm9vIHwgc29ydCA+ICR0bXBkaXIvbm0ub3V0IiBleGVjX291dHB1dAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQljYXRjaCAiZXhlYyAkZGlmZiAtcSAkdG1wZGlyL25tLm91dCAkc3JjZGlyLyRzdWJkaXIvJGV4cGVjdCIgZXhlY19vdXRwdXQKLQlzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQlpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JICAgIHBhc3MgJHRlc3QKLQkgICAgcmV0dXJuCi0JfSBlbHNlIHsKLQkgICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdCIKLSAgICB9Ci19Ci0KLSMKLSMgb2JqZHVtcF9lbXB0eXN5bXN0dWZmCi0jCUNoZWNrIG5vbi1keW5hbWljIHN5bWJvbHMgYW5kIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm9uZSB3aXRoICdAJy4KLSMKLXByb2Mgb2JqZHVtcF9lbXB0eXN5bXN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIFNPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLQotICAgIGlmICFbaW5mbyBleGlzdHMgU09CSkRVTVBfRkxBR1NdIHsgc2V0IFNPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFNPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1xAL3AiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkU09CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvXEAvcCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0jIFdlIHNob3VsZG4ndCBnZXQgYW55dGhpbmcgaGVyZS4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0jIGl0IGlzIG5vdCBub3JtYWwgdG8gY29tZSBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl2ZXJib3NlIC1sb2cgIm9iamR1bXBfZW1wdHlzeW1zdHVmZjogZGlkIG5vdCBleHBlY3QgYW55IG91dHB1dCBmcm9tIG9iamR1bXAiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX2VtcHR5ZHluc3ltc3R1ZmYKLSMJQ2hlY2sgZHluYW1pYyBzeW1ib2xzIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vbmUgd2l0aCAnQCcuCi0jCi1wcm9jIG9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IH0gewotICAgIGdsb2JhbCBET0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFZPQkpEVU1QX0ZMQUdTXSB7IHNldCBWT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0jIFdlIHNob3VsZG4ndCBnZXQgYW55dGhpbmcgaGVyZS4KLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7IGlmIFtzdHJpbmcgbWF0Y2ggIipvYmpkdW1wOiAqOiBub3QgYSBkeW5hbWljIG9iamVjdCIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0jIGl0IGlzIG5vdCBub3JtYWwgdG8gY29tZSBoZXJlIC0gd2UgaGF2ZSBubyBvdXRwdXQgdG8gY29tcGFyZS4KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQl2ZXJib3NlIC1sb2cgIm9iamR1bXBfZW1wdHlkeW5zeW1zdHVmZjogZGlkIG5vdCBleHBlY3QgYW55IG91dHB1dCBmcm9tIG9iamR1bXAiCi0JcmV0dXJuIDAKLSAgICB9IH0KLX0KLQotIwotIyBvYmpkdW1wX2VtcHR5dmVyc3R1ZmYKLSMJTWFrZSBzdXJlIHRoZXJlIGlzIG5vIHZlcnNpb24gaW5mb3JtYXRpb24KLSMKLXByb2Mgb2JqZHVtcF9lbXB0eXZlcnN0dWZmIHsgb2JqZHVtcCBvYmplY3QgfSB7Ci0gICAgZ2xvYmFsIFZPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiB7W3doaWNoICRvYmpkdW1wXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRvYmpkdW1wIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBWT0JKRFVNUF9GTEFHU10geyBzZXQgVk9CSkRVTVBfRkxBR1MgIiIgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAkVk9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVmVyc2lvbi8sXFxcJHAgPiAkdG1wZGlyL29iamR1bXAub3V0IgotCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSMgaXQgaXMgbm9ybWFsIHRvIGZhaWwgaGVyZSAtIHdlIGhhdmUgbm8gb3V0cHV0IHRvIGNvbXBhcmUuCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgeyBpZiB7IFtzdHJpbmcgbWF0Y2ggIipsaWJjKiIgJGV4ZWNfb3V0cHV0XSB9IHRoZW4gewotIyB0aGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgdGhlcmUgaXMgdmVyc2lvbiBpbmZvcm1hdGlvbiBpbiBsaWJjLCBzbyB3ZQotIyBjYW4ndCByZWFsbHkgcGVyZm9ybSB0aGlzIHRlc3QuCi0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXZlcmJvc2UgLWxvZyAib2JqZHVtcF9lbXB0eXZlcnN0dWZmOiBkaWQgbm90IGV4cGVjdCBhbnkgb3V0cHV0IGZyb20gb2JqZHVtcCIKLQlyZXR1cm4gMAotICAgIH0gfQotCi19Ci0KLSMKLSMgb2JqZHVtcF9zeW1zdHVmZgotIwlEdW1wIG5vbi1keW5hbWljIHN5bWJvbCBzdHVmZiBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF9zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7Ci0gICAgZ2xvYmFsIFNPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIFNPQkpEVU1QX0ZMQUdTXSB7IHNldCBTT0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgZ3JlcCBcQCB8IHNvcnQgID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRTT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgZ3JlcCBcQCB8IHNvcnQgID4gJHRtcGRpci9vYmpkdW1wLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0KLSMgTm93IGRvIGEgbGluZS1ieS1saW5lIGNvbXBhcmlzb24gdG8gZWZmZWN0aXZlbHkgZGlmZiB0aGUgZGFybmVkIHRoaW5ncwotIyBUaGUgc3R1ZmYgY29taW5nIGZyb20gdGhlIGV4cGVjdGZpbGUgaXMgYWN0dWFsbHkgYSByZWdleCwgc28gd2UgY2FuCi0jIHNraXAgb3ZlciB0aGUgYWN0dWFsIGFkZHJlc3NlcyBhbmQgc28gZm9ydGguICBUaGlzIGlzIGN1cnJlbnRseSB2ZXJ5Ci0jIHNpbXBsZW1pbmRlZCAtIGl0IGV4cGVjdHMgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGluIHRlcm1zIG9mIGxpbmUKLSMgbnVtYmVycy4KLQotCWlmIFtmaWxlIGV4aXN0cyAkZXhwZWN0ZmlsZV0gdGhlbiB7Ci0JICAgIHNldCBmaWxlX2EgW29wZW4gJGV4cGVjdGZpbGUgcl0KLQl9IGVsc2UgewotCSAgICBwZXJyb3IgIiRleHBlY3RmaWxlIGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmIFtmaWxlIGV4aXN0cyAkdG1wZGlyL29iamR1bXAub3V0XSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYiBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0JfSBlbHNlIHsKLQkgICAgcGVycm9yICIkdG1wZGlyL29iamR1bXAub3V0IGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCi0JdmVyYm9zZSAiIyBEaWZmJ2luZzogJGV4cGVjdGZpbGUgJHRtcGRpci9vYmpkdW1wLm91dCIgMgotCi0Jc2V0IGVvZiAtMQotCXNldCBkaWZmZXJlbmNlcyAwCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2EgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9hCi0KLQl3aGlsZSB7IFtnZXRzICRmaWxlX2IgbGluZV0gIT0gJGVvZiB9IHsKLQkgICAgaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkJY29udGludWUKLQkgICAgfSBlbHNlIHsKLQkJbGFwcGVuZCBsaXN0X2IgJGxpbmUKLQkgICAgfQotCX0KLQljbG9zZSAkZmlsZV9iCi0JCi0JZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBpIH0gewotCSAgICBzZXQgbGluZV9hIFtsaW5kZXggJGxpc3RfYSAkaV0KLQkgICAgc2V0IGxpbmVfYiBbbGluZGV4ICRsaXN0X2IgJGldCi0JICAgIAotCi0JICAgIHZlcmJvc2UgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9hIiAzCi0JICAgIHZlcmJvc2UgIlx0L3RtcC9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiIDMKLQkgICAgaWYgW3JlZ2V4cCAkbGluZV9hICRsaW5lX2JdIHRoZW4gewotCQljb250aW51ZQotCSAgICB9IGVsc2UgewotCQl2ZXJib3NlIC1sb2cgIlx0JGV4cGVjdGZpbGU6ICRpOiAkbGluZV9hIgotCQl2ZXJib3NlIC1sb2cgIlx0JHRtcGRpci9vYmpkdW1wLm91dDogJGk6ICRsaW5lX2IiCi0JCQotCQlyZXR1cm4gMAotCSAgICB9Ci0JfQotCQotCWlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiTGluZSBjb3VudCIKLQkgICAgcmV0dXJuIDAKLQl9Ci0JCi0JaWYgJGRpZmZlcmVuY2VzPDEgdGhlbiB7Ci0JICAgIHJldHVybiAxCi0JfQotCQotCXJldHVybiAwCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0KLQotfQotCi0jCi0jIG9iamR1bXBfZHltc3ltc3R1ZmYKLSMJRHVtcCBkeW5hbWljIHN5bWJvbCBzdHVmZiBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF9keW5zeW1zdHVmZiB7IG9iamR1bXAgb2JqZWN0IGV4cGVjdGZpbGUgfSB7Ci0gICAgZ2xvYmFsIERPQkpEVU1QX0ZMQUdTCi0gICAgZ2xvYmFsIHZlcnNpb25fb3V0cHV0Ci0gICAgZ2xvYmFsIGRpZmYKLSAgICBnbG9iYWwgdG1wZGlyCi0KLSAgICBpZiAhW2luZm8gZXhpc3RzIERPQkpEVU1QX0ZMQUdTXSB7IHNldCBET0JKRFVNUF9GTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wICRET0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WRVJTL3BcXFw7L3Nob3cvcCB8IHNvcnQgfCB1bmlxICA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAkRE9CSkRVTVBfRkxBR1MgJG9iamVjdCB8IHNlZCAtbiAvVkVSUy9wXFxcOy9zaG93L3AgfCBzb3J0IHwgdW5pcSAgPiAkdG1wZGlyL29iamR1bXAub3V0IiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotIyBOb3cgZG8gYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbiB0byBlZmZlY3RpdmVseSBkaWZmIHRoZSBkYXJuZWQgdGhpbmdzCi0jIFRoZSBzdHVmZiBjb21pbmcgZnJvbSB0aGUgZXhwZWN0ZmlsZSBpcyBhY3R1YWxseSBhIHJlZ2V4LCBzbyB3ZSBjYW4KLSMgc2tpcCBvdmVyIHRoZSBhY3R1YWwgYWRkcmVzc2VzIGFuZCBzbyBmb3J0aC4gIFRoaXMgaXMgY3VycmVudGx5IHZlcnkKLSMgc2ltcGxlbWluZGVkIC0gaXQgZXhwZWN0cyBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgaW4gdGVybXMgb2YgbGluZQotIyBudW1iZXJzLgotCi0JaWYgW2ZpbGUgZXhpc3RzICRleHBlY3RmaWxlXSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYSBbb3BlbiAkZXhwZWN0ZmlsZSByXQotCX0gZWxzZSB7Ci0JICAgIHdhcm5pbmcgIiRleHBlY3RmaWxlIGRvZXNuJ3QgZXhpc3QiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmIFtmaWxlIGV4aXN0cyAkdG1wZGlyL29iamR1bXAub3V0XSB0aGVuIHsKLQkgICAgc2V0IGZpbGVfYiBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0JfSBlbHNlIHsKLQkgICAgZmFpbCAiJHRtcGRpci9vYmpkdW1wLm91dCBkb2Vzbid0IGV4aXN0IgotCSAgICByZXR1cm4gMAotCX0KLQotCXZlcmJvc2UgIiMgRGlmZidpbmc6ICRleHBlY3RmaWxlICR0bXBkaXIvb2JqZHVtcC5vdXQiIDIKLQotCXNldCBlb2YgLTEKLQlzZXQgZGlmZmVyZW5jZXMgMAotCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZV9hIGxpbmVdICE9ICRlb2YgfSB7Ci0JICAgIGlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCWxhcHBlbmQgbGlzdF9hICRsaW5lCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGVfYQotCi0Jd2hpbGUgeyBbZ2V0cyAkZmlsZV9iIGxpbmVdICE9ICRlb2YgfSB7Ci0JICAgIGlmIFtyZWdleHAgIl4jLiokIiAkbGluZV0gdGhlbiB7Ci0JCWNvbnRpbnVlCi0JICAgIH0gZWxzZSB7Ci0JCWxhcHBlbmQgbGlzdF9iICRsaW5lCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGVfYgotCQotCWZvciB7IHNldCBpIDAgfSB7ICRpIDwgW2xsZW5ndGggJGxpc3RfYl0gfSB7IGluY3IgaSB9IHsKLQkgICAgc2V0IGxpbmVfYiBbbGluZGV4ICRsaXN0X2IgJGldCi0JICAgIAotIyBUaGUgdGVzdHMgYXJlIHJpZ2dlZCBzbyB0aGF0IHdlIHNob3VsZCBuZXZlciBleHBvcnQgYSBzeW1ib2wgd2l0aCB0aGUKLSMgd29yZCAnaGlkZScgaW4gaXQuICBUaHVzIHdlIGp1c3Qgc2VhcmNoIGZvciBpdCwgYW5kIGJhaWwgaWYgd2UgZmluZCBpdC4KLQkgICAgaWYgW3JlZ2V4cCAiaGlkZSIgJGxpbmVfYl0gdGhlbiB7Ci0JCXZlcmJvc2UgLWxvZyAiXHQkdG1wZGlyL29iamR1bXAub3V0OiAkaTogJGxpbmVfYiIKLQkJCi0JCXJldHVybiAwCi0JICAgIH0KLQotCSAgICB2ZXJib3NlICJcdCRleHBlY3RmaWxlOiAkaTogJGxpbmVfYiIgMwotCi0JICAgICMgV2UgY2FuJ3QgYXNzdW1lIHRoYXQgdGhlIHNvcnQgaXMgY29uc2lzdGVudCBhY3Jvc3MKLQkgICAgIyBzeXN0ZW1zLCBzbyB3ZSBtdXN0IGNoZWNrIGVhY2ggcmVnZXhwLiAgV2hlbiB3ZSBmaW5kIGEKLQkgICAgIyByZWdleHAsIHdlIG51bGwgaXQgb3V0LCBzbyB3ZSBkb24ndCBtYXRjaCBpdCB0d2ljZS4KLQkgICAgZm9yIHsgc2V0IGogMCB9IHsgJGogPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBqIH0gewotCQlzZXQgbGluZV9hIFtsaW5kZXggJGxpc3RfYSAkal0KLQotCQlpZiBbcmVnZXhwICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7Ci0JCSAgICBscmVwbGFjZSAkbGlzdF9hICRqICRqICJDQU4gTk9UIE1BVENIIgotCQkgICAgYnJlYWsKLQkJfQotCSAgICB9Ci0KLQkgICAgaWYgeyAkaiA+PSBbbGxlbmd0aCAkbGlzdF9hXSB9IHsKLQkJdmVyYm9zZSAtbG9nICJcdCR0bXBkaXIvb2JqZHVtcC5vdXQ6ICRpOiAkbGluZV9iIgotCQkKLQkJcmV0dXJuIDAKLQkgICAgfQotCX0KLQkKLQlpZiB7IFtsbGVuZ3RoICRsaXN0X2FdICE9IFtsbGVuZ3RoICRsaXN0X2JdIH0gewotCSAgICB2ZXJib3NlIC1sb2cgIkxpbmUgY291bnQiCi0JICAgIHJldHVybiAwCi0JfQotCQotCWlmICRkaWZmZXJlbmNlczwxIHRoZW4gewotCSAgICByZXR1cm4gMQotCX0KLQkKLQlyZXR1cm4gMAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci0KLX0KLQotIwotIyBvYmpkdW1wX3ZlcnNpb25zdHVmZgotIwlEdW1wIHZlcnNpb24gZGVmaW5pdGlvbnMvcmVmZXJlbmNlcyBhbmQgbWFrZSBzdXJlIHRoYXQgaXQgaXMgc2FuZS4KLSMKLXByb2Mgb2JqZHVtcF92ZXJzaW9uc3R1ZmYgeyBvYmpkdW1wIG9iamVjdCBleHBlY3RmaWxlIH0gewotICAgIGdsb2JhbCBWT0JKRFVNUF9GTEFHUwotICAgIGdsb2JhbCB2ZXJzaW9uX291dHB1dAotICAgIGdsb2JhbCBkaWZmCi0gICAgZ2xvYmFsIHRtcGRpcgotCi0gICAgaWYge1t3aGljaCAkb2JqZHVtcF0gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkb2JqZHVtcCBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgVk9CSkRVTVBfRkxBR1NdIHsgc2V0IFZPQkpEVU1QX0ZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG9iamR1bXAgJFZPQkpEVU1QX0ZMQUdTICRvYmplY3QgfCBzZWQgLW4gL1ZlcnNpb24vLFxcXCRwID4gJHRtcGRpci9vYmpkdW1wLm91dCIKLQotICAgIGNhdGNoICJleGVjICRvYmpkdW1wICRWT0JKRFVNUF9GTEFHUyAkb2JqZWN0IHwgc2VkIC1uIC9WZXJzaW9uLyxcXFwkcCA+ICR0bXBkaXIvb2JqZHVtcC5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCi0JIyBJdCdzIE9LIGlmIHRoZXJlIGFyZSBleHRyYSBsaW5lcyBpbiB0aGUgYWN0dWFsIG91dHB1dDsgdGhleQotCSMgbWF5IGNvbWUgZnJvbSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIGxpYmMuICBXZSByZXF1aXJlIHRoYXQKLQkjIGV2ZXJ5IGxpbmUgaW4gRVhQRUNURklMRSBhcHBlYXIgaW4gdGhlIG91dHB1dCBpbiBvcmRlci4KLQotCXNldCBmMSBbb3BlbiAkdG1wZGlyL29iamR1bXAub3V0IHJdCi0Jc2V0IGYyIFtvcGVuICRleHBlY3RmaWxlIHJdCi0JZ2V0cyAkZjIgbDIKLQl3aGlsZSB7IFtnZXRzICRmMSBsMV0gIT0gLTEgfSB7Ci0JICAgIGlmIHsgW3N0cmluZyBtYXRjaCAkbDIgJGwxXSB9IHRoZW4gewotCQlpZiB7IFtnZXRzICRmMiBsMl0gPT0gLTEgfSB0aGVuIHsKLQkJICAgIGNsb3NlICRmMQotCQkgICAgY2xvc2UgJGYyCi0JCSAgICByZXR1cm4gMQotCQl9Ci0JICAgIH0KLQl9Ci0KLQkjIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgb3V0cHV0IHdpdGhvdXQgc2VlaW5nIHRoZSBsaW5lIHdlCi0JIyBleHBlY3RlZC4gIFRoaXMgaXMgYSB0ZXN0IGZhaWx1cmUuCi0KLQljbG9zZSAkZjEKLQljbG9zZSAkZjIKLQotCXZlcmJvc2UgLWxvZyAiRGlkIG5vdCBmaW5kIFwiJGwyXCIiCi0Jc2V0IGYxIFtvcGVuICR0bXBkaXIvb2JqZHVtcC5vdXQgcl0KLQl3aGlsZSB7IFtnZXRzICRmMSBsMV0gIT0gLTEgfSB7Ci0JICAgIHZlcmJvc2UgLWxvZyAkbDEKLQl9Ci0KLQl2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLQlyZXR1cm4gMAotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLXByb2MgYnVpbGRfdmVyc19saWIgeyB0ZXN0IHNvdXJjZSBsaWJuYW1lIG90aGVyIG1hcGZpbGUgdmVyZXhwIHZlcnN5bWV4cCBzeW1leHAgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBvYmpkdW1wCi0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIENGTEFHUwotICAgIGdsb2JhbCBzaGFyZWQKLSAgICBnbG9iYWwgc2NyaXB0Ci0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRsaWJuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kbGlibmFtZS5zICR0bXBkaXIvJGxpYm5hbWUubyBdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkb3RoZXJdIHRoZW4gewotCXNldCBvdGhlcl9saWIgIiIKLSAgICB9IGVsc2UgewotCXNldCBvdGhlcl9saWIgJHRtcGRpci8kb3RoZXIKLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRtYXBmaWxlXSB0aGVuIHsKLQlzZXQgc2NyaXB0X2FyZyAiIgotICAgIH0gZWxzZSB7Ci0Jc2V0IHNjcmlwdF9hcmcgIiRzY3JpcHQgJHNyY2Rpci8kc3ViZGlyLyRtYXBmaWxlIgotICAgIH0KLQotICAgIGlmIHshW2xkX3NpbXBsZV9saW5rICRsZCAkdG1wZGlyLyRsaWJuYW1lLnNvICIkc2hhcmVkICR0bXBkaXIvJGxpYm5hbWUubyAkb3RoZXJfbGliICRzY3JpcHRfYXJnIl19ICAgICB7Ci0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcmV4cCBdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJHN5bWV4cF0gdGhlbiB7Ci0JaWYgeyFbb2JqZHVtcF9lbXB0eXN5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGxpYm5hbWUubyBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbb2JqZHVtcF9zeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRsaWJuYW1lLm8gJHNyY2Rpci8kc3ViZGlyLyRzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci0gICAgCi19Ci0KLXByb2MgdGVzdF9sZGZhaWwgeyB0ZXN0IGZsYWcgc291cmNlIGV4ZWNuYW1lIG90aGVyIG1hcGZpbGUgd2h5ZmFpbCB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCBleGVjX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLSAgICBnbG9iYWwgdG1wZGlyCi0gICAgZ2xvYmFsIGFzCi0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0gICAgZ2xvYmFsIHNjcmlwdAotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkb3RoZXJdIHRoZW4gewotCXNldCBvdGhlcl9saWIgIiIKLSAgICB9IGVsc2UgewotCXNldCBvdGhlcl9saWIgJHRtcGRpci8kb3RoZXIKLSAgICB9Ci0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkZmxhZyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRleGVjbmFtZS5zXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIGlmICFbbGRfYXNzZW1ibGUgJGFzICR0bXBkaXIvJGV4ZWNuYW1lLnMgJHRtcGRpci8kZXhlY25hbWUubyBdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICJUaGlzIGxpbmsgc2hvdWxkIGZhaWwgYmVjYXVzZSBvZiAkd2h5ZmFpbCIKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJG1hcGZpbGVdIHRoZW4gewotCXNldCBzY3JpcHRfYXJnICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgc2NyaXB0X2FyZyAiJHNjcmlwdCAkc3JjZGlyLyRzdWJkaXIvJG1hcGZpbGUiCi0gICAgfQotCi0gICAgaWYgeyFbbGRfbGluayAkbGQgJHRtcGRpci8kZXhlY25hbWUgIiR0bXBkaXIvJGV4ZWNuYW1lLm8gJG90aGVyX2xpYiAkc2NyaXB0X2FyZyJdfSAgICAgewotCXBhc3MgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLSAgICBmYWlsICIkdGVzdCIKLX0KLQotcHJvYyB0ZXN0X2FzZmFpbCB7IHRlc3QgZmxhZyBzb3VyY2UgZXhlY25hbWUgd2h5ZmFpbCB9IHsKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgYXMKLSAgICBnbG9iYWwgQ0MKLSAgICBnbG9iYWwgQ0ZMQUdTCi0KLSAgICBpZiAhW2xkX2NvbXBpbGUgIiRDQyAtUyAkZmxhZyAkQ0ZMQUdTIiAkc3JjZGlyLyRzdWJkaXIvJHNvdXJjZSAkdG1wZGlyLyRleGVjbmFtZS5zXSAgICAgewotCXVucmVzb2x2ZWQgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiVGhpcyBhc3NlbWJsZSBzaG91bGQgZmFpbCBiZWNhdXNlIG9mICR3aHlmYWlsIgotICAgIGNhdGNoICJleGVjICRhcyAtbyAkdG1wZGlyLyRleGVjbmFtZS5vICR0bXBkaXIvJGV4ZWNuYW1lLnMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotCWZhaWwgIiR0ZXN0IgotCXJldHVybgotICAgIH0KLSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLSAgICBwYXNzICIkdGVzdCIKLX0KLQotcHJvYyB0ZXN0X3N0cmlwX3ZlcnNfbGliIHsgdGVzdCBzcmNsaWIgbGlibmFtZSB2ZXJleHAgdmVyc3ltZXhwIH0gewotICAgIGdsb2JhbCBzdHJpcAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLSAgICBnbG9iYWwgb2JqZHVtcAotCi0gICAgdmVyYm9zZSAtbG9nICJjcCAkdG1wZGlyLyRzcmNsaWIgJHRtcGRpci8kbGlibmFtZS5zbyIKLSAgICBleGVjIGNwICR0bXBkaXIvJHNyY2xpYiAkdG1wZGlyLyRsaWJuYW1lLnNvCi0KLSAgICB2ZXJib3NlIC1sb2cgIiRzdHJpcCAkdG1wZGlyLyRsaWJuYW1lLnNvIgotICAgIGNhdGNoICJleGVjICRzdHJpcCAkdG1wZGlyLyRsaWJuYW1lLnNvIiBleGVjX291dHB1dAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQotIyBJZiBzdHJpcCB3ZW50IE9LLCB0aGVuIHJ1biB0aGUgdXN1YWwgdGVzdHMgb24gdGhlIHRoaW5nIHRvIG1ha2Ugc3VyZSB0aGF0Ci0jIGl0IGlzIHNhbmUuCi0JaWYgeyFbb2JqZHVtcF92ZXJzaW9uc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcmV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotCQotCWlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kbGlibmFtZS5zbyAkc3JjZGlyLyRzdWJkaXIvJHZlcnN5bWV4cCBdfSAgICAgewotCSAgICBmYWlsICIkdGVzdCIKLQkgICAgcmV0dXJuCi0JfQotCQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JZmFpbCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIHBhc3MgJHRlc3QKLX0KLQotCi1wcm9jIGJ1aWxkX2V4ZWMgeyB0ZXN0IHNvdXJjZSBleGVjbmFtZSBmbGFncyBzb2xpYm5hbWUgdmVyZXhwIHZlcnN5bWV4cCBzeW1leHAgfSB7Ci0gICAgZ2xvYmFsIGxkCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIHRtcGRpcgotICAgIGdsb2JhbCBhcwotICAgIGdsb2JhbCBvYmpkdW1wCi0gICAgZ2xvYmFsIENDCi0gICAgZ2xvYmFsIENGTEFHUwotCi0gICAgc2V0IHNoYXJlZCAtLXNoYXJlZAotICAgIHNldCBzY3JpcHQgLS12ZXJzaW9uLXNjcmlwdAotICAgIGlmICFbbGRfY29tcGlsZSAiJENDIC1TICRDRkxBR1MiICRzcmNkaXIvJHN1YmRpci8kc291cmNlICR0bXBkaXIvJGV4ZWNuYW1lLnNdICAgICB7Ci0JdW5yZXNvbHZlZCAiJHRlc3QiCi0JcmV0dXJuCi0gICAgfQotCi0gICAgaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHRtcGRpci8kZXhlY25hbWUucyAkdG1wZGlyLyRleGVjbmFtZS5vIF0gICAgIHsKLQl1bnJlc29sdmVkICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRzb2xpYm5hbWVdIHRoZW4gewotCXNldCBzb2xpYm5hbWVfbGliICIiCi0gICAgfSBlbHNlIHsKLQlzZXQgc29saWJuYW1lX2xpYiAkdG1wZGlyLyRzb2xpYm5hbWUKLSAgICB9Ci0KLSAgICBpZiB7IVtsZF9saW5rICRsZCAkdG1wZGlyLyRleGVjbmFtZSAiJGZsYWdzICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHNvbGlibmFtZV9saWIiXX0gICAgIHsKLQlmYWlsICIkdGVzdCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICR2ZXJleHBdIHRoZW4gewotIwotIyBNYWtlIHN1cmUgd2UgZ2V0IG5vdGhpbmcgYmFjay4KLSMKLQlpZiB7IVtvYmpkdW1wX2VtcHR5dmVyc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfdmVyc2lvbnN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lICRzcmNkaXIvJHN1YmRpci8kdmVyZXhwIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiIiAkdmVyc3ltZXhwXSB0aGVuIHsKLQlpZiB7IVtvYmpkdW1wX2VtcHR5ZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9IGVsc2UgewotCWlmIHshW29iamR1bXBfZHluc3ltc3R1ZmYgJG9iamR1bXAgJHRtcGRpci8kZXhlY25hbWUgJHNyY2Rpci8kc3ViZGlyLyR2ZXJzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRzeW1leHBdIHRoZW4gewotCWlmIHshW29iamR1bXBfZW1wdHlzeW1zdHVmZiAkb2JqZHVtcCAkdG1wZGlyLyRleGVjbmFtZS5vIF19ICAgICB7Ci0JICAgIGZhaWwgIiR0ZXN0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfSBlbHNlIHsKLQlpZiB7IVtvYmpkdW1wX3N5bXN0dWZmICRvYmpkdW1wICR0bXBkaXIvJGV4ZWNuYW1lLm8gJHNyY2Rpci8kc3ViZGlyLyRzeW1leHAgXX0gICAgIHsKLQkgICAgZmFpbCAiJHRlc3QiCi0JICAgIHJldHVybgotCX0KLSAgICB9Ci0KLSAgICBwYXNzICR0ZXN0Ci19Ci0KLQotIwotIyBCYXNpYyB0ZXN0IC0gYnVpbGQgYSBsaWJyYXJ5IHdpdGggdmVyc2lvbmVkIHN5bWJvbHMuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczEiIHZlcnMxLmMgdmVyczEgIiIgdmVyczEubWFwIHZlcnMxLnZlciB2ZXJzMS5kc3ltIHZlcnMxLnN5bQotCi0KLSMKLSMgVGVzdCAjMiAtIGJ1aWxkIGEgbGlicmFyeSwgYW5kIGxpbmsgaXQgYWdhaW5zdCB0aGUgbGlicmFyeSB3ZSBidWlsdCBpbiBzdGVwCi0jIDEuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczIiIHZlcnMyLmMgdmVyczIgdmVyczEuc28gdmVyczIubWFwIHZlcnMyLnZlciB2ZXJzMi5kc3ltICIiCi0KLSMKLSMgVGVzdCAjMyAtIGJ1aWxkIGFuIGV4ZWN1dGFibGUsIGFuZCBsaW5rIGl0IGFnYWluc3QgdmVyczEuc28uCi0jCi1idWlsZF9leGVjICJ2ZXJzMyIgdmVyczMuYyB2ZXJzMyAiIiB2ZXJzMS5zbyB2ZXJzMy52ZXIgdmVyczMuZHN5bSAiIgotCi0jCi0jIFRlc3QgIzQgLSBNYWtlIHN1cmUgYSB2ZXJzaW9uIGltcGxpY2l0bHkgZGVmaW5lZCBpbiBhbiBleGVjdXRhYmxlCi0jIGNhdXNlcyBhIHZlcnNpb24gbm9kZSB0byBiZSBjcmVhdGVkLiAgVmVyaWZ5IHRoaXMgYm90aCB3aXRoIGFuZCB3aXRob3V0Ci0jIC0tZXhwb3J0LWR5bmFtaWMuCi0jCi0KLSMgVGhpcyB0ZXN0IGZhaWxzIG9uIE1JUFMuICBPbiB0aGUgTUlQUyB3ZSBtdXN0IHB1dCBmb28gaW4gdGhlIGR5bmFtaWMKLSMgc3ltYm9sIHRhYmxlLCB3aGljaCB0aGUgdGVzdCBkb2VzIG5vdCBleHBlY3QuCi1zZXR1cF94ZmFpbCAibWlwcyotKi0qIgotYnVpbGRfZXhlYyAidmVyczQiIHZlcnM0LmMgdmVyczQgIiIgIiIgIiIgIiIgdmVyczQuc3ltCi0KLWJ1aWxkX2V4ZWMgInZlcnM0YSIgdmVyczQuYyB2ZXJzNGEgIi1leHBvcnQtZHluYW1pYyIgIiIgdmVyczRhLnZlciB2ZXJzNGEuZHN5bSB2ZXJzNGEuc3ltCi0KLQotIwotIyBUcnkgbXVsdGlwbGUgZGVmaW5pdGlvbnMgZm9vQEJBUiBhbmQgZm9vQEBCQVIgYW5kIG1ha2Ugc3VyZSB0aGUgbGlua2VyCi0jIGNvbXBsYWlucy4KLSMKLXRlc3RfbGRmYWlsICJ2ZXJzNSIgIiIgdmVyczUuYyB2ZXJzNSAiIiAiIiAibXVsdGlwbGUgZGVmaW5pdGlvbiBvZiBmb29AVkVSU18xLjIiCi0KLSMKLSMKLSMgTm93IGJ1aWxkIGEgdGVzdCB0aGF0IHNob3VsZCByZWZlcmVuY2UgYSBidW5jaCBvZiB2ZXJzaW9uZWQgc3ltYm9scy4KLSMgQWxsIG9mIHRoZW0gc2hvdWxkIGJlIGNvcnJlY3RseSByZWZlcmVuY2VkLgotIwotYnVpbGRfZXhlYyAidmVyczYiIHZlcnM2LmMgdmVyczYgIiIgdmVyczEuc28gdmVyczYudmVyIHZlcnM2LmRzeW0gdmVyczYuc3ltCi0KLSMKLSMgQW5vdGhlciB0ZXN0IHRvIHZlcmlmeSB0aGF0IHNvbWV0aGluZyBtYWRlIGxvY2FsIHZpYSAnbG9jYWwnIGlzIHRydWx5IG5vdAotIyBhY2Nlc3NpYmxlLgotIwotYnVpbGRfdmVyc19saWIgInZlcnM3YSIgdmVyczdhLmMgdmVyczdhICIiIHZlcnM3Lm1hcCB2ZXJzN2EudmVyIHZlcnM3YS5kc3ltIHZlcnM3YS5zeW0KLQotdGVzdF9sZGZhaWwgInZlcnM3IiAiIiB2ZXJzNy5jIHZlcnM3IHZlcnM3YS5zbyAiIiAidW5kZWZpbmVkIHJlZmVyZW5jZSB0byBoaWRlX2EiCi0KLQotIwotIyBUaGlzIHRlc3QgaXMgZGVzaWduZWQgdG8gdmVyaWZ5IHRoYXQgd2UgY2FuIHBhc3MgYSBsaW5rZXIgc2NyaXB0IG9uIHRoZQotIyBjb21tYW5kIGxpbmUgYXMgaWYgaXQgd2VyZSBhIG5vcm1hbCAubyBmaWxlLgotIwotY2F0Y2ggImV4ZWMgY3AgJHNyY2Rpci8kc3ViZGlyL3ZlcnM4Lm1hcCAkdG1wZGlyLyIgaWdub3JlX291dHB1dAotYnVpbGRfdmVyc19saWIgInZlcnM4IiB2ZXJzMS5jIHZlcnM4IHZlcnM4Lm1hcCAiIiB2ZXJzOC52ZXIgdmVyczEuZHN5bSB2ZXJzMS5zeW0KLQotIwotIyBUaGlzIHRlc3QgdHJpZXMgdG8gbWFrZSBzdXJlIHRoYXQgdmVyc2lvbiByZWZlcmVuY2VzIHRvIHZlcnNpb25lZCBzeW1ib2xzCi0jIGRvbid0IGNvbGxpZGUgd2l0aCBkZWZhdWx0IGRlZmluaXRpb25zIHdpdGggdGhlIHNhbWUgc3ltYm9sLgotIwotYnVpbGRfZXhlYyAidmVyczkiIHZlcnM5LmMgdmVyczkgIi1leHBvcnQtZHluYW1pYyIgIiIgdmVyczkudmVyIHZlcnM5LmRzeW0gdmVyczkuc3ltCi0KLQotIwotIyBUcnkgYW5kIHVzZSBhIG5vbi1leGlzdGFudCB2ZXJzaW9uIG5vZGUuICBUaGUgbGlua2VyIHNob3VsZCBmYWlsIHdpdGgKLSMgYW4gZXJyb3IgbWVzc2FnZS4KLSMKLXRlc3RfbGRmYWlsICJ2ZXJzMTAiICItRERPX1RFU1QxMCIgdmVyczEuYyB2ZXJzMTAgIiIgInZlcnMxLm1hcCAtLXNoYXJlZCIgImludmFsaWQgdmVyc2lvbiIKLQotIwotIyBUcnkgYW5kIHNvbWUgdGhpbmdzIHRoZSBhc3NlbWJsZXIgc2hvdWxkIGNvbXBsYWluIGFib3V0LgotIwotdGVzdF9hc2ZhaWwgInZlcnMxMSIgIi1ERE9fVEVTVDExIiB2ZXJzMS5jIHZlcnMxMSAibm8gQCBpbiBzeW12ZXIiCi0KLXRlc3RfYXNmYWlsICJ2ZXJzMTIiICItRERPX1RFU1QxMiIgdmVyczEuYyB2ZXJzMTIgImV4dGVybiB2ZXJzaW9uIGRlZmluaXRpb24iCi0KLSMKLSMgUHV0IGEgc2hhcmVkIGxpYnJhcnkgaW4gYW4gYXJjaGl2ZSBsaWJyYXJ5LCBhbmQgbWFrZSBzdXJlIHRoZSBnbG9iYWwKLSMgYXJjaGl2ZSBzeW1ib2wgdGFibGUgaXMgc2FuZS4KLSMKLXRlc3RfYXIgImFyIHdpdGggdmVyc2lvbmVkIHNvbGliIiB2ZXJzMTMuYSB2ZXJzMS5zbyB2ZXJzMTMuYXN5bQotCi0jCi0jIFN0cmlwIGEgc2hhcmVkIGxpYnJhcnksIGFuZCBtYWtlIHN1cmUgd2UgZGlkbid0IHNjcmV3IHNvbWV0aGluZyB1cCBpbiB0aGVyZS4KLSMKLXRlc3Rfc3RyaXBfdmVyc19saWIgInZlcnMxNCIgdmVyczEuc28gdmVyczE0IHZlcnMxLnZlciB2ZXJzMS5kc3ltIAotCi0KLSMKLSMgQnVpbGQgYW5vdGhlciB0ZXN0IHdpdGggc29tZSB2ZXJzaW9uZWQgc3ltYm9scy4gIEhlcmUgd2UgYXJlIGdvaW5nIHRvIAotIyB0cnkgYW5kIG92ZXJyaWRlIHNvbWV0aGluZyBmcm9tIHRoZSBsaWJyYXJ5LCBhbmQgd2Ugc2hvdWxkbid0IGdldAotIyBhbnkgZXJyb3JzLgotIwotYnVpbGRfZXhlYyAidmVyczE1IiB2ZXJzMTUuYyB2ZXJzMTUgIiIgdmVyczEuc28gdmVyczE1LnZlciB2ZXJzMTUuZHN5bSB2ZXJzMTUuc3ltCi0KLSMKLSMgVGVzdCB0aGF0IHdoZW4gd2Ugb3ZlcnJpZGUgYSB2ZXJzaW9uZWQgc3ltYm9sIGZyb20gdGhlIGxpYnJhcnkgdGhpcwotIyBzeW1ib2wgYXBwZWFycyBpbiB0aGUgZHluYW1pYyBzeW1ib2wgdGFibGUgb2YgdGhlIGV4ZWN1dGFibGUuCi0jCi1idWlsZF92ZXJzX2xpYiAidmVyczE2YSIgdmVyczE2YS5jIHZlcnMxNmEgIiIgdmVyczE2Lm1hcCB2ZXJzMTZhLnZlciB2ZXJzMTZhLmRzeW0gIiIKLWJ1aWxkX2V4ZWMgInZlcnMxNiIgdmVyczE2LmMgdmVyczE2ICIiIHZlcnMxNmEuc28gIiIgdmVyczE2LmRzeW0gIiIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDQxZmQ5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogQmFzaWMgdGVzdCBvZiB2ZXJzaW9uaW5nLiAgVGhlIGlkZWEgd2l0aCB0aGlzIGlzIHRoYXQgd2UgZGVmaW5lCi0gKiBhIGJ1bmNoIG9mIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHN5bWJvbCwgYW5kIHdlIGNhbiB0aGVvcmV0aWNhbGx5Ci0gKiB0aGVuIGxpbmsgYXBwbGljYXRpb25zIGFnYWluc3QgdmFyeWluZyBzZXRzIG9mIHRoZXNlLgotICovCi1jb25zdCBjaGFyICogc2hvd19iYXIxID0gImFzZGYiOwotY29uc3QgY2hhciAqIHNob3dfYmFyMiA9ICJhc2RmIjsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi0vKgotICogVGhlICdoaWRlJyBwcmVmaXggaXMgc29tZXRoaW5nIHNvIHRoYXQgd2UgY2FuIGF1dG9tYXRpY2FsbHkgc2VhcmNoIHRoZQotICogc3ltYm9sIHRhYmxlIGFuZCB2ZXJpZnkgdGhhdCBub25lIG9mIHRoZXNlIHN5bWJvbHMgd2VyZSBhY3R1YWxseSBleHBvcnRlZC4KLSAqLwotaW50Ci1oaWRlX29yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX29sZF9mb28oKQotewotCXJldHVybiAxMCtiYXIoKTsKLQotfQotCi1pbnQKLWhpZGVfb2xkX2ZvbzEoKQotewotCXJldHVybiAxMDArYmFyKCk7Ci0KLX0KLQotaW50Ci1oaWRlX25ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgaGlkZV9vcmlnaW5hbF9mb28sc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfb2xkX2ZvbyxzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBoaWRlX29sZF9mb28xLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGhpZGVfbmV3X2ZvbyxzaG93X2Zvb0BAVkVSU18yLjAiKTsKLQotCi0KLSNpZmRlZiBET19URVNUMTAKLS8qIEluIHRlc3QgMTAsIHdlIHRyeSBhbmQgZGVmaW5lIGEgbm9uLWV4aXN0YW50IHZlcnNpb24gbm9kZS4gIFRoZSBsaW5rZXIKLSAqIHNob3VsZCBjYXRjaCB0aGlzIGFuZCBjb21wbGFpbi4gKi8KLWludAotaGlkZV9uZXdfYm9ndXNfZm9vKCkKLXsKLQlyZXR1cm4gMTAwMCtiYXIoKTsKLQotfQotX19hc21fXygiLnN5bXZlciBoaWRlX25ld19ib2d1c19mb28sc2hvd19mb29AVkVSU18yLjIiKTsKLSNlbmRpZgotCi0KLQotCi0jaWZkZWYgRE9fVEVTVDExCi0vKgotICogVGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIGNhdGNoIGEgY291cGxlIG9mIHN5bnRhY3RpYyBlcnJvcnMuICBUaGUgYXNzZW1ibGVyCi0gKiBzaG91bGQgY29tcGxhaW4gYWJvdXQgYm90aCBvZiB0aGUgZGlyZWN0aXZlcyBiZWxvdy4KLSAqLwotaW50Ci14eXp6eigpCi17Ci0gIG5ldzJfZm9vKCk7Ci0gIGJhcjMzKCk7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgbmV3Ml9mb28sZm9vVkVSU18yLjAiKTsKLV9fYXNtX18oIi5zeW12ZXIgYmFyMzMsYmFyQEBWRVJTXzIuMCIpOwotI2VuZGlmCi0KLSNpZmRlZiBET19URVNUMTIKLS8qCi0gKiBUaGlzIHRlc3QgaXMgZGVzaWduZWQgdG8gY2F0Y2ggYSBjb3VwbGUgb2Ygc3ludGFjdGljIGVycm9ycy4gIFRoZSBhc3NlbWJsZXIKLSAqIHNob3VsZCBjb21wbGFpbiBhYm91dCBib3RoIG9mIHRoZSBkaXJlY3RpdmVzIGJlbG93LgotICovCi1pbnQKLXh5enp6KCkKLXsKLSAgbmV3Ml9mb28oKTsKLSAgYmFyMzMoKTsKLX0KLQotX19hc21fXygiLnN5bXZlciBiYXIzMyxiYXJAQFZFUlNfMi4wIik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzQ0MzRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzBdKiBnICAgIERPIFwqQUJTXCoJWzBdKiAgVkVSU18yLjAgICAgVkVSU18yLjAKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChCYXNlXCkgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qIFwoVkVSU18xLjFcKSAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4yXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwotWzAtOWEtZl0qIGcgICAgRE8gKC5zP2RhdGF8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzIuMCAgICBzaG93X2JhcjEKLVswLTlhLWZdKiBnICAgIERPICgucz9kYXRhfFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgc2hvd19iYXIyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzM3YmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEubWFwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotVkVSU18xLjEgewotCSBnbG9iYWw6Ci0JCSBmb28xOwotCSBsb2NhbDoKLQkJIGhpZGVfb2xkKjsgCi0JCSBoaWRlX29yaWdpbmFsKjsgCi0JCSBoaWRlX25ldyo7IAotfTsKLQotVkVSU18xLjIgewotCQkgZm9vMjsKLX0gVkVSU18xLjE7Ci0KLVZFUlNfMi4wIHsKLQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotfSBWRVJTXzEuMjsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmZjg1NS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4yCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczEudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTczMTJiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBhMjY4ODFmIHRtcGRpci92ZXJzMS5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKLTMgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0JVkVSU18xLjEgCi00IDB4MDAgMHgwYTc5MjJiMCBWRVJTXzIuMAotCVZFUlNfMS4yIAotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTMuYXN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ2MTQ0Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxMy5hc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotVkVSU18xLjEgaW4gdmVyczEuc28KLVZFUlNfMS4yIGluIHZlcnMxLnNvCi1WRVJTXzIuMCBpbiB2ZXJzMS5zbwotYmFyIGluIHZlcnMxLnNvCi1zaG93X2JhcjEgaW4gdmVyczEuc28KLXNob3dfYmFyMiBpbiB2ZXJzMS5zbwotc2hvd19mb29AIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BAVkVSU18yLjAgaW4gdmVyczEuc28KLXNob3dfZm9vQFZFUlNfMS4xIGluIHZlcnMxLnNvCi1zaG93X2Zvb0BWRVJTXzEuMiBpbiB2ZXJzMS5zbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyYmUzZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byBtYWtlIHN1cmUgdGhhdCBpZiB3ZSBleHRlcm5hbGx5IHJlZmVyZW5jZSBhIHZlcnNpb25lZCBzeW1ib2wKLSAqIHRoYXQgd2UgYWx3YXlzIGdldCB0aGUgcmlnaHQgb25lLgotICovCi0KLWludAotZm9vXzEoKQotewotICByZXR1cm4gMTAzNDsKLX0KLQotaW50Ci1mb29fMigpCi17Ci0gIHJldHVybiAxMzQzOwotfQotCi1pbnQKLWZvb18zKCkKLXsKLSAgcmV0dXJuIDEzMzQ7Ci19Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiRXhwZWN0IDQsICAgIGdldCAlZFxuIiwgZm9vXzEoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEzLCAgIGdldCAlZFxuIiwgZm9vXzIoKSk7Ci0gIHByaW50ZigiRXhwZWN0IDEwMywgIGdldCAlZFxuIiwgZm9vXzMoKSk7Ci0gIHJldHVybiAwOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIGZvb18xLHNob3dfZm9vQCIpOwotX19hc21fXygiLnN5bXZlciBmb29fMixzaG93X2Zvb0BWRVJTXzEuMSIpOwotX19hc21fXygiLnN5bXZlciBmb29fMyxzaG93X2Zvb0BAVkVSU18xLjIiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNWUxNWMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKEJhc2VcKSAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogXChWRVJTXzEuMVwpICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzEuMiAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTUuc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2JhYjYyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQFZFUlNfMS4xCi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vQEBWRVJTXzEuMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmVjNTguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE1LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBkOGEyNjA1IHRtcGRpci92ZXJzMTUKLTIgMHgwMCAweDBhNzkyN2IyIFZFUlNfMS4yCi0zIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjY4YmM2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotaW50IHNob3dfYmFyICgpCi17Ci0gIHJldHVybiAwOwotfQotZXh0ZXJuIGludCBzaG93X2ZvbyAoKTsKLQotaW50IG1haW4gKCkKLXsKLSAgcmV0dXJuIHNob3dfZm9vICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0MjRjMy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTYuZHN5bQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSooICBCYXNlICAgICAgICk/ICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2JhcgotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSooICAgICAgICAgICAgICk/ICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNi5tYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NjMzMmYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotVkVSU18xLjEgewotICBnbG9iYWw6IHNob3dfYmFyOwotfTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzYjFmZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWludCBzaG93X2JhciAoKQotewotICByZXR1cm4gMTsKLX0KLWludCBzaG93X2ZvbyAoKQotewotICByZXR1cm4gc2hvd19iYXIgKCk7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMTZhLmRzeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1OGRmNDcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1bMC05YS1mXSogZyAgICBETyAoXC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18xXC4xICAgIFZFUlNfMVwuMQotWzAtOWEtZl0qIGcgICAgREYgKFwudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMVwuMSAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iYXIKLVswLTlhLWZdKiBnICAgIERGIChcLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBCYXNlICAgICAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMxNmEudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjY2YxZGYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczE2YS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwNjAxY2ZiZiB0bXBkaXIvdmVyczE2YS5zbwotMiAweDAwIDB4MGE3OTI3YjEgVkVSU18xLjEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmE1MzdlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0vKgotICogVGVzdCBmdW5jdGlvbi4gIFRoaXMgaXMgYnVpbHQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCBhbmQgcmVmZXJlbmNlcyBhCi0gKiB2ZXJzaW9uZWQgc3ltYm9sIGZvbyB0aGF0IGlzIGluIHRlc3Quc28uCi0gKi8KLQotdm9pZAotc2hvd194eXp6eSgpCi17Ci0gIHByaW50ZigiJWQiLCBzaG93X2ZvbygpKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk4NWMyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVswLTlhLWZdKiAgICAgIERGIFwqVU5EXCoJWzAtOWEtZl0qICBWRVJTXzIuMCAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19mb28KLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfWFhYXzEuMSBWRVJTX1hYWF8xLjEKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfWFhYXzEuMSAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd194eXp6eQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDU3ZDdlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMyLm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1WRVJTX1hYWF8xLjEgewotCQkgc2hvd194eXp6eTsKLX07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMi52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MjYzNDMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczIudmVyCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGEyNjE4MWYgdG1wZGlyL3ZlcnMyLnNvCi0yIDB4MDAgMHgwODc4NWI1MSBWRVJTX1hYWF8xLjEKLQotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKLSAgICAweDBhNzkyMmIwIDB4MDAgMDMgVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDZkNzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qCi0gKiBNYWluIHByb2dyYW0gZm9yIHRlc3QxLCB0ZXN0Mi4KLSAqLwotCi1pbnQKLW1haW4oKQotewotICBwcmludGYoIiVkXG4iLCBzaG93X2ZvbygpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljMjY0Mi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzMy5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qICAgICAgREYgXCpVTkRcKglbMC05YS1mXSogIFZFUlNfMi4wICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczMudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTIzMGVlLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnMzLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKLSAgICAweDBhNzkyMmIwIDB4MDAgMDIgVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NDk3Y2EuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuYworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBUZXN0Y2FzZSB0byBtYWtlIHN1cmUgdGhhdCBhIHZlcnNpb25lZCBzeW1ib2wgZGVmaW5pdGlvbiBpbiBhbgotICogYXBwbGljYXRpb24gY29ycmVjdGx5IGRlZmluZXMgdGhlIHZlcnNpb24gbm9kZSwgaWYgYW5kIG9ubHkgaWYKLSAqIHRoZSBhY3R1YWwgc3ltYm9sIGlzIGV4cG9ydGVkLiAgVGhpcyBpcyBidWlsdCBib3RoIHdpdGggYW5kIHdpdGhvdXQKLSAqIC1leHBvcnQtZHluYW1pYy4KLSAqLwotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgbmV3X2Zvbyxmb29AQFZFUlNfMi4wIik7Ci0KLWludAotbWFpbigpCi17Ci0gIHByaW50ZigiJWRcbiIsIGZvbygpKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNC5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDk0NDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczQuc3ltCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMi4wCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNGEuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y5ZmRhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzIuMCAgICBWRVJTXzIuMAotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP2ZvbwpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NDk0NDYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnN5bQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vQEBWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlciBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM0YS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NmNlZGMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczRhLnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVmVyc2lvbiBkZWZpbml0aW9uczoKLTEgMHgwMSAweDBkOGEyNmUxIHRtcGRpci92ZXJzNGEKLTIgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzZlYTQwLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgZm9vQEJBUiBhbmQgZm9vQEBCQVIgYXJlIGNvcnJlY3RseSBkZXRlY3RlZAotICogYXMgYSBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbC4KLSAqLwotY29uc3QgY2hhciAqIGJhcjEgPSAiYXNkZiI7Ci1jb25zdCBjaGFyICogYmFyMiA9ICJhc2RmIjsKLQotaW50Ci1iYXIoKQotewotCXJldHVybiAzOwotfQotCi1pbnQKLW9yaWdpbmFsX2ZvbygpCi17Ci0JcmV0dXJuIDErYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vKCkKLXsKLQlyZXR1cm4gMTArYmFyKCk7Ci0KLX0KLQotaW50Ci1vbGRfZm9vMSgpCi17Ci0JcmV0dXJuIDEwMCtiYXIoKTsKLQotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLV9fYXNtX18oIi5zeW12ZXIgb3JpZ2luYWxfZm9vLGZvb0AiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2Zvbyxmb29AVkVSU18xLjEiKTsKLV9fYXNtX18oIi5zeW12ZXIgb2xkX2ZvbzEsZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG5ld19mb28sZm9vQEBWRVJTXzEuMiIpOwotCi1pbnQKLW1haW4gKCkKLXsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4NjhiZi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIFRlc3RjYXNlIHRvIG1ha2Ugc3VyZSB0aGF0IGlmIHdlIGV4dGVybmFsbHkgcmVmZXJlbmNlIGEgdmVyc2lvbmVkIHN5bWJvbAotICogdGhhdCB3ZSBhbHdheXMgZ2V0IHRoZSByaWdodCBvbmUuCi0gKi8KLQotaW50Ci1tYWluKCkKLXsKLSAgcHJpbnRmKCJFeHBlY3QgNCwgICAgZ2V0ICVkXG4iLCBmb29fMSgpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTMsICAgZ2V0ICVkXG4iLCBmb29fMigpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTAzLCAgZ2V0ICVkXG4iLCBmb29fMygpKTsKLSAgcHJpbnRmKCJFeHBlY3QgMTAwMywgZ2V0ICVkXG4iLCBmb29fNCgpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLV9fYXNtX18oIi5zeW12ZXIgZm9vXzEsc2hvd19mb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18yLHNob3dfZm9vQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb18zLHNob3dfZm9vQFZFUlNfMS4yIik7Ci1fX2FzbV9fKCIuc3ltdmVyIGZvb180LHNob3dfZm9vQFZFUlNfMi4wIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuZHN5bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U4NTFkNC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgICAgICAgICAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18yLjAgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18xLjIgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCi1bMC05YS1mXSogICAgICBERiBcKlVORFwqCVswLTlhLWZdKiAgVkVSU18xLjEgICAgKDB4WzAtOWEtZl1bMC05YS1mXSApP3Nob3dfZm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzNi5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YjVjYzcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYuc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMF0qICpGPyAqXCpVTkRcKglbMF0qIHNob3dfZm9vQAotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzEuMQotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzEuMgotWzBdKiAqRj8gKlwqVU5EXCoJWzBdKiBzaG93X2Zvb0BWRVJTXzIuMApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczYudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGEyYjQ2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM2LnZlcgorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVmVyc2lvbiBSZWZlcmVuY2VzOgotICByZXF1aXJlZCBmcm9tIHRtcGRpci92ZXJzMS5zbzoKLSAgICAweDBhNzkyN2IxIDB4MDAgPz8gVkVSU18xLjEKLSAgICAweDBhNzkyN2IyIDB4MDAgPz8gVkVSU18xLjIKLSAgICAweDBhNzkyMmIwIDB4MDAgPz8gVkVSU18yLjAKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNWI3ZTAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcuYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qCi0gKiBUZXN0IHByb2dyYW0gdGhhdCBnb2VzIHdpdGggdGVzdDcuc28KLSAqLwotCi0KLWludAotbWFpbigpCi17Ci0gIHJldHVybiBoaWRlX2EoMSkgKyBzaG93X2IoMSk7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczcubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWZkNTAxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVkVSU18xIHsKLQlnbG9iYWw6Ci0JCXNob3dfYiA7Ci0JbG9jYWw6Ci0JCWhpZGVfYTsKLX07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmVlOGM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIFRlc3Qgc3VwcGxpZWQgYnkgVWxyaWNoLiAgVmVyaWZ5IHRoYXQgd2UgY2FuIGNvcnJlY3RseSBmb3JjZSAnYScKLSAqIHRvIGxvY2FsIHNjb3BlLgotICovCi1pbnQKLV9fYV9pbnRlcm5hbCAoaW50IGUpCi17Ci0gIHJldHVybiBlICsgMTA7Ci19Ci0KLWludAotX19iX2ludGVybmFsIChpbnQgZSkKLXsKLSAgcmV0dXJuIGUgKyA0MjsKLX0KLQotYXNtICgiLnN5bXZlciBfX2FfaW50ZXJuYWwsaGlkZV9hQEBWRVJTXzEiKTsKLWFzbSAoIi5zeW12ZXIgX19iX2ludGVybmFsLHNob3dfYkBAVkVSU18xIik7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EuZHN5bSBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY5NmM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5kc3ltCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEgICAgICBWRVJTXzEKLVswLTlhLWZdKiBnICAgIERGICgudGV4dHxcKkFCU1wqKQlbMC05YS1mXSogIFZFUlNfMSAgICAgICgweFswLTlhLWZdWzAtOWEtZl0gKT9zaG93X2IKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2Euc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliZDYxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS5zeW0KKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/aGlkZV9hQEBWRVJTXzEKLVswLTlhLWZdKiBnICAgICBGIC50ZXh0CVswLTlhLWZdKiAoMHhbMC05YS1mXVswLTlhLWZdICk/c2hvd19iQEBWRVJTXzEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzN2EudmVyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VmOGE4Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM3YS52ZXIKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVZlcnNpb24gZGVmaW5pdGlvbnM6Ci0xIDB4MDEgMHgwMjY5ZmQzZiB0bXBkaXIvdmVyczdhLnNvCi0yIDB4MDAgMHgwNWFhNzkyMSBWRVJTXzEKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDU4NmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczguYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW50Ci1tYWluKCkKLXsKLSAgcmV0dXJuIGEoMSkgKyBiKDEpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwIGIvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgubWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjM1OTU1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM4Lm1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLVZFUlNJT04gewotCVZFUlNfMS4xIHsKLQkJIGdsb2JhbDoKLQkJCSBmb28xOwotCQkgbG9jYWw6Ci0JCQkgaGlkZV9vbGQqOyAKLQkJCSBoaWRlX29yaWdpbmFsKjsgCi0JCQkgaGlkZV9uZXcqOyAKLQl9OwotCQotCVZFUlNfMS4yIHsKLQkJCSBmb28yOwotCX0gVkVSU18xLjE7Ci0JCi0JVkVSU18yLjAgewotCQkJIHNob3dfYmFyMTsgc2hvd19iYXIyOwotCX0gVkVSU18xLjI7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOC52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTkwMjMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczgudmVyCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MGEyNmY4MWYgdG1wZGlyL3ZlcnM4LnNvCi0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotMyAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLQlWRVJTXzEuMSAKLTQgMHgwMCAweDBhNzkyMmIwIFZFUlNfMi4wCi0JVkVSU18xLjIgCi0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJmZGRiLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogVGVzdGNhc2UgdG8gdmVyaWZ5IHRoYXQgcmVmZXJlbmNlIHRvIGZvb0BCQVIgYW5kIGEgZGVmaW5pdGlvbiBvZiBmb29AQEJBUgotICogYXJlIG5vdCB0cmVhdGVkIGFzIGEgbXVsdGlwbGUgZGVmLgotICovCi1jb25zdCBjaGFyICogYmFyMSA9ICJhc2RmIjsKLWNvbnN0IGNoYXIgKiBiYXIyID0gImFzZGYiOwotCi1pbnQKLWJhcigpCi17Ci0JcmV0dXJuIDM7Ci19Ci0KLWludAotb3JpZ2luYWxfZm9vKCkKLXsKLQlyZXR1cm4gMStiYXIoKTsKLQotfQotCi1pbnQKLW9sZF9mb28oKQotewotCXJldHVybiAxMCtiYXIoKTsKLQotfQotCi1pbnQKLW5ld19mb28oKQotewotCXJldHVybiAxMDAwK2JhcigpOwotCi19Ci0KLWludAotbWFpbigpCi17Ci0gIG9sZF9mb28xKCk7Ci0gIHJldHVybiAwOwotfQotCi1fX2FzbV9fKCIuc3ltdmVyIG9yaWdpbmFsX2Zvbyxmb29AIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28sZm9vQFZFUlNfMS4xIik7Ci1fX2FzbV9fKCIuc3ltdmVyIG9sZF9mb28xLGZvb0BWRVJTXzEuMiIpOwotX19hc21fXygiLnN5bXZlciBuZXdfZm9vLGZvb0BAVkVSU18xLjIiKTsKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmRzeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5kc3ltCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzkzMDAyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbGZ2ZXJzL3ZlcnM5LmRzeW0KKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLVswXSogZyAgICBETyBcKkFCU1wqCVswXSogIFZFUlNfMS4xICAgIFZFUlNfMS4xCi1bMF0qIGcgICAgRE8gXCpBQlNcKglbMF0qICBWRVJTXzEuMiAgICBWRVJTXzEuMgotWzAtOWEtZl0qIGcgICAgREYgKC50ZXh0fFwqQUJTXCopCVswLTlhLWZdKiBcKFZFUlNfMS4xXCkgICAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vCi1bMC05YS1mXSogZyAgICBERiAoLnRleHR8XCpBQlNcKikJWzAtOWEtZl0qICBWRVJTXzEuMiAgICAoMHhbMC05YS1mXVswLTlhLWZdICk/Zm9vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0gYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS5zeW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzE1MTYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkuc3ltCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1bMF0qICpGPyAqXCpVTkRcKglbMF0qIGZvb0BWRVJTXzEuMgotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29ACi1bMC05YS1mXSogZyAgICAgRiAudGV4dAlbMC05YS1mXSogKDB4WzAtOWEtZl1bMC05YS1mXSApP2Zvb0BWRVJTXzEuMQotWzAtOWEtZl0qIGcgICAgIEYgLnRleHQJWzAtOWEtZl0qICgweFswLTlhLWZdWzAtOWEtZl0gKT9mb29AQFZFUlNfMS4yCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS52ZXIgYi9sZC90ZXN0c3VpdGUvbGQtZWxmdmVycy92ZXJzOS52ZXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3M2JhNzIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVsZnZlcnMvdmVyczkudmVyCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1WZXJzaW9uIGRlZmluaXRpb25zOgotMSAweDAxIDB4MDRkOGEyNjkgdG1wZGlyL3ZlcnM5Ci0yIDB4MDAgMHgwYTc5MjdiMSBWRVJTXzEuMQotMyAweDAwIDB4MGE3OTI3YjIgVkVSU18xLjIKLQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL2VtcGljLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9lbXBpYy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNTI4YmUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL2VtcGljLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0jIEV4cGVjdCBzY3JpcHQgZm9yIGxkLWVtcGljIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgV3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yIChpYW5AY3lnbnVzLmNvbSkKLSMKLQotIyBUZXN0IHRoZSBoYW5kbGluZyBvZiBNSVBTIGVtYmVkZGVkIFBJQyBjb2RlLiAgVGhpcyB0ZXN0IGVzc2VudGlhbGx5Ci0jIHRlc3RzIHRoZSBjb21waWxlciBhbmQgYXNzZW1ibGVyIGFzIHdlbGwgYXMgdGhlIGxpbmtlciwgc2luY2UgTUlQUwotIyBlbWJlZGRlZCBQSUMgaXMgYSBHTlUgZW5oYW5jZW1lbnQgdG8gc3RhbmRhcmQgTUlQUyB0b29scy4KLQotIyBFbWJlZGRlZCBQSUMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIE1JUFMgRUNPRkYgdGFyZ2V0cy4KLWlmICFbaXN0YXJnZXQgbWlwcyotKi1lY29mZipdIHsKLSAgICByZXR1cm4KLX0KLQotc2V0IHRlc3RuYW1lIHJlbGF4Ci0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotIyBUZXN0IHRoYXQgcmVsYXhhdGlvbiB3b3JrcyBjb3JyZWN0bHkuICBUaGlzIHRlc3RzdWl0ZSB3YXMgY29tcG9zZWQKLSMgKGJ5IGV4cGVyaW1lbnRhdGlvbikgdG8gZm9yY2UgdGhlIGxpbmtlciB0byByZWxheCB0d2ljZS0tdGhhdCBpcywKLSMgdGhlIGZpcnN0IHJlbGF4YXRpb24gcGFzcyB3aWxsIGZvcmNlIGFub3RoZXIgY2FsbCB0byBiZSBvdXQgb2YKLSMgcmFuZ2UsIHJlcXVpcmluZyBhIHNlY29uZCByZWxheGF0aW9uIHBhc3MuCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDEuYyB0bXBkaXIvcmVsYXgxLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDIuYyB0bXBkaXIvcmVsYXgyLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDMuYyB0bXBkaXIvcmVsYXgzLm9dCi0gICAgIHx8ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9yZWxheDQuYyB0bXBkaXIvcmVsYXg0Lm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9yZWxheCAiLS1yZWxheCAtVCAkc3JjZGlyLyRzdWJkaXIvcmVsYXgudCB0bXBkaXIvcmVsYXgxLm8gdG1wZGlyL3JlbGF4Mi5vIHRtcGRpci9yZWxheDMubyB0bXBkaXIvcmVsYXg0Lm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgIyBDaGVjayB0aGF0IHRoZSByZWxheGF0aW9uIHByb2R1Y2VkIHRoZSBjb3JyZWN0IHJlc3VsdC4gIENoZWNrCi0gICAgIyBlYWNoIGJhbCBpbnN0cnVjdGlvbi4gIFNvbWUgd2lsbCBnbyBkaXJlY3RseSB0byB0aGUgc3RhcnQgb2YgYQotICAgICMgZnVuY3Rpb24sIHdoaWNoIGlzIE9LLiAgU29tZSB3aWxsIGZvcm0gcGFydCBvZiB0aGUgZml2ZQotICAgICMgaW5zdHJ1Y3Rpb24gZXhwYW5kZWQgY2FsbCBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSB3ZSBjb21wdXRlIHRoZQotICAgICMgcmVhbCBkZXN0aW5hdGlvbiBhbmQgbWFrZSBzdXJlIGl0IGlzIHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLgotICAgICMgU29tZSBiYWwgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIHRvIGxvY2F0ZSB0aGUgc3RhcnQgb2YgdGhlCi0gICAgIyBmdW5jdGlvbiBpbiBvcmRlciB0byBkbyBwb3NpdGlvbiBpbmRlcGVuZGVudCBhZGRyZXNzaW5nIGludG8gdGhlCi0gICAgIyB0ZXh0IHNlY3Rpb24sIGluIHdoaWNoIGNhc2Ugd2UganVzdCBjaGVjayB0aGF0IGl0IGNvcnJlY3RseQotICAgICMgY29tcHV0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KLQotICAgICMgR2V0IHRoZSBzeW1ib2wgdGFibGUuCi0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3JlbGF4XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICAjIEdldCBhIGRpc2Fzc2VtYmx5LgotICAgIHNlbmRfbG9nICIkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXNcbiIKLSAgICB2ZXJib3NlICIkb2JqZHVtcCAtZCB0bXBkaXIvcmVsYXggPnRtcGRpci9yZWxheC5kaXMiCi0gICAgY2F0Y2ggImV4ZWMgJG9iamR1bXAgLWQgdG1wZGlyL3JlbGF4ID50bXBkaXIvcmVsYXguZGlzIiBleGVjX291dHB1dAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICRleGVjX291dHB1dAotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgc2V0IGJhbGNudCAwCi0gICAgc2V0IGZpbGUgW29wZW4gdG1wZGlyL3JlbGF4LmRpcyByXQotICAgIHdoaWxlIHsgW2dldHMgJGZpbGUgbGluZV0gIT0gLTEgfSB7Ci0JdmVyYm9zZSAiJGxpbmUiIDIKLQotCWlmICFbc3RyaW5nIG1hdGNoICIqYmFsKiIgJGxpbmVdIHsKLQkgICAgY29udGludWUKLQl9Ci0KLQl2ZXJib3NlICIkbGluZSIKLQotCWluY3IgYmFsY250Ci0KLQlpZiAhW3JlZ2V4cCAiXihcWzAtOWEtZkEtRlxdKykgKDxcW2EteiswLTlBLVouXF0rPik/IGJhbCAoXFswLTlhLWZBLUZcXSspIiAkbGluZSB3aG9sZSBhZGRyIGxhYmVsIGRlc3RdIHsKLQkgICAgcGVycm9yICJ1bnJlY29nbml6ZWQgZm9ybWF0IGZvciAkbGluZSIKLQkgICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQkgICAgcmV0dXJuCi0JfQotCi0JaWYgIjB4JGFkZHIgKyA4ICE9IDB4JGRlc3QiIHsKLQkgICAgIyBUaGlzIGlzIGEgc3RyYWlnaHQgZnVuY3Rpb24gY2FsbC4gIEFsbCBmdW5jdGlvbiBjYWxscyBpbgotCSAgICAjIHRoaXMgZXhhbXBsZSBhcmUgdG8gZWl0aGVyIGZvbyBvciBiYXIuCi0JICAgIGlmICIweCRkZXN0ICE9ICRubV9vdXRwdXQoZm9vKSAmJiAweCRkZXN0ICE9ICRubV9vdXRwdXQoYmFyKSIgewotCQlzZW5kX2xvZyAiZmFpbCAxXG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCX0gZWxzZSB7Ci0JICAgICMgUGljayB1cCB0aGUgbmV4dCBsaW5lLiAgSWYgaXQgaXMgc2xsLCB0aGlzIGlzIGEgc3dpdGNoCi0JICAgICMgcHJvbG9ndWUsIGFuZCB0aGVyZSBpcyBub3QgbXVjaCB3ZSBjYW4gZG8gdG8gdGVzdCBpdC4KLQkgICAgIyBPdGhlcndpc2UsIGl0IHNob3VsZCBiZSBsdWksIGFuZCB0aGUgbmV4dCBpbnN0cnVjdGlvbgotCSAgICAjIHNob3VsZCBiZSBhbiBhZGRpdSwgZm9sbG93ZWQgYnkgYW4gYWRkdSB0byAkMzEuCi0JICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7Ci0JCXNlbmRfbG9nICJmYWlsIDJcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JICAgIHZlcmJvc2UgJGwKLQotCSAgICBpZiBbc3RyaW5nIG1hdGNoICIqc2xsKiIgJGxdIHsKLQkJY29udGludWUKLQkgICAgfQotCSAgICBpZiAhW3JlZ2V4cCAibHVpIChcW1wkYS16MC05XF0rKSwoXFswLTlhLWZBLUZ4XF0rKSIgJGwgd2hvbGUgcmVnIHVwcGVyXSB7Ci0JCXNlbmRfbG9nICJmYWlsIDNcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCXNlbmRfbG9nICIkbFxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCi0JICAgIGlmIHsgW2dldHMgJGZpbGUgbF0gPT0gLTEgfSB7Ci0JCXNlbmRfbG9nICJmYWlsIDRcbiIKLQkJc2VuZF9sb2cgIiRsaW5lXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0JICAgIHZlcmJvc2UgIiRsIgotCSAgICBpZiAhW3JlZ2V4cCAiYWRkaXUgXFwkcmVnLFxcJHJlZywoXFstMC05XF0rKSIgJGwgd2hvbGUgbG93ZXJdIHsKLQkJc2VuZF9sb2cgImZhaWwgNVxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJc2VuZF9sb2cgIiRsXG4iCi0JCXNlbmRfbG9nICJhZGRpdSBcXCRyZWcsXFwkcmVnLChcWy0wLTlcXSspXG4iCi0JCWZhaWwgJHRlc3RuYW1lCi0JCXJldHVybgotCSAgICB9Ci0KLQkgICAgaWYgeyBbZ2V0cyAkZmlsZSBsXSA9PSAtMSB9IHsKLQkJc2VuZF9sb2cgImZhaWwgNlxuIgotCQlzZW5kX2xvZyAiJGxpbmVcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQkgICAgdmVyYm9zZSAiJGwiCi0JICAgIGlmICFbcmVnZXhwICJhZGR1IFxcJHJlZyxcXCRyZWcsXFxcJHJhIiAkbF0gewotCQlzZW5kX2xvZyAiZmFpbCA3XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlzZW5kX2xvZyAiJGxcbiIKLQkJZmFpbCAkdGVzdG5hbWUKLQkJcmV0dXJuCi0JICAgIH0KLQotCSAgICAjIFRoZSBuZXh0IGxpbmUgd2lsbCBiZSBqYWxyIGluIHRoZSBjYXNlIG9mIGFuIGV4cGFuZGVkCi0JICAgICMgY2FsbC4gIE90aGVyd2lzZSwgdGhlIGNvZGUgaXMgZ2V0dGluZyB0aGUgc3RhcnQgb2YgdGhlCi0JICAgICMgZnVuY3Rpb24sIGFuZCB0aGUgbmV4dCBsaW5lIGNhbiBiZSBhbnl0aGluZy4KLQotCSAgICBpZiB7IFtnZXRzICRmaWxlIGxdID09IC0xIH0gewotCQlzZW5kX2xvZyAiZmFpbCA4XG4iCi0JCXNlbmRfbG9nICIkbGluZVxuIgotCQlmYWlsICR0ZXN0bmFtZQotCQlyZXR1cm4KLQkgICAgfQotCSAgICB2ZXJib3NlICIkbCIJCi0JICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipqYWxyKiIgJGxdIHsKLQkJc2V0IGRlc3QgW2V4cHIgMHgkYWRkciArIDggKyAoJHVwcGVyIDw8IDE2KSArICRsb3dlcl0KLQkJaWYgeyAkZGVzdCAhPSAkbm1fb3V0cHV0KGZvbykgJiYgJGRlc3QgIT0gJG5tX291dHB1dChiYXIpIH0gewotCQkgICAgc2VuZF9sb2cgImZhaWwgOVxuIgotCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQkgICAgcmV0dXJuCi0JCX0KLQkgICAgfSBlbHNlIHsKLQkJc2V0IGRlc3QgW2V4cHIgKCR1cHBlciA8PCAxNikgKyAkbG93ZXJdCi0JCWlmICFbcmVnZXhwICI8KFxbLmEtelxdKylcXCsoXFswLTlhLWZBLUZcXSspPiIgJGxhYmVsIHdob2xlIGJhc2Ugb2Zmc2V0XSB7Ci0JCSAgICBzZW5kX2xvZyAiZmFpbCAxMFxuIgotCQkgICAgc2VuZF9sb2cgIiRsaW5lXG4iCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQkgICAgcmV0dXJuCi0JCX0KLQkJc2V0IG9mZnNldCAweCRvZmZzZXQKLQkJaWYgeyAkYmFzZSA9PSAiLmZvbyIgfSB7Ci0JCSAgICBzZXQgb2Zmc2V0IFtleHByICRvZmZzZXQgLSAoJG5tX291dHB1dChmb28pIC0gMHgzMCldCi0JCX0KLQkJaWYgeyAkb2Zmc2V0ICsgOCAhPSAtICRkZXN0IH0gewotCQkgICAgc2VuZF9sb2cgImZhaWwgMTFcbiIKLQkJICAgIHNlbmRfbG9nICIkbGluZVxuIgotCQkgICAgZmFpbCAkdGVzdG5hbWUKLQkJICAgIHJldHVybgotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0gICAgY2xvc2UgJGZpbGUKLQotICAgIGlmIHskYmFsY250IDwgMTB9IHsKLQlzZW5kX2xvZyAiZmFpbCAxMlxuIgotCWZhaWwgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQl2ZXJib3NlICIkYmFsY250IGJhbCBpbnN0cnVjdGlvbnMiCi0JcGFzcyAkdGVzdG5hbWUKLSAgICB9Ci19Ci0KLSMgV2Ugbm93IHRlc3QgYWN0dWFsbHkgcnVubmluZyBlbWJlZGRlZCBNSVBTIFBJQyBjb2RlLiAgVGhpcyBjYW4gb25seQotIyBiZSBkb25lIG9uIGEgTUlQUyBob3N0IHdpdGggdGhlIHNhbWUgZW5kaWFubmVzcyBhcyBvdXIgdGFyZ2V0LgotaWYgW2lzdGFyZ2V0IG1pcHNlbC0qLSpdIHsKLSAgICBpZiAhW2lzaG9zdCBtaXBzKi0qLXVsdHJpeCpdIHsKLQlyZXR1cm4KLSAgICB9Ci19IGVsc2UgewotICAgIGlmICFbaXNob3N0IG1pcHMqLSotaXJpeCpdIHsKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLXNldCB0ZXN0bmFtZSAicnVuIGVtYmVkZGVkIFBJQyBjb2RlIgotCi0jIENvbXBpbGUgdGhlIHByb2dyYW0gd2hpY2ggd2lsbCBydW4gdGhlIHRlc3QuICBUaGlzIGNvZGUgbXVzdCBiZQotIyBjb21waWxlZCBmb3IgdGhlIGhvc3QsIG5vdCB0aGUgdGFyZ2V0Lgotc2VuZF9sb2cgIiRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jXG4iCi12ZXJib3NlICIkQ0NfRk9SX0hPU1QgJENGTEFHU19GT1JfSE9TVCAtbyB0bXBkaXIvcnVuICRzcmNkaXIvJHN1YmRpci9ydW4uYyIKLWNhdGNoICJleGVjICRDQ19GT1JfSE9TVCAkQ0ZMQUdTX0ZPUl9IT1NUIC1vIHRtcGRpci9ydW4gJHNyY2Rpci8kc3ViZGlyL3J1bi5jIiBleGVjX291dHB1dAotaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0gICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotICAgIHZlcmJvc2UgIiRleGVjX291dHB1dCIKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi0jIENvbXBpbGUgYW5kIGxpbmsgdGhlIHRlc3QuCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRDRkxBR1MgLW1lbWJlZGRlZC1waWMiICRzcmNkaXIvJHN1YmRpci9ydW50ZXN0aS5zIHRtcGRpci9ydW50ZXN0aS5vXQotICAgICB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTIC1tZW1iZWRkZWQtcGljIiAkc3JjZGlyLyRzdWJkaXIvcnVudGVzdDEuYyB0bXBkaXIvcnVudGVzdDEub10KLSAgICAgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAtbWVtYmVkZGVkLXBpYyIgJHNyY2Rpci8kc3ViZGlyL3J1bnRlc3QyLmMgdG1wZGlyL3J1bnRlc3QyLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvcnVudGVzdCAiLS1lbWJlZGRlZC1yZWxvY3MgdG1wZGlyL3J1bnRlc3RpLm8gdG1wZGlyL3J1bnRlc3QxLm8gdG1wZGlyL3J1bnRlc3QyLm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgIyBOb3cgcnVuIHRoZSB0ZXN0LgotICAgIHNlbmRfbG9nICJ0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0XG4iCi0gICAgdmVyYm9zZSAidG1wZGlyL3J1biB0bXBkaXIvcnVudGVzdCIKLSAgICBjYXRjaCAiZXhlYyB0bXBkaXIvcnVuIHRtcGRpci9ydW50ZXN0IiBleGVjX291dHB1dAotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIipyYW4gYW5kIHJldHVybmVkIDAqIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4LnQgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMxOGI2OS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgudAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLU9VVFBVVF9GT1JNQVQoImVjb2ZmLWJpZ21pcHMiKQotU0VDVElPTlMKLXsKLSAgLmZvbyAweDMwIDogewotICAgIHRtcGRpci9yZWxheDMubygudGV4dCkKLSAgICB0bXBkaXIvcmVsYXgxLm8oLnRleHQpCi0gIH0KLSAgLnRleHQgIDB4MjAwMDAgOiB7Ci0gICAgIF9mdGV4dCA9IC4gOwotICAgICooLmluaXQpCi0gICAgIGVwcm9sICA9ICAuOwotICAgIHRtcGRpci9yZWxheDQubygudGV4dCkKLSAgICAqKC50ZXh0KQotICAgICooLmZpbmkpCi0gICAgIGV0ZXh0ICA9ICAuOwotICAgICBfZXRleHQgID0gIC47Ci0gIH0KLSAgLnJkYXRhICAuIDogewotICAgICooLnJkYXRhKQotICB9Ci0gICBfZmRhdGEgPSAuOwotICAuZGF0YSAgLiA6IHsKLSAgICAqKC5kYXRhKQotICAgIENPTlNUUlVDVE9SUwotICB9Ci0gICBfZ3AgPSAuICsgMHg4MDAwOwotICAubGl0OCAgLiA6IHsKLSAgICAqKC5saXQ4KQotICB9Ci0gIC5saXQ0ICAuIDogewotICAgICooLmxpdDQpCi0gIH0KLSAgLnNkYXRhICAuIDogewotICAgICooLnNkYXRhKQotICB9Ci0gICBlZGF0YSAgPSAgLjsKLSAgIF9lZGF0YSAgPSAgLjsKLSAgIF9mYnNzID0gLjsKLSAgLnNic3MgIC4gOiB7Ci0gICAgKiguc2JzcykKLSAgICAqKC5zY29tbW9uKQotICB9Ci0gIC5ic3MgIC4gOiB7Ci0gICAgKiguYnNzKQotICAgICooQ09NTU9OKQotICB9Ci0gICBlbmQgPSAuOwotICAgX2VuZCA9IC47Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZWMzOWUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4MS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyogRmlyc3Qgc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotZXh0ZXJuIGludCBiYXIgKCk7Ci1zdGF0aWMgaW50IGZvbzIgKCk7Ci0KLWludCBmb28gKGludCBpKQotewotICBzd2l0Y2ggKGkpCi0gICAgewotICAgIGNhc2UgMDogYmFyICgwKTsgYnJlYWs7Ci0gICAgY2FzZSAxOiBiYXIgKDEpOyBicmVhazsKLSAgICBjYXNlIDI6IGJhciAoMik7IGJyZWFrOwotICAgIGNhc2UgMzogYmFyICgzKTsgYnJlYWs7Ci0gICAgY2FzZSA0OiBiYXIgKGZvbzIpOyBicmVhazsKLSAgICBjYXNlIDU6IGJhciAoYmFyKTsgYnJlYWs7Ci0gICAgfQotICB3aGlsZSAoMSkKLSAgICBpZiAoaSkKLSAgICAgIHJldHVybiBiYXIgKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZm9vMiAoKSB7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4NTRhMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcmVsYXgyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBTZWNvbmQgc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotaW50IGJhcjIgKCkKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgIGZvbyAoKTsKLSAgcmV0dXJuIGZvbyAoKSArIGZvbyAoKSArIGZvbyAoKSArIGZvbyAoKTsKLX0KLQotaW50IGJhciAoaW50IGkpCi17Ci0gIHdoaWxlICgxKQotICAgIGlmIChpKQotICAgICAgcmV0dXJuIGZvbyAoKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gZm9vICgpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4My5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWFhNTMyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDMuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogVGhpcmQgc291cmNlIGZpbGUgaW4gcmVsYXhhdGlvbiB0ZXN0LiAgKi8KLQotaW50IHF1dXggKCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4NC5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3JlbGF4NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWNmYjA1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9yZWxheDQuYworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotLyogRm91cnRoIHNvdXJjZSBmaWxlIGluIHJlbGF4YXRpb24gdGVzdC4gICovCi0KLWludCB4eXp6eSAoKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVuLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMDM3N2UuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qIExvYWQgYW5kIHJ1biBhIE1JUFMgcG9zaXRpb24gaW5kZXBlbmRlbnQgRUNPRkYgZmlsZS4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciA8aWFuQGN5Z251cy5jb20+Ci0gICBQdWJsaWMgZG9tYWluLiAgKi8KLQotLyogVGhpcyBwcm9ncmFtIHdpbGwgbG9hZCBhbiBFQ09GRiBmaWxlIGludG8gbWVtb3J5IGFuZCBleGVjdXRlIGl0LgotICAgVGhlIGZpbGUgbXVzdCBoYXZlIGJlZW4gY29tcGlsZWQgdXNpbmcgdGhlIEdOVSAtbWVtYmVkZGVkLXBpYwotICAgc3dpdGNoIHRvIHByb2R1Y2UgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZS4gIFRoaXMgd2lsbCBvbmx5IHdvcmsKLSAgIGlmIHRoaXMgcHJvZ3JhbSBpcyBydW4gb24gYSBNSVBTIHN5c3RlbSB3aXRoIHRoZSBzYW1lIGVuZGlhbm5lc3MgYXMKLSAgIHRoZSBFQ09GRiBmaWxlLiAgVGhlIEVDT0ZGIGZpbGUgbXVzdCBiZSBjb21wbGV0ZS4gIFN5c3RlbSBjYWxscyBtYXkKLSAgIG5vdCB3b3JrIGNvcnJlY3RseS4KLQotICAgVGhlcmUgYXJlIGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBmaWxlICh0aGV5IGNvdWxkIGJlIHJlbW92ZWQKLSAgIGJ5IGRvaW5nIHNvbWUgYWRkaXRpb25hbCBwcm9ncmFtbWluZykuICBUaGUgZmlsZSBtdXN0IGJlIGFsaWduZWQKLSAgIHN1Y2ggdGhhdCBpdCBkb2VzIG5vdCByZXF1aXJlIGFueSBnYXBzIGludHJvZHVjZWQgaW4gdGhlIGRhdGEKLSAgIHNlZ21lbnQ7IHRoZSBHTlUgbGlua2VyIHByb2R1Y2VzIHN1Y2ggZmlsZXMgYnkgZGVmYXVsdC4gIEhvd2V2ZXIsCi0gICB0aGUgZmlsZSBtdXN0IG5vdCBhc3N1bWUgdGhhdCB0aGUgdGV4dCBvciBkYXRhIHNlZ21lbnQgaXMgYWxpZ25lZAotICAgb24gYSBwYWdlIGJvdW5kYXJ5LiAgVGhlIHN0YXJ0IGFkZHJlc3MgbXVzdCBiZSBhdCB0aGUgc3RhcnQgb2YgdGhlCi0gICB0ZXh0IHNlZ21lbnQuCi0KLSAgIFRoZSBFQ09GRiBmaWxlIGlzIHJ1biBieSBjYWxsaW5nIGl0IGFzIHRob3VnaCBpdCB3ZXJlIGEgZnVuY3Rpb24uCi0gICBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBzZWdtZW50IGlzIHBhc3NlZCBhcyB0aGUgb25seSBhcmd1bWVudC4KLSAgIFRoZSBmaWxlIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbiBpbnRlZ2VyIHZhbHVlLCB3aGljaCB3aWxsIGJlCi0gICBwcmludGVkLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotLyogU3RydWN0dXJlcyB1c2VkIGluIEVDT0ZGIGZpbGVzLiAgV2UgYXNzdW1lIHRoYXQgYSBzaG9ydCBpcyB0d28KLSAgIGJ5dGVzIGFuZCBhbiBpbnQgaXMgZm91ciBieXRlcy4gIFRoaXMgaXMgbm90IG11Y2ggb2YgYW4gYXNzdW1wdGlvbiwKLSAgIHNpbmNlIHdlIGFscmVhZHkgYXNzdW1lIHRoYXQgd2UgYXJlIHJ1bm5pbmcgb24gYSBNSVBTIGhvc3Qgd2l0aCB0aGUKLSAgIHNhbWUgZW5kaWFubmVzcyBhcyB0aGUgZmlsZSB3ZSBhcmUgZXhhbWluaW5nLiAgKi8KLQotc3RydWN0IGVjb2ZmX2ZpbGVoZHIgewotICB1bnNpZ25lZCBzaG9ydCBmX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgICAgICAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIHNob3J0IGZfbnNjbnM7CS8qIG51bWJlciBvZiBzZWN0aW9ucyAgICAgICAgICAgKi8KLSAgdW5zaWduZWQgaW50IGZfdGltZGF0OwkvKiB0aW1lICYgZGF0ZSBzdGFtcCAgICAgICAgICAgICovCi0gIHVuc2lnbmVkIGludCBmX3N5bXB0cjsJLyogZmlsZSBwb2ludGVyIHRvIHN5bXRhYiAgICAgICAqLwotICB1bnNpZ25lZCBpbnQgZl9uc3ltczsJCS8qIG51bWJlciBvZiBzeW10YWIgZW50cmllcyAgICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9vcHRoZHI7CS8qIHNpemVvZihvcHRpb25hbCBoZHIpICAgICAgICAgKi8KLSAgdW5zaWduZWQgc2hvcnQgZl9mbGFnczsJLyogZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAqLwotfTsKLQotc3RydWN0IGVjb2ZmX2FvdXRoZHIKLXsKLSAgdW5zaWduZWQgc2hvcnQgbWFnaWM7CQkvKiB0eXBlIG9mIGZpbGUJCQkJKi8KLSAgdW5zaWduZWQgc2hvcnQgdnN0YW1wOwkvKiB2ZXJzaW9uIHN0YW1wCQkJKi8KLSAgdW5zaWduZWQgaW50IHRzaXplOwkJLyogdGV4dCBzaXplIGluIGJ5dGVzLCBwYWRkZWQgdG8gRlcgYmRyeSovCi0gIHVuc2lnbmVkIGludCBkc2l6ZTsJCS8qIGluaXRpYWxpemVkIGRhdGEgIiAgIgkJKi8KLSAgdW5zaWduZWQgaW50IGJzaXplOwkJLyogdW5pbml0aWFsaXplZCBkYXRhICIgICAiCQkqLwotICB1bnNpZ25lZCBpbnQgZW50cnk7CQkvKiBlbnRyeSBwdC4JCQkJKi8KLSAgdW5zaWduZWQgaW50IHRleHRfc3RhcnQ7CS8qIGJhc2Ugb2YgdGV4dCB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGRhdGFfc3RhcnQ7CS8qIGJhc2Ugb2YgZGF0YSB1c2VkIGZvciB0aGlzIGZpbGUgKi8KLSAgdW5zaWduZWQgaW50IGJzc19zdGFydDsJLyogYmFzZSBvZiBic3MgdXNlZCBmb3IgdGhpcyBmaWxlICovCi0gIHVuc2lnbmVkIGludCBncHJtYXNrOwkJLyogPz8gKi8KLSAgdW5zaWduZWQgaW50IGNwcm1hc2tbNF07CS8qID8/ICovCi0gIHVuc2lnbmVkIGludCBncF92YWx1ZTsJLyogdmFsdWUgZm9yIGdwIHJlZ2lzdGVyICovCi19OwotCi0jZGVmaW5lIEVDT0ZGX1NDTkhEUl9TSVpFICg0MCkKLQotc3RhdGljIHZvaWQKLWRpZSAocykKLSAgICAgY2hhciAqczsKLXsKLSAgcGVycm9yIChzKTsKLSAgZXhpdCAoMSk7Ci19Ci0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBGSUxFICpmOwotICBzdHJ1Y3Qgc3RhdCBzOwotICBjaGFyICp6OwotICBzdHJ1Y3QgZWNvZmZfZmlsZWhkciAqZmg7Ci0gIHN0cnVjdCBlY29mZl9hb3V0aGRyICphaDsKLSAgdW5zaWduZWQgaW50IHRvZmY7Ci0gIGNoYXIgKnQsICpkOwotICBpbnQgKCpwZm4pICgpOwotICBpbnQgcmV0OwotCi0gIGlmIChhcmdjICE9IDIpCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiVXNhZ2U6ICVzIGZpbGVcbiIsIGFyZ3ZbMF0pOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIGYgPSBmb3BlbiAoYXJndlsxXSwgInIiKTsKLSAgaWYgKGYgPT0gTlVMTCkKLSAgICBkaWUgKGFyZ3ZbMV0pOwotCi0gIGlmIChzdGF0IChhcmd2WzFdLCAmcykgPCAwKQotICAgIGRpZSAoInN0YXQiKTsKLQotICB6ID0gKGNoYXIgKikgbWFsbG9jIChzLnN0X3NpemUpOwotICBpZiAoeiA9PSBOVUxMKQotICAgIGRpZSAoIm1hbGxvYyIpOwotCi0gIGlmIChmcmVhZCAoeiwgMSwgcy5zdF9zaXplLCBmKSAhPSBzLnN0X3NpemUpCi0gICAgZGllICgiZnJlYWQiKTsKLQotICAvKiBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHNlZ21lbnQsIHdoaWNoIGlzIHRoZQotICAgICBsb2NhdGlvbiB3ZSBhcmUgZ29pbmcgdG8gY2FsbCwgYW5kIHRoZSBzdGFydCBvZiB0aGUgZGF0YSBzZWdtZW50LAotICAgICB3aGljaCB3ZSBhcmUgZ29pbmcgdG8gcGFzcyBhcyBhbiBhcmd1bWVudC4gIFdlIGFsc28gbmVlZCB0aGUgc2l6ZQotICAgICBhbmQgc3RhcnQgYWRkcmVzcyBvZiB0aGUgYnNzIHNlZ21lbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIGFsbCBpbgotICAgICB0aGUgRUNPRkYgYS5vdXQgaGVhZGVyLiAgKi8KLQotICBmaCA9IChzdHJ1Y3QgZWNvZmZfZmlsZWhkciAqKSB6OwotICBpZiAoZmgtPmZfb3B0aGRyICE9IHNpemVvZiAoc3RydWN0IGVjb2ZmX2FvdXRoZHIpKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiB1bmV4cGVjdGVkIG9wdGhkciBzaXplOiBpcyAldSwgd2FudCAldVxuIiwKLQkgICAgICAgYXJndlsxXSwgKHVuc2lnbmVkIGludCkgZmgtPmZfb3B0aGRyLAotCSAgICAgICAodW5zaWduZWQgaW50KSBzaXplb2YgKHN0cnVjdCBlY29mZl9hb3V0aGRyKSk7Ci0gICAgICBleGl0ICgxKTsKLSAgICB9Ci0KLSAgYWggPSAoc3RydWN0IGVjb2ZmX2FvdXRoZHIgKikgKHogKyBzaXplb2YgKHN0cnVjdCBlY29mZl9maWxlaGRyKSk7Ci0gIGlmIChhaC0+bWFnaWMgIT0gMDQxMykKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogYmFkIGFvdXRoZHIgbWFnaWMgbnVtYmVyIDAlbyAod2FudCAwNDEzKVxuIiwKLQkgICAgICAgYXJndlsxXSwgKHVuc2lnbmVkIGludCkgYWgtPm1hZ2ljKTsKLSAgICAgIGV4aXQgKDEpOwotICAgIH0KLQotICAvKiBXZSBzaG91bGQgY2xlYXIgdGhlIGJzcyBzZWdtZW50IGF0IHRoaXMgcG9pbnQuICBUaGlzIGlzIHRoZQotICAgICBhaC0+YnNpemUgYnl0ZXMgc3RhcnRpbmcgYXQgYWgtPmJzc19zdGFydCwgVG8gZG8gdGhpcyBjb3JyZWN0bHksCi0gICAgIHdlIHdvdWxkIGhhdmUgdG8gbWFrZSBzdXJlIG91ciBtZW1vcnkgYmxvY2sgaXMgbGFyZ2UgZW5vdWdoLiAgSXQKLSAgICAgc28gaGFwcGVucyB0aGF0IG91ciB0ZXN0IGNhc2UgZG9lcyBub3QgaGF2ZSBhbnkgYWRkaXRpb25hbCBwYWdlcwotICAgICBmb3IgdGhlIGJzcyBzZWdtZW50LS1pdCBpcyBjb250YWluZWQgd2l0aGluIHRoZSBkYXRhIHNlZ21lbnQuCi0gICAgIFNvLCB3ZSBkb24ndCBib3RoZXIuICAqLwotICBpZiAoYWgtPmJzaXplICE9IDApCi0gICAgewotICAgICAgZnByaW50ZiAoc3RkZXJyLAotCSAgICAgICAiJXM6IGJzcyBzZWdtZW50IGlzICV1IGJ5dGVzOyBub24temVybyBzaXplcyBub3Qgc3VwcG9ydGVkXG4iLAotCSAgICAgICBhcmd2WzFdLCBhaC0+YnNpemUpOwotICAgICAgZXhpdCAoMSk7Ci0gICAgfQotCi0gIC8qIFRoZSB0ZXh0IHNlY3Rpb24gc3RhcnRzIGp1c3QgYWZ0ZXIgYWxsIHRoZSBoZWFkZXJzLCByb3VuZGVkIHRvIGEKLSAgICAgMTYgYnl0ZSBib3VuZGFyeS4gICovCi0gIHRvZmYgPSAoc2l6ZW9mIChzdHJ1Y3QgZWNvZmZfZmlsZWhkcikgKyBzaXplb2YgKHN0cnVjdCBlY29mZl9hb3V0aGRyKQotCSAgKyBmaC0+Zl9uc2NucyAqIEVDT0ZGX1NDTkhEUl9TSVpFKTsKLSAgdG9mZiArPSAxNTsKLSAgdG9mZiAmPX4gMTU7Ci0gIHQgPSB6ICsgdG9mZjsKLQotICAvKiBUaGUgdHNpemUgZmllbGQgZ2l2ZXMgdXMgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhIHNlZ21lbnQuICAqLwotICBkID0geiArIGFoLT50c2l6ZTsKLQotICAvKiBDYWxsIHRoZSBjb2RlIGFzIGEgZnVuY3Rpb24uICAqLwotICBwZm4gPSAoaW50ICgqKSAoKSkgdDsKLSAgcmV0ID0gKCpwZm4pIChkKTsKLQotICBwcmludGYgKCIlcyByYW4gYW5kIHJldHVybmVkICVkXG4iLCBhcmd2WzFdLCByZXQpOwotCi0gIGV4aXQgKDApOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QxLmMgYi9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYjZlYi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdDEuYworKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKiBGaXJzdCBDIHNvdXJjZSBmaWxlIGZvciBhY3R1YWwgZXhlY3V0aW9uIHRlc3QuICAqLwotCi0vKiBUaGUgbWFpbiBwb2ludCBvZiB0aGlzIHRlc3QgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvZGUgYW5kIGRhdGEKLSAgIGFyZSB0cnVseSBwb3NpdGlvbiBpbmRlcGVuZGVudC4gIFdlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZSBzZXZlcmFsCi0gICBnbG9iYWwgdmFyaWFibGVzLCBhbmQgbWFrZSBzdXJlIHRoYXQgdGhleSBhcmUgY29ycmVjdGx5IGFkanVzdGVkIGF0Ci0gICBydW50aW1lLiAgKi8KLQotaW50IGkgPSAxOwotaW50IGogPSAwOwotZXh0ZXJuIGludCBrOwotaW50IGw7Ci1jaGFyIHNtYWxsX2J1ZltdID0gImFhYWEiOwotY2hhciAqc21hbGxfcG9pbnRlciA9IHNtYWxsX2J1ZjsKLWNoYXIgYmlnX2J1ZltdID0gImFhYWFhYWFhYWFhYWFhYWEiOwotY2hhciAqYmlnX3BvaW50ZXIgPSBiaWdfYnVmOwotCi1leHRlcm4gaW50IGJhciAoKTsKLWludCAoKnBiYXIpICgpID0gYmFyOwotCi1zdGF0aWMgaW50Ci1mb28yIChhcmcpCi0gICAgIGludCBhcmc7Ci17Ci0gIGwgPSBhcmc7Ci0gIHJldHVybiBpICsgajsKLX0KLQotaW50ICgqcGZvbzIpICgpID0gZm9vMjsKLQotaW50Ci1jaGtzdHIgKHosIGMpCi0gICAgIGNoYXIgKno7Ci0gICAgIGludCBjOwotewotICAvKiBTd2l0Y2ggc3RhdGVtZW50cyBuZWVkIGV4dHJhIGVmZm9ydCB0byBiZSBwb3NpdGlvbiBpbmRlcGVuZGVudCwKLSAgICAgc28gd2UgcnVuIG9uZSBoZXJlLCBldmVuIHRob3VnaCBtb3N0IG9mIHRoZSBjYXNlcyB3aWxsIG5ldmVyIGJlCi0gICAgIHRha2VuLiAgKi8KLSAgc3dpdGNoIChjKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiBpIC0gMTsKLSAgICBjYXNlIDQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgY2FzZSA2OgotICAgIGNhc2UgNzoKLSAgICBjYXNlIDg6Ci0gICAgY2FzZSA5OgotICAgICAgcmV0dXJuIGkgKiBqOwotICAgIGNhc2UgMTA6Ci0gICAgY2FzZSAxMToKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTM6Ci0gICAgY2FzZSAxNDoKLSAgICBjYXNlIDE1OgotICAgICAgcmV0dXJuIGo7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgd2hpbGUgKGMtLSAhPSAwKQotICAgIGlmICgqeisrICE9ICdhJykKLSAgICAgIHJldHVybiAwOwotCi0gIHJldHVybiAqeiA9PSAnXDAnOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibGVyIHN0YXJ0dXAgcm91dGluZS4gIEl0IHRyaWVzCi0gICB0byB0ZXN0IHRoYXQgZXZlcnl0aGluZyB3YXMgY29ycmVjdGx5IGluaXRpYWxpemVkLiAgSXQgcmV0dXJucyAwIG9uCi0gICBzdWNjZXNzLCBzb21ldGhpbmcgZWxzZSBvbiBmYWlsdXJlLiAgKi8KLQotaW50Ci1mb28gKCkKLXsKLSAgaWYgKGkgIT0gMSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKGogIT0gMCkKLSAgICByZXR1cm4gMjsKLSAgaWYgKCEgY2hrc3RyIChzbWFsbF9idWYsIDQpKQotICAgIHJldHVybiAzOwotICBpZiAoISBjaGtzdHIgKHNtYWxsX3BvaW50ZXIsIDQpKQotICAgIHJldHVybiA0OwotICBpZiAoISBjaGtzdHIgKGJpZ19idWYsIDE2KSkKLSAgICByZXR1cm4gNTsKLSAgaWYgKCEgY2hrc3RyIChiaWdfcG9pbnRlciwgMTYpKQotICAgIHJldHVybiA2OwotCi0gIGlmIChsICE9IDApCi0gICAgcmV0dXJuIDc7Ci0gIGlmIChmb28yICgxKSAhPSAxKQotICAgIHJldHVybiA4OwotICBpZiAobCAhPSAxKQotICAgIHJldHVybiA5OwotICBpZiAoKCpwZm9vMikgKDIpICE9IDEpCi0gICAgcmV0dXJuIDEwOwotICBpZiAobCAhPSAyKQotICAgIHJldHVybiAxMTsKLQotICBpZiAoYmFyICgxKSAhPSAwKQotICAgIHJldHVybiAxMjsKLSAgaWYgKGJhciAoLTEpICE9IDEpCi0gICAgcmV0dXJuIDEzOwotICBpZiAoKCpwYmFyKSAoMHhhNWE1YTVhNSkgIT0gLTEpCi0gICAgcmV0dXJuIDE0OwotICBpZiAoayAhPSAweGE1YTVhNWE1KQotICAgIHJldHVybiAxNTsKLSAgaWYgKCgqcGJhcikgKDApICE9IDB4YTVhNWE1YTUpCi0gICAgcmV0dXJuIDE2OwotICBpZiAoayAhPSAwKQotICAgIHJldHVybiAxNzsKLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0Mi5jIGIvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDUyNWYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLWVtcGljL3J1bnRlc3QyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKiBTZWNvbmQgQyBzb3VyY2UgZmlsZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB0ZXN0LiAgKi8KLQotaW50IGs7Ci1leHRlcm4gaW50IGk7Ci1leHRlcm4gaW50IGo7Ci1leHRlcm4gY2hhciBzbWFsbF9idWZbXTsKLWV4dGVybiBjaGFyICpzbWFsbF9wb2ludGVyOwotCi1leHRlcm4gaW50IGNoa3N0ciAoKTsKLQotaW50Ci1iYXIgKG4pCi0gICAgIGludCBuOwotewotICBpbnQgcjsKLQotICBpZiAoaSAhPSAxCi0gICAgICB8fCBqICE9IDAKLSAgICAgIHx8ICEgY2hrc3RyIChzbWFsbF9idWYsIDQpCi0gICAgICB8fCAhIGNoa3N0ciAoc21hbGxfcG9pbnRlciwgNCkpCi0gICAgcmV0dXJuIGsgKyAxOwotCi0gIHIgPSBrOwotICBrID0gbjsKLSAgcmV0dXJuIHI7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtZW1waWMvcnVudGVzdGkucyBiL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0aS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmExOTUzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1lbXBpYy9ydW50ZXN0aS5zCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotIyBBc3NlbWJsZXIgaW5pdGlhbGl6YXRpb24gY29kZSBmb3IgYWN0dWFsIGV4ZWN1dGlvbiB0ZXN0LgotCQotIyBUaGlzIGNvZGUgYmVjb21lcyB0aGUgc3RhcnQgb2YgdGhlIGV4ZWN1dGlvbiB0ZXN0IHByb2dyYW0uICBJdCBpcwotIyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6aW5nIHRoZSBzdGF0aWMgZGF0YSwgaW52b2tpbmcgdGhlIEMgY29kZSwKLSMgYW5kIHJldHVybmluZyB0aGUgcmVzdWx0LiAgSXQgaXMgY2FsbGVkIGFzIHRob3VnaCBpdCB3ZXJlIGEgQwotIyBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50IG9mIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhIHNlZ21lbnQuCi0KLSMgV2UgbmVlZCB0byBrbm93IHRoZSB2YWx1ZSBvZiBfZnRleHQgYW5kIF9mZGF0YSBhdCBsaW5rIHRpbWUsIGJ1dCB3ZQotIyBoYXZlIG5vIHdheSB0byBhY3R1YWxseSBnZXQgdGhhdCBhdCBydW50aW1lLiAgVGhpcyBpcyBiZWNhdXNlIHdoZW4KLSMgdGhpcyBjb2RlIGlzIGNvbXBpbGVkIHdpdGggLW1lbWJlZGRlZC1waWMsIHRoZSBsYSBpbnN0cnVjdGlvbiB3aWxsCi0jIGJlIHR1cm5lZCBpbnRvIGFuIGFkZGl1ICRncCBpbnN0cnVjdGlvbi4gIFdlIHdvcmsgYXJvdW5kIHRoaXMgYnkKLSMgc3RvcmluZyB0aGUgaW5mb3JtYXRpb24gaW4gd29yZHMgaW4gdGhlIC5kYXRhIHNlY3Rpb24uICBXZSB0aGVuIGxvYWQKLSMgdGhlIHZhbHVlcyBvZiB0aGVzZSB3b3JkcyAqYmVmb3JlKiBkb2luZyB0aGUgcnVudGltZSByZWxvY2F0aW9uLgotCS5zZGF0YQotdGV4dF9zdGFydDoKLQkud29yZAlfZnRleHQKLWRhdGFfc3RhcnQ6Ci0JLndvcmQJX2ZkYXRhCi0KLQkuZ2xvYmwJc3RhcnQKLQkudGV4dAotc3RhcnQ6Ci0JIyBHcmFiIHNvbWUgc3BhY2Ugb24gdGhlIHN0YWNrLCBqdXN0IGFzIHRob3VnaCB3ZSB3ZXJlIGEgcmVhbAotCSMgZnVuY3Rpb24uCi0JYWRkaXUJJHNwLCRzcCwtOAotCXN3CSQzMSwwKCRzcCkKLQotCSMgU2F2ZSB0aGUgJGdwIHJlZ2lzdGVyLCBhbmQgc2V0IGl0IHVwIGZvciBvdXIgZGF0YSBzZWN0aW9uLgotCXN3CSRncCw0KCRzcCkKLQotCWFkZHUJJGdwLCQ0LDB4ODAwMAkJIyBtYWNybwotCi0JIyBUaGUgc3RhcnQgb2YgdGhlIGRhdGEgc2VnbWVudCBpcyBpbiAkNC4KLQotCSMgR2V0IHRoZSBhZGRyZXNzIG9mIHN0YXJ0IGludG8gJDUgaW4gYSBwb3NpdGlvbiBpbmRlcGVuZGVudAotCSMgZmFzaGlvbi4KLQkuc2V0CW5vcmVvcmRlcgotCSRMRjEgPSAuICsgOAotCWJhbAkkTEYxCi0JbGEJJDUsc3RhcnQtJExGMQkJIyBtYWNybwotCS5zZXQJcmVvcmRlcgotCWFkZHUJJDUsJDUsJDMxCi0KLQkjIE5vdyBnZXQgdGhlIGFkZHJlc3Mgb2YgX2Z0ZXh0IGludG8gJDYuCi0JbGEJJDYsX2Z0ZXh0LXN0YXJ0CQkjIG1hY3JvCi0JYWRkdQkkNiwkNiwkNQotCi0JIyBHZXQgdGhlIHZhbHVlIG9mIF9mdGV4dCB1c2VkIHRvIGxpbmsgaW50byAkNy4KLQlsdwkkNyx0ZXh0X3N0YXJ0CQkjIG1hY3JvCi0KLQkjIEdldCB0aGUgdmFsdWUgb2YgX2ZkYXRhIHVzZWQgdG8gbGluayBpbnRvICQ4LgotCWx3CSQ4LGRhdGFfc3RhcnQJCSMgbWFjcm8KLQotCSMgR2V0IHRoZSBhZGRyZXNzIG9mIF9fcnVudGltZV9yZWxvY19zdGFydCBpbnRvICQ5LgotCWxhCSQ5LF9fcnVudGltZV9yZWxvY19zdGFydC1zdGFydAkjIG1hY3JvCi0JYWRkdQkkOSwkOSwkNQotCi0JIyBHZXQgdGhlIGFkZHJlc3Mgb2YgX19ydW50aW1lX3JlbG9jX3N0b3AgaW50byAkMTAuCi0JbGEJJDEwLF9fcnVudGltZV9yZWxvY19zdG9wLXN0YXJ0CSMgbWFjcm8KLQlhZGR1CSQxMCwkMTAsJDUKLQotCSMgVGhlIHdvcmRzIGJldHdlZW4gJDkgYW5kICQxMCBhcmUgdGhlIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24KLQkjIGluc3RydWN0aW9ucy4gIFN0ZXAgdGhyb3VnaCBhbmQgcmVsb2NhdGUgdGhlbS4gIEZpcnN0IHNldAotCSMgJDExIGFuZCAkMTIgdG8gdGhlIHZhbHVlcyB0byBhZGQgdG8gdGV4dCBhbmQgZGF0YSBzZWN0aW9ucywKLQkjIHJlc3BlY3RpdmVseS4KLQlzdWJ1CSQxMSwkNiwkNwotCXN1YnUJJDEyLCQ0LCQ4Ci0KLTE6CQotCWJnZQkkOSwkMTAsM2YJCSMgbWFjcm8KLQlsdwkkMTMsMCgkOSkKLQlhbmQJJDE0LCQxMywweGZmZmZmZmZlCSMgbWFjcm8KLQltb3ZlCSQxNSwkMTEKLQliZXEJJDEzLCQxNCwyZgotCW1vdmUJJDE1LCQxMgotMjoJCi0JYWRkdQkkMTQsJDE0LCQ0Ci0JbHcJJDI0LDAoJDE0KQotCWFkZHUJJDI0LCQyNCwkMTUKLQlzdwkkMjQsMCgkMTQpCi0JYWRkaXUJJDksJDksNAotCWIJMWIKLTM6CQotCi0JIyBOb3cgdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgZGF0YSBoYXMgYmVlbiByZWxvY2F0ZWQKLQkjIGNvcnJlY3RseSwgYW5kIHdlIGNhbiBjYWxsIHRoZSBDIGNvZGUgd2hpY2ggZG9lcyB0aGUgYWN0dWFsCi0JIyB0ZXN0aW5nLgotCWJhbAlmb28KLQotCSMgV2UgcmV0dXJuIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgQyBjb2RlLgotCWx3CSQzMSwwKCRzcCkKLQlsdwkkZ3AsNCgkc3ApCi0JYWRkdQkkc3AsJHNwLDgKLQlqCSQzMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ODk0NS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczEuYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotZXh0ZXJuIGludCBmb28gKCk7Ci1pbnQKLWZ1bmMgKCkKLXsKLSAgcmV0dXJuIGZvbyAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMS50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTQ4YzkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MxLnQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLU5PQ1JPU1NSRUZTICggLnRleHQgLmRhdGEgKQotU0VDVElPTlMKLXsKLSAgLnRleHQgOiB7IHRtcGRpci9jcm9zczEubyB9Ci0gIC5kYXRhIDogeyB0bXBkaXIvY3Jvc3MyLm8gfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3MyLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0MzE3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIuYworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotaW50Ci1mb28gKCkKLXsKLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczIudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjA0NmY2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMi50CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1OT0NST1NTUkVGUyAoIC50ZXh0IC5kYXRhICkKLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDogeyAqKC50ZXh0KSAqKC5wcikgfQotICAuZGF0YSA6IHsgKiguZGF0YSkgKiguc2RhdGEpICooLnJ3KSAqKC50YzApICooLnRjKSB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9jcm9zczMuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQ4YzMyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzMy5jCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1pbnQgaSA9IDQ7Ci0KLWludAotZm9vICgpCi17Ci0gIHJldHVybiBpOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvY3Jvc3NyZWYuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWU5NzU5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2Nyb3NzcmVmLmV4cAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSMgVGVzdCBOT0NST1NTUkVGUyBpbiBhIGxpbmtlciBzY3JpcHQuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1zZXQgdGVzdDEgIk5PQ1JPU1NSRUZTIDEiCi1zZXQgdGVzdDIgIk5PQ1JPU1NSRUZTIDIiCi0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDEKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MxLmMiIHRtcGRpci9jcm9zczEub10gXAotICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICIkc3JjZGlyLyRzdWJkaXIvY3Jvc3MyLmMiIHRtcGRpci9jcm9zczIub10gfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB1bnJlc29sdmVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1zZXQgZmxhZ3MgIiIKLQotIyBUaGUgYTI5ayBjb21waWxlZCBjb2RlIGNhbGxzIFZfU1BJTEwgYW5kIFZfRklMTC4gIFNpbmNlIHdlIGRvbid0Ci0jIG5lZWQgdG8gcnVuIHRoaXMgY29kZSwgYnV0IHdlIGRvbid0IGhhdmUgZGVmaW5pdGlvbnMgZm9yIHRob3NlCi0jIGZ1bmN0aW9ucywgd2UganVzdCBkZWZpbmUgdGhlbSBvdXQuCi1pZiBbaXN0YXJnZXQgYTI5ayotKi0qXSB7Ci0gICAgc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gVl9TUElMTD0wIC0tZGVmc3ltIFZfRklMTD0wIgotfQotCi0jIGhwcGEtZWxmIG5lZWRzIGEgZGVmaW5pdGlvbiBmb3IgJGdsb2JhbCQuCi1pZiBbaXN0YXJnZXQgaHBwYSotKi0qXSB7Ci0gICAgc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gJ1wkZ2xvYmFsXCQnPTAiCi19Ci0KLXZlcmJvc2UgLWxvZyAiJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MxIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczEudCB0bXBkaXIvY3Jvc3MxLm8gdG1wZGlyL2Nyb3NzMi5vIgotCi1jYXRjaCAiZXhlYyAkbGQgJGZsYWdzIC1vIHRtcGRpci9jcm9zczEgLVQgJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMS50IHRtcGRpci9jcm9zczEubyB0bXBkaXIvY3Jvc3MyLm8iIGV4ZWNfb3V0cHV0Ci0KLXNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotCi1yZWdzdWIgLWFsbCAiKF58XG4pKCRsZDogd2FybmluZzogY2Fubm90IGZpbmQgZW50cnkgc3ltYm9sXFteXG5cXSpcbj8pIiAkZXhlY19vdXRwdXQgIlxcMSIgZXhlY19vdXRwdXQKLQotaWYgW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHRoZW4gewotICAgIGZhaWwgJHRlc3QxCi19IGVsc2UgewotICAgIHZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotICAgIGlmIFtyZWdleHAgInByb2hpYml0ZWQgY3Jvc3MgcmVmZXJlbmNlIGZyb20gLiogdG8gYGZvbycgaW4iICRleGVjX291dHB1dF0gewotCXBhc3MgJHRlc3QxCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0MQotICAgIH0KLX0KLQotIyBDaGVjayBjcm9zcyByZWZlcmVuY2VzIHdpdGhpbiBhIHNpbmdsZSBvYmplY3QuCi0KLWlmIHsgIVtsZF9jb21waWxlICRDQyAiJHNyY2Rpci8kc3ViZGlyL2Nyb3NzMy5jIiB0bXBkaXIvY3Jvc3MzLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLXZlcmJvc2UgLWxvZyAiJGxkICRmbGFncyAtbyB0bXBkaXIvY3Jvc3MyIC1UICRzcmNkaXIvJHN1YmRpci9jcm9zczIudCB0bXBkaXIvY3Jvc3MzLm8iCi0KLWNhdGNoICJleGVjICRsZCAkZmxhZ3MgLW8gdG1wZGlyL2Nyb3NzMiAtVCAkc3JjZGlyLyRzdWJkaXIvY3Jvc3MyLnQgdG1wZGlyL2Nyb3NzMy5vIiBleGVjX291dHB1dAotCi1zZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotcmVnc3ViIC1hbGwgIihefFxuKSgkbGQ6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbFxbXlxuXF0qXG4/KSIgJGV4ZWNfb3V0cHV0ICJcXDEiIGV4ZWNfb3V0cHV0Ci0KLWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLSAgICBmYWlsICR0ZXN0MgotfSBlbHNlIHsKLSAgICB2ZXJib3NlIC1sb2cgIiRleGVjX291dHB1dCIKLSAgICBpZiBbcmVnZXhwICJwcm9oaWJpdGVkIGNyb3NzIHJlZmVyZW5jZSBmcm9tIC4qIHRvIGAuKicgaW4iICRleGVjX291dHB1dF0gewotCXBhc3MgJHRlc3QyCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0MgotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTI2YmMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jIFRlc3QgREVGSU5FRCBpbiBhIGxpbmtlciBzY3JpcHQuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LgotCi1zZXQgdGVzdG5hbWUgIkRFRklORUQiCi1zZXQgcHJtc19pZCA1Njk5Ci0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci9kZWZpbmVkLnMgdG1wZGlyL2RlZi5vXSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL2RlZiAiLVQgJHNyY2Rpci8kc3ViZGlyL2RlZmluZWQudCB0bXBkaXIvZGVmLm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL2RlZl0gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlpZiB7IVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodmFsdWUxKV0gXAotCSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodmFsdWUyKV19IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3RuYW1lCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQodmFsdWUxKSAhPSAxfSB7Ci0JCXNlbmRfbG9nICJ2YWx1ZTEgPT0gJG5tX291dHB1dCh2YWx1ZTEpXG4iCi0JCXZlcmJvc2UgInZhbHVlMSA9PSAkbm1fb3V0cHV0KHZhbHVlMSkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7Ci0JCWlmIHskbm1fb3V0cHV0KHZhbHVlMikgIT0gMn0gewotCQkgICAgc2VuZF9sb2cgInZhbHVlMiA9PSAkbm1fb3V0cHV0KHZhbHVlMilcbiIKLQkJICAgIHZlcmJvc2UgInZhbHVlMiA9PSAkbm1fb3V0cHV0KHZhbHVlMikiCi0JCSAgICBmYWlsICR0ZXN0bmFtZQotCQl9IGVsc2UgewotCQkgICAgcGFzcyAkdGVzdG5hbWUKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL2RlZmluZWQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2NGJiYi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQkuZ2xvYmwJZGVmaW5lZAotCWRlZmluZWQJPQkxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9kZWZpbmVkLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZWYxYjYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvZGVmaW5lZC50CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1TRUNUSU9OUyB7Ci0JLnRleHQgOiB7ICooLnRleHQpIH0KLQkuZGF0YSA6IHsgKiguZGF0YSkgfQotCS5ic3MgOiB7ICooLmJzcykgKihDT01NT04pIH0KLX0KLXZhbHVlMSA9IERFRklORUQgKGRlZmluZWQpID8gMSA6IDI7Ci12YWx1ZTIgPSBERUZJTkVEICh1bmRlZmluZWQpID8gMSA6IDI7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMzdmYTAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvcGhkcnMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyBUZXN0IFBIRFJTIGluIGEgbGlua2VyIHNjcmlwdC4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0KLSMgUEhEUlMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBFTEYuCi1pZiB7ICFbaXN0YXJnZXQgKi0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi11bml4d2FyZSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1lYWJpKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotaXJpeDUqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWlyaXg2Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1zb2xhcmlzMipdIH0gewotICAgIHJldHVybgotfQotCi1pZiB7IFtpc3RhcmdldCAqLSotbGludXgqYW91dCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0ICotKi1saW51eCpvbGRsZCpdIH0gewotICAgIHJldHVybgotfQotCi0jIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsaXN0aWMgdGVzdC4KLQotc2V0IHRlc3RuYW1lICJQSERSUyIKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3BoZHJzLnMgdG1wZGlyL3BoZHJzLm9dIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1zZXQgcGhkcnNfcmVnZXhwIFwKLSIuKlByb2dyYW0gSGVhZGVyOi4qUEhEUiAqb2ZmICoweDAwKjM0ICp2YWRkciAqMHgwMCo4MDAzNCAqcGFkZHIgKjB4MDAqODAwMzQuKmZpbGVzeiAqMHgwXFswLTlhLWZcXSogKm1lbXN6ICoweDBcWzAtOWEtZlxdKiBmbGFncyByLS0uKkxPQUQgKm9mZiAqMHgwMCogKnZhZGRyICoweDAwKjgwMDAwICpwYWRkciAqMHgwMCo4MDAwMC4qZmlsZXN6ICoweDAwKlxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzIHIteC4qTE9BRCAqb2ZmICoweDBcWzAtOWEtZlxdKiAqdmFkZHIgKjB4MDAqODAqXFswLTlhLWZcXSogKnBhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qLipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogKmZsYWdzICpydy0uKiIKLQotIyBPbiBhIDY0IGJpdCBFTEYgZm9ybWF0LCB3ZSBuZWVkIGRpZmZlcmVudCBudW1iZXJzLgotaWYgeyBbaXN0YXJnZXQgYWxwaGEqLSotKl0gfSB0aGVuIHsKLSAgc2V0IHBoZHJzX3JlZ2V4cCBcCi0iLipQcm9ncmFtIEhlYWRlcjouKlBIRFIgKm9mZiAqMHgwMCo0MCAqdmFkZHIgKjB4MDAqODAwNDAgKnBhZGRyICoweDAwKjgwMDQwLipmaWxlc3ogKjB4MFxbMC05YS1mXF0qICptZW1zeiAqMHgwXFswLTlhLWZcXSogZmxhZ3Mgci0tLipMT0FEICpvZmYgKjB4MDAqICp2YWRkciAqMHgwMCo4MDAwMCAqcGFkZHIgKjB4MDAqODAwMDAuKmZpbGVzeiAqMHgwMCpcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qICpmbGFncyByLXguKkxPQUQgKm9mZiAqMHgwXFswLTlhLWZcXSogKnZhZGRyICoweDAwKjgwKlxbMC05YS1mXF0qICpwYWRkciAqMHgwMCo4MCpcWzAtOWEtZlxdKi4qZmlsZXN6ICoweDBcWzAtOWEtZlxdKiAqbWVtc3ogKjB4MFxbMC05YS1mXF0qICpmbGFncyAqcnctLioiCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9waGRycyAiLVQgJHNyY2Rpci8kc3ViZGlyL3BoZHJzLnQgdG1wZGlyL3BoZHJzLm8iXSB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgaWYge1t3aGljaCAkb2JqZHVtcF0gPT0gMH0gewotCXVucmVzb2x2ZWQgJHRlc3RuYW1lCi0JcmV0dXJuCi0gICAgfQotCi0gICAgdmVyYm9zZSAtbG9nICIkb2JqZHVtcCAtLXByaXZhdGUgdG1wZGlyL3BoZHJzIgotICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC0tcHJpdmF0ZSB0bXBkaXIvcGhkcnMiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0gICAgdmVyYm9zZSAtbG9nICRleGVjX291dHB1dAotCi0gICAgaWYgW3JlZ2V4cCAkcGhkcnNfcmVnZXhwICRleGVjX291dHB1dF0gewotCXBhc3MgJHRlc3RuYW1lCi0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0bmFtZQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFmMGQxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLQkudGV4dAotCi0JLmxvbmcJMQotCi0JLmRhdGEKLQotCS5sb25nCTIKLQkKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9waGRycy50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjcxMGUyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3BoZHJzLnQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1QSERSUwotewotICBoZWFkZXIgUFRfUEhEUiBQSERSUyA7Ci0gIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIDsKLSAgZGF0YSBQVF9MT0FEIDsKLX0KLQotU0VDVElPTlMKLXsKLSAgLiA9IDB4ODAwMDAgKyBTSVpFT0ZfSEVBREVSUzsKLSAgLnRleHQgOiB7ICooLnRleHQpIH0gOnRleHQKLSAgLmRhdGEgOiB7ICooLmRhdGEpIH0gOmRhdGEKLSAgL0RJU0NBUkQvIDogeyAqKC5yZWdpbmZvKSB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwYTA0MS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotIyBUZXN0IGJhc2ljIGxpbmtlciBzY3JpcHQgZnVuY3Rpb25hbGl0eQotIyBCeSBJYW4gTGFuY2UgVGF5bG9yLCBDeWdudXMgU3VwcG9ydAotCi1zZXQgdGVzdG5hbWUgInNjcmlwdCIKLQotaWYgIVtsZF9hc3NlbWJsZSAkYXMgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdC5zIHRtcGRpci9zY3JpcHQub10geyAKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1wcm9jIGNoZWNrX3NjcmlwdCB7IH0gewotICAgIGdsb2JhbCBubQotICAgIGdsb2JhbCB0ZXN0bmFtZQotICAgIGdsb2JhbCBubV9vdXRwdXQKLQotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci9zY3JpcHRdIHsKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JaWYgeyFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KHRleHRfc3RhcnQpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dCh0ZXh0X2VuZCldIFwKLQkgICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRhdGFfc3RhcnQpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChkYXRhX2VuZCldfSB7Ci0JICAgIHNlbmRfbG9nICJiYWQgb3V0cHV0IGZyb20gbm1cbiIKLQkgICAgdmVyYm9zZSAiYmFkIG91dHB1dCBmcm9tIG5tIgotCSAgICBmYWlsICR0ZXN0bmFtZQotCX0gZWxzZSB7Ci0JICAgIGlmIHskbm1fb3V0cHV0KHRleHRfc3RhcnQpICE9IDB4MTAwfSB7Ci0JCXNlbmRfbG9nICJ0ZXh0X3N0YXJ0ID09ICRubV9vdXRwdXQodGV4dF9zdGFydClcbiIKLQkJdmVyYm9zZSAidGV4dF9zdGFydCA9PSAkbm1fb3V0cHV0KHRleHRfc3RhcnQpIgotCQlmYWlsICR0ZXN0bmFtZQotCSAgICB9IGVsc2UgeyBpZiB7JG5tX291dHB1dCh0ZXh0X2VuZCkgPCAweDEwNCBcCi0JCQkgIHx8ICRubV9vdXRwdXQodGV4dF9lbmQpID4gMHgxMTB9IHsKLQkJc2VuZF9sb2cgInRleHRfZW5kID09ICRubV9vdXRwdXQodGV4dF9lbmQpXG4iCi0JCXZlcmJvc2UgInRleHRfZW5kID09ICRubV9vdXRwdXQodGV4dF9lbmQpIgotCQlmYWlsICR0ZXN0bmFtZQotCSAgICB9IGVsc2UgeyBpZiB7JG5tX291dHB1dChkYXRhX3N0YXJ0KSAhPSAweDEwMDB9IHsKLQkJc2VuZF9sb2cgImRhdGFfc3RhcnQgPT0gJG5tX291dHB1dChkYXRhX3N0YXJ0KVxuIgotCQl2ZXJib3NlICJkYXRhX3N0YXJ0ID09ICRubV9vdXRwdXQoZGF0YV9zdGFydCkiCi0JCWZhaWwgJHRlc3RuYW1lCi0JICAgIH0gZWxzZSB7IGlmIHskbm1fb3V0cHV0KGRhdGFfZW5kKSA8IDB4MTAwNCBcCi0JCQkgfHwgJG5tX291dHB1dChkYXRhX2VuZCkgPiAweDEwMTB9IHsKLQkJc2VuZF9sb2cgImRhdGFfZW5kID09ICRubV9vdXRwdXQoZGF0YV9lbmQpXG4iCi0JCXZlcmJvc2UgImRhdGFfZW5kID09ICRubV9vdXRwdXQoZGF0YV9lbmQpIgotCQlmYWlsICR0ZXN0bmFtZQotCSAgICB9IGVsc2UgewotCQlwYXNzICR0ZXN0bmFtZQotCSAgICB9IH0gfSB9Ci0JfQotICAgIH0KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NjcmlwdCAiLVQgJHNyY2Rpci8kc3ViZGlyL3NjcmlwdC50IHRtcGRpci9zY3JpcHQubyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotfSBlbHNlIHsKLSAgICBjaGVja19zY3JpcHQKLX0KLQotc2V0IHRlc3RuYW1lICJNUkkgc2NyaXB0IgotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2NyaXB0ICItYyAkc3JjZGlyLyRzdWJkaXIvc2NyaXB0bS50Il0gewotICAgIGZhaWwgJHRlc3RuYW1lCi19IGVsc2UgewotICAgIGNoZWNrX3NjcmlwdAotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnMgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiNjViMC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQucworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotCS50ZXh0Ci0JLmdsb2JsIHRleHRfc3ltYm9sCi10ZXh0X3N5bWJvbDoJCi0JLmxvbmcJMQotCS5kYXRhCi0JLmdsb2JsIGRhdGFfc3ltYm9sCi1kYXRhX3N5bWJvbDoJCi0JLmxvbmcJMgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0LnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQudApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3YTQ4YS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zY3JpcHQudAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLVNFQ1RJT05TCi17Ci0gIC50ZXh0IDB4MTAwIDogeyAKLSAgICB0ZXh0X3N0YXJ0ID0gLjsKLSAgICAqKC50ZXh0KQotICAgICooLnByKQotICAgIHRleHRfZW5kID0gLjsKLSAgfQotICAuID0gMHgxMDAwOwotICAuZGF0YSA6IHsKLSAgICBkYXRhX3N0YXJ0ID0gLjsKLSAgICAqKC5kYXRhKQotICAgICooLnJ3KQotICAgIGRhdGFfZW5kID0gLjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0bS50IGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2NyaXB0bS50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NjYWUxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NjcmlwdG0udAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSogTVJJIHNjcmlwdAotc2VjdCAudGV4dCA9ICQxMDAJOyAudGV4dCBzdGFydCBhZGRyZXNzCi1zZWN0IC5kYXRhID0gMTAwMGgJOyAuZGF0YSBzdGFydCBhZGRyZXNzCi1wdWJsaWMgdGV4dF9zdGFydCA9ICQxMDAKLXB1YmxpYyB0ZXh0X2VuZCA9ICMgY29udGludWF0aW9uIGxpbmUKLSAgdGV4dF9zdGFydCArIDQKLXB1YmxpYyBkYXRhX3N0YXJ0ID0gMTAwMGgKLXB1YmxpYyBkYXRhX2VuZCA9IGRhdGFfc3RhcnQgKyA0Ci0KLWxvYWQgdG1wZGlyL3NjcmlwdC5vCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JkZWZkNC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotIyBUZXN0IFNJWkVPRiBpbiBhIGxpbmtlciBzY3JpcHQuCi0jIEJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0jIEJhc2VkIG9uIGEgYnVnIHJlcG9ydCBmcm9tIGFuZGVycy5ibG9tZGVsbEBjb250cm9sLmx0aC5zZS4KLQotc2V0IHRlc3RuYW1lICJTSVpFT0YiCi0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci9zaXplb2YucyB0bXBkaXIvc2l6ZW9mLm9dIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2l6ZW9mICItVCAkc3JjZGlyLyRzdWJkaXIvc2l6ZW9mLnQgdG1wZGlyL3NpemVvZi5vIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfbm0gJG5tIHRtcGRpci9zaXplb2ZdIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0bmFtZQotICAgIHJldHVybgotfQotCi1pZiB7IVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodGV4dF9zdGFydCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQodGV4dF9lbmQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRhdGFfc3RhcnQpXSBcCi0gICAgIHx8ICFbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRhdGFfZW5kKV0gXAotICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChzaXplb2ZfdGV4dCldIFwKLSAgICAgfHwgIVtpbmZvIGV4aXN0cyBubV9vdXRwdXQoc2l6ZW9mX2RhdGEpXX0gewotICAgIHNlbmRfbG9nICJiYWQgb3V0cHV0IGZyb20gbm1cbiIKLSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgeyRubV9vdXRwdXQodGV4dF9lbmQpIC0gJG5tX291dHB1dCh0ZXh0X3N0YXJ0KSAhPSAkbm1fb3V0cHV0KHNpemVvZl90ZXh0KX0gewotICAgIHNlbmRfbG9nICJ0ZXh0X2VuZCAtIHRleHRfc3RhcnQgIT0gc2l6ZW9mX3RleHRcbiIKLSAgICB2ZXJib3NlICJ0ZXh0X2VuZCAtIHRleHRfc3RhcnQgIT0gc2l6ZW9mX3RleHQiCi0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgeyRubV9vdXRwdXQoZGF0YV9lbmQpIC0gJG5tX291dHB1dChkYXRhX3N0YXJ0KSAhPSAkbm1fb3V0cHV0KHNpemVvZl9kYXRhKX0gewotICAgIHNlbmRfbG9nICJkYXRhX2VuZCAtIGRhdGFfc3RhcnQgIT0gc2l6ZW9mX2RhdGFcbiIKLSAgICB2ZXJib3NlICJkYXRhX2VuZCAtIGRhdGFfc3RhcnQgIT0gc2l6ZW9mX2RhdGEiCi0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotaWYgeyRubV9vdXRwdXQoc2l6ZW9mX3RleHQpICE9ICRubV9vdXRwdXQoc2l6ZW9mX2RhdGEpfSB7Ci0gICAgc2VuZF9sb2cgInNpemVvZl90ZXh0ICE9IHNpemVvZl9kYXRhXG4iCi0gICAgdmVyYm9zZSAic2l6ZW9mX3RleHQgIT0gc2l6ZW9mX2RhdGEiCi0gICAgZmFpbCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotcGFzcyAkdGVzdG5hbWUKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjFjYTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvc2l6ZW9mLnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0JLnNwYWNlCTE2CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy9zaXplb2YudCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi50CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjQ0YTM3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3NpemVvZi50CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotU0VDVElPTlMgewotCS50ZXh0IDoKLQkgIHsKLQkgICAgdGV4dF9zdGFydCA9IC47Ci0JICAgIHRtcGRpci9zaXplb2YubyAKLQkgICAgdGV4dF9lbmQgPSAuOwotCSAgfQotCS5kYXRhIDogCi0JICB7IAotCSAgICBkYXRhX3N0YXJ0ID0gLjsKLQkgICAgLiA9IC4gKyBTSVpFT0YoLnRleHQpOwotCSAgICBkYXRhX2VuZCA9IC47Ci0JICB9Ci19CQotCi1zaXplb2ZfdGV4dCA9IFNJWkVPRigudGV4dCk7Ci1zaXplb2ZfZGF0YSA9IFNJWkVPRiguZGF0YSk7CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTY1OTY3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotIyBUZXN0IHdlYWsgc3ltYm9scy4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFNvbHV0aW9ucy4KLQotc2V0IHRlc3RuYW1lICJ3ZWFrIHN5bWJvbHMiCi0KLSMgVGhpcyB0ZXN0IG9ubHkgd29ya3MgZm9yIEVMRiB0YXJnZXRzLiAgSXQgb3VnaHQgdG8gd29yayBmb3Igc29tZQotIyBhLm91dCB0YXJnZXRzLCBidXQgaXQgZG9lc24ndC4KLQotaWYgeyAhW2lzdGFyZ2V0ICotKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotdW5peHdhcmUqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotZWFiaSpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgKi0qLWlyaXg1Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0ICotKi1pcml4NipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCAqLSotc29sYXJpczIqXSB9IHRoZW4gewotICAgIHJldHVybgotfQotCi1pZiB7IFtpc3RhcmdldCAqLSotbGludXgqYW91dCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0ICotKi1saW51eCpvbGRsZCpdIH0gewotICAgIHJldHVybgotfQotCi1pZiB7ISBbbGRfYXNzZW1ibGUgJGFzICRzcmNkaXIvJHN1YmRpci93ZWFrMS5zIHRtcGRpci93ZWFrMS5vXQotICAgIHx8ICEgW2xkX2Fzc2VtYmxlICRhcyAkc3JjZGlyLyRzdWJkaXIvd2VhazIucyB0bXBkaXIvd2VhazIub119IHRoZW4gewotICAgICMgSXQncyBPSyBpZiAud2VhayBkb2Vzbid0IHdvcmsgb24gdGhpcyB0YXJnZXQuCi0gICAgdW5yZXNvbHZlZCAkdGVzdG5hbWUKLSAgICByZXR1cm4KLX0KLQotc2V0IHdlYWtfcmVnZXhwX2JpZyBcCi0iLipDb250ZW50cyBvZiBzZWN0aW9uIC50ZXh0Oi4qMTAwMCAwMDAwMTAwOCAwMDAwMjAwYyAxMjEyMTIxMiAzNDM0MzQzNC4qQ29udGVudHMgb2Ygc2VjdGlvbiAuZGF0YTouKjIwMDAgMDAwMDEwMDggMDAwMDIwMGMgNTY1NjU2NTYgNzg3ODc4NzguKiIKLQotc2V0IHdlYWtfcmVnZXhwX2xpdHRsZSBcCi0iLipDb250ZW50cyBvZiBzZWN0aW9uIC50ZXh0Oi4qMTAwMCAwODEwMDAwMCAwYzIwMDAwMCAxMjEyMTIxMiAzNDM0MzQzNC4qQ29udGVudHMgb2Ygc2VjdGlvbiAuZGF0YTouKjIwMDAgMDgxMDAwMDAgMGMyMDAwMDAgNTY1NjU2NTYgNzg3ODc4NzguKiIKLQotaWYgeyEgW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvd2VhayAiLVQgJHNyY2Rpci8kc3ViZGlyL3dlYWsudCB0bXBkaXIvd2VhazEubyB0bXBkaXIvd2VhazIubyJdIH0gdGhlbiB7Ci0gICAgZmFpbCAkdGVzdG5hbWUKLX0gZWxzZSB7Ci0gICAgaWYge1t3aGljaCAkb2JqZHVtcF0gPT0gMH0gdGhlbiB7Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRvYmpkdW1wIC1zIHRtcGRpci93ZWFrIgotICAgIGNhdGNoICJleGVjICRvYmpkdW1wIC1zIHRtcGRpci93ZWFrIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIHZlcmJvc2UgLWxvZyAkZXhlY19vdXRwdXQKLQotICAgIGlmIHtbcmVnZXhwICR3ZWFrX3JlZ2V4cF9iaWcgJGV4ZWNfb3V0cHV0XSBcCi0JfHwgW3JlZ2V4cCAkd2Vha19yZWdleHBfbGl0dGxlICRleGVjX291dHB1dF0gfSB0aGVuIHsKLQlwYXNzICR0ZXN0bmFtZQotICAgIH0gZWxzZSB7Ci0JZmFpbCAkdGVzdG5hbWUKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLnQgYi9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrLnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZDAxM2UuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2Vhay50CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotU0VDVElPTlMKLXsKLSAgLnRleHQgMHgxMDAwIDogewotICAgIHRtcGRpci93ZWFrMS5vKC5kYXRhKQotICB9Ci0gIC5kYXRhIDB4MjAwMCA6IHsKLSAgICB0bXBkaXIvd2VhazIubyguZGF0YSkKLSAgfQotICAvRElTQ0FSRC8gOiB7Ci0gICAgKigqKQotICB9Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMS5zIGIvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazEucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2ZmJlMS4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2NyaXB0cy93ZWFrMS5zCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLmRhdGEKLQkuZ2xvYmFsCWZvbzEKLQkuZ2xvYmFsCXN5bTEKLQkud2VhawlzeW0yCi1mb28xOgotCS5sb25nCXN5bTEKLQkubG9uZwlzeW0yCi1zeW0xOgotCS5sb25nCTB4MTIxMjEyMTIKLXN5bTI6Ci0JLmxvbmcJMHgzNDM0MzQzNApkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazIucyBiL2xkL3Rlc3RzdWl0ZS9sZC1zY3JpcHRzL3dlYWsyLnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZWRmZjUuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNjcmlwdHMvd2VhazIucworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS5kYXRhCi0JLmdsb2JhbAlmb28yCi0JLndlYWsJc3ltMQotCS5nbG9iYWwJc3ltMgotZm9vMjoKLQkubG9uZwlzeW0xCi0JLmxvbmcJc3ltMgotc3ltMToKLQkubG9uZwkweDU2NTY1NjU2Ci1zeW0yOgotCS5sb25nCTB4Nzg3ODc4NzgKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMS5jIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8xLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMDIzNjcuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS8xLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vKiBfc3RhcnQgc2hvdWxkIGJlIHRoZSBvbmx5IHRoaW5nIGxlZnQgYWZ0ZXIgR0MuICAqLwotCi12b2lkIF9zdGFydCgpIF9fYXNtX18oIl9zdGFydCIpOwotdm9pZCBfc3RhcnQoKQotewotfQotCi12b2lkIGRyb3BtZTEoKQotewotfQotCi1pbnQgZHJvcG1lMlsxMDJdID0geyAwIH07CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk1ODg3Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyogTm9ybWFsbHkgd2Ugc2hvdWxkIGxvb3NlIGZvbyBhbmQga2VlcCBfc3RhcnQgYW5kIF9pbml0LiAKLSAgIFdpdGggLXUgZm9vLCB3ZSBzaG91bGQga2VlcCB0aGF0IGFzIHdlbGwuICAqLwotCi12b2lkIF9zdGFydCgpIF9fYXNtX18oIl9zdGFydCIpOwotdm9pZCBfc3RhcnQoKQotewotfQotCi12b2lkIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5pbml0IikpKQotX2luaXQoKQotewotfQotCi1pbnQgZm9vKCkgX19hc21fXygiZm9vIik7Ci1pbnQgZm9vKCkKLXsKLSAgc3RhdGljIGludCB4ID0gMTsKLSAgcmV0dXJuIHgrKzsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMy5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvMy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyYmM1ZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlLzMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1zdHJ1Y3QgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci0gIHZpcnR1YWwgdm9pZCBiYXIoKTsKLX07Ci0KLXZvaWQgQTo6Zm9vKCkgeyB9CQkJLy8ga2VlcAotdm9pZCBBOjpiYXIoKSB7IH0JCQkvLyBsb29zZQotCi1zdHJ1Y3QgQiA6IHB1YmxpYyBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLX07Ci0KLXZvaWQgQjo6Zm9vKCkgeyB9CQkJLy8ga2VlcAotCi12b2lkIF9zdGFydCgpIF9fYXNtX18oIl9zdGFydCIpOwkvLyBrZWVwCi0KLUEgYTsJCQkJCS8vIGtlZXAKLUIgYjsKLUEgKmdldG1lKCkgeyByZXR1cm4gJmE7IH0JCS8vIGtlZXAKLQotdm9pZCBfc3RhcnQoKQotewotICBnZXRtZSgpLT5mb28oKTsKLX0KLQotLy8gSW4gYWRkaXRpb24sIGtlZXAgQSdzIHZpcnR1YWwgdGFibGUuCi0KLS8vIFdlJ2xsIHdpbmQgdXAga2VlcGluZyBgYicgYW5kIHRodXMgQidzIHZpcnR1YWwgdGFibGUgYmVjYXVzZQotLy8gYGEnIGFuZCBgYicgYXJlIGJvdGggcmVmZXJlbmNlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KLQotZXh0ZXJuICJDIiB2b2lkIF9fbWFpbigpIHsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS80LmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS80LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGYyNmFjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvNC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXN0cnVjdCBBCi17Ci0gIHZpcnR1YWwgdm9pZCBmb28oKTsKLSAgdmlydHVhbCB2b2lkIGJhcigpOwotfTsKLQotdm9pZCBBOjpmb28oKSB7IH0JCQkvLyBsb29zZQotdm9pZCBBOjpiYXIoKSB7IH0JCQkvLyBrZWVwCi0KLXN0cnVjdCBCIDogcHVibGljIEEKLXsKLSAgdmlydHVhbCB2b2lkIGZvbygpOwotfTsKLQotdm9pZCBCOjpmb28oKSB7IH0JCQkvLyBsb29zZQotCi12b2lkIF9zdGFydCgpIF9fYXNtX18oIl9zdGFydCIpOwkvLyBrZWVwCi0KLUEgYTsJCQkJCS8vIGtlZXAKLUIgYjsKLUEgKmdldG1lKCkgeyByZXR1cm4gJmE7IH0JCS8vIGtlZXAKLQotdm9pZCBfc3RhcnQoKQotewotICBnZXRtZSgpLT5iYXIoKTsKLX0KLQotZXh0ZXJuICJDIiB2b2lkIF9fbWFpbigpIHsgfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS81LmNjIGIvbGQvdGVzdHN1aXRlL2xkLXNlbGVjdGl2ZS81LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTc5ZDkxLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvNS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIFRoaXMgdGVzdCBjdXJyZW50bHkgZmFpbHMgYmVjYXVzZSB0aGUgQysrIGZyb250IGVuZCBlbWl0cyBgQScgYXMKLS8vIHRoZSBiYXNlIGNsYXNzIGNhbGxlZCByYXRoZXIgdGhhbiBgQicgYXMgaXQgb3VnaHQuICBBdCBsZWFzdCBpdAotLy8gaXMgZXJyb3Jpbmcgb24gdGhlIHNhZmUgc2lkZS4uLgotCi1zdHJ1Y3QgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci0gIHZpcnR1YWwgdm9pZCBiYXIoKTsKLX07Ci0KLXZvaWQgQTo6Zm9vKCkgeyB9CQkJLy8gbG9vc2UKLXZvaWQgQTo6YmFyKCkgeyB9CQkJLy8gbG9vc2UKLQotc3RydWN0IEIgOiBwdWJsaWMgQQotewotICB2aXJ0dWFsIHZvaWQgZm9vKCk7Ci19OwotCi12b2lkIEI6OmZvbygpIHsgfQkJCS8vIGtlZXAKLQotdm9pZCBfc3RhcnQoKSBfX2FzbV9fKCJfc3RhcnQiKTsJLy8ga2VlcAotCi1BIGE7Ci1CIGI7CQkJCQkvLyBrZWVwCi1CICpnZXRtZSgpIHsgcmV0dXJuICZiOyB9CQkvLyBrZWVwCi0KLXZvaWQgX3N0YXJ0KCkKLXsKLSAgZ2V0bWUoKS0+Zm9vKCk7Ci19Ci0KLWV4dGVybiAiQyIgdm9pZCBfX21haW4oKSB7IH0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zZWxlY3RpdmUvc2VsZWN0aXZlLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhOWQ5Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2VsZWN0aXZlL3NlbGVjdGl2ZS5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBMRCBzZWxlY3RpdmUgbGlua2luZyB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IENhdGhlcmluZSBNb29yZSAoY2xtQGN5Z251cy5jb20pCi0jIE1ha2Ugc3VyZSB0aGF0IGNvbnN0cnVjdG9ycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCi0KLQotIyBDT0ZGIGJhc2VkIHBvcnRzIGRvIG5vdCBzdXBwb3J0IHNlbGVjdGl2ZSBsaW5raW5nCi1pZiB7W2lzdGFyZ2V0ICIqLSotY29mZiIgIiotKi1wZSJdfSB7Ci0gIHJldHVybgotfQotCi1zZXQgdGVzdDEgInNlbGVjdGl2ZTEiCi1zZXQgdGVzdDIgInNlbGVjdGl2ZTIiCi1zZXQgdGVzdDMgInNlbGVjdGl2ZTMiCi1zZXQgdGVzdDQgInNlbGVjdGl2ZTQiCi1zZXQgdGVzdDUgInNlbGVjdGl2ZTUiCi1zZXQgdGVzdDYgInNlbGVjdGl2ZTYiCi0KLXNldCBjZmxhZ3MgIi13IC1PMiAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucyIgCi1zZXQgY3h4ZmxhZ3MgIi1mdnRhYmxlLWdjIC1mbm8tZXhjZXB0aW9ucyAtZm5vLXJ0dGkiCi1zZXQgbGRmbGFncyAiLS1nYy1zZWN0aW9ucyAtQnN0YXRpYyIKLQotaWYgeyBbd2hpY2ggJENYWF0gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdDEKLSAgICB1bnRlc3RlZCAkdGVzdDIKLSAgICB1bnRlc3RlZCAkdGVzdDMKLSAgICB1bnRlc3RlZCAkdGVzdDQKLSAgICB1bnRlc3RlZCAkdGVzdDUKLSAgICB1bnRlc3RlZCAkdGVzdDYKLSAgICByZXR1cm4KLX0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvMS5jIHRtcGRpci8xLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDEKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzEueCAiJGxkZmxhZ3MgdG1wZGlyLzEubyJdIHsKLSAgICBmYWlsICR0ZXN0MQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMS54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDEKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGRyb3BtZTEpXX0gewotCQlzZW5kX2xvZyAiZHJvcG1lMSA9PSAkbm1fb3V0cHV0KGRyb3BtZTEpXG4iCi0JCXZlcmJvc2UgImRyb3BtZTEgPT0gJG5tX291dHB1dChkcm9wbWUxKSIKLQkJZmFpbCAkdGVzdDEKLQkgICAgfSBlbHNlIHsKLQkJaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZHJvcG1lMildfSB7Ci0JCSAgICBzZW5kX2xvZyAiZHJvcG1lMiA9PSAkbm1fb3V0cHV0KGRyb3BtZTIpXG4iCi0JCSAgICB2ZXJib3NlICJkcm9wbWUyID09ICRubV9vdXRwdXQoZHJvcG1lMikiCi0JCSAgICBmYWlsICR0ZXN0MQotCQl9IGVsc2UgewotCQkgICAgcGFzcyAkdGVzdDEKLQkJfQotCSAgICB9Ci0JfQotICAgIH0KLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzIiAkc3JjZGlyLyRzdWJkaXIvMi5jIHRtcGRpci8yLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzIueCAiJGxkZmxhZ3MgdG1wZGlyLzIubyJdIHsKLSAgICBmYWlsICR0ZXN0MgotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMi54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDIKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvbyldIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImZvbyA9PSAkbm1fb3V0cHV0KGZvbylcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImZvbz09ICRubV9vdXRwdXQoZm9vKSIKLSAgICAgICAgICAgIGZhaWwgJHRlc3QyCi0JfSBlbHNlIHsKLSAgICAgICAgICAgIHBhc3MgJHRlc3QyCi0JICAgIH0gCi0JIH0KLSAgICAgfQotCi1pZiB7ICFbbGRfY29tcGlsZSAiJENDICRjZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8yLmMgdG1wZGlyLzIub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0MwotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMi54ICIkbGRmbGFncyAtdSBmb28gdG1wZGlyLzIubyJdIHsKLSAgICBmYWlsICR0ZXN0MwotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvMi54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDMKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dChmb28pXSB9IHsKLQkgICAgc2VuZF9sb2cgImJhZCBvdXRwdXQgZnJvbSBubVxuIgotCSAgICB2ZXJib3NlICJiYWQgb3V0cHV0IGZyb20gbm0iCi0JICAgIGZhaWwgJHRlc3QzCi0JfSBlbHNlIHsKLQkgICAgaWYgeyRubV9vdXRwdXQoZm9vKSA9PSAwfSB7Ci0JCXNlbmRfbG9nICJmb28gPT0gJG5tX291dHB1dChmb28pXG4iCi0JCXZlcmJvc2UgImZvbz09ICRubV9vdXRwdXQoZm9vKSIKLQkJZmFpbCAkdGVzdDMKLQkgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXNzICR0ZXN0MwotCQl9Ci0JIH0KLSAgICAgfQotfQotCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyAkY3h4ZmxhZ3MiICRzcmNkaXIvJHN1YmRpci8zLmNjIHRtcGRpci8zLm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDQKLSAgICByZXR1cm4KLX0KLQotc2V0dXBfeGZhaWwgInY4NTAqLSotZWxmIgotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvMy54ICIkbGRmbGFncyB0bXBkaXIvMy5vIl0gewotICAgZmFpbCAkdGVzdDQKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyLzMueF0gewotICAgICAgIHVucmVzb2x2ZWQgJHRlc3Q0Ci0gICAgfSBlbHNlIHsKLSAgICAgICBpZiB7W2luZm8gZXhpc3RzIG5tX291dHB1dChmb29fXzFCKV19IHsKLSAgICAgICAgICBzZW5kX2xvZyAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpXG4iCi0gICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgotICAgICAgICAgIGZhaWwgJHRlc3Q0Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgaWYge1sgaW5mbyBleGlzdHMgbm1fb3V0cHV0KGJhcl9fMUEpXX0gewotICAgICAgICAgICAgICBzZW5kX2xvZyAiYmFyX18xQT09ICRubV9vdXRwdXQoX2Jhcl9fMUEpXG4iCi0gICAgICAgICAgICAgIHZlcmJvc2UgImJhcl9fMUEgPT0gJG5tX291dHB1dChfYmFyX18xQSkiCi0gICAgICAgICAgICAgIGZhaWwgJHRlc3Q0Ci0gICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICBwYXNzICR0ZXN0NAotICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci19Ci0KLWlmIHsgIVtsZF9jb21waWxlICIkQ0MgJGNmbGFncyAkY3h4ZmxhZ3MiICRzcmNkaXIvJHN1YmRpci80LmNjIHRtcGRpci80Lm9dfSB7Ci0gICAgdW5yZXNvbHZlZCAkdGVzdDUKLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyLzQueCAiJGxkZmxhZ3MgdG1wZGlyLzQubyJdIHsKLSAgICBmYWlsICR0ZXN0NQotfSBlbHNlIHsKLSAgICBpZiAhW2xkX25tICRubSB0bXBkaXIvNC54XSB7Ci0JdW5yZXNvbHZlZCAkdGVzdDUKLSAgICB9IGVsc2UgewotCWlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUIpXX0geyAKLSAgICAgICAgICAgIHNlbmRfbG9nICJmb29fXzFCID09ICRubV9vdXRwdXQoZm9vX18xQilcbiIKLSAgICAgICAgICAgIHZlcmJvc2UgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKSIKLQkgICAgZmFpbCAkdGVzdDUKLQl9IGVsc2UgewotICAgICAgICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0KGZvb19fMUEpXX0gewotCSAgICAgICAgc2VuZF9sb2cgImZvb19fMUE9PSAkbm1fb3V0cHV0KGZvb19fMUEpXG4iCi0JCXZlcmJvc2UgImZvb19fMUEgPT0gJG5tX291dHB1dChmb29fXzFBKSIKLQkJZmFpbCAkdGVzdDUKLSAgICAgICAgICB9IGVsc2UgewotCSAgICAgIHBhc3MgJHRlc3Q1Ci0gICAgICAgICAgICAgfQotCX0KLSAgICB9Ci19Ci0KLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLQotaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkY2ZsYWdzICRjeHhmbGFncyIgJHNyY2Rpci8kc3ViZGlyLzUuY2MgdG1wZGlyLzUub119IHsKLSAgICB1bnJlc29sdmVkICR0ZXN0NgotICAgIHJldHVybgotfQotCi1pZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvNS54ICIkbGRmbGFncyB0bXBkaXIvNS5vIl0gewotICAgIGZhaWwgJHRlc3Q2Ci19IGVsc2UgewotICAgIGlmICFbbGRfbm0gJG5tIHRtcGRpci81LnhdIHsKLQl1bnJlc29sdmVkICR0ZXN0NgotICAgIH0gZWxzZSB7Ci0JaWYge1tpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQildIH0gewotICAgICAgICAgICAgc2VuZF9sb2cgImZvb19fMUIgPT0gJG5tX291dHB1dChmb29fXzFCKVxuIgotICAgICAgICAgICAgdmVyYm9zZSAiZm9vX18xQiA9PSAkbm1fb3V0cHV0KGZvb19fMUIpIgotCSAgICBmYWlsICR0ZXN0NgotCX0gZWxzZSB7Ci0gICAgICAgICAgICBpZiB7IFtpbmZvIGV4aXN0cyBubV9vdXRwdXQoZm9vX18xQSldfSB7Ci0JCSAgc2VuZF9sb2cgImZvb19fMUE9PSAkbm1fb3V0cHV0KGZvb19fMUEpXG4iCi0JCSAgdmVyYm9zZSAiZm9vX18xQSA9PSAkbm1fb3V0cHV0KGZvb19fMUEpIgotCQkgIGZhaWwgJHRlc3Q2Ci0gICAgICAgICAgICB9IGVsc2UgewotCSAgICAgICBwYXNzICR0ZXN0NgotCSAgICB9Ci0JfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2guZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQ2ZDI2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC1zaCB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IgKGlhbkBjeWdudXMuY29tKQotIwotCi0jIFRlc3QgU0ggcmVsYXhpbmcuICBUaGlzIHRlc3RzIHRoZSBjb21waWxlciBhbmQgYXNzZW1ibGVyIGFzIHdlbGwgYXMKLSMgdGhlIGxpbmtlci4KLQotaWYgIVtpc3RhcmdldCBzaCotKi0qXSB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0c2ltcGxlICJTSCBzaW1wbGUgcmVsYXhpbmciCi0KLWlmICFbbGRfYXNzZW1ibGUgJGFzICItcmVsYXggJHNyY2Rpci8kc3ViZGlyL3NoMS5zIiB0bXBkaXIvc2gxLm9dIHsKLSAgICB1bnJlc29sdmVkICR0ZXN0c2ltcGxlCi19IGVsc2UgeyBpZiAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc2gxICItcmVsYXggdG1wZGlyL3NoMS5vIl0gewotICAgIGZhaWwgJHRlc3RzaW1wbGUKLX0gZWxzZSB7Ci0gICAgaWYgIVtsZF9ubSAkbm0gdG1wZGlyL3NoMV0gewotCXVucmVzb2x2ZWQgJHRlc3RzaW1wbGUKLSAgICB9IGVsc2UgewotCWlmIHshW2luZm8gZXhpc3RzIG5tX291dHB1dChiYXIpXSBcCi0JICAgICB8fCAhW2luZm8gZXhpc3RzIG5tX291dHB1dChmb28pXX0gewotCSAgICBzZW5kX2xvZyAiYmFkIG91dHB1dCBmcm9tIG5tXG4iCi0JICAgIHZlcmJvc2UgImJhZCBvdXRwdXQgZnJvbSBubSIKLQkgICAgZmFpbCAkdGVzdHNpbXBsZQotCX0gZWxzZSB7Ci0JICAgIGlmIHskbm1fb3V0cHV0KGJhcikgIT0gJG5tX291dHB1dChmb28pICsgNH0gewotCQlzZW5kX2xvZyAiZm9vID09ICRubV9vdXRwdXQoZm9vKVxuIgotCQl2ZXJib3NlICJmb28gPT0gJG5tX291dHB1dChmb28pIgotCQlzZW5kX2xvZyAiYmFyID09ICRubV9vdXRwdXQoYmFyKVxuIgotCQl2ZXJib3NlICJiYXIgPT0gJG5tX291dHB1dChiYXIpIgotCQlmYWlsICR0ZXN0c2ltcGxlCi0JICAgIH0gZWxzZSB7Ci0JCXBhc3MgJHRlc3RzaW1wbGUKLQkgICAgfQotCX0KLSAgICB9Ci19IH0KLQotc2V0IHRlc3RzcmVjICJTSCByZWxheGluZyB0byBTLXJlY29yZHMiCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zaDEuczEgIi1yZWxheCAtb2Zvcm1hdCBzcmVjIHRtcGRpci9zaDEubyJdIHsKLSAgICBmYWlsICR0ZXN0c3JlYwotfSBlbHNlIHsKLSAgICAjIFRoZSBmaWxlIG5hbWUgaXMgZW1iZWRkZWQgaW4gdGhlIFMtcmVjb3Jkcywgc28gY3JlYXRlIGJvdGgKLSAgICAjIGZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZS4KLSAgICBjYXRjaCAiZXhlYyBybSAtZiB0bXBkaXIvc2gxLnMyIiBleGVjX291dHB1dAotICAgIHNlbmRfbG9nICJtdiB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczJcbiIKLSAgICB2ZXJib3NlICJtdiB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczIiCi0gICAgY2F0Y2ggImV4ZWMgbXYgdG1wZGlyL3NoMS5zMSB0bXBkaXIvc2gxLnMyIiBleGVjX291dHB1dAotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JdW5yZXNvbHZlZCAkdGVzdHNyZWMKLSAgICB9IGVsc2UgewotCXNlbmRfbG9nICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zaDEgdG1wZGlyL3NoMS5zMSIKLQl2ZXJib3NlICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zaDEgdG1wZGlyL3NoMS5zMSIKLQljYXRjaCAiZXhlYyAkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zaDEgdG1wZGlyL3NoMS5zMSIgZXhlY19vdXRwdXQKLQlpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQkgICAgc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCSAgICB2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JICAgIHVucmVzb2x2ZWQgJHRlc3RzcmVjCi0JfSBlbHNlIHsKLQkgICAgc2VuZF9sb2cgImNtcCB0bXBkaXIvc2gxLnMxIHRtcGRpci9zaDEuczJcbiIKLQkgICAgdmVyYm9zZSAiY21wIHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIKLQkgICAgY2F0Y2ggImV4ZWMgY21wIHRtcGRpci9zaDEuczEgdG1wZGlyL3NoMS5zMiIgZXhlY19vdXRwdXQKLQkgICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0JICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQkJZmFpbCAkdGVzdHNyZWMKLQkgICAgfSBlbHNlIHsKLQkJcGFzcyAkdGVzdHNyZWMKLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLXNldCB0ZXN0bGluayAiU0ggcmVsYXhpbmciCi1zZXQgdGVzdGpzciAiU0ggY29uZmlybSByZWxheGluZyIKLXNldCB0ZXN0cnVuICJTSCByZWxheGluZyBleGVjdXRpb24iCi0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB1bnRlc3RlZCAkdGVzdGxpbmsKLSAgICB1bnRlc3RlZCAkdGVzdGpzcgotICAgIHVudGVzdGVkICR0ZXN0cnVuCi0gICAgcmV0dXJuCi19Ci0KLWlmIHshW2xkX2Fzc2VtYmxlICRhcyAiLXJlbGF4ICRzcmNkaXIvJHN1YmRpci9zdGFydC5zIiB0bXBkaXIvc3RhcnQub10gXAotICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICItTyAtbXJlbGF4ICRzcmNkaXIvJHN1YmRpci9zaDIuYyIgdG1wZGlyL3NoMi5vXX0gewotICAgIHVucmVzb2x2ZWQgJHRlc3RsaW5rCi0gICAgdW5yZXNvbHZlZCAkdGVzdGpzcgotICAgIHVucmVzb2x2ZWQgJHRlc3RydW4KLSAgICByZXR1cm4KLX0KLQotaWYgIVtsZF9zaW1wbGVfbGluayAkbGQgdG1wZGlyL3NoMiAiLXJlbGF4IHRtcGRpci9zdGFydC5vIHRtcGRpci9zaDIubyJdIHsKLSAgICBmYWlsICR0ZXN0bGluawotICAgIHVucmVzb2x2ZWQgJHRlc3Rqc3IKLSAgICB1bnJlc29sdmVkICR0ZXN0cnVuCi0gICAgcmV0dXJuCi19Ci0KLXBhc3MgJHRlc3RsaW5rCi0KLXNlbmRfbG9nICIkb2JqZHVtcCAtZCB0bXBkaXIvc2gyXG4iCi12ZXJib3NlICIkb2JqZHVtcCAtZCB0bXBkaXIvc2gyIgotY2F0Y2ggImV4ZWMgJG9iamR1bXAgLWQgdG1wZGlyL3NoMiIgZXhlY19vdXRwdXQKLWlmIFtzdHJpbmcgbWF0Y2ggIipqc3IqIiAkZXhlY19vdXRwdXRdIHsKLSAgICBmYWlsICR0ZXN0anNyCi19IGVsc2UgewotICAgIHBhc3MgJHRlc3Rqc3IKLX0KLQotaWYgeyAhW2luZm8gZXhpc3RzIFNJTV0gfHwgW3doaWNoICRTSU1dID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3RydW4KLSAgICByZXR1cm4KLX0KLQotc2V0IHN0YXR1cyBbY2F0Y2ggImV4ZWMgJFNJTSB0bXBkaXIvc2gyIiBleGVjX291dHB1dF0KLWlmIHsgJHN0YXR1cyA9PSAwIH0gewotICAgIHBhc3MgJHRlc3RydW4KLX0gZWxzZSB7Ci0gICAgZmFpbCAkdGVzdHJ1bgotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMS5zIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMS5zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMThlNDM5Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zaDEucworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQkudGV4dAotZm9vOgotTDE6CQotCW1vdi5sCUwyLHIwCi0JLnVzZXMJTDEKLQlqc3IJQHIwCi0JcnRzCi0JLmFsaWduCTIKLUwyOgotCS5sb25nCWJhcgotYmFyOgotCXJ0cwotCS5hbGlnbgk0CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2gvc2gyLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2gvc2gyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyN2ZlODguLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoL3NoMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLWludCBnbG9iYWw7Ci0KLWV4dGVybiB2b2lkIHRyYXAgKGludCwgaW50KTsKLXN0YXRpYyB2b2lkIHF1aXQgKGludCk7Ci1zdGF0aWMgaW50IGZvbyAoaW50KTsKLQotaW50Ci1tYWluICgpCi17Ci0gIGlmIChmb28gKDApICE9IDAgfHwgZ2xvYmFsICE9IDApCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDEpICE9IDEgfHwgZ2xvYmFsICE9IDEpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDIpICE9IDIgfHwgZ2xvYmFsICE9IDIpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDMpICE9IDMgfHwgZ2xvYmFsICE9IDMpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDQpICE9IDQgfHwgZ2xvYmFsICE9IDQpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDUpICE9IDUgfHwgZ2xvYmFsICE9IDUpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDYpICE9IDYgfHwgZ2xvYmFsICE9IDYpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDcpICE9IDcgfHwgZ2xvYmFsICE9IDcpCi0gICAgcXVpdCAoMSk7Ci0gIGlmIChmb28gKDgpICE9IDggfHwgZ2xvYmFsICE9IDgpCi0gICAgcXVpdCAoMSk7Ci0gIHF1aXQgKDApOwotfQotCi12b2lkCi1fX21haW4gKCkKLXsKLX0KLQotc3RhdGljIHZvaWQKLXF1aXQgKGludCBzdGF0dXMpCi17Ci0gIHRyYXAgKDEsIHN0YXR1cyk7Ci19Ci0KLWludAotYmFyIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gaTsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyMCAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDA7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjEgKGludCBpKQotewotICBnbG9iYWwgPSAxOwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXIyIChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gMjsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyMyAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDM7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjQgKGludCBpKQotewotICBnbG9iYWwgPSA0OwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1iYXI1IChpbnQgaSkKLXsKLSAgZ2xvYmFsID0gNTsKLSAgcmV0dXJuIGk7Ci19Ci0KLWludAotYmFyNiAoaW50IGkpCi17Ci0gIGdsb2JhbCA9IDY7Ci0gIHJldHVybiBpOwotfQotCi1pbnQKLWJhcjcgKGludCBpKQotewotICBnbG9iYWwgPSA3OwotICByZXR1cm4gaTsKLX0KLQotaW50Ci1mb28gKGludCBpKQotewotICBzd2l0Y2ggKGkpCi0gICAgewotICAgIGNhc2UgMDogYmFyMCAoMCk7IHJldHVybiAwOwotICAgIGNhc2UgMTogYmFyMSAoMSk7IHJldHVybiAxOwotICAgIGNhc2UgMjogYmFyMiAoMik7IHJldHVybiAyOwotICAgIGNhc2UgMzogYmFyMyAoMyk7IHJldHVybiAzOwotICAgIGNhc2UgNDogYmFyNCAoNCk7IHJldHVybiA0OwotICAgIGNhc2UgNTogYmFyNSAoNSk7IHJldHVybiA1OwotICAgIGNhc2UgNjogYmFyNiAoNik7IHJldHVybiA2OwotICAgIGNhc2UgNzogYmFyNyAoNyk7IHJldHVybiA3OwotICAgIGRlZmF1bHQ6IHJldHVybiBiYXIgKGkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaC9zdGFydC5zIGIvbGQvdGVzdHN1aXRlL2xkLXNoL3N0YXJ0LnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjRjNzkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoL3N0YXJ0LnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0JLnNlY3Rpb24gLnRleHQKLQkuZ2xvYmFsCXN0YXJ0Ci1zdGFydDoKLQotCW1vdi5sCXN0YWNrX2sscjE1Ci0KLQkhIGNhbGwgdGhlIG1haW5saW5lCQotTDE6CQotCW1vdi5sCW1haW5fayxyMAotCS51c2VzCUwxCi0JanNyCUByMAotCW5vcAotCi0JLmFsaWduIDIKLXN0YWNrX2s6Ci0JLmxvbmcJX3N0YWNrCQotbWFpbl9rOgotCS5sb25nCV9tYWluCi0KLQkuZ2xvYmFsIF90cmFwCi1fdHJhcDoJCi0JdHJhcGEgIzMKLQlydHMKLQlub3AKLQotCS5zZWN0aW9uIC5zdGFjawotX3N0YWNrOgkubG9uZwkweGRlYWRkZWFkCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL2VsZi1vZmZzZXQubGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTQyOTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9lbGYtb2Zmc2V0LmxkCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLVNFQ1RJT05TCi17Ci0gIC8qIFJlYWQtb25seSBzZWN0aW9ucywgbWVyZ2VkIGludG8gdGV4dCBzZWdtZW50OiAqLwotICAuID0gMHgxMDAwMDA7Ci0gIC5oYXNoICAgICAgICAgIDogeyAqKC5oYXNoKQkJfQotICAuZHluc3ltICAgICAgICA6IHsgKiguZHluc3ltKQkJfQotICAuZHluc3RyICAgICAgICA6IHsgKiguZHluc3RyKQkJfQotICAuZ251LnZlcnNpb24gICA6IHsgKiguZ251LnZlcnNpb24pCX0KLSAgLmdudS52ZXJzaW9uX2QgICA6IHsgKiguZ251LnZlcnNpb25fZCkJfQotICAuZ251LnZlcnNpb25fciAgIDogeyAqKC5nbnUudmVyc2lvbl9yKQl9Ci0gIC5yZWwudGV4dCAgICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWwudGV4dCkKLSAgICAgICooLnJlbC50ZXh0LiopCi0gICAgICAqKC5yZWwuZ251LmxpbmtvbmNlLnQqKQotICAgIH0KLSAgLnJlbGEudGV4dCAgICAgOgotICAgIHsKLSAgICAgICooLnJlbGEudGV4dCkKLSAgICAgICooLnJlbGEudGV4dC4qKQotICAgICAgKigucmVsYS5nbnUubGlua29uY2UudCopCi0gICAgfQotICAucmVsLmRhdGEgICAgICA6Ci0gICAgewotICAgICAgKigucmVsLmRhdGEpCi0gICAgICAqKC5yZWwuZGF0YS4qKQotICAgICAgKigucmVsLmdudS5saW5rb25jZS5kKikKLSAgICB9Ci0gIC5yZWxhLmRhdGEgICAgIDoKLSAgICB7Ci0gICAgICAqKC5yZWxhLmRhdGEpCi0gICAgICAqKC5yZWxhLmRhdGEuKikKLSAgICAgICooLnJlbGEuZ251LmxpbmtvbmNlLmQqKQotICAgIH0KLSAgLnJlbC5yb2RhdGEgICAgOgotICAgIHsKLSAgICAgICooLnJlbC5yb2RhdGEpCi0gICAgICAqKC5yZWwucm9kYXRhLiopCi0gICAgICAqKC5yZWwuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLSAgLnJlbGEucm9kYXRhICAgOgotICAgIHsKLSAgICAgICooLnJlbGEucm9kYXRhKQotICAgICAgKigucmVsYS5yb2RhdGEuKikKLSAgICAgICooLnJlbGEuZ251LmxpbmtvbmNlLnIqKQotICAgIH0KLSAgLnJlbC5nb3QgICAgICAgOiB7ICooLnJlbC5nb3QpCQl9Ci0gIC5yZWxhLmdvdCAgICAgIDogeyAqKC5yZWxhLmdvdCkJCX0KLSAgLnJlbC5jdG9ycyAgICAgOiB7ICooLnJlbC5jdG9ycykJfQotICAucmVsYS5jdG9ycyAgICA6IHsgKigucmVsYS5jdG9ycykJfQotICAucmVsLmR0b3JzICAgICA6IHsgKigucmVsLmR0b3JzKQl9Ci0gIC5yZWxhLmR0b3JzICAgIDogeyAqKC5yZWxhLmR0b3JzKQl9Ci0gIC5yZWwuaW5pdCAgICAgIDogeyAqKC5yZWwuaW5pdCkJfQotICAucmVsYS5pbml0ICAgICA6IHsgKigucmVsYS5pbml0KQl9Ci0gIC5yZWwuZmluaSAgICAgIDogeyAqKC5yZWwuZmluaSkJfQotICAucmVsYS5maW5pICAgICA6IHsgKigucmVsYS5maW5pKQl9Ci0gIC5yZWwuYnNzICAgICAgIDogeyAqKC5yZWwuYnNzKQkJfQotICAucmVsYS5ic3MgICAgICA6IHsgKigucmVsYS5ic3MpCQl9Ci0gIC5yZWwucGx0ICAgICAgIDogeyAqKC5yZWwucGx0KQkJfQotICAucmVsYS5wbHQgICAgICA6IHsgKigucmVsYS5wbHQpCQl9Ci0gIC5pbml0ICAgICAgICAgIDogeyBLRUVQICgqKC5pbml0KSkJfQotICAucGx0ICAgICAgOiB7ICooLnBsdCkJfQotICAudGV4dCAgICAgIDoKLSAgewotICAgICooLnRleHQpCi0gICAgKigudGV4dC4qKQotICAgICooLnN0dWIpCi0gICAgLyogLmdudS53YXJuaW5nIHNlY3Rpb25zIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBieSBlbGYzMi5lbS4gICovCi0gICAgKiguZ251Lndhcm5pbmcpCi0gICAgKiguZ251LmxpbmtvbmNlLnQqKQotICB9Ci0gIF9ldGV4dCA9IC47Ci0gIFBST1ZJREUgKGV0ZXh0ID0gLik7Ci0gIC5maW5pICAgICAgOiB7IEtFRVAgKCooLmZpbmkpKQkJfSA9MHg5MDkwCi0gIC5yb2RhdGEgICAgOgotICB7Ci0gICAgKigucm9kYXRhKQotICAgICooLnJvZGF0YS4qKQotICAgICooLmdudS5saW5rb25jZS5yKikKLSAgfQotICAucm9kYXRhMSAgIDogeyAqKC5yb2RhdGExKSB9Ci0gIC8qIEFkanVzdCB0aGUgYWRkcmVzcyBmb3IgdGhlIGRhdGEgc2VnbWVudC4gIFdlIHdhbnQgdG8gYWRqdXN0IHVwIHRvCi0gICAgIHRoZSBzYW1lIGFkZHJlc3Mgd2l0aGluIHRoZSBwYWdlIG9uIHRoZSBuZXh0IHBhZ2UgdXAuICAqLwotICAuID0gQUxJR04oMHgxMDAwKSArICguICYgKDB4MTAwMCAtIDEpKTsKLSAgLmRhdGEgICAgOgotICB7Ci0gICAgKiguZGF0YSkKLSAgICAqKC5kYXRhLiopCi0gICAgKiguZ251LmxpbmtvbmNlLmQqKQotICAgIFNPUlQoQ09OU1RSVUNUT1JTKQotICB9Ci0gIC5kYXRhMSAgIDogeyAqKC5kYXRhMSkgfQotICAuY3RvcnMgICAgICAgICA6Ci0gIHsKLSAgICAvKiBnY2MgdXNlcyBjcnRiZWdpbi5vIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBjb25zdHJ1Y3RvcnMsIHNvCi0gICAgICAgd2UgbWFrZSBzdXJlIGl0IGlzIGZpcnN0LiAgQmVjYXVzZSB0aGlzIGlzIGEgd2lsZGNhcmQsIGl0Ci0gICAgICAgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHVzZXIgZG9lcyBub3QgYWN0dWFsbHkgbGluayBhZ2FpbnN0Ci0gICAgICAgY3J0YmVnaW4ubzsgdGhlIGxpbmtlciB3b24ndCBsb29rIGZvciBhIGZpbGUgdG8gbWF0Y2ggYQotICAgICAgIHdpbGRjYXJkLiAgVGhlIHdpbGRjYXJkIGFsc28gbWVhbnMgdGhhdCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaAotICAgICAgIGRpcmVjdG9yeSBjcnRiZWdpbi5vIGlzIGluLiAgKi8KLSAgICBLRUVQICgqY3J0YmVnaW4ubyguY3RvcnMpKQotICAgIEtFRVAgKCooU09SVCguY3RvcnMuKikpKQotICAgIEtFRVAgKCooLmN0b3JzKSkKLSAgfQotICAuZHRvcnMgICAgICAgICA6Ci0gIHsKLSAgICBLRUVQICgqY3J0YmVnaW4ubyguZHRvcnMpKQotICAgIEtFRVAgKCooU09SVCguZHRvcnMuKikpKQotICAgIEtFRVAgKCooLmR0b3JzKSkKLSAgfQotICAuZ290ICAgICAgICAgICA6IHsgKiguZ290LnBsdCkgKiguZ290KSB9Ci0gIC5keW5hbWljICAgICAgIDogeyAqKC5keW5hbWljKSB9Ci0gIC8qIFdlIHdhbnQgdGhlIHNtYWxsIGRhdGEgc2VjdGlvbnMgdG9nZXRoZXIsIHNvIHNpbmdsZS1pbnN0cnVjdGlvbiBvZmZzZXRzCi0gICAgIGNhbiBhY2Nlc3MgdGhlbSBhbGwsIGFuZCBpbml0aWFsaXplZCBkYXRhIGFsbCBiZWZvcmUgdW5pbml0aWFsaXplZCwgc28KLSAgICAgd2UgY2FuIHNob3J0ZW4gdGhlIG9uLWRpc2sgc2VnbWVudCBzaXplLiAgKi8KLSAgLnNkYXRhICAgICA6IHsgKiguc2RhdGEpICooLnNkYXRhLiopIH0KLSAgX2VkYXRhICA9ICAuOwotICBQUk9WSURFIChlZGF0YSA9IC4pOwotICBfX2Jzc19zdGFydCA9IC47Ci0gIC5zYnNzICAgICAgOiB7ICooLnNic3MpICooLnNjb21tb24pIH0KLSAgLmJzcyAgICAgICA6Ci0gIHsKLSAgICooLmR5bmJzcykKLSAgICooLmJzcykKLSAgICooQ09NTU9OKQotICAgLyogQWxpZ24gaGVyZSB0byBlbnN1cmUgdGhhdCB0aGUgLmJzcyBzZWN0aW9uIG9jY3VwaWVzIHNwYWNlIHVwIHRvCi0gICAgICBfZW5kLiAgQWxpZ24gYWZ0ZXIgLmJzcyB0byBlbnN1cmUgY29ycmVjdCBhbGlnbm1lbnQgZXZlbiBpZiB0aGUKLSAgICAgIC5ic3Mgc2VjdGlvbiBkaXNhcHBlYXJzIGJlY2F1c2UgdGhlcmUgYXJlIG5vIGlucHV0IHNlY3Rpb25zLiAgKi8KLSAgIC4gPSBBTElHTigzMiAvIDgpOwotICB9Ci0gIC4gPSBBTElHTigzMiAvIDgpOwotICBfZW5kID0gLiA7Ci0gIFBST1ZJREUgKGVuZCA9IC4pOwotICAvKiBTdGFicyBkZWJ1Z2dpbmcgc2VjdGlvbnMuICAqLwotICAuc3RhYiAwIDogeyAqKC5zdGFiKSB9Ci0gIC5zdGFic3RyIDAgOiB7ICooLnN0YWJzdHIpIH0KLSAgLnN0YWIuZXhjbCAwIDogeyAqKC5zdGFiLmV4Y2wpIH0KLSAgLnN0YWIuZXhjbHN0ciAwIDogeyAqKC5zdGFiLmV4Y2xzdHIpIH0KLSAgLnN0YWIuaW5kZXggMCA6IHsgKiguc3RhYi5pbmRleCkgfQotICAuc3RhYi5pbmRleHN0ciAwIDogeyAqKC5zdGFiLmluZGV4c3RyKSB9Ci0gIC5jb21tZW50IDAgOiB7ICooLmNvbW1lbnQpIH0KLSAgLyogRFdBUkYgZGVidWcgc2VjdGlvbnMuCi0gICAgIFN5bWJvbHMgaW4gdGhlIERXQVJGIGRlYnVnZ2luZyBzZWN0aW9ucyBhcmUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZwotICAgICBvZiB0aGUgc2VjdGlvbiBzbyB3ZSBiZWdpbiB0aGVtIGF0IDAuICAqLwotICAvKiBEV0FSRiAxICovCi0gIC5kZWJ1ZyAgICAgICAgICAwIDogeyAqKC5kZWJ1ZykgfQotICAubGluZSAgICAgICAgICAgMCA6IHsgKigubGluZSkgfQotICAvKiBHTlUgRFdBUkYgMSBleHRlbnNpb25zICovCi0gIC5kZWJ1Z19zcmNpbmZvICAwIDogeyAqKC5kZWJ1Z19zcmNpbmZvKSB9Ci0gIC5kZWJ1Z19zZm5hbWVzICAwIDogeyAqKC5kZWJ1Z19zZm5hbWVzKSB9Ci0gIC8qIERXQVJGIDEuMSBhbmQgRFdBUkYgMiAqLwotICAuZGVidWdfYXJhbmdlcyAgMCA6IHsgKiguZGVidWdfYXJhbmdlcykgfQotICAuZGVidWdfcHVibmFtZXMgMCA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KLSAgLyogRFdBUkYgMiAqLwotICAuZGVidWdfaW5mbyAgICAgMCA6IHsgKiguZGVidWdfaW5mbykgfQotICAuZGVidWdfYWJicmV2ICAgMCA6IHsgKiguZGVidWdfYWJicmV2KSB9Ci0gIC5kZWJ1Z19saW5lICAgICAwIDogeyAqKC5kZWJ1Z19saW5lKSB9Ci0gIC5kZWJ1Z19mcmFtZSAgICAwIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQotICAuZGVidWdfc3RyICAgICAgMCA6IHsgKiguZGVidWdfc3RyKSB9Ci0gIC5kZWJ1Z19sb2MgICAgICAwIDogeyAqKC5kZWJ1Z19sb2MpIH0KLSAgLmRlYnVnX21hY2luZm8gIDAgOiB7ICooLmRlYnVnX21hY2luZm8pIH0KLSAgLyogU0dJL01JUFMgRFdBUkYgMiBleHRlbnNpb25zICovCi0gIC5kZWJ1Z193ZWFrbmFtZXMgMCA6IHsgKiguZGVidWdfd2Vha25hbWVzKSB9Ci0gIC5kZWJ1Z19mdW5jbmFtZXMgMCA6IHsgKiguZGVidWdfZnVuY25hbWVzKSB9Ci0gIC5kZWJ1Z190eXBlbmFtZXMgMCA6IHsgKiguZGVidWdfdHlwZW5hbWVzKSB9Ci0gIC5kZWJ1Z192YXJuYW1lcyAgMCA6IHsgKiguZGVidWdfdmFybmFtZXMpIH0KLSAgLyogVGhlc2UgbXVzdCBhcHBlYXIgcmVnYXJkbGVzcyBvZiAgLiAgKi8KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvbWFpbi5jIGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmY2ZkYWEuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9tYWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKiBUaGlzIGlzIHRoZSBtYWluIHByb2dyYW0gZm9yIHRoZSBzaGFyZWQgbGlicmFyeSB0ZXN0LiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludCBtYWludmFyID0gMTsKLWludCBvdmVycmlkZGVudmFyID0gMjsKLWV4dGVybiBpbnQgc2hsaWJ2YXIxOwotCi1leHRlcm4gaW50IHNobGliX21haW52YXIgKCk7Ci1leHRlcm4gaW50IHNobGliX292ZXJyaWRkZW52YXIgKCk7Ci1leHRlcm4gaW50IHNobGliX3NobGlidmFyMSAoKTsKLWV4dGVybiBpbnQgc2hsaWJfc2hsaWJ2YXIyICgpOwotZXh0ZXJuIGludCBzaGxpYl9zaGxpYmNhbGwgKCk7Ci1leHRlcm4gaW50IHNobGliX21haW5jYWxsICgpOwotZXh0ZXJuIGludCBzaGxpYl9jaGVja2Z1bnB0cjEgKCk7Ci1leHRlcm4gaW50IHNobGliX2NoZWNrZnVucHRyMiAoKTsKLWV4dGVybiBpbnQgKCpzaGxpYl9nZXRmdW5wdHIxICgpKSAoKTsKLWV4dGVybiBpbnQgKCpzaGxpYl9nZXRmdW5wdHIyICgpKSAoKTsKLWV4dGVybiBpbnQgc2hsaWJfY2hlY2sgKCk7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi0KLWludAotbWFpbl9jYWxsZWQgKCkKLXsKLSAgcmV0dXJuIDY7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gb3ZlcnJpZGVzIGEgZnVuY3Rpb24gaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotaW50Ci1zaGxpYl9vdmVycmlkZGVuY2FsbDIgKCkKLXsKLSAgcmV0dXJuIDg7Ci19Ci0KLWludAotbWFpbiAoKQotewotICBpbnQgKCpwKSAoKTsKLQotICBwcmludGYgKCJtYWludmFyID09ICVkXG4iLCBtYWludmFyKTsKLSAgcHJpbnRmICgib3ZlcnJpZGRlbnZhciA9PSAlZFxuIiwgb3ZlcnJpZGRlbnZhcik7Ci0gIHByaW50ZiAoInNobGlidmFyMSA9PSAlZFxuIiwgc2hsaWJ2YXIxKTsKLSNpZm5kZWYgWENPRkZfVEVTVAotICBwcmludGYgKCJzaGxpYl9tYWludmFyICgpID09ICVkXG4iLCBzaGxpYl9tYWludmFyICgpKTsKLSAgcHJpbnRmICgic2hsaWJfb3ZlcnJpZGRlbnZhciAoKSA9PSAlZFxuIiwgc2hsaWJfb3ZlcnJpZGRlbnZhciAoKSk7Ci0jZW5kaWYKLSAgcHJpbnRmICgic2hsaWJfc2hsaWJ2YXIxICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYnZhcjEgKCkpOwotICBwcmludGYgKCJzaGxpYl9zaGxpYnZhcjIgKCkgPT0gJWRcbiIsIHNobGliX3NobGlidmFyMiAoKSk7Ci0gIHByaW50ZiAoInNobGliX3NobGliY2FsbCAoKSA9PSAlZFxuIiwgc2hsaWJfc2hsaWJjYWxsICgpKTsKLSNpZm5kZWYgWENPRkZfVEVTVAotICBwcmludGYgKCJzaGxpYl9zaGxpYmNhbGwyICgpID09ICVkXG4iLCBzaGxpYl9zaGxpYmNhbGwyICgpKTsKLSAgcHJpbnRmICgic2hsaWJfbWFpbmNhbGwgKCkgPT0gJWRcbiIsIHNobGliX21haW5jYWxsICgpKTsKLSNlbmRpZgotICBwcmludGYgKCJtYWluX2NhbGxlZCAoKSA9PSAlZFxuIiwgbWFpbl9jYWxsZWQgKCkpOwotICBwcmludGYgKCJzaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gJWRcbiIsCi0JICBzaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkpOwotI2lmbmRlZiBYQ09GRl9URVNUCi0gIHByaW50ZiAoInNobGliX2NoZWNrZnVucHRyMiAobWFpbl9jYWxsZWQpID09ICVkXG4iLAotCSAgc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkpOwotI2VuZGlmCi0gIHAgPSBzaGxpYl9nZXRmdW5wdHIxICgpOwotICBwcmludGYgKCJzaGxpYl9nZXRmdW5wdHIxICgpICIpOwotICBpZiAocCA9PSBzaGxpYl9zaGxpYnZhcjEpCi0gICAgcHJpbnRmICgiPT0iKTsKLSAgZWxzZQotICAgIHByaW50ZiAoIiE9Iik7Ci0gIHByaW50ZiAoIiBzaGxpYl9zaGxpYnZhcjFcbiIpOwotI2lmbmRlZiBYQ09GRl9URVNUCi0gIHAgPSBzaGxpYl9nZXRmdW5wdHIyICgpOwotICBwcmludGYgKCJzaGxpYl9nZXRmdW5wdHIyICgpICIpOwotICBpZiAocCA9PSBtYWluX2NhbGxlZCkKLSAgICBwcmludGYgKCI9PSIpOwotICBlbHNlCi0gICAgcHJpbnRmICgiIT0iKTsKLSAgcHJpbnRmICgiIG1haW5fY2FsbGVkXG4iKTsKLSNlbmRpZgotICBwcmludGYgKCJzaGxpYl9jaGVjayAoKSA9PSAlZFxuIiwgc2hsaWJfY2hlY2sgKCkpOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGYxODNjLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyogVGhpcyBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgbGlicmFyeSBsZCB0ZXN0LiAgVGhpcyBmaWxlIGJlY29tZXMgcGFydAotICAgb2YgYSBzaGFyZWQgbGlicmFyeS4gICovCi0KLS8qIFRoaXMgdmFyaWFibGUgaXMgc3VwcGxpZWQgYnkgdGhlIG1haW4gcHJvZ3JhbS4gICovCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWV4dGVybiBpbnQgbWFpbnZhcjsKLSNlbmRpZgotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5LCBhbmQgb3ZlcnJpZGRlbiBieQotICAgdGhlIG1haW4gcHJvZ3JhbS4gICovCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWludCBvdmVycmlkZGVudmFyID0gLTE7Ci0jZW5kaWYKLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi1pbnQgc2hsaWJ2YXIxID0gMzsKLQotLyogVGhpcyB2YXJpYWJsZSBpcyBkZWZpbmVkIGJ5IGFub3RoZXIgb2JqZWN0IGluIHRoZSBzaGFyZWQgbGlicmFyeS4gICovCi1leHRlcm4gaW50IHNobGlidmFyMjsKLQotLyogVGhlc2UgZnVuY3Rpb25zIHJldHVybiB0aGUgdmFsdWVzIG9mIHRoZSBhYm92ZSB2YXJpYWJsZXMgYXMgc2VlbiBpbgotICAgdGhlIHNoYXJlZCBsaWJyYXJ5LiAgKi8KLQotI2lmbmRlZiBYQ09GRl9URVNUCi1pbnQKLXNobGliX21haW52YXIgKCkKLXsKLSAgcmV0dXJuIG1haW52YXI7Ci19Ci0jZW5kaWYKLQotI2lmbmRlZiBYQ09GRl9URVNUCi1pbnQKLXNobGliX292ZXJyaWRkZW52YXIgKCkKLXsKLSAgcmV0dXJuIG92ZXJyaWRkZW52YXI7Ci19Ci0jZW5kaWYKLQotaW50Ci1zaGxpYl9zaGxpYnZhcjEgKCkKLXsKLSAgcmV0dXJuIHNobGlidmFyMTsKLX0KLQotaW50Ci1zaGxpYl9zaGxpYnZhcjIgKCkKLXsKLSAgcmV0dXJuIHNobGlidmFyMjsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBjYWxscyBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYW5vdGhlciBvYmplY3QgaW4gdGhlCi0gICBzaGFyZWQgbGlicmFyeS4gICovCi0KLWV4dGVybiBpbnQgc2hsaWJfc2hsaWJjYWxsZWQgKCk7Ci0KLWludAotc2hsaWJfc2hsaWJjYWxsICgpCi17Ci0gIHJldHVybiBzaGxpYl9zaGxpYmNhbGxlZCAoKTsKLX0KLQotI2lmbmRlZiBYQ09GRl9URVNUCi0vKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGlzIG9iamVjdCBpbiB0aGUgc2hhcmVkCi0gICBsaWJyYXJ5LiAgVGhlIG1haW4gcHJvZ3JhbSB3aWxsIG92ZXJyaWRlIHRoZSBjYWxsZWQgZnVuY3Rpb24uICAqLwotCi1leHRlcm4gaW50IHNobGliX292ZXJyaWRkZW5jYWxsMiAoKTsKLQotaW50Ci1zaGxpYl9zaGxpYmNhbGwyICgpCi17Ci0gIHJldHVybiBzaGxpYl9vdmVycmlkZGVuY2FsbDIgKCk7Ci19Ci0KLWludAotc2hsaWJfb3ZlcnJpZGRlbmNhbGwyICgpCi17Ci0gIHJldHVybiA3OwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gY2FsbHMgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IHRoZSBtYWluIHByb2dyYW0uICAqLwotCi0jaWZuZGVmIFhDT0ZGX1RFU1QKLWV4dGVybiBpbnQgbWFpbl9jYWxsZWQgKCk7Ci0KLWludAotc2hsaWJfbWFpbmNhbGwgKCkKLXsKLSAgcmV0dXJuIG1haW5fY2FsbGVkICgpOwotfQotI2VuZGlmCi0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIGEgZnVuY3Rpb24gcG9pbnRlciB0byBzaGxpYl9tYWludmFyLiAgSXQKLSAgIGNvbmZpcm1zIHRoYXQgdGhlIHBvaW50ZXIgY29tcGFyZXMgZXF1YWxseS4gICovCi0KLWludCAKLXNobGliX2NoZWNrZnVucHRyMSAocCkKLSAgICAgaW50ICgqcCkgKCk7Ci17Ci0gIHJldHVybiBwID09IHNobGliX3NobGlidmFyMTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBwYXNzZWQgYSBmdW5jdGlvbiBwb2ludGVyIHRvIG1haW5fY2FsbGVkLiAgSXQKLSAgIGNvbmZpcm1zIHRoYXQgdGhlIHBvaW50ZXIgY29tcGFyZXMgZXF1YWxseS4gICovCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50Ci1zaGxpYl9jaGVja2Z1bnB0cjIgKHApCi0gICAgIGludCAoKnApICgpOwotewotICByZXR1cm4gcCA9PSBtYWluX2NhbGxlZDsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHNobGliX21haW52YXIuICAqLwotCi1pbnQKLSgqc2hsaWJfZ2V0ZnVucHRyMSAoKSkgKCkKLXsKLSAgcmV0dXJuIHNobGliX3NobGlidmFyMTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBtYWluX2NhbGxlZC4gICovCi0KLSNpZm5kZWYgWENPRkZfVEVTVAotaW50Ci0oKnNobGliX2dldGZ1bnB0cjIgKCkpICgpCi17Ci0gIHJldHVybiBtYWluX2NhbGxlZDsKLX0KLSNlbmRpZgotCi0vKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCBjb25zdGFudCBkYXRhIGFuZCBsb2NhbCBmdW5jdGlvbnMKLSAgIHdvcmsuICAqLwotCi0jaWZuZGVmIF9fU1REQ19fCi0jZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotc3RhdGljIGludCBpID0gNjsKLXN0YXRpYyBjb25zdCBjaGFyICpzdHIgPSAiSGVsbG8sIHdvcmxkXG4iOwotCi1pbnQKLXNobGliX2NoZWNrICgpCi17Ci0gIGNvbnN0IGNoYXIgKnMxLCAqczI7Ci0KLSAgaWYgKGkgIT0gNikKLSAgICByZXR1cm4gMDsKLQotICAvKiBUbyBpc29sYXRlIHRoZSB0ZXN0LCBkb24ndCByZWx5IG9uIGFueSBleHRlcm5hbCBmdW5jdGlvbnMsIHN1Y2gKLSAgICAgYXMgc3RyY21wLiAgKi8KLSAgczEgPSAiSGVsbG8sIHdvcmxkXG4iOwotICBzMiA9IHN0cjsKLSAgd2hpbGUgKCpzMSAhPSAnXDAnKQotICAgIGlmICgqczErKyAhPSAqczIrKykKLSAgICAgIHJldHVybiAwOwotICBpZiAoKnMyICE9ICdcMCcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHNobGliX3NobGlidmFyMSAoKSAhPSAzKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2gyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxM2E0ZTAuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaDIuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qIFRoaXMgaXMgcGFydCBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgbGQgdGVzdC4gIFRoaXMgZmlsZSBiZWNvbWVzIHBhcnQKLSAgIG9mIGEgc2hhcmVkIGxpYnJhcnkuICAqLwotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIGRlZmluZWQgaGVyZSwgYW5kIHJlZmVyZW5jZWQgYnkgYW5vdGhlciBmaWxlIGluCi0gICB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotaW50IHNobGlidmFyMiA9IDQ7Ci0KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFub3RoZXIgZmlsZSBpbiB0aGUgc2hhcmVkIGxpYnJhcnkuICAqLwotCi1pbnQKLXNobGliX3NobGliY2FsbGVkICgpCi17Ci0gIHJldHVybiA1OwotfQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZGF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGVlMzdmLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQvc2hhcmVkLmRhdAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLW1haW52YXIgPT0gMQotb3ZlcnJpZGRlbnZhciA9PSAyCi1zaGxpYnZhcjEgPT0gMwotc2hsaWJfbWFpbnZhciAoKSA9PSAxCi1zaGxpYl9vdmVycmlkZGVudmFyICgpID09IDIKLXNobGliX3NobGlidmFyMSAoKSA9PSAzCi1zaGxpYl9zaGxpYnZhcjIgKCkgPT0gNAotc2hsaWJfc2hsaWJjYWxsICgpID09IDUKLXNobGliX3NobGliY2FsbDIgKCkgPT0gOAotc2hsaWJfbWFpbmNhbGwgKCkgPT0gNgotbWFpbl9jYWxsZWQgKCkgPT0gNgotc2hsaWJfY2hlY2tmdW5wdHIxIChzaGxpYl9zaGxpYnZhcjEpID09IDEKLXNobGliX2NoZWNrZnVucHRyMiAobWFpbl9jYWxsZWQpID09IDEKLXNobGliX2dldGZ1bnB0cjEgKCkgPT0gc2hsaWJfc2hsaWJ2YXIxCi1zaGxpYl9nZXRmdW5wdHIyICgpID09IG1haW5fY2FsbGVkCi1zaGxpYl9jaGVjayAoKSA9PSAxCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5leHAgYi9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3NoYXJlZC5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZjE0NzkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zaGFyZWQuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLSMgRXhwZWN0IHNjcmlwdCBmb3IgbGQtc2hhcmVkIHRlc3RzCi0jICAgQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIwotIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIyAKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0jIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMgCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciAoaWFuQGN5Z251cy5jb20pCi0jCi0KLSMgTWFrZSBzdXJlIHRoYXQgbGQgY2FuIGdlbmVyYXRlIEVMRiBzaGFyZWQgbGlicmFyaWVzLgotIyBOb3RlIHRoYXQgbGlua2luZyBhZ2FpbnN0IEVMRiBzaGFyZWQgbGlicmFyaWVzIGlzIHRlc3RlZCBieSB0aGUKLSMgYm9vdHN0cmFwIHRlc3QuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBpZiBsZCBnZW5lcmF0ZXMgbmF0aXZlIGV4ZWN1dGFibGVzLgotaWYgIVtpc25hdGl2ZV0gdGhlbiB7cmV0dXJufQotCi0jIFRoaXMgdGVzdCBjYW4gb25seSBiZSBydW4gb24gYSBjb3VwbGUgb2YgRUxGIHBsYXRmb3Jtcy4KLSMgU3F1YXJlIGJyYWNrZXQgZXhwcmVzc2lvbnMgc2VlbSB0byBjb25mdXNlIGlzdGFyZ2V0LgotaWYgeyAhW2lzdGFyZ2V0IGkzODYtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotc3lzdjQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLXN5c3Y0Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGkzODYtKi11bml4d2FyZV0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk0ODYtKi11bml4d2FyZV0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGk1ODYtKi11bml4d2FyZV0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGkzODYtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTQ4Ni0qLWVsZipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNTg2LSotZWxmKl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IGkzODYtKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBpNDg2LSotbGludXgqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgaTU4Ni0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IG02OGstKi1saW51eCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBtaXBzKi0qLWlyaXg1Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1lbGYqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcG93ZXJwYy0qLWxpbnV4Kl0gXAotICAgICAmJiAhW2lzdGFyZ2V0IHBvd2VycGMtKi1zeXN2NCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1lbGZdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1zb2xhcmlzMipdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBzcGFyYyotKi1zdW5vczQqXSBcCi0gICAgICYmICFbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIFwKLSAgICAgJiYgIVtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotICAgIHJldHVybgotfQotCi1pZiB7IFtpc3RhcmdldCAqLSotbGludXgqYW91dCpdIFwKLSAgICAgfHwgW2lzdGFyZ2V0ICotKi1saW51eCpvbGRsZCpdIH0gewotICAgIHJldHVybgotfQotCi1zZXQgdG1wZGlyIHRtcGRpcgotc2V0IFNIQ0ZMQUcgIiIKLQotaWYgeyBbaXN0YXJnZXQgcnM2MDAwKi0qLWFpeCpdIHx8IFtpc3RhcmdldCBwb3dlcnBjKi0qLWFpeCpdIH0gewotCi0gICAgIyBBSVggc2hhcmVkIGxpYnJhcmllcyBkbyBub3Qgc2VlbSB0byBzdXBwb3J0IHVzZWZ1bCBmZWF0dXJlcywKLSAgICAjIGxpa2Ugb3ZlcnJpZGluZyB0aGUgc2hhcmVkIGxpYnJhcnkgZnVuY3Rpb24gb3IgbGV0dGluZyB0aGUKLSAgICAjIHNoYXJlZCBsaWJyYXJ5IHJlZmVyIHRvIG9iamVjdHMgZGVmaW5lZCBpbiB0aGUgbWFpbiBwcm9ncmFtLiAgV2UKLSAgICAjIGF2b2lkIHRlc3RpbmcgdGhvc2UgZmVhdHVyZXMuCi0gICAgc2V0IFNIQ0ZMQUcgIi1EWENPRkZfVEVTVCIKLQotICAgICMgVGhlIEFJWCAzLjIuNSBsb2FkZXIgYXBwZWFycyB0byByYW5kb21seSBmYWlsIHdoZW4gbG9hZGluZwotICAgICMgc2hhcmVkIGxpYnJhcmllcyBmcm9tIE5TRiBtb3VudGVkIHBhcnRpdGlvbnMsIHNvIHdlIGF2b2lkIGFueQotICAgICMgcG90ZW50aWFsIHByb2JsZW1zIGJ5IHVzaW5nIGEgbG9jYWwgZGlyZWN0b3J5LgotICAgIGNhdGNoIHtleGVjIC9iaW4vc2ggLWMgImVjaG8gJCQifSBwaWQKLSAgICBzZXQgdG1wZGlyIC91c3IvdG1wL2xkLiRwaWQKLSAgICBjYXRjaCAiZXhlYyBta2RpciAkdG1wZGlyIiBleGVjX3N0YXR1cwotCi0gICAgIyBPbiBBSVgsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBleHBvcnQgdGhlIHN5bWJvbHMgdGhlIHNoYXJlZAotICAgICMgbGlicmFyeSBpcyBnb2luZyB0byBwcm92aWRlLCBhbmQgbmVlZC4KLSAgICBzZXQgZmlsZSBbb3BlbiAkdG1wZGlyL3hjb2ZmLmV4cCB3XQotICAgIHB1dHMgJGZpbGUgc2hsaWJ2YXIxCi0gICAgcHV0cyAkZmlsZSBzaGxpYnZhcjIKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGlidmFyMQotICAgIHB1dHMgJGZpbGUgc2hsaWJfc2hsaWJ2YXIyCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9zaGxpYmNhbGwKLSAgICBwdXRzICRmaWxlIHNobGliX3NobGliY2FsbGVkCi0gICAgcHV0cyAkZmlsZSBzaGxpYl9jaGVja2Z1bnB0cjEKLSAgICBwdXRzICRmaWxlIHNobGliX2dldGZ1bnB0cjEKLSAgICBwdXRzICRmaWxlIHNobGliX2NoZWNrCi0gICAgY2xvc2UgJGZpbGUKLX0KLQotIyBUaGUgdGVzdCBwcm9jZWR1cmUuCi1wcm9jIHNoYXJlZF90ZXN0IHsgcHJvZ25hbWUgdGVzdG5hbWUgbWFpbiBzaDEgc2gyIGRhdCBhcmdzIH0gewotICAgIGdsb2JhbCBsZAotICAgIGdsb2JhbCBzcmNkaXIKLSAgICBnbG9iYWwgc3ViZGlyCi0gICAgZ2xvYmFsIGV4ZWNfb3V0cHV0Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIGdsb2JhbCB0bXBkaXIKLQotICAgIGlmIFtsbGVuZ3RoICRhcmdzXSB7IHNldCBzaGxkZmxhZ3MgW2xpbmRleCAkYXJncyAwXSB9IGVsc2UgeyBzZXQgc2hsZGZsYWdzICIiIH0KLQotICAgICMgQnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJ5LgotICAgICMgT24gQUlYLCB3ZSBuZWVkIHRvIHVzZSBhbiBleHBvcnQgZmlsZS4KLSAgICBzZXQgc2hhcmVkIC1zaGFyZWQKLSAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2V0IHNoYXJlZCAiLWJNOlNSRSAtYkU6JHRtcGRpci94Y29mZi5leHAiCi0gICAgfQotICAgIGlmIHshW2xkX3NpbXBsZV9saW5rICRsZCAkdG1wZGlyLyRwcm9nbmFtZS5zbyAiJHNoYXJlZCAkc2hsZGZsYWdzICR0bXBkaXIvJHNoMSAkdG1wZGlyLyRzaDIiXX0gewotICAgICAgICBmYWlsICIkdGVzdG5hbWUiCi0gICAgCXJldHVybgotICAgIH0KLQotICAgICMgTGluayBhZ2FpbnN0IHRoZSBzaGFyZWQgbGlicmFyeS4gIFVzZSAtcnBhdGggc28gdGhhdCB0aGUKLSAgICAjIGR5bmFtaWMgbGlua2VyIGNhbiBsb2NhdGUgdGhlIHNoYXJlZCBsaWJyYXJ5IGF0IHJ1bnRpbWUuCi0gICAgIyBPbiBBSVgsIHdlIG11c3QgaW5jbHVkZSAvbGliIGluIC1ycGF0aCwgYXMgb3RoZXJ3aXNlIHRoZSBsb2FkZXIKLSAgICAjIGNhbiBub3QgZmluZCAtbGMuCi0gICAgc2V0IHJwYXRoICR0bXBkaXIKLSAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2V0IHJwYXRoIC9saWI6JHRtcGRpcgotICAgIH0KLSAgICBpZiAhW2xkX2xpbmsgJGxkICR0bXBkaXIvJHByb2duYW1lICItcnBhdGggJHJwYXRoICR0bXBkaXIvJG1haW4gJHRtcGRpci8kcHJvZ25hbWUuc28iXSB7Ci0gICAgCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICAJcmV0dXJuCi0gICAgfQotCi0gICAgIyBSdW4gdGhlIHJlc3VsdGluZyBwcm9ncmFtCi0gICAgc2VuZF9sb2cgIiR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXRcbiIKLSAgICB2ZXJib3NlICIkdG1wZGlyLyRwcm9nbmFtZSA+JHRtcGRpci8kcHJvZ25hbWUub3V0IgotICAgIGNhdGNoICJleGVjICR0bXBkaXIvJHByb2duYW1lID4kdG1wZGlyLyRwcm9nbmFtZS5vdXQiIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAiJGV4ZWNfb3V0cHV0IgotCWZhaWwgIiR0ZXN0bmFtZSIKLSAgICAJcmV0dXJuCi0gICAgfQotCi0gICAgc2VuZF9sb2cgImRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdFxuIgotICAgIHZlcmJvc2UgImRpZmYgJHRtcGRpci8kcHJvZ25hbWUub3V0ICRzcmNkaXIvJHN1YmRpci8kZGF0LmRhdCIKLSAgICBjYXRjaCAiZXhlYyBkaWZmICR0bXBkaXIvJHByb2duYW1lLm91dCAkc3JjZGlyLyRzdWJkaXIvJGRhdC5kYXQiIGV4ZWNfb3V0cHV0Ci0gICAgc2V0IGV4ZWNfb3V0cHV0IFtwcnVuZV93YXJuaW5ncyAkZXhlY19vdXRwdXRdCi0KLSAgICBpZiB7IVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XX0gdGhlbiB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQlmYWlsICIkdGVzdG5hbWUiCi0gICAgICAgIHJldHVybgotICAgIH0KLQotICAgIHBhc3MgIiR0ZXN0bmFtZSIKLX0KLQotaWYgW2lzdGFyZ2V0IG1pcHMqLSotKl0gewotICAgIHNldCBwaWNmbGFnICIiCi19IGVsc2UgewotICAgICMgVW5mb3J0dW5hdGVseSwgdGhlIGdjYyBhcmd1bWVudCBpcyAtZnBpYyBhbmQgdGhlIGNjIGFyZ3VtZW50IGlzCi0gICAgIyAtS1BJQy4gIFdlIGhhdmUgdG8gdHJ5IGJvdGguCi0gICAgc2V0IHBpY2ZsYWcgIi1mcGljIgotICAgIHNlbmRfbG9nICIkQ0MgJHBpY2ZsYWdcbiIKLSAgICB2ZXJib3NlICIkQ0MgJHBpY2ZsYWciCi0gICAgY2F0Y2ggImV4ZWMgJENDICRwaWNmbGFnIiBleGVjX291dHB1dAotICAgIHNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLSAgICB2ZXJib3NlICItLSIgIiRleGVjX291dHB1dCIKLSAgICBpZiB7IFtzdHJpbmcgbWF0Y2ggIippbGxlZ2FsIG9wdGlvbioiICRleGVjX291dHB1dF0gXAotCSB8fCBbc3RyaW5nIG1hdGNoICIqb3B0aW9uIGlnbm9yZWQqIiAkZXhlY19vdXRwdXRdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKnVucmVjb2duaXplZCBvcHRpb24qIiAkZXhlY19vdXRwdXRdIFwKLQkgfHwgW3N0cmluZyBtYXRjaCAiKnBhc3NlZCB0byBsZCoiICRleGVjX291dHB1dF0gfSB7Ci0JaWYgW2lzdGFyZ2V0ICotKi1zdW5vczQqXSB7Ci0JICAgIHNldCBwaWNmbGFnICItcGljIgotCX0gZWxzZSB7Ci0JICAgIHNldCBwaWNmbGFnICItS1BJQyIKLQl9Ci0gICAgfQotfQotdmVyYm9zZSAiVXNpbmcgJHBpY2ZsYWcgdG8gY29tcGlsZSBQSUMgY29kZSIKLQotIyBDb21waWxlIHRoZSBtYWluIHByb2dyYW0uCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbm5wLm9dIHsKLSAgICB1bnJlc29sdmVkICJzaGFyZWQgKG5vbiBQSUMpIgotICAgIHVucmVzb2x2ZWQgInNoYXJlZCIKLX0gZWxzZSB7Ci0gICAgIyBUaGUgc2hhcmVkIGxpYnJhcnkgaXMgY29tcG9zZWQgb2YgdHdvIGZpbGVzLiAgRmlyc3QgY29tcGlsZSB0aGVtCi0gICAgIyB3aXRob3V0IHVzaW5nIC1mcGljLiAgVGhhdCBzaG91bGQgd29yayBvbiBhbiBFTEYgc3lzdGVtLAotICAgICMgYWx0aG91Z2ggaXQgd2lsbCBiZSBsZXNzIGVmZmljaWVudCBiZWNhdXNlIHRoZSBkeW5hbWljIGxpbmtlcgotICAgICMgd2lsbCBuZWVkIHRvIGRvIG1vcmUgcmVsb2NhdGlvbiB3b3JrLiAgSG93ZXZlciwgbm90ZSB0aGF0IG5vdAotICAgICMgdXNpbmcgLWZwaWMgd2lsbCBjYXVzZSBzb21lIG9mIHRoZSB0ZXN0cyB0byByZXR1cm4gZGlmZmVyZW50Ci0gICAgIyByZXN1bHRzLgotICAgIGlmIHsgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL3NoMS5jICR0bXBkaXIvc2gxbnAub10KLQkgfHwgIVtsZF9jb21waWxlICIkQ0MgJENGTEFHUyAkU0hDRkxBRyIgJHNyY2Rpci8kc3ViZGlyL3NoMi5jICR0bXBkaXIvc2gybnAub10gfSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChub24gUElDKSIKLSAgICB9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0Jc2hhcmVkX3Rlc3Qgc2hucCAic2hhcmVkIChub25QSUMpIiBtYWlubnAubyBzaDFucC5vIHNoMm5wLm8geGNvZmYKLSAgICB9IGVsc2UgewotCSMgU3VuT1Mgbm9uIFBJQyBzaGFyZWQgbGlicmFyaWVzIGRvbid0IHBlcm1pdCBzb21lIGNhc2VzIG9mCi0JIyBvdmVycmlkaW5nLgotCXNldHVwX3hmYWlsICIqLSotc3Vub3M0KiIKLQlzaGFyZWRfdGVzdCBzaG5wICJzaGFyZWQgKG5vbiBQSUMpIiBtYWlubnAubyBzaDFucC5vIHNoMm5wLm8gc2hhcmVkCi0KLQkjIFRlc3QgRUxGIHNoYXJlZCBsaWJyYXJ5IHJlbG9jYXRpb25zIHdpdGggYSBub24temVybyBsb2FkCi0JIyBhZGRyZXNzIGZvciB0aGUgbGlicmFyeS4gIE5lYXIgYXMgSSBjYW4gdGVsbCwgdGhlIFJfKl9SRUxBVElWRQotCSMgcmVsb2NhdGlvbnMgZm9yIHZhcmlvdXMgdGFyZ2V0cyBhcmUgYnJva2VuIGluIHRoZSBjYXNlIHdoZXJlCi0JIyB0aGUgbG9hZCBhZGRyZXNzIGlzIG5vdCB6ZXJvICh3aGljaCBpcyB0aGUgZGVmYXVsdCkuCi0Jc2V0dXBfeGZhaWwgIiotKi1zdW5vczQqIgotCXNoYXJlZF90ZXN0IHNobnAgInNoYXJlZCAobm9uIFBJQywgbG9hZCBvZmZzZXQpIiBcCi0JCW1haW5ucC5vIHNoMW5wLm8gc2gybnAubyBzaGFyZWQgXAotCQkiLVQgJHNyY2Rpci8kc3ViZGlyL2VsZi1vZmZzZXQubGQiCi0gICAgfSB9Ci0KLSAgICAjIE5vdyBjb21waWxlIHRoZSBjb2RlIHVzaW5nIC1mcGljLgotCi0gICAgaWYgeyAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gxLmMgJHRtcGRpci9zaDFwLm9dIAotCSB8fCAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvc2gyLmMgJHRtcGRpci9zaDJwLm9dIH0gewotCXVucmVzb2x2ZWQgInNoYXJlZCIKLSAgICB9IGVsc2UgewotCSMgU3VuT1MgY2FuIG5vdCBjb21wYXJlIGZ1bmN0aW9uIHBvaW50ZXJzIGNvcnJlY3RseQotCWlmIFtpc3RhcmdldCAiKi0qLXN1bm9zNCoiXSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHN1bjQKLQl9IGVsc2UgeyBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNocCAic2hhcmVkIiBtYWlubnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2hwICJzaGFyZWQiIG1haW5ucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCi0JfSB9Ci0gICAgfQotfQotCi0jIE5vdyBkbyB0aGUgc2FtZSB0ZXN0cyBhZ2FpbiwgYnV0IHRoaXMgdGltZSBjb21waWxlIG1haW4uYyBQSUMuCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAkQ0ZMQUdTICRTSENGTEFHICRwaWNmbGFnIiAkc3JjZGlyLyRzdWJkaXIvbWFpbi5jICR0bXBkaXIvbWFpbnAub10gewotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgotICAgIHVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4pIgotfSBlbHNlIHsKLSAgICBpZiB7IFtmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMW5wLm8gXSAmJiBbIGZpbGUgZXhpc3RzICR0bXBkaXIvc2gybnAubyBdIH0gewotICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgIyBTdW5PUyBub24gUElDIHNoYXJlZCBsaWJyYXJpZXMgZG9uJ3QgcGVybWl0IHNvbWUgY2FzZXMgb2YKLQkgICAgIyBvdmVycmlkaW5nLgotCSAgICBzZXR1cF94ZmFpbCAiKi0qLXN1bm9zNCoiCi0JICAgIHNoYXJlZF90ZXN0IHNobXBucCAic2hhcmVkIChQSUMgbWFpbiwgbm9uIFBJQyBzbykiIG1haW5wLm8gc2gxbnAubyBzaDJucC5vIHNoYXJlZAotCX0KLSAgICB9IGVsc2UgewotCXVucmVzb2x2ZWQgInNoYXJlZCAoUElDIG1haW4sIG5vbiBQSUMgc28pIgotICAgIH0KLQotICAgIGlmIHsgW2ZpbGUgZXhpc3RzICR0bXBkaXIvc2gxcC5vIF0gJiYgWyBmaWxlIGV4aXN0cyAkdG1wZGlyL3NoMnAubyBdIH0gewotICAgICAgICBpZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0JICAgIHNoYXJlZF90ZXN0IHNobXBwICJzaGFyZWQgKFBJQyBtYWluKSIgbWFpbnAubyBzaDFwLm8gc2gycC5vIHhjb2ZmCi0JfSBlbHNlIHsKLQkgICAgc2hhcmVkX3Rlc3Qgc2htcHAgInNoYXJlZCAoUElDIG1haW4pIiBtYWlucC5vIHNoMXAubyBzaDJwLm8gc2hhcmVkCi0JfQotICAgIH0gZWxzZSB7Ci0JdW5yZXNvbHZlZCAic2hhcmVkIChQSUMgbWFpbikiCi0gICAgfQotfQotCi1pZiB7IFtpc3RhcmdldCByczYwMDAqLSotYWl4Kl0gfHwgW2lzdGFyZ2V0IHBvd2VycGMqLSotYWl4Kl0gfSB7Ci0gICAgIyBSZW1vdmUgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCi0gICAgY2F0Y2ggImV4ZWMgcm0gLXJmICR0bXBkaXIiIGV4ZWNfc3RhdHVzCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC9zdW40LmRhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUwZDg3ZC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc2hhcmVkL3N1bjQuZGF0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotbWFpbnZhciA9PSAxCi1vdmVycmlkZGVudmFyID09IDIKLXNobGlidmFyMSA9PSAzCi1zaGxpYl9tYWludmFyICgpID09IDEKLXNobGliX292ZXJyaWRkZW52YXIgKCkgPT0gMgotc2hsaWJfc2hsaWJ2YXIxICgpID09IDMKLXNobGliX3NobGlidmFyMiAoKSA9PSA0Ci1zaGxpYl9zaGxpYmNhbGwgKCkgPT0gNQotc2hsaWJfc2hsaWJjYWxsMiAoKSA9PSA4Ci1zaGxpYl9tYWluY2FsbCAoKSA9PSA2Ci1tYWluX2NhbGxlZCAoKSA9PSA2Ci1zaGxpYl9jaGVja2Z1bnB0cjEgKHNobGliX3NobGlidmFyMSkgPT0gMAotc2hsaWJfY2hlY2tmdW5wdHIyIChtYWluX2NhbGxlZCkgPT0gMQotc2hsaWJfZ2V0ZnVucHRyMSAoKSAhPSBzaGxpYl9zaGxpYnZhcjEKLXNobGliX2dldGZ1bnB0cjIgKCkgPT0gbWFpbl9jYWxsZWQKLXNobGliX2NoZWNrICgpID09IDEKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zaGFyZWQveGNvZmYuZGF0IGIvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDlkOTYuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXNoYXJlZC94Y29mZi5kYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1tYWludmFyID09IDEKLW92ZXJyaWRkZW52YXIgPT0gMgotc2hsaWJ2YXIxID09IDMKLXNobGliX3NobGlidmFyMSAoKSA9PSAzCi1zaGxpYl9zaGxpYnZhcjIgKCkgPT0gNAotc2hsaWJfc2hsaWJjYWxsICgpID09IDUKLW1haW5fY2FsbGVkICgpID09IDYKLXNobGliX2NoZWNrZnVucHRyMSAoc2hsaWJfc2hsaWJ2YXIxKSA9PSAxCi1zaGxpYl9nZXRmdW5wdHIxICgpID09IHNobGliX3NobGlidmFyMQotc2hsaWJfY2hlY2sgKCkgPT0gMQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXNyZWMvc3IxLmMgYi9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkZTk3Ny4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjEuYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBhbmQgbGlua2VkIGludG8gdGhlIFMtcmVjb3JkIGZvcm1hdC4gICovCi0KLWV4dGVybiBpbnQgZTE7Ci1leHRlcm4gaW50IGUyOwotaW50IGk7Ci1pbnQgaiA9IDE7Ci1zdGF0aWMgaW50IGs7Ci1zdGF0aWMgaW50IGwgPSAxOwotc3RhdGljIGNoYXIgYWJbXSA9ICJUaGlzIGlzIGEgc3RyaW5nIGNvbnN0YW50IjsKLQotZXh0ZXJuIGludCBmbjEgKCk7Ci1leHRlcm4gaW50IGZuMiAoKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIGZuMSAoYWIpOwotICBmbjIgKCJzdGF0aWMgc3RyaW5nIGNvbnN0YW50Iik7Ci0gIHJldHVybiBlMSArIGUyICsgaSArIGogKyBrICsgbDsKLX0KLQotdm9pZAotX19tYWluICgpCi17Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjIuYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM2Y2ZhLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LiAgKi8KLQotaW50IGUxOwotaW50IGUyID0gMTsKLQotaW50Ci1mbjEgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiBzW2UxXTsKLX0KLQotaW50Ci1mbjIgKHMpCi0gICAgIGNoYXIgKnM7Ci17Ci0gIHJldHVybiBzW2UyXTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYyBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyMy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxN2MyNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcjMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8gVGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQgaW50byB0aGUgUy1yZWNvcmQgZm9ybWF0LgotCi0jZGVmaW5lIEZPT19NU0dfTEVOIDgwCi0KLWNsYXNzIEZvbyB7Ci0gICAgc3RhdGljIGludCBmb29zOwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuID0gRk9PX01TR19MRU47Ci0gICAgY2hhciBtZXNzYWdlW2xlbl07Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHZvaWQgaW5pdF9mb28gKCk7Ci0gICAgc3RhdGljIGludCBuYl9mb29zKCkgeyByZXR1cm4gZm9vczsgfQotICAgIEZvbygpOwotICAgIEZvbyggY2hhciogbWVzc2FnZSk7Ci0gICAgRm9vKGNvbnN0IEZvbyYpOwotICAgIEZvbyAmIG9wZXJhdG9yPSAoY29uc3QgRm9vJik7Ci0gICAgfkZvbyAoKTsKLX07Ci0KLXN0YXRpYyBGb28gc3RhdGljX2ZvbyggInN0YXRpY19mb28iKTsKLQotaW50Ci1tYWluICgpCi17Ci0gIEZvbyBhdXRvbWF0aWNfZm9vKCAiYXV0b21hdGljX2ZvbyIpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZAotdGVybWluYXRlKHZvaWQpCi17Ci0gIC8qIFRoaXMgcmVjdXJzaXZlIGNhbGwgcHJldmVudHMgYSBjb21waWxlciB3YXJuaW5nIHRoYXQgdGhlIG5vcmV0dXJuCi0gICAgIGZ1bmN0aW9uIHRlcm1pbmF0ZSBhY3R1YWxseSBkb2VzIHJldHVybi4gICovCi0gIHRlcm1pbmF0ZSAoKTsKLX0KLQotZXh0ZXJuICJDIiB7Ci12b2lkCi1fX21haW4gKCkKLXsKLX0KLQotdm9pZAotX19idWlsdGluX2RlbGV0ZSAoKQotewotfQotCi12b2lkCi1fX2J1aWx0aW5fbmV3ICgpCi17Ci19Ci0KLXZvaWQKLV9fdGhyb3cgKCkKLXsKLX0KLQotdm9pZAotX190ZXJtaW5hdGUgKCkKLXsKLX0KLQotdm9pZCAqX19laF9wYzsKLQotdm9pZCAqKioKLV9fZ2V0X2R5bmFtaWNfaGFuZGxlcl9jaGFpbiAoKQotewotICByZXR1cm4gMDsKLX0KLQotdm9pZCAqCi1fX2dldF9laF9jb250ZXh0ICgpCi17Ci0gIHJldHVybiAwOwotfQotCi19Ci0KLWludCBGb286OmZvb3MgPSAwOwotCi12b2lkIEZvbzo6aW5pdF9mb28gKCkKLXsKLSAgZm9vcyA9IDgwOwotfQotCi1Gb286OkZvbyAoKQotewotICBpID0gKytmb29zOwotfQotCi1Gb286OkZvbyAoY2hhciogbXNnKQotewotICBpID0gKytmb29zOwotfQotCi1Gb286OkZvbyAoY29uc3QgRm9vJiBmb28pCi17Ci0gIGkgPSArK2Zvb3M7Ci0gIGZvciAoaW50IGsgPSAwOyBrIDwgRk9PX01TR19MRU47IGsrKykKLSAgICBtZXNzYWdlW2tdID0gZm9vLm1lc3NhZ2Vba107Ci19Ci0KLUZvbyYgRm9vOjpvcGVyYXRvcj0gKGNvbnN0IEZvbyYgZm9vKQotewotICBmb3IgKGludCBrID0gMDsgayA8IEZPT19NU0dfTEVOOyBrKyspCi0gICAgbWVzc2FnZVtrXSA9IGZvby5tZXNzYWdlW2tdOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUZvbzo6fkZvbyAoKQotewotICBmb29zLS07Ci19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtc3JlYy9zcmVjLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyZWMuZXhwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTUxZDM2Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC1zcmVjL3NyZWMuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLSMgVGVzdCBsaW5raW5nIGRpcmVjdGx5IHRvIFMtcmVjb3Jkcy4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQuCi0jIFB1YmxpYyBkb21haW4uCi0KLSMgR2V0IHRoZSBvZmZzZXQgZnJvbSBhbiBTLXJlY29yZCBsaW5lIHRvIHRoZSBzdGFydCBvZiB0aGUgZGF0YS4KLQotcHJvYyBzcmVjX29mZiB7IGwgfSB7Ci0gICAgaWYgW3N0cmluZyBtYXRjaCAiUzEqIiAkbF0gewotCXJldHVybiA4Ci0gICAgfSBlbHNlIHsgaWYgW3N0cmluZyBtYXRjaCAiUzIqIiAkbF0gewotCXJldHVybiAxMAotICAgIH0gZWxzZSB7IGlmIFtzdHJpbmcgbWF0Y2ggIlMzKiIgJGxdIHsKLQlyZXR1cm4gMTIKLSAgICB9IGVsc2UgewotCXJldHVybiAtMQotICAgIH0gfSB9Ci19Ci0KLSMgU2VlIGlmIGFuIFMtcmVjb3JkIGxpbmUgY29udGFpbnMgb25seSB6ZXJvIGRhdGEuCi0KLXByb2Mgc3JlY196ZXJvIHsgbCB9IHsKLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFswNzg5XF0qIiAkbF0gewotCXJldHVybiAxCi0gICAgfQotCi0gICAgIyBTdHJpcCB0aGUgYWRkcmVzcyBhbmQgY2hlY2tzdW0uCi0gICAgaWYgW3N0cmluZyBtYXRjaCAiU1xbMTIzXF0qIiAkbF0gewotCXNldCBsIFtzdHJpbmcgcmFuZ2UgJGwgW3NyZWNfb2ZmICRsXSBbZXhwciBbc3RyaW5nIGxlbmd0aCAkbF0gLSAzXV0KLSAgICB9IGVsc2UgewotCXJldHVybiAwCi0gICAgfQotCi0gICAgIyBUaGUgcmVzdCBtdXN0IGJlIHplcm8uCi0gICAgcmV0dXJuIFtzdHJpbmcgbWF0Y2ggIiIgW3N0cmluZyB0cmltICRsICIwIl1dCi19Ci0KLSMgR2V0IHRoZSBhZGRyZXNzIG9mIGFuIFMtcmVjb3JkIGxpbmUuCi0KLXByb2Mgc3JlY19hZGRyIHsgbCB9IHsKLSAgICBpZiBbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7Ci0Jc2V0IGFkZHIgW3N0cmluZyByYW5nZSAkbCA0IFtleHByIFtzcmVjX29mZiAkbF0gLSAxXV0KLSAgICB9IGVsc2UgewotCXJldHVybiAtMQotICAgIH0KLQotICAgIHJldHVybiAiMHgkYWRkciIKLX0KLQotIyBHZXQgdGhlIG51bWJlciBvZiBkYXRhIGJ5dGVzIGluIGFuIFMtcmVjb3JkIGxpbmUuCi0KLXByb2Mgc3JlY19sZW4geyBsIH0gewotICAgIGlmICFbc3RyaW5nIG1hdGNoICJTXFsxMjNcXSoiICRsXSB7Ci0JcmV0dXJuIDAKLSAgICB9Ci0KLSAgICByZXR1cm4gW2V4cHIgIjB4W3N0cmluZyByYW5nZSAkbCAyIDNdIiAtIChbc3JlY19vZmYgJGxdIC0gNCkgLyAyIC0gMV0KLX0KLQotIyBFeHRyYWN0IGJ5dGVzIGZyb20gYW4gUy1yZWNvcmQgbGluZS4KLQotcHJvYyBzcmVjX2V4dHJhY3QgeyBsIHN0YXJ0IGxlbiB9IHsKLSAgICBzZXQgb2ZmIFtzcmVjX29mZiAkbF0KLSAgICBzZXQgcmxlbiBbc3JlY19sZW4gJGxdCi0gICAgc2V0IHN0b3AgW2V4cHIgJHN0YXJ0ICsgJGxlbl0KLSAgICBpZiB7ICRzdG9wID4gJHJsZW4gfSB7Ci0Jc2V0IHN0b3AgW2V4cHIgJHJsZW5dCi0gICAgfQotICAgIHNldCBzdGFydCBbZXhwciAkc3RhcnQgKiAyICsgJG9mZl0KLSAgICBzZXQgc3RvcCBbZXhwciAkc3RvcCAqIDIgKyAkb2ZmIC0gMV0KLSAgICByZXR1cm4gW3N0cmluZyByYW5nZSAkbCAkc3RhcnQgJHN0b3BdCi19Ci0KLSMgU2VlIGlmIGEgcmFuZ2Ugb2YgYnl0ZXMgaW4gYW4gUy1yZWNvcmQgbGluZSBpcyBhbGwgemVyb2VzLgotCi1wcm9jIHNyZWNfemVyb19yYW5nZSB7IGwgc3RhcnQgbGVuIH0gewotICAgIHJldHVybiBbc3RyaW5nIG1hdGNoICIiIFtzdHJpbmcgdHJpbSBbc3JlY19leHRyYWN0ICRsICRzdGFydCAkbGVuXSAiMCJdXQotfQotCi0jIFRyaW0gYW4gUy1yZWNvcmQgbGluZSBzdWNoIHRoYXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgcmVtYWluCi0jIGF0IHRoZSBlbmQuCi0KLXByb2Mgc3JlY190cmltIHsgbCBsZWF2ZSB9IHsKLSAgICBzZXQgb2ZmIFtzcmVjX29mZiAkbF0KLSAgICBzZXQgYWRkciBbc3JlY19hZGRyICRsXQotICAgIHNldCBsZW4gW3NyZWNfbGVuICRsXQotCi0gICAgaWYgeyAkbGVhdmUgPj0gJGxlbiB9IHsKLQlyZXR1cm4gJGwKLSAgICB9Ci0KLSAgICBzZXQgczEgW3N0cmluZyByYW5nZSAkbCAwIDFdCi0gICAgc2V0IHMyIFtmb3JtYXQgIiUwMngiIFtleHByICgkb2ZmIC0gNCkgLyAyICsgJGxlYXZlICsgMV1dCi0gICAgc2V0IHMzIFtmb3JtYXQgIiUwW2V4cHIgJG9mZiAtIDRdeCIgW2V4cHIgJGFkZHIgKyAkbGVuIC0gJGxlYXZlXV0KLSAgICBzZXQgczQgW3N0cmluZyByYW5nZSAkbCBbZXhwciBbc3RyaW5nIGxlbmd0aCAkbF0gLSAoJGxlYXZlICogMikgLSAyXSBlbmRdCi0gICAgc2V0IHMgIiR7czF9JHtzMn0ke3MzfSR7czR9IgotCi0gICAgdmVyYm9zZSAic3JlY190cmltIHsgJyRsJyAkbGVhdmUgfSByZXR1cm5pbmcgJyRzJyIgMgotCi0gICAgcmV0dXJuICRzCi19Ci0KLSMgUmVwb3J0IGZhaWx1cmUgd2hlbiBjb21wYXJpbmcgUy1yZWNvcmQgbGluZXMKLQotcHJvYyBzcmVjX2NvbXBhcmVfZmFpbCB7IHdoaWNoIGwxIGwyIH0gewotICAgIHNlbmRfbG9nICJjb21wYXJpc29uIGZhaWx1cmUgJHdoaWNoOlxuJGwxXG4kbDJcbiIKLSAgICB2ZXJib3NlICJjb21wYXJpc29uIGZhaWx1cmUgJHdoaWNoOlxuJGwxXG4kbDIiCi19Ci0KLSMgQ29tcGFyZSBTLXJlY29yZCBmaWxlcy4gIFdlIGRvbid0IHdhbnQgdG8gZnVzcyBhYm91dCB0aGluZ3MgbGlrZQotIyBleHRyYSB6ZXJvZXMuICBOb3RlIHRoYXQgQkZEIGFsd2F5cyBzb3J0cyBTLXJlY29yZHMgYnkgYWRkcmVzcy4KLQotcHJvYyBzcmVjX2NvbXBhcmUgeyBmMSBmMiB9IHsKLSAgICBzZXQgZTEgW2dldHMgJGYxIGwxXQotICAgIHNldCBlMiBbZ2V0cyAkZjIgbDJdCi0KLSAgICB3aGlsZSB7ICRlMSAhPSAtMSB9IHsKLQlzZXQgbDEgW3N0cmluZyB0cmltcmlnaHQgJGwxICJcclxuIl0KLQlzZXQgbDIgW3N0cmluZyB0cmltcmlnaHQgJGwyICJcclxuIl0KLQlpZiB7ICRlMiA9PSAtMSB9IHsKLQkgICAgIyBJZiBsMSBjb250YWlucyBkYXRhLCBpdCBtdXN0IGJlIHplcm8uCi0JICAgIGlmICFbc3JlY196ZXJvICRsMV0gewotCQlzZW5kX2xvZyAiZGF0YSBhZnRlciBFT0Y6ICRsMVxuIgotCQl2ZXJib3NlICJkYXRhIGFmdGVyIEVPRjogJGwxIgotCQlyZXR1cm4gMAotCSAgICB9Ci0JfSBlbHNlIHsgaWYgeyBbc3RyaW5nIGNvbXBhcmUgJGwxICRsMl0gPT0gMCB9IHsKLQkgICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkgICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KLQl9IGVsc2UgeyBpZiB7IFtzcmVjX3plcm8gJGwxXSB9IHsKLQkgICAgc2V0IGUxIFtnZXRzICRmMSBsMV0KLQl9IGVsc2UgeyBpZiB7IFtzcmVjX3plcm8gJGwyXSB9IHsKLQkgICAgc2V0IGUyIFtnZXRzICRmMiBsMl0KLQl9IGVsc2UgewotCSAgICAjIFRoZSBzdHJpbmdzIGFyZSBub3QgdGhlIHNhbWUsIGFuZCBuZWl0aGVyIGlzIGFsbCB6ZXJvZXMuCi0JICAgIHNldCBhMSBbc3JlY19hZGRyICRsMV0KLQkgICAgc2V0IG4xIFtzcmVjX2xlbiAkbDFdCi0JICAgIHNldCBhMiBbc3JlY19hZGRyICRsMl0KLQkgICAgc2V0IG4yIFtzcmVjX2xlbiAkbDJdCi0KLQkgICAgaWYgeyAkYTEgPCAkYTIgJiYgIVtzcmVjX3plcm9fcmFuZ2UgJGwxIDAgW2V4cHIgJGEyIC0gJGExXV0gfSB7Ci0JCXZlcmJvc2UgIiRhMSAkYTIgW3NyZWNfZXh0cmFjdCAkbDEgMCBbZXhwciAkYTIgLSAkYTFdXSIgMgotCQlzcmVjX2NvbXBhcmVfZmFpbCAxICRsMSAkbDIKLQkJcmV0dXJuIDAKLQkgICAgfQotCSAgICBpZiB7ICRhMiA8ICRhMSAmJiAhW3NyZWNfemVyb19yYW5nZSAkbDIgMCBbZXhwciAkYTEgLSAkYTJdXSB9IHsKLQkJc3JlY19jb21wYXJlX2ZhaWwgMiAkbDEgJGwyCi0JCXJldHVybiAwCi0JICAgIH0KLQotCSAgICAjIEhlcmUgd2Uga25vdyB0aGF0IGFueSBpbml0aWFsIGRhdGEgaW4gYm90aCBsaW5lcyBpcwotCSAgICAjIHplcm8uICBOb3cgbWFrZSBzdXJlIHRoYXQgYW55IG92ZXJsYXBwaW5nIGRhdGEgbWF0Y2hlcy4KLQkgICAgaWYgeyAkYTEgPCAkYTIgfSB7Ci0JCXNldCBvczEgW2V4cHIgJGEyIC0gJGExXQotCQlzZXQgb3MyIDAKLQkgICAgfSBlbHNlIHsKLQkJc2V0IG9zMSAwCi0JCXNldCBvczIgW2V4cHIgJGExIC0gJGEyXQotCSAgICB9Ci0JICAgIGlmIHsgJGExICsgJG4xIDwgJGEyICsgJG4yIH0gewotCQlzZXQgb2wgW2V4cHIgJG4xIC0gJG9zMV0KLQkgICAgfSBlbHNlIHsKLQkJc2V0IG9sIFtleHByICRuMiAtICRvczJdCi0JICAgIH0KLQotCSAgICBzZXQgeDEgW3NyZWNfZXh0cmFjdCAkbDEgJG9zMSAkb2xdCi0JICAgIHNldCB4MiBbc3JlY19leHRyYWN0ICRsMiAkb3MyICRvbF0KLQkgICAgaWYgeyBbc3RyaW5nIGNvbXBhcmUgJHgxICR4Ml0gIT0gMCB9IHsKLQkJdmVyYm9zZSAiJG9zMSAkb2wgJHgxIiAyCi0JCXZlcmJvc2UgIiRvczIgJG9sICR4MiIgMgotCQlzcmVjX2NvbXBhcmVfZmFpbCAzICRsMSAkbDIKLQkJcmV0dXJuIDAKLQkgICAgfQotCi0JICAgICMgVGhlc2Ugc3RyaW5ncyBtYXRjaC4gIFRyaW0gdGhlIGRhdGEgZnJvbSB0aGUgbGFyZ2VyCi0JICAgICMgc3RyaW5nLCByZWFkIGEgbmV3IGNvcHkgb2YgdGhlIHNtYWxsZXIgc3RyaW5nLCBhbmQKLQkgICAgIyBjb250aW51ZS4KLQkgICAgaWYgeyAkYTEgKyAkbjEgPCAkYTIgKyAkbjIgfSB7Ci0JCXNldCBsMiBbc3JlY190cmltICRsMiBbZXhwciAoJGEyICsgJG4yKSAtICgkYTEgKyAkbjEpXV0KLQkJc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkgICAgfSBlbHNlIHsgaWYgeyAkYTEgKyAkbjEgPiAkYTIgKyAkbjIgfSB7Ci0JCXNldCBsMSBbc3JlY190cmltICRsMSBbZXhwciAoJGExICsgJG4xKSAtICgkYTIgKyAkbjIpXV0KLQkJc2V0IGUyIFtnZXRzICRmMiBsMl0KLQkgICAgfSBlbHNlIHsKLQkJc2V0IGUxIFtnZXRzICRmMSBsMV0KLQkJc2V0IGUyIFtnZXRzICRmMiBsMl0KLQkgICAgfSB9Ci0JfSB9IH0gfQotICAgIH0KLQotICAgICMgV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBmaWxlLiAgVGhlIHJlbWFpbmRlciBvZiB0aGUKLSAgICAjIHNlY29uZCBmaWxlIG11c3QgY29udGFpbiBvbmx5IHplcm9lcy4KLSAgICB3aGlsZSB7ICRlMiAhPSAtMSB9IHsKLQlzZXQgbDIgW3N0cmluZyB0cmltcmlnaHQgJGwyICJcclxuIl0KLQlpZiAhW3NyZWNfemVybyAkbDJdIHsKLQkgICAgc2VuZF9sb2cgImRhdGEgYWZ0ZXIgRU9GOiAkbDJcbiIKLQkgICAgdmVyYm9zZSAiZGF0YSBhZnRlciBFT0Y6ICRsMiIKLQkgICAgcmV0dXJuIDAKLQl9Ci0Jc2V0IGUyIFtnZXRzICRmMiBsMl0KLSAgICB9Ci0KLSAgICByZXR1cm4gMQotfQotCi0jIExpbmsgdHdpY2UsIG9iamNvcHksIGFuZCBjb21wYXJlCi0KLXByb2MgcnVuX3NyZWNfdGVzdCB7IHRlc3Qgb2JqcyB9IHsKLSAgICBnbG9iYWwgbGQKLSAgICBnbG9iYWwgb2JqY29weQotICAgIGdsb2JhbCBzaXplb2ZfaGVhZGVycwotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIHNldCBmbGFncyAiIgotCi0gICAgIyBJZiB0aGUgbGlua2VyIHNjcmlwdCB1c2VzIFNJWkVPRl9IRUFERVJTLCB1c2UgYSAtVHRleHQgYXJndW1lbnQKLSAgICAjIHRvIGZvcmNlIGJvdGggdGhlIG5vcm1hbCBsaW5rIGFuZCB0aGUgUy1yZWNvcmQgbGluayB0byBiZSBwdXQgaW4KLSAgICAjIHRoZSBzYW1lIHBsYWNlLiAgV2UgZG9uJ3QgYWx3YXlzIHVzZSAtVHRleHQgYmVjYXVzZSBpdCBpbnRlcmFjdHMKLSAgICAjIHBvb3JseSB3aXRoIGEub3V0LgotCi0gICAgaWYgeyAkc2l6ZW9mX2hlYWRlcnMgfSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLVR0ZXh0IDB4MTAwMCIKLSAgICB9Ci0KLSAgICAjIFRoZSBhMjlrIGNvbXBpbGVkIGNvZGUgY2FsbHMgVl9TUElMTCBhbmQgVl9GSUxMLiAgU2luY2Ugd2UgZG9uJ3QKLSAgICAjIG5lZWQgdG8gcnVuIHRoaXMgY29kZSwgYnV0IHdlIGRvbid0IGhhdmUgZGVmaW5pdGlvbnMgZm9yIHRob3NlCi0gICAgIyBmdW5jdGlvbnMsIHdlIGp1c3QgZGVmaW5lIHRoZW0gb3V0LgotICAgIGlmIFtpc3RhcmdldCBhMjlrKi0qLSpdIHsKLQlzZXQgZmxhZ3MgIiRmbGFncyAtLWRlZnN5bSBWX1NQSUxMPTAgLS1kZWZzeW0gVl9GSUxMPTAiCi0gICAgfQotCi0gICAgIyBBUk0gdGFyZ2V0cyBjYWxsIF9fZ2NjbWFpbgotICAgIGlmIFtpc3RhcmdldCBhcm0tKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19fZ2NjbWFpbj0wIgotICAgIH0KLSAgICAKLSAgICBpZiBbaXN0YXJnZXQgc3Ryb25nYXJtLSotKl0gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fZ2NjbWFpbj0wIgotICAgIH0KLSAgICAKLSAgICAjIFRodW1iIHRhcmdldHMgY2FsbCBfX2djY21haW4KLSAgICBpZiBbaXN0YXJnZXQgdGh1bWItKi0qXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19fZ2NjbWFpbj0wIgotICAgIH0KLQotICAgICMgUG93ZXJQQyBFQUJJIGNvZGUgY2FsbHMgX19lYWJpLgotICAgIGlmIFtpc3RhcmdldCBwb3dlcnBjKi0qLWVhYmkqXSB7Ci0Jc2V0IGZsYWdzICIkZmxhZ3MgLS1kZWZzeW0gX19lYWJpPTAiCi0gICAgfQotCi0gICAgIyBtbjEwMjAwIGNvZGUgY2FsbHMgX190cnVuY3NpcHNpMl9kMF9kMi4KLSAgICBpZiB7W2lzdGFyZ2V0IG1uMTAyMDAqLSotKl19IHRoZW4gewotCXNldCBmbGFncyAiJGZsYWdzIC0tZGVmc3ltIF9fdHJ1bmNzaXBzaTJfZDBfZDI9MCIKLSAgICB9Ci0KLSAgICAjIFY4NTAgdGFyZ2V0cyBuZWVkIGxpYmdjYy5hCi0gICAgaWYgW2lzdGFyZ2V0IHY4NTAqLSotZWxmXSB7Ci0Jc2V0IG9ianMgIiRvYmpzIC1MIC4uL2djYyAtbGdjYyIKLSAgICB9Ci0gICAgCi0gICAgaWYgeyAhW2xkX3NpbXBsZV9saW5rICRsZCB0bXBkaXIvc3IxICIkZmxhZ3MgJG9ianMiXSBcCi0JIHx8ICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci9zcjIuc3IgIiRmbGFncyAtb2Zvcm1hdCBzcmVjICRvYmpzIl0gfSB7Ci0Jc2V0dXBfeGZhaWwgImhwcGEqLSotKmVsZioiCi0JZmFpbCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNlbmRfbG9nICIkb2JqY29weSAtTyBzcmVjIHRtcGRpci9zcjEgdG1wZGlyL3NyMS5zclxuIgotICAgIHZlcmJvc2UgIiRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyIgotICAgIGNhdGNoICJleGVjICRvYmpjb3B5IC1PIHNyZWMgdG1wZGlyL3NyMSB0bXBkaXIvc3IxLnNyIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmICFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gewotCXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLQl2ZXJib3NlICIkZXhlY19vdXRwdXQiCi0JdW5yZXNvbHZlZCAkdGVzdAotCXJldHVybgotICAgIH0KLQotICAgIHNldCBmMSBbb3BlbiB0bXBkaXIvc3IxLnNyIHJdCi0gICAgc2V0IGYyIFtvcGVuIHRtcGRpci9zcjIuc3Igcl0KLSAgICBpZiBbc3JlY19jb21wYXJlICRmMSAkZjJdIHsKLQlwYXNzICR0ZXN0Ci0gICAgfSBlbHNlIHsKLQlmYWlsICR0ZXN0Ci0gICAgfQotICAgIGNsb3NlICRmMQotICAgIGNsb3NlICRmMgotfQotCi1zZXQgdGVzdDEgIlMtcmVjb3JkcyIKLXNldCB0ZXN0MiAiUy1yZWNvcmRzIHdpdGggY29uc3RydWN0b3JzIgotCi0jIFNlZSB3aGV0aGVyIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgdXNlcyBTSVpFT0ZfSEVBREVSUy4KLWNhdGNoICJleGVjICRsZCAtLXZlcmJvc2UiIGV4ZWNfb3V0cHV0Ci1zZXQgc2l6ZW9mX2hlYWRlcnMgW3N0cmluZyBtYXRjaCAiKlNJWkVPRl9IRUFERVJTKiIgJGV4ZWNfb3V0cHV0XQotCi0jIEZpcnN0IHRlc3QgbGlua2luZyBhIEMgcHJvZ3JhbS4gIFdlIGRvbid0IHJlcXVpcmUgYW55IGxpYnJhcmllcy4gIFdlCi0jIGxpbmsgaXQgbm9ybWFsbHksIGFuZCBvYmpjb3B5IHRvIHRoZSBTLXJlY29yZCBmb3JtYXQsIGFuZCB0aGVuIGxpbmsKLSMgZGlyZWN0bHkgdG8gdGhlIFMtcmVjb3JkIGZvcm1hdCwgYW5kIHJlcXVpcmUgdGhhdCB0aGUgdHdvIGZpbGVzCi0jIGNvbnRhaW4gdGhlIHNhbWUgZGF0YS4KLQotaWYgeyBbd2hpY2ggJENDXSA9PSAwIH0gewotICAgIHVudGVzdGVkICR0ZXN0MQotICAgIHVudGVzdGVkICR0ZXN0MgotICAgIHJldHVybgotfQotCi1pZiB7ICFbbGRfY29tcGlsZSAkQ0MgJHNyY2Rpci8kc3ViZGlyL3NyMS5jIHRtcGRpci9zcjEub10gXAotICAgICB8fCAhW2xkX2NvbXBpbGUgJENDICRzcmNkaXIvJHN1YmRpci9zcjIuYyB0bXBkaXIvc3IyLm9dIH0gewotICAgIHVucmVzb2x2ZWQgJHRlc3QxCi0gICAgdW5yZXNvbHZlZCAkdGVzdDIKLSAgICByZXR1cm4KLX0KLQotIyBUaGUgaTM4Ni1hb3V0IHRhcmdldCBpcyBjb25mdXNlZDogdGhlIGxpbmtlciBkb2VzIG5vdCBwdXQgdGhlCi0jIHNlY3Rpb25zIHdoZXJlIG9iamR1bXAgZmluZHMgdGhlbS4gIEkgZG9uJ3Qga25vdyB3aGljaCBpcyB3cm9uZy4KLXNldHVwX3hmYWlsICJpKjg2LSotYW91dCoiCi0KLSMgVGhlc2UgdGVzdHMgZmFpbCBvbiB0aGUgbmF0aXZlIE1JUFMgRUxGIHRhcmdldHMgYmVjYXVzZSB0aGUgR1AgdmFsdWUKLSMgaW4gdGhlIC5yZWdpbmZvIHNlY3Rpb24gaXMgbm90IHVwZGF0ZWQgd2hlbiB0aGUgUy1yZWNvcmQgdmVyc2lvbiBpcwotIyB3cml0dGVuIG91dC4gIFRoZSBtaXBzLWVsZiB0YXJnZXQgaXRzZWxmIGRvZXMgbm90IHVzZSBhIC5yZWdpbmZvIHNlY3Rpb24uCi1zZXR1cF94ZmFpbCAibWlwcyotKi1pcml4NSoiICJtaXBzKi0qLWlyaXg2KiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgZG8gdGhlIG1hZ2ljIFRPQyBoYW5kbGluZyB0aGF0IFhDT0ZGCi0jIGxpbmtlcnMgZG8uCi1zZXR1cF94ZmFpbCAiKi0qLWFpeCoiICIqLSoteGNvZmYqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBidWlsZCBBUk0vVGh1bWIgc3R1YnMuCi1zZXR1cF94ZmFpbCAiYXJtLSotY29mZiIKLXNldHVwX3hmYWlsICJzdHJvbmdhcm0tKi0qIgotc2V0dXBfeGZhaWwgImFybS0qLXBlKiIKLSMgc2V0dXBfeGZhaWwgImFybS0qZWxmKiIKLXNldHVwX3hmYWlsICJ0aHVtYi0qLWNvZmYqIgotc2V0dXBfeGZhaWwgInRodW1iLSotcGUqIgotc2V0dXBfeGZhaWwgInRodW1iLSotZWxmKiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgYnVpbGQgc3BlY2lhbCBFQUJJIHNlY3Rpb25zLgotc2V0dXBfeGZhaWwgInBvd2VycGMqLSotZWFiaSoiCi0KLSMgVGhlIFMtcmVjb3JkIGxpbmtlciBkb2Vzbid0IGluY2x1ZGUgdGhlIC57emRhfSBzZWN0aW9ucy4KLXNldHVwX3hmYWlsICJ2ODUwKi0qLWVsZiIKLQotIyBUaGUgUy1yZWNvcmQgbGlua2VyIGRvZXNuJ3QgaGFuZGxlIEFscGhhIEVsZiByZWxheGF0aW9uLgotc2V0dXBfeGZhaWwgImFscGhhKi0qLWVsZioiICJhbHBoYSotKi1saW51eC1nbnUqIiAiYWxwaGEqLSotZ251KiIKLXNldHVwX3hmYWlsICJhbHBoYSotKi1uZXRic2QqIgotCi0jIFRoZSBTLXJlY29yZCBsaW5rZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBzcGVjaWFsIFBFIGhlYWRlcnMgLSB0aGUgUEUKLSMgZW11bGF0aW9uIHRyaWVzIHRvIHdyaXRlIHBlLXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIHRoZSBQRSBoZWFkZXJzCi0jIGluIHRoZSBvdXRwdXQgYmZkLCBidXQgaXQncyBub3QgYSBQRSBiZmQgKGl0J3MgYW4gc3JlYyBiZmQpCi1zZXR1cF94ZmFpbCAiKi0qLWN5Z3dpbioiICIqLSotbWluZ3cqIiAiKi0qLXBlKiIgIiotKi13aW5udCoiCi0KLXJ1bl9zcmVjX3Rlc3QgJHRlc3QxICJ0bXBkaXIvc3IxLm8gdG1wZGlyL3NyMi5vIgotCi0jIE5vdyB0cnkgbGlua2luZyBhIEMrKyBwcm9ncmFtIHdpdGggZ2xvYmFsIGNvbnN0cnVjdG9ycyBhbmQKLSMgZGVzdHJ1Y3RvcnMuICBOb3RlIHRoYXQgc2luY2Ugd2UgYXJlIG5vdCBsaW5raW5nIGFnYWluc3QgYW55Ci0jIGxpYnJhcmllcywgdGhpcyBwcm9ncmFtIHdvbid0IGFjdHVhbGx5IHdvcmsgb3IgYW55dGhpbmcuCi0KLWlmIHsgW3doaWNoICRDWFhdID09IDAgfSB7Ci0gICAgdW50ZXN0ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLWlmICFbbGRfY29tcGlsZSAiJENYWCAkQ1hYRkxBR1MgLWZnbnUtbGlua2VyIiAkc3JjZGlyLyRzdWJkaXIvc3IzLmNjIHRtcGRpci9zcjMub10gewotICAgIHVucmVzb2x2ZWQgJHRlc3QyCi0gICAgcmV0dXJuCi19Ci0KLSMgU2VlIGFib3ZlLgotc2V0dXBfeGZhaWwgImkqODYtKi1hb3V0KiIKLXNldHVwX3hmYWlsICJtaXBzKi0qLWlyaXg1KiIgIm1pcHMqLSotaXJpeDYqIgotc2V0dXBfeGZhaWwgIiotKi1haXgqIiAiKi0qLXhjb2ZmKiIKLXNldHVwX3hmYWlsICJhcm0tKi0qIgotc2V0dXBfeGZhaWwgInN0cm9uZ2FybS0qLSoiCi1zZXR1cF94ZmFpbCAidGh1bWItKi0qIgotc2V0dXBfeGZhaWwgInBvd2VycGMqLSotZWFiaSoiCi1zZXR1cF94ZmFpbCAidjg1MCotKi1lbGYiCi1zZXR1cF94ZmFpbCAiYWxwaGEqLSotZWxmKiIgImFscGhhKi0qLWxpbnV4LWdudSoiICJhbHBoYSotKi1nbnUqIgotc2V0dXBfeGZhaWwgImFscGhhKi0qLW5ldGJzZCoiCi1zZXR1cF94ZmFpbCAiKi0qLWN5Z3dpbioiICIqLSotbWluZ3cqIiAiKi0qLXBlKiIgIiotKi13aW5udCoiCi0KLXJ1bl9zcmVjX3Rlc3QgJHRlc3QyICJ0bXBkaXIvc3IzLm8iCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jIGIvbGQvdGVzdHN1aXRlL2xkLXVuZGVmaW5lZC91bmRlZmluZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWVjNi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gdGVzdCB0aGUgbGlua2VyJ3MgcmVwb3J0aW5nIG9mIHVuZGVmaW5lZAotICAgc3ltYm9scy4gICovCi0KLWV4dGVybiBpbnQgdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCAoKTsKLQotaW50Ci1mdW5jdGlvbiAoKQotewotICByZXR1cm4gdGhpc19mdW5jdGlvbl9pc19ub3RfZGVmaW5lZCAoKTsKLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cCBiL2xkL3Rlc3RzdWl0ZS9sZC11bmRlZmluZWQvdW5kZWZpbmVkLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyNWUwMi4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdW5kZWZpbmVkL3VuZGVmaW5lZC5leHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotIyBUZXN0IHRoYXQgdGhlIGxpbmtlciByZXBvcnRzIHVuZGVmaW5lZCBzeW1ib2wgZXJyb3JzIGNvcnJlY3RseS4KLSMgQnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLSMKLSMgICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jIAotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotc2V0IHRlc3R1bmQgInVuZGVmaW5lZCIKLXNldCB0ZXN0Zm4gInVuZGVmaW5lZCBmdW5jdGlvbiIKLXNldCB0ZXN0bGluZSAidW5kZWZpbmVkIGxpbmUiCi0KLWlmIHsgW3doaWNoICRDQ10gPT0gMCB9IHsKLSAgICB2ZXJib3NlICJDb3VsZCBub3QgZmluZCBDIGNvbXBpbGVyISIgMQotICAgIHVudGVzdGVkICR0ZXN0dW5kCi0gICAgdW50ZXN0ZWQgJHRlc3RmbgotICAgIHVudGVzdGVkICR0ZXN0bGluZQotICAgIHJldHVybgotfQotCi1pZiAhW2xkX2NvbXBpbGUgIiRDQyAtZyIgJHNyY2Rpci8kc3ViZGlyL3VuZGVmaW5lZC5jIHRtcGRpci91bmRlZmluZWQub10gewotICAgIHZlcmJvc2UgIlVuYWJsZSB0byBjb21waWxlIHRlc3QgZmlsZSEiIDEKLSAgICB1bnJlc29sdmVkICR0ZXN0dW5kCi0gICAgdW5yZXNvbHZlZCAkdGVzdGZuCi0gICAgdW5yZXNvbHZlZCAkdGVzdGxpbmUKLSAgICByZXR1cm4KLX0KLQotY2F0Y2ggImV4ZWMgcm0gLWYgdG1wZGlyL3VuZGVmaW5lZCIgZXhlY19vdXRwdXQKLQotIyBVc2luZyAtZSBzdGFydCBwcmV2ZW50cyB0aGUgU3VuT1MgbGlua2VyIGZyb20gdHJ5aW5nIHRvIGJ1aWxkIGEKLSMgc2hhcmVkIGxpYnJhcnkuCi1zZW5kX2xvZyAiJGxkIC1lIHN0YXJ0IC1vIHRtcGRpci91bmRlZmluZWQgdG1wZGlyL3VuZGVmaW5lZC5vXG4iCi12ZXJib3NlICIkbGQgLWUgc3RhcnQgLW8gdG1wZGlyL3VuZGVmaW5lZCB0bXBkaXIvdW5kZWZpbmVkLm8iCi0KLWNhdGNoICJleGVjICRsZCAtZSBzdGFydCAtbyB0bXBkaXIvdW5kZWZpbmVkIHRtcGRpci91bmRlZmluZWQubyIgZXhlY19vdXRwdXQKLXNlbmRfbG9nICIkZXhlY19vdXRwdXRcbiIKLXZlcmJvc2UgIiRleGVjX291dHB1dCIKLQotcHJvYyBjaGVja3VuZCB7IHN0cmluZyB0ZXN0bmFtZSB9IHsKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiokc3RyaW5nKiIgJGV4ZWNfb3V0cHV0XSB7Ci0JcGFzcyAkdGVzdG5hbWUKLSAgICB9IGVsc2UgewotCWZhaWwgJHRlc3RuYW1lCi0gICAgfQotfQotCi1zZXQgbXUgInVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnIgotY2hlY2t1bmQgJG11ICR0ZXN0dW5kCi0KLSMgQVJNIFBFIGRlZmF1bHRzIHRvIHVzaW5nIHN0YWJzIGRlYnVnZ2luZywgd2hpY2ggd2UgY2FuJ3QgaGFuZGxlIGZvcgotIyBhIENPRkYgZmlsZS4KLSNzZXR1cF94ZmFpbCAiYXJtKi0qLXBlKiIKLSNzZXR1cF94ZmFpbCAidGh1bWIqLSotcGUqIgotCi0jIEp1c3QgZG9lc24ndCB3b3JrIGZvciBQQSBFTEYuICBObyBjbHVlIHdoeS4KLXNldHVwX3hmYWlsICJocHBhKi0qLSplbGYqIgotCi1zZXQgbWYgInRtcGRpci91bmRlZmluZWQubzogSW4gZnVuY3Rpb24gYGZ1bmN0aW9uJzoiCi1jaGVja3VuZCAkbWYgJHRlc3RmbgotCi0jIENPRkYgU0ggZ2V0cyB0aGlzIHRlc3Qgd3JvbmctLWl0IHJlcG9ydHMgbGluZSAxMCwgYmVjYXVzZSBhbHRob3VnaAotIyB0aGUganVtcCBpcyBhdCBsaW5lIDksIHRoZSBmdW5jdGlvbiBhZGRyZXNzLCBhbmQgdGhlIHJlbG9jLCBpcwotIyBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCi1zZXR1cF94ZmFpbCAic2gtKi0qIgotCi0jIEFSTSBQRSBkZWZhdWx0cyB0byB1c2luZyBzdGFicyBkZWJ1Z2dpbmcsIHdoaWNoIHdlIGNhbid0IGhhbmRsZSBmb3IKLSMgYSBDT0ZGIGZpbGUuCi0jc2V0dXBfeGZhaWwgImFybSotKi1wZSoiCi0jc2V0dXBfeGZhaWwgInRodW1iKi0qLXBlKiIKLQotIyBKdXN0IGRvZXNuJ3Qgd29yayBmb3IgUEEgRUxGLiAgTm8gY2x1ZSB3aHkuCi1zZXR1cF94ZmFpbCAiaHBwYSotKi0qZWxmKiIKLQotc2V0IG1sICJ1bmRlZmluZWQuYzo5OiB1bmRlZmluZWQgcmVmZXJlbmNlIHRvIGB0aGlzX2Z1bmN0aW9uX2lzX25vdF9kZWZpbmVkJyIKLSMgV2l0aCB0YXJnZXRzIHRoYXQgdXNlIGVsZi9kd2FyZjIsIHN1Y2ggYXMgdGhlIGFybS1lbGYgYW5kIHRodW1iLWVsZgotIyB0b29sY2hhaW5zLCB0aGUgY29kZSBpbiBiZmQvZWxmLmM6X2JmZF9lbGZfZmluZF9uZWFyZXN0X2xpbmUoKSBpcyBjYWxsZWQKLSMgaW4gb3JkZXIgdG8gbG9jYXRlIHRoZSBmaWxlIG5hbWUvbGluZSBudW1iZXIgd2hlcmUgdGhlIHVuZGVmaW5lZAotIyByZWZlcmVuY2Ugb2NjdXJzLiAgVW5mb3J0dW5hdGVseSB0aGlzIHRyaWVzIHRvIHVzZSB0aGUgZHdhcmYyIGRlYnVnCi0jIGluZm9ybWF0aW9uIGhlbGQgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uICBUaGlzIHNlY3Rpb24gY29udGFpbnMgYSBzZXJpZXMKLSMgb2YgY29tcF91bml0IHN0cnVjdHVyZXMsIGVhY2ggb2Ygd2hpY2ggaGFzIGEgbG93L2hpZ2ggYWRkcmVzcyByYW5nZQotIyByZXByZXNlbnRpbmcgdGhlIHNwYW4gb2YgbWVtb3J5IGxvY2F0aW9ucyBjb3ZlcmVkIGJ5IHRoYXQgc3RydWN0dXJlLiAgVGhlCi0jIHN0cnVjdHVyZXMgYWxzbyBpbmRleCBpbnRvIG90aGVyIHN0cnVjdHVyZXMgaGVsZCBpbiB0aGUgLmRlYnVnX2xpbmUgc2VjdGlvbgotIyBhbmQgdG9nZXRoZXIgdGhleSBjYW4gdHJhbnNsYXRlIG1lbW9yeSBsb2NhdGlvbnMgYmFjayBpbnRvIGZpbGUvZnVuY3Rpb24vbGluZQotIyBudW1iZXIgYWRkcmVzc2VzIGluIHRoZSBzb3VyY2UgY29kZS4gIFNpbmNlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5Ci0jIHJlZ2lvbiBjb3ZlcmVkIGJ5IGEgY29tcF91bml0IGlzIG9ubHkgZGV0ZXJtaW5lZCBhdCBsaW5rIHRpbWUsIHRoZSBsb3cvaGlnaAotIyBhZGRyZXNzZXMgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gYW5kIHRoZSBsaW5lIGFkZHJlc3NlcyBpbiB0aGUgLmRlYnVnX2xpbmUKLSMgc2VjdGlvbiBhcmUgY29tcHV0ZWQgYnkgZ2VuZXJhdGluZyByZWxvY3MgYWdhaW5zdCBrbm93biBzeW1ib2xzIGluIHRoZSBvYmplY3QKLSMgY29kZS4KLSMKLSMgV2hlbiB0aGUgdW5kZWZpbmVkIHJlZmVyZW5jZSBpcyBkZXRlY3RlZCwgdGhlIHJlbG9jcyBpbiB0aGUgZHdhcmYyCi0jIGRlYnVnIHNlY3Rpb25zIGhhdmUgbm90IHlldCBiZWVuIHJlc29sdmVkLCBzbyB0aGUgbG93L2hpZ2ggYWRkcmVzc2VzIGFuZCB0aGUKLSMgbGluZSBudW1iZXIgYWRkcmVzcyBhcmUgYWxsIHNldCBhdCB6ZXJvLiAgVGh1cyB3aGVuIF9iZmRfZWxmX2ZpbmRfbmVhcmVzdF9saW5lKCkKLSMgY2FsbHMgX2JmZF9kd2FyZjJfZmluZF9uZWFyZXN0X2xpbmUoKSBubyBjb21wX3VuaXQgY2FuIGJlIGZvdW5kIHdoaWNoCi0jIGFjdHVhbGx5IGNvdmVycyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgcmVmZXJlbmNlIG9jY3VyZWQsIGFuZCBzbwotIyBfYmZkX2VsZl9maW5kX25lYXJlc3RfbGluZSgpIGZhaWxzLgotIwotIyBUaGUgdXBzaG90IG9mIGFsbCBvZiB0aGlzLCBpcyB0aGF0IHRoZSBlcnJvciBtZXNzYWdlIHJlcG9ydGVkIGJ5IHRoZQotIyBsaW5rZXIsIGluc3RlYWQgb2YgaGF2aW5nIGEgc291cmNlIGZpbGUgbmFtZSAmIGxpbmUgbnVtYmVyIGFzIGluOgotIwotIyAgIHVuZGVmaW5lZC5jOjk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnCi0jCi0jIGhhcyBhbiBvYmplY3QgZmlsZSAmIHNlY3Rpb24gYWRkcmVzcyBpbnN0ZWFkOgotIwotIyAgIHVuZGVmaW5lZC4wKC50ZXh0KzB4Yyk6IHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gYHRoaXNfZnVuY3Rpb25faXNfbm90X2RlZmluZWQnCi0jCi0jIGhlbmNlIHRoZSB4ZmFpbHMgYmVsb3cuCi0KLXNldHVwX3hmYWlsIGFybS0qLWVsZgotc2V0dXBfeGZhaWwgc3Ryb25nYXJtLSotZWxmCi1zZXR1cF94ZmFpbCB0aHVtYi0qLWVsZgotc2V0dXBfeGZhaWwgbWNvcmUtKi1lbGYKLQotY2hlY2t1bmQgJG1sICR0ZXN0bGluZQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTEucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMS5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3MGQ4MC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEtMS5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90MS0yLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGRjNTkuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLTIucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEubGQgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEubGQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNWM0ZTMuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLmxkCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLU9VVFBVVF9GT1JNQVQoInNyZWMiKQotU0VDVElPTlMKLXsKLQotCi0udGV4dCAwIDogeyAqKCI5IikgKigiMTAiKSAqKCIxMSIpICooIjEyIikgKigiMTMiKSAqKCIxNCIpICooIjE1IikKLQkJKigiNyIpICooIjgiKSAqKCIwIikgKigiMSIpICooIjIiKSAqKCIzIikgKigiNCIpIH0KLS5ic3MgKE5PTE9BRCkgIDogeyAgKigiNSIpICooIjYiKSB9Ci0KLS5QQUZJICAgID0weDAwMDAwMDUwIDsKLS5QQ0hJTyAgID0weDAwMDAwMEQwIDsKLS5QQ0xPICAgID0weDAwMDAwMDU0IDsKLS5QQ1ZCU1YgID0weDAwMDAwMDBFIDsKLS5QQ1ZUU1UgID0weDAwMDAwMDEyIDsKLS5QQ1ZUU1YgID0weDAwMDAwMDE2IDsKLS5QQ1ZUU1ZMID0weDAwMDAwMDFBIDsKLS5QQ1ZUVVMgID0weDAwMDAwMDFFIDsKLS5QRElTICAgID0weDAwMDAwMDIyIDsKLS5QRElTTCAgID0weDAwMDAwMDI2IDsKLS5QRFZKICAgID0weDAwMDAwMDJBIDsKLS5QRUlPICAgID0weDAwMDAwMENDIDsKLS5QRU9GICAgID0weDAwMDAwMDU4IDsKLS5QRU9MICAgID0weDAwMDAwMDVDIDsKLS5QRVFVUyAgID0weDAwMDAwMDJFIDsKLS5QRVFVViAgID0weDAwMDAwMDMyIDsKLS5QRVFVVkwgID0weDAwMDAwMDM2IDsKLS5QRVFVVyAgID0weDAwMDAwMERFIDsKLS5QR0NNICAgID0weDAwMDAwMDY0IDsKLS5QR0VRUyAgID0weDAwMDAwMDNBIDsKLS5QR0VRViAgID0weDAwMDAwMDNFIDsKLS5QR0VRVkwgID0weDAwMDAwMDQyIDsKLS5QR0VUICAgID0weDAwMDAwMDYwIDsKLS5QR1JUUyAgID0weDAwMDAwMDQ2IDsKLS5QR1JUViAgID0weDAwMDAwMDRBIDsKLS5QR1JUVkwgID0weDAwMDAwMDRFIDsKLS5QSUFDVCAgID0weDAwMDAwMDZDIDsKLS5QSUZEICAgID0weDAwMDAwMDY4IDsKLS5QSU5EUyAgID0weDAwMDAwMDUyIDsKLS5QSU5EViAgID0weDAwMDAwMDU2IDsKLS5QSU5EVkwgID0weDAwMDAwMDVBIDsKLS5QSU5EVyAgID0weDAwMDAwMEQ2IDsKLS5QTERDUyAgID0weDAwMDAwMDVFIDsKLS5QTERDViAgID0weDAwMDAwMDYyIDsKLS5QTEVRUyAgID0weDAwMDAwMDY2IDsKLS5QTEVRViAgID0weDAwMDAwMDZBIDsKLS5QTEVRVkwgID0weDAwMDAwMDZFIDsKLS5QTEVTUyAgID0weDAwMDAwMDcyIDsKLS5QTEVTViAgID0weDAwMDAwMDc2IDsKLS5QTEVTVkwgID0weDAwMDAwMDdBIDsKLS5QTE9EUyAgID0weDAwMDAwMDdFIDsKLS5QTE9EViAgID0weDAwMDAwMDgyIDsKLS5QTE9EVkwgID0weDAwMDAwMDg2IDsKLS5QTU9ESiAgID0weDAwMDAwMDhBIDsKLS5QTU9WICAgID0weDAwMDAwMEUyIDsKLS5QTVBKICAgID0weDAwMDAwMDhFIDsKLS5QTkVRUyAgID0weDAwMDAwMDkyIDsKLS5QTkVRViAgID0weDAwMDAwMDk2IDsKLS5QTkVRVkwgID0weDAwMDAwMDlBIDsKLS5QTkVRVyAgID0weDAwMDAwMERBIDsKLS5QUEFHRSAgID0weDAwMDAwMEQ0IDsKLS5QUEVFICAgID0weDAwMDAwMDcwIDsKLS5QUFVUICAgID0weDAwMDAwMDc0IDsKLS5QUkRCICAgID0weDAwMDAwMDc4IDsKLS5QUkRDICAgID0weDAwMDAwMDdDIDsKLS5QUkRIICAgID0weDAwMDAwMDgwIDsKLS5QUkRJICAgID0weDAwMDAwMDg0IDsKLS5QUkRKICAgID0weDAwMDAwMDg4IDsKLS5QUkRSUyAgID0weDAwMDAwMEM4IDsKLS5QUkRTICAgID0weDAwMDAwMDhDIDsKLS5QUkRWICAgID0weDAwMDAwMDkwIDsKLS5QUkxOICAgID0weDAwMDAwMDk0IDsKLS5QUlJBTiAgID0weDAwMDAwMDk4IDsKLS5QUlNUICAgID0weDAwMDAwMDlDIDsKLS5QUldUICAgID0weDAwMDAwMEEwIDsKLS5QU0NPTiAgID0weDAwMDAwMDlFIDsKLS5QU0NPUCAgID0weDAwMDAwMEEyIDsKLS5QU0RFTCAgID0weDAwMDAwMEE2IDsKLS5QU0lOUyAgID0weDAwMDAwMEFBIDsKLS5QU0xFTiAgID0weDAwMDAwMEFFIDsKLS5QU1BPUyAgID0weDAwMDAwMEIyIDsKLS5QU1RDViAgID0weDAwMDAwMEI2IDsKLS5QU1RDVkwgID0weDAwMDAwMEJBIDsKLS5QU1RPUyAgID0weDAwMDAwMEJFIDsKLS5QU1RPViAgID0weDAwMDAwMEMyIDsKLS5QU1RPVkwgID0weDAwMDAwMEM2IDsKLS5QU1RSUyAgID0weDAwMDAwMENBIDsKLS5QU1RSViAgID0weDAwMDAwMENFIDsKLS5QU1RSVkwgID0weDAwMDAwMEQyIDsKLS5QV0xOICAgID0weDAwMDAwMEE0IDsKLS5QV1JBTiAgID0weDAwMDAwMEE4IDsKLS5QV1JCICAgID0weDAwMDAwMEFDIDsKLS5QV1JDICAgID0weDAwMDAwMEIwIDsKLS5QV1JIICAgID0weDAwMDAwMEI0IDsKLS5QV1JJICAgID0weDAwMDAwMEI4IDsKLS5QV1JKICAgID0weDAwMDAwMEJDIDsKLS5QV1JTICAgID0weDAwMDAwMEMwIDsKLS5QV1JWICAgID0weDAwMDAwMEM0IDsKLQotLyoKLS5QQUZJPTB4ICAgPSAweDAwOwotLlBDSElPICAgPTB4IDB4MDAwMDAwOwotLlBDTE8gICAgPTB4IDY0IDsKLS5QQzsKLS5QQ1ZUU1UgID0weCAweDAwMDAwMDsKLS5QQ1ZUU1YgID0weCAweDAwMDAwMDsKLS5QQ1ZUU1ZMID0weCAweDAwMDAwMDsKLS5QQ1ZUVVMgID0weCAxNTggOwotLlA7Ci0uUERJU0wgICA9MHggMHgwMDAwMDA7Ci0uUERWSiAgICA9MHggMHgwMDAwMDA7Ci0uUEVJTyAgICA9MHggMHgwMDAwMDA7Ci0uUEVPRiAgICA9MHggMHgwMDAwMDA7Ci0uUEVPTCAgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVMgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVYgICA9MHggMHgwMDAwMDA7Ci0uUEVRVVZMICA9MHggMHgwMDAwMDA7Ci0uUEVRVVcgICA9MHggMHgwMDAwMDA7Ci0uUEdDTSAgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVMgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVYgICA9MHggMHgwMDAwMDA7Ci0uUEdFUVZMICA9MHggMHgwMDAwMDA7Ci0uUEdFVCAgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFMgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFYgICA9MHggMHgwMDAwMDA7Ci0uUEdSVFZMICA9MHggMHgwMDAwMDA7Ci0uUElBQ1QgICA9MHggMHgwMDAwMDA7Ci0uUElGRCAgICA9MHggMTI2IDsKLS5QOwotLlBJTkRWICAgPTB4IDB4MDAwMDAwOwotLlBJTkRWTCAgPTB4IDB4MDAwMDAwOwotLlBJTkRXICAgPTB4IDB4MDAwMDAwOwotLlBMRENTICAgPTB4IDB4MDAwMDAwOwotLlBMRENWICAgPTB4IDB4MDAwMDAwOwotLlBMRVFTICAgPTB4IDB4MDAwMDAwOwotLlBMRVFWICAgPTB4IDB4MDAwMDAwOwotLlBMRVFWTCAgPTB4IDB4MDAwMDAwOwotLlBMRVNTICAgPTB4IDB4MDAwMDAwOwotLlBMRVNWICAgPTB4IDB4MDAwMDAwOwotLlBMRVNWTCAgPTB4IDB4MDAwMDAwOwotLlBMT0RTICAgPTB4IDB4MDAwMDAwOwotLlBMT0RWICAgPTB4IDB4MDAwMDAwOwotLlBMT0RWTCAgPTB4IDB4MDAwMDAwOwotLlBNT0RKICAgPTB4IDB4MDAwMDAwOwotLlBNT1YgICAgPTB4IDB4MDAwMDAwOwotLlBNUEogICAgPTB4IDB4MDAwMDAwOwotLlBORVFTICAgPTB4IDB4MDAwMDAwOwotLlBORVFWICAgPTB4IDB4MDAwMDAwOwotLlBORVFWTCAgPTB4IDB4MDAwMDAwOwotLlBORVFXICAgPTB4IDB4MDAwMDAwOwotLlBQQUdFICAgPTB4IDB4MDAwMDAwOwotLlBQRUUgICAgPTB4IDB4MDAwMDAwOwotLlBQVVQgICAgPTB4IDB4MDAwMDAwOwotLlBSREIgICAgPTB4IDB4MDAwMDAwOwotLlBSREMgICAgPTB4IDB4MDAwMDAwOwotLlBSREggICAgPTB4IDB4MDAwMDAwOwotLlBSREkgICAgPTB4IDB4MDAwMDAwOwotLlBSREogICAgPTB4IDB4MDAwMDAwOwotLlBSRFJTICAgPTB4IDB4MDAwMDAwOwotLlBSRFMgICAgPTB4IDB4MDAwMDAwOwotLlBSRFYgICAgPTB4IDB4MDAwMDAwOwotLlBSTE4gICAgPTB4IDB4MDAwMDAwOwotLlBSUkFOICAgPTB4IDB4MDAwMDAwOwotLlBSU1QgICAgPTB4IDB4MDAwMDAwOwotLlBSV1QgICAgPTB4IDB4MDAwMDAwOwotLlBTQ09OICAgPTB4IDB4MDAwMDAwOwotLlBTQ09QICAgPTB4IDB4MDAwMDAwOwotLlBTREVMICAgPTB4IDB4MDAwMDAwOwotLlBTSU5TICAgPTB4IDB4MDAwMDAwOwotLlBTTEVOICAgPTB4IDB4MDAwMDAwOwotLlBTUE9TICAgPTB4IDB4MDAwMDAwOwotLlBTVENWICAgPTB4IDB4MDAwMDAwOwotLlBTVENWTCAgPTB4IDB4MDAwMDAwOwotLlBTVE9TICAgPTB4IDB4MDAwMDAwOwotLlBTVE9WICAgPTB4IDB4MDAwMDAwOwotLlBTVE9WTCAgPTB4IDB4MDAwMDAwOwotLlBTVFJTICAgPTB4IDB4MDAwMDAwOwotLlBTVFJWICAgPTB4IDB4MDAwMDAwOwotLlBTVFJWTCAgPTB4IDB4MDAwMDAwOwotLlBXTE4gICAgPTB4IDB4MDAwMDAwOwotLlBXUkFOICAgPTB4IDB4MDAwMDAwOwotLlBXUkIgICAgPTB4IDB4MDAwMDAwOwotLlBXUkMgICAgPTB4IDB4MDAwMDAwOwotLlBXUkggICAgPTB4IDB4MDAwMDAwOwotLlBXUkkgICAgPTB4IDB4MDAwMDAwOwotLlBXUkogICAgPTB4IDB4MDAwMDAwOwotLlBXUlMgICAgPTB4IDB4MDAwMDAwOwotLlBXUlYgICAgPTB4IDB4MDAwMDAwOwotCi0qLwotLyoKLS5QPTB4ICAgICAgPSAwOwotLlBDSElPICAgPTB4IDB4ZmVlZGZhOwotLlBDTE8gICAgPTB4IDB4ZmVlZGZhOwotLlBDVkJTViAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTVSAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTViAgPTB4IDB4ZmVlZGZhOwotLlBDVlRTVkwgPTB4IDB4ZmVlZGZhOwotLlBDVlRVUyAgPTB4IDB4ZmVlZGZhOwotLlBESVMgICAgPTB4IDB4ZmVlZGZhOwotLlBESVNMICAgPTB4IDB4ZmVlZGZhOwotLlBEVkogICAgPTB4IDB4ZmVlZGZhOwotLlBFSU8gICAgPTB4IDB4ZmVlZGZhOwotLlBFT0YgICAgPTB4IDB4ZmVlZGZhOwotLlBFT0wgICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVTICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVWICAgPTB4IDB4ZmVlZGZhOwotLlBFUVVWTCAgPTB4IDB4ZmVlZGZhOwotLlBFUVVXICAgPTB4IDB4ZmVlZGZhOwotLlBHQ00gICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFTICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFWICAgPTB4IDB4ZmVlZGZhOwotLlBHRVFWTCAgPTB4IDB4ZmVlZGZhOwotLlBHRVQgICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRTICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRWICAgPTB4IDB4ZmVlZGZhOwotLlBHUlRWTCAgPTB4IDB4ZmVlZGZhOwotLlBJQUNUICAgPTB4IDB4ZmVlZGZhOwotLlBJRkQgICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRTICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRWICAgPTB4IDB4ZmVlZGZhOwotLlBJTkRWTCAgPTB4IDB4ZmVlZGZhOwotLlBJTkRXICAgPTB4IDB4ZmVlZGZhOwotLlBMRENTICAgPTB4IDB4ZmVlZGZhOwotLlBMRENWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFTICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVFWTCAgPTB4IDB4ZmVlZGZhOwotLlBMRVNTICAgPTB4IDB4ZmVlZGZhOwotLlBMRVNWICAgPTB4IDB4ZmVlZGZhOwotLlBMRVNWTCAgPTB4IDB4ZmVlZGZhOwotLlBMT0RTICAgPTB4IDB4ZmVlZGZhOwotLlBMT0RWICAgPTB4IDB4ZmVlZGZhOwotLlBMT0RWTCAgPTB4IDB4ZmVlZGZhOwotLlBNT0RKICAgPTB4IDB4ZmVlZGZhOwotLlBNT1YgICAgPTB4IDB4ZmVlZGZhOwotLlBNUEogICAgPTB4IDB4ZmVlZGZhOwotLlBORVFTICAgPTB4IDB4ZmVlZGZhOwotLlBORVFWICAgPTB4IDB4ZmVlZGZhOwotLlBORVFWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUE5FUVcgICAgID0gMHhmZWVkZmFjZTsKLS5QUEFHRSAgICAgPSAweGZlZWRmYWNlOwotLlBQRUUgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBVVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRCICAgICAgPSAweGZlZWRmYWNlOwotLlBSREMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRJICAgICAgPSAweGZlZWRmYWNlOwotLlBSREogICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEUlMgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRTICAgICAgPSAweGZlZWRmYWNlOwotLlBSRFYgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJMTiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUlJBTiAgICAgPSAweGZlZWRmYWNlOwotLlBSU1QgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJXVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QU0NPTiAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09QICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNERUwgICAgID0gMHhmZWVkZmFjZTsKLS5QU0lOUyAgICAgPSAweGZlZWRmYWNlOwotLlBTTEVOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNQT1MgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RDViAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1MgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPViAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlMgICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSViAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWTCAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdMTiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JBTiAgICAgPSAweGZlZWRmYWNlOwotLlBXUkIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JIICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JTICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlYgICAgICA9IDB4ZmVlZGZhY2U7Ci0qLwotCi19CmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEub29rIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QxLm9vawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4NGI5NC4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDEub29rCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLVMwMEMwMDAwNzQzMTJFNkY3NTc0MkU2RjZCQzANCi1TMTE4MDAwMDAwMDAwQTIwNTM0MTQ2NDU1MzU0NEY1MjQ1MjA0MTIwMjAyMDIwMjA1MkJFDQotUzExODAwMTUzMTMzMkUzMzIwMjAyMDIwMjAyMDIwNTIzMTMzMkUzMjIwMjAyMDIwMjA3Nw0KLVMxMTgwMDJBMjAyMDAwQjVFODY2MDBCNUU5QjExREExNUI5OTAwMDAxRjAwMDAwMDBBNTANCi1TMTE4MDAzRjY0MDAwMDAwM0UwMDAwMDA1QzAwQTgwMEJBMDBGMDAwMDQwMDAxMDAwMjUxDQotUzExODAwNTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwMDQwMzFDRjUyNTQ0QzQ5NDJEMA0KLVMxMTgwMDY5NDM0RjRFMDAwNEU1RUM1MjU0NEM0OTQyNDM0RjRFMDAwNEU1RUQ1MjU0RjANCi1TMTE4MDA3RTRDNDk0MjQzNEY0RTAwNDAzMUQyNTI1NDRDNDk0MjQzNEY0RTAwMDAwQTA4DQotUzExODAwOTM3RDUyNTQ0QzQ5NDI1MzU0NTIwMDEwQTRBODUyNTQ0QzQ5NDI0NjQ5NENBRA0KLVMxMTgwMEE4MDAwMjAwQjVFODZEMDAwMDAxNjAwMEI1RTg3MzAwMDAwMjU0MDAwMjAwNkENCi1TMTE4MDBCREI1RTkzNzUzNDE0NjQ1NTA1MjQ5NEU1NDIwMDAwMDA2MDAwMjAwMDgwMDc5DQotUzExODAwRDIwMDAwMDM0MjAwQjVFODZFNDk0RTQ5NTQ1MzQxNDY0NTUzNTQwMDAwMDJDOQ0KLVMxMTgwMEU3MTgwMDAwMEUwMDAwMDAwOTAyMDAzMDAwMDAwMDAwNEU1NkZGRDhCQThGREINCi1TMTE4MDBGQzYzMDYyRTRFNjEwMDAwMTY0MUZBMDAzMjQzRUVGRkQ4NzAyNjEyRDg1MTQ5DQotUzExODAxMTFDOEZGRkM0RTVFNEU3NTJCNTdGRkYyMkYzQzAwMDAwMDBBNjAwMDAwMDI1OQ0KLVMxMTgwMTI2M0I2RjAwMDJGRkY2MkYyRDAwMzgyRjJEMDAzNDRFNEM0RTRBNDM0RjUwRTcNCi1TMTE4MDEzQjU5NTI0OTQ3NDg1NDIwNTQ2NTZDNjU2NjZGNkUyMDQxNDIyMDRDMjA0RDZCDQotUzExODAxNTAyMDQ1NzI2OTYzNzM3MzZGNkUyQzIwMzEzOTM5MzMwMDRFNTZGRkZDQkFCNQ0KLVMxMTgwMTY1OEY2MzA0MkU0RTYxQUMyMDJFMDAwQzA2ODAwMDAwMDAwQzRFNzY1NjgwN0MNCi1TMTE4MDE3QTRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDAwMEIwMkQ0MEZGRkMyMDBCDQotUzExODAxOEY2QzAwM0EyMjA4MjQyQzAwMzY5NDgxNEU3NjA0ODIwMDAwMDAwQzRFNzZEMg0KLVMxMTgwMUE0NEFENTY2MDQ2MTAwMDA4RUIwODI2RTBDMENBRTAwMDAwMDAxMDAwQzZDRUINCi1TMTE4MDFCOTAwMDAwQzIwN0MwMDAwMDAwMDYxMDAwMDYwMjA2QzAwM0EyMDA4NjYwNDZDDQotUzExODAxQ0U2MTAwMDA3NjIyMDhEMkFFRkZGQzY4MDQ2MTAwMDA1QzIwODEyMTZFMDA0Mw0KLVMxMTgwMUUzMTAwMDA0MjE2RTAwMEMwMDA4MjIwODA2ODEwMDAwMDAwQzY4MDQ2MTAwQzINCi1TMTE4MDFGODAwNDAyRDQxMDAxNDI5NTAwMDNBMjA2QzAwM0EyNDA4NjYwNDYxMDAwMEJDDQotUzExODAyMEQzQTQyOTA0MkE4MDAwNDQyQTgwMDA4NEU1RTIyNUYyODVGNTA4RjRFRTkyMg0KLVMxMTgwMjIyMDAwMjJCNUZGRkYyNEU1RUQxREYyODVGMkYwODJCNDhGRkYyRDBEMDRFREENCi1TMTE4MDIzN0QwMkI1N0ZGRjIyRjNDMDAwMDAwMEU2MDAwRkVFMjJCNTdGRkYyMkYzQ0Q0DQotUzExODAyNEMwMDAwMDAxMDYwMDBGRUQ0NEU1NkZGRkNCQThGNjMwNjJFNEU2MTAwRkUyQg0KLVMxMTgwMjYxQjgyRDZDMDAzMkZGRkM2MDAwMDAxMjJCNUZGRkYyNEZFRUZGRkM0MkFFRjENCi1TMTE4MDI3NkZGRkM2MDAwMDA4MjRBQUVGRkZDNjcwMDAwN0EyMDZFRkZGQzIwMDg2NkE3DQotUzExODAyOEIwMDAwMDQ2MUI2MjIyODAwMDRCMkFFMDAxMDY3MDAwMDYyMjIwODAyODEwQg0KLVMxMTgwMkEwMDAwMDAwMDM0QTgxNjY0MDIyMDgyMjZDMDAzQTI0MDlCMjgyNkUzNDI2QjYNCi1TMTE4MDJCNTEwMjgwODA2ODQwMDAwMDAwQzY4MDQ2MTAwRkY3NkI2ODQ2RDIwMjYxMDFCDQotUzExODAyQ0EyODA4OTY4NDRFNzYwNDgzMDAwMDAwMEM0RTc2NEFENTY2MDQ2MTAwRkZDRA0KLVMxMTgwMkRGNUFCNkE4MDAwODZDMDAwMDA0NjE4MjIwNkVGRkZDMjAwODY2MDQ2MTAwNzcNCi1TMTE4MDJGNEZGNTIyRDUwRkZGQzYwODA0QUFFRkZGQzY3MDAwMDJDMjA2RUZGRkMyMDE5DQotUzExODAzMDkwODY2MDQ2MTAwRkYzODIyNkUwMDBDMjJBODAwMDgyMjA4MDY4MTAwMDBCMg0KLVMxMTgwMzFFMDAwQzY4MDQ2MTAwRkYxNDJENDEwMDE0NjAwMDAwMEMyMDZFMDAwQzQyMTANCi1TMTE4MDMzMzkwNDJBRTAwMTQ0RTVFMjA1RjI4NUY1MDhGNEVEMDRGRURGRjAwNzA3RjQ0DQotUzExODAzNDgyMDRGNDI1ODUxQzhGRkZDNDg2REZGMDgxRjNDMDAwNDNGM0MwMDAxOUY0OQ0KLVMxMTgwMzVERkMwMDAwMDAwQzIyNEY0NUZBMDRGRTIyREEyMkRBMjJEQTI2NkMwMDI4MUYNCi1TMTE4MDM3MjJGMEMyODZDMDAyQzRFQUIwMDY4NDg2REZGQjg0ODZERkZCNDJGMEMyMEU3DQotUzExODAzODc2QzAwMDAyODZDMDAwNDRFOTA5RkZDMDAwMDAwNTIyRjJERkZDNjJGMEMzMg0KLVMxMTgwMzlDMjA2QzAwMDgyODZDMDAwQzRFOTA3MDUyMjY2QzAwMjA0RUFCMDAxRTQxNkENCi1TMTE4MDNCMUZBMDRCRTI2NkMwMDIwNEVBQjAwN0UyNjZDMDAyMDRFQUIwMDlFNDFFREQ3DQotUzExODAzQzZGRkJBMjY2QzAwMjA0RUFCMDA3RTI2NkMwMDIwNEVBQjAwOUUxRjNDMDA5OA0KLVMxMTgwM0RCMjgzRjNDMDAwMTI2NkMwMDIwNEVBQjAwOUU5RkZDMDAwMDAwNTIzMDJERDINCi1TMTE4MDNGMEZGQ0E0OEMwMkYwMDJGMEMyMDZDMDAwODI4NkMwMDBDNEU5MDcwNTIyNkJGDQotUzExODA0MDU2QzAwMjA0RUFCMDAxRTI2NkMwMDIwNEVBQjAwOUU0MUZBMDQ1RTI2NkNDMw0KLVMxMTgwNDFBMDAyMDRFQUIwMDdFMjY2QzAwMjA0RUFCMDA5RTQxRURGRjlFNzAxNjI2NzINCi1TMTE4MDQyRjZDMDAyMDRFQUIwMENBNjAwMDAwMTYyQjVGRkZGMjRGRURGRjAwMkI3QzkyDQotUzExODA0NDQwMDAwMDAwMUZGQjQ2MDAwMDNFNDQ4NkRGRjA4OUZGQzAwMDAwMDUyMjBEQg0KLVMxMTgwNDU5NEY0M0VERkY5RTMwMTk3MjUwOTI0MDZGMDI0MjQxRDA0MTMwQzA2RjBBMjMNCi1TMTE4MDQ2RTUzNDBFMjQwMzBEOTUxQzhGRkZDOUZGQzAwMDAwMDUyMjI0RjQ1RkEwMzAzDQotUzExODA0ODNGNjMyREEyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDUwRkZBQTQ4NkQwMg0KLVMxMTgwNDk4RkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTBGRjk2NDJBREZGNzMNCi1TMTE4MDRBRDAwMkI2QzAwMzJGRjA0NDg3QTAzQzQzRjNDRkZGRjQ4NkRGRjA4MjY2QzFBDQotUzExODA0QzIwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQzBGRjcwNDg2REZGMDgyNjZDMDA4OA0KLVMxMTgwNEQ3MjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZGNUM2MDAwMDA3ODJCNUZGRkYyOUUNCi1TMTE4MDRFQzRGRURGRjAwNDg3QTAzQkEzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjFGDQotUzExODA1MDEwQzI4NkMwMDJDNEVBQjAwQzBGRjM0OUZGQzAwMDAwMDUyMjA2REZGMDRBQw0KLVMxMTgwNTE2MjAwODJGMDAyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGM0YzQ0ZGNjANCi1TMTE4MDUyQkZGNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkYwMDhGDQotUzExODA1NDBERkZDMDAwMDAwNTI0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVCNg0KLVMxMTgwNTU1QUIwMEE0RkVFNjYwMDAwMUYwMjA2REZGMDQyMDA4NjYwMjYxODA0QTkwMkUNCi1TMTE4MDU2QTY3MDAwMTZBMjIxMDAyODEwMDAwMDAwMzRBODE2NjRBMjIxMDI0MkMwMEYxDQotUzExODA1N0YzNjA0ODIwMDAwMDAwQzY4MDQ2MTAwRkNBRUIyODI2RTM0MjIxMDI0MDhGMA0KLVMxMTgwNTk0MDY4MjAwMDAwMDBDNjgwNDYxMDBGQzlBQjI4MjZEMjAyMjEwMjQwODkyQTYNCi1TMTE4MDVBOTgyNEU3NjA0ODEwMDAwMDAwQzRFNzY0QUQ1NjYwNDYxMDBGQzdFQjJBOEUwDQotUzExODA1QkUwMDA4NkMwMDAwMDY2MTAwRkYyMjIwNkRGRjA0MjAwODY2MDQ2MTAwRkZBNg0KLVMxMTgwNUQzMTYyMjI4MDAwOEQyQURGRjAwNjgwNDYxMDBGQzU4MkI0MUZGMDA5RkZDMDINCi1TMTE4MDVFODAwMDAwMDUyMjQwODJGMDIyRjBDMjA2QzAwMTAyODZDMDAxNDRFOTAyRkJGDQotUzExODA1RkQwRjNGM0MwMDBDNDg2REZGMDgyNjZDMDAyODJGMEMyODZDMDAyQzRFQUJFNQ0KLVMxMTgwNjEyMDBDMEZFMkFERkZDMDAwMDAwNTIyMDZERkYwNDIwMDg2NjA0NjEwMEZFMzkNCi1TMTE4MDYyN0MyMkYyODAwMDQzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2Q0QxDQotUzExODA2M0MwMDJDNEVBQjAwQkNGREZDMjA2REZGMDQyMDA4NjYwNDYxMDBGRTlBMkY4MQ0KLVMxMTgwNjUxMjgwMDA4M0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNjgNCi1TMTE4MDY2NjRFQUIwMEJDRkRENDlGRkMwMDAwMDA1MjIwNkRGRjA0MjAwODY2MDQ2MTg1DQotUzExODA2N0IwMEZFNkMyMjEwMkYwMTJGMEMyMDZDMDAxMDI4NkMwMDE0NEU5MDJGMEZGRg0KLVMxMTgwNjkwM0YzQzAwMEM0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNjANCi1TMTE4MDZBNUMwRkQ5OERGRkMwMDAwMDA1MjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2Qzc1DQotUzExODA2QkEwMDJDNEVBQjAwQTRGRDdFMjA2REZGMDQyMDA4NjYwNDYxMDBGRTFDMkIxQg0KLVMxMTgwNkNGNTBGRjA0NjAwMEZFOEEyMDZDMDAzQUIxRURGRjA0NjcwMDAwNkM0ODdBREINCi1TMTE4MDZFNDAxRTgzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RURDDQotUzExODA2RjlBQjAwQzBGRDQyOUZGQzAwMDAwMDUyMjA2REZGMDQyMDA4MkYwMDJGMEMyRg0KLVMxMTgwNzBFMjA2QzAwMTAyODZDMDAxNDRFOTAyRjBGM0YzQ0ZGRkY0ODZERkYwODI2MTcNCi1TMTE4MDcyMzZDMDAyODJGMEMyODZDMDAyQzRFQUIwMEMwRkQwRURGRkMwMDAwMDA1MjNEDQotUzExODA3Mzg0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQTRGQ0Y0NDg2Mg0KLVMxMTgwNzREN0EwMTk4M0YzQ0ZGRkY0ODZERkYwODI2NkMwMDI4MkYwQzI4NkMwMDJDOTYNCi1TMTE4MDc2MjRFQUIwMEMwRkNEODQ4NkRGRjA4MjY2QzAwMjgyRjBDMjg2QzAwMkM0RTMyDQotUzExODA3NzdBQjAwQTRGQ0M0NDg3QTAxNkEzRjNDRkZGRjQ4NkRGRjA4MjY2QzAwMjgzRQ0KLVMxMTgwNzhDMkYwQzI4NkMwMDJDNEVBQjAwQzBGQ0E4NDg2REZGMDgyNjZDMDAyODJGNTcNCi1TMTE4MDdBMTBDMjg2QzAwMkM0RUFCMDBBNEZDOTQyMDZERkYwNDIwMDgwNjgwMDAwMDA4DQotUzExODA3QjYwMDE4NEU3NjIyMkMwMDM2OTI4MDRFNzYwMjgxRkZGRkZGRkM0QUQ1NjZGMw0KLVMxMTgwN0NCMDQ2MTAwRkE2QTJGMDEzRjNDMDAwQzQ4NkRGRjA4MjY2QzAwMjgyRjBDRTQNCi1TMTE4MDdFMDI4NkMwMDJDNEVBQjAwQkNGQzU2MkYyREZGMDAzRjNDMDAwQzQ4NkRGRkEzDQotUzExODA3RjUwODI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwQkNGQzNBNDg2REZGMDg4Nw0KLVMxMTgwODBBMjY2QzAwMjgyRjBDMjg2QzAwMkM0RUFCMDBBNEZDMjY0ODZERkYwODFGODYNCi1TMTE4MDgxRjNDMDAwMTI2NkMwMDI4MkYwQzI4NkMwMDJDNEVBQjAwNTQ0ODZERkZCODE1DQotUzExODA4MzQ0ODZERkZCNDJGMEMyMDZDMDAxODI4NkMwMDFDNEU5MDQ4NkRGRjA4NDJEOA0KLVMxMTgwODQ5MjcyNjZDMDAyODJGMEMyODZDMDAyQzRFQUIwMDU0NDJBNzJGMkQwMDM4RjANCi1TMTE4MDg1RTJGMkQwMDM0NEU0QTAwMEE0NjMxMjAyMDIwMjAyMDIwMjAyMDAwMDIzQTlDDQotUzExODA4NzMzQTAwMDIyOTNBMDAwMDAwMzAyMDIwMjAyMDIwNDE2NDY0NzI2NTczNzMzNw0KLVMxMTgwODg4MjAyMDIwMjA0OTY0NjU2RTc0Njk3NDc5MjAyMDIwMjAyMDIwMjAyMDUzM0ENCi1TMTE4MDg5RDY5N0E2NTIwMjAyMDIwMjAyMDIwMjA0RTY1Nzg3NDAwMUQ0OTZFNzY2MUIwDQotUzExODA4QjI2QzY5NjQyMDczNjU2NzZENjU2RTc0MjA3Mzc0NjE3Mjc0Njk2RTY3MjAzNQ0KLVMxMTgwOEM3NjE3NDNBMjAyMDAwMTg1MzY1Njc2RDY1NkU3NDIwNkM2OTczNzQyMDYzN0YNCi1TMTE4MDhEQzZGNzI3Mjc1NzA3NDY1NjQzQTIwMDAwMDAwMTgyMDIwMjA0MTc2NjE2OTNCDQotUzExODA4RjE2QzYxNjI2QzY1MjAyMDIwMjAyMDIwMjAyMDU1NzM2NTY0NEZFREZGRjIzMA0KLVMxMTgwOTA2OUZGQzAwMDAwMDBBNjEwMDAxNTY0MUVDMDAzMDIwREYyMERGMzBERjIwRjENCi1TMTE4MDkxQjJDMDAzMjU2ODA0RTc2MDI4MEZGRkZGRkZDNEFENTY2MDQ2MTAwRjkwQTYzDQotUzExODA5MzAyOTQwMDAzMjI5NDAwMDNBNjAwMDAwM0UyQjVGRkZGMjRGRURGRkYyMjAwQQ0KLVMxMTgwOTQ1MkMwMDMyNTY4MDRFNzYwMjgwRkZGRkZGRkM0QUQ1NjYwNDYxMDBGOEUwNjQNCi1TMTE4MDk1QTI5NDAwMDNBMjA2QzAwM0EyMjA4NjYwNDYxMDBGOERFNDI5MDQyQTgwMDk0DQotUzExODA5NkYwNDQyQTgwMDA4NjAwMDAwOUU0QTJDMDAzMDY3MDAwMDFBMjA2QzAwM0E4RQ0KLVMxMTgwOTg0MjAwODY2MDI2MUIyNDI5MDQyQTgwMDA0NDJBODAwMDg2MDAwMDA3RTIwMDcNCi1TMTE4MDk5OTZDMDAzQTIwMDg2NjAyNjE5QTRBOTA2NzAwMDA2RTIyMTAwMjgxMDAwMEIwDQotUzExODA5QUUwMDAzNEE4MTY2NEEyMjEwMjQyQzAwMzYwNDgyMDAwMDAwMEM2ODA0NjE5Qg0KLVMxMTgwOUMzMDBGODc0QjI4MjZFMzQyMjEwMjQwODA2ODIwMDAwMDAwQzY4MDQ2MTAwMUENCi1TMTE4MDlEOEY4NjBCMjgyNkQyMDIyMTAyNDA4OTI4MjRFNzYwNDgxMDAwMDAwMEM0RUQ4DQotUzExODA5RUQ3NjRBRDU2NjA0NjEwMEY4NDRCMkE4MDAwODZDMDAwMDA2NjEwMEZGM0NFNQ0KLVMxMTgwQTAyMjA2QzAwM0EyMDA4NjYwNDYxMDBGRjMwMjk1MDAwM0E2MDg0NDJBNzJGNDQNCi1TMTE4MEExNzJEMDAzODJGMkQwMDM0NEU0QTRFNTYwMDAwNTE4RjQyQTcxRjNDMDAwRTYzDQotUzExODBBMkM0MjY3NDg3QTAwMTI0MjY3NDIyNzJGM0MwMEI1RTg2RTRFNDkwMDBFNTBCNw0KLVMxMTgwQTQxOEY0RTVFMjA1RjI4NUY0RUU4MDAwMjIwN0MwMDAwMDAwMDYwMDQyQjVGOTkNCi1TMTE4MEE1NkZGRjI0RTVFRDFERjI4NUYyRjA4RDBEMDRFRDA0M0ZBMDAwNEQzRkMwMEFFDQotUzExODBBNkIwMjcwNEUyRjQ5MDAwQTQzRkEwMDA0RDNGQzAwMDAwMDQwMkY0OTAwMDY2Mg0KLVMxMTgwQTgwNDFGQTAwMDREMUZDRkZGRkY1N0EyMDI4MDA1NjY2MDAwMDIyMjIwOTkyMDENCi1TMTE4MEE5NTg4MjE0MTAwNTY0MjgxMjQ0OEQyNUFCNUM5NkRGQTQ0NDFEMzY4MDA1QUFFDQotUzExMTBBQUExRjdDMDAwMTAwMDQ0RTc1NDIyRjAwMDQ0RTc1OUYNCi1TOTAzMDAwMEZDDQpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTEucm8gYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzYTdjYy4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMS5ybworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0yLnJvIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNGE3OWQuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLTIucm8KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDItMy5ybyBiL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0zLnJvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU5MzQyLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi0zLnJvCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3QyLmxkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTFlNDEzLi4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5sZAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi1PVVRQVVRfRk9STUFUKCJzcmVjIikKLVNFQ1RJT05TCi17Ci0KLQotLnRleHQgMCA6IHsgKigiOSIpICooIjEwIikgKigiMTEiKSAqKCIxMiIpICooIjEzIikgKigiMTQiKSAqKCIxNSIpCi0JCSooIjciKSAqKCI4IikgKigiMCIpICooIjEiKSAqKCIyIikgKigiMyIpICooIjQiKSB9Ci0uYnNzICAgOiB7ICAqKCI1IikgKigiNiIpIH0KLQotLlBBRkkgICAgPTB4MDAwMDAwNTAgOwotLlBDSElPICAgPTB4MDAwMDAwRDAgOwotLlBDTE8gICAgPTB4MDAwMDAwNTQgOwotLlBDVkJTViAgPTB4MDAwMDAwMEUgOwotLlBDVlRTVSAgPTB4MDAwMDAwMTIgOwotLlBDVlRTViAgPTB4MDAwMDAwMTYgOwotLlBDVlRTVkwgPTB4MDAwMDAwMUEgOwotLlBDVlRVUyAgPTB4MDAwMDAwMUUgOwotLlBESVMgICAgPTB4MDAwMDAwMjIgOwotLlBESVNMICAgPTB4MDAwMDAwMjYgOwotLlBEVkogICAgPTB4MDAwMDAwMkEgOwotLlBFSU8gICAgPTB4MDAwMDAwQ0MgOwotLlBFT0YgICAgPTB4MDAwMDAwNTggOwotLlBFT0wgICAgPTB4MDAwMDAwNUMgOwotLlBFUVVTICAgPTB4MDAwMDAwMkUgOwotLlBFUVVWICAgPTB4MDAwMDAwMzIgOwotLlBFUVVWTCAgPTB4MDAwMDAwMzYgOwotLlBFUVVXICAgPTB4MDAwMDAwREUgOwotLlBHQ00gICAgPTB4MDAwMDAwNjQgOwotLlBHRVFTICAgPTB4MDAwMDAwM0EgOwotLlBHRVFWICAgPTB4MDAwMDAwM0UgOwotLlBHRVFWTCAgPTB4MDAwMDAwNDIgOwotLlBHRVQgICAgPTB4MDAwMDAwNjAgOwotLlBHUlRTICAgPTB4MDAwMDAwNDYgOwotLlBHUlRWICAgPTB4MDAwMDAwNEEgOwotLlBHUlRWTCAgPTB4MDAwMDAwNEUgOwotLlBJQUNUICAgPTB4MDAwMDAwNkMgOwotLlBJRkQgICAgPTB4MDAwMDAwNjggOwotLlBJTkRTICAgPTB4MDAwMDAwNTIgOwotLlBJTkRWICAgPTB4MDAwMDAwNTYgOwotLlBJTkRWTCAgPTB4MDAwMDAwNUEgOwotLlBJTkRXICAgPTB4MDAwMDAwRDYgOwotLlBMRENTICAgPTB4MDAwMDAwNUUgOwotLlBMRENWICAgPTB4MDAwMDAwNjIgOwotLlBMRVFTICAgPTB4MDAwMDAwNjYgOwotLlBMRVFWICAgPTB4MDAwMDAwNkEgOwotLlBMRVFWTCAgPTB4MDAwMDAwNkUgOwotLlBMRVNTICAgPTB4MDAwMDAwNzIgOwotLlBMRVNWICAgPTB4MDAwMDAwNzYgOwotLlBMRVNWTCAgPTB4MDAwMDAwN0EgOwotLlBMT0RTICAgPTB4MDAwMDAwN0UgOwotLlBMT0RWICAgPTB4MDAwMDAwODIgOwotLlBMT0RWTCAgPTB4MDAwMDAwODYgOwotLlBNT0RKICAgPTB4MDAwMDAwOEEgOwotLlBNT1YgICAgPTB4MDAwMDAwRTIgOwotLlBNUEogICAgPTB4MDAwMDAwOEUgOwotLlBORVFTICAgPTB4MDAwMDAwOTIgOwotLlBORVFWICAgPTB4MDAwMDAwOTYgOwotLlBORVFWTCAgPTB4MDAwMDAwOUEgOwotLlBORVFXICAgPTB4MDAwMDAwREEgOwotLlBQQUdFICAgPTB4MDAwMDAwRDQgOwotLlBQRUUgICAgPTB4MDAwMDAwNzAgOwotLlBQVVQgICAgPTB4MDAwMDAwNzQgOwotLlBSREIgICAgPTB4MDAwMDAwNzggOwotLlBSREMgICAgPTB4MDAwMDAwN0MgOwotLlBSREggICAgPTB4MDAwMDAwODAgOwotLlBSREkgICAgPTB4MDAwMDAwODQgOwotLlBSREogICAgPTB4MDAwMDAwODggOwotLlBSRFJTICAgPTB4MDAwMDAwQzggOwotLlBSRFMgICAgPTB4MDAwMDAwOEMgOwotLlBSRFYgICAgPTB4MDAwMDAwOTAgOwotLlBSTE4gICAgPTB4MDAwMDAwOTQgOwotLlBSUkFOICAgPTB4MDAwMDAwOTggOwotLlBSU1QgICAgPTB4MDAwMDAwOUMgOwotLlBSV1QgICAgPTB4MDAwMDAwQTAgOwotLlBTQ09OICAgPTB4MDAwMDAwOUUgOwotLlBTQ09QICAgPTB4MDAwMDAwQTIgOwotLlBTREVMICAgPTB4MDAwMDAwQTYgOwotLlBTSU5TICAgPTB4MDAwMDAwQUEgOwotLlBTTEVOICAgPTB4MDAwMDAwQUUgOwotLlBTUE9TICAgPTB4MDAwMDAwQjIgOwotLlBTVENWICAgPTB4MDAwMDAwQjYgOwotLlBTVENWTCAgPTB4MDAwMDAwQkEgOwotLlBTVE9TICAgPTB4MDAwMDAwQkUgOwotLlBTVE9WICAgPTB4MDAwMDAwQzIgOwotLlBTVE9WTCAgPTB4MDAwMDAwQzYgOwotLlBTVFJTICAgPTB4MDAwMDAwQ0EgOwotLlBTVFJWICAgPTB4MDAwMDAwQ0UgOwotLlBTVFJWTCAgPTB4MDAwMDAwRDIgOwotLlBXTE4gICAgPTB4MDAwMDAwQTQgOwotLlBXUkFOICAgPTB4MDAwMDAwQTggOwotLlBXUkIgICAgPTB4MDAwMDAwQUMgOwotLlBXUkMgICAgPTB4MDAwMDAwQjAgOwotLlBXUkggICAgPTB4MDAwMDAwQjQgOwotLlBXUkkgICAgPTB4MDAwMDAwQjggOwotLlBXUkogICAgPTB4MDAwMDAwQkMgOwotLlBXUlMgICAgPTB4MDAwMDAwQzAgOwotLlBXUlYgICAgPTB4MDAwMDAwQzQgOwotCi0vKgotLlBBRkk9MHggICA9IDB4MDA7Ci0uUENISU8gICA9MHggMHgwMDAwMDA7Ci0uUENMTyAgICA9MHggNjQgOwotLlBDOwotLlBDVlRTVSAgPTB4IDB4MDAwMDAwOwotLlBDVlRTViAgPTB4IDB4MDAwMDAwOwotLlBDVlRTVkwgPTB4IDB4MDAwMDAwOwotLlBDVlRVUyAgPTB4IDE1OCA7Ci0uUDsKLS5QRElTTCAgID0weCAweDAwMDAwMDsKLS5QRFZKICAgID0weCAweDAwMDAwMDsKLS5QRUlPICAgID0weCAweDAwMDAwMDsKLS5QRU9GICAgID0weCAweDAwMDAwMDsKLS5QRU9MICAgID0weCAweDAwMDAwMDsKLS5QRVFVUyAgID0weCAweDAwMDAwMDsKLS5QRVFVViAgID0weCAweDAwMDAwMDsKLS5QRVFVVkwgID0weCAweDAwMDAwMDsKLS5QRVFVVyAgID0weCAweDAwMDAwMDsKLS5QR0NNICAgID0weCAweDAwMDAwMDsKLS5QR0VRUyAgID0weCAweDAwMDAwMDsKLS5QR0VRViAgID0weCAweDAwMDAwMDsKLS5QR0VRVkwgID0weCAweDAwMDAwMDsKLS5QR0VUICAgID0weCAweDAwMDAwMDsKLS5QR1JUUyAgID0weCAweDAwMDAwMDsKLS5QR1JUViAgID0weCAweDAwMDAwMDsKLS5QR1JUVkwgID0weCAweDAwMDAwMDsKLS5QSUFDVCAgID0weCAweDAwMDAwMDsKLS5QSUZEICAgID0weCAxMjYgOwotLlA7Ci0uUElORFYgICA9MHggMHgwMDAwMDA7Ci0uUElORFZMICA9MHggMHgwMDAwMDA7Ci0uUElORFcgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1MgICA9MHggMHgwMDAwMDA7Ci0uUExEQ1YgICA9MHggMHgwMDAwMDA7Ci0uUExFUVMgICA9MHggMHgwMDAwMDA7Ci0uUExFUVYgICA9MHggMHgwMDAwMDA7Ci0uUExFUVZMICA9MHggMHgwMDAwMDA7Ci0uUExFU1MgICA9MHggMHgwMDAwMDA7Ci0uUExFU1YgICA9MHggMHgwMDAwMDA7Ci0uUExFU1ZMICA9MHggMHgwMDAwMDA7Ci0uUExPRFMgICA9MHggMHgwMDAwMDA7Ci0uUExPRFYgICA9MHggMHgwMDAwMDA7Ci0uUExPRFZMICA9MHggMHgwMDAwMDA7Ci0uUE1PREogICA9MHggMHgwMDAwMDA7Ci0uUE1PViAgICA9MHggMHgwMDAwMDA7Ci0uUE1QSiAgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVMgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVYgICA9MHggMHgwMDAwMDA7Ci0uUE5FUVZMICA9MHggMHgwMDAwMDA7Ci0uUE5FUVcgICA9MHggMHgwMDAwMDA7Ci0uUFBBR0UgICA9MHggMHgwMDAwMDA7Ci0uUFBFRSAgICA9MHggMHgwMDAwMDA7Ci0uUFBVVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEQyAgICA9MHggMHgwMDAwMDA7Ci0uUFJESCAgICA9MHggMHgwMDAwMDA7Ci0uUFJESSAgICA9MHggMHgwMDAwMDA7Ci0uUFJESiAgICA9MHggMHgwMDAwMDA7Ci0uUFJEUlMgICA9MHggMHgwMDAwMDA7Ci0uUFJEUyAgICA9MHggMHgwMDAwMDA7Ci0uUFJEViAgICA9MHggMHgwMDAwMDA7Ci0uUFJMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFJSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFJTVCAgICA9MHggMHgwMDAwMDA7Ci0uUFJXVCAgICA9MHggMHgwMDAwMDA7Ci0uUFNDT04gICA9MHggMHgwMDAwMDA7Ci0uUFNDT1AgICA9MHggMHgwMDAwMDA7Ci0uUFNERUwgICA9MHggMHgwMDAwMDA7Ci0uUFNJTlMgICA9MHggMHgwMDAwMDA7Ci0uUFNMRU4gICA9MHggMHgwMDAwMDA7Ci0uUFNQT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUQ1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUT1MgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1YgICA9MHggMHgwMDAwMDA7Ci0uUFNUT1ZMICA9MHggMHgwMDAwMDA7Ci0uUFNUUlMgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlYgICA9MHggMHgwMDAwMDA7Ci0uUFNUUlZMICA9MHggMHgwMDAwMDA7Ci0uUFdMTiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQU4gICA9MHggMHgwMDAwMDA7Ci0uUFdSQiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSQyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSCAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSSAgICA9MHggMHgwMDAwMDA7Ci0uUFdSSiAgICA9MHggMHgwMDAwMDA7Ci0uUFdSUyAgICA9MHggMHgwMDAwMDA7Ci0uUFdSViAgICA9MHggMHgwMDAwMDA7Ci0KLSovCi0vKgotLlA9MHggICAgICA9IDA7Ci0uUENISU8gICA9MHggMHhmZWVkZmE7Ci0uUENMTyAgICA9MHggMHhmZWVkZmE7Ci0uUENWQlNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNVICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWICA9MHggMHhmZWVkZmE7Ci0uUENWVFNWTCA9MHggMHhmZWVkZmE7Ci0uUENWVFVTICA9MHggMHhmZWVkZmE7Ci0uUERJUyAgICA9MHggMHhmZWVkZmE7Ci0uUERJU0wgICA9MHggMHhmZWVkZmE7Ci0uUERWSiAgICA9MHggMHhmZWVkZmE7Ci0uUEVJTyAgICA9MHggMHhmZWVkZmE7Ci0uUEVPRiAgICA9MHggMHhmZWVkZmE7Ci0uUEVPTCAgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVMgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVYgICA9MHggMHhmZWVkZmE7Ci0uUEVRVVZMICA9MHggMHhmZWVkZmE7Ci0uUEVRVVcgICA9MHggMHhmZWVkZmE7Ci0uUEdDTSAgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVMgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVYgICA9MHggMHhmZWVkZmE7Ci0uUEdFUVZMICA9MHggMHhmZWVkZmE7Ci0uUEdFVCAgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFMgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFYgICA9MHggMHhmZWVkZmE7Ci0uUEdSVFZMICA9MHggMHhmZWVkZmE7Ci0uUElBQ1QgICA9MHggMHhmZWVkZmE7Ci0uUElGRCAgICA9MHggMHhmZWVkZmE7Ci0uUElORFMgICA9MHggMHhmZWVkZmE7Ci0uUElORFYgICA9MHggMHhmZWVkZmE7Ci0uUElORFZMICA9MHggMHhmZWVkZmE7Ci0uUElORFcgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1MgICA9MHggMHhmZWVkZmE7Ci0uUExEQ1YgICA9MHggMHhmZWVkZmE7Ci0uUExFUVMgICA9MHggMHhmZWVkZmE7Ci0uUExFUVYgICA9MHggMHhmZWVkZmE7Ci0uUExFUVZMICA9MHggMHhmZWVkZmE7Ci0uUExFU1MgICA9MHggMHhmZWVkZmE7Ci0uUExFU1YgICA9MHggMHhmZWVkZmE7Ci0uUExFU1ZMICA9MHggMHhmZWVkZmE7Ci0uUExPRFMgICA9MHggMHhmZWVkZmE7Ci0uUExPRFYgICA9MHggMHhmZWVkZmE7Ci0uUExPRFZMICA9MHggMHhmZWVkZmE7Ci0uUE1PREogICA9MHggMHhmZWVkZmE7Ci0uUE1PViAgICA9MHggMHhmZWVkZmE7Ci0uUE1QSiAgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVMgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVYgICA9MHggMHhmZWVkZmE7Ci0uUE5FUVZMICAgID0gMHhmZWVkZmFjZTsKLS5QTkVRVyAgICAgPSAweGZlZWRmYWNlOwotLlBQQUdFICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFBFRSAgICAgID0gMHhmZWVkZmFjZTsKLS5QUFVUICAgICAgPSAweGZlZWRmYWNlOwotLlBSREIgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEQyAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRIICAgICAgPSAweGZlZWRmYWNlOwotLlBSREkgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJESiAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkRSUyAgICAgPSAweGZlZWRmYWNlOwotLlBSRFMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJEViAgICAgID0gMHhmZWVkZmFjZTsKLS5QUkxOICAgICAgPSAweGZlZWRmYWNlOwotLlBSUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFJTVCAgICAgID0gMHhmZWVkZmFjZTsKLS5QUldUICAgICAgPSAweGZlZWRmYWNlOwotLlBTQ09OICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNDT1AgICAgID0gMHhmZWVkZmFjZTsKLS5QU0RFTCAgICAgPSAweGZlZWRmYWNlOwotLlBTSU5TICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNMRU4gICAgID0gMHhmZWVkZmFjZTsKLS5QU1BPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVENWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUQ1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RPUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVE9WICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUT1ZMICAgID0gMHhmZWVkZmFjZTsKLS5QU1RSUyAgICAgPSAweGZlZWRmYWNlOwotLlBTVFJWICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFNUUlZMICAgID0gMHhmZWVkZmFjZTsKLS5QV0xOICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkFOICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSQiAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JDICAgICAgPSAweGZlZWRmYWNlOwotLlBXUkggICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSSSAgICAgID0gMHhmZWVkZmFjZTsKLS5QV1JKICAgICAgPSAweGZlZWRmYWNlOwotLlBXUlMgICAgICA9IDB4ZmVlZGZhY2U7Ci0uUFdSViAgICAgID0gMHhmZWVkZmFjZTsKLSovCi0KLX0KZGlmZiAtLWdpdCBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sgYi9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdDIub29rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2YyNGE1Li4wMDAwMDAwCi0tLSBhL2xkL3Rlc3RzdWl0ZS9sZC12ZXJzYWRvcy90Mi5vb2sKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi1TMDEyMDAwMDY5NkU2OTc0NzQ2NTczNzQ1RjY1NzA2MzJFNzM3MkNGDQotUzExODAwMDAwMDAwMDAwMDQ5NEU0OTU0NTQ0NTUzNTQyMDIwNTA0MTMwMzUyMDIwNTJBQg0KLVMxMTgwMDE1MzEzMzJFMzMyMDIwMjAyMDIwMjAyMDUyMzEzMzJFMzIyMDIwMjAyMDIwNzcNCi1TMTE4MDAyQTIwMjAwMDkzNEI1QjAwQjVFNkMxMUIwODlERDYwMDAwNTQwMDAwMDAwNUY5DQotUzExODAwM0Y1QTAwMDAwMDQ4MDA1QzAwQTYwMDAwMDEwQTAxMjYwMDA0MDAwMTAwMDJDQg0KLVMxMTgwMDU0MDA5MDAwMDAwMDAwMDAwMDAwMDAwMDAyMDA0MDIwMjAwMDAwNDk0RjVGOEENCi1TMTE4MDA2OTUyNDU1MzQ1NTI1NjQxNTI1NDRDNDk0MjQzNEY0RTAwNDA0ODQ1MDEwMDNCDQotUzExODAwN0U1MDVGNDE0QzRDMjAyMDIwMjAyMDUyNTQ0QzQ5NDI0MzRGNEUwMTAwMDBFMw0KLVMxMTgwMDkzMDAwMDlDMDEwMDAwMDAwMDAwMDAwODUzNDU1MDQxNTI0MTU0NDUwMDA4NTINCi1TMTE4MDBBODAwMDgwMDQwMzFDRjUyNTQ0QzQ5NDI0MzRGNEUwMDA0RTVFQzUyNTQ0Q0QzDQotUzExODAwQkQ0OTQyNDM0RjRFMDBCNUU4NkQ1MzQxNDY0NTUzNTQ0RjUyMDAwMDRGMjhENw0KLVMxMTgwMEQyNTM1OTUzNTQ0NTRENDk0RDAwQjVFODczNTM0MTQ2NDU1MzU0NEY1MjAwMjMNCi1TMTE4MDBFNzQwMzFEMjUyNTQ0QzQ5NDI0MzRGNEUwMDAwMEE3RDUyNTQ0QzQ5NDI1MzA5DQotUzExODAwRkM1NDUyMDAxMEE0QTg1MjU0NEM0OTQyNDY0OTRDMDAwMTAwQjVFNkMwNDlFQw0KLVMxMTgwMTExNEU0OTU0NTQ0NTUzNTQyMDIwMDAwMDA2MTYwMjAwMDgwMDAwMDAwMjMyMTANCi1TMTE4MDEyNjAwNDgwMDAwMDAwMDRFNTZGRkYwQkE4RjYzMDYyRTRFNjEwMDAwQkM0MTU5DQotUzExODAxM0JGQTAwRjQ0M0VFRkZGMDMyRDgyRDdDMDAwMDAwMDFGRkZDMjA2RTAwMDg1OA0KLVMxMTgwMTUwMjAwODY2MDQ2MTAwMDBCQTIyMkVGRkZDNTM4MTRBODE2QzA0NjEwMDAwMkUNCi1TMTE4MDE2NTlFMjI0OEQzRTlGRkZDNDFGMDE4MDBCM0M4NjNFRTRBMTA2NjAwMDAwNkU3DQotUzExODAxN0E2MDAwMDA2MjQxRUVGRkYwMjY2QzAwMzg0RUFCMDA3RTIwNkUwMDA4MjA5NQ0KLVMxMTgwMThGMDg2NjA0NjEwMDAwN0MyMjJFRkZGQzUzODE0QTgxNkMwNDYxMDAwMDYwRUQNCi1TMTE4MDFBNDIyNDhEM0U5RkZGQzQxRjAxODAwQjNDODYzRUUxRjEwM0YzQzAwMDEyNjNCDQotUzExODAxQjk2QzAwMzg0RUFCMDA5RTQxRUVGRkYwNzAwQzI2NkMwMDM4NEVBQjAwQ0FDQg0KLVMxMTgwMUNFNTJBRUZGRkMwQ0FFMDAwMDAwMEFGRkZDNkYwMEZGNzA0MUVFRkZGMDQzMUYNCi1TMTE4MDFFM0VFMDAwQzIyRDgyMkQ4MjJEODRFNUUyMDVGNTg4RjRFRDAyQjU3RkZGMjc4DQotUzExODAxRjgyRjNDMDAwMDAwMEE2MDAwMDAxRTJCNTdGRkYyMkYzQzAwMDAwMDBGNjBBRQ0KLVMxMTgwMjBEMDAwMDEwMkI1N0ZGRjIyRjNDMDAwMDAwMTA2MDAwMDAwMjNCNkYwMDAyQ0MNCi1TMTE4MDIyMkZGRjYyRjJEMDAzODJGMkQwMDM0NEU0QzRFNEEwMDAwNEZFREZFRUEyMDM0DQotUzExODAyMzczQzAwMDAwMDhBMjA0RjQyNTg1MUM4RkZGQzQ4NkRGRUVBMUYzQzAwMDRDRg0KLVMxMTgwMjRDM0YzQzAwMDE5RkZDMDAwMDAwMEMyMjRGNDVGQTAyRDQyMkRBMjJEQTIyRDYNCi1TMTE4MDI2MURBMjY2QzAwNDAyRjBDMjg2QzAwNDQ0RUFCMDA2ODQ4NkRGRkI4NDg2RDQzDQotUzExODAyNzZGRkI0MkYwQzIwNkMwMDA4Mjg2QzAwMEM0RTkwOUZGQzAwMDAwMDUyMkY1Mw0KLVMxMTgwMjhCMkRGRkM2MkYwQzIwNkMwMDEwMjg2QzAwMTQ0RTkwNzA1MjI2NkMwMDM4N0YNCi1TMTE4MDJBMDRFQUIwMDFFNDFGQTAyOTQyNjZDMDAzODRFQUIwMDdFMjY2QzAwMzg0RTA0DQotUzExODAyQjVBQjAwOUU0MUVERkZCQTI2NkMwMDM4NEVBQjAwN0UyNjZDMDAzODRFQUJGQw0KLVMxMTgwMkNBMDA5RTFGM0MwMDI4M0YzQzAwMDEyNjZDMDAzODRFQUIwMDlFOUZGQzAwODINCi1TMTE4MDJERjAwMDA1MjMwMkRGRkNBNDhDMDJGMDAyRjBDMjA2QzAwMTAyODZDMDAxNEQ4DQotUzExODAyRjQ0RTkwNzA1MjI2NkMwMDM4NEVBQjAwMUUyNjZDMDAzODRFQUIwMDlFNDFDRQ0KLVMxMTgwMzA5RkEwMjM0MjY2QzAwMzg0RUFCMDA3RTI2NkMwMDM4NEVBQjAwOUU0MUVEREINCi1TMTE4MDMxRUZGODA3MDE2MjY2QzAwMzg0RUFCMDBDQTlGRkMwMDAwMDAwRTYxMDAwMjI4DQotUzExODAzMzMyODQxRURGRjlFMjBERjIwREYyMERGMzBERjRBMkRGRjlFNjcwMDAwM0FGRA0KLVMxMTgwMzQ4NTk4RjJGMkRGRkEwMkYyREZGQTgyRjBDMjA2QzAwMTgyODZDMDAxQzRFRDkNCi1TMTE4MDM1RDkwMDFCODJCNUZGRjlBMkYyREZGOUEyRjJERkZBNDJGMkRGRkE4MkYwQ0U5DQotUzExODAzNzIyMDZDMDAyMDI4NkMwMDI0NEU5MDYwMDAwMDM0NTk4RjJGMkRGRkEwNDg3MQ0KLVMxMTgwMzg3NkRGRkE4MkYwQzIwNkMwMDI4Mjg2QzAwMkM0RTkwMkI1RkZGOTYyRjJENDENCi1TMTE4MDM5Q0ZGQTQyRjJERkY5NjJGMkRGRkE4MkYwQzIwNkMwMDIwMjg2QzAwMjQ0RUM0DQotUzExODAzQjE5MDQ4NkRGRUVBOUZGQzAwMDAwMDUyMjA0RjQzRURGRjgwMzAxOTcyNTBGMA0KLVMxMTgwM0M2OTI0MDZGMDI0MjQxRDA0MTMwQzA2RjBBNTM0MEUyNDAzMEQ5NTFDOEZGMDgNCi1TMTE4MDNEQkZDOUZGQzAwMDAwMDUyMjI0RjQ1RkEwMTVDMzJEQTI2NkMwMDQwMkYwQ0ZBDQotUzExODAzRjAyODZDMDA0NDRFQUIwMDUwMDEyQzQ4NkRGRUVBMjY2QzAwNDAyRjBDMjhENA0KLVMxMTgwNDA1NkMwMDQ0NEVBQjAwQTAwMTE4NDg3QTAxMzQzRjNDRkZGRjQ4NkRGRUVBNkYNCi1TMTE4MDQxQTI2NkMwMDQwMkYwQzI4NkMwMDQ0NEVBQjAwQzAwMEZDNDg2REZFRUEyNjZDDQotUzExODA0MkY2QzAwNDAyRjBDMjg2QzAwNDQ0RUFCMDBBNDAwRTg0MkFERkZCMDJCN0MyQg0KLVMxMTgwNDQ0MDAwMDAwMDFGRkFDNTk4RjJGMkRGRkFDNjEwMDAxN0UyQjVGRkZCMDJCQzANCi1TMTE4MDQ1OTQwRkZCMDJGMkRGRkFDM0YzQzAwMEE0ODZERkVFQTI2NkMwMDQwMkYwQzY1DQotUzExODA0NkUyODZDMDA0NDRFQUIwMEJDMDBBRTlGRkMwMDAwMDAwQzJGMkRGRkIwNjEyNw0KLVMxMTgwNDgzMDBGQ0E4MkYwRjNGM0MwMDBBNDg2REZFRUEyNjZDMDA0MDJGMEMyODZDQkINCi1TMTE4MDQ5ODAwNDQ0RUFCMDBDMDAwODZERkZDMDAwMDAwMEM0ODZERkVFQTI2NkMwMEIyDQotUzExODA0QUQ0MDJGMEMyODZDMDA0NDRFQUIwMEE0MDA2QzUyQURGRkFDMENBRDAwMDA3Nw0KLVMxMTgwNEMyMDAwQUZGQUM2RjgyNDg2REZFRUExRjNDMDAwMTI2NkMwMDQwMkYwQzI4NEQNCi1TMTE4MDRENzZDMDA0NDRFQUIwMDU0NDg2REZGQjg0ODZERkZCNDJGMEMyMDZDMDAzMDQ0DQotUzExODA0RUMyODZDMDAzNDRFOTA0ODZERkVFQTQyMjcyNjZDMDA0MDJGMEMyODZDMDBBQQ0KLVMxMTgwNTAxNDQ0RUFCMDA1NDQyQTcyRjJEMDAzODJGMkQwMDM0NEU0QTJCNTdGRkYyMzgNCi1TMTE4MDUxNjJGM0MwMDAwMDAwQzYwMDBGRDAwMkI1N0ZGRjIyRjNDMDAwMDAwNjQ2MDU2DQotUzExODA1MkIwMEZDRjIwMDBBNDYzMTIwMjAyMDIwMjAyMDIwMjAwMDAyM0EzQTAwMDJEMA0KLVMxMTgwNTQwMjkzQTAwMDAwMDE0MjAyMDIwMjAyMDIwNDM2MTczNjUyMDIwMjAyMDUyMUQNCi1TMTE4MDU1NTY1NzM3NTZDNzQ0MUZBMDAwNEQxRkNGRkZGRkFBMDIwMjgwMDNDNDNGQUZCDQotUzExODA1NkEwMDA0RDNGQzAwMDAwMUQ2NDVGQTAwMDRENUZDMDAwMDAyNUUyNjBBNThEMg0KLVMxMTgwNTdGOEFEMDg4NTU4MDIyMjgwMDU2NjYwMDAwMkUyNDA4MjY1QUQ1QjBCODAwOEYNCi1TMTE4MDU5NEI1QzA2REY2MjIwOTkyODgyMTQxMDA1NjQyODEyNjQ4RDI1QkI3Qzk2RDJFDQotUzExODA1QTlGQTQ0NDFEMzY4MDA1QTEyM0MwMDAxNjAwMDAwMDQ0MjQxMUY0MTAwMDQ4Qg0KLVMxMTgwNUJFMkY2ODAwMzQwMDA2MkY0OTAwMEE5Njg5MkY0MzAwMEU0RTc1NEU1NkZGQ0MNCi1TMTE4MDVEM0YwMjAyRTAwMDg0N0ZBMDAwNEQ3RkMwMDAwMDFBNjIyMEI0MUZBMDAwNDlFDQotUzExODA1RThEMUZDMDAwMDAxQjYyRDU4RkZGMDJENThGRkY0MkQ1OEZGRjgyRDUwRkY5Mg0KLVMxMTgwNUZERkM1MzgwNzQwOEI0ODA2NTAwMDEyQzQxRkEwMDA0RDFGQzAwMDAwMDBFQkENCi1TMTE4MDYxMkQwODAzMDMwMDgwMDRFRkIwMDAyMDAxMjAwMjIwMDMyMDA0MjAwNDgwMERDDQotUzExODA2Mjc1ODAwNkMwMEEwMDBEQzQxRkEwMDA0RDFGQzAwMDAwMTE4MjAxMDYwMDBDNQ0KLVMxMTgwNjNDMDEwMjQ3RkEwMDA0RDdGQzAwMDAwMTBDMjAwQjYwMDAwMEYyNDFGQTAwQzUNCi1TMTE4MDY1MTA0RDFGQzAwMDAwMTEwMjAxMDYwMDAwMEUyMjAwMTYwMDAwMERDNDdGQTlFDQotUzExODA2NjYwMDA0RDdGQzAwMDAwMTIwMjAwQjYwMDAwMENDNDNGQTAwMDREM0ZDMDAxQw0KLVMxMTgwNjdCMDAwMEZBNDFFOTAwMEMyMDEwNjAwMDAwQjgyNDJFRkZGNDQ3RkEwMDA0NjQNCi1TMTE4MDY5MEQ3RkMwMDAwMDBGRUI0OEI2NjAwMDAxMjQ3RkEwMDA0RDdGQzAwMDAwMUIwDQotUzExODA2QTUxNDIwMEI2MDAwMDA5NDQ3RkEwMDA0RDdGQzAwMDAwMTBBMjAwQjYwMDA1Qg0KLVMxMTgwNkJBMDA4NDQxRkEwMDA0RDFGQzAwMDAwMDhBMjA1MDQ3RkEwMDA0RDdGQzAwODUNCi1TMTE4MDZDRjAwMDA4MkIxQ0I2NjAwMDAxMjQ3RkEwMDA0RDdGQzAwMDAwMEUwMjAwQjc5DQotUzExODA2RTQ2MDAwMDA1ODQ3RkEwMDA0RDdGQzAwMDAwMEQyMjAwQjYwMDAwMDQ4NDE0Nw0KLVMxMTgwNkY5RkEwMDA0RDFGQzAwMDAwMDRFNDNGQTAwMDREM0ZDMDAwMDAwM0VCM0QwRkUNCi1TMTE4MDcwRTY2MDAwMDEyNDdGQTAwMDREN0ZDMDAwMDAwQUUyMDBCNjAwMDAwMUU0N0E0DQotUzExODA3MjNGQTAwMDREN0ZDMDAwMDAwQTYyMDBCNjAwMDAwMEU0N0ZBMDAwNEQ3RkM5NQ0KLVMxMTgwNzM4MDAwMDAwOTgyMDBCNEU1RTRFNzQwMDA0MDAwMDUzNzU2RTY1MDAwMDAwRDgNCi1TMTE4MDc0RDAwMDc0NjRGNzQ3NDZGMDAwMDAwMDAwMDBBMDAwMDAwMEM1MDY1NkM2Q0ZEDQotUzExODA3NjI2NTAwMDAwMDA3NUU1Mzc0Njk2RTYxMDA0QjYxNzI2OTZFMDAwMDAwMDBDMA0KLVMxMTgwNzc3MDUwMDAwMDc2ODAwMDAwMDAzMDAwMDA3NkU1MDc1NzQ3NDY1MDA0QjYxQkYNCi1TMTE4MDc4QzZDNkM2NTAwNTM3NDY5NkU2MTMxMDAwMDRCNjE3MjY5NkUzMTAwMDAwMEMxDQotUzExODA3QTEwMDAwMzMwMDAwMDc5MDAwMDAwMDFGMDAwMDA3OTg3ODc5N0E3QTAwMDBEMg0KLVMxMTgwN0I2NEY2QzZDNjUwMDAwMzcwMDM4MDA1MDY1NzQ2NTcyMDA1Mzc2NzU2QzZDMTkNCi1TMTE4MDdDQjZGMDAwMDM5MDA1MzZDNzU3NDAwMDAwMDAwMDAwMDAwMDAwNzRDMDAwMDcyDQotUzExNTA3RTAwNzY0MDAwMDA3NzgwMDAwMDc4MDAwMDAwN0E0MDAwMDA3QUMzNA0KLVM5MDMwMDAwRkMNCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwIGIvbGQvdGVzdHN1aXRlL2xkLXZlcnNhZG9zL3ZlcnNhZG9zLmV4cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyYzA2Ni4uMDAwMDAwMAotLS0gYS9sZC90ZXN0c3VpdGUvbGQtdmVyc2Fkb3MvdmVyc2Fkb3MuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotIyBFeHBlY3Qgc2NyaXB0IGZvciBsZC12ZXJzYWRvcyB0ZXN0cwotIyAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkKLSMKLQotIyBNYWtlIHN1cmUgdGhhdCBsZCBjYW4gcmVhZCB2ZXJzYWRvcyBpbWFnZXMgYW5kCi0jIGdlbmVyYXRlIGJpbmFyaWVzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gdGhlIGN1c3RvbWVyJ3MKLSMgb2xkIG1ldGhvZC4KLQotIyBUaGlzIHRlc3QgY2FuIG9ubHkgYmUgcnVuIGlmIGxkIGdlbmVyYXRlcyBuYXRpdmUgZXhlY3V0YWJsZXMuCi0KLSMgVGhpcyB0ZXN0IGNhbiBvbmx5IGJlIHJ1biBvbiA2OGsgY29mZiB0YXJnZXRzCi0jIFNxdWFyZSBicmFja2V0IGV4cHJlc3Npb25zIHNlZW0gdG8gY29uZnVzZSBpc3RhcmdldC4KLWlmIHsgIVtpc3RhcmdldCBtNjhrLSotY29mZipdIH0gdGhlbiB7Ci0gICAgcmV0dXJuCi19Ci0KLXNldCB0ZXN0bmFtZSAiTEQgVkVSU0FET1MiCi0KLQotcHJvYyBpbnNwZWN0IHsgd2hpY2hvbmUgfSB7Ci0gICAgZ2xvYmFsIG9iamR1bXAKLSAgICBnbG9iYWwgZXhlY19vdXRwdXQKLSAgICBnbG9iYWwgc3JjZGlyCi0gICAgZ2xvYmFsIHN1YmRpcgotICAgIGdsb2JhbCB0ZXN0bmFtZQotCi0gICAgc2VuZF9sb2cgIiRvYmpkdW1wIC1zIHRtcGRpci8kd2hpY2hvbmUub3V0ID50bXBkaXIvJHdoaWNob25lLmR1bXBcbiIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyB0bXBkaXIvJHdoaWNob25lLm91dCB8IGdyZXAgLXYgc3JlYyA+dG1wZGlyLyR3aGljaG9uZS5kdW1wIiBleGVjX291dHB1dAotCi0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JdW5yZXNvbHZlZCAkdGVzdG5hbWUKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIHNlbmRfbG9nICIkb2JqZHVtcCAtcyAkc3JjZGlyLyRzdWJkaXIvJHdoaWNob25lLm9vayA+dG1wZGlyLyR3aGljaG9uZS5kb2tcbiIKLSAgICBjYXRjaCAiZXhlYyAkb2JqZHVtcCAtcyAkc3JjZGlyLyRzdWJkaXIvJHdoaWNob25lLm9vayB8IGdyZXAgLXYgc3JlYyA+dG1wZGlyLyR3aGljaG9uZS5kb2siIGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiAhW3N0cmluZyBtYXRjaCAiIiAkZXhlY19vdXRwdXRdIHsKLQlzZW5kX2xvZyAiJGV4ZWNfb3V0cHV0XG4iCi0JdmVyYm9zZSAkZXhlY19vdXRwdXQKLQl1bnJlc29sdmVkICR0ZXN0bmFtZQotCXJldHVybiAwCi0gICAgfQotCi0gICAgIyBjb21wYXJlIGl0IHdpdGggdGhlIGNvcnJlY3Qgb3V0cHV0Ci0gICAgY2F0Y2ggImV4ZWMgZGlmZiB0bXBkaXIvJHdoaWNob25lLmR1bXAgdG1wZGlyLyR3aGljaG9uZS5kb2siIGV4ZWNfb3V0cHV0Ci0gICAgaWYgIVtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB7Ci0Jc2VuZF9sb2cgIiRleGVjX291dHB1dFxuIgotCXZlcmJvc2UgJGV4ZWNfb3V0cHV0Ci0JZmFpbCAkdGVzdG5hbWUKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIHJldHVybiAxCi19Ci0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkIHRtcGRpci90MS5vdXQgXAotCSIgLVQgJHNyY2Rpci8kc3ViZGlyL3QxLmxkICRzcmNkaXIvJHN1YmRpci90MS0xLnJvICAkc3JjZGlyLyRzdWJkaXIvdDEtMi5ybyJdIHsKLSAgICBmYWlsICR0ZXN0bmFtZQotICAgIHJldHVybgotfSBlbHNlIHsKLSAgICAjIEdldCBhIGR1bXAgb2Ygd2hhdCB3ZSd2ZSBnb3QsIGFuZCB3aGF0IHdlIHNob3VsZCBoYXZlCi0gICAgaWYgIVtpbnNwZWN0IHQxXSB7Ci0JcmV0dXJuCi0gICAgfQotfQotCi0KLWlmICFbbGRfc2ltcGxlX2xpbmsgJGxkICB0bXBkaXIvdDIub3V0IFwKLQkiIC1UICRzcmNkaXIvJHN1YmRpci90Mi5sZCAkc3JjZGlyLyRzdWJkaXIvdDItMi5ybyBcCi0JJHNyY2Rpci8kc3ViZGlyL3QyLTEucm8gICRzcmNkaXIvJHN1YmRpci90Mi0zLnJvIl0gewotICAgIGZhaWwgJHRlc3RuYW1lCi0gICAgcmV0dXJuCi19IGVsc2UgewotICAgICMgR2V0IGEgZHVtcCBvZiB3aGF0IHdlJ3ZlIGdvdCwgYW5kIHdoYXQgd2Ugc2hvdWxkIGhhdmUKLSAgICBpZiAhW2luc3BlY3QgdDJdIHsKLQlyZXR1cm4KLSAgICB9Ci19Ci0KLXBhc3MgJHRlc3RuYW1lCmRpZmYgLS1naXQgYS9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAgYi9sZC90ZXN0c3VpdGUvbGliL2xkLWxpYi5leHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YTE4MGIuLjAwMDAwMDAKLS0tIGEvbGQvdGVzdHN1aXRlL2xpYi9sZC1saWIuZXhwCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSMKLSMgZGVmYXVsdF9sZF92ZXJzaW9uIAotIwlleHRyYWN0IGFuZCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbGQKLSMKLXByb2MgZGVmYXVsdF9sZF92ZXJzaW9uIHsgbGQgfSB7Ci0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JZXhpdCAxCi0gICAgfQotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAtLXZlcnNpb24iIHRtcAotICAgIHNldCB0bXAgW3BydW5lX3dhcm5pbmdzICR0bXBdCi0gICAgcmVnZXhwICJcW15cblxdKiAoY3lnbnVzLXwpKFxbLTAtOS5hLXpBLVotXF0rKVxbXHJcblxdLioiICR0bXAgdmVyc2lvbiBjeWcgbnVtYmVyCi0gICAgaWYgW2luZm8gZXhpc3RzIG51bWJlcl0gdGhlbiB7Ci0JY2xvbmVfb3V0cHV0ICIkbGQgJG51bWJlclxuIgotICAgIH0KLX0KLQotIwotIyBkZWZhdWx0X2xkX3JlbG9jYXRlIAotIwlsaW5rIGFuIG9iamVjdCB1c2luZyByZWxvY2F0aW9uCi0jCi1wcm9jIGRlZmF1bHRfbGRfcmVsb2NhdGUgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLSAgICBnbG9iYWwgSE9TVElOR19FTVUKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgJEhPU1RJTkdfRU1VIC1vICR0YXJnZXQgLXIgJG9iamVjdHMiCi0gICAgCi0gICAgY2F0Y2ggImV4ZWMgJGxkICRIT1NUSU5HX0VNVSAtbyAkdGFyZ2V0IC1yICRvYmplY3RzIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLQotIwotIyBkZWZhdWx0X2xkX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkCi0jCi1wcm9jIGRlZmF1bHRfbGRfbGluayB7IGxkIHRhcmdldCBvYmplY3RzIH0gewotICAgIGdsb2JhbCBIT1NUSU5HX0VNVQotICAgIGdsb2JhbCBIT1NUSU5HX0NSVDAKLSAgICBnbG9iYWwgSE9TVElOR19MSUJTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIHNldCBvYmpzICIkSE9TVElOR19DUlQwICRvYmplY3RzIgotICAgIHNldCBsaWJzICIkSE9TVElOR19MSUJTIgotICAgIAotICAgIGlmIHsgW3doaWNoICRsZF0gPT0gMCB9IHRoZW4gewotCXBlcnJvciAiJGxkIGRvZXMgbm90IGV4aXN0IgotCXJldHVybiAwCi0gICAgfQotICAgIAotICAgIHZlcmJvc2UgLWxvZyAiJGxkICRIT1NUSU5HX0VNVSAtbyAkdGFyZ2V0ICRvYmpzICRsaWJzIgotICAgIAotICAgIGNhdGNoICJleGVjICRsZCAkSE9TVElOR19FTVUgLW8gJHRhcmdldCAkb2JqcyAkbGlicyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfc2ltcGxlX2xpbmsgCi0jCWxpbmsgYSBwcm9ncmFtIHVzaW5nIGxkLCB3aXRob3V0IGluY2x1ZGluZyBhbnkgbGlicmFyaWVzCi0jCi1wcm9jIGRlZmF1bHRfbGRfc2ltcGxlX2xpbmsgeyBsZCB0YXJnZXQgb2JqZWN0cyB9IHsKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgCi0gICAgaWYgeyBbd2hpY2ggJGxkXSA9PSAwIH0gdGhlbiB7Ci0JcGVycm9yICIkbGQgZG9lcyBub3QgZXhpc3QiCi0JcmV0dXJuIDAKLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAtbG9nICIkbGQgLW8gJHRhcmdldCAkb2JqZWN0cyIKLSAgICAKLSAgICBjYXRjaCAiZXhlYyAkbGQgLW8gJHRhcmdldCAkb2JqZWN0cyIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQotICAgICMgV2UgZG9uJ3QgY2FyZSBpZiB3ZSBnZXQgYSB3YXJuaW5nIGFib3V0IGEgbm9uLWV4aXN0ZW50IHN0YXJ0Ci0gICAgIyBzeW1ib2wsIHNpbmNlIHRoZSBkZWZhdWx0IGxpbmtlciBzY3JpcHQgbWlnaHQgdXNlIEVOVFJZLgotICAgIHJlZ3N1YiAtYWxsICIoXnxcbikoXFteXG5cXSo6IHdhcm5pbmc6IGNhbm5vdCBmaW5kIGVudHJ5IHN5bWJvbFxbXlxuXF0qXG4/KSIgJGV4ZWNfb3V0cHV0ICJcXDEiIGV4ZWNfb3V0cHV0Ci0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfY29tcGlsZSAKLSMJY29tcGlsZSBhbiBvYmplY3QgdXNpbmcgY2MKLSMKLXByb2MgZGVmYXVsdF9sZF9jb21waWxlIHsgY2Mgc291cmNlIG9iamVjdCB9IHsKLSAgICBnbG9iYWwgQ0ZMQUdTCi0gICAgZ2xvYmFsIHNyY2RpcgotICAgIGdsb2JhbCBzdWJkaXIKLSAgICBnbG9iYWwgaG9zdF90cmlwbGV0Ci0gICAgZ2xvYmFsIGdjY19nYXNfZmxhZwotCi0gICAgc2V0IGNjX3Byb2cgJGNjCi0gICAgaWYge1tsbGVuZ3RoICRjY19wcm9nXSA+IDF9IHRoZW4gewotCXNldCBjY19wcm9nIFtsaW5kZXggJGNjX3Byb2cgMF0KLSAgICB9Ci0gICAgaWYge1t3aGljaCAkY2NfcHJvZ10gPT0gMH0gdGhlbiB7Ci0JcGVycm9yICIkY2NfcHJvZyBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGNhdGNoICJleGVjIHJtIC1mICRvYmplY3QiIGV4ZWNfb3V0cHV0Ci0KLSAgICBzZXQgZmxhZ3MgIi1JJHNyY2Rpci8kc3ViZGlyICRDRkxBR1MiCi0KLSAgICAjIElmIHdlIGFyZSBjb21waWxpbmcgd2l0aCBnY2MsIHdlIHdhbnQgdG8gYWRkIGdjY19nYXNfZmxhZyB0bwotICAgICMgZmxhZ3MuICBSYXRoZXIgdGhhbiBkZXRlcm1pbmUgdGhpcyBpbiBzb21lIGNvbXBsZXggd2F5LCB3ZSBndWVzcwotICAgICMgYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIGNvbXBpbGVyLgotICAgIGlmIHtbc3RyaW5nIG1hdGNoICIqZ2NjKiIgJGNjXSB8fCBbc3RyaW5nIG1hdGNoICIqKysqIiAkY2NdfSB0aGVuIHsKLQlzZXQgZmxhZ3MgIiRnY2NfZ2FzX2ZsYWcgJGZsYWdzIgotICAgIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJGNjICRmbGFncyAtYyAkc291cmNlIC1vICRvYmplY3QiCi0KLSAgICBjYXRjaCAiZXhlYyAkY2MgJGZsYWdzIC1jICRzb3VyY2UgLW8gJG9iamVjdCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0JaWYgeyFbZmlsZSBleGlzdHMgJG9iamVjdF19IHRoZW4gewotCSAgICByZWdleHAgIi4qLyhcW14vXF0qKSQiICRzb3VyY2UgYWxsIGRvYmoKLQkgICAgcmVnc3ViICJcXC5jIiAkZG9iaiAiLm8iIHJlYWxvYmoKLQkgICAgdmVyYm9zZSAibG9va2luZyBmb3IgJHJlYWxvYmoiCi0JICAgIGlmIHtbZmlsZSBleGlzdHMgJHJlYWxvYmpdfSB0aGVuIHsKLQkJdmVyYm9zZSAtbG9nICJtdiAkcmVhbG9iaiAkb2JqZWN0IgotCQljYXRjaCAiZXhlYyBtdiAkcmVhbG9iaiAkb2JqZWN0IiBleGVjX291dHB1dAotCQlzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLQkJaWYgeyFbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF19IHRoZW4gewotCQkgICAgdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JCSAgICBwZXJyb3IgImNvdWxkIG5vdCBtb3ZlICRyZWFsb2JqIHRvICRvYmplY3QiCi0JCSAgICByZXR1cm4gMAotCQl9Ci0JICAgIH0gZWxzZSB7Ci0JCXBlcnJvciAiJG9iamVjdCBub3QgZm91bmQgYWZ0ZXIgY29tcGlsYXRpb24iCi0JCXJldHVybiAwCi0JICAgIH0KLQl9Ci0JcmV0dXJuIDEKLSAgICB9IGVsc2UgewotCXZlcmJvc2UgLWxvZyAiJGV4ZWNfb3V0cHV0IgotCXBlcnJvciAiJHNvdXJjZTogY29tcGlsYXRpb24gZmFpbGVkIgotCXJldHVybiAwCi0gICAgfQotfQotCi0jCi0jIGRlZmF1bHRfbGRfYXNzZW1ibGUKLSMJYXNzZW1ibGUgYSBmaWxlCi0jCi1wcm9jIGRlZmF1bHRfbGRfYXNzZW1ibGUgeyBhcyBzb3VyY2Ugb2JqZWN0IH0gewotICAgIGdsb2JhbCBBU0ZMQUdTCi0gICAgZ2xvYmFsIGhvc3RfdHJpcGxldAotICAgIAotICAgIGlmIHtbd2hpY2ggJGFzXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRhcyBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmICFbaW5mbyBleGlzdHMgQVNGTEFHU10geyBzZXQgQVNGTEFHUyAiIiB9Ci0KLSAgICB2ZXJib3NlIC1sb2cgIiRhcyAkQVNGTEFHUyAtbyAkb2JqZWN0ICRzb3VyY2UiCi0KLSAgICBjYXRjaCAiZXhlYyAkYXMgJEFTRkxBR1MgLW8gJG9iamVjdCAkc291cmNlIiBleGVjX291dHB1dAotICAgIHNldCBleGVjX291dHB1dCBbcHJ1bmVfd2FybmluZ3MgJGV4ZWNfb3V0cHV0XQotICAgIGlmIFtzdHJpbmcgbWF0Y2ggIiIgJGV4ZWNfb3V0cHV0XSB0aGVuIHsKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkc291cmNlOiBhc3NlbWJseSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgZGVmYXVsdF9sZF9ubQotIwlydW4gbm0gb24gYSBmaWxlLCBwdXR0aW5nIHRoZSByZXN1bHQgaW4gdGhlIGFycmF5IG5tX291dHB1dAotIwotcHJvYyBkZWZhdWx0X2xkX25tIHsgbm0gb2JqZWN0IH0gewotICAgIGdsb2JhbCBOTUZMQUdTCi0gICAgZ2xvYmFsIG5tX291dHB1dAotICAgIGdsb2JhbCBob3N0X3RyaXBsZXQKLQotICAgIGlmIHtbd2hpY2ggJG5tXSA9PSAwfSB0aGVuIHsKLQlwZXJyb3IgIiRubSBkb2VzIG5vdCBleGlzdCIKLQlyZXR1cm4gMAotICAgIH0KLQotICAgIGlmIHtbaW5mbyBleGlzdHMgbm1fb3V0cHV0XX0gewotICAgICAgdW5zZXQgbm1fb3V0cHV0Ci0gICAgfQotCi0gICAgaWYgIVtpbmZvIGV4aXN0cyBOTUZMQUdTXSB7IHNldCBOTUZMQUdTICIiIH0KLQotICAgIHZlcmJvc2UgLWxvZyAiJG5tICROTUZMQUdTICRvYmplY3QgPnRtcGRpci9ubS5vdXQiCi0KLSAgICBjYXRjaCAiZXhlYyAkbm0gJE5NRkxBR1MgJG9iamVjdCA+dG1wZGlyL25tLm91dCIgZXhlY19vdXRwdXQKLSAgICBzZXQgZXhlY19vdXRwdXQgW3BydW5lX3dhcm5pbmdzICRleGVjX291dHB1dF0KLSAgICBpZiBbc3RyaW5nIG1hdGNoICIiICRleGVjX291dHB1dF0gdGhlbiB7Ci0Jc2V0IGZpbGUgW29wZW4gdG1wZGlyL25tLm91dCByXQotCXdoaWxlIHsgW2dldHMgJGZpbGUgbGluZV0gIT0gLTEgfSB7Ci0JICAgIHZlcmJvc2UgIiRsaW5lIiAyCi0JICAgIGlmIFtyZWdleHAgIl4oXFswLTlhLWZBLUZcXSspIFxbYS16QS1aMC05XF0gKC4rKSQiICRsaW5lIHdob2xlIHZhbHVlIG5hbWVdIHsKLSAgICAgICAgICAgICAgICBzZXQgbmFtZSBbc3RyaW5nIHRyaW1sZWZ0ICRuYW1lICJfIl0KLQkJdmVyYm9zZSAiU2V0dGluZyBubV9vdXRwdXQoJG5hbWUpIHRvIDB4JHZhbHVlIiAyCi0JCXNldCBubV9vdXRwdXQoJG5hbWUpIDB4JHZhbHVlCi0JICAgIH0KLQl9Ci0JY2xvc2UgJGZpbGUKLQlyZXR1cm4gMQotICAgIH0gZWxzZSB7Ci0JdmVyYm9zZSAtbG9nICIkZXhlY19vdXRwdXQiCi0JcGVycm9yICIkb2JqZWN0OiBubSBmYWlsZWQiCi0JcmV0dXJuIDAKLSAgICB9Ci19Ci0KLSMKLSMgc2ltcGxlX2RpZmYKLSMJY29tcGFyZXMgdHdvIGZpbGVzIGxpbmUtYnktbGluZQotIwlyZXR1cm5zIGRpZmZlcmVuY2VzIGlmIGV4aXN0Ci0jCXJldHVybnMgbnVsbCBpZiBmaWxlKHMpIGNhbm5vdCBiZSBvcGVuZWQKLSMKLXByb2Mgc2ltcGxlX2RpZmYgeyBmaWxlXzEgZmlsZV8yIH0gewotICAgIGdsb2JhbCB0YXJnZXQKLQkKLSAgICBzZXQgZW9mIC0xCi0gICAgc2V0IGRpZmZlcmVuY2VzIDAKLSAgICAKLSAgICBpZiBbZmlsZSBleGlzdHMgJGZpbGVfMV0gdGhlbiB7Ci0Jc2V0IGZpbGVfYSBbb3BlbiAkZmlsZV8xIHJdCi0gICAgfSBlbHNlIHsKLQl3YXJuaW5nICIkZmlsZV8xIGRvZXNuJ3QgZXhpc3QiCi0JcmV0dXJuCi0gICAgfQotICAgIAotICAgIGlmIFtmaWxlIGV4aXN0cyAkZmlsZV8yXSB0aGVuIHsKLQlzZXQgZmlsZV9iIFtvcGVuICRmaWxlXzIgcl0KLSAgICB9IGVsc2UgewotCWZhaWwgIiRmaWxlXzIgZG9lc24ndCBleGlzdCIKLQlyZXR1cm4KLSAgICB9Ci0gICAgCi0gICAgdmVyYm9zZSAiIyBEaWZmJ2luZzogJGZpbGVfMSAkZmlsZV8yXG4iIDIKLSAgICAKLSAgICB3aGlsZSB7IFtnZXRzICRmaWxlX2EgbGluZV0gIT0gJGVvZiB9IHsKLQlpZiBbcmVnZXhwICJeIy4qJCIgJGxpbmVdIHRoZW4gewotCSAgICBjb250aW51ZQotCX0gZWxzZSB7Ci0JICAgIGxhcHBlbmQgbGlzdF9hICRsaW5lCi0JfQotICAgIH0KLSAgICBjbG9zZSAkZmlsZV9hCi0gICAgCi0gICAgd2hpbGUgeyBbZ2V0cyAkZmlsZV9iIGxpbmVdICE9ICRlb2YgfSB7Ci0JaWYgW3JlZ2V4cCAiXiMuKiQiICRsaW5lXSB0aGVuIHsKLQkgICAgY29udGludWUKLQl9IGVsc2UgewotCSAgICBsYXBwZW5kIGxpc3RfYiAkbGluZQotCX0KLSAgICB9Ci0gICAgY2xvc2UgJGZpbGVfYgotCi0gICAgZm9yIHsgc2V0IGkgMCB9IHsgJGkgPCBbbGxlbmd0aCAkbGlzdF9hXSB9IHsgaW5jciBpIH0gewotCXNldCBsaW5lX2EgW2xpbmRleCAkbGlzdF9hICRpXQotCXNldCBsaW5lX2IgW2xpbmRleCAkbGlzdF9iICRpXQotCi0JdmVyYm9zZSAiXHQkZmlsZV8xOiAkaTogJGxpbmVfYVxuIiAzCi0JdmVyYm9zZSAiXHQkZmlsZV8yOiAkaTogJGxpbmVfYlxuIiAzCi0JaWYgW3N0cmluZyBjb21wYXJlICRsaW5lX2EgJGxpbmVfYl0gdGhlbiB7Ci0JICAgIHZlcmJvc2UgLWxvZyAiXHQkZmlsZV8xOiAkaTogJGxpbmVfYVxuIgotCSAgICB2ZXJib3NlIC1sb2cgIlx0JGZpbGVfMjogJGk6ICRsaW5lX2JcbiIKLQotCSAgICBmYWlsICJUZXN0OiAkdGFyZ2V0IgotCSAgICByZXR1cm4KLQl9Ci0gICAgfQotICAgIAotICAgIGlmIHsgW2xsZW5ndGggJGxpc3RfYV0gIT0gW2xsZW5ndGggJGxpc3RfYl0gfSB7Ci0JZmFpbCAiVGVzdDogJHRhcmdldCIKLQlyZXR1cm4KLSAgICB9Ci0KLSAgICBpZiAkZGlmZmVyZW5jZXM8MSB0aGVuIHsKLQlwYXNzICJUZXN0OiAkdGFyZ2V0IgotICAgIH0KLX0KLQotIyBUaGlzIGRlZmluaXRpb24gaXMgdGFrZW4gZnJvbSBhbiB1bnJlbGVhc2VkIHZlcnNpb24gb2YgRGVqYUdudS4gIE9uY2UKLSMgdGhhdCB2ZXJzaW9uIGdldHMgcmVsZWFzZWQsIGFuZCBoYXMgYmVlbiBvdXQgaW4gdGhlIHdvcmxkIGZvciBhIGZldwotIyBtb250aHMgYXQgbGVhc3QsIGl0IG1heSBiZSBzYWZlIHRvIGRlbGV0ZSB0aGlzIGNvcHkuCi1pZiAhW3N0cmluZyBsZW5ndGggW2luZm8gcHJvYyBwcnVuZV93YXJuaW5nc11dIHsKLSAgICAjCi0gICAgIyBwcnVuZV93YXJuaW5ncyAtLSBkZWxldGUgdmFyaW91cyBzeXN0ZW0gdmVyYm9zaXRpZXMgZnJvbSBURVhUCi0gICAgIwotICAgICMgQW4gZXhhbXBsZSBpczoKLSAgICAjIGxkLnNvOiB3YXJuaW5nOiAvdXNyL2xpYi9saWJjLnNvLjEuOC4xIGhhcyBvbGRlciByZXZpc2lvbiB0aGFuIGV4cGVjdGVkIDkKLSAgICAjCi0gICAgIyBTaXRlcyB3aXRoIHBhcnRpY3VsYXIgdmVyYm9zZSBvcydzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMgaW4gc2l0ZS5leHAuCi0gICAgIwotICAgIHByb2MgcHJ1bmVfd2FybmluZ3MgeyB0ZXh0IH0gewotCSMgVGhpcyBpcyBmcm9tIHN1bjQncy4gIERvIGl0IGZvciBhbGwgbWFjaGluZXMgZm9yIG5vdy4KLQkjIFRoZSAiXFwxIiBpcyB0byB0cnkgdG8gcHJlc2VydmUgYSAiXG4iIGJ1dCBvbmx5IGlmIG5lY2Vzc2FyeS4KLQlyZWdzdWIgLWFsbCAiKF58XG4pKGxkLnNvOiB3YXJuaW5nOlxbXlxuXF0qXG4/KSsiICR0ZXh0ICJcXDEiIHRleHQKLQotCSMgSXQgbWlnaHQgYmUgdGVtcHRpbmcgdG8gZ2V0IGNhcnJpZWQgYXdheSBhbmQgZGVsZXRlIGJsYW5rIGxpbmVzLCBldGMuCi0JIyBKdXN0IGRlbGV0ZSAqZXhhY3RseSogd2hhdCB3ZSdyZSBhc2sgdG8sIGFuZCB0aGF0J3MgaXQuCi0JcmV0dXJuICR0ZXh0Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L0NPUFlJTkcuTElCIGIvbGliaWJlcnR5L0NPUFlJTkcuTElCCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFhM2QxLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9DT1BZSU5HLkxJQgorKysgL2Rldi9udWxsCkBAIC0xLDQ4MiArMCwwIEBACi0JCSAgR05VIExJQlJBUlkgR0VORVJBTCBQVUJMSUMgTElDRU5TRQotCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKLQotIENvcHlyaWdodCAoQykgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCi0gRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCi0gb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCi0KLVtUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IEdQTC4gIEl0IGlzCi0gbnVtYmVyZWQgMiBiZWNhdXNlIGl0IGdvZXMgd2l0aCB2ZXJzaW9uIDIgb2YgdGhlIG9yZGluYXJ5IEdQTC5dCi0KLQkJCSAgICBQcmVhbWJsZQotCi0gIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKLWZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlcyBhcmUgaW50ZW5kZWQgdG8gZ3VhcmFudGVlIHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlCi1mcmVlIHNvZnR3YXJlLS10byBtYWtlIHN1cmUgdGhlIHNvZnR3YXJlIGlzIGZyZWUgZm9yIGFsbCBpdHMgdXNlcnMuCi0KLSAgVGhpcyBsaWNlbnNlLCB0aGUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIHNvbWUKLXNwZWNpYWxseSBkZXNpZ25hdGVkIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBzb2Z0d2FyZSwgYW5kIHRvIGFueQotb3RoZXIgbGlicmFyaWVzIHdob3NlIGF1dGhvcnMgZGVjaWRlIHRvIHVzZSBpdC4gIFlvdSBjYW4gdXNlIGl0IGZvcgoteW91ciBsaWJyYXJpZXMsIHRvby4KLQotICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90Ci1wcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91Ci1oYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCi10aGlzIHNlcnZpY2UgaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQKLWlmIHlvdSB3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0Ci1pbiBuZXcgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCi0KLSAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZAotYW55b25lIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLgotVGhlc2UgcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZgoteW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBsaWJyYXJ5LCBvciBpZiB5b3UgbW9kaWZ5IGl0LgotCi0gIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIGxpYnJhcnksIHdoZXRoZXIgZ3JhdGlzCi1vciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB3ZSBnYXZlCi15b3UuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlCi1jb2RlLiAgSWYgeW91IGxpbmsgYSBwcm9ncmFtIHdpdGggdGhlIGxpYnJhcnksIHlvdSBtdXN0IHByb3ZpZGUKLWNvbXBsZXRlIG9iamVjdCBmaWxlcyB0byB0aGUgcmVjaXBpZW50cyBzbyB0aGF0IHRoZXkgY2FuIHJlbGluayB0aGVtCi13aXRoIHRoZSBsaWJyYXJ5LCBhZnRlciBtYWtpbmcgY2hhbmdlcyB0byB0aGUgbGlicmFyeSBhbmQgcmVjb21waWxpbmcKLWl0LiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgotCi0gIE91ciBtZXRob2Qgb2YgcHJvdGVjdGluZyB5b3VyIHJpZ2h0cyBoYXMgdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0Ci10aGUgbGlicmFyeSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbAotcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhlIGxpYnJhcnkuCi0KLSAgQWxzbywgZm9yIGVhY2ggZGlzdHJpYnV0b3IncyBwcm90ZWN0aW9uLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgotdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKLWxpYnJhcnkuICBJZiB0aGUgbGlicmFyeSBpcyBtb2RpZmllZCBieSBzb21lb25lIGVsc2UgYW5kIHBhc3NlZCBvbiwgd2UKLXdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwKLXZlcnNpb24sIHNvIHRoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24KLXRoZSBvcmlnaW5hbCBhdXRob3JzJyByZXB1dGF0aW9ucy4KLQwKLSAgRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUKLXBhdGVudHMuICBXZSB3aXNoIHRvIGF2b2lkIHRoZSBkYW5nZXIgdGhhdCBjb21wYW5pZXMgZGlzdHJpYnV0aW5nIGZyZWUKLXNvZnR3YXJlIHdpbGwgaW5kaXZpZHVhbGx5IG9idGFpbiBwYXRlbnQgbGljZW5zZXMsIHRodXMgaW4gZWZmZWN0Ci10cmFuc2Zvcm1pbmcgdGhlIHByb2dyYW0gaW50byBwcm9wcmlldGFyeSBzb2Z0d2FyZS4gIFRvIHByZXZlbnQgdGhpcywKLXdlIGhhdmUgbWFkZSBpdCBjbGVhciB0aGF0IGFueSBwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncwotZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KLQotICBNb3N0IEdOVSBzb2Z0d2FyZSwgaW5jbHVkaW5nIHNvbWUgbGlicmFyaWVzLCBpcyBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHdoaWNoIHdhcyBkZXNpZ25lZCBmb3IgdXRpbGl0eSBwcm9ncmFtcy4gIFRoaXMKLWxpY2Vuc2UsIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBhcHBsaWVzIHRvIGNlcnRhaW4KLWRlc2lnbmF0ZWQgbGlicmFyaWVzLiAgVGhpcyBsaWNlbnNlIGlzIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRpbmFyeQotb25lOyBiZSBzdXJlIHRvIHJlYWQgaXQgaW4gZnVsbCwgYW5kIGRvbid0IGFzc3VtZSB0aGF0IGFueXRoaW5nIGluIGl0IGlzCi10aGUgc2FtZSBhcyBpbiB0aGUgb3JkaW5hcnkgbGljZW5zZS4KLQotICBUaGUgcmVhc29uIHdlIGhhdmUgYSBzZXBhcmF0ZSBwdWJsaWMgbGljZW5zZSBmb3Igc29tZSBsaWJyYXJpZXMgaXMgdGhhdAotdGhleSBibHVyIHRoZSBkaXN0aW5jdGlvbiB3ZSB1c3VhbGx5IG1ha2UgYmV0d2VlbiBtb2RpZnlpbmcgb3IgYWRkaW5nIHRvIGEKLXByb2dyYW0gYW5kIHNpbXBseSB1c2luZyBpdC4gIExpbmtpbmcgYSBwcm9ncmFtIHdpdGggYSBsaWJyYXJ5LCB3aXRob3V0Ci1jaGFuZ2luZyB0aGUgbGlicmFyeSwgaXMgaW4gc29tZSBzZW5zZSBzaW1wbHkgdXNpbmcgdGhlIGxpYnJhcnksIGFuZCBpcwotYW5hbG9nb3VzIHRvIHJ1bm5pbmcgYSB1dGlsaXR5IHByb2dyYW0gb3IgYXBwbGljYXRpb24gcHJvZ3JhbS4gIEhvd2V2ZXIsIGluCi1hIHRleHR1YWwgYW5kIGxlZ2FsIHNlbnNlLCB0aGUgbGlua2VkIGV4ZWN1dGFibGUgaXMgYSBjb21iaW5lZCB3b3JrLCBhCi1kZXJpdmF0aXZlIG9mIHRoZSBvcmlnaW5hbCBsaWJyYXJ5LCBhbmQgdGhlIG9yZGluYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLXRyZWF0cyBpdCBhcyBzdWNoLgotCi0gIEJlY2F1c2Ugb2YgdGhpcyBibHVycmVkIGRpc3RpbmN0aW9uLCB1c2luZyB0aGUgb3JkaW5hcnkgR2VuZXJhbAotUHVibGljIExpY2Vuc2UgZm9yIGxpYnJhcmllcyBkaWQgbm90IGVmZmVjdGl2ZWx5IHByb21vdGUgc29mdHdhcmUKLXNoYXJpbmcsIGJlY2F1c2UgbW9zdCBkZXZlbG9wZXJzIGRpZCBub3QgdXNlIHRoZSBsaWJyYXJpZXMuICBXZQotY29uY2x1ZGVkIHRoYXQgd2Vha2VyIGNvbmRpdGlvbnMgbWlnaHQgcHJvbW90ZSBzaGFyaW5nIGJldHRlci4KLQotICBIb3dldmVyLCB1bnJlc3RyaWN0ZWQgbGlua2luZyBvZiBub24tZnJlZSBwcm9ncmFtcyB3b3VsZCBkZXByaXZlIHRoZQotdXNlcnMgb2YgdGhvc2UgcHJvZ3JhbXMgb2YgYWxsIGJlbmVmaXQgZnJvbSB0aGUgZnJlZSBzdGF0dXMgb2YgdGhlCi1saWJyYXJpZXMgdGhlbXNlbHZlcy4gIFRoaXMgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvCi1wZXJtaXQgZGV2ZWxvcGVycyBvZiBub24tZnJlZSBwcm9ncmFtcyB0byB1c2UgZnJlZSBsaWJyYXJpZXMsIHdoaWxlCi1wcmVzZXJ2aW5nIHlvdXIgZnJlZWRvbSBhcyBhIHVzZXIgb2Ygc3VjaCBwcm9ncmFtcyB0byBjaGFuZ2UgdGhlIGZyZWUKLWxpYnJhcmllcyB0aGF0IGFyZSBpbmNvcnBvcmF0ZWQgaW4gdGhlbS4gIChXZSBoYXZlIG5vdCBzZWVuIGhvdyB0byBhY2hpZXZlCi10aGlzIGFzIHJlZ2FyZHMgY2hhbmdlcyBpbiBoZWFkZXIgZmlsZXMsIGJ1dCB3ZSBoYXZlIGFjaGlldmVkIGl0IGFzIHJlZ2FyZHMKLWNoYW5nZXMgaW4gdGhlIGFjdHVhbCBmdW5jdGlvbnMgb2YgdGhlIExpYnJhcnkuKSAgVGhlIGhvcGUgaXMgdGhhdCB0aGlzCi13aWxsIGxlYWQgdG8gZmFzdGVyIGRldmVsb3BtZW50IG9mIGZyZWUgbGlicmFyaWVzLgotCi0gIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCi1tb2RpZmljYXRpb24gZm9sbG93LiAgUGF5IGNsb3NlIGF0dGVudGlvbiB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEKLSJ3b3JrIGJhc2VkIG9uIHRoZSBsaWJyYXJ5IiBhbmQgYSAid29yayB0aGF0IHVzZXMgdGhlIGxpYnJhcnkiLiAgVGhlCi1mb3JtZXIgY29udGFpbnMgY29kZSBkZXJpdmVkIGZyb20gdGhlIGxpYnJhcnksIHdoaWxlIHRoZSBsYXR0ZXIgb25seQotd29ya3MgdG9nZXRoZXIgd2l0aCB0aGUgbGlicmFyeS4KLQotICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgbGlicmFyeSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBvcmRpbmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByYXRoZXIgdGhhbiBieSB0aGlzIHNwZWNpYWwgb25lLgotDAotCQkgIEdOVSBMSUJSQVJZIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgotCi0gIDAuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgYXBwbGllcyB0byBhbnkgc29mdHdhcmUgbGlicmFyeSB3aGljaAotY29udGFpbnMgYSBub3RpY2UgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIG9yIG90aGVyIGF1dGhvcml6ZWQKLXBhcnR5IHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGlicmFyeQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoYWxzbyBjYWxsZWQgInRoaXMgTGljZW5zZSIpLiAgRWFjaCBsaWNlbnNlZSBpcwotYWRkcmVzc2VkIGFzICJ5b3UiLgotCi0gIEEgImxpYnJhcnkiIG1lYW5zIGEgY29sbGVjdGlvbiBvZiBzb2Z0d2FyZSBmdW5jdGlvbnMgYW5kL29yIGRhdGEKLXByZXBhcmVkIHNvIGFzIHRvIGJlIGNvbnZlbmllbnRseSBsaW5rZWQgd2l0aCBhcHBsaWNhdGlvbiBwcm9ncmFtcwotKHdoaWNoIHVzZSBzb21lIG9mIHRob3NlIGZ1bmN0aW9ucyBhbmQgZGF0YSkgdG8gZm9ybSBleGVjdXRhYmxlcy4KLQotICBUaGUgIkxpYnJhcnkiLCBiZWxvdywgcmVmZXJzIHRvIGFueSBzdWNoIHNvZnR3YXJlIGxpYnJhcnkgb3Igd29yawotd2hpY2ggaGFzIGJlZW4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlc2UgdGVybXMuICBBICJ3b3JrIGJhc2VkIG9uIHRoZQotTGlicmFyeSIgbWVhbnMgZWl0aGVyIHRoZSBMaWJyYXJ5IG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIKLWNvcHlyaWdodCBsYXc6IHRoYXQgaXMgdG8gc2F5LCBhIHdvcmsgY29udGFpbmluZyB0aGUgTGlicmFyeSBvciBhCi1wb3J0aW9uIG9mIGl0LCBlaXRoZXIgdmVyYmF0aW0gb3Igd2l0aCBtb2RpZmljYXRpb25zIGFuZC9vciB0cmFuc2xhdGVkCi1zdHJhaWdodGZvcndhcmRseSBpbnRvIGFub3RoZXIgbGFuZ3VhZ2UuICAoSGVyZWluYWZ0ZXIsIHRyYW5zbGF0aW9uIGlzCi1pbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQotCi0gICJTb3VyY2UgY29kZSIgZm9yIGEgd29yayBtZWFucyB0aGUgcHJlZmVycmVkIGZvcm0gb2YgdGhlIHdvcmsgZm9yCi1tYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gIEZvciBhIGxpYnJhcnksIGNvbXBsZXRlIHNvdXJjZSBjb2RlIG1lYW5zCi1hbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkgYXNzb2NpYXRlZAotaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uCi1hbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90Ci1jb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuICBUaGUgYWN0IG9mCi1ydW5uaW5nIGEgcHJvZ3JhbSB1c2luZyB0aGUgTGlicmFyeSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIG91dHB1dCBmcm9tCi1zdWNoIGEgcHJvZ3JhbSBpcyBjb3ZlcmVkIG9ubHkgaWYgaXRzIGNvbnRlbnRzIGNvbnN0aXR1dGUgYSB3b3JrIGJhc2VkCi1vbiB0aGUgTGlicmFyeSAoaW5kZXBlbmRlbnQgb2YgdGhlIHVzZSBvZiB0aGUgTGlicmFyeSBpbiBhIHRvb2wgZm9yCi13cml0aW5nIGl0KS4gIFdoZXRoZXIgdGhhdCBpcyB0cnVlIGRlcGVuZHMgb24gd2hhdCB0aGUgTGlicmFyeSBkb2VzCi1hbmQgd2hhdCB0aGUgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlIExpYnJhcnkgZG9lcy4KLSAgCi0gIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIExpYnJhcnkncwotY29tcGxldGUgc291cmNlIGNvZGUgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQKLXlvdSBjb25zcGljdW91c2x5IGFuZCBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuCi1hcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdAotYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkKLXdhcnJhbnR5OyBhbmQgZGlzdHJpYnV0ZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlCi1MaWJyYXJ5LgotCi0gIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksCi1hbmQgeW91IG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhCi1mZWUuCi0MCi0gIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIExpYnJhcnkgb3IgYW55IHBvcnRpb24KLW9mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCBhbmQgY29weSBhbmQKLWRpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQotYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKLQotICAgIGEpIFRoZSBtb2RpZmllZCB3b3JrIG11c3QgaXRzZWxmIGJlIGEgc29mdHdhcmUgbGlicmFyeS4KLQotICAgIGIpIFlvdSBtdXN0IGNhdXNlIHRoZSBmaWxlcyBtb2RpZmllZCB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCi0KLSAgICBjKSBZb3UgbXVzdCBjYXVzZSB0aGUgd2hvbGUgb2YgdGhlIHdvcmsgdG8gYmUgbGljZW5zZWQgYXQgbm8KLSAgICBjaGFyZ2UgdG8gYWxsIHRoaXJkIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KLQotICAgIGQpIElmIGEgZmFjaWxpdHkgaW4gdGhlIG1vZGlmaWVkIExpYnJhcnkgcmVmZXJzIHRvIGEgZnVuY3Rpb24gb3IgYQotICAgIHRhYmxlIG9mIGRhdGEgdG8gYmUgc3VwcGxpZWQgYnkgYW4gYXBwbGljYXRpb24gcHJvZ3JhbSB0aGF0IHVzZXMKLSAgICB0aGUgZmFjaWxpdHksIG90aGVyIHRoYW4gYXMgYW4gYXJndW1lbnQgcGFzc2VkIHdoZW4gdGhlIGZhY2lsaXR5Ci0gICAgaXMgaW52b2tlZCwgdGhlbiB5b3UgbXVzdCBtYWtlIGEgZ29vZCBmYWl0aCBlZmZvcnQgdG8gZW5zdXJlIHRoYXQsCi0gICAgaW4gdGhlIGV2ZW50IGFuIGFwcGxpY2F0aW9uIGRvZXMgbm90IHN1cHBseSBzdWNoIGZ1bmN0aW9uIG9yCi0gICAgdGFibGUsIHRoZSBmYWNpbGl0eSBzdGlsbCBvcGVyYXRlcywgYW5kIHBlcmZvcm1zIHdoYXRldmVyIHBhcnQgb2YKLSAgICBpdHMgcHVycG9zZSByZW1haW5zIG1lYW5pbmdmdWwuCi0KLSAgICAoRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gaW4gYSBsaWJyYXJ5IHRvIGNvbXB1dGUgc3F1YXJlIHJvb3RzIGhhcwotICAgIGEgcHVycG9zZSB0aGF0IGlzIGVudGlyZWx5IHdlbGwtZGVmaW5lZCBpbmRlcGVuZGVudCBvZiB0aGUKLSAgICBhcHBsaWNhdGlvbi4gIFRoZXJlZm9yZSwgU3Vic2VjdGlvbiAyZCByZXF1aXJlcyB0aGF0IGFueQotICAgIGFwcGxpY2F0aW9uLXN1cHBsaWVkIGZ1bmN0aW9uIG9yIHRhYmxlIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBtdXN0Ci0gICAgYmUgb3B0aW9uYWw6IGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzdXBwbHkgaXQsIHRoZSBzcXVhcmUKLSAgICByb290IGZ1bmN0aW9uIG11c3Qgc3RpbGwgY29tcHV0ZSBzcXVhcmUgcm9vdHMuKQotCi1UaGVzZSByZXF1aXJlbWVudHMgYXBwbHkgdG8gdGhlIG1vZGlmaWVkIHdvcmsgYXMgYSB3aG9sZS4gIElmCi1pZGVudGlmaWFibGUgc2VjdGlvbnMgb2YgdGhhdCB3b3JrIGFyZSBub3QgZGVyaXZlZCBmcm9tIHRoZSBMaWJyYXJ5LAotYW5kIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCi10aGVtc2VsdmVzLCB0aGVuIHRoaXMgTGljZW5zZSwgYW5kIGl0cyB0ZXJtcywgZG8gbm90IGFwcGx5IHRvIHRob3NlCi1zZWN0aW9ucyB3aGVuIHlvdSBkaXN0cmlidXRlIHRoZW0gYXMgc2VwYXJhdGUgd29ya3MuICBCdXQgd2hlbiB5b3UKLWRpc3RyaWJ1dGUgdGhlIHNhbWUgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZAotb24gdGhlIExpYnJhcnksIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mCi10aGlzIExpY2Vuc2UsIHdob3NlIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZQotZW50aXJlIHdob2xlLCBhbmQgdGh1cyB0byBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlCi1pdC4KLQotVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Ci15b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KLWV4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgotY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgTGlicmFyeS4KLQotSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgTGlicmFyeQotd2l0aCB0aGUgTGlicmFyeSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIExpYnJhcnkpIG9uIGEgdm9sdW1lIG9mCi1hIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgotdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICAzLiBZb3UgbWF5IG9wdCB0byBhcHBseSB0aGUgdGVybXMgb2YgdGhlIG9yZGluYXJ5IEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZSB0byBhIGdpdmVuIGNvcHkgb2YgdGhlIExpYnJhcnkuICBUbyBkbwotdGhpcywgeW91IG11c3QgYWx0ZXIgYWxsIHRoZSBub3RpY2VzIHRoYXQgcmVmZXIgdG8gdGhpcyBMaWNlbnNlLCBzbwotdGhhdCB0aGV5IHJlZmVyIHRvIHRoZSBvcmRpbmFyeSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLAotaW5zdGVhZCBvZiB0byB0aGlzIExpY2Vuc2UuICAoSWYgYSBuZXdlciB2ZXJzaW9uIHRoYW4gdmVyc2lvbiAyIG9mIHRoZQotb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaGFzIGFwcGVhcmVkLCB0aGVuIHlvdSBjYW4gc3BlY2lmeQotdGhhdCB2ZXJzaW9uIGluc3RlYWQgaWYgeW91IHdpc2guKSAgRG8gbm90IG1ha2UgYW55IG90aGVyIGNoYW5nZSBpbgotdGhlc2Ugbm90aWNlcy4KLQwKLSAgT25jZSB0aGlzIGNoYW5nZSBpcyBtYWRlIGluIGEgZ2l2ZW4gY29weSwgaXQgaXMgaXJyZXZlcnNpYmxlIGZvcgotdGhhdCBjb3B5LCBzbyB0aGUgb3JkaW5hcnkgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXBwbGllcyB0byBhbGwKLXN1YnNlcXVlbnQgY29waWVzIGFuZCBkZXJpdmF0aXZlIHdvcmtzIG1hZGUgZnJvbSB0aGF0IGNvcHkuCi0KLSAgVGhpcyBvcHRpb24gaXMgdXNlZnVsIHdoZW4geW91IHdpc2ggdG8gY29weSBwYXJ0IG9mIHRoZSBjb2RlIG9mCi10aGUgTGlicmFyeSBpbnRvIGEgcHJvZ3JhbSB0aGF0IGlzIG5vdCBhIGxpYnJhcnkuCi0KLSAgNC4gWW91IG1heSBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhIHBvcnRpb24gb3IKLWRlcml2YXRpdmUgb2YgaXQsIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtCi11bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhY2NvbXBhbnkKLWl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZSBzb3VyY2UgY29kZSwgd2hpY2gKLW11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlLgotCi0gIElmIGRpc3RyaWJ1dGlvbiBvZiBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci1mcm9tIGEgZGVzaWduYXRlZCBwbGFjZSwgdGhlbiBvZmZlcmluZyBlcXVpdmFsZW50IGFjY2VzcyB0byBjb3B5IHRoZQotc291cmNlIGNvZGUgZnJvbSB0aGUgc2FtZSBwbGFjZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50IHRvCi1kaXN0cmlidXRlIHRoZSBzb3VyY2UgY29kZSwgZXZlbiB0aG91Z2ggdGhpcmQgcGFydGllcyBhcmUgbm90Ci1jb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlIGFsb25nIHdpdGggdGhlIG9iamVjdCBjb2RlLgotCi0gIDUuIEEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIG5vIGRlcml2YXRpdmUgb2YgYW55IHBvcnRpb24gb2YgdGhlCi1MaWJyYXJ5LCBidXQgaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIHRoZSBMaWJyYXJ5IGJ5IGJlaW5nIGNvbXBpbGVkIG9yCi1saW5rZWQgd2l0aCBpdCwgaXMgY2FsbGVkIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5Ii4gIFN1Y2ggYQotd29yaywgaW4gaXNvbGF0aW9uLCBpcyBub3QgYSBkZXJpdmF0aXZlIHdvcmsgb2YgdGhlIExpYnJhcnksIGFuZAotdGhlcmVmb3JlIGZhbGxzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KLQotICBIb3dldmVyLCBsaW5raW5nIGEgIndvcmsgdGhhdCB1c2VzIHRoZSBMaWJyYXJ5IiB3aXRoIHRoZSBMaWJyYXJ5Ci1jcmVhdGVzIGFuIGV4ZWN1dGFibGUgdGhhdCBpcyBhIGRlcml2YXRpdmUgb2YgdGhlIExpYnJhcnkgKGJlY2F1c2UgaXQKLWNvbnRhaW5zIHBvcnRpb25zIG9mIHRoZSBMaWJyYXJ5KSwgcmF0aGVyIHRoYW4gYSAid29yayB0aGF0IHVzZXMgdGhlCi1saWJyYXJ5Ii4gIFRoZSBleGVjdXRhYmxlIGlzIHRoZXJlZm9yZSBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZS4KLVNlY3Rpb24gNiBzdGF0ZXMgdGVybXMgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzdWNoIGV4ZWN1dGFibGVzLgotCi0gIFdoZW4gYSAid29yayB0aGF0IHVzZXMgdGhlIExpYnJhcnkiIHVzZXMgbWF0ZXJpYWwgZnJvbSBhIGhlYWRlciBmaWxlCi10aGF0IGlzIHBhcnQgb2YgdGhlIExpYnJhcnksIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgbWF5IGJlIGEKLWRlcml2YXRpdmUgd29yayBvZiB0aGUgTGlicmFyeSBldmVuIHRob3VnaCB0aGUgc291cmNlIGNvZGUgaXMgbm90LgotV2hldGhlciB0aGlzIGlzIHRydWUgaXMgZXNwZWNpYWxseSBzaWduaWZpY2FudCBpZiB0aGUgd29yayBjYW4gYmUKLWxpbmtlZCB3aXRob3V0IHRoZSBMaWJyYXJ5LCBvciBpZiB0aGUgd29yayBpcyBpdHNlbGYgYSBsaWJyYXJ5LiAgVGhlCi10aHJlc2hvbGQgZm9yIHRoaXMgdG8gYmUgdHJ1ZSBpcyBub3QgcHJlY2lzZWx5IGRlZmluZWQgYnkgbGF3LgotCi0gIElmIHN1Y2ggYW4gb2JqZWN0IGZpbGUgdXNlcyBvbmx5IG51bWVyaWNhbCBwYXJhbWV0ZXJzLCBkYXRhCi1zdHJ1Y3R1cmUgbGF5b3V0cyBhbmQgYWNjZXNzb3JzLCBhbmQgc21hbGwgbWFjcm9zIGFuZCBzbWFsbCBpbmxpbmUKLWZ1bmN0aW9ucyAodGVuIGxpbmVzIG9yIGxlc3MgaW4gbGVuZ3RoKSwgdGhlbiB0aGUgdXNlIG9mIHRoZSBvYmplY3QKLWZpbGUgaXMgdW5yZXN0cmljdGVkLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMgbGVnYWxseSBhIGRlcml2YXRpdmUKLXdvcmsuICAoRXhlY3V0YWJsZXMgY29udGFpbmluZyB0aGlzIG9iamVjdCBjb2RlIHBsdXMgcG9ydGlvbnMgb2YgdGhlCi1MaWJyYXJ5IHdpbGwgc3RpbGwgZmFsbCB1bmRlciBTZWN0aW9uIDYuKQotCi0gIE90aGVyd2lzZSwgaWYgdGhlIHdvcmsgaXMgYSBkZXJpdmF0aXZlIG9mIHRoZSBMaWJyYXJ5LCB5b3UgbWF5Ci1kaXN0cmlidXRlIHRoZSBvYmplY3QgY29kZSBmb3IgdGhlIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gNi4KLUFueSBleGVjdXRhYmxlcyBjb250YWluaW5nIHRoYXQgd29yayBhbHNvIGZhbGwgdW5kZXIgU2VjdGlvbiA2LAotd2hldGhlciBvciBub3QgdGhleSBhcmUgbGlua2VkIGRpcmVjdGx5IHdpdGggdGhlIExpYnJhcnkgaXRzZWxmLgotDAotICA2LiBBcyBhbiBleGNlcHRpb24gdG8gdGhlIFNlY3Rpb25zIGFib3ZlLCB5b3UgbWF5IGFsc28gY29tcGlsZSBvcgotbGluayBhICJ3b3JrIHRoYXQgdXNlcyB0aGUgTGlicmFyeSIgd2l0aCB0aGUgTGlicmFyeSB0byBwcm9kdWNlIGEKLXdvcmsgY29udGFpbmluZyBwb3J0aW9ucyBvZiB0aGUgTGlicmFyeSwgYW5kIGRpc3RyaWJ1dGUgdGhhdCB3b3JrCi11bmRlciB0ZXJtcyBvZiB5b3VyIGNob2ljZSwgcHJvdmlkZWQgdGhhdCB0aGUgdGVybXMgcGVybWl0Ci1tb2RpZmljYXRpb24gb2YgdGhlIHdvcmsgZm9yIHRoZSBjdXN0b21lcidzIG93biB1c2UgYW5kIHJldmVyc2UKLWVuZ2luZWVyaW5nIGZvciBkZWJ1Z2dpbmcgc3VjaCBtb2RpZmljYXRpb25zLgotCi0gIFlvdSBtdXN0IGdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIGVhY2ggY29weSBvZiB0aGUgd29yayB0aGF0IHRoZQotTGlicmFyeSBpcyB1c2VkIGluIGl0IGFuZCB0aGF0IHRoZSBMaWJyYXJ5IGFuZCBpdHMgdXNlIGFyZSBjb3ZlcmVkIGJ5Ci10aGlzIExpY2Vuc2UuICBZb3UgbXVzdCBzdXBwbHkgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmIHRoZSB3b3JrCi1kdXJpbmcgZXhlY3V0aW9uIGRpc3BsYXlzIGNvcHlyaWdodCBub3RpY2VzLCB5b3UgbXVzdCBpbmNsdWRlIHRoZQotY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIExpYnJhcnkgYW1vbmcgdGhlbSwgYXMgd2VsbCBhcyBhIHJlZmVyZW5jZQotZGlyZWN0aW5nIHRoZSB1c2VyIHRvIHRoZSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIEFsc28sIHlvdSBtdXN0IGRvIG9uZQotb2YgdGhlc2UgdGhpbmdzOgotCi0gICAgYSkgQWNjb21wYW55IHRoZSB3b3JrIHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcKLSAgICBtYWNoaW5lLXJlYWRhYmxlIHNvdXJjZSBjb2RlIGZvciB0aGUgTGlicmFyeSBpbmNsdWRpbmcgd2hhdGV2ZXIKLSAgICBjaGFuZ2VzIHdlcmUgdXNlZCBpbiB0aGUgd29yayAod2hpY2ggbXVzdCBiZSBkaXN0cmlidXRlZCB1bmRlcgotICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUpOyBhbmQsIGlmIHRoZSB3b3JrIGlzIGFuIGV4ZWN1dGFibGUgbGlua2VkCi0gICAgd2l0aCB0aGUgTGlicmFyeSwgd2l0aCB0aGUgY29tcGxldGUgbWFjaGluZS1yZWFkYWJsZSAid29yayB0aGF0Ci0gICAgdXNlcyB0aGUgTGlicmFyeSIsIGFzIG9iamVjdCBjb2RlIGFuZC9vciBzb3VyY2UgY29kZSwgc28gdGhhdCB0aGUKLSAgICB1c2VyIGNhbiBtb2RpZnkgdGhlIExpYnJhcnkgYW5kIHRoZW4gcmVsaW5rIHRvIHByb2R1Y2UgYSBtb2RpZmllZAotICAgIGV4ZWN1dGFibGUgY29udGFpbmluZyB0aGUgbW9kaWZpZWQgTGlicmFyeS4gIChJdCBpcyB1bmRlcnN0b29kCi0gICAgdGhhdCB0aGUgdXNlciB3aG8gY2hhbmdlcyB0aGUgY29udGVudHMgb2YgZGVmaW5pdGlvbnMgZmlsZXMgaW4gdGhlCi0gICAgTGlicmFyeSB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSBhYmxlIHRvIHJlY29tcGlsZSB0aGUgYXBwbGljYXRpb24KLSAgICB0byB1c2UgdGhlIG1vZGlmaWVkIGRlZmluaXRpb25zLikKLQotICAgIGIpIEFjY29tcGFueSB0aGUgd29yayB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0Ci0gICAgbGVhc3QgdGhyZWUgeWVhcnMsIHRvIGdpdmUgdGhlIHNhbWUgdXNlciB0aGUgbWF0ZXJpYWxzCi0gICAgc3BlY2lmaWVkIGluIFN1YnNlY3Rpb24gNmEsIGFib3ZlLCBmb3IgYSBjaGFyZ2Ugbm8gbW9yZQotICAgIHRoYW4gdGhlIGNvc3Qgb2YgcGVyZm9ybWluZyB0aGlzIGRpc3RyaWJ1dGlvbi4KLQotICAgIGMpIElmIGRpc3RyaWJ1dGlvbiBvZiB0aGUgd29yayBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcyB0byBjb3B5Ci0gICAgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIGNvcHkgdGhlIGFib3ZlCi0gICAgc3BlY2lmaWVkIG1hdGVyaWFscyBmcm9tIHRoZSBzYW1lIHBsYWNlLgotCi0gICAgZCkgVmVyaWZ5IHRoYXQgdGhlIHVzZXIgaGFzIGFscmVhZHkgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZXNlCi0gICAgbWF0ZXJpYWxzIG9yIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBzZW50IHRoaXMgdXNlciBhIGNvcHkuCi0KLSAgRm9yIGFuIGV4ZWN1dGFibGUsIHRoZSByZXF1aXJlZCBmb3JtIG9mIHRoZSAid29yayB0aGF0IHVzZXMgdGhlCi1MaWJyYXJ5IiBtdXN0IGluY2x1ZGUgYW55IGRhdGEgYW5kIHV0aWxpdHkgcHJvZ3JhbXMgbmVlZGVkIGZvcgotcmVwcm9kdWNpbmcgdGhlIGV4ZWN1dGFibGUgZnJvbSBpdC4gIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24sCi10aGUgc291cmNlIGNvZGUgZGlzdHJpYnV0ZWQgbmVlZCBub3QgaW5jbHVkZSBhbnl0aGluZyB0aGF0IGlzIG5vcm1hbGx5Ci1kaXN0cmlidXRlZCAoaW4gZWl0aGVyIHNvdXJjZSBvciBiaW5hcnkgZm9ybSkgd2l0aCB0aGUgbWFqb3IKLWNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KLXdoaWNoIHRoZSBleGVjdXRhYmxlIHJ1bnMsIHVubGVzcyB0aGF0IGNvbXBvbmVudCBpdHNlbGYgYWNjb21wYW5pZXMKLXRoZSBleGVjdXRhYmxlLgotCi0gIEl0IG1heSBoYXBwZW4gdGhhdCB0aGlzIHJlcXVpcmVtZW50IGNvbnRyYWRpY3RzIHRoZSBsaWNlbnNlCi1yZXN0cmljdGlvbnMgb2Ygb3RoZXIgcHJvcHJpZXRhcnkgbGlicmFyaWVzIHRoYXQgZG8gbm90IG5vcm1hbGx5Ci1hY2NvbXBhbnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTdWNoIGEgY29udHJhZGljdGlvbiBtZWFucyB5b3UgY2Fubm90Ci11c2UgYm90aCB0aGVtIGFuZCB0aGUgTGlicmFyeSB0b2dldGhlciBpbiBhbiBleGVjdXRhYmxlIHRoYXQgeW91Ci1kaXN0cmlidXRlLgotDAotICA3LiBZb3UgbWF5IHBsYWNlIGxpYnJhcnkgZmFjaWxpdGllcyB0aGF0IGFyZSBhIHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5IHNpZGUtYnktc2lkZSBpbiBhIHNpbmdsZSBsaWJyYXJ5IHRvZ2V0aGVyIHdpdGggb3RoZXIgbGlicmFyeQotZmFjaWxpdGllcyBub3QgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHN1Y2ggYSBjb21iaW5lZAotbGlicmFyeSwgcHJvdmlkZWQgdGhhdCB0aGUgc2VwYXJhdGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3b3JrIGJhc2VkIG9uCi10aGUgTGlicmFyeSBhbmQgb2YgdGhlIG90aGVyIGxpYnJhcnkgZmFjaWxpdGllcyBpcyBvdGhlcndpc2UKLXBlcm1pdHRlZCwgYW5kIHByb3ZpZGVkIHRoYXQgeW91IGRvIHRoZXNlIHR3byB0aGluZ3M6Ci0KLSAgICBhKSBBY2NvbXBhbnkgdGhlIGNvbWJpbmVkIGxpYnJhcnkgd2l0aCBhIGNvcHkgb2YgdGhlIHNhbWUgd29yawotICAgIGJhc2VkIG9uIHRoZSBMaWJyYXJ5LCB1bmNvbWJpbmVkIHdpdGggYW55IG90aGVyIGxpYnJhcnkKLSAgICBmYWNpbGl0aWVzLiAgVGhpcyBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgICBTZWN0aW9ucyBhYm92ZS4KLQotICAgIGIpIEdpdmUgcHJvbWluZW50IG5vdGljZSB3aXRoIHRoZSBjb21iaW5lZCBsaWJyYXJ5IG9mIHRoZSBmYWN0Ci0gICAgdGhhdCBwYXJ0IG9mIGl0IGlzIGEgd29yayBiYXNlZCBvbiB0aGUgTGlicmFyeSwgYW5kIGV4cGxhaW5pbmcKLSAgICB3aGVyZSB0byBmaW5kIHRoZSBhY2NvbXBhbnlpbmcgdW5jb21iaW5lZCBmb3JtIG9mIHRoZSBzYW1lIHdvcmsuCi0KLSAgOC4gWW91IG1heSBub3QgY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlLCBsaW5rIHdpdGgsIG9yIGRpc3RyaWJ1dGUKLXRoZSBMaWJyYXJ5IGV4Y2VwdCBhcyBleHByZXNzbHkgcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55Ci1hdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIGxpbmsgd2l0aCwgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgaXMgdm9pZCwgYW5kIHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgeW91cgotcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gIEhvd2V2ZXIsIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLAotb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlciB0aGlzIExpY2Vuc2Ugd2lsbCBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcwotdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2ggcGFydGllcyByZW1haW4gaW4gZnVsbCBjb21wbGlhbmNlLgotCi0gIDkuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAotc2lnbmVkIGl0LiAgSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKLWRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuICBUaGVzZSBhY3Rpb25zIGFyZQotcHJvaGliaXRlZCBieSBsYXcgaWYgeW91IGRvIG5vdCBhY2NlcHQgdGhpcyBMaWNlbnNlLiAgVGhlcmVmb3JlLCBieQotbW9kaWZ5aW5nIG9yIGRpc3RyaWJ1dGluZyB0aGUgTGlicmFyeSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCi1MaWJyYXJ5KSwgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28sIGFuZAotYWxsIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZwotdGhlIExpYnJhcnkgb3Igd29ya3MgYmFzZWQgb24gaXQuCi0KLSAgMTAuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBMaWJyYXJ5IChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKLUxpYnJhcnkpLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCi1vcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlLCBsaW5rIHdpdGggb3IgbW9kaWZ5IHRoZSBMaWJyYXJ5Ci1zdWJqZWN0IHRvIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgWW91IG1heSBub3QgaW1wb3NlIGFueSBmdXJ0aGVyCi1yZXN0cmljdGlvbnMgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uCi1Zb3UgYXJlIG5vdCByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIGNvbXBsaWFuY2UgYnkgdGhpcmQgcGFydGllcyB0bwotdGhpcyBMaWNlbnNlLgotDAotICAxMS4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAotaW5mcmluZ2VtZW50IG9yIGZvciBhbnkgb3RoZXIgcmVhc29uIChub3QgbGltaXRlZCB0byBwYXRlbnQgaXNzdWVzKSwKLWNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKLW90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKLWV4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90Ci1kaXN0cmlidXRlIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCi1MaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91Ci1tYXkgbm90IGRpc3RyaWJ1dGUgdGhlIExpYnJhcnkgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50Ci1saWNlbnNlIHdvdWxkIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBMaWJyYXJ5IGJ5Ci1hbGwgdGhvc2Ugd2hvIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4KLXRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8KLXJlZnJhaW4gZW50aXJlbHkgZnJvbSBkaXN0cmlidXRpb24gb2YgdGhlIExpYnJhcnkuCi0KLUlmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKLXBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseSwKLWFuZCB0aGUgc2VjdGlvbiBhcyBhIHdob2xlIGlzIGludGVuZGVkIHRvIGFwcGx5IGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCi0KLUl0IGlzIG5vdCB0aGUgcHVycG9zZSBvZiB0aGlzIHNlY3Rpb24gdG8gaW5kdWNlIHlvdSB0byBpbmZyaW5nZSBhbnkKLXBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55Ci1zdWNoIGNsYWltczsgdGhpcyBzZWN0aW9uIGhhcyB0aGUgc29sZSBwdXJwb3NlIG9mIHByb3RlY3RpbmcgdGhlCi1pbnRlZ3JpdHkgb2YgdGhlIGZyZWUgc29mdHdhcmUgZGlzdHJpYnV0aW9uIHN5c3RlbSB3aGljaCBpcwotaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCi1nZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCi10aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAotc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwotdG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90Ci1pbXBvc2UgdGhhdCBjaG9pY2UuCi0KLVRoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bwotYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCi0KLSAgMTIuIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgTGlicmFyeSBpcyByZXN0cmljdGVkIGluCi1jZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKLW9yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgTGlicmFyeSB1bmRlciB0aGlzIExpY2Vuc2UgbWF5IGFkZAotYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZSBjb3VudHJpZXMsCi1zbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZyBjb3VudHJpZXMgbm90IHRodXMKLWV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCi13cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KLQotICAxMy4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKLXZlcnNpb25zIG9mIHRoZSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuCi1TdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sCi1idXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8gYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCi0KLUVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlIExpYnJhcnkKLXNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZAotImFueSBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAotY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIElmIHRoZSBMaWJyYXJ5IGRvZXMgbm90IHNwZWNpZnkgYQotbGljZW5zZSB2ZXJzaW9uIG51bWJlciwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0MCi0gIDE0LiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgTGlicmFyeSBpbnRvIG90aGVyIGZyZWUKLXByb2dyYW1zIHdob3NlIGRpc3RyaWJ1dGlvbiBjb25kaXRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGVzZSwKLXdyaXRlIHRvIHRoZSBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzCi1jb3B5cmlnaHRlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91cgotZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cwotb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlIHNvZnR3YXJlIGFuZCBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcKLWFuZCByZXVzZSBvZiBzb2Z0d2FyZSBnZW5lcmFsbHkuCi0KLQkJCSAgICBOTyBXQVJSQU5UWQotCi0gIDE1LiBCRUNBVVNFIFRIRSBMSUJSQVJZIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTwotV0FSUkFOVFkgRk9SIFRIRSBMSUJSQVJZLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4KLUVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SCi1PVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIExJQlJBUlkgIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWQotS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi1JTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLVBVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRQotTElCUkFSWSBJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgTElCUkFSWSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUKLVRIRSBDT1NUIE9GIEFMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KLQotICAxNi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTgotV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKLUFORC9PUiBSRURJU1RSSUJVVEUgVEhFIExJQlJBUlkgQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VCi1GT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SCi1DT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRQotTElCUkFSWSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORwotUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEKLUZBSUxVUkUgT0YgVEhFIExJQlJBUlkgVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBTT0ZUV0FSRSksIEVWRU4gSUYKLVNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLURBTUFHRVMuCi0KLQkJICAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQwKLSAgICAgQXBwZW5kaXg6IEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBMaWJyYXJpZXMKLQotICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBsaWJyYXJ5LCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Ci1wb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgd2UgcmVjb21tZW5kIG1ha2luZyBpdCBmcmVlIHNvZnR3YXJlIHRoYXQKLWV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZS4gIFlvdSBjYW4gZG8gc28gYnkgcGVybWl0dGluZwotcmVkaXN0cmlidXRpb24gdW5kZXIgdGhlc2UgdGVybXMgKG9yLCBhbHRlcm5hdGl2ZWx5LCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi1vcmRpbmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlKS4KLQotICBUbyBhcHBseSB0aGVzZSB0ZXJtcywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgbGlicmFyeS4gIEl0IGlzCi1zYWZlc3QgdG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQotY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCi0iY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgotCi0gICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIGxpYnJhcnkncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KLSAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi0gICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCi0gICAgTUEgMDIxMTEtMTMwNywgVVNBCi0KLUFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgotCi1Zb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3IgeW91cgotc2Nob29sLCBpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgbGlicmFyeSwgaWYKLW5lY2Vzc2FyeS4gIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKLQotICBZb3lvZHluZSwgSW5jLiwgaGVyZWJ5IGRpc2NsYWltcyBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZQotICBsaWJyYXJ5IGBGcm9iJyAoYSBsaWJyYXJ5IGZvciB0d2Vha2luZyBrbm9icykgd3JpdHRlbiBieSBKYW1lcyBSYW5kb20gSGFja2VyLgotCi0gIDxzaWduYXR1cmUgb2YgVHkgQ29vbj4sIDEgQXByaWwgMTk5MAotICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQotCi1UaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0IQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L0NoYW5nZUxvZyBiL2xpYmliZXJ0eS9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDMyMjkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L0NoYW5nZUxvZworKysgL2Rldi9udWxsCkBAIC0xLDMyNDUgKzAsMCBAQAotMTk5OS0wNS0xMSAgSmltIEJsYW5keSAgPGppbWJAendpbmdsaS5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAobWFpbik6IFVzZSB0YWJsZSBsb29rdXAgdG8gZGlzdGluZ3Vpc2ggaWRlbnRpZmllcgotCWNoYXJhY3RlcnMgZnJvbSBub24taWRlbnRpZmllciBjaGFyYWN0ZXJzLgotCShzdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQsIGhwX3N5bWJvbF9hbHBoYWJldCk6IE5ldyBmdW5jdGlvbnMuCi0KLVRodSBNYXkgIDYgMjA6MzQ6NDIgMTk5OSAgRnJlZCBGaXNoICA8Zm5mQGJlLmNvbT4KLQotCSogY29uZmlndXJlLmluIChzeXMvcmVzb3VyY2UuaCk6IEFkZCB0byBBQ19DSEVDS19IRUFERVJTIGxpc3QuCi0JKiBnZXRydW50aW1lLmM6IE9ubHkgYXR0ZW1wdCB0byBpbmNsdWRlIHN5cy9yZXNvdXJjZS5oIGFuZAotCXVzZSBnZXRydXNhZ2UgaWYgYm90aCBIQVZFX0dFVFJVU0FHRSBhbmQgSEFWRV9TWVNfUkVTT1VSQ0VfSAotCWFyZSBkZWZpbmVkLgotCi0xOTk5LTA0LTIwICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQlGaXggZnJvbSBEYWxlIEhhd2tpbnM6Ci0JKiBjcGx1cy1kZW0uYyAobW9wX3VwKTogU2V0IHR5cGV2ZWNfc2l6ZSB0byB6ZXJvLCBzbyBpdCdsbCBiZSAKLQlyZWFsbG9jYXRlZCBwcm9wZXJseSBpZiB3ZSB1c2UgaXQgYWdhaW4uCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBDaGVjayBmb3IgYnVmZmVyIG92ZXJydW4uICBCZQotCXN0cmljdGVyIGFib3V0IHN5bnRheC4gIEFsd2F5cyBudWxsLXRlcm1pbmF0ZSBzdHJpbmcuCi0KLQlGaXggZnJvbSBNYXJjdXMgRGFuaWVsczoKLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBEb24ndCBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlCi0JaWRlbnRpZmllciBsb29raW5nIGZvciBhbm90aGVyIHVuZGVyc2NvcmUuCi0KLTE5OTktMDQtMTEgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS1jb25mLmggKGFsbG9jYSkgW0NfQUxMT0NBXTogRG9uJ3QgdXNlIEdjYyBidWlsdGluCi0Jb3IgPGFsbG9jYS5oPi4KLQkqIGNsb2NrLmMgKEdOVV9IWik6IE5ldyBkZWZpbml0aW9uLgotCShjbG9jayk6IFVzZSBpdC4KLQkqIGdldHJ1bnRpbWUuYzogTGlrZXdpc2UuCi0KLQkqIGNvbmZpZy50YWJsZTogVXNlIG1oLWJlb3MuCi0JKiBjb25maWcvbWgtYmVvczogTmV3IGZpbGUuCi0KLTE5OTktMDQtMDEgIEppbSBCbGFuZHkgIDxqaW1iQHp3aW5nbGkuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IEF0dGVtcHQgdG8gaGFuZGxlIG92ZXJmbG93cyBpbiBjb3VudHMgd2l0aCBzb21lCi0Jc2VtYmxhbmNlIG9mIGdyYWNlLgotCShjb25zdW1lX2NvdW50KTogRGV0ZWN0IG92ZXJmbG93cy4gIFJldHVybiAtMSB0byBpbmRpY2F0ZSBlcnJvcnMsCi0JaW5zdGVhZCBvZiB6ZXJvLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtLCBkZW1hbmdsZV90ZW1wbGF0ZSk6IEhhbmRsZSBjaGFuZ2UKLQl0byBjb25zdW1lX2NvdW50J3MgcmV0dXJuIGNvbnZlbnRpb24uCi0KLVRodSBBcHIgIDggMTQ6NDM6MjggMTk5OSAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB4bWFsbG9jLmMsIHBleGVjdXRlLmM6IERlZmluZSBfX0NZR1dJTl9fIHdoZW4gYmVpbmcgY29tcGlsZWQKLSAJd2l0aCBvbGQgX19DWUdXSU4zMl9fIGNvbXBpbGVyLgotCi0xOTk5LTA0LTAyICBNYXJrIE1pdGNoZWxsICA8bWFya0Bjb2Rlc291cmNlcnkuY29tPgotCi0JKiBzcGxheS10cmVlLmggKHNwbGF5X3RyZWVfY29tcGFyZV9wb2ludGVycyk6IERlZmluZS4KLQotMTk5OS0wMy0zMCAgTWFyayBNaXRjaGVsbCAgPG1hcmtAY29kZXNvdXJjZXJ5LmNvbT4KLQotCSogc3BsYXktdHJlZS5jIChzcGxheV90cmVlX2NvbXBhcmVfaW50cyk6IERlZmluZS4KLQotMTk5OS0wMy0zMCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6IElmIGBjb3VudCcgd3JhcHMsIHJldHVybiAwIGFuZAotCWRvbid0IGFkdmFuY2UgaW5wdXQgcG9pbnRlci4KLQkoZGVtYW5nbGVfY2xhc3NfbmFtZSk6IElmIGNvbnN1bWVfY291bnQgZGlkbid0IGZpbmQgYSBjb3VudCwgZG8KLQlub3RoaW5nLiAgRG9uJ3QgYm90aGVyIHdpdGggYHN0cmxlbicgc2FuaXR5IGNoZWNrOyBjb25zdW1lX2NvdW50Ci0JZG9lcyBpdCBmb3IgdXMuCi0KLTE5OTktMDMtMTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCUZyb20gQXJ0IEhhYXMgIDxhaGFhc0BuZW9zb2Z0LmNvbT46Ci0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogRG9uJ3QgZ3JhYiBhbGwgdGhlICdfXycgc3RyaW5ncwotCXdoZW4gZG9pbmcgYXJtIG9yIGhwIHN0eWxlLgotCShkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IERlY3IgZm9yZ2V0dGluZ190eXBlcyBmaWVsZCB3aGVuIGRvbmUuCi0JCi1UaHUgTWFyIDExIDAxOjIyOjU4IDE5OTkgIE11bWl0IEtoYW4gIDxraGFuQHhyYXlsaXRoLndpc2MuZWR1PgotCi0JKiBwZXhlY3V0ZS5jIChfX0NZR1dJTjMyX18pOiBSZW5hbWUgdG8KLQkoX19DWUdXSU5fXyk6IHRoaXMuCi0JKiB4bWFsbG9jLmM6IExpa2V3aXNlLgotCi0JQ2hhbmdlcyB0byBzdXBwb3J0IGkzODYtcGMtdXdpbi4KLQkqIGNvbmZpZ3VyZS5pbiAoKi0qLXV3aW4qKTogV29ya2Fyb3VuZCBmb3IgdmZvcmsgYnVnLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCSogcGV4ZWN1dGUuYyAocGV4ZWN1dGUpOiBCZSBsaWtlIHN0YW5kYXJkIFVuaXguCi0JKHB3YWl0KTogTGlrZXdpc2UuCi0JKiB4bWFsbG9jLmMgKGZpcnN0X2JyZWFrKTogRGVmaW5lLgotCSh4bWFsbG9jX3NldF9wcm9ncmFtX25hbWUpOiBVc2UuCi0JKHhtYWxsb2MpOiBVc2UuCi0KLVRodSBNYXIgMTEgMDE6MDc6NTUgMTk5OSAgRnJhbnogU2lybCA8RnJhbnouU2lybC1rZXJuZWxAbGF1dGVyYmFjaC5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogQ2xlYW51cCBhbmQgYWRkIG1oLSpwaWMgaGFuZGxpbmcgZm9yIGFscGhhLCBhcm0sIHBvd2VycGMKLQotU3VuIEZlYiAyOCAyMjozMDo0NCAxOTk5ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IENoZWNrIGN5Z3dpbiosIG5vdCBjeWd3aW4zMiouCi0KLVR1ZSBGZWIgIDkgMTY6Mzk6MDEgMTk5OSAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIG1rc3RlbXAgLT4gbWtzdGVtcHMuCi0KLVR1ZSBGZWIgIDkgMDE6MTI6MjcgMTk5OSAgTWFyYyBFc3BpZSA8TWFyYy5Fc3BpZUBsaWFmYS5qdXNzaWV1LmZyPgotCi0JKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTKTogcmVtb3ZlIG1rc3RlbXAubwotCSogY29uZmlndXJlLmluIChmdW5jcyk6IENoZWNrIGZvciBhbmQgY29uZGl0aW9uYWxseSBhZGQgbWtzdGVtcHMgdG8KLQl0aGUgbGlzdCBvZiBmdW5jdGlvbnMgbGliaWJlcnR5IHdpbGwgcHJvdmlkZS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQkKLVdlZCBGZWIgIDMgMDA6MDE6MTUgMTk5OSAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNsb2NrLmMgKEhaKTogRGVmaW5lIGluIHRlcm1zIG9mIChJU08gQykgQ0xPQ0tTX1BFUl9TRUMgb24gCi0JcGxhdGZvcm1zIHRoYXQgZG9uJ3QgaGF2ZSBIWi4KLQkqIGdldHJ1bnRpbWUuYyAoSFopOiBMaWtld2lzZS4KLQotU2F0IEphbiAzMCAxMzoyODowNCAxOTk5ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoeHN0cmR1cC5vKTogRGVwZW5kIG9uIGNvbmZpZy5oLgotCi1XZWQgSmFuIDEzIDA3OjI2OjQ0IDE5OTkgIEguSi4gTHUgIChoamxAZ251Lm9yZykKLQotCSogY3BsdXMtZGVtLmMgKG1vcF91cCk6IFNldCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCB0byBOVUxMIGFmdGVyCi0JZnJlZWluZyBpdC4KLQotV2VkIEphbiAxMyAxNDoxNjozNiAxOTk5ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHhzdHJkdXAuYyAoeHN0cmR1cCk6IFN3aXRjaCBmcm9tIHN0cmNweSB0byBtZW1jcHkgZm9yIHNwZWVkLgotCi1UdWUgSmFuICA1IDE1OjU4OjI5IDE5OTkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IGZpeCB0eXBvLCBzcGxheS10cmVlLmMgaW5zdGVhZCBvZgotCXNwbGF5LXRyZWUuby4KLQotMTk5OS0wMS0wNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlcXVpcmUgYXV0b2NvbmYgMi4xMi4xIG9yIGhpZ2hlci4KLQotMTk5OC0xMi0zMCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIHJhbmRvbS5jIChOVUxMKTogRG9uJ3QgcmVkZWZpbmUgTlVMTCBpZiBpdCBpcyBhbHJlYWR5IGRlZmluZWQuCi0KLVR1ZSBEZWMgMjIgMDk6NDM6MzUgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBhcmd2LmMgKGJ1aWxkYXJndik6IENhc3QgdGhlIHJlc3VsdCBvZiBhbGxvY2EgaW4gYXNzaWdubWVudC4KLQotCSogY2hvb3NlLXRlbXAuYzogSW5jbHVkZSBzdGRsaWIuaC4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IFJlbW92ZSB1bnVzZWQgcHJvdG90eXBlLgotICAJKHNuYXJmX251bWVyaWNfbGl0ZXJhbCk6IENvbnN0aWZ5IGZpcnN0IHBhcmFtZXRlci4KLSAgCShjb2RlX2Zvcl9xdWFsaWZpZXIpOiBBdm9pZCBhIGdjYyBleHRlbnNpb24sIG1ha2UgdGhlIHBhcmFtZXRlciBhbgotIAlpbnQsIG5vdCBhIGNoYXIuCi0JKGRlbWFuZ2xlX3F1YWxpZmllcik6IExpa2V3aXNlLgotCShkZW1hbmdsZV9zaWduYXR1cmUpOiBDYXN0IHRoZSBhcmd1bWVudCBvZiBhIGN0eXBlIGZ1bmN0aW9uIHRvCi0JdW5zaWduZWQgY2hhci4KLQkoYXJtX3B0KTogQWRkIHBhcmVucyBhcm91bmQgYXNzaWdubWVudCB1c2VkIGFzIHRydXRoIHZhbHVlLgotCShkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUpOiBDb25zdGlmeSB2YXJpYWJsZSBgYXJncycuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlKTogQ2FzdCB0aGUgYXJndW1lbnQgb2YgYSBjdHlwZQotCWZ1bmN0aW9uIHRvIHVuc2lnbmVkIGNoYXIuCi0JKGRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwpOiBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGBpJy4KLQkoc25hcmZfbnVtZXJpY19saXRlcmFsKTogQ29uc3RpZnkgcGFyYW1ldGVyIGBhcmdzJy4KLQlDYXN0IHRoZSBhcmd1bWVudCBvZiBhIGN0eXBlIGZ1bmN0aW9uIHRvIHVuc2lnbmVkIGNoYXIuCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSk6IEFkZCBleHBsaWNpdCBicmFjZXMgdG8KLSAJYXZvaWQgYW1iaWd1b3VzIGBlbHNlJy4KLQotCSogZm5tYXRjaC5jIChmbm1hdGNoKTogQ2hhbmdlIHR5cGUgb2YgdmFyaWFibGVzIGBjJywgYGMxJywKLSAJYGNzdGFydCcgYW5kIGBjZW5kJyB0byB1bnNpZ25lZCBjaGFyLiAgQ2FzdCB0aGUgYXJndW1lbnQgb2YgbWFjcm8KLSAJYEZPTEQnLCB3aGljaCB1c2VzIGN0eXBlIGZ1bmN0aW9ucywgdG8gdW5zaWduZWQgY2hhci4KLQotCSogb2JqYWxsb2MuYyAoZnJlZSk6IEFkZCBwcm90b3R5cGUuCi0KLVN1biBEZWMgMjAgMTY6MDM6NDYgMTk5OCAgSGFucy1QZXRlciBOaWxzc29uICA8aHBAYXhpcy5zZT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEZpeCB0eXBvOiBzcGxheS10cmVlLmMsIG5vdCBzcGxheS10cmVlLm8KLQotRnJpIERlYyAxOCAxNzo1MDoxOCAxOTk4ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2FybV9wdCk6IHJlbW92ZSBkZWNsYXJhdGlvbiAtLSBmdW5jdGlvbgotIAlkb2Vzbid0IGV4aXN0LgotCShkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsKTogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBgaScuCi0JCi1GcmkgRGVjIDE4IDE2OjExOjQzIEVTVCAxOTk4ICBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBQcm9jZXNzIENWIGFuZCB1IGNvZGVzIGJlZm9yZQotCWJ1bXBpbmcgdGhlIHBvaW50ZXIgd2UgcmVhZCBmcm9tLiBBbHNvIHByZXBlbmQgdGhlc2UgY29kZXMsCi0JYXMgd2UgZG8gaW4gb3RoZXIgcGxhY2VzLgotCi0xOTk4LTEyLTE4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlKTogTWFrZSB2YXJpYWJsZSAnYXJncycgYmUKLQknY29uc3QgY2hhciAqJyBpbiBvcmRlciB0byBtYXRjaCBpdHMgdXNhZ2Ugd2hlbiBjYWxsaW5nIHNpYmxpbmdzLgotCShzbmFyZl9udW1lcmljX2xpdGVyYWwpOiBNYWtlIGZpcnN0IGFyZyAnY29uc3QgY2hhciAqKicgaW4gb3JkZXIKLQl0byBtYXRjaCB1c2FnZS4KLQotTW9uIERlYyAxNCAwOTo1NTo1MCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmM6IERvbid0IGNoZWNrIElOX0dDQyBhbnltb3JlLgotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF9mcm9tX2RvdWJsZSk6IFVzZSBgY29uc3QnLCBub3QgYENPTlNUJy4KLQkqIG1lbWNoci5jIChtZW1jaHIpOiBMaWtld2lzZS4KLQkqIG1lbWNweS5jIChtZW1jcHkpOiBMaWtld2lzZS4KLQkqIG1lbW1vdmUuYyAobWVtbW92ZSk6IExpa2V3aXNlLgotCi0JKiBta3N0ZW1wLmM6IERvbid0IGNoZWNrIElOX0dDQyBhbnltb3JlLgotCSogcGV4ZWN1dGUuYzogTGlrZXdpc2UuCi0JKiBzcGxheS10cmVlLmM6IExpa2V3aXNlLgotCi0JKiBzdHJjaHIuYyAoc3RyY2hyKTogVXNlIGBjb25zdCcsIG5vdCBgQ09OU1QnLgotCSogc3RycmNoci5jIChzdHJyY2hyKTogTGlrZXdpc2UuCi0JKiBzdHJ0b2wuYyAoc3RydG9sKTogTGlrZXdpc2UuCi0JKiBzdHJ0b3VsLmMgKHN0cnRvdWwpOiBMaWtld2lzZS4KLQotRnJpIERlYyAgNCAxMzo1MTowNCAxOTk4ICBEYXZpZCBUYXlsb3IgICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0JCQkgIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBjeWdudXMuY29tPgotCQkJICBTdGFuIFNoZWJzICAgICA8c2hlYnNAY3lnbnVzLmNvbT4KLQkJCSAgRWRpdGggRXBzdGVpbiAgPGVlcHN0ZWluQGN5Z251cy5jb20+Ci0JCQkgIEFuZHJlcyBNYWNMZW9kIDxhbWFjbGVvZEBjeWdudXMuY29tPgotCQkJICBTYXRpc2ggUGFpCSA8cGFpQGFwb2xsby5ocC5jb20+Ci0KLQkqIEhQIGFDQyBkZW1hbmdsaW5nIHN1cHBvcnQuCi0JKiBjcGx1cy1kZW0uYwotCShtYWluKTogUmVtb3ZlIGRlZmF1bHQgdG8gSFAgc3R5bGUgZGVtYW5nbGluZywgc2V0IHRvIEVERwotIAlkZW1hbmdsaW5nIGNvcnJlY3RseSB3aGVuIC1lZGcgc3BlY2lmaWVkOyBzZXQgdGhlIGRlbWFuZ2xpbmcgc3R5bGUKLSAJd2hlbiB1c2VyIHNwZWNpZmllcyAnZWRnJy4gU2V0IHN0cmlwX3VuZGVyc2NvcmUgdG8KLSAJcHJlcGVuZHNfdW5kZXJzY29yZSwgaWYgbm90IEhQVVhIUFBBLiAgU2V0Ci0gCWN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSB0byBocF9kZW1hbmdsaW5nIGlmIEhQVVhIUFBBLiAgU2V0Ci0gCWN1cnJlbnQgZGVtYW5nbGluZyBzdHlsZSBjb3JyZWN0bHkgaWYgdGhlIHN3aXRjaCBpcyBocC4gIFJlYWQKLSAJbGFiZWwgY29ycmVjdGx5IGFsc28gaW4gdGhlIEhQIHN0eWxlIGNhc2UuCi0JKHdvcmtfc3R1ZmYpOiBhZGQgdGVtcF9zdGFydCBmaWVsZDsgYWRkIGZpZWxkIGZvciB2b2xhdGlsZSBtZW1iZXIKLSAJZnVuY3Rpb24uCi0JKGFybV9wdCk6IGhhbmRsZSBBUk1fREVNQU5HTElORyBhbmQgRURHX0RFTUFOR0xJTkcgc3R5bGVzOyBIUAotIAlzdHlsZSBmb3IgdGhpcyBjYXNlIGlzIHRoZSBzYW1lIGFzIEFSTS4KLQkoZGVtYW5nbGVfYXJncyk6IGhhbmRsZSBFREdfREVNQU5HTElORyBzdHlsZTsgc3VwcG9ydCBIUCBzdHlsZS4KLQkoZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlKTogbmV3IGZ1bmN0aW9uLiAoSXQgd2FzCi0gCWRlbWFuZ2xlX2FybV9wdC4pOyBjaGVjayBhbmQgc2V0IHZhbHVlIG9mIHRlbXBfc3RhcnQgZmllbGQgaW4KLSAJbXVsdGlwbGUgcGxhY2VzLiBBbHNvLCB3aGVuIGNlY2hpbmcgZm9yIGVuZCBvZiB0ZW1wbGF0ZSBhcmdzLAotIAljaGVjayB0byBzZWUgaWYgYXQgZW5kIG9mIHN0YXRpYyBtZW1iZXIgb2YgdGVtcGxhdGUgY2xhc3MuCi0JKGRlbWFuZ2xlX2NsYXNzKTogbmV3IGxvY2FsIHZhcmlhYmxlIDogc2F2ZV9jbGFzc19uYW1lX2VuZCBEb24ndAotIAlpbmNsdWRlIHRlbXBsYXRlIGFyZ3MgaW4gc3RyaW5nIGRlZmluaW5nIGNsYXNzLgotCShkZW1hbmdsZV9jbGFzc19uYW1lKTogdXNlIGRlbWFuZ2VsX2FybV9ocF90ZW1wbGF0ZS4KLQkoZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSk6IGhhbmRsZSBjYXNlIHdoZXJlIGRlbWFuZ2xpbmcgc3R5bGUgaXMKLSAJSFBfREVNQU5HTElORyBhbmQgY3VycmVudGx5IHBvaW50IGF0IGFuICdYJyBpbiB0aGUgbWFuZ2xlZCBuYW1lLgotICAJSGFuZGxlIEVER19ERU1BTkdMSU5HIHN0eWxlLiAgSGFuZGxlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCi0gCW9wcyBmb3IgSFAgc3R5bGUuCi0JKGRlbWFuZ2xlX3ByZWZpeCk6IGhhbmRsZSBFREdfREVNQU5HTElORyBhbmQgQVJNX0RFTUFOR0xJTkcKLSAJc3R5bGVzLiAgZ2xvYmFsIGRlc3RydWN0b3IgYW5kIGNvbnN0cnVjdG9yIGZvciBIUCBzdHlsZSBhcmUgc2FtZQotIAlhcyBmb3IgQVJNIHN0eWxlLiBTYW1lIGZvciBsb2NhbCB2YXJpYWJsZXMuCi0JKGRlbWFuZ2xlX3F1YWxpZmllZCk6IGhhbmRsZSBFREdfREVNQU5HTElORyBzdHlsZS4KLQkoZGVtYW5nbGVfc2lnbmF0dXJlKTogYWRkIGNhc2UgZm9yIHZvbGF0aWxlIG1lbWJlciBmdW5jdGlvbi4gIEZvcgotIAljYXNlcyAnMScgLSAnOScgOiBpbml0aWFsaXplIHRoZSB0ZW1wX3N0YXJ0IGZpZWxkIHRvIC0xIGFuZCBoYW5kbGUKLSAJdGhlIEVER19ERU1BTkdMSU5HIHN0eWxlLiAgZm9yIGNhc2UgJ0YnIDogaGFuZGxlIEVER19ERU1BTkdMSU5HCi0gCWFuZCBBVVRPX0RFTUFOR0xJTkcgc3R5bGVzLiAgSWYgZXhwZWN0aW5nIGEgZnVuY3Rpb24gYW5kIG1hbmFnZWQKLSAJdG8gZGVtYW5nbGUgdGhlIGZ1bmN0IGFyZ3MsIHRoZW4gaGFuZGxlIHRoZSBMVUNJRF9ERU1BTkdMSU5HLAotIAlBUk1fREVNQU5HTElORywgYW5kIEVER19ERU1BTkdMSU5HIHN0eWxlcy4gIEFkZCBjYXNlIGZvciBsb2NhbAotIAljbGFzcyBuYW1lIGFmdGVyICJMbm5uXyBpbiBIUCBzdHlsZSBjYXNlLiBIUCBzdHlsZSB0b28gbmVlZHMgdG8KLSAJZm9yZ2V0IHR5cGVzLiAgX25ubiBpcyBPSyBmb3IgSFAgc3R5bGUsIHNvIGRvbid0IHJlcG9ydCBmYWlsdXJlLgotCShkb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSk6IG5ldyBmdW5jdGlvbi4gSGFuZGxlIHRlbXBsYXRlJ3MKLSAJdmFsdWUgcGFyYW0gZm9yIEhQL2FDQy4KLQkoZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCk6IG5ldyBmdW5jdGlvbi4gIEhhbmRsZSBhIHRlbXBsYXRlJ3MKLSAJbGl0ZXJhbCBwYXJhbWV0ZXIgZm9yIEhQIGFDQy4KLQkocmVjdXJzaXZlbHlfZGVtYW5nbGUpOiBuZXcgZnVuY3Rpb24KLQkoc25hcmZfbnVtZXJpY19saXRlcmFsKTogbmV3IGZ1bmN0aW9uLgotCSh1c2FnZSk6IGFkZCAnZWRnJyB0byB0aGUgbGlzdCBvZiBkZW1hbmdsaW5nIHN0eWxlczsgYWRkIGhwIHN3aXRjaAotIAl0byBtZXNzYWdlLgotCi1TYXQgTm92IDI4IDE3OjI1OjIyIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IFJlbW92ZSBvYnNvbGV0ZSBpZmRlZmVkIGN5Z3dpbiBjb2RlLgotCi1GcmkgTm92IDI3IDEzOjI2OjA2IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY2hvb3NlLXRlbXAuYzogQWx3YXlzIGluY2x1ZGUgbGliaWJlcnR5LmguICBBdm9pZCByZWR1bmRhbmNpZXMuCi0JKiBjcGx1cy1kZW0uYzogTGlrZXdpc2UuICBDb25mb3JtIHRvIGxpYmliZXJ0eS5oLgotCSogcGV4ZWN1dGUuYzogTGlrZXdpc2UuCi0JKiBzcGxheS10cmVlLmM6IExpa2V3aXNlLgotCi0xOTk4LTExLTI1ICBNaWtlIFN0dW1wICA8bXJzQHdycy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChzcGxheS10cmVlLm8pOiBBZGQgY29uZmlnLmggZGVwZW5kZW5jeS4KLQotTW9uIE5vdiAyMyAxNjo1OTo0OSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqICBjb25maWd1cmUuaW46IFVzZSBBQ19QUkVSRVEoMi4xMi4xKS4KLQotMTk5OC0xMS0xNiAgQmVuamFtaW4gS29zbmlrICA8YmtvekBoYWlnaHQuY29uc3RhbnQuY29tPgotCi0gICAgICAgICogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IEFkZCBkZW1hbmdsaW5nIGZvciBDOXggdHlwZXMuCi0KLVRodSBOb3YgMTkgMjI6MTU6NTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtcHcuYyAobXB3X2FjY2Vzcyk6IEFkZCBtaXNzaW5nIHBhcmVucy4KLQotVGh1IE5vdiAxOSAxMjo1OToyMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19IRUFERVJfU1lTX1dBSVQuCi0KLQkqIHBleGVjdXRlLmM6IEluY2x1ZGUgc3lzL3dhaXQuaCB3aGVuICFJTl9HQ0MuCi0KLVRodSBOb3YgMTkgMTQ6Mzg6MjAgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogcmV2ZXJ0IGJhY2sgdG8gY2hlY2tpbmcgb2xkIEN5Z3dpbgotCXByZXByb2Nlc3NvciBzeW1ib2wgdW50aWwgc29tZSB0aW1lIGhhcyBwYXNzZWQuCi0KLVdlZCBOb3YgMTggMDg6NTI6MjYgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogcGV4ZWN1dGUuYzogUmVvcmdhbml6ZSBXSU4zMiBjYXNlIHRvIGFjY29tb2RhdGUgQ3lnd2luCi0Jc2luY2UgaXQgd2lsbCBub3cgc3VwcG9ydCBzaW1pbGFyIGNvbnN0cnVjdHMuCi0KLUZyaSBOb3YgMTMgMTk6MTg6MDUgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciBjYWxsb2MuCi0KLQkqIGNhbGxvYy5jOiBOZXcJZmlsZS4KLQotCSogeG1hbGxvYy5jICh4Y2FsbG9jKTogTmV3IGZ1bmN0aW9uLgotCi1GcmkgTm92IDEzIDA4OjUxOjQ2IEVTVCAxOTk4ICBBbmRyZXcgTWFjTGVvZCAgPGFtYWNsZW9kQGN5Z251cy5jb20+Ci0KLQkqY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6IFVzZSB0aGUgbGFzdCAiX18iCi0JaW4gdGhlIG1hbmdsZWQgbmFtZSB3aGVuIGxvb2tpbmcgZm9yIHRoZSBzaWduYXR1cmUuIFRoaXMgYWxsb3dzCi0JdGVtcGxhdGUgbmFtZXMgdG8gYmVnaW4gd2l0aCAiX18iLgotCi0xOTk4LTExLTA4ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAodHlwZV9raW5kX3QpOiBBZGQgdGtfcmVmZXJlbmNlLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogSGFuZGxlIGl0LgotCShkb190eXBlKTogVXNlIGl0IGZvciByZWZlcmVuY2VzLCBpbnN0ZWFkIG9mIHRrX3BvaW50ZXIuCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogVXNlIGNwbHVzX2RlbWFuZ2xlLAotCW5vdCBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZS4KLQotU2F0IE5vdiAgNyAxNjowMjoxMCAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNob29zZS10ZW1wLmM6IERvbid0IGluY2x1ZGUgZ2Fuc2lkZWNsLmguCi0JKiBta3N0ZW1wLmM6IExpa2V3aXNlLgotCSogcGV4ZWN1dGUuYzogTGlrZXdpc2UuCi0KLU1vbiBOb3YgIDIgMTU6MDU6MzMgMTk5OCAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGNvbmZpZ3VyZS5pbjogZGV0ZWN0IGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMioKLSAgICAgICAgKiBjb25maWd1cmU6IHJlZ2VuZXJhdGUKLQotTW9uIE5vdiAgMiAxMDoyMjowMSAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIHBleGVjdXRlLmM6IENoZWNrIEhBVkVfQ09ORklHX0gsIG5vdCBJTl9HQ0MsIHdoZW4gZGV0ZXJtaW5pbmcKLSAJd2hldGhlciB0byBpbmNsdWRlIGNvbmZpZy5oLiAgUG9zc2libHkgaW5jbHVkZSB1bmlzdGQuaCBpbiB0aGUKLSAJIUlOX0dDQyBjYXNlLiAgRGVmaW5lIFZGT1JLX1NUUklORyBhcyBhIHByaW50YWJsZSBmdW5jdGlvbiBjYWxsCi0gCWZvciBlcnJvciBtZXNzYWdlcyAoZWl0aGVyICJ2Zm9yayIgb3IgImZvcmsiLikgIElmIEhBVkVfVkZPUktfSCBpcwotIAlkZWZpbmVkLCBpbmNsdWRlIHZmb3JrLmguICBJZiBWTVMgaXMgZGVmaW5lZCwgZGVmaW5lIHZmb3JrKCkKLSAJYXBwcm9wcmlhdGVseS4gIFJlbW92ZSB2Zm9yayBjaGVjayBvbiBVU0csIHdlJ3JlIHVzaW5nIGF1dG9jb25mLgotICAJKHBleGVjdXRlKTogU2V0IGBlcnJtc2dfZm10JyB0byBWRk9SS19TVFJJTkcgaW5zdGVhZCBvZiBjaGVja2luZwotIAlsb2NhbGx5IHdoYXQgc3RyaW5nIHRvIHVzZS4KLQotMTk5OC0xMC0yNiAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogc3BsYXktdHJlZS5jOiBUd2VhayBpbmNsdWRlIGRpcmVjdGl2ZXMgdG8gbWFrZSBzdXJlIGRlY2xhcmF0aW9ucyBvZgotCXhtYWxsb2MgYW5kIGZyZWUgYXJlIGF2YWlsYWJsZS4KLQotMTk5OC0xMC0yNSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogRml4IGhhbmRsaW5nIG9mIHZpcnR1YWwgdGFibGVzIGluCi0JYW5vbnltb3VzIG5hbWVzcGFjZXMuCi0KLTE5OTgtMTAtMjMgIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jICh3b3JrX3N0dWZmKTogUmVwbGFjZSBjb25zdF90eXBlIGFuZCB2b2xhdGlsZV90eXBlCi0Jd2l0aCB0eXBlX3F1YWxzLgotCShUWVBFX1VOUVVBTElGSUVEKTogTmV3IG1hY3JvLgotCShUWVBFX1FVQUxfQ09OU1QpOiBMaWtld2lzZS4KLQkoVFlQRV9RVUFMX1ZPTEFUSUxFKTogTGlrZXdpc2UuCi0JKFRZUEVfUVVBTF9SRVNUUklDVCk6IExpa2V3aXNlLgotCShjb2RlX2Zvcl9xdWFsaWZpZXIpOiBOZXcgZnVuY3Rpb24uCi0JKHF1YWxpZmllcl9zdHJpbmcpOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfcXVhbGlmaWVyKTogTGlrZXdpc2UuCi0JKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlKTogVXNlIHRoZW0uCi0JKGRlbWFuZ2xlX3NpZ25hdHVyZSk6IExpa2V3aXNlLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogTGlrZXdpc2UuCi0JKGRvX3R5cGUpOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKSk6IExpa2V3aXNlLgotCi1UaHUgT2N0IDIyIDE5OjU4OjQzIDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogc3BsYXktdHJlZS5jIChzcGxheV90cmVlX2ZvcmVhY2hfaGVscGVyKTogTWFrZSBkZWZpbml0aW9uIHN0YXRpYwotCXRvIG1hdGNoIHByb3RvdHlwZS4KLQotMTk5OC0xMC0yMSAgTWFyayBNaXRjaGVsbCAgPG1hcmtAbWFya21pdGNoZWxsLmNvbT4KLQotCSogc3BsYXktdHJlZS5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgaXQuCi0JKFJFUVVJUkVEX09GSUxFUyk6IExpa2V3aXNlLgotCShzcGxheS10cmVlLm8pOiBBZGQgZGVwZW5kZW5jaWVzLgotCi1UdWUgT2N0IDIwIDEyOjI5OjAyIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmNzLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6IEZpeCBvZmYtYnktb25lIHdoZW4gY2hlY2tpbmcKLQlyYW5nZSBvZiAnSycgaW5kZXguCi0KLVRodSBPY3QgMTUgMTg6NTE6MTIgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjaG9vc2UtdGVtcC5jOiBQcm90b3R5cGUgbWtzdGVtcHMoKSB3aGVuIElOX0dDQy4KLQotCSogY3BsdXMtZGVtLmMgKGNvbnN1bWVfY291bnQpOiBDYXN0IGFyZ3VtZW50IG9mIGN0eXBlIG1hY3JvIHRvCi0JYHVuc2lnbmVkIGNoYXInLgotCShjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBDYXN0IHRoZSByZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkgd2hlbgotCWNvbXBhcmluZyBhZ2FpbnN0IG9uZS4KLQkoY3BsdXNfbWFuZ2xlX29wbmFtZSk6IExpa2V3aXNlLgotCShkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSk6IENhc3QgYXJndW1lbnQgb2YgY3R5cGUgbWFjcm8gdG8KLQlgdW5zaWduZWQgY2hhcicuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0pOiBMaWtld2lzZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGUpOiBJbml0aWFsaXplIHZhcmlhYmxlIGBiaW5kZXgnLiAgQ2FzdCB0aGUKLQlyZXN1bHQgb2YgYHN0cmxlbicgdG8gKGludCkgd2hlbiBjb21wYXJpbmcgYWdhaW5zdCBvbmUuICBSZW1vdmUKLQl1bnVzZWQgdmFyaWFibGUgYHN0YXJ0X29mX3ZhbHVlX3Bhcm0nLgotCShkZW1hbmdsZV9jbGFzc19uYW1lKTogQ2FzdCB0aGUgcmVzdWx0IG9mIGBzdHJsZW4nIHRvIChpbnQpIHdoZW4KLQljb21wYXJpbmcgYWdhaW5zdCBvbmUuCi0JKGRlbWFuZ2xlX3ByZWZpeCk6IENhc3QgYXJndW1lbnQgb2YgY3R5cGUgbWFjcm8gdG8gYHVuc2lnbmVkIGNoYXInLgotCShnbnVfc3BlY2lhbCk6IExpa2V3aXNlLiAgQ2FzdCB0aGUgcmVzdWx0IG9mIGBzdHJsZW4nIHRvIChpbnQpCi0Jd2hlbiBjb21wYXJpbmcgYWdhaW5zdCBvbmUuCi0JKGRlbWFuZ2xlX3F1YWxpZmllZCk6IENhc3QgYXJndW1lbnQgb2YgY3R5cGUgbWFjcm8gdG8gYHVuc2lnbmVkIGNoYXInLgotCShnZXRfY291bnQpOiBMaWtld2lzZS4KLQkoZG9fdHlwZSk6IExpa2V3aXNlLiAgQ2FzdCB0aGUgcmVzdWx0IG9mIGBzdHJsZW4nIHRvIChpbnQpIHdoZW4KLQljb21wYXJpbmcgYWdhaW5zdCBvbmUuCi0JKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IENhc3QgYXJndW1lbnQgb2YgY3R5cGUgbWFjcm8gdG8gYHVuc2lnbmVkIGNoYXInLgotCShkZW1hbmdsZV9mdW5jdGlvbl9uYW1lKTogQ2FzdCB0aGUgcmVzdWx0IG9mIGBzdHJsZW4nIHRvIChpbnQpCi0Jd2hlbiBjb21wYXJpbmcgYWdhaW5zdCBvbmUuCi0KLQkqIG1rc3RlbXAuYyAobWtzdGVtcHMpOiBDYXN0IHZhcmlhYmxlIGBsZW4nIHRvIChpbnQpIHdoZW4KLQljb21wYXJpbmcgYWdhaW5zdCBvbmUuCi0KLVR1ZSBPY3QgMTMgMjM6NTE6NTEgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0gICAgICAgICogbWtzdGVtcC5jOiBDaGVjayBIQVZFX1NZU19USU1FX0ggYmVmb3JlIGluY2x1ZGluZyBzeXMvdGltZS5oCi0gICAgICAgICogY29uZmlndXJlLmluIChBQ19DSEVDS19IRUFERVJTKTogQ2hlY2sgZm9yIHN5cy90aW1lLmggdG9vLgotICAgICAgICAqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWJ1aWx0LgotCi0JKiBnZXRvcHQuYzogQ2hlY2sgSEFWRV9TVFJJTkdTX0ggYmVmb3JlIGluY2x1ZGluZyBzdHJpbmdzLmguCi0JKiBjb25maWd1cmUuaW4gKEFDX0NIRUNLX0hFQURFUlMpOiBDaGVjayBmb3Igc3RyaW5ncy5oIHRvby4KLQkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWJ1aWx0LgotCi1Nb24gT2N0IDEyIDE5OjE1OjU5IDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IGluIGNvbW1lbnQsIGNhbGwgQUNfRVhFRVhUIGluc3RlYWQgb2YgQU1fRVhFRVhUCi0KLVN1biBPY3QgMTEgMTc6MzY6MDYgMTk5OCAgTWljaGFlbCBUaWVtYW5uICA8dGllbWFubkBob2xvZGVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY3BsdXMtZGVtLm8sIG9ic3RhY2subyk6IERlcGVuZCB1cG9uIGNvbmZpZy5oLgotCi1UaHUgT2N0ICA4IDIzOjQyOjA4IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogTWVyZ2UgZWdjcyAmIGRldm8gbGliaWJlcnR5LgotCi0xOTk4LTA5LTA4ICBNYXJ0aW4gdm9uIEz2d2lzICA8bG9ld2lzQGluZm9ybWF0aWsuaHUtYmVybGluLmRlPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogRGVtYW5nbGUgYW5vbnltb3VzIG5hbWVzcGFjZXMuCi0KLU1vbiBTZXAgIDcgMjM6Mjk6MDEgMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBta3N0ZW1wLmM6IEluY2x1ZGUgY29uZmlnLmggZXZlbiB3aGVuIG5vdCBJTl9HQ0MuICBXcmFwIGhlYWRlcgotIAlpbmNsdXNpb25zIGluc2lkZSBIQVZFXypfSCBtYWNyb3MuICBJbmNsdWRlIGFuc2lkZWNsLmggd2hlbiBub3QKLSAJSU5fR0NDLgotCi0JKiB2YXNwcmludGYuYzogSW5jbHVkZSBzdGRhcmcuaC92YXJhcmdzLmggZmlyc3QuCi0KLQkqIHZwcmludGYuYzogTGlrZXdpc2UuCi0KLVNhdCBTZXAgIDUgMDM6MjQ6NDkgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwZXhlY3V0ZS5jOiBVcGRhdGVzIGZyb20gZ2NjLiAgQ29weSBpbiBnY2MgaGFzIGJlZW4gcmVtb3ZlZC4gIFRoaXMKLQlpcyB0aGUgY2Fub25pY2FsIGNvcHkuICBEZWZpbmUgSVNTUEFDRSBpZiAhSU5fR0NDLgotCSogYWxsb2NhLmMsIHZmcHJpbnRmLmMsIGNob29zZS10ZW1wLmMsIG1rc3RlbXAuYywgZ2V0b3B0LmM6IFNpbWlsYXJseS4KLQkqIGdldG9wdDEuYywgb2JzdGFjay5jOiBTaW1pbGFybHkuCi0JKiBNYWtlZmlsZS5pbjogQnVpbGQgbWtzdGVtcC5vCi0KLVR1ZSBTZXAgIDEgMjM6MTI6NDcgMTk5OCAgQ2hyaXN0b3BoZXIgRmF5bG9yIDxjZ2ZAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBJbmNsdWRlIGFzcHJpbnRmIGluIGxpc3Qgb2YgZnVuY3Rpb25zIGtub3duIG5vdAotCXRvIGJlIGluIG5ld2xpYi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIEF1ZyAxOSAxNDowNTowMSAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKHdvcmtfc3R1ZmYpOiBBZGQgZGxsaW1wb3J0ZWQuCi0JKGRlbWFuZ2xlZF9wcmVmaXgpOiBNYXJrIHN5bWJvbHMgaW1wb3J0ZWQgZnJvbSBQRSBETEwuCi0JKGludGVybmFsX2NwbHVzX2RlbWFuZ2xlZCk6IEhhbmRsZS4KLQotMTk5OC0wOC0xNyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEZpeCBzaW1wbGUgYXJyYXkgaGFuZGxpbmcuICBJZiB3ZSBmYWlsLAotCXN0YXkgZmFpbGVkLgotCi1Nb24gQXVnIDE3IDEwOjQwOjM0IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY3BsdXMtZGVtLmM6IEluY2x1ZGUgY29uZmlnLmggaWYgaXQgZXhpc3RzLiAgQWxzbywgb25seQotCXByb3RvdHlwZSBtYWxsb2MvcmVhbGxvYyBpZiB3ZSBjYW4ndCBnZXQgc3RkbGliLmguCi0KLVNhdCBBdWcgMTUgMTY6MTU6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFN3aXRjaCBiYWNrIHRvIGNoZWNraW5nIC0td2l0aC10YXJnZXQtc3ViZGlyIHdoZW4KLQlkZWNpZGluZyB3aGV0aGVyIHRvIGNoZWNrIGZvciBuZXdsaWIsIHVuZG9pbmcgcGFydCBvZiBKdWx5IDE1Ci0JY2hhbmdlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgQXVnIDEzIDE2OjQ3OjM4IDE5OTggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jICh0eXBlX2tpbmRfdCk6IE5ldyB0eXBlLgotCShkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtKTogQWRkIHR5cGVfa2luZF90IHBhcmFtZXRlci4gIFJlbHkKLQlvbiB0aGlzIHBhcmFtdGVyLCByYXRoZXIgdGhhbiBkZW1hbmdsaW5nIHRoZSB0eXBlIGFnYWluLgotCShkZW1hbmdsZV9pbnRlZ3JhbF92YWx1ZSk6IFBhc3MgdGtfaW50ZWdyYWwuCi0JKGRlbWFuZ2xlX3RlbXBsYXRlXzogUGFzcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBkb190eXBlLgotCShkb190eXBlKTogUmV0dXJuIGEgdHlwZV9raW5kX3QuICBQYXNzIHRrX2ludGVncmFsIHRvCi0JZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBmb3IgYXJyYXkgYm91bmRzLgotCShkZW1hbmdsZV9mdW5kX3R5cGUpOiBMaWtld2lzZS4KLQotCUFsc28gaW5jb3Jwb3JhdGUgZnJvbSBHQ0MgdmVyc2lvbjoKLQotCVR1ZSBKdWwgMjEgMTM6Mjg6MTkgMTk5OCAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IFVzZSBkZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtIGZvciBhcnJheXMuCi0KLVRodSBBdWcgMTMgMTY6NDc6MzggMTk5OCAgS2F2ZWggUi4gR2hhemkgIDxnaGF6aUBjYWlwLnJ1dGdlcnMuZWR1PgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfbmVzdGVkX2FyZ3MpOiBNYWtlIGZ1bmN0aW9uIGRlZmluaXRpb24KLQlzdGF0aWMgdG8gbWF0Y2ggdGhlIHByb3RvdHlwZS4KLQotVHVlIEp1bCAyOCAxMTozMzowOSAxOTk4ICBNYXJrIE1pdGNoZWxsICA8bWFya0BtYXJrbWl0Y2hlbGwuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAodHlwZV9raW5kX3QpOiBOZXcgdHlwZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEFkZCB0eXBlX2tpbmRfdCBwYXJhbWV0ZXIuICBSZWx5Ci0Jb24gdGhpcyBwYXJhbXRlciwgcmF0aGVyIHRoYW4gZGVtYW5nbGluZyB0aGUgdHlwZSBhZ2Fpbi4KLQkoZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUpOiBQYXNzIHRrX2ludGVncmFsLgotCShkZW1hbmdsZV90ZW1wbGF0ZV86IFBhc3MgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gZG9fdHlwZS4KLQkoZG9fdHlwZSk6IFJldHVybiBhIHR5cGVfa2luZF90LiAgUGFzcyB0a19pbnRlZ3JhbCB0bwotCWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gZm9yIGFycmF5IGJvdW5kcy4KLQkoZGVtYW5nbGVfZnVuZF90eXBlKTogTGlrZXdpc2UuCi0KLQlBbHNvIGluY29ycG9yYXRlIGZyb20gR0NDIHZlcnNpb246Ci0KLQlUdWUgSnVsIDIxIDEzOjI4OjE5IDE5OTggIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBVc2UgZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSBmb3IgYXJyYXlzLgotCi1Nb24gSnVsIDI3IDEyOjE2OjA4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTE9DQSk6IE5ldyB2YXJpYWJsZS4KLQkoJChUQVJHRVRMSUIpKTogQWRkICQoQUxMT0NBKSB0byBsaWJyYXJ5LgotCShuZWVkZWQtbGlzdCk6IEFkZCAkKEFMTE9DQSkuCi0JKCQoQUxMT0NBKSk6IERlcGVuZCB1cG9uIHN0YW1wLXBpY2Rpci4KLQotU3VuIEp1bCAxOSAwODoyMzoxNyAxOTk4ICBLYXZlaCBSLiBHaGF6aSAgPGdoYXppQGNhaXAucnV0Z2Vycy5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IE1ha2UgZnVuY3Rpb24gZGVmaW5pdGlvbgotCXN0YXRpYyB0byBtYXRjaCB0aGUgcHJvdG90eXBlLgotCi1XZWQgSnVsIDE1IDAwOjEyOjU4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDaGVjayAtLXdpdGgtY3Jvc3MtaG9zdCByYXRoZXIgdGhhbgotCS0td2l0aC10YXJnZXQtc3ViZGlyIHdoZW4gZGVjaWRpbmcgd2hldGhlciBidWlsZCB1c2VzIGEgY3Jvc3MKLQljb21waWxlciwgYW5kIHdoZW4gZGVjaWRpbmcgd2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFyeS4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU3VuIEp1bCAxMiAwMToyNzowNSAxOTk4ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IFJldHVybiBhIHZhbHVlLgotCi1TYXQgSnVsIDExIDE2OjE5OjQ4IDE5OTggIE1hcmsgTWl0Y2hlbGwgIDxtYXJrQG1hcmttaXRjaGVsbC5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChzdHJpbmcpOiBNb3ZlIGRlZmluaXRpb24gYmVmb3JlIHdvcmtfc3R1ZmYuCi0JKHdvcmtfc3R1ZmYpOiBBZGQgdm9sYXRpbGVfdHlwZSwgZm9yZ2V0dGluZ190eXBlcywKLQlwcmV2aW91c19hcmd1bWVudCwgYW5kIG5yZXBlYXRzIGZpZWxkcy4KLQkoU0NPUEVfU1RSSU5HKTogTmV3IG1hY3JvLgotCShkZW1hbmdsZV90ZW1wbGF0ZSk6IEFkZCBgcmVtZW1iZXInIHBhcmFtZXRlci4gIEFkZCBjb21tZW50LgotCVJlZ2lzdGVyIHRoZSBgQicgY29kZSB0eXBlIGhlcmUsIGlmIHJlbWVtYmVyaW5nLiAgVGlkeS4gIEZpeCBjcmFzaAotCW9uIE5VTEwgdG1wbF9hcmd2ZWMuICBCZSBjb25zaXN0ZW50IHdpdGggdXNlIG9mIHRuYW1lL3RyYXduYW1lLgotCShkZW1hbmdsZV9uZXN0ZWRfYXJncyk6IE5ldyBmdW5jdGlvbi4KLQkoaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUpOiBIYW5kbGUgdm9sYXRpbGUtcXVhbGlmaWVkIG1lbWJlcgotCWZ1bmN0aW9ucy4KLQkobW9wX3VwKTogRGVsZXRlIHRoZSBwcmV2aW91c19hcmd1bWVudCBzdHJpbmcgaWYgcHJlc2VudC4KLQkoZGVtYW5nbGVfc2lnbmF0dXJlKTogVGlkeS4gIEhhbmRsZSB2b2xhdGlsZS1xdWFsaWZpZWQgbWVtYmVyCi0JZnVuY3Rpb25zLiAgSGFuZGxlIGJhY2stcmVmZXJlbmNlcyB1c2luZyB0aGUgYEInIGNvZGUuICBVc2UgZXh0cmEKLQlwYXJhbWV0ZXIgdG8gZGVtYW5nbGVfdGVtcGxhdGUgYW5kIFNDT1BFX1NUUklORyB3aGVyZSBhcHByb3ByaWF0ZS4KLQkoZGVtYW5nbGVfdGVtcGxhdGVfdmFsdWVfcGFybSk6IEZpeCB0aGlua287ICdCJyBpcyBub3QgYW4gaW50ZWdyYWwKLQljb2RlLgotCShkZW1hbmdsZV9jbGFzcyk6IFVzZSBTQ09QRV9TVFJJTkcuCi0JKGdudV9zcGVjaWFsKTogUGFzcyBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIGRlbWFuZ2xlX3RlbXBsYXRlLgotCVVzZSBTQ09QRV9TVFJJTkcuCi0JKGRlbWFuZ2xlX3F1YWxpZmllZCk6IFNhdmUgcXVhbGlmaWVkIHR5cGVzIGZvciBsYXRlcgotCWJhY2stcmVmZXJlbmNlcy4gIEhhbmRsZSBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0ZW1wbGF0ZQotCXR5cGVzIGNvcnJlY3RseS4KLQkoZG9fdHlwZSk6IFRpZHkuICBVc2UgU0NPUEVfU1RSSU5HLiAgUGFzcyBleHRyYSBhcmd1bWVudCB0bwotCWRlbWFuZ2xlX3RlbXBsYXRlLiAgVXNlIGRlbWFuZ2xlZF9uZXN0ZWRfYXJncy4gIERvbid0IHJlbWVtYmVyCi0JcXVhbGlmaWVkIHR5cGVzIGhlcmU7IHRoYXQncyBub3cgZG9uZSBpbiBkZW1hbmdsZV9xdWFsaWZpZWQuCi0JU2ltaWxhcmx5IGZvciB0ZW1wbGF0ZXMuCi0JKGRvX2FyZyk6IEltcHJvdmUgY29tbW1lbnQuICBIYW5kbGUgJ24nIHJlcGVhdCBjb2RlLgotCShyZW1lbWJlcl90eXBlKTogQ2hlY2sgZm9yZ2V0dGluZ190eXBlcy4KLQkoZGVtYW5nbGVfYXJncyk6IERlYWwgd2l0aCAnbicgcmVwZWF0IGNvZGVzLiAgVGlkeS4KLQotVGh1IEp1bCAgMiAxNjoyNjoyNCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogT25seSB1c2UgbWgtZmJzZDIxIG9uICotKi1mcmVlYnNkMi4yLlswMTJdLCBub3Qgb24KLQkqLSotZnJlZWJzZDIuMi4qLiAgRnJvbSBEbWl0cmlqIFRlamJsdW0gPHRlamJsdW1AYXJjLmhxLmN0aS5ydT4uCi0KLU1vbiBKdW4gMTUgMTY6Mjk6MDEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKHNldG9ianMpOiBDb3JyZWN0IHF1b3RpbmcgZXJyb3IgaW4gY3lnd2luMzIgY2FzZS4KLQlGcm9tIENocmlzIEZheWxvciA8Y2dmQGN5Z251cy5jb20+LgotCi1Nb24gSnVuICAxIDEzOjQ3OjU1IDE5OTggIEphc29uIE1vbGVuZGEgIChjcmFzaEBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6IFVwZGF0ZSB0byBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLU1vbiBKdW4gIDEgMTQ6MTc6MzYgMTk5OCAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGEgZGVwZW5kZW5jeSBvbiBzdGFtcC1waWNkaXIgZm9yIHRoZQotCW9iamVjdHMsIHNvIHRoYXQgd2UgY2FuIGRvIGEgcGFyYWxsZWwgYnVpbGQuCi0KLVNhdCBNYXkgMzAgMjI6MTc6MTMgMTk5OCAgTXVtaXQgS2hhbiAgPGtoYW5AeHJheWxpdGgud2lzYy5lZHU+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoY2hlY2tmdW5jcyk6IEFkZCBtaXNzaW5nICInIi4KLQotRnJpIE1heSAyOSAxMjo0MDo0MSAxOTk4ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChfb2JzdGFja19tZW1vcnlfdXNlZCk6ICBFbGlkZSB0aGlzIGZ1bmN0aW9uIGlmIHdlJ3JlCi0Jb24gYSBzeXN0ZW0gd2l0aCBHTlUgbGliYy4KLQotVHVlIE1heSAyNiAxODoyODo0MyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgY29uZmlnLmxvZy4KLQotVHVlIE1heSAyNiAxNTowMTo1MiAxOTk4ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERvbid0IHJlbW92ZSBhbGxvY2EtY29uZi5oLgotCi1GcmkgTWF5IDIyIDAxOjM4OjA3IDE5OTggIEhhbnMtUGV0ZXIgTmlsc3NvbiAgPGhwQGF4aXMuc2U+Ci0KLQkqIGNwbHVzLWRlbS5jIChNQlVGX1NJWkUpOiBCdW1wZWQgZnJvbSA1MTIgdG8gMzI3NjcuCi0KLTE5OTgtMDUtMjEgIE1hcmsgTWl0Y2hlbGwgIDxtbWl0Y2hlbGxAdXNhLm5ldD4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBIYW5kbGUgdm9sYXRpbGUgcXVhbGlmaWNhdGlvbi4KLQotMTk5OC0wNS0yMSAgTWFuZnJlZCBIb2xsc3RlaW4gIDxtYW5mcmVkQHMtZGlyZWt0bmV0LmRlPgotCi0JKiBjb25maWd1cmUuaW46IENoZWNrIGZvciB1bmlzdGQuaCBhcyB3ZWxsLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogY29uZmlnLmluOiBSZWJ1aWxkLgotCSogZ2V0cGFnZXNpemUuYyAoR05VX09VUl9QQUdFU0laRSk6IFVzZSBzeXNjb25mIG9ubHkgaWYgX1NDX1BBR0VTSVpFCi0JaXMgZGVmaW5lZCBpbiB1bmlzdGQuaC4gUmVmb3JtYXQgY29uZGl0aW9uYWwgYmxvY2sgZm9yIGVhc2llciByZWFkaW5nLgotCi0JKiBjb25maWcudGFibGUgKHNoYXJlZCk6IERlZmF1bHQgdG8gbm8gaWYgJHtlbmFibGVfc2hhcmVkfQotCWlzIHVuc2V0IG9yIGVtcHR5OyB0aGlzIGxvZ2ljIGlzIHVzZWQgYnkgdGhlIHRvcGxldmVsCi0JY29uZmlndXJlIHNjcmlwdHMsIHRvby4KLQotU2F0IE1heSAxNiAxNDowMToyNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkIGxpbmUgdG8gc2V0IGVuYWJsZV9zaGFyZWQgaW4gdGhlIE1ha2VmaWxlCi0JYXMgbmVlZGVkLgotCi1XZWQgTWF5IDEzIDE0OjI0OjM4IDE5OTggIEthdmVoIFIuIEdoYXppICA8Z2hhemlAY2FpcC5ydXRnZXJzLmVkdT4KLQotCSogY3BsdXMtZGVtLmMgKHNxdWFuZ2xlX21vcF91cCk6IENoYW5nZSByZXR1cm4gdHlwZSB0byB2b2lkLgotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSk6IFJlbW92ZSB1bnVzZWQgcGFyYW1ldGVyIGBvcHRpb25zJy4KLQlBbGwgY2FsbGVycyBjaGFuZ2VkLgotCShjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBSZW1vdmUgZnVuY3Rpb24gd2lkZSB2YXJpYWJsZSBgaW50IGknIGFuZAotCXJlcGxhY2Ugd2l0aCBgc2l6ZV90IGknIGF0IGVhY2ggbG9jYXRpb24gd2hlcmUgaXQgaXMgdXNlZC4KLQkoY3BsdXNfbWFuZ2xlX29wbmFtZSk6IGNoYW5nZSB0eXBlIG9mIGBpJyBmcm9tIGludCB0byBzaXplX3QuCi0KLVdlZCBNYXkgMTMgMTM6Mzk6MzggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbGxvY2EtY29uZi5oOiBJbmNsdWRlIGNvbmZpZy5oLiAgQ2hlY2sgSEFWRV9BTExPQ0FfSCByYXRoZXIKLQl0aGFuIHNwYXJjIG9yIHN1bi4KLQkqIE1ha2VmaWxlLmluIChhcmd2Lm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaCBhbmQgYWxsb2NhLWNvbmYuaC4KLQotRnJpIE1heSAgOCAwMDoyMzo1MSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGxpYmliZXJ0eV90b3BkaXIgY29ycmVjdGx5IHdoZW4gc3JjZGlyIGlzCi0JIi4iIGFuZCB3aXRoX3RhcmdldF9zdWJkaXIgaXMgbm90IHNldC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IE1heSAgNyAxMzowMTo0NCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkICotKi1taW5ndzMyKiBjYXNlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgTWF5ICA2IDExOjMzOjUxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBOZXZlciB1c2UgYSBQSUMgZmlsZSBmb3IgKi0qLWN5Z3dpbjMyKi4KLQotCSogTWFrZWZpbGUuaW4gKGNvbmZpZy5zdGF0dXMpOiBEZXBlbmQgdXBvbiBjb25maWcudGFibGUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogT24gYSBjeWd3aW4zMiBob3N0LCBhbHdheXMgY29tcGlsZSByYW5kb20sIGFuZAotCWRvbid0IHRlc3QgZm9yIHN5c19zaWdsaXN0LCBzdHJzaWduYWwsIG9yIHBzaWduYWwuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIGNsb2NrLmM6IENoZWNrIEhBVkVfU1lTX1BBUkFNX0ggcmF0aGVyIHRoYW4gTk9fU1lTX1BBUkFNX0guCi0JKiBnZXRjd2QuYzogTGlrZXdpc2UuCi0JKiBnZXRwYWdlc2l6ZS5jOiBMaWtld2lzZS4KLQkqIGdldHJ1bnRpbWUuYzogTGlrZXdpc2UuCi0KLVR1ZSBNYXkgIDUgMTg6MDg6MzIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JVXNlIGF1dG9jb25mIHRlc3RzIHJhdGhlciB0aGFuIHRoZSBvbGQgZHVtbXkuYyB0ZXN0OgotCSogY29uZmlndXJlLmluOiBBZGQgQUNfQVJHX1dJVEggY2FsbHMgZm9yIC0td2l0aC10YXJnZXQtc3ViZGlyIGFuZAotCS0td2l0aC1uZXdsaWIuICBBZGQgQUNfQ09ORklHX0hFQURFUi4gIFVzZSBBQ19SRVBMQUNFX0ZVTkNTIGZvcgotCW1vc3QgZnVuY3Rpb25zLiAgQWRkIHNwZWNpYWwgY2FzZXMgdG8gaGFuZGxlIG5ld2xpYiBhbmQgVnhXb3Jrcy4KLQlSZW1vdmUgdGFyZ2V0X21ha2VmaWxlX2ZyYWcuICBDcmVhdGUgc3RhbXAtaCBpbiBBQ19PVVRQVVQgaWYKLQlDT05GSUdfSEVBREVSUyBpcyBzZXQuICBPbmx5IGNhbGwgY29uZmlnLW1sLmluIGluIEFDX09VVFBVVCBpZgotCUNPTkZJR19GSUxFUyBpcyBzZXQ7IHNldCBhY19maWxlIGJlZm9yZSBjYWxsaW5nIGl0LgotCSogY29uZmlnLnRhYmxlIChhcm0tKi1yaXNjaXgqLCAqLSotY3lnd2luMzIpOiBSZW1vdmUuCi0JKCotKi1ocHV4KiwgKi0qLWhpdXgqLCAqLSotaXJpeDQqLCAqLSotc29sYXJpczIqKTogUmVtb3ZlLgotCSgqLSotc3lzdjQqLCAqLSotZ28zMiwgKi0qLXZ4d29ya3M1KiwgKi0qLXZ4d29ya3MpOiBSZW1vdmUKLQkoaVszNDU2XS0qLW1pbmd3MzIqKTogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW4gKEVSUk9SU19DQywgQ09ORklHX0gsIE5FRURFRF9MSVNUKTogUmVtb3ZlLgotCShMSUJPQkpTKTogTmV3IHZhcmlhYmxlLgotCShIT1NUX09GSUxFUywgRE9fQUxTTywgU1RBR0VTVFVGRik6IFJlbW92ZS4KLQkoYWxsKTogRGVwZW5kIHVwb24gbmVlZGVkLWxpc3QuICBEb24ndCBjaGVjayBSVUxFMS4KLQkoQHRhcmdldF9tYWtlZmlsZV9mcmFnQCk6IFJlbW92ZS4KLQkoQ09NUElMRS5jKTogSW5jbHVkZSBAREVGU0AuCi0JKEhGSUxFUyk6IEFkZCBhbGxvY2EtY29uZi5oLgotCShSRVFVSVJFRF9PRklMRVMpOiBSZW1vdmUgYmFzZW5hbWUuby4KLQkoJChUQVJHRVRMSUIpKTogTmV3IHRhcmdldC4KLQkoc3RhbXAtbmVlZGVkLCBsbmVlZGVkLWxpc3QsIG5lZWRlZC5hd2ssIHN0YW1wLWNvbmZpZyk6IFJlbW92ZS4KLQkobGNvbmZpZy5oLCBuZWVkZWQyLmF3aywgZHVtbXkubywgZXJyb3JzKTogUmVtb3ZlLgotCShuZWVkZWQtbGlzdCwgY29uZmlnLmgpOiBSZXdyaXRlLgotCShSVUxFMSwgJChSVUxFMSksIFJVTEUyLCAkKFJVTEUyKSk6IFJlbW92ZS4KLQkoLmFsd2F5cy4pOiBSZW1vdmUuCi0JKE1ha2VmaWxlKTogU2V0IENPTkZJR19GSUxFUyBhbmQgQ09ORklHX0hFQURFUlMuCi0JKHN0YW1wLWgpOiBOZXcgdGFyZ2V0LgotCShhdGV4aXQubywgY2xvY2subywgZ2V0Y3dkLm8sIGdldHBhZ2VzaXplLm8pOiBOZXcgdGFyZ2V0cy4KLQkoYmFzZW5hbWUubyk6IERvbid0IGRlcGVuZCB1cG9uIGNvbmZpZy5oLgotCShnZXRydW50aW1lLm8pOiBEZXBlbmQgdXBvbiBjb25maWcuaC4KLQkqIGF0ZXhpdC5jOiBJbmNsdWRlIGNvbmZpZy5oLiAgQ2hlY2sgSEFWRV9PTl9FWElUIHJhdGhlciB0aGFuCi0JTkVFRF9vbl9leGl0LgotCSogYmFzZW5hbWUuYzogRG9uJ3QgaW5jbHVkZSBjb25maWcuaC4gIERvbid0IGNoZWNrIE5FRURfYmFzZW5hbWUuCi0JKiBjbG9jay5jOiBJbmNsdWRlIGNvbmZpZy5oLgotCSogZ2V0Y3dkLmM6IExpa2V3aXNlLgotCSogZ2V0cGFnZXNpemUuYzogTGlrZXdpc2UuCi0JKiBnZXRydW50aW1lLmM6IExpa2V3aXNlLiAgRml4IGNoZWNrcyB3aGljaCBzZXQgSEFWRV9HRVRSVVNBR0UgYW5kCi0JSEFWRV9USU1FUy4KLQkqIHN0cmVycm9yLmM6IENoYW5nZSB1c2VzIG9mIE5FRURfc3lzX2Vycmxpc3QgdG8KLQlIQVZFX1NZU19FUlJMSVNULiAgTGlrZXdpc2UgZm9yIE5FRURfc3RyZXJyb3IgYW5kIEhBVkVfU1RSRVJST1IuCi0JKiBzdHJzaWduYWwuYzogTGlrZXdpc2UgZm9yIE5FRURfc3lzX3NpZ2xpc3QgYW5kIEhBVkVfU1lTX1NJR0xJU1QsCi0JYW5kIGZvciBORUVEX3N0cnNpZ25hbCBhbmQgSEFWRV9TVFJTSUdOQUwgYW5kIGZvciBORUVEX3BzaWduYWwgYW5kCi0JSEFWRV9QU0lHTkFMLgotCSogYWNjb25maWcuaDogTmV3IGZpbGUuCi0JKiBkdW1teS5jOiBSZW1vdmUuCi0JKiBmdW5jdGlvbnMuZGVmOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtY3h1eDcgKEhERUZJTkVTKTogUmVtb3ZlIC1ESEFWRV9TWVNDT05GLgotCSogY29uZmlnL21oLXdpbmRvd3MgKEhERUZJTkVTKTogUmVtb3ZlLgotCSogY29uZmlnL21oLWN5Z3dpbjMyOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtZ28zMjogUmVtb3ZlLgotCSogY29uZmlnL21oLWlyaXg0OiBSZW1vdmUuCi0JKiBjb25maWcvbWgtcmlzY2l4OiBSZW1vdmUuCi0JKiBjb25maWcvbWgtc3lzdjQ6IFJlbW92ZS4KLQkqIGNvbmZpZy9tdC1taW5ndzMyOiBSZW1vdmUuCi0JKiBjb25maWcvbXQtdnh3b3JrczU6IFJlbW92ZS4KLQkqIGNvbmZpZy5pbjogTmV3IGZpbGUsIGdlbmVyYXRlZCB1c2luZyBhdXRvaGVhZGVyLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTWF5ICA0IDEzOjAwOjI4IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBSZXdyaXRlIHRvIHVzZSBhdXRvY29uZi4KLQkqIGNvbmZpZ3VyZTogR2VuZXJhdGUgdXNpbmcgYXV0b2NvbmYuCi0JKiBjb25maWcvbWgtYTY4YnNkOiBSZW1vdmUuCi0JKiBjb25maWcvbWgtYXBvbGxvNjg6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1ocGJzZDogUmVtb3ZlLgotCSogY29uZmlnL21oLW5jcjMwMDA6IFJlbW92ZS4KLQkqIGNvbmZpZy9taC1zeXN2OiBSZW1vdmUuCi0JKiBjb25maWcvbWgtYWl4IChSQU5MSUIsIElOU1RBTEwpOiBEb24ndCBkZWZpbmUuCi0JKiBjb25maWcvbWgtY3h1eDcgKFJBTkxJQiwgSU5TVEFMTCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9taC1pcml4NCAoQ0MsIFJBTkxJQiwgSU5TVEFMTCk6IERvbid0IGRlZmluZS4KLQkqIGNvbmZpZy9taC1zeXN2NCAoUkFOTElCLCBJTlNUQUxMKTogRG9uJ3QgZGVmaW5lLgotCSogY29uZmlnLnRhYmxlOiBDaGFuZ2UgY29uZmlnX3NoZWxsIHRvIENPTkZJR19TSEVMTCwgYW5kIHVzZQotCWxpYmliZXJ0eV90b3BkaXIgdG8gZmluZCBtb3ZlLWlmLWNoYW5nZS4KLSAJKG02OGstYXBvbGxvLWJzZCosIG02OGstYXBvbGxvLXN5c3YqKTogUmVtb3ZlLgotCShpWzM0NTZdODYtbmNyLXN5c3Y0KiwgKi0qLWRndXgqLCBocHBhKi1ocC1ic2QqKTogUmVtb3ZlLgotCSgqLSotaXJpeCosICotKi1tODhrYmNzKiwgKi0qLXN5c3YqKTogUmVtb3ZlLgotCSogTWFrZWZpbGUuaW4gKHNyY2Rpcik6IFNldCB0byBAc3JjZGlyQC4KLQkoVlBBVEgpOiBMaWtld2lzZS4KLQkocHJlZml4LCBleGVjX3ByZWZpeCwgYmluZGlyLCBsaWJkaXIpOiBTZXQgdG8gYXV0b2NvbmYgdmFyaWFibGVzLgotCShTSEVMTCwgSU5TVEFMTCwgSU5TVEFMTF9QUk9HUkFNLCBJTlNUQUxMX0RBVEEpOiBMaWtld2lzZS4KLQkoQ0MsIENGTEFHUywgUkFOTElCKSk6IExpa2V3aXNlLgotCShkYXRhZGlyLCBtYW4qZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyLCBNQUtFSU5GTyk6IFJlbW92ZS4KLQkodGFyZ2V0X21ha2VmaWxlX2ZyYWcsIGhvc3RfbWFrZWZpbGVfZnJhZyk6IEFkZCBzdWJzdGl0dXRpb25zLgotCShJTlNUQUxMX0RFU1QpOiBTZXQgdG8gQElOU1RBTExfREVTVEAuCi0JKE1ha2VmaWxlKTogRGVwZW5kIHVwb24gY29uZmlnLnN0YXR1cy4gIERvbid0IGRlcGVuZCB1cG9uCi0JJChob3N0X21ha2VmaWxlX2ZyYWcpIG9yICQodGFyZ2V0X21ha2VmaWxlX2ZyYWcpLgotCShjb25maWcuc3RhdHVzKTogTmV3IHRhcmdldC4KLQotU3VuIE1heSAgMyAxNzo1ODo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tdC1zdW5vczQ6IFJlbW92ZS4gIFNob3VsZCBiZSBoYW5kbGVkIGJ5IC0td2l0aC1oZWFkZXJzCi0JYW5kIC0td2l0aC1saWJyYXJpZXMgb3B0aW9ucyBhdCB0b3AgbGV2ZWwuCi0JKiBjb25maWcudGFibGU6IE5ldmVyIHVzZSBtdC1zdW5vczQuCi0KLQkqIGFsbG9jYS1jb25mLmg6IE5ldyBmaWxlLCBjb21iaW5pbmcgYWxsb2NhLW5vcm0uaCBhbmQKLQlhbGxvY2EtYm90Y2guaC4KLQkqIGFsbG9jYS1ub3JtLmg6IFJlbW92ZS4KLQkqIGFsbG9jYS1ib3RjaC5oOiBSZW1vdmUuCi0JKiBjb25maWd1cmUuaW46IFNldCBzaGVsbCB2YXJpYWJsZXMgZmlsZXMgYW5kIGxpbmtzIHRvIGVtcHR5LgotCSogY29uZmlnLnRhYmxlOiBEb24ndCBzZXQgc2hlbGwgdmFyaWFibGUgZmlsZXMuCi0JKiBjb25maWd1cmUuYmF0OiBEb24ndCBjcmVhdGUgYWxsb2NhLWNvbmYuaC4KLQkqIG1ha2VmaWxlLnZtczogTGlrZXdpc2UuCi0JKiBtcHctY29uZmlnLmluOiBMaWtld2lzZS4KLQkqIHZtc2J1aWxkLmNvbTogTGlrZXdpc2UuCi0KLUZyaSBNYXkgIDEgMTE6NDE6NDIgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChIT1NUX09GSUxFUykgJChSRVFVSVJFRF9PRklMRVMpKTogUmVtb3ZlIG9sZAotCXRhcmdldCBkZXBlbmRpbmcgdXBvbiBjb25maWcuaC4KLQkoYWxsb2NhLm8pOiBBZGQgdGFyZ2V0IGRlcGVuZGluZyB1cG9uIGNvbmZpZy5oCi0JKGJhc2VuYW1lLm8sIGNob29zZS10ZW1wLm8sIGZubWF0Y2gubyk6IExpa2V3aXNlLgotCShnZXRvcHQubywgZ2V0b3B0MS5vLCBwZXhlY3V0ZS5vLCBzdHJlcnJvci5vKTogTGlrZXdpc2UuCi0JKHN0cnNpZ25hbC5vLCB4c3RyZXJyb3Iubyk6IExpa2V3aXNlLgotCi1GcmkgTWF5ICAxIDA0OjI2OjI1IDE5OTggIFBldGVyIFNjaGF1ZXIgPHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlPgotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogIEluaXRpYWxpemUgd29yay4KLQotTW9uIEFwciAyNyAxNTo1MzozMCBFRFQgMTk5OCBBbmRyZXcgTWFjTGVvZCA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6IFJlcGxhY2UgbWlzc2luZyBlbHNlLgotCi1TdW4gQXByIDI2IDE1OjM4OjUwIDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiBGaXggb2ZmLWJ5LW9uZSBidWcgd2hlbiBjaGVja2luZyB0aGUKLQlsZW5ndGggaW4gdGhlIG5hbWUgb2YgYSB2aXJ0dWFsIHRhYmxlLgotCi1XZWQgQXByIDIyIDEwOjUzOjQ5IEVEVCAxOTk4IEFuZHJldyBNYWNMZW9kICA8YW1hY2xlb2RAY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKHN0cnVjdCB3b3JrIHN0dWZmKTogQWRkIGZpZWxkIGZvciBCIGFuZCBLIG1hbmdsZSBjb2Rlcy4KLQkoY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogQ2FsbCBtb3BfdXBfc3F1YW5nbGUuCi0JKGNwbHVzX2RlbWFuZ2xlKTogSW5pdGlhbGl6ZSBzcXVhbmdsZSBpbmZvLCB0aGVuIGNhbGwKLQlpbnRlcm5hbF9jcGx1c19kZW1hbmdsZS4gKE1vc3QgY29kZSBtb3ZlZCB0aGVyZSBhcyB3ZWxsKQotCShpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSk6IE5ldyBmdW5jdGlvbiwgcGVyZm9ybXMgbW9zdCBvZiB3aGF0IHVzZQotCXRvIGJlIGRvbmUgaW4gY3BsdXNfZGVtYW5nbGUsIGJ1dCBpcyBvbmx5IGNhbGxlZCB3aXRoIHRoaXMgZmlsZS4KLQkoc3F1YW5nbGVfbW9wX3VwKTogTmV3IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIEIgYW5kIEsgY29kZSBkYXRhLgotCShtb3BfdXApOiBzZXQgcG9pbnRlcnMgdG8gTlVMTCBhZnRlciBmcmVlaW5nLgotCShkZW1hbmdsZV9zaWduYXR1cmUsIGRlbWFuZ2xlX3RlbXBsYXRlLCBkZW1hbmdsZV9jbGFzcyk6IEFkZAotCXN3aXRjaCBlbGVtZW50cyB0byBoYW5kbGUgSyBhbmQgQiBjb2Rlcy4KLQkoZGVtYW5nbGVfcHJlZml4LCBnbnVfc3BlY2lhbCwgZGVtYW5nbGVfcXVhbGlmaWVkKTogQWRkCi0JY29kZSB0byBoYW5kbGUgSyBhbmQgQiBjb2Rlcy4KLQkoZG9fdHlwZSwgZGVtYW5nbGVfZnVuZF90eXBlKTogSGFuZGxlIEIgYW5kIEsgY29kZXMuCi0JKHJlbWVtYmVyX0t0eXBlKTogTmV3IGZ1bmN0aW9uIHRvIHN0b3JlIEsgaW5mby4KLQkocmVnaXN0ZXJfQnR5cGUsIHJlbWVtYmVyX0J0eXBlKTogTmV3IGZ1bmN0aW9ucyBmb3IgQiBjb2Rlcy4KLQkoZm9yZ2V0X0JfYW5kX0tfdHlwZXMpOiBOZXcgZnVuY3Rpb24gdG8gZGVzdHJveSBCIGFuZCBLIGluZm8uCi0KLUZyaSBBcHIgMTAgMDE6NDk6MTAgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBDT1BZSU5HLkxJQiwgY2hvb3NlLXRlbXAuYywgY3BsdXMtZGVtLmM6IFN5bmMgd2l0aCBlZ2NzICYgZ2NjLgotCi1UaHUgTWFyICA1IDA5OjIzOjI4IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogY29uZmlnLnRhYmxlOiBNYWtlIGxvY2F0aW5nIGZyYWcgZmlsZXMgZmFpbHNhZmUgZXZlbiBmb3IgdGhlCi0Jc3BlY2lhbCBjYXNlIGlmIGNvbmZpZ3VyaW5nIGFuZCBidWlsZGluZyBpbiBzcmNkaXIuCi0KLU1vbiBGZWIgMjMgMTQ6MzM6MTUgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjaG9vc2UtdGVtcC5jOiBGaXggaGFuZGxpbmcgb2Ygc3lzL2ZpbGUuaCB0byB3b3JrIGluIGxpYmliZXJ0eS4KLQotU3VuIEZlYiAyMiAxODowMzoyMyAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGNob29zZS10ZW1wLmM6IFN5bmMgd2l0aCBjb3B5IGluIGdjYy4KLQotVGh1IEZlYiAxMiAxNjoyOTo0OSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGdldG9wdC5jOiBVcGRhdGUgdG8gbGF0ZXN0IEZTRiB2ZXJzaW9uLgotCSogZ2V0b3B0MS5jOiBMaWtld2lzZS4KLQotVHVlIEZlYiAxMCAxNjo1ODozMyAxOTk4ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6IERvbid0IGdldCBjb25mdXNlZCBieSAuPGRpZ2l0cz4KLQlzdHJpbmdzIHRoYXQgYXJlIG5vdCBhY3R1YWxseSBsZW5ndGhzLgotCi1GcmkgRmViICA2IDAxOjM1OjE3IDE5OTggIE1hbmZyZWQgSG9sbHN0ZWluICA8bWFuZnJlZEBzLWRpcmVrdG5ldC5kZT4KLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBEb24ndCBwYXNzIFBJQ0ZMQUcuCi0JKC5jLm8pOiBDaGVjayB2YWx1ZSBvZiBlbmFibGVfc2hhcmVkLCBub3QgUElDRkxBRy4KLQkoc3RhbXAtcGljZGlyKTogRGl0by4KLQotVGh1IEZlYiAgNSAxODo0ODo1NiAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlnL21oLWN5Z3dpbjMyOiByZW1vdmUgdmFzcHJpbnRmLm8gZnJvbSBFWFRSQV9PRklMRVMKLSAgICAgICAgc2luY2UgaXQgZ2V0cyBidWlsdCBhdXRvbWF0aWNhbGx5Ci0KLVN1biBGZWIgIDEgMDI6NTI6MzIgMTk5OCAgTWlrZSBTdHVtcCAgPG1yc0B3cnMuY29tPgotCi0JKiBjb25maWcudGFibGUgKHZ4d29ya3MgY29uZmlncyk6IERlZmF1bHQgdG8gVnhXb3JrcyA1LngsIGFzIHRoYXQgaXMKLQl0aGUgY3VycmVudGx5IHNoaXBwaW5nIE9TLgotCi1UdWUgSmFuIDI3IDE2OjA4OjIwIDE5OTggIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiB2bXNidWlsZC5jb20gW1JFUVVJUkVfT0ZJTEVTXTogU3luY2hyb25pemVkIHdpdGggTWFrZWZpbGUuaW46Ci0JQWRkIGZubWF0Y2gubyBhbmQgb2JqYWxsb2MubzsgcmVtb3ZlIHZhc3ByaW50Zi5vLgotCVtjb25maWcuaF06IERlZmluZSBORUVEX3N0cnNpZ25hbC4KLQotTW9uIEphbiAxOSAxMjoyMDowMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZ1bmN0aW9ucy5kZWY6IENvcnJlY3QgYXJndW1lbnQgdHlwZXMgZm9yIHN0cmVycm9yIGFuZAotCXN0cnNpZ25hbC4gIFJlcG9ydGVkIGJ5IEFsZXggR3V0bWFuIDxhZ3V0bWFuQGVtYy5jb20+LgotCi1TdW4gSmFuIDE4IDE1OjU3OjI4IDE5OTggIE1pY2hhZWwgU255ZGVyICA8bXNueWRlckBjbGVhdmVyLmN5Z251cy5jb20+Ci0KLQkqIHZhc3ByaW50Zi5jIChpbnRfdmFzcHJpbnRmKTogSW5jcmVhc2UgYnVmZmVyIHNpemUgZm9yIGZsb2F0L2RvdWJsZQotCXZhbHVlcy4KLQotU2F0IEphbiAxNyAyMjoyODozOCAxOTk4ICBNdW1pdCBLaGFuICA8a2hhbkB4cmF5bGl0aC53aXNjLmVkdT4KLQkJCSAgSi5KLiBWYW5kZXJIZWlqZGVuIDxKLkoudmFuZGVySGVpamRlbkBzdHVkZW50LnV0d2VudGUubmw+Ci0KLQlBZGQgbWluZ3czMiBzdXBwb3J0LgotCSogcGV4ZWN1dGUuYyAocGV4ZWN1dGUpOiBOZXcgZnVuY3Rpb24gZm9yIG1pbmd3MzIuIFN1cHBvcnRzIHBpcGVzLgotCShwd2FpdCk6IE5ldyBmdW5jdGlvbiBmb3IgbWluZ3czMi4KLQotCSogY29uZmlnLnRhYmxlIChpWzM0NTZdODYtKi1taW5ndzMyKik6IFN1cHBvcnQgZm9yIGkzODYtbWluZ3czMi4KLQkqIGNvbmZpZy9tdC1taW5ndzMyOiBOZXcgZmlsZS4KLQkqIHhtYWxsb2MuYyAoZmlyc3RfYnJlYWspOiBOb3QgdXNlZCBmb3IgbWluZ3czMi4KLQkoeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lKTogRG9uJ3QgdXNlIHNicmsgb24gbWluZ3czMi4KLQkoeG1hbGxvYyk6IExpa2V3aXNlLgotCSh4cmVhbGxvYyk6IExpa2V3aXNlLgotCi1TYXQgSmFuIDE3IDIyOjI4OjA1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogY2hvb3NlLXRlbXAuYzogU3luYyB3aXRoIGdjYyB2ZXJzaW9uLgotCi1UdWUgSmFuIDEzIDE4OjM0OjM5IDE5OTggIEppbSBXaWxzb24gIDx3aWxzb25AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxfdG9fbGliZGlyLCBpbnN0YWxsX3RvX3Rvb2xkaXIpOiBBZGQgTVVMVElTVUJESVIKLQl0byBhbGwgZmlsZW5hbWVzIGluIGxpYmRpciBhbmQgdG9vbGRpci4KLQkoZGlzdGNsZWFuKTogRG8gTVVMVElDTEVBTiBiZWZvcmUgZGVsZXRpbmcgTWFrZWZpbGUuCi0JKHN0YW1wLW5lZWRlZCwgc3RhbXAtY29uZmlnKTogQWRkIE1VTFRJU1JDVE9QIHRvCi0JcGF0aG5hbWUgZm9yIG1vdmUtaWYtY2hhbmdlLgotCi1UaHUgRGVjICA0IDE3OjI1OjE5IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMgKHN5c19uc2lnKTogVHJ5IE5TSUcgYW5kIF9OU0lHLgotCi1XZWQgTm92IDE5IDEzOjM3OjA2IDE5OTcgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBhbGxvY2Etbm9ybS5oIChhbGxvY2EsIEdDQyBjYXNlKTogRG9uJ3QgcmVkZWZpbmUgYWxsb2NhIGlmIGl0Ci0Jd2FzIGFscmVhZHkgZGVmaW5lZCBwcmV2aW91c2x5LgotCi1Nb24gTm92IDEwIDEyOjQ4OjAzIDE5OTcgIFBoaWxpcHBlIERlIE11eXRlciAgPHBoZG1AbWFjcWVsLmJlPgotCi0JKiBNYWtlZmlsZS5pbiAoSU5TVEFMTCk6IFVzZSAuLi9pbnN0YWxsLXNoLCBub3QgaW5zdGFsbC4KLQotVHVlIE9jdCAyOCAyMzo0MToxNSAxOTk3ICBKdWR5IEdvbGRiZXJnICA8am9keWdAaWR0Lm5ldD4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBwZXhlY3V0ZS5jLgotCi1XZWQgT2N0IDE1IDE5OjEzOjQ4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXNwcmludGYuYzogQ29uc2lzdGVudGx5IHVzZSBlaXRoZXIgc3RkYXJnIG9yIHZhcmFyZ3MuCi0KLVR1ZSBPY3QgMTQgMTI6MDE6MDAgMTk5NyAgTWFyayBNaXRjaGVsbCAgPG1taXRjaGVsbEB1c2EubmV0PgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogRG9uJ3QgbG9vayBmb3IgcmV0dXJuIHR5cGVzIG9uCi0JY29uc3RydWN0b3JzLiAgSGFuZGxlIG1lbWJlciB0ZW1wbGF0ZSBjb25zdHJ1Y3RvcnMuCi0KLUZyaSBPY3QgIDMgMTc6NTM6MzAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBSRUFETUU6IEZpeCBjb25maWd1cmF0aW9uIGluc3RydWN0aW9ucy4KLQotTW9uIFNlcCAyOSAxMjoyODo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmM6IFVwZGF0ZSB0byBjdXJyZW50IHZlcnNpb24gZnJvbSAvZ2QvZ251L2xpYjoKLQotCU1vbiBTZXAgMjkgMTI6Mjc6NTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0gICAgICAgICogcGV4ZWN1dGUuYzogVXNlIHNwYXduIGlmIF9fQ1lHV0lOMzJfXy4KLQotCTE5OTctMDgtMDggIFBhdWwgRWdnZXJ0ICA8ZWdnZXJ0QHR3aW5zdW4uY29tPgotCi0gICAgICAgICogcGV4ZWN1dGUuYzogSW5jbHVkZSAiY29uZmlnLmgiIGZpcnN0LCBhcyBwZXIgYXV0b2NvbmYgbWFudWFsLgotCi0JRnJpIEp1biAyNyAxNToyMDoyOSAxOTk3ICBTY290dCBDaHJpc3RsZXkgPHNjb3R0Y0BuZXQtY29tbXVuaXR5LmNvbT4KLQotICAgICAgICAqIHBleGVjdXRlLmMgKGZpeF9hcmd2KTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAocGV4ZWN1dGUpOiBXaW4zMiBidXQgbm90IEN5Z3dpbjMyIG5lZWRzIGl0cyBhcmd1bWVudHMgZml4ZWQuCi0gICAgICAgIEFkZCB1bmRlcnNjb3JlIHRvIGN3YWl0IGZ1bmN0aW9uIGNhbGwuCi0KLVN1biBTZXAgMjggMTI6MDA6NTIgMTk5NyAgTWFyayBNaXRjaGVsbCAgPG1taXRjaGVsbEB1c2EubmV0PgotCi0gICAgICAgICogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogQWRkIG5ldyBwYXJhbWV0ZXIuICBIYW5kbGUgbmV3Ci0gICAgICAgIHRlbXBsYXRlLWZ1bmN0aW9uIG1hbmdsaW5nLgotICAgICAgICAoY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzKTogTmV3IGZ1bmN0aW9uLgotICAgICAgICAoZGVtYW5nbGVfc2lnbmF0dXJlKTogSGFuZGxlIG5ldyBuYW1lLW1hbmdsaW5nIHNjaGVtZS4KLQotV2VkIFNlcCAyNCAwMDozMTo1OSAxOTk3ICBGZWxpeCBMZWUgIDxmbGVlQHlpbi5jeWdudXMuY29tPgotCi0JKiBhc3ByaW50Zi5jOiBzdGRhcmcuaCB3aGVuIEFMTU9TVF9TVERDCi0JKiBjb25maWcvbWgtd2luZG93cyAoRVhUUkFfT0ZJTEVTKTogYWRkIGFzcHJpbnRmLm8gYW5kCi0gCXN0cm5jYXNlY21wLm8uCi0KLVRodSBBdWcgMjggMTQ6Mjc6MTUgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB2YXNwcmludGYuYyAodmFzcHJpbnRmKTogQWxsb3cgZm9yIF9CU0RfVkFfTElTVF8uCi0KLQkqIGNvbmZpZy50YWJsZTogQWRkIGNhc2UgZm9yIEZyZWVCU0QgMi4xIGFuZCAyLjIsIG5lZWRzIG1oLWZic2QyMS4KLQotCSogY29uZmlnL21oLWZic2QyMSAoRVhUUkFfT0ZJTEVTKTogRm9yY2UgdmFzcHJpbnRmLm8KLQotV2VkIFNlcCAxMCAxMjo0MzoxMCAxOTk3ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBDaGFuZ2UgImNvbXBsZXgiIHRvICJfX2NvbXBsZXgiLgotCi1GcmkgU2VwICA1IDE2OjM0OjQyIDE5OTcgIEFuZHJldyBDYWduZXkgIDxjYWduZXlAYjEuY3lnbnVzLmNvbT4KLQotCSogYXNwcmludGYuYyAoYXNwcmludGYpOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgYXNwcmludGYuYwotCSogZnVuY3Rpb25zLmRlZjogRGl0dG8uCi0KLVRodSBBdWcgMjggMTg6NTM6MzQgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiBhcmd2LmMgKGR1cGFyZ3YpOiBOZXcgZnVuY3Rpb24sIGR1cGxpY2F0ZSBhbiBhcmd1bWVudCB2ZWN0b3IuCi0KLVR1ZSBBdWcgMTkgMjA6Mjg6NDUgMTk5NyAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWN5Z3dpbjMyOiBhbHNvIGJ1aWxkIHJhbmRvbS5vCi0KLVR1ZSBBdWcgMTkgMTc6MTA6NTYgMTk5NyAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogQWRkICdleHRlcm4nIHRvIHByZXBlbmRzX3VuZGVyc2NvcmUuCi0KLVdlZCBKdWwgMzAgMTE6NDI6MTkgMTk5NyAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBWYXJpb3VzIGNoYW5nZXMgdG8gcHJvZHVjZSBKYXZhIG91dHB1dCB3aGVuIHBhc3NlZAotCURNR0xfSkFWQS4gIFRodXMgIjo6IiBiZWNvbWVzICIuIiBhbmQgIkpBcnJheTxGb28+IiBiZWNvbWVzICJGb29bXSIuCi0JKG1haW4pOiBTdXBwb3J0IC0tamF2YSBhbmQgLWogZmxhZ3MgdG8gc2V0IERNR0xfSkFWQS4KLQotVHVlIEp1bCAyMiAxOTowNToyMyAxOTk3ICBSb2JlcnQgSG9laG5lIDxyb2JlcnQuaG9laG5lQE1hdGhlbWF0aWsuVFUtQ2hlbW5pdHouREU+Ci0KLQkqIGNvbmZpZy9taC1nbzMyIChDQywgQVIsIFJBTkxJQik6IERvbid0IGRlZmluZS4KLQotVHVlIEp1bCAyMiAxNzo0OTo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChSRVFVSVJFRF9PRklMRVMpOiBBZGQgcGV4ZWN1dGUuby4KLQkocGV4ZWN1dGUubyk6IE5ldyB0YXJnZXQuCi0KLQkqIE1ha2VmaWxlLmluIChzdGFtcC1uZWVkZWQpOiBOZXcgdGFyZ2V0LCByZXBsYWNpbmcgbmVlZGVkLWxpc3QuCi0JKG5lZWRlZC1saXN0KTogSnVzdCBkZXBlbmQgdXBvbiBzdGFtcC1uZWVkZWQuCi0JKHN0YW1wLWNvbmZpZyk6IE5ldyB0YXJnZXQsIHJlcGxhY2luZyBjb25maWcuaC4KLQkoY29uZmlnLmgpOiBKdXN0IGRlcGVuZCB1cG9uIHN0YW1wLWNvbmZpZy4KLQkobW9zdGx5Y2xlYW4pOiBSZW1vdmUgc3RhbXAtKi4KLQotVGh1IEp1biAxMiAxMTowMDoxOCAxOTk3ICBBbmdlbGEgTWFyaWUgVGhvbWFzIChhbmdlbGFAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiBwYXNzIElOU1RBTEwsIElOU1RBTExfUFJPR1JBTSBhbmQKLQlJTlNUQUxMX0RBVEEgZm9yIG11bHRpbGliYmVkIGluc3RhbGxzCi0KLVR1ZSBKdW4gIDMgMTM6MjE6MDUgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCVR1ZSBEZWMgMTAgMDk6NDQ6NTcgMTk5NiAgUGF1bCBFZ2dlcnQgIDxlZ2dlcnRAdHdpbnN1bi5jb20+Ci0KLQkqIGNob29zZS10ZW1wLmMgKGNob29zZV90ZW1wX2Jhc2UpOiBEb24ndCBkdW1wIGNvcmUgaWYgVE1QRElSIGlzIGVtcHR5LgotCi0JKiBjaG9vc2UtdGVtcC5jICh0cnkpOiBJbnNpc3QgdGhhdCB0ZW1wIGRpciBiZSBzZWFyY2hhYmxlLgotCi0JV2VkIE9jdCAyMyAxNzozNjozOSAxOTk2ICBEb3VnIFJ1cHAgIChydXBwQGduYXQuY29tKQotCi0JKiBjaG9vc2UtdGVtcC5jIChjaG9vc2VfdGVtcF9iYXNlKTogT24gVk1TLCB1c2UgcHJvcGVyIHN5bnRheAotCWZvciBjdXJyZW50IGRpcmVjdG9yeS4KLQotCVNhdCBGZWIgMTUgMTk6MDM6NDggMTk5NyAgR2VvZmZyZXkgTm9lciAgKG5vZXJAY3lnbnVzLmNvbSkKLQotCSogcGV4ZWN1dGUuYzogUmVtb3ZlIHNwZWNpYWwgY2FzZXMgZm9yIGN5Z3dpbjMyLgotCShwd2FpdCk6IFJlbW92ZSBsb2NhbCBkZWZpbml0aW9uIG9mIGBwaWQnLgotCi0JVHVlIE5vdiAxMiAxODoyNjoxNSAxOTk2ICBEb3VnIFJ1cHAgIChydXBwQGduYXQuY29tKQotCi0JKiBwZXhlY3V0ZS5jICh2Zm9yayk6IFN1cHBseSBuZXcgZGVmaW5pdGlvbiBmb3IgVk1TLgotCShwd2FpdCk6IFVzZSB3YWl0cGlkIGluc3RlYWQgb2Ygd2FpdCBmb3IgVk1TLgotCi1UdWUgTWF5IDIwIDE0OjAyOjIwIDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiBIYW5kbGUgYEonLgotCShkZW1hbmdsZV9mdW5kX3R5cGUpOiBQcmludCAiY29tcGxleCIgZm9yIGl0LgotCi1XZWQgQXByIDMwIDEyOjE1OjQ1IDE5OTcgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCB0dXJuIG9uIG11bHRpbGliIGhlcmUuCi0KLU1vbiBBcHIgMjggMTk6MDQ6MzEgMTk5NyAgTWljaGFlbCBTbnlkZXIgIDxtc255ZGVyQGNsZWF2ZXIuY3lnbnVzLmNvbT4KLQotCSogb2JzdGFjay5jOiBtb3ZlIF9vYnN0YWNrX21lbW9yeV91c2VkIG91dHNpZGUgb2YgaWZkZWYuICBDYW5ub3QgYmUKLQllbGlkZWQ7IG5lZWRlZCBieSBnZGIgYW5kIG5vdCBwcmVzZW50IGluIGxpYmMuCi0KLVRodSBBcHIgMjQgMTk6MzM6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY2xlYW4pOiBSZW1vdmUgdG1wbXVsdGkub3V0LgotCi1UdWUgQXByIDIyIDEwOjI1OjE1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9saXR0bGVieXRlX2JpZ3dvcmQpOgotCUFkZCBuZXcgZmxvYXRmb3JtYXQsIG1haW5seSBmb3IgQVJNIGRvdWJsZXMuCi0KLU1vbiBBcHIgMTQgMTI6MTE6MTYgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IFVzZSAke2NvbmZpZ19zaGVsbH0gd2l0aCAke21vdmVpZmNoYW5nZX0uICBGcm9tCi0JVGhvbWFzIEdyYWljaGVuIDxncmFpY2hlbkByenBkLmRlPi4KLQotRnJpIEFwciAgNCAwMzowOToyNCAxOTk3ICBVbHJpY2ggRHJlcHBlciAgPGRyZXBwZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBFbmFibGUgbXVsdGlsaWJpbmcgYnkgZGVmYXVsdC4KLQlVcGRhdGUgbXVsdGlsaWIgdGVtcGxhdGUgdG8gcmVhZCBjb25maWctbWwuaW4uCi0KLVR1ZSBBcHIgIDEgMTY6MjY6MzkgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogQWRkIG9iamFsbG9jLgotCi1Nb24gTWFyIDMxIDIzOjU3OjUxIDE5OTcgIEguSi4gTHUgIDxoamxAZ251LmFpLm1pdC5lZHU+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9pdCk6IEFkZCBwcm90b3R5cGUgZGVjbGFyYXRpb24uCi0JKHVzYWdlLCBmYXRhbCk6IExpa2V3aXNlLgotCi0JKiB4ZXhpdC5jIChfeGV4aXRfY2xlYW51cCk6IEFkZCBwcm90b3R5cGUuCi0KLQkqIHN0cmVycm9yLmMgKGluaXRfZXJyb3JfdGFibGVzKTogRGVjbGFyZS4KLQotRnJpIE1hciAyOCAxMTo0MzoyMCAxOTk3ICBILkouIEx1ICA8aGpsQGx1Y29uLm9yZz4KLQotCSogZnVuY3Rpb25zLmRlZjogQWRkIERFRiBvZiB2YXNwcmludGYsIGFuZCBERUZGVU5DIG9mIHN0cnNpZ25hbC4KLQkqIHN0cnNpZ25hbC5jOiBPbmx5IGRlZmluZSBzdHJzaWduYWwgaWYgTkVFRF9zdHJzaWduYWwuCi0JKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTKTogUmVtb3ZlIHZhc3ByaW50Zi5vLgotCSogY29uZmlndXJlLmluOiBBZGQgTkVFRF9zdHJzaWduYWwgdG8geGNvbmZpZy5oLiAgQWRkIHZhc3ByaW50Zi5vCi0JdG8geG5lZWRlZC1saXN0LgotCSogY29uZmlnL21oLWN5Z3dpbjMyIChIREVGSU5FUyk6IEFkZCAtRE5FRURfc3Ryc2lnbmFsLgotCShFWFRSQV9PRklMRVMpOiBEZWZpbmUgdG8gdmFzcHJpbnRmLm8uCi0JKiBjb25maWcvbWgtd2luZG93cyAoSERFRklORVMpOiBBZGQgLURORUVEX3N0cnNpZ25hbC4KLQkoRVhUUkFfT0ZJTEVTKTogQWRkIHZhc3ByaW50Zi5vLgotCSogY29uZmlnL210LXZ4d29ya3M1ICh2eGNvbmZpZy5oKTogRGVmaW5lIE5FRURfc3Ryc2lnbmFsLgotCSh2eG5lZWRlZC1saXN0KTogQWRkIHZhc3ByaW50Zi5vLgotCi1UaHUgTWFyIDIwIDE3OjAyOjA5IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogb2JqYWxsb2MuYzogSW5jbHVkZSA8c3RkaW8uaD4uCi0KLU1vbiBNYXIgMTcgMTk6MjM6MTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYmphbGxvYy5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgb2JqYWxsb2MuYwotCShSRVFVSVJFRF9PRklMRVMpOiBBZGQgb2JqYWxsb2Muby4KLQkob2JqYWxsb2Mubyk6IE5ldyB0YXJnZXQuCi0KLVNhdCBNYXIgMTUgMTg6NDk6NDEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBvYnN0YWNrLmM6IFVwZGF0ZSB0byBjdXJyZW50IEZTRiB2ZXJzaW9uLgotCi1GcmkgTWFyIDE0IDE0OjE4OjQ3IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IEFkZCBwcm90b3R5cGVzIGZvciBhbGwgc3RhdGljIGZ1bmN0aW9ucy4KLQkobXlzdHJzdHIpOiBNYWtlIHN0YXRpYy4gIE1ha2UgYXJndW1lbnRzIGFuZCByZXN1bHQgY29uc3QuCi0JKGNwbHVzX21hdGNoKTogUmVtb3ZlOyBub3QgdXNlZC4KLQotVHVlIE1hciAxMSAxNDoyMDozMSAxOTk3ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChnbnVfc3BlY2lhbCk6IENhbGwgZGVtYW5nbGVkX2Z1bmRfdHlwZSBmb3Igb3RoZXIKLQlfX3QqIHN5bWJvbHMuCi0KLVR1ZSBNYXIgMTEgMTU6NDE6MjEgMTk5NyAgSC5KLiBMdSAgPGhqbEBsdWNvbi5vcmc+Ci0KLQkqIHNwYWNlcy5jOiBEZWNsYXJlIG1hbGxvYyBhbmQgZnJlZSBwcm9wZXJseS4KLQkqIHN0cnNpZ25hbC5jIChpbml0X3NpZ25hbF90YWJsZXMpOiBBZGQgcHJvdG90eXBlLgotCSogeGF0ZXhpdC5jIChfeGV4aXRfY2xlYW51cCk6IEFkZCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25zLgotCi1XZWQgRmViIDE5IDE1OjQzOjI0IDE5OTcgIEJyZW5kYW4gS2Vob2UgIDxicmVuZGFuQGxpc2EuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IElmIGFsbG9jYS5vIGlzIG5lZWRlZCwgeGV4aXQubyBpcwotCWFsc28gcmVxdWlyZWQgYmVjYXVzZSBvZiB4bWFsbG9jLm8uCi0KLUZyaSBGZWIgMTQgMTM6NDM6MzggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJzaWduYWwuYzogVW5jb25kaXRpb25hbGx5IHJlZGVmaW5lIHN5c19zaWdsaXN0IGFyb3VuZCB0aGUKLQlpbmNsdXNpb24gb2YgdGhlIHN5c3RlbSBoZWFkZXIgZmlsZXMuCi0KLVRodSBGZWIgMTMgMjI6MDE6MDQgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogUmVtb3ZlIDggYml0IGNoYXJhY3RlcnMuICBVcGRhdGUgdG8gbGF0ZXN0Ci0JZ2NjIHJlbGVhc2UuCi0KLVR1ZSBGZWIgIDQgMTE6NTI6MTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJzaWduYWwuYzogVXNlIE5FRURfc3lzX3NpZ2xpc3QgaW5zdGVhZCBvZgotCUxPU0lOR19TWVNfU0lHTElTVC4KLQkqIGNvbmZpZy50YWJsZTogRG9uJ3QgdXNlIG1oLWx5bnhvcy4KLQkqIGNvbmZpZy9taC1seW54b3M6IFJlbW92ZS4KLQotVGh1IEphbiAxNiAxNDo1MTowMyAxOTk3ICBCb2IgTWFuc29uICA8bWFuc29uQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IEZpeCBpbmRlbnRpbmc7IG1ha2UgaWRlbnRpY2FsIHRvIHRoZSBjb3B5Ci0JaW4gR0NDLgotCShkb190eXBlLCBjYXNlICdNJyk6IENoZWNrIGZvciBhIHRlbXBsYXRlIGFzIHdlbGwgYXMgYSBjbGFzcy4KLQotVGh1IERlYyAxOSAxMzo1MTozMyAxOTk2ICBCcmVuZGFuIEtlaG9lICA8YnJlbmRhbkBsaXNhLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tdC12eHdvcmtzNSAodnhuZWVkZWQtbGlzdCk6IFJlbW92ZSBzaWdzZXRtYXNrLm8sIHNpbmNlCi0Jdnh3b3JrcyA1LlswLTNdIGFsbCBoYXZlIHNpZ3NldG1hc2sgaW4gdGhlbTsgdGhlIG9uZSBwcm92aWRlZCBieQotCWxpYmliZXJ0eSBpcyBpbmNvcnJlY3QsIGFzIHdlbGwuCi0KLU1vbiBEZWMgIDIgMTU6MDM6NDIgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBhbGxvY2EuYyAoYWxsb2NhKTogV2hlbiBjb21waWxlZCB3aXRoIGFuIEFOU0kvSVNPIGNvbXBpbGVyLAotCWFsbG9jYSB0YWtlcyBhIHNpemVfdCBhcmd1bWVudCwgbm90IGp1c3QgdW5zaWduZWQuCi0KLU1vbiBOb3YgMTggMTU6NDI6MDggMTk5NiAgSmFzb24gTWVycmlsbCAgPGphc29uQHlvcmljay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogTm90ZSB0aGF0IHRoaXMgZmlsZSBhbHNvIGxpdmVzIGluIEdDQy4KLQotTW9uIE5vdiAxOCAxNToxOTowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGFsbG9jYS5jOiBSZW1vdmUgaW5jbHVkZSBvZiBsaWJpYmVydHkuaCBmb3IgaHB1eC4KLQkqIGFyZ3YuYzogIFJlcGxhY2UgZGVmcyBmcm9tIGxpYmliZXJ0eS5oLgotCSogc3BhY2VzLmM6IFB1dCBiYWNrIGV4dGVybnMgZnJvbSByZW1vdmVkIGZyb20gbGliaWJlcnR5LmguCi0JKiB2YXNwcmludGYuYzogUmVtb3ZlIGluY2x1ZGUgb2YgbGliaWJlcnR5LmggZm9yIGhwdXguCi0KLU1vbiBOb3YgMTggMTQ6MDg6MDAgMTk5NiAgRGF3biBQZXJjaGlrICA8ZGF3bkBjcml0dGVycy5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYzogQ2hlY2tpbmcgaW4gYWdhaW47IGxhc3QgY2hlY2tpbiBmaWxlZCBkdWUgdG8gc3RpY2t5IHRhZy4KLQotV2VkIE5vdiAxMyAwODoyMjowMCAxOTk2ICBEYXduIFBlcmNoaWsgIDxkYXduQGNyaXR0ZXJzLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBSZXZlcnQgbGFzdCB0d28gY29tbWl0cyBkdWUgdG8gY29uZmxpY3RzIHdpdGgKLQlocHV4IHN5c3RlbSBoZWFkZXJzLgotCi1XZWQgTm92IDEzIDA4OjIyOjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLmMsIGFyZ3YuYywgc3BhY2VzLmMsIHN0cmNhc2VjbXAuYywgdmFzcHJpbnRmLmMsIHZwcmludGYuYzoKLQlSZXZlcnQgbGFzdCBjb21taXQgZHVlIHRvIGNvbmZsaWN0cyB3aXRoIGhwdXggc3lzdGVtIGhlYWRlcnMuCi0KLVdlZCBOb3YgMTMgMTA6MzY6NTAgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoeHttLHJlfWFsbG9jKTogTWFrZSBkZWNsYXJhdGlvbnMgY29tcGF0aWJpbGUgd2l0aAotCWxpYmliZXJ0eS5oIHdoZW4gY29tcGlsZWQgd2l0aCBhIHN0YW5kYXJkIGNvbXBpbGVyLgotCi1UdWUgTm92IDEyIDE2OjMxOjAwIDE5OTYgIERhd24gUGVyY2hpayAgPGRhd25AY3JpdHRlcnMuY3lnbnVzLmNvbT4KLQotCSogYWxsb2NhLmM6IEluY2x1ZGUgbGliaWJlcnR5LmggZm9yIGRlZmluaXRpb24gb2YgeG1hbGxvYy4KLQlEb24ndCByZWRlZmluZSBOVUxMLgotCSogYXJndi5jOiBNb3ZlIHByb3RvdHlwZXMgdG8gbGliaWJlcnR5LmguCi0JKiBjcGx1cy1kZW0uYzogSW5jbHVkZSBsaWJpYmVydHkuaCBmb3IgZGVmaW5pdGlvbiBvZiB4bWFsbG9jLgotCURvbid0IHJlZGVmaW5lIE5VTEwuCi0JVXNlIGNhc3RzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQkqIHNwYWNlcy5jOiBSZW1vdmUgcHJvdG90eXBlcyBmb3IgbWFsbG9jIGFuZCBmcmVlIHdoaWNoIGFyZQotCWFscmVhZHkgaW4gbGliaWJydHkuaC4KLQkqIHN0cmNhc2VjbXAuYzogVXNlIGNhc3RzIHRvIGVsaW1pbmF0ZSBjb21waWxlciB3YXJuaW5ncy4KLQkqIHZhc3ByaW50Zi5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oIGZvciBkZWZpbml0aW9uIG9mIG1hbGxvYy4KLQlEb24ndCByZWRlZmluZSBOVUxMLgotCSogdnByaW50Zi5jOiBJbmNsdWRlIHN0ZGFyZy5oIGlmIF9fU1REQ19fLgotCi1GcmkgT2N0IDExIDE1OjQyOjEyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC13aW5kb3dzOiAgQWRkIHN0cmNhc2VjbXAubyB0byBFWFRSQV9PRklMRVMuCi0KLUZyaSBPY3QgMTEgMTE6MTY6MzEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYyAobXB3aWZ5X2ZpbGVuYW1lKTogUmV3cml0ZSB0byBzaW1wbGlmeSwgYW5kIHRvIGhhbmRsZQotCXVwd2FyZCBjb21wb25lbnRzIGNvcnJlY3RseS4KLQotVHVlIE9jdCAgOCAwODo1NTozNCAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGUsIGNvbmZpZy9taC13aW5kb3dzOiAgQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHVuZGVyCi0JTVNWQyAodGhlIE1pY3Jvc29mdCBidWlsZCBlbnZpcm9ubWVudCkuCi0KLU1vbiBPY3QgIDcgMTA6NTA6MjcgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBmbm1hdGNoLmM6IFVuZGVmIGNvbnN0IGlmIG5vdCBfX1NURENfXy4KLQotVGh1IE9jdCAgMyAxMzo0NjozOSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGZubWF0Y2guYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIGZubWF0Y2guYy4KLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIGZubWF0Y2guby4KLQkoZm5tYXRjaC5vKTogTmV3IHRhcmdldC4KLQotV2VkIFNlcCAxOCAxNDo0OToxMyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEZpeCBoYW5kbGluZyBvZiBhZGRyZXNzIGFyZ3MuCi0JKGdudV9zcGVjaWFsKTogSGFuZGxlIHR5cGVfaW5mbyBzdHVmZi4KLQotRnJpIFNlcCAxMyAxNzo1Mjo1NSAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy5jIChEZWJ1Z1BJKTogTWFrZSBzZXR0YWJsZSBmcm9tIHRoZSBlbnYgdmFyIERFQlVHX1BBVEhOQU1FUy4KLQkobXB3aWZ5X2ZpbGVuYW1lKTogSGFuZGxlICI6Oi8iIGNhc2UuCi0KLVRodSBTZXAgMTIgMTM6MzA6NDAgMTk5NiAgR2VvZmZyZXkgTm9lciAgPG5vZXJAY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWN5Z3dpbjMyOiBuZXcgZmlsZSAobmVlZCAtRE5FRURfYmFzZW5hbWUgYW5kCi0JCS1ETkVFRF9zeXNfc2lnbGlzdCBmb3IgbmF0aXZlIE5UIHJlYnVpbGRpbmcpCi0JKiBjb25maWcudGFibGUgKCotKi1jeWd3aW4zMik6IG5ldyBlbnRyeQotCSogY2hvb3NlLXRlbXAuYzogYnJpbmcgaW4gc3luYyB3aXRoIGdjYyAocmV2ZXJ0IEF1ZyAxNyBjaGFuZ2UpCi0KLVRodSBBdWcgMjkgMTY6NDg6NDUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGUgKGlbMzQ1XTg2LSotKik6IFJlY29nbml6ZSBpNjg2IGZvciBwZW50aXVtIHByby4KLQotVHVlIEF1ZyAyNyAxMzo0Nzo1OCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmMgKHBleGVjdXRlKSBbTVBXXTogUmVtb3ZlIG9sZCBib2d1cyBjb2RlIHRoYXQKLQltZXNzZWQgd2l0aCBhcmd1bWVudHMgdGhhdCBpbmNsdWRlZCBhICcvJywgYWRkIGVzY2FwZSBjaGFycwotCXRvIGRvdWJsZSBxdW90ZXMsIHJlbW92ZSBjb25zdCBkZWNsIGZyb20gYXJnIHRoYXQgTWFjCi0JY29tcGlsZXJzIGRvbid0IHNlZW0gdG8gbGlrZS4KLQotU2F0IEF1ZyAxNyAwNDo0NDoyNyAxOTk2ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBVcGRhdGUgdGVzdCBmb3Igd2luMzIgKCYmICEgY3lnd2luMzIpLgotCSogY2hvb3NlLXRlbXAuYzogZml4IFdJTjMyIHByZXByb2Nlc3NvciBkZWZpbmVzCi0KLVRodSBBdWcgMTUgMTI6MjY6NDggMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IEFkZCBAREFTSF9DX0ZMQUdAIGFuZCBAU0VHTUVOVF9GTEFHKHtEZWZhdWx0fSlACi0JdG8gZWRpdGluZyBvZiBkZWZhdWx0IG1ha2VmaWxlIHJ1bGUuCi0KLVN1biBBdWcgMTEgMjE6MDM6MjcgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogYWxsb2NhLW5vcm0uaDogIEluY2x1ZGUgPG1hbGxvYy5oPiBpZiBfV0lOMzIuCi0JKiBhcmd2LmM6ICBJbmNsdWRlIG5vbi1wcm90b3R5cGVkIGRlY2xzIGZvciBtYWxsb2MgYW5kIHN0cmluZwotCWZ1bmN0aW9ucyBpZiAhIF9XSU4zMiBvciBpZiBfX0dOVUNfXy4KLQotVGh1IEF1ZyAgOCAxMjo0Mjo0MCAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogY29uZmlnLmgtdm1zOiBOZXcgZmlsZS4KLQkqIG1ha2VmaWxlLnZtczogVXNlIGl0LgotCi1XZWQgQXVnICA3IDE3OjE2OjEyIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jIChfZ2V0b3B0X2ludGVybmFsKTogIElmIGFyZ2MgaXMgMCwganVzdCByZXR1cm4gKGJlZm9yZQotCXdlIHJlZmVyZW5jZSAqYXJndiBhbmQgc2VnZmF1bHQpLgotCi1Nb24gQXVnICA1IDAxOjI5OjA4IDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IEFkZCBtdWx0aWxpYi5vdXQuCi0KLVRodSBKdWwgMTggMTc6NDA6NTUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbGxvY2Etbm9ybS5oOiBDaGFuZ2UgI2lmZGVmIHNwYXJjIHRvICNpZiBkZWZpbmVkIChzcGFyYykgJiYKLQlkZWZpbmVkIChzdW4pLiAgRnJvbSBBbmRyZXcgR2llcnRoIDxBTkRSRVdHQG1pY3JvbGlzZS5jby51az4uCi0KLU1vbiBKdWwgIDEgMTM6NDA6NDQgMTk5NiAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQlUdWUgTWF5IDI4IDE1OjI5OjAzIDE5OTYgIFBhdCBSYW5raW4gIDxyYW5raW5AZXFsLmNhbHRlY2guZWR1PgotCi0JKiB2bXNidWlsZC5jb20gKFJFUVVJUkRfT0ZJTEVTKTogQWRkIGNob29zZS10ZW1wLm8gYW5kIHhzdHJkdXAuby4KLQotCVRodSBKYW4gMjUgMTg6MjA6MDQgMTk5NiAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0KLQkqIHZtc2J1aWxkLmNvbTogQ2hhbmdlcyB0byBoYW5kbGUgREVGRlVOQyhvbl9leGl0KS4KLQkoZG9fb2ZpbGVzKTogQWxsb3cgbm9uZXhpc3RlbnQgc291cmNlIGZpbGUgaW4gcGFzcyAzLgotCShjaGtfZGVmZnVuYyk6IE5ldyByb3V0aW5lLgotCi1UdWUgSnVuIDI1IDE5OjI0OjQzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHBleGVjdXRlLmMgKFBFWEVDVVRFX1ZFUkJPU0UpOiBEZWZpbmUuCi0JKE1QVyBwZXhlY3V0ZSk6IENoZWNrIGZsYWdzICYgUEVYRUNVVEVfVkVSQk9TRSBpbnN0ZWFkIG9mIHZlcmJvc2VfZmxhZy4KLQotVHVlIEp1biAyNSAyMzoxMTo0OCAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAoZG9jZGlyKTogUmVtb3ZlZC4KLQotVHVlIEp1biAyNSAyMzowMTowNyAxOTk2ICBKYXNvbiBNb2xlbmRhICAoY3Jhc2hAZ29kemlsbGEuY3lnbnVzLmNvLmpwKQotCi0JKiBNYWtlZmlsZS5pbiAob2xkaW5jbHVkZWRpcik6IFJlbW92ZWQuCi0KLVR1ZSBKdW4gMjUgMjI6NTA6MDcgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotICAgICAgICAqIE1ha2VmaWxlLmluIChkYXRhZGlyKTogU2V0IHRvICQocHJlZml4KS9zaGFyZS4KLQotVGh1IEp1biAyMCAyMToxNzo1MiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcm1fcHQpOiBSZWluZGVudC4gIEF2b2lkIGVuZGxlc3MgbG9vcCBieQotCWNoZWNraW5nIGZvciBlcnJvcnMgZnJvbSBkb190eXBlLgotCi1UdWUgSnVuIDE4IDE0OjM2OjE5IDE5OTYgIEtsYXVzIEthZW1wZiAgPGtrYWVtcGZAcHJvZ2lzLmRlPgotCi0JKiBtYWtlZmlsZS52bXM6IE5ldyBmaWxlLgotCSogeG1hbGxvYy5jOiBJZiBWTVMsIGluY2x1ZGUgPHN0ZGxpYi5oPiBhbmQgPHVuaXhsaWIuaD4gcmF0aGVyCi0JdGhhbiBkZWNsYXJpbmcgbWFsbG9jLCByZWFsbG9jLCBhbmQgc2Jyay4KLQotTW9uIEp1biAxMCAxMzoxNzoxNyAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBwZXhlY3V0ZS5jOiBOZXcgZmlsZS4KLQotV2VkIEp1biAgNSAxNjo1Nzo0NSAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogeG1hbGxvYy5jOiBEZWNsYXJlIHNicmsuCi0KLVNhdCBNYXkgIDQgMDU6MDg6NDUgMTk5NiAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBhbGxvY2Etbm9ybS5oOiAgQWRkIFNQQVJDd29ya3MgY2MgY29tcGF0aWJsZSBfX2J1aWx0aW5fYWxsb2NhCi0JZGVjbGFyYXRpb24uCi0KLU1vbiBBcHIgMjIgMTg6NDE6NDkgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiB4c3RyZXJyb3IuYzogSW5jbHVkZSA8c3RkaW8uaD4uCi0KLVN1biBBcHIgMjEgMTE6NTU6MTIgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6IEFkZCBhdGV4aXQuYy4KLQotU3VuIEFwciAyMSAwOTo1MDowOSAxOTk2ICBTdGVwaGVuIEwgTW9zaGllciAgKG1vc2hpZXJAd29ybGQuc3RkLmNvbSkKLQotCSogY2hvb3NlLXRlbXAuYzogSW5jbHVkZSBzeXMvdHlwZXMuaCBiZWZvcmUgc3lzL2ZpbGUuaCBmb3Igc2NvMy4ydjUuCi0KLVdlZCBBcHIgMTcgMTE6MTc6NTUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2hvb3NlLXRlbXAuYzogRG9uJ3QgI2luY2x1ZGUgc3lzL2ZpbGUuaCBpZmRlZiBOT19TWVNfRklMRV9ILgotCSNpbmNsdWRlIDxzdGRpby5oPgotCSogY29uZmlnL210LXZ4d29ya3M1IChIREVGSU5FUyk6IERlZmluZSBOT19TWVNfRklMRV9ILgotCi1UdWUgQXByIDE2IDExOjI3OjE2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotICAgICAgICAqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBJZiBhbGxvY2EubyBpcyBuZWVkZWQsIHNvIGlzIHhtYWxsb2Muby4KLQlSZXZlcnRzIEZlYiA4LCAxOTk1IGNoYW5nZS4KLQotTW9uIEFwciAxNSAxMjo1MzoyNiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjaG9vc2UtdGVtcC5jOiBOZXcgZmlsZS4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBBZGQgY2hvb3NlLXRlbXAuYy4KLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIGNob29zZS10ZW1wLm8uCi0KLVNhdCBBcHIgMTMgMTQ6MTk6MzAgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfdG9fZG91YmxlKTogIERvbid0IGJpYXMgZXhwb25lbnQgd2hlbgotCWhhbmRsaW5nIHplcm8ncywgZGVub3JtcyBvciBOYU5zLgotCi1UaHUgQXByIDExIDEzOjM2OjU2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSk6ICBGaXggYnVncyB3aXRoIGhhbmRsaW5nCi0JbnVtYmVycyB3aXRoIGZyYWN0aW9ucyA8IDMyIGJpdHMuCi0KLU1vbiBBcHIgIDggMTQ6NDg6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGU6IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4KLQotVHVlIE1hciAxOSAyMjowMjowNyAxOTk2ICBKYXNvbiBNZXJyaWxsICA8amFzb25AeW9yaWNrLmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IEZpeCBmb3Igbm9uLW1hbmdsZWQgcG9pbnRlcgotCWFyZ3VtZW50cy4KLQotRnJpIE1hciAgOCAxNzoyNDoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgc3JjZGlyIGlzIGAuJyBhbmQgd2l0aF90YXJnZXRfc3ViZGlyIGlzIG5vdAotCWAuJywgdGhlbiBzZXQgTVVMVElTUkNUT1AgYmVmb3JlIGNhbGxpbmcgY29uZmlnLW1sLmluLgotCi1UaHUgTWFyICA3IDEzOjM3OjEwIDE5OTYgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKG1wd19vcGVuKTogQWRkIGRlYnVnZ2luZyBvdXRwdXQgb3B0aW9uLgotCi1XZWQgTWFyICA2IDE3OjM2OjAzIDE5OTYgIEphc29uIE1lcnJpbGwgIDxqYXNvbkB5b3JpY2suY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3RlbXBsYXRlKTogRml4IGZvciBhZGRyZXNzLW9mLWV4dGVybiBhcmd1bWVudHMuCi0KLVR1ZSBGZWIgMjcgMTI6MDA6NTAgMTk5NiAgUmF5bW9uZCBKb3UgIDxyam91QG1leGljYW4uY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKG1wd2lmeV9maWxlbmFtZSk6IENoYW5nZSA2IHRvIDUgaW4KLQlzdHJuY21wICh1bml4bmFtZSwgIi90bXAvIiwgNSkuCi0KLVR1ZSBGZWIgMjAgMTA6NTU6NTMgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBJbml0aWFsaXplIGlzX2Jvb2wuICBDb3JyZWN0bHkKLQloYW5kbGUgMCBhcyBhIHBvaW50ZXIgdmFsdWUgcGFyYW1ldGVyLgotCi1Nb24gRmViICA1IDE2OjQxOjQ0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGFsbCk6IERlcGVuZCB1cG9uIHJlcXVpcmVkLWxpc3QuCi0JKHJlcXVpcmVkLWxpc3QpOiBOZXcgdGFyZ2V0LgotCShjbGVhbik6IFJlbW92ZSByZXF1aXJlZC1saXN0LgotCi1XZWQgSmFuIDMxIDEwOjE5OjQxIDE5OTYgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHdpbjMyLmM6IERlbGV0ZWQuCi0JKiBjb25maWcudGFibGUgKGkzODYtKi13aW4zMik6IERlbGV0ZWQuCi0JKiBjb25maWcvbWgtaTM4NndpbjMyOiBEZWxldGVkLgotCi1UaHUgSmFuIDE4IDExOjM0OjE3IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IENoYW5nZSBvcG5hbWUgcGFyYW1ldGVyIHRvCi0JY29uc3QgY2hhciAqLgotCShjcGx1c19tYW5nbGVfb3BuYW1lKTogQ2hhbmdlIHJldHVybiB0eXBlIGFuZCBvcG5hbWUgcGFyYW1ldGVyIHRvCi0JY29uc3QgY2hhciAqLiAgRG9uJ3QgY2FzdCByZXR1cm4gdmFsdWUuCi0KLVR1ZSBKYW4gMTYgMTI6MTM6MTEgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHcuYzogSW5jbHVkZSBUaW1lci5oLCBpbiBvcmRlciB0byBnZXQgbTY4ayBNaWNyb3NlY29uZHMgdHJhcAotCWRlZmluaXRpb24uCi0KLVdlZCBKYW4gIDMgMTM6MTU6MDQgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIG9ic3RhY2suYzogVXBkYXRlIGNvcHlyaWdodCB0byAxOTk2LgotCShfb2JzdGFja19tZW1vcnlfdXNlZCk6IERlZmluZSBuZXcgZnVuY3Rpb24uICBDYWxsZWQgdmlhCi0Jb2JzdGFja19tZW1vcnlfdXNlZCBtYWNyby4KLQotVGh1IERlYyAyOCAxMTozOTo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHhzdHJkdXAuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIHhzdHJkdXAuYy4KLQkoUkVRVUlSRURfT0ZJTEVTKTogQWRkIHhzdHJkdXAuby4KLQkoeHN0cmR1cC5vKTogTmV3IHRhcmdldC4KLQotTW9uIERlYyAxMSAxODoxODo1MiAxOTk1ICBNaWtlIFN0dW1wICA8bXJzQGN5Z251cy5jb20+Ci0KLQkqIGF0ZXhpdC5jOiBOZXcgc3R1YiB0byBwcm92aWRlIGF0ZXhpdCBvbiBzeXN0ZW1zIHRoYXQgaGF2ZQotCW9uX2V4aXQsIGxpa2UgU3VuT1MgNC4xLnggc3lzdGVtcy4KLQkqIGZ1bmN0aW9ucy5kZWYgKG9uX2V4aXQsIGF0ZXhpdCk6IERpdHRvLgotCi1Nb24gRGVjIDExIDE1OjQyOjE0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LmMgKG1wd19hYm9ydCk6IFJlbW92ZSBkZWNsLgotCShtcHdfYWNjZXNzKTogTW92ZSBkZWJ1Z2dpbmcgcHJpbnRmLgotCi1TYXQgRGVjICAyIDAxOjI1OjIzIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBDb25zaXN0ZW50bHkgdXNlICR7aG9zdH0gcmF0aGVyIHRoYW4gJHt4aG9zdH0gb3IKLQkke3RhcmdldH0uCi0JKiBjb25maWd1cmUuaW46IERvbid0IGJvdGhlciB0byBzZXQgJHt4aG9zdH0gYmVmb3JlIGNhbGxpbmcKLQljb25maWcudGFibGUuCi0KLVR1ZSBOb3YgMjggMTQ6MTY6NTcgMTk5NSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoLmMubyk6IFVzZSB0ZXN0IGluc3RlYWQgb2YgdGhlIGxlZnQgYnJhY2tldCwgdG8KLQlhdm9pZCBwcm9ibGVtcyB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgbWFrZS4KLQotVHVlIE5vdiAyOCAxMTo0NToxNyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRml4IElOQ0RJUiBlZGl0IHRvIHdvcmsgd2l0aCBOb3YgMTQgY2hhbmdlLgotCi1UdWUgTm92IDIxIDExOjI2OjM0IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogY29uZmlnL21oLWhwdXg6IFJlbW92ZS4gIEl0IHdhcyBvbmx5IHVzZWQgdG8gZGVmaW5lIEVYVFJBX09GSUxFUywKLQl3aGljaCB3YXMgc2V0IHRvIGp1c3QgYWxsb2NhLm8sIHdoaWNoIGlzIG5vdyBhdXRvbWF0aWNhbGx5IG1hcmtlZAotCWFzIG5lZWRlZCBieSB0aGUgYXV0b2NvbmZpZ3VyYXRpb24gcHJvY2Vzcy4KLQotVHVlIE5vdiAyMSAxNDoxNTowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogQ2hlY2sgJHt3aXRoX2Nyb3NzX2hvc3R9IHJhdGhlciB0aGFuIGNvbXBhcmluZwotCSR7aG9zdH0gYW5kICR7dGFyZ2V0fS4KLQotVGh1IE5vdiAxNiAxNDozNDo0MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogSWYgd2l0aF90YXJnZXRfc3ViZGlyIGlzIGVtcHR5LCBzZXQgeGhvc3QgdG8KLQkke2hvc3R9IHJhdGhlciB0aGFuICR7dGFyZ2V0fSBiZWZvcmUgY2FsbGluZyBjb25maWcudGFibGUuCi0KLVR1ZSBOb3YgMTQgMDE6Mzg6MzAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKE1VTFRJVE9QKTogRGVsZXRlZC4KLQkoTVVMVElTUkNUT1AsIE1VTFRJQlVJTERUT1ApOiBOZXcuCi0JKEZMQUdTX1RPX1BBU1MpOiBEZWxldGUgSU5DRElSLgotCShJTkNESVIpOiBBZGQgJChNVUxUSVNSQ1RPUCkuCi0JKGluc3RhbGxfdG9fbGliZGlyKTogQWRkICQoTVVMVElTVUJESVIpLiAgQ2FsbCAkKE1VTFRJRE8pLgotCSogY29uZmlndXJlLmluOiBEZWxldGUgY2FsbCB0byBjZmctbWwtY29tLmluLiAgQ2FsbCBjb25maWctbWwuaW4KLQlpbnN0ZWFkIG9mIGNmZy1tbC1wb3MuaW4uCi0JKGNyb3NzLWNvbXBpbGUgY2hlY2spOiBDaGFuZ2UgdG8gdGVzdCBmb3Igd2l0aF90YXJnZXRfc3ViZGlyLgotCShFWFRSQV9MSU5LUyk6IERlbGV0ZS4KLQotU3VuIE5vdiAxMiAxMjoxMzowNCAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogQWRkIGdldHBhZ2VzaXplLmMubyB0byBuZWVkZWQtbGlzdC4KLQkqIG1wdy5jIFtVU0VfTVdfSEVBREVSU106IENvbmRpdGlvbmFsaXplIGNvbXBpbGluZyBvZgotCWZ1bmN0aW9ucyB0aGF0IGFyZSBzdXBwbGllZCBieSBNZXRyb3dlcmtzIGxpYnJhcmllcy4KLQkoZnN0YXQpOiBDbGVhbiB1cCBkZXNjcmlwdG9yLT5wb2ludGVyIGNvbnZlcnNpb24gY29kZS4KLQkoSW5zdGFsbENvbnNvbGUsIGV0Yyk6IEVtcHR5IGRlZmluaXRpb25zLCBmb3Igd2hlbiBsaW5raW5nCi0Jd2l0aCBTSU9VWC4KLQotU3VuIE5vdiAgNSAxOToyNToyNyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEZMQUdTX1RPX1BBU1MpOiAgQWxzbyBwYXNzIFBJQ0ZMQUdTLgotCSguYy5vKTogIFN0eWxpc3RpYyBjaGFuZ2UuCi0KLVRodSBOb3YgIDIgMTI6MDY6MjkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzdHJ0b2wuYywgc3RydG91bC5jOiBEb24ndCBpbmNsdWRlIDxzdGRsaWIuaD4uICBGcm9tCi0JcGhkbUBpbmZvLnVjbC5hYy5iZSAoUGhpbGlwcGUgRGUgTXV5dGVyKS4KLQotV2VkIE5vdiAgMSAxMTo1OTozNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQ29ycmVjdCBzZWQgY2FsbC4KLQotTW9uIE9jdCAzMCAxMzowMzo0NSAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiAgQ2xlYW4gdXAgLyBzaW1wbGlmeSBmb3IgbmF0aXZlLgotCi0JKiBjb25maWd1cmUuaW46ICBNZXJnZSBpbiBzdHVmZiBmcm9tIC4uL3hpYmVydHkvY29uZmlndXJlLmluLgotCSogTWFrZWZpbGUuaW4gKENDKTogIEFkZCBkZWZpbml0aW9uIChzbyBpdCBjYW4gYmUgb3ZlcnJyaWRkZW4KLQlieSAuLi9jb25maWd1cmUpLgotCi1UdWUgT2N0IDI0IDE3OjU3OjI3IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LW1ha2Uuc2VkOiBMZWF2ZSBzdHJlcnJvci5jLm8gaW4gc3RhbmRhcmQgbGlzdCBvZiBmdW5jdGlvbnMuCi0JKiBtcHcuYyAoUl9PSywgRU5PRU5ULCBFQUNDRVNTLCBFTk9TWVMpOiBSZW1vdmUuCi0JKGxpbmspOiBSZW1vdmUgdXNlbGVzcyBkZWZpbml0aW9uIHdpdGggZXJyb3IgcmV0dXJuLgotCShsYXN0X21pY3Jvc2Vjb25kcywgd2Fybl9pZl9zcGluX2RlbGF5LCByZWNvcmRfZm9yX3NwaW5fZGVsYXkpOgotCVVzZSBVbnNpZ25lZFdpZGUgdHlwZSBmb3IgbWljcm9zZWNvbmQgY291bnRzLgotCi1UaHUgT2N0IDE5IDEwOjUyOjA3IDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB3b2dnbGVidWcudGlhYy5uZXQ+Ci0KLQkqIG1lbWNtcC5jIChtZW1jbXApOiBBcmd1bWVudCB0eXBlcyBhcmUgY29uc3Qgdm9pZCAqLCBub3Qgdm9pZAotCSpjb25zdC4KLQotCSogc3RybmNhc2VjbXAuYyAoc3RybmNhc2VjbXApOiBJbmNsdWRlIGFuc2lkZWNsLmgvc3RkYXJnLmgsIG5vdAotCXN5cy90eXBlcy5oLgotCSogc3RyY2FzZWNtcC5jIChzdHJjYXNlY21wKTogRGl0dG8uCi0KLVR1ZSBPY3QgMTAgMTE6MDM6MjQgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6ICBSZW1vdmUgbWFjcm8uCi0KLVR1ZSBTZXAgMjYgMTU6MDY6NDYgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoSEZJTEVTKTogQWRkIGRlZmF1bHQgZW1wdHkgZGVmaW5pdGlvbi4KLQkqIG1wdy1jb25maWcuaW4gKGNvbmZpZy5oKTogT25seSB1cGRhdGUgaWYgY2hhbmdlZC4KLQkqIG1wdy1tYWtlLmluOiBSZW1vdmUuCi0JKiBtcHctbWFrZS5zZWQ6IE5ldyBmaWxlLCBlZGl0cyBNYWtlZmlsZS5pbiBpbnRvIE1QVyBtYWtlZmlsZS4KLQkqIG1wdy5jOiBSZW1vdmUgc2VtaS1jbG9uZSBvZiBzdHJlcnJvciBjb2RlLgotCShzeXNfbmVyciwgc3lzX2Vycmxpc3QpOiBEZWZpbmUgaGVyZS4KLQkoTWljcm9zZWNvbmRzKTogT25seSBkZWZpbmUgYXMgQS1saW5lIHRyYXAgaWYgbTY4ayBNYWMuCi0KLVdlZCBTZXAgMjAgMTI6NTM6MzIgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciBkaXN0Y2xlYW4uCi0KLU1vbiBBdWcgMjggMTk6NDc6NTIgMTk5NSAgUGVyIEJvdGhuZXIgIDxib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy50YWJsZTogIEZvciBob3N0LCBnZW5lcmFsaXplIHJzNjAwMC1pYm0tYWl4KgotCXRvICotaWJtLWFpeCogc28gd2UgYWxzbyBpbmNsdWRlIHBvd2VycGMuCi0KLVR1ZSBBdWcgMjIgMDM6MTg6MDUgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGtyLWxhcHRvcC5jeWdudXMuY29tPgotCi0JRnJpIEp1biAxNiAxODozNTo0MCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogeHN0cmVycm9yLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4sIHZtc2J1aWxkLmNvbTogQ29tcGlsZSBpdC4KLQotTW9uIEp1bCAzMSAxMjoxNjozMiAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGUgKGkzODYtKi13aW4zMik6IE5ldy4KLQotRnJpIEp1bCAyMSAxMTozNTo1MiAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTVVMVElUT1ApOiBOZXcgdmFyaWFibGUuCi0JKE1VTFRJRElSUywgTVVMVElTVUJESVIsIE1VTFRJRE8sIE1VTFRJQ0xFQU4pOiBMaWtld2lzZS4KLQkoYWxsKTogQWRkIG11bHRpbGliIHN1cHBvcnQuCi0JKGluc3RhbGxfdG9fdG9vbGRpciwgKmNsZWFuKTogTGlrZXdpc2UuCi0KLU1vbiBKdWwgMTAgMTE6NDc6MjcgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIG1ha2VmaWxlLmRvcyAoT0JKUyk6IEFkZCBoZXguby4gIEZyb20gREogRGVsb3JpZS4KLQotRnJpIEp1biAzMCAxNzoyODo1OSAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogdm1zYnVpbGQuY29tOiAgY3JlYXRlICJuZXctbGliLm9sYiIsIGJ1aWxkIGxpYmliZXJ0eSB1bmRlciB0aGF0Ci0JbmFtZSwgYW5kIHRoZW4gbWFrZSBpdCBiZWNvbWUgImxpYmVydHkub2xiIiB3aGVuIGRvbmUsIHNvIHRoYXQgYW4KLQlpbmNvbXBsZXRlIGJ1aWxkIGF0dGVtcHQgbmV2ZXIgbGVhdmVzIGJlaGluZCBzb21ldGhpbmcgd2hpY2ggbG9va3MKLQlsaWtlIGEgY29tcGxldGUgbGlicmFyeS4KLQotVGh1IEp1biAyOSAwMDoyMjowMiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiBjb25maWcvbWgtaTM4NnBlOiBOZXcgZmlsZSBmb3IgUEUgaG9zdHMuCi0JKiBjb25maWcudGFibGU6IFVuZGVyc3RhbmQgUEUgaG9zdHMuCi0KLVdlZCBKdW4gMjggMTk6MTM6MjMgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBVcGRhdGUgZnJvbSBnY2MuCi0KLQkqIGFyZ3YuYywgZHVtbXkuYzogSWYgX19TVERDX18sICNpbmNsdWRlICJhbGxvY2EtY29uZi5oIiBhZnRlcgotICAgICAgICA8c3RkZGVmLmg+LgotCSogYWxsb2NhLW5vcm0uaDogSWYgX19TVERDX18sIGRlY2xhcmUgYWxsb2NhIHdpdGggaXRzIHBhcmFtZXRlci4KLQotVGh1IEp1biAyMiAxODo1Nzo0NyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLmluIChBTExfQ0ZMQUdTKTogRGVmaW5lIE5FRURfYmFzZW5hbWUuCi0JKiBtcHcuYzogT25seSB0ZXN0IERlYnVnUEkgb25jZSB3aGVuZXZlciBwcmludGluZyBkZWJ1ZyBpbmZvLgotCShtcHdpZnlfZmlsZW5hbWUpOiBJZiBmaWxlbmFtZSBpcyAvdG1wL2ZvbywgY2hhbmdlIGl0IGludG8gOl9mb28sCi0JYWxzbyBmaXggdG8gbm90IHdyaXRlIG9uIGlucHV0IGZpbGVuYW1lIGJ1ZmZlci4KLQkobXB3X2FjY2Vzcyk6IFVzZSBzdGF0KCkgaW5zdGVhZCBvZiBvcGVuKCksIHdvcmtzIGZvciBkaXJlY3RvcmllcwotCWFzIHdlbGwgYXMgZmlsZXMuCi0KLU1vbiBKdW4gMTkgMDA6MzM6MjIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBNYXNzYWdlIGJyb2tlbiBzaGVsbHMgdGhhdCByZXF1aXJlICdlbHNlIHRydWUnLgotCi1TYXQgSnVuIDE3IDIzOjIxOjU4IDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBhbGxvY2Etbm9ybS5oOiBEZWNsYXJlIGFsbG9jYSBhcyB0eXBlICJQVFIiIHRvIG1hdGNoIGZ1bmN0aW9ucy5kZWYuCi0JRGVjbGFyZSBfX2J1aWx0aW5fYWxsb2NhIGluIHRoZSBzcGFyYyBjYXNlLCBhcyBhcmd2LmMgZGlkLgotCSogYXJndi5jOiBSZXBsYWNlIGlubGluZSB2ZXJzaW9uIG9mIGFsbG9jYS1ub3JtLmggYXQgc3RhcnQgb2YgZmlsZSB3aXRoCi0JYSAjaW5jbHVkZSBvZiBhbGxvY2EtY29uZi5oLiAgUHJlY2VkZSBpdCB3aXRoIGFuIGluY2x1ZGUgb2YgYW5zaWRlY2wuaAotCWJlY2F1c2UgYWxsb2NhLW5vcm0uaCBuZWVkcyB0byBkZWNsYXJlIGFsbG9jYSBhcyAiUFRSIi4KLQotTW9uIEp1biAxMiAxNDoyNDoyNiAxOTk1ICBTdGV2ZSBDaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JKiB3aW4zMi5jOiBOZXcgZmlsZS4KLQotRnJpIEp1biAgOSAxNToxNjoxNCAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogZHVtbXkuYzogI2luY2x1ZGUgImFsbG9jYS1jb25mLmgiLgotCi1XZWQgSnVuICA3IDExOjQ2OjIzIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobW9zdGx5Y2xlYW4pOiBSZW1vdmUgc3RhbXAtcGljZGlyLgotCShjbGVhbik6IERvbid0LgotCi1Nb24gSnVuICA1IDE4OjQ2OjA2IDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjb25maWcudGFibGUgKGZyYWdzKTogVXNlIHRvcGxldmVsIHBpYyBmcmFncy4KLQotCSogTWFrZWZpbGUuaW4gKFBJQ0ZMQUcpOiBOZXcgbWFjcm8uCi0JKGFsbCk6IERlcGVuZCBvbiBzdGFtcC1waWNkaXIuCi0JKG5lZWRlZC1saXN0KTogRGl0dG8uCi0JKC5jLm8pOiBBbHNvIGJ1aWxkIHBpYyBvYmplY3QuCi0JKHN0YW1wLXBpY2Rpcik6IE5ldyBydWxlLgotCShtb3N0bHljbGVhbik6IFJlbW92ZSBwaWMuCi0JKGNsZWFuKTogUmVtb3ZlIHN0YW1wLXBpY2Rpci4KLQotRnJpIE1hciAyNCAxNjo1NTo0OCAxOTk1ICBQYXQgUmFua2luICAocmFua2luQGVxbC5jYWx0ZWNoLmVkdSkKLQotCSogdm1zYnVpbGQuY29tIChjb25maWcuaCk6IEFkZCBgI2RlZmluZSBORUVEX2Jhc2VuYW1lJy4KLQotVHVlIE1heSAyMyAxMDoxMjo0NiAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogY2xvY2suYywgZ2V0b3B0LmMsIHN0cnRvZC5jLCB2c3ByaW50Zi5jOiAgQ2hhbmdlIGZyb20gdXNpbmcgTEdQTAotCXRvIGxpYmlvLXN0eWxlIGNvcHlyaWdodC4KLQkqIGdldHBhZ2VzaXplLmM6ICBSZW1vdmUgRlNGIGNvcHlyaWdodC4KLQotU2F0IE1heSAyMCAxMjozMDoyMyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlBZGRlZCBpbXByb3ZlZCBWTVMgc3VwcG9ydCBmcm9tIFBhdCBSYW5raW46Ci0KLQlGcmkgTWFyIDE3IDE4OjQwOjM2IDE5OTUgIFBhdCBSYW5raW4gIChyYW5raW5AZXFsLmNhbHRlY2guZWR1KQotCi0JKiB2bXNidWlsZC5jb206ICBuZXcgZmlsZS4KLQotCSogZ2V0cGFnZXNpemUuYyAoZ2V0cGFnZXNpemUpOiAgaW1wbGVtZW50IGZvciBWTVM7Ci0JKiBzdHJlcnJvci5jIChzdHJlcnJvciwgc3RyZXJybm8sIHN0cnRvZXJybm8pOiAgYWRkIHJ1ZGltZW50YXJ5Ci0Jc3VwcG9ydCBmb3IgRVZNU0VSUi4KLQotVGh1IE1heSAxOCAxNzowMTo0MiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItbGFwdG9wLmN5Z251cy5jb20+Ci0KLQlXZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBmbG9hdGZvcm1hdC5jIChmbG9hdGZvcm1hdF9hcm1fZXh0KTogRGVmaW5lLgotCi1UdWUgTWF5IDE2IDEzOjMwOjU5IDE5OTUgIFBlciBCb3RobmVyICA8Ym90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tPgotCi0JKiBiYXNlbmFtZS5jLCBiY21wLmMsIGdldGN3ZC5jLCBpbnNxdWUuYywgcmVuYW1lLmMsIHNpZ3NldG1hc2suYywKLQlzdHJlcnJvci5jLCBzdHJzaWduYWwuYzogIFJlbW92ZSBGU0YgY29weXJpZ2h0LgotCSogc2lnc2V0bWFzay5jOiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC0gc2VlbXMgdG8gYmUgbmVlZGVkIGJ5IElTQy4KLQotTW9uIE1heSAxNSAxOTo1MzoxNyAxOTk1ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogYmNvcHkuYywgYnplcm8uYywgbWVtY21wLmMsIG1lbWNweS5jLCBtZW1zZXQuYywgc3RyY2hyLmMsCi0Jc3RycmNoci5jLCBzdHJzdHIuYywgdmZvcmsuYzogIFJlbW92ZSBGU0YgQ29weXJpZ2h0LCBiZWNhdXNlIHRoaXMKLQltaWdodCBjb250YW1pbmF0ZSBsaWJzdGRjKysgd2l0aCB0aGUgTEdQTC4gIChPSydkIGJ5IFJNUyAxMSBPY3QgOTQuKQotCSogc3RyY2hyLmMsIHN0cnJjaHIuYzogIEFkZCBjYXN0IHRvIHN1cHByZXNzIGNvbnN0IHdhcm5pbmcuCi0KLVRodSBNYXkgIDQgMTQ6MzY6NDIgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGNwbHVzLWRlbS5jOiBVc2UgY29uc3QgaW5zdGVhZCBvZiBDT05TVC4gIERvbid0IGluY2x1ZGUKLSAgICAgICAgYW5zaWRlY2wuaCBkaXJlY3RseS4KLQotV2VkIEFwciAxOSAwMTozMDoyNyAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY3BsdXMtZGVtLmM6IERvbid0IGluY2x1ZGUgbGliaWJlcnR5LmguICBEbyBkZWNsYXJlIHhtYWxsb2MgYW5kCi0gICAgICAgIHhyZWFsbG9jLgotCSgtRE1BSU4pOiBEb24ndCByZWx5IG9uIGFuIGV4dGVybmFsbHktZGVmaW5lZCB2ZXJzaW9uIG51bWJlcjsKLSAgICAgICAgaW5zdGVhZCwgcmVxdWlyZSB0aGUgdmVyc2lvbiBudW1iZXIgdG8gYmUgZGVmaW5lZCBhcyBhCi0gICAgICAgIHByZXByb2Nlc3NvciBtYWNyby4gIEhhbmRsZSB0aGUgUlMvNjAwMCBsZWFkaW5nIGRvdC4gIERlZmluZQotICAgICAgICB4bWFsbG9jLCB4cmVhbGxvYyBhbmQgZmF0YWwuICBEb24ndCBzdHJpcCBhIGxlYWRpbmcgdW5kZXJzY29yZQotICAgICAgICBpZiB3ZSBjb3VsZG4ndCBkZW1hbmdsZSB0aGUgd29yZC4KLQotVHVlIEFwciAgNCAxMzowMzo1MSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkoT2xkIG1wdy5jIGNoYW5nZSBkZXNjcmlwdGlvbnMgcmV0YWluZWQgZm9yIGluZm9ybWF0aW9uYWwgdmFsdWUuKQotCSogbXB3LmMgKHdhcm5pbmdfdGhyZXNob2xkKTogRGVmYXVsdCB0byAuNCBzZWMuCi0JKG92ZXJmbG93X2NvdW50LCBjdXJyZW50X3Byb2dyZXNzKTogTmV3IGdsb2JhbHMuCi0JKHdhcm5faWZfc3Bpbl9kZWxheSk6IEluY2x1ZGUgY3VycmVudCBwcm9ncmVzcyB0eXBlLAotCXN1Y2ggYXMgcHJvZ3JhbSBuYW1lLCBpbiBtZXNzYWdlLgotCShtcHdfc3RhcnRfcHJvZ3Jlc3MpOiBTZXQgY3VycmVudF9wcm9ncmVzcyB2YXJpYWJsZSBmcm9tIGFyZy4KLQkobXB3X2VuZF9wcm9ncmVzcyk6IFJlcG9ydCBzcGluIGRlbGF5cyBieSBwb3dlci1vZi10d28tc2l6ZQotCWJ1Y2tldHMgaW5zdGVhZCBvZiBjb25zdGFudC1zaXplIGJ1Y2tldHMuCi0KLQkqIG1wdy5jOiBDbGVhbiB1cCBmb3JtYXR0aW5nLCB0eXBlcywgcmV0dXJucywgZXRjLgotCShFTk9TWVMpOiBEZWZpbmUuCi0JKG1wd19mcmVhZCwgbXB3X2Z3cml0ZSk6IERlZmluZS4KLQkoc2xlZXApOiBEZWZpbmUgY29ycmVjdGx5LgotCi0JKiBtcHcuYzogTmV3IGNvZGUgdG8gaW1wbGVtZW50IGN1cnNvciBzcGlubmluZyBzdXBwb3J0LgotCSh1bWFzayk6IE5ldyBmdW5jdGlvbi4KLQkobXB3X2ZvcGVuLCBtcHdfZnNlZWssIHN0YXQsIGZzdGF0KTogQ2FsbCBQUk9HUkVTUy4KLQotCSogbXB3LmMgKG1wd19iYXNlbmFtZSwgbXB3X21peGVkX2Jhc2VuYW1lKTogTmV3IGZ1bmN0aW9ucywgZmluZAotCWJhc2VuYW1lcyBmb3IgTVBXIGFuZCBNUFcvVW5peCBmaWxlbmFtZXMuCi0JKG1wd19zcGVjaWFsX2luaXQpOiBOZXcgZnVuY3Rpb24sIGNhbGxzIE1hY3NidWcgaWYgZGVzaXJlZC4KLQotCSogbXB3LmM6IEFkZCBHUEwgbm90aWNlLgotCShtcHdpZnlfZmlsZW5hbWUpOiBBZGQgbW9yZSB0cmFuc2Zvcm1hdGlvbnMuCi0JKG1wd19mb3Blbik6IENhbGwgbXB3aWZ5X2ZpbGVuYW1lIG9uIGZpbGUgbmFtZXMuCi0JKHJlbmFtZSk6IFJlbW92ZS4KLQkoY2hkaXIsIGdldGN3ZCk6IEFkZCBzaW1wbGUgZGVmaW5pdGlvbnMuCi0KLQkqIG1wdy5jOiBSYW5kb20gY2xlYW51cHMsIHJlbW92ZSB1bnVzZWQgY29kZSBiaXRzLgotCUFkZGVkIGNvcHkgb2Ygc3RyZXJyb3IuYyBmb3IgZ2NjJ3MgdXNlLgotCShzdGF0LCBmc3RhdCwgX3N0YXQpOiBOZXcgdmVyc2lvbnMgYmFzZWQgb24gR3VpZG8gdmFuIFJvc3N1bSBjb2RlLgotCi0JKiBtcHcuYyAobXB3X2ZzZWVrKTogTWFrZSBpdCB3b3JrIGNvcnJlY3RseSB3aGVuIGRvaW5nIFNFRUtfQ1VSLgotCi0JKiBtcHcuYyAoc3RhdCk6IFJlbW92ZSBoYWNrIGRlZmluaXRpb24sIGdldCBmcm9tIHN5cy9zdGF0LmguCi0JKGZvcmssIHZmb3JrLCBldGMpOiBQcmludCBlcnJvciBtZXNzYWdlcyBpZiBjYWxsZWQuCi0JKGdldHJ1c2FnZSwgc2JyaywgZW52aXJvbiwgaXNhdHR5LCBsaW5rLCB1dGltZSwgbWtkaXIsIHJtZGlyLAotCXJlbmFtZSwgY2hvd24pOiBEZWZpbmUuCi0KLQkqIG1wdy1jb25maWcuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBjb25maWd1cmUuaW4uCi0JKiBtcHctbWFrZS5pbjogTmV3IGZpbGUsIE1QVyB2ZXJzaW9uIG9mIE1ha2VmaWxlLmluLgotCSogbXB3LmM6IE5ldyBmaWxlLCBNUFcgY29tcGF0aWJpbGl0eSByb3V0aW5lcy4KLQotRnJpIE1hciAyNCAxNDoxMDozMCAxOTk1ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogYmFzZW5hbWUuYzogSW5jbHVkZSBjb25maWcuaCBiZWZvcmUgY2hlY2tpbmcgZm9yIE5FRURfYmFzZW5hbWUuCi0KLVRodSBNYXIgMjMgMTk6MDk6NTQgMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIGZ1bmN0aW9ucy5kZWY6IEFkZCBERUZGVU5DIGZvciBiYXNlbmFtZS4KLQotCSogYmFzZW5hbWUuYzogT25seSBkZWZpbmUgYmFzZW5hbWUgaWYgTkVFRF9iYXNlbmFtZS4KLQotVGh1IE1hciAxNiAxMzozNjowNSAxOTk1ICBKYXNvbiBNZXJyaWxsICA8amFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogY29uZmlnLnRhYmxlOiBGaXggLS1lbmFibGUtc2hhcmVkIGxvZ2ljIGZvciBuYXRpdmUgYnVpbGRzLgotCi1Nb24gTWFyIDEzIDExOjA1OjExIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBEZW1hbmdsZSBib29sIGxpdGVyYWxzIHByb3Blcmx5LgotCi1Nb24gTWFyICA2IDIzOjU3OjI4IDE5OTUgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIHN0cnRvbC5jIHN0cnRvdWwuYzogIFJlcGxhY2UgdGhlc2Ugd2l0aCBsZXNzIGJ1Z2d5IHZlcnNpb25zIGZyb20KLQlOZXRCU0QuICAoc3RydG91bCBpbiBwYXJ0aWN1bGFyIGNvdWxkbid0IGhhbmRsZSBiYXNlIDE2LikKLQotV2VkIE1hciAgMSAxNTo1OTowMSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZy9tdC12eHdvcmtzNSAoSERFRklORVMpOiBEZWZpbmUgTk9fU1lTX1BBUkFNX0guCi0KLQkqIGNsb2NrLmM6IElmIE5PX1NZU19QQVJBTV9IIGlzIGRlZmluZWQsIGRvbid0IGluY2x1ZGUKLQk8c3lzL3BhcmFtLmg+LgotCSogZ2V0Y3dkLmMsIGdldHBhZ2VzaXplLmMsIGdldHJ1bnRpbWUuYzogTGlrZXdpc2UuCi0KLUZyaSBGZWIgMTcgMTU6NDA6NTUgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBnZXRydW50aW1lLmMgKGdldF9ydW5fdGltZSk6IERvbid0IGFzc3VtZSB0aGF0IENMT0NLU19QRVJfU0VDIGlzCi0JYSBudW1iZXI7IEFOU0kgYXBwZWFycyB0byBwZXJtaXQgYW55IGV4cHJlc3Npb24sIGluY2x1ZGluZyBhCi0JZnVuY3Rpb24gY2FsbC4KLQotCSogY29uZmlnLnRhYmxlICgqLSotdnh3b3JrczUqKTogVXNlIG10LXZ4d29ya3M1IHdoZW4gY29uZmlndXJpbmcKLQl4aWJlcnR5LgotCSogY29uZmlnL210LXZ4d29ya3M1OiBOZXcgZmlsZS4KLQotVGh1IEZlYiAgOSAxNDoxOTo0NSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGJhc2VuYW1lLmMgKGJhc2VuYW1lKTogQ2hhbmdlIGFyZ3VtZW50IHRvIGJlIGNvbnN0LgotCi1XZWQgRmViICA4IDE4OjA2OjUyIDE5OTUgIEphc29uIE1lcnJpbGwgIDxqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobG5lZWRlZC1saXN0KTogRG9uJ3Qgd29ycnkgYWJvdXQgeG1hbGxvYy4KLQotU3VuIEphbiAxNSAwMDo0MDozNiAxOTk1ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IERlbGV0ZSB4aG9zdC1ta2ZyYWcuCi0KLVRodSBKYW4gMTIgMTY6NTQ6MTggMTk5NSAgSmFzb24gTWVycmlsbCAgPGphc29uQHBoeWRlYXV4LmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChsbmVlZGVkLWxpc3QpOiBJZiBhbGxvY2EubyBpcyBuZWVkZWQsIHNvIGlzIHhtYWxsb2Muby4KLQotV2VkIEphbiAxMSAyMjozOTo1NiAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBoZXguYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTLCBDRklMRVMpOiBMaXN0IGl0LgotCShoZXgubyk6IEFkZCBkZXBlbmRlbmNpZXMuCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBGb3IgR05VIHN0eWxlIGNvbnN0cnVjdG9yIGFuZAotCWRlc3RydWN0b3IgbmFtZXMsIHRyeSBkZW1hbmdsaW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZy4KLQotV2VkIERlYyAyOCAwMDo0OToxNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20+Ci0KLQkqIHZhc3ByaW50Zi5jIChpbnRfdmFzcHJpbnRmKTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkodmFzcHJpbnRmKTogVXNlIGludF92YXNwcmludGYuICBSZW1vdmVzIGFzc3VtcHRpb24gdGhhdCB2YV9saXN0Ci0JaXMgYXNzaWdubWVudCBjb21wYXRpYmxlLgotCi1TYXQgTm92ICA1IDE5OjI5OjEyIDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoTElCQ0ZMQUdTKTogTmV3IHZhcmlhYmxlLgotCShGTEFHU19UT19QQVNTKTogUGFzcyBpdC4KLQkoLmMubyk6IFVzZSBpdC4KLQotVGh1IE5vdiAgMyAxOTowOTo0NyAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBnZXRvcHQuYywgZ2V0b3B0MS5jOiBEbyBjb21waWxlIHRoZXNlIGZ1bmN0aW9ucyB1bmRlciBMaW51eCwKLQlzaW5jZSBtYW55IG5hdGl2ZSB2ZXJzaW9ucyBhcmUgYmFzZWQgb24gZ2xpYmMgYnV0IGFyZSBidWdneS4KLQotTW9uIE9jdCAyNCAxNToxNjo0NiAxOTk0ICBQZXIgQm90aG5lciAgPGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbT4KLQotCSogdmFzcHJpbnRmLmM6ICBNYWtlICdmb3JtYXQnIGFyZyBiZSBjb25zdCwgdG8gYXZvaWQgYSBtaXNtYXRjaAotCXdpdGggcHJvdG90eXBlIGluIEdOVSBsaWJjLiAgU3VwcG9ydCBzdGRhcmcuaCBhcyB3ZWxsIGFzIHZhcmFyZ3MuaC4KLQotVHVlIE9jdCAxMSAxNzo0ODoyNyAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFJFUVVJUkVEX09GSUxFUyk6IEFkZCB2YXNwcmludGYuby4KLQkqIGZ1bmN0aW9ucy5kZWY6IFJlbW92ZSB2YXNwcmludGYuCi0KLVdlZCBTZXAgMTQgMTc6MDQ6NTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiB4bWFsbG9jLmMgKGZpcnN0X2JyZWFrKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkoeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lKTogUmVjb3JkIHNicmsgKDApIGluIGZpcnN0X2JyZWFrLgotCSh4bWFsbG9jKTogSWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMsIHRyeSB0byByZXBvcnQgaG93IG11Y2gKLQltZW1vcnkgd2FzIGFsbG9jYXRlZCBieSB0aGUgcHJvZ3JhbSB1cCB0byB0aGlzIHBvaW50LgotCSh4cmVhbGxvYyk6IExpa2V3aXNlLgotCi1TdW4gU2VwIDA0IDE3OjU4OjEwIDE5OTQgIFJpY2hhcmQgRWFybnNoYXcgKHJ3ZUBwZWdhc3VzLmVzcHJpdC5lYy5vcmcpCi0KLQkqIE1ha2VmaWxlLmluIChFUlJPUlNfQ0MpOiBOZXcgdmFyaWFibGUsIGRlZmF1bHRlZCB0byAkKENDKS4gIFVzZSBpdAotCXdoZW4gbGlua2luZyBkdW1teS4KLQkqIGNvbmZpZy50YWJsZTogQWRkIGhvc3QgUklTQ2lYIE1ha2VmaWxlIGZyYWcuCi0JKiBjb25maWcvbWgtcmlzY2l4OiBOZXcgZmlsZS4KLQotVGh1IEF1ZyAyNSAxNzoyOTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChGTEFHU19UT19QQVNTKTogRGVmaW5lLgotCSgkKFJVTEUxKSk6IFVzZSAkKEZMQUdTX1RPX1BBU1MpLgotCi1XZWQgQXVnIDI0IDE3OjA4OjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogdmFzcHJpbnRmLmM6IEluY2x1ZGUgPHN0cmluZy5oPi4KLQkodmFzcHJpbnRmKTogQWRkIGNhc3RzIHRvIHZvaWQgZm9yIHZhX2FyZyB0byBhdm9pZCBnY2Mgd2FybmluZ3MuCi0JKiB4YXRleGl0LmM6IERlY2xhcmUgbWFsbG9jLgotCi1GcmkgQXVnIDE5IDE1OjI5OjEyIDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9hcmdzKTogRml4IGEgYnVnIGluIHByZXZpb3VzIHBhdGNoICh0aGUKLQlvbmUgYmVsb3cpLgotCi1UaHUgQXVnIDE4IDE0OjM3OjE0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZSBhcmdzKTogSGFuZGxlIEFSTSByZXBlYXQgZW5jb2Rpbmcgd2hlcmUKLSAgICAgICAgdGhlIHR5cGUgaW5kZXggaXMgZ3JlYXRlciB0aGFuIDkuCi0KLVdlZCBBdWcgMTcgMTY6MTM6NDkgMTk5NCAgS3VuZyBIc3UgIChrdW5nQG1leGljYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3F1YWxpZmllZCk6IGFjY2VwdCBvcHRpb25hbCAnXycgYmV0d2VlbgotCXF1YWxpZmllZCBuYW1lLiBUaGlzIGlzIGJhZWNhdXNlIHRoZSB0ZW1wbGF0ZSBuYW1lIG1heSBlbmQgd2l0aAotCW51bWVyaWMgYW5kIGNhbiBtaXhlZCB1cCB3aXRoIHRoZSBsZW5ndGggb2YgbmV4dCBxdWFsaWZpZWQgbmFtZS4KLQotV2VkIEF1ZyAgMyAwNTo1MjoxNCAxOTk0ICBELiBWLiBIZW5rZWwtV2FsbGFjZSAgKGd1bWJ5QGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9tdC1zdW5vczQ6IFVzZSBvdXIgc3RhbmRhcmQgbG9jYXRpb24gZm9yIGNyb3NzLWluY2x1ZGVzCi0JYW5kIGNyb3NzLWxpYnMgd2hlbiB0aGUgdGFyZ2V0IGlzIGFsc28gYSAiaG9zdCIgZW52aXJvbm1lbnQgKGllIG5vCi0JbmV3bGliOyBpbmNsdWRlcyBhbmQgc3VjaCBkb24ndCBiZWxvbmcgdG8gdXMpLiAgVGhpcyBpcyBzcGVjaWZpYwotCXRvIHRoZSBDeWdudXMgU3VwcG9ydCBlbnZpcm9ubWVudC4KLQotVHVlIEF1ZyAgMiAxNToyNToxMiAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBkZW1hbmdsZSBhcyB4eHg8J1EnPiBub3QKLQl4eHg8Y2g9ODE+LgotCi1Nb24gQXVnICAxIDE3OjAyOjQ4IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChtYWluKTogZmx1c2ggc3Rkb3V0IHRvIG1ha2UgcGlwZSB3b3JrLgotCi1TYXQgSnVsIDE2IDEyOjU2OjMyIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlICgqLSotY3h1eDcqKTogIFJlY29nbml6ZS4KLQkqIGZsb2F0Zm9ybWF0LmMgKGZsb2F0Zm9ybWF0X204ODExMF9leHQpIFtIQVJSSVNfRkxPQVRfRk9STUFUXToKLQlIYXJyaXMtc3BlY2lmaWMgZmxvYXQgZm9ybWF0LgotCSogY29uZmlnL21oLWN4dXg3OiBOZXcgZmlsZS4KLQotV2VkIEp1biAyOSAwMDoyNjoxNyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6ICBNYWtlIHN1cmUgdGhhdCB0aGUgcmVzdWx0IG9mCi0JY29uc3VtZV9jb3VudCBkb2Vzbid0IGluZGV4IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0KLU1vbiBKdW4gMjAgMjM6NTQ6MzcgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiAgSGFuZGxlIHZ0YWJsZSBtYW5nbGluZyBvZiBnY2MtMi40LjUgYW5kCi0JZWFybGllci4gSW1wcm92ZSB0ZXN0IGZvciBuZXcgdnRhYmxlIG1hbmdsaW5nLiBDaGFuZ2Ugb3V0cHV0IGJhY2sKLQl0byBgdmlydHVhbCB0YWJsZScuCi0KLU1vbiBKdW4gMjAgMTE6Mzc6MzAgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmM6IEFsd2F5cyBjb21waWxlIHRoaXMgY29kZSwgZXZlbiBpZiB1c2luZyB0aGUgR05VCi0JbGlicmFyeS4gIEF2b2lkcyBwcm9ibGVtcyB3aXRoIHJlbGF0aXZlbHkgcmVjZW50IGJpbmFyeQotCWluY29tcGF0aWJpbGl0eS4KLQotVGh1IEp1biAxNiAxNzo1NDowMSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBJbmNsdWRlIGxpYmliZXJ0eS5oLgotCSh4bWFsbG9jLCB4cmVhbGxvYywgZnJlZSk6IERvbid0IGRlY2xhcmUuCi0JKHN0cnN0cik6IERvbid0IGRlY2xhcmUgcGFyYW1ldGVycy4KLQkoeG1hbGxvYywgeHJlYWxsb2MpOiBEb24ndCBkZWZpbmUuCi0JKGxvbmdfb3B0aW9ucyk6IEFkZCBuby1zdHJpcC11bmRlcnNjb3Jlcy4KLQkobWFpbik6IENhbGwgeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lLiAgUGFzcyBuIGluIHNob3J0IG9wdGlvbnMgdG8KLQlnZXRvcHRfbG9uZy4gIEhhbmRsZSBvcHRpb24gJ24nIHRvIG5vdCBzdHJpcCB1bmRlcnNjb3Jlcy4KLQkodXNhZ2UpOiBNZW50aW9uIC1uIGFuZCAtLW5vLXN0cmlwLXVuZGVyc2NvcmVzLgotCi1TdW4gSnVuIDEyIDAxOjM3OjA5IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfdGVtcGxhdGUpOiBTZXBhcmF0ZSBjb25zZWN1dGl2ZSA+J3Mgd2l0aCBhCi0gICAgICAgIHNwYWNlLgotCShnbnVfc3BlY2lhbCk6IERlbWFuZ2xlIHRlbXBsYXRlIGFuZCBxdWFsaWZpZWQgbmFtZXMgaW4gYSB2dGFibGUgbmFtZS4KLQotRnJpIE1heSAyNyAxMjoyNzo1MiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JRnJvbSBnYXMtMi4zIGFuZCBiaW51dGlscy0yLjQgbmV0IHJlbGVhc2VzOgotCi0JV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIG1ha2VmaWxlLmRvczogW25ld10gTWFrZWZpbGUgZm9yIGRvcy9nbzMyCi0JKiBjb25maWd1cmUuYmF0OiB1cGRhdGUgZm9yIGxhdGVzdCBmaWxlcwotCSogbXNkb3MuYzogcmVtb3ZlIHNvbWUgZnVuY3Rpb25zIG5vdyBpbiBsaWJjLmEKLQotRnJpIE1heSAyMCAxODo1MzozMiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGdudV9zcGVjaWFsKTogIFJlY29nbml6ZSB0aHVua3MsIGFzIHdlbGwgYXMKLQl0aGUgbmV3IG5hbWluZyBzdHlsZSBmb3IgdnRhYmxlcyAod2hlbiAtZnZ0YWJsZS10aHVua3MpLgotCi1XZWQgTWF5IDE4IDEzOjM0OjA2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFhUUkFGTEFHUyk6IERvbid0IGRlZmluZS4KLQkoLmMubywgZHVtbXkubyk6IERvbid0IHVzZSBYVFJBRkxBR1MuCi0JKCQoUlVMRTEpKTogRG9uJ3QgcGFzcyBYVFJBRkxBR1MgZG93biBpbiByZWN1cnNpdmUgY2FsbC4KLQotRnJpIE1heSAxMyAxNjowMjoxMiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogdmFzcHJpbnRmLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWY6IEFkZCBpdC4KLQotRnJpIE1heSAxMyAxNjoyMDoyOCAxOTk0ICBKYXNvbiBNZXJyaWxsICAoamFzb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX2Z1bmRfdHlwZSk6IEdyb2sgYm9vbC4KLQotRnJpIE1heSAgNiAxNDo0NDoyMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IEFkZCBnbzMyCi0JKiBjb25maWcvbWgtZ28zMjogTmV3IHRlbXBsYXRlLgotCi1GcmkgTWF5ICA2IDExOjAxOjU5IDE5OTQgIEQuIFYuIEhlbmtlbC1XYWxsYWNlICAoZ3VtYnlAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZSwgY29uZmlnL210LXN1bm9zNDogY29uZmlnIGZvciB3aGVuIHN1bjQgaXMgY3Jvc3MgdGFyZ2V0LgotCi1Nb24gQXByIDExIDAwOjU0OjMzIDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIChybXNAbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGdldG9wdC5jIFtub3QgX19HTlVfTElCUkFSWV9fXSBbX19HQ0NfX10gW25vdCBfX1NURENfX106Ci0gICAgICAgIERlY2xhcmUgc3RybGVuIHRvIHJldHVybiBpbnQuICBEb24ndCBpbmNsdWRlIHN0ZGRlZi5oLgotCi1GcmkgQXByICAxIDAwOjM4OjE3IDE5OTQgIEppbSBXaWxzb24gICh3aWxzb25AbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGdldG9wdC5jOiBEZWxldGUgdXNlIG9mIElOX0dDQyB0byBjb250cm9sIHdoZXRoZXIKLSAgICAgICAgc3RkZGVmLmggb3IgZ3N0ZGRlZi5oIGlzIGluY2x1ZGVkLgotCi1UaHUgQXByIDE0IDE0OjAwOjU2IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiBGaXggYSBidWcgaW4gdGVtcGxhdGUgZnVuY3Rpb24KLQl0eXBlIG51bWJlcmluZy4KLQotV2VkIEFwciAxMyAxNzoyMzowMyAxOTk0ICBLdW5nIEhzdSAgKGt1bmdAbWV4aWNhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfc2lnbmF0dXJlKTogRml4IHRlbXBsYXRlIGZ1bmN0aW9uIHdpdGggYXJtCi0Jc3R5bGUgYXJndW1lbnQgdHlwZSBudW1iZXIsIFRuLgotCi1XZWQgQXByIDEzIDE3OjExOjE1IDE5OTQgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAob3B0YWJsZSk6IEFkZCBuZXdbXSBhbmQgZGVsZXRlW10uCi0KLUZyaSBBcHIgIDggMTE6MjE6NDIgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYyAoYnVpbGRhcmd2KTogRG9uJ3QgcHJvZHVjZSBlbXB0eSBhcmd1bWVudCBqdXN0IGJlY2F1c2UKLQl0aGVyZSBpcyB0cmFpbGluZyB3aGl0ZXNwYWNlLgotCi1XZWQgQXByICA2IDExOjQyOjE0IDE5OTQgIEt1bmcgSHN1ICAoa3VuZ0BtZXhpY2FuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6IGZpeCAnUScgcXVhbGlmaWVkIG5hbWUgYnVnLgotCUhhbmRsZSAncCcgc2FtZSBhcyAnUCcuCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEhhbmRsZSAncCcgc2FtZSBhcyAnUCcuCi0KLVNhdCBNYXIgMjYgMTI6MDA6MTMgMTk5NCAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBmbG9hdGZvcm1hdC5jIChnZXRfZmllbGQsIHB1dF9maWVsZCk6ICBGaXggb2ZmIGJ5IG9uZSBlcnJvciBpbgotCWxpdHRsZSBlbmRpYW4gY2FzZS4KLQotVGh1IE1hciAyNCAxMDo0MDoxOSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogZmxvYXRmb3JtYXQuYyAoZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUpOiBQYXNzIHVuc2lnbmVkIGNoYXIgKiwKLQlub3QgY2hhciAqLCB0byBwdXRfZmllbGQuCi0KLUZyaSBNYXIgMTggMTI6MzQ6MzMgMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIG1lbW1vdmUuYzogIFJlLXdyb3RlOyAgcGxhY2VkIGluIHB1YmxpYyBkb21haW4uCi0KLVdlZCBNYXIgMTYgMTA6MzM6MDcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiBJZiBBUk0gZGVtYW5nbGluZywgZG9uJ3QgdHJlYXQKLQlfX1EqIGFzIGEgY29uc3RydWN0b3IuCi0KLU1vbiBNYXIgMTQgMTI6MjY6MDIgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBpZWVlLWZsb2F0LmM6IFJlbW92ZWQ7IG5vIGxvbmdlciB1c2VkLgotCSogTWFrZWZpbGUuaW46IENoYW5nZWQgYWNjb3JkaW5nbHkuCi0KLU1vbiBNYXIgIDcgMTI6Mjg6MTcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5jIChnZXRfZmllbGQpOiBSZW1vdmVkIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBpLgotCShwdXRfZmllbGQpOiBSZW1vdmVkIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBpLgotCi1TdW4gRmViIDI3IDIxOjUwOjExIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBmbG9hdGZvcm1hdC5jOiBOZXcgZmlsZSwgaW50ZW5kZWQgdG8gcmVwbGFjZSBpZWVlLWZsb2F0LmMuCi0JKiBNYWtlZmlsZS5pbjogQ2hhbmdlIGFjY29yZGluZ2x5LgotCi1UaHUgRmViIDI0IDExOjUxOjEyIDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IFJlbW92ZSAjaWZkZWYgR0VUT1BUX0NPTVBBVCBhbmQgI2lmIDAgY29kZS4KLQkgKF9nZXRvcHRfaW5pdGlhbGl6ZSk6IE5ldyBmdW5jdGlvbiwgYnJva2VuIG91dCBvZiBfZ2V0b3B0X2ludGVybmFsLgotCSAoX2dldG9wdF9pbnRlcm5hbCk6Ci0JIElmIGxvbmdfb25seSBhbmQgdGhlIEFSR1YtZWxlbWVudCBoYXMgdGhlIGZvcm0gIi1mIiwgd2hlcmUgZiBpcwotCSBhIHZhbGlkIHNob3J0IG9wdGlvbiwgZG9uJ3QgY29uc2lkZXIgaXQgYW4gYWJicmV2aWF0ZWQgZm9ybSBvZgotCSBhIGxvbmcgb3B0aW9uIHRoYXQgc3RhcnRzIHdpdGggZi4gIE90aGVyd2lzZSB0aGVyZSB3b3VsZCBiZSBubwotCSB3YXkgdG8gZ2l2ZSB0aGUgLWYgc2hvcnQgb3B0aW9uLgotCi1UaHUgRmViIDEwIDE0OjQ0OjE2IDE5OTQgIFJpY2hhcmQgU3RhbGxtYW4gIChybXNAbW9sZS5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGdldG9wdC5jIFtub3QgX19HTlVfTElCUkFSWV9fXSBbX19HTlVDX19dIFtub3QgSU5fR0NDXToKLSAgICAgICAgVGVzdCBqdXN0IF9fU1REQ19fLCBub3QgZW1hY3MuCi0KLVdlZCBGZWIgIDkgMDA6MTQ6MDAgMTk5NCAgUmljaGFyZCBTdGFsbG1hbiAgKHJtc0Btb2xlLmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogZ2V0b3B0LmMgW25vdCBfX0dOVV9MSUJSQVJZX19dIFtfX0dOVUNfX10gW25vdCBJTl9HQ0NdCi0gICAgICAgIFtlbWFjc10gW25vdCBfX1NURENfX106IERvbid0IGluY2x1ZGUgc3RkZGVmLmguICBEb24ndCBkZWNsYXJlIHN0cmxlbi4KLQotRnJpIERlYyAyNCAxOTo0MzowMCAxOTkzICBOb2FoIEZyaWVkbWFuICAoZnJpZWRtYW5AbnV0cmltYXQuZ251LmFpLm1pdC5lZHUpCi0KLSAgICAgICAgKiBnZXRvcHQuYyAoX05PX1BST1RPKTogRGVmaW5lIGJlZm9yZSBjb25maWcuaCBpcyBpbmNsdWRlZC4KLQotTW9uIFNlcCAyMCAxNTo1OTowMyAxOTkzICBSb2xhbmQgTWNHcmF0aCAgKHJvbGFuZEBjaHVyY2h5LmdudS5haS5taXQuZWR1KQotCi0gICAgICAgICogZ2V0b3B0LmMsIGdldG9wdDEuYyBbZW1hY3MgfHwgQ09ORklHX0JST0tFVFNdOiBJbmNsdWRlCi0JPGNvbmZpZy5oPiBvbmx5IHVuZGVyIHRoZXNlLCBlbHNlICJjb25maWcuaCIuCi0KLVRodSBBdWcgMTIgMTg6MTY6NDkgMTk5MyAgUm9sYW5kIE1jR3JhdGggIChyb2xhbmRAY2h1cmNoeS5nbnUuYWkubWl0LmVkdSkKLQotICAgICAgICAqIGdldG9wdC5jLCBnZXRvcHQxLmMgW0hBVkVfQ09ORklHX0hdOiBJbmNsdWRlCi0gICAgICAgIDxjb25maWcuaD4gaW5zdGVhZCBvZiAiY29uZmlnLmgiLgotCi1TdW4gRmViIDIwIDE3OjE3OjAxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AbGlzYS5jeWdudXMuY29tKQotCi0JKiBjb25jYXQuYzogQ2hlY2sgQU5TSV9QUk9UT1RZUEVTIHJhdGhlciB0aGFuIF9fU1REQ19fIHRvIGRlY2lkZQotCXdoZXRoZXIgdG8gdXNlIHByb3RvdHlwZXMgb3Igbm90LgotCSogc3RyZXJyb3IuYyAoY29uc3QpOiBOZXZlciB1bmRlZmluZTsgbGV0IGFuc2lkZWNsLmggaGFuZGxlIGl0LgotCSogc3Ryc2lnbmFsLmMgKGNvbnN0KTogTGlrZXdpc2UuCi0KLVRodSBGZWIgMTcgMTM6Mjc6MzUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB4YXRleGl0LmMgKF94ZXhpdF9jbGVhbnVwKTogRGVjbGFyZSBhcyBleHRlcm47IGRvbid0IGluaXRpYWxpemUuCi0JTWVyZ2luZyBjb21tb24gYW5kIGluaXRpYWxpemVkIHZhcmlhYmxlcyBuZWVkIG5vdCBiZSBzdXBwb3J0ZWQgYnkKLQlBTlNJIEMgY29tcGlsZXJzLgotCSh4YXRleGl0KTogSW5pdGlhbGl6ZSBfeGV4aXRfY2xlYW51cCBpZiBub3QgYWxyZWFkeSBzZXQuCi0JKiB4ZXhpdC5jOiBDb21tZW50IGZpeC4KLQotV2VkIEZlYiAxNiAwMToxNTozNiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYzogRG9uJ3QgZGVjbGFyZSB4ZXhpdDsgaXQncyBkZWNsYXJlZCBpbiBsaWJpYmVydHkuaC4KLQkoeHJlYWxsb2MpOiBJZiBvbGRtZW0gaXMgTlVMTCwgYWxsb2NhdGUgd2l0aCBtYWxsb2MsIHJhdGhlciB0aGFuCi0JYXNzdW1pbmcgdGhhdCByZWFsbG9jIHdvcmtzIGNvcnJlY3RseS4KLQotVHVlIEZlYiAxNSAwOToyNjoxNiAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNvbmNhdC5jLCBpZWVlLWZsb2F0LmM6ICBSZXBsYWNlIGluY2x1c2lvbiBvZiA8c3RyaW5nLmg+Ci0Jd2l0aCBleHBsaWNpdCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGFzIHJlY29tbWVuZGVkIGJ5IElhbiBUYXlsb3IuCi0KLVNhdCBGZWIgMTIgMTA6MzE6MTEgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHJ0bC5jeWdudXMuY29tKQotCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogVXNlIFBUUiBhbmQgc2l6ZV90IHRocm91Z2hvdXQuCi0JKG1hbGxvYywgcmVhbGxvYyk6IERlY2xhcmUuCi0KLVRodSBGZWIgMTAgMTc6MDg6MTkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBhcmd2LmMsIGJhc2VuYW1lLmM6IEluY2x1ZGUgYW5zaWRlY2wuaCBhbmQgbGliaWJlcnR5LmguCi0JKiBjb25jYXQuYywgZmRtYXRjaC5jLCBnZXRydW50aW1lLmMsIHNwYWNlcy5jOiBMaWtld2lzZS4KLQkqIHN0cmVycm9yLmMsIHN0cnNpZ25hbC5jLCB4YXRleGl0LmMsIHhleGl0LmM6IExpa2V3aXNlLgotCSogeG1hbGxvYy5jOiBMaWtld2lzZS4KLQkqIGNvbmNhdC5jOiBEb24ndCBkZWNsYXJlIHhtYWxsb2MuICBJZiBfX1NURENfXywgdXNlIDxzdGRhcmcuaD4KLQltYWNyb3MsIG5vdCA8dmFyYXJncy5oPiBtYWNyb3MuCi0JKiBzcGFjZXMuYyAoc3BhY2VzKTogTWFrZSByZXR1cm4gdHlwZSBjb25zdC4gIERvbid0IGNyYXNoIGlmCi0JbWFsbG9jIHJldHVybnMgTlVMTC4KLQkqIHN0cmVycm9yLmMgKHN0cnVjdCBlcnJvcl9pbmZvKTogTWFrZSBuYW1lIGFuZCBtc2cgZmllbGRzIGNvbnN0LgotCShlcnJvcl9uYW1lcyk6IE1ha2UgY29uc3QuCi0JKHN0cmVycm5vKTogTWFrZSBjb25zdC4KLQkoc3RydG9lcnJubyk6IE1ha2UgYXJndW1lbnQgY29uc3QuCi0JKiBzdHJzaWduYWwuYyAoc3RydWN0IHNpZ25hbF9pbmZvKTogTWFrZSBuYW1lIGFuZCBtc2cgZmllbGRzCi0JY29uc3QuCi0JKHNpZ25hbF9uYW1lcywgc3lzX3NpZ2xpc3QpOiBNYWtlIGNvbnN0LgotCShzdHJzaWduYWwsIHN0cnNpZ25vKTogTWFrZSBjb25zdC4KLQkoc3RydG9zaWdubyk6IE1ha2UgYXJndW1lbnQgY29uc3QuCi0JKiB4YXRleGl0LmM6IERlY2xhcmUgcGFyYW1ldGVyIHR5cGVzLgotCSogeG1hbGxvYy5jIChuYW1lKTogTWFrZSBjb25zdC4KLQkoeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lKTogTWFrZSBhcmd1bWVudCBjb25zdC4KLQkqIE1ha2VmaWxlLmluIChJTkNESVIpOiBEZWZpbmUuCi0JKC5jLm8pOiBVc2UgJChJTkNESVIpLgotCShkdW1teS5vKTogTGlrZXdpc2UuCi0JKGFyZ3YubywgYmFzZW5hbWUubyk6IE5ldyB0YXJnZXRzOyBkZXBlbmQgb24gbGliaWJlcnR5LmguCi0JKGNvbmNhdC5vLCBmZG1hdGNoLm8sIGdldHJ1bnRpbWUubywgc3BhY2VzLm8pOiBMaWtld2lzZS4KLQkoc3RyZXJyb3Iubywgc3Ryc2lnbmFsLm8sIHhhdGV4aXQubywgeGV4aXQubyk6IExpa2V3aXNlLgotCSh4bWFsbG9jLm8pOiBMaWtld2lzZS4KLQkoY3BsdXMtZGVtLm8pOiBOZXcgdGFyZ2V0OyBkZXBlbmQgb24gZGVtYW5nbGUuaC4KLQkoZ2V0b3B0Lm8sIGdldG9wdDEubyk6IE5ldyB0YXJnZXRzOyBkZXBlbmQgb24gZ2V0b3B0LmguCi0JKGllZWUtZmxvYXQubyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCBvbiBpZWVlLWZsb2F0LmguCi0JKG9ic3RhY2subyk6IE5ldyB0YXJnZXQ7IGRlcGVuZCBvbiBvYnN0YWNrLmguCi0KLVR1ZSBGZWIgIDggMDU6Mjk6MDggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JSGFuZGxlIG9ic3RhY2tfY2h1bmtfYWxsb2MgcmV0dXJuaW5nIE5VTEwuICBUaGlzIGFsbG93cwotCW9ic3RhY2tzIHRvIGJlIHVzZWQgYnkgbGlicmFyaWVzLCB3aXRob3V0IGZvcmNpbmcgdGhlbQotCXRvIGNhbGwgZXhpdCBvciBsb25nam1wLgotCSogb2JzdGFjay5jIChfb2JzdGFja19iZWdpbiwgX29ic3RhY2tfYmVnaW5fMSwgX29ic3RhY2tfbmV3Y2h1bmspOgotCUlmIENBTExfQ0hVTktGVU4gcmV0dXJucyBOVUxMLCBzZXQgYWxsb2NfZmFpbGVkLCBlbHNlIGNsZWFyIGl0LgotCShfb2JzdGFja19iZWdpbiwgX29ic3RhY2tfYmVnaW5fMSk6IFJldHVybiAxIGlmIHN1Y2Nlc3NmdWwsIDAgaWYgbm90LgotCi1UdWUgRmViICA4IDAwOjMyOjI4IDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogY29uY2F0LmMsIGllZWUtZmxvYXQuYzogIEluY2x1ZGUgPHN0cmluZy5oPi4KLQotU3VuIEZlYiAgNiAyMToyODo0NiAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHhtYWxsb2MuYyAoeG1hbGxvY19zZXRfcHJvZ3JhbV9uYW1lKTogTmV3IGZ1bmN0aW9uLgotCSh4bWFsbG9jLCB4cmVhbGxvYyk6IEluY2x1ZGUgdGhlIG5hbWUgaW4gdGhlIGVycm9yIG1lc3NhZ2UsIGlmIHNldC4KLQotCSogUmVwbGFjZSBhdGV4aXQuYyB3aXRoIHhhdGV4aXQuYy4KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpLCBmdW5jdGlvbnMuZGVmOiBDaGFuZ2UgcmVmZXJlbmNlcy4KLQotU2F0IEZlYiAgNSAxNDowMjozMiAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGdldHJ1bnRpbWUuYyAoZ2V0X3J1bl90aW1lKTogVXNlIGdldHJ1c2FnZSBvciB0aW1lcyBpZgotCUhBVkVfR0VUUlVTQUdFIG9yIEhBVkVfVElNRVMgYXJlIGRlZmluZWQuCi0KLUZyaSBGZWIgIDQgMTU6NDk6MzggMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhdGV4aXQuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKSwgZnVuY3Rpb25zLmRlZjogQWRkIGl0LgotCSogeGV4aXQuYzogTmV3IGZpbGUuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTLCBSRVFVSVJFRF9PRklMRVMpOiBBZGQgaXQuCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogQ2FsbCB4ZXhpdCBpbnN0ZWFkIG9mIGV4aXQuCi0JQ2hhbmdlIHJlcXVlc3QgZm9yIDAgYnl0ZXMgaW50byByZXF1ZXN0IGZvciAxIGJ5dGUuCi0KLVdlZCBGZWIgIDIgMTE6MzY6NDkgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiB4bWFsbG9jLmMgKHhtYWxsb2MsIHhyZWFsbG9jKTogUHJpbnQgc2l6ZSB1c2luZyAlbHUsIGFuZCBjYXN0IHRvCi0JdW5zaWduZWQgbG9uZywgdG8gYXZvaWQgd2FybmluZ3MuCi0KLUZyaSBKYW4gMjggMTc6NDk6MDYgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogZHVtbXkuYzogRG9uJ3QgaW5jbHVkZSB0aW1lLmggZXZlcjsgYWx3YXlzIGRlZmluZSBjbG9ja190IGFzCi0JInVuc2lnbmVkIGxvbmciLiAgVW50aWwgZ2NjL2ZpeGluY2x1ZGVzIGVuc3VyZXMgdGhhdCBjbG9ja190Ci0JZXhpc3RzLCBfX1NURENfXyBpc24ndCBhIHN1ZmZpY2llbnQgdGVzdC4gIEFuZCBpZiBjbG9jaygpIGRvZXNuJ3QKLQlleGlzdCwgY2xvY2tfdCBwcm9iYWJseSBkb2Vzbid0IGVpdGhlci4KLQotTW9uIEphbiAyNCAxMTo1MjozMSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNsb2NrLmMsIGdldHJ1bnRpbWUuYzogTmV3IGZpbGVzLgotCSogTWFrZWZpbGUuaW46IEFkZCB0byBmaWxlIGxpc3RzLgotCSogZnVuY3Rpb25zLmRlZiAoY2xvY2spOiBBZGQgdG8gbGlzdC4KLQkqIGR1bW15LmMgKHRpbWUuaCk6IEFkZCBpZiBfX1NURENfXy4KLQkoY2xvY2tfdCk6ICNkZWZpbmUgYXMgInVuc2lnbmVkIGxvbmciIGlmIG5vdCBfX1NURENfXy4KLQotVHVlIEphbiAxMSAxMToyNzo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHN0cnRvZC5jOiBEZWNsYXJlIGF0b2YuICBGcm9tIGVkbGVyQGphbi51bHRyYS5ueXUuZWR1IChKYW4KLQlFZGxlcikuCi0KLVR1ZSBEZWMgMjggMTQ6MTc6MzAgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZXJyb3JzKTogVXNlIENGTEFHUyBhcyB3ZWxsIGFzIExERkxBR1Mgd2hlbgotCWxpbmtpbmcuCi0KLUZyaSBEZWMgMTcgMTI6MjY6MDcgMTk5MyAgS3VuZyBIc3UgIChrdW5nQGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfYXJtX3B0KTogTmV3IGZ1bmN0aW9uLiAgQ29tbW9uIGNvZGUKLQlmb3IgQVJNIHRlbXBsYXRlIGRlbWFuZ2xpbmcuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfY2xhc3NfbmFtZSk6IFVzZSBkZW1hbmdsZV9hcm1fcHQuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcHJlZml4KTogTGlrZXdpc2UuCi0KLVR1ZSBOb3YgMzAgMTU6NDc6NDggMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZV9vcG5hbWUpOiBBZGQgQ09OU1QgdG8gcGxlYXNlIGdjYy4KLQotU2F0IE5vdiAyNyAxMTowNTo1MCAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCU1lcmdlIGNoYW5nZXMgZnJvbSB0b21AYmFzaWwuaWNjZS5ydWcubmwgKFRvbSBSLkhhZ2VtYW4pCi0JKiBzdHJlcnJvci5jLCBzdHJzaWduYWwuYzogIEFzIGEgc21hbGwgc3BhY2Ugb3B0aW1pemF0aW9uLCBkb24ndAotCWluY2x1ZGUgbWVzc2FnZXMgd2hlbiB0aGV5IGFyZW4ndCBhY3R1YWxseSB1c2VkLgotCi0JTWVyZ2UgY2hhbmdlcyBmcm9tIHRha2VmaXZlLmNvLmF0IWpvZSAoSm9zZWYgTGVoZXJiYXVlcikKLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgsIGRlbWFuZ2xlX2Z1bmN0aW9uX25hbWUsCi0JY3BsdXNfZGVtYW5nbGVfb3BuYW1lKTogIEZpeGVzIGZvciBzeXN0ZW1zIHdoZXJlIGNwbHVzX21hcmtlcgotCWlzIHNvbWV0aGluZyBvdGhlciB0aGFuICckJy4KLQotRnJpIE5vdiAyNiAxMzo1MToxMSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogd2FpdHBpZC5jOiAgU2ltcGxlLW1pbmRlZCBhcHByb2NpbWF0aW9uIHRvIHdhaXRwaWQKLQl1c2luZyB2YW5pbGxhIHdhaXQuCi0JKiBmdW5jdGlvbnMuZGVmLCBNYWtlZmlsZS5pbjogIFVwZGF0ZSBhY2NvcmRpbmdseSwKLQotVGh1IE5vdiAxOCAxODowMToxNSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jKGRlbWFuZ2xlX3RlbXBsYXRlKTogZml4IGJ1ZyB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uCi0Jd2l0aCB2YWx1ZSBvZiB1c2VyIGRlZmluZWQgdHlwZS4KLQotV2VkIE5vdiAxNyAxODozMDoyMSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jKGNwbHVzX2RlbWFuZ2xlX29wbmFtZSk6IGFkZCB0aGUgc3ViamVjdCBuZXcgZnVuY3Rpb24KLQl0byBzdXBwb3J0IHVuaWZpZWQgc2VhcmNoIG9mIG9wZXJhdG9yIGluIGNsYXNzLgotCi1XZWQgTm92IDEwIDA5OjQ3OjIyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JZ2NjIC1XYWxsIGxpbnQ6Ci0JKiBzdHJ0b3VsLmMgKHN0cnRvdWwpOiB1c2UgIihkaWdpdCA9ICpzKSAhPSAnXDAnIiBub3QganVzdAotCSJkaWdpdCA9ICpzIiBhcyBjb25kaXRpb24gaW4gd2hpbGUgbG9vcC4KLQotVHVlIE5vdiAgOSAxNTo1MjoyMiAxOTkzICBNYXJrIEVpY2hpbiAgKGVpY2hpbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcGFzcyBTSEVMTCB0byByZWN1cnNpdmUgbWFrZQotCi1UaHUgTm92ICA0IDEyOjA5OjI2IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiB2ZnByaW50Zi5jLCB2cHJpbnRmLmMsIHZzcHJpbnRmLmM6ICBNYWtlIGZvcm1hdCBhcmcKLQliZSAoY29uc3QgY2hhciopLCBmb3IgQU5TSSAoYW5kIGdjYyB3L2ZpeHByb3RvKSBjb25zaXN0ZW5jeS4KLQotVGh1IE5vdiAgNCAwODoyOTowNCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiBNYWtlICotKi1oaXV4KiB1c2UgbWgtaHB1eC4KLQotRnJpIE9jdCAyMiAwNzo1MzoxNSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlnLnRhYmxlOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UdWUgT2N0IDE5IDE3OjEyOjAxIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGxuZWVkZWQtbGlzdCk6IGVuc3VyZSB0aGF0IG9iamVjdCBmaWxlIG5hbWVzIGFyZQotCSAgbm90IGR1cGxpY2F0ZWQsIGFzIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBvYmplY3QgZmlsZSBpbgotCSAgYSBsaWJyYXJ5IGNhdXNlcyBwcm9ibGVtcyBvbiBzb21lIG1hY2hpbmVzCi0KLU1vbiBPY3QgMTggMjE6NTk6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHN0cmNhc2VjbXAuYywgc3RybmNhc2VjbXAuYzogQ2hhbmdlIHVfY2hhciB0byB1bnNpZ25lZCBjaGFyLgotCi1GcmkgT2N0IDE1IDIyOjE3OjExIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogc3RybmNhc2VjbXAuYzogbmV3IGZpbGUsIGltcGxlbWVudHMgc3RybmNhc2VjbXAKLQkqIHN0cmNhc2VjbXAuYzogbmV3IGZpbGUsIGltcGxlbWVudCBzdHJjYXNlY21wCi0KLQkqIE1ha2VmaWxlLmluIChDRklMRVMpOiBsaXN0IHRoZXNlIHR3byBuZXcgc291cmNlIGZpbGVzCi0KLQkqIGZ1bmN0aW9ucy5kZWY6IGFkZCBzdHJjYXNlY21wIGFuZCBzdHJuY2FzZWNtcCBlbnRyaWVzCi0KLUZyaSBPY3QgMTUgMTQ6NTM6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBzdHJ0b3VsLmMgKHN0cnRvdWwpLCBzdHJ0b2wuYyAoc3RydG9sKTogSGFuZGxlIG92ZXJmbG93Ci0JYWNjb3JkaW5nIHRvIEFOU0kgQy4KLQotVGh1IE9jdCAxNCAxNjozNDoxOSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBhZGQgc3VwcG9ydCBvZiBBUk0gZ2xvYmFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IsCi0JYW5kICdHJyBmb3IgcGFzc2luZyByZWNvcmQgb3IgdW5pb24gaW4gcGFyYW1ldGVyLgotCi1XZWQgT2N0IDEzIDEzOjM2OjE5IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogRml4IGNvbW1lbnQgdG8gY2xhcmlmeSB0aGF0IHN0dWZmIGluIFJFUVVJUkVEX09GSUxFUwotCXNob3VsZCBub3QgYmUgaW4gZnVuY3Rpb25zLmRlZi4KLQotV2VkIE9jdCAxMyAxMzoxMzozOCAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGZ1bmN0aW9ucy5kZWY6IFJlbW92ZWQgeG1hbGxvYy4gIFN0dWZmIGluIFJFUVVJUkVEX09GSUxFUyBzaG91bGQKLQlub3QgYmUgaW4gZnVuY3Rpb25zLmRlZi4KLQotTW9uIE9jdCAgNCAxODoyNjozOSAxOTkzICBLdW5nIEhzdSAgKGt1bmdAY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiBjaGFuZ2UgZ2xvYmwgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB0byBwcm9wZXIgbmFtZQotCi1UdWUgU2VwIDI4IDE4OjExOjA3IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IGZpeCBidWcgaW4gY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgotCi1UdWUgU2VwIDI4IDE2OjIwOjQ5IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IHN1cHBvcnQgYm90aCBvbGQgYW5kIG5ldyBfdnQkLi4uIHZ0YmwgbWFuZ2xlZCBuYW1lcwotCi1GcmkgU2VwIDI0IDE5OjA3OjE2IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogRml4IGRlbWFuZ2xlX3RlbXBsYXRlIHByb3RvdHlwZQotCi1GcmkgU2VwIDI0IDE3OjMyOjU1IDE5OTMgIEt1bmcgSHN1ICAoa3VuZ0BjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IGZpeCB0ZW1wbGF0ZSBkZW1hbmdsaW5nCi0JKiBjcGx1cy1kZW0uYzogZml4IGNvbnN0IHR5cGUgZGVtYW5nbGluZwotCSogY3BsdXMtZGVtLmM6IGZpeCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yLCB2aXJ0dWFsIHRhYmxlLAotCXF1YWxpZmllciwgZ2xvYmFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZGVtYW5nbGluZwotCi1XZWQgU2VwICAxIDIzOjEzOjExIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYywgc3RyZXJyb3IuYzogVXNlIGZ1bGx5LWJyYWNrZXRlZCBpbml0aWFsaXplciB0bwotCWtlZXAgZ2NjIC1XYWxsIGhhcHB5LgotCi1GcmkgQXVnIDI3IDEwOjMwOjA5IDE5OTMgIEphc29uIE1lcnJpbGwgIChqYXNvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IEFkZCBDT05TVFMgdG8gbWFrZSBnY2MgaGFwcHkgd2l0aCBsYXN0Ci0JcGF0Y2guCi0KLUZyaSBBdWcgMjcgMTE6MjQ6NTQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQlQYXRjaCBmcm9tIFBhdWwgRmxpbmRlcnM6Ci0JKiBjcGx1cy1kZW0uYyAoZG9fdHlwZSk6IERlYWwgd2l0aCBhcnJheXMuCi0KLVR1ZSBBdWcgMjQgMTQ6MjM6NTAgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9xdWFsaWZpZWQ6IERlYWwgd2l0aCBHTlUgZm9ybWF0IGZvciBtb3JlCi0JdGhhbiA5IGNsYXNzZXMuCi0KLVdlZCBBdWcgMTggMTk6NTA6MjkgMTk5MyAgSmFzb24gTWVycmlsbCAgKGphc29uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkdW1teS5vKTogUmVkaXJlY3QgdG8gL2Rldi9udWxsIHRvIGF2b2lkICJ2YXJpYWJsZQotCW5vdCBpbml0aWFsaXplZCIgd2FybmluZ3MgdW5kZXIgSFAvVVgKLQotU3VuIEF1ZyAxNSAyMDo0Mjo0MCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3RyZXJyb3IuYzogTW92ZSBpbmNsdWRlIG9mIHN0ZGlvLmggYWZ0ZXIgc3lzX2Vycmxpc3QgI2RlZmluZS4KLQlBbHNvIHJlbW92ZSBOVUxMIGRlZmluaXRpb24gKHN0ZGlvLmggYWx3YXlzIGRlZmluZXMgTlVMTCwgc28gaXQKLQluZXZlciBkaWQgYW55dGhpbmcgYnV0IGNsdXR0ZXIgdXAgdGhlIGNvZGUpLgotCi1TYXQgQXVnIDE0IDE0OjIxOjQ5IDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvb0BydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWY6IGhhbmRsZSB4bWFsbG9jLmMKLQotCSogeG1hbGxvYy5jOiBwcm92aWRlIHhtYWxsb2MgYW5kIHhyZWFsbG9jIGZ1bmN0aW9ucwotCi1UaHUgQXVnIDEyIDE3OjM4OjU3IDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6IEZpeCBhIGNvbW1lbnQuCi0KLVNhdCBBdWcgIDcgMTM6NTY6MzUgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBnZXRvcHQxLmM6IERlY2xhcmUgY29uc3QgdGhlIHdheSBnZXRvcHQuYyBkb2VzLgotCi1GcmkgQXVnICA2IDE3OjAzOjEzIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jLCBhbGxvY2EuYzogVXBkYXRlIGZyb20gRlNGLgotCSogZ2V0b3B0LmMsIGdldG9wdDEuYzogVXBkYXRlIHRvIGN1cnJlbnQgRlNGIHZlcnNpb24sIHdoaWNoCi0JZG9lc24ndCB1c2UgYWxsb2NhLgotCi1UdWUgSnVsIDI3IDE0OjAzOjU3IDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGRlbWFuZ2xlKTogQWRkIHRoZSB0YXJnZXQgd2l0aCBhIG1lc3NhZ2Ugc2F5aW5nCi0Jd2hlcmUgZGVtYW5nbGUgd2VudC4KLQotTW9uIEp1bCAyNiAxNTo0OTo1NCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBvYnNvbGV0ZSBgZGVtYW5nbGUnIHRhcmdldC4KLQotVGh1IEp1bCAyMiAwODozMTowMSAxOTkzICBGcmVkIEZpc2ggIChmbmZAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGFybV9zcGVjaWFsKTogIEFwcGx5IHBhdGNoIGZyb20gYXJnQGx1Y2lkLmNvbSB0bwotCWF2b2lkIGluZmluaXRlIGxvb3Agb24gdnRibCBzeW1ib2xzIHdpdGggZGlzYW1iaWd1YXRpbmcgImp1bmsiCi0JdGFja2VkIG9uIHRoZSBlbmQuCi0KLU1vbiBKdWwgMTkgMTQ6MTA6MzcgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vQHJ0bC5jeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYzogd29yayBhcm91bmQgc29tZSBzeXN0ZW1zIGxvc2luZyBkZWZpbml0aW9ucyBvZgotCXN5c19zaWdsaXN0Ci0KLQkqIGNvbmZpZy9taC1seW54b3M6IHRoaXMgc3lzdGVtIGhhcyBhIGxvc2luZyBkZWZpbml0aW9uIG9mCi0Jc3lzX3NpZ2xpc3QKLQotCSogY29uZmlnLnRhYmxlOiB1c2UgbWgtbHlueG9zIGZvciAqLSotbHlueG9zCi0KLU1vbiBKdWwgMTkgMTc6MDg6NTIgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjb25maWcudGFibGU6IEFkZCBzdXBwb3J0IGZvciBIUFBBIEJTRCBob3N0cy4KLQotCSogY29uZmlnL21oLWhwYnNkOiBOZXcgZmlsZS4KLQotTW9uIEp1bCAxMiAxODowMDo0MCAxOTkzICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKFRBR1MpOiBtYWtlIHdvcmsgd2hlbiBzcmNkaXIgIT0gb2JqZGlyLgotCi1TdW4gSnVuIDI3IDE1OjM1OjMxIDE5OTMgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUB0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKG1haW4pOiBBZGQgbG9uZyBvcHRpb25zLCBpbmNsdWRpbmcgLS1oZWxwIGFuZAotCS0tdmVyc2lvbi4KLQkodXNhZ2UpOiBOZXcgZnVuY3Rpb24gZnJvbSBjb2RlIGluIG1haW4uCi0KLVR1ZSBKdW4gMjIgMTE6Mzc6MzggMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy50YWJsZTogIE5ldyBzaGVsbCBzY2lwdCwgc291cmNlZCBieSBib3RoIC4vY29uZmlndXJlLGluCi0JYW5kIC4uL3hpYmVydHkvY29uZmlndXJlLmluLCB0byBhdm9pZCBtYWludGFpbmFuY2UgbG9zc2FnZXMuCi0JKiBjb25maWd1cmUuaW4gYW5kIC4uL3hpYmVydHkvY29uZmlndXJlLmluOiAgVXNlIGNvbmZpZy50YWJsZS4KLQotCSogY29uZmlndXJlLmluOiBEb24ndCB1c2UgbWgtYWl4IGZvciBBSVggMy4yLCBvbmx5IGZvciAzLjEuCi0JKiBjb25maWd1cmUuaW46IE1hcCAqLSotaXJpeCogKGV4Y2VwdCBpcml4NCkgdG8gbWgtc3lzdi4KLQkqIC4uL3hpYmVydHkvY29uZmlndXJlLmluOiAgVXBkYXRlIGZyb20gLi9jb25maWd1cmUuaW4uCi0KLVR1ZSBKdW4gMTUgMTc6MDU6MzEgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIHBhcmVudGRpciBzdXBwb3J0Ci0KLVdlZCBNYXkgMjYgMTI6NTk6MDkgMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoeHJlYWxsb2MpOiAgTWF0Y2ggZGVmaW5pdGlvbiB3aXRoIHByb3RvdHlwZS4KLQotVHVlIE1heSAyNSAxNDoyNzo1MSAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9wcmVmaXgpOiAgRGVtYW5nbGUgY2Zyb250Ci0JbG9jYWwgdmFyaWFibGVzIGFzIGFuIGV4dGVuc2lvbiB0byBBUk0gZGVtYW5nbGluZy4KLQotRnJpIE1heSAyMSAwOTo1Mzo1NyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaWVlZS1mbG9hdC5jOiBEb24ndCByZXF1aXJlIHBvaW50ZXJzIHRvIGRvdWJsZSB0byBiZSBhbGlnbmVkLgotCi1UdWUgTWF5IDE4IDE3OjEyOjEwIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0gICAgICAgIChtZXJnZSBjaGFuZ2VzIGZyb20gZGxvbmdAY3NlLnVjc2MuZWR1KQotCSogY3BsdXMtZGVtLmMgKGNvbnN1bWVfY291bnQpOiAgU2ltcGxpZnkuCi0JKiBjcGx1cy1kZW0uYyAoYXJtX3B0LCBkZW1hbmdsZV9jbGFzc19uYW1lKTogIE5ldyBmdW5jdGlvbnMuCi0JKiBjcGx1cy1kZW0uYyAodmFyaW91cyk6ICBDYWxscyB0byBhcm1fcHQsIGRlbWFuZ2xlX2NsYXNzX25hbWUuCi0KLQkqIGNwbHVzLWRlbS5jICh4bWFsbG9jLCB4cmVhbGxvYywgc3Ryc3RyKTogIE1ha2UgZXh0ZXJuIGRlY2xzIGludG8KLQlmdWxsIHByb3RvdHlwZXMuCi0JKiBjcGx1cy1kZW0uYyAoZnJlZSk6ICBBZGQgcHJvdG90eXBlLgotCSogY3BsdXMtZGVtLmMgKG9wdGFibGUpOiAgRnVsbHkgYnJhY2tldGl6ZSBpbml0aWFsaXplci4KLQotRnJpIE1heSAxNCAxNzoxMzowNSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBXaGV0aGVyIGluaXRpYWwgdW5kZXJzY29yZXMgYXJlIHN0cmlwcGVkCi0JZGVwZW5kcyBvbiB0aGUgZXh0ZXJuYWwgdmFyaWFibGUgcHJlcGVuZHNfdW5kZXJzY29yZQotCSh3aGljaCBpcyBnZW5lcmF0ZWQgYnkgdGhlIGJpbnV0aWxzIE1ha2VmaWxlKS4KLQotRnJpIE1heSAxNCAwNzozMjoyMCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKG1vcF91cCwgYXJtX3NwZWNpYWwpOiBSZW1vdmUgc29tZSB1bnVzZWQgdmFyaWFibGVzLgotCi1UdWUgTWF5ICA0IDIwOjMxOjU5IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoY29uc3VtZV9jb3VudCk6ICBSZXR1cm4gemVybyBpZiBhcmcgZG9lcyBub3QKLQlzdGFydCB3aXRoIGRpZ2l0LCBhbmQgZG9uJ3QgY29uc3VtZSBhbnkgaW5wdXQuCi0KLVR1ZSBNYXkgIDQgMDg6MTA6MjggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChkZW1hbmdsZSk6IFVzZSAke3NyY2Rpcn0gbm90ICReLgotCi0JKiBzdHJ0b2QuYzogTmV3IGZpbGUsIG5lZWRlZCBhdCBsZWFzdCBmb3IgQlNEIDQuMy4KLQotU3VuIE1heSAgMiAxMTozMDo0MiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmMgKHN5c19zaWdsaXN0KTogIEZvciBBTlNJIGNvbXBpbGF0aW9ucywgdHlwZSBpcwotCSJjb25zdCBjaGFyICpjb25zdCIuICBBbHNvIHJlbW92ZSBjb25kaXRpb25hbGl6YXRpb24gb24gX19TVERDX18KLQlzaW5jZSBjb25zdCBpcyBkZWZpbmVkIGF3YXkgZm9yIG5vbi1BTlNJLgotCi1XZWQgQXByIDI4IDE5OjI5OjU1IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IFJlY29nbml6ZSAqLSotaHB1eC4KLQkqIGNvbmZpZy9taC1ocHV4OiBOZXcgZmlsZS4KLQotVHVlIEFwciAyNyAxNToyMjoxOSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogdG1wbmFtLmM6ICBBZGRlZCBBTlNJIHRtcG5hbSgpIGZ1bmN0aW9uLgotCSogZnVuY3Rpb25zLmRlZiwgTWFrZWZpbGUuaW46ICBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLVR1ZSBBcHIgMjcgMTM6Mzg6MzggMTk5MyAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSk6IEdldCB0aGUgZGVtYW5nbGluZyBvZgotCXN0b3BfXzFBIHJpZ2h0LgotCi1GcmkgQXByIDE2IDIzOjQ4OjI0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjYWx2aW4pCi0KLQkqIGNwbHVzLWRlbS5jOiBEZWNsYXJlIHN0cnN0ciByZXR1cm4gdHlwZS4KLQotRnJpIE1hciAyNiAxMjowMToyNiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogc3Ryc2lnbmFsLmM6IEFkZCBzb21lIEFJWCBzaWduYWxzLgotCi1UaHUgTWFyIDI1IDE1OjE3OjIzIDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKE1BS0VPVkVSUklERVMpOiBEZWZpbmUgdG8gYmUgZW1wdHkuCi0KLVdlZCBNYXIgMjQgMDE6NTk6MjUgMTk5MyAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IHBvc2VpZG9uLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgaW5zdGFsbGNoZWNrICYgZHZpIHRhcmdldHMKLQotVGh1IE1hciAxOCAxNDowNTo0NCAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGllZWUtZmxvYXQuYzogIE5ldyBmaWxlLCBtb3ZlZCBmcm9tIC4uL2dkYiAoc2luY2UgaXQgaXMKLQluZWVkZWQgYnkgLi4vb3Bjb2RlL202OGstZGlzLmMpLgotCi1UdWUgTWFyICAyIDE3OjQ3OjMxIDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogIFJlcGxhY2UgYWxsIHJlZmVyZW5jZXMgdG8gY2Zyb250IHdpdGggQVJNLgotCi1GcmkgRmViIDI2IDAwOjE3OjA3IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmM6ICBGaXggbWFpbiBwcm9ncmFtICh3aGVuIGNvbXBpbGVkIHdpdGggLURNQUlOKQotCXRvIGJlIG1vcmUgdXNlZnVsIGFzIGEgZmlsdGVyLgotCi1TYXQgRmViIDIwIDIxOjQxOjM5IDE5OTMgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGxpc2EuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKGluc3RhbGxfdG9fbGliZGlyLCBpbnN0YWxsX3RvX3Rvb2xkaXIpOiBHbyBpbnRvIHRoZQotCWRlc3RpbmF0aW9uIGRpcmVjdG9yeSBiZWZvcmUgcnVubmluZyAkKFJBTkxJQiksIGluIGNhc2UgdGhhdAotCXByb2dyYW0gdHJpZXMgdG8gY3JlYXRlIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgcGFydCBvZgotCWl0cyB3b3JrLgotCi1UaHUgRmViIDE4IDIzOjAwOjE5IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYyAoc3lzX3NpZ2xpc3QpOiAgUmVtb3ZlIHlldCBhbm90aGVyIColXiYlJiQjICJjb25zdCIKLQliZWNhdXNlIEJTRCA0LjQgbGFja3Mgb25lLiAgSXNuJ3QgdGhpcyBmdW4/Ci0KLVRodSBGZWIgMTggMTE6MjQ6MjUgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiAgU2V0IGZ1bmNfZG9uZSBhZnRlcgotCWRlbWFuZ2xpbmcgYSB0ZW1wbGF0ZS4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV90ZW1wbGF0ZSk6ICBGaXggc2V2ZXJhbCBzbWFsbCBidWdzCi0JaW4gZGVtYW5nbGluZyBHTlUgc3R5bGUgdGVtcGxhdGVzLgotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3ByZWZpeCk6ICBGaXggZm9yIHRlbXBsYXRlcyBpbiBHTlUKLQlzdHlsZSBjb25zdHJ1Y3RvcnMuCi0JKiBjcGx1cy1kZW0uYyAoZ251X3NwZWNpYWwpOiAgRml4IGZvciB0ZW1wbGF0ZXMgaW4gR05VIHN0eWxlCi0Jc3RhdGljIGRhdGEgbWVtYmVycy4KLQotVHVlIEZlYiAxNiAxNzoyODozNSAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY3BsdXMtZGVtLmMgKGRlbWFuZ2xlX3NpZ25hdHVyZSk6ICBNb2RpZnkgdG8gaW5jbHVkZSB0eXBlCi0JbW9kaWZpZXJzIGxpa2Ugc3RhdGljIGFuZCBjb25zdCBpbiByZW1lbWJlcmVkIHR5cGVzLgotCi1UaHUgRmViIDExIDIyOjIwOjQ3IDE5OTMgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVkX3F1YWxpZmllZCk6ICBBZGQgbmV3IHBhcmFtZXRlciB0aGF0IHRlbGxzCi0Jd2hldGhlciB0byBwcmVwZW5kIG9yIGFwcGVuZCB0aGUgcXVhbGlmaWVycy4KLQkqIGNwbHVzLWRlbS5jIChzdHJpbmdfcHJlcGVuZHMpOiAgVXNlZCBub3csIHJlbW92ZSAjaWYgMC4KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9zaWduYXR1cmUpOiAgQ2FsbCBkZW1hbmdsZV9xdWFsaWZpZWQKLQl3aXRoIHByZXBlbmRpbmcuCi0JKiBjcGx1c19kZW0uYyAoZ251X3NwZWNpYWwpOiAgUmVjb2duaXplIHN0YXRpYyBkYXRhIG1lbWJlcnMgdGhhdAotCXVzZSBxdWFsaWZpZWQgbmFtZXMuCi0JKiBjcGx1cy1kZW0uYyAoZGVtYW5nbGVfcXVhbGlmaWVkKTogIEFjY3VtdWxhdGUgcXVhbGlmaWVycyBpbiBhCi0JdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgdGhlIHByZXBlbmQgb3IgYXBwZW5kIHRoZW0gdG8gdGhlIHJlc3VsdCwKLQlhcyBzcGVjaWZpZWQgYnkgdGhlIG5ldyAiYXBwZW5kIiBmbGFnLgotCSogY3BsdXMtZGVtLmMgKGRvX3R5cGUpOiAgQ2FsbCBkZW1hbmdsZWRfcXVhbGlmaWVkIHdpdGgKLQlhcHBlbmRpbmcuCi0KLU1vbiBEZWMgMjggMTA6NDc6MTkgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIHN0cnNpZ25hbC5jIChzaWduYWxfdGFibGUpOiBOb3cgY29uc3QuCi0JKGluaXRfc2lnbmFsX3RhYmxlcyk6IFZhcmlhYmxlIGVpcCBub3cgcG9pbnRzIHRvIGNvbnN0LgotCi0JKiBzdHJlcnJvci5jIChlcnJvcl90YWJsZSk6IE5vdyBjb25zdC4KLQkoaW5pdF9lcnJvcl90YWJsZXMpOiBWYXJpYWJsZSBlaXAgbm93IHBvaW50cyB0byBjb25zdC4KLQotVHVlIERlYyAxNSAxNTozNjo1MCAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAY3lnbnVzLmNvbSkKLQotCSogbWVtY2hyLmMgKG1lbWNocik6ICBOZXcgKEFOU0kgc3RhbmRhcmQpIGZ1bmN0aW9uLgotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWY6ICBBZGRlZCBtZW1jaHIuCi0JKiBNYWtlZmlsZS5pbiAoQVJfRkxBR1MpOiBVc2UgcmMgaW5zdGFkIG9mIG5vbi1zdGFuZGFyZCBjcS4KLQotV2VkIERlYyAgMiAyMjo0OToxMCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiByZW1vdmUgdXNlIG9mIFVTRyBhcm91bmQgPGFsbG9jYS5oPiwgd2hpY2ggbmV2ZXIgbWVhbnQKLQlhbnl0aGluZyBhbnl3YXkKLQotCSogY29uZmlnL21oLXthaXgsYXBvbGxvNjgsbmNyMzAwMCxzeXN2LHN5c3Y0fTogcmVtb3ZlZCBkZWZpbml0aW9ucwotCW9mIFVTRyBhbmQgVVNHcjQKLQotVGh1IE5vdiAxOSAwMzowOTozMyAxOTkyICBCcmVuZGFuIEtlaG9lICAoYnJlbmRhbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jIChkZW1hbmdsZV9mdW5kX3R5cGUpOiBSZWNvZ25pemUgYHcnLCBhIHdpZGUgY2hhcmFjdGVyOwotCWl0J3Mgbm93IGEgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIEFOU0kgWDNKMTYgd29ya2luZyBwYXBlcjsgb3V0cHV0Ci0JIndjaGFyX3QiIGZvciBpdC4KLQkoZGVtYW5nbGVfdGVtcGxhdGUpOiBBY2NlcHQgYHcnIGFzIGFuIGludGVncmFsIHR5cGUuCi0JKHhtYWxsb2MsIHhyZWFsbG9jKTogVXNlIGBjaGFyIConLCBub3QgYFBUUicuICBDYXN0IGNhbGxzIHRvIHRoZWlyCi0JY291bnRlcnBhcnRzIG1hbGxvYyBhbmQgcmVhbGxvYyB0byBgY2hhciAqJy4KLQkobWFpbik6IEV4aXQgd2l0aCBhIDAgc3RhdHVzLgotCSogTWFrZWZpbGUuaW4gKGRlbWFuZ2xlKTogRG9uJ3QgZXhwZWN0IHRoZSB1c2VyIHRvIGRlZmluZQotCURFTUFOR0xFLCBpbnN0ZWFkIGZvcmNlIHRvIGJlIGNwbHVzLWRlbS5jLiAgTG9vayBpbiAkKHNyY2RpcikvLi4vaW5jbHVkZQotCWZvciBkZW1hbmdsZS5oLiAgUGFzcyBpdCBhbnkgSERFRklORVMgb3IgWFRSQUZMQUdTLgotCi1XZWQgTm92IDE4IDE4OjU2OjIwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQVJfRkxBR1MpOiAgQXZvaWQgdmVyYm9zaXR5LgotCSogY29uZmlnL21oLXN5c3Y0OiAgUmVtb3ZlIEFSX0ZMQUdTIG92ZXJyaWRlLCB1c2UgSU5TVEFMTD1jcCwKLQlyZXBsYWNlIFVTR3I0IHdpdGggSEFWRV9TWVNDT05GLgotCSogY29uZmlnL21oLXNvbGFyaXM6ICBSZW1vdmU7IG1oLXN5c3Y0IHdvcmtzIG5vdy4KLQkqIGdldHBhZ2VzaXplLmM6ICBSZXBsYWNlIFVTR3I0IHdpdGggSEFWRV9TWVNDT05GLgotCSogY29uZmlndXJlLmluOiAgU2ltcGxpZnkgaG9zdCBtYXRjaGluZyB0YWJsZSwgcmVtb3ZlIHNlcGFyYXRlCi0Jc29sYXJpcyBjb25maWcgZmlsZS4KLQotU3VuIE5vdiAxNSAwOTozNToxNiAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChpWzM0XTg2LSotc29sYXJpczIqKTogIEFkZCwgdXNlIG1oLXN5c3Y0LgotCi1UdWUgTm92ICAzIDIxOjI3OjAzIDE5OTIgIEJyZW5kYW4gS2Vob2UgIChicmVuZGFuQGN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jICh4bWFsbG9jLCB4cmVhbGxvYyk6IEFkZCBkZWNscy4KLQkocmVtZW1iZXJfdHlwZSk6IERvbid0IGNhc3QgeG1hbGxvYy4KLQkoc3RyaW5nX25lZWQpOiBMaWtld2lzZTsgZG9uJ3QgY2FzdCB4cmVhbGxvYyBlaXRoZXIuCi0KLUZyaSBPY3QgMjMgMDg6NTI6MDEgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgZnVuY3Rpb25zLmRlZnMsIHJlbmFtZS5jOiBhZGRlZCBzaW1wbGUKLQlpbXBsZW1lbnRhdGlvbiBvZiByZW5hbWUsIHNpbmNlIHNvbWUgYmludXRpbHMgcHJvZ3JhbXMgdXNlIGl0LgotCi1UaHUgT2N0IDE1IDE1OjE4OjIyIDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBzdHJzaWduYWwuYzogIEFkZCBhcHByb3ByaWF0ZSAnY29uc3QnIHRvIHN5c19zaWdsaXN0Ci0JZXh0ZXJuIGRlY2xhcmF0aW9uIChpZiBfX1NURENfXykuICAoTmVlZGVkIGZvciBMaW51eC4pCi0JKiBzdHJzaWduYWwuYyAoc3Ryc2lnbmFsKTogQWRkIGNhc3QgdG8gcmVtb3ZlIGNvbnN0LW5lc3MuCi0KLUZyaSBPY3QgIDkgMDM6MjI6NTUgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChuZWVkZWQuYXdrLCBuZWVkZWQyLmF3ayk6ICBSZW1vdmUgZXJyb25lb3VzIFwncwotCWJlZm9yZSAiJ3MsIGRpYWdub3NlZCBieSBCU0QgNC40IGF3ay4KLQotVGh1IE9jdCAgOCAxNToyNToxMiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBjcmVhdGUgY29uZmlnLmggYW5kIG5lZWRlZC1saXN0IHRocm91Z2ggJChDT05GSUdfSCkKLQlhbmQgJChORUVERURfTElTVCksIHRvIGdpdmUgc29tZSBob29rcyBmb3IgeGliZXJ0eS4KLQotVGh1IE9jdCAgMSAyMzozMTo0MiAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIGNwdS12ZW5kb3ItdHJpcGxlIGluc3RlYWQgb2YgbmVzdGVkIGNhc2VzCi0KLVdlZCBTZXAgMzAgMTE6MjY6NTkgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgYXJndi5jLCBiYXNlbmFtZS5jLCBiY21wLmMsIGJjb3B5LmMsIGJ6ZXJvLmMsCi0JY29uY2F0LmMsIGNwbHVzLWRlbS5jLCBmZG1hdGNoLmMsIGdldGN3ZC5jLCBnZXRvcHQuYywgZ2V0b3B0MS5jLAotCWdldHBhZ2VzaXplLmMsIGluc3F1ZS5jLCBtZW1jbXAuYywgbWVtY3B5LmMsIG1lbW1vdmUuYywgbWVtc2V0LmMsCi0Jb2JzdGFjay5jLCBzaWdzZXRtYXNrLmMsIHNwYWNlcy5jLCBzdHJjaHIuYywgc3RyZXJyb3IuYywKLQlzdHJyY2hyLmMsIHN0cnNpZ25hbC5jLCBzdHJzdHIuYywgdmZvcmsuYywgdnNwcmludGYuYzoKLQlDb252ZXJ0IGZyb20gdXNpbmcgR1BMIHRvIExHUEwuCi0KLVNhdCBTZXAgMjYgMDQ6MDE6MzAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChlcnJvcnMpOiAgTGVhdmUgZHVtbXkubyBhbmQgZHVtbXkgYXJvdW5kIHNvIHRoYXQKLQl3ZSBjYW4gc2VlIGhvdyB0aGUgbmVlZGVkIGxpc3Qgd2FzIGdlbmVyYXRlZCAoaXQncyBzb21ldGltZXMgd3JvbmcpLgotCShtb3N0bHljbGVhbik6ICBSZW1vdmUgdGhlbS4KLQotTW9uIFNlcCAyMSAxNDo1MDo0MiAxOTkyICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIGdldGN3ZC5jOiBzdXBwbHkgYSBkZWZhdWx0IGlmIE1BWFBBVEhMRU4gaXMgbm90IGRlZmluZWQuCi0KLQkqIGNvbmZpZy9taC1pcml4NDogc2V0IEVYVFJBX09GSUxFUyB0byBhbGxvY2EubywgZnJvbSBXUlMuCi0KLVdlZCBTZXAgIDkgMTI6NDE6NDggMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVXNlIFhUUkFGTEFHUyB3aGVuIGNvbXBpbGluZywgc28gdGhhdCB4aWJlcnR5IHdvcmtzCi0Jd2hlbiBjcm9zcy1jb21waWxpbmcuCi0KLVRodSBTZXAgIDMgMTM6Mjk6MzkgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHNlbmRhaS5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogKGRlbWFuZ2xlX3ByZWZpeCk6IHJlZHVjdGlvbiBpbiBzdHJlbmd0aCBvZiBzdHJzdHIKLQkgIGFzIGEgdGltZSBvcHRpbWl6YXRpb24uCi0KLQkqIGNwbHVzLWRlbS5jIChjcGx1c19kZW1hbmdsZSk6IHJlbW92ZSBzdHJwYnJrIHRlc3QuICBBcHBlYXJzIHRvCi0JICBiZSBtb3JlIGV4cGVuc2l2ZSB0aGFuIHNpbXBseSBkZW1hbmdsaW5nLgotCi0JKiBjcGx1cy1kZW0uYyAoY3BsdXNfbWF0Y2gpOiBuZXcgZnVuY3Rpb24uCi0KLVR1ZSBTZXAgIDEgMTU6MjQ6MDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBjcGx1cy1kZW0uYzogICNpbmNsdWRlIDxzdGRpby5oPiwgdG8gZGVmaW5lIE5VTEwuCi0JRGVmaW5lIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZS4KLQotU3VuIEF1ZyAzMCAxNzo1ODoxOSAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNwbHVzLWRlbS5jOiAgTmV3IGZpbGUsIG1vdmVkIGZyb20gLi4vZ2RiLgotCSogY3BsdXMtZGVtLmMgKHNldF9jcGx1c19tYXJrZXJfZm9yX2RlbWFuZ2xpbmcpOiAgTmV3IGV4cG9ydGVkCi0JZnVuY3Rpb24sIHRvIGF2b2lkIGNvbXBpbGluZyBpbiB0YXJnZXQtZGVwZW5kZW5jeSBmb3IgQ1BMVVNfTUFSS0VSLgotCSogY3BsdXMtZGVtLmMgKGNwbHVzX2RlbWFuZ2xlKTogIEFsbG93IGRlbWFuZ2xpbmcgc3R5bGUgb3B0aW9uCi0JdG8gYmUgcGFzc2VkIGFzIGEgcGFyYW1ldGVyLCBidXQgdXNpbmcgdGhlIGdsb2JhbCB2YXJpYWJsZQotCWN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSBhcyBhIGRlZmF1bHQuCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBmb3IgY3BsdXMtZGVtLmMKLQotU2F0IEF1ZyAyOSAxMDo0NDowOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jOiAgTWVyZ2UgaW4gY29tbWVudCBjaGFuZ2VzIGZyb20gRlNGIHZlcnNpb24uICBOb3cKLQltYXRjaGVzIHRoZSBGU0YgdmVyc2lvbiBleGFjdGx5LgotCi1GcmkgQXVnIDI4IDE4OjM5OjA4IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMgKENBTExfRlJFRUZVTik6ICBDYW4ndCB1c2UgPzogd2l0aCB2b2lkIHZhbHVlcyAoYXQKLQlsZWFzdCBvbiBsb3NpbmcgREVDc3RhdGlvbnMhKTsgdXNlIGlmLXRoZW4tZWxzZSBpbnN0ZWFkLgotCi1XZWQgQXVnIDE5IDE0OjQwOjM0IDE5OTIgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFsd2F5cyBjcmVhdGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLgotCi1Nb24gQXVnIDEwIDE3OjMzOjQwIDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotICAgICAgICogTWFrZWZpbGUuaW46IGNsZWFuIHVwIGRlZmluaXRpb24gb2YgQ0ZJTEVTLCBtb3JlIGNvbW1lbnRzCi0KLVNhdCBBdWcgIDggMjM6MTA6NTkgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jIChteV9pbmRleCk6ICBNYWtlIGZpcnN0IGFyZyBjb25zdCB0byBtYXRjaCBzdHJjaHIsCi0Jd2hpY2ggaXQgc29tZXRpbWVzIGlzIHJlbWFwcGVkIHRvLgotCi1TYXQgQXVnICAxIDEzOjQ4OjUwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBvYnN0YWNrLmMgKERFRkFVTFRfQUxJR05NRU5UKTogIFVwZGF0ZSB0byBtYXRjaCBGU0YgdmVyc2lvbi4KLQkqIG9ic3RhY2suYyAoX29ic3RhY2tfYmVnaW4pOiAgSW5pdGlhbGl6ZSB1c2VfZXh0cmFfYXJnLgotCSogb2JzdGFjay5jIChfb2JzdGFja19iZWdpbl8xKTogIE5ldywgZnJvbSBGU0YgdmVyc2lvbi4KLQotTW9uIEp1bCAyMCAyMTowNzo1OCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChDQUxMX0NIRUNLRlVOLCBDQUxMX0ZSRUVGVU4pOiAgVXNlIHVzZV9leHRyYV9hcmcgYW5kCi0JZXh0cmFfYXJnLgotCSogb2JzdGFjay5jIChfb2JzdGFja19iZWdpbik6ICBSZW1vdmUgYXJlYV9pZCBhbmQgZmxhZ3MgYXJndW1lbnRzCi0JKHByZXZpb3VzbHkgYWRkZWQgZm9yIG1tYWxsb2Mgc3VwcG9ydCwgaW50ZXJmYWNlIGhhcyBjaGFuZ2VkKS4KLQlBbHNvIGNvbnZlcnQgZmxhZ3MgdXNhZ2UgdG8gdXNlIHVzZV9leHRyYV9hcmcgYW5kIG1heWJlX2VtcHR5X29iamVjdC4KLQotRnJpIEp1bCAxMCAwMDo0MTo1MyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgTW92ZSBleHBhbmRhcmd2IGlubGluZSBhbmQgZWxpbWluYXRlIHN0YXRpYyB2YXJpYWJsZXMuCi0JUmV3cml0ZSB0byBhbHdheXMgYWxsb2NhdGUgaW4gcG93ZXJzIG9mIHR3by4gIEZpeCB0byByZXR1cm4gYW4KLQlhcmd2IHdpdGggYSBzaW5nbGUgbnVsbCBzdHJpbmcgYXJnIGlmIHBhc3NlZCBhIG51bGwgc3RyaW5nLgotCi1GcmkgSnVsICAzIDIwOjI3OjI5IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiByYW5kb20uYywgc2lnc2V0bWFzay5jLCBzdHJlcnJvci5jLCBzdHJzaWduYWwuYzogIFJlbW92ZQotCSIodm9pZCkiIGNhc3RzIGZyb20gZnVuY3Rpb24gY2FsbHMgd2hlcmUgdGhlIHJldHVybiB2YWx1ZSBpcwotCWlnbm9yZWQsIGluIGFjY29yZGFuY2Ugd2l0aCBHTlUgY29kaW5nIHN0YW5kYXJkcy4KLQotTW9uIEp1biAyOSAxMDo1NDoxOSAxOTkyICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogYmNvcHkuYywgc3RyZXJyb3IuYywgc3Ryc2lnbmFsLmM6ICBMaW50LgotCi1UaHUgSnVuIDI1IDA5OjE4OjQxIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6IG1lcmdlIGNoYW5nZXMgZnJvbSBtYWtlLgotCi1UaHUgSnVuIDI1IDA0OjQzOjIyIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBhbGxvY2EuYzogIEluY29ycG9yYXRlIGZpeGVzIGZyb20gZ2RiL2FsbG9jYS5jLgotCUZJWE1FOiAgRXZlbnR1YWxseSBtb3ZlIGdkYidzIGFsbG9jYSBjb25maWd1cmF0aW9uIGZpbGVzIGhlcmUsCi0JYW5kIHJlbW92ZSBnZGIvYWxsb2NhLmMgYW5kIGl0cyBNYWtlZmlsZS5pbiBzdXBwb3J0LgotCi1UdWUgSnVuIDIzIDIxOjU2OjMwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBkdW1teS5jOiAgRGVmaW5lIE5PVEhJTkcgdG8gLypub3RoaW5nKi8sIGNoYW5nZSByZXR1cm4gdHlwZQotCW9mIG1haW4gdG8gaW50IGFuZCByZXR1cm4gemVyby4KLQkqIGZ1bmN0aW9ucy5kZWY6ICBTdXBwbHkgTk9USElORyBhcyB0aGUgZm91cnRoIGFyZyB0byBtYWNyb3MKLQl0aGF0IGRvbid0IGhhdmUgYW4gZXhwbGljaXQgYXJnLCB0byBzYXRpc2Z5IHBpY2t5IHByZXByb2Nlc3NvcnMuCi0KLVdlZCBKdW4gMTcgMTg6MTM6NTggMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIENsZWFuIHVwICpjbGVhbiBydWxlcywgYXMgcGVyIHN0YW5kYXJkcy50ZXhpLgotCi1UdWUgSnVuIDE2IDE2OjExOjU5IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBydGwuY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmMsIGdldG9wdDEuYzogbWVyZ2VkIGxhcmdlbHkgZ3JhdHVpdG91cywgbW9zdGx5Ci0JICB3aGl0ZXNwYWNlIGRpZmZzIGZyb20gb3RoZXIgcHJlcCBkaXN0cmlidXRpb25zLgotCi1Nb24gSnVuIDE1IDEyOjI1OjQ2IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoSU5TVEFMTCk6ICBEb24ndCB1c2UgL3Vzci91Y2IvaW5zdGFsbCwKLQlpdCBpcyBicm9rZW4gb24gbmNyIDMwMDAncy4KLQotTW9uIEp1biAxNSAwMTowMzoyNiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogc2lnc2V0bWFzay5jOiAgUmV3cml0ZS4gIE9sZCBvbmUgd2FzIHZlcnkgY29uZnVzZWQgYWJvdXQgaXRzCi0JYXJndW1lbnRzIGFuZCByZXN1bHQuICBOZXcgb25lIGNhbid0IGRvIG11Y2gsIGJ1dCBhdCBsZWFzdCBrbm93cwotCXdoYXQgaXQgY2FuJ3QgZG8sIGFuZCBpdCdzIGdvb2QgZW5vdWdoIGZvciBHREIncyB1c2UuCi0KLVN1biBKdW4gMTQgMTU6MTc6NDAgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogZnVuY3Rpb25zLmRlZjogIFVzZSBwcm9wZXIgcHJvdG90eXBlIGZvciBzdHJ0b3VsLgotCi1GcmkgSnVuIDEyIDE5OjIyOjQwIDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCByYW5kb20uYy4KLQkqIGNvbmZpZy9taC0qOiAgVXNlICJ0cnVlIiByYXRoZXIgdGhhbiAiZWNobyA+L2Rldi9udWxsIiBmb3IgcmFubGliLgotCSogY29uZmlndXJlLmluOiAgdXBkYXRlIHNvbGFyaXMyIGNvbmZpZy4KLQotV2VkIEp1biAxMCAxNjozMToyOSAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogcmFuZG9tLmM6ICBBZGQgZm9yIHJhbmRvbSgpIGFuZCBzcmFuZG9tKCkuCi0JKiBmdW5jdGlvbnMuZGVmOiAgQWRkIHJhbmRvbQotCi1UdWUgSnVuICA5IDE3OjI3OjE4IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcve21oLW5jcjMwMDAsIG1oLXN5c3Y0fTogIEFkZCBkZWZpbml0aW9uIGZvciBJTlNUQUxMCi0JdXNpbmcgL3Vzci91Y2IvaW5zdGFsbC4KLQotTW9uIEp1biAgMSAxMzoyMDoxNyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHN0cmVycm9yLmM6ICBLbHVkZ2UgdG8gZ3VhcmQgYWdhaW5zdCBhIGNvbmZsaWN0IHdpdGgKLQlwb3NzaWJsZSBkZWNsYXJhdGlvbiBvZiBzeXNfZXJybGlzdCBpbiBlcnJuby5oLgotCi1TdW4gTWF5IDMxIDE1OjA3OjQ3IDE5OTIgIE1hcmsgRWljaGluICAoZWljaGluIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiwgY29uZmlnL21oLXNvbGFyaXM6IGFkZCBzb2xhcmlzMiBjb25maWcgc3VwcG9ydC4KLQotRnJpIE1heSAyOSAxNzoyMzoyMyAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIHNpZ3NldG1hc2suYzogICNpZmRlZiBvdXQgc2lnc2V0bWFzayBpZiBTSUdfU0VUTUFTSwotCWlzIG5vdCBkZWZpbmVkIChzaG91bGQgYmUgZGVmaW5lZCBpbiBzaWduYWwuaCwgc2F5cyBQb3NpeC4pLgotCi1Nb24gTWF5IDE4IDE3OjM1OjA0IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBnZXRvcHQuYzogbWVyZ2VkIGNoYW5nZXMgZnJvbSBtYWtlLTMuNjIuMTEuCi0KLUZyaSBNYXkgIDggMTQ6NTM6MDcgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIGdldG9wdC5jOiBtZXJnZWQgY2hhbmdlcyBmcm9tIGJpc29uLTEuMTguCi0KLVR1ZSBNYXkgIDUgMTE6NTE6NDAgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIERvbid0IGhhdmUgJChFWFRSQV9PRklMRVMpIGRlcGVuZCBvbiBjb25maWcuaCwKLQlzaW5jZSB0aGF0IGludHJvZHVjZXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5LgotCSgkKEVYVFJBX09GSUxFUykgYXJlIHVzZWQgdG8gYnVpbGQgY29uZmlnLmguKQotCi0JKiBzdHJ0b3VsLmM6ICBGaXhlcyB0byBoYW5kbGUgbm9uLWRlY2ltYWwgYmFzZXMgYmV0dGVyLgotCi1XZWQgQXByIDIyIDA5OjI3OjUxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtbmNyMzAwMDogIFJlcGxhY2UgTUlOVVNfRyB3aXRoIENGTEFHUy4KLQkqIE1ha2VmaWxlLmRvczogIEZpbmlzaCBNSU5VU19HIGVyYWRpY2F0aW9uLgotCSogTWFrZWZpbGUuaW4gKENGSUxFUyk6ICBBZGQgc3Ryc2lnbmFsLmMuCi0JKiBNYWtlZmlsZS5pbiAoUkVRVUlSRURfT0ZJTEVTKTogIEFkZCBzdHJlcnJvci5vIHN0cnNpZ25hbC5vCi0JKiBNYWtlZmlsZS5pbiAobmVlZGVkLWxpc3QpOiAgU3BsaXQgY3JlYXRpb24gb2YgZXJyb3JzIGZpbGUgdG8KLQlzZXBhcmF0ZSBtYWtlIHRhcmdldC4KLQkqIE1ha2VmaWxlLmluIChjb25maWcuaCwgbmVlZGVkMi5hd2ssIGVycm9ycyk6ICBOZXcgdGFyZ2V0cy4KLQkqIE1ha2VmaWxlLmluIChjbGVhbik6ICBTcGxpdCB0byBtdWx0aXBsZSBsaW5lcywgYWRkIG5lZWRlZDIuYXdrCi0JYW5kIGNvbmZpZy5oLgotCSogZHVtbXkuYyAoREVGRlVOQywgREVGVkFSKTogIEFkZCBkZWZpbmVzIGFuZCB1bmRlZnMuCi0JKiBmdW5jdGlvbnMuZGVmIChzdHJlcnJvcik6ICBSZW1vdmUgZnJvbSBvcHRpb25hbCBsaXN0LgotCSogZnVuY3Rpb25zLmRlZiAoc3lzX25lcnIsIHN5c19lcnJsaXN0LCBzeXNfc2lnbGlzdCk6ICBERUZWQVIncwotCSogZnVuY3Rpb25zLmRlZiAoc3RyZXJyb3IsIHBzaWduYWwpOiAgREVGRlVOQydzCi0JKiBzdHJlcnJvci5jOiAgUmV3cml0ZSBmcm9tIHNjcmF0Y2ggdG8gdXNlIHN5c19lcnJsaXN0IG9ubHkgaWYKLQlhdmFpbGFibGUsIGFkZCBlcnJub19tYXgoKSwgYWRkIHN0cmVycm5vKCksIGFkZCBzdHJ0b2Vycm5vKCksCi0JYWRkIHRlc3QgZHJpdmVyLgotCSogc3Ryc2lnbmFsLmM6ICBOZXcgZmlsZSwgc2lnbmFsIGVxdWl2YWxlbnQgdG8gc3RyZXJyb3IuYy4KLQlVc2VzIHN5c19zaWdsaXN0IGlmIGF2YWlsYWJsZSwgZGVmaW5lcyBzaWdub19tYXgoKSwgc3Ryc2lnbmFsKCksCi0Jc3Ryc2lnbm8oKSwgc3RydG9zaWdubygpLCBwc2lnbmFsKCksIGFuZCB0ZXN0IGRyaXZlci4KLQotTW9uIEFwciAyMCAyMDo0OTozMiAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGRvIG5vdCBwcmludCByZWN1cnNpb24gbGluZS4KLQotCSogTWFrZWZpbGUuaW46IGFsbG93IENGTEFHUyB0byBiZSBwYXNzZWQgaW4gZnJvbSBjb21tYW5kIGxpbmUuCi0JICBSZW1vdmVkIE1JTlVTX0cuICBEZWZhdWx0IENGTEFHUyB0byAtZy4KLQotTW9uIEFwciAyMCAxMjo1Nzo0NiAxOTkyICBQZXIgQm90aG5lciAgKGJvdGhuZXJAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1haXg6ICBOZXcuICBFWFRSQV9PRklMRVMgbGlzdHMgY29weXNpZ24ubywKLQlzbyBsaWJnKysgdXNlcnMgZG9uJ3QgaGF2ZSB0byBiZSBpbmNvbnZlbmllbmNlZCBieSBhCi0JbGliYy5hIGJ1ZyAobGliYy5hIG5lZWRzIGNvcHlzaWduLCBidXQgZG9lc24ndCBkZWZpbmUgaXQhKS4KLQkqIGNvbmZpZ3VyZS5pbjogIFVzZSBjb25maWcvbWgtYWl4LgotCSogc3RydG91bC5jOiAgSGFuZGxlICctJyBhcyByZXF1aXJlZCBieSBBTlNJLgotCUNsZWFuIHVwIHJhZGl4IGhhbmRsaW5nLgotCSogc3Ryc3RyLmM6ICBGaXggYnVnZ3kgYWxnb3JpdGhtLgotCSogTWFrZWZpbGUuaW46ICBDaGFuZ2Ugc28gdGhhdCAke0VYVFJBX09GSUxFU30gaXMKLQlhcHBlbmRlZCB0byBuZWVkZWQtbGlzdCAod2hpY2ggaXMgdXNlZCBieSBsaWJnKyspLgotCi1GcmkgQXByIDEwIDIyOjUxOjQxIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmV3IG5jcjMwMDAgY29uZmlnLgotCSogY29uZmlnL21oLW5jcjMwMDA6ICBOZXcgY29uZmlnIGZpbGUuCi0KLVdlZCBBcHIgIDEgMjM6MzE6NDMgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYywgZHVtbXkuYzogIExpbnQuCi0KLVR1ZSBNYXIgMzEgMTg6NDY6NDQgMTk5MiAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1zeXN2NDogIE5ldyBjb25maWcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdF9tYWtlZmlsZV9mcmFnKTogIFNldCB0byBjb25maWcvbWgtc3lzdjQgZm9yCi0JaG9zdF9vcyA9PSBzeXN2NC4KLQkqIGdldHBhZ2VzaXplLmM6ICBGb3IgU1ZSNCwgdXNlIHN5c2NvbmYoX1NDX1BBR0VTSVpFKSB0byBnZXQKLQlwYWdlc2l6ZS4KLQotU3VuIE1hciAyOSAxMjoyNjo0MiAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmM6ICBMaW50LgotCi1GcmkgTWFyIDI3IDA4OjMyOjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBmdW5jdGlvbnMuZGVmIChhbGxvY2EpOiAgRml4IHJldHVybiB0eXBlIGFuZCBhcmdzIHRvIGF2b2lkCi0JdHlwZSBjbGFzaCB3aXRoIGdjYydzIGJ1aWx0aW4gYWxsb2NhLgotCi1UdWUgTWFyIDI0IDIzOjMzOjQyIDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4sIGNvbmZpZy9taC1pcml4NDogaXJpeDQgc3VwcG9ydC4KLQotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWYsIGFsbG9jYS5jOiBhZGRlZCBhbGxvY2EuCi0KLVR1ZSBNYXIgMjQgMTc6MzQ6NDYgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jIChDQUxMX0ZSRUVGVU4pOiAgTWFrZSBpdCBjb21waWxlIG9uIERFQ3N0YXRpb25zLgotCi1UaHUgTWFyIDE5IDEzOjU3OjQyIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICBGaXggdmFyaW91cyBleHRlcm5hbCBmdW5jdGlvbiBkZWZpbml0aW9ucyB0byBiZQotCWNvcnJlY3QgaW4gYW4gQU5TSSBjb21waWxhdGlvbiBlbnZpcm9ubWVudC4KLQotU2F0IE1hciAxNCAxNzoyODoxNyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jOiAgQ2hhbmdlcyB0byBzdXBwb3J0IGNhbGxpbmcgbW1hbGxvYyBmdW5jdGlvbnMsCi0Jd2hpY2ggdGFrZSBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IG92ZXIgbWFsbG9jIGZ1bmN0aW9ucy4KLQotRnJpIE1hciAgNiAyMjowMToxMCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogYWRkZWQgY2hlY2sgdGFyZ2V0LgotCi1UaHUgRmViIDI3IDIyOjE5OjM5IDE5OTIgIFBlciBCb3RobmVyICAoYm90aG5lckBjeWdudXMuY29tKQotCi0JKiBhcmd2LmM6ICAjaW5jbHVkZSBhbGxvY2EtY29uZi5oIChuZWVkZWQgYnkgQUlYKS4KLQotV2VkIEZlYiAyNiAxODowNDo0MCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbjogcmVtb3ZlZCB0cmFjZXMgb2YgbmFtZXN1YmRpciwKLQkgIC1zdWJkaXJzLCAkKHN1YmRpciksICQodW5zdWJkaXIpLCBzb21lIHJjcyB0cmlnZ2Vycy4gIEZvcmNlZAotCSAgY29weXJpZ2h0cyB0byAnOTIsIGNoYW5nZWQgc29tZSBmcm9tIEN5Z251cyB0byBGU0YuCi0KLVNhdCBGZWIgMjIgMDE6MDk6MjEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogYXJndi5jOiAgQ2hlY2sgaW4gRnJlZCdzIHZlcnNpb24gd2hpY2ggZml4ZXMgcHJvYmxlbXMgd2l0aAotCWFsbG9jYSgpLgotCi1GcmkgRmViICA3IDIxOjQ2OjA4IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIG1ha2VmaWxlLmRvczogIFJlbW92ZSBOVUwgdG8ga2VlcCBwYXRjaCBmcm9tIGZhaWxpbmcuCi0KLVRodSBKYW4gMzAgMjI6NDg6NDEgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogZ2V0b3B0LmMgKF9nZXRvcHRfaW50ZXJuYWwpOiAgRml4IHVzYWdlIG9mIGVudW0gaGFzX2FyZy4KLQotTW9uIEphbiAyMCAxODo1MzoyMyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0gCSogZ2V0b3B0LmMsIGdldG9wdDEuYywgLi4vaW5jbHVkZS9nZXRvcHQuaDogIEdldCBsYXRlc3QgdmVyc2lvbnMuCi0KLVNhdCBKYW4gMTggMTY6NTM6MDEgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGFyZ3YuYzogIE5ldyBmaWxlIHRvIGJ1aWxkIGFuZCBkZXN0cm95IHN0YW5kYXJkIGFyZ3VtZW50Ci0JdmVjdG9ycyBmcm9tIGEgY29tbWFuZCBzdHJpbmcuCi0KLQkqIE1ha2VmaWxlLmluOiAgQWRkIGFyZ3YuYyBhbmQgYXJndi5vIHRvIGFwcHJvcHJpYXRlIG1hY3Jvcy4KLQotRnJpIERlYyAyMCAxMjoxMjo1NyAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4KLQotCSogcmluZGV4LmM6ICBEZWNsYXJlIHJldHVybiB0eXBlIG9mIGV4dGVybmFsbHkgdXNlZCBmdW5jdGlvbgotCXN0cnJjaHIoKS4KLQotVGh1IERlYyAxOSAxODozNTowMyAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBSZW1vdmUgIioqKiIgaW4gbm9ybWFsIG91dHB1dCwgc2luY2UgTWFrZSBwcm9kdWNlcwotCXRoaXMgb24gZXJyb3JzLCBhbmQgaXQncyBjb252ZW5pZW50IHRvIHNlYXJjaCBmb3IuCi0KLVR1ZSBEZWMgMTcgMjM6MjE6MzAgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIG1lbWNtcC5jLCBtZW1jcHkuYywgbWVtbW92ZS5jLCBtZW1zZXQuYywgc3RyY2hyLmMsIHN0cnJjaHIuYzoKLQlOZXcgQU5TSSBmdW5jdGlvbnMuICBUaGUgb2xkIG5vbi1BTlNJIGZ1bmN0aW9ucyAoc3VjaCBhcyBiY29weSkKLQlzaG91bGQgYmUgYXZvaWRlZC4KLQkqIGJjb3B5LmM6ICBGaXggdG8gY29ycmVjdGx5IGhhbmRsZSBvdmVybGFwcGluZyByZWdpb25zLgotCSogaW5kZXguYywgcmluZGV4LmM6ICBSZS13cml0ZSBpbiB0ZXJtcyBvZiBzdHJjaHIoKSBhbmQgc3RycmNocigpLgotCSogZnVuY3Rpb25zLmRlZjogIEFkZCB0aGUgbmV3IGZ1bmN0aW9ucy4KLQkqIGZ1bmN0aW9ucy5kZWY6ICBBZGQgNHRoIHBhcmFtZXRlciB0byBERUYgbWFjcm8sCi0JYW4gYW5zaWRlY2wuaC1zdHlsZSBwcm90b3R5cGUuCi0JKiBkdW1teS5jOiAgVXNlIGV4cGFuZGVkIERFRiBtYWNybyB0byBjcmVhdGUgYSBkdW1teSBmdW5jdGlvbgotCWNhbGwsIHdpdGggY29ycmVjdCBwYXJhbWV0ZXIgdHlwZXMuICAoVGhpcyBhdm9pZHMgc29tZQotCWNvbXBsYWludHMgZnJvbSBnY2MgYWJvdXQgcHJlZGVmaW5lZCBidWlsdGlucy4pCi0KLQlNb3ZlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGNvbmZpZy9taC1kZWZhdWx0IGludG8gTWFrZWZpbGUuaW4uCi0JVGhpcyBhdm9pZCBkdXBsaWNhdGlvbiwgYW5kIHNpbXBsaWZpZXMgdGhpbmdzIHNsaWdodGx5LgotCSogTWFrZWZpbGUuaW46ICBUd2VhayBzbyB3ZSBkb24ndCBuZWVkIGNvbmZpZy9taC1kZWZhdWx0LgotCSogUkVBRE1FOiAgVXBkYXRlLgotCSogY29uZmlndXJlLmluOiAgTm8gbG9uZ2VyIG5lZWQgY29uZmlnL21oLWRlZmF1bHQuCi0JKiBjb25maWcvbWgtZGVmYXVsdDogIERlbGV0ZWQuCi0JKiBjb25maWcvbWgtc3lzdjogIFJlbW92ZSBsaW5lcyBjb3BpZWQgZnJvbSBvbGQgbWgtZGVmYXVsdC4KLQotVHVlIERlYyAxNyAwNTo0Njo0NiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogZmRtYXRjaC5jIChmZG1hdGNoKTogIERvbid0IGNvbXBhcmUgc3RfcmRldiwgd2hpY2ggaXMgZm9yCi0JJ21rbm9kJyBkZXZpY2UgbnVtYmVycy4KLQotTW9uIERlYyAxNiAxMjoyNTozNCAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogZmRtYXRjaC5jLCBNYWtlZmlsZS5pbjogIEFkZCBuZXcgZnVuY3Rpb24gdGhhdCB0YWtlcyB0d28KLQlvcGVuIGZpbGUgZGVzY3JpcHRvcnMgYW5kIHJldHVybnMgbm9uemVybyBpZiB0aGV5IHJlZmVyIHRvCi0JdGhlIHNhbWUgZmlsZSwgemVybyBvdGhlcndpc2UuICAodXNlZCBpbiBnZGIpCi0KLVdlZCBEZWMgMTEgMTc6NDA6MzkgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWMgYXQgcnRsLmN5Z251cy5jb20pCi0JRnJvbSBESjoKLQkqIG1zZG9zLmM6IHN0dWIgZnVuY3Rpb25zIGZvciBkb3MuCi0JKiBtYWtlZmlsZS5kb3MsIGNvbmZpZ2RqLmJhdDogbmV3LgotCSogZ2V0b3B0LmM6IERvbid0IGluY2x1ZGUgYWxsb2NhLWNvbmYuaCBpbiBhIEdPMzIgd29ybGQuCi0KLQotVHVlIERlYyAxMCAwNDoxNDo0OSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotRnJpIERlYyAgNiAyMzoyNjo0NSAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgc3BhY2VzIGZvbGxvd2luZyBoeXBoZW5zIGJlY2F1c2UgYnNkIG1ha2UKLQkgIGNhbid0IGNvcGUuICBhZGRlZCBzdGFuZGFyZHMudGV4dCBzdXBwb3J0LiAgaW5zdGFsbCB1c2luZwotCSAgSU5TVEFMTF9EQVRBLgotCi0JKiBjb25maWd1cmUuaW46IHJlbW92ZSBjb21tb250YXJnZXRzIGFzIGl0IGlzIG5vIGxvbmdlciBhCi0JICByZWNvZ25pemVkIGhvb2suCi0KLVRodSBEZWMgIDUgMjI6NDY6NDYgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1GcmkgTm92IDIyIDE5OjE1OjI5IDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIGZpbmQtbmVlZGVkLmF3ayBkb2VzIG5vdCBmaXQgaW4gMTQgY2hhcnMuCi0KLQkqIE1ha2VmaWxlLmluOiAgU3VwcHJlc3MgZXJyb3IgY2hlY2tpbmcgd2hlbiBjb21waWxpbmcgdGhlIHRlc3QKLQlwcm9ncmFtLCBiZWNhdXNlIFVsdHJpeCBtYWtlL3NoIGFib3J0cyB0aGVyZSBkdWUgdG8gYSBidWcuCi0KLUZyaSBOb3YgMjIgMTI6MjM6MTcgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgUmUtZGlkIGhvdyBFWFRSQV9PRklMRVMgaXMgdXNlZCB0byBiZSBtb3JlIHVzZWZ1bC4KLQkqIFJFQURNRTogIEV4cGxhaW5lZCBob3cgdGhlIGF1dG8tY29uZmlndXJhdGlvbiB3b3JrcywKLQlhbmQgaG93IHRvIGFkZCBuZXcgZmlsZXMgYW5kL29yIGNvbmZpZ3VyYXRpb25zLgotCi1GcmkgTm92IDIyIDA5OjQ1OjIzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzdHJ0b3VsLmM6ICBBdm9pZCBkZWZpbmluZyBVTE9OR19NQVggaWYgYWxyZWFkeSBkZWZpbmVkOwotCWNhc3QgYSBjb25zdCBjaGFyICogdG8gY2hhciAqIGZvciBwZWRhbnRzLgotCi0JKiBnZXRvcHQuYzogIE9ubHkgZGVmaW5lICJjb25zdCIgYWZ0ZXIgbG9jYWwgaW5jbHVkZSBmaWxlcyBnZXQgdG8sCi0JYW5kIG9ubHkgaWYgdGhleSBoYXZlbid0IGRlZmluZWQgaXQuCi0KLVRodSBOb3YgMjEgMTY6NTg6NTMgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGdldGN3ZC5jIChyZW1vdmUgZ2V0d2QuYyk6IEdOVSBjb2RlIHNob3VsZCBjYWxsIGdldGN3ZCgpLiAgV2UKLQllbXVsYXRlIGl0IHdpdGggZ2V0d2QoKSBpZiBhdmFpbGFibGUuICBUaGlzIGF2b2lkcyBjYWxsZXJzIGhhdmluZwotCXRvIGZpbmQgYSBNQVhQQVRITEVOIG9yIFBBVEhfTUFYIHZhbHVlIGZyb20gc29tZXdoZXJlLgotCSogTWFrZWZpbGUuaW4sIGZ1bmN0aW9ucy5kZWY6ICBnZXR3ZC0+Z2V0Y3dkLgotCSogY29uZmlndXJlLmluOiAgVXNlIGdlbmVyaWMgY2FzZSBmb3IgZXZlcnkgc3lzdGVtLgotCSogY29uZmlnL21oLXtkZWx0YTg4LG1hY2gscnM2MDAwLHN2cjR9OiAgUmVtb3ZlLgotCSogY29uZmlnL21oLXN5c3Y6ICBVc2UgZGVmYXVsdCBoYW5kbGluZywganVzdCBhZGQgLURVU0cuCi0KLVRodSBOb3YgMTQgMTA6NTg6MDUgMTk5MSAgUGVyIEJvdGhuZXIgIChib3RobmVyIGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWcvbWgtZGVmYXVsdDogUmUtZG8gbWFrZSBtYWdpYwotCXNvIHRoYXQgZm9yIHRoZSBkZWZhdWx0ICgiYXV0b21hdGljIikgbW9kZSB3ZSBvbmx5Ci0JY29tcGlsZSB0aGUgZmlsZXMgd2UgYWN0dWFsbHkgbmVlZC4gIERvIHRoaXMgdXNpbmcKLQlhIHJlY3Vyc2l2ZSBtYWtlOiAgVGhlIHRvcC1sZXZlbCBnZW5lcmF0ZXMgdGhlIGxpc3QKLQlvZiBuZWVkZWQgZmlsZXMgKGxvb3NlbHksIHRoZSBvbmVzIG1pc3NpbmcgaW4gbGliYyksCi0JYW5kIHRoZW4gcGFzc2VzIHRoYXQgbGlzdCB0byB0aGUgcmVjdXJzaXZlIG1ha2UuCi0JKiBjb25maWcvbWgtbWFjaDogIFJlbW92ZSBvYnNvbGV0ZSBTVFJFUlJPUi17QyxPfSBtYWNyb3MuCi0KLVR1ZSBOb3YgMTIgMTk6MTA6NTcgMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQlSUy82MDAwIGhvc3Qgc3VwcG9ydCAoZ3J1bWJsZSkuCi0KLQkqIGNvbmZpZ3VyZS5pbjogIEJ1aWxkIGFsbG9jYS1jb25mLmggZmlsZSBmcm9tIGFsbG9jYS1ub3JtLmgKLQkoZXZlcnl0aGluZyBlbHNlKSBvciBhbGxvY2EtYm90Y2guaCAocnMvNjAwMCkuCi0JKiBNYWtlZmlsZS5pbjogIEluY2x1ZGUgLiBvbiB0aGUgaW5jbHVkZSBwYXRoLgotCSogZ2V0b3B0LmM6ICBVc2UgYWxsb2NhLWNvbmYuaC4KLQkqIGFsbG9jYS1ub3JtLmg6ICBIb3cgdG8gZGVjbGFyZSBhbGxvY2Egb24gcmVhc29uYWJsZSBtYWNoaW5lcy4KLQkqIGFsbG9jYS1ib3RjaC5oOiBIb3cgdG8gZGVjbGFyZSBhbGxvY2Egb24gYnJhaW5kZWFkIG1hY2hpbmVzLgotCi1UdWUgTm92IDEyIDA5OjIxOjQ4IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25jYXQuYyA6ICBOZXcgZmlsZSwgbGlrZSBjb25jYXQoKSBpbiBnZGIgYnV0IGNhbiB0YWtlIGEKLQl2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHJhdGhlciB0aGFuIGZpeGVkIGF0IDMgYXJncy4gIEZvcgotCW5vdywgY2xpZW50IGFwcGxpY2F0aW9ucyBtdXN0IHN1cHBseSBhbiB4bWFsbG9jKCksIHdoaWNoIGlzIGEKLQlmcm9udCBlbmQgZnVuY3Rpb24gdG8gbWFsbG9jKCkgdGhhdCBkZWFscyB3aXRoIG91dC1vZi1tZW1vcnkKLQljb25kaXRpb25zLgotCi0JKiBNYWtlZmlsZS5pbjogIEFkZCBjb25jYXQuYyBhbmQgY29uY2F0Lm8gdG8gYXBwcm9wcmlhdGUgbWFjcm9zLgotCi1TYXQgTm92ICA5IDEzOjI5OjU5IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtc3ZyNDogIEFkZCBzaWdzZXRtYXNrIHRvIGxpc3Qgb2YgcmVxdWlyZWQgZnVuY3Rpb25zLgotCi1TdW4gTm92ICAzIDExOjU3OjU2IDE5OTEgIFBlciBCb3RobmVyICAoYm90aG5lciBhdCBjeWdudXMuY29tKQotCi0JKiB2c3ByaW50Zi5jOiAgTmV3IGZpbGUuCi0JKiBmdW5jdGlvbnMuZGVmLCBNYWtlZmlsZS5pbjogIEFkZCB2c3ByaW50Zi4KLQotU3VuIE9jdCAyNyAxNjozMToyMiAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtcnM2MDAwOiAgQWRkIHJzLzYwMDAgaG9zdCBzdXBwb3J0LgotCSogTWFrZWZpbGUuaW46ICBDb21waWxlIHdpdGggZGVidWcgaW5mby4KLQotRnJpIE9jdCAyNSAxNzowMToxMiAxOTkxICBQZXIgQm90aG5lciAgKGJvdGhuZXIgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4sIGNvbmZpZ3VyZS5pbiwgYW5kIG5ldyBmaWxlczogZHVtbXkuYywgZnVuY3Rpb25zLmRlZiwKLQljb25maWcvbWYtZGVmYXVsdDogIEFkZGVkIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIG1vZGUsCi0Jd2hpY2ggaW5jbHVkZXMgaW50byBsaWJpYmVydHkuYSBmdW5jdGlvbnMgdGhhdCBhcmUgIm1pc3NpbmciIGluIGxpYmMuCi0JKiBzdHJkdXAuYywgdnByaW50Zi5jLCB2ZnByaW50Zi5jOiBOZXcgZmlsZXMuCi0KLVRodSBPY3QgMjQgMDI6Mjk6MjYgMTk5MSAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9obWFrZS1zdnI0OiBOZXcgZmlsZS4KLQotCSogY29uZmlnL2htYWtlLXN5c3Y6IEFkZCBIT1NUX0NGSUxFUyBhbmQgSE9TVF9PRklMRVMuCi0KLQkqIGJhc2VuYW1lLmMsIGJjbXAuYywgYmNvcHkuYywgYnplcm8uYywgZ2V0cGFnZXNpemUuYyBnZXR3ZC5jLAotCWluZGV4LmMsIGluc3F1ZS5jLCByaW5kZXguYywgc3BhY2VzLmMsIHN0cnN0ci5jLCB2Zm9yay5jOiBOZXcKLQlmaWxlcyBjb250YWluaW5nIGVpdGhlciBwb3J0YWJsZSBDIHZlcnNpb25zIG9yIGVtdWxhdGlvbnMgdXNpbmcKLQluYXRpdmUgbGlicmFyeSBjYWxscy4KLQotCSogc3RyZXJyb3IuYzogIEFkZCBjb3B5cmlnaHQsIGludGVybmFsIGRvY3VtZW50YXRpb24sIGV0Yy4KLQotCSogc3RydG9sLmM6ICBSZXBsYWNlIGhhcmR3aXJlZCBoZXggY29uc3RhbnRzIHdpdGggc29tZSBtb3JlCi0JcG9ydGFibGUgbWFjcm9zLiAgUmVtb3ZlIGlsbGVnYWwgKGFjY29yZGluZyB0byBnY2MpIGNhc3QuCi0KLQkqIHN0cnRvdWwuYzogUmVwbGFjZSBoYXJkd2lyZWQgaGV4IGNvbnN0YW50IHdpdGggbW9yZSBwb3J0YWJsZQotCW1hY3JvLgotCi0JKiBNYWtlZmlsZS5pbjogTW92ZSBUQVJHRVRMSUIgYW5kIENGTEFHUyB3aGVyZSBtYWtlZmlsZSBmcmFnbWVudHMKLQljYW4gb3ZlcnJpZGUgdGhlbS4gIEFkZCBuZXcgc291cmNlIGFuZCBvYmplY3QgZmlsZSBuYW1lcyB0byBDRklMRVMKLQlhbmQgT0ZJTEVTIHJlc3BlY3RpdmVseS4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3VwcG9ydCBmb3IgU1ZSNCBtYWtlZmlsZSBmcmFnbWVudHMuCi0KLVR1ZSBPY3QgMjIgMTk6MDA6MjMgMTk5MSAgU3RldmUgQ2hhbWJlcmxhaW4gIChzdGV2ZSBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogTW92ZSBSQU5MSUIsIEFSIGFuZCBBUl9GTEFHUyB0byB3aGVyZSB0aGV5IGNhbiBiZQotCW92ZXItcmlkZGVuIGJ5IGNvbmZpZy9obWFrZS0qCi0JKiBjb25maWd1cmUuaW46IGFkZGVkIG04OGtjdnMgdG8gc3lzdiBsaXN0Ci0KLUZyaSBPY3QgIDQgMDE6Mjk6MDggMTk5MSAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiAgTW9zdCBob3N0cyBuZWVkIHN0cmVycm9yLCBidXQgb25lIG9yIHR3byBkb24ndCwKLQlhbmQgdGhleSBvdmVycmlkZSB0aGVzZSBkZWZpbml0aW9ucyBpbiB0aGUgaG9zdC1kZXBlbmRlbnQgbWFrZWZpbGUKLQlmcmFnbWVudC4KLQkqIGNvbmZpZy9obWFrZS1tYWNoOiAgVGhlIG9kZCBtYW4gb3V0IG9uIHN0cmVycm9yIC0tIGl0J3Mgc3VwcGxpZWQuCi0JKiBzdHJlcnJvci5jOiAgTmV3IGZpbGUuCi0KLQkqIHN0cnRvbC5jLCBzdHJ0b3VsLmM6ICBBZGQgc3RydG9sIHRvIGxpYmliZXJ0eSwgc2luY2UgTWFjaCBsYWNrcwotCWl0IGFuZCBiZmQgdXNlcyBpdC4KLQkqIGNvbmZpZ3VyZS5pbiwgTWFrZWZpbGUuaW4sIGNvbmZpZy9obWFrZS1tYWNoOiAgT25seSBjb25maWd1cmUKLQlzdHJ0b2wgJiBzdHJvdG91bCBpbiBvbiBNYWNoLgotCi1UdWUgU2VwICAzIDA2OjM2OjIzIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdpbnQuY3lnbnVzLmNvbSkKLQotCSogb2JzdGFjay5jOiAgTWVyZ2Ugd2l0aCBsYXRlc3QgRlNGIHZlcnNpb24uCi0KLQwKLUxvY2FsIFZhcmlhYmxlczoKLXZlcnNpb24tY29udHJvbDogbmV2ZXIKLUVuZDoKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9NYWtlZmlsZS5pbiBiL2xpYmliZXJ0eS9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2ODliYS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvTWFrZWZpbGUuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotIwotIyBNYWtlZmlsZQotIyAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDE5OTgKLSMgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotIyBMaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0jIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotIyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIExpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSMgTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotIyB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0jIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotCi0jIFRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBLLiBSaWNoYXJkIFBpeGxleSA8cmljaEBjeWdudXMuY29tPi4KLQotIwotIyBNYWtlZmlsZSBmb3IgbGliaWJlcnR5IGRpcmVjdG9yeQotIwotCi1zcmNkaXIgPSBAc3JjZGlyQAotVlBBVEggPSBAc3JjZGlyQAotCi1wcmVmaXggPSBAcHJlZml4QAotCi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWJpbmRpciA9IEBiaW5kaXJACi1saWJkaXIgPSBAbGliZGlyQAotCi1TSEVMTCA9IEBTSEVMTEAKLQotIyBNdWx0aWxpYiBzdXBwb3J0IHZhcmlhYmxlcy4KLU1VTFRJU1JDVE9QID0KLU1VTFRJQlVJTERUT1AgPQotTVVMVElESVJTID0KLU1VTFRJU1VCRElSID0KLU1VTFRJRE8gPSB0cnVlCi1NVUxUSUNMRUFOID0gdHJ1ZQotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLQotQVIgPSBAQVJACi1BUl9GTEFHUyA9IHJjCi0KLUNDID0gQENDQAotQ0ZMQUdTID0gQENGTEFHU0AKLUxJQkNGTEFHUyA9ICQoQ0ZMQUdTKQotUkFOTElCID0gQFJBTkxJQkAKLQotUElDRkxBRyA9Ci0KLU1BS0VPVkVSUklERVMgPQotCi1UQVJHRVRMSUIgPSBsaWJpYmVydHkuYQotCi1MSUJPQkpTID0gQExJQk9CSlNACi1BTExPQ0EgPSBAQUxMT0NBQAotCi0jIEEgY29uZmlndXJhdGlvbiBjYW4gc3BlY2lmeSBleHRyYSAubyBmaWxlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCwKLSMgZXZlbiBpZiB0aGV5IGFyZSBpbiBsaWJjLiAoUGVyaGFwcyB0aGUgbGliYyB2ZXJzaW9uIGlzIGJ1Z2d5LikKLUVYVFJBX09GSUxFUyA9IAotCi0jIEZsYWdzIHRvIHBhc3MgdG8gYSByZWN1cnNpdmUgbWFrZS4KLUZMQUdTX1RPX1BBU1MgPSBcCi0JIkFSPSQoQVIpIiBcCi0JIkFSX0ZMQUdTPSQoQVJfRkxBR1MpIiBcCi0JIkNDPSQoQ0MpIiBcCi0JIkNGTEFHUz0kKENGTEFHUykiIFwKLQkiTElCQ0ZMQUdTPSQoTElCQ0ZMQUdTKSIgXAotCSJFWFRSQV9PRklMRVM9JChFWFRSQV9PRklMRVMpIiBcCi0JIkhERUZJTkVTPSQoSERFRklORVMpIiBcCi0JIklOU1RBTEw9JChJTlNUQUxMKSIgXAotCSJJTlNUQUxMX0RBVEE9JChJTlNUQUxMX0RBVEEpIiBcCi0JIklOU1RBTExfUFJPR1JBTT0kKElOU1RBTExfUFJPR1JBTSkiIFwKLQkiTERGTEFHUz0kKExERkxBR1MpIiBcCi0JIkxPQURMSUJFUz0kKExPQURMSUJFUykiIFwKLQkiUkFOTElCPSQoUkFOTElCKSIgXAotCSJTSEVMTD0kKFNIRUxMKSIKLQotYWxsOiBzdGFtcC1waWNkaXIgJChUQVJHRVRMSUIpIG5lZWRlZC1saXN0IHJlcXVpcmVkLWxpc3QKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWFsbAotCi0uUEhPTlk6IGNoZWNrIGluc3RhbGxjaGVjawotY2hlY2sgaW5zdGFsbGNoZWNrOgotCi1AaG9zdF9tYWtlZmlsZV9mcmFnQAotCi1JTkNESVI9JChzcmNkaXIpLyQoTVVMVElTUkNUT1ApLi4vaW5jbHVkZQotCi1DT01QSUxFLmMgPSAkKENDKSAtYyBAREVGU0AgJChMSUJDRkxBR1MpIC1JLiAtSSQoSU5DRElSKSAkKEhERUZJTkVTKQotLmMubzoKLQl0ZXN0IHgiJChlbmFibGVfc2hhcmVkKSIgIT0geHllcyB8fCBcCi0JICAkKENPTVBJTEUuYykgJChQSUNGTEFHKSAkPCAtbyBwaWMvJEAKLQkkKENPTVBJTEUuYykgJDwKLQotaW5mbyBpbnN0YWxsLWluZm8gY2xlYW4taW5mbyBkdmk6Ci0KLSMgSW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGlzIGRpcmVjdG9yeS4KLUhGSUxFUyA9IGFsbG9jYS1jb25mLmgKLQotIyBOT1RFOiBJZiB5b3UgYWRkIG5ldyBmaWxlcyB0byB0aGUgbGlicmFyeSwgYWRkIHRoZW0gdG8gdGhpcyBsaXN0Ci0jIChhbHBoYWJldGljYWwpLCBhbmQgYWRkIHRoZW0gdG8gUkVRVUlSRURfT0ZJTEVTIG9yIGZ1bmNzIGluCi0jIGNvbmZpZ3VyZS5pbi4KLUNGSUxFUyA9IGFzcHJpbnRmLmMgYWxsb2NhLmMgYXJndi5jIGF0ZXhpdC5jIGJhc2VuYW1lLmMgYmNtcC5jIGJjb3B5LmMgXAotCWJ6ZXJvLmMgY2hvb3NlLXRlbXAuYyBjbG9jay5jIGNvbmNhdC5jIGNwbHVzLWRlbS5jIGZkbWF0Y2guYyBcCi0JZm5tYXRjaC5jIGdldGN3ZC5jIGdldG9wdC5jIGdldG9wdDEuYyBnZXRwYWdlc2l6ZS5jIFwKLQlnZXRydW50aW1lLmMgZmxvYXRmb3JtYXQuYyBoZXguYyBpbmRleC5jIGluc3F1ZS5jIG1lbWNoci5jIFwKLQltZW1jbXAuYyBtZW1jcHkuYyBtZW1tb3ZlLmMgbWVtc2V0LmMgbWtzdGVtcHMuYyBvYmphbGxvYy5jIG9ic3RhY2suYyBcCi0JcGV4ZWN1dGUuYyByYW5kb20uYyByZW5hbWUuYyByaW5kZXguYyBzaWdzZXRtYXNrLmMgc3BhY2VzLmMgXAotCXNwbGF5LXRyZWUuYyBzdHJjYXNlY21wLmMgc3RybmNhc2VjbXAuYyBzdHJjaHIuYyBzdHJkdXAuYyBzdHJlcnJvci5jIFwKLQlzdHJyY2hyLmMgc3Ryc2lnbmFsLmMgc3Ryc3RyLmMgc3RydG9kLmMgc3RydG9sLmMgc3RydG91bC5jIFwKLQl0bXBuYW0uYyB2YXNwcmludGYuYyB2Zm9yay5jIHZmcHJpbnRmLmMgdnByaW50Zi5jIHZzcHJpbnRmLmMgXAotCXdhaXRwaWQuYyB4YXRleGl0LmMgeGV4aXQuYyB4bWFsbG9jLmMgeHN0cmR1cC5jIHhzdHJlcnJvci5jCi0KLSMgVGhlc2UgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeS4KLVJFUVVJUkVEX09GSUxFUyA9IGFyZ3YubyBjaG9vc2UtdGVtcC5vIGNvbmNhdC5vIGNwbHVzLWRlbS5vIFwKLSAgZmRtYXRjaC5vIGZubWF0Y2gubyBnZXRvcHQubyBnZXRvcHQxLm8gZ2V0cnVudGltZS5vIGhleC5vIFwKLSAgZmxvYXRmb3JtYXQubyBvYmphbGxvYy5vIG9ic3RhY2subyBwZXhlY3V0ZS5vIHNwYWNlcy5vIFwKLSAgc3BsYXktdHJlZS5vIHN0cmVycm9yLm8gc3Ryc2lnbmFsLm8geGF0ZXhpdC5vIHhleGl0Lm8geG1hbGxvYy5vIFwKLSAgeHN0cmR1cC5vIHhzdHJlcnJvci5vCi0KLSQoVEFSR0VUTElCKTogJChSRVFVSVJFRF9PRklMRVMpICQoRVhUUkFfT0ZJTEVTKSAkKExJQk9CSlMpICQoQUxMT0NBKQotCXJtIC1mICQoVEFSR0VUTElCKQotCSQoQVIpICQoQVJfRkxBR1MpICQoVEFSR0VUTElCKSBcCi0JICAkKFJFUVVJUkVEX09GSUxFUykgJChFWFRSQV9PRklMRVMpICQoTElCT0JKUykgJChBTExPQ0EpCi0JJChSQU5MSUIpICQoVEFSR0VUTElCKQotCi1JTlNUQUxMX0RFU1QgPSBASU5TVEFMTF9ERVNUQAotaW5zdGFsbDogaW5zdGFsbF90b18kKElOU1RBTExfREVTVCkKLQotaW5zdGFsbF90b19saWJkaXI6IGFsbAotCSQoSU5TVEFMTF9EQVRBKSAkKFRBUkdFVExJQikgJChsaWJkaXIpJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpLm4KLQkoIGNkICQobGliZGlyKSQoTVVMVElTVUJESVIpIDsgJChSQU5MSUIpICQoVEFSR0VUTElCKS5uICkKLQltdiAtZiAkKGxpYmRpcikkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikubiAkKGxpYmRpcikkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWluc3RhbGwKLQotaW5zdGFsbF90b190b29sZGlyOiBhbGwKLQkkKElOU1RBTExfREFUQSkgJChUQVJHRVRMSUIpICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpLm4KLQkoIGNkICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikgOyAkKFJBTkxJQikgJChUQVJHRVRMSUIpLm4gKQotCW12IC1mICQodG9vbGRpcikvbGliJChNVUxUSVNVQkRJUikvJChUQVJHRVRMSUIpLm4gJCh0b29sZGlyKS9saWIkKE1VTFRJU1VCRElSKS8kKFRBUkdFVExJQikKLQlAJChNVUxUSURPKSAkKEZMQUdTX1RPX1BBU1MpIG11bHRpLWRvIERPPWluc3RhbGwKLQotIyBuZWVkZWQtbGlzdCBpcyB1c2VkIGJ5IGxpYnN0ZGMrKy4KLW5lZWRlZC1saXN0OiBNYWtlZmlsZQotCWY9IiQoTElCT0JKUykgJChBTExPQ0EpICQoRVhUUkFfT0ZJTEVTKSI7IFwKLQljYXNlICQkZiBpbiBcCi0JICAqYWxsb2NhLm8qKSBmPSIkJGYgeG1hbGxvYy5vIHhleGl0Lm8iIDs7IFwKLQllc2FjOyBcCi0JZWNobyAkJGYgPiBuZWVkZWQtbGlzdAotCi0jIHJlcXVpcmVkLWxpc3Qgd2FzIHVzZWQgd2hlbiBidWlsZGluZyBhIHNoYXJlZCBiZmQvb3Bjb2Rlcy9saWJpYmVydHkKLSMgbGlicmFyeS4gIEkgZG9uJ3Qga25vdyBpZiBpdCB1c2VkIGJ5IGFueXRoaW5nIGN1cnJlbnRseS4KLXJlcXVpcmVkLWxpc3Q6IE1ha2VmaWxlCi0JZWNobyAkKFJFUVVJUkVEX09GSUxFUykgPiByZXF1aXJlZC1saXN0Ci0KLXN0YW1wLXBpY2RpcjoKLQlpZiBbIHgiJChlbmFibGVfc2hhcmVkKSIgPSB4eWVzIF0gJiYgWyAhIC1kIHBpYyBdOyB0aGVuIFwKLQkgIG1rZGlyIHBpYzsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1waWNkaXIKLQotLlBIT05ZOiBhbGwgZXRhZ3MgdGFncyBscyBjbGVhbiBzdGFnZTEgc3RhZ2UyCi0KLWV0YWdzIHRhZ3M6IFRBR1MKLQotVEFHUzogJChDRklMRVMpICQoSEZJTEVTKQotCWV0YWdzIGBmb3IgaSBpbiAkKEhGSUxFUykgJChDRklMRVMpOyBkbyBlY2hvICQoc3JjZGlyKS8kJGkgOyBkb25lYAotCi0jIFRoZSBzdGFuZGFsb25lIGRlbWFuZ2xlciAoYysrZmlsdCkgaGFzIGJlZW4gbW92ZWQgdG8gYmludXRpbHMuCi1kZW1hbmdsZToKLQlAZWNobyAiVGhlIHN0YW5kYWxvbmUgZGVtYW5nbGVyLCBub3cgbmFtZWQgYysrZmlsdCwgaXMgbm93IgotCUBlY2hvICJhIHBhcnQgb2YgYmludXRpbHMuIgotCUBmYWxzZQotCi1sczoKLQlAZWNobyBNYWtlZmlsZSAkKEhGSUxFUykgJChDRklMRVMpCi0KLSMgTmVlZCB0byBkZWFsIHdpdGggcHJvZmlsZWQgbGlicmFyaWVzLCB0b28uCi0KLW1vc3RseWNsZWFuOgotCXJtIC1yZiAqLm8gcGljIGNvcmUgZXJycyBcIyogKi5FIGEub3V0Ci0Jcm0gLWYgbmVlZGVkLmF3ayBuZWVkZWQyLmF3ayBlcnJvcnMgZHVtbXkgbmVlZGVkLWxpc3QgY29uZmlnLmggc3RhbXAtKgotCXJtIC1mICQoQ09ORklHX0gpICQoTkVFREVEX0xJU1QpIHN0YW1wLXBpY2RpcgotCUAkKE1VTFRJQ0xFQU4pIG11bHRpLWNsZWFuIERPPW1vc3RseWNsZWFuCi1jbGVhbjogbW9zdGx5Y2xlYW4KLQlybSAtZiAqLmEgcmVxdWlyZWQtbGlzdCB0bXBtdWx0aS5vdXQKLQlAJChNVUxUSUNMRUFOKSBtdWx0aS1jbGVhbiBETz1jbGVhbgotZGlzdGNsZWFuOiBjbGVhbgotCUAkKE1VTFRJQ0xFQU4pIG11bHRpLWNsZWFuIERPPWRpc3RjbGVhbgotCXJtIC1mICp+IE1ha2VmaWxlIGNvbmZpZy5zdGF0dXMgeGhvc3QtbWtmcmFnIFRBR1MgbXVsdGlsaWIub3V0Ci0Jcm0gLWYgY29uZmlnLmxvZwotbWFpbnRhaW5lci1jbGVhbiByZWFsY2xlYW46IGRpc3RjbGVhbgotCi1mb3JjZToKLQotTWFrZWZpbGU6ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCi0JQ09ORklHX0ZJTEVTPU1ha2VmaWxlIENPTkZJR19IRUFERVJTPSAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotY29uZmlnLmg6IHN0YW1wLWggOyBAdHJ1ZQotc3RhbXAtaDogY29uZmlnLmluIGNvbmZpZy5zdGF0dXMKLQlDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQotY29uZmlnLnN0YXR1czogJChzcmNkaXIpL2NvbmZpZ3VyZSAkKHNyY2RpcikvY29uZmlnLnRhYmxlCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi0kKFJFUVVJUkVEX09GSUxFUykgJChFWFRSQV9PRklMRVMpICQoTElCT0JKUykgJChBTExPQ0EpOiBzdGFtcC1waWNkaXIKLQotYWxsb2NhLm86IGNvbmZpZy5oCi1hdGV4aXQubzogY29uZmlnLmgKLWFyZ3YubzogY29uZmlnLmggYWxsb2NhLWNvbmYuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLWJhc2VuYW1lLm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotY2hvb3NlLXRlbXAubzogY29uZmlnLmgKLWNsb2NrLm86IGNvbmZpZy5oCi1jb25jYXQubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1jcGx1cy1kZW0ubzogY29uZmlnLmggJChJTkNESVIpL2RlbWFuZ2xlLmgKLWZkbWF0Y2gubzogJChJTkNESVIpL2xpYmliZXJ0eS5oCi1mbm1hdGNoLm86IGNvbmZpZy5oICQoSU5DRElSKS9mbm1hdGNoLmgKLWdldGN3ZC5vOiBjb25maWcuaAotZ2V0b3B0Lm86IGNvbmZpZy5oICQoSU5DRElSKS9nZXRvcHQuaAotZ2V0b3B0MS5vOiBjb25maWcuaCAkKElOQ0RJUikvZ2V0b3B0LmgKLWdldHBhZ2VzaXplLm86IGNvbmZpZy5oCi1nZXRydW50aW1lLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotaGV4Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAotZmxvYXRmb3JtYXQubzogJChJTkNESVIpL2Zsb2F0Zm9ybWF0LmgKLW1rc3RlbXBzLm86IGNvbmZpZy5oCi1vYmphbGxvYy5vOiAkKElOQ0RJUikvb2JqYWxsb2MuaAotb2JzdGFjay5vOiBjb25maWcuaCAkKElOQ0RJUikvb2JzdGFjay5oCi1wZXhlY3V0ZS5vOiBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXNwYWNlcy5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXNwbGF5LXRyZWUubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oICQoSU5DRElSKS9zcGxheS10cmVlLmggJChJTkNESVIpL2Fuc2lkZWNsLmgKLXN0cmVycm9yLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAotc3Ryc2lnbmFsLm86IGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaAoteGF0ZXhpdC5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhleGl0Lm86ICQoSU5DRElSKS9saWJpYmVydHkuaAoteG1hbGxvYy5vOiAkKElOQ0RJUikvbGliaWJlcnR5LmgKLXhzdHJkdXAubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCi14c3RyZXJyb3IubzogY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oCmRpZmYgLS1naXQgYS9saWJpYmVydHkvUkVBRE1FIGIvbGliaWJlcnR5L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MjI2YS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIC1saWJlcnR5IGxpYnJhcnkgb2YgZnJlZSBzb2Z0d2FyZS4KLUl0IGlzIGEgY29sbGVjdGlvbiBvZiBzdWJyb3V0aW5lcyB1c2VkIGJ5IHZhcmlvdXMgR05VIHByb2dyYW1zLgotQ3VycmVudCBtZW1iZXJzIGluY2x1ZGU6Ci0KLQlnZXRvcHQgLS0gZ2V0IG9wdGlvbnMgZnJvbSBjb21tYW5kIGxpbmUKLQlvYnN0YWNrIC0tIHN0YWNrcyBvZiBhcmJpdHJhcmlseS1zaXplZCBvYmplY3RzCi0Jc3RyZXJyb3IgLS0gZXJyb3IgbWVzc2FnZSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gZXJybm8KLQlzdHJ0b2wgLS0gc3RyaW5nLXRvLWxvbmcgY29udmVyc2lvbgotCXN0cnRvdWwgLS0gc3RyaW5nLXRvLXVuc2lnbmVkLWxvbmcgY29udmVyc2lvbgotCi1XZSBleHBlY3QgbWFueSBvZiB0aGUgR05VIHN1YnJvdXRpbmVzIHRoYXQgYXJlIGZsb2F0aW5nIGFyb3VuZCB0bwotZXZlbnR1YWxseSBhcnJpdmUgaGVyZS4KLQotVGhlIGxpYnJhcnkgbXVzdCBiZSBjb25maWd1cmVkIGZyb20gdGhlIHRvcCBzb3VyY2UgZGlyZWN0b3J5LiAgRG9uJ3QKLXRyeSB0byBydW4gY29uZmlndXJlIGluIHRoaXMgZGlyZWN0b3J5LiAgRm9sbG93IHRoZSBjb25maWd1cmF0aW9uCi1pbnN0cnVjdGlvbnMgaW4gLi4vUkVBRE1FLgotCi1QbGVhc2UgcmVwb3J0IGJ1Z3MgYW5kIGZpeGVzIHRvICJidWctZ251LXV0aWxzQHByZXAuYWkubWl0LmVkdSIuICBUaGFuayB5b3UuCi0KLUFERElORyBBIE5FVyBGSUxFCi09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBhcmUgdHdvIHNldHMgb2YgZmlsZXM6ICBUaG9zZSB0aGF0IGFyZSAicmVxdWlyZWQiIHdpbGwgYmUKLWluY2x1ZGVkIGluIHRoZSBsaWJyYXJ5IGZvciBhbGwgY29uZmlndXJhdGlvbnMsIHdoaWxlIHRob3NlCi10aGF0IGFyZSAib3B0aW9uYWwiIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkgb25seSBpZiAibmVlZGVkLiIKLQotVG8gYWRkIGEgbmV3IHJlcXVpcmVkIGZpbGUsIGVkaXQgTWFrZWZpbGUgdG8gYWRkIHRoZSBzb3VyY2UgZmlsZQotbmFtZSB0byBDRklMRVMgYW5kIHRoZSBvYmplY3QgZmlsZSB0byBSRVFVSVJFRF9PRklMRVMuCi0KLVRvIGFkZCBhIG5ldyBvcHRpb25hbCBmaWxlLCBpdCBtdXN0IHByb3ZpZGUgYSBzaW5nbGUgZnVuY3Rpb24sIGFuZCB0aGUKLW5hbWUgb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0KLSAgICAqIEFkZCB0aGUgc291cmNlIGZpbGUgbmFtZSB0byBDRklMRVMuCi0KLSAgICAqIEFkZCB0aGUgZnVuY3Rpb24gdG8gbmFtZSB0byB0aGUgZnVuY3Mgc2hlbGwgdmFyaWFibGUgaW4KLSAgICAgIGNvbmZpZ3VyZS5pbi4KLQotICAgICogQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgQUNfQ0hFQ0tfRlVOQ1MgbGlzdHMganVzdCBhZnRlciB0aGUKLSAgICAgIHNldHRpbmcgb2YgdGhlIGZ1bmNzIHNoZWxsIHZhcmlhYmxlLiAgVGhlc2UgQUNfQ0hFQ0tfRlVOQ1MgY2FsbHMKLSAgICAgIGFyZSBuZXZlciBleGVjdXRlZDsgdGhleSBhcmUgdGhlcmUgdG8gbWFrZSBhdXRvaGVhZGVyIHdvcmsKLSAgICAgIGJldHRlci4KLQotICAgICogQ29uc2lkZXIgdGhlIHNwZWNpYWwgY2FzZXMgb2YgYnVpbGRpbmcgbGliaWJlcnR5OyBhcyBvZiB0aGlzCi0gICAgICB3cml0aW5nLCB0aGUgc3BlY2lhbCBjYXNlcyBhcmUgbmV3bGliIGFuZCBWeFdvcmtzLiAgSWYgYQotICAgICAgcGFydGljdWxhciBzcGVjaWFsIGNhc2UgcHJvdmlkZXMgdGhlIGZ1bmN0aW9uLCB5b3UgZG8gbm90IG5lZWQKLSAgICAgIHRvIGRvIGFueXRoaW5nLiAgSWYgaXQgZG9lcyBub3QgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIGFkZCB0aGUKLSAgICAgIG9iamVjdCBmaWxlIHRvIExJQk9CSlMsIGFuZCBhZGQgdGhlIGZ1bmN0aW9uIG5hbWUgdG8gdGhlIGNhc2UKLSAgICAgIGNvbnRyb2xsaW5nIHdoZXRoZXIgdG8gZGVmaW5lIEhBVkVfZnVuYy4KLQotVGhlIG9wdGlvbmFsIGZpbGUgeW91J3ZlIGFkZGVkIChlLmcuIGdldGN3ZC5jKSBzaG91bGQgY29tcGlsZSBhbmQgd29yawotb24gYWxsIGhvc3RzIHdoZXJlIGl0IGlzIG5lZWRlZC4gIEl0IGRvZXMgbm90IGhhdmUgdG8gd29yayBvciBldmVuCi1jb21waWxlIG9uIGhvc3RzIHdoZXJlIGl0IGlzIG5vdCBuZWVkZWQuCi0KLUFERElORyBBIE5FVyBDT05GSUdVUkFUSU9OCi09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1PbiBtb3N0IGhvc3RzIHlvdSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhlIHNjaGVtZSBmb3IgYXV0b21hdGljYWxseQotZmlndXJpbmcgb3V0IHdoaWNoIGZpbGVzIGFyZSBuZWVkZWQuICBJbiB0aGF0IGNhc2UsIHlvdSBwcm9iYWJseQotZG9uJ3QgbmVlZCBhIHNwZWNpYWwgTWFrZWZpbGUgc3R1YiBmb3IgdGhhdCBjb25maWd1cmF0aW9uLgotCi1JZiB0aGUgZnVsbHkgYXV0b21hdGljIHNjaGVtZSBkb2Vzbid0IHdvcmssIHlvdSBtYXkgYmUgYWJsZSB0byBnZXQKLWJ5IHdpdGggZGVmaW5pbmcgRVhUUkFfT0ZJTEVTIGluIHlvdXIgTWFrZWZpbGUgc3R1Yi4gIFRoaXMgaXMKLWEgbGlzdCBvZiBvYmplY3QgZmlsZSBuYW1lcyB0aGF0IHNob3VsZCBiZSB0cmVhdGVkIGFzIHJlcXVpcmVkCi1mb3IgdGhpcyBjb25maWd1cmF0aW9uIC0gdGhleSB3aWxsIGJlIGluY2x1ZGVkIGluIGxpYmliZXJ0eS5hLAotcmVnYXJkbGVzcyBvZiB3aGF0ZXZlciBtaWdodCBiZSBpbiB0aGUgQyBsaWJyYXJ5LgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FjY29uZmlnLmggYi9saWJpYmVydHkvYWNjb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNTk5ZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYWNjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX2Vycmxpc3QgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfbmVyciB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfTkVSUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19zaWdsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19TSUdMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZXJyb3IgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSRVJST1IKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hbGxvY2EtY29uZi5oIGIvbGliaWJlcnR5L2FsbG9jYS1jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljM2VlYTMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2FsbG9jYS1jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChDX0FMTE9DQSkKLSMgaWZuZGVmIGFsbG9jYQotIyAgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jIGVuZGlmCi0jZWxzZSAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwotIyAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICBlbHNlCi0jICBpZiBkZWZpbmVkKEhBVkVfQUxMT0NBX0gpICYmICFkZWZpbmVkKENfQUxMT0NBKQotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZSAvKiAhIGRlZmluZWQgKEhBVkVfQUxMT0NBX0gpICovCi0jICAgaWZkZWYgX19TVERDX18KLWV4dGVybiBQVFIgYWxsb2NhIChzaXplX3QpOwotIyAgIGVsc2UgLyogISBkZWZpbmVkIChfX1NURENfXykgKi8KLWV4dGVybiBQVFIgYWxsb2NhICgpOwotIyAgIGVuZGlmIC8qICEgZGVmaW5lZCAoX19TVERDX18pICovCi0jICBlbmRpZiAvKiAhIGRlZmluZWQgKEhBVkVfQUxMT0NBX0gpICovCi0jICBpZmRlZiBfV0lOMzIKLSMgICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGVuZGlmCi0jIGVuZGlmIC8qICEgZGVmaW5lZCAoX0FJWCkgKi8KLSNlbmRpZiAvKiAhIGRlZmluZWQgKF9fR05VQ19fKSAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FsbG9jYS5jIGIvbGliaWJlcnR5L2FsbG9jYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjhhMjE1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hbGxvY2EuYworKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKiBhbGxvY2EuYyAtLSBhbGxvY2F0ZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCBtZW1vcnkKLSAgIChNb3N0bHkpIHBvcnRhYmxlIHB1YmxpYy1kb21haW4gaW1wbGVtZW50YXRpb24gLS0gRCBBIEd3eW4KLQotICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUFdCIGxpYnJhcnkgYWxsb2NhIGZ1bmN0aW9uLAotICAgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBzcGFjZSBvZmYgdGhlIHJ1bi10aW1lIHN0YWNrIHNvCi0gICB0aGF0IGl0IGlzIGF1dG9tYXRpY2FsbHkgcmVjbGFpbWVkIHVwb24gcHJvY2VkdXJlIGV4aXQsCi0gICB3YXMgaW5zcGlyZWQgYnkgZGlzY3Vzc2lvbnMgd2l0aCBKLiBRLiBKb2huc29uIG9mIENvcm5lbGwuCi0gICBKLk90dG8gVGVubmFudCA8am90QGNyYXkuY29tPiBjb250cmlidXRlZCB0aGUgQ3JheSBzdXBwb3J0LgotCi0gICBUaGVyZSBhcmUgc29tZSBwcmVwcm9jZXNzb3IgY29uc3RhbnRzIHRoYXQgY2FuCi0gICBiZSBkZWZpbmVkIHdoZW4gY29tcGlsaW5nIGZvciB5b3VyIHNwZWNpZmljIHN5c3RlbSwgZm9yCi0gICBpbXByb3ZlZCBlZmZpY2llbmN5OyBob3dldmVyLCB0aGUgZGVmYXVsdHMgc2hvdWxkIGJlIG9rYXkuCi0KLSAgIFRoZSBnZW5lcmFsIGNvbmNlcHQgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBrZWVwCi0gICB0cmFjayBvZiBhbGwgYWxsb2NhLWFsbG9jYXRlZCBibG9ja3MsIGFuZCByZWNsYWltIGFueQotICAgdGhhdCBhcmUgZm91bmQgdG8gYmUgZGVlcGVyIGluIHRoZSBzdGFjayB0aGFuIHRoZSBjdXJyZW50Ci0gICBpbnZvY2F0aW9uLiAgVGhpcyBoZXVyaXN0aWMgZG9lcyBub3QgcmVjbGFpbSBzdG9yYWdlIGFzCi0gICBzb29uIGFzIGl0IGJlY29tZXMgaW52YWxpZCwgYnV0IGl0IHdpbGwgZG8gc28gZXZlbnR1YWxseS4KLQotICAgQXMgYSBzcGVjaWFsIGNhc2UsIGFsbG9jYSgwKSByZWNsYWltcyBzdG9yYWdlIHdpdGhvdXQKLSAgIGFsbG9jYXRpbmcgYW55LiAgSXQgaXMgYSBnb29kIGlkZWEgdG8gdXNlIGFsbG9jYSgwKSBpbgotICAgeW91ciBtYWluIGNvbnRyb2wgbG9vcCwgZXRjLiB0byBmb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24uICAqLwotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1NURExJQl9ICi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2lmZGVmIGVtYWNzCi0jaW5jbHVkZSAiYmxvY2tpbnB1dC5oIgotI2VuZGlmCi0KLS8qIElmIGNvbXBpbGluZyB3aXRoIEdDQyAyLCB0aGlzIGZpbGUncyBub3QgbmVlZGVkLiAgRXhjZXB0IG9mIGNvdXJzZSBpZgotICAgdGhlIEMgYWxsb2NhIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLiAgKi8KLSNpZiBkZWZpbmVkIChVU0VfQ19BTExPQ0EpIHx8ICFkZWZpbmVkIChfX0dOVUNfXykgfHwgX19HTlVDX18gPCAyCi0KLS8qIElmIHNvbWVvbmUgaGFzIGRlZmluZWQgYWxsb2NhIGFzIGEgbWFjcm8sCi0gICB0aGVyZSBtdXN0IGJlIHNvbWUgb3RoZXIgd2F5IGFsbG9jYSBpcyBzdXBwb3NlZCB0byB3b3JrLiAgKi8KLSNpZm5kZWYgYWxsb2NhCi0KLSNpZmRlZiBlbWFjcwotI2lmZGVmIHN0YXRpYwotLyogYWN0dWFsbHksIG9ubHkgd2FudCB0aGlzIGlmIHN0YXRpYyBpcyBkZWZpbmVkIGFzICIiCi0gICAtLSB0aGlzIGlzIGZvciB1c2csIGluIHdoaWNoIGVtYWNzIG11c3QgdW5kZWZpbmUgc3RhdGljCi0gICBpbiBvcmRlciB0byBtYWtlIHVuZXhlYyB3b3JrYWJsZQotICAgKi8KLSNpZm5kZWYgU1RBQ0tfRElSRUNUSU9OCi15b3UKLWxvc2UKLS0tIG11c3Qga25vdyBTVEFDS19ESVJFQ1RJT04gYXQgY29tcGlsZS10aW1lCi0jZW5kaWYgLyogU1RBQ0tfRElSRUNUSU9OIHVuZGVmaW5lZCAqLwotI2VuZGlmIC8qIHN0YXRpYyAqLwotI2VuZGlmIC8qIGVtYWNzICovCi0KLS8qIElmIHlvdXIgc3RhY2sgaXMgYSBsaW5rZWQgbGlzdCBvZiBmcmFtZXMsIHlvdSBoYXZlIHRvCi0gICBwcm92aWRlIGFuICJhZGRyZXNzIG1ldHJpYyIgQUREUkVTU19GVU5DVElPTiBtYWNyby4gICovCi0KLSNpZiBkZWZpbmVkIChDUkFZKSAmJiBkZWZpbmVkIChDUkFZX1NUQUNLU0VHX0VORCkKLWxvbmcgaTAwYWZ1bmMgKCk7Ci0jZGVmaW5lIEFERFJFU1NfRlVOQ1RJT04oYXJnKSAoY2hhciAqKSBpMDBhZnVuYyAoJihhcmcpKQotI2Vsc2UKLSNkZWZpbmUgQUREUkVTU19GVU5DVElPTihhcmcpICYoYXJnKQotI2VuZGlmCi0KLSNpZiBfX1NURENfXwotdHlwZWRlZiB2b2lkICpwb2ludGVyOwotI2Vsc2UKLXR5cGVkZWYgY2hhciAqcG9pbnRlcjsKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUJTlVMTAkwCi0jZW5kaWYKLQotLyogRGlmZmVyZW50IHBvcnRpb25zIG9mIEVtYWNzIG5lZWQgdG8gY2FsbCBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKLSAgIG1hbGxvYy4gIFRoZSBFbWFjcyBleGVjdXRhYmxlIG5lZWRzIGFsbG9jYSB0byBjYWxsIHhtYWxsb2MsIGJlY2F1c2UKLSAgIG9yZGluYXJ5IG1hbGxvYyBpc24ndCBwcm90ZWN0ZWQgZnJvbSBpbnB1dCBzaWduYWxzLiAgT24gdGhlIG90aGVyCi0gICBoYW5kLCB0aGUgdXRpbGl0aWVzIGluIGxpYi1zcmMgbmVlZCBhbGxvY2EgdG8gY2FsbCBtYWxsb2M7IHNvbWUgb2YKLSAgIHRoZW0gYXJlIHZlcnkgc2ltcGxlLCBhbmQgZG9uJ3QgaGF2ZSBhbiB4bWFsbG9jIHJvdXRpbmUuCi0KLSAgIE5vbi1FbWFjcyBwcm9ncmFtcyBleHBlY3QgdGhpcyB0byBjYWxsIHVzZSB4bWFsbG9jLgotCi0gICBDYWxsZXJzIGJlbG93IHNob3VsZCB1c2UgbWFsbG9jLiAgKi8KLQotI2lmbmRlZiBlbWFjcwotI2RlZmluZSBtYWxsb2MgeG1hbGxvYwotI2VuZGlmCi1leHRlcm4gcG9pbnRlciBtYWxsb2MgKCk7Ci0KLS8qIERlZmluZSBTVEFDS19ESVJFQ1RJT04gaWYgeW91IGtub3cgdGhlIGRpcmVjdGlvbiBvZiBzdGFjawotICAgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseQotICAgZGVkdWNlZCBhdCBydW4tdGltZS4KLQotICAgU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotICAgU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gICBTVEFDS19ESVJFQ1RJT04gPSAwID0+IGRpcmVjdGlvbiBvZiBncm93dGggdW5rbm93biAgKi8KLQotI2lmbmRlZiBTVEFDS19ESVJFQ1RJT04KLSNkZWZpbmUJU1RBQ0tfRElSRUNUSU9OCTAJLyogRGlyZWN0aW9uIHVua25vd24uICAqLwotI2VuZGlmCi0KLSNpZiBTVEFDS19ESVJFQ1RJT04gIT0gMAotCi0jZGVmaW5lCVNUQUNLX0RJUglTVEFDS19ESVJFQ1RJT04JLyogS25vd24gYXQgY29tcGlsZS10aW1lLiAgKi8KLQotI2Vsc2UgLyogU1RBQ0tfRElSRUNUSU9OID09IDA7IG5lZWQgcnVuLXRpbWUgY29kZS4gICovCi0KLXN0YXRpYyBpbnQgc3RhY2tfZGlyOwkJLyogMSBvciAtMSBvbmNlIGtub3duLiAgKi8KLSNkZWZpbmUJU1RBQ0tfRElSCXN0YWNrX2RpcgotCi1zdGF0aWMgdm9pZAotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSBOVUxMOwkvKiBBZGRyZXNzIG9mIGZpcnN0IGBkdW1teScsIG9uY2Uga25vd24uICAqLwotICBhdXRvIGNoYXIgZHVtbXk7CQkvKiBUbyBnZXQgc3RhY2sgYWRkcmVzcy4gICovCi0KLSAgaWYgKGFkZHIgPT0gTlVMTCkKLSAgICB7CQkJCS8qIEluaXRpYWwgZW50cnkuICAqLwotICAgICAgYWRkciA9IEFERFJFU1NfRlVOQ1RJT04gKGR1bW15KTsKLQotICAgICAgZmluZF9zdGFja19kaXJlY3Rpb24gKCk7CS8qIFJlY3Vyc2Ugb25jZS4gICovCi0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2Vjb25kIGVudHJ5LiAgKi8KLSAgICAgIGlmIChBRERSRVNTX0ZVTkNUSU9OIChkdW1teSkgPiBhZGRyKQotCXN0YWNrX2RpciA9IDE7CQkvKiBTdGFjayBncmV3IHVwd2FyZC4gICovCi0gICAgICBlbHNlCi0Jc3RhY2tfZGlyID0gLTE7CQkvKiBTdGFjayBncmV3IGRvd253YXJkLiAgKi8KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBTVEFDS19ESVJFQ1RJT04gPT0gMCAqLwotCi0vKiBBbiAiYWxsb2NhIGhlYWRlciIgaXMgdXNlZCB0bzoKLSAgIChhKSBjaGFpbiB0b2dldGhlciBhbGwgYWxsb2NhJ2VkIGJsb2NrczsKLSAgIChiKSBrZWVwIHRyYWNrIG9mIHN0YWNrIGRlcHRoLgotCi0gICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHNpemVvZihoZWFkZXIpIGFncmVlIHdpdGggbWFsbG9jCi0gICBhbGlnbm1lbnQgY2h1bmsgc2l6ZS4gIFRoZSBmb2xsb3dpbmcgZGVmYXVsdCBzaG91bGQgd29yayBva2F5LiAgKi8KLQotI2lmbmRlZglBTElHTl9TSVpFCi0jZGVmaW5lCUFMSUdOX1NJWkUJc2l6ZW9mKGRvdWJsZSkKLSNlbmRpZgotCi10eXBlZGVmIHVuaW9uIGhkcgotewotICBjaGFyIGFsaWduW0FMSUdOX1NJWkVdOwkvKiBUbyBmb3JjZSBzaXplb2YoaGVhZGVyKS4gICovCi0gIHN0cnVjdAotICAgIHsKLSAgICAgIHVuaW9uIGhkciAqbmV4dDsJCS8qIEZvciBjaGFpbmluZyBoZWFkZXJzLiAgKi8KLSAgICAgIGNoYXIgKmRlZXA7CQkvKiBGb3Igc3RhY2sgZGVwdGggbWVhc3VyZS4gICovCi0gICAgfSBoOwotfSBoZWFkZXI7Ci0KLXN0YXRpYyBoZWFkZXIgKmxhc3RfYWxsb2NhX2hlYWRlciA9IE5VTEw7CS8qIC0+IGxhc3QgYWxsb2NhIGhlYWRlci4gICovCi0KLS8qIFJldHVybiBhIHBvaW50ZXIgdG8gYXQgbGVhc3QgU0laRSBieXRlcyBvZiBzdG9yYWdlLAotICAgd2hpY2ggd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZCB1cG9uIGV4aXQgZnJvbQotICAgdGhlIHByb2NlZHVyZSB0aGF0IGNhbGxlZCBhbGxvY2EuICBPcmlnaW5hbGx5LCB0aGlzIHNwYWNlCi0gICB3YXMgc3VwcG9zZWQgdG8gYmUgdGFrZW4gZnJvbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZSBvZiB0aGUKLSAgIGNhbGxlciwgYnV0IHRoYXQgbWV0aG9kIGNhbm5vdCBiZSBtYWRlIHRvIHdvcmsgZm9yIHNvbWUKLSAgIGltcGxlbWVudGF0aW9ucyBvZiBDLCBmb3IgZXhhbXBsZSB1bmRlciBHb3VsZCdzIFVUWC8zMi4gICovCi0KLXBvaW50ZXIKLWFsbG9jYSAoc2l6ZSkKLSAgICAgdW5zaWduZWQgc2l6ZTsKLXsKLSAgYXV0byBjaGFyIHByb2JlOwkJLyogUHJvYmVzIHN0YWNrIGRlcHRoOiAqLwotICByZWdpc3RlciBjaGFyICpkZXB0aCA9IEFERFJFU1NfRlVOQ1RJT04gKHByb2JlKTsKLQotI2lmIFNUQUNLX0RJUkVDVElPTiA9PSAwCi0gIGlmIChTVEFDS19ESVIgPT0gMCkJCS8qIFVua25vd24gZ3Jvd3RoIGRpcmVjdGlvbi4gICovCi0gICAgZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0jZW5kaWYKLQotICAvKiBSZWNsYWltIGdhcmJhZ2UsIGRlZmluZWQgYXMgYWxsIGFsbG9jYSdkIHN0b3JhZ2UgdGhhdAotICAgICB3YXMgYWxsb2NhdGVkIGZyb20gZGVlcGVyIGluIHRoZSBzdGFjayB0aGFuIGN1cnJlbnRseS4gICovCi0KLSAgewotICAgIHJlZ2lzdGVyIGhlYWRlciAqaHA7CS8qIFRyYXZlcnNlcyBsaW5rZWQgbGlzdC4gICovCi0KLSNpZmRlZiBlbWFjcwotICAgIEJMT0NLX0lOUFVUOwotI2VuZGlmCi0KLSAgICBmb3IgKGhwID0gbGFzdF9hbGxvY2FfaGVhZGVyOyBocCAhPSBOVUxMOykKLSAgICAgIGlmICgoU1RBQ0tfRElSID4gMCAmJiBocC0+aC5kZWVwID4gZGVwdGgpCi0JICB8fCAoU1RBQ0tfRElSIDwgMCAmJiBocC0+aC5kZWVwIDwgZGVwdGgpKQotCXsKLQkgIHJlZ2lzdGVyIGhlYWRlciAqbnAgPSBocC0+aC5uZXh0OwotCi0JICBmcmVlICgocG9pbnRlcikgaHApOwkvKiBDb2xsZWN0IGdhcmJhZ2UuICAqLwotCi0JICBocCA9IG5wOwkJLyogLT4gbmV4dCBoZWFkZXIuICAqLwotCX0KLSAgICAgIGVsc2UKLQlicmVhazsJCQkvKiBSZXN0IGFyZSBub3QgZGVlcGVyLiAgKi8KLQotICAgIGxhc3RfYWxsb2NhX2hlYWRlciA9IGhwOwkvKiAtPiBsYXN0IHZhbGlkIHN0b3JhZ2UuICAqLwotCi0jaWZkZWYgZW1hY3MKLSAgICBVTkJMT0NLX0lOUFVUOwotI2VuZGlmCi0gIH0KLQotICBpZiAoc2l6ZSA9PSAwKQotICAgIHJldHVybiBOVUxMOwkJLyogTm8gYWxsb2NhdGlvbiByZXF1aXJlZC4gICovCi0KLSAgLyogQWxsb2NhdGUgY29tYmluZWQgaGVhZGVyICsgdXNlciBkYXRhIHN0b3JhZ2UuICAqLwotCi0gIHsKLSAgICByZWdpc3RlciBwb2ludGVyIG5ldyA9IG1hbGxvYyAoc2l6ZW9mIChoZWFkZXIpICsgc2l6ZSk7Ci0gICAgLyogQWRkcmVzcyBvZiBoZWFkZXIuICAqLwotCi0gICAgaWYgKG5ldyA9PSAwKQotICAgICAgYWJvcnQoKTsKLQotICAgICgoaGVhZGVyICopIG5ldyktPmgubmV4dCA9IGxhc3RfYWxsb2NhX2hlYWRlcjsKLSAgICAoKGhlYWRlciAqKSBuZXcpLT5oLmRlZXAgPSBkZXB0aDsKLQotICAgIGxhc3RfYWxsb2NhX2hlYWRlciA9IChoZWFkZXIgKikgbmV3OwotCi0gICAgLyogVXNlciBzdG9yYWdlIGJlZ2lucyBqdXN0IGFmdGVyIGhlYWRlci4gICovCi0KLSAgICByZXR1cm4gKHBvaW50ZXIpICgoY2hhciAqKSBuZXcgKyBzaXplb2YgKGhlYWRlcikpOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkIChDUkFZKSAmJiBkZWZpbmVkIChDUkFZX1NUQUNLU0VHX0VORCkKLQotI2lmZGVmIERFQlVHX0kwMEFGVU5DCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jaWZuZGVmIENSQVlfU1RBQ0sKLSNkZWZpbmUgQ1JBWV9TVEFDSwotI2lmbmRlZiBDUkFZMgotLyogU3RhY2sgc3RydWN0dXJlcyBmb3IgQ1JBWS0xLCBDUkFZIFgtTVAsIGFuZCBDUkFZIFktTVAgKi8KLXN0cnVjdCBzdGFja19jb250cm9sX2hlYWRlcgotICB7Ci0gICAgbG9uZyBzaGdyb3c6MzI7CQkvKiBOdW1iZXIgb2YgdGltZXMgc3RhY2sgaGFzIGdyb3duLiAgKi8KLSAgICBsb25nIHNoYXNlZzozMjsJCS8qIFNpemUgb2YgaW5jcmVtZW50cyB0byBzdGFjay4gICovCi0gICAgbG9uZyBzaGh3bTozMjsJCS8qIEhpZ2ggd2F0ZXIgbWFyayBvZiBzdGFjay4gICovCi0gICAgbG9uZyBzaHNpemU6MzI7CQkvKiBDdXJyZW50IHNpemUgb2Ygc3RhY2sgKGFsbCBzZWdtZW50cykuICAqLwotICB9OwotCi0vKiBUaGUgc3RhY2sgc2VnbWVudCBsaW5rYWdlIGNvbnRyb2wgaW5mb3JtYXRpb24gb2NjdXJzIGF0Ci0gICB0aGUgaGlnaC1hZGRyZXNzIGVuZCBvZiBhIHN0YWNrIHNlZ21lbnQuICAoVGhlIHN0YWNrCi0gICBncm93cyBmcm9tIGxvdyBhZGRyZXNzZXMgdG8gaGlnaCBhZGRyZXNzZXMuKSAgVGhlIGluaXRpYWwKLSAgIHBhcnQgb2YgdGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sIGluZm9ybWF0aW9uIGlzCi0gICAwMjAwIChvY3RhbCkgd29yZHMuICBUaGlzIHByb3ZpZGVzIGZvciByZWdpc3RlciBzdG9yYWdlCi0gICBmb3IgdGhlIHJvdXRpbmUgd2hpY2ggb3ZlcmZsb3dzIHRoZSBzdGFjay4gICovCi0KLXN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UKLSAgewotICAgIGxvbmcgc3NbMDIwMF07CQkvKiAwMjAwIG92ZXJmbG93IHdvcmRzLiAgKi8KLSAgICBsb25nIHNzc2l6ZTozMjsJCS8qIE51bWJlciBvZiB3b3JkcyBpbiB0aGlzIHNlZ21lbnQuICAqLwotICAgIGxvbmcgc3NiYXNlOjMyOwkJLyogT2Zmc2V0IHRvIHN0YWNrIGJhc2UuICAqLwotICAgIGxvbmc6MzI7Ci0gICAgbG9uZyBzc3BzZWc6MzI7CQkvKiBPZmZzZXQgdG8gbGlua2FnZSBjb250cm9sIG9mIHByZXZpb3VzCi0JCQkJICAgc2VnbWVudCBvZiBzdGFjay4gICovCi0gICAgbG9uZzozMjsKLSAgICBsb25nIHNzdGNwdDozMjsJCS8qIFBvaW50ZXIgdG8gdGFzayBjb21tb24gYWRkcmVzcyBibG9jay4gICovCi0gICAgbG9uZyBzc2Nzbm07CQkvKiBQcml2YXRlIGNvbnRyb2wgc3RydWN0dXJlIG51bWJlciBmb3IKLQkJCQkgICBtaWNyb3Rhc2tpbmcuICAqLwotICAgIGxvbmcgc3N1c3IxOwkJLyogUmVzZXJ2ZWQgZm9yIHVzZXIuICAqLwotICAgIGxvbmcgc3N1c3IyOwkJLyogUmVzZXJ2ZWQgZm9yIHVzZXIuICAqLwotICAgIGxvbmcgc3N0cGlkOwkJLyogUHJvY2VzcyBJRCBmb3IgcGlkIGJhc2VkIG11bHRpLXRhc2tpbmcuICAqLwotICAgIGxvbmcgc3NndnVwOwkJLyogUG9pbnRlciB0byBtdWx0aXRhc2tpbmcgdGhyZWFkIGdpdmV1cC4gICovCi0gICAgbG9uZyBzc2NyYXlbN107CQkvKiBSZXNlcnZlZCBmb3IgQ3JheSBSZXNlYXJjaC4gICovCi0gICAgbG9uZyBzc2EwOwotICAgIGxvbmcgc3NhMTsKLSAgICBsb25nIHNzYTI7Ci0gICAgbG9uZyBzc2EzOwotICAgIGxvbmcgc3NhNDsKLSAgICBsb25nIHNzYTU7Ci0gICAgbG9uZyBzc2E2OwotICAgIGxvbmcgc3NhNzsKLSAgICBsb25nIHNzczA7Ci0gICAgbG9uZyBzc3MxOwotICAgIGxvbmcgc3NzMjsKLSAgICBsb25nIHNzczM7Ci0gICAgbG9uZyBzc3M0OwotICAgIGxvbmcgc3NzNTsKLSAgICBsb25nIHNzczY7Ci0gICAgbG9uZyBzc3M3OwotICB9OwotCi0jZWxzZSAvKiBDUkFZMiAqLwotLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgdmVjdG9yIG9mIHdvcmRzCi0gICByZXR1cm5lZCBieSB0aGUgU1RLU1RBVCBsaWJyYXJ5IHJvdXRpbmUuICAqLwotc3RydWN0IHN0a19zdGF0Ci0gIHsKLSAgICBsb25nIG5vdzsJCQkvKiBDdXJyZW50IHRvdGFsIHN0YWNrIHNpemUuICAqLwotICAgIGxvbmcgbWF4YzsJCQkvKiBBbW91bnQgb2YgY29udGlndW91cyBzcGFjZSB3aGljaCB3b3VsZAotCQkJCSAgIGJlIHJlcXVpcmVkIHRvIHNhdGlzZnkgdGhlIG1heGltdW0KLQkJCQkgICBzdGFjayBkZW1hbmQgdG8gZGF0ZS4gICovCi0gICAgbG9uZyBoaWdoX3dhdGVyOwkJLyogU3RhY2sgaGlnaC13YXRlciBtYXJrLiAgKi8KLSAgICBsb25nIG92ZXJmbG93czsJCS8qIE51bWJlciBvZiBzdGFjayBvdmVyZmxvdyAoJFNUS09GRU4pIGNhbGxzLiAgKi8KLSAgICBsb25nIGhpdHM7CQkJLyogTnVtYmVyIG9mIGludGVybmFsIGJ1ZmZlciBoaXRzLiAgKi8KLSAgICBsb25nIGV4dGVuZHM7CQkvKiBOdW1iZXIgb2YgYmxvY2sgZXh0ZW5zaW9ucy4gICovCi0gICAgbG9uZyBzdGtvX21hbGxvY3M7CQkvKiBCbG9jayBhbGxvY2F0aW9ucyBieSAkU1RLT0ZFTi4gICovCi0gICAgbG9uZyB1bmRlcmZsb3dzOwkJLyogTnVtYmVyIG9mIHN0YWNrIHVuZGVyZmxvdyBjYWxscyAoJFNUS1JFVE4pLiAgKi8KLSAgICBsb25nIHN0a29fZnJlZTsJCS8qIE51bWJlciBvZiBkZWFsbG9jYXRpb25zIGJ5ICRTVEtSRVROLiAgKi8KLSAgICBsb25nIHN0a21fZnJlZTsJCS8qIE51bWJlciBvZiBkZWFsbG9jYXRpb25zIGJ5ICRTVEtNUkVULiAgKi8KLSAgICBsb25nIHNlZ21lbnRzOwkJLyogQ3VycmVudCBudW1iZXIgb2Ygc3RhY2sgc2VnbWVudHMuICAqLwotICAgIGxvbmcgbWF4czsJCQkvKiBNYXhpbXVtIG51bWJlciBvZiBzdGFjayBzZWdtZW50cyBzbyBmYXIuICAqLwotICAgIGxvbmcgcGFkX3NpemU7CQkvKiBTdGFjayBwYWQgc2l6ZS4gICovCi0gICAgbG9uZyBjdXJyZW50X2FkZHJlc3M7CS8qIEN1cnJlbnQgc3RhY2sgc2VnbWVudCBhZGRyZXNzLiAgKi8KLSAgICBsb25nIGN1cnJlbnRfc2l6ZTsJCS8qIEN1cnJlbnQgc3RhY2sgc2VnbWVudCBzaXplLiAgVGhpcwotCQkJCSAgIG51bWJlciBpcyBhY3R1YWxseSBjb3JydXB0ZWQgYnkgU1RLU1RBVCB0bwotCQkJCSAgIGluY2x1ZGUgdGhlIGZpZnRlZW4gd29yZCB0cmFpbGVyIGFyZWEuICAqLwotICAgIGxvbmcgaW5pdGlhbF9hZGRyZXNzOwkvKiBBZGRyZXNzIG9mIGluaXRpYWwgc2VnbWVudC4gICovCi0gICAgbG9uZyBpbml0aWFsX3NpemU7CQkvKiBTaXplIG9mIGluaXRpYWwgc2VnbWVudC4gICovCi0gIH07Ci0KLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggdHJhaWxzCi0gICBhbnkgc3RhY2sgc2VnbWVudC4gIEkgdGhpbmsgdGhhdCB0aGUgZGVzY3JpcHRpb24gaW4gJ2FzZGVmJyBpcwotICAgb3V0IG9mIGRhdGUuICBJIG9ubHkgZGVzY3JpYmUgdGhlIHBhcnRzIHRoYXQgSSBhbSBzdXJlIGFib3V0LiAgKi8KLQotc3RydWN0IHN0a190cmFpbGVyCi0gIHsKLSAgICBsb25nIHRoaXNfYWRkcmVzczsJCS8qIEFkZHJlc3Mgb2YgdGhpcyBibG9jay4gICovCi0gICAgbG9uZyB0aGlzX3NpemU7CQkvKiBTaXplIG9mIHRoaXMgYmxvY2sgKGRvZXMgbm90IGluY2x1ZGUKLQkJCQkgICB0aGlzIHRyYWlsZXIpLiAgKi8KLSAgICBsb25nIHVua25vd24yOwotICAgIGxvbmcgdW5rbm93bjM7Ci0gICAgbG9uZyBsaW5rOwkJCS8qIEFkZHJlc3Mgb2YgdHJhaWxlciBibG9jayBvZiBwcmV2aW91cwotCQkJCSAgIHNlZ21lbnQuICAqLwotICAgIGxvbmcgdW5rbm93bjU7Ci0gICAgbG9uZyB1bmtub3duNjsKLSAgICBsb25nIHVua25vd243OwotICAgIGxvbmcgdW5rbm93bjg7Ci0gICAgbG9uZyB1bmtub3duOTsKLSAgICBsb25nIHVua25vd24xMDsKLSAgICBsb25nIHVua25vd24xMTsKLSAgICBsb25nIHVua25vd24xMjsKLSAgICBsb25nIHVua25vd24xMzsKLSAgICBsb25nIHVua25vd24xNDsKLSAgfTsKLQotI2VuZGlmIC8qIENSQVkyICovCi0jZW5kaWYgLyogbm90IENSQVlfU1RBQ0sgKi8KLQotI2lmZGVmIENSQVkyCi0vKiBEZXRlcm1pbmUgYSAic3RhY2sgbWVhc3VyZSIgZm9yIGFuIGFyYml0cmFyeSBBRERSRVNTLgotICAgSSBkb3VidCB0aGF0ICJsaW50IiB3aWxsIGxpa2UgdGhpcyBtdWNoLiAgKi8KLQotc3RhdGljIGxvbmcKLWkwMGFmdW5jIChsb25nICphZGRyZXNzKQotewotICBzdHJ1Y3Qgc3RrX3N0YXQgc3RhdHVzOwotICBzdHJ1Y3Qgc3RrX3RyYWlsZXIgKnRyYWlsZXI7Ci0gIGxvbmcgKmJsb2NrLCBzaXplOwotICBsb25nIHJlc3VsdCA9IDA7Ci0KLSAgLyogV2Ugd2FudCB0byBpdGVyYXRlIHRocm91Z2ggYWxsIG9mIHRoZSBzZWdtZW50cy4gIFRoZSBmaXJzdAotICAgICBzdGVwIGlzIHRvIGdldCB0aGUgc3RhY2sgc3RhdHVzIHN0cnVjdHVyZS4gIFdlIGNvdWxkIGRvIHRoaXMKLSAgICAgbW9yZSBxdWlja2x5IGFuZCBtb3JlIGRpcmVjdGx5LCBwZXJoYXBzLCBieSByZWZlcmVuY2luZyB0aGUKLSAgICAgJExNMDAgY29tbW9uIGJsb2NrLCBidXQgSSBrbm93IHRoYXQgdGhpcyB3b3Jrcy4gICovCi0KLSAgU1RLU1RBVCAoJnN0YXR1cyk7Ci0KLSAgLyogU2V0IHVwIHRoZSBpdGVyYXRpb24uICAqLwotCi0gIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIChzdGF0dXMuY3VycmVudF9hZGRyZXNzCi0JCQkJICAgICsgc3RhdHVzLmN1cnJlbnRfc2l6ZQotCQkJCSAgICAtIDE1KTsKLQotICAvKiBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBzdGFjayBzZWdtZW50LiAgVGhlcmVmb3JlIGl0IGlzCi0gICAgIGEgZmF0YWwgZXJyb3IgaWYgInRyYWlsZXIiIGlzIG51bGwuICAqLwotCi0gIGlmICh0cmFpbGVyID09IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRGlzY2FyZCBzZWdtZW50cyB0aGF0IGRvIG5vdCBjb250YWluIG91ciBhcmd1bWVudCBhZGRyZXNzLiAgKi8KLQotICB3aGlsZSAodHJhaWxlciAhPSAwKQotICAgIHsKLSAgICAgIGJsb2NrID0gKGxvbmcgKikgdHJhaWxlci0+dGhpc19hZGRyZXNzOwotICAgICAgc2l6ZSA9IHRyYWlsZXItPnRoaXNfc2l6ZTsKLSAgICAgIGlmIChibG9jayA9PSAwIHx8IHNpemUgPT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIHRyYWlsZXItPmxpbms7Ci0gICAgICBpZiAoKGJsb2NrIDw9IGFkZHJlc3MpICYmIChhZGRyZXNzIDwgKGJsb2NrICsgc2l6ZSkpKQotCWJyZWFrOwotICAgIH0KLQotICAvKiBTZXQgdGhlIHJlc3VsdCB0byB0aGUgb2Zmc2V0IGluIHRoaXMgc2VnbWVudCBhbmQgYWRkIHRoZSBzaXplcwotICAgICBvZiBhbGwgcHJlZGVjZXNzb3Igc2VnbWVudHMuICAqLwotCi0gIHJlc3VsdCA9IGFkZHJlc3MgLSBibG9jazsKLQotICBpZiAodHJhaWxlciA9PSAwKQotICAgIHsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gIGRvCi0gICAgewotICAgICAgaWYgKHRyYWlsZXItPnRoaXNfc2l6ZSA8PSAwKQotCWFib3J0ICgpOwotICAgICAgcmVzdWx0ICs9IHRyYWlsZXItPnRoaXNfc2l6ZTsKLSAgICAgIHRyYWlsZXIgPSAoc3RydWN0IHN0a190cmFpbGVyICopIHRyYWlsZXItPmxpbms7Ci0gICAgfQotICB3aGlsZSAodHJhaWxlciAhPSAwKTsKLQotICAvKiBXZSBhcmUgZG9uZS4gIE5vdGUgdGhhdCBpZiB5b3UgcHJlc2VudCBhIGJvZ3VzIGFkZHJlc3MgKG9uZQotICAgICBub3QgaW4gYW55IHNlZ21lbnQpLCB5b3Ugd2lsbCBnZXQgYSBkaWZmZXJlbnQgbnVtYmVyIGJhY2ssIGZvcm1lZAotICAgICBmcm9tIHN1YnRyYWN0aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBibG9jay4gIFRoaXMgaXMgcHJvYmFibHkKLSAgICAgbm90IHdoYXQgeW91IHdhbnQuICAqLwotCi0gIHJldHVybiAocmVzdWx0KTsKLX0KLQotI2Vsc2UgLyogbm90IENSQVkyICovCi0vKiBTdGFjayBhZGRyZXNzIGZ1bmN0aW9uIGZvciBhIENSQVktMSwgQ1JBWSBYLU1QLCBvciBDUkFZIFktTVAuCi0gICBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aGUgY2VsbCB3aXRoaW4gdGhlIHN0YWNrLAotICAgZ2l2ZW4gdGhlIGFkZHJlc3Mgb2YgdGhlIGNlbGwuICBUaGUgcHVycG9zZSBvZiB0aGlzCi0gICByb3V0aW5lIGlzIHRvIGxpbmVhcml6ZSwgaW4gc29tZSBzZW5zZSwgc3RhY2sgYWRkcmVzc2VzCi0gICBmb3IgYWxsb2NhLiAgKi8KLQotc3RhdGljIGxvbmcKLWkwMGFmdW5jIChsb25nIGFkZHJlc3MpCi17Ci0gIGxvbmcgc3RrbCA9IDA7Ci0KLSAgbG9uZyBzaXplLCBwc2VnLCB0aGlzX3NlZ21lbnQsIHN0YWNrOwotICBsb25nIHJlc3VsdCA9IDA7Ci0KLSAgc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqc3NwdHI7Ci0KLSAgLyogUmVnaXN0ZXIgQjY3IGNvbnRhaW5zIHRoZSBhZGRyZXNzIG9mIHRoZSBlbmQgb2YgdGhlCi0gICAgIGN1cnJlbnQgc3RhY2sgc2VnbWVudC4gIElmIHlvdSAoYXMgYSBzdWJwcm9ncmFtKSBzdG9yZQotICAgICB5b3VyIHJlZ2lzdGVycyBvbiB0aGUgc3RhY2sgYW5kIGZpbmQgdGhhdCB5b3UgYXJlIHBhc3QKLSAgICAgdGhlIGNvbnRlbnRzIG9mIEI2NywgeW91IGhhdmUgb3ZlcmZsb3dlZCB0aGUgc2VnbWVudC4KLQotICAgICBCNjcgYWxzbyBwb2ludHMgdG8gdGhlIHN0YWNrIHNlZ21lbnQgbGlua2FnZSBjb250cm9sCi0gICAgIGFyZWEsIHdoaWNoIGlzIHdoYXQgd2UgYXJlIHJlYWxseSBpbnRlcmVzdGVkIGluLiAgKi8KLQotICBzdGtsID0gQ1JBWV9TVEFDS1NFR19FTkQgKCk7Ci0gIHNzcHRyID0gKHN0cnVjdCBzdGFja19zZWdtZW50X2xpbmthZ2UgKikgc3RrbDsKLQotICAvKiBJZiBvbmUgc3VidHJhY3RzICdzaXplJyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlZ21lbnQsCi0gICAgIG9uZSBoYXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIHNlZ21lbnQuCi0KLSAgICAgSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IHNlZ21lbnQsICdwc2VnJyB3aWxsIGJlCi0gICAgIG5vbnplcm8uICAqLwotCi0gIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOwotICBzaXplID0gc3NwdHItPnNzc2l6ZTsKLQotICB0aGlzX3NlZ21lbnQgPSBzdGtsIC0gc2l6ZTsKLQotICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGNhbGxpbmcgdGhpcyByb3V0aW5lIGl0c2VsZiBjYXVzZWQKLSAgICAgYSBzdGFjayBvdmVyZmxvdy4gIERpc2NhcmQgc3RhY2sgc2VnbWVudHMgd2hpY2ggZG8gbm90Ci0gICAgIGNvbnRhaW4gdGhlIHRhcmdldCBhZGRyZXNzLiAgKi8KLQotICB3aGlsZSAoISh0aGlzX3NlZ21lbnQgPD0gYWRkcmVzcyAmJiBhZGRyZXNzIDw9IHN0a2wpKQotICAgIHsKLSNpZmRlZiBERUJVR19JMDBBRlVOQwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJTAxMW8gJTAxMW8gJTAxMW9cbiIsIHRoaXNfc2VnbWVudCwgYWRkcmVzcywgc3RrbCk7Ci0jZW5kaWYKLSAgICAgIGlmIChwc2VnID09IDApCi0JYnJlYWs7Ci0gICAgICBzdGtsID0gc3RrbCAtIHBzZWc7Ci0gICAgICBzc3B0ciA9IChzdHJ1Y3Qgc3RhY2tfc2VnbWVudF9saW5rYWdlICopIHN0a2w7Ci0gICAgICBzaXplID0gc3NwdHItPnNzc2l6ZTsKLSAgICAgIHBzZWcgPSBzc3B0ci0+c3Nwc2VnOwotICAgICAgdGhpc19zZWdtZW50ID0gc3RrbCAtIHNpemU7Ci0gICAgfQotCi0gIHJlc3VsdCA9IGFkZHJlc3MgLSB0aGlzX3NlZ21lbnQ7Ci0KLSAgLyogSWYgeW91IHN1YnRyYWN0IHBzZWcgZnJvbSB0aGUgY3VycmVudCBlbmQgb2YgdGhlIHN0YWNrLAotICAgICB5b3UgZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBwcmV2aW91cyBzdGFjayBzZWdtZW50J3MgZW5kLgotICAgICBUaGlzIHNlZW1zIGEgbGl0dGxlIGNvbnZvbHV0ZWQgdG8gbWUsIGJ1dCBJJ2xsIGJldCB5b3Ugc2F2ZQotICAgICBhIGN5Y2xlIHNvbWV3aGVyZS4gICovCi0KLSAgd2hpbGUgKHBzZWcgIT0gMCkKLSAgICB7Ci0jaWZkZWYgREVCVUdfSTAwQUZVTkMKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiUwMTFvICUwMTFvXG4iLCBwc2VnLCBzaXplKTsKLSNlbmRpZgotICAgICAgc3RrbCA9IHN0a2wgLSBwc2VnOwotICAgICAgc3NwdHIgPSAoc3RydWN0IHN0YWNrX3NlZ21lbnRfbGlua2FnZSAqKSBzdGtsOwotICAgICAgc2l6ZSA9IHNzcHRyLT5zc3NpemU7Ci0gICAgICBwc2VnID0gc3NwdHItPnNzcHNlZzsKLSAgICAgIHJlc3VsdCArPSBzaXplOwotICAgIH0KLSAgcmV0dXJuIChyZXN1bHQpOwotfQotCi0jZW5kaWYgLyogbm90IENSQVkyICovCi0jZW5kaWYgLyogQ1JBWSAqLwotCi0jZW5kaWYgLyogbm8gYWxsb2NhICovCi0jZW5kaWYgLyogbm90IEdDQyB2ZXJzaW9uIDIgKi8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hcmd2LmMgYi9saWJpYmVydHkvYXJndi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWMxN2U5Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9hcmd2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyogQ3JlYXRlIGFuZCBkZXN0cm95IGFyZ3VtZW50IHZlY3RvcnMgKGFyZ3YncykKLSAgIENvcHlyaWdodCAoQykgMTk5MiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgRnJlZCBGaXNoIEAgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotLyogIENyZWF0ZSBhbmQgZGVzdHJveSBhcmd1bWVudCB2ZWN0b3JzLiAgQW4gYXJndW1lbnQgdmVjdG9yIGlzIHNpbXBseSBhbgotICAgIGFycmF5IG9mIHN0cmluZyBwb2ludGVycywgdGVybWluYXRlZCBieSBhIE5VTEwgcG9pbnRlci4gKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZmRlZiBpc3NwYWNlCi0jdW5kZWYgaXNzcGFjZQotI2VuZGlmCi0jZGVmaW5lIGlzc3BhY2UoY2gpICgoY2gpID09ICcgJyB8fCAoY2gpID09ICdcdCcpCi0KLS8qICBSb3V0aW5lcyBpbXBvcnRlZCBmcm9tIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJpZXMuICovCi0KLSNpZmRlZiBfX1NURENfXwotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWVtY3B5ICh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKTsJLyogNC4xMS4yLjEgKi8KLWV4dGVybiBzaXplX3Qgc3RybGVuIChjb25zdCBjaGFyICpzKTsJCQkJLyogNC4xMS42LjMgKi8KLWV4dGVybiB2b2lkICptYWxsb2MgKHNpemVfdCBzaXplKTsJCQkJLyogNC4xMC4zLjMgKi8KLWV4dGVybiB2b2lkICpyZWFsbG9jICh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsJCQkvKiA0LjEwLjMuNCAqLwotZXh0ZXJuIHZvaWQgZnJlZSAodm9pZCAqcHRyKTsJCQkJCS8qIDQuMTAuMy4yICovCi1leHRlcm4gY2hhciAqc3RyZHVwIChjb25zdCBjaGFyICpzKTsJCQkJLyogTm9uLUFOU0kgKi8KLQotI2Vsc2UJLyogIV9fU1REQ19fICovCi0KLSNpZiAhZGVmaW5lZCBfV0lOMzIgfHwgZGVmaW5lZCBfX0dOVUNfXwotZXh0ZXJuIGNoYXIgKm1lbWNweSAoKTsJCS8qIENvcHkgbWVtb3J5IHJlZ2lvbiAqLwotZXh0ZXJuIGludCBzdHJsZW4gKCk7CQkvKiBDb3VudCBsZW5ndGggb2Ygc3RyaW5nICovCi1leHRlcm4gY2hhciAqbWFsbG9jICgpOwkJLyogU3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRlciAqLwotZXh0ZXJuIGNoYXIgKnJlYWxsb2MgKCk7CS8qIFN0YW5kYXJkIG1lbW9yeSByZWFsbG9jYXRvciAqLwotZXh0ZXJuIHZvaWQgZnJlZSAoKTsJCS8qIEZyZWUgbWFsbG9jJ2QgbWVtb3J5ICovCi1leHRlcm4gY2hhciAqc3RyZHVwICgpOwkJLyogRHVwbGljYXRlIGEgc3RyaW5nICovCi0jZW5kaWYKLQotI2VuZGlmCS8qIF9fU1REQ19fICovCi0KLSNpbmNsdWRlICJhbGxvY2EtY29uZi5oIgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAwCi0jZW5kaWYKLQotI2lmbmRlZiBFT1MKLSNkZWZpbmUgRU9TICdcMCcKLSNlbmRpZgotCi0jZGVmaW5lIElOSVRJQUxfTUFYQVJHQyA4CS8qIE51bWJlciBvZiBhcmdzICsgTlVMTCBpbiBpbml0aWFsIGFyZ3YgKi8KLQotCi0vKgotCi1OQU1FCi0KLQlkdXBhcmd2IC0tIGR1cGxpY2F0ZSBhbiBhcmd1bWVudCB2ZWN0b3IKLQotU1lOT1BTSVMKLQotCWNoYXIgKipkdXBhcmd2ICh2ZWN0b3IpCi0JY2hhciAqKnZlY3RvcjsKLQotREVTQ1JJUFRJT04KLQotCUR1cGxpY2F0ZSBhbiBhcmd1bWVudCB2ZWN0b3IuICBTaW1wbHkgc2NhbnMgdGhyb3VnaCB0aGUKLQl2ZWN0b3IsIGR1cGxpY2F0aW5nIGVhY2ggYXJndW1lbnQgdW50aWwgdGhlCi0JdGVybWluYXRpbmcgTlVMTCBpcyBmb3VuZC4KLQotUkVUVVJOUwotCi0JUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFyZ3VtZW50IHZlY3RvciBpZgotCXN1Y2Nlc3NmdWwuIFJldHVybnMgTlVMTCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvCi0JY29tcGxldGUgYnVpbGRpbmcgdGhlIGFyZ3VtZW50IHZlY3Rvci4KLQotKi8KLQotY2hhciAqKgotZHVwYXJndiAoYXJndikKLSAgICAgY2hhciAqKmFyZ3Y7Ci17Ci0gIGludCBhcmdjOwotICBjaGFyICoqY29weTsKLSAgCi0gIGlmIChhcmd2ID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIAotICAvKiB0aGUgdmVjdG9yICovCi0gIGZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY10gIT0gTlVMTDsgYXJnYysrKTsKLSAgY29weSA9IChjaGFyICoqKSBtYWxsb2MgKChhcmdjICsgMSkgKiBzaXplb2YgKGNoYXIgKikpOwotICBpZiAoY29weSA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotICAKLSAgLyogdGhlIHN0cmluZ3MgKi8KLSAgZm9yIChhcmdjID0gMDsgYXJndlthcmdjXSAhPSBOVUxMOyBhcmdjKyspCi0gICAgewotICAgICAgaW50IGxlbiA9IHN0cmxlbiAoYXJndlthcmdjXSk7Ci0gICAgICBjb3B5W2FyZ2NdID0gbWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiAobGVuICsgMSkpOwotICAgICAgaWYgKGNvcHlbYXJnY10gPT0gTlVMTCkKLQl7Ci0JICBmcmVlYXJndiAoY29weSk7Ci0JICByZXR1cm4gTlVMTDsKLQl9Ci0gICAgICBzdHJjcHkgKGNvcHlbYXJnY10sIGFyZ3ZbYXJnY10pOwotICAgIH0KLSAgY29weVthcmdjXSA9IE5VTEw7Ci0gIHJldHVybiBjb3B5OwotfQotCi0vKgotCi1OQU1FCi0KLQlmcmVlYXJndiAtLSBmcmVlIGFuIGFyZ3VtZW50IHZlY3RvcgotCi1TWU5PUFNJUwotCi0Jdm9pZCBmcmVlYXJndiAodmVjdG9yKQotCWNoYXIgKip2ZWN0b3I7Ci0KLURFU0NSSVBUSU9OCi0KLQlGcmVlIGFuIGFyZ3VtZW50IHZlY3RvciB0aGF0IHdhcyBidWlsdCB1c2luZyBidWlsZGFyZ3YuICBTaW1wbHkgc2NhbnMKLQl0aHJvdWdoIHRoZSB2ZWN0b3IsIGZyZWVpbmcgdGhlIG1lbW9yeSBmb3IgZWFjaCBhcmd1bWVudCB1bnRpbCB0aGUKLQl0ZXJtaW5hdGluZyBOVUxMIGlzIGZvdW5kLCBhbmQgdGhlbiBmcmVlcyB0aGUgdmVjdG9yIGl0c2VsZi4KLQotUkVUVVJOUwotCi0JTm8gdmFsdWUuCi0KLSovCi0KLXZvaWQgZnJlZWFyZ3YgKHZlY3RvcikKLWNoYXIgKip2ZWN0b3I7Ci17Ci0gIHJlZ2lzdGVyIGNoYXIgKipzY2FuOwotCi0gIGlmICh2ZWN0b3IgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKHNjYW4gPSB2ZWN0b3I7ICpzY2FuICE9IE5VTEw7IHNjYW4rKykKLQl7Ci0JICBmcmVlICgqc2Nhbik7Ci0JfQotICAgICAgZnJlZSAodmVjdG9yKTsKLSAgICB9Ci19Ci0KLS8qCi0KLU5BTUUKLQotCWJ1aWxkYXJndiAtLSBidWlsZCBhbiBhcmd1bWVudCB2ZWN0b3IgZnJvbSBhIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY2hhciAqKmJ1aWxkYXJndiAoc3ApCi0JY2hhciAqc3A7Ci0KLURFU0NSSVBUSU9OCi0KLQlHaXZlbiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcsIHBhcnNlIHRoZSBzdHJpbmcgZXh0cmFjdGluZyBmaWVsZHMKLQlzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSBhbmQgb3B0aW9uYWxseSBlbmNsb3NlZCB3aXRoaW4gZWl0aGVyIHNpbmdsZQotCW9yIGRvdWJsZSBxdW90ZXMgKHdoaWNoIGFyZSBzdHJpcHBlZCBvZmYpLCBhbmQgYnVpbGQgYSB2ZWN0b3Igb2YKLQlwb2ludGVycyB0byBjb3BpZXMgb2YgdGhlIHN0cmluZyBmb3IgZWFjaCBmaWVsZC4gIFRoZSBpbnB1dCBzdHJpbmcKLQlyZW1haW5zIHVuY2hhbmdlZC4KLQotCUFsbCBvZiB0aGUgbWVtb3J5IGZvciB0aGUgcG9pbnRlciBhcnJheSBhbmQgY29waWVzIG9mIHRoZSBzdHJpbmcKLQlpcyBvYnRhaW5lZCBmcm9tIG1hbGxvYy4gIEFsbCBvZiB0aGUgbWVtb3J5IGNhbiBiZSByZXR1cm5lZCB0byB0aGUKLQlzeXN0ZW0gd2l0aCB0aGUgc2luZ2xlIGZ1bmN0aW9uIGNhbGwgZnJlZWFyZ3YsIHdoaWNoIHRha2VzIHRoZQotCXJldHVybmVkIHJlc3VsdCBvZiBidWlsZGFyZ3YsIGFzIGl0J3MgYXJndW1lbnQuCi0KLQlUaGUgbWVtb3J5IGZvciB0aGUgYXJndiBhcnJheSBpcyBkeW5hbWljYWxseSBleHBhbmRlZCBhcyBuZWNlc3NhcnkuCi0KLVJFVFVSTlMKLQotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCB2ZWN0b3IgaWYgc3VjY2Vzc2Z1bC4gUmV0dXJucyBOVUxMCi0JaWYgdGhlIGlucHV0IHN0cmluZyBwb2ludGVyIGlzIE5VTEwgb3IgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50Ci0JbWVtb3J5IHRvIGNvbXBsZXRlIGJ1aWxkaW5nIHRoZSBhcmd1bWVudCB2ZWN0b3IuCi0KLU5PVEVTCi0KLQlJbiBvcmRlciB0byBwcm92aWRlIGEgd29ya2luZyBidWZmZXIgZm9yIGV4dHJhY3RpbmcgYXJndW1lbnRzIGludG8sCi0Jd2l0aCBhcHByb3ByaWF0ZSBzdHJpcHBpbmcgb2YgcXVvdGVzIGFuZCB0cmFuc2xhdGlvbiBvZiBiYWNrc2xhc2gKLQlzZXF1ZW5jZXMsIHdlIGFsbG9jYXRlIGEgd29ya2luZyBidWZmZXIgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgaW5wdXQKLQlzdHJpbmcuICBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggc3BhY2UgaW4gd2hpY2ggdG8KLQl3b3JrLCBzaW5jZSB0aGUgZXh0cmFjdGVkIGFyZyBpcyBuZXZlciBsYXJnZXIgdGhhbiB0aGUgaW5wdXQgc3RyaW5nLgotCi0JSWYgdGhlIGlucHV0IGlzIGEgbnVsbCBzdHJpbmcgKGFzIG9wcG9zZWQgdG8gYSBOVUxMIHBvaW50ZXIpLCB0aGVuCi0JYnVpbGRhcmcgcmV0dXJucyBhbiBhcmd2IHRoYXQgaGFzIG9uZSBhcmcsIGEgbnVsbCBzdHJpbmcuCi0KLQlBcmd2IGlzIGFsd2F5cyBrZXB0IHRlcm1pbmF0ZWQgd2l0aCBhIE5VTEwgYXJnIHBvaW50ZXIsIHNvIGl0IGNhbgotCWJlIHBhc3NlZCB0byBmcmVlYXJndiBhdCBhbnkgdGltZSwgb3IgcmV0dXJuZWQsIGFzIGFwcHJvcHJpYXRlLgotKi8KLQotY2hhciAqKmJ1aWxkYXJndiAoaW5wdXQpCi1jaGFyICppbnB1dDsKLXsKLSAgY2hhciAqYXJnOwotICBjaGFyICpjb3B5YnVmOwotICBpbnQgc3F1b3RlID0gMDsKLSAgaW50IGRxdW90ZSA9IDA7Ci0gIGludCBic3F1b3RlID0gMDsKLSAgaW50IGFyZ2MgPSAwOwotICBpbnQgbWF4YXJnYyA9IDA7Ci0gIGNoYXIgKiphcmd2ID0gTlVMTDsKLSAgY2hhciAqKm5hcmd2OwotCi0gIGlmIChpbnB1dCAhPSBOVUxMKQotICAgIHsKLSAgICAgIGNvcHlidWYgPSAoY2hhciAqKSBhbGxvY2EgKHN0cmxlbiAoaW5wdXQpICsgMSk7Ci0gICAgICAvKiBJcyBhIGRve313aGlsZSB0byBhbHdheXMgZXhlY3V0ZSB0aGUgbG9vcCBvbmNlLiAgQWx3YXlzIHJldHVybiBhbgotCSBhcmd2LCBldmVuIGZvciBudWxsIHN0cmluZ3MuICBTZWUgTk9URVMgYWJvdmUsIHRlc3QgY2FzZSBiZWxvdy4gKi8KLSAgICAgIGRvCi0JewotCSAgLyogUGljayBvZmYgYXJndlthcmdjXSAqLwotCSAgd2hpbGUgKGlzc3BhY2UgKCppbnB1dCkpCi0JICAgIHsKLQkgICAgICBpbnB1dCsrOwotCSAgICB9Ci0JICBpZiAoKG1heGFyZ2MgPT0gMCkgfHwgKGFyZ2MgPj0gKG1heGFyZ2MgLSAxKSkpCi0JICAgIHsKLQkgICAgICAvKiBhcmd2IG5lZWRzIGluaXRpYWxpemF0aW9uLCBvciBleHBhbnNpb24gKi8KLQkgICAgICBpZiAoYXJndiA9PSBOVUxMKQotCQl7Ci0JCSAgbWF4YXJnYyA9IElOSVRJQUxfTUFYQVJHQzsKLQkJICBuYXJndiA9IChjaGFyICoqKSBtYWxsb2MgKG1heGFyZ2MgKiBzaXplb2YgKGNoYXIgKikpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgbWF4YXJnYyAqPSAyOwotCQkgIG5hcmd2ID0gKGNoYXIgKiopIHJlYWxsb2MgKGFyZ3YsIG1heGFyZ2MgKiBzaXplb2YgKGNoYXIgKikpOwotCQl9Ci0JICAgICAgaWYgKG5hcmd2ID09IE5VTEwpCi0JCXsKLQkJICBpZiAoYXJndiAhPSBOVUxMKQotCQkgICAgewotCQkgICAgICBmcmVlYXJndiAoYXJndik7Ci0JCSAgICAgIGFyZ3YgPSBOVUxMOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgYXJndiA9IG5hcmd2OwotCSAgICAgIGFyZ3ZbYXJnY10gPSBOVUxMOwotCSAgICB9Ci0JICAvKiBCZWdpbiBzY2FubmluZyBhcmcgKi8KLQkgIGFyZyA9IGNvcHlidWY7Ci0JICB3aGlsZSAoKmlucHV0ICE9IEVPUykKLQkgICAgewotCSAgICAgIGlmIChpc3NwYWNlICgqaW5wdXQpICYmICFzcXVvdGUgJiYgIWRxdW90ZSAmJiAhYnNxdW90ZSkKLQkJewotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgaWYgKGJzcXVvdGUpCi0JCSAgICB7Ci0JCSAgICAgIGJzcXVvdGUgPSAwOwotCQkgICAgICAqYXJnKysgPSAqaW5wdXQ7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAoKmlucHV0ID09ICdcXCcpCi0JCSAgICB7Ci0JCSAgICAgIGJzcXVvdGUgPSAxOwotCQkgICAgfQotCQkgIGVsc2UgaWYgKHNxdW90ZSkKLQkJICAgIHsKLQkJICAgICAgaWYgKCppbnB1dCA9PSAnXCcnKQotCQkJewotCQkJICBzcXVvdGUgPSAwOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgICphcmcrKyA9ICppbnB1dDsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlIGlmIChkcXVvdGUpCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqaW5wdXQgPT0gJyInKQotCQkJewotCQkJICBkcXVvdGUgPSAwOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgICphcmcrKyA9ICppbnB1dDsKLQkJCX0KLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGlmICgqaW5wdXQgPT0gJ1wnJykKLQkJCXsKLQkJCSAgc3F1b3RlID0gMTsKLQkJCX0KLQkJICAgICAgZWxzZSBpZiAoKmlucHV0ID09ICciJykKLQkJCXsKLQkJCSAgZHF1b3RlID0gMTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICAqYXJnKysgPSAqaW5wdXQ7Ci0JCQl9Ci0JCSAgICB9Ci0JCSAgaW5wdXQrKzsKLQkJfQotCSAgICB9Ci0JICAqYXJnID0gRU9TOwotCSAgYXJndlthcmdjXSA9IHN0cmR1cCAoY29weWJ1Zik7Ci0JICBpZiAoYXJndlthcmdjXSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnJlZWFyZ3YgKGFyZ3YpOwotCSAgICAgIGFyZ3YgPSBOVUxMOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBhcmdjKys7Ci0JICBhcmd2W2FyZ2NdID0gTlVMTDsKLQotCSAgd2hpbGUgKGlzc3BhY2UgKCppbnB1dCkpCi0JICAgIHsKLQkgICAgICBpbnB1dCsrOwotCSAgICB9Ci0JfQotICAgICAgd2hpbGUgKCppbnB1dCAhPSBFT1MpOwotICAgIH0KLSAgcmV0dXJuIChhcmd2KTsKLX0KLQotI2lmZGVmIE1BSU4KLQotLyogU2ltcGxlIGxpdHRsZSB0ZXN0IGRyaXZlci4gKi8KLQotc3RhdGljIGNoYXIgKnRlc3RzW10gPQotewotICAiYSBzaW1wbGUgY29tbWFuZCBsaW5lIiwKLSAgImFyZyAnZm9vJyBpcyBzaW5nbGUgcXVvdGVkIiwKLSAgImFyZyBcImJhclwiIGlzIGRvdWJsZSBxdW90ZWQiLAotICAiYXJnIFwiZm9vIGJhclwiIGhhcyBlbWJlZGRlZCB3aGl0ZXNwYWNlIiwKLSAgImFyZyAnSmFjayBzYWlkIFxcJ2hpXFwnJyBoYXMgc2luZ2xlIHF1b3RlcyIsCi0gICJhcmcgJ0phY2sgc2FpZCBcXFwiaGlcXFwiJyBoYXMgZG91YmxlIHF1b3RlcyIsCi0gICJhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCBtIG4gbyBwIHEgciBzIHQgdSB2IHcgeCB5IHogMSAyIDMgNCA1IDYgNyA4IDkiLAotICAKLSAgLyogVGhpcyBzaG91bGQgYmUgZXhwYW5kZWQgaW50byBvbmx5IG9uZSBhcmd1bWVudC4gICovCi0gICJ0cmFpbGluZy13aGl0ZXNwYWNlICIsCi0KLSAgIiIsCi0gIE5VTEwKLX07Ci0KLW1haW4gKCkKLXsKLSAgY2hhciAqKmFyZ3Y7Ci0gIGNoYXIgKip0ZXN0OwotICBjaGFyICoqdGFyZ3M7Ci0KLSAgZm9yICh0ZXN0ID0gdGVzdHM7ICp0ZXN0ICE9IE5VTEw7IHRlc3QrKykKLSAgICB7Ci0gICAgICBwcmludGYgKCJidWlsZGFyZ3YoXCIlc1wiKVxuIiwgKnRlc3QpOwotICAgICAgaWYgKChhcmd2ID0gYnVpbGRhcmd2ICgqdGVzdCkpID09IE5VTEwpCi0JewotCSAgcHJpbnRmICgiZmFpbGVkIVxuXG4iKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yICh0YXJncyA9IGFyZ3Y7ICp0YXJncyAhPSBOVUxMOyB0YXJncysrKQotCSAgICB7Ci0JICAgICAgcHJpbnRmICgiXHRcIiVzXCJcbiIsICp0YXJncyk7Ci0JICAgIH0KLQkgIHByaW50ZiAoIlxuIik7Ci0JfQotICAgICAgZnJlZWFyZ3YgKGFyZ3YpOwotICAgIH0KLQotfQotCi0jZW5kaWYJLyogTUFJTiAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2FzcHJpbnRmLmMgYi9saWJpYmVydHkvYXNwcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFhZjMyMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYXNwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qIExpa2Ugc3ByaW50ZiBidXQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIG1hbGxvYydkIHN0b3JhZ2UsIHdoaWNoIG11c3QKLSAgIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU29sdXRpb25zLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZiBkZWZpbmVkIChBTlNJX1BST1RPVFlQRVMpIHx8IGRlZmluZWQgKEFMTU9TVF9TVERDKQotI2RlZmluZSBVU0VfU1REQVJHCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9TVERBUkcKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0KLS8qIFZBUkFSR1MgKi8KLSNpZmRlZiBVU0VfU1REQVJHCi1pbnQKLWFzcHJpbnRmIChjaGFyICoqYnVmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLSNlbHNlCi1pbnQKLWFzcHJpbnRmIChidWYsIGZtdCwgdmFfYWxpc3QpCi0gICAgIGNoYXIgKipidWY7Ci0gICAgIGNvbnN0IGNoYXIgKmZtdDsKLSAgICAgdmFfZGNsCi0jZW5kaWYKLXsKLSAgaW50IHN0YXR1czsKLSAgdmFfbGlzdCBhcDsKLSNpZmRlZiBVU0VfU1REQVJHCi0gIHZhX3N0YXJ0IChhcCwgZm10KTsKLSNlbHNlCi0gIHZhX3N0YXJ0IChhcCk7Ci0jZW5kaWYKLSAgc3RhdHVzID0gdmFzcHJpbnRmIChidWYsIGZtdCwgYXApOwotICB2YV9lbmQgKGFwKTsKLSAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9hdGV4aXQuYyBiL2xpYmliZXJ0eS9hdGV4aXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3ZDk4NS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYXRleGl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKiBXcmFwcGVyIHRvIGltcGxlbWVudCBBTlNJIEMncyBhdGV4aXQgdXNpbmcgU3VuT1MncyBvbl9leGl0LiAqLwotLyogVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIC0tTWlrZSBTdHVtcC4gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9PTl9FWElUCi0KLWludAotYXRleGl0KGYpCi0gICAgIHZvaWQgKCpmKSgpOwotewotICAvKiBJZiB0aGUgc3lzdGVtIGRvZXNuJ3QgcHJvdmlkZSBhIGRlZmluaXRpb24gZm9yIGF0ZXhpdCwgdXNlIG9uX2V4aXQKLSAgICAgaWYgdGhlIHN5c3RlbSBwcm92aWRlcyB0aGF0LiAgKi8KLSAgb25fZXhpdCAoZiwgMCk7Ci0gIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9iYXNlbmFtZS5jIGIvbGliaWJlcnR5L2Jhc2VuYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NDRjODUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Jhc2VuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBSZXR1cm4gdGhlIGJhc2VuYW1lIG9mIGEgcGF0aG5hbWUuCi0gICBUaGlzIGZpbGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICovCi0KLS8qCi1OQU1FCi0JYmFzZW5hbWUgLS0gcmV0dXJuIHBvaW50ZXIgdG8gbGFzdCBjb21wb25lbnQgb2YgYSBwYXRobmFtZQotCi1TWU5PUFNJUwotCWNoYXIgKmJhc2VuYW1lIChjb25zdCBjaGFyICpuYW1lKQotCi1ERVNDUklQVElPTgotCUdpdmVuIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIGEgdHlwaWNhbCBwYXRobmFtZQotCSgvdXNyL3NyYy9jbWQvbHMvbHMuYyBmb3IgZXhhbXBsZSksIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZQotCWxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRobmFtZSAoImxzLmMiIGluIHRoaXMgY2FzZSkuCi0KLUJVR1MKLQlQcmVzdW1lcyBhIFVOSVggc3R5bGUgcGF0aCB3aXRoIFVOSVggc3R5bGUgc2VwYXJhdG9ycy4KLSovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi1jaGFyICoKLWJhc2VuYW1lIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lKysgPT0gJy8nKQotCXsKLQkgIGJhc2UgPSBuYW1lOwotCX0KLSAgICB9Ci0gIHJldHVybiAoY2hhciAqKSBiYXNlOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2JjbXAuYyBiL2xpYmliZXJ0eS9iY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZTQ0MTcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2JjbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qIGJjbXAKLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotCi1OQU1FCi0KLQliY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zCi0KLVNZTk9QU0lTCi0KLQlpbnQgYmNtcCAoY2hhciAqZnJvbSwgY2hhciAqdG8sIGludCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQotCUNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zIGFuZCByZXR1cm4gemVybyBpZiB0aGV5IGFyZSBpZGVudGljYWwsCi0Jbm9uLXplcm8gb3RoZXJ3aXNlLiAgSWYgY291bnQgaXMgemVybywgcmV0dXJuIHplcm8uCi0KLU5PVEVTCi0KLQlObyBndWFyYW50ZWUgaXMgbWFkZSBhYm91dCB0aGUgbm9uLXplcm8gcmV0dXJuZWQgdmFsdWUuICBJbgotCXBhcnRpY3VsYXIsIHRoZSByZXN1bHRzIG1heSBiZSBzaWduZmljYW50bHkgZGlmZmVyZW50IHRoYW4KLQlzdHJjbXAoKSwgd2hlcmUgdGhlIHJldHVybiB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGxlc3MgdGhhbiwKLQllcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8sIGFjY29yZGluZyB0byBsZXhpY29ncmFwaGljYWwKLQlzb3J0aW5nIG9mIHRoZSBjb21wYXJlZCByZWdpb25zLgotCi1CVUdTCi0KLSovCi0KLQotaW50Ci1iY21wIChmcm9tLCB0bywgY291bnQpCi0gIGNoYXIgKmZyb20sICp0bzsKLSAgaW50IGNvdW50OwotewotICBpbnQgcnRudmFsID0gMDsKLQotICB3aGlsZSAoY291bnQtLSA+IDApCi0gICAgewotICAgICAgaWYgKCpmcm9tKysgIT0gKnRvKyspCi0JewotCSAgcnRudmFsID0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAocnRudmFsKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Jjb3B5LmMgYi9saWJpYmVydHkvYmNvcHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1NTM2My4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYmNvcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qIGJjb3B5IC0tIGNvcHkgbWVtb3J5IHJlZ2lvbnMgb2YgYXJiaXRhcnkgbGVuZ3RoCi0KLU5BTUUKLQliY29weSAtLSBjb3B5IG1lbW9yeSByZWdpb25zIG9mIGFyYml0cmFyeSBsZW5ndGgKLQotU1lOT1BTSVMKLQl2b2lkIGJjb3B5IChjaGFyICppbiwgY2hhciAqb3V0LCBpbnQgbGVuZ3RoKQotCi1ERVNDUklQVElPTgotCUNvcHkgTEVOR1RIIGJ5dGVzIGZyb20gbWVtb3J5IHJlZ2lvbiBwb2ludGVkIHRvIGJ5IElOIHRvIG1lbW9yeQotCXJlZ2lvbiBwb2ludGVkIHRvIGJ5IE9VVC4KLQotQlVHUwotCVNpZ25pZmljYW50IHNwZWVkIGltcHJvdmVtZW50cyBjYW4gYmUgbWFkZSBpbiBzb21lIGNhc2VzIGJ5Ci0JaW1wbGVtZW50aW5nIGNvcGllcyBvZiBtdWx0aXBsZSBieXRlcyBzaW11bHRhbmVvdXNseSwgb3IgdW5yb2xsaW5nCi0JdGhlIGNvcHkgbG9vcC4KLQotKi8KLQotdm9pZAotYmNvcHkgKHNyYywgZGVzdCwgbGVuKQotICByZWdpc3RlciBjaGFyICpzcmMsICpkZXN0OwotICBpbnQgbGVuOwotewotICBpZiAoZGVzdCA8IHNyYykKLSAgICB3aGlsZSAobGVuLS0pCi0gICAgICAqZGVzdCsrID0gKnNyYysrOwotICBlbHNlCi0gICAgewotICAgICAgY2hhciAqbGFzdHMgPSBzcmMgKyAobGVuLTEpOwotICAgICAgY2hhciAqbGFzdGQgPSBkZXN0ICsgKGxlbi0xKTsKLSAgICAgIHdoaWxlIChsZW4tLSkKLSAgICAgICAgKihjaGFyICopbGFzdGQtLSA9ICooY2hhciAqKWxhc3RzLS07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2J6ZXJvLmMgYi9saWJpYmVydHkvYnplcm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxNjQ0Yi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvYnplcm8uYworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qIFBvcnRhYmxlIHZlcnNpb24gb2YgYnplcm8gZm9yIHN5c3RlbXMgd2l0aG91dCBpdC4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0vKgotTkFNRQotCWJ6ZXJvIC0tIHplcm8gdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWVkIG1lbW9yeSByZWdpb24KLQotU1lOT1BTSVMKLQl2b2lkIGJ6ZXJvIChjaGFyICp0bywgaW50IGNvdW50KQotCi1ERVNDUklQVElPTgotCVplcm8gQ09VTlQgYnl0ZXMgb2YgbWVtb3J5IHBvaW50ZWQgdG8gYnkgVE8uCi0KLUJVR1MKLQlTaWduaWZpY2FudCBzcGVlZCBlbmhhbmNlbWVudHMgbWF5IGJlIG1hZGUgaW4gc29tZSBlbnZpcm9ubWVudHMKLQlieSB6ZXJvaW5nIG1vcmUgdGhhbiBhIHNpbmdsZSBieXRlIGF0IGEgdGltZSwgb3IgYnkgdW5yb2xsaW5nIHRoZQotCWxvb3AuCi0KLSovCi0KLQotdm9pZAotYnplcm8gKHRvLCBjb3VudCkKLSAgY2hhciAqdG87Ci0gIGludCBjb3VudDsKLXsKLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgICp0bysrID0gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY2FsbG9jLmMgYi9saWJpYmVydHkvY2FsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzBhNzguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NhbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0gCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhpcyBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLVBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLVBUUgotY2FsbG9jIChuZWxlbSwgZWxzaXplKQotICBzaXplX3QgbmVsZW0sIGVsc2l6ZTsKLXsKLSAgcmVnaXN0ZXIgUFRSIHB0cjsgIAotCi0gIGlmIChuZWxlbSA9PSAwIHx8IGVsc2l6ZSA9PSAwKQotICAgIG5lbGVtID0gZWxzaXplID0gMTsKLSAgCi0gIHB0ciA9IG1hbGxvYyAobmVsZW0gKiBlbHNpemUpOwotICBpZiAocHRyKSBiemVybyAocHRyLCBuZWxlbSAqIGVsc2l6ZSk7Ci0gIAotICByZXR1cm4gcHRyOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2Nob29zZS10ZW1wLmMgYi9saWJpYmVydHkvY2hvb3NlLXRlbXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljNzM4Ni4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY2hvb3NlLXRlbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKiBVdGlsaXR5IHRvIHBpY2sgYSB0ZW1wb3JhcnkgZmlsZW5hbWUgcHJlZml4LgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLXdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGV4cG9ydHMgdHdvIGZ1bmN0aW9uczogY2hvb3NlX3RlbXBfYmFzZSBhbmQgbWFrZV90ZW1wX2ZpbGUuICAqLwotCi0vKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYXQgbGVhc3QgdHdvIHBsYWNlczogbGliaWJlcnR5IGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4JLyogTWF5IGdldCBQX3RtcGRpci4gICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfRklMRV9ICi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4gICAvKiBNYXkgZ2V0IFJfT0ssIGV0Yy4gb24gc29tZSBzeXN0ZW1zLiAgKi8KLSNlbmRpZgotCi0jaWZuZGVmIFJfT0sKLSNkZWZpbmUgUl9PSyA0Ci0jZGVmaW5lIFdfT0sgMgotI2RlZmluZSBYX09LIDEKLSNlbmRpZgotCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi1leHRlcm4gaW50IG1rc3RlbXBzICgpOwotCi0jaWZuZGVmIElOX0dDQwotI2lmIGRlZmluZWQgKF9fTVNET1NfXykgfHwgZGVmaW5lZCAoX1dJTjMyKQotI2RlZmluZSBESVJfU0VQQVJBVE9SICdcXCcKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRElSX1NFUEFSQVRPUgotI2RlZmluZSBESVJfU0VQQVJBVE9SICcvJwotI2VuZGlmCi0KLS8qIE9uIE1TRE9TLCB3cml0ZSB0ZW1wIGZpbGVzIGluIGN1cnJlbnQgZGlyCi0gICBiZWNhdXNlIHRoZXJlJ3Mgbm8gcGxhY2UgZWxzZSB3ZSBjYW4gZXhwZWN0IHRvIHVzZS4gICovCi0vKiA/Pz8gQWx0aG91Z2ggdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIHRyaWVkIGFzIGEgbGFzdCByZXNvcnQsCi0gICB0aGlzIGlzIGxlZnQgaW4gc28gdGhhdCBvbiBNU0RPUyBpdCBpcyBwcmVmZXJyZWQgdG8gL3RtcCBvbiB0aGUKLSAgIG9mZiBjaGFuY2UgdGhhdCBzb21lb25lIHJlcXVpcmVzIHRoaXMsIHNpbmNlIHRoYXQgd2FzIHRoZSBwcmV2aW91cwotICAgYmVoYXZpb3VyLiAgKi8KLSNpZmRlZiBfX01TRE9TX18KLSNpZm5kZWYgUF90bXBkaXIKLSNkZWZpbmUgUF90bXBkaXIgIi4iCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBOYW1lIG9mIHRlbXBvcmFyeSBmaWxlLgotICAgbWt0ZW1wIHJlcXVpcmVzIDYgdHJhaWxpbmcgWCdzLiAgKi8KLSNkZWZpbmUgVEVNUF9GSUxFICJjY1hYWFhYWCIKLQotLyogU3Vicm91dGluZSBvZiBjaG9vc2VfdGVtcF9iYXNlLgotICAgSWYgQkFTRSBpcyBub24tTlVMTCwgcmV0dXJuIGl0LgotICAgT3RoZXJ3aXNlIGl0IGNoZWNrcyBpZiBESVIgaXMgYSB1c2FibGUgZGlyZWN0b3J5LgotICAgSWYgc3VjY2VzcywgRElSIGlzIHJldHVybmVkLgotICAgT3RoZXJ3aXNlIE5VTEwgaXMgcmV0dXJuZWQuICAqLwotCi1zdGF0aWMgY2hhciAqCi10cnkgKGRpciwgYmFzZSkKLSAgICAgY2hhciAqZGlyLCAqYmFzZTsKLXsKLSAgaWYgKGJhc2UgIT0gMCkKLSAgICByZXR1cm4gYmFzZTsKLSAgaWYgKGRpciAhPSAwCi0gICAgICAmJiBhY2Nlc3MgKGRpciwgUl9PSyB8IFdfT0sgfCBYX09LKSA9PSAwKQotICAgIHJldHVybiBkaXI7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gYSBwcmVmaXggZm9yIHRlbXBvcmFyeSBmaWxlIG5hbWVzIG9yIE5VTEwgaWYgdW5hYmxlIHRvIGZpbmQgb25lLgotICAgVGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGNob3NlbiBpZiBhbGwgZWxzZSBmYWlscyBzbyB0aGUgcHJvZ3JhbSBpcwotICAgZXhpdGVkIGlmIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBjYW4ndCBiZSBmb3VuZCAobWt0ZW1wIGZhaWxzKS4KLSAgIFRoZSBidWZmZXIgZm9yIHRoZSByZXN1bHQgaXMgb2J0YWluZWQgd2l0aCB4bWFsbG9jLiAKLQotICAgVGhpcyBmdW5jdGlvbiBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgb25seS4gIEl0IHVzZQotICAgaXMgbm90IHJlY29tbWVuZGVkLiAgKi8KLQotY2hhciAqCi1jaG9vc2VfdGVtcF9iYXNlICgpCi17Ci0gIGNoYXIgKmJhc2UgPSAwOwotICBjaGFyICp0ZW1wX2ZpbGVuYW1lOwotICBpbnQgbGVuOwotICBzdGF0aWMgY2hhciB0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotICBzdGF0aWMgY2hhciB1c3J0bXBbXSA9IHsgRElSX1NFUEFSQVRPUiwgJ3UnLCAncycsICdyJywgRElSX1NFUEFSQVRPUiwgJ3QnLCAnbScsICdwJywgMCB9OwotCi0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRNUERJUiIpLCBiYXNlKTsKLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJURU1QIiksIGJhc2UpOwotCi0jaWZkZWYgUF90bXBkaXIKLSAgYmFzZSA9IHRyeSAoUF90bXBkaXIsIGJhc2UpOwotI2VuZGlmCi0KLSAgLyogVHJ5IC91c3IvdG1wLCB0aGVuIC90bXAuICAqLwotICBiYXNlID0gdHJ5ICh1c3J0bXAsIGJhc2UpOwotICBiYXNlID0gdHJ5ICh0bXAsIGJhc2UpOwotIAotICAvKiBJZiBhbGwgZWxzZSBmYWlscywgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSEgICovCi0gIGlmIChiYXNlID09IDApCi0gICAgYmFzZSA9ICIuIjsKLQotICBsZW4gPSBzdHJsZW4gKGJhc2UpOwotICB0ZW1wX2ZpbGVuYW1lID0geG1hbGxvYyAobGVuICsgMSAvKkRJUl9TRVBBUkFUT1IqLwotCQkJICAgKyBzdHJsZW4gKFRFTVBfRklMRSkgKyAxKTsKLSAgc3RyY3B5ICh0ZW1wX2ZpbGVuYW1lLCBiYXNlKTsKLQotICBpZiAobGVuICE9IDAKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbbGVuLTFdICE9ICcvJwotICAgICAgJiYgdGVtcF9maWxlbmFtZVtsZW4tMV0gIT0gRElSX1NFUEFSQVRPUikKLSAgICB0ZW1wX2ZpbGVuYW1lW2xlbisrXSA9IERJUl9TRVBBUkFUT1I7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSArIGxlbiwgVEVNUF9GSUxFKTsKLQotICBta3RlbXAgKHRlbXBfZmlsZW5hbWUpOwotICBpZiAoc3RybGVuICh0ZW1wX2ZpbGVuYW1lKSA9PSAwKQotICAgIGFib3J0ICgpOwotICByZXR1cm4gdGVtcF9maWxlbmFtZTsKLX0KLS8qIFJldHVybiBhIHRlbXBvcmFyeSBmaWxlIG5hbWUgKGFzIGEgc3RyaW5nKSBvciBOVUxMIGlmIHVuYWJsZSB0byBjcmVhdGUKLSAgIG9uZS4gICovCi0KLWNoYXIgKgotbWFrZV90ZW1wX2ZpbGUgKHN1ZmZpeCkKLSAgICAgY2hhciAqc3VmZml4OwotewotICBjaGFyICpiYXNlID0gMDsKLSAgY2hhciAqdGVtcF9maWxlbmFtZTsKLSAgaW50IGJhc2VfbGVuLCBzdWZmaXhfbGVuOwotICBpbnQgZmQ7Ci0gIHN0YXRpYyBjaGFyIHRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07Ci0gIHN0YXRpYyBjaGFyIHVzcnRtcFtdID0geyBESVJfU0VQQVJBVE9SLCAndScsICdzJywgJ3InLCBESVJfU0VQQVJBVE9SLCAndCcsICdtJywgJ3AnLCAwIH07Ci0KLSAgYmFzZSA9IHRyeSAoZ2V0ZW52ICgiVE1QRElSIiksIGJhc2UpOwotICBiYXNlID0gdHJ5IChnZXRlbnYgKCJUTVAiKSwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKGdldGVudiAoIlRFTVAiKSwgYmFzZSk7Ci0KLSNpZmRlZiBQX3RtcGRpcgotICBiYXNlID0gdHJ5IChQX3RtcGRpciwgYmFzZSk7Ci0jZW5kaWYKLQotICAvKiBUcnkgL3Vzci90bXAsIHRoZW4gL3RtcC4gICovCi0gIGJhc2UgPSB0cnkgKHVzcnRtcCwgYmFzZSk7Ci0gIGJhc2UgPSB0cnkgKHRtcCwgYmFzZSk7Ci0gCi0gIC8qIElmIGFsbCBlbHNlIGZhaWxzLCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5ISAgKi8KLSAgaWYgKGJhc2UgPT0gMCkKLSAgICBiYXNlID0gIi4iOwotCi0gIGJhc2VfbGVuID0gc3RybGVuIChiYXNlKTsKLQotICBpZiAoc3VmZml4KQotICAgIHN1ZmZpeF9sZW4gPSBzdHJsZW4gKHN1ZmZpeCk7Ci0gIGVsc2UKLSAgICBzdWZmaXhfbGVuID0gMDsKLQotICB0ZW1wX2ZpbGVuYW1lID0geG1hbGxvYyAoYmFzZV9sZW4gKyAxIC8qRElSX1NFUEFSQVRPUiovCi0JCQkgICArIHN0cmxlbiAoVEVNUF9GSUxFKQotCQkJICAgKyBzdWZmaXhfbGVuICsgMSk7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSwgYmFzZSk7Ci0KLSAgaWYgKGJhc2VfbGVuICE9IDAKLSAgICAgICYmIHRlbXBfZmlsZW5hbWVbYmFzZV9sZW4tMV0gIT0gJy8nCi0gICAgICAmJiB0ZW1wX2ZpbGVuYW1lW2Jhc2VfbGVuLTFdICE9IERJUl9TRVBBUkFUT1IpCi0gICAgdGVtcF9maWxlbmFtZVtiYXNlX2xlbisrXSA9IERJUl9TRVBBUkFUT1I7Ci0gIHN0cmNweSAodGVtcF9maWxlbmFtZSArIGJhc2VfbGVuLCBURU1QX0ZJTEUpOwotCi0gIGlmIChzdWZmaXgpCi0gICAgc3RyY2F0ICh0ZW1wX2ZpbGVuYW1lLCBzdWZmaXgpOwotCi0gIGZkID0gbWtzdGVtcHMgKHRlbXBfZmlsZW5hbWUsIHN1ZmZpeF9sZW4pOwotICAvKiBJZiBta3N0ZW1wcyBmYWlsZWQsIHRoZW4gc29tZXRoaW5nIGJhZCBpcyBoYXBwZW5pbmcuICBNYXliZSB3ZSBzaG91bGQKLSAgICAgaXNzdWUgYSBtZXNzYWdlIGFib3V0IGEgcG9zc2libGUgc2VjdXJpdHkgYXR0YWNrIGluIHByb2dyZXNzPyAgKi8KLSAgaWYgKGZkID09IC0xKQotICAgIGFib3J0ICgpOwotICAvKiBTaW1pbGFybHkgaWYgd2UgY2FuIG5vdCBjbG9zZSB0aGUgZmlsZS4gICovCi0gIGlmIChjbG9zZSAoZmQpKQotICAgIGFib3J0ICgpOwotICByZXR1cm4gdGVtcF9maWxlbmFtZTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jbG9jay5jIGIvbGliaWJlcnR5L2Nsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMjUwOWMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2Nsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiBBTlNJLWNvbXBhdGlibGUgY2xvY2sgZnVuY3Rpb24uCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi1zb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggZmlsZXMKLWNvbXBpbGVkIHdpdGggYSBHTlUgY29tcGlsZXIgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGRvZXMgbm90IGNhdXNlCi10aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi1UaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5Ci10aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX0dFVFJVU0FHRQotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVElNRVMKLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdGltZXMuaD4KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpZmRlZiBfU0NfQ0xLX1RDSwotI2RlZmluZSBHTlVfSFogIHN5c2NvbmYoX1NDX0NMS19UQ0spCi0jZWxzZQotI2lmZGVmIEhaCi0jZGVmaW5lIEdOVV9IWiAgSFoKLSNlbHNlCi0jaWZkZWYgQ0xPQ0tTX1BFUl9TRUMKLSNkZWZpbmUgR05VX0haICBDTE9DS1NfUEVSX1NFQwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBGSVhNRTogc2hvdWxkIGJlIGFibGUgdG8gZGVjbGFyZSBhcyBjbG9ja190LiAqLwotCi1sb25nCi1jbG9jayAoKQotewotI2lmZGVmIEhBVkVfR0VUUlVTQUdFCi0gIHN0cnVjdCBydXNhZ2UgcnVzYWdlOwotCi0gIGdldHJ1c2FnZSAoMCwgJnJ1c2FnZSk7Ci0gIHJldHVybiAocnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfdXRpbWUudHZfdXNlYwotCSAgKyBydXNhZ2UucnVfc3RpbWUudHZfc2VjICogMTAwMDAwMCArIHJ1c2FnZS5ydV9zdGltZS50dl91c2VjKTsKLSNlbHNlCi0jaWZkZWYgSEFWRV9USU1FUwotICBzdHJ1Y3QgdG1zIHRtczsKLQotICB0aW1lcyAoJnRtcyk7Ci0gIHJldHVybiAodG1zLnRtc191dGltZSArIHRtcy50bXNfc3RpbWUpICogKDEwMDAwMDAgLyBHTlVfSFopOwotI2Vsc2UKLSNpZmRlZiBWTVMKLSAgc3RydWN0Ci0gICAgewotICAgICAgaW50IHByb2NfdXNlcl90aW1lOwotICAgICAgaW50IHByb2Nfc3lzdGVtX3RpbWU7Ci0gICAgICBpbnQgY2hpbGRfdXNlcl90aW1lOwotICAgICAgaW50IGNoaWxkX3N5c3RlbV90aW1lOwotICAgIH0gdm1zX3RpbWVzOwotCi0gIHRpbWVzICgmdm1zX3RpbWVzKTsKLSAgcmV0dXJuICh2bXNfdGltZXMucHJvY191c2VyX3RpbWUgKyB2bXNfdGltZXMucHJvY19zeXN0ZW1fdGltZSkgKiAxMDAwMDsKLSNlbHNlCi0gIC8qIEEgZmFsbGJhY2ssIGlmIG5vdGhpbmcgZWxzZSBhdmFpbGFibGUuICovCi0gIHJldHVybiAwOwotI2VuZGlmIC8qIFZNUyAqLwotI2VuZGlmIC8qIEhBVkVfVElNRVMgKi8KLSNlbmRpZiAvKiBIQVZFX0dFVFJVU0FHRSAqLwotfQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uY2F0LmMgYi9saWJpYmVydHkvY29uY2F0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTMyYzguLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmNhdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qIENvbmNhdGVuYXRlIHZhcmlhYmxlIG51bWJlciBvZiBzdHJpbmdzLgotICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTk0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2ggQCBDeWdudXMgU3VwcG9ydAotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKgotCi1OQU1FCi0KLQljb25jYXQgLS0gY29uY2F0ZW5hdGUgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyaW5ncwotCi1TWU5PUFNJUwotCi0JI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLQotCWNoYXIgKmNvbmNhdCAoczEsIHMyLCBzMywgLi4uLCBOVUxMKQotCi1ERVNDUklQVElPTgotCi0JQ29uY2F0ZW5hdGUgYSB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyaW5ncyBhbmQgcmV0dXJuIHRoZSByZXN1bHQKLQlpbiBmcmVzaGx5IG1hbGxvYydkIG1lbW9yeS4KLQotCVJldHVybnMgTlVMTCBpZiBpbnN1ZmZpY2llbnQgbWVtb3J5IGlzIGF2YWlsYWJsZS4gIFRoZSBhcmd1bWVudAotCWxpc3QgaXMgdGVybWluYXRlZCBieSB0aGUgZmlyc3QgTlVMTCBwb2ludGVyIGVuY291bnRlcmVkLiAgUG9pbnRlcnMKLQl0byBlbXB0eSBzdHJpbmdzIGFyZSBpZ25vcmVkLgotCi1OT1RFUwotCi0JVGhpcyBmdW5jdGlvbiB1c2VzIHhtYWxsb2MoKSB3aGljaCBpcyBleHBlY3RlZCB0byBiZSBhIGZyb250IGVuZAotCWZ1bmN0aW9uIHRvIG1hbGxvYygpIHRoYXQgZGVhbHMgd2l0aCBsb3cgbWVtb3J5IHNpdHVhdGlvbnMuICBJbgotCXR5cGljYWwgdXNlLCBpZiBtYWxsb2MoKSByZXR1cm5zIE5VTEwgdGhlbiB4bWFsbG9jKCkgZGl2ZXJ0cyB0byBhbgotCWVycm9yIGhhbmRsZXIgcm91dGluZSB3aGljaCBuZXZlciByZXR1cm5zLCBhbmQgdGh1cyB4bWFsbG9jIHdpbGwKLQluZXZlciByZXR1cm4gYSBOVUxMIHBvaW50ZXIuICBJZiB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHdpc2hlcyB0bwotCWRlYWwgd2l0aCBsb3cgbWVtb3J5IHNpdHVhdGlvbnMgaXRzZWxmLCBpdCBzaG91bGQgc3VwcGx5IGFuIHhtYWxsb2MKLQl0aGF0IGp1c3QgZGlyZWN0bHkgaW52b2tlcyBtYWxsb2MgYW5kIGJsaW5kbHkgcmV0dXJucyB3aGF0ZXZlcgotCW1hbGxvYyByZXR1cm5zLgotKi8KLQotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gc2l6ZV90IHN0cmxlbiAoY29uc3QgY2hhciAqcyk7Ci0jZWxzZQotZXh0ZXJuIGludCBzdHJsZW4gKCk7Ci0jZW5kaWYKLQotI2RlZmluZSBOVUxMUCAoY2hhciAqKTAKLQotLyogVkFSQVJHUyAqLwotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotY2hhciAqCi1jb25jYXQgKGNvbnN0IGNoYXIgKmZpcnN0LCAuLi4pCi0jZWxzZQotY2hhciAqCi1jb25jYXQgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICByZWdpc3RlciBpbnQgbGVuZ3RoOwotICByZWdpc3RlciBjaGFyICpuZXdzdHI7Ci0gIHJlZ2lzdGVyIGNoYXIgKmVuZDsKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqYXJnOwotICB2YV9saXN0IGFyZ3M7Ci0jaWZuZGVmIEFOU0lfUFJPVE9UWVBFUwotICBjb25zdCBjaGFyICpmaXJzdDsKLSNlbmRpZgotCi0gIC8qIEZpcnN0IGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHJlc3VsdCBhbmQgZ2V0IHN1ZmZpY2llbnQgbWVtb3J5LiAqLwotCi0jaWZkZWYgQU5TSV9QUk9UT1RZUEVTCi0gIHZhX3N0YXJ0IChhcmdzLCBmaXJzdCk7Ci0jZWxzZQotICB2YV9zdGFydCAoYXJncyk7Ci0gIGZpcnN0ID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopOwotI2VuZGlmCi0KLSAgaWYgKGZpcnN0ID09IE5VTExQKQotICAgIGxlbmd0aCA9IDA7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBsZW5ndGggPSBzdHJsZW4gKGZpcnN0KTsKLSAgICAgIHdoaWxlICgoYXJnID0gdmFfYXJnIChhcmdzLCBjb25zdCBjaGFyICopKSAhPSBOVUxMUCkKLQl7Ci0JICBsZW5ndGggKz0gc3RybGVuIChhcmcpOwotCX0KLSAgICB9Ci0gIG5ld3N0ciA9IChjaGFyICopIHhtYWxsb2MgKGxlbmd0aCArIDEpOwotICB2YV9lbmQgKGFyZ3MpOwotCi0gIC8qIE5vdyBjb3B5IHRoZSBpbmRpdmlkdWFsIHBpZWNlcyB0byB0aGUgcmVzdWx0IHN0cmluZy4gKi8KLQotICBpZiAobmV3c3RyICE9IE5VTExQKQotICAgIHsKLSNpZmRlZiBBTlNJX1BST1RPVFlQRVMKLSAgICAgIHZhX3N0YXJ0IChhcmdzLCBmaXJzdCk7Ci0jZWxzZQotICAgICAgdmFfc3RhcnQgKGFyZ3MpOwotICAgICAgZmlyc3QgPSB2YV9hcmcgKGFyZ3MsIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLSAgICAgIGVuZCA9IG5ld3N0cjsKLSAgICAgIGlmIChmaXJzdCAhPSBOVUxMUCkKLQl7Ci0JICBhcmcgPSBmaXJzdDsKLQkgIHdoaWxlICgqYXJnKQotCSAgICB7Ci0JICAgICAgKmVuZCsrID0gKmFyZysrOwotCSAgICB9Ci0JICB3aGlsZSAoKGFyZyA9IHZhX2FyZyAoYXJncywgY29uc3QgY2hhciAqKSkgIT0gTlVMTFApCi0JICAgIHsKLQkgICAgICB3aGlsZSAoKmFyZykKLQkJewotCQkgICplbmQrKyA9ICphcmcrKzsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgKmVuZCA9ICdcMDAwJzsKLSAgICAgIHZhX2VuZCAoYXJncyk7Ci0gICAgfQotCi0gIHJldHVybiAobmV3c3RyKTsKLX0KLQotI2lmZGVmIE1BSU4KLQotLyogU2ltcGxlIGxpdHRsZSB0ZXN0IGRyaXZlci4gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLWludAotbWFpbiAoKQotewotICBwcmludGYgKCJcIlwiID0gXCIlc1wiXG4iLCBjb25jYXQgKE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYVwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhIiwgTlVMTFApKTsKLSAgcHJpbnRmICgiXCJhYlwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhIiwgImIiLCBOVUxMUCkpOwotICBwcmludGYgKCJcImFiY1wiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhIiwgImIiLCAiYyIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJjZFwiID0gXCIlc1wiXG4iLCBjb25jYXQgKCJhYiIsICJjZCIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJjZGVcIiA9IFwiJXNcIlxuIiwgY29uY2F0ICgiYWIiLCAiYyIsICJkZSIsIE5VTExQKSk7Ci0gIHByaW50ZiAoIlwiYWJjZGVmXCIgPSBcIiVzXCJcbiIsIGNvbmNhdCAoIiIsICJhIiwgIiIsICJiY2QiLCAiZWYiLCBOVUxMUCkpOwotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlnLmgtdm1zIGIvbGliaWJlcnR5L2NvbmZpZy5oLXZtcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NhYzZhMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnLmgtdm1zCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBORUVEX3N0cmVycm9yCi0jZGVmaW5lIE5FRURfc3RyZXJyb3IKLSNlbmRpZgotI2lmbmRlZiBORUVEX2Jhc2VuYW1lCi0jZGVmaW5lIE5FRURfYmFzZW5hbWUKLSNlbmRpZgotI2lmbmRlZiBORUVEX3BzaWduYWwKLSNkZWZpbmUgTkVFRF9wc2lnbmFsCi0jZW5kaWYKLSNpZm5kZWYgTkVFRF9vbl9leGl0Ci0jZGVmaW5lIE5FRURfb25fZXhpdAotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcuaW4gYi9saWJpYmVydHkvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTcyZDg2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyogY29uZmlnLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIERlZmluZSBpZiB1c2luZyBhbGxvY2EuYy4gICovCi0jdW5kZWYgQ19BTExPQ0EKLQotLyogRGVmaW5lIHRvIG9uZSBvZiBfZ2V0YjY3LCBHRVRCNjcsIGdldGI2NyBmb3IgQ3JheS0yIGFuZCBDcmF5LVlNUCBzeXN0ZW1zLgotICAgVGhpcyBmdW5jdGlvbiBpcyByZXF1aXJlZCBmb3IgYWxsb2NhLmMgc3VwcG9ydCBvbiB0aG9zZSBzeXN0ZW1zLiAgKi8KLSN1bmRlZiBDUkFZX1NUQUNLU0VHX0VORAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgYWxsb2NhLCBhcyBhIGZ1bmN0aW9uIG9yIG1hY3JvLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPGFsbG9jYS5oPiBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgKG5vdCBvbiBVbHRyaXgpLiAgKi8KLSN1bmRlZiBIQVZFX0FMTE9DQV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8c3lzL3dhaXQuaD4gdGhhdCBpcyBQT1NJWC4xIGNvbXBhdGlibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1dBSVRfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgPHZmb3JrLmg+LiAgKi8KLSN1bmRlZiBIQVZFX1ZGT1JLX0gKLQotLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIHBpZF90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogSWYgdXNpbmcgdGhlIEMgaW1wbGVtZW50YXRpb24gb2YgYWxsb2NhLCBkZWZpbmUgaWYgeW91IGtub3cgdGhlCi0gICBkaXJlY3Rpb24gb2Ygc3RhY2sgZ3Jvd3RoIGZvciB5b3VyIHN5c3RlbTsgb3RoZXJ3aXNlIGl0IHdpbGwgYmUKLSAgIGF1dG9tYXRpY2FsbHkgZGVkdWNlZCBhdCBydW4tdGltZS4KLSBTVEFDS19ESVJFQ1RJT04gPiAwID0+IGdyb3dzIHRvd2FyZCBoaWdoZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OIDwgMCA9PiBncm93cyB0b3dhcmQgbG93ZXIgYWRkcmVzc2VzCi0gU1RBQ0tfRElSRUNUSU9OID0gMCA9PiBkaXJlY3Rpb24gb2YgZ3Jvd3RoIHVua25vd24KLSAqLwotI3VuZGVmIFNUQUNLX0RJUkVDVElPTgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIEFOU0kgQyBoZWFkZXIgZmlsZXMuICAqLwotI3VuZGVmIFNURENfSEVBREVSUwotCi0vKiBEZWZpbmUgdmZvcmsgYXMgZm9yayBpZiB2Zm9yayBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiB2Zm9yawotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN5c19lcnJsaXN0IHZhcmlhYmxlLiAgKi8KLSN1bmRlZiBIQVZFX1NZU19FUlJMSVNUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzX25lcnIgdmFyaWFibGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX05FUlIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzeXNfc2lnbGlzdCB2YXJpYWJsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYXNwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQVNQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBhdGV4aXQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQVRFWElUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYmFzZW5hbWUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfQkFTRU5BTUUKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBiY29weSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9CQ09QWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGJ6ZXJvIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0JaRVJPCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgY2FsbG9jIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0NBTExPQwotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGNsb2NrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0NMT0NLCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0cnVzYWdlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFJVU0FHRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGluZGV4IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0lOREVYCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaW5zcXVlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0lOU1FVRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbWNociBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1DSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBtZW1jbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNQ01QCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbWVtY3B5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01FTUNQWQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbW1vdmUgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfTUVNTU9WRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIG1lbXNldCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9NRU1TRVQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBvbl9leGl0IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX09OX0VYSVQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBwc2lnbmFsIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1BTSUdOQUwKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSByYW5kb20gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfUkFORE9NCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVuYW1lIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1JFTkFNRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJpbmRleCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9SSU5ERVgKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzaWdzZXRtYXNrIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NJR1NFVE1BU0sKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RyZHVwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkRVUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cmVycm9yIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkVSUk9SCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RybmNhc2VjbXAgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSTkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJyY2hyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlJDSFIKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJzaWduYWwgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSU0lHTkFMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3Ryc3RyIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUlNUUgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cnRvZCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJUT0QKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJ0b2wgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSVE9MCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RydG91bCBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFJUT1VMCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3lzY29uZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TWVNDT05GCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdGltZXMgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVElNRVMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB0bXBuYW0gZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVE1QTkFNCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdmFzcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZBU1BSSU5URgotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHZmcHJpbnRmIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1ZGUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdnByaW50ZiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9WUFJJTlRGCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgdnNwcmludGYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfVlNQUklOVEYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB3YWl0cGlkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1dBSVRQSUQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvZmlsZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfRklMRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfUEFSQU1fSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TWVNfVElNRV9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9VTklTVERfSApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy50YWJsZSBiL2xpYmliZXJ0eS9jb25maWcudGFibGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTNiMjMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy50YWJsZQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLWNhc2UgIiR7aG9zdH0iIGluCi0gIHJzNjAwMC1pYm0tYWl4My4xIHwgcnM2MDAwLWlibS1haXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFnPW1oLWFpeCA7OwotICAqLSotY3h1eDcqKQkJZnJhZz1taC1jeHV4NyA7OwotICAqLSotZnJlZWJzZDIuMS4qKQlmcmFnPW1oLWZic2QyMSA7OwotICAqLSotZnJlZWJzZDIuMi5bMDEyXSkJZnJhZz1taC1mYnNkMjEgOzsKLSAgaVszNDVdODYtKi13aW5kb3dzKikJZnJhZz1taC13aW5kb3dzIDs7Ci0gICotKi1iZW9zKikJCWZyYWc9bWgtYmVvcyA7OwotZXNhYwotCi1mcmFncz0kZnJhZwotCi0jIElmIHRoZXkgZGlkbid0IHNwZWNpZnkgLS1lbmFibGUtc2hhcmVkLCBkb24ndCBnZW5lcmF0ZSBzaGFyZWQgbGlicy4KLWNhc2UgIiR7ZW5hYmxlX3NoYXJlZH0iIGluCi0gIHllcykgc2hhcmVkPXllcyA7OwotICBubykgc2hhcmVkPW5vIDs7Ci0gICIiKSBzaGFyZWQ9bm8gOzsKLSAgKikgc2hhcmVkPXllcyA7OwotZXNhYwotaWYgWyAiJHtzaGFyZWR9IiA9ICJ5ZXMiIF07IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLSAgICAqLSotY3lnd2luKikJOzsKLSAgICBhbHBoYSotKi1saW51eCopCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtZWxmYWxwaGFwaWMiIDs7Ci0gICAgYXJtKi0qLSopCQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLWFybXBpYyIgOzsKLSAgICBocHBhKi0qLSopCQlmcmFncz0iJHtmcmFnc30gLi4vLi4vY29uZmlnL21oLXBhcGljIiA7OwotICAgIGlbMzQ1Nl04Ni0qLSopCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgteDg2cGljIiA7OwotICAgIHBvd2VycGMqLSotYWl4KikJOzsKLSAgICBwb3dlcnBjKi0qLSopCWZyYWdzPSIke2ZyYWdzfSAuLi8uLi9jb25maWcvbWgtcHBjcGljIiA7OwotICAgICotKi0qKQkJZnJhZ3M9IiR7ZnJhZ3N9IC4uLy4uL2NvbmZpZy9taC0ke2hvc3RfY3B1fXBpYyIgOzsKLSAgZXNhYwotZmkKLQotZWNobyAiIyBXYXJuaW5nOiB0aGlzIGZyYWdtZW50IGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIiA+IHRlbXAtZnJhZwotCi1mb3IgZnJhZyBpbiAke2ZyYWdzfTsgZG8KLSAgY2FzZSAke2ZyYWd9IGluCi0gICAgLi4vKiApCi0gICAgICBpZiBbICR7c3JjZGlyfSA9IC4gXTsgdGhlbgotCVsgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgXSAmJiBmcmFnPS4uLyR7ZnJhZ30KLQlbIC1uICIke3dpdGhfbXVsdGlzcmN0b3B9IiBdICYmIGZyYWc9JHt3aXRoX211bHRpc3JjdG9wfSR7ZnJhZ30KLSAgICAgIGZpCi0gICAgICA7OwotICBlc2FjCi0gIGZyYWc9JHtzcmNkaXJ9LyR7eHNyY2Rpcn1jb25maWcvJGZyYWcKLSAgaWYgWyAtZiAke2ZyYWd9IF07IHRoZW4KLSAgICBlY2hvICJBcHBlbmRpbmcgJHtmcmFnfSB0byB4aG9zdC1ta2ZyYWciCi0gICAgZWNobyAiIyBGb2xsb3dpbmcgZnJhZ21lbnQgY29waWVkIGZyb20gJHtmcmFnfSIgPj4gdGVtcC1mcmFnCi0gICAgY2F0ICR7ZnJhZ30gPj4gdGVtcC1mcmFnCi0gIGZpCi1kb25lCi0KLSMgcmVjb3JkIGlmIHdlIHdhbnQgdG8gYnVpbGQgc2hhcmVkIGxpYnMuCi1pZiBbICIke3NoYXJlZH0iID0gInllcyIgXTsgdGhlbgotICBlY2hvIGVuYWJsZV9zaGFyZWQgPSB5ZXMgPj4gdGVtcC1mcmFnCi1lbHNlCi0gIGVjaG8gZW5hYmxlX3NoYXJlZCA9IG5vID4+IHRlbXAtZnJhZwotZmkKLQotZnJhZz14aG9zdC1ta2ZyYWcKLSR7Q09ORklHX1NIRUxMfSAke2xpYmliZXJ0eV90b3BkaXJ9L21vdmUtaWYtY2hhbmdlIHRlbXAtZnJhZyB4aG9zdC1ta2ZyYWcKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtYWl4IGIvbGliaWJlcnR5L2NvbmZpZy9taC1haXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNjQ1MDUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZy9taC1haXgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMgVGhpcyBmaWxlIGlzIG9ubHkgbmVlZGVkIGJ5IEFJWCAzLjEuCi1IREVGSU5FUyA9IC1EX19JRUVFX0JJR19FTkRJQU4KLQotIyBNb3N0IHJlbGVhc2VzIG9mIEFJWCAzLjEgaW5jbHVkZSBhbiBpbmNvcnJlY3QgaW50ZXJuYWwgdmVyc2lvbiBvZiBjb3B5c2lnbgotIyBpbiBsaWJjLmEgZm9yIHVzZSBieSBzb21lIGxpYmMgcHVibGljIGZ1bmN0aW9ucyBpbmNsdWRpbmcgbW9kZi4gIFRoZSBwdWJsaWMKLSMgdmVyc2lvbiBvZiBjb3B5c2lnbiBpbiBsaWJtLmEgaXMgdXNhYmxlLiAgRm9yIHRoZSBzYWtlIG9mIGxpYmcrKyAod2hpY2gKLSMgdXNlcyBtb2RmKSwgd2UgYWRkIGNvcHlzaWduIGhlcmUuICBTdXBwb3NlZGx5LCB0aGlzIHByb2JsZW0gaXMgZml4ZWQgaW4gQUlYCi0jIDMuMS44IGFuZCBhYm92ZSwgaW5jbHVkaW5nIGFsbCByZWxlYXNlcyBvZiBBSVggMy4yLgotRVhUUkFfT0ZJTEVTID0gY29weXNpZ24ubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1iZW9zIGIvbGliaWJlcnR5L2NvbmZpZy9taC1iZW9zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjc1ZTdkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtYmVvcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBIb3N0IG1ha2VmaWxlIGZyYWdtZW50IGZvciBCZU9TCi0KLSMgVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrIHVudGlsIHRoZSB3aW1weSBkZWZhdWx0IDY0ayBzdGFjawotIyBsaW1pdCBpbiBCZU9TIGlzIGVpdGhlciBpbmNyZWFzZWQgb3IgbWFkZSB1c2VyIHNldHRhYmxlIHNvbWVob3cuCi0jIFRoaXMgcHJvYmFibHkgd29uJ3QgaGFwcGVuIHVudGlsIGFmdGVyIHRoZSBEUjkgcmVsZWFzZS4KLQotRVhUUkFfT0ZJTEVTID0gYWxsb2NhLm8KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWcvbWgtY3h1eDcgYi9saWJpYmVydHkvY29uZmlnL21oLWN4dXg3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTI0YjA4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtY3h1eDcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1IREVGSU5FUyA9IC1ESEFSUklTX0ZMT0FUX0ZPUk1BVApkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC1mYnNkMjEgYi9saWJpYmVydHkvY29uZmlnL21oLWZic2QyMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3NWE3OC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlnL21oLWZic2QyMQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVYVFJBX09GSUxFUz12YXNwcmludGYubwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZy9taC13aW5kb3dzIGIvbGliaWJlcnR5L2NvbmZpZy9taC13aW5kb3dzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmY1Zjc5Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9jb25maWcvbWgtd2luZG93cworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUVYVFJBX09GSUxFUz1hc3ByaW50Zi5vIHN0cmNhc2VjbXAubyBzdHJuY2FzZWNtcC5vIHZhc3ByaW50Zi5vCmRpZmYgLS1naXQgYS9saWJpYmVydHkvY29uZmlndXJlIGIvbGliaWJlcnR5L2NvbmZpZ3VyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDc1NTUxMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsMjg1MCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLXRhcmdldC1zdWJkaXI9U1VCRElSICAgICAgQ29uZmlndXJpbmcgaW4gYSBzdWJkaXJlY3RvcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtY3Jvc3MtaG9zdD1IT1NUICAgICAgICAgICBDb25maWd1cmluZyB3aXRoIGEgY3Jvc3MgY29tcGlsZXIiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLXdpdGgtbmV3bGliICAgICAgICAgICAgICAgICAgICBDb25maWd1cmluZyB3aXRoIG5ld2xpYiIKLQotIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgotIyBUaGUgdmFyaWFibGVzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgdGhlIG9wdGlvbnMsIHdpdGgKLSMgZGFzaGVzIGNoYW5nZWQgdG8gdW5kZXJsaW5lcy4KLWJ1aWxkPU5PTkUKLWNhY2hlX2ZpbGU9Li9jb25maWcuY2FjaGUKLWV4ZWNfcHJlZml4PU5PTkUKLWhvc3Q9Tk9ORQotbm9fY3JlYXRlPQotbm9ub3B0PU5PTkUKLW5vX3JlY3Vyc2lvbj0KLXByZWZpeD1OT05FCi1wcm9ncmFtX3ByZWZpeD1OT05FCi1wcm9ncmFtX3N1ZmZpeD1OT05FCi1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAotc2lsZW50PQotc2l0ZT0KLXNyY2Rpcj0KLXRhcmdldD1OT05FCi12ZXJib3NlPQoteF9pbmNsdWRlcz1OT05FCi14X2xpYnJhcmllcz1OT05FCi1iaW5kaXI9JyR7ZXhlY19wcmVmaXh9L2JpbicKLXNiaW5kaXI9JyR7ZXhlY19wcmVmaXh9L3NiaW4nCi1saWJleGVjZGlyPScke2V4ZWNfcHJlZml4fS9saWJleGVjJwotZGF0YWRpcj0nJHtwcmVmaXh9L3NoYXJlJwotc3lzY29uZmRpcj0nJHtwcmVmaXh9L2V0YycKLXNoYXJlZHN0YXRlZGlyPScke3ByZWZpeH0vY29tJwotbG9jYWxzdGF0ZWRpcj0nJHtwcmVmaXh9L3ZhcicKLWxpYmRpcj0nJHtleGVjX3ByZWZpeH0vbGliJwotaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCi1vbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCi1pbmZvZGlyPScke3ByZWZpeH0vaW5mbycKLW1hbmRpcj0nJHtwcmVmaXh9L21hbicKLQotIyBJbml0aWFsaXplIHNvbWUgb3RoZXIgdmFyaWFibGVzLgotc3ViZGlycz0KLU1GTEFHUz0gTUFLRUZMQUdTPQotU0hFTEw9JHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0KLSMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2hlbGwgaGVyZSBkb2N1bWVudC4KLWFjX21heF9oZXJlX2xpbmVzPTEyCi0KLWFjX3ByZXY9Ci1mb3IgYWNfb3B0aW9uCi1kbwotCi0gICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgotICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgICBldmFsICIkYWNfcHJldj1cJGFjX29wdGlvbiIKLSAgICBhY19wcmV2PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLSAgLSo9KikgYWNfb3B0YXJnPWBlY2hvICIkYWNfb3B0aW9uIiB8IHNlZCAncy9bLV9hLXpBLVowLTldKj0vLydgIDs7Ci0gICopIGFjX29wdGFyZz0gOzsKLSAgZXNhYwotCi0gICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCi0KLSAgY2FzZSAiJGFjX29wdGlvbiIgaW4KLQotICAtYmluZGlyIHwgLS1iaW5kaXIgfCAtLWJpbmRpIHwgLS1iaW5kIHwgLS1iaW4gfCAtLWJpKQotICAgIGFjX3ByZXY9YmluZGlyIDs7Ci0gIC1iaW5kaXI9KiB8IC0tYmluZGlyPSogfCAtLWJpbmRpPSogfCAtLWJpbmQ9KiB8IC0tYmluPSogfCAtLWJpPSopCi0gICAgYmluZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCi0gICAgYWNfcHJldj1idWlsZCA7OwotICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKLSAgICBidWlsZD0iJGFjX29wdGFyZyIgOzsKLQotICAtY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsZSB8IC0tY2FjaGUtZmlsIHwgLS1jYWNoZS1maSBcCi0gIHwgLS1jYWNoZS1mIHwgLS1jYWNoZS0gfCAtLWNhY2hlIHwgLS1jYWNoIHwgLS1jYWMgfCAtLWNhIHwgLS1jKQotICAgIGFjX3ByZXY9Y2FjaGVfZmlsZSA7OwotICAtY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbD0qIHwgLS1jYWNoZS1maT0qIFwKLSAgfCAtLWNhY2hlLWY9KiB8IC0tY2FjaGUtPSogfCAtLWNhY2hlPSogfCAtLWNhY2g9KiB8IC0tY2FjPSogfCAtLWNhPSogfCAtLWM9KikKLSAgICBjYWNoZV9maWxlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkIHwgLS1kYXRhIHwgLS1kYXQgfCAtLWRhKQotICAgIGFjX3ByZXY9ZGF0YWRpciA7OwotICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qIHwgLS1kYXRhPSogfCAtLWRhdD0qIFwKLSAgfCAtLWRhPSopCi0gICAgZGF0YWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtZGlzYWJsZS0qIHwgLS1kaXNhYmxlLSopCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKmRpc2FibGUtLy8nYAotICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KLSAgICBpZiB0ZXN0IC1uICJgZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzL1stYS16QS1aMC05X10vL2cnYCI7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX2ZlYXR1cmU6IGludmFsaWQgZmVhdHVyZSBuYW1lIiAxPiYyOyBleGl0IDE7IH0KLSAgICBmaQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy8tL18vZydgCi0gICAgZXZhbCAiZW5hYmxlXyR7YWNfZmVhdHVyZX09bm8iIDs7Ci0KLSAgLWVuYWJsZS0qIHwgLS1lbmFibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZW5hYmxlLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLWV4ZWMtcHJlZml4IHwgLS1leGVjX3ByZWZpeCB8IC0tZXhlYy1wcmVmaXggfCAtLWV4ZWMtcHJlZmkgXAotICB8IC0tZXhlYy1wcmVmIHwgLS1leGVjLXByZSB8IC0tZXhlYy1wciB8IC0tZXhlYy1wIHwgLS1leGVjLSBcCi0gIHwgLS1leGVjIHwgLS1leGUgfCAtLWV4KQotICAgIGFjX3ByZXY9ZXhlY19wcmVmaXggOzsKLSAgLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWNfcHJlZml4PSogfCAtLWV4ZWMtcHJlZml4PSogfCAtLWV4ZWMtcHJlZmk9KiBcCi0gIHwgLS1leGVjLXByZWY9KiB8IC0tZXhlYy1wcmU9KiB8IC0tZXhlYy1wcj0qIHwgLS1leGVjLXA9KiB8IC0tZXhlYy09KiBcCi0gIHwgLS1leGVjPSogfCAtLWV4ZT0qIHwgLS1leD0qKQotICAgIGV4ZWNfcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCi0gICAgd2l0aF9nYXM9eWVzIDs7Ci0KLSAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUpCi0gICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCi0gICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgotICAgIGNhdCA8PCBFT0YKLVVzYWdlOiBjb25maWd1cmUgW29wdGlvbnNdIFtob3N0XQotT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzIGFmdGVyIGRlc2NyaXB0aW9uc10KLUNvbmZpZ3VyYXRpb246Ci0gIC0tY2FjaGUtZmlsZT1GSUxFICAgICAgIGNhY2hlIHRlc3QgcmVzdWx0cyBpbiBGSUxFCi0gIC0taGVscCAgICAgICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZQotICAtLW5vLWNyZWF0ZSAgICAgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcwotICAtLXF1aWV0LCAtLXNpbGVudCAgICAgICBkbyBub3QgcHJpbnQgXGBjaGVja2luZy4uLicgbWVzc2FnZXMKLSAgLS12ZXJzaW9uICAgICAgICAgICAgICAgcHJpbnQgdGhlIHZlcnNpb24gb2YgYXV0b2NvbmYgdGhhdCBjcmVhdGVkIGNvbmZpZ3VyZQotRGlyZWN0b3J5IGFuZCBmaWxlIG5hbWVzOgotICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KLSAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW3NhbWUgYXMgcHJlZml4XQotICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9iaW5dCi0gIC0tc2JpbmRpcj1ESVIgICAgICAgICAgIHN5c3RlbSBhZG1pbiBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvc2Jpbl0KLSAgLS1saWJleGVjZGlyPURJUiAgICAgICAgcHJvZ3JhbSBleGVjdXRhYmxlcyBpbiBESVIgW0VQUkVGSVgvbGliZXhlY10KLSAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgcmVhZC1vbmx5IGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBkYXRhIGluIERJUgotICAgICAgICAgICAgICAgICAgICAgICAgICBbUFJFRklYL3NoYXJlXQotICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC9ldGNdCi0gIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvY29tXQotICAtLWxvY2Fsc3RhdGVkaXI9RElSICAgICBtb2RpZmlhYmxlIHNpbmdsZS1tYWNoaW5lIGRhdGEgaW4gRElSIFtQUkVGSVgvdmFyXQotICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgaW4gRElSIFtFUFJFRklYL2xpYl0KLSAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgaW4gRElSIFtQUkVGSVgvaW5jbHVkZV0KLSAgLS1vbGRpbmNsdWRlZGlyPURJUiAgICAgQyBoZWFkZXIgZmlsZXMgZm9yIG5vbi1nY2MgaW4gRElSIFsvdXNyL2luY2x1ZGVdCi0gIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9pbmZvXQotICAtLW1hbmRpcj1ESVIgICAgICAgICAgICBtYW4gZG9jdW1lbnRhdGlvbiBpbiBESVIgW1BSRUZJWC9tYW5dCi0gIC0tc3JjZGlyPURJUiAgICAgICAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFtjb25maWd1cmUgZGlyIG9yIC4uXQotICAtLXByb2dyYW0tcHJlZml4PVBSRUZJWCBwcmVwZW5kIFBSRUZJWCB0byBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotICAtLXByb2dyYW0tc3VmZml4PVNVRkZJWCBhcHBlbmQgU1VGRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT1QUk9HUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biBzZWQgUFJPR1JBTSBvbiBpbnN0YWxsZWQgcHJvZ3JhbSBuYW1lcwotRU9GCi0gICAgY2F0IDw8IEVPRgotSG9zdCB0eXBlOgotICAtLWJ1aWxkPUJVSUxEICAgICAgICAgICBjb25maWd1cmUgZm9yIGJ1aWxkaW5nIG9uIEJVSUxEIFtCVUlMRD1IT1NUXQotICAtLWhvc3Q9SE9TVCAgICAgICAgICAgICBjb25maWd1cmUgZm9yIEhPU1QgW2d1ZXNzZWRdCi0gIC0tdGFyZ2V0PVRBUkdFVCAgICAgICAgIGNvbmZpZ3VyZSBmb3IgVEFSR0VUIFtUQVJHRVQ9SE9TVF0KLUZlYXR1cmVzIGFuZCBwYWNrYWdlczoKLSAgLS1kaXNhYmxlLUZFQVRVUkUgICAgICAgZG8gbm90IGluY2x1ZGUgRkVBVFVSRSAoc2FtZSBhcyAtLWVuYWJsZS1GRUFUVVJFPW5vKQotICAtLWVuYWJsZS1GRUFUVVJFWz1BUkddICBpbmNsdWRlIEZFQVRVUkUgW0FSRz15ZXNdCi0gIC0td2l0aC1QQUNLQUdFWz1BUkddICAgIHVzZSBQQUNLQUdFIFtBUkc9eWVzXQotICAtLXdpdGhvdXQtUEFDS0FHRSAgICAgICBkbyBub3QgdXNlIFBBQ0tBR0UgKHNhbWUgYXMgLS13aXRoLVBBQ0tBR0U9bm8pCi0gIC0teC1pbmNsdWRlcz1ESVIgICAgICAgIFggaW5jbHVkZSBmaWxlcyBhcmUgaW4gRElSCi0gIC0teC1saWJyYXJpZXM9RElSICAgICAgIFggbGlicmFyeSBmaWxlcyBhcmUgaW4gRElSCi1FT0YKLSAgICBpZiB0ZXN0IC1uICIkYWNfaGVscCI7IHRoZW4KLSAgICAgIGVjaG8gIi0tZW5hYmxlIGFuZCAtLXdpdGggb3B0aW9ucyByZWNvZ25pemVkOiRhY19oZWxwIgotICAgIGZpCi0gICAgZXhpdCAwIDs7Ci0KLSAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCi0gICAgYWNfcHJldj1ob3N0IDs7Ci0gIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCi0gICAgaG9zdD0iJGFjX29wdGFyZyIgOzsKLQotICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCi0gIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCi0gICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7Ci0gIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCi0gIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKLSAgICBpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmZvZGlyIHwgLS1pbmZvZGlyIHwgLS1pbmZvZGkgfCAtLWluZm9kIHwgLS1pbmZvIHwgLS1pbmYpCi0gICAgYWNfcHJldj1pbmZvZGlyIDs7Ci0gIC1pbmZvZGlyPSogfCAtLWluZm9kaXI9KiB8IC0taW5mb2RpPSogfCAtLWluZm9kPSogfCAtLWluZm89KiB8IC0taW5mPSopCi0gICAgaW5mb2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZGlyIHwgLS1saWJkaXIgfCAtLWxpYmRpIHwgLS1saWJkKQotICAgIGFjX3ByZXY9bGliZGlyIDs7Ci0gIC1saWJkaXI9KiB8IC0tbGliZGlyPSogfCAtLWxpYmRpPSogfCAtLWxpYmQ9KikKLSAgICBsaWJkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAotICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKLSAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKLSAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKLSAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCi0gICAgbGliZXhlY2Rpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCi0gIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IFwKLSAgfCAtLWxvY2FscyB8IC0tbG9jYWwgfCAtLWxvY2EgfCAtLWxvYyB8IC0tbG8pCi0gICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7Ci0gIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAotICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIFwKLSAgfCAtLWxvY2Fscz0qIHwgLS1sb2NhbD0qIHwgLS1sb2NhPSogfCAtLWxvYz0qIHwgLS1sbz0qKQotICAgIGxvY2Fsc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW1hbmRpciB8IC0tbWFuZGlyIHwgLS1tYW5kaSB8IC0tbWFuZCB8IC0tbWFuIHwgLS1tYSB8IC0tbSkKLSAgICBhY19wcmV2PW1hbmRpciA7OwotICAtbWFuZGlyPSogfCAtLW1hbmRpcj0qIHwgLS1tYW5kaT0qIHwgLS1tYW5kPSogfCAtLW1hbj0qIHwgLS1tYT0qIHwgLS1tPSopCi0gICAgbWFuZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1uZnAgfCAtLW5mcCB8IC0tbmYpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KLSAgICB3aXRoX2ZwPW5vIDs7Ci0KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKQotICAgIG5vX2NyZWF0ZT15ZXMgOzsKLQotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpCi0gICAgbm9fcmVjdXJzaW9uPXllcyA7OwotCi0gIC1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGlyIHwgLS1vbGRpbmNsdWRlZGkgfCAtLW9sZGluY2x1ZGVkIFwKLSAgfCAtLW9sZGluY2x1ZGUgfCAtLW9sZGluY2x1ZCB8IC0tb2xkaW5jbHUgfCAtLW9sZGluY2wgfCAtLW9sZGluYyBcCi0gIHwgLS1vbGRpbiB8IC0tb2xkaSB8IC0tb2xkIHwgLS1vbCB8IC0tbykKLSAgICBhY19wcmV2PW9sZGluY2x1ZGVkaXIgOzsKLSAgLW9sZGluY2x1ZGVkaXI9KiB8IC0tb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGk9KiB8IC0tb2xkaW5jbHVkZWQ9KiBcCi0gIHwgLS1vbGRpbmNsdWRlPSogfCAtLW9sZGluY2x1ZD0qIHwgLS1vbGRpbmNsdT0qIHwgLS1vbGRpbmNsPSogfCAtLW9sZGluYz0qIFwKLSAgfCAtLW9sZGluPSogfCAtLW9sZGk9KiB8IC0tb2xkPSogfCAtLW9sPSogfCAtLW89KikKLSAgICBvbGRpbmNsdWRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCi0gICAgYWNfcHJldj1wcmVmaXggOzsKLSAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQotICAgIHByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpIHwgLS1wcm9ncmFtLXByZWYgXAotICB8IC0tcHJvZ3JhbS1wcmUgfCAtLXByb2dyYW0tcHIgfCAtLXByb2dyYW0tcCkKLSAgICBhY19wcmV2PXByb2dyYW1fcHJlZml4IDs7Ci0gIC1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpeD0qIHwgLS1wcm9ncmFtLXByZWZpPSogXAotICB8IC0tcHJvZ3JhbS1wcmVmPSogfCAtLXByb2dyYW0tcHJlPSogfCAtLXByb2dyYW0tcHI9KiB8IC0tcHJvZ3JhbS1wPSopCi0gICAgcHJvZ3JhbV9wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpeCB8IC0tcHJvZ3JhbS1zdWZmaSB8IC0tcHJvZ3JhbS1zdWZmIFwKLSAgfCAtLXByb2dyYW0tc3VmIHwgLS1wcm9ncmFtLXN1IHwgLS1wcm9ncmFtLXMpCi0gICAgYWNfcHJldj1wcm9ncmFtX3N1ZmZpeCA7OwotICAtcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaXg9KiB8IC0tcHJvZ3JhbS1zdWZmaT0qIFwKLSAgfCAtLXByb2dyYW0tc3VmZj0qIHwgLS1wcm9ncmFtLXN1Zj0qIHwgLS1wcm9ncmFtLXN1PSogfCAtLXByb2dyYW0tcz0qKQotICAgIHByb2dyYW1fc3VmZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAotICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKLSAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQotICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OwotICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAotICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCi0gIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKLSAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCi0gIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQotICAgIHNpbGVudD15ZXMgOzsKLQotICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKLSAgICBhY19wcmV2PXNiaW5kaXIgOzsKLSAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKLSAgfCAtLXNiaT0qIHwgLS1zYj0qKQotICAgIHNiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaSBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQgfCAtLXNoYXJlZHN0YXRlIHwgLS1zaGFyZWRzdGF0IHwgLS1zaGFyZWRzdGEgXAotICB8IC0tc2hhcmVkc3QgfCAtLXNoYXJlZHMgfCAtLXNoYXJlZCB8IC0tc2hhcmUgfCAtLXNoYXIgXAotICB8IC0tc2hhIHwgLS1zaCkKLSAgICBhY19wcmV2PXNoYXJlZHN0YXRlZGlyIDs7Ci0gIC1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpcj0qIHwgLS1zaGFyZWRzdGF0ZWRpPSogXAotICB8IC0tc2hhcmVkc3RhdGVkPSogfCAtLXNoYXJlZHN0YXRlPSogfCAtLXNoYXJlZHN0YXQ9KiB8IC0tc2hhcmVkc3RhPSogXAotICB8IC0tc2hhcmVkc3Q9KiB8IC0tc2hhcmVkcz0qIHwgLS1zaGFyZWQ9KiB8IC0tc2hhcmU9KiB8IC0tc2hhcj0qIFwKLSAgfCAtLXNoYT0qIHwgLS1zaD0qKQotICAgIHNoYXJlZHN0YXRlZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zaXRlIHwgLS1zaXRlIHwgLS1zaXQpCi0gICAgYWNfcHJldj1zaXRlIDs7Ci0gIC1zaXRlPSogfCAtLXNpdGU9KiB8IC0tc2l0PSopCi0gICAgc2l0ZT0iJGFjX29wdGFyZyIgOzsKLQotICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQotICAgIGFjX3ByZXY9c3JjZGlyIDs7Ci0gIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCi0gICAgc3JjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGlyIHwgLS1zeXNjb25mZGkgfCAtLXN5c2NvbmZkIHwgLS1zeXNjb25mIFwKLSAgfCAtLXN5c2NvbiB8IC0tc3lzY28gfCAtLXN5c2MgfCAtLXN5cyB8IC0tc3kpCi0gICAgYWNfcHJldj1zeXNjb25mZGlyIDs7Ci0gIC1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpPSogfCAtLXN5c2NvbmZkPSogfCAtLXN5c2NvbmY9KiBcCi0gIHwgLS1zeXNjb249KiB8IC0tc3lzY289KiB8IC0tc3lzYz0qIHwgLS1zeXM9KiB8IC0tc3k9KikKLSAgICBzeXNjb25mZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC10YXJnZXQgfCAtLXRhcmdldCB8IC0tdGFyZ2UgfCAtLXRhcmcgfCAtLXRhciB8IC0tdGEgfCAtLXQpCi0gICAgYWNfcHJldj10YXJnZXQgOzsKLSAgLXRhcmdldD0qIHwgLS10YXJnZXQ9KiB8IC0tdGFyZ2U9KiB8IC0tdGFyZz0qIHwgLS10YXI9KiB8IC0tdGE9KiB8IC0tdD0qKQotICAgIHRhcmdldD0iJGFjX29wdGFyZyIgOzsKLQotICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQotICAgIHZlcmJvc2U9eWVzIDs7Ci0KLSAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMpCi0gICAgZWNobyAiY29uZmlndXJlIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0KLSAgLXdpdGgtKiB8IC0td2l0aC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRoLS8vJyAtZSAncy89LiovLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1fYS16QS1aMC05XS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAgICAgKj0qKSA7OwotICAgICAgKikgYWNfb3B0YXJnPXllcyA7OwotICAgIGVzYWMKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09JyRhY19vcHRhcmcnIiA7OwotCi0gIC13aXRob3V0LSogfCAtLXdpdGhvdXQtKikKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qd2l0aG91dC0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfcGFja2FnZTogaW52YWxpZCBwYWNrYWdlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfcGFja2FnZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJ3aXRoXyR7YWNfcGFja2FnZX09bm8iIDs7Ci0KLSAgLS14KQotICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KLSAgICB3aXRoX3g9eWVzIDs7Ci0KLSAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAotICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQotICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OwotICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAotICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCi0gICAgeF9pbmNsdWRlcz0iJGFjX29wdGFyZyIgOzsKLQotICAteC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllIHwgLS14LWxpYnJhcmkgXAotICB8IC0teC1saWJyYXIgfCAtLXgtbGlicmEgfCAtLXgtbGliciB8IC0teC1saWIgfCAtLXgtbGkgfCAtLXgtbCkKLSAgICBhY19wcmV2PXhfbGlicmFyaWVzIDs7Ci0gIC14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllcz0qIHwgLS14LWxpYnJhcmllPSogfCAtLXgtbGlicmFyaT0qIFwKLSAgfCAtLXgtbGlicmFyPSogfCAtLXgtbGlicmE9KiB8IC0teC1saWJyPSogfCAtLXgtbGliPSogfCAtLXgtbGk9KiB8IC0teC1sPSopCi0gICAgeF9saWJyYXJpZXM9IiRhY19vcHRhcmciIDs7Ci0KLSAgLSopIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogJGFjX29wdGlvbjogaW52YWxpZCBvcHRpb247IHVzZSAtLWhlbHAgdG8gc2hvdyB1c2FnZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgOzsKLQotICAqKQotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19vcHRpb258IHNlZCAncy9bLWEtejAtOS5dLy9nJ2AiOyB0aGVuCi0gICAgICBlY2hvICJjb25maWd1cmU6IHdhcm5pbmc6ICRhY19vcHRpb246IGludmFsaWQgaG9zdCB0eXBlIiAxPiYyCi0gICAgZmkKLSAgICBpZiB0ZXN0ICJ4JG5vbm9wdCIgIT0geE5PTkU7IHRoZW4KLSAgICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG9ubHkgY29uZmlndXJlIGZvciBvbmUgaG9zdCBhbmQgb25lIHRhcmdldCBhdCBhIHRpbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgbm9ub3B0PSIkYWNfb3B0aW9uIgotICAgIDs7Ci0KLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBtaXNzaW5nIGFyZ3VtZW50IHRvIC0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi0jIEZpbGUgZGVzY3JpcHRvciB1c2FnZToKLSMgMCBzdGFuZGFyZCBpbnB1dAotIyAxIGZpbGUgY3JlYXRpb24KLSMgMiBlcnJvcnMgYW5kIHdhcm5pbmdzCi0jIDMgc29tZSBzeXN0ZW1zIG1heSBvcGVuIGl0IHRvIC9kZXYvdHR5Ci0jIDQgdXNlZCBvbiB0aGUgS3Vib3RhIFRpdGFuCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi0jIDUgY29tcGlsZXIgbWVzc2FnZXMgc2F2ZWQgaW4gY29uZmlnLmxvZwotaWYgdGVzdCAiJHNpbGVudCIgPSB5ZXM7IHRoZW4KLSAgZXhlYyA2Pi9kZXYvbnVsbAotZWxzZQotICBleGVjIDY+JjEKLWZpCi1leGVjIDU+Li9jb25maWcubG9nCi0KLWVjaG8gIlwKLVRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCi1ydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgotIiAxPiY1Ci0KLSMgU3RyaXAgb3V0IC0tbm8tY3JlYXRlIGFuZCAtLW5vLXJlY3Vyc2lvbiBzbyB0aGV5IGRvIG5vdCBwaWxlIHVwLgotIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YWNoYXJhY3RlcnMuCi1hY19jb25maWd1cmVfYXJncz0KLWZvciBhY19hcmcKLWRvCi0gIGNhc2UgIiRhY19hcmciIGluCi0gIC1uby1jcmVhdGUgfCAtLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXQgfCAtLW5vLWNyZWEgfCAtLW5vLWNyZSBcCi0gIHwgLS1uby1jciB8IC0tbm8tYykgOzsKLSAgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpbyB8IC0tbm8tcmVjdXJzaSBcCi0gIHwgLS1uby1yZWN1cnMgfCAtLW5vLXJlY3VyIHwgLS1uby1yZWN1IHwgLS1uby1yZWMgfCAtLW5vLXJlIHwgLS1uby1yKSA7OwotICAqIiAiKnwqIgkiKnwqW1xbXF1cflwjXCRcXlwmXCpcKFwpXHtcfVxcXHxcO1w8XD5cP10qKQotICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICckYWNfYXJnJyIgOzsKLSAgKikgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAkYWNfYXJnIiA7OwotICBlc2FjCi1kb25lCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgdGhlc2UgdG8gQyBpZiBhbHJlYWR5IHNldC4gIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkKLSMgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZCBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBGaXhpbmcgTENfTUVTU0FHRVMgcHJldmVudHMgU29sYXJpcyBzaCBmcm9tIHRyYW5zbGF0aW5nIHZhciB2YWx1ZXMgaW4gYHNldCchCi0jIE5vbi1DIExDX0NUWVBFIHZhbHVlcyBicmVhayB0aGUgY3R5cGUgY2hlY2suCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuIExDX0FMTD1DOyBleHBvcnQgTENfQUxMOyBmaQotaWYgdGVzdCAiJHtMQ19NRVNTQUdFUytzZXR9IiA9IHNldDsgdGhlbiBMQ19NRVNTQUdFUz1DOyBleHBvcnQgTENfTUVTU0FHRVM7IGZpCi1pZiB0ZXN0ICIke0xDX0NUWVBFK3NldH0iICAgID0gc2V0OyB0aGVuIExDX0NUWVBFPUM7ICAgIGV4cG9ydCBMQ19DVFlQRTsgICAgZmkKLQotIyBjb25mZGVmcy5oIGF2b2lkcyBPUyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyB0aGF0IERFRlMgY2FuIGV4Y2VlZC4KLXJtIC1yZiBjb25mdGVzdCogY29uZmRlZnMuaAotIyBBSVggY3BwIGxvc2VzIG9uIGFuIGVtcHR5IGZpbGUsIHNvIG1ha2Ugc3VyZSBpdCBjb250YWlucyBhdCBsZWFzdCBhIG5ld2xpbmUuCi1lY2hvID4gY29uZmRlZnMuaAotCi0jIEEgZmlsZW5hbWUgdW5pcXVlIHRvIHRoaXMgcGFja2FnZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGF0Ci0jIGNvbmZpZ3VyZSBpcyBpbiwgd2hpY2ggd2UgY2FuIGxvb2sgZm9yIHRvIGZpbmQgb3V0IGlmIHNyY2RpciBpcyBjb3JyZWN0LgotYWNfdW5pcXVlX2ZpbGU9cGV4ZWN1dGUuYwotCi0jIEZpbmQgdGhlIHNvdXJjZSBmaWxlcywgaWYgbG9jYXRpb24gd2FzIG5vdCBzcGVjaWZpZWQuCi1pZiB0ZXN0IC16ICIkc3JjZGlyIjsgdGhlbgotICBhY19zcmNkaXJfZGVmYXVsdGVkPXllcwotICAjIFRyeSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhpcyBzY3JpcHQsIHRoZW4gaXRzIHBhcmVudC4KLSAgYWNfcHJvZz0kMAotICBhY19jb25mZGlyPWBlY2hvICRhY19wcm9nfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgdGVzdCAieCRhY19jb25mZGlyIiA9ICJ4JGFjX3Byb2ciICYmIGFjX2NvbmZkaXI9LgotICBzcmNkaXI9JGFjX2NvbmZkaXIKLSAgaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gICAgc3JjZGlyPS4uCi0gIGZpCi1lbHNlCi0gIGFjX3NyY2Rpcl9kZWZhdWx0ZWQ9bm8KLWZpCi1pZiB0ZXN0ICEgLXIgJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGU7IHRoZW4KLSAgaWYgdGVzdCAiJGFjX3NyY2Rpcl9kZWZhdWx0ZWQiID0geWVzOyB0aGVuCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkYWNfY29uZmRpciBvciAuLiIgMT4mMjsgZXhpdCAxOyB9Ci0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBzb3VyY2VzIGluICRzcmNkaXIiIDE+JjI7IGV4aXQgMTsgfQotICBmaQotZmkKLXNyY2Rpcj1gZWNobyAiJHtzcmNkaXJ9IiB8IHNlZCAncyVcKFteL11cKS8qJCVcMSUnYAotCi0jIFByZWZlciBleHBsaWNpdGx5IHNlbGVjdGVkIGZpbGUgdG8gYXV0b21hdGljYWxseSBzZWxlY3RlZCBvbmVzLgotaWYgdGVzdCAteiAiJENPTkZJR19TSVRFIjsgdGhlbgotICBpZiB0ZXN0ICJ4JHByZWZpeCIgIT0geE5PTkU7IHRoZW4KLSAgICBDT05GSUdfU0lURT0iJHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZSAkcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZWxzZQotICAgIENPTkZJR19TSVRFPSIkYWNfZGVmYXVsdF9wcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZSIKLSAgZmkKLWZpCi1mb3IgYWNfc2l0ZV9maWxlIGluICRDT05GSUdfU0lURTsgZG8KLSAgaWYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KLSAgICBlY2hvICJsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiCi0gICAgLiAiJGFjX3NpdGVfZmlsZSIKLSAgZmkKLWRvbmUKLQotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLWFjX2V4dD1jCi0jIENGTEFHUyBpcyBub3QgaW4gYWNfY3BwIGJlY2F1c2UgLWcsIC1PLCBldGMuIGFyZSBub3QgdmFsaWQgY3BwIG9wdGlvbnMuCi1hY19jcHA9JyRDUFAgJENQUEZMQUdTJwotYWNfY29tcGlsZT0nJHtDQy1jY30gLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCAxPiY1JwotYWNfbGluaz0nJHtDQy1jY30gLW8gY29uZnRlc3Qke2FjX2V4ZWV4dH0gJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyAxPiY1JwotY3Jvc3NfY29tcGlsaW5nPSRhY19jdl9wcm9nX2NjX2Nyb3NzCi0KLWFjX2V4ZWV4dD0KLWFjX29iamV4dD1vCi1pZiAoZWNobyAidGVzdGluZ1xjIjsgZWNobyAxLDIsMykgfCBncmVwIGMgPi9kZXYvbnVsbDsgdGhlbgotICAjIFN0YXJkZW50IFZpc3RyYSBTVlI0IGdyZXAgbGFja3MgLWUsIHNheXMgZ2hhemlAY2FpcC5ydXRnZXJzLmVkdS4KLSAgaWYgKGVjaG8gLW4gdGVzdGluZzsgZWNobyAxLDIsMykgfCBzZWQgcy8tbi94bi8gfCBncmVwIHhuID4vZGV2L251bGw7IHRoZW4KLSAgICBhY19uPSBhY19jPScKLScgYWNfdD0nCScKLSAgZWxzZQotICAgIGFjX249LW4gYWNfYz0gYWNfdD0KLSAgZmkKLWVsc2UKLSAgYWNfbj0gYWNfYz0nXGMnIGFjX3Q9Ci1maQotCi0KLQotIyBDaGVjayB3aGV0aGVyIC0td2l0aC10YXJnZXQtc3ViZGlyIG9yIC0td2l0aG91dC10YXJnZXQtc3ViZGlyIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF90YXJnZXRfc3ViZGlyK3NldH0iID0gc2V0OyB0aGVuCi0gIHdpdGh2YWw9IiR3aXRoX3RhcmdldF9zdWJkaXIiCi0gIDoKLWZpCi0KLSMgQ2hlY2sgd2hldGhlciAtLXdpdGgtY3Jvc3MtaG9zdCBvciAtLXdpdGhvdXQtY3Jvc3MtaG9zdCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfY3Jvc3NfaG9zdCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9jcm9zc19ob3N0IgotICA6Ci1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLW5ld2xpYiBvciAtLXdpdGhvdXQtbmV3bGliIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9uZXdsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfbmV3bGliIgotICA6Ci1maQotCi0KLWlmIHRlc3QgIiR7c3JjZGlyfSIgPSAiLiI7IHRoZW4KLSAgaWYgdGVzdCAteiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKLSAgZWxzZQotICAgIGlmIHRlc3QgIiR7d2l0aF90YXJnZXRfc3ViZGlyfSIgIT0gIi4iOyB0aGVuCi0gICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uLy4uIgotICAgIGVsc2UKLSAgICAgIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8ke3dpdGhfbXVsdGlzcmN0b3B9Li4iCi0gICAgZmkKLSAgZmkKLWVsc2UKLSAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9Ly4uIgotZmkKLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRsaWJpYmVydHlfdG9wZGlyICRzcmNkaXIvJGxpYmliZXJ0eV90b3BkaXI7IGRvCi0gIGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLXNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC1zaCAtYyIKLSAgICBicmVhawotICBlbGlmIHRlc3QgLWYgJGFjX2Rpci9pbnN0YWxsLnNoOyB0aGVuCi0gICAgYWNfYXV4X2Rpcj0kYWNfZGlyCi0gICAgYWNfaW5zdGFsbF9zaD0iJGFjX2F1eF9kaXIvaW5zdGFsbC5zaCAtYyIKLSAgICBicmVhawotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCi0gIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIGluc3RhbGwtc2ggb3IgaW5zdGFsbC5zaCBpbiAkbGliaWJlcnR5X3RvcGRpciAkc3JjZGlyLyRsaWJpYmVydHlfdG9wZGlyIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1hY19jb25maWdfZ3Vlc3M9JGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzCi1hY19jb25maWdfc3ViPSRhY19hdXhfZGlyL2NvbmZpZy5zdWIKLWFjX2NvbmZpZ3VyZT0kYWNfYXV4X2Rpci9jb25maWd1cmUgIyBUaGlzIHNob3VsZCBiZSBDeWdudXMgY29uZmlndXJlLgotCi0KLQotIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotaWYgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvc3Qgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjU5MTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWhvc3RfYWxpYXM9JGhvc3QKLWNhc2UgIiRob3N0X2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpCi0gICAgaWYgaG9zdF9hbGlhcz1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpIDs7Ci0gICopIGhvc3RfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWhvc3Q9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICRob3N0X2FsaWFzYAotaG9zdF9jcHU9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMS8nYAotaG9zdF92ZW5kb3I9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotaG9zdF9vcz1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGhvc3QiIDE+JjYKLQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTQ6IGNoZWNraW5nIGJ1aWxkIHN5c3RlbSB0eXBlIiA+JjUKLQotYnVpbGRfYWxpYXM9JGJ1aWxkCi1jYXNlICIkYnVpbGRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgYnVpbGRfYWxpYXM9JGhvc3RfYWxpYXMgOzsKLSAgKikgYnVpbGRfYWxpYXM9JG5vbm9wdCA7OwotICBlc2FjIDs7Ci1lc2FjCi0KLWJ1aWxkPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkYnVpbGRfYWxpYXNgCi1idWlsZF9jcHU9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWJ1aWxkX3ZlbmRvcj1gZWNobyAkYnVpbGQgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMi8nYAotYnVpbGRfb3M9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkYnVpbGQiIDE+JjYKLQotaWYgdGVzdCAkaG9zdCAhPSAkYnVpbGQ7IHRoZW4KLSAgYWNfdG9vbF9wcmVmaXg9JHtob3N0X2FsaWFzfS0KLWVsc2UKLSAgYWNfdG9vbF9wcmVmaXg9Ci1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9YXIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9YXI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjQwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIiAmJiBhY19jdl9wcm9nX0FSPSJhciIKLWZpCi1maQotQVI9IiRhY19jdl9wcm9nX0FSIgotaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFSIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY3MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX1JBTkxJQicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19SQU5MSUI9IiR7YWNfdG9vbF9wcmVmaXh9cmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzA0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19SQU5MSUI9IiRSQU5MSUIiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX1JBTkxJQj0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19SQU5MSUIiICYmIGFjX2N2X3Byb2dfUkFOTElCPSI6IgotZmkKLWZpCi1SQU5MSUI9IiRhY19jdl9wcm9nX1JBTkxJQiIKLWlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkUkFOTElCIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBSQU5MSUI9IjoiCi1maQotZmkKLQotCi0jIEZJWE1FOiBXZSB0ZW1wb3JhcmlseSBkZWZpbmUgb3VyIG93biB2ZXJzaW9uIG9mIEFDX1BST0dfQ0MuICBUaGlzIGlzCi0jIGNvcGllZCBmcm9tIGF1dG9jb25mIDIuMTIsIGJ1dCBkb2VzIG5vdCBjYWxsIEFDX1BST0dfQ0NfV09SS1MuICBXZQotIyBhcmUgcHJvYmFibHkgdXNpbmcgYSBjcm9zcyBjb21waWxlciwgd2hpY2ggd2lsbCBub3QgYmUgYWJsZSB0byBmdWxseQotIyBsaW5rIGFuIGV4ZWN1dGFibGUuICBUaGlzIHNob3VsZCByZWFsbHkgYmUgZml4ZWQgaW4gYXV0b2NvbmYKLSMgaXRzZWxmLgotCi0KLQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgZ2NjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc0OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJnY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUNDPSIkYWNfY3ZfcHJvZ19DQyIKLWlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRDQyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjYyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2M7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Nzc5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIHRlc3QgLXogIiRDQyIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODI4OiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Mzc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLSAgYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi0gIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotICBDRkxBR1M9Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODUyOiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci0gIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHQ0M9Ci0gIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCi1maQotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo4ODE6IGNoZWNraW5nIGZvciBQT1NJWGl6ZWQgSVNDIiA+JjUKLWlmIHRlc3QgLWQgL2V0Yy9jb25mL2tjb25maWcuZCAmJgotICBncmVwIF9QT1NJWF9WRVJTSU9OIC91c3IvaW5jbHVkZS9zeXMvdW5pc3RkLmggPi9kZXYvbnVsbCAyPiYxCi10aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgSVNDPXllcyAjIElmIGxhdGVyIHRlc3RzIHdhbnQgdG8gY2hlY2sgZm9yIElTQy4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIF9QT1NJWF9TT1VSQ0UgMQotRU9GCi0KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDQz0iJENDIC1wb3NpeCIKLSAgZWxzZQotICAgIENDPSIkQ0MgLVhwIgotICBmaQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgSVNDPQotZmkKLQotCi0KLQotCi0KLQotIyBGaW5kIGEgZ29vZCBpbnN0YWxsIHByb2dyYW0uICBXZSBwcmVmZXIgYSBDIHByb2dyYW0gKGZhc3RlciksCi0jIHNvIG9uZSBzY3JpcHQgaXMgYXMgZ29vZCBhcyBhbm90aGVyLiAgQnV0IGF2b2lkIHRoZSBicm9rZW4gb3IKLSMgaW5jb21wYXRpYmxlIHZlcnNpb25zOgotIyBTeXNWIC9ldGMvaW5zdGFsbCwgL3Vzci9zYmluL2luc3RhbGwKLSMgU3VuT1MgL3Vzci9ldGMvaW5zdGFsbAotIyBJUklYIC9zYmluL2luc3RhbGwKLSMgQUlYIC9iaW4vaW5zdGFsbAotIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKLSMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncwotIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgotIyAuL2luc3RhbGwsIHdoaWNoIGNhbiBiZSBlcnJvbmVvdXNseSBjcmVhdGVkIGJ5IG1ha2UgZnJvbSAuL2luc3RhbGwuc2guCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo5MTk6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQotaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfSUZTPSIkSUZTIjsgSUZTPSI6IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgotICAgIGNhc2UgIiRhY19kaXIvIiBpbgotICAgIC98Li98Li8vfC9ldGMvKnwvdXNyL3NiaW4vKnwvdXNyL2V0Yy8qfC9zYmluLyp8L3Vzci9hZnN3cy9iaW4vKnwvdXNyL3VjYi8qKSA7OwotICAgICopCi0gICAgICAjIE9TRjEgYW5kIFNDTyBPRFQgMy4wIGhhdmUgdGhlaXIgb3duIG5hbWVzIGZvciBpbnN0YWxsLgotICAgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290Ci0gICAgICAjIGJ5IGRlZmF1bHQuCi0gICAgICBmb3IgYWNfcHJvZyBpbiBnaW5zdGFsbCBzY29pbnN0IGluc3RhbGw7IGRvCi0gICAgICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfcHJvZzsgdGhlbgotCSAgaWYgdGVzdCAkYWNfcHJvZyA9IGluc3RhbGwgJiYKLSAgICAgICAgICAgIGdyZXAgZHNwbXNnICRhY19kaXIvJGFjX3Byb2cgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAgICMgQUlYIGluc3RhbGwuICBJdCBoYXMgYW4gaW5jb21wYXRpYmxlIGNhbGxpbmcgY29udmVudGlvbi4KLQkgICAgOgotCSAgZWxzZQotCSAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhY19kaXIvJGFjX3Byb2cgLWMiCi0JICAgIGJyZWFrIDIKLQkgIGZpCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgIDs7Ci0gICAgZXNhYwotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfSUZTIgotCi1maQotICBpZiB0ZXN0ICIke2FjX2N2X3BhdGhfaW5zdGFsbCtzZXR9IiA9IHNldDsgdGhlbgotICAgIElOU1RBTEw9IiRhY19jdl9wYXRoX2luc3RhbGwiCi0gIGVsc2UKLSAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBXZSBkb24ndCBjYWNoZSBhCi0gICAgIyBwYXRoIGZvciBJTlNUQUxMIHdpdGhpbiBhIHNvdXJjZSBkaXJlY3RvcnksIGJlY2F1c2UgdGhhdCB3aWxsCi0gICAgIyBicmVhayBvdGhlciBwYWNrYWdlcyB1c2luZyB0aGUgY2FjaGUgaWYgdGhhdCBkaXJlY3RvcnkgaXMKLSAgICAjIHJlbW92ZWQsIG9yIGlmIHRoZSBwYXRoIGlzIHJlbGF0aXZlLgotICAgIElOU1RBTEw9IiRhY19pbnN0YWxsX3NoIgotICBmaQotZmkKLWVjaG8gIiRhY190IiIkSU5TVEFMTCIgMT4mNgotCi0jIFVzZSB0ZXN0IC16IGJlY2F1c2UgU3VuT1M0IHNoIG1pc2hhbmRsZXMgYnJhY2VzIGluICR7dmFyLXZhbH0uCi0jIEl0IHRoaW5rcyB0aGUgZmlyc3QgY2xvc2UgYnJhY2UgZW5kcyB0aGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgotdGVzdCAteiAiJElOU1RBTExfUFJPR1JBTSIgJiYgSU5TVEFMTF9QUk9HUkFNPScke0lOU1RBTEx9JwotCi10ZXN0IC16ICIkSU5TVEFMTF9TQ1JJUFQiICYmIElOU1RBTExfU0NSSVBUPScke0lOU1RBTExfUFJPR1JBTX0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX0RBVEEiICYmIElOU1RBTExfREFUQT0nJHtJTlNUQUxMfSAtbSA2NDQnCi0KLQotLiAke3NyY2Rpcn0vY29uZmlnLnRhYmxlCi1ob3N0X21ha2VmaWxlX2ZyYWc9JHtmcmFnfQotCi0KLSMgSXQncyBPSyB0byBjaGVjayBmb3IgaGVhZGVyIGZpbGVzLiAgQWx0aG91Z2ggdGhlIGNvbXBpbGVyIG1heSBub3QgYmUKLSMgYWJsZSB0byBsaW5rIGFueXRoaW5nLCBpdCBoYWQgYmV0dGVyIGJlIGFibGUgdG8gYXQgbGVhc3QgY29tcGlsZQotIyBzb21ldGhpbmcuCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTgwOiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk5NSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAwMTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAxMiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAxODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0iJHtDQy1jY30gLW5vbG9nbyAtRSIKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAyOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci1TeW50YXggRXJyb3IKLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTAzNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENQUD0vbGliL2NwcAotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi0gIENQUD0iJGFjX2N2X3Byb2dfQ1BQIgotZWxzZQotICBhY19jdl9wcm9nX0NQUD0iJENQUCIKLWZpCi1lY2hvICIkYWNfdCIiJENQUCIgMT4mNgotCi1mb3IgYWNfaGRyIGluIHN5cy9maWxlLmggc3lzL3BhcmFtLmggc3RkbGliLmggc3RyaW5nLmggdW5pc3RkLmggc3RyaW5ncy5oIHN5cy90aW1lLmggc3lzL3Jlc291cmNlLmgKLWRvCi1hY19zYWZlPWBlY2hvICIkYWNfaGRyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfaGRyIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDYzOiBjaGVja2luZyBmb3IgJGFjX2hkciIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyXyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTA2OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8JGFjX2hkcj4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MTA3MzogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfaGRyPUhBVkVfYGVjaG8gJGFjX2hkciB8IHNlZCAneSVhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ei4vLSVBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWl9fXyUnYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBzeXMvd2FpdC5oIHRoYXQgaXMgUE9TSVguMSBjb21wYXRpYmxlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTAwOiBjaGVja2luZyBmb3Igc3lzL3dhaXQuaCB0aGF0IGlzIFBPU0lYLjEgY29tcGF0aWJsZSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfaGVhZGVyX3N5c193YWl0X2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMTA1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2lmbmRlZiBXRVhJVFNUQVRVUwotI2RlZmluZSBXRVhJVFNUQVRVUyhzdGF0X3ZhbCkgKCh1bnNpZ25lZCkoc3RhdF92YWwpID4+IDgpCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJVEVECi0jZGVmaW5lIFdJRkVYSVRFRChzdGF0X3ZhbCkgKCgoc3RhdF92YWwpICYgMjU1KSA9PSAwKQotI2VuZGlmCi1pbnQgbWFpbigpIHsKLWludCBzOwotd2FpdCAoJnMpOwotcyA9IFdJRkVYSVRFRCAocykgPyBXRVhJVFNUQVRVUyAocykgOiAxOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3lzX3dhaXRfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N5c193YWl0X2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N5c193YWl0X2giIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zeXNfd2FpdF9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQotRU9GCi0KLWZpCi0KLQotIyBUaGlzIGlzIHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCBsaWJpYmVydHkgd2lsbCBwcm92aWRlIGlmIHRoZXkKLSMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlIGhvc3QuCi0KLWZ1bmNzPSJhc3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgYXRleGl0IgotZnVuY3M9IiRmdW5jcyBiYXNlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgYmNtcCIKLWZ1bmNzPSIkZnVuY3MgYmNvcHkiCi1mdW5jcz0iJGZ1bmNzIGJ6ZXJvIgotZnVuY3M9IiRmdW5jcyBjYWxsb2MiCi1mdW5jcz0iJGZ1bmNzIGNsb2NrIgotZnVuY3M9IiRmdW5jcyBnZXRjd2QiCi1mdW5jcz0iJGZ1bmNzIGdldHBhZ2VzaXplIgotZnVuY3M9IiRmdW5jcyBpbmRleCIKLWZ1bmNzPSIkZnVuY3MgaW5zcXVlIgotZnVuY3M9IiRmdW5jcyBtZW1jaHIiCi1mdW5jcz0iJGZ1bmNzIG1lbWNtcCIKLWZ1bmNzPSIkZnVuY3MgbWVtY3B5IgotZnVuY3M9IiRmdW5jcyBtZW1tb3ZlIgotZnVuY3M9IiRmdW5jcyBtZW1zZXQiCi1mdW5jcz0iJGZ1bmNzIG1rc3RlbXBzIgotZnVuY3M9IiRmdW5jcyByYW5kb20iCi1mdW5jcz0iJGZ1bmNzIHJlbmFtZSIKLWZ1bmNzPSIkZnVuY3MgcmluZGV4IgotZnVuY3M9IiRmdW5jcyBzaWdzZXRtYXNrIgotZnVuY3M9IiRmdW5jcyBzdHJjYXNlY21wIgotZnVuY3M9IiRmdW5jcyBzdHJjaHIiCi1mdW5jcz0iJGZ1bmNzIHN0cmR1cCIKLWZ1bmNzPSIkZnVuY3Mgc3RybmNhc2VjbXAiCi1mdW5jcz0iJGZ1bmNzIHN0cnJjaHIiCi1mdW5jcz0iJGZ1bmNzIHN0cnN0ciIKLWZ1bmNzPSIkZnVuY3Mgc3RydG9kIgotZnVuY3M9IiRmdW5jcyBzdHJ0b2wiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvdWwiCi1mdW5jcz0iJGZ1bmNzIHRtcG5hbSIKLWZ1bmNzPSIkZnVuY3MgdmFzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB2ZnByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdnByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdnNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHdhaXRwaWQiCi0KLSMgQWxzbyBpbiB0aGUgb2xkIGZ1bmN0aW9uLmRlZiBmaWxlOiBhbGxvY2EsIHZmb3JrLCBnZXRvcHQuCi0KLXZhcnM9InN5c19lcnJsaXN0IHN5c19uZXJyIHN5c19zaWdsaXN0IgotCi1jaGVja2Z1bmNzPSJnZXRydXNhZ2Ugb25fZXhpdCBwc2lnbmFsIHN0cmVycm9yIHN0cnNpZ25hbCBzeXNjb25mIHRpbWVzIgotCi0jIFRoZXNlIGFyZSBuZWl0aGVyIGV4ZWN1dGVkIG5vciByZXF1aXJlZCwgYnV0IHRoZXkgaGVscCBrZWVwCi0jIGF1dG9oZWFkZXIgaGFwcHkgd2l0aG91dCBhZGRpbmcgYSBidW5jaCBvZiB0ZXh0IHRvIGFjY29uZmlnLmguCi1pZiB0ZXN0ICJ4IiA9ICJ5IjsgdGhlbgotICBmb3IgYWNfZnVuYyBpbiBhc3ByaW50ZiBhdGV4aXQgYmFzZW5hbWUgYmNtcCBiY29weSBiemVybyBjYWxsb2MgY2xvY2sgZ2V0Y3dkCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTk1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjAwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMjM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gZ2V0cGFnZXNpemUgaW5kZXggaW5zcXVlIG1rc3RlbXBzIG1lbWNociBtZW1jbXAgbWVtY3B5IG1lbW1vdmUKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyNTA6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTI3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICBmb3IgYWNfZnVuYyBpbiBtZW1zZXQgcmFuZG9tIHJlbmFtZSByaW5kZXggc2lnc2V0bWFzayBzdHJjYXNlY21wCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzA1OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzEwICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzMzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gc3RyY2hyIHN0cmR1cCBzdHJuY2FzZWNtcCBzdHJyY2hyIHN0cnN0ciBzdHJ0b2Qgc3RydG9sCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzYwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzY1ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgZm9yIGFjX2Z1bmMgaW4gc3RydG91bCB0bXBuYW0gdmFzcHJpbnRmIHZmcHJpbnRmIHZwcmludGYgdnNwcmludGYgd2FpdHBpZAotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQxNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTQyMCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNDQzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19FUlJMSVNUIDEKLUVPRgotCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19ORVJSIDEKLUVPRgotCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NZU19TSUdMSVNUIDEKLUVPRgotCi0gIGZvciBhY19mdW5jIGluIGdldHJ1c2FnZSBvbl9leGl0IHBzaWduYWwgc3RyZXJyb3Igc3Ryc2lnbmFsIHN5c2NvbmYgdGltZXMKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODI6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0ODcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUxMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotZmkKLQotIyBGb3IgZWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMsIGlmIHRoZSBob3N0IGRvZXMgbm90IHByb3ZpZGUgdGhlCi0jIGZ1bmN0aW9uIHdlIHdhbnQgdG8gcHV0IEZOLm8gaW4gTElCT0JKUywgYW5kIGlmIHRoZSBob3N0IGRvZXMKLSMgcHJvdmlkZSB0aGUgZnVuY3Rpb24sIHdlIHdhbnQgdG8gZGVmaW5lIEhBVkVfRk4gaW4gY29uZmlnLmguICBBbHNvLAotIyBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIGFsbG9jYSwgd2Ugc2V0IEFMTE9DQSB0byBhbGxvY2EubwotCi1zZXRvYmpzPQotaWYgdGVzdCAtbiAiJHt3aXRoX3RhcmdldF9zdWJkaXJ9IjsgdGhlbgotCi0gICMgV2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgYXMgYSB0YXJnZXQgbGlicmFyeS4gIEFDX1JFUExBQ0VfRlVOQ1MKLSAgIyBtYXkgbm90IHdvcmsgY29ycmVjdGx5LCBiZWNhdXNlIHRoZSBjb21waWxlciBtYXkgbm90IGJlIGFibGUgdG8KLSAgIyBsaW5rIGV4ZWN1dGFibGVzLiAgTm90ZSB0aGF0IHdlIG1heSBzdGlsbCBiZSBiZWluZyBjb25maWd1cmVkCi0gICMgbmF0aXZlLgotCi0gICMgSWYgd2UgYXJlIGJlaW5nIGNvbmZpZ3VyZWQgZm9yIG5ld2xpYiwgd2Uga25vdyB3aGljaCBmdW5jdGlvbnMKLSAgIyBuZXdsaWIgcHJvdmlkZSBhbmQgd2hpY2ggb25lcyB3ZSB3aWxsIGJlIGV4cGVjdGVkIHRvIHByb3ZpZGUuCi0KLSAgaWYgdGVzdCAieCR7d2l0aF9uZXdsaWJ9IiA9ICJ4eWVzIjsgdGhlbgotICAgIEFMTE9DQT0iYWxsb2NhLm8iCi0gICAgTElCT0JKUz0iYXNwcmludGYubyBiYXNlbmFtZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmR1cC5vIHZhc3ByaW50Zi5vIgotCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYXNwcmludGYgfCBiYXNlbmFtZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmR1cCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRuIDEKLUVPRgotCi0JICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgbmV3bGliIGRvZXNudCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9udCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KLQotICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgbmV3bGliIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUkVSUk9SIDEKLUVPRgotCi0KLSAgICBzZXRvYmpzPXllcwotCi0gIGZpCi1maQotCi1pZiB0ZXN0IC16ICIke3NldG9ianN9IjsgdGhlbgotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi12eHdvcmtzKikKLSAgICAjIEhhbmRsZSBWeFdvcmtzIGNvbmZpZ3VyYXRpb24gc3BlY2lhbGx5LCBzaW5jZSBvbiBWeFdvcmtzIHRoZQotICAgICMgbGlicmFyaWVzIGFyZSBhY3R1YWxseSBvbiB0aGUgdGFyZ2V0IGJvYXJkLCBub3QgaW4gdGhlIGZpbGUKLSAgICAjIHN5c3RlbS4KLSAgICBMSUJPQkpTPSJiYXNlbmFtZS5vIGdldHBhZ2VzaXplLm8gaW5zcXVlLm8gcmFuZG9tLm8gc3RyY2FzZWNtcC5vIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHN0cm5jYXNlY21wLm8gc3RyZHVwLm8gdmZvcmsubyB3YWl0cGlkLm8gdmFzcHJpbnRmLm8iCi0gICAgZm9yIGYgaW4gJGZ1bmNzOyBkbwotICAgICAgY2FzZSAiJGYiIGluCi0JYmFzZW5hbWUgfCBnZXRwYWdlc2l6ZSB8IGluc3F1ZSB8IHJhbmRvbSB8IHN0cmNhc2VjbXApCi0JICA7OwotCXN0cm5jYXNlY21wIHwgc3RyZHVwIHwgdmZvcmsgfCB3YWl0cGlkIHwgdmFzcHJpbnRmKQotCSAgOzsKLQkqKQotCSAgbj1IQVZFX2BlY2hvICRmIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotCSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBWeFdvcmtzIGRvZXNuJ3QgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBWeFdvcmtzIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUkVSUk9SIDEKLUVPRgotCi0KLSAgICBzZXRvYmpzPXllcwotICAgIDs7Ci0KLSAgZXNhYwotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLQotICBjYXNlICIke2hvc3R9IiBpbgotCi0gICotKi1jeWd3aW4qKQotICAgICMgVGhlIEN5Z3dpbiBsaWJyYXJ5IGFjdHVhbGx5IHVzZXMgYSBjb3VwbGUgb2YgZmlsZXMgZnJvbQotICAgICMgbGliaWJlcnR5IHdoZW4gaXQgaXMgYnVpbHQuICBJZiB3ZSBhcmUgYnVpbGRpbmcgYSBuYXRpdmUKLSAgICAjIEN5Z3dpbiwgYW5kIHdlIHJ1biB0aGUgdGVzdHMsIHdlIHdpbGwgYXBwZWFyIHRvIGhhdmUgdGhlc2UKLSAgICAjIGZpbGVzLiAgSG93ZXZlciwgd2hlbiB3ZSBnbyBvbiB0byBidWlsZCB3aW5zdXAsIHdlIHdpbGwgd2luZCB1cAotICAgICMgd2l0aCBhIGxpYnJhcnkgd2hpY2ggZG9lcyBub3QgaGF2ZSB0aGUgZmlsZXMsIHNpbmNlIHRoZXkgc2hvdWxkCi0gICAgIyBoYXZlIGNvbWUgZnJvbSBsaWJpYmVydHkuCi0KLSAgICAjIFdlIGhhbmRsZSB0aGlzIGJ5IHJlbW92aW5nIHRoZSBmdW5jdGlvbnMgdGhlIHdpbnN1cCBsaWJyYXJ5Ci0gICAgIyBwcm92aWRlcyBmcm9tIG91ciBzaGVsbCB2YXJpYWJsZXMsIHNvIHRoYXQgdGhleSBhcHBlYXIgdG8gYmUKLSAgICAjIG1pc3NpbmcuCi0KLSAgICBmdW5jcz0iYGVjaG8gJGZ1bmNzIHwgc2VkIC1lICdzL3JhbmRvbS8vJ2AiCi0gICAgTElCT0JKUz0iJExJQk9CSlMgcmFuZG9tLm8iCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX3NpZ2xpc3QvLydgIgotICAgIGNoZWNrZnVuY3M9ImBlY2hvICRjaGVja2Z1bmNzIHwgc2VkIC1lICdzL3N0cnNpZ25hbC8vJyAtZSAncy9wc2lnbmFsLy8nYCIKLSAgICA7OwotCi0gICotKi1taW5ndzMyKikKLSAgICAjIFVuZGVyIG1pbmd3MzIsIHN5c19uZXJyIGFuZCBzeXNfZXJybGlzdCBleGlzdCwgYnV0IHRoZXkgYXJlCi0gICAgIyBtYWNyb3MsIHNvIHRoZSB0ZXN0IGJlbG93IHdvbid0IGZpbmQgdGhlbS4KLSAgICB2YXJzPSJgZWNobyAkdmFycyB8IHNlZCAtZSAncy9zeXNfbmVyci8vJyAtZSAncy9zeXNfZXJybGlzdC8vJ2AiCi0gICAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfU1lTX05FUlIgMQotRU9GCi0KLSAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9TWVNfRVJSTElTVCAxCi1FT0YKLQotICAgIDs7Ci0KLSAgKi0qLXV3aW4qKQotICAgICMgVW5kZXIgc29tZSB2ZXJzaW9ucyBvZiB1d2luLCB2Zm9yayBpcyBub3RvcmlvdXNseSBidWdneSBhbmQgdGhlIHRlc3QgCi0gICAgIyBjYW4gaGFuZyBjb25maWd1cmU7IG9uIG90aGVyIHZlcnNpb25zLCB2Zm9yayBleGlzdHMganVzdCBhcyBhIHN0dWIuCi0gICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHZmb3JrIGluIHV3aW4ncyBydW50aW1lIGlzIGZpeGVkLgotICAgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLSAgICA7OwotCi0gIGVzYWMKLQotICAjIFdlIGhhdmVuJ3Qgc2V0IHRoZSBsaXN0IG9mIG9iamVjdHMgeWV0LiAgVXNlIHRoZSBzdGFuZGFyZCBhdXRvY29uZgotICAjIHRlc3RzLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgY29tcGlsZXIgd29ya3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY3MjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMTY4MyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2ODg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTcxNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotICBmb3IgYWNfZnVuYyBpbiAkZnVuY3MKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MjE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3MjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc0OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotTElCT0JKUz0iJExJQk9CSlMgJHthY19mdW5jfS4ke2FjX29iamV4dH0iCi1maQotZG9uZQotCi0KLSAgIyBUaGUgVWx0cml4IDQuMiBtaXBzIGJ1aWx0aW4gYWxsb2NhIGRlY2xhcmVkIGJ5IGFsbG9jYS5oIG9ubHkgd29ya3MKLSMgZm9yIGNvbnN0YW50IGFyZ3VtZW50cy4gIFVzZWxlc3MhCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhbGxvY2EuaCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc3ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9hbGxvY2FfaCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFsbG9jYS5oPgotaW50IG1haW4oKSB7Ci1jaGFyICpwID0gYWxsb2NhKDIgKiBzaXplb2YoaW50KSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTc5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfYWxsb2NhX2g9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfYWxsb2NhX2ggPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfQUxMT0NBX0ggMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MTE6IGNoZWNraW5nIGZvciBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTgxNiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLSNpZmRlZiBfX0dOVUNfXwotIyBkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKLSNlbHNlCi0jIGlmZGVmIF9NU0NfVkVSCi0jICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgIGRlZmluZSBhbGxvY2EgX2FsbG9jYQotIyBlbHNlCi0jICBpZiBIQVZFX0FMTE9DQV9ICi0jICAgaW5jbHVkZSA8YWxsb2NhLmg+Ci0jICBlbHNlCi0jICAgaWZkZWYgX0FJWAotICNwcmFnbWEgYWxsb2NhCi0jICAgZWxzZQotIyAgICBpZm5kZWYgYWxsb2NhIC8qIHByZWRlZmluZWQgYnkgSFAgY2MgK09saWJjYWxscyAqLwotY2hhciAqYWxsb2NhICgpOwotIyAgICBlbmRpZgotIyAgIGVuZGlmCi0jICBlbmRpZgotIyBlbmRpZgotI2VuZGlmCi0KLWludCBtYWluKCkgewotY2hhciAqcCA9IChjaGFyICopIGFsbG9jYSgxKTsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODQ0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX2FsbG9jYV93b3Jrcz15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQSAxCi1FT0YKLQotZmkKLQotaWYgdGVzdCAkYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3MgPSBubzsgdGhlbgotICAjIFRoZSBTVlIzIGxpYlBXIGFuZCBTVlI0IGxpYnVjYiBib3RoIGNvbnRhaW4gaW5jb21wYXRpYmxlIGZ1bmN0aW9ucwotICAjIHRoYXQgY2F1c2UgdHJvdWJsZS4gIFNvbWUgdmVyc2lvbnMgZG8gbm90IGV2ZW4gY29udGFpbiBhbGxvY2Egb3IKLSAgIyBjb250YWluIGEgYnVnZ3kgdmVyc2lvbi4gIElmIHlvdSBzdGlsbCB3YW50IHRvIHVzZSB0aGVpciBhbGxvY2EsCi0gICMgdXNlIGFyIHRvIGV4dHJhY3QgYWxsb2NhLm8gZnJvbSB0aGVtIGluc3RlYWQgb2YgY29tcGlsaW5nIGFsbG9jYS5jLgotICBBTExPQ0E9YWxsb2NhLiR7YWNfb2JqZXh0fQotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgQ19BTExPQ0EgMQotRU9GCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3NjogY2hlY2tpbmcgd2hldGhlciBhbGxvY2EgbmVlZHMgQ3JheSBob29rcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfb3NfY3JheScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE4ODEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2lmIGRlZmluZWQoQ1JBWSkgJiYgISBkZWZpbmVkKENSQVkyKQotd2ViZWNyYXkKLSNlbHNlCi13ZW5vdGJlY3JheQotI2VuZGlmCi0KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAid2ViZWNyYXkiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3Zfb3NfY3JheT1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X29zX2NyYXkiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X29zX2NyYXkgPSB5ZXM7IHRoZW4KLWZvciBhY19mdW5jIGluIF9nZXRiNjcgR0VUQjY3IGdldGI2NzsgZG8KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxOTA2OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTExICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5MzQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgQ1JBWV9TVEFDS1NFR19FTkQgJGFjX2Z1bmMKLUVPRgotCi0gIGJyZWFrCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZG9uZQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2MTogY2hlY2tpbmcgc3RhY2sgZGlyZWN0aW9uIGZvciBDIGFsbG9jYSIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19zdGFja19kaXJlY3Rpb24nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0wCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotZmluZF9zdGFja19kaXJlY3Rpb24gKCkKLXsKLSAgc3RhdGljIGNoYXIgKmFkZHIgPSAwOwotICBhdXRvIGNoYXIgZHVtbXk7Ci0gIGlmIChhZGRyID09IDApCi0gICAgewotICAgICAgYWRkciA9ICZkdW1teTsKLSAgICAgIHJldHVybiBmaW5kX3N0YWNrX2RpcmVjdGlvbiAoKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4gKCZkdW1teSA+IGFkZHIpID8gMSA6IC0xOwotfQotbWFpbiAoKQotewotICBleGl0IChmaW5kX3N0YWNrX2RpcmVjdGlvbigpIDwgMCk7Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk4ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0xCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uPS0xCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbiIgMT4mNgotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgU1RBQ0tfRElSRUNUSU9OICRhY19jdl9jX3N0YWNrX2RpcmVjdGlvbgotRU9GCi0KLWZpCi0KLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwMTA6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwMTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjIwMjM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDU4ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIwNzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBwaWRfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjExNDogY2hlY2tpbmcgZm9yIHBpZF90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3BpZF90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjExOSAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlwaWRfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfcGlkX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9waWRfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX3BpZF90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX3BpZF90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHBpZF90IGludAotRU9GCi0KLWZpCi0KLWFjX3NhZmU9YGVjaG8gInZmb3JrLmgiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHZmb3JrLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxNDg6IGNoZWNraW5nIGZvciB2Zm9yay5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMTUzICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDx2Zm9yay5oPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTU4OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfVkZPUktfSCAxCi1FT0YKLQotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIHZmb3JrIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTgzOiBjaGVja2luZyBmb3Igd29ya2luZyB2Zm9yayIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY192Zm9ya193b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB2Zm9yayIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE4OTogY2hlY2tpbmcgZm9yIHZmb3JrIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3Zmb3JrJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciB2Zm9yaygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIHZmb3JrKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfdmZvcmspIHx8IGRlZmluZWQgKF9fc3R1Yl9fX3Zmb3JrKQotY2hva2UgbWUKLSNlbHNlCi12Zm9yaygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX3Zmb3JrPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY192Zm9yaz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ3Zmb3JrYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIDoKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1hY19jdl9mdW5jX3Zmb3JrX3dvcmtzPSRhY19jdl9mdW5jX3Zmb3JrCi1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogVGhhbmtzIHRvIFBhdWwgRWdnZXJ0IGZvciB0aGlzIHRlc3QuICAqLwotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpZmRlZiBIQVZFX1ZGT1JLX0gKLSNpbmNsdWRlIDx2Zm9yay5oPgotI2VuZGlmCi0vKiBPbiBzb21lIHNwYXJjIHN5c3RlbXMsIGNoYW5nZXMgYnkgdGhlIGNoaWxkIHRvIGxvY2FsIGFuZCBpbmNvbWluZwotICAgYXJndW1lbnQgcmVnaXN0ZXJzIGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHBhcmVudC4KLSAgIFRoZSBjb21waWxlciBpcyB0b2xkIGFib3V0IHRoaXMgd2l0aCAjaW5jbHVkZSA8dmZvcmsuaD4sCi0gICBidXQgc29tZSBjb21waWxlcnMgKGUuZy4gZ2NjIC1PKSBkb24ndCBncm9rIDx2Zm9yay5oPi4KLSAgIFRlc3QgZm9yIHRoaXMgYnkgdXNpbmcgYSBzdGF0aWMgdmFyaWFibGUgd2hvc2UgYWRkcmVzcwotICAgaXMgcHV0IGludG8gYSByZWdpc3RlciB0aGF0IGlzIGNsb2JiZXJlZCBieSB0aGUgdmZvcmsuICAqLwotc3RhdGljCi0jaWZkZWYgX19jcGx1c3BsdXMKLXNwYXJjX2FkZHJlc3NfdGVzdCAoaW50IGFyZykKLSNlbHNlCi1zcGFyY19hZGRyZXNzX3Rlc3QgKGFyZykgaW50IGFyZzsKLSNlbmRpZgotewotICBzdGF0aWMgcGlkX3QgY2hpbGQ7Ci0gIGlmICghY2hpbGQpIHsKLSAgICBjaGlsZCA9IHZmb3JrICgpOwotICAgIGlmIChjaGlsZCA8IDApIHsKLSAgICAgIHBlcnJvciAoInZmb3JrIik7Ci0gICAgICBfZXhpdCgyKTsKLSAgICB9Ci0gICAgaWYgKCFjaGlsZCkgewotICAgICAgYXJnID0gZ2V0cGlkKCk7Ci0gICAgICB3cml0ZSgtMSwgIiIsIDApOwotICAgICAgX2V4aXQgKGFyZyk7Ci0gICAgfQotICB9Ci19Ci1tYWluKCkgewotICBwaWRfdCBwYXJlbnQgPSBnZXRwaWQgKCk7Ci0gIHBpZF90IGNoaWxkOwotCi0gIHNwYXJjX2FkZHJlc3NfdGVzdCAoKTsKLQotICBjaGlsZCA9IHZmb3JrICgpOwotCi0gIGlmIChjaGlsZCA9PSAwKSB7Ci0gICAgLyogSGVyZSBpcyBhbm90aGVyIHRlc3QgZm9yIHNwYXJjIHZmb3JrIHJlZ2lzdGVyIHByb2JsZW1zLgotICAgICAgIFRoaXMgdGVzdCB1c2VzIGxvdHMgb2YgbG9jYWwgdmFyaWFibGVzLCBhdCBsZWFzdAotICAgICAgIGFzIG1hbnkgbG9jYWwgdmFyaWFibGVzIGFzIG1haW4gaGFzIGFsbG9jYXRlZCBzbyBmYXIKLSAgICAgICBpbmNsdWRpbmcgY29tcGlsZXIgdGVtcG9yYXJpZXMuICA0IGxvY2FscyBhcmUgZW5vdWdoIGZvcgotICAgICAgIGdjYyAxLjQwLjMgb24gYSBTb2xhcmlzIDQuMS4zIHNwYXJjLCBidXQgd2UgdXNlIDggdG8gYmUgc2FmZS4KLSAgICAgICBBIGJ1Z2d5IGNvbXBpbGVyIHNob3VsZCByZXVzZSB0aGUgcmVnaXN0ZXIgb2YgcGFyZW50Ci0gICAgICAgZm9yIG9uZSBvZiB0aGUgbG9jYWwgdmFyaWFibGVzLCBzaW5jZSBpdCB3aWxsIHRoaW5rIHRoYXQKLSAgICAgICBwYXJlbnQgY2FuJ3QgcG9zc2libHkgYmUgdXNlZCBhbnkgbW9yZSBpbiB0aGlzIHJvdXRpbmUuCi0gICAgICAgQXNzaWduaW5nIHRvIHRoZSBsb2NhbCB2YXJpYWJsZSB3aWxsIHRodXMgbXVuZ2UgcGFyZW50Ci0gICAgICAgaW4gdGhlIHBhcmVudCBwcm9jZXNzLiAgKi8KLSAgICBwaWRfdAotICAgICAgcCA9IGdldHBpZCgpLCBwMSA9IGdldHBpZCgpLCBwMiA9IGdldHBpZCgpLCBwMyA9IGdldHBpZCgpLAotICAgICAgcDQgPSBnZXRwaWQoKSwgcDUgPSBnZXRwaWQoKSwgcDYgPSBnZXRwaWQoKSwgcDcgPSBnZXRwaWQoKTsKLSAgICAvKiBDb252aW5jZSB0aGUgY29tcGlsZXIgdGhhdCBwLi5wNyBhcmUgbGl2ZTsgb3RoZXJ3aXNlLCBpdCBtaWdodAotICAgICAgIHVzZSB0aGUgc2FtZSBoYXJkd2FyZSByZWdpc3RlciBmb3IgYWxsIDggbG9jYWwgdmFyaWFibGVzLiAgKi8KLSAgICBpZiAocCAhPSBwMSB8fCBwICE9IHAyIHx8IHAgIT0gcDMgfHwgcCAhPSBwNAotCXx8IHAgIT0gcDUgfHwgcCAhPSBwNiB8fCBwICE9IHA3KQotICAgICAgX2V4aXQoMSk7Ci0KLSAgICAvKiBPbiBzb21lIHN5c3RlbXMgKGUuZy4gSVJJWCAzLjMpLAotICAgICAgIHZmb3JrIGRvZXNuJ3Qgc2VwYXJhdGUgcGFyZW50IGZyb20gY2hpbGQgZmlsZSBkZXNjcmlwdG9ycy4KLSAgICAgICBJZiB0aGUgY2hpbGQgY2xvc2VzIGEgZGVzY3JpcHRvciBiZWZvcmUgaXQgZXhlY3Mgb3IgZXhpdHMsCi0gICAgICAgdGhpcyBtdW5nZXMgdGhlIHBhcmVudCdzIGRlc2NyaXB0b3IgYXMgd2VsbC4KLSAgICAgICBUZXN0IGZvciB0aGlzIGJ5IGNsb3Npbmcgc3Rkb3V0IGluIHRoZSBjaGlsZC4gICovCi0gICAgX2V4aXQoY2xvc2UoZmlsZW5vKHN0ZG91dCkpICE9IDApOwotICB9IGVsc2UgewotICAgIGludCBzdGF0dXM7Ci0gICAgc3RydWN0IHN0YXQgc3Q7Ci0KLSAgICB3aGlsZSAod2FpdCgmc3RhdHVzKSAhPSBjaGlsZCkKLSAgICAgIDsKLSAgICBleGl0KAotCSAvKiBXYXMgdGhlcmUgc29tZSBwcm9ibGVtIHdpdGggdmZvcmtpbmc/ICAqLwotCSBjaGlsZCA8IDAKLQotCSAvKiBEaWQgdGhlIGNoaWxkIGZhaWw/ICAoVGhpcyBzaG91bGRuJ3QgaGFwcGVuLikgICovCi0JIHx8IHN0YXR1cwotCi0JIC8qIERpZCB0aGUgdmZvcmsvY29tcGlsZXIgYnVnIG9jY3VyPyAgKi8KLQkgfHwgcGFyZW50ICE9IGdldHBpZCgpCi0KLQkgLyogRGlkIHRoZSBmaWxlIGRlc2NyaXB0b3IgYnVnIG9jY3VyPyAgKi8KLQkgfHwgZnN0YXQoZmlsZW5vKHN0ZG91dCksICZzdCkgIT0gMAotCSApOwotICB9Ci19Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9mdW5jX3Zmb3JrX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX3Zmb3JrX3dvcmtzID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHZmb3JrIGZvcmsKLUVPRgotCi1maQotCi0gIGlmIHRlc3QgJGFjX2N2X2Z1bmNfdmZvcmtfd29ya3MgPSBubzsgdGhlbgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHZmb3JrLm8iCi0gIGZpCi0gIGZvciB2IGluICR2YXJzOyBkbwotICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkdiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM2MTogY2hlY2tpbmcgZm9yICR2IiA+JjUKLSAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbGliaWJlcnR5X2N2X3Zhcl8kdicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotaW50ICpwOwotaW50IG1haW4oKSB7Ci1leHRlcm4gaW50ICR2OyBwID0gJiR2OwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotICAgIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGxpYmliZXJ0eV9jdl92YXJfJyR2YFwiID0geWVzIjsgdGhlbgotICAgICAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgICAgbj1IQVZFX2BlY2hvICR2IHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICAgICAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJG4gMQotRU9GCi0KLSAgICBlbHNlCi0gICAgICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLSAgICBmaQotICBkb25lCi0gIGZvciBhY19mdW5jIGluICRjaGVja2Z1bmNzCi1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzk5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNDA0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI0Mjc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLWZpCi0KLSMgSW5zdGFsbCBhIGxpYnJhcnkgYnVpbHQgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIGluICQodG9vbGRpcikgcmF0aGVyCi0jIHRoYW4gJChsaWJkaXIpLgotaWYgdGVzdCAteiAiJHt3aXRoX2Nyb3NzX2hvc3R9IjsgdGhlbgotICBJTlNUQUxMX0RFU1Q9bGliZGlyCi1lbHNlCi0gIElOU1RBTExfREVTVD10b29sZGlyCi1maQotCi0KLSMgV2UgbmVlZCBtdWx0aWxpYiBzdXBwb3J0LCBidXQgb25seSBpZiBjb25maWd1cmluZyBmb3IgdGhlIHRhcmdldC4KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBjb25maWcuaDpjb25maWcuaW4iIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi1zZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZ1wkL0BnLzsgL0BnXCQvcy9bXFxcXCYlXS9cXFxcJi9nOwotIHMvQEAvJUAvOyBzL0BAL0AlLzsgcy9AZ1wkLyVnLycgPiBjb25mdGVzdC5zdWJzIDw8XFxDRU9GCi0kYWNfdnBzdWIKLSRleHRyYXN1YgotcyVAU0hFTExAJSRTSEVMTCVnCi1zJUBDRkxBR1NAJSRDRkxBR1MlZwotcyVAQ1BQRkxBR1NAJSRDUFBGTEFHUyVnCi1zJUBDWFhGTEFHU0AlJENYWEZMQUdTJWcKLXMlQEZGTEFHU0AlJEZGTEFHUyVnCi1zJUBERUZTQCUkREVGUyVnCi1zJUBMREZMQUdTQCUkTERGTEFHUyVnCi1zJUBMSUJTQCUkTElCUyVnCi1zJUBleGVjX3ByZWZpeEAlJGV4ZWNfcHJlZml4JWcKLXMlQHByZWZpeEAlJHByZWZpeCVnCi1zJUBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQCUkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSVnCi1zJUBiaW5kaXJAJSRiaW5kaXIlZwotcyVAc2JpbmRpckAlJHNiaW5kaXIlZwotcyVAbGliZXhlY2RpckAlJGxpYmV4ZWNkaXIlZwotcyVAZGF0YWRpckAlJGRhdGFkaXIlZwotcyVAc3lzY29uZmRpckAlJHN5c2NvbmZkaXIlZwotcyVAc2hhcmVkc3RhdGVkaXJAJSRzaGFyZWRzdGF0ZWRpciVnCi1zJUBsb2NhbHN0YXRlZGlyQCUkbG9jYWxzdGF0ZWRpciVnCi1zJUBsaWJkaXJAJSRsaWJkaXIlZwotcyVAaW5jbHVkZWRpckAlJGluY2x1ZGVkaXIlZwotcyVAb2xkaW5jbHVkZWRpckAlJG9sZGluY2x1ZGVkaXIlZwotcyVAaW5mb2RpckAlJGluZm9kaXIlZwotcyVAbWFuZGlyQCUkbWFuZGlyJWcKLXMlQGhvc3RAJSRob3N0JWcKLXMlQGhvc3RfYWxpYXNAJSRob3N0X2FsaWFzJWcKLXMlQGhvc3RfY3B1QCUkaG9zdF9jcHUlZwotcyVAaG9zdF92ZW5kb3JAJSRob3N0X3ZlbmRvciVnCi1zJUBob3N0X29zQCUkaG9zdF9vcyVnCi1zJUBidWlsZEAlJGJ1aWxkJWcKLXMlQGJ1aWxkX2FsaWFzQCUkYnVpbGRfYWxpYXMlZwotcyVAYnVpbGRfY3B1QCUkYnVpbGRfY3B1JWcKLXMlQGJ1aWxkX3ZlbmRvckAlJGJ1aWxkX3ZlbmRvciVnCi1zJUBidWlsZF9vc0AlJGJ1aWxkX29zJWcKLXMlQEFSQCUkQVIlZwotcyVAUkFOTElCQCUkUkFOTElCJWcKLXMlQENDQCUkQ0MlZwotcyVASU5TVEFMTF9QUk9HUkFNQCUkSU5TVEFMTF9QUk9HUkFNJWcKLXMlQElOU1RBTExfU0NSSVBUQCUkSU5TVEFMTF9TQ1JJUFQlZwotcyVASU5TVEFMTF9EQVRBQCUkSU5TVEFMTF9EQVRBJWcKLS9AaG9zdF9tYWtlZmlsZV9mcmFnQC9yICRob3N0X21ha2VmaWxlX2ZyYWcKLXMlQGhvc3RfbWFrZWZpbGVfZnJhZ0AlJWcKLXMlQENQUEAlJENQUCVnCi1zJUBMSUJPQkpTQCUkTElCT0JKUyVnCi1zJUBBTExPQ0FAJSRBTExPQ0ElZwotcyVASU5TVEFMTF9ERVNUQCUkSU5TVEFMTF9ERVNUJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIn0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZm9yIGFjX2ZpbGUgaW4gLi4gJENPTkZJR19GSUxFUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gICMgQWRqdXN0IGEgcmVsYXRpdmUgc3JjZGlyLCB0b3Bfc3JjZGlyLCBhbmQgSU5TVEFMTCBmb3Igc3ViZGlyZWN0b3JpZXMuCi0KLSAgIyBSZW1vdmUgbGFzdCBzbGFzaCBhbmQgYWxsIHRoYXQgZm9sbG93cyBpdC4gIE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUuCi0gIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgdGVzdCAhIC1kICIkYWNfZGlyIiAmJiBta2RpciAiJGFjX2RpciIKLSAgICBhY19kaXJfc3VmZml4PSIvYGVjaG8gJGFjX2RpcnxzZWQgJ3MlXlwuLyUlJ2AiCi0gICAgIyBBICIuLi8iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KLSAgICBhY19kb3RzPWBlY2hvICRhY19kaXJfc3VmZml4fHNlZCAncyUvW14vXSolLi4vJWcnYAotICBlbHNlCi0gICAgYWNfZGlyX3N1ZmZpeD0gYWNfZG90cz0KLSAgZmkKLQotICBjYXNlICIkYWNfZ2l2ZW5fc3JjZGlyIiBpbgotICAuKSAgc3JjZGlyPS4KLSAgICAgIGlmIHRlc3QgLXogIiRhY19kb3RzIjsgdGhlbiB0b3Bfc3JjZGlyPS4KLSAgICAgIGVsc2UgdG9wX3NyY2Rpcj1gZWNobyAkYWNfZG90c3xzZWQgJ3MlLyQlJSdgOyBmaSA7OwotICAvKikgc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyJGFjX2Rpcl9zdWZmaXgiOyB0b3Bfc3JjZGlyPSIkYWNfZ2l2ZW5fc3JjZGlyIiA7OwotICAqKSAjIFJlbGF0aXZlIHBhdGguCi0gICAgc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCIKLSAgICB0b3Bfc3JjZGlyPSIkYWNfZG90cyRhY19naXZlbl9zcmNkaXIiIDs7Ci0gIGVzYWMKLQotICBjYXNlICIkYWNfZ2l2ZW5fSU5TVEFMTCIgaW4KLSAgWy8kXSopIElOU1RBTEw9IiRhY19naXZlbl9JTlNUQUxMIiA7OwotICAqKSBJTlNUQUxMPSIkYWNfZG90cyRhY19naXZlbl9JTlNUQUxMIiA7OwotICBlc2FjCi0KLSAgZWNobyBjcmVhdGluZyAiJGFjX2ZpbGUiCi0gIHJtIC1mICIkYWNfZmlsZSIKLSAgY29uZmlndXJlX2lucHV0PSJHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIGBlY2hvICRhY19maWxlX2lufHNlZCAncyUuKi8lJSdgIGJ5IGNvbmZpZ3VyZS4iCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqTWFrZWZpbGUqKSBhY19jb21zdWI9IjFpXFwKLSMgJGNvbmZpZ3VyZV9pbnB1dCIgOzsKLSAgKikgYWNfY29tc3ViPSA7OwotICBlc2FjCi0KLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgc2VkIC1lICIkYWNfY29tc3ViCi1zJUBjb25maWd1cmVfaW5wdXRAJSRjb25maWd1cmVfaW5wdXQlZwotcyVAc3JjZGlyQCUkc3JjZGlyJWcKLXMlQHRvcF9zcmNkaXJAJSR0b3Bfc3JjZGlyJWcKLXMlQElOU1RBTExAJSRJTlNUQUxMJWcKLSIgJGFjX2ZpbGVfaW5wdXRzIHwgKGV2YWwgIiRhY19zZWRfY21kcyIpID4gJGFjX2ZpbGUKLWZpOyBkb25lCi1ybSAtZiBjb25mdGVzdC5zKgotCi0jIFRoZXNlIHNlZCBjb21tYW5kcyBhcmUgcGFzc2VkIHRvIHNlZCBhcyAiQSBOQU1FIEIgTkFNRSBDIFZBTFVFIEQiLCB3aGVyZQotIyBOQU1FIGlzIHRoZSBjcHAgbWFjcm8gYmVpbmcgZGVmaW5lZCBhbmQgVkFMVUUgaXMgdGhlIHZhbHVlIGl0IGlzIGJlaW5nIGdpdmVuLgotIwotIyBhY19kIHNldHMgdGhlIHZhbHVlIGluICIjZGVmaW5lIE5BTUUgVkFMVUUiIGxpbmVzLgotYWNfZEE9J3MlXlwoWyAJXSpcKSNcKFsgCV0qZGVmaW5lWyAJXVsgCV0qXCknCi1hY19kQj0nXChbIAldWyAJXSpcKVteIAldKiVcMSNcMicKLWFjX2RDPSdcMycKLWFjX2REPSclZycKLSMgYWNfdSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGggdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY191QT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX3VCPSdcKFsgCV1cKSVcMSNcMmRlZmluZVwzJwotYWNfdUM9JyAnCi1hY191RD0nXDQlZycKLSMgYWNfZSB0dXJucyAiI3VuZGVmIE5BTUUiIHdpdGhvdXQgdHJhaWxpbmcgYmxhbmtzIGludG8gIiNkZWZpbmUgTkFNRSBWQUxVRSIuCi1hY19lQT0ncyVeXChbIAldKlwpI1woWyAJXSpcKXVuZGVmXChbIAldWyAJXSpcKScKLWFjX2VCPSckJVwxI1wyZGVmaW5lXDMnCi1hY19lQz0nICcKLWFjX2VEPSclZycKLQotaWYgdGVzdCAiJHtDT05GSUdfSEVBREVSUytzZXR9IiAhPSBzZXQ7IHRoZW4KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0gIENPTkZJR19IRUFERVJTPSJjb25maWcuaDpjb25maWcuaW4iCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLWZpCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0hFQURFUlM7IGRvIGlmIHRlc3QgIngkYWNfZmlsZSIgIT0geC4uOyB0aGVuCi0gICMgU3VwcG9ydCAib3V0ZmlsZVs6aW5maWxlWzppbmZpbGUuLi5dXSIsIGRlZmF1bHRpbmcgaW5maWxlPSJvdXRmaWxlLmluIi4KLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICo6KikgYWNfZmlsZV9pbj1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyVbXjpdKjolJSdgCi0gICAgICAgYWNfZmlsZT1gZWNobyAiJGFjX2ZpbGUifHNlZCAncyU6LiolJSdgIDs7Ci0gICopIGFjX2ZpbGVfaW49IiR7YWNfZmlsZX0uaW4iIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICRhY19maWxlCi0KLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiBjb25mdGVzdC5vdXQKLSAgYWNfZmlsZV9pbnB1dHM9YGVjaG8gJGFjX2ZpbGVfaW58c2VkIC1lICJzJV4lJGFjX2dpdmVuX3NyY2Rpci8lIiAtZSAicyU6JSAkYWNfZ2l2ZW5fc3JjZGlyLyVnImAKLSAgY2F0ICRhY19maWxlX2lucHV0cyA+IGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLgotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgaW4gYW4gdW5xdW90ZWQgaGVyZSBkb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLgotcm0gLWYgY29uZnRlc3QudmFscwotY2F0ID4gY29uZnRlc3QuaGRyIDw8XEVPRgotcy9bXFwmJV0vXFwmL2cKLXMlW1xcJGBdJVxcJiVnCi1zJSNkZWZpbmUgXChbQS1aYS16X11bQS1aYS16MC05X10qXCkgKlwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0KLXJtIC1mIGNvbmZ0ZXN0LnRhaWwKLXdoaWxlIDoKLWRvCi0gIGFjX2xpbmVzPWBncmVwIC1jIC4gY29uZnRlc3QudmFsc2AKLSAgIyBncmVwIC1jIGdpdmVzIGVtcHR5IG91dHB1dCBmb3IgYW4gZW1wdHkgZmlsZSBvbiBzb21lIEFJWCBzeXN0ZW1zLgotICBpZiB0ZXN0IC16ICIkYWNfbGluZXMiIHx8IHRlc3QgIiRhY19saW5lcyIgLWVxIDA7IHRoZW4gYnJlYWs7IGZpCi0gICMgV3JpdGUgYSBsaW1pdGVkLXNpemUgaGVyZSBkb2N1bWVudCB0byBjb25mdGVzdC5mcmFnLgotICBlY2hvICcgIGNhdCA+IGNvbmZ0ZXN0LmZyYWcgPDxDRU9GJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgJHthY19tYXhfaGVyZV9saW5lc31xIGNvbmZ0ZXN0LnZhbHMgPj4gJENPTkZJR19TVEFUVVMKLSAgZWNobyAnQ0VPRgotICBzZWQgLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5pbiA+IGNvbmZ0ZXN0Lm91dAotICBybSAtZiBjb25mdGVzdC5pbgotICBtdiBjb25mdGVzdC5vdXQgY29uZnRlc3QuaW4KLScgPj4gJENPTkZJR19TVEFUVVMKLSAgc2VkIDEsJHthY19tYXhfaGVyZV9saW5lc31kIGNvbmZ0ZXN0LnZhbHMgPiBjb25mdGVzdC50YWlsCi0gIHJtIC1mIGNvbmZ0ZXN0LnZhbHMKLSAgbXYgY29uZnRlc3QudGFpbCBjb25mdGVzdC52YWxzCi1kb25lCi1ybSAtZiBjb25mdGVzdC52YWxzCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLSAgcm0gLWYgY29uZnRlc3QuZnJhZyBjb25mdGVzdC5oCi0gIGVjaG8gIi8qICRhY19maWxlLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8iID4gY29uZnRlc3QuaAotICBjYXQgY29uZnRlc3QuaW4gPj4gY29uZnRlc3QuaAotICBybSAtZiBjb25mdGVzdC5pbgotICBpZiBjbXAgLXMgJGFjX2ZpbGUgY29uZnRlc3QuaCAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGVjaG8gIiRhY19maWxlIGlzIHVuY2hhbmdlZCIKLSAgICBybSAtZiBjb25mdGVzdC5oCi0gIGVsc2UKLSAgICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgICAgIGFjX2Rpcj1gZWNobyAkYWNfZmlsZXxzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICIkYWNfZGlyIiAhPSAiJGFjX2ZpbGUiICYmIHRlc3QgIiRhY19kaXIiICE9IC47IHRoZW4KLSAgICAgICMgVGhlIGZpbGUgaXMgaW4gYSBzdWJkaXJlY3RvcnkuCi0gICAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGZpCi0gICAgcm0gLWYgJGFjX2ZpbGUKLSAgICBtdiBjb25mdGVzdC5oICRhY19maWxlCi0gIGZpCi1maTsgZG9uZQotCi1FT0YKLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PEVPRgotc3JjZGlyPSR7c3JjZGlyfQotaG9zdD0ke2hvc3R9Ci10YXJnZXQ9JHt0YXJnZXR9Ci13aXRoX3RhcmdldF9zdWJkaXI9JHt3aXRoX3RhcmdldF9zdWJkaXJ9Ci13aXRoX211bHRpc3ViZGlyPSR7d2l0aF9tdWx0aXN1YmRpcn0KLWFjX2NvbmZpZ3VyZV9hcmdzPSItLWVuYWJsZS1tdWx0aWxpYiAke2FjX2NvbmZpZ3VyZV9hcmdzfSIKLUNPTkZJR19TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotbGliaWJlcnR5X3RvcGRpcj0ke2xpYmliZXJ0eV90b3BkaXJ9Ci0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLWlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICAjIEZJWE1FOiBXZSBzaG91bGRuJ3QgbmVlZCB0byBzZXQgYWNfZmlsZQotICAgIGFjX2ZpbGU9TWFrZWZpbGUKLSAgICAuICR7bGliaWJlcnR5X3RvcGRpcn0vY29uZmlnLW1sLmluCi0gIGZpCi1maQotZXhpdCAwCi1FT0YKLWNobW9kICt4ICRDT05GSUdfU1RBVFVTCi1ybSAtZnIgY29uZmRlZnMqICRhY19jbGVhbl9maWxlcwotdGVzdCAiJG5vX2NyZWF0ZSIgPSB5ZXMgfHwgJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJENPTkZJR19TVEFUVVMgfHwgZXhpdCAxCi0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb25maWd1cmUuYmF0IGIvbGliaWJlcnR5L2NvbmZpZ3VyZS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ODgxYWMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1AZWNobyBvZmYNCi1pZiAiJTEiID09ICJoOC8zMDAiIGdvdG8gaDgzMDANCi0NCi1lY2hvIENvbmZpZ3VyaW5nIGxpYmliZXJ0eSBmb3IgZ28zMg0KLWNvcHkgTWFrZWZpbGUuZG9zIE1ha2VmaWxlDQotZWNobyAjZGVmaW5lIE5FRURfc3lzX3NpZ2xpc3QgMSA+PiBjb25maWcuaA0KLWVjaG8gI2RlZmluZSBORUVEX3BzaWduYWwgMSA+PiBjb25maWcuaA0KLWdvdG8gZXhpdA0KLQ0KLTpoODMwMA0KLWVjaG8gQ29uZmlndXJpbmcgbGliaWJlcnR5IGZvciBIOC8zMDANCi1jb3B5IE1ha2VmaWxlLmRvcyBNYWtlZmlsZQ0KLQ0KLTpleGl0DQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbiBiL2xpYmliZXJ0eS9jb25maWd1cmUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMWNiMGIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdAotCi1BQ19QUkVSRVEoMi4xMi4xKQotQUNfSU5JVChwZXhlY3V0ZS5jKQotCi1kbmwgV2UgdXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVjaWRlIHdoaWNoIGZ1bmN0aW9ucyB0byBpbmNsdWRlLgotQUNfQVJHX1dJVEgodGFyZ2V0LXN1YmRpciwKLVsgIC0td2l0aC10YXJnZXQtc3ViZGlyPVNVQkRJUiAgICAgIENvbmZpZ3VyaW5nIGluIGEgc3ViZGlyZWN0b3J5XSkKLUFDX0FSR19XSVRIKGNyb3NzLWhvc3QsCi1bICAtLXdpdGgtY3Jvc3MtaG9zdD1IT1NUICAgICAgICAgICBDb25maWd1cmluZyB3aXRoIGEgY3Jvc3MgY29tcGlsZXJdKQotQUNfQVJHX1dJVEgobmV3bGliLAotWyAgLS13aXRoLW5ld2xpYiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJpbmcgd2l0aCBuZXdsaWJdKQotCi1pZiB0ZXN0ICIke3NyY2Rpcn0iID0gIi4iOyB0aGVuCi0gIGlmIHRlc3QgLXogIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vLi4iCi0gIGVsc2UKLSAgICBpZiB0ZXN0ICIke3dpdGhfdGFyZ2V0X3N1YmRpcn0iICE9ICIuIjsgdGhlbgotICAgICAgbGliaWJlcnR5X3RvcGRpcj0iJHtzcmNkaXJ9LyR7d2l0aF9tdWx0aXNyY3RvcH0uLi8uLiIKLSAgICBlbHNlCi0gICAgICBsaWJpYmVydHlfdG9wZGlyPSIke3NyY2Rpcn0vJHt3aXRoX211bHRpc3JjdG9wfS4uIgotICAgIGZpCi0gIGZpCi1lbHNlCi0gIGxpYmliZXJ0eV90b3BkaXI9IiR7c3JjZGlyfS8uLiIKLWZpCi1BQ19DT05GSUdfQVVYX0RJUigkbGliaWJlcnR5X3RvcGRpcikKLQotQUNfQ0FOT05JQ0FMX0hPU1QKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fSU5JVF9BVVRPTUFLRShsaWJpYmVydHksIDEuMCkKLQotZG5sIFRoZXNlIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wsIGJlY2F1c2UgaXQgbWF5IHdhbnQKLWRubCB0byBjYWxsIEFDX0NIRUNLX1BST0cuCi1BQ19DSEVDS19UT09MKEFSLCBhcikKLUFDX0NIRUNLX1RPT0woUkFOTElCLCByYW5saWIsIDopCi0KLSMgRklYTUU6IFdlIHRlbXBvcmFyaWx5IGRlZmluZSBvdXIgb3duIHZlcnNpb24gb2YgQUNfUFJPR19DQy4gIFRoaXMgaXMKLSMgY29waWVkIGZyb20gYXV0b2NvbmYgMi4xMiwgYnV0IGRvZXMgbm90IGNhbGwgQUNfUFJPR19DQ19XT1JLUy4gIFdlCi0jIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLCB3aGljaCB3aWxsIG5vdCBiZSBhYmxlIHRvIGZ1bGx5Ci0jIGxpbmsgYW4gZXhlY3V0YWJsZS4gIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBmaXhlZCBpbiBhdXRvY29uZgotIyBpdHNlbGYuCi0KLUFDX0RFRlVOKExJQl9BQ19QUk9HX0NDLAotW0FDX0JFRk9SRShbJDBdLCBbQUNfUFJPR19DUFBdKWRubAotQUNfUFJPVklERShbQUNfUFJPR19DQ10pCi1BQ19DSEVDS19QUk9HKENDLCBnY2MsIGdjYykKLWlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgQUNfQ0hFQ0tfUFJPRyhDQywgY2MsIGNjLCAsICwgL3Vzci91Y2IvY2MpCi0gIHRlc3QgLXogIiRDQyIgJiYgQUNfTVNHX0VSUk9SKFtubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSF0pCi1maQotCi1BQ19QUk9HX0NDX0dOVQotCi1pZiB0ZXN0ICRhY19jdl9wcm9nX2djYyA9IHllczsgdGhlbgotICBHQ0M9eWVzCi1kbmwgQ2hlY2sgd2hldGhlciAtZyB3b3JrcywgZXZlbiBpZiBDRkxBR1MgaXMgc2V0LCBpbiBjYXNlIHRoZSBwYWNrYWdlCi1kbmwgcGxheXMgYXJvdW5kIHdpdGggQ0ZMQUdTIChzdWNoIGFzIHRvIGJ1aWxkIGJvdGggZGVidWdnaW5nIGFuZAotZG5sIG5vcm1hbCB2ZXJzaW9ucyBvZiBhIGxpYnJhcnkpLCB0YXN0ZWxlc3MgYXMgdGhhdCBpZGVhIGlzLgotICBhY190ZXN0X0NGTEFHUz0iJHtDRkxBR1Mrc2V0fSIKLSAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0KLSAgQUNfUFJPR19DQ19HCi0gIGlmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KLSAgICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLSAgZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLU8yIgotICBmaQotZWxzZQotICBHQ0M9Ci0gIHRlc3QgIiR7Q0ZMQUdTK3NldH0iID0gc2V0IHx8IENGTEFHUz0iLWciCi1maQotXSkKLQotTElCX0FDX1BST0dfQ0MKLQotQUNfSVNDX1BPU0lYCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGxpYnRvb2w6Ci1kbmwgRGVmYXVsdCB0byBhIG5vbiBzaGFyZWQgbGlicmFyeS4gIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlCi1kbmwgY29uZmlndXJlIG9wdGlvbiAtLWVuYWJsZS1zaGFyZWQuCi1kbmwgQU1fRElTQUJMRV9TSEFSRUQKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgbGlidG9vbDoKLWRubCBBTV9QUk9HX0xJQlRPT0wKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi1BQ19DT05GSUdfSEVBREVSKGNvbmZpZy5oOmNvbmZpZy5pbikKLQotZG5sIFdoZW4gd2Ugc3RhcnQgdXNpbmcgYXV0b21ha2U6Ci1kbmwgQU1fTUFJTlRBSU5FUl9NT0RFCi1kbmwgQUNfRVhFRVhUCi0KLWRubCBXaGVuIHdlIHN0YXJ0IHVzaW5nIGF1dG9tYWtlOgotZG5sIEFNX1BST0dfSU5TVEFMTAotQUNfUFJPR19JTlNUQUxMCi0KLS4gJHtzcmNkaXJ9L2NvbmZpZy50YWJsZQotaG9zdF9tYWtlZmlsZV9mcmFnPSR7ZnJhZ30KLUFDX1NVQlNUX0ZJTEUoaG9zdF9tYWtlZmlsZV9mcmFnKQotCi0jIEl0J3MgT0sgdG8gY2hlY2sgZm9yIGhlYWRlciBmaWxlcy4gIEFsdGhvdWdoIHRoZSBjb21waWxlciBtYXkgbm90IGJlCi0jIGFibGUgdG8gbGluayBhbnl0aGluZywgaXQgaGFkIGJldHRlciBiZSBhYmxlIHRvIGF0IGxlYXN0IGNvbXBpbGUKLSMgc29tZXRoaW5nLgotQUNfQ0hFQ0tfSEVBREVSUyhzeXMvZmlsZS5oIHN5cy9wYXJhbS5oIHN0ZGxpYi5oIHN0cmluZy5oIHVuaXN0ZC5oIHN0cmluZ3MuaCBzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oKQotQUNfSEVBREVSX1NZU19XQUlUCi0KLSMgVGhpcyBpcyB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggbGliaWJlcnR5IHdpbGwgcHJvdmlkZSBpZiB0aGV5Ci0jIGFyZSBub3QgYXZhaWxhYmxlIG9uIHRoZSBob3N0LgotCi1mdW5jcz0iYXNwcmludGYiCi1mdW5jcz0iJGZ1bmNzIGF0ZXhpdCIKLWZ1bmNzPSIkZnVuY3MgYmFzZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIGJjbXAiCi1mdW5jcz0iJGZ1bmNzIGJjb3B5IgotZnVuY3M9IiRmdW5jcyBiemVybyIKLWZ1bmNzPSIkZnVuY3MgY2FsbG9jIgotZnVuY3M9IiRmdW5jcyBjbG9jayIKLWZ1bmNzPSIkZnVuY3MgZ2V0Y3dkIgotZnVuY3M9IiRmdW5jcyBnZXRwYWdlc2l6ZSIKLWZ1bmNzPSIkZnVuY3MgaW5kZXgiCi1mdW5jcz0iJGZ1bmNzIGluc3F1ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtY2hyIgotZnVuY3M9IiRmdW5jcyBtZW1jbXAiCi1mdW5jcz0iJGZ1bmNzIG1lbWNweSIKLWZ1bmNzPSIkZnVuY3MgbWVtbW92ZSIKLWZ1bmNzPSIkZnVuY3MgbWVtc2V0IgotZnVuY3M9IiRmdW5jcyBta3N0ZW1wcyIKLWZ1bmNzPSIkZnVuY3MgcmFuZG9tIgotZnVuY3M9IiRmdW5jcyByZW5hbWUiCi1mdW5jcz0iJGZ1bmNzIHJpbmRleCIKLWZ1bmNzPSIkZnVuY3Mgc2lnc2V0bWFzayIKLWZ1bmNzPSIkZnVuY3Mgc3RyY2FzZWNtcCIKLWZ1bmNzPSIkZnVuY3Mgc3RyY2hyIgotZnVuY3M9IiRmdW5jcyBzdHJkdXAiCi1mdW5jcz0iJGZ1bmNzIHN0cm5jYXNlY21wIgotZnVuY3M9IiRmdW5jcyBzdHJyY2hyIgotZnVuY3M9IiRmdW5jcyBzdHJzdHIiCi1mdW5jcz0iJGZ1bmNzIHN0cnRvZCIKLWZ1bmNzPSIkZnVuY3Mgc3RydG9sIgotZnVuY3M9IiRmdW5jcyBzdHJ0b3VsIgotZnVuY3M9IiRmdW5jcyB0bXBuYW0iCi1mdW5jcz0iJGZ1bmNzIHZhc3ByaW50ZiIKLWZ1bmNzPSIkZnVuY3MgdmZwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZwcmludGYiCi1mdW5jcz0iJGZ1bmNzIHZzcHJpbnRmIgotZnVuY3M9IiRmdW5jcyB3YWl0cGlkIgotCi0jIEFsc28gaW4gdGhlIG9sZCBmdW5jdGlvbi5kZWYgZmlsZTogYWxsb2NhLCB2Zm9yaywgZ2V0b3B0LgotCi12YXJzPSJzeXNfZXJybGlzdCBzeXNfbmVyciBzeXNfc2lnbGlzdCIKLQotY2hlY2tmdW5jcz0iZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcyIKLQotIyBUaGVzZSBhcmUgbmVpdGhlciBleGVjdXRlZCBub3IgcmVxdWlyZWQsIGJ1dCB0aGV5IGhlbHAga2VlcAotIyBhdXRvaGVhZGVyIGhhcHB5IHdpdGhvdXQgYWRkaW5nIGEgYnVuY2ggb2YgdGV4dCB0byBhY2NvbmZpZy5oLgotaWYgdGVzdCAieCIgPSAieSI7IHRoZW4KLSAgQUNfQ0hFQ0tfRlVOQ1MoYXNwcmludGYgYXRleGl0IGJhc2VuYW1lIGJjbXAgYmNvcHkgYnplcm8gY2FsbG9jIGNsb2NrIGdldGN3ZCkKLSAgQUNfQ0hFQ0tfRlVOQ1MoZ2V0cGFnZXNpemUgaW5kZXggaW5zcXVlIG1rc3RlbXBzIG1lbWNociBtZW1jbXAgbWVtY3B5IG1lbW1vdmUpCi0gIEFDX0NIRUNLX0ZVTkNTKG1lbXNldCByYW5kb20gcmVuYW1lIHJpbmRleCBzaWdzZXRtYXNrIHN0cmNhc2VjbXApCi0gIEFDX0NIRUNLX0ZVTkNTKHN0cmNociBzdHJkdXAgc3RybmNhc2VjbXAgc3RycmNociBzdHJzdHIgc3RydG9kIHN0cnRvbCkKLSAgQUNfQ0hFQ0tfRlVOQ1Moc3RydG91bCB0bXBuYW0gdmFzcHJpbnRmIHZmcHJpbnRmIHZwcmludGYgdnNwcmludGYgd2FpdHBpZCkKLSAgQUNfREVGSU5FKEhBVkVfU1lTX0VSUkxJU1QpCi0gIEFDX0RFRklORShIQVZFX1NZU19ORVJSKQotICBBQ19ERUZJTkUoSEFWRV9TWVNfU0lHTElTVCkKLSAgQUNfQ0hFQ0tfRlVOQ1MoZ2V0cnVzYWdlIG9uX2V4aXQgcHNpZ25hbCBzdHJlcnJvciBzdHJzaWduYWwgc3lzY29uZiB0aW1lcykKLWZpCi0KLSMgRm9yIGVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zLCBpZiB0aGUgaG9zdCBkb2VzIG5vdCBwcm92aWRlIHRoZQotIyBmdW5jdGlvbiB3ZSB3YW50IHRvIHB1dCBGTi5vIGluIExJQk9CSlMsIGFuZCBpZiB0aGUgaG9zdCBkb2VzCi0jIHByb3ZpZGUgdGhlIGZ1bmN0aW9uLCB3ZSB3YW50IHRvIGRlZmluZSBIQVZFX0ZOIGluIGNvbmZpZy5oLiAgQWxzbywKLSMgaWYgdGhlIGhvc3QgZG9lcyBub3QgcHJvdmlkZSBhbGxvY2EsIHdlIHNldCBBTExPQ0EgdG8gYWxsb2NhLm8KLQotc2V0b2Jqcz0KLWlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLQotICAjIFdlIGFyZSBiZWluZyBjb25maWd1cmVkIGFzIGEgdGFyZ2V0IGxpYnJhcnkuICBBQ19SRVBMQUNFX0ZVTkNTCi0gICMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseSwgYmVjYXVzZSB0aGUgY29tcGlsZXIgbWF5IG5vdCBiZSBhYmxlIHRvCi0gICMgbGluayBleGVjdXRhYmxlcy4gIE5vdGUgdGhhdCB3ZSBtYXkgc3RpbGwgYmUgYmVpbmcgY29uZmlndXJlZAotICAjIG5hdGl2ZS4KLQotICAjIElmIHdlIGFyZSBiZWluZyBjb25maWd1cmVkIGZvciBuZXdsaWIsIHdlIGtub3cgd2hpY2ggZnVuY3Rpb25zCi0gICMgbmV3bGliIHByb3ZpZGUgYW5kIHdoaWNoIG9uZXMgd2Ugd2lsbCBiZSBleHBlY3RlZCB0byBwcm92aWRlLgotCi0gIGlmIHRlc3QgIngke3dpdGhfbmV3bGlifSIgPSAieHllcyI7IHRoZW4KLSAgICBBTExPQ0E9ImFsbG9jYS5vIgotICAgIExJQk9CSlM9ImFzcHJpbnRmLm8gYmFzZW5hbWUubyBpbnNxdWUubyByYW5kb20ubyBzdHJkdXAubyB2YXNwcmludGYubyIKLQotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWFzcHJpbnRmIHwgYmFzZW5hbWUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJkdXAgfCB2YXNwcmludGYpCi0JICA7OwotCSopCi0JICBuPUhBVkVfYGVjaG8gJGYgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0JICBBQ19ERUZJTkVfVU5RVU9URUQoJG4pCi0JICA7OwotICAgICAgZXNhYwotICAgIGRvbmUKLQotICAgICMgbmV3bGliIGRvZXNudCBwcm92aWRlIGFueSBvZiB0aGUgdmFyaWFibGVzIGluICR2YXJzLCBzbyB3ZQotICAgICMgZG9udCBoYXZlIHRvIGNoZWNrIHRoZW0gaGVyZS4KLQotICAgICMgT2YgdGhlIGZ1bmN0aW9ucyBpbiAkY2hlY2tmdW5jcywgbmV3bGliIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIEFDX0RFRklORShIQVZFX1NUUkVSUk9SKQotCi0gICAgc2V0b2Jqcz15ZXMKLQotICBmaQotZmkKLQotaWYgdGVzdCAteiAiJHtzZXRvYmpzfSI7IHRoZW4KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotdnh3b3JrcyopCi0gICAgIyBIYW5kbGUgVnhXb3JrcyBjb25maWd1cmF0aW9uIHNwZWNpYWxseSwgc2luY2Ugb24gVnhXb3JrcyB0aGUKLSAgICAjIGxpYnJhcmllcyBhcmUgYWN0dWFsbHkgb24gdGhlIHRhcmdldCBib2FyZCwgbm90IGluIHRoZSBmaWxlCi0gICAgIyBzeXN0ZW0uCi0gICAgTElCT0JKUz0iYmFzZW5hbWUubyBnZXRwYWdlc2l6ZS5vIGluc3F1ZS5vIHJhbmRvbS5vIHN0cmNhc2VjbXAubyIKLSAgICBMSUJPQkpTPSIkTElCT0JKUyBzdHJuY2FzZWNtcC5vIHN0cmR1cC5vIHZmb3JrLm8gd2FpdHBpZC5vIHZhc3ByaW50Zi5vIgotICAgIGZvciBmIGluICRmdW5jczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotCWJhc2VuYW1lIHwgZ2V0cGFnZXNpemUgfCBpbnNxdWUgfCByYW5kb20gfCBzdHJjYXNlY21wKQotCSAgOzsKLQlzdHJuY2FzZWNtcCB8IHN0cmR1cCB8IHZmb3JrIHwgd2FpdHBpZCB8IHZhc3ByaW50ZikKLQkgIDs7Ci0JKikKLQkgIG49SEFWRV9gZWNobyAkZiB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLQkgIEFDX0RFRklORV9VTlFVT1RFRCgkbikKLQkgIDs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBWeFdvcmtzIGRvZXNuJ3QgcHJvdmlkZSBhbnkgb2YgdGhlIHZhcmlhYmxlcyBpbiAkdmFycywgc28gd2UKLSAgICAjIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlbSBoZXJlLgotCi0gICAgIyBPZiB0aGUgZnVuY3Rpb25zIGluICRjaGVja2Z1bmNzLCBWeFdvcmtzIG9ubHkgaGFzIHN0cmVycm9yLgotICAgIEFDX0RFRklORShIQVZFX1NUUkVSUk9SKQotCi0gICAgc2V0b2Jqcz15ZXMKLSAgICA7OwotCi0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLXogIiR7c2V0b2Jqc30iOyB0aGVuCi0KLSAgY2FzZSAiJHtob3N0fSIgaW4KLQotICAqLSotY3lnd2luKikKLSAgICAjIFRoZSBDeWd3aW4gbGlicmFyeSBhY3R1YWxseSB1c2VzIGEgY291cGxlIG9mIGZpbGVzIGZyb20KLSAgICAjIGxpYmliZXJ0eSB3aGVuIGl0IGlzIGJ1aWx0LiAgSWYgd2UgYXJlIGJ1aWxkaW5nIGEgbmF0aXZlCi0gICAgIyBDeWd3aW4sIGFuZCB3ZSBydW4gdGhlIHRlc3RzLCB3ZSB3aWxsIGFwcGVhciB0byBoYXZlIHRoZXNlCi0gICAgIyBmaWxlcy4gIEhvd2V2ZXIsIHdoZW4gd2UgZ28gb24gdG8gYnVpbGQgd2luc3VwLCB3ZSB3aWxsIHdpbmQgdXAKLSAgICAjIHdpdGggYSBsaWJyYXJ5IHdoaWNoIGRvZXMgbm90IGhhdmUgdGhlIGZpbGVzLCBzaW5jZSB0aGV5IHNob3VsZAotICAgICMgaGF2ZSBjb21lIGZyb20gbGliaWJlcnR5LgotCi0gICAgIyBXZSBoYW5kbGUgdGhpcyBieSByZW1vdmluZyB0aGUgZnVuY3Rpb25zIHRoZSB3aW5zdXAgbGlicmFyeQotICAgICMgcHJvdmlkZXMgZnJvbSBvdXIgc2hlbGwgdmFyaWFibGVzLCBzbyB0aGF0IHRoZXkgYXBwZWFyIHRvIGJlCi0gICAgIyBtaXNzaW5nLgotCi0gICAgZnVuY3M9ImBlY2hvICRmdW5jcyB8IHNlZCAtZSAncy9yYW5kb20vLydgIgotICAgIExJQk9CSlM9IiRMSUJPQkpTIHJhbmRvbS5vIgotICAgIHZhcnM9ImBlY2hvICR2YXJzIHwgc2VkIC1lICdzL3N5c19zaWdsaXN0Ly8nYCIKLSAgICBjaGVja2Z1bmNzPSJgZWNobyAkY2hlY2tmdW5jcyB8IHNlZCAtZSAncy9zdHJzaWduYWwvLycgLWUgJ3MvcHNpZ25hbC8vJ2AiCi0gICAgOzsKLQotICAqLSotbWluZ3czMiopCi0gICAgIyBVbmRlciBtaW5ndzMyLCBzeXNfbmVyciBhbmQgc3lzX2Vycmxpc3QgZXhpc3QsIGJ1dCB0aGV5IGFyZQotICAgICMgbWFjcm9zLCBzbyB0aGUgdGVzdCBiZWxvdyB3b24ndCBmaW5kIHRoZW0uCi0gICAgdmFycz0iYGVjaG8gJHZhcnMgfCBzZWQgLWUgJ3Mvc3lzX25lcnIvLycgLWUgJ3Mvc3lzX2Vycmxpc3QvLydgIgotICAgIEFDX0RFRklORShIQVZFX1NZU19ORVJSKQotICAgIEFDX0RFRklORShIQVZFX1NZU19FUlJMSVNUKQotICAgIDs7Ci0KLSAgKi0qLXV3aW4qKQotICAgICMgVW5kZXIgc29tZSB2ZXJzaW9ucyBvZiB1d2luLCB2Zm9yayBpcyBub3RvcmlvdXNseSBidWdneSBhbmQgdGhlIHRlc3QgCi0gICAgIyBjYW4gaGFuZyBjb25maWd1cmU7IG9uIG90aGVyIHZlcnNpb25zLCB2Zm9yayBleGlzdHMganVzdCBhcyBhIHN0dWIuCi0gICAgIyBGSVhNRTogVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHZmb3JrIGluIHV3aW4ncyBydW50aW1lIGlzIGZpeGVkLgotICAgIGFjX2N2X2Z1bmNfdmZvcmtfd29ya3M9bm8KLSAgICA7OwotCi0gIGVzYWMKLQotICAjIFdlIGhhdmVuJ3Qgc2V0IHRoZSBsaXN0IG9mIG9iamVjdHMgeWV0LiAgVXNlIHRoZSBzdGFuZGFyZCBhdXRvY29uZgotICAjIHRlc3RzLiAgVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgY29tcGlsZXIgd29ya3MuCi0gIEFDX1BST0dfQ0NfV09SS1MKLSAgQUNfUkVQTEFDRV9GVU5DUygkZnVuY3MpCi0gIEFDX0ZVTkNfQUxMT0NBCi0gIEFDX0ZVTkNfVkZPUksKLSAgaWYgdGVzdCAkYWNfY3ZfZnVuY192Zm9ya193b3JrcyA9IG5vOyB0aGVuCi0gICAgTElCT0JKUz0iJExJQk9CSlMgdmZvcmsubyIKLSAgZmkKLSAgZm9yIHYgaW4gJHZhcnM7IGRvCi0gICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgJHZdKQotICAgIEFDX0NBQ0hFX1ZBTChsaWJpYmVydHlfY3ZfdmFyXyR2LAotICAgICAgW0FDX1RSWV9MSU5LKFtpbnQgKnA7XSwgW2V4dGVybiBpbnQgJHY7IHAgPSAmJHY7XSwKLQkJICAgW2V2YWwgImxpYmliZXJ0eV9jdl92YXJfJHY9eWVzIl0sCi0JCSAgIFtldmFsICJsaWJpYmVydHlfY3ZfdmFyXyR2PW5vIl0pXSkKLSAgICBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRsaWJpYmVydHlfY3ZfdmFyXyckdmBcIiA9IHllcyI7IHRoZW4KLSAgICAgIEFDX01TR19SRVNVTFQoeWVzKQotICAgICAgbj1IQVZFX2BlY2hvICR2IHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICAgICAgQUNfREVGSU5FX1VOUVVPVEVEKCRuKQotICAgIGVsc2UKLSAgICAgIEFDX01TR19SRVNVTFQobm8pCi0gICAgZmkKLSAgZG9uZQotICBBQ19DSEVDS19GVU5DUygkY2hlY2tmdW5jcykKLWZpCi0KLSMgSW5zdGFsbCBhIGxpYnJhcnkgYnVpbHQgd2l0aCBhIGNyb3NzIGNvbXBpbGVyIGluICQodG9vbGRpcikgcmF0aGVyCi0jIHRoYW4gJChsaWJkaXIpLgotaWYgdGVzdCAteiAiJHt3aXRoX2Nyb3NzX2hvc3R9IjsgdGhlbgotICBJTlNUQUxMX0RFU1Q9bGliZGlyCi1lbHNlCi0gIElOU1RBTExfREVTVD10b29sZGlyCi1maQotQUNfU1VCU1QoSU5TVEFMTF9ERVNUKQotCi0jIFdlIG5lZWQgbXVsdGlsaWIgc3VwcG9ydCwgYnV0IG9ubHkgaWYgY29uZmlndXJpbmcgZm9yIHRoZSB0YXJnZXQuCi1BQ19PVVRQVVQoTWFrZWZpbGUsCi1bdGVzdCAteiAiJENPTkZJR19IRUFERVJTIiB8fCBlY2hvIHRpbWVzdGFtcCA+IHN0YW1wLWgKLWlmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCi0gIGlmIHRlc3QgLW4gIiR7d2l0aF90YXJnZXRfc3ViZGlyfSI7IHRoZW4KLSAgICAjIEZJWE1FOiBXZSBzaG91bGRuJ3QgbmVlZCB0byBzZXQgYWNfZmlsZQotICAgIGFjX2ZpbGU9TWFrZWZpbGUKLSAgICAuICR7bGliaWJlcnR5X3RvcGRpcn0vY29uZmlnLW1sLmluCi0gIGZpCi1maV0sCi1zcmNkaXI9JHtzcmNkaXJ9Ci1ob3N0PSR7aG9zdH0KLXRhcmdldD0ke3RhcmdldH0KLXdpdGhfdGFyZ2V0X3N1YmRpcj0ke3dpdGhfdGFyZ2V0X3N1YmRpcn0KLXdpdGhfbXVsdGlzdWJkaXI9JHt3aXRoX211bHRpc3ViZGlyfQotYWNfY29uZmlndXJlX2FyZ3M9Ii0tZW5hYmxlLW11bHRpbGliICR7YWNfY29uZmlndXJlX2FyZ3N9IgotQ09ORklHX1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1saWJpYmVydHlfdG9wZGlyPSR7bGliaWJlcnR5X3RvcGRpcn0KLSkKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9jb3B5c2lnbi5jIGIvbGliaWJlcnR5L2NvcHlzaWduLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNWY4YzMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NvcHlzaWduLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLSNpZmRlZiBfX0lFRUVfQklHX0VORElBTgotCi10eXBlZGVmIHVuaW9uIAotewotICBkb3VibGUgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDExOwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6NDsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMzoxNjsKLSAgICAKLSAgfSBudW1iZXI7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDExOwotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6MzsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjI6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMzoxNjsKLSAgfSBuYW47Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgbXN3OwotICAgIHVuc2lnbmVkIGxvbmcgbHN3OwotICB9IHBhcnRzOwotICAgIGxvbmcgYXNsb25nWzJdOwotfSBfX2llZWVfZG91YmxlX3NoYXBlX3R5cGU7Ci0KLSNlbmRpZgotCi0jaWZkZWYgX19JRUVFX0xJVFRMRV9FTkRJQU4KLQotdHlwZWRlZiB1bmlvbiAKLXsKLSAgZG91YmxlIHZhbHVlOwotICBzdHJ1Y3QgCi0gIHsKLSNpZmRlZiBfX1NNQUxMX0JJVEZJRUxEUwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjM6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMjoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24xOjE2OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6IDQ7Ci0jZWxzZQotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6MzI7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMDoyMDsKLSNlbmRpZgotICAgIHVuc2lnbmVkIGludCBleHBvbmVudCA6MTE7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gICAgIDogMTsKLSAgfSBudW1iZXI7Ci0gIHN0cnVjdCAKLSAgewotI2lmZGVmIF9fU01BTExfQklURklFTERTCi0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMzoxNjsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24yOjE2OwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDozOwotI2Vsc2UKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24xOjMyOwotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjA6MTk7Ci0jZW5kaWYKLSAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6IDExOwotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgfSBuYW47Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGxvbmcgbHN3OwotICAgIHVuc2lnbmVkIGxvbmcgbXN3OwotICB9IHBhcnRzOwotCi0gIGxvbmcgYXNsb25nWzJdOwotCi19IF9faWVlZV9kb3VibGVfc2hhcGVfdHlwZTsKLQotI2VuZGlmCi0KLSNpZmRlZiBfX0lFRUVfQklHX0VORElBTgotdHlwZWRlZiB1bmlvbgotewotICBmbG9hdCB2YWx1ZTsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ24gOiAxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDogODsKLSAgICB1bnNpZ25lZCBpbnQgZnJhY3Rpb24wOiA3OwotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjE6IDE2OwotICB9IG51bWJlcjsKLSAgc3RydWN0IAotICB7Ci0gICAgdW5zaWduZWQgaW50IHNpZ246MTsKLSAgICB1bnNpZ25lZCBpbnQgZXhwb25lbnQ6ODsKLSAgICB1bnNpZ25lZCBpbnQgcXVpZXQ6MTsKLSAgICB1bnNpZ25lZCBpbnQgZnVuY3Rpb24wOjY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMToxNjsKLSAgfSBuYW47Ci0gIGxvbmcgcDE7Ci0gIAotfSBfX2llZWVfZmxvYXRfc2hhcGVfdHlwZTsKLSNlbmRpZgotCi0jaWZkZWYgX19JRUVFX0xJVFRMRV9FTkRJQU4KLXR5cGVkZWYgdW5pb24KLXsKLSAgZmxvYXQgdmFsdWU7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBmcmFjdGlvbjA6IDc7Ci0gICAgdW5zaWduZWQgaW50IGZyYWN0aW9uMTogMTY7Ci0gICAgdW5zaWduZWQgaW50IGV4cG9uZW50OiA4OwotICAgIHVuc2lnbmVkIGludCBzaWduIDogMTsKLSAgfSBudW1iZXI7Ci0gIHN0cnVjdCAKLSAgewotICAgIHVuc2lnbmVkIGludCBmdW5jdGlvbjE6MTY7Ci0gICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uMDo2OwotICAgIHVuc2lnbmVkIGludCBxdWlldDoxOwotICAgIHVuc2lnbmVkIGludCBleHBvbmVudDo4OwotICAgIHVuc2lnbmVkIGludCBzaWduOjE7Ci0gIH0gbmFuOwotICBsb25nIHAxOwotICAKLX0gX19pZWVlX2Zsb2F0X3NoYXBlX3R5cGU7Ci0jZW5kaWYKLQotCi1kb3VibGUgREVGVU4oY29weXNpZ24sICh4LCB5KSwgZG91YmxlIHggQU5EIGRvdWJsZSB5KQotewotICBfX2llZWVfZG91YmxlX3NoYXBlX3R5cGUgYSxiOwotICBiLnZhbHVlID0geTsgIAotICBhLnZhbHVlID0geDsKLSAgYS5udW1iZXIuc2lnbiA9Yi5udW1iZXIuc2lnbjsKLSAgcmV0dXJuIGEudmFsdWU7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvY3BsdXMtZGVtLmMgYi9saWJpYmVydHkvY3BsdXMtZGVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWY1NmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2NwbHVzLWRlbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDYxMCArMCwwIEBACi0vKiBEZW1hbmdsZXIgZm9yIEdOVSBDKysKLSAgIENvcHlyaWdodCAxOTg5LCA5MSwgOTQsIDk1LCA5NiwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBKYW1lcyBDbGFyayAoampjQGpjbGFyay51dWNwKQotICAgUmV3cml0dGVuIGJ5IEZyZWQgRmlzaCAoZm5mQGN5Z251cy5jb20pIGZvciBBUk0gYW5kIEx1Y2lkIGRlbWFuZ2xpbmcKLSAgIE1vZGlmaWVkIGJ5IFNhdGlzaCBQYWkgKHBhaUBhcG9sbG8uaHAuY29tKSBmb3IgSFAgZGVtYW5nbGluZwotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGV4cG9ydHMgdHdvIGZ1bmN0aW9uczsgY3BsdXNfbWFuZ2xlX29wbmFtZSBhbmQgY3BsdXNfZGVtYW5nbGUuCi0KLSAgIFRoaXMgZmlsZSBpbXBvcnRzIHhtYWxsb2MgYW5kIHhyZWFsbG9jLCB3aGljaCBhcmUgbGlrZSBtYWxsb2MgYW5kCi0gICByZWFsbG9jIGV4Y2VwdCB0aGF0IHRoZXkgZ2VuZXJhdGUgYSBmYXRhbCBlcnJvciBpZiB0aGVyZSBpcyBubwotICAgYXZhaWxhYmxlIG1lbW9yeS4gICovCi0KLS8qIFRoaXMgZmlsZSBsaXZlcyBpbiBib3RoIEdDQyBhbmQgbGliaWJlcnR5LiAgV2hlbiBtYWtpbmcgY2hhbmdlcywgcGxlYXNlCi0gICB0cnkgbm90IHRvIGJyZWFrIGVpdGhlci4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbHNlCi1jaGFyICogbWFsbG9jICgpOwotY2hhciAqIHJlYWxsb2MgKCk7Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGRlbWFuZ2xlLmg+Ci0jdW5kZWYgQ1VSUkVOVF9ERU1BTkdMSU5HX1NUWUxFCi0jZGVmaW5lIENVUlJFTlRfREVNQU5HTElOR19TVFlMRSB3b3JrLT5vcHRpb25zCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKm15c3Ryc3RyIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLW15c3Ryc3RyIChzMSwgczIpCi0gICAgIGNvbnN0IGNoYXIgKnMxLCAqczI7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSBzMTsKLSAgcmVnaXN0ZXIgaW50IGxlbiA9IHN0cmxlbiAoczIpOwotCi0gIGZvciAoOyAocCA9IHN0cmNociAocCwgKnMyKSkgIT0gMDsgcCsrKQotICAgIHsKLSAgICAgIGlmIChzdHJuY21wIChwLCBzMiwgbGVuKSA9PSAwKQotCXsKLQkgIHJldHVybiAocCk7Ci0JfQotICAgIH0KLSAgcmV0dXJuICgwKTsKLX0KLQotLyogSW4gb3JkZXIgdG8gYWxsb3cgYSBzaW5nbGUgZGVtYW5nbGVyIGV4ZWN1dGFibGUgdG8gZGVtYW5nbGUgc3RyaW5ncwotICAgdXNpbmcgdmFyaW91cyBjb21tb24gdmFsdWVzIG9mIENQTFVTX01BUktFUiwgYXMgd2VsbCBhcyBhbnkgc3BlY2lmaWMKLSAgIG9uZSBzZXQgYXQgY29tcGlsZSB0aW1lLCB3ZSBtYWludGFpbiBhIHN0cmluZyBjb250YWluaW5nIGFsbCB0aGUKLSAgIGNvbW1vbmx5IHVzZWQgb25lcywgYW5kIGNoZWNrIHRvIHNlZSBpZiB0aGUgbWFya2VyIHdlIGFyZSBsb29raW5nIGZvcgotICAgaXMgaW4gdGhhdCBzdHJpbmcuICBDUExVU19NQVJLRVIgaXMgdXN1YWxseSAnJCcgb24gc3lzdGVtcyB3aGVyZSB0aGUKLSAgIGFzc2VtYmxlciBjYW4gZGVhbCB3aXRoIHRoYXQuICBXaGVyZSB0aGUgYXNzZW1ibGVyIGNhbid0LCBpdCdzIHVzdWFsbHkKLSAgICcuJyAoYnV0IG9uIG1hbnkgc3lzdGVtcyAnLicgaXMgdXNlZCBmb3Igb3RoZXIgdGhpbmdzKS4gIFdlIHB1dCB0aGUKLSAgIGN1cnJlbnQgZGVmaW5lZCBDUExVU19NQVJLRVIgZmlyc3QgKHdoaWNoIGRlZmF1bHRzIHRvICckJyksIGZvbGxvd2VkCi0gICBieSB0aGUgbmV4dCBtb3N0IGNvbW1vbiB2YWx1ZSwgZm9sbG93ZWQgYnkgYW4gZXhwbGljaXQgJyQnIGluIGNhc2UKLSAgIHRoZSB2YWx1ZSBvZiBDUExVU19NQVJLRVIgaXMgbm90ICckJy4KLQotICAgV2UgY291bGQgYXZvaWQgdGhpcyBpZiB3ZSBjb3VsZCBqdXN0IGdldCBnKysgdG8gdGVsbCB1cyB3aGF0IHRoZSBhY3R1YWwKLSAgIGNwbHVzIG1hcmtlciBjaGFyYWN0ZXIgaXMgYXMgcGFydCBvZiB0aGUgZGVidWcgaW5mb3JtYXRpb24sIHBlcmhhcHMgYnkKLSAgIGVuc3VyaW5nIHRoYXQgaXQgaXMgdGhlIGNoYXJhY3RlciB0aGF0IHRlcm1pbmF0ZXMgdGhlIGdjYzxuPl9jb21waWxlZAotICAgbWFya2VyIHN5bWJvbCAoRklYTUUpLiAgKi8KLQotI2lmICFkZWZpbmVkIChDUExVU19NQVJLRVIpCi0jZGVmaW5lIENQTFVTX01BUktFUiAnJCcKLSNlbmRpZgotCi1lbnVtIGRlbWFuZ2xpbmdfc3R5bGVzIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGdudV9kZW1hbmdsaW5nOwotCi1zdGF0aWMgY2hhciBjcGx1c19tYXJrZXJzW10gPSB7IENQTFVTX01BUktFUiwgJy4nLCAnJCcsICdcMCcgfTsKLQotc3RhdGljIGNoYXIgY2hhcl9zdHJbMl0gPSB7ICdcMDAwJywgJ1wwMDAnIH07Ci0KLXZvaWQKLXNldF9jcGx1c19tYXJrZXJfZm9yX2RlbWFuZ2xpbmcgKGNoKQotICAgICBpbnQgY2g7Ci17Ci0gIGNwbHVzX21hcmtlcnNbMF0gPSBjaDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3Qgc3RyaW5nCQkvKiBCZXdhcmU6IHRoZXNlIGFyZW4ndCByZXF1aXJlZCB0byBiZSAqLwotewkJCQkvKiAgJ1wwJyB0ZXJtaW5hdGVkLiAgKi8KLSAgY2hhciAqYjsJCQkvKiBwb2ludGVyIHRvIHN0YXJ0IG9mIHN0cmluZyAqLwotICBjaGFyICpwOwkJCS8qIHBvaW50ZXIgYWZ0ZXIgbGFzdCBjaGFyYWN0ZXIgKi8KLSAgY2hhciAqZTsJCQkvKiBwb2ludGVyIGFmdGVyIGVuZCBvZiBhbGxvY2F0ZWQgc3BhY2UgKi8KLX0gc3RyaW5nOwotCi0vKiBTdHVmZiB0aGF0IGlzIHNoYXJlZCBiZXR3ZWVuIHN1Yi1yb3V0aW5lcy4KLSAgIFVzaW5nIGEgc2hhcmVkIHN0cnVjdHVyZSBhbGxvd3MgY3BsdXNfZGVtYW5nbGUgdG8gYmUgcmVlbnRyYW50LiAgKi8KLQotc3RydWN0IHdvcmtfc3R1ZmYKLXsKLSAgaW50IG9wdGlvbnM7Ci0gIGNoYXIgKip0eXBldmVjOwotICBjaGFyICoqa3R5cGV2ZWM7Ci0gIGNoYXIgKipidHlwZXZlYzsKLSAgaW50IG51bWs7Ci0gIGludCBudW1iOwotICBpbnQga3NpemU7Ci0gIGludCBic2l6ZTsKLSAgaW50IG50eXBlczsKLSAgaW50IHR5cGV2ZWNfc2l6ZTsKLSAgaW50IGNvbnN0cnVjdG9yOwotICBpbnQgZGVzdHJ1Y3RvcjsKLSAgaW50IHN0YXRpY190eXBlOwkvKiBBIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gKi8KLSAgaW50IHRlbXBfc3RhcnQ7ICAgICAgIC8qIGluZGV4IGluIGRlbWFuZ2xlZCB0byBzdGFydCBvZiB0ZW1wbGF0ZSBhcmdzICovCi0gIGludCB0eXBlX3F1YWxzOyAgICAgICAvKiBUaGUgdHlwZSBxdWFsaWZpZXJzLiAgKi8KLSAgaW50IGRsbGltcG9ydGVkOwkvKiBTeW1ib2wgaW1wb3J0ZWQgZnJvbSBhIFBFIERMTCAqLwotICBjaGFyICoqdG1wbF9hcmd2ZWM7ICAgLyogVGVtcGxhdGUgZnVuY3Rpb24gYXJndW1lbnRzLiAqLwotICBpbnQgbnRtcGxfYXJnczsgICAgICAgLyogVGhlIG51bWJlciBvZiB0ZW1wbGF0ZSBmdW5jdGlvbiBhcmd1bWVudHMuICovCi0gIGludCBmb3JnZXR0aW5nX3R5cGVzOyAvKiBOb256ZXJvIGlmIHdlIGFyZSBub3QgcmVtZW1iZXJpbmcgdGhlIHR5cGVzCi0JCQkgICB3ZSBzZWUuICAqLwotICBzdHJpbmcqIHByZXZpb3VzX2FyZ3VtZW50OyAvKiBUaGUgbGFzdCBmdW5jdGlvbiBhcmd1bWVudCBkZW1hbmdsZWQuICAqLwotICBpbnQgbnJlcGVhdHM7ICAgICAgICAgLyogVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHByZXZpb3VzCi0JCQkgICBhcmd1bWVudC4gICovCi19OwotCi0jZGVmaW5lIFBSSU5UX0FOU0lfUVVBTElGSUVSUyAod29yayAtPiBvcHRpb25zICYgRE1HTF9BTlNJKQotI2RlZmluZSBQUklOVF9BUkdfVFlQRVMgICAgICAgKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfUEFSQU1TKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9wdGFibGUKLXsKLSAgY29uc3QgY2hhciAqaW47Ci0gIGNvbnN0IGNoYXIgKm91dDsKLSAgaW50IGZsYWdzOwotfSBvcHRhYmxlW10gPSB7Ci0gIHsibnciLAkgICIgbmV3IiwJRE1HTF9BTlNJfSwJLyogbmV3ICgxLjkyLAkgYW5zaSkgKi8KLSAgeyJkbCIsCSAgIiBkZWxldGUiLAlETUdMX0FOU0l9LAkvKiBuZXcgKDEuOTIsCSBhbnNpKSAqLwotICB7Im5ldyIsCSAgIiBuZXciLAkwfSwJCS8qIG9sZCAoMS45MSwJIGFuZCAxLngpICovCi0gIHsiZGVsZXRlIiwJICAiIGRlbGV0ZSIsCTB9LAkJLyogb2xkICgxLjkxLAkgYW5kIDEueCkgKi8KLSAgeyJ2biIsCSAgIiBuZXcgW10iLAlETUdMX0FOU0l9LAkvKiBHTlUsIHBlbmRpbmcgYW5zaSAqLwotICB7InZkIiwJICAiIGRlbGV0ZSBbXSIsCURNR0xfQU5TSX0sCS8qIEdOVSwgcGVuZGluZyBhbnNpICovCi0gIHsiYXMiLAkgICI9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJuZSIsCSAgIiE9IiwJCURNR0xfQU5TSX0sCS8qIG9sZCwgYW5zaSAqLwotICB7ImVxIiwJICAiPT0iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsiZ2UiLAkgICI+PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJndCIsCSAgIj4iLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsibGUiLAkgICI8PSIsCQlETUdMX0FOU0l9LAkvKiBvbGQsCWFuc2kgKi8KLSAgeyJsdCIsCSAgIjwiLAkJRE1HTF9BTlNJfSwJLyogb2xkLAlhbnNpICovCi0gIHsicGx1cyIsCSAgIisiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJwbCIsCSAgIisiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFwbCIsCSAgIis9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJtaW51cyIsCSAgIi0iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtaSIsCSAgIi0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFtaSIsCSAgIi09IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJtdWx0IiwJICAiKiIsCQkwfSwJCS8qIG9sZCAqLwotICB7Im1sIiwJICAiKiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYW11IiwJICAiKj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAoQVJNL0x1Y2lkKSAqLwotICB7ImFtbCIsCSAgIio9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKEdOVS9nKyspICovCi0gIHsiY29udmVydCIsCSAgIisiLAkJMH0sCQkvKiBvbGQgKHVuYXJ5ICspICovCi0gIHsibmVnYXRlIiwJICAiLSIsCQkwfSwJCS8qIG9sZCAodW5hcnkgLSkgKi8KLSAgeyJ0cnVuY19tb2QiLAkgICIlIiwJCTB9LAkJLyogb2xkICovCi0gIHsibWQiLAkgICIlIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhbWQiLAkgICIlPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1bmNfZGl2IiwJICAiLyIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImR2IiwJICAiLyIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWR2IiwJICAiLz0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InRydXRoX2FuZGlmIiwgIiYmIiwJCTB9LAkJLyogb2xkICovCi0gIHsiYWEiLAkgICImJiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsidHJ1dGhfb3JpZiIsICAifHwiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJvbyIsCSAgInx8IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJ0cnV0aF9ub3QiLAkgICIhIiwJCTB9LAkJLyogb2xkICovCi0gIHsibnQiLAkgICIhIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJwb3N0aW5jcmVtZW50IiwiKysiLAkwfSwJCS8qIG9sZCAqLwotICB7InBwIiwJICAiKysiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InBvc3RkZWNyZW1lbnQiLCItLSIsCTB9LAkJLyogb2xkICovCi0gIHsibW0iLAkgICItLSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X2lvciIsCSAgInwiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJvciIsCSAgInwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFvciIsCSAgInw9IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJiaXRfeG9yIiwJICAiXiIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImVyIiwJICAiXiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYWVyIiwJICAiXj0iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImJpdF9hbmQiLAkgICImIiwJCTB9LAkJLyogb2xkICovCi0gIHsiYWQiLAkgICImIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhYWQiLAkgICImPSIsCQlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiYml0X25vdCIsCSAgIn4iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJjbyIsCSAgIn4iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNhbGwiLAkgICIoKSIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImNsIiwJICAiKCkiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFsc2hpZnQiLAkgICI8PCIsCQkwfSwJCS8qIG9sZCAqLwotICB7ImxzIiwJICAiPDwiLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImFscyIsCSAgIjw8PSIsCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhcnNoaWZ0IiwJICAiPj4iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJycyIsCSAgIj4+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJhcnMiLAkgICI+Pj0iLAlETUdMX0FOU0l9LAkvKiBhbnNpICovCi0gIHsiY29tcG9uZW50IiwJICAiLT4iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJwdCIsCSAgIi0+IiwJCURNR0xfQU5TSX0sCS8qIGFuc2k7IEx1Y2lkIEMrKyBmb3JtICovCi0gIHsicmYiLAkgICItPiIsCQlETUdMX0FOU0l9LAkvKiBhbnNpOyBBUk0vR05VIGZvcm0gKi8KLSAgeyJpbmRpcmVjdCIsCSAgIioiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtZXRob2RfY2FsbCIsICAiLT4oKSIsCTB9LAkJLyogb2xkICovCi0gIHsiYWRkciIsCSAgIiYiLAkJMH0sCQkvKiBvbGQgKHVuYXJ5ICYpICovCi0gIHsiYXJyYXkiLAkgICJbXSIsCQkwfSwJCS8qIG9sZCAqLwotICB7InZjIiwJICAiW10iLAkJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7ImNvbXBvdW5kIiwJICAiLCAiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJjbSIsCSAgIiwgIiwJCURNR0xfQU5TSX0sCS8qIGFuc2kgKi8KLSAgeyJjb25kIiwJICAiPzoiLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJjbiIsCSAgIj86IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCi0gIHsibWF4IiwJICAiPj8iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJteCIsCSAgIj4/IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCi0gIHsibWluIiwJICAiPD8iLAkJMH0sCQkvKiBvbGQgKi8KLSAgeyJtbiIsCSAgIjw/IiwJCURNR0xfQU5TSX0sCS8qIHBzZXVkby1hbnNpICovCi0gIHsibm9wIiwJICAiIiwJCTB9LAkJLyogb2xkIChmb3Igb3BlcmF0b3I9KSAqLwotICB7InJtIiwJICAiLT4qIiwJRE1HTF9BTlNJfSwJLyogYW5zaSAqLwotICB7InN6IiwgICAgICAgICAgInNpemVvZiAiLCAgICBETUdMX0FOU0l9ICAgICAgLyogcHNldWRvLWFuc2kgKi8KLX07Ci0KLS8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgdmFyaW91cyB0eXBlIHZhcmlldGllcy4KLSAgIFRoZXkgYXJlIGFsbCBub24temVybyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgYXMgYHN1Y2Nlc3MnCi0gICB2YWx1ZXMuICAqLwotdHlwZWRlZiBlbnVtIHR5cGVfa2luZF90Ci17Ci0gIHRrX25vbmUsCi0gIHRrX3BvaW50ZXIsCi0gIHRrX3JlZmVyZW5jZSwKLSAgdGtfaW50ZWdyYWwsCi0gIHRrX2Jvb2wsCi0gIHRrX2NoYXIsCi0gIHRrX3JlYWwKLX0gdHlwZV9raW5kX3Q7Ci0KLSNkZWZpbmUgU1RSSU5HX0VNUFRZKHN0cikJKChzdHIpIC0+IGIgPT0gKHN0cikgLT4gcCkKLSNkZWZpbmUgUFJFUEVORF9CTEFOSyhzdHIpCXtpZiAoIVNUUklOR19FTVBUWShzdHIpKSBcCi0gICAgc3RyaW5nX3ByZXBlbmQoc3RyLCAiICIpO30KLSNkZWZpbmUgQVBQRU5EX0JMQU5LKHN0cikJe2lmICghU1RSSU5HX0VNUFRZKHN0cikpIFwKLSAgICBzdHJpbmdfYXBwZW5kKHN0ciwgIiAiKTt9Ci0jZGVmaW5lIExFTl9TVFJJTkcoc3RyKSAgICAgICAgICggKFNUUklOR19FTVBUWShzdHIpKT8wOigoc3RyKS0+cCAtIChzdHIpLT5iKSkKLQotLyogVGhlIHNjb3BlIHNlcGFyYXRvciBhcHByb3ByaWF0ZSBmb3IgdGhlIGxhbmd1YWdlIGJlaW5nIGRlbWFuZ2xlZC4gICovCi0KLSNkZWZpbmUgU0NPUEVfU1RSSU5HKHdvcmspICgod29yay0+b3B0aW9ucyAmIERNR0xfSkFWQSkgPyAiLiIgOiAiOjoiKQotCi0jZGVmaW5lIEFSTV9WVEFCTEVfU1RSSU5HICJfX3Z0YmxfXyIJLyogTHVjaWQvQVJNIHZpcnR1YWwgdGFibGUgcHJlZml4ICovCi0jZGVmaW5lIEFSTV9WVEFCTEVfU1RSTEVOIDgJCS8qIHN0cmxlbiAoQVJNX1ZUQUJMRV9TVFJJTkcpICovCi0KLS8qIFByb3RvdHlwZXMgZm9yIGxvY2FsIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgY2hhciAqCi1tb3BfdXAgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgc3RyaW5nICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotc3F1YW5nbGVfbW9wX3VwIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICopKTsKLQotI2lmIDAKLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX21ldGhvZF9hcmdzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKgotaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3RlbXBsYXRlX3Bhcm0gUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssCi0JCQkJCSBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKiwgc3RyaW5nICosCi0JCQkgICBzdHJpbmcgKiwgaW50LCBpbnQpKTsKLQotc3RhdGljIGludAotYXJtX3B0IFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICoqLAotCQljb25zdCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2NsYXNzX25hbWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfcXVhbGlmaWVkIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqLAotCQkJICAgIGludCwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2NsYXNzIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2Z1bmRfdHlwZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9zaWduYXR1cmUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfcHJlZml4IFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWdudV9zcGVjaWFsIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWFybV9zcGVjaWFsIFBBUkFNUyAoKGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfbmVlZCBQQVJBTVMgKChzdHJpbmcgKiwgaW50KSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfZGVsZXRlIFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfaW5pdCBQQVJBTVMgKChzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2NsZWFyIFBBUkFNUyAoKHN0cmluZyAqKSk7Ci0KLSNpZiAwCi1zdGF0aWMgaW50Ci1zdHJpbmdfZW1wdHkgUEFSQU1TICgoc3RyaW5nICopKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZCBQQVJBTVMgKChzdHJpbmcgKiwgY29uc3QgY2hhciAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfYXBwZW5kcyBQQVJBTVMgKChzdHJpbmcgKiwgc3RyaW5nICopKTsKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRuIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmQgUEFSQU1TICgoc3RyaW5nICosIGNvbnN0IGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmRuIFBBUkFNUyAoKHN0cmluZyAqLCBjb25zdCBjaGFyICosIGludCkpOwotCi1zdGF0aWMgaW50Ci1nZXRfY291bnQgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgaW50ICopKTsKLQotc3RhdGljIGludAotY29uc3VtZV9jb3VudCBQQVJBTVMgKChjb25zdCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBpbnQKLWNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyBQQVJBTVMgKChjb25zdCBjaGFyKiopKTsKLQotc3RhdGljIGludAotZGVtYW5nbGVfYXJncyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9uZXN0ZWRfYXJncyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiosIGNvbnN0IGNoYXIqKiwgc3RyaW5nKikpOwotCi1zdGF0aWMgaW50Ci1kb190eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRvX2FyZyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKiwKLQkJCQljb25zdCBjaGFyICopKTsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0J0eXBlIFBBUkFNUyAoKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpKTsKLQotc3RhdGljIGludAotcmVnaXN0ZXJfQnR5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKikpOwotCi1zdGF0aWMgdm9pZAotcmVtZW1iZXJfS3R5cGUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWZvcmdldF90eXBlcyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1mb3JnZXRfQl9hbmRfS190eXBlcyBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZHMgUEFSQU1TICgoc3RyaW5nICosIHN0cmluZyAqKSk7Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYqLCBjb25zdCBjaGFyKiosCi0JCQkJICAgICAgc3RyaW5nKiwgdHlwZV9raW5kX3QpKTsKLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfY29uc3RfdmFsdWUgUEFSQU1TICgoc3RydWN0IHdvcmtfc3R1ZmYgKiwgY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotc3RhdGljIGludAotZG9faHBhY2NfdGVtcGxhdGVfbGl0ZXJhbCBQQVJBTVMgKChzdHJ1Y3Qgd29ya19zdHVmZiAqLCBjb25zdCBjaGFyICoqLCBzdHJpbmcgKikpOwotCi1zdGF0aWMgaW50Ci1zbmFyZl9udW1lcmljX2xpdGVyYWwgUEFSQU1TICgoY29uc3QgY2hhciAqKiwgc3RyaW5nICopKTsKLQotLyogVGhlcmUgaXMgYSBUWVBFX1FVQUwgdmFsdWUgZm9yIGVhY2ggdHlwZSBxdWFsaWZpZXIuICBUaGV5IGNhbiBiZQotICAgY29tYmluZWQgYnkgYml0d2lzZS1vciB0byBmb3JtIHRoZSBjb21wbGV0ZSBzZXQgb2YgcXVhbGlmaWVycyBmb3IgYQotICAgdHlwZS4gICovCi0KLSNkZWZpbmUgVFlQRV9VTlFVQUxJRklFRCAgIDB4MAotI2RlZmluZSBUWVBFX1FVQUxfQ09OU1QgICAgMHgxCi0jZGVmaW5lIFRZUEVfUVVBTF9WT0xBVElMRSAweDIKLSNkZWZpbmUgVFlQRV9RVUFMX1JFU1RSSUNUIDB4NAotCi1zdGF0aWMgaW50Ci1jb2RlX2Zvcl9xdWFsaWZpZXIgUEFSQU1TICgoaW50KSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyKgotcXVhbGlmaWVyX3N0cmluZyBQQVJBTVMgKChpbnQpKTsKLQotc3RhdGljIGNvbnN0IGNoYXIqCi1kZW1hbmdsZV9xdWFsaWZpZXIgUEFSQU1TICgoaW50KSk7Ci0KLS8qIFRyYW5zbGF0ZSBjb3VudCB0byBpbnRlZ2VyLCBjb25zdW1pbmcgdG9rZW5zIGluIHRoZSBwcm9jZXNzLgotICAgQ29udmVyc2lvbiB0ZXJtaW5hdGVzIG9uIHRoZSBmaXJzdCBub24tZGlnaXQgY2hhcmFjdGVyLgotCi0gICBUcnlpbmcgdG8gY29uc3VtZSBzb21ldGhpbmcgdGhhdCBpc24ndCBhIGNvdW50IHJlc3VsdHMgaW4gbm8KLSAgIGNvbnN1bXB0aW9uIG9mIGlucHV0IGFuZCBhIHJldHVybiBvZiAtMS4KLQotICAgT3ZlcmZsb3cgY29uc3VtZXMgdGhlIHJlc3Qgb2YgdGhlIGRpZ2l0cywgYW5kIHJldHVybnMgLTEuICAqLwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50ICh0eXBlKQotICAgICBjb25zdCBjaGFyICoqdHlwZTsKLXsKLSAgaW50IGNvdW50ID0gMDsKLQotICBpZiAoISBpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKnR5cGUpKQotICAgIHJldHVybiAtMTsKLQotICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLSAgICB7Ci0gICAgICBjb3VudCAqPSAxMDsKLQotICAgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93LgotCSBXZSBhc3N1bWUgdGhhdCBjb3VudCBpcyByZXByZXNlbnRlZCB1c2luZyB0d28ncy1jb21wbGVtZW50OwotCSBubyBwb3dlciBvZiB0d28gaXMgZGl2aXNpYmxlIGJ5IHRlbiwgc28gaWYgYW4gb3ZlcmZsb3cgb2NjdXJzCi0JIHdoZW4gbXVsdGlwbHlpbmcgYnkgdGVuLCB0aGUgcmVzdWx0IHdpbGwgbm90IGJlIGEgbXVsdGlwbGUgb2YKLQkgdGVuLiAgKi8KLSAgICAgIGlmICgoY291bnQgJSAxMCkgIT0gMCkKLQl7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpICoqdHlwZSkpCi0JICAgICgqdHlwZSkrKzsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGNvdW50ICs9ICoqdHlwZSAtICcwJzsKLSAgICAgICgqdHlwZSkrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIChjb3VudCk7Ci19Ci0KLQotLyogTGlrZSBjb25zdW1lX2NvdW50LCBidXQgZm9yIGNvdW50cyB0aGF0IGFyZSBwcmVjZWRlZCBhbmQgZm9sbG93ZWQKLSAgIGJ5ICdfJyBpZiB0aGV5IGFyZSBncmVhdGVyIHRoYW4gMTAuICBBbHNvLCAtMSBpcyByZXR1cm5lZCBmb3IKLSAgIGZhaWx1cmUsIHNpbmNlIDAgY2FuIGJlIGEgdmFsaWQgdmFsdWUuICAqLwotCi1zdGF0aWMgaW50Ci1jb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpCi0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotewotICBpbnQgaWR4OwotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotICAgIHsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlkeCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotICAgICAgaWYgKCoqbWFuZ2xlZCAhPSAnXycpCi0JLyogVGhlIHRyYWlsaW5nIHVuZGVyc2NvcmUgd2FzIG1pc3NpbmcuICovCi0JcmV0dXJuIC0xOwotCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgaWYgKCoqbWFuZ2xlZCA8ICcwJyB8fCAqKm1hbmdsZWQgPiAnOScpCi0JcmV0dXJuIC0xOwotCi0gICAgICBpZHggPSAqKm1hbmdsZWQgLSAnMCc7Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgfQotCi0gIHJldHVybiBpZHg7Ci19Ci0KLS8qIEMgaXMgdGhlIGNvZGUgZm9yIGEgdHlwZS1xdWFsaWZpZXIuICBSZXR1cm4gdGhlIFRZUEVfUVVBTAotICAgY29ycmVzcG9uZGluZyB0byB0aGlzIHF1YWxpZmllci4gICovCi0KLXN0YXRpYyBpbnQKLWNvZGVfZm9yX3F1YWxpZmllciAoYykKLSAgaW50IGM7Ci17Ci0gIHN3aXRjaCAoYykKLSAgICB7Ci0gICAgY2FzZSAnQyc6Ci0gICAgICByZXR1cm4gVFlQRV9RVUFMX0NPTlNUOwotCi0gICAgY2FzZSAnVic6Ci0gICAgICByZXR1cm4gVFlQRV9RVUFMX1ZPTEFUSUxFOwotCi0gICAgY2FzZSAndSc6Ci0gICAgICByZXR1cm4gVFlQRV9RVUFMX1JFU1RSSUNUOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBDIHdhcyBhbiBpbnZhbGlkIHF1YWxpZmllci4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBSZXR1cm4gdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBxdWFsaWZpZXJzIGdpdmVuIGJ5Ci0gICBUWVBFX1FVQUxTLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1xdWFsaWZpZXJfc3RyaW5nICh0eXBlX3F1YWxzKQotICAgICBpbnQgdHlwZV9xdWFsczsKLXsKLSAgc3dpdGNoICh0eXBlX3F1YWxzKQotICAgIHsKLSAgICBjYXNlIFRZUEVfVU5RVUFMSUZJRUQ6Ci0gICAgICByZXR1cm4gIiI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9DT05TVDoKLSAgICAgIHJldHVybiAiY29uc3QiOwotCi0gICAgY2FzZSBUWVBFX1FVQUxfVk9MQVRJTEU6Ci0gICAgICByZXR1cm4gInZvbGF0aWxlIjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX1JFU1RSSUNUOgotICAgICAgcmV0dXJuICJfX3Jlc3RyaWN0IjsKLQotICAgIGNhc2UgVFlQRV9RVUFMX0NPTlNUIHwgVFlQRV9RVUFMX1ZPTEFUSUxFOgotICAgICAgcmV0dXJuICJjb25zdCB2b2xhdGlsZSI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9DT05TVCB8IFRZUEVfUVVBTF9SRVNUUklDVDoKLSAgICAgIHJldHVybiAiY29uc3QgX19yZXN0cmljdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9WT0xBVElMRSB8IFRZUEVfUVVBTF9SRVNUUklDVDoKLSAgICAgIHJldHVybiAidm9sYXRpbGUgX19yZXN0cmljdCI7Ci0KLSAgICBjYXNlIFRZUEVfUVVBTF9DT05TVCB8IFRZUEVfUVVBTF9WT0xBVElMRSB8IFRZUEVfUVVBTF9SRVNUUklDVDoKLSAgICAgIHJldHVybiAiY29uc3Qgdm9sYXRpbGUgX19yZXN0cmljdCI7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIC8qIFRZUEVfUVVBTFMgd2FzIGFuIGludmFsaWQgcXVhbGlmaWVyIHNldC4gICovCi0gIGFib3J0ICgpOwotfQotCi0vKiBDIGlzIHRoZSBjb2RlIGZvciBhIHR5cGUtcXVhbGlmaWVyLiAgUmV0dXJuIHRoZSBzdHJpbmcKLSAgIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBxdWFsaWZpZXIuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlCi0gICBjYWxsZWQgd2l0aCBhIHZhbGlkIHF1YWxpZmllciBjb2RlLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIqCi1kZW1hbmdsZV9xdWFsaWZpZXIgKGMpCi0gIGludCBjOwotewotICByZXR1cm4gcXVhbGlmaWVyX3N0cmluZyAoY29kZV9mb3JfcXVhbGlmaWVyIChjKSk7Ci19Ci0KLWludAotY3BsdXNfZGVtYW5nbGVfb3BuYW1lIChvcG5hbWUsIHJlc3VsdCwgb3B0aW9ucykKLSAgICAgY29uc3QgY2hhciAqb3BuYW1lOwotICAgICBjaGFyICpyZXN1bHQ7Ci0gICAgIGludCBvcHRpb25zOwotewotICBpbnQgbGVuLCBsZW4xLCByZXQ7Ci0gIHN0cmluZyB0eXBlOwotICBzdHJ1Y3Qgd29ya19zdHVmZiB3b3JrWzFdOwotICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgbGVuID0gc3RybGVuKG9wbmFtZSk7Ci0gIHJlc3VsdFswXSA9ICdcMCc7Ci0gIHJldCA9IDA7Ci0gIG1lbXNldCAoKGNoYXIgKikgd29yaywgMCwgc2l6ZW9mICh3b3JrKSk7Ci0gIHdvcmstPm9wdGlvbnMgPSBvcHRpb25zOwotCi0gIGlmIChvcG5hbWVbMF0gPT0gJ18nICYmIG9wbmFtZVsxXSA9PSAnXycKLSAgICAgICYmIG9wbmFtZVsyXSA9PSAnbycgJiYgb3BuYW1lWzNdID09ICdwJykKLSAgICB7Ci0gICAgICAvKiBBTlNJLiAgKi8KLSAgICAgIC8qIHR5cGUgY29udmVyc2lvbiBvcGVyYXRvci4gICovCi0gICAgICB0ZW0gPSBvcG5hbWUgKyA0OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yICIpOwotCSAgc3RybmNhdCAocmVzdWx0LCB0eXBlLmIsIHR5cGUucCAtIHR5cGUuYik7Ci0JICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7Ci0JICByZXQgPSAxOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKG9wbmFtZVswXSA9PSAnXycgJiYgb3BuYW1lWzFdID09ICdfJwotCSAgICYmIG9wbmFtZVsyXSA+PSAnYScgJiYgb3BuYW1lWzJdIDw9ICd6JwotCSAgICYmIG9wbmFtZVszXSA+PSAnYScgJiYgb3BuYW1lWzNdIDw9ICd6JykKLSAgICB7Ci0gICAgICBpZiAob3BuYW1lWzRdID09ICdcMCcpCi0JewotCSAgLyogT3BlcmF0b3IuICAqLwotCSAgc2l6ZV90IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDIKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDIsIDIpID09IDApCi0JCXsKLQkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICByZXQgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wbmFtZVsyXSA9PSAnYScgJiYgb3BuYW1lWzVdID09ICdcMCcpCi0JICAgIHsKLQkgICAgICAvKiBBc3NpZ25tZW50LiAgKi8KLQkgICAgICBzaXplX3QgaTsKLQkgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkJewotCQkgIGlmIChzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IDMKLQkJICAgICAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBvcG5hbWUgKyAyLCAzKSA9PSAwKQotCQkgICAgewotCQkgICAgICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7Ci0JCSAgICAgIHN0cmNhdCAocmVzdWx0LCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgICAgIHJldCA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChsZW4gPj0gMwotCSAgICYmIG9wbmFtZVswXSA9PSAnbycKLQkgICAmJiBvcG5hbWVbMV0gPT0gJ3AnCi0JICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBvcG5hbWVbMl0pICE9IE5VTEwpCi0gICAgewotICAgICAgLyogc2VlIGlmIGl0J3MgYW4gYXNzaWdubWVudCBleHByZXNzaW9uICovCi0gICAgICBpZiAobGVuID49IDEwIC8qIG9wJGFzc2lnbl8gKi8KLQkgICYmIG1lbWNtcCAob3BuYW1lICsgMywgImFzc2lnbl8iLCA3KSA9PSAwKQotCXsKLQkgIHNpemVfdCBpOwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBsZW4xID0gbGVuIC0gMTA7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuMQotCQkgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgb3BuYW1lICsgMTAsIGxlbjEpID09IDApCi0JCXsKLQkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICBzdHJjYXQgKHJlc3VsdCwgIj0iKTsKLQkJICByZXQgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc2l6ZV90IGk7Ci0JICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLQkgICAgewotCSAgICAgIGxlbjEgPSBsZW4gLSAzOwotCSAgICAgIGlmICgoaW50KSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pID09IGxlbjEKLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIG9wbmFtZSArIDMsIGxlbjEpID09IDApCi0JCXsKLQkJICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyY2F0IChyZXN1bHQsIG9wdGFibGVbaV0ub3V0KTsKLQkJICByZXQgPSAxOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChsZW4gPj0gNSAmJiBtZW1jbXAgKG9wbmFtZSwgInR5cGUiLCA0KSA9PSAwCi0JICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBvcG5hbWVbNF0pICE9IE5VTEwpCi0gICAgewotICAgICAgLyogdHlwZSBjb252ZXJzaW9uIG9wZXJhdG9yICovCi0gICAgICB0ZW0gPSBvcG5hbWUgKyA1OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJjYXQgKHJlc3VsdCwgIm9wZXJhdG9yICIpOwotCSAgc3RybmNhdCAocmVzdWx0LCB0eXBlLmIsIHR5cGUucCAtIHR5cGUuYik7Ci0JICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7Ci0JICByZXQgPSAxOwotCX0KLSAgICB9Ci0gIHNxdWFuZ2xlX21vcF91cCAod29yayk7Ci0gIHJldHVybiByZXQ7Ci0KLX0KLS8qIFRha2VzIG9wZXJhdG9yIG5hbWUgYXMgZS5nLiAiKysiIGFuZCByZXR1cm5zIG1hbmdsZWQKLSAgIG9wZXJhdG9yIG5hbWUgKGUuZy4gInBvc3RpbmNyZW1lbnRfZXhwciIpLCBvciBOVUxMIGlmIG5vdCBmb3VuZC4KLQotICAgSWYgT1BUSU9OUyAmIERNR0xfQU5TSSA9PSAxLCByZXR1cm4gdGhlIEFOU0kgbmFtZTsKLSAgIGlmIE9QVElPTlMgJiBETUdMX0FOU0kgPT0gMCwgcmV0dXJuIHRoZSBvbGQgR05VIG5hbWUuICAqLwotCi1jb25zdCBjaGFyICoKLWNwbHVzX21hbmdsZV9vcG5hbWUgKG9wbmFtZSwgb3B0aW9ucykKLSAgICAgY29uc3QgY2hhciAqb3BuYW1lOwotICAgICBpbnQgb3B0aW9uczsKLXsKLSAgc2l6ZV90IGk7Ci0gIGludCBsZW47Ci0KLSAgbGVuID0gc3RybGVuIChvcG5hbWUpOwotICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChvcHRhYmxlKSAvIHNpemVvZiAob3B0YWJsZVswXSk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLm91dCkgPT0gbGVuCi0JICAmJiAob3B0aW9ucyAmIERNR0xfQU5TSSkgPT0gKG9wdGFibGVbaV0uZmxhZ3MgJiBETUdMX0FOU0kpCi0JICAmJiBtZW1jbXAgKG9wdGFibGVbaV0ub3V0LCBvcG5hbWUsIGxlbikgPT0gMCkKLQlyZXR1cm4gb3B0YWJsZVtpXS5pbjsKLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19Ci0KLS8qIGNoYXIgKmNwbHVzX2RlbWFuZ2xlIChjb25zdCBjaGFyICptYW5nbGVkLCBpbnQgb3B0aW9ucykKLQotICAgSWYgTUFOR0xFRCBpcyBhIG1hbmdsZWQgZnVuY3Rpb24gbmFtZSBwcm9kdWNlZCBieSBHTlUgQysrLCB0aGVuCi0gICBhIHBvaW50ZXIgdG8gYSBtYWxsb2NlZCBzdHJpbmcgZ2l2aW5nIGEgQysrIHJlcHJlc2VudGF0aW9uCi0gICBvZiB0aGUgbmFtZSB3aWxsIGJlIHJldHVybmVkOyBvdGhlcndpc2UgTlVMTCB3aWxsIGJlIHJldHVybmVkLgotICAgSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgdGhlIHN0cmluZyB3aGljaAotICAgaXMgcmV0dXJuZWQuCi0KLSAgIFRoZSBPUFRJT05TIGFyZyBtYXkgY29udGFpbiBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGJpdHM6Ci0KLSAgIAlETUdMX0FOU0kJQU5TSSBxdWFsaWZpZXJzIHN1Y2ggYXMgYGNvbnN0JyBhbmQgYHZvaWQnIGFyZQotCQkJaW5jbHVkZWQuCi0JRE1HTF9QQVJBTVMJRnVuY3Rpb24gcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQuCi0KLSAgIEZvciBleGFtcGxlLAotCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFpIiwgRE1HTF9QQVJBTVMpCQk9PiAiQTo6Zm9vKGludCkiCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFpIiwgRE1HTF9QQVJBTVMgfCBETUdMX0FOU0kpCT0+ICJBOjpmb28oaW50KSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWkiLCAwKQkJCT0+ICJBOjpmb28iCi0KLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgRE1HTF9QQVJBTVMpCQk9PiAiQTo6Zm9vKGZsb2F0LC4uLikiCi0gICBjcGx1c19kZW1hbmdsZSAoImZvb19fMUFmZSIsIERNR0xfUEFSQU1TIHwgRE1HTF9BTlNJKT0+ICJBOjpmb28oZmxvYXQsLi4uKSIKLSAgIGNwbHVzX2RlbWFuZ2xlICgiZm9vX18xQWZlIiwgMCkJCQk9PiAiQTo6Zm9vIgotCi0gICBOb3RlIHRoYXQgYW55IGxlYWRpbmcgdW5kZXJzY29yZXMsIG9yIG90aGVyIHN1Y2ggY2hhcmFjdGVycyBwcmVwZW5kZWQgYnkKLSAgIHRoZSBjb21waWxhdGlvbiBzeXN0ZW0sIGFyZSBwcmVzdW1lZCB0byBoYXZlIGFscmVhZHkgYmVlbiBzdHJpcHBlZCBmcm9tCi0gICBNQU5HTEVELiAgKi8KLQotY2hhciAqCi1jcGx1c19kZW1hbmdsZSAobWFuZ2xlZCwgb3B0aW9ucykKLSAgICAgY29uc3QgY2hhciAqbWFuZ2xlZDsKLSAgICAgaW50IG9wdGlvbnM7Ci17Ci0gIGNoYXIgKnJldDsKLSAgc3RydWN0IHdvcmtfc3R1ZmYgd29ya1sxXTsKLSAgbWVtc2V0ICgoY2hhciAqKSB3b3JrLCAwLCBzaXplb2YgKHdvcmspKTsKLSAgd29yayAtPiBvcHRpb25zID0gb3B0aW9uczsKLSAgaWYgKCh3b3JrIC0+IG9wdGlvbnMgJiBETUdMX1NUWUxFX01BU0spID09IDApCi0gICAgd29yayAtPiBvcHRpb25zIHw9IChpbnQpIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSAmIERNR0xfU1RZTEVfTUFTSzsKLQotICByZXQgPSBpbnRlcm5hbF9jcGx1c19kZW1hbmdsZSAod29yaywgbWFuZ2xlZCk7Ci0gIHNxdWFuZ2xlX21vcF91cCAod29yayk7Ci0gIHJldHVybiAocmV0KTsKLX0KLQotCi0vKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG1vc3Qgb2Ygd2hhdCBjcGx1c19kZW1hbmdsZSB1c2UgdG8gZG8sIGJ1dAotICAgdG8gYmUgYWJsZSB0byBkZW1hbmdsZSBhIG5hbWUgd2l0aCBhIEIsIEsgb3IgbiBjb2RlLCB3ZSBuZWVkIHRvCi0gICBoYXZlIGEgbG9uZ2VyIHRlcm0gbWVtb3J5IG9mIHdoYXQgdHlwZXMgaGF2ZSBiZWVuIHNlZW4uIFRoZSBvcmlnaW5hbAotICAgbm93IGludGlhbGl6ZXMgYW5kIGNsZWFucyB1cCB0aGUgc3F1YW5nbGUgY29kZSBpbmZvLCB3aGlsZSBpbnRlcm5hbAotICAgY2FsbHMgZ28gZGlyZWN0bHkgdG8gdGhpcyByb3V0aW5lIHRvIGF2b2lkIHJlc2V0dGluZyB0aGF0IGluZm8uICovCi0KLXN0YXRpYyBjaGFyICoKLWludGVybmFsX2NwbHVzX2RlbWFuZ2xlICh3b3JrLCBtYW5nbGVkKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqbWFuZ2xlZDsKLXsKLQotICBzdHJpbmcgZGVjbDsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotICBjaGFyICpkZW1hbmdsZWQgPSBOVUxMOwotICBpbnQgczEsczIsczMsczQ7Ci0gIHMxID0gd29yay0+Y29uc3RydWN0b3I7Ci0gIHMyID0gd29yay0+ZGVzdHJ1Y3RvcjsKLSAgczMgPSB3b3JrLT5zdGF0aWNfdHlwZTsKLSAgczQgPSB3b3JrLT50eXBlX3F1YWxzOwotICB3b3JrLT5jb25zdHJ1Y3RvciA9IHdvcmstPmRlc3RydWN0b3IgPSAwOwotICB3b3JrLT50eXBlX3F1YWxzID0gVFlQRV9VTlFVQUxJRklFRDsKLSAgd29yay0+ZGxsaW1wb3J0ZWQgPSAwOwotCi0gIGlmICgobWFuZ2xlZCAhPSBOVUxMKSAmJiAoKm1hbmdsZWQgIT0gJ1wwJykpCi0gICAgewotICAgICAgc3RyaW5nX2luaXQgKCZkZWNsKTsKLQotICAgICAgLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGdudSBzdHlsZSBkZW1hbmdsaW5nIGlzIGFjdGl2ZSBhbmQgaWYgdGhlCi0JIHN0cmluZyB0byBiZSBkZW1hbmdsZWQgY29udGFpbnMgYSBDUExVU19NQVJLRVIuICBJZiBzbywgYXR0ZW1wdCB0bwotCSByZWNvZ25pemUgb25lIG9mIHRoZSBnbnUgc3BlY2lhbCBmb3JtcyByYXRoZXIgdGhhbiBsb29raW5nIGZvciBhCi0JIHN0YW5kYXJkIHByZWZpeC4gIEluIHBhcnRpY3VsYXIsIGRvbid0IHdvcnJ5IGFib3V0IHdoZXRoZXIgdGhlcmUKLQkgaXMgYSAiX18iIHN0cmluZyBpbiB0aGUgbWFuZ2xlZCBzdHJpbmcuICBDb25zaWRlciAiXyRfNV9fZm9vIiBmb3IKLQkgZXhhbXBsZS4gICovCi0KLSAgICAgIGlmICgoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKSkKLQl7Ci0JICBzdWNjZXNzID0gZ251X3NwZWNpYWwgKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7Ci0JfQotICAgICAgaWYgKCFzdWNjZXNzKQotCXsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9wcmVmaXggKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7Ci0JfQotICAgICAgaWYgKHN1Y2Nlc3MgJiYgKCptYW5nbGVkICE9ICdcMCcpKQotCXsKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9zaWduYXR1cmUgKHdvcmssICZtYW5nbGVkLCAmZGVjbCk7Ci0JfQotICAgICAgaWYgKHdvcmstPmNvbnN0cnVjdG9yID09IDIpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICJnbG9iYWwgY29uc3RydWN0b3JzIGtleWVkIHRvICIpOwotICAgICAgICAgIHdvcmstPmNvbnN0cnVjdG9yID0gMDsKLSAgICAgICAgfQotICAgICAgZWxzZSBpZiAod29yay0+ZGVzdHJ1Y3RvciA9PSAyKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiZ2xvYmFsIGRlc3RydWN0b3JzIGtleWVkIHRvICIpOwotICAgICAgICAgIHdvcmstPmRlc3RydWN0b3IgPSAwOwotICAgICAgICB9Ci0gICAgICBlbHNlIGlmICh3b3JrLT5kbGxpbXBvcnRlZCA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiaW1wb3J0IHN0dWIgZm9yICIpOwotICAgICAgICAgIHdvcmstPmRsbGltcG9ydGVkID0gMDsKLSAgICAgICAgfQotICAgICAgZGVtYW5nbGVkID0gbW9wX3VwICh3b3JrLCAmZGVjbCwgc3VjY2Vzcyk7Ci0gICAgfQotICB3b3JrLT5jb25zdHJ1Y3RvciA9IHMxOwotICB3b3JrLT5kZXN0cnVjdG9yID0gczI7Ci0gIHdvcmstPnN0YXRpY190eXBlID0gczM7Ci0gIHdvcmstPnR5cGVfcXVhbHMgPSBzNDsKLSAgcmV0dXJuIChkZW1hbmdsZWQpOwotfQotCi0KLS8qIENsZWFyIG91dCBhbmQgc3F1YW5nbGluZyByZWxhdGVkIHN0b3JhZ2UgKi8KLXN0YXRpYyB2b2lkCi1zcXVhbmdsZV9tb3BfdXAgKHdvcmspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotewotICAvKiBjbGVhbiB1cCB0aGUgQiBhbmQgSyB0eXBlIG1hbmdsaW5nIHR5cGVzLiAqLwotICBmb3JnZXRfQl9hbmRfS190eXBlcyAod29yayk7Ci0gIGlmICh3b3JrIC0+IGJ0eXBldmVjICE9IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAoKGNoYXIgKikgd29yayAtPiBidHlwZXZlYyk7Ci0gICAgfQotICBpZiAod29yayAtPiBrdHlwZXZlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKChjaGFyICopIHdvcmsgLT4ga3R5cGV2ZWMpOwotICAgIH0KLX0KLQotLyogQ2xlYXIgb3V0IGFueSBtYW5nbGVkIHN0b3JhZ2UgKi8KLQotc3RhdGljIGNoYXIgKgotbW9wX3VwICh3b3JrLCBkZWNscCwgc3VjY2VzcykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci0gICAgIGludCBzdWNjZXNzOwotewotICBjaGFyICpkZW1hbmdsZWQgPSBOVUxMOwotCi0gIC8qIERpc2NhcmQgdGhlIHJlbWVtYmVyZWQgdHlwZXMsIGlmIGFueS4gICovCi0KLSAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKLSAgaWYgKHdvcmsgLT4gdHlwZXZlYyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKChjaGFyICopIHdvcmsgLT4gdHlwZXZlYyk7Ci0gICAgICB3b3JrIC0+IHR5cGV2ZWMgPSBOVUxMOwotICAgICAgd29yayAtPiB0eXBldmVjX3NpemUgPSAwOwotICAgIH0KLSAgaWYgKHdvcmstPnRtcGxfYXJndmVjKQotICAgIHsKLSAgICAgIGludCBpOwotCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgd29yay0+bnRtcGxfYXJnczsgaSsrKQotCWlmICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSkKLQkgIGZyZWUgKChjaGFyKikgd29yay0+dG1wbF9hcmd2ZWNbaV0pOwotCi0gICAgICBmcmVlICgoY2hhciopIHdvcmstPnRtcGxfYXJndmVjKTsKLSAgICAgIHdvcmstPnRtcGxfYXJndmVjID0gTlVMTDsKLSAgICB9Ci0gIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKLSAgICB7Ci0gICAgICBzdHJpbmdfZGVsZXRlICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gICAgICBmcmVlICgoY2hhciopIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgICAgIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gTlVMTDsKLSAgICB9Ci0KLSAgLyogSWYgZGVtYW5nbGluZyB3YXMgc3VjY2Vzc2Z1bCwgZW5zdXJlIHRoYXQgdGhlIGRlbWFuZ2xlZCBzdHJpbmcgaXMgbnVsbAotICAgICB0ZXJtaW5hdGVkIGFuZCByZXR1cm4gaXQuICBPdGhlcndpc2UsIGZyZWUgdGhlIGRlbWFuZ2xpbmcgZGVjbC4gICovCi0KLSAgaWYgKCFzdWNjZXNzKQotICAgIHsKLSAgICAgIHN0cmluZ19kZWxldGUgKGRlY2xwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICIiLCAxKTsKLSAgICAgIGRlbWFuZ2xlZCA9IGRlY2xwIC0+IGI7Ci0gICAgfQotICByZXR1cm4gKGRlbWFuZ2xlZCk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9zaWduYXR1cmUgLS0gZGVtYW5nbGUgdGhlIHNpZ25hdHVyZSBwYXJ0IG9mIGEgbWFuZ2xlZCBuYW1lCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZGVtYW5nbGVfc2lnbmF0dXJlIChzdHJ1Y3Qgd29ya19zdHVmZiAqd29yaywgY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCQkgICAgc3RyaW5nICpkZWNscCk7Ci0KLURFU0NSSVBUSU9OCi0KLQlDb25zdW1lIGFuZCBkZW1hbmdsZSB0aGUgc2lnbmF0dXJlIHBvcnRpb24gb2YgdGhlIG1hbmdsZWQgbmFtZS4KLQotCURFQ0xQIGlzIHRoZSBzdHJpbmcgd2hlcmUgZGVtYW5nbGVkIG91dHB1dCBpcyBiZWluZyBidWlsdC4gIEF0Ci0JZW50cnkgaXQgY29udGFpbnMgdGhlIGRlbWFuZ2xlZCByb290IG5hbWUgZnJvbSB0aGUgbWFuZ2xlZCBuYW1lCi0JcHJlZml4LiAgSS5FLiBlaXRoZXIgYSBkZW1hbmdsZWQgb3BlcmF0b3IgbmFtZSBvciB0aGUgcm9vdCBmdW5jdGlvbgotCW5hbWUuICBJbiBzb21lIHNwZWNpYWwgY2FzZXMsIGl0IG1heSBjb250YWluIG5vdGhpbmcuCi0KLQkqTUFOR0xFRCBwb2ludHMgdG8gdGhlIGN1cnJlbnQgdW5jb25zdW1lZCBsb2NhdGlvbiBpbiB0aGUgbWFuZ2xlZAotCW5hbWUuICBBcyB0b2tlbnMgYXJlIGNvbnN1bWVkIGFuZCBkZW1hbmdsaW5nIGlzIHBlcmZvcm1lZCwgdGhlCi0JcG9pbnRlciBpcyB1cGRhdGVkIHRvIGNvbnRpbnVvdXNseSBwb2ludCBhdCB0aGUgbmV4dCB0b2tlbiB0bwotCWJlIGNvbnN1bWVkLgotCi0JRGVtYW5nbGluZyBHTlUgc3R5bGUgbWFuZ2xlZCBuYW1lcyBpcyBuYXN0eSBiZWNhdXNlIHRoZXJlIGlzIG5vCi0JZXhwbGljaXQgdG9rZW4gdGhhdCBtYXJrcyB0aGUgc3RhcnQgb2YgdGhlIG91dGVybW9zdCBmdW5jdGlvbgotCWFyZ3VtZW50IGxpc3QuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9zaWduYXR1cmUgKHdvcmssIG1hbmdsZWQsIGRlY2xwKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqZGVjbHA7Ci17Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgaW50IGZ1bmNfZG9uZSA9IDA7Ci0gIGludCBleHBlY3RfZnVuYyA9IDA7Ci0gIGludCBleHBlY3RfcmV0dXJuX3R5cGUgPSAwOwotICBjb25zdCBjaGFyICpvbGRtYW5nbGVkID0gTlVMTDsKLSAgc3RyaW5nIHRyYXduYW1lOwotICBzdHJpbmcgdG5hbWU7Ci0KLSAgd2hpbGUgKHN1Y2Nlc3MgJiYgKCoqbWFuZ2xlZCAhPSAnXDAnKSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLQl7Ci0JY2FzZSAnUSc6Ci0JICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMSwgMCk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcpCi0JICAgIGV4cGVjdF9mdW5jID0gMTsKLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnSyc6Ci0JICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMSwgMCk7Ci0JICBpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgICB9Ci0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnUyc6Ci0JICAvKiBTdGF0aWMgbWVtYmVyIGZ1bmN0aW9uICovCi0JICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgICB9Ci0JICAoKm1hbmdsZWQpKys7Ci0JICB3b3JrIC0+IHN0YXRpY190eXBlID0gMTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnQyc6Ci0JY2FzZSAnVic6Ci0JY2FzZSAndSc6Ci0JICB3b3JrLT50eXBlX3F1YWxzIHw9IGNvZGVfZm9yX3F1YWxpZmllciAoKiptYW5nbGVkKTsKLQotCSAgLyogYSBxdWFsaWZpZWQgbWVtYmVyIGZ1bmN0aW9uICovCi0JICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQotCSAgICBvbGRtYW5nbGVkID0gKm1hbmdsZWQ7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQotCWNhc2UgJ0wnOgotCSAgLyogTG9jYWwgY2xhc3MgbmFtZSBmb2xsb3dzIGFmdGVyICJMbm5uXyIgKi8KLQkgIGlmIChIUF9ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAmJiAoKiptYW5nbGVkICE9ICdfJykpCi0JCSgqbWFuZ2xlZCkrKzsKLQkgICAgICBpZiAoISoqbWFuZ2xlZCkKLQkJc3VjY2VzcyA9IDA7Ci0JICAgICAgZWxzZQotCQkoKm1hbmdsZWQpKys7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc3VjY2VzcyA9IDA7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKLQljYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiBjYXNlICc4JzogY2FzZSAnOSc6Ci0JICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgICB9Ci0gICAgICAgICAgd29yay0+dGVtcF9zdGFydCA9IC0xOyAvKiB1cHBlcm1vc3QgY2FsbCB0byBkZW1hbmdsZV9jbGFzcyAqLwotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2NsYXNzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgewotCSAgICAgIHJlbWVtYmVyX3R5cGUgKHdvcmssIG9sZG1hbmdsZWQsICptYW5nbGVkIC0gb2xkbWFuZ2xlZCk7Ci0JICAgIH0KLQkgIGlmIChBVVRPX0RFTUFOR0xJTkcgfHwgR05VX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0JICAgIHsKLSAgICAgICAgICAgICAgLyogRURHIGFuZCBvdGhlcnMgd2lsbCBoYXZlIHRoZSAiRiIsIHNvIHdlIGxldCB0aGUgbG9vcCBjeWNsZQotICAgICAgICAgICAgICAgICBpZiB3ZSBhcmUgbG9va2luZyBhdCBvbmUuICovCi0gICAgICAgICAgICAgIGlmICgqKm1hbmdsZWQgIT0gJ0YnKQotICAgICAgICAgICAgICAgICBleHBlY3RfZnVuYyA9IDE7Ci0JICAgIH0KLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgYnJlYWs7Ci0KLQljYXNlICdCJzoKLQkgIHsKLQkgICAgc3RyaW5nIHM7Ci0JICAgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmcyk7Ci0JICAgIGlmIChzdWNjZXNzKQotCSAgICAgIHsKLQkJc3RyaW5nX2FwcGVuZCAoJnMsIFNDT1BFX1NUUklORyAod29yaykpOwotCQlzdHJpbmdfcHJlcGVuZHMgKGRlY2xwLCAmcyk7Ci0JICAgICAgfQotCSAgICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgICAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgfQotCSAgYnJlYWs7Ci0KLQljYXNlICdGJzoKLQkgIC8qIEZ1bmN0aW9uICovCi0JICAvKiBBUk0vSFAgc3R5bGUgZGVtYW5nbGluZyBpbmNsdWRlcyBhIHNwZWNpZmljICdGJyBjaGFyYWN0ZXIgYWZ0ZXIKLQkgICAgIHRoZSBjbGFzcyBuYW1lLiAgRm9yIEdOVSBzdHlsZSwgaXQgaXMganVzdCBpbXBsaWVkLiAgU28gd2UgY2FuCi0JICAgICBzYWZlbHkganVzdCBjb25zdW1lIGFueSAnRicgYXQgdGhpcyBwb2ludCBhbmQgYmUgY29tcGF0aWJsZQotCSAgICAgd2l0aCBlaXRoZXIgc3R5bGUuICAqLwotCi0JICBvbGRtYW5nbGVkID0gTlVMTDsKLQkgIGZ1bmNfZG9uZSA9IDE7Ci0JICAoKm1hbmdsZWQpKys7Ci0KLQkgIC8qIEZvciBsdWNpZC9BUk0vSFAgc3R5bGUgd2UgaGF2ZSB0byBmb3JnZXQgYW55IHR5cGVzIHdlIG1pZ2h0Ci0JICAgICBoYXZlIHJlbWVtYmVyZWQgdXAgdG8gdGhpcyBwb2ludCwgc2luY2UgdGhleSB3ZXJlIG5vdCBhcmd1bWVudAotCSAgICAgdHlwZXMuICBHTlUgc3R5bGUgY29uc2lkZXJzIGFsbCB0eXBlcyBzZWVuIGFzIGF2YWlsYWJsZSBmb3IKLQkgICAgIGJhY2sgcmVmZXJlbmNlcy4gIFNlZSBjb21tZW50IGluIGRlbWFuZ2xlX2FyZ3MoKSAqLwotCi0JICBpZiAoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotCSAgICB7Ci0JICAgICAgZm9yZ2V0X3R5cGVzICh3b3JrKTsKLQkgICAgfQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgIC8qIEFmdGVyIHBpY2tpbmcgb2ZmIHRoZSBmdW5jdGlvbiBhcmdzLCB3ZSBleHBlY3QgdG8gZWl0aGVyCi0JICAgICBmaW5kIHRoZSBmdW5jdGlvbiByZXR1cm4gdHlwZSAocHJlY2VkZWQgYnkgYW4gJ18nKSBvciB0aGUKLQkgICAgIGVuZCBvZiB0aGUgc3RyaW5nLiAqLwotCSAgaWYgKHN1Y2Nlc3MgJiYgKEFVVE9fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgKiptYW5nbGVkID09ICdfJykKLQkgICAgewotCSAgICAgICsrKCptYW5nbGVkKTsKLSAgICAgICAgICAgICAgLyogQXQgdGhpcyBsZXZlbCwgd2UgZG8gbm90IGNhcmUgYWJvdXQgdGhlIHJldHVybiB0eXBlLiAqLwotICAgICAgICAgICAgICBzdWNjZXNzID0gZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJnRuYW1lKTsKLSAgICAgICAgICAgICAgc3RyaW5nX2RlbGV0ZSAoJnRuYW1lKTsKLSAgICAgICAgICAgIH0KLQotCSAgYnJlYWs7Ci0KLQljYXNlICd0JzoKLQkgIC8qIEcrKyBUZW1wbGF0ZSAqLwotCSAgc3RyaW5nX2luaXQoJnRyYXduYW1lKTsKLQkgIHN0cmluZ19pbml0KCZ0bmFtZSk7Ci0JICBpZiAob2xkbWFuZ2xlZCA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgb2xkbWFuZ2xlZCA9ICptYW5nbGVkOwotCSAgICB9Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsICZ0bmFtZSwKLQkJCQkgICAgICAgJnRyYXduYW1lLCAxLCAxKTsKLQkgIGlmIChzdWNjZXNzKQotCSAgICB7Ci0JICAgICAgcmVtZW1iZXJfdHlwZSAod29yaywgb2xkbWFuZ2xlZCwgKm1hbmdsZWQgLSBvbGRtYW5nbGVkKTsKLQkgICAgfQotCSAgc3RyaW5nX2FwcGVuZCAoJnRuYW1lLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQotCSAgc3RyaW5nX3ByZXBlbmRzKGRlY2xwLCAmdG5hbWUpOwotCSAgaWYgKHdvcmsgLT4gZGVzdHJ1Y3RvciAmIDEpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoJnRyYXduYW1lLCAifiIpOwotCSAgICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJnRyYXduYW1lKTsKLQkgICAgICB3b3JrLT5kZXN0cnVjdG9yIC09IDE7Ci0JICAgIH0KLQkgIGlmICgod29yay0+Y29uc3RydWN0b3IgJiAxKSB8fCAod29yay0+ZGVzdHJ1Y3RvciAmIDEpKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHJhd25hbWUpOwotCSAgICAgIHdvcmstPmNvbnN0cnVjdG9yIC09IDE7Ci0JICAgIH0KLQkgIHN0cmluZ19kZWxldGUoJnRyYXduYW1lKTsKLQkgIHN0cmluZ19kZWxldGUoJnRuYW1lKTsKLQkgIG9sZG1hbmdsZWQgPSBOVUxMOwotCSAgZXhwZWN0X2Z1bmMgPSAxOwotCSAgYnJlYWs7Ci0KLQljYXNlICdfJzoKLQkgIGlmIChHTlVfREVNQU5HTElORyAmJiBleHBlY3RfcmV0dXJuX3R5cGUpCi0JICAgIHsKLQkgICAgICAvKiBSZWFkIHRoZSByZXR1cm4gdHlwZS4gKi8KLQkgICAgICBzdHJpbmcgcmV0dXJuX3R5cGU7Ci0JICAgICAgc3RyaW5nX2luaXQgKCZyZXR1cm5fdHlwZSk7Ci0KLQkgICAgICAoKm1hbmdsZWQpKys7Ci0JICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZyZXR1cm5fdHlwZSk7Ci0JICAgICAgQVBQRU5EX0JMQU5LICgmcmV0dXJuX3R5cGUpOwotCi0JICAgICAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJnJldHVybl90eXBlKTsKLQkgICAgICBzdHJpbmdfZGVsZXRlICgmcmV0dXJuX3R5cGUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIC8qIEF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwsIHdlIGNhbm5vdCBoYXZlIGEgcmV0dXJuIHR5cGUgc3BlY2lmaWVkLAotCSAgICAgICBzbyBpZiB3ZSBydW4gaW50byBhbm90aGVyICdfJyBhdCB0aGlzIHBvaW50IHdlIGFyZSBkZWFsaW5nIHdpdGgKLQkgICAgICAgYSBtYW5nbGVkIG5hbWUgdGhhdCBpcyBlaXRoZXIgYm9ndXMsIG9yIGhhcyBiZWVuIG1hbmdsZWQgYnkKLQkgICAgICAgc29tZSBhbGdvcml0aG0gd2UgZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoLiAgU28ganVzdAotCSAgICAgICByZWplY3QgdGhlIGVudGlyZSBkZW1hbmdsaW5nLiAgKi8KLSAgICAgICAgICAgIC8qIEhvd2V2ZXIsICJfbm5uIiBpcyBhbiBleHBlY3RlZCBzdWZmaXggZm9yIGFsdGVybmF0ZSBlbnRyeSBwb2ludAotICAgICAgICAgICAgICAgbnVtYmVyZWQgbm5uIGZvciBhIGZ1bmN0aW9uLCB3aXRoIEhQIGFDQywgc28gc2tpcCBvdmVyIHRoYXQKLSAgICAgICAgICAgICAgIHdpdGhvdXQgcmVwb3J0aW5nIGZhaWx1cmUuIHBhaS8xOTk3LTA5LTA0ICovCi0gICAgICAgICAgICBpZiAoSFBfREVNQU5HTElORykKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKiptYW5nbGVkICYmIGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0gICAgICAgICAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLQkgICAgICBzdWNjZXNzID0gMDsKLQkgIGJyZWFrOwotCi0JY2FzZSAnSCc6Ci0JICBpZiAoR05VX0RFTUFOR0xJTkcpCi0JICAgIHsKLQkgICAgICAvKiBBIEcrKyB0ZW1wbGF0ZSBmdW5jdGlvbi4gIFJlYWQgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cy4gKi8KLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAwLAotCQkJCQkgICAwKTsKLQkgICAgICBpZiAoISh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpKQotCQlleHBlY3RfcmV0dXJuX3R5cGUgPSAxOwotCSAgICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQkgICAgezt9Ci0KLQlkZWZhdWx0OgotCSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIC8qIEFzc3VtZSB3ZSBoYXZlIHN0dW1ibGVkIG9udG8gdGhlIGZpcnN0IG91dGVybW9zdCBmdW5jdGlvbgotCQkgYXJndW1lbnQgdG9rZW4sIGFuZCBzdGFydCBwcm9jZXNzaW5nIGFyZ3MuICAqLwotCSAgICAgIGZ1bmNfZG9uZSA9IDE7Ci0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogTm9uLUdOVSBkZW1hbmdsZXJzIHVzZSBhIHNwZWNpZmljIHRva2VuIHRvIG1hcmsgdGhlIHN0YXJ0Ci0JCSBvZiB0aGUgb3V0ZXJtb3N0IGZ1bmN0aW9uIGFyZ3VtZW50IHRva2Vucy4gIFR5cGljYWxseSAnRicsCi0JCSBmb3IgQVJNL0hQLWRlbWFuZ2xpbmcsIGZvciBleGFtcGxlLiAgU28gaWYgd2UgZmluZCBzb21ldGhpbmcKLQkJIHdlIGFyZSBub3QgcHJlcGFyZWQgZm9yLCBpdCBtdXN0IGJlIGFuIGVycm9yLiAgKi8KLQkgICAgICBzdWNjZXNzID0gMDsKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgLyoKLQlpZiAoQVVUT19ERU1BTkdMSU5HIHx8IEdOVV9ERU1BTkdMSU5HKQotCSovCi0gICAgICB7Ci0JaWYgKHN1Y2Nlc3MgJiYgZXhwZWN0X2Z1bmMpCi0JICB7Ci0JICAgIGZ1bmNfZG9uZSA9IDE7Ci0gICAgICAgICAgICAgIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEVER19ERU1BTkdMSU5HKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGZvcmdldF90eXBlcyAod29yayk7Ci0gICAgICAgICAgICAgICAgfQotCSAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgICAvKiBTaW5jZSB0ZW1wbGF0ZSBpbmNsdWRlIHRoZSBtYW5nbGluZyBvZiB0aGVpciByZXR1cm4gdHlwZXMsCi0JICAgICAgIHdlIG11c3Qgc2V0IGV4cGVjdF9mdW5jIHRvIDAgc28gdGhhdCB3ZSBkb24ndCB0cnkgZG8KLQkgICAgICAgZGVtYW5nbGUgbW9yZSBhcmd1bWVudHMgdGhlIG5leHQgdGltZSB3ZSBnZXQgaGVyZS4gICovCi0JICAgIGV4cGVjdF9mdW5jID0gMDsKLQkgIH0KLSAgICAgIH0KLSAgICB9Ci0gIGlmIChzdWNjZXNzICYmICFmdW5jX2RvbmUpCi0gICAgewotICAgICAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBHTlVfREVNQU5HTElORykKLQl7Ci0JICAvKiBXaXRoIEdOVSBzdHlsZSBkZW1hbmdsaW5nLCBiYXJfXzNmb28gaXMgJ2Zvbzo6YmFyKHZvaWQpJywgYW5kCi0JICAgICBiYXJfXzNmb29pIGlzICdmb286OmJhcihpbnQpJy4gIFdlIGdldCBoZXJlIHdoZW4gd2UgZmluZCB0aGUKLQkgICAgIGZpcnN0IGNhc2UsIGFuZCBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSAnKHZvaWQpJyBnZXRzIGFkZGVkIHRvCi0JICAgICB0aGUgY3VycmVudCBkZWNscC4gIE5vdGUgdGhhdCB3aXRoIEFSTS9IUCwgdGhlIGZpcnN0IGNhc2UKLQkgICAgIHJlcHJlc2VudHMgdGhlIG5hbWUgb2YgYSBzdGF0aWMgZGF0YSBtZW1iZXIgJ2Zvbzo6YmFyJywKLQkgICAgIHdoaWNoIGlzIGluIHRoZSBjdXJyZW50IGRlY2xwLCBzbyB3ZSBsZWF2ZSBpdCBhbG9uZS4gICovCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCX0KLSAgICB9Ci0gIGlmIChzdWNjZXNzICYmIFBSSU5UX0FSR19UWVBFUykKLSAgICB7Ci0gICAgICBpZiAod29yay0+c3RhdGljX3R5cGUpCi0Jc3RyaW5nX2FwcGVuZCAoZGVjbHAsICIgc3RhdGljIik7Ci0gICAgICBpZiAod29yay0+dHlwZV9xdWFscyAhPSBUWVBFX1VOUVVBTElGSUVEKQotCXsKLQkgIEFQUEVORF9CTEFOSyAoZGVjbHApOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIHF1YWxpZmllcl9zdHJpbmcgKHdvcmstPnR5cGVfcXVhbHMpKTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLSNpZiAwCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX21ldGhvZF9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDA7Ci0KLSAgaWYgKHdvcmsgLT4gc3RhdGljX3R5cGUpCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkICsgMSk7Ci0gICAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCk7Ci0gICAgfQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0jZW5kaWYKLQotc3RhdGljIGludAotZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICp0bmFtZTsKLXsKLSAgaW50IGk7Ci0gIGludCByOwotICBpbnQgbmVlZF9jb21tYSA9IDA7Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgc3RyaW5nIHRlbXA7Ci0KLSAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICJ0ZW1wbGF0ZSA8Iik7Ci0gIC8qIGdldCBzaXplIG9mIHRlbXBsYXRlIHBhcmFtZXRlciBsaXN0ICovCi0gIGlmIChnZXRfY291bnQgKG1hbmdsZWQsICZyKSkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKQotCXsKLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICIsICIpOwotCSAgICB9Ci0KLQkgICAgLyogWiBmb3IgdHlwZSBwYXJhbWV0ZXJzICovCi0JICAgIGlmICgqKm1hbmdsZWQgPT0gJ1onKQotCSAgICAgIHsKLQkJKCptYW5nbGVkKSsrOwotCQlzdHJpbmdfYXBwZW5kICh0bmFtZSwgImNsYXNzIik7Ci0JICAgICAgfQotCSAgICAgIC8qIHogZm9yIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi8KLQkgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICd6JykKLQkgICAgICB7Ci0JCSgqbWFuZ2xlZCkrKzsKLQkJc3VjY2VzcyA9Ci0JCSAgZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpOwotCQlpZiAoIXN1Y2Nlc3MpCi0JCSAgewotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJLyogdGVtcCBpcyBpbml0aWFsaXplZCBpbiBkb190eXBlICovCi0JCXN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7Ci0JCWlmIChzdWNjZXNzKQotCQkgIHsKLQkJICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgJnRlbXApOwotCQkgIH0KLQkJc3RyaW5nX2RlbGV0ZSgmdGVtcCk7Ci0JCWlmICghc3VjY2VzcykKLQkJICB7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgbmVlZF9jb21tYSA9IDE7Ci0JfQotCi0gICAgfQotICBpZiAodG5hbWUtPnBbLTFdID09ICc+JykKLSAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiAiKTsKLSAgc3RyaW5nX2FwcGVuZCAodG5hbWUsICI+IGNsYXNzIik7Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2ludGVncmFsX3ZhbHVlICh3b3JrLCBtYW5nbGVkLCBzKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhcioqIG1hbmdsZWQ7Ci0gICAgIHN0cmluZyogczsKLXsKLSAgaW50IHN1Y2Nlc3M7Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnRScpCi0gICAgewotICAgICAgaW50IG5lZWRfb3BlcmF0b3IgPSAwOwotCi0gICAgICBzdWNjZXNzID0gMTsKLSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiKCIsIDEpOwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgd2hpbGUgKHN1Y2Nlc3MgJiYgKiptYW5nbGVkICE9ICdXJyAmJiAqKm1hbmdsZWQgIT0gJ1wwJykKLQl7Ci0JICBpZiAobmVlZF9vcGVyYXRvcikKLQkgICAgewotCSAgICAgIHNpemVfdCBpOwotCSAgICAgIHNpemVfdCBsZW47Ci0KLQkgICAgICBzdWNjZXNzID0gMDsKLQotCSAgICAgIGxlbiA9IHN0cmxlbiAoKm1hbmdsZWQpOwotCi0JICAgICAgZm9yIChpID0gMDsKLQkJICAgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGUgWzBdKTsKLQkJICAgKytpKQotCQl7Ci0JCSAgc2l6ZV90IGwgPSBzdHJsZW4gKG9wdGFibGVbaV0uaW4pOwotCi0JCSAgaWYgKGwgPD0gbGVuCi0JCSAgICAgICYmIG1lbWNtcCAob3B0YWJsZVtpXS5pbiwgKm1hbmdsZWQsIGwpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiICIsIDEpOwotCQkgICAgICBzdHJpbmdfYXBwZW5kIChzLCBvcHRhYmxlW2ldLm91dCk7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiICIsIDEpOwotCQkgICAgICBzdWNjZXNzID0gMTsKLQkJICAgICAgKCptYW5nbGVkKSArPSBsOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgaWYgKCFzdWNjZXNzKQotCQlicmVhazsKLQkgICAgfQotCSAgZWxzZQotCSAgICBuZWVkX29wZXJhdG9yID0gMTsKLQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsCi0JCQkJCQkgIHRrX2ludGVncmFsKTsKLQl9Ci0KLSAgICAgIGlmICgqKm1hbmdsZWQgIT0gJ1cnKQotCSAgc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICIpIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKiptYW5nbGVkID09ICdRJyB8fCAqKm1hbmdsZWQgPT0gJ0snKQotICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHMsIDAsIDEpOwotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0KLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBzdWNjZXNzID0gMTsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZV92YWx1ZV9wYXJtICh3b3JrLCBtYW5nbGVkLCBzLCB0aykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcqIHM7Ci0gICAgIHR5cGVfa2luZF90IHRrOwotewotICBpbnQgc3VjY2VzcyA9IDE7Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnWScpCi0gICAgewotICAgICAgLyogVGhlIG5leHQgYXJndW1lbnQgaXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICovCi0gICAgICBpbnQgaWR4OwotCi0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotICAgICAgaWYgKGlkeCA9PSAtMQotCSAgfHwgKHdvcmstPnRtcGxfYXJndmVjICYmIGlkeCA+PSB3b3JrLT5udG1wbF9hcmdzKQotCSAgfHwgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKSA9PSAtMSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0Jc3RyaW5nX2FwcGVuZCAocywgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciBidWZbMTBdOwotCSAgc3ByaW50ZihidWYsICJUJWQiLCBpZHgpOwotCSAgc3RyaW5nX2FwcGVuZCAocywgYnVmKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19pbnRlZ3JhbCkKLSAgICBzdWNjZXNzID0gZGVtYW5nbGVfaW50ZWdyYWxfdmFsdWUgKHdvcmssIG1hbmdsZWQsIHMpOwotICBlbHNlIGlmICh0ayA9PSB0a19jaGFyKQotICAgIHsKLSAgICAgIGNoYXIgdG1wWzJdOwotICAgICAgaW50IHZhbDsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAiJyIsIDEpOwotICAgICAgdmFsID0gY29uc3VtZV9jb3VudChtYW5nbGVkKTsKLSAgICAgIGlmICh2YWwgPD0gMCkKLQlzdWNjZXNzID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICB0bXBbMF0gPSAoY2hhcil2YWw7Ci0JICB0bXBbMV0gPSAnXDAnOwotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICZ0bXBbMF0sIDEpOwotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICInIiwgMSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAodGsgPT0gdGtfYm9vbCkKLSAgICB7Ci0gICAgICBpbnQgdmFsID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAodmFsID09IDApCi0Jc3RyaW5nX2FwcGVuZG4gKHMsICJmYWxzZSIsIDUpOwotICAgICAgZWxzZSBpZiAodmFsID09IDEpCi0Jc3RyaW5nX2FwcGVuZG4gKHMsICJ0cnVlIiwgNCk7Ci0gICAgICBlbHNlCi0Jc3VjY2VzcyA9IDA7Ci0gICAgfQotICBlbHNlIGlmICh0ayA9PSB0a19yZWFsKQotICAgIHsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ20nKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAiLSIsIDEpOwotCSAgKCptYW5nbGVkKSsrOwotCX0KLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCXsKLQkgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JfQotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnLicpIC8qIGZyYWN0aW9uICovCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICIuIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnZScpIC8qIGV4cG9uZW50ICovCi0JewotCSAgc3RyaW5nX2FwcGVuZG4gKHMsICJlIiwgMSk7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRuIChzLCAqbWFuZ2xlZCwgMSk7Ci0JICAgICAgKCptYW5nbGVkKSsrOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAodGsgPT0gdGtfcG9pbnRlciB8fCB0ayA9PSB0a19yZWZlcmVuY2UpCi0gICAgewotICAgICAgaW50IHN5bWJvbF9sZW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgIGlmIChzeW1ib2xfbGVuID09IC0xKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChzeW1ib2xfbGVuID09IDApCi0Jc3RyaW5nX2FwcGVuZG4gKHMsICIwIiwgMSk7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqcCA9IHhtYWxsb2MgKHN5bWJvbF9sZW4gKyAxKSwgKnE7Ci0JICBzdHJuY3B5IChwLCAqbWFuZ2xlZCwgc3ltYm9sX2xlbik7Ci0JICBwIFtzeW1ib2xfbGVuXSA9ICdcMCc7Ci0JICAvKiBXZSB1c2UgY3BsdXNfZGVtYW5nbGUgaGVyZSwgcmF0aGVyIHRoYW4KLQkgICAgIGludGVybmFsX2NwbHVzX2RlbWFuZ2xlLCBiZWNhdXNlIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkKLQkgICAgIG1hbmdsZWQgaGVyZSBkb2VzIG5vdCBtYWtlIHVzZSBvZiBhbnkgb2YgdGhlIHNxdWFuZ2xpbmcKLQkgICAgIG9yIHR5cGUtY29kZSBpbmZvcm1hdGlvbiB3ZSBoYXZlIGJ1aWx0IHVwIHRodXMgZmFyOyBpdCBpcwotCSAgICAgbWFuZ2xlZCBpbmRlcGVuZGVudGx5LiAgKi8KLQkgIHEgPSBjcGx1c19kZW1hbmdsZSAocCwgd29yay0+b3B0aW9ucyk7Ci0JICBpZiAodGsgPT0gdGtfcG9pbnRlcikKLQkgICAgc3RyaW5nX2FwcGVuZG4gKHMsICImIiwgMSk7Ci0JICAvKiBGSVhNRTogUG9pbnRlci10by1tZW1iZXIgY29uc3RhbnRzIHNob3VsZCBnZXQgYQotCSAgICAgICAgICAgIHF1YWxpZnlpbmcgY2xhc3MgbmFtZSBoZXJlLiAgKi8KLQkgIGlmIChxKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAocywgcSk7Ci0JICAgICAgZnJlZSAocSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgc3RyaW5nX2FwcGVuZCAocywgcCk7Ci0JICBmcmVlIChwKTsKLQl9Ci0gICAgICAqbWFuZ2xlZCArPSBzeW1ib2xfbGVuOwotICAgIH0KLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQotLyogRGVtYW5nbGUgdGhlIHRlbXBsYXRlIG5hbWUgaW4gTUFOR0xFRC4gIFRoZSBmdWxsIG5hbWUgb2YgdGhlCi0gICB0ZW1wbGF0ZSAoZS5nLiwgUzxpbnQ+KSBpcyBwbGFjZWQgaW4gVE5BTUUuICBUaGUgbmFtZSB3aXRob3V0IHRoZQotICAgdGVtcGxhdGUgcGFyYW1ldGVycyAoZS5nLiBTKSBpcyBwbGFjZWQgaW4gVFJBV05BTUUgaWYgVFJBV05BTUUgaXMKLSAgIG5vbi1OVUxMLiAgSWYgSVNfVFlQRSBpcyBub256ZXJvLCB0aGlzIHRlbXBsYXRlIGlzIGEgdHlwZSB0ZW1wbGF0ZSwKLSAgIG5vdCBhIGZ1bmN0aW9uIHRlbXBsYXRlLiAgSWYgYm90aCBJU19UWVBFIGFuZCBSRU1FTUJFUiBhcmUgbm9uemVybywKLSAgIHRoZSB0bWVwbGF0ZSBpcyByZW1lbWJlcmVkIGluIHRoZSBsaXN0IG9mIGJhY2stcmVmZXJlbmNlYWJsZQotICAgdHlwZXMuICAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgdG5hbWUsIHRyYXduYW1lLCBpc190eXBlLCByZW1lbWJlcikKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnRuYW1lOwotICAgICBzdHJpbmcgKnRyYXduYW1lOwotICAgICBpbnQgaXNfdHlwZTsKLSAgICAgaW50IHJlbWVtYmVyOwotewotICBpbnQgaTsKLSAgaW50IHI7Ci0gIGludCBuZWVkX2NvbW1hID0gMDsKLSAgaW50IHN1Y2Nlc3MgPSAwOwotICBjb25zdCBjaGFyICpzdGFydDsKLSAgaW50IGlzX2phdmFfYXJyYXkgPSAwOwotICBzdHJpbmcgdGVtcDsKLSAgaW50IGJpbmRleCA9IDA7Ci0KLSAgKCptYW5nbGVkKSsrOwotICBpZiAoaXNfdHlwZSkKLSAgICB7Ci0gICAgICBpZiAocmVtZW1iZXIpCi0JYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICAgICAgc3RhcnQgPSAqbWFuZ2xlZDsKLSAgICAgIC8qIGdldCB0ZW1wbGF0ZSBuYW1lICovCi0gICAgICBpZiAoKiptYW5nbGVkID09ICd6JykKLQl7Ci0JICBpbnQgaWR4OwotCSAgKCptYW5nbGVkKSsrOwotCSAgKCptYW5nbGVkKSsrOwotCi0JICBpZHggPSBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpOwotCSAgaWYgKGlkeCA9PSAtMQotCSAgICAgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKLQkgICAgICB8fCBjb25zdW1lX2NvdW50X3dpdGhfdW5kZXJzY29yZXMgKG1hbmdsZWQpID09IC0xKQotCSAgICByZXR1cm4gKDApOwotCi0JICBpZiAod29yay0+dG1wbF9hcmd2ZWMpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0JICAgICAgaWYgKHRyYXduYW1lKQotCQlzdHJpbmdfYXBwZW5kICh0cmF3bmFtZSwgd29yay0+dG1wbF9hcmd2ZWNbaWR4XSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNoYXIgYnVmWzEwXTsKLQkgICAgICBzcHJpbnRmKGJ1ZiwgIlQlZCIsIGlkeCk7Ci0JICAgICAgc3RyaW5nX2FwcGVuZCAodG5hbWUsIGJ1Zik7Ci0JICAgICAgaWYgKHRyYXduYW1lKQotCQlzdHJpbmdfYXBwZW5kICh0cmF3bmFtZSwgYnVmKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoKHIgPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKSkgPD0gMAotCSAgICAgIHx8IChpbnQpIHN0cmxlbiAoKm1hbmdsZWQpIDwgcikKLQkgICAgewotCSAgICAgIHJldHVybiAoMCk7Ci0JICAgIH0KLQkgIGlzX2phdmFfYXJyYXkgPSAod29yayAtPiBvcHRpb25zICYgRE1HTF9KQVZBKQotCSAgICAmJiBzdHJuY21wICgqbWFuZ2xlZCwgIkpBcnJheTFaIiwgOCkgPT0gMDsKLQkgIGlmICghIGlzX2phdmFfYXJyYXkpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfYXBwZW5kbiAodG5hbWUsICptYW5nbGVkLCByKTsKLQkgICAgfQotCSAgaWYgKHRyYXduYW1lKQotCSAgICBzdHJpbmdfYXBwZW5kbiAodHJhd25hbWUsICptYW5nbGVkLCByKTsKLQkgICptYW5nbGVkICs9IHI7Ci0JfQotICAgIH0KLSAgaWYgKCFpc19qYXZhX2FycmF5KQotICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPCIpOwotICAvKiBnZXQgc2l6ZSBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbGlzdCAqLwotICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotICAgIHsKLSAgICAgIHJldHVybiAoMCk7Ci0gICAgfQotICBpZiAoIWlzX3R5cGUpCi0gICAgewotICAgICAgLyogQ3JlYXRlIGFuIGFycmF5IGZvciBzYXZpbmcgdGhlIHRlbXBsYXRlIGFyZ3VtZW50IHZhbHVlcy4gKi8KLSAgICAgIHdvcmstPnRtcGxfYXJndmVjID0gKGNoYXIqKikgeG1hbGxvYyAociAqIHNpemVvZiAoY2hhciAqKSk7Ci0gICAgICB3b3JrLT5udG1wbF9hcmdzID0gcjsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCByOyBpKyspCi0Jd29yay0+dG1wbF9hcmd2ZWNbaV0gPSAwOwotICAgIH0KLSAgZm9yIChpID0gMDsgaSA8IHI7IGkrKykKLSAgICB7Ci0gICAgICBpZiAobmVlZF9jb21tYSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiwgIik7Ci0JfQotICAgICAgLyogWiBmb3IgdHlwZSBwYXJhbWV0ZXJzICovCi0gICAgICBpZiAoKiptYW5nbGVkID09ICdaJykKLQl7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICAvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7Ci0JICBpZiAoc3VjY2VzcykKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgJnRlbXApOwotCi0JICAgICAgaWYgKCFpc190eXBlKQotCQl7Ci0JCSAgLyogU2F2ZSB0aGUgdGVtcGxhdGUgYXJndW1lbnQuICovCi0JCSAgaW50IGxlbiA9IHRlbXAucCAtIHRlbXAuYjsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXSA9IHhtYWxsb2MgKGxlbiArIDEpOwotCQkgIG1lbWNweSAod29yay0+dG1wbF9hcmd2ZWNbaV0sIHRlbXAuYiwgbGVuKTsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQkJfQotCSAgICB9Ci0JICBzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgLyogeiBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycyAqLwotICAgICAgZWxzZSBpZiAoKiptYW5nbGVkID09ICd6JykKLQl7Ci0JICBpbnQgcjI7Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGVfdGVtcGxhdGVfcGFybSAod29yaywgbWFuZ2xlZCwgdG5hbWUpOwotCi0JICBpZiAoc3VjY2VzcwotCSAgICAgICYmIChyMiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpKSA+IDAKLQkgICAgICAmJiAoaW50KSBzdHJsZW4gKCptYW5nbGVkKSA+PSByMikKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiICIpOwotCSAgICAgIHN0cmluZ19hcHBlbmRuICh0bmFtZSwgKm1hbmdsZWQsIHIyKTsKLQkgICAgICBpZiAoIWlzX3R5cGUpCi0JCXsKLQkJICAvKiBTYXZlIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudC4gKi8KLQkJICBpbnQgbGVuID0gcjI7Ci0JCSAgd29yay0+dG1wbF9hcmd2ZWNbaV0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLQkJICBtZW1jcHkgKHdvcmstPnRtcGxfYXJndmVjW2ldLCAqbWFuZ2xlZCwgbGVuKTsKLQkJICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQkJfQotCSAgICAgICptYW5nbGVkICs9IHIyOwotCSAgICB9Ci0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJpbmcgIHBhcmFtOwotCSAgc3RyaW5nKiBzOwotCi0JICAvKiBvdGhlcndpc2UsIHZhbHVlIHBhcmFtZXRlciAqLwotCi0JICAvKiB0ZW1wIGlzIGluaXRpYWxpemVkIGluIGRvX3R5cGUgKi8KLQkgIHN1Y2Nlc3MgPSBkb190eXBlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCk7Ci0JICBzdHJpbmdfZGVsZXRlKCZ0ZW1wKTsKLQkgIGlmICghc3VjY2VzcykKLQkgICAgYnJlYWs7Ci0KLQkgIGlmICghaXNfdHlwZSkKLQkgICAgewotCSAgICAgIHMgPSAmcGFyYW07Ci0JICAgICAgc3RyaW5nX2luaXQgKHMpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHMgPSB0bmFtZTsKLQotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsIHMsCi0JCQkJCQkgICh0eXBlX2tpbmRfdCkgc3VjY2Vzcyk7Ci0KLQkgIGlmICghc3VjY2VzcykKLQkgICAgewotCSAgICAgIGlmICghaXNfdHlwZSkKLQkJc3RyaW5nX2RlbGV0ZSAocyk7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQotCSAgaWYgKCFpc190eXBlKQotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IHMtPnAgLSBzLT5iOwotCSAgICAgIHdvcmstPnRtcGxfYXJndmVjW2ldID0geG1hbGxvYyAobGVuICsgMSk7Ci0JICAgICAgbWVtY3B5ICh3b3JrLT50bXBsX2FyZ3ZlY1tpXSwgcy0+YiwgbGVuKTsKLQkgICAgICB3b3JrLT50bXBsX2FyZ3ZlY1tpXVtsZW5dID0gJ1wwJzsKLQotCSAgICAgIHN0cmluZ19hcHBlbmRzICh0bmFtZSwgcyk7Ci0JICAgICAgc3RyaW5nX2RlbGV0ZSAocyk7Ci0JICAgIH0KLQl9Ci0gICAgICBuZWVkX2NvbW1hID0gMTsKLSAgICB9Ci0gIGlmIChpc19qYXZhX2FycmF5KQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiW10iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAodG5hbWUtPnBbLTFdID09ICc+JykKLQlzdHJpbmdfYXBwZW5kICh0bmFtZSwgIiAiKTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHRuYW1lLCAiPiIpOwotICAgIH0KLQotICBpZiAoaXNfdHlwZSAmJiByZW1lbWJlcikKLSAgICByZW1lbWJlcl9CdHlwZSAod29yaywgdG5hbWUtPmIsIExFTl9TVFJJTkcgKHRuYW1lKSwgYmluZGV4KTsKLQotICAvKgotICAgIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQotICAgIHsKLSAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQgKyAxKTsKLSAgICAqbWFuZ2xlZCArPSBzdHJsZW4gKCptYW5nbGVkKTsKLSAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICBzdWNjZXNzID0gZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotICAgIH0KLSAgICB9Ci0gICAgKi8KLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotc3RhdGljIGludAotYXJtX3B0ICh3b3JrLCBtYW5nbGVkLCBuLCBhbmNob3IsIGFyZ3MpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICptYW5nbGVkOwotICAgICBpbnQgbjsKLSAgICAgY29uc3QgY2hhciAqKmFuY2hvciwgKiphcmdzOwotewotICAvKiBDaGVjayBpZiBBUk0gdGVtcGxhdGUgd2l0aCAiX19wdF9fIiBpbiBpdCAoInBhcmFtZXRlcml6ZWQgdHlwZSIpICovCi0gIC8qIEFsbG93IEhQIGFsc28gaGVyZSwgYmVjYXVzZSBIUCdzIGNmcm9udCBjb21waWxlciBmb2xsb3dzIEFSTSB0byBzb21lIGV4dGVudCAqLwotICBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcpICYmICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3B0X18iKSkpCi0gICAgewotICAgICAgaW50IGxlbjsKLSAgICAgICphcmdzID0gKmFuY2hvciArIDY7Ci0gICAgICBsZW4gPSBjb25zdW1lX2NvdW50IChhcmdzKTsKLSAgICAgIGlmIChsZW4gPT0gLTEpCi0JcmV0dXJuIDA7Ci0gICAgICBpZiAoKmFyZ3MgKyBsZW4gPT0gbWFuZ2xlZCArIG4gJiYgKiphcmdzID09ICdfJykKLQl7Ci0JICArKyphcmdzOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgaWYgKEFVVE9fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLSAgICB7Ci0gICAgICBpZiAoKCphbmNob3IgPSBteXN0cnN0ciAobWFuZ2xlZCwgIl9fdG1fXyIpKQotICAgICAgICAgIHx8ICgqYW5jaG9yID0gbXlzdHJzdHIgKG1hbmdsZWQsICJfX3BzX18iKSkKLSAgICAgICAgICB8fCAoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19wdF9fIikpKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGxlbjsKLSAgICAgICAgICAqYXJncyA9ICphbmNob3IgKyA2OwotICAgICAgICAgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotCSAgaWYgKGxlbiA9PSAtMSkKLQkgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICsrKmFyZ3M7Ci0gICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBlbHNlIGlmICgoKmFuY2hvciA9IG15c3Ryc3RyIChtYW5nbGVkLCAiX19TIikpKQotICAgICAgICB7Ci0gCSAgaW50IGxlbjsKLSAJICAqYXJncyA9ICphbmNob3IgKyAzOwotIAkgIGxlbiA9IGNvbnN1bWVfY291bnQgKGFyZ3MpOwotCSAgaWYgKGxlbiA9PSAtMSkKLQkgICAgcmV0dXJuIDA7Ci0gCSAgaWYgKCphcmdzICsgbGVuID09IG1hbmdsZWQgKyBuICYmICoqYXJncyA9PSAnXycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICsrKmFyZ3M7Ci0gCSAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBuLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBpbnQgbjsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgY29uc3QgY2hhciAqcDsKLSAgY29uc3QgY2hhciAqYXJnczsKLSAgY29uc3QgY2hhciAqZSA9ICptYW5nbGVkICsgbjsKLSAgc3RyaW5nIGFyZzsKLQotICAvKiBDaGVjayBmb3IgSFAgYUNDIHRlbXBsYXRlIHNwZWM6IGNsYXNzWHQxdDIgd2hlcmUgdDEsIHQyIGFyZQotICAgICB0ZW1wbGF0ZSBhcmdzICovCi0gIGlmIChIUF9ERU1BTkdMSU5HICYmICgoKm1hbmdsZWQpW25dID09ICdYJykpCi0gICAgewotICAgICAgY2hhciAqc3RhcnRfc3BlY19hcmdzID0gTlVMTDsKLQotICAgICAgLyogRmlyc3QgY2hlY2sgZm9yIGFuZCBvbWl0IHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHBzZXVkby1hcmd1bWVudHMsCi0gICAgICAgICBzdWNoIGFzIGluICJTcGVjPCMxLCMxLio+IiAqLwotICAgICAgc3RhcnRfc3BlY19hcmdzID0gc3RyY2hyICgqbWFuZ2xlZCwgJzwnKTsKLSAgICAgIGlmIChzdGFydF9zcGVjX2FyZ3MgJiYgKHN0YXJ0X3NwZWNfYXJncyAtICptYW5nbGVkIDwgbikpCi0gICAgICAgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIHN0YXJ0X3NwZWNfYXJncyAtICptYW5nbGVkKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0gICAgICAoKm1hbmdsZWQpICs9IG4gKyAxOwotICAgICAgc3RyaW5nX2luaXQgKCZhcmcpOwotICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpIC8qIG5vbi1yZWN1cnNpdmUgY2FsbCAqLwotICAgICAgICB3b3JrLT50ZW1wX3N0YXJ0ID0gZGVjbHAtPnAgLSBkZWNscC0+YjsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPCIpOwotICAgICAgd2hpbGUgKDEpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJpbmdfY2xlYXIgKCZhcmcpOwotICAgICAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAvKiAnVCcgc2lnbmFscyBhIHR5cGUgcGFyYW1ldGVyICovCi0gICAgICAgICAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICAgICAgICAgIGlmICghZG9fdHlwZSAod29yaywgbWFuZ2xlZCwgJmFyZykpCi0gICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICdVJzoKLSAgICAgICAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgICAgICAgLyogJ1UnIG9yICdTJyBzaWduYWxzIGFuIGludGVncmFsIHZhbHVlICovCi0gICAgICAgICAgICAgICAgaWYgKCFkb19ocGFjY190ZW1wbGF0ZV9jb25zdF92YWx1ZSAod29yaywgbWFuZ2xlZCwgJmFyZykpCi0gICAgICAgICAgICAgICAgICBnb3RvIGhwYWNjX3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICdBJzoKLSAgICAgICAgICAgICAgICAvKiAnQScgc2lnbmFscyBhIG5hbWVkIGNvbnN0YW50IGV4cHJlc3Npb24gKGxpdGVyYWwpICovCi0gICAgICAgICAgICAgICAgaWYgKCFkb19ocGFjY190ZW1wbGF0ZV9saXRlcmFsICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLSAgICAgICAgICAgICAgICAgIGdvdG8gaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLyogVG9kYXksIDE5OTctMDktMDMsIHdlIGhhdmUgb25seSB0aGUgYWJvdmUgdHlwZXMKLSAgICAgICAgICAgICAgICAgICBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgLyogRklYTUU6IG1heWJlIHRoaXMgc2hvdWxkIGZhaWwgYW5kIHJldHVybiBudWxsICovCi0gICAgICAgICAgICAgICAgZ290byBocGFjY190ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmYXJnKTsKLSAgICAgICAgIC8qIENoZWNrIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGVtcGxhdGUgYXJncy4KLSAgICAgICAgICAgICAwIGlmIGF0IGVuZCBvZiBzdGF0aWMgbWVtYmVyIG9mIHRlbXBsYXRlIGNsYXNzLAotICAgICAgICAgICAgIF8gaWYgZG9uZSB3aXRoIHRlbXBsYXRlIGFyZ3MgZm9yIGEgZnVuY3Rpb24gKi8KLSAgICAgICAgICBpZiAoKCoqbWFuZ2xlZCA9PSAnXDAwMCcpIHx8ICgqKm1hbmdsZWQgPT0gJ18nKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotICAgICAgICB9Ci0gICAgaHBhY2NfdGVtcGxhdGVfYXJnc19kb25lOgotICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICI+Iik7Ci0gICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLSAgICAgIGlmICgqKm1hbmdsZWQgPT0gJ18nKQotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAvKiBBUk0gdGVtcGxhdGU/IChBbHNvIGhhbmRsZXMgSFAgY2Zyb250IGV4dGVuc2lvbnMpICovCi0gIGVsc2UgaWYgKGFybV9wdCAod29yaywgKm1hbmdsZWQsIG4sICZwLCAmYXJncykpCi0gICAgewotICAgICAgc3RyaW5nIHR5cGVfc3RyOwotCi0gICAgICBzdHJpbmdfaW5pdCAoJmFyZyk7Ci0gICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBwIC0gKm1hbmdsZWQpOwotICAgICAgaWYgKHdvcmstPnRlbXBfc3RhcnQgPT0gLTEpICAvKiBub24tcmVjdXJzaXZlIGNhbGwgKi8KLQl3b3JrLT50ZW1wX3N0YXJ0ID0gZGVjbHAtPnAgLSBkZWNscC0+YjsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPCIpOwotICAgICAgLyogc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nIGhlcmUgKi8KLSAgICAgIHdoaWxlIChhcmdzIDwgZSkgewotCXN0cmluZ19jbGVhciAoJmFyZyk7Ci0KLQkvKiBDaGVjayBmb3IgdHlwZSBvciBsaXRlcmFsIGhlcmUgKi8KLQlzd2l0Y2ggKCphcmdzKQotCSAgewotCSAgICAvKiBIUCBjZnJvbnQgZXh0ZW5zaW9ucyB0byBBUk0gZm9yIHRlbXBsYXRlIGFyZ3MgKi8KLQkgICAgLyogc3BlYzogWHQxTHYxIHdoZXJlIHQxIGlzIGEgdHlwZSwgdjEgaXMgYSBsaXRlcmFsIHZhbHVlICovCi0JICAgIC8qIEZJWE1FOiBXZSBoYW5kbGUgb25seSBudW1lcmljIGxpdGVyYWxzIGZvciBIUCBjZnJvbnQgKi8KLSAgICAgICAgICBjYXNlICdYJzoKLSAgICAgICAgICAgIC8qIEEgdHlwZWQgY29uc3RhbnQgdmFsdWUgZm9sbG93cyAqLwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCAmYXJncywgJnR5cGVfc3RyKSkKLQkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmYXJnLCAiKCIpOwotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZHMgKCZhcmcsICZ0eXBlX3N0cik7Ci0gICAgICAgICAgICBzdHJpbmdfYXBwZW5kICgmYXJnLCAiKSIpOwotICAgICAgICAgICAgaWYgKCphcmdzICE9ICdMJykKLSAgICAgICAgICAgICAgZ290byBjZnJvbnRfdGVtcGxhdGVfYXJnc19kb25lOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgLyogTm93IHNuYXJmIGEgbGl0ZXJhbCB2YWx1ZSBmb2xsb3dpbmcgJ0wnICovCi0gICAgICAgICAgICBpZiAoIXNuYXJmX251bWVyaWNfbGl0ZXJhbCAoJmFyZ3MsICZhcmcpKQotCSAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAvKiBTbmFyZiBhIGxpdGVyYWwgZm9sbG93aW5nICdMJyAqLwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgaWYgKCFzbmFyZl9udW1lcmljX2xpdGVyYWwgKCZhcmdzLCAmYXJnKSkKLQkgICAgICBnb3RvIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogTm90IGhhbmRsaW5nIG90aGVyIEhQIGNmcm9udCBzdHVmZiAqLwotICAgICAgICAgICAgaWYgKCFkb190eXBlICh3b3JrLCAmYXJncywgJmFyZykpCi0gICAgICAgICAgICAgIGdvdG8gY2Zyb250X3RlbXBsYXRlX2FyZ3NfZG9uZTsKLQkgIH0KLQlzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZhcmcpOwotCXN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotICAgICAgfQotICAgIGNmcm9udF90ZW1wbGF0ZV9hcmdzX2RvbmU6Ci0gICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLSAgICAgIGlmIChhcmdzID49IGUpCi0JLS1kZWNscC0+cDsgLyogcmVtb3ZlIGV4dHJhIGNvbW1hICovCi0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIj4iKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG4+MTAgJiYgc3RybmNtcCAoKm1hbmdsZWQsICJfR0xPQkFMXyIsIDgpID09IDAKLQkgICAmJiAoKm1hbmdsZWQpWzldID09ICdOJwotCSAgICYmICgqbWFuZ2xlZClbOF0gPT0gKCptYW5nbGVkKVsxMF0KLQkgICAmJiBzdHJjaHIgKGNwbHVzX21hcmtlcnMsICgqbWFuZ2xlZClbOF0pKQotICAgIHsKLSAgICAgIC8qIEEgbWVtYmVyIG9mIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiAgKi8KLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAie2Fub255bW91c30iKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAod29yay0+dGVtcF9zdGFydCA9PSAtMSkgLyogbm9uLXJlY3Vyc2l2ZSBjYWxsIG9ubHkgKi8KLQl3b3JrLT50ZW1wX3N0YXJ0ID0gMDsgICAgIC8qIGRpc2FibGUgaW4gcmVjdXJzaXZlIGNhbGxzICovCi0gICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLSAgICB9Ci0gICptYW5nbGVkICs9IG47Ci19Ci0KLS8qIEV4dHJhY3QgYSBjbGFzcyBuYW1lLCBwb3NzaWJseSBhIHRlbXBsYXRlIHdpdGggYXJndW1lbnRzLCBmcm9tIHRoZQotICAgbWFuZ2xlZCBzdHJpbmc7IHF1YWxpZmllcnMsIGxvY2FsIGNsYXNzIGluZGljYXRvcnMsIGV0Yy4gaGF2ZQotICAgYWxyZWFkeSBiZWVuIGRlYWx0IHdpdGggKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IG47Ci0gIGludCBzdWNjZXNzID0gMDsKLQotICBuID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gIGlmIChuID09IC0xKQotICAgIHJldHVybiAwOwotICBpZiAoKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPj0gbikKLSAgICB7Ci0gICAgICBkZW1hbmdsZV9hcm1faHBfdGVtcGxhdGUgKHdvcmssIG1hbmdsZWQsIG4sIGRlY2xwKTsKLSAgICAgIHN1Y2Nlc3MgPSAxOwotICAgIH0KLQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi0vKgotCi1MT0NBTCBGVU5DVElPTgotCi0JZGVtYW5nbGVfY2xhc3MgLS0gZGVtYW5nbGUgYSBtYW5nbGVkIGNsYXNzIHNlcXVlbmNlCi0KLVNZTk9QU0lTCi0KLQlzdGF0aWMgaW50Ci0JZGVtYW5nbGVfY2xhc3MgKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCXN0cmludCAqZGVjbHApCi0KLURFU0NSSVBUSU9OCi0KLQlERUNMUCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIGRlbWFuZ2xpbmcgaXMgYmVpbmcgZG9uZS4KLQotCSpNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCB0b2tlbiB0byBiZSBkZW1hbmdsZWQuICBPbiBpbnB1dCwKLQlpdCBwb2ludHMgdG8gYSBtYW5nbGVkIGNsYXNzIChJLkUuICIzZm9vIiwgIjEzdmVyeWxvbmdjbGFzcyIsIGV0Yy4pCi0JT24gZXhpdCwgaXQgcG9pbnRzIHRvIHRoZSBuZXh0IHRva2VuIGFmdGVyIHRoZSBtYW5nbGVkIGNsYXNzIG9uCi0Jc3VjY2Vzcywgb3IgdGhlIGZpcnN0IHVuY29uc3VtZWQgdG9rZW4gb24gZmFpbHVyZS4KLQotCUlmIHRoZSBDT05TVFJVQ1RPUiBvciBERVNUUlVDVE9SIGZsYWdzIGFyZSBzZXQgaW4gV09SSywgdGhlbgotCXdlIGFyZSBkZW1hbmdsaW5nIGEgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gIEluIHRoaXMgY2FzZQotCXdlIHByZXBlbmQgImNsYXNzOjpjbGFzcyIgb3IgImNsYXNzOjp+Y2xhc3MiIHRvIERFQ0xQLgotCi0JT3RoZXJ3aXNlLCB3ZSBwcmVwZW5kICJjbGFzczo6IiB0byB0aGUgY3VycmVudCBERUNMUC4KLQotCVJlc2V0IHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZsYWdzIG9uY2UgdGhleSBoYXZlIGJlZW4KLQkiY29uc3VtZWQiLiAgVGhpcyBhbGxvd3MgZGVtYW5nbGVfY2xhc3MgdG8gYmUgY2FsbGVkIGxhdGVyIGR1cmluZwotCXRoZSBzYW1lIGRlbWFuZ2xpbmcsIHRvIGRvIG5vcm1hbCBjbGFzcyBkZW1hbmdsaW5nLgotCi0JUmV0dXJucyAxIGlmIGRlbWFuZ2xpbmcgaXMgc3VjY2Vzc2Z1bCwgMCBvdGhlcndpc2UuCi0KLSovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2NsYXNzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgc3VjY2VzcyA9IDA7Ci0gIGludCBidHlwZTsKLSAgc3RyaW5nIGNsYXNzX25hbWU7Ci0gIGNoYXIgKnNhdmVfY2xhc3NfbmFtZV9lbmQgPSAwOwotCi0gIHN0cmluZ19pbml0ICgmY2xhc3NfbmFtZSk7Ci0gIGJ0eXBlID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICBpZiAoZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgJmNsYXNzX25hbWUpKQotICAgIHsKLSAgICAgIHNhdmVfY2xhc3NfbmFtZV9lbmQgPSBjbGFzc19uYW1lLnA7Ci0gICAgICBpZiAoKHdvcmstPmNvbnN0cnVjdG9yICYgMSkgfHwgKHdvcmstPmRlc3RydWN0b3IgJiAxKSkKLQl7Ci0gICAgICAgICAgLyogYWRqdXN0IHNvIHdlIGRvbid0IGluY2x1ZGUgdGVtcGxhdGUgYXJncyAqLwotICAgICAgICAgIGlmICh3b3JrLT50ZW1wX3N0YXJ0ICYmICh3b3JrLT50ZW1wX3N0YXJ0ICE9IC0xKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY2xhc3NfbmFtZS5wID0gY2xhc3NfbmFtZS5iICsgd29yay0+dGVtcF9zdGFydDsKLSAgICAgICAgICAgIH0KLQkgIHN0cmluZ19wcmVwZW5kcyAoZGVjbHAsICZjbGFzc19uYW1lKTsKLQkgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQotCSAgICB7Ci0JICAgICAgc3RyaW5nX3ByZXBlbmQgKGRlY2xwLCAifiIpOwotICAgICAgICAgICAgICB3b3JrIC0+IGRlc3RydWN0b3IgLT0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgd29yayAtPiBjb25zdHJ1Y3RvciAtPSAxOwotCSAgICB9Ci0JfQotICAgICAgY2xhc3NfbmFtZS5wID0gc2F2ZV9jbGFzc19uYW1lX2VuZDsKLSAgICAgIHJlbWVtYmVyX0t0eXBlICh3b3JrLCBjbGFzc19uYW1lLmIsIExFTl9TVFJJTkcoJmNsYXNzX25hbWUpKTsKLSAgICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCBjbGFzc19uYW1lLmIsIExFTl9TVFJJTkcoJmNsYXNzX25hbWUpLCBidHlwZSk7Ci0gICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgc3RyaW5nX3ByZXBlbmRzIChkZWNscCwgJmNsYXNzX25hbWUpOwotICAgICAgc3VjY2VzcyA9IDE7Ci0gICAgfQotICBzdHJpbmdfZGVsZXRlICgmY2xhc3NfbmFtZSk7Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9wcmVmaXggLS0gY29uc3VtZSB0aGUgbWFuZ2xlZCBuYW1lIHByZWZpeCBhbmQgZmluZCBzaWduYXR1cmUKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9wcmVmaXggKHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrLCBjb25zdCBjaGFyICoqbWFuZ2xlZCwKLQkJCSBzdHJpbmcgKmRlY2xwKTsKLQotREVTQ1JJUFRJT04KLQotCUNvbnN1bWUgYW5kIGRlbWFuZ2xlIHRoZSBwcmVmaXggb2YgdGhlIG1hbmdsZWQgbmFtZS4KLQotCURFQ0xQIHBvaW50cyB0byB0aGUgc3RyaW5nIGJ1ZmZlciBpbnRvIHdoaWNoIGRlbWFuZ2xlZCBvdXRwdXQgaXMKLQlwbGFjZWQuICBPbiBlbnRyeSwgdGhlIGJ1ZmZlciBpcyBlbXB0eS4gIE9uIGV4aXQgaXQgY29udGFpbnMKLQl0aGUgcm9vdCBmdW5jdGlvbiBuYW1lLCB0aGUgZGVtYW5nbGVkIG9wZXJhdG9yIG5hbWUsIG9yIGluIHNvbWUKLQlzcGVjaWFsIGNhc2VzIGVpdGhlciBub3RoaW5nIG9yIHRoZSBjb21wbGV0ZWx5IGRlbWFuZ2xlZCByZXN1bHQuCi0KLQlNQU5HTEVEIHBvaW50cyB0byB0aGUgY3VycmVudCBwb2ludGVyIGludG8gdGhlIG1hbmdsZWQgbmFtZS4gIEFzIGVhY2gKLQl0b2tlbiBvZiB0aGUgbWFuZ2xlZCBuYW1lIGlzIGNvbnN1bWVkLCBpdCBpcyB1cGRhdGVkLiAgVXBvbiBlbnRyeQotCXRoZSBjdXJyZW50IG1hbmdsZWQgbmFtZSBwb2ludGVyIHBvaW50cyB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCi0JdGhlIG1hbmdsZWQgbmFtZS4gIFVwb24gZXhpdCwgaXQgc2hvdWxkIHBvaW50IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLQlvZiB0aGUgc2lnbmF0dXJlIGlmIGRlbWFuZ2xpbmcgd2FzIHN1Y2Nlc3NmdWwsIG9yIHRvIHRoZSBmaXJzdAotCXVuY29uc3VtZWQgY2hhcmFjdGVyIGlmIGRlbWFuZ2xpbmcgb2YgdGhlIHByZWZpeCB3YXMgdW5zdWNjZXNzZnVsLgotCi0JUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLgotICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX3ByZWZpeCAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpzY2FuOwotICBpbnQgaTsKLQotICBpZiAoc3RybGVuKCptYW5nbGVkKSA+IDYKLSAgICAgICYmIChzdHJuY21wKCptYW5nbGVkLCAiX2ltcF9fIiwgNikgPT0gMAotICAgICAgICAgIHx8IHN0cm5jbXAoKm1hbmdsZWQsICJfX2ltcF8iLCA2KSA9PSAwKSkKLSAgICB7Ci0gICAgICAvKiBpdCdzIGEgc3ltYm9sIGltcG9ydGVkIGZyb20gYSBQRSBkeW5hbWljIGxpYnJhcnkuIENoZWNrIGZvciBib3RoCi0gICAgICAgICBuZXcgc3R5bGUgcHJlZml4IF9pbXBfXyBhbmQgbGVnYWN5IF9faW1wXyB1c2VkIGJ5IG9sZGVyIHZlcnNpb25zCi0JIG9mIGRsbHRvb2wuICovCi0gICAgICAoKm1hbmdsZWQpICs9IDY7Ci0gICAgICB3b3JrLT5kbGxpbXBvcnRlZCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChzdHJsZW4oKm1hbmdsZWQpID49IDExICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfR0xPQkFMXyIsIDgpID09IDApCi0gICAgewotICAgICAgY2hhciAqbWFya2VyID0gc3RyY2hyIChjcGx1c19tYXJrZXJzLCAoKm1hbmdsZWQpWzhdKTsKLSAgICAgIGlmIChtYXJrZXIgIT0gTlVMTCAmJiAqbWFya2VyID09ICgqbWFuZ2xlZClbMTBdKQotCXsKLQkgIGlmICgoKm1hbmdsZWQpWzldID09ICdEJykKLQkgICAgewotCSAgICAgIC8qIGl0J3MgYSBHTlUgZ2xvYmFsIGRlc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBleGl0ICovCi0JICAgICAgKCptYW5nbGVkKSArPSAxMTsKLQkgICAgICB3b3JrLT5kZXN0cnVjdG9yID0gMjsKLQkgICAgICBpZiAoZ251X3NwZWNpYWwgKHdvcmssIG1hbmdsZWQsIGRlY2xwKSkKLQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKCgqbWFuZ2xlZClbOV0gPT0gJ0knKQotCSAgICB7Ci0JICAgICAgLyogaXQncyBhIEdOVSBnbG9iYWwgY29uc3RydWN0b3IgdG8gYmUgZXhlY3V0ZWQgYXQgcHJvZ3JhbSBpbml0ICovCi0JICAgICAgKCptYW5nbGVkKSArPSAxMTsKLQkgICAgICB3b3JrLT5jb25zdHJ1Y3RvciA9IDI7Ci0JICAgICAgaWYgKGdudV9zcGVjaWFsICh3b3JrLCBtYW5nbGVkLCBkZWNscCkpCi0JCXJldHVybiBzdWNjZXNzOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpICYmIHN0cm5jbXAoKm1hbmdsZWQsICJfX3N0ZF9fIiwgNykgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBpdCdzIGEgQVJNIGdsb2JhbCBkZXN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gZXhpdCAqLwotICAgICAgKCptYW5nbGVkKSArPSA3OwotICAgICAgd29yay0+ZGVzdHJ1Y3RvciA9IDI7Ci0gICAgfQotICBlbHNlIGlmICgoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgc3RybmNtcCgqbWFuZ2xlZCwgIl9fc3RpX18iLCA3KSA9PSAwKQotICAgIHsKLSAgICAgIC8qIGl0J3MgYSBBUk0gZ2xvYmFsIGNvbnN0cnVjdG9yIHRvIGJlIGV4ZWN1dGVkIGF0IHByb2dyYW0gaW5pdGlhbCAqLwotICAgICAgKCptYW5nbGVkKSArPSA3OwotICAgICAgd29yay0+Y29uc3RydWN0b3IgPSAyOwotICAgIH0KLQotICAvKiAgVGhpcyBibG9jayBvZiBjb2RlIGlzIGEgcmVkdWN0aW9uIGluIHN0cmVuZ3RoIHRpbWUgb3B0aW1pemF0aW9uCi0gICAgICBvZjoKLSAgICAgIHNjYW4gPSBteXN0cnN0ciAoKm1hbmdsZWQsICJfXyIpOyAqLwotCi0gIHsKLSAgICBzY2FuID0gKm1hbmdsZWQ7Ci0KLSAgICBkbyB7Ci0gICAgICBzY2FuID0gc3RyY2hyIChzY2FuLCAnXycpOwotICAgIH0gd2hpbGUgKHNjYW4gIT0gTlVMTCAmJiAqKytzY2FuICE9ICdfJyk7Ci0KLSAgICBpZiAoc2NhbiAhPSBOVUxMKSAtLXNjYW47Ci0gIH0KLQotICBpZiAoc2NhbiAhPSBOVUxMKQotICAgIHsKLSAgICAgIC8qIFdlIGZvdW5kIGEgc2VxdWVuY2Ugb2YgdHdvIG9yIG1vcmUgJ18nLCBlbnN1cmUgdGhhdCB3ZSBzdGFydCBhdAotCSB0aGUgbGFzdCBwYWlyIGluIHRoZSBzZXF1ZW5jZS4gICovCi0gICAgICBpID0gc3Ryc3BuIChzY2FuLCAiXyIpOwotICAgICAgaWYgKGkgPiAyKQotCXsKLQkgIHNjYW4gKz0gKGkgLSAyKTsKLQl9Ci0gICAgfQotCi0gIGlmIChzY2FuID09IE5VTEwpCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICBlbHNlIGlmICh3b3JrIC0+IHN0YXRpY190eXBlKQotICAgIHsKLSAgICAgIGlmICghaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblswXSkgJiYgKHNjYW5bMF0gIT0gJ3QnKSkKLQl7Ci0JICBzdWNjZXNzID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmICgoc2NhbiA9PSAqbWFuZ2xlZCkKLQkgICAmJiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkgfHwgKHNjYW5bMl0gPT0gJ1EnKQotCSAgICAgICB8fCAoc2NhblsyXSA9PSAndCcpIHx8IChzY2FuWzJdID09ICdLJykgfHwgKHNjYW5bMl0gPT0gJ0gnKSkpCi0gICAgewotICAgICAgLyogVGhlIEFSTSBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIG1hbmdsaW5nIG9mIGxvY2FsIHZhcmlhYmxlcy4KLQkgQnV0IGNmcm9udCBtYW5nbGVzIGxvY2FsIHZhcmlhYmxlcyBieSBwcmVwZW5kaW5nIF9fPG5lc3RpbmdfbGV2ZWw+Ci0JIHRvIHRoZW0uIEFzIGFuIGV4dGVuc2lvbiB0byBBUk0gZGVtYW5nbGluZyB3ZSBoYW5kbGUgdGhpcyBjYXNlLiAgKi8KLSAgICAgIGlmICgoTFVDSURfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBIUF9ERU1BTkdMSU5HKQotCSAgJiYgaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkpCi0JewotCSAgKm1hbmdsZWQgPSBzY2FuICsgMjsKLQkgIGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsICptYW5nbGVkKTsKLQkgICptYW5nbGVkICs9IHN0cmxlbiAoKm1hbmdsZWQpOwotCSAgc3VjY2VzcyA9IDE7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIEEgR05VIHN0eWxlIGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoIF9fWzAtOVF0XS4gIEJ1dCBjZnJvbnQgdXNlcwotCSAgICAgbmFtZXMgbGlrZSBfX1EyXzNmb28zYmFyIGZvciBuZXN0ZWQgdHlwZSBuYW1lcy4gIFNvIGRvbid0IGFjY2VwdAotCSAgICAgdGhpcyBzdHlsZSBvZiBjb25zdHJ1Y3RvciBmb3IgY2Zyb250IGRlbWFuZ2xpbmcuICBBIEdOVQotCSAgICAgc3R5bGUgbWVtYmVyLXRlbXBsYXRlIGNvbnN0cnVjdG9yIHN0YXJ0cyB3aXRoICdIJy4gKi8KLQkgIGlmICghKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykpCi0JICAgIHdvcmsgLT4gY29uc3RydWN0b3IgKz0gMTsKLQkgICptYW5nbGVkID0gc2NhbiArIDI7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoQVJNX0RFTUFOR0xJTkcgJiYgc2NhblsyXSA9PSAncCcgJiYgc2NhblszXSA9PSAndCcpCi0gICAgewotICAgICAgLyogQ2Zyb250LXN0eWxlIHBhcmFtZXRlcml6ZWQgdHlwZS4gIEhhbmRsZWQgbGF0ZXIgYXMgYSBzaWduYXR1cmUuICovCi0gICAgICBzdWNjZXNzID0gMTsKLQotICAgICAgLyogQVJNIHRlbXBsYXRlPyAqLwotICAgICAgZGVtYW5nbGVfYXJtX2hwX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBzdHJsZW4gKCptYW5nbGVkKSwgZGVjbHApOwotICAgIH0KLSAgZWxzZSBpZiAoRURHX0RFTUFOR0xJTkcgJiYgKChzY2FuWzJdID09ICd0JyAmJiBzY2FuWzNdID09ICdtJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICdzJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzY2FuWzJdID09ICdwJyAmJiBzY2FuWzNdID09ICd0JykpKQotICAgIHsKLSAgICAgIC8qIEVERy1zdHlsZSBwYXJhbWV0ZXJpemVkIHR5cGUuICBIYW5kbGVkIGxhdGVyIGFzIGEgc2lnbmF0dXJlLiAqLwotICAgICAgc3VjY2VzcyA9IDE7Ci0KLSAgICAgIC8qIEVERyB0ZW1wbGF0ZT8gKi8KLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgc3RybGVuICgqbWFuZ2xlZCksIGRlY2xwKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChzY2FuID09ICptYW5nbGVkKSAmJiAhaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpc2NhblsyXSkKLQkgICAmJiAoc2NhblsyXSAhPSAndCcpKQotICAgIHsKLSAgICAgIC8qIE1hbmdsZWQgbmFtZSBzdGFydHMgd2l0aCAiX18iLiAgU2tpcCBvdmVyIGFueSBsZWFkaW5nICdfJyBjaGFyYWN0ZXJzLAotCSB0aGVuIGZpbmQgdGhlIG5leHQgIl9fIiB0aGF0IHNlcGFyYXRlcyB0aGUgcHJlZml4IGZyb20gdGhlIHNpZ25hdHVyZS4KLQkgKi8KLSAgICAgIGlmICghKEFSTV9ERU1BTkdMSU5HIHx8IExVQ0lEX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgIHx8IChhcm1fc3BlY2lhbCAobWFuZ2xlZCwgZGVjbHApID09IDApKQotCXsKLQkgIHdoaWxlICgqc2NhbiA9PSAnXycpCi0JICAgIHsKLQkgICAgICBzY2FuKys7Ci0JICAgIH0KLQkgIGlmICgoc2NhbiA9IG15c3Ryc3RyIChzY2FuLCAiX18iKSkgPT0gTlVMTCB8fCAoKihzY2FuICsgMikgPT0gJ1wwJykpCi0JICAgIHsKLQkgICAgICAvKiBObyBzZXBhcmF0b3IgKEkuRS4gIl9fbm90X21hbmdsZWQiKSwgb3IgZW1wdHkgc2lnbmF0dXJlCi0JCSAoSS5FLiAiX19ub3RfbWFuZ2xlZF9laXRoZXJfXyIpICovCi0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKnRtcDsKLQotICAgICAgICAgICAgICAvKiBMb29rIGZvciB0aGUgTEFTVCBvY2N1cnJlbmNlIG9mIF9fLCBhbGxvd2luZyBuYW1lcyB0bwotICAgICAgICAgICAgICAgICBoYXZlIHRoZSAnX18nIHNlcXVlbmNlIGVtYmVkZGVkIGluIHRoZW0uICovCi0JICAgICAgaWYgKCEoQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORykpCi0JCXsKLQkJICB3aGlsZSAoKHRtcCA9IG15c3Ryc3RyIChzY2FuICsgMiwgIl9fIikpICE9IE5VTEwpCi0JCSAgICBzY2FuID0gdG1wOwotCQl9Ci0JICAgICAgaWYgKCooc2NhbiArIDIpID09ICdcMCcpCi0JCXN1Y2Nlc3MgPSAwOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoKihzY2FuICsgMikgIT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBNYW5nbGVkIG5hbWUgZG9lcyBub3Qgc3RhcnQgd2l0aCAiX18iIGJ1dCBkb2VzIGhhdmUgb25lIHNvbWV3aGVyZQotCSBpbiB0aGVyZSB3aXRoIG5vbiBlbXB0eSBzdHVmZiBhZnRlciBpdC4gIExvb2tzIGxpa2UgYSBnbG9iYWwKLQkgZnVuY3Rpb24gbmFtZS4gICovCi0gICAgICBkZW1hbmdsZV9mdW5jdGlvbl9uYW1lICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgc2Nhbik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRG9lc24ndCBsb29rIGxpa2UgYSBtYW5nbGVkIG5hbWUgKi8KLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgIH0KLQotICBpZiAoIXN1Y2Nlc3MgJiYgKHdvcmstPmNvbnN0cnVjdG9yID09IDIgfHwgd29yay0+ZGVzdHJ1Y3RvciA9PSAyKSkKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgKm1hbmdsZWQpOwotICAgICAgKm1hbmdsZWQgKz0gc3RybGVuICgqbWFuZ2xlZCk7Ci0gICAgICBzdWNjZXNzID0gMTsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlnbnVfc3BlY2lhbCAtLSBzcGVjaWFsIGhhbmRsaW5nIG9mIGdudSBtYW5nbGVkIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlnbnVfc3BlY2lhbCAoc3RydWN0IHdvcmtfc3R1ZmYgKndvcmssIGNvbnN0IGNoYXIgKiptYW5nbGVkLAotCQkgICAgIHN0cmluZyAqZGVjbHApOwotCi0KLURFU0NSSVBUSU9OCi0KLQlQcm9jZXNzIHNvbWUgc3BlY2lhbCBHTlUgc3R5bGUgbWFuZ2xpbmcgZm9ybXMgdGhhdCBkb24ndCBmaXQKLQl0aGUgbm9ybWFsIHBhdHRlcm4uICBGb3IgZXhhbXBsZToKLQotCQlfJF8zZm9vCQkoZGVzdHJ1Y3RvciBmb3IgY2xhc3MgZm9vKQotCQlfdnQkZm9vCQkoZm9vIHZpcnR1YWwgdGFibGUpCi0JCV92dCRmb28kYmFyCShmb286OmJhciB2aXJ0dWFsIHRhYmxlKQotCQlfX3Z0X2ZvbwkoZm9vIHZpcnR1YWwgdGFibGUsIG5ldyBzdHlsZSB3aXRoIHRodW5rcykKLQkJXzNmb28kdmFybmFtZQkoc3RhdGljIGRhdGEgbWVtYmVyKQotCQlfUTIycnMydHUkdncJKHN0YXRpYyBkYXRhIG1lbWJlcikKLQkJX190NnZlY3RvcjFaaWkJKGNvbnN0cnVjdG9yIHdpdGggdGVtcGxhdGUpCi0JCV9fdGh1bmtfNF9fJF83b3N0cmVhbSAodmlydHVhbCBmdW5jdGlvbiB0aHVuaykKLSAqLwotCi1zdGF0aWMgaW50Ci1nbnVfc3BlY2lhbCAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgaW50IG47Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY29uc3QgY2hhciAqcDsKLQotICBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycKLSAgICAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVsxXSkgIT0gTlVMTAotICAgICAgJiYgKCptYW5nbGVkKVsyXSA9PSAnXycpCi0gICAgewotICAgICAgLyogRm91bmQgYSBHTlUgc3R5bGUgZGVzdHJ1Y3RvciwgZ2V0IHBhc3QgIl88Q1BMVVNfTUFSS0VSPl8iICovCi0gICAgICAoKm1hbmdsZWQpICs9IDM7Ci0gICAgICB3b3JrIC0+IGRlc3RydWN0b3IgKz0gMTsKLSAgICB9Ci0gIGVsc2UgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ18nCi0JICAgJiYgKCgoKm1hbmdsZWQpWzFdID09ICdfJwotCQkmJiAoKm1hbmdsZWQpWzJdID09ICd2JwotCQkmJiAoKm1hbmdsZWQpWzNdID09ICd0JwotCQkmJiAoKm1hbmdsZWQpWzRdID09ICdfJykKLQkgICAgICAgfHwgKCgqbWFuZ2xlZClbMV0gPT0gJ3YnCi0JCSAgICYmICgqbWFuZ2xlZClbMl0gPT0gJ3QnCi0JCSAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgKCptYW5nbGVkKVszXSkgIT0gTlVMTCkpKQotICAgIHsKLSAgICAgIC8qIEZvdW5kIGEgR05VIHN0eWxlIHZpcnR1YWwgdGFibGUsIGdldCBwYXN0ICJfdnQ8Q1BMVVNfTUFSS0VSPiIKLSAgICAgICAgIGFuZCBjcmVhdGUgdGhlIGRlY2wuICBOb3RlIHRoYXQgd2UgY29uc3VtZSB0aGUgZW50aXJlIG1hbmdsZWQKLQkgaW5wdXQgc3RyaW5nLCB3aGljaCBtZWFucyB0aGF0IGRlbWFuZ2xlX3NpZ25hdHVyZSBoYXMgbm8gd29yawotCSB0byBkby4gICovCi0gICAgICBpZiAoKCptYW5nbGVkKVsyXSA9PSAndicpCi0JKCptYW5nbGVkKSArPSA1OyAvKiBOZXcgc3R5bGUsIHdpdGggdGh1bmtzOiAiX192dF8iICovCi0gICAgICBlbHNlCi0JKCptYW5nbGVkKSArPSA0OyAvKiBPbGQgc3R5bGUsIG5vIHRodW5rczogIl92dDxDUExVU19NQVJLRVI+IiAqLwotICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAhPSAnXDAnKQotCXsKLQkgIHN3aXRjaCAoKiptYW5nbGVkKQotCSAgICB7Ci0JICAgIGNhc2UgJ1EnOgotCSAgICBjYXNlICdLJzoKLQkgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ3QnOgotCSAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIDAsIDEsCi0JCQkJCSAgIDEpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIGlmIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSptYW5nbGVkWzBdKSkKLQkJewotCQkgIG4gPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotCQkgIC8qIFdlIG1heSBiZSBzZWVpbmcgYSB0b28tbGFyZ2Ugc2l6ZSwgb3IgZWxzZSBhCi0JCSAgICAgIi48ZGlnaXRzPiIgaW5kaWNhdGluZyBhIHN0YXRpYyBsb2NhbCBzeW1ib2wuICBJbgotCQkgICAgIGFueSBjYXNlLCBkZWNsYXJlIHZpY3RvcnkgYW5kIG1vdmUgb247ICpkb24ndCogdHJ5Ci0JCSAgICAgdG8gdXNlIG4gdG8gYWxsb2NhdGUuICAqLwotCQkgIGlmIChuID4gKGludCkgc3RybGVuICgqbWFuZ2xlZCkpCi0JCSAgICB7Ci0JCSAgICAgIHN1Y2Nlc3MgPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgIG4gPSBzdHJjc3BuICgqbWFuZ2xlZCwgY3BsdXNfbWFya2Vycyk7Ci0JCX0KLQkgICAgICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICAgICAoKm1hbmdsZWQpICs9IG47Ci0JICAgIH0KLQotCSAgcCA9IHN0cnBicmsgKCptYW5nbGVkLCBjcGx1c19tYXJrZXJzKTsKLQkgIGlmIChzdWNjZXNzICYmICgocCA9PSBOVUxMKSB8fCAocCA9PSAqbWFuZ2xlZCkpKQotCSAgICB7Ci0JICAgICAgaWYgKHAgIT0gTlVMTCkKLQkJewotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkJICAoKm1hbmdsZWQpKys7Ci0JCX0KLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoc3VjY2VzcykKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgIiB2aXJ0dWFsIHRhYmxlIik7Ci0gICAgfQotICBlbHNlIGlmICgoKm1hbmdsZWQpWzBdID09ICdfJwotCSAgICYmIChzdHJjaHIoIjAxMjM0NTY3ODlRdCIsICgqbWFuZ2xlZClbMV0pICE9IE5VTEwpCi0JICAgJiYgKHAgPSBzdHJwYnJrICgqbWFuZ2xlZCwgY3BsdXNfbWFya2VycykpICE9IE5VTEwpCi0gICAgewotICAgICAgLyogc3RhdGljIGRhdGEgbWVtYmVyLCAiXzNmb28kdmFybmFtZSIgZm9yIGV4YW1wbGUgKi8KLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQljYXNlICdLJzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwgMSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgaWYgKG4gPCAwIHx8IG4gPiBzdHJsZW4gKCptYW5nbGVkKSkKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kbiAoZGVjbHAsICptYW5nbGVkLCBuKTsKLQkgICgqbWFuZ2xlZCkgKz0gbjsKLQl9Ci0gICAgICBpZiAoc3VjY2VzcyAmJiAocCA9PSAqbWFuZ2xlZCkpCi0JewotCSAgLyogQ29uc3VtZWQgZXZlcnl0aGluZyB1cCB0byB0aGUgY3BsdXNfbWFya2VyLCBhcHBlbmQgdGhlCi0JICAgICB2YXJpYWJsZSBuYW1lLiAgKi8KLQkgICgqbWFuZ2xlZCkrKzsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLQkgIG4gPSBzdHJsZW4gKCptYW5nbGVkKTsKLQkgIHN0cmluZ19hcHBlbmRuIChkZWNscCwgKm1hbmdsZWQsIG4pOwotCSAgKCptYW5nbGVkKSArPSBuOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdWNjZXNzID0gMDsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgIl9fdGh1bmtfIiwgOCkgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZGVsdGE7Ci0KLSAgICAgICgqbWFuZ2xlZCkgKz0gODsKLSAgICAgIGRlbHRhID0gY29uc3VtZV9jb3VudCAobWFuZ2xlZCk7Ci0gICAgICBpZiAoZGVsdGEgPT0gLTEpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0JewotCSAgY2hhciAqbWV0aG9kID0gaW50ZXJuYWxfY3BsdXNfZGVtYW5nbGUgKHdvcmssICsrKm1hbmdsZWQpOwotCi0JICBpZiAobWV0aG9kKQotCSAgICB7Ci0JICAgICAgY2hhciBidWZbNTBdOwotCSAgICAgIHNwcmludGYgKGJ1ZiwgInZpcnR1YWwgZnVuY3Rpb24gdGh1bmsgKGRlbHRhOiVkKSBmb3IgIiwgLWRlbHRhKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgYnVmKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgbWV0aG9kKTsKLQkgICAgICBmcmVlIChtZXRob2QpOwotCSAgICAgIG4gPSBzdHJsZW4gKCptYW5nbGVkKTsKLQkgICAgICAoKm1hbmdsZWQpICs9IG47Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICB9Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoc3RybmNtcCAoKm1hbmdsZWQsICJfX3QiLCAzKSA9PSAwCi0JICAgJiYgKCgqbWFuZ2xlZClbM10gPT0gJ2knIHx8ICgqbWFuZ2xlZClbM10gPT0gJ2YnKSkKLSAgICB7Ci0gICAgICBwID0gKCptYW5nbGVkKVszXSA9PSAnaScgPyAiIHR5cGVfaW5mbyBub2RlIiA6ICIgdHlwZV9pbmZvIGZ1bmN0aW9uIjsKLSAgICAgICgqbWFuZ2xlZCkgKz0gNDsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdRJzoKLQljYXNlICdLJzoKLQkgIHN1Y2Nlc3MgPSBkZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIGRlY2xwLCAwLCAxKTsKLQkgIGJyZWFrOwotCWNhc2UgJ3QnOgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCBkZWNscCwgMCwgMSwgMSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgc3VjY2VzcyA9IGRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgZGVjbHApOwotCSAgYnJlYWs7Ci0JfQotICAgICAgaWYgKHN1Y2Nlc3MgJiYgKiptYW5nbGVkICE9ICdcMCcpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBpZiAoc3VjY2VzcykKLQlzdHJpbmdfYXBwZW5kIChkZWNscCwgcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgfQotICByZXR1cm4gKHN1Y2Nlc3MpOwotfQotCi1zdGF0aWMgdm9pZAotcmVjdXJzaXZlbHlfZGVtYW5nbGUod29yaywgbWFuZ2xlZCwgcmVzdWx0LCBuYW1lbGVuZ3RoKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotICAgICBpbnQgbmFtZWxlbmd0aDsKLXsKLSAgY2hhciAqIHJlY3Vyc2UgPSAoY2hhciAqKU5VTEw7Ci0gIGNoYXIgKiByZWN1cnNlX2RlbSA9IChjaGFyICopTlVMTDsKLQotICByZWN1cnNlID0gKGNoYXIgKikgeG1hbGxvYyAobmFtZWxlbmd0aCArIDEpOwotICBtZW1jcHkgKHJlY3Vyc2UsICptYW5nbGVkLCBuYW1lbGVuZ3RoKTsKLSAgcmVjdXJzZVtuYW1lbGVuZ3RoXSA9ICdcMDAwJzsKLQotICByZWN1cnNlX2RlbSA9IGNwbHVzX2RlbWFuZ2xlIChyZWN1cnNlLCB3b3JrLT5vcHRpb25zKTsKLQotICBpZiAocmVjdXJzZV9kZW0pCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCByZWN1cnNlX2RlbSk7Ci0gICAgICBmcmVlIChyZWN1cnNlX2RlbSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKHJlc3VsdCwgKm1hbmdsZWQsIG5hbWVsZW5ndGgpOwotICAgIH0KLSAgZnJlZSAocmVjdXJzZSk7Ci0gICptYW5nbGVkICs9IG5hbWVsZW5ndGg7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlhcm1fc3BlY2lhbCAtLSBzcGVjaWFsIGhhbmRsaW5nIG9mIEFSTS9sdWNpZCBtYW5nbGVkIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlhcm1fc3BlY2lhbCAoY29uc3QgY2hhciAqKm1hbmdsZWQsCi0JCSAgICAgc3RyaW5nICpkZWNscCk7Ci0KLQotREVTQ1JJUFRJT04KLQotCVByb2Nlc3Mgc29tZSBzcGVjaWFsIEFSTSBzdHlsZSBtYW5nbGluZyBmb3JtcyB0aGF0IGRvbid0IGZpdAotCXRoZSBub3JtYWwgcGF0dGVybi4gIEZvciBleGFtcGxlOgotCi0JCV9fdnRibF9fM2ZvbwkJKGZvbyB2aXJ0dWFsIHRhYmxlKQotCQlfX3Z0YmxfXzNmb29fXzNiYXIJKGJhcjo6Zm9vIHZpcnR1YWwgdGFibGUpCi0KLSAqLwotCi1zdGF0aWMgaW50Ci1hcm1fc3BlY2lhbCAobWFuZ2xlZCwgZGVjbHApCi0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBpbnQgbjsKLSAgaW50IHN1Y2Nlc3MgPSAxOwotICBjb25zdCBjaGFyICpzY2FuOwotCi0gIGlmIChzdHJuY21wICgqbWFuZ2xlZCwgQVJNX1ZUQUJMRV9TVFJJTkcsIEFSTV9WVEFCTEVfU1RSTEVOKSA9PSAwKQotICAgIHsKLSAgICAgIC8qIEZvdW5kIGEgQVJNIHN0eWxlIHZpcnR1YWwgdGFibGUsIGdldCBwYXN0IEFSTV9WVEFCTEVfU1RSSU5HCi0gICAgICAgICBhbmQgY3JlYXRlIHRoZSBkZWNsLiAgTm90ZSB0aGF0IHdlIGNvbnN1bWUgdGhlIGVudGlyZSBtYW5nbGVkCi0JIGlucHV0IHN0cmluZywgd2hpY2ggbWVhbnMgdGhhdCBkZW1hbmdsZV9zaWduYXR1cmUgaGFzIG5vIHdvcmsKLQkgdG8gZG8uICAqLwotICAgICAgc2NhbiA9ICptYW5nbGVkICsgQVJNX1ZUQUJMRV9TVFJMRU47Ci0gICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgICAgICAgIC8qIGZpcnN0IGNoZWNrIGl0IGNhbiBiZSBkZW1hbmdsZWQgKi8KLSAgICAgICAgewotICAgICAgICAgIG4gPSBjb25zdW1lX2NvdW50ICgmc2Nhbik7Ci0gICAgICAgICAgaWYgKG4gPT0gLTEpCi0JICAgIHsKLQkgICAgICByZXR1cm4gKDApOyAgICAgICAgICAgLyogbm8gZ29vZCAqLwotCSAgICB9Ci0gICAgICAgICAgc2NhbiArPSBuOwotICAgICAgICAgIGlmIChzY2FuWzBdID09ICdfJyAmJiBzY2FuWzFdID09ICdfJykKLQkgICAgewotCSAgICAgIHNjYW4gKz0gMjsKLQkgICAgfQotICAgICAgICB9Ci0gICAgICAoKm1hbmdsZWQpICs9IEFSTV9WVEFCTEVfU1RSTEVOOwotICAgICAgd2hpbGUgKCoqbWFuZ2xlZCAhPSAnXDAnKQotCXsKLQkgIG4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLSAgICAgICAgICBpZiAobiA9PSAtMQotCSAgICAgIHx8IG4gPiBzdHJsZW4gKCptYW5nbGVkKSkKLQkgICAgcmV0dXJuIDA7Ci0JICBzdHJpbmdfcHJlcGVuZG4gKGRlY2xwLCAqbWFuZ2xlZCwgbik7Ci0JICAoKm1hbmdsZWQpICs9IG47Ci0JICBpZiAoKCptYW5nbGVkKVswXSA9PSAnXycgJiYgKCptYW5nbGVkKVsxXSA9PSAnXycpCi0JICAgIHsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAoZGVjbHAsICI6OiIpOwotCSAgICAgICgqbWFuZ2xlZCkgKz0gMjsKLQkgICAgfQotCX0KLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiIHZpcnR1YWwgdGFibGUiKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0gIHJldHVybiAoc3VjY2Vzcyk7Ci19Ci0KLS8qCi0KLUxPQ0FMIEZVTkNUSU9OCi0KLQlkZW1hbmdsZV9xdWFsaWZpZWQgLS0gZGVtYW5nbGUgJ1EnIHF1YWxpZmllZCBuYW1lIHN0cmluZ3MKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlkZW1hbmdsZV9xdWFsaWZpZWQgKHN0cnVjdCB3b3JrX3N0dWZmICosIGNvbnN0IGNoYXIgKm1hbmdsZWQsCi0JCQkgICAgc3RyaW5nICpyZXN1bHQsIGludCBpc2Z1bmNuYW1lLCBpbnQgYXBwZW5kKTsKLQotREVTQ1JJUFRJT04KLQotCURlbWFuZ2xlIGEgcXVhbGlmaWVkIG5hbWUsIHN1Y2ggYXMgIlEyNU91dGVyNUlubmVyIiB3aGljaCBpcwotCXRoZSBtYW5nbGVkIGZvcm0gb2YgIk91dGVyOjpJbm5lciIuICBUaGUgZGVtYW5nbGVkIG91dHB1dCBpcwotCXByZXBlbmRlZCBvciBhcHBlbmRlZCB0byB0aGUgcmVzdWx0IHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlCi0Jc3RhdGUgb2YgdGhlIGFwcGVuZCBmbGFnLgotCi0JSWYgaXNmdW5jbmFtZSBpcyBub256ZXJvLCB0aGVuIHRoZSBxdWFsaWZpZWQgbmFtZSB3ZSBhcmUgYnVpbGRpbmcKLQlpcyBnb2luZyB0byBiZSB1c2VkIGFzIGEgbWVtYmVyIGZ1bmN0aW9uIG5hbWUsIHNvIGlmIGl0IGlzIGEKLQljb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIGZ1bmN0aW9uLCBhcHBlbmQgYW4gYXBwcm9wcmlhdGUKLQljb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yIG5hbWUuICBJLkUuIGZvciB0aGUgYWJvdmUgZXhhbXBsZSwKLQl0aGUgcmVzdWx0IGZvciB1c2UgYXMgYSBjb25zdHJ1Y3RvciBpcyAiT3V0ZXI6OklubmVyOjpJbm5lciIKLQlhbmQgdGhlIHJlc3VsdCBmb3IgdXNlIGFzIGEgZGVzdHJ1Y3RvciBpcyAiT3V0ZXI6OklubmVyOjp+SW5uZXIiLgotCi1CVUdTCi0KLQlOdW1lcmljIGNvbnZlcnNpb24gaXMgQVNDSUkgZGVwZW5kZW50IChGSVhNRSkuCi0KLSAqLwotCi1zdGF0aWMgaW50Ci1kZW1hbmdsZV9xdWFsaWZpZWQgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCwgaXNmdW5jbmFtZSwgYXBwZW5kKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotICAgICBpbnQgaXNmdW5jbmFtZTsKLSAgICAgaW50IGFwcGVuZDsKLXsKLSAgaW50IHF1YWxpZmllcnMgPSAwOwotICBpbnQgc3VjY2VzcyA9IDE7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0gIGNoYXIgbnVtWzJdOwotICBzdHJpbmcgdGVtcDsKLSAgc3RyaW5nIGxhc3RfbmFtZTsKLSAgaW50IGJpbmRleCA9IHJlZ2lzdGVyX0J0eXBlICh3b3JrKTsKLQotICAvKiBXZSBvbmx5IG1ha2UgdXNlIG9mIElTRlVOQ05BTUUgaWYgdGhlIGVudGl0eSBpcyBhIGNvbnN0cnVjdG9yIG9yCi0gICAgIGRlc3RydWN0b3IuICAqLwotICBpc2Z1bmNuYW1lID0gKGlzZnVuY25hbWUKLQkJJiYgKCh3b3JrLT5jb25zdHJ1Y3RvciAmIDEpIHx8ICh3b3JrLT5kZXN0cnVjdG9yICYgMSkpKTsKLQotICBzdHJpbmdfaW5pdCAoJnRlbXApOwotICBzdHJpbmdfaW5pdCAoJmxhc3RfbmFtZSk7Ci0KLSAgaWYgKCgqbWFuZ2xlZClbMF0gPT0gJ0snKQotICAgIHsKLSAgICAvKiBTcXVhbmdsaW5nIHF1YWxpZmllZCBuYW1lIHJldXNlICovCi0gICAgICBpbnQgaWR4OwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgIGlmIChpZHggPT0gLTEgfHwgaWR4ID49IHdvcmsgLT4gbnVtaykKLSAgICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0gICAgICAgIHN0cmluZ19hcHBlbmQgKCZ0ZW1wLCB3b3JrIC0+IGt0eXBldmVjW2lkeF0pOwotICAgIH0KLSAgZWxzZQotICAgIHN3aXRjaCAoKCptYW5nbGVkKVsxXSkKLSAgICB7Ci0gICAgY2FzZSAnXyc6Ci0gICAgICAvKiBHTlUgbWFuZ2xlZCBuYW1lIHdpdGggbW9yZSB0aGFuIDkgY2xhc3Nlcy4gIFRoZSBjb3VudCBpcyBwcmVjZWRlZAotCSBieSBhbiB1bmRlcnNjb3JlICh0byBkaXN0aW5ndWlzaCBpdCBmcm9tIHRoZSA8PSA5IGNhc2UpIGFuZCBmb2xsb3dlZAotCSBieSBhbiB1bmRlcnNjb3JlLiAgKi8KLSAgICAgIHAgPSAqbWFuZ2xlZCArIDI7Ci0gICAgICBxdWFsaWZpZXJzID0gYXRvaSAocCk7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSpwKSB8fCAqcCA9PSAnMCcpCi0Jc3VjY2VzcyA9IDA7Ci0KLSAgICAgIC8qIFNraXAgdGhlIGRpZ2l0cy4gICovCi0gICAgICB3aGlsZSAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKnApKQotCSsrcDsKLQotICAgICAgaWYgKCpwICE9ICdfJykKLQlzdWNjZXNzID0gMDsKLQotICAgICAgKm1hbmdsZWQgPSBwICsgMTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnMSc6Ci0gICAgY2FzZSAnMic6Ci0gICAgY2FzZSAnMyc6Ci0gICAgY2FzZSAnNCc6Ci0gICAgY2FzZSAnNSc6Ci0gICAgY2FzZSAnNic6Ci0gICAgY2FzZSAnNyc6Ci0gICAgY2FzZSAnOCc6Ci0gICAgY2FzZSAnOSc6Ci0gICAgICAvKiBUaGUgY291bnQgaXMgaW4gYSBzaW5nbGUgZGlnaXQuICAqLwotICAgICAgbnVtWzBdID0gKCptYW5nbGVkKVsxXTsKLSAgICAgIG51bVsxXSA9ICdcMCc7Ci0gICAgICBxdWFsaWZpZXJzID0gYXRvaSAobnVtKTsKLQotICAgICAgLyogSWYgdGhlcmUgaXMgYW4gdW5kZXJzY29yZSBhZnRlciB0aGUgZGlnaXQsIHNraXAgaXQuICBUaGlzIGlzCi0JIHNhaWQgdG8gYmUgZm9yIEFSTS1xdWFsaWZpZWQgbmFtZXMsIGJ1dCB0aGUgQVJNIG1ha2VzIG5vCi0JIG1lbnRpb24gb2Ygc3VjaCBhbiB1bmRlcnNjb3JlLiAgUGVyaGFwcyBjZnJvbnQgdXNlcyBvbmUuICAqLwotICAgICAgaWYgKCgqbWFuZ2xlZClbMl0gPT0gJ18nKQotCXsKLQkgICgqbWFuZ2xlZCkrKzsKLQl9Ci0gICAgICAoKm1hbmdsZWQpICs9IDI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgIGRlZmF1bHQ6Ci0gICAgICBzdWNjZXNzID0gMDsKLSAgICB9Ci0KLSAgaWYgKCFzdWNjZXNzKQotICAgIHJldHVybiBzdWNjZXNzOwotCi0gIC8qIFBpY2sgb2ZmIHRoZSBuYW1lcyBhbmQgY29sbGVjdCB0aGVtIGluIHRoZSB0ZW1wIGJ1ZmZlciBpbiB0aGUgb3JkZXIKLSAgICAgaW4gd2hpY2ggdGhleSBhcmUgZm91bmQsIHNlcGFyYXRlZCBieSAnOjonLiAgKi8KLQotICB3aGlsZSAocXVhbGlmaWVycy0tID4gMCkKLSAgICB7Ci0gICAgICBpbnQgcmVtZW1iZXJfSyA9IDE7Ci0gICAgICBzdHJpbmdfY2xlYXIgKCZsYXN0X25hbWUpOwotCi0gICAgICBpZiAoKm1hbmdsZWRbMF0gPT0gJ18nKQotCSgqbWFuZ2xlZCkrKzsKLQotICAgICAgaWYgKCptYW5nbGVkWzBdID09ICd0JykKLQl7Ci0JICAvKiBIZXJlIHdlIGFsd2F5cyBhcHBlbmQgdG8gVEVNUCBzaW5jZSB3ZSB3aWxsIHdhbnQgdG8gdXNlCi0JICAgICB0aGUgdGVtcGxhdGUgbmFtZSB3aXRob3V0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFzIGEKLQkgICAgIGNvbnN0cnVjdG9yIG9yIGRlc3RydWN0b3IgbmFtZS4gIFRoZSBhcHByb3ByaWF0ZQotCSAgICAgKHBhcmFtZXRlci1sZXNzKSB2YWx1ZSBpcyByZXR1cm5lZCBieSBkZW1hbmdsZV90ZW1wbGF0ZQotCSAgICAgaW4gTEFTVF9OQU1FLiAgV2UgZG8gbm90IHJlbWVtYmVyIHRoZSB0ZW1wbGF0ZSB0eXBlIGhlcmUsCi0JICAgICBpbiBvcmRlciB0byBtYXRjaCB0aGUgRysrIG1hbmdsaW5nIGFsZ29yaXRobS4gICovCi0JICBzdWNjZXNzID0gZGVtYW5nbGVfdGVtcGxhdGUod29yaywgbWFuZ2xlZCwgJnRlbXAsCi0JCQkJICAgICAgJmxhc3RfbmFtZSwgMSwgMCk7Ci0JICBpZiAoIXN1Y2Nlc3MpCi0JICAgIGJyZWFrOwotCX0KLSAgICAgIGVsc2UgaWYgKCptYW5nbGVkWzBdID09ICdLJykKLQl7Ci0gICAgICAgICAgaW50IGlkeDsKLSAgICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgICAgaWR4ID0gY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKTsKLSAgICAgICAgICBpZiAoaWR4ID09IC0xIHx8IGlkeCA+PSB3b3JrLT5udW1rKQotICAgICAgICAgICAgc3VjY2VzcyA9IDA7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyaW5nX2FwcGVuZCAoJnRlbXAsIHdvcmstPmt0eXBldmVjW2lkeF0pOwotICAgICAgICAgIHJlbWVtYmVyX0sgPSAwOwotCi0JICBpZiAoIXN1Y2Nlc3MpIGJyZWFrOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAoRURHX0RFTUFOR0xJTkcpCi0gICAgICAgICAgICB7Ci0JICAgICAgaW50IG5hbWVsZW5ndGg7Ci0gCSAgICAgIC8qIE5vdyByZWN1cnNpdmVseSBkZW1hbmdsZSB0aGUgcXVhbGlmaWVyCi0gCSAgICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGRlYWwgd2l0aCB0ZW1wbGF0ZXMgaW4KLSAJICAgICAgICogbWFuZ2xpbmcgc3R5bGVzIGxpa2UgRURHICovCi0JICAgICAgbmFtZWxlbmd0aCA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCSAgICAgIGlmIChuYW1lbGVuZ3RoID09IC0xKQotCQl7Ci0JCSAgc3VjY2VzcyA9IDA7Ci0JCSAgYnJlYWs7Ci0JCX0KLSAJICAgICAgcmVjdXJzaXZlbHlfZGVtYW5nbGUod29yaywgbWFuZ2xlZCwgJnRlbXAsIG5hbWVsZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3VjY2VzcyA9IGRvX3R5cGUgKHdvcmssIG1hbmdsZWQsICZsYXN0X25hbWUpOwotICAgICAgICAgICAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIHN0cmluZ19hcHBlbmRzICgmdGVtcCwgJmxhc3RfbmFtZSk7Ci0gICAgICAgICAgICB9Ci0JfQotCi0gICAgICBpZiAocmVtZW1iZXJfSykKLQlyZW1lbWJlcl9LdHlwZSAod29yaywgdGVtcC5iLCBMRU5fU1RSSU5HICgmdGVtcCkpOwotCi0gICAgICBpZiAocXVhbGlmaWVycyA+IDApCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgIH0KLQotICByZW1lbWJlcl9CdHlwZSAod29yaywgdGVtcC5iLCBMRU5fU1RSSU5HICgmdGVtcCksIGJpbmRleCk7Ci0KLSAgLyogSWYgd2UgYXJlIHVzaW5nIHRoZSByZXN1bHQgYXMgYSBmdW5jdGlvbiBuYW1lLCB3ZSBuZWVkIHRvIGFwcGVuZAotICAgICB0aGUgYXBwcm9wcmlhdGUgJzo6JyBzZXBhcmF0ZWQgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBuYW1lLgotICAgICBXZSBkbyB0aGlzIGhlcmUgYmVjYXVzZSB0aGlzIGlzIHRoZSBtb3N0IGNvbnZlbmllbnQgcGxhY2UsIHdoZXJlCi0gICAgIHdlIGFscmVhZHkgaGF2ZSBhIHBvaW50ZXIgdG8gdGhlIG5hbWUgYW5kIHRoZSBsZW5ndGggb2YgdGhlIG5hbWUuICAqLwotCi0gIGlmIChpc2Z1bmNuYW1lKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKCZ0ZW1wLCBTQ09QRV9TVFJJTkcgKHdvcmspKTsKLSAgICAgIGlmICh3b3JrIC0+IGRlc3RydWN0b3IgJiAxKQotCXN0cmluZ19hcHBlbmQgKCZ0ZW1wLCAifiIpOwotICAgICAgc3RyaW5nX2FwcGVuZHMgKCZ0ZW1wLCAmbGFzdF9uYW1lKTsKLSAgICB9Ci0KLSAgLyogTm93IGVpdGhlciBwcmVwZW5kIHRoZSB0ZW1wIGJ1ZmZlciB0byB0aGUgcmVzdWx0LCBvciBhcHBlbmQgaXQsCi0gICAgIGRlcGVuZGluZyB1cG9uIHRoZSBzdGF0ZSBvZiB0aGUgYXBwZW5kIGZsYWcuICAqLwotCi0gIGlmIChhcHBlbmQpCi0gICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJnRlbXApOwotICBlbHNlCi0gICAgewotICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKHJlc3VsdCkpCi0Jc3RyaW5nX2FwcGVuZCAoJnRlbXAsIFNDT1BFX1NUUklORyAod29yaykpOwotICAgICAgc3RyaW5nX3ByZXBlbmRzIChyZXN1bHQsICZ0ZW1wKTsKLSAgICB9Ci0KLSAgc3RyaW5nX2RlbGV0ZSAoJmxhc3RfbmFtZSk7Ci0gIHN0cmluZ19kZWxldGUgKCZ0ZW1wKTsKLSAgcmV0dXJuIChzdWNjZXNzKTsKLX0KLQotLyoKLQotTE9DQUwgRlVOQ1RJT04KLQotCWdldF9jb3VudCAtLSBjb252ZXJ0IGFuIGFzY2lpIGNvdW50IHRvIGludGVnZXIsIGNvbnN1bWluZyB0b2tlbnMKLQotU1lOT1BTSVMKLQotCXN0YXRpYyBpbnQKLQlnZXRfY291bnQgKGNvbnN0IGNoYXIgKip0eXBlLCBpbnQgKmNvdW50KQotCi1ERVNDUklQVElPTgotCi0JQXNzdW1lIHRoYXQgKnR5cGUgcG9pbnRzIGF0IGEgY291bnQgaW4gYSBtYW5nbGVkIG5hbWU7IHNldAotCSpjb3VudCB0byBpdHMgdmFsdWUsIGFuZCBzZXQgKnR5cGUgdG8gdGhlIG5leHQgY2hhcmFjdGVyIGFmdGVyCi0JdGhlIGNvdW50LiAgVGhlcmUgYXJlIHNvbWUgd2VpcmQgcnVsZXMgaW4gZWZmZWN0IGhlcmUuCi0KLQlJZiAqdHlwZSBkb2VzIG5vdCBwb2ludCBhdCBhIHN0cmluZyBvZiBkaWdpdHMsIHJldHVybiB6ZXJvLgotCi0JSWYgKnR5cGUgcG9pbnRzIGF0IGEgc3RyaW5nIG9mIGRpZ2l0cyBmb2xsb3dlZCBieSBhbgotCXVuZGVyc2NvcmUsIHNldCAqY291bnQgdG8gdGhlaXIgdmFsdWUgYXMgYW4gaW50ZWdlciwgYWR2YW5jZQotCSp0eXBlIHRvIHBvaW50ICphZnRlciB0aGUgdW5kZXJzY29yZSwgYW5kIHJldHVybiAxLgotCi0JSWYgKnR5cGUgcG9pbnRzIGF0IGEgc3RyaW5nIG9mIGRpZ2l0cyBub3QgZm9sbG93ZWQgYnkgYW4KLQl1bmRlcnNjb3JlLCBjb25zdW1lIG9ubHkgdGhlIGZpcnN0IGRpZ2l0LiAgU2V0ICpjb3VudCB0byBpdHMKLQl2YWx1ZSBhcyBhbiBpbnRlZ2VyLCBsZWF2ZSAqdHlwZSBwb2ludGluZyBhZnRlciB0aGF0IGRpZ2l0LAotCWFuZCByZXR1cm4gMS4KLQotICAgICAgICBUaGUgZXhjdXNlIGZvciB0aGlzIG9kZCBiZWhhdmlvcjogaW4gdGhlIEFSTSBhbmQgSFAgZGVtYW5nbGluZwotICAgICAgICBzdHlsZXMsIGEgdHlwZSBjYW4gYmUgZm9sbG93ZWQgYnkgYSByZXBlYXQgY291bnQgb2YgdGhlIGZvcm0KLSAgICAgICAgYE54eScsIHdoZXJlOgotCi0gICAgICAgIGB4JyBpcyBhIHNpbmdsZSBkaWdpdCBzcGVjaWZ5aW5nIGhvdyBtYW55IGFkZGl0aW9uYWwgY29waWVzCi0gICAgICAgICAgICBvZiB0aGUgdHlwZSB0byBhcHBlbmQgdG8gdGhlIGFyZ3VtZW50IGxpc3QsIGFuZAotCi0gICAgICAgIGB5JyBpcyBvbmUgb3IgbW9yZSBkaWdpdHMsIHNwZWNpZnlpbmcgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YKLSAgICAgICAgICAgIHRoZSBmaXJzdCByZXBlYXRlZCBhcmd1bWVudCBpbiB0aGUgbGlzdC4gIFllcywgYXMgeW91J3JlCi0gICAgICAgICAgICB1bm1hbmdsaW5nIHRoZSBuYW1lIHlvdSBjYW4gZmlndXJlIHRoaXMgb3V0IHlvdXJzZWxmLCBidXQKLSAgICAgICAgICAgIGl0J3MgdGhlcmUgYW55d2F5LgotCi0gICAgICAgIFNvLCBmb3IgZXhhbXBsZSwgaW4gYGJhcl9fM2Zvb0ZQaU41MScsIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBhCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gaW50ZWdlciAoYFBpJyksIGFuZCB0aGVuIHRoZSBuZXh0IGZpdmUgYXJndW1lbnRzCi0gICAgICAgIGFyZSB0aGUgc2FtZSAoYE41JyksIGFuZCB0aGUgZmlyc3QgcmVwZWF0IGlzIHRoZSBmdW5jdGlvbidzCi0gICAgICAgIHNlY29uZCBhcmd1bWVudCAoYDEnKS4KLSovCi0KLXN0YXRpYyBpbnQKLWdldF9jb3VudCAodHlwZSwgY291bnQpCi0gICAgIGNvbnN0IGNoYXIgKip0eXBlOwotICAgICBpbnQgKmNvdW50OwotewotICBjb25zdCBjaGFyICpwOwotICBpbnQgbjsKLQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqdHlwZSkpCi0gICAgewotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAqY291bnQgPSAqKnR5cGUgLSAnMCc7Ci0gICAgICAoKnR5cGUpKys7Ci0gICAgICBpZiAoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKip0eXBlKSkKLQl7Ci0JICBwID0gKnR5cGU7Ci0JICBuID0gKmNvdW50OwotCSAgZG8KLQkgICAgewotCSAgICAgIG4gKj0gMTA7Ci0JICAgICAgbiArPSAqcCAtICcwJzsKLQkgICAgICBwKys7Ci0JICAgIH0KLQkgIHdoaWxlIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqcCkpOwotCSAgaWYgKCpwID09ICdfJykKLQkgICAgewotCSAgICAgICp0eXBlID0gcCArIDE7Ci0JICAgICAgKmNvdW50ID0gbjsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAoMSk7Ci19Ci0KLS8qIFJFU1VMVCB3aWxsIGJlIGluaXRpYWxpc2VkIGhlcmU7IGl0IHdpbGwgYmUgZnJlZWQgb24gZmFpbHVyZS4gIFRoZQotICAgdmFsdWUgcmV0dXJuZWQgaXMgcmVhbGx5IGEgdHlwZV9raW5kX3QuICAqLwotCi1zdGF0aWMgaW50Ci1kb190eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIGludCBuOwotICBpbnQgZG9uZTsKLSAgaW50IHN1Y2Nlc3M7Ci0gIHN0cmluZyBkZWNsOwotICBjb25zdCBjaGFyICpyZW1lbWJlcmVkX3R5cGU7Ci0gIGludCB0eXBlX3F1YWxzOwotICBzdHJpbmcgYnR5cGU7Ci0gIHR5cGVfa2luZF90IHRrID0gdGtfbm9uZTsKLQotICBzdHJpbmdfaW5pdCAoJmJ0eXBlKTsKLSAgc3RyaW5nX2luaXQgKCZkZWNsKTsKLSAgc3RyaW5nX2luaXQgKHJlc3VsdCk7Ci0KLSAgZG9uZSA9IDA7Ci0gIHN1Y2Nlc3MgPSAxOwotICB3aGlsZSAoc3VjY2VzcyAmJiAhZG9uZSkKLSAgICB7Ci0gICAgICBpbnQgbWVtYmVyOwotICAgICAgc3dpdGNoICgqKm1hbmdsZWQpCi0JewotCi0JICAvKiBBIHBvaW50ZXIgdHlwZSAqLwotCWNhc2UgJ1AnOgotCWNhc2UgJ3AnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgaWYgKCEgKHdvcmsgLT4gb3B0aW9ucyAmIERNR0xfSkFWQSkpCi0JICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIioiKTsKLQkgIGlmICh0ayA9PSB0a19ub25lKQotCSAgICB0ayA9IHRrX3BvaW50ZXI7Ci0JICBicmVhazsKLQotCSAgLyogQSByZWZlcmVuY2UgdHlwZSAqLwotCWNhc2UgJ1InOgotCSAgKCptYW5nbGVkKSsrOwotCSAgc3RyaW5nX3ByZXBlbmQgKCZkZWNsLCAiJiIpOwotCSAgaWYgKHRrID09IHRrX25vbmUpCi0JICAgIHRrID0gdGtfcmVmZXJlbmNlOwotCSAgYnJlYWs7Ci0KLQkgIC8qIEFuIGFycmF5ICovCi0JY2FzZSAnQSc6Ci0JICB7Ci0JICAgICsrKCptYW5nbGVkKTsKLQkgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKQotCQkmJiAoZGVjbC5iWzBdID09ICcqJyB8fCBkZWNsLmJbMF0gPT0gJyYnKSkKLQkgICAgICB7Ci0JCXN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKLQkJc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7Ci0JICAgICAgfQotCSAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIlsiKTsKLQkgICAgaWYgKCoqbWFuZ2xlZCAhPSAnXycpCi0JICAgICAgc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlX3ZhbHVlX3Bhcm0gKHdvcmssIG1hbmdsZWQsICZkZWNsLAotCQkJCQkJICAgICAgdGtfaW50ZWdyYWwpOwotCSAgICBpZiAoKiptYW5nbGVkID09ICdfJykKLQkgICAgICArKygqbWFuZ2xlZCk7Ci0JICAgIHN0cmluZ19hcHBlbmQgKCZkZWNsLCAiXSIpOwotCSAgICBicmVhazsKLQkgIH0KLQotCS8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IHNlZW4gdHlwZSAqLwotCWNhc2UgJ1QnOgotCSAgKCptYW5nbGVkKSsrOwotCSAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZuKSB8fCBuID49IHdvcmsgLT4gbnR5cGVzKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHJlbWVtYmVyZWRfdHlwZSA9IHdvcmsgLT4gdHlwZXZlY1tuXTsKLQkgICAgICBtYW5nbGVkID0gJnJlbWVtYmVyZWRfdHlwZTsKLQkgICAgfQotCSAgYnJlYWs7Ci0KLQkgIC8qIEEgZnVuY3Rpb24gKi8KLQljYXNlICdGJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKQotCQkmJiAoZGVjbC5iWzBdID09ICcqJyB8fCBkZWNsLmJbMF0gPT0gJyYnKSkKLQkgICAgewotCSAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgIigiKTsKLQkgICAgICBzdHJpbmdfYXBwZW5kICgmZGVjbCwgIikiKTsKLQkgICAgfQotCSAgLyogQWZ0ZXIgcGlja2luZyBvZmYgdGhlIGZ1bmN0aW9uIGFyZ3MsIHdlIGV4cGVjdCB0byBlaXRoZXIgZmluZCB0aGUKLQkgICAgIGZ1bmN0aW9uIHJldHVybiB0eXBlIChwcmVjZWRlZCBieSBhbiAnXycpIG9yIHRoZSBlbmQgb2YgdGhlCi0JICAgICBzdHJpbmcuICAqLwotCSAgaWYgKCFkZW1hbmdsZV9uZXN0ZWRfYXJncyAod29yaywgbWFuZ2xlZCwgJmRlY2wpCi0JICAgICAgfHwgKCoqbWFuZ2xlZCAhPSAnXycgJiYgKiptYW5nbGVkICE9ICdcMCcpKQotCSAgICB7Ci0JICAgICAgc3VjY2VzcyA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGlmIChzdWNjZXNzICYmICgqKm1hbmdsZWQgPT0gJ18nKSkKLQkgICAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0KLQljYXNlICdNJzoKLQljYXNlICdPJzoKLQkgIHsKLQkgICAgdHlwZV9xdWFscyA9IFRZUEVfVU5RVUFMSUZJRUQ7Ci0KLQkgICAgbWVtYmVyID0gKiptYW5nbGVkID09ICdNJzsKLQkgICAgKCptYW5nbGVkKSsrOwotCSAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkgJiYgKiptYW5nbGVkICE9ICd0JykKLQkgICAgICB7Ci0JCXN1Y2Nlc3MgPSAwOwotCQlicmVhazsKLQkgICAgICB9Ci0KLQkgICAgc3RyaW5nX2FwcGVuZCAoJmRlY2wsICIpIik7Ci0JICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgU0NPUEVfU1RSSU5HICh3b3JrKSk7Ci0JICAgIGlmIChpc2RpZ2l0ICgodW5zaWduZWQgY2hhcikqKm1hbmdsZWQpKQotCSAgICAgIHsKLQkJbiA9IGNvbnN1bWVfY291bnQgKG1hbmdsZWQpOwotCQlpZiAobiA9PSAtMQotCQkgICAgfHwgKGludCkgc3RybGVuICgqbWFuZ2xlZCkgPCBuKQotCQkgIHsKLQkJICAgIHN1Y2Nlc3MgPSAwOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCQlzdHJpbmdfcHJlcGVuZG4gKCZkZWNsLCAqbWFuZ2xlZCwgbik7Ci0JCSptYW5nbGVkICs9IG47Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlzdHJpbmcgdGVtcDsKLQkJc3RyaW5nX2luaXQgKCZ0ZW1wKTsKLQkJc3VjY2VzcyA9IGRlbWFuZ2xlX3RlbXBsYXRlICh3b3JrLCBtYW5nbGVkLCAmdGVtcCwKLQkJCQkJICAgICBOVUxMLCAxLCAxKTsKLQkJaWYgKHN1Y2Nlc3MpCi0JCSAgewotCQkgICAgc3RyaW5nX3ByZXBlbmRuICgmZGVjbCwgdGVtcC5iLCB0ZW1wLnAgLSB0ZW1wLmIpOwotCQkgICAgc3RyaW5nX2NsZWFyICgmdGVtcCk7Ci0JCSAgfQotCQllbHNlCi0JCSAgYnJlYWs7Ci0JICAgICAgfQotCSAgICBzdHJpbmdfcHJlcGVuZCAoJmRlY2wsICIoIik7Ci0JICAgIGlmIChtZW1iZXIpCi0JICAgICAgewotCQlzd2l0Y2ggKCoqbWFuZ2xlZCkKLQkJICB7Ci0JCSAgY2FzZSAnQyc6Ci0JCSAgY2FzZSAnVic6Ci0JCSAgY2FzZSAndSc6Ci0JCSAgICB0eXBlX3F1YWxzIHw9IGNvZGVfZm9yX3F1YWxpZmllciAoKiptYW5nbGVkKTsKLQkJICAgICgqbWFuZ2xlZCkrKzsKLQkJICAgIGJyZWFrOwotCi0JCSAgZGVmYXVsdDoKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQlpZiAoKigqbWFuZ2xlZCkrKyAhPSAnRicpCi0JCSAgewotCQkgICAgc3VjY2VzcyA9IDA7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JICAgICAgfQotCSAgICBpZiAoKG1lbWJlciAmJiAhZGVtYW5nbGVfbmVzdGVkX2FyZ3MgKHdvcmssIG1hbmdsZWQsICZkZWNsKSkKLQkJfHwgKiptYW5nbGVkICE9ICdfJykKLQkgICAgICB7Ci0JCXN1Y2Nlc3MgPSAwOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgICgqbWFuZ2xlZCkrKzsKLQkgICAgaWYgKCEgUFJJTlRfQU5TSV9RVUFMSUZJRVJTKQotCSAgICAgIHsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAodHlwZV9xdWFscyAhPSBUWVBFX1VOUVVBTElGSUVEKQotCSAgICAgIHsKLQkJQVBQRU5EX0JMQU5LICgmZGVjbCk7Ci0JCXN0cmluZ19hcHBlbmQgKCZkZWNsLCBxdWFsaWZpZXJfc3RyaW5nICh0eXBlX3F1YWxzKSk7Ci0JICAgICAgfQotCSAgICBicmVhazsKLQkgIH0KLSAgICAgICAgY2FzZSAnRyc6Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQotCWNhc2UgJ0MnOgotCWNhc2UgJ1YnOgotCWNhc2UgJ3UnOgotCSAgaWYgKFBSSU5UX0FOU0lfUVVBTElGSUVSUykKLQkgICAgewotCSAgICAgIGlmICghU1RSSU5HX0VNUFRZICgmZGVjbCkpCi0JCXN0cmluZ19wcmVwZW5kICgmZGVjbCwgIiAiKTsKLQotCSAgICAgIHN0cmluZ19wcmVwZW5kICgmZGVjbCwgZGVtYW5nbGVfcXVhbGlmaWVyICgqKm1hbmdsZWQpKTsKLQkgICAgfQotCSAgKCptYW5nbGVkKSsrOwotCSAgYnJlYWs7Ci0JICAvKgotCSAgICB9Ci0JICAgICovCi0KLQkgIC8qIGZhbGwgdGhyb3VnaCAqLwotCWRlZmF1bHQ6Ci0JICBkb25lID0gMTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKHN1Y2Nlc3MpIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICAgIC8qIEEgcXVhbGlmaWVkIG5hbWUsIHN1Y2ggYXMgIk91dGVyOjpJbm5lciIuICAqLwotICAgIGNhc2UgJ1EnOgotICAgIGNhc2UgJ0snOgotICAgICAgewotICAgICAgICBzdWNjZXNzID0gZGVtYW5nbGVfcXVhbGlmaWVkICh3b3JrLCBtYW5nbGVkLCByZXN1bHQsIDAsIDEpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIC8qIEEgYmFjayByZWZlcmVuY2UgdG8gYSBwcmV2aW91c2x5IHNlZW4gc3F1YW5nbGVkIHR5cGUgKi8KLSAgICBjYXNlICdCJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIGlmICghZ2V0X2NvdW50IChtYW5nbGVkLCAmbikgfHwgbiA+PSB3b3JrIC0+IG51bWIpCi0Jc3VjY2VzcyA9IDA7Ci0gICAgICBlbHNlCi0Jc3RyaW5nX2FwcGVuZCAocmVzdWx0LCB3b3JrLT5idHlwZXZlY1tuXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1gnOgotICAgIGNhc2UgJ1knOgotICAgICAgLyogQSB0ZW1wbGF0ZSBwYXJtLiAgV2Ugc3Vic3RpdHV0ZSB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudC4gKi8KLSAgICAgIHsKLQlpbnQgaWR4OwotCi0JKCptYW5nbGVkKSsrOwotCWlkeCA9IGNvbnN1bWVfY291bnRfd2l0aF91bmRlcnNjb3JlcyAobWFuZ2xlZCk7Ci0KLQlpZiAoaWR4ID09IC0xCi0JICAgIHx8ICh3b3JrLT50bXBsX2FyZ3ZlYyAmJiBpZHggPj0gd29yay0+bnRtcGxfYXJncykKLQkgICAgfHwgY29uc3VtZV9jb3VudF93aXRoX3VuZGVyc2NvcmVzIChtYW5nbGVkKSA9PSAtMSkKLQkgIHsKLQkgICAgc3VjY2VzcyA9IDA7Ci0JICAgIGJyZWFrOwotCSAgfQotCi0JaWYgKHdvcmstPnRtcGxfYXJndmVjKQotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCB3b3JrLT50bXBsX2FyZ3ZlY1tpZHhdKTsKLQllbHNlCi0JICB7Ci0JICAgIGNoYXIgYnVmWzEwXTsKLQkgICAgc3ByaW50ZihidWYsICJUJWQiLCBpZHgpOwotCSAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGJ1Zik7Ci0JICB9Ci0KLQlzdWNjZXNzID0gMTsKLSAgICAgIH0KLSAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBzdWNjZXNzID0gZGVtYW5nbGVfZnVuZF90eXBlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpOwotICAgICAgaWYgKHRrID09IHRrX25vbmUpCi0JdGsgPSAodHlwZV9raW5kX3QpIHN1Y2Nlc3M7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgaWYgKHN1Y2Nlc3MpCi0gICAgewotICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKCZkZWNsKSkKLQl7Ci0JICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICIgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmZGVjbCk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHN0cmluZ19kZWxldGUgKHJlc3VsdCk7Ci0gIHN0cmluZ19kZWxldGUgKCZkZWNsKTsKLQotICBpZiAoc3VjY2VzcykKLSAgICAvKiBBc3N1bWUgYW4gaW50ZWdyYWwgdHlwZSwgaWYgd2UncmUgbm90IHN1cmUuICAqLwotICAgIHJldHVybiAoaW50KSAoKHRrID09IHRrX25vbmUpID8gdGtfaW50ZWdyYWwgOiB0ayk7Ci0gIGVsc2UKLSAgICByZXR1cm4gMDsKLX0KLQotLyogR2l2ZW4gYSBwb2ludGVyIHRvIGEgdHlwZSBzdHJpbmcgdGhhdCByZXByZXNlbnRzIGEgZnVuZGFtZW50YWwgdHlwZQotICAgYXJndW1lbnQgKGludCwgbG9uZywgdW5zaWduZWQgaW50LCBldGMpIGluIFRZUEUsIGEgcG9pbnRlciB0byB0aGUKLSAgIHN0cmluZyBpbiB3aGljaCB0aGUgZGVtYW5nbGVkIG91dHB1dCBpcyBiZWluZyBidWlsdCBpbiBSRVNVTFQsIGFuZAotICAgdGhlIFdPUksgc3RydWN0dXJlLCBkZWNvZGUgdGhlIHR5cGVzIGFuZCBhZGQgdGhlbSB0byB0aGUgcmVzdWx0LgotCi0gICBGb3IgZXhhbXBsZToKLQotICAgCSJDaSIJPT4JImNvbnN0IGludCIKLQkiU2wiCT0+CSJzaWduZWQgbG9uZyIKLQkiQ1VzIgk9PgkiY29uc3QgdW5zaWduZWQgc2hvcnQiCi0KLSAgIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyByZWFsbHkgYSB0eXBlX2tpbmRfdC4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX2Z1bmRfdHlwZSAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICBpbnQgZG9uZSA9IDA7Ci0gIGludCBzdWNjZXNzID0gMTsKLSAgY2hhciBidWZbMTBdOwotICBpbnQgZGVjID0gMDsKLSAgc3RyaW5nIGJ0eXBlOwotICB0eXBlX2tpbmRfdCB0ayA9IHRrX2ludGVncmFsOwotCi0gIHN0cmluZ19pbml0ICgmYnR5cGUpOwotCi0gIC8qIEZpcnN0IHBpY2sgb2ZmIGFueSB0eXBlIHF1YWxpZmllcnMuICBUaGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZS4gICovCi0KLSAgd2hpbGUgKCFkb25lKQotICAgIHsKLSAgICAgIHN3aXRjaCAoKiptYW5nbGVkKQotCXsKLQljYXNlICdDJzoKLQljYXNlICdWJzoKLQljYXNlICd1JzoKLQkgIGlmIChQUklOVF9BTlNJX1FVQUxJRklFUlMpCi0JICAgIHsKLSAgICAgICAgICAgICAgaWYgKCFTVFJJTkdfRU1QVFkgKHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgc3RyaW5nX3ByZXBlbmQgKHJlc3VsdCwgIiAiKTsKLQkgICAgICBzdHJpbmdfcHJlcGVuZCAocmVzdWx0LCBkZW1hbmdsZV9xdWFsaWZpZXIgKCoqbWFuZ2xlZCkpOwotCSAgICB9Ci0JICAoKm1hbmdsZWQpKys7Ci0JICBicmVhazsKLQljYXNlICdVJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInVuc2lnbmVkIik7Ci0JICBicmVhazsKLQljYXNlICdTJzogLyogc2lnbmVkIGNoYXIgb25seSAqLwotCSAgKCptYW5nbGVkKSsrOwotCSAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotCSAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAic2lnbmVkIik7Ci0JICBicmVhazsKLQljYXNlICdKJzoKLQkgICgqbWFuZ2xlZCkrKzsKLQkgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLQkgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIl9fY29tcGxleCIpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGRvbmUgPSAxOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBOb3cgcGljayBvZmYgdGhlIGZ1bmRhbWVudGFsIHR5cGUuICBUaGVyZSBjYW4gYmUgb25seSBvbmUuICAqLwotCi0gIHN3aXRjaCAoKiptYW5nbGVkKQotICAgIHsKLSAgICBjYXNlICdcMCc6Ci0gICAgY2FzZSAnXyc6Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd2JzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInZvaWQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3gnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAibG9uZyBsb25nIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdsJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiaW50Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdzJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgInNob3J0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImJvb2wiKTsKLSAgICAgIHRrID0gdGtfYm9vbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2MnOgotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiY2hhciIpOwotICAgICAgdGsgPSB0a19jaGFyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAndyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJ3Y2hhcl90Iik7Ci0gICAgICB0ayA9IHRrX2NoYXI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdyJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImxvbmcgZG91YmxlIik7Ci0gICAgICB0ayA9IHRrX3JlYWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdkJzoKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgImRvdWJsZSIpOwotICAgICAgdGsgPSB0a19yZWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnZic6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBBUFBFTkRfQkxBTksgKHJlc3VsdCk7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsICJmbG9hdCIpOwotICAgICAgdGsgPSB0a19yZWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnRyc6Ci0gICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0JewotCSAgc3VjY2VzcyA9IDA7Ci0JICBicmVhazsKLQl9Ci0gICAgY2FzZSAnSSc6Ci0gICAgICArKygqbWFuZ2xlZCk7Ci0gICAgICBpZiAoKiptYW5nbGVkID09ICdfJykKLQl7Ci0JICBpbnQgaTsKLQkgICsrKCptYW5nbGVkKTsKLQkgIGZvciAoaSA9IDA7Ci0JICAgICAgIChpIDwgc2l6ZW9mIChidWYpIC0gMSAmJiAqKm1hbmdsZWQgJiYgKiptYW5nbGVkICE9ICdfJyk7Ci0JICAgICAgICsrKCptYW5nbGVkKSwgKytpKQotCSAgICBidWZbaV0gPSAqKm1hbmdsZWQ7Ci0JICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgewotCSAgICAgIHN1Y2Nlc3MgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBidWZbaV0gPSAnXDAnOwotCSAgKysoKm1hbmdsZWQpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBzdHJuY3B5IChidWYsICptYW5nbGVkLCAyKTsKLQkgIGJ1ZlsyXSA9ICdcMCc7Ci0JICAqbWFuZ2xlZCArPSAyOwotCX0KLSAgICAgIHNzY2FuZiAoYnVmLCAiJXgiLCAmZGVjKTsKLSAgICAgIHNwcmludGYgKGJ1ZiwgImludCVpX3QiLCBkZWMpOwotICAgICAgQVBQRU5EX0JMQU5LIChyZXN1bHQpOwotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCBidWYpOwotICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgLyogQW4gZXhwbGljaXQgdHlwZSwgc3VjaCBhcyAiNm15dHlwZSIgb3IgIjdpbnRlZ2VyIiAqLwotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzcnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJzknOgotICAgICAgewotICAgICAgICBpbnQgYmluZGV4ID0gcmVnaXN0ZXJfQnR5cGUgKHdvcmspOwotICAgICAgICBzdHJpbmcgYnR5cGU7Ci0gICAgICAgIHN0cmluZ19pbml0ICgmYnR5cGUpOwotICAgICAgICBpZiAoZGVtYW5nbGVfY2xhc3NfbmFtZSAod29yaywgbWFuZ2xlZCwgJmJ0eXBlKSkgewotICAgICAgICAgIHJlbWVtYmVyX0J0eXBlICh3b3JrLCBidHlwZS5iLCBMRU5fU1RSSU5HICgmYnR5cGUpLCBiaW5kZXgpOwotICAgICAgICAgIEFQUEVORF9CTEFOSyAocmVzdWx0KTsKLSAgICAgICAgICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCAmYnR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBzdWNjZXNzID0gMDsKLSAgICAgICAgc3RyaW5nX2RlbGV0ZSAoJmJ0eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgY2FzZSAndCc6Ci0gICAgICB7Ci0gICAgICAgIHN1Y2Nlc3MgPSBkZW1hbmdsZV90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgJmJ0eXBlLCAwLCAxLCAxKTsKLSAgICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgJmJ0eXBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN1Y2Nlc3MgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gIHJldHVybiBzdWNjZXNzID8gKChpbnQpIHRrKSA6IDA7Ci19Ci0KLQotLyogSGFuZGxlIGEgdGVtcGxhdGUncyB2YWx1ZSBwYXJhbWV0ZXIgZm9yIEhQIGFDQyAoZXh0ZW5zaW9uIGZyb20gQVJNKQotICAgKiptYW5nbGVkIHBvaW50cyB0byAnUycgb3IgJ1UnICovCi0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2NvbnN0X3ZhbHVlICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpyZXN1bHQ7Ci17Ci0gIGludCB1bnNpZ25lZF9jb25zdDsKLQotICBpZiAoKiptYW5nbGVkICE9ICdVJyAmJiAqKm1hbmdsZWQgIT0gJ1MnKQotICAgIHJldHVybiAwOwotCi0gIHVuc2lnbmVkX2NvbnN0ID0gKCoqbWFuZ2xlZCA9PSAnVScpOwotCi0gICgqbWFuZ2xlZCkrKzsKLQotICBzd2l0Y2ggKCoqbWFuZ2xlZCkKLSAgICB7Ci0gICAgICBjYXNlICdOJzoKLSAgICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiLSIpOwotICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgIGNhc2UgJ1AnOgotICAgICAgICAoKm1hbmdsZWQpKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnTSc6Ci0gICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgLTJeMzEgKi8KLSAgICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCAiLTIxNDc0ODM2NDgiKTsKLSAgICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAvKiBXZSBoYXZlIHRvIGJlIGxvb2tpbmcgYXQgYW4gaW50ZWdlciBub3cgKi8KLSAgaWYgKCEoaXNkaWdpdCAoKHVuc2lnbmVkIGNoYXIpKiptYW5nbGVkKSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgLyogV2Ugb25seSBkZWFsIHdpdGggaW50ZWdyYWwgdmFsdWVzIGZvciB0ZW1wbGF0ZQotICAgICBwYXJhbWV0ZXJzIC0tIHNvIGl0J3MgT0sgdG8gbG9vayBvbmx5IGZvciBkaWdpdHMgKi8KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqbWFuZ2xlZCkpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAqKm1hbmdsZWQ7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChyZXN1bHQsIGNoYXJfc3RyKTsKLSAgICAgICgqbWFuZ2xlZCkrKzsKLSAgICB9Ci0KLSAgaWYgKHVuc2lnbmVkX2NvbnN0KQotICAgIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIlUiKTsKLQotICAvKiBGSVhNRT8gU29tZSBkYXkgd2UgbWF5IGhhdmUgNjQtYml0IChvciBsYXJnZXIgOi0pICkgY29uc3RhbnRzCi0gICAgIHdpdGggTCBvciBMTCBzdWZmaXhlcy4gcGFpLzE5OTctMDktMDMgKi8KLQotICByZXR1cm4gMTsgLyogc3VjY2VzcyAqLwotfQotCi0vKiBIYW5kbGUgYSB0ZW1wbGF0ZSdzIGxpdGVyYWwgcGFyYW1ldGVyIGZvciBIUCBhQ0MgKGV4dGVuc2lvbiBmcm9tIEFSTSkKLSAgICoqbWFuZ2xlZCBpcyBwb2ludGluZyB0byB0aGUgJ0EnICovCi0KLXN0YXRpYyBpbnQKLWRvX2hwYWNjX3RlbXBsYXRlX2xpdGVyYWwgKHdvcmssIG1hbmdsZWQsIHJlc3VsdCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKnJlc3VsdDsKLXsKLSAgaW50IGxpdGVyYWxfbGVuID0gMDsKLSAgY2hhciAqIHJlY3Vyc2U7Ci0gIGNoYXIgKiByZWN1cnNlX2RlbTsKLQotICBpZiAoKiptYW5nbGVkICE9ICdBJykKLSAgICByZXR1cm4gMDsKLQotICAoKm1hbmdsZWQpKys7Ci0KLSAgbGl0ZXJhbF9sZW4gPSBjb25zdW1lX2NvdW50IChtYW5nbGVkKTsKLQotICBpZiAobGl0ZXJhbF9sZW4gPD0gMCkKLSAgICByZXR1cm4gMDsKLQotICAvKiBMaXRlcmFsIHBhcmFtZXRlcnMgYXJlIG5hbWVzIG9mIGFycmF5cywgZnVuY3Rpb25zLCBldGMuICBhbmQgdGhlCi0gICAgIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiB1c2VzIHRoZSBhZGRyZXNzIG9wZXJhdG9yICovCi0gIHN0cmluZ19hcHBlbmQgKHJlc3VsdCwgIiYiKTsKLQotICAvKiBOb3cgcmVjdXJzaXZlbHkgZGVtYW5nbGUgdGhlIGxpdGVyYWwgbmFtZSAqLwotICByZWN1cnNlID0gKGNoYXIgKikgeG1hbGxvYyAobGl0ZXJhbF9sZW4gKyAxKTsKLSAgbWVtY3B5IChyZWN1cnNlLCAqbWFuZ2xlZCwgbGl0ZXJhbF9sZW4pOwotICByZWN1cnNlW2xpdGVyYWxfbGVuXSA9ICdcMDAwJzsKLQotICByZWN1cnNlX2RlbSA9IGNwbHVzX2RlbWFuZ2xlIChyZWN1cnNlLCB3b3JrLT5vcHRpb25zKTsKLQotICBpZiAocmVjdXJzZV9kZW0pCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZCAocmVzdWx0LCByZWN1cnNlX2RlbSk7Ci0gICAgICBmcmVlIChyZWN1cnNlX2RlbSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RyaW5nX2FwcGVuZG4gKHJlc3VsdCwgKm1hbmdsZWQsIGxpdGVyYWxfbGVuKTsKLSAgICB9Ci0gICgqbWFuZ2xlZCkgKz0gbGl0ZXJhbF9sZW47Ci0gIGZyZWUgKHJlY3Vyc2UpOwotCi0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50Ci1zbmFyZl9udW1lcmljX2xpdGVyYWwgKGFyZ3MsIGFyZykKLSAgICAgY29uc3QgY2hhciAqKiBhcmdzOwotICAgICBzdHJpbmcgKiBhcmc7Ci17Ci0gIGlmICgqKmFyZ3MgPT0gJy0nKQotICAgIHsKLSAgICAgIGNoYXJfc3RyWzBdID0gJy0nOwotICAgICAgc3RyaW5nX2FwcGVuZCAoYXJnLCBjaGFyX3N0cik7Ci0gICAgICAoKmFyZ3MpKys7Ci0gICAgfQotICBlbHNlIGlmICgqKmFyZ3MgPT0gJysnKQotICAgICgqYXJncykrKzsKLQotICBpZiAoIWlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqYXJncykpCi0gICAgcmV0dXJuIDA7Ci0KLSAgd2hpbGUgKGlzZGlnaXQgKCh1bnNpZ25lZCBjaGFyKSoqYXJncykpCi0gICAgewotICAgICAgY2hhcl9zdHJbMF0gPSAqKmFyZ3M7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChhcmcsIGNoYXJfc3RyKTsKLSAgICAgICgqYXJncykrKzsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlbWFuZ2xlIHRoZSBuZXh0IGFyZ3VtZW50LCBnaXZlbiBieSBNQU5HTEVEIGludG8gUkVTVUxULCB3aGljaAotICAgKnNob3VsZCBiZSBhbiB1bmluaXRpYWxpemVkKiBzdHJpbmcuICBJdCB3aWxsIGJlIGluaXRpYWxpemVkIGhlcmUsCi0gICBhbmQgZnJlZSdkIHNob3VsZCBhbnl0aGluZyBnbyB3cm9uZy4gICovCi0KLXN0YXRpYyBpbnQKLWRvX2FyZyAod29yaywgbWFuZ2xlZCwgcmVzdWx0KQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqKm1hbmdsZWQ7Ci0gICAgIHN0cmluZyAqcmVzdWx0OwotewotICAvKiBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkIHNvIHRoYXQgd2UgY2FuIHJlY29yZCB0aGUgdHlwZSwgZm9yCi0gICAgIG5vbi1zcXVhbmdsaW5nIHR5cGUgcmVtZW1iZXJpbmcuICAqLwotICBjb25zdCBjaGFyICpzdGFydCA9ICptYW5nbGVkOwotCi0gIHN0cmluZ19pbml0IChyZXN1bHQpOwotCi0gIGlmICh3b3JrLT5ucmVwZWF0cyA+IDApCi0gICAgewotICAgICAgLS13b3JrLT5ucmVwZWF0czsKLQotICAgICAgaWYgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID09IDApCi0JcmV0dXJuIDA7Ci0KLSAgICAgIC8qIFdlIHdhbnQgdG8gcmVpc3N1ZSB0aGUgcHJldmlvdXMgdHlwZSBpbiB0aGlzIGFyZ3VtZW50IGxpc3QuICAqLwotICAgICAgc3RyaW5nX2FwcGVuZHMgKHJlc3VsdCwgd29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmICgqKm1hbmdsZWQgPT0gJ24nKQotICAgIHsKLSAgICAgIC8qIEEgc3F1YW5nbGluZy1zdHlsZSByZXBlYXQuICAqLwotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgd29yay0+bnJlcGVhdHMgPSBjb25zdW1lX2NvdW50KG1hbmdsZWQpOwotCi0gICAgICBpZiAod29yay0+bnJlcGVhdHMgPD0gMCkKLQkvKiBUaGlzIHdhcyBub3QgYSByZXBlYXQgY291bnQgYWZ0ZXIgYWxsLiAgKi8KLQlyZXR1cm4gMDsKLQotICAgICAgaWYgKHdvcmstPm5yZXBlYXRzID4gOSkKLQl7Ci0JICBpZiAoKiptYW5nbGVkICE9ICdfJykKLQkgICAgLyogVGhlIHJlcGVhdCBjb3VudCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gJ18nIGluIHRoaXMKLQkgICAgICAgY2FzZS4gICovCi0JICAgIHJldHVybiAwOwotCSAgZWxzZQotCSAgICAoKm1hbmdsZWQpKys7Ci0JfQotCi0gICAgICAvKiBOb3csIHRoZSByZXBlYXQgaXMgYWxsIHNldCB1cC4gICovCi0gICAgICByZXR1cm4gZG9fYXJnICh3b3JrLCBtYW5nbGVkLCByZXN1bHQpOwotICAgIH0KLQotICAvKiBTYXZlIHRoZSByZXN1bHQgaW4gV09SSy0+cHJldmlvdXNfYXJndW1lbnQgc28gdGhhdCB3ZSBjYW4gZmluZCBpdAotICAgICBpZiBpdCdzIHJlcGVhdGVkLiAgTm90ZSB0aGF0IHNhdmluZyBTVEFSVCBpcyBub3QgZ29vZCBlbm91Z2g6IHdlCi0gICAgIGRvIG5vdCB3YW50IHRvIGFkZCBhZGRpdGlvbmFsIHR5cGVzIHRvIHRoZSBiYWNrLXJlZmVyZW5jZWFibGUKLSAgICAgdHlwZSB2ZWN0b3Igd2hlbiBwcm9jZXNzaW5nIGEgcmVwZWF0ZWQgdHlwZS4gICovCi0gIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKLSAgICBzdHJpbmdfY2xlYXIgKHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KTsKLSAgZWxzZQotICAgIHsKLSAgICAgIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gKHN0cmluZyopIHhtYWxsb2MgKHNpemVvZiAoc3RyaW5nKSk7Ci0gICAgICBzdHJpbmdfaW5pdCAod29yay0+cHJldmlvdXNfYXJndW1lbnQpOwotICAgIH0KLQotICBpZiAoIWRvX3R5cGUgKHdvcmssIG1hbmdsZWQsIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50KSkKLSAgICByZXR1cm4gMDsKLQotICBzdHJpbmdfYXBwZW5kcyAocmVzdWx0LCB3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0KLSAgcmVtZW1iZXJfdHlwZSAod29yaywgc3RhcnQsICptYW5nbGVkIC0gc3RhcnQpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQKLXJlbWVtYmVyX3R5cGUgKHdvcmssIHN0YXJ0LCBsZW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbjsKLXsKLSAgY2hhciAqdGVtOwotCi0gIGlmICh3b3JrLT5mb3JnZXR0aW5nX3R5cGVzKQotICAgIHJldHVybjsKLQotICBpZiAod29yayAtPiBudHlwZXMgPj0gd29yayAtPiB0eXBldmVjX3NpemUpCi0gICAgewotICAgICAgaWYgKHdvcmsgLT4gdHlwZXZlY19zaXplID09IDApCi0JewotCSAgd29yayAtPiB0eXBldmVjX3NpemUgPSAzOwotCSAgd29yayAtPiB0eXBldmVjCi0JICAgID0gKGNoYXIgKiopIHhtYWxsb2MgKHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4gdHlwZXZlY19zaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiB0eXBldmVjX3NpemUgKj0gMjsKLQkgIHdvcmsgLT4gdHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IHR5cGV2ZWMsCi0JCQkJICBzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IHR5cGV2ZWNfc2l6ZSk7Ci0JfQotICAgIH0KLSAgdGVtID0geG1hbGxvYyAobGVuICsgMSk7Ci0gIG1lbWNweSAodGVtLCBzdGFydCwgbGVuKTsKLSAgdGVtW2xlbl0gPSAnXDAnOwotICB3b3JrIC0+IHR5cGV2ZWNbd29yayAtPiBudHlwZXMrK10gPSB0ZW07Ci19Ci0KLQotLyogUmVtZW1iZXIgYSBLIHR5cGUgY2xhc3MgcXVhbGlmaWVyLiAqLwotc3RhdGljIHZvaWQKLXJlbWVtYmVyX0t0eXBlICh3b3JrLCBzdGFydCwgbGVuKQotICAgICBzdHJ1Y3Qgd29ya19zdHVmZiAqd29yazsKLSAgICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgIGludCBsZW47Ci17Ci0gIGNoYXIgKnRlbTsKLQotICBpZiAod29yayAtPiBudW1rID49IHdvcmsgLT4ga3NpemUpCi0gICAgewotICAgICAgaWYgKHdvcmsgLT4ga3NpemUgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGtzaXplID0gNTsKLQkgIHdvcmsgLT4ga3R5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeG1hbGxvYyAoc2l6ZW9mIChjaGFyICopICogd29yayAtPiBrc2l6ZSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHdvcmsgLT4ga3NpemUgKj0gMjsKLQkgIHdvcmsgLT4ga3R5cGV2ZWMKLQkgICAgPSAoY2hhciAqKikgeHJlYWxsb2MgKChjaGFyICopd29yayAtPiBrdHlwZXZlYywKLQkJCQkgIHNpemVvZiAoY2hhciAqKSAqIHdvcmsgLT4ga3NpemUpOwotCX0KLSAgICB9Ci0gIHRlbSA9IHhtYWxsb2MgKGxlbiArIDEpOwotICBtZW1jcHkgKHRlbSwgc3RhcnQsIGxlbik7Ci0gIHRlbVtsZW5dID0gJ1wwJzsKLSAgd29yayAtPiBrdHlwZXZlY1t3b3JrIC0+IG51bWsrK10gPSB0ZW07Ci19Ci0KLS8qIFJlZ2lzdGVyIGEgQiBjb2RlLCBhbmQgZ2V0IGFuIGluZGV4IGZvciBpdC4gQiBjb2RlcyBhcmUgcmVnaXN0ZXJlZAotICAgYXMgdGhleSBhcmUgc2VlbiwgcmF0aGVyIHRoYW4gYXMgdGhleSBhcmUgY29tcGxldGVkLCBzbyBtYXA8dGVtcDxjaGFyPiA+Ci0gICByZWdpc3RlcnMgbWFwPHRlbXA8Y2hhcj4gPiBhcyBCMCwgYW5kIHRlbXA8Y2hhcj4gYXMgQjEgKi8KLQotc3RhdGljIGludAotcmVnaXN0ZXJfQnR5cGUgKHdvcmspCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotewotICBpbnQgcmV0OwotCi0gIGlmICh3b3JrIC0+IG51bWIgPj0gd29yayAtPiBic2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yayAtPiBic2l6ZSA9PSAwKQotCXsKLQkgIHdvcmsgLT4gYnNpemUgPSA1OwotCSAgd29yayAtPiBidHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4bWFsbG9jIChzaXplb2YgKGNoYXIgKikgKiB3b3JrIC0+IGJzaXplKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd29yayAtPiBic2l6ZSAqPSAyOwotCSAgd29yayAtPiBidHlwZXZlYwotCSAgICA9IChjaGFyICoqKSB4cmVhbGxvYyAoKGNoYXIgKil3b3JrIC0+IGJ0eXBldmVjLAotCQkJCSAgc2l6ZW9mIChjaGFyICopICogd29yayAtPiBic2l6ZSk7Ci0JfQotICAgIH0KLSAgcmV0ID0gd29yayAtPiBudW1iKys7Ci0gIHdvcmsgLT4gYnR5cGV2ZWNbcmV0XSA9IE5VTEw7Ci0gIHJldHVybihyZXQpOwotfQotCi0vKiBTdG9yZSBhIHZhbHVlIGludG8gYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgQiBjb2RlIHR5cGUuICovCi0KLXN0YXRpYyB2b2lkCi1yZW1lbWJlcl9CdHlwZSAod29yaywgc3RhcnQsIGxlbiwgaW5kZXgpCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICpzdGFydDsKLSAgICAgaW50IGxlbiwgaW5kZXg7Ci17Ci0gIGNoYXIgKnRlbTsKLQotICB0ZW0gPSB4bWFsbG9jIChsZW4gKyAxKTsKLSAgbWVtY3B5ICh0ZW0sIHN0YXJ0LCBsZW4pOwotICB0ZW1bbGVuXSA9ICdcMCc7Ci0gIHdvcmsgLT4gYnR5cGV2ZWNbaW5kZXhdID0gdGVtOwotfQotCi0vKiBMb3NlIGFsbCB0aGUgaW5mbyByZWxhdGVkIHRvIEIgYW5kIEsgdHlwZSBjb2Rlcy4gKi8KLXN0YXRpYyB2b2lkCi1mb3JnZXRfQl9hbmRfS190eXBlcyAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCBpOwotCi0gIHdoaWxlICh3b3JrIC0+IG51bWsgPiAwKQotICAgIHsKLSAgICAgIGkgPSAtLSh3b3JrIC0+IG51bWspOwotICAgICAgaWYgKHdvcmsgLT4ga3R5cGV2ZWNbaV0gIT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3b3JrIC0+IGt0eXBldmVjW2ldKTsKLQkgIHdvcmsgLT4ga3R5cGV2ZWNbaV0gPSBOVUxMOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKHdvcmsgLT4gbnVtYiA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnVtYik7Ci0gICAgICBpZiAod29yayAtPiBidHlwZXZlY1tpXSAhPSBOVUxMKQotCXsKLQkgIGZyZWUgKHdvcmsgLT4gYnR5cGV2ZWNbaV0pOwotCSAgd29yayAtPiBidHlwZXZlY1tpXSA9IE5VTEw7Ci0JfQotICAgIH0KLX0KLS8qIEZvcmdldCB0aGUgcmVtZW1iZXJlZCB0eXBlcywgYnV0IG5vdCB0aGUgdHlwZSB2ZWN0b3IgaXRzZWxmLiAgKi8KLQotc3RhdGljIHZvaWQKLWZvcmdldF90eXBlcyAod29yaykKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci17Ci0gIGludCBpOwotCi0gIHdoaWxlICh3b3JrIC0+IG50eXBlcyA+IDApCi0gICAgewotICAgICAgaSA9IC0tKHdvcmsgLT4gbnR5cGVzKTsKLSAgICAgIGlmICh3b3JrIC0+IHR5cGV2ZWNbaV0gIT0gTlVMTCkKLQl7Ci0JICBmcmVlICh3b3JrIC0+IHR5cGV2ZWNbaV0pOwotCSAgd29yayAtPiB0eXBldmVjW2ldID0gTlVMTDsKLQl9Ci0gICAgfQotfQotCi0vKiBQcm9jZXNzIHRoZSBhcmd1bWVudCBsaXN0IHBhcnQgb2YgdGhlIHNpZ25hdHVyZSwgYWZ0ZXIgYW55IGNsYXNzIHNwZWMKLSAgIGhhcyBiZWVuIGNvbnN1bWVkLCBhcyB3ZWxsIGFzIHRoZSBmaXJzdCAnRicgY2hhcmFjdGVyIChpZiBhbnkpLiAgRm9yCi0gICBleGFtcGxlOgotCi0gICAiX19hbHNfXzNmb29SVDAiCQk9Pglwcm9jZXNzICJSVDAiCi0gICAiY29tcGxleGZ1bmM1X19GUEZQY19QRmxfaSIJPT4JcHJvY2VzcyAiUEZQY19QRmxfaSIKLQotICAgREVDTFAgbXVzdCBiZSBhbHJlYWR5IGluaXRpYWxpc2VkLCB1c3VhbGx5IG5vbi1lbXB0eS4gIEl0IHdvbid0IGJlIGZyZWVkCi0gICBvbiBmYWlsdXJlLgotCi0gICBOb3RlIHRoYXQgZysrIGRpZmZlcnMgc2lnbmlmaWNhbnRseSBmcm9tIEFSTSBhbmQgbHVjaWQgc3R5bGUgbWFuZ2xpbmcKLSAgIHdpdGggcmVnYXJkcyB0byByZWZlcmVuY2VzIHRvIHByZXZpb3VzbHkgc2VlbiB0eXBlcy4gIEZvciBleGFtcGxlLCBnaXZlbgotICAgdGhlIHNvdXJjZSBmcmFnbWVudDoKLQotICAgICBjbGFzcyBmb28gewotICAgICAgIHB1YmxpYzoKLSAgICAgICBmb286OmZvbyAoaW50LCBmb28gJmlhLCBpbnQsIGZvbyAmaWIsIGludCwgZm9vICZpYyk7Ci0gICAgIH07Ci0KLSAgICAgZm9vOjpmb28gKGludCwgZm9vICZpYSwgaW50LCBmb28gJmliLCBpbnQsIGZvbyAmaWMpIHsgaWEgPSBpYiA9IGljOyB9Ci0gICAgIHZvaWQgZm9vIChpbnQsIGZvbyAmaWEsIGludCwgZm9vICZpYiwgaW50LCBmb28gJmljKSB7IGlhID0gaWIgPSBpYzsgfQotCi0gICBnKysgcHJvZHVjZXMgdGhlIG5hbWVzOgotCi0gICAgIF9fM2Zvb2lSVDBpVDJpVDIKLSAgICAgZm9vX19GaVIzZm9vaVQxaVQxCi0KLSAgIHdoaWxlIGxjYyAoYW5kIHByZXN1bWFibHkgb3RoZXIgQVJNIHN0eWxlIGNvbXBpbGVycyBhcyB3ZWxsKSBwcm9kdWNlczoKLQotICAgICBmb29fX0ZpUjNmb29UMVQyVDFUMgotICAgICBfX2N0X18zZm9vRmlSM2Zvb1QxVDJUMVQyCi0KLSAgIE5vdGUgdGhhdCBnKysgYmFzZXMgaXRzIHR5cGUgbnVtYmVycyBzdGFydGluZyBhdCB6ZXJvIGFuZCBjb3VudHMgYWxsCi0gICBwcmV2aW91c2x5IHNlZW4gdHlwZXMsIHdoaWxlIGx1Y2lkL0FSTSBiYXNlcyBpdHMgdHlwZSBudW1iZXJzIHN0YXJ0aW5nCi0gICBhdCBvbmUgYW5kIG9ubHkgY29uc2lkZXJzIHR5cGVzIGFmdGVyIGl0IGhhcyBzZWVuIHRoZSAnRicgY2hhcmFjdGVyCi0gICBpbmRpY2F0aW5nIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYXJncy4gIEZvciBsdWNpZC9BUk0gc3R5bGUsIHdlCi0gICBhY2NvdW50IGZvciB0aGlzIGRpZmZlcmVuY2UgYnkgZGlzY2FyZGluZyBhbnkgcHJldmlvdXNseSBzZWVuIHR5cGVzIHdoZW4KLSAgIHdlIHNlZSB0aGUgJ0YnIGNoYXJhY3RlciwgYW5kIHN1YnRyYWN0aW5nIG9uZSBmcm9tIHRoZSB0eXBlIG51bWJlcgotICAgcmVmZXJlbmNlLgotCi0gKi8KLQotc3RhdGljIGludAotZGVtYW5nbGVfYXJncyAod29yaywgbWFuZ2xlZCwgZGVjbHApCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLXsKLSAgc3RyaW5nIGFyZzsKLSAgaW50IG5lZWRfY29tbWEgPSAwOwotICBpbnQgcjsKLSAgaW50IHQ7Ci0gIGNvbnN0IGNoYXIgKnRlbTsKLSAgY2hhciB0ZW1wdHlwZTsKLQotICBpZiAoUFJJTlRfQVJHX1RZUEVTKQotICAgIHsKLSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiKCIpOwotICAgICAgaWYgKCoqbWFuZ2xlZCA9PSAnXDAnKQotCXsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAidm9pZCIpOwotCX0KLSAgICB9Ci0KLSAgd2hpbGUgKCgqKm1hbmdsZWQgIT0gJ18nICYmICoqbWFuZ2xlZCAhPSAnXDAnICYmICoqbWFuZ2xlZCAhPSAnZScpCi0JIHx8IHdvcmstPm5yZXBlYXRzID4gMCkKLSAgICB7Ci0gICAgICBpZiAoKCoqbWFuZ2xlZCA9PSAnTicpIHx8ICgqKm1hbmdsZWQgPT0gJ1QnKSkKLQl7Ci0JICB0ZW1wdHlwZSA9ICooKm1hbmdsZWQpKys7Ci0KLQkgIGlmICh0ZW1wdHlwZSA9PSAnTicpCi0JICAgIHsKLQkgICAgICBpZiAoIWdldF9jb3VudCAobWFuZ2xlZCwgJnIpKQotCQl7Ci0JCSAgcmV0dXJuICgwKTsKLQkJfQotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICByID0gMTsKLQkgICAgfQotICAgICAgICAgIGlmICgoSFBfREVNQU5HTElORyB8fCBBUk1fREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykgJiYgd29yayAtPiBudHlwZXMgPj0gMTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgMTAgb3IgbW9yZSB0eXBlcyB3ZSBtaWdodCBoYXZlIG1vcmUgdGhhbiBhIDEgZGlnaXQKLSAgICAgICAgICAgICAgICAgaW5kZXggc28gd2UnbGwgaGF2ZSB0byBjb25zdW1lIHRoZSB3aG9sZSBjb3VudCBoZXJlLiBUaGlzCi0gICAgICAgICAgICAgICAgIHdpbGwgbG9zZSBpZiB0aGUgbmV4dCB0aGluZyBpcyBhIHR5cGUgbmFtZSBwcmVjZWRlZCBieSBhCi0gICAgICAgICAgICAgICAgIGNvdW50IGJ1dCBpdCdzIGltcG9zc2libGUgdG8gZGVtYW5nbGUgdGhhdCBjYXNlIHByb3Blcmx5Ci0gICAgICAgICAgICAgICAgIGFueXdheS4gRWcgaWYgd2UgYWxyZWFkeSBoYXZlIDEyIHR5cGVzIGlzIFQxMlBjICIoLi4uLCB0eXBlMSwKLSAgICAgICAgICAgICAgICAgUGMsIC4uLikiICBvciAiKC4uLiwgdHlwZTEyLCBjaGFyICosIC4uLikiICovCi0gICAgICAgICAgICAgIGlmICgodCA9IGNvbnN1bWVfY291bnQobWFuZ2xlZCkpIDw9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKCFnZXRfY291bnQgKG1hbmdsZWQsICZ0KSkKLQkgICAgCXsKLQkgICAgICAgICAgcmV0dXJuICgwKTsKLQkgICAgCX0KLQkgICAgfQotCSAgaWYgKExVQ0lEX0RFTUFOR0xJTkcgfHwgQVJNX0RFTUFOR0xJTkcgfHwgSFBfREVNQU5HTElORyB8fCBFREdfREVNQU5HTElORykKLQkgICAgewotCSAgICAgIHQtLTsKLQkgICAgfQotCSAgLyogVmFsaWRhdGUgdGhlIHR5cGUgaW5kZXguICBQcm90ZWN0IGFnYWluc3QgaWxsZWdhbCBpbmRpY2VzIGZyb20KLQkgICAgIG1hbGZvcm1lZCB0eXBlIHN0cmluZ3MuICAqLwotCSAgaWYgKCh0IDwgMCkgfHwgKHQgPj0gd29yayAtPiBudHlwZXMpKQotCSAgICB7Ci0JICAgICAgcmV0dXJuICgwKTsKLQkgICAgfQotCSAgd2hpbGUgKHdvcmstPm5yZXBlYXRzID4gMCB8fCAtLXIgPj0gMCkKLQkgICAgewotCSAgICAgIHRlbSA9IHdvcmsgLT4gdHlwZXZlY1t0XTsKLQkgICAgICBpZiAobmVlZF9jb21tYSAmJiBQUklOVF9BUkdfVFlQRVMpCi0JCXsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIiwgIik7Ci0JCX0KLQkgICAgICBpZiAoIWRvX2FyZyAod29yaywgJnRlbSwgJmFyZykpCi0JCXsKLQkJICByZXR1cm4gKDApOwotCQl9Ci0JICAgICAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQkJewotCQkgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0JCX0KLQkgICAgICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLQkgICAgICBuZWVkX2NvbW1hID0gMTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAobmVlZF9jb21tYSAmJiBQUklOVF9BUkdfVFlQRVMpCi0JICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCAiKTsKLQkgIGlmICghZG9fYXJnICh3b3JrLCBtYW5nbGVkLCAmYXJnKSkKLQkgICAgcmV0dXJuICgwKTsKLQkgIGlmIChQUklOVF9BUkdfVFlQRVMpCi0JICAgIHN0cmluZ19hcHBlbmRzIChkZWNscCwgJmFyZyk7Ci0JICBzdHJpbmdfZGVsZXRlICgmYXJnKTsKLQkgIG5lZWRfY29tbWEgPSAxOwotCX0KLSAgICB9Ci0KLSAgaWYgKCoqbWFuZ2xlZCA9PSAnZScpCi0gICAgewotICAgICAgKCptYW5nbGVkKSsrOwotICAgICAgaWYgKFBSSU5UX0FSR19UWVBFUykKLQl7Ci0JICBpZiAobmVlZF9jb21tYSkKLQkgICAgewotCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiLCIpOwotCSAgICB9Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIi4uLiIpOwotCX0KLSAgICB9Ci0KLSAgaWYgKFBSSU5UX0FSR19UWVBFUykKLSAgICB7Ci0gICAgICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIikiKTsKLSAgICB9Ci0gIHJldHVybiAoMSk7Ci19Ci0KLS8qIExpa2UgZGVtYW5nbGVfYXJncywgYnV0IGZvciBkZW1hbmdsaW5nIHRoZSBhcmd1bWVudCBsaXN0cyBvZiBmdW5jdGlvbgotICAgYW5kIG1ldGhvZCBwb2ludGVycyBvciByZWZlcmVuY2VzLCBub3QgdG9wLWxldmVsIGRlY2xhcmF0aW9ucy4gICovCi0KLXN0YXRpYyBpbnQKLWRlbWFuZ2xlX25lc3RlZF9hcmdzICh3b3JrLCBtYW5nbGVkLCBkZWNscCkKLSAgICAgc3RydWN0IHdvcmtfc3R1ZmYgKndvcms7Ci0gICAgIGNvbnN0IGNoYXIgKiptYW5nbGVkOwotICAgICBzdHJpbmcgKmRlY2xwOwotewotICBzdHJpbmcqIHNhdmVkX3ByZXZpb3VzX2FyZ3VtZW50OwotICBpbnQgcmVzdWx0OwotICBpbnQgc2F2ZWRfbnJlcGVhdHM7Ci0KLSAgLyogVGhlIEcrKyBuYW1lLW1hbmdsaW5nIGFsZ29yaXRobSBkb2VzIG5vdCByZW1lbWJlciB0eXBlcyBvbiBuZXN0ZWQKLSAgICAgYXJndW1lbnQgbGlzdHMsIHVubGVzcyAtZnNxdWFuZ2xpbmcgaXMgdXNlZCwgYW5kIGluIHRoYXQgY2FzZSB0aGUKLSAgICAgdHlwZSB2ZWN0b3IgdXBkYXRlZCBieSByZW1lbWJlcl90eXBlIGlzIG5vdCB1c2VkLiAgU28sIHdlIHR1cm4KLSAgICAgb2ZmIHJlbWVtYmVyaW5nIG9mIHR5cGVzIGhlcmUuICAqLwotICArK3dvcmstPmZvcmdldHRpbmdfdHlwZXM7Ci0KLSAgLyogRm9yIHRoZSByZXBlYXQgY29kZXMgdXNlZCB3aXRoIC1mc3F1YW5nbGluZywgd2UgbXVzdCBrZWVwIHRyYWNrIG9mCi0gICAgIHRoZSBsYXN0IGFyZ3VtZW50LiAgKi8KLSAgc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQgPSB3b3JrLT5wcmV2aW91c19hcmd1bWVudDsKLSAgc2F2ZWRfbnJlcGVhdHMgPSB3b3JrLT5ucmVwZWF0czsKLSAgd29yay0+cHJldmlvdXNfYXJndW1lbnQgPSAwOwotICB3b3JrLT5ucmVwZWF0cyA9IDA7Ci0KLSAgLyogQWN0dWFsbHkgZGVtYW5nbGUgdGhlIGFyZ3VtZW50cy4gICovCi0gIHJlc3VsdCA9IGRlbWFuZ2xlX2FyZ3MgKHdvcmssIG1hbmdsZWQsIGRlY2xwKTsKLQotICAvKiBSZXN0b3JlIHRoZSBwcmV2aW91c19hcmd1bWVudCBmaWVsZC4gICovCi0gIGlmICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCkKLSAgICBzdHJpbmdfZGVsZXRlICh3b3JrLT5wcmV2aW91c19hcmd1bWVudCk7Ci0gIHdvcmstPnByZXZpb3VzX2FyZ3VtZW50ID0gc2F2ZWRfcHJldmlvdXNfYXJndW1lbnQ7Ci0gIC0td29yay0+Zm9yZ2V0dGluZ190eXBlczsKLSAgd29yay0+bnJlcGVhdHMgPSBzYXZlZF9ucmVwZWF0czsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfZnVuY3Rpb25fbmFtZSAod29yaywgbWFuZ2xlZCwgZGVjbHAsIHNjYW4pCi0gICAgIHN0cnVjdCB3b3JrX3N0dWZmICp3b3JrOwotICAgICBjb25zdCBjaGFyICoqbWFuZ2xlZDsKLSAgICAgc3RyaW5nICpkZWNscDsKLSAgICAgY29uc3QgY2hhciAqc2NhbjsKLXsKLSAgc2l6ZV90IGk7Ci0gIHN0cmluZyB0eXBlOwotICBjb25zdCBjaGFyICp0ZW07Ci0KLSAgc3RyaW5nX2FwcGVuZG4gKGRlY2xwLCAoKm1hbmdsZWQpLCBzY2FuIC0gKCptYW5nbGVkKSk7Ci0gIHN0cmluZ19uZWVkIChkZWNscCwgMSk7Ci0gICooZGVjbHAgLT4gcCkgPSAnXDAnOwotCi0gIC8qIENvbnN1bWUgdGhlIGZ1bmN0aW9uIG5hbWUsIGluY2x1ZGluZyB0aGUgIl9fIiBzZXBhcmF0aW5nIHRoZSBuYW1lCi0gICAgIGZyb20gdGhlIHNpZ25hdHVyZS4gIFdlIGFyZSBndWFyYW50ZWVkIHRoYXQgU0NBTiBwb2ludHMgdG8gdGhlCi0gICAgIHNlcGFyYXRvci4gICovCi0KLSAgKCptYW5nbGVkKSA9IHNjYW4gKyAyOwotICAvKiBXZSBtYXkgYmUgbG9va2luZyBhdCBhbiBpbnN0YW50aWF0aW9uIG9mIGEgdGVtcGxhdGUgZnVuY3Rpb246Ci0gICAgIGZvb19fWHQxdDJfRnQzdDQsIHdoZXJlIHQxLCB0MiwgLi4uIGFyZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYW5kIGEKLSAgICAgZm9sbG93aW5nIF9GIG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzLiAgSGFuZGxlCi0gICAgIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgZmlyc3QuICovCi0KLSAgaWYgKEhQX0RFTUFOR0xJTkcgJiYgKCoqbWFuZ2xlZCA9PSAnWCcpKQotICAgIHsKLSAgICAgIGRlbWFuZ2xlX2FybV9ocF90ZW1wbGF0ZSAod29yaywgbWFuZ2xlZCwgMCwgZGVjbHApOwotICAgICAgLyogVGhpcyBsZWF2ZXMgTUFOR0xFRCBwb2ludGluZyB0byB0aGUgJ0YnIG1hcmtpbmcgZnVuYyBhcmdzICovCi0gICAgfQotCi0gIGlmIChMVUNJRF9ERU1BTkdMSU5HIHx8IEFSTV9ERU1BTkdMSU5HIHx8IEhQX0RFTUFOR0xJTkcgfHwgRURHX0RFTUFOR0xJTkcpCi0gICAgewotCi0gICAgICAvKiBTZWUgaWYgd2UgaGF2ZSBhbiBBUk0gc3R5bGUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvciBvcGVyYXRvci4KLQkgSWYgc28sIHRoZW4ganVzdCByZWNvcmQgaXQsIGNsZWFyIHRoZSBkZWNsLCBhbmQgcmV0dXJuLgotCSBXZSBjYW4ndCBidWlsZCB0aGUgYWN0dWFsIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZGVjbCB1bnRpbCBsYXRlciwKLQkgd2hlbiB3ZSByZWNvdmVyIHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIHNpZ25hdHVyZS4gICovCi0KLSAgICAgIGlmIChzdHJjbXAgKGRlY2xwIC0+IGIsICJfX2N0IikgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGNvbnN0cnVjdG9yICs9IDE7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHJldHVybjsKLQl9Ci0gICAgICBlbHNlIGlmIChzdHJjbXAgKGRlY2xwIC0+IGIsICJfX2R0IikgPT0gMCkKLQl7Ci0JICB3b3JrIC0+IGRlc3RydWN0b3IgKz0gMTsKLQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCSAgcmV0dXJuOwotCX0KLSAgICB9Ci0KLSAgaWYgKGRlY2xwLT5wIC0gZGVjbHAtPmIgPj0gMwotICAgICAgJiYgZGVjbHAtPmJbMF0gPT0gJ28nCi0gICAgICAmJiBkZWNscC0+YlsxXSA9PSAncCcKLSAgICAgICYmIHN0cmNociAoY3BsdXNfbWFya2VycywgZGVjbHAtPmJbMl0pICE9IE5VTEwpCi0gICAgewotICAgICAgLyogc2VlIGlmIGl0J3MgYW4gYXNzaWdubWVudCBleHByZXNzaW9uICovCi0gICAgICBpZiAoZGVjbHAtPnAgLSBkZWNscC0+YiA+PSAxMCAvKiBvcCRhc3NpZ25fICovCi0JICAmJiBtZW1jbXAgKGRlY2xwLT5iICsgMywgImFzc2lnbl8iLCA3KSA9PSAwKQotCXsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCSAgICB7Ci0JICAgICAgaW50IGxlbiA9IGRlY2xwLT5wIC0gZGVjbHAtPmIgLSAxMDsKLQkgICAgICBpZiAoKGludCkgc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSBsZW4KLQkJICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMTAsIGxlbikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAiPSIpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpbnQgbGVuID0gZGVjbHAtPnAgLSBkZWNscC0+YiAtIDM7Ci0JICAgICAgaWYgKChpbnQpIHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gbGVuCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDMsIGxlbikgPT0gMCkKLQkJewotCQkgIHN0cmluZ19jbGVhciAoZGVjbHApOwotCQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgb3B0YWJsZVtpXS5vdXQpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+cCAtIGRlY2xwLT5iID49IDUgJiYgbWVtY21wIChkZWNscC0+YiwgInR5cGUiLCA0KSA9PSAwCi0JICAgJiYgc3RyY2hyIChjcGx1c19tYXJrZXJzLCBkZWNscC0+Yls0XSkgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IgKi8KLSAgICAgIHRlbSA9IGRlY2xwLT5iICsgNTsKLSAgICAgIGlmIChkb190eXBlICh3b3JrLCAmdGVtLCAmdHlwZSkpCi0JewotCSAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yICIpOwotCSAgc3RyaW5nX2FwcGVuZHMgKGRlY2xwLCAmdHlwZSk7Ci0JICBzdHJpbmdfZGVsZXRlICgmdHlwZSk7Ci0JfQotICAgIH0KLSAgZWxzZSBpZiAoZGVjbHAtPmJbMF0gPT0gJ18nICYmIGRlY2xwLT5iWzFdID09ICdfJwotCSAgICYmIGRlY2xwLT5iWzJdID09ICdvJyAmJiBkZWNscC0+YlszXSA9PSAncCcpCi0gICAgewotICAgICAgLyogQU5TSS4gICovCi0gICAgICAvKiB0eXBlIGNvbnZlcnNpb24gb3BlcmF0b3IuICAqLwotICAgICAgdGVtID0gZGVjbHAtPmIgKyA0OwotICAgICAgaWYgKGRvX3R5cGUgKHdvcmssICZ0ZW0sICZ0eXBlKSkKLQl7Ci0JICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IgIik7Ci0JICBzdHJpbmdfYXBwZW5kcyAoZGVjbHAsICZ0eXBlKTsKLQkgIHN0cmluZ19kZWxldGUgKCZ0eXBlKTsKLQl9Ci0gICAgfQotICBlbHNlIGlmIChkZWNscC0+YlswXSA9PSAnXycgJiYgZGVjbHAtPmJbMV0gPT0gJ18nCi0JICAgJiYgZGVjbHAtPmJbMl0gPj0gJ2EnICYmIGRlY2xwLT5iWzJdIDw9ICd6JwotCSAgICYmIGRlY2xwLT5iWzNdID49ICdhJyAmJiBkZWNscC0+YlszXSA8PSAneicpCi0gICAgewotICAgICAgaWYgKGRlY2xwLT5iWzRdID09ICdcMCcpCi0JewotCSAgLyogT3BlcmF0b3IuICAqLwotCSAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAob3B0YWJsZSkgLyBzaXplb2YgKG9wdGFibGVbMF0pOyBpKyspCi0JICAgIHsKLQkgICAgICBpZiAoc3RybGVuIChvcHRhYmxlW2ldLmluKSA9PSAyCi0JCSAgJiYgbWVtY21wIChvcHRhYmxlW2ldLmluLCBkZWNscC0+YiArIDIsIDIpID09IDApCi0JCXsKLQkJICBzdHJpbmdfY2xlYXIgKGRlY2xwKTsKLQkJICBzdHJpbmdfYXBwZW5kIChkZWNscCwgIm9wZXJhdG9yIik7Ci0JCSAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKLQkJICBicmVhazsKLQkJfQotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGlmIChkZWNscC0+YlsyXSA9PSAnYScgJiYgZGVjbHAtPmJbNV0gPT0gJ1wwJykKLQkgICAgewotCSAgICAgIC8qIEFzc2lnbm1lbnQuICAqLwotCSAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKG9wdGFibGUpIC8gc2l6ZW9mIChvcHRhYmxlWzBdKTsgaSsrKQotCQl7Ci0JCSAgaWYgKHN0cmxlbiAob3B0YWJsZVtpXS5pbikgPT0gMwotCQkgICAgICAmJiBtZW1jbXAgKG9wdGFibGVbaV0uaW4sIGRlY2xwLT5iICsgMiwgMykgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgc3RyaW5nX2NsZWFyIChkZWNscCk7Ci0JCSAgICAgIHN0cmluZ19hcHBlbmQgKGRlY2xwLCAib3BlcmF0b3IiKTsKLQkJICAgICAgc3RyaW5nX2FwcGVuZCAoZGVjbHAsIG9wdGFibGVbaV0ub3V0KTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIGEgbWluaSBzdHJpbmctaGFuZGxpbmcgcGFja2FnZSAqLwotCi1zdGF0aWMgdm9pZAotc3RyaW5nX25lZWQgKHMsIG4pCi0gICAgIHN0cmluZyAqczsKLSAgICAgaW50IG47Ci17Ci0gIGludCB0ZW07Ci0KLSAgaWYgKHMtPmIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAobiA8IDMyKQotCXsKLQkgIG4gPSAzMjsKLQl9Ci0gICAgICBzLT5wID0gcy0+YiA9IHhtYWxsb2MgKG4pOwotICAgICAgcy0+ZSA9IHMtPmIgKyBuOwotICAgIH0KLSAgZWxzZSBpZiAocy0+ZSAtIHMtPnAgPCBuKQotICAgIHsKLSAgICAgIHRlbSA9IHMtPnAgLSBzLT5iOwotICAgICAgbiArPSB0ZW07Ci0gICAgICBuICo9IDI7Ci0gICAgICBzLT5iID0geHJlYWxsb2MgKHMtPmIsIG4pOwotICAgICAgcy0+cCA9IHMtPmIgKyB0ZW07Ci0gICAgICBzLT5lID0gcy0+YiArIG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2RlbGV0ZSAocykKLSAgICAgc3RyaW5nICpzOwotewotICBpZiAocy0+YiAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZyZWUgKHMtPmIpOwotICAgICAgcy0+YiA9IHMtPmUgPSBzLT5wID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfaW5pdCAocykKLSAgICAgc3RyaW5nICpzOwotewotICBzLT5iID0gcy0+cCA9IHMtPmUgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2NsZWFyIChzKQotICAgICBzdHJpbmcgKnM7Ci17Ci0gIHMtPnAgPSBzLT5iOwotfQotCi0jaWYgMAotCi1zdGF0aWMgaW50Ci1zdHJpbmdfZW1wdHkgKHMpCi0gICAgIHN0cmluZyAqczsKLXsKLSAgcmV0dXJuIChzLT5iID09IHMtPnApOwotfQotCi0jZW5kaWYKLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmQgKHAsIHMpCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgaW50IG47Ci0gIGlmIChzID09IE5VTEwgfHwgKnMgPT0gJ1wwJykKLSAgICByZXR1cm47Ci0gIG4gPSBzdHJsZW4gKHMpOwotICBzdHJpbmdfbmVlZCAocCwgbik7Ci0gIG1lbWNweSAocC0+cCwgcywgbik7Ci0gIHAtPnAgKz0gbjsKLX0KLQotc3RhdGljIHZvaWQKLXN0cmluZ19hcHBlbmRzIChwLCBzKQotICAgICBzdHJpbmcgKnAsICpzOwotewotICBpbnQgbjsKLQotICBpZiAocy0+YiAhPSBzLT5wKQotICAgIHsKLSAgICAgIG4gPSBzLT5wIC0gcy0+YjsKLSAgICAgIHN0cmluZ19uZWVkIChwLCBuKTsKLSAgICAgIG1lbWNweSAocC0+cCwgcy0+Yiwgbik7Ci0gICAgICBwLT5wICs9IG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX2FwcGVuZG4gKHAsIHMsIG4pCi0gICAgIHN0cmluZyAqcDsKLSAgICAgY29uc3QgY2hhciAqczsKLSAgICAgaW50IG47Ci17Ci0gIGlmIChuICE9IDApCi0gICAgewotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgbWVtY3B5IChwLT5wLCBzLCBuKTsKLSAgICAgIHAtPnAgKz0gbjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZCAocCwgcykKLSAgICAgc3RyaW5nICpwOwotICAgICBjb25zdCBjaGFyICpzOwotewotICBpZiAocyAhPSBOVUxMICYmICpzICE9ICdcMCcpCi0gICAgewotICAgICAgc3RyaW5nX3ByZXBlbmRuIChwLCBzLCBzdHJsZW4gKHMpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1zdHJpbmdfcHJlcGVuZHMgKHAsIHMpCi0gICAgIHN0cmluZyAqcCwgKnM7Ci17Ci0gIGlmIChzLT5iICE9IHMtPnApCi0gICAgewotICAgICAgc3RyaW5nX3ByZXBlbmRuIChwLCBzLT5iLCBzLT5wIC0gcy0+Yik7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotc3RyaW5nX3ByZXBlbmRuIChwLCBzLCBuKQotICAgICBzdHJpbmcgKnA7Ci0gICAgIGNvbnN0IGNoYXIgKnM7Ci0gICAgIGludCBuOwotewotICBjaGFyICpxOwotCi0gIGlmIChuICE9IDApCi0gICAgewotICAgICAgc3RyaW5nX25lZWQgKHAsIG4pOwotICAgICAgZm9yIChxID0gcC0+cCAtIDE7IHEgPj0gcC0+YjsgcS0tKQotCXsKLQkgIHFbbl0gPSBxWzBdOwotCX0KLSAgICAgIG1lbWNweSAocC0+Yiwgcywgbik7Ci0gICAgICBwLT5wICs9IG47Ci0gICAgfQotfQotCi0vKiBUbyBnZW5lcmF0ZSBhIHN0YW5kYWxvbmUgZGVtYW5nbGVyIHByb2dyYW0gZm9yIHRlc3RpbmcgcHVycG9zZXMsCi0gICBqdXN0IGNvbXBpbGUgYW5kIGxpbmsgdGhpcyBmaWxlIHdpdGggLURNQUlOIGFuZCBsaWJpYmVydHkuYS4gIFdoZW4KLSAgIHJ1biwgaXQgZGVtYW5nbGVzIGVhY2ggY29tbWFuZCBsaW5lIGFyZywgb3IgZWFjaCBzdGRpbiBzdHJpbmcsIGFuZAotICAgcHJpbnRzIHRoZSByZXN1bHQgb24gc3Rkb3V0LiAgKi8KLQotI2lmZGVmIE1BSU4KLQotI2luY2x1ZGUgImdldG9wdC5oIgotCi1zdGF0aWMgY2hhciAqcHJvZ3JhbV9uYW1lOwotc3RhdGljIGNoYXIgKnByb2dyYW1fdmVyc2lvbiA9IFZFUlNJT047Ci1zdGF0aWMgaW50IGZsYWdzID0gRE1HTF9QQVJBTVMgfCBETUdMX0FOU0k7Ci0KLXN0YXRpYyB2b2lkIGRlbWFuZ2xlX2l0IFBBUkFNUyAoKGNoYXIgKikpOwotc3RhdGljIHZvaWQgdXNhZ2UgUEFSQU1TICgoRklMRSAqLCBpbnQpKTsKLXN0YXRpYyB2b2lkIGZhdGFsIFBBUkFNUyAoKGNoYXIgKikpOwotCi1zdGF0aWMgdm9pZAotZGVtYW5nbGVfaXQgKG1hbmdsZWRfbmFtZSkKLSAgICAgY2hhciAqbWFuZ2xlZF9uYW1lOwotewotICBjaGFyICpyZXN1bHQ7Ci0KLSAgcmVzdWx0ID0gY3BsdXNfZGVtYW5nbGUgKG1hbmdsZWRfbmFtZSwgZmxhZ3MpOwotICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgewotICAgICAgcHJpbnRmICgiJXNcbiIsIG1hbmdsZWRfbmFtZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRmICgiJXNcbiIsIHJlc3VsdCk7Ci0gICAgICBmcmVlIChyZXN1bHQpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLXVzYWdlIChzdHJlYW0sIHN0YXR1cykKLSAgICAgRklMRSAqc3RyZWFtOwotICAgICBpbnQgc3RhdHVzOwotewotICBmcHJpbnRmIChzdHJlYW0sICJcCi1Vc2FnZTogJXMgWy1fXSBbLW5dIFstcyB7Z251LGx1Y2lkLGFybSxocCxlZGd9XSBbLS1zdHJpcC11bmRlcnNjb3Jlc11cblwKLSAgICAgICBbLS1uby1zdHJpcC11bmRlcnNjb3Jlc10gWy0tZm9ybWF0PXtnbnUsbHVjaWQsYXJtLGhwLGVkZ31dXG5cCi0gICAgICBbLS1oZWxwXSBbLS12ZXJzaW9uXSBbYXJnLi4uXVxuIiwKLQkgICBwcm9ncmFtX25hbWUpOwotICBleGl0IChzdGF0dXMpOwotfQotCi0jZGVmaW5lIE1CVUZfU0laRSAzMjc2NwotY2hhciBtYnVmZmVyW01CVUZfU0laRV07Ci0KLS8qIERlZmluZWQgaW4gdGhlIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIHVuZGVyc2NvcmUuYy4gICovCi1leHRlcm4gaW50IHByZXBlbmRzX3VuZGVyc2NvcmU7Ci0KLWludCBzdHJpcF91bmRlcnNjb3JlID0gMDsKLQotc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7Ci0gIHsic3RyaXAtdW5kZXJzY29yZXMiLCBub19hcmd1bWVudCwgMCwgJ18nfSwKLSAgeyJmb3JtYXQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ3MnfSwKLSAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIDAsICdoJ30sCi0gIHsiamF2YSIsIG5vX2FyZ3VtZW50LCAwLCAnaid9LAotICB7Im5vLXN0cmlwLXVuZGVyc2NvcmVzIiwgbm9fYXJndW1lbnQsIDAsICduJ30sCi0gIHsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCAwLCAndid9LAotICB7MCwgbm9fYXJndW1lbnQsIDAsIDB9Ci19OwotCi0vKiBNb3JlICdmcmllbmRseScgYWJvcnQgdGhhdCBwcmludHMgdGhlIGxpbmUgYW5kIGZpbGUuCi0gICBjb25maWcuaCBjYW4gI2RlZmluZSBhYm9ydCBmYW5jeV9hYm9ydCBpZiB5b3UgbGlrZSB0aGF0IHNvcnQgb2YgdGhpbmcuICAqLwotCi12b2lkCi1mYW5jeV9hYm9ydCAoKQotewotICBmYXRhbCAoIkludGVybmFsIGdjYyBhYm9ydC4iKTsKLX0KLQotCi0vKiBGaWxsIGluIFRBQkxFIHNvIHRoYXQgVEFCTEVbQ10gaXMgdHJ1ZSBpZmYgQyAoYXMgYW4gdW5zaWduZWQgY2hhcikKLSAgIGlzIGEgdmFsaWQgc3ltYm9sIGNvbXBvbmVudCwgaW4gdGhlIHN0YW5kYXJkIGFzc2VtYmxlciBzeW1ib2wKLSAgIHN5bnRheC4gICovCi12b2lkCi1zdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQgKGNoYXIgKnRhYmxlKQotewotICBpbnQgYzsKLQotICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspCi0gICAgdGFibGVbY10gPSBpc2FsbnVtKGMpOwotCi0gIHRhYmxlWydfJ10gPSAxOwotICB0YWJsZVsnJCddID0gMTsKLSAgdGFibGVbJy4nXSA9IDE7Ci19Ci0KLQotLyogRmlsbCBpbiBUQUJMRSBzbyB0aGF0IFRBQkxFW0NdIGlzIHRydWUgaWZmIEMgKGFzIGFuIHVuc2lnbmVkIGNoYXIpCi0gICBpcyBhIHZhbGlkIHN5bWJvbCBuYW1lIGNvbXBvbmVudCBpbiBhbiBIUCBvYmplY3QgZmlsZS4KLQotICAgTm90ZSB0aGF0LCBzaW5jZSBIUCdzIGNvbXBpbGVyIGdlbmVyYXRlcyBvYmplY3QgY29kZSBzdHJhaWdodCBmcm9tCi0gICBDKysgc291cmNlLCB3aXRob3V0IGdvaW5nIHRocm91Z2ggYW4gYXNzZW1ibGVyLCBpdHMgbWFuZ2xlZAotICAgaWRlbnRpZmllcnMgY2FuIHVzZSBhbGwgc29ydHMgb2YgY2hhcmFjdGVycyB0aGF0IG5vIGFzc2VtYmxlciB3b3VsZAotICAgdG9sZXJhdGUsIHNvIHRoZSBhbHBoYWJldCB0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgaXMgYSBsaXR0bGUgb2RkLgotICAgSGVyZSBhcmUgc29tZSBzYW1wbGUgbWFuZ2xlZCBpZGVudGlmaWVycyBvZmZlcmVkIGJ5IEhQOgotCi0JdHlwZWlkKl9fWFQyNEFkZHJlc3NJbmRFeHBDbGFzc01lbWJlcl8KLQlbVmZ0cHRyXWtleTpfX2R0X18zMk9yZGluYXJ5Q29tcGFyZUluZEV4cENsYXNzTWVtYmVyRnYKLQlfX2N0X19RMl85RWxmNjRfRHluMTh7dW5uYW1lZC51bmlvbi4jMX1GdgotCi0gICBUaGlzIHN0aWxsIHNlZW1zIHJlYWxseSB3ZWlyZCB0byBtZSwgc2luY2Ugbm93aGVyZSBlbHNlIGluIHRoaXMKLSAgIGZpbGUgaXMgdGhlcmUgYW55dGhpbmcgdG8gcmVjb2duaXplIGN1cmx5IGJyYWNrZXRzLCBwYXJlbnMsIGV0Yy4KLSAgIEkndmUgdGFsa2VkIHdpdGggU3Jpa2FudGggPHNyaWthbnRoQGN1cC5ocC5jb20+LCBhbmQgaGUgYXNzdXJlcyBtZQotICAgdGhpcyBpcyByaWdodCwgYnV0IEkgc3RpbGwgc3Ryb25nbHkgc3VzcGVjdCB0aGF0IHRoZXJlJ3MgYQotICAgbWlzdW5kZXJzdGFuZGluZyBoZXJlLgotCi0gICBJZiB3ZSBkZWNpZGUgaXQncyBiZXR0ZXIgZm9yIGMrK2ZpbHQgdG8gdXNlIEhQJ3MgYXNzZW1ibGVyIHN5bnRheAotICAgdG8gc2NyYXBlIGlkZW50aWZpZXJzIG91dCBvZiBpdHMgaW5wdXQsIGhlcmUncyB0aGUgZGVmaW5pdGlvbiBvZgotICAgdGhlIHN5bWJvbCBuYW1lIHN5bnRheCBmcm9tIHRoZSBIUCBhc3NlbWJsZXIgbWFudWFsOgotCi0gICAgICAgU3ltYm9scyBhcmUgY29tcG9zZWQgb2YgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVycywgZGVjaW1hbAotICAgICAgIGRpZ2l0cywgZG9sbGFyIHN5bWJvbCwgcGVyaW9kICguKSwgYW1wZXJzYW5kICgmKSwgcG91bmQgc2lnbigjKSBhbmQKLSAgICAgICB1bmRlcnNjb3JlIChfKS4gQSBzeW1ib2wgY2FuIGJlZ2luIHdpdGggYSBsZXR0ZXIsIGRpZ2l0IHVuZGVyc2NvcmUgb3IKLSAgICAgICBkb2xsYXIgc2lnbi4gSWYgYSBzeW1ib2wgYmVnaW5zIHdpdGggYSBkaWdpdCwgaXQgbXVzdCBjb250YWluIGEKLSAgICAgICBub24tZGlnaXQgY2hhcmFjdGVyLgotCi0gICBTbyBoYXZlIGZ1bi4gICovCi12b2lkCi1ocF9zeW1ib2xfYWxwaGFiZXQgKGNoYXIgKnRhYmxlKQotewotICBjaGFyICpjOwotCi0gIHN0YW5kYXJkX3N5bWJvbF9hbHBoYWJldCAodGFibGUpOwotCi0gIGZvciAoYyA9ICI8PiMsKiZbXTooKXt9IjsgKmM7IGMrKykKLSAgICB0YWJsZVsodW5zaWduZWQgY2hhcikgKmNdID0gMTsKLX0KLQotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgY2hhciAqcmVzdWx0OwotICBpbnQgYzsKLSAgY2hhciBzeW1ib2xfYWxwaGFiZXRbMjU2XTsKLQotICBwcm9ncmFtX25hbWUgPSBhcmd2WzBdOwotCi0gIHN0cmlwX3VuZGVyc2NvcmUgPSBwcmVwZW5kc191bmRlcnNjb3JlOwotCi0gIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiX25zOmoiLCBsb25nX29wdGlvbnMsIChpbnQgKikgMCkpICE9IEVPRikKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgJz8nOgotCSAgdXNhZ2UgKHN0ZGVyciwgMSk7Ci0JICBicmVhazsKLQljYXNlICdoJzoKLQkgIHVzYWdlIChzdGRvdXQsIDApOwotCWNhc2UgJ24nOgotCSAgc3RyaXBfdW5kZXJzY29yZSA9IDA7Ci0JICBicmVhazsKLQljYXNlICd2JzoKLQkgIHByaW50ZiAoIkdOVSAlcyAoQysrIGRlbWFuZ2xlciksIHZlcnNpb24gJXNcbiIsIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV92ZXJzaW9uKTsKLQkgIGV4aXQgKDApOwotCWNhc2UgJ18nOgotCSAgc3RyaXBfdW5kZXJzY29yZSA9IDE7Ci0JICBicmVhazsKLQljYXNlICdqJzoKLQkgIGZsYWdzIHw9IERNR0xfSkFWQTsKLQkgIGJyZWFrOwotCWNhc2UgJ3MnOgotCSAgaWYgKHN0cmNtcCAob3B0YXJnLCAiZ251IikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGdudV9kZW1hbmdsaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImx1Y2lkIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGx1Y2lkX2RlbWFuZ2xpbmc7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHN0cmNtcCAob3B0YXJnLCAiYXJtIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGFybV9kZW1hbmdsaW5nOwotCSAgICB9Ci0JICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImhwIikgPT0gMCkKLQkgICAgewotCSAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGhwX2RlbWFuZ2xpbmc7Ci0JICAgIH0KLSAgICAgICAgICBlbHNlIGlmIChzdHJjbXAgKG9wdGFyZywgImVkZyIpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGN1cnJlbnRfZGVtYW5nbGluZ19zdHlsZSA9IGVkZ19kZW1hbmdsaW5nOwotICAgICAgICAgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6IHVua25vd24gZGVtYW5nbGluZyBzdHlsZSBgJXMnXG4iLAotCQkgICAgICAgcHJvZ3JhbV9uYW1lLCBvcHRhcmcpOwotCSAgICAgIGV4aXQgKDEpOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChvcHRpbmQgPCBhcmdjKQotICAgIHsKLSAgICAgIGZvciAoIDsgb3B0aW5kIDwgYXJnYzsgb3B0aW5kKyspCi0JewotCSAgZGVtYW5nbGVfaXQgKGFyZ3Zbb3B0aW5kXSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHN3aXRjaCAoY3VycmVudF9kZW1hbmdsaW5nX3N0eWxlKQotCXsKLQljYXNlIGdudV9kZW1hbmdsaW5nOgotCWNhc2UgbHVjaWRfZGVtYW5nbGluZzoKLQljYXNlIGFybV9kZW1hbmdsaW5nOgotCWNhc2UgZWRnX2RlbWFuZ2xpbmc6Ci0JICBzdGFuZGFyZF9zeW1ib2xfYWxwaGFiZXQgKHN5bWJvbF9hbHBoYWJldCk7Ci0JICBicmVhazsKLQljYXNlIGhwX2RlbWFuZ2xpbmc6Ci0JICBocF9zeW1ib2xfYWxwaGFiZXQgKHN5bWJvbF9hbHBoYWJldCk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgLyogRm9sa3Mgc2hvdWxkIGV4cGxpY2l0bHkgaW5kaWNhdGUgdGhlIGFwcHJvcHJpYXRlIGFscGhhYmV0IGZvcgotCSAgICAgZWFjaCBkZW1hbmdsaW5nLiAgUHJvdmlkaW5nIGEgZGVmYXVsdCB3b3VsZCBhbGxvdyB0aGUKLQkgICAgIHF1ZXN0aW9uIHRvIGdvIHVuY29uc2lkZXJlZC4gICovCi0JICBhYm9ydCAoKTsKLQl9Ci0KLSAgICAgIGZvciAoOzspCi0JewotCSAgaW50IGkgPSAwOwotCSAgYyA9IGdldGNoYXIgKCk7Ci0JICAvKiBUcnkgdG8gcmVhZCBhIGxhYmVsLiAgKi8KLQkgIHdoaWxlIChjICE9IEVPRiAmJiBzeW1ib2xfYWxwaGFiZXRbY10pCi0JICAgIHsKLQkgICAgICBpZiAoaSA+PSBNQlVGX1NJWkUtMSkKLQkJYnJlYWs7Ci0JICAgICAgbWJ1ZmZlcltpKytdID0gYzsKLQkgICAgICBjID0gZ2V0Y2hhciAoKTsKLQkgICAgfQotCSAgaWYgKGkgPiAwKQotCSAgICB7Ci0JICAgICAgaW50IHNraXBfZmlyc3QgPSAwOwotCi0JICAgICAgaWYgKG1idWZmZXJbMF0gPT0gJy4nKQotCQkrK3NraXBfZmlyc3Q7Ci0JICAgICAgaWYgKHN0cmlwX3VuZGVyc2NvcmUgJiYgbWJ1ZmZlcltza2lwX2ZpcnN0XSA9PSAnXycpCi0JCSsrc2tpcF9maXJzdDsKLQotCSAgICAgIGlmIChza2lwX2ZpcnN0ID4gaSkKLQkJc2tpcF9maXJzdCA9IGk7Ci0KLQkgICAgICBtYnVmZmVyW2ldID0gMDsKLQotCSAgICAgIHJlc3VsdCA9IGNwbHVzX2RlbWFuZ2xlIChtYnVmZmVyICsgc2tpcF9maXJzdCwgZmxhZ3MpOwotCSAgICAgIGlmIChyZXN1bHQpCi0JCXsKLQkJICBpZiAobWJ1ZmZlclswXSA9PSAnLicpCi0JCSAgICBwdXRjICgnLicsIHN0ZG91dCk7Ci0JCSAgZnB1dHMgKHJlc3VsdCwgc3Rkb3V0KTsKLQkJICBmcmVlIChyZXN1bHQpOwotCQl9Ci0JICAgICAgZWxzZQotCQlmcHV0cyAobWJ1ZmZlciwgc3Rkb3V0KTsKLQotCSAgICAgIGZmbHVzaCAoc3Rkb3V0KTsKLQkgICAgfQotCSAgaWYgKGMgPT0gRU9GKQotCSAgICBicmVhazsKLQkgIHB1dGNoYXIgKGMpOwotCX0KLSAgICB9Ci0KLSAgZXhpdCAoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mYXRhbCAoc3RyKQotICAgICBjaGFyICpzdHI7Ci17Ci0gIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgcHJvZ3JhbV9uYW1lLCBzdHIpOwotICBleGl0ICgxKTsKLX0KLQotUFRSCi14bWFsbG9jIChzaXplKQotICBzaXplX3Qgc2l6ZTsKLXsKLSAgcmVnaXN0ZXIgUFRSIHZhbHVlID0gKFBUUikgbWFsbG9jIChzaXplKTsKLSAgaWYgKHZhbHVlID09IDApCi0gICAgZmF0YWwgKCJ2aXJ0dWFsIG1lbW9yeSBleGhhdXN0ZWQiKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1QVFIKLXhyZWFsbG9jIChwdHIsIHNpemUpCi0gIFBUUiBwdHI7Ci0gIHNpemVfdCBzaXplOwotewotICByZWdpc3RlciBQVFIgdmFsdWUgPSAoUFRSKSByZWFsbG9jIChwdHIsIHNpemUpOwotICBpZiAodmFsdWUgPT0gMCkKLSAgICBmYXRhbCAoInZpcnR1YWwgbWVtb3J5IGV4aGF1c3RlZCIpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0jZW5kaWYJLyogbWFpbiAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2ZkbWF0Y2guYyBiL2xpYmliZXJ0eS9mZG1hdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZjAzOWYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2ZkbWF0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIENvbXBhcmUgdHdvIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyB0byBzZWUgaWYgdGhleSByZWZlciB0byB0aGUgc2FtZSBmaWxlLgotICAgQ29weXJpZ2h0IChDKSAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmCi1ub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKgotCi1OQU1FCi0KLQlmZG1hdGNoIC0tIHNlZSBpZiB0d28gZmlsZSBkZXNjcmlwdG9ycyByZWZlciB0byBzYW1lIGZpbGUKLQotU1lOT1BTSVMKLQotCWludCBmZG1hdGNoIChpbnQgZmQxLCBpbnQgZmQyKQotCi1ERVNDUklQVElPTgotCi0JQ2hlY2sgdG8gc2VlIGlmIHR3byBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4KLQlUaGlzIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHdoZW4gd2UgaGF2ZSBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotCWZvciBhbiB1bm5hbWVkIGZpbGUsIGFuZCB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdCB3ZSBiZWxpZXZlIHRvIAotCWNvcnJlc3BvbmQgdG8gdGhhdCBmZC4gIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHdlIGFyZSBleGVjJ2Qgd2l0aAotCWFuIGFscmVhZHkgb3BlbiBmaWxlIChzdGRvdXQgZm9yIGV4YW1wbGUpIG9yIGZyb20gdGhlIFNWUjQgL3Byb2MKLQljYWxscyB0aGF0IHJldHVybiBvcGVuIGZpbGUgZGVzY3JpcHRvcnMgZm9yIG1hcHBlZCBhZGRyZXNzIHNwYWNlcy4KLQlBbGwgd2UgaGF2ZSB0byBkbyBpcyBvcGVuIHRoZSBmaWxlIGJ5IG5hbWUgYW5kIGNoZWNrIHRoZSB0d28gZmlsZQotCWRlc2NyaXB0b3JzIGZvciBhIG1hdGNoLCB3aGljaCBpcyBkb25lIGJ5IGNvbXBhcmluZyBtYWpvciZtaW5vcgotCWRldmljZSBudW1iZXJzIGFuZCBpbm9kZSBudW1iZXJzLgotCi1CVUdTCi0KLQkoRklYTUU6IGRvZXMgdGhpcyB3b3JrIGZvciBuZXR3b3Jrcz8pCi0JSXQgd29ya3MgZm9yIE5GUywgd2hpY2ggYXNzaWducyBhIGRldmljZSBudW1iZXIgdG8gZWFjaCBtb3VudC4KLQotKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLQotaW50IGZkbWF0Y2ggKGZkMSwgZmQyKQotCWludCBmZDE7Ci0JaW50IGZkMjsKLXsKLSAgc3RydWN0IHN0YXQgc2J1ZjE7Ci0gIHN0cnVjdCBzdGF0IHNidWYyOwotCi0gIGlmICgoZnN0YXQgKGZkMSwgJnNidWYxKSA9PSAwKSAmJgotICAgICAgKGZzdGF0IChmZDIsICZzYnVmMikgPT0gMCkgJiYKLSAgICAgIChzYnVmMS5zdF9kZXYgPT0gc2J1ZjIuc3RfZGV2KSAmJgotICAgICAgKHNidWYxLnN0X2lubyA9PSBzYnVmMi5zdF9pbm8pKQotICAgIHsKLSAgICAgIHJldHVybiAoMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmV0dXJuICgwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvZmxvYXRmb3JtYXQuYyBiL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGYyMWU0Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9mbG9hdGZvcm1hdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qIElFRUUgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCByb3V0aW5lcywgZm9yIEdEQiwgdGhlIEdOVSBEZWJ1Z2dlci4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKLSNpbmNsdWRlIDxtYXRoLmg+CQkvKiBsZGV4cCAqLwotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci1leHRlcm4gdm9pZCAqbWVtY3B5ICh2b2lkICpzMSwgY29uc3Qgdm9pZCAqczIsIHNpemVfdCBuKTsKLWV4dGVybiB2b2lkICptZW1zZXQgKHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7Ci0jZWxzZQotZXh0ZXJuIGNoYXIgKm1lbWNweSAoKTsKLWV4dGVybiBjaGFyICptZW1zZXQgKCk7Ci0jZW5kaWYKLQotLyogVGhlIG9kZHMgdGhhdCBDSEFSX0JJVCB3aWxsIGJlIGFueXRoaW5nIGJ1dCA4IGFyZSBsb3cgZW5vdWdoIHRoYXQgSSdtIG5vdAotICAgZ29pbmcgdG8gYm90aGVyIHdpdGggdHJ5aW5nIHRvIG11Y2sgYXJvdW5kIHdpdGggd2hldGhlciBpdCBpcyBkZWZpbmVkIGluCi0gICBhIHN5c3RlbSBoZWFkZXIsIHdoYXQgd2UgZG8gaWYgbm90LCBldGMuICAqLwotI2RlZmluZSBGTE9BVEZPUk1BVF9DSEFSX0JJVCA4Ci0KLS8qIGZsb2F0Zm9ybWF0cyBmb3IgSUVFRSBzaW5nbGUgYW5kIGRvdWJsZSwgYmlnIGFuZCBsaXR0bGUgZW5kaWFuLiAgKi8KLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9iaWcgPQotewotICBmbG9hdGZvcm1hdF9iaWcsIDMyLCAwLCAxLCA4LCAxMjcsIDI1NSwgOSwgMjMsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX3NpbmdsZV9saXR0bGUgPQotewotICBmbG9hdGZvcm1hdF9saXR0bGUsIDMyLCAwLCAxLCA4LCAxMjcsIDI1NSwgOSwgMjMsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pZWVlX2RvdWJsZV9iaWcgPQotewotICBmbG9hdGZvcm1hdF9iaWcsIDY0LCAwLCAxLCAxMSwgMTAyMywgMjA0NywgMTIsIDUyLCBmbG9hdGZvcm1hdF9pbnRiaXRfbm8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfbGl0dGxlID0KLXsKLSAgZmxvYXRmb3JtYXRfbGl0dGxlLCA2NCwgMCwgMSwgMTEsIDEwMjMsIDIwNDcsIDEyLCA1MiwgZmxvYXRmb3JtYXRfaW50Yml0X25vCi19OwotCi0vKiBmbG9hdGZvcm1hdCBmb3IgSUVFRSBkb3VibGUsIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciwgd2l0aCBiaWcgZW5kaWFuIHdvcmQKLSAgIG9yZGVyaW5nLCBhcyBvbiB0aGUgQVJNLiAgKi8KLQotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2xpdHRsZWJ5dGVfYmlnd29yZCA9Ci17Ci0gIGZsb2F0Zm9ybWF0X2xpdHRsZWJ5dGVfYmlnd29yZCwgNjQsIDAsIDEsIDExLCAxMDIzLCAyMDQ3LCAxMiwgNTIsIGZsb2F0Zm9ybWF0X2ludGJpdF9ubwotfTsKLQotY29uc3Qgc3RydWN0IGZsb2F0Zm9ybWF0IGZsb2F0Zm9ybWF0X2kzODdfZXh0ID0KLXsKLSAgZmxvYXRmb3JtYXRfbGl0dGxlLCA4MCwgMCwgMSwgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAxNiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTY4ODgxX2V4dCA9Ci17Ci0gIC8qIE5vdGUgdGhhdCB0aGUgYml0cyBmcm9tIDE2IHRvIDMxIGFyZSB1bnVzZWQuICAqLwotICBmbG9hdGZvcm1hdF9iaWcsIDk2LCAwLCAxLCAxNSwgMHgzZmZmLCAweDdmZmYsIDMyLCA2NCwgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotfTsKLWNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCBmbG9hdGZvcm1hdF9pOTYwX2V4dCA9Ci17Ci0gIC8qIE5vdGUgdGhhdCB0aGUgYml0cyBmcm9tIDAgdG8gMTUgYXJlIHVudXNlZC4gICovCi0gIGZsb2F0Zm9ybWF0X2xpdHRsZSwgOTYsIDE2LCAxNywgMTUsIDB4M2ZmZiwgMHg3ZmZmLCAzMiwgNjQsCi0gIGZsb2F0Zm9ybWF0X2ludGJpdF95ZXMKLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfbTg4MTEwX2V4dCA9Ci17Ci0jaWZkZWYgSEFSUklTX0ZMT0FUX0ZPUk1BVAotICAvKiBIYXJyaXMgdXNlcyByYXcgZm9ybWF0IDEyOCBieXRlcyBsb25nLCBidXQgdGhlIG51bWJlciBpcyBqdXN0IGFuIGllZWUKLSAgICAgZG91YmxlLCBhbmQgdGhlIGxhc3QgNjQgYml0cyBhcmUgd2FzdGVkLiAqLwotICBmbG9hdGZvcm1hdF9iaWcsMTI4LCAwLCAxLCAxMSwgIDB4M2ZmLCAgMHg3ZmYsIDEyLCA1MiwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X25vCi0jZWxzZQotICBmbG9hdGZvcm1hdF9iaWcsIDgwLCAwLCAxLCAxNSwgMHgzZmZmLCAweDdmZmYsIDE2LCA2NCwKLSAgZmxvYXRmb3JtYXRfaW50Yml0X3llcwotI2VuZGlmIC8qIEhBUlJJU19GTE9BVF9GT1JNQVQgKi8KLX07Ci1jb25zdCBzdHJ1Y3QgZmxvYXRmb3JtYXQgZmxvYXRmb3JtYXRfYXJtX2V4dCA9Ci17Ci0gIC8qIEJpdHMgMSB0byAxNiBhcmUgdW51c2VkLiAgKi8KLSAgZmxvYXRmb3JtYXRfYmlnLCA5NiwgMCwgMTcsIDE1LCAweDNmZmYsIDB4N2ZmZiwgMzIsIDY0LAotICBmbG9hdGZvcm1hdF9pbnRiaXRfeWVzCi19OwotDAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0X2ZpZWxkIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwKLQkJCQkJZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzLAotCQkJCQl1bnNpZ25lZCBpbnQsCi0JCQkJCXVuc2lnbmVkIGludCwKLQkJCQkJdW5zaWduZWQgaW50KSk7Ci0KLS8qIEV4dHJhY3QgYSBmaWVsZCB3aGljaCBzdGFydHMgYXQgU1RBUlQgYW5kIGlzIExFTiBieXRlcyBsb25nLiAgREFUQSBhbmQKLSAgIFRPVEFMX0xFTiBhcmUgdGhlIHRoaW5nIHdlIGFyZSBleHRyYWN0aW5nIGl0IGZyb20sIGluIGJ5dGVvcmRlciBPUkRFUi4gICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X2ZpZWxkIChkYXRhLCBvcmRlciwgdG90YWxfbGVuLCBzdGFydCwgbGVuKQotICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwotICAgICBlbnVtIGZsb2F0Zm9ybWF0X2J5dGVvcmRlcnMgb3JkZXI7Ci0gICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW47Ci0gICAgIHVuc2lnbmVkIGludCBzdGFydDsKLSAgICAgdW5zaWduZWQgaW50IGxlbjsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXN1bHQ7Ci0gIHVuc2lnbmVkIGludCBjdXJfYnl0ZTsKLSAgaW50IGN1cl9iaXRzaGlmdDsKLQotICAvKiBTdGFydCBhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgZmllbGQuICAqLwotICBjdXJfYnl0ZSA9IChzdGFydCArIGxlbikgLyBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgaWYgKG9yZGVyID09IGZsb2F0Zm9ybWF0X2xpdHRsZSkKLSAgICBjdXJfYnl0ZSA9ICh0b3RhbF9sZW4gLyBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBjdXJfYnl0ZSAtIDE7Ci0gIGN1cl9iaXRzaGlmdCA9Ci0gICAgKChzdGFydCArIGxlbikgJSBGTE9BVEZPUk1BVF9DSEFSX0JJVCkgLSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgcmVzdWx0ID0gKihkYXRhICsgY3VyX2J5dGUpID4+ICgtY3VyX2JpdHNoaWZ0KTsKLSAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgICsrY3VyX2J5dGU7Ci0gIGVsc2UKLSAgICAtLWN1cl9ieXRlOwotCi0gIC8qIE1vdmUgdG93YXJkcyB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIHdoaWxlIChjdXJfYml0c2hpZnQgPCBsZW4pCi0gICAgewotICAgICAgaWYgKGxlbiAtIGN1cl9iaXRzaGlmdCA8IEZMT0FURk9STUFUX0NIQVJfQklUKQotCS8qIFRoaXMgaXMgdGhlIGxhc3QgYnl0ZTsgemVybyBvdXQgdGhlIGJpdHMgd2hpY2ggYXJlIG5vdCBwYXJ0IG9mCi0JICAgdGhpcyBmaWVsZC4gICovCi0JcmVzdWx0IHw9Ci0JICAoKihkYXRhICsgY3VyX2J5dGUpICYgKCgxIDw8IChsZW4gLSBjdXJfYml0c2hpZnQpKSAtIDEpKQotCSAgICA8PCBjdXJfYml0c2hpZnQ7Ci0gICAgICBlbHNlCi0JcmVzdWx0IHw9ICooZGF0YSArIGN1cl9ieXRlKSA8PCBjdXJfYml0c2hpZnQ7Ci0gICAgICBjdXJfYml0c2hpZnQgKz0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gICAgICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotCSsrY3VyX2J5dGU7Ci0gICAgICBlbHNlCi0JLS1jdXJfYnl0ZTsKLSAgICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0gIAotI2lmbmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotLyogQ29udmVydCBmcm9tIEZNVCB0byBhIGRvdWJsZS4KLSAgIEZST00gaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGV4dGVuZGVkIGZsb2F0LgotICAgU3RvcmUgdGhlIGRvdWJsZSBpbiAqVE8uICAqLwotCi12b2lkCi1mbG9hdGZvcm1hdF90b19kb3VibGUgKGZtdCwgZnJvbSwgdG8pCi0gICAgIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqZm10OwotICAgICBjaGFyICpmcm9tOwotICAgICBkb3VibGUgKnRvOwotewotICB1bnNpZ25lZCBjaGFyICp1ZnJvbSA9ICh1bnNpZ25lZCBjaGFyICopZnJvbTsKLSAgZG91YmxlIGR0bzsKLSAgbG9uZyBleHBvbmVudDsKLSAgdW5zaWduZWQgbG9uZyBtYW50OwotICB1bnNpZ25lZCBpbnQgbWFudF9iaXRzLCBtYW50X29mZjsKLSAgaW50IG1hbnRfYml0c19sZWZ0OwotICBpbnQgc3BlY2lhbF9leHBvbmVudDsJCS8qIEl0J3MgYSBOYU4sIGRlbm9ybSBvciB6ZXJvICovCi0KLSAgZXhwb25lbnQgPSBnZXRfZmllbGQgKHVmcm9tLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsCi0JCQlmbXQtPmV4cF9zdGFydCwgZm10LT5leHBfbGVuKTsKLSAgLyogTm90ZSB0aGF0IGlmIGV4cG9uZW50IGluZGljYXRlcyBhIE5hTiwgd2UgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIHVzZWZ1bAotICAgICAobm90IGtub3dpbmcgaWYgdGhlIGhvc3QgaGFzIE5hTidzLCBvciBob3cgdG8gYnVpbGQgb25lKS4gIFNvIGl0IHdpbGwKLSAgICAgZW5kIHVwIGFzIGFuIGluZmluaXR5IG9yIHNvbWV0aGluZyBjbG9zZTsgdGhhdCBpcyBPSy4gICovCi0KLSAgbWFudF9iaXRzX2xlZnQgPSBmbXQtPm1hbl9sZW47Ci0gIG1hbnRfb2ZmID0gZm10LT5tYW5fc3RhcnQ7Ci0gIGR0byA9IDAuMDsKLQotICBzcGVjaWFsX2V4cG9uZW50ID0gZXhwb25lbnQgPT0gMCB8fCBleHBvbmVudCA9PSBmbXQtPmV4cF9uYW47Ci0KLSAgLyogRG9uJ3QgYmlhcyB6ZXJvJ3MsIGRlbm9ybXMgb3IgTmFOcy4gICovCi0gIGlmICghc3BlY2lhbF9leHBvbmVudCkKLSAgICBleHBvbmVudCAtPSBmbXQtPmV4cF9iaWFzOwotCi0gIC8qIEJ1aWxkIHRoZSByZXN1bHQgYWxnZWJyYWljYWxseS4gIE1pZ2h0IGdvIGluZmluaXRlLCB1bmRlcmZsb3csIGV0YzsKLSAgICAgd2hvIGNhcmVzLiAqLwotCi0gIC8qIElmIHRoaXMgZm9ybWF0IHVzZXMgYSBoaWRkZW4gYml0LCBleHBsaWNpdGx5IGFkZCBpdCBpbiBub3cuICBPdGhlcndpc2UsCi0gICAgIGluY3JlbWVudCB0aGUgZXhwb25lbnQgYnkgb25lIHRvIGFjY291bnQgZm9yIHRoZSBpbnRlZ2VyIGJpdC4gICovCi0KLSAgaWYgKCFzcGVjaWFsX2V4cG9uZW50KQotICAgIHsKLSAgICAgIGlmIChmbXQtPmludGJpdCA9PSBmbG9hdGZvcm1hdF9pbnRiaXRfbm8pCi0JZHRvID0gbGRleHAgKDEuMCwgZXhwb25lbnQpOwotICAgICAgZWxzZQotCWV4cG9uZW50Kys7Ci0gICAgfQotCi0gIHdoaWxlIChtYW50X2JpdHNfbGVmdCA+IDApCi0gICAgewotICAgICAgbWFudF9iaXRzID0gbWluIChtYW50X2JpdHNfbGVmdCwgMzIpOwotCi0gICAgICBtYW50ID0gZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLAotCQkJIG1hbnRfb2ZmLCBtYW50X2JpdHMpOwotCi0gICAgICBkdG8gKz0gbGRleHAgKChkb3VibGUpbWFudCwgZXhwb25lbnQgLSBtYW50X2JpdHMpOwotICAgICAgZXhwb25lbnQgLT0gbWFudF9iaXRzOwotICAgICAgbWFudF9vZmYgKz0gbWFudF9iaXRzOwotICAgICAgbWFudF9iaXRzX2xlZnQgLT0gbWFudF9iaXRzOwotICAgIH0KLQotICAvKiBOZWdhdGUgaXQgaWYgbmVnYXRpdmUuICAqLwotICBpZiAoZ2V0X2ZpZWxkICh1ZnJvbSwgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPnNpZ25fc3RhcnQsIDEpKQotICAgIGR0byA9IC1kdG87Ci0gICp0byA9IGR0bzsKLX0KLQwKLXN0YXRpYyB2b2lkIHB1dF9maWVsZCBQQVJBTVMgKCh1bnNpZ25lZCBjaGFyICosIGVudW0gZmxvYXRmb3JtYXRfYnl0ZW9yZGVycywKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50LAotCQkJICAgICAgIHVuc2lnbmVkIGludCwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFNldCBhIGZpZWxkIHdoaWNoIHN0YXJ0cyBhdCBTVEFSVCBhbmQgaXMgTEVOIGJ5dGVzIGxvbmcuICBEQVRBIGFuZAotICAgVE9UQUxfTEVOIGFyZSB0aGUgdGhpbmcgd2UgYXJlIGV4dHJhY3RpbmcgaXQgZnJvbSwgaW4gYnl0ZW9yZGVyIE9SREVSLiAgKi8KLXN0YXRpYyB2b2lkCi1wdXRfZmllbGQgKGRhdGEsIG9yZGVyLCB0b3RhbF9sZW4sIHN0YXJ0LCBsZW4sIHN0dWZmX3RvX3B1dCkKLSAgICAgdW5zaWduZWQgY2hhciAqZGF0YTsKLSAgICAgZW51bSBmbG9hdGZvcm1hdF9ieXRlb3JkZXJzIG9yZGVyOwotICAgICB1bnNpZ25lZCBpbnQgdG90YWxfbGVuOwotICAgICB1bnNpZ25lZCBpbnQgc3RhcnQ7Ci0gICAgIHVuc2lnbmVkIGludCBsZW47Ci0gICAgIHVuc2lnbmVkIGxvbmcgc3R1ZmZfdG9fcHV0OwotewotICB1bnNpZ25lZCBpbnQgY3VyX2J5dGU7Ci0gIGludCBjdXJfYml0c2hpZnQ7Ci0KLSAgLyogU3RhcnQgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIGZpZWxkLiAgKi8KLSAgY3VyX2J5dGUgPSAoc3RhcnQgKyBsZW4pIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0gICAgY3VyX2J5dGUgPSAodG90YWxfbGVuIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gY3VyX2J5dGUgLSAxOwotICBjdXJfYml0c2hpZnQgPQotICAgICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gRkxPQVRGT1JNQVRfQ0hBUl9CSVQ7Ci0gICooZGF0YSArIGN1cl9ieXRlKSAmPQotICAgIH4oKCgxIDw8ICgoc3RhcnQgKyBsZW4pICUgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpKSAtIDEpIDw8ICgtY3VyX2JpdHNoaWZ0KSk7Ci0gICooZGF0YSArIGN1cl9ieXRlKSB8PQotICAgIChzdHVmZl90b19wdXQgJiAoKDEgPDwgRkxPQVRGT1JNQVRfQ0hBUl9CSVQpIC0gMSkpIDw8ICgtY3VyX2JpdHNoaWZ0KTsKLSAgY3VyX2JpdHNoaWZ0ICs9IEZMT0FURk9STUFUX0NIQVJfQklUOwotICBpZiAob3JkZXIgPT0gZmxvYXRmb3JtYXRfbGl0dGxlKQotICAgICsrY3VyX2J5dGU7Ci0gIGVsc2UKLSAgICAtLWN1cl9ieXRlOwotCi0gIC8qIE1vdmUgdG93YXJkcyB0aGUgbW9zdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBmaWVsZC4gICovCi0gIHdoaWxlIChjdXJfYml0c2hpZnQgPCBsZW4pCi0gICAgewotICAgICAgaWYgKGxlbiAtIGN1cl9iaXRzaGlmdCA8IEZMT0FURk9STUFUX0NIQVJfQklUKQotCXsKLQkgIC8qIFRoaXMgaXMgdGhlIGxhc3QgYnl0ZS4gICovCi0JICAqKGRhdGEgKyBjdXJfYnl0ZSkgJj0KLQkgICAgfigoMSA8PCAobGVuIC0gY3VyX2JpdHNoaWZ0KSkgLSAxKTsKLQkgICooZGF0YSArIGN1cl9ieXRlKSB8PSAoc3R1ZmZfdG9fcHV0ID4+IGN1cl9iaXRzaGlmdCk7Ci0JfQotICAgICAgZWxzZQotCSooZGF0YSArIGN1cl9ieXRlKSA9ICgoc3R1ZmZfdG9fcHV0ID4+IGN1cl9iaXRzaGlmdCkKLQkJCSAgICAgICYgKCgxIDw8IEZMT0FURk9STUFUX0NIQVJfQklUKSAtIDEpKTsKLSAgICAgIGN1cl9iaXRzaGlmdCArPSBGTE9BVEZPUk1BVF9DSEFSX0JJVDsKLSAgICAgIGlmIChvcmRlciA9PSBmbG9hdGZvcm1hdF9saXR0bGUpCi0JKytjdXJfYnl0ZTsKLSAgICAgIGVsc2UKLQktLWN1cl9ieXRlOwotICAgIH0KLX0KLQotLyogVGhlIGNvbnZlcnNlOiBjb252ZXJ0IHRoZSBkb3VibGUgKkZST00gdG8gYW4gZXh0ZW5kZWQgZmxvYXQKLSAgIGFuZCBzdG9yZSB3aGVyZSBUTyBwb2ludHMuICBOZWl0aGVyIEZST00gbm9yIFRPIGhhdmUgYW55IGFsaWdubWVudAotICAgcmVzdHJpY3Rpb25zLiAgKi8KLQotdm9pZAotZmxvYXRmb3JtYXRfZnJvbV9kb3VibGUgKGZtdCwgZnJvbSwgdG8pCi0gICAgIGNvbnN0IHN0cnVjdCBmbG9hdGZvcm1hdCAqZm10OwotICAgICBkb3VibGUgKmZyb207Ci0gICAgIGNoYXIgKnRvOwotewotICBkb3VibGUgZGZyb207Ci0gIGludCBleHBvbmVudDsKLSAgZG91YmxlIG1hbnQ7Ci0gIHVuc2lnbmVkIGludCBtYW50X2JpdHMsIG1hbnRfb2ZmOwotICBpbnQgbWFudF9iaXRzX2xlZnQ7Ci0gIHVuc2lnbmVkIGNoYXIgKnV0byA9ICh1bnNpZ25lZCBjaGFyICopdG87Ci0KLSAgbWVtY3B5ICgmZGZyb20sIGZyb20sIHNpemVvZiAoZGZyb20pKTsKLSAgbWVtc2V0ICh1dG8sIDAsIGZtdC0+dG90YWxzaXplIC8gRkxPQVRGT1JNQVRfQ0hBUl9CSVQpOwotICBpZiAoZGZyb20gPT0gMCkKLSAgICByZXR1cm47CQkJLyogUmVzdWx0IGlzIHplcm8gKi8KLSAgaWYgKGRmcm9tICE9IGRmcm9tKQotICAgIHsKLSAgICAgIC8qIEZyb20gaXMgTmFOICovCi0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPmV4cF9zdGFydCwKLQkJIGZtdC0+ZXhwX2xlbiwgZm10LT5leHBfbmFuKTsKLSAgICAgIC8qIEJlIHN1cmUgaXQncyBub3QgaW5maW5pdHksIGJ1dCBOYU4gdmFsdWUgaXMgaXJyZWwgKi8KLSAgICAgIHB1dF9maWVsZCAodXRvLCBmbXQtPmJ5dGVvcmRlciwgZm10LT50b3RhbHNpemUsIGZtdC0+bWFuX3N0YXJ0LAotCQkgMzIsIDEpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAvKiBJZiBuZWdhdGl2ZSwgc2V0IHRoZSBzaWduIGJpdC4gICovCi0gIGlmIChkZnJvbSA8IDApCi0gICAgewotICAgICAgcHV0X2ZpZWxkICh1dG8sIGZtdC0+Ynl0ZW9yZGVyLCBmbXQtPnRvdGFsc2l6ZSwgZm10LT5zaWduX3N0YXJ0LCAxLCAxKTsKLSAgICAgIGRmcm9tID0gLWRmcm9tOwotICAgIH0KLQotICAvKiBIb3cgdG8gdGVsbCBhbiBpbmZpbml0eSBmcm9tIGFuIG9yZGluYXJ5IG51bWJlcj8gIEZJWE1FLXNvbWVkYXkgKi8KLQotICBtYW50ID0gZnJleHAgKGRmcm9tLCAmZXhwb25lbnQpOwotICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLCBmbXQtPmV4cF9zdGFydCwgZm10LT5leHBfbGVuLAotCSAgICAgZXhwb25lbnQgKyBmbXQtPmV4cF9iaWFzIC0gMSk7Ci0KLSAgbWFudF9iaXRzX2xlZnQgPSBmbXQtPm1hbl9sZW47Ci0gIG1hbnRfb2ZmID0gZm10LT5tYW5fc3RhcnQ7Ci0gIHdoaWxlIChtYW50X2JpdHNfbGVmdCA+IDApCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyBtYW50X2xvbmc7Ci0gICAgICBtYW50X2JpdHMgPSBtYW50X2JpdHNfbGVmdCA8IDMyID8gbWFudF9iaXRzX2xlZnQgOiAzMjsKLQotICAgICAgbWFudCAqPSA0Mjk0OTY3Mjk2LjA7Ci0gICAgICBtYW50X2xvbmcgPSAodW5zaWduZWQgbG9uZyltYW50OwotICAgICAgbWFudCAtPSBtYW50X2xvbmc7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnRlZ2VyIGJpdCBpcyBpbXBsaWNpdCwgdGhlbiB3ZSBuZWVkIHRvIGRpc2NhcmQgaXQuCi0JIElmIHdlIGFyZSBkaXNjYXJkaW5nIGEgemVybywgd2Ugc2hvdWxkIGJlIChidXQgYXJlIG5vdCkgY3JlYXRpbmcKLQkgYSBkZW5vcm1hbGl6ZWQJbnVtYmVyIHdoaWNoIG1lYW5zIGFkanVzdGluZyB0aGUgZXhwb25lbnQKLQkgKEkgdGhpbmspLiAgKi8KLSAgICAgIGlmIChtYW50X2JpdHNfbGVmdCA9PSBmbXQtPm1hbl9sZW4KLQkgICYmIGZtdC0+aW50Yml0ID09IGZsb2F0Zm9ybWF0X2ludGJpdF9ubykKLQl7Ci0JICBtYW50X2xvbmcgJj0gMHg3ZmZmZmZmZjsKLQkgIG1hbnRfYml0cyAtPSAxOwotCX0KLSAgICAgIGVsc2UgaWYgKG1hbnRfYml0cyA8IDMyKQotCXsKLQkgIC8qIFRoZSBiaXRzIHdlIHdhbnQgYXJlIGluIHRoZSBtb3N0IHNpZ25pZmljYW50IE1BTlRfQklUUyBiaXRzIG9mCi0JICAgICBtYW50X2xvbmcuICBNb3ZlIHRoZW0gdG8gdGhlIGxlYXN0IHNpZ25pZmljYW50LiAgKi8KLQkgIG1hbnRfbG9uZyA+Pj0gMzIgLSBtYW50X2JpdHM7Ci0JfQotCi0gICAgICBwdXRfZmllbGQgKHV0bywgZm10LT5ieXRlb3JkZXIsIGZtdC0+dG90YWxzaXplLAotCQkgbWFudF9vZmYsIG1hbnRfYml0cywgbWFudF9sb25nKTsKLSAgICAgIG1hbnRfb2ZmICs9IG1hbnRfYml0czsKLSAgICAgIG1hbnRfYml0c19sZWZ0IC09IG1hbnRfYml0czsKLSAgICB9Ci19Ci0KLQotI2lmZGVmIElFRUVfREVCVUcKLQotLyogVGhpcyBpcyB0byBiZSBydW4gb24gYSBob3N0IHdoaWNoIHVzZXMgSUVFRSBmbG9hdGluZyBwb2ludC4gICovCi0KLXZvaWQKLWllZWVfdGVzdCAobikKLSAgICAgZG91YmxlIG47Ci17Ci0gIGRvdWJsZSByZXN1bHQ7Ci0gIGNoYXIgZXh0ZW5bMTZdOwotCi0gIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZywgJm4sICZyZXN1bHQpOwotICBpZiAobiAhPSByZXN1bHQpCi0gICAgcHJpbnRmICgiRGlmZmVyKHRvKTogJS4yMGcgLT4gJS4yMGdcbiIsIG4sIHJlc3VsdCk7Ci0gIGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlICgmZmxvYXRmb3JtYXRfaWVlZV9kb3VibGVfYmlnLCAmbiwgJnJlc3VsdCk7Ci0gIGlmIChuICE9IHJlc3VsdCkKLSAgICBwcmludGYgKCJEaWZmZXIoZnJvbSk6ICUuMjBnIC0+ICUuMjBnXG4iLCBuLCByZXN1bHQpOwotCi0gIGZsb2F0Zm9ybWF0X2Zyb21fZG91YmxlICgmZmxvYXRmb3JtYXRfbTY4ODgxX2V4dCwgJm4sIGV4dGVuKTsKLSAgZmxvYXRmb3JtYXRfdG9fZG91YmxlICgmZmxvYXRmb3JtYXRfbTY4ODgxX2V4dCwgZXh0ZW4sICZyZXN1bHQpOwotICBpZiAobiAhPSByZXN1bHQpCi0gICAgcHJpbnRmICgiRGlmZmVyKHRvK2Zyb20pOiAlLjIwZyAtPiAlLjIwZ1xuIiwgbiwgcmVzdWx0KTsKLQotI2lmIElFRUVfREVCVUcgPiAxCi0gIC8qIFRoaXMgaXMgdG8gYmUgcnVuIG9uIGEgaG9zdCB3aGljaCB1c2VzIDY4ODgxIGZvcm1hdC4gICovCi0gIHsKLSAgICBsb25nIGRvdWJsZSBleCA9ICoobG9uZyBkb3VibGUgKilleHRlbjsKLSAgICBpZiAoZXggIT0gbikKLSAgICAgIHByaW50ZiAoIkRpZmZlcihmcm9tIHZzLiBleHRlbmRlZCk6ICUuMjBnXG4iLCBuKTsKLSAgfQotI2VuZGlmCi19Ci0KLWludAotbWFpbiAoKQotewotICBpZWVlX3Rlc3QgKDAuNSk7Ci0gIGllZWVfdGVzdCAoMjU2LjApOwotICBpZWVlX3Rlc3QgKDAuMTIzNDUpOwotICBpZWVlX3Rlc3QgKDIzNDIzNS43ODkwNzIzNCk7Ci0gIGllZWVfdGVzdCAoLTUxMi4wKTsKLSAgaWVlZV90ZXN0ICgtMC4wMDQzMjEpOwotICByZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2ZubWF0Y2guYyBiL2xpYmliZXJ0eS9mbm1hdGNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOWJmZTYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2ZubWF0Y2guYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLU5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi1CdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAcHJlcC5haS5taXQuZWR1LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci1sYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpZiBkZWZpbmVkIChDT05GSUdfQlJPS0VUUykKLS8qIFdlIHVzZSA8Y29uZmlnLmg+IGluc3RlYWQgb2YgImNvbmZpZy5oIiBzbyB0aGF0IGEgY29tcGlsYXRpb24KLSAgIHVzaW5nIC1JLiAtSSRzcmNkaXIgd2lsbCB1c2UgLi9jb25maWcuaCByYXRoZXIgdGhhbiAkc3JjZGlyL2NvbmZpZy5oCi0gICAod2hpY2ggaXQgd291bGQgZG8gYmVjYXVzZSBpdCBmb3VuZCB0aGlzIGZpbGUgaW4gJHNyY2RpcikuICAqLwotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2Vsc2UKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmbmRlZiBfR05VX1NPVVJDRQotI2RlZmluZSBfR05VX1NPVVJDRQotI2VuZGlmCi0KLS8qIFRoaXMgY29kZSB0byB1bmRlZiBjb25zdCBhZGRlZCBpbiBsaWJpYmVydHkuICAqLwotI2lmbmRlZiBfX1NURENfXwotLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCi0gICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLwotI2lmbmRlZiBjb25zdAotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8Zm5tYXRjaC5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0KLQotLyogQ29tbWVudCBvdXQgYWxsIHRoaXMgY29kZSBpZiB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIExpYnJhcnksIGFuZCBhcmUgbm90Ci0gICBhY3R1YWxseSBjb21waWxpbmcgdGhlIGxpYnJhcnkgaXRzZWxmLiAgVGhpcyBjb2RlIGlzIHBhcnQgb2YgdGhlIEdOVSBDCi0gICBMaWJyYXJ5LCBidXQgYWxzbyBpbmNsdWRlZCBpbiBtYW55IG90aGVyIEdOVSBkaXN0cmlidXRpb25zLiAgQ29tcGlsaW5nCi0gICBhbmQgbGlua2luZyBpbiB0aGlzIGNvZGUgaXMgYSB3YXN0ZSB3aGVuIHVzaW5nIHRoZSBHTlUgQyBsaWJyYXJ5Ci0gICAoZXNwZWNpYWxseSBpZiBpdCBpcyBhIHNoYXJlZCBsaWJyYXJ5KS4gIFJhdGhlciB0aGFuIGhhdmluZyBldmVyeSBHTlUKLSAgIHByb2dyYW0gdW5kZXJzdGFuZCBgY29uZmlndXJlIC0td2l0aC1nbnUtbGliYycgYW5kIG9taXQgdGhlIG9iamVjdCBmaWxlcywKLSAgIGl0IGlzIHNpbXBsZXIgdG8ganVzdCBkbyB0aGlzIGluIHRoZSBzb3VyY2UgZm9yIGVhY2ggc3VjaCBmaWxlLiAgKi8KLQotI2lmIGRlZmluZWQgKF9MSUJDKSB8fCAhZGVmaW5lZCAoX19HTlVfTElCUkFSWV9fKQotCi0KLSNpZiAhZGVmaW5lZChfX0dOVV9MSUJSQVJZX18pICYmICFkZWZpbmVkKFNURENfSEVBREVSUykKLWV4dGVybiBpbnQgZXJybm87Ci0jZW5kaWYKLQotLyogTWF0Y2ggU1RSSU5HIGFnYWluc3QgdGhlIGZpbGVuYW1lIHBhdHRlcm4gUEFUVEVSTiwgcmV0dXJuaW5nIHplcm8gaWYKLSAgIGl0IG1hdGNoZXMsIG5vbnplcm8gaWYgbm90LiAgKi8KLWludAotZm5tYXRjaCAocGF0dGVybiwgc3RyaW5nLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcGF0dGVybjsKLSAgICAgY29uc3QgY2hhciAqc3RyaW5nOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnAgPSBwYXR0ZXJuLCAqbiA9IHN0cmluZzsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciBjOwotCi0vKiBOb3RlIHRoYXQgdGhpcyBldmFsdXRlcyBDIG1hbnkgdGltZXMuICAqLwotI2RlZmluZSBGT0xEKGMpCSgoZmxhZ3MgJiBGTk1fQ0FTRUZPTEQpICYmIGlzdXBwZXIgKGMpID8gdG9sb3dlciAoYykgOiAoYykpCi0KLSAgd2hpbGUgKChjID0gKnArKykgIT0gJ1wwJykKLSAgICB7Ci0gICAgICBjID0gRk9MRCAoYyk7Ci0KLSAgICAgIHN3aXRjaCAoYykKLQl7Ci0JY2FzZSAnPyc6Ci0JICBpZiAoKm4gPT0gJ1wwJykKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgZWxzZSBpZiAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgKm4gPT0gJy8nKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JICBlbHNlIGlmICgoZmxhZ3MgJiBGTk1fUEVSSU9EKSAmJiAqbiA9PSAnLicgJiYKLQkJICAgKG4gPT0gc3RyaW5nIHx8ICgoZmxhZ3MgJiBGTk1fRklMRV9OQU1FKSAmJiBuWy0xXSA9PSAnLycpKSkKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgYnJlYWs7Ci0KLQljYXNlICdcXCc6Ci0JICBpZiAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkpCi0JICAgIHsKLQkgICAgICBjID0gKnArKzsKLQkgICAgICBjID0gRk9MRCAoYyk7Ci0JICAgIH0KLQkgIGlmIChGT0xEICgodW5zaWduZWQgY2hhcikqbikgIT0gYykKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgYnJlYWs7Ci0KLQljYXNlICcqJzoKLQkgIGlmICgoZmxhZ3MgJiBGTk1fUEVSSU9EKSAmJiAqbiA9PSAnLicgJiYKLQkgICAgICAobiA9PSBzdHJpbmcgfHwgKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmIG5bLTFdID09ICcvJykpKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkgIGZvciAoYyA9ICpwKys7IGMgPT0gJz8nIHx8IGMgPT0gJyonOyBjID0gKnArKywgKytuKQotCSAgICBpZiAoKChmbGFncyAmIEZOTV9GSUxFX05BTUUpICYmICpuID09ICcvJykgfHwKLQkJKGMgPT0gJz8nICYmICpuID09ICdcMCcpKQotCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCSAgaWYgKGMgPT0gJ1wwJykKLQkgICAgcmV0dXJuIDA7Ci0KLQkgIHsKLQkgICAgdW5zaWduZWQgY2hhciBjMSA9ICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpID8gKnAgOiBjOwotCSAgICBjMSA9IEZPTEQgKGMxKTsKLQkgICAgZm9yICgtLXA7ICpuICE9ICdcMCc7ICsrbikKLQkgICAgICBpZiAoKGMgPT0gJ1snIHx8IEZPTEQgKCh1bnNpZ25lZCBjaGFyKSpuKSA9PSBjMSkgJiYKLQkJICBmbm1hdGNoIChwLCBuLCBmbGFncyAmIH5GTk1fUEVSSU9EKSA9PSAwKQotCQlyZXR1cm4gMDsKLQkgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgfQotCi0JY2FzZSAnWyc6Ci0JICB7Ci0JICAgIC8qIE5vbnplcm8gaWYgdGhlIHNlbnNlIG9mIHRoZSBjaGFyYWN0ZXIgY2xhc3MgaXMgaW52ZXJ0ZWQuICAqLwotCSAgICByZWdpc3RlciBpbnQgbm90OwotCi0JICAgIGlmICgqbiA9PSAnXDAnKQotCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQotCSAgICBpZiAoKGZsYWdzICYgRk5NX1BFUklPRCkgJiYgKm4gPT0gJy4nICYmCi0JCShuID09IHN0cmluZyB8fCAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgblstMV0gPT0gJy8nKSkpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JICAgIG5vdCA9ICgqcCA9PSAnIScgfHwgKnAgPT0gJ14nKTsKLQkgICAgaWYgKG5vdCkKLQkgICAgICArK3A7Ci0KLQkgICAgYyA9ICpwKys7Ci0JICAgIGZvciAoOzspCi0JICAgICAgewotCQlyZWdpc3RlciB1bnNpZ25lZCBjaGFyIGNzdGFydCA9IGMsIGNlbmQgPSBjOwotCi0JCWlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpCi0JCSAgY3N0YXJ0ID0gY2VuZCA9ICpwKys7Ci0KLQkJY3N0YXJ0ID0gY2VuZCA9IEZPTEQgKGNzdGFydCk7Ci0KLQkJaWYgKGMgPT0gJ1wwJykKLQkJICAvKiBbICh1bnRlcm1pbmF0ZWQpIGxvc2VzLiAgKi8KLQkJICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkJYyA9ICpwKys7Ci0JCWMgPSBGT0xEIChjKTsKLQotCQlpZiAoKGZsYWdzICYgRk5NX0ZJTEVfTkFNRSkgJiYgYyA9PSAnLycpCi0JCSAgLyogWy9dIGNhbiBuZXZlciBtYXRjaC4gICovCi0JCSAgcmV0dXJuIEZOTV9OT01BVENIOwotCi0JCWlmIChjID09ICctJyAmJiAqcCAhPSAnXScpCi0JCSAgewotCQkgICAgY2VuZCA9ICpwKys7Ci0JCSAgICBpZiAoIShmbGFncyAmIEZOTV9OT0VTQ0FQRSkgJiYgY2VuZCA9PSAnXFwnKQotCQkgICAgICBjZW5kID0gKnArKzsKLQkJICAgIGlmIChjZW5kID09ICdcMCcpCi0JCSAgICAgIHJldHVybiBGTk1fTk9NQVRDSDsKLQkJICAgIGNlbmQgPSBGT0xEIChjZW5kKTsKLQotCQkgICAgYyA9ICpwKys7Ci0JCSAgfQotCi0JCWlmIChGT0xEICgodW5zaWduZWQgY2hhcikqbikgPj0gY3N0YXJ0Ci0JCSAgICAmJiBGT0xEICgodW5zaWduZWQgY2hhcikqbikgPD0gY2VuZCkKLQkJICBnb3RvIG1hdGNoZWQ7Ci0KLQkJaWYgKGMgPT0gJ10nKQotCQkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgaWYgKCFub3QpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgICBicmVhazsKLQotCSAgbWF0Y2hlZDo7Ci0JICAgIC8qIFNraXAgdGhlIHJlc3Qgb2YgdGhlIFsuLi5dIHRoYXQgYWxyZWFkeSBtYXRjaGVkLiAgKi8KLQkgICAgd2hpbGUgKGMgIT0gJ10nKQotCSAgICAgIHsKLQkJaWYgKGMgPT0gJ1wwJykKLQkJICAvKiBbLi4uICh1bnRlcm1pbmF0ZWQpIGxvc2VzLiAgKi8KLQkJICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0KLQkJYyA9ICpwKys7Ci0JCWlmICghKGZsYWdzICYgRk5NX05PRVNDQVBFKSAmJiBjID09ICdcXCcpCi0JCSAgLyogWFhYIDEwMDMuMmQxMSBpcyB1bmNsZWFyIGlmIHRoaXMgaXMgcmlnaHQuICAqLwotCQkgICsrcDsKLQkgICAgICB9Ci0JICAgIGlmIChub3QpCi0JICAgICAgcmV0dXJuIEZOTV9OT01BVENIOwotCSAgfQotCSAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgaWYgKGMgIT0gRk9MRCAoKHVuc2lnbmVkIGNoYXIpKm4pKQotCSAgICByZXR1cm4gRk5NX05PTUFUQ0g7Ci0JfQotCi0gICAgICArK247Ci0gICAgfQotCi0gIGlmICgqbiA9PSAnXDAnKQotICAgIHJldHVybiAwOwotCi0gIGlmICgoZmxhZ3MgJiBGTk1fTEVBRElOR19ESVIpICYmICpuID09ICcvJykKLSAgICAvKiBUaGUgRk5NX0xFQURJTkdfRElSIGZsYWcgc2F5cyB0aGF0ICJmb28qIiBtYXRjaGVzICJmb29iYXIvZnJvYm96eiIuICAqLwotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBGTk1fTk9NQVRDSDsKLX0KLQotI2VuZGlmCS8qIF9MSUJDIG9yIG5vdCBfX0dOVV9MSUJSQVJZX18uICAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldGN3ZC5jIGIvbGliaWJlcnR5L2dldGN3ZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmQ1NWMwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9nZXRjd2QuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qIEVtdWxhdGUgZ2V0Y3dkIHVzaW5nIGdldHdkLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyoKLU5BTUUKLQlnZXRjd2QgLS0gZ2V0IGFic29sdXRlIHBhdGhuYW1lIGZvciBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Ci0KLVNZTk9QU0lTCi0JY2hhciAqZ2V0Y3dkIChjaGFyIHBhdGhuYW1lW2xlbl0sIGxlbikKLQotREVTQ1JJUFRJT04KLQlDb3B5IHRoZSBhYnNvbHV0ZSBwYXRobmFtZSBmb3IgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaW50bwotCXRoZSBzdXBwbGllZCBidWZmZXIgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlci4gIElmIHRoZSAKLQljdXJyZW50IGRpcmVjdG9yeSdzIHBhdGggZG9lc24ndCBmaXQgaW4gTEVOIGNoYXJhY3RlcnMsIHRoZSByZXN1bHQKLQlpcyBOVUxMIGFuZCBlcnJubyBpcyBzZXQuCi0KLUJVR1MKLQlFbXVsYXRlZCB2aWEgdGhlIGdldHdkKCkgY2FsbCwgd2hpY2ggaXMgcmVhc29uYWJsZSBmb3IgbW9zdAotCXN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBnZXRjd2QoKS4KLQotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotZXh0ZXJuIGNoYXIgKmdldHdkICgpOwotZXh0ZXJuIGludCBlcnJubzsKLQotI2lmbmRlZiBNQVhQQVRITEVOCi0jZGVmaW5lIE1BWFBBVEhMRU4gMTAyNAotI2VuZGlmCi0KLWNoYXIgKgotZ2V0Y3dkIChidWYsIGxlbikKLSAgY2hhciAqYnVmOwotICBpbnQgbGVuOwotewotICBjaGFyIG91cmJ1ZltNQVhQQVRITEVOXTsKLSAgY2hhciAqcmVzdWx0OwotCi0gIHJlc3VsdCA9IGdldHdkIChvdXJidWYpOwotICBpZiAocmVzdWx0KSB7Ci0gICAgaWYgKHN0cmxlbiAob3VyYnVmKSA+PSBsZW4pIHsKLSAgICAgIGVycm5vID0gRVJBTkdFOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHN0cmNweSAoYnVmLCBvdXJidWYpOwotICB9Ci0gIHJldHVybiBidWY7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvZ2V0b3B0LmMgYi9saWJpYmVydHkvZ2V0b3B0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTUzMWUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldG9wdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NiArMCwwIEBACi0vKiBHZXRvcHQgZm9yIEdOVS4KLSAgIE5PVEU6IGdldG9wdCBpcyBub3cgcGFydCBvZiB0aGUgQyBsaWJyYXJ5LCBzbyBpZiB5b3UgZG9uJ3Qga25vdyB3aGF0Ci0gICAiS2VlcCB0aGlzIGZpbGUgbmFtZS1zcGFjZSBjbGVhbiIgbWVhbnMsIHRhbGsgdG8gZHJlcHBlckBnbnUub3JnCi0gICBiZWZvcmUgY2hhbmdpbmcgaXQhCi0KLSAgIENvcHlyaWdodCAoQykgMTk4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCA5NiwgOTcsIDk4Ci0gICAJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0MCi0vKiBUaGlzIHRlbGxzIEFscGhhIE9TRi8xIG5vdCB0byBkZWZpbmUgYSBnZXRvcHQgcHJvdG90eXBlIGluIDxzdGRpby5oPi4KLSAgIERpdHRvIGZvciBBSVggMy4yIGFuZCA8c3RkbGliLmg+LiAgKi8KLSNpZm5kZWYgX05PX1BST1RPCi0jIGRlZmluZSBfTk9fUFJPVE8KLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotIyBpbmNsdWRlIDxjb25maWcuaD4KLSNlbmRpZgotCi0jaWYgIWRlZmluZWQgX19TVERDX18gfHwgIV9fU1REQ19fCi0vKiBUaGlzIGlzIGEgc2VwYXJhdGUgY29uZGl0aW9uYWwgc2luY2Ugc29tZSBzdGRjIHN5c3RlbXMKLSAgIHJlamVjdCBgZGVmaW5lZCAoY29uc3QpJy4gICovCi0jIGlmbmRlZiBjb25zdAotIyAgZGVmaW5lIGNvbnN0Ci0jIGVuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAotICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZi4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQwotICAgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZwotICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQotICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCi0gICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QgZmlsZXMsCi0gICBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCi0KLSNkZWZpbmUgR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OIDIKLSNpZiAhZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBfX0dMSUJDX18gPj0gMgotIyBpbmNsdWRlIDxnbnUtdmVyc2lvbnMuaD4KLSMgaWYgX0dOVV9HRVRPUFRfSU5URVJGQUNFX1ZFUlNJT04gPT0gR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OCi0jICBkZWZpbmUgRUxJREVfQ09ERQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRUxJREVfQ09ERQotCi0KLS8qIFRoaXMgbmVlZHMgdG8gY29tZSBhZnRlciBzb21lIGxpYnJhcnkgI2luY2x1ZGUKLSAgIHRvIGdldCBfX0dOVV9MSUJSQVJZX18gZGVmaW5lZC4gICovCi0jaWZkZWYJX19HTlVfTElCUkFSWV9fCi0vKiBEb24ndCBpbmNsdWRlIHN0ZGxpYi5oIGZvciBub24tR05VIEMgbGlicmFyaWVzIGJlY2F1c2Ugc29tZSBvZiB0aGVtCi0gICBjb250YWluIGNvbmZsaWN0aW5nIHByb3RvdHlwZXMgZm9yIGdldG9wdC4gICovCi0jIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgkvKiBHTlUgQyBsaWJyYXJ5LiAgKi8KLQotI2lmZGVmIFZNUwotIyBpbmNsdWRlIDx1bml4bGliLmg+Ci0jIGlmIEhBVkVfU1RSSU5HX0ggLSAwCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIF8KLS8qIFRoaXMgaXMgZm9yIG90aGVyIEdOVSBkaXN0cmlidXRpb25zIHdpdGggaW50ZXJuYXRpb25hbGl6ZWQgbWVzc2FnZXMuCi0gICBXaGVuIGNvbXBpbGluZyBsaWJjLCB0aGUgXyBtYWNybyBpcyBwcmVkZWZpbmVkLiAgKi8KLSMgaWZkZWYgSEFWRV9MSUJJTlRMX0gKLSMgIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgIGRlZmluZSBfKG1zZ2lkKQlnZXR0ZXh0IChtc2dpZCkKLSMgZWxzZQotIyAgZGVmaW5lIF8obXNnaWQpCShtc2dpZCkKLSMgZW5kaWYKLSNlbmRpZgotCi0vKiBUaGlzIHZlcnNpb24gb2YgYGdldG9wdCcgYXBwZWFycyB0byB0aGUgY2FsbGVyIGxpa2Ugc3RhbmRhcmQgVW5peCBgZ2V0b3B0JwotICAgYnV0IGl0IGJlaGF2ZXMgZGlmZmVyZW50bHkgZm9yIHRoZSB1c2VyLCBzaW5jZSBpdCBhbGxvd3MgdGhlIHVzZXIKLSAgIHRvIGludGVyc3BlcnNlIHRoZSBvcHRpb25zIHdpdGggdGhlIG90aGVyIGFyZ3VtZW50cy4KLQotICAgQXMgYGdldG9wdCcgd29ya3MsIGl0IHBlcm11dGVzIHRoZSBlbGVtZW50cyBvZiBBUkdWIHNvIHRoYXQsCi0gICB3aGVuIGl0IGlzIGRvbmUsIGFsbCB0aGUgb3B0aW9ucyBwcmVjZWRlIGV2ZXJ5dGhpbmcgZWxzZS4gIFRodXMKLSAgIGFsbCBhcHBsaWNhdGlvbiBwcm9ncmFtcyBhcmUgZXh0ZW5kZWQgdG8gaGFuZGxlIGZsZXhpYmxlIGFyZ3VtZW50IG9yZGVyLgotCi0gICBTZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQT1NJWExZX0NPUlJFQ1QgZGlzYWJsZXMgcGVybXV0YXRpb24uCi0gICBUaGVuIHRoZSBiZWhhdmlvciBpcyBjb21wbGV0ZWx5IHN0YW5kYXJkLgotCi0gICBHTlUgYXBwbGljYXRpb24gcHJvZ3JhbXMgY2FuIHVzZSBhIHRoaXJkIGFsdGVybmF0aXZlIG1vZGUgaW4gd2hpY2gKLSAgIHRoZXkgY2FuIGRpc3Rpbmd1aXNoIHRoZSByZWxhdGl2ZSBvcmRlciBvZiBvcHRpb25zIGFuZCBvdGhlciBhcmd1bWVudHMuICAqLwotCi0jaW5jbHVkZSAiZ2V0b3B0LmgiCi0KLS8qIEZvciBjb21tdW5pY2F0aW9uIGZyb20gYGdldG9wdCcgdG8gdGhlIGNhbGxlci4KLSAgIFdoZW4gYGdldG9wdCcgZmluZHMgYW4gb3B0aW9uIHRoYXQgdGFrZXMgYW4gYXJndW1lbnQsCi0gICB0aGUgYXJndW1lbnQgdmFsdWUgaXMgcmV0dXJuZWQgaGVyZS4KLSAgIEFsc28sIHdoZW4gYG9yZGVyaW5nJyBpcyBSRVRVUk5fSU5fT1JERVIsCi0gICBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50IGlzIHJldHVybmVkIGhlcmUuICAqLwotCi1jaGFyICpvcHRhcmcgPSBOVUxMOwotCi0vKiBJbmRleCBpbiBBUkdWIG9mIHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgc2Nhbm5lZC4KLSAgIFRoaXMgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiB0byBhbmQgZnJvbSB0aGUgY2FsbGVyCi0gICBhbmQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBzdWNjZXNzaXZlIGNhbGxzIHRvIGBnZXRvcHQnLgotCi0gICBPbiBlbnRyeSB0byBgZ2V0b3B0JywgemVybyBtZWFucyB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsOyBpbml0aWFsaXplLgotCi0gICBXaGVuIGBnZXRvcHQnIHJldHVybnMgLTEsIHRoaXMgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvZiB0aGUKLSAgIG5vbi1vcHRpb24gZWxlbWVudHMgdGhhdCB0aGUgY2FsbGVyIHNob3VsZCBpdHNlbGYgc2Nhbi4KLQotICAgT3RoZXJ3aXNlLCBgb3B0aW5kJyBjb21tdW5pY2F0ZXMgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dAotICAgaG93IG11Y2ggb2YgQVJHViBoYXMgYmVlbiBzY2FubmVkIHNvIGZhci4gICovCi0KLS8qIDEwMDMuMiBzYXlzIHRoaXMgbXVzdCBiZSAxIGJlZm9yZSBhbnkgY2FsbC4gICovCi1pbnQgb3B0aW5kID0gMTsKLQotLyogRm9ybWVybHksIGluaXRpYWxpemF0aW9uIG9mIGdldG9wdCBkZXBlbmRlZCBvbiBvcHRpbmQ9PTAsIHdoaWNoCi0gICBjYXVzZXMgcHJvYmxlbXMgd2l0aCByZS1jYWxsaW5nIGdldG9wdCBhcyBwcm9ncmFtcyBnZW5lcmFsbHkgZG9uJ3QKLSAgIGtub3cgdGhhdC4gKi8KLQotaW50IF9fZ2V0b3B0X2luaXRpYWxpemVkID0gMDsKLQotLyogVGhlIG5leHQgY2hhciB0byBiZSBzY2FubmVkIGluIHRoZSBvcHRpb24tZWxlbWVudAotICAgaW4gd2hpY2ggdGhlIGxhc3Qgb3B0aW9uIGNoYXJhY3RlciB3ZSByZXR1cm5lZCB3YXMgZm91bmQuCi0gICBUaGlzIGFsbG93cyB1cyB0byBwaWNrIHVwIHRoZSBzY2FuIHdoZXJlIHdlIGxlZnQgb2ZmLgotCi0gICBJZiB0aGlzIGlzIHplcm8sIG9yIGEgbnVsbCBzdHJpbmcsIGl0IG1lYW5zIHJlc3VtZSB0aGUgc2NhbgotICAgYnkgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IEFSR1YtZWxlbWVudC4gICovCi0KLXN0YXRpYyBjaGFyICpuZXh0Y2hhcjsKLQotLyogQ2FsbGVycyBzdG9yZSB6ZXJvIGhlcmUgdG8gaW5oaWJpdCB0aGUgZXJyb3IgbWVzc2FnZQotICAgZm9yIHVucmVjb2duaXplZCBvcHRpb25zLiAgKi8KLQotaW50IG9wdGVyciA9IDE7Ci0KLS8qIFNldCB0byBhbiBvcHRpb24gY2hhcmFjdGVyIHdoaWNoIHdhcyB1bnJlY29nbml6ZWQuCi0gICBUaGlzIG11c3QgYmUgaW5pdGlhbGl6ZWQgb24gc29tZSBzeXN0ZW1zIHRvIGF2b2lkIGxpbmtpbmcgaW4gdGhlCi0gICBzeXN0ZW0ncyBvd24gZ2V0b3B0IGltcGxlbWVudGF0aW9uLiAgKi8KLQotaW50IG9wdG9wdCA9ICc/JzsKLQotLyogRGVzY3JpYmUgaG93IHRvIGRlYWwgd2l0aCBvcHRpb25zIHRoYXQgZm9sbG93IG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cy4KLQotICAgSWYgdGhlIGNhbGxlciBkaWQgbm90IHNwZWNpZnkgYW55dGhpbmcsCi0gICB0aGUgZGVmYXVsdCBpcyBSRVFVSVJFX09SREVSIGlmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQotICAgUE9TSVhMWV9DT1JSRUNUIGlzIGRlZmluZWQsIFBFUk1VVEUgb3RoZXJ3aXNlLgotCi0gICBSRVFVSVJFX09SREVSIG1lYW5zIGRvbid0IHJlY29nbml6ZSB0aGVtIGFzIG9wdGlvbnM7Ci0gICBzdG9wIG9wdGlvbiBwcm9jZXNzaW5nIHdoZW4gdGhlIGZpcnN0IG5vbi1vcHRpb24gaXMgc2Vlbi4KLSAgIFRoaXMgaXMgd2hhdCBVbml4IGRvZXMuCi0gICBUaGlzIG1vZGUgb2Ygb3BlcmF0aW9uIGlzIHNlbGVjdGVkIGJ5IGVpdGhlciBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudAotICAgdmFyaWFibGUgUE9TSVhMWV9DT1JSRUNULCBvciB1c2luZyBgKycgYXMgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgb2YgdGhlIGxpc3Qgb2Ygb3B0aW9uIGNoYXJhY3RlcnMuCi0KLSAgIFBFUk1VVEUgaXMgdGhlIGRlZmF1bHQuICBXZSBwZXJtdXRlIHRoZSBjb250ZW50cyBvZiBBUkdWIGFzIHdlIHNjYW4sCi0gICBzbyB0aGF0IGV2ZW50dWFsbHkgYWxsIHRoZSBub24tb3B0aW9ucyBhcmUgYXQgdGhlIGVuZC4gIFRoaXMgYWxsb3dzIG9wdGlvbnMKLSAgIHRvIGJlIGdpdmVuIGluIGFueSBvcmRlciwgZXZlbiB3aXRoIHByb2dyYW1zIHRoYXQgd2VyZSBub3Qgd3JpdHRlbiB0bwotICAgZXhwZWN0IHRoaXMuCi0KLSAgIFJFVFVSTl9JTl9PUkRFUiBpcyBhbiBvcHRpb24gYXZhaWxhYmxlIHRvIHByb2dyYW1zIHRoYXQgd2VyZSB3cml0dGVuCi0gICB0byBleHBlY3Qgb3B0aW9ucyBhbmQgb3RoZXIgQVJHVi1lbGVtZW50cyBpbiBhbnkgb3JkZXIgYW5kIHRoYXQgY2FyZSBhYm91dAotICAgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28uICBXZSBkZXNjcmliZSBlYWNoIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50Ci0gICBhcyBpZiBpdCB3ZXJlIHRoZSBhcmd1bWVudCBvZiBhbiBvcHRpb24gd2l0aCBjaGFyYWN0ZXIgY29kZSAxLgotICAgVXNpbmcgYC0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGxpc3Qgb2Ygb3B0aW9uIGNoYXJhY3RlcnMKLSAgIHNlbGVjdHMgdGhpcyBtb2RlIG9mIG9wZXJhdGlvbi4KLQotICAgVGhlIHNwZWNpYWwgYXJndW1lbnQgYC0tJyBmb3JjZXMgYW4gZW5kIG9mIG9wdGlvbi1zY2FubmluZyByZWdhcmRsZXNzCi0gICBvZiB0aGUgdmFsdWUgb2YgYG9yZGVyaW5nJy4gIEluIHRoZSBjYXNlIG9mIFJFVFVSTl9JTl9PUkRFUiwgb25seQotICAgYC0tJyBjYW4gY2F1c2UgYGdldG9wdCcgdG8gcmV0dXJuIC0xIHdpdGggYG9wdGluZCcgIT0gQVJHQy4gICovCi0KLXN0YXRpYyBlbnVtCi17Ci0gIFJFUVVJUkVfT1JERVIsIFBFUk1VVEUsIFJFVFVSTl9JTl9PUkRFUgotfSBvcmRlcmluZzsKLQotLyogVmFsdWUgb2YgUE9TSVhMWV9DT1JSRUNUIGVudmlyb25tZW50IHZhcmlhYmxlLiAgKi8KLXN0YXRpYyBjaGFyICpwb3NpeGx5X2NvcnJlY3Q7Ci0MCi0jaWZkZWYJX19HTlVfTElCUkFSWV9fCi0vKiBXZSB3YW50IHRvIGF2b2lkIGluY2x1c2lvbiBvZiBzdHJpbmcuaCB3aXRoIG5vbi1HTlUgbGlicmFyaWVzCi0gICBiZWNhdXNlIHRoZXJlIGFyZSBtYW55IHdheXMgaXQgY2FuIGNhdXNlIHRyb3VibGUuCi0gICBPbiBzb21lIHN5c3RlbXMsIGl0IGNvbnRhaW5zIHNwZWNpYWwgbWFnaWMgbWFjcm9zIHRoYXQgZG9uJ3Qgd29yawotICAgaW4gR0NDLiAgKi8KLSMgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jIGRlZmluZSBteV9pbmRleAlzdHJjaHIKLSNlbHNlCi0KLSMgaWYgSEFWRV9TVFJJTkdfSAotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jIGVsc2UKLSMgIGlmIEhBVkVfU1RSSU5HU19ICi0jICAgaW5jbHVkZSA8c3RyaW5ncy5oPgotIyAgZW5kaWYKLSMgZW5kaWYKLQotLyogQXZvaWQgZGVwZW5kaW5nIG9uIGxpYnJhcnkgZnVuY3Rpb25zIG9yIGZpbGVzCi0gICB3aG9zZSBuYW1lcyBhcmUgaW5jb25zaXN0ZW50LiAgKi8KLQotI2lmbmRlZiBnZXRlbnYKLWV4dGVybiBjaGFyICpnZXRlbnYgKCk7Ci0jZW5kaWYKLQotc3RhdGljIGNoYXIgKgotbXlfaW5kZXggKHN0ciwgY2hyKQotICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgIGludCBjaHI7Ci17Ci0gIHdoaWxlICgqc3RyKQotICAgIHsKLSAgICAgIGlmICgqc3RyID09IGNocikKLQlyZXR1cm4gKGNoYXIgKikgc3RyOwotICAgICAgc3RyKys7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogSWYgdXNpbmcgR0NDLCB3ZSBjYW4gc2FmZWx5IGRlY2xhcmUgc3RybGVuIHRoaXMgd2F5LgotICAgSWYgbm90IHVzaW5nIEdDQywgaXQgaXMgb2sgbm90IHRvIGRlY2xhcmUgaXQuICAqLwotI2lmZGVmIF9fR05VQ19fCi0vKiBOb3RlIHRoYXQgTW90b3JvbGEgRGVsdGEgNjhrIFIzVjcgY29tZXMgd2l0aCBHQ0MgYnV0IG5vdCBzdGRkZWYuaC4KLSAgIFRoYXQgd2FzIHJlbGV2YW50IHRvIGNvZGUgdGhhdCB3YXMgaGVyZSBiZWZvcmUuICAqLwotIyBpZiAoIWRlZmluZWQgX19TVERDX18gfHwgIV9fU1REQ19fKSAmJiAhZGVmaW5lZCBzdHJsZW4KLS8qIGdjYyB3aXRoIC10cmFkaXRpb25hbCBkZWNsYXJlcyB0aGUgYnVpbHQtaW4gc3RybGVuIHRvIHJldHVybiBpbnQsCi0gICBhbmQgaGFzIGRvbmUgc28gYXQgbGVhc3Qgc2luY2UgdmVyc2lvbiAyLjQuNS4gLS0gcm1zLiAgKi8KLWV4dGVybiBpbnQgc3RybGVuIChjb25zdCBjaGFyICopOwotIyBlbmRpZiAvKiBub3QgX19TVERDX18gKi8KLSNlbmRpZiAvKiBfX0dOVUNfXyAqLwotCi0jZW5kaWYgLyogbm90IF9fR05VX0xJQlJBUllfXyAqLwotDAotLyogSGFuZGxlIHBlcm11dGF0aW9uIG9mIGFyZ3VtZW50cy4gICovCi0KLS8qIERlc2NyaWJlIHRoZSBwYXJ0IG9mIEFSR1YgdGhhdCBjb250YWlucyBub24tb3B0aW9ucyB0aGF0IGhhdmUKLSAgIGJlZW4gc2tpcHBlZC4gIGBmaXJzdF9ub25vcHQnIGlzIHRoZSBpbmRleCBpbiBBUkdWIG9mIHRoZSBmaXJzdCBvZiB0aGVtOwotICAgYGxhc3Rfbm9ub3B0JyBpcyB0aGUgaW5kZXggYWZ0ZXIgdGhlIGxhc3Qgb2YgdGhlbS4gICovCi0KLXN0YXRpYyBpbnQgZmlyc3Rfbm9ub3B0Owotc3RhdGljIGludCBsYXN0X25vbm9wdDsKLQotI2lmZGVmIF9MSUJDCi0vKiBCYXNoIDIuMCBnaXZlcyB1cyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWluaW5nIGZsYWdzCi0gICBpbmRpY2F0aW5nIEFSR1YgZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYXJndW1lbnRzLiAgKi8KLQotLyogRGVmaW5lZCBpbiBnZXRvcHRfaW5pdC5jICAqLwotZXh0ZXJuIGNoYXIgKl9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnczsKLQotc3RhdGljIGludCBub25vcHRpb25fZmxhZ3NfbWF4X2xlbjsKLXN0YXRpYyBpbnQgbm9ub3B0aW9uX2ZsYWdzX2xlbjsKLQotc3RhdGljIGludCBvcmlnaW5hbF9hcmdjOwotc3RhdGljIGNoYXIgKmNvbnN0ICpvcmlnaW5hbF9hcmd2OwotCi0vKiBNYWtlIHN1cmUgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGJhc2ggMi4wIHB1dHMgaW4gdGhlIGVudmlyb25tZW50Ci0gICBpcyB2YWxpZCBmb3IgdGhlIGdldG9wdCBjYWxsIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgdGhlIEFSR1YgcGFzc2VkCi0gICB0byBnZXRvcHQgaXMgdGhhdCBvbmUgcGFzc2VkIHRvIHRoZSBwcm9jZXNzLiAgKi8KLXN0YXRpYyB2b2lkCi1fX2F0dHJpYnV0ZV9fICgodW51c2VkKSkKLXN0b3JlX2FyZ3NfYW5kX2VudiAoaW50IGFyZ2MsIGNoYXIgKmNvbnN0ICphcmd2KQotewotICAvKiBYWFggVGhpcyBpcyBubyBnb29kIHNvbHV0aW9uLiAgV2Ugc2hvdWxkIHJhdGhlciBjb3B5IHRoZSBhcmdzIHNvCi0gICAgIHRoYXQgd2UgY2FuIGNvbXBhcmUgdGhlbSBsYXRlci4gIEJ1dCB3ZSBtdXN0IG5vdCB1c2UgbWFsbG9jKDMpLiAgKi8KLSAgb3JpZ2luYWxfYXJnYyA9IGFyZ2M7Ci0gIG9yaWdpbmFsX2FyZ3YgPSBhcmd2OwotfQotIyBpZmRlZiB0ZXh0X3NldF9lbGVtZW50Ci10ZXh0X3NldF9lbGVtZW50IChfX2xpYmNfc3ViaW5pdCwgc3RvcmVfYXJnc19hbmRfZW52KTsKLSMgZW5kaWYgLyogdGV4dF9zZXRfZWxlbWVudCAqLwotCi0jIGRlZmluZSBTV0FQX0ZMQUdTKGNoMSwgY2gyKSBcCi0gIGlmIChub25vcHRpb25fZmxhZ3NfbGVuID4gMCkJCQkJCQkgICAgICBcCi0gICAgewkJCQkJCQkJCSAgICAgIFwKLSAgICAgIGNoYXIgX190bXAgPSBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gxXTsJCQkgICAgICBcCi0gICAgICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gxXSA9IF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tjaDJdOwkgICAgICBcCi0gICAgICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbY2gyXSA9IF9fdG1wOwkJCQkgICAgICBcCi0gICAgfQotI2Vsc2UJLyogIV9MSUJDICovCi0jIGRlZmluZSBTV0FQX0ZMQUdTKGNoMSwgY2gyKQotI2VuZGlmCS8qIF9MSUJDICovCi0KLS8qIEV4Y2hhbmdlIHR3byBhZGphY2VudCBzdWJzZXF1ZW5jZXMgb2YgQVJHVi4KLSAgIE9uZSBzdWJzZXF1ZW5jZSBpcyBlbGVtZW50cyBbZmlyc3Rfbm9ub3B0LGxhc3Rfbm9ub3B0KQotICAgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBub24tb3B0aW9ucyB0aGF0IGhhdmUgYmVlbiBza2lwcGVkIHNvIGZhci4KLSAgIFRoZSBvdGhlciBpcyBlbGVtZW50cyBbbGFzdF9ub25vcHQsb3B0aW5kKSwgd2hpY2ggY29udGFpbnMgYWxsCi0gICB0aGUgb3B0aW9ucyBwcm9jZXNzZWQgc2luY2UgdGhvc2Ugbm9uLW9wdGlvbnMgd2VyZSBza2lwcGVkLgotCi0gICBgZmlyc3Rfbm9ub3B0JyBhbmQgYGxhc3Rfbm9ub3B0JyBhcmUgcmVsb2NhdGVkIHNvIHRoYXQgdGhleSBkZXNjcmliZQotICAgdGhlIG5ldyBpbmRpY2VzIG9mIHRoZSBub24tb3B0aW9ucyBpbiBBUkdWIGFmdGVyIHRoZXkgYXJlIG1vdmVkLiAgKi8KLQotI2lmIGRlZmluZWQgX19TVERDX18gJiYgX19TVERDX18KLXN0YXRpYyB2b2lkIGV4Y2hhbmdlIChjaGFyICoqKTsKLSNlbmRpZgotCi1zdGF0aWMgdm9pZAotZXhjaGFuZ2UgKGFyZ3YpCi0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYm90dG9tID0gZmlyc3Rfbm9ub3B0OwotICBpbnQgbWlkZGxlID0gbGFzdF9ub25vcHQ7Ci0gIGludCB0b3AgPSBvcHRpbmQ7Ci0gIGNoYXIgKnRlbTsKLQotICAvKiBFeGNoYW5nZSB0aGUgc2hvcnRlciBzZWdtZW50IHdpdGggdGhlIGZhciBlbmQgb2YgdGhlIGxvbmdlciBzZWdtZW50LgotICAgICBUaGF0IHB1dHMgdGhlIHNob3J0ZXIgc2VnbWVudCBpbnRvIHRoZSByaWdodCBwbGFjZS4KLSAgICAgSXQgbGVhdmVzIHRoZSBsb25nZXIgc2VnbWVudCBpbiB0aGUgcmlnaHQgcGxhY2Ugb3ZlcmFsbCwKLSAgICAgYnV0IGl0IGNvbnNpc3RzIG9mIHR3byBwYXJ0cyB0aGF0IG5lZWQgdG8gYmUgc3dhcHBlZCBuZXh0LiAgKi8KLQotI2lmZGVmIF9MSUJDCi0gIC8qIEZpcnN0IG1ha2Ugc3VyZSB0aGUgaGFuZGxpbmcgb2YgdGhlIGBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MnCi0gICAgIHN0cmluZyBjYW4gd29yayBub3JtYWxseS4gIE91ciB0b3AgYXJndW1lbnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2UKLSAgICAgb2YgdGhlIHN0cmluZy4gICovCi0gIGlmIChub25vcHRpb25fZmxhZ3NfbGVuID4gMCAmJiB0b3AgPj0gbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4pCi0gICAgewotICAgICAgLyogV2UgbXVzdCBleHRlbmQgdGhlIGFycmF5LiAgVGhlIHVzZXIgcGxheXMgZ2FtZXMgd2l0aCB1cyBhbmQKLQkgcHJlc2VudHMgbmV3IGFyZ3VtZW50cy4gICovCi0gICAgICBjaGFyICpuZXdfc3RyID0gbWFsbG9jICh0b3AgKyAxKTsKLSAgICAgIGlmIChuZXdfc3RyID09IE5VTEwpCi0Jbm9ub3B0aW9uX2ZsYWdzX2xlbiA9IG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gMDsKLSAgICAgIGVsc2UKLQl7Ci0JICBtZW1zZXQgKF9fbWVtcGNweSAobmV3X3N0ciwgX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzLAotCQkJICAgICBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiksCi0JCSAgJ1wwJywgdG9wICsgMSAtIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKTsKLQkgIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gdG9wICsgMTsKLQkgIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFncyA9IG5ld19zdHI7Ci0JfQotICAgIH0KLSNlbmRpZgotCi0gIHdoaWxlICh0b3AgPiBtaWRkbGUgJiYgbWlkZGxlID4gYm90dG9tKQotICAgIHsKLSAgICAgIGlmICh0b3AgLSBtaWRkbGUgPiBtaWRkbGUgLSBib3R0b20pCi0JewotCSAgLyogQm90dG9tIHNlZ21lbnQgaXMgdGhlIHNob3J0IG9uZS4gICovCi0JICBpbnQgbGVuID0gbWlkZGxlIC0gYm90dG9tOwotCSAgcmVnaXN0ZXIgaW50IGk7Ci0KLQkgIC8qIFN3YXAgaXQgd2l0aCB0aGUgdG9wIHBhcnQgb2YgdGhlIHRvcCBzZWdtZW50LiAgKi8KLQkgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkgICAgewotCSAgICAgIHRlbSA9IGFyZ3ZbYm90dG9tICsgaV07Ci0JICAgICAgYXJndltib3R0b20gKyBpXSA9IGFyZ3ZbdG9wIC0gKG1pZGRsZSAtIGJvdHRvbSkgKyBpXTsKLQkgICAgICBhcmd2W3RvcCAtIChtaWRkbGUgLSBib3R0b20pICsgaV0gPSB0ZW07Ci0JICAgICAgU1dBUF9GTEFHUyAoYm90dG9tICsgaSwgdG9wIC0gKG1pZGRsZSAtIGJvdHRvbSkgKyBpKTsKLQkgICAgfQotCSAgLyogRXhjbHVkZSB0aGUgbW92ZWQgYm90dG9tIHNlZ21lbnQgZnJvbSBmdXJ0aGVyIHN3YXBwaW5nLiAgKi8KLQkgIHRvcCAtPSBsZW47Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFRvcCBzZWdtZW50IGlzIHRoZSBzaG9ydCBvbmUuICAqLwotCSAgaW50IGxlbiA9IHRvcCAtIG1pZGRsZTsKLQkgIHJlZ2lzdGVyIGludCBpOwotCi0JICAvKiBTd2FwIGl0IHdpdGggdGhlIGJvdHRvbSBwYXJ0IG9mIHRoZSBib3R0b20gc2VnbWVudC4gICovCi0JICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JICAgIHsKLQkgICAgICB0ZW0gPSBhcmd2W2JvdHRvbSArIGldOwotCSAgICAgIGFyZ3ZbYm90dG9tICsgaV0gPSBhcmd2W21pZGRsZSArIGldOwotCSAgICAgIGFyZ3ZbbWlkZGxlICsgaV0gPSB0ZW07Ci0JICAgICAgU1dBUF9GTEFHUyAoYm90dG9tICsgaSwgbWlkZGxlICsgaSk7Ci0JICAgIH0KLQkgIC8qIEV4Y2x1ZGUgdGhlIG1vdmVkIHRvcCBzZWdtZW50IGZyb20gZnVydGhlciBzd2FwcGluZy4gICovCi0JICBib3R0b20gKz0gbGVuOwotCX0KLSAgICB9Ci0KLSAgLyogVXBkYXRlIHJlY29yZHMgZm9yIHRoZSBzbG90cyB0aGUgbm9uLW9wdGlvbnMgbm93IG9jY3VweS4gICovCi0KLSAgZmlyc3Rfbm9ub3B0ICs9IChvcHRpbmQgLSBsYXN0X25vbm9wdCk7Ci0gIGxhc3Rfbm9ub3B0ID0gb3B0aW5kOwotfQotCi0vKiBJbml0aWFsaXplIHRoZSBpbnRlcm5hbCBkYXRhIHdoZW4gdGhlIGZpcnN0IGNhbGwgaXMgbWFkZS4gICovCi0KLSNpZiBkZWZpbmVkIF9fU1REQ19fICYmIF9fU1REQ19fCi1zdGF0aWMgY29uc3QgY2hhciAqX2dldG9wdF9pbml0aWFsaXplIChpbnQsIGNoYXIgKmNvbnN0ICosIGNvbnN0IGNoYXIgKik7Ci0jZW5kaWYKLXN0YXRpYyBjb25zdCBjaGFyICoKLV9nZXRvcHRfaW5pdGlhbGl6ZSAoYXJnYywgYXJndiwgb3B0c3RyaW5nKQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZzsKLXsKLSAgLyogU3RhcnQgcHJvY2Vzc2luZyBvcHRpb25zIHdpdGggQVJHVi1lbGVtZW50IDEgKHNpbmNlIEFSR1YtZWxlbWVudCAwCi0gICAgIGlzIHRoZSBwcm9ncmFtIG5hbWUpOyB0aGUgc2VxdWVuY2Ugb2YgcHJldmlvdXNseSBza2lwcGVkCi0gICAgIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cyBpcyBlbXB0eS4gICovCi0KLSAgZmlyc3Rfbm9ub3B0ID0gbGFzdF9ub25vcHQgPSBvcHRpbmQ7Ci0KLSAgbmV4dGNoYXIgPSBOVUxMOwotCi0gIHBvc2l4bHlfY29ycmVjdCA9IGdldGVudiAoIlBPU0lYTFlfQ09SUkVDVCIpOwotCi0gIC8qIERldGVybWluZSBob3cgdG8gaGFuZGxlIHRoZSBvcmRlcmluZyBvZiBvcHRpb25zIGFuZCBub25vcHRpb25zLiAgKi8KLQotICBpZiAob3B0c3RyaW5nWzBdID09ICctJykKLSAgICB7Ci0gICAgICBvcmRlcmluZyA9IFJFVFVSTl9JTl9PUkRFUjsKLSAgICAgICsrb3B0c3RyaW5nOwotICAgIH0KLSAgZWxzZSBpZiAob3B0c3RyaW5nWzBdID09ICcrJykKLSAgICB7Ci0gICAgICBvcmRlcmluZyA9IFJFUVVJUkVfT1JERVI7Ci0gICAgICArK29wdHN0cmluZzsKLSAgICB9Ci0gIGVsc2UgaWYgKHBvc2l4bHlfY29ycmVjdCAhPSBOVUxMKQotICAgIG9yZGVyaW5nID0gUkVRVUlSRV9PUkRFUjsKLSAgZWxzZQotICAgIG9yZGVyaW5nID0gUEVSTVVURTsKLQotI2lmZGVmIF9MSUJDCi0gIGlmIChwb3NpeGx5X2NvcnJlY3QgPT0gTlVMTAotICAgICAgJiYgYXJnYyA9PSBvcmlnaW5hbF9hcmdjICYmIGFyZ3YgPT0gb3JpZ2luYWxfYXJndikKLSAgICB7Ci0gICAgICBpZiAobm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPT0gMCkKLQl7Ci0JICBpZiAoX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID09IE5VTEwKLQkgICAgICB8fCBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3NbMF0gPT0gJ1wwJykKLQkgICAgbm9ub3B0aW9uX2ZsYWdzX21heF9sZW4gPSAtMTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGNvbnN0IGNoYXIgKm9yaWdfc3RyID0gX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzOwotCSAgICAgIGludCBsZW4gPSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA9IHN0cmxlbiAob3JpZ19zdHIpOwotCSAgICAgIGlmIChub25vcHRpb25fZmxhZ3NfbWF4X2xlbiA8IGFyZ2MpCi0JCW5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gYXJnYzsKLQkgICAgICBfX2dldG9wdF9ub25vcHRpb25fZmxhZ3MgPQotCQkoY2hhciAqKSBtYWxsb2MgKG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuKTsKLQkgICAgICBpZiAoX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzID09IE5VTEwpCi0JCW5vbm9wdGlvbl9mbGFnc19tYXhfbGVuID0gLTE7Ci0JICAgICAgZWxzZQotCQltZW1zZXQgKF9fbWVtcGNweSAoX19nZXRvcHRfbm9ub3B0aW9uX2ZsYWdzLCBvcmlnX3N0ciwgbGVuKSwKLQkJCSdcMCcsIG5vbm9wdGlvbl9mbGFnc19tYXhfbGVuIC0gbGVuKTsKLQkgICAgfQotCX0KLSAgICAgIG5vbm9wdGlvbl9mbGFnc19sZW4gPSBub25vcHRpb25fZmxhZ3NfbWF4X2xlbjsKLSAgICB9Ci0gIGVsc2UKLSAgICBub25vcHRpb25fZmxhZ3NfbGVuID0gMDsKLSNlbmRpZgotCi0gIHJldHVybiBvcHRzdHJpbmc7Ci19Ci0MCi0vKiBTY2FuIGVsZW1lbnRzIG9mIEFSR1YgKHdob3NlIGxlbmd0aCBpcyBBUkdDKSBmb3Igb3B0aW9uIGNoYXJhY3RlcnMKLSAgIGdpdmVuIGluIE9QVFNUUklORy4KLQotICAgSWYgYW4gZWxlbWVudCBvZiBBUkdWIHN0YXJ0cyB3aXRoICctJywgYW5kIGlzIG5vdCBleGFjdGx5ICItIiBvciAiLS0iLAotICAgdGhlbiBpdCBpcyBhbiBvcHRpb24gZWxlbWVudC4gIFRoZSBjaGFyYWN0ZXJzIG9mIHRoaXMgZWxlbWVudAotICAgKGFzaWRlIGZyb20gdGhlIGluaXRpYWwgJy0nKSBhcmUgb3B0aW9uIGNoYXJhY3RlcnMuICBJZiBgZ2V0b3B0JwotICAgaXMgY2FsbGVkIHJlcGVhdGVkbHksIGl0IHJldHVybnMgc3VjY2Vzc2l2ZWx5IGVhY2ggb2YgdGhlIG9wdGlvbiBjaGFyYWN0ZXJzCi0gICBmcm9tIGVhY2ggb2YgdGhlIG9wdGlvbiBlbGVtZW50cy4KLQotICAgSWYgYGdldG9wdCcgZmluZHMgYW5vdGhlciBvcHRpb24gY2hhcmFjdGVyLCBpdCByZXR1cm5zIHRoYXQgY2hhcmFjdGVyLAotICAgdXBkYXRpbmcgYG9wdGluZCcgYW5kIGBuZXh0Y2hhcicgc28gdGhhdCB0aGUgbmV4dCBjYWxsIHRvIGBnZXRvcHQnIGNhbgotICAgcmVzdW1lIHRoZSBzY2FuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb24gY2hhcmFjdGVyIG9yIEFSR1YtZWxlbWVudC4KLQotICAgSWYgdGhlcmUgYXJlIG5vIG1vcmUgb3B0aW9uIGNoYXJhY3RlcnMsIGBnZXRvcHQnIHJldHVybnMgLTEuCi0gICBUaGVuIGBvcHRpbmQnIGlzIHRoZSBpbmRleCBpbiBBUkdWIG9mIHRoZSBmaXJzdCBBUkdWLWVsZW1lbnQKLSAgIHRoYXQgaXMgbm90IGFuIG9wdGlvbi4gIChUaGUgQVJHVi1lbGVtZW50cyBoYXZlIGJlZW4gcGVybXV0ZWQKLSAgIHNvIHRoYXQgdGhvc2UgdGhhdCBhcmUgbm90IG9wdGlvbnMgbm93IGNvbWUgbGFzdC4pCi0KLSAgIE9QVFNUUklORyBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBsZWdpdGltYXRlIG9wdGlvbiBjaGFyYWN0ZXJzLgotICAgSWYgYW4gb3B0aW9uIGNoYXJhY3RlciBpcyBzZWVuIHRoYXQgaXMgbm90IGxpc3RlZCBpbiBPUFRTVFJJTkcsCi0gICByZXR1cm4gJz8nIGFmdGVyIHByaW50aW5nIGFuIGVycm9yIG1lc3NhZ2UuICBJZiB5b3Ugc2V0IGBvcHRlcnInIHRvCi0gICB6ZXJvLCB0aGUgZXJyb3IgbWVzc2FnZSBpcyBzdXBwcmVzc2VkIGJ1dCB3ZSBzdGlsbCByZXR1cm4gJz8nLgotCi0gICBJZiBhIGNoYXIgaW4gT1BUU1RSSU5HIGlzIGZvbGxvd2VkIGJ5IGEgY29sb24sIHRoYXQgbWVhbnMgaXQgd2FudHMgYW4gYXJnLAotICAgc28gdGhlIGZvbGxvd2luZyB0ZXh0IGluIHRoZSBzYW1lIEFSR1YtZWxlbWVudCwgb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZwotICAgQVJHVi1lbGVtZW50LCBpcyByZXR1cm5lZCBpbiBgb3B0YXJnJy4gIFR3byBjb2xvbnMgbWVhbiBhbiBvcHRpb24gdGhhdAotICAgd2FudHMgYW4gb3B0aW9uYWwgYXJnOyBpZiB0aGVyZSBpcyB0ZXh0IGluIHRoZSBjdXJyZW50IEFSR1YtZWxlbWVudCwKLSAgIGl0IGlzIHJldHVybmVkIGluIGBvcHRhcmcnLCBvdGhlcndpc2UgYG9wdGFyZycgaXMgc2V0IHRvIHplcm8uCi0KLSAgIElmIE9QVFNUUklORyBzdGFydHMgd2l0aCBgLScgb3IgYCsnLCBpdCByZXF1ZXN0cyBkaWZmZXJlbnQgbWV0aG9kcyBvZgotICAgaGFuZGxpbmcgdGhlIG5vbi1vcHRpb24gQVJHVi1lbGVtZW50cy4KLSAgIFNlZSB0aGUgY29tbWVudHMgYWJvdXQgUkVUVVJOX0lOX09SREVSIGFuZCBSRVFVSVJFX09SREVSLCBhYm92ZS4KLQotICAgTG9uZy1uYW1lZCBvcHRpb25zIGJlZ2luIHdpdGggYC0tJyBpbnN0ZWFkIG9mIGAtJy4KLSAgIFRoZWlyIG5hbWVzIG1heSBiZSBhYmJyZXZpYXRlZCBhcyBsb25nIGFzIHRoZSBhYmJyZXZpYXRpb24gaXMgdW5pcXVlCi0gICBvciBpcyBhbiBleGFjdCBtYXRjaCBmb3Igc29tZSBkZWZpbmVkIG9wdGlvbi4gIElmIHRoZXkgaGF2ZSBhbgotICAgYXJndW1lbnQsIGl0IGZvbGxvd3MgdGhlIG9wdGlvbiBuYW1lIGluIHRoZSBzYW1lIEFSR1YtZWxlbWVudCwgc2VwYXJhdGVkCi0gICBmcm9tIHRoZSBvcHRpb24gbmFtZSBieSBhIGA9Jywgb3IgZWxzZSB0aGUgaW4gbmV4dCBBUkdWLWVsZW1lbnQuCi0gICBXaGVuIGBnZXRvcHQnIGZpbmRzIGEgbG9uZy1uYW1lZCBvcHRpb24sIGl0IHJldHVybnMgMCBpZiB0aGF0IG9wdGlvbidzCi0gICBgZmxhZycgZmllbGQgaXMgbm9uemVybywgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24ncyBgdmFsJyBmaWVsZAotICAgaWYgdGhlIGBmbGFnJyBmaWVsZCBpcyB6ZXJvLgotCi0gICBUaGUgZWxlbWVudHMgb2YgQVJHViBhcmVuJ3QgcmVhbGx5IGNvbnN0LCBiZWNhdXNlIHdlIHBlcm11dGUgdGhlbS4KLSAgIEJ1dCB3ZSBwcmV0ZW5kIHRoZXkncmUgY29uc3QgaW4gdGhlIHByb3RvdHlwZSB0byBiZSBjb21wYXRpYmxlCi0gICB3aXRoIG90aGVyIHN5c3RlbXMuCi0KLSAgIExPTkdPUFRTIGlzIGEgdmVjdG9yIG9mIGBzdHJ1Y3Qgb3B0aW9uJyB0ZXJtaW5hdGVkIGJ5IGFuCi0gICBlbGVtZW50IGNvbnRhaW5pbmcgYSBuYW1lIHdoaWNoIGlzIHplcm8uCi0KLSAgIExPTkdJTkQgcmV0dXJucyB0aGUgaW5kZXggaW4gTE9OR09QVCBvZiB0aGUgbG9uZy1uYW1lZCBvcHRpb24gZm91bmQuCi0gICBJdCBpcyBvbmx5IHZhbGlkIHdoZW4gYSBsb25nLW5hbWVkIG9wdGlvbiBoYXMgYmVlbiBmb3VuZCBieSB0aGUgbW9zdAotICAgcmVjZW50IGNhbGwuCi0KLSAgIElmIExPTkdfT05MWSBpcyBub256ZXJvLCAnLScgYXMgd2VsbCBhcyAnLS0nIGNhbiBpbnRyb2R1Y2UKLSAgIGxvbmctbmFtZWQgb3B0aW9ucy4gICovCi0KLWludAotX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0c3RyaW5nLCBsb25nb3B0cywgbG9uZ2luZCwgbG9uZ19vbmx5KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdHN0cmluZzsKLSAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHM7Ci0gICAgIGludCAqbG9uZ2luZDsKLSAgICAgaW50IGxvbmdfb25seTsKLXsKLSAgb3B0YXJnID0gTlVMTDsKLQotICBpZiAob3B0aW5kID09IDAgfHwgIV9fZ2V0b3B0X2luaXRpYWxpemVkKQotICAgIHsKLSAgICAgIGlmIChvcHRpbmQgPT0gMCkKLQlvcHRpbmQgPSAxOwkvKiBEb24ndCBzY2FuIEFSR1ZbMF0sIHRoZSBwcm9ncmFtIG5hbWUuICAqLwotICAgICAgb3B0c3RyaW5nID0gX2dldG9wdF9pbml0aWFsaXplIChhcmdjLCBhcmd2LCBvcHRzdHJpbmcpOwotICAgICAgX19nZXRvcHRfaW5pdGlhbGl6ZWQgPSAxOwotICAgIH0KLQotICAvKiBUZXN0IHdoZXRoZXIgQVJHVltvcHRpbmRdIHBvaW50cyB0byBhIG5vbi1vcHRpb24gYXJndW1lbnQuCi0gICAgIEVpdGhlciBpdCBkb2VzIG5vdCBoYXZlIG9wdGlvbiBzeW50YXgsIG9yIHRoZXJlIGlzIGFuIGVudmlyb25tZW50IGZsYWcKLSAgICAgZnJvbSB0aGUgc2hlbGwgaW5kaWNhdGluZyBpdCBpcyBub3QgYW4gb3B0aW9uLiAgVGhlIGxhdGVyIGluZm9ybWF0aW9uCi0gICAgIGlzIG9ubHkgdXNlZCB3aGVuIHRoZSB1c2VkIGluIHRoZSBHTlUgbGliYy4gICovCi0jaWZkZWYgX0xJQkMKLSMgZGVmaW5lIE5PTk9QVElPTl9QIChhcmd2W29wdGluZF1bMF0gIT0gJy0nIHx8IGFyZ3Zbb3B0aW5kXVsxXSA9PSAnXDAnCSAgICAgIFwKLQkJICAgICAgfHwgKG9wdGluZCA8IG5vbm9wdGlvbl9mbGFnc19sZW4JCQkgICAgICBcCi0JCQkgICYmIF9fZ2V0b3B0X25vbm9wdGlvbl9mbGFnc1tvcHRpbmRdID09ICcxJykpCi0jZWxzZQotIyBkZWZpbmUgTk9OT1BUSU9OX1AgKGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScgfHwgYXJndltvcHRpbmRdWzFdID09ICdcMCcpCi0jZW5kaWYKLQotICBpZiAobmV4dGNoYXIgPT0gTlVMTCB8fCAqbmV4dGNoYXIgPT0gJ1wwJykKLSAgICB7Ci0gICAgICAvKiBBZHZhbmNlIHRvIHRoZSBuZXh0IEFSR1YtZWxlbWVudC4gICovCi0KLSAgICAgIC8qIEdpdmUgRklSU1RfTk9OT1BUICYgTEFTVF9OT05PUFQgcmF0aW9uYWwgdmFsdWVzIGlmIE9QVElORCBoYXMgYmVlbgotCSBtb3ZlZCBiYWNrIGJ5IHRoZSB1c2VyICh3aG8gbWF5IGFsc28gaGF2ZSBjaGFuZ2VkIHRoZSBhcmd1bWVudHMpLiAgKi8KLSAgICAgIGlmIChsYXN0X25vbm9wdCA+IG9wdGluZCkKLQlsYXN0X25vbm9wdCA9IG9wdGluZDsKLSAgICAgIGlmIChmaXJzdF9ub25vcHQgPiBvcHRpbmQpCi0JZmlyc3Rfbm9ub3B0ID0gb3B0aW5kOwotCi0gICAgICBpZiAob3JkZXJpbmcgPT0gUEVSTVVURSkKLQl7Ci0JICAvKiBJZiB3ZSBoYXZlIGp1c3QgcHJvY2Vzc2VkIHNvbWUgb3B0aW9ucyBmb2xsb3dpbmcgc29tZSBub24tb3B0aW9ucywKLQkgICAgIGV4Y2hhbmdlIHRoZW0gc28gdGhhdCB0aGUgb3B0aW9ucyBjb21lIGZpcnN0LiAgKi8KLQotCSAgaWYgKGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCAmJiBsYXN0X25vbm9wdCAhPSBvcHRpbmQpCi0JICAgIGV4Y2hhbmdlICgoY2hhciAqKikgYXJndik7Ci0JICBlbHNlIGlmIChsYXN0X25vbm9wdCAhPSBvcHRpbmQpCi0JICAgIGZpcnN0X25vbm9wdCA9IG9wdGluZDsKLQotCSAgLyogU2tpcCBhbnkgYWRkaXRpb25hbCBub24tb3B0aW9ucwotCSAgICAgYW5kIGV4dGVuZCB0aGUgcmFuZ2Ugb2Ygbm9uLW9wdGlvbnMgcHJldmlvdXNseSBza2lwcGVkLiAgKi8KLQotCSAgd2hpbGUgKG9wdGluZCA8IGFyZ2MgJiYgTk9OT1BUSU9OX1ApCi0JICAgIG9wdGluZCsrOwotCSAgbGFzdF9ub25vcHQgPSBvcHRpbmQ7Ci0JfQotCi0gICAgICAvKiBUaGUgc3BlY2lhbCBBUkdWLWVsZW1lbnQgYC0tJyBtZWFucyBwcmVtYXR1cmUgZW5kIG9mIG9wdGlvbnMuCi0JIFNraXAgaXQgbGlrZSBhIG51bGwgb3B0aW9uLAotCSB0aGVuIGV4Y2hhbmdlIHdpdGggcHJldmlvdXMgbm9uLW9wdGlvbnMgYXMgaWYgaXQgd2VyZSBhbiBvcHRpb24sCi0JIHRoZW4gc2tpcCBldmVyeXRoaW5nIGVsc2UgbGlrZSBhIG5vbi1vcHRpb24uICAqLwotCi0gICAgICBpZiAob3B0aW5kICE9IGFyZ2MgJiYgIXN0cmNtcCAoYXJndltvcHRpbmRdLCAiLS0iKSkKLQl7Ci0JICBvcHRpbmQrKzsKLQotCSAgaWYgKGZpcnN0X25vbm9wdCAhPSBsYXN0X25vbm9wdCAmJiBsYXN0X25vbm9wdCAhPSBvcHRpbmQpCi0JICAgIGV4Y2hhbmdlICgoY2hhciAqKikgYXJndik7Ci0JICBlbHNlIGlmIChmaXJzdF9ub25vcHQgPT0gbGFzdF9ub25vcHQpCi0JICAgIGZpcnN0X25vbm9wdCA9IG9wdGluZDsKLQkgIGxhc3Rfbm9ub3B0ID0gYXJnYzsKLQotCSAgb3B0aW5kID0gYXJnYzsKLQl9Ci0KLSAgICAgIC8qIElmIHdlIGhhdmUgZG9uZSBhbGwgdGhlIEFSR1YtZWxlbWVudHMsIHN0b3AgdGhlIHNjYW4KLQkgYW5kIGJhY2sgb3ZlciBhbnkgbm9uLW9wdGlvbnMgdGhhdCB3ZSBza2lwcGVkIGFuZCBwZXJtdXRlZC4gICovCi0KLSAgICAgIGlmIChvcHRpbmQgPT0gYXJnYykKLQl7Ci0JICAvKiBTZXQgdGhlIG5leHQtYXJnLWluZGV4IHRvIHBvaW50IGF0IHRoZSBub24tb3B0aW9ucwotCSAgICAgdGhhdCB3ZSBwcmV2aW91c2x5IHNraXBwZWQsIHNvIHRoZSBjYWxsZXIgd2lsbCBkaWdlc3QgdGhlbS4gICovCi0JICBpZiAoZmlyc3Rfbm9ub3B0ICE9IGxhc3Rfbm9ub3B0KQotCSAgICBvcHRpbmQgPSBmaXJzdF9ub25vcHQ7Ci0JICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICAvKiBJZiB3ZSBoYXZlIGNvbWUgdG8gYSBub24tb3B0aW9uIGFuZCBkaWQgbm90IHBlcm11dGUgaXQsCi0JIGVpdGhlciBzdG9wIHRoZSBzY2FuIG9yIGRlc2NyaWJlIGl0IHRvIHRoZSBjYWxsZXIgYW5kIHBhc3MgaXQgYnkuICAqLwotCi0gICAgICBpZiAoTk9OT1BUSU9OX1ApCi0JewotCSAgaWYgKG9yZGVyaW5nID09IFJFUVVJUkVfT1JERVIpCi0JICAgIHJldHVybiAtMTsKLQkgIG9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGZvdW5kIGFub3RoZXIgb3B0aW9uLUFSR1YtZWxlbWVudC4KLQkgU2tpcCB0aGUgaW5pdGlhbCBwdW5jdHVhdGlvbi4gICovCi0KLSAgICAgIG5leHRjaGFyID0gKGFyZ3Zbb3B0aW5kXSArIDEKLQkJICArIChsb25nb3B0cyAhPSBOVUxMICYmIGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScpKTsKLSAgICB9Ci0KLSAgLyogRGVjb2RlIHRoZSBjdXJyZW50IG9wdGlvbi1BUkdWLWVsZW1lbnQuICAqLwotCi0gIC8qIENoZWNrIHdoZXRoZXIgdGhlIEFSR1YtZWxlbWVudCBpcyBhIGxvbmcgb3B0aW9uLgotCi0gICAgIElmIGxvbmdfb25seSBhbmQgdGhlIEFSR1YtZWxlbWVudCBoYXMgdGhlIGZvcm0gIi1mIiwgd2hlcmUgZiBpcwotICAgICBhIHZhbGlkIHNob3J0IG9wdGlvbiwgZG9uJ3QgY29uc2lkZXIgaXQgYW4gYWJicmV2aWF0ZWQgZm9ybSBvZgotICAgICBhIGxvbmcgb3B0aW9uIHRoYXQgc3RhcnRzIHdpdGggZi4gIE90aGVyd2lzZSB0aGVyZSB3b3VsZCBiZSBubwotICAgICB3YXkgdG8gZ2l2ZSB0aGUgLWYgc2hvcnQgb3B0aW9uLgotCi0gICAgIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGVyZSdzIGEgbG9uZyBvcHRpb24gImZ1YmFyIiBhbmQKLSAgICAgdGhlIEFSR1YtZWxlbWVudCBpcyAiLWZ1IiwgZG8gY29uc2lkZXIgdGhhdCBhbiBhYmJyZXZpYXRpb24gb2YKLSAgICAgdGhlIGxvbmcgb3B0aW9uLCBqdXN0IGxpa2UgIi0tZnUiLCBhbmQgbm90ICItZiIgd2l0aCBhcmcgInUiLgotCi0gICAgIFRoaXMgZGlzdGluY3Rpb24gc2VlbXMgdG8gYmUgdGhlIG1vc3QgdXNlZnVsIGFwcHJvYWNoLiAgKi8KLQotICBpZiAobG9uZ29wdHMgIT0gTlVMTAotICAgICAgJiYgKGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScKLQkgIHx8IChsb25nX29ubHkgJiYgKGFyZ3Zbb3B0aW5kXVsyXSB8fCAhbXlfaW5kZXggKG9wdHN0cmluZywgYXJndltvcHRpbmRdWzFdKSkpKSkKLSAgICB7Ci0gICAgICBjaGFyICpuYW1lZW5kOwotICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqcDsKLSAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKnBmb3VuZCA9IE5VTEw7Ci0gICAgICBpbnQgZXhhY3QgPSAwOwotICAgICAgaW50IGFtYmlnID0gMDsKLSAgICAgIGludCBpbmRmb3VuZCA9IC0xOwotICAgICAgaW50IG9wdGlvbl9pbmRleDsKLQotICAgICAgZm9yIChuYW1lZW5kID0gbmV4dGNoYXI7ICpuYW1lZW5kICYmICpuYW1lZW5kICE9ICc9JzsgbmFtZWVuZCsrKQotCS8qIERvIG5vdGhpbmcuICAqLyA7Ci0KLSAgICAgIC8qIFRlc3QgYWxsIGxvbmcgb3B0aW9ucyBmb3IgZWl0aGVyIGV4YWN0IG1hdGNoCi0JIG9yIGFiYnJldmlhdGVkIG1hdGNoZXMuICAqLwotICAgICAgZm9yIChwID0gbG9uZ29wdHMsIG9wdGlvbl9pbmRleCA9IDA7IHAtPm5hbWU7IHArKywgb3B0aW9uX2luZGV4KyspCi0JaWYgKCFzdHJuY21wIChwLT5uYW1lLCBuZXh0Y2hhciwgbmFtZWVuZCAtIG5leHRjaGFyKSkKLQkgIHsKLQkgICAgaWYgKCh1bnNpZ25lZCBpbnQpIChuYW1lZW5kIC0gbmV4dGNoYXIpCi0JCT09ICh1bnNpZ25lZCBpbnQpIHN0cmxlbiAocC0+bmFtZSkpCi0JICAgICAgewotCQkvKiBFeGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCXBmb3VuZCA9IHA7Ci0JCWluZGZvdW5kID0gb3B0aW9uX2luZGV4OwotCQlleGFjdCA9IDE7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAocGZvdW5kID09IE5VTEwpCi0JICAgICAgewotCQkvKiBGaXJzdCBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCXBmb3VuZCA9IHA7Ci0JCWluZGZvdW5kID0gb3B0aW9uX2luZGV4OwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIC8qIFNlY29uZCBvciBsYXRlciBub25leGFjdCBtYXRjaCBmb3VuZC4gICovCi0JICAgICAgYW1iaWcgPSAxOwotCSAgfQotCi0gICAgICBpZiAoYW1iaWcgJiYgIWV4YWN0KQotCXsKLQkgIGlmIChvcHRlcnIpCi0JICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiBgJXMnIGlzIGFtYmlndW91c1xuIiksCi0JCSAgICAgYXJndlswXSwgYXJndltvcHRpbmRdKTsKLQkgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCSAgb3B0aW5kKys7Ci0JICBvcHRvcHQgPSAwOwotCSAgcmV0dXJuICc/JzsKLQl9Ci0KLSAgICAgIGlmIChwZm91bmQgIT0gTlVMTCkKLQl7Ci0JICBvcHRpb25faW5kZXggPSBpbmRmb3VuZDsKLQkgIG9wdGluZCsrOwotCSAgaWYgKCpuYW1lZW5kKQotCSAgICB7Ci0JICAgICAgLyogRG9uJ3QgdGVzdCBoYXNfYXJnIHdpdGggPiwgYmVjYXVzZSBzb21lIEMgY29tcGlsZXJzIGRvbid0Ci0JCSBhbGxvdyBpdCB0byBiZSB1c2VkIG9uIGVudW1zLiAgKi8KLQkgICAgICBpZiAocGZvdW5kLT5oYXNfYXJnKQotCQlvcHRhcmcgPSBuYW1lZW5kICsgMTsKLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAob3B0ZXJyKQotCQkgICAgewotCQkgICAgICBpZiAoYXJndltvcHRpbmQgLSAxXVsxXSA9PSAnLScpCi0JCQkvKiAtLW9wdGlvbiAqLwotCQkJZnByaW50ZiAoc3RkZXJyLAotCQkJCSBfKCIlczogb3B0aW9uIGAtLSVzJyBkb2Vzbid0IGFsbG93IGFuIGFyZ3VtZW50XG4iKSwKLQkJCQkgYXJndlswXSwgcGZvdW5kLT5uYW1lKTsKLQkJICAgICAgZWxzZQotCQkJLyogK29wdGlvbiBvciAtb3B0aW9uICovCi0JCQlmcHJpbnRmIChzdGRlcnIsCi0JCQkJIF8oIiVzOiBvcHRpb24gYCVjJXMnIGRvZXNuJ3QgYWxsb3cgYW4gYXJndW1lbnRcbiIpLAotCQkJCSBhcmd2WzBdLCBhcmd2W29wdGluZCAtIDFdWzBdLCBwZm91bmQtPm5hbWUpOwotCi0JCSAgICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCi0JCSAgICAgIG9wdG9wdCA9IHBmb3VuZC0+dmFsOwotCQkgICAgICByZXR1cm4gJz8nOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHBmb3VuZC0+aGFzX2FyZyA9PSAxKQotCSAgICB7Ci0JICAgICAgaWYgKG9wdGluZCA8IGFyZ2MpCi0JCW9wdGFyZyA9IGFyZ3Zbb3B0aW5kKytdOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChvcHRlcnIpCi0JCSAgICBmcHJpbnRmIChzdGRlcnIsCi0JCQkgICBfKCIlczogb3B0aW9uIGAlcycgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpLAotCQkJICAgYXJndlswXSwgYXJndltvcHRpbmQgLSAxXSk7Ci0JCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JCSAgb3B0b3B0ID0gcGZvdW5kLT52YWw7Ci0JCSAgcmV0dXJuIG9wdHN0cmluZ1swXSA9PSAnOicgPyAnOicgOiAnPyc7Ci0JCX0KLQkgICAgfQotCSAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JICBpZiAobG9uZ2luZCAhPSBOVUxMKQotCSAgICAqbG9uZ2luZCA9IG9wdGlvbl9pbmRleDsKLQkgIGlmIChwZm91bmQtPmZsYWcpCi0JICAgIHsKLQkgICAgICAqKHBmb3VuZC0+ZmxhZykgPSBwZm91bmQtPnZhbDsKLQkgICAgICByZXR1cm4gMDsKLQkgICAgfQotCSAgcmV0dXJuIHBmb3VuZC0+dmFsOwotCX0KLQotICAgICAgLyogQ2FuJ3QgZmluZCBpdCBhcyBhIGxvbmcgb3B0aW9uLiAgSWYgdGhpcyBpcyBub3QgZ2V0b3B0X2xvbmdfb25seSwKLQkgb3IgdGhlIG9wdGlvbiBzdGFydHMgd2l0aCAnLS0nIG9yIGlzIG5vdCBhIHZhbGlkIHNob3J0Ci0JIG9wdGlvbiwgdGhlbiBpdCdzIGFuIGVycm9yLgotCSBPdGhlcndpc2UgaW50ZXJwcmV0IGl0IGFzIGEgc2hvcnQgb3B0aW9uLiAgKi8KLSAgICAgIGlmICghbG9uZ19vbmx5IHx8IGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScKLQkgIHx8IG15X2luZGV4IChvcHRzdHJpbmcsICpuZXh0Y2hhcikgPT0gTlVMTCkKLQl7Ci0JICBpZiAob3B0ZXJyKQotCSAgICB7Ci0JICAgICAgaWYgKGFyZ3Zbb3B0aW5kXVsxXSA9PSAnLScpCi0JCS8qIC0tb3B0aW9uICovCi0JCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IHVucmVjb2duaXplZCBvcHRpb24gYC0tJXMnXG4iKSwKLQkJCSBhcmd2WzBdLCBuZXh0Y2hhcik7Ci0JICAgICAgZWxzZQotCQkvKiArb3B0aW9uIG9yIC1vcHRpb24gKi8KLQkJZnByaW50ZiAoc3RkZXJyLCBfKCIlczogdW5yZWNvZ25pemVkIG9wdGlvbiBgJWMlcydcbiIpLAotCQkJIGFyZ3ZbMF0sIGFyZ3Zbb3B0aW5kXVswXSwgbmV4dGNoYXIpOwotCSAgICB9Ci0JICBuZXh0Y2hhciA9IChjaGFyICopICIiOwotCSAgb3B0aW5kKys7Ci0JICBvcHRvcHQgPSAwOwotCSAgcmV0dXJuICc/JzsKLQl9Ci0gICAgfQotCi0gIC8qIExvb2sgYXQgYW5kIGhhbmRsZSB0aGUgbmV4dCBzaG9ydCBvcHRpb24tY2hhcmFjdGVyLiAgKi8KLQotICB7Ci0gICAgY2hhciBjID0gKm5leHRjaGFyKys7Ci0gICAgY2hhciAqdGVtcCA9IG15X2luZGV4IChvcHRzdHJpbmcsIGMpOwotCi0gICAgLyogSW5jcmVtZW50IGBvcHRpbmQnIHdoZW4gd2Ugc3RhcnQgdG8gcHJvY2VzcyBpdHMgbGFzdCBjaGFyYWN0ZXIuICAqLwotICAgIGlmICgqbmV4dGNoYXIgPT0gJ1wwJykKLSAgICAgICsrb3B0aW5kOwotCi0gICAgaWYgKHRlbXAgPT0gTlVMTCB8fCBjID09ICc6JykKLSAgICAgIHsKLQlpZiAob3B0ZXJyKQotCSAgewotCSAgICBpZiAocG9zaXhseV9jb3JyZWN0KQotCSAgICAgIC8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLwotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IGlsbGVnYWwgb3B0aW9uIC0tICVjXG4iKSwKLQkJICAgICAgIGFyZ3ZbMF0sIGMpOwotCSAgICBlbHNlCi0JICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCIlczogaW52YWxpZCBvcHRpb24gLS0gJWNcbiIpLAotCQkgICAgICAgYXJndlswXSwgYyk7Ci0JICB9Ci0Jb3B0b3B0ID0gYzsKLQlyZXR1cm4gJz8nOwotICAgICAgfQotICAgIC8qIENvbnZlbmllbmNlLiBUcmVhdCBQT1NJWCAtVyBmb28gc2FtZSBhcyBsb25nIG9wdGlvbiAtLWZvbyAqLwotICAgIGlmICh0ZW1wWzBdID09ICdXJyAmJiB0ZW1wWzFdID09ICc7JykKLSAgICAgIHsKLQljaGFyICpuYW1lZW5kOwotCWNvbnN0IHN0cnVjdCBvcHRpb24gKnA7Ci0JY29uc3Qgc3RydWN0IG9wdGlvbiAqcGZvdW5kID0gTlVMTDsKLQlpbnQgZXhhY3QgPSAwOwotCWludCBhbWJpZyA9IDA7Ci0JaW50IGluZGZvdW5kID0gMDsKLQlpbnQgb3B0aW9uX2luZGV4OwotCi0JLyogVGhpcyBpcyBhbiBvcHRpb24gdGhhdCByZXF1aXJlcyBhbiBhcmd1bWVudC4gICovCi0JaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQotCSAgewotCSAgICBvcHRhcmcgPSBuZXh0Y2hhcjsKLQkgICAgLyogSWYgd2UgZW5kIHRoaXMgQVJHVi1lbGVtZW50IGJ5IHRha2luZyB0aGUgcmVzdCBhcyBhbiBhcmcsCi0JICAgICAgIHdlIG11c3QgYWR2YW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IG5vdy4gICovCi0JICAgIG9wdGluZCsrOwotCSAgfQotCWVsc2UgaWYgKG9wdGluZCA9PSBhcmdjKQotCSAgewotCSAgICBpZiAob3B0ZXJyKQotCSAgICAgIHsKLQkJLyogMTAwMy4yIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoaXMgbWVzc2FnZS4gICovCi0JCWZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAlY1xuIiksCi0JCQkgYXJndlswXSwgYyk7Ci0JICAgICAgfQotCSAgICBvcHRvcHQgPSBjOwotCSAgICBpZiAob3B0c3RyaW5nWzBdID09ICc6JykKLQkgICAgICBjID0gJzonOwotCSAgICBlbHNlCi0JICAgICAgYyA9ICc/JzsKLQkgICAgcmV0dXJuIGM7Ci0JICB9Ci0JZWxzZQotCSAgLyogV2UgYWxyZWFkeSBpbmNyZW1lbnRlZCBgb3B0aW5kJyBvbmNlOwotCSAgICAgaW5jcmVtZW50IGl0IGFnYWluIHdoZW4gdGFraW5nIG5leHQgQVJHVi1lbHQgYXMgYXJndW1lbnQuICAqLwotCSAgb3B0YXJnID0gYXJndltvcHRpbmQrK107Ci0KLQkvKiBvcHRhcmcgaXMgbm93IHRoZSBhcmd1bWVudCwgc2VlIGlmIGl0J3MgaW4gdGhlCi0JICAgdGFibGUgb2YgbG9uZ29wdHMuICAqLwotCi0JZm9yIChuZXh0Y2hhciA9IG5hbWVlbmQgPSBvcHRhcmc7ICpuYW1lZW5kICYmICpuYW1lZW5kICE9ICc9JzsgbmFtZWVuZCsrKQotCSAgLyogRG8gbm90aGluZy4gICovIDsKLQotCS8qIFRlc3QgYWxsIGxvbmcgb3B0aW9ucyBmb3IgZWl0aGVyIGV4YWN0IG1hdGNoCi0JICAgb3IgYWJicmV2aWF0ZWQgbWF0Y2hlcy4gICovCi0JZm9yIChwID0gbG9uZ29wdHMsIG9wdGlvbl9pbmRleCA9IDA7IHAtPm5hbWU7IHArKywgb3B0aW9uX2luZGV4KyspCi0JICBpZiAoIXN0cm5jbXAgKHAtPm5hbWUsIG5leHRjaGFyLCBuYW1lZW5kIC0gbmV4dGNoYXIpKQotCSAgICB7Ci0JICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpIChuYW1lZW5kIC0gbmV4dGNoYXIpID09IHN0cmxlbiAocC0+bmFtZSkpCi0JCXsKLQkJICAvKiBFeGFjdCBtYXRjaCBmb3VuZC4gICovCi0JCSAgcGZvdW5kID0gcDsKLQkJICBpbmRmb3VuZCA9IG9wdGlvbl9pbmRleDsKLQkJICBleGFjdCA9IDE7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChwZm91bmQgPT0gTlVMTCkKLQkJewotCQkgIC8qIEZpcnN0IG5vbmV4YWN0IG1hdGNoIGZvdW5kLiAgKi8KLQkJICBwZm91bmQgPSBwOwotCQkgIGluZGZvdW5kID0gb3B0aW9uX2luZGV4OwotCQl9Ci0JICAgICAgZWxzZQotCQkvKiBTZWNvbmQgb3IgbGF0ZXIgbm9uZXhhY3QgbWF0Y2ggZm91bmQuICAqLwotCQlhbWJpZyA9IDE7Ci0JICAgIH0KLQlpZiAoYW1iaWcgJiYgIWV4YWN0KQotCSAgewotCSAgICBpZiAob3B0ZXJyKQotCSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiJXM6IG9wdGlvbiBgLVcgJXMnIGlzIGFtYmlndW91c1xuIiksCi0JCSAgICAgICBhcmd2WzBdLCBhcmd2W29wdGluZF0pOwotCSAgICBuZXh0Y2hhciArPSBzdHJsZW4gKG5leHRjaGFyKTsKLQkgICAgb3B0aW5kKys7Ci0JICAgIHJldHVybiAnPyc7Ci0JICB9Ci0JaWYgKHBmb3VuZCAhPSBOVUxMKQotCSAgewotCSAgICBvcHRpb25faW5kZXggPSBpbmRmb3VuZDsKLQkgICAgaWYgKCpuYW1lZW5kKQotCSAgICAgIHsKLQkJLyogRG9uJ3QgdGVzdCBoYXNfYXJnIHdpdGggPiwgYmVjYXVzZSBzb21lIEMgY29tcGlsZXJzIGRvbid0Ci0JCSAgIGFsbG93IGl0IHRvIGJlIHVzZWQgb24gZW51bXMuICAqLwotCQlpZiAocGZvdW5kLT5oYXNfYXJnKQotCQkgIG9wdGFyZyA9IG5hbWVlbmQgKyAxOwotCQllbHNlCi0JCSAgewotCQkgICAgaWYgKG9wdGVycikKLQkJICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJcCi0lczogb3B0aW9uIGAtVyAlcycgZG9lc24ndCBhbGxvdyBhbiBhcmd1bWVudFxuIiksCi0JCQkgICAgICAgYXJndlswXSwgcGZvdW5kLT5uYW1lKTsKLQotCQkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JCSAgICByZXR1cm4gJz8nOwotCQkgIH0KLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKHBmb3VuZC0+aGFzX2FyZyA9PSAxKQotCSAgICAgIHsKLQkJaWYgKG9wdGluZCA8IGFyZ2MpCi0JCSAgb3B0YXJnID0gYXJndltvcHRpbmQrK107Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAob3B0ZXJyKQotCQkgICAgICBmcHJpbnRmIChzdGRlcnIsCi0JCQkgICAgICAgXygiJXM6IG9wdGlvbiBgJXMnIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKSwKLQkJCSAgICAgICBhcmd2WzBdLCBhcmd2W29wdGluZCAtIDFdKTsKLQkJICAgIG5leHRjaGFyICs9IHN0cmxlbiAobmV4dGNoYXIpOwotCQkgICAgcmV0dXJuIG9wdHN0cmluZ1swXSA9PSAnOicgPyAnOicgOiAnPyc7Ci0JCSAgfQotCSAgICAgIH0KLQkgICAgbmV4dGNoYXIgKz0gc3RybGVuIChuZXh0Y2hhcik7Ci0JICAgIGlmIChsb25naW5kICE9IE5VTEwpCi0JICAgICAgKmxvbmdpbmQgPSBvcHRpb25faW5kZXg7Ci0JICAgIGlmIChwZm91bmQtPmZsYWcpCi0JICAgICAgewotCQkqKHBmb3VuZC0+ZmxhZykgPSBwZm91bmQtPnZhbDsKLQkJcmV0dXJuIDA7Ci0JICAgICAgfQotCSAgICByZXR1cm4gcGZvdW5kLT52YWw7Ci0JICB9Ci0JICBuZXh0Y2hhciA9IE5VTEw7Ci0JICByZXR1cm4gJ1cnOwkvKiBMZXQgdGhlIGFwcGxpY2F0aW9uIGhhbmRsZSBpdC4gICAqLwotICAgICAgfQotICAgIGlmICh0ZW1wWzFdID09ICc6JykKLSAgICAgIHsKLQlpZiAodGVtcFsyXSA9PSAnOicpCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgYWNjZXB0cyBhbiBhcmd1bWVudCBvcHRpb25hbGx5LiAgKi8KLQkgICAgaWYgKCpuZXh0Y2hhciAhPSAnXDAnKQotCSAgICAgIHsKLQkJb3B0YXJnID0gbmV4dGNoYXI7Ci0JCW9wdGluZCsrOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIG9wdGFyZyA9IE5VTEw7Ci0JICAgIG5leHRjaGFyID0gTlVMTDsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIC8qIFRoaXMgaXMgYW4gb3B0aW9uIHRoYXQgcmVxdWlyZXMgYW4gYXJndW1lbnQuICAqLwotCSAgICBpZiAoKm5leHRjaGFyICE9ICdcMCcpCi0JICAgICAgewotCQlvcHRhcmcgPSBuZXh0Y2hhcjsKLQkJLyogSWYgd2UgZW5kIHRoaXMgQVJHVi1lbGVtZW50IGJ5IHRha2luZyB0aGUgcmVzdCBhcyBhbiBhcmcsCi0JCSAgIHdlIG11c3QgYWR2YW5jZSB0byB0aGUgbmV4dCBlbGVtZW50IG5vdy4gICovCi0JCW9wdGluZCsrOwotCSAgICAgIH0KLQkgICAgZWxzZSBpZiAob3B0aW5kID09IGFyZ2MpCi0JICAgICAgewotCQlpZiAob3B0ZXJyKQotCQkgIHsKLQkJICAgIC8qIDEwMDMuMiBzcGVjaWZpZXMgdGhlIGZvcm1hdCBvZiB0aGlzIG1lc3NhZ2UuICAqLwotCQkgICAgZnByaW50ZiAoc3RkZXJyLAotCQkJICAgXygiJXM6IG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCAtLSAlY1xuIiksCi0JCQkgICBhcmd2WzBdLCBjKTsKLQkJICB9Ci0JCW9wdG9wdCA9IGM7Ci0JCWlmIChvcHRzdHJpbmdbMF0gPT0gJzonKQotCQkgIGMgPSAnOic7Ci0JCWVsc2UKLQkJICBjID0gJz8nOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIC8qIFdlIGFscmVhZHkgaW5jcmVtZW50ZWQgYG9wdGluZCcgb25jZTsKLQkJIGluY3JlbWVudCBpdCBhZ2FpbiB3aGVuIHRha2luZyBuZXh0IEFSR1YtZWx0IGFzIGFyZ3VtZW50LiAgKi8KLQkgICAgICBvcHRhcmcgPSBhcmd2W29wdGluZCsrXTsKLQkgICAgbmV4dGNoYXIgPSBOVUxMOwotCSAgfQotICAgICAgfQotICAgIHJldHVybiBjOwotICB9Ci19Ci0KLWludAotZ2V0b3B0IChhcmdjLCBhcmd2LCBvcHRzdHJpbmcpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICpjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqb3B0c3RyaW5nOwotewotICByZXR1cm4gX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0c3RyaW5nLAotCQkJICAgKGNvbnN0IHN0cnVjdCBvcHRpb24gKikgMCwKLQkJCSAgIChpbnQgKikgMCwKLQkJCSAgIDApOwotfQotCi0jZW5kaWYJLyogTm90IEVMSURFX0NPREUuICAqLwotDAotI2lmZGVmIFRFU1QKLQotLyogQ29tcGlsZSB3aXRoIC1EVEVTVCB0byBtYWtlIGFuIGV4ZWN1dGFibGUgZm9yIHVzZSBpbiB0ZXN0aW5nCi0gICB0aGUgYWJvdmUgZGVmaW5pdGlvbiBvZiBgZ2V0b3B0Jy4gICovCi0KLWludAotbWFpbiAoYXJnYywgYXJndikKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKiphcmd2OwotewotICBpbnQgYzsKLSAgaW50IGRpZ2l0X29wdGluZCA9IDA7Ci0KLSAgd2hpbGUgKDEpCi0gICAgewotICAgICAgaW50IHRoaXNfb3B0aW9uX29wdGluZCA9IG9wdGluZCA/IG9wdGluZCA6IDE7Ci0KLSAgICAgIGMgPSBnZXRvcHQgKGFyZ2MsIGFyZ3YsICJhYmM6ZDowMTIzNDU2Nzg5Iik7Ci0gICAgICBpZiAoYyA9PSAtMSkKLQlicmVhazsKLQotICAgICAgc3dpdGNoIChjKQotCXsKLQljYXNlICcwJzoKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQkgIGlmIChkaWdpdF9vcHRpbmQgIT0gMCAmJiBkaWdpdF9vcHRpbmQgIT0gdGhpc19vcHRpb25fb3B0aW5kKQotCSAgICBwcmludGYgKCJkaWdpdHMgb2NjdXIgaW4gdHdvIGRpZmZlcmVudCBhcmd2LWVsZW1lbnRzLlxuIik7Ci0JICBkaWdpdF9vcHRpbmQgPSB0aGlzX29wdGlvbl9vcHRpbmQ7Ci0JICBwcmludGYgKCJvcHRpb24gJWNcbiIsIGMpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdhJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBhXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYic6Ci0JICBwcmludGYgKCJvcHRpb24gYlxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJ2MnOgotCSAgcHJpbnRmICgib3B0aW9uIGMgd2l0aCB2YWx1ZSBgJXMnXG4iLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICc/JzoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIj8/IGdldG9wdCByZXR1cm5lZCBjaGFyYWN0ZXIgY29kZSAwJW8gPz9cbiIsIGMpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgcHJpbnRmICgibm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzOiAiKTsKLSAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotCXByaW50ZiAoIiVzICIsIGFyZ3Zbb3B0aW5kKytdKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotCi0gIGV4aXQgKDApOwotfQotCi0jZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldG9wdDEuYyBiL2xpYmliZXJ0eS9nZXRvcHQxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjU3MzcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2dldG9wdDEuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKiBnZXRvcHRfbG9uZyBhbmQgZ2V0b3B0X2xvbmdfb25seSBlbnRyeSBwb2ludHMgZm9yIEdOVSBnZXRvcHQuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODcsODgsODksOTAsOTEsOTIsOTMsOTQsOTYsOTcsOTgKLSAgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0MCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgPGNvbmZpZy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJnZXRvcHQuaCIKLQotI2lmICFkZWZpbmVkIF9fU1REQ19fIHx8ICFfX1NURENfXwotLyogVGhpcyBpcyBhIHNlcGFyYXRlIGNvbmRpdGlvbmFsIHNpbmNlIHNvbWUgc3RkYyBzeXN0ZW1zCi0gICByZWplY3QgYGRlZmluZWQgKGNvbnN0KScuICAqLwotI2lmbmRlZiBjb25zdAotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLS8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAotICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZi4gIFRoaXMgY29kZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQwotICAgTGlicmFyeSwgYnV0IGFsc28gaW5jbHVkZWQgaW4gbWFueSBvdGhlciBHTlUgZGlzdHJpYnV0aW9ucy4gIENvbXBpbGluZwotICAgYW5kIGxpbmtpbmcgaW4gdGhpcyBjb2RlIGlzIGEgd2FzdGUgd2hlbiB1c2luZyB0aGUgR05VIEMgbGlicmFyeQotICAgKGVzcGVjaWFsbHkgaWYgaXQgaXMgYSBzaGFyZWQgbGlicmFyeSkuICBSYXRoZXIgdGhhbiBoYXZpbmcgZXZlcnkgR05VCi0gICBwcm9ncmFtIHVuZGVyc3RhbmQgYGNvbmZpZ3VyZSAtLXdpdGgtZ251LWxpYmMnIGFuZCBvbWl0IHRoZSBvYmplY3QgZmlsZXMsCi0gICBpdCBpcyBzaW1wbGVyIHRvIGp1c3QgZG8gdGhpcyBpbiB0aGUgc291cmNlIGZvciBlYWNoIHN1Y2ggZmlsZS4gICovCi0KLSNkZWZpbmUgR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OIDIKLSNpZiAhZGVmaW5lZCBfTElCQyAmJiBkZWZpbmVkIF9fR0xJQkNfXyAmJiBfX0dMSUJDX18gPj0gMgotI2luY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgotI2lmIF9HTlVfR0VUT1BUX0lOVEVSRkFDRV9WRVJTSU9OID09IEdFVE9QVF9JTlRFUkZBQ0VfVkVSU0lPTgotI2RlZmluZSBFTElERV9DT0RFCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEVMSURFX0NPREUKLQotCi0vKiBUaGlzIG5lZWRzIHRvIGNvbWUgYWZ0ZXIgc29tZSBsaWJyYXJ5ICNpbmNsdWRlCi0gICB0byBnZXQgX19HTlVfTElCUkFSWV9fIGRlZmluZWQuICAqLwotI2lmZGVmIF9fR05VX0xJQlJBUllfXwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZm5kZWYJTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi1pbnQKLWdldG9wdF9sb25nIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCkKLSAgICAgaW50IGFyZ2M7Ci0gICAgIGNoYXIgKmNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICpvcHRpb25zOwotICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnM7Ci0gICAgIGludCAqb3B0X2luZGV4OwotewotICByZXR1cm4gX2dldG9wdF9pbnRlcm5hbCAoYXJnYywgYXJndiwgb3B0aW9ucywgbG9uZ19vcHRpb25zLCBvcHRfaW5kZXgsIDApOwotfQotCi0vKiBMaWtlIGdldG9wdF9sb25nLCBidXQgJy0nIGFzIHdlbGwgYXMgJy0tJyBjYW4gaW5kaWNhdGUgYSBsb25nIG9wdGlvbi4KLSAgIElmIGFuIG9wdGlvbiB0aGF0IHN0YXJ0cyB3aXRoICctJyAobm90ICctLScpIGRvZXNuJ3QgbWF0Y2ggYSBsb25nIG9wdGlvbiwKLSAgIGJ1dCBkb2VzIG1hdGNoIGEgc2hvcnQgb3B0aW9uLCBpdCBpcyBwYXJzZWQgYXMgYSBzaG9ydCBvcHRpb24KLSAgIGluc3RlYWQuICAqLwotCi1pbnQKLWdldG9wdF9sb25nX29ubHkgKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGxvbmdfb3B0aW9ucywgb3B0X2luZGV4KQotICAgICBpbnQgYXJnYzsKLSAgICAgY2hhciAqY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKm9wdGlvbnM7Ci0gICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKmxvbmdfb3B0aW9uczsKLSAgICAgaW50ICpvcHRfaW5kZXg7Ci17Ci0gIHJldHVybiBfZ2V0b3B0X2ludGVybmFsIChhcmdjLCBhcmd2LCBvcHRpb25zLCBsb25nX29wdGlvbnMsIG9wdF9pbmRleCwgMSk7Ci19Ci0KLQotI2VuZGlmCS8qIE5vdCBFTElERV9DT0RFLiAgKi8KLQwKLSNpZmRlZiBURVNUCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKGFyZ2MsIGFyZ3YpCi0gICAgIGludCBhcmdjOwotICAgICBjaGFyICoqYXJndjsKLXsKLSAgaW50IGM7Ci0gIGludCBkaWdpdF9vcHRpbmQgPSAwOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIGludCB0aGlzX29wdGlvbl9vcHRpbmQgPSBvcHRpbmQgPyBvcHRpbmQgOiAxOwotICAgICAgaW50IG9wdGlvbl9pbmRleCA9IDA7Ci0gICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9Ci0gICAgICB7Ci0JeyJhZGQiLCAxLCAwLCAwfSwKLQl7ImFwcGVuZCIsIDAsIDAsIDB9LAotCXsiZGVsZXRlIiwgMSwgMCwgMH0sCi0JeyJ2ZXJib3NlIiwgMCwgMCwgMH0sCi0JeyJjcmVhdGUiLCAwLCAwLCAwfSwKLQl7ImZpbGUiLCAxLCAwLCAwfSwKLQl7MCwgMCwgMCwgMH0KLSAgICAgIH07Ci0KLSAgICAgIGMgPSBnZXRvcHRfbG9uZyAoYXJnYywgYXJndiwgImFiYzpkOjAxMjM0NTY3ODkiLAotCQkgICAgICAgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKLSAgICAgIGlmIChjID09IC0xKQotCWJyZWFrOwotCi0gICAgICBzd2l0Y2ggKGMpCi0JewotCWNhc2UgMDoKLQkgIHByaW50ZiAoIm9wdGlvbiAlcyIsIGxvbmdfb3B0aW9uc1tvcHRpb25faW5kZXhdLm5hbWUpOwotCSAgaWYgKG9wdGFyZykKLQkgICAgcHJpbnRmICgiIHdpdGggYXJnICVzIiwgb3B0YXJnKTsKLQkgIHByaW50ZiAoIlxuIik7Ci0JICBicmVhazsKLQotCWNhc2UgJzAnOgotCWNhc2UgJzEnOgotCWNhc2UgJzInOgotCWNhc2UgJzMnOgotCWNhc2UgJzQnOgotCWNhc2UgJzUnOgotCWNhc2UgJzYnOgotCWNhc2UgJzcnOgotCWNhc2UgJzgnOgotCWNhc2UgJzknOgotCSAgaWYgKGRpZ2l0X29wdGluZCAhPSAwICYmIGRpZ2l0X29wdGluZCAhPSB0aGlzX29wdGlvbl9vcHRpbmQpCi0JICAgIHByaW50ZiAoImRpZ2l0cyBvY2N1ciBpbiB0d28gZGlmZmVyZW50IGFyZ3YtZWxlbWVudHMuXG4iKTsKLQkgIGRpZ2l0X29wdGluZCA9IHRoaXNfb3B0aW9uX29wdGluZDsKLQkgIHByaW50ZiAoIm9wdGlvbiAlY1xuIiwgYyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2EnOgotCSAgcHJpbnRmICgib3B0aW9uIGFcbiIpOwotCSAgYnJlYWs7Ci0KLQljYXNlICdiJzoKLQkgIHByaW50ZiAoIm9wdGlvbiBiXG4iKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAnYyc6Ci0JICBwcmludGYgKCJvcHRpb24gYyB3aXRoIHZhbHVlIGAlcydcbiIsIG9wdGFyZyk7Ci0JICBicmVhazsKLQotCWNhc2UgJ2QnOgotCSAgcHJpbnRmICgib3B0aW9uIGQgd2l0aCB2YWx1ZSBgJXMnXG4iLCBvcHRhcmcpOwotCSAgYnJlYWs7Ci0KLQljYXNlICc/JzoKLQkgIGJyZWFrOwotCi0JZGVmYXVsdDoKLQkgIHByaW50ZiAoIj8/IGdldG9wdCByZXR1cm5lZCBjaGFyYWN0ZXIgY29kZSAwJW8gPz9cbiIsIGMpOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgewotICAgICAgcHJpbnRmICgibm9uLW9wdGlvbiBBUkdWLWVsZW1lbnRzOiAiKTsKLSAgICAgIHdoaWxlIChvcHRpbmQgPCBhcmdjKQotCXByaW50ZiAoIiVzICIsIGFyZ3Zbb3B0aW5kKytdKTsKLSAgICAgIHByaW50ZiAoIlxuIik7Ci0gICAgfQotCi0gIGV4aXQgKDApOwotfQotCi0jZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2dldHBhZ2VzaXplLmMgYi9saWJpYmVydHkvZ2V0cGFnZXNpemUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY0ZDZjMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZ2V0cGFnZXNpemUuYworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qIEVtdWxhdGlvbiBvZiBnZXRwYWdlc2l6ZSgpIGZvciBzeXN0ZW1zIHRoYXQgbmVlZCBpdC4gKi8KLQotLyoKLQotTkFNRQotCi0JZ2V0cGFnZXNpemUgLS0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gcGFnZSBvZiBtZW1vcnkKLQotU1lOT1BTSVMKLQotCWludCBnZXRwYWdlc2l6ZSAodm9pZCkKLQotREVTQ1JJUFRJT04KLQotCVJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHBhZ2Ugb2YgbWVtb3J5LiAgVGhpcyBpcyB0aGUKLQlncmFudWxhcml0eSBvZiBtYW55IG9mIHRoZSBzeXN0ZW0gbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMuCi0JTm8gZ3VhcmFudGVlIGlzIG1hZGUgYXMgdG8gd2hldGhlciBvciBub3QgaXQgaXMgdGhlIHNhbWUgYXMgdGhlCi0JYmFzaWMgbWVtb3J5IG1hbmFnZW1lbnQgaGFyZHdhcmUgcGFnZSBzaXplLgotCi1CVUdTCi0KLQlJcyBpbnRlbmRlZCBhcyBhIHJlYXNvbmFibGUgcmVwbGFjZW1lbnQgZm9yIHN5c3RlbXMgd2hlcmUgdGhpcwotCWlzIG5vdCBwcm92aWRlZCBhcyBhIHN5c3RlbSBjYWxsLiAgVGhlIHZhbHVlIG9mIDQwOTYgbWF5IG9yIG1heQotCW5vdCBiZSBjb3JyZWN0IGZvciB0aGUgc3lzdGVtcyB3aGVyZSBpdCBpcyByZXR1cm5lZCBhcyB0aGUgZGVmYXVsdAotCXZhbHVlLgotCi0qLwotCi0jaWZuZGVmIFZNUwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jaW5jbHVkZSA8c3lzL3BhcmFtLmg+Ci0jZW5kaWYKLQotI3VuZGVmIEdOVV9PVVJfUEFHRVNJWkUKLSNpZiBkZWZpbmVkIChIQVZFX1NZU0NPTkYpICYmIGRlZmluZWQgKEhBVkVfVU5JU1REX0gpCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaWZkZWYgX1NDX1BBR0VTSVpFCi0jZGVmaW5lIEdOVV9PVVJfUEFHRVNJWkUgc3lzY29uZihfU0NfUEFHRVNJWkUpCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEdOVV9PVVJfUEFHRVNJWkUKLSMgaWZkZWYJUEFHRVNJWkUKLSMgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIFBBR0VTSVpFCi0jIGVsc2UJLyogbm8gUEFHRVNJWkUgKi8KLSMgIGlmZGVmCUVYRUNfUEFHRVNJWkUKLSMgICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSBFWEVDX1BBR0VTSVpFCi0jICBlbHNlCS8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICBpZmRlZglOQlBHCi0jICAgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIChOQlBHICogQ0xTSVpFKQotIyAgICBpZm5kZWYJQ0xTSVpFCi0jICAgICBkZWZpbmUJQ0xTSVpFIDEKLSMgICAgZW5kaWYJLyogQ0xTSVpFICovCi0jICAgZWxzZQkvKiBubyBOQlBHICovCi0jICAgIGlmZGVmCU5CUEMKLSMgICAgIGRlZmluZQlHTlVfT1VSX1BBR0VTSVpFIE5CUEMKLSMgICAgZWxzZQkvKiBubyBOQlBDICovCi0jICAgICBkZWZpbmUJR05VX09VUl9QQUdFU0laRSA0MDk2CS8qIEp1c3QgcHVudCBhbmQgdXNlIHJlYXNvbmFibGUgdmFsdWUgKi8KLSMgICAgZW5kaWYgLyogTkJQQyAqLwotIyAgIGVuZGlmIC8qIE5CUEcgKi8KLSMgIGVuZGlmIC8qIEVYRUNfUEFHRVNJWkUgKi8KLSMgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSNlbmRpZiAvKiBHTlVfT1VSX1BBR0VTSVpFICovCi0KLWludAotZ2V0cGFnZXNpemUgKCkKLXsKLSAgcmV0dXJuIChHTlVfT1VSX1BBR0VTSVpFKTsKLX0KLQotI2Vsc2UgLyogVk1TICovCi0KLSNpZiAwCS8qIG9sZGVyIGRpc3RyaWJ1dGlvbnMgb2YgZ2NjLXZtcyBhcmUgbWlzc2luZyA8c3lpZGVmLmg+ICovCi0jaW5jbHVkZSA8c3lpZGVmLmg+Ci0jZW5kaWYKLSNpZm5kZWYgU1lJJF9QQUdFX1NJWkUJLyogVk1TIFY1LjQgYW5kIGVhcmxpZXIgZGlkbid0IGhhdmUgdGhpcyB5ZXQgKi8KLSNkZWZpbmUgU1lJJF9QQUdFX1NJWkUgNDQ1MgotI2VuZGlmCi1leHRlcm4gdW5zaWduZWQgbG9uZyBsaWIkZ2V0c3lpKGNvbnN0IHVuc2lnbmVkIHNob3J0ICosLi4uKTsKLQotaW50IGdldHBhZ2VzaXplICgpCi17Ci0gIGxvbmcgcGFnc2l6ID0gMEw7Ci0gIHVuc2lnbmVkIHNob3J0IGl0bWNvZCA9IFNZSSRfUEFHRV9TSVpFOwotCi0gICh2b2lkKSBsaWIkZ2V0c3lpICgmaXRtY29kLCAodm9pZCAqKSAmcGFnc2l6KTsKLSAgaWYgKHBhZ3NpeiA9PSAwTCkKLSAgICBwYWdzaXogPSA1MTJMOwkvKiBWQVggZGVmYXVsdCAqLwotICByZXR1cm4gKGludCkgcGFnc2l6OwotfQotCi0jZW5kaWYgLyogVk1TICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvZ2V0cnVudGltZS5jIGIvbGliaWJlcnR5L2dldHJ1bnRpbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1NWVhNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvZ2V0cnVudGltZS5jCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyogUmV0dXJuIHRpbWUgdXNlZCBzbyBmYXIsIGluIG1pY3Jvc2Vjb25kcy4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLS8qIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gZ2V0IGVsYXBzZWQgZXhlY3V0aW9uIHRpbWU7IHVuZm9ydHVuYXRlbHkgbm8KLSAgIHNpbmdsZSB3YXkgaXMgYXZhaWxhYmxlIGZvciBhbGwgaG9zdCBzeXN0ZW1zLCBub3IgYXJlIHRoZXJlIHJlbGlhYmxlCi0gICB3YXlzIHRvIGZpbmQgb3V0IHdoaWNoIHdheSBpcyBjb3JyZWN0IGZvciBhIGdpdmVuIGhvc3QuICovCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpZiBkZWZpbmVkIChIQVZFX0dFVFJVU0FHRSkgJiYgZGVmaW5lZCAoSEFWRV9TWVNfUkVTT1VSQ0VfSCkKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1RJTUVTCi0jaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL3RpbWVzLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0vKiBUaGlzIGlzIGEgZmFsbGJhY2s7IGlmIHdyb25nLCBpdCB3aWxsIGxpa2VseSBtYWtlIG9idmlvdXNseSB3cm9uZwotICAgcmVzdWx0cy4gKi8KLQotI2lmbmRlZiBDTE9DS1NfUEVSX1NFQwotI2RlZmluZSBDTE9DS1NfUEVSX1NFQyAxCi0jZW5kaWYKLQotI2lmZGVmIF9TQ19DTEtfVENLCi0jZGVmaW5lIEdOVV9IWiAgc3lzY29uZihfU0NfQ0xLX1RDSykKLSNlbHNlCi0jaWZkZWYgSFoKLSNkZWZpbmUgR05VX0haICBIWgotI2Vsc2UKLSNpZmRlZiBDTE9DS1NfUEVSX1NFQwotI2RlZmluZSBHTlVfSFogIENMT0NLU19QRVJfU0VDCi0jZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLWxvbmcKLWdldF9ydW5fdGltZSAoKQotewotI2lmIGRlZmluZWQgKEhBVkVfR0VUUlVTQUdFKSAmJiBkZWZpbmVkIChIQVZFX1NZU19SRVNPVVJDRV9IKQotICBzdHJ1Y3QgcnVzYWdlIHJ1c2FnZTsKLQotICBnZXRydXNhZ2UgKDAsICZydXNhZ2UpOwotICByZXR1cm4gKHJ1c2FnZS5ydV91dGltZS50dl9zZWMgKiAxMDAwMDAwICsgcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMKLQkgICsgcnVzYWdlLnJ1X3N0aW1lLnR2X3NlYyAqIDEwMDAwMDAgKyBydXNhZ2UucnVfc3RpbWUudHZfdXNlYyk7Ci0jZWxzZSAvKiAhIEhBVkVfR0VUUlVTQUdFICovCi0jaWZkZWYgSEFWRV9USU1FUwotICBzdHJ1Y3QgdG1zIHRtczsKLQotICB0aW1lcyAoJnRtcyk7Ci0gIHJldHVybiAodG1zLnRtc191dGltZSArIHRtcy50bXNfc3RpbWUpICogKDEwMDAwMDAgLyBHTlVfSFopOwotI2Vsc2UgLyogISBIQVZFX1RJTUVTICovCi0gIC8qIEZhbGwgYmFjayBvbiBjbG9jayBhbmQgaG9wZSBpdCdzIGNvcnJlY3RseSBpbXBsZW1lbnRlZC4gKi8KLSAgY29uc3QgbG9uZyBjbG9ja3NfcGVyX3NlYyA9IENMT0NLU19QRVJfU0VDOwotICBpZiAoY2xvY2tzX3Blcl9zZWMgPD0gMTAwMDAwMCkKLSAgICByZXR1cm4gY2xvY2sgKCkgKiAoMTAwMDAwMCAvIGNsb2Nrc19wZXJfc2VjKTsKLSAgZWxzZQotICAgIHJldHVybiBjbG9jayAoKSAvIGNsb2Nrc19wZXJfc2VjOwotI2VuZGlmICAvKiBIQVZFX1RJTUVTICovCi0jZW5kaWYgIC8qIEhBVkVfR0VUUlVTQUdFICovCi19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvaGV4LmMgYi9saWJpYmVydHkvaGV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMmVlZjAuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2hleC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogSGV4IGNoYXJhY3RlciBtYW5pcHVsYXRpb24gc3VwcG9ydC4KLSAgIENvcHlyaWdodCAoQykgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgotTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1MaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFsb25nIHdpdGggbGliaWJlcnR5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZgotbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotY2hhciBfaGV4X3ZhbHVlW19oZXhfYXJyYXlfc2l6ZV07Ci0KLXZvaWQgaGV4X2luaXQgKCkKLXsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBfaGV4X2FycmF5X3NpemU7IGkrKykKLSAgICBfaGV4X3ZhbHVlW2ldID0gX2hleF9iYWQ7Ci0gIGZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQotICAgIF9oZXhfdmFsdWVbJzAnICsgaV0gPSBpOwotICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotICAgIF9oZXhfdmFsdWVbJ2EnICsgaV0gPSBfaGV4X3ZhbHVlWydBJyArIGldID0gMTAgKyBpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L2luZGV4LmMgYi9saWJpYmVydHkvaW5kZXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVhMDBmNS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvaW5kZXguYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIFN0dWIgaW1wbGVtZW50YXRpb24gb2YgKG9ic29sZXRlKSBpbmRleCgpLiAqLwotCi1leHRlcm4gY2hhciAqIHN0cmNocigpOwotCi1jaGFyICoKLWluZGV4IChzLCBjKQotICBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgcmV0dXJuIHN0cmNociAocywgYyk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvaW5zcXVlLmMgYi9saWJpYmVydHkvaW5zcXVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NTAxOWYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L2luc3F1ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyogaW5zcXVlKDNDKSByb3V0aW5lcwotICAgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQlpbnNxdWUsIHJlbXF1ZSAtLSBpbnNlcnQsIHJlbW92ZSBhbiBlbGVtZW50IGZyb20gYSBxdWV1ZQotCi1TWU5PUFNJUwotCXN0cnVjdCBxZWxlbSB7Ci0JICBzdHJ1Y3QgcWVsZW0gKnFfZm9ydzsKLQkgIHN0cnVjdCBxZWxlbSAqcV9iYWNrOwotCSAgY2hhciBxX2RhdGFbXTsKLQl9OwotCi0Jdm9pZCBpbnNxdWUgKHN0cnVjdCBxZWxlbSAqZWxlbSwgc3RydWN0IHFlbGVtICpwcmVkKQotCi0Jdm9pZCByZW1xdWUgKHN0cnVjdCBxZWxlbSAqZWxlbSkKLQotREVTQ1JJUFRJT04KLQlSb3V0aW5lcyB0byBtYW5pcHVsYXRlIHF1ZXVlcyBidWlsdCBmcm9tIGRvdWJseSBsaW5rZWQgbGlzdHMuCi0JVGhlIGluc3F1ZSByb3V0aW5lIGluc2VydHMgRUxFTSBpbiB0aGUgcXVldWUgaW1tZWRpYXRlbHkgYWZ0ZXIKLQlQUkVELiAgVGhlIHJlbXF1ZSByb3V0aW5lIHJlbW92ZXMgRUxFTSBmcm9tIGl0cyBjb250YWluaW5nIHF1ZXVlLgotKi8KLQotCi1zdHJ1Y3QgcWVsZW0gewotICBzdHJ1Y3QgcWVsZW0gKnFfZm9ydzsKLSAgc3RydWN0IHFlbGVtICpxX2JhY2s7Ci19OwotCi0KLXZvaWQKLWluc3F1ZSAoZWxlbSwgcHJlZCkKLSAgc3RydWN0IHFlbGVtICplbGVtOwotICBzdHJ1Y3QgcWVsZW0gKnByZWQ7Ci17Ci0gIGVsZW0gLT4gcV9mb3J3ID0gcHJlZCAtPiBxX2Zvcnc7Ci0gIHByZWQgLT4gcV9mb3J3IC0+IHFfYmFjayA9IGVsZW07Ci0gIGVsZW0gLT4gcV9iYWNrID0gcHJlZDsKLSAgcHJlZCAtPiBxX2ZvcncgPSBlbGVtOwotfQotCi0KLXZvaWQKLXJlbXF1ZSAoZWxlbSkKLSAgc3RydWN0IHFlbGVtICplbGVtOwotewotICBlbGVtIC0+IHFfZm9ydyAtPiBxX2JhY2sgPSBlbGVtIC0+IHFfYmFjazsKLSAgZWxlbSAtPiBxX2JhY2sgLT4gcV9mb3J3ID0gZWxlbSAtPiBxX2Zvcnc7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWFrZWZpbGUuZG9zIGIvbGliaWJlcnR5L21ha2VmaWxlLmRvcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ViYTYyYy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWFrZWZpbGUuZG9zCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotQ0ZMQUdTPS1PMgotCi1PQkpTID0gXAotCWFyZ3YubyBcCi0JYmFzZW5hbWUubyBcCi0JY29uY2F0Lm8gXAotCWNwbHVzLWRlbS5vIFwKLQlmZG1hdGNoLm8gXAotCWZsb2F0Zm9ybWF0Lm8gXAotCWdldG9wdC5vIFwKLQlnZXRvcHQxLm8gXAotCWdldHJ1bnRpbWUubyBcCi0JaGV4Lm8gXAotCW1zZG9zLm8gXAotCW9ic3RhY2subyBcCi0Jc3BhY2VzLm8gXAotCXN0cmVycm9yLm8gXAotCXN0cnNpZ25hbC5vIFwKLQl4YXRleGl0Lm8gXAotCXhleGl0Lm8gXAotCXhtYWxsb2MubyBcCi0JJEUKLQotLmMubzoKLQlnY2MgLUkuLi9pbmNsdWRlICQoQ0ZMQUdTKSAtYyAkPAotCi1saWJpYmVydHkuYSA6ICQoT0JKUykKLQktcm0gbGliaWJlcnR5LmEKLQlhciBydnMgbGliaWJlcnR5LmEgJChPQkpTKQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21ha2VmaWxlLnZtcyBiL2xpYmliZXJ0eS9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MWI1MTIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIGxpYmliZXJ0eSB1bmRlciBvcGVuVk1TL0FscGhhCi0jCi0jIEZvciB1c2Ugd2l0aCBnbnUtbWFrZSBmb3Igdm1zCi0jCi0jIENyZWF0ZWQgYnkgS2xhdXMgSyJhbXBmLCBra2FlbXBmQHByb2dpcy5kZQotIwotIwotCi1PQkpTPWJjb3B5Lm9iaixiY21wLm9iaixnZXRvcHQub2JqLG9ic3RhY2sub2JqLHhleGl0Lm9iaix4bWFsbG9jLm9iaixoZXgub2JqLFwKLSAgIGdldG9wdDEub2JqLGNwbHVzLWRlbS5vYmosc3RybmNhc2VjbXAub2JqLHN0cmNhc2VjbXAub2JqLHN0cmR1cC5vYmosXAotICAgY29uY2F0Lm9iaixnZXRydW50aW1lLm9iaixnZXRwYWdlc2l6ZS5vYmosYWxsb2NhLm9iaix4c3RyZXJyb3Iub2JqLFwKLSAgIHhzdHJkdXAub2JqLHhhdGV4aXQub2JqLGNob29zZS10ZW1wLm9iaixmbm1hdGNoLm9iaixvYmphbGxvYy5vYmoKLQotaWZlcSAoJChDQyksZ2NjKQotQ0ZMQUdTPS9pbmNsdWRlPShbXSxbLS5pbmNsdWRlXSkKLWVsc2UKLSMgYXNzdW1lIGRlYyBjCi1DRkxBR1M9L25vb3B0L2RlYnVnL2luY2x1ZGU9KFtdLFstLmluY2x1ZGVdKS9kZWZpbmU9KCJjb25zdD0iKS93YXJuaW5ncz1kaXNhYmxlPShtaXNzaW5ncmV0dXJuLGltcGxpY2l0ZnVuYykKLWVuZGlmCi0KLWxpYmliZXJ0eS5vbGI6IGNvbmZpZy5oIGFsbG9jYS1jb25mLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJpYmVydHkgKi5vYmoKLQotY29uZmlnLmg6IGNvbmZpZy5oLXZtcwotCSQoQ1ApICQ8ICRACi0KLWNsZWFuOgotCSQkIHB1cmdlCi0JJChSTSkgY29uZmlnLmg7Ci0JJChSTSkgKi5vYmo7Ci0JJChSTSkgbGliaWJlcnR5Lm9sYjsKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1jaHIuYyBiL2xpYmliZXJ0eS9tZW1jaHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlMzAwMy4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtY2hyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotRlVOQ1RJT04KLQk8PG1lbWNocj4+LS0tZmluZCBjaGFyYWN0ZXIgaW4gbWVtb3J5Ci0KLUlOREVYCi0JbWVtY2hyCi0KLUFOU0lfU1lOT1BTSVMKLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0Jdm9pZCAqbWVtY2hyKGNvbnN0IHZvaWQgKjxbc3JjXT4sIGludCA8W2NdPiwgc2l6ZV90IDxbbGVuZ3RoXT4pOwotCi1UUkFEX1NZTk9QU0lTCi0JI2luY2x1ZGUgPHN0cmluZy5oPgotCXZvaWQgKm1lbWNocig8W3NyY10+LCA8W2NdPiwgPFtsZW5ndGhdPikKLQl2b2lkICo8W3NyY10+OwotCXZvaWQgKjxbY10+OwotCXNpemVfdCA8W2xlbmd0aF0+OwotCi1ERVNDUklQVElPTgotCVRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgbWVtb3J5IHN0YXJ0aW5nIGF0IDw8Kjxbc3JjXT4+PiBmb3IgdGhlCi0JY2hhcmFjdGVyIDxbY10+LiAgVGhlIHNlYXJjaCBvbmx5IGVuZHMgd2l0aCB0aGUgZmlyc3QKLQlvY2N1cnJlbmNlIG9mIDxbY10+LCBvciBhZnRlciA8W2xlbmd0aF0+IGNoYXJhY3RlcnM7IGluCi0JcGFydGljdWxhciwgPDxOVUxMPj4gZG9lcyBub3QgdGVybWluYXRlIHRoZSBzZWFyY2guCi0KLVJFVFVSTlMKLQlJZiB0aGUgY2hhcmFjdGVyIDxbY10+IGlzIGZvdW5kIHdpdGhpbiA8W2xlbmd0aF0+IGNoYXJhY3RlcnMKLQlvZiA8PCo8W3NyY10+Pj4sIGEgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIGlzIHJldHVybmVkLiBJZgotCTxbY10+IGlzIG5vdCBmb3VuZCwgdGhlbiA8PE5VTEw+PiBpcyByZXR1cm5lZC4gCQotCi1QT1JUQUJJTElUWQotPDxtZW1jaHI+PiAgcmVxdWlyZXMgbm8gc3VwcG9ydGluZyBPUyBzdWJyb3V0aW5lcy4KLQotUVVJQ0tSRUYKLQltZW1jaHIgYW5zaSBwdXJlCi0KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLVBUUgotbWVtY2hyIChzcmNfdm9pZCwgYywgbGVuZ3RoKQotICAgICByZWdpc3RlciBjb25zdCBQVFIgc3JjX3ZvaWQ7Ci0gICAgIGludCBjOwotICAgICBzaXplX3QgbGVuZ3RoOwotewotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKXNyY192b2lkOwotICAKLSAgd2hpbGUgKC0tbGVuZ3RoID49IDApCi0gIHsKLSAgICBpZiAoKnNyYyA9PSBjKQotICAgICByZXR1cm4gKFBUUilzcmM7Ci0gICAgc3JjKys7Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtY21wLmMgYi9saWJpYmVydHkvbWVtY21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyN2FlMGMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21lbWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyogbWVtY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi1OQU1FCi0JbWVtY21wIC0tIGNvbXBhcmUgdHdvIG1lbW9yeSByZWdpb25zCi0KLVNZTk9QU0lTCi0JaW50IG1lbWNtcCAoY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8sIHNpemVfdCBjb3VudCkKLQotREVTQ1JJUFRJT04KLQlDb21wYXJlIHR3byBtZW1vcnkgcmVnaW9ucyBhbmQgcmV0dXJuIGxlc3MgdGhhbiwKLQllcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8sIGFjY29yZGluZyB0byBsZXhpY29ncmFwaGljYWwKLQlvcmRlcmluZyBvZiB0aGUgY29tcGFyZWQgcmVnaW9ucy4KLSovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLWludAotREVGVU4obWVtY21wLCAoc3RyMSwgc3RyMiwgY291bnQpLAotICAgICAgY29uc3QgUFRSIHN0cjEgQU5EIGNvbnN0IFBUUiBzdHIyIEFORCBzaXplX3QgY291bnQpCi17Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMxID0gKHVuc2lnbmVkIGNoYXIqKXN0cjE7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnMyID0gKHVuc2lnbmVkIGNoYXIqKXN0cjI7Ci0KLSAgd2hpbGUgKGNvdW50LS0gPiAwKQotICAgIHsKLSAgICAgIGlmICgqczErKyAhPSAqczIrKykKLQkgIHJldHVybiBzMVstMV0gPCBzMlstMV0gPyAtMSA6IDE7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21lbWNweS5jIGIvbGliaWJlcnR5L21lbWNweS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDdhOWY1Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tZW1jcHkuYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIG1lbWNweSAodGhlIHN0YW5kYXJkIEMgZnVuY3Rpb24pCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQltZW1jcHkgLS0gY29weSBtZW1vcnkgcmVnaW9ucyBvZiBhcmJpdGFyeSBsZW5ndGgKLQotU1lOT1BTSVMKLQl2b2lkKiBtZW1jcHkgKHZvaWQgKm91dCwgY29uc3Qgdm9pZCAqaW4sIHNpemVfdCBuKTsKLQotREVTQ1JJUFRJT04KLQlDb3B5IExFTkdUSCBieXRlcyBmcm9tIG1lbW9yeSByZWdpb24gcG9pbnRlZCB0byBieSBJTiB0byBtZW1vcnkKLQlyZWdpb24gcG9pbnRlZCB0byBieSBPVVQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLURFRlVOKG1lbWNweSwgKG91dCwgaW4sIGxlbmd0aCksIFBUUiBvdXQgQU5EIGNvbnN0IFBUUiBpbiBBTkQgc2l6ZV90IGxlbmd0aCkKLXsKLSAgICBiY29weShpbiwgb3V0LCBsZW5ndGgpOwotICAgIHJldHVybiBvdXQ7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvbWVtbW92ZS5jIGIvbGliaWJlcnR5L21lbW1vdmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YzMyNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtbW92ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyogV3JhcHBlciB0byBpbXBsZW1lbnQgQU5TSSBDJ3MgbWVtbW92ZSB1c2luZyBCU0QncyBiY29weS4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAtLVBlciBCb3RobmVyLiAqLwotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLQotUFRSCi1tZW1tb3ZlIChzMSwgczIsIG4pCi0gICAgIFBUUiBzMTsKLSAgICAgY29uc3QgUFRSIHMyOwotICAgICBzaXplX3QgbjsKLXsKLSAgYmNvcHkgKHMyLCBzMSwgbik7Ci0gIHJldHVybiBzMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tZW1zZXQuYyBiL2xpYmliZXJ0eS9tZW1zZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1NDgzMS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWVtc2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKiBtZW1zZXQKLSAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi1QVFIKLURFRlVOKG1lbXNldCwgKGRlc3QsIHZhbCwgbGVuKSwKLSAgICAgIFBUUiBkZXN0IEFORCByZWdpc3RlciBpbnQgdmFsIEFORCByZWdpc3RlciBzaXplX3QgbGVuKQotewotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciopZGVzdDsKLSAgd2hpbGUgKGxlbi0tID4gMCkKLSAgICAqcHRyKysgPSB2YWw7Ci0gIHJldHVybiBkZXN0OwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21rc3RlbXBzLmMgYi9saWJpYmVydHkvbWtzdGVtcHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjMTZhMi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvbWtzdGVtcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBUaGlzIGZpbGUgaXMgZGVyaXZlZCBmcm9tIG1rc3RlbXAuYyBmcm9tIHRoZSBHTlUgQyBMaWJyYXJ5LgotCi0gICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQotICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwKLSAgIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TVFJJTkdfSAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaWZkZWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaWZkZWYgSEFWRV9TWVNfVElNRV9ICi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIFdlIG5lZWQgdG8gcHJvdmlkZSBhIHR5cGUgZm9yIGdjY191aW50NjRfdC4gICovCi0jaWZkZWYgX19HTlVDX18KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGdjY191aW50NjRfdDsKLSNlbHNlCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZ2NjX3VpbnQ2NF90OwotI2VuZGlmCi0KLSNpZm5kZWYgVE1QX01BWAotI2RlZmluZSBUTVBfTUFYIDE2Mzg0Ci0jZW5kaWYKLQotLyogR2VuZXJhdGUgYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmcm9tIFRFTVBMQVRFLgotCi0gICBURU1QTEFURSBoYXMgdGhlIGZvcm06Ci0KLSAgIDxwYXRoPi9jY1hYWFhYWDxzdWZmaXg+Ci0KLSAgIFNVRkZJWF9MRU4gdGVsbHMgdXMgaG93IGxvbmcgPHN1ZmZpeD4gaXMgKGl0IGNhbiBiZSB6ZXJvIGxlbmd0aCkuCi0KLSAgIFRoZSBsYXN0IHNpeCBjaGFyYWN0ZXJzIG9mIFRFTVBMQVRFIGJlZm9yZSA8c3VmZml4PiBtdXN0IGJlICJYWFhYWFgiOwotICAgdGhleSBhcmUgcmVwbGFjZWQgd2l0aCBhIHN0cmluZyB0aGF0IG1ha2VzIHRoZSBmaWxlbmFtZSB1bmlxdWUuCi0KLSAgIFJldHVybnMgYSBmaWxlIGRlc2NyaXB0b3Igb3BlbiBvbiB0aGUgZmlsZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gICovCi1pbnQKLW1rc3RlbXBzICh0ZW1wbGF0ZSwgc3VmZml4X2xlbikKLSAgICAgY2hhciAqdGVtcGxhdGU7Ci0gICAgIGludCBzdWZmaXhfbGVuOwotewotICBzdGF0aWMgY29uc3QgY2hhciBsZXR0ZXJzW10KLSAgICA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSI7Ci0gIHN0YXRpYyBnY2NfdWludDY0X3QgdmFsdWU7Ci0jaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgc3RydWN0IHRpbWV2YWwgdHY7Ci0jZW5kaWYKLSAgY2hhciAqWFhYWFhYOwotICBzaXplX3QgbGVuOwotICBpbnQgY291bnQ7Ci0KLSAgbGVuID0gc3RybGVuICh0ZW1wbGF0ZSk7Ci0KLSAgaWYgKChpbnQpIGxlbiA8IDYgKyBzdWZmaXhfbGVuCi0gICAgICB8fCBzdHJuY21wICgmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dLCAiWFhYWFhYIiwgNikpCi0gICAgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBYWFhYWFggPSAmdGVtcGxhdGVbbGVuIC0gNiAtIHN1ZmZpeF9sZW5dOwotCi0jaWZkZWYgSEFWRV9HRVRUSU1FT0ZEQVkKLSAgLyogR2V0IHNvbWUgbW9yZSBvciBsZXNzIHJhbmRvbSBkYXRhLiAgKi8KLSAgZ2V0dGltZW9mZGF5ICgmdHYsIE5VTEwpOwotICB2YWx1ZSArPSAoKGdjY191aW50NjRfdCkgdHYudHZfdXNlYyA8PCAxNikgXiB0di50dl9zZWMgXiBnZXRwaWQgKCk7Ci0jZWxzZQotICB2YWx1ZSArPSBnZXRwaWQgKCk7Ci0jZW5kaWYKLQotICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBUTVBfTUFYOyArK2NvdW50KQotICAgIHsKLSAgICAgIGdjY191aW50NjRfdCB2ID0gdmFsdWU7Ci0gICAgICBpbnQgZmQ7Ci0KLSAgICAgIC8qIEZpbGwgaW4gdGhlIHJhbmRvbSBiaXRzLiAgKi8KLSAgICAgIFhYWFhYWFswXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbMV0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzJdID0gbGV0dGVyc1t2ICUgNjJdOwotICAgICAgdiAvPSA2MjsKLSAgICAgIFhYWFhYWFszXSA9IGxldHRlcnNbdiAlIDYyXTsKLSAgICAgIHYgLz0gNjI7Ci0gICAgICBYWFhYWFhbNF0gPSBsZXR0ZXJzW3YgJSA2Ml07Ci0gICAgICB2IC89IDYyOwotICAgICAgWFhYWFhYWzVdID0gbGV0dGVyc1t2ICUgNjJdOwotCi0gICAgICBmZCA9IG9wZW4gKHRlbXBsYXRlLCBPX1JEV1J8T19DUkVBVHxPX0VYQ0wsIDA2MDApOwotICAgICAgaWYgKGZkID49IDApCi0JLyogVGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuICAqLwotCXJldHVybiBmZDsKLQotICAgICAgLyogVGhpcyBpcyBhIHJhbmRvbSB2YWx1ZS4gIEl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRoYXQgdGhlIG5leHQKLQkgVE1QX01BWCB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGFkZGluZyA3Nzc3IHRvIFZBTFVFIGFyZSBkaWZmZXJlbnQKLQkgd2l0aCAobW9kdWxlIDJeMzIpLiAgKi8KLSAgICAgIHZhbHVlICs9IDc3Nzc7Ci0gICAgfQotCi0gIC8qIFdlIHJldHVybiB0aGUgbnVsbCBzdHJpbmcgaWYgd2UgY2FuJ3QgZmluZCBhIHVuaXF1ZSBmaWxlIG5hbWUuICAqLwotICB0ZW1wbGF0ZVswXSA9ICdcMCc7Ci0gIHJldHVybiAtMTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9tcHctY29uZmlnLmluIGIvbGliaWJlcnR5L21wdy1jb25maWcuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjE4MDIuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMgTVBXIGNvbmZpZ3VyYXRpb24gZnJhZ21lbnQgZm9yIGxpYmliZXJ0eS4KLQotRWNobyAnLyogY29uZmlnLmguICBHZW5lcmF0ZWQgYnkgbXB3LWNvbmZpZ3VyZS4gICovJwkgPiAie299ImNvbmZpZy5uZXcKLQotTW92ZUlmQ2hhbmdlICJ7b30iY29uZmlnLm5ldyAie299ImNvbmZpZy5oCi0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L21wdy1tYWtlLnNlZCBiL2xpYmliZXJ0eS9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMmE1ZTcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy1tYWtlLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLSMgU2VkIGNvbW1hbmRzIHRvIGZpbmlzaCB0cmFuc2xhdGluZyBsaWJpYmVydHkncyBVbml4IG1ha2VmaWxlIHRvIE1QVyBzeW50YXguCi0KLSMgQ29tbWVudCBvdXQgYSB1c2VsZXNzIHRoaW5nLgotL15cLmFsd2F5c1wuL3MvXi8jLwotCi0jIFJlcGxhY2UgdGhlIGF1dG8tZ2VuZXJhdGVkIGxpc3Qgd2l0aCB0aGUgbGlzdCBvZiB3aGF0IHdlIGtub3cgd2UgbmVlZC4KLXMvYGNhdCBuZWVkZWQtbGlzdGAvIntvfSJhbGxvY2EuYy5vICJ7b30iYmNvcHkuYy5vICJ7b30iZ2V0cGFnZXNpemUuYy5vICJ7b30iaW5zcXVlLmMubyAie299Im1wdy5jLm8gIntvfSJzdHJjYXNlY21wLmMubyAie299InN0cmR1cC5jLm8gIntvfSJzdHJuY2FzZWNtcC5jLm8vCi0KLSMgUGFzdGUgaW4gc29tZSBkZXNpcmFibGUgZGVmaW5pdGlvbnMuCi0jIFRoZSBkZWZhdWx0IHJ1bGUgaGVyZSBjb21wbGV0ZWx5IHJlcGxhY2VzIHRoZSB0cmlja3kgc3R1ZmYgaW4gdGhlIFVuaXgKLSMgTWFrZWZpbGUuaW4uCi0vXiMjIyQvYVwKLVwKLUhERUZJTkVTID0gLWQgTkVFRF9zeXNfc2lnbGlzdCAtZCBORUVEX3N5c19lcnJsaXN0IC1kIE5FRURfYmFzZW5hbWUgLWQgTkVFRF9zdHJjYXNlY21wIC1kIE5FRURfc3RybmNhc2VjbXBcCi1JTkNMVURFUyA9IC1pIDogLWkge0lOQ0RJUn06IC1pIHtJTkNESVJ9Om1wdzogLWkgOjpleHRyYS1pbmNsdWRlOiAtaSAie3N9IlwKLVwKLS5jLm8gXFxPcHRpb24tZiAuY1wKLQl7Q0N9IEBEQVNIX0NfRkxBR0Age0RlcERpcn17RGVmYXVsdH0uYyB7TElCQ0ZMQUdTfSB7SU5DTFVERVN9IHtIREVGSU5FU30gQFNFR01FTlRfRkxBRyh7RGVmYXVsdH0pQCAtbyB7VGFyZ0Rpcn17RGVmYXVsdH0uYy5vXAotCi0jIFJlbW92ZSBkZXBlbmRlbmN5IG9uIG5lZWRlZC1saXN0LCB3aGljaCB3ZSBkb24ndCB1c2UuCi0vRE9fQUxTTyA9L3MvbmVlZGVkLWxpc3QvLwotCi0vSU5DRElSPS9zLyJ7c3JjZGlyfSJ7TVVMVElTUkNUT1B9OjovInt0b3BzcmNkaXJ9Ii8KLQotIyBXaGFjayBvdXQgdGhlIENPTVBJTEUuYyB0cmlja2luZXNzLgotL15DT01QSUxFLmMgLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgbXVsdGlkbyB0cmlja2luZXNzIGZyb20gdGhlICJhbGwiIHRhcmdldC4KLS9eYWxsIFxcT3B0aW9uLWYvLC9eJC9jXAotYWxsIFxcT3B0aW9uLWYge1RBUkdFVExJQn1cCi0KLQotIyBSZW1vdmUgdGhlIFJVTEUxL1JVTEUyIGNydWQuCi0vaWYgXFsvLC9maS9kCi0vXlJVTEUxID0vLC9SVUxFMiA9L2QKLS9SVUxFMi9zL1JVTEUyL1RBUkdFVExJQi8KLQotIyBEb24ndCB3YW50IGZkbWF0Y2ggZXZlci4KLXMvICJ7b30iZmRtYXRjaC5jLm8vLwotCi0jIEZpeCBwYXRocyB0byBnZW5lcmF0ZWQgZmlsZXMuCi0vY29uZmlnLmgvcy8ie3N9ImNvbmZpZy5oLyJ7b30iY29uZmlnLmgvCi0KLSMgV2hhY2sgb3V0IGNvbmZpZyByZWJ1aWxkIHJ1bGVzLgotL14ie299ImNvbmZpZy5oIFxcT3B0aW9uLWYvLC9eJC9kCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXB3LmMgYi9saWJpYmVydHkvbXB3LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhM2FlNDEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L21wdy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxMCArMCwwIEBACi0vKiBNUFctVW5peCBjb21wYXRpYmlsaXR5IGxpYnJhcnkuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQgdW5kZXIgTVBXLiAqLwotCi0jaW5jbHVkZSAibXB3LmgiCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2lmbmRlZiBVU0VfTVdfSEVBREVSUwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPFR5cGVzLmg+Ci0jaW5jbHVkZSA8RmlsZXMuaD4KLQotI2luY2x1ZGUgPFRpbWVyLmg+Ci0KLS8qIEluaXRpYWxpemUgdG8gMCBhdCBmaXJzdCwgdGhlbiBzZXQgdG8gZXJybm9fbWF4KCkgbGF0ZXIuICAqLwotCi1pbnQgc3lzX25lcnIgPSAwOwotCi0vKiBEZWJ1ZyBmbGFnIGZvciBwYXRobmFtZSBoYWNraW5nLiAgU2V0IHRoaXMgdG8gb25lIGFuZCByZWJ1aWxkLiAqLwotCi1pbnQgRGVidWdQSSA9IC0xOwotCi12b2lkCi1tcHdpZnlfZmlsZW5hbWUoY2hhciAqdW5peG5hbWUsIGNoYXIgKm1hY25hbWUpCi17Ci0gIGludCBpLCBqOwotCi0gIC8qIChzaG91bGQgdHJ1bmNhdGUgMjU1IGNoYXJzIGZyb20gZW5kIG9mIG5hbWUsIG5vdCBiZWdpbm5pbmcpICovCi0gIGlmIChzdHJsZW4gKHVuaXhuYW1lKSA+IDI1NSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJQYXRobmFtZSBcIiVzXCIgaXMgdG9vIGxvbmcgZm9yIE1hY3MsIHRydW5jYXRpbmdcbiIsCi0JICAgICAgIHVuaXhuYW1lKTsKLSAgICB9Ci0gIGogPSAwOwotICAvKiBJZiB5b3UncmUgZ29pbmcgdG8gZW5kIHVwIHdpdGggb25lIG9yIG1vcmUgY29sb25zIGluIHRoZSBtaWRkbGUgb2YgYQotICAgICBwYXRoIGFmdGVyIGFuIGFsbC1Vbml4IHJlbGF0aXZlIHBhdGggaXMgdHJhbnNsYXRlZCwgeW91IG11c3QgYWRkIGEKLSAgICAgY29sb24gb24gdGhlIGZyb250LCBzbyB0aGF0IHRoZSBmaXJzdCBjb21wb25lbnQgaXMgbm90IHRob3VnaHQgdG8gYmUKLSAgICAgYSBkaXNrIG5hbWUuICAqLwotICBpZiAodW5peG5hbWVbMF0gIT0gJy8nICYmICEgc3RyY2hyICh1bml4bmFtZSwgJzonKSAmJiBzdHJjaHIgKHVuaXhuYW1lLCAnLycpKQotICAgIHsKLSAgICAgIG1hY25hbWVbaisrXSA9ICc6JzsKLSAgICB9Ci0gIGZvciAoaSA9IDA7IHVuaXhuYW1lW2ldICE9ICdcMCcgJiYgaSA8IDI1NTsgKytpKQotICAgIHsKLSAgICAgIGlmIChpID09IDAgJiYgdW5peG5hbWVbaV0gPT0gJy8nKQotCXsKLQkgIGlmIChzdHJuY21wICh1bml4bmFtZSwgIi90bXAvIiwgNSkgPT0gMCkKLQkgICAgewotCSAgICAgIC8qIEEgdGVtcG9yYXJ5IG5hbWUsIG1ha2UgYSBtb3JlIE1hYy1mbGF2b3JlZCB0bXBuYW1lLiAqLwotCSAgICAgIC8qIEEgYmV0dGVyIGNob2ljZSB3b3VsZCBiZSB7Qm9vdH1UcmFzaDpmb28sIGJ1dAotCQkgdGhhdCB3b3VsZCByZXF1aXJlIGJlaW5nIGFibGUgdG8gaWRlbnRpZnkgdGhlCi0JCSBib290IGRpc2sncyBhbmQgdHJhc2hjYW4ncyBuYW1lLiAgQW5vdGhlciBvcHRpb24KLQkJIHdvdWxkIGJlIHRvIGhhdmUgYW4gZW52IHZhciwgc28gdXNlciBjYW4gcG9pbnQgaXQKLQkJIGF0IGEgcmFtZGlzay4gKi8KLQkgICAgICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ3QnOwotCSAgICAgIG1hY25hbWVbaisrXSA9ICdtJzsKLQkgICAgICBtYWNuYW1lW2orK10gPSAncCc7Ci0JICAgICAgbWFjbmFtZVtqKytdID0gJ18nOwotCSAgICAgIGkgKz0gNDsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogRG9uJ3QgY29weSB0aGUgbGVhZGluZyBzbGFzaC4gKi8KLQkgICAgfQotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICc6JyAmJiB1bml4bmFtZVtpKzFdID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JICBpICs9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAodW5peG5hbWVbaV0gPT0gJy4nICYmIHVuaXhuYW1lW2krMV0gPT0gJy8nKQotCXsKLQkgIG1hY25hbWVbaisrXSA9ICc6JzsKLQkgIGkgKz0gMTsKLQl9Ci0gICAgICBlbHNlIGlmICh1bml4bmFtZVtpXSA9PSAnLicgJiYgdW5peG5hbWVbaSsxXSA9PSAnLicgJiYgdW5peG5hbWVbaSsyXSA9PSAnLycpCi0JewotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgbWFjbmFtZVtqKytdID0gJzonOwotCSAgaSArPSAyOwotCX0KLSAgICAgIGVsc2UgaWYgKHVuaXhuYW1lW2ldID09ICcvJykKLQl7Ci0JICBtYWNuYW1lW2orK10gPSAnOic7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1hY25hbWVbaisrXSA9IHVuaXhuYW1lW2ldOwotCX0KLSAgICB9Ci0gIG1hY25hbWVbal0gPSAnXDAnOwotICAvKiBBbGxvdyBmb3IgZ2V0dGluZyB0aGUgZGVidWcgZmxhZyBmcm9tIGFuIGVudiB2YXI7IHF1aXRlIHVzZWZ1bC4gKi8KLSAgaWYgKERlYnVnUEkgPCAwKQotICAgIERlYnVnUEkgPSAoKihnZXRlbnYgKCJERUJVR19QQVRITkFNRVMiKSkgPT0gJzEnID8gMSA6IDApOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIE1hZGUgXCIlc1wiXG4iLCB1bml4bmFtZSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIjIGludG8gXCIlc1wiXG4iLCBtYWNuYW1lKTsKLSAgICB9Ci19Ci0KLS8qIE1QVy1mbGF2b3JlZCBiYXNlbmFtZSBmaW5kZXIuICovCi0KLWNoYXIgKgotbXB3X2Jhc2VuYW1lIChuYW1lKQotICBjaGFyICpuYW1lOwotewotICBjaGFyICpiYXNlID0gbmFtZTsKLQotICB3aGlsZSAoKm5hbWUpCi0gICAgewotICAgICAgaWYgKCpuYW1lKysgPT0gJzonKQotCXsKLQkgIGJhc2UgPSBuYW1lOwotCX0KLSAgICB9Ci0gIHJldHVybiBiYXNlOwotfQotCi0vKiBNaXhlZCBNUFcvVW5peCBiYXNlbmFtZSBmaW5kZXIuICBUaGlzIGNhbiBiZSBsZWQgYXN0cmF5IGJ5Ci0gICBmaWxlbmFtZXMgd2l0aCBzbGFzaGVzIGluIHRoZW0gYW5kIGNvbWUgdXAgd2l0aCBhIGJhc2VuYW1lIHRoYXQKLSAgIGVpdGhlciBjb3JyZXNwb25kcyB0byBubyBmaWxlIG9yICh3b3JzZSkgdG8gc29tZSBvdGhlciBmaWxlLCBzbwotICAgc2hvdWxkIG9ubHkgYmUgdHJpZWQgaWYgb3RoZXIgbWV0aG9kcyBvZiBmaW5kaW5nIGEgZmlsZSB2aWEgYQotICAgYmFzZW5hbWUgaGF2ZSBmYWlsZWQuICAqLwotCi1jaGFyICoKLW1wd19taXhlZF9iYXNlbmFtZSAobmFtZSkKLSAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqYmFzZSA9IG5hbWU7Ci0KLSAgd2hpbGUgKCpuYW1lKQotICAgIHsKLSAgICAgIGlmICgqbmFtZSA9PSAnLycgfHwgKm5hbWUgPT0gJzonKQotCXsKLQkgIGJhc2UgPSBuYW1lICsgMTsKLQl9Ci0gICAgICArK25hbWU7Ci0gICAgfQotICByZXR1cm4gYmFzZTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBmb3BlbigpIG1vZGlmaWVkIHRvIGNyZWF0ZSBmaWxlcyB0aGF0IGFyZSB0eXBlIFRFWFQKLSAgIG9yICdCSU4gJywgYW5kIGFsd2F5cyBvZiB0eXBlICdNUFMgJy4gICovCi0KLUZJTEUgKgotbXB3X2ZvcGVuIChjaGFyICpuYW1lLCBjaGFyICptb2RlKQotewotI3VuZGVmIGZvcGVuCi0gIGludCBlcnJudW07Ci0gIEZJTEUgKmZwOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKG5hbWUsIHRtcG5hbWUpOwotICBQUk9HUkVTUyAoMSk7Ci0gIGZwID0gZm9wZW4gKHRtcG5hbWUsIG1vZGUpOwotICBlcnJudW0gPSBlcnJubzsKLQotICAvKiBJZiB3cml0aW5nLCBuZWVkIHRvIHNldCB0eXBlIGFuZCBjcmVhdG9yIHVzZWZ1bGx5LiAqLwotICBpZiAoc3RyY2hyIChtb2RlLCAndycpKQotICAgIHsKLSAgICAgIGNoYXIgKnBuYW1lID0gKGNoYXIgKikgbWFsbG9jIChzdHJsZW4gKHRtcG5hbWUpICsgMik7Ci0gICAgICBPU0VyciBlOwotICAgICAgc3RydWN0IEZJbmZvIGZpOwotCi0gICAgICBwbmFtZVswXSA9IHN0cmxlbiAodG1wbmFtZSk7Ci0gICAgICBzdHJjcHkgKHBuYW1lKzEsIHRtcG5hbWUpOwotCQotICAgICAgZSA9IEdldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7Ci0gICAgICAvKiBzaG91bGQgZG8gc3BpZmZpZXIgZXJyb3IgaGFuZGxpbmcgKi8KLSAgICAgIGlmIChlICE9IDApCi0JZnByaW50ZihzdGRlcnIsICJHZXRGSW5mbyByZXR1cm5zICVkXG4iLCBlKTsKLSAgICAgIGlmIChzdHJjaHIgKG1vZGUsICdiJykpCi0JewotCSAgZmkuZmRUeXBlID0gKE9TVHlwZSkgJ0JJTiAnOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBmaS5mZFR5cGUgPSAoT1NUeXBlKSAnVEVYVCc7Ci0JfQotICAgICAgZmkuZmRDcmVhdG9yID0gKE9TVHlwZSkgJ01QUyAnOwotICAgICAgZSA9IFNldEZJbmZvICgoQ29uc3RTdHIyNTVQYXJhbSkgcG5hbWUsIDAsICZmaSk7Ci0gICAgICBpZiAoZSAhPSAwKQotCWZwcmludGYoc3RkZXJyLCAiU2V0RkluZm8gcmV0dXJucyAlZFxuIiwgZSk7Ci0gICAgICBmcmVlIChwbmFtZSk7Ci0gICAgfQotICBpZiAoZnAgPT0gTlVMTCkKLSAgICBlcnJubyA9IGVycm51bTsKLSAgcmV0dXJuIGZwOwotfQotCi0vKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBmc2VlaygpIG1vZGlmaWVkIHRvIGZpbGwgdGhlIGZpbGUgd2l0aCB6ZXJvcwotICAgaWYgc2Vla2luZyBwYXN0IHRoZSBlbmQgb2YgaXQuICAqLwotCi0jZGVmaW5lIFpFUk9CTEtTSVpFIDQwOTYKLQotY2hhciB6ZXJvc1taRVJPQkxLU0laRV07Ci0KLWludAotbXB3X2ZzZWVrIChGSUxFICpmcCwgaW50IG9mZnNldCwgaW50IHdoZW5jZSkKLXsKLSN1bmRlZiBmc2VlawotICBpbnQgY3Vyc2l6ZSwgbnVtbGVmdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIGlmICh3aGVuY2UgPT0gU0VFS19TRVQpCi0gICAgewotICAgICAgZnNlZWsgKGZwLCAwLCBTRUVLX0VORCk7Ci0gICAgICBjdXJzaXplID0gZnRlbGwgKGZwKTsKLSAgICAgIGlmIChvZmZzZXQgPiBjdXJzaXplKQotCXsKLQkgIG51bWxlZnQgPSBvZmZzZXQgLSBjdXJzaXplOwotCSAgd2hpbGUgKG51bWxlZnQgPiBaRVJPQkxLU0laRSkKLQkgICAgewotCSAgICAgIC8qIFRoaXMgbWlnaHQgZmFpbCwgc2hvdWxkIGNoZWNrIGZvciB0aGF0LiAqLwotCSAgICAgIFBST0dSRVNTICgxKTsKLQkgICAgICBmd3JpdGUgKHplcm9zLCAxLCBaRVJPQkxLU0laRSwgZnApOwotCSAgICAgIG51bWxlZnQgLT0gWkVST0JMS1NJWkU7Ci0JICAgIH0KLQkgIFBST0dSRVNTICgxKTsKLQkgIGZ3cml0ZSAoemVyb3MsIDEsIG51bWxlZnQsIGZwKTsKLQkgIGZmbHVzaCAoZnApOwotCX0KLSAgICB9Ci0gIHJldHVybiBmc2VlayAoZnAsIG9mZnNldCwgd2hlbmNlKTsKLX0KLQotaW50Ci1tcHdfZnJlYWQgKGNoYXIgKnB0ciwgaW50IHNpemUsIGludCBuaXRlbXMsIEZJTEUgKnN0cmVhbSkKLXsKLSN1bmRlZiBmcmVhZAotICBpbnQgcnNsdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBmcmVhZCAocHRyLCBzaXplLCBuaXRlbXMsIHN0cmVhbSk7Ci0gIFBST0dSRVNTICgxKTsKLSAgcmV0dXJuIHJzbHQ7Ci19Ci0KLWludAotbXB3X2Z3cml0ZSAoY2hhciAqcHRyLCBpbnQgc2l6ZSwgaW50IG5pdGVtcywgRklMRSAqc3RyZWFtKQotewotI3VuZGVmIGZ3cml0ZQotICBpbnQgcnNsdDsKLQotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBmd3JpdGUgKHB0ciwgc2l6ZSwgbml0ZW1zLCBzdHJlYW0pOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLWxpbmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAibGluayBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLX0KLQotaW50Ci1mb3JrICgpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci19Ci0KLWludAotdmZvcmsgKCkKLXsKLSAgZnByaW50ZiAoc3RkZXJyLCAidmZvcmsgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi1pbnQKLXBpcGUgKGludCAqZmQpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgInBpcGUgbm90IGF2YWlsYWJsZSFcbiIpOwotICBtcHdfYWJvcnQgKCk7Ci0gIHJldHVybiAoLTEpOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWV4ZWN2cCAoY2hhciAqZmlsZSwgY2hhciAqKmFyZ3YpCi17Ci0gIGZwcmludGYgKHN0ZGVyciwgImV4ZWN2cCBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWludAotZXhlY3YgKGNoYXIgKnBhdGgsIGNoYXIgKiphcmd2KQotewotICBmcHJpbnRmIChzdGRlcnIsICJleGVjdiBub3QgYXZhaWxhYmxlIVxuIik7Ci0gIG1wd19hYm9ydCAoKTsKLSAgcmV0dXJuICgtMSk7Ci19Ci0jZW5kaWYKLQotaW50Ci1raWxsIChpbnQgcGlkLCBpbnQgc2lnKQotewotICBmcHJpbnRmIChzdGRlcnIsICJraWxsIG5vdCBhdmFpbGFibGUhXG4iKTsKLSAgbXB3X2Fib3J0ICgpOwotICByZXR1cm4gKC0xKTsKLX0KLQotaW50Ci13YWl0IChpbnQgKnN0YXR1cykKLXsKLSAgKnN0YXR1cyA9IDA7Ci0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLXNsZWVwIChpbnQgc2Vjb25kcykKLXsKLSAgdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCBub3c7Ci0KLSAgdGltZSAoJnN0YXJ0X3RpbWUpOwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLSAgICAgIHRpbWUgKCZub3cpOwotICAgICAgaWYgKG5vdyA+IHN0YXJ0X3RpbWUgKyBzZWNvbmRzKQotCXJldHVybiAwOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkCi1wdXRlbnYgKGNoYXIgKnN0cikKLXsKLSAgLyogVGhlIEdDQyBkcml2ZXIgY2FsbHMgdGhpcyB0byBkbyB0aGluZ3MgZm9yIGNvbGxlY3QyLCBidXQgd2UKLSAgICAgZG9uJ3QgY2FyZSBhYm91dCBjb2xsZWN0Mi4gKi8KLX0KLQotaW50Ci1jaG1vZCAoY2hhciAqcGF0aCwgaW50IG1vZGUpCi17Ci0gIC8qIFByZXRlbmQgaXQgd2FzIGFsbCBPSy4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLSNpZm5kZWYgVVNFX01XX0hFQURFUlMKLWludAotZ2V0dWlkICgpCi17Ci0gIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotZ2V0Z2lkICgpCi17Ci0gIC8qIE9uZSB2YWx1ZSBpcyBhcyBnb29kIGFzIGFub3RoZXIuLi4gKi8KLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogSW5zdGVhZCBvZiBjb3JlZHVtcGluZywgd2hpY2ggaXMgbm90IGEgbm9ybWFsIE1hYyBmYWNpbGl0eSwgd2UKLSAgIGRyb3AgaW50byBNYWNzYnVnLiAgSWYgd2UgdGhlbiAiZyIgZnJvbSBNYWNzYnVnLCB0aGUgcHJvZ3JhbSB3aWxsCi0gICBleGl0IGNsZWFubHkuICovCi0KLXZvaWQKLW1wd19hYm9ydCAoKQotewotICAvKiBNYWtlIHN1cmUgbm8gb3V0cHV0IHN0aWxsIGJ1ZmZlcmVkIHVwLCB0aGVuIHphcCBpbnRvIE1hY3NCdWcuICovCi0gIGZmbHVzaChzdGRvdXQpOwotICBmZmx1c2goc3RkZXJyKTsKLSAgcHJpbnRmKCIjIyBBYm9ydCEgIyNcbiIpOwotI2lmZGVmIE1QV19TQURFCi0gIFN5c0Vycm9yKDgwMDUpOwotI2Vsc2UgCi0gIERlYnVnZ2VyKCk7Ci0jZW5kaWYKLSAgLyogImciIGluIE1hY3NCdWcgd2lsbCB0aGVuIGNhdXNlIGEgcmVndWxhciBlcnJvciBleGl0LiAqLwotICBleGl0ICgxKTsKLX0KLQotLyogSW1pdGF0aW9uIGdldHJ1c2FnZSBiYXNlZCBvbiB0aGUgQU5TSSBjbG9jaygpIGZ1bmN0aW9uLiAqLwotCi1pbnQKLWdldHJ1c2FnZSAoaW50IHdobywgc3RydWN0IHJ1c2FnZSAqcnVzYWdlKQotewotICBpbnQgY2xrID0gY2xvY2sgKCk7Ci0KLSNpZiAwCi0gIHJ1c2FnZS0+cnVfdXRpbWUudHZfc2VjID0gY2xrIC8gQ0xPQ0tTX1BFUl9TRUM7Ci0gIHJ1c2FnZS0+cnVfdXRpbWUudHZfdXNlYyA9ICgoY2xrICogMTAwMCkgLyBDTE9DS1NfUEVSX1NFQykgKiAxMDAwOwotICBydXNhZ2UtPnJ1X3N0aW1lLnR2X3NlYyA9IDA7Ci0gIHJ1c2FnZS0+cnVfc3RpbWUudHZfdXNlYyA9IDA7Ci0jZW5kaWYKLX0KLQotaW50Ci1zYnJrICgpCi17Ci0gIHJldHVybiAwOwotfQotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi1pbnQKLWlzYXR0eSAoaW50IGZkKQotewotICByZXR1cm4gMDsKLX0KLQotLyogVGhpcyBpcyBpbmhlcml0ZWQgZnJvbSBUaW1vdGh5IE11cnJheSdzIFBvc2l4IGxpYnJhcnkuICovCi0KLSNpbmNsdWRlICJ1dGltZS5oIgotCi1pbnQKLXV0aW1lIChjaGFyICpmaWxlbmFtZSwgc3RydWN0IHV0aW1idWYgKnRpbWVzKQotewotICBDSW5mb1BCUmVjIGNpcGJyOwotICBIRmlsZUluZm8gKmZwYiA9IChIRmlsZUluZm8gKikgJmNpcGJyOwotICBEaXJJbmZvICpkcGIgPSAoRGlySW5mbyAqKSAmY2lwYnI7Ci0gIHVuc2lnbmVkIGNoYXIgcG5hbWVbMjU2XTsKLSAgc2hvcnQgZXJyOwotICAKLSAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgZmlsZW5hbWUpOwotICBjMnBzdHIgKHBuYW1lKTsKLQotICBkcGItPmlvRHJEaXJJRCA9IDBMOwotICBmcGItPmlvTmFtZVB0ciA9IHBuYW1lOwotICBmcGItPmlvVlJlZk51bSA9IDA7Ci0gIGZwYi0+aW9GRGlySW5kZXggPSAwOwotICBmcGItPmlvRlZlcnNOdW0gPSAwOwotICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBlcnJubyA9IEVOT0VOVDsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgZHBiLT5pb0RyRGlySUQgPSAwTDsKLSAgZnBiLT5pb0ZsTWREYXQgPSB0aW1lcy0+bW9kdGltZTsKLSAgZnBiLT5pb0ZsQ3JEYXQgPSB0aW1lcy0+YWN0aW1lOwotICBlcnIgPSBQQlNldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpIHsKLSAgICBlcnJubyA9IEVBQ0NFUzsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotbWtkaXIgKGNoYXIgKnBhdGgsIGludCBtb2RlKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuIC0xOwotfQotCi1pbnQKLXJtZGlyICgpCi17Ci0gIGVycm5vID0gRU5PU1lTOwotICByZXR1cm4gLTE7Ci19Ci0jZW5kaWYKLQotY2hvd24gKCkKLXsKLSAgZXJybm8gPSBFTk9TWVM7Ci0gIHJldHVybiAtMTsKLX0KLQotY2hhciAqbXllbnZpcm9uW10gPSB7TlVMTH07Ci0KLWNoYXIgKiplbnZpcm9uID0gbXllbnZpcm9uOwotCi0jaWZuZGVmIFVTRV9NV19IRUFERVJTCi0KLS8qIE1pbmltYWwgJ3N0YXQnIGVtdWxhdGlvbjogdGVsbHMgZGlyZWN0b3JpZXMgZnJvbSBmaWxlcyBhbmQKLSAgIGdpdmVzIGxlbmd0aCBhbmQgbXRpbWUuCi0KLSAgIERlcml2ZWQgZnJvbSBjb2RlIHdyaXR0ZW4gYnkgR3VpZG8gdmFuIFJvc3N1bSwgQ1dJLCBBbXN0ZXJkYW0KLSAgIGFuZCBwbGFjZWQgYnkgaGltIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotZXh0ZXJuIGludCBfX3VpZCwgX19naWQ7Ci0KLWludCBfX3VpZCA9IDA7Ci1pbnQgX19naWQgPSAwOwotCi0vKiBCaXRzIGluIGlvRmxBdHRyaWI6ICovCi0jZGVmaW5lIExPQ0tCSVQJKDE8PDApCQkvKiBGaWxlIGxvY2tlZCAqLwotI2RlZmluZSBESVJCSVQJKDE8PDQpCQkvKiBJdCdzIGEgZGlyZWN0b3J5ICovCi0KLS8qIE1hY2lmaWVkICJzdGF0IiBpbiB3aGljaCBmaWxlbmFtZSBpcyBnaXZlbiByZWxhdGl2ZSB0byBhIGRpcmVjdG9yeSwKLSAgIHNwZWNpZmllZCBieSBsb25nIERpcklELiAgKi8KLQotc3RhdGljIGludAotX3N0YXQgKGNoYXIgKm5hbWUsIGxvbmcgZGlyaWQsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIENJbmZvUEJSZWMgY2lwYnI7Ci0gIEhGaWxlSW5mbyAqZnBiID0gKEhGaWxlSW5mbyopICZjaXBicjsKLSAgRGlySW5mbyAqZHBiID0gKERpckluZm8qKSAmY2lwYnI7Ci0gIFN0cjI1NSBwbmFtZTsKLSAgc2hvcnQgZXJyOwotCi0gIC8qIE1ha2UgYSB0ZW1wIGNvcHkgb2YgdGhlIG5hbWUgYW5kIHBhc2NhbGl6ZS4gKi8KLSAgc3RyY3B5ICgoY2hhciAqKSBwbmFtZSwgbmFtZSk7Ci0gIGMycHN0ciAocG5hbWUpOwotICAKLSAgY2lwYnIuZGlySW5mby5pb0RyRGlySUQgPSBkaXJpZDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvTmFtZVB0ciA9IHBuYW1lOwotICBjaXBici5oRmlsZUluZm8uaW9WUmVmTnVtID0gMDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvRkRpckluZGV4ID0gMDsKLSAgY2lwYnIuaEZpbGVJbmZvLmlvRlZlcnNOdW0gPSAwOwotICBlcnIgPSBQQkdldENhdEluZm8gKCZjaXBiciwgMCk7Ci0gIGlmIChlcnIgIT0gbm9FcnIpCi0gICAgewotICAgICAgZXJybm8gPSBFTk9FTlQ7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAvKiBNYWMgZmlsZXMgYXJlIHJlYWRhYmxlIGlmIHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGF0IGFsbC4gKi8KLSAgYnVmLT5zdF9tb2RlID0gMDQ0NDsKLSAgLyogTWFyayB1bmxvY2tlZCBmaWxlcyBhcyB3cml0ZWFibGUuICovCi0gIGlmICghKGZwYi0+aW9GbEF0dHJpYiAmIExPQ0tCSVQpKQotICAgIGJ1Zi0+c3RfbW9kZSB8PSAwMjIyOwotICBpZiAoZnBiLT5pb0ZsQXR0cmliICYgRElSQklUKQotICAgIHsKLSAgICAgIC8qIE1hcmsgZGlyZWN0b3JpZXMgYXMgImV4ZWN1dGFibGUiLiAqLwotICAgICAgYnVmLT5zdF9tb2RlIHw9IDAxMTEgfCBTX0lGRElSOwotICAgICAgYnVmLT5zdF9zaXplID0gZHBiLT5pb0RyTm1GbHM7Ci0gICAgICBidWYtPnN0X3JzaXplID0gMDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBidWYtPnN0X21vZGUgfD0gU19JRlJFRzsKLSAgICAgIC8qIE1hcmsgYXBwcyBhcyAiZXhlY3V0YWJsZSIuICovCi0gICAgICBpZiAoZnBiLT5pb0ZsRm5kckluZm8uZmRUeXBlID09ICdBUFBMJykKLQlidWYtPnN0X21vZGUgfD0gMDExMTsKLSAgICAgIC8qIEZpbGwgaW4gdGhlIHNpemVzIG9mIGRhdGEgYW5kIHJlc291cmNlIGZvcmtzLiAqLwotICAgICAgYnVmLT5zdF9zaXplID0gZnBiLT5pb0ZsTGdMZW47Ci0gICAgICBidWYtPnN0X3JzaXplID0gZnBiLT5pb0ZsUkxnTGVuOwotICAgIH0KLSAgLyogRmlsbCBpbiB2YXJpb3VzIHRpbWVzLiAqLwotICBidWYtPnN0X2F0aW1lID0gZnBiLT5pb0ZsQ3JEYXQ7Ci0gIGJ1Zi0+c3RfbXRpbWUgPSBmcGItPmlvRmxNZERhdDsKLSAgYnVmLT5zdF9jdGltZSA9IGZwYi0+aW9GbENyRGF0OwotICAvKiBTZXQgdXAgYW4gaW1pdGF0aW9uIGlub2RlIG51bWJlci4gKi8KLSAgYnVmLT5zdF9pbm8gPSAodW5zaWduZWQgc2hvcnQpIGZwYi0+aW9EaXJJRDsKLSAgLyogU2V0IHVwIGFuIGltaXRhdGlvbiBkZXZpY2UuICovCi0gIEdldFZSZWZOdW0gKGJ1Zi0+c3RfaW5vLCAmYnVmLT5zdF9kZXYpOwotICBidWYtPnN0X3VpZCA9IF9fdWlkOwotICBidWYtPnN0X2dpZCA9IF9fZ2lkOwotLyogIGJ1Zi0+c3RfRmxGbmRySW5mbyA9IGZwYi0+aW9GbEZuZHJJbmZvOyAgKi8KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIHN0YXQoKSBzZXRzIHVwIGFuIGVtcHR5IGRpcmlkLiAqLwotCi1pbnQKLXN0YXQgKGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIGxvbmcgcnNsdCwgZXJybnVtOwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKHBhdGgsIHRtcG5hbWUpOwotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIjIHN0YXQgKCVzLCAleCkiLCB0bXBuYW1lLCBidWYpOwotICBQUk9HUkVTUyAoMSk7Ci0gIHJzbHQgPSBfc3RhdCAodG1wbmFtZSwgMEwsIGJ1Zik7Ci0gIGVycm51bSA9IGVycm5vOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi1pbnQKLWZzdGF0IChpbnQgZmQsIHN0cnVjdCBzdGF0ICpidWYpCi17Ci0gIEZDQlBCUmVjIGZjYjsKLSAgRklMRSAqZnA7Ci0gIFN0cjI1NSBwYXRobmFtZTsKLSAgbG9uZyBkaXJpZCA9IDBMLCB0ZW1wOwotICBsb25nIHJzbHQsIGVycm51bTsKLSAgc2hvcnQgZXJyOwotCi0gIGlmIChEZWJ1Z1BJIDwgMCkKLSAgICBEZWJ1Z1BJID0gKCooZ2V0ZW52ICgiREVCVUdfUEFUSE5BTUVTIikpID09ICcxJyA/IDEgOiAwKTsKLSAgaWYgKERlYnVnUEkpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyBmc3RhdCAoJWQsICV4KSIsIGZkLCBidWYpOwotICBQUk9HUkVTUyAoMSk7Ci0gIHBhdGhuYW1lWzBdID0gMDsKLSNpZmRlZiBGSU9GTkFNRQotICAvKiBVc2UgYW4gTVBXLXNwZWNpZmljIGlvY3RsIHRvIGdldCB0aGUgcGF0aG5hbWUgYXNzb2NpYXRlZCB3aXRoCi0gICAgIHRoZSBmaWxlIGRlc2NyaXB0b3IuICAqLwotICBpb2N0bCAoZmQsIEZJT0ZOQU1FLCAobG9uZyAqKSBwYXRobmFtZSk7IAotI2Vsc2UKLSAgeW91IGxvc2UKLSNlbmRpZgotICBpZiAoRGVidWdQSSkKLSAgICBmcHJpbnRmIChzdGRlcnIsICIgKG5hbWUgaXMgJXMpIiwgcGF0aG5hbWUpOwotICBkaXJpZCA9IDBMIC8qIGZjYi5pb0ZDQlBhcklEICovIDsKLSAgcnNsdCA9IF9zdGF0ICgoY2hhciAqKSBwYXRobmFtZSwgZGlyaWQsIGJ1Zik7Ci0gIGVycm51bSA9IGVycm5vOwotICBpZiAoRGVidWdQSSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICAgIGZmbHVzaCAoc3RkZXJyKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi0jZW5kaWYgLyogbiBVU0VfTVdfSEVBREVSUyAqLwotCi1jaGRpciAoKQotewotICBlcnJubyA9IEVOT1NZUzsKLSAgcmV0dXJuICgtMSk7Ci19Ci0KLWNoYXIgKgotZ2V0Y3dkIChjaGFyICpidWYsIGludCBzaXplKQotewotICBpZiAoYnVmID09IE5VTEwpCi0gICAgYnVmID0gKGNoYXIgKikgbWFsbG9jIChzaXplKTsKLSAgc3RyY3B5KGJ1ZiwgIjoiKTsKLSAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgbW9yZSBlbGFib3JhdGUgZm9yIE1QVy4gKi8KLQotY2hhciAqCi1nZXRwd2QgKCkKLXsKLSAgcmV0dXJuICI6IjsKLX0KLQotaW50Ci1tcHdfb3BlbiAoY2hhciAqZmlsZW5hbWUsIGludCBhcmcyLCBpbnQgYXJnMykKLXsKLSN1bmRlZiBvcGVuCi0gIGludCBmZCwgZXJybnVtID0gMDsKLSAgY2hhciB0bXBuYW1lWzI1Nl07Ci0KLSAgbXB3aWZ5X2ZpbGVuYW1lIChmaWxlbmFtZSwgdG1wbmFtZSk7Ci0gIGZkID0gb3BlbiAodG1wbmFtZSwgYXJnMik7Ci0gIGVycm51bSA9IGVycm5vOwotCi0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgb3BlbiAoJXMsICVkLCAlZCkiLCB0bXBuYW1lLCBhcmcyLCBhcmczKTsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlZCIsIGZkKTsKLSAgICAgIGlmIChmZCA9PSAtMSkKLQlmcHJpbnRmIChzdGRlcnIsICIgKGVycm5vIGlzICVkKSIsIGVycm51bSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwotICAgIH0KLSAgaWYgKGZkID09IC0xKQotICAgIGVycm5vID0gZXJybnVtOwotICByZXR1cm4gZmQ7Ci19Ci0KLWludAotbXB3X2FjY2VzcyAoY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGludCBjbWQpCi17Ci0jdW5kZWYgYWNjZXNzCi0KLSAgaW50IHJzbHQsIGVycm51bSA9IDA7Ci0gIHN0cnVjdCBzdGF0IHN0OwotICBjaGFyIHRtcG5hbWVbMjU2XTsKLQotICBtcHdpZnlfZmlsZW5hbWUgKGZpbGVuYW1lLCB0bXBuYW1lKTsKLSAgaWYgKGNtZCAmIFJfT0sgfHwgY21kICYgWF9PSykKLSAgICB7Ci0gICAgICByc2x0ID0gc3RhdCAodG1wbmFtZSwgJnN0KTsKLSAgICAgIGVycm51bSA9IGVycm5vOwotICAgICAgaWYgKHJzbHQgPj0gMCkKLQl7Ci0JICBpZiAoKCgoc3Quc3RfbW9kZSAmIDAwNCkgPT0gMCkgJiYgKGNtZCAmIFJfT0spKQotCSAgICAgIHx8ICgoKHN0LnN0X21vZGUgJiAwMDIpID09IDApICYmIChjbWQgJiBXX09LKSkKLQkgICAgICB8fCAoKChzdC5zdF9tb2RlICYgMDAxKSA9PSAwKSAmJiAoY21kICYgWF9PSykpKQotCSAgICB7Ci0JICAgICAgcnNsdCA9IC0xOwotCSAgICAgIGVycm51bSA9IEVBQ0NFUzsKLQkgICAgfQotCX0KLSAgICB9Ci0gIGlmIChEZWJ1Z1BJKQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiMgbXB3X2FjY2VzcyAoJXMsICVkKSIsIHRtcG5hbWUsIGNtZCk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIgLT4gJWQiLCByc2x0KTsKLSAgICAgIGlmIChyc2x0ICE9IDApCi0JZnByaW50ZiAoc3RkZXJyLCAiIChlcnJubyBpcyAlZCkiLCBlcnJudW0pOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0gIGlmIChyc2x0ICE9IDApCi0gICAgZXJybm8gPSBlcnJudW07Ci0gIHJldHVybiByc2x0OwotfQotCi0vKiBUaGUgTVBXIGxpYnJhcnkgY3JlYXQoKSBoYXMgbm8gbW9kZSBhcmd1bWVudC4gKi8KLQotaW50Ci1tcHdfY3JlYXQgKGNoYXIgKnBhdGgsIC8qIG1vZGVfdCAqLyBpbnQgbW9kZSkKLXsKLSN1bmRlZiBjcmVhdAotCi0jaWZkZWYgVVNFX01XX0hFQURFUlMKLSAgcmV0dXJuIGNyZWF0IChwYXRoLCBtb2RlKTsKLSNlbHNlCi0gIHJldHVybiBjcmVhdCAocGF0aCk7Ci0jZW5kaWYKLX0KLQotLyogVGhpcyBpcyBhIGhhY2sgdG8gZ2V0IGNvbnRyb2wgaW4gYW4gTVBXIHRvb2wgYmVmb3JlIGl0IGNyYXNoZXMgdGhlCi0gICBtYWNoaW5lLiAgKi8KLQotbXB3X3NwZWNpYWxfaW5pdCAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgaWYgKHN0cnN0ciAobmFtZSwgIkRFQlVHIikpCi0gICAgRGVidWdTdHIoIlxwYXQgYmVnaW5uaW5nIG9mIHByb2dyYW0iKTsKLX0KLQotc3RhdGljIGludCBjdXJyZW50X3VtYXNrOwotCi1pbnQKLXVtYXNrKGludCBtYXNrKQotewotICBpbnQgb2xkbWFzayA9IGN1cnJlbnRfdW1hc2s7Ci0KLSAgY3VycmVudF91bWFzayA9IG1hc2s7Ci0gIHJldHVybiBvbGRtYXNrOwotfQotCi0vKiBDdXJzb3Itc3Bpbm5pbmcgc3R1ZmYgdGhhdCBpbmNsdWRlcyBtZXRlcmluZyBvZiBzcGluIHJhdGUgYW5kIGRlbGF5cy4gICovCi0KLS8qIE5vbnplcm8gd2hlbiBjdXJzb3Igc3Bpbm5pbmcgaGFzIGJlZW4gc2V0IHVwIHByb3Blcmx5LiAgKi8KLQotaW50IGN1cnNvcl9pbml0ZWQ7Ci0KLS8qIE5vbnplcm8gaWYgc3BpbiBzaG91bGQgYmUgbWVhc3VyZWQgYW5kIGV4Y2Vzc2l2ZSBkZWxheXMgcmVwb3J0ZWQuICAqLwotCi1pbnQgbWVhc3VyZV9zcGluOwotCi0vKiBOb256ZXJvIGlmIHNwaW4gaGlzdG9ncmFtIGFuZCByYXRlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0LiAgKi8KLQotaW50IGR1bXBfc3Bpbl9kYXRhOwotCi1sb25nIHdhcm5pbmdfdGhyZXNob2xkID0gNDAwMDAwOwotCi1sb25nIGJ1Y2tldF9zaXplID0gMTAyNDsKLQotbG9uZyBidWNrZXRfcG93ZXIgPSAxMDsKLQotbG9uZyBudW1idWNrZXRzID0gMzAwOwotCi1pbnQgKmRlbGF5X2NvdW50czsKLQotaW50IG92ZXJmbG93X2NvdW50OwotCi1jaGFyICpjdXJyZW50X3Byb2dyZXNzOwotCi1zdGF0aWMgVW5zaWduZWRXaWRlIGxhc3RfbWljcm9zZWNvbmRzOwotCi1zdGF0aWMgY2hhciAqbGFzdF9zcGluX2ZpbGUgPSAiIjsKLQotc3RhdGljIGludCBsYXN0X3NwaW5fbGluZTsKLQotdm9pZAotd2Fybl9pZl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgbG9uZyBkaWZmLCBpeDsKLSAgVW5zaWduZWRXaWRlIG5vdzsKLQotICBNaWNyb3NlY29uZHMoJm5vdyk7Ci0KLSAgZGlmZiA9IG5vdy5sbyAtIGxhc3RfbWljcm9zZWNvbmRzLmxvOwotCi0gIGlmIChkaWZmID4gd2FybmluZ190aHJlc2hvbGQpCi0gICAgZnByaW50ZiAoc3RkZXJyLCAiIyAlczogJWxkLiUwNmxkIHNlYyBkZWxheSBnZXR0aW5nIGZyb20gJXM6JWQgdG8gJXM6JWRcbiIsCi0JICAgICAoY3VycmVudF9wcm9ncmVzcyA/IGN1cnJlbnRfcHJvZ3Jlc3MgOiAiIiksCi0JICAgICBkaWZmIC8gMTAwMDAwMCwgZGlmZiAlIDEwMDAwMDAsCi0JICAgICBsYXN0X3NwaW5fZmlsZSwgbGFzdF9zcGluX2xpbmUsIGZpbGUsIGxpbmUpOwotICBpZiAoZHVtcF9zcGluX2RhdGEpCi0gICAgewotICAgICAgaWYgKGRpZmYgPj0gMCkKLQl7Ci0JICBpeCA9IGRpZmYgPj4gYnVja2V0X3Bvd2VyOwotCSAgaWYgKGl4ID49IDAgJiYgaXggPCBudW1idWNrZXRzICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQotCSAgICArK2RlbGF5X2NvdW50c1tpeF07Ci0JICBlbHNlCi0JICAgICsrb3ZlcmZsb3dfY291bnQ7Ci0JfQotICAgICAgZWxzZQotCWZwcmludGYgKHN0ZGVyciwgInJhdyBkaWZmIGlzICVsZCAoPylcbiIsIGRpZmYpOwotICAgIH0KLX0KLQotdm9pZAotcmVjb3JkX2Zvcl9zcGluX2RlbGF5IChjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgTWljcm9zZWNvbmRzICgmbGFzdF9taWNyb3NlY29uZHMpOwotICBsYXN0X3NwaW5fZmlsZSA9IGZpbGU7Ci0gIGxhc3Rfc3Bpbl9saW5lID0gbGluZTsKLX0KLQotdm9pZAotbXB3X3N0YXJ0X3Byb2dyZXNzIChjaGFyICpzdHIsIGludCBuLCBjaGFyICpmaWxlLCBpbnQgbGluZSkKLXsKLSAgaW50IGk7Ci0gIGNoYXIgKm1lYXN1cmUsICp0aHJlc2hvbGQ7Ci0KLSAgaWYgKCFjdXJzb3JfaW5pdGVkKQotICAgIHsKLSAgICAgIEluaXRDdXJzb3JDdGwgKG5pbCk7Ci0gICAgICBjdXJzb3JfaW5pdGVkID0gMTsKLSAgICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci0gICAgICBtZWFzdXJlID0gZ2V0ZW52ICgiTUVBU1VSRV9TUElOIik7Ci0gICAgICBpZiAobWVhc3VyZSAhPSBOVUxMICYmIG1lYXN1cmVbMF0gIT0gJ1wwJykKLQl7Ci0JICBtZWFzdXJlX3NwaW4gPSAxOwotCSAgaWYgKHN0cmNtcCAobWVhc3VyZSwgImFsbCIpID09IDApCi0JICAgIGR1bXBfc3Bpbl9kYXRhID0gMTsKLQl9Ci0gICAgICB0aHJlc2hvbGQgPSBnZXRlbnYgKCJTUElOX1dBUk5fVEhSRVNIT0xEIik7Ci0gICAgICBpZiAodGhyZXNob2xkICE9IE5VTEwgJiYgdGhyZXNob2xkWzBdICE9ICdcMCcpCi0Jd2FybmluZ190aHJlc2hvbGQgPSBhdG9sICh0aHJlc2hvbGQpOwotICAgICAgaWYgKGR1bXBfc3Bpbl9kYXRhKQotCXsKLQkgIGlmIChkZWxheV9jb3VudHMgPT0gTlVMTCkKLQkgICAgZGVsYXlfY291bnRzID0gKGludCAqKSBtYWxsb2MgKG51bWJ1Y2tldHMgKiBzaXplb2YgKGludCkpOwotCSAgZm9yIChpID0gMDsgaSA8IG51bWJ1Y2tldHM7ICsraSkKLQkgICAgZGVsYXlfY291bnRzW2ldID0gMDsKLQkgIG92ZXJmbG93X2NvdW50ID0gMDsKLQl9Ci0gICAgfQotICBjdXJyZW50X3Byb2dyZXNzID0gc3RyOwotCi0gIHN5c19uZXJyID0gZXJybm9fbWF4ICgpOwotCi0gIG1wd19zcGVjaWFsX2luaXQgKHN0cik7Ci19Ci0KLXZvaWQKLW1wd19wcm9ncmVzcyAoaW50IG4pCi17Ci0gIFNwaW5DdXJzb3IgKDMyKTsKLX0KLQotdm9pZAotbXB3X3Byb2dyZXNzX21lYXN1cmVkIChpbnQgbiwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLSAgU3BpbkN1cnNvciAoMzIpOwotICBpZiAobWVhc3VyZV9zcGluKQotICAgIHJlY29yZF9mb3Jfc3Bpbl9kZWxheSAoZmlsZSwgbGluZSk7Ci19Ci0KLXZvaWQKLW1wd19lbmRfcHJvZ3Jlc3MgKGNoYXIgKnN0ciwgY2hhciAqZmlsZSwgaW50IGxpbmUpCi17Ci0gIGxvbmcgaSwgZGVsYXksIGNvdW50ID0gMCwgc3VtID0gMCwgYXZnZGVsYXksIHNwaW5yYXRlOwotICBsb25nIGN1cnBvd2VyID0gMCwgY3VyZ3JvdXAgPSAwOwotCi0gIC8qIFdhcm4gaWYgaXQncyBiZWVuIGEgd2hpbGUgc2luY2UgdGhlIGxhc3Qgc3Bpbi4gICovCi0gIGlmIChtZWFzdXJlX3NwaW4pCi0gICAgd2Fybl9pZl9zcGluX2RlbGF5IChmaWxlLCBsaW5lKTsKLQotICAvKiBEdW1wIGFsbCB0aGUgbm9uemVybyBkZWxheSBjb3VudHMgYW5kIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGRlbGF5LiAgKi8KLSAgaWYgKGR1bXBfc3Bpbl9kYXRhICYmIGRlbGF5X2NvdW50cyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1idWNrZXRzOyArK2kpCi0JewotCSAgZGVsYXkgPSAoaSArIDEpICogYnVja2V0X3NpemU7Ci0JICBzdW0gKz0gZGVsYXlfY291bnRzW2ldICogKGkgKyAxKTsKLQkgIGNvdW50ICs9IGRlbGF5X2NvdW50c1tpXTsKLQkgIGlmIChkZWxheSA8PSAoMSA8PCBjdXJwb3dlcikpCi0JICAgIHsKLQkgICAgICBjdXJncm91cCArPSBkZWxheV9jb3VudHNbaV07Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChjdXJncm91cCA+IDApCi0JCWZwcmludGYgKHN0ZGVyciwKLQkJCSAiIyAlczogJWQgZGVsYXlzIGJldHdlZW4gJWxkLiUwNmxkIGFuZCAlbGQuJTA2bGQgc2VjXG4iLAotCQkJIChzdHIgPyBzdHIgOiAiIiksCi0JCQkgY3VyZ3JvdXAsCi0JCQkgKDEgPDwgY3VycG93ZXIpIC8gMTAwMDAwMCwKLQkJCSAoMSA8PCBjdXJwb3dlcikgJSAxMDAwMDAwLAotCQkJICgxIDw8IChjdXJwb3dlciArIDEpKSAvIDEwMDAwMDAsCi0JCQkgKDEgPDwgKGN1cnBvd2VyICsgMSkpICUgMTAwMDAwMCk7Ci0JICAgICAgKytjdXJwb3dlcjsKLQkgICAgICBjdXJncm91cCA9IDA7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoY291bnQgPiAwKQotCXsKLQkgIGF2Z2RlbGF5ID0gKHN1bSAqIGJ1Y2tldF9zaXplKSAvIGNvdW50OwotCSAgc3BpbnJhdGUgPSAxMDAwMDAwIC8gYXZnZGVsYXk7Ci0JICBmcHJpbnRmIChzdGRlcnIsICIjICVzOiBBdmVyYWdlIHNwaW4gcmF0ZSBpcyAlZCB0aW1lcy9zZWNcbiIsCi0JCSAgIChzdHIgPyBzdHIgOiAiIiksIHNwaW5yYXRlKTsKLQl9Ci0gICAgfQotfQotCi0jaWZkZWYgUFJPR1JFU1NfVEVTVAotCi0vKiBUZXN0IHByb2dyYW0uICAqLwotCi1tYWluICgpCi17Ci0gIGludCBpLCBqOwotICBkb3VibGUgeCA9IDEuMCwgeSA9IDIuNDsKLSAgbG9uZyBzdGFydCA9IE1pY3Jvc2Vjb25kcyAoKSwgdG07ICBGSVhNRQotCi0gIFNUQVJUX1BST0dSRVNTICgiaGkiLCAwKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgKytpKQotICAgIHsKLSAgICAgIFBST0dSRVNTICgxKTsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IChpICogMTAwKTsgKytqKQotCXsKLQkgIHggKz0gKHggKiB5KSAvIGo7Ci0JfQotICAgIH0KLSAgCi0gIEVORF9QUk9HUkVTUyAoImhpIik7Ci0gIAotICB0bSA9IE1pY3Jvc2Vjb25kcyAoKSAtIHN0YXJ0OwotCi0gIHByaW50ZiAoIlRvdGFsIHRpbWUgaXMgJWQuJWQgc2Vjc1xuIiwgdG0gLyAxMDAwMDAwLCB0bSAlIDEwMDAwMDApOwotfQotCi0jZW5kaWYKLQotI2lmZGVmIFVTRV9NV19IRUFERVJTCi0vKiBFbXB0eSBkZWZpbml0aW9ucyBmb3IgTWV0cm93ZXJrcycgU0lPVVggY29uc29sZSBsaWJyYXJ5LiAqLwotCi0jaWZuZGVmIF9fQ09OU09MRV9fCi0jaW5jbHVkZSA8Y29uc29sZS5oPgotI2VuZGlmCi0KLXNob3J0Ci1JbnN0YWxsQ29uc29sZShzaG9ydCBmZCkKLXsKLSNwcmFnbWEgdW51c2VkIChmZCkKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotUmVtb3ZlQ29uc29sZSh2b2lkKQotewotfQotCi1sb25nCi1Xcml0ZUNoYXJzVG9Db25zb2xlKGNoYXIgKmJ1ZiwgbG9uZyBuKQotewotI3ByYWdtYSB1bnVzZWQgKGJ1ZiwgbikKLQlyZXR1cm4gMDsKLX0KLQotbG9uZyBSZWFkQ2hhcnNGcm9tQ29uc29sZShjaGFyICpidWYsIGxvbmcgbikKLXsKLSNwcmFnbWEgdW51c2VkIChidWYsIG4pCi0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBjaGFyICoKLV9fdHR5bmFtZShsb25nIGZkKQotewotCXN0YXRpYyBjaGFyICpfX2RldmljZW5hbWUgPSAibnVsbCBkZXZpY2UiOwotCi0JaWYgKGZkID49IDAgJiYgZmQgPD0gMikKLQkgIHJldHVybiAoX19kZXZpY2VuYW1lKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvbXNkb3MuYyBiL2xpYmliZXJ0eS9tc2Rvcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjNlNjRkLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9tc2Rvcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotY2hhciBtc2dbXSA9ICJObyB2Zm9yayBhdmFpbGFibGUgLSBhYm9ydGluZ1xuIjsKLXZmb3JrKCkKLXsKLSAgd3JpdGUoMSwgbXNnLCBzaXplb2YobXNnKSk7Ci19Ci0KLXNpZ3NldG1hc2soKQotewotICAvKiBubyBzaWduYWxzIHN1cHBvcnQgaW4gZ28zMiAoeWV0KSAqLwotfQotCi13YWl0cGlkKCkKLXsKLSAgcmV0dXJuIC0xOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L29iamFsbG9jLmMgYi9saWJpYmVydHkvb2JqYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3NTRhOC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvb2JqYWxsb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKiBvYmphbGxvYy5jIC0tIHJvdXRpbmVzIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb2JqZWN0cwotICAgQ29weXJpZ2h0IDE5OTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTb2x1dGlvbnMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci11bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLWxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvYmphbGxvYy5oIgotCi0vKiBHZXQgYSBkZWZpbml0aW9uIGZvciBOVUxMLiAgKi8KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLQotI2lmZGVmIEFOU0lfUFJPVE9UWVBFUwotLyogR2V0IGEgZGVmaW5pdGlvbiBmb3Igc2l6ZV90LiAgKi8KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbmRpZgotCi0vKiBGb3Igc3lzdGVtcyB3aXRoIGxhcmdlciBwb2ludGVycyB0aGFuIGludHMsIHRoaXMgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1leHRlcm4gUFRSIG1hbGxvYyBQQVJBTVMgKChzaXplX3QpKTsKLWV4dGVybiB2b2lkIGZyZWUgUEFSQU1TICgoUFRSKSk7Ci0jZW5kaWYKLQotLyogVGhlc2Ugcm91dGluZXMgYWxsb2NhdGUgc3BhY2UgZm9yIGFuIG9iamVjdC4gIEZyZWVpbmcgYWxsb2NhdGVkCi0gICBzcGFjZSBtYXkgb3IgbWF5IG5vdCBmcmVlIGFsbCBtb3JlIHJlY2VudGx5IGFsbG9jYXRlZCBzcGFjZS4KLQotICAgV2UgaGFuZGxlIGxhcmdlIGFuZCBzbWFsbCBhbGxvY2F0aW9uIHJlcXVlc3RzIGRpZmZlcmVudGx5LiAgSWYgd2UKLSAgIGRvbid0IGhhdmUgZW5vdWdoIHNwYWNlIGluIHRoZSBjdXJyZW50IGJsb2NrLCBhbmQgdGhlIGFsbG9jYXRpb24KLSAgIHJlcXVlc3QgaXMgZm9yIG1vcmUgdGhhbiA1MTIgYnl0ZXMsIHdlIHNpbXBseSBwYXNzIGl0IHRocm91Z2ggdG8KLSAgIG1hbGxvYy4gICovCi0KLS8qIFRoZSBvYmphbGxvYyBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBvYmphbGxvYy5oLiAgKi8KLQotLyogVGhpcyBzdHJ1Y3R1cmUgYXBwZWFycyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBjaHVuay4gICovCi0KLXN0cnVjdCBvYmphbGxvY19jaHVuawotewotICAvKiBOZXh0IGNodW5rLiAgKi8KLSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotICAvKiBJZiB0aGlzIGNodW5rIGNvbnRhaW5zIGxhcmdlIG9iamVjdHMsIHRoaXMgaXMgdGhlIHZhbHVlIG9mCi0gICAgIGN1cnJlbnRfcHRyIHdoZW4gdGhpcyBjaHVuayB3YXMgYWxsb2NhdGVkLiAgSWYgdGhpcyBjaHVuawotICAgICBjb250YWlucyBzbWFsbCBvYmplY3RzLCB0aGlzIGlzIE5VTEwuICAqLwotICBjaGFyICpjdXJyZW50X3B0cjsKLX07Ci0KLS8qIFRoZSBhbGlnbmVkIHNpemUgb2Ygb2JqYWxsb2NfY2h1bmsuICAqLwotCi0jZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFCQkJCQlcCi0gICgoc2l6ZW9mIChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmspICsgT0JKQUxMT0NfQUxJR04gLSAxKQlcCi0gICAmfiAoT0JKQUxMT0NfQUxJR04gLSAxKSkKLQotLyogV2UgYXNrIGZvciB0aGlzIG11Y2ggbWVtb3J5IGVhY2ggdGltZSB3ZSBjcmVhdGUgYSBjaHVuayB3aGljaCBpcyB0bwotICAgaG9sZCBzbWFsbCBvYmplY3RzLiAgKi8KLQotI2RlZmluZSBDSFVOS19TSVpFICg0MDk2IC0gMzIpCi0KLS8qIEEgcmVxdWVzdCBmb3IgdGhpcyBhbW91bnQgb3IgbW9yZSBpcyBqdXN0IHBhc3NlZCB0aHJvdWdoIHRvIG1hbGxvYy4gICovCi0KLSNkZWZpbmUgQklHX1JFUVVFU1QgKDUxMikKLQotLyogQ3JlYXRlIGFuIG9iamFsbG9jIHN0cnVjdHVyZS4gICovCi0KLXN0cnVjdCBvYmphbGxvYyAqCi1vYmphbGxvY19jcmVhdGUgKCkKLXsKLSAgc3RydWN0IG9iamFsbG9jICpyZXQ7Ci0gIHN0cnVjdCBvYmphbGxvY19jaHVuayAqY2h1bms7Ci0KLSAgcmV0ID0gKHN0cnVjdCBvYmphbGxvYyAqKSBtYWxsb2MgKHNpemVvZiAqcmV0KTsKLSAgaWYgKHJldCA9PSBOVUxMKQotICAgIHJldHVybiBOVUxMOwotCi0gIHJldC0+Y2h1bmtzID0gKFBUUikgbWFsbG9jIChDSFVOS19TSVpFKTsKLSAgaWYgKHJldC0+Y2h1bmtzID09IE5VTEwpCi0gICAgewotICAgICAgZnJlZSAocmV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgcmV0LT5jaHVua3M7Ci0gIGNodW5rLT5uZXh0ID0gTlVMTDsKLSAgY2h1bmstPmN1cnJlbnRfcHRyID0gTlVMTDsKLQotICByZXQtPmN1cnJlbnRfcHRyID0gKGNoYXIgKikgY2h1bmsgKyBDSFVOS19IRUFERVJfU0laRTsKLSAgcmV0LT5jdXJyZW50X3NwYWNlID0gQ0hVTktfU0laRSAtIENIVU5LX0hFQURFUl9TSVpFOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEFsbG9jYXRlIHNwYWNlIGZyb20gYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotUFRSCi1fb2JqYWxsb2NfYWxsb2MgKG8sIGxlbikKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotICAgICB1bnNpZ25lZCBsb25nIGxlbjsKLXsKLSAgLyogV2UgYXZvaWQgY29uZnVzaW9uIGZyb20gemVybyBzaXplZCBvYmplY3RzIGJ5IGFsd2F5cyBhbGxvY2F0aW5nCi0gICAgIGF0IGxlYXN0IDEgYnl0ZS4gICovCi0gIGlmIChsZW4gPT0gMCkKLSAgICBsZW4gPSAxOwotCi0gIGxlbiA9IChsZW4gKyBPQkpBTExPQ19BTElHTiAtIDEpICZ+IChPQkpBTExPQ19BTElHTiAtIDEpOwotCi0gIGlmIChsZW4gPD0gby0+Y3VycmVudF9zcGFjZSkKLSAgICB7Ci0gICAgICBvLT5jdXJyZW50X3B0ciArPSBsZW47Ci0gICAgICBvLT5jdXJyZW50X3NwYWNlIC09IGxlbjsKLSAgICAgIHJldHVybiAoUFRSKSAoby0+Y3VycmVudF9wdHIgLSBsZW4pOwotICAgIH0KLQotICBpZiAobGVuID49IEJJR19SRVFVRVNUKQotICAgIHsKLSAgICAgIGNoYXIgKnJldDsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqY2h1bms7Ci0KLSAgICAgIHJldCA9IChjaGFyICopIG1hbGxvYyAoQ0hVTktfSEVBREVSX1NJWkUgKyBsZW4pOwotICAgICAgaWYgKHJldCA9PSBOVUxMKQotCXJldHVybiBOVUxMOwotCi0gICAgICBjaHVuayA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgcmV0OwotICAgICAgY2h1bmstPm5leHQgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIGNodW5rLT5jdXJyZW50X3B0ciA9IG8tPmN1cnJlbnRfcHRyOwotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBjaHVuazsKLQotICAgICAgcmV0dXJuIChQVFIpIChyZXQgKyBDSFVOS19IRUFERVJfU0laRSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpjaHVuazsKLQotICAgICAgY2h1bmsgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG1hbGxvYyAoQ0hVTktfU0laRSk7Ci0gICAgICBpZiAoY2h1bmsgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKLSAgICAgIGNodW5rLT5uZXh0ID0gKHN0cnVjdCBvYmphbGxvY19jaHVuayAqKSBvLT5jaHVua3M7Ci0gICAgICBjaHVuay0+Y3VycmVudF9wdHIgPSBOVUxMOwotCi0gICAgICBvLT5jdXJyZW50X3B0ciA9IChjaGFyICopIGNodW5rICsgQ0hVTktfSEVBREVSX1NJWkU7Ci0gICAgICBvLT5jdXJyZW50X3NwYWNlID0gQ0hVTktfU0laRSAtIENIVU5LX0hFQURFUl9TSVpFOwotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBjaHVuazsKLQotICAgICAgcmV0dXJuIG9iamFsbG9jX2FsbG9jIChvLCBsZW4pOwotICAgIH0KLX0KLQotLyogRnJlZSBhbiBlbnRpcmUgb2JqYWxsb2Mgc3RydWN0dXJlLiAgKi8KLQotdm9pZAotb2JqYWxsb2NfZnJlZSAobykKLSAgICAgc3RydWN0IG9iamFsbG9jICpvOwotewotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKmw7Ci0KLSAgbCA9IChzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKikgby0+Y2h1bmtzOwotICB3aGlsZSAobCAhPSBOVUxMKQotICAgIHsKLSAgICAgIHN0cnVjdCBvYmphbGxvY19jaHVuayAqbmV4dDsKLQotICAgICAgbmV4dCA9IGwtPm5leHQ7Ci0gICAgICBmcmVlIChsKTsKLSAgICAgIGwgPSBuZXh0OwotICAgIH0KLQotICBmcmVlIChvKTsKLX0KLQotLyogRnJlZSBhIGJsb2NrIGZyb20gYW4gb2JqYWxsb2Mgc3RydWN0dXJlLiAgVGhpcyBhbHNvIGZyZWVzIGFsbCBtb3JlCi0gICByZWNlbnRseSBhbGxvY2F0ZWQgYmxvY2tzLiAgKi8KLQotdm9pZAotb2JqYWxsb2NfZnJlZV9ibG9jayAobywgYmxvY2spCi0gICAgIHN0cnVjdCBvYmphbGxvYyAqbzsKLSAgICAgUFRSIGJsb2NrOwotewotICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnAsICpzbWFsbDsKLSAgY2hhciAqYiA9IChjaGFyICopIGJsb2NrOwotCi0gIC8qIEZpcnN0IHNldCBQIHRvIHRoZSBjaHVuayB3aGljaCBjb250YWlucyB0aGUgYmxvY2sgd2UgYXJlIGZyZWVpbmcsCi0gICAgIGFuZCBzZXQgUSB0byB0aGUgbGFzdCBzbWFsbCBvYmplY3QgY2h1bmsgd2Ugc2VlIGJlZm9yZSBQLiAgKi8KLSAgc21hbGwgPSBOVUxMOwotICBmb3IgKHAgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkKLSAgICB7Ci0gICAgICBpZiAocC0+Y3VycmVudF9wdHIgPT0gTlVMTCkKLQl7Ci0JICBpZiAoYiA+IChjaGFyICopIHAgJiYgYiA8IChjaGFyICopIHAgKyBDSFVOS19TSVpFKQotCSAgICBicmVhazsKLQkgIHNtYWxsID0gcDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKGIgPT0gKGNoYXIgKikgcCArIENIVU5LX0hFQURFUl9TSVpFKQotCSAgICBicmVhazsKLQl9Ci0gICAgfQotCi0gIC8qIElmIHdlIGNhbid0IGZpbmQgdGhlIGNodW5rLCB0aGUgY2FsbGVyIGhhcyBtYWRlIGEgbWlzdGFrZS4gICovCi0gIGlmIChwID09IE5VTEwpCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHAtPmN1cnJlbnRfcHRyID09IE5VTEwpCi0gICAgewotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpxOwotICAgICAgc3RydWN0IG9iamFsbG9jX2NodW5rICpmaXJzdDsKLQotICAgICAgLyogVGhlIGJsb2NrIGlzIGluIGEgY2h1bmsgY29udGFpbmluZyBzbWFsbCBvYmplY3RzLiAgV2UgY2FuCi0JIGZyZWUgZXZlcnkgY2h1bmsgdGhyb3VnaCBTTUFMTCwgYmVjYXVzZSB0aGV5IGhhdmUgY2VydGFpbmx5Ci0JIGJlZW4gYWxsb2NhdGVkIG1vcmUgcmVjZW50bHkuICBBZnRlciBTTUFMTCwgd2Ugd2lsbCBub3Qgc2VlCi0JIGFueSBjaHVua3MgY29udGFpbmluZyBzbWFsbCBvYmplY3RzOyB3ZSBjYW4gZnJlZSBhbnkgYmlnCi0JIGNodW5rIGlmIHRoZSBjdXJyZW50X3B0ciBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQi4gIFdlCi0JIGNhbiB0aGVuIHJlc2V0IHRoZSBuZXcgY3VycmVudF9wdHIgdG8gQi4gICovCi0KLSAgICAgIGZpcnN0ID0gTlVMTDsKLSAgICAgIHEgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIHdoaWxlIChxICE9IHApCi0JewotCSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0JICBuZXh0ID0gcS0+bmV4dDsKLQkgIGlmIChzbWFsbCAhPSBOVUxMKQotCSAgICB7Ci0JICAgICAgaWYgKHNtYWxsID09IHEpCi0JCXNtYWxsID0gTlVMTDsKLQkgICAgICBmcmVlIChxKTsKLQkgICAgfQotCSAgZWxzZSBpZiAocS0+Y3VycmVudF9wdHIgPiBiKQotCSAgICBmcmVlIChxKTsKLQkgIGVsc2UgaWYgKGZpcnN0ID09IE5VTEwpCi0JICAgIGZpcnN0ID0gcTsKLQotCSAgcSA9IG5leHQ7Ci0JfQotCi0gICAgICBpZiAoZmlyc3QgPT0gTlVMTCkKLQlmaXJzdCA9IHA7Ci0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBmaXJzdDsKLQotICAgICAgLyogTm93IHN0YXJ0IGFsbG9jYXRpbmcgZnJvbSB0aGlzIHNtYWxsIGJsb2NrIGFnYWluLiAgKi8KLSAgICAgIG8tPmN1cnJlbnRfcHRyID0gYjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSAoKGNoYXIgKikgcCArIENIVU5LX1NJWkUpIC0gYjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBzdHJ1Y3Qgb2JqYWxsb2NfY2h1bmsgKnE7Ci0gICAgICBjaGFyICpjdXJyZW50X3B0cjsKLQotICAgICAgLyogVGhpcyBibG9jayBpcyBpbiBhIGxhcmdlIGNodW5rIGJ5IGl0c2VsZi4gIFdlIGNhbiBmcmVlCi0gICAgICAgICBldmVyeXRoaW5nIG9uIHRoZSBsaXN0IHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhpcyBibG9jay4gIFdlCi0gICAgICAgICB0aGVuIHN0YXJ0IGFsbG9jYXRpbmcgZnJvbSB0aGUgbmV4dCBjaHVuayBjb250YWluaW5nIHNtYWxsCi0gICAgICAgICBvYmplY3RzLCBzZXR0aW5nIGN1cnJlbnRfcHRyIGZyb20gdGhlIHZhbHVlIHN0b3JlZCB3aXRoIHRoZQotICAgICAgICAgbGFyZ2UgY2h1bmsgd2UgYXJlIGZyZWVpbmcuICAqLwotCi0gICAgICBjdXJyZW50X3B0ciA9IHAtPmN1cnJlbnRfcHRyOwotICAgICAgcCA9IHAtPm5leHQ7Ci0KLSAgICAgIHEgPSAoc3RydWN0IG9iamFsbG9jX2NodW5rICopIG8tPmNodW5rczsKLSAgICAgIHdoaWxlIChxICE9IHApCi0JewotCSAgc3RydWN0IG9iamFsbG9jX2NodW5rICpuZXh0OwotCi0JICBuZXh0ID0gcS0+bmV4dDsKLQkgIGZyZWUgKHEpOwotCSAgcSA9IG5leHQ7Ci0JfQotCi0gICAgICBvLT5jaHVua3MgPSAoUFRSKSBwOwotCi0gICAgICB3aGlsZSAocC0+Y3VycmVudF9wdHIgIT0gTlVMTCkKLQlwID0gcC0+bmV4dDsKLQotICAgICAgby0+Y3VycmVudF9wdHIgPSBjdXJyZW50X3B0cjsKLSAgICAgIG8tPmN1cnJlbnRfc3BhY2UgPSAoKGNoYXIgKikgcCArIENIVU5LX1NJWkUpIC0gY3VycmVudF9wdHI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L29ic3RhY2suYyBiL2xpYmliZXJ0eS9vYnN0YWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzE4YjMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L29ic3RhY2suYworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKiBvYnN0YWNrLmMgLSBzdWJyb3V0aW5lcyB1c2VkIGltcGxpY2l0bHkgYnkgb2JqZWN0IHN0YWNrIG1hY3JvcwotICAgQ29weXJpZ2h0IChDKSAxOTg4LDg5LDkwLDkxLDkyLDkzLDk0LDk2LDk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0KLSAgIE5PVEU6IFRoZSBjYW5vbmljYWwgc291cmNlIG9mIHRoaXMgZmlsZSBpcyBtYWludGFpbmVkIHdpdGggdGhlIEdOVSBDIExpYnJhcnkuCi0gICBCdWdzIGNhbiBiZSByZXBvcnRlZCB0byBidWctZ2xpYmNAZ251Lm9yZy4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICAgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywKLSAgIFVTQS4gICovCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSA8Y29uZmlnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIm9ic3RhY2suaCIKLQotLyogTk9URSBCRUZPUkUgTU9ESUZZSU5HIFRISVMgRklMRTogVGhpcyB2ZXJzaW9uIG51bWJlciBtdXN0IGJlCi0gICBpbmNyZW1lbnRlZCB3aGVuZXZlciBjYWxsZXJzIGNvbXBpbGVkIHVzaW5nIGFuIG9sZCBvYnN0YWNrLmggY2FuIG5vCi0gICBsb25nZXIgcHJvcGVybHkgY2FsbCB0aGUgZnVuY3Rpb25zIGluIHRoaXMgb2JzdGFjay5jLiAgKi8KLSNkZWZpbmUgT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiAxCi0KLS8qIENvbW1lbnQgb3V0IGFsbCB0aGlzIGNvZGUgaWYgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBMaWJyYXJ5LCBhbmQgYXJlIG5vdAotICAgYWN0dWFsbHkgY29tcGlsaW5nIHRoZSBsaWJyYXJ5IGl0c2VsZiwgYW5kIHRoZSBpbnN0YWxsZWQgbGlicmFyeQotICAgc3VwcG9ydHMgdGhlIHNhbWUgbGlicmFyeSBpbnRlcmZhY2Ugd2UgZG8uICBUaGlzIGNvZGUgaXMgcGFydCBvZiB0aGUgR05VCi0gICBDIExpYnJhcnksIGJ1dCBhbHNvIGluY2x1ZGVkIGluIG1hbnkgb3RoZXIgR05VIGRpc3RyaWJ1dGlvbnMuICBDb21waWxpbmcKLSAgIGFuZCBsaW5raW5nIGluIHRoaXMgY29kZSBpcyBhIHdhc3RlIHdoZW4gdXNpbmcgdGhlIEdOVSBDIGxpYnJhcnkKLSAgIChlc3BlY2lhbGx5IGlmIGl0IGlzIGEgc2hhcmVkIGxpYnJhcnkpLiAgUmF0aGVyIHRoYW4gaGF2aW5nIGV2ZXJ5IEdOVQotICAgcHJvZ3JhbSB1bmRlcnN0YW5kIGBjb25maWd1cmUgLS13aXRoLWdudS1saWJjJyBhbmQgb21pdCB0aGUgb2JqZWN0Ci0gICBmaWxlcywgaXQgaXMgc2ltcGxlciB0byBqdXN0IGRvIHRoaXMgaW4gdGhlIHNvdXJjZSBmb3IgZWFjaCBzdWNoIGZpbGUuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4JCS8qIFJhbmRvbSB0aGluZyB0byBnZXQgX19HTlVfTElCUkFSWV9fLiAgKi8KLSNpZiAhZGVmaW5lZCAoX0xJQkMpICYmIGRlZmluZWQgKF9fR05VX0xJQlJBUllfXykgJiYgX19HTlVfTElCUkFSWV9fID4gMQotI2luY2x1ZGUgPGdudS12ZXJzaW9ucy5oPgotI2lmIF9HTlVfT0JTVEFDS19JTlRFUkZBQ0VfVkVSU0lPTiA9PSBPQlNUQUNLX0lOVEVSRkFDRV9WRVJTSU9OCi0jZGVmaW5lIEVMSURFX0NPREUKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmbmRlZiBFTElERV9DT0RFCi0KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotI2RlZmluZSBQT0lOVEVSIHZvaWQgKgotI2Vsc2UKLSNkZWZpbmUgUE9JTlRFUiBjaGFyICoKLSNlbmRpZgotCi0vKiBEZXRlcm1pbmUgZGVmYXVsdCBhbGlnbm1lbnQuICAqLwotc3RydWN0IGZvb2FsaWduIHtjaGFyIHg7IGRvdWJsZSBkO307Ci0jZGVmaW5lIERFRkFVTFRfQUxJR05NRU5UICBcCi0gICgoUFRSX0lOVF9UWVBFKSAoKGNoYXIgKikgJigoc3RydWN0IGZvb2FsaWduICopIDApLT5kIC0gKGNoYXIgKikgMCkpCi0vKiBJZiBtYWxsb2Mgd2VyZSByZWFsbHkgc21hcnQsIGl0IHdvdWxkIHJvdW5kIGFkZHJlc3NlcyB0byBERUZBVUxUX0FMSUdOTUVOVC4KLSAgIEJ1dCBpbiBmYWN0IGl0IG1pZ2h0IGJlIGxlc3Mgc21hcnQgYW5kIHJvdW5kIGFkZHJlc3NlcyB0byBhcyBtdWNoIGFzCi0gICBERUZBVUxUX1JPVU5ESU5HLiAgU28gd2UgcHJlcGFyZSBmb3IgaXQgdG8gZG8gdGhhdC4gICovCi11bmlvbiBmb29yb3VuZCB7bG9uZyB4OyBkb3VibGUgZDt9OwotI2RlZmluZSBERUZBVUxUX1JPVU5ESU5HIChzaXplb2YgKHVuaW9uIGZvb3JvdW5kKSkKLQotLyogV2hlbiB3ZSBjb3B5IGEgbG9uZyBibG9jayBvZiBkYXRhLCB0aGlzIGlzIHRoZSB1bml0IHRvIGRvIGl0IHdpdGguCi0gICBPbiBzb21lIG1hY2hpbmVzLCBjb3B5aW5nIHN1Y2Nlc3NpdmUgaW50cyBkb2VzIG5vdCB3b3JrOwotICAgaW4gc3VjaCBhIGNhc2UsIHJlZGVmaW5lIENPUFlJTkdfVU5JVCB0byBgbG9uZycgKGlmIHRoYXQgd29ya3MpCi0gICBvciBgY2hhcicgYXMgYSBsYXN0IHJlc29ydC4gICovCi0jaWZuZGVmIENPUFlJTkdfVU5JVAotI2RlZmluZSBDT1BZSU5HX1VOSVQgaW50Ci0jZW5kaWYKLQotCi0vKiBUaGUgZnVuY3Rpb25zIGFsbG9jYXRpbmcgbW9yZSByb29tIGJ5IGNhbGxpbmcgYG9ic3RhY2tfY2h1bmtfYWxsb2MnCi0gICBqdW1wIHRvIHRoZSBoYW5kbGVyIHBvaW50ZWQgdG8gYnkgYG9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXInLgotICAgVGhpcyB2YXJpYWJsZSBieSBkZWZhdWx0IHBvaW50cyB0byB0aGUgaW50ZXJuYWwgZnVuY3Rpb24KLSAgIGBwcmludF9hbmRfYWJvcnQnLiAgKi8KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLXN0YXRpYyB2b2lkIHByaW50X2FuZF9hYm9ydCAodm9pZCk7Ci12b2lkICgqb2JzdGFja19hbGxvY19mYWlsZWRfaGFuZGxlcikgKHZvaWQpID0gcHJpbnRfYW5kX2Fib3J0OwotI2Vsc2UKLXN0YXRpYyB2b2lkIHByaW50X2FuZF9hYm9ydCAoKTsKLXZvaWQgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKSA9IHByaW50X2FuZF9hYm9ydDsKLSNlbmRpZgotCi0vKiBFeGl0IHZhbHVlIHVzZWQgd2hlbiBgcHJpbnRfYW5kX2Fib3J0JyBpcyB1c2VkLiAgKi8KLSNpZiBkZWZpbmVkIF9fR05VX0xJQlJBUllfXyB8fCBkZWZpbmVkIEhBVkVfU1RETElCX0gKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2lmbmRlZiBFWElUX0ZBSUxVUkUKLSNkZWZpbmUgRVhJVF9GQUlMVVJFIDEKLSNlbmRpZgotaW50IG9ic3RhY2tfZXhpdF9mYWlsdXJlID0gRVhJVF9GQUlMVVJFOwotCi0vKiBUaGUgbm9uLUdOVS1DIG1hY3JvcyBjb3B5IHRoZSBvYnN0YWNrIGludG8gdGhpcyBnbG9iYWwgdmFyaWFibGUKLSAgIHRvIGF2b2lkIG11bHRpcGxlIGV2YWx1YXRpb24uICAqLwotCi1zdHJ1Y3Qgb2JzdGFjayAqX29ic3RhY2s7Ci0KLS8qIERlZmluZSBhIG1hY3JvIHRoYXQgZWl0aGVyIGNhbGxzIGZ1bmN0aW9ucyB3aXRoIHRoZSB0cmFkaXRpb25hbCBtYWxsb2MvZnJlZQotICAgY2FsbGluZyBpbnRlcmZhY2UsIG9yIGNhbGxzIGZ1bmN0aW9ucyB3aXRoIHRoZSBtbWFsbG9jL21mcmVlIGludGVyZmFjZQotICAgKHRoYXQgYWRkcyBhbiBleHRyYSBmaXJzdCBhcmd1bWVudCksIGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB1c2VfZXh0cmFfYXJnLgotICAgRm9yIGZyZWUsIGRvIG5vdCB1c2UgPzosIHNpbmNlIHNvbWUgY29tcGlsZXJzLCBsaWtlIHRoZSBNSVBTIGNvbXBpbGVycywKLSAgIGRvIG5vdCBhbGxvdyAoZXhwcikgPyB2b2lkIDogdm9pZC4gICovCi0KLSNpZiBkZWZpbmVkIChfX1NURENfXykgJiYgX19TVERDX18KLSNkZWZpbmUgQ0FMTF9DSFVOS0ZVTihoLCBzaXplKSBcCi0gICgoKGgpIC0+IHVzZV9leHRyYV9hcmcpIFwKLSAgID8gKCooaCktPmNodW5rZnVuKSAoKGgpLT5leHRyYV9hcmcsIChzaXplKSkgXAotICAgOiAoKihzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKigqKSAobG9uZykpIChoKS0+Y2h1bmtmdW4pICgoc2l6ZSkpKQotCi0jZGVmaW5lIENBTExfRlJFRUZVTihoLCBvbGRfY2h1bmspIFwKLSAgZG8geyBcCi0gICAgaWYgKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICAgICAoKihoKS0+ZnJlZWZ1bikgKChoKS0+ZXh0cmFfYXJnLCAob2xkX2NodW5rKSk7IFwKLSAgICBlbHNlIFwKLSAgICAgICgqKHZvaWQgKCopICh2b2lkICopKSAoaCktPmZyZWVmdW4pICgob2xkX2NodW5rKSk7IFwKLSAgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIENBTExfQ0hVTktGVU4oaCwgc2l6ZSkgXAotICAoKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICA/ICgqKGgpLT5jaHVua2Z1bikgKChoKS0+ZXh0cmFfYXJnLCAoc2l6ZSkpIFwKLSAgIDogKCooc3RydWN0IF9vYnN0YWNrX2NodW5rICooKikgKCkpIChoKS0+Y2h1bmtmdW4pICgoc2l6ZSkpKQotCi0jZGVmaW5lIENBTExfRlJFRUZVTihoLCBvbGRfY2h1bmspIFwKLSAgZG8geyBcCi0gICAgaWYgKChoKSAtPiB1c2VfZXh0cmFfYXJnKSBcCi0gICAgICAoKihoKS0+ZnJlZWZ1bikgKChoKS0+ZXh0cmFfYXJnLCAob2xkX2NodW5rKSk7IFwKLSAgICBlbHNlIFwKLSAgICAgICgqKHZvaWQgKCopICgpKSAoaCktPmZyZWVmdW4pICgob2xkX2NodW5rKSk7IFwKLSAgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0MCi0vKiBJbml0aWFsaXplIGFuIG9ic3RhY2sgSCBmb3IgdXNlLiAgU3BlY2lmeSBjaHVuayBzaXplIFNJWkUgKDAgbWVhbnMgZGVmYXVsdCkuCi0gICBPYmplY3RzIHN0YXJ0IG9uIG11bHRpcGxlcyBvZiBBTElHTk1FTlQgKDAgbWVhbnMgdXNlIGRlZmF1bHQpLgotICAgQ0hVTktGVU4gaXMgdGhlIGZ1bmN0aW9uIHRvIHVzZSB0byBhbGxvY2F0ZSBjaHVua3MsCi0gICBhbmQgRlJFRUZVTiB0aGUgZnVuY3Rpb24gdG8gZnJlZSB0aGVtLgotCi0gICBSZXR1cm4gbm9uemVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIG91dCBvZiBtZW1vcnkuCi0gICBUbyByZWNvdmVyIGZyb20gYW4gb3V0IG9mIG1lbW9yeSBlcnJvciwKLSAgIGZyZWUgdXAgc29tZSBtZW1vcnksIHRoZW4gY2FsbCB0aGlzIGFnYWluLiAgKi8KLQotaW50Ci1fb2JzdGFja19iZWdpbiAoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1bikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIGludCBzaXplOwotICAgICBpbnQgYWxpZ25tZW50OwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotICAgICBQT0lOVEVSICgqY2h1bmtmdW4pIChsb25nKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICh2b2lkICopOwotI2Vsc2UKLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICgpOwotI2VuZGlmCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqY2h1bms7IC8qIHBvaW50cyB0byBuZXcgY2h1bmsgKi8KLQotICBpZiAoYWxpZ25tZW50ID09IDApCi0gICAgYWxpZ25tZW50ID0gKGludCkgREVGQVVMVF9BTElHTk1FTlQ7Ci0gIGlmIChzaXplID09IDApCi0gICAgLyogRGVmYXVsdCBzaXplIGlzIHdoYXQgR05VIG1hbGxvYyBjYW4gZml0IGluIGEgNDA5Ni1ieXRlIGJsb2NrLiAgKi8KLSAgICB7Ci0gICAgICAvKiAxMiBpcyBzaXplb2YgKG1oZWFkKSBhbmQgNCBpcyBFWFRSQSBmcm9tIEdOVSBtYWxsb2MuCi0JIFVzZSB0aGUgdmFsdWVzIGZvciByYW5nZSBjaGVja2luZywgYmVjYXVzZSBpZiByYW5nZSBjaGVja2luZyBpcyBvZmYsCi0JIHRoZSBleHRyYSBieXRlcyB3b24ndCBiZSBtaXNzZWQgdGVycmlibHksIGJ1dCBpZiByYW5nZSBjaGVja2luZyBpcyBvbgotCSBhbmQgd2UgdXNlZCBhIGxhcmdlciByZXF1ZXN0LCBhIHdob2xlIGV4dHJhIDQwOTYgYnl0ZXMgd291bGQgYmUKLQkgYWxsb2NhdGVkLgotCi0JIFRoZXNlIG51bWJlciBhcmUgaXJyZWxldmFudCB0byB0aGUgbmV3IEdOVSBtYWxsb2MuICBJIHN1c3BlY3QgaXQgaXMKLQkgbGVzcyBzZW5zaXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlIHJlcXVlc3QuICAqLwotICAgICAgaW50IGV4dHJhID0gKCgoKDEyICsgREVGQVVMVF9ST1VORElORyAtIDEpICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpCi0JCSAgICArIDQgKyBERUZBVUxUX1JPVU5ESU5HIC0gMSkKLQkJICAgJiB+KERFRkFVTFRfUk9VTkRJTkcgLSAxKSk7Ci0gICAgICBzaXplID0gNDA5NiAtIGV4dHJhOwotICAgIH0KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikodm9pZCAqLCBsb25nKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSAodm9pZCAoKikgKHZvaWQgKiwgc3RydWN0IF9vYnN0YWNrX2NodW5rICopKSBmcmVlZnVuOwotI2Vsc2UKLSAgaC0+Y2h1bmtmdW4gPSAoc3RydWN0IF9vYnN0YWNrX2NodW5rICogKCopKCkpIGNodW5rZnVuOwotICBoLT5mcmVlZnVuID0gZnJlZWZ1bjsKLSNlbmRpZgotICBoLT5jaHVua19zaXplID0gc2l6ZTsKLSAgaC0+YWxpZ25tZW50X21hc2sgPSBhbGlnbm1lbnQgLSAxOwotICBoLT51c2VfZXh0cmFfYXJnID0gMDsKLQotICBjaHVuayA9IGgtPmNodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgaCAtPiBjaHVua19zaXplKTsKLSAgaWYgKCFjaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5uZXh0X2ZyZWUgPSBoLT5vYmplY3RfYmFzZSA9IGNodW5rLT5jb250ZW50czsKLSAgaC0+Y2h1bmtfbGltaXQgPSBjaHVuay0+bGltaXQKLSAgICA9IChjaGFyICopIGNodW5rICsgaC0+Y2h1bmtfc2l6ZTsKLSAgY2h1bmstPnByZXYgPSAwOwotICAvKiBUaGUgaW5pdGlhbCBjaHVuayBub3cgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0LiAgKi8KLSAgaC0+bWF5YmVfZW1wdHlfb2JqZWN0ID0gMDsKLSAgaC0+YWxsb2NfZmFpbGVkID0gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotX29ic3RhY2tfYmVnaW5fMSAoaCwgc2l6ZSwgYWxpZ25tZW50LCBjaHVua2Z1biwgZnJlZWZ1biwgYXJnKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgaW50IHNpemU7Ci0gICAgIGludCBhbGlnbm1lbnQ7Ci0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0gICAgIFBPSU5URVIgKCpjaHVua2Z1bikgKFBPSU5URVIsIGxvbmcpOwotICAgICB2b2lkICgqZnJlZWZ1bikgKFBPSU5URVIsIFBPSU5URVIpOwotI2Vsc2UKLSAgICAgUE9JTlRFUiAoKmNodW5rZnVuKSAoKTsKLSAgICAgdm9pZCAoKmZyZWVmdW4pICgpOwotI2VuZGlmCi0gICAgIFBPSU5URVIgYXJnOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmNodW5rOyAvKiBwb2ludHMgdG8gbmV3IGNodW5rICovCi0KLSAgaWYgKGFsaWdubWVudCA9PSAwKQotICAgIGFsaWdubWVudCA9IChpbnQpIERFRkFVTFRfQUxJR05NRU5UOwotICBpZiAoc2l6ZSA9PSAwKQotICAgIC8qIERlZmF1bHQgc2l6ZSBpcyB3aGF0IEdOVSBtYWxsb2MgY2FuIGZpdCBpbiBhIDQwOTYtYnl0ZSBibG9jay4gICovCi0gICAgewotICAgICAgLyogMTIgaXMgc2l6ZW9mIChtaGVhZCkgYW5kIDQgaXMgRVhUUkEgZnJvbSBHTlUgbWFsbG9jLgotCSBVc2UgdGhlIHZhbHVlcyBmb3IgcmFuZ2UgY2hlY2tpbmcsIGJlY2F1c2UgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb2ZmLAotCSB0aGUgZXh0cmEgYnl0ZXMgd29uJ3QgYmUgbWlzc2VkIHRlcnJpYmx5LCBidXQgaWYgcmFuZ2UgY2hlY2tpbmcgaXMgb24KLQkgYW5kIHdlIHVzZWQgYSBsYXJnZXIgcmVxdWVzdCwgYSB3aG9sZSBleHRyYSA0MDk2IGJ5dGVzIHdvdWxkIGJlCi0JIGFsbG9jYXRlZC4KLQotCSBUaGVzZSBudW1iZXIgYXJlIGlycmVsZXZhbnQgdG8gdGhlIG5ldyBHTlUgbWFsbG9jLiAgSSBzdXNwZWN0IGl0IGlzCi0JIGxlc3Mgc2Vuc2l0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0LiAgKi8KLSAgICAgIGludCBleHRyYSA9ICgoKCgxMiArIERFRkFVTFRfUk9VTkRJTkcgLSAxKSAmIH4oREVGQVVMVF9ST1VORElORyAtIDEpKQotCQkgICAgKyA0ICsgREVGQVVMVF9ST1VORElORyAtIDEpCi0JCSAgICYgfihERUZBVUxUX1JPVU5ESU5HIC0gMSkpOwotICAgICAgc2l6ZSA9IDQwOTYgLSBleHRyYTsKLSAgICB9Ci0KLSNpZiBkZWZpbmVkKF9fU1REQ19fKSAmJiBfX1NURENfXwotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikodm9pZCAqLGxvbmcpKSBjaHVua2Z1bjsKLSAgaC0+ZnJlZWZ1biA9ICh2b2lkICgqKSAodm9pZCAqLCBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKikpIGZyZWVmdW47Ci0jZWxzZQotICBoLT5jaHVua2Z1biA9IChzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKiAoKikoKSkgY2h1bmtmdW47Ci0gIGgtPmZyZWVmdW4gPSBmcmVlZnVuOwotI2VuZGlmCi0gIGgtPmNodW5rX3NpemUgPSBzaXplOwotICBoLT5hbGlnbm1lbnRfbWFzayA9IGFsaWdubWVudCAtIDE7Ci0gIGgtPmV4dHJhX2FyZyA9IGFyZzsKLSAgaC0+dXNlX2V4dHJhX2FyZyA9IDE7Ci0KLSAgY2h1bmsgPSBoLT5jaHVuayA9IENBTExfQ0hVTktGVU4gKGgsIGggLT4gY2h1bmtfc2l6ZSk7Ci0gIGlmICghY2h1bmspCi0gICAgKCpvYnN0YWNrX2FsbG9jX2ZhaWxlZF9oYW5kbGVyKSAoKTsKLSAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgPSBjaHVuay0+Y29udGVudHM7Ci0gIGgtPmNodW5rX2xpbWl0ID0gY2h1bmstPmxpbWl0Ci0gICAgPSAoY2hhciAqKSBjaHVuayArIGgtPmNodW5rX3NpemU7Ci0gIGNodW5rLT5wcmV2ID0gMDsKLSAgLyogVGhlIGluaXRpYWwgY2h1bmsgbm93IGNvbnRhaW5zIG5vIGVtcHR5IG9iamVjdC4gICovCi0gIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7Ci0gIGgtPmFsbG9jX2ZhaWxlZCA9IDA7Ci0gIHJldHVybiAxOwotfQotCi0vKiBBbGxvY2F0ZSBhIG5ldyBjdXJyZW50IGNodW5rIGZvciB0aGUgb2JzdGFjayAqSAotICAgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBMRU5HVEggYnl0ZXMgbmVlZCB0byBiZSBhZGRlZAotICAgdG8gdGhlIGN1cnJlbnQgb2JqZWN0LCBvciBhIG5ldyBvYmplY3Qgb2YgbGVuZ3RoIExFTkdUSCBhbGxvY2F0ZWQuCi0gICBDb3BpZXMgYW55IHBhcnRpYWwgb2JqZWN0IGZyb20gdGhlIGVuZCBvZiB0aGUgb2xkIGNodW5rCi0gICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXcgb25lLiAgKi8KLQotdm9pZAotX29ic3RhY2tfbmV3Y2h1bmsgKGgsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqb2xkX2NodW5rID0gaC0+Y2h1bms7Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbmV3X2NodW5rOwotICByZWdpc3RlciBsb25nCW5ld19zaXplOwotICByZWdpc3RlciBsb25nIG9ial9zaXplID0gaC0+bmV4dF9mcmVlIC0gaC0+b2JqZWN0X2Jhc2U7Ci0gIHJlZ2lzdGVyIGxvbmcgaTsKLSAgbG9uZyBhbHJlYWR5OwotCi0gIC8qIENvbXB1dGUgc2l6ZSBmb3IgbmV3IGNodW5rLiAgKi8KLSAgbmV3X3NpemUgPSAob2JqX3NpemUgKyBsZW5ndGgpICsgKG9ial9zaXplID4+IDMpICsgMTAwOwotICBpZiAobmV3X3NpemUgPCBoLT5jaHVua19zaXplKQotICAgIG5ld19zaXplID0gaC0+Y2h1bmtfc2l6ZTsKLQotICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbmV3IGNodW5rLiAgKi8KLSAgbmV3X2NodW5rID0gQ0FMTF9DSFVOS0ZVTiAoaCwgbmV3X3NpemUpOwotICBpZiAoIW5ld19jaHVuaykKLSAgICAoKm9ic3RhY2tfYWxsb2NfZmFpbGVkX2hhbmRsZXIpICgpOwotICBoLT5jaHVuayA9IG5ld19jaHVuazsKLSAgbmV3X2NodW5rLT5wcmV2ID0gb2xkX2NodW5rOwotICBuZXdfY2h1bmstPmxpbWl0ID0gaC0+Y2h1bmtfbGltaXQgPSAoY2hhciAqKSBuZXdfY2h1bmsgKyBuZXdfc2l6ZTsKLQotICAvKiBNb3ZlIHRoZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIG5ldyBjaHVuay4KLSAgICAgV29yZCBhdCBhIHRpbWUgaXMgZmFzdCBhbmQgaXMgc2FmZSBpZiB0aGUgb2JqZWN0Ci0gICAgIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkLiAgKi8KLSAgaWYgKGgtPmFsaWdubWVudF9tYXNrICsgMSA+PSBERUZBVUxUX0FMSUdOTUVOVCkKLSAgICB7Ci0gICAgICBmb3IgKGkgPSBvYmpfc2l6ZSAvIHNpemVvZiAoQ09QWUlOR19VTklUKSAtIDE7Ci0JICAgaSA+PSAwOyBpLS0pCi0JKChDT1BZSU5HX1VOSVQgKiluZXdfY2h1bmstPmNvbnRlbnRzKVtpXQotCSAgPSAoKENPUFlJTkdfVU5JVCAqKWgtPm9iamVjdF9iYXNlKVtpXTsKLSAgICAgIC8qIFdlIHVzZWQgdG8gY29weSB0aGUgb2RkIGZldyByZW1haW5pbmcgYnl0ZXMgYXMgb25lIGV4dHJhIENPUFlJTkdfVU5JVCwKLQkgYnV0IHRoYXQgY2FuIGNyb3NzIGEgcGFnZSBib3VuZGFyeSBvbiBhIG1hY2hpbmUKLQkgd2hpY2ggZG9lcyBub3QgZG8gc3RyaWN0IGFsaWdubWVudCBmb3IgQ09QWUlOR19VTklUUy4gICovCi0gICAgICBhbHJlYWR5ID0gb2JqX3NpemUgLyBzaXplb2YgKENPUFlJTkdfVU5JVCkgKiBzaXplb2YgKENPUFlJTkdfVU5JVCk7Ci0gICAgfQotICBlbHNlCi0gICAgYWxyZWFkeSA9IDA7Ci0gIC8qIENvcHkgcmVtYWluaW5nIGJ5dGVzIG9uZSBieSBvbmUuICAqLwotICBmb3IgKGkgPSBhbHJlYWR5OyBpIDwgb2JqX3NpemU7IGkrKykKLSAgICBuZXdfY2h1bmstPmNvbnRlbnRzW2ldID0gaC0+b2JqZWN0X2Jhc2VbaV07Ci0KLSAgLyogSWYgdGhlIG9iamVjdCBqdXN0IGNvcGllZCB3YXMgdGhlIG9ubHkgZGF0YSBpbiBPTERfQ0hVTkssCi0gICAgIGZyZWUgdGhhdCBjaHVuayBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGNoYWluLgotICAgICBCdXQgbm90IGlmIHRoYXQgY2h1bmsgbWlnaHQgY29udGFpbiBhbiBlbXB0eSBvYmplY3QuICAqLwotICBpZiAoaC0+b2JqZWN0X2Jhc2UgPT0gb2xkX2NodW5rLT5jb250ZW50cyAmJiAhIGgtPm1heWJlX2VtcHR5X29iamVjdCkKLSAgICB7Ci0gICAgICBuZXdfY2h1bmstPnByZXYgPSBvbGRfY2h1bmstPnByZXY7Ci0gICAgICBDQUxMX0ZSRUVGVU4gKGgsIG9sZF9jaHVuayk7Ci0gICAgfQotCi0gIGgtPm9iamVjdF9iYXNlID0gbmV3X2NodW5rLT5jb250ZW50czsKLSAgaC0+bmV4dF9mcmVlID0gaC0+b2JqZWN0X2Jhc2UgKyBvYmpfc2l6ZTsKLSAgLyogVGhlIG5ldyBjaHVuayBjZXJ0YWlubHkgY29udGFpbnMgbm8gZW1wdHkgb2JqZWN0IHlldC4gICovCi0gIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDA7Ci19Ci0KLS8qIFJldHVybiBub256ZXJvIGlmIG9iamVjdCBPQkogaGFzIGJlZW4gYWxsb2NhdGVkIGZyb20gb2JzdGFjayBILgotICAgVGhpcyBpcyBoZXJlIGZvciBkZWJ1Z2dpbmcuCi0gICBJZiB5b3UgdXNlIGl0IGluIGEgcHJvZ3JhbSwgeW91IGFyZSBwcm9iYWJseSBsb3NpbmcuICAqLwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0vKiBTdXBwcmVzcyAtV21pc3NpbmctcHJvdG90eXBlcyB3YXJuaW5nLiAgV2UgZG9uJ3Qgd2FudCB0byBkZWNsYXJlIHRoaXMgaW4KLSAgIG9ic3RhY2suaCBiZWNhdXNlIGl0IGlzIGp1c3QgZm9yIGRlYnVnZ2luZy4gICovCi1pbnQgX29ic3RhY2tfYWxsb2NhdGVkX3AgKHN0cnVjdCBvYnN0YWNrICpoLCBQT0lOVEVSIG9iaik7Ci0jZW5kaWYKLQotaW50Ci1fb2JzdGFja19hbGxvY2F0ZWRfcCAoaCwgb2JqKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLSAgICAgUE9JTlRFUiBvYmo7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqbHA7CS8qIGJlbG93IGFkZHIgb2YgYW55IG9iamVjdHMgaW4gdGhpcyBjaHVuayAqLwotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKnBscDsJLyogcG9pbnQgdG8gcHJldmlvdXMgY2h1bmsgaWYgYW55ICovCi0KLSAgbHAgPSAoaCktPmNodW5rOwotICAvKiBXZSB1c2UgPj0gcmF0aGVyIHRoYW4gPiBzaW5jZSB0aGUgb2JqZWN0IGNhbm5vdCBiZSBleGFjdGx5IGF0Ci0gICAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNodW5rIGJ1dCBtaWdodCBiZSBhbiBlbXB0eSBvYmplY3QgZXhhY3RseQotICAgICBhdCB0aGUgZW5kIG9mIGFuIGFkamFjZW50IGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIGxwID0gcGxwOwotICAgIH0KLSAgcmV0dXJuIGxwICE9IDA7Ci19Ci0MCi0vKiBGcmVlIG9iamVjdHMgaW4gb2JzdGFjayBILCBpbmNsdWRpbmcgT0JKIGFuZCBldmVyeXRoaW5nIGFsbG9jYXRlCi0gICBtb3JlIHJlY2VudGx5IHRoYW4gT0JKLiAgSWYgT0JKIGlzIHplcm8sIGZyZWUgZXZlcnl0aGluZyBpbiBILiAgKi8KLQotI3VuZGVmIG9ic3RhY2tfZnJlZQotCi0vKiBUaGlzIGZ1bmN0aW9uIGhhcyB0d28gbmFtZXMgd2l0aCBpZGVudGljYWwgZGVmaW5pdGlvbnMuCi0gICBUaGlzIGlzIHRoZSBmaXJzdCBvbmUsIGNhbGxlZCBmcm9tIG5vbi1BTlNJIGNvZGUuICAqLwotCi12b2lkCi1fb2JzdGFja19mcmVlIChoLCBvYmopCi0gICAgIHN0cnVjdCBvYnN0YWNrICpoOwotICAgICBQT0lOVEVSIG9iajsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpscDsJLyogYmVsb3cgYWRkciBvZiBhbnkgb2JqZWN0cyBpbiB0aGlzIGNodW5rICovCi0gIHJlZ2lzdGVyIHN0cnVjdCBfb2JzdGFja19jaHVuayAqcGxwOwkvKiBwb2ludCB0byBwcmV2aW91cyBjaHVuayBpZiBhbnkgKi8KLQotICBscCA9IGgtPmNodW5rOwotICAvKiBXZSB1c2UgPj0gYmVjYXVzZSB0aGVyZSBjYW5ub3QgYmUgYW4gb2JqZWN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBjaHVuay4KLSAgICAgQnV0IHRoZXJlIGNhbiBiZSBhbiBlbXB0eSBvYmplY3QgYXQgdGhhdCBhZGRyZXNzCi0gICAgIGF0IHRoZSBlbmQgb2YgYW5vdGhlciBjaHVuay4gICovCi0gIHdoaWxlIChscCAhPSAwICYmICgoUE9JTlRFUikgbHAgPj0gb2JqIHx8IChQT0lOVEVSKSAobHApLT5saW1pdCA8IG9iaikpCi0gICAgewotICAgICAgcGxwID0gbHAtPnByZXY7Ci0gICAgICBDQUxMX0ZSRUVGVU4gKGgsIGxwKTsKLSAgICAgIGxwID0gcGxwOwotICAgICAgLyogSWYgd2Ugc3dpdGNoIGNodW5rcywgd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIHRoZSBuZXcgY3VycmVudAotCSBjaHVuayBjb250YWlucyBhbiBlbXB0eSBvYmplY3QsIHNvIGFzc3VtZSB0aGF0IGl0IG1heS4gICovCi0gICAgICBoLT5tYXliZV9lbXB0eV9vYmplY3QgPSAxOwotICAgIH0KLSAgaWYgKGxwKQotICAgIHsKLSAgICAgIGgtPm9iamVjdF9iYXNlID0gaC0+bmV4dF9mcmVlID0gKGNoYXIgKikgKG9iaik7Ci0gICAgICBoLT5jaHVua19saW1pdCA9IGxwLT5saW1pdDsKLSAgICAgIGgtPmNodW5rID0gbHA7Ci0gICAgfQotICBlbHNlIGlmIChvYmogIT0gMCkKLSAgICAvKiBvYmogaXMgbm90IGluIGFueSBvZiB0aGUgY2h1bmtzISAqLwotICAgIGFib3J0ICgpOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZnJvbSBBTlNJIGNvZGUuICAqLwotCi12b2lkCi1vYnN0YWNrX2ZyZWUgKGgsIG9iaikKLSAgICAgc3RydWN0IG9ic3RhY2sgKmg7Ci0gICAgIFBPSU5URVIgb2JqOwotewotICByZWdpc3RlciBzdHJ1Y3QgX29ic3RhY2tfY2h1bmsgKmxwOwkvKiBiZWxvdyBhZGRyIG9mIGFueSBvYmplY3RzIGluIHRoaXMgY2h1bmsgKi8KLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rICpwbHA7CS8qIHBvaW50IHRvIHByZXZpb3VzIGNodW5rIGlmIGFueSAqLwotCi0gIGxwID0gaC0+Y2h1bms7Ci0gIC8qIFdlIHVzZSA+PSBiZWNhdXNlIHRoZXJlIGNhbm5vdCBiZSBhbiBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNodW5rLgotICAgICBCdXQgdGhlcmUgY2FuIGJlIGFuIGVtcHR5IG9iamVjdCBhdCB0aGF0IGFkZHJlc3MKLSAgICAgYXQgdGhlIGVuZCBvZiBhbm90aGVyIGNodW5rLiAgKi8KLSAgd2hpbGUgKGxwICE9IDAgJiYgKChQT0lOVEVSKSBscCA+PSBvYmogfHwgKFBPSU5URVIpIChscCktPmxpbWl0IDwgb2JqKSkKLSAgICB7Ci0gICAgICBwbHAgPSBscC0+cHJldjsKLSAgICAgIENBTExfRlJFRUZVTiAoaCwgbHApOwotICAgICAgbHAgPSBwbHA7Ci0gICAgICAvKiBJZiB3ZSBzd2l0Y2ggY2h1bmtzLCB3ZSBjYW4ndCB0ZWxsIHdoZXRoZXIgdGhlIG5ldyBjdXJyZW50Ci0JIGNodW5rIGNvbnRhaW5zIGFuIGVtcHR5IG9iamVjdCwgc28gYXNzdW1lIHRoYXQgaXQgbWF5LiAgKi8KLSAgICAgIGgtPm1heWJlX2VtcHR5X29iamVjdCA9IDE7Ci0gICAgfQotICBpZiAobHApCi0gICAgewotICAgICAgaC0+b2JqZWN0X2Jhc2UgPSBoLT5uZXh0X2ZyZWUgPSAoY2hhciAqKSAob2JqKTsKLSAgICAgIGgtPmNodW5rX2xpbWl0ID0gbHAtPmxpbWl0OwotICAgICAgaC0+Y2h1bmsgPSBscDsKLSAgICB9Ci0gIGVsc2UgaWYgKG9iaiAhPSAwKQotICAgIC8qIG9iaiBpcyBub3QgaW4gYW55IG9mIHRoZSBjaHVua3MhICovCi0gICAgYWJvcnQgKCk7Ci19Ci0MCi1pbnQKLV9vYnN0YWNrX21lbW9yeV91c2VkIChoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqaDsKLXsKLSAgcmVnaXN0ZXIgc3RydWN0IF9vYnN0YWNrX2NodW5rKiBscDsKLSAgcmVnaXN0ZXIgaW50IG5ieXRlcyA9IDA7Ci0KLSAgZm9yIChscCA9IGgtPmNodW5rOyBscCAhPSAwOyBscCA9IGxwLT5wcmV2KQotICAgIHsKLSAgICAgIG5ieXRlcyArPSBscC0+bGltaXQgLSAoY2hhciAqKSBscDsKLSAgICB9Ci0gIHJldHVybiBuYnl0ZXM7Ci19Ci0MCi0vKiBEZWZpbmUgdGhlIGVycm9yIGhhbmRsZXIuICAqLwotI2lmbmRlZiBfCi0jIGlmZGVmIEhBVkVfTElCSU5UTF9ICi0jICBpbmNsdWRlIDxsaWJpbnRsLmg+Ci0jICBpZm5kZWYgXwotIyAgIGRlZmluZSBfKFN0cikgZ2V0dGV4dCAoU3RyKQotIyAgZW5kaWYKLSMgZWxzZQotIyAgZGVmaW5lIF8oU3RyKSAoU3RyKQotIyBlbmRpZgotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1wcmludF9hbmRfYWJvcnQgKCkKLXsKLSAgZnB1dHMgKF8oIm1lbW9yeSBleGhhdXN0ZWRcbiIpLCBzdGRlcnIpOwotICBleGl0IChvYnN0YWNrX2V4aXRfZmFpbHVyZSk7Ci19Ci0MCi0jaWYgMAotLyogVGhlc2UgYXJlIG5vdyB0dXJuZWQgb2ZmIGJlY2F1c2UgdGhlIGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlIGl0Ci0gICBhbmQgaXQgdXNlcyBiY29weSB2aWEgb2JzdGFja19ncm93LCB3aGljaCBjYXVzZXMgdHJvdWJsZSBvbiBzeXNWLiAgKi8KLQotLyogTm93IGRlZmluZSB0aGUgZnVuY3Rpb25hbCB2ZXJzaW9ucyBvZiB0aGUgb2JzdGFjayBtYWNyb3MuCi0gICBEZWZpbmUgdGhlbSB0byBzaW1wbHkgdXNlIHRoZSBjb3JyZXNwb25kaW5nIG1hY3JvcyB0byBkbyB0aGUgam9iLiAgKi8KLQotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotLyogVGhlc2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMgZG8gbm90IHdvcmsgd2l0aCBub24tQU5TSSBwcmVwcm9jZXNzb3JzOwotICAgdGhleSB3b24ndCBwYXNzIHRocm91Z2ggdGhlIG1hY3JvIG5hbWVzIGluIHBhcmVudGhlc2VzLiAgKi8KLQotLyogVGhlIGZ1bmN0aW9uIG5hbWVzIGFwcGVhciBpbiBwYXJlbnRoZXNlcyBpbiBvcmRlciB0byBwcmV2ZW50Ci0gICB0aGUgbWFjcm8tZGVmaW5pdGlvbnMgb2YgdGhlIG5hbWVzIGZyb20gYmVpbmcgZXhwYW5kZWQgdGhlcmUuICAqLwotCi1QT0lOVEVSIChvYnN0YWNrX2Jhc2UpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfYmFzZSAob2JzdGFjayk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfbmV4dF9mcmVlKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX25leHRfZnJlZSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19vYmplY3Rfc2l6ZSkgKG9ic3RhY2spCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotewotICByZXR1cm4gb2JzdGFja19vYmplY3Rfc2l6ZSAob2JzdGFjayk7Ci19Ci0KLWludCAob2JzdGFja19yb29tKSAob2JzdGFjaykKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci17Ci0gIHJldHVybiBvYnN0YWNrX3Jvb20gKG9ic3RhY2spOwotfQotCi1pbnQgKG9ic3RhY2tfbWFrZV9yb29tKSAob2JzdGFjaywgbGVuZ3RoKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfbWFrZV9yb29tIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrX2dyb3cpIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfZ3JvdyAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotdm9pZCAob2JzdGFja19ncm93MCkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIFBPSU5URVIgcG9pbnRlcjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgb2JzdGFja19ncm93MCAob2JzdGFjaywgcG9pbnRlciwgbGVuZ3RoKTsKLX0KLQotdm9pZCAob2JzdGFja18xZ3JvdykgKG9ic3RhY2ssIGNoYXJhY3RlcikKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBjaGFyYWN0ZXI7Ci17Ci0gIG9ic3RhY2tfMWdyb3cgKG9ic3RhY2ssIGNoYXJhY3Rlcik7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfYmxhbmspIChvYnN0YWNrLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgbGVuZ3RoOwotewotICBvYnN0YWNrX2JsYW5rIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi12b2lkIChvYnN0YWNrXzFncm93X2Zhc3QpIChvYnN0YWNrLCBjaGFyYWN0ZXIpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBpbnQgY2hhcmFjdGVyOwotewotICBvYnN0YWNrXzFncm93X2Zhc3QgKG9ic3RhY2ssIGNoYXJhY3Rlcik7Ci19Ci0KLXZvaWQgKG9ic3RhY2tfYmxhbmtfZmFzdCkgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIG9ic3RhY2tfYmxhbmtfZmFzdCAob2JzdGFjaywgbGVuZ3RoKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19maW5pc2gpIChvYnN0YWNrKQotICAgICBzdHJ1Y3Qgb2JzdGFjayAqb2JzdGFjazsKLXsKLSAgcmV0dXJuIG9ic3RhY2tfZmluaXNoIChvYnN0YWNrKTsKLX0KLQotUE9JTlRFUiAob2JzdGFja19hbGxvYykgKG9ic3RhY2ssIGxlbmd0aCkKLSAgICAgc3RydWN0IG9ic3RhY2sgKm9ic3RhY2s7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2FsbG9jIChvYnN0YWNrLCBsZW5ndGgpOwotfQotCi1QT0lOVEVSIChvYnN0YWNrX2NvcHkpIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2NvcHkgKG9ic3RhY2ssIHBvaW50ZXIsIGxlbmd0aCk7Ci19Ci0KLVBPSU5URVIgKG9ic3RhY2tfY29weTApIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpCi0gICAgIHN0cnVjdCBvYnN0YWNrICpvYnN0YWNrOwotICAgICBQT0lOVEVSIHBvaW50ZXI7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHJldHVybiBvYnN0YWNrX2NvcHkwIChvYnN0YWNrLCBwb2ludGVyLCBsZW5ndGgpOwotfQotCi0jZW5kaWYgLyogX19TVERDX18gKi8KLQotI2VuZGlmIC8qIDAgKi8KLQotI2VuZGlmCS8qICFFTElERV9DT0RFICovCmRpZmYgLS1naXQgYS9saWJpYmVydHkvcGV4ZWN1dGUuYyBiL2xpYmliZXJ0eS9wZXhlY3V0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGE5N2RlLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9wZXhlY3V0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM4ICswLDAgQEAKLS8qIFV0aWxpdGllcyB0byBleGVjdXRlIGEgcHJvZ3JhbSBpbiBhIHN1YnByb2Nlc3MgKHBvc3NpYmx5IGxpbmtlZCBieSBwaXBlcwotICAgd2l0aCBvdGhlciBzdWJwcm9jZXNzZXMpLCBhbmQgd2FpdCBmb3IgaXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAotd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiBUaGlzIGZpbGUgZXhwb3J0cyB0d28gZnVuY3Rpb25zOiBwZXhlY3V0ZSBhbmQgcHdhaXQuICAqLwotCi0vKiBUaGlzIGZpbGUgbGl2ZXMgaW4gYXQgbGVhc3QgdHdvIHBsYWNlczogbGliaWJlcnR5IGFuZCBnY2MuCi0gICBEb24ndCBjaGFuZ2Ugb25lIHdpdGhvdXQgdGhlIG90aGVyLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmZGVmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2RlZmluZSBJU1NQQUNFICh4KSBpc3NwYWNlKHgpCi0jaWZkZWYgSEFWRV9TWVNfV0FJVF9ICi0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNlbmRpZgotCi0jaWZkZWYgdmZvcmsgLyogQXV0b2NvbmYgbWF5IGRlZmluZSB0aGlzIHRvIGZvcmsgZm9yIHVzLiAqLwotIyBkZWZpbmUgVkZPUktfU1RSSU5HICJmb3JrIgotI2Vsc2UKLSMgZGVmaW5lIFZGT1JLX1NUUklORyAidmZvcmsiCi0jZW5kaWYKLSNpZmRlZiBIQVZFX1ZGT1JLX0gKLSNpbmNsdWRlIDx2Zm9yay5oPgotI2VuZGlmCi0jaWZkZWYgVk1TCi0jZGVmaW5lIHZmb3JrKCkgKGRlY2MkJGFsbG9jX3Zmb3JrX2Jsb2NrcygpID49IDAgPyBcCi0gICAgICAgICAgICAgICBsaWIkZ2V0X2N1cnJlbnRfaW52b19jb250ZXh0KGRlY2MkJGdldF92Zm9ya19qbXBidWYoKSkgOiAtMSkKLSNlbmRpZiAvKiBWTVMgKi8KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaWYgIWRlZmluZWQgKF9fQ1lHV0lOX18pICYmIGRlZmluZWQgKF9fQ1lHV0lOMzJfXykKLSNkZWZpbmUgX19DWUdXSU5fXyAxCi0jZW5kaWYKLQotLyogc3RkaW4gZmlsZSBudW1iZXIuICAqLwotI2RlZmluZSBTVERJTl9GSUxFX05PIDAKLQotLyogc3Rkb3V0IGZpbGUgbnVtYmVyLiAgKi8KLSNkZWZpbmUgU1RET1VUX0ZJTEVfTk8gMQotCi0vKiB2YWx1ZSBvZiBgcGlwZSc6IHBvcnQgaW5kZXggZm9yIHJlYWRpbmcuICAqLwotI2RlZmluZSBSRUFEX1BPUlQgMAotCi0vKiB2YWx1ZSBvZiBgcGlwZSc6IHBvcnQgaW5kZXggZm9yIHdyaXRpbmcuICAqLwotI2RlZmluZSBXUklURV9QT1JUIDEKLQotc3RhdGljIGNoYXIgKmluc3RhbGxfZXJyb3JfbXNnID0gImluc3RhbGxhdGlvbiBwcm9ibGVtLCBjYW5ub3QgZXhlYyBgJXMnIjsKLQotLyogcGV4ZWN1dGU6IGV4ZWN1dGUgYSBwcm9ncmFtLgotCi0gICBQUk9HUkFNIGFuZCBBUkdWIGFyZSB0aGUgYXJndW1lbnRzIHRvIGV4ZWN2L2V4ZWN2cC4KLQotICAgVEhJU19QTkFNRSBpcyBuYW1lIG9mIHRoZSBjYWxsaW5nIHByb2dyYW0gKGkuZS4gYXJndlswXSkuCi0KLSAgIFRFTVBfQkFTRSBpcyB0aGUgcGF0aCBuYW1lLCBzYW5zIHN1ZmZpeCwgb2YgYSB0ZW1wb3JhcnkgZmlsZSB0byB1c2UKLSAgIGlmIG5lZWRlZC4gIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgbmVlZGVkIGZvciBNU0RPUyBwb3J0cyB0aGF0IGRvbid0IHVzZQotICAgR08zMiAoZG8gYW55IHN0aWxsIGV4aXN0PykuICBQb3J0cyB0aGF0IGRvbid0IG5lZWQgaXQgY2FuIHBhc3MgTlVMTC4KLQotICAgKEZMQUdTICYgUEVYRUNVVEVfU0VBUkNIKSBpcyBub24temVybyBpZiAkUEFUSCBzaG91bGQgYmUgc2VhcmNoZWQKLSAgICg/Pz8gSXQncyBub3QgY2xlYXIgdGhhdCBHQ0MgcGFzc2VzIHRoaXMgZmxhZyBjb3JyZWN0bHkpLgotICAgKEZMQUdTICYgUEVYRUNVVEVfRklSU1QpIGlzIG5vbnplcm8gZm9yIHRoZSBmaXJzdCBwcm9jZXNzIGluIGNoYWluLgotICAgKEZMQUdTICYgUEVYRUNVVEVfRklSU1QpIGlzIG5vbnplcm8gZm9yIHRoZSBsYXN0IHByb2Nlc3MgaW4gY2hhaW4uCi0gICBGSVJTVF9MQVNUIGNvdWxkIGJlIHNpbXBsaWZpZWQgdG8gb25seSBtYXJrIHRoZSBsYXN0IG9mIGEgY2hhaW4gb2YgcHJvY2Vzc2VzCi0gICBidXQgdGhhdCByZXF1aXJlcyB0aGUgY2FsbGVyIHRvIGFsd2F5cyBtYXJrIHRoZSBsYXN0IG9uZSAoYW5kIG5vdCBnaXZlIHVwCi0gICBlYXJseSBpZiBzb21lIGVycm9yIG9jY3VycykuICBJdCdzIG1vcmUgcm9idXN0IHRvIHJlcXVpcmUgdGhlIGNhbGxlciB0bwotICAgbWFyayBib3RoIGVuZHMgb2YgdGhlIGNoYWluLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBwaWQgb24gc3lzdGVtcyBsaWtlIFVuaXggd2hlcmUgd2UgZm9yay9leGVjIGFuZCBvbiBzeXN0ZW1zCi0gICBsaWtlIFdJTjMyIGFuZCBPUzIgd2hlcmUgd2UgdXNlIHNwYXduLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byB3YWl0IGZvcgotICAgdGhlIGNoaWxkLgotCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBXRVhJVFNUQVRVUyBvbiBzeXN0ZW1zIGxpa2UgTVNET1Mgd2hlcmUgd2Ugc3Bhd24gYW5kIHdhaXQKLSAgIGZvciB0aGUgY2hpbGQgaGVyZS4KLQotICAgVXBvbiBmYWlsdXJlLCBFUlJNU0dfRk1UIGFuZCBFUlJNU0dfQVJHIGFyZSBzZXQgdG8gdGhlIHRleHQgb2YgdGhlIGVycm9yCi0gICBtZXNzYWdlIHdpdGggYW4gb3B0aW9uYWwgYXJndW1lbnQgKGlmIG5vdCBuZWVkZWQsIEVSUk1TR19BUkcgaXMgc2V0IHRvCi0gICBOVUxMKSwgYW5kIC0xIGlzIHJldHVybmVkLiAgYGVycm5vJyBpcyBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciB0byB1c2UuCi0KLSAgIHB3YWl0OiBjb3ZlciBmdW5jdGlvbiBmb3Igd2FpdC4KLQotICAgUElEIGlzIHRoZSBwcm9jZXNzIGlkIG9mIHRoZSB0YXNrIHRvIHdhaXQgZm9yLgotICAgU1RBVFVTIGlzIHRoZSBgc3RhdHVzJyBhcmd1bWVudCB0byB3YWl0LgotICAgRkxBR1MgaXMgY3VycmVudGx5IHVudXNlZCAoYWxsb3dzIGZ1dHVyZSBlbmhhbmNlbWVudCB3aXRob3V0IGJyZWFraW5nCi0gICB1cHdhcmQgY29tcGF0aWJpbGl0eSkuICBQYXNzIDAgZm9yIG5vdy4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgcGlkIG9mIHRoZSBjaGlsZCByZWFwZWQsCi0gICBvciAtMSBmb3IgZmFpbHVyZSAoZXJybm8gc2F5cyB3aHkpLgotCi0gICBPbiBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCB3YWl0aW5nIGZvciBhIHBhcnRpY3VsYXIgY2hpbGQsIFBJRCBpcwotICAgaWdub3JlZC4gIE9uIHN5c3RlbXMgbGlrZSBNU0RPUyB0aGF0IGRvbid0IHJlYWxseSBtdWx0aXRhc2sgcHdhaXQKLSAgIGlzIGp1c3QgYSBtZWNoYW5pc20gdG8gcHJvdmlkZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIGZvciB0aGUgY2FsbGVyLgotCi0gICBwZmluaXNoOiBmaW5pc2ggZ2VuZXJhdGlvbiBvZiBzY3JpcHQKLQotICAgcGZpbmlzaCBpcyBuZWNlc3NhcnkgZm9yIHN5c3RlbXMgbGlrZSBNUFcgd2hlcmUgYSBzY3JpcHQgaXMgZ2VuZXJhdGVkIHRoYXQKLSAgIHJ1bnMgdGhlIHJlcXVlc3RlZCBwcm9ncmFtcy4KLSovCi0KLSNpZmRlZiBfX01TRE9TX18KLQotLyogTVNET1MgZG9lc24ndCBtdWx0aXRhc2ssIGJ1dCBmb3IgdGhlIHNha2Ugb2YgYSBjb25zaXN0ZW50IGludGVyZmFjZQotICAgdGhlIGNvZGUgYmVoYXZlcyBsaWtlIGl0IGRvZXMuICBwZXhlY3V0ZSBydW5zIHRoZSBwcm9ncmFtLCB0dWNrcyB0aGUKLSAgIGV4aXQgY29kZSBhd2F5LCBhbmQgcmV0dXJucyBhICJwaWQiLiAgcHdhaXQgbXVzdCBiZSBjYWxsZWQgdG8gZmV0Y2ggdGhlCi0gICBleGl0IGNvZGUuICAqLwotCi0jaW5jbHVkZSA8cHJvY2Vzcy5oPgotCi0vKiBGb3IgY29tbXVuaWNhdGluZyBpbmZvcm1hdGlvbiBmcm9tIHBleGVjdXRlIHRvIHB3YWl0LiAgKi8KLXN0YXRpYyBpbnQgbGFzdF9waWQgPSAwOwotc3RhdGljIGludCBsYXN0X3N0YXR1cyA9IDA7Ci1zdGF0aWMgaW50IGxhc3RfcmVhcGVkID0gMDsKLQotaW50Ci1wZXhlY3V0ZSAocHJvZ3JhbSwgYXJndiwgdGhpc19wbmFtZSwgdGVtcF9iYXNlLCBlcnJtc2dfZm10LCBlcnJtc2dfYXJnLCBmbGFncykKLSAgICAgY29uc3QgY2hhciAqcHJvZ3JhbTsKLSAgICAgY2hhciAqIGNvbnN0ICphcmd2OwotICAgICBjb25zdCBjaGFyICp0aGlzX3BuYW1lOwotICAgICBjb25zdCBjaGFyICp0ZW1wX2Jhc2U7Ci0gICAgIGNoYXIgKiplcnJtc2dfZm10LCAqKmVycm1zZ19hcmc7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgaW50IHJjOwotCi0gIGxhc3RfcGlkKys7Ci0gIGlmIChsYXN0X3BpZCA8IDApCi0gICAgbGFzdF9waWQgPSAxOwotCi0gIGlmICgoZmxhZ3MgJiBQRVhFQ1VURV9PTkUpICE9IFBFWEVDVVRFX09ORSkKLSAgICBhYm9ydCAoKTsKLQotI2lmZGVmIF9fR08zMl9fCi0gIC8qID8/PyBXaGF0IGFyZSB0aGUgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBmcm9tIHNwYXdudj8gICovCi0gIHJjID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gc3Bhd252cCA6IHNwYXdudikgKDEsIHByb2dyYW0sIGFyZ3YpOwotI2Vsc2UKLSAgY2hhciAqc2NtZCwgKnJmOwotICBGSUxFICphcmdmaWxlOwotICBpbnQgaSwgZWwgPSBmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/IDQgOiAwOwotCi0gIHNjbWQgPSAoY2hhciAqKSB4bWFsbG9jIChzdHJsZW4gKHByb2dyYW0pICsgc3RybGVuICh0ZW1wX2Jhc2UpICsgNiArIGVsKTsKLSAgcmYgPSBzY21kICsgc3RybGVuKHByb2dyYW0pICsgMiArIGVsOwotICBzcHJpbnRmIChzY21kLCAiJXMlcyBAJXMuZ3AiLCBwcm9ncmFtLAotCSAgIChmbGFncyAmIFBFWEVDVVRFX1NFQVJDSCA/ICIuZXhlIiA6ICIiKSwgdGVtcF9iYXNlKTsKLSAgYXJnZmlsZSA9IGZvcGVuIChyZiwgInciKTsKLSAgaWYgKGFyZ2ZpbGUgPT0gMCkKLSAgICB7Ci0gICAgICBpbnQgZXJybm9fc2F2ZSA9IGVycm5vOwotICAgICAgZnJlZSAoc2NtZCk7Ci0gICAgICBlcnJubyA9IGVycm5vX3NhdmU7Ci0gICAgICAqZXJybXNnX2ZtdCA9ICJjYW5ub3Qgb3BlbiBgJXMuZ3AnIjsKLSAgICAgICplcnJtc2dfYXJnID0gdGVtcF9iYXNlOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBmb3IgKGk9MTsgYXJndltpXTsgaSsrKQotICAgIHsKLSAgICAgIGNoYXIgKmNwOwotICAgICAgZm9yIChjcCA9IGFyZ3ZbaV07ICpjcDsgY3ArKykKLQl7Ci0JICBpZiAoKmNwID09ICciJyB8fCAqY3AgPT0gJ1wnJyB8fCAqY3AgPT0gJ1xcJyB8fCBJU1NQQUNFICgqY3ApKQotCSAgICBmcHV0YyAoJ1xcJywgYXJnZmlsZSk7Ci0JICBmcHV0YyAoKmNwLCBhcmdmaWxlKTsKLQl9Ci0gICAgICBmcHV0YyAoJ1xuJywgYXJnZmlsZSk7Ci0gICAgfQotICBmY2xvc2UgKGFyZ2ZpbGUpOwotCi0gIHJjID0gc3lzdGVtIChzY21kKTsKLQotICB7Ci0gICAgaW50IGVycm5vX3NhdmUgPSBlcnJubzsKLSAgICByZW1vdmUgKHJmKTsKLSAgICBmcmVlIChzY21kKTsKLSAgICBlcnJubyA9IGVycm5vX3NhdmU7Ci0gIH0KLSNlbmRpZgotCi0gIGlmIChyYyA9PSAtMSkKLSAgICB7Ci0gICAgICAqZXJybXNnX2ZtdCA9IGluc3RhbGxfZXJyb3JfbXNnOwotICAgICAgKmVycm1zZ19hcmcgPSBwcm9ncmFtOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiBUdWNrIHRoZSBzdGF0dXMgYXdheSBmb3IgcHdhaXQsIGFuZCByZXR1cm4gYSAicGlkIi4gICovCi0gIGxhc3Rfc3RhdHVzID0gcmMgPDwgODsKLSAgcmV0dXJuIGxhc3RfcGlkOwotfQotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIC8qIE9uIE1TRE9TIGVhY2ggcGV4ZWN1dGUgbXVzdCBiZSBmb2xsb3dlZCBieSBpdCdzIGFzc29jaWF0ZWQgcHdhaXQuICAqLwotICBpZiAocGlkICE9IGxhc3RfcGlkCi0gICAgICAvKiBDYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGNoaWxkPyAgKi8KLSAgICAgIHx8IHBpZCA9PSBsYXN0X3JlYXBlZCkKLSAgICB7Ci0gICAgICAvKiA/Pz8gRUNISUxEIHdvdWxkIGJlIGEgYmV0dGVyIGNob2ljZS4gIENhbiB3ZSB1c2UgaXQgaGVyZT8gICovCi0gICAgICBlcnJubyA9IEVJTlZBTDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgotICAgICBOZWVkZWQ/ICAqLwotICAqc3RhdHVzID0gbGFzdF9zdGF0dXM7Ci0gIGxhc3RfcmVhcGVkID0gbGFzdF9waWQ7Ci0gIHJldHVybiBsYXN0X3BpZDsKLX0KLQotI2VuZGlmIC8qIE1TRE9TICovCi0KLSNpZiBkZWZpbmVkIChfV0lOMzIpICYmICEgZGVmaW5lZCAoX19VV0lOX18pCi0KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0KLSNpZmRlZiBfX0NZR1dJTl9fCi0KLSNkZWZpbmUgZml4X2FyZ3YoYXJndmVjKSAoYXJndmVjKQotCi1leHRlcm4gaW50IF9zcGF3bnYgKCk7Ci1leHRlcm4gaW50IF9zcGF3bnZwICgpOwotCi0jZWxzZSAvKiAhIF9fQ1lHV0lOX18gKi8KLQotLyogVGhpcyBpcyBhIGtsdWRnZSB0byBnZXQgYXJvdW5kIHRoZSBNaWNyb3NvZnQgQyBzcGF3biBmdW5jdGlvbnMnIHByb3BlbnNpdHkKLSAgIHRvIHJlbW92ZSB0aGUgb3V0ZXJtb3N0IHNldCBvZiBkb3VibGUgcXVvdGVzIGZyb20gYWxsIGFyZ3VtZW50cy4gICovCi0KLWNvbnN0IGNoYXIgKiBjb25zdCAqCi1maXhfYXJndiAoYXJndmVjKQotICAgICBjaGFyICoqYXJndmVjOwotewotICBpbnQgaTsKLQotICBmb3IgKGkgPSAxOyBhcmd2ZWNbaV0gIT0gMDsgaSsrKQotICAgIHsKLSAgICAgIGludCBsZW4sIGo7Ci0gICAgICBjaGFyICp0ZW1wLCAqbmV3dGVtcDsKLQotICAgICAgdGVtcCA9IGFyZ3ZlY1tpXTsKLSAgICAgIGxlbiA9IHN0cmxlbiAodGVtcCk7Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodGVtcFtqXSA9PSAnIicpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgPSB4bWFsbG9jIChsZW4gKyAyKTsKLSAgICAgICAgICAgICAgc3RybmNweSAobmV3dGVtcCwgdGVtcCwgaik7Ci0gICAgICAgICAgICAgIG5ld3RlbXAgW2pdID0gJ1xcJzsKLSAgICAgICAgICAgICAgc3RybmNweSAoJm5ld3RlbXAgW2orMV0sICZ0ZW1wIFtqXSwgbGVuLWopOwotICAgICAgICAgICAgICBuZXd0ZW1wIFtsZW4rMV0gPSAwOwotICAgICAgICAgICAgICB0ZW1wID0gbmV3dGVtcDsKLSAgICAgICAgICAgICAgbGVuKys7Ci0gICAgICAgICAgICAgIGorKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFyZ3ZlY1tpXSA9IHRlbXA7Ci0gICAgICB9Ci0KLSAgcmV0dXJuIChjb25zdCBjaGFyICogY29uc3QgKikgYXJndmVjOwotfQotI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLQotI2luY2x1ZGUgPGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLQotLyogbWluZ3czMiBoZWFkZXJzIG1heSBub3QgZGVmaW5lIHRoZSBmb2xsb3dpbmcuICAqLwotCi0jaWZuZGVmIF9QX1dBSVQKLSMgIGRlZmluZSBfUF9XQUlUCTAKLSMgIGRlZmluZSBfUF9OT1dBSVQJMQotIyAgZGVmaW5lIF9QX09WRVJMQVkJMgotIyAgZGVmaW5lIF9QX05PV0FJVE8JMwotIyAgZGVmaW5lIF9QX0RFVEFDSAk0Ci0KLSMgIGRlZmluZSBXQUlUX0NISUxECTAKLSMgIGRlZmluZSBXQUlUX0dSQU5EQ0hJTEQJMQotI2VuZGlmCi0KLS8qIFdpbjMyIHN1cHBvcnRzIHBpcGVzICovCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgcGlkOwotICBpbnQgcGRlc1syXSwgb3JnX3N0ZGluLCBvcmdfc3Rkb3V0OwotICBpbnQgaW5wdXRfZGVzYywgb3V0cHV0X2Rlc2M7Ci0gIGludCByZXRyaWVzLCBzbGVlcF9pbnRlcnZhbDsKLQotICAvKiBQaXBlIHdhaXRpbmcgZnJvbSBsYXN0IHByb2Nlc3MsIHRvIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRoZSBuZXh0IG9uZS4KLSAgICAgVmFsdWUgaXMgU1RESU5fRklMRV9OTyBpZiBubyBwaXBlIGlzIHdhaXRpbmcKLSAgICAgKGkuZS4gdGhlIG5leHQgY29tbWFuZCBpcyB0aGUgZmlyc3Qgb2YgYSBncm91cCkuICAqLwotICBzdGF0aWMgaW50IGxhc3RfcGlwZV9pbnB1dDsKLQotICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBwcm9jZXNzLCBpbml0aWFsaXplLiAgKi8KLSAgaWYgKGZsYWdzICYgUEVYRUNVVEVfRklSU1QpCi0gICAgbGFzdF9waXBlX2lucHV0ID0gU1RESU5fRklMRV9OTzsKLQotICBpbnB1dF9kZXNjID0gbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXNuJ3QgdGhlIGxhc3QgcHJvY2VzcywgbWFrZSBhIHBpcGUgZm9yIGl0cyBvdXRwdXQsCi0gICAgIGFuZCByZWNvcmQgaXQgYXMgd2FpdGluZyB0byBiZSB0aGUgaW5wdXQgdG8gdGhlIG5leHQgcHJvY2Vzcy4gICovCi0gIGlmICghIChmbGFncyAmIFBFWEVDVVRFX0xBU1QpKQotICAgIHsKLSAgICAgIGlmIChfcGlwZSAocGRlcywgMjU2LCBPX0JJTkFSWSkgPCAwKQotCXsKLQkgICplcnJtc2dfZm10ID0gInBpcGUiOwotCSAgKmVycm1zZ19hcmcgPSBOVUxMOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIG91dHB1dF9kZXNjID0gcGRlc1tXUklURV9QT1JUXTsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IHBkZXNbUkVBRF9QT1JUXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBMYXN0IHByb2Nlc3MuICAqLwotICAgICAgb3V0cHV0X2Rlc2MgPSBTVERPVVRfRklMRV9OTzsKLSAgICAgIGxhc3RfcGlwZV9pbnB1dCA9IFNURElOX0ZJTEVfTk87Ci0gICAgfQotCi0gIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0gICAgewotICAgICAgb3JnX3N0ZGluID0gZHVwIChTVERJTl9GSUxFX05PKTsKLSAgICAgIGR1cDIgKGlucHV0X2Rlc2MsIFNURElOX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKGlucHV0X2Rlc2MpOyAKLSAgICB9Ci0KLSAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotICAgIHsKLSAgICAgIG9yZ19zdGRvdXQgPSBkdXAgKFNURE9VVF9GSUxFX05PKTsKLSAgICAgIGR1cDIgKG91dHB1dF9kZXNjLCBTVERPVVRfRklMRV9OTyk7Ci0gICAgICBjbG9zZSAob3V0cHV0X2Rlc2MpOwotICAgIH0KLQotICBwaWQgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBfc3Bhd252cCA6IF9zcGF3bnYpCi0gICAgKF9QX05PV0FJVCwgcHJvZ3JhbSwgZml4X2FyZ3YoYXJndikpOwotCi0gIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0gICAgewotICAgICAgZHVwMiAob3JnX3N0ZGluLCBTVERJTl9GSUxFX05PKTsKLSAgICAgIGNsb3NlIChvcmdfc3RkaW4pOwotICAgIH0KLQotICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0gICAgewotICAgICAgZHVwMiAob3JnX3N0ZG91dCwgU1RET1VUX0ZJTEVfTk8pOwotICAgICAgY2xvc2UgKG9yZ19zdGRvdXQpOwotICAgIH0KLQotICBpZiAocGlkID09IC0xKQotICAgIHsKLSAgICAgICplcnJtc2dfZm10ID0gaW5zdGFsbF9lcnJvcl9tc2c7Ci0gICAgICAqZXJybXNnX2FyZyA9IHByb2dyYW07Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwaWQ7Ci19Ci0KLS8qIE1TIENSVERMTCBkb2Vzbid0IHJldHVybiBlbm91Z2ggaW5mb3JtYXRpb24gaW4gc3RhdHVzIHRvIGRlY2lkZSBpZiB0aGUKLSAgIGNoaWxkIGV4aXRlZCBkdWUgdG8gYSBzaWduYWwgb3Igbm90LCByYXRoZXIgaXQgc2ltcGx5IHJldHVybnMgYW4KLSAgIGludGVnZXIgd2l0aCB0aGUgZXhpdCBjb2RlIG9mIHRoZSBjaGlsZDsgZWcuLCBpZiB0aGUgY2hpbGQgZXhpdGVkIHdpdGggCi0gICBhbiBhYm9ydCgpIGNhbGwgYW5kIGRpZG4ndCBoYXZlIGEgaGFuZGxlciBmb3IgU0lHQUJSVCwgaXQgc2ltcGx5IHJldHVybnMKLSAgIHdpdGggc3RhdHVzID0gMy4gV2UgZml4IHRoZSBzdGF0dXMgY29kZSB0byBjb25mb3JtIHRvIHRoZSB1c3VhbCBXSUYqCi0gICBtYWNyb3MuIE5vdGUgdGhhdCBXSUZTSUdOQUxFRCB3aWxsIG5ldmVyIGJlIHRydWUgdW5kZXIgQ1JURExMLiAqLwotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0jaWZkZWYgX19DWUdXSU5fXwotICByZXR1cm4gd2FpdCAoc3RhdHVzKTsKLSNlbHNlCi0gIGludCB0ZXJtc3RhdDsKLQotICBwaWQgPSBfY3dhaXQgKCZ0ZXJtc3RhdCwgcGlkLCBXQUlUX0NISUxEKTsKLQotICAvKiA/Pz8gSGVyZSdzIGFuIG9wcG9ydHVuaXR5IHRvIGNhbm9uaWNhbGl6ZSB0aGUgdmFsdWVzIGluIFNUQVRVUy4KLSAgICAgTmVlZGVkPyAgKi8KLQotICAvKiBjd2FpdCByZXR1cm5zIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXQgY29kZSBpbiB0ZXJtc3RhdC4KLSAgICAgQSB2YWx1ZSBvZiAzIGluZGljYXRlcyB0aGF0IHRoZSBjaGlsZCBjYXVnaHQgYSBzaWduYWwsIGJ1dCBub3QKLSAgICAgd2hpY2ggb25lLiAgU2luY2Ugb25seSBTSUdBQlJULCBTSUdGUEUgYW5kIFNJR0lOVCBkbyBhbnl0aGluZywgd2UKLSAgICAgcmVwb3J0IFNJR0FCUlQuICAqLwotICBpZiAodGVybXN0YXQgPT0gMykKLSAgICAqc3RhdHVzID0gU0lHQUJSVDsKLSAgZWxzZQotICAgICpzdGF0dXMgPSAoKCh0ZXJtc3RhdCkgJiAweGZmKSA8PCA4KTsKLQotICByZXR1cm4gcGlkOwotI2VuZGlmIC8qIF9fQ1lHV0lOX18gKi8KLX0KLQotI2VuZGlmIC8qIF9XSU4zMiAmJiAhIF9fVVdJTl9fICovCi0KLSNpZmRlZiBPUzIKLQotLyogPz8/IERvZXMgT1MyIGhhdmUgcHJvY2Vzcy5oPyAgKi8KLWV4dGVybiBpbnQgc3Bhd252ICgpOwotZXh0ZXJuIGludCBzcGF3bnZwICgpOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgcGlkOwotCi0gIGlmICgoZmxhZ3MgJiBQRVhFQ1VURV9PTkUpICE9IFBFWEVDVVRFX09ORSkKLSAgICBhYm9ydCAoKTsKLSAgLyogPz8/IFByZXN1bWFibHkgMSA9PSBfUF9OT1dBSVQuICAqLwotICBwaWQgPSAoZmxhZ3MgJiBQRVhFQ1VURV9TRUFSQ0ggPyBzcGF3bnZwIDogc3Bhd252KSAoMSwgcHJvZ3JhbSwgYXJndik7Ci0gIGlmIChwaWQgPT0gLTEpCi0gICAgewotICAgICAgKmVycm1zZ19mbXQgPSBpbnN0YWxsX2Vycm9yX21zZzsKLSAgICAgICplcnJtc2dfYXJnID0gcHJvZ3JhbTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIHJldHVybiBwaWQ7Ci19Ci0KLWludAotcHdhaXQgKHBpZCwgc3RhdHVzLCBmbGFncykKLSAgICAgaW50IHBpZDsKLSAgICAgaW50ICpzdGF0dXM7Ci0gICAgIGludCBmbGFnczsKLXsKLSAgLyogPz8/IEhlcmUncyBhbiBvcHBvcnR1bml0eSB0byBjYW5vbmljYWxpemUgdGhlIHZhbHVlcyBpbiBTVEFUVVMuCi0gICAgIE5lZWRlZD8gICovCi0gIGludCBwaWQgPSB3YWl0IChzdGF0dXMpOwotICByZXR1cm4gcGlkOwotfQotCi0jZW5kaWYgLyogT1MyICovCi0KLSNpZmRlZiBNUFcKLQotLyogTVBXIHBleGVjdXRlIGRvZXNuJ3QgYWN0dWFsbHkgcnVuIGFueXRoaW5nOyBpbnN0ZWFkLCBpdCB3cml0ZXMgb3V0Ci0gICBzY3JpcHQgY29tbWFuZHMgdGhhdCwgd2hlbiBydW4sIHdpbGwgZG8gdGhlIGFjdHVhbCBleGVjdXRpbmcuCi0KLSAgIEZvciBleGFtcGxlLCBpbiBHQ0MncyBjYXNlLCBHQ0Mgd2lsbCB3cml0ZSBvdXQgc2V2ZXJhbCBzY3JpcHQgY29tbWFuZHM6Ci0KLSAgIGNwcCAuLi4KLSAgIGNjMSAuLi4KLSAgIGFzIC4uLgotICAgbGQgLi4uCi0KLSAgIGFuZCB0aGVuIGV4aXQuICBOb25lIG9mIHRoZSBhYm92ZSBwcm9ncmFtcyB3aWxsIGhhdmUgcnVuIHlldC4gIFRoZSB0YXNrCi0gICB0aGF0IGNhbGxlZCBHQ0Mgd2lsbCB0aGVuIGV4ZWN1dGUgdGhlIHNjcmlwdCBhbmQgY2F1c2UgY3BwLGV0Yy4gdG8gcnVuLgotICAgVGhlIGNhbGxlciBtdXN0IGludm9rZSBwZmluaXNoIGJlZm9yZSBjYWxsaW5nIGV4aXQuICBUaGlzIGFkZHMKLSAgIHRoZSBmaW5pc2hpbmcgdG91Y2hlcyB0byB0aGUgZ2VuZXJhdGVkIHNjcmlwdC4gICovCi0KLXN0YXRpYyBpbnQgZmlyc3RfdGltZSA9IDE7Ci0KLWludAotcGV4ZWN1dGUgKHByb2dyYW0sIGFyZ3YsIHRoaXNfcG5hbWUsIHRlbXBfYmFzZSwgZXJybXNnX2ZtdCwgZXJybXNnX2FyZywgZmxhZ3MpCi0gICAgIGNvbnN0IGNoYXIgKnByb2dyYW07Ci0gICAgIGNoYXIgKiBjb25zdCAqYXJndjsKLSAgICAgY29uc3QgY2hhciAqdGhpc19wbmFtZTsKLSAgICAgY29uc3QgY2hhciAqdGVtcF9iYXNlOwotICAgICBjaGFyICoqZXJybXNnX2ZtdCwgKiplcnJtc2dfYXJnOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIGNoYXIgdG1wcHJvZ3JhbVsyNTVdOwotICBjaGFyICpjcCwgKnRtcG5hbWU7Ci0gIGludCBpOwotCi0gIG1wd2lmeV9maWxlbmFtZSAocHJvZ3JhbSwgdG1wcHJvZ3JhbSk7Ci0gIGlmIChmaXJzdF90aW1lKQotICAgIHsKLSAgICAgIHByaW50ZiAoIlNldCBGYWlsZWQgMFxuIik7Ci0gICAgICBmaXJzdF90aW1lID0gMDsKLSAgICB9Ci0KLSAgZnB1dHMgKCJJZiB7RmFpbGVkfSA9PSAwXG4iLCBzdGRvdXQpOwotICAvKiBJZiBiZWluZyB2ZXJib3NlLCBvdXRwdXQgYSBjb3B5IG9mIHRoZSBjb21tYW5kLiAgSXQgc2hvdWxkIGJlCi0gICAgIGFjY3VyYXRlIGVub3VnaCBhbmQgZXNjYXBlZCBlbm91Z2ggdG8gYmUgImNsaWNrYWJsZSIuICAqLwotICBpZiAoZmxhZ3MgJiBQRVhFQ1VURV9WRVJCT1NFKQotICAgIHsKLSAgICAgIGZwdXRzICgiXHRFY2hvICIsIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLSAgICAgIGZwdXRzICh0bXBwcm9ncmFtLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotICAgICAgZm9yIChpPTE7IGFyZ3ZbaV07IGkrKykKLQl7Ci0JICBmcHV0YyAoJ1wnJywgc3Rkb3V0KTsKLQkgIC8qIFNlZSBpZiB3ZSBoYXZlIGFuIGFyZ3VtZW50IHRoYXQgbmVlZHMgZml4aW5nLiAgKi8KLQkgIGlmIChzdHJjaHIoYXJndltpXSwgJy8nKSkKLQkgICAgewotCSAgICAgIHRtcG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyNTYpOwotCSAgICAgIG1wd2lmeV9maWxlbmFtZSAoYXJndltpXSwgdG1wbmFtZSk7Ci0JICAgICAgYXJndltpXSA9IHRtcG5hbWU7Ci0JICAgIH0KLQkgIGZvciAoY3AgPSBhcmd2W2ldOyAqY3A7IGNwKyspCi0JICAgIHsKLQkgICAgICAvKiBXcml0ZSBhbiBPcHRpb24tZCBlc2NhcGUgY2hhciBpbiBmcm9udCBvZiBzcGVjaWFsIGNoYXJzLiAgKi8KLQkgICAgICBpZiAoc3RyY2hyKCInKyIsICpjcCkpCi0JCWZwdXRjICgnXDI2NicsIHN0ZG91dCk7Ci0JICAgICAgZnB1dGMgKCpjcCwgc3Rkb3V0KTsKLQkgICAgfQotCSAgZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0JICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotCX0KLSAgICAgIGZwdXRzICgiXG4iLCBzdGRvdXQpOwotICAgIH0KLSAgZnB1dHMgKCJcdCIsIHN0ZG91dCk7Ci0gIGZwdXRzICh0bXBwcm9ncmFtLCBzdGRvdXQpOwotICBmcHV0YyAoJyAnLCBzdGRvdXQpOwotCi0gIGZvciAoaT0xOyBhcmd2W2ldOyBpKyspCi0gICAgewotICAgICAgLyogU2VlIGlmIHdlIGhhdmUgYW4gYXJndW1lbnQgdGhhdCBuZWVkcyBmaXhpbmcuICAqLwotICAgICAgaWYgKHN0cmNocihhcmd2W2ldLCAnLycpKQotCXsKLQkgIHRtcG5hbWUgPSAoY2hhciAqKSB4bWFsbG9jICgyNTYpOwotCSAgbXB3aWZ5X2ZpbGVuYW1lIChhcmd2W2ldLCB0bXBuYW1lKTsKLQkgIGFyZ3ZbaV0gPSB0bXBuYW1lOwotCX0KLSAgICAgIGlmIChzdHJjaHIgKGFyZ3ZbaV0sICcgJykpCi0JZnB1dGMgKCdcJycsIHN0ZG91dCk7Ci0gICAgICBmb3IgKGNwID0gYXJndltpXTsgKmNwOyBjcCsrKQotCXsKLQkgIC8qIFdyaXRlIGFuIE9wdGlvbi1kIGVzY2FwZSBjaGFyIGluIGZyb250IG9mIHNwZWNpYWwgY2hhcnMuICAqLwotCSAgaWYgKHN0cmNocigiJysiLCAqY3ApKQotCSAgICBmcHV0YyAoJ1wyNjYnLCBzdGRvdXQpOwotCSAgZnB1dGMgKCpjcCwgc3Rkb3V0KTsKLQl9Ci0gICAgICBpZiAoc3RyY2hyIChhcmd2W2ldLCAnICcpKQotCWZwdXRjICgnXCcnLCBzdGRvdXQpOwotICAgICAgZnB1dGMgKCcgJywgc3Rkb3V0KTsKLSAgICB9Ci0KLSAgZnB1dHMgKCJcbiIsIHN0ZG91dCk7Ci0KLSAgLyogT3V0cHV0IGNvbW1hbmRzIHRoYXQgYXJyYW5nZSB0byBjbGVhbiB1cCBhbmQgZXhpdCBpZiBhIGZhaWx1cmUgb2NjdXJzLgotICAgICBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gY29sbGVjdCB0aGUgc3RhdHVzIGZyb20gdGhlIHByb2dyYW0gdGhhdCB3YXMKLSAgICAgcnVuLCByYXRoZXIgdGhhbiBzb21lIG90aGVyIHNjcmlwdCBjb21tYW5kLiAgQWxzbywgd2UgZG9uJ3QgZXhpdAotICAgICBpbW1lZGlhdGVseSwgc2luY2UgbmVjZXNzYXJ5IGNsZWFudXBzIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBzY3JpcHQuICAqLwotICBmcHV0cyAoIlx0U2V0IFRtcFN0YXR1cyB7U3RhdHVzfVxuIiwgc3Rkb3V0KTsKLSAgZnB1dHMgKCJcdElmIHtUbXBTdGF0dXN9ICE9IDBcbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiXHRcdFNldCBGYWlsZWQge1RtcFN0YXR1c31cbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiXHRFbmRcbiIsIHN0ZG91dCk7Ci0gIGZwdXRzICgiRW5kXG4iLCBzdGRvdXQpOwotCi0gIC8qIFdlJ3JlIGp1c3QgY29tcG9zaW5nIGEgc2NyaXB0LCBjYW4ndCBmYWlsIGhlcmUuICAqLwotICByZXR1cm4gMDsKLX0KLQotaW50Ci1wd2FpdCAocGlkLCBzdGF0dXMsIGZsYWdzKQotICAgICBpbnQgcGlkOwotICAgICBpbnQgKnN0YXR1czsKLSAgICAgaW50IGZsYWdzOwotewotICAqc3RhdHVzID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFdyaXRlIG91dCBjb21tYW5kcyB0aGF0IHdpbGwgZXhpdCB3aXRoIHRoZSBjb3JyZWN0IGVycm9yIGNvZGUKLSAgIGlmIHNvbWV0aGluZyBpbiB0aGUgc2NyaXB0IGZhaWxlZC4gICovCi0KLXZvaWQKLXBmaW5pc2ggKCkKLXsKLSAgcHJpbnRmICgiXHRFeGl0IFwie0ZhaWxlZH1cIlxuIik7Ci19Ci0KLSNlbmRpZiAvKiBNUFcgKi8KLQotLyogaW5jbHVkZSBmb3IgVW5peC1saWtlIGVudmlyb25tZW50cyBidXQgbm90IGZvciBEb3MtbGlrZSBlbnZpcm9ubWVudHMgKi8KLSNpZiAhIGRlZmluZWQgKF9fTVNET1NfXykgJiYgISBkZWZpbmVkIChPUzIpICYmICEgZGVmaW5lZCAoTVBXKSBcCi0gICAgJiYgISAoZGVmaW5lZCAoX1dJTjMyKSAmJiAhIGRlZmluZWQgKF9fVVdJTl9fKSkKLQotZXh0ZXJuIGludCBleGVjdiAoKTsKLWV4dGVybiBpbnQgZXhlY3ZwICgpOwotCi1pbnQKLXBleGVjdXRlIChwcm9ncmFtLCBhcmd2LCB0aGlzX3BuYW1lLCB0ZW1wX2Jhc2UsIGVycm1zZ19mbXQsIGVycm1zZ19hcmcsIGZsYWdzKQotICAgICBjb25zdCBjaGFyICpwcm9ncmFtOwotICAgICBjaGFyICogY29uc3QgKmFyZ3Y7Ci0gICAgIGNvbnN0IGNoYXIgKnRoaXNfcG5hbWU7Ci0gICAgIGNvbnN0IGNoYXIgKnRlbXBfYmFzZTsKLSAgICAgY2hhciAqKmVycm1zZ19mbXQsICoqZXJybXNnX2FyZzsKLSAgICAgaW50IGZsYWdzOwotewotICBpbnQgKCpmdW5jKSgpID0gKGZsYWdzICYgUEVYRUNVVEVfU0VBUkNIID8gZXhlY3ZwIDogZXhlY3YpOwotICBpbnQgcGlkOwotICBpbnQgcGRlc1syXTsKLSAgaW50IGlucHV0X2Rlc2MsIG91dHB1dF9kZXNjOwotICBpbnQgcmV0cmllcywgc2xlZXBfaW50ZXJ2YWw7Ci0gIC8qIFBpcGUgd2FpdGluZyBmcm9tIGxhc3QgcHJvY2VzcywgdG8gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdGhlIG5leHQgb25lLgotICAgICBWYWx1ZSBpcyBTVERJTl9GSUxFX05PIGlmIG5vIHBpcGUgaXMgd2FpdGluZwotICAgICAoaS5lLiB0aGUgbmV4dCBjb21tYW5kIGlzIHRoZSBmaXJzdCBvZiBhIGdyb3VwKS4gICovCi0gIHN0YXRpYyBpbnQgbGFzdF9waXBlX2lucHV0OwotCi0gIC8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IHByb2Nlc3MsIGluaXRpYWxpemUuICAqLwotICBpZiAoZmxhZ3MgJiBQRVhFQ1VURV9GSVJTVCkKLSAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POwotCi0gIGlucHV0X2Rlc2MgPSBsYXN0X3BpcGVfaW5wdXQ7Ci0KLSAgLyogSWYgdGhpcyBpc24ndCB0aGUgbGFzdCBwcm9jZXNzLCBtYWtlIGEgcGlwZSBmb3IgaXRzIG91dHB1dCwKLSAgICAgYW5kIHJlY29yZCBpdCBhcyB3YWl0aW5nIHRvIGJlIHRoZSBpbnB1dCB0byB0aGUgbmV4dCBwcm9jZXNzLiAgKi8KLSAgaWYgKCEgKGZsYWdzICYgUEVYRUNVVEVfTEFTVCkpCi0gICAgewotICAgICAgaWYgKHBpcGUgKHBkZXMpIDwgMCkKLQl7Ci0JICAqZXJybXNnX2ZtdCA9ICJwaXBlIjsKLQkgICplcnJtc2dfYXJnID0gTlVMTDsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBvdXRwdXRfZGVzYyA9IHBkZXNbV1JJVEVfUE9SVF07Ci0gICAgICBsYXN0X3BpcGVfaW5wdXQgPSBwZGVzW1JFQURfUE9SVF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogTGFzdCBwcm9jZXNzLiAgKi8KLSAgICAgIG91dHB1dF9kZXNjID0gU1RET1VUX0ZJTEVfTk87Ci0gICAgICBsYXN0X3BpcGVfaW5wdXQgPSBTVERJTl9GSUxFX05POwotICAgIH0KLQotICAvKiBGb3JrIGEgc3VicHJvY2Vzczsgd2FpdCBhbmQgcmV0cnkgaWYgaXQgZmFpbHMuICAqLwotICBzbGVlcF9pbnRlcnZhbCA9IDE7Ci0gIGZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCA0OyByZXRyaWVzKyspCi0gICAgewotICAgICAgcGlkID0gdmZvcmsgKCk7Ci0gICAgICBpZiAocGlkID49IDApCi0JYnJlYWs7Ci0gICAgICBzbGVlcCAoc2xlZXBfaW50ZXJ2YWwpOwotICAgICAgc2xlZXBfaW50ZXJ2YWwgKj0gMjsKLSAgICB9Ci0KLSAgc3dpdGNoIChwaWQpCi0gICAgewotICAgIGNhc2UgLTE6Ci0gICAgICB7Ci0JKmVycm1zZ19mbXQgPSBWRk9SS19TVFJJTkc7Ci0JKmVycm1zZ19hcmcgPSBOVUxMOwotCXJldHVybiAtMTsKLSAgICAgIH0KLQotICAgIGNhc2UgMDogLyogY2hpbGQgKi8KLSAgICAgIC8qIE1vdmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgcGlwZXMgaW50byBwbGFjZSwgaWYgbmVjZXNzYXJ5LiAgKi8KLSAgICAgIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0JewotCSAgY2xvc2UgKFNURElOX0ZJTEVfTk8pOwotCSAgZHVwIChpbnB1dF9kZXNjKTsKLQkgIGNsb3NlIChpbnB1dF9kZXNjKTsKLQl9Ci0gICAgICBpZiAob3V0cHV0X2Rlc2MgIT0gU1RET1VUX0ZJTEVfTk8pCi0JewotCSAgY2xvc2UgKFNURE9VVF9GSUxFX05PKTsKLQkgIGR1cCAob3V0cHV0X2Rlc2MpOwotCSAgY2xvc2UgKG91dHB1dF9kZXNjKTsKLQl9Ci0KLSAgICAgIC8qIENsb3NlIHRoZSBwYXJlbnQncyBkZXNjcyB0aGF0IGFyZW4ndCB3YW50ZWQgaGVyZS4gICovCi0gICAgICBpZiAobGFzdF9waXBlX2lucHV0ICE9IFNURElOX0ZJTEVfTk8pCi0JY2xvc2UgKGxhc3RfcGlwZV9pbnB1dCk7Ci0KLSAgICAgIC8qIEV4ZWMgdGhlIHByb2dyYW0uICAqLwotICAgICAgKCpmdW5jKSAocHJvZ3JhbSwgYXJndik7Ci0KLSAgICAgIC8qIE5vdGU6IENhbGxpbmcgZnByaW50ZiBhbmQgZXhpdCBoZXJlIGRvZXNuJ3Qgc2VlbSByaWdodCBmb3IgdmZvcmsuICAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHRoaXNfcG5hbWUpOwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBpbnN0YWxsX2Vycm9yX21zZywgcHJvZ3JhbSk7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICI6ICVzXG4iLCB4c3RyZXJyb3IgKGVycm5vKSk7Ci0gICAgICBleGl0ICgtMSk7Ci0gICAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgICByZXR1cm4gMDsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBJbiB0aGUgcGFyZW50LCBhZnRlciBmb3JraW5nLgotCSBDbG9zZSB0aGUgZGVzY3JpcHRvcnMgdGhhdCB3ZSBtYWRlIGZvciB0aGlzIGNoaWxkLiAgKi8KLSAgICAgIGlmIChpbnB1dF9kZXNjICE9IFNURElOX0ZJTEVfTk8pCi0JY2xvc2UgKGlucHV0X2Rlc2MpOwotICAgICAgaWYgKG91dHB1dF9kZXNjICE9IFNURE9VVF9GSUxFX05PKQotCWNsb3NlIChvdXRwdXRfZGVzYyk7Ci0KLSAgICAgIC8qIFJldHVybiBjaGlsZCdzIHByb2Nlc3MgbnVtYmVyLiAgKi8KLSAgICAgIHJldHVybiBwaWQ7Ci0gICAgfQotfQotCi1pbnQKLXB3YWl0IChwaWQsIHN0YXR1cywgZmxhZ3MpCi0gICAgIGludCBwaWQ7Ci0gICAgIGludCAqc3RhdHVzOwotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIC8qID8/PyBIZXJlJ3MgYW4gb3Bwb3J0dW5pdHkgdG8gY2Fub25pY2FsaXplIHRoZSB2YWx1ZXMgaW4gU1RBVFVTLgotICAgICBOZWVkZWQ/ICAqLwotI2lmZGVmIFZNUwotICBwaWQgPSB3YWl0cGlkICgtMSwgc3RhdHVzLCAwKTsKLSNlbHNlCi0gIHBpZCA9IHdhaXQgKHN0YXR1cyk7Ci0jZW5kaWYKLSAgcmV0dXJuIHBpZDsKLX0KLQotI2VuZGlmIC8qICEgX19NU0RPU19fICYmICEgT1MyICYmICEgTVBXICYmICEgKF9XSU4zMiAmJiAhIF9fVVdJTl9fKSAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3JhbmRvbS5jIGIvbGliaWJlcnR5L3JhbmRvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTk1MDcwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9yYW5kb20uYworKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKLSAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCi0gKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCi0gKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCi0gKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQotICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgotICovCi0KLS8qCi0gKiBUaGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgQmVya2VsZXkgc291cmNlOgotICoJQCgjKXJhbmRvbS5jCTUuNSAoQmVya2VsZXkpIDcvNi84OAotICogSXQgd2FzIHJld29ya2VkIGZvciB0aGUgR05VIEMgTGlicmFyeSBieSBSb2xhbmQgTWNHcmF0aC4KLSAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2lmIDAKLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNlbHNlCi0KLSNkZWZpbmUJVUxPTkdfTUFYICAoKHVuc2lnbmVkIGxvbmcpKH4wTCkpICAgICAvKiAweEZGRkZGRkZGIGZvciAzMi1iaXRzICovCi0jZGVmaW5lCUxPTkdfTUFYICAgKChsb25nKShVTE9OR19NQVggPj4gMSkpICAgLyogMHg3RkZGRkZGRiBmb3IgMzItYml0cyovCi0KLSNpZmRlZiBfX1NURENfXwotIyAgZGVmaW5lIFBUUiB2b2lkICoKLSMgIGlmbmRlZiBOVUxMCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVuZGlmCi0jZWxzZQotIyAgZGVmaW5lIFBUUiBjaGFyICoKLSMgIGlmbmRlZiBOVUxMCi0jICAgIGRlZmluZSBOVUxMICh2b2lkICopIDAKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2VuZGlmCi0KLWxvbmcgaW50IHJhbmRvbSAoKTsKLQotLyogQW4gaW1wcm92ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIHBhY2thZ2UuICBJbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQKLSAgIHJhbmQoKS9zcmFuZCgpIGxpa2UgaW50ZXJmYWNlLCB0aGlzIHBhY2thZ2UgYWxzbyBoYXMgYSBzcGVjaWFsIHN0YXRlIGluZm8KLSAgIGludGVyZmFjZS4gIFRoZSBpbml0c3RhdGUoKSByb3V0aW5lIGlzIGNhbGxlZCB3aXRoIGEgc2VlZCwgYW4gYXJyYXkgb2YKLSAgIGJ5dGVzLCBhbmQgYSBjb3VudCBvZiBob3cgbWFueSBieXRlcyBhcmUgYmVpbmcgcGFzc2VkIGluOyB0aGlzIGFycmF5IGlzCi0gICB0aGVuIGluaXRpYWxpemVkIHRvIGNvbnRhaW4gaW5mb3JtYXRpb24gZm9yIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiB3aXRoCi0gICB0aGF0IG11Y2ggc3RhdGUgaW5mb3JtYXRpb24uICBHb29kIHNpemVzIGZvciB0aGUgYW1vdW50IG9mIHN0YXRlCi0gICBpbmZvcm1hdGlvbiBhcmUgMzIsIDY0LCAxMjgsIGFuZCAyNTYgYnl0ZXMuICBUaGUgc3RhdGUgY2FuIGJlIHN3aXRjaGVkIGJ5Ci0gICBjYWxsaW5nIHRoZSBzZXRzdGF0ZSgpIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgYXJyYXkgYXMgd2FzIGluaXRpYWxsaXplZAotICAgd2l0aCBpbml0c3RhdGUoKS4gIEJ5IGRlZmF1bHQsIHRoZSBwYWNrYWdlIHJ1bnMgd2l0aCAxMjggYnl0ZXMgb2Ygc3RhdGUKLSAgIGluZm9ybWF0aW9uIGFuZCBnZW5lcmF0ZXMgZmFyIGJldHRlciByYW5kb20gbnVtYmVycyB0aGFuIGEgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yLiAgSWYgdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBsZXNzIHRoYW4KLSAgIDMyIGJ5dGVzLCBhIHNpbXBsZSBsaW5lYXIgY29uZ3J1ZW50aWFsIFIuTi5HLiBpcyB1c2VkLiAgSW50ZXJuYWxseSwgdGhlCi0gICBzdGF0ZSBpbmZvcm1hdGlvbiBpcyB0cmVhdGVkIGFzIGFuIGFycmF5IG9mIGxvbmdzOyB0aGUgemVyb2V0aCBlbGVtZW50IG9mCi0gICB0aGUgYXJyYXkgaXMgdGhlIHR5cGUgb2YgUi5OLkcuIGJlaW5nIHVzZWQgKHNtYWxsIGludGVnZXIpOyB0aGUgcmVtYWluZGVyCi0gICBvZiB0aGUgYXJyYXkgaXMgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgUi5OLkcuICBUaHVzLCAzMiBieXRlcyBvZgotICAgc3RhdGUgaW5mb3JtYXRpb24gd2lsbCBnaXZlIDcgbG9uZ3Mgd29ydGggb2Ygc3RhdGUgaW5mb3JtYXRpb24sIHdoaWNoIHdpbGwKLSAgIGFsbG93IGEgZGVncmVlIHNldmVuIHBvbHlub21pYWwuICAoTm90ZTogVGhlIHplcm9ldGggd29yZCBvZiBzdGF0ZQotICAgaW5mb3JtYXRpb24gYWxzbyBoYXMgc29tZSBvdGhlciBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gaXQ7IHNlZSBzZXRzdGF0ZQotICAgZm9yIGRldGFpbHMpLiAgVGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiB0ZWNobmlxdWUgaXMgYSBsaW5lYXIgZmVlZGJhY2sKLSAgIHNoaWZ0IHJlZ2lzdGVyIGFwcHJvYWNoLCBlbXBsb3lpbmcgdHJpbm9taWFscyAoc2luY2UgdGhlcmUgYXJlIGZld2VyIHRlcm1zCi0gICB0byBzdW0gdXAgdGhhdCB3YXkpLiAgSW4gdGhpcyBhcHByb2FjaCwgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiBhbGwKLSAgIHRoZSBudW1iZXJzIGluIHRoZSBzdGF0ZSB0YWJsZSB3aWxsIGFjdCBhcyBhIGxpbmVhciBmZWVkYmFjayBzaGlmdCByZWdpc3RlciwKLSAgIGFuZCB3aWxsIGhhdmUgcGVyaW9kIDJeZGVnIC0gMSAod2hlcmUgZGVnIGlzIHRoZSBkZWdyZWUgb2YgdGhlIHBvbHlub21pYWwKLSAgIGJlaW5nIHVzZWQsIGFzc3VtaW5nIHRoYXQgdGhlIHBvbHlub21pYWwgaXMgaXJyZWR1Y2libGUgYW5kIHByaW1pdGl2ZSkuCi0gICBUaGUgaGlnaGVyIG9yZGVyIGJpdHMgd2lsbCBoYXZlIGxvbmdlciBwZXJpb2RzLCBzaW5jZSB0aGVpciB2YWx1ZXMgYXJlCi0gICBhbHNvIGluZmx1ZW5jZWQgYnkgcHNldWRvLXJhbmRvbSBjYXJyaWVzIG91dCBvZiB0aGUgbG93ZXIgYml0cy4gIFRoZQotICAgdG90YWwgcGVyaW9kIG9mIHRoZSBnZW5lcmF0b3IgaXMgYXBwcm94aW1hdGVseSBkZWcqKDIqKmRlZyAtIDEpOyB0aHVzCi0gICBkb3VibGluZyB0aGUgYW1vdW50IG9mIHN0YXRlIGluZm9ybWF0aW9uIGhhcyBhIHZhc3QgaW5mbHVlbmNlIG9uIHRoZQotICAgcGVyaW9kIG9mIHRoZSBnZW5lcmF0b3IuICBOb3RlOiBUaGUgZGVnKigyKipkZWcgLSAxKSBpcyBhbiBhcHByb3hpbWF0aW9uCi0gICBvbmx5IGdvb2QgZm9yIGxhcmdlIGRlZywgd2hlbiB0aGUgcGVyaW9kIG9mIHRoZSBzaGlmdCByZWdpc3RlciBpcyB0aGUKLSAgIGRvbWluYW50IGZhY3Rvci4gIFdpdGggZGVnIGVxdWFsIHRvIHNldmVuLCB0aGUgcGVyaW9kIGlzIGFjdHVhbGx5IG11Y2gKLSAgIGxvbmdlciB0aGFuIHRoZSA3KigyKio3IC0gMSkgcHJlZGljdGVkIGJ5IHRoaXMgZm9ybXVsYS4gICovCi0KLQotCi0vKiBGb3IgZWFjaCBvZiB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCByYW5kb20gbnVtYmVyIGdlbmVyYXRvcnMsIHdlIGhhdmUgYQotICAgYnJlYWsgdmFsdWUgb24gdGhlIGFtb3VudCBvZiBzdGF0ZSBpbmZvcm1hdGlvbiAoeW91IG5lZWQgYXQgbGVhc3QgdGhpCi0gICBieXRlcyBvZiBzdGF0ZSBpbmZvIHRvIHN1cHBvcnQgdGhpcyByYW5kb20gbnVtYmVyIGdlbmVyYXRvciksIGEgZGVncmVlIGZvcgotICAgdGhlIHBvbHlub21pYWwgKGFjdHVhbGx5IGEgdHJpbm9taWFsKSB0aGF0IHRoZSBSLk4uRy4gaXMgYmFzZWQgb24sIGFuZAotICAgc2VwYXJhdGlvbiBiZXR3ZWVuIHRoZSB0d28gbG93ZXIgb3JkZXIgY29lZmZpY2llbnRzIG9mIHRoZSB0cmlub21pYWwuICAqLwotCi0vKiBMaW5lYXIgY29uZ3J1ZW50aWFsLiAgKi8KLSNkZWZpbmUJVFlQRV8wCQkwCi0jZGVmaW5lCUJSRUFLXzAJCTgKLSNkZWZpbmUJREVHXzAJCTAKLSNkZWZpbmUJU0VQXzAJCTAKLQotLyogeCoqNyArIHgqKjMgKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV8xCQkxCi0jZGVmaW5lCUJSRUFLXzEJCTMyCi0jZGVmaW5lCURFR18xCQk3Ci0jZGVmaW5lCVNFUF8xCQkzCi0KLS8qIHgqKjE1ICsgeCArIDEuICAqLwotI2RlZmluZQlUWVBFXzIJCTIKLSNkZWZpbmUJQlJFQUtfMgkJNjQKLSNkZWZpbmUJREVHXzIJCTE1Ci0jZGVmaW5lCVNFUF8yCQkxCi0KLS8qIHgqKjMxICsgeCoqMyArIDEuICAqLwotI2RlZmluZQlUWVBFXzMJCTMKLSNkZWZpbmUJQlJFQUtfMwkJMTI4Ci0jZGVmaW5lCURFR18zCQkzMQotI2RlZmluZQlTRVBfMwkJMwotCi0vKiB4Kio2MyArIHggKyAxLiAgKi8KLSNkZWZpbmUJVFlQRV80CQk0Ci0jZGVmaW5lCUJSRUFLXzQJCTI1NgotI2RlZmluZQlERUdfNAkJNjMKLSNkZWZpbmUJU0VQXzQJCTEKLQotCi0vKiBBcnJheSB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgaW5mb3JtYXRpb24gdG8gbWFrZSBjb2RlIHJ1biBmYXN0ZXIuCi0gICBSZWxpZXMgb24gZmFjdCB0aGF0IFRZUEVfaSA9PSBpLiAgKi8KLQotI2RlZmluZQlNQVhfVFlQRVMJNQkvKiBNYXggbnVtYmVyIG9mIHR5cGVzIGFib3ZlLiAgKi8KLQotc3RhdGljIGludCBkZWdyZWVzW01BWF9UWVBFU10gPSB7IERFR18wLCBERUdfMSwgREVHXzIsIERFR18zLCBERUdfNCB9Owotc3RhdGljIGludCBzZXBzW01BWF9UWVBFU10gPSB7IFNFUF8wLCBTRVBfMSwgU0VQXzIsIFNFUF8zLCBTRVBfNCB9OwotCi0KLQotLyogSW5pdGlhbGx5LCBldmVyeXRoaW5nIGlzIHNldCB1cCBhcyBpZiBmcm9tOgotCWluaXRzdGF0ZSgxLCByYW5kdGJsLCAxMjgpOwotICAgTm90ZSB0aGF0IHRoaXMgaW5pdGlhbGl6YXRpb24gdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgc3JhbmRvbQotICAgYWR2YW5jZXMgdGhlIGZyb250IGFuZCByZWFyIHBvaW50ZXJzIDEwKnJhbmRfZGVnIHRpbWVzLCBhbmQgaGVuY2UgdGhlCi0gICByZWFyIHBvaW50ZXIgd2hpY2ggc3RhcnRzIGF0IDAgd2lsbCBhbHNvIGVuZCB1cCBhdCB6ZXJvOyB0aHVzIHRoZSB6ZXJvZXRoCi0gICBlbGVtZW50IG9mIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiwgd2hpY2ggY29udGFpbnMgaW5mbyBhYm91dCB0aGUgY3VycmVudAotICAgcG9zaXRpb24gb2YgdGhlIHJlYXIgcG9pbnRlciBpcyBqdXN0Ci0JKE1BWF9UWVBFUyAqIChycHRyIC0gc3RhdGUpKSArIFRZUEVfMyA9PSBUWVBFXzMuICAqLwotCi1zdGF0aWMgbG9uZyBpbnQgcmFuZHRibFtERUdfMyArIDFdID0KLSAgeyBUWVBFXzMsCi0gICAgICAweDlhMzE5MDM5LCAweDMyZDljMDI0LCAweDliNjYzMTgyLCAweDVkYTFmMzQyLCAKLSAgICAgIDB4ZGUzYjgxZTAsIDB4ZGYwYTZmYjUsIDB4ZjEwM2JjMDIsIDB4NDhmMzQwZmIsIAotICAgICAgMHg3NDQ5ZTU2YiwgMHhiZWIxZGJiMCwgMHhhYjVjNTkxOCwgMHg5NDY1NTRmZCwgCi0gICAgICAweDhjMmU2ODBmLCAweGViM2Q3OTlmLCAweGIxMWVlMGI3LCAweDJkNDM2Yjg2LCAKLSAgICAgIDB4ZGE2NzJlMmEsIDB4MTU4OGNhODgsIDB4ZTM2OTczNWQsIDB4OTA0ZjM1ZjcsIAotICAgICAgMHhkNzE1OGZkNiwgMHg2ZmE2ZjA1MSwgMHg2MTZlNmI5NiwgMHhhYzk0ZWZkYywgCi0gICAgICAweDM2NDEzZjkzLCAweGM2MjJjMjk4LCAweGY1YTQyYWI4LCAweDhhODhkNzdiLCAKLSAgICAgIDB4ZjVhZDlkMGUsIDB4ODk5OTIyMGIsIDB4MjdmYjQ3YjkKLSAgICB9OwotCi0vKiBGUFRSIGFuZCBSUFRSIGFyZSB0d28gcG9pbnRlcnMgaW50byB0aGUgc3RhdGUgaW5mbywgYSBmcm9udCBhbmQgYSByZWFyCi0gICBwb2ludGVyLiAgVGhlc2UgdHdvIHBvaW50ZXJzIGFyZSBhbHdheXMgcmFuZF9zZXAgcGxhY2VzIGFwYXJ0cywgYXMgdGhleQotICAgY3ljbGUgdGhyb3VnaCB0aGUgc3RhdGUgaW5mb3JtYXRpb24uICAoWWVzLCB0aGlzIGRvZXMgbWVhbiB3ZSBjb3VsZCBnZXQKLSAgIGF3YXkgd2l0aCBqdXN0IG9uZSBwb2ludGVyLCBidXQgdGhlIGNvZGUgZm9yIHJhbmRvbSBpcyBtb3JlIGVmZmljaWVudAotICAgdGhpcyB3YXkpLiAgVGhlIHBvaW50ZXJzIGFyZSBsZWZ0IHBvc2l0aW9uZWQgYXMgdGhleSB3b3VsZCBiZSBmcm9tIHRoZSBjYWxsOgotCWluaXRzdGF0ZSgxLCByYW5kdGJsLCAxMjgpOwotICAgKFRoZSBwb3NpdGlvbiBvZiB0aGUgcmVhciBwb2ludGVyLCBycHRyLCBpcyByZWFsbHkgMCAoYXMgZXhwbGFpbmVkIGFib3ZlCi0gICBpbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgcmFuZHRibCkgYmVjYXVzZSB0aGUgc3RhdGUgdGFibGUgcG9pbnRlciBpcyBzZXQKLSAgIHRvIHBvaW50IHRvIHJhbmR0YmxbMV0gKGFzIGV4cGxhaW5lZCBiZWxvdykuKSAgKi8KLQotc3RhdGljIGxvbmcgaW50ICpmcHRyID0gJnJhbmR0YmxbU0VQXzMgKyAxXTsKLXN0YXRpYyBsb25nIGludCAqcnB0ciA9ICZyYW5kdGJsWzFdOwotCi0KLQotLyogVGhlIGZvbGxvd2luZyB0aGluZ3MgYXJlIHRoZSBwb2ludGVyIHRvIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbiB0YWJsZSwKLSAgIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IGdlbmVyYXRvciwgdGhlIGRlZ3JlZSBvZiB0aGUgY3VycmVudCBwb2x5bm9taWFsCi0gICBiZWluZyB1c2VkLCBhbmQgdGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgdHdvIHBvaW50ZXJzLgotICAgTm90ZSB0aGF0IGZvciBlZmZpY2llbmN5IG9mIHJhbmRvbSwgd2UgcmVtZW1iZXIgdGhlIGZpcnN0IGxvY2F0aW9uIG9mCi0gICB0aGUgc3RhdGUgaW5mb3JtYXRpb24sIG5vdCB0aGUgemVyb2V0aC4gIEhlbmNlIGl0IGlzIHZhbGlkIHRvIGFjY2VzcwotICAgc3RhdGVbLTFdLCB3aGljaCBpcyB1c2VkIHRvIHN0b3JlIHRoZSB0eXBlIG9mIHRoZSBSLk4uRy4KLSAgIEFsc28sIHdlIHJlbWVtYmVyIHRoZSBsYXN0IGxvY2F0aW9uLCBzaW5jZSB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KLSAgIGluZGV4aW5nIGV2ZXJ5IHRpbWUgdG8gZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgbGFzdCBlbGVtZW50IHRvIHNlZSBpZgotICAgdGhlIGZyb250IGFuZCByZWFyIHBvaW50ZXJzIGhhdmUgd3JhcHBlZC4gICovCi0KLXN0YXRpYyBsb25nIGludCAqc3RhdGUgPSAmcmFuZHRibFsxXTsKLQotc3RhdGljIGludCByYW5kX3R5cGUgPSBUWVBFXzM7Ci1zdGF0aWMgaW50IHJhbmRfZGVnID0gREVHXzM7Ci1zdGF0aWMgaW50IHJhbmRfc2VwID0gU0VQXzM7Ci0KLXN0YXRpYyBsb25nIGludCAqZW5kX3B0ciA9ICZyYW5kdGJsW3NpemVvZihyYW5kdGJsKSAvIHNpemVvZihyYW5kdGJsWzBdKV07Ci0MCi0vKiBJbml0aWFsaXplIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2VlZC4gIElmIHRoZQotICAgdHlwZSBpcyB0aGUgdHJpdmlhbCBuby1zdGF0ZS1pbmZvcm1hdGlvbiB0eXBlLCBqdXN0IHJlbWVtYmVyIHRoZSBzZWVkLgotICAgT3RoZXJ3aXNlLCBpbml0aWFsaXplcyBzdGF0ZVtdIGJhc2VkIG9uIHRoZSBnaXZlbiAic2VlZCIgdmlhIGEgbGluZWFyCi0gICBjb25ncnVlbnRpYWwgZ2VuZXJhdG9yLiAgVGhlbiwgdGhlIHBvaW50ZXJzIGFyZSBzZXQgdG8ga25vd24gbG9jYXRpb25zCi0gICB0aGF0IGFyZSBleGFjdGx5IHJhbmRfc2VwIHBsYWNlcyBhcGFydC4gIExhc3RseSwgaXQgY3ljbGVzIHRoZSBzdGF0ZQotICAgaW5mb3JtYXRpb24gYSBnaXZlbiBudW1iZXIgb2YgdGltZXMgdG8gZ2V0IHJpZCBvZiBhbnkgaW5pdGlhbCBkZXBlbmRlbmNpZXMKLSAgIGludHJvZHVjZWQgYnkgdGhlIEwuQy5SLk4uRy4gIE5vdGUgdGhhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgcmFuZHRibFtdCi0gICBmb3IgZGVmYXVsdCB1c2FnZSByZWxpZXMgb24gdmFsdWVzIHByb2R1Y2VkIGJ5IHRoaXMgcm91dGluZS4gICovCi12b2lkCi1zcmFuZG9tICh4KQotICB1bnNpZ25lZCBpbnQgeDsKLXsKLSAgc3RhdGVbMF0gPSB4OwotICBpZiAocmFuZF90eXBlICE9IFRZUEVfMCkKLSAgICB7Ci0gICAgICByZWdpc3RlciBsb25nIGludCBpOwotICAgICAgZm9yIChpID0gMTsgaSA8IHJhbmRfZGVnOyArK2kpCi0Jc3RhdGVbaV0gPSAoMTEwMzUxNTE0NSAqIHN0YXRlW2kgLSAxXSkgKyAxMjM0NTsKLSAgICAgIGZwdHIgPSAmc3RhdGVbcmFuZF9zZXBdOwotICAgICAgcnB0ciA9ICZzdGF0ZVswXTsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxMCAqIHJhbmRfZGVnOyArK2kpCi0JcmFuZG9tKCk7Ci0gICAgfQotfQotDAotLyogSW5pdGlhbGl6ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24gaW4gdGhlIGdpdmVuIGFycmF5IG9mIE4gYnl0ZXMgZm9yCi0gICBmdXR1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uLiAgQmFzZWQgb24gdGhlIG51bWJlciBvZiBieXRlcyB3ZQotICAgYXJlIGdpdmVuLCBhbmQgdGhlIGJyZWFrIHZhbHVlcyBmb3IgdGhlIGRpZmZlcmVudCBSLk4uRy4ncywgd2UgY2hvb3NlCi0gICB0aGUgYmVzdCAobGFyZ2VzdCkgb25lIHdlIGNhbiBhbmQgc2V0IHRoaW5ncyB1cCBmb3IgaXQuICBzcmFuZG9tIGlzCi0gICB0aGVuIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbi4gIE5vdGUgdGhhdCBvbiByZXR1cm4KLSAgIGZyb20gc3JhbmRvbSwgd2Ugc2V0IHN0YXRlWy0xXSB0byBiZSB0aGUgdHlwZSBtdWx0aXBsZXhlZCB3aXRoIHRoZSBjdXJyZW50Ci0gICB2YWx1ZSBvZiB0aGUgcmVhciBwb2ludGVyOyB0aGlzIGlzIHNvIHN1Y2Nlc3NpdmUgY2FsbHMgdG8gaW5pdHN0YXRlIHdvbid0Ci0gICBsb3NlIHRoaXMgaW5mb3JtYXRpb24gYW5kIHdpbGwgYmUgYWJsZSB0byByZXN0YXJ0IHdpdGggc2V0c3RhdGUuCi0gICBOb3RlOiBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSwgaWYgYW55LCBqdXN0IGxpa2UKLSAgIHNldHN0YXRlIHNvIHRoYXQgaXQgZG9lc24ndCBtYXR0ZXIgd2hlbiBpbml0c3RhdGUgaXMgY2FsbGVkLgotICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9sZCBzdGF0ZS4gICovCi1QVFIKLWluaXRzdGF0ZSAoc2VlZCwgYXJnX3N0YXRlLCBuKQotICB1bnNpZ25lZCBpbnQgc2VlZDsKLSAgUFRSIGFyZ19zdGF0ZTsKLSAgdW5zaWduZWQgbG9uZyBuOwotewotICBQVFIgb3N0YXRlID0gKFBUUikgJnN0YXRlWy0xXTsKLQotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotICBpZiAobiA8IEJSRUFLXzEpCi0gICAgewotICAgICAgaWYgKG4gPCBCUkVBS18wKQotCXsKLQkgIGVycm5vID0gRUlOVkFMOwotCSAgcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcmFuZF90eXBlID0gVFlQRV8wOwotICAgICAgcmFuZF9kZWcgPSBERUdfMDsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzA7Ci0gICAgfQotICBlbHNlIGlmIChuIDwgQlJFQUtfMikKLSAgICB7Ci0gICAgICByYW5kX3R5cGUgPSBUWVBFXzE7Ci0gICAgICByYW5kX2RlZyA9IERFR18xOwotICAgICAgcmFuZF9zZXAgPSBTRVBfMTsKLSAgICB9Ci0gIGVsc2UgaWYgKG4gPCBCUkVBS18zKQotICAgIHsKLSAgICAgIHJhbmRfdHlwZSA9IFRZUEVfMjsKLSAgICAgIHJhbmRfZGVnID0gREVHXzI7Ci0gICAgICByYW5kX3NlcCA9IFNFUF8yOwotICAgIH0KLSAgZWxzZSBpZiAobiA8IEJSRUFLXzQpCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV8zOwotICAgICAgcmFuZF9kZWcgPSBERUdfMzsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzM7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcmFuZF90eXBlID0gVFlQRV80OwotICAgICAgcmFuZF9kZWcgPSBERUdfNDsKLSAgICAgIHJhbmRfc2VwID0gU0VQXzQ7Ci0gICAgfQotCi0gIHN0YXRlID0gJigobG9uZyBpbnQgKikgYXJnX3N0YXRlKVsxXTsJLyogRmlyc3QgbG9jYXRpb24uICAqLwotICAvKiBNdXN0IHNldCBFTkRfUFRSIGJlZm9yZSBzcmFuZG9tLiAgKi8KLSAgZW5kX3B0ciA9ICZzdGF0ZVtyYW5kX2RlZ107Ci0gIHNyYW5kb20oc2VlZCk7Ci0gIGlmIChyYW5kX3R5cGUgPT0gVFlQRV8wKQotICAgIHN0YXRlWy0xXSA9IHJhbmRfdHlwZTsKLSAgZWxzZQotICAgIHN0YXRlWy0xXSA9IChNQVhfVFlQRVMgKiAocnB0ciAtIHN0YXRlKSkgKyByYW5kX3R5cGU7Ci0KLSAgcmV0dXJuIG9zdGF0ZTsKLX0KLQwKLS8qIFJlc3RvcmUgdGhlIHN0YXRlIGZyb20gdGhlIGdpdmVuIHN0YXRlIGFycmF5LgotICAgTm90ZTogSXQgaXMgaW1wb3J0YW50IHRoYXQgd2UgYWxzbyByZW1lbWJlciB0aGUgbG9jYXRpb25zIG9mIHRoZSBwb2ludGVycwotICAgaW4gdGhlIGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24sIGFuZCByZXN0b3JlIHRoZSBsb2NhdGlvbnMgb2YgdGhlIHBvaW50ZXJzCi0gICBmcm9tIHRoZSBvbGQgc3RhdGUgaW5mb3JtYXRpb24uICBUaGlzIGlzIGRvbmUgYnkgbXVsdGlwbGV4aW5nIHRoZSBwb2ludGVyCi0gICBsb2NhdGlvbiBpbnRvIHRoZSB6ZXJvZXRoIHdvcmQgb2YgdGhlIHN0YXRlIGluZm9ybWF0aW9uLiBOb3RlIHRoYXQgZHVlCi0gICB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhpbmdzIGFyZSBkb25lLCBpdCBpcyBPSyB0byBjYWxsIHNldHN0YXRlIHdpdGggdGhlCi0gICBzYW1lIHN0YXRlIGFzIHRoZSBjdXJyZW50IHN0YXRlCi0gICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgb2xkIHN0YXRlIGluZm9ybWF0aW9uLiAgKi8KLQotUFRSCi1zZXRzdGF0ZSAoYXJnX3N0YXRlKQotICBQVFIgYXJnX3N0YXRlOwotewotICByZWdpc3RlciBsb25nIGludCAqbmV3X3N0YXRlID0gKGxvbmcgaW50ICopIGFyZ19zdGF0ZTsKLSAgcmVnaXN0ZXIgaW50IHR5cGUgPSBuZXdfc3RhdGVbMF0gJSBNQVhfVFlQRVM7Ci0gIHJlZ2lzdGVyIGludCByZWFyID0gbmV3X3N0YXRlWzBdIC8gTUFYX1RZUEVTOwotICBQVFIgb3N0YXRlID0gKFBUUikgJnN0YXRlWy0xXTsKLQotICBpZiAocmFuZF90eXBlID09IFRZUEVfMCkKLSAgICBzdGF0ZVstMV0gPSByYW5kX3R5cGU7Ci0gIGVsc2UKLSAgICBzdGF0ZVstMV0gPSAoTUFYX1RZUEVTICogKHJwdHIgLSBzdGF0ZSkpICsgcmFuZF90eXBlOwotCi0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSBUWVBFXzA6Ci0gICAgY2FzZSBUWVBFXzE6Ci0gICAgY2FzZSBUWVBFXzI6Ci0gICAgY2FzZSBUWVBFXzM6Ci0gICAgY2FzZSBUWVBFXzQ6Ci0gICAgICByYW5kX3R5cGUgPSB0eXBlOwotICAgICAgcmFuZF9kZWcgPSBkZWdyZWVzW3R5cGVdOwotICAgICAgcmFuZF9zZXAgPSBzZXBzW3R5cGVdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8qIFN0YXRlIGluZm8gbXVuZ2VkLiAgKi8KLSAgICAgIGVycm5vID0gRUlOVkFMOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHN0YXRlID0gJm5ld19zdGF0ZVsxXTsKLSAgaWYgKHJhbmRfdHlwZSAhPSBUWVBFXzApCi0gICAgewotICAgICAgcnB0ciA9ICZzdGF0ZVtyZWFyXTsKLSAgICAgIGZwdHIgPSAmc3RhdGVbKHJlYXIgKyByYW5kX3NlcCkgJSByYW5kX2RlZ107Ci0gICAgfQotICAvKiBTZXQgZW5kX3B0ciB0b28uICAqLwotICBlbmRfcHRyID0gJnN0YXRlW3JhbmRfZGVnXTsKLQotICByZXR1cm4gb3N0YXRlOwotfQotDAotLyogSWYgd2UgYXJlIHVzaW5nIHRoZSB0cml2aWFsIFRZUEVfMCBSLk4uRy4sIGp1c3QgZG8gdGhlIG9sZCBsaW5lYXIKLSAgIGNvbmdydWVudGlhbCBiaXQuICBPdGhlcndpc2UsIHdlIGRvIG91ciBmYW5jeSB0cmlub21pYWwgc3R1ZmYsIHdoaWNoIGlzIHRoZQotICAgc2FtZSBpbiBhbGwgdGhlciBvdGhlciBjYXNlcyBkdWUgdG8gYWxsIHRoZSBnbG9iYWwgdmFyaWFibGVzIHRoYXQgaGF2ZSBiZWVuCi0gICBzZXQgdXAuICBUaGUgYmFzaWMgb3BlcmF0aW9uIGlzIHRvIGFkZCB0aGUgbnVtYmVyIGF0IHRoZSByZWFyIHBvaW50ZXIgaW50bwotICAgdGhlIG9uZSBhdCB0aGUgZnJvbnQgcG9pbnRlci4gIFRoZW4gYm90aCBwb2ludGVycyBhcmUgYWR2YW5jZWQgdG8gdGhlIG5leHQKLSAgIGxvY2F0aW9uIGN5Y2xpY2FsbHkgaW4gdGhlIHRhYmxlLiAgVGhlIHZhbHVlIHJldHVybmVkIGlzIHRoZSBzdW0gZ2VuZXJhdGVkLAotICAgcmVkdWNlZCB0byAzMSBiaXRzIGJ5IHRocm93aW5nIGF3YXkgdGhlICJsZWFzdCByYW5kb20iIGxvdyBiaXQuCi0gICBOb3RlOiBUaGUgY29kZSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBib3RoIHRoZSBmcm9udCBhbmQKLSAgIHJlYXIgcG9pbnRlcnMgY2FuJ3Qgd3JhcCBvbiB0aGUgc2FtZSBjYWxsIGJ5IG5vdCB0ZXN0aW5nIHRoZSByZWFyCi0gICBwb2ludGVyIGlmIHRoZSBmcm9udCBvbmUgaGFzIHdyYXBwZWQuICBSZXR1cm5zIGEgMzEtYml0IHJhbmRvbSBudW1iZXIuICAqLwotCi1sb25nIGludAotcmFuZG9tICgpCi17Ci0gIGlmIChyYW5kX3R5cGUgPT0gVFlQRV8wKQotICAgIHsKLSAgICAgIHN0YXRlWzBdID0gKChzdGF0ZVswXSAqIDExMDM1MTUyNDUpICsgMTIzNDUpICYgTE9OR19NQVg7Ci0gICAgICByZXR1cm4gc3RhdGVbMF07Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBpbnQgaTsKLSAgICAgICpmcHRyICs9ICpycHRyOwotICAgICAgLyogQ2h1Y2tpbmcgbGVhc3QgcmFuZG9tIGJpdC4gICovCi0gICAgICBpID0gKCpmcHRyID4+IDEpICYgTE9OR19NQVg7Ci0gICAgICArK2ZwdHI7Ci0gICAgICBpZiAoZnB0ciA+PSBlbmRfcHRyKQotCXsKLQkgIGZwdHIgPSBzdGF0ZTsKLQkgICsrcnB0cjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKytycHRyOwotCSAgaWYgKHJwdHIgPj0gZW5kX3B0cikKLQkgICAgcnB0ciA9IHN0YXRlOwotCX0KLSAgICAgIHJldHVybiBpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9yZW5hbWUuYyBiL2xpYmliZXJ0eS9yZW5hbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyNmUyZC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvcmVuYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiByZW5hbWUgLS0gcmVuYW1lIGEgZmlsZQotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotLyogUmVuYW1lIGEgZmlsZS4gICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotCi1pbnQKLXJlbmFtZSAoemZyb20sIHp0bykKLSAgICAgY2hhciAqemZyb207Ci0gICAgIGNoYXIgKnp0bzsKLXsKLSAgaWYgKGxpbmsgKHpmcm9tLCB6dG8pIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKQotCXJldHVybiAtMTsKLSAgICAgIGlmICh1bmxpbmsgKHp0bykgPCAwCi0JICB8fCBsaW5rICh6ZnJvbSwgenRvKSA8IDApCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgcmV0dXJuIHVubGluayAoemZyb20pOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3JpbmRleC5jIGIvbGliaWJlcnR5L3JpbmRleC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFkMTI2Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9yaW5kZXguYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLS8qIFN0dWIgaW1wbGVtZW50YXRpb24gb2YgKG9ic29sZXRlKSByaW5kZXgoKS4gKi8KLQotZXh0ZXJuIGNoYXIgKnN0cnJjaHIgKCk7Ci0KLWNoYXIgKgotcmluZGV4IChzLCBjKQotICBjaGFyICpzOwotICBpbnQgYzsKLXsKLSAgcmV0dXJuIHN0cnJjaHIgKHMsIGMpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NpZ3NldG1hc2suYyBiL2xpYmliZXJ0eS9zaWdzZXRtYXNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDllNmEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3NpZ3NldG1hc2suYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIFZlcnNpb24gb2Ygc2lnc2V0bWFzay5jCi0gICBXcml0dGVuIGJ5IFN0ZXZlIENoYW1iZXJsYWluIChzYWNAY3lnbnVzLmNvbSkuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4KLSAgIFRoaXMgZmlsZSBpcyBpbiB0aGUgcHVibGljIGRvYW1pbi4gKi8KLQotLyogU2V0IHRoZSBjdXJyZW50IHNpZ25hbCBtYXNrIHRvIHRoZSBzZXQgcHJvdmlkZWQsIGFuZCByZXR1cm4gdGhlIAotICAgcHJldmlvdXMgdmFsdWUgKi8KLQotI2RlZmluZSBfUE9TSVhfU09VUkNFCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLS8qIEluY2x1ZGluZyA8c3lzL3R5cGVzLmg+IHNlZW1zIHRvIGJlIG5lZWRlZCBieSBJU0MuICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZmRlZiBTSUdfU0VUTUFTSwotaW50Ci1ERUZVTihzaWdzZXRtYXNrLChzZXQpLAotICAgICAgaW50IHNldCkKLXsKLSAgICBzaWdzZXRfdCBuZXc7Ci0gICAgc2lnc2V0X3Qgb2xkOwotICAgIAotICAgIHNpZ2VtcHR5c2V0ICgmbmV3KTsKLSAgICBpZiAoc2V0ICE9IDApIHsKLSAgICAgIGFib3J0KCk7CS8qIEZJWE1FLCB3ZSBkb24ndCBrbm93IGhvdyB0byB0cmFuc2xhdGUgb2xkIG1hc2sgdG8gbmV3ICovCi0gICAgfQotICAgIHNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmbmV3LCAmb2xkKTsKLSAgICByZXR1cm4gMTsJLyogRklYTUUsIHdlIGFsd2F5cyByZXR1cm4gMSBhcyBvbGQgdmFsdWUuICAqLwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3BhY2VzLmMgYi9saWJpYmVydHkvc3BhY2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTI1NzEuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3NwYWNlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyogQWxsb2NhdGUgbWVtb3J5IHJlZ2lvbiBmaWxsZWQgd2l0aCBzcGFjZXMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKgotCi1OQU1FCi0KLQlzcGFjZXMgLS0gcmV0dXJuIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBmdWxsIG9mIHNwYWNlcwotCi1TWU5PUFNJUwotCi0JY2hhciAqc3BhY2VzIChpbnQgY291bnQpCi0KLURFU0NSSVBUSU9OCi0KLQlSZXR1cm5zIGEgcG9pbnRlciB0byBhIG1lbW9yeSByZWdpb24gZmlsbGVkIHdpdGggdGhlIHNwZWNpZmllZAotCW51bWJlciBvZiBzcGFjZXMgYW5kIG51bGwgdGVybWluYXRlZC4gIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzCi0JdmFsaWQgdW50aWwgYXQgbGVhc3QgdGhlIG5leHQgY2FsbC4KLQkKLUJVR1MKLQotKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpZiBWTVMKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1bml4bGliLmg+Ci0jZWxzZQotLyogRm9yIHN5c3RlbXMgd2l0aCBsYXJnZXIgcG9pbnRlcnMgdGhhbiBpbnRzLCB0aGVzZSBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLWV4dGVybiBQVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotZXh0ZXJuIHZvaWQgZnJlZSBQQVJBTVMgKChQVFIpKTsKLSNlbmRpZgotCi1jb25zdCBjaGFyICoKLXNwYWNlcyAoY291bnQpCi0gIGludCBjb3VudDsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqdDsKLSAgc3RhdGljIGNoYXIgKmJ1ZjsKLSAgc3RhdGljIGludCBtYXhzaXplOwotCi0gIGlmIChjb3VudCA+IG1heHNpemUpCi0gICAgewotICAgICAgaWYgKGJ1ZikKLQl7Ci0JICBmcmVlIChidWYpOwotCX0KLSAgICAgIGJ1ZiA9IG1hbGxvYyAoY291bnQgKyAxKTsKLSAgICAgIGlmIChidWYgPT0gKGNoYXIgKikgMCkKLQlyZXR1cm4gMDsKLSAgICAgIGZvciAodCA9IGJ1ZiArIGNvdW50IDsgdCAhPSBidWYgOyApCi0JewotCSAgKi0tdCA9ICcgJzsKLQl9Ci0gICAgICBtYXhzaXplID0gY291bnQ7Ci0gICAgICBidWZbY291bnRdID0gJ1wwJzsKLSAgICB9Ci0gIHJldHVybiAoY29uc3QgY2hhciAqKSAoYnVmICsgbWF4c2l6ZSAtIGNvdW50KTsKLX0KLQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3NwbGF5LXRyZWUuYyBiL2xpYmliZXJ0eS9zcGxheS10cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YmI1YTYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3NwbGF5LXRyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKiBBIHNwbGF5LXRyZWUgZGF0YXR5cGUuICAKLSAgIENvcHlyaWdodCAoQykgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IE1hcmsgTWl0Y2hlbGwgKG1hcmtAbWFya21pdGNoZWxsLmNvbSkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBDQy4KLSAgIAotR05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogRm9yIGFuIGVhc2lseSByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiBzcGxheS10cmVlcywgc2VlOgotCi0gICAgIExld2lzLCBIYXJyeSBSLiBhbmQgRGVuZW5iZXJnLCBMYXJyeS4gIERhdGEgU3RydWN0dXJlcyBhbmQgVGhlaXIKLSAgICAgQWxnb3JpdGhtcy4gIEhhcnBlci1Db2xsaW5zLCBJbmMuICAxOTkxLiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJzcGxheS10cmVlLmgiCi0KLXN0YXRpYyB2b2lkIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAgICBQQVJBTVMoKHNwbGF5X3RyZWUsIAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKSk7Ci1zdGF0aWMgdm9pZCBzcGxheV90cmVlX3NwbGF5ICAgICAgICAgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkJc3BsYXlfdHJlZV9rZXkpKTsKLXN0YXRpYyBzcGxheV90cmVlX25vZGUgc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUkFNUygoc3BsYXlfdHJlZSwKLQkJCQkJCXNwbGF5X3RyZWVfa2V5LAotCQkJCQkJc3BsYXlfdHJlZV9ub2RlKiwKLQkJCQkJCXNwbGF5X3RyZWVfbm9kZSosCi0JCQkJCQlzcGxheV90cmVlX25vZGUqKSk7Ci1zdGF0aWMgaW50IHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgICAgUEFSQU1TKChzcGxheV90cmVlLAotCQkJCQkgICAgICAgIHNwbGF5X3RyZWVfbm9kZSwKLQkJCQkJCXNwbGF5X3RyZWVfZm9yZWFjaF9mbiwKLQkJCQkJCXZvaWQqKSk7Ci0KLS8qIERlYWxsb2NhdGUgTk9ERSAoYSBtZW1iZXIgb2YgU1ApLCBhbmQgYWxsIGl0cyBzdWItdHJlZXMuICAqLwotCi1zdGF0aWMgdm9pZCAKLXNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIG5vZGUpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfbm9kZSBub2RlOwotewotICBpZiAoIW5vZGUpCi0gICAgcmV0dXJuOwotCi0gIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIG5vZGUtPmxlZnQpOwotICBzcGxheV90cmVlX2RlbGV0ZV9oZWxwZXIgKHNwLCBub2RlLT5yaWdodCk7Ci0KLSAgaWYgKHNwLT5kZWxldGVfa2V5KQotICAgICgqc3AtPmRlbGV0ZV9rZXkpKG5vZGUtPmtleSk7Ci0gIGlmIChzcC0+ZGVsZXRlX3ZhbHVlKQotICAgICgqc3AtPmRlbGV0ZV92YWx1ZSkobm9kZS0+dmFsdWUpOwotCi0gIGZyZWUgKChjaGFyKikgbm9kZSk7Ci19Ci0KLS8qIEhlbHAgc3BsYXkgU1AgYXJvdW5kIEtFWS4gIFBBUkVOVCBhbmQgR1JBTkRQQVJFTlQgYXJlIHRoZSBwYXJlbnQKLSAgIGFuZCBncmFuZHBhcmVudCwgcmVzcGVjdGl2ZWx5LCBvZiBOT0RFLiAgKi8KLQotc3RhdGljIHNwbGF5X3RyZWVfbm9kZQotc3BsYXlfdHJlZV9zcGxheV9oZWxwZXIgKHNwLCBrZXksIG5vZGUsIHBhcmVudCwgZ3JhbmRwYXJlbnQpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLSAgICAgc3BsYXlfdHJlZV9ub2RlICpub2RlOwotICAgICBzcGxheV90cmVlX25vZGUgKnBhcmVudDsKLSAgICAgc3BsYXlfdHJlZV9ub2RlICpncmFuZHBhcmVudDsKLXsKLSAgc3BsYXlfdHJlZV9ub2RlICpuZXh0OwotICBzcGxheV90cmVlX25vZGUgbjsKLSAgaW50IGNvbXBhcmlzb247Ci0gIAotICBuID0gKm5vZGU7Ci0KLSAgaWYgKCFuKQotICAgIHJldHVybiAqcGFyZW50OwotCi0gIGNvbXBhcmlzb24gPSAoKnNwLT5jb21wKSAoa2V5LCBuLT5rZXkpOwotCi0gIGlmIChjb21wYXJpc29uID09IDApCi0gICAgLyogV2UndmUgZm91bmQgdGhlIHRhcmdldC4gICovCi0gICAgbmV4dCA9IDA7Ci0gIGVsc2UgaWYgKGNvbXBhcmlzb24gPCAwKQotICAgIC8qIFRoZSB0YXJnZXQgaXMgdG8gdGhlIGxlZnQuICAqLwotICAgIG5leHQgPSAmbi0+bGVmdDsKLSAgZWxzZSAKLSAgICAvKiBUaGUgdGFyZ2V0IGlzIHRvIHRoZSByaWdodC4gICovCi0gICAgbmV4dCA9ICZuLT5yaWdodDsKLQotICBpZiAobmV4dCkKLSAgICB7Ci0gICAgICAvKiBDb250aW51ZSBkb3duIHRoZSB0cmVlLiAgKi8KLSAgICAgIG4gPSBzcGxheV90cmVlX3NwbGF5X2hlbHBlciAoc3AsIGtleSwgbmV4dCwgbm9kZSwgcGFyZW50KTsKLQotICAgICAgLyogVGhlIHJlY3Vyc2l2ZSBjYWxsIHdpbGwgY2hhbmdlIHRoZSBwbGFjZSB0byB3aGljaCBOT0RFCi0JIHBvaW50cy4gICovCi0gICAgICBpZiAoKm5vZGUgIT0gbikKLQlyZXR1cm4gbjsKLSAgICB9Ci0KLSAgaWYgKCFwYXJlbnQpCi0gICAgLyogTk9ERSBpcyB0aGUgcm9vdC4gIFdlIGFyZSBkb25lLiAgKi8KLSAgICByZXR1cm4gbjsKLQotICAvKiBGaXJzdCwgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG5vIGdyYW5kcGFyZW50IChpLmUuLAotICAgICAqUEFSRU5UIGlzIHRoZSByb290IG9mIHRoZSB0cmVlLikgICovCi0gIGlmICghZ3JhbmRwYXJlbnQpIAotICAgIHsKLSAgICAgIGlmIChuID09ICgqcGFyZW50KS0+bGVmdCkKLQl7Ci0JICAqbm9kZSA9IG4tPnJpZ2h0OwotCSAgbi0+cmlnaHQgPSAqcGFyZW50OwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICAqbm9kZSA9IG4tPmxlZnQ7Ci0JICBuLT5sZWZ0ID0gKnBhcmVudDsKLQl9Ci0gICAgICAqcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAvKiBOZXh0IGhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgYm90aCBOIGFuZCAqUEFSRU5UIGFyZSBsZWZ0IGNoaWxkcmVuLAotICAgICBvciB3aGVyZSBib3RoIGFyZSByaWdodCBjaGlsZHJlbi4gICovCi0gIGlmIChuID09ICgqcGFyZW50KS0+bGVmdCAmJiAqcGFyZW50ID09ICgqZ3JhbmRwYXJlbnQpLT5sZWZ0KQotICAgIHsKLSAgICAgIHNwbGF5X3RyZWVfbm9kZSBwID0gKnBhcmVudDsKLQotICAgICAgKCpncmFuZHBhcmVudCktPmxlZnQgPSBwLT5yaWdodDsKLSAgICAgIHAtPnJpZ2h0ID0gKmdyYW5kcGFyZW50OwotICAgICAgcC0+bGVmdCA9IG4tPnJpZ2h0OwotICAgICAgbi0+cmlnaHQgPSBwOwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOyAKLSAgICB9Ci0gIGVsc2UgaWYgIChuID09ICgqcGFyZW50KS0+cmlnaHQgJiYgKnBhcmVudCA9PSAoKmdyYW5kcGFyZW50KS0+cmlnaHQpCi0gICAgewotICAgICAgc3BsYXlfdHJlZV9ub2RlIHAgPSAqcGFyZW50OwotCi0gICAgICAoKmdyYW5kcGFyZW50KS0+cmlnaHQgPSBwLT5sZWZ0OwotICAgICAgcC0+bGVmdCA9ICpncmFuZHBhcmVudDsKLSAgICAgIHAtPnJpZ2h0ID0gbi0+bGVmdDsKLSAgICAgIG4tPmxlZnQgPSBwOwotICAgICAgKmdyYW5kcGFyZW50ID0gbjsKLSAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAvKiBGaW5hbGx5LCBkZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgTiBpcyBhIGxlZnQgY2hpbGQsIGJ1dCAqUEFSRU5UCi0gICAgIGlzIGEgcmlnaHQgY2hpbGQsIG9yIHZpY2UgdmVyc2EuICAqLwotICBpZiAobiA9PSAoKnBhcmVudCktPmxlZnQpIAotICAgIHsKLSAgICAgICgqcGFyZW50KS0+bGVmdCA9IG4tPnJpZ2h0OwotICAgICAgbi0+cmlnaHQgPSAqcGFyZW50OwotICAgICAgKCpncmFuZHBhcmVudCktPnJpZ2h0ID0gbi0+bGVmdDsKLSAgICAgIG4tPmxlZnQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICAqZ3JhbmRwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47Ci0gICAgfSAKLSAgZWxzZQotICAgIHsKLSAgICAgICgqcGFyZW50KS0+cmlnaHQgPSBuLT5sZWZ0OwotICAgICAgbi0+bGVmdCA9ICpwYXJlbnQ7Ci0gICAgICAoKmdyYW5kcGFyZW50KS0+bGVmdCA9IG4tPnJpZ2h0OwotICAgICAgbi0+cmlnaHQgPSAqZ3JhbmRwYXJlbnQ7Ci0gICAgICAqZ3JhbmRwYXJlbnQgPSBuOwotICAgICAgcmV0dXJuIG47Ci0gICAgfQotfQotCi0vKiBTcGxheSBTUCBhcm91bmQgS0VZLiAgKi8KLQotc3RhdGljIHZvaWQKLXNwbGF5X3RyZWVfc3BsYXkgKHNwLCBrZXkpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLXsKLSAgaWYgKHNwLT5yb290ID09IDApCi0gICAgcmV0dXJuOwotCi0gIHNwbGF5X3RyZWVfc3BsYXlfaGVscGVyIChzcCwga2V5LCAmc3AtPnJvb3QsIAotCQkJICAgLypncmFuZHBhcmVudD0qLzAsIC8qcGFyZW50PSovMCk7IAotfQotCi0vKiBDYWxsIEZOLCBwYXNzaW5nIGl0IHRoZSBEQVRBLCBmb3IgZXZlcnkgbm9kZSBiZWxvdyBOT0RFLCBhbGwgb2YKLSAgIHdoaWNoIGFyZSBmcm9tIFNQLCBmb2xsb3dpbmcgYW4gaW4tb3JkZXIgdHJhdmVyc2FsLiAgSWYgRk4gZXZlcnkKLSAgIHJldHVybnMgYSBub24temVybyB2YWx1ZSwgdGhlIGl0ZXJhdGlvbiBjZWFzZXMgaW1tZWRpYXRlbHksIGFuZCB0aGUKLSAgIHZhbHVlIGlzIHJldHVybmVkLiAgT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMC4gICovCi0KLXN0YXRpYyBpbnQKLXNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgKHNwLCBub2RlLCBmbiwgZGF0YSkKLSAgICAgc3BsYXlfdHJlZSBzcDsKLSAgICAgc3BsYXlfdHJlZV9ub2RlIG5vZGU7Ci0gICAgIHNwbGF5X3RyZWVfZm9yZWFjaF9mbiBmbjsKLSAgICAgdm9pZCogZGF0YTsKLXsKLSAgaW50IHZhbDsKLQotICBpZiAoIW5vZGUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdmFsID0gc3BsYXlfdHJlZV9mb3JlYWNoX2hlbHBlciAoc3AsIG5vZGUtPmxlZnQsIGZuLCBkYXRhKTsKLSAgaWYgKHZhbCkKLSAgICByZXR1cm4gdmFsOwotCi0gIHZhbCA9ICgqZm4pKG5vZGUsIGRhdGEpOwotICBpZiAodmFsKQotICAgIHJldHVybiB2YWw7Ci0KLSAgcmV0dXJuIHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgKHNwLCBub2RlLT5yaWdodCwgZm4sIGRhdGEpOwotfQotCi0vKiBBbGxvY2F0ZSBhIG5ldyBzcGxheSB0cmVlLCB1c2luZyBDT01QQVJFX0ZOIHRvIGNvbXBhcmUgbm9kZXMsCi0gICBERUxFVEVfS0VZX0ZOIHRvIGRlYWxsb2NhdGUga2V5cywgYW5kIERFTEVURV9WQUxVRV9GTiB0byBkZWFsbG9jYXRlCi0gICB2YWx1ZXMuICAqLwotCi1zcGxheV90cmVlIAotc3BsYXlfdHJlZV9uZXcgKGNvbXBhcmVfZm4sIGRlbGV0ZV9rZXlfZm4sIGRlbGV0ZV92YWx1ZV9mbikKLSAgICAgc3BsYXlfdHJlZV9jb21wYXJlX2ZuIGNvbXBhcmVfZm47Ci0gICAgIHNwbGF5X3RyZWVfZGVsZXRlX2tleV9mbiBkZWxldGVfa2V5X2ZuOwotICAgICBzcGxheV90cmVlX2RlbGV0ZV92YWx1ZV9mbiBkZWxldGVfdmFsdWVfZm47Ci17Ci0gIHNwbGF5X3RyZWUgc3AgPSAoc3BsYXlfdHJlZSkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3BsYXlfdHJlZSkpOwotICBzcC0+cm9vdCA9IDA7Ci0gIHNwLT5jb21wID0gY29tcGFyZV9mbjsKLSAgc3AtPmRlbGV0ZV9rZXkgPSBkZWxldGVfa2V5X2ZuOwotICBzcC0+ZGVsZXRlX3ZhbHVlID0gZGVsZXRlX3ZhbHVlX2ZuOwotCi0gIHJldHVybiBzcDsKLX0KLQotLyogRGVhbGxvY2F0ZSBTUC4gICovCi0KLXZvaWQgCi1zcGxheV90cmVlX2RlbGV0ZSAoc3ApCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci17Ci0gIHNwbGF5X3RyZWVfZGVsZXRlX2hlbHBlciAoc3AsIHNwLT5yb290KTsKLSAgZnJlZSAoKGNoYXIqKSBzcCk7Ci19Ci0KLS8qIEluc2VydCBhIG5ldyBub2RlIChhc3NvY2lhdGluZyBLRVkgd2l0aCBEQVRBKSBpbnRvIFNQLiAgSWYgYQotICAgcHJldmlvdXMgbm9kZSB3aXRoIHRoZSBpbmRpY2F0ZWQgS0VZIGV4aXN0cywgaXRzIGRhdGEgaXMgcmVwbGFjZWQKLSAgIHdpdGggdGhlIG5ldyB2YWx1ZS4gICovCi0KLXZvaWQgCi1zcGxheV90cmVlX2luc2VydCAoc3AsIGtleSwgdmFsdWUpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGtleTsKLSAgICAgc3BsYXlfdHJlZV92YWx1ZSB2YWx1ZTsKLXsKLSAgaW50IGNvbXBhcmlzb247Ci0KLSAgc3BsYXlfdHJlZV9zcGxheSAoc3AsIGtleSk7Ci0KLSAgaWYgKHNwLT5yb290KQotICAgIGNvbXBhcmlzb24gPSAoKnNwLT5jb21wKShzcC0+cm9vdC0+a2V5LCBrZXkpOwotCi0gIGlmIChzcC0+cm9vdCAmJiBjb21wYXJpc29uID09IDApCi0gICAgewotICAgICAgLyogSWYgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgYWxyZWFkeSBoYXMgdGhlIGluZGljYXRlZCBLRVksIGp1c3QKLQkgcmVwbGFjZSB0aGUgdmFsdWUgd2l0aCBWQUxVRS4gICovCi0gICAgICBpZiAoc3AtPmRlbGV0ZV92YWx1ZSkKLQkoKnNwLT5kZWxldGVfdmFsdWUpKHNwLT5yb290LT52YWx1ZSk7Ci0gICAgICBzcC0+cm9vdC0+dmFsdWUgPSB2YWx1ZTsKLSAgICB9IAotICBlbHNlIAotICAgIHsKLSAgICAgIC8qIENyZWF0ZSBhIG5ldyBub2RlLCBhbmQgaW5zZXJ0IGl0IGF0IHRoZSByb290LiAgKi8KLSAgICAgIHNwbGF5X3RyZWVfbm9kZSBub2RlOwotICAgICAgCi0gICAgICBub2RlID0gKHNwbGF5X3RyZWVfbm9kZSkgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc3BsYXlfdHJlZV9ub2RlKSk7Ci0gICAgICBub2RlLT5rZXkgPSBrZXk7Ci0gICAgICBub2RlLT52YWx1ZSA9IHZhbHVlOwotICAgICAgCi0gICAgICBpZiAoIXNwLT5yb290KQotCW5vZGUtPmxlZnQgPSBub2RlLT5yaWdodCA9IDA7Ci0gICAgICBlbHNlIGlmIChjb21wYXJpc29uIDwgMCkKLQl7Ci0JICBub2RlLT5sZWZ0ID0gc3AtPnJvb3Q7Ci0JICBub2RlLT5yaWdodCA9IG5vZGUtPmxlZnQtPnJpZ2h0OwotCSAgbm9kZS0+bGVmdC0+cmlnaHQgPSAwOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBub2RlLT5yaWdodCA9IHNwLT5yb290OwotCSAgbm9kZS0+bGVmdCA9IG5vZGUtPnJpZ2h0LT5sZWZ0OwotCSAgbm9kZS0+cmlnaHQtPmxlZnQgPSAwOwotCX0KLQotICAgIHNwLT5yb290ID0gbm9kZTsKLSAgfQotfQotCi0vKiBMb29rdXAgS0VZIGluIFNQLCByZXR1cm5pbmcgVkFMVUUgaWYgcHJlc2VudCwgYW5kIE5VTEwgCi0gICBvdGhlcndpc2UuICAqLwotCi1zcGxheV90cmVlX25vZGUKLXNwbGF5X3RyZWVfbG9va3VwIChzcCwga2V5KQotICAgICBzcGxheV90cmVlIHNwOwotICAgICBzcGxheV90cmVlX2tleSBrZXk7Ci17Ci0gIHNwbGF5X3RyZWVfc3BsYXkgKHNwLCBrZXkpOwotCi0gIGlmIChzcC0+cm9vdCAmJiAoKnNwLT5jb21wKShzcC0+cm9vdC0+a2V5LCBrZXkpID09IDApCi0gICAgcmV0dXJuIHNwLT5yb290OwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENhbGwgRk4sIHBhc3NpbmcgaXQgdGhlIERBVEEsIGZvciBldmVyeSBub2RlIGluIFNQLCBmb2xsb3dpbmcgYW4KLSAgIGluLW9yZGVyIHRyYXZlcnNhbC4gIElmIEZOIGV2ZXJ5IHJldHVybnMgYSBub24temVybyB2YWx1ZSwgdGhlCi0gICBpdGVyYXRpb24gY2Vhc2VzIGltbWVkaWF0ZWx5LCBhbmQgdGhlIHZhbHVlIGlzIHJldHVybmVkLgotICAgT3RoZXJ3aXNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMC4gICovCi0KLWludAotc3BsYXlfdHJlZV9mb3JlYWNoIChzcCwgZm4sIGRhdGEpCi0gICAgIHNwbGF5X3RyZWUgc3A7Ci0gICAgIHNwbGF5X3RyZWVfZm9yZWFjaF9mbiBmbjsKLSAgICAgdm9pZCAqZGF0YTsKLXsKLSAgcmV0dXJuIHNwbGF5X3RyZWVfZm9yZWFjaF9oZWxwZXIgKHNwLCBzcC0+cm9vdCwgZm4sIGRhdGEpOwotfQotCi0vKiBTcGxheS10cmVlIGNvbXBhcmlzb24gZnVuY3Rpb24sIHRyZWF0aW5nIHRoZSBrZXlzIGFzIGludHMuICAqLwotCi1pbnQKLXNwbGF5X3RyZWVfY29tcGFyZV9pbnRzIChrMSwgazIpCi0gICAgIHNwbGF5X3RyZWVfa2V5IGsxOwotICAgICBzcGxheV90cmVlX2tleSBrMjsKLXsKLSAgaWYgKChpbnQpIGsxIDwgKGludCkgazIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmICgoaW50KSBrMSA+IChpbnQpIGsyKQotICAgIHJldHVybiAxOwotICBlbHNlIAotICAgIHJldHVybiAwOwotfQotCi0vKiBTcGxheS10cmVlIGNvbXBhcmlzb24gZnVuY3Rpb24sIHRyZWF0aW5nIHRoZSBrZXlzIGFzIHBvaW50ZXJzLiAgKi8KLQotaW50Ci1zcGxheV90cmVlX2NvbXBhcmVfcG9pbnRlcnMgKGsxLCBrMikKLSAgICAgc3BsYXlfdHJlZV9rZXkgazE7Ci0gICAgIHNwbGF5X3RyZWVfa2V5IGsyOwotewotICBpZiAoKGNoYXIqKSBrMSA8IChjaGFyKikgazIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmICgoY2hhciopIGsxID4gKGNoYXIqKSBrMikKLSAgICByZXR1cm4gMTsKLSAgZWxzZSAKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJjYXNlY21wLmMgYi9saWJpYmVydHkvc3RyY2FzZWNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE5MzBiLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJjYXNlY21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTg3IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCi0gKiBwcm92aWRlZCB0aGF0IHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZCBhbmQgdGhhdCBkdWUgY3JlZGl0IGlzIGdpdmVuCi0gKiB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LiBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQotICogbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIFRoaXMgc29mdHdhcmUKLSAqIGlzIHByb3ZpZGVkIGBgYXMgaXMnJyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KLSAqLwotCi0jaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCi1zdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpc3RyY2FzZWNtcC5jCTUuNSAoQmVya2VsZXkpIDExLzI0Lzg3IjsKLSNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIGFycmF5IGlzIGRlc2lnbmVkIGZvciBtYXBwaW5nIHVwcGVyIGFuZCBsb3dlciBjYXNlIGxldHRlcgotICogdG9nZXRoZXIgZm9yIGEgY2FzZSBpbmRlcGVuZGVudCBjb21wYXJpc29uLiAgVGhlIG1hcHBpbmdzIGFyZQotICogYmFzZWQgdXBvbiBhc2NpaSBjaGFyYWN0ZXIgc2VxdWVuY2VzLgotICovCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWM7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBjaGFybWFwW10gPSB7Ci0JKHVjKSdcMDAwJywodWMpJ1wwMDEnLCh1YyknXDAwMicsKHVjKSdcMDAzJywodWMpJ1wwMDQnLCh1YyknXDAwNScsKHVjKSdcMDA2JywodWMpJ1wwMDcnLAotCSh1YyknXDAxMCcsKHVjKSdcMDExJywodWMpJ1wwMTInLCh1YyknXDAxMycsKHVjKSdcMDE0JywodWMpJ1wwMTUnLCh1YyknXDAxNicsKHVjKSdcMDE3JywKLQkodWMpJ1wwMjAnLCh1YyknXDAyMScsKHVjKSdcMDIyJywodWMpJ1wwMjMnLCh1YyknXDAyNCcsKHVjKSdcMDI1JywodWMpJ1wwMjYnLCh1YyknXDAyNycsCi0JKHVjKSdcMDMwJywodWMpJ1wwMzEnLCh1YyknXDAzMicsKHVjKSdcMDMzJywodWMpJ1wwMzQnLCh1YyknXDAzNScsKHVjKSdcMDM2JywodWMpJ1wwMzcnLAotCSh1YyknXDA0MCcsKHVjKSdcMDQxJywodWMpJ1wwNDInLCh1YyknXDA0MycsKHVjKSdcMDQ0JywodWMpJ1wwNDUnLCh1YyknXDA0NicsKHVjKSdcMDQ3JywKLQkodWMpJ1wwNTAnLCh1YyknXDA1MScsKHVjKSdcMDUyJywodWMpJ1wwNTMnLCh1YyknXDA1NCcsKHVjKSdcMDU1JywodWMpJ1wwNTYnLCh1YyknXDA1NycsCi0JKHVjKSdcMDYwJywodWMpJ1wwNjEnLCh1YyknXDA2MicsKHVjKSdcMDYzJywodWMpJ1wwNjQnLCh1YyknXDA2NScsKHVjKSdcMDY2JywodWMpJ1wwNjcnLAotCSh1YyknXDA3MCcsKHVjKSdcMDcxJywodWMpJ1wwNzInLCh1YyknXDA3MycsKHVjKSdcMDc0JywodWMpJ1wwNzUnLCh1YyknXDA3NicsKHVjKSdcMDc3JywKLQkodWMpJ1wxMDAnLCh1YyknXDE0MScsKHVjKSdcMTQyJywodWMpJ1wxNDMnLCh1YyknXDE0NCcsKHVjKSdcMTQ1JywodWMpJ1wxNDYnLCh1YyknXDE0NycsCi0JKHVjKSdcMTUwJywodWMpJ1wxNTEnLCh1YyknXDE1MicsKHVjKSdcMTUzJywodWMpJ1wxNTQnLCh1YyknXDE1NScsKHVjKSdcMTU2JywodWMpJ1wxNTcnLAotCSh1YyknXDE2MCcsKHVjKSdcMTYxJywodWMpJ1wxNjInLCh1YyknXDE2MycsKHVjKSdcMTY0JywodWMpJ1wxNjUnLCh1YyknXDE2NicsKHVjKSdcMTY3JywKLQkodWMpJ1wxNzAnLCh1YyknXDE3MScsKHVjKSdcMTcyJywodWMpJ1wxMzMnLCh1YyknXDEzNCcsKHVjKSdcMTM1JywodWMpJ1wxMzYnLCh1YyknXDEzNycsCi0JKHVjKSdcMTQwJywodWMpJ1wxNDEnLCh1YyknXDE0MicsKHVjKSdcMTQzJywodWMpJ1wxNDQnLCh1YyknXDE0NScsKHVjKSdcMTQ2JywodWMpJ1wxNDcnLAotCSh1YyknXDE1MCcsKHVjKSdcMTUxJywodWMpJ1wxNTInLCh1YyknXDE1MycsKHVjKSdcMTU0JywodWMpJ1wxNTUnLCh1YyknXDE1NicsKHVjKSdcMTU3JywKLQkodWMpJ1wxNjAnLCh1YyknXDE2MScsKHVjKSdcMTYyJywodWMpJ1wxNjMnLCh1YyknXDE2NCcsKHVjKSdcMTY1JywodWMpJ1wxNjYnLCh1YyknXDE2NycsCi0JKHVjKSdcMTcwJywodWMpJ1wxNzEnLCh1YyknXDE3MicsKHVjKSdcMTczJywodWMpJ1wxNzQnLCh1YyknXDE3NScsKHVjKSdcMTc2JywodWMpJ1wxNzcnLAotCSh1YyknXDIwMCcsKHVjKSdcMjAxJywodWMpJ1wyMDInLCh1YyknXDIwMycsKHVjKSdcMjA0JywodWMpJ1wyMDUnLCh1YyknXDIwNicsKHVjKSdcMjA3JywKLQkodWMpJ1wyMTAnLCh1YyknXDIxMScsKHVjKSdcMjEyJywodWMpJ1wyMTMnLCh1YyknXDIxNCcsKHVjKSdcMjE1JywodWMpJ1wyMTYnLCh1YyknXDIxNycsCi0JKHVjKSdcMjIwJywodWMpJ1wyMjEnLCh1YyknXDIyMicsKHVjKSdcMjIzJywodWMpJ1wyMjQnLCh1YyknXDIyNScsKHVjKSdcMjI2JywodWMpJ1wyMjcnLAotCSh1YyknXDIzMCcsKHVjKSdcMjMxJywodWMpJ1wyMzInLCh1YyknXDIzMycsKHVjKSdcMjM0JywodWMpJ1wyMzUnLCh1YyknXDIzNicsKHVjKSdcMjM3JywKLQkodWMpJ1wyNDAnLCh1YyknXDI0MScsKHVjKSdcMjQyJywodWMpJ1wyNDMnLCh1YyknXDI0NCcsKHVjKSdcMjQ1JywodWMpJ1wyNDYnLCh1YyknXDI0NycsCi0JKHVjKSdcMjUwJywodWMpJ1wyNTEnLCh1YyknXDI1MicsKHVjKSdcMjUzJywodWMpJ1wyNTQnLCh1YyknXDI1NScsKHVjKSdcMjU2JywodWMpJ1wyNTcnLAotCSh1YyknXDI2MCcsKHVjKSdcMjYxJywodWMpJ1wyNjInLCh1YyknXDI2MycsKHVjKSdcMjY0JywodWMpJ1wyNjUnLCh1YyknXDI2NicsKHVjKSdcMjY3JywKLQkodWMpJ1wyNzAnLCh1YyknXDI3MScsKHVjKSdcMjcyJywodWMpJ1wyNzMnLCh1YyknXDI3NCcsKHVjKSdcMjc1JywodWMpJ1wyNzYnLCh1YyknXDI3NycsCi0JKHVjKSdcMzAwJywodWMpJ1wzNDEnLCh1YyknXDM0MicsKHVjKSdcMzQzJywodWMpJ1wzNDQnLCh1YyknXDM0NScsKHVjKSdcMzQ2JywodWMpJ1wzNDcnLAotCSh1YyknXDM1MCcsKHVjKSdcMzUxJywodWMpJ1wzNTInLCh1YyknXDM1MycsKHVjKSdcMzU0JywodWMpJ1wzNTUnLCh1YyknXDM1NicsKHVjKSdcMzU3JywKLQkodWMpJ1wzNjAnLCh1YyknXDM2MScsKHVjKSdcMzYyJywodWMpJ1wzNjMnLCh1YyknXDM2NCcsKHVjKSdcMzY1JywodWMpJ1wzNjYnLCh1YyknXDM2NycsCi0JKHVjKSdcMzcwJywodWMpJ1wzNzEnLCh1YyknXDM3MicsKHVjKSdcMzMzJywodWMpJ1wzMzQnLCh1YyknXDMzNScsKHVjKSdcMzM2JywodWMpJ1wzMzcnLAotCSh1YyknXDM0MCcsKHVjKSdcMzQxJywodWMpJ1wzNDInLCh1YyknXDM0MycsKHVjKSdcMzQ0JywodWMpJ1wzNDUnLCh1YyknXDM0NicsKHVjKSdcMzQ3JywKLQkodWMpJ1wzNTAnLCh1YyknXDM1MScsKHVjKSdcMzUyJywodWMpJ1wzNTMnLCh1YyknXDM1NCcsKHVjKSdcMzU1JywodWMpJ1wzNTYnLCh1YyknXDM1NycsCi0JKHVjKSdcMzYwJywodWMpJ1wzNjEnLCh1YyknXDM2MicsKHVjKSdcMzYzJywodWMpJ1wzNjQnLCh1YyknXDM2NScsKHVjKSdcMzY2JywodWMpJ1wzNjcnLAotCSh1YyknXDM3MCcsKHVjKSdcMzcxJywodWMpJ1wzNzInLCh1YyknXDM3MycsKHVjKSdcMzc0JywodWMpJ1wzNzUnLCh1YyknXDM3NicsKHVjKSdcMzc3JywKLX07Ci0KLWludAotc3RyY2FzZWNtcChzMSwgczIpCi0gICAgY29uc3QgY2hhciAqczEsICpzMjsKLXsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHUxLCB1MjsKLQotICAgIGZvciAoOzspIHsKLQl1MSA9ICh1bnNpZ25lZCBjaGFyKSAqczErKzsKLQl1MiA9ICh1bnNpZ25lZCBjaGFyKSAqczIrKzsKLQlpZiAoY2hhcm1hcFt1MV0gIT0gY2hhcm1hcFt1Ml0pIHsKLQkgICAgcmV0dXJuIGNoYXJtYXBbdTFdIC0gY2hhcm1hcFt1Ml07Ci0JfQotCWlmICh1MSA9PSAnXDAnKSB7Ci0JICAgIHJldHVybiAwOwotCX0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJjaHIuYyBiL2xpYmliZXJ0eS9zdHJjaHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUwNDgwZi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RyY2hyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBQb3J0YWJsZSB2ZXJzaW9uIG9mIHN0cmNocigpCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotLyoKLU5BTUUKLQlzdHJjaHIgLS0gcmV0dXJuIHBvaW50ZXIgdG8gZmlyc3Qgb2NjdXJhbmNlIG9mIGEgY2hhcmFjdGVyCi0KLVNZTk9QU0lTCi0JY2hhciAqc3RyY2hyIChjb25zdCBjaGFyICpzLCBpbnQgYykKLQotREVTQ1JJUFRJT04KLQlSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGNoYXJhY3RlciBDIGluCi0Jc3RyaW5nIFMsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vIG9jY3VyYW5jZSBpcyBmb3VuZC4KLQkKLUJVR1MKLQlCZWhhdmlvciB3aGVuIGNoYXJhY3RlciBpcyB0aGUgbnVsbCBjaGFyYWN0ZXIgaXMgaW1wbGVtZW50YXRpb24KLQlkZXBlbmRlbnQuCi0qLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLQotY2hhciAqCi1zdHJjaHIgKHMsIGMpCi0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnM7Ci0gIGludCBjOwotewotICBkbyB7Ci0gICAgaWYgKCpzID09IGMpCi0gICAgICB7Ci0JcmV0dXJuIChjaGFyKilzOwotICAgICAgfQotICB9IHdoaWxlICgqcysrKTsKLSAgcmV0dXJuICgwKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJkdXAuYyBiL2xpYmliZXJ0eS9zdHJkdXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4NWIzNC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RyZHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1jaGFyICoKLXN0cmR1cChzKQotICAgICBjaGFyICpzOwotewotICAgIGNoYXIgKnJlc3VsdCA9IChjaGFyKiltYWxsb2Moc3RybGVuKHMpICsgMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAoY2hhciopMCkKLQlyZXR1cm4gKGNoYXIqKTA7Ci0gICAgc3RyY3B5KHJlc3VsdCwgcyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJlcnJvci5jIGIvbGliaWJlcnR5L3N0cmVycm9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NGNjNzUuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cmVycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MzEgKzAsMCBAQAotLyogRXh0ZW5kZWQgc3VwcG9ydCBmb3IgdXNpbmcgZXJybm8gdmFsdWVzLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2guICBmbmZAY3lnbnVzLmNvbQotICAgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgLS1QZXIgQm90aG5lci4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZmRlZiBIQVZFX1NZU19FUlJMSVNUCi0vKiBOb3RlIHRoYXQgZXJybm8uaCAobm90IHN1cmUgd2hhdCBPUykgb3Igc3RkaW8uaCAoQlNEIDQuNCwgYXQgbGVhc3QpCi0gICBtaWdodCBkZWNsYXJlIHN5c19lcnJsaXN0IGluIGEgd2F5IHRoYXQgdGhlIGNvbXBpbGVyIG1pZ2h0IGNvbnNpZGVyCi0gICBpbmNvbXBhdGlibGUgd2l0aCBvdXIgbGF0ZXIgZGVjbGFyYXRpb24sIHBlcmhhcHMgYnkgdXNpbmcgY29uc3QKLSAgIGF0dHJpYnV0ZXMuICBTbyB3ZSBoaWRlIHRoZSBkZWNsYXJhdGlvbiBpbiBlcnJuby5oIChpZiBhbnkpIHVzaW5nIGEKLSAgIG1hY3JvLiAqLwotI2RlZmluZSBzeXNfZXJybGlzdCBzeXNfZXJybGlzdF9fCi0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2lmZGVmIEhBVkVfU1lTX0VSUkxJU1QKLSN1bmRlZiBzeXNfZXJybGlzdAotI2VuZGlmCi0KLS8qICBSb3V0aW5lcyBpbXBvcnRlZCBmcm9tIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJpZXMuICovCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotZXh0ZXJuIHZvaWQgKm1hbGxvYyAoc2l6ZV90IHNpemUpOwkJCQkvKiA0LjEwLjMuMyAqLwotZXh0ZXJuIHZvaWQgKm1lbXNldCAodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsJCQkvKiA0LjExLjYuMSAqLwotI2Vsc2UJLyogIV9fU1REQ19fICovCi1leHRlcm4gY2hhciAqbWFsbG9jICgpOwkJLyogU3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRlciAqLwotZXh0ZXJuIGNoYXIgKm1lbXNldCAoKTsKLSNlbmRpZgkvKiBfX1NURENfXyAqLwotCi0jaWZuZGVmIE1BWAotIyAgZGVmaW5lIE1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jZW5kaWYKLQotc3RhdGljIHZvaWQgaW5pdF9lcnJvcl90YWJsZXMgUEFSQU1TICgodm9pZCkpOwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBmb3IgZXJybm8gdmFsdWVzLiAgU2VlIGludHJvKDIpIGluIG1vc3QgVU5JWCBzeXN0ZW1zCi0gICBQcm9ncmFtbWVycyBSZWZlcmVuY2UgTWFudWFscy4KLQotICAgTm90ZSB0aGF0IHRoaXMgdGFibGUgaXMgZ2VuZXJhbGx5IG9ubHkgYWNjZXNzZWQgd2hlbiBpdCBpcyB1c2VkIGF0IHJ1bnRpbWUKLSAgIHRvIGluaXRpYWxpemUgZXJybm8gbmFtZSBhbmQgbWVzc2FnZSB0YWJsZXMgdGhhdCBhcmUgaW5kZXhlZCBieSBlcnJubwotICAgdmFsdWUuCi0KLSAgIE5vdCBhbGwgb2YgdGhlc2UgZXJybm9zIHdpbGwgZXhpc3Qgb24gYWxsIHN5c3RlbXMuICBUaGlzIHRhYmxlIGlzIHRoZSBvbmx5Ci0gICB0aGluZyB0aGF0IHNob3VsZCBoYXZlIHRvIGJlIHVwZGF0ZWQgYXMgbmV3IGVycm9yIG51bWJlcnMgYXJlIGludHJvZHVjZWQuCi0gICBJdCdzIHNvcnQgb2YgdWdseSwgYnV0IGF0IGxlYXN0IGl0cyBwb3J0YWJsZS4gKi8KLQotc3RydWN0IGVycm9yX2luZm8KLXsKLSAgaW50IHZhbHVlOwkJLyogVGhlIG51bWVyaWMgdmFsdWUgZnJvbSA8ZXJybm8uaD4gKi8KLSAgY29uc3QgY2hhciAqbmFtZTsJLyogVGhlIGVxdWl2YWxlbnQgc3ltYm9saWMgdmFsdWUgKi8KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotICBjb25zdCBjaGFyICptc2c7CS8qIFNob3J0IG1lc3NhZ2UgYWJvdXQgdGhpcyB2YWx1ZSAqLwotI2VuZGlmCi19OwotCi0jaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLSMgICBkZWZpbmUgRU5UUlkodmFsdWUsIG5hbWUsIG1zZykJe3ZhbHVlLCBuYW1lLCBtc2d9Ci0jZWxzZQotIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWV9Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBlcnJvcl9pbmZvIGVycm9yX3RhYmxlW10gPQotewotI2lmIGRlZmluZWQgKEVQRVJNKQotICBFTlRSWShFUEVSTSwgIkVQRVJNIiwgIk5vdCBvd25lciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PRU5UKQotICBFTlRSWShFTk9FTlQsICJFTk9FTlQiLCAiTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNSQ0gpCi0gIEVOVFJZKEVTUkNILCAiRVNSQ0giLCAiTm8gc3VjaCBwcm9jZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSU5UUikKLSAgRU5UUlkoRUlOVFIsICJFSU5UUiIsICJJbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUlPKQotICBFTlRSWShFSU8sICJFSU8iLCAiSS9PIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTlhJTykKLSAgRU5UUlkoRU5YSU8sICJFTlhJTyIsICJObyBzdWNoIGRldmljZSBvciBhZGRyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFMkJJRykKLSAgRU5UUlkoRTJCSUcsICJFMkJJRyIsICJBcmcgbGlzdCB0b28gbG9uZyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PRVhFQykKLSAgRU5UUlkoRU5PRVhFQywgIkVOT0VYRUMiLCAiRXhlYyBmb3JtYXQgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURGKQotICBFTlRSWShFQkFERiwgIkVCQURGIiwgIkJhZCBmaWxlIG51bWJlciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNISUxEKQotICBFTlRSWShFQ0hJTEQsICJFQ0hJTEQiLCAiTm8gY2hpbGQgcHJvY2Vzc2VzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFV09VTERCTE9DSykJLyogUHV0IGJlZm9yZSBFQUdBSU4sIHNvbWV0aW1lcyBhbGlhc2VkICovCi0gIEVOVFJZKEVXT1VMREJMT0NLLCAiRVdPVUxEQkxPQ0siLCAiT3BlcmF0aW9uIHdvdWxkIGJsb2NrIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQUdBSU4pCi0gIEVOVFJZKEVBR0FJTiwgIkVBR0FJTiIsICJObyBtb3JlIHByb2Nlc3NlcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTUVNKQotICBFTlRSWShFTk9NRU0sICJFTk9NRU0iLCAiTm90IGVub3VnaCBzcGFjZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFDQ0VTKQotICBFTlRSWShFQUNDRVMsICJFQUNDRVMiLCAiUGVybWlzc2lvbiBkZW5pZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVGQVVMVCkKLSAgRU5UUlkoRUZBVUxULCAiRUZBVUxUIiwgIkJhZCBhZGRyZXNzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UQkxLKQotICBFTlRSWShFTk9UQkxLLCAiRU5PVEJMSyIsICJCbG9jayBkZXZpY2UgcmVxdWlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCVVNZKQotICBFTlRSWShFQlVTWSwgIkVCVVNZIiwgIkRldmljZSBidXN5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRVhJU1QpCi0gIEVOVFJZKEVFWElTVCwgIkVFWElTVCIsICJGaWxlIGV4aXN0cyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVhERVYpCi0gIEVOVFJZKEVYREVWLCAiRVhERVYiLCAiQ3Jvc3MtZGV2aWNlIGxpbmsiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0RFVikKLSAgRU5UUlkoRU5PREVWLCAiRU5PREVWIiwgIk5vIHN1Y2ggZGV2aWNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9URElSKQotICBFTlRSWShFTk9URElSLCAiRU5PVERJUiIsICJOb3QgYSBkaXJlY3RvcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJU0RJUikKLSAgRU5UUlkoRUlTRElSLCAiRUlTRElSIiwgIklzIGEgZGlyZWN0b3J5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSU5WQUwpCi0gIEVOVFJZKEVJTlZBTCwgIkVJTlZBTCIsICJJbnZhbGlkIGFyZ3VtZW50IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkZJTEUpCi0gIEVOVFJZKEVORklMRSwgIkVORklMRSIsICJGaWxlIHRhYmxlIG92ZXJmbG93IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTUZJTEUpCi0gIEVOVFJZKEVNRklMRSwgIkVNRklMRSIsICJUb28gbWFueSBvcGVuIGZpbGVzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UVFkpCi0gIEVOVFJZKEVOT1RUWSwgIkVOT1RUWSIsICJOb3QgYSB0eXBld3JpdGVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVFhUQlNZKQotICBFTlRSWShFVFhUQlNZLCAiRVRYVEJTWSIsICJUZXh0IGZpbGUgYnVzeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUZCSUcpCi0gIEVOVFJZKEVGQklHLCAiRUZCSUciLCAiRmlsZSB0b28gbGFyZ2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1NQQykKLSAgRU5UUlkoRU5PU1BDLCAiRU5PU1BDIiwgIk5vIHNwYWNlIGxlZnQgb24gZGV2aWNlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU1BJUEUpCi0gIEVOVFJZKEVTUElQRSwgIkVTUElQRSIsICJJbGxlZ2FsIHNlZWsiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVST0ZTKQotICBFTlRSWShFUk9GUywgIkVST0ZTIiwgIlJlYWQtb25seSBmaWxlIHN5c3RlbSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU1MSU5LKQotICBFTlRSWShFTUxJTkssICJFTUxJTksiLCAiVG9vIG1hbnkgbGlua3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQSVBFKQotICBFTlRSWShFUElQRSwgIkVQSVBFIiwgIkJyb2tlbiBwaXBlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRE9NKQotICBFTlRSWShFRE9NLCAiRURPTSIsICJNYXRoIGFyZ3VtZW50IG91dCBvZiBkb21haW4gb2YgZnVuYyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJBTkdFKQotICBFTlRSWShFUkFOR0UsICJFUkFOR0UiLCAiTWF0aCByZXN1bHQgbm90IHJlcHJlc2VudGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT01TRykKLSAgRU5UUlkoRU5PTVNHLCAiRU5PTVNHIiwgIk5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSURSTSkKLSAgRU5UUlkoRUlEUk0sICJFSURSTSIsICJJZGVudGlmaWVyIHJlbW92ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVDSFJORykKLSAgRU5UUlkoRUNIUk5HLCAiRUNIUk5HIiwgIkNoYW5uZWwgbnVtYmVyIG91dCBvZiByYW5nZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUwyTlNZTkMpCi0gIEVOVFJZKEVMMk5TWU5DLCAiRUwyTlNZTkMiLCAiTGV2ZWwgMiBub3Qgc3luY2hyb25pemVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTDNITFQpCi0gIEVOVFJZKEVMM0hMVCwgIkVMM0hMVCIsICJMZXZlbCAzIGhhbHRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUwzUlNUKQotICBFTlRSWShFTDNSU1QsICJFTDNSU1QiLCAiTGV2ZWwgMyByZXNldCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxOUk5HKQotICBFTlRSWShFTE5STkcsICJFTE5STkciLCAiTGluayBudW1iZXIgb3V0IG9mIHJhbmdlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVU5BVENIKQotICBFTlRSWShFVU5BVENILCAiRVVOQVRDSCIsICJQcm90b2NvbCBkcml2ZXIgbm90IGF0dGFjaGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9DU0kpCi0gIEVOVFJZKEVOT0NTSSwgIkVOT0NTSSIsICJObyBDU0kgc3RydWN0dXJlIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUwySExUKQotICBFTlRSWShFTDJITFQsICJFTDJITFQiLCAiTGV2ZWwgMiBoYWx0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVERUFETEspCi0gIEVOVFJZKEVERUFETEssICJFREVBRExLIiwgIkRlYWRsb2NrIGNvbmRpdGlvbiIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PTENLKQotICBFTlRSWShFTk9MQ0ssICJFTk9MQ0siLCAiTm8gcmVjb3JkIGxvY2tzIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBREUpCi0gIEVOVFJZKEVCQURFLCAiRUJBREUiLCAiSW52YWxpZCBleGNoYW5nZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBRFIpCi0gIEVOVFJZKEVCQURSLCAiRUJBRFIiLCAiSW52YWxpZCByZXF1ZXN0IGRlc2NyaXB0b3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVYRlVMTCkKLSAgRU5UUlkoRVhGVUxMLCAiRVhGVUxMIiwgIkV4Y2hhbmdlIGZ1bGwiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT0FOTykKLSAgRU5UUlkoRU5PQU5PLCAiRU5PQU5PIiwgIk5vIGFub2RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQkFEUlFDKQotICBFTlRSWShFQkFEUlFDLCAiRUJBRFJRQyIsICJJbnZhbGlkIHJlcXVlc3QgY29kZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBRFNMVCkKLSAgRU5UUlkoRUJBRFNMVCwgIkVCQURTTFQiLCAiSW52YWxpZCBzbG90IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFREVBRExPQ0spCi0gIEVOVFJZKEVERUFETE9DSywgIkVERUFETE9DSyIsICJGaWxlIGxvY2tpbmcgZGVhZGxvY2sgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCRk9OVCkKLSAgRU5UUlkoRUJGT05ULCAiRUJGT05UIiwgIkJhZCBmb250IGZpbGUgZm9ybWF0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9TVFIpCi0gIEVOVFJZKEVOT1NUUiwgIkVOT1NUUiIsICJEZXZpY2Ugbm90IGEgc3RyZWFtIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9EQVRBKQotICBFTlRSWShFTk9EQVRBLCAiRU5PREFUQSIsICJObyBkYXRhIGF2YWlsYWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVRJTUUpCi0gIEVOVFJZKEVUSU1FLCAiRVRJTUUiLCAiVGltZXIgZXhwaXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PU1IpCi0gIEVOVFJZKEVOT1NSLCAiRU5PU1IiLCAiT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9ORVQpCi0gIEVOVFJZKEVOT05FVCwgIkVOT05FVCIsICJNYWNoaW5lIGlzIG5vdCBvbiB0aGUgbmV0d29yayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PUEtHKQotICBFTlRSWShFTk9QS0csICJFTk9QS0ciLCAiUGFja2FnZSBub3QgaW5zdGFsbGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUkVNT1RFKQotICBFTlRSWShFUkVNT1RFLCAiRVJFTU9URSIsICJPYmplY3QgaXMgcmVtb3RlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9MSU5LKQotICBFTlRSWShFTk9MSU5LLCAiRU5PTElOSyIsICJMaW5rIGhhcyBiZWVuIHNldmVyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBRFYpCi0gIEVOVFJZKEVBRFYsICJFQURWIiwgIkFkdmVydGlzZSBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNSTU5UKQotICBFTlRSWShFU1JNTlQsICJFU1JNTlQiLCAiU3Jtb3VudCBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNPTU0pCi0gIEVOVFJZKEVDT01NLCAiRUNPTU0iLCAiQ29tbXVuaWNhdGlvbiBlcnJvciBvbiBzZW5kIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUFJPVE8pCi0gIEVOVFJZKEVQUk9UTywgIkVQUk9UTyIsICJQcm90b2NvbCBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU1VTFRJSE9QKQotICBFTlRSWShFTVVMVElIT1AsICJFTVVMVElIT1AiLCAiTXVsdGlob3AgYXR0ZW1wdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFRE9URE9UKQotICBFTlRSWShFRE9URE9ULCAiRURPVERPVCIsICJSRlMgc3BlY2lmaWMgZXJyb3IiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVCQURNU0cpCi0gIEVOVFJZKEVCQURNU0csICJFQkFETVNHIiwgIk5vdCBhIGRhdGEgbWVzc2FnZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5BTUVUT09MT05HKQotICBFTlRSWShFTkFNRVRPT0xPTkcsICJFTkFNRVRPT0xPTkciLCAiRmlsZSBuYW1lIHRvbyBsb25nIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFT1ZFUkZMT1cpCi0gIEVOVFJZKEVPVkVSRkxPVywgIkVPVkVSRkxPVyIsICJWYWx1ZSB0b28gbGFyZ2UgZm9yIGRlZmluZWQgZGF0YSB0eXBlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UVU5JUSkKLSAgRU5UUlkoRU5PVFVOSVEsICJFTk9UVU5JUSIsICJOYW1lIG5vdCB1bmlxdWUgb24gbmV0d29yayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUJBREZEKQotICBFTlRSWShFQkFERkQsICJFQkFERkQiLCAiRmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJFTUNIRykKLSAgRU5UUlkoRVJFTUNIRywgIkVSRU1DSEciLCAiUmVtb3RlIGFkZHJlc3MgY2hhbmdlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQkFDQykKLSAgRU5UUlkoRUxJQkFDQywgIkVMSUJBQ0MiLCAiQ2FuIG5vdCBhY2Nlc3MgYSBuZWVkZWQgc2hhcmVkIGxpYnJhcnkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMSUJCQUQpCi0gIEVOVFJZKEVMSUJCQUQsICJFTElCQkFEIiwgIkFjY2Vzc2luZyBhIGNvcnJ1cHRlZCBzaGFyZWQgbGlicmFyeSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQlNDTikKLSAgRU5UUlkoRUxJQlNDTiwgIkVMSUJTQ04iLCAiLmxpYiBzZWN0aW9uIGluIGEub3V0IGNvcnJ1cHRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUxJQk1BWCkKLSAgRU5UUlkoRUxJQk1BWCwgIkVMSUJNQVgiLCAiQXR0ZW1wdGluZyB0byBsaW5rIGluIHRvbyBtYW55IHNoYXJlZCBsaWJyYXJpZXMiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVMSUJFWEVDKQotICBFTlRSWShFTElCRVhFQywgIkVMSUJFWEVDIiwgIkNhbm5vdCBleGVjIGEgc2hhcmVkIGxpYnJhcnkgZGlyZWN0bHkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTFNFUSkKLSAgRU5UUlkoRUlMU0VRLCAiRUlMU0VRIiwgIklsbGVnYWwgYnl0ZSBzZXF1ZW5jZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PU1lTKQotICBFTlRSWShFTk9TWVMsICJFTk9TWVMiLCAiT3BlcmF0aW9uIG5vdCBhcHBsaWNhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTE9PUCkKLSAgRU5UUlkoRUxPT1AsICJFTE9PUCIsICJUb28gbWFueSBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJFU1RBUlQpCi0gIEVOVFJZKEVSRVNUQVJULCAiRVJFU1RBUlQiLCAiSW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwgc2hvdWxkIGJlIHJlc3RhcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVNUUlBJUEUpCi0gIEVOVFJZKEVTVFJQSVBFLCAiRVNUUlBJUEUiLCAiU3RyZWFtcyBwaXBlIGVycm9yIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9URU1QVFkpCi0gIEVOVFJZKEVOT1RFTVBUWSwgIkVOT1RFTVBUWSIsICJEaXJlY3Rvcnkgbm90IGVtcHR5IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFVVNFUlMpCi0gIEVOVFJZKEVVU0VSUywgIkVVU0VSUyIsICJUb28gbWFueSB1c2VycyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5PVFNPQ0spCi0gIEVOVFJZKEVOT1RTT0NLLCAiRU5PVFNPQ0siLCAiU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFREVTVEFERFJSRVEpCi0gIEVOVFJZKEVERVNUQUREUlJFUSwgIkVERVNUQUREUlJFUSIsICJEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTVNHU0laRSkKLSAgRU5UUlkoRU1TR1NJWkUsICJFTVNHU0laRSIsICJNZXNzYWdlIHRvbyBsb25nIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFUFJPVE9UWVBFKQotICBFTlRSWShFUFJPVE9UWVBFLCAiRVBST1RPVFlQRSIsICJQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1BST1RPT1BUKQotICBFTlRSWShFTk9QUk9UT09QVCwgIkVOT1BST1RPT1BUIiwgIlByb3RvY29sIG5vdCBhdmFpbGFibGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVQUk9UT05PU1VQUE9SVCkKLSAgRU5UUlkoRVBST1RPTk9TVVBQT1JULCAiRVBST1RPTk9TVVBQT1JUIiwgIlByb3RvY29sIG5vdCBzdXBwb3J0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTT0NLVE5PU1VQUE9SVCkKLSAgRU5UUlkoRVNPQ0tUTk9TVVBQT1JULCAiRVNPQ0tUTk9TVVBQT1JUIiwgIlNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVPUE5PVFNVUFApCi0gIEVOVFJZKEVPUE5PVFNVUFAsICJFT1BOT1RTVVBQIiwgIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIG9uIHRyYW5zcG9ydCBlbmRwb2ludCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVBGTk9TVVBQT1JUKQotICBFTlRSWShFUEZOT1NVUFBPUlQsICJFUEZOT1NVUFBPUlQiLCAiUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBRk5PU1VQUE9SVCkKLSAgRU5UUlkoRUFGTk9TVVBQT1JULCAiRUFGTk9TVVBQT1JUIiwgIkFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBRERSSU5VU0UpCi0gIEVOVFJZKEVBRERSSU5VU0UsICJFQUREUklOVVNFIiwgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVBRERSTk9UQVZBSUwpCi0gIEVOVFJZKEVBRERSTk9UQVZBSUwsICJFQUREUk5PVEFWQUlMIiwiQ2Fubm90IGFzc2lnbiByZXF1ZXN0ZWQgYWRkcmVzcyIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRU5FVERPV04pCi0gIEVOVFJZKEVORVRET1dOLCAiRU5FVERPV04iLCAiTmV0d29yayBpcyBkb3duIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkVUVU5SRUFDSCkKLSAgRU5UUlkoRU5FVFVOUkVBQ0gsICJFTkVUVU5SRUFDSCIsICJOZXR3b3JrIGlzIHVucmVhY2hhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTkVUUkVTRVQpCi0gIEVOVFJZKEVORVRSRVNFVCwgIkVORVRSRVNFVCIsICJOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBiZWNhdXNlIG9mIHJlc2V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09OTkFCT1JURUQpCi0gIEVOVFJZKEVDT05OQUJPUlRFRCwgIkVDT05OQUJPUlRFRCIsICJTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUNPTk5SRVNFVCkKLSAgRU5UUlkoRUNPTk5SRVNFVCwgIkVDT05OUkVTRVQiLCAiQ29ubmVjdGlvbiByZXNldCBieSBwZWVyIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9CVUZTKQotICBFTlRSWShFTk9CVUZTLCAiRU5PQlVGUyIsICJObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSVNDT05OKQotICBFTlRSWShFSVNDT05OLCAiRUlTQ09OTiIsICJUcmFuc3BvcnQgZW5kcG9pbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOT1RDT05OKQotICBFTlRSWShFTk9UQ09OTiwgIkVOT1RDT05OIiwgIlRyYW5zcG9ydCBlbmRwb2ludCBpcyBub3QgY29ubmVjdGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFU0hVVERPV04pCi0gIEVOVFJZKEVTSFVURE9XTiwgIkVTSFVURE9XTiIsICJDYW5ub3Qgc2VuZCBhZnRlciB0cmFuc3BvcnQgZW5kcG9pbnQgc2h1dGRvd24iKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVUT09NQU5ZUkVGUykKLSAgRU5UUlkoRVRPT01BTllSRUZTLCAiRVRPT01BTllSRUZTIiwgIlRvbyBtYW55IHJlZmVyZW5jZXM6IGNhbm5vdCBzcGxpY2UiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVUSU1FRE9VVCkKLSAgRU5UUlkoRVRJTUVET1VULCAiRVRJTUVET1VUIiwgIkNvbm5lY3Rpb24gdGltZWQgb3V0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFQ09OTlJFRlVTRUQpCi0gIEVOVFJZKEVDT05OUkVGVVNFRCwgIkVDT05OUkVGVVNFRCIsICJDb25uZWN0aW9uIHJlZnVzZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVIT1NURE9XTikKLSAgRU5UUlkoRUhPU1RET1dOLCAiRUhPU1RET1dOIiwgIkhvc3QgaXMgZG93biIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUhPU1RVTlJFQUNIKQotICBFTlRSWShFSE9TVFVOUkVBQ0gsICJFSE9TVFVOUkVBQ0giLCAiTm8gcm91dGUgdG8gaG9zdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRUFMUkVBRFkpCi0gIEVOVFJZKEVBTFJFQURZLCAiRUFMUkVBRFkiLCAiT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVJTlBST0dSRVNTKQotICBFTlRSWShFSU5QUk9HUkVTUywgIkVJTlBST0dSRVNTIiwgIk9wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVTVEFMRSkKLSAgRU5UUlkoRVNUQUxFLCAiRVNUQUxFIiwgIlN0YWxlIE5GUyBmaWxlIGhhbmRsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVVDTEVBTikKLSAgRU5UUlkoRVVDTEVBTiwgIkVVQ0xFQU4iLCAiU3RydWN0dXJlIG5lZWRzIGNsZWFuaW5nIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFTk9UTkFNKQotICBFTlRSWShFTk9UTkFNLCAiRU5PVE5BTSIsICJOb3QgYSBYRU5JWCBuYW1lZCB0eXBlIGZpbGUiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKEVOQVZBSUwpCi0gIEVOVFJZKEVOQVZBSUwsICJFTkFWQUlMIiwgIk5vIFhFTklYIHNlbWFwaG9yZXMgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChFSVNOQU0pCi0gIEVOVFJZKEVJU05BTSwgIkVJU05BTSIsICJJcyBhIG5hbWVkIHR5cGUgZmlsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoRVJFTU9URUlPKQotICBFTlRSWShFUkVNT1RFSU8sICJFUkVNT1RFSU8iLCAiUmVtb3RlIEkvTyBlcnJvciIpLAotI2VuZGlmCi0gIEVOVFJZKDAsIE5VTEwsIE5VTEwpCi19OwotCi0jaWZkZWYgRVZNU0VSUgotLyogVGhpcyBpcyBub3QgaW4gdGhlIHRhYmxlLCBiZWNhdXNlIHRoZSBudW1lcmljIHZhbHVlIG9mIEVWTVNFUlIgKDMyNzY3KQotICAgbGllcyBvdXRzaWRlIHRoZSByYW5nZSBvZiBzeXNfZXJybGlzdFtdLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgeyBpbnQgdmFsdWU7IGNvbnN0IGNoYXIgKm5hbWUsICptc2c7IH0KLSAgZXZtc2VyciA9IHsgRVZNU0VSUiwgIkVWTVNFUlIiLCAiVk1TLXNwZWNpZmljIGVycm9yIiB9OwotI2VuZGlmCi0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZS4gIEluZGV4ZWQgYnkgdGhlCi0gICBlcnJubyB2YWx1ZSB0byBmaW5kIHRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlLiAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqKmVycm9yX25hbWVzOwotc3RhdGljIGludCBudW1fZXJyb3JfbmFtZXMgPSAwOwotCi0vKiBUcmFuc2xhdGlvbiB0YWJsZSBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGF0IHJ1bnRpbWUsIGlmIGl0IGRvZXMgbm90Ci0gICBhbHJlYWR5IGV4aXN0IGluIHRoZSBob3N0IGVudmlyb25tZW50LiAgSW5kZXhlZCBieSB0aGUgZXJybm8gdmFsdWUgdG8gZmluZAotICAgdGhlIGRlc2NyaXB0aXZlIHN0cmluZy4KLQotICAgV2UgZG9uJ3QgZXhwb3J0IGl0IGZvciB1c2UgaW4gb3RoZXIgbW9kdWxlcyBiZWNhdXNlIGV2ZW4gdGhvdWdoIGl0IGhhcyB0aGUKLSAgIHNhbWUgbmFtZSwgaXQgZGlmZmVycyBmcm9tIG90aGVyIGltcGxlbWVudGF0aW9ucyBpbiB0aGF0IGl0IGlzIGR5bmFtaWNhbGx5Ci0gICBpbml0aWFsaXplZCByYXRoZXIgdGhhbiBzdGF0aWNhbGx5IGluaXRpYWxpemVkLiAqLwotCi0jaWZuZGVmIEhBVkVfU1lTX0VSUkxJU1QKLQotc3RhdGljIGludCBzeXNfbmVycjsKLXN0YXRpYyBjb25zdCBjaGFyICoqc3lzX2Vycmxpc3Q7Ci0KLSNlbHNlCi0KLWV4dGVybiBpbnQgc3lzX25lcnI7Ci1leHRlcm4gY2hhciAqc3lzX2Vycmxpc3RbXTsKLQotI2VuZGlmCi0KLQotLyoKLQotTkFNRQotCi0JaW5pdF9lcnJvcl90YWJsZXMgLS0gaW5pdGlhbGl6ZSB0aGUgbmFtZSBhbmQgbWVzc2FnZSB0YWJsZXMKLQotU1lOT1BTSVMKLQotCXN0YXRpYyB2b2lkIGluaXRfZXJyb3JfdGFibGVzICgpOwotCi1ERVNDUklQVElPTgotCi0JVXNpbmcgdGhlIGVycm9yX3RhYmxlLCB3aGljaCBpcyBpbml0aWFsaXplZCBhdCBjb21waWxlIHRpbWUsIGdlbmVyYXRlCi0JdGhlIGVycm9yX25hbWVzIGFuZCB0aGUgc3lzX2Vycmxpc3QgKGlmIG5lZWRlZCkgdGFibGVzLCB3aGljaCBhcmUKLQlpbmRleGVkIGF0IHJ1bnRpbWUgYnkgYSBzcGVjaWZpYyBlcnJubyB2YWx1ZS4KLQotQlVHUwotCi0JVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB0YWJsZXMgbWF5IGZhaWwgdW5kZXIgbG93IG1lbW9yeSBjb25kaXRpb25zLAotCWluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgZG8gYW55dGhpbmcgcGFydGljdWxhcmx5IHVzZWZ1bCwgYnV0IHdlIGRvbid0Ci0JYm9tYiBlaXRoZXIuICBXaG8ga25vd3MsIGl0IG1pZ2h0IHN1Y2NlZWQgYXQgYSBsYXRlciBwb2ludCBpZiB3ZSBmcmVlCi0Jc29tZSBtZW1vcnkgaW4gdGhlIG1lYW50aW1lLiAgSW4gYW55IGNhc2UsIHRoZSBvdGhlciByb3V0aW5lcyBrbm93Ci0JaG93IHRvIGRlYWwgd2l0aCBsYWNrIG9mIGEgdGFibGUgYWZ0ZXIgdHJ5aW5nIHRvIGluaXRpYWxpemUgaXQuICBUaGlzCi0JbWF5IG9yIG1heSBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBhIGJ1ZywgdGhhdCB3ZSBkb24ndCBzcGVjaWZpY2FsbHkKLQl3YXJuIGFib3V0IHRoaXMgcGFydGljdWxhciBmYWlsdXJlIG1vZGUuCi0KLSovCi0KLXN0YXRpYyB2b2lkCi1pbml0X2Vycm9yX3RhYmxlcyAoKQotewotICBjb25zdCBzdHJ1Y3QgZXJyb3JfaW5mbyAqZWlwOwotICBpbnQgbmJ5dGVzOwotCi0gIC8qIElmIHdlIGhhdmVuJ3QgYWxyZWFkeSBzY2FubmVkIHRoZSBlcnJvcl90YWJsZSBvbmNlIHRvIGZpbmQgdGhlIG1heGltdW0KLSAgICAgZXJybm8gdmFsdWUsIHRoZW4gZ28gZmluZCBpdCBub3cuICovCi0KLSAgaWYgKG51bV9lcnJvcl9uYW1lcyA9PSAwKQotICAgIHsKLSAgICAgIGZvciAoZWlwID0gZXJyb3JfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCXsKLQkgIGlmIChlaXAgLT4gdmFsdWUgPj0gbnVtX2Vycm9yX25hbWVzKQotCSAgICB7Ci0JICAgICAgbnVtX2Vycm9yX25hbWVzID0gZWlwIC0+IHZhbHVlICsgMTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogTm93IGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIGVycm9yX25hbWVzIHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KLSAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIGVycm9yX3RhYmxlLiAqLwotCi0gIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5ieXRlcyA9IG51bV9lcnJvcl9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoZXJyb3JfbmFtZXMgPSAoY29uc3QgY2hhciAqKikgbWFsbG9jIChuYnl0ZXMpKSAhPSBOVUxMKQotCXsKLQkgIG1lbXNldCAoZXJyb3JfbmFtZXMsIDAsIG5ieXRlcyk7Ci0JICBmb3IgKGVpcCA9IGVycm9yX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQkgICAgewotCSAgICAgIGVycm9yX25hbWVzW2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbmFtZTsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi0gIC8qIE5vdyBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzeXNfZXJybGlzdCB0YWJsZSwgemVybyBpdCBvdXQsIGFuZCB0aGVuCi0gICAgIGluaXRpYWxpemUgaXQgZnJvbSB0aGUgc3RhdGljYWxseSBpbml0aWFsaXplZCBlcnJvcl90YWJsZS4gKi8KLQotICBpZiAoc3lzX2Vycmxpc3QgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBuYnl0ZXMgPSBudW1fZXJyb3JfbmFtZXMgKiBzaXplb2YgKGNoYXIgKik7Ci0gICAgICBpZiAoKHN5c19lcnJsaXN0ID0gKGNvbnN0IGNoYXIgKiopIG1hbGxvYyAobmJ5dGVzKSkgIT0gTlVMTCkKLQl7Ci0JICBtZW1zZXQgKHN5c19lcnJsaXN0LCAwLCBuYnl0ZXMpOwotCSAgc3lzX25lcnIgPSBudW1fZXJyb3JfbmFtZXM7Ci0JICBmb3IgKGVpcCA9IGVycm9yX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQkgICAgewotCSAgICAgIHN5c19lcnJsaXN0W2VpcCAtPiB2YWx1ZV0gPSBlaXAgLT4gbXNnOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2VuZGlmCi0KLX0KLQotLyoKLQotTkFNRQotCi0JZXJybm9fbWF4IC0tIHJldHVybiB0aGUgbWF4IGVycm5vIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgZXJybm9fbWF4ICgpOwotCi1ERVNDUklQVElPTgotCi0JUmV0dXJucyB0aGUgbWF4aW11bSBlcnJubyB2YWx1ZSBmb3Igd2hpY2ggYSBjb3JyZXNwb25kaW5nIHN5bWJvbGljCi0JbmFtZSBvciBtZXNzYWdlIGlzIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBpbiB0aGUgY2FzZSB3aGVyZQotCXdlIHVzZSB0aGUgc3lzX2Vycmxpc3Qgc3VwcGxpZWQgYnkgdGhlIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgZm9yCi0JdGhlcmUgdG8gYmUgbW9yZSBzeW1ib2xpYyBuYW1lcyB0aGFuIG1lc3NhZ2VzLCBvciB2aWNlIHZlcnNhLgotCUluIGZhY3QsIHRoZSBtYW51YWwgcGFnZSBmb3IgcGVycm9yKDNDKSBleHBsaWNpdGx5IHdhcm5zIHRoYXQgb25lCi0Jc2hvdWxkIGNoZWNrIHRoZSBzaXplIG9mIHRoZSB0YWJsZSAoc3lzX25lcnIpIGJlZm9yZSBpbmRleGluZyBpdCwKLQlzaW5jZSBuZXcgZXJyb3IgY29kZXMgbWF5IGJlIGFkZGVkIHRvIHRoZSBzeXN0ZW0gYmVmb3JlIHRoZXkgYXJlCi0JYWRkZWQgdG8gdGhlIHRhYmxlLiAgVGh1cyBzeXNfbmVyciBtaWdodCBiZSBzbWFsbGVyIHRoYW4gdmFsdWUKLQlpbXBsaWVkIGJ5IHRoZSBsYXJnZXN0IGVycm5vIHZhbHVlIGRlZmluZWQgaW4gPGVycm5vLmg+LgotCi0JV2UgcmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgdG8gb2J0YWluIGEgbWVhbmluZ2Z1bAotCXN5bWJvbGljIG5hbWUgb3IgbWVzc2FnZS4KLQotKi8KLQotaW50Ci1lcnJub19tYXggKCkKLXsKLSAgaW50IG1heHNpemU7Ci0KLSAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0gICAgfQotICBtYXhzaXplID0gTUFYIChzeXNfbmVyciwgbnVtX2Vycm9yX25hbWVzKTsKLSAgcmV0dXJuIChtYXhzaXplIC0gMSk7Ci19Ci0KLSNpZm5kZWYgSEFWRV9TVFJFUlJPUgotCi0vKgotCi1OQU1FCi0KLQlzdHJlcnJvciAtLSBtYXAgYW4gZXJyb3IgbnVtYmVyIHRvIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nCi0KLVNZTk9QU0lTCi0KLQljaGFyICpzdHJlcnJvciAoaW50IGVycm5vdmFsKQotCi1ERVNDUklQVElPTgotCi0JTWFwcyBhbiBlcnJubyBudW1iZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBzdHJpbmcsIHRoZSBjb250ZW50cyBvZgotCXdoaWNoIGFyZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkLiAgT24gc3lzdGVtcyB3aGljaCBoYXZlIHRoZSBleHRlcm5hbAotCXZhcmlhYmxlcyBzeXNfbmVyciBhbmQgc3lzX2Vycmxpc3QsIHRoZXNlIHN0cmluZ3Mgd2lsbCBiZSB0aGUgc2FtZQotCWFzIHRoZSBvbmVzIHVzZWQgYnkgcGVycm9yKCkuCi0KLQlJZiB0aGUgc3VwcGxpZWQgZXJyb3IgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcwotCWZvciB0aGUgc3lzX2Vycmxpc3QsIGJ1dCBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZSBmb3IgdGhlIHBhcnRpY3VsYXIKLQllcnJvciBudW1iZXIsIHRoZW4gcmV0dXJucyB0aGUgc3RyaW5nICJFcnJvciBOVU0iLCB3aGVyZSBOVU0gaXMgdGhlCi0JZXJyb3IgbnVtYmVyLgotCi0JSWYgdGhlIHN1cHBsaWVkIGVycm9yIG51bWJlciBpcyBub3QgYSB2YWxpZCBpbmRleCBpbnRvIHN5c19lcnJsaXN0LAotCXJldHVybnMgTlVMTC4KLQotCVRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIG9ubHkgdW50aWwgdGhlCi0JbmV4dCBjYWxsIHRvIHN0cmVycm9yLgotCi0qLwotCi1jaGFyICoKLXN0cmVycm9yIChlcnJub3ZhbCkKLSAgaW50IGVycm5vdmFsOwotewotICBjaGFyICptc2c7Ci0gIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0KLSNpZm5kZWYgSEFWRV9TWVNfRVJSTElTVAotCi0gIGlmIChlcnJvcl9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfZXJyb3JfdGFibGVzICgpOwotICAgIH0KLQotI2VuZGlmCi0KLSAgaWYgKChlcnJub3ZhbCA8IDApIHx8IChlcnJub3ZhbCA+PSBzeXNfbmVycikpCi0gICAgewotI2lmZGVmIEVWTVNFUlIKLSAgICAgIGlmIChlcnJub3ZhbCA9PSBldm1zZXJyLnZhbHVlKQotCW1zZyA9IGV2bXNlcnIubXNnOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAvKiBPdXQgb2YgcmFuZ2UsIGp1c3QgcmV0dXJuIE5VTEwgKi8KLSAgICAgIG1zZyA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoc3lzX2Vycmxpc3QgPT0gTlVMTCkgfHwgKHN5c19lcnJsaXN0W2Vycm5vdmFsXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIHN5c19lcnJsaXN0IG9yIG5vIGVudHJ5IGF0IHRoaXMgaW5kZXguICovCi0gICAgICBzcHJpbnRmIChidWYsICJFcnJvciAlZCIsIGVycm5vdmFsKTsKLSAgICAgIG1zZyA9IGJ1ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYW5kIGEgdmFsaWQgbWVzc2FnZS4gIEp1c3QgcmV0dXJuIHRoZSBtZXNzYWdlLiAqLwotICAgICAgbXNnID0gKGNoYXIgKikgc3lzX2Vycmxpc3RbZXJybm92YWxdOwotICAgIH0KLSAgCi0gIHJldHVybiAobXNnKTsKLX0KLQotI2VuZGlmCS8qICEgSEFWRV9TVFJFUlJPUiAqLwotCi0KLS8qCi0KLU5BTUUKLQotCXN0cmVycm5vIC0tIG1hcCBhbiBlcnJvciBudW1iZXIgdG8gYSBzeW1ib2xpYyBuYW1lIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY29uc3QgY2hhciAqc3RyZXJybm8gKGludCBlcnJub3ZhbCkKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIGFuIGVycm9yIG51bWJlciByZXR1cm5lZCBmcm9tIGEgc3lzdGVtIGNhbGwgKHR5cGljYWxseQotCXJldHVybmVkIGluIGVycm5vKSwgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUKLQlzeW1ib2xpYyBuYW1lIG9mIHRoYXQgZXJyb3IgbnVtYmVyLCBhcyBmb3VuZCBpbiA8ZXJybm8uaD4uCi0KLQlJZiB0aGUgc3VwcGxpZWQgZXJyb3IgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcwotCWZvciBzeW1ib2xpYyBuYW1lcywgYnV0IG5vIG5hbWUgaXMgYXZhaWxhYmxlIGZvciB0aGUgcGFydGljdWxhcgotCWVycm9yIG51bWJlciwgdGhlbiByZXR1cm5zIHRoZSBzdHJpbmcgIkVycm9yIE5VTSIsIHdoZXJlIE5VTSBpcwotCXRoZSBlcnJvciBudW1iZXIuCi0KLQlJZiB0aGUgc3VwcGxpZWQgZXJyb3IgbnVtYmVyIGlzIG5vdCB3aXRoaW4gdGhlIHJhbmdlIG9mIHZhbGlkCi0JaW5kaWNlcywgdGhlbiByZXR1cm5zIE5VTEwuCi0KLUJVR1MKLQotCVRoZSBjb250ZW50cyBvZiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBhcmUgb25seSBndWFyYW50ZWVkIHRvIGJlCi0JdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBzdHJlcnJuby4KLQotKi8KLQotY29uc3QgY2hhciAqCi1zdHJlcnJubyAoZXJybm92YWwpCi0gIGludCBlcnJub3ZhbDsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotICBpZiAoZXJyb3JfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X2Vycm9yX3RhYmxlcyAoKTsKLSAgICB9Ci0KLSAgaWYgKChlcnJub3ZhbCA8IDApIHx8IChlcnJub3ZhbCA+PSBudW1fZXJyb3JfbmFtZXMpKQotICAgIHsKLSNpZmRlZiBFVk1TRVJSCi0gICAgICBpZiAoZXJybm92YWwgPT0gZXZtc2Vyci52YWx1ZSkKLQluYW1lID0gZXZtc2Vyci5uYW1lOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAvKiBPdXQgb2YgcmFuZ2UsIGp1c3QgcmV0dXJuIE5VTEwgKi8KLSAgICAgIG5hbWUgPSBOVUxMOwotICAgIH0KLSAgZWxzZSBpZiAoKGVycm9yX25hbWVzID09IE5VTEwpIHx8IChlcnJvcl9uYW1lc1tlcnJub3ZhbF0gPT0gTlVMTCkpCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGJ1dCBubyBlcnJvcl9uYW1lcyBvciBubyBlbnRyeSBhdCB0aGlzIGluZGV4LiAqLwotICAgICAgc3ByaW50ZiAoYnVmLCAiRXJyb3IgJWQiLCBlcnJub3ZhbCk7Ci0gICAgICBuYW1lID0gKGNvbnN0IGNoYXIgKikgYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBuYW1lLiAgSnVzdCByZXR1cm4gdGhlIG5hbWUuICovCi0gICAgICBuYW1lID0gZXJyb3JfbmFtZXNbZXJybm92YWxdOwotICAgIH0KLQotICByZXR1cm4gKG5hbWUpOwotfQotCi0vKgotCi1OQU1FCi0KLQlzdHJ0b2Vycm5vIC0tIG1hcCBhIHN5bWJvbGljIGVycm5vIG5hbWUgdG8gYSBudW1lcmljIHZhbHVlCi0KLVNZTk9QU0lTCi0KLQlpbnQgc3RydG9lcnJubyAoY2hhciAqbmFtZSkKLQotREVTQ1JJUFRJT04KLQotCUdpdmVuIHRoZSBzeW1ib2xpYyBuYW1lIG9mIGEgZXJyb3IgbnVtYmVyLCBtYXAgaXQgdG8gYW4gZXJybm8gdmFsdWUuCi0JSWYgbm8gdHJhbnNsYXRpb24gaXMgZm91bmQsIHJldHVybnMgMC4KLQotKi8KLQotaW50Ci1zdHJ0b2Vycm5vIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgZXJybm92YWwgPSAwOwotCi0gIGlmIChuYW1lICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGVycm9yX25hbWVzID09IE5VTEwpCi0JewotCSAgaW5pdF9lcnJvcl90YWJsZXMgKCk7Ci0JfQotICAgICAgZm9yIChlcnJub3ZhbCA9IDA7IGVycm5vdmFsIDwgbnVtX2Vycm9yX25hbWVzOyBlcnJub3ZhbCsrKQotCXsKLQkgIGlmICgoZXJyb3JfbmFtZXNbZXJybm92YWxdICE9IE5VTEwpICYmCi0JICAgICAgKHN0cmNtcCAobmFtZSwgZXJyb3JfbmFtZXNbZXJybm92YWxdKSA9PSAwKSkKLQkgICAgewotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKGVycm5vdmFsID09IG51bV9lcnJvcl9uYW1lcykKLQl7Ci0jaWZkZWYgRVZNU0VSUgotCSAgaWYgKHN0cmNtcCAobmFtZSwgZXZtc2Vyci5uYW1lKSA9PSAwKQotCSAgICBlcnJub3ZhbCA9IGV2bXNlcnIudmFsdWU7Ci0JICBlbHNlCi0jZW5kaWYKLQkgIGVycm5vdmFsID0gMDsKLQl9Ci0gICAgfQotICByZXR1cm4gKGVycm5vdmFsKTsKLX0KLQotCi0vKiBBIHNpbXBsZSBsaXR0bGUgbWFpbiB0aGF0IGRvZXMgbm90aGluZyBidXQgcHJpbnQgYWxsIHRoZSBlcnJubyB0cmFuc2xhdGlvbnMKLSAgIGlmIE1BSU4gaXMgZGVmaW5lZCBhbmQgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQuICovCi0KLSNpZmRlZiBNQUlOCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IGVycm47Ci0gIGludCBlcnJubWF4OwotICBjb25zdCBjaGFyICpuYW1lOwotICBjaGFyICptc2c7Ci0gIGNoYXIgKnN0cmVycm9yICgpOwotCi0gIGVycm5tYXggPSBlcnJub19tYXggKCk7Ci0gIHByaW50ZiAoIiVkIGVudHJpZXMgaW4gbmFtZXMgdGFibGUuXG4iLCBudW1fZXJyb3JfbmFtZXMpOwotICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG1lc3NhZ2VzIHRhYmxlLlxuIiwgc3lzX25lcnIpOwotICBwcmludGYgKCIlZCBpcyBtYXggdXNlZnVsIGluZGV4LlxuIiwgZXJybm1heCk7Ci0KLSAgLyogS2VlcCBwcmludGluZyB2YWx1ZXMgdW50aWwgd2UgZ2V0IHRvIHRoZSBlbmQgb2YgKmJvdGgqIHRhYmxlcywgbm90Ci0gICAgICplaXRoZXIqIHRhYmxlLiAgTm90ZSB0aGF0IGtub3dpbmcgdGhlIG1heGltdW0gdXNlZnVsIGluZGV4IGRvZXMgKm5vdCoKLSAgICAgcmVsaWV2ZSB1cyBvZiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGVzdGluZyB0aGUgcmV0dXJuIHBvaW50ZXIgZm9yCi0gICAgIE5VTEwuICovCi0KLSAgZm9yIChlcnJuID0gMDsgZXJybiA8PSBlcnJubWF4OyBlcnJuKyspCi0gICAgewotICAgICAgbmFtZSA9IHN0cmVycm5vIChlcnJuKTsKLSAgICAgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/ICI8TlVMTD4iIDogbmFtZTsKLSAgICAgIG1zZyA9IHN0cmVycm9yIChlcnJuKTsKLSAgICAgIG1zZyA9IChtc2cgPT0gTlVMTCkgPyAiPE5VTEw+IiA6IG1zZzsKLSAgICAgIHByaW50ZiAoIiUtNGQlLTE4cyVzXG4iLCBlcnJuLCBuYW1lLCBtc2cpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RybmNhc2VjbXAuYyBiL2xpYmliZXJ0eS9zdHJuY2FzZWNtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDg1Y2FjLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJuY2FzZWNtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4NyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAotICogcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgotICogdG8gdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBhdCBCZXJrZWxleS4gVGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkKLSAqIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCi0gKiBpcyBwcm92aWRlZCBgYGFzIGlzJycgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCi0gKi8KLQotI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQotc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKXN0cmNhc2VjbXAuYwk1LjUgKEJlcmtlbGV5KSAxMS8yNC84NyI7Ci0jZW5kaWYgLyogTElCQ19TQ0NTIGFuZCBub3QgbGludCAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNlbmRpZgotCi0vKgotICogVGhpcyBhcnJheSBpcyBkZXNpZ25lZCBmb3IgbWFwcGluZyB1cHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXIKLSAqIHRvZ2V0aGVyIGZvciBhIGNhc2UgaW5kZXBlbmRlbnQgY29tcGFyaXNvbi4gIFRoZSBtYXBwaW5ncyBhcmUKLSAqIGJhc2VkIHVwb24gYXNjaWkgY2hhcmFjdGVyIHNlcXVlbmNlcy4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcm1hcFtdID0gewotCSdcMDAwJywgJ1wwMDEnLCAnXDAwMicsICdcMDAzJywgJ1wwMDQnLCAnXDAwNScsICdcMDA2JywgJ1wwMDcnLAotCSdcMDEwJywgJ1wwMTEnLCAnXDAxMicsICdcMDEzJywgJ1wwMTQnLCAnXDAxNScsICdcMDE2JywgJ1wwMTcnLAotCSdcMDIwJywgJ1wwMjEnLCAnXDAyMicsICdcMDIzJywgJ1wwMjQnLCAnXDAyNScsICdcMDI2JywgJ1wwMjcnLAotCSdcMDMwJywgJ1wwMzEnLCAnXDAzMicsICdcMDMzJywgJ1wwMzQnLCAnXDAzNScsICdcMDM2JywgJ1wwMzcnLAotCSdcMDQwJywgJ1wwNDEnLCAnXDA0MicsICdcMDQzJywgJ1wwNDQnLCAnXDA0NScsICdcMDQ2JywgJ1wwNDcnLAotCSdcMDUwJywgJ1wwNTEnLCAnXDA1MicsICdcMDUzJywgJ1wwNTQnLCAnXDA1NScsICdcMDU2JywgJ1wwNTcnLAotCSdcMDYwJywgJ1wwNjEnLCAnXDA2MicsICdcMDYzJywgJ1wwNjQnLCAnXDA2NScsICdcMDY2JywgJ1wwNjcnLAotCSdcMDcwJywgJ1wwNzEnLCAnXDA3MicsICdcMDczJywgJ1wwNzQnLCAnXDA3NScsICdcMDc2JywgJ1wwNzcnLAotCSdcMTAwJywgJ1wxNDEnLCAnXDE0MicsICdcMTQzJywgJ1wxNDQnLCAnXDE0NScsICdcMTQ2JywgJ1wxNDcnLAotCSdcMTUwJywgJ1wxNTEnLCAnXDE1MicsICdcMTUzJywgJ1wxNTQnLCAnXDE1NScsICdcMTU2JywgJ1wxNTcnLAotCSdcMTYwJywgJ1wxNjEnLCAnXDE2MicsICdcMTYzJywgJ1wxNjQnLCAnXDE2NScsICdcMTY2JywgJ1wxNjcnLAotCSdcMTcwJywgJ1wxNzEnLCAnXDE3MicsICdcMTMzJywgJ1wxMzQnLCAnXDEzNScsICdcMTM2JywgJ1wxMzcnLAotCSdcMTQwJywgJ1wxNDEnLCAnXDE0MicsICdcMTQzJywgJ1wxNDQnLCAnXDE0NScsICdcMTQ2JywgJ1wxNDcnLAotCSdcMTUwJywgJ1wxNTEnLCAnXDE1MicsICdcMTUzJywgJ1wxNTQnLCAnXDE1NScsICdcMTU2JywgJ1wxNTcnLAotCSdcMTYwJywgJ1wxNjEnLCAnXDE2MicsICdcMTYzJywgJ1wxNjQnLCAnXDE2NScsICdcMTY2JywgJ1wxNjcnLAotCSdcMTcwJywgJ1wxNzEnLCAnXDE3MicsICdcMTczJywgJ1wxNzQnLCAnXDE3NScsICdcMTc2JywgJ1wxNzcnLAotCSdcMjAwJywgJ1wyMDEnLCAnXDIwMicsICdcMjAzJywgJ1wyMDQnLCAnXDIwNScsICdcMjA2JywgJ1wyMDcnLAotCSdcMjEwJywgJ1wyMTEnLCAnXDIxMicsICdcMjEzJywgJ1wyMTQnLCAnXDIxNScsICdcMjE2JywgJ1wyMTcnLAotCSdcMjIwJywgJ1wyMjEnLCAnXDIyMicsICdcMjIzJywgJ1wyMjQnLCAnXDIyNScsICdcMjI2JywgJ1wyMjcnLAotCSdcMjMwJywgJ1wyMzEnLCAnXDIzMicsICdcMjMzJywgJ1wyMzQnLCAnXDIzNScsICdcMjM2JywgJ1wyMzcnLAotCSdcMjQwJywgJ1wyNDEnLCAnXDI0MicsICdcMjQzJywgJ1wyNDQnLCAnXDI0NScsICdcMjQ2JywgJ1wyNDcnLAotCSdcMjUwJywgJ1wyNTEnLCAnXDI1MicsICdcMjUzJywgJ1wyNTQnLCAnXDI1NScsICdcMjU2JywgJ1wyNTcnLAotCSdcMjYwJywgJ1wyNjEnLCAnXDI2MicsICdcMjYzJywgJ1wyNjQnLCAnXDI2NScsICdcMjY2JywgJ1wyNjcnLAotCSdcMjcwJywgJ1wyNzEnLCAnXDI3MicsICdcMjczJywgJ1wyNzQnLCAnXDI3NScsICdcMjc2JywgJ1wyNzcnLAotCSdcMzAwJywgJ1wzNDEnLCAnXDM0MicsICdcMzQzJywgJ1wzNDQnLCAnXDM0NScsICdcMzQ2JywgJ1wzNDcnLAotCSdcMzUwJywgJ1wzNTEnLCAnXDM1MicsICdcMzUzJywgJ1wzNTQnLCAnXDM1NScsICdcMzU2JywgJ1wzNTcnLAotCSdcMzYwJywgJ1wzNjEnLCAnXDM2MicsICdcMzYzJywgJ1wzNjQnLCAnXDM2NScsICdcMzY2JywgJ1wzNjcnLAotCSdcMzcwJywgJ1wzNzEnLCAnXDM3MicsICdcMzMzJywgJ1wzMzQnLCAnXDMzNScsICdcMzM2JywgJ1wzMzcnLAotCSdcMzQwJywgJ1wzNDEnLCAnXDM0MicsICdcMzQzJywgJ1wzNDQnLCAnXDM0NScsICdcMzQ2JywgJ1wzNDcnLAotCSdcMzUwJywgJ1wzNTEnLCAnXDM1MicsICdcMzUzJywgJ1wzNTQnLCAnXDM1NScsICdcMzU2JywgJ1wzNTcnLAotCSdcMzYwJywgJ1wzNjEnLCAnXDM2MicsICdcMzYzJywgJ1wzNjQnLCAnXDM2NScsICdcMzY2JywgJ1wzNjcnLAotCSdcMzcwJywgJ1wzNzEnLCAnXDM3MicsICdcMzczJywgJ1wzNzQnLCAnXDM3NScsICdcMzc2JywgJ1wzNzcnLAotfTsKLQotaW50Ci1zdHJuY2FzZWNtcChzMSwgczIsIG4pCi0JY29uc3QgY2hhciAqczEsICpzMjsKLQlyZWdpc3RlciBzaXplX3QgbjsKLXsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHUxLCB1MjsKLQotICAgIGZvciAoOyBuICE9IDA7IC0tbikgewotCXUxID0gKHVuc2lnbmVkIGNoYXIpICpzMSsrOwotCXUyID0gKHVuc2lnbmVkIGNoYXIpICpzMisrOwotCWlmIChjaGFybWFwW3UxXSAhPSBjaGFybWFwW3UyXSkgewotCSAgICByZXR1cm4gY2hhcm1hcFt1MV0gLSBjaGFybWFwW3UyXTsKLQl9Ci0JaWYgKHUxID09ICdcMCcpIHsKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJyY2hyLmMgYi9saWJpYmVydHkvc3RycmNoci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA1YmNiLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJyY2hyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKiBQb3J0YWJsZSB2ZXJzaW9uIG9mIHN0cnJjaHIoKS4KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICovCi0KLS8qCi1OQU1FCi0Jc3RycmNociAtLSByZXR1cm4gcG9pbnRlciB0byBsYXN0IG9jY3VyYW5jZSBvZiBhIGNoYXJhY3RlcgotCi1TWU5PUFNJUwotCWNoYXIgKnN0cnJjaHIgKGNvbnN0IGNoYXIgKnMsIGludCBjKQotCi1ERVNDUklQVElPTgotCVJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBsYXN0IG9jY3VyYW5jZSBvZiBjaGFyYWN0ZXIgQyBpbgotCXN0cmluZyBTLCBvciBhIE5VTEwgcG9pbnRlciBpZiBubyBvY2N1cmFuY2UgaXMgZm91bmQuCi0JCi1CVUdTCi0JQmVoYXZpb3Igd2hlbiBjaGFyYWN0ZXIgaXMgdGhlIG51bGwgY2hhcmFjdGVyIGlzIGltcGxlbWVudGF0aW9uCi0JZGVwZW5kZW50LgotKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0KLWNoYXIgKgotc3RycmNociAocywgYykKLSAgcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKLSAgaW50IGM7Ci17Ci0gIGNoYXIgKnJ0bnZhbCA9IDA7Ci0KLSAgZG8gewotICAgIGlmICgqcyA9PSBjKQotICAgICAgcnRudmFsID0gKGNoYXIqKSBzOwotICB9IHdoaWxlICgqcysrKTsKLSAgcmV0dXJuIChydG52YWwpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnNpZ25hbC5jIGIvbGliaWJlcnR5L3N0cnNpZ25hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2JiMTBjLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS9zdHJzaWduYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKiBFeHRlbmRlZCBzdXBwb3J0IGZvciB1c2luZyBzaWduYWwgdmFsdWVzLgotICAgV3JpdHRlbiBieSBGcmVkIEZpc2guICBmbmZAY3lnbnVzLmNvbQotICAgVGhpcyBmaWxlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotLyogV2UgbmVlZCB0byBkZWNsYXJlIHN5c19zaWdsaXN0LCBiZWNhdXNlIGV2ZW4gaWYgdGhlIHN5c3RlbSBwcm92aWRlcwotICAgaXQgd2UgY2FuJ3QgYXNzdW1lIHRoYXQgaXQgaXMgZGVjbGFyZWQgaW4gPHNpZ25hbC5oPiAoZm9yIGV4YW1wbGUsCi0gICBTdW5PUyBwcm92aWRlcyBzeXNfc2lnbGlzdCwgYnV0IGl0IGRvZXMgbm90IGRlY2xhcmUgaXQgaW4gYW55Ci0gICBoZWFkZXIgZmlsZSkuICBmSG93ZXZlciwgd2UgY2FuJ3QgZGVjbGFyZSBzeXNfc2lnbGlzdCBwb3J0YWJseSwKLSAgIGJlY2F1c2Ugb24gc29tZSBzeXN0ZW1zIGl0IGlzIGRlY2xhcmVkIHdpdGggY29uc3QgYW5kIG9uIHNvbWUKLSAgIHN5c3RlbXMgaXQgaXMgZGVjbGFyZWQgd2l0aG91dCBjb25zdC4gIElmIHdlIHdlcmUgdXNpbmcgYXV0b2NvbmYsCi0gICB3ZSBjb3VsZCB3b3JrIG91dCB0aGUgcmlnaHQgZGVjbGFyYXRpb24uICBVbnRpbCwgdGhlbiB3ZSBqdXN0Ci0gICBpZ25vcmUgYW55IGRlY2xhcmF0aW9uIGluIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGVzLCBhbmQgYWx3YXlzCi0gICBkZWNsYXJlIGl0IG91cnNlbHZlcy4gIFdpdGggbHVjaywgdGhpcyB3aWxsIGFsd2F5cyB3b3JrLiAgKi8KLSNkZWZpbmUgc3lzX3NpZ2xpc3Qgbm9fc3VjaF9zeW1ib2wKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLS8qICBSb3V0aW5lcyBpbXBvcnRlZCBmcm9tIHN0YW5kYXJkIEMgcnVudGltZSBsaWJyYXJpZXMuICovCi0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotZXh0ZXJuIHZvaWQgKm1hbGxvYyAoc2l6ZV90IHNpemUpOwkJCQkvKiA0LjEwLjMuMyAqLwotZXh0ZXJuIHZvaWQgKm1lbXNldCAodm9pZCAqcywgaW50IGMsIHNpemVfdCBuKTsJCQkvKiA0LjExLjYuMSAqLwotI2Vsc2UJLyogIV9fU1REQ19fICovCi1leHRlcm4gY2hhciAqbWFsbG9jICgpOwkJLyogU3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRlciAqLwotZXh0ZXJuIGNoYXIgKm1lbXNldCAoKTsKLSNlbmRpZgkvKiBfX1NURENfXyAqLwotCi0vKiBVbmRlZmluZSB0aGUgbWFjcm8gd2UgdXNlZCB0byBoaWRlIHRoZSBkZWZpbml0aW9uIG9mIHN5c19zaWdsaXN0Ci0gICBmb3VuZCBpbiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlcy4gICovCi0jdW5kZWYgc3lzX3NpZ2xpc3QKLQotI2lmbmRlZiBOVUxMCi0jICBpZmRlZiBfX1NURENfXwotIyAgICBkZWZpbmUgTlVMTCAodm9pZCAqKSAwCi0jICBlbHNlCi0jICAgIGRlZmluZSBOVUxMIDAKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBNQVgKLSMgIGRlZmluZSBNQVgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGluaXRfc2lnbmFsX3RhYmxlcyBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGZvciBzaWduYWwgdmFsdWVzLgotCi0gICBOb3RlIHRoYXQgdGhpcyB0YWJsZSBpcyBnZW5lcmFsbHkgb25seSBhY2Nlc3NlZCB3aGVuIGl0IGlzIHVzZWQgYXQgcnVudGltZQotICAgdG8gaW5pdGlhbGl6ZSBzaWduYWwgbmFtZSBhbmQgbWVzc2FnZSB0YWJsZXMgdGhhdCBhcmUgaW5kZXhlZCBieSBzaWduYWwKLSAgIHZhbHVlLgotCi0gICBOb3QgYWxsIG9mIHRoZXNlIHNpZ25hbHMgd2lsbCBleGlzdCBvbiBhbGwgc3lzdGVtcy4gIFRoaXMgdGFibGUgaXMgdGhlIG9ubHkKLSAgIHRoaW5nIHRoYXQgc2hvdWxkIGhhdmUgdG8gYmUgdXBkYXRlZCBhcyBuZXcgc2lnbmFsIG51bWJlcnMgYXJlIGludHJvZHVjZWQuCi0gICBJdCdzIHNvcnQgb2YgdWdseSwgYnV0IGF0IGxlYXN0IGl0cyBwb3J0YWJsZS4gKi8KLQotc3RydWN0IHNpZ25hbF9pbmZvCi17Ci0gIGludCB2YWx1ZTsJCS8qIFRoZSBudW1lcmljIHZhbHVlIGZyb20gPHNpZ25hbC5oPiAqLwotICBjb25zdCBjaGFyICpuYW1lOwkvKiBUaGUgZXF1aXZhbGVudCBzeW1ib2xpYyB2YWx1ZSAqLwotI2lmbmRlZiBIQVZFX1NZU19TSUdMSVNUCi0gIGNvbnN0IGNoYXIgKm1zZzsJLyogU2hvcnQgbWVzc2FnZSBhYm91dCB0aGlzIHZhbHVlICovCi0jZW5kaWYKLX07Ci0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotIyAgIGRlZmluZSBFTlRSWSh2YWx1ZSwgbmFtZSwgbXNnKQl7dmFsdWUsIG5hbWUsIG1zZ30KLSNlbHNlCi0jICAgZGVmaW5lIEVOVFJZKHZhbHVlLCBuYW1lLCBtc2cpCXt2YWx1ZSwgbmFtZX0KLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNpZ25hbF9pbmZvIHNpZ25hbF90YWJsZVtdID0KLXsKLSNpZiBkZWZpbmVkIChTSUdIVVApCi0gIEVOVFJZKFNJR0hVUCwgIlNJR0hVUCIsICJIYW5ndXAiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0lOVCkKLSAgRU5UUlkoU0lHSU5ULCAiU0lHSU5UIiwgIkludGVycnVwdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUVVJVCkKLSAgRU5UUlkoU0lHUVVJVCwgIlNJR1FVSVQiLCAiUXVpdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHSUxMKQotICBFTlRSWShTSUdJTEwsICJTSUdJTEwiLCAiSWxsZWdhbCBpbnN0cnVjdGlvbiIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVFJBUCkKLSAgRU5UUlkoU0lHVFJBUCwgIlNJR1RSQVAiLCAiVHJhY2UvYnJlYWtwb2ludCB0cmFwIiksCi0jZW5kaWYKLS8qIFB1dCBTSUdJT1QgYmVmb3JlIFNJR0FCUlQsIHNvIHRoYXQgaWYgU0lHSU9UPT1TSUdBQlJUIHRoZW4gU0lHQUJSVAotICAgb3ZlcnJpZGVzIFNJR0lPVC4gIFNJR0FCUlQgaXMgaW4gQU5TSSBhbmQgUE9TSVguMSwgYW5kIFNJR0lPVCBpc24ndC4gKi8KLSNpZiBkZWZpbmVkIChTSUdJT1QpCi0gIEVOVFJZKFNJR0lPVCwgIlNJR0lPVCIsICJJT1QgdHJhcCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHQUJSVCkKLSAgRU5UUlkoU0lHQUJSVCwgIlNJR0FCUlQiLCAiQWJvcnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHRU1UKQotICBFTlRSWShTSUdFTVQsICJTSUdFTVQiLCAiRW11bGF0aW9uIHRyYXAiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0ZQRSkKLSAgRU5UUlkoU0lHRlBFLCAiU0lHRlBFIiwgIkFyaXRobWV0aWMgZXhjZXB0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdLSUxMKQotICBFTlRSWShTSUdLSUxMLCAiU0lHS0lMTCIsICJLaWxsZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0JVUykKLSAgRU5UUlkoU0lHQlVTLCAiU0lHQlVTIiwgIkJ1cyBlcnJvciIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHU0VHVikKLSAgRU5UUlkoU0lHU0VHViwgIlNJR1NFR1YiLCAiU2VnbWVudGF0aW9uIGZhdWx0IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTWVMpCi0gIEVOVFJZKFNJR1NZUywgIlNJR1NZUyIsICJCYWQgc3lzdGVtIGNhbGwiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BJUEUpCi0gIEVOVFJZKFNJR1BJUEUsICJTSUdQSVBFIiwgIkJyb2tlbiBwaXBlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdBTFJNKQotICBFTlRSWShTSUdBTFJNLCAiU0lHQUxSTSIsICJBbGFybSBjbG9jayIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVEVSTSkKLSAgRU5UUlkoU0lHVEVSTSwgIlNJR1RFUk0iLCAiVGVybWluYXRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHVVNSMSkKLSAgRU5UUlkoU0lHVVNSMSwgIlNJR1VTUjEiLCAiVXNlciBkZWZpbmVkIHNpZ25hbCAxIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdVU1IyKQotICBFTlRSWShTSUdVU1IyLCAiU0lHVVNSMiIsICJVc2VyIGRlZmluZWQgc2lnbmFsIDIiKSwKLSNlbmRpZgotLyogUHV0IFNJR0NMRCBiZWZvcmUgU0lHQ0hMRCwgc28gdGhhdCBpZiBTSUdDTEQ9PVNJR0NITEQgdGhlbiBTSUdDSExECi0gICBvdmVycmlkZXMgU0lHQ0xELiAgU0lHQ0hMRCBpcyBpbiBQT1hJWC4xICovCi0jaWYgZGVmaW5lZCAoU0lHQ0xEKQotICBFTlRSWShTSUdDTEQsICJTSUdDTEQiLCAiQ2hpbGQgc3RhdHVzIGNoYW5nZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0NITEQpCi0gIEVOVFJZKFNJR0NITEQsICJTSUdDSExEIiwgIkNoaWxkIHN0YXR1cyBjaGFuZ2VkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQV1IpCi0gIEVOVFJZKFNJR1BXUiwgIlNJR1BXUiIsICJQb3dlciBmYWlsL3Jlc3RhcnQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1dJTkNIKQotICBFTlRSWShTSUdXSU5DSCwgIlNJR1dJTkNIIiwgIldpbmRvdyBzaXplIGNoYW5nZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1VSRykKLSAgRU5UUlkoU0lHVVJHLCAiU0lHVVJHIiwgIlVyZ2VudCBJL08gY29uZGl0aW9uIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdJTykKLSAgLyogIkkvTyBwZW5kaW5nIiBoYXMgYWxzbyBiZWVuIHN1Z2dlc3RlZCwgYnV0IGlzIG1pc2xlYWRpbmcgc2luY2UgdGhlCi0gICAgIHNpZ25hbCBvbmx5IGhhcHBlbnMgd2hlbiB0aGUgcHJvY2VzcyBoYXMgYXNrZWQgZm9yIGl0LCBub3QgZXZlcnl0aW1lCi0gICAgIEkvTyBpcyBwZW5kaW5nLiAqLwotICBFTlRSWShTSUdJTywgIlNJR0lPIiwgIkkvTyBwb3NzaWJsZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUE9MTCkKLSAgRU5UUlkoU0lHUE9MTCwgIlNJR1BPTEwiLCAiUG9sbGFibGUgZXZlbnQgb2NjdXJyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NUT1ApCi0gIEVOVFJZKFNJR1NUT1AsICJTSUdTVE9QIiwgIlN0b3BwZWQgKHNpZ25hbCkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1RTVFApCi0gIEVOVFJZKFNJR1RTVFAsICJTSUdUU1RQIiwgIlN0b3BwZWQgKHVzZXIpIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdDT05UKQotICBFTlRSWShTSUdDT05ULCAiU0lHQ09OVCIsICJDb250aW51ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1RUSU4pCi0gIEVOVFJZKFNJR1RUSU4sICJTSUdUVElOIiwgIlN0b3BwZWQgKHR0eSBpbnB1dCkiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1RUT1UpCi0gIEVOVFJZKFNJR1RUT1UsICJTSUdUVE9VIiwgIlN0b3BwZWQgKHR0eSBvdXRwdXQpIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdWVEFMUk0pCi0gIEVOVFJZKFNJR1ZUQUxSTSwgIlNJR1ZUQUxSTSIsICJWaXJ0dWFsIHRpbWVyIGV4cGlyZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1BST0YpCi0gIEVOVFJZKFNJR1BST0YsICJTSUdQUk9GIiwgIlByb2ZpbGluZyB0aW1lciBleHBpcmVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdYQ1BVKQotICBFTlRSWShTSUdYQ1BVLCAiU0lHWENQVSIsICJDUFUgdGltZSBsaW1pdCBleGNlZWRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHWEZTWikKLSAgRU5UUlkoU0lHWEZTWiwgIlNJR1hGU1oiLCAiRmlsZSBzaXplIGxpbWl0IGV4Y2VlZGVkIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdXSU5EKQotICBFTlRSWShTSUdXSU5ELCAiU0lHV0lORCIsICJTSUdXSU5EIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdQSE9ORSkKLSAgRU5UUlkoU0lHUEhPTkUsICJTSUdQSE9ORSIsICJTSUdQSE9ORSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHTE9TVCkKLSAgRU5UUlkoU0lHTE9TVCwgIlNJR0xPU1QiLCAiUmVzb3VyY2UgbG9zdCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHV0FJVElORykKLSAgRU5UUlkoU0lHV0FJVElORywgIlNJR1dBSVRJTkciLCAiUHJvY2VzcydzIExXUHMgYXJlIGJsb2NrZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0xXUCkKLSAgRU5UUlkoU0lHTFdQLCAiU0lHTFdQIiwgIlNpZ25hbCBMV1AiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR0RBTkdFUikKLSAgRU5UUlkoU0lHREFOR0VSLCAiU0lHREFOR0VSIiwgIlN3YXAgc3BhY2UgZGFuZ2Vyb3VzbHkgbG93IiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdHUkFOVCkKLSAgRU5UUlkoU0lHR1JBTlQsICJTSUdHUkFOVCIsICJNb25pdG9yIG1vZGUgZ3JhbnRlZCIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHUkVUUkFDVCkKLSAgRU5UUlkoU0lHUkVUUkFDVCwgIlNJR1JFVFJBQ1QiLCAiTmVlZCB0byByZWxpbmd1aXNoIG1vbml0b3IgbW9kZSIpLAotI2VuZGlmCi0jaWYgZGVmaW5lZCAoU0lHTVNHKQotICBFTlRSWShTSUdNU0csICJTSUdNU0ciLCAiTW9uaXRvciBtb2RlIGRhdGEgYXZhaWxhYmxlIiksCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChTSUdTT1VORCkKLSAgRU5UUlkoU0lHU09VTkQsICJTSUdTT1VORCIsICJTb3VuZCBjb21wbGV0ZWQiKSwKLSNlbmRpZgotI2lmIGRlZmluZWQgKFNJR1NBSykKLSAgRU5UUlkoU0lHU0FLLCAiU0lHU0FLIiwgIlNlY3VyZSBhdHRlbnRpb24iKSwKLSNlbmRpZgotICBFTlRSWSgwLCBOVUxMLCBOVUxMKQotfTsKLQotLyogVHJhbnNsYXRpb24gdGFibGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBhdCBydW50aW1lLiAgSW5kZXhlZCBieSB0aGUKLSAgIHNpZ25hbCB2YWx1ZSB0byBmaW5kIHRoZSBlcXVpdmFsZW50IHN5bWJvbGljIHZhbHVlLiAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqKnNpZ25hbF9uYW1lczsKLXN0YXRpYyBpbnQgbnVtX3NpZ25hbF9uYW1lcyA9IDA7Ci0KLS8qIFRyYW5zbGF0aW9uIHRhYmxlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgcnVudGltZSwgaWYgaXQgZG9lcyBub3QKLSAgIGFscmVhZHkgZXhpc3QgaW4gdGhlIGhvc3QgZW52aXJvbm1lbnQuICBJbmRleGVkIGJ5IHRoZSBzaWduYWwgdmFsdWUgdG8gZmluZAotICAgdGhlIGRlc2NyaXB0aXZlIHN0cmluZy4KLQotICAgV2UgZG9uJ3QgZXhwb3J0IGl0IGZvciB1c2UgaW4gb3RoZXIgbW9kdWxlcyBiZWNhdXNlIGV2ZW4gdGhvdWdoIGl0IGhhcyB0aGUKLSAgIHNhbWUgbmFtZSwgaXQgZGlmZmVycyBmcm9tIG90aGVyIGltcGxlbWVudGF0aW9ucyBpbiB0aGF0IGl0IGlzIGR5bmFtaWNhbGx5Ci0gICBpbml0aWFsaXplZCByYXRoZXIgdGhhbiBzdGF0aWNhbGx5IGluaXRpYWxpemVkLiAqLwotCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLQotc3RhdGljIGludCBzeXNfbnNpZzsKLXN0YXRpYyBjb25zdCBjaGFyICoqc3lzX3NpZ2xpc3Q7Ci0KLSNlbHNlCi0KLSNpZmRlZiBOU0lHCi1zdGF0aWMgaW50IHN5c19uc2lnID0gTlNJRzsKLSNlbHNlCi0jaWZkZWYgX05TSUcKLXN0YXRpYyBpbnQgc3lzX25zaWcgPSBfTlNJRzsKLSNlbmRpZgotI2VuZGlmCi1leHRlcm4gY29uc3QgY2hhciAqIGNvbnN0IHN5c19zaWdsaXN0W107Ci0KLSNlbmRpZgotCi0KLS8qCi0KLU5BTUUKLQotCWluaXRfc2lnbmFsX3RhYmxlcyAtLSBpbml0aWFsaXplIHRoZSBuYW1lIGFuZCBtZXNzYWdlIHRhYmxlcwotCi1TWU5PUFNJUwotCi0Jc3RhdGljIHZvaWQgaW5pdF9zaWduYWxfdGFibGVzICgpOwotCi1ERVNDUklQVElPTgotCi0JVXNpbmcgdGhlIHNpZ25hbF90YWJsZSwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgYXQgY29tcGlsZSB0aW1lLCBnZW5lcmF0ZQotCXRoZSBzaWduYWxfbmFtZXMgYW5kIHRoZSBzeXNfc2lnbGlzdCAoaWYgbmVlZGVkKSB0YWJsZXMsIHdoaWNoIGFyZQotCWluZGV4ZWQgYXQgcnVudGltZSBieSBhIHNwZWNpZmljIHNpZ25hbCB2YWx1ZS4KLQotQlVHUwotCi0JVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSB0YWJsZXMgbWF5IGZhaWwgdW5kZXIgbG93IG1lbW9yeSBjb25kaXRpb25zLAotCWluIHdoaWNoIGNhc2Ugd2UgZG9uJ3QgZG8gYW55dGhpbmcgcGFydGljdWxhcmx5IHVzZWZ1bCwgYnV0IHdlIGRvbid0Ci0JYm9tYiBlaXRoZXIuICBXaG8ga25vd3MsIGl0IG1pZ2h0IHN1Y2NlZWQgYXQgYSBsYXRlciBwb2ludCBpZiB3ZSBmcmVlCi0Jc29tZSBtZW1vcnkgaW4gdGhlIG1lYW50aW1lLiAgSW4gYW55IGNhc2UsIHRoZSBvdGhlciByb3V0aW5lcyBrbm93Ci0JaG93IHRvIGRlYWwgd2l0aCBsYWNrIG9mIGEgdGFibGUgYWZ0ZXIgdHJ5aW5nIHRvIGluaXRpYWxpemUgaXQuICBUaGlzCi0JbWF5IG9yIG1heSBub3QgYmUgY29uc2lkZXJlZCB0byBiZSBhIGJ1ZywgdGhhdCB3ZSBkb24ndCBzcGVjaWZpY2FsbHkKLQl3YXJuIGFib3V0IHRoaXMgcGFydGljdWxhciBmYWlsdXJlIG1vZGUuCi0KLSovCi0KLXN0YXRpYyB2b2lkCi1pbml0X3NpZ25hbF90YWJsZXMgKCkKLXsKLSAgY29uc3Qgc3RydWN0IHNpZ25hbF9pbmZvICplaXA7Ci0gIGludCBuYnl0ZXM7Ci0KLSAgLyogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHNjYW5uZWQgdGhlIHNpZ25hbF90YWJsZSBvbmNlIHRvIGZpbmQgdGhlIG1heGltdW0KLSAgICAgc2lnbmFsIHZhbHVlLCB0aGVuIGdvIGZpbmQgaXQgbm93LiAqLwotCi0gIGlmIChudW1fc2lnbmFsX25hbWVzID09IDApCi0gICAgewotICAgICAgZm9yIChlaXAgPSBzaWduYWxfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCXsKLQkgIGlmIChlaXAgLT4gdmFsdWUgPj0gbnVtX3NpZ25hbF9uYW1lcykKLQkgICAgewotCSAgICAgIG51bV9zaWduYWxfbmFtZXMgPSBlaXAgLT4gdmFsdWUgKyAxOwotCSAgICB9Ci0JfQotICAgIH0KLQotICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgc2lnbmFsX25hbWVzIHRhYmxlLCB6ZXJvIGl0IG91dCwgYW5kIHRoZW4KLSAgICAgaW5pdGlhbGl6ZSBpdCBmcm9tIHRoZSBzdGF0aWNhbGx5IGluaXRpYWxpemVkIHNpZ25hbF90YWJsZS4gKi8KLQotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgbmJ5dGVzID0gbnVtX3NpZ25hbF9uYW1lcyAqIHNpemVvZiAoY2hhciAqKTsKLSAgICAgIGlmICgoc2lnbmFsX25hbWVzID0gKGNvbnN0IGNoYXIgKiopIG1hbGxvYyAobmJ5dGVzKSkgIT0gTlVMTCkKLQl7Ci0JICBtZW1zZXQgKHNpZ25hbF9uYW1lcywgMCwgbmJ5dGVzKTsKLQkgIGZvciAoZWlwID0gc2lnbmFsX3RhYmxlOyBlaXAgLT4gbmFtZSAhPSBOVUxMOyBlaXArKykKLQkgICAgewotCSAgICAgIHNpZ25hbF9uYW1lc1tlaXAgLT4gdmFsdWVdID0gZWlwIC0+IG5hbWU7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jaWZuZGVmIEhBVkVfU1lTX1NJR0xJU1QKLQotICAvKiBOb3cgYXR0ZW1wdCB0byBhbGxvY2F0ZSB0aGUgc3lzX3NpZ2xpc3QgdGFibGUsIHplcm8gaXQgb3V0LCBhbmQgdGhlbgotICAgICBpbml0aWFsaXplIGl0IGZyb20gdGhlIHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgc2lnbmFsX3RhYmxlLiAqLwotCi0gIGlmIChzeXNfc2lnbGlzdCA9PSBOVUxMKQotICAgIHsKLSAgICAgIG5ieXRlcyA9IG51bV9zaWduYWxfbmFtZXMgKiBzaXplb2YgKGNoYXIgKik7Ci0gICAgICBpZiAoKHN5c19zaWdsaXN0ID0gKGNvbnN0IGNoYXIgKiopIG1hbGxvYyAobmJ5dGVzKSkgIT0gTlVMTCkKLQl7Ci0JICBtZW1zZXQgKHN5c19zaWdsaXN0LCAwLCBuYnl0ZXMpOwotCSAgc3lzX25zaWcgPSBudW1fc2lnbmFsX25hbWVzOwotCSAgZm9yIChlaXAgPSBzaWduYWxfdGFibGU7IGVpcCAtPiBuYW1lICE9IE5VTEw7IGVpcCsrKQotCSAgICB7Ci0JICAgICAgc3lzX3NpZ2xpc3RbZWlwIC0+IHZhbHVlXSA9IGVpcCAtPiBtc2c7Ci0JICAgIH0KLQl9Ci0gICAgfQotCi0jZW5kaWYKLQotfQotCi0KLS8qCi0KLU5BTUUKLQotCXNpZ25vX21heCAtLSByZXR1cm4gdGhlIG1heCBzaWdubyB2YWx1ZQotCi1TWU5PUFNJUwotCi0JaW50IHNpZ25vX21heCAoKTsKLQotREVTQ1JJUFRJT04KLQotCVJldHVybnMgdGhlIG1heGltdW0gc2lnbm8gdmFsdWUgZm9yIHdoaWNoIGEgY29ycmVzcG9uZGluZyBzeW1ib2xpYwotCW5hbWUgb3IgbWVzc2FnZSBpcyBhdmFpbGFibGUuICBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugd2hlcmUKLQl3ZSB1c2UgdGhlIHN5c19zaWdsaXN0IHN1cHBsaWVkIGJ5IHRoZSBzeXN0ZW0sIGl0IGlzIHBvc3NpYmxlIGZvcgotCXRoZXJlIHRvIGJlIG1vcmUgc3ltYm9saWMgbmFtZXMgdGhhbiBtZXNzYWdlcywgb3IgdmljZSB2ZXJzYS4KLQlJbiBmYWN0LCB0aGUgbWFudWFsIHBhZ2UgZm9yIHBzaWduYWwoM2IpIGV4cGxpY2l0bHkgd2FybnMgdGhhdCBvbmUKLQlzaG91bGQgY2hlY2sgdGhlIHNpemUgb2YgdGhlIHRhYmxlIChOU0lHKSBiZWZvcmUgaW5kZXhpbmcgaXQsCi0Jc2luY2UgbmV3IHNpZ25hbCBjb2RlcyBtYXkgYmUgYWRkZWQgdG8gdGhlIHN5c3RlbSBiZWZvcmUgdGhleSBhcmUKLQlhZGRlZCB0byB0aGUgdGFibGUuICBUaHVzIE5TSUcgbWlnaHQgYmUgc21hbGxlciB0aGFuIHZhbHVlCi0JaW1wbGllZCBieSB0aGUgbGFyZ2VzdCBzaWdubyB2YWx1ZSBkZWZpbmVkIGluIDxzaWduYWwuaD4uCi0KLQlXZSByZXR1cm4gdGhlIG1heGltdW0gdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gYSBtZWFuaW5nZnVsCi0Jc3ltYm9saWMgbmFtZSBvciBtZXNzYWdlLgotCi0qLwotCi1pbnQKLXNpZ25vX21heCAoKQotewotICBpbnQgbWF4c2l6ZTsKLQotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotICAgIH0KLSAgbWF4c2l6ZSA9IE1BWCAoc3lzX25zaWcsIG51bV9zaWduYWxfbmFtZXMpOwotICByZXR1cm4gKG1heHNpemUgLSAxKTsKLX0KLQotCi0vKgotCi1OQU1FCi0KLQlzdHJzaWduYWwgLS0gbWFwIGEgc2lnbmFsIG51bWJlciB0byBhIHNpZ25hbCBtZXNzYWdlIHN0cmluZwotCi1TWU5PUFNJUwotCi0JY29uc3QgY2hhciAqc3Ryc2lnbmFsIChpbnQgc2lnbm8pCi0KLURFU0NSSVBUSU9OCi0KLQlNYXBzIGFuIHNpZ25hbCBudW1iZXIgdG8gYW4gc2lnbmFsIG1lc3NhZ2Ugc3RyaW5nLCB0aGUgY29udGVudHMgb2YKLQl3aGljaCBhcmUgaW1wbGVtZW50YXRpb24gZGVmaW5lZC4gIE9uIHN5c3RlbXMgd2hpY2ggaGF2ZSB0aGUgZXh0ZXJuYWwKLQl2YXJpYWJsZSBzeXNfc2lnbGlzdCwgdGhlc2Ugc3RyaW5ncyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBvbmVzIHVzZWQKLQlieSBwc2lnbmFsKCkuCi0KLQlJZiB0aGUgc3VwcGxpZWQgc2lnbmFsIG51bWJlciBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlIG9mIGluZGljZXMKLQlmb3IgdGhlIHN5c19zaWdsaXN0LCBidXQgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCi0Jc2lnbmFsIG51bWJlciwgdGhlbiByZXR1cm5zIHRoZSBzdHJpbmcgIlNpZ25hbCBOVU0iLCB3aGVyZSBOVU0gaXMgdGhlCi0Jc2lnbmFsIG51bWJlci4KLQotCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIG5vdCBhIHZhbGlkIGluZGV4IGludG8gc3lzX3NpZ2xpc3QsCi0JcmV0dXJucyBOVUxMLgotCi0JVGhlIHJldHVybmVkIHN0cmluZyBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgb25seSB1bnRpbCB0aGUKLQluZXh0IGNhbGwgdG8gc3Ryc2lnbmFsLgotCi0qLwotCi0jaWZuZGVmIEhBVkVfU1RSU0lHTkFMCi0KLWNvbnN0IGNoYXIgKgotc3Ryc2lnbmFsIChzaWdubykKLSAgaW50IHNpZ25vOwotewotICBjb25zdCBjaGFyICptc2c7Ci0gIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0KLSNpZm5kZWYgSEFWRV9TWVNfU0lHTElTVAotCi0gIGlmIChzaWduYWxfbmFtZXMgPT0gTlVMTCkKLSAgICB7Ci0gICAgICBpbml0X3NpZ25hbF90YWJsZXMgKCk7Ci0gICAgfQotCi0jZW5kaWYKLQotICBpZiAoKHNpZ25vIDwgMCkgfHwgKHNpZ25vID49IHN5c19uc2lnKSkKLSAgICB7Ci0gICAgICAvKiBPdXQgb2YgcmFuZ2UsIGp1c3QgcmV0dXJuIE5VTEwgKi8KLSAgICAgIG1zZyA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoc3lzX3NpZ2xpc3QgPT0gTlVMTCkgfHwgKHN5c19zaWdsaXN0W3NpZ25vXSA9PSBOVUxMKSkKLSAgICB7Ci0gICAgICAvKiBJbiByYW5nZSwgYnV0IG5vIHN5c19zaWdsaXN0IG9yIG5vIGVudHJ5IGF0IHRoaXMgaW5kZXguICovCi0gICAgICBzcHJpbnRmIChidWYsICJTaWduYWwgJWQiLCBzaWdubyk7Ci0gICAgICBtc2cgPSAoY29uc3QgY2hhciAqKSBidWY7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogSW4gcmFuZ2UsIGFuZCBhIHZhbGlkIG1lc3NhZ2UuICBKdXN0IHJldHVybiB0aGUgbWVzc2FnZS4gKi8KLSAgICAgIG1zZyA9IChjb25zdCBjaGFyICopIHN5c19zaWdsaXN0W3NpZ25vXTsKLSAgICB9Ci0gIAotICByZXR1cm4gKG1zZyk7Ci19Ci0KLSNlbmRpZiAvKiAhIEhBVkVfU1RSU0lHTkFMICovCi0KLS8qCi0KLU5BTUUKLQotCXN0cnNpZ25vIC0tIG1hcCBhbiBzaWduYWwgbnVtYmVyIHRvIGEgc3ltYm9saWMgbmFtZSBzdHJpbmcKLQotU1lOT1BTSVMKLQotCWNvbnN0IGNoYXIgKnN0cnNpZ25vIChpbnQgc2lnbm8pCi0KLURFU0NSSVBUSU9OCi0KLQlHaXZlbiBhbiBzaWduYWwgbnVtYmVyLCByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nCi0JdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhhdCBzaWduYWwgbnVtYmVyLCBhcyBmb3VuZCBpbiA8c2lnbmFsLmg+LgotCi0JSWYgdGhlIHN1cHBsaWVkIHNpZ25hbCBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzCi0JZm9yIHN5bWJvbGljIG5hbWVzLCBidXQgbm8gbmFtZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBwYXJ0aWN1bGFyCi0Jc2lnbmFsIG51bWJlciwgdGhlbiByZXR1cm5zIHRoZSBzdHJpbmcgIlNpZ25hbCBOVU0iLCB3aGVyZSBOVU0gaXMKLQl0aGUgc2lnbmFsIG51bWJlci4KLQotCUlmIHRoZSBzdXBwbGllZCBzaWduYWwgbnVtYmVyIGlzIG5vdCB3aXRoaW4gdGhlIHJhbmdlIG9mIHZhbGlkCi0JaW5kaWNlcywgdGhlbiByZXR1cm5zIE5VTEwuCi0KLUJVR1MKLQotCVRoZSBjb250ZW50cyBvZiB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBhcmUgb25seSBndWFyYW50ZWVkIHRvIGJlCi0JdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBzdHJzaWduby4KLQotKi8KLQotY29uc3QgY2hhciAqCi1zdHJzaWdubyAoc2lnbm8pCi0gIGludCBzaWdubzsKLXsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgc3RhdGljIGNoYXIgYnVmWzMyXTsKLQotICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0gICAgewotICAgICAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotICAgIH0KLQotICBpZiAoKHNpZ25vIDwgMCkgfHwgKHNpZ25vID49IG51bV9zaWduYWxfbmFtZXMpKQotICAgIHsKLSAgICAgIC8qIE91dCBvZiByYW5nZSwganVzdCByZXR1cm4gTlVMTCAqLwotICAgICAgbmFtZSA9IE5VTEw7Ci0gICAgfQotICBlbHNlIGlmICgoc2lnbmFsX25hbWVzID09IE5VTEwpIHx8IChzaWduYWxfbmFtZXNbc2lnbm9dID09IE5VTEwpKQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBidXQgbm8gc2lnbmFsX25hbWVzIG9yIG5vIGVudHJ5IGF0IHRoaXMgaW5kZXguICovCi0gICAgICBzcHJpbnRmIChidWYsICJTaWduYWwgJWQiLCBzaWdubyk7Ci0gICAgICBuYW1lID0gKGNvbnN0IGNoYXIgKikgYnVmOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIEluIHJhbmdlLCBhbmQgYSB2YWxpZCBuYW1lLiAgSnVzdCByZXR1cm4gdGhlIG5hbWUuICovCi0gICAgICBuYW1lID0gc2lnbmFsX25hbWVzW3NpZ25vXTsKLSAgICB9Ci0KLSAgcmV0dXJuIChuYW1lKTsKLX0KLQotCi0vKgotCi1OQU1FCi0KLQlzdHJ0b3NpZ25vIC0tIG1hcCBhIHN5bWJvbGljIHNpZ25hbCBuYW1lIHRvIGEgbnVtZXJpYyB2YWx1ZQotCi1TWU5PUFNJUwotCi0JaW50IHN0cnRvc2lnbm8gKGNoYXIgKm5hbWUpCi0KLURFU0NSSVBUSU9OCi0KLQlHaXZlbiB0aGUgc3ltYm9saWMgbmFtZSBvZiBhIHNpZ25hbCwgbWFwIGl0IHRvIGEgc2lnbmFsIG51bWJlci4KLQlJZiBubyB0cmFuc2xhdGlvbiBpcyBmb3VuZCwgcmV0dXJucyAwLgotCi0qLwotCi1pbnQKLXN0cnRvc2lnbm8gKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIGludCBzaWdubyA9IDA7Ci0KLSAgaWYgKG5hbWUgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoc2lnbmFsX25hbWVzID09IE5VTEwpCi0JewotCSAgaW5pdF9zaWduYWxfdGFibGVzICgpOwotCX0KLSAgICAgIGZvciAoc2lnbm8gPSAwOyBzaWdubyA8IG51bV9zaWduYWxfbmFtZXM7IHNpZ25vKyspCi0JewotCSAgaWYgKChzaWduYWxfbmFtZXNbc2lnbm9dICE9IE5VTEwpICYmCi0JICAgICAgKHN0cmNtcCAobmFtZSwgc2lnbmFsX25hbWVzW3NpZ25vXSkgPT0gMCkpCi0JICAgIHsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICAgIGlmIChzaWdubyA9PSBudW1fc2lnbmFsX25hbWVzKQotCXsKLQkgIHNpZ25vID0gMDsKLQl9Ci0gICAgfQotICByZXR1cm4gKHNpZ25vKTsKLX0KLQotCi0vKgotCi1OQU1FCi0KLQlwc2lnbmFsIC0tIHByaW50IG1lc3NhZ2UgYWJvdXQgc2lnbmFsIHRvIHN0ZGVycgotCi1TWU5PUFNJUwotCi0Jdm9pZCBwc2lnbmFsICh1bnNpZ25lZCBzaWdubywgY2hhciAqbWVzc2FnZSk7Ci0KLURFU0NSSVBUSU9OCi0KLQlQcmludCB0byB0aGUgc3RhbmRhcmQgZXJyb3IgdGhlIG1lc3NhZ2UsIGZvbGxvd2VkIGJ5IGEgY29sb24sCi0JZm9sbG93ZWQgYnkgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzaWduYWwgc3BlY2lmaWVkIGJ5IHNpZ25vLAotCWZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KLSovCi0KLSNpZm5kZWYgSEFWRV9QU0lHTkFMCi0KLXZvaWQKLXBzaWduYWwgKHNpZ25vLCBtZXNzYWdlKQotICB1bnNpZ25lZCBzaWdubzsKLSAgY2hhciAqbWVzc2FnZTsKLXsKLSAgaWYgKHNpZ25hbF9uYW1lcyA9PSBOVUxMKQotICAgIHsKLSAgICAgIGluaXRfc2lnbmFsX3RhYmxlcyAoKTsKLSAgICB9Ci0gIGlmICgoc2lnbm8gPD0gMCkgfHwgKHNpZ25vID49IHN5c19uc2lnKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogdW5rbm93biBzaWduYWxcbiIsIG1lc3NhZ2UpOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVzOiAlc1xuIiwgbWVzc2FnZSwgc3lzX3NpZ2xpc3Rbc2lnbm9dKTsKLSAgICB9Ci19Ci0KLSNlbmRpZgkvKiAhIEhBVkVfUFNJR05BTCAqLwotCi0KLS8qIEEgc2ltcGxlIGxpdHRsZSBtYWluIHRoYXQgZG9lcyBub3RoaW5nIGJ1dCBwcmludCBhbGwgdGhlIHNpZ25hbCB0cmFuc2xhdGlvbnMKLSAgIGlmIE1BSU4gaXMgZGVmaW5lZCBhbmQgdGhpcyBmaWxlIGlzIGNvbXBpbGVkIGFuZCBsaW5rZWQuICovCi0KLSNpZmRlZiBNQUlOCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQKLW1haW4gKCkKLXsKLSAgaW50IHNpZ25vOwotICBpbnQgbWF4c2lnbm87Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIGNvbnN0IGNoYXIgKm1zZzsKLQotICBtYXhzaWdubyA9IHNpZ25vX21heCAoKTsKLSAgcHJpbnRmICgiJWQgZW50cmllcyBpbiBuYW1lcyB0YWJsZS5cbiIsIG51bV9zaWduYWxfbmFtZXMpOwotICBwcmludGYgKCIlZCBlbnRyaWVzIGluIG1lc3NhZ2VzIHRhYmxlLlxuIiwgc3lzX25zaWcpOwotICBwcmludGYgKCIlZCBpcyBtYXggdXNlZnVsIGluZGV4LlxuIiwgbWF4c2lnbm8pOwotCi0gIC8qIEtlZXAgcHJpbnRpbmcgdmFsdWVzIHVudGlsIHdlIGdldCB0byB0aGUgZW5kIG9mICpib3RoKiB0YWJsZXMsIG5vdAotICAgICAqZWl0aGVyKiB0YWJsZS4gIE5vdGUgdGhhdCBrbm93aW5nIHRoZSBtYXhpbXVtIHVzZWZ1bCBpbmRleCBkb2VzICpub3QqCi0gICAgIHJlbGlldmUgdXMgb2YgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRlc3RpbmcgdGhlIHJldHVybiBwb2ludGVyIGZvcgotICAgICBOVUxMLiAqLwotCi0gIGZvciAoc2lnbm8gPSAwOyBzaWdubyA8PSBtYXhzaWdubzsgc2lnbm8rKykKLSAgICB7Ci0gICAgICBuYW1lID0gc3Ryc2lnbm8gKHNpZ25vKTsKLSAgICAgIG5hbWUgPSAobmFtZSA9PSBOVUxMKSA/ICI8TlVMTD4iIDogbmFtZTsKLSAgICAgIG1zZyA9IHN0cnNpZ25hbCAoc2lnbm8pOwotICAgICAgbXNnID0gKG1zZyA9PSBOVUxMKSA/ICI8TlVMTD4iIDogbXNnOwotICAgICAgcHJpbnRmICgiJS00ZCUtMThzJXNcbiIsIHNpZ25vLCBuYW1lLCBtc2cpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3Ryc3RyLmMgYi9saWJpYmVydHkvc3Ryc3RyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjM2ZTMuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnN0ci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHN0cnN0ciBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gICovCi0KLS8qCi0KLU5BTUUKLQotCXN0cnN0ciAtLSBsb2NhdGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGEgc3Vic3RyaW5nCi0KLVNZTk9QU0lTCi0KLQkjaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLQljaGFyICpzdHJzdHIgKGNoYXIgKnMxLCBjaGFyICpzMikKLQotREVTQ1JJUFRJT04KLQotCUxvY2F0ZXMgdGhlIGZpcnN0IG9jY3VyYW5jZSBpbiB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgUzEgb2YKLQl0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgUzIuICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3Vic3RyaW5nCi0JZm91bmQsIG9yIGEgTlVMTCBwb2ludGVyIGlmIG5vdCBmb3VuZC4gIElmIFMyIHBvaW50cyB0byBhIHN0cmluZwotCXdpdGggemVybyBsZW5ndGgsIHRoZSBmdW5jdGlvbiByZXR1cm5zIFMxLgotCQotQlVHUwotCi0qLwotCi0KLS8qIEZJWE1FOiAgVGhlIGFib3ZlIGRlc2NyaXB0aW9uIGlzIEFOU0kgY29tcGlsaWFudC4gIFRoaXMgcm91dGluZSBoYXMgbm90Ci0gICBiZWVuIHZhbGlkYXRlZCB0byBjb21wbHkgd2l0aCBpdC4gIC1mbmYgKi8KLQotY2hhciAqCi1zdHJzdHIgKHMxLCBzMikKLSAgY2hhciAqczEsICpzMjsKLXsKLSAgcmVnaXN0ZXIgY2hhciAqcCA9IHMxOwotICBleHRlcm4gY2hhciAqc3RyY2hyICgpOwotICBleHRlcm4gaW50IHN0cm5jbXAgKCk7Ci0jaWYgX19HTlVDX189PTIKLSAgZXh0ZXJuIF9fU0laRV9UWVBFX18gc3RybGVuICgpOwotI2VuZGlmCi0gIHJlZ2lzdGVyIGludCBsZW4gPSBzdHJsZW4gKHMyKTsKLQotICBmb3IgKDsgKHAgPSBzdHJjaHIgKHAsICpzMikpICE9IDA7IHArKykKLSAgICB7Ci0gICAgICBpZiAoc3RybmNtcCAocCwgczIsIGxlbikgPT0gMCkKLQl7Ci0JICByZXR1cm4gKHApOwotCX0KLSAgICB9Ci0gIHJldHVybiAoMCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvc3RydG9kLmMgYi9saWJpYmVydHkvc3RydG9kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NmM3M2QuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnRvZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qIEltcGxlbWVudGF0aW9uIG9mIHN0cnRvZCBmb3Igc3lzdGVtcyB3aXRoIGF0b2YuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4gIFRoaXMgbGlicmFyeSBpcyBmcmVlCi1zb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi1GcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggZmlsZXMKLWNvbXBpbGVkIHdpdGggYSBHTlUgY29tcGlsZXIgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGRvZXMgbm90IGNhdXNlCi10aGUgcmVzdWx0aW5nIGV4ZWN1dGFibGUgdG8gYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCi1UaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBob3dldmVyIGludmFsaWRhdGUgYW55IG90aGVyIHJlYXNvbnMgd2h5Ci10aGUgZXhlY3V0YWJsZSBmaWxlIG1pZ2h0IGJlIGNvdmVyZWQgYnkgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAqLwotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotZXh0ZXJuIGRvdWJsZSBhdG9mICgpOwotCi0vKiBEaXNjbGFpbWVyOiB0aGlzIGlzIGN1cnJlbnRseSBqdXN0IHVzZWQgYnkgQ0hJTEwgaW4gR0RCIGFuZCB0aGVyZWZvcmUKLSAgIGhhcyBub3QgYmVlbiB0ZXN0ZWQgd2VsbC4gIEl0IG1heSBoYXZlIGJlZW4gdGVzdGVkIGZvciBub3RoaW5nIGV4Y2VwdAotICAgdGhhdCBpdCBjb21waWxlcy4gICovCi0KLWRvdWJsZQotc3RydG9kIChzdHIsIHB0cikKLSAgICAgY2hhciAqc3RyOwotICAgICBjaGFyICoqcHRyOwotewotICBjaGFyICpwOwotCi0gIGlmIChwdHIgPT0gKGNoYXIgKiopMCkKLSAgICByZXR1cm4gYXRvZiAoc3RyKTsKLSAgCi0gIHAgPSBzdHI7Ci0gIAotICB3aGlsZSAoaXNzcGFjZSAoKnApKQotICAgICsrcDsKLSAgCi0gIGlmICgqcCA9PSAnKycgfHwgKnAgPT0gJy0nKQotICAgICsrcDsKLQotICAvKiBJTkYgb3IgSU5GSU5JVFkuICAqLwotICBpZiAoKHBbMF0gPT0gJ2knIHx8IHBbMF0gPT0gJ0knKQotICAgICAgJiYgKHBbMV0gPT0gJ24nIHx8IHBbMV0gPT0gJ04nKQotICAgICAgJiYgKHBbMl0gPT0gJ2YnIHx8IHBbMl0gPT0gJ0YnKSkKLSAgICB7Ci0gICAgICBpZiAoKHBbM10gPT0gJ2knIHx8IHBbM10gPT0gJ0knKQotCSAgJiYgKHBbNF0gPT0gJ24nIHx8IHBbNF0gPT0gJ04nKQotCSAgJiYgKHBbNV0gPT0gJ2knIHx8IHBbNV0gPT0gJ0knKQotCSAgJiYgKHBbNl0gPT0gJ3QnIHx8IHBbNl0gPT0gJ1QnKQotCSAgJiYgKHBbN10gPT0gJ3knIHx8IHBbN10gPT0gJ1knKSkKLQl7Ci0JICAqcHRyID0gcCArIDc7Ci0JICByZXR1cm4gYXRvZiAoc3RyKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgKnB0ciA9IHAgKyAzOwotCSAgcmV0dXJuIGF0b2YgKHN0cik7Ci0JfQotICAgIH0KLQotICAvKiBOQU4gb3IgTkFOKGZvbykuICAqLwotICBpZiAoKHBbMF0gPT0gJ24nIHx8IHBbMF0gPT0gJ04nKQotICAgICAgJiYgKHBbMV0gPT0gJ2EnIHx8IHBbMV0gPT0gJ0EnKQotICAgICAgJiYgKHBbMl0gPT0gJ24nIHx8IHBbMl0gPT0gJ04nKSkKLSAgICB7Ci0gICAgICBwICs9IDM7Ci0gICAgICBpZiAoKnAgPT0gJygnKQotCXsKLQkgICsrcDsKLQkgIHdoaWxlICgqcCAhPSAnXDAnICYmICpwICE9ICcpJykKLQkgICAgKytwOwotCSAgaWYgKCpwID09ICcpJykKLQkgICAgKytwOwotCX0KLSAgICAgICpwdHIgPSBwOwotICAgICAgcmV0dXJuIGF0b2YgKHN0cik7Ci0gICAgfQotCi0gIC8qIGRpZ2l0cywgd2l0aCAwIG9yIDEgcGVyaW9kcyBpbiBpdC4gICovCi0gIGlmIChpc2RpZ2l0ICgqcCkgfHwgKnAgPT0gJy4nKQotICAgIHsKLSAgICAgIGludCBnb3RfZG90ID0gMDsKLSAgICAgIHdoaWxlIChpc2RpZ2l0ICgqcCkgfHwgKCFnb3RfZG90ICYmICpwID09ICcuJykpCi0JewotCSAgaWYgKCpwID09ICcuJykKLQkgICAgZ290X2RvdCA9IDE7Ci0JICArK3A7Ci0JfQotCi0gICAgICAvKiBFeHBvbmVudC4gICovCi0gICAgICBpZiAoKnAgPT0gJ2UnIHx8ICpwID09ICdFJykKLQl7Ci0JICBpbnQgaTsKLQkgIGkgPSAxOwotCSAgaWYgKHBbaV0gPT0gJysnIHx8IHBbaV0gPT0gJy0nKQotCSAgICArK2k7Ci0JICBpZiAoaXNkaWdpdCAocFtpXSkpCi0JICAgIHsKLQkgICAgICB3aGlsZSAoaXNkaWdpdCAocFtpXSkpCi0JCSsraTsKLQkgICAgICAqcHRyID0gcCArIGk7Ci0JICAgICAgcmV0dXJuIGF0b2YgKHN0cik7Ci0JICAgIH0KLQl9Ci0gICAgICAqcHRyID0gcDsKLSAgICAgIHJldHVybiBhdG9mIChzdHIpOwotICAgIH0KLSAgLyogRGlkbid0IGZpbmQgYW55IGRpZ2l0cy4gIERvZXNuJ3QgbG9vayBsaWtlIGEgbnVtYmVyLiAgKi8KLSAgKnB0ciA9IHN0cjsKLSAgcmV0dXJuIDAuMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS9zdHJ0b2wuYyBiL2xpYmliZXJ0eS9zdHJ0b2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkMTcwNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvc3RydG9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyotCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmIDAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLS8qIEZJWE1FOiBJdCdkIGJlIG5pY2UgdG8gY29uZmlndXJlIGFyb3VuZCB0aGVzZSwgYnV0IHRoZSBpbmNsdWRlIGZpbGVzIGFyZSB0b28KLSAgIHBhaW5mdWwuICBUaGVzZSBtYWNyb3Mgc2hvdWxkIGF0IGxlYXN0IGJlIG1vcmUgcG9ydGFibGUgdGhhbiBoYXJkd2lyZWQgaGV4Ci0gICBjb25zdGFudHMuICovCi0KLSNpZm5kZWYgVUxPTkdfTUFYCi0jZGVmaW5lCVVMT05HX01BWAkoKHVuc2lnbmVkIGxvbmcpKH4wTCkpCQkvKiAweEZGRkZGRkZGICovCi0jZW5kaWYKLQotI2lmbmRlZiBMT05HX01BWAotI2RlZmluZQlMT05HX01BWAkoKGxvbmcpKFVMT05HX01BWCA+PiAxKSkJLyogMHg3RkZGRkZGRiAqLwotI2VuZGlmCi0KLSNpZm5kZWYgTE9OR19NSU4KLSNkZWZpbmUJTE9OR19NSU4JKChsb25nKSh+TE9OR19NQVgpKQkJLyogMHg4MDAwMDAwMCAqLwotI2VuZGlmCi0KLS8qCi0gKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGEgbG9uZyBpbnRlZ2VyLgotICoKLSAqIElnbm9yZXMgYGxvY2FsZScgc3R1ZmYuICBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCi0gKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgotICovCi1sb25nCi1zdHJ0b2wobnB0ciwgZW5kcHRyLCBiYXNlKQotCWNvbnN0IGNoYXIgKm5wdHI7Ci0JY2hhciAqKmVuZHB0cjsKLQlyZWdpc3RlciBpbnQgYmFzZTsKLXsKLQlyZWdpc3RlciBjb25zdCBjaGFyICpzID0gbnB0cjsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGFjYzsKLQlyZWdpc3RlciBpbnQgYzsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGN1dG9mZjsKLQlyZWdpc3RlciBpbnQgbmVnID0gMCwgYW55LCBjdXRsaW07Ci0KLQkvKgotCSAqIFNraXAgd2hpdGUgc3BhY2UgYW5kIHBpY2sgdXAgbGVhZGluZyArLy0gc2lnbiBpZiBhbnkuCi0JICogSWYgYmFzZSBpcyAwLCBhbGxvdyAweCBmb3IgaGV4IGFuZCAwIGZvciBvY3RhbCwgZWxzZQotCSAqIGFzc3VtZSBkZWNpbWFsOyBpZiBiYXNlIGlzIGFscmVhZHkgMTYsIGFsbG93IDB4LgotCSAqLwotCWRvIHsKLQkJYyA9ICpzKys7Ci0JfSB3aGlsZSAoaXNzcGFjZShjKSk7Ci0JaWYgKGMgPT0gJy0nKSB7Ci0JCW5lZyA9IDE7Ci0JCWMgPSAqcysrOwotCX0gZWxzZSBpZiAoYyA9PSAnKycpCi0JCWMgPSAqcysrOwotCWlmICgoYmFzZSA9PSAwIHx8IGJhc2UgPT0gMTYpICYmCi0JICAgIGMgPT0gJzAnICYmICgqcyA9PSAneCcgfHwgKnMgPT0gJ1gnKSkgewotCQljID0gc1sxXTsKLQkJcyArPSAyOwotCQliYXNlID0gMTY7Ci0JfQotCWlmIChiYXNlID09IDApCi0JCWJhc2UgPSBjID09ICcwJyA/IDggOiAxMDsKLQotCS8qCi0JICogQ29tcHV0ZSB0aGUgY3V0b2ZmIHZhbHVlIGJldHdlZW4gbGVnYWwgbnVtYmVycyBhbmQgaWxsZWdhbAotCSAqIG51bWJlcnMuICBUaGF0IGlzIHRoZSBsYXJnZXN0IGxlZ2FsIHZhbHVlLCBkaXZpZGVkIGJ5IHRoZQotCSAqIGJhc2UuICBBbiBpbnB1dCBudW1iZXIgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZSwgaWYKLQkgKiBmb2xsb3dlZCBieSBhIGxlZ2FsIGlucHV0IGNoYXJhY3RlciwgaXMgdG9vIGJpZy4gIE9uZSB0aGF0Ci0JICogaXMgZXF1YWwgdG8gdGhpcyB2YWx1ZSBtYXkgYmUgdmFsaWQgb3Igbm90OyB0aGUgbGltaXQKLQkgKiBiZXR3ZWVuIHZhbGlkIGFuZCBpbnZhbGlkIG51bWJlcnMgaXMgdGhlbiBiYXNlZCBvbiB0aGUgbGFzdAotCSAqIGRpZ2l0LiAgRm9yIGluc3RhbmNlLCBpZiB0aGUgcmFuZ2UgZm9yIGxvbmdzIGlzCi0JICogWy0yMTQ3NDgzNjQ4Li4yMTQ3NDgzNjQ3XSBhbmQgdGhlIGlucHV0IGJhc2UgaXMgMTAsCi0JICogY3V0b2ZmIHdpbGwgYmUgc2V0IHRvIDIxNDc0ODM2NCBhbmQgY3V0bGltIHRvIGVpdGhlcgotCSAqIDcgKG5lZz09MCkgb3IgOCAobmVnPT0xKSwgbWVhbmluZyB0aGF0IGlmIHdlIGhhdmUgYWNjdW11bGF0ZWQKLQkgKiBhIHZhbHVlID4gMjE0NzQ4MzY0LCBvciBlcXVhbCBidXQgdGhlIG5leHQgZGlnaXQgaXMgPiA3IChvciA4KSwKLQkgKiB0aGUgbnVtYmVyIGlzIHRvbyBiaWcsIGFuZCB3ZSB3aWxsIHJldHVybiBhIHJhbmdlIGVycm9yLgotCSAqCi0JICogU2V0IGFueSBpZiBhbnkgYGRpZ2l0cycgY29uc3VtZWQ7IG1ha2UgaXQgbmVnYXRpdmUgdG8gaW5kaWNhdGUKLQkgKiBvdmVyZmxvdy4KLQkgKi8KLQljdXRvZmYgPSBuZWcgPyAtKHVuc2lnbmVkIGxvbmcpTE9OR19NSU4gOiBMT05HX01BWDsKLQljdXRsaW0gPSBjdXRvZmYgJSAodW5zaWduZWQgbG9uZyliYXNlOwotCWN1dG9mZiAvPSAodW5zaWduZWQgbG9uZyliYXNlOwotCWZvciAoYWNjID0gMCwgYW55ID0gMDs7IGMgPSAqcysrKSB7Ci0JCWlmIChpc2RpZ2l0KGMpKQotCQkJYyAtPSAnMCc7Ci0JCWVsc2UgaWYgKGlzYWxwaGEoYykpCi0JCQljIC09IGlzdXBwZXIoYykgPyAnQScgLSAxMCA6ICdhJyAtIDEwOwotCQllbHNlCi0JCQlicmVhazsKLQkJaWYgKGMgPj0gYmFzZSkKLQkJCWJyZWFrOwotCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgYWNjID09IGN1dG9mZiAmJiBjID4gY3V0bGltKQotCQkJYW55ID0gLTE7Ci0JCWVsc2UgewotCQkJYW55ID0gMTsKLQkJCWFjYyAqPSBiYXNlOwotCQkJYWNjICs9IGM7Ci0JCX0KLQl9Ci0JaWYgKGFueSA8IDApIHsKLQkJYWNjID0gbmVnID8gTE9OR19NSU4gOiBMT05HX01BWDsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JfSBlbHNlIGlmIChuZWcpCi0JCWFjYyA9IC1hY2M7Ci0JaWYgKGVuZHB0ciAhPSAwKQotCQkqZW5kcHRyID0gKGNoYXIgKikgKGFueSA/IHMgLSAxIDogbnB0cik7Ci0JcmV0dXJuIChhY2MpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3N0cnRvdWwuYyBiL2xpYmliZXJ0eS9zdHJ0b3VsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNmYyZDYuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3N0cnRvdWwuYworKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKLSAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKLSAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgotICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKLSAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQotICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCi0gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKLSAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCi0gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2lmIDAKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0KLSNpZm5kZWYgVUxPTkdfTUFYCi0jZGVmaW5lCVVMT05HX01BWAkoKHVuc2lnbmVkIGxvbmcpKH4wTCkpCQkvKiAweEZGRkZGRkZGICovCi0jZW5kaWYKLQotLyoKLSAqIENvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBpbnRlZ2VyLgotICoKLSAqIElnbm9yZXMgYGxvY2FsZScgc3R1ZmYuICBBc3N1bWVzIHRoYXQgdGhlIHVwcGVyIGFuZCBsb3dlciBjYXNlCi0gKiBhbHBoYWJldHMgYW5kIGRpZ2l0cyBhcmUgZWFjaCBjb250aWd1b3VzLgotICovCi11bnNpZ25lZCBsb25nCi1zdHJ0b3VsKG5wdHIsIGVuZHB0ciwgYmFzZSkKLQljb25zdCBjaGFyICpucHRyOwotCWNoYXIgKiplbmRwdHI7Ci0JcmVnaXN0ZXIgaW50IGJhc2U7Ci17Ci0JcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IG5wdHI7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhY2M7Ci0JcmVnaXN0ZXIgaW50IGM7Ci0JcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBjdXRvZmY7Ci0JcmVnaXN0ZXIgaW50IG5lZyA9IDAsIGFueSwgY3V0bGltOwotCi0JLyoKLQkgKiBTZWUgc3RydG9sIGZvciBjb21tZW50cyBhcyB0byB0aGUgbG9naWMgdXNlZC4KLQkgKi8KLQlkbyB7Ci0JCWMgPSAqcysrOwotCX0gd2hpbGUgKGlzc3BhY2UoYykpOwotCWlmIChjID09ICctJykgewotCQluZWcgPSAxOwotCQljID0gKnMrKzsKLQl9IGVsc2UgaWYgKGMgPT0gJysnKQotCQljID0gKnMrKzsKLQlpZiAoKGJhc2UgPT0gMCB8fCBiYXNlID09IDE2KSAmJgotCSAgICBjID09ICcwJyAmJiAoKnMgPT0gJ3gnIHx8ICpzID09ICdYJykpIHsKLQkJYyA9IHNbMV07Ci0JCXMgKz0gMjsKLQkJYmFzZSA9IDE2OwotCX0KLQlpZiAoYmFzZSA9PSAwKQotCQliYXNlID0gYyA9PSAnMCcgPyA4IDogMTA7Ci0JY3V0b2ZmID0gKHVuc2lnbmVkIGxvbmcpVUxPTkdfTUFYIC8gKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQljdXRsaW0gPSAodW5zaWduZWQgbG9uZylVTE9OR19NQVggJSAodW5zaWduZWQgbG9uZyliYXNlOwotCWZvciAoYWNjID0gMCwgYW55ID0gMDs7IGMgPSAqcysrKSB7Ci0JCWlmIChpc2RpZ2l0KGMpKQotCQkJYyAtPSAnMCc7Ci0JCWVsc2UgaWYgKGlzYWxwaGEoYykpCi0JCQljIC09IGlzdXBwZXIoYykgPyAnQScgLSAxMCA6ICdhJyAtIDEwOwotCQllbHNlCi0JCQlicmVhazsKLQkJaWYgKGMgPj0gYmFzZSkKLQkJCWJyZWFrOwotCQlpZiAoYW55IDwgMCB8fCBhY2MgPiBjdXRvZmYgfHwgYWNjID09IGN1dG9mZiAmJiBjID4gY3V0bGltKQotCQkJYW55ID0gLTE7Ci0JCWVsc2UgewotCQkJYW55ID0gMTsKLQkJCWFjYyAqPSBiYXNlOwotCQkJYWNjICs9IGM7Ci0JCX0KLQl9Ci0JaWYgKGFueSA8IDApIHsKLQkJYWNjID0gVUxPTkdfTUFYOwotCQllcnJubyA9IEVSQU5HRTsKLQl9IGVsc2UgaWYgKG5lZykKLQkJYWNjID0gLWFjYzsKLQlpZiAoZW5kcHRyICE9IDApCi0JCSplbmRwdHIgPSAoY2hhciAqKSAoYW55ID8gcyAtIDEgOiBucHRyKTsKLQlyZXR1cm4gKGFjYyk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdG1wbmFtLmMgYi9saWJpYmVydHkvdG1wbmFtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNjE0NjcuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3RtcG5hbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZm5kZWYgTF90bXBuYW0KLSNkZWZpbmUgTF90bXBuYW1lIDEwMAotI2VuZGlmCi0jaWZuZGVmIFBfdG1wZGlyCi0jZGVmaW5lIFBfdG1wZGlyICIvdXNyL3RtcCIKLSNlbmRpZgotCi1zdGF0aWMgY2hhciB0bXBuYW1fYnVmZmVyW0xfdG1wbmFtXTsKLXN0YXRpYyBpbnQgdG1wbmFtX2NvdW50ZXI7Ci0KLWV4dGVybiBpbnQgZ2V0cGlkICgpOwotCi1jaGFyICoKLXRtcG5hbSAocykKLSAgICAgY2hhciAqczsKLXsKLSAgaW50IHBpZCA9IGdldHBpZCAoKTsKLQotICBpZiAocyA9PSBOVUxMKQotICAgIHMgPSB0bXBuYW1fYnVmZmVyOwotCi0gIC8qICBHZW5lcmF0ZSB0aGUgZmlsZW5hbWUgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzbid0IG9uZSBjYWxsZWQKLSAgICAgIGl0IGFscmVhZHkuICAqLwotCi0gIHdoaWxlICgxKQotICAgIHsKLSAgICAgIEZJTEUgKmY7Ci0gICAgICBzcHJpbnRmIChzLCAiJXMvJXMleC4leCIsIFBfdG1wZGlyLCAidCIsIHBpZCwgdG1wbmFtX2NvdW50ZXIpOwotICAgICAgZiA9IGZvcGVuIChzLCAiciIpOwotICAgICAgaWYgKGYgPT0gTlVMTCkKLQlicmVhazsKLSAgICAgIHRtcG5hbV9jb3VudGVyKys7Ci0gICAgICBmY2xvc2UgKGYpOwotICAgIH0KLQotICByZXR1cm4gczsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92YXNwcmludGYuYyBiL2xpYmliZXJ0eS92YXNwcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViODBlNi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdmFzcHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyogTGlrZSB2c3ByaW50ZiBidXQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIG1hbGxvYydkIHN0b3JhZ2UsIHdoaWNoIG11c3QKLSAgIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0jaWZkZWYgVEVTVAotaW50IGdsb2JhbF90b3RhbF93aWR0aDsKLSNlbmRpZgotCi11bnNpZ25lZCBsb25nIHN0cnRvdWwgKCk7Ci1jaGFyICptYWxsb2MgKCk7Ci0KLXN0YXRpYyBpbnQKLWludF92YXNwcmludGYgKHJlc3VsdCwgZm9ybWF0LCBhcmdzKQotICAgICBjaGFyICoqcmVzdWx0OwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2xpc3QgKmFyZ3M7Ci17Ci0gIGNvbnN0IGNoYXIgKnAgPSBmb3JtYXQ7Ci0gIC8qIEFkZCBvbmUgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbmV2ZXIgemVybywgd2hpY2ggbWlnaHQgY2F1c2UgbWFsbG9jCi0gICAgIHRvIHJldHVybiBOVUxMLiAgKi8KLSAgaW50IHRvdGFsX3dpZHRoID0gc3RybGVuIChmb3JtYXQpICsgMTsKLSAgdmFfbGlzdCBhcDsKLQotICBtZW1jcHkgKChQVFIpICZhcCwgKFBUUikgYXJncywgc2l6ZW9mICh2YV9saXN0KSk7Ci0KLSAgd2hpbGUgKCpwICE9ICdcMCcpCi0gICAgewotICAgICAgaWYgKCpwKysgPT0gJyUnKQotCXsKLQkgIHdoaWxlIChzdHJjaHIgKCItKyAjMCIsICpwKSkKLQkgICAgKytwOwotCSAgaWYgKCpwID09ICcqJykKLQkgICAgewotCSAgICAgICsrcDsKLQkgICAgICB0b3RhbF93aWR0aCArPSBhYnMgKHZhX2FyZyAoYXAsIGludCkpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHRvdGFsX3dpZHRoICs9IHN0cnRvdWwgKHAsICZwLCAxMCk7Ci0JICBpZiAoKnAgPT0gJy4nKQotCSAgICB7Ci0JICAgICAgKytwOwotCSAgICAgIGlmICgqcCA9PSAnKicpCi0JCXsKLQkJICArK3A7Ci0JCSAgdG90YWxfd2lkdGggKz0gYWJzICh2YV9hcmcgKGFwLCBpbnQpKTsKLQkJfQotCSAgICAgIGVsc2UKLQkgICAgICB0b3RhbF93aWR0aCArPSBzdHJ0b3VsIChwLCAmcCwgMTApOwotCSAgICB9Ci0JICB3aGlsZSAoc3RyY2hyICgiaGxMIiwgKnApKQotCSAgICArK3A7Ci0JICAvKiBTaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgYW55IGZvcm1hdCBzcGVjaWZpZXIgZXhjZXB0ICVzIGFuZCBmbG9hdHMuICAqLwotCSAgdG90YWxfd2lkdGggKz0gMzA7Ci0JICBzd2l0Y2ggKCpwKQotCSAgICB7Ci0JICAgIGNhc2UgJ2QnOgotCSAgICBjYXNlICdpJzoKLQkgICAgY2FzZSAnbyc6Ci0JICAgIGNhc2UgJ3UnOgotCSAgICBjYXNlICd4JzoKLQkgICAgY2FzZSAnWCc6Ci0JICAgIGNhc2UgJ2MnOgotCSAgICAgICh2b2lkKSB2YV9hcmcgKGFwLCBpbnQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdmJzoKLQkgICAgY2FzZSAnZSc6Ci0JICAgIGNhc2UgJ0UnOgotCSAgICBjYXNlICdnJzoKLQkgICAgY2FzZSAnRyc6Ci0JICAgICAgKHZvaWQpIHZhX2FyZyAoYXAsIGRvdWJsZSk7Ci0JICAgICAgLyogU2luY2UgYW4gaWVlZSBkb3VibGUgY2FuIGhhdmUgYW4gZXhwb25lbnQgb2YgMzA3LCB3ZSdsbAotCQkgbWFrZSB0aGUgYnVmZmVyIHdpZGUgZW5vdWdoIHRvIGNvdmVyIHRoZSBncm9zcyBjYXNlLiAqLwotCSAgICAgIHRvdGFsX3dpZHRoICs9IDMwNzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncyc6Ci0JICAgICAgdG90YWxfd2lkdGggKz0gc3RybGVuICh2YV9hcmcgKGFwLCBjaGFyICopKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAncCc6Ci0JICAgIGNhc2UgJ24nOgotCSAgICAgICh2b2lkKSB2YV9hcmcgKGFwLCBjaGFyICopOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgIH0KLSNpZmRlZiBURVNUCi0gIGdsb2JhbF90b3RhbF93aWR0aCA9IHRvdGFsX3dpZHRoOwotI2VuZGlmCi0gICpyZXN1bHQgPSBtYWxsb2MgKHRvdGFsX3dpZHRoKTsKLSAgaWYgKCpyZXN1bHQgIT0gTlVMTCkKLSAgICByZXR1cm4gdnNwcmludGYgKCpyZXN1bHQsIGZvcm1hdCwgKmFyZ3MpOwotICBlbHNlCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludAotdmFzcHJpbnRmIChyZXN1bHQsIGZvcm1hdCwgYXJncykKLSAgICAgY2hhciAqKnJlc3VsdDsKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotI2lmIGRlZmluZWQgKF9CU0RfVkFfTElTVF8pICYmIGRlZmluZWQgKF9fRnJlZUJTRF9fKQotICAgICBfQlNEX1ZBX0xJU1RfIGFyZ3M7Ci0jZWxzZQotICAgICB2YV9saXN0IGFyZ3M7Ci0jZW5kaWYKLXsKLSAgcmV0dXJuIGludF92YXNwcmludGYgKHJlc3VsdCwgZm9ybWF0LCAmYXJncyk7Ci19Ci0KLSNpZmRlZiBURVNUCi12b2lkCi1jaGVja2l0Ci0jaWZkZWYgX19TVERDX18KLSAgICAgKGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKQotI2Vsc2UKLSAgICAgKHZhX2FsaXN0KQotICAgICB2YV9kY2wKLSNlbmRpZgotewotICB2YV9saXN0IGFyZ3M7Ci0gIGNoYXIgKnJlc3VsdDsKLQotI2lmZGVmIF9fU1REQ19fCi0gIHZhX3N0YXJ0IChhcmdzLCBmb3JtYXQpOwotI2Vsc2UKLSAgY2hhciAqZm9ybWF0OwotICB2YV9zdGFydCAoYXJncyk7Ci0gIGZvcm1hdCA9IHZhX2FyZyAoYXJncywgY2hhciAqKTsKLSNlbmRpZgotICB2YXNwcmludGYgKCZyZXN1bHQsIGZvcm1hdCwgYXJncyk7Ci0gIGlmIChzdHJsZW4gKHJlc3VsdCkgPCBnbG9iYWxfdG90YWxfd2lkdGgpCi0gICAgcHJpbnRmICgiUEFTUzogIik7Ci0gIGVsc2UKLSAgICBwcmludGYgKCJGQUlMOiAiKTsKLSAgcHJpbnRmICgiJWQgJXNcbiIsIGdsb2JhbF90b3RhbF93aWR0aCwgcmVzdWx0KTsKLX0KLQotaW50Ci1tYWluICgpCi17Ci0gIGNoZWNraXQgKCIlZCIsIDB4MTIzNDU2NzgpOwotICBjaGVja2l0ICgiJTIwMGQiLCA1KTsKLSAgY2hlY2tpdCAoIiUuMzAwZCIsIDYpOwotICBjaGVja2l0ICgiJTEwMC4xNTBkIiwgNyk7Ci0gIGNoZWNraXQgKCIlcyIsICJqampqampqamppaWlpaWlpaWlpaWlpaWlvb29vb29vb29vb29vb29vb3BwcHBwcHBwcHBwcGFhXG5cCi03Nzc3Nzc3Nzc3Nzc3Nzc3NzczMzMzMzMzMzMzMzMzNjY2NjY2NjY2NjY2MjIyMjIyMjIyMjI3Nzc3Nzc3Nzc3Nzc3MzMzMzMiKTsKLSAgY2hlY2tpdCAoIiVmJXMlZCVzIiwgMS4wLCAiZm9vIiwgNzcsICJhc2RqZmZmZmZmZmZmZmZmZmZpaWlpaWlpaWlpaXh4eHh4Iik7Ci19Ci0jZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3Zmb3JrLmMgYi9saWJpYmVydHkvdmZvcmsuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNDU5MS4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdmZvcmsuYworKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLyogRW11bGF0ZSB2Zm9yayB1c2luZyBqdXN0IHBsYWluIGZvcmssIGZvciBzeXN0ZW1zIHdpdGhvdXQgYSByZWFsIHZmb3JrLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gKi8KLQotaW50Ci12Zm9yayAoKQotewotICByZXR1cm4gKGZvcmsgKCkpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3ZmcHJpbnRmLmMgYi9saWJpYmVydHkvdmZwcmludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3YjJmZi4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkvdmZwcmludGYuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qIFByb3ZpZGUgYSB2ZXJzaW9uIHZmcHJpbnRmIGluIHRlcm1zIG9mIF9kb3BybnQuCi0gICBCeSBLYXZlaCBHaGF6aSAgKGdoYXppQGNhaXAucnV0Z2Vycy5lZHUpICAzLzI5Lzk4Ci0gICBDb3B5cmlnaHQgKEMpIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gKi8KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHZhcmFyZ3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jdW5kZWYgdmZwcmludGYKLQotaW50Ci12ZnByaW50ZiAoc3RyZWFtLCBmb3JtYXQsIGFwKQotICBGSUxFICogc3RyZWFtOwotICBjb25zdCBjaGFyICogZm9ybWF0OwotICB2YV9saXN0IGFwOwotewotICByZXR1cm4gX2RvcHJudCAoZm9ybWF0LCBhcCwgc3RyZWFtKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92bXNidWlsZC5jb20gYi9saWJpYmVydHkvdm1zYnVpbGQuY29tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmVkZTM4Li4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92bXNidWlsZC5jb20KKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotJCEgbGliaWJlcnR5L3Ztc2J1aWxkLmNvbSAtLSBidWlsZCBsaWJlcnR5Lm9sYiBmb3IgVk1TIGhvc3QsIFZNUyB0YXJnZXQKLSQhCi0kIENDCT0gImdjYyAvbm9WZXJib3NlL0RlYnVnL0luY2w9KFtdLFstLmluY2x1ZGVdKSIKLSQgTElCUgk9ICJsaWJyYXJ5IC9PYmoiCi0kIExJTksJPSAibGluayIKLSQgREVMRVRFPSAiZGVsZXRlIC9ub0NvbmZpcm0iCi0kIFNFQVJDSD0gInNlYXJjaCAvRXhhY3QiCi0kIEVDSE8JPSAid3JpdGUgc3lzJG91dHB1dCIKLSQgQUJPUlQJPSAiZXhpdCAleDAwMkMiCi0kIQotJCBMSUJfTkFNRSA9ICJsaWJlcnR5Lm9sYiIJIXRoaXMgaXMgd2hhdCB3ZSdyZSBnb2luZyB0byBjb25zdHJ1Y3QKLSQgV09SS19MSUIgPSAibmV3LWxpYi5vbGIiCSF1c2VkIHRvIGd1YXJkIGFnYWluc3QgYW4gaW5jb21wbGV0ZSBidWlsZAotJAotJCEgbWFudWFsbHkgY29waWVkIGZyb20gTWFrZWZpbGUuaW4KLSQgUkVRVUlSRURfT0ZJTEVTID0gImFyZ3YubyBiYXNlbmFtZS5vIGNob29zZS10ZW1wLm8gY29uY2F0Lm8gY3BsdXMtZGVtLm8gIi0KLQkrICJmZG1hdGNoLm8gZm5tYXRjaC5vIGdldG9wdC5vIGdldG9wdDEubyBnZXRydW50aW1lLm8gaGV4Lm8gIi0KLQkrICJmbG9hdGZvcm1hdC5vIG9iamFsbG9jLm8gb2JzdGFjay5vIHNwYWNlcy5vIHN0cmVycm9yLm8gc3Ryc2lnbmFsLm8gIi0KLQkrICJ4YXRleGl0Lm8geGV4aXQubyB4bWFsbG9jLm8geHN0cmR1cC5vIHhzdHJlcnJvci5vIgotJCEgYW55dGhpbmcgbm90IGNhdWdodCBieSBsaW5rK3NlYXJjaCBvZiBkdW1teS4qIHNob3VsZCBiZSBhZGRlZCBoZXJlCi0kIEVYVFJBX09GSUxFUyA9ICIiCi0kIQotJCEgbW92ZSB0byB0aGUgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoaXMgY29tbWFuZCBwcm9jZWR1cmUKLSQgb2xkX2RpciA9IGYkZW52aXJvbigiREVGQVVMVCIpCi0kIG5ld19kaXIgPSBmJHBhcnNlKCJfLl87IixmJGVudmlyb24oIlBST0NFRFVSRSIpKSAtICJfLl87IgotJCBzZXQgZGVmYXVsdCAnbmV3X2RpcicKLSQKLSQgRUNITyAiU3RhcnRpbmcgbGliaWJlcnR5IGJ1aWxkLi4uIgotJCBjcmVhdGUgY29uZmlnLmgKLS8qIGxpYmliZXJ0eSBjb25maWcuaCBmb3IgVk1TICovCi0jZGVmaW5lIE5FRURfc3lzX3NpZ2xpc3QKLSNkZWZpbmUgTkVFRF9zdHJzaWduYWwKLSNkZWZpbmUgTkVFRF9wc2lnbmFsCi0jZGVmaW5lIE5FRURfYmFzZW5hbWUKLSQgTElCUiAnV09SS19MSUInIC9DcmVhdGUKLSQKLSQhIGZpcnN0IHBhc3M6IGNvbXBpbGUgInJlcXVpcmVkIiBtb2R1bGVzCi0kIG9maWxlcyA9IFJFUVVJUkVEX09GSUxFUyArICIgIiArIEVYVFJBX09GSUxFUwotJCBwYXNzID0gMQotJCBnb3N1YiBkb19vZmlsZXMKLSQKLSQhIHNlY29uZCBwYXNzOiBwcm9jZXNzIGR1bW15LmMsIHVzaW5nIHRoZSBmaXJzdCBwYXNzJyByZXN1bHRzCi0kIEVDSE8gIiBub3cgY2hlY2tpbmcgcnVuLXRpbWUgbGlicmFyeSBmb3IgbWlzc2luZyBmdW5jdGlvbmFsaXR5IgotJCBpZiBmJHNlYXJjaCgiZHVtbXkub2JqIikubmVzLiIiIHRoZW4gIERFTEVURSBkdW1teS5vYmo7KgotJCBkZWZpbmUvbm9Mb2cgc3lzJGVycm9yIF9OTDoJIWNhbid0IHVzZSAvVXNlcl9Nb2RlIGhlcmUgZHVlIHRvIGdjYwotJCBkZWZpbmUvbm9Mb2cgc3lzJG91dHB1dCBfTkw6CSEgZHJpdmVyJ3MgdXNlIG9mIG11bHRpcGxlIGltYWdlIGFjdGl2YXRpb24KLSQgb24gZXJyb3IgdGhlbiBjb250aW51ZQotJCAnQ0MnIGR1bW15LmMKLSQgZGVhc3NpZ24gc3lzJGVycm9yICAgIXJlc3RvcmUsIG1vcmUgb3IgbGVzcwotJCBkZWFzc2lnbiBzeXMkb3V0cHV0Ci0kIGlmIGYkc2VhcmNoKCJkdW1teS5vYmoiKS5lcXMuIiIgdGhlbiAgZ290byBwYXNzMl9mYWlsdXJlMQotJCEgbGluayBkdW1teS5vYmosIGNhcHR1cmluZyBmdWxsIGxpbmtlciBmZWVkYmFjayBpbiBkdW1teS5tYXAKLSQgb2xkbXNnID0gZiRlbnZpcm9uKCJNRVNTQUdFIikKLSQgc2V0IG1lc3NhZ2UgL0ZhY2lsaXR5L1NldmVyaXR5L0lkZW50aWZpY2F0aW9uL1RleHQKLSQgZGVmaW5lL1VzZXIgc3lzJG91dHB1dCBfTkw6Ci0kIGRlZmluZS9Vc2VyIHN5cyRlcnJvciBfTkw6Ci0kIExJTksvTWFwPWR1bW15Lm1hcC9ub0V4ZSBkdW1teS5vYmosJ1dPUktfTElCJy9MaWJyLC0KLQlnbnVfY2M6WzAwMDAwMF1nY2NsaWIub2xiL0xpYnIsc3lzJGxpYnJhcnk6dmF4Y3J0bC5vbGIvTGlicgotJCBzZXQgbWVzc2FnZSAnb2xkbXNnJwotJCBpZiBmJHNlYXJjaCgiZHVtbXkubWFwIikuZXFzLiIiIHRoZW4gIGdvdG8gcGFzczJfZmFpbHVyZTIKLSQgREVMRVRFIGR1bW15Lm9iajsqCi0kIFNFQVJDSCBkdW1teS5tYXAgIiVMSU5LLUktVURGU1lNIiAvT3V0cHV0PWR1bW15Lmxpc3QKLSQgREVMRVRFIGR1bW15Lm1hcDsqCi0kIEVDSE8gIiBjaGVjayBjb21wbGV0ZWQiCi0kISB3ZSBub3cgaGF2ZSBhIGZpbGUgd2l0aCBvbmUgZW50cnkgcGVyIGxpbmUgb2YgdW5yZXNvbHZhYmxlIHN5bWJvbHMKLSQgb2ZpbGVzID0gIiIKLSQgaWYgZiR0cm5sbm0oIklGSUxFJCIpLm5lcy4iIiB0aGVuICBjbG9zZS9ub0xvZyBpZmlsZSQKLSQJb3Blbi9SZWFkIGlmaWxlJCBkdW1teS5saXN0Ci0kaWxvb3A6IHJlYWQvRW5kPWlkb25lIGlmaWxlJCBpbGluZQotJAlpbGluZSA9IGYkZWRpdChpbGluZSwiQ09NUFJFU1MsVFJJTSxMT1dFUkNBU0UiKQotJAlvZmlsZXMgPSBvZmlsZXMgKyAiICIgKyBmJGVsZW1lbnQoMSwiICIsaWxpbmUpICsgIi5vIgotJAlnb3RvIGlsb29wCi0kaWRvbmU6IGNsb3NlIGlmaWxlJAotJCBERUxFVEUgZHVtbXkubGlzdDsqCi0kIG9uIGVycm9yIHRoZW4gQUJPUlQKLSQKLSQhIHRoaXJkIHBhc3M6IGNvbXBpbGUgIm1pc3NpbmciIG1vZHVsZXMgY29sbGVjdGVkIGluIHBhc3MgMgotJCBwYXNzID0gMwotJCBnb3N1YiBkb19vZmlsZXMKLSQKLSQhIGZpbmlzaCB1cAotJCBMSUJSICdXT1JLX0xJQicgL0NvbXByZXNzIC9PdXRwdXQ9J0xJQl9OQU1FJwkhbmV3LWxpYi5vbGIgLT4gbGliZXJ0eS5vbGIKLSQgREVMRVRFICdXT1JLX0xJQic7KgotJAotJCEgYWxsIGRvbmUKLSQgRUNITyAiQ29tcGxldGVkIGxpYmliZXJ0eSBidWlsZC4iCi0kIHR5cGUgc3lzJGlucHV0OgotCi0gIFlvdSBtYW55IHdpc2ggdG8gZG8KLSAgJCBDT1BZIExJQkVSVFkuT0xCIEdOVV9DQzpbMDAwMDAwXQotICBzbyB0aGF0IHRoaXMgcnVuLXRpbWUgbGlicmFyeSByZXNpZGVzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGdjYydzCi0gIHN1cHBvcnQgbGlicmFyeS4gIFdoZW4gYnVpbGRpbmcgZ2FzLCBiZSBzdXJlIHRvIGxlYXZlIHRoZSBvcmlnaW5hbAotICBjb3B5IG9mIGxpYmVydHkub2xiIGhlcmUgc28gdGhhdCBnYXMncyBidWlsZCBwcm9jZWR1cmUgY2FuIGZpbmQgaXQuCi0KLSQgc2V0IGRlZmF1bHQgJ29sZF9kaXInCi0kIGV4aXQKLSQKLSQhCi0kISBjb21waWxlIGVhY2ggZWxlbWVudCBvZiB0aGUgc3BhY2UtZGVsaW1pdGVkIGxpc3QgJ29maWxlcycKLSQhCi0kZG9fb2ZpbGVzOgotJCBvZmlsZXMgPSBmJGVkaXQob2ZpbGVzLCJDT01QUkVTUyxUUklNIikKLSQgaSA9IDAKLSRvbG9vcDoKLSQgZiA9IGYkZWxlbWVudChpLCIgIixvZmlsZXMpCi0kIGlmIGYuZXFzLiIgIiB0aGVuICBnb3RvIG9kb25lCi0kIGYgPSBmIC0gIi5vIgkhc3RyaXAgZHVtbXkgc3VmZml4Ci0kIEVDSE8gIiAgJydmJyIKLSQgc2tpcF9mID0gMAotJCBpZiBwYXNzLmVxLjMgLmFuZC4gZiRzZWFyY2goIicnZicuYyIpLmVxcy4iIiB0aGVuICBnb3N1YiBjaGtfZGVmZnVuYwotJCBpZiAubm90LnNraXBfZgotJCB0aGVuCi0kICAgJ0NDJyAnZicuYwotJCAgIExJQlIgJ1dPUktfTElCJyAnZicub2JqIC9JbnNlcnQKLSQgICBERUxFVEUgJ2YnLm9iajsqCi0kIGVuZGlmCi0kIGkgPSBpICsgMQotJCBnb3RvIG9sb29wCi0kb2RvbmU6Ci0kIHJldHVybgotJAotJCEKLSQhIGNoZWNrIGZ1bmN0aW9ucy5kZWYgZm9yIGEgREVGRlVOQygpIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gbWlzc2luZyBmaWxlICdmJy5jCi0kIQotJGNoa19kZWZmdW5jOgotJCBkZWZpbmUvVXNlciBzeXMkb3V0cHV0IF9OTDoKLSQgZGVmaW5lL1VzZXIgc3lzJGVycm9yIF9OTDoKLSQgU0VBUkNIIGZ1bmN0aW9ucy5kZWYgIkRFRkZVTkMiLCInJ2YnIiAvTWF0Y2g9QU5ECi0kIGlmICgoJHN0YXR1cy5hbmQuJXg3RkZGRkZGRikgLmVxLiAxKQotJCB0aGVuCi0kICAgc2tpcF9mID0gMQotJCAgIG9wZW4vQXBwZW5kIGNvbmZpZ19oIGNvbmZpZy5oCi0kICAgd3JpdGUgY29uZmlnX2ggIiNkZWZpbmUgTkVFRF8nJ2YnIgotJCAgIGNsb3NlIGNvbmZpZ19oCi0kIGVuZGlmCi0kIHJldHVybgotJAotJCEKLSRwYXNzMl9mYWlsdXJlMToKLSQhIGlmIHdlIHJlYWNoIGhlcmUsIGR1bW15LmMgZmFpbGVkIHRvIGNvbXBpbGUgYW5kIHdlJ3JlIHJlYWxseSBzdHVjawotJCB0eXBlIHN5cyRpbnB1dDoKLQotICBDYW5ub3QgY29tcGlsZSB0aGUgbGlicmFyeSBjb250ZW50cyBjaGVja2VyIChkdW1teS5jICsgZnVuY3Rpb25zLmRlZiksCi0gIHNvIGNhbm5vdCBjb250aW51ZSEKLQotJCEgYXR0ZW1wdCB0aGUgY29tcGlsZSBhZ2Fpbiwgd2l0aG91dCBzdXBwcmVzc2luZyBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoaXMgdGltZQotJCBvbiBlcnJvciB0aGVuIEFCT1JUICswKmYkdmVyaWZ5KHYpCi0kIHYgPSBmJHZlcmlmeSgxKQotJCAnQ0MnIGR1bW15LmMKLSQgQUJPUlQgKzAqZiR2ZXJpZnkodikJISdmJHZlcmlmeSgwKScKLSQhCi0kcGFzczJfZmFpbHVyZTI6Ci0kISBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZS4uCi0kIHR5cGUgc3lzJGlucHV0OgotCi0gIENhbm5vdCBsaW5rIHRoZSBsaWJyYXJ5IGNvbnRlbnRzIGNoZWNrZXIgKGR1bW15Lm9iaiksIHNvIGNhbm5vdCBjb250aW51ZSEKLQotJCEgYXR0ZW1wdCB0aGUgbGluayBhZ2Fpbiwgd2l0aG91dCBzdXBwcmVzc2luZyBkaWFnbm9zdGljIG1lc3NhZ2VzIHRoaXMgdGltZQotJCBvbiBlcnJvciB0aGVuIEFCT1JUICswKmYkdmVyaWZ5KHYpCi0kIHYgPSBmJHZlcmlmeSgxKQotJCBMSU5LL01hcD1kdW1teS5tYXAvbm9FeGUgZHVtbXkub2JqLCdXT1JLX0xJQicvTGliciwtCi0JZ251X2NjOlswMDAwMDBdZ2NjbGliLm9sYi9MaWJyLHN5cyRsaWJyYXJ5OnZheGNydGwub2xiL0xpYnIKLSQgQUJPUlQgKzAqZiR2ZXJpZnkodikJISdmJHZlcmlmeSgwKScKLSQKLSQhIG5vdCByZWFjaGVkCi0kIGV4aXQKZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS92cHJpbnRmLmMgYi9saWJpYmVydHkvdnByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWI0MjVhLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92cHJpbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jaWZkZWYgX19TVERDX18KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dmFyYXJncy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI3VuZGVmIHZwcmludGYKLWludAotdnByaW50ZiAoZm9ybWF0LCBhcCkKLSAgICAgY29uc3QgY2hhciAqZm9ybWF0OwotICAgICB2YV9saXN0IGFwOwotewotICByZXR1cm4gdmZwcmludGYgKHN0ZG91dCwgZm9ybWF0LCBhcCk7Ci19CmRpZmYgLS1naXQgYS9saWJpYmVydHkvdnNwcmludGYuYyBiL2xpYmliZXJ0eS92c3ByaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA3NjBjLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS92c3ByaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHZzcHJpbnRmIGZvciBzeXN0ZW1zIHdpdGhvdXQgaXQuCi0gICBIaWdobHkgc3lzdGVtLWRlcGVuZGVudCwgYnV0IHNob3VsZCB3b3JrIG9uIG1vc3QgInRyYWRpdGlvbmFsIgotICAgaW1wbGVtZW50YXRpb25zIG9mIHN0ZGlvOyBuZXdlciBvbmVzIHNob3VsZCBhbHJlYWR5IGhhdmUgdnNwcmludGYuCi0gICBXcml0dGVuIGJ5IFBlciBCb3RobmVyIG9mIEN5Z251cyBTdXBwb3J0LgotICAgQmFzZWQgb24gbGliZysrJ3MgImZvcm0iICh3cml0dGVuIGJ5IERvdWcgTGVhOyBkbEByb2NreS5vc3dlZ28uZWR1KS4KLSAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5NSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUKLXNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi1BcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwotY29tcGlsZWQgd2l0aCBhIEdOVSBjb21waWxlciB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKLXRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KLVRoaXMgZXhjZXB0aW9uIGRvZXMgbm90IGhvd2V2ZXIgaW52YWxpZGF0ZSBhbnkgb3RoZXIgcmVhc29ucyB3aHkKLXRoZSBleGVjdXRhYmxlIGZpbGUgbWlnaHQgYmUgY292ZXJlZCBieSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICovCi0KLSNpbmNsdWRlIDx2YXJhcmdzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotI3VuZGVmIHZzcHJpbnRmCi0KLWludAotdnNwcmludGYgKGJ1ZiwgZm9ybWF0LCBhcCkKLSAgICAgY2hhciAqYnVmOwotICAgICBjb25zdCBjaGFyICpmb3JtYXQ7Ci0gICAgIHZhX2xpc3QgYXA7Ci17Ci0gIEZJTEUgYjsKLSAgaW50IHJldDsKLSNpZmRlZiBWTVMKLSAgYi0+X2ZsYWcgPSBfSU9XUlR8X0lPU1RSRzsKLSAgYi0+X3B0ciA9IGJ1ZjsKLSAgYi0+X2NudCA9IDEyMDAwOwotI2Vsc2UKLSAgYi5fZmxhZyA9IF9JT1dSVHxfSU9TVFJHOwotICBiLl9wdHIgPSBidWY7Ci0gIGIuX2NudCA9IDEyMDAwOwotI2VuZGlmCi0gIHJldCA9IF9kb3BybnQoZm9ybWF0LCBhcCwgJmIpOwotICBwdXRjKCdcMCcsICZiKTsKLSAgcmV0dXJuIHJldDsKLQotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3dhaXRwaWQuYyBiL2xpYmliZXJ0eS93YWl0cGlkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZGIwYjkuLjAwMDAwMDAKLS0tIGEvbGliaWJlcnR5L3dhaXRwaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWludAotd2FpdHBpZCAocGlkLCBzdGF0X2xvYywgb3B0aW9ucykKLQlpbnQgcGlkLCAqc3RhdF9sb2MsIG9wdGlvbnM7Ci17Ci0gIGZvciAoOzspCi0gICAgewotICAgICAgaW50IHdwaWQgPSB3YWl0KHN0YXRfbG9jKTsKLSAgICAgIGlmICh3cGlkID09IHBpZCB8fCB3cGlkID09IC0xKQotCXJldHVybiB3cGlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94YXRleGl0LmMgYi9saWJpYmVydHkveGF0ZXhpdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ3NmMyLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94YXRleGl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAxOTkwIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogJXNjY3MuaW5jbHVkZS5yZWRpc3QuYyUKLSAqLwotCi0vKiBBZGFwdGVkIGZyb20gbmV3bGliL2xpYmMvc3RkbGliL3ssYXR9ZXhpdC5bY2hdLgotICAgSWYgeW91IHVzZSB4YXRleGl0LCB5b3UgbXVzdCBjYWxsIHhleGl0IGluc3RlYWQgb2YgZXhpdC4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIF9fU1REQ19fCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZWxzZQotI2RlZmluZSBzaXplX3QgdW5zaWduZWQgbG9uZwotI2VuZGlmCi0KLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhpcyBtdXN0IGJlIGRlY2xhcmVkLiAgKi8KLVBUUiBtYWxsb2MgUEFSQU1TICgoc2l6ZV90KSk7Ci0KLXN0YXRpYyB2b2lkIHhhdGV4aXRfY2xlYW51cCBQQVJBTVMgKCh2b2lkKSk7Ci0KLS8qIFBvaW50ZXIgdG8gZnVuY3Rpb24gcnVuIGJ5IHhleGl0LiAgKi8KLWV4dGVybiB2b2lkICgqX3hleGl0X2NsZWFudXApIFBBUkFNUyAoKHZvaWQpKTsKLQotI2RlZmluZQlYQVRFWElUX1NJWkUgMzIKLQotc3RydWN0IHhhdGV4aXQgewotCXN0cnVjdAl4YXRleGl0ICpuZXh0OwkJLyogbmV4dCBpbiBsaXN0ICovCi0JaW50CWluZDsJCQkvKiBuZXh0IGluZGV4IGluIHRoaXMgdGFibGUgKi8KLQl2b2lkCSgqZm5zW1hBVEVYSVRfU0laRV0pIFBBUkFNUyAoKHZvaWQpKTsJLyogdGhlIHRhYmxlIGl0c2VsZiAqLwotfTsKLQotLyogQWxsb2NhdGUgb25lIHN0cnVjdCBzdGF0aWNhbGx5IHRvIGd1YXJhbnRlZSB0aGF0IHdlIGNhbiByZWdpc3RlcgotICAgYXQgbGVhc3QgYSBmZXcgaGFuZGxlcnMuICAqLwotc3RhdGljIHN0cnVjdCB4YXRleGl0IHhhdGV4aXRfZmlyc3Q7Ci0KLS8qIFBvaW50cyB0byBoZWFkIG9mIExJRk8gc3RhY2suICAqLwotc3RhdGljIHN0cnVjdCB4YXRleGl0ICp4YXRleGl0X2hlYWQgPSAmeGF0ZXhpdF9maXJzdDsKLQotLyogUmVnaXN0ZXIgZnVuY3Rpb24gRk4gdG8gYmUgcnVuIGJ5IHhleGl0LgotICAgUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgaWYgbm90LiAgKi8KLQotaW50Ci14YXRleGl0IChmbikKLSAgICAgdm9pZCAoKmZuKSBQQVJBTVMgKCh2b2lkKSk7Ci17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB4YXRleGl0ICpwOwotCi0gIC8qIFRlbGwgeGV4aXQgdG8gY2FsbCB4YXRleGl0X2NsZWFudXAuICAqLwotICBpZiAoIV94ZXhpdF9jbGVhbnVwKQotICAgIF94ZXhpdF9jbGVhbnVwID0geGF0ZXhpdF9jbGVhbnVwOwotCi0gIHAgPSB4YXRleGl0X2hlYWQ7Ci0gIGlmIChwLT5pbmQgPj0gWEFURVhJVF9TSVpFKQotICAgIHsKLSAgICAgIGlmICgocCA9IChzdHJ1Y3QgeGF0ZXhpdCAqKSBtYWxsb2MgKHNpemVvZiAqcCkpID09IE5VTEwpCi0JcmV0dXJuIC0xOwotICAgICAgcC0+aW5kID0gMDsKLSAgICAgIHAtPm5leHQgPSB4YXRleGl0X2hlYWQ7Ci0gICAgICB4YXRleGl0X2hlYWQgPSBwOwotICAgIH0KLSAgcC0+Zm5zW3AtPmluZCsrXSA9IGZuOwotICByZXR1cm4gMDsKLX0KLQotLyogQ2FsbCBhbnkgY2xlYW51cCBmdW5jdGlvbnMuICAqLwotCi1zdGF0aWMgdm9pZAoteGF0ZXhpdF9jbGVhbnVwICgpCi17Ci0gIHJlZ2lzdGVyIHN0cnVjdCB4YXRleGl0ICpwOwotICByZWdpc3RlciBpbnQgbjsKLQotICBmb3IgKHAgPSB4YXRleGl0X2hlYWQ7IHA7IHAgPSBwLT5uZXh0KQotICAgIGZvciAobiA9IHAtPmluZDsgLS1uID49IDA7KQotICAgICAgKCpwLT5mbnNbbl0pICgpOwotfQpkaWZmIC0tZ2l0IGEvbGliaWJlcnR5L3hleGl0LmMgYi9saWJpYmVydHkveGV4aXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMxYmJlMC4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveGV4aXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qIHhleGl0LmMgLS0gUnVuIGFueSBleGl0IGhhbmRsZXJzLCB0aGVuIGV4aXQuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDk1LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCi1MaWJpYmVydHkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi1tb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi12ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUxpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1MaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYWxvbmcgd2l0aCBsaWJpYmVydHk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUKLXRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vKiBUaGlzIHZhcmlhYmxlIGlzIHNldCBieSB4YXRleGl0IGlmIGl0IGlzIGNhbGxlZC4gIFRoaXMgd2F5LCB4bWFsbG9jCi0gICBkb2Vzbid0IGRyYWcgeGF0ZXhpdCBpbnRvIHRoZSBsaW5rLiAgKi8KLXZvaWQgKCpfeGV4aXRfY2xlYW51cCkgUEFSQU1TICgodm9pZCkpOwotCi12b2lkCi14ZXhpdCAoY29kZSkKLSAgICAgaW50IGNvZGU7Ci17Ci0gIGlmIChfeGV4aXRfY2xlYW51cCAhPSBOVUxMKQotICAgICgqX3hleGl0X2NsZWFudXApICgpOwotICBleGl0IChjb2RlKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94bWFsbG9jLmMgYi9saWJpYmVydHkveG1hbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDgzNzkwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94bWFsbG9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyogbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgd2l0aCBlcnJvciBjaGVja2luZy4KLSAgIENvcHlyaWdodCAxOTg5LCA5MCwgOTEsIDkyLCA5MywgOTQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICAKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsaWJpYmVydHkgbGlicmFyeS4KLUxpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLXZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotTGliaWJlcnR5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUxpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhbG9uZyB3aXRoIGxpYmliZXJ0eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKLW5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBfX1NURENfXwotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2Vsc2UKLSNkZWZpbmUgc2l6ZV90IHVuc2lnbmVkIGxvbmcKLSNkZWZpbmUgcHRyZGlmZl90IGxvbmcKLSNlbmRpZgotCi0jaWYgVk1TCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5peGxpYi5oPgotI2Vsc2UKLS8qIEZvciBzeXN0ZW1zIHdpdGggbGFyZ2VyIHBvaW50ZXJzIHRoYW4gaW50cywgdGhlc2UgbXVzdCBiZSBkZWNsYXJlZC4gICovCi1QVFIgbWFsbG9jIFBBUkFNUyAoKHNpemVfdCkpOwotUFRSIHJlYWxsb2MgUEFSQU1TICgoUFRSLCBzaXplX3QpKTsKLVBUUiBjYWxsb2MgUEFSQU1TICgoc2l6ZV90LCBzaXplX3QpKTsKLVBUUiBzYnJrIFBBUkFNUyAoKHB0cmRpZmZfdCkpOwotI2VuZGlmCi0KLS8qIFRoZSBwcm9ncmFtIG5hbWUgaWYgc2V0LiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lID0gIiI7Ci0KLSNpZiAhZGVmaW5lZCAoX19DWUdXSU5fXykgJiYgZGVmaW5lZCAoX19DWUdXSU4zMl9fKQotI2RlZmluZSBfX0NZR1dJTl9fIDEKLSNlbmRpZgotCi0jaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fVVdJTl9fKQotLyogVGhlIGluaXRpYWwgc2Jyaywgc2V0IHdoZW4gdGhlIHByb2dyYW0gbmFtZSBpcyBzZXQuIE5vdCB1c2VkIGZvciB3aW4zMgotICAgcG9ydHMgb3RoZXIgdGhhbiBjeWd3aW4zMi4gICovCi1zdGF0aWMgY2hhciAqZmlyc3RfYnJlYWsgPSBOVUxMOwotI2VuZGlmIC8qICEgX1dJTjMyIHx8IF9fQ1lHV0lOIF9fIHx8IF9fVVdJTl9fICovCi0KLXZvaWQKLXhtYWxsb2Nfc2V0X3Byb2dyYW1fbmFtZSAocykKLSAgICAgY29uc3QgY2hhciAqczsKLXsKLSAgbmFtZSA9IHM7Ci0jaWYgISBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQ1lHV0lOX18pIHx8IGRlZmluZWQgKF9fVVdJTl9fKQotICAvKiBXaW4zMiBwb3J0cyBvdGhlciB0aGFuIGN5Z3dpbjMyIGRvbid0IGhhdmUgYnJrKCkgKi8KLSAgaWYgKGZpcnN0X2JyZWFrID09IE5VTEwpCi0gICAgZmlyc3RfYnJlYWsgPSAoY2hhciAqKSBzYnJrICgwKTsKLSNlbmRpZiAvKiAhIF9XSU4zMiB8fCBfX0NZR1dJTiBfXyB8fCBfX1VXSU5fXyAqLwotfQotCi1QVFIKLXhtYWxsb2MgKHNpemUpCi0gICAgc2l6ZV90IHNpemU7Ci17Ci0gIFBUUiBuZXdtZW07Ci0KLSAgaWYgKHNpemUgPT0gMCkKLSAgICBzaXplID0gMTsKLSAgbmV3bWVtID0gbWFsbG9jIChzaXplKTsKLSAgaWYgKCFuZXdtZW0pCi0gICAgewotI2lmICEgZGVmaW5lZCAoX1dJTjMyKSB8fCBkZWZpbmVkIChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkIChfX1VXSU5fXykKLSAgICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKLSAgICAgIHNpemVfdCBhbGxvY2F0ZWQ7Ci0KLSAgICAgIGlmIChmaXJzdF9icmVhayAhPSBOVUxMKQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gZmlyc3RfYnJlYWs7Ci0gICAgICBlbHNlCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSAoY2hhciAqKSAmZW52aXJvbjsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgIlxuJXMlc0NhbiBub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUsICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgICAgIlxuJXMlc0NhbiBub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUpOwotI2VuZGlmIC8qICEgX1dJTjMyIHx8IF9fQ1lHV0lOIF9fIHx8IF9fVVdJTl9fICovCi0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gKG5ld21lbSk7Ci19Ci0KLVBUUgoteGNhbGxvYyAobmVsZW0sIGVsc2l6ZSkKLSAgc2l6ZV90IG5lbGVtLCBlbHNpemU7Ci17Ci0gIFBUUiBuZXdtZW07Ci0KLSAgaWYgKG5lbGVtID09IDAgfHwgZWxzaXplID09IDApCi0gICAgbmVsZW0gPSBlbHNpemUgPSAxOwotCi0gIG5ld21lbSA9IGNhbGxvYyAobmVsZW0sIGVsc2l6ZSk7Ci0gIGlmICghbmV3bWVtKQotICAgIHsKLSNpZiAhIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZCAoX19DWUdXSU5fXykKLSAgICAgIGV4dGVybiBjaGFyICoqZW52aXJvbjsKLSAgICAgIHNpemVfdCBhbGxvY2F0ZWQ7Ci0KLSAgICAgIGlmIChmaXJzdF9icmVhayAhPSBOVUxMKQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gZmlyc3RfYnJlYWs7Ci0gICAgICBlbHNlCi0JYWxsb2NhdGVkID0gKGNoYXIgKikgc2JyayAoMCkgLSAoY2hhciAqKSAmZW52aXJvbjsKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLQkgICAgICAgIlxuJXMlc0NhbiBub3QgYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChuZWxlbSAqIGVsc2l6ZSksICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgICAgIlxuJXMlc0NhbiBub3QgYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLAotICAgICAgICAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLSAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIChuZWxlbSAqIGVsc2l6ZSkpOwotI2VuZGlmIC8qICEgX1dJTjMyIHx8IF9fQ1lHV0lOIF9fICovCi0gICAgICB4ZXhpdCAoMSk7Ci0gICAgfQotICByZXR1cm4gKG5ld21lbSk7Ci19Ci0KLVBUUgoteHJlYWxsb2MgKG9sZG1lbSwgc2l6ZSkKLSAgICBQVFIgb2xkbWVtOwotICAgIHNpemVfdCBzaXplOwotewotICBQVFIgbmV3bWVtOwotCi0gIGlmIChzaXplID09IDApCi0gICAgc2l6ZSA9IDE7Ci0gIGlmICghb2xkbWVtKQotICAgIG5ld21lbSA9IG1hbGxvYyAoc2l6ZSk7Ci0gIGVsc2UKLSAgICBuZXdtZW0gPSByZWFsbG9jIChvbGRtZW0sIHNpemUpOwotICBpZiAoIW5ld21lbSkKLSAgICB7Ci0jaWZuZGVmIF9fTUlOR1czMl9fCi0gICAgICBleHRlcm4gY2hhciAqKmVudmlyb247Ci0gICAgICBzaXplX3QgYWxsb2NhdGVkOwotCi0gICAgICBpZiAoZmlyc3RfYnJlYWsgIT0gTlVMTCkKLQlhbGxvY2F0ZWQgPSAoY2hhciAqKSBzYnJrICgwKSAtIGZpcnN0X2JyZWFrOwotICAgICAgZWxzZQotCWFsbG9jYXRlZCA9IChjaGFyICopIHNicmsgKDApIC0gKGNoYXIgKikgJmVudmlyb247Ci0gICAgICBmcHJpbnRmIChzdGRlcnIsCi0JICAgICAgICJcbiVzJXNDYW4gbm90IHJlYWxsb2NhdGUgJWx1IGJ5dGVzIGFmdGVyIGFsbG9jYXRpbmcgJWx1IGJ5dGVzXG4iLAotCSAgICAgICBuYW1lLCAqbmFtZSA/ICI6ICIgOiAiIiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNpemUsICh1bnNpZ25lZCBsb25nKSBhbGxvY2F0ZWQpOwotI2Vsc2UKLSAgICAgIGZwcmludGYgKHN0ZGVyciwKLSAgICAgICAgICAgICAgIlxuJXMlc0NhbiBub3QgcmVhbGxvY2F0ZSAlbHUgYnl0ZXNcbiIsCi0gICAgICAgICAgICAgIG5hbWUsICpuYW1lID8gIjogIiA6ICIiLAotICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc2l6ZSk7Ci0jZW5kaWYgLyogX19NSU5HVzMyX18gKi8KLSAgICAgIHhleGl0ICgxKTsKLSAgICB9Ci0gIHJldHVybiAobmV3bWVtKTsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94c3RyZHVwLmMgYi9saWJpYmVydHkveHN0cmR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZhYmEwLi4wMDAwMDAwCi0tLSBhL2xpYmliZXJ0eS94c3RyZHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKiB4c3RyZHVwLmMgLS0gRHVwbGljYXRlIGEgc3RyaW5nIGluIG1lbW9yeSwgdXNpbmcgeG1hbGxvYy4KLSAgIFRoaXMgdHJpdmlhbCBmdW5jdGlvbiBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSAgIElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0LCBEZWNlbWJlciAxOTk1LiAgKi8KLQotI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKLSNlbmRpZgotI2lmZGVmIEhBVkVfU1RSSU5HX0gKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0KLWNoYXIgKgoteHN0cmR1cCAocykKLSAgY29uc3QgY2hhciAqczsKLXsKLSAgcmVnaXN0ZXIgc2l6ZV90IGxlbiA9IHN0cmxlbiAocykgKyAxOwotICByZWdpc3RlciBjaGFyICpyZXQgPSB4bWFsbG9jIChsZW4pOwotICBtZW1jcHkgKHJldCwgcywgbGVuKTsKLSAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2xpYmliZXJ0eS94c3RyZXJyb3IuYyBiL2xpYmliZXJ0eS94c3RyZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwYjY1My4uMDAwMDAwMAotLS0gYS9saWJpYmVydHkveHN0cmVycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKiB4c3RyZXJyb3IuYyAtLSBqYWNrZXQgcm91dGluZSBmb3IgbW9yZSByb2J1c3Qgc3RyZXJyb3IoKSB1c2FnZS4KLSAgIEZyaSBKdW4gMTYgMTg6MzA6MDAgMTk5NSAgUGF0IFJhbmtpbiAgPHJhbmtpbkBlcWwuY2FsdGVjaC5lZHU+Ci0gICBUaGlzIGNvZGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWZkZWYgVk1TCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpZiAhZGVmaW5lZCAoX19TVFJJQ1RfQU5TSV9fKSAmJiAhZGVmaW5lZCAoX19ISURFX0ZPUkJJRERFTl9OQU1FUykKLWV4dGVybiBjaGFyICpzdHJlcnJvciBQQVJBTVMgKChpbnQsLi4uKSk7Ci0jZGVmaW5lIERPTlRfREVDTEFSRV9TVFJFUlJPUgotI2VuZGlmCi0jZW5kaWYJLyogVk1TICovCi0KLSNpZm5kZWYgRE9OVF9ERUNMQVJFX1NUUkVSUk9SCi1leHRlcm4gY2hhciAqc3RyZXJyb3IgUEFSQU1TICgoaW50KSk7Ci0jZW5kaWYKLQotLyogSWYgc3RyZXJyb3IgcmV0dXJucyBOVUxMLCB3ZSdsbCBmb3JtYXQgdGhlIG51bWJlciBpbnRvIGEgc3RhdGljIGJ1ZmZlci4gICovCi0KLSNkZWZpbmUgRVJSU1RSX0ZNVCAidW5kb2N1bWVudGVkIGVycm9yICMlZCIKLXN0YXRpYyBjaGFyIHhzdHJlcnJvcl9idWZbc2l6ZW9mIEVSUlNUUl9GTVQgKyAyMF07Ci0KLS8qIExpa2Ugc3RyZXJyb3IsIGJ1dCByZXN1bHQgaXMgbmV2ZXIgYSBudWxsIHBvaW50ZXIuICAqLwotCi1jaGFyICoKLXhzdHJlcnJvciAoZXJybnVtKQotICAgICBpbnQgZXJybnVtOwotewotICBjaGFyICplcnJzdHI7Ci0jaWZkZWYgVk1TCi0gIGNoYXIgKigqdm1zbGliX3N0cmVycm9yKSBQQVJBTVMgKChpbnQsLi4uKSk7Ci0KLSAgLyogT3ZlcnJpZGUgYW55IHBvc3NpYmx5LWNvbmZsaWN0aW5nIGRlY2xhcmF0aW9uIGZyb20gc3lzdGVtIGhlYWRlci4gICovCi0gIHZtc2xpYl9zdHJlcnJvciA9IChjaGFyICooKikgUEFSQU1TICgoaW50LC4uLikpKSBzdHJlcnJvcjsKLSAgLyogU2Vjb25kIGFyZ3VtZW50IG1hdHRlcnMgaWZmIGZpcnN0IGlzIEVWTVNFUlIsIGJ1dCBpdCdzIHNpbXBsZXIgdG8KLSAgICAgcGFzcyBpdCB1bmNvbmRpdGlvbmFsbHkuICBgdmF4YyRlcnJubycgaXMgZGVjbGFyZWQgaW4gPGVycm5vLmg+Ci0gICAgIGFuZCBtYWludGFpbmVkIGJ5IHRoZSBydW4tdGltZSBsaWJyYXJ5IGluIHBhcmFsbGVsIHRvIGBlcnJubycuCi0gICAgIFdlIGFzc3VtZSB0aGF0IGBlcnJudW0nIGNvcnJlc3BvbmRzIHRvIHRoZSBsYXN0IHZhbHVlIGFzc2lnbmVkIHRvCi0gICAgIGVycm5vIGJ5IHRoZSBydW4tdGltZSBsaWJyYXJ5LCBoZW5jZSB2YXhjJGVycm5vIHdpbGwgYmUgcmVsZXZhbnQuICAqLwotICBlcnJzdHIgPSAoKnZtc2xpYl9zdHJlcnJvcikgKGVycm51bSwgdmF4YyRlcnJubyk7Ci0jZWxzZQotICBlcnJzdHIgPSBzdHJlcnJvciAoZXJybnVtKTsKLSNlbmRpZgotCi0gIC8qIElmIGBlcnJudW0nIGlzIG91dCBvZiByYW5nZSwgcmVzdWx0IG1pZ2h0IGJlIE5VTEwuICBXZSdsbCBmaXggdGhhdC4gICovCi0gIGlmICghZXJyc3RyKQotICAgIHsKLSAgICAgIHNwcmludGYgKHhzdHJlcnJvcl9idWYsIEVSUlNUUl9GTVQsIGVycm51bSk7Ci0gICAgICBlcnJzdHIgPSB4c3RyZXJyb3JfYnVmOwotICAgIH0KLSAgcmV0dXJuIGVycnN0cjsKLX0KZGlmZiAtLWdpdCBhL2x0Y29uZmlnIGIvbHRjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMzA0ZmQuLjAwMDAwMDAKLS0tIGEvbHRjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwyODIyICswLDAgQEAKLSMhIC9iaW4vc2gKLQotIyBsdGNvbmZpZyAtIENyZWF0ZSBhIHN5c3RlbS1zcGVjaWZpYyBsaWJ0b29sLgotIyBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgR29yZG9uIE1hdHppZ2tlaXQgPGdvcmRAZ251LmFpLm1pdC5lZHU+LCAxOTk2Ci0jCi0jIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0jIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0jCi0jIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKLSMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCi0jIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCi0jIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KLQotIyBBIGxvdCBvZiB0aGlzIHNjcmlwdCBpcyB0YWtlbiBmcm9tIGF1dG9jb25mLTIuMTAuCi0KLSMgQ2hlY2sgdGhhdCB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgY29ycmVjdCBzaGVsbC4KLVNIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9Ci1lY2hvPWVjaG8KLWlmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0IDAKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwuCi0gIGV4ZWMgIiRTSEVMTCIgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLSMgRmluZCB0aGUgY29ycmVjdCBQQVRIIHNlcGFyYXRvci4gIFVzdWFsbHkgdGhpcyBpcyBgOicsIGJ1dAotIyBESkdQUCB1c2VzIGA7JyBsaWtlIERPUy4KLWlmIHRlc3QgIlgke1BBVEhfU0VQQVJBVE9SK3NldH0iICE9ICJYc2V0IjsgdGhlbgotICBVTkFNRT0ke1VOQU1FLWB1bmFtZSAyPi9kZXYvbnVsbGB9Ci0gIGNhc2UgWCRVTkFNRSBpbgotICAgICotRE9TKSBQQVRIX1NFUEFSQVRPUj0nOycgOzsKLSAgICAqKSAgICAgUEFUSF9TRVBBUkFUT1I9JzonIDs7Ci0gIGVzYWMKLWZpCi0KLSMgVGhlIEhQLVVYIGtzaCBhbmQgUE9TSVggc2hlbGwgcHJpbnQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gc3Rkb3V0Ci0jIGlmIENEUEFUSCBpcyBzZXQuCi1pZiB0ZXN0ICIke0NEUEFUSCtzZXR9IiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQotCi1pZiB0ZXN0ICJYJHtlY2hvX3Rlc3Rfc3RyaW5nK3NldH0iICE9ICJYc2V0IjsgdGhlbgotICAjIGZpbmQgYSBzdHJpbmcgYXMgbGFyZ2UgYXMgcG9zc2libGUsIGFzIGxvbmcgYXMgdGhlIHNoZWxsIGNhbiBjb3BlIHdpdGggaXQKLSAgZm9yIGNtZCBpbiAnc2VkIDUwcSAiJDAiJyAnc2VkIDIwcSAiJDAiJyAnc2VkIDEwcSAiJDAiJyAnc2VkIDJxICIkMCInICdlY2hvIHRlc3QnOyBkbwotICAgICMgZXhwZWN0ZWQgc2l6ZXM6IGxlc3MgdGhhbiAyS2IsIDFLYiwgNTEyIGJ5dGVzLCAxNiBieXRlcywgLi4uCi0gICAgaWYgKGVjaG9fdGVzdF9zdHJpbmc9ImBldmFsICRjbWRgIikgMj4vZGV2L251bGwgJiYKLSAgICAgICBlY2hvX3Rlc3Rfc3RyaW5nPSJgZXZhbCAkY21kYCIgJiYKLSAgICAgICAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi1maQotCi1pZiB0ZXN0ICJYYCgkZWNobyAnXHQnKSAyPi9kZXYvbnVsbGAiICE9ICdYXHQnIHx8Ci0gICB0ZXN0ICJYYCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiICE9IFgiJGVjaG9fdGVzdF9zdHJpbmciOyB0aGVuCi0gICMgVGhlIFNvbGFyaXMsIEFJWCwgYW5kIERpZ2l0YWwgVW5peCBkZWZhdWx0IGVjaG8gcHJvZ3JhbXMgdW5xdW90ZQotICAjIGJhY2tzbGFzaGVzLiAgVGhpcyBtYWtlcyBpdCBpbXBvc3NpYmxlIHRvIHF1b3RlIGJhY2tzbGFzaGVzIHVzaW5nCi0gICMgICBlY2hvICIkc29tZXRoaW5nIiB8IHNlZCAncy9cXC9cXFxcL2cnCi0gICMKLSAgIyBTbywgZmlyc3Qgd2UgbG9vayBmb3IgYSB3b3JraW5nIGVjaG8gaW4gdGhlIHVzZXIncyBQQVRILgotCi0gIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICBmb3IgZGlyIGluICRQQVRIIC91c3IvdWNiOyBkbwotICAgIGlmIHRlc3QgLWYgJGRpci9lY2hvICYmCi0gICAgICAgdGVzdCAiWGAoJGRpci9lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotICAgICAgIHRlc3QgIlhgKCRkaXIvZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgIGVjaG89IiRkaXIvZWNobyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRzYXZlX2lmcyIKLQotICBpZiB0ZXN0ICJYJGVjaG8iID0gWGVjaG87IHRoZW4KLSAgICAjIFdlIGRpZG4ndCBmaW5kIGEgYmV0dGVyIGVjaG8sIHNvIGxvb2sgZm9yIGFsdGVybmF0aXZlcy4KLSAgICBpZiB0ZXN0ICJYYChwcmludCAtciAnXHQnKSAyPi9kZXYvbnVsbGAiID0gJ1hcdCcgJiYKLSAgICAgICB0ZXN0ICJYYChwcmludCAtciAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLSAgICAgICMgVGhpcyBzaGVsbCBoYXMgYSBidWlsdGluIHByaW50IC1yIHRoYXQgZG9lcyB0aGUgdHJpY2suCi0gICAgICBlY2hvPSdwcmludCAtcicKLSAgICBlbGlmIHRlc3QgLWYgL2Jpbi9rc2ggJiYgdGVzdCAiWCRDT05GSUdfU0hFTEwiICE9IFgvYmluL2tzaDsgdGhlbgotICAgICAgIyBJZiB3ZSBoYXZlIGtzaCwgdHJ5IHJ1bm5pbmcgbHRjb25maWcgYWdhaW4gd2l0aCBpdC4KLSAgICAgIE9SSUdJTkFMX0NPTkZJR19TSEVMTD0iJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0iCi0gICAgICBleHBvcnQgT1JJR0lOQUxfQ09ORklHX1NIRUxMCi0gICAgICBDT05GSUdfU0hFTEw9L2Jpbi9rc2gKLSAgICAgIGV4cG9ydCBDT05GSUdfU0hFTEwKLSAgICAgIGV4ZWMgIiRDT05GSUdfU0hFTEwiICIkMCIgLS1uby1yZWV4ZWMgJHsxKyIkQCJ9Ci0gICAgZWxzZQotICAgICAgIyBUcnkgdXNpbmcgcHJpbnRmLgotICAgICAgZWNobz0ncHJpbnRmICIlc1xuIicKLSAgICAgIGlmIHRlc3QgIlhgKCRlY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSB0ZXN0ICJYYCgkZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQkjIENvb2wsIHByaW50ZiB3b3JrcwotCToKLSAgICAgIGVsaWYgdGVzdCAiWGAoIiRPUklHSU5BTF9DT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICdcdCcpIDI+L2Rldi9udWxsYCIgPSAnWFx0JyAmJgotCSAgIHRlc3QgIlhgKCIkT1JJR0lOQUxfQ09ORklHX1NIRUxMIiAiJDAiIC0tZmFsbGJhY2stZWNobyAiJGVjaG9fdGVzdF9zdHJpbmciKSAyPi9kZXYvbnVsbGAiID0gWCIkZWNob190ZXN0X3N0cmluZyI7IHRoZW4KLQlDT05GSUdfU0hFTEw9IiRPUklHSU5BTF9DT05GSUdfU0hFTEwiCi0JZXhwb3J0IENPTkZJR19TSEVMTAotCVNIRUxMPSIkQ09ORklHX1NIRUxMIgotCWV4cG9ydCBTSEVMTAotCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxpZiB0ZXN0ICJYYCgiJENPTkZJR19TSEVMTCIgIiQwIiAtLWZhbGxiYWNrLWVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnICYmCi0JICAgdGVzdCAiWGAoIiRDT05GSUdfU0hFTEwiICIkMCIgLS1mYWxsYmFjay1lY2hvICIkZWNob190ZXN0X3N0cmluZyIpIDI+L2Rldi9udWxsYCIgPSBYIiRlY2hvX3Rlc3Rfc3RyaW5nIjsgdGhlbgotCWVjaG89IiRDT05GSUdfU0hFTEwgJDAgLS1mYWxsYmFjay1lY2hvIgotICAgICAgZWxzZQotCSMgbWF5YmUgd2l0aCBhIHNtYWxsZXIgc3RyaW5nLi4uCi0JcHJldj06Ci0KLQlmb3IgY21kIGluICdlY2hvIHRlc3QnICdzZWQgMnEgIiQwIicgJ3NlZCAxMHEgIiQwIicgJ3NlZCAyMHEgIiQwIicgJ3NlZCA1MHEgIiQwIic7IGRvCi0JICBpZiAodGVzdCAiWCRlY2hvX3Rlc3Rfc3RyaW5nIiA9ICJYYGV2YWwgJGNtZGAiKSAyPi9kZXYvbnVsbDsgdGhlbgotCSAgICBicmVhawotCSAgZmkKLQkgIHByZXY9IiRjbWQiCi0JZG9uZQotCi0JaWYgdGVzdCAiJHByZXYiICE9ICdzZWQgNTBxICIkMCInOyB0aGVuCi0JICBlY2hvX3Rlc3Rfc3RyaW5nPWBldmFsICRwcmV2YAotCSAgZXhwb3J0IGVjaG9fdGVzdF9zdHJpbmcKLQkgIGV4ZWMgIiR7T1JJR0lOQUxfQ09ORklHX1NIRUxMfSIgIiQwIiAkezErIiRAIn0KLQllbHNlCi0JICAjIE9vcHMuICBXZSBsb3N0IGNvbXBsZXRlbHksIHNvIGp1c3Qgc3RpY2sgd2l0aCBlY2hvLgotCSAgZWNobz1lY2hvCi0JZmkKLSAgICAgIGZpCi0gICAgZmkKLSAgZmkKLWZpCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgcy9eWC8vJwotc2VkX3F1b3RlX3N1YnN0PSdzL1woW1xcIlxcYCRcXFxcXVwpL1xcXDEvZycKLQotIyBTYW1lIGFzIGFib3ZlLCBidXQgZG8gbm90IHF1b3RlIHZhcmlhYmxlIHJlZmVyZW5jZXMuCi1kb3VibGVfcXVvdGVfc3Vic3Q9J3MvXChbXFwiXFxgXFxcXF1cKS9cXFwxL2cnCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0byBkZWxheSBleHBhbnNpb24gb2YgYW4gZXNjYXBlZCBzaGVsbCB2YXJpYWJsZSBpbiBhCi0jIGRvdWJsZV9xdW90ZV9zdWJzdCdlZCBzdHJpbmcuCi1kZWxheV92YXJpYWJsZV9zdWJzdD0ncy9cXFxcXFxcXFxcXCQvXFxcXFxcJC9nJwotCi0jIFRoZSBuYW1lIG9mIHRoaXMgcHJvZ3JhbS4KLXByb2duYW1lPWAkZWNobyAiWCQwIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSMgQ29uc3RhbnRzOgotUFJPR1JBTT1sdGNvbmZpZwotUEFDS0FHRT1saWJ0b29sCi1WRVJTSU9OPTEuMmYKLVRJTUVTVEFNUD0iICgxLjM4NSAxOTk5LzAzLzE1IDE3OjI0OjU0KSIKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LmMgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LmMgJExJQlMgMT4mNScKLXJtPSJybSAtZiIKLQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotCi0jIEdsb2JhbCB2YXJpYWJsZXM6Ci1kZWZhdWx0X29maWxlPWxpYnRvb2wKLWNhbl9idWlsZF9zaGFyZWQ9eWVzCi1lbmFibGVfc2hhcmVkPXllcwotIyBBbGwga25vd24gbGlua2VycyByZXF1aXJlIGEgYC5hJyBhcmNoaXZlIGZvciBzdGF0aWMgbGlua2luZy4KLWVuYWJsZV9zdGF0aWM9eWVzCi1lbmFibGVfZmFzdF9pbnN0YWxsPXllcwotZW5hYmxlX2Rsb3Blbj11bmtub3duCi1sdG1haW49Ci1zaWxlbnQ9Ci1zcmNkaXI9Ci1hY19jb25maWdfZ3Vlc3M9Ci1hY19jb25maWdfc3ViPQotaG9zdD0KLW5vbm9wdD0KLW9maWxlPSIkZGVmYXVsdF9vZmlsZSIKLXZlcmlmeV9ob3N0PXllcwotd2l0aF9nY2M9bm8KLXdpdGhfZ251X2xkPW5vCi1uZWVkX2xvY2tzPXllcwotYWNfZXh0PWMKLW9iamV4dD1vCi1saWJleHQ9YQotY2FjaGVfZmlsZT0KLQotb2xkX0FSPSIkQVIiCi1vbGRfQ0M9IiRDQyIKLW9sZF9DRkxBR1M9IiRDRkxBR1MiCi1vbGRfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKLW9sZF9MRD0iJExEIgotb2xkX0xOX1M9IiRMTl9TIgotb2xkX05NPSIkTk0iCi1vbGRfUkFOTElCPSIkUkFOTElCIgotb2xkX0RMTFRPT0w9IiRETExUT09MIgotb2xkX0FTPSIkQVMiCi0KLSMgUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgotYXJncz0KLXByZXY9Ci1mb3Igb3B0aW9uCi1kbwotICBjYXNlICIkb3B0aW9uIiBpbgotICAtKj0qKSBvcHRhcmc9YGVjaG8gIiRvcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRwcmV2IjsgdGhlbgotICAgIGV2YWwgIiRwcmV2PVwkb3B0aW9uIgotICAgIHByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkb3B0aW9uIiBpbgotICAtLWhlbHApIGNhdCA8PEVPTQotVXNhZ2U6ICRwcm9nbmFtZSBbT1BUSU9OXS4uLiBbSE9TVCBbTFRNQUlOXV0KLQotR2VuZXJhdGUgYSBzeXN0ZW0tc3BlY2lmaWMgbGlidG9vbCBzY3JpcHQuCi0KLSAgICAtLWRlYnVnICAgICAgICAgICAgICAgIGVuYWJsZSB2ZXJib3NlIHNoZWxsIHRyYWNpbmcKLSAgICAtLWRpc2FibGUtc2hhcmVkICAgICAgIGRvIG5vdCBidWlsZCBzaGFyZWQgbGlicmFyaWVzCi0gICAgLS1kaXNhYmxlLXN0YXRpYyAgICAgICBkbyBub3QgYnVpbGQgc3RhdGljIGxpYnJhcmllcwotICAgIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgZG8gbm90IG9wdGltaXplIGZvciBmYXN0IGluc3RhbGxhdGlvbgotICAgIC0tZW5hYmxlLWRsb3BlbiAgICAgICAgZW5hYmxlIGRsb3BlbiBzdXBwb3J0Ci0gICAgLS1lbmFibGUtZGxvcGVuLXNlbGYgICBlbmFibGUgc3VwcG9ydCBmb3IgZGxvcGVuaW5nIHByb2dyYW1zCi0gICAgLS1oZWxwICAgICAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdAotICAgIC0tbm8tdmVyaWZ5ICAgICAgICAgICAgZG8gbm90IHZlcmlmeSB0aGF0IEhPU1QgaXMgYSB2YWxpZCBob3N0IHR5cGUKLS1vLCAtLW91dHB1dD1GSUxFICAgICAgICAgIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIFtkZWZhdWx0PSRkZWZhdWx0X29maWxlXQotICAgIC0tcXVpZXQgICAgICAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JwotICAgIC0tc2lsZW50ICAgICAgICAgICAgICAgZG8gbm90IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSAgICAtLXNyY2Rpcj1ESVIgICAgICAgICAgIGZpbmQgXGBjb25maWcuZ3Vlc3MnIGluIERJUgotICAgIC0tdmVyc2lvbiAgICAgICAgICAgICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgICAtLXdpdGgtZ2NjICAgICAgICAgICAgIGFzc3VtZSB0aGF0IHRoZSBHTlUgQyBjb21waWxlciB3aWxsIGJlIHVzZWQKLSAgICAtLXdpdGgtZ251LWxkICAgICAgICAgIGFzc3VtZSB0aGF0IHRoZSBDIGNvbXBpbGVyIHVzZXMgdGhlIEdOVSBsaW5rZXIKLSAgICAtLWRpc2FibGUtbG9jayAgICAgICAgIGRpc2FibGUgZmlsZSBsb2NraW5nCi0gICAgLS1jYWNoZS1maWxlPUZJTEUgICAgICBjb25maWd1cmUgY2FjaGUgZmlsZQotCi1MVE1BSU4gaXMgdGhlIFxgbHRtYWluLnNoJyBzaGVsbCBzY3JpcHQgZnJhZ21lbnQgb3IgXGBsdG1haW4uYycgcHJvZ3JhbQotdGhhdCBwcm92aWRlcyBiYXNpYyBsaWJ0b29sIGZ1bmN0aW9uYWxpdHkuCi0KLUhPU1QgaXMgdGhlIGNhbm9uaWNhbCBob3N0IHN5c3RlbSBuYW1lIFtkZWZhdWx0PWd1ZXNzZWRdLgotRU9NCi0gIGV4aXQgMAotICA7OwotCi0gIC0tZGVidWcpCi0gICAgZWNobyAiJHByb2duYW1lOiBlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgotICAgIHNldCAteAotICAgIDs7Ci0KLSAgLS1kaXNhYmxlLXNoYXJlZCkgZW5hYmxlX3NoYXJlZD1ubyA7OwotCi0gIC0tZGlzYWJsZS1zdGF0aWMpIGVuYWJsZV9zdGF0aWM9bm8gOzsKLQotICAtLWRpc2FibGUtZmFzdC1pbnN0YWxsKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0KLSAgLS1lbmFibGUtZGxvcGVuKSBlbmFibGVfZGxvcGVuPXllcyA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkgc2lsZW50PXllcyA7OwotCi0gIC0tc3JjZGlyKSBwcmV2PXNyY2RpciA7OwotICAtLXNyY2Rpcj0qKSBzcmNkaXI9IiRvcHRhcmciIDs7Ci0KLSAgLS1uby12ZXJpZnkpIHZlcmlmeV9ob3N0PW5vIDs7Ci0KLSAgLS1vdXRwdXQgfCAtbykgcHJldj1vZmlsZSA7OwotICAtLW91dHB1dD0qKSBvZmlsZT0iJG9wdGFyZyIgOzsKLQotICAtLXZlcnNpb24pIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCI7IGV4aXQgMCA7OwotCi0gIC0td2l0aC1nY2MpIHdpdGhfZ2NjPXllcyA7OwotICAtLXdpdGgtZ251LWxkKSB3aXRoX2dudV9sZD15ZXMgOzsKLQotICAtLWRpc2FibGUtbG9jaykgbmVlZF9sb2Nrcz1ubyA7OwotCi0gIC0tY2FjaGUtZmlsZT0qKSBjYWNoZV9maWxlPSIkb3B0YXJnIiA7OwotCi0gIC0qKQotICAgIGVjaG8gIiRwcm9nbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRvcHRpb24nIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAteiAiJGx0bWFpbiI7IHRoZW4KLSAgICAgIGx0bWFpbj0iJG9wdGlvbiIKLSAgICBlbGlmIHRlc3QgLXogIiRob3N0IjsgdGhlbgotIyBUaGlzIGdlbmVyYXRlcyBhbiB1bm5lY2Vzc2FyeSB3YXJuaW5nIGZvciBzcGFyYy1zdW4tc29sYXJpczQuMS4zX1UxCi0jICAgICAgaWYgdGVzdCAtbiAiYGVjaG8gJG9wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSMgICAgICAgIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZyBcYCRvcHRpb24nIGlzIG5vdCBhIHZhbGlkIGhvc3QgdHlwZSIgMT4mMgotIyAgICAgIGZpCi0gICAgICBob3N0PSIkb3B0aW9uIgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogdG9vIG1hbnkgYXJndW1lbnRzIiAxPiYyCi0gICAgICBlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkgOzsKLSAgZXNhYwotZG9uZQotCi1pZiB0ZXN0IC16ICIkbHRtYWluIjsgdGhlbgotICBlY2hvICIkcHJvZ25hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBMVE1BSU4gZmlsZSIgMT4mMgotICBlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLWZpCi0KLWlmIHRlc3QgISAtZiAiJGx0bWFpbiI7IHRoZW4KLSAgZWNobyAiJHByb2duYW1lOiBcYCRsdG1haW4nIGRvZXMgbm90IGV4aXN0IiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotIyBRdW90ZSBhbnkgYXJncyBjb250YWluaW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzLgotbHRjb25maWdfYXJncz0KLWZvciBhcmcKLWRvCi0gIGNhc2UgIiRhcmciIGluCi0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGx0Y29uZmlnX2FyZ3M9IiRsdGNvbmZpZ19hcmdzICckYXJnJyIgOzsKLSAgKikgbHRjb25maWdfYXJncz0iJGx0Y29uZmlnX2FyZ3MgJGFyZyIgOzsKLSAgZXNhYwotZG9uZQotCi0jIEEgcmVsZXZhbnQgc3Vic2V0IG9mIEFDX0lOSVQuCi0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi0jIDYgY2hlY2tpbmcgZm9yLi4uIG1lc3NhZ2VzIGFuZCByZXN1bHRzCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4+Li9jb25maWcubG9nCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCi0jIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAotIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgICA9IHNldDsgdGhlbiBMQU5HPUM7ICAgZXhwb3J0IExBTkc7ICAgZmkKLQotaWYgdGVzdCAtbiAiJGNhY2hlX2ZpbGUiICYmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIHdpdGhpbiBsdGNvbmZpZyIKLSAgLiAkY2FjaGVfZmlsZQotZmkKLQotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgIyBBc3N1bWUgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdGhlIHNhbWUgb25lIGFzIHRoZSBwYXRoIHRvIExUTUFJTi4KLSAgc3JjZGlyPWAkZWNobyAiWCRsdG1haW4iIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgdGVzdCAiJHNyY2RpciIgPSAiJGx0bWFpbiIgJiYgc3JjZGlyPS4KLWZpCi0KLXRyYXAgIiRybSBjb25mdGVzdCo7IGV4aXQgMSIgMSAyIDE1Ci1pZiB0ZXN0ICIkdmVyaWZ5X2hvc3QiID0geWVzOyB0aGVuCi0gICMgQ2hlY2sgZm9yIGNvbmZpZy5ndWVzcyBhbmQgY29uZmlnLnN1Yi4KLSAgYWNfYXV4X2Rpcj0KLSAgZm9yIGFjX2RpciBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLjsgZG8KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvY29uZmlnLmd1ZXNzOyB0aGVuCi0gICAgICBhY19hdXhfZGlyPSRhY19kaXIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBpZiB0ZXN0IC16ICIkYWNfYXV4X2RpciI7IHRoZW4KLSAgICBlY2hvICIkcHJvZ25hbWU6IGNhbm5vdCBmaW5kIGNvbmZpZy5ndWVzcyBpbiAkc3JjZGlyICRzcmNkaXIvLi4gJHNyY2Rpci8uLi8uLiIgMT4mMgotICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gIGZpCi0gIGFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLSAgYWNfY29uZmlnX3N1Yj0kYWNfYXV4X2Rpci9jb25maWcuc3ViCi0KLSAgIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgotICBpZiAkU0hFTEwgJGFjX2NvbmZpZ19zdWIgc3VuNCA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotICBlbHNlCi0gICAgZWNobyAiJHByb2duYW1lOiBjYW5ub3QgcnVuICRhY19jb25maWdfc3ViIiAxPiYyCi0gICAgZWNobyAiJGhlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgZmkKLQotICBlY2hvICRhY19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiIuLi4gJGFjX2MiIDE+JjYKLQotICBob3N0X2FsaWFzPSRob3N0Ci0gIGNhc2UgIiRob3N0X2FsaWFzIiBpbgotICAiIikKLSAgICBpZiBob3N0X2FsaWFzPWAkU0hFTEwgJGFjX2NvbmZpZ19ndWVzc2A7IHRoZW4gOgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRwcm9nbmFtZTogY2Fubm90IGd1ZXNzIGhvc3QgdHlwZTsgeW91IG11c3Qgc3BlY2lmeSBvbmUiIDE+JjIKLSAgICAgIGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaSA7OwotICBlc2FjCi0gIGhvc3Q9YCRTSEVMTCAkYWNfY29uZmlnX3N1YiAkaG9zdF9hbGlhc2AKLSAgZWNobyAiJGFjX3QkaG9zdCIgMT4mNgotCi0gICMgTWFrZSBzdXJlIHRoZSBob3N0IHZlcmlmaWVkLgotICB0ZXN0IC16ICIkaG9zdCIgJiYgZXhpdCAxCi0KLWVsaWYgdGVzdCAteiAiJGhvc3QiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIGhvc3QgdHlwZSBpZiB5b3UgdXNlIFxgLS1uby12ZXJpZnknIiAxPiYyCi0gIGVjaG8gIiRoZWxwIiAxPiYyCi0gIGV4aXQgMQotZWxzZQotICBob3N0X2FsaWFzPSRob3N0Ci1maQotCi0jIFRyYW5zZm9ybSBsaW51eCogdG8gKi0qLWxpbnV4LWdudSosIHRvIHN1cHBvcnQgb2xkIGNvbmZpZ3VyZSBzY3JpcHRzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1saW51eC1nbnUqKSA7OwotbGludXgqKSBob3N0PWBlY2hvICRob3N0IHwgc2VkICdzL15cKC4qLS4qLWxpbnV4XClcKC4qXCkkL1wxLWdudVwyLydgCi1lc2FjCi0KLWhvc3RfY3B1PWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLWhvc3RfdmVuZG9yPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWhvc3Rfb3M9YGVjaG8gJGhvc3QgfCBzZWQgJ3MvXlwoW14tXSpcKS1cKFteLV0qXCktXCguKlwpJC9cMy8nYAotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICAjIEFJWCBzb21ldGltZXMgaGFzIHByb2JsZW1zIHdpdGggdGhlIEdDQyBjb2xsZWN0MiBwcm9ncmFtLiAgRm9yIHNvbWUKLSAgIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0gICMgdmFuaXNoIGluIGEgcHVmZiBvZiBzbW9rZS4KLSAgaWYgdGVzdCAiJHtDT0xMRUNUX05BTUVTK3NldH0iICE9IHNldDsgdGhlbgotICAgIENPTExFQ1RfTkFNRVM9Ci0gICAgZXhwb3J0IENPTExFQ1RfTkFNRVMKLSAgZmkKLSAgOzsKLWVzYWMKLQotIyBEZXRlcm1pbmUgY29tbWFuZHMgdG8gY3JlYXRlIG9sZC1zdHlsZSBzdGF0aWMgYXJjaGl2ZXMuCi1vbGRfYXJjaGl2ZV9jbWRzPSckQVIgY3J1ICRvbGRsaWIkb2xkb2JqcycKLW9sZF9wb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA2NDQgJG9sZGxpYicKLW9sZF9wb3N0dW5pbnN0YWxsX2NtZHM9Ci0KLSMgU2V0IGEgc2FuZSBkZWZhdWx0IGZvciBgQVInLgotdGVzdCAteiAiJEFSIiAmJiBBUj1hcgotCi0jIElmIFJBTkxJQiBpcyBub3Qgc2V0LCB0aGVuIHJ1biB0aGUgdGVzdC4KLWlmIHRlc3QgIiR7UkFOTElCK3NldH0iICE9ICJzZXQiOyB0aGVuCi0gIHJlc3VsdD1ubwotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciByYW5saWIuLi4gJGFjX2MiIDE+JjYKLSAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGRpciIgJiYgZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRkaXIvcmFubGliOyB0aGVuCi0gICAgICBSQU5MSUI9InJhbmxpYiIKLSAgICAgIHJlc3VsdD0icmFubGliIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJHNhdmVfaWZzIgotCi0gIGVjaG8gIiRhY190JHJlc3VsdCIgMT4mNgotZmkKLQotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgb2xkX2FyY2hpdmVfY21kcz0iJG9sZF9hcmNoaXZlX2NtZHN+XCRSQU5MSUIgXCRvbGRsaWIiCi0gIG9sZF9wb3N0aW5zdGFsbF9jbWRzPSJcJFJBTkxJQiBcJG9sZGxpYn4kb2xkX3Bvc3RpbnN0YWxsX2NtZHMiCi1maQotCi0jIFNldCBzYW5lIGRlZmF1bHRzIGZvciBgRExMVE9PTCcgYW5kIGBBUycsIHVzZWQgb24gY3lnd2luLgotdGVzdCAteiAiJERMTFRPT0wiICYmIERMTFRPT0w9ZGxsdG9vbAotdGVzdCAteiAiJEFTIiAmJiBBUz1hcwotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgdXNpbmcgR0NDLgotaWYgdGVzdCAiJHdpdGhfZ2NjIiAhPSB5ZXMgfHwgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIElmIENDIGlzIG5vdCBzZXQsIHRoZW4gdHJ5IHRvIGZpbmQgR0NDIG9yIGEgdXNhYmxlIENDLgotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGdjYy4uLiAkYWNfYyIgMT4mNgotICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfSR7UEFUSF9TRVBBUkFUT1J9IgotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLSAgICAgIHRlc3QgLXogIiRkaXIiICYmIGRpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRkaXIvZ2NjOyB0aGVuCi0JQ0M9ImdjYyIKLQlicmVhawotICAgICAgZmkKLSAgICBkb25lCi0gICAgSUZTPSIkc2F2ZV9pZnMiCi0KLSAgICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkYWNfdCRDQyIgMT4mNgotICAgIGVsc2UKLSAgICAgIGVjaG8gIiRhY190Im5vIDE+JjYKLSAgICBmaQotICBmaQotCi0gICMgTm90ICJnY2MiLCBzbyB0cnkgImNjIiwgcmVqZWN0aW5nICIvdXNyL3VjYi9jYyIuCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY2MuLi4gJGFjX2MiIDE+JjYKLSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBjY19yZWplY3RlZD1ubwotICAgIGZvciBkaXIgaW4gJFBBVEg7IGRvCi0gICAgICB0ZXN0IC16ICIkZGlyIiAmJiBkaXI9LgotICAgICAgaWYgdGVzdCAtZiAkZGlyL2NjOyB0aGVuCi0JaWYgdGVzdCAiJGRpci9jYyIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0JICBjY19yZWplY3RlZD15ZXMKLQkgIGNvbnRpbnVlCi0JZmkKLQlDQz0iY2MiCi0JYnJlYWsKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGlmIHRlc3QgJGNjX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICAgICAjIFdlIGZvdW5kIGEgYm9nb24gaW4gdGhlIHBhdGgsIHNvIG1ha2Ugc3VyZSB3ZSBuZXZlciB1c2UgaXQuCi0gICAgICBzZXQgZHVtbXkgJENDCi0gICAgICBzaGlmdAotICAgICAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotCSMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotCSMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIG5hbWUsIHNvIHRoZSBib2dvbiB3aWxsIGJlIGNob3NlbgotCSMgZmlyc3QgaWYgd2Ugc2V0IENDIHRvIGp1c3QgdGhlIG5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0Jc2hpZnQKLQlzZXQgZHVtbXkgIiRkaXIvY2MiICIkQCIKLQlzaGlmdAotCUNDPSIkQCIKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgICAgIGVjaG8gIiRhY190JENDIiAxPiY2Ci0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGNjIGZvdW5kIGluIFwkUEFUSCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZmkKLQotICAjIE5vdyBzZWUgaWYgdGhlIGNvbXBpbGVyIGlzIHJlYWxseSBHQ0MuCi0gIHdpdGhfZ2NjPW5vCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDLi4uICRhY19jIiAxPiY2Ci0gIGVjaG8gIiRwcm9nbmFtZTo1NjQ6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLQotICAkcm0gY29uZnRlc3QuYwotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLSAgaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gJHByb2duYW1lOjU3MjogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAgd2l0aF9nY2M9eWVzCi0gIGZpCi0gICRybSBjb25mdGVzdC5jCi0gIGVjaG8gIiRhY190JHdpdGhfZ2NjIiAxPiY2Ci1maQotCi0jIEFsbG93IENDIHRvIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJndW1lbnRzLgotc2V0IGR1bW15ICRDQwotY29tcGlsZXI9IiQyIgotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeC4uLiAkYWNfYyIgMT4mNgotJHJtIGNvbmZ0ZXN0KgotZWNobyAnaW50IGkgPSAxOycgPiBjb25mdGVzdC5jCi1lY2hvICIkcHJvZ25hbWU6NTg2OiBjaGVja2luZyBmb3Igb2JqZWN0IHN1ZmZpeCIgPiYgNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo1ODc6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9OyB0aGVuCi0gICMgQXBwZW5kIGFueSB3YXJuaW5ncyB0byB0aGUgY29uZmlnLmxvZy4KLSAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0KLSAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuKjsgZG8KLSAgICBjYXNlICRhY19maWxlIGluCi0gICAgKi5jKSA7OwotICAgICopIG9iamV4dD1gZWNobyAkYWNfZmlsZSB8IHNlZCAtZSBzL2NvbmZ0ZXN0Li8vYCA7OwotICAgIGVzYWMKLSAgZG9uZQotZWxzZQotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci1maQotJHJtIGNvbmZ0ZXN0KgotZWNobyAiJGFjX3Qkb2JqZXh0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkY29tcGlsZXIgb3B0aW9uIHRvIHByb2R1Y2UgUElDLi4uICRhY19jIiAxPiY2Ci1waWNfZmxhZz0KLXNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncz0KLXdsPQotbGlua19zdGF0aWNfZmxhZz0KLW5vX2J1aWx0aW5fZmxhZz0KLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICB3bD0nLVdsLCcKLSAgbGlua19zdGF0aWNfZmxhZz0nLXN0YXRpYycKLQotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYmVvcyogfCBpcml4NSogfCBpcml4NiogfCBvc2YzKiB8IG9zZjQqKQotICAgICMgUElDIGlzIHRoZSBkZWZhdWx0IGZvciB0aGVzZSBPU2VzLgotICAgIDs7Ci0gIGFpeCopCi0gICAgIyBCZWxvdyB0aGVyZSBpcyBhIGRpcnR5IGhhY2sgdG8gZm9yY2Ugbm9ybWFsIHN0YXRpYyBsaW5raW5nIHdpdGggLWxkbAotICAgICMgVGhlIHByb2JsZW0gaXMgYmVjYXVzZSBsaWJkbCBkeW5hbWljYWxseSBsaW5rZWQgd2l0aCBib3RoIGxpYmMgYW5kCi0gICAgIyBsaWJDIChBSVggQysrIGxpYnJhcnkpLCB3aGljaCBvYnZpb3VzbHkgZG9lc24ndCBpbmNsdWRlZCBpbiBsaWJyYXJpZXMKLSAgICAjIGxpc3QgYnkgZ2NjLiBUaGlzIGNhdXNlIHVuZGVmaW5lZCBzeW1ib2xzIHdpdGggLXN0YXRpYyBmbGFncy4KLSAgICAjIFRoaXMgaGFjayBhbGxvd3MgQyBwcm9ncmFtcyB0byBiZSBsaW5rZWQgd2l0aCAiLXN0YXRpYyAtbGRsIiwgYnV0Ci0gICAgIyB3ZSBub3Qgc3VyZSBhYm91dCBDKysgcHJvZ3JhbXMuCi0gICAgbGlua19zdGF0aWNfZmxhZz0iJGxpbmtfc3RhdGljX2ZsYWcgJHt3bH0tbEMiCi0gICAgOzsKLSAgY3lnd2luKiB8IG1pbmd3KiB8IG9zMiopCi0gICAgIyBXZSBjYW4gYnVpbGQgRExMcyBmcm9tIG5vbi1QSUMuCi0gICAgOzsKLSAgYW1pZ2FvcyopCi0gICAgIyBGSVhNRTogd2UgbmVlZCBhdCBsZWFzdCA2ODAyMCBjb2RlIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMsIGJ1dAotICAgICMgYWRkaW5nIHRoZSBgLW02ODAyMCcgZmxhZyB0byBHQ0MgcHJldmVudHMgYnVpbGRpbmcgYW55dGhpbmcgYmV0dGVyLAotICAgICMgbGlrZSBgLW02ODA0MCcuCi0gICAgcGljX2ZsYWc9Jy1tNjgwMjAgLXJlc2lkZW50MzIgLW1hbHdheXMtcmVzdG9yZS1hNCcKLSAgICA7OwotICAqKQotICAgIHBpY19mbGFnPSctZlBJQycKLSAgICA7OwotICBlc2FjCi1lbHNlCi0gICMgUE9SVE1FIENoZWNrIGZvciBQSUMgZmxhZ3MgZm9yIHRoZSBzeXN0ZW0gY29tcGlsZXIuCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKiB8IGFpeDQqKQotICAgICMgQWxsIEFJWCBjb2RlIGlzIFBJQy4KLSAgICBsaW5rX3N0YXRpY19mbGFnPSctYm5zbyAtYkk6L2xpYi9zeXNjYWxscy5leHAnCi0gICAgOzsKLQotICBocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgICAjIElzIHRoZXJlIGEgYmV0dGVyIGxpbmtfc3RhdGljX2ZsYWcgdGhhdCB3b3JrcyB3aXRoIHRoZSBidW5kbGVkIENDPwotICAgIHdsPSctV2wsJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9IiR7d2x9LWEgJHt3bH1hcmNoaXZlIgotICAgIHBpY19mbGFnPScrWicKLSAgICA7OwotCi0gIGlyaXg1KiB8IGlyaXg2KikKLSAgICB3bD0nLVdsLCcKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctbm9uX3NoYXJlZCcKLSAgICAjIFBJQyAod2l0aCAtS1BJQykgaXMgdGhlIGRlZmF1bHQuCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqIHwgb3MyKikKLSAgICAjIFdlIGNhbiBidWlsZCBETExzIGZyb20gbm9uLVBJQy4KLSAgICA7OwotCi0gIG9zZjMqIHwgb3NmNCopCi0gICAgIyBBbGwgT1NGLzEgY29kZSBpcyBQSUMuCi0gICAgd2w9Jy1XbCwnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLW5vbl9zaGFyZWQnCi0gICAgOzsKLQotICBzY28zLjJ2NSopCi0gICAgcGljX2ZsYWc9Jy1LcGljJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1kbicKLSAgICBzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3M9Jy1iZWxmJwotICAgIDs7Ci0KLSAgc29sYXJpcyopCi0gICAgcGljX2ZsYWc9Jy1LUElDJwotICAgIGxpbmtfc3RhdGljX2ZsYWc9Jy1Cc3RhdGljJwotICAgIHdsPSctV2wsJwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBwaWNfZmxhZz0nLVBJQycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICB3bD0nLVFvcHRpb24gbGQgJwotICAgIDs7Ci0KLSAgc3lzdjQuMnV3MiogfCBzeXN2NC4zKiB8IHN5c3Y1KikKLSAgICBwaWNfZmxhZz0nLUtQSUMnCi0gICAgbGlua19zdGF0aWNfZmxhZz0nLUJzdGF0aWMnCi0gICAgd2w9Jy1XbCwnCi0gICAgOzsKLQotICB1dHM0KikKLSAgICBwaWNfZmxhZz0nLXBpYycKLSAgICBsaW5rX3N0YXRpY19mbGFnPSctQnN0YXRpYycKLSAgICA7OwotCi0gICopCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0gIGVzYWMKLWZpCi0KLWlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KLSAgZWNobyAiJGFjX3QkcGljX2ZsYWciIDE+JjYKLQotICAjIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgcGljX2ZsYWcgYWN0dWFsbHkgd29ya3MuCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAkcGljX2ZsYWcgLURQSUMiCi0gIGVjaG8gIiRwcm9nbmFtZTo3MTc6IGNoZWNraW5nIGlmICRjb21waWxlciBQSUMgZmxhZyAkcGljX2ZsYWcgd29ya3MiID4mNQotICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjcxODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kb2JqZXh0OyB0aGVuCi0gICAgIyBBcHBlbmQgYW55IHdhcm5pbmdzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIAotICAgIGNhc2UgIiRob3N0X29zIiBpbgotICAgIGhwdXg5KiB8IGhwdXgxMCogfCBocHV4MTEqKQotICAgICAgIyBPbiBIUC1VWCwgYm90aCBDQyBhbmQgR0NDIG9ubHkgd2FybiB0aGF0IFBJQyBpcyBzdXBwb3J0ZWQuLi4gdGhlbiB0aGV5Ci0gICAgICAjIGNyZWF0ZSBub24tUElDIG9iamVjdHMuICBTbywgaWYgdGhlcmUgd2VyZSBhbnkgd2FybmluZ3MsIHdlIGFzc3VtZSB0aGF0Ci0gICAgICAjIFBJQyBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAgaWYgdGVzdCAtcyBjb25mdGVzdC5lcnI7IHRoZW4KLQllY2hvICIkYWNfdCJubyAxPiY2Ci0JY2FuX2J1aWxkX3NoYXJlZD1ubwotCXBpY19mbGFnPQotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JcGljX2ZsYWc9IiAkcGljX2ZsYWciCi0gICAgICBmaQotICAgICAgOzsKLSAgICAqKQotICAgICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgICAgIHBpY19mbGFnPSIgJHBpY19mbGFnIgotICAgICAgOzsKLSAgICBlc2FjCi0gIGVsc2UKLSAgICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICAgIGNhdCBjb25mdGVzdC5lcnIgMT4mNQotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICBwaWNfZmxhZz0KLSAgICBlY2hvICIkYWNfdCJubyAxPiY2Ci0gIGZpCi0gIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgotICAkcm0gY29uZnRlc3QqCi1lbHNlCi0gIGVjaG8gIiRhY190Im5vbmUgMT4mNgotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgb3B0aW9ucyAtbyBhbmQgLWMgYXJlIHNpbXVsdGFuZW91c2x5IHN1cHBvcnRlZCBieSBjb21waWxlcgotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN1cHBvcnRzIC1jIC1vIGZpbGUuby4uLiAkYWNfYyIgMT4mNgotJHJtIGNvbmZ0ZXN0KgotZWNobyAiaW50IHNvbWVfdmFyaWFibGUgPSAwOyIgPiBjb25mdGVzdC5jCi1zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0iJENGTEFHUyAtYyAtbyBjb25mdGVzdDIubyIKLWVjaG8gIiRwcm9nbmFtZTo3NjA6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtYyAtbyBmaWxlLm8iID4mNQotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo3NjE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QyLm87IHRoZW4KLQotICAjIFRoZSBjb21waWxlciBjYW4gb25seSB3YXJuIGFuZCBpZ25vcmUgdGhlIG9wdGlvbiBpZiBub3QgcmVjb2duaXplZAotICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgotICAgICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICAgICAgY29tcGlsZXJfY19vPW5vCi0gICAgZWxzZQotICAgICAgZWNobyAiJGFjX3QieWVzIDE+JjYKLSAgICAgIGNvbXBpbGVyX2Nfbz15ZXMKLSAgICBmaQotZWxzZQotICAjIEFwcGVuZCBhbnkgZXJyb3JzIHRvIHRoZSBjb25maWcubG9nLgotICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgY29tcGlsZXJfY19vPW5vCi0gIGVjaG8gIiRhY190Im5vIDE+JjYKLWZpCi1DRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSRybSBjb25mdGVzdCoKLQotaWYgdGVzdCB4IiRjb21waWxlcl9jX28iID0geCJ5ZXMiOyB0aGVuCi0gICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGNhbiB3cml0ZSB0byBhIC5sbwotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sby4uLiAkYWNfYyIgMT4mNgotICAkcm0gY29uZnRlc3QqCi0gIGVjaG8gImludCBzb21lX3ZhcmlhYmxlID0gMDsiID4gY29uZnRlc3QuYwotICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLSAgQ0ZMQUdTPSIkQ0ZMQUdTIC1jIC1vIGNvbmZ0ZXN0LmxvIgotICBlY2hvICIkcHJvZ25hbWU6Nzg4OiBjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWMgLW8gZmlsZS5sbyIgPiY1Ci1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjc4OTogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj5jb25mdGVzdC5lcnI7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC5sbzsgdGhlbgotCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNvbXBpbGVyX29fbG89bm8KLSAgICAgIGVsc2UKLQllY2hvICIkYWNfdCJ5ZXMgMT4mNgotCWNvbXBpbGVyX29fbG89eWVzCi0gICAgICBmaQotICBlbHNlCi0gICAgIyBBcHBlbmQgYW55IGVycm9ycyB0byB0aGUgY29uZmlnLmxvZy4KLSAgICBjYXQgY29uZnRlc3QuZXJyIDE+JjUKLSAgICBjb21waWxlcl9vX2xvPW5vCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotZWxzZQotICBjb21waWxlcl9vX2xvPW5vCi1maQotCi0jIENoZWNrIHRvIHNlZSBpZiB3ZSBjYW4gZG8gaGFyZCBsaW5rcyB0byBsb2NrIHNvbWUgZmlsZXMgaWYgbmVlZGVkCi1oYXJkX2xpbmtzPSJub3R0ZXN0ZWQiCi1pZiB0ZXN0ICIkY29tcGlsZXJfY19vIiA9IG5vICYmIHRlc3QgIiRuZWVkX2xvY2tzIiAhPSBubzsgdGhlbgotICAjIGRvIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlIG9mIG5lZWRfbG9ja3MgcHJvdmlkZWQgYnkgdGhlIHVzZXIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgd2UgY2FuIGxvY2sgd2l0aCBoYXJkIGxpbmtzLi4uICRhY19jIiAxPiY2Ci0gIGhhcmRfbGlua3M9eWVzCi0gICRybSBjb25mdGVzdCoKLSAgbG4gY29uZnRlc3QuYSBjb25mdGVzdC5iIDI+L2Rldi9udWxsICYmIGhhcmRfbGlua3M9bm8KLSAgdG91Y2ggY29uZnRlc3QuYQotICBsbiBjb25mdGVzdC5hIGNvbmZ0ZXN0LmIgMj4mNSB8fCBoYXJkX2xpbmtzPW5vCi0gIGxuIGNvbmZ0ZXN0LmEgY29uZnRlc3QuYiAyPi9kZXYvbnVsbCAmJiBoYXJkX2xpbmtzPW5vCi0gIGVjaG8gIiRhY190JGhhcmRfbGlua3MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBpZiB0ZXN0ICIkaGFyZF9saW5rcyIgPSBubzsgdGhlbgotICAgIGVjaG8gIioqKiBXQVJOSU5HOiBcYCRDQycgZG9lcyBub3Qgc3VwcG9ydCBcYC1jIC1vJywgc28gXGBtYWtlIC1qJyBtYXkgYmUgdW5zYWZlIiA+JjIKLSAgICBuZWVkX2xvY2tzPXdhcm4KLSAgZmkKLWVsc2UKLSAgbmVlZF9sb2Nrcz1ubwotZmkKLQotaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAjIENoZWNrIHRvIHNlZSBpZiBvcHRpb25zIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBjb21waWxlcgotICBlY2hvICRhY19uICJjaGVja2luZyBpZiAkY29tcGlsZXIgc3VwcG9ydHMgLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucyAuLi4gJGFjX2MiIDE+JjYKLSAgJHJtIGNvbmZ0ZXN0KgotICBlY2hvICJpbnQgc29tZV92YXJpYWJsZSA9IDA7IiA+IGNvbmZ0ZXN0LmMKLSAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIC1jIGNvbmZ0ZXN0LmMiCi0gIGVjaG8gIiRwcm9nbmFtZTo4NDA6IGNoZWNraW5nIGlmICRjb21waWxlciBzdXBwb3J0cyAtZm5vLXJ0dGkgLWZuby1leGNlcHRpb25zIiA+JjUKLSAgaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZTo4NDE6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+Y29uZnRlc3QuZXJyOyB9ICYmIHRlc3QgLXMgY29uZnRlc3QubzsgdGhlbgotCi0gICAgIyBUaGUgY29tcGlsZXIgY2FuIG9ubHkgd2FybiBhbmQgaWdub3JlIHRoZSBvcHRpb24gaWYgbm90IHJlY29nbml6ZWQKLSAgICAjIFNvIHNheSBubyBpZiB0aGVyZSBhcmUgd2FybmluZ3MKLSAgICAgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCi0JZWNobyAiJGFjX3Qibm8gMT4mNgotCWNvbXBpbGVyX3J0dGlfZXhjZXB0aW9ucz1ubwotICAgICAgZWxzZQotCWVjaG8gIiRhY190InllcyAxPiY2Ci0JY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPXllcwotICAgICAgZmkKLSAgZWxzZQotICAgICMgQXBwZW5kIGFueSBlcnJvcnMgdG8gdGhlIGNvbmZpZy5sb2cuCi0gICAgY2F0IGNvbmZ0ZXN0LmVyciAxPiY1Ci0gICAgY29tcGlsZXJfcnR0aV9leGNlcHRpb25zPW5vCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKLSAgJHJtIGNvbmZ0ZXN0KgotCi0gIGlmIHRlc3QgIiRjb21waWxlcl9ydHRpX2V4Y2VwdGlvbnMiID0gInllcyI7IHRoZW4KLSAgICBub19idWlsdGluX2ZsYWc9JyAtZm5vLWJ1aWx0aW4gLWZuby1ydHRpIC1mbm8tZXhjZXB0aW9ucycKLSAgZWxzZQotICAgIG5vX2J1aWx0aW5fZmxhZz0nIC1mbm8tYnVpbHRpbicKLSAgZmkKLSAgCi1maQotCi0jIENoZWNrIGZvciBhbnkgc3BlY2lhbCBzaGFyZWQgbGlicmFyeSBjb21waWxhdGlvbiBmbGFncy4KLWlmIHRlc3QgLW4gIiRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3MiOyB0aGVuCi0gIGVjaG8gIiRwcm9nbmFtZTogd2FybmluZzogXGAkQ0MnIHJlcXVpcmVzIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcyIgMT4mMgotICBpZiBlY2hvICIkb2xkX0NDICRvbGRfQ0ZMQUdTICIgfCBlZ3JlcCAtZSAiWyAJXSRzcGVjaWFsX3NobGliX2NvbXBpbGVfZmxhZ3NbIAldIiA+L2Rldi9udWxsOyB0aGVuIDoKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogYWRkIFxgJHNwZWNpYWxfc2hsaWJfY29tcGlsZV9mbGFncycgdG8gdGhlIENDIG9yIENGTEFHUyBlbnYgdmFyaWFibGUgYW5kIHJlY29uZmlndXJlIiAxPiYyCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICBmaQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0kcm0gY29uZnRlc3QqCi1lY2hvICdtYWluKCl7cmV0dXJuKDApO30nID4gY29uZnRlc3QuYwotc2F2ZV9MREZMQUdTPSIkTERGTEFHUyIKLUxERkxBR1M9IiRMREZMQUdTICRsaW5rX3N0YXRpY19mbGFnIgotZWNobyAiJHByb2duYW1lOjg4NDogY2hlY2tpbmcgaWYgJGNvbXBpbGVyIHN0YXRpYyBmbGFnICRsaW5rX3N0YXRpY19mbGFnIHdvcmtzIiA+JjUKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6ODg1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLSAgZWNobyAiJGFjX3QkbGlua19zdGF0aWNfZmxhZyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCJub25lIDE+JjYKLSAgbGlua19zdGF0aWNfZmxhZz0KLWZpCi1MREZMQUdTPSIkc2F2ZV9MREZMQUdTIgotJHJtIGNvbmZ0ZXN0KgotCi1pZiB0ZXN0IC16ICIkTE5fUyI7IHRoZW4KLSAgIyBDaGVjayB0byBzZWUgaWYgd2UgY2FuIHVzZSBsbiAtcywgb3Igd2UgbmVlZCBoYXJkIGxpbmtzLgotICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGxuIC1zIHdvcmtzLi4uICRhY19jIiAxPiY2Ci0gICRybSBjb25mdGVzdGRhdGEKLSAgaWYgbG4gLXMgWCBjb25mdGVzdGRhdGEgMj4vZGV2L251bGw7IHRoZW4KLSAgICAkcm0gY29uZnRlc3RkYXRhCi0gICAgTE5fUz0ibG4gLXMiCi0gIGVsc2UKLSAgICBMTl9TPWxuCi0gIGZpCi0gIGlmIHRlc3QgIiRMTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgICBlY2hvICIkYWNfdCJ5ZXMgMT4mNgotICBlbHNlCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotZmkKLQotIyBNYWtlIHN1cmUgTEQgaXMgYW4gYWJzb2x1dGUgcGF0aC4KLWlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgYWNfcHJvZz1sZAotICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjkxNzogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgICBhY19wcm9nPWAoJENDIC1wcmludC1wcm9nLW5hbWU9bGQpIDI+JjVgCi0gICAgY2FzZSAiJGFjX3Byb2ciIGluCi0gICAgIyBBY2NlcHQgYWJzb2x1dGUgcGF0aHMuCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgICAiIikKLSAgICAgICMgSWYgaXQgZmFpbHMsIHRoZW4gcHJldGVuZCB3ZSBhcmUgbm90IHVzaW5nIEdDQy4KLSAgICAgIGFjX3Byb2c9bGQKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgSWYgaXQgaXMgcmVsYXRpdmUsIHRoZW4gc2VhcmNoIGZvciB0aGUgZmlyc3QgbGQgaW4gUEFUSC4KLSAgICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICAgIDs7Ci0gICAgZXNhYwotICBlbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjk0MTogY2hlY2tpbmcgZm9yIEdOVSBsZCIgPiY1Ci0gIGVsc2UKLSAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igbm9uLUdOVSBsZCIiLi4uICRhY19jIiAxPiY2Ci0gICAgZWNobyAiJHByb2duYW1lOjk0NDogY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiID4mNQotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU30ke1BBVEhfU0VQQVJBVE9SfSIKLSAgICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0JTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0JIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotCSMgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLQkjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLQlpZiAiJExEIiAtdiAyPiYxIDwgL2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotCSAgdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotCWVsc2UKLQkgIHRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0JZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGFjX3NhdmVfaWZzIgotICBmaQotCi0gIGlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgICBlY2hvICIkYWNfdCRMRCIgMT4mNgotICBlbHNlCi0gICAgZWNobyAiJGFjX3Qibm8gMT4mNgotICBmaQotCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgICBlY2hvICIkcHJvZ25hbWU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmkKLQotIyBDaGVjayB0byBzZWUgaWYgaXQgcmVhbGx5IGlzIG9yIGlzIG5vdCBHTlUgbGQuCi1lY2hvICRhY19uICJjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZC4uLiAkYWNfYyIgMT4mNgotIyBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24gaGVyZSwgYnV0IGFwcGFyZW50bHkgc29tZSBHTlUgbGQncyBvbmx5IGFjY2VwdCAtdi4KLWlmICRMRCAtdiAyPiYxIDwvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknIDE+JjU7IHRoZW4KLSAgd2l0aF9nbnVfbGQ9eWVzCi1lbHNlCi0gIHdpdGhfZ251X2xkPW5vCi1maQotZWNobyAiJGFjX3Qkd2l0aF9nbnVfbGQiIDE+JjYKLQotIyBTZWUgaWYgdGhlIGxpbmtlciBzdXBwb3J0cyBidWlsZGluZyBzaGFyZWQgbGlicmFyaWVzLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgbGlua2VyICgkTEQpIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGFjX2MiIDE+JjYKLQotYWxsb3dfdW5kZWZpbmVkX2ZsYWc9Ci1ub191bmRlZmluZWRfZmxhZz0KLW5lZWRfbGliX3ByZWZpeD11bmtub3duCi1uZWVkX3ZlcnNpb249dW5rbm93bgotIyB3aGVuIHlvdSBzZXQgbmVlZF92ZXJzaW9uIHRvIG5vLCBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgLXNldF92ZXJzaW9uCi0jIGZsYWdzIHRvIGJlIGxlZnQgd2l0aG91dCBhcmd1bWVudHMKLWFyY2hpdmVfY21kcz0KLWFyY2hpdmVfZXhwc3ltX2NtZHM9Ci1vbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPQotZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPQotd2hvbGVfYXJjaGl2ZV9mbGFnX3NwZWM9Ci10aHJlYWRfc2FmZV9mbGFnX3NwZWM9Ci1oYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPQotaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvcj0KLWhhcmRjb2RlX2RpcmVjdD1ubwotaGFyZGNvZGVfbWludXNfTD1ubwotaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj11bnN1cHBvcnRlZAotcnVucGF0aF92YXI9Ci1hbHdheXNfZXhwb3J0X3N5bWJvbHM9bm8KLWV4cG9ydF9zeW1ib2xzX2NtZHM9JyROTSAkbGlib2JqcyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgfCBzZWQgJ1wnJ3MvLiogLy8nXCcnIHwgc29ydCB8IHVuaXEgPiAkZXhwb3J0X3N5bWJvbHMnCi0jIGluY2x1ZGVfZXhwc3ltcyBzaG91bGQgYmUgYSBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBzeW1ib2xzIHRvIGJlICphbHdheXMqCi0jIGluY2x1ZGVkIGluIHRoZSBzeW1ib2wgbGlzdAotaW5jbHVkZV9leHBzeW1zPQotIyBleGNsdWRlX2V4cHN5bXMgY2FuIGJlIGFuIGVncmVwIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiBzeW1ib2xzIHRvIGV4Y2x1ZGUKLSMgaXQgd2lsbCBiZSB3cmFwcGVkIGJ5IGAgKCcgYW5kIGApJCcsIHNvIG9uZSBtdXN0IG5vdCBtYXRjaCBiZWdpbm5pbmcgb3IKLSMgZW5kIG9mIGxpbmUuICBFeGFtcGxlOiBgYXxiY3wuKmQuKicgd2lsbCBleGNsdWRlIHRoZSBzeW1ib2xzIGBhJyBhbmQgYGJjJywKLSMgYXMgd2VsbCBhcyBhbnkgc3ltYm9sIHRoYXQgY29udGFpbnMgYGQnLgotZXhjbHVkZV9leHBzeW1zPQotCi1jYXNlICIkaG9zdF9vcyIgaW4KLWN5Z3dpbiogfCBtaW5ndyopCi0gICMgRklYTUU6IHRoZSBNU1ZDKysgcG9ydCBoYXNuJ3QgYmVlbiB0ZXN0ZWQgaW4gYSBsb29vb25nIHRpbWUKLSAgIyBXaGVuIG5vdCB1c2luZyBnY2MsIHdlIGN1cnJlbnRseSBhc3N1bWUgdGhhdCB3ZSBhcmUgdXNpbmcKLSAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgaWYgdGVzdCAiJHdpdGhfZ2NjIiAhPSB5ZXM7IHRoZW4KLSAgICB3aXRoX2dudV9sZD1ubwotICBmaQotICA7OwotCi1mcmVlYnNkMiogfCBzdW5vczQqKQotICBleGNsdWRlX2V4cHN5bXM9Il9HTE9CQUxfT0ZGU0VUX1RBQkxFXyIKLSAgOzsKLQotZXNhYwotCi1sZF9zaGxpYnM9eWVzCi1pZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICMgSWYgYXJjaGl2ZV9jbWRzIHJ1bnMgTEQsIG5vdCBDQywgd2xhcmMgc2hvdWxkIGJlIGVtcHR5Ci0gIHdsYXJjPScke3dsfScKLQotICAjIFNlZSBpZiBHTlUgbGQgc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcy4KLSAgY2FzZSAiJGhvc3Rfb3MiIGluCi0gIGFpeDMqIHwgYWl4NCopCi0gICAgIyBPbiBBSVgsIHRoZSBHTlUgbGlua2VyIGlzIHZlcnkgYnJva2VuCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2F0IDw8RU9GIDE+JjIKLQotKioqIFdhcm5pbmc6IHRoZSBHTlUgbGlua2VyLCBhdCBsZWFzdCB1cCB0byByZWxlYXNlIDIuOS4xLCBpcyByZXBvcnRlZAotKioqIHRvIGJlIHVuYWJsZSB0byByZWxpYWJseSBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBBSVguCi0qKiogVGhlcmVmb3JlLCBsaWJ0b29sIGlzIGRpc2FibGluZyBzaGFyZWQgbGlicmFyaWVzIHN1cHBvcnQuICBJZiB5b3UKLSoqKiByZWFsbHkgY2FyZSBmb3Igc2hhcmVkIGxpYnJhcmllcywgeW91IG1heSB3YW50IHRvIG1vZGlmeSB5b3VyIFBBVEgKLSoqKiBzbyB0aGF0IGEgbm9uLUdOVSBsaW5rZXIgaXMgZm91bmQsIGFuZCB0aGVuIHJlc3RhcnQuCi0KLUVPRgotICAgIDs7Ci0KLSAgYW1pZ2FvcyopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIE5BTUUgJGxpYm5hbWUiID4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIExJQlJBUllfSUQgMSIgPj4gJG9iamRpci9hMml4bGlicmFyeS5kYXRhfiRlY2hvICIjZGVmaW5lIFZFUlNJT04gJG1ham9yIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgUkVWSVNJT04gJHJldmlzaW9uIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JEFSIGNydSAkbGliICRsaWJvYmpzfiRSQU5MSUIgJGxpYn4oY2QgJG9iamRpciAmJiBhMml4bGlicmFyeSAtMzIpJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIDs7Ci0KLSAgc3Vub3M0KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtYXNzZXJ0IHB1cmUtdGV4dCAtQnN0YXRpYyAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICB3bGFyYz0KLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBiZW9zKikKLSAgICBpZiAkTEQgLS1oZWxwIDI+JjEgfCBlZ3JlcCAnOiBzdXBwb3J0ZWQgdGFyZ2V0czouKiBlbGYnID4gL2Rldi9udWxsOyB0aGVuCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtbm9zdGFydCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0KLSAgY3lnd2luKiB8IG1pbmd3KikKLSAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0KLSAgICAjIEV4dHJhY3QgdGhlIHN5bWJvbCBleHBvcnQgbGlzdCBmcm9tIGFuIGAtLWV4cG9ydC1hbGwnIGRlZiBmaWxlLAotICAgICMgdGhlbiByZWdlbmVyYXRlIHRoZSBkZWYgZmlsZSBmcm9tIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QsIHNvIHRoYXQKLSAgICAjIHRoZSBjb21waWxlZCBkbGwgb25seSBleHBvcnRzIHRoZSBzeW1ib2wgZXhwb3J0IGxpc3QuCi0gICAgZXhwb3J0X3N5bWJvbHNfY21kcz0ncm0gLWYgJG9iamRpci8kc29uYW1lLWx0ZGxsLmN+Ci0gICAgICBzZWQgLWUgIi9eIyBcL1wqIGx0ZGxsLmMgc3RhcnRzIGhlcmUgXCpcLy8sL14jIFwvXCogbHRkbGwuYyBlbmRzIGhlcmUgXCpcLy8geyBzL14jIC8vOyBwOyB9IiAtZSBkIDwgJDAgPiAkb2JqZGlyLyRzb25hbWUtbHRkbGwuY34KLSAgICAgIChjZCAkb2JqZGlyICYmICRDQyAtYyAkc29uYW1lLWx0ZGxsLmMpfgotICAgICAgJERMTFRPT0wgLS1leHBvcnQtYWxsIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tb3V0cHV0LWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmICAkb2JqZGlyLyRzb25hbWUtbHRkbGwuJG9iamV4dCAkbGlib2Jqc34KLSAgICAgIHNlZCAtZSAiMSwvRVhQT1JUUy9kIiAtZSAicy8gQCBbMC05XSogOyAqLy8iIDwgJG9iamRpci8kc29uYW1lLWRlZiA+ICRleHBvcnRfc3ltYm9scycKLQotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9J2VjaG8gRVhQT1JUUyA+ICRvYmpkaXIvJHNvbmFtZS1kZWZ+Ci0gICAgICBfbHRfaGludD0xOwotICAgICAgZm9yIHN5bWJvbCBpbiBgY2F0ICRleHBvcnRfc3ltYm9sc2A7IGRvCi0gICAgICAgIGVjaG8gIglcJHN5bWJvbCBAIFwkX2x0X2hpbnQgOyAiID4+ICRvYmpkaXIvJHNvbmFtZS1kZWY7Ci0JX2x0X2hpbnQ9YGV4cHIgMSArIFwkX2x0X2hpbnRgOwotICAgICAgZG9uZX4KLSAgICAgICRDQyAtV2wsLS1iYXNlLWZpbGUsJG9iamRpci8kc29uYW1lLWJhc2UgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG9iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvYmpkaXIvJHNvbmFtZS1leHB+Ci0gICAgICAkQ0MgLVdsLC0tYmFzZS1maWxlLCRvYmpkaXIvJHNvbmFtZS1iYXNlICRvYmpkaXIvJHNvbmFtZS1leHAgLVdsLC0tZGxsIC1ub3N0YXJ0ZmlsZXMgLVdsLC1lLF9fY3lnd2luX2RsbF9lbnRyeUAxMiAtbyAkbGliICRvYmpkaXIvJHNvbmFtZS1sdGRsbC4kb2JqZXh0ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c34KLSAgICAgICRETExUT09MIC0tYXM9JEFTIC0tZGxsbmFtZSAkc29uYW1lIC0tZXhjbHVkZS1zeW1ib2xzIERsbE1haW5AMTIsX2N5Z3dpbl9kbGxfZW50cnlAMTIsX2N5Z3dpbl9ub25jeWd3aW5fZGxsX2VudHJ5QDEyIC0tZGVmICRvYmpkaXIvJHNvbmFtZS1kZWYgLS1iYXNlLWZpbGUgJG9iamRpci8kc29uYW1lLWJhc2UgLS1vdXRwdXQtZXhwICRvYmpkaXIvJHNvbmFtZS1leHB+Ci0gICAgICAkQ0MgJG9iamRpci8kc29uYW1lLWV4cCAtV2wsLS1kbGwgLW5vc3RhcnRmaWxlcyAtV2wsLWUsX19jeWd3aW5fZGxsX2VudHJ5QDEyIC1vICRsaWIgJG9iamRpci8kc29uYW1lLWx0ZGxsLiRvYmpleHQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotCi0gICAgICBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzPSckRExMVE9PTCAtLWFzPSRBUyAtLWRsbG5hbWUgJHNvbmFtZSAtLWRlZiAkb2JqZGlyLyRzb25hbWUtZGVmIC0tb3V0cHV0LWxpYiAkb2JqZGlyLyRsaWJuYW1lLmEnCi0gICAgOzsKLQotICAqKQotICAgIGlmICRMRCAtLWhlbHAgMj4mMSB8IGVncmVwICc6IHN1cHBvcnRlZCB0YXJnZXRzOi4qIGVsZicgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAkd2wkc29uYW1lIC1vICRsaWInCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLXNoYXJlZCAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJHt3bH0tc29uYW1lICR3bCRzb25hbWUgJHt3bH0tcmV0YWluLXN5bWJvbHMtZmlsZSAkd2wkZXhwb3J0X3N5bWJvbHMgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBsZF9zaGxpYnM9bm8KLSAgICBmaQotICAgIDs7Ci0gIGVzYWMKLQotICBpZiB0ZXN0ICIkbGRfc2hsaWJzIiA9IHllczsgdGhlbgotICAgIHJ1bnBhdGhfdmFyPUxEX1JVTl9QQVRICi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tLXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBleHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JyR7d2x9LS1leHBvcnQtZHluYW1pYycKLSAgICB3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYz0iJHdsYXJjIictLXdob2xlLWFyY2hpdmUkY29udmVuaWVuY2UgJyIkd2xhcmMiJy0tbm8td2hvbGUtYXJjaGl2ZScKLSAgZmkKLWVsc2UKLSAgIyBQT1JUTUUgZmlsbCBpbiBhIGRlc2NyaXB0aW9uIG9mIHlvdXIgc3lzdGVtJ3MgbGlua2VyIChub3QgR05VIGxkKQotICBjYXNlICIkaG9zdF9vcyIgaW4KLSAgYWl4MyopCi0gICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9dW5zdXBwb3J0ZWQKLSAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgYXJjaGl2ZV9leHBzeW1fY21kcz0nJExEIC1vICRvYmpkaXIvJHNvbmFtZSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLWJFOiRleHBvcnRfc3ltYm9scyAtVDUxMiAtSDUxMiAtYk06U1JFfiRBUiBjcnUgJGxpYiAkb2JqZGlyLyRzb25hbWUnCi0gICAgIyBOb3RlOiB0aGlzIGxpbmtlciBoYXJkY29kZXMgdGhlIGRpcmVjdG9yaWVzIGluIExJQlBBVEggaWYgdGhlcmUKLSAgICAjIGFyZSBubyBkaXJlY3RvcmllcyBzcGVjaWZpZWQgYnkgLUwuCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzICYmIHRlc3QgLXogIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotICAgICAgIyBOZWl0aGVyIGRpcmVjdCBoYXJkY29kaW5nIG5vciBzdGF0aWMgbGlua2luZyBpcyBzdXBwb3J0ZWQgd2l0aCBhCi0gICAgICAjIGJyb2tlbiBjb2xsZWN0Mi4KLSAgICAgIGhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAgIGZpCi0gICAgOzsKLQotICBhaXg0KikKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz0KLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICBpZiBzdHJpbmdzIGAke0NDfSAtcHJpbnQtcHJvZy1uYW1lPWNvbGxlY3QyYCB8IFwKLQkgZ3JlcCByZXNvbHZlX2xpYl9uYW1lID4vZGV2L251bGwKLSAgICAgIHRoZW4KLQkjIFdlIGhhdmUgcmV3b3JrZWQgY29sbGVjdDIKLQloYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgICBlbHNlCi0JIyBXZSBoYXZlIG9sZCBjb2xsZWN0MgotCWhhcmRjb2RlX2RpcmVjdD11bnN1cHBvcnRlZAotICAgICAgZmkKLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJHt3bH0tYm5vZW50cnkgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBlbHNlCi0gICAgICBhbHdheXNfZXhwb3J0X3N5bWJvbHM9eWVzCi0gICAgICBhcmNoaXZlX2V4cHN5bV9jbWRzPSckQ0MgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1iRTokZXhwb3J0X3N5bWJvbHMgJHt3bH0tYk06U1JFICR7d2x9LWJub2VudHJ5JwotICAgICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGZpCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICAjIFRob3VnaCBMSUJQQVRIIHZhcmlhYmxlIGhhcmRjb2RlcyBzaGxpYnBhdGggaW50byBleGVjdXRhYmxlLAotICAgICMgaXQgZG9lc24ndCBhZmZlY3Qgc2VhcmNoaW5nIGZvciAtbCogbGlicmFyaWVzOyB0aGlzIGNvbmZ1c2VzCi0gICAgIyB0ZXN0cyBpbiBtZGVtby4KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPXVuc3VwcG9ydGVkCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgOzsKLQotICBhbWlnYW9zKikKLSAgICBhcmNoaXZlX2NtZHM9JyRybSAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTkFNRSAkbGlibmFtZSIgPiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgTElCUkFSWV9JRCAxIiA+PiAkb2JqZGlyL2EyaXhsaWJyYXJ5LmRhdGF+JGVjaG8gIiNkZWZpbmUgVkVSU0lPTiAkbWFqb3IiID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kZWNobyAiI2RlZmluZSBSRVZJU0lPTiAkcmV2aXNpb24iID4+ICRvYmpkaXIvYTJpeGxpYnJhcnkuZGF0YX4kQVIgY3J1ICRsaWIgJGxpYm9ianN+JFJBTkxJQiAkbGlifihjZCAkb2JqZGlyICYmIGEyaXhsaWJyYXJ5IC0zMiknCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nLUwkbGliZGlyJwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgOzsKLQotICBjeWd3aW4qIHwgbWluZ3cqKQotICAgICMgV2hlbiBub3QgdXNpbmcgZ2NjLCB3ZSBjdXJyZW50bHkgYXNzdW1lIHRoYXQgd2UgYXJlIHVzaW5nCi0gICAgIyBNaWNyb3NvZnQgVmlzdWFsIEMrKy4KLSAgICAjIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMgaXMgYWN0dWFsbHkgbWVhbmluZ2xlc3MsIGFzIHRoZXJlIGlzCi0gICAgIyBubyBzZWFyY2ggcGF0aCBmb3IgRExMcy4KLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPScgJwotICAgIGFsbG93X3VuZGVmaW5lZF9mbGFnPXVuc3VwcG9ydGVkCi0gICAgIyBUZWxsIGx0bWFpbiB0byBtYWtlIC5saWIgZmlsZXMsIG5vdCAuYSBmaWxlcy4KLSAgICBsaWJleHQ9bGliCi0gICAgIyBGSVhNRTogU2V0dGluZyBsaW5rbmFtZXMgaGVyZSBpcyBhIGJhZCBoYWNrLgotICAgIGFyY2hpdmVfY21kcz0nJENDIC1vICRsaWIgJGxpYm9ianMgJGxpbmtvcHRzIGBlY2hvICIkZGVwbGlicyIgfCBzZWQgLWUgJ1wnJ3MvIC1sYyQvLydcJydgIC1saW5rIC1kbGx+bGlua25hbWVzPScKLSAgICAjIFRoZSBsaW5rZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJ1aWxkIGEgLmxpYiBmaWxlIGlmIHdlIGJ1aWxkIGEgRExMLgotICAgIG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9J3RydWUnCi0gICAgIyBGSVhNRTogU2hvdWxkIGxldCB0aGUgdXNlciBzcGVjaWZ5IHRoZSBsaWIgcHJvZ3JhbS4KLSAgICBvbGRfYXJjaGl2ZV9jbWRzPSdsaWIgL09VVDokb2xkbGliJG9sZG9ianMnCi0gICAgZml4X3NyY2ZpbGVfcGF0aD0nYGN5Z3BhdGggLXcgJHNyY2ZpbGVgJwotICAgIDs7Ci0KLSAgZnJlZWJzZDEqKQotICAgIGxkX3NobGlicz1ubwotICAgIGNhbl9idWlsZF9zaGFyZWQ9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAyLjIuWzAxMl0gYWxsb3dzIHVzIHRvIGluY2x1ZGUgYysrcnQwLm8gdG8gZ2V0IEMrKyBjb25zdHJ1Y3RvcgotICAjIHN1cHBvcnQuICBGdXR1cmUgdmVyc2lvbnMgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBidXQgYW4gZXhwbGljaXQgYysrcnQwLm8KLSAgIyBkb2VzIG5vdCBicmVhayBhbnl0aGluZywgYW5kIGhlbHBzIHNpZ25pZmljYW50bHkgKGF0IHRoZSBjb3N0IG9mIGEgbGl0dGxlCi0gICMgZXh0cmEgc3BhY2UpLgotICBmcmVlYnNkMi4yKikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtQnNoYXJlYWJsZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAvdXNyL2xpYi9jKytydDAubycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8gIyB2ZXJpZmllZCBvbiAyLjIuNgotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgVW5mb3J0dW5hdGVseSwgb2xkZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCAyIGRvIG5vdCBoYXZlIHRoaXMgZmVhdHVyZS4KLSAgZnJlZWJzZDIqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICBoYXJkY29kZV9taW51c19MPXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICMgRnJlZUJTRCAzIGFuZCBncmVhdGVyIHVzZXMgZ2NjIC1zaGFyZWQgdG8gZG8gc2hhcmVkIGxpYnJhcmllcy4KLSAgZnJlZWJzZCopCi0gICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9bm8KLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBocHV4OSopCi0gICAgYXJjaGl2ZV9jbWRzPSckcm0gJG9iamRpci8kc29uYW1lfiRMRCAtYiArcyArYiAkaW5zdGFsbF9saWJkaXIgLW8gJG9iamRpci8kc29uYW1lICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0c350ZXN0ICRvYmpkaXIvJHNvbmFtZSA9ICRsaWIgfHwgbXYgJG9iamRpci8kc29uYW1lICRsaWInCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaHB1eDEwKiB8IGhwdXgxMSopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLWIgK2ggJHNvbmFtZSArcyArYiAkaW5zdGFsbF9saWJkaXIgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0rYiAke3dsfSRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjPScke3dsfS1FJwotICAgIDs7Ci0KLSAgaXJpeDUqIHwgaXJpeDYqKQotICAgIGlmIHRlc3QgIiR3aXRoX2djYyIgPSB5ZXM7IHRoZW4KLSAgICAgIGFyY2hpdmVfY21kcz0nJENDIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzICR7d2x9LXNvbmFtZSAke3dsfSRzb25hbWUgYHRlc3QgLW4gIiR2ZXJzdHJpbmciICYmIGVjaG8gJHt3bH0tc2V0X3ZlcnNpb24gJHt3bH0kdmVyc3RyaW5nYCAtbyAkbGliJwotICAgIGVsc2UKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzIC1zb25hbWUgJHNvbmFtZSBgdGVzdCAtbiAiJHZlcnN0cmluZyIgJiYgZWNobyAtc2V0X3ZlcnNpb24gJHZlcnN0cmluZ2AgLW8gJGxpYicKLSAgICBmaQotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JyR7d2x9LXJwYXRoICR7d2x9JGxpYmRpcicKLSAgICBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yPToKLSAgICA7OwotCi0gIG5ldGJzZCopCi0gICAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLUJzaGFyZWFibGUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnICAjIGEub3V0Ci0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLXNoYXJlZCAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycgICAgICAjIEVMRgotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tUiRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gIG9wZW5ic2QqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1Cc2hhcmVhYmxlIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgb3MyKikKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfbWludXNfTD15ZXMKLSAgICBhbGxvd191bmRlZmluZWRfZmxhZz11bnN1cHBvcnRlZAotICAgIGFyY2hpdmVfY21kcz0nJGVjaG8gIkxJQlJBUlkgJGxpYm5hbWUgSU5JVElOU1RBTkNFIiA+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvICJERVNDUklQVElPTiBcIiRsaWJuYW1lXCIiID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfiRlY2hvIERBVEEgPj4gJG9iamRpci8kbGlibmFtZS5kZWZ+JGVjaG8gIiBTSU5HTEUgTk9OU0hBUkVEIiA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kZWNobyBFWFBPUlRTID4+ICRvYmpkaXIvJGxpYm5hbWUuZGVmfmVteGV4cCAkbGlib2JqcyA+PiAkb2JqZGlyLyRsaWJuYW1lLmRlZn4kQ0MgLVpkbGwgLVpjcnRkbGwgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgJG9iamRpci8kbGlibmFtZS5kZWYnCi0gICAgb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcz0nZW14aW1wIC1vICRvYmpkaXIvJGxpYm5hbWUuYSAkb2JqZGlyLyRsaWJuYW1lLmRlZicKLSAgICA7OwotCi0gIG9zZjMqIHwgb3NmNCopCi0gICAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgICAgYWxsb3dfdW5kZWZpbmVkX2ZsYWc9JyAke3dsfS1leHBlY3RfdW5yZXNvbHZlZCAke3dsfVwqJwotICAgICAgYXJjaGl2ZV9jbWRzPSckQ0MgLXNoYXJlZCR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9ICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cyAke3dsfS1zb25hbWUgJHt3bH0kc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvICR7d2x9LXNldF92ZXJzaW9uICR7d2x9JHZlcnN0cmluZ2AgLW8gJGxpYicKLSAgICBlbHNlCi0gICAgICBhbGxvd191bmRlZmluZWRfZmxhZz0nIC1leHBlY3RfdW5yZXNvbHZlZCBcKicKLSAgICAgIGFyY2hpdmVfY21kcz0nJExEIC1zaGFyZWQke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMgLXNvbmFtZSAkc29uYW1lIGB0ZXN0IC1uICIkdmVyc3RyaW5nIiAmJiBlY2hvIC1zZXRfdmVyc2lvbiAkdmVyc3RyaW5nYCAtbyAkbGliJwotICAgIGZpCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYz0nJHt3bH0tcnBhdGggJHt3bH0kbGliZGlyJwotICAgIGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9OgotICAgIDs7Ci0KLSAgc2NvMy4ydjUqKQotICAgIGFyY2hpdmVfY21kcz0nJExEIC1HIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2RpcmVjdD15ZXMKLSAgICA7OwotCi0gIHNvbGFyaXMqKQotICAgIG5vX3VuZGVmaW5lZF9mbGFnPScgLXogdGV4dCcKLSAgICAjICRDQyAtc2hhcmVkIHdpdGhvdXQgR05VIGxkIHdpbGwgbm90IGNyZWF0ZSBhIGxpYnJhcnkgZnJvbSBDKysKLSAgICAjIG9iamVjdCBmaWxlcyBhbmQgYSBzdGF0aWMgbGlic3RkYysrLCBiZXR0ZXIgYXZvaWQgaXQgYnkgbm93Ci0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcke2FsbG93X3VuZGVmaW5lZF9mbGFnfSAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGFyY2hpdmVfZXhwc3ltX2NtZHM9JyRlY2hvICJ7IGdsb2JhbDoiID4gJGxpYi5leHB+Y2F0ICRleHBvcnRfc3ltYm9scyB8IHNlZCAtZSAicy9cKC4qXCkvXDE7LyIgPj4gJGxpYi5leHB+JGVjaG8gImxvY2FsOiAqOyB9OyIgPj4gJGxpYi5leHB+Ci0JCSRMRCAtRyR7YWxsb3dfdW5kZWZpbmVkX2ZsYWd9IC1NICRsaWIuZXhwIC1oICRzb25hbWUgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHN+JHJtICRsaWIuZXhwJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1SJGxpYmRpcicKLSAgICBoYXJkY29kZV9zaGxpYnBhdGhfdmFyPW5vCi0gICAgOzsKLQotICBzdW5vczQqKQotICAgICMgV2h5IGRvIHdlIG5lZWQgLUJzdGF0aWM/ICBUbyBhdm9pZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcywgbWF5YmUuLi4KLSAgICBpZiB0ZXN0ICIkd2l0aF9nY2MiID0geWVzOyB0aGVuCi0gICAgICAjIFVzZSAtZlBJQyBoZXJlIGJlY2F1c2UgbGliZ2NjIGlzIG11bHRpbGliYmVkCi0gICAgICBhcmNoaXZlX2NtZHM9JyRDQyAtc2hhcmVkICR7d2x9LUJzdGF0aWMgLWZQSUMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgZWxzZQotICAgICAgYXJjaGl2ZV9jbWRzPSckTEQgLWFzc2VydCBwdXJlLXRleHQgLUJzdGF0aWMgLW8gJGxpYiAkbGlib2JqcyAkZGVwbGlicyAkbGlua29wdHMnCi0gICAgZmkKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PXllcwotICAgIGhhcmRjb2RlX21pbnVzX0w9eWVzCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgc3lzdjQuMyopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYz0nLUJleHBvcnQnCi0gICAgOzsKLQotICB1dHM0KikKLSAgICBhcmNoaXZlX2NtZHM9JyRMRCAtRyAtaCAkc29uYW1lIC1vICRsaWIgJGxpYm9ianMgJGRlcGxpYnMgJGxpbmtvcHRzJwotICAgIGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9Jy1MJGxpYmRpcicKLSAgICBoYXJkY29kZV9kaXJlY3Q9bm8KLSAgICBoYXJkY29kZV9taW51c19MPW5vCi0gICAgaGFyZGNvZGVfc2hsaWJwYXRoX3Zhcj1ubwotICAgIDs7Ci0KLSAgZGd1eCopCi0gICAgYXJjaGl2ZV9jbWRzPSckTEQgLUcgLWggJHNvbmFtZSAtbyAkbGliICRsaWJvYmpzICRkZXBsaWJzICRsaW5rb3B0cycKLSAgICBoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjPSctTCRsaWJkaXInCi0gICAgaGFyZGNvZGVfZGlyZWN0PW5vCi0gICAgaGFyZGNvZGVfbWludXNfTD1ubwotICAgIGhhcmRjb2RlX3NobGlicGF0aF92YXI9bm8KLSAgICA7OwotCi0gICopCi0gICAgbGRfc2hsaWJzPW5vCi0gICAgY2FuX2J1aWxkX3NoYXJlZD1ubwotICAgIDs7Ci0gIGVzYWMKLWZpCi1lY2hvICIkYWNfdCRsZF9zaGxpYnMiIDE+JjYKLQotaWYgdGVzdCAteiAiJE5NIjsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0uLi4gJGFjX2MiIDE+JjYKLSAgY2FzZSAiJE5NIiBpbgotICAvKiB8IFtBLVphLXpdOlsvXFxdKikgOzsgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gICopCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9JHtQQVRIX1NFUEFSQVRPUn0iCi0gICAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL3VjYiAvdXNyL2Njcy9iaW4gL2JpbjsgZG8KLSAgICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgbm0gYWNjZXB0cyBhIEJTRC1jb21wYXQgZmxhZy4KLQkjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotCSMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLQlpZiAoJGFjX2Rpci9ubSAtQiAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQkgIE5NPSIkYWNfZGlyL25tIC1CIgotCSAgYnJlYWsKLQllbGlmICgkYWNfZGlyL25tIC1wIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCSAgTk09IiRhY19kaXIvbm0gLXAiCi0JICBicmVhawotCWVsc2UKLQkgIE5NPSR7Tk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQkgIGNvbnRpbnVlICMgc28gdGhhdCB3ZSBjYW4gdHJ5IHRvIGZpbmQgb25lIHRoYXQgc3VwcG9ydHMgQlNEIGZsYWdzCi0JZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIElGUz0iJGFjX3NhdmVfaWZzIgotICAgIHRlc3QgLXogIiROTSIgJiYgTk09bm0KLSAgICA7OwotICBlc2FjCi0gIGVjaG8gIiRhY190JE5NIiAxPiY2Ci1maQotCi0jIENoZWNrIGZvciBjb21tYW5kIHRvIGdyYWIgdGhlIHJhdyBzeW1ib2wgbmFtZSBmb2xsb3dlZCBieSBDIHN5bWJvbCBmcm9tIG5tLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0Li4uICRhY19jIiAxPiY2Ci0KLSMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyBbVGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KV0KLQotIyBDaGFyYWN0ZXIgY2xhc3MgZGVzY3JpYmluZyBOTSBnbG9iYWwgc3ltYm9sIGNvZGVzLgotc3ltY29kZT0nW0JDREVHUlNUXScKLQotIyBSZWdleHAgdG8gbWF0Y2ggc3ltYm9scyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIEMuCi1zeW1wYXQ9J1woW19BLVphLXpdW19BLVphLXowLTldKlwpJwotCi0jIFRyYW5zZm9ybSB0aGUgYWJvdmUgaW50byBhIHJhdyBzeW1ib2wgYW5kIGEgQyBzeW1ib2wuCi1zeW14ZnJtPSdcMSBcMlwzIFwzJwotCi0jIFRyYW5zZm9ybSBhbiBleHRyYWN0ZWQgc3ltYm9sIGxpbmUgaW50byBhIHByb3BlciBDIGRlY2xhcmF0aW9uCi1nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0KLSMgRGVmaW5lIHN5c3RlbS1zcGVjaWZpYyB2YXJpYWJsZXMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeCopCi0gIHN5bWNvZGU9J1tCQ0RUXScKLSAgOzsKLWN5Z3dpbiogfCBtaW5ndyopCi0gIHN5bWNvZGU9J1tBQkNER0lTVFddJwotICA7OwotaHB1eCopICMgSXRzIGxpbmtlciBkaXN0aW5ndWlzaGVzIGRhdGEgZnJvbSBjb2RlIHN5bWJvbHMKLSAgZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBzeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gICMgV3JpdGUgdGhlIHJhdyBhbmQgQyBpZGVudGlmaWVycy4KLSAgZ2xvYmFsX3N5bWJvbF9waXBlPSJzZWQgLW4gLWUgJ3MvXi4qWyAJXVwoJHN5bWNvZGVcKVsgCV1bIAldKlwoJGFjX3N5bXByZnhcKSRzeW1wYXQkLyRzeW14ZnJtL3AnIgotCi0gICMgQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIHBpcGUgd29ya3MgY29ycmVjdGx5LgotICBwaXBlX3dvcmtzPW5vCi0gICRybSBjb25mdGVzdCoKLSAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotY2hhciBubV90ZXN0X3ZhcjsKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLW1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jKCk7cmV0dXJuKDApO30KLUVPRgotCi0gIGVjaG8gIiRwcm9nbmFtZToxNDQ3OiBjaGVja2luZyBpZiBnbG9iYWxfc3ltYm9sX3BpcGUgd29ya3MiID4mNQotICBpZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjE0NDg6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdC4kb2JqZXh0OyB0aGVuCi0gICAgIyBOb3cgdHJ5IHRvIGdyYWIgdGhlIHN5bWJvbHMuCi0gICAgbmxpc3Q9Y29uZnRlc3Qubm0KLSAgICBpZiB7IGVjaG8gIiRwcm9nbmFtZToxNDUxOiBldmFsIFwiJE5NIGNvbmZ0ZXN0LiRvYmpleHQgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4gJG5saXN0XCIiID4mNTsgZXZhbCAiJE5NIGNvbmZ0ZXN0LiRvYmpleHQgfCAkZ2xvYmFsX3N5bWJvbF9waXBlID4gJG5saXN0IDI+JjUiOyB9ICYmIHRlc3QgLXMgIiRubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRubGlzdCIgfCB1bmlxID4gIiRubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRubGlzdCJUICIkbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0JICBzZWQgJ3MvXi4gXCguKlwpIFwoLipcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvJyA8ICIkbmxpc3QiID4+IGNvbmZ0ZXN0LmMKLQkgIGNhdCA8PFxFT0YgPj4gY29uZnRlc3QuYwotICB7MCwgKGx0X3B0cl90KSAwfQotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLUVPRgotCSAgIyBOb3cgdHJ5IGxpbmtpbmcgdGhlIHR3byBmaWxlcy4KLQkgIG12IGNvbmZ0ZXN0LiRvYmpleHQgY29uZnRlc3RtLiRvYmpleHQKLQkgIHNhdmVfTElCUz0iJExJQlMiCi0JICBzYXZlX0NGTEFHUz0iJENGTEFHUyIKLQkgIExJQlM9ImNvbmZ0ZXN0bS4kb2JqZXh0IgotCSAgQ0ZMQUdTPSIkQ0ZMQUdTJG5vX2J1aWx0aW5fZmxhZyIKLQkgIGlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MTUwMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCi0JICAgIHBpcGVfd29ya3M9eWVzCi0JICBlbHNlCi0JICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0JICAgIGNhdCBjb25mdGVzdC5jID4mNQotCSAgZmkKLQkgIExJQlM9IiRzYXZlX0xJQlMiCi0JZWxzZQotCSAgZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF9mdW5jIGluICRubGlzdCIgPiY1Ci0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkbmxpc3QiID4mNQotICAgICAgZmkKLSAgICBlbHNlCi0gICAgICBlY2hvICJjYW5ub3QgcnVuICRnbG9iYWxfc3ltYm9sX3BpcGUiID4mNQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICAgIGNhdCBjb25mdGVzdC5jID4mNQotICBmaQotICAkcm0gY29uZnRlc3QqCi0KLSAgIyBEbyBub3QgdXNlIHRoZSBnbG9iYWxfc3ltYm9sX3BpcGUgdW5sZXNzIGl0IHdvcmtzLgotICBpZiB0ZXN0ICIkcGlwZV93b3JrcyIgPSB5ZXM7IHRoZW4KLSAgICBicmVhawotICBlbHNlCi0gICAgZ2xvYmFsX3N5bWJvbF9waXBlPQotICBmaQotZG9uZQotZWNobyAiJGFjX3QkcGlwZV93b3JrcyIgMT4mNgotCi1pZiB0ZXN0IC16ICIkZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICBnbG9iYWxfc3ltYm9sX3RvX2NkZWNsPQotZmkKLQotIyBDaGVjayBoYXJkY29kaW5nIGF0dHJpYnV0ZXMuCi1lY2hvICRhY19uICJjaGVja2luZyBob3cgdG8gaGFyZGNvZGUgbGlicmFyeSBwYXRocyBpbnRvIHByb2dyYW1zLi4uICRhY19jIiAxPiY2Ci1oYXJkY29kZV9hY3Rpb249Ci1pZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyIgfHwgXAotICAgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCi0gICMgV2UgY2FuIGhhcmRjb2RlIG5vbi1leGlzdGFudCBkaXJlY3Rvcmllcy4KLSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gbm8gJiYgXAotICAgICB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgIT0gbm8gJiYgXAotICAgICB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgIT0gbm87IHRoZW4KLQotICAgICMgTGlua2luZyBhbHdheXMgaGFyZGNvZGVzIHRoZSB0ZW1wb3JhcnkgbGlicmFyeSBkaXJlY3RvcnkuCi0gICAgaGFyZGNvZGVfYWN0aW9uPXJlbGluawotICBlbHNlCi0gICAgIyBXZSBjYW4gbGluayB3aXRob3V0IGhhcmRjb2RpbmcsIGFuZCB3ZSBjYW4gaGFyZGNvZGUgbm9uZXhpc3RpbmcgZGlycy4KLSAgICBoYXJkY29kZV9hY3Rpb249aW1tZWRpYXRlCi0gIGZpCi1lbHNlCi0gICMgV2UgY2Fubm90IGhhcmRjb2RlIGFueXRoaW5nLCBvciBlbHNlIHdlIGNhbiBvbmx5IGhhcmRjb2RlIGV4aXN0aW5nCi0gICMgZGlyZWN0b3JpZXMuCi0gIGhhcmRjb2RlX2FjdGlvbj11bnN1cHBvcnRlZAotZmkKLWVjaG8gIiRhY190JGhhcmRjb2RlX2FjdGlvbiIgMT4mNgotCi0KLXJlbG9hZF9mbGFnPQotcmVsb2FkX2NtZHM9JyRMRCRyZWxvYWRfZmxhZyAtbyAkb3V0cHV0JHJlbG9hZF9vYmpzJwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRMRCBvcHRpb24gdG8gcmVsb2FkIG9iamVjdCBmaWxlcy4uLiAkYWNfYyIgMT4mNgotIyBQT1JUTUUgU29tZSBsaW5rZXJzIG1heSBuZWVkIGEgZGlmZmVyZW50IHJlbG9hZCBmbGFnLgotcmVsb2FkX2ZsYWc9Jy1yJwotZWNobyAiJGFjX3QkcmVsb2FkX2ZsYWciIDE+JjYKLXRlc3QgLW4gIiRyZWxvYWRfZmxhZyIgJiYgcmVsb2FkX2ZsYWc9IiAkcmVsb2FkX2ZsYWciCi0KLSMgUE9SVE1FIEZpbGwgaW4geW91ciBsZC5zbyBjaGFyYWN0ZXJpc3RpY3MKLWxpYnJhcnlfbmFtZXNfc3BlYz0KLWxpYm5hbWVfc3BlYz0nbGliJG5hbWUnCi1zb25hbWVfc3BlYz0KLXBvc3RpbnN0YWxsX2NtZHM9Ci1wb3N0dW5pbnN0YWxsX2NtZHM9Ci1maW5pc2hfY21kcz0KLWZpbmlzaF9ldmFsPQotc2hsaWJwYXRoX3Zhcj0KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD11bmtub3duCi12ZXJzaW9uX3R5cGU9bm9uZQotZHluYW1pY19saW5rZXI9IiRob3N0X29zIGxkLnNvIgotc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIiCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi1maWxlX21hZ2ljX2NtZD0KLWZpbGVfbWFnaWNfdGVzdF9maWxlPQotZGVwbGlic19jaGVja19tZXRob2Q9J3Vua25vd24nCi0jIE5lZWQgdG8gc2V0IHRoZSBwcmVjZWRpbmcgdmFyaWFibGUgb24gYWxsIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQKLSMgaW50ZXJsaWJyYXJ5IGRlcGVuZGVuY2llcy4KLSMgJ25vbmUnIC0tIGRlcGVuZGVuY2llcyBub3Qgc3VwcG9ydGVkLgotIyBgdW5rbm93bicgLS0gc2FtZSBhcyBub25lLCBidXQgZG9jdW1lbnRzIHRoYXQgd2UgcmVhbGx5IGRvbid0IGtub3cuCi0jICdwYXNzX2FsbCcgLS0gYWxsIGRlcGVuZGVuY2llcyBwYXNzZWQgd2l0aCBubyBjaGVja3MuCi0jICd0ZXN0X2NvbXBpbGUnIC0tIGNoZWNrIGJ5IG1ha2luZyB0ZXN0IHByb2dyYW0uCi0jICdmaWxlX21hZ2ljIFtyZWdleF0nIC0tIGNoZWNrIGJ5IGxvb2tpbmcgZm9yIGZpbGVzIGluIGxpYnJhcnkgcGF0aAotIyB3aGljaCByZXNwb25kcyB0byB0aGUgJGZpbGVfbWFnaWNfY21kIHdpdGggYSBnaXZlbiBlZ3JlcCByZWdleC4KLSMgSWYgeW91IGhhdmUgYGZpbGUnIG9yIGVxdWl2YWxlbnQgb24geW91ciBzeXN0ZW0gYW5kIHlvdSdyZSBub3Qgc3VyZQotIyB3aGV0aGVyIGBwYXNzX2FsbCcgd2lsbCAqYWx3YXlzKiB3b3JrLCB5b3UgcHJvYmFibHkgd2FudCB0aGlzIG9uZS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGR5bmFtaWMgbGlua2VyIGNoYXJhY3RlcmlzdGljcy4uLiAkYWNfYyIgMT4mNgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotCi0gICMgQUlYIGhhcyBubyB2ZXJzaW9uaW5nIHN1cHBvcnQsIHNvIHdlIGFwcGVuZCBhIG1ham9yIHZlcnNpb24gdG8gdGhlIG5hbWUuCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgOzsKLQotYWl4NCopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICAjIEFJWCBoYXMgbm8gdmVyc2lvbmluZyBzdXBwb3J0LCBzbyBjdXJyZW50bHkgd2UgY2FuIG5vdCBoYXJkY29kZSBjb3JyZWN0Ci0gICMgc29uYW1lIGludG8gZXhlY3V0YWJsZS4gUHJvYmFibHkgd2UgY2FuIGFkZCB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8KLSAgIyBjb2xsZWN0Miwgc28gYWRkaXRpb25hbCBsaW5rcyBjYW4gYmUgdXNlZnVsIGluIGZ1dHVyZS4KLSAgIyBXZSBwcmVzZXJ2ZSAuYSBhcyBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJpZXMgdGhvdWdoIEFJWDQuMgotICAjIGFuZCBsYXRlciBsaW5rZXIgc3VwcG9ydHMgLnNvCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLmEnCi0gIHNobGlicGF0aF92YXI9TElCUEFUSAotICBkZXBsaWJzX2NoZWNrX21ldGhvZD1wYXNzX2FsbAotICA7OwotCi1hbWlnYW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5peGxpYnJhcnkgJGxpYm5hbWUuYScKLSAgIyBDcmVhdGUgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSBlbnRyaWVzIGluIC9zeXMvbGlicy4KLSAgZmluaXNoX2V2YWw9J2ZvciBsaWIgaW4gYGxzICRsaWJkaXIvKi5peGxpYnJhcnkgMj4vZGV2L251bGxgOyBkbyBsaWJuYW1lPWAkZWNobyAiWCRsaWIiIHwgJFhzZWQgLWUgJ1wnJ3MlXi4qL1woW14vXSpcKVwuaXhsaWJyYXJ5JCVcMSUnXCcnYDsgdGVzdCAkcm0gL3N5cy9saWJzLyR7bGlibmFtZX1faXhsaWJyYXJ5LmE7ICRzaG93ICIoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkiOyAoY2QgL3N5cy9saWJzICYmICRMTl9TICRsaWIgJHtsaWJuYW1lfV9peGxpYnJhcnkuYSkgfHwgZXhpdCAxOyBkb25lJwotICA7OwotCi1iZW9zKikKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9LnNvJwotICBkeW5hbWljX2xpbmtlcj0iJGhvc3Rfb3MgbGQuc28iCi0gIHNobGlicGF0aF92YXI9TElCUkFSWV9QQVRICi0gIDs7Ci0KLWJzZGk0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfS5zbyRtYWpvciAke2xpYm5hbWV9LnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfS5zbycKLSAgZmluaXNoX2NtZHM9J1BBVEg9IiRQQVRIOi9zYmluIiBsZGNvbmZpZyAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgMzItYml0IExTQiBzaGFyZWQgb2JqZWN0JwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9zaGxpYi9saWJjLnNvCi0gIHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYz0iL3NobGliIC91c3IvbGliIC91c3IvWDExL2xpYiAvdXNyL2NvbnRyaWIvbGliIC9saWIgL3Vzci9sb2NhbC9saWIiCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvc2hsaWIgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIiCi0gICMgdGhlIGRlZmF1bHQgbGQuc28uY29uZiBhbHNvIGNvbnRhaW5zIC91c3IvY29udHJpYi9saWIgYW5kCi0gICMgL3Vzci9YMTFSNi9saWIgKC91c3IvWDExIGlzIGEgbGluayB0byAvdXNyL1gxMVI2KSwgYnV0IGxldCB1cyBhbGxvdwotICAjIGxpYnRvb2wgdG8gaGFyZC1jb2RlIHRoZXNlIGludG8gcHJvZ3JhbXMKLSAgOzsKLQotY3lnd2luKiB8IG1pbmd3KikKLSAgdmVyc2lvbl90eXBlPXdpbmRvd3MKLSAgaWYgdGVzdCAiJHdpdGhfZ2NjIiA9IHllczsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfWBlY2hvICR7cmVsZWFzZX0gfCBzZWQgLWUgJ3MvWy5dLy0vZydgJHt2ZXJzdWZmaXh9LmRsbCAkbGlibmFtZS5hJwotICBlbHNlCi0gICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9YGVjaG8gJHtyZWxlYXNlfSB8IHNlZCAtZSAncy9bLl0vLS9nJ2Ake3ZlcnN1ZmZpeH0uZGxsICRsaWJuYW1lLmxpYicKLSAgZmkKLSAgZHluYW1pY19saW5rZXI9J1dpbjMyIGxkLmV4ZScKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgZmlsZSBmb3JtYXQgcGVpKi1pMzg2LiphcmNoaXRlY3R1cmU6IGkzODYnCi0gIGZpbGVfbWFnaWNfY21kPSdvYmpkdW1wIC1mJwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgIyBGSVhNRTogZmlyc3Qgd2Ugc2hvdWxkIHNlYXJjaCAuIGFuZCB0aGUgZGlyZWN0b3J5IHRoZSBleGVjdXRhYmxlIGlzIGluCi0gIHNobGlicGF0aF92YXI9UEFUSAotICA7OwotCi1mcmVlYnNkMSopCi0gIGR5bmFtaWNfbGlua2VyPW5vCi0gIDs7Ci0gIAotZnJlZWJzZCopCi0gIG9iamZvcm1hdD1gdGVzdCAteCAvdXNyL2Jpbi9vYmpmb3JtYXQgJiYgL3Vzci9iaW4vb2JqZm9ybWF0IHx8IGVjaG8gYW91dGAKLSAgdmVyc2lvbl90eXBlPWZyZWVic2QtJG9iamZvcm1hdAotICBjYXNlICIkdmVyc2lvbl90eXBlIiBpbgotICAgIGZyZWVic2QtZWxmKikKLSAgICAgIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdmaWxlX21hZ2ljIEVMRiBbMC05XVswLTldKi1iaXQgW0xNXVNCIHNoYXJlZCBvYmplY3QnCi0gICAgICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gICAgICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvdXNyL2xpYi9saWJjLnNvKmAKLSAgICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICAgICAgbmVlZF92ZXJzaW9uPW5vCi0gICAgICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgICAgIDs7Ci0gICAgZnJlZWJzZC0qKQotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9dW5rbm93bgotICAgICAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJGxpYm5hbWUuc28kdmVyc3VmZml4JwotICAgICAgbmVlZF92ZXJzaW9uPXllcwotICAgICAgOzsKLSAgZXNhYwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIE9CSkZPUk1BVD0iJyIkb2JqZm9ybWF0IiciIGxkY29uZmlnIC1tICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWdudSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9LnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1ocHV4OSogfCBocHV4MTAqIHwgaHB1eDExKikKLSAgIyBHaXZlIGEgc29uYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ham9yIHZlcnNpb24gc28gdGhhdCBkbGQuc2wgcmVmdXNlcyB0bwotICAjIGxpbmsgYWdhaW5zdCBvdGhlciB2ZXJzaW9ucy4KLSAgZHluYW1pY19saW5rZXI9IiRob3N0X29zIGRsZC5zbCIKLSAgdmVyc2lvbl90eXBlPXN1bm9zCi0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgc2hsaWJwYXRoX3Zhcj1TSExJQl9QQVRICi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNsJG1ham9yICRsaWJuYW1lLnNsJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc2wkbWFqb3InCi0gICMgSFAtVVggcnVucyAqcmVhbGx5KiBzbG93bHkgdW5sZXNzIHNoYXJlZCBsaWJyYXJpZXMgYXJlIG1vZGUgNTU1LgotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCA1NTUgJGxpYicKLSAgOzsKLQotaXJpeDUqKQotICB2ZXJzaW9uX3R5cGU9aXJpeAotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgMzItYml0IE1TQiBkeW5hbWljIGxpYiBNSVBTIC0gdmVyc2lvbiAxIiAjIG9yIHNob3VsZCBpdCBiZSBwYXNzX2FsbD8KLSAgZmlsZV9tYWdpY19jbWQ9L3Vzci9iaW4vZmlsZQotICBmaWxlX21hZ2ljX3Rlc3RfZmlsZT1gZWNobyAvbGliL2xpYmMuc28qYAotICBzaGxpYnBhdGhfb3ZlcnJpZGVzX3J1bnBhdGg9bm8KLSAgOzsKLQotaXJpeDYqKQotICB2ZXJzaW9uX3R5cGU9aXJpeAotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbmVlZF92ZXJzaW9uPW5vCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbycKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28gJGxpYm5hbWUuc28nCi0gIGNhc2UgIiRMRCIgaW4gIyBsaWJ0b29sLm00IHdpbGwgYWRkIG9uZSBvZiB0aGVzZSBzd2l0Y2hlcyB0byBMRAotICAqLTMyfCoiLTMyICIpIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9MzItYml0OzsKLSAgKi1uMzJ8KiItbjMyICIpIGxpYnN1ZmY9MzIgc2hsaWJzdWZmPU4zMiBsaWJtYWdpYz1OMzI7OwotICAqLTY0fCoiLTY0ICIpIGxpYnN1ZmY9NjQgc2hsaWJzdWZmPTY0IGxpYm1hZ2ljPTY0LWJpdDs7Ci0gICopIGxpYnN1ZmY9IHNobGlic3VmZj0gbGlibWFnaWM9bmV2ZXItbWF0Y2g7OwotICBlc2FjCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWSR7c2hsaWJzdWZmfV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICAjIGV2ZW4gdGhvdWdoIC91c3IvbG9jYWwvbGliIGlzIGFsd2F5cyBzZWFyY2hlZCwgdGhlIG1hbi1wYWdlIHNheXMKLSAgIyBzaGFyZWQgbGlicmFyaWVzIHNob3VsZCBub3QgYmUgaW5zdGFsbGVkIHRoZXJlIGlmIHRoZXkgdXNlIGFuIEFCSQotICAjIGRpZmZlcmVudCBmcm9tIC0zMiwgc28gd2UnZCBiZXR0ZXIgbm90IHNlYXJjaCBmb3Igc2hhcmVkIGxpYnJhcmllcwotICAjIHRoZXJlIGVpdGhlcgotICBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9Ii9saWIke2xpYnN1ZmZ9IC91c3IvbGliJHtsaWJzdWZmfSAvdXNyL2xvY2FsL2xpYiR7bGlic3VmZn0iCi0gIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjPSIvbGliJHtsaWJzdWZmfSAvdXNyL2xpYiR7bGlic3VmZn0gL3Vzci9sb2NhbC9saWIke2xpYnN1ZmZ9IgotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgJHtsaWJtYWdpY30gTVNCIG1pcHMtWzEyMzRdIGR5bmFtaWMgbGliIE1JUFMgLSB2ZXJzaW9uIDEiICMgb3Igc2hvdWxkIGl0IGJlIHBhc3NfYWxsPwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIke2xpYnN1ZmZ9L2xpYmMuc28qYAotICA7OwotCi0jIE5vIHNoYXJlZCBsaWIgc3VwcG9ydCBmb3IgTGludXggb2xkbGQsIGFvdXQsIG9yIGNvZmYuCi1saW51eC1nbnVvbGRsZCogfCBsaW51eC1nbnVhb3V0KiB8IGxpbnV4LWdudWNvZmYqKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotCi0jIFRoaXMgbXVzdCBiZSBMaW51eCBFTEYuCi1saW51eC1nbnUqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBmaW5pc2hfY21kcz0nUEFUSD0iJFBBVEg6L3NiaW4iIGxkY29uZmlnIC1uICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD1ubwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0nZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XSotYml0IFtMTV1TQiAoc2hhcmVkIG9iamVjdHxkeW5hbWljIGxpYiApJwotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPWBlY2hvIC9saWIvbGliYy5zbyogL2xpYi9saWJjLSouc29gCi0KLSAgaWYgdGVzdCAtZiAvbGliL2xkLnNvLjE7IHRoZW4KLSAgICBkeW5hbWljX2xpbmtlcj0nR05VIGxkLnNvJwotICBlbHNlCi0gICAgIyBPbmx5IHRoZSBHTlUgbGQuc28gc3VwcG9ydHMgc2hhcmVkIGxpYnJhcmllcyBvbiBNa0xpbnV4LgotICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KLSAgICBwb3dlcnBjKikgZHluYW1pY19saW5rZXI9bm8gOzsKLSAgICAqKSBkeW5hbWljX2xpbmtlcj0nTGludXggbGQuc28nIDs7Ci0gICAgZXNhYwotICBmaQotICA7OwotCi1uZXRic2QqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgaWYgZWNobyBfX0VMRl9fIHwgJENDIC1FIC0gfCBncmVwIF9fRUxGX18gPi9kZXYvbnVsbDsgdGhlbgotICAgIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICAgIGZpbmlzaF9jbWRzPSdQQVRIPSIkUEFUSDovc2JpbiIgbGRjb25maWcgLW0gJGxpYmRpcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIChhLm91dCkgbGQuc28nCi0gIGVsc2UKLSAgICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyAke2xpYm5hbWV9LnNvJwotICAgIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgICBkeW5hbWljX2xpbmtlcj0nTmV0QlNEIGxkLmVsZl9zbycKLSAgZmkKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgOzsKLQotb3BlbmJzZCopCi0gIHZlcnNpb25fdHlwZT1zdW5vcwotICBpZiB0ZXN0ICIkd2l0aF9nbnVfbGQiID0geWVzOyB0aGVuCi0gICAgbmVlZF9saWJfcHJlZml4PW5vCi0gICAgbmVlZF92ZXJzaW9uPW5vCi0gIGZpCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0uc28kdmVyc3VmZml4JwotICBmaW5pc2hfY21kcz0nUEFUSD0iXCRQQVRIOi9zYmluIiBsZGNvbmZpZyAtbSAkbGliZGlyJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1vczIqKQotICBsaWJuYW1lX3NwZWM9JyRuYW1lJwotICBuZWVkX2xpYl9wcmVmaXg9bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPSckbGlibmFtZS5kbGwgJGxpYm5hbWUuYScKLSAgZHluYW1pY19saW5rZXI9J09TLzIgbGQuZXhlJwotICBzaGxpYnBhdGhfdmFyPUxJQlBBVEgKLSAgOzsKLQotb3NmMyogfCBvc2Y0KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28nCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICAjIGRlcGxpYnNfY2hlY2tfbWV0aG9kPSdwYXNzX2FsbCcKLSAgIyBBbHRob3VnaCBwYXNzX2FsbCBhcHBlYXJzIHRvIHdvcmssIGl0IGNvcGllcyBzeW1ib2xzIGZyb20gc3RhdGljIGxpYnJhcmllcwotICAjIGludG8gc2hhcmVkIG9uZXMgYW5kIGV4cG9ydHMgdGhlbS4gIFNvLCB3aGVuIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0d28KLSAgIyBvciBtb3JlIGxpYnJhcmllcyB0aGF0IGhhdmUgZ290IGNvcGllcyBvZiB0aGUgc2FtZSBzeW1ib2xzLCBsaW5rIGZhaWxzCi0gICMgVGhpcyB3YXMgb25seSB0ZXN0ZWQgb24gb3NmNDoKLSAgZGVwbGlic19jaGVja19tZXRob2Q9J2ZpbGVfbWFnaWMgQ09GRiBmb3JtYXQgYWxwaGEgc2hhcmVkIGxpYnJhcnknCi0gIGZpbGVfbWFnaWNfY21kPS91c3IvYmluL2ZpbGUKLSAgZmlsZV9tYWdpY190ZXN0X2ZpbGU9L3NobGliL2xpYmMuc28KLSAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjPSIvdXNyL3NobGliIC91c3IvY2NzL2xpYiAvdXNyL2xpYi9jbXBscnMvY2MgL3Vzci9saWIgL3Vzci9sb2NhbC9saWIgL3Zhci9zaGxpYiIKLSAgc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWM9IiRzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMiCi0gIDs7Ci0KLXNjbzMuMnY1KikKLSAgdmVyc2lvbl90eXBlPW9zZgotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi1zb2xhcmlzKikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIG5lZWRfbGliX3ByZWZpeD1ubwotICBuZWVkX3ZlcnNpb249bm8KLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3IgJGxpYm5hbWUuc28nCi0gIHNvbmFtZV9zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvcicKLSAgc2hsaWJwYXRoX3Zhcj1MRF9MSUJSQVJZX1BBVEgKLSAgc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoPXllcwotICAjIGxkZCBjb21wbGFpbnMgdW5sZXNzIGxpYnJhcmllcyBhcmUgZXhlY3V0YWJsZQotICBwb3N0aW5zdGFsbF9jbWRzPSdjaG1vZCAreCAkbGliJwotICBkZXBsaWJzX2NoZWNrX21ldGhvZD0iZmlsZV9tYWdpYyBFTEYgWzAtOV1bMC05XS1iaXQgW0xNXVNCIGR5bmFtaWMgbGliIgotICBmaWxlX21hZ2ljX2NtZD0vdXNyL2Jpbi9maWxlCi0gIGZpbGVfbWFnaWNfdGVzdF9maWxlPS9saWIvbGliYy5zbwotICA7OwotCi1zdW5vczQqKQotICB2ZXJzaW9uX3R5cGU9c3Vub3MKLSAgbGlicmFyeV9uYW1lc19zcGVjPScke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyR2ZXJzdWZmaXggJHtsaWJuYW1lfS5zbyR2ZXJzdWZmaXgnCi0gIGZpbmlzaF9jbWRzPSdQQVRIPSJcJFBBVEg6L3Vzci9ldGMiIGxkY29uZmlnICRsaWJkaXInCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD15ZXMKLSAgaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICAgIG5lZWRfbGliX3ByZWZpeD1ubwotICBmaQotICBuZWVkX3ZlcnNpb249eWVzCi0gIDs7Ci0KLXN5c3Y0LjJ1dzIqIHwgc3lzdjQuMyogfCBzeXN2NSopCi0gIHZlcnNpb25fdHlwZT1saW51eAotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICBjYXNlICIkaG9zdF92ZW5kb3IiIGluCi0gICAgbmNyKQotICAgICAgZGVwbGlic19jaGVja19tZXRob2Q9J3Bhc3NfYWxsJwotICAgICAgOzsKLSAgZXNhYwotICA7OwotCi11dHM0KikKLSAgdmVyc2lvbl90eXBlPWxpbnV4Ci0gIGxpYnJhcnlfbmFtZXNfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kdmVyc3VmZml4ICR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yICRsaWJuYW1lLnNvJwotICBzb25hbWVfc3BlYz0nJHtsaWJuYW1lfSR7cmVsZWFzZX0uc28kbWFqb3InCi0gIHNobGlicGF0aF92YXI9TERfTElCUkFSWV9QQVRICi0gIDs7Ci0KLWRndXgqKQotICB2ZXJzaW9uX3R5cGU9bGludXgKLSAgbmVlZF9saWJfcHJlZml4PW5vCi0gIG5lZWRfdmVyc2lvbj1ubwotICBsaWJyYXJ5X25hbWVzX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJHZlcnN1ZmZpeCAke2xpYm5hbWV9JHtyZWxlYXNlfS5zbyRtYWpvciAkbGlibmFtZS5zbycKLSAgc29uYW1lX3NwZWM9JyR7bGlibmFtZX0ke3JlbGVhc2V9LnNvJG1ham9yJwotICBzaGxpYnBhdGhfdmFyPUxEX0xJQlJBUllfUEFUSAotICA7OwotCi0qKQotICBkeW5hbWljX2xpbmtlcj1ubwotICA7OwotZXNhYwotZWNobyAiJGFjX3QkZHluYW1pY19saW5rZXIiIDE+JjYKLXRlc3QgIiRkeW5hbWljX2xpbmtlciIgPSBubyAmJiBjYW5fYnVpbGRfc2hhcmVkPW5vCi0KLSMgUmVwb3J0IHRoZSBmaW5hbCBjb25zZXF1ZW5jZXMuCi1lY2hvICJjaGVja2luZyBpZiBsaWJ0b29sIHN1cHBvcnRzIHNoYXJlZCBsaWJyYXJpZXMuLi4gJGNhbl9idWlsZF9zaGFyZWQiIDE+JjYKLQotaWYgdGVzdCAtbiAiJGZpbGVfbWFnaWNfdGVzdF9maWxlIiAmJiB0ZXN0IC1uICIkZmlsZV9tYWdpY19jbWQiOyB0aGVuCi0gIGNhc2UgIiRkZXBsaWJzX2NoZWNrX21ldGhvZCIgaW4KLSAgImZpbGVfbWFnaWMgIiopCi0gICAgZmlsZV9tYWdpY19yZWdleD0iYGV4cHIgXCIkZGVwbGlic19jaGVja19tZXRob2RcIiA6IFwiZmlsZV9tYWdpYyBcKC4qXClcImAiCi0gICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCRmaWxlX21hZ2ljX3Rlc3RfZmlsZSAyPiAvZGV2L251bGwgfAotICAgICAgIGVncmVwICIkZmlsZV9tYWdpY19yZWdleCIgPiAvZGV2L251bGw7IHRoZW4KLSAgICAgIDoKLSAgICBlbHNlCi0gICAgICBjYXQgPDxFT0YgMT4mMgotCi0qKiogV2FybmluZzogdGhlIGNvbW1hbmQgbGlidG9vbCB1c2VzIHRvIGRldGVjdCBzaGFyZWQgbGlicmFyaWVzLAotKioqICRmaWxlX21hZ2ljX2NtZCwgcHJvZHVjZXMgb3V0cHV0IHRoYXQgbGlidG9vbCBjYW5ub3QgcmVjb2duaXplLgotKioqIFRoZSByZXN1bHQgaXMgdGhhdCBsaWJ0b29sIG1heSBmYWlsIHRvIHJlY29nbml6ZSBzaGFyZWQgbGlicmFyaWVzCi0qKiogYXMgc3VjaC4gIFRoaXMgd2lsbCBhZmZlY3QgdGhlIGNyZWF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzIHRoYXQKLSoqKiBkZXBlbmQgb24gc2hhcmVkIGxpYnJhcmllcywgYnV0IHByb2dyYW1zIGxpbmtlZCB3aXRoIHN1Y2ggbGlidG9vbAotKioqIGxpYnJhcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGlzIHByb2JsZW0uICBOZXZlcnRoZWxlc3MsIHlvdQotKioqIG1heSB3YW50IHRvIHJlcG9ydCB0aGUgcHJvYmxlbSB0byB5b3VyIHN5c3RlbSBtYW5hZ2VyIGFuZC9vciB0bwotKioqIGJ1Zy1saWJ0b29sQGdudS5vcmcKLQotRU9GCi0gICAgZmkgOzsKLSAgZXNhYwotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBidWlsZCBzaGFyZWQgbGlicmFyaWVzLi4uICRhY19jIiAxPiY2Ci10ZXN0ICIkY2FuX2J1aWxkX3NoYXJlZCIgPSAibm8iICYmIGVuYWJsZV9zaGFyZWQ9bm8KLQotIyBPbiBBSVgsIHNoYXJlZCBsaWJyYXJpZXMgYW5kIHN0YXRpYyBsaWJyYXJpZXMgdXNlIHRoZSBzYW1lIG5hbWVzcGFjZSwgYW5kCi0jIGFyZSBhbGwgYnVpbHQgZnJvbSBQSUMuCi1jYXNlICIkaG9zdF9vcyIgaW4KLWFpeDMqKQotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICAgIGFyY2hpdmVfY21kcz0iJGFyY2hpdmVfY21kc35cJFJBTkxJQiBcJGxpYiIKLSAgICBwb3N0aW5zdGFsbF9jbWRzPSckUkFOTElCICRsaWInCi0gIGZpCi0gIDs7Ci0KLWFpeDQqKQotICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSB5ZXMgJiYgZW5hYmxlX3N0YXRpYz1ubwotICA7OwotZXNhYwotCi1lY2hvICIkYWNfdCRlbmFibGVfc2hhcmVkIiAxPiY2Ci0KLSMgTWFrZSBzdXJlIGVpdGhlciBlbmFibGVfc2hhcmVkIG9yIGVuYWJsZV9zdGF0aWMgaXMgeWVzLgotdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0geWVzIHx8IGVuYWJsZV9zdGF0aWM9eWVzCi0KLWVjaG8gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgc3RhdGljIGxpYnJhcmllcy4uLiAkZW5hYmxlX3N0YXRpYyIgMT4mNgotCi1pZiB0ZXN0ICIkaGFyZGNvZGVfYWN0aW9uIiA9IHJlbGluazsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1ubwotZWxpZiB0ZXN0ICIkc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoIiA9IHllcyB8fAotICAgICB0ZXN0ICIkZW5hYmxlX3NoYXJlZCIgPSBubzsgdGhlbgotICAjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBuZWNlc3NhcnkKLSAgZW5hYmxlX2Zhc3RfaW5zdGFsbD1uZWVkbGVzcwotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG9iamRpci4uLiAkYWNfYyIgMT4mNgotcm0gLWYgLmxpYnMgMj4vZGV2L251bGwKLW1rZGlyIC5saWJzIDI+L2Rldi9udWxsCi1pZiB0ZXN0IC1kIC5saWJzOyB0aGVuCi0gIG9iamRpcj0ubGlicwotZWxzZQotICAjIE1TLURPUyBkb2VzIG5vdCBhbGxvdyBmaWxlbmFtZXMgdGhhdCBiZWdpbiB3aXRoIGEgZG90LgotICBvYmpkaXI9X2xpYnMKLWZpCi1ybWRpciAubGlicyAyPi9kZXYvbnVsbAotZWNobyAiJGFjX3Qkb2JqZGlyIiAxPiY2Ci0KLWlmIHRlc3QgIngkZW5hYmxlX2Rsb3BlbiIgIT0geHllczsgdGhlbgotICBlbmFibGVfZGxvcGVuPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24KLSAgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz11bmtub3duCi1lbHNlCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfZGxvcGVuJytzZXR9J2BcIiAhPSBzZXQiOyB0aGVuCi0gIGx0X2N2X2Rsb3Blbj1ubyBsdF9jdl9kbG9wZW5fbGlicz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbG9wZW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjE5Nzc6IGNoZWNraW5nIGZvciBkbG9wZW4iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfZGxvcGVuJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTk4MiAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBkbG9wZW4oKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBkbG9wZW4oKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl9kbG9wZW4pIHx8IGRlZmluZWQgKF9fc3R1Yl9fX2Rsb3BlbikKLWNob2tlIG1lCi0jZWxzZQotZGxvcGVuKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIwMDQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfZGxvcGVuPXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19kbG9wZW49bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydkbG9wZW5gXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgbHRfY3ZfZGxvcGVuPSJkbG9wZW4iCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsb3BlbiBpbiAtbGRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMDIyOiBjaGVja2luZyBmb3IgZGxvcGVuIGluIC1sZGwiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkbCdfJ2Rsb3BlbiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkbCAgJExJQlMiCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDMwICJsdGNvbmZpZyIKLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgZGxvcGVuKCk7Ci0KLWludCBtYWluKCkgewotZGxvcGVuKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMDQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49ImRsb3BlbiIgbHRfY3ZfZGxvcGVuX2xpYnM9Ii1sZGwiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGRsZF9saW5rIGluIC1sZGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMDU5OiBjaGVja2luZyBmb3IgZGxkX2xpbmsgaW4gLWxkbGQiID4mNQotYWNfbGliX3Zhcj1gZWNobyBkbGQnXydkbGRfbGluayB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkbGQgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjA2NyAibHRjb25maWciCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGRsZF9saW5rKCk7Ci0KLWludCBtYWluKCkgewotZGxkX2xpbmsoKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIwNzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iZGxkX2xpbmsiIGx0X2N2X2Rsb3Blbl9saWJzPSItbGRsZCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2hsX2xvYWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIwOTY6IGNoZWNraW5nIGZvciBzaGxfbG9hZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19zaGxfbG9hZCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMDEgImx0Y29uZmlnIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgc2hsX2xvYWQoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciBzaGxfbG9hZCgpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViX3NobF9sb2FkKSB8fCBkZWZpbmVkIChfX3N0dWJfX19zaGxfbG9hZCkKLWNob2tlIG1lCi0jZWxzZQotc2hsX2xvYWQoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyAkcHJvZ25hbWU6MjEyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19zaGxfbG9hZD15ZXMiCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfc2hsX2xvYWQ9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXydzaGxfbG9hZGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBsdF9jdl9kbG9wZW49InNobF9sb2FkIgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBMb2FkTGlicmFyeSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICIkcHJvZ25hbWU6MjE0MTogY2hlY2tpbmcgZm9yIExvYWRMaWJyYXJ5IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX0xvYWRMaWJyYXJ5JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE0NiAibHRjb25maWciCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBMb2FkTGlicmFyeSgpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIExvYWRMaWJyYXJ5KCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfTG9hZExpYnJhcnkpIHx8IGRlZmluZWQgKF9fc3R1Yl9fX0xvYWRMaWJyYXJ5KQotY2hva2UgbWUKLSNlbHNlCi1Mb2FkTGlicmFyeSgpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvICRwcm9nbmFtZToyMTY4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jX0xvYWRMaWJyYXJ5PXllcyIKLWVsc2UKLSAgZWNobyAiJHByb2duYW1lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY19Mb2FkTGlicmFyeT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJ0xvYWRMaWJyYXJ5YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGx0X2N2X2Rsb3Blbj0iTG9hZExpYnJhcnkiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgCi1maQotCi0gICAgCi1maQotCi0gIAotZmkKLQotCi1maQotCi1maQotCi0gIGlmIHRlc3QgIngkbHRfY3ZfZGxvcGVuIiAhPSB4bm87IHRoZW4KLSAgICBlbmFibGVfZGxvcGVuPXllcwotICBmaQotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW4iIGluCi0gIGRsb3BlbikKLWZvciBhY19oZHIgaW4gZGxmY24uaDsgZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIyMTA6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjE1ICJsdGNvbmZpZyIKLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IGZub3JkID0gMDsKLUVPRgotYWNfdHJ5PSIkYWNfY29tcGlsZSBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gJHByb2duYW1lOjIyMjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLSAgICBpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9kbGZjbl9oIiA9IHh5ZXM7IHRoZW4KLSAgICAgIENQUEZMQUdTPSIkQ1BQRkxBR1MgLURIQVZFX0RMRkNOX0giCi0gICAgZmkKLSAgICBldmFsIExERkxBR1M9XCJcJExERkxBR1MgJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlY1wiCi0gICAgTElCUz0iJGx0X2N2X2Rsb3Blbl9saWJzICRMSUJTIgotCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYSBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gIiRwcm9nbmFtZToyMjQ4OiBjaGVja2luZyB3aGV0aGVyIGEgcHJvZ3JhbSBjYW4gZGxvcGVuIGl0c2VsZiIgPiY1Ci1pZiB0ZXN0ICIke2x0X2N2X2Rsb3Blbl9zZWxmK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGY9Y3Jvc3MKLSAgZWxzZQotICAgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNsaW5lIDIyNTYgImx0Y29uZmlnIgotCi0jaWYgSEFWRV9ETEZDTl9ICi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2lmZGVmIFJUTERfR0xPQkFMCi0jIGRlZmluZSBMVERMX0dMT0JBTAlSVExEX0dMT0JBTAotI2Vsc2UKLSMgaWZkZWYgRExfR0xPQkFMCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJRExfR0xPQkFMCi0jIGVsc2UKLSMgIGRlZmluZSBMVERMX0dMT0JBTAkwCi0jIGVuZGlmCi0jZW5kaWYKLQotLyogV2UgbWF5IGhhdmUgdG8gZGVmaW5lIExURExfTEFaWV9PUl9OT1cgaW4gdGhlIGNvbW1hbmQgbGluZSBpZiB3ZQotICAgZmluZCBvdXQgaXQgZG9lcyBub3Qgd29yayBpbiBzb21lIHBsYXRmb3JtLiAqLwotI2lmbmRlZiBMVERMX0xBWllfT1JfTk9XCi0jIGlmZGVmIFJUTERfTEFaWQotIyAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9MQVpZCi0jIGVsc2UKLSMgIGlmZGVmIERMX0xBWlkKLSMgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwlETF9MQVpZCi0jICBlbHNlCi0jICAgaWZkZWYgUlRMRF9OT1cKLSMgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJUlRMRF9OT1cKLSMgICBlbHNlCi0jICAgIGlmZGVmIERMX05PVwotIyAgICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTk9XCi0jICAgIGVsc2UKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCTAKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1mbm9yZCgpIHsgaW50IGk9NDI7fQotbWFpbigpIHsgdm9pZCAqc2VsZiwgKnB0cjEsICpwdHIyOyBzZWxmPWRsb3BlbigwLExURExfR0xPQkFMfExURExfTEFaWV9PUl9OT1cpOwotICAgIGlmKHNlbGYpIHsgcHRyMT1kbHN5bShzZWxmLCJmbm9yZCIpOyBwdHIyPWRsc3ltKHNlbGYsIl9mbm9yZCIpOwotCSAgICAgICBpZihwdHIxIHx8IHB0cjIpIGV4aXQoMCk7IH0gZXhpdCgxKTsgfSAKLQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIzMDI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgbHRfY3ZfZGxvcGVuX3NlbGY9eWVzCi1lbHNlCi0gIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGx0X2N2X2Rsb3Blbl9zZWxmPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLQotZWNobyAiJGFjX3QiIiRsdF9jdl9kbG9wZW5fc2VsZiIgMT4mNgotCi0gIGlmIHRlc3QgIiRsdF9jdl9kbG9wZW5fc2VsZiIgPSB5ZXM7IHRoZW4KLSAgICBMREZMQUdTPSIkTERGTEFHUyAkbGlua19zdGF0aWNfZmxhZyIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBhIHN0YXRpY2FsbHkgbGlua2VkIHByb2dyYW0gY2FuIGRsb3BlbiBpdHNlbGYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiJHByb2duYW1lOjIzMjE6IGNoZWNraW5nIHdoZXRoZXIgYSBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtIGNhbiBkbG9wZW4gaXRzZWxmIiA+JjUKLWlmIHRlc3QgIiR7bHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gICAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPWNyb3NzCi0gIGVsc2UKLSAgICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jbGluZSAyMzI5ICJsdGNvbmZpZyIKLQotI2lmIEhBVkVfRExGQ05fSAotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpZmRlZiBSVExEX0dMT0JBTAotIyBkZWZpbmUgTFRETF9HTE9CQUwJUlRMRF9HTE9CQUwKLSNlbHNlCi0jIGlmZGVmIERMX0dMT0JBTAotIyAgZGVmaW5lIExURExfR0xPQkFMCURMX0dMT0JBTAotIyBlbHNlCi0jICBkZWZpbmUgTFRETF9HTE9CQUwJMAotIyBlbmRpZgotI2VuZGlmCi0KLS8qIFdlIG1heSBoYXZlIHRvIGRlZmluZSBMVERMX0xBWllfT1JfTk9XIGluIHRoZSBjb21tYW5kIGxpbmUgaWYgd2UKLSAgIGZpbmQgb3V0IGl0IGRvZXMgbm90IHdvcmsgaW4gc29tZSBwbGF0Zm9ybS4gKi8KLSNpZm5kZWYgTFRETF9MQVpZX09SX05PVwotIyBpZmRlZiBSVExEX0xBWlkKLSMgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTEFaWQotIyBlbHNlCi0jICBpZmRlZiBETF9MQVpZCi0jICAgZGVmaW5lIExURExfTEFaWV9PUl9OT1cJRExfTEFaWQotIyAgZWxzZQotIyAgIGlmZGVmIFJUTERfTk9XCi0jICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCVJUTERfTk9XCi0jICAgZWxzZQotIyAgICBpZmRlZiBETF9OT1cKLSMgICAgIGRlZmluZSBMVERMX0xBWllfT1JfTk9XCURMX05PVwotIyAgICBlbHNlCi0jICAgICBkZWZpbmUgTFRETF9MQVpZX09SX05PVwkwCi0jICAgIGVuZGlmCi0jICAgZW5kaWYKLSMgIGVuZGlmCi0jIGVuZGlmCi0jZW5kaWYKLQotZm5vcmQoKSB7IGludCBpPTQyO30KLW1haW4oKSB7IHZvaWQgKnNlbGYsICpwdHIxLCAqcHRyMjsgc2VsZj1kbG9wZW4oMCxMVERMX0dMT0JBTHxMVERMX0xBWllfT1JfTk9XKTsKLSAgICBpZihzZWxmKSB7IHB0cjE9ZGxzeW0oc2VsZiwiZm5vcmQiKTsgcHRyMj1kbHN5bShzZWxmLCJfZm5vcmQiKTsKLSAgICBpZihwdHIxIHx8IHB0cjIpIGV4aXQoMCk7IH0gZXhpdCgxKTsgfSAKLQotRU9GCi1pZiB7IChldmFsIGVjaG8gJHByb2duYW1lOjIzNzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljPXllcwotZWxzZQotICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWM9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGx0X2N2X2Rsb3Blbl9zZWxmX3N0YXRpYyIgMT4mNgotZmkKLSAgICA7OwotICBlc2FjCi0KLSAgY2FzZSAiJGx0X2N2X2Rsb3Blbl9zZWxmIiBpbgotICB5ZXN8bm8pIGVuYWJsZV9kbG9wZW5fc2VsZj0kbHRfY3ZfZGxvcGVuX3NlbGYgOzsKLSAgKikgZW5hYmxlX2Rsb3Blbl9zZWxmPXVua25vd24gOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRsdF9jdl9kbG9wZW5fc2VsZl9zdGF0aWMiIGluCi0gIHllc3xubykgZW5hYmxlX2Rsb3Blbl9zZWxmX3N0YXRpYz0kbHRfY3ZfZGxvcGVuX3NlbGZfc3RhdGljIDs7Ci0gICopIGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWM9dW5rbm93biA7OwotICBlc2FjCi1maQotCi0jIENvcHkgZWNobyBhbmQgcXVvdGUgdGhlIGNvcHksIGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsLCBiZWNhdXNlIGl0IGlzCi0jIHVzZWQgbGF0ZXIuCi1sdGVjaG89IiRlY2hvIgotaWYgdGVzdCAiWCRsdGVjaG8iID0gIlgkQ09ORklHX1NIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLSAgIGx0ZWNobz0iJENPTkZJR19TSEVMTCBcJDAgLS1mYWxsYmFjay1lY2hvIgotZmkKLUxUU0hFTEw9IiRTSEVMTCIKLQotTFRDT05GSUdfVkVSU0lPTj0iJFZFUlNJT04iCi0KLSMgT25seSBxdW90ZSB2YXJpYWJsZXMgaWYgd2UncmUgdXNpbmcgbHRtYWluLnNoLgotY2FzZSAiJGx0bWFpbiIgaW4KLSouc2gpCi0gICMgTm93IHF1b3RlIGFsbCB0aGUgdGhpbmdzIHRoYXQgbWF5IGNvbnRhaW4gbWV0YWNoYXJhY3RlcnMuCi0gIGZvciB2YXIgaW4gbHRlY2hvIG9sZF9DQyBvbGRfQ0ZMQUdTIG9sZF9DUFBGTEFHUyBvbGRfTEQgb2xkX05NIG9sZF9SQU5MSUIgXAotICAgIG9sZF9MTl9TIG9sZF9ETExUT09MIG9sZF9BUyBBUiBDQyBMRCBMTl9TIE5NIExUU0hFTEwgTFRDT05GSUdfVkVSU0lPTiBcCi0gICAgcmVsb2FkX2ZsYWcgcmVsb2FkX2NtZHMgd2wgXAotICAgIHBpY19mbGFnIGxpbmtfc3RhdGljX2ZsYWcgbm9fYnVpbHRpbl9mbGFnIGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyBcCi0gICAgdGhyZWFkX3NhZmVfZmxhZ19zcGVjIHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIGxpYm5hbWVfc3BlYyBcCi0gICAgbGlicmFyeV9uYW1lc19zcGVjIHNvbmFtZV9zcGVjIFwKLSAgICBSQU5MSUIgb2xkX2FyY2hpdmVfY21kcyBvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIG9sZF9wb3N0aW5zdGFsbF9jbWRzIFwKLSAgICBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIGFyY2hpdmVfY21kcyBhcmNoaXZlX2V4cHN5bV9jbWRzIHBvc3RpbnN0YWxsX2NtZHMgcG9zdHVuaW5zdGFsbF9jbWRzIFwKLSAgICBmaWxlX21hZ2ljX2NtZCBleHBvcnRfc3ltYm9sc19jbWRzIGRlcGxpYnNfY2hlY2tfbWV0aG9kIGFsbG93X3VuZGVmaW5lZF9mbGFnIG5vX3VuZGVmaW5lZF9mbGFnIFwKLSAgICBmaW5pc2hfY21kcyBmaW5pc2hfZXZhbCBnbG9iYWxfc3ltYm9sX3BpcGUgZ2xvYmFsX3N5bWJvbF90b19jZGVjbCBcCi0gICAgaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlYyBoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yICBcCi0gICAgc3lzX2xpYl9zZWFyY2hfcGF0aF9zcGVjIHN5c19saWJfZGxzZWFyY2hfcGF0aF9zcGVjIFwKLSAgICBjb21waWxlcl9jX28gY29tcGlsZXJfb19sbyBuZWVkX2xvY2tzIGV4Y2x1ZGVfZXhwc3ltcyBpbmNsdWRlX2V4cHN5bXM7IGRvCi0KLSAgICBjYXNlICIkdmFyIiBpbgotICAgIHJlbG9hZF9jbWRzIHwgb2xkX2FyY2hpdmVfY21kcyB8IG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMgfCBcCi0gICAgb2xkX3Bvc3RpbnN0YWxsX2NtZHMgfCBvbGRfcG9zdHVuaW5zdGFsbF9jbWRzIHwgXAotICAgIGV4cG9ydF9zeW1ib2xzX2NtZHMgfCBhcmNoaXZlX2NtZHMgfCBhcmNoaXZlX2V4cHN5bV9jbWRzIHwgXAotICAgIHBvc3RpbnN0YWxsX2NtZHMgfCBwb3N0dW5pbnN0YWxsX2NtZHMgfCBcCi0gICAgZmluaXNoX2NtZHMgfCBzeXNfbGliX3NlYXJjaF9wYXRoX3NwZWMgfCBzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYykKLSAgICAgICMgRG91YmxlLXF1b3RlIGRvdWJsZS1ldmFsZWQgc3RyaW5ncy4KLSAgICAgIGV2YWwgIiR2YXI9XFxcIlxgXCRlY2hvIFwiWFwkJHZhclwiIHwgXCRYc2VkIC1lIFwiXCRkb3VibGVfcXVvdGVfc3Vic3RcIiAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCIgLWUgXCJcJGRlbGF5X3ZhcmlhYmxlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICIkdmFyPVxcXCJcYFwkZWNobyBcIlhcJCR2YXJcIiB8IFwkWHNlZCAtZSBcIlwkc2VkX3F1b3RlX3N1YnN0XCJcYFxcXCIiCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotCi0gIGNhc2UgIiRsdGVjaG8iIGluCi0gIConXCQwIC0tZmFsbGJhY2stZWNobyInKQotICAgIGx0ZWNobz1gJGVjaG8gIlgkbHRlY2hvIiB8ICRYc2VkIC1lICdzL1xcXFxcXFwkMCAtLWZhbGxiYWNrLWVjaG8iJC8kMCAtLWZhbGxiYWNrLWVjaG8iLydgCi0gICAgOzsKLSAgZXNhYwotCi0gIHRyYXAgIiRybSBcIiRvZmlsZVwiOyBleGl0IDEiIDEgMiAxNQotICBlY2hvICJjcmVhdGluZyAkb2ZpbGUiCi0gICRybSAiJG9maWxlIgotICBjYXQgPDxFT0YgPiAiJG9maWxlIgotIyEgJFNIRUxMCi0KLSMgYCRlY2hvICIkb2ZpbGUiIHwgc2VkICdzJV4uKi8lJSdgIC0gUHJvdmlkZSBnZW5lcmFsaXplZCBsaWJyYXJ5LWJ1aWxkaW5nIHN1cHBvcnQgc2VydmljZXMuCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5ICRQUk9HUkFNIChHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QKQotIyBOT1RFOiBDaGFuZ2VzIG1hZGUgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdDogbG9vayBhdCBsdGNvbmZpZyBvciBsdG1haW4uc2guCi0jCi0jIENvcHlyaWdodCAoQykgMTk5Ni0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBHb3Jkb24gTWF0emlna2VpdCA8Z29yZEBnbnUuYWkubWl0LmVkdT4sIDE5OTYKLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMKLSMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotIyBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0jIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSMKLSMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMKLSMgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGlmIHlvdQotIyBkaXN0cmlidXRlIHRoaXMgZmlsZSBhcyBwYXJ0IG9mIGEgcHJvZ3JhbSB0aGF0IGNvbnRhaW5zIGEKLSMgY29uZmlndXJhdGlvbiBzY3JpcHQgZ2VuZXJhdGVkIGJ5IEF1dG9jb25mLCB5b3UgbWF5IGluY2x1ZGUgaXQgdW5kZXIKLSMgdGhlIHNhbWUgZGlzdHJpYnV0aW9uIHRlcm1zIHRoYXQgeW91IHVzZSBmb3IgdGhlIHJlc3Qgb2YgdGhhdCBwcm9ncmFtLgotCi0jIFNlZCB0aGF0IGhlbHBzIHVzIGF2b2lkIGFjY2lkZW50YWxseSB0cmlnZ2VyaW5nIGVjaG8oMSkgb3B0aW9ucyBsaWtlIC1uLgotWHNlZD0ic2VkIC1lIHMvXlgvLyIKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgIlwke0NEUEFUSCtzZXR9IiA9IHNldDsgdGhlbiBDRFBBVEg9OyBleHBvcnQgQ0RQQVRIOyBmaQotCi0jIyMgQkVHSU4gTElCVE9PTCBDT05GSUcKLUVPRgotICBjZmdmaWxlPSIkb2ZpbGUiCi0gIDs7Ci0KLSopCi0gICMgRG91YmxlLXF1b3RlIHRoZSB2YXJpYWJsZXMgdGhhdCBuZWVkIGl0IChmb3IgYWVzdGhldGljcykuCi0gIGZvciB2YXIgaW4gb2xkX0NDIG9sZF9DRkxBR1Mgb2xkX0NQUEZMQUdTIG9sZF9MRCBvbGRfTk0gb2xkX1JBTkxJQiBcCi0gICAgb2xkX0xOX1Mgb2xkX0RMTFRPT0wgb2xkX0FTOyBkbwotICAgIGV2YWwgIiR2YXI9XFxcIlwkdmFyXFxcIiIKLSAgZG9uZQotCi0gICMgSnVzdCBjcmVhdGUgYSBjb25maWcgZmlsZS4KLSAgY2ZnZmlsZT0iJG9maWxlLmNmZyIKLSAgdHJhcCAiJHJtIFwiJGNmZ2ZpbGVcIjsgZXhpdCAxIiAxIDIgMTUKLSAgZWNobyAiY3JlYXRpbmcgJGNmZ2ZpbGUiCi0gICRybSAiJGNmZ2ZpbGUiCi0gIGNhdCA8PEVPRiA+ICIkY2ZnZmlsZSIKLSMgYCRlY2hvICIkY2ZnZmlsZSIgfCBzZWQgJ3MlXi4qLyUlJ2AgLSBMaWJ0b29sIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgJFBST0dSQU0gKEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVApCi1FT0YKLSAgOzsKLWVzYWMKLQotY2F0IDw8RU9GID4+ICIkY2ZnZmlsZSIKLSMgTGlidG9vbCB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLCBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgQ0M9JG9sZF9DQyBDRkxBR1M9JG9sZF9DRkxBR1MgQ1BQRkxBR1M9JG9sZF9DUFBGTEFHUyBcXAotIyBMRD0kb2xkX0xEIE5NPSRvbGRfTk0gUkFOTElCPSRvbGRfUkFOTElCIExOX1M9JG9sZF9MTl9TIFxcCi0jIERMTFRPT0w9IiRvbGRfRExMVE9PTCIgQVM9IiRvbGRfQVMiIFxcCi0jICAgJDAkbHRjb25maWdfYXJncwotIwotIyBDb21waWxlciBhbmQgb3RoZXIgdGVzdCBvdXRwdXQgcHJvZHVjZWQgYnkgJHByb2duYW1lLCB1c2VmdWwgZm9yCi0jIGRlYnVnZ2luZyAkcHJvZ25hbWUsIGlzIGluIC4vY29uZmlnLmxvZyBpZiBpdCBleGlzdHMuCi0KLSMgVGhlIHZlcnNpb24gb2YgJHByb2duYW1lIHRoYXQgZ2VuZXJhdGVkIHRoaXMgc2NyaXB0LgotTFRDT05GSUdfVkVSU0lPTj0kTFRDT05GSUdfVkVSU0lPTgotCi0jIFNoZWxsIHRvIHVzZSB3aGVuIGludm9raW5nIHNoZWxsIHNjcmlwdHMuCi1TSEVMTD0kTFRTSEVMTAotCi0jIFdoZXRoZXIgb3Igbm90IHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMuCi1idWlsZF9saWJ0b29sX2xpYnM9JGVuYWJsZV9zaGFyZWQKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBidWlsZCBzdGF0aWMgbGlicmFyaWVzLgotYnVpbGRfb2xkX2xpYnM9JGVuYWJsZV9zdGF0aWMKLQotIyBXaGV0aGVyIG9yIG5vdCB0byBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24uCi1mYXN0X2luc3RhbGw9JGVuYWJsZV9mYXN0X2luc3RhbGwKLQotIyBUaGUgaG9zdCBzeXN0ZW0uCi1ob3N0X2FsaWFzPSRob3N0X2FsaWFzCi1ob3N0PSRob3N0Ci0KLSMgQW4gZWNobyBwcm9ncmFtIHRoYXQgZG9lcyBub3QgaW50ZXJwcmV0IGJhY2tzbGFzaGVzLgotZWNobz0kbHRlY2hvCi0KLSMgVGhlIGFyY2hpdmVyLgotQVI9JEFSCi0KLSMgVGhlIGRlZmF1bHQgQyBjb21waWxlci4KLUNDPSRDQwotCi0jIFRoZSBsaW5rZXIgdXNlZCB0byBidWlsZCBsaWJyYXJpZXMuCi1MRD0kTEQKLQotIyBXaGV0aGVyIHdlIG5lZWQgaGFyZCBvciBzb2Z0IGxpbmtzLgotTE5fUz0kTE5fUwotCi0jIEEgQlNELWNvbXBhdGlibGUgbm0gcHJvZ3JhbS4KLU5NPSROTQotCi0jIFVzZWQgb24gY3lnd2luOiBETEwgY3JlYXRpb24gcHJvZ3JhbS4KLURMTFRPT0w9IiRETExUT09MIgotCi0jIFVzZWQgb24gY3lnd2luOiBhc3NlbWJsZXIuCi1BUz0iJEFTIgotCi0jIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBjb250YWlucyB0ZW1wb3JhcnkgbGlidG9vbCBmaWxlcy4KLW9iamRpcj0kb2JqZGlyCi0KLSMgSG93IHRvIGNyZWF0ZSByZWxvYWRhYmxlIG9iamVjdCBmaWxlcy4KLXJlbG9hZF9mbGFnPSRyZWxvYWRfZmxhZwotcmVsb2FkX2NtZHM9JHJlbG9hZF9jbWRzCi0KLSMgSG93IHRvIHBhc3MgYSBsaW5rZXIgZmxhZyB0aHJvdWdoIHRoZSBjb21waWxlci4KLXdsPSR3bAotCi0jIE9iamVjdCBmaWxlIHN1ZmZpeCAobm9ybWFsbHkgIm8iKS4KLW9iamV4dD0iJG9iamV4dCIKLQotIyBPbGQgYXJjaGl2ZSBzdWZmaXggKG5vcm1hbGx5ICJhIikuCi1saWJleHQ9IiRsaWJleHQiCi0KLSMgQWRkaXRpb25hbCBjb21waWxlciBmbGFncyBmb3IgYnVpbGRpbmcgbGlicmFyeSBvYmplY3RzLgotcGljX2ZsYWc9JHBpY19mbGFnCi0KLSMgRG9lcyBjb21waWxlciBzaW11bHRhbmVvdXNseSBzdXBwb3J0IC1jIGFuZCAtbyBvcHRpb25zCi1jb21waWxlcl9jX289JGNvbXBpbGVyX2NfbwotCi0jIENhbiB3ZSB3cml0ZSBkaXJlY3RseSB0byBhIC5sbyA/Ci1jb21waWxlcl9vX2xvPSRjb21waWxlcl9vX2xvCi0KLSMgTXVzdCB3ZSBsb2NrIGZpbGVzIHdoZW4gZG9pbmcgY29tcGlsYXRpb24gPwotbmVlZF9sb2Nrcz0kbmVlZF9sb2NrcwotCi0jIERvIHdlIG5lZWQgdGhlIGxpYiBwcmVmaXggZm9yIG1vZHVsZXM/Ci1uZWVkX2xpYl9wcmVmaXg9JG5lZWRfbGliX3ByZWZpeAotCi0jIERvIHdlIG5lZWQgYSB2ZXJzaW9uIGZvciBsaWJyYXJpZXM/Ci1uZWVkX3ZlcnNpb249JG5lZWRfdmVyc2lvbgotCi0jIFdoZXRoZXIgZGxvcGVuIGlzIHN1cHBvcnRlZC4KLWRsb3Blbj0kZW5hYmxlX2Rsb3BlbgotCi0jIFdoZXRoZXIgZGxvcGVuIG9mIHByb2dyYW1zIGlzIHN1cHBvcnRlZC4KLWRsb3Blbl9zZWxmPSRlbmFibGVfZGxvcGVuX3NlbGYKLQotIyBXaGV0aGVyIGRsb3BlbiBvZiBzdGF0aWNhbGx5IGxpbmtlZCBwcm9ncmFtcyBpcyBzdXBwb3J0ZWQuCi1kbG9wZW5fc2VsZl9zdGF0aWM9JGVuYWJsZV9kbG9wZW5fc2VsZl9zdGF0aWMKLQotIyBDb21waWxlciBmbGFnIHRvIHByZXZlbnQgZHluYW1pYyBsaW5raW5nLgotbGlua19zdGF0aWNfZmxhZz0kbGlua19zdGF0aWNfZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gdHVybiBvZmYgYnVpbHRpbiBmdW5jdGlvbnMuCi1ub19idWlsdGluX2ZsYWc9JG5vX2J1aWx0aW5fZmxhZwotCi0jIENvbXBpbGVyIGZsYWcgdG8gYWxsb3cgcmVmbGV4aXZlIGRsb3BlbnMuCi1leHBvcnRfZHluYW1pY19mbGFnX3NwZWM9JGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgc2hhcmVkIG9iamVjdHMgZGlyZWN0bHkgZnJvbSBhcmNoaXZlcy4KLXdob2xlX2FyY2hpdmVfZmxhZ19zcGVjPSR3aG9sZV9hcmNoaXZlX2ZsYWdfc3BlYwotCi0jIENvbXBpbGVyIGZsYWcgdG8gZ2VuZXJhdGUgdGhyZWFkLXNhZmUgb2JqZWN0cy4KLXRocmVhZF9zYWZlX2ZsYWdfc3BlYz0kdGhyZWFkX3NhZmVfZmxhZ19zcGVjCi0KLSMgTGlicmFyeSB2ZXJzaW9uaW5nIHR5cGUuCi12ZXJzaW9uX3R5cGU9JHZlcnNpb25fdHlwZQotCi0jIEZvcm1hdCBvZiBsaWJyYXJ5IG5hbWUgcHJlZml4LgotbGlibmFtZV9zcGVjPSRsaWJuYW1lX3NwZWMKLQotIyBMaXN0IG9mIGFyY2hpdmUgbmFtZXMuICBGaXJzdCBuYW1lIGlzIHRoZSByZWFsIG9uZSwgdGhlIHJlc3QgYXJlIGxpbmtzLgotIyBUaGUgbGFzdCBuYW1lIGlzIHRoZSBvbmUgdGhhdCB0aGUgbGlua2VyIGZpbmRzIHdpdGggLWxOQU1FLgotbGlicmFyeV9uYW1lc19zcGVjPSRsaWJyYXJ5X25hbWVzX3NwZWMKLQotIyBUaGUgY29kZWQgbmFtZSBvZiB0aGUgbGlicmFyeSwgaWYgZGlmZmVyZW50IGZyb20gdGhlIHJlYWwgbmFtZS4KLXNvbmFtZV9zcGVjPSRzb25hbWVfc3BlYwotCi0jIENvbW1hbmRzIHVzZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgYW4gb2xkLXN0eWxlIGFyY2hpdmUuCi1SQU5MSUI9JFJBTkxJQgotb2xkX2FyY2hpdmVfY21kcz0kb2xkX2FyY2hpdmVfY21kcwotb2xkX3Bvc3RpbnN0YWxsX2NtZHM9JG9sZF9wb3N0aW5zdGFsbF9jbWRzCi1vbGRfcG9zdHVuaW5zdGFsbF9jbWRzPSRvbGRfcG9zdHVuaW5zdGFsbF9jbWRzCi0KLSMgQ3JlYXRlIGFuIG9sZC1zdHlsZSBhcmNoaXZlIGZyb20gYSBzaGFyZWQgYXJjaGl2ZS4KLW9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHM9JG9sZF9hcmNoaXZlX2Zyb21fbmV3X2NtZHMKLQotIyBDb21tYW5kcyB1c2VkIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGEgc2hhcmVkIGFyY2hpdmUuCi1hcmNoaXZlX2NtZHM9JGFyY2hpdmVfY21kcwotYXJjaGl2ZV9leHBzeW1fY21kcz0kYXJjaGl2ZV9leHBzeW1fY21kcwotcG9zdGluc3RhbGxfY21kcz0kcG9zdGluc3RhbGxfY21kcwotcG9zdHVuaW5zdGFsbF9jbWRzPSRwb3N0dW5pbnN0YWxsX2NtZHMKLQotIyBNZXRob2QgdG8gY2hlY2sgd2hldGhlciBkZXBlbmRlbnQgbGlicmFyaWVzIGFyZSBzaGFyZWQgb2JqZWN0cy4KLWRlcGxpYnNfY2hlY2tfbWV0aG9kPSRkZXBsaWJzX2NoZWNrX21ldGhvZAotCi0jIENvbW1hbmQgdG8gdXNlIHdoZW4gZGVwbGlic19jaGVja19tZXRob2QgPT0gZmlsZV9tYWdpYwotZmlsZV9tYWdpY19jbWQ9JGZpbGVfbWFnaWNfY21kCi0KLSMgRmxhZyB0aGF0IGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHdpdGggdW5kZWZpbmVkIHN5bWJvbHMgdG8gYmUgYnVpbHQuCi1hbGxvd191bmRlZmluZWRfZmxhZz0kYWxsb3dfdW5kZWZpbmVkX2ZsYWcKLQotIyBGbGFnIHRoYXQgZm9yY2VzIG5vIHVuZGVmaW5lZCBzeW1ib2xzLgotbm9fdW5kZWZpbmVkX2ZsYWc9JG5vX3VuZGVmaW5lZF9mbGFnCi0KLSMgQ29tbWFuZHMgdXNlZCB0byBmaW5pc2ggYSBsaWJ0b29sIGxpYnJhcnkgaW5zdGFsbGF0aW9uIGluIGEgZGlyZWN0b3J5LgotZmluaXNoX2NtZHM9JGZpbmlzaF9jbWRzCi0KLSMgU2FtZSBhcyBhYm92ZSwgYnV0IGEgc2luZ2xlIHNjcmlwdCBmcmFnbWVudCB0byBiZSBldmFsZWQgYnV0IG5vdCBzaG93bi4KLWZpbmlzaF9ldmFsPSRmaW5pc2hfZXZhbAotCi0jIFRha2UgdGhlIG91dHB1dCBvZiBubSBhbmQgcHJvZHVjZSBhIGxpc3Rpbmcgb2YgcmF3IHN5bWJvbHMgYW5kIEMgbmFtZXMuCi1nbG9iYWxfc3ltYm9sX3BpcGU9JGdsb2JhbF9zeW1ib2xfcGlwZQotCi0jIFRyYW5zZm9ybSB0aGUgb3V0cHV0IG9mIG5tIGluIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWdsb2JhbF9zeW1ib2xfdG9fY2RlY2w9JGdsb2JhbF9zeW1ib2xfdG9fY2RlY2wKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBydW50aW1lIHBhdGggdmFyaWFibGUuCi1ydW5wYXRoX3Zhcj0kcnVucGF0aF92YXIKLQotIyBUaGlzIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBwYXRoIHZhcmlhYmxlLgotc2hsaWJwYXRoX3Zhcj0kc2hsaWJwYXRoX3ZhcgotCi0jIElzIHNobGlicGF0aCBzZWFyY2hlZCBiZWZvcmUgdGhlIGhhcmQtY29kZWQgbGlicmFyeSBzZWFyY2ggcGF0aD8KLXNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aD0kc2hsaWJwYXRoX292ZXJyaWRlc19ydW5wYXRoCi0KLSMgSG93IHRvIGhhcmRjb2RlIGEgc2hhcmVkIGxpYnJhcnkgcGF0aCBpbnRvIGFuIGV4ZWN1dGFibGUuCi1oYXJkY29kZV9hY3Rpb249JGhhcmRjb2RlX2FjdGlvbgotCi0jIEZsYWcgdG8gaGFyZGNvZGUgXCRsaWJkaXIgaW50byBhIGJpbmFyeSBkdXJpbmcgbGlua2luZy4KLSMgVGhpcyBtdXN0IHdvcmsgZXZlbiBpZiBcJGxpYmRpciBkb2VzIG5vdCBleGlzdC4KLWhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWM9JGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMKLQotIyBXaGV0aGVyIHdlIG5lZWQgYSBzaW5nbGUgLXJwYXRoIGZsYWcgd2l0aCBhIHNlcGFyYXRlZCBhcmd1bWVudC4KLWhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3I9JGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IKLQotIyBTZXQgdG8geWVzIGlmIHVzaW5nIERJUi9saWJOQU1FLnNvIGR1cmluZyBsaW5raW5nIGhhcmRjb2RlcyBESVIgaW50byB0aGUKLSMgcmVzdWx0aW5nIGJpbmFyeS4KLWhhcmRjb2RlX2RpcmVjdD0kaGFyZGNvZGVfZGlyZWN0Ci0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyB0aGUgLUxESVIgZmxhZyBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8gdGhlCi0jIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9taW51c19MPSRoYXJkY29kZV9taW51c19MCi0KLSMgU2V0IHRvIHllcyBpZiB1c2luZyBTSExJQlBBVEhfVkFSPURJUiBkdXJpbmcgbGlua2luZyBoYXJkY29kZXMgRElSIGludG8KLSMgdGhlIHJlc3VsdGluZyBiaW5hcnkuCi1oYXJkY29kZV9zaGxpYnBhdGhfdmFyPSRoYXJkY29kZV9zaGxpYnBhdGhfdmFyCi0KLSMgQ29tcGlsZS10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX3NlYXJjaF9wYXRoX3NwZWM9JHN5c19saWJfc2VhcmNoX3BhdGhfc3BlYwotCi0jIFJ1bi10aW1lIHN5c3RlbSBzZWFyY2ggcGF0aCBmb3IgbGlicmFyaWVzCi1zeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlYz0kc3lzX2xpYl9kbHNlYXJjaF9wYXRoX3NwZWMKLQotIyBGaXggdGhlIHNoZWxsIHZhcmlhYmxlIFwkc3JjZmlsZSBmb3IgdGhlIGNvbXBpbGVyLgotZml4X3NyY2ZpbGVfcGF0aD0iJGZpeF9zcmNmaWxlX3BhdGgiCi0KLSMgU2V0IHRvIHllcyBpZiBleHBvcnRlZCBzeW1ib2xzIGFyZSByZXF1aXJlZAotYWx3YXlzX2V4cG9ydF9zeW1ib2xzPSRhbHdheXNfZXhwb3J0X3N5bWJvbHMKLQotIyBUaGUgY29tbWFuZCB0byBleHRyYWN0IGV4cG9ydGVkIHN5bWJvbHMKLWV4cG9ydF9zeW1ib2xzX2NtZHM9JGV4cG9ydF9zeW1ib2xzX2NtZHMKLQotIyBTeW1ib2xzIHRoYXQgc2hvdWxkIG5vdCBiZSBsaXN0ZWQgaW4gdGhlIHByZWxvYWRlZCBzeW1ib2xzCi1leGNsdWRlX2V4cHN5bXM9JGV4Y2x1ZGVfZXhwc3ltcwotCi0jIFN5bWJvbHMgdGhhdCBtdXN0IGFsd2F5cyBiZSBleHBvcnRlZAotaW5jbHVkZV9leHBzeW1zPSRpbmNsdWRlX2V4cHN5bXMKLQotRU9GCi0KLWNhc2UgIiRsdG1haW4iIGluCi0qLnNoKQotICBlY2hvICcjIyMgRU5EIExJQlRPT0wgQ09ORklHJyA+PiAiJG9maWxlIgotICBlY2hvID4+ICIkb2ZpbGUiCi0gIGNhc2UgIiRob3N0X29zIiBpbgotICBhaXgzKikKLSAgICBjYXQgPDxcRU9GID4+ICIkb2ZpbGUiCi0KLSMgQUlYIHNvbWV0aW1lcyBoYXMgcHJvYmxlbXMgd2l0aCB0aGUgR0NDIGNvbGxlY3QyIHByb2dyYW0uICBGb3Igc29tZQotIyByZWFzb24sIGlmIHdlIHNldCB0aGUgQ09MTEVDVF9OQU1FUyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdGhlIHByb2JsZW1zCi0jIHZhbmlzaCBpbiBhIHB1ZmYgb2Ygc21va2UuCi1pZiB0ZXN0ICIke0NPTExFQ1RfTkFNRVMrc2V0fSIgIT0gc2V0OyB0aGVuCi0gIENPTExFQ1RfTkFNRVM9Ci0gIGV4cG9ydCBDT0xMRUNUX05BTUVTCi1maQotRU9GCi0gICAgOzsKLSAgZXNhYwotCi0gICMgQXBwZW5kIHRoZSBsdG1haW4uc2ggc2NyaXB0LgotICBjYXQgIiRsdG1haW4iID4+ICIkb2ZpbGUiIHx8IChybSAtZiAiJG9maWxlIjsgZXhpdCAxKQotCi0gIGNobW9kICt4ICIkb2ZpbGUiCi0gIDs7Ci0KLSopCi0gICMgQ29tcGlsZSB0aGUgbGlidG9vbCBwcm9ncmFtLgotICBlY2hvICJGSVhNRTogd291bGQgY29tcGlsZSAkbHRtYWluIgotICA7OwotZXNhYwotCi10ZXN0IC1uICIkY2FjaGVfZmlsZSIgfHwgZXhpdCAwCi0KLSMgQUNfQ0FDSEVfU0FWRQotdHJhcCAnJyAxIDIgMTUKLWNhdCA+IGNvbmZjYWNoZSA8PFxFT0YKLSMgVGhpcyBmaWxlIGlzIGEgc2hlbGwgc2NyaXB0IHRoYXQgY2FjaGVzIHRoZSByZXN1bHRzIG9mIGNvbmZpZ3VyZQotIyB0ZXN0cyBydW4gb24gdGhpcyBzeXN0ZW0gc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gY29uZmlndXJlCi0jIHNjcmlwdHMgYW5kIGNvbmZpZ3VyZSBydW5zLiAgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLgotIyBJZiBpdCBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdSBtYXkgcmVtb3ZlIG9yIGVkaXQgaXQuCi0jCi0jIEJ5IGRlZmF1bHQsIGNvbmZpZ3VyZSB1c2VzIC4vY29uZmlnLmNhY2hlIGFzIHRoZSBjYWNoZSBmaWxlLAotIyBjcmVhdGluZyBpdCBpZiBpdCBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgWW91IGNhbiBnaXZlIGNvbmZpZ3VyZQotIyB0aGUgLS1jYWNoZS1maWxlPUZJTEUgb3B0aW9uIHRvIHVzZSBhIGRpZmZlcmVudCBjYWNoZSBmaWxlOyB0aGF0IGlzCi0jIHdoYXQgY29uZmlndXJlIGRvZXMgd2hlbiBpdCBjYWxscyBjb25maWd1cmUgc2NyaXB0cyBpbgotIyBzdWJkaXJlY3Rvcmllcywgc28gdGhleSBzaGFyZSB0aGUgY2FjaGUuCi0jIEdpdmluZyAtLWNhY2hlLWZpbGU9L2Rldi9udWxsIGRpc2FibGVzIGNhY2hpbmcsIGZvciBkZWJ1Z2dpbmcgY29uZmlndXJlLgotIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQgdGhlCi0jIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgotIwotRU9GCi0jIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAotIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KLSMgU28sIGRvbid0IHB1dCBuZXdsaW5lcyBpbiBjYWNoZSB2YXJpYWJsZXMnIHZhbHVlcy4KLSMgVWx0cml4IHNoIHNldCB3cml0ZXMgdG8gc3RkZXJyIGFuZCBjYW4ndCBiZSByZWRpcmVjdGVkIGRpcmVjdGx5LAotIyBhbmQgc2V0cyB0aGUgaGlnaCBiaXQgaW4gdGhlIGNhY2hlIGZpbGUgdW5sZXNzIHdlIGFzc2lnbiB0byB0aGUgdmFycy4KLShzZXQpIDI+JjEgfAotICBjYXNlIGAoYWNfc3BhY2U9JyAnOyBzZXQgfCBncmVwIGFjX3NwYWNlKSAyPiYxYCBpbgotICAqYWNfc3BhY2U9XCAqKQotICAgICMgYHNldCcgZG9lcyBub3QgcXVvdGUgY29ycmVjdGx5LCBzbyBhZGQgcXVvdGVzIChkb3VibGUtcXVvdGUgc3Vic3RpdHV0aW9uCi0gICAgIyB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcKS4KLSAgICBzZWQgLW4gXAotICAgICAgLWUgInMvJy8nXFxcXCcnL2ciIFwKLSAgICAgIC1lICJzL15cXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcXCk9XFwoLipcXCkvXFwxPVwke1xcMT0nXFwyJ30vcCIKLSAgICA7OwotICAqKQotICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCi0gICAgc2VkIC1uIC1lICdzL15cKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlwpPVwoLipcKS9cMT0ke1wxPVwyfS9wJwotICAgIDs7Ci0gIGVzYWMgPj4gY29uZmNhY2hlCi1pZiBjbXAgLXMgJGNhY2hlX2ZpbGUgY29uZmNhY2hlOyB0aGVuCi0gIDoKLWVsc2UKLSAgaWYgdGVzdCAtdyAkY2FjaGVfZmlsZTsgdGhlbgotICAgIGVjaG8gInVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAgIGNhdCBjb25mY2FjaGUgPiAkY2FjaGVfZmlsZQotICBlbHNlCi0gICAgZWNobyAibm90IHVwZGF0aW5nIHVud3JpdGFibGUgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIGZpCi1maQotcm0gLWYgY29uZmNhY2hlCi0KLWV4aXQgMAotCi0jIExvY2FsIFZhcmlhYmxlczoKLSMgbW9kZTpzaGVsbC1zY3JpcHQKLSMgc2gtaW5kZW50YXRpb246MgotIyBFbmQ6CmRpZmYgLS1naXQgYS9sdG1haW4uc2ggYi9sdG1haW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODc4N2EuLjAwMDAwMDAKLS0tIGEvbHRtYWluLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzc4MiArMCwwIEBACi0jIGx0bWFpbi5zaCAtIFByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotIyBOT1RFOiBDaGFuZ2luZyB0aGlzIGZpbGUgd2lsbCBub3QgYWZmZWN0IGFueXRoaW5nIHVudGlsIHlvdSByZXJ1biBsdGNvbmZpZy4KLSMKLSMgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEdvcmRvbiBNYXR6aWdrZWl0IDxnb3JkQGdudS5haS5taXQuZWR1PiwgMTk5NgotIwotIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotIwotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0jIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIwotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotIwotIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91Ci0jIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQotIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgotIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCi0KLSMgQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyAkZWNoby4KLWlmIHRlc3QgIlgkMSIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgIyBEaXNjYXJkIHRoZSAtLW5vLXJlZXhlYyBmbGFnLCBhbmQgY29udGludWUuCi0gIHNoaWZ0Ci1lbGlmIHRlc3QgIlgkMSIgPSBYLS1mYWxsYmFjay1lY2hvOyB0aGVuCi0gICMgdXNlZCBhcyBmYWxsYmFjayBlY2hvCi0gIHNoaWZ0Ci0gIGNhdCA8PEVPRgotJCoKLUVPRgotICBleGl0IDAKLWVsaWYgdGVzdCAiWGAoJGVjaG8gJ1x0JykgMj4vZGV2L251bGxgIiA9ICdYXHQnOyB0aGVuCi0gICMgWWlwcGVlLCAkZWNobyB3b3JrcyEKLSAgOgotZWxzZQotICAjIFJlc3RhcnQgdW5kZXIgdGhlIGNvcnJlY3Qgc2hlbGwsIGFuZCB0aGVuIG1heWJlICRlY2hvIHdpbGwgd29yay4KLSAgZXhlYyAkU0hFTEwgIiQwIiAtLW5vLXJlZXhlYyAkezErIiRAIn0KLWZpCi0KLSMgVGhlIG5hbWUgb2YgdGhpcyBwcm9ncmFtLgotcHJvZ25hbWU9YCRlY2hvICIkMCIgfCBzZWQgJ3MlXi4qLyUlJ2AKLW1vZGVuYW1lPSIkcHJvZ25hbWUiCi0KLSMgQ29uc3RhbnRzLgotUFJPR1JBTT1sdG1haW4uc2gKLVBBQ0tBR0U9bGlidG9vbAotVkVSU0lPTj0xLjJmCi1USU1FU1RBTVA9IiAoMS4zMyAxOTk5LzA0LzI2IDE2OjI4OjUzKSIKLQotZGVmYXVsdF9tb2RlPQotaGVscD0iVHJ5IFxgJHByb2duYW1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgotbWFnaWM9IiUlJU1BR0lDIHZhcmlhYmxlJSUlIgotbWtkaXI9Im1rZGlyIgotbXY9Im12IC1mIgotcm09InJtIC1mIgotCi0jIFNlZCBzdWJzdGl0dXRpb24gdGhhdCBoZWxwcyB1cyBkbyByb2J1c3QgcXVvdGluZy4gIEl0IGJhY2tzbGFzaGlmaWVzCi0jIG1ldGFjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIGFjdGl2ZSB3aXRoaW4gZG91YmxlLXF1b3RlZCBzdHJpbmdzLgotWHNlZD0nc2VkIC1lIDFzL15YLy8nCi1zZWRfcXVvdGVfc3Vic3Q9J3MvXChbXFxgXFwiJFxcXFxdXCkvXFxcMS9nJwotU1AyTkw9J3RyIFwwNDAgXDAxMicKLU5MMlNQPSd0ciBcMDEyIFwwNDAnCi0KLSMgTkxTIG51aXNhbmNlcy4KLSMgT25seSBzZXQgTEFORyBhbmQgTENfQUxMIHRvIEMgaWYgYWxyZWFkeSBzZXQuCi0jIFRoZXNlIG11c3Qgbm90IGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgYmVjYXVzZSBub3QgYWxsIHN5c3RlbXMgdW5kZXJzdGFuZAotIyBlLmcuIExBTkc9QyAobm90YWJseSBTQ08pLgotIyBXZSBzYXZlIHRoZSBvbGQgdmFsdWVzIHRvIHJlc3RvcmUgZHVyaW5nIGV4ZWN1dGUgbW9kZS4KLWlmIHRlc3QgIiR7TENfQUxMK3NldH0iID0gc2V0OyB0aGVuCi0gIHNhdmVfTENfQUxMPSIkTENfQUxMIjsgTENfQUxMPUM7IGV4cG9ydCBMQ19BTEwKLWZpCi1pZiB0ZXN0ICIke0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgc2F2ZV9MQU5HPSIkTEFORyI7IExBTkc9QzsgZXhwb3J0IExBTkcKLWZpCi0KLWlmIHRlc3QgIiRMVENPTkZJR19WRVJTSU9OIiAhPSAiJFZFUlNJT04iOyB0aGVuCi0gIGVjaG8gIiRtb2RlbmFtZTogbHRjb25maWcgdmVyc2lvbiBcYCRMVENPTkZJR19WRVJTSU9OJyBkb2VzIG5vdCBtYXRjaCAkUFJPR1JBTSB2ZXJzaW9uIFxgJFZFUlNJT04nIiAxPiYyCi0gIGVjaG8gIkZhdGFsIGNvbmZpZ3VyYXRpb24gZXJyb3IuICBTZWUgdGhlICRQQUNLQUdFIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiAxPiYyCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzICYmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgIT0geWVzOyB0aGVuCi0gIGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gYnVpbGQgYW55IGtpbmQgb2YgbGlicmFyeSIgMT4mMgotICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotICBleGl0IDEKLWZpCi0KLSMgR2xvYmFsIHZhcmlhYmxlcy4KLW1vZGU9JGRlZmF1bHRfbW9kZQotbm9ub3B0PQotcHJldj0KLXByZXZvcHQ9Ci1ydW49Ci1zaG93PSIkZWNobyIKLXNob3dfaGVscD0KLWV4ZWN1dGVfZGxmaWxlcz0KLWxvMm89InMvXFwubG9cJC8uJHtvYmpleHR9LyIKLQotIyBQYXJzZSBvdXIgY29tbWFuZCBsaW5lIG9wdGlvbnMgb25jZSwgdGhvcm91Z2hseS4KLXdoaWxlIHRlc3QgJCMgLWd0IDAKLWRvCi0gIGFyZz0iJDEiCi0gIHNoaWZ0Ci0KLSAgY2FzZSAiJGFyZyIgaW4KLSAgLSo9Kikgb3B0YXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvWy1fYS16QS1aMC05XSo9Ly8nYCA7OwotICAqKSBvcHRhcmc9IDs7Ci0gIGVzYWMKLQotICAjIElmIHRoZSBwcmV2aW91cyBvcHRpb24gbmVlZHMgYW4gYXJndW1lbnQsIGFzc2lnbiBpdC4KLSAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgY2FzZSAiJHByZXYiIGluCi0gICAgZXhlY3V0ZV9kbGZpbGVzKQotICAgICAgZXZhbCAiJHByZXY9XCJcJCRwcmV2IFwkYXJnXCIiCi0gICAgICA7OwotICAgICopCi0gICAgICBldmFsICIkcHJldj1cJGFyZyIKLSAgICAgIDs7Ci0gICAgZXNhYwotCi0gICAgcHJldj0KLSAgICBwcmV2b3B0PQotICAgIGNvbnRpbnVlCi0gIGZpCi0KLSAgIyBIYXZlIHdlIHNlZW4gYSBub24tb3B0aW9uYWwgYXJndW1lbnQgeWV0PwotICBjYXNlICIkYXJnIiBpbgotICAtLWhlbHApCi0gICAgc2hvd19oZWxwPXllcwotICAgIDs7Ci0KLSAgLS12ZXJzaW9uKQotICAgIGVjaG8gIiRQUk9HUkFNIChHTlUgJFBBQ0tBR0UpICRWRVJTSU9OJFRJTUVTVEFNUCIKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tY29uZmlnKQotICAgIHNlZCAtZSAnMSwvXiMjIyBCRUdJTiBMSUJUT09MIENPTkZJRy9kJyAtZSAnL14jIyMgRU5EIExJQlRPT0wgQ09ORklHLywkZCcgJDAKLSAgICBleGl0IDAKLSAgICA7OwotCi0gIC0tZGVidWcpCi0gICAgZWNobyAiJHByb2duYW1lOiBlbmFibGluZyBzaGVsbCB0cmFjZSBtb2RlIgotICAgIHNldCAteAotICAgIDs7Ci0KLSAgLS1kcnktcnVuIHwgLW4pCi0gICAgcnVuPToKLSAgICA7OwotCi0gIC0tZmVhdHVyZXMpCi0gICAgZWNobyAiaG9zdDogJGhvc3QiCi0gICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGVjaG8gImVuYWJsZSBzaGFyZWQgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgIGVjaG8gImRpc2FibGUgc2hhcmVkIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGlmIHRlc3QgIiRidWlsZF9vbGRfbGlicyIgPSB5ZXM7IHRoZW4KLSAgICAgIGVjaG8gImVuYWJsZSBzdGF0aWMgbGlicmFyaWVzIgotICAgIGVsc2UKLSAgICAgIGVjaG8gImRpc2FibGUgc3RhdGljIGxpYnJhcmllcyIKLSAgICBmaQotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgLS1maW5pc2gpIG1vZGU9ImZpbmlzaCIgOzsKLQotICAtLW1vZGUpIHByZXZvcHQ9Ii0tbW9kZSIgcHJldj1tb2RlIDs7Ci0gIC0tbW9kZT0qKSBtb2RlPSIkb3B0YXJnIiA7OwotCi0gIC0tcXVpZXQgfCAtLXNpbGVudCkKLSAgICBzaG93PToKLSAgICA7OwotCi0gIC1kbG9wZW4pCi0gICAgcHJldm9wdD0iLWRsb3BlbiIKLSAgICBwcmV2PWV4ZWN1dGVfZGxmaWxlcwotICAgIDs7Ci0KLSAgLSopCi0gICAgJGVjaG8gIiRtb2RlbmFtZTogdW5yZWNvZ25pemVkIG9wdGlvbiBcYCRhcmcnIiAxPiYyCi0gICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgZXhpdCAxCi0gICAgOzsKLQotICAqKQotICAgIG5vbm9wdD0iJGFyZyIKLSAgICBicmVhawotICAgIDs7Ci0gIGVzYWMKLWRvbmUKLQotaWYgdGVzdCAtbiAiJHByZXZvcHQiOyB0aGVuCi0gICRlY2hvICIkbW9kZW5hbWU6IG9wdGlvbiBcYCRwcmV2b3B0JyByZXF1aXJlcyBhbiBhcmd1bWVudCIgMT4mMgotICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgZXhpdCAxCi1maQotCi1pZiB0ZXN0IC16ICIkc2hvd19oZWxwIjsgdGhlbgotCi0gICMgSW5mZXIgdGhlIG9wZXJhdGlvbiBtb2RlLgotICBpZiB0ZXN0IC16ICIkbW9kZSI7IHRoZW4KLSAgICBjYXNlICIkbm9ub3B0IiBpbgotICAgICpjYyB8ICorKyB8IGdjYyogfCAqLWdjYyopCi0gICAgICBtb2RlPWxpbmsKLSAgICAgIGZvciBhcmcKLSAgICAgIGRvCi0JY2FzZSAiJGFyZyIgaW4KLQktYykKLQkgICBtb2RlPWNvbXBpbGUKLQkgICBicmVhawotCSAgIDs7Ci0JZXNhYwotICAgICAgZG9uZQotICAgICAgOzsKLSAgICAqZGIgfCAqZGJ4IHwgKnN0cmFjZSB8ICp0cnVzcykKLSAgICAgIG1vZGU9ZXhlY3V0ZQotICAgICAgOzsKLSAgICAqaW5zdGFsbCp8Y3B8bXYpCi0gICAgICBtb2RlPWluc3RhbGwKLSAgICAgIDs7Ci0gICAgKnJtKQotICAgICAgbW9kZT11bmluc3RhbGwKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgICMgSWYgd2UgaGF2ZSBubyBtb2RlLCBidXQgZGxmaWxlcyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBkbyBleGVjdXRlIG1vZGUuCi0gICAgICB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiBtb2RlPWV4ZWN1dGUKLQotICAgICAgIyBKdXN0IHVzZSB0aGUgZGVmYXVsdCBvcGVyYXRpb24gbW9kZS4KLSAgICAgIGlmIHRlc3QgLXogIiRtb2RlIjsgdGhlbgotCWlmIHRlc3QgLW4gIiRub25vcHQiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgaW5mZXIgb3BlcmF0aW9uIG1vZGUgZnJvbSBcYCRub25vcHQnIiAxPiYyCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogY2Fubm90IGluZmVyIG9wZXJhdGlvbiBtb2RlIHdpdGhvdXQgTU9ERS1BUkdTIiAxPiYyCi0JZmkKLSAgICAgIGZpCi0gICAgICA7OwotICAgIGVzYWMKLSAgZmkKLQotICAjIE9ubHkgZXhlY3V0ZSBtb2RlIGlzIGFsbG93ZWQgdG8gaGF2ZSAtZGxvcGVuIGZsYWdzLgotICBpZiB0ZXN0IC1uICIkZXhlY3V0ZV9kbGZpbGVzIiAmJiB0ZXN0ICIkbW9kZSIgIT0gZXhlY3V0ZTsgdGhlbgotICAgICRlY2hvICIkbW9kZW5hbWU6IHVucmVjb2duaXplZCBvcHRpb24gXGAtZGxvcGVuJyIgMT4mMgotICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotCi0gICMgQ2hhbmdlIHRoZSBoZWxwIG1lc3NhZ2UgdG8gYSBtb2RlLXNwZWNpZmljIG9uZS4KLSAgZ2VuZXJpY19oZWxwPSIkaGVscCIKLSAgaGVscD0iVHJ5IFxgJG1vZGVuYW1lIC0taGVscCAtLW1vZGU9JG1vZGUnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKLQotICAjIFRoZXNlIG1vZGVzIGFyZSBpbiBvcmRlciBvZiBleGVjdXRpb24gZnJlcXVlbmN5IHNvIHRoYXQgdGhleSBydW4gcXVpY2tseS4KLSAgY2FzZSAiJG1vZGUiIGluCi0gICMgbGlidG9vbCBjb21waWxlIG1vZGUKLSAgY29tcGlsZSkKLSAgICBtb2RlbmFtZT0iJG1vZGVuYW1lOiBjb21waWxlIgotICAgICMgR2V0IHRoZSBjb21waWxhdGlvbiBjb21tYW5kIGFuZCB0aGUgc291cmNlIGZpbGUuCi0gICAgYmFzZV9jb21waWxlPQotICAgIGxhc3Rhcmc9Ci0gICAgc3JjZmlsZT0iJG5vbm9wdCIKLSAgICBzdXBwcmVzc19vdXRwdXQ9Ci0KLSAgICB1c2VyX3RhcmdldD1ubwotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgIyBBY2NlcHQgYW55IGNvbW1hbmQtbGluZSBvcHRpb25zLgotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1vKQotCWlmIHRlc3QgIiR1c2VyX3RhcmdldCIgIT0gIm5vIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogeW91IGNhbm5vdCBzcGVjaWZ5IFxgLW8nIG1vcmUgdGhhbiBvbmNlIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCXVzZXJfdGFyZ2V0PW5leHQKLQk7OwotCi0gICAgICAtc3RhdGljKQotCWJ1aWxkX29sZF9saWJzPXllcwotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgY2FzZSAiJHVzZXJfdGFyZ2V0IiBpbgotICAgICAgbmV4dCkKLQkjIFRoZSBuZXh0IG9uZSBpcyB0aGUgLW8gdGFyZ2V0IG5hbWUKLQl1c2VyX3RhcmdldD15ZXMKLQljb250aW51ZQotCTs7Ci0gICAgICB5ZXMpCi0JIyBXZSBnb3QgdGhlIG91dHB1dCBmaWxlCi0JdXNlcl90YXJnZXQ9c2V0Ci0JbGlib2JqPSIkYXJnIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBY2NlcHQgdGhlIGN1cnJlbnQgYXJndW1lbnQgYXMgdGhlIHNvdXJjZSBmaWxlLgotICAgICAgbGFzdGFyZz0iJHNyY2ZpbGUiCi0gICAgICBzcmNmaWxlPSIkYXJnIgotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIHByZXZpb3VzIGFyZ3VtZW50LgotCi0gICAgICAjIEJhY2tzbGFzaGlmeSBhbnkgYmFja3NsYXNoZXMsIGRvdWJsZSBxdW90ZXMsIGFuZCBkb2xsYXIgc2lnbnMuCi0gICAgICAjIFRoZXNlIGFyZSB0aGUgb25seSBjaGFyYWN0ZXJzIHRoYXQgYXJlIHN0aWxsIHNwZWNpYWxseQotICAgICAgIyBpbnRlcnByZXRlZCBpbnNpZGUgb2YgZG91YmxlLXF1b3RlZCBzY3JpbmdzLgotICAgICAgbGFzdGFyZz1gJGVjaG8gIlgkbGFzdGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0KLSAgICAgICMgRG91YmxlLXF1b3RlIGFyZ3MgY29udGFpbmluZyBvdGhlciBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLSAgICAgICMgTWFueSBCb3VybmUgc2hlbGxzIGNhbm5vdCBoYW5kbGUgY2xvc2UgYnJhY2tldHMgY29ycmVjdGx5IGluIHNjYW4KLSAgICAgICMgc2V0cywgc28gd2Ugc3BlY2lmeSBpdCBzZXBhcmF0ZWx5LgotICAgICAgY2FzZSAiJGxhc3RhcmciIGluCi0gICAgICAqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQlsYXN0YXJnPSJcIiRsYXN0YXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLQotICAgICAgIyBBZGQgdGhlIHByZXZpb3VzIGFyZ3VtZW50IHRvIGJhc2VfY29tcGlsZS4KLSAgICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0JYmFzZV9jb21waWxlPSIkbGFzdGFyZyIKLSAgICAgIGVsc2UKLQliYXNlX2NvbXBpbGU9IiRiYXNlX2NvbXBpbGUgJGxhc3RhcmciCi0gICAgICBmaQotICAgIGRvbmUKLQotICAgIGNhc2UgIiR1c2VyX3RhcmdldCIgaW4KLSAgICBzZXQpCi0gICAgICA7OwotICAgIG5vKQotICAgICAgIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgb2JqZWN0LgotICAgICAgbGlib2JqPWAkZWNobyAiWCRzcmNmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0gICAgICA7OwotICAgICopCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgdGFyZ2V0IHdpdGggXGAtbyciIDE+JjIKLSAgICAgIGV4aXQgMQotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFJlY29nbml6ZSBzZXZlcmFsIGRpZmZlcmVudCBmaWxlIHN1ZmZpeGVzLgotICAgICMgSWYgdGhlIHVzZXIgc3BlY2lmaWVzIC1vIGZpbGUubywgaXQgaXMgcmVwbGFjZWQgd2l0aCBmaWxlLmxvCi0gICAgeGZvcm09J1tjQ0ZTZm1zb10nCi0gICAgY2FzZSAiJGxpYm9iaiIgaW4KLSAgICAqLmFkYSkgeGZvcm09YWRhIDs7Ci0gICAgKi5hZGIpIHhmb3JtPWFkYiA7OwotICAgICouYWRzKSB4Zm9ybT1hZHMgOzsKLSAgICAqLmFzbSkgeGZvcm09YXNtIDs7Ci0gICAgKi5jKyspIHhmb3JtPWMrKyA7OwotICAgICouY2MpIHhmb3JtPWNjIDs7Ci0gICAgKi5jcHApIHhmb3JtPWNwcCA7OwotICAgICouY3h4KSB4Zm9ybT1jeHggOzsKLSAgICAqLmY5MCkgeGZvcm09ZjkwIDs7Ci0gICAgKi5mb3IpIHhmb3JtPWZvciA7OwotICAgIGVzYWMKLQotICAgIGxpYm9iaj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICJzL1wuJHhmb3JtJC8ubG8vImAKLQotICAgIGNhc2UgIiRsaWJvYmoiIGluCi0gICAgKi5sbykgb2JqPWAkZWNobyAiWCRsaWJvYmoiIHwgJFhzZWQgLWUgIiRsbzJvImAgOzsKLSAgICAqKQotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBuYW1lIG9mIGxpYnJhcnkgb2JqZWN0IGZyb20gXGAkbGlib2JqJyIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgIGlmIHRlc3QgLXogIiRiYXNlX2NvbXBpbGUiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGEgY29tcGlsYXRpb24gY29tbWFuZCIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgIyBEZWxldGUgYW55IGxlZnRvdmVyIGxpYnJhcnkgb2JqZWN0cy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0gICAgICByZW1vdmVsaXN0PSIkb2JqICRsaWJvYmoiCi0gICAgZWxzZQotICAgICAgcmVtb3ZlbGlzdD0iJGxpYm9iaiIKLSAgICBmaQotCi0gICAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLSAgICB0cmFwICIkcnVuICRybSAkcmVtb3ZlbGlzdDsgZXhpdCAxIiAxIDIgMTUKLQotICAgICMgQ2FsY3VsYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgb3V0cHV0IG9iamVjdCBpZiBjb21waWxlciBkb2VzCi0gICAgIyBub3Qgc3VwcG9ydCAtbyB3aXRoIC1jCi0gICAgaWYgdGVzdCAiJGNvbXBpbGVyX2NfbyIgPSBubzsgdGhlbgotICAgICAgb3V0cHV0X29iaj1gJGVjaG8gIlgkc3JjZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnIC1lICdzJVwuLiokJSUnYC4ke29iamV4dH0KLSAgICAgIGxvY2tmaWxlPSIkb3V0cHV0X29iai5sb2NrIgotICAgICAgcmVtb3ZlbGlzdD0iJHJlbW92ZWxpc3QgJG91dHB1dF9vYmogJGxvY2tmaWxlIgotICAgICAgdHJhcCAiJHJ1biAkcm0gJHJlbW92ZWxpc3Q7IGV4aXQgMSIgMSAyIDE1Ci0gICAgZWxzZQotICAgICAgbmVlZF9sb2Nrcz1ubwotICAgICAgbG9ja2ZpbGU9Ci0gICAgZmkKLQotICAgICMgTG9jayB0aGlzIGNyaXRpY2FsIHNlY3Rpb24gaWYgaXQgaXMgbmVlZGVkCi0gICAgIyBXZSB1c2UgdGhpcyBzY3JpcHQgZmlsZSB0byBtYWtlIHRoZSBsaW5rLCBpdCBhdm9pZHMgY3JlYXRpbmcgYSBuZXcgZmlsZQotICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHllczsgdGhlbgotICAgICAgdW50aWwgbG4gIiQwIiAiJGxvY2tmaWxlIiAyPi9kZXYvbnVsbDsgZG8KLQkkc2hvdyAiV2FpdGluZyBmb3IgJGxvY2tmaWxlIHRvIGJlIHJlbW92ZWQiCi0Jc2xlZXAgMgotICAgICAgZG9uZQotICAgIGVsaWYgdGVzdCAiJG5lZWRfbG9ja3MiID0gd2FybjsgdGhlbgotICAgICAgaWYgdGVzdCAtZiAiJGxvY2tmaWxlIjsgdGhlbgotCWVjaG8gIlwKLSoqKiBFUlJPUiwgJGxvY2tmaWxlIGV4aXN0cyBhbmQgY29udGFpbnM6Ci1gY2F0ICRsb2NrZmlsZSAyPi9kZXYvbnVsbGAKLQotVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbm90aGVyIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZQotdGVtcG9yYXJ5IG9iamVjdCBmaWxlLCBhbmQgbGlidG9vbCBjb3VsZCBub3Qgd29yayBhcm91bmQgaXQgYmVjYXVzZQoteW91ciBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IFxgLWMnIGFuZCBcYC1vJyB0b2dldGhlci4gIElmIHlvdQotcmVwZWF0IHRoaXMgY29tcGlsYXRpb24sIGl0IG1heSBzdWNjZWVkLCBieSBjaGFuY2UsIGJ1dCB5b3UgaGFkIGJldHRlcgotYXZvaWQgcGFyYWxsZWwgYnVpbGRzIChtYWtlIC1qKSBpbiB0aGlzIHBsYXRmb3JtLCBvciBnZXQgYSBiZXR0ZXIKLWNvbXBpbGVyLiIKLQotCSRydW4gJHJtICRyZW1vdmVsaXN0Ci0JZXhpdCAxCi0gICAgICBmaQotICAgICAgZWNobyAkc3JjZmlsZSA+ICIkbG9ja2ZpbGUiCi0gICAgZmkKLQotICAgIGlmIHRlc3QgLW4gIiRmaXhfc3JjZmlsZV9wYXRoIjsgdGhlbgotICAgICAgZXZhbCBzcmNmaWxlPVwiJGZpeF9zcmNmaWxlX3BhdGhcIgotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBQSUMgb2JqZWN0IGlmIHdlIGFyZSBidWlsZGluZyBsaWJ0b29sIGxpYnJhcmllcy4KLSAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotICAgICAgIyBXaXRob3V0IHRoaXMgYXNzaWdubWVudCwgYmFzZV9jb21waWxlIGdldHMgZW1wdGllZC4KLSAgICAgIGZic2RfaGlkZW91c19zaF9idWc9JGJhc2VfY29tcGlsZQotCi0gICAgICAjIEFsbCBwbGF0Zm9ybXMgdXNlIC1EUElDLCB0byBub3RpZnkgcHJlcHJvY2Vzc2VkIGFzc2VtYmxlciBjb2RlLgotICAgICAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkcGljX2ZsYWcgLURQSUMgJHNyY2ZpbGUiCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JbG9fbGlib2JqPSIkbGlib2JqIgotCWRpcj1gJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0JaWYgdGVzdCAiWCRkaXIiID0gIlgkbGlib2JqIjsgdGhlbgotCSAgZGlyPSIkb2JqZGlyIgotCWVsc2UKLQkgIGRpcj0iJGRpci8kb2JqZGlyIgotCWZpCi0JbGlib2JqPSIkZGlyLyJgJGVjaG8gIlgkbGlib2JqIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLQlpZiB0ZXN0IC1kICIkZGlyIjsgdGhlbgotCSAgJHNob3cgIiRybSAkbGlib2JqIgotCSAgJHJ1biAkcm0gJGxpYm9iagotCWVsc2UKLQkgICRzaG93ICIkbWtkaXIgJGRpciIKLQkgICRydW4gJG1rZGlyICRkaXIKLQkgIHN0YXR1cz0kPwotCSAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkZGlyOyB0aGVuCi0JICAgIGV4aXQgJHN0YXR1cwotCSAgZmkKLQlmaQotICAgICAgZmkKLSAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9vX2xvIiA9IHllczsgdGhlbgotCW91dHB1dF9vYmo9IiRsaWJvYmoiCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG91dHB1dF9vYmoiCi0gICAgICBlbGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCi0Jb3V0cHV0X29iaj0iJG9iaiIKLQljb21tYW5kPSIkY29tbWFuZCAtbyAkb3V0cHV0X29iaiIKLSAgICAgIGZpCi0KLSAgICAgICRzaG93ICIkY29tbWFuZCIKLSAgICAgIGlmICRydW4gZXZhbCAiJGNvbW1hbmQiOyB0aGVuIDoKLSAgICAgIGVsc2UKLQl0ZXN0IC1uICIkb3V0cHV0X29iaiIgJiYgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KLQllY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkLCB0aGVuIGdvIG9uIHRvIGNvbXBpbGUgdGhlIG5leHQgb25lCi0gICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJGxpYm9iaiI7IHRoZW4KLQkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRsaWJvYmoiCi0JaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJGxpYm9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gY29weSB0aGUgb2JqZWN0IGludG8gcGxhY2UgYW5kIGZpbmlzaC4KLSAgICAgIGlmIHRlc3QgLXogIiRwaWNfZmxhZyIgJiYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSMgUmVuYW1lIHRoZSAubG8gZnJvbSB3aXRoaW4gb2JqZGlyIHRvIG9iagotCWlmIHRlc3QgLWYgJG9iajsgdGhlbgotCSAgJHNob3cgJHJtICRvYmoKLQkgICRydW4gJHJtICRvYmoKLQlmaQotCi0JJHNob3cgIiRtdiAkbGlib2JqICRvYmoiCi0JaWYgJHJ1biAkbXYgJGxpYm9iaiAkb2JqOyB0aGVuIDoKLQllbHNlCi0JICBlcnJvcj0kPwotCSAgJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQkgIGV4aXQgJGVycm9yCi0JZmkKLQotCSMgTm93IGFycmFuZ2UgdGhhdCBvYmogYW5kIGxvX2xpYm9iaiBiZWNvbWUgdGhlIHNhbWUgZmlsZQotCSRzaG93ICIkTE5fUyAkb2JqICRsb19saWJvYmoiCi0JaWYgJHJ1biAkTE5fUyAkb2JqICRsb19saWJvYmo7IHRoZW4KLQkgIGV4aXQgMAotCWVsc2UKLQkgIGVycm9yPSQ/Ci0JICAkcnVuICRybSAkcmVtb3ZlbGlzdAotCSAgZXhpdCAkZXJyb3IKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBBbGxvdyBlcnJvciBtZXNzYWdlcyBvbmx5IGZyb20gdGhlIGZpcnN0IGNvbXBpbGF0aW9uLgotICAgICAgc3VwcHJlc3Nfb3V0cHV0PScgPi9kZXYvbnVsbCAyPiYxJwotICAgIGZpCi0KLSAgICAjIE9ubHkgYnVpbGQgYSBwb3NpdGlvbi1kZXBlbmRlbnQgb2JqZWN0IGlmIHdlIGJ1aWxkIG9sZCBsaWJyYXJpZXMuCi0gICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotICAgICAgY29tbWFuZD0iJGJhc2VfY29tcGlsZSAkc3JjZmlsZSIKLSAgICAgIGlmIHRlc3QgIiRjb21waWxlcl9jX28iID0geWVzOyB0aGVuCi0JY29tbWFuZD0iJGNvbW1hbmQgLW8gJG9iaiIKLQlvdXRwdXRfb2JqPSIkb2JqIgotICAgICAgZmkKLQotICAgICAgIyBTdXBwcmVzcyBjb21waWxlciBvdXRwdXQgaWYgd2UgYWxyZWFkeSBkaWQgYSBQSUMgY29tcGlsYXRpb24uCi0gICAgICBjb21tYW5kPSIkY29tbWFuZCRzdXBwcmVzc19vdXRwdXQiCi0gICAgICAkc2hvdyAiJGNvbW1hbmQiCi0gICAgICBpZiAkcnVuIGV2YWwgIiRjb21tYW5kIjsgdGhlbiA6Ci0gICAgICBlbHNlCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRuZWVkX2xvY2tzIiA9IHdhcm4gJiYKLQkgdGVzdCB4ImBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYCIgIT0geCIkc3JjZmlsZSI7IHRoZW4KLQllY2hvICJcCi0qKiogRVJST1IsICRsb2NrZmlsZSBjb250YWluczoKLWBjYXQgJGxvY2tmaWxlIDI+L2Rldi9udWxsYAotCi1idXQgaXQgc2hvdWxkIGNvbnRhaW46Ci0kc3JjZmlsZQotCi1UaGlzIGluZGljYXRlcyB0aGF0IGFub3RoZXIgcHJvY2VzcyBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lCi10ZW1wb3Jhcnkgb2JqZWN0IGZpbGUsIGFuZCBsaWJ0b29sIGNvdWxkIG5vdCB3b3JrIGFyb3VuZCBpdCBiZWNhdXNlCi15b3VyIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgXGAtYycgYW5kIFxgLW8nIHRvZ2V0aGVyLiAgSWYgeW91Ci1yZXBlYXQgdGhpcyBjb21waWxhdGlvbiwgaXQgbWF5IHN1Y2NlZWQsIGJ5IGNoYW5jZSwgYnV0IHlvdSBoYWQgYmV0dGVyCi1hdm9pZCBwYXJhbGxlbCBidWlsZHMgKG1ha2UgLWopIGluIHRoaXMgcGxhdGZvcm0sIG9yIGdldCBhIGJldHRlcgotY29tcGlsZXIuIgotCi0JJHJ1biAkcm0gJHJlbW92ZWxpc3QKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgICMgSnVzdCBtb3ZlIHRoZSBvYmplY3QgaWYgbmVlZGVkCi0gICAgICBpZiB0ZXN0IHgiJG91dHB1dF9vYmoiICE9IHgiJG9iaiI7IHRoZW4KLQkkc2hvdyAiJG12ICRvdXRwdXRfb2JqICRvYmoiCi0JaWYgJHJ1biAkbXYgJG91dHB1dF9vYmogJG9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIENyZWF0ZSBhbiBpbnZhbGlkIGxpYnRvb2wgb2JqZWN0IGlmIG5vIFBJQywgc28gdGhhdCB3ZSBkbyBub3QKLSAgICAgICMgYWNjaWRlbnRhbGx5IGxpbmsgaXQgaW50byBhIHByb2dyYW0uCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSB5ZXM7IHRoZW4KLQkkc2hvdyAiZWNobyB0aW1lc3RhbXAgPiAkbGlib2JqIgotCSRydW4gZXZhbCAiZWNobyB0aW1lc3RhbXAgPiBcJGxpYm9iaiIgfHwgZXhpdCAkPwotICAgICAgZWxzZQotCSMgTW92ZSB0aGUgLmxvIGZyb20gd2l0aGluIG9iamRpcgotCSRzaG93ICIkbXYgJGxpYm9iaiAkbG9fbGlib2JqIgotCWlmICRydW4gJG12ICRsaWJvYmogJGxvX2xpYm9iajsgdGhlbiA6Ci0JZWxzZQotCSAgZXJyb3I9JD8KLQkgICRydW4gJHJtICRyZW1vdmVsaXN0Ci0JICBleGl0ICRlcnJvcgotCWZpCi0gICAgICBmaQotICAgIGZpCi0KLSAgICAjIFVubG9jayB0aGUgY3JpdGljYWwgc2VjdGlvbiBpZiBpdCB3YXMgbG9ja2VkCi0gICAgaWYgdGVzdCAiJG5lZWRfbG9ja3MiICE9IG5vOyB0aGVuCi0gICAgICAkcm0gIiRsb2NrZmlsZSIKLSAgICBmaQotCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgbGluayBtb2RlCi0gIGxpbmspCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogbGluayIKLSAgICBDX2NvbXBpbGVyPSIkQ0MiICMgc2F2ZSBpdCwgdG8gY29tcGlsZSBnZW5lcmF0ZWQgQyBzb3VyY2VzCi0gICAgIyBDWUdOVVMgTE9DQUw6IHRyb21leS9qYXZhCi0gICAgIyBBbHdheXMgcmVzcGVjdCB0aGUgQ0MgY29uZmlndXJlZCBpbiBieSBsdGNvbmZpZy4KLSAgICAjIENDPSIkbm9ub3B0IgotICAgICMgRU5EIENZR05VUyBMT0NBTAotICAgIGNhc2UgIiRob3N0IiBpbgotICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotICAgICAgIyBJdCBpcyBpbXBvc3NpYmxlIHRvIGxpbmsgYSBkbGwgd2l0aG91dCB0aGlzIHNldHRpbmcsIGFuZAotICAgICAgIyB3ZSBzaG91bGRuJ3QgZm9yY2UgdGhlIG1ha2VmaWxlIG1haW50YWluZXIgdG8gZmlndXJlIG91dAotICAgICAgIyB3aGljaCBzeXN0ZW0gd2UgYXJlIGNvbXBpbGluZyBmb3IgaW4gb3JkZXIgdG8gcGFzcyBhbiBleHRyYQotICAgICAgIyBmbGFnIGZvciBldmVyeSBsaWJ0b29sIGludm9rYXRpb24uCi0gICAgICAjIGFsbG93X3VuZGVmaW5lZD1ubwotCi0gICAgICAjIEZJWE1FOiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCB0aGUgYWJvdmUgd2hlbiB0cnlpbmcKLSAgICAgICMgdG8gbWFrZSBhIGRsbCB3aGljaCBoYXMgdW5kZWZpbmVkIHN5bWJvbHMsIGluIHdoaWNoIGNhc2Ugbm90Ci0gICAgICAjIGV2ZW4gYSBzdGF0aWMgbGlicmFyeSBpcyBidWlsdC4gIEZvciBub3csIHdlIG5lZWQgdG8gc3BlY2lmeQotICAgICAgIyAtbm8tdW5kZWZpbmVkIG9uIHRoZSBsaWJ0b29sIGxpbmsgbGluZSB3aGVuIHdlIGNhbiBiZSBjZXJ0YWluCi0gICAgICAjIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHNhdGlzZmllZCwgb3RoZXJ3aXNlIHdlIGdldCBhIHN0YXRpYyBsaWJyYXJ5LgotICAgICAgYWxsb3dfdW5kZWZpbmVkPXllcwotCi0gICAgICAjIFRoaXMgaXMgYSBzb3VyY2UgcHJvZ3JhbSB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGRsbHMgb24gV2luZG93cwotICAgICAgIyBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKLSMgLyogbHRkbGwuYyBzdGFydHMgaGVyZSAqLwotIyAjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSMgI3VuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KLSMgI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jCi0jIEJPT0wgQVBJRU5UUlkgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCk7Ci0jCi0jICNpbmNsdWRlIDxjeWd3aW4vY3lnd2luX2RsbC5oPgotIyBERUNMQVJFX0NZR1dJTl9ETEwoIERsbE1haW4gKTsKLSMgSElOU1RBTkNFIF9faERsbEluc3RhbmNlX2Jhc2U7Ci0jCi0jIEJPT0wgQVBJRU5UUlkKLSMgRGxsTWFpbiAoSElOU1RBTkNFIGhJbnN0LCBEV09SRCByZWFzb24sIExQVk9JRCByZXNlcnZlZCkKLSMgewotIyAgIF9faERsbEluc3RhbmNlX2Jhc2UgPSBoSW5zdDsKLSMgICByZXR1cm4gVFJVRTsKLSMgfQotIyAvKiBsdGRsbC5jIGVuZHMgaGVyZSAqLwotICAgICAgIyBUaGlzIGlzIGEgc291cmNlIHByb2dyYW0gdGhhdCBpcyB1c2VkIHRvIGNyZWF0ZSBpbXBvcnQgbGlicmFyaWVzCi0gICAgICAjIG9uIFdpbmRvd3MgZm9yIGRsbHMgd2hpY2ggbGFjayB0aGVtLiBEb24ndCByZW1vdmUgbm9yIG1vZGlmeSB0aGUKLSAgICAgICMgc3RhcnRpbmcgYW5kIGNsb3NpbmcgY29tbWVudHMKLSMgLyogaW1wZ2VuLmMgc3RhcnRzIGhlcmUgKi8KLSMgLyogICBDb3B5cmlnaHQgKEMpIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIAotIyAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIGxpYnRvb2wuCi0jIAotIyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotIyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0jICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotIyAKLSMgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLSMgICovCi0jIAotIyAgI2luY2x1ZGUgPHN0ZGlvLmg+CQkvKiBmb3IgcHJpbnRmKCkgKi8KLSMgICNpbmNsdWRlIDx1bmlzdGQuaD4JCS8qIGZvciBvcGVuKCksIGxzZWVrKCksIHJlYWQoKSAqLwotIyAgI2luY2x1ZGUgPGZjbnRsLmg+CQkvKiBmb3IgT19SRE9OTFksIE9fQklOQVJZICovCi0jICAjaW5jbHVkZSA8c3RyaW5nLmg+CQkvKiBmb3Igc3RyZHVwKCkgKi8KLSMgCi0jICBzdGF0aWMgdW5zaWduZWQgaW50Ci0jICBwZV9nZXQxNiAoZmQsIG9mZnNldCkKLSMgICAgICAgaW50IGZkOwotIyAgICAgICBpbnQgb2Zmc2V0OwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyIGJbMl07Ci0jICAgIGxzZWVrIChmZCwgb2Zmc2V0LCBTRUVLX1NFVCk7Ci0jICAgIHJlYWQgKGZkLCBiLCAyKTsKLSMgICAgcmV0dXJuIGJbMF0gKyAoYlsxXTw8OCk7Ci0jICB9Ci0jIAotIyAgc3RhdGljIHVuc2lnbmVkIGludAotIyAgcGVfZ2V0MzIgKGZkLCBvZmZzZXQpCi0jICAgICAgaW50IGZkOwotIyAgICAgIGludCBvZmZzZXQ7Ci0jICB7Ci0jICAgIHVuc2lnbmVkIGNoYXIgYls0XTsKLSMgICAgbHNlZWsgKGZkLCBvZmZzZXQsIFNFRUtfU0VUKTsKLSMgICAgcmVhZCAoZmQsIGIsIDQpOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyAgfQotIyAKLSMgIHN0YXRpYyB1bnNpZ25lZCBpbnQKLSMgIHBlX2FzMzIgKHB0cikKLSMgICAgICAgdm9pZCAqcHRyOwotIyAgewotIyAgICB1bnNpZ25lZCBjaGFyICpiID0gcHRyOwotIyAgICByZXR1cm4gYlswXSArIChiWzFdPDw4KSArIChiWzJdPDwxNikgKyAoYlszXTw8MjQpOwotIyAgfQotIyAKLSMgIGludAotIyAgbWFpbiAoYXJnYywgYXJndikKLSMgICAgICBpbnQgYXJnYzsKLSMgICAgICBjaGFyICphcmd2W107Ci0jICB7Ci0jICAgICAgaW50IGRsbDsKLSMgICAgICB1bnNpZ25lZCBsb25nIHBlX2hlYWRlcl9vZmZzZXQsIG9wdGhkcl9vZnMsIG51bV9lbnRyaWVzLCBpOwotIyAgICAgIHVuc2lnbmVkIGxvbmcgZXhwb3J0X3J2YSwgZXhwb3J0X3NpemUsIG5zZWN0aW9ucywgc2VjcHRyLCBleHBwdHI7Ci0jICAgICAgdW5zaWduZWQgbG9uZyBuYW1lX3J2YXMsIG5leHA7Ci0jICAgICAgdW5zaWduZWQgY2hhciAqZXhwZGF0YSwgKmVydmE7Ci0jICAgICAgY2hhciAqZmlsZW5hbWUsICpkbGxfbmFtZTsKLSMgCi0jICAgICAgZmlsZW5hbWUgPSBhcmd2WzFdOwotIyAKLSMgICAgICBkbGwgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7Ci0jICAgICAgaWYgKCFkbGwpCi0jICAJcmV0dXJuIDE7Ci0jIAotIyAgICAgIGRsbF9uYW1lID0gZmlsZW5hbWU7Ci0jICAgIAotIyAgICAgIGZvciAoaT0wOyBmaWxlbmFtZVtpXTsgaSsrKQotIyAgCWlmIChmaWxlbmFtZVtpXSA9PSAnLycgfHwgZmlsZW5hbWVbaV0gPT0gJ1xcJyAgfHwgZmlsZW5hbWVbaV0gPT0gJzonKQotIyAgCSAgICBkbGxfbmFtZSA9IGZpbGVuYW1lICsgaSArMTsKLSMgCi0jICAgICAgcGVfaGVhZGVyX29mZnNldCA9IHBlX2dldDMyIChkbGwsIDB4M2MpOwotIyAgICAgIG9wdGhkcl9vZnMgPSBwZV9oZWFkZXJfb2Zmc2V0ICsgNCArIDIwOwotIyAgICAgIG51bV9lbnRyaWVzID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDkyKTsKLSMgCi0jICAgICAgaWYgKG51bV9lbnRyaWVzIDwgMSkgLyogbm8gZXhwb3J0cyAqLwotIyAgCXJldHVybiAxOwotIyAKLSMgICAgICBleHBvcnRfcnZhID0gcGVfZ2V0MzIgKGRsbCwgb3B0aGRyX29mcyArIDk2KTsKLSMgICAgICBleHBvcnRfc2l6ZSA9IHBlX2dldDMyIChkbGwsIG9wdGhkcl9vZnMgKyAxMDApOwotIyAgICAgIG5zZWN0aW9ucyA9IHBlX2dldDE2IChkbGwsIHBlX2hlYWRlcl9vZmZzZXQgKyA0ICsyKTsKLSMgICAgICBzZWNwdHIgPSAocGVfaGVhZGVyX29mZnNldCArIDQgKyAyMCArCi0jICAJICAgICAgcGVfZ2V0MTYgKGRsbCwgcGVfaGVhZGVyX29mZnNldCArIDQgKyAxNikpOwotIyAKLSMgICAgICBleHBwdHIgPSAwOwotIyAgICAgIGZvciAoaSA9IDA7IGkgPCBuc2VjdGlvbnM7IGkrKykKLSMgICAgICB7Ci0jICAJY2hhciBzbmFtZVs4XTsKLSMgIAl1bnNpZ25lZCBsb25nIHNlY3B0cjEgPSBzZWNwdHIgKyA0MCAqIGk7Ci0jICAJdW5zaWduZWQgbG9uZyB2YWRkciA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxMik7Ci0jICAJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IHBlX2dldDMyIChkbGwsIHNlY3B0cjEgKyAxNik7Ci0jICAJdW5zaWduZWQgbG9uZyBmcHRyID0gcGVfZ2V0MzIgKGRsbCwgc2VjcHRyMSArIDIwKTsKLSMgIAlsc2VlayhkbGwsIHNlY3B0cjEsIFNFRUtfU0VUKTsKLSMgIAlyZWFkKGRsbCwgc25hbWUsIDgpOwotIyAgCWlmICh2YWRkciA8PSBleHBvcnRfcnZhICYmIHZhZGRyK3ZzaXplID4gZXhwb3J0X3J2YSkKLSMgIAl7Ci0jICAJICAgIGV4cHB0ciA9IGZwdHIgKyAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgIAkgICAgaWYgKGV4cG9ydF9ydmEgKyBleHBvcnRfc2l6ZSA+IHZhZGRyICsgdnNpemUpCi0jICAJCWV4cG9ydF9zaXplID0gdnNpemUgLSAoZXhwb3J0X3J2YSAtIHZhZGRyKTsKLSMgIAkgICAgYnJlYWs7Ci0jICAJfQotIyAgICAgIH0KLSMgCi0jICAgICAgZXhwZGF0YSA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MoZXhwb3J0X3NpemUpOwotIyAgICAgIGxzZWVrIChkbGwsIGV4cHB0ciwgU0VFS19TRVQpOwotIyAgICAgIHJlYWQgKGRsbCwgZXhwZGF0YSwgZXhwb3J0X3NpemUpOwotIyAgICAgIGVydmEgPSBleHBkYXRhIC0gZXhwb3J0X3J2YTsKLSMgCi0jICAgICAgbmV4cCA9IHBlX2FzMzIgKGV4cGRhdGErMjQpOwotIyAgICAgIG5hbWVfcnZhcyA9IHBlX2FzMzIgKGV4cGRhdGErMzIpOwotIyAKLSMgICAgICBwcmludGYgKCJFWFBPUlRTXG4iKTsKLSMgICAgICBmb3IgKGkgPSAwOyBpPG5leHA7IGkrKykKLSMgICAgICB7Ci0jICAJdW5zaWduZWQgbG9uZyBuYW1lX3J2YSA9IHBlX2FzMzIgKGVydmErbmFtZV9ydmFzK2kqNCk7Ci0jICAJcHJpbnRmICgiXHQlcyBAICVsZCA7XG4iLCBlcnZhK25hbWVfcnZhLCAxKyBpKTsKLSMgICAgICB9Ci0jIAotIyAgICAgIHJldHVybiAwOwotIyAgfQotIyAvKiBpbXBnZW4uYyBlbmRzIGhlcmUgKi8KLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGFsbG93X3VuZGVmaW5lZD15ZXMKLSAgICAgIDs7Ci0gICAgZXNhYwotICAgIGNvbXBpbGVfY29tbWFuZD0iJENDIgotICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRDQyIKLQotICAgIGNvbXBpbGVfcnBhdGg9Ci0gICAgZmluYWxpemVfcnBhdGg9Ci0gICAgY29tcGlsZV9zaGxpYnBhdGg9Ci0gICAgZmluYWxpemVfc2hsaWJwYXRoPQotICAgIGNvbnZlbmllbmNlPQotICAgIG9sZF9jb252ZW5pZW5jZT0KLSAgICBkZXBsaWJzPQotICAgIGxpbmtvcHRzPQotCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICAjIGdldCB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICRzaGxpYnBhdGhfdmFyCi0gICAgICBldmFsIGxpYl9zZWFyY2hfcGF0aD1cYFwkZWNobyBcIlggXCR7JHNobGlicGF0aF92YXJ9XCIgXHwgXCRYc2VkIC1lIFwncy86LyAvZ1wnXGAKLSAgICBlbHNlCi0gICAgICBsaWJfc2VhcmNoX3BhdGg9Ci0gICAgZmkKLSAgICAjIG5vdyBwcmVwZW5kIHRoZSBzeXN0ZW0tc3BlY2lmaWMgb25lcwotICAgIGV2YWwgbGliX3NlYXJjaF9wYXRoPVwiJHN5c19saWJfc2VhcmNoX3BhdGhfc3BlY1wkbGliX3NlYXJjaF9wYXRoXCIKLSAgICBldmFsIHN5c19saWJfZGxzZWFyY2hfcGF0aD1cIiRzeXNfbGliX2Rsc2VhcmNoX3BhdGhfc3BlY1wiCi0gICAgCi0gICAgYXZvaWRfdmVyc2lvbj1ubwotICAgIGRsZmlsZXM9Ci0gICAgZGxwcmVmaWxlcz0KLSAgICBkbHNlbGY9bm8KLSAgICBleHBvcnRfZHluYW1pYz1ubwotICAgIGV4cG9ydF9zeW1ib2xzPQotICAgIGV4cG9ydF9zeW1ib2xzX3JlZ2V4PQotICAgIGdlbmVyYXRlZD0KLSAgICBsaWJvYmpzPQotICAgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9Ci0gICAgbHRsaWJzPQotICAgIG1vZHVsZT1ubwotICAgIG9ianM9Ci0gICAgcHJlbG9hZD1ubwotICAgIHByZXY9Ci0gICAgcHJldmFyZz0KLSAgICByZWxlYXNlPQotICAgIHJwYXRoPQotICAgIHhycGF0aD0KLSAgICBwZXJtX3JwYXRoPQotICAgIHRlbXBfcnBhdGg9Ci0gICAgdGhyZWFkX3NhZmU9bm8KLSAgICB2aW5mbz0KLQotICAgICMgV2UgbmVlZCB0byBrbm93IC1zdGF0aWMsIHRvIGdldCB0aGUgcmlnaHQgb3V0cHV0IGZpbGVuYW1lcy4KLSAgICBmb3IgYXJnCi0gICAgZG8KLSAgICAgIGNhc2UgIiRhcmciIGluCi0gICAgICAtYWxsLXN0YXRpYyB8IC1zdGF0aWMpCi0JaWYgdGVzdCAiWCRhcmciID0gIlgtYWxsLXN0YXRpYyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXMgJiYgdGVzdCAteiAiJGxpbmtfc3RhdGljX2ZsYWciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IGNvbXBsZXRlIHN0YXRpYyBsaW5raW5nIGlzIGltcG9zc2libGUgaW4gdGhpcyBjb25maWd1cmF0aW9uIiAxPiYyCi0JZmkKLQlidWlsZF9saWJ0b29sX2xpYnM9bm8KLQlidWlsZF9vbGRfbGlicz15ZXMKLQlicmVhawotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgIyBTZWUgaWYgb3VyIHNoYXJlZCBhcmNoaXZlcyBkZXBlbmQgb24gc3RhdGljIGFyY2hpdmVzLgotICAgIHRlc3QgLW4gIiRvbGRfYXJjaGl2ZV9mcm9tX25ld19jbWRzIiAmJiBidWlsZF9vbGRfbGlicz15ZXMKLQotICAgICMgR28gdGhyb3VnaCB0aGUgYXJndW1lbnRzLCB0cmFuc2Zvcm1pbmcgdGhlbSBvbiB0aGUgd2F5LgotICAgIHdoaWxlIHRlc3QgJCMgLWd0IDA7IGRvCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLQotICAgICAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gICAgICBpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQljYXNlICIkcHJldiIgaW4KLQlvdXRwdXQpCi0JICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgQE9VVFBVVEAiCi0JICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCBAT1VUUFVUQCIKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJHByZXYiIGluCi0JZGxmaWxlc3xkbHByZWZpbGVzKQotCSAgaWYgdGVzdCAiJHByZWxvYWQiID0gbm87IHRoZW4KLQkgICAgIyBBZGQgdGhlIHN5bWJvbCBvYmplY3QgaW50byB0aGUgbGlua2luZyBjb21tYW5kcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIEBTWU1GSUxFQCIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgQFNZTUZJTEVAIgotCSAgICBwcmVsb2FkPXllcwotCSAgZmkKLQkgIGNhc2UgIiRhcmciIGluCi0JICAqLmxhIHwgKi5sbykgOzsgICMgV2UgaGFuZGxlIHRoZXNlIGNhc2VzIGJlbG93LgotCSAgc2VsZikKLQkgICAgaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgICAgIGRsc2VsZj15ZXMKLQkgICAgZWxpZiB0ZXN0ICIkcHJldiIgPSBkbGZpbGVzICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgIT0geWVzOyB0aGVuCi0JICAgICAgZGxzZWxmPXllcwotCSAgICBmaQotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgICA7OwotCSAgKikKLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGFyZyIKLQkgICAgdGVzdCAiJHByZXYiID0gZGxmaWxlcyAmJiBkbGZpbGVzPSIkZGxmaWxlcyAkYXJnIgotCSAgICBwcmV2PQotCSAgICA7OwotCSAgZXNhYwotCSAgOzsKLQlleHBzeW1zKQotCSAgZXhwb3J0X3N5bWJvbHM9IiRhcmciCi0JICBpZiB0ZXN0ICEgLWYgIiRhcmciOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IHN5bWJvbCBmaWxlIFxgJGFyZycgZG9lcyBub3QgZXhpc3QiCi0JICAgIGV4aXQgMQotCSAgZmkKLQkgIHByZXY9Ci0JICBjb250aW51ZQotCSAgOzsKLQlleHBzeW1zX3JlZ2V4KQotCSAgZXhwb3J0X3N5bWJvbHNfcmVnZXg9IiRhcmciCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JcmVsZWFzZSkKLQkgIHJlbGVhc2U9Ii0kYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXJwYXRoKQotCSAgcnBhdGg9IiRycGF0aCAkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCXhycGF0aCkKLQkgIHhycGF0aD0iJHhycGF0aCAkYXJnIgotCSAgcHJldj0KLQkgIGNvbnRpbnVlCi0JICA7OwotCSopCi0JICBldmFsICIkcHJldj1cIlwkYXJnXCIiCi0JICBwcmV2PQotCSAgY29udGludWUKLQkgIDs7Ci0JZXNhYwotICAgICAgZmkKLQotICAgICAgcHJldmFyZz0iJGFyZyIKLQotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgIC1hbGwtc3RhdGljKQotCWlmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1hbGxvdy11bmRlZmluZWQpCi0JIyBGSVhNRTogcmVtb3ZlIHRoaXMgZmxhZyBzb21ldGltZSBpbiB0aGUgZnV0dXJlLgotCSRlY2hvICIkbW9kZW5hbWU6IFxgLWFsbG93LXVuZGVmaW5lZCcgaXMgZGVwcmVjYXRlZCBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IiAxPiYyCi0JY29udGludWUKLQk7OwotCi0gICAgICAtYXZvaWQtdmVyc2lvbikKLQlhdm9pZF92ZXJzaW9uPXllcwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLWRsb3BlbikKLQlwcmV2PWRsZmlsZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1kbHByZW9wZW4pCi0JcHJldj1kbHByZWZpbGVzCi0JY29udGludWUKLQk7OwotCi0gICAgICAtZXhwb3J0LWR5bmFtaWMpCi0JaWYgdGVzdCAiJGV4cG9ydF9keW5hbWljIiAhPSB5ZXM7IHRoZW4KLQkgIGV4cG9ydF9keW5hbWljPXllcwotCSAgaWYgdGVzdCAtbiAiJGV4cG9ydF9keW5hbWljX2ZsYWdfc3BlYyI7IHRoZW4KLQkgICAgZXZhbCBhcmc9XCIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjXCIKLQkgIGVsc2UKLQkgICAgYXJnPQotCSAgZmkKLQlmaQotCTs7Ci0KLSAgICAgIC1leHBvcnQtc3ltYm9scyB8IC1leHBvcnQtc3ltYm9scy1yZWdleCkKLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgLWV4cG9ydGVkLXN5bWJvbHMiCi0JICBleGl0IDEKLQlmaQotCWlmIHRlc3QgIiRhcmciID0gIi1leHBvcnQtc3ltYm9scyI7IHRoZW4KLQkgIHByZXY9ZXhwc3ltcwotCWVsc2UKLQkgIHByZXY9ZXhwc3ltc19yZWdleAotCWZpCi0JY29udGludWUKLQk7OwotCi0gICAgICAtTCopCi0JZGlyPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MlXi1MXCguKlwpJCVcMSUnYAotCWNhc2UgIiRkaXIiIGluCi0JLyogfCBbQS1aYS16XTpbL1xcXSopCi0JICAjIEFkZCB0aGUgY29ycmVzcG9uZGluZyBoYXJkY29kZV9saWJkaXJfZmxhZywgaWYgaXQgaXMgbm90IGlkZW50aWNhbC4KLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgLUwkZGlyJyBjYW5ub3Qgc3BlY2lmeSBhIHJlbGF0aXZlIGRpcmVjdG9yeSIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQljYXNlICIgJGRlcGxpYnMgIiBpbgotCSoiICRhcmcgIiopIDs7Ci0JKikgZGVwbGlicz0iJGRlcGxpYnMgJGFyZyI7OwotCWVzYWMKLQljYXNlICIgJGxpYl9zZWFyY2hfcGF0aCAiIGluCi0JKiIgJGRpciAiKikgOzsKLQkqKSBsaWJfc2VhcmNoX3BhdGg9IiRsaWJfc2VhcmNoX3BhdGggJGRpciI7OwotCWVzYWMKLQljYXNlICIkaG9zdCIgaW4KLQkqLSotY3lnd2luKiB8ICotKi1taW5ndyogfCAqLSotb3MyKikKLQkgIGRsbHNlYXJjaGRpcj1gY2QgIiRkaXIiICYmIHB3ZCB8fCBlY2hvICIkZGlyImAKLQkgIGNhc2UgIjokZGxsc2VhcmNocGF0aDoiIGluCi0JICA6OikgZGxsc2VhcmNocGF0aD0iJGRsbHNlYXJjaGRpciI7OwotCSAgKiI6JGRsbHNlYXJjaGRpcjoiKikgOzsKLQkgICopIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkbGxzZWFyY2hkaXIiOzsKLQkgIGVzYWMKLQkgIDs7Ci0JZXNhYwotCTs7Ci0KLSAgICAgIC1sKikKLQlkZXBsaWJzPSIkZGVwbGlicyAkYXJnIgotCTs7Ci0KLSAgICAgIC1tb2R1bGUpCi0JaWYgdGVzdCAiJG1vZHVsZSIgIT0geWVzOyB0aGVuCi0JICBtb2R1bGU9eWVzCi0JICBpZiB0ZXN0IC1uICIkZXhwb3J0X2R5bmFtaWNfZmxhZ19zcGVjIjsgdGhlbgotCSAgICBldmFsIGFyZz1cIiRleHBvcnRfZHluYW1pY19mbGFnX3NwZWNcIgotCSAgZWxzZQotCSAgICBhcmc9Ci0JICBmaQotCWZpCi0JOzsKLQkKLSAgICAgIC1uby11bmRlZmluZWQpCi0JYWxsb3dfdW5kZWZpbmVkPW5vCi0JY29udGludWUKLQk7OwotCi0gICAgICAtbykgcHJldj1vdXRwdXQgOzsKLQotICAgICAgLXJlbGVhc2UpCi0JcHJldj1yZWxlYXNlCi0JY29udGludWUKLQk7OwotCi0gICAgICAtcnBhdGgpCi0JcHJldj1ycGF0aAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLVIpCi0JcHJldj14cnBhdGgKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC1SKikKLQl4cnBhdGg9IiR4cnBhdGggImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgLXN0YXRpYykKLQkjIElmIHdlIGhhdmUgbm8gcGljX2ZsYWcsIHRoZW4gdGhpcyBpcyB0aGUgc2FtZSBhcyAtYWxsLXN0YXRpYy4KLQlpZiB0ZXN0IC16ICIkcGljX2ZsYWciICYmIHRlc3QgLW4gIiRsaW5rX3N0YXRpY19mbGFnIjsgdGhlbgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRsaW5rX3N0YXRpY19mbGFnIgotCSAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpbmtfc3RhdGljX2ZsYWciCi0JICBkbG9wZW5fc2VsZj0kZGxvcGVuX3NlbGZfc3RhdGljCi0JZmkKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC10aHJlYWQtc2FmZSkKLQl0aHJlYWRfc2FmZT15ZXMKLQljb250aW51ZQotCTs7Ci0KLSAgICAgIC12ZXJzaW9uLWluZm8pCi0JcHJldj12aW5mbwotCWNvbnRpbnVlCi0JOzsKLQotICAgICAgIyBTb21lIG90aGVyIGNvbXBpbGVyIGZsYWcuCi0gICAgICAtKiB8ICsqKQotCSMgVW5rbm93biBhcmd1bWVudHMgaW4gYm90aCBmaW5hbGl6ZV9jb21tYW5kIGFuZCBjb21waWxlX2NvbW1hbmQgbmVlZAotCSMgdG8gYmUgYWVzdGhldGljYWxseSBxdW90ZWQgYmVjYXVzZSB0aGV5IGFyZSBldmFsZWQgbGF0ZXIuCi0JYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotCWNhc2UgIiRhcmciIGluCi0JKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0JICBhcmc9IlwiJGFyZ1wiIgotCSAgOzsKLQllc2FjCi0JOzsKLQotICAgICAgKi5vIHwgKi5vYmogfCAqLmEgfCAqLmxpYikKLQkjIEEgc3RhbmRhcmQgb2JqZWN0LgotCW9ianM9IiRvYmpzICRhcmciCi0JOzsKLQotICAgICAgKi5sbykKLQkjIEEgbGlicmFyeSBvYmplY3QuCi0JaWYgdGVzdCAiJHByZXYiID0gZGxmaWxlczsgdGhlbgotCSAgZGxmaWxlcz0iJGRsZmlsZXMgJGFyZyIKLQkgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzICYmIHRlc3QgIiRkbG9wZW4iID0geWVzOyB0aGVuCi0JICAgIHByZXY9Ci0JICAgIGNvbnRpbnVlCi0JICBlbHNlCi0JICAgICMgSWYgbGlidG9vbCBvYmplY3RzIGFyZSB1bnN1cHBvcnRlZCwgdGhlbiB3ZSBuZWVkIHRvIHByZWxvYWQuCi0JICAgIHByZXY9ZGxwcmVmaWxlcwotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAiJHByZXYiID0gZGxwcmVmaWxlczsgdGhlbgotCSAgIyBQcmVsb2FkIHRoZSBvbGQtc3R5bGUgb2JqZWN0LgotCSAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgImAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIHByZXY9Ci0JZmkKLQlsaWJvYmpzPSIkbGlib2JqcyAkYXJnIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBBIGxpYnRvb2wtY29udHJvbGxlZCBsaWJyYXJ5LgotCi0JZGxuYW1lPQotCWxpYmRpcj0KLQlsaWJyYXJ5X25hbWVzPQotCW9sZF9saWJyYXJ5PQotCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGFyZyB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkYXJnJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQkjIElmIHRoZSBsaWJyYXJ5IHdhcyBpbnN0YWxsZWQgd2l0aCBhbiBvbGQgcmVsZWFzZSBvZiBsaWJ0b29sLAotCSMgaXQgd2lsbCBub3QgcmVkZWZpbmUgdmFyaWFibGUgaW5zdGFsbGVkLgotCWluc3RhbGxlZD15ZXMKLQotCSMgSWYgdGhlcmUgaXMgbm8gZGlyZWN0b3J5IGNvbXBvbmVudCwgdGhlbiBhZGQgb25lLgotCWNhc2UgIiRhcmciIGluCi0JKi8qIHwgKlxcKikgLiAkYXJnIDs7Ci0JKikgLiAuLyRhcmcgOzsKLQllc2FjCi0KLQkjIEdldCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeSB3ZSBsaW5rIGFnYWluc3QuCi0JbGlua2xpYj0KLQlmb3IgbCBpbiAkb2xkX2xpYnJhcnkgJGxpYnJhcnlfbmFtZXM7IGRvCi0JICBsaW5rbGliPSIkbCIKLQlkb25lCi0KLQlpZiB0ZXN0IC16ICIkbGlua2xpYiI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBmaW5kIG5hbWUgb2YgbGluayBsaWJyYXJ5IGZvciBcYCRhcmcnIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JIyBGaW5kIHRoZSByZWxldmFudCBvYmplY3QgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IG5hbWUuCi0JbmFtZT1gJGVjaG8gIlgkYXJnIiB8ICRYc2VkIC1lICdzJV4uKi8lJScgLWUgJ3MvXC5sYSQvLycgLWUgJ3MvXmxpYi8vJ2AKLQotCWlmIHRlc3QgIlgkaW5zdGFsbGVkIiA9IFh5ZXM7IHRoZW4KLQkgIGRpcj0iJGxpYmRpciIKLQllbHNlCi0JICBkaXI9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCSAgaWYgdGVzdCAiWCRkaXIiID0gIlgkYXJnIjsgdGhlbgotCSAgICBkaXI9IiRvYmpkaXIiCi0JICBlbHNlCi0JICAgIGRpcj0iJGRpci8kb2JqZGlyIgotCSAgZmkKLQlmaQotCi0JaWYgdGVzdCAtbiAiJGRlcGVuZGVuY3lfbGlicyI7IHRoZW4KLQkgICMgRXh0cmFjdCAtUiBmcm9tIGRlcGVuZGVuY3lfbGlicwotCSAgdGVtcF9kZXBsaWJzPQotCSAgZm9yIGRlcGxpYiBpbiAkZGVwZW5kZW5jeV9saWJzOyBkbwotCSAgICBjYXNlICIkZGVwbGliIiBpbgotCSAgICAtUiopIHRlbXBfeHJwYXRoPWAkZWNobyAiWCRkZXBsaWIiIHwgJFhzZWQgLWUgJ3MvXi1SLy8nYAotCQkgY2FzZSAiICRycGF0aCAkeHJwYXRoICIgaW4KLQkJICoiICR0ZW1wX3hycGF0aCAiKikgOzsKLQkJICopIHhycGF0aD0iJHhycGF0aCAkdGVtcF94cnBhdGgiOzsKLQkJIGVzYWM7OwotCSAgICAtTCopIGNhc2UgIiRjb21waWxlX2NvbW1hbmQgJHRlbXBfZGVwbGlicyAiIGluCi0JCSAqIiAkZGVwbGliICIqKSA7OwotCQkgKikgdGVtcF9kZXBsaWJzPSIkdGVtcF9kZXBsaWJzICRkZXBsaWIiOzsKLQkJIGVzYWM7OwotCSAgICAqKSB0ZW1wX2RlcGxpYnM9IiR0ZW1wX2RlcGxpYnMgJGRlcGxpYiI7OwotCSAgICBlc2FjCi0JICBkb25lCi0JICBkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX2RlcGxpYnMiCi0JZmkKLQotCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCi0JICAjIEl0IGlzIGEgbGlidG9vbCBjb252ZW5pZW5jZSBsaWJyYXJ5LCBzbyBhZGQgaW4gaXRzIG9iamVjdHMuCi0JICBjb252ZW5pZW5jZT0iJGNvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgb2xkX2NvbnZlbmllbmNlPSIkb2xkX2NvbnZlbmllbmNlICRkaXIvJG9sZF9saWJyYXJ5IgotCSAgZGVwbGlicz0iJGRlcGxpYnMkZGVwZW5kZW5jeV9saWJzIgotCSAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKLQkgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kICRkaXIvJG9sZF9saWJyYXJ5JGRlcGVuZGVuY3lfbGlicyIKLQkgIGNvbnRpbnVlCi0JZmkKLQotCSMgVGhpcyBsaWJyYXJ5IHdhcyBzcGVjaWZpZWQgd2l0aCAtZGxvcGVuLgotCWlmIHRlc3QgIiRwcmV2IiA9IGRsZmlsZXM7IHRoZW4KLQkgIGRsZmlsZXM9IiRkbGZpbGVzICRhcmciCi0JICBpZiB0ZXN0IC16ICIkZGxuYW1lIiB8fCB0ZXN0ICIkZGxvcGVuIiAhPSB5ZXMgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBubzsgdGhlbgotCSAgICAjIElmIHRoZXJlIGlzIG5vIGRsbmFtZSwgbm8gZGxvcGVuIHN1cHBvcnQgb3Igd2UncmUgbGlua2luZyBzdGF0aWNhbGx5LAotCSAgICAjIHdlIG5lZWQgdG8gcHJlbG9hZC4KLQkgICAgcHJldj1kbHByZWZpbGVzCi0JICBlbHNlCi0JICAgICMgV2Ugc2hvdWxkIG5vdCBjcmVhdGUgYSBkZXBlbmRlbmN5IG9uIHRoaXMgbGlicmFyeSwgYnV0IHdlCi0JICAgICMgbWF5IG5lZWQgYW55IGxpYnJhcmllcyBpdCByZXF1aXJlcy4KLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCSAgICBwcmV2PQotCSAgICBjb250aW51ZQotCSAgZmkKLQlmaQotCi0JIyBUaGUgbGlicmFyeSB3YXMgc3BlY2lmaWVkIHdpdGggLWRscHJlb3Blbi4KLQlpZiB0ZXN0ICIkcHJldiIgPSBkbHByZWZpbGVzOyB0aGVuCi0JICAjIFByZWZlciB1c2luZyBhIHN0YXRpYyBsaWJyYXJ5IChzbyB0aGF0IG5vIHNpbGx5IF9EWU5BTUlDIHN5bWJvbHMKLQkgICMgYXJlIHJlcXVpcmVkIHRvIGxpbmspLgotCSAgaWYgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICBkbHByZWZpbGVzPSIkZGxwcmVmaWxlcyAkZGlyLyRvbGRfbGlicmFyeSIKLQkgIGVsc2UKLQkgICAgZGxwcmVmaWxlcz0iJGRscHJlZmlsZXMgJGRpci8kbGlua2xpYiIKLQkgIGZpCi0JICBwcmV2PQotCWZpCi0KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllcyAmJiB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyI7IHRoZW4KLQkgIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9IiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzICRhcmciCi0JICBpZiB0ZXN0IC1uICIkc2hsaWJwYXRoX3ZhciI7IHRoZW4KLQkgICAgIyBNYWtlIHN1cmUgdGhlIHJwYXRoIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGRpcmVjdG9yaWVzLgotCSAgICBjYXNlICIkdGVtcF9ycGF0aCAiIGluCi0JICAgICoiICRkaXIgIiopIDs7Ci0JICAgICopIHRlbXBfcnBhdGg9IiR0ZW1wX3JwYXRoICRkaXIiIDs7Ci0JICAgIGVzYWMKLQkgIGZpCi0KLQkgICMgV2UgbmVlZCBhbiBhYnNvbHV0ZSBwYXRoLgotCSAgY2FzZSAiJGRpciIgaW4KLQkgIC8qIHwgW0EtWmEtel06Wy9cXF0qKSBhYnNkaXI9IiRkaXIiIDs7Ci0JICAqKQotCSAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0JICAgIGlmIHRlc3QgLXogIiRhYnNkaXIiOyB0aGVuCi0JICAgICAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGRldGVybWluZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZSBvZiBcYCRsaWJkaXInIiAxPiYyCi0JICAgICAgZXhpdCAxCi0JICAgIGZpCi0JICAgIDs7Ci0JICBlc2FjCi0JICAKLQkgICMgVGhpcyBpcyB0aGUgbWFnaWMgdG8gdXNlIC1ycGF0aC4KLQkgICMgU2tpcCBkaXJlY3RvcmllcyB0aGF0IGFyZSBpbiB0aGUgc3lzdGVtIGRlZmF1bHQgcnVuLXRpbWUKLQkgICMgc2VhcmNoIHBhdGgsIHVubGVzcyB0aGV5IGhhdmUgYmVlbiByZXF1ZXN0ZWQgd2l0aCAtUi4KLQkgIGNhc2UgIiAkc3lzX2xpYl9kbHNlYXJjaF9wYXRoICIgaW4KLSAJICAqIiAkYWJzZGlyICIqKSA7OwotCSAgKikKLQkgICAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgICAqIiAkYWJzZGlyICIqKSA7OwotCSAgICAqKSBjb21waWxlX3JwYXRoPSIkY29tcGlsZV9ycGF0aCAkYWJzZGlyIiAKLQkgICAgZXNhYwotCSAgICA7OwotIAkgIGVzYWMKLQotCSAgY2FzZSAiICRzeXNfbGliX2Rsc2VhcmNoX3BhdGggIiBpbgotIAkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKQotCSAgICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgICAqIiAkbGliZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9ycGF0aD0iJGZpbmFsaXplX3JwYXRoICRsaWJkaXIiCi0JICAgIGVzYWMKLQkgICAgOzsKLSAJICBlc2FjCi0KLQkgIGxpYl9saW5rZWQ9eWVzCi0JICBjYXNlICIkaGFyZGNvZGVfYWN0aW9uIiBpbgotCSAgaW1tZWRpYXRlIHwgdW5zdXBwb3J0ZWQpCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0gbm87IHRoZW4KLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgJGRpci8kbGlua2xpYiIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAkZGlyLyRsaW5rbGliIgotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICotKi1jeWd3aW4qIHwgKi0qLW1pbmd3KiB8ICotKi1vczIqKQotCQlkbGxzZWFyY2hkaXI9YGNkICIkZGlyIiAmJiBwd2QgfHwgZWNobyAiJGRpciJgCi0JCWlmIHRlc3QgLW4gIiRkbGxzZWFyY2hwYXRoIjsgdGhlbgotCQkgIGRsbHNlYXJjaHBhdGg9IiRkbGxzZWFyY2hwYXRoOiRkbGxzZWFyY2hkaXIiCi0JCWVsc2UKLQkJICBkbGxzZWFyY2hwYXRoPSIkZGxsc2VhcmNoZGlyIgotCQlmaQotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSBubzsgdGhlbgotCSAgICAgIGNhc2UgIiRob3N0IiBpbgotCSAgICAgICotKi1zdW5vcyopCi0JCWNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgICBlc2FjCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgLUwkZGlyIC1sJG5hbWUiCi0JICAgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX3NobGlicGF0aF92YXIiID0gbm87IHRoZW4KLQkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KLQkgICAgICAqIjokZGlyOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkZGlyOiI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgbGliX2xpbmtlZD1ubwotCSAgICBmaQotCSAgICA7OwotCi0JICByZWxpbmspCi0JICAgIGlmIHRlc3QgIiRoYXJkY29kZV9kaXJlY3QiID0geWVzOyB0aGVuCi0JICAgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhYnNkaXIvJGxpbmtsaWIiCi0JICAgICAgZGVwbGlicz0iJGRlcGxpYnMgJGFic2Rpci8kbGlua2xpYiIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfbWludXNfTCIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgICAqIiAtTCRhYnNkaXIgIiopIDs7Ci0JICAgICAgKikgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1MJGFic2RpciI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtTCRhYnNkaXIgLWwkbmFtZSIKLQkgICAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgICBjYXNlICI6JGNvbXBpbGVfc2hsaWJwYXRoOiIgaW4KLQkgICAgICAqIjokYWJzZGlyOiIqKSA7OwotCSAgICAgICopIGNvbXBpbGVfc2hsaWJwYXRoPSIkY29tcGlsZV9zaGxpYnBhdGgkYWJzZGlyOiI7OwotCSAgICAgIGVzYWMKLQkgICAgICBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLWwkbmFtZSIKLQkgICAgICBkZXBsaWJzPSIkZGVwbGlicyAtbCRuYW1lIgotCSAgICBlbHNlCi0JICAgICAgbGliX2xpbmtlZD1ubwotCSAgICBmaQotCSAgICA7OwotCi0JICAqKQotCSAgICBsaWJfbGlua2VkPW5vCi0JICAgIDs7Ci0JICBlc2FjCi0KLQkgIGlmIHRlc3QgIiRsaWJfbGlua2VkIiAhPSB5ZXM7IHRoZW4KLQkgICAgJGVjaG8gIiRtb2RlbmFtZTogY29uZmlndXJhdGlvbiBlcnJvcjogdW5zdXBwb3J0ZWQgaGFyZGNvZGUgcHJvcGVydGllcyIKLQkgICAgZXhpdCAxCi0JICBmaQotCi0JICAjIEZpbmFsaXplIGNvbW1hbmQgZm9yIGJvdGggaXMgc2ltcGxlOiBqdXN0IGhhcmRjb2RlIGl0LgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgPSB5ZXM7IHRoZW4KLQkgICAgZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGxpYmRpci8kbGlua2xpYiIKLQkgIGVsaWYgdGVzdCAiJGhhcmRjb2RlX21pbnVzX0wiID0geWVzOyB0aGVuCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkbGliZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZWxpZiB0ZXN0ICIkaGFyZGNvZGVfc2hsaWJwYXRoX3ZhciIgPSB5ZXM7IHRoZW4KLQkgICAgY2FzZSAiOiRmaW5hbGl6ZV9zaGxpYnBhdGg6IiBpbgotCSAgICAqIjokbGliZGlyOiIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9zaGxpYnBhdGg9IiRmaW5hbGl6ZV9zaGxpYnBhdGgkbGliZGlyOiI7OwotCSAgICBlc2FjCi0JICAgIGZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kIC1sJG5hbWUiCi0JICBlbHNlCi0JICAgICMgV2UgY2Fubm90IHNlZW0gdG8gaGFyZGNvZGUgaXQsIGd1ZXNzIHdlJ2xsIGZha2UgaXQuCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRsaWJkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZmkKLQllbHNlCi0JICAjIFRyYW5zZm9ybSBkaXJlY3RseSB0byBvbGQgYXJjaGl2ZXMgaWYgd2UgZG9uJ3QgYnVpbGQgbmV3IGxpYnJhcmllcy4KLQkgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyIgJiYgdGVzdCAteiAiJG9sZF9saWJyYXJ5IjsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBzdGF0aWMgbGlicmFyeSBmb3IgXGAkYXJnJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCBvbmUgb2YgaGFyZGNvZGVfZGlyZWN0IG9yIGhhcmRjb2RlX21pbnVzX0wKLQkgICMgaXMgbm90IHVuc3VwcG9ydGVkLiAgVGhpcyBpcyB2YWxpZCBvbiBhbGwga25vd24gc3RhdGljIGFuZAotCSAgIyBzaGFyZWQgcGxhdGZvcm1zLgotCSAgaWYgdGVzdCAiJGhhcmRjb2RlX2RpcmVjdCIgIT0gdW5zdXBwb3J0ZWQ7IHRoZW4KLQkgICAgdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBsaW5rbGliPSIkb2xkX2xpYnJhcnkiCi0JICAgIGNvbXBpbGVfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAkZGlyLyRsaW5rbGliIgotCSAgZWxzZQotCSAgICBjYXNlICIkY29tcGlsZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBjb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQgLUwkZGlyIjs7Ci0JICAgIGVzYWMKLQkgICAgY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kIC1sJG5hbWUiCi0JICAgIGNhc2UgIiRmaW5hbGl6ZV9jb21tYW5kICIgaW4KLQkgICAgKiIgLUwkZGlyICIqKSA7OwotCSAgICAqKSBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtTCRkaXIiOzsKLQkgICAgZXNhYwotCSAgICBmaW5hbGl6ZV9jb21tYW5kPSIkZmluYWxpemVfY29tbWFuZCAtbCRuYW1lIgotCSAgZmkKLQlmaQotCi0JIyBBZGQgaW4gYW55IGxpYnJhcmllcyB0aGF0IHRoaXMgb25lIGRlcGVuZHMgdXBvbi4KLQljb21waWxlX2NvbW1hbmQ9IiRjb21waWxlX2NvbW1hbmQkZGVwZW5kZW5jeV9saWJzIgotCWZpbmFsaXplX2NvbW1hbmQ9IiRmaW5hbGl6ZV9jb21tYW5kJGRlcGVuZGVuY3lfbGlicyIKLQljb250aW51ZQotCTs7Ci0KLSAgICAgICMgU29tZSBvdGhlciBjb21waWxlciBhcmd1bWVudC4KLSAgICAgICopCi0JIyBVbmtub3duIGFyZ3VtZW50cyBpbiBib3RoIGZpbmFsaXplX2NvbW1hbmQgYW5kIGNvbXBpbGVfY29tbWFuZCBuZWVkCi0JIyB0byBiZSBhZXN0aGV0aWNhbGx5IHF1b3RlZCBiZWNhdXNlIHRoZXkgYXJlIGV2YWxlZCBsYXRlci4KLQlhcmc9YCRlY2hvICJYJGFyZyIgfCAkWHNlZCAtZSAiJHNlZF9xdW90ZV9zdWJzdCJgCi0JY2FzZSAiJGFyZyIgaW4KLQkqW1xbXH5cI1xeXCZcKlwoXClce1x9XHxcO1w8XD5cP1wnXCBcCV0qfCpdKikKLQkgIGFyZz0iXCIkYXJnXCIiCi0JICA7OwotCWVzYWMKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIE5vdyBhY3R1YWxseSBzdWJzdGl0dXRlIHRoZSBhcmd1bWVudCBpbnRvIHRoZSBjb21tYW5kcy4KLSAgICAgIGlmIHRlc3QgLW4gIiRhcmciOyB0aGVuCi0JY29tcGlsZV9jb21tYW5kPSIkY29tcGlsZV9jb21tYW5kICRhcmciCi0JZmluYWxpemVfY29tbWFuZD0iJGZpbmFsaXplX2NvbW1hbmQgJGFyZyIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldmFyZycgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBvbGRsaWJzPQotICAgICMgY2FsY3VsYXRlIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aXRob3V0IGl0cyBkaXJlY3RvcnkKLSAgICBvdXRwdXRuYW1lPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLSAgICBsaWJvYmpzX3NhdmU9IiRsaWJvYmpzIgotCi0gICAgY2FzZSAiJG91dHB1dCIgaW4KLSAgICAiIikKLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgICA7OwotCi0gICAgKi5hIHwgKi5saWIpCi0gICAgICBpZiB0ZXN0IC1uICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBlcnJvcjogY2Fubm90IGxpbmsgbGlidG9vbCBsaWJyYXJpZXMgaW50byBhcmNoaXZlcyIgMT4mMgotCWV4aXQgMQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRlcGxpYnMiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtbCcgYW5kIFxgLUwnIGFyZSBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcnBhdGgnIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLVInIGlzIGlnbm9yZWQgZm9yIGFyY2hpdmVzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBhcmNoaXZlcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtcmVsZWFzZScgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1leHBvcnQtc3ltYm9scycgaXMgaWdub3JlZCBmb3IgYXJjaGl2ZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBvbGRsaWJzPSIkb3V0cHV0IgotICAgICAgOzsKLQotICAgICoubGEpCi0gICAgICAjIE1ha2Ugc3VyZSB3ZSBvbmx5IGdlbmVyYXRlIGxpYnJhcmllcyBvZiB0aGUgZm9ybSBgbGliTkFNRS5sYScuCi0gICAgICBjYXNlICIkb3V0cHV0bmFtZSIgaW4KLSAgICAgIGxpYiopCi0JbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJyAtZSAncy9ebGliLy8nYAotCWV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCTs7Ci0gICAgICAqKQotCWlmIHRlc3QgIiRtb2R1bGUiID0gbm87IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGxpYnRvb2wgbGlicmFyeSBcYCRvdXRwdXQnIG11c3QgYmVnaW4gd2l0aCBcYGxpYiciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQlpZiB0ZXN0ICIkbmVlZF9saWJfcHJlZml4IiAhPSBubzsgdGhlbgotCSAgIyBBZGQgdGhlICJsaWIiIHByZWZpeCBmb3IgbW9kdWxlcyBpZiByZXF1aXJlZAotCSAgbmFtZT1gJGVjaG8gIlgkb3V0cHV0bmFtZSIgfCAkWHNlZCAtZSAncy9cLmxhJC8vJ2AKLQkgIGV2YWwgbGlibmFtZT1cIiRsaWJuYW1lX3NwZWNcIgotCWVsc2UKLQkgIGxpYm5hbWU9YCRlY2hvICJYJG91dHB1dG5hbWUiIHwgJFhzZWQgLWUgJ3MvXC5sYSQvLydgCi0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICBvdXRwdXRfb2JqZGlyPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIlgkb3V0cHV0X29iamRpciIgPSAiWCRvdXRwdXQiOyB0aGVuCi0Jb3V0cHV0X29iamRpcj0iJG9iamRpciIKLSAgICAgIGVsc2UKLQlvdXRwdXRfb2JqZGlyPSIkb3V0cHV0X29iamRpci8kb2JqZGlyIgotICAgICAgZmkKLQotICAgICAgIyBBbGwgdGhlIGxpYnJhcnktc3BlY2lmaWMgdmFyaWFibGVzIChpbnN0YWxsX2xpYmRpciBpcyBzZXQgYWJvdmUpLgotICAgICAgbGlicmFyeV9uYW1lcz0KLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgZGxuYW1lPQotCi0gICAgICBpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgYnVpbGQgbGlidG9vbCBsaWJyYXJ5IFxgJG91dHB1dCcgZnJvbSBub24tbGlidG9vbCBvYmplY3RzOiRvYmpzIiAyPiYxCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIEhvdyB0aGUgaGVjayBhcmUgd2Ugc3VwcG9zZWQgdG8gd3JpdGUgYSB3cmFwcGVyIGZvciBhIHNoYXJlZCBsaWJyYXJ5PwotICAgICAgaWYgdGVzdCAtbiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JICRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBzaGFyZWQgbGlicmFyaWVzIGludG8gbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLQkgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkZGxmaWxlcyRkbHByZWZpbGVzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3IgbGlidG9vbCBsaWJyYXJpZXMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIHNldCBkdW1teSAkcnBhdGgKLSAgICAgIGlmIHRlc3QgJCMgLWd0IDI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBpZ25vcmluZyBtdWx0aXBsZSBcYC1ycGF0aCdzIGZvciBhIGxpYnRvb2wgbGlicmFyeSIgMT4mMgotICAgICAgZmkKLSAgICAgIGluc3RhbGxfbGliZGlyPSIkMiIKLQotICAgICAgb2xkbGlicz0KLSAgICAgIGlmIHRlc3QgLXogIiRycGF0aCI7IHRoZW4KLQlpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBCdWlsZGluZyBhIGxpYnRvb2wgY29udmVuaWVuY2UgbGlicmFyeS4KLQkgIGxpYmV4dD1hbAotCSAgb2xkbGlicz0iJG91dHB1dF9vYmpkaXIvJGxpYm5hbWUuJGxpYmV4dCAkb2xkbGlicyIKLQkgIGJ1aWxkX2xpYnRvb2xfbGlicz1jb252ZW5pZW5jZQotCSAgYnVpbGRfb2xkX2xpYnM9eWVzCi0JZmkKLQlkZXBlbmRlbmN5X2xpYnM9IiRkZXBsaWJzIgotCi0JaWYgdGVzdCAtbiAiJHZpbmZvIjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotCi0JaWYgdGVzdCAtbiAiJHJlbGVhc2UiOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBjb252ZW5pZW5jZSBsaWJyYXJpZXMiIDE+JjIKLQlmaQotICAgICAgZWxzZQotCi0JIyBQYXJzZSB0aGUgdmVyc2lvbiBpbmZvcm1hdGlvbiBhcmd1bWVudC4KLQlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSc6JwotCXNldCBkdW1teSAkdmluZm8gMCAwIDAKLQlJRlM9IiRzYXZlX2lmcyIKLQotCWlmIHRlc3QgLW4gIiQ4IjsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogdG9vIG1hbnkgcGFyYW1ldGVycyB0byBcYC12ZXJzaW9uLWluZm8nIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCWZpCi0KLQljdXJyZW50PSIkMiIKLQlyZXZpc2lvbj0iJDMiCi0JYWdlPSIkNCIKLQotCSMgQ2hlY2sgdGhhdCBlYWNoIG9mIHRoZSB0aGluZ3MgYXJlIHZhbGlkIG51bWJlcnMuCi0JY2FzZSAiJGN1cnJlbnQiIGluCi0JMCB8IFsxLTldIHwgWzEtOV1bMC05XSopIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IENVUlJFTlQgXGAkY3VycmVudCcgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJHJldmlzaW9uIiBpbgotCTAgfCBbMS05XSB8IFsxLTldWzAtOV0qKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBSRVZJU0lPTiBcYCRyZXZpc2lvbicgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JY2FzZSAiJGFnZSIgaW4KLQkwIHwgWzEtOV0gfCBbMS05XVswLTldKikgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgbm90IGEgbm9ubmVnYXRpdmUgaW50ZWdlciIgMT4mMgotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkdmluZm8nIGlzIG5vdCB2YWxpZCB2ZXJzaW9uIGluZm9ybWF0aW9uIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotCi0JaWYgdGVzdCAkYWdlIC1ndCAkY3VycmVudDsgdGhlbgotCSAgJGVjaG8gIiRtb2RlbmFtZTogQUdFIFxgJGFnZScgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IGludGVyZmFjZSBudW1iZXIgXGAkY3VycmVudCciIDE+JjIKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJHZpbmZvJyBpcyBub3QgdmFsaWQgdmVyc2lvbiBpbmZvcm1hdGlvbiIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgQ2FsY3VsYXRlIHRoZSB2ZXJzaW9uIHZhcmlhYmxlcy4KLQltYWpvcj0KLQl2ZXJzdWZmaXg9Ci0JdmVyc3RyaW5nPQotCWNhc2UgIiR2ZXJzaW9uX3R5cGUiIGluCi0Jbm9uZSkgOzsKLQotCWlyaXgpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2UgKyAxYAotCSAgdmVyc3VmZml4PSIkbWFqb3IuJHJldmlzaW9uIgotCSAgdmVyc3RyaW5nPSJzZ2kkbWFqb3IuJHJldmlzaW9uIgotCi0JICAjIEFkZCBpbiBhbGwgdGhlIGludGVyZmFjZXMgdGhhdCB3ZSBhcmUgY29tcGF0aWJsZSB3aXRoLgotCSAgbG9vcD0kcmV2aXNpb24KLQkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJHJldmlzaW9uIC0gJGxvb3BgCi0JICAgIGxvb3A9YGV4cHIgJGxvb3AgLSAxYAotCSAgICB2ZXJzdHJpbmc9InNnaSRtYWpvci4kaWZhY2U6JHZlcnN0cmluZyIKLQkgIGRvbmUKLQkgIDs7Ci0KLQlsaW51eCkKLQkgIG1ham9yPS5gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9IiRtYWpvci4kYWdlLiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlvc2YpCi0JICBtYWpvcj1gZXhwciAkY3VycmVudCAtICRhZ2VgCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudC4kYWdlLiRyZXZpc2lvbiIKLQkgIHZlcnN0cmluZz0iJGN1cnJlbnQuJGFnZS4kcmV2aXNpb24iCi0KLQkgICMgQWRkIGluIGFsbCB0aGUgaW50ZXJmYWNlcyB0aGF0IHdlIGFyZSBjb21wYXRpYmxlIHdpdGguCi0JICBsb29wPSRhZ2UKLQkgIHdoaWxlIHRlc3QgJGxvb3AgIT0gMDsgZG8KLQkgICAgaWZhY2U9YGV4cHIgJGN1cnJlbnQgLSAkbG9vcGAKLQkgICAgbG9vcD1gZXhwciAkbG9vcCAtIDFgCi0JICAgIHZlcnN0cmluZz0iJHZlcnN0cmluZzoke2lmYWNlfS4wIgotCSAgZG9uZQotCi0JICAjIE1ha2UgZXhlY3V0YWJsZXMgZGVwZW5kIG9uIG91ciBjdXJyZW50IHZlcnNpb24uCi0JICB2ZXJzdHJpbmc9IiR2ZXJzdHJpbmc6JHtjdXJyZW50fS4wIgotCSAgOzsKLQotCXN1bm9zKQotCSAgbWFqb3I9Ii4kY3VycmVudCIKLQkgIHZlcnN1ZmZpeD0iLiRjdXJyZW50LiRyZXZpc2lvbiIKLQkgIDs7Ci0KLQlmcmVlYnNkLWFvdXQpCi0JICBtYWpvcj0iLiRjdXJyZW50IgotCSAgdmVyc3VmZml4PSIuJGN1cnJlbnQuJHJldmlzaW9uIjsKLQkgIDs7Ci0KLQlmcmVlYnNkLWVsZikKLQkgIG1ham9yPSIuJGN1cnJlbnQiCi0JICB2ZXJzdWZmaXg9Ii4kY3VycmVudCI7Ci0JICA7OwotCi0Jd2luZG93cykKLQkgICMgTGlrZSBMaW51eCwgYnV0IHdpdGggJy0nIHJhdGhlciB0aGFuICcuJywgc2luY2Ugd2Ugb25seQotCSAgIyB3YW50IG9uZSBleHRlbnNpb24gb24gV2luZG93cyA5NS4KLQkgIG1ham9yPWBleHByICRjdXJyZW50IC0gJGFnZWAKLQkgIHZlcnN1ZmZpeD0iLSRtYWpvci0kYWdlLSRyZXZpc2lvbiIKLQkgIDs7Ci0KLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogdW5rbm93biBsaWJyYXJ5IHZlcnNpb24gdHlwZSBcYCR2ZXJzaW9uX3R5cGUnIiAxPiYyCi0JICBlY2hvICJGYXRhbCBjb25maWd1cmF0aW9uIGVycm9yLiAgU2VlIHRoZSAkUEFDS0FHRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCSMgQ2xlYXIgdGhlIHZlcnNpb24gaW5mbyBpZiB3ZSBkZWZhdWx0ZWQsIGFuZCB0aGV5IHNwZWNpZmllZCBhIHJlbGVhc2UuCi0JaWYgdGVzdCAteiAiJHZpbmZvIiAmJiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3RyaW5nPSIwLjAiCi0JICBpZiB0ZXN0ICIkbmVlZF92ZXJzaW9uIiA9IG5vOyB0aGVuCi0JICAgIHZlcnN1ZmZpeD0KLQkgIGVsc2UKLQkgICAgdmVyc3VmZml4PSIuMC4wIgotCSAgZmkKLQlmaQotCi0JIyBSZW1vdmUgdmVyc2lvbiBpbmZvIGZyb20gbmFtZSBpZiB2ZXJzaW9uaW5nIHNob3VsZCBiZSBhdm9pZGVkCi0JaWYgdGVzdCAiJGF2b2lkX3ZlcnNpb24iID0geWVzICYmIHRlc3QgIiRuZWVkX3ZlcnNpb24iID0gbm87IHRoZW4KLQkgIG1ham9yPQotCSAgdmVyc3VmZml4PQotCSAgdmVyc3RyaW5nPSIiCi0JZmkKLQkKLQkjIENoZWNrIHRvIHNlZSBpZiB0aGUgYXJjaGl2ZSB3aWxsIGhhdmUgdW5kZWZpbmVkIHN5bWJvbHMuCi0JaWYgdGVzdCAiJGFsbG93X3VuZGVmaW5lZCIgPSB5ZXM7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbGxvd191bmRlZmluZWRfZmxhZyIgPSB1bnN1cHBvcnRlZDsgdGhlbgotCSAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiB1bmRlZmluZWQgc3ltYm9scyBub3QgYWxsb3dlZCBpbiAkaG9zdCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgIGZpCi0JZWxzZQotCSAgIyBEb24ndCBhbGxvdyB1bmRlZmluZWQgc3ltYm9scy4KLQkgIGFsbG93X3VuZGVmaW5lZF9mbGFnPSIkbm9fdW5kZWZpbmVkX2ZsYWciCi0JZmkKLQotCWRlcGVuZGVuY3lfbGlicz0iJGRlcGxpYnMiCi0JY2FzZSAiJGhvc3QiIGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cqIHwgKi0qLW9zMiopCi0JICAjIHRoZXNlIHN5c3RlbXMgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhIGMgbGlicmFyeSAoYXMgc3VjaCkhCi0JICA7OwotCSopCi0JICAjIEFkZCBsaWJjIHRvIGRlcGxpYnMgb24gYWxsIG90aGVyIHN5c3RlbXMuCi0JICBkZXBsaWJzPSIkZGVwbGlicyAtbGMiCi0JICA7OwotCWVzYWMKLSAgICAgIGZpCi0KLSAgICAgICMgQ3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBvciByZW1vdmUgb3VyIG91dHB1dHMgaWYgd2UgbmVlZCB0by4KLSAgICAgIGlmIHRlc3QgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KLQkkc2hvdyAiJHtybX1yICRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lICRvdXRwdXRfb2JqZGlyLyRsaWJuYW1lLiogJG91dHB1dF9vYmpkaXIvJHtsaWJuYW1lfSR7cmVsZWFzZX0uKiIKLQkkcnVuICR7cm19ciAkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSAkb3V0cHV0X29iamRpci8kbGlibmFtZS4qICRvdXRwdXRfb2JqZGlyLyR7bGlibmFtZX0ke3JlbGVhc2V9LioKLSAgICAgIGVsc2UKLQkkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotCSRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb3V0cHV0X29iamRpcjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IHNldCB0aGUgdmFyaWFibGVzIGZvciBidWlsZGluZyBvbGQgbGlicmFyaWVzLgotICAgICAgaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiAhPSBjb252ZW5pZW5jZSA7IHRoZW4KLQlvbGRsaWJzPSIkb2xkbGlicyAkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCi0JIyBUcmFuc2Zvcm0gLmxvIGZpbGVzIHRvIC5vIGZpbGVzLgotCW9sZG9ianM9IiRvYmpzICJgJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IHllczsgdGhlbgotCSMgVHJhbnNmb3JtIGRlcGxpYnMgaW50byBvbmx5IGRlcGxpYnMgdGhhdCBjYW4gYmUgbGlua2VkIGluIHNoYXJlZC4KLQluYW1lX3NhdmU9JG5hbWUKLQlsaWJuYW1lX3NhdmU9JGxpYm5hbWUKLQlyZWxlYXNlX3NhdmU9JHJlbGVhc2UKLQl2ZXJzdWZmaXhfc2F2ZT0kdmVyc3VmZml4Ci0JbWFqb3Jfc2F2ZT0kbWFqb3IKLQkjIEknbSBub3Qgc3VyZSBpZiBJJ20gdHJlYXRpbmcgdGhlIHJlbGVhc2UgY29ycmVjdGx5LiAgSSB0aGluawotCSMgcmVsZWFzZSBzaG91bGQgc2hvdyB1cCBpbiB0aGUgLWwgKGllIC1sZ21wNSkgc28gd2UgZG9uJ3Qgd2FudCB0bwotCSMgYWRkIGl0IGluIHR3aWNlLiAgSXMgdGhhdCBjb3JyZWN0PwotCXJlbGVhc2U9IiIKLQl2ZXJzdWZmaXg9IiIKLQltYWpvcj0iIgotCW5ld2RlcGxpYnM9Ci0JZHJvcHBlZGRlcHM9bm8KLQljYXNlICIkZGVwbGlic19jaGVja19tZXRob2QiIGluCi0JcGFzc19hbGwpCi0JICBuZXdkZXBsaWJzPSRkZXBsaWJzCi0JCSAgICA7OyAjIERvbid0IGNoZWNrIGZvciBzaGFyZWQvc3RhdGljLiAgRXZlcnl0aGluZyB3b3Jrcy4KLQkJICAgICAgICMgVGhpcyBtaWdodCBiZSBhIGxpdHRsZSBuYWl2ZS4gIFdlIG1pZ2h0IHdhbnQgdG8gY2hlY2sKLQkJICAgICAgICMgd2hldGhlciB0aGUgbGlicmFyeSBleGlzdHMgb3Igbm90LiAgQnV0IHRoaXMgaXMgb24KLQkJICAgICAgICMgb3NmMyAmIG9zZjQgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUuLi4gSnVzdAotCQkgICAgICAgIyBpbXBsZW1lbnRpbmcgd2hhdCB3YXMgYWxyZWFkeSB0aGUgYmVoYXZpb3VyLgotCXRlc3RfY29tcGlsZSkKLQkgICMgVGhpcyBjb2RlIHN0cmVzc2VzIHRoZSAibGlicmFyaWVzIGFyZSBwcm9ncmFtcyIgcGFyYWRpZ20gdG8gaXRzCi0JICAjIGxpbWl0cy4gTWF5YmUgZXZlbiBicmVha3MgaXQuICBXZSBjb21waWxlIGEgcHJvZ3JhbSwgbGlua2luZyBpdAotCSAgIyBhZ2FpbnN0IHRoZSBkZXBsaWJzIGFzIGEgcHJveHkgZm9yIHRoZSBsaWJyYXJ5LiAgVGhlbiB3ZSBjYW4gY2hlY2sKLQkgICMgd2hldGhlciB0aGV5IGxpbmtlZCBpbiBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggbGRkLgotCSAgJHJtIGNvbmZ0ZXN0LmMKLQkgIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLQkgIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQotRU9GCi0JICAkcm0gY29uZnRlc3QKLQkgICRDX2NvbXBpbGVyIC1vIGNvbmZ0ZXN0IGNvbmZ0ZXN0LmMgJGRlcGxpYnMKLQkgIGlmIHRlc3QgJD8gLWVxIDAgOyB0aGVuCi0JICAgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkgICAgZm9yIGkgaW4gJGRlcGxpYnM7IGRvCi0JICAgICAgbmFtZT0iYGV4cHIgJGkgOiAnLWxcKC4qXCknYCIKLQkgICAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgICBpZiB0ZXN0ICIkbmFtZSIgIT0gIiIgOyB0aGVuCi0JCWxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJZGVwbGliX21hdGNoZXM9YGV2YWwgXFwkZWNobyBcIiRsaWJyYXJ5X25hbWVzX3NwZWNcImAKLQkJc2V0IGR1bW15ICRkZXBsaWJfbWF0Y2hlcwotCQlkZXBsaWJfbWF0Y2g9JDIKLQkJaWYgdGVzdCBgZXhwciAiJGxkZF9vdXRwdXQiIDogIi4qJGRlcGxpYl9tYXRjaCJgIC1uZSAwIDsgdGhlbgotCQkgIG5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCQllbHNlCi0JCSAgZHJvcHBlZGRlcHM9eWVzCi0JCSAgZWNobwotCQkgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRpLiIKLQkJICBlY2hvICIqKiogSSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhhdCBsaWJyYXJ5IGF1dG9tYXRpY2FsbHkgbGluayBpbiB3aGVuIgotCQkgIGVjaG8gIioqKiB5b3UgbGluayB0byB0aGlzIGxpYnJhcnkuICBCdXQgSSBjYW4gb25seSBkbyB0aGlzIGlmIHlvdSBoYXZlIGEiCi0JCSAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkJZmkKLQkgICAgICBlbHNlCi0JCW5ld2RlcGxpYnM9IiRuZXdkZXBsaWJzICRpIgotCSAgICAgIGZpCi0JICAgIGRvbmUKLQkgIGVsc2UKLQkgICAgIyBFcnJvciBvY2N1cmVkIGluIHRoZSBmaXJzdCBjb21waWxlLiAgTGV0J3MgdHJ5IHRvIHNhbHZhZ2UgdGhlIHNpdHVhdGlvbjoKLQkgICAgIyBDb21waWxlIGEgc2VwZXJhdGUgcHJvZ3JhbSBmb3IgZWFjaCBsaWJyYXJ5LgotCSAgICBmb3IgaSBpbiAkZGVwbGliczsgZG8KLQkgICAgICBuYW1lPSJgZXhwciAkaSA6ICctbFwoLipcKSdgIgotCSAgICAgIyBJZiAkbmFtZSBpcyBlbXB0eSB3ZSBhcmUgb3BlcmF0aW5nIG9uIGEgLUwgYXJndW1lbnQuCi0JICAgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiIDsgdGhlbgotCQkkcm0gY29uZnRlc3QKLQkJJENfY29tcGlsZXIgLW8gY29uZnRlc3QgY29uZnRlc3QuYyAkaQotCQkjIERpZCBpdCB3b3JrPwotCQlpZiB0ZXN0ICQ/IC1lcSAwIDsgdGhlbgotCQkgIGxkZF9vdXRwdXQ9YGxkZCBjb25mdGVzdGAKLQkJICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkJICAgIGRlcGxpYl9tYXRjaGVzPWBldmFsIFxcJGVjaG8gXCIkbGlicmFyeV9uYW1lc19zcGVjXCJgCi0JCSAgICBzZXQgZHVtbXkgJGRlcGxpYl9tYXRjaGVzCi0JCSAgICBkZXBsaWJfbWF0Y2g9JDIKLQkJICAgIGlmIHRlc3QgYGV4cHIgIiRsZGRfb3V0cHV0IiA6ICIuKiRkZXBsaWJfbWF0Y2giYCAtbmUgMCA7IHRoZW4KLQkJICAgICAgbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JCSAgICBlbHNlCi0JCSAgICAgIGRyb3BwZWRkZXBzPXllcwotCQkgICAgICBlY2hvCi0JCSAgICAgIGVjaG8gIioqKiBXYXJuaW5nOiBUaGlzIGxpYnJhcnkgbmVlZHMgc29tZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5ICRpLiIKLQkJICAgICAgZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJICAgICAgZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJICAgICAgZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkJICAgIGZpCi0JCWVsc2UKLQkJICBkcm9wcGVkZGVwcz15ZXMKLQkJICBlY2hvCi0JCSAgZWNobyAiKioqIFdhcm5pbmchICBMaWJyYXJ5ICRpIGlzIG5lZWRlZCBieSB0aGlzIGxpYnJhcnkgYnV0IEkgd2FzIG5vdCBhYmxlIHRvIgotCQkgIGVjaG8gIioqKiAgbWFrZSBpdCBsaW5rIGluISAgWW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBpbnN0YWxsIGl0IG9yIHNvbWUiCi0JCSAgZWNobyAiKioqIGxpYnJhcnkgdGhhdCBpdCBkZXBlbmRzIG9uIGJlZm9yZSB0aGlzIGxpYnJhcnkgd2lsbCBiZSBmdWxseSIKLQkJICBlY2hvICIqKiogZnVuY3Rpb25hbC4gIEluc3RhbGxpbmcgaXQgYmVmb3JlIGNvbnRpbnVpbmcgd291bGQgYmUgZXZlbiBiZXR0ZXIuIgotCQlmaQotCSAgICAgIGVsc2UKLQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQkgIGRlcGxpYnM9JG5ld2RlcGxpYnMKLQkgIDs7Ci0JZmlsZV9tYWdpYyopCi0JICBzZXQgZHVtbXkgJGRlcGxpYnNfY2hlY2tfbWV0aG9kCi0JICBmaWxlX21hZ2ljX3JlZ2V4PSJgZXhwciBcIiRkZXBsaWJzX2NoZWNrX21ldGhvZFwiIDogXCIkMiBcKC4qXClcImAiCi0JICBmb3IgYV9kZXBsaWIgaW4gJGRlcGxpYnM7IGRvCi0JICAgIG5hbWU9ImBleHByICRhX2RlcGxpYiA6ICctbFwoLipcKSdgIgotCSAgICAjIElmICRuYW1lIGlzIGVtcHR5IHdlIGFyZSBvcGVyYXRpbmcgb24gYSAtTCBhcmd1bWVudC4KLQkgICAgaWYgdGVzdCAiJG5hbWUiICE9ICIiIDsgdGhlbgotCSAgICAgIGxpYm5hbWU9YGV2YWwgXFwkZWNobyBcIiRsaWJuYW1lX3NwZWNcImAKLQkgICAgICBmb3IgaSBpbiAkbGliX3NlYXJjaF9wYXRoOyBkbwotCQkgICAgcG90ZW50aWFsX2xpYnM9YGxzICRpLyRsaWJuYW1lWy4tXSogMj4vZGV2L251bGxgCi0JCSAgICBmb3IgcG90ZW50X2xpYiBpbiAkcG90ZW50aWFsX2xpYnM7IGRvCi0JCSAgICAgICMgRm9sbG93IHNvZnQgbGlua3MuCi0JCSAgICAgIGlmIGxzIC1sTGQgIiRwb3RsaWIiIDI+L2Rldi9udWxsIFwKLQkJCSB8IGdyZXAgIiAtPiAiID4vZGV2L251bGw7IHRoZW4KLQkJCWNvbnRpbnVlIAotCQkgICAgICBmaQotCQkgICAgICAjIFRoZSBzdGF0ZW1lbnQgYWJvdmUgdHJpZXMgdG8gYXZvaWQgZW50ZXJpbmcgYW4KLQkJICAgICAgIyBlbmRsZXNzIGxvb3AgYmVsb3csIGluIGNhc2Ugb2YgY3ljbGljIGxpbmtzLgotCQkgICAgICAjIFdlIG1pZ2h0IHN0aWxsIGVudGVyIGFuIGVuZGxlc3MgbG9vcCwgc2luY2UgYSBsaW5rCi0JCSAgICAgICMgbG9vcCBjYW4gYmUgY2xvc2VkIHdoaWxlIHdlIGZvbGxvdyBsaW5rcywKLQkJICAgICAgIyBidXQgc28gd2hhdD8KLQkJICAgICAgcG90bGliPSIkcG90ZW50X2xpYiIKLQkJICAgICAgd2hpbGUgdGVzdCAtaCAiJHBvdGxpYiIgMj4vZGV2L251bGw7IGRvCi0JCQlwb3RsaWJsaW5rPWBscyAtbGQgJHBvdGxpYiB8IHNlZCAncy8uKiAtPiAvLydgCi0JCQljYXNlICIkcG90bGlibGluayIgaW4KLQkJCS8qKSBwb3RsaWI9IiRwb3RsaWJsaW5rIjs7Ci0JCQkqKSBwb3RsaWI9YCRlY2hvICJYJHBvdGxpYiIgfCAkWHNlZCAtZSAncyxbXi9dKiQsLCdgIiRwb3RsaWJsaW5rIjs7Ci0JCQllc2FjCi0JCSAgICAgIGRvbmUKLQkJICAgICAgaWYgZXZhbCAkZmlsZV9tYWdpY19jbWQgXCJcJHBvdGxpYlwiIFwKLQkJCSB8IHNlZCAxMHEgXAotCQkJIHwgZWdyZXAgIiRmaWxlX21hZ2ljX3JlZ2V4IiA+IC9kZXYvbnVsbDsgdGhlbgotCQkJbmV3ZGVwbGlicz0iJG5ld2RlcGxpYnMgJGFfZGVwbGliIgotCQkJYV9kZXBsaWI9IiIKLQkJCWJyZWFrIDIKLQkJICAgICAgZmkKLQkJICAgIGRvbmUKLQkgICAgICBkb25lCi0JICAgICAgaWYgdGVzdCAtbiAiJGFfZGVwbGliIiA7IHRoZW4KLQkJZHJvcHBlZGRlcHM9eWVzCi0JCWVjaG8KLQkJZWNobyAiKioqIFdhcm5pbmc6IFRoaXMgbGlicmFyeSBuZWVkcyBzb21lIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgJGFfZGVwbGliLiIKLQkJZWNobyAiKioqIEkgaGF2ZSB0aGUgY2FwYWJpbGl0eSB0byBtYWtlIHRoYXQgbGlicmFyeSBhdXRvbWF0aWNhbGx5IGxpbmsgaW4gd2hlbiIKLQkJZWNobyAiKioqIHlvdSBsaW5rIHRvIHRoaXMgbGlicmFyeS4gIEJ1dCBJIGNhbiBvbmx5IGRvIHRoaXMgaWYgeW91IGhhdmUgYSIKLQkJZWNobyAiKioqIHNoYXJlZCB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCB5b3UgZG8gbm90IGFwcGVhciB0byBoYXZlLiIKLQkgICAgICBmaQotCSAgICBlbHNlCi0JICAgICAgIyBBZGQgYSAtTCBhcmd1bWVudC4KLQkgICAgICBuZXdkZXBsaWJzPSIkbmV3ZGVwbGlicyAkYV9kZXBsaWIiCi0JICAgIGZpCi0JICBkb25lICMgR29uZSB0aHJvdWdoIGFsbCBkZXBsaWJzLgotCSAgOzsKLQlub25lIHwgdW5rbm93biB8ICopIG5ld2RlcGxpYnM9IiIKLQkgIGlmICRlY2hvICJYICRkZXBsaWJzIiB8ICRYc2VkIC1lICdzLyAtbGMkLy8nIFwKLQkgICAgICAgLWUgJ3MvIC1bTFJdW14gXSovL2cnIC1lICdzL1sgCV0vL2cnIHwKLQkgICAgIGdyZXAgLiA+L2Rldi9udWxsOyB0aGVuCi0JICAgIGVjaG8KLQkgICAgaWYgdGVzdCAiWCRkZXBsaWJzX2NoZWNrX21ldGhvZCIgPSAiWG5vbmUiOyB0aGVuCi0JICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcGxhdGZvcm0uIgotCSAgICBlbHNlCi0JICAgICAgZWNobyAiKioqIFdhcm5pbmc6IGludGVyLWxpYnJhcnkgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdG8gYmUgc3VwcG9ydGVkLiIKLQkgICAgZmkKLQkgICAgZWNobyAiKioqIEFsbCBkZWNsYXJlZCBpbnRlci1saWJyYXJ5IGRlcGVuZGVuY2llcyBhcmUgYmVpbmcgZHJvcHBlZC4iCi0JICAgIGRyb3BwZWRkZXBzPXllcwotCSAgZmkKLQkgIDs7Ci0JZXNhYwotCXZlcnN1ZmZpeD0kdmVyc3VmZml4X3NhdmUKLQltYWpvcj0kbWFqb3Jfc2F2ZQotCXJlbGVhc2U9JHJlbGVhc2Vfc2F2ZQotCWxpYm5hbWU9JGxpYm5hbWVfc2F2ZQotCW5hbWU9JG5hbWVfc2F2ZQotCi0JaWYgdGVzdCAiJGRyb3BwZWRkZXBzIiA9IHllczsgdGhlbgotCSAgaWYgdGVzdCAiJG1vZHVsZSIgPSB5ZXM7IHRoZW4KLQkgICAgZWNobwotCSAgICBlY2hvICIqKiogV2FybmluZzogbGlidG9vbCBjb3VsZCBub3Qgc2F0aXNmeSBhbGwgZGVjbGFyZWQgaW50ZXItbGlicmFyeSIKLQkgICAgZWNobyAiKioqIGRlcGVuZGVuY2llcyBvZiBtb2R1bGUgJGxpYm5hbWUuICBUaGVyZWZvcmUsIGxpYnRvb2wgd2lsbCBjcmVhdGUiCi0JICAgIGVjaG8gIioqKiBhIHN0YXRpYyBtb2R1bGUsIHRoYXQgc2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB0aGUgZGxvcGVuaW5nIgotCSAgICBlY2hvICIqKiogYXBwbGljYXRpb24gaXMgbGlua2VkIHdpdGggdGhlIC1kbG9wZW4gZmxhZy4iCi0JICAgIGlmIHRlc3QgLXogIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICAgICAgZWNobwotCSAgICAgIGVjaG8gIioqKiBIb3dldmVyLCB0aGlzIHdvdWxkIG9ubHkgd29yayBpZiBsaWJ0b29sIHdhcyBhYmxlIHRvIGV4dHJhY3Qgc3ltYm9sIgotCSAgICAgIGVjaG8gIioqKiBsaXN0cyBmcm9tIGEgcHJvZ3JhbSwgdXNpbmcgXGBubScgb3IgZXF1aXZhbGVudCwgYnV0IGxpYnRvb2wgY291bGQiCi0JICAgICAgZWNobyAiKioqIG5vdCBmaW5kIHN1Y2ggYSBwcm9ncmFtLiAgU28sIHRoaXMgbW9kdWxlIGlzIHByb2JhYmx5IHVzZWxlc3MuIgotCSAgICAgIGVjaG8gIioqKiBcYG5tJyBmcm9tIEdOVSBiaW51dGlscyBhbmQgYSBmdWxsIHJlYnVpbGQgbWF5IGhlbHAuIgotCSAgICBmaQotCSAgICBpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0gbm87IHRoZW4KLQkgICAgICBvbGRsaWJzPSIkb3V0cHV0X29iamRpci8kbGlibmFtZS4kbGliZXh0IgotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1tb2R1bGUKLQkgICAgICBidWlsZF9vbGRfbGlicz15ZXMKLQkgICAgZWxzZQotCSAgICAgIGJ1aWxkX2xpYnRvb2xfbGlicz1ubwotCSAgICBmaQotCSAgICBkbG5hbWU9Ci0JICAgIGxpYnJhcnlfbmFtZXM9Ci0JICBlbHNlCi0JICAgIGVjaG8gIioqKiBUaGUgaW50ZXItbGlicmFyeSBkZXBlbmRlbmNpZXMgdGhhdCBoYXZlIGJlZW4gZHJvcHBlZCBoZXJlIHdpbGwgYmUiCi0JICAgIGVjaG8gIioqKiBhdXRvbWF0aWNhbGx5IGFkZGVkIHdoZW5ldmVyIGEgcHJvZ3JhbSBpcyBsaW5rZWQgd2l0aCB0aGlzIGxpYnJhcnkiCi0JICAgIGVjaG8gIioqKiBvciBpcyBkZWNsYXJlZCB0byAtZGxvcGVuIGl0LiIKLQkgIGZpCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgICMgdGVzdCBhZ2Fpbiwgd2UgbWF5IGhhdmUgZGVjaWRlZCBub3QgdG8gYnVpbGQgaXQgYW55IG1vcmUKLSAgICAgIGlmIHRlc3QgIiRidWlsZF9saWJ0b29sX2xpYnMiID0geWVzOyB0aGVuCi0JZGVwbGlicz0kbmV3ZGVwbGlicwotCSMgRG9uZSBjaGVja2luZyBkZXBsaWJzIQotIAotCSMgR2V0IHRoZSByZWFsIGFuZCBsaW5rIG5hbWVzIG9mIHRoZSBsaWJyYXJ5LgotCWV2YWwgbGlicmFyeV9uYW1lcz1cIiRsaWJyYXJ5X25hbWVzX3NwZWNcIgotCXNldCBkdW1teSAkbGlicmFyeV9uYW1lcwotCXJlYWxuYW1lPSIkMiIKLQlzaGlmdDsgc2hpZnQKLQotCWlmIHRlc3QgLW4gIiRzb25hbWVfc3BlYyI7IHRoZW4KLQkgIGV2YWwgc29uYW1lPVwiJHNvbmFtZV9zcGVjXCIKLQllbHNlCi0JICBzb25hbWU9IiRyZWFsbmFtZSIKLQlmaQotCi0JbGliPSIkb3V0cHV0X29iamRpci8kcmVhbG5hbWUiCi0JZm9yIGxpbmsKLQlkbwotCSAgbGlua25hbWVzPSIkbGlua25hbWVzICRsaW5rIgotCWRvbmUKLQotCSMgRW5zdXJlIHRoYXQgd2UgaGF2ZSAubyBvYmplY3RzIGZvciBsaW5rZXJzIHdoaWNoIGRpc2xpa2UgLmxvCi0JIyAoZS5nLiBhaXgpIGluY2FzZSB3ZSBhcmUgcnVubmluZyAtLWRpc2FibGUtc3RhdGljCi0JZm9yIG9iaiBpbiAkbGlib2JqczsgZG8KLQkgIG9sZG9iaj1gJGVjaG8gIlgkb2JqIiB8ICRYc2VkIC1lICIkbG8ybyJgCi0JICB0ZXN0IC1mICRvbGRvYmogfHwgJHtMTl9TfSAkb2JqICRvbGRvYmoKLQlkb25lCi0KLQkjIFVzZSBzdGFuZGFyZCBvYmplY3RzIGlmIHRoZXkgYXJlIHBpYwotCXRlc3QgLXogIiRwaWNfZmxhZyIgJiYgbGlib2Jqcz1gJGVjaG8gIlgkbGlib2JqcyIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0JaWYgdGVzdCAtbiAiJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGNvbnZlbmllbmNlIjsgdGhlbgotCSAgICBldmFsIGxpYm9ianM9XCJcJGxpYm9ianMgJHdob2xlX2FyY2hpdmVfZmxhZ19zcGVjXCIKLQkgIGZpCi0JZWxzZQotCSAgZm9yIHhsaWIgaW4gJGNvbnZlbmllbmNlOyBkbwotCSAgICAjIEV4dHJhY3QgdGhlIG9iamVjdHMuCi0JICAgIHhkaXI9IiR4bGliIngKLQkgICAgZ2VuZXJhdGVkPSIkZ2VuZXJhdGVkICR4ZGlyIgotCSAgICB4bGliPWAkZWNobyAiWCR4bGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLQkgICAgJHNob3cgIiR7cm19ciAkeGRpciIKLQkgICAgJHJ1biAke3JtfXIgIiR4ZGlyIgotCSAgICAkc2hvdyAibWtkaXIgJHhkaXIiCi0JICAgICRydW4gbWtkaXIgIiR4ZGlyIgotCSAgICBzdGF0dXM9JD8KLQkgICAgaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAiJHhkaXIiOyB0aGVuCi0JICAgICAgZXhpdCAkc3RhdHVzCi0JICAgIGZpCi0JICAgICRzaG93ICIoY2QgJHhkaXIgJiYgJEFSIHggLi4vJHhsaWIpIgotCSAgICAkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggLi4vXCR4bGliKSIgfHwgZXhpdCAkPwotCi0JICAgIGxpYm9ianM9IiRsaWJvYmpzICJgZmluZCAkeGRpciAtbmFtZSBcKi5vIC1wcmludCAtbyAtbmFtZSBcKi5sbyAtcHJpbnQgfCAkTkwyU1BgCi0JICBkb25lCi0JZmkKLQotCWlmIHRlc3QgIiR0aHJlYWRfc2FmZSIgPSB5ZXMgJiYgdGVzdCAtbiAiJHRocmVhZF9zYWZlX2ZsYWdfc3BlYyI7IHRoZW4KLQkgIGV2YWwgZmxhZz1cIiR0aHJlYWRfc2FmZV9mbGFnX3NwZWNcIgotCi0JICBsaW5rb3B0cz0iJGxpbmtvcHRzICRmbGFnIgotCWZpCi0KLQkjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCWlmIHRlc3QgLXogIiRleHBvcnRfc3ltYm9scyI7IHRoZW4KLQkgIGlmIHRlc3QgIiRhbHdheXNfZXhwb3J0X3N5bWJvbHMiID0geWVzIHx8IHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgJHNob3cgImdlbmVyYXRpbmcgc3ltYm9sIGxpc3QgZm9yIFxgJGxpYm5hbWUubGEnIgotCSAgICBleHBvcnRfc3ltYm9scz0iJG9iamRpci8kbGlibmFtZS5leHAiCi0JICAgICRydW4gJHJtICRleHBvcnRfc3ltYm9scwotCSAgICBldmFsIGNtZHM9XCIkZXhwb3J0X3N5bWJvbHNfY21kc1wiCi0JICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgICAgJHNob3cgIiRjbWQiCi0JICAgICAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkc2hvdyAiZWdyZXAgLWUgXCIkZXhwb3J0X3N5bWJvbHNfcmVnZXhcIiBcIiRleHBvcnRfc3ltYm9sc1wiID4gXCIke2V4cG9ydF9zeW1ib2xzfVRcIiIKLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkZXhwb3J0X3N5bWJvbHMiID4gIiR7ZXhwb3J0X3N5bWJvbHN9VCInCi0JICAgICAgJHNob3cgIiRtdiBcIiR7ZXhwb3J0X3N5bWJvbHN9VFwiIFwiJGV4cG9ydF9zeW1ib2xzXCIiCi0JICAgICAgJHJ1biBldmFsICckbXYgIiR7ZXhwb3J0X3N5bWJvbHN9VCIgIiRleHBvcnRfc3ltYm9scyInCi0JICAgIGZpCi0JICBmaQotCWZpCi0KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRpbmNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAkcnVuIGV2YWwgJyRlY2hvICJYJGluY2x1ZGVfZXhwc3ltcyIgfCAkU1AyTkwgPj4gIiRleHBvcnRfc3ltYm9scyInCi0JZmkKLQotCSMgRG8gZWFjaCBvZiB0aGUgYXJjaGl2ZSBjb21tYW5kcy4KLQlpZiB0ZXN0IC1uICIkZXhwb3J0X3N5bWJvbHMiICYmIHRlc3QgLW4gIiRhcmNoaXZlX2V4cHN5bV9jbWRzIjsgdGhlbgotCSAgZXZhbCBjbWRzPVwiJGFyY2hpdmVfZXhwc3ltX2NtZHNcIgotCWVsc2UKLQkgIGV2YWwgY21kcz1cIiRhcmNoaXZlX2NtZHNcIgotCWZpCi0JSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQlmb3IgY21kIGluICRjbWRzOyBkbwotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JICAkc2hvdyAiJGNtZCIKLQkgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCWRvbmUKLQlJRlM9IiRzYXZlX2lmcyIKLQotCSMgQ3JlYXRlIGxpbmtzIHRvIHRoZSByZWFsIGxpYnJhcnkuCi0JZm9yIGxpbmtuYW1lIGluICRsaW5rbmFtZXM7IGRvCi0JICBpZiB0ZXN0ICIkcmVhbG5hbWUiICE9ICIkbGlua25hbWUiOyB0aGVuCi0JICAgICRzaG93ICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKSIKLQkgICAgJHJ1biBldmFsICcoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRsaW5rbmFtZSAmJiAkTE5fUyAkcmVhbG5hbWUgJGxpbmtuYW1lKScgfHwgZXhpdCAkPwotCSAgZmkKLQlkb25lCi0KLQkjIElmIC1tb2R1bGUgb3IgLWV4cG9ydC1keW5hbWljIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgZGxuYW1lLgotCWlmIHRlc3QgIiRtb2R1bGUiID0geWVzIHx8IHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSB5ZXM7IHRoZW4KLQkgICMgT24gYWxsIGtub3duIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGVzZSBhcmUgaWRlbnRpY2FsLgotCSAgZGxuYW1lPSIkc29uYW1lIgotCWZpCi0gICAgICBmaQotICAgICAgOzsKLQotICAgICoubG8gfCAqLm8gfCAqLm9iaikKLSAgICAgIGlmIHRlc3QgLW4gIiRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBjYW5ub3QgbGluayBsaWJ0b29sIGxpYnJhcmllcyBpbnRvIG9iamVjdHMiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkZXBsaWJzIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IFxgLWwnIGFuZCBcYC1MJyBhcmUgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1kbG9wZW4nIGlzIGlnbm9yZWQgZm9yIG9iamVjdHMiIDE+JjIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1ycGF0aCcgaXMgaWdub3JlZCBmb3Igb2JqZWN0cyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAtbiAiJHhycGF0aCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1SJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkdmluZm8iOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAtdmVyc2lvbi1pbmZvJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBvYmplY3RzIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkb3V0cHV0IiBpbgotICAgICAgKi5sbykKLQlpZiB0ZXN0IC1uICIkb2JqcyI7IHRoZW4KLQkgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBidWlsZCBsaWJyYXJ5IG9iamVjdCBcYCRvdXRwdXQnIGZyb20gbm9uLWxpYnRvb2wgb2JqZWN0cyIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQlsaWJvYmo9IiRvdXRwdXQiCi0Jb2JqPWAkZWNobyAiWCRvdXRwdXQiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQk7OwotICAgICAgKikKLQlsaWJvYmo9Ci0Jb2JqPSIkb3V0cHV0IgotCTs7Ci0gICAgICBlc2FjCi0KLSAgICAgICMgRGVsZXRlIHRoZSBvbGQgb2JqZWN0cy4KLSAgICAgICRydW4gJHJtICRvYmogJGxpYm9iagotCi0gICAgICAjIENyZWF0ZSB0aGUgb2xkLXN0eWxlIG9iamVjdC4KLSAgICAgIHJlbG9hZF9vYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianMiIHwgJFNQMk5MIHwgJFhzZWQgLWUgJy9cLicke2xpYmV4dH0kJy9kJyAtZSAnL1wubGliJC9kJyAtZSAiJGxvMm8iIHwgJE5MMlNQYAotCi0gICAgICBvdXRwdXQ9IiRvYmoiCi0gICAgICBldmFsIGNtZHM9XCIkcmVsb2FkX2NtZHNcIgotICAgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLSAgICAgIGZvciBjbWQgaW4gJGNtZHM7IGRvCi0JSUZTPSIkc2F2ZV9pZnMiCi0JJHNob3cgIiRjbWQiCi0JJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0gICAgICBkb25lCi0gICAgICBJRlM9IiRzYXZlX2lmcyIKLQotICAgICAgIyBFeGl0IGlmIHdlIGFyZW4ndCBkb2luZyBhIGxpYnJhcnkgb2JqZWN0IGZpbGUuCi0gICAgICB0ZXN0IC16ICIkbGlib2JqIiAmJiBleGl0IDAKLQotICAgICAgaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JIyBDcmVhdGUgYW4gaW52YWxpZCBsaWJ0b29sIG9iamVjdCBpZiBubyBQSUMsIHNvIHRoYXQgd2UgZG9uJ3QKLQkjIGFjY2lkZW50YWxseSBsaW5rIGl0IGludG8gYSBwcm9ncmFtLgotCSRzaG93ICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiCi0JJHJ1biBldmFsICJlY2hvIHRpbWVzdGFtcCA+ICRsaWJvYmoiIHx8IGV4aXQgJD8KLQlleGl0IDAKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRwaWNfZmxhZyI7IHRoZW4KLQkjIE9ubHkgZG8gY29tbWFuZHMgaWYgd2UgcmVhbGx5IGhhdmUgZGlmZmVyZW50IFBJQyBvYmplY3RzLgotCXJlbG9hZF9vYmpzPSIkbGlib2JqcyIKLQlvdXRwdXQ9IiRsaWJvYmoiCi0JZXZhbCBjbWRzPVwiJHJlbG9hZF9jbWRzXCIKLQlJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCWZvciBjbWQgaW4gJGNtZHM7IGRvCi0JICBJRlM9IiRzYXZlX2lmcyIKLQkgICRzaG93ICIkY21kIgotCSAgJHJ1biBldmFsICIkY21kIiB8fCBleGl0ICQ/Ci0JZG9uZQotCUlGUz0iJHNhdmVfaWZzIgotICAgICAgZWxzZQotCSMgSnVzdCBjcmVhdGUgYSBzeW1saW5rLgotCSRzaG93ICRybSAkbGlib2JqCi0JJHJ1biAkcm0gJGxpYm9iagotCSRzaG93ICIkTE5fUyAkb2JqICRsaWJvYmoiCi0JJHJ1biAkTE5fUyAkb2JqICRsaWJvYmogfHwgZXhpdCAkPwotICAgICAgZmkKLQotICAgICAgZXhpdCAwCi0gICAgICA7OwotCi0gICAgIyBBbnl0aGluZyBlbHNlIHNob3VsZCBiZSBhIHByb2dyYW0uCi0gICAgKikKLSAgICAgIGlmIHRlc3QgLW4gIiR2aW5mbyI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC12ZXJzaW9uLWluZm8nIGlzIGlnbm9yZWQgZm9yIHByb2dyYW1zIiAxPiYyCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsZWFzZSI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYC1yZWxlYXNlJyBpcyBpZ25vcmVkIGZvciBwcm9ncmFtcyIgMT4mMgotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJHByZWxvYWQiID0geWVzOyB0aGVuCi0JaWYgdGVzdCAiJGRsb3BlbiIgPSB1bmtub3duICYmIHRlc3QgIiRkbG9wZW5fc2VsZiIgPSB1bmtub3duICYmCi0JICAgdGVzdCAiJGRsb3Blbl9zZWxmX3N0YXRpYyIgPSB1bmtub3duOyB0aGVuCi0JICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYEFDX0xJQlRPT0xfRExPUEVOJyBub3QgdXNlZC4gQXNzdW1pbmcgbm8gZGxvcGVuIHN1cHBvcnQuIgotCWZpIAotICAgICAgZmkKLSAgICAKLSAgICAgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzICYmIHRlc3QgIiRleHBvcnRfZHluYW1pYyIgPSBubzsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiBcYC1kbG9wZW4gc2VsZicgcmVxdWlyZXMgXGAtZXhwb3J0LWR5bmFtaWMnIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkcnBhdGgkeHJwYXRoIjsgdGhlbgotCSMgSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBycGF0aCBmbGFncywgdGhlbiBhZGQgdGhlbS4KLQlmb3IgbGliZGlyIGluICRycGF0aCAkeHJwYXRoOyBkbwotCSAgIyBUaGlzIGlzIHRoZSBtYWdpYyB0byB1c2UgLXJwYXRoLgotCSAgY2FzZSAiJGNvbXBpbGVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGNvbXBpbGVfcnBhdGg9IiRjb21waWxlX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JICBjYXNlICIkZmluYWxpemVfcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZpbmFsaXplX3JwYXRoPSIkZmluYWxpemVfcnBhdGggJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlkb25lCi0gICAgICBmaQotCi0gICAgICAjIE5vdyBoYXJkY29kZSB0aGUgbGlicmFyeSBwYXRocwotICAgICAgcnBhdGg9Ci0gICAgICBoYXJkY29kZV9saWJkaXJzPQotICAgICAgZm9yIGxpYmRpciBpbiAkY29tcGlsZV9ycGF0aCAkZmluYWxpemVfcnBhdGg7IGRvCi0JaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0JICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciI7IHRoZW4KLQkgICAgaWYgdGVzdCAteiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JICAgICAgaGFyZGNvZGVfbGliZGlycz0iJGxpYmRpciIKLQkgICAgZWxzZQotCSAgICAgICMgSnVzdCBhY2N1bXVsYXRlIHRoZSB1bmlxdWUgbGliZGlycy4KLQkgICAgICBjYXNlICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiIGluCi0JICAgICAgKiIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciRsaWJkaXIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIqKQotCQk7OwotCSAgICAgICopCi0JCWhhcmRjb2RlX2xpYmRpcnM9IiRoYXJkY29kZV9saWJkaXJzJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyIgotCQk7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgZXZhbCBmbGFnPVwiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWNcIgotCi0JICAgIHJwYXRoPSIkcnBhdGggJGZsYWciCi0JICBmaQotCWVsaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotCSAgY2FzZSAiJHBlcm1fcnBhdGggIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIHBlcm1fcnBhdGg9IiRwZXJtX3JwYXRoICRsaWJkaXIiIDs7Ci0JICBlc2FjCi0JZmkKLSAgICAgIGRvbmUKLSAgICAgICMgU3Vic3RpdHV0ZSB0aGUgaGFyZGNvZGVkIGxpYmRpcnMgaW50byB0aGUgcnBhdGguCi0gICAgICBpZiB0ZXN0IC1uICIkaGFyZGNvZGVfbGliZGlyX3NlcGFyYXRvciIgJiYKLQkgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcnMiOyB0aGVuCi0JbGliZGlyPSIkaGFyZGNvZGVfbGliZGlycyIKLQlldmFsIHJwYXRoPVwiICRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLSAgICAgIGZpCi0gICAgICBjb21waWxlX3JwYXRoPSIkcnBhdGgiCi0KLSAgICAgIHJwYXRoPQotICAgICAgaGFyZGNvZGVfbGliZGlycz0KLSAgICAgIGZvciBsaWJkaXIgaW4gJGZpbmFsaXplX3JwYXRoOyBkbwotCWlmIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjIjsgdGhlbgotCSAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiOyB0aGVuCi0JICAgIGlmIHRlc3QgLXogIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCSAgICAgIGhhcmRjb2RlX2xpYmRpcnM9IiRsaWJkaXIiCi0JICAgIGVsc2UKLQkgICAgICAjIEp1c3QgYWNjdW11bGF0ZSB0aGUgdW5pcXVlIGxpYmRpcnMuCi0JICAgICAgY2FzZSAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yIiBpbgotCSAgICAgICoiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IkbGliZGlyJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiKikKLQkJOzsKLQkgICAgICAqKQotCQloYXJkY29kZV9saWJkaXJzPSIkaGFyZGNvZGVfbGliZGlycyRoYXJkY29kZV9saWJkaXJfc2VwYXJhdG9yJGxpYmRpciIKLQkJOzsKLQkgICAgICBlc2FjCi0JICAgIGZpCi0JICBlbHNlCi0JICAgIGV2YWwgZmxhZz1cIiRoYXJkY29kZV9saWJkaXJfZmxhZ19zcGVjXCIKLQotCSAgICBycGF0aD0iJHJwYXRoICRmbGFnIgotCSAgZmkKLQllbGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQkgIGNhc2UgIiRmaW5hbGl6ZV9wZXJtX3JwYXRoICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBmaW5hbGl6ZV9wZXJtX3JwYXRoPSIkZmluYWxpemVfcGVybV9ycGF0aCAkbGliZGlyIiA7OwotCSAgZXNhYwotCWZpCi0gICAgICBkb25lCi0gICAgICAjIFN1YnN0aXR1dGUgdGhlIGhhcmRjb2RlZCBsaWJkaXJzIGludG8gdGhlIHJwYXRoLgotICAgICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9zZXBhcmF0b3IiICYmCi0JIHRlc3QgLW4gIiRoYXJkY29kZV9saWJkaXJzIjsgdGhlbgotCWxpYmRpcj0iJGhhcmRjb2RlX2xpYmRpcnMiCi0JZXZhbCBycGF0aD1cIiAkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0gICAgICBmaQotICAgICAgZmluYWxpemVfcnBhdGg9IiRycGF0aCIKLQotICAgICAgb3V0cHV0X29iamRpcj1gJGVjaG8gIlgkb3V0cHV0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICBpZiB0ZXN0ICJYJG91dHB1dF9vYmpkaXIiID0gIlgkb3V0cHV0IjsgdGhlbgotCW91dHB1dF9vYmpkaXI9IiRvYmpkaXIiCi0gICAgICBlbHNlCi0Jb3V0cHV0X29iamRpcj0iJG91dHB1dF9vYmpkaXIvJG9iamRpciIKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRsaWJvYmpzIiAmJiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JIyBUcmFuc2Zvcm0gYWxsIHRoZSBsaWJyYXJ5IG9iamVjdHMgaW50byBzdGFuZGFyZCBvYmplY3RzLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmluYWxpemVfY29tbWFuZD1gJGVjaG8gIlgkZmluYWxpemVfY29tbWFuZCIgfCAkU1AyTkwgfCAkWHNlZCAtZSAiJGxvMm8iIHwgJE5MMlNQYAotICAgICAgZmkKLQotICAgICAgZGxzeW1zPQotICAgICAgaWYgdGVzdCAtbiAiJGRsZmlsZXMkZGxwcmVmaWxlcyIgfHwgdGVzdCAiJGRsc2VsZiIgPSB5ZXM7IHRoZW4KLQlpZiB0ZXN0IC1uICIkTk0iICYmIHRlc3QgLW4gIiRnbG9iYWxfc3ltYm9sX3BpcGUiOyB0aGVuCi0JICBkbHN5bXM9IiR7b3V0cHV0bmFtZX1TLmMiCi0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogbm90IGNvbmZpZ3VyZWQgdG8gZXh0cmFjdCBnbG9iYWwgc3ltYm9scyBmcm9tIGRscHJlb3BlbmVkIGZpbGVzIiAxPiYyCi0JZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRkbHN5bXMiOyB0aGVuCi0JY2FzZSAiJGRsc3ltcyIgaW4KLQkiIikgOzsKLQkqLmMpCi0JICAjIERpc2NvdmVyIHRoZSBubGlzdCBvZiBlYWNoIG9mIHRoZSBkbGZpbGVzLgotCSAgbmxpc3Q9IiRvYmpkaXIvJHtvdXRwdXR9Lm5tIgotCi0JICBpZiB0ZXN0IC1kICRvYmpkaXI7IHRoZW4KLQkgICAgJHNob3cgIiRybSAkbmxpc3QgJHtubGlzdH1TICR7bmxpc3R9VCIKLQkgICAgJHJ1biAkcm0gIiRubGlzdCIgIiR7bmxpc3R9UyIgIiR7bmxpc3R9VCIKLQkgIGVsc2UKLQkgICAgJHNob3cgIiRta2RpciAkb2JqZGlyIgotCSAgICAkcnVuICRta2RpciAkb2JqZGlyCi0JICAgIHN0YXR1cz0kPwotCSAgICBpZiB0ZXN0ICRzdGF0dXMgLW5lIDAgJiYgdGVzdCAhIC1kICRvYmpkaXI7IHRoZW4KLQkgICAgICBleGl0ICRzdGF0dXMKLQkgICAgZmkKLQkgIGZpCi0KLQkgICMgUGFyc2UgdGhlIG5hbWUgbGlzdCBpbnRvIGEgc291cmNlIGZpbGUuCi0JICAkc2hvdyAiY3JlYXRpbmcgJG9iamRpci8kZGxzeW1zIgotCi0JICAkZWNobyA+ICIkb2JqZGlyLyRkbHN5bXMiICJcCi0vKiAkZGxzeW1zIC0gc3ltYm9sIHJlc29sdXRpb24gdGFibGUgZm9yIFxgJG91dHB1dG5hbWUnIGRsc3ltIGVtdWxhdGlvbi4gKi8KLS8qIEdlbmVyYXRlZCBieSAkUFJPR1JBTSAtIEdOVSAkUEFDS0FHRSAkVkVSU0lPTiRUSU1FU1RBTVAgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gXCJDXCIgewotI2VuZGlmCi0KLS8qIFByZXZlbnQgdGhlIG9ubHkga2luZCBvZiBkZWNsYXJhdGlvbiBjb25mbGljdHMgd2UgY2FuIG1ha2UuICovCi0jZGVmaW5lIGx0X3ByZWxvYWRlZF9zeW1ib2xzIHNvbWVfb3RoZXJfc3ltYm9sCi0KLS8qIEV4dGVybmFsIHN5bWJvbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBjb21waWxlci4gKi9cCi0iCi0KLQkgIGlmIHRlc3QgIiRkbHNlbGYiID0geWVzOyB0aGVuCi0JICAgICRzaG93ICJnZW5lcmF0aW5nIHN5bWJvbCBsaXN0IGZvciBcYCRvdXRwdXQnIgotCi0JICAgIGVjaG8gJzogQFBST0dSQU1AICcgPiAiJG5saXN0IgotCi0JICAgICMgQWRkIG91ciBvd24gcHJvZ3JhbSBvYmplY3RzIHRvIHRoZSBzeW1ib2wgbGlzdC4KLQkgICAgcHJvZ2ZpbGVzPWAkZWNobyAiWCRvYmpzIiB8ICRTUDJOTCB8ICRYc2VkIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JICAgIGZvciBhcmcgaW4gJHByb2dmaWxlczsgZG8KLQkgICAgICAkc2hvdyAiZXh0cmFjdGluZyBnbG9iYWwgQyBzeW1ib2xzIGZyb20gXGAkYXJnJyIKLQkgICAgICAkcnVuIGV2YWwgIiROTSAkYXJnIHwgJGdsb2JhbF9zeW1ib2xfcGlwZSA+PiAnJG5saXN0JyIKLQkgICAgZG9uZQotCi0JICAgIGlmIHRlc3QgLW4gIiRleGNsdWRlX2V4cHN5bXMiOyB0aGVuCi0JICAgICAgJHJ1biBldmFsICdlZ3JlcCAtdiAiICgkZXhjbHVkZV9leHBzeW1zKSQiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgICAgCi0JICAgIGlmIHRlc3QgLW4gIiRleHBvcnRfc3ltYm9sc19yZWdleCI7IHRoZW4KLQkgICAgICAkcnVuIGV2YWwgJ2VncmVwIC1lICIkZXhwb3J0X3N5bWJvbHNfcmVnZXgiICIkbmxpc3QiID4gIiRubGlzdCJUJwotCSAgICAgICRydW4gZXZhbCAnJG12ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQotCSAgICAjIFByZXBhcmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgc3ltYm9scwotCSAgICBpZiB0ZXN0IC16ICIkZXhwb3J0X3N5bWJvbHMiOyB0aGVuCi0JICAgICAgZXhwb3J0X3N5bWJvbHM9IiRvYmpkaXIvJG91dHB1dC5leHAiCi0JICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgICAgJHJ1biBldmFsICJzZWQgLW4gLWUgJy9eOiBAUFJPR1JBTUAkL2QnIC1lICdzL14uKiBcKC4qXCkkL1wxL3AnICInPCAiJG5saXN0IiA+ICIkZXhwb3J0X3N5bWJvbHMiJwotCSAgICBlbHNlCi0JICAgICAgJHJ1biAkcm0gJGV4cG9ydF9zeW1ib2xzCi0JICAgICAgJHJ1biBldmFsICJzZWQgLWUgJ3MvXChbXVsuKl4kXVwpL1xcXDEvZycgLWUgJ3MvXi8gLycgLWUgJ3MvJC8kLyciJyA8ICIkZXhwb3J0X3N5bWJvbHMiID4gIiRvYmpkaXIvJG91dHB1dC5leHAiJwotCSAgICAgICRydW4gZXZhbCAnZ3JlcCAtZiAiJG9iamRpci8kb3V0cHV0LmV4cCIgPCAiJG5saXN0IiA+ICIkbmxpc3QiVCcKLQkgICAgICAkcnVuIGV2YWwgJ212ICIkbmxpc3QiVCAiJG5saXN0IicKLQkgICAgZmkKLQkgIGZpCi0KLQkgIGZvciBhcmcgaW4gJGRscHJlZmlsZXM7IGRvCi0JICAgICRzaG93ICJleHRyYWN0aW5nIGdsb2JhbCBDIHN5bWJvbHMgZnJvbSBcYCRhcmcnIgotCSAgICBuYW1lPWBlY2hvICIkYXJnIiB8IHNlZCAtZSAncyVeLiovJSUnYAotCSAgICAkcnVuIGV2YWwgJ2VjaG8gIjogJG5hbWUgIiA+PiAiJG5saXN0IicKLQkgICAgJHJ1biBldmFsICIkTk0gJGFyZyB8ICRnbG9iYWxfc3ltYm9sX3BpcGUgPj4gJyRubGlzdCciCi0JICBkb25lCi0KLQkgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0JICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYXQgbGVhc3QgYW4gZW1wdHkgZmlsZS4KLQkgICAgdGVzdCAtZiAiJG5saXN0IiB8fCA6ID4gIiRubGlzdCIKLQotCSAgICBpZiB0ZXN0IC1uICIkZXhjbHVkZV9leHBzeW1zIjsgdGhlbgotCSAgICAgIGVncmVwIC12ICIgKCRleGNsdWRlX2V4cHN5bXMpJCIgIiRubGlzdCIgPiAiJG5saXN0IlQKLQkgICAgICAkbXYgIiRubGlzdCJUICIkbmxpc3QiCi0JICAgIGZpCi0KLQkgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLQkgICAgaWYgZ3JlcCAtdiAiXjogIiA8ICIkbmxpc3QiIHwgc29ydCArMiB8IHVuaXEgPiAiJG5saXN0IlM7IHRoZW4KLQkgICAgICA6Ci0JICAgIGVsc2UKLQkgICAgICBncmVwIC12ICJeOiAiIDwgIiRubGlzdCIgPiAiJG5saXN0IlMKLQkgICAgZmkKLQotCSAgICBpZiB0ZXN0IC1mICIkbmxpc3QiUzsgdGhlbgotCSAgICAgIGV2YWwgIiRnbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJG5saXN0IlMgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiJwotCSAgICBlbHNlCi0JICAgICAgZWNobyAnLyogTk9ORSAqLycgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0JICAgIGZpCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0KLSN1bmRlZiBsdF9wcmVsb2FkZWRfc3ltYm9scwotCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotbHRfcHJlbG9hZGVkX3N5bWJvbHNbXSA9Ci17XAotIgotCi0JICAgIHNlZCAtbiAtZSAncy9eOiBcKFteIF0qXCkgJC8gIHtcIlwxXCIsIChsdF9wdHJfdCkgMH0sL3AnIFwKLQkJLWUgJ3MvXi4gXChbXiBdKlwpIFwoW14gXSpcKSQvICB7IlwyIiwgKGx0X3B0cl90KSBcJlwyfSwvcCcgXAotCQkgIDwgIiRubGlzdCIgPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiCi0KLQkgICAgJGVjaG8gPj4gIiRvdXRwdXRfb2JqZGlyLyRkbHN5bXMiICJcCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0vKiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gaW4gRnJlZUJTRCBsaW5rZXIgKi8KLSNpZmRlZiBGUkVFQlNEX1dPUktBUk9VTkQKLXN0YXRpYyBjb25zdCB2b2lkICpsdF9wcmVsb2FkZWRfc2V0dXAoKSB7Ci0gIHJldHVybiBsdF9wcmVsb2FkZWRfc3ltYm9sczsKLX0KLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZlwKLSIKLQkgIGZpCi0KLQkgIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0KLSAgICAgICAgICBjYXNlICIkaG9zdCIgaW4KLQkgICMgY29tcGlsaW5nIHRoZSBzeW1ib2wgdGFibGUgZmlsZSB3aXRoIHBpY19mbGFnIHdvcmtzIGFyb3VuZAotCSAgIyBhIEZyZWVCU0QgYnVnIHRoYXQgY2F1c2VzIHByb2dyYW1zIHRvIGNyYXNoIHdoZW4gLWxtIGlzCi0JICAjIGxpbmtlZCBiZWZvcmUgYW55IG90aGVyIFBJQyBvYmplY3QuICBCdXQgd2UgbXVzdCBub3QgdXNlCi0JICAjIHBpY19mbGFnIHdoZW4gbGlua2luZyB3aXRoIC1zdGF0aWMuICBUaGUgcHJvYmxlbSBleGlzdHMgaW4KLQkgICMgRnJlZUJTRCAyLjIuNiBhbmQgaXMgZml4ZWQgaW4gRnJlZUJTRCAzLjEuCi0JICAqLSotZnJlZWJzZDIqfCotKi1mcmVlYnNkMy4wKikKLQkgICAgY2FzZSAiJGNvbXBpbGVfY29tbWFuZCAiIGluCi0JICAgICoiIC1zdGF0aWMgIiopIDs7Ci0JICAgICopIHBpY19mbGFnX2Zvcl9zeW10YWJsZT0iICRwaWNfZmxhZyAtRFBJQyAtREZSRUVCU0RfV09SS0FST1VORCI7OwotCSAgICBlc2FjCi0JICBlc2FjCi0KLQkgICMgTm93IGNvbXBpbGUgdGhlIGR5bmFtaWMgc3ltYm9sIGZpbGUuCi0JICAkc2hvdyAiKGNkICRvYmpkaXIgJiYgJENfY29tcGlsZXIgLWMkbm9fYnVpbHRpbl9mbGFnJHBpY19mbGFnX2Zvcl9zeW10YWJsZSBcIiRkbHN5bXNcIikiCi0JICAkcnVuIGV2YWwgJyhjZCAkb2JqZGlyICYmICRDX2NvbXBpbGVyIC1jJG5vX2J1aWx0aW5fZmxhZyRwaWNfZmxhZ19mb3Jfc3ltdGFibGUgIiRkbHN5bXMiKScgfHwgZXhpdCAkPwotCi0JICAjIFRyYW5zZm9ybSB0aGUgc3ltYm9sIGZpbGUgaW50byB0aGUgY29ycmVjdCBuYW1lLgotCSAgY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy4ke29iamV4dH0lImAKLQkgIGZpbmFsaXplX2NvbW1hbmQ9YCRlY2hvICJYJGZpbmFsaXplX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlQFNZTUZJTEVAJSRvYmpkaXIvJHtvdXRwdXR9Uy4ke29iamV4dH0lImAKLQkgIDs7Ci0JKikKLQkgICRlY2hvICIkbW9kZW5hbWU6IHVua25vd24gc3VmZml4IGZvciBcYCRkbHN5bXMnIiAxPiYyCi0JICBleGl0IDEKLQkgIDs7Ci0JZXNhYwotICAgICAgZWxzZQotCSMgV2Uga2VlcCBnb2luZyBqdXN0IGluIGNhc2UgdGhlIHVzZXIgZGlkbid0IHJlZmVyIHRvCi0JIyBsdF9wcmVsb2FkZWRfc3ltYm9scy4gIFRoZSBsaW5rZXIgd2lsbCBmYWlsIGlmIGdsb2JhbF9zeW1ib2xfcGlwZQotCSMgcmVhbGx5IHdhcyByZXF1aXJlZC4KLQotCSMgTnVsbGlmeSB0aGUgc3ltYm9sIGZpbGUuCi0JY29tcGlsZV9jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX2NvbW1hbmQiIHwgJFhzZWQgLWUgInMlIEBTWU1GSUxFQCUlImAKLQlmaW5hbGl6ZV9jb21tYW5kPWAkZWNobyAiWCRmaW5hbGl6ZV9jb21tYW5kIiB8ICRYc2VkIC1lICJzJSBAU1lNRklMRUAlJSJgCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC16ICIkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicyIgfHwgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgIT0geWVzOyB0aGVuCi0JIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCWNvbXBpbGVfY29tbWFuZD1gJGVjaG8gIlgkY29tcGlsZV9jb21tYW5kIiB8ICRYc2VkIC1lICdzJUBPVVRQVVRAJSciJG91dHB1dCInJWcnYAotCWxpbmtfY29tbWFuZD0iJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCi0JIyBXZSBoYXZlIG5vIHVuaW5zdGFsbGVkIGxpYnJhcnkgZGVwZW5kZW5jaWVzLCBzbyBmaW5hbGl6ZSByaWdodCBub3cuCi0JJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0JJHJ1biBldmFsICIkbGlua19jb21tYW5kIgotCWV4aXQgJD8KLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgLW4gIiRzaGxpYnBhdGhfdmFyIjsgdGhlbgotCSMgV2Ugc2hvdWxkIHNldCB0aGUgc2hsaWJwYXRoX3ZhcgotCXJwYXRoPQotCWZvciBkaXIgaW4gJHRlbXBfcnBhdGg7IGRvCi0JICBjYXNlICIkZGlyIiBpbgotCSAgLyogfCBbQS1aYS16XTpbL1xcXSopCi0JICAgICMgQWJzb2x1dGUgcGF0aC4KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgICA7OwotCSAgKikKLQkgICAgIyBSZWxhdGl2ZSBwYXRoOiBhZGQgYSB0aGlzZGlyIGVudHJ5LgotCSAgICBycGF0aD0iJHJwYXRoXCR0aGlzZGlyLyRkaXI6IgotCSAgICA7OwotCSAgZXNhYwotCWRvbmUKLQl0ZW1wX3JwYXRoPSIkcnBhdGgiCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0IC1uICIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoIjsgdGhlbgotCWNvbXBpbGVfY29tbWFuZD0iJHNobGlicGF0aF92YXI9XCIkY29tcGlsZV9zaGxpYnBhdGgkZmluYWxpemVfc2hsaWJwYXRoXCQkc2hsaWJwYXRoX3ZhclwiICRjb21waWxlX2NvbW1hbmQiCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAtbiAiJGZpbmFsaXplX3NobGlicGF0aCI7IHRoZW4KLQlmaW5hbGl6ZV9jb21tYW5kPSIkc2hsaWJwYXRoX3Zhcj1cIiRmaW5hbGl6ZV9zaGxpYnBhdGhcJCRzaGxpYnBhdGhfdmFyXCIgJGZpbmFsaXplX2NvbW1hbmQiCi0gICAgICBmaQotCi0gICAgICBjb21waWxlX3Zhcj0KLSAgICAgIGZpbmFsaXplX3Zhcj0KLSAgICAgIGlmIHRlc3QgLW4gIiRydW5wYXRoX3ZhciI7IHRoZW4KLQlpZiB0ZXN0IC1uICIkcGVybV9ycGF0aCI7IHRoZW4KLQkgICMgV2Ugc2hvdWxkIHNldCB0aGUgcnVucGF0aF92YXIuCi0JICBycGF0aD0KLQkgIGZvciBkaXIgaW4gJHBlcm1fcnBhdGg7IGRvCi0JICAgIHJwYXRoPSIkcnBhdGgkZGlyOiIKLQkgIGRvbmUKLQkgIGNvbXBpbGVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotCWlmIHRlc3QgLW4gIiRmaW5hbGl6ZV9wZXJtX3JwYXRoIjsgdGhlbgotCSAgIyBXZSBzaG91bGQgc2V0IHRoZSBydW5wYXRoX3Zhci4KLQkgIHJwYXRoPQotCSAgZm9yIGRpciBpbiAkZmluYWxpemVfcGVybV9ycGF0aDsgZG8KLQkgICAgcnBhdGg9IiRycGF0aCRkaXI6IgotCSAgZG9uZQotCSAgZmluYWxpemVfdmFyPSIkcnVucGF0aF92YXI9XCIkcnBhdGhcJCRydW5wYXRoX3ZhclwiICIKLQlmaQotICAgICAgZmkKLQotICAgICAgaWYgdGVzdCAiJGhhcmRjb2RlX2FjdGlvbiIgPSByZWxpbms7IHRoZW4KLQkjIEZhc3QgaW5zdGFsbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQKLQlsaW5rX2NvbW1hbmQ9IiRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIKLQlyZWxpbmtfY29tbWFuZD0iJGZpbmFsaXplX3ZhciRmaW5hbGl6ZV9jb21tYW5kJGZpbmFsaXplX3JwYXRoIgotCQotCSMgQUdIISBGbGFtZSB0aGUgQUlYIGFuZCBIUC1VWCBwZW9wbGUgZm9yIG1lLCB3aWxsIHlhPwotCSRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHRoaXMgcGxhdGZvcm0gZG9lcyBub3QgbGlrZSB1bmluc3RhbGxlZCBzaGFyZWQgbGlicmFyaWVzIiAxPiYyCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkb3V0cHV0JyB3aWxsIGJlIHJlbGlua2VkIGR1cmluZyBpbnN0YWxsYXRpb24iIDE+JjIKLSAgICAgIGVsc2UKLQlpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiAhPSBubzsgdGhlbgotCSAgbGlua19jb21tYW5kPSIkZmluYWxpemVfdmFyJGNvbXBpbGVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQkgIGlmIHRlc3QgIiRmYXN0X2luc3RhbGwiID0geWVzOyB0aGVuCi0JICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRjb21waWxlX3ZhciRjb21waWxlX2NvbW1hbmQkY29tcGlsZV9ycGF0aCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCVcJHByb2dkaXIvXCRmaWxlJWcnYAotCSAgZWxzZQotCSAgICAjIGZhc3RfaW5zdGFsbCBpcyBzZXQgdG8gbmVlZGxlc3MKLQkgICAgcmVsaW5rX2NvbW1hbmQ9Ci0JICBmaQotCWVsc2UKLQkgIGxpbmtfY29tbWFuZD0iJGNvbXBpbGVfdmFyJGNvbXBpbGVfY29tbWFuZCRjb21waWxlX3JwYXRoIgotCSAgcmVsaW5rX2NvbW1hbmQ9IiRmaW5hbGl6ZV92YXIkZmluYWxpemVfY29tbWFuZCRmaW5hbGl6ZV9ycGF0aCIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotICAgICAgbGlua19jb21tYW5kPWAkZWNobyAiWCRsaW5rX2NvbW1hbmQiIHwgJFhzZWQgLWUgJ3MlQE9VVFBVVEAlJyIkb3V0cHV0X29iamRpci8kb3V0cHV0bmFtZSInJWcnYAotICAgICAgCi0gICAgICAjIENyZWF0ZSB0aGUgYmluYXJ5IGluIHRoZSBvYmplY3QgZGlyZWN0b3J5LCB0aGVuIHdyYXAgaXQuCi0gICAgICBpZiB0ZXN0ICEgLWQgJG91dHB1dF9vYmpkaXI7IHRoZW4KLQkkc2hvdyAiJG1rZGlyICRvdXRwdXRfb2JqZGlyIgotCSRydW4gJG1rZGlyICRvdXRwdXRfb2JqZGlyCi0Jc3RhdHVzPSQ/Ci0JaWYgdGVzdCAkc3RhdHVzIC1uZSAwICYmIHRlc3QgISAtZCAkb2JqZGlyOyB0aGVuCi0JICBleGl0ICRzdGF0dXMKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBEZWxldGUgdGhlIG9sZCBvdXRwdXQgZmlsZS4KLSAgICAgICRydW4gJHJtICRvdXRwdXQgJG91dHB1dF9vYmpkaXIvJG91dHB1dG5hbWUgJG91dHB1dF9vYmpkaXIvbHQtJG91dHB1dG5hbWUKLQotICAgICAgJHNob3cgIiRsaW5rX2NvbW1hbmQiCi0gICAgICAkcnVuIGV2YWwgIiRsaW5rX2NvbW1hbmQiIHx8IGV4aXQgJD8KLQotICAgICAgIyBOb3cgY3JlYXRlIHRoZSB3cmFwcGVyIHNjcmlwdC4KLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICAjIFF1b3RlIHRoZSByZWxpbmsgY29tbWFuZCBmb3Igc2hpcHBpbmcuCi0gICAgICBpZiB0ZXN0IC1uICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuCi0JcmVsaW5rX2NvbW1hbmQ9YCRlY2hvICJYJHJlbGlua19jb21tYW5kIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGZpCi0KLSAgICAgICMgUXVvdGUgJGVjaG8gZm9yIHNoaXBwaW5nLgotICAgICAgaWYgdGVzdCAiWCRlY2hvIiA9ICJYJFNIRUxMICQwIC0tZmFsbGJhY2stZWNobyI7IHRoZW4KLQljYXNlICIkMCIgaW4KLQkvKiB8IFtBLVphLXpdOlsvXFxdKikgcWVjaG89IiRTSEVMTCAkMCAtLWZhbGxiYWNrLWVjaG8iOzsKLQkqKSBxZWNobz0iJFNIRUxMIGBwd2RgLyQwIC0tZmFsbGJhY2stZWNobyI7OwotCWVzYWMKLQlxZWNobz1gJGVjaG8gIlgkcWVjaG8iIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgZWxzZQotCXFlY2hvPWAkZWNobyAiWCRlY2hvIiB8ICRYc2VkIC1lICIkc2VkX3F1b3RlX3N1YnN0ImAKLSAgICAgIGZpCi0KLSAgICAgICMgT25seSBhY3R1YWxseSBkbyB0aGluZ3MgaWYgb3VyIHJ1biBjb21tYW5kIGlzIG5vbi1udWxsLgotICAgICAgaWYgdGVzdCAteiAiJHJ1biI7IHRoZW4KLQkjIHdpbjMyIHdpbGwgdGhpbmsgdGhlIHNjcmlwdCBpcyBhIGJpbmFyeSBpZiBpdCBoYXMKLQkjIGEgLmV4ZSBzdWZmaXgsIHNvIHdlIHN0cmlwIGl0IG9mZiBoZXJlLgotCWNhc2UgJG91dHB1dCBpbgotCSAgKi5leGUpIG91dHB1dD1gZWNobyAkb3V0cHV0fHNlZCAncywuZXhlJCwsJ2AgOzsKLQllc2FjCi0JJHJtICRvdXRwdXQKLQl0cmFwICIkcm0gJG91dHB1dDsgZXhpdCAxIiAxIDIgMTUKLQotCSRlY2hvID4gJG91dHB1dCAiXAotIyEgJFNIRUxMCi0KLSMgJG91dHB1dCAtIHRlbXBvcmFyeSB3cmFwcGVyIHNjcmlwdCBmb3IgJG9iamRpci8kb3V0cHV0bmFtZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0jCi0jIFRoZSAkb3V0cHV0IHByb2dyYW0gY2Fubm90IGJlIGRpcmVjdGx5IGV4ZWN1dGVkIHVudGlsIGFsbCB0aGUgbGlidG9vbAotIyBsaWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBpbnN0YWxsZWQuCi0jCi0jIFRoaXMgd3JhcHBlciBzY3JpcHQgc2hvdWxkIG5ldmVyIGJlIG1vdmVkIG91dCBvZiB0aGUgYnVpbGQgZGlyZWN0b3J5LgotIyBJZiBpdCBpcywgaXQgd2lsbCBub3Qgb3BlcmF0ZSBjb3JyZWN0bHkuCi0KLSMgU2VkIHN1YnN0aXR1dGlvbiB0aGF0IGhlbHBzIHVzIGRvIHJvYnVzdCBxdW90aW5nLiAgSXQgYmFja3NsYXNoaWZpZXMKLSMgbWV0YWNoYXJhY3RlcnMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlIHdpdGhpbiBkb3VibGUtcXVvdGVkIHN0cmluZ3MuCi1Yc2VkPSdzZWQgLWUgMXMvXlgvLycKLXNlZF9xdW90ZV9zdWJzdD0nJHNlZF9xdW90ZV9zdWJzdCcKLQotIyBUaGUgSFAtVVgga3NoIGFuZCBQT1NJWCBzaGVsbCBwcmludCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBzdGRvdXQKLSMgaWYgQ0RQQVRIIGlzIHNldC4KLWlmIHRlc3QgXCJcJHtDRFBBVEgrc2V0fVwiID0gc2V0OyB0aGVuIENEUEFUSD07IGV4cG9ydCBDRFBBVEg7IGZpCi0KLXJlbGlua19jb21tYW5kPVwiJHJlbGlua19jb21tYW5kXCIKLQotIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGRldGVybWluZXMgb3VyIG9wZXJhdGlvbiBtb2RlLgotaWYgdGVzdCBcIlwkbGlidG9vbF9pbnN0YWxsX21hZ2ljXCIgPSBcIiRtYWdpY1wiOyB0aGVuCi0gICMgaW5zdGFsbCBtb2RlIG5lZWRzIHRoZSBmb2xsb3dpbmcgdmFyaWFibGU6Ci0gIGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnM9JyRsaW5rX2FnYWluc3RfbGlidG9vbF9saWJzJwotZWxzZQotICAjIFdoZW4gd2UgYXJlIHNvdXJjZWQgaW4gZXhlY3V0ZSBtb2RlLCBcJGZpbGUgYW5kIFwkZWNobyBhcmUgYWxyZWFkeSBzZXQuCi0gIGlmIHRlc3QgXCJcJGxpYnRvb2xfZXhlY3V0ZV9tYWdpY1wiICE9IFwiJG1hZ2ljXCI7IHRoZW4KLSAgICBlY2hvPVwiJHFlY2hvXCIKLSAgICBmaWxlPVwiXCQwXCIKLSAgICAjIE1ha2Ugc3VyZSBlY2hvIHdvcmtzLgotICAgIGlmIHRlc3QgXCJYXCQxXCIgPSBYLS1uby1yZWV4ZWM7IHRoZW4KLSAgICAgICMgRGlzY2FyZCB0aGUgLS1uby1yZWV4ZWMgZmxhZywgYW5kIGNvbnRpbnVlLgotICAgICAgc2hpZnQKLSAgICBlbGlmIHRlc3QgXCJYXGAoXCRlY2hvICdcdCcpIDI+L2Rldi9udWxsXGBcIiA9ICdYXHQnOyB0aGVuCi0gICAgICAjIFlpcHBlZSwgXCRlY2hvIHdvcmtzIQotICAgICAgOgotICAgIGVsc2UKLSAgICAgICMgUmVzdGFydCB1bmRlciB0aGUgY29ycmVjdCBzaGVsbCwgYW5kIHRoZW4gbWF5YmUgXCRlY2hvIHdpbGwgd29yay4KLSAgICAgIGV4ZWMgJFNIRUxMIFwiXCQwXCIgLS1uby1yZWV4ZWMgXCR7MStcIlwkQFwifQotICAgIGZpCi0gIGZpXAotIgotCSRlY2hvID4+ICRvdXRwdXQgIlwKLQotICAjIEZpbmQgdGhlIGRpcmVjdG9yeSB0aGF0IHRoaXMgc2NyaXB0IGxpdmVzIGluLgotICB0aGlzZGlyPVxgXCRlY2hvIFwiWFwkZmlsZVwiIHwgXCRYc2VkIC1lICdzJS9bXi9dKiQlJSdcYAotICB0ZXN0IFwieFwkdGhpc2RpclwiID0gXCJ4XCRmaWxlXCIgJiYgdGhpc2Rpcj0uCi0KLSAgIyBGb2xsb3cgc3ltYm9saWMgbGlua3MgdW50aWwgd2UgZ2V0IHRvIHRoZSByZWFsIHRoaXNkaXIuCi0gIGZpbGU9XGBscyAtbGQgXCJcJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAotICB3aGlsZSB0ZXN0IC1uIFwiXCRmaWxlXCI7IGRvCi0gICAgZGVzdGRpcj1cYFwkZWNobyBcIlhcJGZpbGVcIiB8IFwkWHNlZCAtZSAncyUvW14vXSpcJCUlJ1xgCi0KLSAgICAjIElmIHRoZXJlIHdhcyBhIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gY2hhbmdlIHRoaXNkaXIuCi0gICAgaWYgdGVzdCBcInhcJGRlc3RkaXJcIiAhPSBcInhcJGZpbGVcIjsgdGhlbgotICAgICAgY2FzZSBcIlwkZGVzdGRpclwiIGluCi0gICAgICAvKiB8IFtBLVphLXpdOlsvXFxdKikgdGhpc2Rpcj1cIlwkZGVzdGRpclwiIDs7Ci0gICAgICAqKSB0aGlzZGlyPVwiXCR0aGlzZGlyL1wkZGVzdGRpclwiIDs7Ci0gICAgICBlc2FjCi0gICAgZmkKLQotICAgIGZpbGU9XGBcJGVjaG8gXCJYXCRmaWxlXCIgfCBcJFhzZWQgLWUgJ3MlXi4qLyUlJ1xgCi0gICAgZmlsZT1cYGxzIC1sZCBcIlwkdGhpc2Rpci9cJGZpbGVcIiB8IHNlZCAtbiAncy8uKi0+IC8vcCdcYAotICBkb25lCi0KLSAgIyBUcnkgdG8gZ2V0IHRoZSBhYnNvbHV0ZSBkaXJlY3RvcnkgbmFtZS4KLSAgYWJzZGlyPVxgY2QgXCJcJHRoaXNkaXJcIiAmJiBwd2RcYAotICB0ZXN0IC1uIFwiXCRhYnNkaXJcIiAmJiB0aGlzZGlyPVwiXCRhYnNkaXJcIgotIgotCi0JaWYgdGVzdCAiJGZhc3RfaW5zdGFsbCIgPSB5ZXM7IHRoZW4KLQkgIGVjaG8gPj4gJG91dHB1dCAiXAotICBwcm9ncmFtPWx0LSckb3V0cHV0bmFtZScKLSAgcHJvZ2Rpcj1cIlwkdGhpc2Rpci8kb2JqZGlyXCIKLSAgCi0gIGlmIHRlc3QgISAtZiBcIlwkcHJvZ2Rpci9cJHByb2dyYW1cIiB8fCBcXAotICAgICB7IGZpbGU9XGBscyAtMWR0IFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIFwiXCRwcm9nZGlyLy4uL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHwgc2VkIDFxXGA7IFxcCi0gICAgICAgdGVzdCBcIlhcJGZpbGVcIiAhPSBcIlhcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH07IHRoZW4KLQotICAgIGZpbGU9XCJcJFwkLVwkcHJvZ3JhbVwiCi0KLSAgICBpZiB0ZXN0ICEgLWQgXCJcJHByb2dkaXJcIjsgdGhlbgotICAgICAgJG1rZGlyIFwiXCRwcm9nZGlyXCIKLSAgICBlbHNlCi0gICAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgICBmaSIKLQotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0KLSAgICAjIHJlbGluayBleGVjdXRhYmxlIGlmIG5lY2Vzc2FyeQotICAgIGlmIHRlc3QgLW4gXCJcJHJlbGlua19jb21tYW5kXCI7IHRoZW4KLSAgICAgIGlmIChjZCBcIlwkdGhpc2RpclwiICYmIGV2YWwgXCRyZWxpbmtfY29tbWFuZCk7IHRoZW4gOgotICAgICAgZWxzZQotCSRybSBcIlwkcHJvZ2Rpci9cJGZpbGVcIgotCWV4aXQgMQotICAgICAgZmkKLSAgICBmaQotCi0gICAgJG12IFwiXCRwcm9nZGlyL1wkZmlsZVwiIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiIDI+L2Rldi9udWxsIHx8Ci0gICAgeyAkcm0gXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7Ci0gICAgICAkbXYgXCJcJHByb2dkaXIvXCRmaWxlXCIgXCJcJHByb2dkaXIvXCRwcm9ncmFtXCI7IH0KLSAgICAkcm0gXCJcJHByb2dkaXIvXCRmaWxlXCIKLSAgZmkiCi0JZWxzZQotCSAgZWNobyA+PiAkb3V0cHV0ICJcCi0gIHByb2dyYW09JyRvdXRwdXRuYW1lJwotICBwcm9nZGlyPVwiXCR0aGlzZGlyLyRvYmpkaXJcIgotIgotCWZpCi0KLQllY2hvID4+ICRvdXRwdXQgIlwKLQotICBpZiB0ZXN0IC1mIFwiXCRwcm9nZGlyL1wkcHJvZ3JhbVwiOyB0aGVuIgotCi0JIyBFeHBvcnQgb3VyIHNobGlicGF0aF92YXIgaWYgd2UgaGF2ZSBvbmUuCi0JaWYgdGVzdCAiJHNobGlicGF0aF9vdmVycmlkZXNfcnVucGF0aCIgPSB5ZXMgJiYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiICYmIHRlc3QgLW4gIiR0ZW1wX3JwYXRoIjsgdGhlbgotCSAgJGVjaG8gPj4gJG91dHB1dCAiXAotICAgICMgQWRkIG91ciBvd24gbGlicmFyeSBwYXRoIHRvICRzaGxpYnBhdGhfdmFyCi0gICAgJHNobGlicGF0aF92YXI9XCIkdGVtcF9ycGF0aFwkJHNobGlicGF0aF92YXJcIgotCi0gICAgIyBTb21lIHN5c3RlbXMgY2Fubm90IGNvcGUgd2l0aCBjb2xvbi10ZXJtaW5hdGVkICRzaGxpYnBhdGhfdmFyCi0gICAgIyBUaGUgc2Vjb25kIGNvbG9uIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gQmVPUyBSNCBzZWQKLSAgICAkc2hsaWJwYXRoX3Zhcj1cYFwkZWNobyBcIlhcJCRzaGxpYnBhdGhfdmFyXCIgfCBcJFhzZWQgLWUgJ3MvOjoqXCQvLydcYAotCi0gICAgZXhwb3J0ICRzaGxpYnBhdGhfdmFyCi0iCi0JZmkKLQotCSMgZml4dXAgdGhlIGRsbCBzZWFyY2hwYXRoIGlmIHdlIG5lZWQgdG8uCi0JaWYgdGVzdCAtbiAiJGRsbHNlYXJjaHBhdGgiOyB0aGVuCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgIyBBZGQgdGhlIGRsbCBzZWFyY2ggcGF0aCBjb21wb25lbnRzIHRvIHRoZSBleGVjdXRhYmxlIFBBVEgKLSAgICBQQVRIPSRkbGxzZWFyY2hwYXRoOlwkUEFUSAotIgotCWZpCi0KLQkkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgaWYgdGVzdCBcIlwkbGlidG9vbF9leGVjdXRlX21hZ2ljXCIgIT0gXCIkbWFnaWNcIjsgdGhlbgotICAgICAgIyBSdW4gdGhlIGFjdHVhbCBwcm9ncmFtIHdpdGggb3VyIGFyZ3VtZW50cy4KLSIKLQljYXNlICRob3N0IGluCi0JKi0qLWN5Z3dpbiogfCAqLSotbWluZ3cgfCAqLSotb3MyKikKLQkgICMgd2luMzIgc3lzdGVtcyBuZWVkIHRvIHVzZSB0aGUgcHJvZyBwYXRoIGZvciBkbGwKLQkgICMgbG9va3VwIHRvIHdvcmsKLQkgICRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIGV4ZWMgXCRwcm9nZGlyXFxcXFwkcHJvZ3JhbSBcJHsxK1wiXCRAXCJ9Ci0iCi0JICA7OwotCSopCi0JICAkZWNobyA+PiAkb3V0cHV0ICJcCi0gICAgICAjIEV4cG9ydCB0aGUgcGF0aCB0byB0aGUgcHJvZ3JhbS4KLSAgICAgIFBBVEg9XCJcJHByb2dkaXI6XCRQQVRIXCIKLSAgICAgIGV4cG9ydCBQQVRICi0KLSAgICAgIGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn0KLSIKLQkgIDs7Ci0JZXNhYwotCSRlY2hvID4+ICRvdXRwdXQgIlwKLSAgICAgIFwkZWNobyBcIlwkMDogY2Fubm90IGV4ZWMgXCRwcm9ncmFtIFwkezErXCJcJEBcIn1cIgotICAgICAgZXhpdCAxCi0gICAgZmkKLSAgZWxzZQotICAgICMgVGhlIHByb2dyYW0gZG9lc24ndCBleGlzdC4KLSAgICBcJGVjaG8gXCJcJDA6IGVycm9yOiBcJHByb2dkaXIvXCRwcm9ncmFtIGRvZXMgbm90IGV4aXN0XCIgMT4mMgotICAgIFwkZWNobyBcIlRoaXMgc2NyaXB0IGlzIGp1c3QgYSB3cmFwcGVyIGZvciBcJHByb2dyYW0uXCIgMT4mMgotICAgIGVjaG8gXCJTZWUgdGhlICRQQUNLQUdFIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uXCIgMT4mMgotICAgIGV4aXQgMQotICBmaQotZmlcCi0iCi0JY2htb2QgK3ggJG91dHB1dAotICAgICAgZmkKLSAgICAgIGV4aXQgMAotICAgICAgOzsKLSAgICBlc2FjCi0KLSAgICAjIFNlZSBpZiB3ZSBuZWVkIHRvIGJ1aWxkIGFuIG9sZC1mYXNoaW9uZWQgYXJjaGl2ZS4KLSAgICBmb3Igb2xkbGliIGluICRvbGRsaWJzOyBkbwotCi0gICAgICBpZiB0ZXN0ICIkYnVpbGRfbGlidG9vbF9saWJzIiA9IGNvbnZlbmllbmNlOyB0aGVuCi0Jb2xkb2Jqcz0iJGxpYm9ianNfc2F2ZSIKLQlhZGRsaWJzPSIkY29udmVuaWVuY2UiCi0JYnVpbGRfbGlidG9vbF9saWJzPW5vCi0gICAgICBlbHNlCi0JaWYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSBtb2R1bGU7IHRoZW4KLQkgIG9sZG9ianM9IiRsaWJvYmpzX3NhdmUiCi0JICBidWlsZF9saWJ0b29sX2xpYnM9bm8KLQllbHNlCi0JICBvbGRvYmpzPSIkb2JqcyAiYCRlY2hvICJYJGxpYm9ianNfc2F2ZSIgfCAkU1AyTkwgfCAkWHNlZCAtZSAnL1wuJyR7bGliZXh0fSckL2QnIC1lICcvXC5saWIkL2QnIC1lICIkbG8ybyIgfCAkTkwyU1BgCi0JZmkKLQlhZGRsaWJzPSIkb2xkX2NvbnZlbmllbmNlIgotICAgICAgZmkKLQotICAgICAgIyBBZGQgaW4gbWVtYmVycyBmcm9tIGNvbnZlbmllbmNlIGFyY2hpdmVzLgotICAgICAgZm9yIHhsaWIgaW4gJGFkZGxpYnM7IGRvCi0JIyBFeHRyYWN0IHRoZSBvYmplY3RzLgotCXhkaXI9IiR4bGliIngKLQlnZW5lcmF0ZWQ9IiRnZW5lcmF0ZWQgJHhkaXIiCi0JeGxpYj1gJGVjaG8gIlgkeGxpYiIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0JJHNob3cgIiR7cm19ciAkeGRpciIKLQkkcnVuICR7cm19ciAiJHhkaXIiCi0JJHNob3cgIm1rZGlyICR4ZGlyIgotCSRydW4gbWtkaXIgIiR4ZGlyIgotCXN0YXR1cz0kPwotCWlmIHRlc3QgJHN0YXR1cyAtbmUgMCAmJiB0ZXN0ICEgLWQgIiR4ZGlyIjsgdGhlbgotCSAgZXhpdCAkc3RhdHVzCi0JZmkKLQkkc2hvdyAiKGNkICR4ZGlyICYmICRBUiB4IC4uLyR4bGliKSIKLQkkcnVuIGV2YWwgIihjZCBcJHhkaXIgJiYgJEFSIHggLi4vXCR4bGliKSIgfHwgZXhpdCAkPwotCi0Jb2xkb2Jqcz0iJG9sZG9ianMgImBmaW5kICR4ZGlyIC1uYW1lIFwqLm8gLXByaW50IC1vIC1uYW1lIFwqLmxvIC1wcmludCB8ICROTDJTUGAKLSAgICAgIGRvbmUKLQotICAgICAgIyBEbyBlYWNoIGNvbW1hbmQgaW4gdGhlIGFyY2hpdmUgY29tbWFuZHMuCi0gICAgICBpZiB0ZXN0IC1uICIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kcyIgJiYgdGVzdCAiJGJ1aWxkX2xpYnRvb2xfbGlicyIgPSB5ZXM7IHRoZW4KLQlldmFsIGNtZHM9XCIkb2xkX2FyY2hpdmVfZnJvbV9uZXdfY21kc1wiCi0gICAgICBlbHNlCi0JZXZhbCBjbWRzPVwiJG9sZF9hcmNoaXZlX2NtZHNcIgotICAgICAgZmkKLSAgICAgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0gICAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCUlGUz0iJHNhdmVfaWZzIgotCSRzaG93ICIkY21kIgotCSRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotICAgICAgZG9uZQotICAgICAgSUZTPSIkc2F2ZV9pZnMiCi0gICAgZG9uZQotCi0gICAgaWYgdGVzdCAtbiAiJGdlbmVyYXRlZCI7IHRoZW4KLSAgICAgICRzaG93ICIke3JtfXIkZ2VuZXJhdGVkIgotICAgICAgJHJ1biAke3JtfXIkZ2VuZXJhdGVkCi0gICAgZmkKLQotICAgICMgTm93IGNyZWF0ZSB0aGUgbGlidG9vbCBhcmNoaXZlLgotICAgIGNhc2UgIiRvdXRwdXQiIGluCi0gICAgKi5sYSkKLSAgICAgIG9sZF9saWJyYXJ5PQotICAgICAgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllcyAmJiBvbGRfbGlicmFyeT0iJGxpYm5hbWUuJGxpYmV4dCIKLSAgICAgICRzaG93ICJjcmVhdGluZyAkb3V0cHV0IgotCi0gICAgICBpZiB0ZXN0IC1uICIkeHJwYXRoIjsgdGhlbgotCXRlbXBfeHJwYXRoPQotCWZvciBsaWJkaXIgaW4gJHhycGF0aDsgZG8KLQkgIHRlbXBfeHJwYXRoPSIkdGVtcF94cnBhdGggLVIkbGliZGlyIgotCWRvbmUKLQlkZXBlbmRlbmN5X2xpYnM9IiR0ZW1wX3hycGF0aCAkZGVwZW5kZW5jeV9saWJzIgotICAgICAgZmkKLQotICAgICAgIyBPbmx5IGNyZWF0ZSB0aGUgb3V0cHV0IGlmIG5vdCBhIGRyeSBydW4uCi0gICAgICBpZiB0ZXN0IC16ICIkcnVuIjsgdGhlbgotCSRlY2hvID4gJG91dHB1dCAiXAotIyAkb3V0cHV0IC0gYSBsaWJ0b29sIGxpYnJhcnkgZmlsZQotIyBHZW5lcmF0ZWQgYnkgJFBST0dSQU0gLSBHTlUgJFBBQ0tBR0UgJFZFUlNJT04kVElNRVNUQU1QCi0KLSMgVGhlIG5hbWUgdGhhdCB3ZSBjYW4gZGxvcGVuKDMpLgotZGxuYW1lPSckZGxuYW1lJwotCi0jIE5hbWVzIG9mIHRoaXMgbGlicmFyeS4KLWxpYnJhcnlfbmFtZXM9JyRsaWJyYXJ5X25hbWVzJwotCi0jIFRoZSBuYW1lIG9mIHRoZSBzdGF0aWMgYXJjaGl2ZS4KLW9sZF9saWJyYXJ5PSckb2xkX2xpYnJhcnknCi0KLSMgTGlicmFyaWVzIHRoYXQgdGhpcyBvbmUgZGVwZW5kcyB1cG9uLgotZGVwZW5kZW5jeV9saWJzPSckZGVwZW5kZW5jeV9saWJzJwotCi0jIFZlcnNpb24gaW5mb3JtYXRpb24gZm9yICRsaWJuYW1lLgotY3VycmVudD0kY3VycmVudAotYWdlPSRhZ2UKLXJldmlzaW9uPSRyZXZpc2lvbgotCi0jIElzIHRoaXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgbGlicmFyeT8KLWluc3RhbGxlZD1ubwotCi0jIERpcmVjdG9yeSB0aGF0IHRoaXMgbGlicmFyeSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgaW46Ci1saWJkaXI9JyRpbnN0YWxsX2xpYmRpcidcCi0iCi0KLQkkcm0gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkKLQlzZWQgJ3MvXmluc3RhbGxlZD1ubyQvaW5zdGFsbGVkPXllcy8nIFwKLQkgIDwgIiRvdXRwdXQiID4gIiRvdXRwdXRfb2JqZGlyLyRvdXRwdXRuYW1lImkgfHwgZXhpdCAxCi0gICAgICBmaQotCi0gICAgICAjIERvIGEgc3ltYm9saWMgbGluayBzbyB0aGF0IHRoZSBsaWJ0b29sIGFyY2hpdmUgY2FuIGJlIGZvdW5kIGluCi0gICAgICAjIExEX0xJQlJBUllfUEFUSCBiZWZvcmUgdGhlIHByb2dyYW0gaXMgaW5zdGFsbGVkLgotICAgICAgJHNob3cgIihjZCAkb3V0cHV0X29iamRpciAmJiAkcm0gJG91dHB1dG5hbWUgJiYgJExOX1MgLi4vJG91dHB1dG5hbWUgJG91dHB1dG5hbWUpIgotICAgICAgJHJ1biBldmFsICIoY2QgJG91dHB1dF9vYmpkaXIgJiYgJHJtICRvdXRwdXRuYW1lICYmICRMTl9TIC4uLyRvdXRwdXRuYW1lICRvdXRwdXRuYW1lKSIgfHwgZXhpdCAkPwotICAgICAgOzsKLSAgICBlc2FjCi0gICAgZXhpdCAwCi0gICAgOzsKLQotICAjIGxpYnRvb2wgaW5zdGFsbCBtb2RlCi0gIGluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogaW5zdGFsbCIKLQotICAgICMgVGhlcmUgbWF5IGJlIGFuIG9wdGlvbmFsIHNoKDEpIGFyZ3VtZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAjIGluc3RhbGxfcHJvZyAoZXNwZWNpYWxseSBvbiBXaW5kb3dzIE5UKS4KLSAgICBpZiB0ZXN0ICIkbm9ub3B0IiA9ICIkU0hFTEwiIHx8IHRlc3QgIiRub25vcHQiID0gL2Jpbi9zaDsgdGhlbgotICAgICAgIyBBZXN0aGV0aWNhbGx5IHF1b3RlIGl0LgotICAgICAgYXJnPWAkZWNobyAiWCRub25vcHQiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGFyZyAiCi0gICAgICBhcmc9IiQxIgotICAgICAgc2hpZnQKLSAgICBlbHNlCi0gICAgICBpbnN0YWxsX3Byb2c9Ci0gICAgICBhcmc9IiRub25vcHQiCi0gICAgZmkKLQotICAgICMgVGhlIHJlYWwgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvZ3JhbS4KLSAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgaXQuCi0gICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgIGNhc2UgIiRhcmciIGluCi0gICAgKltcW1x+XCNcXlwmXCpcKFwpXHtcfVx8XDtcPFw+XD9cJ1wgXAldKnwqXSopCi0gICAgICBhcmc9IlwiJGFyZ1wiIgotICAgICAgOzsKLSAgICBlc2FjCi0gICAgaW5zdGFsbF9wcm9nPSIkaW5zdGFsbF9wcm9nJGFyZyIKLQotICAgICMgV2UgbmVlZCB0byBhY2NlcHQgYXQgbGVhc3QgYWxsIHRoZSBCU0QgaW5zdGFsbCBmbGFncy4KLSAgICBkZXN0PQotICAgIGZpbGVzPQotICAgIG9wdHM9Ci0gICAgcHJldj0KLSAgICBpbnN0YWxsX3R5cGU9Ci0gICAgaXNkaXI9bm8KLSAgICBzdHJpcG1lPQotICAgIGZvciBhcmcKLSAgICBkbwotICAgICAgaWYgdGVzdCAtbiAiJGRlc3QiOyB0aGVuCi0JZmlsZXM9IiRmaWxlcyAkZGVzdCIKLQlkZXN0PSIkYXJnIgotCWNvbnRpbnVlCi0gICAgICBmaQotCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLWQpIGlzZGlyPXllcyA7OwotICAgICAgLWYpIHByZXY9Ii1mIiA7OwotICAgICAgLWcpIHByZXY9Ii1nIiA7OwotICAgICAgLW0pIHByZXY9Ii1tIiA7OwotICAgICAgLW8pIHByZXY9Ii1vIiA7OwotICAgICAgLXMpCi0Jc3RyaXBtZT0iIC1zIgotCWNvbnRpbnVlCi0JOzsKLSAgICAgIC0qKSA7OwotCi0gICAgICAqKQotCSMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkZWQgYW4gYXJndW1lbnQsIHRoZW4gc2tpcCBpdC4KLQlpZiB0ZXN0IC1uICIkcHJldiI7IHRoZW4KLQkgIHByZXY9Ci0JZWxzZQotCSAgZGVzdD0iJGFyZyIKLQkgIGNvbnRpbnVlCi0JZmkKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEFlc3RoZXRpY2FsbHkgcXVvdGUgdGhlIGFyZ3VtZW50LgotICAgICAgYXJnPWAkZWNobyAiWCRhcmciIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgY2FzZSAiJGFyZyIgaW4KLSAgICAgICpbXFtcflwjXF5cJlwqXChcKVx7XH1cfFw7XDxcPlw/XCdcIFwJXSp8Kl0qKQotCWFyZz0iXCIkYXJnXCIiCi0JOzsKLSAgICAgIGVzYWMKLSAgICAgIGluc3RhbGxfcHJvZz0iJGluc3RhbGxfcHJvZyAkYXJnIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRpbnN0YWxsX3Byb2ciOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIGluc3RhbGwgcHJvZ3JhbSIgMT4mMgotICAgICAgJGVjaG8gIiRoZWxwIiAxPiYyCi0gICAgICBleGl0IDEKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJHByZXYiOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB0aGUgXGAkcHJldicgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IiAxPiYyCi0gICAgICAkZWNobyAiJGhlbHAiIDE+JjIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBpZiB0ZXN0IC16ICIkZmlsZXMiOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICIkZGVzdCI7IHRoZW4KLQkkZWNobyAiJG1vZGVuYW1lOiBubyBmaWxlIG9yIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgMT4mMgotICAgICAgZWxzZQotCSRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBkZXN0aW5hdGlvbiIgMT4mMgotICAgICAgZmkKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgICMgU3RyaXAgYW55IHRyYWlsaW5nIHNsYXNoIGZyb20gdGhlIGRlc3RpbmF0aW9uLgotICAgIGRlc3Q9YCRlY2hvICJYJGRlc3QiIHwgJFhzZWQgLWUgJ3MlLyQlJSdgCi0KLSAgICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeS4KLSAgICB0ZXN0IC1kICIkZGVzdCIgJiYgaXNkaXI9eWVzCi0gICAgaWYgdGVzdCAiJGlzZGlyIiA9IHllczsgdGhlbgotICAgICAgZGVzdGRpcj0iJGRlc3QiCi0gICAgICBkZXN0bmFtZT0KLSAgICBlbHNlCi0gICAgICBkZXN0ZGlyPWAkZWNobyAiWCRkZXN0IiB8ICRYc2VkIC1lICdzJS9bXi9dKiQlJSdgCi0gICAgICB0ZXN0ICJYJGRlc3RkaXIiID0gIlgkZGVzdCIgJiYgZGVzdGRpcj0uCi0gICAgICBkZXN0bmFtZT1gJGVjaG8gIlgkZGVzdCIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCi0gICAgICAjIE5vdCBhIGRpcmVjdG9yeSwgc28gY2hlY2sgdG8gc2VlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZmlsZSBzcGVjaWZpZWQuCi0gICAgICBzZXQgZHVtbXkgJGZpbGVzCi0gICAgICBpZiB0ZXN0ICQjIC1ndCAyOyB0aGVuCi0JJGVjaG8gIiRtb2RlbmFtZTogXGAkZGVzdCcgaXMgbm90IGEgZGlyZWN0b3J5IiAxPiYyCi0JJGVjaG8gIiRoZWxwIiAxPiYyCi0JZXhpdCAxCi0gICAgICBmaQotICAgIGZpCi0gICAgY2FzZSAiJGRlc3RkaXIiIGluCi0gICAgLyogfCBbQS1aYS16XTpbL1xcXSopIDs7Ci0gICAgKikKLSAgICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLQljYXNlICIkZmlsZSIgaW4KLQkqLmxvKSA7OwotCSopCi0JICAkZWNobyAiJG1vZGVuYW1lOiBcYCRkZXN0ZGlyJyBtdXN0IGJlIGFuIGFic29sdXRlIGRpcmVjdG9yeSBuYW1lIiAxPiYyCi0JICAkZWNobyAiJGhlbHAiIDE+JjIKLQkgIGV4aXQgMQotCSAgOzsKLQllc2FjCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLQotICAgICMgVGhpcyB2YXJpYWJsZSB0ZWxscyB3cmFwcGVyIHNjcmlwdHMganVzdCB0byBzZXQgdmFyaWFibGVzIHJhdGhlcgotICAgICMgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfaW5zdGFsbF9tYWdpYz0iJG1hZ2ljIgotCi0gICAgc3RhdGljbGlicz0KLSAgICBmdXR1cmVfbGliZGlycz0KLSAgICBjdXJyZW50X2xpYmRpcnM9Ci0gICAgZm9yIGZpbGUgaW4gJGZpbGVzOyBkbwotCi0gICAgICAjIERvIGVhY2ggaW5zdGFsbGF0aW9uLgotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAqLmEgfCAqLmxpYikKLQkjIERvIHRoZSBzdGF0aWMgbGlicmFyaWVzIGxhdGVyLgotCXN0YXRpY2xpYnM9IiRzdGF0aWNsaWJzICRmaWxlIgotCTs7Ci0KLSAgICAgICoubGEpCi0JIyBDaGVjayB0byBzZWUgdGhhdCB0aGlzIHJlYWxseSBpcyBhIGxpYnRvb2wgYXJjaGl2ZS4KLQlpZiAoc2VkIC1lICcycScgJGZpbGUgfCBlZ3JlcCAiXiMgR2VuZXJhdGVkIGJ5IC4qJFBBQ0tBR0UiKSA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgotCWVsc2UKLQkgICRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIHZhbGlkIGxpYnRvb2wgYXJjaGl2ZSIgMT4mMgotCSAgJGVjaG8gIiRoZWxwIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCi0JbGlicmFyeV9uYW1lcz0KLQlvbGRfbGlicmFyeT0KLQkjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQljYXNlICIkZmlsZSIgaW4KLQkqLyogfCAqXFwqKSAuICRmaWxlIDs7Ci0JKikgLiAuLyRmaWxlIDs7Ci0JZXNhYwotCi0JIyBBZGQgdGhlIGxpYmRpciB0byBjdXJyZW50X2xpYmRpcnMgaWYgaXQgaXMgdGhlIGRlc3RpbmF0aW9uLgotCWlmIHRlc3QgIlgkZGVzdGRpciIgPSAiWCRsaWJkaXIiOyB0aGVuCi0JICBjYXNlICIkY3VycmVudF9saWJkaXJzICIgaW4KLQkgICoiICRsaWJkaXIgIiopIDs7Ci0JICAqKSBjdXJyZW50X2xpYmRpcnM9IiRjdXJyZW50X2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQllbHNlCi0JICAjIE5vdGUgdGhlIGxpYmRpciBhcyBhIGZ1dHVyZSBsaWJkaXIuCi0JICBjYXNlICIkZnV0dXJlX2xpYmRpcnMgIiBpbgotCSAgKiIgJGxpYmRpciAiKikgOzsKLQkgICopIGZ1dHVyZV9saWJkaXJzPSIkZnV0dXJlX2xpYmRpcnMgJGxpYmRpciIgOzsKLQkgIGVzYWMKLQlmaQotCi0JZGlyPSJgJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYC8iCi0JdGVzdCAiWCRkaXIiID0gIlgkZmlsZS8iICYmIGRpcj0KLQlkaXI9IiRkaXIkb2JqZGlyIgotCi0JIyBTZWUgdGhlIG5hbWVzIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4KLQlzZXQgZHVtbXkgJGxpYnJhcnlfbmFtZXMKLQlpZiB0ZXN0IC1uICIkMiI7IHRoZW4KLQkgIHJlYWxuYW1lPSIkMiIKLQkgIHNoaWZ0Ci0JICBzaGlmdAotCi0JICAjIEluc3RhbGwgdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCBidWlsZCB0aGUgc3ltbGlua3MuCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRyZWFsbmFtZSAkZGVzdGRpci8kcmVhbG5hbWUiCi0JICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGRpci8kcmVhbG5hbWUgJGRlc3RkaXIvJHJlYWxuYW1lIiB8fCBleGl0ICQ/Ci0JICB0ZXN0ICJYJGRsbmFtZSIgPSAiWCRyZWFsbmFtZSIgJiYgZGxuYW1lPQotCi0JICBpZiB0ZXN0ICQjIC1ndCAwOyB0aGVuCi0JICAgICMgRGVsZXRlIHRoZSBvbGQgc3ltbGlua3MsIGFuZCBjcmVhdGUgbmV3IG9uZXMuCi0JICAgIGZvciBsaW5rbmFtZQotCSAgICBkbwotCSAgICAgIHRlc3QgIlgkZGxuYW1lIiA9ICJYJGxpbmtuYW1lIiAmJiBkbG5hbWU9Ci0JICAgICAgaWYgdGVzdCAiJGxpbmtuYW1lIiAhPSAiJHJlYWxuYW1lIjsgdGhlbgotCQkkc2hvdyAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0JCSRydW4gZXZhbCAiKGNkICRkZXN0ZGlyICYmICRybSAkbGlua25hbWUgJiYgJExOX1MgJHJlYWxuYW1lICRsaW5rbmFtZSkiCi0JICAgICAgZmkKLQkgICAgZG9uZQotCSAgZmkKLQotCSAgaWYgdGVzdCAtbiAiJGRsbmFtZSI7IHRoZW4KLQkgICAgIyBJbnN0YWxsIHRoZSBkeW5hbWljYWxseS1sb2FkYWJsZSBsaWJyYXJ5LgotCSAgICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkZGlyLyRkbG5hbWUgJGRlc3RkaXIvJGRsbmFtZSIKLQkgICAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nICRkaXIvJGRsbmFtZSAkZGVzdGRpci8kZGxuYW1lIiB8fCBleGl0ICQ/Ci0JICBmaQotCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgcG9zdGluc3RhbGwgY29tbWFuZHMuCi0JICBsaWI9IiRkZXN0ZGlyLyRyZWFsbmFtZSIKLQkgIGV2YWwgY21kcz1cIiRwb3N0aW5zdGFsbF9jbWRzXCIKLQkgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgZXhpdCAkPwotCSAgZG9uZQotCSAgSUZTPSIkc2F2ZV9pZnMiCi0JZmkKLQotCSMgSW5zdGFsbCB0aGUgcHNldWRvLWxpYnJhcnkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzLgotCW5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQlpbnN0bmFtZT0iJGRpci8kbmFtZSJpCi0JaWYgdGVzdCAhIC1mICIkaW5zdG5hbWUiOyB0aGVuCi0JICAjIEp1c3QgaW4gY2FzZSBpdCB3YXMgcmVtb3ZlZC4uLgotCSAgJHNob3cgIkNyZWF0aW5nICRpbnN0bmFtZSIKLQkgICRybSAiJGluc3RuYW1lIgotCSAgc2VkICdzL15pbnN0YWxsZWQ9bm8kL2luc3RhbGxlZD15ZXMvJyAiJGZpbGUiID4gIiRpbnN0bmFtZSIKLQlmaQotCSRzaG93ICIkaW5zdGFsbF9wcm9nICRpbnN0bmFtZSAkZGVzdGRpci8kbmFtZSIKLQkkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgJGluc3RuYW1lICRkZXN0ZGlyLyRuYW1lIiB8fCBleGl0ICQ/Ci0KLQkjIE1heWJlIGluc3RhbGwgdGhlIHN0YXRpYyBsaWJyYXJ5LCB0b28uCi0JdGVzdCAtbiAiJG9sZF9saWJyYXJ5IiAmJiBzdGF0aWNsaWJzPSIkc3RhdGljbGlicyAkZGlyLyRvbGRfbGlicmFyeSIKLQk7OwotCi0gICAgICAqLmxvKQotCSMgSW5zdGFsbCAoaS5lLiBjb3B5KSBhIGxpYnRvb2wgb2JqZWN0LgotCi0JIyBGaWd1cmUgb3V0IGRlc3RpbmF0aW9uIGZpbGUgbmFtZSwgaWYgaXQgd2Fzbid0IGFscmVhZHkgc3BlY2lmaWVkLgotCWlmIHRlc3QgLW4gIiRkZXN0bmFtZSI7IHRoZW4KLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdG5hbWUiCi0JZWxzZQotCSAgZGVzdGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQkgIGRlc3RmaWxlPSIkZGVzdGRpci8kZGVzdGZpbGUiCi0JZmkKLQotCSMgRGVkdWNlIHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBvbGQtc3R5bGUgb2JqZWN0IGZpbGUuCi0JY2FzZSAiJGRlc3RmaWxlIiBpbgotCSoubG8pCi0JICBzdGF0aWNkZXN0PWAkZWNobyAiWCRkZXN0ZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCSAgOzsKLQkqLm8gfCAqLm9iaikKLQkgIHN0YXRpY2Rlc3Q9IiRkZXN0ZmlsZSIKLQkgIGRlc3RmaWxlPQotCSAgOzsKLQkqKQotCSAgJGVjaG8gIiRtb2RlbmFtZTogY2Fubm90IGNvcHkgYSBsaWJ0b29sIG9iamVjdCB0byBcYCRkZXN0ZmlsZSciIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JICA7OwotCWVzYWMKLQotCSMgSW5zdGFsbCB0aGUgbGlidG9vbCBvYmplY3QgaWYgcmVxdWVzdGVkLgotCWlmIHRlc3QgLW4gIiRkZXN0ZmlsZSI7IHRoZW4KLQkgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRkZXN0ZmlsZSIKLQkgICRydW4gZXZhbCAiJGluc3RhbGxfcHJvZyAkZmlsZSAkZGVzdGZpbGUiIHx8IGV4aXQgJD8KLQlmaQotCi0JIyBJbnN0YWxsIHRoZSBvbGQgb2JqZWN0IGlmIGVuYWJsZWQuCi0JaWYgdGVzdCAiJGJ1aWxkX29sZF9saWJzIiA9IHllczsgdGhlbgotCSAgIyBEZWR1Y2UgdGhlIG5hbWUgb2YgdGhlIG9sZC1zdHlsZSBvYmplY3QgZmlsZS4KLQkgIHN0YXRpY29iaj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAiJGxvMm8iYAotCi0JICAkc2hvdyAiJGluc3RhbGxfcHJvZyAkc3RhdGljb2JqICRzdGF0aWNkZXN0IgotCSAgJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nIFwkc3RhdGljb2JqIFwkc3RhdGljZGVzdCIgfHwgZXhpdCAkPwotCWZpCi0JZXhpdCAwCi0JOzsKLQotICAgICAgKikKLQkjIEZpZ3VyZSBvdXQgZGVzdGluYXRpb24gZmlsZSBuYW1lLCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSBzcGVjaWZpZWQuCi0JaWYgdGVzdCAtbiAiJGRlc3RuYW1lIjsgdGhlbgotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0bmFtZSIKLQllbHNlCi0JICBkZXN0ZmlsZT1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyVeLiovJSUnYAotCSAgZGVzdGZpbGU9IiRkZXN0ZGlyLyRkZXN0ZmlsZSIKLQlmaQotCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgbGlua19hZ2FpbnN0X2xpYnRvb2xfbGlicz0KLQkgIHJlbGlua19jb21tYW5kPQotCi0JICAjIElmIHRoZXJlIGlzIG5vIGRpcmVjdG9yeSBjb21wb25lbnQsIHRoZW4gYWRkIG9uZS4KLQkgIGNhc2UgIiRmaWxlIiBpbgotCSAgKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSAgKikgLiAuLyRmaWxlIDs7Ci0JICBlc2FjCi0KLQkgICMgQ2hlY2sgdGhlIHZhcmlhYmxlcyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gc2V0LgotCSAgaWYgdGVzdCAteiAiJGxpbmtfYWdhaW5zdF9saWJ0b29sX2xpYnMiOyB0aGVuCi0JICAgICRlY2hvICIkbW9kZW5hbWU6IGludmFsaWQgbGlidG9vbCB3cmFwcGVyIHNjcmlwdCBcYCRmaWxlJyIgMT4mMgotCSAgICBleGl0IDEKLQkgIGZpCi0KLQkgIGZpbmFsaXplPXllcwotCSAgZm9yIGxpYiBpbiAkbGlua19hZ2FpbnN0X2xpYnRvb2xfbGliczsgZG8KLQkgICAgIyBDaGVjayB0byBzZWUgdGhhdCBlYWNoIGxpYnJhcnkgaXMgaW5zdGFsbGVkLgotCSAgICBsaWJkaXI9Ci0JICAgIGlmIHRlc3QgLWYgIiRsaWIiOyB0aGVuCi0JICAgICAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICAgICAgY2FzZSAiJGxpYiIgaW4KLQkgICAgICAqLyogfCAqXFwqKSAuICRsaWIgOzsKLQkgICAgICAqKSAuIC4vJGxpYiA7OwotCSAgICAgIGVzYWMKLQkgICAgZmkKLQkgICAgbGliZmlsZT0iJGxpYmRpci9gJGVjaG8gIlgkbGliIiB8ICRYc2VkIC1lICdzJV4uKi8lJWcnYCIKLQkgICAgaWYgdGVzdCAtbiAiJGxpYmRpciIgJiYgdGVzdCAhIC1mICIkbGliZmlsZSI7IHRoZW4KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBcYCRsaWInIGhhcyBub3QgYmVlbiBpbnN0YWxsZWQgaW4gXGAkbGliZGlyJyIgMT4mMgotCSAgICAgIGZpbmFsaXplPW5vCi0JICAgIGZpCi0JICBkb25lCi0KLQkgIG91dHB1dG5hbWU9Ci0JICBpZiB0ZXN0ICIkZmFzdF9pbnN0YWxsIiA9IG5vICYmIHRlc3QgLW4gIiRyZWxpbmtfY29tbWFuZCI7IHRoZW4KLQkgICAgaWYgdGVzdCAiJGZpbmFsaXplIiA9IHllczsgdGhlbgotCSAgICAgIG91dHB1dG5hbWU9Ii90bXAvJCQtJGZpbGUiCi0JICAgICAgIyBSZXBsYWNlIHRoZSBvdXRwdXQgZmlsZSBzcGVjaWZpY2F0aW9uLgotCSAgICAgIHJlbGlua19jb21tYW5kPWAkZWNobyAiWCRyZWxpbmtfY29tbWFuZCIgfCAkWHNlZCAtZSAncyVAT1VUUFVUQCUnIiRvdXRwdXRuYW1lIiclZydgCi0KLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiByZWxpbmtpbmcgXGAkZmlsZScgb24gYmVoYWxmIG9mIHlvdXIgYnVnZ3kgc3lzdGVtIGxpbmtlciIgMT4mMgotCSAgICAgICRzaG93ICIkcmVsaW5rX2NvbW1hbmQiCi0JICAgICAgaWYgJHJ1biBldmFsICIkcmVsaW5rX2NvbW1hbmQiOyB0aGVuIDoKLQkgICAgICBlbHNlCi0JCSRlY2hvICIkbW9kZW5hbWU6IGVycm9yOiByZWxpbmsgXGAkZmlsZScgd2l0aCB0aGUgYWJvdmUgY29tbWFuZCBiZWZvcmUgaW5zdGFsbGluZyBpdCIgMT4mMgotCQljb250aW51ZQotCSAgICAgIGZpCi0JICAgICAgZmlsZT0iJG91dHB1dG5hbWUiCi0JICAgIGVsc2UKLQkgICAgICAkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nOiBjYW5ub3QgcmVsaW5rIFxgJGZpbGUnIG9uIGJlaGFsZiBvZiB5b3VyIGJ1Z2d5IHN5c3RlbSBsaW5rZXIiIDE+JjIKLQkgICAgZmkKLQkgIGVsc2UKLQkgICAgIyBJbnN0YWxsIHRoZSBiaW5hcnkgdGhhdCB3ZSBjb21waWxlZCBlYXJsaWVyLgotCSAgICBmaWxlPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICJzJVwoW14vXSpcKSQlJG9iamRpci9cMSUiYAotCSAgZmkKLQlmaQotCi0JJHNob3cgIiRpbnN0YWxsX3Byb2ckc3RyaXBtZSAkZmlsZSAkZGVzdGZpbGUiCi0JJHJ1biBldmFsICIkaW5zdGFsbF9wcm9nXCRzdHJpcG1lIFwkZmlsZSBcJGRlc3RmaWxlIiB8fCBleGl0ICQ/Ci0JdGVzdCAtbiAiJG91dHB1dG5hbWUiICYmICRybSAkb3V0cHV0bmFtZQotCTs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotCi0gICAgZm9yIGZpbGUgaW4gJHN0YXRpY2xpYnM7IGRvCi0gICAgICBuYW1lPWAkZWNobyAiWCRmaWxlIiB8ICRYc2VkIC1lICdzJV4uKi8lJSdgCi0KLSAgICAgICMgU2V0IHVwIHRoZSByYW5saWIgcGFyYW1ldGVycy4KLSAgICAgIG9sZGxpYj0iJGRlc3RkaXIvJG5hbWUiCi0KLSAgICAgICRzaG93ICIkaW5zdGFsbF9wcm9nICRmaWxlICRvbGRsaWIiCi0gICAgICAkcnVuIGV2YWwgIiRpbnN0YWxsX3Byb2cgXCRmaWxlIFwkb2xkbGliIiB8fCBleGl0ICQ/Ci0KLSAgICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0aW5zdGFsbCBjb21tYW5kcy4KLSAgICAgIGV2YWwgY21kcz1cIiRvbGRfcG9zdGluc3RhbGxfY21kc1wiCi0gICAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotICAgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQlJRlM9IiRzYXZlX2lmcyIKLQkkc2hvdyAiJGNtZCIKLQkkcnVuIGV2YWwgIiRjbWQiIHx8IGV4aXQgJD8KLSAgICAgIGRvbmUKLSAgICAgIElGUz0iJHNhdmVfaWZzIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLW4gIiRmdXR1cmVfbGliZGlycyI7IHRoZW4KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IHdhcm5pbmc6IHJlbWVtYmVyIHRvIHJ1biBcYCRwcm9nbmFtZSAtLWZpbmlzaCRmdXR1cmVfbGliZGlycyciIDE+JjIKLSAgICBmaQotCi0gICAgaWYgdGVzdCAtbiAiJGN1cnJlbnRfbGliZGlycyI7IHRoZW4KLSAgICAgICMgTWF5YmUganVzdCBkbyBhIGRyeSBydW4uCi0gICAgICB0ZXN0IC1uICIkcnVuIiAmJiBjdXJyZW50X2xpYmRpcnM9IiAtbiRjdXJyZW50X2xpYmRpcnMiCi0gICAgICBleGVjICRTSEVMTCAkMCAtLWZpbmlzaCRjdXJyZW50X2xpYmRpcnMKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICBleGl0IDAKLSAgICA7OwotCi0gICMgbGlidG9vbCBmaW5pc2ggbW9kZQotICBmaW5pc2gpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogZmluaXNoIgotICAgIGxpYmRpcnM9IiRub25vcHQiCi0gICAgYWRtaW5jbWRzPQotCi0gICAgaWYgdGVzdCAtbiAiJGZpbmlzaF9jbWRzJGZpbmlzaF9ldmFsIiAmJiB0ZXN0IC1uICIkbGliZGlycyI7IHRoZW4KLSAgICAgIGZvciBkaXIKLSAgICAgIGRvCi0JbGliZGlycz0iJGxpYmRpcnMgJGRpciIKLSAgICAgIGRvbmUKLQotICAgICAgZm9yIGxpYmRpciBpbiAkbGliZGlyczsgZG8KLQlpZiB0ZXN0IC1uICIkZmluaXNoX2NtZHMiOyB0aGVuCi0JICAjIERvIGVhY2ggY29tbWFuZCBpbiB0aGUgZmluaXNoIGNvbW1hbmRzLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9jbWRzXCIKLQkgIElGUz0iJHtJRlM9IAl9Ijsgc2F2ZV9pZnM9IiRJRlMiOyBJRlM9J34nCi0JICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgJHNob3cgIiRjbWQiCi0JICAgICRydW4gZXZhbCAiJGNtZCIgfHwgYWRtaW5jbWRzPSIkYWRtaW5jbWRzCi0gICAgICAgJGNtZCIKLQkgIGRvbmUKLQkgIElGUz0iJHNhdmVfaWZzIgotCWZpCi0JaWYgdGVzdCAtbiAiJGZpbmlzaF9ldmFsIjsgdGhlbgotCSAgIyBEbyB0aGUgc2luZ2xlIGZpbmlzaF9ldmFsLgotCSAgZXZhbCBjbWRzPVwiJGZpbmlzaF9ldmFsXCIKLQkgICRydW4gZXZhbCAiJGNtZHMiIHx8IGFkbWluY21kcz0iJGFkbWluY21kcwotICAgICAgICRjbWRzIgotCWZpCi0gICAgICBkb25lCi0gICAgZmkKLQotICAgICMgRXhpdCBoZXJlIGlmIHRoZXkgd2FudGVkIHNpbGVudCBtb2RlLgotICAgIHRlc3QgIiRzaG93IiA9IDogJiYgZXhpdCAwCi0KLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGVjaG8gIkxpYnJhcmllcyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluOiIKLSAgICBmb3IgbGliZGlyIGluICRsaWJkaXJzOyBkbwotICAgICAgZWNobyAiICAgJGxpYmRpciIKLSAgICBkb25lCi0gICAgZWNobwotICAgIGVjaG8gIklmIHlvdSBldmVyIGhhcHBlbiB0byB3YW50IHRvIGxpbmsgYWdhaW5zdCBpbnN0YWxsZWQgbGlicmFyaWVzIgotICAgIGVjaG8gImluIGEgZ2l2ZW4gZGlyZWN0b3J5LCBMSUJESVIsIHlvdSBtdXN0IGVpdGhlciB1c2UgbGlidG9vbCwgYW5kIgotICAgIGVjaG8gInNwZWNpZnkgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGxpYnJhcnksIG9yIHVzZSBcYC1MTElCRElSJyIKLSAgICBlY2hvICJmbGFnIGR1cmluZyBsaW5raW5nIGFuZCBkbyBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZzoiCi0gICAgaWYgdGVzdCAtbiAiJHNobGlicGF0aF92YXIiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGFkZCBMSUJESVIgdG8gdGhlIFxgJHNobGlicGF0aF92YXInIGVudmlyb25tZW50IHZhcmlhYmxlIgotICAgICAgZWNobyAiICAgICBkdXJpbmcgZXhlY3V0aW9uIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJHJ1bnBhdGhfdmFyIjsgdGhlbgotICAgICAgZWNobyAiICAgLSBhZGQgTElCRElSIHRvIHRoZSBcYCRydW5wYXRoX3ZhcicgZW52aXJvbm1lbnQgdmFyaWFibGUiCi0gICAgICBlY2hvICIgICAgIGR1cmluZyBsaW5raW5nIgotICAgIGZpCi0gICAgaWYgdGVzdCAtbiAiJGhhcmRjb2RlX2xpYmRpcl9mbGFnX3NwZWMiOyB0aGVuCi0gICAgICBsaWJkaXI9TElCRElSCi0gICAgICBldmFsIGZsYWc9XCIkaGFyZGNvZGVfbGliZGlyX2ZsYWdfc3BlY1wiCi0KLSAgICAgIGVjaG8gIiAgIC0gdXNlIHRoZSBcYCRmbGFnJyBsaW5rZXIgZmxhZyIKLSAgICBmaQotICAgIGlmIHRlc3QgLW4gIiRhZG1pbmNtZHMiOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBydW4gdGhlc2UgY29tbWFuZHM6JGFkbWluY21kcyIKLSAgICBmaQotICAgIGlmIHRlc3QgLWYgL2V0Yy9sZC5zby5jb25mOyB0aGVuCi0gICAgICBlY2hvICIgICAtIGhhdmUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRvciBhZGQgTElCRElSIHRvIFxgL2V0Yy9sZC5zby5jb25mJyIKLSAgICBmaQotICAgIGVjaG8KLSAgICBlY2hvICJTZWUgYW55IG9wZXJhdGluZyBzeXN0ZW0gZG9jdW1lbnRhdGlvbiBhYm91dCBzaGFyZWQgbGlicmFyaWVzIGZvciIKLSAgICBlY2hvICJtb3JlIGluZm9ybWF0aW9uLCBzdWNoIGFzIHRoZSBsZCgxKSBhbmQgbGQuc28oOCkgbWFudWFsIHBhZ2VzLiIKLSAgICBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgotICAgIGV4aXQgMAotICAgIDs7Ci0KLSAgIyBsaWJ0b29sIGV4ZWN1dGUgbW9kZQotICBleGVjdXRlKQotICAgIG1vZGVuYW1lPSIkbW9kZW5hbWU6IGV4ZWN1dGUiCi0KLSAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgY29tbWFuZCBuYW1lLgotICAgIGNtZD0iJG5vbm9wdCIKLSAgICBpZiB0ZXN0IC16ICIkY21kIjsgdGhlbgotICAgICAgJGVjaG8gIiRtb2RlbmFtZTogeW91IG11c3Qgc3BlY2lmeSBhIENPTU1BTkQiIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIKLSAgICAgIGV4aXQgMQotICAgIGZpCi0KLSAgICAjIEhhbmRsZSAtZGxvcGVuIGZsYWdzIGltbWVkaWF0ZWx5LgotICAgIGZvciBmaWxlIGluICRleGVjdXRlX2RsZmlsZXM7IGRvCi0gICAgICBpZiB0ZXN0ICEgLWYgIiRmaWxlIjsgdGhlbgotCSRlY2hvICIkbW9kZW5hbWU6IFxgJGZpbGUnIGlzIG5vdCBhIGZpbGUiIDE+JjIKLQkkZWNobyAiJGhlbHAiIDE+JjIKLQlleGl0IDEKLSAgICAgIGZpCi0KLSAgICAgIGRpcj0KLSAgICAgIGNhc2UgIiRmaWxlIiBpbgotICAgICAgKi5sYSkKLQkjIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgcmVhbGx5IGlzIGEgbGlidG9vbCBhcmNoaXZlLgotCWlmIChzZWQgLWUgJzJxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci0JZWxzZQotCSAgJGVjaG8gIiRtb2RlbmFtZTogXGAkbGliJyBpcyBub3QgYSB2YWxpZCBsaWJ0b29sIGFyY2hpdmUiIDE+JjIKLQkgICRlY2hvICIkaGVscCIgMT4mMgotCSAgZXhpdCAxCi0JZmkKLQotCSMgUmVhZCB0aGUgbGlidG9vbCBsaWJyYXJ5LgotCWRsbmFtZT0KLQlsaWJyYXJ5X25hbWVzPQotCi0JIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JY2FzZSAiJGZpbGUiIGluCi0JKi8qIHwgKlxcKikgLiAkZmlsZSA7OwotCSopIC4gLi8kZmlsZSA7OwotCWVzYWMKLQotCSMgU2tpcCB0aGlzIGxpYnJhcnkgaWYgaXQgY2Fubm90IGJlIGRsb3BlbmVkLgotCWlmIHRlc3QgLXogIiRkbG5hbWUiOyB0aGVuCi0JICAjIFdhcm4gaWYgaXQgd2FzIGEgc2hhcmVkIGxpYnJhcnkuCi0JICB0ZXN0IC1uICIkbGlicmFyeV9uYW1lcyIgJiYgJGVjaG8gIiRtb2RlbmFtZTogd2FybmluZzogXGAkZmlsZScgd2FzIG5vdCBsaW5rZWQgd2l0aCBcYC1leHBvcnQtZHluYW1pYyciCi0JICBjb250aW51ZQotCWZpCi0KLQlkaXI9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlL1teL10qJCUlJ2AKLQl0ZXN0ICJYJGRpciIgPSAiWCRmaWxlIiAmJiBkaXI9LgotCi0JaWYgdGVzdCAtZiAiJGRpci8kb2JqZGlyLyRkbG5hbWUiOyB0aGVuCi0JICBkaXI9IiRkaXIvJG9iamRpciIKLQllbHNlCi0JICAkZWNobyAiJG1vZGVuYW1lOiBjYW5ub3QgZmluZCBcYCRkbG5hbWUnIGluIFxgJGRpcicgb3IgXGAkZGlyLyRvYmpkaXInIiAxPiYyCi0JICBleGl0IDEKLQlmaQotCTs7Ci0KLSAgICAgICoubG8pCi0JIyBKdXN0IGFkZCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIC5sbyBmaWxlLgotCWRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotCXRlc3QgIlgkZGlyIiA9ICJYJGZpbGUiICYmIGRpcj0uCi0JOzsKLQotICAgICAgKikKLQkkZWNobyAiJG1vZGVuYW1lOiB3YXJuaW5nIFxgLWRsb3BlbicgaXMgaWdub3JlZCBmb3Igbm9uLWxpYnRvb2wgbGlicmFyaWVzIGFuZCBvYmplY3RzIiAxPiYyCi0JY29udGludWUKLQk7OwotICAgICAgZXNhYwotCi0gICAgICAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aG5hbWUuCi0gICAgICBhYnNkaXI9YGNkICIkZGlyIiAmJiBwd2RgCi0gICAgICB0ZXN0IC1uICIkYWJzZGlyIiAmJiBkaXI9IiRhYnNkaXIiCi0KLSAgICAgICMgTm93IGFkZCB0aGUgZGlyZWN0b3J5IHRvIHNobGlicGF0aF92YXIuCi0gICAgICBpZiBldmFsICJ0ZXN0IC16IFwiXCQkc2hsaWJwYXRoX3ZhclwiIjsgdGhlbgotCWV2YWwgIiRzaGxpYnBhdGhfdmFyPVwiXCRkaXJcIiIKLSAgICAgIGVsc2UKLQlldmFsICIkc2hsaWJwYXRoX3Zhcj1cIlwkZGlyOlwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgIGZpCi0gICAgZG9uZQotCi0gICAgIyBUaGlzIHZhcmlhYmxlIHRlbGxzIHdyYXBwZXIgc2NyaXB0cyBqdXN0IHRvIHNldCBzaGxpYnBhdGhfdmFyCi0gICAgIyByYXRoZXIgdGhhbiBydW5uaW5nIHRoZWlyIHByb2dyYW1zLgotICAgIGxpYnRvb2xfZXhlY3V0ZV9tYWdpYz0iJG1hZ2ljIgotCi0gICAgIyBDaGVjayBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIHdyYXBwZXIgc2NyaXB0LgotICAgIGFyZ3M9Ci0gICAgZm9yIGZpbGUKLSAgICBkbwotICAgICAgY2FzZSAiJGZpbGUiIGluCi0gICAgICAtKikgOzsKLSAgICAgICopCi0JIyBEbyBhIHRlc3QgdG8gc2VlIGlmIHRoaXMgaXMgcmVhbGx5IGEgbGlidG9vbCBwcm9ncmFtLgotCWlmIChzZWQgLWUgJzRxJyAkZmlsZSB8IGVncmVwICJeIyBHZW5lcmF0ZWQgYnkgLiokUEFDS0FHRSIpID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgIyBJZiB0aGVyZSBpcyBubyBkaXJlY3RvcnkgY29tcG9uZW50LCB0aGVuIGFkZCBvbmUuCi0JICBjYXNlICIkZmlsZSIgaW4KLQkgICovKiB8ICpcXCopIC4gJGZpbGUgOzsKLQkgICopIC4gLi8kZmlsZSA7OwotCSAgZXNhYwotCi0JICAjIFRyYW5zZm9ybSBhcmcgdG8gd3JhcHBlZCBuYW1lLgotCSAgZmlsZT0iJHByb2dkaXIvJHByb2dyYW0iCi0JZmkKLQk7OwotICAgICAgZXNhYwotICAgICAgIyBRdW90ZSBhcmd1bWVudHMgKHRvIHByZXNlcnZlIHNoZWxsIG1ldGFjaGFyYWN0ZXJzKS4KLSAgICAgIGZpbGU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgIiRzZWRfcXVvdGVfc3Vic3QiYAotICAgICAgYXJncz0iJGFyZ3MgXCIkZmlsZVwiIgotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgLXogIiRydW4iOyB0aGVuCi0gICAgICAjIEV4cG9ydCB0aGUgc2hsaWJwYXRoX3Zhci4KLSAgICAgIGV2YWwgImV4cG9ydCAkc2hsaWJwYXRoX3ZhciIKLQotICAgICAgIyBSZXN0b3JlIHNhdmVkIGVudmlyb21lbnQgdmFyaWFibGVzCi0gICAgICBpZiB0ZXN0ICIke3NhdmVfTENfQUxMK3NldH0iID0gc2V0OyB0aGVuCi0JTENfQUxMPSIkc2F2ZV9MQ19BTEwiOyBleHBvcnQgTENfQUxMCi0gICAgICBmaQotICAgICAgaWYgdGVzdCAiJHtzYXZlX0xBTkcrc2V0fSIgPSBzZXQ7IHRoZW4KLQlMQU5HPSIkc2F2ZV9MQU5HIjsgZXhwb3J0IExBTkcKLSAgICAgIGZpCi0KLSAgICAgICMgTm93IGFjdHVhbGx5IGV4ZWMgdGhlIGNvbW1hbmQuCi0gICAgICBldmFsICJleGVjIFwkY21kJGFyZ3MiCi0KLSAgICAgICRlY2hvICIkbW9kZW5hbWU6IGNhbm5vdCBleGVjIFwkY21kJGFyZ3MiCi0gICAgICBleGl0IDEKLSAgICBlbHNlCi0gICAgICAjIERpc3BsYXkgd2hhdCB3b3VsZCBiZSBkb25lLgotICAgICAgZXZhbCAiXCRlY2hvIFwiXCRzaGxpYnBhdGhfdmFyPVwkJHNobGlicGF0aF92YXJcIiIKLSAgICAgICRlY2hvICJleHBvcnQgJHNobGlicGF0aF92YXIiCi0gICAgICAkZWNobyAiJGNtZCRhcmdzIgotICAgICAgZXhpdCAwCi0gICAgZmkKLSAgICA7OwotCi0gICMgbGlidG9vbCB1bmluc3RhbGwgbW9kZQotICB1bmluc3RhbGwpCi0gICAgbW9kZW5hbWU9IiRtb2RlbmFtZTogdW5pbnN0YWxsIgotICAgIHJtPSIkbm9ub3B0IgotICAgIGZpbGVzPQotCi0gICAgZm9yIGFyZwotICAgIGRvCi0gICAgICBjYXNlICIkYXJnIiBpbgotICAgICAgLSopIHJtPSIkcm0gJGFyZyIgOzsKLSAgICAgICopIGZpbGVzPSIkZmlsZXMgJGFyZyIgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0IC16ICIkcm0iOyB0aGVuCi0gICAgICAkZWNobyAiJG1vZGVuYW1lOiB5b3UgbXVzdCBzcGVjaWZ5IGFuIFJNIHByb2dyYW0iIDE+JjIKLSAgICAgICRlY2hvICIkaGVscCIgMT4mMgotICAgICAgZXhpdCAxCi0gICAgZmkKLQotICAgIGZvciBmaWxlIGluICRmaWxlczsgZG8KLSAgICAgIGRpcj1gJGVjaG8gIlgkZmlsZSIgfCAkWHNlZCAtZSAncyUvW14vXSokJSUnYAotICAgICAgdGVzdCAiWCRkaXIiID0gIlgkZmlsZSIgJiYgZGlyPS4KLSAgICAgIG5hbWU9YCRlY2hvICJYJGZpbGUiIHwgJFhzZWQgLWUgJ3MlXi4qLyUlJ2AKLQotICAgICAgcm1maWxlcz0iJGZpbGUiCi0KLSAgICAgIGNhc2UgIiRuYW1lIiBpbgotICAgICAgKi5sYSkKLQkjIFBvc3NpYmx5IGEgbGlidG9vbCBhcmNoaXZlLCBzbyB2ZXJpZnkgaXQuCi0JaWYgKHNlZCAtZSAnMnEnICRmaWxlIHwgZWdyZXAgIl4jIEdlbmVyYXRlZCBieSAuKiRQQUNLQUdFIikgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0JICAuICRkaXIvJG5hbWUKLQotCSAgIyBEZWxldGUgdGhlIGxpYnRvb2wgbGlicmFyaWVzIGFuZCBzeW1saW5rcy4KLQkgIGZvciBuIGluICRsaWJyYXJ5X25hbWVzOyBkbwotCSAgICBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRuIgotCSAgICB0ZXN0ICJYJG4iID0gIlgkZGxuYW1lIiAmJiBkbG5hbWU9Ci0JICBkb25lCi0JICB0ZXN0IC1uICIkZGxuYW1lIiAmJiBybWZpbGVzPSIkcm1maWxlcyAkZGlyLyRkbG5hbWUiCi0JICB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiICYmIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZF9saWJyYXJ5IgotCi0JICAkc2hvdyAiJHJtICRybWZpbGVzIgotCSAgJHJ1biAkcm0gJHJtZmlsZXMKLQotCSAgaWYgdGVzdCAtbiAiJGxpYnJhcnlfbmFtZXMiOyB0aGVuCi0JICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBwb3N0dW5pbnN0YWxsIGNvbW1hbmRzLgotCSAgICBldmFsIGNtZHM9XCIkcG9zdHVuaW5zdGFsbF9jbWRzXCIKLQkgICAgSUZTPSIke0lGUz0gCX0iOyBzYXZlX2lmcz0iJElGUyI7IElGUz0nficKLQkgICAgZm9yIGNtZCBpbiAkY21kczsgZG8KLQkgICAgICBJRlM9IiRzYXZlX2lmcyIKLQkgICAgICAkc2hvdyAiJGNtZCIKLQkgICAgICAkcnVuIGV2YWwgIiRjbWQiCi0JICAgIGRvbmUKLQkgICAgSUZTPSIkc2F2ZV9pZnMiCi0JICBmaQotCi0JICBpZiB0ZXN0IC1uICIkb2xkX2xpYnJhcnkiOyB0aGVuCi0JICAgICMgRG8gZWFjaCBjb21tYW5kIGluIHRoZSBvbGRfcG9zdHVuaW5zdGFsbCBjb21tYW5kcy4KLQkgICAgZXZhbCBjbWRzPVwiJG9sZF9wb3N0dW5pbnN0YWxsX2NtZHNcIgotCSAgICBJRlM9IiR7SUZTPSAJfSI7IHNhdmVfaWZzPSIkSUZTIjsgSUZTPSd+JwotCSAgICBmb3IgY21kIGluICRjbWRzOyBkbwotCSAgICAgIElGUz0iJHNhdmVfaWZzIgotCSAgICAgICRzaG93ICIkY21kIgotCSAgICAgICRydW4gZXZhbCAiJGNtZCIKLQkgICAgZG9uZQotCSAgICBJRlM9IiRzYXZlX2lmcyIKLQkgIGZpCi0KLQkgICMgRklYTUU6IHNob3VsZCByZWluc3RhbGwgdGhlIGJlc3QgcmVtYWluaW5nIHNoYXJlZCBsaWJyYXJ5LgotCWZpCi0JOzsKLQotICAgICAgKi5sbykKLQlpZiB0ZXN0ICIkYnVpbGRfb2xkX2xpYnMiID0geWVzOyB0aGVuCi0JICBvbGRvYmo9YCRlY2hvICJYJG5hbWUiIHwgJFhzZWQgLWUgIiRsbzJvImAKLQkgIHJtZmlsZXM9IiRybWZpbGVzICRkaXIvJG9sZG9iaiIKLQlmaQotCSRzaG93ICIkcm0gJHJtZmlsZXMiCi0JJHJ1biAkcm0gJHJtZmlsZXMKLQk7OwotCi0gICAgICAqKQotCSRzaG93ICIkcm0gJHJtZmlsZXMiCi0JJHJ1biAkcm0gJHJtZmlsZXMKLQk7OwotICAgICAgZXNhYwotICAgIGRvbmUKLSAgICBleGl0IDAKLSAgICA7OwotCi0gICIiKQotICAgICRlY2hvICIkbW9kZW5hbWU6IHlvdSBtdXN0IHNwZWNpZnkgYSBNT0RFIiAxPiYyCi0gICAgJGVjaG8gIiRnZW5lcmljX2hlbHAiIDE+JjIKLSAgICBleGl0IDEKLSAgICA7OwotICBlc2FjCi0KLSAgJGVjaG8gIiRtb2RlbmFtZTogaW52YWxpZCBvcGVyYXRpb24gbW9kZSBcYCRtb2RlJyIgMT4mMgotICAkZWNobyAiJGdlbmVyaWNfaGVscCIgMT4mMgotICBleGl0IDEKLWZpICMgdGVzdCAteiAiJHNob3dfaGVscCIKLQotIyBXZSBuZWVkIHRvIGRpc3BsYXkgaGVscCBmb3IgZWFjaCBvZiB0aGUgbW9kZXMuCi1jYXNlICIkbW9kZSIgaW4KLSIiKSAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiBbTU9ERS1BUkddLi4uCi0KLVByb3ZpZGUgZ2VuZXJhbGl6ZWQgbGlicmFyeS1idWlsZGluZyBzdXBwb3J0IHNlcnZpY2VzLgotCi0gICAgLS1jb25maWcgICAgICAgICAgc2hvdyBhbGwgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMKLSAgICAtLWRlYnVnICAgICAgICAgICBlbmFibGUgdmVyYm9zZSBzaGVsbCB0cmFjaW5nCi0tbiwgLS1kcnktcnVuICAgICAgICAgZGlzcGxheSBjb21tYW5kcyB3aXRob3V0IG1vZGlmeWluZyBhbnkgZmlsZXMKLSAgICAtLWZlYXR1cmVzICAgICAgICBkaXNwbGF5IGJhc2ljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIGV4aXQKLSAgICAtLWZpbmlzaCAgICAgICAgICBzYW1lIGFzIFxgLS1tb2RlPWZpbmlzaCcKLSAgICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gICAgLS1tb2RlPU1PREUgICAgICAgdXNlIG9wZXJhdGlvbiBtb2RlIE1PREUgW2RlZmF1bHQ9aW5mZXJyZWQgZnJvbSBNT0RFLUFSR1NdCi0gICAgLS1xdWlldCAgICAgICAgICAgc2FtZSBhcyBcYC0tc2lsZW50JwotICAgIC0tc2lsZW50ICAgICAgICAgIGRvbid0IHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMKLSAgICAtLXZlcnNpb24gICAgICAgICBwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uCi0KLU1PREUgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQotICAgICAgY29tcGlsZSAgICAgICAgIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBpbnRvIGEgbGlidG9vbCBvYmplY3QKLSAgICAgIGV4ZWN1dGUgICAgICAgICBhdXRvbWF0aWNhbGx5IHNldCBsaWJyYXJ5IHBhdGgsIHRoZW4gcnVuIGEgcHJvZ3JhbQotICAgICAgZmluaXNoICAgICAgICAgIGNvbXBsZXRlIHRoZSBpbnN0YWxsYXRpb24gb2YgbGlidG9vbCBsaWJyYXJpZXMKLSAgICAgIGluc3RhbGwgICAgICAgICBpbnN0YWxsIGxpYnJhcmllcyBvciBleGVjdXRhYmxlcwotICAgICAgbGluayAgICAgICAgICAgIGNyZWF0ZSBhIGxpYnJhcnkgb3IgYW4gZXhlY3V0YWJsZQotICAgICAgdW5pbnN0YWxsICAgICAgIHJlbW92ZSBsaWJyYXJpZXMgZnJvbSBhbiBpbnN0YWxsZWQgZGlyZWN0b3J5Ci0KLU1PREUtQVJHUyB2YXJ5IGRlcGVuZGluZyBvbiB0aGUgTU9ERS4gIFRyeSBcYCRtb2RlbmFtZSAtLWhlbHAgLS1tb2RlPU1PREUnIGZvcgotYSBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIE1PREUuIgotICBleGl0IDAKLSAgOzsKLQotY29tcGlsZSkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWNvbXBpbGUgQ09NUElMRS1DT01NQU5ELi4uIFNPVVJDRUZJTEUKLQotQ29tcGlsZSBhIHNvdXJjZSBmaWxlIGludG8gYSBsaWJ0b29sIGxpYnJhcnkgb2JqZWN0LgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtbyBPVVRQVVQtRklMRSAgICBzZXQgdGhlIG91dHB1dCBmaWxlIG5hbWUgdG8gT1VUUFVULUZJTEUKLSAgLXN0YXRpYyAgICAgICAgICAgYWx3YXlzIGJ1aWxkIGEgXGAubycgZmlsZSBzdWl0YWJsZSBmb3Igc3RhdGljIGxpbmtpbmcKLQotQ09NUElMRS1DT01NQU5EIGlzIGEgY29tbWFuZCB0byBiZSB1c2VkIGluIGNyZWF0aW5nIGEgXGBzdGFuZGFyZCcgb2JqZWN0IGZpbGUKLWZyb20gdGhlIGdpdmVuIFNPVVJDRUZJTEUuCi0KLVRoZSBvdXRwdXQgZmlsZSBuYW1lIGlzIGRldGVybWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgZnJvbQotU09VUkNFRklMRSwgdGhlbiBzdWJzdGl0dXRpbmcgdGhlIEMgc291cmNlIGNvZGUgc3VmZml4IFxgLmMnIHdpdGggdGhlCi1saWJyYXJ5IG9iamVjdCBzdWZmaXgsIFxgLmxvJy4iCi0gIDs7Ci0KLWV4ZWN1dGUpCi0gICRlY2hvIFwKLSJVc2FnZTogJG1vZGVuYW1lIFtPUFRJT05dLi4uIC0tbW9kZT1leGVjdXRlIENPTU1BTkQgW0FSR1NdLi4uCi0KLUF1dG9tYXRpY2FsbHkgc2V0IGxpYnJhcnkgcGF0aCwgdGhlbiBydW4gYSBwcm9ncmFtLgotCi1UaGlzIG1vZGUgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9uczoKLQotICAtZGxvcGVuIEZJTEUgICAgICBhZGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIEZJTEUgdG8gdGhlIGxpYnJhcnkgcGF0aAotCi1UaGlzIG1vZGUgc2V0cyB0aGUgbGlicmFyeSBwYXRoIGVudmlyb25tZW50IHZhcmlhYmxlIGFjY29yZGluZyB0byBcYC1kbG9wZW4nCi1mbGFncy4KLQotSWYgYW55IG9mIHRoZSBBUkdTIGFyZSBsaWJ0b29sIGV4ZWN1dGFibGUgd3JhcHBlcnMsIHRoZW4gdGhleSBhcmUgdHJhbnNsYXRlZAotaW50byB0aGVpciBjb3JyZXNwb25kaW5nIHVuaW5zdGFsbGVkIGJpbmFyeSwgYW5kIGFueSBvZiB0aGVpciByZXF1aXJlZCBsaWJyYXJ5Ci1kaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gdGhlIGxpYnJhcnkgcGF0aC4KLQotVGhlbiwgQ09NTUFORCBpcyBleGVjdXRlZCwgd2l0aCBBUkdTIGFzIGFyZ3VtZW50cy4iCi0gIDs7Ci0KLWZpbmlzaCkKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWZpbmlzaCBbTElCRElSXS4uLgotCi1Db21wbGV0ZSB0aGUgaW5zdGFsbGF0aW9uIG9mIGxpYnRvb2wgbGlicmFyaWVzLgotCi1FYWNoIExJQkRJUiBpcyBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGxpYnRvb2wgbGlicmFyaWVzLgotCi1UaGUgY29tbWFuZHMgdGhhdCB0aGlzIG1vZGUgZXhlY3V0ZXMgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuICBVc2UKLXRoZSBcYC0tZHJ5LXJ1bicgb3B0aW9uIGlmIHlvdSBqdXN0IHdhbnQgdG8gc2VlIHdoYXQgd291bGQgYmUgZXhlY3V0ZWQuIgotICA7OwotCi1pbnN0YWxsKQotICAkZWNobyBcCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9aW5zdGFsbCBJTlNUQUxMLUNPTU1BTkQuLi4KLQotSW5zdGFsbCBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMuCi0KLUlOU1RBTEwtQ09NTUFORCBpcyB0aGUgaW5zdGFsbGF0aW9uIGNvbW1hbmQuICBUaGUgZmlyc3QgY29tcG9uZW50IHNob3VsZCBiZQotZWl0aGVyIHRoZSBcYGluc3RhbGwnIG9yIFxgY3AnIHByb2dyYW0uCi0KLVRoZSByZXN0IG9mIHRoZSBjb21wb25lbnRzIGFyZSBpbnRlcnByZXRlZCBhcyBhcmd1bWVudHMgdG8gdGhhdCBjb21tYW5kIChvbmx5Ci1CU0QtY29tcGF0aWJsZSBpbnN0YWxsIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQpLiIKLSAgOzsKLQotbGluaykKLSAgJGVjaG8gXAotIlVzYWdlOiAkbW9kZW5hbWUgW09QVElPTl0uLi4gLS1tb2RlPWxpbmsgTElOSy1DT01NQU5ELi4uCi0KLUxpbmsgb2JqZWN0IGZpbGVzIG9yIGxpYnJhcmllcyB0b2dldGhlciB0byBmb3JtIGFub3RoZXIgbGlicmFyeSwgb3IgdG8KLWNyZWF0ZSBhbiBleGVjdXRhYmxlIHByb2dyYW0uCi0KLUxJTkstQ09NTUFORCBpcyBhIGNvbW1hbmQgdXNpbmcgdGhlIEMgY29tcGlsZXIgdGhhdCB5b3Ugd291bGQgdXNlIHRvIGNyZWF0ZQotYSBwcm9ncmFtIGZyb20gc2V2ZXJhbCBvYmplY3QgZmlsZXMuCi0KLVRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBvZiBMSU5LLUNPTU1BTkQgYXJlIHRyZWF0ZWQgc3BlY2lhbGx5OgotCi0gIC1hbGwtc3RhdGljICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIGF0IGFsbAotICAtYXZvaWQtdmVyc2lvbiAgICBkbyBub3QgYWRkIGEgdmVyc2lvbiBzdWZmaXggaWYgcG9zc2libGUKLSAgLWRsb3BlbiBGSUxFICAgICAgXGAtZGxwcmVvcGVuJyBGSUxFIGlmIGl0IGNhbm5vdCBiZSBkbG9wZW5lZCBhdCBydW50aW1lCi0gIC1kbHByZW9wZW4gRklMRSAgIGxpbmsgaW4gRklMRSBhbmQgYWRkIGl0cyBzeW1ib2xzIHRvIGx0X3ByZWxvYWRlZF9zeW1ib2xzCi0gIC1leHBvcnQtZHluYW1pYyAgIGFsbG93IHN5bWJvbHMgZnJvbSBPVVRQVVQtRklMRSB0byBiZSByZXNvbHZlZCB3aXRoIGRsc3ltKDMpCi0gIC1leHBvcnQtc3ltYm9scyBTWU1GSUxFCi0JCSAgICB0cnkgdG8gZXhwb3J0IG9ubHkgdGhlIHN5bWJvbHMgbGlzdGVkIGluIFNZTUZJTEUKLSAgLUxMSUJESVIgICAgICAgICAgc2VhcmNoIExJQkRJUiBmb3IgcmVxdWlyZWQgaW5zdGFsbGVkIGxpYnJhcmllcwotICAtbE5BTUUgICAgICAgICAgICBPVVRQVVQtRklMRSByZXF1aXJlcyB0aGUgaW5zdGFsbGVkIGxpYnJhcnkgbGliTkFNRQotICAtbW9kdWxlICAgICAgICAgICBidWlsZCBhIGxpYnJhcnkgdGhhdCBjYW4gZGxvcGVuZWQKLSAgLW5vLXVuZGVmaW5lZCAgICAgZGVjbGFyZSB0aGF0IGEgbGlicmFyeSBkb2VzIG5vdCByZWZlciB0byBleHRlcm5hbCBzeW1ib2xzCi0gIC1vIE9VVFBVVC1GSUxFICAgIGNyZWF0ZSBPVVRQVVQtRklMRSBmcm9tIHRoZSBzcGVjaWZpZWQgb2JqZWN0cwotICAtcmVsZWFzZSBSRUxFQVNFICBzcGVjaWZ5IHBhY2thZ2UgcmVsZWFzZSBpbmZvcm1hdGlvbgotICAtcnBhdGggTElCRElSICAgICB0aGUgY3JlYXRlZCBsaWJyYXJ5IHdpbGwgZXZlbnR1YWxseSBiZSBpbnN0YWxsZWQgaW4gTElCRElSCi0gIC1SWyBdTElCRElSICAgICAgIGFkZCBMSUJESVIgdG8gdGhlIHJ1bnRpbWUgcGF0aCBvZiBwcm9ncmFtcyBhbmQgbGlicmFyaWVzCi0gIC1zdGF0aWMgICAgICAgICAgIGRvIG5vdCBkbyBhbnkgZHluYW1pYyBsaW5raW5nIG9mIGxpYnRvb2wgbGlicmFyaWVzCi0gIC12ZXJzaW9uLWluZm8gQ1VSUkVOVFs6UkVWSVNJT05bOkFHRV1dCi0JCSAgICBzcGVjaWZ5IGxpYnJhcnkgdmVyc2lvbiBpbmZvIFtlYWNoIHZhcmlhYmxlIGRlZmF1bHRzIHRvIDBdCi0KLUFsbCBvdGhlciBvcHRpb25zIChhcmd1bWVudHMgYmVnaW5uaW5nIHdpdGggXGAtJykgYXJlIGlnbm9yZWQuCi0KLUV2ZXJ5IG90aGVyIGFyZ3VtZW50IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZS4gIEZpbGVzIGVuZGluZyBpbiBcYC5sYScgYXJlCi10cmVhdGVkIGFzIHVuaW5zdGFsbGVkIGxpYnRvb2wgbGlicmFyaWVzLCBvdGhlciBmaWxlcyBhcmUgc3RhbmRhcmQgb3IgbGlicmFyeQotb2JqZWN0IGZpbGVzLgotCi1JZiB0aGUgT1VUUFVULUZJTEUgZW5kcyBpbiBcYC5sYScsIHRoZW4gYSBsaWJ0b29sIGxpYnJhcnkgaXMgY3JlYXRlZCwKLW9ubHkgbGlicmFyeSBvYmplY3RzIChcYC5sbycgZmlsZXMpIG1heSBiZSBzcGVjaWZpZWQsIGFuZCBcYC1ycGF0aCcgaXMKLXJlcXVpcmVkLCBleGNlcHQgd2hlbiBjcmVhdGluZyBhIGNvbnZlbmllbmNlIGxpYnJhcnkuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAuYScgb3IgXGAubGliJywgdGhlbiBhIHN0YW5kYXJkIGxpYnJhcnkgaXMgY3JlYXRlZAotdXNpbmcgXGBhcicgYW5kIFxgcmFubGliJywgb3Igb24gV2luZG93cyB1c2luZyBcYGxpYicuCi0KLUlmIE9VVFBVVC1GSUxFIGVuZHMgaW4gXGAubG8nIG9yIFxgLiR7b2JqZXh0fScsIHRoZW4gYSByZWxvYWRhYmxlIG9iamVjdCBmaWxlCi1pcyBjcmVhdGVkLCBvdGhlcndpc2UgYW4gZXhlY3V0YWJsZSBwcm9ncmFtIGlzIGNyZWF0ZWQuIgotICA7OwotCi11bmluc3RhbGwpCi0gICRlY2hvCi0iVXNhZ2U6ICRtb2RlbmFtZSBbT1BUSU9OXS4uLiAtLW1vZGU9dW5pbnN0YWxsIFJNIFtSTS1PUFRJT05dLi4uIEZJTEUuLi4KLQotUmVtb3ZlIGxpYnJhcmllcyBmcm9tIGFuIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0KLVJNIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHRvIHVzZSB0byBkZWxldGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggRklMRQotKHR5cGljYWxseSBcYC9iaW4vcm0nKS4gIFJNLU9QVElPTlMgYXJlIG9wdGlvbnMgKHN1Y2ggYXMgXGAtZicpIHRvIGJlIHBhc3NlZAotdG8gUk0uCi0KLUlmIEZJTEUgaXMgYSBsaWJ0b29sIGxpYnJhcnksIGFsbCB0aGUgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGl0IGFyZSBkZWxldGVkLgotT3RoZXJ3aXNlLCBvbmx5IEZJTEUgaXRzZWxmIGlzIGRlbGV0ZWQgdXNpbmcgUk0uIgotICA7OwotCi0qKQotICAkZWNobyAiJG1vZGVuYW1lOiBpbnZhbGlkIG9wZXJhdGlvbiBtb2RlIFxgJG1vZGUnIiAxPiYyCi0gICRlY2hvICIkaGVscCIgMT4mMgotICBleGl0IDEKLSAgOzsKLWVzYWMKLQotZWNobwotJGVjaG8gIlRyeSBcYCRtb2RlbmFtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG90aGVyIG1vZGVzLiIKLQotZXhpdCAwCi0KLSMgTG9jYWwgVmFyaWFibGVzOgotIyBtb2RlOnNoZWxsLXNjcmlwdAotIyBzaC1pbmRlbnRhdGlvbjoyCi0jIEVuZDoKZGlmZiAtLWdpdCBhL21ha2VhbGwuYmF0IGIvbWFrZWFsbC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZDQxNWYuLjAwMDAwMDAKLS0tIGEvbWFrZWFsbC5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1AZWNobyBvZmYNCi1jaGRpciBsaWJpYmVydHkNCi1tYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cYmZkDQotbWFrZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXG9wY29kZXMNCi1tYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cZ3Byb2YNCi1tYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cYmludXRpbHMNCi1tYWtlICUxICUyICUzICU0ICU1ICU2ICU3ICU4ICU5DQotY2hkaXIgLi5cZ2FzDQotbWFrZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uXGxkDQotbWFrZSAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQ0KLWNoZGlyIC4uDQpkaWZmIC0tZ2l0IGEvbWFrZWZpbGUudm1zIGIvbWFrZWZpbGUudm1zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWUzNjM0Li4wMDAwMDAwCi0tLSBhL21ha2VmaWxlLnZtcworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMKLSMgbWFrZWZpbGUgZm9yIGJmZCwgYmludXRpbHMgYW5kIGdhcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCi0jCi0jIFlvdSBtdXN0IHVzZSBWZXJzaW9uIDMuNzYgb2YgR05VIE1ha2UKLSMKLSMKLQotaWZlcSAoJChBUkNIKSxBTFBIQSkKLUNDID0gZ2NjCi1HQVNDQyA9ICQoQ0MpCi1lbHNlCi1DQyA9IGNjCi1HQVNDQyA9IGdjYwotZW5kaWYKLQotaWZlcSAoJChDQyksY2MpCi0gIENIRUNLLUNPTVBJTEVSID0gY2hlY2tfY29tcGlsZXIKLWVsc2UKLSAgQ0hFQ0stQ09NUElMRVIgPQotZW5kaWYKLQotYWxsOgljaGVja19jYyAkKENIRUNLLUNPTVBJTEVSKSBbLmJpbnV0aWxzXW1ha2VmaWxlLnZtcwotCSQoQ0QpIFsuYmZkXQotCUBnbWFrZSAiQ0M9JChDQykiCi0JJChDRCkgWy0ub3Bjb2Rlc10KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmxpYmliZXJ0eV0KLQlAZ21ha2UgIkNDPSQoQ0MpIgotCSQoQ0QpIFstLmJpbnV0aWxzXQotCUBnbWFrZSAiQ0M9JChDQykiCi0JJChDRCkgWy0uZ2FzXQotCUBnbWFrZSAiQ0M9JChHQVNDQykiCi0JJChDRCkgWy1dCi0KLWNoZWNrX2NjOgotaWZlcSAoJENDLCkKLQlAJChFQ0hPKSAiUGxlYXNlIGVkaXQgTUFLRUZJTEUuVk1TIGFuZCBzZWxlY3QgYSBDIENvbXBpbGVyLiIKLQlzdG9wCi1lbmRpZgotCi1jaGVja19jb21waWxlcjoKLQlAJChFQ0hPKSAiUGVyZm9ybSBhICckJCBAc2V0dXAnIGJlZm9yZSBzdGFydGluZyBtYWtlIgotCi1bLmJpbnV0aWxzXW1ha2VmaWxlLnZtczoKLQkkKENEKSBbLmJpbnV0aWxzXQotCSQkIEBjb25maWd1cmUKLQkkKENEKSBbLV0KLQotaW5zdGFsbDogYWxsCi0JJChDRCkgWy5iaW51dGlsc10KLQlAZ21ha2UgIkNDPSQoQ0MpIiBpbnN0YWxsCi0JJChDRCkgWy1dCi0JJChDRCkgWy5nYXNdCi0JQGdtYWtlICJDQz0kKEdBU0NDKSIgaW5zdGFsbAotCSQoQ0QpIFstXQotCi1jbGVhbjoKLQkkKENEKSBbLmJmZF0KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5vcGNvZGVzXQotCUBnbWFrZSBjbGVhbgotCSQoQ0QpIFstLmxpYmliZXJ0eV0KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5iaW51dGlsc10KLQlAZ21ha2UgY2xlYW4KLQkkKENEKSBbLS5nYXNdCi0JQGdtYWtlIGNsZWFuCi0JJChDRCkgWy1dCi0KZGlmZiAtLWdpdCBhL21pc3NpbmcgYi9taXNzaW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3Nzg5NjUyLi4wMDAwMDAwCi0tLSBhL21pc3NpbmcKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBDb21tb24gc3R1YiBmb3IgYSBmZXcgbWlzc2luZyBHTlUgcHJvZ3JhbXMgd2hpbGUgaW5zdGFsbGluZy4KLSMgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIyBGcmFuYyxvaXMgUGluYXJkIDxwaW5hcmRAaXJvLnVtb250cmVhbC5jYT4sIDE5OTYuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotIyBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotIyAwMjExMS0xMzA3LCBVU0EuCi0KLWlmIHRlc3QgJCMgLWVxIDA7IHRoZW4KLSAgZWNobyAxPiYyICJUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uIgotICBleGl0IDEKLWZpCi0KLWNhc2UgIiQxIiBpbgotCi0gIC1ofC0taHwtLWhlfC0taGVsfC0taGVscCkKLSAgICBlY2hvICJcCi0kMCBbT1BUSU9OXS4uLiBQUk9HUkFNIFtBUkdVTUVOVF0uLi4KLQotSGFuZGxlIFxgUFJPR1JBTSBbQVJHVU1FTlRdLi4uJyBmb3Igd2hlbiBQUk9HUkFNIGlzIG1pc3NpbmcsIG9yIHJldHVybiBhbgotZXJyb3Igc3RhdHVzIGlmIHRoZXJlIGlzIG5vIGtub3duIGhhbmRsaW5nIGZvciBQUk9HUkFNLgotCi1PcHRpb25zOgotICAtaCwgLS1oZWxwICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKLSAgLXYsIC0tdmVyc2lvbiAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0Ci0KLVN1cHBvcnRlZCBQUk9HUkFNIHZhbHVlczoKLSAgYWNsb2NhbCAgICAgIHRvdWNoIGZpbGUgXGBhY2xvY2FsLm00JwotICBhdXRvY29uZiAgICAgdG91Y2ggZmlsZSBcYGNvbmZpZ3VyZScKLSAgYXV0b2hlYWRlciAgIHRvdWNoIGZpbGUgXGBjb25maWcuaC5pbicKLSAgYXV0b21ha2UgICAgIHRvdWNoIGFsbCBcYE1ha2VmaWxlLmluJyBmaWxlcwotICBiaXNvbiAgICAgICAgY3JlYXRlIFxgeS50YWIuW2NoXScsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5bY2hdCi0gIGZsZXggICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIGxleCAgICAgICAgICBjcmVhdGUgXGBsZXgueXkuYycsIGlmIHBvc3NpYmxlLCBmcm9tIGV4aXN0aW5nIC5jCi0gIG1ha2VpbmZvICAgICB0b3VjaCB0aGUgb3V0cHV0IGZpbGUKLSAgeWFjYyAgICAgICAgIGNyZWF0ZSBcYHkudGFiLltjaF0nLCBpZiBwb3NzaWJsZSwgZnJvbSBleGlzdGluZyAuW2NoXSIKLSAgICA7OwotCi0gIC12fC0tdnwtLXZlfC0tdmVyfC0tdmVyc3wtLXZlcnNpfC0tdmVyc2lvfC0tdmVyc2lvbikKLSAgICBlY2hvICJtaXNzaW5nIC0gR05VIGxpYml0IDAuMCIKLSAgICA7OwotCi0gIC0qKQotICAgIGVjaG8gMT4mMiAiJDA6IFVua25vd24gXGAkMScgb3B0aW9uIgotICAgIGVjaG8gMT4mMiAiVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbiIKLSAgICBleGl0IDEKLSAgICA7OwotCi0gIGFjbG9jYWwpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjaW5jbHVkZS5tNCcgb3IgXGBjb25maWd1cmUuaW4nLiAgWW91IG1pZ2h0IHdhbnQKLSAgICAgICAgIHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20KLSAgICAgICAgIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBhY2xvY2FsLm00Ci0gICAgOzsKLQotICBhdXRvY29uZikKLSAgICBlY2hvIDE+JjIgIlwKLVdBUk5JTkc6IFxgJDEnIGlzIG1pc3Npbmcgb24geW91ciBzeXN0ZW0uICBZb3Ugc2hvdWxkIG9ubHkgbmVlZCBpdCBpZgotICAgICAgICAgeW91IG1vZGlmaWVkIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlCi0gICAgICAgICBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtIGZyb20gYW55IEdOVQotICAgICAgICAgYXJjaGl2ZSBzaXRlLiIKLSAgICB0b3VjaCBjb25maWd1cmUKLSAgICA7OwotCi0gIGF1dG9oZWFkZXIpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYGFjY29uZmlnLmgnIG9yIFxgY29uZmlndXJlLmluJy4gIFlvdSBtaWdodCB3YW50Ci0gICAgICAgICB0byBpbnN0YWxsIHRoZSBcYEF1dG9jb25mJyBhbmQgXGBHTlUgbTQnIHBhY2thZ2VzLiAgR3JhYiB0aGVtCi0gICAgICAgICBmcm9tIGFueSBHTlUgYXJjaGl2ZSBzaXRlLiIKLSAgICBmaWxlcz1gc2VkIC1uICdzL15bIF0qQVtDTV1fQ09ORklHX0hFQURFUihcKFteKV0qXCkpLiovXDEvcCcgY29uZmlndXJlLmluYAotICAgIHRlc3QgLXogIiRmaWxlcyIgJiYgZmlsZXM9ImNvbmZpZy5oIgotICAgIHRvdWNoX2ZpbGVzPQotICAgIGZvciBmIGluICRmaWxlczsgZG8KLSAgICAgIGNhc2UgIiRmIiBpbgotICAgICAgKjoqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICJgZWNobyAiJGYiIHwKLQkJCQkgICAgICAgc2VkIC1lICdzL15bXjpdKjovLycgLWUgJ3MvOi4qLy8nYDs7Ci0gICAgICAqKSB0b3VjaF9maWxlcz0iJHRvdWNoX2ZpbGVzICRmLmluIjs7Ci0gICAgICBlc2FjCi0gICAgZG9uZQotICAgIHRvdWNoICR0b3VjaF9maWxlcwotICAgIDs7Ci0KLSAgYXV0b21ha2UpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBcYE1ha2VmaWxlLmFtJywgXGBhY2luY2x1ZGUubTQnIG9yIFxgY29uZmlndXJlLmluJy4KLSAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIGluc3RhbGwgdGhlIFxgQXV0b21ha2UnIGFuZCBcYFBlcmwnIHBhY2thZ2VzLgotICAgICAgICAgR3JhYiB0aGVtIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbmQgLiAtdHlwZSBmIC1uYW1lIE1ha2VmaWxlLmFtIC1wcmludCB8Ci0JICAgc2VkICdzL1wuYW0kLy5pbi8nIHwKLQkgICB3aGlsZSByZWFkIGY7IGRvIHRvdWNoICIkZiI7IGRvbmUKLSAgICA7OwotCi0gIGJpc29ufHlhY2MpCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBtaXNzaW5nIG9uIHlvdXIgc3lzdGVtLiAgWW91IHNob3VsZCBvbmx5IG5lZWQgaXQgaWYKLSAgICAgICAgIHlvdSBtb2RpZmllZCBhIFxgLnknIGZpbGUuICBZb3UgbWF5IG5lZWQgdGhlIFxgQmlzb24nIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgQmlzb24nIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIHJtIC1mIHkudGFiLmMgeS50YWIuaAotICAgIGlmIFsgJCMgLW5lIDEgXTsgdGhlbgotICAgICAgICBldmFsIExBU1RBUkc9IlwkeyQjfSIKLQljYXNlICIkTEFTVEFSRyIgaW4KLQkqLnkpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9jLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5jCi0JICAgIGZpCi0JICAgIFNSQ0ZJTEU9YGVjaG8gIiRMQVNUQVJHIiB8IHNlZCAncy95JC9oLydgCi0JICAgIGlmIFsgLWYgIiRTUkNGSUxFIiBdOyB0aGVuCi0JICAgICAgICAgY3AgIiRTUkNGSUxFIiB5LnRhYi5oCi0JICAgIGZpCi0JICA7OwotCWVzYWMKLSAgICBmaQotICAgIGlmIFsgISAtZiB5LnRhYi5oIF07IHRoZW4KLQllY2hvID55LnRhYi5oCi0gICAgZmkKLSAgICBpZiBbICEgLWYgeS50YWIuYyBdOyB0aGVuCi0JZWNobyAnbWFpbigpIHsgcmV0dXJuIDA7IH0nID55LnRhYi5jCi0gICAgZmkKLSAgICA7OwotCi0gIGxleHxmbGV4KQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC5sJyBmaWxlLiAgWW91IG1heSBuZWVkIHRoZSBcYEZsZXgnIHBhY2thZ2UKLSAgICAgICAgIGluIG9yZGVyIGZvciB0aG9zZSBtb2RpZmljYXRpb25zIHRvIHRha2UgZWZmZWN0LiAgWW91IGNhbiBnZXQKLSAgICAgICAgIFxgRmxleCcgZnJvbSBhbnkgR05VIGFyY2hpdmUgc2l0ZS4iCi0gICAgcm0gLWYgbGV4Lnl5LmMKLSAgICBpZiBbICQjIC1uZSAxIF07IHRoZW4KLSAgICAgICAgZXZhbCBMQVNUQVJHPSJcJHskI30iCi0JY2FzZSAiJExBU1RBUkciIGluCi0JKi5sKQotCSAgICBTUkNGSUxFPWBlY2hvICIkTEFTVEFSRyIgfCBzZWQgJ3MvbCQvYy8nYAotCSAgICBpZiBbIC1mICIkU1JDRklMRSIgXTsgdGhlbgotCSAgICAgICAgIGNwICIkU1JDRklMRSIgbGV4Lnl5LmMKLQkgICAgZmkKLQkgIDs7Ci0JZXNhYwotICAgIGZpCi0gICAgaWYgWyAhIC1mIGxleC55eS5jIF07IHRoZW4KLQllY2hvICdtYWluKCkgeyByZXR1cm4gMDsgfScgPmxleC55eS5jCi0gICAgZmkKLSAgICA7OwotCi0gIG1ha2VpbmZvKQotICAgIGVjaG8gMT4mMiAiXAotV0FSTklORzogXGAkMScgaXMgbWlzc2luZyBvbiB5b3VyIHN5c3RlbS4gIFlvdSBzaG91bGQgb25seSBuZWVkIGl0IGlmCi0gICAgICAgICB5b3UgbW9kaWZpZWQgYSBcYC50ZXhpJyBvciBcYC50ZXhpbmZvJyBmaWxlLCBvciBhbnkgb3RoZXIgZmlsZQotICAgICAgICAgaW5kaXJlY3RseSBhZmZlY3RpbmcgdGhlIGFzcGVjdCBvZiB0aGUgbWFudWFsLiAgVGhlIHNwdXJpb3VzCi0gICAgICAgICBjYWxsIG1pZ2h0IGFsc28gYmUgdGhlIGNvbnNlcXVlbmNlIG9mIHVzaW5nIGEgYnVnZ3kgXGBtYWtlJyAoQUlYLAotICAgICAgICAgRFUsIElSSVgpLiAgWW91IG1pZ2h0IHdhbnQgdG8gaW5zdGFsbCB0aGUgXGBUZXhpbmZvJyBwYWNrYWdlIG9yCi0gICAgICAgICB0aGUgXGBHTlUgbWFrZScgcGFja2FnZS4gIEdyYWIgZWl0aGVyIGZyb20gYW55IEdOVSBhcmNoaXZlIHNpdGUuIgotICAgIGZpbGU9YGVjaG8gIiQqIiB8IHNlZCAtbiAncy8uKi1vIFwoW14gXSpcKS4qL1wxL3AnYAotICAgIGlmIHRlc3QgLXogIiRmaWxlIjsgdGhlbgotICAgICAgZmlsZT1gZWNobyAiJCoiIHwgc2VkICdzLy4qIFwoW14gXSpcKSAqJC9cMS8nYAotICAgICAgZmlsZT1gc2VkIC1uICcvXkBzZXRmaWxlbmFtZS8geyBzLy4qIFwoW14gXSpcKSAqJC9cMS87IHA7IHE7IH0nICRmaWxlYAotICAgIGZpCi0gICAgdG91Y2ggJGZpbGUKLSAgICA7OwotCi0gICopCi0gICAgZWNobyAxPiYyICJcCi1XQVJOSU5HOiBcYCQxJyBpcyBuZWVkZWQsIGFuZCB5b3UgZG8gbm90IHNlZW0gdG8gaGF2ZSBpdCBoYW5keSBvbiB5b3VyCi0gICAgICAgICBzeXN0ZW0uICBZb3UgbWlnaHQgaGF2ZSBtb2RpZmllZCBzb21lIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRoZQotICAgICAgICAgcHJvcGVyIHRvb2xzIGZvciBmdXJ0aGVyIGhhbmRsaW5nIHRoZW0uICBDaGVjayB0aGUgXGBSRUFETUUnIGZpbGUsCi0gICAgICAgICBpdCBvZnRlbiB0ZWxscyB5b3UgYWJvdXQgdGhlIG5lZWRlZCBwcmVyZXF1aXJlbWVudHMgZm9yIGluc3RhbGxpbmcKLSAgICAgICAgIHRoaXMgcGFja2FnZS4gIFlvdSBtYXkgYWxzbyBwZWVrIGF0IGFueSBHTlUgYXJjaGl2ZSBzaXRlLCBpbiBjYXNlCi0gICAgICAgICBzb21lIG90aGVyIHBhY2thZ2Ugd291bGQgY29udGFpbiB0aGlzIG1pc3NpbmcgXGAkMScgcHJvZ3JhbS4iCi0gICAgZXhpdCAxCi0gICAgOzsKLWVzYWMKLQotZXhpdCAwCmRpZmYgLS1naXQgYS9ta2luc3RhbGxkaXJzIGIvbWtpbnN0YWxsZGlycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2M4NzgzZS4uMDAwMDAwMAotLS0gYS9ta2luc3RhbGxkaXJzCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyEgL2Jpbi9zaAotIyBta2luc3RhbGxkaXJzIC0tLSBtYWtlIGRpcmVjdG9yeSBoaWVyYXJjaHkKLSMgQXV0aG9yOiBOb2FoIEZyaWVkbWFuIDxmcmllZG1hbkBwcmVwLmFpLm1pdC5lZHU+Ci0jIENyZWF0ZWQ6IDE5OTMtMDUtMTYKLSMgTGFzdCBtb2RpZmllZDogMTk5NC0wMy0yNQotIyBQdWJsaWMgZG9tYWluCi0KLWVycnN0YXR1cz0wCi0KLWZvciBmaWxlIGluICR7MSsiJEAifSA7IGRvIAotICAgc2V0IGZub3JkIGBlY2hvICI6JGZpbGUiIHwgc2VkIC1uZSAncy9eOlwvLyMvO3MvXjovLztzL1wvLyAvZztzL14jL1wvLztwJ2AKLSAgIHNoaWZ0Ci0KLSAgIHBhdGhjb21wPQotICAgZm9yIGQgaW4gJHsxKyIkQCJ9IDsgZG8KLSAgICAgcGF0aGNvbXA9IiRwYXRoY29tcCRkIgotICAgICBjYXNlICIkcGF0aGNvbXAiIGluCi0gICAgICAgLSogKSBwYXRoY29tcD0uLyRwYXRoY29tcCA7OwotICAgICBlc2FjCi0KLSAgICAgaWYgdGVzdCAhIC1kICIkcGF0aGNvbXAiOyB0aGVuCi0gICAgICAgIGVjaG8gIm1rZGlyICRwYXRoY29tcCIgMT4mMgotICAgICAgICBta2RpciAiJHBhdGhjb21wIiA+IC9kZXYvbnVsbCAyPiYxIHx8IGxhc3RlcnI9JD8KLSAgICAgZmkKLQotICAgICBpZiB0ZXN0ICEgLWQgIiRwYXRoY29tcCI7IHRoZW4KLQllcnJzdGF0dXM9JGxhc3RlcnIKLSAgICAgZmkKLQotICAgICBwYXRoY29tcD0iJHBhdGhjb21wLyIKLSAgIGRvbmUKLWRvbmUKLQotZXhpdCAkZXJyc3RhdHVzCi0KLSMgbWtpbnN0YWxsZGlycyBlbmRzIGhlcmUKZGlmZiAtLWdpdCBhL21vdmUtaWYtY2hhbmdlIGIvbW92ZS1pZi1jaGFuZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGVlMWIzNDguLjAwMDAwMDAKLS0tIGEvbW92ZS1pZi1jaGFuZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIS9iaW4vc2gKLQotIyBDb3B5cmlnaHQgKEMpIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0jIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLWlmCi10ZXN0IC1yICQyCi10aGVuCi1pZgotY21wICQxICQyID4gL2Rldi9udWxsCi10aGVuCi1lY2hvICQyIGlzIHVuY2hhbmdlZAotcm0gLWYgJDEKLWVsc2UKLW12IC1mICQxICQyCi1maQotZWxzZQotbXYgLWYgJDEgJDIKLWZpCmRpZmYgLS1naXQgYS9tcHctUkVBRE1FIGIvbXB3LVJFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MTQwYi4uMDAwMDAwMAotLS0gYS9tcHctUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLVRoaXMgaXMgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1hY2ludG9zaCh0bSkgTVBXKHRtKSBwb3J0IG9mIHRoZQotR05VIHRvb2xzLiAgVGhlIGluZm9ybWF0aW9uIGJlbG93IGFwcGxpZXMgdG8gYm90aCBuYXRpdmUgYW5kIGNyb3NzCi1jb21waWxlcnMuCi0KLShQbGVhc2Ugbm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gdmVyc2lvbnMgb2YgdGhpcyBmaWxlOyAibXB3LVJFQURNRSIKLWlzIHRoZSBzb3VyY2UgZm9ybSwgYW5kICJSZWFkIE1lIGZvciBNUFciIGlzIHRoZSBkaXN0cmlidXRpb24gZm9ybS4KLSJSZWFkIE1lIGZvciBNUFciIGhhcyA4LWJpdCBjaGFycyBzdWNoIGFzIFxPcHRpb24tZCBlbWJlZGRlZCBpbiBpdC4pCi0KLUlOU1RBTExJTkcgR05VIFRPT0xTCi0KLSogU3lzdGVtIFJlcXVpcmVtZW50cwotCi1UbyB1c2UgdGhlc2UgdG9vbHMsIHlvdSB3aWxsIG5lZWQgYSBNYWMgd2l0aCBhIDY4MDIwIG9yIGJldHRlciBvciBlbHNlCi1hbnkgUG93ZXJNYWMsIFN5c3RlbSA3LjEgb3IgbGF0ZXIsIGFuZCBNUFcgMy4zIG9yIDMuNC4gIFlvdSB3aWxsICpub3QqCi1uZWVkIGFueSBvdGhlciBNUFcgY29tcGlsZXIgdW5sZXNzIHlvdSB3YW50IHRvIHJlYnVpbGQgZnJvbSBzb3VyY2VzLAotbm9yIGV2ZW4gYW55IGluY2x1ZGUgZmlsZXMsIHVubGVzcyB5b3UgYXJlIGJ1aWxkaW5nIGFjdHVhbCBNYWMKLWFwcGxpY2F0aW9ucy4gIEZvciBQb3dlck1hYyBuYXRpdmUgeW91IHdpbGwgbmVlZCBQUENMaW5rLCBob3dldmVyOwotYWxzbyB0aGUgZXhlY3V0YWJsZXMgYXJlIFBvd2VyUEMtb25seS4KLQotKiBBdXRvbWF0ZWQgSW5zdGFsbGF0aW9uCi0KLVRoZSBzaW1wbGVzdCB3YXkgdG8gaW5zdGFsbCBHTlUgdG9vbHMgaXMgdG8gcnVuIHRoZSBJbnN0YWxsIHNjcmlwdC4KLVRoZSBzY3JpcHQgd2lsbCBjb3B5IHRoaW5ncyB0byB3aGVyZSB5b3Ugd2FudCB0byBrZWVwIHRoZW0sIHdpbGwgYnVpbGQKLWEgVXNlclN0YXJ0dXAgZmlsZSB3aXRoIHNldHRpbmdzIGNvcnJlc3BvbmRpbmcgdG8gd2hlcmUgdGhpbmdzIHdlcmUKLWNvcGllZCwgYW5kIG9mZmVyIHRvIHB1dCB0aGF0IFVzZXJTdGFydHVwIGZpbGUgaW4geW91ciBNUFcgZm9sZGVyLgotCi1UaGUgSW5zdGFsbCBzY3JpcHQgZG9lcyBub3QgYWx0ZXIgYW55dGhpbmcgaW4gdGhlIFN5c3RlbSBGb2xkZXIsIGFuZAotaXQgZG9lcyBub3QgdGFrZSBhbnkgYWN0aW9uIHdpdGhvdXQgY29uZmlybWF0aW9uLgotCi1UaGUgSW5zdGFsbCBzY3JpcHQgd2lsbCBiZSBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBiaW5hcnkKLWRpc3RyaWJ1dGlvbiwgb3IgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgb2JqZWN0IGRpcmVjdG9yeSBpZgotcmVidWlsZGluZyBmcm9tIHNvdXJjZS4gIChUaGUgc291cmNlcyBpbmNsdWRlIGEgZmlsZSBjYWxsZWQKLSJtcHctaW5zdGFsbCIgYXQgdGhlIHRvcCBsZXZlbCwgYnV0IGl0IGlzIHRoZSBzb3VyY2UgdG8gdGhlIEluc3RhbGwKLXNjcmlwdCBhbmQgY2Fubm90IGJlIHJ1biBkaXJlY3RseS4pCi0KLSogTWFudWFsIEluc3RhbGxhdGlvbgotCi1JZiB5b3UgZG9uJ3Qgd2FudCB0byBydW4gdGhlIEluc3RhbGwgc2NyaXB0LCB5b3UgY2FuIGRvIGluc3RhbGxhdGlvbgotbWFudWFsbHk7IHRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHN0ZXBzIGludm9sdmVkLgotCi1UaGUgR05VIHRvb2xzIGNhbiBnbyBpbiBhbnkgZGlyZWN0b3J5IHRoYXQgaXMgaW4geW91ciB7Q29tbWFuZHN9IGxpc3QuCi1XZSBnZW5lcmFsbHkgcHV0IGFsbCB0aGUgdG9vbHMgc29tZXdoZXJlIGxpa2Uge0Jvb3R9Q3lnbnVzOmxhdGVzdDpiaW4sCi1hbmQgdGhlbiBhZGQgdG8gYSBVc2VyU3RhcnR1cCBmaWxlOgotCi0Jc2V0IENvbW1hbmRzICJ7Qm9vdH1DeWdudXM6bGF0ZXN0OmJpbjose0NvbW1hbmRzfSIKLQotSG93ZXZlciwgdGhlIGNwcCBhbmQgY2MxIHByb2dyYW1zIG9mIEdDQyBhcmUgbm90IG5vcm1hbGx5IHN0b3JlZCBoZXJlLgotSW5zdGVhZCwgdGhleSB3aWxsIGJlIGluIGEgImxpYiIgZGlyZWN0b3J5IHRoYXQgaXMgYWxvbmdzaWRlICJiaW4iLAotYW5kIG9yZ2FuaXplZCBieSB0YXJnZXQgYW5kIHZlcnNpb24gdW5kZXJuZWF0aCwgd2l0aCBuYW1lcyBsaWtlCi0KLQk6bGliOmdjYy1saWI6PHRhcmdldD46Y3lnbnVzLTx2ZXJzaW9uPjoKLQotSWYgeW91IGJ1aWxkIGFuZCBpbnN0YWxsIGV2ZXJ5dGhpbmcgeW91cnNlbGYgYWNjb3JkaW5nIHRvIHRoZSBidWlsZAotaW5zdHJ1Y3Rpb25zIGJlbG93LCB0aGVuIHlvdSB3aWxsIG5vdCBoYXZlIGFueSBwcm9ibGVtcy4gIEhvd2V2ZXIsIHlvdQotbWF5IGRpc2NvdmVyIHRoYXQgR0NDIHNlZW1zIHVuYWJsZSB0byBmaW5kIHRoZSByaWdodCBjcHAgYW5kIGNjMTsKLXVzdWFsbHkgdGhpcyB3aWxsIGJlIGJlY2F1c2UgZGlyZWN0b3J5IG5hbWVzIGhhdmUgY2hhbmdlZC4gIChFdmVuCi1yZW5hbWluZyB5b3VyIGhhcmQgZGlzayB3aWxsIG1ha2UgdGhpcyBoYXBwZW4uKSAgSW4gc3VjaCBjYXNlcywgeW91Ci1oYXZlIHNldmVyYWwgY2hvaWNlcy4gIE9uZSBpcyBqdXN0IHRvIGFkZCB0aGlzIGRpcmVjdG9yeSB0bwote0NvbW1hbmRzfSwgYnV0IHRoZW4geW91IHdpbGwgbm90IGJlIGFibGUgdG8gZ2V0IGFueSBvdGhlciBjcHAgb3IgY2MxLAotc3VjaCBhcyB0aG9zZSB1c2VkIGJ5IGEgZGlmZmVyZW50IHRhcmdldCBvciB2ZXJzaW9uLiAgQW5vdGhlciB3YXkgaXMKLXRvIHJlbmFtZSB5b3VyIGRpc2sgYW5kIGRpcmVjdG9yaWVzIHRvIG1hdGNoIHRoZSBwcmVmaXggdXNlZCB3aGVuIHRoZQotdG9vbHMgd2VyZSBjb21waWxlZC4gIEZpbmFsbHksIHlvdSBjYW4gc2V0IHRoZSB2YXJpYWJsZQotR0NDX0VYRUNfUFJFRklYIHRvIHBvaW50IHRvIHRoZSBsaWJyYXJ5IGRpcmVjdG9yeToKLQotCXNldCBHQ0NfRVhFQ19QUkVGSVggTXlEaXNrOlN0dWZmOmxpYjpnY2MtbGliOgotCWV4cG9ydCBHQ0NfRVhFQ19QUkVGSVgKLQotWW91IG1heSBhbHNvIHdhbnQgdG8gZWRpdCBNUFcncyBIRVhBIDEyOCByZXNvdXJjZS4gIFdoZW4gR0NDIGlzIGJ1aWx0Ci11c2luZyBhIG5hdGl2ZSBHQ0MsIGl0IGlzIGNvbXBpbGVkIHRvIHVzZSBhIHNwZWNpYWwgc3RhY2sgYWxsb2NhdG9yCi1mdW5jdGlvbiBhbGxvY2EoKS4gIFdoaWxlIHRoaXMgaXMgdmVyeSBlZmZpY2llbnQsIGl0IG1lYW5zIHRoYXQgR0NDCi13aWxsIG5lZWQgY29uc2lkZXJhYmxlIHN0YWNrIHNwYWNlIHRvIHJ1biwgZXNwZWNpYWxseSB3aGVuIGNvbXBpbGluZwotbGFyZ2UgcHJvZ3JhbXMgd2l0aCBvcHRpbWl6YXRpb24gdHVybmVkIG9uLiAgWW91IGdpdmUgTVBXIG1vcmUgc3RhY2sKLWJ5IGVkaXRpbmcgdGhlIEhFWEEgMTI4IHJlc291cmNlIG9mIHRoZSBNUFcgU2hlbGwuICBBIHZhbHVlIG9mICIwMDA4Ci0wMDAwIiBnaXZlcyA1MTJLIG9mIHN0YWNrIHNpemUsIHdoaWNoIGlzIHVzdWFsbHkgc3VmZmljaWVudC4KLQotVVNJTkcgR05VIFRPT0xTCi0KLSogVXNpbmcgTmF0aXZlIFBvd2VyTWFjIEdDQwotCi1Vc2luZyBhIG5hdGl2ZSBQb3dlck1hYyBHQ0MgdG8gcHJvZHVjZSBNUFcgdG9vbHMgb3IgTWFjT1MgYXBwbGljYXRpb25zCi1pcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4ganVzdCAiZ0MgZm9vLmMiLCBhbHRob3VnaCBubyBtb3JlIGNvbXBsaWNhdGVkCi10aGFuIHdpdGggb3RoZXIgTWFjIGNvbXBpbGVycy4KLQotVG8gYnVpbGQgYSBuYXRpdmUgUG93ZXJNYWMgTVBXIHRvb2wsIHVzZSB0aGlzIHNlcXVlbmNlLCB3aGVyZSBoZWxsby5jCi1pcyB0aGUgdXN1YWwgImhlbGxvIHdvcmxkIiBwcm9ncmFtLCBhbmQgZ2VuZXJpY2NmcmcuciBpcyB0aGUgUmV6IGZpbGUKLXdpdGggdGhlIGNvZGUgZnJhZ21lbnQgcmVzb3VyY2U6Ci0KLWdDIC1Je0NJbmNsdWRlc30gLWZuby1idWlsdGluIC1EcGFzY2FsPSAtYyAtZyBoZWxsby5jCi1QUENMaW5rIGhlbGxvLm8gLW8gaGVsbG8gXE9wdGlvbi1kCi0JIntQUENMaWJyYXJpZXN9IlN0ZENSdW50aW1lLm8gXE9wdGlvbi1kCi0JIntTaGFyZWRMaWJyYXJpZXN9IkludGVyZmFjZUxpYiBcT3B0aW9uLWQKLQkie1NoYXJlZExpYnJhcmllc30iU3RkQ0xpYiBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDVG9vbExpYnMubyBcT3B0aW9uLWQKLQkie1BQQ0xpYnJhcmllc30iUFBDQ1J1bnRpbWUubyBcT3B0aW9uLWQKLQkie0dDQ1BQQ0xpYnJhcmllc30ibGliZ2NjLnhjb2ZmCi1yZXogLWQgQVBQTkFNRT0nIidoZWxsbyciJyBHZW5lcmljQ0ZSRy5yIC1vIGhlbGxvCi1zZXRmaWxlIC10ICdNUFNUJyAtYyAnTVBTICcgaGVsbG8KLQotVGhlIHNhbWUgc2VxdWVuY2Ugd29ya3MgdG8gYnVpbGQgYSBNYWNPUyBhcHBsaWNhdGlvbiwgYnV0IHlvdSBzZXQgdGhlIGZpbGUKLXR5cGUgdG8gJ0FQUEwnIGFuZCBkb24ndCBsaW5rIGluIFBQQ1Rvb2xMaWJzLm8uICBGb3IgZnVydGhlciBkZXRhaWxzIG9uCi11c2luZyBNUFcgdG8gYnVpbGQgTWFjIGFwcGxpY2F0aW9ucywgc2VlIHRoZSBnZW5lcmFsIE1QVyBkb2N1bWVudGF0aW9uLgotCi1SZWNlbnQgdmVyc2lvbnMgb2YgUFBDTGluayBoYXZlIGFuIG9wdGlvbiB0byBnZW5lcmF0ZSB0aGUgY29kZQotZnJhZ21lbnQgcmVzb3VyY2UgYW5kIGF1dG9tYXRpY2FsbHkgc2V0IGNyZWF0b3IgYW5kIGZpbGUgdHlwZTsKLWhlcmUgaXMgd2hhdCBHZW5lcmljQ0ZSRy5yIHNob3VsZCBsb29rIGxpa2UgaWYgeW91IGhhdmUgYW4gb2xkZXIKLVBQQ0xpbmsgb3IgYXJlIHVzaW5nIEdOVSBsZDoKLQotI2luY2x1ZGUgIkNvZGVGcmFnbWVudFR5cGVzLnIiCi0KLXJlc291cmNlICdjZnJnJyAoMCkgewotICAgICAgICB7Ci0gICAgICAgICAgICAgICAga1Bvd2VyUEMsCi0gICAgICAgICAgICAgICAga0Z1bGxMaWIsCi0gICAgICAgICAgICAgICAga05vVmVyc2lvbk51bSxrTm9WZXJzaW9uTnVtLAotICAgICAgICAgICAgICAgIDAsMCwKLSAgICAgICAgICAgICAgICBrSXNBcHAsa09uRGlza0ZsYXQsa1plcm9PZmZzZXQsa1dob2xlRm9yaywKLSAgICAgICAgICAgICAgICBBUFBOQU1FIC8vIG11c3QgYmUgZGVmaW5lZCBvbiBSZXogY29tbWFuZCBsaW5lIHdpdGggLWQgb3B0aW9uCi0gICAgICAgIH0KLX07Ci0KLUluIGdlbmVyYWwgdGhpcyBwb3J0IG9mIEdDQyBzdXBwb3J0cyB0aGUgc2FtZSBvcHRpb24gc3ludGF4IGFuZAotYmVoYXZpb3IgYXMgaXRzIFVuaXggY291bnRlcnBhcnQuICBJdCBhbHNvIGhhcyBzaW1pbGFyIGNvbXBpbGF0aW9uCi1ydWxlcywgc28gaXQgd2lsbCBydW4gdGhlIGFzc2VtYmxlciBvbiAucyBmaWxlcyBhbmQgc28gZm9ydGguCi0KLVRoZSBHQ0MgbWFudWFsIGluY2x1ZGVzIGZ1bGwgaW5mb3JtYXRpb24gb24gdGhlIGF2YWlsYWJsZSBvcHRpb25zLgotT25lIG9wdGlvbiB0aGF0IG1heSBiZSBlc3BlY2lhbGx5IHVzZWZ1bCBpcyAiLXYiLCB3aGljaCBzaG93cyB5b3Ugd2hhdAotdG9vbHMgYW5kIG9wdGlvbnMgYXJlIGJlaW5nIHVzZWQ7IHVubGlrZSBtb3N0IE1hYyBDIGNvbXBpbGVycywgR0NDCi1kaXJlY3RzIGFzc2VtYmx5IGFuZCBsaW5raW5nIGluIGFkZGl0aW9uIHRvIGNvbXBpbGF0aW9uLgotCi1NUFcgR0NDIGRvZXMgZmVhdHVyZSB0d28gZXh0ZW5zaW9ucyB0byB0aGUgb3B0aW9uIHN5bnRheDsgJy1kIG1hY3JvPW5hbWUnCi13b3JrcyBqdXN0IGFzICctRG1hY3JvPW5hbWUnIGRvZXMgaW4gVW5peCwgYW5kICctaSBkaXJlY3RvcnknIHdvcmtzIHRoZQotc2FtZSBhcyAnLUlkaXJlY3RvcnknLgotCi1NUFcgR0NDIHN1cHBvcnRzIHRoZSB1c3VhbCBQYXNjYWwtc3R5bGUgc3RyaW5ncyBhbmQgYWxpZ25tZW50IHByYWdtYXMuCi0KLVRvIGZpbmQgc3RhbmRhcmQgaW5jbHVkZSBmaWxlcyB5b3UgY2FuIHNldCB0aGUgdmFyaWFibGUgR0NDSW5jbHVkZXM6Ci0KLQlzZXQgR0NDSW5jbHVkZXMgTXlEaXNrOk15SW5jbHVkZXM6Ci0JZXhwb3J0IEdDQ0luY2x1ZGVzCi0KLUdDQ0luY2x1ZGVzIGlzIHNpbWlsYXIgdG8gTVBXJ3MgQ0luY2x1ZGVzIG9yIENXJ3MgTVdDSW5jbHVkZXMuICBJbgotb3JkZXIgdG8gdXNlIE1QVydzIHVzdWFsIGluY2x1ZGUgZmlsZXMsIGp1c3Qgc2F5OgotCi0Jc2V0IEdDQ0luY2x1ZGVzICJ7Q0luY2x1ZGVzfSIKLQlleHBvcnQgR0NDSW5jbHVkZXMKLQotKiBVc2luZyBHQ0MgYXMgYSBDcm9zcy1Db21waWxlcgotCi1JZiB5b3UgaGF2ZSBhIGNyb3NzLWNvbXBpbGVyLCBhbmQgeW91IGhhdmUgYWxsIG9mIHRoZSBjb3JyZWN0Ci10YXJnZXQtc2lkZSBjcnQwIGFuZCBsaWJyYXJpZXMgYXZhaWxhYmxlLCB0aGVuIHRvIGNvbXBpbGUgYW5kIGxpbmsgYQotZmlsZSAiZm9vLmMiLCB5b3UgY2FuIHNheSBqdXN0Ci0KLQlnQyBmb28uYwotCi1UaGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBhbiBNUFcgYmluYXJ5IGZpbGUgbmFtZWQgImEub3V0IjsgdGhlIGZvcm1hdAotb2YgdGhlIGNvbnRlbnRzIHdpbGwgZGVwZW5kIG9uIHdoaWNoIHRhcmdldCBpcyBpbiB1c2UsIHNvIGZvciBpbnN0YW5jZQotYSBNSVBTLXRhcmdldGluZyBHQ0Mgd2lsbCBwcm9kdWNlIEVDT0ZGIG9yIEVMRiBleGVjdXRhYmxlcy4KLQotTm90ZSB0aGF0IHVzaW5nIE1QVyBpbmNsdWRlIGZpbGVzIHdpdGggYSBjcm9zcy1jb21waWxlciBpcyBzb21ld2hhdAotZGFuZ2Vyb3VzLgotCi0qIFVzaW5nIHRoZSBBc3NlbWJsZXIgYW5kIEZyaWVuZHMKLQotVGhlIGFzc2VtYmxlciAoImFzIikgYW5kIGxpbmtlciAoImxkIikgYXJlIGZhaXRoZnVsIHBvcnRzIG9mIHRoZWlyCi1Vbml4IGNvdW50ZXJwYXJ0cy4gIFNpbWlsYXJseSwgdGhlIGJpbnV0aWxzICJhciIsICJjcGx1c2ZpbHQiLCAibm0iLAotIm9iamNvcHkiLCAib2JqZHVtcCIsICJyYW5saWIiLCAic2l6ZSIsICJzdHJpbmdzIiwgYW5kICJzdHJpcCIgYXJlIGFsbAotbGlrZSB0aGV5IGFyZSB1bmRlciBVbml4LiAgKE5vdGUgdGhhdCAiY3BsdXNmaWx0IiBpcyB1c3VhbGx5IGNhbGxlZAotImMrK2ZpbHQiIHVuZGVyIFVuaXguKQotCi0qIFVzaW5nIEdEQgotCi1UaGVyZSBhcmUgdHdvIGZsYXZvcnMgb2YgR0RCLiAgImdkYiIgaXMgYW4gTVBXIHRvb2wgdGhhdCB3b3JrcyB2ZXJ5Ci1tdWNoIGxpa2UgaXQgZG9lcyBpbiBVbml4OyBwdXQgYSBjb21tYW5kIGludG8gdGhlIE1QVyB3b3Jrc2hlZXQgYW5kCi10eXBlIHRoZSA8ZW50ZXI+IGtleSB0byBzZW5kIGl0IHRvIEdEQi4gIFdoaWxlICJnZGIiIGlzIHJ1bm5pbmcsIHlvdQotY2Fubm90IGRvIGFueXRoaW5nIGVsc2UgaW4gTVBXLCBhbHRob3VnaCB5b3UgY2FuIHN3aXRjaCB0byBvdGhlcgotTWFjIGFwcGxpY2F0aW9ucyBhbmQgdXNlIHRoZW0uCi0KLSJTaW93R0RCIiBpcyBhbHNvIGEgTWFjIGFwcGxpY2F0aW9uLCBidXQgaXQgaXMgR0RCIHVzaW5nIHRoZSBTSU9XCi1wYWNrYWdlIHRvIHByb3ZpZGUgY29uc29sZSBlbXVsYXRpb24uICBDb21tYW5kcyBhcmUgZXhhY3RseSBhcyBmb3IgdGhlCi1NUFcgdG9vbCwgYnV0IHNpbmNlIHRoaXMgaXMgaXRzIG93biBhcHBsaWNhdGlvbiwgeW91IGNhbiBzd2l0Y2gKLWJldHdlZW4gaXQgYW5kIE1QVy4KLQotQlVJTERJTkcgR05VIFRPT0xTCi0KLVRoaXMgcG9ydCBvZiB0aGUgR05VIHRvb2xzIHVzZXMgYSBjb25maWd1cmUgc2NyaXB0IHNpbWlsYXIgdG8KLXRoYXQgdXNlZCBmb3IgR05VIHRvb2xzIHVuZGVyIFVuaXgsIGJ1dCByZXdyaXR0ZW4gZm9yIE1QVy4gIEFzIHdpdGgKLVVuaXggY29uZmlndXJhdGlvbiwgdGhlcmUgaXMgYW4gIm9iamVjdCIgZGlyZWN0b3J5IHRoYXQgbWF5IGJlCi1kaWZmZXJlbnQgZnJvbSB0aGUgInNvdXJjZSIgZGlyZWN0b3J5LiAgSW4gdGhlIGV4YW1wbGUgY29tbWFuZHMgYmVsb3csCi13ZSB3aWxsIGFzc3VtZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkgaW4gdGhlIG9iamVjdCBkaXJlY3RvcnksIGFuZCB0aGF0Ci10aGUgc291cmNlIGRpcmVjdG9yeSBpcyAie0Jvb3R9Q3lnbnVzOnNyYzoiLgotCi0qIFJlcXVpcmVtZW50cyBmb3IgQnVpbGRpbmcKLQotSW4gYWRkaXRpb24gdG8gdGhlIHNvdXJjZXMsIHlvdSB3aWxsIG5lZWQgYSBzZXQgb2YgdG9vbHMgdGhhdCB0aGUKLWNvbmZpZ3VyZSBhbmQgYnVpbGQgc2NyaXB0cyBhc3N1bWUgdG8gYmUgYXZhaWxhYmxlLiAgVGhlc2UgdG9vbHMKLShhbmQgdGhlaXIgdmVyc2lvbnMsIGlmIHJlbGV2YW50KSBhcmUgYXMgZm9sbG93czoKLQotCWJ5YWNjIHRvb2wKLQlmbGV4ICgyLjMuNykgdG9vbCAoYW5kIEZsZXguc2tlbCBmaWxlKQotCWZvcndhcmQtaW5jbHVkZSBzY3JpcHQKLQlNb3ZlSWZDaGFuZ2Ugc2NyaXB0Ci0JbXB3LXRvdWNoIHNjcmlwdAotCW1wdy10cnVlIHNjcmlwdAotCU5ld0ZvbGRlclJlY3Vyc2l2ZSBzY3JpcHQKLQludWxsLWNvbW1hbmQgc2NyaXB0Ci0Jb3Blbi1icmFjZSBzY3JpcHQKLQlzZWQgKDEuMTMpIHRvb2wKLQl0ci03dG84IHNjcmlwdAotCXRydWUgc2NyaXB0Ci0KLVRoZSBzY3JpcHRzIGFyZSBpbiB0aGUgc291cmNlcywgdW5kZXIgdXRpbHM6bXB3Oi4gWW91IG11c3QgYXJyYW5nZSB0bwotZ2V0IHRoZSBvdGhlciB0b29scyB5b3Vyc2VsZiAodGhleSBhcmUgcmVhZGlseSBhdmFpbGFibGUgZnJvbSB0aGUKLSJ1c3VhbCIgbmV0IHNpdGVzLCBhbmQgYXJlIGFsc28gb24gbWFueSBDRFJPTVMpLiAgSW4gYWRkaXRpb24sIHRoZXJlCi13aWxsIHVzdWFsbHkgYmUgYSBzZXQgb2YgdGhlc2UgYXZhaWxhYmxlIGF0IGZ0cC5jeWdudXMuY29tLCBpbiBwdWIvbWFjLgotCi1Zb3UgbWF5IHB1dCB0aGUgYnVpbGQgdG9vbHMgaW4geW91ciB1c3VhbCBUb29scyBvciBTY3JpcHRzCi1kaXJlY3Rvcmllcywgb3Iga2VlcCB0aGVtIGluIGEgc2VwYXJhdGUgZGlyZWN0b3JpZXMuICBXZSBwcmVmZXIgdG8KLW1ha2UgYSBkaXJlY3RvcnkgY2FsbGVkICJidWlsZHRvb2xzIiBhbmQgd2UgcHV0IHRoaXMgaW4gb25lIG9mIG91cgotVXNlclN0YXJ0dXAgZmlsZXM6Ci0KLQlzZXQgQ29tbWFuZHMgIntCb290fUN5Z251czpidWlsZHRvb2xzOix7Q29tbWFuZHN9IgotCi1GbGV4IHVzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgRkxFWF9TS0VMRVRPTiB0byBsb2NhdGUgaXRzIHNrZWxldG9uCi1maWxlLCBzbyB5b3UgbmVlZCB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzLCBwcmVmZXJhYmx5IGluIGEgVXNlclN0YXJ0dXA6Ci0KLQlTZXQgRkxFWF9TS0VMRVRPTiAie0Jvb3R9IkN5Z251czpidWlsZHRvb2xzOkZsZXguc2tlbAotCUV4cG9ydCBGTEVYX1NLRUxFVE9OCi0KLSogQ29uZmlndXJpbmcKLQotQmVmb3JlIHlvdSBjYW4gYnVpbGQgYW55dGhpbmcsIHlvdSBtdXN0IGNvbmZpZ3VyZS4gIFlvdSBkbyB0aGlzIGJ5Ci1jcmVhdGluZyBhbiBkaXJlY3Rvcnkgd2hlcmUgb2JqZWN0IGZpbGVzIHdpbGwgYmUgc3RvcmVkLCBzZXRkaXJlY3RvcnkKLXRvIHRoYXQgZGlyZWN0b3J5IGFuZCBkbyBhIGNvbmZpZ3VyZSBjb21tYW5kOgotCi0Je0Jvb3R9Q3lnbnVzOnNyYzptcHctY29uZmlndXJlIC0tdGFyZ2V0IDxuYW1lPiAtLWNjIDxjb21waWxlcj4gLS1zcmNkaXIge0Jvb3R9Q3lnbnVzOnNyYzogLS1wcmVmaXggPHdoYXRldmVyPgotCi1JZiB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyBub3QgaW4geW91ciB7Q29tbWFuZHN9IGxpc3QsIHRoZW4geW91IG11c3QKLXN1cHBseSBhIGZ1bGwgcGF0aG5hbWUgdG8gbXB3LWNvbmZpZ3VyZSwgc2luY2UgbXB3LWNvbmZpZ3VyZSBpbnZva2VzCi1pdHNlbGYgYWZ0ZXIgc3dpdGNoaW5nIGludG8gZWFjaCBzdWJkaXJlY3RvcnkuICBVc2luZyBhIHJlbGF0aXZlCi1wYXRobmFtZSwgZXZlbiBzb21ldGhpbmcgbGlrZSAnOm1wdy1jb25maWd1cmUnLCB3aWxsIHRoZXJlZm9yZSBub3Qgd29yay4KLQotPG5hbWU+IG11c3QgYmUgYSBrbm93biB0YXJnZXQuICBWYWxpZCBvbmVzIGluY2x1ZGUgIm02OGstYXBwbGUtbWFjb3MiLAotInBvd2VycGMtYXBwbGUtbWFjb3MiLCAiaTM4Ni11bmtub3duLWdvMzIiLCAibWlwcy1pZHQtZWNvZmYiLCBhbmQKLSJzaC1oaXRhY2hpLWhtcyIuICBOb3QgYWxsIHRhcmdldCB0eXBlcyBhcmUgYWNjZXB0ZWQgZm9yIGFsbCBvZiB0aGUKLXRvb2xzIHlldC4KLQotPGNvbXBpbGVyPiBtdXN0IGJlIHRoZSBuYW1lIG9mIHRoZSBjb21waWxlciB0byB1c2UuICBJdCBkZWZhdWx0cyB0byAibXB3YyIuCi0KLQkobTY4aykKLQltcHdjCU1QVyBDCi0Jc2M2OGsJU3ltYW50ZWMgQwotCW13YzY4awlNZXRyb3dlcmtzIEMgKENvZGV3YXJyaW9yKQotCWdjYzY4awlHQ0MKLQotCShwb3dlcnBjKQotCXBwY2MJUFBDQwotCW1yYwlNYWNpbnRvc2ggb24gUmlzQyAoTWlzdGVyIEMsIGFrYSg/KSBGcmFua2Vuc3RlaW4pCi0Jc2NwcGMJU3ltYW50ZWMgQwotCW13Y3BwYwlNZXRyb3dlcmtzIEMgKENvZGV3YXJyaW9yKQotCWdjY3BwYwlHQ0MKLQotTm90IGFsbCBjb21waWxlcnMgd2lsbCBjb21waWxlIGFsbCB0b29scyBlcXVhbGx5IHdlbGwhICBGb3IgbTY4ayBNYWNzLAotTVBXIEMgaGFzIHRoZSBiZXN0IHJlY29yZCBzbyBmYXIgKGl0IGhhcyBwcm9ibGVtcywgYnV0IHRoZXkgY2FuIGJlCi13b3JrZWQgYXJvdW5kKSwgd2hpbGUgZm9yIFBvd2VyTWFjcywgQ29kZVdhcnJpb3IgaXMgdGhlIG9ubHkgY29tcGlsZXIKLXRoYXQgaGFzIHN1Y2Nlc3NmdWxseSBjb21waWxlZCBldmVyeXRoaW5nIGludG8gcnVubmluZyBjb2RlLgotCi08cHJlZml4PiBpcyB0aGUgcGF0aCB0aGF0ICJnY2MiIHdpbGwgcHJlcGVuZCB3aGVuIGxvb2tpbmcgZm9yIHRvb2xzCi10byBleGVjdXRlLiAgR0NDX0VYRUNfUFJFRklYIG92ZXJyaWRlcyB0aGlzIHZhbHVlLCBzbyB5b3UgbmVlZCBub3QKLWluY2x1ZGUgaXQgaWYgeW91IHBsYW4gdG8gdXNlIEdDQ19FWEVDX1BSRUZJWC4KLQotQXMgYW4gZXhhbXBsZSwgaGVyZSBpcyB0aGUgY29uZmlndXJlIGxpbmUgdGhhdCB5b3UgY291bGQgdXNlIHRvIGJ1aWxkCi1uYXRpdmUgUG93ZXJNYWMgR0NDOgotCi0ie0Jvb3R9IkN5Z251czpzcmM6bXB3LWNvbmZpZ3VyZSAtLWNjIG13Y3BwYyAtLXRhcmdldCBwb3dlcnBjLWFwcGxlLW1hY29zIC0tc3JjZGlyICJ7Qm9vdH0iQ3lnbnVzOnNyYzogLS1wcmVmaXggIntCb290fSJHTlVUb29sczoKLQotKiBCdWlsZGluZwotCi1JZiB5b3UgdXNlIENvZGVXYXJyaW9yLCB5b3UgKm11c3QqIGZpcnN0IHNldCBNV0NJbmNsdWRlcyB0bwote0NJbmNsdWRlc30uICBUaGlzIGlzIGJlY2F1c2UgeW91IHdpbGwgYmUgYnVpbGRpbmcgTVBXIHRvb2xzLCBhbmQKLXRoZWlyIHN0YW5kYXJkIEkvTyB3b3JrcyBieSBtYWtpbmcgcmVmZXJlbmNlcyB0byBkYXRhIHRoYXQgaXMgcGFydCBvZgotdGhlIE1QVyBTaGVsbCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgY29kZSBtdXN0IGJlIGNvbXBpbGVkIGFuZCBsaW5rZWQKLXdpdGggbWFjcm9zIHRoYXQgcmVmZXIgdG8gdGhhdCBkYXRhLCBhbmQgdGhvc2UgbWFjcm9zIGFyZSBpbgote0NJbmNsdWRlc30sIG5vdCB0aGUgZGVmYXVsdCB7TVdDSW5jbHVkZXN9LiAgV2l0aG91dCB0aGlzIGNoYW5nZSwgeW91Ci13aWxsIGVuY291bnRlciBwcm9ibGVtcyBjb21waWxpbmcgbGliaWJlcnR5L21wdy5jLCBidXQgdHdlYWtpbmcgdGhhdAotZmlsZSBvbmx5IG1hc2tzIHRoZSByZWFsIHByb2JsZW0sIGFuZCBkb2VzIG5vdCBmaXggaXQuCi0KLVRoZSBjb21tYW5kCi0KLQltcHctYnVpbGQKLQotd2lsbCBidWlsZCBldmVyeXRoaW5nLiBCdWlsZGluZyB3aWxsIHRha2Ugb3ZlciBhbiBob3VyIG9uIGEgUXVhZHJhIDgwMAotb3IgUG93ZXJNYWMgODEwMC8xMTAsIGxvbmdlciBpZiB0aGUgc291cmNlcyBhcmUgb24gYSBzaGFyZWQgdm9sdW1lLgotCi1Zb3UgbWF5IHNlZSBzb21lIHdhcm5pbmdzOyB0aGVzZSBhcmUgbW9zdGx5IGxpa2VseSBiZW5pZ24sIHR5cGljYWxseQotZGlzYWdyZWVtZW50cyBhYm91dCBkZWNsYXJhdGlvbnMgb2YgbGlicmFyeSBhbmQgc3lzdGVtIGZ1bmN0aW9ucy4KLQotKiBJbnN0YWxsaW5nCi0KLVRvIGluc3RhbGwgdGhlIGp1c3QtYnVpbHQgdG9vbHMsIHVzZSB0aGUgY29tbWFuZAotCi0JbXB3LWJ1aWxkIGluc3RhbGwKLQotVGhpcyBwYXJ0IG9mIHRoZSBpbnN0YWxsYXRpb24gcHJvY2VkdXJlIGp1c3QgY29waWVzIGZpbGVzIHRvIHRoZQotbG9jYXRpb24gc3BlY2lmaWVkIGF0IGNvbmZpZ3VyZSB0aW1lIGJ5IDxwcmVmaXg+LCBhbmQsIGluIHNvbWUgY2FzZXMsCi1yZW5hbWVzIHRoZW0gZnJvbSB0ZW1wb3JhcnkgaW50ZXJuYWwgbmFtZXMgdG8gdGhlaXIgdXN1YWwgbmFtZXMuIFRoaXMKLWluc3RhbGwgcHJvY2VzcyBpcyAqbm90KiB0aGUgc2FtZSBhcyB3aGF0IHRoZSBJbnN0YWxsIHNjcmlwdCBkb2VzOwotSW5zdGFsbCBjYW4gY29weSB0b29scyBmcm9tIHRoZSBpbnN0YWxsYXRpb24gbG9jYXRpb24gY2hvc2VuIGF0Ci1jb25maWd1cmF0aW9uIHRpbWUgdG8gYSB1c2VyLWNob3NlbiBwbGFjZSwgYW5kIHNldHMgdXAgYSBVc2VyU3RhcnR1cAotZmlsZS4gIE5vdGUgdGhhdCB3aGlsZSB0aGUgSW5zdGFsbCBzY3JpcHQgaXMgb3B0aW9uYWwsIHRoZSBpbnN0YWxsCi1idWlsZCBhY3Rpb24gcGVyZm9ybXMgc29tZSB0YXNrcyB3b3VsZCBiZSB2ZXJ5IGhhcmQgdG8gcmVwbGljYXRlCi1tYW51YWxseSwgc28geW91IHNob3VsZCBhbHdheXMgZG8gaXQgYmVmb3JlIHVzaW5nIHRoZSB0b29scy4KLQotKiBLbm93biBQcm9ibGVtcyBXaXRoIFVzaW5nIFZhcmlvdXMgQ29tcGlsZXJzIHRvIEJ1aWxkCi0KLU1vc3QgdmVyc2lvbnMgb2YgTVBXIEMgaGF2ZSBwcm9ibGVtcyB3aXRoIGNvbXBpbGluZyBHTlUgc29mdHdhcmUuCi0KLU1QVyBDIDMuMi54IGhhcyBwcmVwcm9jZXNzaW5nIGJ1Z3MgdGhhdCByZW5kZXIgaXQgaW5jYXBhYmxlIG9mCi1jb21waWxpbmcgdGhlIEJGRCBsaWJyYXJ5LCBzbyBpdCBjYW4ndCBiZSB1c2VkIGF0IGFsbCBmb3IgYnVpbGRpbmcgQkZELgotCi1NUFcgQyAzLjMsIDMuMy4xLCBhbmQgMy4zLjIgd2lsbCBzcG9udGFuZW91c2x5IGNsYWltIHRvIGhhdmUgZm91bmQKLWVycm9ycyBpbiB0aGUgc291cmNlIGNvZGUsIGJ1dCBpbiBmYWN0IHRoZSBjb2RlIGlzIHBlcmZlY3RseSBmaW5lLiAgSWYKLXRoaXMgaGFwcGVucywganVzdCBzZXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGJhY2sgdG8gdGhlIHRvcC1sZXZlbAotb2JqZGlyICh3aGVyZSB0aGUgY29uZmlndXJlIGNvbW1hbmQgYWJvdmUgd2FzIHBlcmZvcm1lZCksIGFuZCB0eXBlCi0ibXB3LWJ1aWxkIGFsbCIgYWdhaW4uICBJZiBpdCBnb2VzIG9uIHRocm91Z2ggdGhlIHN1cHBvc2VkIGVycm9yLCB0aGVuCi15b3UgZ290IG9uZSBvZiB0aGUgc3B1cmlvdXMgZXJyb3JzLiAgQSBmdWxsIGJ1aWxkIG1heSByZXF1aXJlIGEgbnVtYmVyCi1vZiB0aGVzZSByZXN0YXJ0cy4KLQotTVBXIEMgMy4zLjMgc2VlbXMgdG8gd29yayBPSywgYXQgbGVhc3Qgd2l0aCB0aGUgYWlkIG9mIGEgbnVtYmVyIG9mCi13b3JrYXJvdW5kcyB0aGF0IGFyZSBpbiB0aGUgc291cmNlcyAobG9vayBmb3IgI2lmZGVmIE1QV19DKS4KLQotVmVyc2lvbnMgb2YgTVBXIE1ha2UgZWFybGllciB0aGFuIDQuMGQyIGhhdmUgZXhoaWJpdGVkIGJpemFycmUgYmVoYXZpb3IsCi1mYWlsdXJlIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzIGFuZCB0aGUgbGlrZS4KLQotTWV0cm93ZXJrcyBDVzYgUFBDIGxpbmtlciAoTVdMaW5rUFBDKSBzZWVtcyB0byBkbyBiYWQgdGhpbmdzIHdpdGggbWVtb3J5Ci1pZiB0aGUgIk1vZGVybiBNZW1vcnkgTWFuYWdlciIgaXMgdHVybmVkIG9uIChpbiB0aGUgTWVtb3J5IGNvbnRyb2wgcGFuZWwpLAotYnV0IHdvcmtzIE9LIGlmIGl0IGlzIHR1cm5lZCBvZmYuCi0KLU1ldHJvd2Vya3MgQ1c2IGxvc2VzIGJpZ3RpbWUgY29tcGlsaW5nIG9wY29kZXM6cHBjLW9wYy5jLCB3aGljaCBoYXMKLXNvbWUgZGVlcGx5IG5lc3RlZCBtYWNyb3MuICAoQ1c3IGlzIE9LLikgIFRoZXJlIGlzIGEgd2F5IHRvIHBhdGNoIHRoZQotZmlsZSwgYnkgc3Vic3RpdHV0aW5nIGNvbnN0YW50IHZhbHVlcy4gIElmIHlvdSBuZWVkIHRvIGRvIHRoaXMsCi1jb250YWN0IHNoZWJzQGN5Z251cy5jb20gZm9yIGRldGFpbHMuCi0KLTxHZXN0YWx0Lmg+IGlzIG1pc3NpbmcgZnJvbSB7Q0luY2x1ZGVzfSBpbiB0aGUgTVBXIHZlcnNpb24gdGhhdCBjb21lcwotd2l0aCBDVzcuICBZb3UgY2FuIGp1c3QgY29weSB0aGUgb25lIGluIENXNydzIHtNV0NJbmNsdWRlc30uCi0KLUNXOCBhbmQgbGF0ZXIgaGF2ZSBjaGFuZ2VzIHRvIGhlYWRlcnMgYW5kIHN1Y2ggdGhhdCB3aWxsIHJlcXVpcmUgY2hhbmdlcwotdG8gdGhlIHNvdXJjZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB0aGVtIHRvIHJlYnVpbGQuCi0KLUtOT1dOIEJVR1MKLQotVGhlIGRlY2xhcmF0aW9ucyBmb3IgbWVtY3B5IGFuZCBtZW1jbXAgaW4gc29tZSB2ZXJzaW9ucyBvZiBoZWFkZXIgZmlsZXMKLW1heSBjb25mbGljdCB3aXRoIEdDQydzIGJ1aWx0aW4gZGVmaW5pdGlvbi4gIEVpdGhlciB1c2UgLWZuby1idWlsdGluCi1vciBpZ25vcmUgdGhlIHdhcm5pbmdzLgotCi1UaGlzIGlzIG5vdCBhIGJ1ZywgYnV0IC0gd2F0Y2ggb3V0IGZvciBjci9ubCB0cmFuc2xhdGlvbiEgIEZvciBpbnN0YW5jZSwKLWlmIGNvbmZpZy9tcHctbWgtbXB3IGlzIG5vdCBwcm9wZXJseSB0cmFuc2xhdGVkIGJlY2F1c2UgaXQgaGFzIGJlZW4KLWNvcGllZCBvciB1cGRhdGVkIHNlcGFyYXRlbHksIHRoZW4gZXZlcnl0aGluZyB3aWxsIGFsbW9zdCBidWlsZCwgYnV0Ci15b3Ugd2lsbCBnZXQgcHV6emxpbmcgZXJyb3IgbWVzc2FnZXMgZnJvbSBtYWtlIG9yIHRoZSBjb21waWxlci4KLQotJy8nIG9yICcgJyBlbWJlZGRlZCBpbiBhbnkgZGV2aWNlLCBkaXJlY3RvcnksIG9yIGZpbGUgbmFtZSBtYXkgb3IgbWF5Ci1ub3Qgd29yay4KLQotb2JqY29weSAtTyBzcmVjIGZvby5vIG1ha2VzIHJhbmRvbSBvdXRwdXQgZmlsZW5hbWVzLgotCi1NYWMteC1taXBzIHJlcXVpcmVzIC1tZ2FzIGJ1dCBVbml4IGhvc3RzIGRvbid0LgotCi1HREIgd2lsbCBmcmVxdWVudGx5IHJlcXVpcmUgYSAnLycgb24gdGhlIGZyb250IG9mIGEgZGV2aWNlIG5hbWUgaW4gb3JkZXIKLXRvIHJlY29nbml6ZSBpdCBhcyBhbiBhYnNvbHV0ZSByYXRoZXIgdGhhbiBhIHJlbGF0aXZlIHBhdGhuYW1lLgotCi1HREIgZG9lc24ndCBzZWVtIHRvIHVzZSB0aGUgcHJpbnRlciBwb3J0IGNvcnJlY3RseSwgYWx0aG91Z2ggaXQgdHJpZXMuCi0KLVRoZSBjdXJzb3IgZG9lc24ndCBhbHdheXMgc3BpbiBhcyBtdWNoIGFzIGl0IHNob3VsZC4gIFRvIGdldCBlbGFib3JhdGUKLXN0YXRpc3RpY3MgYW5kIHdhcm5pbmdzIGFib3V0IHNwaW4gcmF0ZXMsIGFkZCB0aGlzIHRvIFVzZXJTdGFydHVwOgotCi0Jc2V0IE1FQVNVUkVfU1BJTiBhbGwKLQlleHBvcnQgTUVBU1VSRV9TUElOCmRpZmYgLS1naXQgYS9tcHctYnVpbGQuaW4gYi9tcHctYnVpbGQuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZDk1MzAuLjAwMDAwMDAKLS0tIGEvbXB3LWJ1aWxkLmluCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLSMgVG9wLWxldmVsIHNjcmlwdCBmcmFnbWVudCB0byBidWlsZCBldmVyeXRoaW5nIGZvciBNUFcuCi0KLVNldCBzYXZlZGlyICJgRGlyZWN0b3J5YCIKLQotI1NldCBFY2hvIDEKLQotU2V0IFRoaXNTY3JpcHQgInswfSIKLQotU2V0IG9iamRpciAiOiIKLQotU2V0IHZlcmlmeSAwCi0KLVNldCBCdWlsZFRhcmdldCAibm9uZSIKLQotIyBQYXJzZSBhcmd1bWVudHMuCi0KLUxvb3AKLQlCcmVhayBJZiB7I30gPT0gMAotCQlJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL25vbmUvCi0JCQlTZXQgQnVpbGRUYXJnZXQgInsxfSIKLQkJRWxzZQotCQkJRWNobyBPbmx5IG9uZSBidWlsZCB0YXJnZXQgYWxsb3dlZCwgaWdub3JpbmcgInsxfSIKLQkJRW5kIElmCi0JU2hpZnQgMQotRW5kIExvb3AKLQotSWYgIntCdWlsZFRhcmdldH0iID1+IC9ub25lLwotCVNldCBCdWlsZFRhcmdldCAiYWxsIgotRW5kIElmCi0KLUlmIHt2ZXJpZnl9ID09IDEKLQlFY2hvICIjIiBEb2luZyAie1RoaXNTY3JpcHR9IiAie0J1aWxkVGFyZ2V0fSIgaW4gImBEaXJlY3RvcnlgIiAuLi4gCi1FbmQgSWYKLQotU2V0IHJhbm1ha2UgMAotCi1JZiAiYEV4aXN0cyBNYWtlZmlsZWAiICE9ICIiCi0JRWNobyAiU2V0IEVjaG8gMSIgPntCdWlsZFRhcmdldH0ubWFrZW91dAotCU1ha2UgLWYgTWFrZWZpbGUge0J1aWxkVGFyZ2V0fSA+PntCdWlsZFRhcmdldH0ubWFrZW91dAotCXtCdWlsZFRhcmdldH0ubWFrZW91dAotCURlbGV0ZSB7QnVpbGRUYXJnZXR9Lm1ha2VvdXQKLQlTZXQgcmFubWFrZSAxCi1FbmQgSWYKLQotSWYgImBFeGlzdHMgTWFrZWZpbGUuUFBDYCIgIT0gIiIKLQlFY2hvICJTZXQgRWNobyAxIiA+e0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCU1ha2UgLWYgTWFrZWZpbGUuUFBDIHtCdWlsZFRhcmdldH0gPj57QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0Je0J1aWxkVGFyZ2V0fS5tYWtlb3V0LnBwYwotCURlbGV0ZSB7QnVpbGRUYXJnZXR9Lm1ha2VvdXQucHBjCi0JU2V0IHJhbm1ha2UgMQotRW5kIElmCi0KLUlmIHtyYW5tYWtlfSA9PSAxCi0JRXhpdAotRW5kIElmCi0KLSMgRGlzcGF0Y2ggb24gdmFyaW91cyBwc2V1ZG8tdGFyZ2V0cy4KLQotSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwvCi0JRWNobyBTdGFydGVkIGBEYXRlYAotCSJ7VGhpc1NjcmlwdH0iIGFsbC1nY2MKLQkie1RoaXNTY3JpcHR9IiBhbGwtZ2RiCi0JRWNobyBGaW5pc2hlZCBgRGF0ZWAKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtbGliaWJlcnR5LwotCSJ7VGhpc1NjcmlwdH0iIGRvLWxpYmliZXJ0eQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1iZmQvCi0JIntUaGlzU2NyaXB0fSIgZG8tYmZkCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLW9wY29kZXMvCi0JIntUaGlzU2NyaXB0fSIgZG8tb3Bjb2RlcwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1ieWFjYy8KLQkie1RoaXNTY3JpcHR9IiBkby1ieWFjYwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1mbGV4LwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBkby1mbGV4Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvYWxsLWJpbnV0aWxzLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1iaW51dGlscwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nYXMvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWdhcwotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2FsbC1nY2MvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1nYXMKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmludXRpbHMKLQkie1RoaXNTY3JpcHR9IiBhbGwtbGQKLQkie1RoaXNTY3JpcHR9IiBkby1nY2MKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ2RiLwotCSJ7VGhpc1NjcmlwdH0iIGFsbC1saWJpYmVydHkKLQkie1RoaXNTY3JpcHR9IiBhbGwtYmZkCi0JIntUaGlzU2NyaXB0fSIgYWxsLW9wY29kZXMKLQkie1RoaXNTY3JpcHR9IiBkby1nZGIKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtZ3Jlei8KLQkie1RoaXNTY3JpcHR9IiBhbGwtbGliaWJlcnR5Ci0JIntUaGlzU2NyaXB0fSIgYWxsLWJmZAotCSJ7VGhpc1NjcmlwdH0iIGRvLWdyZXoKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9hbGwtbGQvCi0JIntUaGlzU2NyaXB0fSIgYWxsLWxpYmliZXJ0eQotCSJ7VGhpc1NjcmlwdH0iIGFsbC1iZmQKLQkie1RoaXNTY3JpcHR9IiBhbGwtb3Bjb2RlcwotCSJ7VGhpc1NjcmlwdH0iIGRvLWxkCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tYnlhY2MvCi0JU2V0RGlyZWN0b3J5IDpieWFjYzoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1mbGV4LwotCVNldERpcmVjdG9yeSA6ZmxleDoKLQk6Om1wdy1idWlsZCBfYm9vdHN0cmFwCi0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tYmZkLwotCVNldERpcmVjdG9yeSA6YmZkOgotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWxpYmliZXJ0eS8KLQlTZXREaXJlY3RvcnkgOmxpYmliZXJ0eToKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1vcGNvZGVzLwotCVNldERpcmVjdG9yeSA6b3Bjb2RlczoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1iaW51dGlscy8KLQlTZXREaXJlY3RvcnkgOmJpbnV0aWxzOgotCTo6bXB3LWJ1aWxkIHN0YW1wcwotCTo6bXB3LWJ1aWxkIGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2RvLWdhcy8KLQlTZXREaXJlY3RvcnkgOmdhczoKLQk6Om1wdy1idWlsZCBzdGFtcHMKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1nY2MvCi0JU2V0RGlyZWN0b3J5IDpnY2M6Ci0JOm1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1nZGIvCi0JU2V0RGlyZWN0b3J5IDpnZGI6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tZ3Jlei8KLQlTZXREaXJlY3RvcnkgOmdyZXo6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvZG8tbGQvCi0JU2V0RGlyZWN0b3J5IDpsZDoKLQk6Om1wdy1idWlsZCBhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9kby1uZXdsaWIvCi0JU2V0RGlyZWN0b3J5IDpuZXdsaWI6Ci0JOjptcHctYnVpbGQgYWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC8KLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktdG9wCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1iaW51dGlscwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtZ2FzCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nY2MKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLWxkCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1nZGIKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWJpbnV0aWxzLwotCVNldERpcmVjdG9yeSA6YmludXRpbHM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtZ2FzLwotCVNldERpcmVjdG9yeSA6Z2FzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdjYy8KLQlTZXREaXJlY3RvcnkgOmdjYzoKLQk6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLWdkYi8KLQlTZXREaXJlY3RvcnkgOmdkYjoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1ncmV6LwotCVNldERpcmVjdG9yeSA6Z3JlejoKLQk6Om1wdy1idWlsZCBpbnN0YWxsCi1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1sZC8KLQlTZXREaXJlY3RvcnkgOmxkOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwKLUVsc2UgSWYgIntCdWlsZFRhcmdldH0iID1+IC9pbnN0YWxsLW9ubHkvCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LXRvcAotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1iaW51dGlscwotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1nYXMKLQkie1RoaXNTY3JpcHR9IiBpbnN0YWxsLW9ubHktZ2NjCi0JIntUaGlzU2NyaXB0fSIgaW5zdGFsbC1vbmx5LWdkYgotCSJ7VGhpc1NjcmlwdH0iIGluc3RhbGwtb25seS1sZAotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1iaW51dGlscy8KLQlTZXREaXJlY3RvcnkgOmJpbnV0aWxzOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1nYXMvCi0JU2V0RGlyZWN0b3J5IDpnYXM6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdjYy8KLQlTZXREaXJlY3RvcnkgOmdjYzoKLQk6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1nZGIvCi0JU2V0RGlyZWN0b3J5IDpnZGI6Ci0JOjptcHctYnVpbGQgaW5zdGFsbC1vbmx5Ci1FbHNlIElmICJ7QnVpbGRUYXJnZXR9IiA9fiAvaW5zdGFsbC1vbmx5LWdyZXovCi0JU2V0RGlyZWN0b3J5IDpncmV6OgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS1sZC8KLQlTZXREaXJlY3RvcnkgOmxkOgotCTo6bXB3LWJ1aWxkIGluc3RhbGwtb25seQotRWxzZSBJZiAie0J1aWxkVGFyZ2V0fSIgPX4gL2luc3RhbGwtb25seS10b3AvCi0JTmV3Rm9sZGVyUmVjdXJzaXZlICJ7cHJlZml4fSIKLQlJZiAie3ByZWZpeH0iICE9ICJgRGlyZWN0b3J5YCIKLQkJRHVwbGljYXRlIC15ICdSZWFkIE1lIGZvciBNUFcnICJ7cHJlZml4fSInUmVhZCBNZSBmb3IgTVBXJwotCQlEdXBsaWNhdGUgLXkgSW5zdGFsbCAie3ByZWZpeH0iSW5zdGFsbAotCUVuZCBJZgotRWxzZQotCUVjaG8ge0J1aWxkVGFyZ2V0fSBub3QgdW5kZXJzdG9vZCwgaWdub3JpbmcKLUVuZCBJZgotCi1TZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKZGlmZiAtLWdpdCBhL21wdy1jb25maWcuaW4gYi9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDI4NzM3Li4wMDAwMDAwCi0tLSBhL21wdy1jb25maWcuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIGZyYWdtZW50IGZvciBDeWdudXMgc291cmNlIHRyZWUuCi0KLSMgQ2hlY2sgdGhhdCB3ZSBjYW4gZmluZCBhbGwgdGhlIHNwZWNpYWwgdG9vbHMgdGhhdCB3ZSB3aWxsIG5lZWQuCi0jIFRoZSB0ZXN0IGZvciBzZWQgaXMgc2VtaS1wb2ludGxlc3MsIGJlY2F1c2UgaXQncyBhbHJlYWR5IGJlZW4gaW52b2tlZAotIyBieSB0aGUgY2FsY3VsYXRpb24gb2YgdGFyZ2V0X2NwdSBpbiB0aGUgbWFpbiBjb25maWd1cmUgc2NyaXB0LCBidXQKLSMgdGhlIHRlc3Qgd2lsbCBhbHNvIHNob3cgd2hpY2ggb25lIGlzIGJlaW5nIHVzZWQuCi0KLVNldCBFeGl0IDAKLUVjaG8gYnlhY2MgaXMgYFdoaWNoIGJ5YWNjYAotRWNobyBmbGV4IGlzIGBXaGljaCBmbGV4YAotRWNobyBmb3J3YXJkLWluY2x1ZGUgaXMgYFdoaWNoIGZvcndhcmQtaW5jbHVkZWAKLUVjaG8gTW92ZUlmQ2hhbmdlIGlzIGBXaGljaCBNb3ZlSWZDaGFuZ2VgCi1FY2hvIG1wdy10b3VjaCBpcyBgV2hpY2ggbXB3LXRvdWNoYAotRWNobyBtcHctdHJ1ZSBpcyBgV2hpY2ggbXB3LXRydWVgCi1FY2hvIE5ld0ZvbGRlclJlY3Vyc2l2ZSBpcyBgV2hpY2ggTmV3Rm9sZGVyUmVjdXJzaXZlYAotRWNobyBudWxsLWNvbW1hbmQgaXMgYFdoaWNoIG51bGwtY29tbWFuZGAKLUVjaG8gb3Blbi1icmFjZSBpcyBgV2hpY2ggb3Blbi1icmFjZWAKLUVjaG8gc2VkIGlzIGBXaGljaCBzZWRgCi1FY2hvICd0ci03dG84JyBpcyBgV2hpY2ggdHItN3RvOGAKLUVjaG8gdHJ1ZSBpcyBgV2hpY2ggdHJ1ZWAKLVNldCBFeGl0IDEKLQotU2V0IGhvc3RfbGlicyAibW1hbGxvYyBsaWJpYmVydHkgb3Bjb2RlcyBiZmQgcmVhZGxpbmUgZ2FzaCB0Y2wgdGsgdGNsWCIKLQotU2V0IGhvc3RfdG9vbHMgInRleGluZm8gYnlhY2MgZmxleCBiaXNvbiBiaW51dGlscyBsZCBnYXMgZ2NjIGdkYiBtYWtlIHBhdGNoIFxPcHRpb24tZAotCSAgICBwcm1zIHNlbmQtcHIgZ3Byb2YgZ2RidGVzdCB0Z2FzIGV0YyBleHBlY3QgZGVqYWdudSBzaW0gYmFzaCBcT3B0aW9uLWQKLQkgICAgbTQgYXV0b2NvbmYgaXNwZWxsIGdyZXAgZGlmZiByY3MgY3ZzIGZpbGV1dGlscyBzaGVsbHV0aWxzIHRpbWUgXE9wdGlvbi1kCi0JICAgIHRleHR1dGlscyB3ZGlmZiBmaW5kIGVtYWNzIGVtYWNzMTkgdXVkZWNvZGUgaGVsbG8gdGFyIGd6aXAgaW5kZW50IFxPcHRpb24tZAotCSAgICByZWNvZGUgcmVsZWFzZSBzZWQgdXRpbHMgZ3VpbGUgcGVybCBhcGFjaGUgaW5ldCBnYXdrIgotCi1TZXQgdGFyZ2V0X2xpYnMgIm5ld2xpYiIKLQotU2V0IHRhcmdldF90b29scyAiZXhhbXBsZXMiCi0KLSMgQ29uZmlndXJlIHRoZSByZXNvdXJjZSBjb21waWxlciBpZiB0YXJnZXRpbmcgTWFjcy4KLUlmIHt0YXJnZXRfb3N9ID1+IC9tYWNvcy8gfHwge3RhcmdldF9vc30gPX4gL21wdy8KLQlTZXQgaG9zdF90b29scyAie2hvc3RfdG9vbHN9IGdyZXoiCi1FbmQgSWYKLQkKLVNldCBjb25maWdkaXJzICJ7aG9zdF9saWJzfSB7aG9zdF90b29sc30ge3RhcmdldF9saWJzfSB7dGFyZ2V0X3Rvb2xzfSIKLUV4cG9ydCBjb25maWdkaXJzCi0KLSMgTWFrZSB1cCBhIHNwZWNpYWwgaW5jbHVkZSBkaXJlY3RvcnkgdGhhdCB0b29scyB3aWxsIHNoYXJlLgotCi1JZiAiYEV4aXN0cyAie29iamRpcn0iZXh0cmEtaW5jbHVkZWAiID09ICIiCi0JTmV3Rm9sZGVyICJ7b2JqZGlyfSJleHRyYS1pbmNsdWRlCi1FbmQgSWYKLQotU2V0IGVkaXIgIntvYmpkaXJ9ZXh0cmEtaW5jbHVkZToiCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOmZpbGUuaCAie2VkaXJ9IidzeXMvZmlsZS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6aW9jdGwuaCAie2VkaXJ9IidzeXMvaW9jdGwuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnBhcmFtLmggIntlZGlyfSInc3lzL3BhcmFtLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czpyZXNvdXJjZS5oICJ7ZWRpcn0iJ3N5cy9yZXNvdXJjZS5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3JjZGlyfSJpbmNsdWRlOm1wdzpzeXM6c3RhdC5oICJ7ZWRpcn0iJ3N5cy9zdGF0LmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNkaXJ9ImluY2x1ZGU6bXB3OnN5czp0aW1lLmggIntlZGlyfSInc3lzL3RpbWUuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY2Rpcn0iaW5jbHVkZTptcHc6c3lzOnR5cGVzLmggIntlZGlyfSInc3lzL3R5cGVzLmgnCi0KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDphb3V0NjQuaCAie2VkaXJ9Iidhb3V0L2FvdXQ2NC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OmFyLmggIntlZGlyfSInYW91dC9hci5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OnJhbmxpYi5oICJ7ZWRpcn0iJ2FvdXQvcmFubGliLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6cmVsb2MuaCAie2VkaXJ9Iidhb3V0L3JlbG9jLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6c3RhYi5kZWYgIntlZGlyfSInYW91dC9zdGFiLmRlZicKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6YW91dDpzdGFiX2dudS5oICJ7ZWRpcn0iJ2FvdXQvc3RhYl9nbnUuaCcKLQotSWYgImBFeGlzdHMgIntzcmNyb290fSJpbmNsdWRlOmFvdXQ6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTphb3V0OiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInYW91dC8nInt0YXJnZXRfY3B1fSInLmgnCi1FbmQgSWYKLQotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOmVjb2ZmLmggIntlZGlyfSInY29mZi9lY29mZi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOmludGVybmFsLmggIntlZGlyfSInY29mZi9pbnRlcm5hbC5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOnN5bS5oICJ7ZWRpcn0iJ2NvZmYvc3ltLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6c3ltY29uc3QuaCAie2VkaXJ9Iidjb2ZmL3N5bWNvbnN0LmgnCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTpjb2ZmOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6Y29mZjoie3RhcmdldF9jcHV9Ii5oICJ7ZWRpcn0iJ2NvZmYvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi1JZiAie3RhcmdldF9jcHV9IiA9fiAvcG93ZXJwYy8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmNvZmY6cnM2MDAwLmggIntlZGlyfSInY29mZi9yczYwMDAuaCcKLUVuZCBJZgotCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpjb21tb24uaCAie2VkaXJ9IidlbGYvY29tbW9uLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOmVsZjpkd2FyZi5oICJ7ZWRpcn0iJ2VsZi9kd2FyZi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZHdhcmYyLmggIntlZGlyfSInZWxmL2R3YXJmMi5oJwotZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6ZXh0ZXJuYWwuaCAie2VkaXJ9IidlbGYvZXh0ZXJuYWwuaCcKLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOmludGVybmFsLmggIntlZGlyfSInZWxmL2ludGVybmFsLmgnCi0KLSMgQmVsaWV2ZSBpdCBvciBub3QsIEdEQiBuZWVkcyB0aGlzIGZvciBhbGwgdGFyZ2V0cy4KLWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOm1pcHMuaCAie2VkaXJ9IidlbGYvbWlwcy5oJwotCi1JZiAiYEV4aXN0cyAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOiJ7dGFyZ2V0X2NwdX0iLmhgIiAhPSAiIgotCWZvcndhcmQtaW5jbHVkZSAie3NyY3Jvb3R9ImluY2x1ZGU6ZWxmOiJ7dGFyZ2V0X2NwdX0iLmggIntlZGlyfSInZWxmLycie3RhcmdldF9jcHV9IicuaCcKLUVuZCBJZgotSWYgInt0YXJnZXRfY3B1fSIgPX4gL3Bvd2VycGMvCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTplbGY6cHBjLmggIntlZGlyfSInZWxmL3BwYy5oJwotRW5kIElmCi0KLUlmICJgRXhpc3RzICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6Int0YXJnZXRfY3B1fSIuaGAiICE9ICIiCi0JZm9yd2FyZC1pbmNsdWRlICJ7c3Jjcm9vdH0iaW5jbHVkZTpvcGNvZGU6Int0YXJnZXRfY3B1fSIuaCAie2VkaXJ9IidvcGNvZGUvJyJ7dGFyZ2V0X2NwdX0iJy5oJwotRW5kIElmCi1JZiAie3RhcmdldF9jcHV9IiA9fiAvcG93ZXJwYy8KLQlmb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJpbmNsdWRlOm9wY29kZTpwcGMuaCAie2VkaXJ9IidvcGNvZGUvcHBjLmgnCi1FbmQgSWYKLQotIyBBZGQgc29tZSBiZmQgaW5jbHVkZXMgdGhhdCBnZXQgbWVudGlvbmVkIG91dHNpZGUgdGhlIGJmZCBkaXIuCi0JCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJiZmQ6bGliY29mZi5oICJ7ZWRpcn0iJ2JmZC9saWJjb2ZmLmgnCi1mb3J3YXJkLWluY2x1ZGUgIntzcmNyb290fSJiZmQ6bGliZWNvZmYuaCAie2VkaXJ9IidiZmQvbGliZWNvZmYuaCcKLQotIyBUcmFuc2xhdGUgcmFuZG9tIGZpbGVzIGludG8gTVBXLW9ubHkgY2hhcmFjdGVyIHNldC4KLQotdHItN3RvOCAie3NyY2Rpcn0ibXB3LVJFQURNRSA+ICJ7b2JqZGlyfVJlYWQgTWUgZm9yIE1QVyIKLXRyLTd0bzggIntzcmNkaXJ9Im1wdy1pbnN0YWxsID4gIntvYmpkaXJ9Ikluc3RhbGwKZGlmZiAtLWdpdCBhL21wdy1jb25maWd1cmUgYi9tcHctY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ1MTQ4Li4wMDAwMDAwCi0tLSBhL21wdy1jb25maWd1cmUKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotIyBDb25maWd1cmF0aW9uIHNjcmlwdAotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSMgCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jIAotIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0jIyMgV0FSTklORwotIyMjIFRoaXMgc2NyaXB0IG11c3QgTk9UIHVzZSBhbnkgOC1iaXQgY2hhcnMhCi0jIyMgV0FSTklORwotCi0jIFRoaXMgaXMgYW4gTVBXIFNoZWxsIHNjcmlwdCB0aGF0IHNldHMgZXZlcnl0aGluZyB1cCBmb3IgY29tcGlsYXRpb24sCi0jIG1haW5seSBjcmVhdGluZyBkaXJlY3RvcmllcywgYW5kIGVkaXRpbmcgY29waWVzIG9mIGZpbGVzLgotCi1TZXQgc2F2ZWRpciAiYERpcmVjdG9yeWAiCi0KLSNTZXQgRWNobyAxCi0KLVNldCBUaGlzU2NyaXB0ICJ7MH0iCi0KLVNldCBzcmNyb290ICItLS0tLS0tLSIKLQotU2V0IHNyY2RpciAiOiIKLQotU2V0IG9iamRpciAiOiIKLQotU2V0IHByZWZpeCAie01QV30iOkdOVVRvb2xzOgotCi1TZXQgZXhlY19wcmVmaXggIiIKLQotU2V0IGJpbmRpciAiIgotCi1TZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0KLVNldCB0YXJnZXRfYWxpYXMge2hvc3RfYWxpYXN9Ci0KLVNldCBob3N0X2NjICJtcHdjIgotCi1TZXQgd2l0aF9nbnVfbGQgMAotCi1TZXQgaGVscG91dHB1dCAwCi0KLVNldCByZWN1cnNlIDEKLQotU2V0IHZlcmlmeSAwCi1TZXQgdmVyaWZ5c3RyICIiCi0KLVNldCBlbmFibGVfb3B0aW9ucyAiIgotU2V0IGRpc2FibGVfb3B0aW9ucyAiIgotCi0jIFBhcnNlIGFyZ3VtZW50cy4KLQotTG9vcAotCUJyZWFrIElmIHsjfSA9PSAwCi0JSWYgInsxfSIgPX4gLy0tY2MvCi0JCVNldCBob3N0X2NjICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLWJpbmRpci8KLQkJU2V0IGJpbmRpciAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1kaXNhYmxlLT8rLwotCQlTZXQgYEVjaG8gezF9IHwgc2VkIC1lICdzLy0tZGlzYWJsZS0vZW5hYmxlXy8nYCBubwotCQlTZXQgZGlzYWJsZV9vcHRpb25zICJ7ZGlzYWJsZV9vcHRpb25zfSAnezF9JyIKLQlFbHNlIElmICJ7MX0iID1+IC8tLWVuYWJsZS0/Ky8KLQkJU2V0IGBFY2hvIHsxfSB8IHNlZCAtZSAncy8tLWVuYWJsZS0vZW5hYmxlXy8nYCB5ZXMKLQkJU2V0IGVuYWJsZV9vcHRpb25zICJ7ZW5hYmxlX29wdGlvbnN9ICd7MX0nIgotCUVsc2UgSWYgInsxfSIgPX4gLy0tZXhlYy1wcmVmaXgvCi0JCVNldCBleGVjX3ByZWZpeCAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1oZWxwLwotCQlTZXQgaGVscG91dHB1dCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1ob3N0LwotCQlTZXQgaG9zdF9hbGlhcyAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1ub3JlY3Vyc2lvbi8KLQkJU2V0IHJlY3Vyc2UgMAotCUVsc2UgSWYgInsxfSIgPX4gLy0tcHJlZml4LwotCQlTZXQgcHJlZml4ICJ7Mn0iCi0JCVNoaWZ0IDEKLQlFbHNlIElmICJ7MX0iID1+IC8tLXNyY2Rpci8KLQkJU2V0IHNyY2RpciAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS1zcmNyb290LwotCQlTZXQgc3Jjcm9vdCAiezJ9IgotCQlTaGlmdCAxCi0JRWxzZSBJZiAiezF9IiA9fiAvLS10YXJnZXQvCi0JCVNldCB0YXJnZXRfYWxpYXMgInsyfSIKLQkJU2hpZnQgMQotCUVsc2UgSWYgInsxfSIgPX4gLy12LwotCQlTZXQgdmVyaWZ5IDEKLQkJU2V0IHZlcmlmeXN0ciAiLXYiCi0JRWxzZSBJZiAiezF9IiA9fiAvLS13aXRoLWdudS1sZC8KLQkJU2V0IHdpdGhfZ251X2xkIDEKLQlFbHNlCi0JCUVjaG8gLW4gJ21wdy1jb25maWd1cmU6IFVucmVjb2duaXplZCBvcHRpb246ICInCi0JCUVjaG8gLW4gInsxfSIKLQkJRWNobyAnIjsgdXNlIC0taGVscCBmb3IgdXNhZ2UuJwotCQlFeGl0IDEKLQlFbmQgSWYKLQlTaGlmdCAxCi1FbmQgTG9vcAotCi1JZiB7aGVscG91dHB1dH0gPT0gMQotCUVjaG8gIlVzYWdlOiBtcHctY29uZmlndXJlIFtPUFRJT05TXSIKLQlFY2hvICIiCi0JRWNobyAiT3B0aW9uczogW2RlZmF1bHRzIGluIGJyYWNrZXRzXSIKLQlFY2hvICItLWJpbmRpciBESVIgICAgICBkaXJlY3RvcnkgZm9yIGJpbmFyaWVzIFtdIgotCUVjaG8gIi0tY2MgQ0MgICAgICAgICAgIHVzZSBDIGNvbXBpbGVyIENDIFttcHdjXSIKLQlFY2hvICItLWRpc2FibGUtRk9PICAgICBkbyBub3QgaW5jbHVkZSBmZWF0dXJlIEZPTyIKLQlFY2hvICItLWVuYWJsZS1GT08gICAgICBpbmNsdWRlIGZlYXR1cmUgRk9PIgotCUVjaG8gIi0tZXhlYy1wcmVmaXggRElSIGluc3RhbGwgaG9zdC1kZXBlbmRlbnQgZmlsZXMgaW50byBESVIgW10iCi0JRWNobyAiLS1oZWxwICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlIgotCUVjaG8gIi0taG9zdCBIT1NUICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbbTY4ay1hcHBsZS1tcHddIgotCUVjaG8gIi0tbm9yZWN1cnNpb24gICAgIGNvbmZpZ3VyZSB0aGlzIGRpcmVjdG9yeSBvbmx5IFtyZWN1cnNlXSIKLQlFY2hvICItLXByZWZpeCBESVIgICAgICBpbnN0YWxsIGludG8gRElSIFt7TVBXfTpHTlVUb29sczpdIgotCUVjaG8gIi0tc3JjZGlyIERJUiAgICAgIGZpbmQgdGhlIHNvdXJjZXMgaW4gRElSIFs6XSIKLQlFY2hvICItLXNyY3Jvb3QgRElSICAgICBmaW5kIHRoZSB0b3BsZXZlbCBzb3VyY2VzIGluIERJUiBbOl0iCi0JRWNobyAiLS10YXJnZXQgVEFSR0VUICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXSIKLQlFY2hvICItdiAgICAgICAgICAgICAgICB2ZXJib3NlIgotCUVjaG8gIi0td2l0aC1nbnUtbGQgICAgIGxpbmsgdXNpbmcgR05VIGxkIFtub10iCi0JRXhpdCAwCi1FbmQgSWYKLQotU2V0IEV4aXQgMAotCi0jIERlZmF1bHQgZXhlY19wcmVmaXggZnJvbSBwcmVmaXguCi0KLUlmICJ7ZXhlY19wcmVmaXh9IiA9PSAiIgotCVNldCBleGVjX3ByZWZpeCAie3ByZWZpeH0iCi1FbmQgSWYKLQotSWYgIntiaW5kaXJ9IiA9PSAiIgotCVNldCBiaW5kaXIgIntwcmVmaXh9ImJpbjoKLUVuZCBJZgotCi0jIFBvaW50IHRvIHRoZSBjb3JyZWN0IHNldCBvZiB0b29scyB0byB1c2Ugd2l0aCB0aGUgY2hvc2VuIGNvbXBpbGVyLgotCi1JZiAie2hvc3RfY2N9IiA9fiAvbXB3Yy8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NUFdfQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfTElCfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9MSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX0N9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX05VTEx9JwotCVNldCByZXpfbmFtZSAne1JFWl82OEt9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvc2M2OGsvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfU0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSX0xJQn0nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTElOS30nCi0JU2V0IHByb2dfZXh0X25hbWUgJ3tQUk9HX0VYVF82OEt9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19DfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfNjhLfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL213YzY4ay8KLQlTZXQgaG9zdF9hbGlhcyAibTY4ay1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19NV0M2OEt9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1zICcKLQlTZXQgYXJfbmFtZSAne0FSX01XTElOSzY4S30nCi0JU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX05VTEx9JwotCVNldCBjY19sZF9uYW1lICd7Q0NfTERfTVdMSU5LNjhLfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUXzY4S30nCi0JU2V0IGV4dHJhbGlic19uYW1lICd7RVhUUkFMSUJTX01XQzY4S30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9nY2M2OGsvCi0JU2V0IGhvc3RfYWxpYXMgIm02OGstYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfNjhLX0dDQ30nCi0JU2V0IHNlZ21lbnRfZmxhZyAnLXMgJwotCVNldCBhcl9uYW1lICd7QVJfNjhLX0FSfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfUkFOTElCfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDXzY4S19HQ0N9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfQ30nCi0JU2V0IG1ha2VwZWZfbmFtZSAne01BS0VQRUZfTlVMTH0nCi0JU2V0IHJlel9uYW1lICd7UkVaXzY4S30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9wcGNjLwotCVNldCBob3N0X2FsaWFzICJwb3dlcnBjLWFwcGxlLW1wdyIKLQlTZXQgY2NfbmFtZSAne0NDX1BQQ0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9tcmMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVJDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlTZXQgcmFubGliX25hbWUgJ3tSQU5MSUJfTlVMTH0nCi0JU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZSBJZiAie2hvc3RfY2N9IiA9fiAvc2NwcGMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfU0N9JwotCVNldCBzZWdtZW50X2ZsYWcgJy1kIF9fX3NfZV9nX19fPScKLQlTZXQgYXJfbmFtZSAne0FSX1BQQ0xJTkt9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX1BQQ0xJTkt9JwotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfWENPRkZ9JwotCVNldCBleHRyYWxpYnNfbmFtZSAne0VYVFJBTElCU19QUEN9JwotCVNldCBtYWtlcGVmX25hbWUgJ3tNQUtFUEVGX1BQQ30nCi0JU2V0IHJlel9uYW1lICd7UkVaX1BQQ30nCi1FbHNlIElmICJ7aG9zdF9jY30iID1+IC9td2NwcGMvCi0JU2V0IGhvc3RfYWxpYXMgInBvd2VycGMtYXBwbGUtbXB3IgotCVNldCBjY19uYW1lICd7Q0NfTVdDUFBDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9NV0xJTktQUEN9JwotCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQlTZXQgY2NfbGRfbmFtZSAne0NDX0xEX01XTElOS1BQQ30nCi0JIyBNaXNsZWFkaW5nLCBidXQgd2UgZG9uJ3QgbmVlZCBhIFBFRiBzdGVwLgotCVNldCBwcm9nX2V4dF9uYW1lICd7UFJPR19FWFRfNjhLfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfTVdDUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9OVUxMfScKLQlTZXQgcmV6X25hbWUgJ3tSRVpfUFBDfScKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djY3BwYy8KLQlTZXQgaG9zdF9hbGlhcyAicG93ZXJwYy1hcHBsZS1tcHciCi0JU2V0IGNjX25hbWUgJ3tDQ19QUENfR0NDfScKLQlTZXQgc2VnbWVudF9mbGFnICctZCBfX19zX2VfZ19fXz0nCi0JU2V0IGFyX25hbWUgJ3tBUl9QUENMSU5LfScKLQlJZiB7d2l0aF9nbnVfbGR9ID09IDEKLQkJU2V0IHJhbmxpYl9uYW1lICd7UkFOTElCX1JBTkxJQn0nCi0JCVNldCBjY19sZF9uYW1lICd7Q0NfTERfR0xEfScKLQlFbHNlCi0JCVNldCByYW5saWJfbmFtZSAne1JBTkxJQl9OVUxMfScKLQkJU2V0IGNjX2xkX25hbWUgJ3tDQ19MRF9QUENMSU5LfScKLQlFbmQgSWYKLQlTZXQgcHJvZ19leHRfbmFtZSAne1BST0dfRVhUX1hDT0ZGfScKLQlTZXQgZXh0cmFsaWJzX25hbWUgJ3tFWFRSQUxJQlNfUFBDfScKLQlTZXQgbWFrZXBlZl9uYW1lICd7TUFLRVBFRl9QUEN9JwotCVNldCByZXpfbmFtZSAne1JFWl9QUEN9JwotRWxzZQotCUVjaG8gIntob3N0X2NjfSIgaXMgbm90IGEga25vd24gTVBXIGNvbXBpbGVyIHR5cGUKLUVuZCBJZgotCi1TZXQgZGFzaF9jX2ZsYWcgJycKLUlmICJ7aG9zdF9jY30iID1+IC9nY2M2OGsvCi0JU2V0IGRhc2hfY19mbGFnICctYycKLUVsc2UgSWYgIntob3N0X2NjfSIgPX4gL2djY3BwYy8KLQlTZXQgZGFzaF9jX2ZsYWcgJy1jJwotRW5kIElmCi0KLSMgKHNob3VsZCBpbnRlcnByZXQgYWxpYXNlcyBpZiBub3QgaW4gY2Fub25pY2FsIGZvcm0pCi0KLVNldCBob3N0X2Nhbm9uaWNhbCAie2hvc3RfYWxpYXN9IgotCi1TZXQgdGFyZ2V0X2Nhbm9uaWNhbCAie3RhcmdldF9hbGlhc30iCi0KLVNldCBjb25maWdkaXJzICIiCi0KLUlmICJ7c3Jjcm9vdH0iID1+IC8tLS0tLS0tLS8KLQlTZXQgc3Jjcm9vdCAie3NyY2Rpcn0iCi1FbmQgSWYKLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJgIiA9PSAiIgotCUVjaG8gU291cmNlIGRpcmVjdG9yeSB7c3JjZGlyfSBkb2VzIG5vdCBleGlzdCEKLQlFeGl0IDEKLUVuZCBJZgotSWYgImBFeGlzdHMgIntzcmNyb290fSJgIiA9PSAiIgotCUVjaG8gVG9wLWxldmVsIHNvdXJjZSBkaXJlY3Rvcnkge3NyY3Jvb3R9IGRvZXMgbm90IGV4aXN0IQotCUV4aXQgMQotRW5kIElmCi0KLVNldCB0YXJnZXRfY3B1ICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMS8nYCIKLVNldCB0YXJnZXRfdmVuZG9yICJgZWNobyB7dGFyZ2V0X2Nhbm9uaWNhbH0gfCBzZWQgJ3MvXlwoLipcKS1cKC4qXCktXCguKlwpJC9cMi8nYCIKLVNldCB0YXJnZXRfb3MgImBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAncy9eXCguKlwpLVwoLipcKS1cKC4qXCkkL1wzLydgIgotCi0jIENyZWF0ZSBhIGZpbGUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIG9sZGVyIHRoYW4gYW55IG90aGVyIGhlcmUuCi0KLUlmICJgRXhpc3RzICJ7b2JqZGlyfSJfb2xkZXN0YCIgPT0gIiIKLQltcHctdG91Y2ggX29sZGVzdAotRW5kIElmCi0KLSMgUmVjb3JkIHRoaXMgYmVmb3JlIGNyZWF0aW5nIGFueSBmaWxlcywgbWFrZWZpbGVzIHNvbWV0aW1lcyBtZW50aW9uCi0jIGRlcGVuZGVuY2llcyBvbiBjb25maWcuc3RhdHVzLgotCi1FY2hvICIjIFRoaXMgZGlyZWN0b3J5IHdhcyBjb25maWd1cmVkIGFzIGZvbGxvd3M6IiA+Y29uZmlnLm5ldwotRWNobyAie1RoaXNTY3JpcHR9IC0taG9zdCB7aG9zdF9hbGlhc30gLS10YXJnZXQge3RhcmdldF9hbGlhc30gLS1zcmNkaXIge3NyY2Rpcn0gIC0tc3Jjcm9vdCB7c3Jjcm9vdH0gIC0tcHJlZml4IHtwcmVmaXh9IC0tY2Mge2hvc3RfY2N9IHt2ZXJpZnlzdHJ9IHtlbmFibGVfb3B0aW9uc30ge2Rpc2FibGVfb3B0aW9uc30gLS1ub3JlY3Vyc2lvbiIgPj5jb25maWcubmV3Ci1Nb3ZlSWZDaGFuZ2UgY29uZmlnLm5ldyBjb25maWcuc3RhdHVzCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctY29uZmlnLmluYCIgIT0gIiIKLQl0ci03dG84ICJ7c3JjZGlyfSJtcHctY29uZmlnLmluID4ie29iamRpcn0ibXB3LWNvbmZpZy5pbgotCUV4ZWN1dGUgIntvYmpkaXJ9Im1wdy1jb25maWcuaW4KLUVuZCBJZgotCi0jIFN0YXJ0IE1ha2VmaWxlIGNvbnN0cnVjdGlvbiBieSBkZWZpbmluZyBhbGwgdGhlIHZhcmlhYmxlcyBjaG9zZW4gYnkKLSMgY29uZmlndXJhdGlvbi4KLQotRWNobyAiIyBUaGlzIE1ha2VmaWxlIHByb2R1Y2VkIGJ5IG1wdy1jb25maWd1cmUuICBDaGFuZ2VzIG1heSBnZXQgbG9zdCEiID4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAic3Jjcm9vdCA9ICIge3NyY3Jvb3R9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidG9wc3JjZGlyID0gIiB7c3Jjcm9vdH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJzcmNkaXIgPSAiIHtzcmNkaXJ9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAibXB3X3ByZWZpeCA9ICIge3ByZWZpeH0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJtcHdfZXhlY19wcmVmaXggPSAiIHtleGVjX3ByZWZpeH0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIm1wd19iaW5kaXIgPSAiIHtiaW5kaXJ9CQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiaG9zdF9hbGlhcyA9ICIge2hvc3RfYWxpYXN9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfYWxpYXMgPSAiIHt0YXJnZXRfYWxpYXN9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJ0YXJnZXRfY3B1ID0gIiB7dGFyZ2V0X2NwdX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF92ZW5kb3IgPSAiIHt0YXJnZXRfdmVuZG9yfQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X29zID0gIiB7dGFyZ2V0X29zfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gInRhcmdldF9jYW5vbmljYWwgPSAiIHt0YXJnZXRfY2Fub25pY2FsfQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJob3N0X21ha2VmaWxlX2ZyYWcgPSAiCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAidGFyZ2V0X21ha2VmaWxlX2ZyYWcgPSAiCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWNobyAiQ0MgPSAiIHtjY19uYW1lfQkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJBUiA9ICIge2FyX25hbWV9CQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIlJBTkxJQiA9ICIge3JhbmxpYl9uYW1lfQkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIkNDX0xEID0gIiB7Y2NfbGRfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJQUk9HX0VYVCA9ICIge3Byb2dfZXh0X25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJFWFRSQUxJQlMgPSAiIHtleHRyYWxpYnNfbmFtZX0JCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVjaG8gIk1BS0VQRUYgPSAiIHttYWtlcGVmX25hbWV9CQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FY2hvICJSRVogPSAiIHtyZXpfbmFtZX0JCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0KLUlmIHtob3N0X2NjfSA9fiAvZ2NjcHBjLwotCUVjaG8gLW4gImRxID1cT3B0aW9uLWRcT3B0aW9uLWRcT3B0aW9uLWQiID4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAKLQlFY2hvICciJyAJCQkJID4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0wCi0JdHItN3RvOCAgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTAJPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbHNlCi0JRWNobyAtbiAiZHEgPSciIAkJCT4+ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQlFY2hvIC1uICciJyAJCQkJPj4gIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVjaG8gICAgIiciIAkJCQk+PiAie29iamRpcn0iTWFrZWZpbGUudGVtCi1FbmQgSWYKLQotIyBBcHBlbmQgdGhlIG1hc3RlciBzZXQgb2YgZGVmaW5pdGlvbnMgZm9yIHRoZSB2YXJpb3VzIGNvbXBpbGVycy4KLQotSWYgImBFeGlzdHMgIntzcmNkaXJ9ImNvbmZpZzptcHctbWgtbXB3YCIgIT0gIiIKLQl0ci03dG84ICJ7c3JjZGlyfSJjb25maWc6bXB3LW1oLW1wdyA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLUVsc2UgSWYgImBFeGlzdHMgIntzcmNyb290fSJjb25maWc6bXB3LW1oLW1wd2AiICE9ICIiCi0JdHItN3RvOCAie3NyY3Jvb3R9ImNvbmZpZzptcHctbWgtbXB3ID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotRWxzZQotCUVjaG8gImNhbid0IGZpbmQgYSBob3N0IGNvbmZpZyBmaWxlISIKLQlFeGl0IDAKLUVuZCBJZgotCi0jIEFwcGVuZCBhbnl0aGluZyBwcm9kdWNlZCBieSB0aGUgZGlyZWN0b3J5J3MgbXB3LWNvbmZpZy5pbi4KLQotSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnRtcGAiICE9ICIiCi0JQ2F0ZW5hdGUgIntvYmpkaXJ9Im1rLnRtcCA+PiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0KLQkjIEFuIG1wdy1jb25maWcuaW4gbWlnaHQgY2hhbmdlIHNvIGFzIG5vdCB0byBjcmVhdGUgdGhpcwotCSMgYW55bW9yZSwgc28gZ2V0IHJpZCBvZiBpdCBub3cgdG8gYmUgc2FmZS4KLQlEZWxldGUgLWkgLXkgIntvYmpkaXJ9Im1rLnRtcAotRW5kIElmCi0KLSMgSWYgdGhlcmUgYXJlIHNlZCBzY3JpcHRzIHRvIGVkaXQgdGhlIFVuaXggTWFrZWZpbGUuaW4sIHVzZSB0aGVtOyBvdGhlcndpc2UKLSMgdXNlIGFuIG1wdy1tYWtlLmluIGlmIHByZXNlbnQuCi0KLUlmICJgRXhpc3RzICJ7c3JjZGlyfSJtcHctbWFrZS5zZWRgIiAhPSAiIgotCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJoYWNrZWRfTWFrZWZpbGUuaW5gIiAhPSAiIgotCQlTZXQgTWFrZWZpbGVJbiAie29iamRpcn0iaGFja2VkX01ha2VmaWxlLmluCi0JRWxzZQotCQlTZXQgTWFrZWZpbGVJbiAie3NyY2Rpcn0iTWFrZWZpbGUuaW4KLQlFbmQgSWYKLQkjIEZpbmQgdGhlIGdlbmVyaWMgbWFrZWZpbGUgZWRpdGluZyBzY3JpcHQuCi0JSWYgImBFeGlzdHMgIntzcmNyb290fSJjb25maWc6bXB3OmctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3Jjcm9vdH0iY29uZmlnOm1wdzpnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbHNlIElmICJgRXhpc3RzICJ7c3Jjcm9vdH0idXRpbHM6bXB3OmctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3Jjcm9vdH0idXRpbHM6bXB3OmctbXB3LW1ha2Uuc2VkICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVsc2UgSWYgImBFeGlzdHMgIntzcmNkaXJ9ImctbXB3LW1ha2Uuc2VkYCIgIT0gIiIKLQkJc2VkIC1mICJ7c3JjZGlyfSJnLW1wdy1tYWtlLnNlZCAie01ha2VmaWxlSW59IiA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTEKLQlFbHNlCi0JCUVjaG8gV2FybmluZzogZy1tcHctbWFrZS5zZWQgbm90IGZvdW5kLCBjb3B5aW5nICJ7TWFrZWZpbGVJbn0iIHZlcmJhdGltLi4uCi0JCUNhdGVuYXRlICJ7TWFrZWZpbGVJbn0iID4ie29iamRpcn0iTWFrZWZpbGUudGVtMQotCUVuZCBJZgotCXNlZCAtZiAie3NyY2Rpcn0ibXB3LW1ha2Uuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCXNlZCAtZSAncy9ecHJlZml4ID0gLiokL3ByZWZpeCA9IHttcHdfcHJlZml4fS9nJyAtZSAncy9eZXhlY19wcmVmaXggPSAuKiQvZXhlY19wcmVmaXggPSB7bXB3X2V4ZWNfcHJlZml4fS9nJyAtZSAncy9eYmluZGlyID0gQGJpbmRpckAvYmluZGlyID0ge21wd19iaW5kaXJ9L2cnICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yID4ie29iamRpcn0iTWFrZWZpbGUudGVtMwotCXNlZCAtZSAicy9AREFTSF9DX0ZMQUdAL3tkYXNoX2NfZmxhZ30vIiAtZSAicy9AU0VHTUVOVF9GTEFHKFwoW14pXSpcKSlAL3tzZWdtZW50X2ZsYWd9XDEvIiAie29iamRpcn0iTWFrZWZpbGUudGVtMyA+IntvYmpkaXJ9Im1wdy1tYWtlLmluCi0JdHItN3RvOCAie29iamRpcn0ibXB3LW1ha2UuaW4gPj4ie29iamRpcn0iTWFrZWZpbGUudGVtCi0JSWYgImBFeGlzdHMgIntvYmpkaXJ9Im1rLnNlZGAiICE9ICIiCi0JCXNlZCAtZiAie29iamRpcn0ibWsuc2VkICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yCi0JCVJlbmFtZSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtMiAie29iamRpcn0iTWFrZWZpbGUudGVtCi0JRW5kIElmCi0JTW92ZUlmQ2hhbmdlICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0gIntvYmpkaXJ9Ik1ha2VmaWxlCi0JRGVsZXRlIC1pIC15ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW1bMTJdCi0JSWYge3ZlcmlmeX0gPT0gMQotCQlFY2hvIENyZWF0ZWQgTWFrZWZpbGUgaW4gImBEaXJlY3RvcnlgIgotCUVuZCBJZgotRWxzZSBJZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LW1ha2UuaW5gIiAhPSAiIgotCXNlZCAtZSAncy9ecHJlZml4ID0gLiokL3ByZWZpeCA9IHttcHdfcHJlZml4fS9nJyAie3NyY2Rpcn0ibXB3LW1ha2UuaW4gPiJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0xCi0Jc2VkIC1lICJzL0BEQVNIX0NfRkxBR0Ave2Rhc2hfY19mbGFnfS8iIC1lICJzL0BTRUdNRU5UX0ZMQUcoXChbXildKlwpKUAve3NlZ21lbnRfZmxhZ319XDEvIiAie29iamRpcn0iTWFrZWZpbGUudGVtMSA+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIKLQl0ci03dG84ICJ7b2JqZGlyfSJNYWtlZmlsZS50ZW0yID4+IntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUlmICJgRXhpc3RzICJ7b2JqZGlyfSJtay5zZWRgIiAhPSAiIgotCQlzZWQgLWYgIntvYmpkaXJ9Im1rLnNlZCAie29iamRpcn0iTWFrZWZpbGUudGVtID4ie29iamRpcn0iTWFrZWZpbGUudGVtMgotCQlSZW5hbWUgLXkgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbTIgIntvYmpkaXJ9Ik1ha2VmaWxlLnRlbQotCUVuZCBJZgotCU1vdmVJZkNoYW5nZSAie29iamRpcn0iTWFrZWZpbGUudGVtICJ7b2JqZGlyfSJNYWtlZmlsZQotCURlbGV0ZSAtaSAteSAie29iamRpcn0iTWFrZWZpbGUudGVtWzEyXQotCUlmIHt2ZXJpZnl9ID09IDEKLQkJRWNobyBDcmVhdGVkIE1ha2VmaWxlIGluICJgRGlyZWN0b3J5YCIKLQlFbmQgSWYKLUVuZCBJZgotCi0jIFByb2R1Y2UgYSBidWlsZCBzY3JpcHQgaWYgdGhlIHNvdXJjZSBpcyBkZWZpbmVkLgotCi1JZiAiYEV4aXN0cyAie3NyY2Rpcn0ibXB3LWJ1aWxkLmluYCIgIT0gIiIKLQlFY2hvICJTZXQgc3Jjcm9vdCAiIHtzcmNyb290fSA+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JRWNobyAiU2V0IHNyY2RpciAiIHtzcmNkaXJ9ID4+ICJ7b2JqZGlyfSJtcHctYnVpbGQudGVtCi0JRWNobyAiU2V0IHRhcmdldF9jYW5vbmljYWwgIiB7dGFyZ2V0X2Nhbm9uaWNhbH0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQlFY2hvICJTZXQgcHJlZml4ICIge3ByZWZpeH0gPj4gIntvYmpkaXJ9Im1wdy1idWlsZC50ZW0KLQl0ci03dG84ICJ7c3JjZGlyfSJtcHctYnVpbGQuaW4gPj4ie29iamRpcn0ibXB3LWJ1aWxkLnRlbQotCU1vdmVJZkNoYW5nZSAie29iamRpcn0ibXB3LWJ1aWxkLnRlbSAie29iamRpcn0ibXB3LWJ1aWxkCi0JSWYge3ZlcmlmeX0gPT0gMQotCQlFY2hvIENyZWF0ZWQgbXB3LWJ1aWxkIGluICJgRGlyZWN0b3J5YCIKLQlFbmQgSWYKLUVuZCBJZgotCi0jIEFwcGx5IG91cnNlbHZlcyByZWN1cnNpdmVseSB0byB0aGUgbGlzdCBvZiBzdWJkaXJlY3RvcmllcyB0byBjb25maWd1cmUuCi0KLUlmIHtyZWN1cnNlfSA9PSAxCi0JRm9yIHN1YmRpciBJbiB7Y29uZmlnZGlyc30KLQkJU2V0IHNhdmVkaXIgImBEaXJlY3RvcnlgIgotCQlJZiAiYEV4aXN0cyAie3NyY2Rpcn17c3ViZGlyfToiYCIgPT0gIiIKLQkJCUlmIHt2ZXJpZnl9ID09IDEKLQkJCQlFY2hvIE5vICJ7c3JjZGlyfXtzdWJkaXJ9OiIgZm91bmQsIHNraXBwaW5nCi0JCQlFbmQgSWYKLQkJCUNvbnRpbnVlCi0JCUVuZCBJZgotCQlJZiB7dmVyaWZ5fSA9PSAxCi0JCQlFY2hvIENvbmZpZ3VyaW5nIHtzdWJkaXJ9Li4uCi0JCUVuZCBJZgotCQlJZiAiYEV4aXN0cyAie29iamRpcn17c3ViZGlyfToiYCIgPT0gIiIKLQkJCU5ld0ZvbGRlciAie29iamRpcn17c3ViZGlyfSIKLQkJRW5kIElmCi0JCVNldERpcmVjdG9yeSAie29iamRpcn17c3ViZGlyfToiCi0JCSJ7VGhpc1NjcmlwdH0iIC0tdGFyZ2V0ICJ7dGFyZ2V0X2Nhbm9uaWNhbH0iIC0tc3JjZGlyICJ7c3JjZGlyfXtzdWJkaXJ9OiIgLS1zcmNyb290ICJ7c3Jjcm9vdH0iIC0tcHJlZml4ICJ7cHJlZml4fSIgLS1jYyAie2hvc3RfY2N9IiB7dmVyaWZ5c3RyfSB7ZW5hYmxlX29wdGlvbnN9IHtkaXNhYmxlX29wdGlvbnN9Ci0JCVNldERpcmVjdG9yeSAie3NhdmVkaXJ9IgotCUVuZCBGb3IKLUVuZCBJZgotCi1TZXREaXJlY3RvcnkgIntzYXZlZGlyfSIKZGlmZiAtLWdpdCBhL21wdy1pbnN0YWxsIGIvbXB3LWluc3RhbGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzVhYWMuLjAwMDAwMDAKLS0tIGEvbXB3LWluc3RhbGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotIyBHTlUgSW5zdGFsbCBzY3JpcHQgZm9yIE1QVy4KLQotU2V0IE9sZEV4aXQgIntFeGl0fSIKLVNldCBFeGl0IDAKLQotU2V0IFRlbXBVc2VyU3RhcnR1cCAie1RlbXBGb2xkZXJ9Il9fdGVtcF9fVXNlclN0YXJ0dXAKLQotRWNobyAnIyBVc2VyU3RhcnR1cCBnZW5lcmF0ZWQgYnkgR05VIEluc3RhbGwgc2NyaXB0JyA+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgKHNob3VsZCkgQ2hlY2sgdGhhdCBkaXNrIHNwYWNlIGlzIHN1ZmZpY2llbnQgZm9yIGluc3RhbGxhdGlvbi4KLQotIyBBc3N1bWUgdGhhdCB0aGUgaW5zdGFsbCBzY3JpcHQgaXMgd2hlcmUgZXZlcnl0aGluZyBlbHNlIGlzLgotCi1TZXQgdGhpc2RpciAiYERpcmVjdG9yeWAiCi0KLSMgQ29weSB0aGUgYmluYXJpZXMgdG8gdGhlIGRlc2lyZWQgcGxhY2UuCi0KLUNvbmZpcm0gLXQgIkNvcHkgdGhlIGJpbmFyaWVzIHRvIHNvbWV3aGVyZSBlbHNlPyIKLVNldCBUbXBTdGF0dXMge1N0YXR1c30KLUlmIHtUbXBTdGF0dXN9ID09IDAKLQlTZXQgYmluZGVzdCAiYEdldEZpbGVOYW1lIC1kIC1tICJXaGVyZSB0byBpbnN0YWxsIHRoZSBiaW5hcmllcz8iYCIKLQlJZiB7U3RhdHVzfSA9PSAwCi0JCUlmICJgRXhpc3RzICJ7dGhpc2Rpcn1iaW4iYCIgIT0gIiIKLQkJCUZvciBhZmlsZSBJbiAie3RoaXNkaXJ9ImJpbjpcT3B0aW9uLXgKLQkJCQlEdXBsaWNhdGUgLXkgInthZmlsZX0iICJ7YmluZGVzdH0iCi0JCQlFbmQgRm9yCi0JCUVsc2UKLQkJCUVjaG8gImJpbiBkaXJlY3Rvcnkgbm90IGZvdW5kLCBleGl0aW5nIgotCQkJRXhpdCAxCi0JCUVuZCBJZgotCUVsc2UKLQkJRWNobyAiTm8gZGVzdGluYXRpb24gc3VwcGxpZWQsIGV4aXRpbmciCi0JCUV4aXQgMQotCUVuZCBJZgotRWxzZSBJZiB7VG1wU3RhdHVzfSA9PSA0Ci0JIyBVc2UgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQlTZXQgYmluZGVzdCAie3RoaXNkaXJ9YmluOiIKLUVsc2UKLQkjIENhbmNlbGxlZCBmcm9tIGNvbmZpcm1hdGlvbiwgZXNjYXBlIGFsdG9nZXRoZXIuCi0JRXhpdCAxCi1FbmQgSWYKLQotIyBDb3B5IHRoZSBsaWJyYXJpZXMgdG8gdGhlIGRlc2lyZWQgcGxhY2UuCi0KLUNvbmZpcm0gLXQgIkNvcHkgdGhlIGxpYnJhcmllcyB0byBzb21ld2hlcmUgZWxzZT8iCi1TZXQgVG1wU3RhdHVzIHtTdGF0dXN9Ci1JZiB7VG1wU3RhdHVzfSA9PSAwCi0JU2V0IGxpYmRlc3QgImBHZXRGaWxlTmFtZSAtZCAtbSAiV2hlcmUgdG8gaW5zdGFsbCB0aGUgbGlicmFyaWVzPyJgIgotCUlmIHtTdGF0dXN9ID09IDAKLQkJSWYgImBFeGlzdHMgInt0aGlzZGlyfWxpYjoiYCIgIT0gIiIKLQkJCUZvciBhZmlsZSBJbiAie3RoaXNkaXJ9ImxpYjpcT3B0aW9uLXgKLQkJCQlEdXBsaWNhdGUgLXkgInthZmlsZX0iICJ7bGliZGVzdH0iCi0JCQlFbmQgRm9yCi0JCUVsc2UKLQkJCUVjaG8gImxpYiBkaXJlY3Rvcnkgbm90IGZvdW5kLCBleGl0aW5nIgotCQkJRXhpdCAxCi0JCUVuZCBJZgotCUVsc2UKLQkJRWNobyAiTm8gZGVzdGluYXRpb24gc3VwcGxpZWQsIGV4aXRpbmciCi0JCUV4aXQgMQotCUVuZCBJZgotRWxzZSBJZiB7VG1wU3RhdHVzfSA9PSA0Ci0JIyBVc2UgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeS4KLQlTZXQgbGliZGVzdCAie3RoaXNkaXJ9bGliOiIKLUVsc2UKLQkjIENhbmNlbGxlZCBmcm9tIGNvbmZpcm1hdGlvbiwgZXNjYXBlIGFsdG9nZXRoZXIuCi0JRXhpdCAxCi1FbmQgSWYKLQotCi0jIEFkZCB0aGUgbG9jYXRpb24gb2YgdGhlIGJpbmFyaWVzIHRvIHRoZSBjb21tYW5kIHBhdGguCi0KLUVjaG8gLW4gJ1NldCBDb21tYW5kcyAiJwkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gLW4gIntiaW5kZXN0fSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAgICAnLHtDb21tYW5kc30iJwkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICcnCQkJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotCi0jIFNldCB1cCBHQ0MgZXhlYyBwcmVmaXguCi0KLVNldCBnY2NsaWJkaXIgIntsaWJkZXN0fSJnY2MtbGliOgotCi1FY2hvIC1uICdTZXQgR0NDX0VYRUNfUFJFRklYICInCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAtbiAie2djY2xpYmRpcn0iCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gICAgJyInCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi1FY2hvICJFeHBvcnQgR0NDX0VYRUNfUFJFRklYIgkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gJycJCQkJCQk+PiAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLSMgU2V0IHVwIHBhdGggdG8gbGliZ2NjLnhjb2ZmIGV0Yy4KLQotRWNobyAtbiAnU2V0IEdDQ1BQQ0xpYnJhcmllcyAiJwkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gLW4gIntsaWJkZXN0fSIJCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAgICAnIicJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLUVjaG8gIkV4cG9ydCBHQ0NQUENMaWJyYXJpZXMiCQkJPj4gIntUZW1wVXNlclN0YXJ0dXB9IgotRWNobyAnJwkJCQkJCT4+ICJ7VGVtcFVzZXJTdGFydHVwfSIKLQotIyBEaXNwbGF5IGNvbnRlbnRzIG9mIFVzZXJTdGFydHVwLCBjb25maXJtIGluc3RhbGxhdGlvbi4KLQotU2V0IFVzZXJTdGFydHVwTmFtZSAiVXNlclN0YXJ0dXBcT3B0aW9uLThHTlUiCi0KLUVjaG8gIkNvbnRlbnRzIG9mIiB7VXNlclN0YXJ0dXBOYW1lfSAid2lsbCBiZToiCi1DYXRlbmF0ZSAie1RlbXBVc2VyU3RhcnR1cH0iCi0KLUNvbmZpcm0gIkluc3RhbGwge1VzZXJTdGFydHVwTmFtZX0gaW50byB0aGUgTVBXIGZvbGRlciB7TVBXfSA/IgotSWYge1N0YXR1c30gPT0gMAotCUR1cGxpY2F0ZSAie1RlbXBVc2VyU3RhcnR1cH0iICJ7TVBXfXtVc2VyU3RhcnR1cE5hbWV9IgotCURlbGV0ZSAteSAie1RlbXBVc2VyU3RhcnR1cH0iCi1FbHNlCi0JRWNobyAie1VzZXJTdGFydHVwTmFtZX0gZmlsZSBub3QgaW5zdGFsbGVkIgotRW5kIElmCi0KLSMgKHNob3VsZCkgQ2hlY2sgSEVYQSByZXNvdXJjZSwgd2FybiBpZiBsb3cuCi0KLSMgKHNob3VsZCkgQ2hlY2sgZm9yIHNwYWNlcyBpbiBwYXRobmFtZXMsIHdhcm4gaWYgZm91bmQuCi0KLUVjaG8gIkluc3RhbGxhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4iCi1FY2hvICIiCi1FY2hvICJCZSBzdXJlIHRvIHJldmlldyB0aGUgdXNhZ2Ugbm90ZXMgaW4gJ1JlYWQgTWUgZm9yIE1QVycgYmVmb3JlIHByb2NlZWRpbmchIgotCi0jIFJlc3RvcmUgcHJldmlvdXMgc2V0dGluZ3MuCi0KLVNldCBFeGl0ICJ7T2xkRXhpdH0iCmRpZmYgLS1naXQgYS9vcGNvZGVzL0NoYW5nZUxvZyBiL29wY29kZXMvQ2hhbmdlTG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2I5MmQ3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNTE5MiArMCwwIEBACi0xOTk5LTA2LTIzICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmM6IE1lbnRpb24gaW50ZWwgbW9kZSBzcGVjaWFscyBpbiBtYWNybyBjaGFyIGNvbW1lbnQuCi0KLTE5OTktMDYtMjEgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBhbHBoYS1kaXMuYzogRG9uJ3QgaW5jbHVkZSA8c3RkbGliLmg+LgotCSogYXJtLWRpcy5jOiBJbmNsdWRlICJzeXNkZXAuaCIuCi0JKiB0aWMzMC1kaXMuYzogRG9uJ3QgaW5jbHVkZSA8c3RkbGliLmg+IG9yIDxzdHJpbmcuaD4uICBJbmNsdWRlCi0JInN5c2RlcC5oIi4KLQkqIE1ha2VmaWxlLmFtOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0xOTk5LTA2LTE2ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogQWRkIGRldGVjdGlvbiBvZiBJTUIgYW5kIElNQlJhbmdlCi0JU1dJcy4gCi0KLTE5OTktMDYtMTQgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+ICYgRHJldyBNb3NsZXkgPGRtb3NlbGV5QGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAoYXJtX3JlZ25hbWVzKTogVHVybiBpbnRvIGEgcG9pbnRlciB0byBhIHJlZ2lzdGVyCi0JbmFtZSBzZXQuCi0JKGFybV9yZWduYW1lc19zdGFuZGFyZCk6IE5ldyB2YXJpYWJsZTogQXJyYXkgb2YgQVJNIHJlZ2lzdGVyCi0JbmFtZXMgYWNjb3JkaW5nIHRvIEFSTSBpbnN0cnVjdGlvbiBzZXQgbm9tZW5jbGF0dXJlLiAKLQkoYXJtX3JlZ25hbWVzX2FwY3MpOiBOZXcgdmFyaWFibGU6IEFycmF5IG9mIEFSTSByZWdpc3RlciBuYW1lcwotCWFjY29yZGluZyB0byBBUk0gUHJvY2VkdXJlIENhbGwgU3RhbmRhcmQuCi0JKGFybV9yZWduYW1lc19yYXcpOiBOZXcgdmFyaWFibGU6IEFycmF5IG9mIEFSTSByZWdpc3RlciBuYW1lcwotCXVzaW5nIGp1c3QgJ3InIGFuZCB0aGUgcmVnaXN0ZXIgbnVtYmVyLgotCShhcm1fdG9nZ2xlX3JlZ25hbWVzKTogTmV3IGZ1bmN0aW9uOiBUb2dnbGUgdGhlIGNob3NlbiByZWdpc3RlciBzZXQKLQluYW1pbmcgc2NoZW1lLgotCShwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyk6IE5ldyBmdW5jdGlvbjogUGFyc2UgYW55IHRhcmdldAotCWRpc2Fzc2VtYmxlciBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLQkocHJpbnRfaW5zbl9iaWdfYXJtKTogQ2FsbCBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyBpZiBhbnkKLQlhcmUgZGVmaW5lZC4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogQ2FsbCBwYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyBpZiBhbnkKLQlhcmUgZGVmaW5lZC4KLQotMTk5OS0wNi0xMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKEZXQUlUX09QQ09ERSk6IERlZmluZS4KLQkodXNlZF9wcmVmaXhlcyk6IE5ldyBzdGF0aWMgdmFyaWFibGUuCi0JKGZldGNoX2RhdGEpOiBEb24ndCBwcmludCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGhhdmUgYWxyZWFkeQotCWZldGNoZWQgc29tZSBieXRlcyBzdWNjZXNzZnVsbHkuCi0JKGNrcHJlZml4KTogQ2xlYXIgdXNlZF9wcmVmaXhlcy4gIFVzZSBGV0FJVF9PUENPREUsIG5vdCAweDliLgotCShwcmVmaXhfbmFtZSk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByaW50X2luc25faTM4Nik6IElmIHNldGptcCBmYWlscywgaW5kaWNhdGluZyBhIGRhdGEgZXJyb3IsIGJ1dAotCXdlIGhhdmUgbWFuYWdlZCB0byBmZXRjaCBzb21lIGJ5dGVzLCBwcmludCB0aGUgZmlyc3Qgb25lIGFzIGEKLQlwcmVmaXggb3IgYSAuYnl0ZSBwc2V1ZG8tb3AuICBJZiBmd2FpdCBpcyBmb2xsb3dlZCBieSBhIG5vbgotCWZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uLCBwcmludCB0aGUgZmlyc3QgcHJlZml4LiAgU2V0Ci0JdXNlZF9wcmVmaXhlcyB3aGVuIHByZWZpeGVzIGFyZSB1c2VkLiAgSWYgYW55IHByZWZpeGVzIHdlcmUgbm90Ci0JdXNlZCBhZnRlciBkaXNhc3NlbWJsaW5nIHRoZSBpbnN0cnVjdGlvbiwgcHJpbnQgdGhlIGZpcnN0IHByZWZpeAotCWluc3RlYWQgb2YgcHJpbnRpbmcgdGhlIGluc3RydWN0aW9uLgotCShwdXRvcCk6IFNldCB1c2VkX3ByZWZpeGVzIHdoZW4gcHJlZml4ZXMgYXJlIHVzZWQuCi0JKGFwcGVuZF9zZWcsIE9QX0UsIE9QX0csIE9QX1JFRywgT1BfSSwgT1Bfc0ksIE9QX0opOiBMaWtld2lzZS4KLQkoT1BfRElSLCBPUF9TSU1EX1N1ZmZpeCk6IExpa2V3aXNlLgotCi0xOTk5LTA2LTA3ICBKYWt1YiBKZWxpbmVrICA8ampAdWx0cmEubGludXguY3o+Ci0KLQkqIHNwYXJjLW9wYy5jOiBGaXggdXAgc2V0LCBzZXRzdywgc2V0dXcgb3BlcmFuZCBraW5kcy4KLQlTdXBwb3J0IHNpZ254ICVyZWcsIGNscnV3ICVyZWcuCi0KLTE5OTktMDYtMDcgIEpha3ViIEplbGluZWsgIDxqakB1bHRyYS5saW51eC5jej4KLQotCSogc3BhcmMtb3BjLmM6IEFkZCBhbGlhc2VzIFNvbGFyaXMgYXMgc3VwcG9ydHMuCi0KLU1vbiBKdW4gIDcgMTI6MDQ6NTIgMTk5OSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uY3MudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBNYWtlZmlsZS5hbSAoQ0ZJTEVTKTogQWRkIGFyYy17ZGlzLG9wY30uYyBhbmQgdjg1MC17ZGlzLG9wY30uYy4KLQkqIE1ha2VmaWxlLmluOiBSZWdlbmVyYXRlZC4KLQotMTk5OS0wNi0wMyAgUGhpbGlwIEJsdW5kZWxsICA8cGhpbGJAZ251Lm9yZz4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IE1ha2UgTERSSC9MRFJCIGNvbnNpc3RlbnQgd2l0aCBMRFIKLQl3aGVuIHRhcmdldCBpcyBQQy1yZWxhdGl2ZS4KLQotMTk5OS0wNS0yOCAgTGludXMgTm9yZGJlcmcgIDxsaW51cy5ub3JkYmVyZ0BjYW5pdC5zZT4KLQotCSogbTY4ay1vcGMuYzogUmVuYW1lIE1BQ0wvTVNBQ0wgdG8gTUFDL01TQUMuICBBZGQgTUFDTS9NU0FDTS4gIEFkZAotCU1PVkUgTUFDU1IsQ0NSLgotCi0JKiBtNjhrLWRpcy5jIChmZXRjaF9hcmcpOiBBZGQgcGxhY2VzIGBuJywgYG8nLgotCi0JKiBtNjhrLW9wYy5jOiBBZGQgTVNBQywgTUFDTCwgTU9WRSB0by9mcm9tIEFDQywgTUFDU1IsIE1BU0suCi0JQWRkIG1jZjUyMDZlIHRvIGFwcHJvcHJpYXRlIGluc3RydWN0aW9ucy4KLQlBZGQgYWxpYXMgZm9yIE1BQywgTVNBQy4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBBZGQgZm9ybWF0cyBgRScsIGBHJywgYEgnIGFuZCBwbGFjZQotCWBOJy4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkIGRpdnN3LCBkaXZzbCwgZGl2dXcsIGRpdnVsLCBtYWNsLAotCW1hY3csIHJlbXNsLCByZW11bCBmb3IgbWNmNTMwNy4gIENoYW5nZSBtY2Y1MjAwIC0tPiBtY2YuCi0KLQkqIG02OGstZGlzLmM6IEFkZCBmb3JtYXQgYHUnIGFuZCBwbGFjZXMgYGgnLCBgbScsIGBNJy4KLQotMTk5OS0wNS0xOCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChFZCk6IERlZmluZS4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0LCBkaXMzODZfdHdvYnl0ZV9pbnRlbCk6IFVzZSBFZCBmb3IgbW92ZC4KLQkoUncpOiBSZW1vdmUuCi0JKE9QX3JtKTogUmVuYW1lIHRvIE9QX1JkLgotCShPTkUpOiBSZW1vdmUuCi0JKE9QX09ORSk6IFJlbW92ZS4KLQkocHV0b3ApOiBBZGQgY29uc3QgdG8gdGVtcGxhdGUgYW5kIHAuCi0JKHByaW50X2luc25feDg2KTogRGVsZXRlLgotCShwcmludF9pbnNuX2kzODYpOiBNZXJnZSBvbGQgZnVuY3Rpb24gcHJpbnRfaW5zbl94ODYuICBBZGQgY29uc3QKLQl0byBkcC4KLQkoc3RydWN0IGRpczM4Nik6IEFkZCBjb25zdCB0byBuYW1lLgotCShkaXMzODZfYXR0LCBkaXMzODZfaW50ZWwpOiBBZGQgY29uc3QuCi0JKGRpczM4Nl90d29ieXRlX2F0dCwgZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBBZGQgY29uc3QuCi0JKG5hbWVzMzIsIG5hbWVzMTYsIG5hbWVzOCwgbmFtZXNfc2VnLCBpbmRleDE2KTogQWRkIGNvbnN0LgotCShncnBzLCBwcmVmaXhfdXNlcl90YWJsZSwgZmxvYXRfcmVnKTogQWRkIGNvbnN0LgotCShmbG9hdF9tZW1fYXR0LCBmbG9hdF9tZW1faW50ZWwpOiBBZGQgY29uc3QuCi0JKG9hcHBlbmQpOiBBZGQgY29uc3QgdG8gcy4KLQkoT1BfUkVHKTogQWRkIGNvbnN0IHRvIHMuCi0JKHB0cl9yZWcpOiBBZGQgY29uc3QgdG8gcy4KLQkoZG9mbG9hdCk6IEFkZCBjb25zdCB0byBkcC4KLQkoT1BfQyk6IERvbid0IHNraXAgbW9kcm0sIGl0J3Mgbm93IGRvbmUgaW4gT1BfUmQuCi0JKE9QX0QpOiBEaXR0by4KLQkoT1BfVCk6IERpdHRvLgotCShPUF9SZCk6IENoZWNrIGZvciB2YWxpZCBtb2QuICBDYWxsIE9wX0UgdG8gcHJpbnQuCi0JKE9QX0UpOiBIYW5kbGUgZF9tb2RlIGFyZy4gIENoZWNrIGZvciBiYWQgc2ZlbmNlLGxlYSxsZHMgZXRjLgotCShPUF9NUyk6IENoZWNrIGZvciB2YWxpZCBtb2QuICBDYWxsIE9wX0VNIHRvIHByaW50LgotCShPUF8zRE5vd1N1ZmZpeCk6IFNldCBvYnVmcCBhbmQgdXNlIG9hcHBlbmQgcmF0aGVyIHRoYW4KLQlzdHJjYXQuICBDYWxsIEJhZE9wKCkgZm9yIGVycm9ycy4KLQkoT1BfU0lNRF9TdWZmaXgpOiBMaWtld2lzZS4KLQkoQmFkT3ApOiBOZXcgZnVuY3Rpb24uCi0KLTE5OTktMDUtMTIgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X2ludGVsKTogUmVtb3ZlIG1hY3JvIGNoYXJzLCBleGNlcHQgZm9yCi0JakVjeHouICBDaGFuZ2UgY1d0UiBhbmQgY1J0ZCB0byBjVyBhbmQgY1IuCi0JKGRpczM4Nl90d29ieXRlX2ludGVsKTogUmVtb3ZlIG1hY3JvIGNoYXJzIGhlcmUgdG9vLgotCShwdXRvcCk6IEhhbmRsZSBSIGFuZCBXIG1hY3JvcyBmb3IgaW50ZWwgbW9kZS4KLQotCSogaTM4Ni1kaXMuYyAoU0lNRF9GaXh1cCk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzMzg2X3R3b2J5dGVfYXR0KTogVXNlIGl0IG9uIG1vdmxwcyBhbmQgbW92aHBzLCBhbmQgY2hhbmdlCi0JRXYgdG8gRVggb24gdGhlc2UgaW5zbnMuICBDaGFuZ2UgbW92bXNrcHMgRXYsIFhNIHRvIEd2LCBFWC4KLQkoZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBTYW1lIGhlcmUuCi0KLQkqIGkzODYtZGlzLmMgKEF2KTogUmVtb3ZlLgotCShBcCk6IHJlbW92ZSBscHRyLgotCShscHRyKTogUmVtb3ZlLgotCShPUFNJTUQpOiBEZWZpbmUuCi0JKE9QX1NJTURfU3VmZml4KTogTmV3IGZ1bmN0aW9uLgotCShPUF9ESVIpOiBSZW1vdmUgZGVhZCBjb2RlLgotCShlQVhfcmVnLi5lRElfcmVnKTogUmVudW1iZXIuCi0JKG9uZWJ5dGVfaGFzX21vZHJtKTogVGFibGUgbnVtYmVyaW5nIGNvbW1lbnRzLgotCShJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOiBNb3ZlIHRvIGJlZm9yZSBwcmludF9pbnNuX3g4Ni4KLQkocHJpbnRfaW5zbl94ODYpOiBNb3ZlIGFsbCBwcmVmaXggb2FwcGVuZHMgdG8gYWZ0ZXIgdXNlc19mM19wcmVmaXgKLQljaGVja3MuICBQcmludCBlcnJvciBvbiBpbnZhbGlkIGRwLT5ieXRlbW9kZTIuICBSZW1vdmUgc2ltZF9jbXAsCi0JYW5kIGhhbmRsZSBTSU1EIGNtcCBpbnNucyBpbiBPUF9TSU1EX1N1ZmZpeC4KLQkoaW5mby0+Ynl0ZXNfcGVyX2xpbmUpOiBCdW1wIGZyb20gNSB0byA2LgotCShPUF9Ob25lKTogUmVtb3ZlLgotCShPUF9FKTogVXNlIElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUi4gIEhhbmRsZSBzZmVuY2UuCi0JKE9QXzNETm93U3VmZml4KTogRW5zdXJlIG1uZW1vbmljIGluZGV4IHVuc2lnbmVkLgotCi0JUElJSSBTSU1EIHN1cHBvcnQgZnJvbSBEb3VnIExlZGZvcmQgPGRsZWRmb3JkQHJlZGhhdC5jb20+Ci0JKiBpMzg2LWRpcy5jIChYTSwgRVgsIE5vbmUpOiBEZWZpbmUuCi0JKE9QX1hNTSwgT1BfRVgsIE9QX05vbmUpOiBOZXcgZnVuY3Rpb25zLgotCShVU0VfR1JPVVBTLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUpOiBEZWZpbmUuCi0JKEdSUDE0KTogUmVuYW1lIHRvIEdSUEFNRC4KLQkoR1JQKik6IEFkZCBVU0VfR1JPVVBTIGZsYWcuCi0JKFBSRUdSUCopOiBEZWZpbmUuCi0JKGRpczM4Nl90d29ieXRlX2F0dCwgZGlzMzg2X3R3b2J5dGVfaW50ZWwpOiBBZGQgU0lNRCBpbnNucy4KLQkodHdvYnl0ZV9oYXNfbW9kcm0pOiBBZGQgU0lNRCBlbnRyaWVzLgotCSh0d29ieXRlX3VzZXNfZjNfcHJlZml4LCBzaW1kX2NtcF9vcCwgcHJlZml4X3VzZXJfdGFibGUpOiBOZXcuCi0JKGdycHMpOiBBZGQgU0lNRCBpbnNucy4KLQkocHJpbnRfaW5zbl94ODYpOiBOZXcgdmFycyB1c2VzX2YzX3ByZWZpeCBhbmQgc2ltZF9jbXAuICBEb24ndAotCW9hcHBlbmQgcmVweiBpZiB1c2VzX2YzX3ByZWZpeC4gIEFkZCBjb2RlIHRvIGhhbmRsZSBuZXcgZ3JvdXBzIGZvcgotCVNJTUQgaW5zbnMuCi0KLQlGcm9tIE1hY2llaiBXLiBSb3p5Y2tpIDxtYWNyb0BkczIucGcuZ2RhLnBsPgotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X2F0dCwgZGlzMzg2X2ludGVsKTogQ2hhbmdlIDB4RTggY2FsbCBpbnNuCi0Jb3BlcmFuZCBmcm9tIEF2IHRvIEp2LgotCi0xOTk5LTA1LTA3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBtY29yZS1kaXMuYyAocHJpbnRfaW5zbl9tY29yZSk6IFVzZSAuc2hvcnQgdG8gZGlzcGxheQotCXVuaWRlbnRpZmllZCBpbnN0cnVjdGlvbnMsIG5vdCAud29yZC4KLQotMTk5OS0wNC0yNiAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFVwZGF0ZWQgZm9yIG5ldyB2ZXJzaW9uIG9mIGxpYnRvb2wuCi0KLTE5OTktMDQtMTQgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYyxmcjMwLW9wYy5jOiBSZWJ1aWxkLgotCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCi1Nb24gQXByIDEyIDIzOjQ2OjE3IDE5OTkgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlICczJyk6IE5ldyBjYXNlIGZvciBQQTIuMAotCWluc3RydWN0aW9ucy4KLQotMTk5OS0wNC0xMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWlibGQuYzogUmVidWlsZC4KLQkqIG0zMnItZGVzYy5jLG0zMnItZGVzYy5oLG0zMnItb3BpbnN0LmM6IFJlYnVpbGQuCi0KLTE5OTktMDQtMDYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBvcGludGwuaCAoTENfTUVTU0FHRVMpOiBOZXZlciBkZWZpbmUuCi0KLTE5OTktMDQtMDQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AemVtYnUuY29tPgotCi0JKiBpMzg2LWRpcy5jIChpbnRlbF9zeW50YXgsIG9wZW5fY2hhciwgY2xvc2VfY2hhcik6IE1ha2Ugc3RhdGljLgotCShzZXBhcmF0b3JfY2hhciwgc2NhbGVfY2hhcik6IExpa2V3aXNlLgotCShwcmludF9pbnNuX3g4Nik6IExpa2V3aXNlLgotCShwcmludF9pbnNuX2kzODYpOiBMaWtld2lzZS4gIEFkZCBkZWNsYXJhdGlvbi4KLQotMTk5OS0wMy0yNiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLWRpcy5jOiBSZWJ1aWxkLgotCSogbTMyci1kaXMuYzogUmVidWlsZC4KLQotMTk5OS0wMy0yMyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkB6ZW1idS5jb20+Ci0KLQkqIG02OGstb3BjLmM6IENoYW5nZSBjb21wYXJlIGluc3RydWN0aW9ucyB0byB1c2UgIkBzIiByYXRoZXIgdGhhbgotCSI7cyIgd2hlbiB1c2VkIHdpdGggYW4gaW1tZWRpYXRlIG9wZXJhbmQuCi0KLTE5OTktMDMtMjIgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9zZXRfY3B1KTogRGVsZXRlLgotCShjZ2VuX2xvb2t1cF9pbnNuKTogbWF4X2luc25fc2l6ZSByZW5hbWVkIHRvIG1heF9pbnNuX2JpdHNpemUuCi0JKiBmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDoKLQlSZWJ1aWxkLgotCSogbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6Ci0JUmVidWlsZC4KLQkqIHBvL29wY29kZXMucG90OiBSZWJ1aWxkLgotCi0xOTk5LTAzLTE2ICBNYXJ0aW4gSHVudCAgPGh1bnRAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAobXZ0c3lzKTogUmVtb3ZlIEZMQUdfTEtSLgotCi0xOTk5LTAzLTExICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IE5ldyBhcmcgYGlzYScuICBBbGwgY2FsbGVycyB1cGRhdGVkLgotCShjZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUsY2dlbl9vcGVyYW5kX2xvb2t1cF9ieV9udW0pOiBOZXcgZm5zLgotCShjZ2VuX2dldF9pbnNuX29wZXJhbmRzKTogUmV3cml0ZSB0ZXN0IGZvciBoYXJkY29kZWQvb3BlcmFuZCBpbmRleC4KLQkqIGZyMzAtYXNtLmMsZnIzMC1kZXNjLmMsZnIzMC1kZXNjLmgsZnIzMC1kaXMuYyxmcjMwLWlibGQuYzogUmVidWlsZC4KLQkqIG0zMnItYXNtLmMsbTMyci1kZXNjLmMsbTMyci1kZXNjLmgsbTMyci1kaXMuYyxtMzJyLWlibGQuYzogUmVidWlsZC4KLQkqIG0zMnItb3BpbnN0LmM6IFJlYnVpbGQuCi0KLTE5OTktMDItMjUgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1vcGMuYyAoY2dlbl9od19sb29rdXBfYnlfbmFtZSk6IFJld3JpdGUuCi0JKGNnZW5faHdfbG9va3VwX2J5X251bSk6IFJld3JpdGUuCi0JKiBmcjMwLWRlc2MuYyxmcjMwLWRlc2MuaCxmcjMwLWRpcy5jLGZyMzAtaWJsZC5jLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLWRlc2MuYyxtMzJyLWRlc2MuaCxtMzJyLWRpcy5jLG0zMnItaWJsZC5jLG0zMnItb3BjLmM6IFJlYnVpbGQuCi0JKiBtMzJyLW9waW5zdC5jOiBSZWJ1aWxkLgotCi1TYXQgRmViIDEzIDE0OjA2OjE5IDE5OTkgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jOiBBZGQgc3FydCtmbGFncyBwYXR0ZXJucy4gIEFkZCBFVjYgUEFMY29kZSBpbnNucy4KLQkoaW5zZXJ0X2poaW50KTogRml4IGluc2VydGlvbiBtYXNrLgotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBEaXNhc3NlbWJsZSBFVjYgUEFMY29kZSBpbnNucy4KLQotMTk5OS0wMi0xMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotMTk5OS0wMi0wOSAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBpOTYwYy1hc20uYyxpOTYwYy1kaXMuYyxpOTYwYy1vcGMuYyxpOTYwYy1vcGMuaDogRGVsZXRlLgotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogUmVuYW1lIGZyb20gcHJpbnRfaW5zbl9pOTYwX29yaWcuCi0JKiBNYWtlZmlsZS5hbTogUmVtb3ZlIHJlZmVyZW5jZXMgdG8gdGhlbS4KLQkoSEZJTEVTKTogQWRkIGZyMzAtZGVzYy5oLG0zMnItZGVzYy5oLgotCShDRklMRVMpOiBBZGQgZnIzMC1kZXNjLmMsZnIzMC1pYmxkLmMsbTMyci1kZXNjLmMsbTMyci1pYmxkLmMsCi0JbTMyci1vcGluc3QuYy4KLQkoQUxMX01BQ0hJTkVTKTogVXBkYXRlLgotCSogY29uZmlndXJlLmluOiBSZWRvIGhhbmRsaW5nIG9mIGNnZW5fZmlsZXMuCi0JKGJmZF9pOTYwX2FyY2gpOiBEZWxldGUgaTk2MGMtKi5sbyBmaWxlcy4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQkqIGNnZW4tYXNtLmMgKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkoaGFzaF9pbnNuX2FycmF5KTogUmV3cml0ZS4KLQkqIGNnZW4tZGlzLmMgKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkoaGFzaF9pbnNuX2FycmF5KTogUmV3cml0ZS4KLQkqIGNnZW4tb3BjLmMgKCopOiBDR0VOX09QQ09ERV9ERVNDIHJlbmFtZWQgdG8gQ0dFTl9DUFVfREVTQy4KLQkoY2dlbl9sb29rdXBfaW5zbixjZ2VuX2dldF9pbnNuX29wZXJhbmRzKTogRGVmaW5lIGhlcmUuCi0JKGNnZW5fbG9va3VwX2dldF9pbnNuX29wZXJhbmRzKTogRGl0dG8uCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmMsbTMyci1vcGMuaDogUmVnZW5lcmF0ZS4KLQkqIHBvL1BPVEZJTEVTLmluOiBSZWJ1aWxkLgotCSogcG8vb3Bjb2Rlcy5wb3Q6IFJlYnVpbGQuCi0KLUZyaSBGZWIgIDUgMDA6MDQ6MjQgMTk5OSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKEhGSUxFUyk6IEFkZCBmcjMwLW9wYy5oLgotCShDRklMRVMpOiBBZGQgZnIzMC1hc20uYywgZnIzMC1kaXMuYywgZnIzMC1vcGMuYy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBBQ19QUkVSRVEgdG8gMi4xMy4gIFJlbW92ZSBBTV9DWUdXSU4zMi4KLQlDaGFuZ2UgQU1fRVhFRVhUIHRvIEFDX0VYRUVYVCBhbmQgQU1fUFJPR19JTlNUQUxMIHRvCi0JQUNfUFJPR19JTlNUQUxMLgotCSogYWNjb25maWcuaDogUmVtb3ZlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggY3VycmVudCBhdXRvY29uZi9hdXRvbWFrZS4KLQkqIGFjbG9jYWwubTQ6IExpa2V3aXNlLgotCSogY29uZmlnLmluOiBMaWtld2lzZS4KLQkqIE1ha2VmaWxlLmluOiBMaWtld2lzZS4KLQotVGh1IEZlYiAgNCAxMzo0ODo1MiAxOTk5ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IENvcnJlY3QgbW92ZSAobm90IG1vdmV3KSB0byBzdGF0dXMgd29yZCBvbiA1MjAwLgotCi1Nb24gRmViICAxIDIwOjU0OjM2IDE5OTkgIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogIEhhbmRsZSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4LgotICAgICAgICAqIGkzODYtZGlzLmMgKHhfbW9kZSk6ICBEZWZpbmUuCi0gICAgICAgIChkaXMzODYpOiAgUmVtb3ZlLgotICAgICAgICAoZGlzMzg2X2F0dCk6ICBOZXcuCi0gICAgICAgIChkaXMzODZfaW50ZWwpOiAgTmV3LgotICAgICAgICAoZGlzMzg2X3R3b2J5dGUpOiAgUmVtb3ZlLgotICAgICAgICAoZGlzMzg2X3R3b2J5dGVfYXR0KTogIE5ldy4KLSAgICAgICAgKGRpczM4Nl90d29ieXRlX2ludGVsKTogIE5ldy4KLSAgICAgICAgKHByaW50X2luc25feDg2KTogIFVzZSBuZXcgYXJyYXlzLgotICAgICAgICAoZmxvYXRfbWVtKTogIFJlbW92ZS4KLSAgICAgICAgKGZsb2F0X21lbV9pbnRlbCk6ICBOZXcuCi0gICAgICAgIChmbG9hdF9tZW1fYXR0KTogIE5ldy4KLSAgICAgICAgKGRvZmxvYXQpOiAgVXNlIG5ldyBmbG9hdF9tZW0gYXJyYXlzLgotICAgICAgICAocHJpbnRfaW5zbl9pMzg2X2F0dCk6ICBOZXcuCi0gICAgICAgIChwcmludF9pbnNuX2kzODZfaW50ZWwpOiAgTmV3LgotICAgICAgICAocHJpbnRfaW5zbl9pMzg2KTogIEhhbmRsZSBiZmRfbWFjaF9pMzg2X2kzODZfaW50ZWxfc3ludGF4LgotICAgICAgICAocHV0b3ApOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX2luZGlyRSk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1BfRSk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1BfSSk6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotICAgICAgICAoT1Bfc0kpOiAgSGFuZGxlIGludGVsIHN5bnRheC4KLSAgICAgICAgKE9QX09GRik6ICBIYW5kbGUgaW50ZWwgc3ludGF4LgotCi0KLQotMTk5OS0wMS0yNyAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5oLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0JKiBpOTYwYy1vcGMuaCxpOTYwYy1vcGMuYzogUmVidWlsZC4KLQkqIG0zMnItb3BjLmM6IFJlYnVpbGQuCi0KLVR1ZSBKYW4gMTkgMTg6MDE6NTQgMTk5OSAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGhwcGEtZGlzLmM6IHJldmVydCBIUCBtZXJnZSBjaGFuZ2VzIHVudGlsIEhQIGdpdmVzIHVzCi0JYW4gdXBkYXRlZCBmaWxlLgotCQotMTk5OS0wMS0xOSAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IERpc3BsYXkgQVJNIHN5bnRheCBmb3IgUEMgcmVsYXRpdmUKLQlvZmZzZXRzIGFzIHdlbGwgYXMgc3ltYmxvaWMgYWRkcmVzcy4KLQotVHVlIEphbiAxOSAxMDo1MTowMSAxOTk5ICBEYXZpZCBUYXlsb3IgIDx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4KLQotCSogaHBwYS1kaXMuYzogZml4IGNvbW1lbnRzIGFuZCBzb21lIGluZGVudGF0aW9uLgotCi0xOTk5LTAxLTEyICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmMsaTk2MGMtb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMTEgIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FzZXkuY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQotMTk5OS0wMS0wNiAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi0xOTk5LTAxLTA1ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5oLGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0JKiBpOTYwYy1hc20uYyxpOTYwYy1kaXMuYyxpOTYwYy1vcGMuaCxpOTYwYy1vcGMuYzogUmVnZW5lcmF0ZS4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5oLG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLTE5OTktMDEtMDQgIEphc29uIE1vbGVuZGEgIChqc21AYnVnc2hhY2suY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBSZXF1aXJlIGF1dG9jb25mIDIuMTIuMSBvciBoaWdoZXIuCi0KLTE5OTgtMTItMzAgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzMTYtb3BjLmM6IE1hcmsgYnJhbmNoIGluc25zIHdpdGggTUlQUzE2X0lOU05fQlJBTkNILgotCi1XZWQgRGVjIDE2IDE2OjE3OjQ5IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0KLTE5OTgtMTItMTYgIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChzZXRfbWlwc19pc2FfdHlwZSk6IEhhbmRsZSBiZmRfbWFjaF9taXBzNDExMS4KLQotMTk5OC0xMi0xNSAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTEyLTE0ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBEZWMgMTAgMTg6Mzk6NDYgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRGVjIDEwIDEyOjQ5OjI0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBEZWMgIDggMTM6NTY6MTggMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQkqIGRpcy1idWYuYyAoZ2VuZXJpY19zdHJjYXRfYWRkcmVzcyk6IHJlZm9ybWF0IHRvIEdOVSBjb2RpbmcKLQljb252ZW50aW9ucy4gIGNoYW5nZSBzcHJpbnRmIGNhbGwgdG8gYW4gc3ByaW50Zl92bWEgY2FsbC4KLQotVHVlIERlYyAgOCAxMzoxMjo0NCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UdWUgRGVjICA4IDEwOjUwOjQ2IDE5OTggIERhdmlkIFRheWxvciAgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPgotCi0JVGhlIGZvbGxvd2luZyBjaGFuZ2VzIHdlcmUgbWFkZSBieQotCUVsZW5hIFphbm5vbmkgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPiwKLQlEYXZpZCBUYXlsb3IgPHRheWxvckB0ZXhhcy5jeWdudXMuY29tPiwgYW5kCi0JRWRpdGggRXBzdGVpbiA8ZWVwc3RlaW5Ac29waGlhLmN5Z251cy5jb20+IGFzIHBhcnQgb2YgYSBwcm9qZWN0IHRvCi0JbWVyZ2UgaW4gY2hhbmdlcyBieSBIUDsgSFAgZGlkIG5vdCBjcmVhdGUgQ2hhbmdlTG9nIGVudHJpZXMuCi0KLQkqIGRpcy1idWYuYyAoZ2VuZXJpY19zdHJjYXRfYWRkcmVzcyk6IG5ldyBmdW5jdGlvbi4KLQotCSogaHBwYS1kaXMuYzogQ2hhbmdlcyB0byBpbXByb3ZlIGhwcGEgZGlzYXNzZW1ibHkuCi0JICBDaGFuZ2VkIGZvcm1hdHRpbmcgaW4gOiByZWdfbmFtZXMsIGZwX3JlZ19uYW1lcyxjb250cm9sX3JlZywgCi0JICBOZXcgdmFyaWFibGVzIDogc2lnbl9leHRlbnNpb25fbmFtZXMsIGRlcG9zaXRfbmFtZXMsIGNvbnZlcnNpb25fbmFtZXMKLQkgICAgZmxvYXRfdGVzdF9uYW1lcywgY29tcGFyZV9jb25kX25hbWVzX2RvdWJsZSwgYWRkX2NvbmRfbmFtZXNfZG91YmxlLAotCSAgICBsb2dpY2FsX2NvbmRfbmFtZXNfZG91YmxlLCB1bml0X2NvbmRfbmFtZXNfZG91YmxlLCAKLQkgICAgYnJhbmNoX3B1c2hfcG9wX25hbWVzLCBzYXR1cmF0aW9uX25hbWVzLCBzaGlmdF9uYW1lcywgbWl4X25hbWVzLAotCSAgTmV3IE1hY3JvcyA6ICAgR0VUX0NPTVBMX08sIEdFVF9QVVNIX1BPUCxNRVJHRURfUkVHIAotCSAgTW92ZSBzb21lIGRlZmluaXRpb25zIHRvIGxpYmhwcGEuaDogR0VUX0ZJRUxELCBHRVRfQklUCi0JICAoZnB1dF9jb25zdCk6IHJlbmFtZWQgYXMgZnB1dF9oZXhfY29uc3QKLQkgIChwcmludF9pbnNuX2hwcGEpOgotCSAgIC0gdXNlIHRoZSBtYWNyb3MgZnB1dHNfZmlsdGVyZWQgYW5kCi0JICAgICBmcHV0X2RlY2ltYWxfY29uc3Qgd2hlbmV2ZXIgcG9zc2libGU7IGNhbGxzIHRvIHNpZ25fZXh0ZW5kIHJlcXVpcmUKLQkgICAgIDIgcGFyYW1zIC0tIGFkZCBhIG1pc3Npbmcgc2Vjb25kIHBhcmFtIG9mIDAuCi0JICAgLSBTb21lIG5ldyBjb2RlIGlmZGVmZWQgZm9yIExPQ0FMX09OTFksIGFsbCByZWxhdGVkIHRvIGZpZ3VyaW5nIG91dAotCSAgICAgYXJjaGl0ZWN0dXJlIHZlcnNpb24gbnVtYmVyIG9mIGN1cnJlbnQgbWFjaGluZS4gSFAgZm9sa3MgYXJlCi0JICAgICB0cnlpbmcgdG8gaGFuZGxlIHNpdHVhdGlvbiB3aGVyZSB0aGUgdGFyZ2V0IHByb2dyYW0gd2FzIGNvbXBpbGVkCi0JICAgICBmb3IgUEEgMS54ICgzMi1iaXQpLCBidXQgaXMgcnVubmluZyBvbiBhIFBBIDIuMCBtYWNoaW5lIGFuZCAKLQkgICAgIHZpc2EgdmVyc2EuCi0JICAgLSBhZGRlZCBuZXcgY2FzZXMgOiAnZycsICdCJywgJ20nCi0JICAgLSBhZGRlZCBjYXNlcyBzcGVjaWZpY2FsbHkgZm9yIFBBIDIuMAotCSAgIC0gY2hhbmdlZCB0aGUgZm9sbG93aW5nIGNhc2VzIDogJyInLCAnbicsICdOJywgJ3AnLCAnWicsIAotCSAgIC0gY2FsbHMgdG8gZnB1dF9jb25zdCBiZWNvbWUgY2FsbHMgdG8gZnB1dF9oZXhfY29uc3QKLQotMTk5OC0xMi0wNyAgSmFtZXMgRSBXaWxzb24gIDx3aWxzb25Ad2lsc29uLXBjLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChDRklMRVMpOiBBZGQgaTk2MGMtYXNtLCBpOTYwYy1kaXMuYywgaTk2MGMtb3BjLmMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZCBpOTYwYy1hc20ubG8sIGk5NjBjLWRpcy5sbywgaTk2MC1vcGMubG8uCi0JKGk5NjAtYXNtLmxvLCBpOTYwYy1kaXMubG8sIGk5NjBjLW9wYy5sbyk6IE5ldyBNYWtlZmlsZSBydWxlcy4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCSogY29uZmlndXJlLmluIChiZmRfaTk2MF9hcmNoKTogQWRkIGk5NjBjLW9wYy5sbywgaTk2MC1hc20ubywKLQlpOTYwLWRpcy5jIHRvIHRhLgotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogUmVuYW1lIHRvIHByaW50X2luc25faTk2MF9vcmlnLgotCSogaTk2MGMtYXNtLmMsIGk5NjBjLWRpcy5jLCBpOTYwYy1vcGMuYywgaTk2MGMtb3BjLmg6IE5ldyBmaWxlcy4KLQkKLU1vbiBEZWMgIDcgMTQ6MzM6NDQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLWFzbS5jLGZyMzAtZGlzLmMsZnIzMC1vcGMuYyxmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQotU3VuIERlYyAgNiAxNDowNjo0OCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogQWRkIGRtZmMyIGFuZCBkbXRjMi4KLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wY29kZXMpOiBBZGQgUG93ZXJQQzQwMyBHQ1tYXSBpbnN0cnVjdGlvbnMuCi0JRnJvbSBTYWl0b2ggTWFzYW5vYnUgPG1zYWl0b2hAc3BhLmlzLnVlYy5hYy5qcD4uCi0KLUZyaSBEZWMgIDQgMTc6NDU6NTEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIERlYyAgNCAxNzowODowOCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi1UaHUgRGVjICAzIDE0OjI2OjIwIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0KLVRodSBEZWMgIDMgMDA6MDk6MTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVnZW5lcmF0ZS4KLQotMTk5OC0xMS0zMCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYXNleS5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWRpcy5jIChoYXNoX2luc25fYXJyYXkpOiBDR0VOX0lOU05fVkFMVUUgLT4KLQlDR0VOX0lOU05fQkFTRV9WQUxVRS4KLQkqIG0zMnItb3BjLmMsbTMyci1vcGMuaCxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0JKiBmcjMwLW9wYy5jLGZyMzAtb3BjLmgsZnIzMC1hc20uYyxmcjMwLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1UaHUgTm92IDI2IDExOjI2OjMyIDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDI0IDExOjIwOjU0IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAyMyAxODoyODo0OCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIGZyMzAtYXNtLmMsZnIzMC1kaXMuYyxmcjMwLW9wYy5jLGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTExLTIwICBEb3VnIEV2YW5zICA8ZGV2YW5zQHRvYm9yLnRvLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCi1UaHUgTm92IDE5IDE2OjAyOjQ2IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogZnIzMC1vcGMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLW9wYy5oOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtZGlzLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1hc20uYzogUmVnZW5lcmF0ZWQuCi0KLVRodSBOb3YgMTkgMDc6NTQ6MTUgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKHN5bmMucCxzeW5jLmwpOiBTd2FwIGluc24gdmFsdWVzLgotCi0xOTk4LTExLTE5ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHRvYm9yLnRvLmN5Z251cy5jb20+Ci0KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVdlZCBOb3YgMTggMjE6MzY6MzcgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCi0xOTk4LTExLTE4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhc2V5LmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jOiBSZWJ1aWxkLgotCSogZnIzMC1hc20uYyxmcjMwLWRpcy5jLGZyMzAtb3BjLmM6IFJlYnVpbGQuCi0KLVdlZCBOb3YgMTggMTE6MzA6MDQgMTk5OCAgRGF2ZSBCcm9sbGV5ICA8YnJvbGxleUBjeWdudXMuY29tPgotCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQotTW9uIE5vdiAxNiAxOToyMTo0OCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0JCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmg6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1kaXMuYzogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWFzbS5jOiBSZWdlbmVyYXRlZC4KLQotVGh1IE5vdiAxMiAxOToyNDoxOCAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL29wY29kZXMucG90OiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtb3BjLmM6IFJlZ2VuZXJhdGVkLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZWQuCi0JKiBmcjMwLWRpcy5jOiBSZWdlbmVyYXRlZC4KLQkqIGZyMzAtYXNtLmM6IFJlZ2VuZXJhdGVkLgotCi1UdWUgTm92IDEwIDE1OjI2OjI3IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEFkZCBzdXBwb3J0IGZvciBGUjMwIHRhcmdldC4KLQkKLVR1ZSBOb3YgMTAgMTE6MDA6MDQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlYnVpbGQuCi0JKiBmcjMwLWRpcy5jLGZyMzAtb3BjLmMsZnIzMC1vcGMuaDogUmVidWlsZC4KLQotTW9uIE5vdiAgOSAxODoyMjo1NSAxOTk4ICBEYXZlIEJyb2xsZXkgIDxicm9sbGV5QGN5Z251cy5jb20+Ci0KLQkqIHBvL29wY29kZXMucG90OiBSZWdlbmVyYXRlLgotCSogcG8vUE9URklMRVMuaW46IFJlZ2VuZXJhdGUuCi0JKiBmcjMwLW9wYy5jOiBSZWdlbmVyYXRlLgotCSogZnIzMC1vcGMuaDogUmVnZW5lcmF0ZS4KLQotRnJpIE5vdiAgNiAxNzoyMTozOCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jOiBSZWdlbmVyYXRlLgotCi1XZWQgTm92ICA0IDE4OjQ2OjQ3IDE5OTggIERhdmUgQnJvbGxleSAgPGJyb2xsZXlAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBBZGRlZCBjYXNlIGZvciBiZmRfZnIzMF9hcmNoLgotCSogTWFrZWZpbGUuYW0gKENGSUxFUyk6IEFkZGVkIGZyMzAtYXNtLmMsIGZyMzAtZGlzLmMsIGZyMzAtb3BjLmMuCi0JKEFMTF9NQUNISU5FUyk6IEFkZGVkIGZyMzAtYXNtLmxvLCBmcjMwLWRpcy5sbywgZnIzMC1vcGMubG8uCi0JKENMRUFORklMRVMpOiBBZGRlZCBzdGFtcC1mcjMwLgotCShGUjMwX0RFUFMpOiBBZGRlZC4KLQkqIGZyMzAtYXNtLmM6IE5ldyBmaWxlLgotCSogZnIzMC1kaXMuYzogTmV3IGZpbGUuCi0JKiBmcjMwLW9wYy5jOiBOZXcgZmlsZS4KLQkqIGZyMzAtb3BjLmg6IE5ldyBmaWxlLgotCSogcG8vUE9URklMRVMuaW46IFJlZ2VuZXJhdGVkCi0JKiBwby9vcGNvZGVzLnBvdDogUmVnZW5lcmF0ZWQKLQotTW9uIE5vdiAgMiAxNTowNTozMyAxOTk4ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0gICAgICAgICogY29uZmlndXJlLmluOiBkZXRlY3QgY3lnd2luKiBpbnN0ZWFkIG9mIGN5Z3dpbjMyKgotICAgICAgICAqIGNvbmZpZ3VyZTogcmVnZW5lcmF0ZQotCi1UdWUgT2N0IDI3IDA4OjU4OjM3IDE5OTggIEdhdmluIFJvbWlnLUtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChJU19NKTogQWRkZWQuCi0KLU1vbiBPY3QgMTkgMTM6MDM6MTkgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmMsbTMyci1vcGMuaCxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBPY3QgIDkgMTQ6MDE6NTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotU3VuIE9jdCAgNCAyMTowMTo0NCAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKE9QXzNETm93U3VmZml4KTogTmV3IHN0YXRpYyBmdW5jdGlvbi4KLQkoT1BTVUYpOiBEZWZpbmUuCi0JKEdSUDE0KTogRGVmaW5lLgotCShkaXMzODZfdHdvYnl0ZSk6IEFkZCBHUlAxNCwgZmVtbXMsIGFuZCAzRE5vdyBlbnRyaWVzLgotCSh0d29ieXRlX2hhc19tb2RybSk6IFNldCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gR1JQMTQsIDNETm93LgotCShpbnNuX2NvZGVwKTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHJpbnRfaW5zbl94ODYpOiBJbml0IGluc25fY29kZXAgYWZ0ZXIgcHJlZml4ZXMuCi0JKGdycHMpOiBBZGQgR1JQMTQgZW50cmllcyBmb3IgcHJlZmV0Y2gsIHByZWZldGNody4KLQkoT1BfUkVHKTogUmVmb3JtYXQuCi0KLQlGcm9tIEplZmYgQiBFcGxlciA8amVwbGVyQHVzZ3MuZ292PgotCSogaTM4Ni1kaXMuYyAoU3VmZml4M0ROb3cpOiBOZXcgdGFibGUuCi0KLVdlZCBTZXAgMzAgMTA6MTc6NTAgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYzogVHJlYXQgVFJBUCBhcyBpZiBpdCB3ZXJlIGEgYnJhbmNoIHR5cGUgaW5zdHJ1Y3Rpb24uCi0KLU1vbiBTZXAgMjggMTQ6MzU6NDMgMTk5OCAgTWFydGluIE0uIEh1bnQgIDxodW50QGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBJZiBudW0gaXMgbm9uemVybywgdGhlbgotCWFkZCBPUEVSQU5EX0FDQzEsIG5vdCBPUEVSQU5EX0FDQzAuCi0KLVRodSBTZXAgMjQgMDk6MjA6MDMgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogQWRkIEZMQUdfSlNSIGF0dHJpYnV0ZSB0byBEQlQsIFJFSVQsIFJURCwgYW5kIFRSQVAKLQlpbnNucy4gCi0KLVR1ZSBTZXAgMjIgMTc6NTU6MTQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYzogQWRkIHVzZSBvZiBFSVRIRVJfQlVUX1BSRUZFUl9NVSBleGVjdXRpb24gdW5pdAotCWNsYXNzLiAKLQotVHVlIFNlcCAxNSAxNToxNDo0NSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmM6IEFkZCBiYnBjLGJicHN3IHN1cHBvcnQuCi0KLTE5OTgtMDktMDkgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCBzdXBwb3J0IGZvciBQb3dlclBDIDc1MCBtb3ZlCi0JdG8vZnJvbSBTUFJzLgotCi1GcmkgU2VwICA0IDE5OjQyOjU5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogRGV0ZWN0IFRodW1iIHN5bWJvbHMgaW4gZWxmCi0Jb2JqZWN0IGZpbGVzLgotCShwcmludF9pbnNuX2xpdHRsZV9hcm0pOiBEZXRlY3QgVGh1bWIgc3ltYm9scyBpbiBlbGYgb2JqZWN0Ci0JZmlsZXMuIAotCi1TYXQgQXVnIDI5IDIyOjI0OjA5IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogVXNlIHRoZSBtYWNoaW5lIHR5cGUgdG8KLQlkZWNpZGUgd2hpY2ggUEFMY29kZSBzZXQgdG8gaW5jbHVkZS4KLQotU3VuIEF1ZyAyMyAwMjoxNjoxOCAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoRkJSWCk6IEZpeCB0eXBvIGluICIsYSxwbiAlZmNjMyIgY2FzZS4KLQotRnJpIEF1ZyAyMSAxNjowNzo1MiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChkMzB2X29wY29kZV90YWJsZSk6IEFkZCBGTEFHX01VTDMyIHRvIE1BQywgTUFDUywKLQlNU1VCIGFuZCBNU1VCUyBpbnN0cnVjdGlvbnMuCi0KLVRodSBBdWcgMTMgMTY6MjM6MDQgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBPbWl0IHBhcmVucyBhcm91bmQgYWRkaXRpb25zIGluCi0Jb3BlcmFuZCBuYW1lIG1hY3Jvcy4KLQotV2VkIEF1ZyAxMiAxNDowMDozOCAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tIFBldGVyIEplcmVteSA8cGV0ZXIuamVyZW15QGF1c3MyLmFsY2F0ZWwuY29tLmF1PjoKLQkqIG02OGstb3BjLmM6IENvcnJlY3QgbXVsc2wgYW5kIG11bHVsIHRvIHVzZSBxIHJhdGhlciB0aGFuIEQsIGEsCi0JKywgLSwgYW5kIGQgZm9yIENvbGRGaXJlLgotCi0JRnJvbSBQZXRlciBUaGllbWFubiA8dGhpZW1hbm5AaW5mb3JtYXRpay51bmktdHVlYmluZ2VuLmRlPjoKLQkqIHBwYy1vcGMuYyAoaW5zZXJ0X21iZSk6IEhhbmRsZSB3cmFwcGluZyBiaXRtYXNrcy4KLQkoZXh0cmFjdF9tYmUpOiBMaWtld2lzZS4KLQotV2VkIEF1ZyAxMiAxMToxMTozNCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYzogRml4IHR5cG8gaW4gdWRmMjAgLi4gdWRmMjUgaW5zdHJ1Y3Rpb24gb3Bjb2Rlcy4KLQotCSogbTEwMzAwLW9wYy5jOiBGaXJzdCBjdXQgYXQgVURGIGluc3RydWN0aW9ucy4KLQotTW9uIEF1ZyAxMCAxNDowODoyMiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlIChyZW1vdmUgc2VtYW50aWMgZGVzY3JpcHRpb25zKS4KLQotTW9uIEF1ZyAxMCAxMjo1MToxMiAxOTk4ICBDYXRoZXJpbmUgTW9vcmUgIDxjbG1AY3lnbnVzLmNvbT4KLQotICAgICAgICAqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogIEZpeCBpbmRlbnRhdGlvbi4KLSAgICAgICAgKHByaW50X2luc25fbGl0dGxlX2FybSk6IExpa2V3aXNlLgotCi1TdW4gQXVnICA5IDIwOjE3OjI4IDE5OTggIENhdGhlcmluZSBNb29yZSAgPGNsbUBjeWdudXMuY29tPgotCi0gICAgICAgICogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0pOiAgQ2hlY2sgZm9yIHRodW1iIHN5bWJvbAotICAgICAgICBhdHRyaWJ1dGVzLgotICAgICAgICAocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogTGlrZXdpc2UuCi0KLU1vbiBBdWcgIDMgMTI6NDM6MTYgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQlNb3ZlIGFsbCBnbG9iYWwgc3RhdGUgZGF0YSBpbnRvIG9wY29kZSB0YWJsZSBzdHJ1Y3QsIGFuZCB0cmVhdAotCW9wY29kZSB0YWJsZSBhcyBzb21ldGhpbmcgdGhhdCBpcyAib3BlbmVkL2Nsb3NlZCIuCi0JKiBjZ2VuLWFzbS5jIChhbGwgZm5zKTogTmV3IGZpcnN0IGFyZyBvZiBvcGNvZGUgdGFibGUgZGVzY3JpcHRvci4KLQkoY2dlbl9hc21faW5pdCk6IERlbGV0ZS4KLQkoY2dlbl9zZXRfcGFyc2Vfb3BlcmFuZF9mbik6IE5ldyBmdW5jdGlvbi4KLQkqIGNnZW4tZGlzLmMgKGFsbCBmbnMpOiBOZXcgZmlyc3QgYXJnIG9mIG9wY29kZSB0YWJsZSBkZXNjcmlwdG9yLgotCShjZ2VuX2Rpc19pbml0KTogRGVsZXRlLgotCSogY2dlbi1vcGMuYyAoYWxsIGZucyk6IE5ldyBmaXJzdCBhcmcgb2Ygb3Bjb2RlIHRhYmxlIGRlc2NyaXB0b3IuCi0JKGNnZW5fY3VycmVudF97b3Bjb2RlX3RhYmxlX21hY2gsZW5kaWFufSk6IERlbGV0ZS4KLQkqIG0zMnItYXNtLmMsbTMyci1kaXMuYyxtMzJyLW9wYy5jLG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBKdWwgMzAgMjE6NDE6MTAgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBBZGQgbmV3ICJMS1IiIGZsYWcgdG8gc29tZQotCWluc3RydWN0aW9ucy4KLQotVHVlIEp1bCAyOCAxMTowMDowOSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYzogQWRkIGVudHJpZXMgZm9yICJub19tYXRjaF9vcGVyYW5kcyIgZmllbGQgaW4KLQl0aGUgb3Bjb2RlIHRhYmxlLgotCi1GcmkgSnVsIDI0IDExOjQxOjM3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItYXNtLmMsbTMyci1vcGMuYzogUmVnZW5lcmF0ZSAoLVdhbGwgY2xlYW51cHMpLgotCi1UdWUgSnVsIDIxIDEzOjQxOjA3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oLG0zMnItb3BjLmMsbTMyci1hc20uYyxtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1Nb24gSnVsIDEzIDE0OjUzOjU5IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoY2twcmVmaXgpOiBIYW5kbGUgZndhaXQgc3BlY2lhbGx5IG9ubHkgd2hlbiBpdCBpc24ndAotCXRoZSBmaXJzdCBwcmVmaXguCi0JKGRvZmxvYXQpOiBDb3JyZWN0IHRlc3QgZm9yIGZuc3Rzdy4gIFByaW50IGBmbnN0c3cgJWF4JyByYXRoZXIKLQl0aGFuIGBmbnN0c3cgJWVheCcuCi0JKE9QX0opOiBSZW1vdmUgdW5uZWNlc3Nhcnkgc3VidHJhY3Rpb24gd2hlbiAxNi1iaXQgZGlzcGxhY2VtZW50Ci0Jd2lsbCBiZSBtYXNrZWQgbGF0ZXIuCi0KLVRodSBKdWwgIDIgMTc6MTE6MjcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmggKENHRU5fTUlOX0lOU05fU0laRSk6IE5ldyAjZGVmaW5lLgotCi1XZWQgSnVsICAxIDE2OjExOjE2IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYyxtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1GcmkgSnVuIDI2IDExOjA4OjU1IDE5OTggIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbTEwMzAwLWRpcy5jOiBPbmx5IHJlY29nbml6ZSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgY3VycmVudGx5Ci0Jc2VsZWN0ZWQgbWFjaGluZS4KLQkqIG0xMDMwMC1vcGMuYzogQWRkIGZpZWxkIGluZGljYXRpbmcgdGhlIHBhcnRpY3VsYXIgdmFyaWFudCBvZgotCXRoZSBtbjEwMzAwIGVhY2ggaW5zdHJ1Y3Rpb24gaXMgYXZhaWxhYmxlIG9uLgotCi1GcmkgSnVuIDI2IDEyOjA0OjIxIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBGb3IgYmZkX3ZheF9hcmNoLCBidWlsZCB2YXgtZGlzLmxvLgotCSogTWFrZWZpbGUuYW06IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotIAkoQ0ZJTEVTKTogQWRkIHZheC1kaXMuYy4KLQkoQUxMX01BQ0hJTkVTKTogQWRkIHZheC1kaXMubG8uCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggY3VycmVudCBsaWJ0b29sLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEp1biAyNiAxMjowMzoyMCAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogdmF4LWRpcy5jOiBOZXcgZmlsZSwgZnJvbSB3b3JrIGJ5IFBhdWxpbmUgTWlkZGVsaW5rCi0JPG1pZGRlbGluQHBvbHl3YXJlLmlhZi5ubD4uCi0JKiBkaXNhc3NlbWJsZS5jIChBUkNIX3ZheCk6IERlZmluZSBpZiBBUkNIX2FsbC4KLQkoZGlzYXNzZW1ibGVyKTogQWRkIGNhc2UgZm9yIEFSQ0hfdmF4LgotCSogbWFrZWZpbGUudm1zOiBTdXBwb3J0IGNvbXBpbGF0aW9uIG9uIHZtcy92YXguCi0KLVR1ZSBKdW4gMjMgMTk6NDI6MTggMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IEZpeCB2YXJpb3VzIG5vbi1wb3J0YWJpbGl0aWVzCi0JcmVsYXRlZCB0byBzaWduIGV4dGVuc2lvbiBhbmQgdGhlIHNpemUgb2YgaW50cy4KLQotVHVlIEp1biAyMyAxMDo1OToyNiAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG0xMDMwMC1vcGMuYzogU3VwcG9ydCBvbmUgb3BlcmFuZCAiYXNyIiwgImxzciIgYW5kICJhc2wiCi0JaW5zdHJ1Y3Rpb25zLiAgU3VwcG9ydCAoc3ApIGFkZHJlc3NpbmcgbW9kZSBieSBleHBhbmRpbmcgaXQgaW50bwotCSgwLHNwKS4KLQotU2F0IEp1biAyMCAxNDo0NjoyMCAxOTk4ICBGcmFuayBDaC4gRWlnbGVyICA8ZmNoZUBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogRml4IGFyZ3VtZW50IGludGVyY2hhbmdlIHR5cG8uCi0KLUZyaSBKdW4gMTkgMDk6MTY6NDIgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBtMTAyMDAtZGlzLmMgKHByaW50X2luc25fbW4xMDIwMCk6IFJlY29nbml6ZSAnYnJlYWsnIHBzZXVkby1vcC4KLQotMTk5OC0wNi0xOCAgVWxyaWNoIERyZXBwZXIgIDxkcmVwcGVyQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IEFkZCBzdXBwb3J0IGZvciBmeHNhdmUsIGZ4cnN0b3IsIHN5c2VudGVyIGFuZAotCXN5c2V4aXQuCi0KLVRodSBKdW4gMTggMTA6MjI6MjQgMTk5OCAgSm9obiBNZXR6bGVyICA8am1ldHpsZXJAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9saXR0bGVfbWlwcyk6IFByZXZpb3VzbHksIGluc3RydWN0aW9uCi0gCXByaW50aW5nIHJlZmVyZW5jZXMgdGhlIHN5bWJvbCB0YWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKLSAJaW5zdHJ1Y3Rpb24gcmVzaWRlcyBpbiBhIGJsb2NrIHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIG9yIG1pcHMxNgotIAlpbnN0cnVjdGlvbnMuIEhvd2V2ZXIsIHdoZW4gdGhlIGRpc2Fzc2VtYmxlciBnZXRzIHVzZWQgaW4gb3RoZXIKLSAJZW52aXJvbm1lbnRzIHdoZXJlIHRoZSBzeW1ib2wgdGFibGUgaXMgbm90IHByZXNlbnQsIHdlIG5vIGxvbmdlcgotIAlyZWx5IGluIHRoZSBzeW1ib2wgdGFibGUsIHJhdGhlciwgdXNlIHRoZSBsb3cgYml0IG9mIHRoZQotIAlpbnN0cnVjdGlvbnMgYWRkcmVzcyB0byBndWVzcy4gVGhlcmUgc2hvdWxkIGJlIG5vIGNoYW5nZSBmb3IgdXNhZ2UKLSAJb2YgdGhlIGRpc2Fzc2VtYmxlciBpbiBob3N0IGJhc2VkIHByb2dyYW1zLCBnZGIsIG9iamR1bXAuCi0JKHByaW50X2luc25fYmlnX21pcHMpOiBkaXR0by4KLQkocHJpbnRfaW5zbl9taXBzKTogZGl0dG8KLQotV2VkIEp1biAxNyAyMToxOTowMSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG0xMDIwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMjAwKTogRG9uJ3QgYm9tYiBvbiB1bmtub3duIG9wY29kZXMuCi0KLVdlZCBKdW4gMTcgMTc6NDk6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IENoYW5nZSBvcGNvZGUgZm9yICJzeXNjYWxsIi4KLQotVHVlIEp1biAxNiAxMzoxMDo1MSAxOTk4ICBBbGFuIE1vZHJhICA8YWxhbkBzcHJpLmxldmVscy51bmlzYS5lZHUuYXU+Ci0KLQkqIGkzODYtZGlzLmMgKGluZGV4MTYpOiBBZGQgJyUnIHRvIHJlZ2lzdGVyIG5hbWVzLiAgVXNlICcsJwotCWluc3RlYWQgb2YgJysnLgotCi1TYXQgSnVuIDEzIDExOjMzOjU1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYzogRG9uJ3QgcHJpbnQgb3Bjb2RlIHN1ZmZpeCB3aGVuIHdlIGNhbiBmaWd1cmUgb3V0IHRoZQotCXNpemUgKGFuZCBnYXMgY2FuISkgYnkgcmVnaXN0ZXIgb3BlcmFuZHMsIG9yIGZyb20gdGhlIGRlZmF1bHQKLQlzaXplLgotCShwdXRvcCk6IEhhbmRsZSAnQScsICdCJywgJ0wnLCAnUCcsICdRJywgJ1InIG1hY3Jvcy4gIFJlbmFtZSAnQycKLQltYWNybyB0byAnRScuCi0JKGRpczM4NiwgZGlzMzg2X3R3b2J5dGUsIGdycHMpOiBVc2UgbmV3IHN1ZmZpeCBtYWNyb3MuCi0JKGRpczM4Nik6IENvcnJlY3QgaW11bCBJYiB0byBpbXVsIHNJYi4gIENoYW5nZSBqbmwgdG8gamdlIHRvIGJlCi0JY29uc2lzdGVudC4gIEFkZCBzdWZmaXggZm9yIGNhbGwsIGptcCwgbGNhbGwsIGxqbXAsIGlyZXQuICBSZXZlcnNlCi0Jb3JkZXIgb2YgY21wcyBvcGVyYW5kcyB0byBhZ3JlZSB3aXRoIEludGVsIGRvY3MuICBDb3JyZWN0IG9wZXJhbmQKLQlvZiBhYWQgYW5kIGFhbSAoSWIgLT4gc0liKS4gIENoYW5nZSB1ZDJiIGZyb20gMGZiOCB0byAwZmI5IHRvCi0JYWdyZWUgd2l0aCBJbnRlbCBkb2NzLgotCShwcmludF9pbnNuX3g4Nik6IFByaW50IG9ycGhhbiBmd2FpdCBiZWZvcmUgb3RoZXIgcHJlZml4ZXMuCi0JUmV0dXJuIGNvcnJlY3QgYnl0ZSBjb3VudCBmb3Igb3JwaGFuIGZ3YWl0IHdpdGggcHJlZml4ZXMuICBEb24ndAotCXByaW50IGBib3VuZCcgb3BlcmFuZHMgaW4gcmV2ZXJzZSBvcmRlci4KLQkoY2twcmVmaXgpOiBTdG9wIGFjY3VtdWxhdGluZyBwcmVmaXhlcyBpZiB3ZSBnZXQgZndhaXQuCi0JKE9QX0RJUik6IFByaW50IGAkJyBiZWZvcmUgQXAgb3BlcmFuZHMgb2YgbGptcCwgbGNhbGwuCi0KLUZyaSBKdW4gMTIgMTM6NDA6MzggMTk5OCAgVG9tIFRyb21leSAgPHRyb21leUBjeWdudXMuY29tPgotCi0JKiBwby9NYWtlLWluIChhbGwteWVzKTogSWYgbWFpbnRhaW5lciBtb2RlLCBkZXBlbmQgb24gLnBvdCBmaWxlLgotCSgkKFBBQ0tBR0UpLnBvdCk6IFVuY29uZGl0aW9uYWxseSBkZXBlbmQgb24gUE9URklMRVMuCi0KLUZyaSBKdW4gMTIgMTE6MDQ6MDYgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQlGaXggcHJvYmxlbXMgd2hlbiBiZmRfdm1hIGlzIHdpZGVyIHRoYW4gbG9uZy4KLQkqIGkzODYtZGlzLmM6IE1ha2Ugb3BfYWRkcmVzcyBhbmQgc3RhcnRfcGMgdW5zaWduZWQuCi0JKHNldF9vcCk6IE1ha2UgcGFyYW1ldGVyIHVuc2lnbmVkLgotCShwcmludF9pbnNuX3g4Nik6IENhc3QgdG8gYmZkX3ZtYSB3aGVuIHBhc3NpbmcgYSB2YWx1ZSB0bwotCXByaW50X2FkZHJlc3NfZnVuYy4KLQkqIG5zMzJrLWRpcy5jIChDT1JFX0FERFIpOiBEb24ndCBkZWZpbmUuCi0gCShwcmludF9pbnNuX25zMzJrKTogQ2hhbmdlIHR5cGUgb2YgYWRkciB0byBiZmRfdm1hLiAgVXNlCi0JYmZkX3NjYW5fdm1hIHRvIHJlYWQgYmFjayBhZGRyZXNzLgotCShwcmludF9pbnNuX2FyZyk6IENoYW5nZSB0eXBlIG9mIGFkZHIgdG8gYmZkX3ZtYS4gIFVzZSBzcHJpbnRmX3ZtYQotCXRvIGZvcm1hdCBpdC4KLQkqIG02OGstZGlzLmMgKENPRVJDRTMyKTogQ2FzdCB0byBiZmRfc2lnbmVkX3ZtYSB0byBhdm9pZCBvdmVyZmxvdy4KLQkoTkVYVFVMT05HKTogTmV3IGRlZmluaXRpb24uCi0JKHByaW50X2luc25fbTY4ayk6IEF2b2lkIG92ZXJmbG93IHdoZW4gY29tcHV0aW5nIHRoaXJkIGFyZ3VtZW50IG9mCi0JcHJpbnRfaW5zbl9hcmcuCi0JKHByaW50X2luc25fYXJnKTogVXNlIE5FWFRVTE9ORyB0byBmZXRjaCAzMiBiaXQgYWRkcmVzcyB2YWx1ZXMuCi0JVXNlIGRpc3AgaW5zdGVhZCBvZiB2YWwgdG8gc3RvcmUgb2Zmc2V0IHZhbHVlcy4KLQkocHJpbnRfaW5kZXhlZCk6IFVzZSBiYXNlX2Rpc3AgaW5zdGVhZCBvZiB3b3JkIHRvIHN0b3JlIGJhc2UKLQlkaXNwbGFjZW1lbnQsIHRvIGF2b2lkIG92ZXJmbG93LgotCSogbTEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IENhc3QgdmFsdWUgdG8gbG9uZyB3aGVuIGNvbXB1dGluZwotCXBjLXJlbGF0aXZlIGFkZHJlc3MsIHRvIGdldCBjb3JyZWN0IHNpZ24gZXh0ZW5zaW9uLgotCi1XZWQgSnVuIDEwIDE1OjU4OjM3IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBKdW4gIDkgMTQ6Mjc6NTcgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLW9wYy5oICh0aHVtYl9vcGNvZGVzKTogRGlzcGxheSAnYWRkIHJ4LCByWSwgIzAnIGluc25zIGFzCi0JJ21vdiByWCwgclknLiAgUGF0Y2ggY291cnRlc3kgb2YgVG9ueSBUaG9tcHNvbiA8VG9ueS5UaG9tcHNvbkBhcm0uY29tPgotCi1Nb24gSnVuICA4IDE4OjE3OjIxIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IFJlbW92ZSBGQUxHX01VTDMyIGF0dHJpYnl0ZSBmcm9tIE1VTFgySCBpbnNuLgotCi1GcmkgSnVuICA1IDIzOjQ3OjU1IDE5OTggIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYzogIENvbWJpbmUgYWZsYWcgYW5kIGRmbGFnIGludG8gc2l6ZWZsYWcuICBDaGFuZ2UgT1BfKgotCWZ1bmN0aW9ucyB0byB2b2lkLgotCShPUF9EU3JlZyk6IFJlbmFtZSBmcm9tIE9QX0RTU0kuCi0JKE9QX0VTcmVnKTogUmVuYW1lIGZyb20gT1BfRVNESS4KLQkoWGIsIFh2LCBZYiwgWXYpOiBVc2UgaW5kZXggcmVnIGNvZGUsIG5vdCBiX21vZGUgb3Igdl9tb2RlLgotCShEU0JYKTogRGVmaW5lLgotCShhcHBlbmRfc2VnKTogUmVuYW1lIGZyb20gYXBwZW5kX3ByZWZpeC4KLQkocHRyX3JlZyk6IE5ldyBmdW5jdGlvbi4KLQkoZGlzMzg2KTogQWRkIFMgc3VmZml4IHRvIHB1c2hmLCBwb3BmLCByZXQsIGxyZXQsIGVudGVyLCBsZWF2ZS4KLQlBZGQgRFNCWCBmb3IgeGxhdC4KLQkoUFJFRklYX0FERFIpOiBSZW5hbWUgZnJvbSBQUkVGSVhfQURSLgotCShmbG9hdF9yZWcpOiBBZGQgbm9uLWJyb2tlbiBvcGNvZGVzIGZvciBwZW9wbGUgd2hvIGRvbid0IHdhbnQKLQlVTklYV0FSRV9DT01QQVQuCi0KLUZyaSBKdW4gIDUgMTk6MTU6MDQgMTk5OCAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKHRzdGIsIHRzdHcsIHRzdGwpOiBEb24ndCBhbGxvdyBwY3JlbCBvbgotCTY4MDAwLzY4MDA4LzY4MDEwLgotCi1XZWQgSnVuICAzIDE4OjU2OjIyIDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2KTogQ2hhbmdlIDB4NjAgdG8gInB1c2hhUyIsIDB4NjEgdG8gInBvcGFTIi4KLQotVHVlIEp1biAgMiAxNTowNjo0NiAxOTk4ICBHZW9mZiBLZWF0aW5nICA8Z2VvZmZrQG96ZW1haWwuY29tLmF1PgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfbWFjcm9zKTogU3VwcG9ydCBzaGlmdHMgYW5kIHJvdGF0ZXMgb2Ygc2l6ZQotCTA7IHByb2R1Y2UgZXJyb3IgbWVzc2FnZSBmb3Igc2hpZnRzIG9mIHNpemUgMzIgKG9yIDY0IGZvciA2NC1iaXQKLQlzaGlmdHMpLCBiZWNhdXNlIHRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgdGhlbS4KLQotV2VkIE1heSAyNyAxNToyOToxMyAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jOiBBZGQgbmV3IG9wZXJhbmQ6IFJhMy4gIENoYW5nZSBTSE9SVF9CMywgU0hPUlRfQjNiLAotCUxPTkdfMiwgTE9OR18yYiBmb3JtYXRzIHRvIHVzZSB0aGlzIG5ldyBvcGVyYW5kLgotCi1UdWUgTWF5IDI2IDIwOjQ3OjQ4IDE5OTggIFN0YW4gQ294ICA8c2NveEBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoY29tcHV0ZV9hcmNoX21hc2spOiBBZGRlZCBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGVfbGUuCi0KLVR1ZSBNYXkgMjYgMjA6NDU6MzMgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IGJpZyBlbmRpYW4gaW5zdHJ1Y3Rpb24gLyBsaXR0bGUKLQllbmRpYW4gZGF0YSBzdXBwb3J0LgotCi1UdWUgTWF5IDI2IDE2OjE0OjM5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfZm9ybWF0X3RhYmxlKTogQ2hhbmdlIGRlZmluaXRpb24gb2YgU0hPUlRfQjMKLQlhbmQgU0hPUlRfQjNiIGZvcm1hdHMgdG8gdXNlIFJiIGluc3RlYWQgb2YgUmEuCi0KLQlBZGQgRkxBR19NVUwxNiB0byBNVUwyWEggb3Bjb2RlLgotCi0JQWRkIEZMQUdfQUREU1VCcHBwIHRvIFNSQyBhbmQgU0FUSHAgb3Bjb2RlcyB0byBpbXBsZW1lbnQgZXh0ZW5zaW9uCi0JdG8gZXhpc3RpbmcgMS4xLjEgcGFyYWxsZWxpc2F0aW9uIHByb2hpYml0aW9uIHByb2NlZHVyZS4KLQotRnJpIE1heSAyMiAxNjowMDowMCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLVR1ZSBNYXkgMTkgMTc6MzY6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9taXBzMTZfaW5zbl9hcmcpOiBIYW5kbGUgdHlwZSAnXScgY29ycmVjdGx5Ci0Jd2l0aCBhIHNoaWZ0IGNvdW50IG9mIDAuCi0KLUZyaSBNYXkgMTUgMTQ6NTg6MzEgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5faHdfbG9va3VwX2J5X25hbWUpOiBSZW5hbWVkIGZyb20gY2dlbl9od19sb29rdXAuCi0JKGNnZW5faHdfbG9va3VwX2J5X251bSk6IE5ldyBmdW5jdGlvbi4KLQotV2VkIE1heSAxMyAxNzowMzo1OSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jOiBSZWdlbmVyYXRlIChoYW5kbGUgdXBwZXJjYXNlIEhJR0gvU0hJR0gvTE9XL1NEQSkuCi0KLVdlZCBNYXkgMTMgMTQ6MzQ6MzEgMTk5OCAgTWFyayBBbGV4YW5kZXIgIDxtYXJrYUBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEFsd2F5cyBmZXRjaCBpbnN0cnVjdGlvbnMKLQlhcyBiaWctZW5kaWFuIG9uIFNQQVJDbGl0ZS4KLQotVHVlIE1heSAxMiAxMTo0NjozMSAxOTk4ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3Rlcik6IFJlbW92ZSBhbGlhcyBmb3IgcjAuCi0KLVN1biBNYXkgMTAgMjI6Mzc6MjIgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBwby9NYWtlLWluIChpbnN0YWxsLWluZm8pOiBOZXcgdGFyZ2V0LgotCi1UaHUgTWF5ICA3IDE3OjE1OjU5IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluIChXSU4zMkxJQkFERCk6IEFkZCAtbGludGwgb24gY3lnd2luMzIuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBNYXkgIDcgMTI6NDk6NDYgMTk5OCAgRnJhbmsgQ2guIEVpZ2xlciAgPGZjaGVAY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAodGVxLHRnZSx0Z2V1LHRsdCx0bHR1LHRuZSk6IEFkZGVkIHRocmVlLW9wZXJhbmQKLSAJdmFyaWV0eSBvZiBJU0EyIGluc3RydWN0aW9ucyB0byBzZXQgYm90dG9tIHRlbiBiaXRzIG9mIHRyYXAgY29kZS4KLQotVGh1IE1heSAgNyAxMTo1NDoyNSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmFtIChjb25maWcuc3RhdHVzKTogQWRkIGV4cGxpY2l0IHRhcmdldCBzbyB0aGF0Ci0JY29uZmlnLnN0YXR1cyBkZXBlbmRzIHVwb24gYmZkL2NvbmZpZ3VyZS5pbi4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgTWF5ICA3IDA5OjMzOjAyIDE5OTggIEZyYW5rIENoLiBFaWdsZXIgIDxmY2hlQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKGJyZWFrLCBzZGJicCk6IEFkZGVkIHR3by1vcGVyYW5kIHZhcmlldHkgb2YgSVNBMQotCWluc3RydWN0aW9ucyB0byBzZXQgYm90dG9tIHRlbiBiaXRzIG9mIGJyZWFrIGNvZGUuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEltcGxlbWVudCAncScgb3BlcmFuZCBmb3JtYXQgdXNlZAotCWZvciBhYm92ZSBvcHRpb25hbCBhcmd1bWVudC4KLQotV2VkIE1heSAgNiAxNTozMDowNiAxOTk4ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBSdW4gZGVjIGMgd2l0aCAvbm9kZWJ1Zy4KLQotTW9uIE1heSAgNCAxMDoxOTo1NyAxOTk4ICBUb20gVHJvbWV5ICA8dHJvbWV5QGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWx0LgotCSogTWFrZWZpbGUuYW06IFJlZ2VuZXJhdGVkIGRlcGVuZGVuY2llcyB3aXRoIG1rZGVwLgotCi0JKiBvcGludGwuaCAoXyk6IERlZmluZSBhcyBkZ2V0dGV4dC4KLQotVHVlIEFwciAyOCAxNDoxMjoxMiAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0zMnItYXNtLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTMyci1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtMzJyLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQotCSogYWNsb2NhbC5tNDogUmVnZW5lcmF0ZWQuCi0JKiBjb25maWd1cmU6IFJlZ2VuZXJhdGVkLgotCSogTWFrZWZpbGUuYW0gKFBPVEZJTEVTKTogUmVtb3ZlIGluY2x1c2lvbiBvZiBCRkRfSC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCSogcG8vUE9URklMRVMuaW46IFJlYnVpbHQgdXNpbmcgcnVsZSBpbiBNYWtlZmlsZS5pbi4KLQkqIHBvL29wY29kZXMucG90OiBSZWJ1aWx0IGFmdGVyIGNoYW5naW5nIFBPVEZJTEVTLmluLgotCi1UdWUgQXByIDI4IDEzOjEzOjEzIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0lTQ19QT1NJWCBuZWFyIHN0YXJ0LiAgTW92ZSBDWV9HTlVfR0VUVEVYVAotCWFmdGVyIEFDX1BST0dfQ0MuCi0JKiBhY2xvY2FsLm00LCBjb25maWd1cmU6IFJlYnVpbGQgd2l0aCBjdXJyZW50IHRvb2xzLgotCi1Nb24gQXByIDI3IDE0OjMxOjAwIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG9waW50bC5oOiBOZXcgZmlsZSAtIGNvbnRhaW5zIGludGVybmF0aW9uYWxpc2F0aW9uIG1hY3JvcyB1c2VkCi0JYnkgc291cmNlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LgotCSogcG8vOiBOZXcgc3ViZGlyZWN0b3J5IC0gY29udGFpbnMgaW50ZXJuYXRpb25hbGlzYXRpb24gZmlsZXMuCi0JKiBwby9NYWtlLWluOiBOZXcgZmlsZSAtIE1ha2VmaWxlIGNvbnN0cnVjdG9yLgotCSogcG8vUE9URklMRVMuaW46IE5ldyBmaWxlIC0gbGlzdCBvZiBmaWxlcyBpbiBvcGNvZGVzIGRpcmVjdG9yeQotCXRoYXQgc2hvdWxkIGJlIHNjYW4gZm9yIGludGVybmF0aW9uYWxpc2F0aW9uIG1hY3Jvcy4KLQkqIHBvL29wY29kZXMucG90OiBOZXcgZmlsZSAtIGxpc3Qgb2YgaW50ZXJuYXRpb25pc2F0aW9uIHN0cmluZ3MKLQlmb3VuZCBpbiBmaWxlcyBtZW50aW9uZWQgaW4gcG8vUE9URklMRVMuaW4uCi0JKiBNYWtlZmlsZS5hbTogQWRkIHJ1bGUgdG8gYnVpbGQgcG8vUE9URklMRVMuaW4uICBBZGQgU1VCRElSUwotCWVudHJ5LiAgQWRkIGludGwgZGlyZWN0b3J5IHRvIGluY2x1ZGUgcGF0aHMuCi0JKiBhY2NvbmZpZy5oOiBBZGQgRU5BQkxFX05MUywgSEFWRV9DQVRHRVRTLCBIQVZFX0dFVEVYVCwKLQlIQVZFX1NUUkNQWSwgSEFWRV9MQ19NRVNTQUdFUwotCSogY29uZmlndXJlLmluOiBBZGQgcnVsZSB0byBidWlsZCBNYWtlZmlsZSBpbiBwbyBzdWJkaXJlY3RvcnkuCi0JKiBNYWtlZmlsZS5pbjogUmVidWlsdC4KLQkqIGFjbG9jYWwubTQ6IFJlYnVpbHQuCi0JKiBjb25maWcuaW46IFJlYnVpbHQuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JKiBhbHBoYS1vcGMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBhcmMtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogYXJjLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGFybS1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBjZ2VuLWFzbS5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGQzMHYtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogZGlzLWJ1Zi5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGg4MzAwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGg4NTAwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIGkzODYtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbTEwMjAwLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG0xMDMwMC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBtNjhrLWRpcy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQkqIG04OGstZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogbWlwcy1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBuczMyay1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBvcGludGwuaDogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiBwcGMtb3BjLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogc3BhcmMtZGlzLmM6IEludGVybmF0aW9uYWxpc2VkLgotCSogdjg1MC1kaXMuYzogSW50ZXJuYXRpb25hbGlzZWQuCi0JKiB2ODUwLW9wYy5jOiBJbnRlcm5hdGlvbmFsaXNlZC4KLQotTW9uIEFwciAyNyAxMDozMzo1NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoY2dlbl9jdXJyZW50X29wY29kZV90YWJsZSk6IFJlbmFtZWQgZnJvbSAuLi5fZGF0YS4KLQkoYXNtX2hhc2hfdGFibGVfZW50cmllcyk6IE5ldyB2YXJpYWJsZS4KLQkoY2dlbl9hc21faW5pdCk6IEZyZWUgYXNtX2hhc2hfdGFibGVfZW50cmllcy4KLQkoaGFzaF9pbnNuX2FycmF5LGhhc2hfaW5zbl9saXN0KTogTmV3IGZ1bmN0aW9ucy4KLQkoYnVpbGRfYXNtX2hhc2hfdGFibGUpOiBVc2UgdGhlbS4gIEhhc2ggbWFjcm8gaW5zbnMgYXMgd2VsbC4KLQkoY2dlbl9hc21fbG9va3VwX2luc24pOiBVcGRhdGUuCi0JKiBjZ2VuX2Rpcy5jIChjZ2VuX2N1cnJlbnRfb3Bjb2RlX3RhYmxlKTogUmVuYW1lZCBmcm9tIC4uLl9kYXRhLgotCShkaXNfaGFzaF90YWJsZV9lbnRyaWVzKTogTmV3IHZhcmlhYmxlLgotCShjZ2VuX2Rpc19pbml0KTogRnJlZSBkaXNfaGFzaF90YWJsZV9lbnRyaWVzLgotCShoYXNoX2luc25fYXJyYXksaGFzaF9pbnNuX2xpc3QpOiBOZXcgZnVuY3Rpb25zLgotCShidWlsZF9kaXNfaGFzaF90YWJsZSk6IFVzZSB0aGVtLiAgSGFzaCBtYWNybyBpbnNucyBhcyB3ZWxsLgotCShjZ2VuX2Rpc19sb29rdXBfaW5zbik6IFVwZGF0ZS4KLQkqIGNnZW4tb3BjLmMgKGNnZW5fY3VycmVudF9vcGNvZGVfdGFibGUpOiBSZW5hbWVkIGZyb20gLi4uX2RhdGEuCi0JKGNnZW5fc2V0X2NwdSxjZ2VuX2h3X2xvb2t1cCxjZ2VuX2luc25fY291bnQpOiBVcGRhdGUuCi0JKGNnZW5fbWFjcm9faW5zbl9jb3VudCk6IE5ldyBmdW5jdGlvbi4KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYyxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLUZyaSBBcHIgMjQgMTY6MDc6NTcgMTk5OCAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChPUF9EU1NJKTogUHJpbnQgc2VnbWVudCBvdmVycmlkZS4KLQotTW9uIEFwciAxMyAxNjo1OTozOSAxOTk4ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogQWRkICJfYWxsIiBleHRlbnNpb24gdG8gJ0MnCi0Jb3BlcmF0b3IuCi0KLU1vbiBBcHIgMTMgMTY6NTA6MjcgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5hbSAobGlib3Bjb2Rlc19sYV9MSUJBREQpOiBBZGQgQFdJTjMyTElCQUREQC4KLQkobGlib3Bjb2Rlc19sYV9MREZMQUdTKTogQWRkIEBXSU4zMkxERkxBR1NALgotCSogY29uZmlndXJlLmluOiBEZWZpbmUgYW5kIHN1YnN0aXR1dGUgV0lOMzJMREZMQUdTIGFuZAotCVdJTjMyTElCQURELgotCSogYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotRnJpIEFwciAxMCAxODoxNDozMSAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1TdW4gQXByICA1IDE2OjA0OjM5IDE5OTggIEguSi4gTHUgIDxoamxAZ251Lm9yZz4KLQotCSogTWFrZWZpbGUuYW0gKHN0YW1wLWxpYik6IENoZWNrIHRoYXQgLmxpYnMvbGlib3Bjb2Rlcy5hIGV4aXN0cwotCWJlZm9yZSB0cnlpbmcgdG8gY29weSBpdC4KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkLgotCi1UaHUgQXByICAyIDE3OjI1OjQ5IDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmM6IFVzZSBzaWduZWQgaW1tZWRpYXRlIHZhbHVlcyBmb3IgQ01QVUkgaW5zdHJ1Y3Rpb24uCi0KLVdlZCBBcHIgIDEgMTY6MjA6MjcgMTk5OCAgSWFuIERhbGwgIDxJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1PgotCi0gICAgICAgICogbnMzMmstZGlzLmMgKGJpdF9leHRyYWN0X3NpbXBsZSk6IE5ldyBmdW5jdGlvbiB0byBleHRyYWN0IGJpdHMKLSAgICAgICAgZnJvbSBhbiBhcmJpdHJhcnkgdmFsaWQgYnVmZmVyIGluc3RlYWQgb2YgZmV0Y2hpbmcgdGhlbSBvbiBkZW1hbmQKLSAgICAgICAgdXNpbmcgZmV0Y2hfZGF0YSgpLgotICAgICAgICAoaW52YWxpZF9mbG9hdCk6IHVzZSBiaXRfZXh0cmFjdF9zaW1wbGUoKSBpbnN0ZWFkIG9mIGJpdF9leHRyYWN0KCkuCi0KLVR1ZSBNYXIgMzEgMTE6MDk6MDggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBpMzg2LWRpcy5jIChkaXMzODYpOiBDaGFuZ2UgMHg4YyBhbmQgMHg4ZSB0byBtb3ZTLCBhbmQgY2hhbmdlIEV3Ci0JdG8gRXYgZm9yIGJvdGguCi0KLU1vbiBNYXIgMzAgMTc6MzI6MDMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjkuCi0KLU1vbiBNYXIgMzAgMTU6MTg6MDAgMTk5OCAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc25fZDMwdik6IERvbid0IHVzZSB1bmluaXRpYWxpemVkICJudW0iIHdoZW4KLQlkaXNhc3NlbWJsaW5nIGxhc3QgNCBieXRlcyBvZiBhIHNlY3Rpb24uCi0KLUZyaSBNYXIgMjcgMTg6MDg6MTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRml4IHNvbWUgZ2NjIC1XYWxsIHdhcm5pbmdzOgotCSogYXJjLWRpcy5jIChwcmludF9pbnNuKTogQWRkIGNhc3RzIHRvIGF2b2lkIHdhcm5pbmdzLgotCSogY2dlbi1vcGMuYyAoY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lKTogTGlrZXdpc2UuCi0JKiBkMTB2LWRpcy5jIChkaXNfbG9uZywgZGlzXzJfc2hvcnQpOiBMaWtld2lzZS4KLQkqIG0xMDIwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBMaWtld2lzZS4KLQkqIG0xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBMaWtld2lzZS4KLQkqIG5zMzJrLWRpcy5jIChwcmludF9pbnNuX25zMzJrKTogTGlrZXdpc2UuCi0JKiBwcGMtb3BjLmMgKGluc2VydF9yYWwsIGluc2VydF9yYW0pOiBMaWtld2lzZS4KLQkqIGNnZW4tZGlzLmMgKGJ1aWxkX2Rpc19oYXNoX3RhYmxlKTogUmVtb3ZlIHVzZWQgbG9jYWwgdmFyaWFibGVzLgotCSogY2dlbi1vcGMuYyAoY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0KTogTGlrZXdpc2UuCi0JKiBkMTB2LWRpcy5jIChkaXNfbG9uZywgZGlzXzJfc2hvcnQpOiBMaWtld2lzZS4KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc25fZDMwdiwgbG9va3VwX29wY29kZSk6IExpa2V3aXNlLgotCSogbnMzMmstZGlzLmMgKGJpdF9leHRyYWN0LCBwcmludF9pbnNuX25zMzJrKTogTGlrZXdpc2UuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfb25lX2luc3RydWN0aW9uKTogTGlrZXdpc2UuCi0JKiB3NjUtZGlzLmMgKHByaW50X29wZXJhbmQpOiBMaWtld2lzZS4KLQkqIHo4ay1kaXMuYyAoZmV0Y2hfZGF0YSk6IExpa2V3aXNlLgotCSogYTI5ay1kaXMuYzogQWRkIHJldHVybiB0eXBlIGZvciBmaW5kX2J5dGVfZnVuY190eXBlLgotCSogYXJjLW9wYy5jOiBJbmNsdWRlIDxzdGRpby5oPi4gIFJlbW92ZSBkZWNsYXJhdGlvbnMgb2YKLQlpbnNlcnRfbXVsdHNoaWZ0IGFuZCBleHRyYWN0X211bHRzaGlmdC4KLQkqIGQzMHYtZGlzLmMgKGxvb2t1cF9vcGNvZGUpOiBQYXJlbnRoZXNpemUgYXNzaWdubWVudHMgaW4KLQljb25kaXRpb25hbHMuCi0JKGV4dHJhY3RfdmFsdWUpOiBGdWxseSBwYXJlbnRoZXNpemUgZXhwcmVzc2lvbi4KLQkqIGg4NTAwLWRpcy5jIChwcmludF9pbnNuX2g4NTAwKTogSW5pdGlhbGl6ZSBsb2NhbCB2YXJpYWJsZXMuCi0JKiBoODUwMC1vcGMuaCAoaDg1MDBfdGFibGUpOiBGdWxseSBicmFja2V0IGluaXRpYWxpemVyLgotCSogdzY1LW9wYy5oIChvcHRhYmxlKTogTGlrZXdpc2UuCi0JKiBpMzg2LWRpcy5jIChwcmludF9pbnNuX3g4Nik6IERlY2xhcmUgYWZsYWcgYW5kIGZsYWcgcGFyYW1ldGVycy4KLQkqIGkzODYtZGlzLmMgKE9QX0UpOiBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcy4KLQkqIG0xMDIwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMjAwKTogTGlrZXdpc2UuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX21pcHMxNik6IExpa2V3aXNlLgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogTGlrZXdpc2UuCi0JKiB2ODUwLWRpcy5jIChwcmludF9pbnNuX3Y4NTApOiBMaWtld2lzZS4KLQkqIG5zMzJrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IERlY2xhcmUuCi0JKGdldF9kaXNwbGFjZW1lbnQsIGludmFsaWRfZmxvYXQpOiBEZWNsYXJlLgotCShsaXN0X3NlYXJjaCwgc2lnbl9leHRlbmQsIGZsaXBfYnl0ZXMpOiBEZWNsYXJlIHJldHVybiB0eXBlLgotCShnZXRfZGlzcGxhY2VtZW50KTogTGlrZXdpc2UuCi0JKHByaW50X2luc25fYXJnKTogTGlrZXdpc2UuICBNYWtlIGQgaW50LiAgRml4IHNwcmludGYgZm9ybWF0Ci0Jc3RyaW5nLgotCShwcmludF9pbnNuX25zMzJrKTogTWFrZSBpIHVuc2lnbmVkLgotCShpbnZhbGlkX2Zsb2F0KTogTWFrZSBzdGF0aWMuICBEZWNsYXJlIHR5cGUgb2YgdmFsLgotCSogdGljMzAtZGlzLmMgKHByaW50X3Bhcl9pbnNuKTogTWFrZSBpIHNpemVfdC4gIERvbid0IGNoZWNrIHN0cmxlbgotCW9uIGVhY2ggZm9yIGl0ZXJhdGlvbi4KLQkqIHRpYzMwLWRpcy5jIChnZXRfaW5kaXJlY3Rfb3BlcmFuZCk6IExpa2V3aXNlLgotCSogejhrLWRpcy5jIChwcmludF9pbnNuX3o4MDAxKTogRGVjbGFyZSByZXR1cm4gdHlwZS4KLQkocHJpbnRfaW5zbl96ODAwMik6IExpa2V3aXNlLgotCSh1bnBhcnNlX2luc3RyKTogRml4IHNwcmludGYgZm9ybWF0IHN0cmluZ3MuCi0KLUZyaSBNYXIgMjcgMDA6MDU6MjMgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBBZGQgInN5bmMubCIgYW5kICJzeW5jLnAiLgotCi1XZWQgTWFyIDI1IDE0OjMyOjQ4IDE5OTggIEFuZHJlYXMgU2Nod2FiICA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBVc2UgaW5mby0+bWFjaCB0byBzZWxlY3QgdGhlCi0JZGVmYXVsdCBtNjhrIHZhcmlhbnQgdG8gcmVjb2duaXplLgotCi0JKiBpOTYwLWRpcy5jIChwaW5zbik6IENoYW5nZSB0eXBlIG9mIGZpcnN0IGFyZ3VtZW50IHRvIGJmZF92bWEuCi0JKGN0cmwsIGNvYnIsIG1lbSwgZWEpOiBMaWtld2lzZS4KLQkocHJpbnRfYWRkcik6IExpa2V3aXNlLiAgUmVtb3ZlIGNhc3QuCi0JKGVhKTogQ2FzdCBhcmd1bWVudCBvZiBwcmludF9hZGRyIHRvIGJmZF92bWEuCi0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIpOiBGaXggdHlwZSBvZiBsb2NhbAotCXZhcmlhYmxlIHZhbHVlLgotCShjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIpOiBMaWtld2lzZS4KLQkoY2dlbl9wYXJzZV9hZGRyZXNzKTogTGlrZXdpc2UuCi0KLVdlZCBNYXIgMjUgMTQ6MzE6MzEgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBpOTYwLWRpcy5jIChjdHJsKTogQWRkIGZ1bGwgYnJhY2VzIHRvIHN0cnVjdHVyZSBpbml0aWFsaXphdGlvbi4KLQkoY29iciwgbWVtLCByZWcpOiBMaWtld2lzZS4KLQkoZWEpOiBDb3JyZWN0IHBhcmVudGhlc2l6YXRpb24gaW4gZXhwcmVzc2lvbi4KLQotCSogY2dlbi1hc20uYzogSW5jbHVkZSA8Y3R5cGUuaD4uCi0JKGJ1aWxkX2FzbV9oYXNoX3RhYmxlKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBpLgotCShjZ2VuX3BhcnNlX2tleXdvcmQpOiBBZGQgY2FzdHMgdG8gYXZvaWQgd2FybmluZ3MuCi0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9iaWdfYXJtKTogT25seSBjYWxsIGNvZmZzeW1ib2wgZm9yIGEgQ09GRgotCXN5bWJvbC4gIEZpeCBpbmRlbnRhdGlvbi4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMjAgMTg6NTU6MTggMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBBTV9ESVNBQkxFX1NIQVJFRC4KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGxpYnRvb2wgMS4yLgotCi1UaHUgTWFyIDE5IDE1OjQ2OjUzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQlUaGVzZSBwYXRjaGVzIGFyZSBjb3VydGVzeSBvZiBKb25hdGhhbiBXYWx0b24gYW5kIFRvbnkgVGhvbXBzb24KLQkoYXRob21wc29AY2FtYnJpZGdlLmFybS5jb20pLgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fdGh1bWIpOiBJZ25vcmUgYm90dG9tIHR3byBiaXRzIG9mIFBDCi0JcmVsYXRpdmUgYWRkcmVzc2VzLgotCi0JKiBhcm0tb3BjLmggKHRodW1iX29wY29kZXMpOiBBbm5vdGF0ZSBQQyByZWxhdGl2ZSBhZGRyZXNzZXMgd2l0aAotCWJvdGggdGhlIG9mZnNldCBhbmQgdGhlIGxhYmVsIGNsb3Nlc3QgdG8gdGhlIGRlc3RpbmF0aW9uLgotCi1TYXQgTWFyIDE0IDIzOjQ3OjE0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAc2ViYS5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oOiBSZWdlbmVyYXRlLgotCi1XZWQgTWFyICA0IDEyOjA4OjE0IDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLmgsbTMyci1vcGMuYyxtMzJyLWFzbS5jLG0zMnItZGlzLmM6IFJlZ2VuZXJhdGUuCi0KLVNhdCBGZWIgMjggMTY6MDI6MzQgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0sIHByaW50X2luc25fbGl0dGxlX2FybSk6IERvIG5vdAotCWFzc3VtZSB0aGF0IGluZm8tPnN5bWJvbHMgaXMgbm9uLWVtcHR5LgotCi1TYXQgRmViIDI4IDEyOjE5OjA1IDE5OTggIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIGFscGhhLW9wYy5jIChjdnRxcykgVGhlcmUgaXMgbm8gc3VjaCB0aGluZy4KLQkoY3Z0dHEpOiBNaXNzaW5nIG1vc3Qgb2YgdGhlIC8qZCB2YXJpYW50cy4KLQotVGh1IEZlYiAyNiAxNTo1MzowOSAxOTk4ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBJbmRpY2F0ZSB3aGljaCBpbnN0cnVjdGlvbnMgYXJlCi0JZGVsYXllZCBicmFuY2hlcyBvciBqdW1wcy4KLQotVHVlIEZlYiAyNCAxMDo0Njo0NCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fe2JpZyxsaXR0bGV9X2FybSk6IGluZm8tPnN5bWJvbCBjaGFuZ2VkCi0JdG8gKmluZm8tPnN5bWJvbHMuCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX3tiaWcsbGl0dGxlfV9taXBzKTogTGlrZXdpc2UuCi0JKiB0aWMzMC1kaXMuYyAocHJpbnRfYnJhbmNoKTogTGlrZXdpc2UuCi0KLVR1ZSBGZWIgMjQgMTE6MDY6MTggMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2JpZ19hcm0sIHByaW50X2luc25fbGl0dGxlX2FybSk6IFJlbW92ZQotCXNhdmVkX3N5bWJvbCBjb2RlIGFzIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCi0KLU1vbiBGZWIgMjMgMTM6MTY6MTcgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmM6IEluY2x1ZGUgc3ltY2F0LmguCi0JKiBjZ2VuLWRpcy5jLGNnZW4tb3BjLmM6IERpdHRvLgotCSogbTMyci1hc20uYyxtMzJyLWRpcy5jLG0zMnItb3BjLmgsbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotTW9uIEZlYiAyMyAxMDozNDo1OCAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogRG8gbm90IHByZWZpeCAnUCcgYXJndW1lbnRzIHdpdGggJyQnLgotCi1UaHUgRmViIDE5IDE2OjUxOjEzIDE5OTggIERvdWcgRXZhbnMgIDxkZXZhbnNAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIG0zMnItb3BjLltjaF06IFJlZ2VuZXJhdGUuCi0KLVR1ZSBGZWIgMTcgMTc6MTQ6NTAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fcGFyc2Vfe3NpZ25lZCx1bnNpZ25lZH1faW50ZWdlcik6IERlbGV0ZSBtaW4sbWF4Ci0JYXJndW1lbnRzLiAgRG9uJ3QgcGVyZm9ybSB2YWxpZGF0aW9uIGhlcmUuCi0JKiBtMzJyLWFzbS5jLG0zMnItZGlzLmMsbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotRnJpIEZlYiAxMyAxNDoyNjowNiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jOiBSZWdlbmVyYXRlLgotCi1GcmkgRmViIDEzIDE0OjUzOjAyIDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW0gKEFVVE9NQUtFX09QVElPTlMpOiBEZWZpbmUuCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggYXV0b21ha2UgMS4yZS4KLQotRnJpIEZlYiAxMyAxMDoyMTowOSAxOTk4ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIG0xMDMwMC1kaXMuYyAocHJpbnRfaW5zbl9tbjEwMzAwKTogUmVjb2duaXplIGJyZWFrIGluc3RydWN0aW9uLgotCi1GcmkgRmViIDEzIDEzOjEyOjE0IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBHZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gQkZELgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi0JRnJvbSBILkouIEx1IDxoamxAZ251Lm9yZz46Ci0JKiBNYWtlZmlsZS5hbSAobGlib3Bjb2Rlc19sYV9MREZMQUdTKTogRGVmaW5lLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0KLUZyaSBGZWIgMTMgMDk6NTA6MzIgMTk5OCAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQkqIG0zMnItb3BjLmg6IFJlZ2VuZXJhdGUuCi0KLVRodSBGZWIgMTIgMTE6MDE6NDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYzogUmVnZW5lcmF0ZS4KLQotVGh1IEZlYiAxMiAwMzo0MTowMCAxOTk4ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JRml4IHJhYyB0byBhY2NlcHQgb25seSBhMDoKLQkqIGQxMHYtb3BjLmMgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMsIGQxMHZfb3BlcmFuZHMsIGQxMHZfb3Bjb2Rlcyk6Ci0JU3BsaXQgT1BFUkFORF9BQ0MgaW50byBPUEVSQU5EX0FDQzAgYW5kIE9QRVJBTkRfQUNDMS4KLQlJbnRyb2R1Y2UgT1BFUkFORF9HUFIuCi0JKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKTogTGlrZXdpc2UuCi0KLVdlZCBGZWIgMTEgMTg6NTg6MzQgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IERlbGV0ZSBpbml0IG9mIGh3IGxpc3QgYG5leHQnIGNoYWluLgotCShjZ2VuX2h3X2xvb2t1cCk6IE1ha2UgcmVzdWx0IGNvbnN0LgotCSogbTMyci1vcGMuaCwgbTMyci1vcGMuYywgbTMyci1hc20uYywgbTMyci1kaXMuYzogUmVnZW5lcmF0ZS4KLQotU2F0IEZlYiAgNyAxNTozMDoyNyAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSwgYWNsb2NhbC5tNDogUmVidWlsZCB3aXRoIG5ldyBsaWJ0b29sLgotCi1UaHUgRmViICA1IDE3OjU2OjEwIDE5OTggIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBjeWdudXMuY29tPgotCi0JKiBkMzB2LW9wYy5jIChyZXBlYXR7LGl9IGluc3RydWN0aW9ucyk6IFJlcGVhdC9yZXBlYXRpCi0JaW5zdHJ1Y3Rpb25zIHVzZSBhIFBDIHJlbGF0aXZlIGJyYW5jaCwgbm90IGFic29sdXRlLgotCi1XZWQgRmViICA0IDE5OjE3OjM3IDE5OTggIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgbGlidG9vbF9lbmFibGVfc2hhcmVkIHJhdGhlciB0aGFuCi0JbGlidG9vbF9zaGFyZWQuICBSZW1vdmUgZGl2ZXJzaW9uIGhhY2suCi0JKiBjb25maWd1cmUsIE1ha2VmaWxlLmluLCBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0KLVR1ZSBGZWIgIDMgMTc6MTk6NDAgMTk5OCAgRG91ZyBFdmFucyAgPGRldmFuc0BzZWJhLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmMgKGNnZW5fc2V0X2NwdSk6IEluaXRpYWxpemUgaGFyZHdhcmUgdGFibGUuCi0JKiBtMzJyLW9wYy5oLCBtMzJyLW9wYy5jLCBtMzJyLWFzbS5jLCBtMzJyLWRpcy5jOiBSZWdlbmVyYXRlLgotCi1Nb24gRmViICAyIDE5OjIyOjE1IDE5OTggIFN0ZXZlIEhhd29ydGggIDxzdGV2ZUBwbS5jc2Uucm1pdC5FRFUuQVU+Ci0KLQkqIHRpYzMwLWRpcy5jOiBOZXcgZmlsZS4KLQkqIGRpc2Fzc2VtYmxlLmMJKGRpc2Fzc2VtYmxlcik6IEFkZCBiZmRfYXJjaF90aWMzMCBjYXNlLgotCSogY29uZmlndXJlLmluOiBIYW5kbGUgYmZkX3RpYzMwX2FyY2guCi0JKiBNYWtlZmlsZS5hbTogUmVidWlsZCBkZXBlbmRlbmNpZXMuCi0JKENGSUxFUyk6IEFkZCB0aWMzMC1kaXMuYwotCShBTExfTUFDSElORVMpOiBBZGQgdGljMzAtZGlzLmxvLgotCSogY29uZmlndXJlLCBNYWtlZmlsZS5pbjogUmVidWlsZC4KLQotVGh1IEphbiAyOSAxMzowMjo1NiAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oIChIQVZFX0NQVV9NMzJSKTogRGVmaW5lLgotCi1XZWQgSmFuIDI4IDA5OjU1OjAzIDE5OTggIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKGluc2VydGlvbiByb3V0aW5lcyk6IElmIGJvdGggYWxpZ25tZW50IGFuZCBzaXplIGlzCi0Jd3JvbmcgdGhlbiByZXBvcnQgdGhpcy4KLQotVHVlIEphbiAyNyAyMTo1Mjo1OSAxOTk4ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBTZXQgdGFyZ2V0X3Byb2Nlc3NvciBhcyBhcHByb3ByaWF0ZS4KLQlPbmx5IHJlY29nbml6ZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjdXJyZW50IHRhcmdldF9wcm9jZXNzb3IuCi0KLVRodSBKYW4gMjIgMTY6MjA6MTcgMTk5OCAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmMgKFBDX01BU0spOiBDb3JyZWN0IHZhbHVlLgotCShwcmludF9vcGVyYW5kKTogSWYgdGhlcmUncyBhIHJlbG9jLCBkb24ndCBjYWxjdWxhdGUgdGhlCi0gCWFkZHJlc3MgYmVjYXVzZSB0aGV5IGNvdWxkIGJlIGluIGRpZmZlcmVudCBzZWN0aW9ucy4KLQotRnJpIEphbiAxNiAxNToyOToxMSAxOTk4ICBKaW0gQmxhbmR5ICA8amltYkB6d2luZ2xpLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogTW92ZSA0MDEwJ3MgImFkZGNpdSIKLSAJaW5zdHJ1Y3Rpb24gYWZ0ZXIgdGhlIDQ2NTAncyAibXVsIiBpbnN0cnVjdGlvbjsgbm9ib2R5J3MgdXNpbmcgdGhlCi0gCTQwMTAgdGhlc2UgZGF5cy4gIElmIG9iamVjdCBmaWxlcyBzb21lZGF5IGluZGljYXRlIHdoaWNoIHByb2Nlc3NvcgotCXZhcmlhbnQgdGhleSdyZSBpbnRlbmRlZCBmb3IsIHdlIGNhbiBkbyBhIGJldHRlciBqb2IgYXQgdGhpcy4KLQotTW9uIEphbiAxMiAxNDo0Mzo1NCAxOTk4ICBEb3VnIEV2YW5zICA8ZGV2YW5zQHNlYmEuY3lnbnVzLmNvbT4KLQotCSogY2dlbi1hc20uYyAoYnVpbGRfYXNtX2hhc2hfdGFibGUpOiBUcmF2ZXJzZSBjb21waWxlZCBpbiB0YWJsZSB1c2luZwotCXRhYmxlIHByb3ZpZGVkIGVudHJ5IHNpemUuICBVc2UgQ0dFTl9JTlNOX01ORU1PTklDLgotCShjZ2VuX3BhcnNlX2tleXdvcmQpOiBSZXdyaXRlLgotCSogY2dlbi1kaXMuYyAoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBUcmF2ZXJzZSBjb21waWxlZCBpbiB0YWJsZSB1c2luZwotCXRhYmxlIHByb3ZpZGVkIGVudHJ5IHNpemUuICBVc2UgQ0dFTl9JTlNOX01BU0tfQklUU0laRS4KLQkqIGNnZW4tb3BjLmM6IENsZWFuIHVwIHBhc3Mgb3ZlciBgc3RydWN0IGZvbycgdXNhZ2UuCi0JKGNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUpOiBIYW5kbGUgIiIgZW50cnkuCi0JKGNnZW5fa2V5d29yZF9hZGQpOiBMaWtld2lzZS4KLQotTW9uIERlYyAyMiAxMjozNzowNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBGUF9EIHRvIHMuZCBpbnN0cnVjdGlvbiBmbGFncy4KLQotV2VkIERlYyAxNyAxMTozODoyOSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAoaGFsdCwgcHVsc2UpOiBFbmFibGUgdGhlbSBvbiB0aGUgNjgwNjAuCi0KLVR1ZSBEZWMgMTYgMTU6MjI6NTMgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGNvZGVzKTogUmV2ZXJ0IGNoYW5nZSB0aGF0IHB1dCB0aGUgMzIgYml0Ci0JUEMgcmVsYXRpdmUgb2Zmc2V0IGZvcm1zIGJlZm9yZSB0aGUgMTUgYml0IGZvcm1zLiAgQW4gYXNzZW1ibGVyIGNvbW1hbmQKLQlsaW5lIG9wdGlvbiBub3cgY2hvb3NlcyB0aGUgZGVmYXVsdC4KLQotVHVlIERlYyAxNiAxNToyMjo1MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAoZDMwdl9vcGNvZGVfdGFibGUpOiBTZXQgbmV3IGZsYWdzIGJpdHMKLQlGTEFHX3syV09SRCxNVUx7MTYsMzJ9LEFERFNVQnBwcH0sIGluIGFwcHJvcHJpYXRlIGluc3RydWN0aW9ucy4KLQotMTk5Ny0xMi0xNSAgQnJlbmRhbiBLZWhvZSAgPGJyZW5kYW5AbGlzYS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IE9ubHkgYnVpbGQgbGlib3Bjb2RlcyBzaGFyZWQgaWYgLS1lbmFibGUtc2hhcmVkJ3MgdmFsdWUKLQl3YXMgYHllcycsIG9yIHdhcyBzZXQgdG8gYCpvcGNvZGVzKicuCi0JKiBhY2xvY2FsLm00OiBMaWtld2lzZS4KLQkqIE5PVEU6IHRoaXMgcmVhbGx5IG5lZWRzIHRvIGJlIGZpeGVkIGluIGxpYnRvb2wvbGlidG9vbC5tNCwgdGhlCi0Jb3JpZ2luYWwgc291cmNlIG9mIHRoaXMgYml0IG9mIGNvZGUuICBJdCdzIG5vdCBjbGVhciB3aGF0IHRoZSBiZXN0IGZpeAotCXdvdWxkIGJlLCB0aG91Z2guCi0KLUZyaSBEZWMgMTIgMTE6NTc6MDQgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jIChPRkZfU0xfUEMsIE9GRl9TTF9CUik6IE1pbm9yIGZvcm1hdHRpbmcgY2hhbmdlLgotCSh0aWM4MF9vcGNvZGVzKTogUmVvcmRlciB0YWJsZSBlbnRyaWVzIHRvIHB1dCB0aGUgMzIgYml0IFBDIHJlbGF0aXZlCi0gCW9mZnNldCBmb3JtcyBiZWZvcmUgdGhlIDE1IGJpdCBmb3JtcywgdG8gZGVmYXVsdCB0byB0aGUgbG9uZyBmb3Jtcy4KLQotRnJpIERlYyAxMiAwMTozMjozMCAxOTk3ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYyAoY3Z0dHEvKnUqKTogUmVtb3ZlLCBhcyB0aGF0IHN1ZmZpeCBpcyBpbnZhbGlkLgotCi1XZWQgRGVjIDEwIDE3OjQyOjM1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYyAocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogUHJldmVudCBleGFtaW5hdGlvbiBvZiBzdG9yZWQKLQlzeW1ib2wgaWYgbm9uZSBpcyBwcmVzZW50LgotCShwcmludF9pbnNuX2JpZ19hcm0pOiAgUHJldmVudCBleGFtaW5hdGlvbiBvZiBzdG9yZWQgc3ltYm9sIGlmCi0Jbm9uZSBpcyBwcmVzZW50LgotCi1UaHUgT2N0IDIzIDIxOjEzOjM3IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBDb3JyZWN0IGVudHJ5IGZvciBSVEUuCi0KLU1vbiBEZWMgIDggMTE6MjE6MDcgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYzogUmVtb3ZlIGRpc2FzbV9zeW1hZGRyKCkgZnVuY3Rpb24uCi0KLQkqIGFybS1kaXMuYzogVXNlIGluZm8tPnN5bWJvbCBpbnN0ZWFkIG9mIGluZm8tPmZsYWdzIHRvIGRldGVybWluZQotCWlmIGRpc2Fzc21ibHkgc2hvdWxkIGJlIGluIFRodW1iIG9yIEFybSBtb2RlLgotCi1UdWUgRGVjICAyIDA5OjU0OjI3IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGFybS1kaXMuYzogQWRkIHN1cHBvcnQgZm9yIGRpc2Fzc2VtYmxpbmcgVGh1bWIgb3Bjb2Rlcy4KLQkocHJpbnRfaW5zbl90aHVtYik6IE5ldyBmdW5jdGlvbi4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNtX3N5bWFkZHIpOiBOZXcgZnVuY3Rpb24uCi0KLQkqIGFybS1vcGMuaDogRGlzcGxheSBub3AgcHNldWRvIG9wcyBhbG9uZ3NpZGUgZXF1aXZhbGVudCBkaXNhc3NlbWJseS4KLQkodGh1bWJfb3Bjb2Rlcyk6IFRhYmxlIG9mIFRodW1iIG9wY29kZXMuCi0KLU1vbiBEZWMgIDEgMTI6MjU6NTcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKGJ0c3QpOiBDaGFuZ2UgRGRAcyB0byBEZDtiLgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFJlY29nbml6ZSAnbScsICduJywgJ28nLCAncCcsICdxJywKLQlhbmQgJ3YnIGFzIG9wZXJhbmQgdHlwZXMuCi0KLU1vbiBEZWMgIDEgMTE6NTY6NTAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBBZGQgYXJndW1lbnQgZm9yIGxwc3RvcC4gIEZyb20gT2xpdmllciBDYXJtb25hCi0JPG9saXZpZXIuY2FybW9uYUBkaS5lcGZsLmNoPi4KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IEhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgbHBzdG9wLAotCXdoaWNoIGhhcyBhIHR3byB3b3JkIG9wY29kZSB3aXRoIGEgb25lIHdvcmQgYXJndW1lbnQuCi0KLVN1biBOb3YgMjMgMjI6MjU6MjEgMTk5NyAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlLCBjYXNlIGNtcHUpOiBJbW1lZGlhdGUgZmllbGQgaXMKLQl1bnNpZ25lZCwgbm90IHNpZ25lZC4KLQkoZDMwdl9mb3JtYXRfdGFibGUpOiBBZGQgU0hPUlRfQ01QVSBjYXNlcyBmb3IgY21wdS4KLQotVHVlIE5vdiAxOCAyMzoxMDowMyAxOTk3ICBKIm9ybiBSZW5uZWNrZSAgPGFteWxhYXJAY3lnbnVzLmNvLnVrPgotCi0JKiBkMTB2LWRpcy5jIChwcmludF9vcGVyYW5kKToKLQlTcGxpdCBPUEVSQU5EX0ZMQUcgaW50byBPUEVSQU5EX0ZGTEFHIGFuZCBPUEVSQU5EX0NGTEFHLgotCi1UdWUgTm92IDE4IDE4OjQ1OjE0IDE5OTcgIEoib3JuIFJlbm5lY2tlICA8YW15bGFhckBjeWdudXMuY28udWs+Ci0KLQkqIGQxMHYtb3BjLmMgKE9QRVJBTkRfRkxBRyk6IFNwbGl0IGludG86Ci0JKE9QRVJBTkRfRkZMQUcsIE9QRVJBTkRfQ0ZMQUcpIC4KLQkoRlNSQyk6IFNwbGl0IGludG86Ci0JKEZGU1JDLCBDRlNSQykuCi0KLVRodSBOb3YgMTMgMTE6MDU6MzMgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IE1vdmUgdGhlIElOU05fTUFDUk8gSVNBIHZhbHVlIHRvIHRoZSBtZW1iZXJzaGlwCi0JZmllbGQgZm9yIGFsbCBJTlNOX01BQ1JPJ3MuCi0JKiBtaXBzMTYtb3BjLmM6IHNhbWUKLQotV2VkIE5vdiAxMiAxMDoxNjo1NyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoc3luYyxjYWNoZSk6IFRoZXNlIGFyZSAzOTAwIGluc25zLgotCi1UdWUgTm92IDExIDIzOjUzOjQxIDE5OTcgIEoib3JuIFJlbm5lY2tlIDxhbXlsYWFyQGN5Z251cy5jby51az4KLQotCXNoLW9wYy5oIChzaF90YWJsZSk6IFJlbW92ZSBmdHN0L25hbi4KLQotVHVlIE9jdCAyOCAxNzo1OTozMiAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoZmZjLCBmZnMpOiBGaXggbWFzay4KLQotVHVlIE9jdCAyOCAxNjozNDo1NCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogZDMwdi1vcGMuYyAocHJlX2RlZmluZWRfcmVnaXN0ZXJzKTogQWRkIGVpdF92YiwgaW50X3MsIGFuZCBpbnRfbQotCWNvbnRyb2wgcmVnaXN0ZXJzLgotCi1Nb24gT2N0IDI3IDIyOjM0OjAzIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBGaXggYnVnIGluIG1hc2sgZm9yICJub3QiIHBzZXVkby1pbnN0cnVjdGlvbi4KLQkoV1JfSElMTywgUkRfSElMTywgTU9EX0hJTE8pOiBOZXcgbWFjcm9zLgotCi1Nb24gT2N0IDI3IDIyOjM0OjAzIDE5OTcgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBGaXggYnVnIGluIG1hc2sgZm9yICJub3QiIHBzZXVkby1pbnN0cnVjdGlvbi4KLQkoV1JfSElMTywgUkRfSElMTywgTU9EX0hJTE8pOiBOZXcgbWFjcm9zLgotCi1UaHUgT2N0IDIzIDE0OjU3OjU4IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUmVwbGFjZSAvLyB3aXRoIC8qIC4uLiAqLwotCi1XZWQgT2N0IDIyIDE3OjMzOjIxIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jOiBBZGQgd3IgJiByZCBmb3IgdjlhIGFzcidzLgotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBSZWNvZ25pemUgJ18nIGFuZCAnLycgZm9yIHY5YSBhc3Incy4KLQkodjlhX2Fzcl9yZWdfbmFtZXMpOiBOZXcgdmFyaWFibGUuCi0JUGF0Y2ggZnJvbSBEYXZpZCBNaWxsZXIgPGRhdmVtQHZnZXIucnV0Z2Vycy5lZHU+LgotCi1XZWQgT2N0IDIyIDE3OjE4OjAyIDE5OTcgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jICh2OW5vdHY5YSk6IE5ldyBpbnNuIHR5cGUuCi0JKElNUERFUCk6IE1vdmUgdG8gdGhlIGVuZCB0byBub3QgY29uZmxpY3Qgd2l0aCBlZGdlOCBldCBhbC4KLQlQYXRjaCBmcm9tIERhdmlkIE1pbGxlciA8ZGF2ZW1Admdlci5ydXRnZXJzLmVkdT4uCi0KLUZyaSBPY3QgMTcgMTM6MTg6NTMgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKGJuZXpsLGJlcXpsKTogTWFyayB0aGVzZSBhcyBhbHNvIHR4MzkuCi0KLVRodSBPY3QgMTYgMTE6NTU6MjAgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IE5vdGUgdGhhdCAnamFseCcgaXMgKHByb2JhYmx5IGluY29ycmVjdGx5KSBtYXJrZWQgSTEuCi0KLVR1ZSBPY3QgMTQgMTY6MTA6MzEgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBVc2UgbmV3IHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMoKSBmaWVsZAotCW9mIGRpc2Fzc2VtYmxlX2luZm8gc3RydWN0dXJlIHRvIGRldGVybWluZSBpZiBhbiBvdmVybGF5IGFkZHJlc3MKLQloYXMgYSBtYXRjaGluZyBzeW1ib2wgaW4gbG93IG1lbW9yeS4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3N5bWJvbF9hdF9hZGRyZXNzKTogTmV3IChkdW1teSkgZnVuY3Rpb24gZm9yCi0JbmV3IHN5bWJvbF9hdF9hZGRyZXNzX2Z1bmMgZmllbGQgaW4gZGlzYXNzZW1ibGVfaW5mbyBzdHJ1Y3R1cmUuCi0KLUZyaSBPY3QgMTAgMTY6NDQ6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoZXh0cmFjdF9kMjIpOiBVc2Ugc2lnbmVkIGFyaXRobWF0aWMuCi0KLVR1ZSBPY3QgIDcgMjM6NDA6NDMgMTk5NyAgR2F2aW4gS29jaCAgPGdhdmluQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IFRocmVlIG9wIG11bHQgaXMgbm90IGFuIElTQSBpbnNuLgotCi1UdWUgT2N0ICA3IDIzOjM3OjIxIDE5OTcgIEdhdmluIEtvY2ggIDxnYXZpbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBGaXggZm9ybWF0dGluZy4KLQotRnJpIE9jdCAgMyAxNzoyNjo1NCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKE9QX0UpOiBFeHBsaWNpdGx5IHNpZ24gZXh0ZW5kIDggYml0IHZhbHVlcywgcmF0aGVyCi0gCXRoYW4gYXNzdW1pbmcgdGhhdCBjaGFyIGlzIHNpZ25lZC4gIEV4cGxpY2l0bHkgc2lnbiBleHRlbmQgMTYgYml0Ci0JdmFsdWVzLCByYXRoZXIgdGhhbiBhc3N1bWluZyB0aGF0IHNob3J0IGlzIDE2IGJpdHMuCi0JKE9QX3NJLCBPUF9KLCBPUF9ESVIpOiBMaWtld2lzZS4KLQotVGh1IE9jdCAgMiAxMzozNjo0NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jICh2ODUwX3NyZWdfbmFtZXMpOiBVc2Ugc3ltYm9saWMgbmFtZXMgZm9yIGhpZ2hlcgotCXN5c3RlbSByZWdpc3RlcnMuCi0KLVdlZCBPY3QgIDEgMTY6NTg6NTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYzogRml4IHR5cG8gaW4gY29tbWVudC4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBBZGQgdGVzdCBvZiBwcm9jZXNzb3IgdHlwZSB3aGVuCi0JZGV0ZXJtaW5pbmcgb3Bjb2Rlcy4KLQotV2VkIE9jdCAgMSAxNDoxMDoyMCAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGEgZGl2ZXJzaW9uIHRvIHNldCBlbmFibGVfc2hhcmVkIGJlZm9yZSB0aGUKLQlhcmd1bWVudHMgYXJlIHBhcnNlZC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVGh1IFNlcCAyNSAxMzowNDo1OSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKFRCTDEpOiBVc2UgISByYXRoZXIgdGhhbiBgLgotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBSZW1vdmUgYCBvcGVyYW5kIHNwZWNpZmllci4KLQotV2VkIFNlcCAyNCAxMToyOTozNSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IENvcnJlY3QgYmNoZywgYmNsciwgYnNldCwgYW5kIGJ0c3Qgb24gQ29sZEZpcmUuCi0KLQkqIG02OGstb3BjLmM6IEFjY2VwdCB0c3R7Yix3LGx9IHdpdGggaW1tZWRpYXRlIG9wZXJhbmRzIG9uIGNwdTMyLgotCi0JKiBtNjhrLW9wYy5jOiBDb3JyZWN0IG1vdmV3IG9mIGFuIGltbWVkaWF0ZSBvcGVyYW5kIHRvICVzciBvciAlY2NyCi0JZm9yIG1jZjUyMDAuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DSEVDS19UT09MIGJlZm9yZSBBTV9QUk9HX0xJQlRPT0wuCi0JKiBhY2xvY2FsLm00OiBSZWJ1aWxkIHdpdGggbmV3IGxpYnRvb2wuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBTZXAgMTkgMTE6NDU6NDkgMTk5NyAgQW5kcmV3IENhZ25leSAgPGNhZ25leUBiMS5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICgiY21vdiIpOiBPcmRlciByZWcgcGFyYW0gcjEsIHIyIG5vdCByMiwgcjIuCi0KLVRodSBTZXAgMTggMTE6MjE6NDMgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKHNwYXJjbGV0X2NwcmVnX3RhYmxlKTogQWRkICVjY3NyMiwgJWNjY3JyLCAlY2Nyc3RyLgotCi1UdWUgU2VwIDE2IDE1OjE4OjIwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZ1cnRoZXIgcmVhcnJhbmdlbWVudHMuCi0KLVR1ZSBTZXAgMTYgMTY6MTI6MTEgMTk5NyAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmMgKHJvdDJoLCBzcmEyaCwgc3JsMmggaW5zbnMpOiBSZXZlcnQgbGFzdCBjaGFuZ2UuCi0KLVR1ZSBTZXAgMTYgMDk6NDg6NTAgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogRmllbGRzIHJlb3JkZXJlZCB0byBhbGxvdyBhc3NlbWJsZXIKLQlwYXJzZXIgdG8gd29yay4KLQotVHVlIFNlcCAxNiAxMDowMTowMCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkZWQgdHgzOSBpbnNucyBzZGJicCwgcmZlLCBhbmQgZGVyZXQuCi0KLU1vbiBTZXAgMTUgMTg6MzE6NTIgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYzogSW5pdGlhbGlzZSBwcm9jZXNzb3JzIGZpZWxkIG9mIHY4NTBfb3Bjb2RlIHN0cnVjdHVyZS4KLQotV2VkIEF1ZyAyNyAyMTo0MjozOSAxOTk3ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1lcmdlIGNoYW5nZXMgZnJvbSBNYXJ0aW4gSHVudDoKLQotCSogZDMwdi1vcGMuYzogQ2hhbmdlIG12ZmFjYyB0byBhY2NlcHQgNi1iaXQgdW5zaWduZWQgdmFsdWVzLgotCi0JKiBkMzB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGQgY29udHJvbCByZWdpc3RlcnMgZnJvbSAwLTYzLgotCShkMzB2X29wY29kZV90YWJlbCk6IEFkZCBkYnQsIHJ0ZCwgc3JhaCwgYW5kIHNybGggaW5zdHJ1Y3Rpb25zLiBGaXgKLQlyb3QyaCwgc3JhMmgsIGFuZCBzcmwyaCB0byB1c2UgbmV3IFNIT1JUX0E1UyBmb3JtYXQuCi0KLQkqIGQzMHYtZGlzLmMgKHByaW50X2luc24pOiBGaXggZGlzYXNzZW1ibHkgb2YgU0hPUlRfRDIgb3Bjb2Rlcy4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbik6IEZpcnN0IG9wZXJhbmQgb2YgZCppIChkZWxheWVkCi0JYnJhbmNoKSBpbnN0cnVjdGlvbnMgaXMgcmVsYXRpdmUuCi0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfb3Bjb2RlX3RhYmxlKTogQ2hhbmdlIGZvcm0gZm9yIHJlcGVhdGkuCi0JKGQzMHZfb3BlcmFuZF90YWJsZSk6IEFkZCBJTU02UzMgdHlwZS4KLQkoZDMwdl9mb3JtYXRfdGFibGUpOiBDaGFuZ2UgU0hPUlRfRDIuIEFkZCBMT05HX0RiLgotCi0JKiBkMzB2LWRpcy5jOiBGaXggYnVnIHdpdGggIi5zIiBhbmQgIi5sIiBleHRlbnNpb25zCi0JYW5kIGNtcCBpbnN0cnVjdGlvbnMuCi0KLQkqIGQzMHYtb3BjLmM6IENvcnJlY3QgZW50cmllcyBmb3IgcmVwZWF0KiwgYW5kIHNhdCouCi0JTWFrZSBJTU01IHVuc2lnbmVkLiBDcmVhdGUgSU1NNlUgYW5kIElNTTEyUzNVIG9wZXJhbmQKLQl0eXBlcy4gQ29ycmVjdCBzZXZlcmFsIGZvcm1hdHMuCi0KLQkqIGQzMHYtb3BjLmM6IChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBBZGQgZHBzdyBhbmQgZHBjLgotCi0JKiBkMzB2LW9wYy5jIChwcmVfZGVmaW5lZF9yZWdpc3RlcnMpOiBDaGFuZ2UgY29udHJvbCByZWdpc3RlcnMuCi0KLQkqIGQzMHYtb3BjLmMgKGQzMHZfZm9ybWF0X3RhYmxlKTogQ29ycmVjdCBTSE9SVF9DMSBhbmQKLQlTSE9SVF9DMi4gIE1hbnVhbCB3YXMgaW5jb3JyZWN0LgotCi0JKiBkMzB2LWRpcy5jIChsb29rdXBfb3Bjb2RlKTogIFJldHVybiB2YWx1ZSBub3cgaW5kaWNhdGVzCi0JaWYgYW4gb3Bjb2RlIGhhcyBhIHNob3J0IGFuZCBhIGxvbmcgZm9ybS4gIFVzZWQgZm9yIGRlY2lkaW5nCi0JdG8gYXBwZW5kIGEgIi5zIiBvciAiLmwiLgotCShwcmludF9pbnNuKTogQXBwZW5kIGEgIi5zIiB0byBhbiBpbnN0cnVjdGlvbiBpZiBpdCBpcwotIAl0aGUgc2hvcnQgZm9ybSBhbmQgIi5sIiBpZiBpdCBpcyBhIGxvbmcgZm9ybS4gRG8gbm90IGFwcGVuZAotCWFueXRoaW5nIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgb25seSBvbmUgcG9zc2libGUgc2l6ZS4KLQotCSogZDMwdi1vcGMuYzogQ2hhbmdlIG11bHgyaCB0byByZXF1aXJlIGFuIGV2ZW4gcmVnaXN0ZXIuCi0JTmV3IGZvcm06IFNIT1JUX0EyOyBhIFNIT1JUX0EgZm9ybSB0aGF0IG5lZWRzIGFuIGV2ZW4KLQlyZWdpc3RlciBhcyB0aGUgZmlyc3Qgb3BlcmFuZC4KLQotCSogZDMwdi1kaXMuYyAocHJpbnRfaW5zbl9kMzB2KTogRml4IHByb2JsZW0gd2hlcmUgdGhlIGxhc3QKLQlpbnN0cnVjdGlvbiB3YXMgbm90IGJlaW5nIGRpc2Fzc2VtYmxlZCBpZiB0aGVyZSB3ZXJlIGFuIG9kZAotCW51bWJlciBvZiBpbnN0cnVjdGlvbnMuCi0KLQkqIGQzMHYtb3BjLmMgKFNIT1JUX00yLCBMT05HX00yKTogIFR3byBuZXcgZm9ybXMuCi0KLUZyaSBTZXAgMTIgMTE6NDM6NTQgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBJbXByb3ZlZCBkaXNwbGF5IG9mIHJlZ2lzdGVyIGxpc3RzLgotCi1UaHUgU2VwIDExIDE3OjM1OjEwIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4IGFzc2VtYmxlciBhcmdzIHRvCi0JZnplcm9zLCBmb25lcywgZnNyYzEsIGZzcmMxcywgZnNyYzJzLCBmbm90MSwgZm5vdDFzLCBmbm90MnMsCi0JZm9ycywgZm5vcnMsIGZhbmRzLCBmbmFuZHMsIGZ4b3JzLCBmeG5vcnMsIGZvcm5vdDFzLCBmb3Jub3QycywKLQlmYW5kbm90MXMsIGZhbmRub3Qycy4KLQotVHVlIFNlcCAgOSAxMDowMzo0OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBvcDMgZmllbGQgZm9yIGZjbXBxL2ZjbXBlcS4KLQotTW9uIFNlcCAgOCAxNDowNjo1OSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLWFzbS5jIChjZ2VuX3BhcnNlX2FkZHJlc3MpOiBOZXcgYXJndW1lbnQgcmVzdWx0cC4KLQlBbGwgY2FsbGVycyB1cGRhdGVkLgotCSogbTMyci1hc20uYyAocGFyc2VfaF9oaTE2KTogUmlnaHQgc2hpZnQgbnVtYmVycyBieSAxNi4KLQotVHVlIFNlcCAgMiAxODozOTowOCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLSAgICAgICAgKiBtbjEwMjAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFBDIHJlbGF0aXZlIGluc3RydWN0aW9ucyBhcmUKLSAgICAgICAgcmVsYXRpdmUgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24sIG5vdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KLQotVHVlIFNlcCAgMiAxNTo0MTo1NSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE9ubHkgc2lnbmVkIGV4dGVuZCB2YWx1ZXMgdGhhdCBhcmUgbm90Ci0JcmV0dXJuZWQgYnkgZXh0cmFjdCBmdW5jdGlvbnMuCi0JUmVtb3ZlIHVzZSBvZiBWODUwX09QRVJBTkRfQURKVVNUX1NIT1JUX01FTU9SWSBmbGFnLgotCi1UdWUgU2VwICAyIDE1OjM5OjQwIDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIHY4NTAtb3BjLmM6IFVwZGF0ZSBjb21tZW50cy4gIFJlbW92ZSB1c2Ugb2YKLQlWODUwX09QRVJBTkRfQURKVVNUX1NIT1JUX01FTU9SWS4gIEZpeCBzZXZlcmFsIG9wZXJhbmQgcGF0dGVybnMuCi0KLVR1ZSBBdWcgMjYgMDk6NDI6MjggMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoTU9WSEkpOiBJbW1lZGlhdGUgcGFyYW1ldGVyIGlzIHVuc2lnbmVkLgotCi1Nb24gQXVnIDI1IDE1OjU4OjA3IDE5OTcgIENocmlzdG9waGVyIFByb3Zlbnphbm8gIDxwcm92ZW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWx0IHdpdGggbGF0ZXN0IGRldm8gYXV0b2NvbmYgZm9yIE5UIHN1cHBvcnQuCi0KLUZyaSBBdWcgMjIgMTA6MzU6MTUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBVc2UgY3VybHkgYnJhY2Ugc3ludGF4IGZvciByZWdpc3RlcgotCWxpc3RzLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXNbXSk6IEFkZCBOT1RfUjAgZmxhZyB0byBkZWNlY3QgY2FzZXMKLQl3aGVyZSByMCBpcyBiZWluZyB1c2VkIGFzIGEgZGVzdGluYXRpb24gcmVnaXN0ZXIuCi0KLVRodSBBdWcgMjEgMTE6MDk6MDkgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBNb3ZlIGRpdmggb3Bjb2RlcyBuZXh0IHRvIGVhY2ggb3RoZXIuCi0KLVR1ZSBBdWcgMTkgMTA6NTk6NTkgMTk5NyAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtb3BjLmMgKGFscGhhX29wY29kZXMpOiBGaXggaHdfcmVpX3N0YWxsIG11bmdhZ2UuCi0KLU1vbiBBdWcgMTggMTE6MTA6MDMgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzW10pOiBSZW1vdmUgdXNlIG9mIGZsYWcgZmllbGQuCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXNbXSk6IEFkZCBzdXBwb3J0IGZvciByZXZlcnNlZCBzaG9ydCBsb2FkCi0Jb3Bjb2Rlcy4uCi0KLU1vbiBBdWcgMTggMTE6MDg6MjUgMTk5NyAgTmljayBDbGlmdG9uICA8bmlja2NAY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlIChjZ2VuX2ZpbGVzKTogQWRkIHN1cHBvcnQgZm9yIHY4NTBlIHRhcmdldC4KLQkqIGNvbmZpZ3VyZS5pbiAoY2dlbl9maWxlcyk6ICBBZGQgc3VwcG9ydCBmb3Igdjg1MGUgdGFyZ2V0LgotCi1Nb24gQXVnIDE4IDExOjA4OjI1IDE5OTcgIE5pY2sgQ2xpZnRvbiAgPG5pY2tjQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZSAoY2dlbl9maWxlcyk6IEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCSogY29uZmlndXJlLmluIChjZ2VuX2ZpbGVzKTogIEFkZCBzdXBwb3J0IGZvciB2ODUwZWEgdGFyZ2V0LgotCi1GcmkgQXVnIDE1IDA1OjE3OjQ4IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoYmZkX2FyY19hcmNoKTogQWRkLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuYW0gKEFMTF9NQUNISU5FUyk6IEFkZCBhcmMtZGlzLmxvLCBhcmMtb3BjLmxvLgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQuCi0JKiBhcmMtZGlzLmMsIGFyYy1vcGMuYzogTmV3IGZpbGVzLgotCSogZGlzYXNzZW1ibGUuYyAoQVJDSF9hbGwpOiBEZWZpbmUgQVJDSF9hcmMuCi0JKGRpc2Fzc2VtYmxlcik6IEFkZCBBUkMgc3VwcG9ydC4KLQotV2VkIEF1ZyAxMyAxODo1MjoxMSAxOTk3ICBOaWNrIENsaWZ0b24gIDxuaWNrY0BjeWdudXMuY29tPgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEFkZCBzdXBwb3J0IGZvciB2ODUwRUEgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfaTVkaXYsIGV4dHJhY3RfaTVkaXYpOiBOZXcgRnVuY3Rpb25zLgotCSh2ODUwX29wY29kZXMpOiBBZGQgdjg1MEVBIGluc3RydWN0aW9ucy4KLQotCSogdjg1MC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBBZGQgc3VwcG9ydCBmb3Igdjg1MEUgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDVfNCwgZXh0cmFjdF9kNV80LCBpbnNlcnRfZDE2XzE2LAotCWV4dHJhY3RfZDE2XzE2LCBpbnNlcnRfaTksIGV4dHJhY3RfaTksIGluc2VydF91OSwgZXh0cmFjdF91OSwKLQlpbnNlcnRfc3BlLCBleHRyYWN0X3NwZSk6IE5ldyBGdW5jdGlvbnMuCi0JKHY4NTBfb3Bjb2Rlcyk6IEFkZCB2ODUwRSBpbnN0cnVjdGlvbnMuCi0KLQkqIHY4NTAtb3BjLmM6IFJlb3JnYW5pc2VkIGFuZCByZS1sYXllZCBvdXQgdG8gaW1wcm92ZSByZWFkYWJpbGl0eQotCWFuZCBwb3J0YWJpbGl0eS4KLQotVHVlIEF1ZyAgNSAyMzowOTozMSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTIuMS4KLQotTW9uIEF1ZyAgNCAxMjowMjoxNiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQsIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIG5ldyBhdXRvbWFrZSBwYXRjaGVzLgotCi1GcmkgQXVnICAxIDEzOjAyOjA0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTZXQgZW5hYmxlX3NoYXJlZCBiZWZvcmUgQU1fUFJPR19MSUJUT09MLgotCSogYWNpbmNsdWRlLm00OiBKdXN0IGluY2x1ZGUgYWNpbmNsdWRlLm00IGZyb20gQkZELgotCSogYWNsb2NhbC5tNCwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1UaHUgSnVsIDMxIDIxOjQ0OjQyIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuYW06IE5ldyBmaWxlLCBiYXNlZCBvbiBvbGQgTWFrZWZpbGUuaW4uCi0JKiBhY2NvbmZpZy5oOiBOZXcgZmlsZS4KLQkqIGFjaW5jbHVkZS5tNDogTmV3IGZpbGUuCi0JKiBzdGFtcC1oLmluOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBTV9JTklUX0FVVE9NQUtFIGFuZCBBTV9QUk9HX0xJQlRPT0wuCi0JUmVtb3ZlZCBzaGFyZWQgbGlicmFyeSBoYW5kbGluZzsgbm93IGhhbmRsZWQgYnkgbGlidG9vbC4gIFJlcGxhY2UKLQlBQ19DT05GSUdfSEVBREVSIHdpdGggQU1fQ09ORklHX0hFQURFUi4gIENhbGwgQU1fTUFJTlRBSU5FUl9NT0RFLAotCUFNX0NZR1dJTjMyLCBhbmQgQU1fRVhFRVhULiAgUmVwbGFjZSBBQ19QUk9HX0lOU1RBTEwgd2l0aAotCUFNX1BST0dfSU5TVEFMTC4gIENoYW5nZSBhbGwgLm8gZmlsZXMgdG8gLmxvLiAgUmVtb3ZlIHN0YW1wLWgKLQloYW5kbGluZyBpbiBBQ19PVVRQVVQuCi0JKiBkZXAtaW4uc2VkOiBDaGFuZ2UgLm8gdG8gLmxvLgotCSogTWFrZWZpbGUuaW46IE5vdyBidWlsdCB3aXRoIGF1dG9tYWtlLgotCSogYWNsb2NhbC5tNDogTm93IGJ1aWx0IHdpdGggYWNsb2NhbC4KLQkqIGNvbmZpZy5pbiwgY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gSnVsIDI4IDIxOjUyOjI0IDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogRml4IHR5cG8vdGhpbmtvIGluICJlcmV0IiBpbnN0cnVjdGlvbi4KLQotVGh1IEp1bCAyNCAxMzowMzoyNiAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBzcGVsbGluZyBvbiBmcGFkZFgsIGZwc3ViWCBpbnNucy4KLQlNYWtlIGFycmF5IGNvbnN0LgotCSogc3BhcmMtZGlzLmMgKHNvcnRlZF9vcGNvZGVzKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoc3RydWN0IG9wY29kZV9oYXNoKTogYG9wY29kZScgaXMgcG9pbnRlciB0byBjb25zdCBlbGVtZW50LgotCShidWlsZF9oYXNoKTogRmlyc3QgYXJnIGlzIG5vdyB0YWJsZSBvZiBzb3J0ZWQgcG9pbnRlcnMuCi0JKHByaW50X2luc25fc3BhcmMpOiBTb3J0IG9wY29kZXMgYnkgc29ydGluZyB0YWJsZSBvZiBwb2ludGVycy4KLQkoY29tcGFyZV9vcGNvZGVzKTogVXBkYXRlLgotCi1UdWUgSnVsIDE1IDEyOjA1OjIzIDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tb3BjLmM6ICNpbmNsdWRlIDxjdHlwZS5oPi4KLQkoaGFzaF9rZXl3b3JkX25hbWUpOiBOZXcgYXJnIGBjYXNlX3NlbnNpdGl2ZV9wJy4gIENhbGxlcnMgdXBkYXRlZC4KLQlIYW5kbGUgY2FzZSBpbnNlbnNpdGl2ZSBoYXNoaW5nLgotCShoYXNoX2tleXdvcmRfdmFsdWUpOiBDaGFuZ2UgdHlwZSBvZiBgdmFsdWUnIHRvIHVuc2lnbmVkIGludC4KLQotVGh1IEp1bCAxMCAxMjo1NjoxMCAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmMgKG1pcHNfYnVpbHRpbl9vcGNvZGVzKTogSWYgYW4gaW5zbiB1c2VzIHNpbmdsZQotCXByZWNpc2lvbiBGUCwgbWFyayBpdCBhcyBzdWNoLiAgTGlrZXdpc2UgZm9yIGRvdWJsZSBwcmVjaXNpb24KLQlGUC4gIE1hcmsgSVNBMSBpbnNucy4gIENvbnNvbGlkYXRlIGR1cGxpY2F0ZSBvcGNvZGVzIHdoZXJlCi0JcG9zc2libGUuCi0KLVdlZCBKdW4gMjUgMTU6MjU6NTcgMTk5NyAgRmVsaXggTGVlICA8ZmxlZUBjaXJkYW4uY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jIChleHRyYWN0X25zaSk6IG1ha2UgdW5zaWduZWQgZXhwcmVzc2lvbiBzaWduZWQgYmVmb3JlCi0gCW5lZ2F0aW5nIGl0LgotCShVTlVTRUQpOiByZW1vdmUgb25lIGxldmVsIG9mIHBhcmVucywgc28gTVNWQyBkb2Vzbid0IGNob2tlIG9uCi0gCW5lc3RpbmcgZGVwdGggd2hlbiBhbGwgdGhlIG1hY3JvcyBhcmUgZXhwYW5kZWQuCi0KLVR1ZSBKdW4gMTcgMTc6MDI6MTcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogVGhlIGZjbXAgdjlhIGluc3RydWN0aW9ucyB0YWtlIGFuIGludGVnZXIgcmVnaXN0ZXIKLQlhcyBhIGRlc3RpbmF0aW9uLCBub3QgYSBmbG9hdGluZyBwb2ludCByZWdpc3Rlci4gIEZyb20gQ2hyaXN0aWFuCi0JS3VlaG5rZSA8Q2hyaXN0aWFuLkt1ZWhua2VAYXJiaS5JbmZvcm1hdGlrLlVuaS1PbGRlbmJ1cmcuREU+LgotCi1Nb24gSnVuIDE2IDE0OjEzOjE4IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBQcmludCBjYXNlIDcuMiB1c2luZyAlcGNAKCkKLQlzeW50YXguICBGcm9tIFJvbWFuIEhvZGVrCi0JPHJuaG9kZWtAZmF1aTIyYy5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4uCi0KLQkqIGkzODYtZGlzLmMgKHR3b2J5dGVfaGFzX21vZHJtKTogRml4IHBhbmQuCi0KLU1vbiBKdW4gMTYgMTQ6MDg6MzggMTk5NyAgTWljaGFlbCBUYXlsb3IgIDxtYnRAbWl0LmVkdT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2X3R3b2J5dGUpOiBGaXggcGFuZCBhbmQgcGFuZG4uCi0KLVR1ZSBKdW4gMTAgMTE6MjY6NDcgMTk5NyAgSC5KLiBMdSAgPGhqbEBnbnUuYWkubWl0LmVkdT4KLQotCSogYXJtLWRpcy5jOiBBZGQgcHJvdG90eXBlcyBmb3IgYXJtX2RlY29kZV9zaGlmdCBhbmQKLQlwcmludF9pbnNuX2FybS4KLQotTW9uIEp1biAgMiAxMTozOTowNCAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIHIzOTAwIGluc25zLgotCi1UdWUgTWF5IDI3IDE1OjU1OjQ0IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQ2hhbmdlIHJlbG1hc2sgdG8gYmZkX3ZtYS4gIERvbid0Ci0JcHJpbnQgZGVsYXkgc2xvdCBpbnN0cnVjdGlvbnMgb24gdGhlIHNhbWUgbGluZS4gIFdoZW4gdXNpbmcgYSBQQwotCXJlbGF0aXZlIGxvYWQsIGFkZCBhIGNvbW1lbnQgd2l0aCB0aGUgdmFsdWUgYmVpbmcgbG9hZGVkIGlmIGl0IGNhbgotCWJlIG9idGFpbmVkLgotCi1UdWUgTWF5IDI3IDExOjAyOjA4IDE5OTcgIEFsYW4gTW9kcmEgIDxhbGFuQHNwcmkubGV2ZWxzLnVuaXNhLmVkdS5hdT4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2W10sIGRpczM4Nl90d29ieXRlW10pOiBjaGFuZ2UgcHVzaGwvcG9wbAotCXRvIHB1c2hTL3BvcFMgZm9yIHNlZ21lbnQgcmVncyBhbmQgYnl0ZSBjb25zdGFudCBzbyB0aGF0Ci0JcHVzaHcvcG9wdyBwcmludGVkIHdoZW4gaW4gMTYgYml0IGRhdGEgbW9kZS4KLQotCSogaTM4Ni1kaXMuYyAoZGlzMzg2W10pOiBjaGFuZ2UgY3d0bCwgY2x0ZCB0byBjV3RTLCBjU3RkIHRvCi0JcHJpbnQgY2J0dywgY3d0ZCBpbiAxNiBiaXQgZGF0YSBtb2RlLgotCSogaTM4Ni1kaXMuYyAocHV0b3ApOiBleHRyYSBjYXNlIFcgdG8gc3VwcG9ydCBhYm92ZS4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl94ODYpOiBwcmludCBhZGRyMzIgcHJlZml4IHdoZW4gZ2l2ZW4KLQlhZGRyZXNzIHNpemUgcHJlZml4IGluIDE2IGJpdCBhZGRyZXNzIG1vZGUuCi0KLUZyaSBNYXkgMjMgMTY6NDc6MjMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYzogUmVpbmRlbnQuICBSZW5hbWUgbG9jYWwgdmFyaWFibGUgZnByaW50ZiB0bwotCWZwcmludGZfZm4uCi0KLVRodSBNYXkgMjIgMTQ6MDY6MDIgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogbTMyci1vcGMuYyAobTMycl9jZ2VuX2luc25fdGFibGUsIGNtcHVpKTogVW5kbyBwYXRjaCBvZiBNYXkgMi4KLQotVHVlIE1heSAyMCAxMToyNjoyNyAxOTk3ICBHYXZpbiBLb2NoICA8Z2F2aW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYyAobWlwc19idWlsdGluX29wY29kZXMpOiBNb3ZlZCBJTlNOX0lTQSBmaWVsZCBpbnRvIG5ldwotCSAgZmllbGQgbWVtYmVyc2hpcC4KLQkqIG1pcHMxNi1vcGMuYyAobWlwMTZfb3Bjb2Rlcyk6IHNhbWUuCi0KLU1vbiBNYXkgMTIgMTU6MTA6NTMgMTk5NyAgSmltIFdpbHNvbiAgPHdpbHNvbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtb3ZlYik6IENoYW5nZSAkZCB0byAlZC4KLQotTW9uIE1heSAgNSAxNDoyODo0MSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IChkaXMzODZfdHdvYnl0ZSk6IEFkZCBNTVggaW5zdHJ1Y3Rpb25zLgotCSh0d29ieXRlX2hhc19tb2RybSk6IExpa2V3aXNlLgotCShncnBzKTogTGlrZXdpc2UuCi0JKE9QX01NWCwgT1BfRU0sIE9QX01TKTogTmV3IHN0YXRpYyBmdW5jdGlvbnMuCi0KLQkqIGkzODYtZGlzLmM6IFJldmVydCBwYXRjaCBvZiBBcHJpbCA0LiAgVGhlIG91dHB1dCBub3cgbWF0Y2hlcwotCXdoYXQgZ2NjIGdlbmVyYXRlcy4KLQotRnJpIE1heSAgMiAxMjo0ODozNyAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5jIChtMzJyX2NnZW5faW5zbl90YWJsZSwgY21wdWkpOiBVc2UgJHVpbW0xNiBpbnN0ZWFkCi0Jb2YgJHNpbW0xNi4KLQotVGh1IE1heSAgMSAxNTozNDoxNSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLW9wYy5oIChDR0VOX0FSQ0gpOiBSZW5hbWVkIGZyb20gQ0dFTl9DUFUuCi0KLVR1ZSBBcHIgMTUgMTI6NDA6MDggMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERlcGVuZCB1cG9uIGluc3RhbGxkaXJzLgotCShpbnN0YWxsZGlycyk6IE5ldyB0YXJnZXQuCi0KLU1vbiBBcHIgMTQgMTI6MTM6NTEgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JRnJvbSBUaG9tYXMgR3JhaWNoZW4gPGdyYWljaGVuQHJ6cGQuZGU+OgotCSogY29uZmlndXJlLmluOiBVc2UgJHtDT05GSUdfU0hFTEx9IHdoZW4gcnVubmluZyAkYWNfY29uZmlnX3N1Yi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotU3VuIEFwciAxMyAxNzo1MDo0MSAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBjZ2VuLSouYywgbTMyci0qLmM6ICNpbmNsdWRlIHN5c2RlcC5oIGluc3RlYWQgb2YgY29uZmlnLmguCi0JRGVsZXRlIHN0cmluZ3ssc30uaCBzdXBwb3J0LgotCi1UaHUgQXByIDEwIDE0OjQ0OjU2IDE5OTcgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGNnZW4tYXNtLmMgKGNnZW5fcGFyc2Vfb3BlcmFuZF9mbik6IE5ldyBnbG9iYWwuCi0JKGNnZW5fcGFyc2Vfe3ssdW59c2lnbmVkX2ludGVnZXIsYWRkcmVzc30pOiBVcGRhdGUgY2FsbCB0bwotCWNnZW5fcGFyc2Vfb3BlcmFuZF9mbi4KLQkoY2dlbl9pbml0X3BhcnNlX29wZXJhbmQpOiBOZXcgZnVuY3Rpb24uCi0JKiBtMzJyLWFzbS5jIChwYXJzZV9pbnNuX25vcm1hbCk6IGNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIHJlbmFtZWQKLQlmcm9tIGNnZW5fYXNtX2luaXRfcGFyc2UuCi0JKG0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuKTogTmV3IG9wZXJhbmQgYGVycm1zZycuCi0JRGVsZXRlIGNhbGwgdG8gYXNfYmFkLCByZXR1cm4gZXJyb3IgbWVzc2FnZSB0byBjYWxsZXIuCi0JKG0zMnJfY2dlbl9hc21faGFzaF9rZXl3b3Jkcyk6ICNpZiAwIG91dC4KLQotV2VkIEFwciAgOSAxMjowNToyNSAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpIFtjYXNlICdkJ106IFByaW50IGFzIGFkZHJlc3MgcmVnaXN0ZXIsCi0Jbm90IGRhdGEgcmVnaXN0ZXIuCi0JW2Nhc2UgJ0onXTogRml4IHR5cG8gaW4gcmVnaXN0ZXIgbmFtZS4KLQotTW9uIEFwciAgNyAxNjo0ODoyMiAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBTSExJQl9MSUJTLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKFNITElCX0xJQlMpOiBOZXcgdmFyaWFibGUuCi0JKCQoU0hMSUIpKTogVXNlICQoU0hMSUJfTElCUykuCi0KLU1vbiBBcHIgIDcgMTE6NDU6NDQgMTk5NyAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogY2dlbi1kaXMuYyAoYnVpbGRfZGlzX2hhc2hfdGFibGUpOiBGaXggeG1hbGxvYyBzaXplIGNvbXB1dGF0aW9uLgotCi0JKiBjZ2VuLW9wYy5jIChoYXNoX2tleXdvcmRfbmFtZSk6IEltcHJvdmUgYWxnb3JpdGhtLgotCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBIYW5kbGUgbTMyci4KLQotRnJpIEFwciAgNCAxMjoyOTozOCAxOTk3ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBtMzJyLWFzbS5jLCBtMzJyLWRpcy5jLCBtMzJyLW9wYy5jLCBtMzJyLW9wYy5oOiBOZXcgZmlsZXMuCi0JKiBjZ2VuLWFzbS5jLCBjZ2VuLWRpcy5jLCBjZ2VuLW9wYy5jOiBOZXcgZmlsZXMuCi0JKiBNYWtlZmlsZS5pbiAoQ0ZJTEVTKTogQWRkIHRoZW0uCi0JKEFMTF9NQUNISU5FUyk6IEFkZCB0aGVtLgotCShkZXBlbmRlbmNpZXMpOiBSZWdlbmVyYXRlLgotCSogY29uZmlndXJlLmluIChjZ2VuX2ZpbGVzKTogTmV3IHZhcmlhYmxlLgotCShiZmRfbTMycl9hcmNoKTogQWRkIGVudHJ5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlLgotCi1GcmkgQXByICA0IDE0OjA0OjE2IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDb3JyZWN0IGZpbGUgbmFtZXMgZm9yIGJmZF9tbjEwWzIzXTAwX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmluOiBSZWJ1aWxkIGRlcGVuZGVuY2llcy4KLQotCSogZDEwdi1kaXMuYzogSW5jbHVkZSAiYW5zaWRlY2wuaCIgYmVmb3JlICJvcGNvZGUvZDEwdi5oIi4KLQotCSogaTM4Ni1kaXMuYyAoZmxvYXRfcmVnKTogU3dhcCBmc3VicnAgYW5kIGZzdWJwLiAgU3dhcCBmZGl2cnAgYW5kCi0JZmRpdnAuCi0KLVRodSBBcHIgIDMgMTM6MjI6NDUgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBCcmFuY2hlZCBiaW51dGlscyAyLjguCi0KLVdlZCBBcHIgIDIgMTI6MjM6NTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtMTAyMDAtZGlzLmM6IFJlbmFtZSBmcm9tIG1uMTAyMDAtZGlzLmMuCi0JKiBtMTAyMDAtb3BjLmM6IFJlbmFtZSBmcm9tIG1uMTAyMDAtb3BjLmMuCi0JKiBtMTAzMDAtZGlzLmM6IFJlbmFtZSBmcm9tIG1uMTAzMDAtZGlzLmMKLQkqIG0xMDMwMC1vcGMuYzogUmVuYW1lIGZyb20gbW4xMDMwMC1vcGMuYy4KLQkqIE1ha2VmaWxlLmluOiBVcGRhdGUgYWNjb3JkaW5nbHkuCi0KLQkqIG1pcHMxNi1vcGMuYzogQWRkIG11bCBhbmQgZG11bCBtYWNyb3MuCi0KLVR1ZSBBcHIgIDEgMTY6Mjc6NDUgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogVXBkYXRlIENGTEFHUywgYWRkIGNsZWFuIHRhcmdldC4KLQotRnJpIE1hciAyOCAxMjoxMDowOSAxOTk3ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCAid2FpdCIuICBGcm9tIFJhbGYgQmFlY2hsZQotCTxyYWxmQGdudS5haS5taXQuZWR1Pi4KLQotCSogY29uZmlndXJlLmluOiBBZGQgc3RkbGliLmggdG8gQUNfQ0hFQ0tfSEVBREVSUyBsaXN0LgotCSogY29uZmlndXJlLCBjb25maWcuaW46IFJlYnVpbGQuCi0JKiBzeXNkZXAuaDogSW5jbHVkZSA8c3RkbGliLmg+IGlmIGl0IGV4aXN0cy4KLQkqIHNwYXJjLWRpcy5jOiBJbmNsdWRlIDxzdGRpby5oPiBhbmQgInN5c2RlcC5oIi4gIERvbid0IGluY2x1ZGUKLQk8c3RyaW5nLmg+LgotCSogTWFrZWZpbGUuaW46IFJlYnVpbGQgZGVwZW5kZW5jaWVzLgotCi1UaHUgTWFyIDI3IDE0OjI0OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jOiBBZGQgUFBDIDQwMyBpbnN0cnVjdGlvbnMgYW5kIGV4dGVuZGVkIG9wY29kZXMuICBGcm9tCi0JQW5kcmV3IEJyYXkgPGFuZHlAbWFkaG91c2UuZGVtb24uY28udWs+LgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgY2FzdCB3aGVuIHNldHRpbmcgbWlwc19vcGNvZGVzLgotCi1UdWUgTWFyIDI1IDIzOjA0OjAwIDE5OTcgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogIEZpeCBzaWduIGV4dGVuc2lvbiBwcm9ibGVtLgotCSogdjg1MC1vcGMuYyAoZXh0cmFjdF9kKik6ICBGaXggc2lnbiBleHRlbnNpb24gcHJvYmxlbXMgdG8gbWFrZQotCWRpc2Fzc2VtYmx5IGNhbGN1bGF0ZSBicmFuY2ggb2Zmc2V0cyBjb3JyZWN0bHkuCi0KLU1vbiBNYXIgMjQgMTM6MjI6MTMgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaDogQWRkIGJmL3MgYW5kIGJ0L3MgYXMgc3lub255bXMgZm9yIGJmLnMgYW5kIGJ0LnMuCi0KLQkqIG1pcHMtb3BjLmM6IEFkZCBkY3RyIGFuZCBkY3R3LgotCi1TdW4gTWFyIDIzIDE4OjA4OjEwIDE5OTcgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMzB2LWRpcy5jIChwcmludF9pbnNuKTogQ2hhbmdlIHRoZSB3YXkgc2lnbmVkIGNvbnN0YW50cwotCWFyZSBkaXNwbGF5ZWQuCi0KLUZyaSBNYXIgMjEgMTQ6Mzc6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQkZEX0gpOiBOZXcgdmFyaWFibGUuCi0JKEhGSUxFUyk6IE5ldyB2YXJpYWJsZS4KLQkoQ0ZJTEVTKTogQWRkIGFsbCBDIGZpbGVzLgotCSguZGVwLCAuZGVwMSwgZGVwLnNlZCwgZGVwLCBkZXAtaW4pOiBOZXcgdGFyZ2V0cy4KLQlEZWxldGUgb2xkIGRlcGVuZGVuY2llcywgYW5kIGJ1aWxkIG5ldyBvbmVzLgotCSogZGVwLWluLnNlZDogTmV3IGZpbGUuCi0KLVRodSBNYXIgMjAgMTk6MDM6MzAgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZGVkIGJsbyBhbmQgYmxve3MsYix3LGx9LgotCi1UdWUgTWFyIDE4IDE0OjE3OjAzIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYzogQ2hhbmdlICJ0cmFwIiB0byAic3lzY2FsbCIuCi0JKiBtbjEwMzAwLW9wYy5jOiBBZGQgbmV3ICJzeXNjYWxsIiBpbnN0cnVjdGlvbi4KLQotTW9uIE1hciAxNyAwODo0ODowMyAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFByb3ZpZGUgY29ycmVjdCBlbnRyaWVzIGZvciBtdWxzbCBhbmQKLSAJbXVsdWwgaW5zbnMgb24gdGhlIGNvbGRmaXJlLgotCi1TYXQgTWFyIDE1IDE3OjEzOjA1IDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYXJtLWRpcy5jIChwcmludF9pbnNuX2FybSk6IERvbid0IHByaW50IGluc3RydWN0aW9uIGJ5dGVzLgotCShwcmludF9pbnNuX2JpZ19hcm0pOiBTZXQgYnl0ZXNfcGVyX2NodW5rIGFuZCBkaXNwbGF5X2VuZGlhbi4KLQkocHJpbnRfaW5zbl9saXR0bGVfYXJtKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgMTQgMTU6MDg6NTkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JQmFzZWQgb24gcGF0Y2hlcyBmcm9tIEguSi4gTHUgPGhqbEBsdWNvbi5vcmc+OgotCSogaTM4Ni1kaXMuYyAoZmV0Y2hfZGF0YSk6IEFkZCBwcm90b3R5cGUuCi0JKiBtNjhrLWRpcy5jIChmZXRjaF9kYXRhKTogQWRkIHByb3RvdHlwZS4KLQkoZHVtbXlfcHJpbnRfYWRkcmVzcyk6IEFkZCBwcm90b3R5cGUuICBNYWtlIHN0YXRpYy4KLQkqIHBwYy1vcGMuYyAodmFsaWRfYm8pOiBBZGQgcHJvdG90eXBlLgotCSogc3BhcmMtZGlzLmMgKGJ1aWxkX2hhc2hfdGFibGUpOiBBZGQgcHJvdG90eXBlLgotCShpc19kZWxheWVkX2JyYW5jaCwgY29tcHV0ZV9hcmNoX21hc2spOiBBZGQgcHJvdG90eXBlcy4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IE1ha2Ugc2V2ZXJhbCBsb2NhbCB2YXJpYWJsZXMgY29uc3QuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IENoYW5nZSBhcmd1bWVudHMgdG8gY29uc3QgUFRSLiAgQWRkIHByb3RvdHlwZS4KLQkqIHNwYXJjLW9wYy5jIChhcmcpOiBDaGFuZ2UgbmFtZSBmaWVsZCB0byBiZSBjb25zdC4KLQkobG9va3VwX25hbWUsIGxvb2t1cF92YWx1ZSk6IEFkZCBwcm90b3R5cGVzLiAgQ2hhbmdlIHRhYmxlIGFuZAotCW5hbWUgcGFyYW1ldGVycyB0byBiZSBjb25zdC4KLQkoc3BhcmNfZW5jb2RlX2FzaSk6IENoYW5nZSBuYW1lIHBhcmFtZXRlciB0byBiZSBjb25zdC4KLQkoc3BhcmNfZW5jb2RlX21lbWJhciwgc3BhcmNfZW5jb2RlX3ByZWZldGNoKTogTGlrZXdpc2UuCi0JKHNwYXJjX2VuY29kZV9zcGFyY2xldF9jcHJlZyk6IExpa2V3aXNlLgotCShzcGFyY19kZWNvZGVfYXNpKTogQ2hhbmdlIHJldHVybiB0eXBlIHRvIGJlIGNvbnN0LgotCShzcGFyY19kZWNvZGVfbWVtYmFyLCBzcGFyY19kZWNvZGVfcHJlZmV0Y2gpOiBMaWtld2lzZS4KLQkoc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnKTogTGlrZXdpc2UuCi0KLUZyaSBNYXIgIDcgMTA6NTE6NDkgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoJChTSExJTkspKTogSnVzdCB1c2UgbG4gLXMsIG5vdCBsbiAtc2YsIHNpbmNlCi0JU29sYXJpcyBkb2Vzbid0IGxpa2UgdGhlIGNvbWJpbmVkIG9wdGlvbnMsIGFuZCB0aGUgLWYgaXMKLQl1bm5lY2Vzc2FyeS4KLQkoc3RhbXAtdHNobGluaywgaW5zdGFsbCk6IExpa2V3aXNlLgotCi1UaHUgTWFyICA2IDE2OjUxOjExIDE5OTcgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAoSU1NMTZfUENSRUwsIFNEOE5fUENSRUwsIEQxNl9TSElGVCk6IE1hcmsgdGhlc2UKLQlhcyByZWxheGFibGUuCi0KLVR1ZSBNYXIgIDQgMDY6MTA6MzYgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEZpeCBsYXN0IGNoYW5nZSBmb3IgdGhlIG1jNjgwMTAuCi0KLU1vbiBNYXIgIDMgMDc6NDU6MjAgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEFkZGVkIGVudHJpZXMgZm9yIHRoZSB0c3QgaW5zbnMgb24KLSAJdGhlIG1jNjgwMDAuCi0KLVRodSBGZWIgMjcgMTQ6MDQ6MzIgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkZWQgc3diZWdsIHBzZXVkby1pbnN0cnVjdGlvbi4KLQotVGh1IEZlYiAyNyAxMTozNjo0MSAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBTZXQgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgdG8gOC4KLQotV2VkIEZlYiAyNiAxNTozNDo0OCAxOTk3ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IERlZmluZSByMjUgcHJvcGVybHkuCi0KLVdlZCBGZWIgMjYgMTM6Mzg6MzAgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKE5FWFRTSU5HTEUsIE5FWFRET1VCTEUsIE5FWFRFWFRFTkQpOiBVc2UKLQlmbG9hdGZvcm1hdF90b19kb3VibGUgdG8gbWFrZSBwb3J0YWJsZS4KLQkocHJpbnRfaW5zbl9hcmcpOiBVc2UgTkVYVEVYVEVORCBtYWNybyB3aGVuIGV4dHJhY3RpbmcgZXh0ZW5kZWQKLQlwcmVjaXNpb24gZmxvYXQuCi0KLU1vbiBGZWIgMjQgMTk6MjY6MTIgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBJbml0aWFsaXplIG1pcHNfb3Bjb2RlcyB0byBtaXBzX2J1aWx0aW5fb3Bjb2RlcywKLQlhbmQgYmZkX21pcHNfbnVtX29wY29kZXMgdG8gYmZkX21pcHNfbnVtX2J1aWx0aW5fb3Bjb2Rlcy4KLQotTW9uIEZlYiAyNCAxNToxOTowMSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYywgZDEwdi1vcGMuYzogQ2hhbmdlIHByZV9kZWZpbmVkX3JlZ2lzdGVycyB0bwotCWQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMgYW5kIHJlZ19uYW1lX2NudCB0byBkMTB2X3JlZ19uYW1lX2NudC4KLQotTW9uIEZlYiAyNCAxNDozMzoyNiAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKExTSV9TQ0FMRUQpOiBSZW5hbWVkIGZyb20gdGhpcyAuLi4KLQkoT0ZGX1NMX0JSX1NDQUxFRCk6IC4uLiB0byB0aGlzLCBhbmQgYWRkZWQgdGhlIGZsYWcKLQlUSUM4MF9PUEVSQU5EX0JBU0VSRUwgdG8gdGhlIGZsYWdzIHdvcmQuCi0JKHRpYzgwX29wY29kZXMpOiBSZXBsYWNlIGFsbCBvY2N1cmFuY2VzIG9mIExTSV9TQ0FMRUQgd2l0aAotCU9GRl9TTF9CUl9TQ0FMRUQuCi0KLVNhdCBGZWIgMjIgMjE6MjU6MDAgMTk5NyAgRGF3biBQZXJjaGlrICA8ZGF3bkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgbWFjcm9zIGZvciBjb3AwLCBjb3AxIGNvcDIgYW5kIGNvcDMuCi0JQ2hhbmdlIG1pcHNfb3Bjb2RlcyBmcm9tIGNvbnN0IGFycmF5IHRvIGEgcG9pbnRlciwKLQlhbmQgY2hhbmdlIGJmZF9taXBzX251bV9vcGNvZGVzIGZyb20gY29uc3QgaW50IHRvIGludCwKLQlzbyB0aGF0IHdlIGNhbiBpbmNyZWFzZSB0aGUgc2l6ZSBvZiB0aGUgbWlwcyBvcGNvZGVzIHRhYmxlCi0JZHluYW1pY2FsbHkuCi0KLVNhdCBGZWIgMjIgMjE6MDM6NDcgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBSZXZlcnQgY2hhbmdlIHRvCi0Jc3RvcmUgQklUTlVNIHZhbHVlcyBpbiB0aGUgdGFibGUgaW4gb25lJ3MgY29tcGxlbWVudCBmb3JtCi0JdG8gbWF0Y2ggYmVoYXZpb3Igd2hlbiBhc3NlbWJsZXIgaXMgZ2l2ZW4gYSByYXcgbnVtZXJpYwotCXZhbHVlIGZvciBhIEJJVE5VTSBvcGVyYW5kLgotCSogdGljODAtZGlzLmMgKHByaW50X29wZXJhbmRfYml0bnVtKTogRGl0dG8uCi0KLUZyaSBGZWIgMjEgMTY6MzE6MTggMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQzMHYtb3BjLmM6IFJlbW92ZWQgcmVmZXJlbmNlcyB0byBGTEFHX1guCi0KLVdlZCBGZWIgMTkgMTQ6NTE6MjAgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbjogQWRkIGRlcGVuZGVuY2llcyBvbiAuLi9iZmQvYmZkLmggYXMgcmVxdWlyZWQuCi0KLVR1ZSBGZWIgMTggMTc6NDM6NDMgMTk5NyAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluOiBBZGRlZCBkMzB2IG9iamVjdCBmaWxlcy4KLQkqIGNvbmZpZ3VyZTogKGJmZF9kMzB2X2FyY2gpIFJlYnVpbHQuCi0JKiBjb25maWd1cmUuaW46IChiZmRfZDMwdl9hcmNoKSBBZGRlZCBuZXcgY2FzZS4KLQkqIGQzMHYtZGlzLmM6IE5ldyBmaWxlLgotCSogZDMwdi1vcGMuYzogTmV3IGZpbGUuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpIEFkZCBlbnRyeSBmb3IgZDMwdi4KLQotVHVlIEZlYiAxOCAxNjozMjowOCAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyk6IEFkZCBzeW1ib2xpYwotCXJlcHJlc2VudGF0aW9ucyBmb3IgdGhlIGZsb2F0aW5nIHBvaW50IEJJVE5VTSB2YWx1ZXMuCi0KLUZyaSBGZWIgMTQgMTI6MTQ6MDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpOiBTdG9yZSBCSVROVU0gdmFsdWVzCi0JaW4gdGhlIHRhYmxlIGluIG9uZSdzIGNvbXBsZW1lbnQgZm9ybSwgYXMgdGhleSBhcHBlYXIgaW4gdGhlCi0JYWN0dWFsIGluc3RydWN0aW9uLgotCSh0aWM4MF9zeW1ib2xfdG9fdmFsdWUpOiBVc2UgbWFjcm9zIHRvIGFjY2VzcyBwcmVkZWZpbmVkCi0Jc3ltYm9sIGZpZWxkcy4KLQkodGljODBfdmFsdWVfdG9fc3ltYm9sKTogRGl0dG8uCi0JKHRpYzgwX25leHRfcHJlZGVmaW5lZF9zeW1ib2wpOiBOZXcgZnVuY3Rpb24uCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfb3BlcmFuZF9iaXRudW0pOiBSZW1vdmUgY29kZSB0aGF0IGRpZAotCW9uZSdzIGNvbXBsZW1lbnQgZm9yIEJJVE5VTSB2YWx1ZXMuCi0KLVRodSBGZWIgMTMgMjE6NTY6NTEgMTk5NyAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogUmVtb3ZlIDggYml0IGNoYXJhY3RlcnMuICBVcGRhdGUgdG8gbGF0ZXN0Ci0JZ2NjIHJlbGVhc2UuCi0KLVRodSBGZWIgMTMgMjA6NDE6MjIgMTk5NyAgUGhpbGlwcGUgRGUgTXV5dGVyICA8cGhkbUBpbmZvLnVjbC5hYy5iZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkIHN3YmVnIHBzZXVkby1pbnN0cnVjdGlvbi4KLQotVGh1IEZlYiAxMyAxNjozMDowMiAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMgKElNTTE2X1BDUkVMKTogVGhpcyBpcyBhIHNpZ25lZCBvcGVyYW5kLgotCShJTU0yNF9QQ1JFTCk6IExpa2V3aXNlLgotCi1UaHUgRmViIDEzIDEzOjI4OjQzIDE5OTcgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfbWlwczE2X2luc25fYXJnKTogVXNlIG1lbWFkZHIgLSAyIGFzIHRoZSBiYXNlCi0JYWRkcmVzcyBmb3IgYW4gZXh0ZW5kZWQgUEMgcmVsYXRpdmUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBub3QgYQotCWJyYW5jaC4KLQotV2VkIEZlYiAxMiAxMjoyNzo0MCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9tNjhrKTogU2V0IGJ5dGVzX3Blcl9jaHVuayBhbmQKLQlieXRlc19wZXJfbGluZS4KLQotVHVlIEZlYiAxMSAxNjozNjozMSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogRml4IHR5cG8gJysnIC0+ICd8Jy4KLQkodGljODBfb3Bjb2Rlcyk6IFNvcnQgZW50cmllcyBzbyB0aGF0IGxvbmcgaW1tZWRpYXRlIGZvcm1zCi0JY29tZSBhZnRlciBzaG9ydCBpbW1lZGlhdGUgZm9ybXMsIG1ha2luZyBpdCBlYXNpZXIgZm9yCi0JYXNzZW1ibGVyIHRvIHNlbGVjdCB0aGUgcmlnaHQgb25lIGZvciBhIGdpdmVuIG9wZXJhbmQuCi0KLVR1ZSBGZWIgMTEgMTU6MjY6NDcgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChfcHJpbnRfaW5zbl9taXBzKTogU2V0IGJ5dGVzX3Blcl9jaHVuayBhbmQKLQlkaXNwbGF5X2VuZGlhbi4KLQkocHJpbnRfaW5zbl9taXBzMTYpOiBMaWtld2lzZS4KLQotTW9uIEZlYiAxMCAxMDoxMjo0MSAxOTk3ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogdGljODAtb3BjLmMgKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IENoYW5nZWQgdG8gYWNjZXB0Ci0JYSBzeW1ib2wgY2xhc3MgdGhhdCByZXN0cmljdHMgdHJhbnNsYXRpb24gdG8ganVzdCB0aGF0Ci0JY2xhc3MgKGdlbmVyYWwgcmVnaXN0ZXIsIGNvbmRpdGlvbiBjb2RlLCBldGMpLgotCi1UaHUgRmViICA2IDE3OjM0OjA5IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfb3BlcmFuZHMpOiBBZGQgUkVHXzBfRSwgUkVHXzIyX0UsCi0JYW5kIFJFR19ERVNUX0UgZm9yIHJlZ2lzdGVyIG9wZXJhbmRzIHRoYXQgaGF2ZSB0byBiZQotCWFuIGV2ZW4gbnVtYmVyZWQgcmVnaXN0ZXIuICBBZGQgUkVHX0ZQQSBmb3Igb3BlcmFuZHMgdGhhdAotCWFyZSBvbmUgb2YgdGhlIGZsb2F0aW5nIHBvaW50IGFjY3VtdWxhdG9yIHJlZ2lzdGVycy4KLQlBZGQgVElDODBfT1BFUkFORF9NQVNLIHRvIGZsYWdzIGZvciBFTkRNQVNLIG9wZXJhbmQuCi0JKHRpYzgwX29wY29kZXMpOiBDaGFuZ2UgZW50cmllcyB0aGF0IG5lZWQgZXZlbiBudW1iZXJlZAotCXJlZ2lzdGVyIG9wZXJhbmRzIHRvIHVzZSB0aGUgbmV3IG9wZXJhbmQgdGFibGUgZW50cmllcy4KLQlBZGQgIm9yIiBlbnRyaWVzIHRoYXQgYXJlIGlkZW50aWNhbCB0byAib3IudHQiIGVudHJpZXMuCi0KLVdlZCBGZWIgIDUgMTE6MTI6NDQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzMTYtb3BjLmM6IEFkZCBuZXcgY2FzZXMgb2YgZXhpdCBpbnN0cnVjdGlvbiBmb3IKLQlkaXNhc3NlbWJsZXIuCi0JKiBtaXBzLWRpcy5jIChwcmludF9taXBzMTZfaW5zbl9hcmcpOiBEaXNwbGF5IGZsb2F0aW5nIHBvaW50Ci0JcmVnaXN0ZXJzIGluIG9wZXJhbmRzIG9mIGV4aXQgaW5zdHJ1Y3Rpb24uICBQcmludCBgJCcgYmVmb3JlCi0JcmVnaXN0ZXIgbmFtZXMgaW4gb3BlcmFuZHMgb2YgZW50cnkgYW5kIGV4aXQgaW5zdHJ1Y3Rpb25zLgotCi1UaHUgSmFuIDMwIDE0OjA5OjAzIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAodGljODBfcHJlZGVmaW5lZF9zeW1ib2xzKTogVGFibGUgb2YgbmFtZS92YWx1ZQotCXBhaXJzIGZvciBhbGwgcHJlZGVmaW5lZCBzeW1ib2xzIHJlY29nbml6ZWQgYnkgdGhlIGFzc2VtYmxlci4KLQlBbHNvIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxpbmcgcm91dGluZXMuCi0JKHRpYzgwX3N5bWJvbF90b192YWx1ZSk6IE5ldyBmdW5jdGlvbi4KLQkodGljODBfdmFsdWVfdG9fc3ltYm9sKTogTmV3IGZ1bmN0aW9uLgotCSogdGljODAtZGlzLmMgKHByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciwKLSAJcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSwgcHJpbnRfb3BlcmFuZF9iaXRudW0pOgotCVJlbW92ZSBwcml2YXRlIHRhYmxlcyBhbmQgdXNlIHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCBmdW5jdGlvbi4KLQotVGh1IEphbiAzMCAxMTozMDo0NSAxOTk3ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYyAocHJpbnRfb3BlcmFuZCk6IENoYW5nZSBhZGRyZXNzIHByaW50aW5nCi0JdG8gY29ycmVjdGx5IGhhbmRsZSBQQyB3cmFwcGluZy4gIEZpeGVzIFBSMTE0OTAuCi0KLVdlZCBKYW4gMjkgMDk6Mzk6MTcgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wZXJhbmRzKTogTWFrZSA4IGFuZCAxNiBiaXQgcGMtcmVsYXRpdmUKLQlicmFuY2hlcyByZWxheGFibGUuCi0KLVR1ZSBKYW4gMjggMTU6NTc6MzQgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX21pcHMxNik6IFNldCBpbnNuX2luZm8gaW5mb3JtYXRpb24uCi0JKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IExpa2V3aXNlLgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX21pcHMxNik6IEJldHRlciBoYW5kbGluZyBvZiBhbiBleHRlbmQKLSAJb3Bjb2RlIGZvbGxvd2VkIGJ5IGFuIGluc3RydWN0aW9uIHdoaWNoIGNhbiBub3QgYmUgZXh0ZW5kZWQuCi0KLUZyaSBKYW4gMjQgMTI6MDg6MjEgMTk5NyAgSi5ULiBDb25rbGluICA8anRjQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IENoYW5nZWQgb3BlcmFuZCBzcGVjaWZpZXIgZm9yIHRoZQotIAljb2xkZmlyZSBtb3ZlYiBpbnN0cnVjdGlvbiB0byBub3QgYWxsb3cgYW4gYWRkcmVzcyByZWdpc3RlciBhcwotIAlkZXN0aW5hdGlvbi4gIEFsdGhvdWdoIHRoZSBkb2N1bWVudGF0aW9uIGRvZXMgbm90IGluZGljYXRlIHRoYXQKLQl0aGlzIGlzIGludmFsaWQsIGV4cGVyaW1lbnRzIHVuY292ZXJlZCB1bmV4cGVjdGVkIGJlaGF2aW9yLgotCUFkZGVkIGEgY29tbWVudCBleHBsYWluaW5nIHRoZSBzaXR1YXRpb24uICBUaGFua3MgdG8gQW5kcmVhcwotCVNjaHdhYiBmb3IgcG9pbnRpbmcgdGhpcyBvdXQgdG8gbWUuCi0KLVdlZCBKYW4gMjIgMjA6MTM6NTEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGNvZGVzKTogRXhwYW5kIGNvbW1lbnQgdG8gbm90ZSB0aGF0IHRoZQotIAllbnRyaWVzIGFyZSBwcmVzb3J0ZWQgc28gdGhhdCBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbW5lbW9uaWMgYXJlCi0JYWRqYWNlbnQgdG8gZWFjaCBvdGhlciBpbiB0aGUgdGFibGUuICBTb3J0IHRoZSBlbnRyaWVzIGZvciBlYWNoCi0JaW5zdHJ1Y3Rpb24gc28gdGhhdCB0aGlzIGlzIHRydWUuCi0KLU1vbiBKYW4gMjAgMTI6NDg6NTcgMTk5NyAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmM6IEluY2x1ZGUgPGxpYmliZXJ0eS5oPi4KLQkocHJpbnRfaW5zbl9tNjhrKTogU29ydCB0aGUgb3Bjb2RlIHRhYmxlIG9uIHRoZSBtb3N0IHNpZ25pZmljYW50Ci0JbmliYmxlIG9mIHRoZSBvcGNvZGUuCi0KLVNhdCBKYW4gMTggMTU6MTU6MDUgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLWRpcy5jICh0aWM4MF9vcGNvZGVzKTogQWRkICJ3cmNyIiwgInZtcHkiLCAidnJuZCIsCi0JInZzdWIiLCAidnN0IiwgInhub3IiLCBhbmQgInhvciIgaW5zdHJ1Y3Rpb25zLgotCShWX2ExKTogUmVuYW1lZCBmcm9tIFZfYSwgbXNiIG9mIGFjY3VtdWxhdG9yIHJlZyBudW1iZXIuCi0JKFZfYTApOiBBZGQgbWFjcm8sIGxzYiBvZiBhY2N1bXVsYXRvciByZWcgbnVtYmVyLgotCi1GcmkgSmFuIDE3IDE4OjI0OjMxIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IEJyb2tlIGV4Y2Vzc2l2ZWx5IGxvbmcKLQlmdW5jdGlvbiB1cCBpbnRvIHNldmVyYWwgc21hbGxlciBvbmVzIGFuZCBhcnJhbmdlZCBmb3IKLQl0aGUgaW5zdHJ1Y3Rpb24gcHJpbnRpbmcgZnVuY3Rpb24gdG8gYmUgY2FsbGFibGUgcmVjdXJzaXZlbHkKLQl0byBwcmludCB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSBib3RoIGEgbG9hZCBhbmQgYQotCW1hdGggaW5zdHJ1Y3Rpb24gcGFja2VkIGludG8gYSBzaW5nbGUgb3Bjb2RlLgotCSogdGljODAtb3BjLmMgKHRpYzgwX29wY29kZXMpOiBFeHBhbmQgY29tbWVudCBmb3IgdmxkIG9wY29kZQotCXRvIGV4cGxhaW4gd2h5IGl0IGNvbWVzIGFmdGVyIHRoZSBvdGhlciB2ZWN0b3Igb3Bjb2Rlcy4KLQotRnJpIEphbiAxNyAxNjoxOToxNSAxOTk3ICBKLlQuIENvbmtsaW4gIDxqdGNAYmVhdXR5LmN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IGFkZCBiLCB3LCBvciBsIHNwZWNpZmllciB0byBjb2xkZmlyZQotCW1vdmUgaW5zbnMgdG8gaGFuZGxlIGltbWVkaWF0ZSBvcGVyYW5kcy4KLQotVGh1IEphbiAxNyAxNjoxOTowMCAxOTk3ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogRGVsZXRlIGR1cGxpY2F0ZSBlbnRyeSBmb3IgImNtcGlsIi4KLQlmaXggb3BlcmFuZCBtYXNrIGluIHRoZSAibW92ZW1sIiBlbnRyaWVzIGZvciB0aGUgY29sZGZpcmUuCi0KLVRodSBKYW4gMTYgMjA6NTQ6NDAgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jIChWX2EsIFZfbSwgVl9TLCBWX1osIFZfcCwgT1BfViwgTUFTS19WKToKLQlOZXcgbWFjcm9zIGZvciBidWlsZGluZyB2ZWN0b3IgaW5zdHJ1Y3Rpb24gb3Bjb2Rlcy4KLQkodGljODBfb3Bjb2Rlcyk6IFJlbW92ZSBhbGwgdXNlcyBvZiBGTVRfU0ksIEZNVF9SRUcsIGFuZAotCUZNVF9MSSwgd2hpY2ggd2VyZSB1bnVzZWQuICBUaGUgZmllbGQgaXMgbm93IGEgZmxhZ3MgZmllbGQuCi0JUmVtb3ZlIHNvbWUgb3Bjb2RlcyB0aGF0IGFyZSBwb3NzaWJsZSwgYnV0IGlsbGVnYWwsIHN1Y2gKLQlhcyBsb25nIGltbWVkaWF0ZSBpbnN0cnVjdGlvbnMgd2l0aCBkb3VibGVzIGZvciBpbW1lZGlhdGUKLQl2YWx1ZXMuICBBZGQgInZhZGQiIGFuZCAidmxkIiBpbnN0cnVjdGlvbnMuCi0KLVdlZCBKYW4gMTUgMTg6NTk6NTEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IFJlb3JkZXIgc29tZSB0YWJsZSBlbnRyaWVzIHRvIG1ha2UKLQl0aGUgb3JkZXIgbW9yZSBsb2dpY2FsLiAgTW92ZSB0aGUgc2hpZnQgYWxpYXMgaW5zdHJ1Y3Rpb25zICgicm90bCIsCi0JInNobCIsICJpbnMiLCAicm90ciIsICJleHR1IiwgImV4dHMiLCAic3JsIiwgYW5kICJzcmEiIHRvIGJlCi0gCWludGVyc3BlcnNlZCB3aXRoIHRoZSByZWd1bGFyIHNyLnggYW5kIHNsLnggaW5zdHJ1Y3Rpb25zLiAgQWRkCi0JYW5kIHRlc3QgbmV3IGluc3RydWN0aW9uIG9wY29kZXMgZm9yICJzbCIsICJzbGkiLCAic3IiLCAic3JpIiwgInN0IiwKLSAJInN1YiIsICJzdWJ1IiwgInN3Y3IiLCBhbmQgInRyYXAiLgotCi1UdWUgSmFuIDE0IDE5OjQyOjUwIDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1vcGMuYyAoT0ZGX1NTX1BDKTogUmVuYW1lZCBmcm9tIE9GRl9TUy4KLQkoT0ZGX1NMX1BDKTogUmVuYW1lZCBmcm9tIE9GRl9TTC4KLQkoT0ZGX1NTX0JSKTogTmV3IG9wZXJhbmQgdHlwZSBmb3IgYmFzZSByZWxhdGl2ZSBvcGVyYW5kLgotCShPRkZfU0xfQlIpOiBOZXcgb3BlcmFuZCB0eXBlIGZvciBiYXNlIHJlbGF0aXZlIG9wZXJhbmQuCi0JKFJFR19CQVNFKTogTmV3IG9wZXJhbmQgdHlwZSBmb3IgYmFzZSByZWdpc3RlciBvcGVyYW5kLgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGFuZCB0ZXN0ICJmbXB5IiwgImZybmRtIiwgImZybmRuIiwgImZybmRwIiwKLQkiZnJuZHoiLCAiZnNxcnQiLCAiZnN1YiIsICJpbGxvcDAiLCAiaWxsb3BGIiwgImlucyIsICJqc3IiLAotCSJsZCIsICJsZC51IiwgImxtbyIsICJvciIsICJyZGNyIiwgInJtbyIsICJyb3RsIiwgYW5kICJyb3RyIgotCWluc3RydWN0aW9ucy4KLQkqIHRpYzgwLWRpcy5jIChwcmludF9pbnNuX3RpYzgwKTogUHJpbnQgb3Bjb2RlIG5hbWUgd2l0aCBmaXhlZCB3aWR0aAotIAkxMCBjaGFyIGZpZWxkLCBwYWRkZWQgd2l0aCBzcGFjZXMgb24gcmhzLCByYXRoZXIgdGhhbiBhIHN0cmluZwotIAlmb2xsb3dlZCBieSBhIHRhYi4gIFVzZSByZW5hbWVkIFRJQzgwX09QRVJBTkRfUENSRUwgZmxhZyBiaXQgcmF0aGVyCi0gCXRoYW4gb2xkIFRJQzgwX09QRVJBTkRfUkVMQVRJVkUuICBBZGQgc3VwcG9ydCBmb3IgbmV3Ci0JVElDODBfT1BFUkFORF9CQVNFUkVMIGZsYWcgYml0LgotCi1Nb24gSmFuIDEzIDE1OjU4OjU2IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFByaW50IGZsb2F0aW5nIHBvaW50IG9wZXJhbmRzCi0JYXMgZmxvYXRzLgotCSogdGljODAtb3BjLmMgKFNQRkkpOiBBZGQgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludAotCWltbWVkaWF0ZSBvcGVyYW5kIHR5cGUuCi0JKFJPVEFURSk6IEFkZCByb3RhdGUgb3BlcmFuZCB0eXBlIGZvciBzaGlmdHMuCi0JKEVORE1BU0spOiBBZGQgZm9yIHNoaWZ0cy4KLQkobik6IE1hY3JvIGZvciB0aGUgJ24nIGJpdC4KLQkoaSk6IE1hY3JvIGZvciB0aGUgJ2knIGJpdC4KLQkoUEQpOiBNYWNybyBmb3IgdGhlICdQRCcgZmllbGQuCi0JKFAyKTogTWFjcm8gZm9yIHRoZSAnUDInIGZpZWxkLgotCShQMSk6IE1hY3JvIGZvciB0aGUgJ1AxJyBmaWVsZC4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBlbnRyaWVzIGZvciAiZXh0cyIsICJleHR1IiwgImZhZGQiLAotCSJmY21wIiwgYW5kICJmZGl2Ii4KLQotTW9uIEphbiAgNiAxNTowNjo1NSAxOTk3ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogTWFzayBvZmYgdW53YW50ZWQgYml0cyBhZnRlcgotCWFkZGluZyBpbiBjdXJyZW50IGFkZHJlc3MgZm9yIHBjLXJlbGF0aXZlIG9wZXJhbmRzLgotCi1Nb24gSmFuICA2IDEwOjU2OjI1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAoUl9TQ0FMRUQpOiBBZGQgbWFjcm8gdG8gdGVzdCBmb3IgIjpzIiBtb2RpZmllciBiaXQuCi0JKHByaW50X2luc25fdGljODApOiBJZiBSX1NDQUxFRCB0aGVuIHByaW50ICI6cyIgbW9kaWZpZXIgZm9yIG9wZXJhbmQuCi0JKiB0aWM4MC1vcGMuYyAoUkVHMCwgUkVHMjIsIFJFRzI3LCBTU09GRiwgTFNPRkYpOiBOYW1lcwotCWNoYW5nZWQgdG8gUkVHXzAsIFJFR18yMiwgUkVHX0RFU1QsIE9GRl9TUywgT0ZGX1NMIHJlc3BlY3RpdmVseS4KLQkoU0lDUiwgTElDUiwgUkVHTV9TSSwgUkVHTV9MSSk6IE5hbWVzIGNoYW5nZWQgdG8gQ1JfU0ksIENSX0xJLAotCVJFR19CQVNFX01fU0ksIFJFR19CQVNFX01fTEkgcmVzcGVjdGl2ZWx5LgotCShSRUdfU0NBTEVELCBMU0lfU0NBTEVEKTogTmV3IG9wZXJhbmQgdHlwZXMuCi0JKEUpOiBOZXcgbWFjcm8gZm9yICdFJyBiaXQgYXQgYml0IDI3LgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGFuZCB0ZXN0IGRsZCwgZGxkLnUsIGRzdCwgZXN0b3AsIGFuZCBldHJhcAotCW9wY29kZXMsIGluY2x1ZGluZyB0aGUgdmFyaW91cyBzaXplIGZsYXZvcnMgKGIsaCx3LGQpIGZvcgotCXRoZSBkaXJlY3QgbG9hZCBhbmQgc3RvcmUgaW5zdHJ1Y3Rpb25zLgotCi1TdW4gSmFuICA1IDEyOjE4OjE0IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAoTV9TSSwgTV9MSSk6IEFkZCBtYWNyb3MgdG8gdGVzdCBmb3IgIjptIiBtb2RpZmllciBiaXQKLSAJaW4gYW4gaW5zdHJ1Y3Rpb24uCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IENoYW5nZSBjb21tYSBhbmQgcGFyZW4gaGFuZGxpbmcuCi0gIAlVc2UgTV9TSSBhbmQgTV9MSSBtYWNyb3MgdG8gY2hlY2sgZm9yICI6bSIgbW9kaWZpZXIgZm9yIEdQUiBvcGVyYW5kcy4KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEFkZCBSRUdNX1NJIGFuZCBSRUdNX0xJIG9wZXJhbmRzLgotCShGLCBNX1JFRywgTV9MSSwgTV9TSSwgU1pfUkVHLCBTWl9MSSwgU1pfU0ksIEQsIFMpOiBOZXcJYml0LXR3aWRkbGVycy4KLQkoTUFTS19MSV9NLCBNQVNLX1NJX00sIE1BU0tfUkVHX00pOiBSZW1vdmUgYW5kIHJlcGxhY2UgaW4gb3Bjb2RlCi0JbWFza3Mgd2l0aCAiTUFTS18qICYgfk1fKiIgdG8gZ2V0IHRoZSBNIGJpdCByZXNldC4KLQkodGljODBfb3Bjb2Rlcyk6IEFkZCBic3IsIGJzci5hLCBjbW5kLCBjbXAsIGRjYWNoZWMsIGFuZCBkY2FjaGVmLgotCi1TYXQgSmFuICA0IDE5OjA1OjA1IDE5OTcgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IFByaW50IFRJQzgwX09QRVJBTkRfUkVMQVRJVkUKLQljb3JyZWN0bHkuICBBZGQgc3VwcG9ydCBmb3IgcHJpbnRpbmcgVElDODBfT1BFUkFORF9CSVROVU0gYW5kCi0JVElDODBfT1BFUkFORF9DQywgYW5kIFRJQzgwX09QRVJBTkRfQ1Igb3BlcmFuZHMgaW4gc3ltYm9saWMKLQlmb3JtLgotCSogdGljODAtb3BjLmMgKHRpYzgwX29wZXJhbmRzKTogQWRkIFNTT0ZGLCBMU09GRiwgQklUTlVNLAotCUNDLCBTSUNSLCBhbmQgTElDUiB0YWJsZSBlbnRyaWVzLgotCSh0aWM4MF9vcGNvZGVzKTogQWRkIGFuZCB0ZXN0ICJub3AiLCAiYnIiLCAiYmJvIiwgImJieiIsCi0JImJjbmQiLCBhbmQgImJyY3IiIG9wY29kZXMuCi0KLUZyaSBKYW4gIDMgMTg6MzI6MTEgMTk5NyAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IE1ha2UgY29tbWVudCBtYXRjaCB0aGUKLQlhY3R1YWwgZmllbGRzIChubyBzaGlmdCBmaWVsZCkuCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IERvY3VtZW50IHdoeSB0aGlzIGNhbm5vdCBiZSAiY29uc3QiLgotCSogdGljODAtZGlzLmMgKHByaW50X2luc25fdGljODApOiBSZXBsYWNlIGFib3J0IHN0dWIgd2l0aCBhCi0JcGFydGlhbCBpbXBsZW1lbnRhdGlvbiwgd29yayBpbiBwcm9ncmVzcy4KLQkqIHRpYzgwLW9wYy5jICh0aWM4MF9vcGVyYW5kcyk6IEJlZ2luIGNvbnN0cnVjdGlvbiBvcGVyYW5kcyB0YWJsZS4KLQkodGljODBfb3Bjb2Rlcyk6IENvbnRpbnVlIHBvcHVsYXRpbmcgb3Bjb2RlcyB0YWJsZSBhbmQgc3RhcnQKLQlmaWxsaW5nIGluIHRoZSBvcGVyYW5kIGluZGljZXMuCi0JKHRpYzgwX251bV9vcGNvZGVzKTogQWRkIHRoaXMuCi0KLUZyaSBKYW4gIDMgMTI6MTM6NTIgMTk5NyAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBBZGQgI0IgY2FzZSBmb3IgbW92ZXEuCi0KLVRodSBKYW4gIDIgMTI6MTQ6MjkgMTk5NyAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE1ha2Ugc3VyZSBhbGwgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZAotCWJlZm9yZSB0aGV5IGFyZSB1c2VkLgotCi1UdWUgRGVjIDMxIDEyOjIwOjM4IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogUHV0IGN1cmx5LWJyYWNlcyBhcm91bmQgb3BlcmFuZHMKLQlmb3IgImJyZWFrcG9pbnQiIGluc3RydWN0aW9uLgotCi1UdWUgRGVjIDMxIDE1OjM4OjEzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKEFMTF9DRkxBR1MpOiBBZGQgLURfR05VX1NPVVJDRS4KLQkoZGVwKTogVXNlIEFMTF9DRkxBR1MgcmF0aGVyIHRoYW4gQ0ZMQUdTLgotCi1UdWUgRGVjIDMxIDE1OjA5OjE2IDE5OTYgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAoRDhfezYsN30pOiBTZXQgVjg1MF9PUEVSQU5EX0FESlVTVF9TSE9SVF9NRU1PUlkKLQlmbGFnLgotCi1Nb24gRGVjIDMwIDE3OjAyOjExIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobTY4ay1vcGMubywgYWxwaGEtb3BjLm8pOiBSZW1vdmUgZGlzLWFzbS5oIGRlcGVuZGVuY3kuCi0JKHRpYzgwLWRpcy5vLCB0aWM4MC1vcGMubyk6IEFkZCBydWxlcyBwZXIgY29tbWVudCBpbiBNYWtlZmlsZS5pbi4KLQotTW9uIERlYyAzMCAxMTozODowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMxNi1vcGMuYzogQWRkICJhYnMiLgotCi1TdW4gRGVjIDI5IDEwOjU4OjIyIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHRpYzgwLWRpcy5vIGFuZCB0aWM4MC1vcGMuby4KLQkqIGRpc2Fzc2VtYmxlLmMgKEFSQ0hfdGljODApOiBEZWZpbmUgaWYgQVJDSF9hbGwgaXMgZGVmaW5lZC4KLQkoZGlzYXNzZW1ibGVyKTogQWRkIGJmZF9hcmNoX3RpYzgwIHN1cHBvcnQgdG8gc2V0IGRpc2Fzc2VtYmxlCi0gCXRvIHByaW50X2luc25fdGljODAuCi0JKiB0aWM4MC1kaXMuYyAocHJpbnRfaW5zbl90aWM4MCk6IEFkZCBzdHViLgotCi1GcmkgRGVjIDI3IDIyOjMwOjU3IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW4gKGFyY2ggaW4gJHNlbGFyY2hzKTogQWRkIGJmZF90aWM4MF9hcmNoIGVudHJ5LgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlIHdpdGggYXV0b2NvbmYuCi0JKiB0aWM4MC1kaXMuYzogQWRkIGZpbGUuCi0JKiB0aWM4MC1vcGMuYzogQWRkIGZpbGUuCi0KLUZyaSBEZWMgMjAgMTQ6MzA6MTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6ICBBZGQgY3JbMC0xNV0sIGRwYywgZHBzdywgbGluay4KLQotTW9uIERlYyAxNiAxMzowMDoxNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3BlcmFuZHMpOiBBZGQgU0lNTTE2Ti4KLQkobW4xMDIwMF9vcGNvZGVzKTogVXNlIGl0IGZvciBzb21lIGxvZ2ljYWxzIGFuZCBidHN0IGluc25zLgotCUFkZCAiYnJlYWsiIGFuZCAidHJhcCIgaW5zdHJ1Y3Rpb25zLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBBZGQgImJyZWFrIiBpbnN0cnVjdGlvbi4KLQotCSogbW4xMDIwMC1vcGMuYzogQWRkIHBzZXVkby1vcHMgZm9yICJtb3YgKGFuKSxhbSIgYW5kICJtb3YgYW4sKGFtKSIuCi0KLVNhdCBEZWMgMTQgMjI6MzY6MjAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9taXBzMTZfaW5zbl9hcmcpOiBUaGUgYmFzZSBhZGRyZXNzIG9mIGEgUEMKLQlyZWxhdGl2ZSBsb2FkIG9yIGFkZCBub3cgZGVwZW5kcyB1cG9uIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGlzCi0JaW4gYSBkZWxheSBzbG90LgotCi1XZWQgRGVjIDExIDA5OjIzOjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1kaXMuYzogRmluaXNoIHdyaXRpbmcgZGlzYXNzZW1ibGVyLgotCSogbW4xMDIwMC1vcGMuYyAobW4xMDIwMF9vcGNvZGVzKTogRml4IG1hc2sgZm9yICJtb3YgaW1tOCxkbiIuCi0JRml4IG1hc2sgZm9yICJqbXAgKGFuKSIuCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlLCBwcmludF9pbnNuX21uMTAzMDApOiBDb3JyZW50bHkKLQloYW5kbGUgZW5kaWFubmVzcyBpc3N1ZXMgZm9yIG1uMTAzMDAuCi0KLQkqIG1uMTAyMDAtb3BjLmMgKG1uMTAyMDBfb3Bjb2Rlcyk6IEZpeCBvcGVyYW5kcyBmb3IgIm1vdmIgZG0sKGFuKSIuCi0KLVR1ZSBEZWMgMTAgMTI6MDg6MDUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wY29kZXMpOiAibW92IGltbTgsZDAiIGlzIGEgZm9ybWF0IDIKLQlpbnN0cnVjdGlvbi4gIEZpeCBvcGNvZGUgZmllbGQgZm9yICJtb3ZiIChpbW0yNCksZG4iLgotCi0JKiBtbjEwMjAwLW9wYy5jIChtbjEwMjAwX29wZXJhbmRzKTogRml4IGluc2VydGlvbiBwb3NpdGlvbgotCWZvciBESSBvcGVyYW5kLgotCi1Nb24gRGVjICA5IDE2OjQyOjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDIwMC1vcGMuYzogQ3JlYXRlIG1uMTAyMDAgb3Bjb2RlIHRhYmxlLgotCSogbW4xMDIwMC1kaXMuYzogRmxlc2ggb3V0IG1uMTAyMDAgZGlzYXNzZW1ibGVyLiAgTm90IHJlYWR5LAotCWJ1dCBtb3ZpbmcgYWxvbmcgbmljZWx5LgotCi1TdW4gRGVjICA4IDA0OjI4OjMxIDE5OTYgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6ICBBZGQgbWlwczE2LW9wYy5vLgotCi1GcmkgRGVjICA2IDE2OjQ3OjQwIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0ByaGluby5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBSZXZlcnQgY2hhbmdlIHRvIHVzZSA8IGFuZCA+Ci0Jc3BlY2lmaWVycyBmb3IgZm1vdmVtKiBpbnN0cnVjdGlvbnMuCi0KLUZyaSBEZWMgIDYgMTQ6NDg6MDkgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jIChkaXNhc3NlbWJsZSk6IFJlbW92ZSAnJCcgcmVnaXN0ZXIgcHJlZml4aW5nLgotCi1GcmkgRGVjICA2IDE3OjM0OjM5IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwczE2LW9wYy5jOiBDaGFuZ2Ugb3Bjb2RlIGZvciBlbnRyeS9leGl0IHRvIGF2b2lkIGNvbmZsaWN0aW5nCi0Jd2l0aCBkc3JsLgotCi1GcmkgRGVjICA2IDE0OjQ4OjA5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYzogQWRkIHNvbWUgY29tbWVudHMgZXhwbGFpbmluZyB0aGUgdmFyaW91cwotIAlvcGVyYW5kcyBhbmQgc3VjaC4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBGaXggbWlub3IgZ2NjIC1XYWxsIHdhcm5pbmdzLgotCi1UaHUgRGVjICA1IDEyOjA5OjQ4IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3IDwgYW5kID4gb3BlcmFuZAotCXNwZWNpZmllcnMuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IFNpbXBsaWZ5IHRhYmxlIGJ5IHVzaW5nIDwgYW5kID4KLQlvcGVyYW5kIHNwZWNpZmllcnMgaW4gZm1vdm0qIGluc3RydWN0aW9ucy4KLQotV2VkIERlYyAgNCAxNDo1MjoxOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoaW5zZXJ0X2xpKTogR2l2ZSBhbiBlcnJvciBpZiB0aGUgb2Zmc2V0IGhhcyB0aGUgdHdvCi0JbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBzZXQuCi0KLVdlZCBOb3YgMjcgMTM6MDk6MDEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX21pcHMxNik6IFNlcGFyYXRlIHRoZSBpbnN0cnVjdGlvbiBmcm9tCi0JdGhlIGFyZ3VtZW50cyB3aXRoIGEgdGFiLCBub3QgYSBzcGFjZS4KLQotVHVlIE5vdiAyNiAxMzoyNDoxNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2FzZW1ibGUpOiBGaW5pc2ggY29udmVyc2lvbiB0byAnJCcgYXMKLQlyZWdpc3RlciBwcmVmaXguCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZpZWxkIGZvcgotCW1vdiBhbSwoaW1tMzIsc3ApLgotCi1UdWUgTm92IDI2IDEwOjUzOjIxIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlOiBSZWJ1aWxkIHdpdGggYXV0b2NvbmYgMi4xMi4KLQotCUFkZCBzdXBwb3J0IGZvciBtaXBzMTYgKDE2IGJpdCBNSVBTIGltcGxlbWVudGF0aW9uKToKLQkqIG1pcHMxNi1vcGMuYzogTmV3IGZpbGUuCi0JKiBtaXBzLWRpcy5jOiBJbmNsdWRlICJlbGYtYmZkLmgiIGFuZCAiZWxmL21pcHMuaCIuCi0JKG1pcHMxNl9yZWdfbmFtZXMpOiBOZXcgc3RhdGljIGFycmF5LgotCShwcmludF9pbnNuX2JpZ19taXBzKTogVXNlIHByaW50X2luc25fbWlwczE2IGluIDE2IGJpdCBtb2RlIG9yCi0JYWZ0ZXIgc2VlaW5nIGEgMTYgYml0IHN5bWJvbC4KLQkocHJpbnRfaW5zbl9saXR0bGVfbWlwcyk6IExpa2V3aXNlLgotCShwcmludF9pbnNuX21pcHMxNik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKHByaW50X21pcHMxNl9pbnNuX2FyZyk6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKiBtaXBzLW9wYy5jOiBBZGQgamFseCBpbnN0cnVjdGlvbi4KLQkqIE1ha2VmaWxlLmluIChtaXBzMTYtb3BjLm8pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBVc2UgbWlwczE2LW9wYy5vIGZvciBiZmRfbWlwc19hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1Nb24gTm92IDI1IDE2OjE1OjE3IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBTaW1wbGlmeSB0YWJsZSBieSB1c2luZyA8IGFuZCA+Ci0gCW9wZXJhbmQgc3BlY2lmaWVycyBpbiAqc2F2ZSwgKnJlc3RvcmUgYW5kIG1vdmVtKiBpbnN0cnVjdGlvbnMuCi0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IEZpeCBtb3ZlIGFuZCBtb3ZlbSBpbnN0cnVjdGlvbnMgZm9yCi0gCXRoZSBjb2xkZmlyZS4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogVGhlIGNvbGRmaXJlIChtY2Y1MjAwKSBjYW4gb25seSB1c2UKLSAJcmVnaXN0ZXIgb3BlcmFuZHMgZm9yIGltbWVkaWF0ZSBhcml0aG1ldGljLCBub3QsIG5lZywgbmVneCwgYW5kCi0Jc2V0IGFjY29yZGluZyB0byBjb25kaXRpb24gaW5zdHJ1Y3Rpb25zLgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBDb25zaXN0YW50bHkgVXNlICJzIiBhcyB0aGUgc3RvcmFnZQotIAlzcGVjaWZpZXIgb2YgdGhlIGVmZmVjdGl2ZS1hZGRyZXNzIG9wZXJhbmQgaW4gaW1tZWRpYXRlIGZvcm1zIG9mCi0gCWFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zLiAgVGhlIHNwZWNpZmllciBmb3IgdGhlIGltbWVkaWF0ZSBvcGVyYW5kCi0gCW5vdGVzIGhvdyBhbmQgd2hlcmUgdGhlIGNvbnN0YW50IHdpbGwgYmUgc3RvcmVkLgotCi1Nb24gTm92IDI1IDExOjE3OjAxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogUmVtb3ZlIHJlZHVuZGFudCAibGNjIgotCW9wY29kZS4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBVc2UgJyQnIGluc3RlYWQgb2YgJyUnIGZvcgotCXJlZ2lzdGVyIHByZWZpeC4KLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBQcmVmaXggcmVnaXN0ZXJzIHdpdGggJyUnLgotCi1XZWQgTm92IDIwIDEwOjM3OjEzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1kaXMuYyAoZGlzYXNzZW1ibGUpOiBIYW5kbGUgcmVnaXN0ZXIgbGlzdHMuCi0KLQkqIG1uMTAzMDAtb3BjLmM6IEZpeCBoYW5kbGluZyBvZiByZWdpc3RlciBsaXN0IG9wZXJhbmQgZm9yCi0JImNhbGwiLCAicmV0IiwgYW5kICJyZXRzIiBpbnN0cnVjdGlvbnMuCi0KLQkqIG1uMTAzMDAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogUHJpbnQgUEMtcmVsYXRpdmUgYW5kIG1lbW9yeQotCWFkZHJlc3NlcyBzeW1ib2xpY2FsbHkgaWYgcG9zc2libGUuCi0JKiBtbjEwMzAwLW9wYy5jOiBEaXN0aW5ndWlzaCBiZXR3ZWVuIGFic29sdXRlIG1lbW9yeSBhZGRyZXNzZXMsCi0JcGMtcmVsYXRpdmUgb2Zmc2V0cyAmIHJhbmRvbSBpbW1lZGlhdGVzLgotCi0JKiBtbjEwMzAwLWRpcy5jIChwcmludF9pbnNuX21uMTAzMDApOiBGaXggZmV0Y2ggb2YgbGFzdCBieXRlCi0JaW4gNyBieXRlIGluc25zLgotCShkaXNhc3NlbWJsZSk6IEhhbmRsZSBTUExJVCBhbmQgRVhURU5ERUQgb3BlcmFuZHMuCi0KLVR1ZSBOb3YgMTkgMTM6MzM6MDEgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLWRpcy5jOiBSb3VnaCBjdXQgYXQgcHJpbnRpbmcgc29tZSBvcGVyYW5kcy4KLQotCSogbW4xMDMwMC1kaXMuYzogU3RhcnQgd29ya2luZyBvbiBkaXNhc3NlbWJsZXIgc3VwcG9ydC4KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCBtYXNrcyBvbiBzZXZlcmFsIGluc25zLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQWRkICJSRUdTIiBmb3IgYSByZWdpc3RlcgotCWxpc3QuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBSRUdTIGZvciByZWdpc3RlciBsaXN0IGluICJtb3ZtIiBpbnN0cnVjdGlvbnMuCi0KLU1vbiBOb3YgMTggMTU6MjA6MzUgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBBZGQzIHNldHMgdGhlIGNhcnJ5LgotCi1GcmkgTm92IDE1IDEzOjQzOjE5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRGVtYW5kIHBhcmVucyBhcm91bmQKLQlyZWdpc3RlciBhcmd1bWVudCBpcyBjYWxscyBhbmQgam1wIGluc3RydWN0aW9ucy4KLQotVGh1IE5vdiAgNyAwMDoyNjowNSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IFVzZSBETjAxIGZvciBwdXR4IGFuZAotCWdldHggb3BlcmFuZC4gIEZpeCBvcGNvZGUgZm9yIG11bHF1IGltbSxkbi4KLQotV2VkIE5vdiAgNiAxMzo0MjozMiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBIaWphY2sgImJpdHMiIGZpZWxkCi0JaW4gTU4xMDMwMF9PUEVSQU5EX1NQTElUIG9wZXJhbmRzIGZvciBob3cgbWFueSBiaXRzCi0JYXBwZWFyIGluIHRoZSBiYXNpYyBpbnNuIHdvcmQuICBBZGQgSU1NMzJfSElHSDI0LAotCUlNTTMyX0hJR0gyNF9MT1dTSElGVDgsIElNTThFX1NISUZUOC4KLQkobW4xMDMwMF9vcGNvZGVzKTogVXNlIG5ldyBvcGVyYW5kcyBhcyBuZWVkZWQuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBBZGQgSU1NMzJfTE9XU0hJRlQ4Ci0JZm9yIGJzZXQsIGJjbHIsIGJ0c3QgaW5zdHJ1Y3Rpb25zLgotCShtbjEwMzAwX29wY29kZXMpOiBVc2UgbmV3IElNTTMyX0xPV1NISUZUOCBhcyBuZWVkZWQuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBSZW1vdmUgbWFueSByZWR1bmRhbnQKLQlvcGVyYW5kcy4gIFVwZGF0ZSBvcGNvZGUgdGFibGUgYXMgYXBwcm9wcmlhdGUuCi0JKElNTTMyKTogQWRkIE1OMTAzMDBfT1BFUkFORF9TUExJVCBmbGFnLgotCShtbjEwMzAwX29wY29kZXMpOiBGaXggc2luZ2xlIGJpdCBlcnJvciBpbiBtb3YgaW1tMzIsZG4gaW5zbi4KLQotVHVlIE5vdiAgNSAxMzoyNjo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBBZGQgRE4yLCBETTIsIEFOMiwgQU0yCi0Jb3BlcmFuZHMgKGZvciBpbmRleGVkIGxvYWQvc3RvcmVzKS4gIEZpeCBiaXRwb3MgZm9yIERJCi0Jb3BlcmFuZC4gIEFkZCBTTjhOX1NISUZUOCwgSU1NOF9TSElGVDgsIGFuZCBEMTZfU0hJRlQgZm9yIHRoZQotCWZldyBpbnN0cnVjdGlvbnMgdGhhdCBpbnNlcnQgaW1tZWRpYXRlcy9kaXNwbGFjZW1lbnRzIGluIHRoZQotCW1pZGRsZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBBZGQgSU1NOEUgZm9yIDggYml0IGltbWVkaWF0ZSBpbgotCXRoZSBleHRlbmRlZCBwYXJ0IG9mIGFuIGluc3RydWN0aW9uLgotCShtbjEwMzAwX29wZXJhbmRzKTogVXNlIG5ldyBvcGNvZGVzIGFzIGFwcHJvcHJpYXRlLgotCi1UdWUgTm92ICA1IDEwOjMwOjUxIDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jIChkMTB2X29wY29kZXMpOiBEZWNsYXJlIHRoZSB0cmFwIGluc3RydWN0aW9uCi0gCXNlcXVlbnRpYWwgc28gdGhlIGFzc2VtYmxlciBuZXZlciBwYXJhbGxlbGl6ZXMgaXQgd2l0aAotCW90aGVyIGluc3RydWN0aW9ucy4KLQotTW9uIE5vdiAgNCAxMjo1MDo0MCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3BlcmFuZHMpOiBBZGQgRE4wMSBhbmQgQU4wMSBmb3IKLQlhIGRhdGEvYWRkcmVzcyByZWdpc3RlciB0aGF0IGFwcGVhcnMgaW4gcmVnaXN0ZXIgZmllbGQgMAotCWFuZCByZWdpc3RlciBmaWVsZCAxLgotCShtbjEwMzAwX29wY29kZXMpOiBVc2UgRE4wMSBhbmQgQU4wMSBmb3IgbW92L2NtcCBpbW04LEROL0FOCi0KLUZyaSBOb3YgIDEgMTA6Mjk6MTEgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogVXNlIG5ldyBOT1BBTCBtYXNrIGZvcgotCXN0YW5kYXJkIGRpc2Fzc2VtYmx5LgotCi0JKiBhbHBoYS1vcGMuYyAoYWxwaGFfb3BlcmFuZHMpOiBSZWFycmFuZ2UgZmxhZ3Mgc2xvdC4KLQkoYWxwaGFfb3Bjb2Rlcyk6IEFkZCBuZXcgQldYLCBDSVgsIGFuZCBNQVggaW5zdHJ1Y3Rpb25zLgotCVJlY2F0ZWdvcml6ZSBQQUxjb2RlIGluc3RydWN0aW9ucy4KLQotV2VkIE9jdCAzMCAxNjo0Njo1OCAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCByZWxheGluZyAiamJyIi4KLQotVHVlIE9jdCAyOSAxNjozMDoyOCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBEb24ndCBwcmludCBhIHRyYWlsaW5nIHRhYiBpZgotCXRoZXJlIGFyZSBubyBvcGVyYW5kIHR5cGVzLgotCi1UdWUgT2N0IDI5IDEyOjIyOjIxIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAoRDlfUkVMQVgpOiBSZW5hbWVkIGZyb20gRDksIGFsbCByZWZlcmVuY2VzCi0JY2hhbmdlZC4KLQkodjg1MF9vcGVyYW5kcyk6IE1ha2Ugc3VyZSBEMjIgaW1tZWRpYXRlbHkgZm9sbG93cyBEOV9SRUxBWC4KLQotRnJpIE9jdCAyNSAxMjoxMjo1MyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25feDg2KTogU2V0IGluZm8tPmJ5dGVzX3Blcl9saW5lIHRvIDUuCi0KLVRodSBPY3QgMjQgMTc6NTM6NTIgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDhfNik6IEZpeCBvcGVyYW5kIGluc2VydGlvbiBmb3Igc2xkLncKLQlhbmQgc3N0LncgaW5zdHJ1Y3Rpb25zLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBBZGQgImpDQyIgaW5zdHJ1Y3Rpb25zIChhbGlhc2VzIGZvcgotCSJiQ0MiaW5zdHJ1Y3Rpb25zKS4KLQotVGh1IE9jdCAyNCAxNzoyMToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBVc2UgYSB0YWIgYmV0d2VlbiB0aGUgaW5zdHJ1Y3Rpb24KLQlhbmQgdGhlIGFyZ3VtZW50cy4KLQotVHVlIE9jdCAyMiAyMzozMjo1NiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoUFBDUFdSMik6IERlZmluZS4KLQkocG93ZXJwY19vcGNvZGVzKTogVXNlIFBQQ1BXUjIgZm9yIGZzcXJ0LCByYXRoZXIgdGhhbiBkdXBsaWNhdGluZwotCWl0LgotCi1GcmkgT2N0IDExIDE2OjAzOjQ5IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IHR5cG8gaW4gb3Bjb2RlCi0JZmllbGQgZm9yIG1vdmh1IGluc3RydWN0aW9uLgotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IEZvciBWODUwX09QRVJBTkRfU0lHTkVEIG9wZXJhbmRzLAotCWNhc3QgdmFsdWUgdG8gImxvbmciIG5vdCAic2lnbmVkIGxvbmciIHRvIGtlZXAgaHB1eDEwCi0JY29tcGlsZXIgcXVpZXQuCi0KLVRodSBPY3QgMTAgMTA6MjU6NTggMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBGaXggdHlwbyBpbiBvcGNvZGUgZmllbGQKLQlmb3IgbW92IChhYnMxNiksRE4uCi0KLQkqIG1uMTAzMDAtb3BjLmMgKEZNVCopOiBSZW1vdmUgZGVmaW5pdGlvbnMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IEZpeCBkZXN0aW5hdGlvbiByZWdpc3RlcgotCWZvciBzaGlmdC1ieS1yZWdpc3RlciBvcGNvZGVzLgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wZXJhbmRzKTogQnJlYWsgRE4sIERNLCBBTiwgQU0KLQlpbnRvIFtBRF1bTU5dWzAxXSBmb3IgZW5jb2RpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSByZWdpc3RlcgotCWluIHRoZSBvcGNvZGUuCi0KLVdlZCBPY3QgIDkgMTE6MTk6MjYgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBBZGQgImV4dGVuZGVkIiBpbnN0cnVjdGlvbnMsCi0JInB1dHgiLCAiZ2V0eCIsICJtdWxxIiwgIm11bHF1IiwgInNhdDE2IiwgInNhdDI0IiwgImJzY2giLgotCi1UdWUgT2N0ICA4IDExOjU1OjM1IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGVyYW5kcyk6IFJlbW92ZSAiUkVHUyIgb3BlcmFuZC4KLQlGaXggdmFyaW91cyB0eXBvcy4gIEFkZCAiUEFSRU4iIG9wZXJhbmQuCi0JKE1FTSwgTUVNMik6IERlZmluZS4KLQkobW4xMDMwMF9vcGNvZGVzKTogU3Vycm91bmQgYWxsIG1lbW9yeSBhZGRyZXNzZXMgd2l0aCAiUEFSRU4iCi0Jb3BlcmFuZHMuICBGaXggc2V2ZXJhbCB0eXBvcy4KLQotCSogbW4xMDMwMC1vcGMuYyAobW4xMDMwMF9vcGNvZGVzKTogRml4IHR5cG9zIGluIHllc3RlcmRheSdzCi0JY2hhbmdlcy4KLQotTW9uIE9jdCAgNyAxNjo0ODo0NSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTAzMDAtb3BjLmMgKEZNVF9YWCk6IFJlbnVtYmVyIHN0YXJ0aW5nIGF0IG9uZS4KLQkobW4xMDMwMF9vcGVyYW5kcyk6IFJvdWdoIGN1dC4gIEVub3VnaCB0byBwYXJzZSAibW92IiBpbnN0cnVjdGlvbnMKLQlhdCB0aGlzIHRpbWUuCi0JKG1uMTAzMDBfb3Bjb2Rlcyk6IEJyZWFrIG9wY29kZSBmb3JtYXQgb3V0IGludG8gaXRzIG93biBmaWVsZC4KLQlVcGRhdGUgbWFueSBvcGVyYW5kIGZpZWxkcyB0byBkZWFsIHdpdGggc2lnbmVkIHZzIHVuc2lnbmVkCi0JaXNzdWVzLiAgRml4IG9uZSBvciB0d28gdHlwb3MgaW4gdGhlICJtb3YiIGluc3RydWN0aW9uCi0Jb3Bjb2RlLCBtYXNrIGFuZC9vciBvcGVyYW5kIGZpZWxkcy4KLQotTW9uIE9jdCAgNyAxMTozOTo0OSAxOTk2ICBBbmRyZWFzIFNjaHdhYiAgPHNjaHdhYkBpc3Nhbi5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT4KLQotCSogbTY4ay1vcGMuYyAocGx1c2hhKTogUHJlZmVyIGVuY29kaW5nIGZvciBtNjgwNDB1cCwgaW4gY2FzZQotCW02ODg1MSB3YXNuJ3QgcmVzZXQuCi0KLVRodSBPY3QgIDMgMTc6MTc6MDIgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtbjEwMzAwLW9wYy5jIChtbjEwMzAwX29wY29kZXMpOiBBZGQgb3Bjb2RlICYgbWFza3MgZm9yCi0JYWxsIG9wY29kZXMuICBWZXJ5IHJvdWdoIGN1dCBhdCBvcGVyYW5kcyBmb3IgYWxsIG9wY29kZXMuCi0KLQkqIG1uMTAzMDAtb3BjLmMgKG1uMTAzMDBfb3Bjb2Rlcyk6IFN0YXJ0IGZsZXNoaW5nIG91dCB0aGUKLQlvcGNvZGUgdGFibGUuCi0KLVRodSBPY3QgIDMgMTA6MDY6MDcgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBtbjEwMjAwLW9wYy5jLCBtbjEwMzAwLW9wYy5jOiBOZXcgZmlsZXMuCi0JKiBtbjEwMjAwLWRpcy5jLCBtbjEwMzAwLWRpcy5jOiBOZXcgZmlsZXMuCi0JKiBtbjEweDAwLW9wYy5jLCBtbjEweDAwLWRpcy5jOiBEZWxldGVkLgotCSogZGlzYXNzZW1ibGUuYzogQnJlYWsgbW4xMHgwMCBzdXBwb3J0IGludG8gMTAyMDAgYW5kIDEwMzAwCi0Jc3VwcG9ydC4KLQkqIGNvbmZpZ3VyZS5pbjogTGlrZXdpc2UuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0KLVRodSBPY3QgIDMgMTU6NTk6MTIgMTk5NiAgSmFzb24gTW9sZW5kYSAgKGNyYXNoQGdvZHppbGxhLmN5Z251cy5jby5qcCkKLQotCSogTWFrZWZpbGUuaW4gKE1PU1RMWUNMRUFOKTogTW92ZSBjb25maWcubG9nIHRvIGRpc3RjbGVhbi4KLQotV2VkIE9jdCAgMiAyMzoyODo0MiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIG1uMTB4MDAtb3BjLmMsIG1uMTB4MDAtZGlzLmM6IE5ldyBmaWxlcyBmb3IgTWF0c3VzaGl0YQotCU1OMTB4MDAgcHJvY2Vzc29ycy4KLQkqIGRpc2Fzc2VtYmxlIChBUkNIX21uMTB4MDApOiBEZWZpbmUuCi0JKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBiZmRfYXJjaF9tbjEweDAwLgotCSogY29uZmlndXJlLmluOiBSZWNvZ25pemUgYmZkX21uMTB4MDBfYXJjaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotVHVlIE9jdCAgMSAxMDo0OToxMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKG9wX3J0bik6IENoYW5nZSB0byBiZSBhIHBvaW50ZXIuICBBZGp1c3QgdXNlcwotCWFjY29yZGluZ2x5LiAgRG9uJ3QgZGVjbGFyZSBmdW5jdGlvbnMgdXNpbmcgb3BfcnRuLgotCi1GcmkgU2VwIDI3IDE4OjI4OjU5IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogIEFkZCBtZW1hZGRyIGFyZ3VtZW50LiAgUmUtYXJyYW5nZQotCXBhcmFtcyB0byBiZSBtb3JlIHN0YW5kYXJkLgotCSogKGRpc2Fzc2VtYmxlKTogIFByaW50IGFic29sdXRlIGFkZHJlc3NlcyBhbmQgc3ltYm9saWMgbmFtZXMgZm9yCi0JYnJhbmNoIGFuZCBqdW1wIHRhcmdldHMuCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmQpOiAgQWRkIGRpc3BsYWNlbWVudCBmbGFnIHRvIDkgYW5kIDIyCi0JYml0IG9wZXJhbmRzLgotCSogKHY4NTBfb3Bjb2Rlcyk6ICBBZGQgYnJlYWtwb2ludCBpbnNuLgotCi1Nb24gU2VwIDIzIDEyOjMyOjI2IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYzogTW92ZSB0aGUgZm1vdmVteCBkYXRhIHJlZ2lzdGVyIGNhc2VzIGJlZm9yZSB0aGUKLSAJb3RoZXIgY2FzZXMsIHNvIHRoYXQgdGhleSBnZXQgcmVjb2duaXplZCBiZWZvcmUgdGhlIGRhdGEgcmVnaXN0ZXIKLSAJZG9lcyBnZXRzIHRyZWF0ZWQgYXMgYSBkZWdlbmVyYXRlIHJlZ2lzdGVyIGxpc3QuCi0KLVR1ZSBTZXAgMTcgMTI6MDY6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jOiBBZGQgYSBjYXNlIGZvciAiZGl2IiBhbmQgImRpdnUiIHdpdGggdHdvIHJlZ2lzdGVycwotCWFuZCBhIGRlc3RpbmF0aW9uIG9mICQwLgotCi1UdWUgU2VwIDEwIDE2OjEyOjM5IDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBydGwuY3lnbnVzLmNvbT4KLQotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBBZGQgcHJvdG90eXBlLgotCShfcHJpbnRfaW5zbl9taXBzKTogRGl0dG8uCi0KLU1vbiBTZXAgIDkgMTQ6MjY6MjYgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IFByaW50IGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVycyBhcwotIAkkZmNjTi4KLQotVHVlIFNlcCAgMyAxMjowOTo0NiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEFkZCBzZXR1dywgc2V0c3csIHNldHguCi0KLVR1ZSBTZXAgIDMgMTI6MDU6MjUgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLWRpcy5jIChkaXNhc3NlbWJsZSk6IE1ha2Ugc3RhdGljLiAgUHJvdmlkZSBwcm90b3R5cGUuCi0KLVN1biBTZXAgIDEgMjI6MzA6NDAgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDksIGluc2VydF9kMjIpOiBGaXggYm91bmRhcnkgY2FzZQotCWluIHJhbmdlIGNoZWNrcy4KLQotU2F0IEF1ZyAzMSAwMToyNzoyNiAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtZGlzLmMgKGRpc2Fzc2VtYmxlKTogSGFuZGxlIGluc2VydGlvbiBvZiAnLCcsICdbJyBhbmQKLQknXScgY2hhcmFjdGVycyBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtLgotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzOiBSZW1vdmUgc2l6ZSBmaWVsZCBmcm9tIGFsbCBvcGNvZGVzLgotCUFkZCAibWVtb3AiIGZpZWxkIHRvIGFsbCBvcGNvZGVzIChmb3IgdGhlIGRpc2Fzc2VtYmxlcikuCi0JUmVvcmRlciBvcGNvZGVzIHNvIHRoYXQgIm5vcCIgY29tZXMgYmVmb3JlICJtb3YiIGFuZCAianIiCi0JY29tZXMgYmVmb3JlICJqYXJsIi4KLQotCSogdjg1MC1kaXMuYyAocHJpbnRfaW5zbl92ODUwKTogRml4IHR5cG8gaW4gbGFzdCBjaGFuZ2UuCi0KLQkqIHY4NTAtZGlzLmMgKHByaW50X2luc25fdjg1MCk6IFByb3Blcmx5IGhhbmRsZSBkaXNhc3NlbWJsaW5nCi0JYSB0d28gYnl0ZSBpbnNuIGF0IHRoZSBlbmQgb2YgYSBtZW1vcnkgcmVnaW9uIHdoZW4gdGhlIG1lbW9yeQotCXJlZ2lvbidzIHNpemUgaXMgb25seSB0d28gYnl0ZSBhbGlnbmVkLgotCi0JKiB2ODUwLWRpcy5jICh2ODUwX2NjX25hbWVzKTogRml4IHN0dXBpZCB0aGlua29zLgotCi0JKiB2ODUwLWRpcy5jICh2ODUwX3JlZ19uYW1lcyk6IERlZmluZS4KLQkodjg1MF9zcmVnX25hbWVzLCB2ODUwX2NjX25hbWVzKTogTGlrZXdpc2UuCi0JKGRpc2Fzc2VtYmxlKTogVmVyeSByb3VnaCBjdXQgYXQgcHJpbnRpbmcgb3BlcmFuZHMgKHVuZm9ybWF0dGVkKS4KLQotCSogdjg1MC1vcGMuYyAoQk9QX01BU0spOiBGaXguCi0JKHY4NTBfb3Bjb2Rlcyk6IEZpeCBtYXNrIGZvciBqYXJsIGFuZCBqci4KLQotCSogdjg1MC1kaXMuYzogTmV3IGZpbGUuICBTa2VsZXRvbiBmb3IgZGlzYXNzZW1ibGVyIHN1cHBvcnQuCi0JKiBNYWtlZmlsZS5pbiBSZW1vdmUgdjg1MCByZWZlcmVuY2VzLCB0aGV5J3JlIG5vdCBuZWVkZWQgaGVyZS4KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIHY4NTAtZGlzLm8gd2hlbiBidWlsZGluZyB2ODUwIHRvb2xjaGFpbnMuCi0JKiBjb25maWd1cmU6IFJlYnVpbHQuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBDYWxsIHY4NTAgZGlzYXNzZW1ibGVyLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDhfNywgZXh0cmFjdF9kOF83KTogTmV3IGZ1bmN0aW9ucy4KLQkoaW5zZXJ0X2Q4XzYsIGV4dHJhY3RfZDhfNik6IE5ldyBmdW5jdGlvbnMuCi0JKHY4NTBfb3BlcmFuZHMpOiBSZW5hbWUgRDdTIHRvIEQ3OyBvcGVyYW5kIGZvciBENyBpcyB1bnNpZ25lZC4KLQlSZW5hbWUgRDggdG8gRDhfNywgdXNlIHtpbnNlcnQsZXh0cmFjdH1fZDhfNyByb3V0aW5lcy4KLQlBZGQgRDhfNi4KLQkoSUY0QSwgSUY0Qik6IFVzZSAiRDciIGluc3RlYWQgb2YgIkQ3UyIuCi0JKElGNEMsIElGNEQpOiBVc2UgIkQ4XzciIGluc3RlYWQgb2YgIkQ4Ii4KLQkoSUY0RSwgSUY0Rik6IE5ldy4gIFVzZSAiRDhfNiIuCi0JKHY4NTBfb3Bjb2Rlcyk6IFVzZSBJRjRBL0lGNEIgZm9yIHNsZC5iL3NzdC5iLiAgVXNlIElGNEMvSUY0RCBmb3IKLQlzbGQuaC9zc3QuaC4gIFVzZSBJRjRFL0lGNEYgZm9yIHNsZC53L3NzdC53LgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDE2XzE1LCBleHRyYWN0X2QxNl8xNSk6IE5ldyBmdW5jdGlvbnMuCi0JKHY4NTBfb3BlcmFuZHMpOiBDaGFuZ2UgRDE2IHRvIEQxNl8xNSwgdXNlIHNwZWNpYWwgaW5zZXJ0L2V4dHJhY3QKLQlyb3V0aW5lcy4gIE5ldyBuZXcgRDE2IHRoYXQgdXNlcyB0aGUgZ2VuZXJpYyBpbnNlcnQvZXh0cmFjdCBjb2RlLgotCShJRjdBLCBJRjdCKTogVXNlIEQxNl8xNS4KLQkoSUY3QywgSUY3RCk6IE5ldy4gIFVzZSBEMTYuCi0JKHY4NTBfb3Bjb2Rlcyk6IFVzZSBJRjdDIGFuZCBJRjdEIGZvciBsZC5iIGFuZCBzdC5iLgotCi0JKiB2ODUwLW9wYy5jIChpbnNlcnRfZDksIGluc2VydF9kMjIpOiBTbGlnaHRseSBpbXByb3ZlIGVycm9yCi0JbWVzc2FnZS4gIElzc3VlIGFuIGVycm9yIGlmIHRoZSBicmFuY2ggb2Zmc2V0IGlzIG9kZC4KLQotCSogdjg1MC1vcGMuYzogQWRkIG5vdGVzIGFib3V0IG5lZWRpbmcgc3BlY2lhbCBpbnNlcnQvZXh0cmFjdAotCWZvciBhbGwgdGhlIGxvYWQvc3RvcmUgaW5zbnMsIGV4Y2VwdCAibGQuYiIgYW5kICJzdC5iIi4KLQotCSogdjg1MC1vcGMuYyAoaW5zZXJ0X2QyMiwgZXh0cmFjdF9kMjIpOiBOZXcgZnVuY3Rpb25zLgotCSh2ODUwX29wZXJhbmRzKTogVXNlIGluc2VydF9kMjIgYW5kIGV4dHJhY3RfZDIyIGZvcgotCUQyMiBvcGVyYW5kcy4KLQkoaW5zZXJ0X2Q5KTogRml4IHJhbmdlIGNoZWNrLgotCi1GcmkgQXVnIDMwIDE4OjAxOjAyIDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BoaXBwby5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkIFY4NTBfT1BFUkFORF9TSUdORUQgZmxhZwotCWFuZCBzZXQgYml0cyBmaWVsZCB0byBEOSBhbmQgRDIyIG9wZXJhbmRzLgotCi1UaHUgQXVnIDI5IDExOjEwOjQ2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IERlZmluZSBTUjIgb3BlcmFuZC4KLQkodjg1MF9vcGNvZGVzKTogImxkc3IiIHVzZXMgUjEsU1IyLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggb3Bjb2RlIHNwZWNzIGZvcgotCXNsZC53LCBzc3QuYiwgc3N0LmgsIHNzdC53LCBhbmQgbm9wLgotCi1XZWQgQXVnIDI4IDE1OjU1OjQzIDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQWRkIG51bGwgb3Bjb2RlIHRvIG1hcmsgdGhlCi0JZW5kIG9mIHRoZSBvcGNvZGUgdGFibGUuCi0KLU1vbiBBdWcgMjYgMTM6MzU6NTMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6IEFkZGVkIHJlZ2lzdGVyIHBhaXJzLAotCSJyMC1yMSIsICJyMi1yMyIsIGV0Yy4KLQotRnJpIEF1ZyAyMyAwMDoyNzowMSAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBNYWtlIEkxNiBiZSBhIHNpZ25lZCBvcGVyYW5kLgotCUNyZWF0ZSBJMTZVIGZvciBhbiB1bnNpZ25lZCAxNmJpdCBtbWVkaWF0ZSBvcGVyYW5kLgotCSh2ODUwX29wY29kZXMpOiBVc2UgSTE2VSBmb3IgIm9yaSIsICJhbmRpIiBhbmQgInhvcmkiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogRGVmaW5lIEVQIG9wZXJhbmQuCi0JKElGNEEsIElGNEIsIElGNEMsIElGNEQpOiBVc2UgRVAuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEZpeCBvcGNvZGUgbnVtYmVycyBmb3IgIm1vdiIKLQl3aXRoIGltbWVkaWF0ZSBvcGVyYW5kLCAibW92aGkiLiAgVHdlYWsgImxkc3IiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBHZXQgbGQuW2Jod10gYW5kIHN0LltiaHddCi0JY29ycmVjdC4gIEdldCBzbGQuW2Jod10gYW5kIHNzdC5bYmh3XSBjbG9zZXIuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiAibm90IiBpcyBhIHR3byBieXRlIGluc24KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGNvZGVzKTogQ29ycmVjdCBiaXQgcGF0dGVybiBmb3Igc2V0Zi4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEQxNiBpbnNlcnRzIGF0IG9mZnNldCAxNiEKLQotCSogdjg1MC1vcGMuYyAodHdvKTogR2V0IG9yZGVyIG9mIHdvcmRzIGNvcnJlY3QuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBJMTYgaW5zZXJ0cyBhdCBvZmZzZXQgMTYhCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiBBZGQgIlNSMSIgYW5kICJTUjIiIGZvciBzeXN0ZW0KLQlyZWdpc3RlciBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9wZXJhbmRzLgotCSh2ODUwX29wY29kZXMpOiBVc2UgU1IxIGFuZCBTUjIgZm9yICJsZHNyIiBhbmQgInN0c3IiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggdGhpbmtvIGluICJqbXAiIG9wY29kZS4gIEZpeAotCXNhbWUgdGhpbmtvIGluICJ0cmFwIiBvcGNvZGUuCi0KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3Bjb2Rlcyk6IEFkZCBpbml0aWFsaXplciBmb3Igc2l6ZSBmaWVsZAotCW9uIGFsbCBvcGNvZGVzLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogRDYgLT4gRFM3LiAgUmVmZXJlbmNlcyBjaGFuZ2VkLgotCUFkZCBEOCBmb3IgOC1iaXQgdW5zaWduZWQgZmllbGQgaW4gc2hvcnQgbG9hZC9zdG9yZSBpbnNucy4KLQkoSUY0QSwgSUY0RCk6IFRoZXNlIGJvdGggbmVlZCB0d28gcmVnaXN0ZXJzLgotCShJRjRDLCBJRjREKTogRGVmaW5lLiAgVXNlIDgtYml0IHVuc2lnbmVkIGZpZWxkLgotCSh2ODUwX29wY29kZXMpOiBGb3IgInNsZC5oIiwgInNsZC53IiwgInNzdC5oIiwgInNzdC53IiwgdXNlCi0JSUY0QyAmIElGNEQuICBGb3IgInRyYXAiIHVzZSBJNVUsIG5vdCBJNS4gIEFkZCBJRjEgb3BlcmFuZAotCWZvciAibGRzciIgYW5kICJzdHNyIi4KLQkqIHY4NTAtb3BjLmMgKHY4NTBfb3BlcmFuZHMpOiAzLWJpdCBpbW1lZGlhdGUgZm9yIGJpdCBpbnNucwotCWlzIHVuc2lnbmVkLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBDb3JyZWN0IHNob3J0IHN0b3JlIGhhbGYgKHNzdC5oKSBhbmQKLQlzaG9ydCBzdG9yZSB3b3JkIChzc3QudykuCi0KLVRodSBBdWcgMjIgMTY6NTc6MjcgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wZXJhbmRzKTogQWRkZWQgaW5zZXJ0IGFuZCBleHRyYWN0IGZpZWxkcywKLSAJcG9pbnRlcnMgdG8gZnVuY3Rpb25zIHRoYXQgaGFuZGxlIHVudXN1YWwgb3BlcmFuZCBlbmNvZGluZ3MuCi0KLVRodSBBdWcgMjIgMDE6MDU6MjQgMTk5NiAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBFbmFibGUgInRyYXAiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiBGaXggb3JkZXIgb2YgZGlzcGxhY2VtZW50Ci0JYW5kIHJlZ2lzdGVyIGZvciAic2V0MSIsICJjbHIxIiwgIm5vdDEiLCBhbmQgInRzdDEiLgotCi1XZWQgQXVnIDIxIDE4OjQ2OjI2IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCAiQjMiIHN1cHBvcnQuCi0JKHY4NTBfb3Bjb2Rlcyk6IEZpeCBhbmQgZW5hYmxlICJzZXQxIiwgImNscjEiLCAibm90MSIKLQlhbmQgInRzdDEiLgotCi0JKiB2ODUwLW9wYy5jICh2ODUwX29wY29kZXMpOiAiam1wIiBoYXMgb25seSBhbiBSMSBvcGVyYW5kLgotCi0JKiB2ODUwLW9wYy5jOiBDbG9zZSB1bnRlcm1pbmF0ZWQgY29tbWVudC4KLQotV2VkIEF1ZyAyMSAxNzozMToyNiAxOTk2ICBKLlQuIENvbmtsaW4gIDxqdGNAaGlwcG8uY3lnbnVzLmNvbT4KLQotCSogdjg1MC1vcGMuYyAodjg1MF9vcGVyYW5kcyk6IEFkZCBmbGFncyBmaWVsZC4KLSAJKHY4NTBfb3Bjb2Rlcyk6IGFkZCBtb3ZlIG9wY29kZXMuCi0KLVR1ZSBBdWcgMjAgMTQ6NDE6MDMgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQGhpcHBvLmN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChBTExfTUFDSElORVMpOiBBZGQgdjg1MC1vcGMuby4KLQkqIGNvbmZpZ3VyZTogKGJmZF92ODUwdl9hcmNoKSBBZGQgbmV3IGNhc2UuCi0JKiBjb25maWd1cmUuaW46IChiZmRfdjg1MF9hcmNoKSBBZGQgbmV3IGNhc2UuCi0JKiB2ODUwLW9wYy5jOiBOZXcgZmlsZS4KLQotTW9uIEF1ZyAxOSAxNToyMTozOCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEhhbmRsZSBsaXR0bGUgZW5kaWFuIHNwYXJjcy4KLQotVGh1IEF1ZyAxNSAxMzoxNDo0MyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYzogQWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gdGhlIG9wY29kZQotCXRhYmxlIHRvIGhlbHAgZGV0ZXJtaW5pbmUgd2hpY2ggaW5zdHJ1Y3Rpb25zIGNhbiBiZSBkb25lCi0JaW4gcGFyYWxsZWwuCi0KLVRodSBBdWcgMTUgMTM6MTE6MTMgMTk5NiAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctbWFrZS5zZWQ6IFVwZGF0ZSBlZGl0aW5nIG9mIGluY2x1ZGUgcGF0aG5hbWVzIHRvIGJlCi0JbW9yZSBnZW5lcmFsLgotCi1UaHUgQXVnIDE1IDE2OjI4OjQxIDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogYXJtLW9wYy5oOiBBZGRlZCAiYngiIGluc3RydWN0aW9uIGRlZmluaXRpb24uCi0KLVdlZCBBdWcgMTQgMTc6MDA6MDQgMTk5NiAgUmljaGFyZCBIZW5kZXJzb24gIDxydGhAdGFtdS5lZHU+Ci0KLQkqIGFscGhhLW9wYy5jIChFVjRFWFRIV0lOREVYKTogRmllbGQgd2lkdGggc2hvdWxkIGJlIDggbm90IDUuCi0KLU1vbiBBdWcgMTIgMTQ6MzA6MzcgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IE1pbm9yIGZpeGVzIHRvIGFkZGkgYW5kIGJsLmwuCi0KLUZyaSBBdWcgIDkgMTM6MjE6NTkgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtb3BjLmMgKGQxMHZfb3Bjb2Rlcyk6IENvcnJlY3QgJ212JyB1bml0IGVudHJ5IHRvIEVJVEhFUi4KLQotVGh1IEF1ZyAgOCAxMjo0Mzo1MiAxOTk2ICBLbGF1cyBLYWVtcGYgIDxra2FlbXBmQHByb2dpcy5kZT4KLQotCSogbWFrZWZpbGUudm1zOiBVcGRhdGUgZm9yIGFscGhhLW9wYyBjaGFuZ2VzLgotCi1XZWQgQXVnICA3IDExOjU1OjEwIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pMzg2KTogQWN0dWFsbHkgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlLgotIAkoT05FLCBPUF9PTkUpOiAjaWZkZWYgb3V0OyBub3QgdXNlZC4KLQotRnJpIEF1ZyAgMiAxNzo0NzowMyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGNvZGVzKTogQWRkZWQgMiBhY2N1bXVsYXRvciBzdWIgaW5zdHJ1Y3Rpb25zLgotCUNoYW5nZWQgc3ViaSBvcGVyYW5kIHR5cGUgdG8gdHJlYXQgMCBhcyAxNi4KLQotV2VkIEp1bCAzMSAxNjoyMTo0MSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IEFkZCBjcHVzaGwgZm9yIHRoZSBtY2Y1MjAwLiAgRnJvbSBLZW4gUm9zZQotCTxyb3NlQG5ldGNvbS5jb20+LgotCi1XZWQgSnVsIDMxIDE0OjM5OjI3IDE5OTYgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQGN5Z251cy5jby51az4KLQotCSogYXJtLW9wYy5oOiAoYXJtX29wY29kZXMpOiBBZGRlZCBoYWxmd29yZCBhbmQgc2lnbi1leHRlbnNpb24KLSAJbWVtb3J5IHRyYW5zZmVyIGluc3RydWN0aW9ucy4gQWRkIG5ldyBmb3JtYXQgc3RyaW5nIGVudHJpZXMgJWggYW5kICVzLgotCSogYXJtLWRpcy5jOiAocHJpbnRfaW5zbl9hcm0pOiBQcm92aWRlIGRlY29kaW5nIG9mIHRoZSBuZXcKLQlmb3JtYXRzICVoIGFuZCAlcy4KLQotRnJpIEp1bCAyNiAxMTo0NTowNCAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1vcGMuYyAoZDEwdl9vcGVyYW5kcyk6IEFkZGVkIFVOVU00UzsgYSA0LWJpdCBhY2N1bXVsYXRvciBzaGlmdC4KLSAJKGQxMHZfb3Bjb2Rlcyk6IE1vZGlmaWVkIGFjY3VtdWxhdG9yIHNoaWZ0IGluc3RydWN0aW9ucyB0byB1c2UgVU5VTTRTLgotCi1GcmkgSnVsIDI2IDE0OjAxOjQzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGFfb3NmKTogUmVtb3ZlLgotCShwcmludF9pbnNuX2FscGhhX3Ztcyk6IFJlbW92ZS4KLQkocHJpbnRfaW5zbl9hbHBoYSk6IE1ha2UgZ2xvYmFsbHkgdmlzaWJsZS4gIENob3NlIHRoZSByZWdpc3RlcgotCW5hbWVzIGJhc2VkIG9uIGluZm8tPmZsYXZvdXIuCi0JKiBkaXNhc3NlbWJsZS5jOiBBbHdheXMgcmV0dXJuIHByaW50X2luc25fYWxwaGEgZm9yIHRoZSBhbHBoYS4KLQotVGh1IEp1bCAyNSAxNToyNDoxNyAxOTk2ICBNYXJ0aW4gTS4gSHVudCAgPGh1bnRAcGl6emEuY3lnbnVzLmNvbT4KLQotCSogZDEwdi1kaXMuYyAoZGlzX2xvbmcpOiBIYW5kbGUgdW5rbm93biBvcGNvZGVzLgotCi1UaHUgSnVsIDI1IDEyOjA4OjA5IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBkMTB2LW9wYy5jOiBDaGFuZ2VzIHRvIHN1cHBvcnQgc2lnbmVkIGFuZCB1bnNpZ25lZCBudW1iZXJzLgotCUFsbCBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIHRoYXQgaGF2ZSBsb25nIGFuZCBzaG9ydCBmb3JtcwotCW5vdyBlbmQgaW4gIi5sIiBvciAiLnMiLiAgRGl2cyBhZGRlZC4KLQkqIGQxMHYtZGlzLmM6IENoYW5nZXMgdG8gc3VwcG9ydCBzaWduZWQgYW5kIHVuc2lnbmVkIG51bWJlcnMuCi0KLVR1ZSBKdWwgMjMgMTE6MDI6NTMgMTk5NiAgTWFydGluIE0uIEh1bnQgIDxodW50QHBpenphLmN5Z251cy5jb20+Ci0KLQkqIGQxMHYtZGlzLmM6IENoYW5nZSBhbGwgZnVuY3Rpb25zIHRvIHVzZSBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMuCi0KLU1vbiBKdWwgMjIgMTU6Mzg6NTMgMTk5NiAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstb3BjLmMgKG02OGtfb3Bjb2Rlcyk6IE1ha2Ugb3Bjb2RlIG1hc2tzIGZvciB0aGUgQ29sZEZpcmUKLSAJbW92ZSBjY3Ivc3IgaW5zbnMgbW9yZSBzdHJpY3Qgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIG9ubHkKLSAJc2VsZWN0cyB0aGVtIHdoZW4gdGhlIGFkZHJlc3NpbmcgbW9kZSBpcyBkYXRhIHJlZ2lzdGVyLgotCi1Nb24gSnVsIDIyIDExOjI1OjI0IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotICAgICAgICAqIGQxMHYtb3BjLmMgKHByZV9kZWZpbmVkX3JlZ2lzdGVycyk6ICBEZWNsYXJlLgotICAgICAgICAqIGQxMHYtZGlzLmMgKHByaW50X29wZXJhbmQpOiBOb3cgdXNlcyBwcmVfZGVmaW5lZF9yZWdpc3RlcnMKLSAgICAgICAgdG8gcGljayBhIGJldHRlciBuYW1lIGZvciB0aGUgcmVnaXN0ZXJzLgotCi1Nb24gSnVsIDIyIDEzOjQ3OjIzIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IEZpeCBvcGNvZGUgdmFsdWVzIGZvciBmcGFjazE2LCBhbmQgZnBhY2tmaXguICBGaXgKLQlvcGVyYW5kcyBmb3IgZmV4cGFuZCBhbmQgZnBtZXJnZS4gIEZyb20gQ2hyaXN0aWFuIEt1ZWhua2UKLQk8Q2hyaXN0aWFuLkt1ZWhua2VAYXJiaS5pbmZvcm1hdGlrLnVuaS1vbGRlbmJ1cmcuZGU+LgotCi1Nb24gSnVsIDIyIDEzOjE3OjA2IDE5OTYgIFJpY2hhcmQgSGVuZGVyc29uICA8cnRoQHRhbXUuZWR1PgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IE5vIGxvbmdlciB0aGUgdXNlci12aXNpYmxlCi0JcHJpbnQgcm91dGluZS4gIFRha2UgbmV3IHJlZ25hbWVzIGFuZCBjcHVtYXNrIGFyZ3VtZW50cy4KLQlLaWxsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub25zZW5zZS4KLQkocHJpbnRfaW5zbl9hbHBoYV9vc2YpOiBOZXcgZnVuY3Rpb24uICBEbyBPU0YvMSBzdHlsZSByZWduYW1lcy4KLQkocHJpbnRfaW5zbl9hbHBoYV92bXMpOiBOZXcgZnVuY3Rpb24uICBEbyBWTVMgc3R5bGUgcmVnbmFtZXMuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIpOiBUZXN0IGJmZCBmbGF2b3VyIHRvIHBpY2sKLQliZXR3ZWVuIE9TRiBhbmQgVk1TIHJvdXRpbmVzLiAgRGVmYXVsdCB0byBPU0YuCi0KLVRodSBKdWwgMTggMTc6MTk6MzQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfU1VCU1QgKElOU1RBTExfU0hMSUIpLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKGluc3RhbGwpOiBVc2UgQElOU1RBTExfU0hMSUJALgotCi1XZWQgSnVsIDE3IDE0OjM5OjA1IDE5OTYgIE1hcnRpbiBNLiBIdW50ICA8aHVudEBwaXp6YS5jeWdudXMuY29tPgotCi0JKiBjb25maWd1cmU6IChiZmRfZDEwdl9hcmNoKSBBZGQgbmV3IGNhc2UuCi0JKiBjb25maWd1cmUuaW46IChiZmRfZDEwdl9hcmNoKSBBZGQgbmV3IGNhc2UuCi0JKiBkMTB2LWRpcy5jOiBOZXcgZmlsZS4KLQkqIGQxMHYtb3BjLmM6IE5ldyBmaWxlLgotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKSBBZGQgZW50cnkgZm9yIGQxMHYuCi0KLVdlZCBKdWwgMTcgMTA6MTI6MDUgMTk5NiAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBGaXggYnVncyBpbiBjb2xkZmlyZSBpbnNucyByZWxhdGluZwotIAl0byBiY2MsIHRyYXBmbCwgc3VieGwsIGFuZCB3ZGRhdGEgZGlzY292ZXJlZCBieSBBbmRyZWFzIFNjaHdhYi4KLQotTW9uIEp1bCAxNSAxNjo1OTo1NSAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBpMzg2LWRpcy5jOiAgR2V0IHJpZCBvZiBwcmludF9pbnNuX2k4MDg2LiAgVXNlIGluZm8ubWFjaCB0bwotCWRpc3Rpbmd1aXNoIGJldHdlZW4gdmFyaWFudHMgb2YgdGhlIGluc3RydWN0aW9uIHNldC4KLQkqIHNwYXJjLWRpcy5jOiAgR2V0IHJpZCBvZiBwcmludF9pbnNuX3NwYXJjbGl0ZS4gIFVzZSBpbmZvLm1hY2ggdG8KLQlkaXN0aW5ndWlzaCBiZXR3ZWVuIHZhcmlhbnRzIG9mIHRoZSBpbnN0cnVjdGlvbiBzZXQuCi0KLUZyaSBKdWwgMTIgMTA6MTI6MDEgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pODA4Nik6ICBOZXcgcm91dGluZSB0byBkaXNhc3NlbWJsZSB1c2luZwotCXRoZSA4MDg2IGluc3RydWN0aW9uIHNldC4KLQkqIGkzODYtZGlzLmM6ICBHZW5lcmFsIGNsZWFudXBzLiAgTWFrZSBtb3N0IHRoaW5ncyBzdGF0aWMuICBBZGQKLQlwcm90b3R5cGVzLiAgR2V0IHJpZCBvZiBzdGF0aWMgdmFyaWFibGVzIGFmbGFncyBhbmQgZGZsYWdzLiAgUGFzcwotCXRoZW0gYXMgYXJncyAodG8gYWxtb3N0IGV2ZXJ5dGhpbmcpLgotCi1UaHUgSnVsIDExIDExOjU4OjQ0IDE5OTYgIEplZmZyZXkgQSBMYXcgIChsYXdAY3lnbnVzLmNvbSkKLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEhhbmRsZSBtYWNyZWdzIGluIGxkbWFjIGluc25zLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogSGFuZGxlICJsZG0ubCIgYW5kICJzdG0ubCIuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiAiYWJzIiBpcyBpbXBsaWNpdGx5IHR3bwotCWlmIHRoZSBuZXh0IGFyZyBpcyBtYXJrZWQgd2l0aCBTUkNfSU5fRFNULiAgR3Jvc3MuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBQcmludCAiZXhyIiB3aGVuCi0Jd2UncmUgbG9va2luZyBmb3IgYW5kIGZpbmQgRVhSLgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogV2UgZG9uJ3QgaGF2ZSBhIG1hdGNoCi0JaWYgd2UncmUgbG9va2luZyBmb3IgS0JJVCBhbmQgd2UgZG9uJ3QgZmluZCBpdC4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IE1hc2sgb2ZmIHVud2FudGVkIGJpdHMKLQlmb3IgTF8zIGFuZCBMXzIuCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBEb24ndCBzZXQgcGxlbiBmb3IKLQkzYml0IGltbWVkaWF0ZSBvcGVyYW5kcy4KLQotVHVlIEp1bCAgOSAxMDo1NToyMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIFJlbGVhc2VkIGJpbnV0aWxzIDIuNy4KLQotCSogYWxwaGEtb3BjLmM6IEFkZCBuZXcgY2FzZSBvZiAibW92Ii4gIEZyb20gS2xhdXMgS2FlbXBmCi0JPGtrYWVtcGZAcHJvZ2lzLmFjLW5ldC5kZT4uCi0KLVRodSBKdWwgIDQgMTE6NDI6NTEgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBhbHBoYS1vcGMuYzogQ29ycmVjdCBzZWNvbmQgY2FzZSBvZiAibW92IiB0byB1c2UgT1BSTC4KLQotV2VkIEp1bCAgMyAxNjowMzo0NyAxOTk2ICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbkBjcml0dGVycy5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyY2xpdGUpOiAgTmV3IHJvdXRpbmUgdG8gcHJpbnQKLQlzcGFyY2xpdGUgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgSnVsICAzIDE0OjIxOjE4IDE5OTYgIEouVC4gQ29ua2xpbiAgPGp0Y0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVzKTogQWRkIGNvbGRmaXJlIHN1cHBvcnQuCi0KLUZyaSBKdW4gMjggMTU6NTM6NTEgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmMgKGFzaV90YWJsZSk6IEFkZCAjQVNJX04sICNBU0lfTl9MLCAjQVNJX05VQ0xFVVMsCi0JI0FTSV9OVUNMRVVTX0xJVFRMRS4gIFJlbmFtZSAjQVNJX0FTX0lGX1VTRVJfe1BSSU1BUlksU0VDT05EQVJZfV9MCi0JdG8gI0FTSV9BU19JRl9VU0VSX3tQUklNQVJZLFNFQ09OREFSWX1fTElUVExFLgotCi1UdWUgSnVuIDI1IDIyOjU4OjMxIDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLQkqIE1ha2VmaWxlLmluIChiaW5kaXIsIGxpYmRpciwgZGF0YWRpciwgbWFuZGlyLCBpbmZvZGlyLCBpbmNsdWRlZGlyKToKLQlVc2UgYXV0b2NvbmYtc2V0IHZhbHVlcy4KLQkoZG9jZGlyLCBvbGRpbmNsdWRlZGlyKTogUmVtb3ZlZC4KLQkqIGNvbmZpZ3VyZS5pbiAoQUNfUFJFUkVRKTogYXV0b2NvbmYgMi41IG9yIGhpZ2hlci4KLQotRnJpIEp1biAyMSAxMzo1MzozNiAxOTk2ICBSaWNoYXJkIEhlbmRlcnNvbiAgPHJ0aEB0YW11LmVkdT4KLQotCSogYWxwaGEtb3BjLmM6IE5ldyBmaWxlLgotCSogYWxwaGEtb3BjLmg6IFJlbW92ZS4KLQkqIGFscGhhLWRpcy5jOiBDb21wbGV0ZSByZXdyaXRlIHRvIHVzZSBuZXcgb3Bjb2RlIHRhYmxlLgotCSogY29uZmlndXJlLmluOiBGb3IgYmZkX2FscGhhX2FyY2gsIHVzZSBhbHBoYS1vcGMuby4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuMTAuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIGFscGhhLW9wYy5vLgotCShhbHBoYS1kaXMubyk6IERlcGVuZCB1cG9uICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCwgbm90Ci0JYWxwaGEtb3BjLmguCi0JKGFscGhhLW9wYy5vKTogTmV3IHRhcmdldC4KLQotV2VkIEp1biAxOSAxNTo1NToxMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBpLgotCVNldCBpbW1fYWRkZWRfdG9fcnMxIGV2ZW4gaWYgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcmVnaXN0ZXIKLQlhcmUgbm90IHRoZSBzYW1lLgotCi0JKiBzcGFyYy1vcGMuYzogQWRkIHNvbWUgdHdvIG9wZXJhbmQgZm9ybXMgb2YgdGhlIHdyIGluc3RydWN0aW9uLgotCi1UdWUgSnVuIDE4IDE1OjU4OjI3IDE5OTYgIEplZmZyZXkgQS4gTGF3ICA8bGF3QHJ0bC5jeWdudXMuY29tPgotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogUmVuYW1lICJobW9kZSIgYXJndW1lbnQKLQl0byBqdXN0ICJtb2RlIi4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogSGFuZGxlIEg4L1MuCi0JKiBoODMwMC1kaXMuYyAocHJpbnRfaW5zbl9oODMwMHMpOiBOZXcgZnVuY3Rpb24gZm9yIEg4L1MuCi0KLVR1ZSBKdW4gMTggMTg6MDY6NTAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYzogQWRkIGJlcS90ZXEgYXMgYWxpYXNlcyBmb3IgYmUvdGUuCi0KLQkqIHBwYy1vcGMuYzogRml4IGZjbXBvIG9wY29kZS4gIEZyb20gU2VyZ2VpIFN0ZXNoZW5rbwotCTxzZXJnZWlAbXNpbC5zcHMubW90LmNvbT4uCi0KLVR1ZSBKdW4gMTggMTU6MDg6NTQgMTk5NiAgS2xhdXMgS2FlbXBmICA8a2thZW1wZkBwcm9naXMuZGU+Ci0KLQkqIG1ha2VmaWxlLnZtczogTmV3IGZpbGUuCi0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogUHJpbnQgbGRhIHJhLGxpdChyeikgYXMgbW92LgotCi1Nb24gSnVuIDEwIDE4OjUwOjM4IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaDgzMDAtZGlzLmMgKGJmZF9oOF9kaXNhc3NlbWJsZSk6IEFsd2F5cyBwcmludCBBQlM4TUVNIHdpdGggOjgsCi0JcmVnYXJkbGVzcyBvZiBwbGVuLgotCi1UdWUgSnVuICA0IDA5OjE1OjUzIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKE9QX09GRik6IENhbGwgYXBwZW5kX3ByZWZpeC4KLQotVGh1IE1heSAyMyAxNToxODoyMyAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgbWFjcm9zKTogQWRkIGV4cGxpY2l0IGNhc3RzIHRvCi0JdW5zaWduZWQgbG9uZyB0byBzaWxlbmNlIGEgd2FybmluZyBmcm9tIHRoZSBTb2xhcmlzIFBvd2VyUEMKLQljb21waWxlci4KLQotVGh1IEFwciAyNSAxOTozMzozMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEFkZCB1bHRyYXNwYXJjIHZpcyBleHRlbnNpb25zLgotCi1Nb24gQXByIDIyIDE3OjEyOjM1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAYmx1ZXMuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKFhfSU1NLFhfU0lNTSk6IE5ldyBtYWNyb3MuCi0JKFhfSU1NMTMpOiBEZWxldGUuCi0JKHByaW50X2luc25fc3BhcmMpOiBNZXJnZSBjYXNlcyBpLEksaiB0b2dldGhlci4gIE5ldyBjYXNlcyBYLFkuCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IFVzZSBYIGZvciA1IGJpdCBzaGlmdCBjb25zdGFudHMsCi0JWSBmb3IgNiBiaXQgc2hpZnQgY29uc3RhbnRzLiAgUmV3cml0ZSBlbnRyaWVzIGZvciBjcmRjeHQsIGN3cmN4dCwKLQljcHVzaCwgY3B1c2hhLCBjcHVsbCBzcGFyY2xldCBpbnNucy4KLQotV2VkIEFwciAxNyAxNDoyMDoyMiAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoY29tcHV0ZV9hcmNoX21hc2spOiBSZXBsYWNlIEFOU0kgc3R5bGUgZGVmIHdpdGggSyZSLgotCi1UaHUgQXByIDExIDE3OjMwOjAyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtb3BjLmM6IFNldCBGX0ZCUiBvbiBmbG9hdGluZyBwb2ludCBicmFuY2ggaW5zdHJ1Y3Rpb25zLgotCVNldCBGX0ZMT0FUIG9uIG90aGVyIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucy4KLQotTW9uIEFwciAgOCAxNzowMjo0OCAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoUFBDODYwKTogTWFjcm8gZm9yIDg2MC84MjEgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGFuZAotCXJlZ2lzdGVycy4KLSAJKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCA4NjAvODIxIHNwZWNpZmljIFNQUnMuCi0KLU1vbiBBcHIgIDggMTQ6MDA6NDQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFBlcm1pdCAtLWVuYWJsZS1zaGFyZWQgdG8gc3BlY2lmeSBhIGxpc3Qgb2YKLQlkaXJlY3Rvcmllcy4gIFNldCBhbmQgc3Vic3RpdHV0ZSBCRkRfUElDTElTVC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChCRkRfUElDTElTVCk6IFJlbmFtZSBmcm9tIEJGRF9MSVNULiAgQ2hhbmdlIGFsbAotCXVzZXMuICBTZXQgdG8gQEJGRF9QSUNMSVNUQC4KLQotRnJpIEFwciAgNSAxNzoxMjoyNyAxOTk2ICBKZWZmcmV5IEEgTGF3ICAobGF3QGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBVc2UgImJpdCIgZm9yIExfMyBpbW1lZGlhdGVzLAotCW5vdCAiYWJzIiwgd2hpY2ggbWF5IGJlIG5lZWRlZCBmb3IgdGhlIGFic29sdXRlIGluIHNvbWV0aGluZwotCWxpa2UgYnRzdCAjMCxAMTA6OC4gIFByaW50IExfMyBpbW1lZGlhdGVzIHNlcGFyYXRlbHkgZnJvbSBvdGhlcgotCWltbWVkaWF0ZXMuICBDaGFuZ2UgQUJTTU9WIHJlZmVyZW5jZSB0byBBQlM4TUVNLgotCi1XZWQgQXByICAzIDEwOjQwOjQ1IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChvcGNvZGVzX2luaXRpYWxpemVkKTogTW92ZSBpbnNpZGUgcHJpbnRfaW5zbl9zcGFyYy4KLQkoY3VycmVudF9hcmNoX21hc2spOiBOZXcgc3RhdGljIGdsb2JhbC4KLQkoY29tcHV0ZV9hcmNoX21hc2spOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShwcmludF9pbnNuX3NwYXJjKTogRGVsZXRlIHNwYXJjX3Y5X3AuICBOZXcgc3RhdGljIGxvY2FsCi0JY3VycmVudF9tYWNoLiAgUmVzb3J0IG9wY29kZSB0YWJsZSBpZiBjdXJyZW50X21hY2ggY2hhbmdlcy4KLQlHZW5lcmFsaXplICJpbnNuIG5vdCBzdXBwb3J0ZWQiIHRlc3QuCi0JKGNvbXBhcmVfb3Bjb2Rlcyk6IFByZWZlciBzdXBwb3J0ZWQgb3Bjb2RlcyB0byBub25zdXBwb3J0ZWQgb25lcy4KLQlEZWxldGUgdGVzdCBmb3IgdjkvIXY5LgotCSogc3BhcmMtb3BjLmMgKE1BU0tfKik6IFVzZSBTUEFSQ19PUENPREVfQVJDSF9NQVNLLgotCSh2Nm5vdGxldCk6IERlZmluZS4KLQkoYnJmYyk6IFNwbGl0IGludG8gQ0JSIGFuZCBGQlIgZm9yIGNvcHJvY2Vzc29yL2ZwIGJyYW5jaGVzLgotCShicmZjeCk6IFJlbmFtZWQgdG8gRkJSWC4KLQkoY29uZGZjKTogUmVuYW1lZCB0byBDT05ERkMuICBQYXNzIHY2bm90bGV0IHRvIENCUiAoc3RhbmRhcmQKLQljb3Byb2Nlc3NvciBtbmVtb25pY3MgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwYXJjbGV0KS4KLQkoY29uZGYpOiBSZW5hbWVkIHRvIENPTkRGLgotCShTTENCQ0MyKTogRGVsZXRlIEZfQUxJQVMgZmxhZy4KLQotU2F0IE1hciAzMCAyMTo0NTo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IHJkIG11c3QgYmUgMCBmb3IKLQltb3YgZm9vLHsleSwlcHNyLCV3aW0sJXRicn0uICBTdXBwb3J0IG1vdiBmb28sJWFzclguCi0KLUZyaSBNYXIgMjkgMTM6MDI6NDAgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoY29uZmlnLnN0YXR1cyk6IERlcGVuZCB1cG9uIEJGRCBWRVJTSU9OIGZpbGUsIHNvCi0JdGhhdCB0aGUgc2hhcmVkIGxpYnJhcnkgdmVyc2lvbiBudW1iZXIgaXMgc2V0IGNvcnJlY3RseS4KLQotVHVlIE1hciAyNiAxNTo0NzoxNCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIEFDX0NIRUNLX1RPT0wgdG8gZmluZCBhciBhbmQgcmFubGliLiAgRnJvbQotCU1pbGVzIEJhZGVyIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4uCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVNhdCBNYXIgMTYgMTM6MDQ6MDcgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHo4a2dlbi5jIChpbnRlcm5hbCwgZ2FzKTogQ2FsbCB4bWFsbG9jIHJhdGhlciB0aGFuIHVuY2hlY2tlZAotCW1hbGxvYy4KLQotVHVlIE1hciAxMiAxMjoxNDoxMCAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuOC4KLQotVGh1IE1hciAgNyAxNToxMToxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgJ08nIG9wZXJhbmQgY2hhciBsaWtlICdyJy4KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogVXNlICdPJyBvcGVyYW5kIGNoYXIgZm9yIGBuZWcgcmVnJy4KLQotVHVlIE1hciAgNSAxNTo1MTo1NyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3Qgc2V0IFNITElCIG9yIFNITElOSyB0byBhbiBlbXB0eSBzdHJpbmcsCi0Jc2luY2UgdGhleSBhcHBlYXIgYXMgdGFyZ2V0cyBpbiBNYWtlZmlsZS5pbi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotTW9uIEZlYiAyNiAxMzowMzo0MCAxOTk2ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1tYWtlLnNlZDogRWRpdCBvdXQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBiaXRzLgotCi1UdWUgRmViIDIwIDIwOjQ4OjI4IDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAodjgsdjZub3R2OSk6IEFkZCBNQVNLX1NQQVJDTEVULgotCShzcGFyY19vcGNvZGVfYXJjaHMpOiBBZGQgTUFTS19WOCB0byBzcGFyY2xldCBlbnRyeS4KLQkoc3BhcmNfb3Bjb2Rlcyk6IEFkZCBzcGFyY2xldCBpbnNucy4KLQkoc3BhcmNsZXRfY3ByZWdfdGFibGUpOiBOZXcgc3RhdGljIGxvY2FsLgotCShzcGFyY197ZW5jb2RlLGRlY29kZX1fc3BhcmNsZXRfY3ByZWcpOiBOZXcgZnVuY3Rpb25zLgotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBIYW5kbGUgc3BhcmNsZXQgY3ByZWdzLgotCi1UdWUgRmViIDIwIDExOjAyOjQ0IDE5OTYgIEFsYW4gTW9kcmEgIDxhbGFuQG11bGxldC5MZXZlbHMuVW5pU0EuRWR1LkF1PgotCi0JKiBpMzg2LWRpcy5jIChpbmRleDE2KTogTmV3IHN0YXRpYyB2YXJpYWJsZS4KLQkocHV0b3ApOiBQcmludCBqZWN4eiBmb3IgMzIgYml0IGNhc2UsIGpjeHogZm9yIDE2IGJpdCwgbm90IHRoZQotCW90aGVyIHdheSBhcm91bmQuCi0JKE9QX2luZGlyRSk6IFJldHVybiByZXN1bHQgb2YgT1BfRS4KLQkoT1BfRSk6IENoZWNrIGZvciAxNiBiaXQgYWRkcmVzc2luZyBtb2RlLCBhbmQgZGlzYXNzZW1ibGUKLQljb3JyZWN0bHkuICBPcHRpbWlzZWQgMzIgYml0IGNhc2UgYSBsaXR0bGUuICBEb24ndCBwcmludAotCSIoYmFzZSxpbmRleCxzY2FsZSkiIHdoZW4gc2liIHNwZWNpZmllcyBvbmx5IGFuIG9mZnNldC4KLQotTW9uIEZlYiAxOSAxMjozMjoxNyAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogU2V0IGFuZCBzdWJzdGl0dXRlIFNITElCX0RFUC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChTSExJQl9ERVApOiBOZXcgdmFyaWFibGUuCi0JKExJQklCRVJUWV9MSVNUUywgQkZEX0xJU1QpOiBOZXcgdmFyaWFibGVzLgotCShzdGFtcC1waWNsaXN0KTogRGVwZW5kIHVwb24gTElCSUJFUlRZX0xJU1RTIGFuZCBCRkRfTElTVC4gIElmCi0JQ09NTU9OX1NITElCLCBhZGQgdGhlbSB0byBwaWNsaXN0IHdpdGggYXBwcm9wcmlhdGUgbW9kaWZpY2F0aW9ucy4KLQkoJChTSExJQikpOiBEZXBlbmQgdXBvbiAkKFNITElCX0RFUCkuICBEb24ndCBjaGVjayBDT01NT05fU0hMSUIKLQloZXJlOiBqdXN0IHVzZSBwaWNsaXN0LgotCi1Nb24gRmViIDE5IDAyOjAzOjUwIDE5OTYgIERvdWcgRXZhbnMgIDxkamVAY2hhcm1lZC5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoTUFTS19WOSxWOV9PTkxZX1AsVjlfUCk6IERlZmluZS4KLQkocHJpbnRfaW5zbl9zcGFyYyk6IFJld3JpdGUgdjkvbm90LXY5IHRlc3RzLgotCShjb21wYXJlX29wY29kZXMpOiBMaWtld2lzZS4KLQkqIHNwYXJjLW9wYy5jIChNQVNLXzxBUkNIPik6IERlZmluZS4KLQkodjYsdjcsdjgsc3BhcmNsaXRlLHY5LHY5YSk6IFJlZGVmaW5lLgotCShzcGFyY2xldCx2Nm5vdHY5KTogRGVmaW5lLgotCShzcGFyY19vcGNvZGVfYXJjaHMpOiBEZWxldGUgbWVtYmVyIGBjb25mbGljdHMnLiAgQWRkIGBzdXBwb3J0ZWQnLgotCShzcGFyY19vcGNvZGVzKTogRGVsZXRlIEZfTk9UVjksIHVzZSB2Nm5vdHY5IGluc3RlYWQuCi0KLVRodSBGZWIgMTUgMTQ6NDU6MDUgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfUFJPR19DQyBiZWZvcmUgY29uZmlndXJlLmhvc3QuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLQkqIE1ha2VmaWxlLmluIChTT05BTUUpOiBSZW1vdmUgbGVhZGluZyAuLi9iZmQvIGZyb20gJChTSExJQikuCi0KLVdlZCBGZWIgMTQgMTk6MDE6MjcgMTk5NiAgQWxhbiBNb2RyYSAgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PgotCi0JKiBpMzg2LWRpcy5jIChvbmVieXRlX2hhc19tb2RybSk6IE5ldyBzdGF0aWMgYXJyYXkuCi0JKHR3b2J5dGVfaGFzX21vZHJtKTogTmV3IHN0YXRpYyBhcnJheS4KLQkocHJpbnRfaW5zbl9pMzg2KTogT25seSBmZXRjaCB0aGUgbW9kL3JlZy9ybSBieXRlIGlmIGl0IGlzIG5lZWRlZC4KLQotVHVlIEZlYiAxMyAxNToxNTowMSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluICgkKFNITElOSykpOiBDaGVjayB0cyBhZ2FpbnN0ICQoU0hMSUIpLCBub3QKLQkkKFNITElOSykuCi0KLU1vbiBGZWIgMTIgMTY6MjY6MDYgMTk5NiAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKFBQQyk6IFVuZGVmLCBzbyBkZWZhdWx0IGRlZmluYXRpb24gb24gV2luZG93cyBOVAotCWRvZXNuJ3QgY29uZmxpY3QuCi0KLVdlZCBGZWIgIDcgMTM6NTk6NTQgMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBUaGUgYmtwdCBpbnN0cnVjdGlvbiBpcyBzdXBwb3J0ZWQgb24KLQltNjgwMTB1cCwgbm90IGp1c3QgbTY4MDIwdXAgfCBjcHUzMi4KLQotCSogTWFrZWZpbGUuaW4gKFNPTkFNRSk6IE5ldyB2YXJpYWJsZS4KLQkoJChTSExJTkspKTogTWFrZSBhIGxpbmsgdG8gdGhlIHRyYW5zZm9ybWVkIG5hbWUsIGFzIHdlbGwuCi0JKHN0YW1wLXRzaGxpbmspOiBOZXcgdGFyZ2V0LgotCShpbnN0YWxsKTogU2tpcCBzdGFtcC10c2hsaW5rIGR1cmluZyBpbnN0YWxsLgotCi1UdWUgRmViICA2IDEyOjI4OjU0IDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBDYWxsIEFDX0FSR19QUk9HUkFNLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKHByb2dyYW1fdHJhbnNmb3JtX25hbWUpOiBOZXcgdmFyaWFibGUuCi0JKGluc3RhbGwpOiBUcmFuc2Zvcm0gbGlicmFyeSBuYW1lIGJlZm9yZSBpbnN0YWxsaW5nIGl0LgotCi1Nb24gRmViICA1IDE2OjE0OjQyIDE5OTYgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogaTk2MC1kaXMuYyAobWVtKTogQWRkIEhYIGRjaW52YSBpbnN0cnVjdGlvbi4KLQotCVN1cHBvcnQgZm9yIGJ1aWxkaW5nIGFzIGEgc2hhcmVkIGxpYnJhcnksIGJhc2VkIG9uIHBhdGNoZXMgZnJvbQotCUFsYW4gTW9kcmEgPGFsYW5Ac3ByaS5sZXZlbHMudW5pc2EuZWR1LmF1PjoKLQkqIGNvbmZpZ3VyZS5pbjogQWRkIEFDX0FSR19FTkFCTEUgZm9yIHNoYXJlZCBhbmQgY29tbW9uYmZkbGliLgotCU5ldyBzdWJzdGl0dXRpb25zOiBBTExMSUJTLCBQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsCi0JU0hMSUJfQ0ZMQUdTLCBDT01NT05fU0hMSUIsIFNITElOSy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQkqIE1ha2VmaWxlLmluIChBTExMSUJTKTogTmV3IHZhcmlhYmxlLgotCShQSUNGTEFHLCBTSExJQiwgU0hMSUJfQ0MsIFNITElCX0NGTEFHUyk6IE5ldyB2YXJpYWJsZXMuCi0JKENPTU1PTl9TSExJQiwgU0hMSU5LKTogTmV3IHZhcmlhYmxlcy4KLQkoLmMubyk6IElmIFBJQ0ZMQUcgaXMgc2V0LCBjb21waWxlIHR3aWNlLCBvbmNlIFBJQywgb25jZSBub3JtYWwuCi0JKFNUQUdFU1RVRkYpOiBSZW1vdmUgdmFyaWFibGUuCi0JKGFsbCk6IERlcGVuZCB1cG9uICQoQUxMTElCUykgcmF0aGVyIHRoYW4gJChUQVJHRVRMSUIpLgotCShzdGFtcC1waWNsaXN0LCBwaWNsaXN0KTogTmV3IHRhcmdldHMuCi0JKCQoU0hMSUIpLCAkKFNITElOSykpOiBOZXcgdGFyZ2V0cy4KLQkoJChPRklMRVMpKTogRGVwZW5kIHVwb24gc3RhbXAtcGljZGlyLgotCShkaXNhc3NlbWJsZS5vKTogQnVpbGQgdHdpY2UgaWYgUElDRkxBRyBpcyBzZXQuCi0JKE1PU1RMWUNMRUFOKTogQWRkIHBpYy8qLm8uCi0JKGNsZWFuKTogUmVtb3ZlICQoU0hMSUIpLCAkKFNITElOSyksIHBpY2xpc3QsIGFuZCBzdGFtcC1waWNsaXN0LgotCShkaXN0Y2xlYW4pOiBSZW1vdmUgcGljIGFuZCBzdGFtcC1waWNkaXIuCi0JKGluc3RhbGwpOiBJbnN0YWxsIHNoYXJlZCBsaWJyYXJpZXMuCi0JKHN0YW1wLXBpY2Rpcik6IE5ldyB0YXJnZXQuCi0KLUZyaSBGZWIgIDIgMTc6MTU6MjUgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogRGVsZXRlIERJU0FTTV9SQVdfSU5TTiBzdXBwb3J0LgotCVByaW50IHVua25vd24gaW5zdHJ1Y3Rpb24gYXMgInVua25vd24iLCByYXRoZXIgdGhhbiBpbiBoZXguCi0KLVR1ZSBKYW4gMzAgMTQ6MDY6MDggMTk5NiAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBkaXMtYnVmLmM6IEluY2x1ZGUgInN5c2RlcC5oIiBiZWZvcmUgImRpcy1hc20uaCIuCi0KLVRodSBKYW4gMjUgMjA6MjQ6MDcgMTk5NiAgRG91ZyBFdmFucyAgPGRqZUBjaGFybWVkLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVfYXJjaHMpOiBNYXJrIHY4L3NwYXJjbGl0ZSBhcyBjb25mbGljdGluZy4KLQotVGh1IEphbiAyNSAxMTo1Njo0OSAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKHByaW50X2luc25faTM4Nik6IE9ubHkgZmV0Y2ggdGhlIG1vZC9yZWcvcm0gYnl0ZQotCXdoZW4gbmVjZXNzYXJ5LiAgRnJvbSBVbHJpY2ggRHJlcHBlcgotCTxkcmVwcGVyQG15d2FyZS5yei51bmkta2FybHNydWhlLmRlPi4KLQotVGh1IEphbiAyNSAwMzozOToxMCAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBOVU1PUENPREVTIHJlcGxhY2VkIHdpdGgKLQlzcGFyY19udW1fb3Bjb2Rlcy4gIFVwZGF0ZSBhcmNoaXRlY3R1cmUgZW51bSB2YWx1ZXMuCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2RlX2FyY2hzKTogUmVwbGFjZXMgYXJjaGl0ZWN0dXJlX3BuYW1lLgotCShzcGFyY19vcGNvZGVfbG9va3VwX2FyY2gpOiBOZXcgZnVuY3Rpb24uCi0JKHNwYXJjX251bV9vcGNvZGVzKTogUmVuYW1lZCBmcm9tIGJmZF9zcGFyY19udW1fb3Bjb2Rlcy4KLQkoc3BhcmNfb3Bjb2Rlcyk6IEFkZCB2OWEgc2h1dGRvd24gaW5zbi4KLQotTW9uIEphbiAyMiAwODoyOTo1OSAxOTk2ICBEb3VnIEV2YW5zICA8ZGplQGNoYXJtZWQuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc25fc3BhcmMpOiBSZW5hbWVkIGZyb20gcHJpbnRfaW5zbi4KLQlJZiBESVNBU01fUkFXX0lOU04sIHByaW50IGluc24gaW4gaGV4LiAgSGFuZGxlIHY5YSBhcyBvcGNvZGUKLQlhcmNoaXRlY3R1cmUuCi0JKHByaW50X2luc25fc3BhcmM2NCk6IERlbGV0ZWQuCi0JKiBkaXNhc3NlbWJsZS5jIChkaXNhc3NlbWJsZXIsIGNhc2UgYmZkX2FyY2hfc3BhcmMpOiBBbHdheXMgdXNlCi0JcHJpbnRfaW5zbl9zcGFyYy4KLQotCSogc3BhcmMtb3BjLmMgKGFyY2hpdGVjdHVyZV9wbmFtZSk6IEFkZCB2OWEuCi0KLUZyaSBKYW4gMTIgMTQ6MzU6NTggMTk5NiAgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AQVpTdGFyTmV0LmNvbT4KLQotCSogYWxwaGEtb3BjLmggKGFscGhhX2luc25fc2V0KTogVkFYIGZsb2F0aW5nIHBvaW50IG9wY29kZSB3YXMKLSAJaW5jb3JyZWN0bHkgZGVmaW5lZCBhcyAweDE2IHdoZW4gaXQgc2hvdWxkIGJlIDB4MTUuCi0JKEZMT0FUX0ZPUk1BVF9NQVNLKTogZnVuY3Rpb24gY29kZSBpcyAxMSBiaXRzLCBub3QganVzdCA3IGJpdHMhCi0JKGFscGhhX2luc25fc2V0KTogYWRkZWQgY3Z0c3QgYW5kIGN2dHRxIGZsb2F0IG9wcy4gIEFsc28gYWRkZWQKLSAJZXhjYiAoZXhjZXB0aW9uIGJhcnJpZXIpIHdoaWNoIGlzIGRlZmluZWQgaW4gdGhlIEFscGhhCi0gCUFyY2hpdGVjdHVyZSBIYW5kYm9vayB2ZXJzaW9uIDIuCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IEZpeGVkIHNwZWNpYWwtY2FzZSBkZWNvZGluZyBmb3IKLSAJT1BFUkFURV9GT1JNQVRfQ09ERSB0eXBlIGluc3RydWN0aW9ucy4gIFRoZSBidWcgY2F1c2VkIG11bHEgdG8gYmUKLSAJZGlzYXNzZW1ibGVkIGFzIG9yLCBmb3IgZXhhbXBsZS4KLQotV2VkIEphbiAxMCAxMjozNzoyMiAxOTk2ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogUHJpbnQgY2FzZXMgJ2knIGFuZCAndScgaW4gaGV4LgotCShfcHJpbnRfaW5zbl9taXBzKTogQ2hhbmdlIGkgZnJvbSBpbnQgdG8gdW5zaWduZWQgaW50LgotCi1UaHUgSmFuICA0IDE3OjIxOjEwIDE5OTYgIERhdmlkIEVkZWxzb2huICA8ZWRlbHNvaG5AbWhwY2MuZWR1PgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IHRsYmkgUE9XRVIgb3Bjb2RlIGZvcm0gZGlmZmVyZW50Ci0JZnJvbSB0bGJpZSBQb3dlclBDIG9wY29kZS4gIEFkZCBQUEM2MDMgdGxibGQgYW5kIHRsYmxpLgotCi1UaHUgRGVjIDI4IDEzOjI5OjE5IDE5OTUgIEpvaG4gSGFzc2V5ICA8aGFzc2V5QHJ0cC5kZy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IEFkZGVkIFBlbnRpdW0gUHJvIGluc3RydWN0aW9ucy4KLQotVHVlIERlYyAxOSAyMjo1NjozNSAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHBwYy1vcGMuYyAoZnNxcnR7LC59KTogRHVwbGljYXRlIGZvciBQb3dlclBDIGluIGFkZGl0aW9uIHRvCi0JYmVpbmcgZm9yIFBvd2VyMi4KLQotRnJpIERlYyAxNSAxNDoxNDoxNSAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9uaWJibGVfdHlwZSk6IEFkZGVkIFJFR19CLgotCShzaF9hcmdfdHlwZSk6IEFkZGVkIEFfUkVHX0IuCi0JKHNoX3RhYmxlKTogQWRkZWQgcHJlZiBhbmQgYmFuayByZWcgdmVyc2lvbnMgb2YgbGRjLCBsZGMubCwgc3RjCi0gCWFuZCBzdGMubCBvcGNvZGVzLgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogQWRkZWQgY2FzZXMgZm9yIFJFR19CIGFuZCBBX1JFR19CLgotCi1GcmkgRGVjIDE1IDE2OjQ0OjMxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogZGlzYXNzZW1ibGUuYyAoZGlzYXNzZW1ibGVyKTogVXNlIG5ldyBiZmRfYmlnX2VuZGlhbiBtYWNyby4KLQotVHVlIERlYyAxMiAxMjoyMjoyNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChkaXN0Y2xlYW4pOiBSZW1vdmUgc3RhbXAtaC4gIEZyb20gUm9uYWxkCi0JRi4gR3VpbG1ldHRlIDxyZmdAbW9ua2V5cy5jb20+LgotCi1UdWUgRGVjICA1IDEzOjQyOjQ0IDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCUZyb20gRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT46Ci0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IGZpeGVkIGRlY29kaW5nIG9mIGNweXMKLSAJaW5zdHJ1Y3Rpb24uCi0KLU1vbiBEZWMgIDQgMTI6Mjk6MDUgMTk5NSAgSi5ULiBDb25rbGluICA8anRjQHJ0bC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoc2hfYXJnX3R5cGUpOiBBZGRlZCBBX1NTUiBhbmQgQV9TUEMuCi0JKHNoX3RhYmxlKTogQWRkZWQgbWFueSBTSDMgb3Bjb2Rlcy4KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IEFkZGVkIGNhc2VzIGZvciBBX1NTUiBhbmQgQV9TUEMuCi0KLUZyaSBEZWMgIDEgMDc6NDI6MTggMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHN1YmZjLiwgc3ViZmNvKTogTWFyayB0aGlzIFBQQ0NPTSwgbm90IFBQQy4KLQkoc3ViY28sc3ViY28uKTogTWFyayB0aGlzIFBQQywgbm90IFBQQ0NPTS4KLQotTW9uIE5vdiAyNyAxMzowOTo1MiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNy4KLQotVHVlIE5vdiAyMSAxODoyODowNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZTogUmVidWlsZCB3aXRoIGF1dG9jb25mIDIuNi4KLQotV2VkIE5vdiAxNSAxOTowMjo1MyAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBTb3J0IGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcy4gIEFjY2VwdCBidXQgZG8gbm90aGluZwotCWZvciBhbGxpYW50LCBjb252ZXgsIHB5cmFtaWQsIHJvbXAsIGFuZCB0YWhvZS4KLQotV2VkIE5vdiAgOCAyMDoxODo1OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGEyOWstZGlzLmMgKHByaW50X3NwZWNpYWwpOiBDaGFuZ2UgbnVtIHRvIHVuc2lnbmVkIGludC4KLQotV2VkIE5vdiAgOCAyMDoxMDozNSAxOTk1ICBFcmljIEZyZXVkZW50aGFsIDxmcmV1ZGVudGhhbEBueXUuZWR1PgotCi0JKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogQ2FzdCBpbnNuMjQgdG8gdW5zaWduZWQgbG9uZyB3aGVuCi0Jc2hpZnRpbmcgaXQuCi0KLVR1ZSBOb3YgIDcgMTU6MjE6MDYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IENhbGwgQUNfQ0hFQ0tfUFJPRyB0byBmaW5kIGFuZCBjYWNoZSBBUi4KLQkqIGNvbmZpZ3VyZTogUmVidWlsdC4KLQotTW9uIE5vdiAgNiAxNzozOTo0NyAxOTk1ICBIYXJyeSBEb2xhbiAgPGRvbGFuQHNzZC5pbnRlbC5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNhc2UgZm9yIGJmZF9pODYwX2FyY2guCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLUZyaSBOb3YgIDMgMTI6NDU6MzEgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZXMpOiBDb3JyZWN0IGZtb3ZlbWwgb3BlcmFuZHMuCi0JKiBtNjhrLWRpcy5jIChORVhUU0lOR0xFKTogQ2hhbmdlIGkgdG8gdW5zaWduZWQgaW50LgotCShORVhURE9VQkxFKTogTGlrZXdpc2UuCi0JKHByaW50X2luc25fbTY4ayk6IERvbid0IG1hdGNoIGZtb3ZlbWwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQotCXJlZ2lzdGVyIGluIHRoZSBsaXN0LgotCShwcmludF9pbnNuX2FyZyk6IEhhbmRsZSBhIHBsYWNlIG9mICc4JyBmb3IgYSB0eXBlIG9mICdMJy4KLQotVGh1IE5vdiAgMiAyMzowNjozMyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IFVzZSAjVyByYXRoZXIgdGhhbiAjdy4KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlIG5ldyAnVycgcGxhY2UuCi0KLVdlZCBOb3YgIDEgMTM6MzA6MjQgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jIChtNjhrX29wY29kZV9hbGlhc2VzKTogQWRkIGRiZncgYXMgYW4gYWxpYXMgZm9yIGRiZiwKLQlhbmQgbGlrZXdpc2UgZm9yIGFsbCB0aGUgZGJ4eCBvcGNvZGVzLgotCi1Nb24gT2N0IDMwIDIwOjUwOjQwIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBhcmMtZGlzLmM6IEluY2x1ZGUgZWxmLWJmZC5oIHJhdGhlciB0aGFuIGxpYmVsZi5oLgotCi1Nb24gT2N0IDIzIDExOjExOjM0IDE5OTUgIEphbWVzIEcuIFNtaXRoICA8anNtaXRoQHBhc2FuZGEuY3lnbnVzLmNvLnVrPgotCi0JKiBtaXBzLW9wYy5jOiBBZGRlZCBzaG9ydGhhbmQgKFYxKSBmb3IgSU5TTl80MTAwIG1hbmlmZXN0LiBBZGRlZAotIAl0aGUgVlI0MTAwIHNwZWNpZmljIGluc3RydWN0aW9ucyB0byB0aGUgbWlwc19vcGNvZGVzIHN0cnVjdHVyZS4KLQotVGh1IE9jdCAxOSAxMTowNToyMyAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIG1wdy1jb25maWcuaW4sIG1wdy1tYWtlLnNlZDogUmVtb3ZlIHVnbHkgd29ya2Fyb3VuZCBmb3IKLQl1Z2x5IE1ldHJvd2Vya3MgYnVnIGluIENXNiwgaXMgZml4ZWQgaW4gQ1c3LgotCi1Nb24gT2N0IDE2IDEyOjU5OjAxIDE5OTUgIE1pY2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckB0aWt0b2suY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jICh3aG9sZSBmaWxlKTogQWRkIGZsYWdzIGZvciBjb21tb24vYW55IHN1cHBvcnQuCi0KLVR1ZSBPY3QgMTAgMTE6MDY6MDcgMTk5NSAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChCSVNPTik6IFJlbW92ZSBtYWNyby4KLQkoRkxBR1NfVE9fUEFTUyk6IFJlbW92ZSBCSVNPTi4KLQotRnJpIE9jdCAgNiAxNjoyNjo0NSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCU1vbiBTZXAgMjUgMjI6NDk6MzIgMTk5NSAgQW5kcmVhcyBTY2h3YWIgIDxzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+Ci0KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fbTY4ayk6IFJlY29nbml6ZSBhbGwgdHdvLXdvcmQKLQlpbnN0cnVjdGlvbnMgdGhhdCB0YWtlIG5vIGFyZ3MgYnkgbG9va2luZyBhdCB0aGUgbWF0Y2ggbWFzay4KLSAgCShwcmludF9pbnNuX2FyZyk6IEFsd2F5cyBwcmludCAiJSIgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLgotCVtjYXNlICdjJ106IFVzZSAibmMiIGZvciB0aGUgbm8tY2FjaGUgY2FzZSwgYXMgcmVjb2duaXplZCBieSBnYXMuCi0JW2Nhc2UgJ18nXTogRG9uJ3QgcHJpbnQgIkAjIiBiZWZvcmUgYWRkcmVzcy4KLQlbY2FzZSAnSiddOiBVc2UgIiVzIiBhcyBmb3JtYXQgc3RyaW5nLCBub3QgcmVnaXN0ZXIgbmFtZS4KLQlbY2FzZSAnQiddOiBUcmVhdCBwbGFjZSA9PSAnQycgbGlrZSAnbCcgYW5kICdMJy4KLQotVGh1IE9jdCAgNSAyMjoxNjoyMCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3lnbnVzLmNvbT4KLQotCSogaTM4Ni1kaXMuYzogRGVzY3JpYmUgY21weGNoZzhiIG9wZXJhbmQsIGFuZCBzcGVsbCB0aGUgb3Bjb2RlCi0JbmFtZSBjb3JyZWN0bHkuCi0KLVR1ZSBPY3QgIDMgMDg6MzA6MjAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCUZyb20gRGF2aWQgTW9zYmVyZ2VyLVRhbmcgIDxkYXZpZG1AYXpzdGFybmV0LmNvbT4KLQotCSogYWxwaGEtb3BjLmggKE1FTU9SWV9GVU5DVElPTl9GT1JNQVRfTUFTSyk6IGFkZGVkLgotICAJKGFscGhhX2luc25fc2V0KTogYWRkZWQgZGVmaW5pdGlvbnMgZm9yIFZBWCBmbG9hdGluZyBwb2ludAotIAlpbnN0cnVjdGlvbnMgKFVuaXggY29tcGlsZXJzIGRvbid0IGdlbmVyYXRlIHRoZXNlLCBidXQgaGFuZGNvZGVkCi0gCWFzc2VtYmx5IG1pZ2h0IHN0aWxsIHVzZSB0aGVtKS4KLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBhZGRlZCBzdXBwb3J0IGZvciBkaXNhc3NlbWJsaW5nCi0gCXRoZSBtaXNjZWxsYW5lb3VzIGluc3RydWN0aW9ucyBpbiB0aGUgQWxwaGEgaW5zdHJ1Y3Rpb24gc2V0LgotCi1UdWUgU2VwIDI2IDE4OjQ3OjIwIDE5OTUgIFN0YW4gU2hlYnMgIDxzaGVic0BhbmRyb3MuY3lnbnVzLmNvbT4KLQotCSogbXB3LWNvbmZpZy5pbjogQWRkIG02OGstb3BjLmMubyB0byBCRkRfTUFDSElORVMgZm9yIG02OGssCi0Jbm8gbG9uZ2VyIGNyZWF0ZSBzeXNkZXAuaCwgc2VkIHBwYy1vcGMuYyB0byB3b3JrIGFyb3VuZCBhCi0Jc2VyaW91cyBNZXRyb3dlcmtzIEMgYnVnLgotCSogbXB3LW1ha2UuaW46IFJlbW92ZS4KLQkqIG1wdy1tYWtlLnNlZDogTmV3IGZpbGUsIHVzZWQgYnkgbXB3LWNvbmZpZ3VyZSB0byBlZGl0Ci0JTWFrZWZpbGUuaW4gaW50byBhbiBNUFcgbWFrZWZpbGUuCi0KLVdlZCBTZXAgMjAgMTI6NTU6MjggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCi0KLVR1ZSBTZXAgMTkgMTU6Mjg6MzYgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtNjhrLW9wYy5jOiBTcGxpdCBwbW92ZSBwYXR0ZXJucyB3aGljaCB1c2UgJ1AnIGludG8gcGF0dGVybnMKLQl3aGljaCB1c2UgJzAnLCAnMScsIGFuZCAnMicgaW5zdGVhZC4gIFNwZWNpZnkgdGhlIHByb3BlciBzaXplIGZvcgotCWEgcG1vdmUgaW1tZWRpYXRlIG9wZXJhbmQuICBDb3JyZWN0IHRoZSBwbW92ZWZkIHBhdHRlcm5zIHRvIGJlCi0JbW92ZXMgdG8gYSByZWdpc3Rlciwgbm90IGZyb20gYSByZWdpc3Rlci4KLQkqIG02OGstZGlzLmMgKHByaW50X2luc25fYXJnKTogUmVwbGFjZSAnUCcgd2l0aCAnMCcsICcxJywgJzInLgotCi1UaHUgU2VwIDE0IDExOjU4OjIyIDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogTWFyayBhbGwgaW5zbnMgdGhhdCByZWZlcmVuY2UKLQklcHNyLCAld2ltLCAldGJyIGFzIEZfTk9UVjkuCi0KLUZyaSBTZXAgIDggMDE6MDc6MzggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoTWFrZWZpbGUpOiBKdXN0IHJlYnVpbGQgTWFrZWZpbGUgd2hlbiBydW5uaW5nCi0JY29uZmlnLnN0YXR1cy4KLQkoY29uZmlnLmgsIHN0YW1wLWgpOiBOZXcgdGFyZ2V0cy4KLQkqIGNvbmZpZ3VyZS5pbjogQ2FsbCBBQ19DT05GSUdfSEVBREVSIGFuZCBBQ19DQU5PTklDQUxfU1lTVEVNCi0JZWFybGllci4gIERvbid0IGJvdGhlciB0byBjYWxsIEFDX0FSR19QUk9HUkFNLiAgVG91Y2ggc3RhbXAtaCB3aGVuCi0JcmVidWlsZGluZyBjb25maWcuaC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotCSogbWlwcy1vcGMuYzogQ2hhbmdlIHVuYWxpZ25lZCBsb2FkcyBhbmQgc3RvcmVzIHdpdGggInQsQSIKLQlvcGVyYW5kcyB0byB1c2UgInQsQShiKSIuCi0KLVRodSBTZXAgIDcgMTk6MDI6NDYgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBBZGQgRl9GUjAgc3VwcG9ydC4KLQotVGh1IFNlcCAgNyAxOTowMjo0NiAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IENoYW5nZSBsb29wIG92ZXIgb3AtPmFyZ1tuXSB0byBpdGVyYXRlCi0JdW50aWwgMyBpbnN0ZWFkIG9mIHVudGlsIDIuCi0KLVdlZCBTZXAgIDYgMjE6MjE6MzMgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX0NGTEFHUyk6IERlZmluZS4KLQkoLmMubywgZGlzYXNzZW1ibGUubyk6IFVzZSAkKEFMTF9DRkxBR1MpLgotCShNT1NUTFlDTEVBTik6IEFkZCBjb25maWcubG9nLgotCShkaXN0Y2xlYW4pOiBEb24ndCByZW1vdmUgY29uZmlnLmxvZy4KLQkqIGNvbmZpZ3VyZS5pbjogU3Vic3RpdHV0ZSBIREVGSU5FUy4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotV2VkIFNlcCAgNiAxNTowODowOSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9hcmdfdHlwZSk6IEFkZCBGX0ZSMC4KLQkoc2hfdGFibGUsIGNhc2UgZm1hYyk6IEFkZCBGX0ZSMCBhcyBmaXJzdCBhcmd1bWVudC4KLQotV2VkIFNlcCAgNiAxNTowODowOSAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oIChzaF9vcGNvZGVfaW5mbyk6IEluY3JlYXNlIGFyZyBhcnJheSBzaXplIHRvIDQuCi0KLVR1ZSBTZXAgIDUgMTg6Mjg6MTAgMTk5NSAgRG91ZyBFdmFucyAgPGRqZUBjYW51Y2suY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmM6IFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBOT19WOS4KLQotVHVlIFNlcCAgNSAyMDowMzoyNiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGFjbG9jYWwubTQ6IEp1c3QgaW5jbHVkZSAuLi9iZmQvYWNsb2NhbC5tNC4KLQkqIGNvbmZpZ3VyZTogUmVidWlsZC4KLQotVHVlIFNlcCAgNSAxNjowOTo1OSAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1kaXMuYyAoWF9ESVNQMTkpOiBEZWZpbmUuCi0JKHByaW50X2luc24sIGNhc2UgJ0cnKTogVXNlIGl0LgotCShwcmludF9pbnNuLCBjYXNlICdMJyk6IFNpZ24gZXh0ZW5kIGRpc3BsYWNlbWVudC4KLQotTW9uIFNlcCAgNCAxNDoyODo0NiAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogUnVuIC4uL2JmZC9jb25maWd1cmUuaG9zdCBiZWZvcmUgQUNfUFJPR19DQy4KLQlTdWJzaXR1dGUgQ0ZMQUdTIGFuZCBBUi4gIENhbGwgQUNfUFJPR19JTlNUQUxMLiAgRG9uJ3Qgc3Vic3RpdHV0ZQotCWhvc3RfbWFrZWZpbGVfZnJhZyBvciBmcmFncy4KLQkqIGFjbG9jYWwubTQ6IE5ldyBmaWxlLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBTZXQgdG8gQElOU1RBTExALgotCShJTlNUQUxMX1BST0dSQU0pOiBTZXQgdG8gQElOU1RBTExfUFJPR1JBTUAuCi0JKElOU1RBTExfREFUQSk6IFNldCB0byBASU5TVEFMTF9EQVRBQC4KLQkoQVIpOiBTZXQgdG8gQEFSQC4KLQkoQVJfRkxBR1MpOiBTZXQgdG8gcmMgcmF0aGVyIHRoYW4gcWMuCi0JKENDKTogRGVmaW5lIGFzIEBDQ0AuCi0JKENGTEFHUyk6IFNldCB0byBAQ0ZMQUdTQC4KLQkoQGhvc3RfbWFrZWZpbGVfZnJhZ0ApOiBSZW1vdmUuCi0JKGNvbmZpZy5zdGF0dXMpOiBSZW1vdmUgZGVwZW5kZW5jeSB1cG9uIEBmcmFnc0AuCi0KLQkqIGNvbmZpZ3VyZS5pbjogLi4vYmZkL2NvbmZpZy5iZmQgbm93IGp1c3Qgc2V0cyBzaGVsbCB2YXJpYWJsZXMuCi0JVXNlIHRoZW0gcmF0aGVyIHRoYW4gbG9va2luZyB0aHJvdWdoIHRhcmdldCBNYWtlZmlsZSBmcmFnbWVudHMuCi0JKiBjb25maWd1cmU6IFJlYnVpbGQuCi0KLVRodSBBdWcgMzEgMTI6MzU6MzIgMTk5NSAgSmltIFdpbHNvbiAgPHdpbHNvbkBjaGVzdG51dC5jeWdudXMuY29tPgotCi0JKiBzaC1vcGMuaCAoZnRyYyk6IENoYW5nZSBGUFVMX04gdG8gRlBVTF9NLgotCi1XZWQgQXVnIDMwIDEzOjUyOjI4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRGVsZXRlIGR1cGxpY2F0ZSB3ciAleSBpbnNuLgotCUFkZCBjbHJ4LCBpcHJlZmV0Y2gsIHNpZ254LCBjbHJ1dywgY2FzLCBjYXNsLCBjYXN4LCBjYXN4bCBzeW50aGV0aWMKLQlzcGFyYzY0IGluc25zLgotCi0JKiBzcGFyYy1vcGMuYyAoc3BhcmNfb3Bjb2Rlcyk6IEZpeCBwcmVmZXRjaGEgaW5zbi4KLQkobG9va3VwX3tuYW1lLHZhbHVlfSk6IE5ldyBmdW5jdGlvbnMuCi0JKHByZWZldGNoX3RhYmxlKTogTmV3IHN0YXRpYyBsb2NhbC4KLQkoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3ByZWZldGNoKTogTmV3IGZ1bmN0aW9ucy4KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuKTogSGFuZGxlICcqJyBhcmcgKHByZWZldGNoIGZ1bmN0aW9uKS4KLQotV2VkIEF1ZyAzMCAxMToxMTo1OCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBBZGQgYmxhbmsgbGluZXMgdG8gaW1wcm92ZSByZWFkYWJpbGlsdHkgb2Ygc2gzZQotCWluc3RydWN0aW9ucy4KLQotV2VkIEF1ZyAzMCAxMTowOTozOCAxOTk1ICBKaW0gV2lsc29uICA8d2lsc29uQGNoZXN0bnV0LmN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jOiBDb3JyZWN0IGNvbW1lbnQgb24gZmlyc3QgbGluZSBvZiBmaWxlLgotCi1UdWUgQXVnIDI5IDE1OjM3OjE4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlcik6IEhhbmRsZSBiZmRfbWFjaF9zcGFyYzY0LgotCi0JKiBzcGFyYy1vcGMuYyAoYXNpLCBtZW1iYXIpOiBOZXcgc3RhdGljIGxvY2Fscy4KLQkoc3BhcmNfe2VuY29kZSxkZWNvZGV9X3thc2ksbWVtYmFyfSk6IE5ldyBmdW5jdGlvbnMuCi0JKHNwYXJjX29wY29kZXMsIG1lbWJhciBpbnNuKTogRml4LgotCSogc3BhcmMtZGlzLmMgKHByaW50X2luc24pOiBDYWxsIHNwYXJjX2RlY29kZV9hc2kuCi0JU3VwcG9ydCBkZWNvZGluZyBvZiBtZW1iYXIgbWFza3MuCi0JKFhfTUVNQkFSKTogRGVmaW5lLgotCi1TYXQgQXVnIDI2IDIxOjIyOjQ4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBiciwgYnJzLCBicmIsIGJydywgYnJsLgotCi1Nb24gQXVnIDIxIDE3OjMzOjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBiaGliIGFzIGFuIGFsaWFzIGZvciBiaGlzLAotCWFuZCBsaWtld2lzZSBmb3IgdGhlIG90aGVyIGJyYW5jaGVzLiAgQWRkIGJocyBhcyBhbiBhbGlhcyBmb3IgYmNjLAotCWFuZCBsaWtld2lzZSBmb3IgdGhlIHNpemUgdmFyaWFudHMuICBBZGQgZGJocyBhcyBhbiBhbGlhcyBmb3IKLQlkYmNjLgotCi1GcmkgQXVnIDExIDEzOjQwOjI0IDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzaC1vcGMuaCAoRlAgc3RzIGluc3RydWN0aW9ucyk6IFVwZGF0ZSB0byBtYXRjaCByZWFsaXR5LgotCi1Nb24gQXVnICA3IDE2OjEyOjU4IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYzogKGZwY3JfbmFtZXMpOiBBZGQgJSBiZWZvcmUgYWxsIHJlZ2lzdGVyIG5hbWVzLgotCShyZWdfbmFtZXMpOiBMaWtld2lzZS4KLQkocHJpbnRfaW5zbl9hcmcpOiBEb24ndCBleHBsaWNpdGx5IHByaW50ICUgYmVmb3JlIHJlZ2lzdGVyIG5hbWVzLgotCUFkZCAlIGJlZm9yZSByZWdpc3RlciBuYW1lcyBpbiBzdGF0aWMgYXJyYXkgbmFtZXMuICBJbiBjYXNlICdyJywKLQlwcmludCBkYXRhIHJlZ2lzdGVycyBhcyBgQChEbiknLCBub3QgYERuQCcuICBXaGVuIHByaW50aW5nIGEKLQltZW1vcnkgYWRkcmVzcywgZG9uJ3QgcHJpbnQgQCMgYmVmb3JlIGl0LgotCShwcmludF9pbmRleGVkKTogQ2hhbmdlIGJhc2VfZGlzcCBhbmQgb3V0ZXJfZGlzcCBmcm9tIGludCB0bwotCWJmZF92bWEuICBQcmludCB1c2luZyBNSVQgc3ludGF4LCBub3QgbXV0YW50IGludmFsaWQgTW90b3JvbGEKLQlzeW50YXguICBTaWduIGV4dGVuZCA4IGJ5dGUgZGlzcGxhY2VtZW50IGNvcnJlY3RseS4KLQkocHJpbnRfYmFzZSk6IFByaW50IHVzaW5nIE1JVCBzeW50YXguICBQcmludCB6cGMgd2hlbiBhcHByb3ByaWF0ZS4KLQlDaGFuZ2UgcGFyYW1ldGVyIGRpc3AgZnJvbSBpbnQgdG8gYmZkX3ZtYS4KLQotCSogbTY4ay1vcGMuYyAobTY4a19vcGNvZGVfYWxpYXNlcyk6IEFkZCBqc3JsIGFuZCBqc3JzIGFzIGFsaWFzZXMKLQlmb3IganNyLgotCi1Nb24gQXVnICA3IDAyOjIxOjQwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaHgpOiBIYW5kbGUgbmV3IG9wZXJhbmQgdHlwZXMgRl9SRUdfTiwKLQlGX1JFR19NLCBGUFNDUl9NLCBGUFNDUl9OLCBGUFVMX00gYW5kIEZQVUxfTi4KLQkqIHNoLW9wYy5oIChzaF9hcmdfdHlwZSk6IEFkZCBuZXcgb3BlcmFuZCB0eXBlcy4KLQkoc2hfdGFibGUpOiBBZGQgbmV3IG9wY29kZXMgZnJvbSBTSDNFIEZsb2F0aW5nIFBvaW50IElTQS4KLQotU2F0IEF1ZyAgNSAxNjo1MDoxNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBnZW5lcmF0ZWQgZmlsZSBjb25maWcuaC4KLQotU2F0IEF1ZyAgNSAxNjo1MDoxNCAxOTk1ICBGcmVkIEZpc2ggIDxmbmZAY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGRpc3RjbGVhbik6IFJlbW92ZSBnZW5lcmF0ZWQgZmlsZSBjb25maWcuaC4KLQotV2VkIEF1ZyAgMiAxODozMzo0MCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG02OGstb3BjLmM6IE5ldyBmaWxlLCBob2xkaW5nIHRhYmxlcyBmcm9tIGluY2x1ZGUvb3Bjb2RlL202OGsuaC4KLQlDbGVhbiB1cCB0YWJsZXMuCi0JKiBtNjhrLWRpcy5jOiBSZW1vdmUgQlJFQUtfVVBfQklHX0RFQ0wgc3R1ZmYuCi0JKG9wY29kZSk6IFJlbW92ZS4KLQkocHJpbnRfaW5zbl9tNjhrKTogQ2hhbmdlIGQgdG8gYmUgY29uc3QuICBVc2UgbTY4a19udW1vcGNvZGVzCi0JcmF0aGVyIHRoYW4gbnVtb3Bjb2Rlcy4gIFVzZSBtNjhrX29wY29kZXMgcmF0aGVyIHRoYW4gcmVtb3ZlZAotCW9wY29kZSBmdW5jdGlvbi4gIERvbid0IGNoZWNrIEZfQUxJQVMuCi0JKHByaW50X2luc25fYXJnKTogQ2hhbmdlIGZpcnN0IHBhcmFtZXRlciB0byBiZSBjb25zdCBjaGFyICouCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIG02OGstb3BjLm8uCi0JKG02OGstb3BjLm8pOiBOZXcgdGFyZ2V0LgotCSogY29uZmlndXJlLmluOiBCdWlsZCBtNjhrLW9wYy5vIGZvciBiZmRfbTY4a19hcmNoLgotCSogY29uZmlndXJlOiBSZWJ1aWxkLgotCi1XZWQgQXVnICAyIDA4OjIzOjM4IDE5OTUgIERvdWcgRXZhbnMgIDxkamVAY2FudWNrLmN5Z251cy5jb20+Ci0KLQkqIHNwYXJjLWRpcy5jIChIQVNIX1NJWkUsIEhBU0hfSU5TTik6IERlZmluZS4KLQkob3Bjb2RlX2JpdHMsIG9wY29kZV9oYXNoX3RhYmxlKTogTmV3IHZhcmlhYmxlcy4KLQkob3Bjb2Rlc19pbml0aWFsaXplZCk6IFJlbmFtZWQgZnJvbSBvcGNvZGVzX3NvcnRlZC4KLQkoYnVpbGRfaGFzaF90YWJsZSk6IE5ldyBmdW5jdGlvbi4KLQkoaXNfZGVsYXllZF9icmFuY2gpOiBVc2UgaGFzaCB0YWJsZS4KLQkocHJpbnRfaW5zbik6IFJlbmFtZWQgZnJvbSBwcmludF9pbnNuX3NwYXJjLCBtYWRlIHN0YXRpYy4KLQlCdWlsZCBhbmQgdXNlIGhhc2ggdGFibGUuICBJZiAhc3BhcmM2NCwgaWdub3JlIHNwYXJjNjQgaW5zbnMsCi0JYW5kIHZpY2UtdmVyc2EgaWYgc3BhcmM2NC4KLQkocHJpbnRfaW5zbl9zcGFyYywgcHJpbnRfaW5zbl9zcGFyYzY0KTogTmV3IGZ1bmN0aW9ucy4KLQkoY29tcGFyZV9vcGNvZGVzKTogTW92ZSBzcGFyYzY0IG9wY29kZXMgdG8gZW5kLgotCVByaW50IGNvbW11dGF0aXZlIGluc25zIHdpdGggY29uc3RhbnQgc2Vjb25kLgotCSogc3BhcmMtb3BjLmMgKGFsbCBub24tdjkgaW5zbnMpOiBVc2UgZmxhZyBGX05PVFY5IGluc3RlYWQgb2YgRl9BTElBUy4KLQotVHVlIEF1ZyAgMSAwMDoxMjo0OSAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIHNoLWRpcy5jIChwcmludF9pbnNuX3NoeCk6IFJlbW92ZSB1bnVzZWQgbG9jYWwgZHNsb3QuICBVc2UKLQlwcmludF9hZGRyZXNzX2Z1bmMgZm9yIEFfQkRJU1AxMiBhbmQgQV9CRElTUDguICBDb3JyZWN0IHRlc3Qgd2hpY2gKLQlhdm9pZHMgcHJpbnRpbmcgYSBkZWxheSBzbG90IGluIGEgZGVsYXkgc2xvdC4KLQkqIHNoLW9wYy5oIChzaF90YWJsZSk6IEZ1bGx5IGJyYWNrZXQgbGFzdCBlbnRyeS4KLQotTW9uIEp1bCAzMSAxMjowNDo0NyAxOTk1ICBEb3VnIEV2YW5zICA8ZGplQGNhbnVjay5jeWdudXMuY29tPgotCi0JKiBzcGFyYy1vcGMuYyAoc2xseCwgc3JheCwgc3JseCk6IEZpeCBkaXNhc3NlbWJseS4KLQotV2VkIEp1bCAxMiAwMDo1OTozNCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5Aa3ItcGMuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBHZXQgaG9zdF9tYWtlZmlsZV9mcmFnIGZyb20gJHtzcmNkaXJ9LgotCi0JKiBjb25maWd1cmUuaW46IEF1dG9jb25maXNjYXRlZC4gIENoZWNrIGZvciBzdHJpbmdbc10uaC4gIENyZWF0ZQotCWNvbmZpZy5oIGZyb20gY29uZmlnLmluLiAgRG9uJ3Qgc2V0IHVwIHN5c2RlcC5oIGxpbmsuCi0JKiBzeXNkZXAuaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUsIGNvbmZpZy5pbjogTmV3IGZpbGVzLCBnZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuaW4uCi0JKiBNYWtlZmlsZS5pbjogVXBkYXRlZCB0byBiZSBwcm9jZXNzZWQgYXV0b2NvbmYtc3R5bGUuCi0JKGRpc3RjbGVhbik6IEtlZXAgc3lzZGVwLmguICBSZW1vdmUgY29uZmlnLmxvZyBhbmQgY29uZmlnLmNhY2hlLgotCShNYWtlZmlsZSk6IERlcGVuZCBvbiBjb25maWcuc3RhdHVzLgotCShjb25maWcuc3RhdHVzKTogTmV3IHJ1bGUuCi0JKiBjb25maWd1cmUuYmF0OiBVcGRhdGUgTWFrZWZpbGUgc3Vic3RpdHV0aW9ucy4KLQotVHVlIEp1bCAxMSAxNDoyMzozNyAxOTk1ICBKZWZmIFNwaWVnZWwgIDxqZWZmc0Bsc2lsLmNvbT4KLQotCSogbWlwcy1vcGMuYyAoTDEpOiBEZWZpbmUuCi0JKG1pcHNfb3Bjb2Rlcyk6IEFkZCBSNDAxMCBpbnN0cnVjdGlvbnM6IGZsdXNoaSwgZmx1c2hkLCBmbHVzaGlkLAotCWFkZGNpdSwgbWFkZCwgbWFkZHUsIGZmYywgZmZzLCBtc3ViLCBtc3VidSwgc2Vsc2ksIHNlbHNyLCB3YWl0aSwKLQlhbmQgd2IuCi0KLVR1ZSBKdWwgMTEgMTE6NDk6NDkgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBtaXBzLW9wYy5jIChtaXBzX29wY29kZXMpOiBGb3IgdGhlIG1vdmUgcHNldWRvLW9wLCBwcmVmZXIgZGFkZHUKLQlpZiBJU0EgMyBhbmQgYWRkdSBvdGhlcndpc2UsIHJlcGxhY2luZyBvciwgc2luY2Ugc29tZSBNSVBTIGNoaXBzCi0JaGF2ZSBtdWx0aXBsZSBhZGQgdW5pdHMgYnV0IG9ubHkgYSBzaW5nbGUgbG9naWNhbCB1bml0LgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3BlcmFuZHMpOiBDaGFuZ2UgQ1IgdG8gdXNlIGEgYml0c2l6ZSBvZiAzLAotCXNoaWZ0ZWQgYnkgMTgsIHdpdGhvdXQgYW55IGluc2VydGlvbiBvciBleHRyYWN0aW9uIGZ1bmN0aW9uLgotCShpbnNlcnRfY3IsIGV4dHJhY3RfY3IpOiBSZW1vdmUuCi0KLVdlZCBKdW4gMjEgMjA6MDU6MzkgMTk5NSAgS2VuIFJhZWJ1cm4gIDxyYWVidXJuQGN1am8uY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcsIHByaW50X2luZGV4ZWQpOiBQcmludCAiJSIgYmVmb3JlCi0JcmVnaXN0ZXIgbmFtZXMuCi0KLVRodSBKdW4gMTUgMTc6MjM6MzEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBtcHctY29uZmlnLmluOiBBZGQgc2ggYW5kIGkzODYgY29uZmlncywgcmVtb3ZlIHNwYXJjIGNvbmZpZy4KLQkqIHNoLW9wYy5oOiBBZGQgY29weXJpZ2h0LgotCi1Nb24gSnVuICA1IDAzOjMwOjQzIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBrci1sYXB0b3AuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKGNydW5jaC1tNjhrKTogRGVsZXRlIGV4dHJhIHRhcmdldCBhY2NpZGVudGFsbHkKLQljaGVja2VkIGluIGEgd2hpbGUgYWdvLgotCi1XZWQgTWF5IDI0IDE2OjIyOjEzIDE5OTUgIEppbSBXaWxzb24gIDx3aWxzb25AY2hlc3RudXQuY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX3RhYmxlKTogQWRkIFNIMyBzdXBwb3J0LgotCi1XZWQgTWF5IDI0IDE0OjE2OjA4IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIHNoLW9wYy5oOiBBZGRlZCBic3JmIGFuZCBicmFmLgotCi1XZWQgTWF5IDEwIDE0OjI4OjE2IDE5OTUgUmljaGFyZCBFYXJuc2hhdyAocmVhcm5zaGFAYXJtbHRkLmNvLnVrKQotCi0JKiBhcm0tb3BjLmggKGFybV9vcGNvZGVzKTogQWRkIDY0LWJpdCBtdWx0aXBseSBwYXR0ZXJucy4gIERlbGV0ZQotCWJvZ3VzIFtsc11mbXtlYSxmZH0gcGF0dGVybnMuCi0KLQkqIGFybS1vcGMuaCAoYXJtX29wY29kZXMpOiBDb3JyZWN0IHR5cG9zIGluIHN0bSwgbGRtLCBzdGQsIGFuZCBsZGMuCi0JKiBhcm0tZGlzLmMgKHByaW50X2luc25fYXJtKTogTWFrZSBHSVZFTiBhIHBhcmFtZXRlciwgZG9uJ3QgdHJ5IGFuZAotCWluaXRpYWxpemUgaXQgZnJvbSBtZW1vcnkuICBNYWtlIGZ1bmN0aW9uIHN0YXRpYy4KLQkocHJpbnRfaW5zbl97YmlnLGxpdHRsZX1fYXJtKTogTmV3IGZ1bmN0aW9ucy4KLQkqIGRpc2Fzc2VtYmxlLmMgKGRpc2Fzc2VtYmxlciwgY2FzZSBiZmRfYXJjaF9hcm0pOiBEaXNhc3NlbWJsZSBmb3IKLQl0aGUgY29ycmVjdCBlbmRpYW5uZXNzLgotCi1Nb24gQXByIDI0IDE0OjE4OjA1IDE5OTUgIEphc29uIE1vbGVuZGEgICAoY3Jhc2hAcGh5ZGVhdXguY3lnbnVzLmNvbT4KLQotCSogc2gtb3BjLmggKHNoX25pYmJsZV90eXBlLCBzaF9hcmdfdHlwZSk6IHJlbW92ZSB0cmFpbGluZyAsIGZyb20KLQllbnVtIGxpc3QuCi0KLVdlZCBBcHIgMTkgMTQ6MDc6MDMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChvcGNvZGUpOiBGaW5pc2ggY2hhbmdlIG1hZGUgYnkgS3VuZyBIc3Ugb24gQXByaWwKLQkxN3RoLCBzbyB0aGF0IGl0IGJ1aWxkcyBhZ2FpbiB1c2luZyBHQ0MgYXMgdGhlIGNvbXBpbGVyLgotCi1UdWUgQXByIDE4IDEyOjE0OjUxIDE5OTUgIEtlbiBSYWVidXJuICA8cmFlYnVybkBjdWpvLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fbGl0dGxlX21pcHMpOiBDYXN0IHJldHVybiB2YWx1ZSBmcm9tCi0JYmZkX2dldGwzMiBmcm9tIGJmZF92bWEgdG8gdW5zaWduZWQgbG9uZywgYmVjYXVzZSBfcHJpbnRfaW5zbl9taXBzCi0JZXhwZWN0cyBhbiB1bnNpZ25lZCBsb25nLCBhbmQgdGhhdCBtaWdodCBiZSBmZXdlciB3b3JkcyBvZgotCWFyZ3VtZW50IHN0b3JhZ2UgKGUuZy4sIGlmIGJmZF92bWEgaXMgbG9uZyBsb25nIG9uIGEgMzItYml0Ci0JbWFjaGluZSkuCi0JKHByaW50X2luc25fYmlnX21pcHMpOiBMaWtld2lzZSB3aXRoIGJmZF9nZXRiMzIgdmFsdWUuCi0JKF9wcmludF9pbnNuX21pcHMpOiBOb3cgc3RhdGljLgotCi1Nb24gQXByIDE3IDEyOjIzOjI4IDE5OTUgIEt1bmcgSHN1ICA8a3VuZ0BydGwuY3lnbnVzLmNvbT4KLQotCSogbTY4ay1kaXMuYzogVGFrZSBvdXQgI2RlZmluZSBCUkVBS19VUF9CSUdfREVDTCBrbHVkZ2UsIGJlY2F1c2UKLQlnY2MgbWVtb3J5IGhvZyBwcm9ibGVtIHdpdGggaW5pdGlhbGl6ZXIgaXMgZml4ZWQuCi0KLU1vbiBBcHIgMTAgMTU6NTU6MDEgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JTWVyZ2UgaW4gc3VwcG9ydCBmb3IgTWFjIE1QVyBhcyBhIGhvc3QuCi0JKE9sZCBjaGFuZ2UgZGVzY3JpcHRpb25zIHJldGFpbmVkIGZvciBpbmZvcm1hdGlvbmFsIHZhbHVlLikKLQotCSogbXB3LWNvbmZpZy5pbiAoYXJjaG5hbWUpOiBDb21wdXRlIGZyb20gdGhlIGNvbmZpZy4KLQkoQkZEX01BQ0hJTkVTLCBBUkNIREVGUyk6IFB1dCBpbnRvIG1rLnRtcC4KLQotCSogbXB3LWNvbmZpZy5pbiAodGFyZ2V0X2FyY2gpOiBDb21wdXRlIGZyb20gY2Fub25pY2FsIHRhcmdldC4KLQkobTY4aywgbWlwcywgcG93ZXJwYywgc3BhcmMpOiBBZGQgYXJjaGl0ZWN0dXJlcy4KLQkqIG1wdy1tYWtlLmluIChkaXNhc3NlbWJsZS5jLm8pOiBBZGQuCi0JKEFMTF9DRkxBR1MpOiBSZW1vdmUgc3BlY2lhbCBmbGFncyAoLW1jNjgwMjAgLW1jNjg4ODEgLW1vZGVsIGZhcikuCi0KLQkqIG1wdy1jb25maWcuaW4gKEJGRF9NQUNISU5FUyk6IFNldCB0byBhIGRlZmF1bHQgdmFsdWUuCi0JKiBtcHctbWFrZS5pbiAoQkZEX01BQ0hJTkVTKTogUmVtb3ZlIHdpcmVkLWluIHZhbHVlLgotCi0JKiBtcHctbWFrZS5pbiAoQ1NFQVJDSCk6IEFkZCBleHRyYS1pbmNsdWRlIHRvIHNlYXJjaCBwYXRoLgotCi0JKiBtcHctY29uZmlnLmluICh2YXJhcmdzLmgpOiBEb24ndCBjcmVhdGUuCi0JKHN5c2RlcC5oKTogQ3JlYXRlIHVzaW5nIGZvcndhcmQtaW5jbHVkZS4KLQkqIG1wdy1tYWtlLmluIChDU0VBUkNIKTogQWRkIGluY2x1ZGUvbXB3IHRvIHNlYXJjaCBwYXRoLgotCi0JKiBtcHctY29uZmlnLmluOiBOZXcgZmlsZSwgTVBXIHZlcnNpb24gb2YgY29uZmlndXJlLmluLgotCSogbXB3LW1ha2UuaW46IE5ldyBmaWxlLCBNUFcgdmVyc2lvbiBvZiBNYWtlZmlsZS5pbi4KLQotRnJpIE1hciAzMSAxNDoyMzozOCAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IFB1dCBlbXB0eSBzdGF0ZW1lbnQgYWZ0ZXIKLQlkZWZhdWx0IGxhYmVsLgotCi1UdWUgTWFyIDIxIDEwOjUxOjQwIDE5OTUgIEplZmYgTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChzaWduX2V4dGVuZCk6IERlbGV0ZSwgcmVkdW5kYW50IHdpdGggbGliaHBwYS5oIHZlcnNpb24uCi0JKGxvd19zaWduX2V4dGVuZCk6IExpa2V3aXNlLgotCShnZXRfZmllbGQpOiBEZWxldGUgdW51c2VkIGZ1bmN0aW9uLgotCShzZXRfZmllbGQsIGRlcG9zaXRfMTQsIGRlcG9zaXRfMjEpOiBMaWtld2lzZS4KLQotRnJpIE1hciAxNyAxNTo1NTo1MyAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmM6IFN1cHBvcnQgZm9yIG1vcmUgcGVudGl1bSBvcGNvZGVzLiAgRnJvbSBHdXkgSGFycmlzCi0JICAoZ3V5QG5ldGFwcC5jb20pLgotCi1UdWUgTWFyIDE0IDAwOjUyOjU3IDE5OTUgIEtlbiBSYWVidXJuICAocmFlYnVybkBrci1wYy5jeWdudXMuY29tKQotCi0JU2F0IEZlYiAxMSAxNzoyMjo0MSAxOTk1ICBLbGF1cyBLYWVtcGYgIChra2FlbXBmQGRpZHltdXMucm1pLmRlKQotCi0JKiBhbHBoYS1vcGMuaCAoT1NGX0FTTUNPREUpOiBkZWZpbmUKLQlwcmludCBwYWwtY29kZSBuYW1lcyBhcyBkZWZpbmVkIGluIEFwcCBDIG9mIHRoZQotCUFscGhhIEFyY2hpdGVjdHVyZSBSZWZlcmVuY2UgTWFudWFsCi0KLQkqIGFscGhhLWRpcy5jOiBjbGVhbmVkIHVwIG91dHB1dAotCXByaW50IHN0eWxpemVkIGNvZGUgZm9ybXMgYXMgZGVmaW5lZCBpbiBBcHAgQS40LjMgb2YgdGhlCi0JQWxwaGEgQXJjaGl0ZWN0dXJlIFJlZmVyZW5jZSBNYW51YWwKLQotV2VkIE1hciAgOCAxNToyMToxNCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBuZXcgbWlwczQgaW5zdHJ1Y3Rpb25zLiAgRG9uJ3Qgc2V0IElOU05fUkZFIGZvcgotCWByZmUnLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgbmV3IGFyZ3VtZW50IHR5cGVzICdoJywgJ1InLAotCSdOJywgYW5kICdNJy4KLQotV2VkIE1hciAgOCAwMjo1NDowNSAxOTk1ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBtNjhrLWRpcy5jIChvcGNvZGUpOiBOZXcgZnVuY3Rpb24uICBSZXR1cm5zIGFkZHJlc3Mgb2Ygb3Bjb2RlCi0JdGFibGUgZW50cnkgZ2l2ZW4gaW5kZXgsIGV2ZW4gaWYgdGhlIG9wY29kZSB0YWJsZSB3YXMgc3BsaXQgdG8KLQl3b3JrIGFyb3VuZCBnY2MgYnVncy4KLQkocHJpbnRfaW5zbl9tNjhrKTogQ2FsbCBvcGNvZGUgaW5zdGVhZCBvZiByZWZlcmVuY2luZyBtNjhrX29wY29kZXMKLQlkaXJlY3RseS4KLQkoQlJFQUtfVVBfQklHX0RFQ0wpOiBNYWtlIHNlY29uZGFyeSBhcnJheSBzdGF0aWMgYW5kIGNvbnN0LgotCShyZWdfbmFtZXMpOiBOb3cgY29uc3QuCi0JKHByaW50X2luc25fYXJnKTogQXJyYXlzIGNhY2hlRmllbGROYW1lIGFuZCBuYW1lcyBub3cgY29uc3QuCi0JKHByaW50X2luZGV4ZWQpOiBBcnJheSBzY2FsZXMgbm93IGNvbnN0LgotCi1UdWUgTWFyICA3IDE2OjQxOjIxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogcHBjLW9wYy5jOiBTb3J0IHJlY2VudGx5IGFkZGVkIGluc3RydWN0aW9ucyBieSBtaW5vciBvcGNvZGUKLQludW1iZXIgd2l0aGluIG1ham9yIG9wY29kZSBudW1iZXIuCi0KLU1vbiBNYXIgIDYgMTA6MDQ6MzYgMTk5NSAgSmVmZiBMYXcgIChsYXdAc25ha2UuY3MudXRhaC5lZHUpCi0KLQkqIGhwcGEtZGlzLmM6IEluY2x1ZGUgbGliaHBwYS5oLgotCi1GcmkgRmViIDI0IDE5OjE1OjM2IDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQ2hhbmdlIGRsaSB0byB1c2UgTV9ETEksIGFuZCBhZGQgZGxhLgotCi1Nb24gRmViIDIwIDIzOjU0OjM4IDE5OTUgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogTWFrZWZpbGUuaW4gKEFMTF9NQUNISU5FUyk6ICBBZGQgdzY1LWRpcy5vLgotCi1UaHUgRmViIDE2IDE3OjM0OjQxIDE5OTUgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5AY3lnbnVzLmNvbT4KLQotCSogbWlwcy1vcGMuYzogQWRkIHI0NjUwIG11bCBpbnN0cnVjdGlvbi4KLQotV2VkIEZlYiAxNSAxNTo0NToyMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCB1bGQgYW5kIHVzZCBtYWNyb3MgZm9yIHVuYWxpZ25lZCBkb3VibGUgbG9hZCBhbmQKLSAgICAgICAgc3RvcmUuCi0KLVR1ZSBGZWIgMTQgMTM6MTc6MzcgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCA0MDNHQSBvcGNvZGVzIHJmY2ksIGRjY2NpLAotCW1mZGNyLCBtdGRjciwgaWNidCwgaWNjY2kuCi0KLVRodSBGZWIgIDkgMTI6Mjg6MTMgMTk5NSAgU3RhbiBTaGVicyAgPHNoZWJzQGFuZHJvcy5jeWdudXMuY29tPgotCi0JKiBpOTYwLWRpcy5jIChzdHJ1Y3QgdGFiZW50LCBzdHJ1Y3Qgc3BhcnNlX3RhYmVudCk6IENoYW5nZSB0aGUKLSAgICAgICAgc2lnbmVkIGNoYXIgZmllbGRzIHRvIHNob3J0cywgbW9yZSBwb3J0YWJsZS4KLQotV2VkIEZlYiAgOCAxNzoyOToyOSAxOTk1ICBTdGFuIFNoZWJzICA8c2hlYnNAYW5kcm9zLmN5Z251cy5jb20+Ci0KLQkqIGk5NjAtZGlzLmMgKHN0cnVjdCB0YWJlbnQsIHN0cnVjdCBzcGFyc2VfdGFiZW50KTogRGVjbGFyZSB0aGUKLSAgICAgICAgY2hhciBmaWVsZHMgYXMgc2lnbmVkIGNoYXJzLCBzaW5jZSB0aGV5IG1heSBoYXZlIG5lZ2F0aXZlIHZhbHVlcy4KLQotTW9uIEZlYiAgNiAxMDo1MjowNiAxOTk1ICBKLlQuIENvbmtsaW4gIDxqdGNAcnRsLmN5Z251cy5jb20+Ci0KLQkqIGkzODYtZGlzLmMgKGRpczM4Nl90d29ieXRlKTogQWRkIGNwdWlkLCBGcm9tIENoYXJsZXMgSGFubnVtCi0JICAobXljcm9mdEBuZXRic2Qub3JnKS4KLQotTW9uIEphbiAzMCAxMjozODowMCAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQlGcm9tICJMb2dnLCBFZCIgPGVsb2dnQGVhLmNvbT46Ci0JKiBwcGMtb3BjLmMgKGV4dHJhY3RfYmRtKTogQ29ycmVjdCBwYXJlbnRoZXppc2F0aW9uLgotCSogcHBjLWRpcy5jIChwcmludF9pbnNuX3Bvd2VycGMpOiBQcmludCAubG9uZyBiZWZvcmUgdW5yZWNvZ25pemVkCi0JdmFsdWUuCi0KLVRodSBKYW4gMjYgMTg6MzI6MDggMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBwcGMtb3BjLmM6IENoYW5nZXMgYmFzZWQgb24gcGF0Y2ggZnJvbSBEYXZpZCBFZGVsc29obgotCTxlZGVsc29obkBtaHBjYy5lZHU+LgotCShwb3dlcnBjX29wZXJhbmRzKTogQWRkIG9wZXJhbmRzIFNQUkJBVCBhbmQgU1BSRy4gU3BsaXQgVEJSIG91dCBvZgotCVNQUi4KLQkoRlhNX01BU0spOiBEZWZpbmUuCi0JKGluc2VydF90YnIpOiBOZXcgc3RhdGljIGZ1bmN0aW9uLgotCShleHRyYWN0X3Ricik6IE5ldyBzdGF0aWMgZnVuY3Rpb24uCi0JKFhGWEZYTV9NQVNLLCBYRlhNKTogRGVmaW5lLgotCShYU1BSQkFUX01BU0ssIFhTUFJHX01BU0spOiBEZWZpbmUuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCBpbnN0cnVjdGlvbnMgdG8gYWNjZXNzIHNwZWNpYWwgcmVnaXN0ZXJzIGJ5Ci0JbmFtZS4gIEFkZCBtdGNyIGFuZCBtZnRidS4KLQotVHVlIEphbiAxNyAxMDo1Njo0MyAxOTk1ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmMgKFAzKTogRGVmaW5lLgotCShtaXBzX29wY29kZXMpOiBBZGQgbWFkIGFuZCBtYWR1LgotCi1TdW4gSmFuIDE1IDE2OjMyOjU5IDE5OTUgIFN0ZXZlIENoYW1iZXJsYWluICA8c2FjQHNwbGF0PgotCi0JKiBjb25maWd1cmUuaW46IEFkZCBXNjUgc3VwcG9ydC4KLQkqIGRpc2Fzc2VtYmxlLmM6IExpa2V3aXNlLgotCSogdzY1LW9wYy5oLCB3NjUtZGlzLmM6IE5ldyBmaWxlcy4KLQotV2VkIERlYyAyOCAyMjoxNTozMyAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0Bqb25ueS5jeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogQWRkIHN1cHBvcnQgZm9yIDIgYml0Ci0JaW1tZWRpYXRlcy4KLQotVHVlIERlYyAyMCAxMToyNToxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IEFkZCBkbGkgYXMgYSBzeW5vbnltIGZvciBsaS4KLQotVGh1IERlYyAgOCAxODoyMzozMSAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBhbHBoYS1kaXMuYyAocHJpbnRfaW5zbl9hbHBoYSk6IEhhbmRsZSBjYWxsX3BhbCBpbnN0cnVjdGlvbiwgYW5kCi0JcHJpbnQgc29tZXRoaW5nIGZvciByZXNlcnZlZCBvcGNvZGUgdmFsdWVzLCBldmVuIGlmIGl0IHdvbid0Ci0JYXNzZW1ibGUgYWdhaW4uCi0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBXaGVuIGluaXRpYWxpemluZywgc2hpZnQgcmlnaHQKLQlhbmQgbWFzaywgdG8gYXZvaWQgc2lnbiBleHRlbnNpb24gcHJvYmxlbXMgb24gdGhlIEFscGhhLgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX2FyZywgY2FzZSAnSicpOiBIYW5kbGUgYnVzY3IgYW5kIHBjcgotCWNvbnRyb2wgcmVnaXN0ZXJzLgotCi1XZWQgTm92IDIzIDIyOjM0OjUxIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHNoLW9wYy5oIChtb3YubCBnYnIpOiBHZXQgZGlyZWN0aW9uIHJpZ2h0LgotCSogc2gtZGlzLmMgKHByaW50X2luc25fc2h4KTogTmV3IGZ1bmN0aW9uLgotCShwcmludF9pbnNuX3NobCwgcHJpbnRfaW5zbl9zaCk6IENhbGwgcHJpbnRfaW5zbl9zaHggdG8KLQlwcmludCBvcGNvZGVzIHdpdGggcmlnaHQgYnl0ZSBvcmRlci4KLQotVGh1IE5vdiAgMyAxOTozMjoyMiAxOTk0ICBLZW4gUmFlYnVybiAgPHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tPgotCi0JKiBuczMyay1kaXMuYyAoc3RydWN0IG5zMzJrX29wdGlvbik6IFJlbmFtZWQgZnJvbSBzdHJ1Y3Qgb3B0aW9uLAotCXRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIGdldG9wdC4KLQotTW9uIE9jdCAzMSAxODo0ODoxMCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IFJlYWQgdGhlIGluc3RydWN0aW9uIHVzaW5nCi0JYmZkX2dldGIzMiwgc28gdGhhdCBpdCB3b3JrcyBvbiBhIGxpdHRsZSBlbmRpYW4gb3IgNjQgYml0IGhvc3QuCi0JUmVtb3ZlIHVudXNlZCBsb2NhbCB2YXJpYWJsZSBvcC4KLQotVHVlIE9jdCAyNSAxNzowNzo1NyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQHNhbmd1aW5lLmN5Z251cy5jb20+Ci0KLQkqIG1pcHMtb3BjLmM6IFVzZSBvciBpbnN0ZWFkIG9mIGFkZHUgZm9yIHBzZXVkby1vcCBtb3ZlLCBzaW5jZQotCWFkZHUgZG9lcyBub3Qgd29yayBjb3JyZWN0bHkgaWYgLW1pcHMzLgotCi1XZWQgT2N0IDE5IDEzOjQwOjE2IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogYTI5ay1kaXMuYyAocHJpbnRfc3BlY2lhbCk6IEFkZCBzcGVjaWFsIHJlZ2lzdGVyIG5hbWVzIGRlZmluZWQKLQlvbiAyOTAzMCwgMjkwNDAgYW5kIDI5MDUwLgotCShwcmludF9pbnNuKTogSGFuZGxlIG5ldyBvcGVyYW5kIHR5cGUgJ0knLgotCi1XZWQgT2N0IDEyIDExOjU5OjU1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW4gKElOU1RBTEwpOiBVc2UgdG9wIGxldmVsIGluc3RhbGwuc2ggc2NyaXB0LgotCi1XZWQgT2N0ICA1IDE5OjE2OjI5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogc3BhcmMtZGlzLmM6IFJld3JpdGUgdG8gdXNlIGJpdGZpZWxkcywgcmF0aGVyIHRoYW4gYSB1bmlvbiwgc28KLQl0aGF0IGl0IHdvcmtzIG9uIGEgbGl0dGxlIGVuZGlhbiBob3N0LgotCi1UdWUgT2N0ICA0IDEyOjE0OjIxIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIDxpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbT4KLQotCSogY29uZmlndXJlLmluOiBVc2UgJHtjb25maWdfc2hlbGx9IHdoZW4gcnVubmluZyBjb25maWcuYmZkLgotCi1XZWQgU2VwIDIxIDE4OjQ5OjEyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogImRhYnMiIGlzIG9ubHkgYXZhaWxhYmxlIHdpdGggLW1pcHMzLgotCi1UaHUgU2VwIDE1IDE2OjMwOjIyIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYyAocHJpbnRfaW5zbik6IFByaW50IHRoZSBvcGNvZGUuCi0KLVdlZCBTZXAgMTQgMTc6NTI6MTQgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBzYW5ndWluZS5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChtaXBzX29wY29kZXMpOiBTZXQgV1JfdCBmb3Igc2MgYW5kIHNjZC4KLQotU3VuIFNlcCAxMSAyMjozMjoxNyAxOTk0ICBKZWZmIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocmVnX25hbWVzKTogVXNlIHIyNi1yMjMgZm9yIGFyZzAtYXJnMy4KLQotVHVlIFNlcCAgNiAxMTozNzoxMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IFNldCBJTlNOX1NUT1JFX01FTU9SWSBmbGFnIGZvciBhbGwgaW5zdHJ1Y3Rpb25zCi0Jd2hpY2ggc3RvcmUgYSB2YWx1ZSBpbnRvIG1lbW9yeS4KLQotU3VuIFNlcCAwNCAxNzo1ODoxMCAxOTk0ICBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotCi0JKiBjb25maWd1cmUuaW4sIE1ha2VmaWxlLmluLCBkaXNhc3NlbWJsZS5jOiBBZGQgc3VwcG9ydCBmb3IgdGhlIEFSTS4KLQkqIGFybS1kaXMuYywgYXJtLW9wYy5oOiBOZXcgZmlsZXMuCi0KLUZyaSBBdWcgIDUgMTQ6MDA6MDUgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobnMzMmstZGlzLm8pOiBBZGQgZGVwZW5kZW5jeS4KLQkqIG5zMzJrLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IERlY2xhcmUgaW5pdGlhbGl6ZWQgbG9jYWwgYXMKLQlzdHJpbmcsIG5vdCBhcyBhcnJheSBvZiBjaGFycy4KLQotVGh1IEp1bCAyOCAxODoxNDoxNiAxOTk0ICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY3Vqby5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYyAocHJpbnRfaW5zbl9zcGFyYyk6IEhhbmRsZSBuZXcgb3BlcmFuZCB0eXBlICd4Jy4KLQotCSogc3BhcmMtb3BjLmM6IEFkZGVkIHNwYXJjbGl0ZSBleHRlbmRlZCBGUCBvcGVyYXRpb25zLCBhbmQKLQl2ZXJzaW9ucyBvZiB2OSBpbXBkZXAqIGluc3RydWN0aW9ucyBwZXJtaXR0aW5nIHNwZWNpZmljYXRpb24gb2YKLQl0aGUgT1BGIGZpZWxkLgotCi1UdWUgSnVsIDI2IDE2OjM2OjAzIDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHJlZ19uYW1lcyk6IE5vdyBjb25zdC4KLQkoc3RydWN0IHNwYXJzZV90YWJlbnQpOiBOZXcgdHlwZSwgY29waWVkIGZyb20gYXJyYXkgdHlwZSBpbiBtZW0KLQlmdW5jdGlvbi4KLQkoY3RybCk6IExvY2FsIHN0YXRpYyBhcnJheSBjdHJsX3RhYiBub3cgY29uc3QuCi0JKGNvYnIpOiBMb2NhbCBzdGF0aWMgYXJyYXkgY29icl90YWIgbm93IGNvbnN0LgotCShtZW0pOiBMb2NhbCB2YXJpYWJsZXMgcmVnMSwgcmVnMiwgcmVnMyBub3cgcG9pbnQgdG8gY29uc3QuICBMb2NhbAotCXN0YXRpYyB2YXJpYWJsZSBtZW1fdGFiIG5vIGxvbmdlciBleHBsaWNpdGx5IGluaXRpYWxpemVkLiAgQ2hhbmdlZAotCW1lbV9pbml0IHRvIGNvbnN0IGFycmF5IG9mIHN0cnVjdCBzcGFyc2VfdGFiZW50LgotCShyZWcpOiBMb2NhbCBzdGF0aWMgdmFyaWFibGUgcmVnX3RhYiBubyBsb25nZXIgZXhwbGljaXRseQotCWluaXRpYWxpemVkLiAgQ2hhbmdlZCByZWdfaW5pdCB0byBjb25zdCBhcnJheSBvZiBzdHJ1Y3QKLQlzcGFyc2VfdGFiZW50LgotCShlYSk6IExvY2FsIHN0YXRpYyBhcnJheSBzY2FsZV90YWIgbm93IGNvbnN0LgotCi0JKiBpOTYwLWRpcy5jIChyZWcpOiBBZGRlZCBpOTYwSlggaW5zdHJ1Y3Rpb25zIHRvIHJlZ19pbml0IHRhYmxlLgotCShSRUdfTUFYKTogVXBkYXRlZC4KLQotVHVlIEp1bCAxOSAyMTowMDowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHRoZSBkaXNhc3NlbWJlciBuZWVkcyB0byBiZSBlbmFibGVkIGZvcgotCSJvYmpkdW1wIC1kIiB0byB3b3JrIGluIGRqZ3BwLgotCi1XZWQgSnVsIDEzIDE4OjAxOjU4IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIG5zMzJrLWRpcy5jOiBEZWxldGVkIGFsbCBjb2RlIGluICIjaWZkZWYgR0RCIi4KLQkoaW52YWxpZF9mbG9hdCk6IEVuYWJsZWQgZ2VuZXJhbCB2ZXJzaW9uLCBkb2Vzbid0IHJlcXVpcmUgcnVubmluZwotCW9uIG5zMzJrIGhvc3QuICBDaGFuZ2VkIHRvIHRha2UgY2hhciogYXJndW1lbnQsIGFuZCB0ZXN0IGZvcgotCWV4cGxpY2l0bHkgc3BlY2lmaWVkIHNpemVzLCBpbnN0ZWFkIG9mIHVzaW5nIHNpemVvZigpIG9uIGhvc3QgQ1BVCi0JdHlwZXMuCi0JKElOVkFMSURfRkxPQVQpOiBDYXN0IGZpcnN0IGFyZ3VtZW50LgotCShvcHRfdSwgb3B0X1UsIG9wdF9PLCBvcHRfQywgb3B0X1MsIGxpc3RfUDUzMiwgbGlzdF9NNTMyLAotCWxpc3RfUDAzMiwgbGlzdF9NMDMyKTogTm93IGNvbnN0LgotCShvcHRsaXN0LCBsaXN0X3NlYXJjaCk6IE1hZGUgYXBwcm9wcmlhdGUgYXJndW1lbnRzIG5vdyBwb2ludCB0bwotCWNvbnN0LgotCShwcmludF9pbnNuX2FyZyk6IENoYW5nZWQgc3RhdGljIGFycmF5IG9mIG9uZS1jaGFyYWN0ZXItc3RyaW5nCi0JcG9pbnRlcnMgaW50byBhIHN0YXRpYyBjb25zdCBhcnJheSBvZiBjaGFyYWN0ZXJzOyBmaXhlZCBzcHJpbnRmCi0Jc3RhdGVtZW50IGFjY29yZGluZ2x5LgotCi1TdW4gSnVsIDEwIDAwOjI3OjQ3IDE5OTQgIElhbiBEYWxsICAoZGFsbEBoZnJkLmRzdG8uZ292LmF1KQotCi0JKiBvcGNvZGVzL25zMzJrLWRpcy5jOiBTZW1pLW5ldyBmaWxlLiAgSGFkIGFwcGFyZW50bHkgYmVlbiBkcm9wcGVkCi0JZnJvbSBkaXN0cmlidXRpb24uIEEgbnMzMmstZGlzLmMgZnJvbSBhIHByZXZpb3VzIGRpc3RyaWJ1dGlvbiBoYXMKLQliZWVuIGJyb3VnaHQgdXAgdG8gZGF0ZSBhbmQgc3VwcG9ydHMgdGhlIG5ldyBpbnRlcmZhY2UuCi0KLQkqIGRpc2Fzc2VtYmxlLmM6IGRlZmluZSBBUkNIX25zMzJrIGFuZCBhZGQgY2FzZSBiZmRfYXJjaF9uczMyay4KLQotCSogY29uZmlndXJlLmluOiBhZGQgYmZkX25zMzJrX2FyY2ggdGFyZ2V0IHN1cHBvcnQuCi0KLQkqIE1ha2VmaWxlLmluOiBhZGQgbnMzMmstZGlzLm8gdG8gQUxMX01BQ0hJTkVTLgotCUFkZCBuczMyay1kaXMuYyB0byBDRklMRVMuIEFkZCBkZXBlbmRlbmNpZXMgZm9yIG5zMzJrLWRpcy5vLgotCi1XZWQgSnVuIDI5IDIyOjEwOjM3IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBHZXQgMTZiaXQgYnJhbmNoCi0JZGlzYXNzZW1ibHkgcmlnaHQuCi0KLVR1ZSBKdW4gMjggMTM6MjI6MDYgMTk5NCAgU3RhbiBTaGVicyAgKHNoZWJzQGFuZHJvcy5jeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYywgbWlwcy1kaXMuYzogRG9uJ3QgdXNlIHRydWUgYW5kIGZhbHNlLgotCi1UaHUgSnVuIDIzIDEyOjUzOjE5IDE5OTQgIERhdmlkIEouIE1hY2tlbnppZSAgKGRqbUBydGwuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgLS13aXRoLXRhcmdldHMgdG8gLS1lbmFibGUtdGFyZ2V0cy4KLQotV2VkIEp1biAyMiAxMzozODozMiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHNhbmd1aW5lLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKF9wcmludF9pbnNuX21pcHMpOiBCdWlsZCBhIHN0YXRpYyBoYXNoIHRhYmxlIG1hcHBpbmcKLQlvcGNvZGVzIHRvIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiB3aXRoIHRoYXQgb3Bjb2RlLCB0byBzcGVlZAotCWRpc2Fzc2VtYmx5IG9mIGxhcmdlIGZpbGVzLiAgRnJvbSByYWxwaGNAcHlyYW1pZC5jb20gKFJhbHBoCi0JQ2FtcGJlbGwpLgotCi1UdWUgSnVuICA3IDEyOjQ5OjQ0IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKG1vc3RseWNsZWFuKTogRml4IHR5cG8gKHdhcyBtb3N0eWNsZWFuKS4KLQotV2VkIE1heSAxMSAyMjozMjowMCAxOTk0ICBESiBEZWxvcmllIChkakBjdHJvbi5jb20pCi0KLQkqIGNvbmZpZ3VyZS5iYXQ6IHVwZGF0ZSB0byBsYXRlc3QgbWFrZWZpbGUuaW4KLQotU2F0IE1heSAgNyAxNzoxMzoyMSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0JKiBhMjlrLWRpcy5jIChwcmludF9pbnNuKTogUHJpbnQgJ3gnIHR5cGUgb3BlcmFuZCBpbiBoZXguCi0JKiBoODMwMC1kaXMuYyAoYmZkX2g4X2Rpc2Fzc2VtYmxlKTogUHJpbnQgMTZiaXQgcmVscyBjb3JyZWN0bHkuCi0JKiBzaC1kaXMuYyAocHJpbnRfaW5zbl9zaCk6IERvbid0IHJlY3VyIGVuZGxlc3NseSBpZiBkZWxheQotCXNsb3QgaW5zbiBpcyBpbiBhIGRlbGF5IHNsb3QuCi0JKiB6OGstb3BjLmg6IChyZXNmbGcpOiBGaXggcGF0dGVybnMuCi0JKiBoODUwMC1vcGMuaCBGaXggQ1IgaW5zbiBwYXR0ZXJucy4KLQotRnJpIE1heSAgNiAxNDozNDo0NiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogUHV0IFBvd2VyUEMgdmVyc2lvbnMgb2YgImNtcCIgYW5kCi0JImNtcGwiIGJlZm9yZSBQT1dFUiB2ZXJzaW9ucywgc28gdGhhdCBnYXMgLW1hbnkgdXNlcyB0aGVtLgotCi1UaHUgQXByIDI4IDE4OjMyOjM2IDE5OTQgIEtlbiBSYWVidXJuICAocmFlYnVybkBjdWpvLmN5Z251cy5jb20pCi0KLQkqIGRpc2Fzc2VtYmxlLmM6IE5ldyBmaWxlLgotCSogTWFrZWZpbGUuaW4gKE9GSUxFUyk6IEFkZCBkaXNhc3NlbWJsZS5vLgotCShkaXNhc3NlbWJsZS5vKTogUHJvdmlkZSBkZXBlbmRlbmNpZXM7IGNvbXBpbGUgd2l0aCAkKEFSQ0hERUZTKS4KLQkqIGNvbmZpZ3VyZS5pbjogRGVmaW5lIEFSQ0hERUZTIGluIE1ha2VmaWxlLiAgQ29kZSB0YWtlbiBmcm9tCi0JYmludXRpbHMvY29uZmlndXJlLmluLgotCi0JKiBtNjhrLWRpcy5jIChwcmludF9pbnNuX202OGspOiBJZiBGX0FMSUFTIGZsYWcgaXMgc2V0LCBza2lwIHRoZQotCW9wY29kZSBiZWluZyBleGFtaW5lZC4KLQotVGh1IEFwciAyMSAxNzowODo0MCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IEFkZGVkIFJBTCwgUkFNIGFuZCBSQVMuCi0JKGluc2VydF9yYWwsIGluc2VydF9yYW0sIGluc2VydF9yYXMpOiBOZXcgZnVuY3Rpb25zLgotCShwb3dlcnBjX29wY29kZXMpOiBVc2UgUkFMIGZvciBsb2FkIHdpdGggdXBkYXRlLCBSQU0gZm9yIGxtdywgYW5kCi0JUkFTIGZvciBzdG9yZSB3aXRoIHVwZGF0ZS4KLQotU2F0IEFwciAxNiAyMzo0MTo0NCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogQ29ycmVjdCBmY2lyLiAgRnJvbSBEYXZpZCBFZGVsc29obgotCShlZGVsc29obkBucGFjLnN5ci5lZHUpLgotCi1XZWQgQXByICA2IDE3OjExOjQ1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYyAobWlwc19vcGNvZGVzKTogQ29ycmVjdCBvcGVyYW5kcyBvZiAibm9yIiB3aXRoIGFuCi0JaW1tZWRpYXRlIGFyZ3VtZW50LgotCi1Nb24gQXByICA0IDE2OjMwOjQ2IDE5OTQgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jIChzcGFyY19vcGNvZGVzKTogRml4ICJyZCAlZnBycywlbDAiLgotCi1Nb24gQXByICA0IDEzOjIyOjAwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jIChwb3dlcnBjX29wZXJhbmRzKTogVGhlIHNpZ25lZHAgZmllbGQgaGFzIGJlZW4KLQlyZW1vdmVkLCBzbyBkb24ndCBpbml0aWFsaXplIGl0LiAgU2V0IHRoZSBQUENfT1BFUkFORF9TSUdORUQgZmxhZwotCWluc3RlYWQuICBBZGQgbmV3IG9wZXJhbmQgU0lTSUdOT1BULgotCShwb3dlcnBjX29wY29kZXMpOiBGb3IgbGlzLCBsaXUsIGFkZGlzLCBhbmQgY2F1IHVzZSBTSVNJR05PUFQuCi0JQmFzZWQgb24gcGF0Y2ggZnJvbSBEYXZpZCBFZGVsc29obiAoZWRlbHNvaG5AbnBhYy5zeXIuZWR1KS4KLQkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9wb3dlcnBjKTogQ2hlY2sgUFBDX09QRVJBTkRfU0lHTkVEIHJhdGhlcgotCXRoYW4gc2lnbmVkcCBmaWVsZC4KLQotV2VkIE1hciAzMCAwMDozMTo0OSAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGkzODYtZGlzLmMgKHN0cnVjdCBwcml2YXRlKTogIFJlbmFtZWQgdG8gZGlzX3ByaXZhdGUuIGBwcml2YXRlJwotCWlzIGEgcmVzZXJ2ZWQgd29yZCBmb3IgZHluaXggY2MuCi0KLU1vbiBNYXIgMjggMTM6MDA6MTUgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46IENoYW5nZSBlcnJvciBtZXNzYWdlIHRvIHJlZmVyIHRvIGJmZC9jb25maWcuYmZkCi0JcmF0aGVyIHRoYW4gYmZkL2NvbmZpZ3VyZS5pbi4KLQotTW9uIE1hciAyOCAxMjoyODozMCAxOTk0ICBEYXZpZCBFZGVsc29obiAgKGVkZWxzb2huQG5wYWMuc3lyLmVkdSkKLQotCSogcHBjLW9wYy5jOiBEZWZpbmUgUE9XRVIyIGFzIHNob3J0IGFsaWFzIGZsYWcuCi0JKHBvd2VycGNfb3Bjb2Rlcyk6IEFkZCBQT1dFUi8yIG9wY29kZXMgbGZxKiwgc3RmcSosIGZjaXJbel0sIGFuZAotCWZzcXJ0LgotCi1XZWQgTWFyIDIzIDEyOjIzOjA1IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogaTk2MC1kaXMuYyAocHJpbnRfaW5zbl9pOTYwKTogRG9uJ3QgcmVhZCBhIHNlY29uZCB3b3JkIGZvcgotCW9wY29kZXMgMCwgMSwgMiBhbmQgMy4KLQotV2VkIE1hciAxNiAxNTozNzo1OCAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgYnVpbGQgbTY4ODgxLWV4dC5vIGZvciBiZmRfbTY4a19hcmNoLgotCi1Nb24gTWFyIDE0IDE0OjUzOjUwIDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ODgxLWV4dC5jOiBSZW1vdmVkOyBubyBsb25nZXIgdXNlZC4KLQkqIE1ha2VmaWxlLmluOiBDaGFuZ2VkIGFjY29yZGluZ2x5LgotCi0JKiBtNjhrLWRpcy5jIChleHRfZm9ybWF0XzY4ODgxKTogRG9uJ3QgZGVjbGFyZS4KLQkocHJpbnRfaW5zbl9tNjhrKTogSWYgYW4gaW5zdHJ1Y3Rpb24gdXNlcyBwbGFjZSAnaScsIGl0IHVzZXMgYXQKLQlsZWFzdCBmb3VyIGZpeGVkIGJ5dGVzLgotCShwcmludF9pbnNuX2FyZyk6IERvbid0IGJ1bXAgcCBieSAyIGZvciBjYXNlICdJJywgcGxhY2UgJ2knLiAgRm9yCi0JZXh0ZW5kZWQgZmxvYXQsIGNvbnZlcnQgdG8gZG91YmxlIHVzaW5nIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSwgbm90Ci0JaWVlZV9leHRlbmRlZF90b19kb3VibGUsIGFuZCBmZXRjaCB0aGUgZGF0YSBiZWZvcmUgY29udmVydGluZyBpdC4KLQotVHVlIE1hciAgOCAxODoxMjoyNSAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEl0J3Mgc3FydC5zLCBub3Qgc3FydC53LiAgRnJvbQotCWRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbikuCi0KLVR1ZSBGZWIgIDggMTY6NTU6MjcgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBwcGMtb3BjLmMgKHBvd2VycGNfb3Bjb2Rlcyk6IFRoZSBQT1dFUiB1c2VzIGJkbltsXVthXSB3aGVyZSB0aGUKLQlQb3dlclBDIHVzZXMgYmRueltsXVthXS4KLQotVHVlIEZlYiAgOCAwMDozMjoyOCAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGRpcy1idWYuYywgaTM4Ni1kaXMuYzogIEluY2x1ZGUgc3lzZGVwLmguCi0KLU1vbiBGZWIgIDcgMTk6MjI6MjMgMTk5NCAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGJmZF9wb3dlcnBjX2FyY2gpOiBVc2UgcHBjLWRpcy5vIGFuZCBwcGMtb3BjLm8uCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGNvZGVzKTogTWFyayBQT1dFUiBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkCi0JYnkgTW90b3JvbGEgUG93ZXJQQyA2MDEgd2l0aCBQUENfT1BDT0RFXzYwMS4KLQkqIHBwYy1kaXMuYyAocHJpbnRfaW5zbl9iaWdfcG93ZXJwYywgcHJpbnRfaW5zbl9saXR0bGVfcG93ZXJwYyk6Ci0JRGlzYXNzZW1ibGUgTW90b3JvbGEgUG93ZXJQQyA2MDEgaW5zdHJ1Y3Rpb25zIGFzIHdlbGwgYXMgbm9ybWFsCi0JUG93ZXJQQyBpbnN0cnVjdGlvbnMuCi0KLVN1biBGZWIgIDYgMDc6NDU6MTcgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHJlZywgbWVtKTogSnVzdCB1c2UgYSBzdGF0aWMgYXJyYXkgaW5zdGVhZCBvZgotCWNhbGxpbmcgeG1hbGxvYy4KLQotU2F0IEZlYiAgNSAwMDowNDowMiAxOTk0ICBKZWZmcmV5IEEuIExhdyAgKGxhd0BzbmFrZS5jcy51dGFoLmVkdSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogRm9yICc/JyBhbmQgJ0AnIG9ubHkgYWRqdXN0IHRoZQotCWNvbmRpdGlvbiBuYW1lIGluZGV4IGlmIHRoaXMgaXMgZm9yIGEgbmVnYXRlZCBjb25kaXRpb24uCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IE5vIHNwYWNlIGJlZm9yZSAnSCcgb3BlcmFuZC4KLQlGbG9hdGluZyBwb2ludCBmb3JtYXQgZm9yICdIJyBvcGVyYW5kIGlzIGJhY2t3YXJkcyBmcm9tIG5vcm1hbAotCWNhc2UgKDAgPT0gZG91YmxlLCAxID09IHNpbmdsZSkuICBGb3IgJzQnLCAnNicsICc3JywgJzknLCBhbmQgJzgnCi0Jb3BlcmFuZHMgKGZtcHlhZGQgYW5kIGZtcHlzdWIpLCBoYW5kbGUgYml6YXJyZSByZWdpc3RlcgotCXRyYW5zbGF0aW9uIGNvcnJlY3RseSBmb3Igc2luZ2xlIHByZWNpc2lvbiBmb3JtYXQuCi0KLQkqIGhwcGEtZGlzLmMgKHByaW50X2luc25faHBwYSk6IERvIG5vdCBlbWl0IGEgc3BhY2UgYWZ0ZXIgJ0YnCi0Jb3IgJ0knIG9wZXJhbmRzIGlmIHRoZSBuZXh0IGZvcm1hdCBzcGVjaWZpZXIgaXMgJ00nIChmY21wCi0JY29uZGl0aW9uIGNvbXBsZXRlcikuCi0KLUZlYiAgNCAyMzozODowMyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHBwYy1vcGMuYyAocG93ZXJwY19vcGVyYW5kcyk6IE5ldyBvcGVyYW5kIHR5cGUgTUJFIHRvIGhhbmRsZSBhCi0Jc2luZ2xlIG51bWJlciBnaXZpbmcgYSBiaXRtYXNrIGZvciB0aGUgTUIgYW5kIE1FIGZpZWxkcyBvZiBhbiBNCi0JZm9ybSBpbnN0cnVjdGlvbi4gIENoYW5nZSBOQiB0byBhY2NlcHQgMzIsIGFuZCB0dXJuIGl0IGludG8gMDsKLQlhbHNvIHR1cm4gMCBpbnRvIDMyIHdoZW4gZGlzYXNzZW1ibGluZy4gIFNlcGVyYXRlZCBTSCBmcm9tIE5CLgotCShpbnNlcnRfbWJlLCBleHRyYWN0X21iZSk6IE5ldyBmdW5jdGlvbnMuCi0JKGluc2VydF9uYiwgZXh0cmFjdF9uYik6IE5ldyBmdW5jdGlvbnMuCi0JKFNDX01BU0spOiBNYXNrIG91dCBTQSBhbmQgTEsgYml0cy4KLQkocG93ZXJwY19vcGNvZGVzKTogQ2hhbmdlICJjYWwiIHRvIHVzZSBSVCwgRCwgUkEgcmF0aGVyIHRoYW4gUlQsCi0JUkEsIFNJLiAgQ2hhbmdlICJsaXUiIGFuZCAiY2F1IiB0byB1c2UgVUkgcmF0aGVyIHRoYW4gU0kuICBNYXJrCi0JImJjdHIiIGFuZCAiYmN0cmwiIGFzIGFjY2VwdGVkIGJ5IFBPV0VSLiAgQ2hhbmdlICJybHdpbWkiLAotCSJybGltaSIsICJybHdpbWkuIiwgInJsaW1pLiIsICJybHdpbm0iLCAicmxpbm0iLCAicmx3aW5tLiIsCi0JInJsaW5tLiIsICJybG1pIiwgInJsbWkuIiwgInJsd25tIiwgInJsbm0iLCAicmx3bm0uIiwgInJsbm0uIiB0bwotCXVzZSBNQkUgcmF0aGVyIHRoYW4gTUIuICBBZGQgIm1mbXEiIGFuZCAibXRtcSIgUE9XRVIgaW5zdHJ1Y3Rpb25zLgotCShwb3dlcnBjX21hY3Jvcyk6IERlZmluZSB0YWJsZSBvZiBtYWNybyBkZWZpbml0aW9ucy4KLQkocG93ZXJwY19udW1fbWFjcm9zKTogRGVmaW5lLgotCi0JKiBwcGMtZGlzLmMgKHByaW50X2luc25fcG93ZXJwYyk6IERvbid0IHNraXAgb3B0aW9uYWwgb3BlcmFuZHMKLQlpZiBQUENfT1BFUkFORF9ORVhUIGlzIHNldC4KLQotU2F0IEphbiAyMiAyMzoxMDowNyAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IE1ha2UgYnVmZmVyIGJmZF9ieXRlIGluc3RlYWQgb2YKLQljaGFyLiAgUmV0cmlldmUgY29udGVudHMgdXNpbmcgYmZkX2dldGwzMiBpbnN0ZWFkIG9mIHNoaWZ0aW5nLgotCi1GcmkgSmFuIDIxIDE5OjAxOjM5IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogcHBjLW9wYy5jOiBOZXcgZmlsZS4gIE9wY29kZSB0YWJsZSBmb3IgUG93ZXJQQywgaW5jbHVkaW5nCi0Jb3Bjb2RlcyBmb3IgUE9XRVIgKFJTLzYwMDApLgotCSogcHBjLWRpcy5jOiBOZXcgZmlsZS4gIFBvd2VyUEMgYW5kIFBvd2VyIChSUy82MDAwKSBkaXNhc3NlbWJsZXIuCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogQWRkIHBwYy1kaXMubyBhbmQgcHBjLW9wYy5vLgotCShDRklMRVMpOiBBZGQgcHBjLWRpcy5jLgotCShwcGMtZGlzLm8sIHBwYy1vcGMubyk6IE5ldyB0YXJnZXRzLgotCSogY29uZmlndXJlLmluOiBCdWlsZCBwcGMtZGlzLm8gYW5kIHBwYy1vcGMubyBmb3IgYmZkX3JzNjAwMF9hcmNoLgotCi1Nb24gSmFuIDE3IDIwOjA1OjQ5IDE5OTQgIEplZmZyZXkgQS4gTGF3ICAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ04nIGluIGFzc2VtYmxlciB0ZW1wbGF0ZS4KLQlObyBzcGFjZSBiZWZvcmUgJ3UnLCAnZicsIG9yICdOJy4KLQotU3VuIEphbiAxNiAxNDoyMDoxNiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogaTM4Ni1kaXMuYyAocHJpbnRfaW5zbl9pMzg2KTogQWRkIEZJWE1FIGNvbW1lbnQgcmVnYXJkaW5nIHJlYWRpbmcKLQlmYXJ0aGVyIHRoYW4gd2Ugc2hvdWxkLgotCi0JKiBpMzg2LWRpcy5jIChkaXMzODYpOiBVc2UgWWIgYW5kIFl2IGZvciBzY2FzYiBhbmQgc2Nhc1MuCi0KLVRodSBKYW4gIDYgMTI6Mzg6MDUgMTk5NCAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYyBtNjhrLWRpcy5jIGFscGhhLWRpcy5jIGEyOWstZGlzLmM6IEZpeCBjb21tZW50cy4KLQotV2VkIEphbiAgNSAxMTo1NjoyMSAxOTk0ICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGk5NjAtZGlzLmMgKHByaW50X2luc25faTk2MCk6IE9ubHkgcmVhZCB3b3JkMiBpZiB0aGUgaW5zdHJ1Y3Rpb24KLQluZWVkcyBpdCwgdG8gcHJldmVudCByZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiBhIHNlY3Rpb24uCi0KLVdlZCBOb3YgMTcgMTc6MjA6MTIgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5oOiBVc2UgbWFjcm8gZm9yIGogaW5zdHJ1Y3Rpb24sIHRvIHN1cHBvcnQgU1ZSNCBQSUMuCi0JUmVtb3ZlZCB0LEEgY2FzZSBmb3IgbGE7IGFsd2F5cyB1c2UgdCxBKGIpIGNhc2UuCi0KLU1vbiBOb3YgIDggMTI6Mzc6MzYgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JRnJvbSBUZWQgTGVtZW4gPG1lbGxvbkBwZXBwZXIubmNkLmNvbT4KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogSGFuZGxlICdrJy4KLQkqIG1pcHMtb3BjLmM6IE1ha2UgY2FjaGUgdXNlIGssIG5vdCB0LgotCi1TdW4gTm92ICA3IDIzOjUyOjM0IDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEtb3BjLmgsIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogIEFkZAotCUZMT0FUX01FTU9SWV9GT1JNQVRfQ09ERSwgRkxPQVRfQlJBTkNIX0ZPUk1BVF9DT0RFLCBjb3JyZWN0Ci0JRkxPQVRfRk9STUFUX0NPREUgdG8gcHV0IG91dCBmbG9hdGluZyBwb2ludCByZWdpc3RlciBuYW1lcy4KLQotTW9uIE5vdiAgMSAxODoxNzo1MSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IFVzZSBtYWNyb3MgZm9yIGphbCB2YXJpYW50cywgdG8gc3VwcG9ydCBTVlI0IFBJQy4KLQotVGh1IE9jdCAyOCAxNzo0MjoyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIGEyOWstZGlzLmMgKHByaW50X2luc24pOiBVc2UgMHglMDh4LCBub3QgMHglOHguCi0KLVdlZCBPY3QgMjcgMTE6NDg6MDEgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jIChkc2xsLCBkc3JhLCBkc3JsKTogQWRkZWQgJz4nIGNhc2VzIGZvciBzaGlmdCBjb3VudHMKLQlsYXJnZXIgdGhhbiAzMi4gIE1vdmVkIGRzeHgzMiB2YXJpYW50cyBmaXJzdCBmb3IgZGlzYXNzZW1ibGVyLgotCi1Nb24gT2N0IDI1IDExOjMzOjE0IDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHBoeWRlYXV4LmN5Z251cy5jb20pCi0KLQkqIHo4a2dlbi5jLCB6OGstb3BjLmg6IEFkZCBmdWxsIGxkYSBpbmZvcm1hdGlvbi4KLQotVHVlIE9jdCAxOSAxMjozOToyNSAxOTkzICBKZWZmcmV5IEEgTGF3ICAobGF3QGNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBEbyBub3QgZW1pdCBhIHNwYWNlIGFmdGVyCi0JbW92YiBpbnN0cnVjdGlvbnMuICBBbnkgbmVjZXNzYXJ5IHNwYWNlIHdpbGwgYmUgZW1pdHRlZCBieQotCXRoZSBjb2RlIHRvIGhhbmRsZSBudWxsaWZpY2F0aW9uIGNvbXBsZXRlcnMuCi0KLVdlZCBPY3QgMTMgMTY6MTk6MDcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBNb3ZlZCBsLmQgZG93biBzbyB0aGF0IGl0IGRpc2Fzc2VtYmxlcyBhcyBsZGMxLgotCi1GcmkgT2N0ICA4IDAyOjM0OjIxIDE5OTMgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogYWxwaGEtb3BjLmg6ICBBZGQgbGRsX2wsIGZpeCB0eXBvIGZvciBsZHFfdS4KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKTogIEFkZCBjb2RlIGZvciBQQUxfRk9STUFUX0NPREUuCi0KLVR1ZSBPY3QgIDUgMTc6NDc6NTMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBDb3JyZWN0IGx3dSBvcGNvZGUgdmFsdWUgKGJvb2sgaGFkIGl0IHdyb25nKS4KLQotVGh1IFNlcCAzMCAxMToyNjoxOCAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKEZFVENIX0RBVEEpOiBnZXQganVzdCB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEuCi0JKHVucGFja19pbnN0cik6IENvcGUgd2l0aCBBUkdfSU1NNE0xIHR5cGUgaW5zdHJ1Y3Rpb25zLgotCi1XZWQgU2VwIDI5IDE2OjI0OjQ5IDE5OTMgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogbTg4ay1kaXMuYyAobTg4a2Rpcyk6IGNvbW1lbnQgY2hhbmdlLiAgUmVtb3ZlIHNwYWNlIGFmdGVyCi0JICBwcmludGluZyBtbmVtb25pYy4KLQkgIChwcmludG9wKTogaGFuZGxlIG5ldyBhcmcgdHlwZXMgREVDIGFuZCBYUkVHIGZvciBtODgxMTAuCi0KLVR1ZSBTZXAgMjggMTk6MjA6MTYgMTk5MyAgSmVmZnJleSBBIExhdyAobGF3QHNuYWtlLmNzLnV0YWguZWR1KQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBIYW5kbGUgJ3onIG9wZXJhbmQKLQl0eXBlIGZvciBhYnNvbHV0ZSBicmFuY2ggYWRkcmVzc2VzLiAgRGVsZXRlIHNwZWNpYWwKLQkiYmxlIiBhbmQgImJlIiBjb2RlIGluICdXJyBvcGVyYW5kIGNvZGUuCi0KLUZyaSBTZXAgMjQgMTQ6MDg6MzMgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBTZXQgaGF6YXJkIGluZm9ybWF0aW9uIGNvcnJlY3RseSBmb3IgYnJhbmNoCi0JbGlrZWx5IGluc3RydWN0aW9ucy4KLQotRnJpIFNlcCAxNyAwNDo0MToxNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIGFscGhhLWRpcy5jIChwcmludF9pbnNuX2FscGhhKSwgYWxwaGEtb3BjLmg6ICBGaXggYnVncywgdXNlCi0JaW5mby0+ZnByaW50Zl9mdW5jIGZvciBwcmludGluZyBhbmQgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIGZvcgotCWFkZHJlc3Mgb3V0cHV0LgotCi1XZWQgU2VwIDE1IDEyOjEyOjA3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogU2V0IElOU05fVFJBUCBmb3IgdFhYIGluc3RydWN0aW9ucy4KLQotVGh1IFNlcCAgOSAxMDoxMToyNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKToKLQlDb3JyZWN0ZWQgc2Vjb25kIGNhc2Ugb2YgImIiIGZvciBkaXNhc3NlbWJsZXIuCi0KLVR1ZSBTZXAgIDcgMTQ6MjU6MTUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jLCBtODhrLWRpcy5jOiBEb24ndCBpbmNsdWRlIGxpYmJmZC5oLiAgQ2hhbmdlZCBjYWxscwotCXRvIEJGRCBzd2FwcGluZyByb3V0aW5lcyB0byBjb3JyZXNwb25kIHRvIEJGRCBuYW1lIGNoYW5nZXMuCi0KLVRodSBTZXAgIDIgMTA6MzU6MjUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBDaGFuZ2UgZGl2IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gdG8gYmUgeixzLHQgcmF0aGVyCi0JdGhhbiBzLHQuICBDaGFuZ2UgZGl2IG1hY3JvIHRvIGJlIGQsdix0IHJhdGhlciB0aGFuIGQscyx0LgotCUxpa2V3aXNlIGZvciBkaXZ1LCBkZGl2LCBkZGl2dS4gIEFkZGVkIHoscyx0IGNhc2UgZm9yIGRyZW0sIGRyZW11LAotCXJlbSBhbmQgcmVtdSB3aGljaCBnZW5lcmF0ZXMgb25seSB0aGUgY29ycmVzcG9uZGluZyBkaXYKLQlpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTUlQUyBhc3NlbWJsZXIsCi0Jd2hpY2ggb25seSBnZW5lcmF0ZXMgdGhlIHNpbXBsZSBtYWNoaW5lIGluc3RydWN0aW9uIHdoZW4gYW4KLQlleHBsaWNpdCBkZXN0aW5hdGlvbiBvZiAkMCBpcyB1c2VkLgotCSogbWlwcy1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiBIYW5kbGUgJ3onIChhbHdheXMgcmVnaXN0ZXIgemVybykuCi0KLVRodSBBdWcgMjYgMTc6NDE6NDQgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jOiBGcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6IFNldAotCVdSXzMxIGhhemFyZCBmb3IgYmFsLCBiZ2V6YWwsIGJsdHphbC4KLQotVGh1IEF1ZyAyNiAxNzoyMDowMiAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogVXNlIHByaW50IGZ1bmN0aW9uCi0JZnJvbSB3aXRoaW4gdGhlIGRpc2Fzc2VtYmxlX2luZm8sIG5vdCBmcHJpbnRmX2ZpbHRlcmVkLgotCi1XZWQgQXVnIDI1IDEzOjUxOjQwIDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBjYW1icmlkZ2UuY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhKTogSGFuZGxlICd8JyBsaWtlICc+Jy4gIChGcm9tIEplZmYKLQlMYXcsIGxhd0Bjcy51dGFoLmVkdS4pCi0KLU1vbiBBdWcgMjMgMTI6NDQ6MDUgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkB0d2VlZGxlZHVtYi5jeWdudXMuY29tKQotCi0JKiBtaXBzLW9wYy5jICgiYWJzdSIpOiBSZW1vdmVkLgotCSgiZGFicyIpOiBBZGRlZC4KLQotRnJpIEF1ZyAyMCAxMDo1Mjo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEFkZGVkIHI2MDAwIGFuZCByNDAwMCBpbnN0cnVjdGlvbnMgYW5kIG1hY3Jvcy4KLQlDaGFuZ2VkIGhhemFyZCBpbmZvcm1hdGlvbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG1lbW9yeSBsb2FkCi0JZGVsYXlzIGFuZCBjb3Byb2Nlc3NvciBsb2FkIGRlbGF5cy4KLQotV2VkIEF1ZyAxOCAxNTozOToyMyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IGxpLmQgdXNlcyAiVCxMIiwgbm90ICJTLEYiLiAgQWRkZWQgbGkucy4KLQotVHVlIEF1ZyAxNyAwOTo0NDo0MiAxOTkzICBEYXZpZCBKLiBNYWNrZW56aWUgIChkam1AdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogRG9uJ3QgcGFzcyBjcHUgdG8gY29uZmlnLmJmZC4KLQotVHVlIEF1ZyAxNyAxMjoyMzo1MiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG04OGstZGlzLmMgKG04OGtkaXMpOiBNYWtlIGNsYXNzIHVuc2lnbmVkLgotCi1UaHUgQXVnIDEyIDE1OjA4OjE4IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYWxwaGEtZGlzLmMgKHByaW50X2luc25fYWxwaGEpOiBPbmUgYnJhbmNoIGZvcm1hdCBjYXNlIHdhcwotCW1pc3NpbmcgdGhlIGluc3RydWN0aW9uIG5hbWUuCi0KLVdlZCBBdWcgMTEgMTk6Mjk6MzkgMTk5MyAgRGF2aWQgSi4gTWFja2VuemllICAoZGptQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoQUxMX01BQ0hJTkVTKTogUmVuYW1lZCBmcm9tIERJU19MSUJTLgotCUFkZCB0aGUgYXJjaC1zcGVjaWZpYyBhdXhpbGlhcnkgZmlsZXMuCi0JKE9GSUxFUyk6IFJlbW92ZSB0aGUgYXJjaC1zcGVjaWZpYyBhdXhpbGlhcnkgZmlsZXMKLQlhbmQgdXNlIEJGRF9NQUNISU5FUyBpbnN0ZWFkIG9mIERJU19MSUJTLgotCSogY29uZmlndXJlLmluOiBTZXQgQkZEX01BQ0hJTkVTIGJhc2VkIG9uIC0td2l0aC10YXJnZXRzIG9wdGlvbi4KLQotVGh1IEF1ZyAxMiAxMjowNDo1MyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEFkZGVkIGx3YzEgRSxBKGIpIHRvIGdvIHdpdGggbHdjMSBULEEoYikuICBTaW1pbGFybHkKLQlmb3Igc3djMS4KLQotU3VuIEF1ZyAgOCAxNTowOTozMCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtb3BjLmM6IENoYW5nZSBDT05TVCB0byBjb25zdCB0byBkZWFsIHdpdGggZ2NjCi0JLURjb25zdD1fX2NvbnN0IC10cmFkaXRpb25hbC4KLQotRnJpIEF1ZyAgNiAxMDo1ODo1NSAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtb3BjLmM6IEZyb20gZGF2aWRqQElDU0kuQmVya2VsZXkuRURVIChEYXZpZCBKb2huc29uKTogVG9vawotCWNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyBvdXQgb2YgI2lmIDAsIGFuZCBtYWRlIHRoZW0gdXNlIG5ldwotCWFyZ3VtZW50IHR5cGUgIkMiLgotCi1UaHUgQXVnICA1IDE3OjExOjA2IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBzcGFyYy1kaXMuYzogSW5jbHVkZSBhbnNpZGVjbC5oIGJlZm9yZSBvcGNvZGVzL3NwYXJjLmguCi0KLUZyaSBKdWwgMzAgMTg6NDg6MTUgMTk5MyAgSm9obiBHaWxtb3JlICAoZ251QGN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jOiAgQWRkIEZfSlNSLCBGX1VOQlIsIG9yIEZfQ09OREJSIGZsYWdzIHRvIGVhY2ggYnJhbmNoCi0JaW5zdHJ1Y3Rpb24sIGZvciB1c2UgYnkgdGhlIGRpc2Fzc2VtYmxlci4KLQotCSogc3BhcmMtZGlzLmMgKFNFWCk6ICBBZGQgc2lnbiBleHRlbnNpb24gbWFjcm8uICBSZXBsYWNlIG1hbnkKLQloYW5kLWNvZGVkIHNpZ24gZXh0ZW5zaW9ucyB0aGF0IGRlcGVuZGVkIG9uIDMyLWJpdCBob3N0IGludHMuCi0JRklYTUUsIHdlIHN0aWxsIGRlcGVuZCBvbiBiaWctZW5kaWFuIGhvc3QgYml0ZmllbGQgb3JkZXJpbmcuCi0JKHNwYXJjX3ByaW50X2luc24pOiAgU2V0IHRoZSBpbnNuX2luZm9fdmFsaWQgZmllbGQsIGFuZCB0aGUKLQlvdGhlciBmaWVsZHMgdGhhdCBkZXNjcmliZSB0aGUgaW5zdHJ1Y3Rpb24gYmVpbmcgcHJpbnRlZC4KLQotVHVlIEp1bCAyNyAxNzowNDo1OCAxOTkzICBKaW0gV2lsc29uICAod2lsc29uQHNwaGFnbnVtLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLW9wYy5jIChjYWxsKTogQWNjZXB0IGFsbCA2IGFkZHJlc3NpbmcgbW9kZXMgdmFsaWQgZm9yCi0JYGptcCcgaW5zdGVhZCBvZiBqdXN0IG9uZSBvZiB0aGVtLgotCi1XZWQgSnVsIDIxIDExOjQzOjMyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBNb3ZlIGZsb2F0aW5nIHJlZ2lzdGVycyBmcm9tIHJlZ19uYW1lcyB0byBmcF9yZWdfbmFtZXMuCi0JKGZwdXRfZnBfcmVnX3IpOiBSZW5hbWVkIGZyb20gZnB1dF9yZWdfci4KLQkoZnB1dF9mcF9yZWcpOiBOZXcgZnVuY3Rpb24uCi0JKHByaW50X2luc25faHBwYSk6IFVzZSBmcHV0X2ZwX3JlZ3ssX3J9IHdoZXJlIGFwcHJvcHJpYXRlLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEsIGNhc2VzICdhJywgJ2QnKTogUHJpbnQgc3BhY2UgYWZ0ZXJ3YXJkcy4KLQotCSogaHBwYS1kaXMuYyAocHJpbnRfaW5zbl9ocHBhLCBjYXNlICdkJyk6IFVzZSBHRVRfQ09ORCBub3QgR0VUX0ZJRUxELgotCi1Nb24gSnVsIDE5IDEzOjUyOjIxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBkZW5lYi5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBVc2UgZXh0cmFjdF81cl9zdG9yZSBmb3IgJ3InLgotCi0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEsIGNhc2UgJz4nKTogSWYgbmV4dCBjaGFyYWN0ZXIgaXMgJ24nLAotCWRvbid0IG91dHB1dCBhIHNwYWNlLgotCi0JKiBocHBhLWRpcy5jIChmbG9hdF9mb3JtYXRfbmFtZXMpOiAxMCBpcyB1bmRlZmluZWQsIGFuZCAxMSBpcyBxdWFkLgotCi1TdW4gSnVsIDE4IDE2OjMwOjAyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBydGwuY3lnbnVzLmNvbSkKLQotCSogbWlwcy1vcGMuYzogTmV3IGZpbGUsIGNvbnRhaW5pbmcgb3Bjb2RlIHRhYmxlIGZyb20KLQkuLi9pbmNsdWRlL29wY29kZS9taXBzLmguCi0JKiBNYWtlZmlsZS5pbjogQWRkIGl0LgotCi1UaHUgSnVsIDE1IDEyOjM3OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AdHdlZWRsZWR1bWIuY3lnbnVzLmNvbSkKLQotCSogbTg4ay1kaXMuYzogTmV3IGZpbGUsIG1vdmVkIGluIGZyb20gZ2RiIGFuZCBjaGFuZ2VkIHRvIHVzZSB0aGUKLQluZXcgZGlzLWFzbS5oIGRpc2Fzc2VtYmxlciBpbnRlcmZhY2UuCi0JKiBNYWtlZmlsZS5pbiAoRElTX0xJQlMpOiBBZGRlZCBtODhrLWRpcy5vLgotCShtODhrLWRpcy5vKTogTmV3IHRhcmdldC4KLQotVHVlIEp1bCAxMyAxMDowNDoxNiAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnLCBfcHJpbnRfaW5zbl9taXBzKTogTWFkZSBwb2ludGVyIHRvCi0JYXJndW1lbnQgc3RyaW5nIGNvbnN0IGNoYXIgKiB0byBjb3JyZXNwb25kIHRvIG9wY29kZS9taXBzLmguCi0KLVR1ZSBKdWwgIDYgMTU6MTg6MzcgMTk5MyAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jOiBVcGRhdGVkIHRvIGFjY291bnQgZm9yIG5hbWUgY2hhbmdlcyBpbiBuZXcgdmVyc2lvbgotCW9mIG9wY29kZS9taXBzLmguCi0JKiBNYWtlZmlsZS5pbjogQWRkZWQgaGVhZGVyIGZpbGUgZGVwZW5kZW5jaWVzLgotCi1TYXQgSnVsICAzIDIzOjQ3OjU2IDE5OTMgIERvdWcgRXZhbnMgIChkamVAY2FudWNrLmN5Z251cy5jb20pCi0KLQkqIGg4MzAwLWRpcy5jIChiZmRfaDhfZGlzYXNzZW1ibGUpOiBDb3JyZWN0IGZldGNoaW5nIG9mIGluc3RydWN0aW9uLgotCi1UaHUgSnVsICAxIDEyOjIzOjM4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBtNjhrLWRpcy5jIChORVhUV09SRCwgTkVYVExPTkcpOiBVc2UgKCh4KSBeIDB4ODAwMCkgLSAweDgwMDAgdG8gc2lnbgotCWV4dGVuZCwgcmF0aGVyIHRoYW4gc2hpZnRzLgotCi1TdW4gSnVuIDIwIDIwOjU2OjU2IDE5OTMgIEtlbiBSYWVidXJuICAocmFlYnVybkBwb3NlaWRvbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogVW5kbyAxNSBKdW5lIGNoYW5nZS4KLQotRnJpIEp1biAxOCAxNDoxNToxNSAxOTkzICBQZXIgQm90aG5lciAgKGJvdGhuZXJAZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl9hcmcpOiAgQ2hhbmdlIHJldHVybiB2YWx1ZSB0byBieXRlIGNvdW50Ci0Jb3IgZXJyb3IgY29kZS4KLQkqIG02OGstZGlzLmM6ICBSZS13cml0ZSB0byBkZXRlY3QgaW52YWxpZCBvcGVyYW5kcyBiZWZvcmUKLQlwcmludGluZyBhbnl0aGluZywgc28gd2UgY2FuIGhhbmRsZSB0aGlzIHRoZSBzYW1lIHdheSB3ZQotCWhhbmRsZSBpbnZhbGlkIG9wY29kZXMuCi0KLVRodSBKdW4gMTcgMTU6MDE6MzYgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAcGh5ZGVhdXguY3lnbnVzLmNvbSkKLQotCSogc2gtZGlzLmMsIHNoLW9wYy5oOiBVbmRlcnN0YW5kIHNvbWUgbW9yZSBvcGNvZGVzLgotCi1XZWQgSnVuIDE2IDEzOjQ4OjA1IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogaHBwYS1kaXMuYzogSW5jbHVkZSA8YW5zaWRlY2wuaD4gYW5kIHN5c2RlcC5oIGJlZm9yZSBvdGhlcgotCWhlYWRlciBmaWxlcy4KLQotVHVlIEp1biAxNSAyMTo0NToyNiAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIHNwYXJjLWRpcy5jOiBEb24ndCBkZWNsYXJlIHFzb3J0LCBzaW5jZSBzeXNkZXAuaCBtaWdodC4KLQotCSogY29uZmlndXJlLmluOiBEbyBtYWtlIHN5c2RlcC5oIGxpbmsuCi0JKiBNYWtlZmlsZS5pbjogU2VhcmNoIC4uL2luY2x1ZGUuICBEb24ndCBzZWFyY2ggLi4vYmZkLgotCi1UdWUgSnVuIDE1IDEzOjM2OjEwIDE5OTMgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQlDaGFuZ2VzIGZyb20gSmVmZiBMYXcsIGxhd0Bjcy51dGFoLmVkdToKLQkqIGhwcGEtZGlzLmM6IEZpeCB0eXBvLiAgJ2EnIGFuZCAnZCcgd2VyZSByZXZlcnNlZC4KLQlEbyBub3QgcHJpbnQgYSBzcGFjZSBiZWZvcmUgdGhlIGNvbXBsZXRlcnMgc3BlY2lmaWVkIGJ5Ci0JJ2EnIGFuZCAnZCcuCi0KLUZyaSBKdW4gMTEgMTg6NDA6MjEgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmM6IE5vIGxvbmdlciBuZWVkIHRvIGJvbWIgb3V0IGlmIEhPU1RfNjRfQklUIGlzCi0JZGVmaW5lZCwgc2luY2UgZ2RiIGhhcyBiZWVuIGZpeGVkLgotCi0JQ2hhbmdlcyBmcm9tIEplZmYgTGF3LCBsYXdAY3MudXRhaC5lZHU6Ci0JKiBocHBhLWRpcy5jIChwcmludF9pbnNuX2hwcGEpOiBMYXN0IGFyZ3VtZW50IHRvIGZwdXRfcmVnLAotCWZwdXRfcmVnX3IsIGZwdXRfY3JlZywgZnB1dF9jb25zdCwgYW5kIGZwdXRzX2ZpbHRlcmVkIHNob3VsZAotCWJlIGEgKmRpc2Fzc2VtYmxlX2luZm8sIG5vdCBhICpGSUxFLgotCSogaHBwYS1kaXMuYzogU3VwcG9ydCAnZCcsICchJywgYW5kICdhJy4KLQkqIGhwcGEtZGlzLmM6IFN1cHBvcnQgJ3MnIHRvIGV4dHJhY3QgYSAyIGJpdCBzcGFjZSByZWdpc3Rlci4KLQkqIGhwcGEtZGlzLmM6IERlbGV0ZSBjYXNlcyB3aGljaCBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KLQotRnJpIEp1biAxMSAwNzo1Mzo0OCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYyAocHJpbnRfaW5zbl97bTY4ayxhcmd9KTogQWRkIE1NVSBjb2Rlcy4KLQotVHVlIEp1biAgOCAxMjoyNTowMSAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BwaHlkZWF1eC5jeWdudXMuY29tKQotCi0JKiBoODMwMC1kaXMuYzogTmV3IGZpbGUsIHJlbW92ZWQgZnJvbSBiZmQvY3B1LWg4MzAwLmMsIHdpdGgKLQlIOC8zMDAtSCBvcGNvZGVzLgotCi1Nb24gSnVuICA3IDEyOjU4OjQ5IDE5OTMgIFBlciBCb3RobmVyICAoYm90aG5lckBydGwuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKENTRUFSQ0gpOiBBZGQgLUkuLi9iZmQgZm9yIHN5c2RlcC5oIGFuZCBiZmQuaC4KLQkqIGNvbmZpZ3VyZS5pbjogIE5vIGxvbmdlciBuZWVkIHRvIGNvbmZpZ3VyZSB0byBnZXQgc3lzZGVwLmguCi0KLVRodSBKdW4gIDMgMTU6NTY6NDkgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogUGF0Y2hlcyBmcm9tIEplZmZyZXkgTGF3IDxsYXdAY3MudXRhaC5lZHU+LgotCSogaHBwYS1kaXMuYzogU3VwcG9ydCAnSScsICdKJywgYW5kICdLJyBpbiBvdXRwdXQKLQl0ZW1wbGF0ZXMgZm9yIDEuMSBGUCBjb21wdXRhdGlvbmFsIGluc3RydWN0aW9ucy4KLQotVHVlIE1heSAyNSAxMzowNTo0OCAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jIChwcmludF9pbnNuX2g4NTAwKTogQWRkcmVzcyBhcmd1bWVudCBpcyB0eXBlCi0JYmZkX3ZtYS4KLQkqIHo4ay1kaXMuYyAocHJpbnRfaW5zbl96OGssIHByaW50X2luc25fejgwMDEsIHByaW50X2luc25fejgwMDIpOgotCURpdHRvLgotCi0JKiBoODUwMC1vcGMuaCAoYWRkcl9jbGFzc190eXBlKTogTm8gY29tbWEgYXQgZW5kIG9mIGVudW1lcmF0b3IuCi0JKiBzaC1vcGMuaCAoc2hfbmliYmxlX3R5cGUsIHNoX2FyZ190eXBlKTogRGl0dG8uCi0KLQkqIHNwYXJjLWRpcy5jIChjb21wYXJlX29wY29kZXMpOiBNb3ZlIHN0YXRpYyBkZWNsYXJhdGlvbiB0bwotCXRvcC1sZXZlbC4KLQotRnJpIE1heSAyMSAxNDoxNzozNyAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIHNwYXJjLWRpcy5jIChwcmludF9pbnNuX3NwYXJjKTogSW1wbGVtZW50ICduJyBhcmd1bWVudCBmb3IgdW5pbXAKLQlpbnN0cnVjdGlvbiwgcmVtb3ZlIHVuaW1wIGhhY2sgZnJvbSAnbCcgYXJndW1lbnQuCi0KLVdlZCBNYXkgMTkgMTU6MzU6NTQgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jIChmZXRjaF9kYXRhKTogIFVzZSB1bnNpZ25lZCBjaGFyIHRvIG1ha2UgYW5jaWVudCBnY2MncwotCWhhcHB5LgotCi1GcmkgTWF5IDE0IDE1OjIyOjQ2IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogQmFzZWQgb24gcGF0Y2hlcyBmcm9tIGRhdmlkakBJQ1NJLkJlcmtlbGV5LkVEVSAoRGF2aWQgSm9obnNvbik6Ci0JKiBtaXBzLWRpcy5jIChwcmludF9pbnNuX2FyZyk6IEhhbmRsZSAnQycgZm9yIGdlbmVyYWwgY29wcm9jZXNzb3IKLQlpbnN0cnVjdGlvbnMuCi0KLUZyaSBNYXkgMTQgMDA6MDk6MTQgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBJbmNsdWRlIGRpcy1hc20uaCBiZWZvcmUgc3lzZGVwLmguICBDaGFuZ2VkIHNvbWUKLQlhcnJheXMgb2Ygc3RyaW5nIHBvaW50ZXJzIHRvIDItZCBhcnJheXMgb2YgY2hhcnMsIHRvIHNhdmUKLQlzcGFjZS4KLQotVGh1IE1heSAgNiAyMDo1MToxNyAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYywgYWxwaGEtZGlzLmMsIGk5NjAtZGlzLmMsIHNwYXJjLWRpcy5jLCB6OGstZGlzLmM6Ci0JQ2FzdCBzZWNvbmQgYXJnIHRvIHJlYWRfbWVtb3J5X2Z1bmMgdG8gImJmZF9ieXRlICoiLCBhcyBuZWNlc3NhcnkuCi0KLVR1ZSBNYXkgIDQgMjA6MzE6MTAgMTk5MyAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBocHBhLWRpcy5jOiBOZXcgZmlsZSBmcm9tIFV0YWgsIGFkYXB0ZWQgdG8gbmV3IGRpc2Fzc2VtYmxlcgotCWNhbGxpbmcgaW50ZXJmYWNlLgotCSogTWFrZWZpbGUuaW46IEluY2x1ZGUgaXQuCi0KLU1vbiBBcHIgMjYgMTg6MTc6NDIgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHNoLWRpcy5jLCBzaC1vcGMuaDogTmV3IGZpbGVzLgotCi1GcmkgQXByIDIzIDE4OjUxOjIyIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiBhbHBoYS1kaXMuYywgYWxwaGEtb3BjLmg6IE5ldyBmaWxlcy4KLQotVHVlIEFwciAgNiAxMjo1NDowOCAxOTkzICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIG1pcHMtZGlzLmM6IFNpZ24gZXh0ZW5kICdqJyBhbmQgJ2InIGFyZ3VtZW50cywgZGVsdGEgaXMgYSBzaWduZWQKLQl2YWx1ZS4KLQotTW9uIEFwciAgNSAxNzozNzozNyAxOTkzICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IE1ha2UgInRhIiB0aGUgZGVmYXVsdCB0cmFwIGluc3RydWN0aW9uLCAidCIgdGhlIGFsaWFzLgotCi1GcmkgQXByICAyIDA3OjI0OjI3IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogYTI5ay1kaXMuYywgc3BhcmMtZGlzLmMsIHNwYXJjLW9wYy5jOiBVc2UgQ09OU1QgcmF0aGVyIHRoYW4KLQljb25zdC4KLQotVGh1IEFwciAgMSAxMToyMDo0MyAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogc3BhcmMtZGlzLmM6IFVzZSBmcHJpbnRmX2Z1bmMgYSBmZXcgcGxhY2VzIHdoZXJlIEkgZm9yZ290LAotCWFuZCBkb3VibGUgcGVyY2VudCBzaWducyBhIGZldyBwbGFjZXMuCi0KLQkqIGEyOWstZGlzLmMsIGk5NjAtZGlzLmM6IE5ldywgbWVyZ2VkIGZyb20gZ2RiIGFuZCBiaW51dGlscy4KLQotCSogaTM4Ni1kaXMuYywgbTY4ay1kaXMuYywgbWlwcy1kaXMuYywgc3BhcmMtZGlzLmM6Ci0JVXNlIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyBub3QgcHJpbnRfYWRkcmVzcy4KLQotCSogZGlzLWJ1Zi5jIChnZW5lcmljX3ByaW50X2FkZHJlc3MpOiBOZXcgZnVuY3Rpb24uCi0KLVdlZCBNYXIgMzEgMTA6MDc6MDQgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgc3BhcmMtZGlzLmMuCi0Jc3BhcmMtZGlzLmM6IE5ldyBmaWxlLCBtZXJnZXMgYmludXRpbHMgYW5kIGdkYiB2ZXJzaW9ucyBhcyBmb2xsb3dzOgotCUZyb20gR0RCOgotCSAgICBBZGQgYGFkZCcgaW5zdHJ1Y3Rpb24gdG8gdGhlIHNldCB0aGF0IGdldCBjaGVja2VkCi0JICAgIGZvciBhIHByZWNlZGluZyBgc2V0aGknIGluIG9yZGVyIHRvIHByaW50IGFuIGFic29sdXRlIGFkZHJlc3MuCi0JICAgICogKHByaW50X2luc24pOiAgRGlzYXNzZW1ibHkgcHJlZmVycyByZWFsIGluc3RydWN0aW9ucy4KLQkgICAgKGlzX2RlbGF5ZWRfYnJhbmNoKTogIFNwZWVkIHVwLgotCSAgICAqIHNwYXJjLW9wY29kZS5oOiBBZGQgQUxJQVMgYml0IHRvIGFsaWFzZXMuICBGaXggdXAgb3Bjb2RlIHRhYmxlcy4KLQkgICAgU3RpbGwgbWlzc2luZyBzb21lIGZsb2F0IG9wcywgYW5kIG5lZWRzIHRlc3RpbmcuCi0JICAgICogc3BhcmMtcGluc24uYyAocHJpbnRfaW5zbik6IEVsaW1pbmF0ZSAnc2V0JyB0ZXN0LCBzdWJzdW1lZCBieQotCSAgICBGX0FMSUFTLiAgVXNlIHByaW50Ziwgbm90IGZwcmludGYsIHdoZW4gbm90IHBhc3NpbmcgYSBmaWxlCi0JICAgIHBvaW50ZXIuLi4KLQkgICAgKGNvbXBhcmVfb3Bjb2Rlcyk6IENoZWNrIHRoYXQgaWRlbnRpY2FsIGluc3RydWN0aW9ucyBoYXZlCi0JICAgIGlkZW50aWNhbCBvcGNvZGVzLCBjb21wbGFpbiBvdGhlcndpc2UuCi0JRnJvbSBiaW51dGlsczoKLQkgICAgKiBOZXcgJ20nIGFyZy4KLQkgICAgKiBJbmNsdWRlIHJlZ19uYW1lcy4KLQlGcm9tIG5laXRoZXI6Ci0JICAgIFVzZSBkaXMtYXNtLmgvcmVhZF9tZW1vcnlfZnVuYyBpbnRlcmZhY2UuCi0KLVdlZCBNYXIgMzEgMjA6NDk6MDYgMTk5MyAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBoODUwMC1kaXMuYywgaTM4Ni1kaXMuYywgbTY4ay1kaXMuYywgejhrLWRpcy5jIChmZXRjaF9kYXRhKToKLQkgIGRlbGliZXJhdGVseSByZXR1cm4gbm9uLXplcm8gdG8gc2V0am1wIGZyb20gbG9uZ2ptcC4gIE90aGVyd2lzZQotCSAgdGhpcyBjb2RlIGZhaWxzIHRvIGNvbXBpbGUuCi0KLVdlZCBNYXIgMzEgMTc6MDQ6MzEgMTk5MyAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3lnbnVzLmNvbSkKLQotCSogbTY4ay1kaXMuYzogIEZpeCBwcm90b3R5cGUgZm9yIGZldGNoX2FyZygpLgotCi1XZWQgTWFyIDMxIDEwOjA3OjA0IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBkaXMtYnVmLmM6IE5ldyBmaWxlLCBmb3IgbmV3IHJlYWRfbWVtb3J5X2Z1bmMgaW50ZXJmYWNlLgotCU1ha2VmaWxlLmluIChPRklMRVMpOiBJbmNsdWRlIGl0LgotCW02OGstZGlzLmMsIGkzODYtZGlzLmMsIGg4NTAwLWRpcy5jLCBtaXBzLWRpcy5jLCB6OGstZGlzLmM6Ci0JVXNlIG5ldyByZWFkX21lbW9yeV9mdW5jIGludGVyZmFjZS4KLQotTW9uIE1hciAyOSAxNDowMjoxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogaDg1MDAtZGlzLmMgKHByaW50X2luc25faDg1MDApOiBHZXQgc2lnbiBvZiBmcCBvZmZzZXRzIHJpZ2h0LgotCSogaDg1MDAtb3BjLmg6IEZpeCBjb3VwbGUgb2Ygb3Bjb2Rlcy4KLQotV2VkIE1hciAyNCAwMjowMzozNiAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBkdmkgJiBpbnN0YWxsY2hlY2sgdGFyZ2V0cwotCi1Nb24gTWFyIDIyIDE4OjU1OjA0IDE5OTMgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIFVwZGF0ZSBmb3IgaDg1MDAtZGlzLmMuCi0KLUZyaSBNYXIgMTkgMTQ6Mjc6MTcgMTk5MyAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIGg4NTAwLWRpcy5jLCBoODUwMC1vcGMuaDogTmV3IGZpbGVzCi0KLVRodSBNYXIgMTggMTQ6MTI6MzcgMTk5MyAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBtaXBzLWRpcy5jLCB6OGstZGlzLmM6ICBDb252ZXJ0ZWQgdG8gdXNlIGludGVyZmFjZSBkZWZpbmVkIGluCi0JLi4vaW5jbHVkZS9kaXMtYXNtLmguCi0JKiBtNjhrLWRpcy5jOiAgTmV3IGZpbGUgKG1lcmdlIG9mIC4uL2JpbnV0aWxzL202OGstcGluc24uYwotCWFuZCAuLi9nZGIvbTY4ay1waW5zbi5jKS4KLQkqIGkzODYtZGlzLmM6ICBOZXcgZmlsZSAobWVyZ2Ugb2YgLi4vYmludXRpbHMvaTM4Ni1waW5zbi5jCi0JYW5kIC4uL2dkYi9pMzg2LXBpbnNuLmMpLgotCSogbTY4ODgxLWV4dC5jOiAgTmV3IGZpbGUuICBNb3ZlZCBkZWZpbml0aW9uIG9mCi0JZXh0X2Zvcm1hdCBleHRfZm9ybWF0XzY4ODgxIGZyb20gLi4vZ2RiL202OGstdGRlcC5jLgotCSogTWFrZWZpbGUuaW46ICBBZGp1c3QgZm9yIG5ldyBmaWxlcy4KLQkqIGkzODYtZGlzLmM6ICBQYXRjaGVzIGZyb20gSm9obiBIYXNzZXkgKGhhc3NleUBkZy1ydHAuZGcuY29tKS4KLQkqIG02OGstZGlzLmM6ICBSZWNvZ25pemUgJzknIHBsYWNlbWVudCBjb2RlLCBzbyAoc2F5KSBwZmx1c2gKLQljYW4gYmUgZGlzLWFzc2VtYmxlZC4KLQotV2VkIEZlYiAxNyAwOToxOTo0NyAxOTkzICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmMgKHByaW50X2luc25fYXJnKTogTm93IHJldHVybnMgdm9pZC4KLQotTW9uIEphbiAxMSAxNjowOToxNiAxOTkzICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogbWlwcy1kaXMuYyAoYW5zaWRlY2wuaCk6ICBJbmNsdWRlIGZvciBiZW5lZml0IG9mIHN5c2RlcC5oCi0JZmlsZXMgdGhhdCB1c2UgdGhlIG1hY3Jvcy4KLQotVGh1IEphbiAgNyAxMzoxNToxNyAxOTkzICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIG1pcHMtZGlzLmM6IE5ldyBmaWxlLCBmcm9tIGdkYi9taXBzLXBpbnNuLmMuCi0JKiBNYWtlZmlsZS5pbiAoRElTX0xJQlMpOiBBZGRlZCBtaXBzLWRpcy5vLgotCShDRklMRVMpOiBBZGRlZCBtaXBzLWRpcy5jLgotCi1UaHUgSmFuICA3IDA3OjM2OjMzIDE5OTMgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0gICAgCSogejhrLWRpcy5jIChwcmludF9pbnNuX3o4MDAxLCBwcmludF9pbnNuX3o4MDAyKTogbmV3IHJvdXRpbmVzCi0JKiB6OGtnZW4uYywgejhrLW9wYy5oOiBmaXggc2l6ZXMgb2Ygc29tZSBzaGlmdHMuCi0KLVR1ZSBEZWMgMjIgMTU6NDI6NDQgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogIEltcHJvdmUgKmNsZWFuIHJ1bGVzLgotCSogY29uZmlndXJlLmluOiAgQWxsb3cgYSBkZWZhdWx0IGhvc3QuCi0KLVR1ZSBOb3YgMTcgMTk6NTM6NTQgMTk5MiAgZGF2aWQgZCBgem9vJyB6dWhuICAoem9vIGF0IGNpcmRhbi5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWxzbyB1c2UgLUkkKHNyY2RpcikvLi4vYmZkLCBzaW5jZSBzb21lIHN5c2RlcAotCWZpbGVzIGluY2x1ZGUgb3RoZXIgc3lzZGVwIGZpbGVzCi0KLVRodSBOb3YgMTIgMTY6MTA6MzcgMTk5MiAgU3RldmUgQ2hhbWJlcmxhaW4gIChzYWNAdGhlcHViLmN5Z251cy5jb20pCi0KLQkqIHo4ay1kaXMuYyB6OGstb3BjLmggejhrZ2VuLmM6IGNoZWNrcG9pbnQKLQotRnJpIE9jdCAgOSAwNDo1NjowNSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgRm9yIGhvc3Qgc3VwcG9ydCwgdXNlIC4uL2JmZC9jb25maWd1cmUuaG9zdAotCXNvIGl0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgLi4vYmZkL2hvc3RzIGRhdGFiYXNlLgotCi1UaHUgT2N0ICAxIDIzOjM4OjU0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgY3B1LXZlbmRvci1vcyB0cmlwbGUgaW5zdGVhZCBvZiBuZXN0ZWQgY2FzZXMKLQotV2VkIFNlcCAzMCAxNjowOToyMCAxOTkyICBNaWNoYWVsIFdlcm5lciAgKG10d0BjeWdudXMuY29tKQotCi0JKiB6OGstZGlzLmMgKHVucGFyc2VfaW5zdHIpOiBmaXggYnVnIHdoZXJlIG9wY29kZSByZXR1cm5lZCB3YXMKLQkqYWx3YXlzKiB0aGUgd3Jvbmcgb25lLgotCi1XZWQgU2VwIDMwIDA3OjQyOjE3IDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQHRoZXB1Yi5jeWdudXMuY29tKQotCi0JKiB6OGtnZW4uYzogYWRkZWQgY29weXJpZ2h0IGluZm8KLQotVHVlIFNlcCAyOSAxMjoyMDoyMSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jICh1bnBhcnNlX2luc3RyKTogcHJldHRpZXIgdGFicwotCSogejhrZ2VuLmMgLT4gejhrLW9wYy5oOiBidWcgZml4ZXMgaW4gdGFibGVzCi0KLUZyaSBTZXAgMjUgMTI6NTA6MzIgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQWRkIG5jciogY29uZmlndXJhdGlvbi4KLQkqIHo4ay1kaXMuYyAoc3RydWN0IGluc3RyX2RhdGFfcyk6ICBNYWtlIGluc3RyX2FzbXNyYyBjaGFyIHRvIG1ha2UKLQlwaWNheXVuZSBBTlNJIGNvbXBpbGVycyBoYXBweS4KLQotU2VwIDIwIDA4OjUwOjU1IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGkzODYpOiAgTWFrZSBpMzg2IGFuZCBpNDg2IHN5bm9ueW1vdXMgZm9yIG5vdy4KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNF04Ni0qLXN5c3Y0KTogIEFkZCBteV9ob3N0IGRlZmluaXRpb24uCi0KLUZyaSBTZXAgMTggMTc6MDE6MjMgMTk5MiAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGNhbWJyaWRnZS5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IEZpeCB0eXBvLgotCi1GcmkgU2VwIDE4IDAyOjA0OjI0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAobWFrZSk6ICBSZW1vdmUgb2Jzb2xldGUgY3J1ZC4KLQkoc3BhcmMtb3BjLm8pOiAgQXZvaWQgU3VuIE1ha2UgVlBBVEggYnVnLgotCi1UdWUgU2VwICA4IDE3OjI5OjI3IDE5OTIgIEsuIFJpY2hhcmQgUGl4bGV5ICAocmljaEBzZW5kYWkuY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IHNpbmNlIHRoZXJlIGFyZSBubyBTVUJESVJTLCByZW1vdmUgcnVsZSBhbmQKLQlyZWZlcmVuY2VzIG9mIHN1YmRpcl9kby4KLQotVHVlIFNlcCAgOCAxNzowMjo1OCAxOTkyICBLZW4gUmFlYnVybiAgKHJhZWJ1cm5AY2FtYnJpZGdlLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogR2V0IHRoZSBsaWJyYXJ5IG5hbWUgcmlnaHQgaGVyZSB0b28uCi0JRG9uJ3QgaW5zdGFsbCBiZmQuaCwgc2luY2UgaXQncyB1bnJlbGF0ZWQgdG8gdGhpcyBsaWJyYXJ5LiAgTm8KLQlzdWJkaXJzIHRvIHJlY3Vyc2UgaW50bywgZWl0aGVyLgotCShDRklMRVMpOiBUaGUgc291cmNlIGZpbGUgaGFzIGEgLmMgc3VmZml4LCBub3QgLm8uCi0KLQkqIHNwYXJjLW9wYy5jOiBOZXcgZmlsZSwgbW92ZWQgZnJvbSBCRkQuCi0JKiBNYWtlZmlsZS5pbiAoT0ZJTEVTKTogQnVpbGQgaXQuCi0KLVRodSBTZXAgIDMgMTY6NTk6MjAgMTk5MiAgTWljaGFlbCBXZXJuZXIgIChtdHdAY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jOiBmaXhlZCBmb3J3YXJkIHJlZmZlcmVuY2VzIG9mIHNvbWUgZGVjbGFyYXRpb25zLgotCi1Nb24gQXVnIDMxIDE2OjA5OjQ1IDE5OTIgIE1pY2hhZWwgV2VybmVyICAobXR3QGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBnZXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkgcmlnaHQKLQotTW9uIEF1ZyAzMSAxMzo0NzozNSAxOTkyICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogejhrLWRpcy5jOiBrbm93cyBob3cgdG8gZGlzYXNzZW1ibGUgejhrIHN0dWZmCi0JKiB6OGstb3BjLmg6IG5ldyBmaWxlIGZ1bGwgb2YgejgwMDAgb3Bjb2RlcwotCi0MCi1Mb2NhbCBWYXJpYWJsZXM6Ci12ZXJzaW9uLWNvbnRyb2w6IG5ldmVyCi1FbmQ6CmRpZmYgLS1naXQgYS9vcGNvZGVzL01ha2VmaWxlLmFtIGIvb3Bjb2Rlcy9NYWtlZmlsZS5hbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmYWJjNS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gZ2VuZXJhdGUgTWFrZWZpbGUuaW4KLQotQVVUT01BS0VfT1BUSU9OUyA9IGN5Z251cwotCi1TVUJESVJTID0gcG8KLQotSU5DRElSID0gJChzcmNkaXIpLy4uL2luY2x1ZGUKLUJGRERJUiA9ICQoc3JjZGlyKS8uLi9iZmQKLURFUCA9IG1rZGVwCi0KLWxpYl9MVExJQlJBUklFUyA9IGxpYm9wY29kZXMubGEKLQotIyBUaGlzIGlzIHdoZXJlIGJmZC5oIGxpdmVzLgotQkZEX0ggPSAuLi9iZmQvYmZkLmgKLQotIyBIZWFkZXIgZmlsZXMuCi1IRklMRVMgPSBcCi0JYXJtLW9wYy5oIFwKLQlmcjMwLWRlc2MuaCBmcjMwLW9wYy5oIFwKLQloODUwMC1vcGMuaCBcCi0JbTMyci1kZXNjLmggbTMyci1vcGMuaCBcCi0JbWNvcmUtb3BjLmggXAotCXNoLW9wYy5oIFwKLQlzeXNkZXAuaCBcCi0JdzY1LW9wYy5oIFwKLQl6OGstb3BjLmgKLQotIyBDIHNvdXJjZSBmaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gLm8ncy4KLUNGSUxFUyA9IFwKLQlhMjlrLWRpcy5jIFwKLQlhbHBoYS1kaXMuYyBcCi0JYWxwaGEtb3BjLmMgXAotCWFyYy1kaXMuYyBcCi0JYXJjLW9wYy5jIFwKLQlhcm0tZGlzLmMgXAotCWNnZW4tYXNtLmMgXAotCWNnZW4tZGlzLmMgXAotCWNnZW4tb3BjLmMgXAotCWQxMHYtZGlzLmMgXAotCWQxMHYtb3BjLmMgXAotCWQzMHYtZGlzLmMgXAotCWQzMHYtb3BjLmMgXAotCWRpcy1idWYuYyBcCi0JZGlzYXNzZW1ibGUuYyBcCi0JZnIzMC1hc20uYyBcCi0JZnIzMC1kZXNjLmMgXAotCWZyMzAtZGlzLmMgXAotCWZyMzAtaWJsZC5jIFwKLQlmcjMwLW9wYy5jIFwKLQloODMwMC1kaXMuYyBcCi0JaDg1MDAtZGlzLmMgXAotCWhwcGEtZGlzLmMgXAotCWkzODYtZGlzLmMgXAotCWk5NjAtZGlzLmMgXAotCW0zMnItYXNtLmMgXAotCW0zMnItZGVzYy5jIFwKLQltMzJyLWRpcy5jIFwKLQltMzJyLWlibGQuYyBcCi0JbTMyci1vcGMuYyBcCi0JbTMyci1vcGluc3QuYyBcCi0JbTY4ay1kaXMuYyBcCi0JbTY4ay1vcGMuYyBcCi0JbTg4ay1kaXMuYyBcCi0JbWNvcmUtZGlzLmMgXAotCW1pcHMtZGlzLmMgXAotCW1pcHMtb3BjLmMgXAotCW1pcHMxNi1vcGMuYyBcCi0JbTEwMjAwLWRpcy5jIFwKLQltMTAyMDAtb3BjLmMgXAotCW0xMDMwMC1kaXMuYyBcCi0JbTEwMzAwLW9wYy5jIFwKLQluczMyay1kaXMuYyBcCi0JcHBjLWRpcy5jIFwKLQlwcGMtb3BjLmMgXAotCXNoLWRpcy5jIFwKLQlzcGFyYy1kaXMuYyBcCi0Jc3BhcmMtb3BjLmMgXAotCXRpYzMwLWRpcy5jIFwKLQl0aWM4MC1kaXMuYyBcCi0JdGljODAtb3BjLmMgXAotCXY4NTAtZGlzLmMgXAotCXY4NTAtb3BjLmMgXAotCXZheC1kaXMuYyBcCi0JdzY1LWRpcy5jIFwKLQl6OGstZGlzLmMgXAotCXo4a2dlbi5jCi0KLUFMTF9NQUNISU5FUyA9IFwKLQlhMjlrLWRpcy5sbyBcCi0JYWxwaGEtZGlzLmxvIFwKLQlhbHBoYS1vcGMubG8gXAotCWFyYy1kaXMubG8gXAotCWFyYy1vcGMubG8gXAotCWFybS1kaXMubG8gXAotCWNnZW4tYXNtLmxvIFwKLQljZ2VuLWRpcy5sbyBcCi0JY2dlbi1vcGMubG8gXAotCWQxMHYtZGlzLmxvIFwKLQlkMTB2LW9wYy5sbyBcCi0JZDMwdi1kaXMubG8gXAotCWQzMHYtb3BjLmxvIFwKLQlmcjMwLWFzbS5sbyBcCi0JZnIzMC1kZXNjLmxvIFwKLQlmcjMwLWRpcy5sbyBcCi0JZnIzMC1pYmxkLmxvIFwKLQlmcjMwLW9wYy5sbyBcCi0JaDgzMDAtZGlzLmxvIFwKLQloODUwMC1kaXMubG8gXAotCWhwcGEtZGlzLmxvIFwKLQlpMzg2LWRpcy5sbyBcCi0JaTk2MC1kaXMubG8gXAotCW0zMnItYXNtLmxvIFwKLQltMzJyLWRlc2MubG8gXAotCW0zMnItZGlzLmxvIFwKLQltMzJyLWlibGQubG8gXAotCW0zMnItb3BjLmxvIFwKLQltMzJyLW9waW5zdC5sbyBcCi0JbTY4ay1kaXMubG8gXAotCW02OGstb3BjLmxvIFwKLQltODhrLWRpcy5sbyBcCi0JbTEwMjAwLWRpcy5sbyBcCi0JbTEwMjAwLW9wYy5sbyBcCi0JbTEwMzAwLWRpcy5sbyBcCi0JbTEwMzAwLW9wYy5sbyBcCi0JbWNvcmUtZGlzLmxvIFwKLQltaXBzLWRpcy5sbyBcCi0JbWlwcy1vcGMubG8gXAotCW1pcHMxNi1vcGMubG8gXAotCXBwYy1kaXMubG8gXAotCXBwYy1vcGMubG8gXAotCW5zMzJrLWRpcy5sbyBcCi0Jc2gtZGlzLmxvIFwKLQlzcGFyYy1kaXMubG8gXAotCXNwYXJjLW9wYy5sbyBcCi0JdGljMzAtZGlzLmxvIFwKLQl0aWM4MC1kaXMubG8gXAotCXRpYzgwLW9wYy5sbyBcCi0Jdjg1MC1kaXMubG8gXAotCXY4NTAtb3BjLmxvIFwKLQl2YXgtZGlzLmxvIFwKLQl3NjUtZGlzLmxvIFwKLQl6OGstZGlzLmxvCi0KLU9GSUxFUyA9IEBCRkRfTUFDSElORVNACi0KLUlOQ0xVREVTID0gLURfR05VX1NPVVJDRSAtSS4gLUkkKHNyY2RpcikgLUkuLi9iZmQgLUkkKElOQ0RJUikgLUkkKEJGRERJUikgQEhERUZJTkVTQCAtSSQoc3JjZGlyKS8uLi9pbnRsIC1JLi4vaW50bAotCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyAkKElOQ0RJUikvZGlzLWFzbS5oCi0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jIEBhcmNoZGVmc0AgJChzcmNkaXIpL2Rpc2Fzc2VtYmxlLmMKLQotbGlib3Bjb2Rlc19sYV9TT1VSQ0VTID0gIGRpcy1idWYuYyBkaXNhc3NlbWJsZS5jCi1saWJvcGNvZGVzX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKQotbGlib3Bjb2Rlc19sYV9MSUJBREQgPSAkKE9GSUxFUykgQFdJTjMyTElCQUREQAotbGlib3Bjb2Rlc19sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJvcGNvZGVzLmEuICBXZSBjcmVhdGUgbGlib3Bjb2Rlcy5hIGluCi0jIHRoZSBidWlsZCBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZQotIyBwcm9ncmFtcyB0aGF0IHVzZSBsaWJvcGNvZGVzLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaAotIyBzaG91bGQgYmUgcmVtb3ZlZCBpZiBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYm9wY29kZXMuYQotCi1zdGFtcC1saWI6IGxpYm9wY29kZXMubGEKLQlpZiBbIC1mIC5saWJzL2xpYm9wY29kZXMuYSBdOyB0aGVuIFwKLQkgIGNwIC5saWJzL2xpYm9wY29kZXMuYSBsaWJvcGNvZGVzLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYm9wY29kZXMudG1wIGxpYm9wY29kZXMuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGlib3Bjb2Rlcy5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotCi1QT1RGSUxFUyA9ICQoSEZJTEVTKSAkKENGSUxFUykKLXBvL1BPVEZJTEVTLmluOiBATUFJTlRAIE1ha2VmaWxlCi0JZm9yIGZpbGUgaW4gJChQT1RGSUxFUyk7IGRvIGVjaG8gJCRmaWxlOyBkb25lIHwgc29ydCA+IHRtcCBcCi0JICAmJiBtdiB0bXAgJChzcmNkaXIpL3BvL1BPVEZJTEVTLmluCi0KLSMgV2Ugc2hvdWxkIHJlY29uZmlndXJlIHdoZW5ldmVyIGJmZC9jb25maWd1cmUuaW4gY2hhbmdlcywgYmVjYXVzZQotIyB0aGF0J3Mgd2hlcmUgdGhlIHZlcnNpb24gbnVtYmVyIGNvbWVzIGZyb20uCi1jb25maWcuc3RhdHVzOiAkKHNyY2RpcikvY29uZmlndXJlICQoc3JjZGlyKS8uLi9iZmQvY29uZmlndXJlLmluCi0JJChTSEVMTCkgLi9jb25maWcuc3RhdHVzIC0tcmVjaGVjawotCi1DTEVBTkZJTEVTID0gXAotCWxpYm9wY29kZXMuYSBzdGFtcC1saWIgZGVwLnNlZCAuZGVwIC5kZXAxCi0KLQotCi0jIFRoZSBzdGFydCBtYXJrZXIgaXMgd3JpdHRlbiB0aGlzIHdheSB0byBwYXNzIHRocm91Z2ggYXV0b21ha2UgdW5zY2F0aGVkLgotCi0KLQotCi0jIFRoaXMgZGVwZW5kZW5jeSBzdHVmZiBpcyBjb3BpZWQgZnJvbSBCRkQuCi0KLS5kZXA6IGRlcC5zZWQgJChDRklMRVMpICQoSEZJTEVTKSBjb25maWcuaAotCXJtIC1mIC5kZXAxCi0JJChNQUtFKSBERVA9JChERVApIC5kZXAxCi0Jc2VkIC1mIGRlcC5zZWQgPCAuZGVwMSA+IC5kZXAKLQotLmRlcDE6ICQoQ0ZJTEVTKQotCXJtIC1mIC5kZXAyIC5kZXAyYQotCWVjaG8gJyMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4nID4gLmRlcDIKLQllY2hvID4gLmRlcDJhCi0JJChERVApIC1mIC5kZXAyYSAkKElOQ0xVREVTKSAkKENGTEFHUykgJD8KLQlzZWQgLWUgJy9ETyBOT1QgREVMRVRFL2QnIC1lICcvXiQkL2QnIDwgLmRlcDJhID4+IC5kZXAyCi0Jcm0gLWYgLmRlcDJhCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIC5kZXAyIC5kZXAxCi0KLWRlcC5zZWQ6IGRlcC1pbi5zZWQgY29uZmlnLnN0YXR1cwotCXNlZCA8JChzcmNkaXIpL2RlcC1pbi5zZWQgPmRlcC5zZWQJXAotCQktZSAncyFAQkZEX0hAISQoQkZEX0gpIScJXAotCQktZSAncyFASU5DRElSQCEkKElOQ0RJUikhJwlcCi0JCS1lICdzIUBCRkRESVJAISQoQkZERElSKSEnCVwKLQkJLWUgJ3MhQFNSQ0RJUkAhJChzcmNkaXIpIScKLQotZGVwOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCBNYWtlZmlsZSA+IHRtcC1NYWtlZmlsZQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUgTWFrZWZpbGUKLQotZGVwLWluOiAuZGVwCi0Jc2VkIC1lICcvXi4uRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCQkZCcgPCAkKHNyY2RpcikvTWFrZWZpbGUuaW4gPiB0bXAtTWFrZWZpbGUuaW4KLQljYXQgLmRlcCA+PiB0bXAtTWFrZWZpbGUuaW4KLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgdG1wLU1ha2VmaWxlLmluICQoc3JjZGlyKS9NYWtlZmlsZS5pbgotCi1kZXAtYW06IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5hbSA+IHRtcC1NYWtlZmlsZS5hbQotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5hbQotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuYW0gJChzcmNkaXIpL01ha2VmaWxlLmFtCi0KLS5QSE9OWTogZGVwIGRlcC1pbiBkZXAtYW0KLQotIyBXaGF0IGFwcGVhcnMgYmVsb3cgaXMgZ2VuZXJhdGVkIGJ5IGEgaGFja2VkIG1rZGVwIHVzaW5nIGdjYyAtTU0uCi0KLSMgRE8gTk9UIERFTEVURSBUSElTIExJTkUgLS0gbWtkZXAgdXNlcyBpdC4KLSMgRE8gTk9UIFBVVCBBTllUSElORyBBRlRFUiBUSElTIExJTkUsIElUIFdJTEwgR08gQVdBWS4KLWEyOWstZGlzLmxvOiBhMjlrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2EyOWsuaAotYWxwaGEtZGlzLmxvOiBhbHBoYS1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9hbHBoYS5oCi1hbHBoYS1vcGMubG86IGFscGhhLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYWxwaGEuaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1hcmMtZGlzLmxvOiBhcmMtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggJChCRkRESVIpL2VsZi1iZmQuaCBcCi0gICQoSU5DRElSKS9lbGYvY29tbW9uLmggJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggJChJTkNESVIpL2VsZi9hcmMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oIFwKLSAgb3BpbnRsLmgKLWFyYy1vcGMubG86IGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2FyYy5oIFwKLSAgb3BpbnRsLmgKLWFybS1kaXMubG86IGFybS1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgYXJtLW9wYy5oICQoSU5DRElSKS9jb2ZmL2ludGVybmFsLmggJChCRkRESVIpL2xpYmNvZmYuaCBcCi0gICQoSU5DRElSKS9iZmRsaW5rLmggb3BpbnRsLmggJChCRkRESVIpL2VsZi1iZmQuaCAkKElOQ0RJUikvZWxmL2NvbW1vbi5oIFwKLSAgJChJTkNESVIpL2VsZi9pbnRlcm5hbC5oICQoSU5DRElSKS9lbGYvZXh0ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2FybS5oIFwKLSAgJChJTkNESVIpL2VsZi9yZWxvYy1tYWNyb3MuaAotY2dlbi1hc20ubG86IGNnZW4tYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgb3BpbnRsLmgKLWNnZW4tZGlzLmxvOiBjZ2VuLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9saWJpYmVydHkuaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaAotY2dlbi1vcGMubG86IGNnZW4tb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1kMTB2LWRpcy5sbzogZDEwdi1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL2QxMHYuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWQxMHYtb3BjLmxvOiBkMTB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oCi1kMzB2LWRpcy5sbzogZDMwdi1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2QzMHYuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWQzMHYtb3BjLmxvOiBkMzB2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oCi1kaXMtYnVmLmxvOiBkaXMtYnVmLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIG9waW50bC5oCi1kaXNhc3NlbWJsZS5sbzogZGlzYXNzZW1ibGUuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLWZyMzAtYXNtLmxvOiBmcjMwLWFzbS5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kZXNjLmxvOiBmcjMwLWRlc2MuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtZGlzLmxvOiBmcjMwLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWlibGQubG86IGZyMzAtaWJsZC5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLW9wYy5sbzogZnIzMC1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmgKLWg4MzAwLWRpcy5sbzogaDgzMDAtZGlzLmMgJChJTkNESVIpL29wY29kZS9oODMwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotaDg1MDAtZGlzLmxvOiBoODUwMC1kaXMuYyBoODUwMC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmggb3BpbnRsLmgKLWhwcGEtZGlzLmxvOiBocHBhLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKEJGRERJUikvbGliaHBwYS5oICQoSU5DRElSKS9vcGNvZGUvaHBwYS5oCi1pMzg2LWRpcy5sbzogaTM4Ni1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggY29uZmlnLmggb3BpbnRsLmgKLWk5NjAtZGlzLmxvOiBpOTYwLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaAotbTMyci1hc20ubG86IG0zMnItYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRlc2MubG86IG0zMnItZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1kaXMubG86IG0zMnItZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItaWJsZC5sbzogbTMyci1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItb3BjLmxvOiBtMzJyLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaAotbTMyci1vcGluc3QubG86IG0zMnItb3BpbnN0LmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tNjhrLWRpcy5sbzogbTY4ay1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL2Zsb2F0Zm9ybWF0Lmggb3BpbnRsLmggXAotICAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAotbTY4ay1vcGMubG86IG02OGstb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tNjhrLmgKLW04OGstZGlzLmxvOiBtODhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL204OGsuaCBvcGludGwuaAotbWNvcmUtZGlzLmxvOiBtY29yZS1kaXMuYyBtY29yZS1vcGMuaCAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLW1pcHMtZGlzLmxvOiBtaXBzLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL21pcHMuaCAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1taXBzLW9wYy5sbzogbWlwcy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21pcHMuaAotbWlwczE2LW9wYy5sbzogbWlwczE2LW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1tMTAyMDAtZGlzLmxvOiBtMTAyMDAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi1tMTAyMDAtb3BjLmxvOiBtMTAyMDAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9tbjEwMjAwLmgKLW0xMDMwMC1kaXMubG86IG0xMDMwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLW0xMDMwMC1vcGMubG86IG0xMDMwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAzMDAuaAotbnMzMmstZGlzLmxvOiBuczMyay1kaXMuYyAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBcCi0gIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChJTkNESVIpL29wY29kZS9uczMyay5oIFwKLSAgb3BpbnRsLmgKLXBwYy1kaXMubG86IHBwYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgJChJTkNESVIpL29wY29kZS9wcGMuaAotcHBjLW9wYy5sbzogcHBjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvcHBjLmggXAotICBvcGludGwuaAotc2gtZGlzLmxvOiBzaC1kaXMuYyBzaC1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXNwYXJjLWRpcy5sbzogc3BhcmMtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggc3lzZGVwLmggXAotICBjb25maWcuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9saWJpYmVydHkuaCBvcGludGwuaAotc3BhcmMtb3BjLmxvOiBzcGFyYy1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3NwYXJjLmgKLXRpYzMwLWRpcy5sbzogdGljMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvdGljMzAuaAotdGljODAtZGlzLmxvOiB0aWM4MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3RpYzgwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpCi10aWM4MC1vcGMubG86IHRpYzgwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaAotdjg1MC1kaXMubG86IHY4NTAtZGlzLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS92ODUwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIG9waW50bC5oCi12ODUwLW9wYy5sbzogdjg1MC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCBcCi0gIG9waW50bC5oCi12YXgtZGlzLmxvOiB2YXgtZGlzLmMgJChJTkNESVIpL29wY29kZS92YXguaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXc2NS1kaXMubG86IHc2NS1kaXMuYyB3NjUtb3BjLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oCi16OGstZGlzLmxvOiB6OGstZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpIHo4ay1vcGMuaAotejhrZ2VuLmxvOiB6OGtnZW4uYyBzeXNkZXAuaCBjb25maWcuaAotIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCmRpZmYgLS1naXQgYS9vcGNvZGVzL01ha2VmaWxlLmluIGIvb3Bjb2Rlcy9NYWtlZmlsZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlZDE3OS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL01ha2VmaWxlLmluCisrKyAvZGV2L251bGwKQEAgLTEsODY2ICswLDAgQEAKLSMgTWFrZWZpbGUuaW4gZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYXV0b21ha2UgMS40IGZyb20gTWFrZWZpbGUuYW0KLQotIyBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUtOCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgVGhpcyBNYWtlZmlsZS5pbiBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi0jIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHkgYW5kL29yIGRpc3RyaWJ1dGUgaXQsCi0jIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb25zLCBhcyBsb25nIGFzIHRoaXMgbm90aWNlIGlzIHByZXNlcnZlZC4KLQotIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBsYXc7IHdpdGhvdXQKLSMgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQQotIyBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLQotU0hFTEwgPSBAU0hFTExACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi1wcmVmaXggPSBAcHJlZml4QAotZXhlY19wcmVmaXggPSBAZXhlY19wcmVmaXhACi0KLWJpbmRpciA9IEBiaW5kaXJACi1zYmluZGlyID0gQHNiaW5kaXJACi1saWJleGVjZGlyID0gQGxpYmV4ZWNkaXJACi1kYXRhZGlyID0gQGRhdGFkaXJACi1zeXNjb25mZGlyID0gQHN5c2NvbmZkaXJACi1zaGFyZWRzdGF0ZWRpciA9IEBzaGFyZWRzdGF0ZWRpckAKLWxvY2Fsc3RhdGVkaXIgPSBAbG9jYWxzdGF0ZWRpckAKLWxpYmRpciA9IEBsaWJkaXJACi1pbmZvZGlyID0gQGluZm9kaXJACi1tYW5kaXIgPSBAbWFuZGlyQAotaW5jbHVkZWRpciA9IEBpbmNsdWRlZGlyQAotb2xkaW5jbHVkZWRpciA9IC91c3IvaW5jbHVkZQotCi1ERVNURElSID0KLQotcGtnZGF0YWRpciA9ICQoZGF0YWRpcikvQFBBQ0tBR0VACi1wa2dsaWJkaXIgPSAkKGxpYmRpcikvQFBBQ0tBR0VACi1wa2dpbmNsdWRlZGlyID0gJChpbmNsdWRlZGlyKS9AUEFDS0FHRUAKLQotdG9wX2J1aWxkZGlyID0gLgotCi1BQ0xPQ0FMID0gQEFDTE9DQUxACi1BVVRPQ09ORiA9IEBBVVRPQ09ORkAKLUFVVE9NQUtFID0gQEFVVE9NQUtFQAotQVVUT0hFQURFUiA9IEBBVVRPSEVBREVSQAotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQCAkKEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUykKLUlOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACi1JTlNUQUxMX1NDUklQVCA9IEBJTlNUQUxMX1NDUklQVEAKLXRyYW5zZm9ybSA9IEBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lQAotCi1OT1JNQUxfSU5TVEFMTCA9IDoKLVBSRV9JTlNUQUxMID0gOgotUE9TVF9JTlNUQUxMID0gOgotTk9STUFMX1VOSU5TVEFMTCA9IDoKLVBSRV9VTklOU1RBTEwgPSA6Ci1QT1NUX1VOSU5TVEFMTCA9IDoKLWJ1aWxkX2FsaWFzID0gQGJ1aWxkX2FsaWFzQAotYnVpbGRfdHJpcGxldCA9IEBidWlsZEAKLWhvc3RfYWxpYXMgPSBAaG9zdF9hbGlhc0AKLWhvc3RfdHJpcGxldCA9IEBob3N0QAotdGFyZ2V0X2FsaWFzID0gQHRhcmdldF9hbGlhc0AKLXRhcmdldF90cmlwbGV0ID0gQHRhcmdldEAKLUFSID0gQEFSQAotQVMgPSBAQVNACi1CRkRfTUFDSElORVMgPSBAQkZEX01BQ0hJTkVTQAotQ0FUQUxPR1MgPSBAQ0FUQUxPR1NACi1DQVRPQkpFWFQgPSBAQ0FUT0JKRVhUQAotQ0MgPSBAQ0NACi1DQ19GT1JfQlVJTEQgPSBAQ0NfRk9SX0JVSUxEQAotREFUQURJUk5BTUUgPSBAREFUQURJUk5BTUVACi1ETExUT09MID0gQERMTFRPT0xACi1FWEVFWFQgPSBARVhFRVhUQAotRVhFRVhUX0ZPUl9CVUlMRCA9IEBFWEVFWFRfRk9SX0JVSUxEQAotR01PRklMRVMgPSBAR01PRklMRVNACi1HTVNHRk1UID0gQEdNU0dGTVRACi1HVF9OTyA9IEBHVF9OT0AKLUdUX1lFUyA9IEBHVF9ZRVNACi1IREVGSU5FUyA9IEBIREVGSU5FU0AKLUlOQ0xVREVfTE9DQUxFX0ggPSBASU5DTFVERV9MT0NBTEVfSEAKLUlOU1RPQkpFWFQgPSBASU5TVE9CSkVYVEAKLUlOVExERVBTID0gQElOVExERVBTQAotSU5UTExJQlMgPSBASU5UTExJQlNACi1JTlRMT0JKUyA9IEBJTlRMT0JKU0AKLUxEID0gQExEQAotTElCVE9PTCA9IEBMSUJUT09MQAotTE5fUyA9IEBMTl9TQAotTUFJTlQgPSBATUFJTlRACi1NQUtFSU5GTyA9IEBNQUtFSU5GT0AKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLU1TR0ZNVCA9IEBNU0dGTVRACi1OTSA9IEBOTUAKLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVBPRklMRVMgPSBAUE9GSUxFU0AKLVBPU1VCID0gQFBPU1VCQAotUkFOTElCID0gQFJBTkxJQkAKLVVTRV9JTkNMVURFRF9MSUJJTlRMID0gQFVTRV9JTkNMVURFRF9MSUJJTlRMQAotVVNFX05MUyA9IEBVU0VfTkxTQAotVVNFX1NZTUJPTF9VTkRFUlNDT1JFID0gQFVTRV9TWU1CT0xfVU5ERVJTQ09SRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLVdJTjMyTERGTEFHUyA9IEBXSU4zMkxERkxBR1NACi1XSU4zMkxJQkFERCA9IEBXSU4zMkxJQkFEREAKLWFyY2hkZWZzID0gQGFyY2hkZWZzQAotbCA9IEBsQAotCi1BVVRPTUFLRV9PUFRJT05TID0gY3lnbnVzCi0KLVNVQkRJUlMgPSBwbwotCi1JTkNESVIgPSAkKHNyY2RpcikvLi4vaW5jbHVkZQotQkZERElSID0gJChzcmNkaXIpLy4uL2JmZAotREVQID0gbWtkZXAKLQotbGliX0xUTElCUkFSSUVTID0gbGlib3Bjb2Rlcy5sYQotCi0jIFRoaXMgaXMgd2hlcmUgYmZkLmggbGl2ZXMuCi1CRkRfSCA9IC4uL2JmZC9iZmQuaAotCi0jIEhlYWRlciBmaWxlcy4KLUhGSUxFUyA9IFwKLQlhcm0tb3BjLmggXAotCWZyMzAtZGVzYy5oIGZyMzAtb3BjLmggXAotCWg4NTAwLW9wYy5oIFwKLQltMzJyLWRlc2MuaCBtMzJyLW9wYy5oIFwKLQltY29yZS1vcGMuaCBcCi0Jc2gtb3BjLmggXAotCXN5c2RlcC5oIFwKLQl3NjUtb3BjLmggXAotCXo4ay1vcGMuaAotCi0KLSMgQyBzb3VyY2UgZmlsZXMgdGhhdCBjb3JyZXNwb25kIHRvIC5vJ3MuCi1DRklMRVMgPSBcCi0JYTI5ay1kaXMuYyBcCi0JYWxwaGEtZGlzLmMgXAotCWFscGhhLW9wYy5jIFwKLQlhcmMtZGlzLmMgXAotCWFyYy1vcGMuYyBcCi0JYXJtLWRpcy5jIFwKLQljZ2VuLWFzbS5jIFwKLQljZ2VuLWRpcy5jIFwKLQljZ2VuLW9wYy5jIFwKLQlkMTB2LWRpcy5jIFwKLQlkMTB2LW9wYy5jIFwKLQlkMzB2LWRpcy5jIFwKLQlkMzB2LW9wYy5jIFwKLQlkaXMtYnVmLmMgXAotCWRpc2Fzc2VtYmxlLmMgXAotCWZyMzAtYXNtLmMgXAotCWZyMzAtZGVzYy5jIFwKLQlmcjMwLWRpcy5jIFwKLQlmcjMwLWlibGQuYyBcCi0JZnIzMC1vcGMuYyBcCi0JaDgzMDAtZGlzLmMgXAotCWg4NTAwLWRpcy5jIFwKLQlocHBhLWRpcy5jIFwKLQlpMzg2LWRpcy5jIFwKLQlpOTYwLWRpcy5jIFwKLQltMzJyLWFzbS5jIFwKLQltMzJyLWRlc2MuYyBcCi0JbTMyci1kaXMuYyBcCi0JbTMyci1pYmxkLmMgXAotCW0zMnItb3BjLmMgXAotCW0zMnItb3BpbnN0LmMgXAotCW02OGstZGlzLmMgXAotCW02OGstb3BjLmMgXAotCW04OGstZGlzLmMgXAotCW1jb3JlLWRpcy5jIFwKLQltaXBzLWRpcy5jIFwKLQltaXBzLW9wYy5jIFwKLQltaXBzMTYtb3BjLmMgXAotCW0xMDIwMC1kaXMuYyBcCi0JbTEwMjAwLW9wYy5jIFwKLQltMTAzMDAtZGlzLmMgXAotCW0xMDMwMC1vcGMuYyBcCi0JbnMzMmstZGlzLmMgXAotCXBwYy1kaXMuYyBcCi0JcHBjLW9wYy5jIFwKLQlzaC1kaXMuYyBcCi0Jc3BhcmMtZGlzLmMgXAotCXNwYXJjLW9wYy5jIFwKLQl0aWMzMC1kaXMuYyBcCi0JdGljODAtZGlzLmMgXAotCXRpYzgwLW9wYy5jIFwKLQl2ODUwLWRpcy5jIFwKLQl2ODUwLW9wYy5jIFwKLQl2YXgtZGlzLmMgXAotCXc2NS1kaXMuYyBcCi0JejhrLWRpcy5jIFwKLQl6OGtnZW4uYwotCi0KLUFMTF9NQUNISU5FUyA9IFwKLQlhMjlrLWRpcy5sbyBcCi0JYWxwaGEtZGlzLmxvIFwKLQlhbHBoYS1vcGMubG8gXAotCWFyYy1kaXMubG8gXAotCWFyYy1vcGMubG8gXAotCWFybS1kaXMubG8gXAotCWNnZW4tYXNtLmxvIFwKLQljZ2VuLWRpcy5sbyBcCi0JY2dlbi1vcGMubG8gXAotCWQxMHYtZGlzLmxvIFwKLQlkMTB2LW9wYy5sbyBcCi0JZDMwdi1kaXMubG8gXAotCWQzMHYtb3BjLmxvIFwKLQlmcjMwLWFzbS5sbyBcCi0JZnIzMC1kZXNjLmxvIFwKLQlmcjMwLWRpcy5sbyBcCi0JZnIzMC1pYmxkLmxvIFwKLQlmcjMwLW9wYy5sbyBcCi0JaDgzMDAtZGlzLmxvIFwKLQloODUwMC1kaXMubG8gXAotCWhwcGEtZGlzLmxvIFwKLQlpMzg2LWRpcy5sbyBcCi0JaTk2MC1kaXMubG8gXAotCW0zMnItYXNtLmxvIFwKLQltMzJyLWRlc2MubG8gXAotCW0zMnItZGlzLmxvIFwKLQltMzJyLWlibGQubG8gXAotCW0zMnItb3BjLmxvIFwKLQltMzJyLW9waW5zdC5sbyBcCi0JbTY4ay1kaXMubG8gXAotCW02OGstb3BjLmxvIFwKLQltODhrLWRpcy5sbyBcCi0JbTEwMjAwLWRpcy5sbyBcCi0JbTEwMjAwLW9wYy5sbyBcCi0JbTEwMzAwLWRpcy5sbyBcCi0JbTEwMzAwLW9wYy5sbyBcCi0JbWNvcmUtZGlzLmxvIFwKLQltaXBzLWRpcy5sbyBcCi0JbWlwcy1vcGMubG8gXAotCW1pcHMxNi1vcGMubG8gXAotCXBwYy1kaXMubG8gXAotCXBwYy1vcGMubG8gXAotCW5zMzJrLWRpcy5sbyBcCi0Jc2gtZGlzLmxvIFwKLQlzcGFyYy1kaXMubG8gXAotCXNwYXJjLW9wYy5sbyBcCi0JdGljMzAtZGlzLmxvIFwKLQl0aWM4MC1kaXMubG8gXAotCXRpYzgwLW9wYy5sbyBcCi0Jdjg1MC1kaXMubG8gXAotCXY4NTAtb3BjLmxvIFwKLQl2YXgtZGlzLmxvIFwKLQl3NjUtZGlzLmxvIFwKLQl6OGstZGlzLmxvCi0KLQotT0ZJTEVTID0gQEJGRF9NQUNISU5FU0AKLQotSU5DTFVERVMgPSAtRF9HTlVfU09VUkNFIC1JLiAtSSQoc3JjZGlyKSAtSS4uL2JmZCAtSSQoSU5DRElSKSAtSSQoQkZERElSKSBASERFRklORVNAIC1JJChzcmNkaXIpLy4uL2ludGwgLUkuLi9pbnRsCi0KLWxpYm9wY29kZXNfbGFfU09VUkNFUyA9IGRpcy1idWYuYyBkaXNhc3NlbWJsZS5jCi1saWJvcGNvZGVzX2xhX0RFUEVOREVOQ0lFUyA9ICQoT0ZJTEVTKQotbGlib3Bjb2Rlc19sYV9MSUJBREQgPSAkKE9GSUxFUykgQFdJTjMyTElCQUREQAotbGlib3Bjb2Rlc19sYV9MREZMQUdTID0gLXJlbGVhc2UgJChWRVJTSU9OKSBAV0lOMzJMREZMQUdTQAotCi0jIGxpYnRvb2wgd2lsbCBidWlsZCAubGlicy9saWJvcGNvZGVzLmEuICBXZSBjcmVhdGUgbGlib3Bjb2Rlcy5hIGluCi0jIHRoZSBidWlsZCBkaXJlY3Rvcnkgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNvbnZlcnQgYWxsIHRoZQotIyBwcm9ncmFtcyB0aGF0IHVzZSBsaWJvcGNvZGVzLmEgc2ltdWx0YW5lb3VzbHkuICBUaGlzIGlzIGEgaGFjayB3aGljaAotIyBzaG91bGQgYmUgcmVtb3ZlZCBpZiBldmVyeXRoaW5nIGVsc2Ugc3RhcnRzIHVzaW5nIGxpYnRvb2wuICBGSVhNRS4KLQotbm9pbnN0X0xJQlJBUklFUyA9IGxpYm9wY29kZXMuYQotCi1QT1RGSUxFUyA9ICQoSEZJTEVTKSAkKENGSUxFUykKLQotQ0xFQU5GSUxFUyA9IFwKLQlsaWJvcGNvZGVzLmEgc3RhbXAtbGliIGRlcC5zZWQgLmRlcCAuZGVwMQotCi1BQ0xPQ0FMX000ID0gJCh0b3Bfc3JjZGlyKS9hY2xvY2FsLm00Ci1ta2luc3RhbGxkaXJzID0gJChTSEVMTCkgJCh0b3Bfc3JjZGlyKS8uLi9ta2luc3RhbGxkaXJzCi1DT05GSUdfSEVBREVSID0gY29uZmlnLmgKLUNPTkZJR19DTEVBTl9GSUxFUyA9IAotTElCUkFSSUVTID0gICQobm9pbnN0X0xJQlJBUklFUykKLQotCi1ERUZTID0gQERFRlNAIC1JLiAtSSQoc3JjZGlyKSAtSS4KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotbGlib3Bjb2Rlc19hX0xJQkFERCA9IAotbGlib3Bjb2Rlc19hX1NPVVJDRVMgPSBsaWJvcGNvZGVzLmEuYwotbGlib3Bjb2Rlc19hX09CSkVDVFMgPSAgbGlib3Bjb2Rlcy5hLm8KLUxUTElCUkFSSUVTID0gICQobGliX0xUTElCUkFSSUVTKQotCi1saWJvcGNvZGVzX2xhX09CSkVDVFMgPSAgZGlzLWJ1Zi5sbyBkaXNhc3NlbWJsZS5sbwotQ0ZMQUdTID0gQENGTEFHU0AKLUNPTVBJTEUgPSAkKENDKSAkKERFRlMpICQoSU5DTFVERVMpICQoQU1fQ1BQRkxBR1MpICQoQ1BQRkxBR1MpICQoQU1fQ0ZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKEFNX0NQUEZMQUdTKSAkKENQUEZMQUdTKSAkKEFNX0NGTEFHUykgJChDRkxBR1MpCi1DQ0xEID0gJChDQykKLUxJTksgPSAkKExJQlRPT0wpIC0tbW9kZT1saW5rICQoQ0NMRCkgJChBTV9DRkxBR1MpICQoQ0ZMQUdTKSAkKExERkxBR1MpIC1vICRACi1ESVNUX0NPTU1PTiA9ICAuL3N0YW1wLWguaW4gQ2hhbmdlTG9nIE1ha2VmaWxlLmFtIE1ha2VmaWxlLmluIFwKLWFjaW5jbHVkZS5tNCBhY2xvY2FsLm00IGNvbmZpZy5pbiBjb25maWd1cmUgY29uZmlndXJlLmluCi0KLQotRElTVEZJTEVTID0gJChESVNUX0NPTU1PTikgJChTT1VSQ0VTKSAkKEhFQURFUlMpICQoVEVYSU5GT1MpICQoRVhUUkFfRElTVCkKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLVNPVVJDRVMgPSBsaWJvcGNvZGVzLmEuYyAkKGxpYm9wY29kZXNfbGFfU09VUkNFUykKLU9CSkVDVFMgPSBsaWJvcGNvZGVzLmEubyAkKGxpYm9wY29kZXNfbGFfT0JKRUNUUykKLQotYWxsOiBhbGwtcmVkaXJlY3QKLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLlMgLmMgLmxvIC5vIC5zCi0kKHNyY2RpcikvTWFrZWZpbGUuaW46IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgTWFrZWZpbGUuYW0gJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT01BS0UpIC0tY3lnbnVzIE1ha2VmaWxlCi0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kQCBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSQoQUNMT0NBTF9NNCk6IEBNQUlOVEFJTkVSX01PREVfVFJVRUAgY29uZmlndXJlLmluICBhY2luY2x1ZGUubTQKLQljZCAkKHNyY2RpcikgJiYgJChBQ0xPQ0FMKQotJChzcmNkaXIpL2NvbmZpZ3VyZTogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAkKENPTkZJR1VSRV9ERVBFTkRFTkNJRVMpCi0JY2QgJChzcmNkaXIpICYmICQoQVVUT0NPTkYpCi0KLWNvbmZpZy5oOiBzdGFtcC1oCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mIHN0YW1wLWg7IFwKLQkJJChNQUtFKSBzdGFtcC1oOyBcCi0JZWxzZSA6OyBmaQotc3RhbXAtaDogJChzcmNkaXIpL2NvbmZpZy5pbiAkKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1cwotCWNkICQodG9wX2J1aWxkZGlyKSBcCi0JICAmJiBDT05GSUdfRklMRVM9IENPTkZJR19IRUFERVJTPWNvbmZpZy5oOmNvbmZpZy5pbiBcCi0JICAgICAkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMKLQlAZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1oIDI+IC9kZXYvbnVsbAotJChzcmNkaXIpL2NvbmZpZy5pbjogQE1BSU5UQUlORVJfTU9ERV9UUlVFQCQoc3JjZGlyKS9zdGFtcC1oLmluCi0JQGlmIHRlc3QgISAtZiAkQDsgdGhlbiBcCi0JCXJtIC1mICQoc3JjZGlyKS9zdGFtcC1oLmluOyBcCi0JCSQoTUFLRSkgJChzcmNkaXIpL3N0YW1wLWguaW47IFwKLQllbHNlIDo7IGZpCi0kKHNyY2Rpcikvc3RhbXAtaC5pbjogJCh0b3Bfc3JjZGlyKS9jb25maWd1cmUuaW4gJChBQ0xPQ0FMX000KSAKLQljZCAkKHRvcF9zcmNkaXIpICYmICQoQVVUT0hFQURFUikKLQlAZWNobyB0aW1lc3RhbXAgPiAkKHNyY2Rpcikvc3RhbXAtaC5pbiAyPiAvZGV2L251bGwKLQotbW9zdGx5Y2xlYW4taGRyOgotCi1jbGVhbi1oZHI6Ci0KLWRpc3RjbGVhbi1oZHI6Ci0JLXJtIC1mIGNvbmZpZy5oCi0KLW1haW50YWluZXItY2xlYW4taGRyOgotCi1tb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVM6Ci0KLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQktdGVzdCAteiAiJChub2luc3RfTElCUkFSSUVTKSIgfHwgcm0gLWYgJChub2luc3RfTElCUkFSSUVTKQotCi1kaXN0Y2xlYW4tbm9pbnN0TElCUkFSSUVTOgotCi1tYWludGFpbmVyLWNsZWFuLW5vaW5zdExJQlJBUklFUzoKLQotLmMubzoKLQkkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLm86Ci0JJChDT01QSUxFKSAtYyAkPAotCi0uUy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tY29tcGlsZToKLQktcm0gLWYgKi5vIGNvcmUgKi5jb3JlCi0KLWNsZWFuLWNvbXBpbGU6Ci0KLWRpc3RjbGVhbi1jb21waWxlOgotCS1ybSAtZiAqLnRhYi5jCi0KLW1haW50YWluZXItY2xlYW4tY29tcGlsZToKLQotLmMubG86Ci0JJChMSUJUT09MKSAtLW1vZGU9Y29tcGlsZSAkKENPTVBJTEUpIC1jICQ8Ci0KLS5zLmxvOgotCSQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDT01QSUxFKSAtYyAkPAotCi0uUy5sbzoKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgJDwKLQotbW9zdGx5Y2xlYW4tbGlidG9vbDoKLQktcm0gLWYgKi5sbwotCi1jbGVhbi1saWJ0b29sOgotCS1ybSAtcmYgLmxpYnMgX2xpYnMKLQotZGlzdGNsZWFuLWxpYnRvb2w6Ci0KLW1haW50YWluZXItY2xlYW4tbGlidG9vbDoKLQotbW9zdGx5Y2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLWNsZWFuLWxpYkxUTElCUkFSSUVTOgotCS10ZXN0IC16ICIkKGxpYl9MVExJQlJBUklFUykiIHx8IHJtIC1mICQobGliX0xUTElCUkFSSUVTKQotCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLW1haW50YWluZXItY2xlYW4tbGliTFRMSUJSQVJJRVM6Ci0KLWluc3RhbGwtbGliTFRMSUJSQVJJRVM6ICQobGliX0xUTElCUkFSSUVTKQotCUAkKE5PUk1BTF9JTlNUQUxMKQotCSQobWtpbnN0YWxsZGlycykgJChERVNURElSKSQobGliZGlyKQotCUBsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRwOyB0aGVuIFwKLQkgICAgZWNobyAiJChMSUJUT09MKSAgLS1tb2RlPWluc3RhbGwgJChJTlNUQUxMKSAkJHAgJChERVNURElSKSQobGliZGlyKS8kJHAiOyBcCi0JICAgICQoTElCVE9PTCkgIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJCRwICQoREVTVERJUikkKGxpYmRpcikvJCRwOyBcCi0JICBlbHNlIDo7IGZpOyBcCi0JZG9uZQotCi11bmluc3RhbGwtbGliTFRMSUJSQVJJRVM6Ci0JQCQoTk9STUFMX1VOSU5TVEFMTCkKLQlsaXN0PSckKGxpYl9MVExJQlJBUklFUyknOyBmb3IgcCBpbiAkJGxpc3Q7IGRvIFwKLQkgICQoTElCVE9PTCkgIC0tbW9kZT11bmluc3RhbGwgcm0gLWYgJChERVNURElSKSQobGliZGlyKS8kJHA7IFwKLQlkb25lCi0KLWxpYm9wY29kZXMubGE6ICQobGlib3Bjb2Rlc19sYV9PQkpFQ1RTKSAkKGxpYm9wY29kZXNfbGFfREVQRU5ERU5DSUVTKQotCSQoTElOSykgLXJwYXRoICQobGliZGlyKSAkKGxpYm9wY29kZXNfbGFfTERGTEFHUykgJChsaWJvcGNvZGVzX2xhX09CSkVDVFMpICQobGlib3Bjb2Rlc19sYV9MSUJBREQpICQoTElCUykKLQotIyBUaGlzIGRpcmVjdG9yeSdzIHN1YmRpcmVjdG9yaWVzIGFyZSBtb3N0bHkgaW5kZXBlbmRlbnQ7IHlvdSBjYW4gY2QKLSMgaW50byB0aGVtIGFuZCBydW4gYG1ha2UnIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGlzIE1ha2VmaWxlLgotIyBUbyBjaGFuZ2UgdGhlIHZhbHVlcyBvZiBgbWFrZScgdmFyaWFibGVzOiBpbnN0ZWFkIG9mIGVkaXRpbmcgTWFrZWZpbGVzLAotIyAoMSkgaWYgdGhlIHZhcmlhYmxlIGlzIHNldCBpbiBgY29uZmlnLnN0YXR1cycsIGVkaXQgYGNvbmZpZy5zdGF0dXMnCi0jICAgICAod2hpY2ggd2lsbCBjYXVzZSB0aGUgTWFrZWZpbGVzIHRvIGJlIHJlZ2VuZXJhdGVkIHdoZW4geW91IHJ1biBgbWFrZScpOwotIyAoMikgb3RoZXJ3aXNlLCBwYXNzIHRoZSBkZXNpcmVkIHZhbHVlcyBvbiB0aGUgYG1ha2UnIGNvbW1hbmQgbGluZS4KLQotQFNFVF9NQUtFQAotCi1hbGwtcmVjdXJzaXZlIGluc3RhbGwtZGF0YS1yZWN1cnNpdmUgaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsZGlycy1yZWN1cnNpdmUgaW5zdGFsbC1yZWN1cnNpdmUgdW5pbnN0YWxsLXJlY3Vyc2l2ZSBpbnN0YWxsLWluZm8tcmVjdXJzaXZlIFwKLWNoZWNrLXJlY3Vyc2l2ZSBpbnN0YWxsY2hlY2stcmVjdXJzaXZlIGluZm8tcmVjdXJzaXZlIGR2aS1yZWN1cnNpdmU6Ci0JQHNldCBmbm9yZCAkKE1BS0VGTEFHUyk7IGFtZj0kJDI7IFwKLQlkb3Rfc2Vlbj1ubzsgXAotCXRhcmdldD1gZWNobyAkQCB8IHNlZCBzLy1yZWN1cnNpdmUvL2A7IFwKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIGVjaG8gIk1ha2luZyAkJHRhcmdldCBpbiAkJHN1YmRpciI7IFwKLQkgIGlmIHRlc3QgIiQkc3ViZGlyIiA9ICIuIjsgdGhlbiBcCi0JICAgIGRvdF9zZWVuPXllczsgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0LWFtIjsgXAotCSAgZWxzZSBcCi0JICAgIGxvY2FsX3RhcmdldD0iJCR0YXJnZXQiOyBcCi0JICBmaTsgXAotCSAgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICQkbG9jYWxfdGFyZ2V0KSBcCi0JICAgfHwgY2FzZSAiJCRhbWYiIGluICo9KikgZXhpdCAxOzsgKmsqKSBmYWlsPXllczs7ICopIGV4aXQgMTs7IGVzYWM7IFwKLQlkb25lOyBcCi0JaWYgdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iOyB0aGVuIFwKLQkgICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpICIkJHRhcmdldC1hbSIgfHwgZXhpdCAxOyBcCi0JZmk7IHRlc3QgLXogIiQkZmFpbCIKLQotbW9zdGx5Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIFwKLW1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlOgotCUBzZXQgZm5vcmQgJChNQUtFRkxBR1MpOyBhbWY9JCQyOyBcCi0JZG90X3NlZW49bm87IFwKLQlyZXY9Jyc7IGxpc3Q9JyQoU1VCRElSUyknOyBmb3Igc3ViZGlyIGluICQkbGlzdDsgZG8gXAotCSAgcmV2PSIkJHN1YmRpciAkJHJldiI7IFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9ICIuIiAmJiBkb3Rfc2Vlbj15ZXM7IFwKLQlkb25lOyBcCi0JdGVzdCAiJCRkb3Rfc2VlbiIgPSAibm8iICYmIHJldj0iLiAkJHJldiI7IFwKLQl0YXJnZXQ9YGVjaG8gJEAgfCBzZWQgcy8tcmVjdXJzaXZlLy9gOyBcCi0JZm9yIHN1YmRpciBpbiAkJHJldjsgZG8gXAotCSAgZWNobyAiTWFraW5nICQkdGFyZ2V0IGluICQkc3ViZGlyIjsgXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gIi4iOyB0aGVuIFwKLQkgICAgbG9jYWxfdGFyZ2V0PSIkJHRhcmdldC1hbSI7IFwKLQkgIGVsc2UgXAotCSAgICBsb2NhbF90YXJnZXQ9IiQkdGFyZ2V0IjsgXAotCSAgZmk7IFwKLQkgIChjZCAkJHN1YmRpciAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSAkJGxvY2FsX3RhcmdldCkgXAotCSAgIHx8IGNhc2UgIiQkYW1mIiBpbiAqPSopIGV4aXQgMTs7ICprKikgZmFpbD15ZXM7OyAqKSBleGl0IDE7OyBlc2FjOyBcCi0JZG9uZSAmJiB0ZXN0IC16ICIkJGZhaWwiCi10YWdzLXJlY3Vyc2l2ZToKLQlsaXN0PSckKFNVQkRJUlMpJzsgZm9yIHN1YmRpciBpbiAkJGxpc3Q7IGRvIFwKLQkgIHRlc3QgIiQkc3ViZGlyIiA9IC4gfHwgKGNkICQkc3ViZGlyICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIHRhZ3MpOyBcCi0JZG9uZQotCi10YWdzOiBUQUdTCi0KLUlEOiAkKEhFQURFUlMpICQoU09VUkNFUykgJChMSVNQKQotCWxpc3Q9JyQoU09VUkNFUykgJChIRUFERVJTKSc7IFwKLQl1bmlxdWU9YGZvciBpIGluICQkbGlzdDsgZG8gZWNobyAkJGk7IGRvbmUgfCBcCi0JICBhd2sgJyAgICB7IGZpbGVzWyQkMF0gPSAxOyB9IFwKLQkgICAgICAgRU5EIHsgZm9yIChpIGluIGZpbGVzKSBwcmludCBpOyB9J2A7IFwKLQloZXJlPWBwd2RgICYmIGNkICQoc3JjZGlyKSBcCi0JICAmJiBta2lkIC1mJCRoZXJlL0lEICQkdW5pcXVlICQoTElTUCkKLQotVEFHUzogdGFncy1yZWN1cnNpdmUgJChIRUFERVJTKSAkKFNPVVJDRVMpIGNvbmZpZy5pbiAkKFRBR1NfREVQRU5ERU5DSUVTKSAkKExJU1ApCi0JdGFncz07IFwKLQloZXJlPWBwd2RgOyBcCi0JbGlzdD0nJChTVUJESVJTKSc7IGZvciBzdWJkaXIgaW4gJCRsaXN0OyBkbyBcCi0gICBpZiB0ZXN0ICIkJHN1YmRpciIgPSAuOyB0aGVuIDo7IGVsc2UgXAotCSAgICB0ZXN0IC1mICQkc3ViZGlyL1RBR1MgJiYgdGFncz0iJCR0YWdzIC1pICQkaGVyZS8kJHN1YmRpci9UQUdTIjsgXAotICAgZmk7IFwKLQlkb25lOyBcCi0JbGlzdD0nJChTT1VSQ0VTKSAkKEhFQURFUlMpJzsgXAotCXVuaXF1ZT1gZm9yIGkgaW4gJCRsaXN0OyBkbyBlY2hvICQkaTsgZG9uZSB8IFwKLQkgIGF3ayAnICAgIHsgZmlsZXNbJCQwXSA9IDE7IH0gXAotCSAgICAgICBFTkQgeyBmb3IgKGkgaW4gZmlsZXMpIHByaW50IGk7IH0nYDsgXAotCXRlc3QgLXogIiQoRVRBR1NfQVJHUyljb25maWcuaW4kJHVuaXF1ZSQoTElTUCkkJHRhZ3MiIFwKLQkgIHx8IChjZCAkKHNyY2RpcikgJiYgZXRhZ3MgJChFVEFHU19BUkdTKSAkJHRhZ3MgY29uZmlnLmluICQkdW5pcXVlICQoTElTUCkgLW8gJCRoZXJlL1RBR1MpCi0KLW1vc3RseWNsZWFuLXRhZ3M6Ci0KLWNsZWFuLXRhZ3M6Ci0KLWRpc3RjbGVhbi10YWdzOgotCS1ybSAtZiBUQUdTIElECi0KLW1haW50YWluZXItY2xlYW4tdGFnczoKLQotZGlzdGRpciA9ICQoUEFDS0FHRSktJChWRVJTSU9OKQotdG9wX2Rpc3RkaXIgPSAkKGRpc3RkaXIpCi0KLSMgVGhpcyB0YXJnZXQgdW50YXJzIHRoZSBkaXN0IGZpbGUgYW5kIHRyaWVzIGEgVlBBVEggY29uZmlndXJhdGlvbi4gIFRoZW4KLSMgaXQgZ3VhcmFudGVlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gaXMgc2VsZi1jb250YWluZWQgYnkgbWFraW5nIGFub3RoZXIKLSMgdGFyZmlsZS4KLWRpc3RjaGVjazogZGlzdAotCS1ybSAtcmYgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIHp4ZiAkKGRpc3RkaXIpLnRhci5negotCW1rZGlyICQoZGlzdGRpcikvPWJ1aWxkCi0JbWtkaXIgJChkaXN0ZGlyKS89aW5zdAotCWRjX2luc3RhbGxfYmFzZT1gY2QgJChkaXN0ZGlyKS89aW5zdCAmJiBwd2RgOyBcCi0JY2QgJChkaXN0ZGlyKS89YnVpbGQgXAotCSAgJiYgLi4vY29uZmlndXJlIC0tc3JjZGlyPS4uIC0tcHJlZml4PSQkZGNfaW5zdGFsbF9iYXNlIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGR2aSBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBpbnN0YWxsIFwKLQkgICYmICQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGxjaGVjayBcCi0JICAmJiAkKE1BS0UpICQoQU1fTUFLRUZMQUdTKSBkaXN0Ci0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JQGJhbm5lcj0iJChkaXN0ZGlyKS50YXIuZ3ogaXMgcmVhZHkgZm9yIGRpc3RyaWJ1dGlvbiI7IFwKLQlkYXNoZXM9YGVjaG8gIiQkYmFubmVyIiB8IHNlZCBzLy4vPS9nYDsgXAotCWVjaG8gIiQkZGFzaGVzIjsgXAotCWVjaG8gIiQkYmFubmVyIjsgXAotCWVjaG8gIiQkZGFzaGVzIgotZGlzdDogZGlzdGRpcgotCS1jaG1vZCAtUiBhK3IgJChkaXN0ZGlyKQotCUdaSVA9JChHWklQX0VOVikgJChUQVIpIGNob3pmICQoZGlzdGRpcikudGFyLmd6ICQoZGlzdGRpcikKLQktcm0gLXJmICQoZGlzdGRpcikKLWRpc3QtYWxsOiBkaXN0ZGlyCi0JLWNobW9kIC1SIGErciAkKGRpc3RkaXIpCi0JR1pJUD0kKEdaSVBfRU5WKSAkKFRBUikgY2hvemYgJChkaXN0ZGlyKS50YXIuZ3ogJChkaXN0ZGlyKQotCS1ybSAtcmYgJChkaXN0ZGlyKQotZGlzdGRpcjogJChESVNURklMRVMpCi0JLXJtIC1yZiAkKGRpc3RkaXIpCi0JbWtkaXIgJChkaXN0ZGlyKQotCS1jaG1vZCA3NzcgJChkaXN0ZGlyKQotCUBmb3IgZmlsZSBpbiAkKERJU1RGSUxFUyk7IGRvIFwKLQkgIGlmIHRlc3QgLWYgJCRmaWxlOyB0aGVuIGQ9LjsgZWxzZSBkPSQoc3JjZGlyKTsgZmk7IFwKLQkgIGlmIHRlc3QgLWQgJCRkLyQkZmlsZTsgdGhlbiBcCi0JICAgIGNwIC1wciAkJC8kJGZpbGUgJChkaXN0ZGlyKS8kJGZpbGU7IFwKLQkgIGVsc2UgXAotCSAgICB0ZXN0IC1mICQoZGlzdGRpcikvJCRmaWxlIFwKLQkgICAgfHwgbG4gJCRkLyQkZmlsZSAkKGRpc3RkaXIpLyQkZmlsZSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkJGQvJCRmaWxlICQoZGlzdGRpcikvJCRmaWxlIHx8IDo7IFwKLQkgIGZpOyBcCi0JZG9uZQotCWZvciBzdWJkaXIgaW4gJChTVUJESVJTKTsgZG8gXAotCSAgaWYgdGVzdCAiJCRzdWJkaXIiID0gLjsgdGhlbiA6OyBlbHNlIFwKLQkgICAgdGVzdCAtZCAkKGRpc3RkaXIpLyQkc3ViZGlyIFwKLQkgICAgfHwgbWtkaXIgJChkaXN0ZGlyKS8kJHN1YmRpciBcCi0JICAgIHx8IGV4aXQgMTsgXAotCSAgICBjaG1vZCA3NzcgJChkaXN0ZGlyKS8kJHN1YmRpcjsgXAotCSAgICAoY2QgJCRzdWJkaXIgJiYgJChNQUtFKSAkKEFNX01BS0VGTEFHUykgdG9wX2Rpc3RkaXI9Li4vJChkaXN0ZGlyKSBkaXN0ZGlyPS4uLyQoZGlzdGRpcikvJCRzdWJkaXIgZGlzdGRpcikgXAotCSAgICAgIHx8IGV4aXQgMTsgXAotCSAgZmk7IFwKLQlkb25lCi1pbmZvLWFtOgotaW5mbzogaW5mby1yZWN1cnNpdmUKLWR2aS1hbToKLWR2aTogZHZpLXJlY3Vyc2l2ZQotY2hlY2stYW06Ci1jaGVjazogY2hlY2stcmVjdXJzaXZlCi1pbnN0YWxsY2hlY2stYW06Ci1pbnN0YWxsY2hlY2s6IGluc3RhbGxjaGVjay1yZWN1cnNpdmUKLWluc3RhbGwtaW5mby1hbTogCi1pbnN0YWxsLWluZm86IGluc3RhbGwtaW5mby1yZWN1cnNpdmUKLWFsbC1yZWN1cnNpdmUtYW06IGNvbmZpZy5oCi0JJChNQUtFKSAkKEFNX01BS0VGTEFHUykgYWxsLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWV4ZWMtYW06IGluc3RhbGwtbGliTFRMSUJSQVJJRVMKLWluc3RhbGwtZXhlYzogaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZQotCi1pbnN0YWxsLWRhdGEtYW06Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1yZWN1cnNpdmUKLQotaW5zdGFsbC1hbTogYWxsLWFtCi0JQCQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIGluc3RhbGwtZXhlYy1hbSBpbnN0YWxsLWRhdGEtYW0KLWluc3RhbGw6IGluc3RhbGwtcmVjdXJzaXZlCi11bmluc3RhbGwtYW06IHVuaW5zdGFsbC1saWJMVExJQlJBUklFUwotdW5pbnN0YWxsOiB1bmluc3RhbGwtcmVjdXJzaXZlCi1hbGwtYW06IE1ha2VmaWxlICQoTElCUkFSSUVTKSAkKExUTElCUkFSSUVTKSBjb25maWcuaAotYWxsLXJlZGlyZWN0OiBhbGwtcmVjdXJzaXZlLWFtCi1pbnN0YWxsLXN0cmlwOgotCSQoTUFLRSkgJChBTV9NQUtFRkxBR1MpIEFNX0lOU1RBTExfUFJPR1JBTV9GTEFHUz0tcyBpbnN0YWxsCi1pbnN0YWxsZGlyczogaW5zdGFsbGRpcnMtcmVjdXJzaXZlCi1pbnN0YWxsZGlycy1hbToKLQkkKG1raW5zdGFsbGRpcnMpICAkKERFU1RESVIpJChsaWJkaXIpCi0KLQotbW9zdGx5Y2xlYW4tZ2VuZXJpYzoKLQotY2xlYW4tZ2VuZXJpYzoKLQktdGVzdCAteiAiJChDTEVBTkZJTEVTKSIgfHwgcm0gLWYgJChDTEVBTkZJTEVTKQotCi1kaXN0Y2xlYW4tZ2VuZXJpYzoKLQktcm0gLWYgTWFrZWZpbGUgJChDT05GSUdfQ0xFQU5fRklMRVMpCi0JLXJtIC1mIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIHN0YW1wLWggc3RhbXAtaFswLTldKgotCi1tYWludGFpbmVyLWNsZWFuLWdlbmVyaWM6Ci1tb3N0bHljbGVhbi1hbTogIG1vc3RseWNsZWFuLWhkciBtb3N0bHljbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltb3N0bHljbGVhbi1jb21waWxlIG1vc3RseWNsZWFuLWxpYnRvb2wgXAotCQltb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBtb3N0bHljbGVhbi10YWdzIFwKLQkJbW9zdGx5Y2xlYW4tZ2VuZXJpYwotCi1tb3N0bHljbGVhbjogbW9zdGx5Y2xlYW4tcmVjdXJzaXZlCi0KLWNsZWFuLWFtOiAgY2xlYW4taGRyIGNsZWFuLW5vaW5zdExJQlJBUklFUyBjbGVhbi1jb21waWxlIGNsZWFuLWxpYnRvb2wgXAotCQljbGVhbi1saWJMVExJQlJBUklFUyBjbGVhbi10YWdzIGNsZWFuLWdlbmVyaWMgXAotCQltb3N0bHljbGVhbi1hbQotCi1jbGVhbjogY2xlYW4tcmVjdXJzaXZlCi0KLWRpc3RjbGVhbi1hbTogIGRpc3RjbGVhbi1oZHIgZGlzdGNsZWFuLW5vaW5zdExJQlJBUklFUyBkaXN0Y2xlYW4tY29tcGlsZSBcCi0JCWRpc3RjbGVhbi1saWJ0b29sIGRpc3RjbGVhbi1saWJMVExJQlJBUklFUyBcCi0JCWRpc3RjbGVhbi10YWdzIGRpc3RjbGVhbi1nZW5lcmljIGNsZWFuLWFtCi0JLXJtIC1mIGxpYnRvb2wKLQotZGlzdGNsZWFuOiBkaXN0Y2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotbWFpbnRhaW5lci1jbGVhbi1hbTogIG1haW50YWluZXItY2xlYW4taGRyIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotCQltYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbWFpbnRhaW5lci1jbGVhbi1saWJ0b29sIFwKLQkJbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgXAotCQltYWludGFpbmVyLWNsZWFuLWdlbmVyaWMgZGlzdGNsZWFuLWFtCi0JQGVjaG8gIlRoaXMgY29tbWFuZCBpcyBpbnRlbmRlZCBmb3IgbWFpbnRhaW5lcnMgdG8gdXNlOyIKLQlAZWNobyAiaXQgZGVsZXRlcyBmaWxlcyB0aGF0IG1heSByZXF1aXJlIHNwZWNpYWwgdG9vbHMgdG8gcmVidWlsZC4iCi0KLW1haW50YWluZXItY2xlYW46IG1haW50YWluZXItY2xlYW4tcmVjdXJzaXZlCi0JLXJtIC1mIGNvbmZpZy5zdGF0dXMKLQotLlBIT05ZOiBtb3N0bHljbGVhbi1oZHIgZGlzdGNsZWFuLWhkciBjbGVhbi1oZHIgbWFpbnRhaW5lci1jbGVhbi1oZHIgXAotbW9zdGx5Y2xlYW4tbm9pbnN0TElCUkFSSUVTIGRpc3RjbGVhbi1ub2luc3RMSUJSQVJJRVMgXAotY2xlYW4tbm9pbnN0TElCUkFSSUVTIG1haW50YWluZXItY2xlYW4tbm9pbnN0TElCUkFSSUVTIFwKLW1vc3RseWNsZWFuLWNvbXBpbGUgZGlzdGNsZWFuLWNvbXBpbGUgY2xlYW4tY29tcGlsZSBcCi1tYWludGFpbmVyLWNsZWFuLWNvbXBpbGUgbW9zdGx5Y2xlYW4tbGlidG9vbCBkaXN0Y2xlYW4tbGlidG9vbCBcCi1jbGVhbi1saWJ0b29sIG1haW50YWluZXItY2xlYW4tbGlidG9vbCBtb3N0bHljbGVhbi1saWJMVExJQlJBUklFUyBcCi1kaXN0Y2xlYW4tbGliTFRMSUJSQVJJRVMgY2xlYW4tbGliTFRMSUJSQVJJRVMgXAotbWFpbnRhaW5lci1jbGVhbi1saWJMVExJQlJBUklFUyB1bmluc3RhbGwtbGliTFRMSUJSQVJJRVMgXAotaW5zdGFsbC1saWJMVExJQlJBUklFUyBpbnN0YWxsLWRhdGEtcmVjdXJzaXZlIHVuaW5zdGFsbC1kYXRhLXJlY3Vyc2l2ZSBcCi1pbnN0YWxsLWV4ZWMtcmVjdXJzaXZlIHVuaW5zdGFsbC1leGVjLXJlY3Vyc2l2ZSBpbnN0YWxsZGlycy1yZWN1cnNpdmUgXAotdW5pbnN0YWxsZGlycy1yZWN1cnNpdmUgYWxsLXJlY3Vyc2l2ZSBjaGVjay1yZWN1cnNpdmUgXAotaW5zdGFsbGNoZWNrLXJlY3Vyc2l2ZSBpbmZvLXJlY3Vyc2l2ZSBkdmktcmVjdXJzaXZlIFwKLW1vc3RseWNsZWFuLXJlY3Vyc2l2ZSBkaXN0Y2xlYW4tcmVjdXJzaXZlIGNsZWFuLXJlY3Vyc2l2ZSBcCi1tYWludGFpbmVyLWNsZWFuLXJlY3Vyc2l2ZSB0YWdzIHRhZ3MtcmVjdXJzaXZlIG1vc3RseWNsZWFuLXRhZ3MgXAotZGlzdGNsZWFuLXRhZ3MgY2xlYW4tdGFncyBtYWludGFpbmVyLWNsZWFuLXRhZ3MgZGlzdGRpciBpbmZvLWFtIGluZm8gXAotZHZpLWFtIGR2aSBjaGVjayBjaGVjay1hbSBpbnN0YWxsY2hlY2stYW0gaW5zdGFsbGNoZWNrIGluc3RhbGwtaW5mby1hbSBcCi1pbnN0YWxsLWluZm8gYWxsLXJlY3Vyc2l2ZS1hbSBpbnN0YWxsLWV4ZWMtYW0gaW5zdGFsbC1leGVjIFwKLWluc3RhbGwtZGF0YS1hbSBpbnN0YWxsLWRhdGEgaW5zdGFsbC1hbSBpbnN0YWxsIHVuaW5zdGFsbC1hbSB1bmluc3RhbGwgXAotYWxsLXJlZGlyZWN0IGFsbC1hbSBhbGwgaW5zdGFsbGRpcnMtYW0gaW5zdGFsbGRpcnMgbW9zdGx5Y2xlYW4tZ2VuZXJpYyBcCi1kaXN0Y2xlYW4tZ2VuZXJpYyBjbGVhbi1nZW5lcmljIG1haW50YWluZXItY2xlYW4tZ2VuZXJpYyBjbGVhbiBcCi1tb3N0bHljbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0KLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9kaXMtYXNtLmgKLQkkKExJQlRPT0wpIC0tbW9kZT1jb21waWxlICQoQ09NUElMRSkgLWMgQGFyY2hkZWZzQCAkKHNyY2RpcikvZGlzYXNzZW1ibGUuYwotCi1zdGFtcC1saWI6IGxpYm9wY29kZXMubGEKLQlpZiBbIC1mIC5saWJzL2xpYm9wY29kZXMuYSBdOyB0aGVuIFwKLQkgIGNwIC5saWJzL2xpYm9wY29kZXMuYSBsaWJvcGNvZGVzLnRtcDsgXAotCSAgJChTSEVMTCkgJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIGxpYm9wY29kZXMudG1wIGxpYm9wY29kZXMuYTsgXAotCWVsc2UgdHJ1ZTsgZmkKLQl0b3VjaCBzdGFtcC1saWIKLQotbGlib3Bjb2Rlcy5hOiBzdGFtcC1saWIgOyBAdHJ1ZQotcG8vUE9URklMRVMuaW46IEBNQUlOVEAgTWFrZWZpbGUKLQlmb3IgZmlsZSBpbiAkKFBPVEZJTEVTKTsgZG8gZWNobyAkJGZpbGU7IGRvbmUgfCBzb3J0ID4gdG1wIFwKLQkgICYmIG12IHRtcCAkKHNyY2RpcikvcG8vUE9URklMRVMuaW4KLQotIyBXZSBzaG91bGQgcmVjb25maWd1cmUgd2hlbmV2ZXIgYmZkL2NvbmZpZ3VyZS5pbiBjaGFuZ2VzLCBiZWNhdXNlCi0jIHRoYXQncyB3aGVyZSB0aGUgdmVyc2lvbiBudW1iZXIgY29tZXMgZnJvbS4KLWNvbmZpZy5zdGF0dXM6ICQoc3JjZGlyKS9jb25maWd1cmUgJChzcmNkaXIpLy4uL2JmZC9jb25maWd1cmUuaW4KLQkkKFNIRUxMKSAuL2NvbmZpZy5zdGF0dXMgLS1yZWNoZWNrCi0KLSMgVGhlIHN0YXJ0IG1hcmtlciBpcyB3cml0dGVuIHRoaXMgd2F5IHRvIHBhc3MgdGhyb3VnaCBhdXRvbWFrZSB1bnNjYXRoZWQuCi0KLSMgVGhpcyBkZXBlbmRlbmN5IHN0dWZmIGlzIGNvcGllZCBmcm9tIEJGRC4KLQotLmRlcDogZGVwLnNlZCAkKENGSUxFUykgJChIRklMRVMpIGNvbmZpZy5oCi0Jcm0gLWYgLmRlcDEKLQkkKE1BS0UpIERFUD0kKERFUCkgLmRlcDEKLQlzZWQgLWYgZGVwLnNlZCA8IC5kZXAxID4gLmRlcAotCi0uZGVwMTogJChDRklMRVMpCi0Jcm0gLWYgLmRlcDIgLmRlcDJhCi0JZWNobyAnIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LicgPiAuZGVwMgotCWVjaG8gPiAuZGVwMmEKLQkkKERFUCkgLWYgLmRlcDJhICQoSU5DTFVERVMpICQoQ0ZMQUdTKSAkPwotCXNlZCAtZSAnL0RPIE5PVCBERUxFVEUvZCcgLWUgJy9eJCQvZCcgPCAuZGVwMmEgPj4gLmRlcDIKLQlybSAtZiAuZGVwMmEKLQkkKHNyY2RpcikvLi4vbW92ZS1pZi1jaGFuZ2UgLmRlcDIgLmRlcDEKLQotZGVwLnNlZDogZGVwLWluLnNlZCBjb25maWcuc3RhdHVzCi0Jc2VkIDwkKHNyY2RpcikvZGVwLWluLnNlZCA+ZGVwLnNlZAlcCi0JCS1lICdzIUBCRkRfSEAhJChCRkRfSCkhJwlcCi0JCS1lICdzIUBJTkNESVJAISQoSU5DRElSKSEnCVwKLQkJLWUgJ3MhQEJGRERJUkAhJChCRkRESVIpIScJXAotCQktZSAncyFAU1JDRElSQCEkKHNyY2RpcikhJwotCi1kZXA6IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8IE1ha2VmaWxlID4gdG1wLU1ha2VmaWxlCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZSBNYWtlZmlsZQotCi1kZXAtaW46IC5kZXAKLQlzZWQgLWUgJy9eLi5ETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkJyA8ICQoc3JjZGlyKS9NYWtlZmlsZS5pbiA+IHRtcC1NYWtlZmlsZS5pbgotCWNhdCAuZGVwID4+IHRtcC1NYWtlZmlsZS5pbgotCSQoc3JjZGlyKS8uLi9tb3ZlLWlmLWNoYW5nZSB0bXAtTWFrZWZpbGUuaW4gJChzcmNkaXIpL01ha2VmaWxlLmluCi0KLWRlcC1hbTogLmRlcAotCXNlZCAtZSAnL14uLkRPIE5PVCBERUxFVEUgVEhJUyBMSU5FLywkJGQnIDwgJChzcmNkaXIpL01ha2VmaWxlLmFtID4gdG1wLU1ha2VmaWxlLmFtCi0JY2F0IC5kZXAgPj4gdG1wLU1ha2VmaWxlLmFtCi0JJChzcmNkaXIpLy4uL21vdmUtaWYtY2hhbmdlIHRtcC1NYWtlZmlsZS5hbSAkKHNyY2RpcikvTWFrZWZpbGUuYW0KLQotLlBIT05ZOiBkZXAgZGVwLWluIGRlcC1hbQotCi0jIFdoYXQgYXBwZWFycyBiZWxvdyBpcyBnZW5lcmF0ZWQgYnkgYSBoYWNrZWQgbWtkZXAgdXNpbmcgZ2NjIC1NTS4KLQotIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgotIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgotYTI5ay1kaXMubG86IGEyOWstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYTI5ay5oCi1hbHBoYS1kaXMubG86IGFscGhhLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL2FscGhhLmgKLWFscGhhLW9wYy5sbzogYWxwaGEtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hbHBoYS5oIFwKLSAgJChCRkRfSCkgb3BpbnRsLmgKLWFyYy1kaXMubG86IGFyYy1kaXMuYyAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9hcmMuaCAkKEJGRERJUikvZWxmLWJmZC5oIFwKLSAgJChJTkNESVIpL2VsZi9jb21tb24uaCAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCAkKElOQ0RJUikvZWxmL2FyYy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmggXAotICBvcGludGwuaAotYXJjLW9wYy5sbzogYXJjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvYXJjLmggXAotICBvcGludGwuaAotYXJtLWRpcy5sbzogYXJtLWRpcy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSBhcm0tb3BjLmggJChJTkNESVIpL2NvZmYvaW50ZXJuYWwuaCAkKEJGRERJUikvbGliY29mZi5oIFwKLSAgJChJTkNESVIpL2JmZGxpbmsuaCBvcGludGwuaCAkKEJGRERJUikvZWxmLWJmZC5oICQoSU5DRElSKS9lbGYvY29tbW9uLmggXAotICAkKElOQ0RJUikvZWxmL2ludGVybmFsLmggJChJTkNESVIpL2VsZi9leHRlcm5hbC5oICQoSU5DRElSKS9lbGYvYXJtLmggXAotICAkKElOQ0RJUikvZWxmL3JlbG9jLW1hY3Jvcy5oCi1jZ2VuLWFzbS5sbzogY2dlbi1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBvcGludGwuaAotY2dlbi1kaXMubG86IGNnZW4tZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2xpYmliZXJ0eS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oCi1jZ2VuLW9wYy5sbzogY2dlbi1vcGMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvbGliaWJlcnR5LmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvc3ltY2F0LmggJChJTkNESVIpL29wY29kZS9jZ2VuLmgKLWQxMHYtZGlzLmxvOiBkMTB2LWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvZDEwdi5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotZDEwdi1vcGMubG86IGQxMHYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMTB2LmgKLWQzMHYtZGlzLmxvOiBkMzB2LWRpcy5jICQoSU5DRElSKS9vcGNvZGUvZDMwdi5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotZDMwdi1vcGMubG86IGQzMHYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9kMzB2LmgKLWRpcy1idWYubG86IGRpcy1idWYuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgb3BpbnRsLmgKLWRpc2Fzc2VtYmxlLmxvOiBkaXNhc3NlbWJsZS5jICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotZnIzMC1hc20ubG86IGZyMzAtYXNtLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggZnIzMC1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBmcjMwLW9wYy5oIG9waW50bC5oCi1mcjMwLWRlc2MubG86IGZyMzAtZGVzYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaCBvcGludGwuaAotZnIzMC1kaXMubG86IGZyMzAtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtaWJsZC5sbzogZnIzMC1pYmxkLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9zeW1jYXQuaCBmcjMwLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIGZyMzAtb3BjLmggb3BpbnRsLmgKLWZyMzAtb3BjLmxvOiBmcjMwLW9wYy5jIHN5c2RlcC5oIGNvbmZpZy5oICQoQkZEX0gpIFwKLSAgJChJTkNESVIpL3N5bWNhdC5oIGZyMzAtZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgZnIzMC1vcGMuaAotaDgzMDAtZGlzLmxvOiBoODMwMC1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL2g4MzAwLmggXAotICAkKElOQ0RJUikvZGlzLWFzbS5oICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIG9waW50bC5oCi1oODUwMC1kaXMubG86IGg4NTAwLWRpcy5jIGg4NTAwLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaCBvcGludGwuaAotaHBwYS1kaXMubG86IGhwcGEtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoQkZERElSKS9saWJocHBhLmggJChJTkNESVIpL29wY29kZS9ocHBhLmgKLWkzODYtZGlzLmxvOiBpMzg2LWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBjb25maWcuaCBvcGludGwuaAotaTk2MC1kaXMubG86IGk5NjAtZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oCi1tMzJyLWFzbS5sbzogbTMyci1hc20uYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmggb3BpbnRsLmgKLW0zMnItZGVzYy5sbzogbTMyci1kZXNjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oIG9waW50bC5oCi1tMzJyLWRpcy5sbzogbTMyci1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1pYmxkLmxvOiBtMzJyLWlibGQuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL3N5bWNhdC5oIG0zMnItZGVzYy5oICQoSU5DRElSKS9vcGNvZGUvY2dlbi5oIFwKLSAgbTMyci1vcGMuaCBvcGludGwuaAotbTMyci1vcGMubG86IG0zMnItb3BjLmMgc3lzZGVwLmggY29uZmlnLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvc3ltY2F0LmggbTMyci1kZXNjLmggJChJTkNESVIpL29wY29kZS9jZ2VuLmggXAotICBtMzJyLW9wYy5oCi1tMzJyLW9waW5zdC5sbzogbTMyci1vcGluc3QuYyBzeXNkZXAuaCBjb25maWcuaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9zeW1jYXQuaCBtMzJyLWRlc2MuaCAkKElOQ0RJUikvb3Bjb2RlL2NnZW4uaCBcCi0gIG0zMnItb3BjLmgKLW02OGstZGlzLmxvOiBtNjhrLWRpcy5jICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvZmxvYXRmb3JtYXQuaCBvcGludGwuaCBcCi0gICQoSU5DRElSKS9vcGNvZGUvbTY4ay5oCi1tNjhrLW9wYy5sbzogbTY4ay1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL202OGsuaAotbTg4ay1kaXMubG86IG04OGstZGlzLmMgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBcCi0gICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbTg4ay5oIG9waW50bC5oCi1tY29yZS1kaXMubG86IG1jb3JlLWRpcy5jIG1jb3JlLW9wYy5oICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKQotbWlwcy1kaXMubG86IG1pcHMtZGlzLmMgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCBcCi0gICQoQkZEX0gpICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oIG9waW50bC5oICQoQkZERElSKS9lbGYtYmZkLmggXAotICAkKElOQ0RJUikvZWxmL2NvbW1vbi5oICQoSU5DRElSKS9lbGYvaW50ZXJuYWwuaCAkKElOQ0RJUikvZWxmL2V4dGVybmFsLmggXAotICAkKElOQ0RJUikvYmZkbGluay5oICQoSU5DRElSKS9lbGYvbWlwcy5oICQoSU5DRElSKS9lbGYvcmVsb2MtbWFjcm9zLmgKLW1pcHMtb3BjLmxvOiBtaXBzLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbWlwcy5oCi1taXBzMTYtb3BjLmxvOiBtaXBzMTYtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9taXBzLmgKLW0xMDIwMC1kaXMubG86IG0xMDIwMC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLW0xMDIwMC1vcGMubG86IG0xMDIwMC1vcGMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL21uMTAyMDAuaAotbTEwMzAwLWRpcy5sbzogbTEwMzAwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oIFwKLSAgJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSBvcGludGwuaAotbTEwMzAwLW9wYy5sbzogbTEwMzAwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvbW4xMDMwMC5oCi1uczMyay1kaXMubG86IG5zMzJrLWRpcy5jICQoQkZEX0gpICQoSU5DRElSKS9hbnNpZGVjbC5oIFwKLSAgc3lzZGVwLmggY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKElOQ0RJUikvb3Bjb2RlL25zMzJrLmggXAotICBvcGludGwuaAotcHBjLWRpcy5sbzogcHBjLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oIHN5c2RlcC5oIFwKLSAgY29uZmlnLmggJChJTkNESVIpL2Rpcy1hc20uaCAkKEJGRF9IKSAkKElOQ0RJUikvb3Bjb2RlL3BwYy5oCi1wcGMtb3BjLmxvOiBwcGMtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS9wcGMuaCBcCi0gIG9waW50bC5oCi1zaC1kaXMubG86IHNoLWRpcy5jIHNoLW9wYy5oICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgXAotICAkKElOQ0RJUikvYW5zaWRlY2wuaAotc3BhcmMtZGlzLmxvOiBzcGFyYy1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCBzeXNkZXAuaCBcCi0gIGNvbmZpZy5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2xpYmliZXJ0eS5oIG9waW50bC5oCi1zcGFyYy1vcGMubG86IHNwYXJjLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvc3BhcmMuaAotdGljMzAtZGlzLmxvOiB0aWMzMC1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL29wY29kZS90aWMzMC5oCi10aWM4MC1kaXMubG86IHRpYzgwLWRpcy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdGljODAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkKLXRpYzgwLW9wYy5sbzogdGljODAtb3BjLmMgJChJTkNESVIpL2Fuc2lkZWNsLmggJChJTkNESVIpL29wY29kZS90aWM4MC5oCi12ODUwLWRpcy5sbzogdjg1MC1kaXMuYyAkKElOQ0RJUikvYW5zaWRlY2wuaCAkKElOQ0RJUikvb3Bjb2RlL3Y4NTAuaCBcCi0gICQoSU5DRElSKS9kaXMtYXNtLmggJChCRkRfSCkgb3BpbnRsLmgKLXY4NTAtb3BjLmxvOiB2ODUwLW9wYy5jICQoSU5DRElSKS9hbnNpZGVjbC5oICQoSU5DRElSKS9vcGNvZGUvdjg1MC5oIFwKLSAgb3BpbnRsLmgKLXZheC1kaXMubG86IHZheC1kaXMuYyAkKElOQ0RJUikvb3Bjb2RlL3ZheC5oICQoSU5DRElSKS9kaXMtYXNtLmggXAotICAkKEJGRF9IKSAkKElOQ0RJUikvYW5zaWRlY2wuaAotdzY1LWRpcy5sbzogdzY1LWRpcy5jIHc2NS1vcGMuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgJChJTkNESVIpL2Fuc2lkZWNsLmgKLXo4ay1kaXMubG86IHo4ay1kaXMuYyBzeXNkZXAuaCBjb25maWcuaCAkKElOQ0RJUikvZGlzLWFzbS5oIFwKLSAgJChCRkRfSCkgejhrLW9wYy5oCi16OGtnZW4ubG86IHo4a2dlbi5jIHN5c2RlcC5oIGNvbmZpZy5oCi0jIElGIFlPVSBQVVQgQU5ZVEhJTkcgSEVSRSBJVCBXSUxMIEdPIEFXQVkKLQotIyBUZWxsIHZlcnNpb25zIFszLjU5LDMuNjMpIG9mIEdOVSBtYWtlIHRvIG5vdCBleHBvcnQgYWxsIHZhcmlhYmxlcy4KLSMgT3RoZXJ3aXNlIGEgc3lzdGVtIGxpbWl0IChmb3IgU3lzViBhdCBsZWFzdCkgbWF5IGJlIGV4Y2VlZGVkLgotLk5PRVhQT1JUOgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hMjlrLWRpcy5jIGIvb3Bjb2Rlcy9hMjlrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk1OWM5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvYTI5ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBwcmludGluZyBjb2RlIGZvciB0aGUgQU1EIDI5MDAwCi0gICBDb3B5cmlnaHQgKEMpIDE5OTAsIDkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBDeWdudXMgU3VwcG9ydC4gIFdyaXR0ZW4gYnkgSmltIEtpbmdkb24uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGNvZGUvYTI5ay5oIgotCi0vKiBQcmludCBhIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIG9mIGEgZ2VuZXJhbC1wdXJwb3NlCi0gICByZWdpc3RlciBudW1iZXIgTlVNIG9uIFNUUkVBTS4KLSAgIE5VTSBpcyBhIG51bWJlciBhcyBmb3VuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24sIG5vdCBhcyBmb3VuZCBpbgotICAgZGVidWdnaW5nIHN5bWJvbHM7IGl0IG11c3QgYmUgaW4gdGhlIHJhbmdlIDAtMjU1LiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9nZW5lcmFsIChudW0sIGluZm8pCi0gICAgIGludCBudW07Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAobnVtIDwgMTI4KQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZ3IlZCIsIG51bSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImxyJWQiLCBudW0gLSAxMjgpOwotfQotCi0vKiBMaWtlIHByaW50X2dlbmVyYWwgYnV0IGEgc3BlY2lhbC1wdXJwb3NlIHJlZ2lzdGVyLgotICAgCi0gICBUaGUgbW5lbW9uaWNzIHVzZWQgYnkgdGhlIEFNRCBhc3NlbWJsZXIgYXJlIG5vdCBxdWl0ZSB0aGUgc2FtZQotICAgYXMgdGhlIG9uZXMgaW4gdGhlIFVzZXIncyBNYW51YWwuICBXZSB1c2UgdGhlIG9uZXMgdGhhdCB0aGUKLSAgIGFzc2VtYmxlciB1c2VzLiAgKi8KLXN0YXRpYyB2b2lkCi1wcmludF9zcGVjaWFsIChudW0sIGluZm8pCi0gICAgIHVuc2lnbmVkIGludCBudW07Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMC1TUEVDMF9OVU0tMS4gICovCi0gIHN0YXRpYyBjaGFyICpzcGVjMF9uYW1lc1tdID0gewotICAgICJ2YWIiLCAib3BzIiwgImNwcyIsICJjZmciLCAiY2hhIiwgImNoZCIsICJjaGMiLCAicmJwIiwgInRtYyIsICJ0bXIiLAotICAgICJwYzAiLCAicGMxIiwgInBjMiIsICJtbXUiLCAibHJ1IiwgInJzbiIsICJybWEwIiwgInJtYzAiLCAicm1hMSIsICJybWMxIiwKLSAgICAic3BjMCIsICJzcGMxIiwgInNwYzIiLCAiaWJhMCIsICJpYmMwIiwgImliYTEiLCAiaWJjMSIsICJkYmEiLCAiZGJjIiwKLSAgICAiY2lyIiwgImNkciIKLSAgICB9OwotI2RlZmluZSBTUEVDMF9OVU0gKChzaXplb2Ygc3BlYzBfbmFtZXMpIC8gKHNpemVvZiBzcGVjMF9uYW1lc1swXSkpCi0KLSAgLyogUmVnaXN0ZXIgbmFtZXMgb2YgcmVnaXN0ZXJzIDEyOC0xMjgrU1BFQzEyOF9OVU0tMS4gICovCi0gIHN0YXRpYyBjaGFyICpzcGVjMTI4X25hbWVzW10gPSB7Ci0gICAgImlwYyIsICJpcGEiLCAiaXBiIiwgInEiLCAiYWx1IiwgImJwIiwgImZjIiwgImNyIgotICAgIH07Ci0jZGVmaW5lIFNQRUMxMjhfTlVNICgoc2l6ZW9mIHNwZWMxMjhfbmFtZXMpIC8gKHNpemVvZiBzcGVjMTI4X25hbWVzWzBdKSkKLQotICAvKiBSZWdpc3RlciBuYW1lcyBvZiByZWdpc3RlcnMgMTYwLTE2MCtTUEVDMTYwX05VTS0xLiAgKi8KLSAgc3RhdGljIGNoYXIgKnNwZWMxNjBfbmFtZXNbXSA9IHsKLSAgICAiZnBlIiwgImludGUiLCAiZnBzIiwgInNyMTYzIiwgImV4b3AiCi0gICAgfTsKLSNkZWZpbmUgU1BFQzE2MF9OVU0gKChzaXplb2Ygc3BlYzE2MF9uYW1lcykgLyAoc2l6ZW9mIHNwZWMxNjBfbmFtZXNbMF0pKQotCi0gIGlmIChudW0gPCBTUEVDMF9OVU0pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNwZWMwX25hbWVzW251bV0pOwotICBlbHNlIGlmIChudW0gPj0gMTI4ICYmIG51bSA8IDEyOCArIFNQRUMxMjhfTlVNKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBzcGVjMTI4X25hbWVzW251bS0xMjhdKTsKLSAgZWxzZSBpZiAobnVtID49IDE2MCAmJiBudW0gPCAxNjAgKyBTUEVDMTYwX05VTSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgc3BlYzE2MF9uYW1lc1tudW0tMTYwXSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInNyJWQiLCBudW0pOwotfQotCi0vKiBJcyBhbiBpbnN0cnVjdGlvbiB3aXRoIE9QQ09ERSBhIGRlbGF5ZWQgYnJhbmNoPyAgKi8KLXN0YXRpYyBpbnQKLWlzX2RlbGF5ZWRfYnJhbmNoIChvcGNvZGUpCi0gICAgIGludCBvcGNvZGU7Ci17Ci0gIHJldHVybiAob3Bjb2RlID09IDB4YTggfHwgb3Bjb2RlID09IDB4YTkgfHwgb3Bjb2RlID09IDB4YTAgfHwgb3Bjb2RlID09IDB4YTEKLQkgIHx8IG9wY29kZSA9PSAweGE0IHx8IG9wY29kZSA9PSAweGE1Ci0JICB8fCBvcGNvZGUgPT0gMHhiNCB8fCBvcGNvZGUgPT0gMHhiNQotCSAgfHwgb3Bjb2RlID09IDB4YzQgfHwgb3Bjb2RlID09IDB4YzAKLQkgIHx8IG9wY29kZSA9PSAweGFjIHx8IG9wY29kZSA9PSAweGFkCi0JICB8fCBvcGNvZGUgPT0gMHhjYyk7Ci19Ci0KLS8qIE5vdyBmaW5kIHRoZSBmb3VyIGJ5dGVzIG9mIElOU04gYW5kIHB1dCB0aGVtIGluICpJTlNOezAsOCwxNiwyNH0uICAqLwotc3RhdGljIHZvaWQKLWZpbmRfYnl0ZXNfYmlnIChpbnNuLCBpbnNuMCwgaW5zbjgsIGluc24xNiwgaW5zbjI0KQotICAgICBjaGFyICppbnNuOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMDsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24xNjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjI0OwotewotICAqaW5zbjI0ID0gaW5zblswXTsKLSAgKmluc24xNiA9IGluc25bMV07Ci0gICppbnNuOCAgPSBpbnNuWzJdOwotICAqaW5zbjAgID0gaW5zblszXTsKLX0KLQotc3RhdGljIHZvaWQKLWZpbmRfYnl0ZXNfbGl0dGxlIChpbnNuLCBpbnNuMCwgaW5zbjgsIGluc24xNiwgaW5zbjI0KQotICAgICBjaGFyICppbnNuOwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuMDsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmluc24xNjsKLSAgICAgdW5zaWduZWQgY2hhciAqaW5zbjI0OwotewotICAqaW5zbjI0ID0gaW5zblszXTsKLSAgKmluc24xNiA9IGluc25bMl07Ci0gICppbnNuOCA9IGluc25bMV07Ci0gICppbnNuMCA9IGluc25bMF07Ci19Ci0KLXR5cGVkZWYgdm9pZCAoKmZpbmRfYnl0ZV9mdW5jX3R5cGUpCi0gICAgIFBBUkFNUyAoKGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosCi0JICAgICAgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopKTsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gTUVNQUREUiBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChhbHdheXMgNCBvbiBhMjlrKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc24gKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIC8qIFRoZSByYXcgaW5zdHJ1Y3Rpb24uICAqLwotICBjaGFyIGluc25bNF07Ci0KLSAgLyogVGhlIGZvdXIgYnl0ZXMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgdW5zaWduZWQgY2hhciBpbnNuMjQsIGluc24xNiwgaW5zbjgsIGluc24wOwotCi0gIGZpbmRfYnl0ZV9mdW5jX3R5cGUgZmluZF9ieXRlX2Z1bmMgPSAoZmluZF9ieXRlX2Z1bmNfdHlwZSlpbmZvLT5wcml2YXRlX2RhdGE7Ci0KLSAgc3RydWN0IGEyOWtfb3Bjb2RlIENPTlNUICogb3Bjb2RlOwotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIChiZmRfYnl0ZSAqKSAmaW5zblswXSwgNCwgaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgewotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCXJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gICgqZmluZF9ieXRlX2Z1bmMpIChpbnNuLCAmaW5zbjAsICZpbnNuOCwgJmluc24xNiwgJmluc24yNCk7Ci0KLSAgcHJpbnRmICgiJTAyeCUwMnglMDJ4JTAyeCAiLCBpbnNuMjQsIGluc24xNiwgaW5zbjgsIGluc24wKTsKLQotICAvKiBIYW5kbGUgdGhlIG5vcCAoYXNlcSAweDQwLGdyMSxncjEpIHNwZWNpYWxseSAqLwotICBpZiAoKGluc24yND09MHg3MCkgJiYgKGluc24xNj09MHg0MCkgJiYgKGluc244PT0weDAxKSAmJiAoaW5zbjA9PTB4MDEpKSB7Ci0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIm5vcCIpOwotICAgIHJldHVybiA0OwotICB9Ci0KLSAgLyogVGhlIG9wY29kZSBpcyBhbHdheXMgaW4gaW5zbjI0LiAgKi8KLSAgZm9yIChvcGNvZGUgPSAmYTI5a19vcGNvZGVzWzBdOwotICAgICAgIG9wY29kZSA8ICZhMjlrX29wY29kZXNbbnVtX29wY29kZXNdOwotICAgICAgICsrb3Bjb2RlKQotICAgIHsKLSAgICAgIGlmICgoKHVuc2lnbmVkIGxvbmcpIGluc24yNCA8PCAyNCkgPT0gb3Bjb2RlLT5vcGNvZGUpCi0JewotCSAgY2hhciAqczsKLQkgIAotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLCBvcGNvZGUtPm5hbWUpOwotCSAgZm9yIChzID0gb3Bjb2RlLT5hcmdzOyAqcyAhPSAnXDAnOyArK3MpCi0JICAgIHsKLQkgICAgICBzd2l0Y2ggKCpzKQotCQl7Ci0JCWNhc2UgJ2EnOgotCQkgIHByaW50X2dlbmVyYWwgKGluc244LCBpbmZvKTsKLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSAnYic6Ci0JCSAgcHJpbnRfZ2VuZXJhbCAoaW5zbjAsIGluZm8pOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2MnOgotCQkgIHByaW50X2dlbmVyYWwgKGluc24xNiwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnaSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wKTsKLQkJICBicmVhazsKLQotCQljYXNlICd4JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCAoaW5zbjE2IDw8IDgpICsgaW5zbjApOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ2gnOgotCQkgIC8qIFRoaXMgdXNlZCB0byBiZSAleCBmb3IgYmludXRpbHMuICAqLwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkJICAgIChpbnNuMTYgPDwgMjQpICsgKGluc24wIDw8IDE2KSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnWCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgICgoaW5zbjE2IDw8IDgpICsgaW5zbjApIHwgMHhmZmZmMDAwMCk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnUCc6Ci0JCSAgLyogVGhpcyBvdXRwdXQgbG9va3MganVzdCBsaWtlIGFic29sdXRlIGFkZHJlc3NpbmcsIGJ1dAotCQkgICAgIG1heWJlIHRoYXQncyBPSyAoaXQncyB3aGF0IHRoZSBHREIgbTY4ayBhbmQgRUJNT04KLQkJICAgICBhMjlrIGRpc2Fzc2VtYmxlcnMgZG8pLiAgKi8KLQkJICAvKiBBbGwgdGhlIHNoaWZ0aW5nIGlzIHRvIHNpZ24tZXh0ZW5kIGl0LiAgcCovCi0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCSAgICAobWVtYWRkciArCi0JCSAgICAgKCgoaW50KSgoaW5zbjE2IDw8IDEwKSArIChpbnNuMCA8PCAyKSkgPDwgMTQpID4+IDE0KSwKLQkJICAgICBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICdBJzoKLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJICAgICgoaW5zbjE2IDw8IDEwKSArIChpbnNuMCA8PCAyKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiA+PiA3KTsKLQkJICBicmVhazsKLQotCQljYXNlICduJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuMTYgJiAweDdmKTsKLQkJICBicmVhazsKLQotCQljYXNlICd2JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCBpbnNuMTYpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3MnOgotCQkgIHByaW50X3NwZWNpYWwgKGluc244LCBpbmZvKTsKLQkJICBicmVhazsKLQotCQljYXNlICd1JzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW5zbjAgPj4gNyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAncic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMCA+PiA0KSAmIDcpOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ0knOgotCQkgIGlmICgoaW5zbjE2ICYgMykgIT0gMCkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLCBpbnNuMTYgJiAzKTsKLQkJICBicmVhazsKLQotCQljYXNlICdkJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgKGluc24wID4+IDIpICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnZic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24wICYgMyk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnRic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIChpbnNuMTYgPj4gMikgJiAxNSk7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnQyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIGluc24xNiAmIDMpOwotCQkgIGJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsICpzKTsKLQkJfQotCSAgICB9Ci0KLQkgIC8qIE5vdyB3ZSBsb29rIGZvciBhIGNvbnN0LGNvbnN0aCBwYWlyIG9mIGluc3RydWN0aW9ucywKLQkgICAgIGluIHdoaWNoIGNhc2Ugd2UgdHJ5IHRvIHByaW50IHRoZSBzeW1ib2xpYyBhZGRyZXNzLiAgKi8KLQkgIGlmIChpbnNuMjQgPT0gMikgIC8qIGNvbnN0aCAqLwotCSAgICB7Ci0JICAgICAgaW50IGVycmNvZGU7Ci0JICAgICAgY2hhciBwcmV2X2luc25bNF07Ci0JICAgICAgdW5zaWduZWQgY2hhciBwcmV2X2luc24wLCBwcmV2X2luc244LCBwcmV2X2luc24xNiwgcHJldl9pbnNuMjQ7Ci0JICAgICAgCi0JICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgLSA0LAotCQkJCQkJICAgKGJmZF9ieXRlICopICZwcmV2X2luc25bMF0sCi0JCQkJCQkgICA0LAotCQkJCQkJICAgaW5mbyk7Ci0JICAgICAgaWYgKGVycmNvZGUgPT0gMCkKLQkJewotCQkgIC8qIElmIGl0IGlzIGEgZGVsYXllZCBicmFuY2gsIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUKLQkJICAgICBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIGRlbGF5ZWQgYnJhY2ggdG8gaGFuZGxlCi0JCSAgICAgdGhpbmdzIGxpa2UKLQkJICAgICAKLQkJICAgICBjb25zdCBfZm9vCi0JCSAgICAgY2FsbCBfcHJpbnRmCi0JCSAgICAgY29uc3RoIF9mb28KLQkJICAgICAqLwotCQkgICgqZmluZF9ieXRlX2Z1bmMpIChwcmV2X2luc24sICZwcmV2X2luc24wLCAmcHJldl9pbnNuOCwKLQkJCQkgICAgICZwcmV2X2luc24xNiwgJnByZXZfaW5zbjI0KTsKLQkJICBpZiAoaXNfZGVsYXllZF9icmFuY2ggKHByZXZfaW5zbjI0KSkKLQkJICAgIHsKLQkJICAgICAgZXJyY29kZSA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkJCShtZW1hZGRyIC0gOCwgKGJmZF9ieXRlICopICZwcmV2X2luc25bMF0sIDQsIGluZm8pOwotCQkgICAgICAoKmZpbmRfYnl0ZV9mdW5jKSAocHJldl9pbnNuLCAmcHJldl9pbnNuMCwgJnByZXZfaW5zbjgsCi0JCQkJCSAmcHJldl9pbnNuMTYsICZwcmV2X2luc24yNCk7Ci0JCSAgICB9Ci0JCX0KLQkJICAKLQkgICAgICAvKiBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHJlYWRpbmcgbWVtb3J5LCB0aGVuIGFzc3VtZQotCQkgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcyBub3QgY29uc3QuICAqLwotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJcyBpdCBjb25zdCB0byB0aGUgc2FtZSByZWdpc3Rlcj8gICovCi0JCSAgaWYgKHByZXZfaW5zbjI0ID09IDMKLQkJICAgICAgJiYgcHJldl9pbnNuOCA9PSBpbnNuOCkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDsgIik7Ci0JCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCQkJKCgoaW5zbjE2IDw8IDI0KSArIChpbnNuMCA8PCAxNikKLQkJCSAgKyAocHJldl9pbnNuMTYgPDwgOCkgKyAocHJldl9pbnNuMCkpLAotCQkJIGluZm8pOwotCQkgICAgfQotCQl9Ci0JICAgIH0KLQotCSAgcmV0dXJuIDQ7Ci0JfQotICAgIH0KLSAgLyogVGhpcyB1c2VkIHRvIGJlICU4eCBmb3IgYmludXRpbHMuICAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykKLSAgICAoaW5mby0+c3RyZWFtLCAiLndvcmQgMHglMDh4IiwKLSAgICAgKGluc24yNCA8PCAyNCkgKyAoaW5zbjE2IDw8IDE2KSArIChpbnNuOCA8PCA4KSArIGluc24wKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIGFuIGJpZy1lbmRpYW4gYTI5ayBpbnN0cnVjdGlvbi4gICovCi1pbnQKLXByaW50X2luc25fYmlnX2EyOWsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpIGZpbmRfYnl0ZXNfYmlnOwotICByZXR1cm4gcHJpbnRfaW5zbiAobWVtYWRkciwgaW5mbyk7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIGEgbGl0dGxlLWVuZGlhbiBhMjlrIGluc3RydWN0aW9uLiAgKi8KLWludAotcHJpbnRfaW5zbl9saXR0bGVfYTI5ayAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgZmluZF9ieXRlc19saXR0bGU7Ci0gIHJldHVybiBwcmludF9pbnNuIChtZW1hZGRyLCBpbmZvKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYWNpbmNsdWRlLm00IGIvb3Bjb2Rlcy9hY2luY2x1ZGUubTQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjA5YjkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hY2luY2x1ZGUubTQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zaW5jbHVkZSguLi9iZmQvYWNpbmNsdWRlLm00KQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hY2xvY2FsLm00IGIvb3Bjb2Rlcy9hY2xvY2FsLm00CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg3MTFkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYWNsb2NhbC5tNAorKysgL2Rldi9udWxsCkBAIC0xLDExMTEgKzAsMCBAQAotZG5sIGFjbG9jYWwubTQgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgYWNsb2NhbCAxLjQKLQotZG5sIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NS04LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotZG5sIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCi1kbmwgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSBhbmQvb3IgZGlzdHJpYnV0ZSBpdCwKLWRubCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9ucywgYXMgbG9uZyBhcyB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQuCi0KLWRubCBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWRubCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkIGJ5IGxhdzsgd2l0aG91dAotZG5sIGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEKLWRubCBQQVJUSUNVTEFSIFBVUlBPU0UuCi0KLXNpbmNsdWRlKC4uL2JmZC9hY2luY2x1ZGUubTQpCi0KLSMgRG8gYWxsIHRoZSB3b3JrIGZvciBBdXRvbWFrZS4gIFRoaXMgbWFjcm8gYWN0dWFsbHkgZG9lcyB0b28gbXVjaCAtLQotIyBzb21lIGNoZWNrcyBhcmUgb25seSBuZWVkZWQgaWYgeW91ciBwYWNrYWdlIGRvZXMgY2VydGFpbiB0aGluZ3MuCi0jIEJ1dCB0aGlzIGlzbid0IHJlYWxseSBhIGJpZyBkZWFsLgotCi0jIHNlcmlhbCAxCi0KLWRubCBVc2FnZToKLWRubCBBTV9JTklUX0FVVE9NQUtFKHBhY2thZ2UsdmVyc2lvbiwgW25vLWRlZmluZV0pCi0KLUFDX0RFRlVOKEFNX0lOSVRfQVVUT01BS0UsCi1bQUNfUkVRVUlSRShbQUNfUFJPR19JTlNUQUxMXSkKLVBBQ0tBR0U9WyQxXQotQUNfU1VCU1QoUEFDS0FHRSkKLVZFUlNJT049WyQyXQotQUNfU1VCU1QoVkVSU0lPTikKLWRubCB0ZXN0IHRvIHNlZSBpZiBzcmNkaXIgYWxyZWFkeSBjb25maWd1cmVkCi1pZiB0ZXN0ICJgY2QgJHNyY2RpciAmJiBwd2RgIiAhPSAiYHB3ZGAiICYmIHRlc3QgLWYgJHNyY2Rpci9jb25maWcuc3RhdHVzOyB0aGVuCi0gIEFDX01TR19FUlJPUihbc291cmNlIGRpcmVjdG9yeSBhbHJlYWR5IGNvbmZpZ3VyZWQ7IHJ1biAibWFrZSBkaXN0Y2xlYW4iIHRoZXJlIGZpcnN0XSkKLWZpCi1pZmVsc2UoWyQzXSwsCi1BQ19ERUZJTkVfVU5RVU9URUQoUEFDS0FHRSwgIiRQQUNLQUdFIiwgW05hbWUgb2YgcGFja2FnZV0pCi1BQ19ERUZJTkVfVU5RVU9URUQoVkVSU0lPTiwgIiRWRVJTSU9OIiwgW1ZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2VdKSkKLUFDX1JFUVVJUkUoW0FNX1NBTklUWV9DSEVDS10pCi1BQ19SRVFVSVJFKFtBQ19BUkdfUFJPR1JBTV0pCi1kbmwgRklYTUUgVGhpcyBpcyB0cnVseSBncm9zcy4KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1BTV9NSVNTSU5HX1BST0coQUNMT0NBTCwgYWNsb2NhbCwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9DT05GLCBhdXRvY29uZiwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9NQUtFLCBhdXRvbWFrZSwgJG1pc3NpbmdfZGlyKQotQU1fTUlTU0lOR19QUk9HKEFVVE9IRUFERVIsIGF1dG9oZWFkZXIsICRtaXNzaW5nX2RpcikKLUFNX01JU1NJTkdfUFJPRyhNQUtFSU5GTywgbWFrZWluZm8sICRtaXNzaW5nX2RpcikKLUFDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKV0pCi0KLSMKLSMgQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUuCi0jCi0KLUFDX0RFRlVOKEFNX1NBTklUWV9DSEVDSywKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgYnVpbGQgZW52aXJvbm1lbnQgaXMgc2FuZV0pCi0jIEp1c3QgaW4gY2FzZQotc2xlZXAgMQotZWNobyB0aW1lc3RhbXAgPiBjb25mdGVzdGZpbGUKLSMgRG8gYHNldCcgaW4gYSBzdWJzaGVsbCBzbyB3ZSBkb24ndCBjbG9iYmVyIHRoZSBjdXJyZW50IHNoZWxsJ3MKLSMgYXJndW1lbnRzLiAgTXVzdCB0cnkgLUwgZmlyc3QgaW4gY2FzZSBjb25maWd1cmUgaXMgYWN0dWFsbHkgYQotIyBzeW1saW5rOyBzb21lIHN5c3RlbXMgcGxheSB3ZWlyZCBnYW1lcyB3aXRoIHRoZSBtb2QgdGltZSBvZiBzeW1saW5rcwotIyAoZWcgRnJlZUJTRCByZXR1cm5zIHRoZSBtb2QgdGltZSBvZiB0aGUgc3ltbGluaydzIGNvbnRhaW5pbmcKLSMgZGlyZWN0b3J5KS4KLWlmICgKLSAgIHNldCBYIGBscyAtTHQgJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIDI+IC9kZXYvbnVsbGAKLSAgIGlmIHRlc3QgIlskXSoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICJbJF0qIiAhPSAiWCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUiIFwKLSAgICAgICYmIHRlc3QgIlskXSoiICE9ICJYIGNvbmZ0ZXN0ZmlsZSAkc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KLQotICAgICAgIyBJZiBuZWl0aGVyIG1hdGNoZWQsIHRoZW4gd2UgaGF2ZSBhIGJyb2tlbiBscy4gIFRoaXMgY2FuIGhhcHBlbgotICAgICAgIyBpZiwgZm9yIGluc3RhbmNlLCBDT05GSUdfU0hFTEwgaXMgYmFzaCBhbmQgaXQgaW5oZXJpdHMgYQotICAgICAgIyBicm9rZW4gbHMgYWxpYXMgZnJvbSB0aGUgZW52aXJvbm1lbnQuICBUaGlzIGhhcyBhY3R1YWxseQotICAgICAgIyBoYXBwZW5lZC4gIFN1Y2ggYSBzeXN0ZW0gY291bGQgbm90IGJlIGNvbnNpZGVyZWQgInNhbmUiLgotICAgICAgQUNfTVNHX0VSUk9SKFtscyAtdCBhcHBlYXJzIHRvIGZhaWwuICBNYWtlIHN1cmUgdGhlcmUgaXMgbm90IGEgYnJva2VuCi1hbGlhcyBpbiB5b3VyIGVudmlyb25tZW50XSkKLSAgIGZpCi0KLSAgIHRlc3QgIlskXTIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgQUNfTVNHX0VSUk9SKFtuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrXSkKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUFDX01TR19SRVNVTFQoeWVzKV0pCi0KLWRubCBBTV9NSVNTSU5HX1BST0coTkFNRSwgUFJPR1JBTSwgRElSRUNUT1JZKQotZG5sIFRoZSBwcm9ncmFtIG11c3QgcHJvcGVybHkgaW1wbGVtZW50IC0tdmVyc2lvbi4KLUFDX0RFRlVOKEFNX01JU1NJTkdfUFJPRywKLVtBQ19NU0dfQ0hFQ0tJTkcoZm9yIHdvcmtpbmcgJDIpCi0jIFJ1biB0ZXN0IGluIGEgc3Vic2hlbGw7IHNvbWUgdmVyc2lvbnMgb2Ygc2ggd2lsbCBwcmludCBhbiBlcnJvciBpZgotIyBhbiBleGVjdXRhYmxlIGlzIG5vdCBmb3VuZCwgZXZlbiBpZiBzdGRlcnIgaXMgcmVkaXJlY3RlZC4KLSMgUmVkaXJlY3Qgc3RkaW4gdG8gcGxhY2F0ZSBvbGRlciB2ZXJzaW9ucyBvZiBhdXRvY29uZi4gIFNpZ2guCi1pZiAoJDIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICAkMT0kMgotICAgQUNfTVNHX1JFU1VMVChmb3VuZCkKLWVsc2UKLSAgICQxPSIkMy9taXNzaW5nICQyIgotICAgQUNfTVNHX1JFU1VMVChtaXNzaW5nKQotZmkKLUFDX1NVQlNUKCQxKV0pCi0KLQotIyBzZXJpYWwgMzUgQUNfUFJPR19MSUJUT09MCi1BQ19ERUZVTihBQ19QUk9HX0xJQlRPT0wsCi1bQUNfUkVRVUlSRShbQUNfTElCVE9PTF9TRVRVUF0pZG5sCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotQUNfQ0FDSEVfU0FWRQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IEFDX01TR19FUlJPUihbbGlidG9vbCBjb25maWd1cmUgZmFpbGVkXSkKLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotQUNfQ0FDSEVfTE9BRAotCi0jIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVidWlsZCBsaWJ0b29sIHdoZW4gbmVlZGVkCi1MSUJUT09MX0RFUFM9IiRhY19hdXhfZGlyL2x0Y29uZmlnICRhY19hdXhfZGlyL2x0bWFpbi5zaCIKLQotIyBBbHdheXMgdXNlIG91ciBvd24gbGlidG9vbC4KLUxJQlRPT0w9JyQoU0hFTEwpICQodG9wX2J1aWxkZGlyKS9saWJ0b29sJwotQUNfU1VCU1QoTElCVE9PTClkbmwKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotXSkKLQotQUNfREVGVU4oQUNfTElCVE9PTF9TRVRVUCwKLVtBQ19QUkVSRVEoMi4xMylkbmwKLUFDX1JFUVVJUkUoW0FDX0VOQUJMRV9TSEFSRURdKWRubAotQUNfUkVRVUlSRShbQUNfRU5BQkxFX1NUQVRJQ10pZG5sCi1BQ19SRVFVSVJFKFtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9CVUlMRF0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi1BQ19SRVFVSVJFKFtBQ19QUk9HX0NDXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTERdKWRubAotQUNfUkVRVUlSRShbQUNfUFJPR19OTV0pZG5sCi1BQ19SRVFVSVJFKFtBQ19TWVNfTk1fUEFSU0VdKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTE5fU10pZG5sCi1kbmwKLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJ1sjXWxpbmUgX19vbGluZV9fICJjb25maWd1cmUiJyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgQUNfQ0FDSEVfQ0hFQ0soW3doZXRoZXIgdGhlIEMgY29tcGlsZXIgbmVlZHMgLWJlbGZdLCBsdF9jdl9jY19uZWVkc19iZWxmLAotICAgIFtBQ19UUllfTElOSyhbXSxbXSxbbHRfY3ZfY2NfbmVlZHNfYmVsZj15ZXNdLFtsdF9jdl9jY19uZWVkc19iZWxmPW5vXSldKQotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgQUNfU1lTX0xJQlRPT0xfQ1lHV0lOCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLUFDX0FSR19FTkFCTEUobGlidG9vbC1sb2NrLAotWyAgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayAgZm9yY2UgbGlidG9vbCBub3QgdG8gZG8gZmlsZSBsb2NraW5nXSwKLW5lZWRfbG9ja3M9JGVuYWJsZXZhbCwKLW5lZWRfbG9ja3M9eWVzKQotCi1pZiB0ZXN0IHgiJG5lZWRfbG9ja3MiID0geG5vOyB0aGVuCi0gIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1sb2NrIgotZmkKLV0pCi0KLSMgQUNfTElCVE9PTF9ETE9QRU4gLSBjaGVjayBmb3IgZGxvcGVuIHN1cHBvcnQKLUFDX0RFRlVOKEFDX0xJQlRPT0xfRExPUEVOLCBbbHRfZGxvcGVuPXllc10pCi0KLSMgQUNfRU5BQkxFX1NIQVJFRCAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc2hhcmVkIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TSEFSRURbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NIQVJFRCwKLVtkZWZpbmUoW0FDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzaGFyZWQsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TSEFSRURfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc2hhcmVkPXllcyA7Owotbm8pIGVuYWJsZV9zaGFyZWQ9bm8gOzsKLSopCi0gIGVuYWJsZV9zaGFyZWQ9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc2hhcmVkPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zaGFyZWQ9QUNfRU5BQkxFX1NIQVJFRF9ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NIQVJFRCAtIHNldCB0aGUgZGVmYXVsdCBzaGFyZWQgZmxhZyB0byAtLWRpc2FibGUtc2hhcmVkCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NIQVJFRCwKLVtBQ19FTkFCTEVfU0hBUkVEKG5vKV0pCi0KLSMgQUNfRU5BQkxFX1NUQVRJQyAtIGltcGxlbWVudCB0aGUgLS1lbmFibGUtc3RhdGljIGZsYWcKLSMgVXNhZ2U6IEFDX0VOQUJMRV9TVEFUSUNbKERFRkFVTFQpXQotIyAgIFdoZXJlIERFRkFVTFQgaXMgZWl0aGVyIGB5ZXMnIG9yIGBubycuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0bwotIyAgIGB5ZXMnLgotQUNfREVGVU4oQUNfRU5BQkxFX1NUQVRJQywKLVtkZWZpbmUoW0FDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sIGlmZWxzZSgkMSwgbm8sIG5vLCB5ZXMpKWRubAotQUNfQVJHX0VOQUJMRShzdGF0aWMsCi1jaGFuZ2VxdW90ZSg8PCwgPj4pZG5sCi08PCAgLS1lbmFibGUtc3RhdGljWz1QS0dTXSAgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbZGVmYXVsdD0+PkFDX0VOQUJMRV9TVEFUSUNfREVGQVVMVF0sCi1jaGFuZ2VxdW90ZShbLCBdKWRubAotW3A9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjXSwKLWVuYWJsZV9zdGF0aWM9QUNfRU5BQkxFX1NUQVRJQ19ERUZBVUxUKWRubAotXSkKLQotIyBBQ19ESVNBQkxFX1NUQVRJQyAtIHNldCB0aGUgZGVmYXVsdCBzdGF0aWMgZmxhZyB0byAtLWRpc2FibGUtc3RhdGljCi1BQ19ERUZVTihBQ19ESVNBQkxFX1NUQVRJQywKLVtBQ19FTkFCTEVfU1RBVElDKG5vKV0pCi0KLQotIyBBQ19FTkFCTEVfRkFTVF9JTlNUQUxMIC0gaW1wbGVtZW50IHRoZSAtLWVuYWJsZS1mYXN0LWluc3RhbGwgZmxhZwotIyBVc2FnZTogQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTFsoREVGQVVMVCldCi0jICAgV2hlcmUgREVGQVVMVCBpcyBlaXRoZXIgYHllcycgb3IgYG5vJy4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvCi0jICAgYHllcycuCi1BQ19ERUZVTihBQ19FTkFCTEVfRkFTVF9JTlNUQUxMLAotW2RlZmluZShbQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTF9ERUZBVUxUXSwgaWZlbHNlKCQxLCBubywgbm8sIHllcykpZG5sCi1BQ19BUkdfRU5BQkxFKGZhc3QtaW5zdGFsbCwKLWNoYW5nZXF1b3RlKDw8LCA+PilkbmwKLTw8ICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9Pj5BQ19FTkFCTEVfRkFTVF9JTlNUQUxMX0RFRkFVTFRdLAotY2hhbmdlcXVvdGUoWywgXSlkbmwKLVtwPSR7UEFDS0FHRS1kZWZhdWx0fQotY2FzZSAiJGVuYWJsZXZhbCIgaW4KLXllcykgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMgOzsKLW5vKSBlbmFibGVfZmFzdF9pbnN0YWxsPW5vIDs7Ci0qKQotICBlbmFibGVfZmFzdF9pbnN0YWxsPW5vCi0gICMgTG9vayBhdCB0aGUgYXJndW1lbnQgd2UgZ290LiAgV2UgdXNlIGFsbCB0aGUgY29tbW9uIGxpc3Qgc2VwYXJhdG9ycy4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiwiCi0gIGZvciBwa2cgaW4gJGVuYWJsZXZhbDsgZG8KLSAgICBpZiB0ZXN0ICJYJHBrZyIgPSAiWCRwIjsgdGhlbgotICAgICAgZW5hYmxlX2Zhc3RfaW5zdGFsbD15ZXMKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICA7OwotZXNhY10sCi1lbmFibGVfZmFzdF9pbnN0YWxsPUFDX0VOQUJMRV9GQVNUX0lOU1RBTExfREVGQVVMVClkbmwKLV0pCi0KLSMgQUNfRU5BQkxFX0ZBU1RfSU5TVEFMTCAtIHNldCB0aGUgZGVmYXVsdCB0byAtLWRpc2FibGUtZmFzdC1pbnN0YWxsCi1BQ19ERUZVTihBQ19ESVNBQkxFX0ZBU1RfSU5TVEFMTCwKLVtBQ19FTkFCTEVfRkFTVF9JTlNUQUxMKG5vKV0pCi0KLQotIyBBQ19QUk9HX0xEIC0gZmluZCB0aGUgcGF0aCB0byB0aGUgR05VIG9yIG5vbi1HTlUgbGlua2VyCi1BQ19ERUZVTihBQ19QUk9HX0xELAotW0FDX0FSR19XSVRIKGdudS1sZCwKLVsgIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub11dLAotdGVzdCAiJHdpdGh2YWwiID0gbm8gfHwgd2l0aF9nbnVfbGQ9eWVzLCB3aXRoX2dudV9sZD1ubykKLUFDX1JFUVVJUkUoW0FDX1BST0dfQ0NdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0hPU1RdKWRubAotQUNfUkVRVUlSRShbQUNfQ0FOT05JQ0FMX0JVSUxEXSlkbmwKLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIEFDX01TR19DSEVDS0lORyhbZm9yIGxkIHVzZWQgYnkgR0NDXSkKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLWNoYW5nZXF1b3RlKCwpZG5sCi0gICAgLyogfCBbQS1aYS16XTpbXFwvXSopCi0gICAgICByZV9kaXJlbHQ9Jy9bXi9dW14vXSovXC5cLi8nCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0gICAgICAjIENhbm9uaWNhbGl6ZSB0aGUgcGF0aCBvZiBsZAotICAgICAgYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICdzJVxcXFwlLyVnJ2AKLSAgICAgIHdoaWxlIGVjaG8gJGFjX3Byb2cgfCBncmVwICIkcmVfZGlyZWx0IiA+IC9kZXYvbnVsbCAyPiYxOyBkbwotCWFjX3Byb2c9YGVjaG8gJGFjX3Byb2d8IHNlZCAicyUkcmVfZGlyZWx0JS8lImAKLSAgICAgIGRvbmUKLSAgICAgIHRlc3QgLXogIiRMRCIgJiYgTEQ9IiRhY19wcm9nIgotICAgICAgOzsKLSAgIiIpCi0gICAgIyBJZiBpdCBmYWlscywgdGhlbiBwcmV0ZW5kIHdlIGFyZW4ndCB1c2luZyBHQ0MuCi0gICAgYWNfcHJvZz1sZAotICAgIDs7Ci0gICopCi0gICAgIyBJZiBpdCBpcyByZWxhdGl2ZSwgdGhlbiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBsZCBpbiBQQVRILgotICAgIHdpdGhfZ251X2xkPXVua25vd24KLSAgICA7OwotICBlc2FjCi1lbGlmIHRlc3QgIiR3aXRoX2dudV9sZCIgPSB5ZXM7IHRoZW4KLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgR05VIGxkXSkKLWVsc2UKLSAgQUNfTVNHX0NIRUNLSU5HKFtmb3Igbm9uLUdOVSBsZF0pCi1maQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfTEQsCi1baWYgdGVzdCAteiAiJExEIjsgdGhlbgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAiJGFjX2Rpci8kYWNfcHJvZyI7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfTEQ9IiRhY19kaXIvJGFjX3Byb2ciCi0gICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvZ3JhbSBpcyBHTlUgbGQuICBJJ2QgcmF0aGVyIHVzZSAtLXZlcnNpb24sCi0gICAgICAjIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi0gICAgICAjIEJyZWFrIG9ubHkgaWYgaXQgd2FzIHRoZSBHTlUvbm9uLUdOVSBsZCB0aGF0IHdlIHByZWZlci4KLSAgICAgIGlmICIkYWNfY3ZfcGF0aF9MRCIgLXYgMj4mMSA8IC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLQl0ZXN0ICIkd2l0aF9nbnVfbGQiICE9IG5vICYmIGJyZWFrCi0gICAgICBlbHNlCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSB5ZXMgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWVsc2UKLSAgYWNfY3ZfcGF0aF9MRD0iJExEIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLWZpXSkKLUxEPSIkYWNfY3ZfcGF0aF9MRCIKLWlmIHRlc3QgLW4gIiRMRCI7IHRoZW4KLSAgQUNfTVNHX1JFU1VMVCgkTEQpCi1lbHNlCi0gIEFDX01TR19SRVNVTFQobm8pCi1maQotdGVzdCAteiAiJExEIiAmJiBBQ19NU0dfRVJST1IoW25vIGFjY2VwdGFibGUgbGQgZm91bmQgaW4gXCRQQVRIXSkKLUFDX1NVQlNUKExEKQotQUNfUFJPR19MRF9HTlUKLV0pCi0KLUFDX0RFRlVOKEFDX1BST0dfTERfR05VLAotW0FDX0NBQ0hFX0NIRUNLKFtpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZF0sIGFjX2N2X3Byb2dfZ251X2xkLAotWyMgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uIGhlcmUsIGJ1dCBhcHBhcmVudGx5IHNvbWUgR05VIGxkJ3Mgb25seSBhY2NlcHQgLXYuCi1pZiAkTEQgLXYgMj4mMSA8L2Rldi9udWxsIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyAxPiY1OyB0aGVuCi0gIGFjX2N2X3Byb2dfZ251X2xkPXllcwotZWxzZQotICBhY19jdl9wcm9nX2dudV9sZD1ubwotZmldKQotXSkKLQotIyBBQ19QUk9HX05NIC0gZmluZCB0aGUgcGF0aCB0byBhIEJTRC1jb21wYXRpYmxlIG5hbWUgbGlzdGVyCi1BQ19ERUZVTihBQ19QUk9HX05NLAotW0FDX01TR19DSEVDS0lORyhbZm9yIEJTRC1jb21wYXRpYmxlIG5tXSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9wYXRoX05NLAotW2lmIHRlc3QgLW4gIiROTSI7IHRoZW4KLSAgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi0gIGFjX2N2X3BhdGhfTk09IiROTSIKLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSCAvdXNyL2Njcy9iaW4gL3Vzci91Y2IgL2JpbjsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci9ubTsgdGhlbgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIG5tIGFjY2VwdHMgYSBCU0QtY29tcGF0IGZsYWcuCi0gICAgICAjIEFkZGluZyB0aGUgYHNlZCAxcScgcHJldmVudHMgZmFsc2UgcG9zaXRpdmVzIG9uIEhQLVVYLCB3aGljaCBzYXlzOgotICAgICAgIyAgIG5tOiB1bmtub3duIG9wdGlvbiAiQiIgaWdub3JlZAotICAgICAgaWYgKCRhY19kaXIvbm0gLUIgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtQiIKLQlicmVhawotICAgICAgZWxpZiAoJGFjX2Rpci9ubSAtcCAvZGV2L251bGwgMj4mMSB8IHNlZCAnMXEnOyBleGl0IDApIHwgZWdyZXAgL2Rldi9udWxsID4vZGV2L251bGw7IHRoZW4KLQlhY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIC1wIgotCWJyZWFrCi0gICAgICBlbHNlCi0JYWNfY3ZfcGF0aF9OTT0ke2FjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0ifSAjIGtlZXAgdGhlIGZpcnN0IG1hdGNoLCBidXQKLQljb250aW51ZSAjIHNvIHRoYXQgd2UgY2FuIHRyeSB0byBmaW5kIG9uZSB0aGF0IHN1cHBvcnRzIEJTRCBmbGFncwotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9OTSIgJiYgYWNfY3ZfcGF0aF9OTT1ubQotZmldKQotTk09IiRhY19jdl9wYXRoX05NIgotQUNfTVNHX1JFU1VMVChbJE5NXSkKLUFDX1NVQlNUKE5NKQotXSkKLQotIyBBQ19TWVNfTk1fUEFSU0UgLSBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQKLSMgYnkgQyBzeW1ib2wgbmFtZSBmcm9tIG5tLgotQUNfREVGVU4oQUNfU1lTX05NX1BBUlNFLAotW0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSlkbmwKLUFDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLUFDX01TR19DSEVDS0lORyhbY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0XSkKLUFDX0NBQ0hFX1ZBTChhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlLAotWyMgVGhlc2UgYXJlIHNhbmUgZGVmYXVsdHMgdGhhdCB3b3JrIG9uIGF0IGxlYXN0IGEgZmV3IG9sZCBzeXN0ZW1zLgotIyB7VGhleSBjb21lIGZyb20gVWx0cml4LiAgV2hhdCBjb3VsZCBiZSBvbGRlciB0aGFuIFVsdHJpeD8hISA7KX0KLQotY2hhbmdlcXVvdGUoLClkbmwKLSMgQ2hhcmFjdGVyIGNsYXNzIGRlc2NyaWJpbmcgTk0gZ2xvYmFsIHN5bWJvbCBjb2Rlcy4KLWFjX3N5bWNvZGU9J1tCQ0RFR1JTVF0nCi0KLSMgUmVnZXhwIHRvIG1hdGNoIHN5bWJvbHMgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgZnJvbSBDLgotYWNfc3ltcGF0PSdcKFtfQS1aYS16XVtfQS1aYS16MC05XSpcKScKLQotIyBUcmFuc2Zvcm0gdGhlIGFib3ZlIGludG8gYSByYXcgc3ltYm9sIGFuZCBhIEMgc3ltYm9sLgotYWNfc3lteGZybT0nXDEgXDJcMyBcMycKLQotIyBUcmFuc2Zvcm0gYW4gZXh0cmFjdGVkIHN5bWJvbCBsaW5lIGludG8gYSBwcm9wZXIgQyBkZWNsYXJhdGlvbgotYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL14uIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDE7L3AnIgotCi0jIERlZmluZSBzeXN0ZW0tc3BlY2lmaWMgdmFyaWFibGVzLgotY2FzZSAiJGhvc3Rfb3MiIGluCi1haXgqKQotICBhY19zeW1jb2RlPSdbQkNEVF0nCi0gIDs7Ci1jeWd3aW4qIHwgbWluZ3cqKQotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLSAgOzsKLWhwdXgqKQotICBhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsPSJzZWQgLW4gLWUgJ3MvXlQgLiogXCguKlwpJC9leHRlcm4gY2hhciBcMSgpOy9wJyAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLSAgOzsKLWlyaXgqKQotICBhY19zeW1jb2RlPSdbQkNERUdSU1RdJwotICA7Owotc29sYXJpcyopCi0gIGFjX3N5bWNvZGU9J1tCRFRdJwotICA7OwotZXNhYwotCi0jIElmIHdlJ3JlIHVzaW5nIEdOVSBubSwgdGhlbiB1c2UgaXRzIHN0YW5kYXJkIHN5bWJvbCBjb2Rlcy4KLWlmICROTSAtViAyPiYxIHwgZWdyZXAgJyhHTlV8d2l0aCBCRkQpJyA+IC9kZXYvbnVsbDsgdGhlbgotICBhY19zeW1jb2RlPSdbQUJDREdJU1RXXScKLWZpCi1jaGFuZ2VxdW90ZShbLF0pZG5sCi0KLSMgVHJ5IHdpdGhvdXQgYSBwcmVmaXggdW5kZXJjb3JlLCB0aGVuIHdpdGggaXQuCi1mb3IgYWNfc3ltcHJmeCBpbiAiIiAiXyI7IGRvCi0KLSAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0ic2VkIC1uIC1lICdzL14uKlsgCV1cKCRhY19zeW1jb2RlXClbIAldWyAJXSpcKCRhY19zeW1wcmZ4XCkkYWNfc3ltcGF0JC8kYWNfc3lteGZybS9wJyIKLQotICAjIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBwaXBlIHdvcmtzIGNvcnJlY3RseS4KLSAgYWNfcGlwZV93b3Jrcz1ubwotICBybSAtZiBjb25mdGVzdC4kYWNfZXh0Ci0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWNoYXIgbm1fdGVzdF92YXI7Ci12b2lkIG5tX3Rlc3RfZnVuYygpe30KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi1pbnQgbWFpbigpe25tX3Rlc3RfdmFyPSdhJztubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi0KLSAgaWYgQUNfVFJZX0VWQUwoYWNfY29tcGlsZSk7IHRoZW4KLSAgICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgICBhY19ubGlzdD1jb25mdGVzdC5ubQotICAKLSAgICBpZiBBQ19UUllfRVZBTChOTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgJiYgdGVzdCAtcyAiJGFjX25saXN0IjsgdGhlbgotCi0gICAgICAjIFRyeSBzb3J0aW5nIGFuZCB1bmlxdWlmeWluZyB0aGUgb3V0cHV0LgotICAgICAgaWYgc29ydCAiJGFjX25saXN0IiB8IHVuaXEgPiAiJGFjX25saXN0IlQ7IHRoZW4KLQltdiAtZiAiJGFjX25saXN0IlQgIiRhY19ubGlzdCIKLSAgICAgIGVsc2UKLQlybSAtZiAiJGFjX25saXN0IlQKLSAgICAgIGZpCi0KLSAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2Ugc25hZ2dlZCBhbGwgdGhlIHN5bWJvbHMgd2UgbmVlZC4KLSAgICAgIGlmIGVncmVwICcgbm1fdGVzdF92YXIkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JaWYgZWdyZXAgJyBubV90ZXN0X2Z1bmMkJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0JICBjYXQgPDxFT0YgPiBjb25mdGVzdC5jCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUVPRgotCSAgIyBOb3cgZ2VuZXJhdGUgdGhlIHN5bWJvbCBmaWxlLgotCSAgZXZhbCAiJGFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2wiJyA8ICIkYWNfbmxpc3QiID4+IGNvbmZ0ZXN0LmMnCi0KLQkgIGNhdCA8PEVPRiA+PiBjb25mdGVzdC5jCi0jaWYgZGVmaW5lZCAoX19TVERDX18pICYmIF9fU1REQ19fCi0jIGRlZmluZSBsdF9wdHJfdCB2b2lkICoKLSNlbHNlCi0jIGRlZmluZSBsdF9wdHJfdCBjaGFyICoKLSMgZGVmaW5lIGNvbnN0Ci0jZW5kaWYKLQotLyogVGhlIG1hcHBpbmcgYmV0d2VlbiBzeW1ib2wgbmFtZXMgYW5kIHN5bWJvbHMuICovCi1jb25zdCBzdHJ1Y3QgewotICBjb25zdCBjaGFyICpuYW1lOwotICBsdF9wdHJfdCBhZGRyZXNzOwotfQotY2hhbmdlcXVvdGUoLClkbmwKLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotY2hhbmdlcXVvdGUoWyxdKWRubAotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgQUNfVFJZX0VWQUwoYWNfbGluaykgJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgotCSAgICBhY19waXBlX3dvcmtzPXllcwotCSAgZWxzZQotCSAgICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotCSAgZmkKLQkgIExJQlM9IiRhY19zYXZlX0xJQlMiCi0JICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLQllbHNlCi0JICBlY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JkFDX0ZEX0NDCi0JZmkKLSAgICAgIGVsc2UKLQllY2hvICJjYW5ub3QgZmluZCBubV90ZXN0X3ZhciBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkcHJvZ25hbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgICBjYXQgY29uZnRlc3QuYyA+JkFDX0ZEX0NDCi0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLV0pCi0KLWFjX3Jlc3VsdD15ZXMKLWlmIHRlc3QgLXogIiRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIjsgdGhlbgotICAgYWNfcmVzdWx0PW5vCi1maQotQUNfTVNHX1JFU1VMVCgkYWNfcmVzdWx0KQotXSkKLQotIyBBQ19TWVNfTElCVE9PTF9DWUdXSU4gLSBmaW5kIHRvb2xzIG5lZWRlZCBvbiBjeWd3aW4KLUFDX0RFRlVOKEFDX1NZU19MSUJUT09MX0NZR1dJTiwKLVtBQ19DSEVDS19UT09MKERMTFRPT0wsIGRsbHRvb2wsIGZhbHNlKQotQUNfQ0hFQ0tfVE9PTChBUywgYXMsIGZhbHNlKQotXSkKLQotIyBBQ19TWVNfU1lNQk9MX1VOREVSU0NPUkUgLSBkb2VzIHRoZSBjb21waWxlciBwcmVmaXggZ2xvYmFsIHN5bWJvbHMKLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhbiB1bmRlcnNjb3JlPwotQUNfREVGVU4oQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFLAotW0FDX1JFUVVJUkUoW0FDX1BST0dfTk1dKWRubAotQUNfUkVRVUlSRShbQUNfU1lTX05NX1BBUlNFXSlkbmwKLUFDX01TR19DSEVDS0lORyhbZm9yIF8gcHJlZml4IGluIGNvbXBpbGVkIHN5bWJvbHNdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZSwKLVthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm8KLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLXZvaWQgbm1fdGVzdF9mdW5jKCl7fQotaW50IG1haW4oKXtubV90ZXN0X2Z1bmM7cmV0dXJuIDA7fQotRU9GCi1pZiBBQ19UUllfRVZBTChhY19jb21waWxlKTsgdGhlbgotICAjIE5vdyB0cnkgdG8gZ3JhYiB0aGUgc3ltYm9scy4KLSAgYWNfbmxpc3Q9Y29uZnRlc3Qubm0KLSAgaWYgQUNfVFJZX0VWQUwoTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3QpICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLSAgICAjIFNlZSB3aGV0aGVyIHRoZSBzeW1ib2xzIGhhdmUgYSBsZWFkaW5nIHVuZGVyc2NvcmUuCi0gICAgaWYgZWdyZXAgJ14uIF9ubV90ZXN0X2Z1bmMnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLSAgICAgIGFjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT15ZXMKLSAgICBlbHNlCi0gICAgICBpZiBlZ3JlcCAnXi4gbm1fdGVzdF9mdW5jICcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCToKLSAgICAgIGVsc2UKLQllY2hvICJjb25maWd1cmU6IGNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mQUNfRkRfQ0MKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiZBQ19GRF9DQwotICBmaQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mQUNfRkRfQ0MKLSAgY2F0IGNvbmZ0ZXN0LmMgPiZBQ19GRF9DQwotZmkKLXJtIC1yZiBjb25mdGVzdCoKLV0pCi1BQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUpCi1VU0VfU1lNQk9MX1VOREVSU0NPUkU9JHthY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9bm99Ci1BQ19TVUJTVChVU0VfU1lNQk9MX1VOREVSU0NPUkUpZG5sCi1dKQotCi0jIEFDX0NIRUNLX0xJQk0gLSBjaGVjayBmb3IgbWF0aCBsaWJyYXJ5Ci1BQ19ERUZVTihBQ19DSEVDS19MSUJNLCBbCi1BQ19DSEVDS19MSUIobXcsIF9td3ZhbGlkY2hlY2tsKQotQUNfQ0hFQ0tfTElCKG0sIGNvcykKLV0pCi0KLSMgQUNfTElCTFRETF9DT05WRU5JRU5DRVsoZGlyKV0gLSBzZXRzIExJQkxUREwgdG8gdGhlIGxpbmsgZmxhZ3MgZm9yCi0jIHRoZSBsaWJsdGRsIGNvbnZlbmllbmNlIGxpYnJhcnksIGFkZHMgLS1lbmFibGUtbHRkbC1jb252ZW5pZW5jZSB0bwotIyB0aGUgY29uZmlndXJlIGFyZ3VtZW50cy4gIE5vdGUgdGhhdCBMSUJMVERMIGlzIG5vdCBBQ19TVUJTVGVkLCBub3IKLSMgaXMgQUNfQ09ORklHX1NVQkRJUlMgY2FsbGVkLiAgSWYgRElSIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZAotIyB0byBiZSBgJHt0b3BfYnVpbGRkaXJ9L2xpYmx0ZGwnLiAgTWFrZSBzdXJlIHlvdSBzdGFydCBESVIgd2l0aAotIyAnJHt0b3BfYnVpbGRkaXJ9LycgKG5vdGUgdGhlIHNpbmdsZSBxdW90ZXMhKSBpZiB5b3VyIHBhY2thZ2UgaXMgbm90Ci0jIGZsYXQsIGFuZCwgaWYgeW91J3JlIG5vdCB1c2luZyBhdXRvbWFrZSwgZGVmaW5lIHRvcF9idWlsZGRpciBhcwotIyBhcHByb3ByaWF0ZSBpbiB0aGUgTWFrZWZpbGVzLgotQUNfREVGVU4oQUNfTElCTFRETF9DT05WRU5JRU5DRSwgWwotICBjYXNlICIkZW5hYmxlX2x0ZGxfY29udmVuaWVuY2UiIGluCi0gIG5vKSBBQ19NU0dfRVJST1IoW3RoaXMgcGFja2FnZSBuZWVkcyBhIGNvbnZlbmllbmNlIGxpYmx0ZGxdKSA7OwotICAiIikgZW5hYmxlX2x0ZGxfY29udmVuaWVuY2U9eWVzCi0gICAgICBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzIC0tZW5hYmxlLWx0ZGwtY29udmVuaWVuY2UiIDs7Ci0gIGVzYWMKLSAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGxjLmxhCi1dKQotCi0jIEFDX0xJQkxURExfSU5TVEFMTEFCTEVbKGRpcildIC0gc2V0cyBMSUJMVERMIHRvIHRoZSBsaW5rIGZsYWdzIGZvcgotIyB0aGUgbGlibHRkbCBpbnN0YWxsYWJsZSBsaWJyYXJ5LCBhbmQgYWRkcyAtLWVuYWJsZS1sdGRsLWluc3RhbGwgdG8KLSMgdGhlIGNvbmZpZ3VyZSBhcmd1bWVudHMuICBOb3RlIHRoYXQgTElCTFRETCBpcyBub3QgQUNfU1VCU1RlZCwgbm9yCi0jIGlzIEFDX0NPTkZJR19TVUJESVJTIGNhbGxlZC4gIElmIERJUiBpcyBub3QgcHJvdmlkZWQsIGl0IGlzIGFzc3VtZWQKLSMgdG8gYmUgYCR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJy4gIE1ha2Ugc3VyZSB5b3Ugc3RhcnQgRElSIHdpdGgKLSMgJyR7dG9wX2J1aWxkZGlyfS8nIChub3RlIHRoZSBzaW5nbGUgcXVvdGVzISkgaWYgeW91ciBwYWNrYWdlIGlzIG5vdAotIyBmbGF0LCBhbmQsIGlmIHlvdSdyZSBub3QgdXNpbmcgYXV0b21ha2UsIGRlZmluZSB0b3BfYnVpbGRkaXIgYXMKLSMgYXBwcm9wcmlhdGUgaW4gdGhlIE1ha2VmaWxlcy4KLSMgSW4gdGhlIGZ1dHVyZSwgdGhpcyBtYWNybyBtYXkgaGF2ZSB0byBiZSBjYWxsZWQgYWZ0ZXIgQUNfUFJPR19MSUJUT09MLgotQUNfREVGVU4oQUNfTElCTFRETF9JTlNUQUxMQUJMRSwgWwotICBBQ19DSEVDS19MSUIobHRkbCwgbWFpbiwgTElCTFRETD0iLWxsdGRsIiwgWwotICAgIGNhc2UgIiRlbmFibGVfbHRkbF9pbnN0YWxsIiBpbgotICAgIG5vKSBBQ19NU0dfV0FSTihbbGlibHRkbCBub3QgaW5zdGFsbGVkLCBidXQgaW5zdGFsbGF0aW9uIGRpc2FibGVkXSkgOzsKLSAgICAiIikgZW5hYmxlX2x0ZGxfaW5zdGFsbD15ZXMKLSAgICAgICAgYWNfY29uZmlndXJlX2FyZ3M9IiRhY19jb25maWd1cmVfYXJncyAtLWVuYWJsZS1sdGRsLWluc3RhbGwiIDs7Ci0gICAgZXNhYwotICBdKQotICBpZiB0ZXN0IHgiJGVuYWJsZV9sdGRsX2luc3RhbGwiICE9IHgibm8iOyB0aGVuCi0gICAgTElCTFRETD1pZmVsc2UoJCMsMSwkMSxbJyR7dG9wX2J1aWxkZGlyfS9saWJsdGRsJ10pL2xpYmx0ZGwubGEKLSAgZmkKLV0pCi0KLWRubCBvbGQgbmFtZXMKLUFDX0RFRlVOKEFNX1BST0dfTElCVE9PTCwgW2luZGlyKFtBQ19QUk9HX0xJQlRPT0xdKV0pZG5sCi1BQ19ERUZVTihBTV9FTkFCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0VOQUJMRV9TSEFSRURdLCAkQCldKWRubAotQUNfREVGVU4oQU1fRU5BQkxFX1NUQVRJQywgW2luZGlyKFtBQ19FTkFCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU0hBUkVELCBbaW5kaXIoW0FDX0RJU0FCTEVfU0hBUkVEXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX0RJU0FCTEVfU1RBVElDLCBbaW5kaXIoW0FDX0RJU0FCTEVfU1RBVElDXSwgJEApXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTEQsIFtpbmRpcihbQUNfUFJPR19MRF0pXSlkbmwKLUFDX0RFRlVOKEFNX1BST0dfTk0sIFtpbmRpcihbQUNfUFJPR19OTV0pXSlkbmwKLUFDX0RFRlVOKEFNX1NZU19OTV9QQVJTRSwgW2luZGlyKFtBQ19TWVNfTk1fUEFSU0VdKV0pZG5sCi1BQ19ERUZVTihBTV9TWVNfU1lNQk9MX1VOREVSU0NPUkUsIFtpbmRpcihbQUNfU1lTX1NZTUJPTF9VTkRFUlNDT1JFXSldKWRubAotQUNfREVGVU4oQU1fU1lTX0xJQlRPT0xfQ1lHV0lOLCBbaW5kaXIoW0FDX1NZU19MSUJUT09MX0NZR1dJTl0pXSlkbmwKLQotIyBMaWtlIEFDX0NPTkZJR19IRUFERVIsIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdGFtcCBmaWxlLgotCi1BQ19ERUZVTihBTV9DT05GSUdfSEVBREVSLAotW0FDX1BSRVJFUShbMi4xMl0pCi1BQ19DT05GSUdfSEVBREVSKFskMV0pCi1kbmwgV2hlbiBjb25maWcuc3RhdHVzIGdlbmVyYXRlcyBhIGhlYWRlciwgd2UgbXVzdCB1cGRhdGUgdGhlIHN0YW1wLWggZmlsZS4KLWRubCBUaGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGNvbmZpZyBoZWFkZXIKLWRubCB0aGF0IGlzIGdlbmVyYXRlZC4gIFdlIG11c3Qgc3RyaXAgZXZlcnl0aGluZyBwYXN0IHRoZSBmaXJzdCAiOiIsCi1kbmwgYW5kIGV2ZXJ5dGhpbmcgcGFzdCB0aGUgbGFzdCAiLyIuCi1BQ19PVVRQVVRfQ09NTUFORFMoY2hhbmdlcXVvdGUoPDwsPj4pZG5sCi1pZmVsc2UocGF0c3Vic3QoPDwkMT4+LCA8PFteIF0+PiwgPDw+PiksIDw8Pj4sCi08PHRlc3QgLXogIjw8JD4+Q09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gcGF0c3Vic3QoPDwkMT4+LCA8PF5cKFteOl0qL1wpPy4qPj4sIDw8XDE+PilzdGFtcC1oPDw+PmRubD4+LAotPDxhbV9pbmR4PTEKLWZvciBhbV9maWxlIGluIDw8JDE+PjsgZG8KLSAgY2FzZSAiIDw8JD4+Q09ORklHX0hFQURFUlMgIiBpbgotICAqIiA8PCQ+PmFtX2ZpbGUgIio8PCk+PgotICAgIGVjaG8gdGltZXN0YW1wID4gYGVjaG8gPDwkPj5hbV9maWxlIHwgc2VkIC1lICdzJTouKiUlJyAtZSAncyVbXi9dKiQlJSdgc3RhbXAtaCRhbV9pbmR4Ci0gICAgOzsKLSAgZXNhYwotICBhbV9pbmR4PWBleHByICI8PCQ+PmFtX2luZHgiICsgMWAKLWRvbmU8PD4+ZG5sPj4pCi1jaGFuZ2VxdW90ZShbLF0pKV0pCi0KLSMgQWRkIC0tZW5hYmxlLW1haW50YWluZXItbW9kZSBvcHRpb24gdG8gY29uZmlndXJlLgotIyBGcm9tIEppbSBNZXllcmluZwotCi0jIHNlcmlhbCAxCi0KLUFDX0RFRlVOKEFNX01BSU5UQUlORVJfTU9ERSwKLVtBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzXSkKLSAgZG5sIG1haW50YWluZXItbW9kZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ci0gIEFDX0FSR19FTkFCTEUobWFpbnRhaW5lci1tb2RlLAotWyAgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIGVuYWJsZSBtYWtlIHJ1bGVzIGFuZCBkZXBlbmRlbmNpZXMgbm90IHVzZWZ1bAotICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIHNvbWV0aW1lcyBjb25mdXNpbmcpIHRvIHRoZSBjYXN1YWwgaW5zdGFsbGVyXSwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbCwKLSAgICAgIFVTRV9NQUlOVEFJTkVSX01PREU9bm8pCi0gIEFDX01TR19SRVNVTFQoJFVTRV9NQUlOVEFJTkVSX01PREUpCi0gIEFNX0NPTkRJVElPTkFMKE1BSU5UQUlORVJfTU9ERSwgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllcykKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIEFDX1NVQlNUKE1BSU5UKWRubAotXQotKQotCi0jIERlZmluZSBhIGNvbmRpdGlvbmFsLgotCi1BQ19ERUZVTihBTV9DT05ESVRJT05BTCwKLVtBQ19TVUJTVCgkMV9UUlVFKQotQUNfU1VCU1QoJDFfRkFMU0UpCi1pZiAkMjsgdGhlbgotICAkMV9UUlVFPQotICAkMV9GQUxTRT0nIycKLWVsc2UKLSAgJDFfVFJVRT0nIycKLSAgJDFfRkFMU0U9Ci1maV0pCi0KLSMgVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBgZ2V0dGV4dC5tNCcuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZQotIyBpbmNsdWRlZCBtYWNyb3MgYXNzdW1lIEN5Z251cy1zdHlsZSBzb3VyY2UgYW5kIGJ1aWxkIHRyZWVzLgotCi0jIE1hY3JvIHRvIGFkZCBmb3IgdXNpbmcgR05VIGdldHRleHQuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk1LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAzCi0KLUFDX0RFRlVOKENZX1dJVEhfTkxTLAotICBbQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIE5MUyBpcyByZXF1ZXN0ZWRdKQotICAgIGRubCBEZWZhdWx0IGlzIGVuYWJsZWQgTkxTCi0gICAgQUNfQVJHX0VOQUJMRShubHMsCi0gICAgICBbICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0XSwKLSAgICAgIFVTRV9OTFM9JGVuYWJsZXZhbCwgVVNFX05MUz15ZXMpCi0gICAgQUNfTVNHX1JFU1VMVCgkVVNFX05MUykKLSAgICBBQ19TVUJTVChVU0VfTkxTKQotCi0gICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9bm8KLQotICAgIGRubCBJZiB3ZSB1c2UgTkxTIGZpZ3VyZSBvdXQgd2hhdCBtZXRob2QKLSAgICBpZiB0ZXN0ICIkVVNFX05MUyIgPSAieWVzIjsgdGhlbgotICAgICAgQUNfREVGSU5FKEVOQUJMRV9OTFMsIDEsIFtEZWZpbmUgdG8gMSBpZiBOTFMgaXMgcmVxdWVzdGVkXSkKLSAgICAgIEFDX01TR19DSEVDS0lORyhbd2hldGhlciBpbmNsdWRlZCBnZXR0ZXh0IGlzIHJlcXVlc3RlZF0pCi0gICAgICBBQ19BUkdfV0lUSChpbmNsdWRlZC1nZXR0ZXh0LAotICAgICAgICBbICAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCB1c2UgdGhlIEdOVSBnZXR0ZXh0IGxpYnJhcnkgaW5jbHVkZWQgaGVyZV0sCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9JHdpdGh2YWwsCi0gICAgICAgIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8pCi0gICAgICBBQ19NU0dfUkVTVUxUKCRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0KQotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgVXNlciBkb2VzIG5vdCBpbnNpc3Qgb24gdXNpbmcgR05VIE5MUyBsaWJyYXJ5LiAgRmlndXJlIG91dCB3aGF0Ci0gICAgICAgIGRubCB0byB1c2UuICBJZiBnZXR0ZXh0IG9yIGNhdGdldHMgYXJlIGF2YWlsYWJsZSAoaW4gdGhpcyBvcmRlcikgd2UKLSAgICAgICAgZG5sIHVzZSB0aGlzLiAgRWxzZSB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBHTlUgTkxTIGxpYnJhcnkuCi0JZG5sIGNhdGdldHMgaXMgb25seSB1c2VkIGlmIHBlcm1pdHRlZCBieSBvcHRpb24gLS13aXRoLWNhdGdldHMuCi0JbmxzX2N2X2hlYWRlcl9pbnRsPQotCW5sc19jdl9oZWFkZXJfbGliZ3Q9Ci0JQ0FUT0JKRVhUPU5PTkUKLQotCUFDX0NIRUNLX0hFQURFUihsaWJpbnRsLmgsCi0JICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmNdLCBndF9jdl9mdW5jX2dldHRleHRfbGliYywKLQkgICAgW0FDX1RSWV9MSU5LKFsjaW5jbHVkZSA8bGliaW50bC5oPl0sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkgICAgICAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzLCBndF9jdl9mdW5jX2dldHRleHRfbGliYz1ubyldKQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAhPSAieWVzIjsgdGhlbgotCSAgICAgQUNfQ0hFQ0tfTElCKGludGwsIGJpbmR0ZXh0ZG9tYWluLAotCSAgICAgICBbQUNfQ0FDSEVfQ0hFQ0soW2ZvciBnZXR0ZXh0IGluIGxpYmludGxdLAotCQkgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwsCi0JCSBbQUNfVFJZX0xJTksoW10sIFtyZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpXSwKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcywKLQkJIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPW5vKV0pXSkKLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBBQ19ERUZJTkUoSEFWRV9HRVRURVhULCAxLAotCQkJW0RlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0Ll0pCi0JICAgICAgQU1fUEFUSF9QUk9HX1dJVEhfVEVTVChNU0dGTVQsIG1zZ2ZtdCwKLQkJW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBubylkbmwKLQkgICAgICBpZiB0ZXN0ICIkTVNHRk1UIiAhPSAibm8iOyB0aGVuCi0JCUFDX0NIRUNLX0ZVTkNTKGRjZ2V0dGV4dCkKLQkJQUNfUEFUSF9QUk9HKEdNU0dGTVQsIGdtc2dmbXQsICRNU0dGTVQpCi0JCUFNX1BBVEhfUFJPR19XSVRIX1RFU1QoWEdFVFRFWFQsIHhnZXR0ZXh0LAotCQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLQkJQUNfVFJZX0xJTksoLCBbZXh0ZXJuIGludCBfbmxfbXNnX2NhdF9jbnRyOwotCQkJICAgICAgIHJldHVybiBfbmxfbXNnX2NhdF9jbnRyXSwKLQkJICBbQ0FUT0JKRVhUPS5nbW8KLQkJICAgREFUQURJUk5BTUU9c2hhcmVdLAotCQkgIFtDQVRPQkpFWFQ9Lm1vCi0JCSAgIERBVEFESVJOQU1FPWxpYl0pCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQldKQotCi0JZG5sIEluIHRoZSBzdGFuZGFyZCBnZXR0ZXh0LCB3ZSB3b3VsZCBub3cgY2hlY2sgZm9yIGNhdGdldHMuCi0gICAgICAgIGRubCBIb3dldmVyLCB3ZSBuZXZlciB3YW50IHRvIHVzZSBjYXRnZXRzIGZvciBvdXIgcmVsZWFzZXMuCi0KLSAgICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiTk9ORSI7IHRoZW4KLQkgIGRubCBOZWl0aGVyIGdldHRleHQgbm9yIGNhdGdldHMgaW4gaW5jbHVkZWQgaW4gdGhlIEMgbGlicmFyeS4KLQkgIGRubCBGYWxsIGJhY2sgb24gR05VIGdldHRleHQgbGlicmFyeS4KLQkgIG5sc19jdl91c2VfZ251X2dldHRleHQ9eWVzCi0gICAgICAgIGZpCi0gICAgICBmaQotCi0gICAgICBpZiB0ZXN0ICIkbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dCIgPSAieWVzIjsgdGhlbgotICAgICAgICBkbmwgTWFyayBhY3Rpb25zIHVzZWQgdG8gZ2VuZXJhdGUgR05VIE5MUyBsaWJyYXJ5LgotICAgICAgICBJTlRMT0JKUz0iXCQoR0VUVE9CSlMpIgotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKE1TR0ZNVCwgbXNnZm10LAotCSAgW3Rlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICdkdiAnYCJdLCBtc2dmbXQpCi0gICAgICAgIEFDX1BBVEhfUFJPRyhHTVNHRk1ULCBnbXNnZm10LCAkTVNHRk1UKQotICAgICAgICBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFhHRVRURVhULCB4Z2V0dGV4dCwKLQkgIFt0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiXSwgOikKLSAgICAgICAgQUNfU1VCU1QoTVNHRk1UKQotCVVTRV9JTkNMVURFRF9MSUJJTlRMPXllcwotICAgICAgICBDQVRPQkpFWFQ9LmdtbwotICAgICAgICBJTlNUT0JKRVhUPS5tbwotICAgICAgICBEQVRBRElSTkFNRT1zaGFyZQotCUlOVExERVBTPSckKHRvcF9idWlsZGRpcikvLi4vaW50bC9saWJpbnRsLmEnCi0JSU5UTExJQlM9JElOVExERVBTCi0JTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZSAncy8tbGludGwvLydgCi0gICAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9saWJndD1saWJnZXR0ZXh0LmgKLSAgICAgIGZpCi0KLSAgICAgIGRubCBUZXN0IHdoZXRoZXIgd2UgcmVhbGx5IGZvdW5kIEdOVSB4Z2V0dGV4dC4KLSAgICAgIGlmIHRlc3QgIiRYR0VUVEVYVCIgIT0gIjoiOyB0aGVuCi0JZG5sIElmIGl0IGlzIG5vIEdOVSB4Z2V0dGV4dCB3ZSBkZWZpbmUgaXQgYXMgOiBzbyB0aGF0IHRoZQotCWRubCBNYWtlZmlsZXMgc3RpbGwgY2FuIHdvcmsuCi0JaWYgJFhHRVRURVhUIC0tb21pdC1oZWFkZXIgL2Rldi9udWxsIDI+IC9kZXYvbnVsbDsgdGhlbgotCSAgOiA7Ci0JZWxzZQotCSAgQUNfTVNHX1JFU1VMVCgKLQkgICAgW2ZvdW5kIHhnZXR0ZXh0IHByb2dyYW1zIGlzIG5vdCBHTlUgeGdldHRleHQ7IGlnbm9yZSBpdF0pCi0JICBYR0VUVEVYVD0iOiIKLQlmaQotICAgICAgZmkKLQotICAgICAgIyBXZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHBvLyBkaXJlY3RvcnkuCi0gICAgICBQT1NVQj1wbwotICAgIGVsc2UKLSAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0gICAgICBubHNfY3ZfaGVhZGVyX2ludGw9bGliaW50bC5oCi0gICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgIGZpCi0KLSAgICAjIElmIHRoaXMgaXMgdXNlZCBpbiBHTlUgZ2V0dGV4dCB3ZSBoYXZlIHRvIHNldCBVU0VfTkxTIHRvIGB5ZXMnCi0gICAgIyBiZWNhdXNlIHNvbWUgb2YgdGhlIHNvdXJjZXMgYXJlIG9ubHkgYnVpbHQgZm9yIHRoaXMgZ29hbC4KLSAgICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSBnZXR0ZXh0OyB0aGVuCi0gICAgICBVU0VfTkxTPXllcwotICAgICAgVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgZmkKLQotICAgIGRubCBUaGVzZSBydWxlcyBhcmUgc29sZWx5IGZvciB0aGUgZGlzdHJpYnV0aW9uIGdvYWwuICBXaGlsZSBkb2luZyB0aGlzCi0gICAgZG5sIHdlIG9ubHkgaGF2ZSB0byBrZWVwIGV4YWN0bHkgb25lIGxpc3Qgb2YgdGhlIGF2YWlsYWJsZSBjYXRhbG9ncwotICAgIGRubCBpbiBjb25maWd1cmUuaW4uCi0gICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICBkbmwgTWFrZSBhbGwgdmFyaWFibGVzIHdlIHVzZSBrbm93biB0byBhdXRvY29uZi4KLSAgICBBQ19TVUJTVChVU0VfSU5DTFVERURfTElCSU5UTCkKLSAgICBBQ19TVUJTVChDQVRBTE9HUykKLSAgICBBQ19TVUJTVChDQVRPQkpFWFQpCi0gICAgQUNfU1VCU1QoREFUQURJUk5BTUUpCi0gICAgQUNfU1VCU1QoR01PRklMRVMpCi0gICAgQUNfU1VCU1QoSU5TVE9CSkVYVCkKLSAgICBBQ19TVUJTVChJTlRMREVQUykKLSAgICBBQ19TVUJTVChJTlRMTElCUykKLSAgICBBQ19TVUJTVChJTlRMT0JKUykKLSAgICBBQ19TVUJTVChQT0ZJTEVTKQotICAgIEFDX1NVQlNUKFBPU1VCKQotICBdKQotCi1BQ19ERUZVTihDWV9HTlVfR0VUVEVYVCwKLSAgW0FDX1JFUVVJUkUoW0FDX1BST0dfTUFLRV9TRVRdKWRubAotICAgQUNfUkVRVUlSRShbQUNfUFJPR19DQ10pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19QUk9HX1JBTkxJQl0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19JU0NfUE9TSVhdKWRubAotICAgQUNfUkVRVUlSRShbQUNfSEVBREVSX1NURENdKWRubAotICAgQUNfUkVRVUlSRShbQUNfQ19DT05TVF0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19DX0lOTElORV0pZG5sCi0gICBBQ19SRVFVSVJFKFtBQ19UWVBFX09GRl9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX1RZUEVfU0laRV9UXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfQUxMT0NBXSlkbmwKLSAgIEFDX1JFUVVJUkUoW0FDX0ZVTkNfTU1BUF0pZG5sCi0KLSAgIEFDX0NIRUNLX0hFQURFUlMoW2FyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oXSkKLSAgIEFDX0NIRUNLX0ZVTkNTKFtnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0XSkKLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBBQ19DSEVDS19GVU5DUyhzdHBjcHkpCi0gICBmaQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweX0iID0gInllcyI7IHRoZW4KLSAgICAgQUNfREVGSU5FKEhBVkVfU1RQQ1BZLCAxLCBbRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHBjcHkgZnVuY3Rpb25dKQotICAgZmkKLQotICAgQU1fTENfTUVTU0FHRVMKLSAgIENZX1dJVEhfTkxTCi0KLSAgIGlmIHRlc3QgIngkQ0FUT0JKRVhUIiAhPSAieCI7IHRoZW4KLSAgICAgaWYgdGVzdCAieCRBTExfTElOR1VBUyIgPSAieCI7IHRoZW4KLSAgICAgICBMSU5HVUFTPQotICAgICBlbHNlCi0gICAgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQpCi0gICAgICAgTkVXX0xJTkdVQVM9Ci0gICAgICAgZm9yIGxhbmcgaW4gJHtMSU5HVUFTPSRBTExfTElOR1VBU307IGRvCi0gICAgICAgICBjYXNlICIkQUxMX0xJTkdVQVMiIGluCi0gICAgICAgICAgKiRsYW5nKikgTkVXX0xJTkdVQVM9IiRORVdfTElOR1VBUyAkbGFuZyIgOzsKLSAgICAgICAgIGVzYWMKLSAgICAgICBkb25lCi0gICAgICAgTElOR1VBUz0kTkVXX0xJTkdVQVMKLSAgICAgICBBQ19NU0dfUkVTVUxUKCRMSU5HVUFTKQotICAgICBmaQotCi0gICAgIGRubCBDb25zdHJ1Y3QgbGlzdCBvZiBuYW1lcyBvZiBjYXRhbG9nIGZpbGVzIHRvIGJlIGNvbnN0cnVjdGVkLgotICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICBkbmwgVGhlIHJlZmVyZW5jZSB0byA8bG9jYWxlLmg+IGluIHRoZSBpbnN0YWxsZWQgPGxpYmludGwuaD4gZmlsZQotICAgZG5sIG11c3QgYmUgcmVzb2x2ZWQgYmVjYXVzZSB3ZSBjYW5ub3QgZXhwZWN0IHRoZSB1c2VycyBvZiB0aGlzCi0gICBkbmwgdG8gZGVmaW5lIEhBVkVfTE9DQUxFX0guCi0gICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIEFDX1NVQlNUKElOQ0xVREVfTE9DQUxFX0gpCi0KLSAgIGRubCBEZXRlcm1pbmUgd2hpY2ggY2F0YWxvZyBmb3JtYXQgd2UgaGF2ZSAoaWYgYW55IGlzIG5lZWRlZCkKLSAgIGRubCBGb3Igbm93IHdlIGtub3cgYWJvdXQgdHdvIGRpZmZlcmVudCBmb3JtYXRzOgotICAgZG5sICAgTGludXggbGliYy01IGFuZCB0aGUgbm9ybWFsIFgvT3BlbiBmb3JtYXQKLSAgIGlmIHRlc3QgLWYgJHNyY2Rpci9wbzJ0Ymwuc2VkLmluOyB0aGVuCi0gICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICIuY2F0IjsgdGhlbgotCSBBQ19DSEVDS19IRUFERVIobGludXgvdmVyc2lvbi5oLCBtc2dmb3JtYXQ9bGludXgsIG1zZ2Zvcm1hdD14b3BlbikKLQotCSBkbmwgVHJhbnNmb3JtIHRoZSBTRUQgc2NyaXB0cyB3aGlsZSBjb3B5aW5nIGJlY2F1c2Ugc29tZSBkdW1iIFNFRHMKLSAgICAgICAgIGRubCBjYW5ub3QgaGFuZGxlIGNvbW1lbnRzLgotCSBzZWQgLWUgJy9eIy9kJyAkc3JjZGlyLyRtc2dmb3JtYXQtbXNnLnNlZCA+IHBvMm1zZy5zZWQKLSAgICAgIGZpCi0gICAgICBkbmwgcG8ydGJsLnNlZCBpcyBhbHdheXMgbmVlZGVkLgotICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgIGRubCBJbiB0aGUgaW50bC9NYWtlZmlsZS5pbiB3ZSBoYXZlIGEgc3BlY2lhbCBkZXBlbmRlbmN5IHdoaWNoIG1ha2VzCi0gICBkbmwgb25seSBzZW5zZSBmb3IgZ2V0dGV4dC4gIFdlIGNvbW1lbnQgdGhpcyBvdXQgZm9yIG5vbi1nZXR0ZXh0Ci0gICBkbmwgcGFja2FnZXMuCi0gICBpZiB0ZXN0ICIkUEFDS0FHRSIgPSAiZ2V0dGV4dCI7IHRoZW4KLSAgICAgR1RfTk89IiNOTyMiCi0gICAgIEdUX1lFUz0KLSAgIGVsc2UKLSAgICAgR1RfTk89Ci0gICAgIEdUX1lFUz0iI1lFUyMiCi0gICBmaQotICAgQUNfU1VCU1QoR1RfTk8pCi0gICBBQ19TVUJTVChHVF9ZRVMpCi0KLSAgIE1LSU5TVEFMTERJUlM9IlwkKHNyY2RpcikvLi4vLi4vbWtpbnN0YWxsZGlycyIKLSAgIEFDX1NVQlNUKE1LSU5TVEFMTERJUlMpCi0KLSAgIGRubCAqKiogRm9yIG5vdyB0aGUgbGlidG9vbCBzdXBwb3J0IGluIGludGwvTWFrZWZpbGUgaXMgbm90IGZvciByZWFsLgotICAgbD0KLSAgIEFDX1NVQlNUKGwpCi0KLSAgIGRubCBHZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBieSB4Z2V0dGV4dCB3aGljaCB3aWxsCi0gICBkbmwgYmUgaW5jbHVkZWQgaW4gcG8vTWFrZWZpbGUuICBCdXQgb25seSBkbyB0aGlzIGlmIHRoZSBwbyBkaXJlY3RvcnkKLSAgIGRubCBleGlzdHMgaW4gc3JjZGlyLgotICAgaWYgdGVzdCAtZCAkc3JjZGlyL3BvOyB0aGVuCi0gICAgICB0ZXN0IC1kIHBvIHx8IG1rZGlyIHBvCi0gICAgICBpZiB0ZXN0ICJ4JHNyY2RpciIgIT0gInguIjsgdGhlbgotCSBpZiB0ZXN0ICJ4YGVjaG8gJHNyY2RpciB8IHNlZCAnc0AvLipAQCdgIiA9ICJ4IjsgdGhlbgotCSAgICBwb3NyY3ByZWZpeD0iJHNyY2Rpci8iCi0JIGVsc2UKLQkgICAgcG9zcmNwcmVmaXg9Ii4uLyRzcmNkaXIvIgotCSBmaQotICAgICAgZWxzZQotCSBwb3NyY3ByZWZpeD0iLi4vIgotICAgICAgZmkKLSAgICAgIHJtIC1mIHBvL1BPVEZJTEVTCi0gICAgICBzZWQgLWUgIi9eIy9kIiAtZSAiL15cJC9kIiAtZSAicywuKiwJJHBvc3JjcHJlZml4JiBcXFxcLCIgLWUgIlwkcy9cKC4qXCkgXFxcXC9cMS8iIFwKLQkgPCAkc3JjZGlyL3BvL1BPVEZJTEVTLmluID4gcG8vUE9URklMRVMKLSAgIGZpCi0gIF0pCi0KLSMgU2VhcmNoIHBhdGggZm9yIGEgcHJvZ3JhbSB3aGljaCBwYXNzZXMgdGhlIGdpdmVuIHRlc3QuCi0jIFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgotIwotIyBUaGlzIGZpbGUgZmlsZSBiZSBjb3BpZWQgYW5kIHVzZWQgZnJlZWx5IHdpdGhvdXQgcmVzdHJpY3Rpb25zLiAgSXQgY2FuCi0jIGJlIHVzZWQgaW4gcHJvamVjdHMgd2hpY2ggYXJlIG5vdCBhdmFpbGFibGUgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZQotIyBidXQgd2hpY2ggc3RpbGwgd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHRoZSBHTlUgZ2V0dGV4dCBmdW5jdGlvbmFsaXR5LgotIyBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBhY3R1YWwgY29kZSBpcyAqbm90KiBmcmVlbHkgYXZhaWxhYmxlLgotCi0jIHNlcmlhbCAxCi0KLWRubCBBTV9QQVRIX1BST0dfV0lUSF9URVNUKFZBUklBQkxFLCBQUk9HLVRPLUNIRUNLLUZPUiwKLWRubCAgIFRFU1QtUEVSRk9STUVELU9OLUZPVU5EX1BST0dSQU0gWywgVkFMVUUtSUYtTk9ULUZPVU5EIFssIFBBVEhdXSkKLUFDX0RFRlVOKEFNX1BBVEhfUFJPR19XSVRIX1RFU1QsCi1bIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkMiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJDI7IGFjX3dvcmQ9WyRdMgotQUNfTVNHX0NIRUNLSU5HKFtmb3IgJGFjX3dvcmRdKQotQUNfQ0FDSEVfVkFMKGFjX2N2X3BhdGhfJDEsCi1bY2FzZSAiWyRdJDEiIGluCi0gIC8qKQotICBhY19jdl9wYXRoXyQxPSJbJF0kMSIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gaWZlbHNlKFskNV0sICwgJFBBVEgsIFskNV0pOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiBbJDNdOyB0aGVuCi0JYWNfY3ZfcGF0aF8kMT0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZG5sIElmIG5vIDR0aCBhcmcgaXMgZ2l2ZW4sIGxlYXZlIHRoZSBjYWNoZSB2YXJpYWJsZSB1bnNldCwKLWRubCBzbyBBQ19QQVRIX1BST0dTIHdpbGwga2VlcCBsb29raW5nLgotaWZlbHNlKFskNF0sICwgLCBbICB0ZXN0IC16ICJbJF1hY19jdl9wYXRoXyQxIiAmJiBhY19jdl9wYXRoXyQxPSIkNCIKLV0pZG5sCi0gIDs7Ci1lc2FjXSlkbmwKLSQxPSIkYWNfY3ZfcGF0aF8kMSIKLWlmIHRlc3QgLW4gIlskXSQxIjsgdGhlbgotICBBQ19NU0dfUkVTVUxUKFskXSQxKQotZWxzZQotICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKLUFDX1NVQlNUKCQxKWRubAotXSkKLQotIyBDaGVjayB3aGV0aGVyIExDX01FU1NBR0VTIGlzIGF2YWlsYWJsZSBpbiA8bG9jYWxlLmg+LgotIyBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5NS4KLSMKLSMgVGhpcyBmaWxlIGZpbGUgYmUgY29waWVkIGFuZCB1c2VkIGZyZWVseSB3aXRob3V0IHJlc3RyaWN0aW9ucy4gIEl0IGNhbgotIyBiZSB1c2VkIGluIHByb2plY3RzIHdoaWNoIGFyZSBub3QgYXZhaWxhYmxlIHVuZGVyIHRoZSBHTlUgUHVibGljIExpY2Vuc2UKLSMgYnV0IHdoaWNoIHN0aWxsIHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgR05VIGdldHRleHQgZnVuY3Rpb25hbGl0eS4KLSMgUGxlYXNlIG5vdGUgdGhhdCB0aGUgYWN0dWFsIGNvZGUgaXMgKm5vdCogZnJlZWx5IGF2YWlsYWJsZS4KLQotIyBzZXJpYWwgMQotCi1BQ19ERUZVTihBTV9MQ19NRVNTQUdFUywKLSAgW2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9sb2NhbGVfaCA9IHllczsgdGhlbgotICAgIEFDX0NBQ0hFX0NIRUNLKFtmb3IgTENfTUVTU0FHRVNdLCBhbV9jdl92YWxfTENfTUVTU0FHRVMsCi0gICAgICBbQUNfVFJZX0xJTksoWyNpbmNsdWRlIDxsb2NhbGUuaD5dLCBbcmV0dXJuIExDX01FU1NBR0VTXSwKLSAgICAgICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzLCBhbV9jdl92YWxfTENfTUVTU0FHRVM9bm8pXSkKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIEFDX0RFRklORShIQVZFX0xDX01FU1NBR0VTLCAxLAotCQlbRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy5dKQotICAgIGZpCi0gIGZpXSkKLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9hbHBoYS1kaXMuYyBiL29wY29kZXMvYWxwaGEtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMmQ4ZmEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hbHBoYS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKiBhbHBoYS1kaXMuYyAtLSBEaXNhc3NlbWJsZSBBbHBoYSBBWFAgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+LAotICAgcGF0dGVybmVkIGFmdGVyIHRoZSBQUEMgb3Bjb2RlIGhhbmRsaW5nIHdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvci4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9hbHBoYS5oIgotCi0vKiBPU0YgcmVnaXN0ZXIgbmFtZXMuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG9zZl9yZWduYW1lc1s2NF0gPQotewotICAidjAiLCAidDAiLCAidDEiLCAidDIiLCAidDMiLCAidDQiLCAidDUiLCAidDYiLAotICAidDciLCAiczAiLCAiczEiLCAiczIiLCAiczMiLCAiczQiLCAiczUiLCAiZnAiLAotICAiYTAiLCAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiLCAidDgiLCAidDkiLAotICAidDEwIiwgInQxMSIsICJyYSIsICJ0MTIiLCAiYXQiLCAiZ3AiLCAic3AiLCAiemVybyIsCi0gICIkZjAiLCAiJGYxIiwgIiRmMiIsICIkZjMiLCAiJGY0IiwgIiRmNSIsICIkZjYiLCAiJGY3IiwKLSAgIiRmOCIsICIkZjkiLCAiJGYxMCIsICIkZjExIiwgIiRmMTIiLCAiJGYxMyIsICIkZjE0IiwgIiRmMTUiLAotICAiJGYxNiIsICIkZjE3IiwgIiRmMTgiLCAiJGYxOSIsICIkZjIwIiwgIiRmMjEiLCAiJGYyMiIsICIkZjIzIiwKLSAgIiRmMjQiLCAiJGYyNSIsICIkZjI2IiwgIiRmMjciLCAiJGYyOCIsICIkZjI5IiwgIiRmMzAiLCAiJGYzMSIKLX07Ci0KLS8qIFZNUyByZWdpc3RlciBuYW1lcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgdm1zX3JlZ25hbWVzWzY0XSA9Ci17Ci0gICJSMCIsICJSMSIsICJSMiIsICJSMyIsICJSNCIsICJSNSIsICJSNiIsICJSNyIsCi0gICJSOCIsICJSOSIsICJSMTAiLCAiUjExIiwgIlIxMiIsICJSMTMiLCAiUjE0IiwgIlIxNSIsCi0gICJSMTYiLCAiUjE3IiwgIlIxOCIsICJSMTkiLCAiUjIwIiwgIlIyMSIsICJSMjIiLCAiUjIzIiwKLSAgIlIyNCIsICJBSSIsICJSQSIsICJQViIsICJBVCIsICJGUCIsICJTUCIsICJSWiIsCi0gICJGMCIsICJGMSIsICJGMiIsICJGMyIsICJGNCIsICJGNSIsICJGNiIsICJGNyIsCi0gICJGOCIsICJGOSIsICJGMTAiLCAiRjExIiwgIkYxMiIsICJGMTMiLCAiRjE0IiwgIkYxNSIsCi0gICJGMTYiLCAiRjE3IiwgIkYxOCIsICJGMTkiLCAiRjIwIiwgIkYyMSIsICJGMjIiLCAiRjIzIiwKLSAgIkYyNCIsICJGMjUiLCAiRjI2IiwgIkYyNyIsICJGMjgiLCAiRjI5IiwgIkYzMCIsICJGWiIKLX07Ci0KLS8qIERpc2Fzc2VtYmxlIEFscGhhIGluc3RydWN0aW9ucy4gICovCi0KLWludAotcHJpbnRfaW5zbl9hbHBoYSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZV9pbmRleFtBWFBfTk9QUysxXTsKLSAgY29uc3QgY2hhciAqIGNvbnN0ICogcmVnbmFtZXM7Ci0gIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGNvZGUgKm9wY29kZSwgKm9wY29kZV9lbmQ7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7Ci0gIHVuc2lnbmVkIGluc24sIG9wLCBpc2FfbWFzazsKLSAgaW50IG5lZWRfY29tbWE7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgbWFqb3JvcCB0YWJsZSB0aGUgZmlyc3QgdGltZSB0aHJvdWdoICovCi0gIGlmICghb3Bjb2RlX2luZGV4WzBdKQotICAgIHsKLSAgICAgIG9wY29kZSA9IGFscGhhX29wY29kZXM7Ci0gICAgICBvcGNvZGVfZW5kID0gb3Bjb2RlICsgYWxwaGFfbnVtX29wY29kZXM7Ci0KLSAgICAgIGZvciAob3AgPSAwOyBvcCA8IEFYUF9OT1BTOyArK29wKQotICAgICAgICB7Ci0gICAgICAgICAgb3Bjb2RlX2luZGV4W29wXSA9IG9wY29kZTsKLSAgICAgICAgICB3aGlsZSAob3Bjb2RlIDwgb3Bjb2RlX2VuZCAmJiBvcCA9PSBBWFBfT1AgKG9wY29kZS0+b3Bjb2RlKSkKLQkgICAgKytvcGNvZGU7Ci0gICAgICAgIH0KLSAgICAgIG9wY29kZV9pbmRleFtvcF0gPSBvcGNvZGU7Ci0gICAgfQotCi0gIGlmIChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZXZheF9mbGF2b3VyKQotICAgIHJlZ25hbWVzID0gdm1zX3JlZ25hbWVzOwotICBlbHNlCi0gICAgcmVnbmFtZXMgPSBvc2ZfcmVnbmFtZXM7Ci0KLSAgaXNhX21hc2sgPSBBWFBfT1BDT0RFX05PUEFMOwotICBzd2l0Y2ggKGluZm8tPm1hY2gpCi0gICAgewotICAgIGNhc2UgYmZkX21hY2hfYWxwaGFfZXY0OgotICAgICAgaXNhX21hc2sgfD0gQVhQX09QQ09ERV9FVjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX2FscGhhX2V2NToKLSAgICAgIGlzYV9tYXNrIHw9IEFYUF9PUENPREVfRVY1OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9hbHBoYV9ldjY6Ci0gICAgICBpc2FfbWFzayB8PSBBWFBfT1BDT0RFX0VWNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAvKiBSZWFkIHRoZSBpbnNuIGludG8gYSBob3N0IHdvcmQgKi8KLSAgewotICAgIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgICBpbnQgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0gICAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgaW5zbiA9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0gIH0KLQotICAvKiBHZXQgdGhlIG1ham9yIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBvcCA9IEFYUF9PUCAoaW5zbik7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3QgbWF0Y2ggaW4gdGhlIG9wY29kZSB0YWJsZS4gICovCi0gIG9wY29kZV9lbmQgPSBvcGNvZGVfaW5kZXhbb3ArMV07Ci0gIGZvciAob3Bjb2RlID0gb3Bjb2RlX2luZGV4W29wXTsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgKytvcGNvZGUpCi0gICAgewotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPm9wY29kZSkKLQljb250aW51ZTsKLQotICAgICAgaWYgKCEob3Bjb2RlLT5mbGFncyAmIGlzYV9tYXNrKSkKLQljb250aW51ZTsKLQotICAgICAgLyogTWFrZSB0d28gcGFzc2VzIG92ZXIgdGhlIG9wZXJhbmRzLiAgRmlyc3Qgc2VlIGlmIGFueSBvZiB0aGVtCi0JIGhhdmUgZXh0cmFjdGlvbiBmdW5jdGlvbnMsIGFuZCwgaWYgdGhleSBkbywgbWFrZSBzdXJlIHRoZQotCSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0gICAgICB7Ci0gICAgICAgIGludCBpbnZhbGlkID0gMDsKLSAgICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCSAgewotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFscGhhX29wZXJhbmQgKm9wZXJhbmQgPSBhbHBoYV9vcGVyYW5kcyArICpvcGluZGV4OwotCSAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgICAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAmaW52YWxpZCk7Ci0JICB9Ci0gICAgICAgIGlmIChpbnZhbGlkKQotCSAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0gICAgICBnb3RvIGZvdW5kOwotICAgIH0KLQotICAvKiBObyBpbnN0cnVjdGlvbiBmb3VuZCAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nICUjMDh4IiwgaW5zbik7Ci0gICAgCi0gIHJldHVybiA0OwotCi1mb3VuZDoKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0gIGlmIChvcGNvZGUtPm9wZXJhbmRzWzBdICE9IDApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gIC8qIE5vdyBleHRyYWN0IGFuZCBwcmludCB0aGUgb3BlcmFuZHMuICAqLwotICBuZWVkX2NvbW1hID0gMDsKLSAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotICAgIHsKLSAgICAgIGNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kICpvcGVyYW5kID0gYWxwaGFfb3BlcmFuZHMgKyAqb3BpbmRleDsKLSAgICAgIGludCB2YWx1ZTsKLQotICAgICAgLyogT3BlcmFuZHMgdGhhdCBhcmUgbWFya2VkIEZBS0UgYXJlIHNpbXBseSBpZ25vcmVkLiAgV2UKLQkgYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCB0aGUgZXh0cmFjdCBmdW5jdGlvbiBjb25zaWRlcmVkCi0JIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2YWxpZC4gICovCi0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVhQX09QRVJBTkRfRkFLRSkgIT0gMCkKLQljb250aW51ZTsKLQotICAgICAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JdmFsdWUgPSAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOwotICAgICAgZWxzZQotCXsKLQkgIHZhbHVlID0gKGluc24gPj4gb3BlcmFuZC0+c2hpZnQpICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9TSUdORUQpCi0JICAgIHsKLQkgICAgICBpbnQgc2lnbmJpdCA9IDEgPDwgKG9wZXJhbmQtPmJpdHMgLSAxKTsKLQkgICAgICB2YWx1ZSA9ICh2YWx1ZSBeIHNpZ25iaXQpIC0gc2lnbmJpdDsKLQkgICAgfQotCX0KLQotICAgICAgaWYgKG5lZWRfY29tbWEgJiYKLQkgICgob3BlcmFuZC0+ZmxhZ3MgJiAoQVhQX09QRVJBTkRfUEFSRU5TfEFYUF9PUEVSQU5EX0NPTU1BKSkKLQkgICAhPSBBWFBfT1BFUkFORF9QQVJFTlMpKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotCX0KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1BBUkVOUykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIigiKTsKLQotICAgICAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLSAgICAgIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX0lSKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWduYW1lc1t2YWx1ZV0pOwotICAgICAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9GUFIpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWVzW3ZhbHVlKzMyXSk7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1JFTEFUSVZFKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIDQgKyB2YWx1ZSwgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFYUF9PUEVSQU5EX1NJR05FRCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgdmFsdWUpOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSN4IiwgdmFsdWUpOwotCi0gICAgICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBWFBfT1BFUkFORF9QQVJFTlMpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci0gICAgICBuZWVkX2NvbW1hID0gMTsKLSAgICB9Ci0KLSAgcmV0dXJuIDQ7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FscGhhLW9wYy5jIGIvb3Bjb2Rlcy9hbHBoYS1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NlYWY3OS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2FscGhhLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0NiArMCwwIEBACi0vKiBhbHBoYS1vcGMuYyAtLSBBbHBoYSBBWFAgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAoYykgMTk5NiwgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAY3lnbnVzLmNvbT4sCi0gICBwYXR0ZXJuZWQgYWZ0ZXIgdGhlIFBQQyBvcGNvZGUgaGFuZGxpbmcgd3JpdHRlbiBieSBJYW4gTGFuY2UgVGF5bG9yLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLSAgIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgIHRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotICAgMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLSAgIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotICAgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi0gICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCi0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotICAgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvYWxwaGEuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBBbHBoYSBBWFAgb3Bjb2RlIHRhYmxlLiAgVGhlIG9wY29kZSB0YWJsZSBpbmNsdWRlcwotICAgYWxtb3N0IGFsbCBvZiB0aGUgZXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gbW5lbW9uaWNzLiAgVGhpcyBwZXJtaXRzIHRoZQotICAgZGlzYXNzZW1ibGVyIHRvIHVzZSB0aGVtLCBhbmQgc2ltcGxpZmllcyB0aGUgYXNzZW1ibGVyIGxvZ2ljLCBhdCB0aGUKLSAgIGNvc3Qgb2YgaW5jcmVhc2luZyB0aGUgdGFibGUgc2l6ZS4gIFRoZSB0YWJsZSBpcyBzdHJpY3RseSBjb25zdGFudAotICAgZGF0YSwgc28gdGhlIGNvbXBpbGVyIHNob3VsZCBiZSBhYmxlIHRvIHB1dCBpdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQotICAgVGhpcyBmaWxlIGFsc28gaG9sZHMgdGhlIG9wZXJhbmQgdGFibGUuICBBbGwga25vd2xlZGdlIGFib3V0IGluc2VydGluZwotICAgb3BlcmFuZHMgaW50byBpbnN0cnVjdGlvbnMgYW5kIHZpY2UtdmVyc2EgaXMga2VwdCBpbiB0aGlzIGZpbGUuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGJhc2UgaW5zdHJ1Y3Rpb24gc2V0IHdhcyBjb21waWxlZCBmcm9tIHRoZQotICAgX0FscGhhIEFyY2hpdGVjdHVyZSBIYW5kYm9va18sIERpZ2l0YWwgT3JkZXIgTnVtYmVyIEVDLVFEMktCLVRFLAotICAgdmVyc2lvbiAyLgotCi0gICBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwb3N0LWV2NSBhcmNoaXRlY3R1cmUgZXh0ZW5zaW9ucyBCV1gsIENJWCBhbmQKLSAgIE1BWCBjYW1lIGZyb20gdmVyc2lvbiAzIG9mIHRoaXMgc2FtZSBkb2N1bWVudCwgd2hpY2ggaXMgYWxzbyBhdmFpbGFibGUKLSAgIG9uLWxpbmUgYXQgaHR0cDovL2Z0cC5kaWdpdGFsLmNvbS9wdWIvRGlnaXRhbC9pbmZvL3NlbWljb25kdWN0b3IKLSAgIC9saXRlcmF0dXJlL2FscGhhaGIyLnBkZgotCi0gICBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSBFVjQgUEFMY29kZSBpbnN0cnVjdGlvbnMgd2FzIGNvbXBpbGVkIGZyb20KLSAgIF9ERUNjaGlwIDIxMDY0IGFuZCBERUNjaGlwIDIxMDY0QSBBbHBoYSBBWFAgTWljcm9wcm9jZXNzb3JzIEhhcmR3YXJlCi0gICBSZWZlcmVuY2UgTWFudWFsXywgRGlnaXRhbCBPcmRlciBOdW1iZXIgRUMtUTlaVUEtVEUsIHByZWxpbWluYXJ5Ci0gICByZXZpc2lvbiBkYXRlZCBKdW5lIDE5OTQuCi0KLSAgIFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIEVWNSBQQUxjb2RlIGluc3RydWN0aW9ucyB3YXMgY29tcGlsZWQgZnJvbQotICAgX0FscGhhIDIxMTY0IE1pY3JvcHJvY2Vzc29yIEhhcmR3YXJlIFJlZmVyZW5jZSBNYW51YWxfLCBEaWdpdGFsCi0gICBPcmRlciBOdW1iZXIgRUMtUUFFUUItVEUsIHByZWxpbWluYXJ5IHJldmlzaW9uIGRhdGVkIEFwcmlsIDE5OTUuICAqLwotDAotLyogTG9jYWwgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3JiYSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfcmNhIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF96YSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfemIgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X3pjIFBBUkFNUygodW5zaWduZWQsIGludCwgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGluc2VydF9iZGlzcCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnNlcnRfamhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW5zZXJ0X2V2Nmh3amhpbnQgUEFSQU1TKCh1bnNpZ25lZCwgaW50LCBjb25zdCBjaGFyICoqKSk7Ci0KLXN0YXRpYyBpbnQgZXh0cmFjdF9yYmEgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9yY2EgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF96YSBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X3piIFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfemMgUEFSQU1TKCh1bnNpZ25lZCwgaW50ICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9iZGlzcCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotc3RhdGljIGludCBleHRyYWN0X2poaW50IFBBUkFNUygodW5zaWduZWQsIGludCAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfZXY2aHdqaGludCBQQVJBTVMoKHVuc2lnbmVkLCBpbnQgKikpOwotCi0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUgICovCi0KLWNvbnN0IHN0cnVjdCBhbHBoYV9vcGVyYW5kIGFscGhhX29wZXJhbmRzW10gPQotewotICAvKiBUaGUgZmllbGRzIGFyZSBiaXRzLCBzaGlmdCwgaW5zZXJ0LCBleHRyYWN0LCBmbGFncyAqLwotICAvKiBUaGUgemVybyBpbmRleCBpcyB1c2VkIHRvIGluZGljYXRlIGVuZC1vZi1saXN0ICovCi0jZGVmaW5lIFVOVVNFRAkJMAotICB7IDAsIDAsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgcGxhaW4gaW50ZWdlciByZWdpc3RlciBmaWVsZHMgKi8KLSNkZWZpbmUgUkEJCShVTlVTRUQgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9JUiwgMCwgMCB9LAotI2RlZmluZSBSQgkJKFJBICsgMSkKLSAgeyA1LCAxNiwgMCwgQVhQX09QRVJBTkRfSVIsIDAsIDAgfSwKLSNkZWZpbmUgUkMJCShSQiArIDEpCi0gIHsgNSwgMCwgMCwgQVhQX09QRVJBTkRfSVIsIDAsIDAgfSwKLQotICAvKiBUaGUgcGxhaW4gZnAgcmVnaXN0ZXIgZmllbGRzICovCi0jZGVmaW5lIEZBCQkoUkMgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9GUFIsIDAsIDAgfSwKLSNkZWZpbmUgRkIJCShGQSArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZQUiwgMCwgMCB9LAotI2RlZmluZSBGQwkJKEZCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GUFIsIDAsIDAgfSwKLQotICAvKiBUaGUgaW50ZWdlciByZWdpc3RlcnMgd2hlbiB0aGV5IGFyZSBaRVJPICovCi0jZGVmaW5lIFpBCQkoRkMgKyAxKQotICB7IDUsIDIxLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfemEsIGV4dHJhY3RfemEgfSwKLSNkZWZpbmUgWkIJCShaQSArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0ZBS0UsIGluc2VydF96YiwgZXh0cmFjdF96YiB9LAotI2RlZmluZSBaQwkJKFpCICsgMSkKLSAgeyA1LCAwLCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfemMsIGV4dHJhY3RfemMgfSwKLQotICAvKiBUaGUgUkIgZmllbGQgd2hlbiBpdCBuZWVkcyBwYXJlbnRoZXNlcyAqLwotI2RlZmluZSBQUkIJCShaQyArIDEpCi0gIHsgNSwgMTYsIDAsIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOUywgMCwgMCB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG5lZWRzIHBhcmVudGhlc2VzIF9hbmRfIGEgcHJlY2VkaW5nIGNvbW1hICovCi0jZGVmaW5lIENQUkIJCShQUkIgKyAxKQotICB7IDUsIDE2LCAwLAotICAgIEFYUF9PUEVSQU5EX0lSfEFYUF9PUEVSQU5EX1BBUkVOU3xBWFBfT1BFUkFORF9DT01NQSwgMCwgMCB9LAotCi0gIC8qIFRoZSBSQiBmaWVsZCB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIFJBIGZpZWxkICovCi0jZGVmaW5lIFJCQQkJKENQUkIgKyAxKQotICB7IDUsIDE2LCAwLCBBWFBfT1BFUkFORF9GQUtFLCBpbnNlcnRfcmJhLCBleHRyYWN0X3JiYSB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIFJCIGZpZWxkICovCi0jZGVmaW5lIFJDQQkJKFJCQSArIDEpCi0gIHsgNSwgMCwgMCwgQVhQX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3JjYSwgZXh0cmFjdF9yY2EgfSwKLQotICAvKiBUaGUgUkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJBICovCi0jZGVmaW5lIERSQzEJCShSQ0EgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfREVGQVVMVF9GSVJTVCwgMCwgMCB9LAotCi0gIC8qIFRoZSBSQyBmaWVsZCB3aGVuIGl0IGNhbiAqZGVmYXVsdCogdG8gUkIgKi8KLSNkZWZpbmUgRFJDMgkJKERSQzEgKyAxKQotICB7IDUsIDAsIDAsCi0gICAgQVhQX09QRVJBTkRfSVJ8QVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQsIDAsIDAgfSwKLQotICAvKiBUaGUgRkMgZmllbGQgd2hlbiBpdCBjYW4gKmRlZmF1bHQqIHRvIFJBICovCi0jZGVmaW5lIERGQzEJCShEUkMyICsgMSkKLSAgeyA1LCAwLCAwLAotICAgIEFYUF9PUEVSQU5EX0ZQUnxBWFBfT1BFUkFORF9ERUZBVUxUX0ZJUlNULCAwLCAwIH0sCi0KLSAgLyogVGhlIEZDIGZpZWxkIHdoZW4gaXQgY2FuICpkZWZhdWx0KiB0byBSQiAqLwotI2RlZmluZSBERkMyCQkoREZDMSArIDEpCi0gIHsgNSwgMCwgMCwKLSAgICBBWFBfT1BFUkFORF9GUFJ8QVhQX09QRVJBTkRfREVGQVVMVF9TRUNPTkQsIDAsIDAgfSwKLQotICAvKiBUaGUgdW5zaWduZWQgOC1iaXQgbGl0ZXJhbCBvZiBPcGVyYXRlIGZvcm1hdCBpbnNucyAqLwotI2RlZmluZSBMSVQJCShERkMyICsgMSkKLSAgeyA4LCAxMywgLUxJVCwgQVhQX09QRVJBTkRfVU5TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgc2lnbmVkIDE2LWJpdCBkaXNwbGFjZW1lbnQgb2YgTWVtb3J5IGZvcm1hdCBpbnNucy4gIEZyb20gaGVyZQotICAgICB3ZSBjYW4ndCB0ZWxsIHdoYXQgcmVsb2NhdGlvbiBzaG91bGQgYmUgdXNlZCwgc28gZG9uJ3QgdXNlIGEgZGVmYXVsdC4gKi8KLSNkZWZpbmUgTURJU1AJCShMSVQgKyAxKQotICB7IDE2LCAwLCAtTURJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSBzaWduZWQgIjIzLWJpdCIgYWxpZ25lZCBkaXNwbGFjZW1lbnQgb2YgQnJhbmNoIGZvcm1hdCBpbnNucyAqLwotI2RlZmluZSBCRElTUAkJKE1ESVNQICsgMSkKLSAgeyAyMSwgMCwgQkZEX1JFTE9DXzIzX1BDUkVMX1MyLCAKLSAgICBBWFBfT1BFUkFORF9SRUxBVElWRSwgaW5zZXJ0X2JkaXNwLCBleHRyYWN0X2JkaXNwIH0sCi0KLSAgLyogVGhlIDI2LWJpdCBQQUxjb2RlIGZ1bmN0aW9uICovCi0jZGVmaW5lIFBBTEZOCQkoQkRJU1AgKyAxKQotICB7IDI2LCAwLCAtUEFMRk4sIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIG9wdGlvbmFsIHNpZ25lZCAiMTYtYml0IiBhbGlnbmVkIGRpc3BsYWNlbWVudCBvZiB0aGUgSk1QL0pTUiBoaW50ICovCi0jZGVmaW5lIEpNUEhJTlQJCShQQUxGTiArIDEpCi0gIHsgMTQsIDAsIEJGRF9SRUxPQ19BTFBIQV9ISU5ULAotICAgIEFYUF9PUEVSQU5EX1JFTEFUSVZFfEFYUF9PUEVSQU5EX0RFRkFVTFRfWkVST3xBWFBfT1BFUkFORF9OT09WRVJGTE9XLAotICAgIGluc2VydF9qaGludCwgZXh0cmFjdF9qaGludCB9LAotCi0gIC8qIFRoZSBvcHRpb25hbCBoaW50IHRvIFJFVC9KU1JfQ09ST1VUSU5FICovCi0jZGVmaW5lIFJFVEhJTlQJCShKTVBISU5UICsgMSkKLSAgeyAxNCwgMCwgLVJFVEhJTlQsCi0gICAgQVhQX09QRVJBTkRfVU5TSUdORUR8QVhQX09QRVJBTkRfREVGQVVMVF9aRVJPLCAwLCAwIH0sCi0KLSAgLyogVGhlIDEyLWJpdCBkaXNwbGFjZW1lbnQgZm9yIHRoZSBldls0Nl0gaHdfe2xkLHN0fSAocGFsMWIvcGFsMWYpIGluc25zICovCi0jZGVmaW5lIEVWNEhXRElTUAkoUkVUSElOVCArIDEpCi0jZGVmaW5lIEVWNkhXRElTUAkoRVY0SFdESVNQKQotICB7IDEyLCAwLCAtRVY0SFdESVNQLCBBWFBfT1BFUkFORF9TSUdORUQsIDAsIDAgfSwKLQotICAvKiBUaGUgNS1iaXQgaW5kZXggZm9yIHRoZSBldjQgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNEhXSU5ERVgJKEVWNEhXRElTUCArIDEpCi0gIHsgNSwgMCwgLUVWNEhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDgtYml0IGluZGV4IGZvciB0aGUgb2RkbHkgdW5xdWFsaWZpZWQgaHdfbVt0Zl1wciBpbnNucwotICAgICB0aGF0IG9jY3VyIGluIERFQyBQQUxjb2RlLiAgKi8KLSNkZWZpbmUgRVY0RVhUSFdJTkRFWAkoRVY0SFdJTkRFWCArIDEpCi0gIHsgOCwgMCwgLUVWNEVYVEhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDEwLWJpdCBkaXNwbGFjZW1lbnQgZm9yIHRoZSBldjUgaHdfe2xkLHN0fSAocGFsMWIvcGFsMWYpIGluc25zICovCi0jZGVmaW5lIEVWNUhXRElTUAkoRVY0RVhUSFdJTkRFWCArIDEpCi0gIHsgMTAsIDAsIC1FVjVIV0RJU1AsIEFYUF9PUEVSQU5EX1NJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSAxNi1iaXQgaW5kZXggZm9yIHRoZSBldjUgaHdfbVtmdF1wciAocGFsMTkvcGFsMWQpIGluc25zICovCi0jZGVmaW5lIEVWNUhXSU5ERVgJKEVWNUhXRElTUCArIDEpCi0gIHsgMTYsIDAsIC1FVjVIV0lOREVYLCBBWFBfT1BFUkFORF9VTlNJR05FRCwgMCwgMCB9LAotCi0gIC8qIFRoZSAxNi1iaXQgY29tYmluZWQgaW5kZXgvc2NvcmVib2FyZCBtYXNrIGZvciB0aGUgZXY2Ci0gICAgIGh3X21bZnRdcHIgKHBhbDE5L3BhbDFkKSBpbnNucyAqLwotI2RlZmluZSBFVjZIV0lOREVYCShFVjVIV0lOREVYICsgMSkKLSAgeyAxNiwgMCwgLUVWNkhXSU5ERVgsIEFYUF9PUEVSQU5EX1VOU0lHTkVELCAwLCAwIH0sCi0KLSAgLyogVGhlIDEzLWJpdCBicmFuY2ggaGludCBmb3IgdGhlIGV2NiBod19qbXAvanNyIChwYWwxZSkgaW5zbiAqLwotI2RlZmluZSBFVjZIV0pNUEhJTlQJKEVWNkhXSU5ERVgrIDEpCi0gIHsgOCwgMCwgLUVWNkhXSk1QSElOVCwKLSAgICBBWFBfT1BFUkFORF9SRUxBVElWRXxBWFBfT1BFUkFORF9ERUZBVUxUX1pFUk98QVhQX09QRVJBTkRfTk9PVkVSRkxPVywKLSAgICBpbnNlcnRfZXY2aHdqaGludCwgZXh0cmFjdF9ldjZod2poaW50IH0KLX07Ci0KLWNvbnN0IGludCBhbHBoYV9udW1fb3BlcmFuZHMgPSBzaXplb2YoYWxwaGFfb3BlcmFuZHMpL3NpemVvZigqYWxwaGFfb3BlcmFuZHMpOwotCi0vKiBUaGUgUkIgZmllbGQgd2hlbiBpdCBpcyB0aGUgc2FtZSBhcyB0aGUgUkEgZmllbGQgaW4gdGhlIHNhbWUgaW5zbi4KLSAgIFRoaXMgb3BlcmFuZCBpcyBtYXJrZWQgZmFrZS4gIFRoZSBpbnNlcnRpb24gZnVuY3Rpb24ganVzdCBjb3BpZXMKLSAgIHRoZSBSQSBmaWVsZCBpbnRvIHRoZSBSQiBmaWVsZCwgYW5kIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9uIGp1c3QKLSAgIGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZSBzYW1lLiAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3JiYShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAyMSkgJiAweDFmKSA8PCAxNik7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfcmJhKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDE2KSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLQotLyogVGhlIHNhbWUgZm9yIHRoZSBSQyBmaWVsZCAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X3JjYShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKChpbnNuID4+IDIxKSAmIDB4MWYpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3JjYShpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDIxKSAmIDB4MWYpICE9IChpbnNuICYgMHgxZikpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotCi0vKiBGYWtlIGFyZ3VtZW50cyBpbiB3aGljaCB0aGUgcmVnaXN0ZXJzIG11c3QgYmUgc2V0IHRvIFpFUk8gKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YShpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKDMxIDw8IDIxKTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF96YShpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gMzEpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YihpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKDMxIDw8IDE2KTsKLX0KLQotc3RhdGljIGludAotZXh0cmFjdF96YihpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTCAmJiAoKGluc24gPj4gMTYpICYgMHgxZikgIT0gMzEpCi0gICAgKmludmFsaWQgPSAxOwotICByZXR1cm4gMDsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF96YyhpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgMzE7Ci19Ci0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfemMoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwgJiYgKGluc24gJiAweDFmKSAhPSAzMSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0KLS8qIFRoZSBkaXNwbGFjZW1lbnQgZmllbGQgb2YgYSBCcmFuY2ggZm9ybWF0IGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9iZGlzcChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygiYnJhbmNoIG9wZXJhbmQgdW5hbGlnbmVkIik7Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAvIDQpICYgMHgxRkZGRkYpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfYmRpc3AoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gNCAqICgoKGluc24gJiAweDFGRkZGRikgXiAweDEwMDAwMCkgLSAweDEwMDAwMCk7Ci19Ci0KLQotLyogVGhlIGhpbnQgZmllbGQgb2YgYSBKTVAvSlNSIGluc24uICAqLwotCi1zdGF0aWMgdW5zaWduZWQKLWluc2VydF9qaGludChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopTlVMTCAmJiAodmFsdWUgJiAzKSkKLSAgICAqZXJybXNnID0gXygianVtcCBoaW50IHVuYWxpZ25lZCIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgLyA0KSAmIDB4M0ZGRik7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGludAotZXh0cmFjdF9qaGludChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4M0ZGRikgXiAweDIwMDApIC0gMHgyMDAwKTsKLX0KLQotLyogVGhlIGhpbnQgZmllbGQgb2YgYW4gRVY2IEhXX0pNUC9KU1IgaW5zbi4gICovCi0KLXN0YXRpYyB1bnNpZ25lZAotaW5zZXJ0X2V2Nmh3amhpbnQoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgaW5zbjsKLSAgICAgaW50IHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKU5VTEwgJiYgKHZhbHVlICYgMykpCi0gICAgKmVycm1zZyA9IF8oImp1bXAgaGludCB1bmFsaWduZWQiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlIC8gNCkgJiAweDFGRkYpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfZXY2aHdqaGludChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiA0ICogKCgoaW5zbiAmIDB4MUZGRikgXiAweDEwMDApIC0gMHgxMDAwKTsKLX0KLQotDAotLyogTWFjcm9zIHVzZWQgdG8gZm9ybSBvcGNvZGVzICovCi0KLS8qIFRoZSBtYWluIG9wY29kZSAqLwotI2RlZmluZSBPUCh4KQkJKCgoeCkgJiAweDNGKSA8PCAyNikKLSNkZWZpbmUgT1BfTUFTSwkJMHhGQzAwMDAwMAotCi0vKiBCcmFuY2ggZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBCUkFfKG9vKQlPUChvbykKLSNkZWZpbmUgQlJBX01BU0sJT1BfTUFTSwotI2RlZmluZSBCUkEob28pCQlCUkFfKG9vKSwgQlJBX01BU0sKLQotLyogRmxvYXRpbmcgcG9pbnQgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBGUF8ob28sZmZmKQkoT1Aob28pIHwgKCgoZmZmKSAmIDB4N0ZGKSA8PCA1KSkKLSNkZWZpbmUgRlBfTUFTSwkJKE9QX01BU0sgfCAweEZGRTApCi0jZGVmaW5lIEZQKG9vLGZmZikJRlBfKG9vLGZmZiksIEZQX01BU0sKLQotLyogTWVtb3J5IGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUVNXyhvbykJT1Aob28pCi0jZGVmaW5lIE1FTV9NQVNLCU9QX01BU0sKLSNkZWZpbmUgTUVNKG9vKQkJTUVNXyhvbyksIE1FTV9NQVNLCi0KLS8qIE1lbW9yeS9GdW5jIENvZGUgZm9ybWF0IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBNRkNfKG9vLGZmZmYpCShPUChvbykgfCAoKGZmZmYpICYgMHhGRkZGKSkKLSNkZWZpbmUgTUZDX01BU0sJKE9QX01BU0sgfCAweEZGRkYpCi0jZGVmaW5lIE1GQyhvbyxmZmZmKQlNRkNfKG9vLGZmZmYpLCBNRkNfTUFTSwotCi0vKiBNZW1vcnkvQnJhbmNoIGZvcm1hdCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgTUJSXyhvbyxoKQkoT1Aob28pIHwgKCgoaCkgJiAzKSA8PCAxNCkpCi0jZGVmaW5lIE1CUl9NQVNLCShPUF9NQVNLIHwgMHhDMDAwKQotI2RlZmluZSBNQlIob28saCkJTUJSXyhvbyxoKSwgTUJSX01BU0sKLQotLyogT3BlcmF0ZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zLiAgVGhlIE9QUkwgdmFyaWFudCBzcGVjaWZpZXMgYQotICAgbGl0ZXJhbCBzZWNvbmQgYXJndW1lbnQuICovCi0jZGVmaW5lIE9QUl8ob28sZmYpCShPUChvbykgfCAoKChmZikgJiAweDdGKSA8PCA1KSkKLSNkZWZpbmUgT1BSTF8ob28sZmYpCShPUFJfKChvbyksKGZmKSkgfCAweDEwMDApCi0jZGVmaW5lIE9QUl9NQVNLCShPUF9NQVNLIHwgMHgxRkUwKQotI2RlZmluZSBPUFIob28sZmYpCU9QUl8ob28sZmYpLCBPUFJfTUFTSwotI2RlZmluZSBPUFJMKG9vLGZmKQlPUFJMXyhvbyxmZiksIE9QUl9NQVNLCi0KLS8qIEdlbmVyaWMgUEFMY29kZSBmb3JtYXQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFBDRF8ob28pCU9QKG9vKQotI2RlZmluZSBQQ0RfTUFTSwlPUF9NQVNLCi0jZGVmaW5lIFBDRChvbykJCVBDRF8ob28pLCBQQ0RfTUFTSwotCi0vKiBTcGVjaWZpYyBQQUxjb2RlIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBTUENEXyhvbyxmZmZmKQkoT1Aob28pIHwgKChmZmZmKSAmIDB4M0ZGRkZGRikpCi0jZGVmaW5lIFNQQ0RfTUFTSwkweEZGRkZGRkZGCi0jZGVmaW5lIFNQQ0Qob28sZmZmZikJU1BDRF8ob28sZmZmZiksIFNQQ0RfTUFTSwotCi0vKiBIYXJkd2FyZSBtZW1vcnkgKGh3X3tsZCxzdH0pIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBFVjRIV01FTV8ob28sZikJKE9QKG9vKSB8ICgoKGYpICYgMHhGKSA8PCAxMikpCi0jZGVmaW5lIEVWNEhXTUVNX01BU0sJKE9QX01BU0sgfCAweEYwMDApCi0jZGVmaW5lIEVWNEhXTUVNKG9vLGYpCUVWNEhXTUVNXyhvbyxmKSwgRVY0SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNUhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweDNGKSA8PCAxMCkpCi0jZGVmaW5lIEVWNUhXTUVNX01BU0sJKE9QX01BU0sgfCAweEY4MDApCi0jZGVmaW5lIEVWNUhXTUVNKG9vLGYpCUVWNUhXTUVNXyhvbyxmKSwgRVY1SFdNRU1fTUFTSwotCi0jZGVmaW5lIEVWNkhXTUVNXyhvbyxmKQkoT1Aob28pIHwgKCgoZikgJiAweEYpIDw8IDEyKSkKLSNkZWZpbmUgRVY2SFdNRU1fTUFTSwkoT1BfTUFTSyB8IDB4RjAwMCkKLSNkZWZpbmUgRVY2SFdNRU0ob28sZikJRVY2SFdNRU1fKG9vLGYpLCBFVjZIV01FTV9NQVNLCi0KLSNkZWZpbmUgRVY2SFdNQlJfKG9vLGgpCShPUChvbykgfCAoKChoKSAmIDcpIDw8IDEzKSkKLSNkZWZpbmUgRVY2SFdNQlJfTUFTSwkoT1BfTUFTSyB8IDB4RTAwMCkKLSNkZWZpbmUgRVY2SFdNQlIob28saCkJRVY2SFdNQlJfKG9vLGgpLCBFVjZIV01CUl9NQVNLCi0KLS8qIEFiYnJldmlhdGlvbnMgZm9yIGluc3RydWN0aW9uIHN1YnNldHMuICAqLwotI2RlZmluZSBCQVNFCQkJQVhQX09QQ09ERV9CQVNFCi0jZGVmaW5lIEVWNAkJCUFYUF9PUENPREVfRVY0Ci0jZGVmaW5lIEVWNQkJCUFYUF9PUENPREVfRVY1Ci0jZGVmaW5lIEVWNgkJCUFYUF9PUENPREVfRVY2Ci0jZGVmaW5lIEJXWAkJCUFYUF9PUENPREVfQldYCi0jZGVmaW5lIENJWAkJCUFYUF9PUENPREVfQ0lYCi0jZGVmaW5lIE1BWAkJCUFYUF9PUENPREVfTUFYCi0KLS8qIENvbW1vbiBjb21iaW5hdGlvbnMgb2YgYXJndW1lbnRzICovCi0jZGVmaW5lIEFSR19OT05FCQl7IDAgfQotI2RlZmluZSBBUkdfQlJBCQkJeyBSQSwgQkRJU1AgfQotI2RlZmluZSBBUkdfRkJSQQkJeyBGQSwgQkRJU1AgfQotI2RlZmluZSBBUkdfRlAJCQl7IEZBLCBGQiwgREZDMSB9Ci0jZGVmaW5lIEFSR19GUFoxCQl7IFpBLCBGQiwgREZDMSB9Ci0jZGVmaW5lIEFSR19NRU0JCQl7IFJBLCBNRElTUCwgUFJCIH0KLSNkZWZpbmUgQVJHX0ZNRU0JCXsgRkEsIE1ESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfT1BSCQkJeyBSQSwgUkIsIERSQzEgfQotI2RlZmluZSBBUkdfT1BSTAkJeyBSQSwgTElULCBEUkMxIH0KLSNkZWZpbmUgQVJHX09QUloxCQl7IFpBLCBSQiwgRFJDMSB9Ci0jZGVmaW5lIEFSR19PUFJMWjEJCXsgWkEsIExJVCwgUkMgfQotI2RlZmluZSBBUkdfUENECQkJeyBQQUxGTiB9Ci0jZGVmaW5lIEFSR19FVjRIV01FTQkJeyBSQSwgRVY0SFdESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRVY0SFdNUFIJCXsgUkEsIFJCQSwgRVY0SFdJTkRFWCB9Ci0jZGVmaW5lIEFSR19FVjVIV01FTQkJeyBSQSwgRVY1SFdESVNQLCBQUkIgfQotI2RlZmluZSBBUkdfRVY2SFdNRU0JCXsgUkEsIEVWNkhXRElTUCwgUFJCIH0KLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRSBPUENPREUgTUFTSyB7IE9QRVJBTkRTIH0KLQotICAgTkFNRQkJaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotCi0gICBPUENPREUJaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLQotICAgTUFTSwkJaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgICAgICAgICAJd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLQotICAgT1BFUkFORFMJaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBwcmVjZWRpbmcgbWFjcm9zIG1lcmdlIHRoZSB0ZXh0IG9mIHRoZSBPUENPREUgYW5kIE1BU0sgZmllbGRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4KLQotICAgT3RoZXJ3aXNlLCBpdCBpcyBzb3J0ZWQgYnkgbWFqb3Igb3Bjb2RlIGFuZCBtaW5vciBmdW5jdGlvbiBjb2RlLgotCi0gICBUaGVyZSBhcmUgdGhyZWUgY2xhc3NlcyBvZiBub3QtcmVhbGx5LWluc3RydWN0aW9ucyBpbiB0aGlzIHRhYmxlOgotCi0gICBBTElBUwlpcyBhbm90aGVyIG5hbWUgZm9yIGFub3RoZXIgaW5zdHJ1Y3Rpb24uICBTb21lIG9mCi0JCXRoZXNlIGNvbWUgZnJvbSB0aGUgQXJjaGl0ZWN0dXJlIEhhbmRib29rLCBzb21lCi0JCWNvbWUgZnJvbSB0aGUgb3JpZ2luYWwgZ2FzIG9wY29kZSB0YWJsZXMuICBJbiBhbGwKLQkJY2FzZXMsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBvcGNvZGUgaXMgdW5jaGFuZ2VkLgotCi0gICBQU0VVRE8JYSBzdHlsaXplZCBjb2RlIGZvcm0gZW5kb3JzZWQgYnkgQ2hhcHRlciBBLjQgb2YgdGhlCi0JCUFyY2hpdGVjdHVyZSBIYW5kYm9vay4KLQotICAgRVhUUkEJYSBzdHlsaXplZCBjb2RlIGZvcm0gZm91bmQgaW4gdGhlIG9yaWdpbmFsIGdhcyB0YWJsZXMuCi0KLSAgIEFuZCB0d28gYW5ub3RhdGlvbnM6Ci0KLSAgIEVWNTYgQlVUCW9wY29kZXMgdGhhdCBhcmUgb2ZmaWNpYWxseSBpbnRyb2R1Y2VkIGFzIG9mIHRoZSBldjU2LAotICAgCQlidXQgd2l0aCBkZWZpbmVkIHJlc3VsdHMgb24gcHJldmlvdXMgaW1wbGVtZW50YXRpb25zLgotCi0gICBFVjU2IFVOQQlvcGNvZGVzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGFzIG9mIHRoZSBldjU2IHdpdGgKLSAgIAkJcHJlc3VtYWJseSB1bmRlZmluZWQgcmVzdWx0cyBvbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbnMKLQkJdGhhdCB3ZXJlIG5vdCBhc3NpZ25lZCB0byBhIHBhcnRpY3VsYXIgZXh0ZW5zaW9uLgotKi8KLQotY29uc3Qgc3RydWN0IGFscGhhX29wY29kZSBhbHBoYV9vcGNvZGVzW10gPSB7Ci0gIHsgImhhbHQiLAkJU1BDRCgweDAwLDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImRyYWluYSIsCQlTUENEKDB4MDAsMHgwMDAyKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiYnB0IiwJCVNQQ0QoMHgwMCwweDAwODApLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjYWxsc3lzIiwJCVNQQ0QoMHgwMCwweDAwODMpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjaG1rIiwgCQlTUENEKDB4MDAsMHgwMDgzKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiaW1iIiwJCVNQQ0QoMHgwMCwweDAwODYpLCBCQVNFLCBBUkdfTk9ORSB9LAotICB7ICJjYWxsX3BhbCIsCQlQQ0QoMHgwMCksIEJBU0UsIEFSR19QQ0QgfSwKLSAgeyAicGFsIiwJCVBDRCgweDAwKSwgQkFTRSwgQVJHX1BDRCB9LAkJLyogYWxpYXMgKi8KLQotICB7ICJsZGEiLAkJTUVNKDB4MDgpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkYWgiLAkJTUVNKDB4MDkpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgImxkYnUiLAkJTUVNKDB4MEEpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAidW5vcCIsCQlNRU0oMHgwQiksIEJBU0UsIHsgWkEgfSB9LAkJLyogcHNldWRvICovCi0gIHsgImxkcV91IiwJCU1FTSgweDBCKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZHd1IiwJCU1FTSgweDBDKSwgQldYLCBBUkdfTUVNIH0sCi0gIHsgInN0dyIsCQlNRU0oMHgwRCksIEJXWCwgQVJHX01FTSB9LAotICB7ICJzdGIiLAkJTUVNKDB4MEUpLCBCV1gsIEFSR19NRU0gfSwKLSAgeyAic3RxX3UiLAkJTUVNKDB4MEYpLCBCQVNFLCBBUkdfTUVNIH0sCi0KLSAgeyAic2V4dGwiLAkJT1BSKDB4MTAsMHgwMCksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic2V4dGwiLAkJT1BSTCgweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJhZGRsIiwJCU9QUigweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZGwiLAkJT1BSTCgweDEwLDB4MDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNGFkZGwiLAkJT1BSKDB4MTAsMHgwMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRhZGRsIiwJCU9QUkwoMHgxMCwweDAyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVnbCIsCQlPUFIoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJuZWdsIiwJCU9QUkwoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VibCIsCQlPUFIoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJsIiwJCU9QUkwoMHgxMCwweDA5KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczRzdWJsIiwJCU9QUigweDEwLDB4MEIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM0c3VibCIsCQlPUFJMKDB4MTAsMHgwQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGJnZSIsCQlPUFIoMHgxMCwweDBGKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBiZ2UiLAkJT1BSTCgweDEwLDB4MEYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOGFkZGwiLAkJT1BSKDB4MTAsMHgxMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhhZGRsIiwJCU9QUkwoMHgxMCwweDEyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhzdWJsIiwJCU9QUigweDEwLDB4MUIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4c3VibCIsCQlPUFJMKDB4MTAsMHgxQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcHVsdCIsCQlPUFIoMHgxMCwweDFEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXB1bHQiLAkJT1BSTCgweDEwLDB4MUQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRxIiwJCU9QUigweDEwLDB4MjApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImFkZHEiLAkJT1BSTCgweDEwLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNGFkZHEiLAkJT1BSKDB4MTAsMHgyMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRhZGRxIiwJCU9QUkwoMHgxMCwweDIyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVncSIsIAkJT1BSKDB4MTAsMHgyOSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVncSIsIAkJT1BSTCgweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJxIiwJCU9QUigweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YnEiLAkJT1BSTCgweDEwLDB4MjkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzNHN1YnEiLAkJT1BSKDB4MTAsMHgyQiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczRzdWJxIiwJCU9QUkwoMHgxMCwweDJCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21wZXEiLAkJT1BSKDB4MTAsMHgyRCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21wZXEiLAkJT1BSTCgweDEwLDB4MkQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJzOGFkZHEiLAkJT1BSKDB4MTAsMHgzMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiczhhZGRxIiwJCU9QUkwoMHgxMCwweDMyKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiczhzdWJxIiwJCU9QUigweDEwLDB4M0IpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInM4c3VicSIsCQlPUFJMKDB4MTAsMHgzQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcHVsZSIsCQlPUFIoMHgxMCwweDNEKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXB1bGUiLAkJT1BSTCgweDEwLDB4M0QpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJhZGRsL3YiLAkJT1BSKDB4MTAsMHg0MCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYWRkbC92IiwJCU9QUkwoMHgxMCwweDQwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibmVnbC92IiwJCU9QUigweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSWjEgfSwJLyogcHNldWRvICovCi0gIHsgIm5lZ2wvdiIsCQlPUFJMKDB4MTAsMHg0OSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YmwvdiIsCQlPUFIoMHgxMCwweDQ5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzdWJsL3YiLAkJT1BSTCgweDEwLDB4NDkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbXBsdCIsCQlPUFIoMHgxMCwweDREKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbXBsdCIsCQlPUFJMKDB4MTAsMHg0RCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImFkZHEvdiIsCQlPUFIoMHgxMCwweDYwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJhZGRxL3YiLAkJT1BSTCgweDEwLDB4NjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJuZWdxL3YiLAkJT1BSKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAibmVncS92IiwJCU9QUkwoMHgxMCwweDY5KSwgQkFTRSwgQVJHX09QUkxaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicS92IiwJCU9QUigweDEwLDB4NjkpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInN1YnEvdiIsCQlPUFJMKDB4MTAsMHg2OSksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtcGxlIiwJCU9QUigweDEwLDB4NkQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtcGxlIiwJCU9QUkwoMHgxMCwweDZEKSwgQkFTRSwgQVJHX09QUkwgfSwKLQotICB7ICJhbmQiLAkJT1BSKDB4MTEsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiYW5kIiwJCU9QUkwoMHgxMSwweDAwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiYW5kbm90IiwJCU9QUigweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSIH0sCS8qIGFsaWFzICovCi0gIHsgImFuZG5vdCIsCQlPUFJMKDB4MTEsMHgwOCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImJpYyIsCQlPUFIoMHgxMSwweDA4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJiaWMiLAkJT1BSTCgweDExLDB4MDgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bGJzIiwJCU9QUigweDExLDB4MTQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsYnMiLAkJT1BSTCgweDExLDB4MTQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bGJjIiwJCU9QUigweDExLDB4MTYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsYmMiLAkJT1BSTCgweDExLDB4MTYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJub3AiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFpCLCBaQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJjbHIiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFpCLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgWkEsIFJCLCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJtb3YiLAkJT1BSKDB4MTEsMHgyMCksIEJBU0UsIHsgUkEsIFJCQSwgUkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAibW92IiwJCU9QUkwoMHgxMSwweDIwKSwgQkFTRSwgeyBaQSwgTElULCBSQyB9IH0sIC8qIHBzZXVkbyAqLwotICB7ICJvciIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAkvKiBhbGlhcyAqLwotICB7ICJvciIsCQlPUFJMKDB4MTEsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCS8qIGFsaWFzICovCi0gIHsgImJpcyIsCQlPUFIoMHgxMSwweDIwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJiaXMiLAkJT1BSTCgweDExLDB4MjApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92ZXEiLAkJT1BSKDB4MTEsMHgyNCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmVxIiwJCU9QUkwoMHgxMSwweDI0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdm5lIiwJCU9QUigweDExLDB4MjYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZuZSIsCQlPUFJMKDB4MTEsMHgyNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm5vdCIsCQlPUFIoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUloxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJub3QiLAkJT1BSTCgweDExLDB4MjgpLCBCQVNFLCBBUkdfT1BSTFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJvcm5vdCIsCQlPUFIoMHgxMSwweDI4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJvcm5vdCIsCQlPUFJMKDB4MTEsMHgyOCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInhvciIsCQlPUFIoMHgxMSwweDQwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ4b3IiLAkJT1BSTCgweDExLDB4NDApLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJjbW92bHQiLAkJT1BSKDB4MTEsMHg0NCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiY21vdmx0IiwJCU9QUkwoMHgxMSwweDQ0KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiY21vdmdlIiwJCU9QUigweDExLDB4NDYpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZnZSIsCQlPUFJMKDB4MTEsMHg0NiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImVxdiIsCQlPUFIoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJlcXYiLAkJT1BSTCgweDExLDB4NDgpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJ4b3Jub3QiLAkJT1BSKDB4MTEsMHg0OCksIEJBU0UsIEFSR19PUFIgfSwJLyogYWxpYXMgKi8KLSAgeyAieG9ybm90IiwJCU9QUkwoMHgxMSwweDQ4KSwgQkFTRSwgQVJHX09QUkwgfSwJLyogYWxpYXMgKi8KLSAgeyAiYW1hc2siLAkJT1BSKDB4MTEsMHg2MSksIEJBU0UsIEFSR19PUFJaMSB9LAkvKiBldjU2IGJ1dCAqLwotICB7ICJhbWFzayIsCQlPUFJMKDB4MTEsMHg2MSksIEJBU0UsIEFSR19PUFJMWjEgfSwJLyogZXY1NiBidXQgKi8KLSAgeyAiY21vdmxlIiwJCU9QUigweDExLDB4NjQpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImNtb3ZsZSIsCQlPUFJMKDB4MTEsMHg2NCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImNtb3ZndCIsCQlPUFIoMHgxMSwweDY2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJjbW92Z3QiLAkJT1BSTCgweDExLDB4NjYpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbXBsdmVyIiwJCU9QUkxfKDB4MTEsMHg2Qyl8KDMxPDwyMSl8KDE8PDEzKSwKLSAgICAJCQkweEZGRkZGRkUwLCBCQVNFLCB7IFJDIH0gfSwJCS8qIGV2NTYgYnV0ICovCi0KLSAgeyAibXNrYmwiLAkJT1BSKDB4MTIsMHgwMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrYmwiLAkJT1BSTCgweDEyLDB4MDIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRibCIsCQlPUFIoMHgxMiwweDA2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRibCIsCQlPUFJMKDB4MTIsMHgwNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2JsIiwJCU9QUigweDEyLDB4MEIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2JsIiwJCU9QUkwoMHgxMiwweDBCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrd2wiLAkJT1BSKDB4MTIsMHgxMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrd2wiLAkJT1BSTCgweDEyLDB4MTIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHR3bCIsCQlPUFIoMHgxMiwweDE2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHR3bCIsCQlPUFJMKDB4MTIsMHgxNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3dsIiwJCU9QUigweDEyLDB4MUIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3dsIiwJCU9QUkwoMHgxMiwweDFCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXNrbGwiLAkJT1BSKDB4MTIsMHgyMiksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXNrbGwiLAkJT1BSTCgweDEyLDB4MjIpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRsbCIsCQlPUFIoMHgxMiwweDI2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRsbCIsCQlPUFJMKDB4MTIsMHgyNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2xsIiwJCU9QUigweDEyLDB4MkIpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2xsIiwJCU9QUkwoMHgxMiwweDJCKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiemFwIiwJCU9QUigweDEyLDB4MzApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInphcCIsCQlPUFJMKDB4MTIsMHgzMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInphcG5vdCIsCQlPUFIoMHgxMiwweDMxKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJ6YXBub3QiLAkJT1BSTCgweDEyLDB4MzEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2txbCIsCQlPUFIoMHgxMiwweDMyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2txbCIsCQlPUFJMKDB4MTIsMHgzMiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNybCIsCQlPUFIoMHgxMiwweDM0KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzcmwiLAkJT1BSTCgweDEyLDB4MzQpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJleHRxbCIsCQlPUFIoMHgxMiwweDM2KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJleHRxbCIsCQlPUFJMKDB4MTIsMHgzNiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNsbCIsCQlPUFIoMHgxMiwweDM5KSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzbGwiLAkJT1BSTCgweDEyLDB4MzkpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJpbnNxbCIsCQlPUFIoMHgxMiwweDNCKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJpbnNxbCIsCQlPUFJMKDB4MTIsMHgzQiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInNyYSIsCQlPUFIoMHgxMiwweDNDKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJzcmEiLAkJT1BSTCgweDEyLDB4M0MpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2t3aCIsCQlPUFIoMHgxMiwweDUyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2t3aCIsCQlPUFJMKDB4MTIsMHg1MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3doIiwJCU9QUigweDEyLDB4NTcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3doIiwJCU9QUkwoMHgxMiwweDU3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0d2giLAkJT1BSKDB4MTIsMHg1QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0d2giLAkJT1BSTCgweDEyLDB4NUEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2tsaCIsCQlPUFIoMHgxMiwweDYyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2tsaCIsCQlPUFJMKDB4MTIsMHg2MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc2xoIiwJCU9QUigweDEyLDB4NjcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc2xoIiwJCU9QUkwoMHgxMiwweDY3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0bGgiLAkJT1BSKDB4MTIsMHg2QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0bGgiLAkJT1BSTCgweDEyLDB4NkEpLCBCQVNFLCBBUkdfT1BSTCB9LAotICB7ICJtc2txaCIsCQlPUFIoMHgxMiwweDcyKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtc2txaCIsCQlPUFJMKDB4MTIsMHg3MiksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgImluc3FoIiwJCU9QUigweDEyLDB4NzcpLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgImluc3FoIiwJCU9QUkwoMHgxMiwweDc3KSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAiZXh0cWgiLAkJT1BSKDB4MTIsMHg3QSksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAiZXh0cWgiLAkJT1BSTCgweDEyLDB4N0EpLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgIm11bGwiLAkJT1BSKDB4MTMsMHgwMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVsbCIsCQlPUFJMKDB4MTMsMHgwMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bHEiLAkJT1BSKDB4MTMsMHgyMCksIEJBU0UsIEFSR19PUFIgfSwKLSAgeyAibXVscSIsCQlPUFJMKDB4MTMsMHgyMCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgInVtdWxoIiwJCU9QUigweDEzLDB4MzApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgInVtdWxoIiwJCU9QUkwoMHgxMywweDMwKSwgQkFTRSwgQVJHX09QUkwgfSwKLSAgeyAibXVsbC92IiwJCU9QUigweDEzLDB4NDApLCBCQVNFLCBBUkdfT1BSIH0sCi0gIHsgIm11bGwvdiIsCQlPUFJMKDB4MTMsMHg0MCksIEJBU0UsIEFSR19PUFJMIH0sCi0gIHsgIm11bHEvdiIsCQlPUFIoMHgxMywweDYwKSwgQkFTRSwgQVJHX09QUiB9LAotICB7ICJtdWxxL3YiLAkJT1BSTCgweDEzLDB4NjApLCBCQVNFLCBBUkdfT1BSTCB9LAotCi0gIHsgIml0b2ZzIiwJCUZQKDB4MTQsMHgwMDQpLCBDSVgsIHsgUkEsIFpCLCBGQyB9IH0sCi0gIHsgInNxcnRmL2MiLAkJRlAoMHgxNCwweDAwQSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvYyIsCQlGUCgweDE0LDB4MDBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJpdG9mZiIsCQlGUCgweDE0LDB4MDE0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJpdG9mdCIsCQlGUCgweDE0LDB4MDI0KSwgQ0lYLCB7IFJBLCBaQiwgRkMgfSB9LAotICB7ICJzcXJ0Zy9jIiwJCUZQKDB4MTQsMHgwMkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L2MiLAkJRlAoMHgxNCwweDAyQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvbSIsCQlGUCgweDE0LDB4MDRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9tIiwJCUZQKDB4MTQsMHgwNkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmIiwJCUZQKDB4MTQsMHgwOEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzIiwJCUZQKDB4MTQsMHgwOEIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnIiwJCUZQKDB4MTQsMHgwQUEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0IiwJCUZQKDB4MTQsMHgwQUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL2QiLAkJRlAoMHgxNCwweDBDQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvZCIsCQlGUCgweDE0LDB4MEVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi91YyIsCQlGUCgweDE0LDB4MTBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91YyIsCQlGUCgweDE0LDB4MTBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy91YyIsCQlGUCgweDE0LDB4MTJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91YyIsCQlGUCgweDE0LDB4MTJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy91bSIsCQlGUCgweDE0LDB4MTRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91bSIsCQlGUCgweDE0LDB4MTZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi91IiwJCUZQKDB4MTQsMHgxOEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3UiLAkJRlAoMHgxNCwweDE4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvdSIsCQlGUCgweDE0LDB4MUFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC91IiwJCUZQKDB4MTQsMHgxQUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3VkIiwJCUZQKDB4MTQsMHgxQ0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3VkIiwJCUZQKDB4MTQsMHgxRUIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3NjIiwJCUZQKDB4MTQsMHg0MEEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRnL3NjIiwJCUZQKDB4MTQsMHg0MkEpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRmL3MiLAkJRlAoMHgxNCwweDQ4QSksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydGcvcyIsCQlGUCgweDE0LDB4NEFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zdWMiLAlGUCgweDE0LDB4NTBBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWMiLAlGUCgweDE0LDB4NTBCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zdWMiLAlGUCgweDE0LDB4NTJBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWMiLAlGUCgweDE0LDB4NTJCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdW0iLAlGUCgweDE0LDB4NTRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdW0iLAlGUCgweDE0LDB4NTZCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zi9zdSIsCQlGUCgweDE0LDB4NThBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdSIsCQlGUCgweDE0LDB4NThCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0Zy9zdSIsCQlGUCgweDE0LDB4NUFBKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdSIsCQlGUCgweDE0LDB4NUFCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWQiLAlGUCgweDE0LDB4NUNCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWQiLAlGUCgweDE0LDB4NUVCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0cy9zdWljIiwJRlAoMHgxNCwweDcwQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpYyIsCUZQKDB4MTQsMHg3MkIpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnRzL3N1aW0iLAlGUCgweDE0LDB4NzRCKSwgQ0lYLCBBUkdfRlBaMSB9LAotICB7ICJzcXJ0dC9zdWltIiwJRlAoMHgxNCwweDc2QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpIiwJRlAoMHgxNCwweDc4QiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHQvc3VpIiwJRlAoMHgxNCwweDdBQiksIENJWCwgQVJHX0ZQWjEgfSwKLSAgeyAic3FydHMvc3VpZCIsCUZQKDB4MTQsMHg3Q0IpLCBDSVgsIEFSR19GUFoxIH0sCi0gIHsgInNxcnR0L3N1aWQiLAlGUCgweDE0LDB4N0VCKSwgQ0lYLCBBUkdfRlBaMSB9LAotCi0gIHsgImFkZGYvYyIsCQlGUCgweDE1LDB4MDAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvYyIsCQlGUCgweDE1LDB4MDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvYyIsCQlGUCgweDE1LDB4MDAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvYyIsCQlGUCgweDE1LDB4MDAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL2MiLAkJRlAoMHgxNSwweDAxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvYyIsCQlGUCgweDE1LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmcvYyIsCQlGUCgweDE1LDB4MDIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGcvYyIsCQlGUCgweDE1LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvYyIsCQlGUCgweDE1LDB4MDIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL2MiLAkJRlAoMHgxNSwweDAyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkL2MiLAkJRlAoMHgxNSwweDAyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL2MiLAkJRlAoMHgxNSwweDAyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFmL2MiLAkJRlAoMHgxNSwweDAzQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFnL2MiLAkJRlAoMHgxNSwweDAzRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYiLAkJRlAoMHgxNSwweDA4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdmIiwJCUZQKDB4MTUsMHgwODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZiIsCQlGUCgweDE1LDB4MDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYiLAkJRlAoMHgxNSwweDA4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmIiwJCUZQKDB4MTUsMHgwODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGciLAkJRlAoMHgxNSwweDA5RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGciLAkJRlAoMHgxNSwweDBBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdnIiwJCUZQKDB4MTUsMHgwQTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3ViZyIsCQlGUCgweDE1LDB4MEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGciLAkJRlAoMHgxNSwweDBBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnIiwJCUZQKDB4MTUsMHgwQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2VxIiwJCUZQKDB4MTUsMHgwQTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2x0IiwJCUZQKDB4MTUsMHgwQTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2xlIiwJCUZQKDB4MTUsMHgwQTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0Z2YiLAkJRlAoMHgxNSwweDBBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdkIiwJCUZQKDB4MTUsMHgwQUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncSIsCQlGUCgweDE1LDB4MEFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWYiLAkJRlAoMHgxNSwweDBCQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFnIiwJCUZQKDB4MTUsMHgwQkUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3VjIiwJCUZQKDB4MTUsMHgxMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi91YyIsCQlGUCgweDE1LDB4MTAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvdWMiLAkJRlAoMHgxNSwweDEwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3VjIiwJCUZQKDB4MTUsMHgxMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvdWMiLAkJRlAoMHgxNSwweDExRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvdWMiLAkJRlAoMHgxNSwweDEyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3VjIiwJCUZQKDB4MTUsMHgxMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy91YyIsCQlGUCgweDE1LDB4MTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvdWMiLAkJRlAoMHgxNSwweDEyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi91YyIsCQlGUCgweDE1LDB4MTJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2QvdWMiLAkJRlAoMHgxNSwweDEyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3ZjIiwJCUZQKDB4MTUsMHgxMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3UiLAkJRlAoMHgxNSwweDE4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3UiLAkJRlAoMHgxNSwweDE4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3UiLAkJRlAoMHgxNSwweDE4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3UiLAkJRlAoMHgxNSwweDE4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy91IiwJCUZQKDB4MTUsMHgxOUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3UiLAkJRlAoMHgxNSwweDFBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3UiLAkJRlAoMHgxNSwweDFBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3UiLAkJRlAoMHgxNSwweDFBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3UiLAkJRlAoMHgxNSwweDFBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi91IiwJCUZQKDB4MTUsMHgxQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC91IiwJCUZQKDB4MTUsMHgxQUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS92IiwJCUZQKDB4MTUsMHgxQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3NjIiwJCUZQKDB4MTUsMHg0MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3ViZi9zYyIsCQlGUCgweDE1LDB4NDAxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bGYvc2MiLAkJRlAoMHgxNSwweDQwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3NjIiwJCUZQKDB4MTUsMHg0MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0ZGcvc2MiLAkJRlAoMHgxNSwweDQxRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGcvc2MiLAkJRlAoMHgxNSwweDQyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJnL3NjIiwJCUZQKDB4MTUsMHg0MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zYyIsCQlGUCgweDE1LDB4NDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmcvc2MiLAkJRlAoMHgxNSwweDQyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zYyIsCQlGUCgweDE1LDB4NDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z2Qvc2MiLAkJRlAoMHgxNSwweDQyRCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dGdxL3NjIiwJCUZQKDB4MTUsMHg0MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3MiLAkJRlAoMHgxNSwweDQ4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdmL3MiLAkJRlAoMHgxNSwweDQ4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJmL3MiLAkJRlAoMHgxNSwweDQ4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxmL3MiLAkJRlAoMHgxNSwweDQ4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3MiLAkJRlAoMHgxNSwweDQ4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zIiwJCUZQKDB4MTUsMHg0OUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3MiLAkJRlAoMHgxNSwweDRBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWdnL3MiLAkJRlAoMHgxNSwweDRBMSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJnL3MiLAkJRlAoMHgxNSwweDRBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3MiLAkJRlAoMHgxNSwweDRBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3MiLAkJRlAoMHgxNSwweDRBMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXBnZXEvcyIsCQlGUCgweDE1LDB4NEE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcGdsdC9zIiwJCUZQKDB4MTUsMHg0QTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wZ2xlL3MiLAkJRlAoMHgxNSwweDRBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRnZi9zIiwJCUZQKDB4MTUsMHg0QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zIiwJCUZQKDB4MTUsMHg0QUQpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRncS9zIiwJCUZQKDB4MTUsMHg0QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRmL3N1YyIsCQlGUCgweDE1LDB4NTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YmYvc3VjIiwJCUZQKDB4MTUsMHg1MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zdWMiLAkJRlAoMHgxNSwweDUwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZmL3N1YyIsCQlGUCgweDE1LDB4NTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGRnL3N1YyIsCUZQKDB4MTUsMHg1MUUpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRnL3N1YyIsCQlGUCgweDE1LDB4NTIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc3VjIiwJCUZQKDB4MTUsMHg1MjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZy9zdWMiLAkJRlAoMHgxNSwweDUyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZnL3N1YyIsCQlGUCgweDE1LDB4NTIzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3N1YyIsCUZQKDB4MTUsMHg1MkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zdWMiLAlGUCgweDE1LDB4NTJEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc3ZjIiwJRlAoMHgxNSwweDUyRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZGYvc3UiLAkJRlAoMHgxNSwweDU4MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJmL3N1IiwJCUZQKDB4MTUsMHg1ODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsZi9zdSIsCQlGUCgweDE1LDB4NTgyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdmYvc3UiLAkJRlAoMHgxNSwweDU4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRkZy9zdSIsCQlGUCgweDE1LDB4NTlFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkZy9zdSIsCQlGUCgweDE1LDB4NUEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1Ymcvc3UiLAkJRlAoMHgxNSwweDVBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxnL3N1IiwJCUZQKDB4MTUsMHg1QTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2Zy9zdSIsCQlGUCgweDE1LDB4NUEzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dGdmL3N1IiwJCUZQKDB4MTUsMHg1QUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRnZC9zdSIsCQlGUCgweDE1LDB4NUFEKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0Z3Evc3YiLAkJRlAoMHgxNSwweDVBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAiYWRkcy9jIiwJCUZQKDB4MTYsMHgwMDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9jIiwJCUZQKDB4MTYsMHgwMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9jIiwJCUZQKDB4MTYsMHgwMDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9jIiwJCUZQKDB4MTYsMHgwMDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9jIiwJCUZQKDB4MTYsMHgwMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9jIiwJCUZQKDB4MTYsMHgwMjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9jIiwJCUZQKDB4MTYsMHgwMjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9jIiwJCUZQKDB4MTYsMHgwMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvYyIsCQlGUCgweDE2LDB4MDJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvYyIsCQlGUCgweDE2LDB4MDJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvYyIsCQlGUCgweDE2LDB4MDNDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvYyIsCQlGUCgweDE2LDB4MDNFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy9tIiwJCUZQKDB4MTYsMHgwNDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9tIiwJCUZQKDB4MTYsMHgwNDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9tIiwJCUZQKDB4MTYsMHgwNDIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9tIiwJCUZQKDB4MTYsMHgwNDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9tIiwJCUZQKDB4MTYsMHgwNjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9tIiwJCUZQKDB4MTYsMHgwNjEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC9tIiwJCUZQKDB4MTYsMHgwNjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9tIiwJCUZQKDB4MTYsMHgwNjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvbSIsCQlGUCgweDE2LDB4MDZDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvbSIsCQlGUCgweDE2LDB4MDZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvbSIsCQlGUCgweDE2LDB4MDdDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvbSIsCQlGUCgweDE2LDB4MDdFKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcyIsCQlGUCgweDE2LDB4MDgwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3MiLCAJCUZQKDB4MTYsMHgwODEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VicyIsCQlGUCgweDE2LDB4MDgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMiLAkJRlAoMHgxNiwweDA4MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzIiwJCUZQKDB4MTYsMHgwODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdCIsCQlGUCgweDE2LDB4MEEwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3QiLCAJCUZQKDB4MTYsMHgwQTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidCIsCQlGUCgweDE2LDB4MEExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQiLAkJRlAoMHgxNiwweDBBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0IiwJCUZQKDB4MTYsMHgwQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdHVuIiwJCUZQKDB4MTYsMHgwQTQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGVxIiwJCUZQKDB4MTYsMHgwQTUpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGx0IiwJCUZQKDB4MTYsMHgwQTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGxlIiwJCUZQKDB4MTYsMHgwQTcpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMiLAkJRlAoMHgxNiwweDBBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxIiwJCUZQKDB4MTYsMHgwQUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcyIsCQlGUCgweDE2LDB4MEJDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQiLAkJRlAoMHgxNiwweDBCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvZCIsCQlGUCgweDE2LDB4MEMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvZCIsCQlGUCgweDE2LDB4MEMxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvZCIsCQlGUCgweDE2LDB4MEMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvZCIsCQlGUCgweDE2LDB4MEMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvZCIsCQlGUCgweDE2LDB4MEUwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvZCIsCQlGUCgweDE2LDB4MEUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvZCIsCQlGUCgweDE2LDB4MEUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvZCIsCQlGUCgweDE2LDB4MEUzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL2QiLAkJRlAoMHgxNiwweDBFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL2QiLAkJRlAoMHgxNiwweDBFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHFzL2QiLAkJRlAoMHgxNiwweDBGQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHF0L2QiLAkJRlAoMHgxNiwweDBGRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvdWMiLAkJRlAoMHgxNiwweDEwMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJzL3VjIiwJCUZQKDB4MTYsMHgxMDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91YyIsCQlGUCgweDE2LDB4MTAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvdWMiLAkJRlAoMHgxNiwweDEwMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3VjIiwJCUZQKDB4MTYsMHgxMjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91YyIsCQlGUCgweDE2LDB4MTIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvdWMiLAkJRlAoMHgxNiwweDEyMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3VjIiwJCUZQKDB4MTYsMHgxMjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdWMiLAkJRlAoMHgxNiwweDEyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3ZjIiwJCUZQKDB4MTYsMHgxMkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3VtIiwJCUZQKDB4MTYsMHgxNDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91bSIsCQlGUCgweDE2LDB4MTQxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvdW0iLAkJRlAoMHgxNiwweDE0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3VtIiwJCUZQKDB4MTYsMHgxNDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91bSIsCQlGUCgweDE2LDB4MTYwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnQvdW0iLAkJRlAoMHgxNiwweDE2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3VtIiwJCUZQKDB4MTYsMHgxNjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91bSIsCQlGUCgweDE2LDB4MTYzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImN2dHRzL3VtIiwJCUZQKDB4MTYsMHgxNkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnR0cS92bSIsCQlGUCgweDE2LDB4MTZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91IiwJCUZQKDB4MTYsMHgxODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy91IiwJCUZQKDB4MTYsMHgxODEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy91IiwJCUZQKDB4MTYsMHgxODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91IiwJCUZQKDB4MTYsMHgxODMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC91IiwJCUZQKDB4MTYsMHgxQTApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC91IiwJCUZQKDB4MTYsMHgxQTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91IiwJCUZQKDB4MTYsMHgxQTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC91IiwJCUZQKDB4MTYsMHgxQTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvdSIsCQlGUCgweDE2LDB4MUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdiIsCQlGUCgweDE2LDB4MUFGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiYWRkcy91ZCIsCQlGUCgweDE2LDB4MUMwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvdWQiLAkJRlAoMHgxNiwweDFDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3VkIiwJCUZQKDB4MTYsMHgxQzIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy91ZCIsCQlGUCgweDE2LDB4MUMzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvdWQiLAkJRlAoMHgxNiwweDFFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3VkIiwJCUZQKDB4MTYsMHgxRTEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVsdC91ZCIsCQlGUCgweDE2LDB4MUUyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvdWQiLAkJRlAoMHgxNiwweDFFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy91ZCIsCQlGUCgweDE2LDB4MUVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvdmQiLAkJRlAoMHgxNiwweDFFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHN0IiwJCUZQKDB4MTYsMHgyQUMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1YyIsCQlGUCgweDE2LDB4NTAwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VjIiwJCUZQKDB4MTYsMHg1MDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdWMiLAkJRlAoMHgxNiwweDUwMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1YyIsCQlGUCgweDE2LDB4NTAzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VjIiwJCUZQKDB4MTYsMHg1MjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdWMiLAkJRlAoMHgxNiwweDUyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1YyIsCQlGUCgweDE2LDB4NTIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VjIiwJCUZQKDB4MTYsMHg1MjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VjIiwJRlAoMHgxNiwweDUyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2YyIsCUZQKDB4MTYsMHg1MkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1bSIsCQlGUCgweDE2LDB4NTQwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgInN1YnMvc3VtIiwJCUZQKDB4MTYsMHg1NDEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibXVscy9zdW0iLAkJRlAoMHgxNiwweDU0MiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZzL3N1bSIsCQlGUCgweDE2LDB4NTQzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3VtIiwJCUZQKDB4MTYsMHg1NjApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3VidC9zdW0iLAkJRlAoMHgxNiwweDU2MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1bSIsCQlGUCgweDE2LDB4NTYyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VtIiwJCUZQKDB4MTYsMHg1NjMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VtIiwJRlAoMHgxNiwweDU2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2bSIsCUZQKDB4MTYsMHg1NkYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJhZGRzL3N1IiwJCUZQKDB4MTYsMHg1ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncy9zdSIsCQlGUCgweDE2LDB4NTgxKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgInN1YnMvc3UiLAkJRlAoMHgxNiwweDU4MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1IiwJCUZQKDB4MTYsMHg1ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdSIsCQlGUCgweDE2LDB4NTgzKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImFkZHQvc3UiLAkJRlAoMHgxNiwweDVBMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJuZWd0L3N1IiwJCUZQKDB4MTYsMHg1QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidC9zdSIsCQlGUCgweDE2LDB4NUExKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3UiLAkJRlAoMHgxNiwweDVBMiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJkaXZ0L3N1IiwJCUZQKDB4MTYsMHg1QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdHVuL3N1IiwJRlAoMHgxNiwweDVBNCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjbXB0ZXEvc3UiLAlGUCgweDE2LDB4NUE1KSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImNtcHRsdC9zdSIsCUZQKDB4MTYsMHg1QTYpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY21wdGxlL3N1IiwJRlAoMHgxNiwweDVBNyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdSIsCQlGUCgweDE2LDB4NUFDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3YiLAkJRlAoMHgxNiwweDVBRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VkIiwJCUZQKDB4MTYsMHg1QzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWQiLAkJRlAoMHgxNiwweDVDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1ZCIsCQlGUCgweDE2LDB4NUMyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VkIiwJCUZQKDB4MTYsMHg1QzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWQiLAkJRlAoMHgxNiwweDVFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1ZCIsCQlGUCgweDE2LDB4NUUxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VkIiwJCUZQKDB4MTYsMHg1RTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWQiLAkJRlAoMHgxNiwweDVFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWQiLAlGUCgweDE2LDB4NUVDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0dHEvc3ZkIiwJRlAoMHgxNiwweDVFRiksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHN0L3MiLAkJRlAoMHgxNiwweDZBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpYyIsCUZQKDB4MTYsMHg3MDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWljIiwJRlAoMHgxNiwweDcwMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aWMiLAlGUCgweDE2LDB4NzAyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpYyIsCUZQKDB4MTYsMHg3MDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWljIiwJRlAoMHgxNiwweDcyMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aWMiLAlGUCgweDE2LDB4NzIxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpYyIsCUZQKDB4MTYsMHg3MjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWljIiwJRlAoMHgxNiwweDcyMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWljIiwJRlAoMHgxNiwweDcyQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aWMiLAlGUCgweDE2LDB4NzJGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpYyIsCUZQKDB4MTYsMHg3M0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWljIiwJRlAoMHgxNiwweDczRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpbSIsCUZQKDB4MTYsMHg3NDApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWltIiwJRlAoMHgxNiwweDc0MSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aW0iLAlGUCgweDE2LDB4NzQyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpbSIsCUZQKDB4MTYsMHg3NDMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWltIiwJRlAoMHgxNiwweDc2MCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aW0iLAlGUCgweDE2LDB4NzYxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpbSIsCUZQKDB4MTYsMHg3NjIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWltIiwJRlAoMHgxNiwweDc2MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWltIiwJRlAoMHgxNiwweDc2QyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aW0iLAlGUCgweDE2LDB4NzZGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpbSIsCUZQKDB4MTYsMHg3N0MpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWltIiwJRlAoMHgxNiwweDc3RSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpIiwJCUZQKDB4MTYsMHg3ODApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAibmVncy9zdWkiLCAJRlAoMHgxNiwweDc4MSksIEJBU0UsIEFSR19GUFoxIH0sCS8qIHBzZXVkbyAqLwotICB7ICJzdWJzL3N1aSIsCQlGUCgweDE2LDB4NzgxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHMvc3VpIiwJCUZQKDB4MTYsMHg3ODIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2cy9zdWkiLAkJRlAoMHgxNiwweDc4MyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJhZGR0L3N1aSIsCQlGUCgweDE2LDB4N0EwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm5lZ3Qvc3VpIiwgCUZQKDB4MTYsMHg3QTEpLCBCQVNFLCBBUkdfRlBaMSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAic3VidC9zdWkiLAkJRlAoMHgxNiwweDdBMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWx0L3N1aSIsCQlGUCgweDE2LDB4N0EyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnQvc3VpIiwJCUZQKDB4MTYsMHg3QTMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiY3Z0dHMvc3VpIiwJRlAoMHgxNiwweDdBQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aSIsCUZQKDB4MTYsMHg3QUYpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxcy9zdWkiLAlGUCgweDE2LDB4N0JDKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXQvc3VpIiwJRlAoMHgxNiwweDdCRSksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImFkZHMvc3VpZCIsCUZQKDB4MTYsMHg3QzApLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAic3Vicy9zdWlkIiwJRlAoMHgxNiwweDdDMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJtdWxzL3N1aWQiLAlGUCgweDE2LDB4N0MyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImRpdnMvc3VpZCIsCUZQKDB4MTYsMHg3QzMpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiYWRkdC9zdWlkIiwJRlAoMHgxNiwweDdFMCksIEJBU0UsIEFSR19GUCB9LAotICB7ICJzdWJ0L3N1aWQiLAlGUCgweDE2LDB4N0UxKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm11bHQvc3VpZCIsCUZQKDB4MTYsMHg3RTIpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZGl2dC9zdWlkIiwJRlAoMHgxNiwweDdFMyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnR0cy9zdWlkIiwJRlAoMHgxNiwweDdFQyksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImN2dHRxL3N2aWQiLAlGUCgweDE2LDB4N0VGKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cXMvc3VpZCIsCUZQKDB4MTYsMHg3RkMpLCBCQVNFLCBBUkdfRlBaMSB9LAotICB7ICJjdnRxdC9zdWlkIiwJRlAoMHgxNiwweDdGRSksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAiY3Z0bHEiLAkJRlAoMHgxNywweDAxMCksIEJBU0UsIEFSR19GUFoxIH0sCi0gIHsgImZub3AiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgWkEsIFpCLCBaQyB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJmY2xyIiwJCUZQKDB4MTcsMHgwMjApLCBCQVNFLCB7IFpBLCBaQiwgRkMgfSB9LAkvKiBwc2V1ZG8gKi8KLSAgeyAiZmFicyIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgQVJHX0ZQWjEgfSwJLyogcHNldWRvICovCi0gIHsgImZtb3YiLAkJRlAoMHgxNywweDAyMCksIEJBU0UsIHsgRkEsIFJCQSwgRkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY3B5cyIsCQlGUCgweDE3LDB4MDIwKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZuZWciLAkJRlAoMHgxNywweDAyMSksIEJBU0UsIHsgRkEsIFJCQSwgRkMgfSB9LCAvKiBwc2V1ZG8gKi8KLSAgeyAiY3B5c24iLAkJRlAoMHgxNywweDAyMSksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjcHlzZSIsCQlGUCgweDE3LDB4MDIyKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgIm10X2ZwY3IiLAkJRlAoMHgxNywweDAyNCksIEJBU0UsIHsgRkEsIFJCQSwgUkNBIH0gfSwKLSAgeyAibWZfZnBjciIsCQlGUCgweDE3LDB4MDI1KSwgQkFTRSwgeyBGQSwgUkJBLCBSQ0EgfSB9LAotICB7ICJmY21vdmVxIiwJCUZQKDB4MTcsMHgwMkEpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZuZSIsCQlGUCgweDE3LDB4MDJCKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92bHQiLAkJRlAoMHgxNywweDAyQyksIEJBU0UsIEFSR19GUCB9LAotICB7ICJmY21vdmdlIiwJCUZQKDB4MTcsMHgwMkQpLCBCQVNFLCBBUkdfRlAgfSwKLSAgeyAiZmNtb3ZsZSIsCQlGUCgweDE3LDB4MDJFKSwgQkFTRSwgQVJHX0ZQIH0sCi0gIHsgImZjbW92Z3QiLAkJRlAoMHgxNywweDAyRiksIEJBU0UsIEFSR19GUCB9LAotICB7ICJjdnRxbCIsCQlGUCgweDE3LDB4MDMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWwvdiIsCQlGUCgweDE3LDB4MTMwKSwgQkFTRSwgQVJHX0ZQWjEgfSwKLSAgeyAiY3Z0cWwvc3YiLAkJRlAoMHgxNywweDUzMCksIEJBU0UsIEFSR19GUFoxIH0sCi0KLSAgeyAidHJhcGIiLAkJTUZDKDB4MTgsMHgwMDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAiZHJhaW50IiwJCU1GQygweDE4LDB4MDAwMCksIEJBU0UsIEFSR19OT05FIH0sCS8qIGFsaWFzICovCi0gIHsgImV4Y2IiLAkJTUZDKDB4MTgsMHgwNDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAibWIiLAkJTUZDKDB4MTgsMHg0MDAwKSwgQkFTRSwgQVJHX05PTkUgfSwKLSAgeyAid21iIiwJCU1GQygweDE4LDB4NDQwMCksIEJBU0UsIEFSR19OT05FIH0sCi0gIHsgImZldGNoIiwJCU1GQygweDE4LDB4ODAwMCksIEJBU0UsIHsgUFJCIH0gfSwKLSAgeyAiZmV0Y2hfbSIsCQlNRkMoMHgxOCwweEEwMDApLCBCQVNFLCB7IFBSQiB9IH0sCi0gIHsgInJwY2MiLAkJTUZDKDB4MTgsMHhDMDAwKSwgQkFTRSwgeyBSQSB9IH0sCi0gIHsgInJjIiwJCU1GQygweDE4LDB4RTAwMCksIEJBU0UsIHsgUkEgfSB9LAotICB7ICJlY2IiLAkJTUZDKDB4MTgsMHhFODAwKSwgQkFTRSwgeyBQUkIgfSB9LAkvKiBldjU2IHVuYSAqLwotICB7ICJycyIsCQlNRkMoMHgxOCwweEYwMDApLCBCQVNFLCB7IFJBIH0gfSwKLSAgeyAid2g2NCIsCQlNRkMoMHgxOCwweEY4MDApLCBCQVNFLCB7IFBSQiB9IH0sCS8qIGV2NTYgdW5hICovCi0KLSAgeyAiaHdfbWZwciIsCQlPUFIoMHgxOSwweDAwKSwgRVY0LCB7IFJBLCBSQkEsIEVWNEVYVEhXSU5ERVggfSB9LAotICB7ICJod19tZnByIiwJCU9QKDB4MTkpLCBPUF9NQVNLLCBFVjUsIHsgUkEsIFJCQSwgRVY1SFdJTkRFWCB9IH0sCi0gIHsgImh3X21mcHIiLAkJT1AoMHgxOSksIE9QX01BU0ssIEVWNiwgeyBSQSwgWkIsIEVWNkhXSU5ERVggfSB9LAotICB7ICJod19tZnByL2kiLAlPUFIoMHgxOSwweDAxKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9hIiwJT1BSKDB4MTksMHgwMiksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvYWkiLAlPUFIoMHgxOSwweDAzKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9wIiwJT1BSKDB4MTksMHgwNCksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X21mcHIvcGkiLAlPUFIoMHgxOSwweDA1KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbWZwci9wYSIsCU9QUigweDE5LDB4MDYpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tZnByL3BhaSIsCU9QUigweDE5LDB4MDcpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJwYWwxOSIsCQlQQ0QoMHgxOSksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJqbXAiLAkJTUJSKDB4MUEsMCksIEJBU0UsIHsgUkEsIENQUkIsIEpNUEhJTlQgfSB9LAotICB7ICJqc3IiLAkJTUJSKDB4MUEsMSksIEJBU0UsIHsgUkEsIENQUkIsIEpNUEhJTlQgfSB9LAotICB7ICJyZXQiLAkJTUJSKDB4MUEsMiksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LAotICB7ICJqY3IiLAkJTUJSKDB4MUEsMyksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LCAvKiBhbGlhcyAqLwotICB7ICJqc3JfY29yb3V0aW5lIiwJTUJSKDB4MUEsMyksIEJBU0UsIHsgUkEsIENQUkIsIFJFVEhJTlQgfSB9LAotCi0gIHsgImh3X2xkbCIsCQlFVjRIV01FTSgweDFCLDB4MCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbCIsCQlFVjVIV01FTSgweDFCLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwiLAkJRVY2SFdNRU0oMHgxQiwweDgpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvYSIsCQlFVjRIV01FTSgweDFCLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9hIiwJCUVWNUhXTUVNKDB4MUIsMHgxMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hIiwJCUVWNkhXTUVNKDB4MUIsMHhDKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2FsIiwJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2FyIiwJRVY0SFdNRU0oMHgxQiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvYXYiLAlFVjVIV01FTSgweDFCLDB4MTIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3IiwJRVY1SFdNRU0oMHgxQiwweDE4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgxYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wIiwJCUVWNEhXTUVNKDB4MUIsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3AiLAkJRVY1SFdNRU0oMHgxQiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3AiLAkJRVY2SFdNRU0oMHgxQiwweDApLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvcGEiLAlFVjRIV01FTSgweDFCLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYWwiLAlFVjVIV01FTSgweDFCLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZGwvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3BhdmwiLAlFVjVIV01FTSgweDFCLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDM4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4MzkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wbCIsCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wciIsCUVWNEhXTUVNKDB4MUIsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B2IiwJRVY1SFdNRU0oMHgxQiwweDIyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC9wd2wiLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3B3dmwiLAlFVjVIV01FTSgweDFCLDB4MmIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGwvciIsCQlFVjRIV01FTSgweDFCLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkbC92IiwJCUVWNUhXTUVNKDB4MUIsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC92IiwJCUVWNkhXTUVNKDB4MUIsMHg0KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ZsIiwJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ciLAkJRVY1SFdNRU0oMHgxQiwweDA4KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsL3ciLAkJRVY2SFdNRU0oMHgxQiwweEEpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGwvd2EiLAlFVjZIV01FTSgweDFCLDB4RSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkbC93bCIsCUVWNUhXTUVNKDB4MUIsMHgwOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwYSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbC93dmwiLAlFVjVIV01FTSgweDFCLDB4MGIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbCIsCQlFVjVIV01FTSgweDFCLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hIiwJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvYXYiLAlFVjVIV01FTSgweDFCLDB4MTMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3AiLAlFVjVIV01FTSgweDFCLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wIiwJRVY2SFdNRU0oMHgxQiwweDIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZGxfbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2IpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3B3IiwJRVY1SFdNRU0oMHgxQiwweDI5KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRsX2wvdiIsCUVWNUhXTUVNKDB4MUIsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkbF9sL3ciLAlFVjVIV01FTSgweDFCLDB4MDkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZGxfbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcSIsCQlFVjRIV01FTSgweDFCLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcSIsCQlFVjVIV01FTSgweDFCLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEiLAkJRVY2SFdNRU0oMHgxQiwweDkpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvYSIsCQlFVjRIV01FTSgweDFCLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9hIiwJCUVWNUhXTUVNKDB4MUIsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hIiwJCUVWNkhXTUVNKDB4MUIsMHhEKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2FsIiwJRVY1SFdNRU0oMHgxQiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2FyIiwJRVY0SFdNRU0oMHgxQiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvYXYiLAlFVjVIV01FTSgweDFCLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXZsIiwJRVY1SFdNRU0oMHgxQiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3IiwJRVY1SFdNRU0oMHgxQiwweDFjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9sIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wIiwJCUVWNEhXTUVNKDB4MUIsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3AiLAkJRVY1SFdNRU0oMHgxQiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3AiLAkJRVY2SFdNRU0oMHgxQiwweDEpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvcGEiLAlFVjRIV01FTSgweDFCLDB4RCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYWwiLAlFVjVIV01FTSgweDFCLDB4MzUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGFyIiwJRVY0SFdNRU0oMHgxQiwweEYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZHEvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDM2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3BhdmwiLAlFVjVIV01FTSgweDFCLDB4MzcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3IiwJRVY1SFdNRU0oMHgxQiwweDNjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4M2QpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcGF3diIsCUVWNUhXTUVNKDB4MUIsMHgzZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wbCIsCUVWNUhXTUVNKDB4MUIsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wciIsCUVWNEhXTUVNKDB4MUIsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B2IiwJRVY1SFdNRU0oMHgxQiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B2bCIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wdyIsCUVWNUhXTUVNKDB4MUIsMHgyYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS9wd2wiLAlFVjVIV01FTSgweDFCLDB4MmQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3B3dmwiLAlFVjVIV01FTSgweDFCLDB4MmYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHEvciIsCQlFVjRIV01FTSgweDFCLDB4MyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkcS92IiwJCUVWNUhXTUVNKDB4MUIsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS92IiwJCUVWNkhXTUVNKDB4MUIsMHg1KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ZsIiwJRVY1SFdNRU0oMHgxQiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ciLAkJRVY1SFdNRU0oMHgxQiwweDBjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxL3ciLAkJRVY2SFdNRU0oMHgxQiwweEIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHEvd2EiLAlFVjZIV01FTSgweDFCLDB4RiksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X2xkcS93bCIsCUVWNUhXTUVNKDB4MUIsMHgwZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93diIsCUVWNUhXTUVNKDB4MUIsMHgwZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcS93dmwiLAlFVjVIV01FTSgweDFCLDB4MGYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbCIsCQlFVjVIV01FTSgweDFCLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hIiwJRVY1SFdNRU0oMHgxQiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvYXYiLAlFVjVIV01FTSgweDFCLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9hdyIsCUVWNUhXTUVNKDB4MUIsMHgxZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL2F3diIsCUVWNUhXTUVNKDB4MUIsMHgxZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3AiLAlFVjVIV01FTSgweDFCLDB4MjUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wIiwJRVY2SFdNRU0oMHgxQiwweDMpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19sZHFfbC9wYSIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3BhdiIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzZCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2YpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC9wdiIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3B3IiwJRVY1SFdNRU0oMHgxQiwweDJkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGRxX2wvdiIsCUVWNUhXTUVNKDB4MUIsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkcV9sL3ciLAlFVjVIV01FTSgweDFCLDB4MGQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZHFfbC93diIsCUVWNUhXTUVNKDB4MUIsMHgwZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkIiwJCUVWNEhXTUVNKDB4MUIsMHgwKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQiLAkJRVY1SFdNRU0oMHgxQiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYSIsCQlFVjRIV01FTSgweDFCLDB4NCksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2EiLAkJRVY1SFdNRU0oMHgxQiwweDEwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYWwiLAkJRVY1SFdNRU0oMHgxQiwweDExKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXEiLAkJRVY0SFdNRU0oMHgxQiwweDUpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hcSIsCQlFVjVIV01FTSgweDFCLDB4MTQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcWwiLAlFVjVIV01FTSgweDFCLDB4MTUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcXYiLAlFVjVIV01FTSgweDFCLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hcXZsIiwJRVY1SFdNRU0oMHgxQiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXIiLAkJRVY0SFdNRU0oMHgxQiwweDYpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9hcnEiLAlFVjRIV01FTSgweDFCLDB4NyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL2F2IiwJCUVWNUhXTUVNKDB4MUIsMHgxMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F2bCIsCUVWNUhXTUVNKDB4MUIsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3IiwJCUVWNUhXTUVNKDB4MUIsMHgxOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3bCIsCUVWNUhXTUVNKDB4MUIsMHgxOSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cSIsCUVWNUhXTUVNKDB4MUIsMHgxYyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL2F3cWwiLAlFVjVIV01FTSgweDFCLDB4MWQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3F2IiwJRVY1SFdNRU0oMHgxQiwweDFlKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvYXdxdmwiLAlFVjVIV01FTSgweDFCLDB4MWYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3YiLAlFVjVIV01FTSgweDFCLDB4MWEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9hd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDFiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvbCIsCQlFVjVIV01FTSgweDFCLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wIiwJCUVWNEhXTUVNKDB4MUIsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcCIsCQlFVjVIV01FTSgweDFCLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYSIsCQlFVjRIV01FTSgweDFCLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3BhIiwJCUVWNUhXTUVNKDB4MUIsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhbCIsCUVWNUhXTUVNKDB4MUIsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcSIsCUVWNEhXTUVNKDB4MUIsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxIiwJRVY1SFdNRU0oMHgxQiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFxbCIsCUVWNUhXTUVNKDB4MUIsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhcXYiLAlFVjVIV01FTSgweDFCLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhciIsCUVWNEhXTUVNKDB4MUIsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGFycSIsCUVWNEhXTUVNKDB4MUIsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF2IiwJRVY1SFdNRU0oMHgxQiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF2bCIsCUVWNUhXTUVNKDB4MUIsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BhdyIsCUVWNUhXTUVNKDB4MUIsMHgzOCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd2wiLAlFVjVIV01FTSgweDFCLDB4MzkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxIiwJRVY1SFdNRU0oMHgxQiwweDNjKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcGF3cWwiLAlFVjVIV01FTSgweDFCLDB4M2QpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXdxdiIsCUVWNUhXTUVNKDB4MUIsMHgzZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgzZiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3Bhd3YiLAlFVjVIV01FTSgweDFCLDB4M2EpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wYXd2bCIsCUVWNUhXTUVNKDB4MUIsMHgzYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BsIiwJCUVWNUhXTUVNKDB4MUIsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3BxIiwJCUVWNEhXTUVNKDB4MUIsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHEiLAkJRVY1SFdNRU0oMHgxQiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHFsIiwJRVY1SFdNRU0oMHgxQiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHF2IiwJRVY1SFdNRU0oMHgxQiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHF2bCIsCUVWNUhXTUVNKDB4MUIsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3ByIiwJCUVWNEhXTUVNKDB4MUIsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHJxIiwJRVY0SFdNRU0oMHgxQiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9wdiIsCQlFVjVIV01FTSgweDFCLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wdmwiLAlFVjVIV01FTSgweDFCLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wdyIsCQlFVjVIV01FTSgweDFCLDB4MjgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd2wiLAlFVjVIV01FTSgweDFCLDB4MjkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3EiLAlFVjVIV01FTSgweDFCLDB4MmMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC9wd3FsIiwJRVY1SFdNRU0oMHgxQiwweDJkKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHdxdiIsCUVWNUhXTUVNKDB4MUIsMHgyZSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3B3cXZsIiwJRVY1SFdNRU0oMHgxQiwweDJmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHd2IiwJRVY1SFdNRU0oMHgxQiwweDJhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvcHd2bCIsCUVWNUhXTUVNKDB4MUIsMHgyYiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3EiLAkJRVY0SFdNRU0oMHgxQiwweDEpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9xIiwJCUVWNUhXTUVNKDB4MUIsMHgwNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3FsIiwJCUVWNUhXTUVNKDB4MUIsMHgwNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3F2IiwJCUVWNUhXTUVNKDB4MUIsMHgwNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3F2bCIsCUVWNUhXTUVNKDB4MUIsMHgwNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X2xkL3IiLAkJRVY0SFdNRU0oMHgxQiwweDIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19sZC9ycSIsCQlFVjRIV01FTSgweDFCLDB4MyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X2xkL3YiLAkJRVY1SFdNRU0oMHgxQiwweDAyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvdmwiLAkJRVY1SFdNRU0oMHgxQiwweDAzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvdyIsCQlFVjVIV01FTSgweDFCLDB4MDgpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93bCIsCQlFVjVIV01FTSgweDFCLDB4MDkpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cSIsCQlFVjVIV01FTSgweDFCLDB4MGMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cWwiLAlFVjVIV01FTSgweDFCLDB4MGQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cXYiLAlFVjVIV01FTSgweDFCLDB4MGUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19sZC93cXZsIiwJRVY1SFdNRU0oMHgxQiwweDBmKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3YiLAkJRVY1SFdNRU0oMHgxQiwweDBhKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfbGQvd3ZsIiwJRVY1SFdNRU0oMHgxQiwweDBiKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAicGFsMWIiLAkJUENEKDB4MUIpLCBCQVNFLCBBUkdfUENEIH0sCi0KLSAgeyAic2V4dGIiLAkJT1BSKDB4MUMsIDB4MDApLCBCV1gsIEFSR19PUFJaMSB9LAotICB7ICJzZXh0dyIsCQlPUFIoMHgxQywgMHgwMSksIEJXWCwgQVJHX09QUloxIH0sCi0gIHsgImN0cG9wIiwJCU9QUigweDFDLCAweDMwKSwgQ0lYLCBBUkdfT1BSWjEgfSwKLSAgeyAicGVyciIsCQlPUFIoMHgxQywgMHgzMSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJjdGx6IiwJCU9QUigweDFDLCAweDMyKSwgQ0lYLCBBUkdfT1BSWjEgfSwKLSAgeyAiY3R0eiIsCQlPUFIoMHgxQywgMHgzMyksIENJWCwgQVJHX09QUloxIH0sCi0gIHsgInVucGtidyIsCQlPUFIoMHgxQywgMHgzNCksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgInVucGtibCIsCQlPUFIoMHgxQywgMHgzNSksIE1BWCwgQVJHX09QUloxIH0sCi0gIHsgInBrd2IiLAkJT1BSKDB4MUMsIDB4MzYpLCBNQVgsIEFSR19PUFJaMSB9LAotICB7ICJwa2xiIiwJCU9QUigweDFDLCAweDM3KSwgTUFYLCBBUkdfT1BSWjEgfSwKLSAgeyAibWluc2I4IiwgCQlPUFIoMHgxQywgMHgzOCksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW5zYjgiLCAJCU9QUkwoMHgxQywgMHgzOCksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWluc3c0IiwgCQlPUFIoMHgxQywgMHgzOSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW5zdzQiLCAJCU9QUkwoMHgxQywgMHgzOSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWludWI4IiwgCQlPUFIoMHgxQywgMHgzQSksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW51YjgiLCAJCU9QUkwoMHgxQywgMHgzQSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWludXc0IiwgCQlPUFIoMHgxQywgMHgzQiksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtaW51dzQiLCAJCU9QUkwoMHgxQywgMHgzQiksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4dWI4IiwJCU9QUigweDFDLCAweDNDKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHViOCIsCQlPUFJMKDB4MUMsIDB4M0MpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgIm1heHV3NCIsCQlPUFIoMHgxQywgMHgzRCksIE1BWCwgQVJHX09QUiB9LAotICB7ICJtYXh1dzQiLAkJT1BSTCgweDFDLCAweDNEKSwgTUFYLCBBUkdfT1BSTCB9LAotICB7ICJtYXhzYjgiLAkJT1BSKDB4MUMsIDB4M0UpLCBNQVgsIEFSR19PUFIgfSwKLSAgeyAibWF4c2I4IiwJCU9QUkwoMHgxQywgMHgzRSksIE1BWCwgQVJHX09QUkwgfSwKLSAgeyAibWF4c3c0IiwJCU9QUigweDFDLCAweDNGKSwgTUFYLCBBUkdfT1BSIH0sCi0gIHsgIm1heHN3NCIsCQlPUFJMKDB4MUMsIDB4M0YpLCBNQVgsIEFSR19PUFJMIH0sCi0gIHsgImZ0b2l0IiwJCUZQKDB4MUMsIDB4NzApLCBDSVgsIHsgRkEsIFpCLCBSQyB9IH0sCi0gIHsgImZ0b2lzIiwJCUZQKDB4MUMsIDB4NzgpLCBDSVgsIHsgRkEsIFpCLCBSQyB9IH0sCi0KLSAgeyAiaHdfbXRwciIsCQlPUFIoMHgxRCwweDAwKSwgRVY0LCB7IFJBLCBSQkEsIEVWNEVYVEhXSU5ERVggfSB9LAotICB7ICJod19tdHByIiwJCU9QKDB4MUQpLCBPUF9NQVNLLCBFVjUsIHsgUkEsIFJCQSwgRVY1SFdJTkRFWCB9IH0sCi0gIHsgImh3X210cHIiLAkJT1AoMHgxRCksIE9QX01BU0ssIEVWNiwgeyBaQSwgUkIsIEVWNkhXSU5ERVggfSB9LAotICB7ICJod19tdHByL2kiLCAJT1BSKDB4MUQsMHgwMSksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvYSIsIAlPUFIoMHgxRCwweDAyKSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9haSIsCU9QUigweDFELDB4MDMpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3AiLCAJT1BSKDB4MUQsMHgwNCksIEVWNCwgQVJHX0VWNEhXTVBSIH0sCi0gIHsgImh3X210cHIvcGkiLAlPUFIoMHgxRCwweDA1KSwgRVY0LCBBUkdfRVY0SFdNUFIgfSwKLSAgeyAiaHdfbXRwci9wYSIsCU9QUigweDFELDB4MDYpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJod19tdHByL3BhaSIsCU9QUigweDFELDB4MDcpLCBFVjQsIEFSR19FVjRIV01QUiB9LAotICB7ICJwYWwxZCIsCQlQQ0QoMHgxRCksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJod19yZWkiLAkJU1BDRCgweDFFLDB4M0ZGODAwMCksIEVWNHxFVjUsIEFSR19OT05FIH0sCi0gIHsgImh3X3JlaV9zdGFsbCIsCVNQQ0QoMHgxRSwweDNGRkMwMDApLCBFVjUsIEFSR19OT05FIH0sCi0gIHsgImh3X2ptcCIsIAkJRVY2SFdNQlIoMHgxRSwweDApLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfanNyIiwgCQlFVjZIV01CUigweDFFLDB4MiksIEVWNiwgeyBaQSwgUFJCLCBFVjZIV0pNUEhJTlQgfSB9LAotICB7ICJod19yZXQiLCAJCUVWNkhXTUJSKDB4MUUsMHg0KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19qY3IiLCAJCUVWNkhXTUJSKDB4MUUsMHg2KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19jb3JvdXRpbmUiLAlFVjZIV01CUigweDFFLDB4NiksIEVWNiwgeyBaQSwgUFJCIH0gfSwgLyogYWxpYXMgKi8KLSAgeyAiaHdfam1wL3N0YWxsIiwJRVY2SFdNQlIoMHgxRSwweDEpLCBFVjYsIHsgWkEsIFBSQiwgRVY2SFdKTVBISU5UIH0gfSwKLSAgeyAiaHdfanNyL3N0YWxsIiwgCUVWNkhXTUJSKDB4MUUsMHgzKSwgRVY2LCB7IFpBLCBQUkIsIEVWNkhXSk1QSElOVCB9IH0sCi0gIHsgImh3X3JldC9zdGFsbCIsCUVWNkhXTUJSKDB4MUUsMHg1KSwgRVY2LCB7IFpBLCBQUkIgfSB9LAotICB7ICJod19qY3Ivc3RhbGwiLCAJRVY2SFdNQlIoMHgxRSwweDcpLCBFVjYsIHsgWkEsIFBSQiB9IH0sCi0gIHsgImh3X2Nvcm91dGluZS9zdGFsbCIsIEVWNkhXTUJSKDB4MUUsMHg3KSwgRVY2LCB7IFpBLCBQUkIgfSB9LCAvKiBhbGlhcyAqLwotICB7ICJwYWwxZSIsCQlQQ0QoMHgxRSksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJod19zdGwiLAkJRVY0SFdNRU0oMHgxRiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwiLAkJRVY1SFdNRU0oMHgxRiwweDAwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsIiwJCUVWNkhXTUVNKDB4MUYsMHg0KSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwgLyogPz8/IDggKi8KLSAgeyAiaHdfc3RsL2EiLAkJRVY0SFdNRU0oMHgxRiwweDQpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdGwvYSIsCQlFVjVIV01FTSgweDFGLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvYSIsCQlFVjZIV01FTSgweDFGLDB4QyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0bC9hYyIsCUVWNUhXTUVNKDB4MUYsMHgxMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9hciIsCUVWNEhXTUVNKDB4MUYsMHg2KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2F2IiwJRVY1SFdNRU0oMHgxRiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL2F2YyIsCUVWNUhXTUVNKDB4MUYsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wIiwJCUVWNEhXTUVNKDB4MUYsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3AiLAkJRVY1SFdNRU0oMHgxRiwweDIwKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3AiLAkJRVY2SFdNRU0oMHgxRiwweDApLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdGwvcGEiLAlFVjRIV01FTSgweDFGLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wYWMiLAlFVjVIV01FTSgweDFGLDB4MzEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsL3BhdmMiLAlFVjVIV01FTSgweDFGLDB4MzMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcGMiLAlFVjVIV01FTSgweDFGLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvcHIiLAlFVjRIV01FTSgweDFGLDB4QSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC9wdiIsCUVWNUhXTUVNKDB4MUYsMHgyMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC9wdmMiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGwvciIsCQlFVjRIV01FTSgweDFGLDB4MiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0bC92IiwJCUVWNUhXTUVNKDB4MUYsMHgwMiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bC92YyIsCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jIiwJCUVWNUhXTUVNKDB4MUYsMHgwMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL2EiLAlFVjVIV01FTSgweDFGLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9hdiIsCUVWNUhXTUVNKDB4MUYsMHgxMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3AiLAlFVjVIV01FTSgweDFGLDB4MjEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdGxfYy9wIiwJRVY2SFdNRU0oMHgxRiwweDIpLCBFVjYsIEFSR19FVjZIV01FTSB9LAotICB7ICJod19zdGxfYy9wYSIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3BhdiIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0bF9jL3B2IiwJRVY1SFdNRU0oMHgxRiwweDIzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RsX2MvdiIsCUVWNUhXTUVNKDB4MUYsMHgwMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cSIsCQlFVjRIV01FTSgweDFGLDB4MSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cSIsCQlFVjVIV01FTSgweDFGLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEiLAkJRVY2SFdNRU0oMHgxRiwweDUpLCBFVjYsIEFSR19FVjZIV01FTSB9LCAvKiA/Pz8gOSAqLwotICB7ICJod19zdHEvYSIsCQlFVjRIV01FTSgweDFGLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9hIiwJCUVWNUhXTUVNKDB4MUYsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9hIiwJCUVWNkhXTUVNKDB4MUYsMHhEKSwgRVY2LCBBUkdfRVY2SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2FjIiwJRVY1SFdNRU0oMHgxRiwweDE1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2FyIiwJRVY0SFdNRU0oMHgxRiwweDcpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvYXYiLAlFVjVIV01FTSgweDFGLDB4MTYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL2MiLAkJRVY1SFdNRU0oMHgxRiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3AiLAkJRVY0SFdNRU0oMHgxRiwweDkpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdHEvcCIsCQlFVjVIV01FTSgweDFGLDB4MjQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcCIsCQlFVjZIV01FTSgweDFGLDB4MSksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYSIsCUVWNEhXTUVNKDB4MUYsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhIiwJRVY1SFdNRU0oMHgxRiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXIiLAlFVjRIV01FTSgweDFGLDB4RSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXIiLAlFVjRIV01FTSgweDFGLDB4RiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYXYiLAlFVjVIV01FTSgweDFGLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHEvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wYyIsCUVWNUhXTUVNKDB4MUYsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9wciIsCUVWNEhXTUVNKDB4MUYsMHhCKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3B2IiwJRVY1SFdNRU0oMHgxRiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3B2YyIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cS9yIiwJCUVWNEhXTUVNKDB4MUYsMHgzKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3YiLAkJRVY1SFdNRU0oMHgxRiwweDA2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxL3ZjIiwJRVY1SFdNRU0oMHgxRiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MiLAkJRVY1SFdNRU0oMHgxRiwweDA1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvYSIsCUVWNUhXTUVNKDB4MUYsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL2F2IiwJRVY1SFdNRU0oMHgxRiwweDE3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcCIsCUVWNUhXTUVNKDB4MUYsMHgyNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3AiLAlFVjZIV01FTSgweDFGLDB4MyksIEVWNiwgQVJHX0VWNkhXTUVNIH0sCi0gIHsgImh3X3N0cV9jL3BhIiwJRVY1SFdNRU0oMHgxRiwweDM1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDM3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3RxX2MvcHYiLAlFVjVIV01FTSgweDFGLDB4MjcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdHFfYy92IiwJRVY1SFdNRU0oMHgxRiwweDA3KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QiLAkJRVY0SFdNRU0oMHgxRiwweDApLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdCIsCQlFVjVIV01FTSgweDFGLDB4MDApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hIiwJCUVWNEhXTUVNKDB4MUYsMHg0KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYSIsCQlFVjVIV01FTSgweDFGLDB4MTApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hYyIsCQlFVjVIV01FTSgweDFGLDB4MTEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hcSIsCQlFVjRIV01FTSgweDFGLDB4NSksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2FxIiwJCUVWNUhXTUVNKDB4MUYsMHgxNCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxYyIsCUVWNUhXTUVNKDB4MUYsMHgxNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxdiIsCUVWNUhXTUVNKDB4MUYsMHgxNiksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L2FxdmMiLAlFVjVIV01FTSgweDFGLDB4MTcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9hciIsCQlFVjRIV01FTSgweDFGLDB4NiksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L2FycSIsCUVWNEhXTUVNKDB4MUYsMHg3KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXYiLAkJRVY1SFdNRU0oMHgxRiwweDEyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYXZjIiwJRVY1SFdNRU0oMHgxRiwweDEzKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvYyIsCQlFVjVIV01FTSgweDFGLDB4MDEpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wIiwJCUVWNEhXTUVNKDB4MUYsMHg4KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcCIsCQlFVjVIV01FTSgweDFGLDB4MjApLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYSIsCQlFVjRIV01FTSgweDFGLDB4QyksIEVWNCwgQVJHX0VWNEhXTUVNIH0sCi0gIHsgImh3X3N0L3BhIiwJCUVWNUhXTUVNKDB4MUYsMHgzMCksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhYyIsCUVWNUhXTUVNKDB4MUYsMHgzMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcSIsCUVWNEhXTUVNKDB4MUYsMHhEKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxIiwJRVY1SFdNRU0oMHgxRiwweDM0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFxYyIsCUVWNUhXTUVNKDB4MUYsMHgzNSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhcXYiLAlFVjVIV01FTSgweDFGLDB4MzYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wYXF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BhciIsCUVWNEhXTUVNKDB4MUYsMHhFKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGFycSIsCUVWNEhXTUVNKDB4MUYsMHhGKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGF2IiwJRVY1SFdNRU0oMHgxRiwweDMyKSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcGF2YyIsCUVWNUhXTUVNKDB4MUYsMHgzMyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BjIiwJCUVWNUhXTUVNKDB4MUYsMHgyMSksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3BxIiwJCUVWNEhXTUVNKDB4MUYsMHg5KSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHEiLAkJRVY1SFdNRU0oMHgxRiwweDI0KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHFjIiwJRVY1SFdNRU0oMHgxRiwweDI1KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHF2IiwJRVY1SFdNRU0oMHgxRiwweDI2KSwgRVY1LCBBUkdfRVY1SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHF2YyIsCUVWNUhXTUVNKDB4MUYsMHgyNyksIEVWNSwgQVJHX0VWNUhXTUVNIH0sCi0gIHsgImh3X3N0L3ByIiwJCUVWNEhXTUVNKDB4MUYsMHhBKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcHJxIiwJRVY0SFdNRU0oMHgxRiwweEIpLCBFVjQsIEFSR19FVjRIV01FTSB9LAotICB7ICJod19zdC9wdiIsCQlFVjVIV01FTSgweDFGLDB4MjIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9wdmMiLAlFVjVIV01FTSgweDFGLDB4MjMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xIiwJCUVWNEhXTUVNKDB4MUYsMHgxKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvcSIsCQlFVjVIV01FTSgweDFGLDB4MDQpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xYyIsCQlFVjVIV01FTSgweDFGLDB4MDUpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xdiIsCQlFVjVIV01FTSgweDFGLDB4MDYpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9xdmMiLAlFVjVIV01FTSgweDFGLDB4MDcpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC9yIiwJCUVWNEhXTUVNKDB4MUYsMHgyKSwgRVY0LCBBUkdfRVY0SFdNRU0gfSwKLSAgeyAiaHdfc3QvdiIsCQlFVjVIV01FTSgweDFGLDB4MDIpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJod19zdC92YyIsCQlFVjVIV01FTSgweDFGLDB4MDMpLCBFVjUsIEFSR19FVjVIV01FTSB9LAotICB7ICJwYWwxZiIsCQlQQ0QoMHgxRiksIEJBU0UsIEFSR19QQ0QgfSwKLQotICB7ICJsZGYiLAkJTUVNKDB4MjApLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZGciLAkJTUVNKDB4MjEpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZHMiLAkJTUVNKDB4MjIpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJsZHQiLAkJTUVNKDB4MjMpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdGYiLAkJTUVNKDB4MjQpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdGciLAkJTUVNKDB4MjUpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdHMiLAkJTUVNKDB4MjYpLCBCQVNFLCBBUkdfRk1FTSB9LAotICB7ICJzdHQiLAkJTUVNKDB4MjcpLCBCQVNFLCBBUkdfRk1FTSB9LAotCi0gIHsgImxkbCIsCQlNRU0oMHgyOCksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRxIiwJCU1FTSgweDI5KSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJsZGxfbCIsCQlNRU0oMHgyQSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAibGRxX2wiLAkJTUVNKDB4MkIpLCBCQVNFLCBBUkdfTUVNIH0sCi0gIHsgInN0bCIsCQlNRU0oMHgyQyksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RxIiwJCU1FTSgweDJEKSwgQkFTRSwgQVJHX01FTSB9LAotICB7ICJzdGxfYyIsCQlNRU0oMHgyRSksIEJBU0UsIEFSR19NRU0gfSwKLSAgeyAic3RxX2MiLAkJTUVNKDB4MkYpLCBCQVNFLCBBUkdfTUVNIH0sCi0KLSAgeyAiYnIiLAkJQlJBKDB4MzApLCBCQVNFLCB7IFpBLCBCRElTUCB9IH0sCS8qIHBzZXVkbyAqLwotICB7ICJiciIsCQlCUkEoMHgzMCksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiZmJlcSIsCQlCUkEoMHgzMSksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZibHQiLAkJQlJBKDB4MzIpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJmYmxlIiwJCUJSQSgweDMzKSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiYnNyIiwJCUJSQSgweDM0KSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJmYm5lIiwJCUJSQSgweDM1KSwgQkFTRSwgQVJHX0ZCUkEgfSwKLSAgeyAiZmJnZSIsCQlCUkEoMHgzNiksIEJBU0UsIEFSR19GQlJBIH0sCi0gIHsgImZiZ3QiLAkJQlJBKDB4MzcpLCBCQVNFLCBBUkdfRkJSQSB9LAotICB7ICJibGJjIiwJCUJSQSgweDM4KSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJiZXEiLAkJQlJBKDB4MzkpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJsdCIsCQlCUkEoMHgzQSksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmxlIiwJCUJSQSgweDNCKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibGJzIiwJCUJSQSgweDNDKSwgQkFTRSwgQVJHX0JSQSB9LAotICB7ICJibmUiLAkJQlJBKDB4M0QpLCBCQVNFLCBBUkdfQlJBIH0sCi0gIHsgImJnZSIsCQlCUkEoMHgzRSksIEJBU0UsIEFSR19CUkEgfSwKLSAgeyAiYmd0IiwJCUJSQSgweDNGKSwgQkFTRSwgQVJHX0JSQSB9LAotfTsKLQotY29uc3QgaW50IGFscGhhX251bV9vcGNvZGVzID0gc2l6ZW9mKGFscGhhX29wY29kZXMpL3NpemVvZigqYWxwaGFfb3Bjb2Rlcyk7CmRpZmYgLS1naXQgYS9vcGNvZGVzL2FyYy1kaXMuYyBiL29wY29kZXMvYXJjLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDJiMDdiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvYXJjLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIHByaW50aW5nIGNvZGUgZm9yIHRoZSBBUkMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTUsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuIAotICAgQ29udHJpYnV0ZWQgYnkgRG91ZyBFdmFucyAoZGplQGN5Z251cy5jb20pLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9hcmMuaCIKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL2FyYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi1zdGF0aWMgaW50IHByaW50X2luc25fYXJjX2Jhc2VfbGl0dGxlIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotc3RhdGljIGludCBwcmludF9pbnNuX2FyY19iYXNlX2JpZyBQQVJBTVMgKChiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludCBwcmludF9pbnNuIFBBUkFNUyAoKGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKiwgaW50LCBpbnQpKTsKLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiAoNCBvciA4IGZvciB0aGUgQVJDKS4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbiAocGMsIGluZm8sIG1hY2gsIGJpZ19wKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgbWFjaDsKLSAgICAgaW50IGJpZ19wOwotewotICBjb25zdCBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSBmdW5jID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICBpbnQgc3RhdHVzOwotICAvKiBGaXJzdCBlbGVtZW50IGlzIGluc24sIHNlY29uZCBlbGVtZW50IGlzIGxpbW0gKGlmIHByZXNlbnQpLiAgKi8KLSAgYXJjX2luc24gaW5zblsyXTsKLSAgaW50IGdvdF9saW1tX3AgPSAwOwotICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKLSAgc3RhdGljIGludCBjdXJyZW50X21hY2ggPSAwOwotCi0gIGlmICghaW5pdGlhbGl6ZWQgfHwgbWFjaCAhPSBjdXJyZW50X21hY2gpCi0gICAgewotICAgICAgaW5pdGlhbGl6ZWQgPSAxOwotICAgICAgY3VycmVudF9tYWNoID0gYXJjX2dldF9vcGNvZGVfbWFjaCAobWFjaCwgYmlnX3ApOwotICAgICAgYXJjX29wY29kZV9pbml0X3RhYmxlcyAoY3VycmVudF9tYWNoKTsKLSAgICB9Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICBpZiAoYmlnX3ApCi0gICAgaW5zblswXSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gIGVsc2UKLSAgICBpbnNuWzBdID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotICAoKmZ1bmMpIChzdHJlYW0sICIlMDhseFx0IiwgaW5zblswXSk7Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGxpc3RzIGhhc2hlZCBieSB0aGUgaW5zbiBjb2RlCi0gICAgICh0aG91Z2ggd2UgbmVlZG4ndCBjYXJlIGhvdyB0aGV5J3JlIGhhc2hlZCkuICAqLwotCi0gIG9wY29kZSA9IGFyY19vcGNvZGVfbG9va3VwX2RpcyAoaW5zblswXSk7Ci0gIGZvciAoIDsgb3Bjb2RlICE9IE5VTEw7IG9wY29kZSA9IEFSQ19PUENPREVfTkVYVF9ESVMgKG9wY29kZSkpCi0gICAgewotICAgICAgY2hhciAqc3luOwotICAgICAgaW50IG1vZHMsaW52YWxpZDsKLSAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKm9wdmFsOwotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgaWYgKChpbnNuWzBdICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPnZhbHVlKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTdXBwb3J0ZWQgYnkgdGhpcyBjcHU/ICAqLwotICAgICAgaWYgKCEgYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIE1ha2UgdHdvIHBhc3NlcyBvdmVyIHRoZSBvcGVyYW5kcy4gIEZpcnN0IHNlZSBpZiBhbnkgb2YgdGhlbQotCSBoYXZlIGV4dHJhY3Rpb24gZnVuY3Rpb25zLCBhbmQsIGlmIHRoZXkgZG8sIG1ha2Ugc3VyZSB0aGUKLQkgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotCi0gICAgICBhcmNfb3Bjb2RlX2luaXRfZXh0cmFjdCAoKTsKLSAgICAgIGludmFsaWQgPSAwOwotCi0gICAgICAvKiA/Pz8gR3JhbnRlZCwgdGhpcyBpcyBzbG93ZXIgdGhhbiB0aGUgYHBwYycgd2F5LiAgTWF5YmUgd2hlbiB0aGlzIGlzCi0JIGRvbmUgaXQnbGwgYmUgY2xlYXIgd2hhdCB0aGUgcmlnaHQgd2F5IHRvIGRvIHRoaXMgaXMuICAqLwotICAgICAgLyogSW5zdHJ1Y3Rpb25zIGxpa2UgImFkZC5mIHIwLHIxLDEiIGFyZSB0cmlja3kgYmVjYXVzZSB0aGUgIi5mIiBnZXRzCi0JIHByaW50ZWQgZmlyc3QsIGJ1dCB3ZSBkb24ndCBrbm93IGhvdyB0byBwcmludCBpdCB1bnRpbCB3ZSd2ZSBwcm9jZXNzZWQKLQkgdGhlIHJlZ3MuICBTaW5jZSB3ZSdyZSBzY2FubmluZyBhbGwgdGhlIGFyZ3MgYmVmb3JlIHByaW50aW5nIHRoZSBpbnNuCi0JIGFueXdheXMsIGl0J3MgYWN0dWFsbHkgcXVpdGUgZWFzeS4gICovCi0KLSAgICAgIGZvciAoc3luID0gb3Bjb2RlLT5zeW50YXg7ICpzeW47ICsrc3luKQotCXsKLQkgIGludCBjOwotCi0JICBpZiAoKnN5biAhPSAnJScgfHwgKisrc3luID09ICclJykKLQkgICAgY29udGludWU7Ci0JICBtb2RzID0gMDsKLQkgIGMgPSAqc3luOwotCSAgd2hpbGUgKEFSQ19NT0RfUCAoYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MpKQotCSAgICB7Ci0JICAgICAgbW9kcyB8PSBhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncyAmIEFSQ19NT0RfQklUUzsKLQkgICAgICArK3N5bjsKLQkgICAgICBjID0gKnN5bjsKLQkgICAgfQotCSAgb3BlcmFuZCA9IGFyY19vcGVyYW5kcyArIGFyY19vcGVyYW5kX21hcFtjXTsKLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICAoKm9wZXJhbmQtPmV4dHJhY3QpIChpbnNuLCBvcGVyYW5kLCBtb2RzLAotCQkJCSAoY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqKSBOVUxMLAotCQkJCSAmaW52YWxpZCk7Ci0JfQotICAgICAgaWYgKGludmFsaWQpCi0JY29udGludWU7Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbiBpcyB2YWxpZC4gICovCi0KLSAgICAgIC8qIElmIHdlIGhhdmUgYW4gaW5zbiB3aXRoIGEgbGltbSwgZmV0Y2ggaXQgbm93LiAgU2Nhbm5pbmcgdGhlIGluc25zCi0JIHR3aWNlIGxldHMgdXMgZG8gdGhpcy4gICovCi0gICAgICBpZiAoYXJjX29wY29kZV9saW1tX3AgKE5VTEwpKQotCXsKLQkgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHBjICsgNCwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgIGlmIChzdGF0dXMgIT0gMCkKLQkgICAgewotCSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgICAgICByZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGlmIChiaWdfcCkKLQkgICAgaW5zblsxXSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0JICBlbHNlCi0JICAgIGluc25bMV0gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCSAgZ290X2xpbW1fcCA9IDE7Ci0JfQotCi0gICAgICBmb3IgKHN5biA9IG9wY29kZS0+c3ludGF4OyAqc3luOyArK3N5bikKLQl7Ci0JICBpbnQgYzsKLQotCSAgaWYgKCpzeW4gIT0gJyUnIHx8ICorK3N5biA9PSAnJScpCi0JICAgIHsKLQkgICAgICAoKmZ1bmMpIChzdHJlYW0sICIlYyIsICpzeW4pOwotCSAgICAgIGNvbnRpbnVlOwotCSAgICB9Ci0KLQkgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZC4gIEZldGNoIGFueSBzcGVjaWFsIG1vZGlmaWVycy4gICovCi0JICBtb2RzID0gMDsKLQkgIGMgPSAqc3luOwotCSAgd2hpbGUgKEFSQ19NT0RfUCAoYXJjX29wZXJhbmRzW2FyY19vcGVyYW5kX21hcFtjXV0uZmxhZ3MpKQotCSAgICB7Ci0JICAgICAgbW9kcyB8PSBhcmNfb3BlcmFuZHNbYXJjX29wZXJhbmRfbWFwW2NdXS5mbGFncyAmIEFSQ19NT0RfQklUUzsKLQkgICAgICArK3N5bjsKLQkgICAgICBjID0gKnN5bjsKLQkgICAgfQotCSAgb3BlcmFuZCA9IGFyY19vcGVyYW5kcyArIGFyY19vcGVyYW5kX21hcFtjXTsKLQotCSAgLyogRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgb3B2YWwgPSBOVUxMOwotCSAgaWYgKG9wZXJhbmQtPmV4dHJhY3QpCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIG9wZXJhbmQsIG1vZHMsCi0JCQkJCSAgICZvcHZhbCwgKGludCAqKSBOVUxMKTsKLQkgICAgfQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgdmFsdWUgPSAoaW5zblswXSA+PiBvcGVyYW5kLT5zaGlmdCkgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKTsKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCQkgICYmICh2YWx1ZSAmICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpKSkKLQkJdmFsdWUgLT0gMSA8PCBvcGVyYW5kLT5iaXRzOwotCi0JICAgICAgLyogSWYgdGhpcyBpcyBhIHN1ZmZpeCBvcGVyYW5kLCBzZXQgYG9wdmFsJy4gICovCi0JICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU1VGRklYKQotCQlvcHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgdmFsdWUpOwotCSAgICB9Ci0KLQkgIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBmbGFncy4gICovCi0JICBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9GQUtFKQotCSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKD8/PyBhdCBsZWFzdCBub3QgeWV0KSAqLwotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9TVUZGSVgpCi0JICAgIHsKLQkgICAgICAvKiBEZWZhdWx0IHN1ZmZpeGVzIGFyZW4ndCBwcmludGVkLiAgRm9ydHVuYXRlbHksIHRoZXkgYWxsIGhhdmUKLQkJIHplcm8gdmFsdWVzLiAgQWxzbywgemVybyB2YWx1ZXMgZm9yIGJvb2xlYW4gc3VmZml4ZXMgYXJlCi0JCSByZXByZXNlbnRlZCBieSB0aGUgYWJzZW5jZSBvZiB0ZXh0LiAgKi8KLQotCSAgICAgIGlmICh2YWx1ZSAhPSAwKQotCQl7Ci0JCSAgLyogPz8/IE9QVkFMIHNob3VsZCBoYXZlIGEgdmFsdWUuICBJZiBpdCBkb2Vzbid0IGp1c3QgY29wZQotCQkgICAgIGFzIHdlIHdhbnQgZGlzYXNzZW1ibHkgdG8gYmUgcmVhc29uYWJseSByb2J1c3QuCi0JCSAgICAgQWxzbyByZW1lbWJlciB0aGF0IHNldmVyYWwgY29uZGl0aW9uIGNvZGUgdmFsdWVzICgxNi0zMSkKLQkJICAgICBhcmVuJ3QgZGVmaW5lZCB5ZXQuICBGb3IgdGhlc2UgY2FzZXMganVzdCBwcmludCB0aGUKLQkJICAgICBudW1iZXIgc3VpdGFibHkgZGVjb3JhdGVkLiAgKi8KLQkJICBpZiAob3B2YWwpCi0JCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlcyVzIiwKLQkJCSAgICAgbW9kcyAmIEFSQ19NT0RfRE9UID8gIi4iIDogIiIsCi0JCQkgICAgIG9wdmFsLT5uYW1lKTsKLQkJICBlbHNlCi0JCSAgICAoKmZ1bmMpIChzdHJlYW0sICIlcyVjJWQiLAotCQkJICAgICBtb2RzICYgQVJDX01PRF9ET1QgPyAiLiIgOiAiIiwKLQkJCSAgICAgb3BlcmFuZC0+Zm10LCB2YWx1ZSk7Ci0JCX0KLQkgICAgfQotCSAgZWxzZSBpZiAob3BlcmFuZC0+ZmxhZ3MgJiBBUkNfT1BFUkFORF9SRUxBVElWRV9CUkFOQ0gpCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAocGMgKyA0ICsgdmFsdWUsIGluZm8pOwotCSAgLyogPz8/IE5vdCBhbGwgY2FzZXMgb2YgdGhpcyBhcmUgY3VycmVudGx5IGNhdWdodC4gICovCi0JICBlbHNlIGlmIChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCkKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgdmFsdWUgJiAweGZmZmZmZmZmLCBpbmZvKTsKLQkgIGVsc2UgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfQUREUkVTUykKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgdmFsdWUgJiAweGZmZmZmZmZmLCBpbmZvKTsKLQkgIGVsc2UgaWYgKG9wdmFsKQotCSAgICAvKiBOb3RlIHRoYXQgdGhpcyBjYXNlIGNhdGNoZXMgYm90aCBub3JtYWwgYW5kIGF1eGlsaWFyeSByZWdzLiAgKi8KLQkgICAgKCpmdW5jKSAoc3RyZWFtLCAiJXMiLCBvcHZhbC0+bmFtZSk7Ci0JICBlbHNlCi0JICAgICgqZnVuYykgKHN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5kIHByaW50ZWQgYW4gaW5zdHJ1Y3Rpb247IHJldHVybi4gICovCi0gICAgICByZXR1cm4gZ290X2xpbW1fcCA/IDggOiA0OwotICAgIH0KLQotICAoKmZ1bmMpIChzdHJlYW0sIF8oIip1bmtub3duKiIpKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLS8qIEdpdmVuIE1BQ0gsIG9uZSBvZiBiZmRfbWFjaF9hcmNfeHh4LCByZXR1cm4gdGhlIHByaW50X2luc24gZnVuY3Rpb24gdG8gdXNlLgotICAgVGhpcyBkb2VzIHRoaW5ncyBhIG5vbi1zdGFuZGFyZCB3YXkgKHRoZSAic3RhbmRhcmQiIHdheSB3b3VsZCBiZSB0byBjb3B5Ci0gICB0aGlzIGNvZGUgaW50byBkaXNhc3NlbWJsZS5jKS4gIFNpbmNlIHRoZXJlIGFyZSBtb3JlIHRoYW4gYSBjb3VwbGUgb2YKLSAgIHZhcmlhbnRzLCBoaWRpbmcgYWxsIHRoaXMgY3J1ZCBoZXJlIHNlZW1zIGNsZWFuZXIuICAqLwotCi1kaXNhc3NlbWJsZXJfZnR5cGUKLWFyY19nZXRfZGlzYXNzZW1ibGVyIChtYWNoLCBiaWdfcCkKLSAgICAgaW50IG1hY2g7Ci0gICAgIGludCBiaWdfcDsKLXsKLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICBjYXNlIGJmZF9tYWNoX2FyY19iYXNlOgotICAgICAgcmV0dXJuIGJpZ19wID8gcHJpbnRfaW5zbl9hcmNfYmFzZV9iaWcgOiBwcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZTsKLSAgICB9Ci0gIHJldHVybiBwcmludF9pbnNuX2FyY19iYXNlX2xpdHRsZTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmNfYmFzZV9saXR0bGUgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbiAocGMsIGluZm8sIGJmZF9tYWNoX2FyY19iYXNlLCAwKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmNfYmFzZV9iaWcgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbiAocGMsIGluZm8sIGJmZF9tYWNoX2FyY19iYXNlLCAxKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJjLW9wYy5jIGIvb3Bjb2Rlcy9hcmMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmOGY2ODkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcmMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMxICswLDAgQEAKLS8qIE9wY29kZSB0YWJsZSBmb3IgdGhlIEFSQy4KLSAgIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERvdWcgRXZhbnMgKGRqZUBjeWdudXMuY29tKS4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvYXJjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMIDAKLSNlbmRpZgotCi0jZGVmaW5lIElOU0VSVF9GTihmbikgXAotc3RhdGljIGFyY19pbnNuIGZuIFBBUkFNUyAoKGFyY19pbnNuLCBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKiwgXAotCQkJICAgIGludCwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICosIGxvbmcsIFwKLQkJCSAgICBjb25zdCBjaGFyICoqKSkKLSNkZWZpbmUgRVhUUkFDVF9GTihmbikgXAotc3RhdGljIGxvbmcgZm4gUEFSQU1TICgoYXJjX2luc24gKiwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICosIFwKLQkJCWludCwgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoqLCBpbnQgKikpCi0KLUlOU0VSVF9GTiAoaW5zZXJ0X3JlZyk7Ci1JTlNFUlRfRk4gKGluc2VydF9zaGltbWZpbmlzaCk7Ci1JTlNFUlRfRk4gKGluc2VydF9saW1tZmluaXNoKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1tb2Zmc2V0KTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3NoaW1temVybyk7Ci1JTlNFUlRfRk4gKGluc2VydF9mbGFnKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X2ZsYWdmaW5pc2gpOwotSU5TRVJUX0ZOIChpbnNlcnRfY29uZCk7Ci1JTlNFUlRfRk4gKGluc2VydF9mb3JjZWxpbW0pOwotSU5TRVJUX0ZOIChpbnNlcnRfcmVsYWRkcik7Ci1JTlNFUlRfRk4gKGluc2VydF9hYnNhZGRyKTsKLUlOU0VSVF9GTiAoaW5zZXJ0X3Vub3BtYWNybyk7Ci0KLUVYVFJBQ1RfRk4gKGV4dHJhY3RfcmVnKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfZmxhZyk7Ci1FWFRSQUNUX0ZOIChleHRyYWN0X2NvbmQpOwotRVhUUkFDVF9GTiAoZXh0cmFjdF9yZWxhZGRyKTsKLUVYVFJBQ1RfRk4gKGV4dHJhY3RfdW5vcG1hY3JvKTsKLQotLyogVmFyaW91cyB0eXBlcyBvZiBBUkMgb3BlcmFuZHMsIGluY2x1ZGluZyBpbnNuIHN1ZmZpeGVzLiAgKi8KLQotLyogSW5zbiBmb3JtYXQgdmFsdWVzOgotCi0gICAnYScJUkVHQQkJcmVnaXN0ZXIgQSBmaWVsZAotICAgJ2InCVJFR0IJCXJlZ2lzdGVyIEIgZmllbGQKLSAgICdjJwlSRUdDCQlyZWdpc3RlciBDIGZpZWxkCi0gICAnUycJU0hJTU1GSU5JU0gJZmluaXNoIGluc2VydGluZyBhIHNoaW1tIHZhbHVlCi0gICAnTCcJTElNTUZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIGEgbGltbSB2YWx1ZQotICAgJ2QnCVNISU1NT0ZGU0VUCXNoaW1tIG9mZnNldCBpbiBsZCxzdCBpbnNucwotICAgJzAnCVNISU1NWkVSTwkwIHNoaW1tIHZhbHVlIGluIGxkLHN0IGluc25zCi0gICAnZicJRkxBRwkJRiBmbGFnCi0gICAnRicJRkxBR0ZJTklTSAlmaW5pc2ggaW5zZXJ0aW5nIHRoZSBGIGZsYWcKLSAgICdHJwlGTEFHSU5TTglpbnNlcnQgRiBmbGFnIGluICJmbGFnIiBpbnNuCi0gICAnbicJREVMQVkJCU4gZmllbGQgKG51bGxpZnkgZmllbGQpCi0gICAncScJQ09ORAkJY29uZGl0aW9uIGNvZGUgZmllbGQKLSAgICdRJwlGT1JDRUxJTU0Jc2V0IGBjb25kX3AnIHRvIDEgdG8gZW5zdXJlIGEgY29uc3RhbnQgaXMgYSBsaW1tCi0gICAnQicJQlJBTkNICQlicmFuY2ggYWRkcmVzcyAoMjIgYml0IHBjIHJlbGF0aXZlKQotICAgJ0onCUpVTVAJCWp1bXAgYWRkcmVzcyAoMjYgYml0IGFic29sdXRlKQotICAgJ3onCVNJWkUxCQlzaXplIGZpZWxkIGluIGxkIGEsW2IsY10KLSAgICdaJwlTSVpFMTAJCXNpemUgZmllbGQgaW4gbGQgYSxbYixzaGltbV0KLSAgICd5JwlTSVpFMjIJCXNpemUgZmllbGQgaW4gc3QgYyxbYixzaGltbV0KLSAgICd4JwlTSUdOMAkJc2lnbiBleHRlbmQgZmllbGQgbGQgYSxbYixjXQotICAgJ1gnCVNJR045CQlzaWduIGV4dGVuZCBmaWVsZCBsZCBhLFtiLHNoaW1tXQotICAgJ3cnCUFERFJFU1MzCXdyaXRlLWJhY2sgZmllbGQgaW4gbGQgYSxbYixjXQotICAgJ1cnCUFERFJFU1MxMgl3cml0ZS1iYWNrIGZpZWxkIGluIGxkIGEsW2Isc2hpbW1dCi0gICAndicJQUREUkVTUzI0CXdyaXRlLWJhY2sgZmllbGQgaW4gc3QgYyxbYixzaGltbV0KLSAgICdlJwlDQUNIRUJZUEFTUzUJY2FjaGUgYnlwYXNzIGluIGxkIGEsW2IsY10KLSAgICdFJwlDQUNIRUJZUEFTUzE0CWNhY2hlIGJ5cGFzcyBpbiBsZCBhLFtiLHNoaW1tXQotICAgJ0QnCUNBQ0hFQllQQVNTMjYJY2FjaGUgYnlwYXNzIGluIHN0IGMsW2Isc2hpbW1dCi0gICAnVScJVU5PUE1BQ1JPCWZha2Ugb3BlcmFuZCB0byBjb3B5IFJFR0IgdG8gUkVHQyBmb3IgdW5vcCBtYWNyb3MKLQotICAgVGhlIGZvbGxvd2luZyBtb2RpZmllcnMgbWF5IGFwcGVhciBiZXR3ZWVuIHRoZSAlIGFuZCBjaGFyIChlZzogJS5mKToKLQotICAgJy4nCU1PRERPVAkJJy4nIHByZWZpeCBtdXN0IGJlIHByZXNlbnQKLSAgICdyJwlSRUcJCWdlbmVyaWMgcmVnaXN0ZXIgdmFsdWUsIGZvciByZWdpc3RlciB0YWJsZQotICAgJ0EnCUFVWFJFRwkJYXV4aWxpYXJ5IHJlZ2lzdGVyIGluIGxyIGEsW2JdLCBzciBjLFtiXQotCi0gICBGaWVsZHMgYXJlOgotCi0gICBDSEFSIEJJVFMgU0hJRlQgRkxBR1MgSU5TRVJUX0ZOIEVYVFJBQ1RfRk4KLSovCi0KLWNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCBhcmNfb3BlcmFuZHNbXSA9Ci17Ci0vKiBwbGFjZSBob2xkZXIgKD8/PyBub3Qgc3VyZSBpZiBuZWVkZWQpICovCi0jZGVmaW5lIFVOVVNFRCAwCi0gIHsgMCB9LAotCi0vKiByZWdpc3RlciBBIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0EgKFVOVVNFRCArIDEpCi0gIHsgJ2EnLCA2LCBBUkNfU0hJRlRfUkVHQSwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVnLCBleHRyYWN0X3JlZyB9LAotCi0vKiByZWdpc3RlciBCIG9yIHNoaW1tL2xpbW0gaW5kaWNhdG9yICovCi0jZGVmaW5lIFJFR0IgKFJFR0EgKyAxKQotICB7ICdiJywgNiwgQVJDX1NISUZUX1JFR0IsIEFSQ19PUEVSQU5EX1NJR05FRCwgaW5zZXJ0X3JlZywgZXh0cmFjdF9yZWcgfSwKLQotLyogcmVnaXN0ZXIgQyBvciBzaGltbS9saW1tIGluZGljYXRvciAqLwotI2RlZmluZSBSRUdDIChSRUdCICsgMSkKLSAgeyAnYycsIDYsIEFSQ19TSElGVF9SRUdDLCBBUkNfT1BFUkFORF9TSUdORUQsIGluc2VydF9yZWcsIGV4dHJhY3RfcmVnIH0sCi0KLS8qIGZha2Ugb3BlcmFuZCB1c2VkIHRvIGluc2VydCBzaGltbSB2YWx1ZSBpbnRvIG1vc3QgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFNISU1NRklOSVNIIChSRUdDICsgMSkKLSAgeyAnUycsIDksIDAsIEFSQ19PUEVSQU5EX1NJR05FRCArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9zaGltbWZpbmlzaCwgMCB9LAotCi0vKiBmYWtlIG9wZXJhbmQgdXNlZCB0byBpbnNlcnQgbGltbSB2YWx1ZSBpbnRvIG1vc3QgaW5zdHJ1Y3Rpb25zLiAgKi8KLSNkZWZpbmUgTElNTUZJTklTSCAoU0hJTU1GSU5JU0ggKyAxKQotICB7ICdMJywgMzIsIDMyLCBBUkNfT1BFUkFORF9BRERSRVNTICsgQVJDX09QRVJBTkRfTElNTSArIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9saW1tZmluaXNoLCAwIH0sCi0KLS8qIHNoaW1tIG9wZXJhbmQgd2hlbiB0aGVyZSBpcyBubyByZWcgaW5kaWNhdG9yIChsZCxzdCkgKi8KLSNkZWZpbmUgU0hJTU1PRkZTRVQgKExJTU1GSU5JU0ggKyAxKQotICB7ICdkJywgOSwgMCwgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfc2hpbW1vZmZzZXQsIDAgfSwKLQotLyogMCBzaGltbSBvcGVyYW5kIGZvciBsZCxzdCBpbnNucyAqLwotI2RlZmluZSBTSElNTVpFUk8gKFNISU1NT0ZGU0VUICsgMSkKLSAgeyAnMCcsIDksIDAsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9zaGltbXplcm8sIDAgfSwKLQotLyogZmxhZyB1cGRhdGUgYml0IChpbnNlcnRpb24gaXMgZGVmZXJlZCB1bnRpbCB3ZSBrbm93IGhvdykgKi8KLSNkZWZpbmUgRkxBRyAoU0hJTU1aRVJPICsgMSkKLSAgeyAnZicsIDEsIDgsIEFSQ19PUEVSQU5EX1NVRkZJWCwgaW5zZXJ0X2ZsYWcsIGV4dHJhY3RfZmxhZyB9LAotCi0vKiBmYWtlIHV0aWxpdHkgb3BlcmFuZCB0byBmaW5pc2ggJ2YnIHN1ZmZpeCBoYW5kbGluZyAqLwotI2RlZmluZSBGTEFHRklOSVNIIChGTEFHICsgMSkKLSAgeyAnRicsIDEsIDgsIEFSQ19PUEVSQU5EX0ZBS0UsIGluc2VydF9mbGFnZmluaXNoLCAwIH0sCi0KLS8qIGZha2UgdXRpbGl0eSBvcGVyYW5kIHRvIHNldCB0aGUgJ2YnIGZsYWcgZm9yIHRoZSAiZmxhZyIgaW5zbiAqLwotI2RlZmluZSBGTEFHSU5TTiAoRkxBR0ZJTklTSCArIDEpCi0gIHsgJ0cnLCAxLCA4LCBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfZmxhZywgMCB9LAotCi0vKiBicmFuY2ggZGVsYXkgdHlwZXMgKi8KLSNkZWZpbmUgREVMQVkgKEZMQUdJTlNOICsgMSkKLSAgeyAnbicsIDIsIDUsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjb25kaXRpb25zICovCi0jZGVmaW5lIENPTkQgKERFTEFZICsgMSkKLSAgeyAncScsIDUsIDAsIEFSQ19PUEVSQU5EX1NVRkZJWCwgaW5zZXJ0X2NvbmQsIGV4dHJhY3RfY29uZCB9LAotCi0vKiBzZXQgYGNvbmRfcCcgdG8gMSB0byBlbnN1cmUgYSBjb25zdGFudCBpcyB0cmVhdGVkIGFzIGEgbGltbSAqLwotI2RlZmluZSBGT1JDRUxJTU0gKENPTkQgKyAxKQotICB7ICdRJywgMCwgMCwgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X2ZvcmNlbGltbSB9LAotCi0vKiBicmFuY2ggYWRkcmVzczsgYiwgYmwsIGFuZCBscCBpbnNucyAqLwotI2RlZmluZSBCUkFOQ0ggKEZPUkNFTElNTSArIDEpCi0gIHsgJ0InLCAyMCwgNywgQVJDX09QRVJBTkRfUkVMQVRJVkVfQlJBTkNIICsgQVJDX09QRVJBTkRfU0lHTkVELCBpbnNlcnRfcmVsYWRkciwgZXh0cmFjdF9yZWxhZGRyIH0sCi0KLS8qIGp1bXAgYWRkcmVzczsgaiBpbnNuICh0aGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyAnTCcgZXhjZXB0IHRoYXQgdGhlCi0gICB2YWx1ZSBpcyByaWdodCBzaGlmdGVkIGJ5IDIpICovCi0jZGVmaW5lIEpVTVAgKEJSQU5DSCArIDEpCi0gIHsgJ0onLCAyNCwgMzIsIEFSQ19PUEVSQU5EX0FCU09MVVRFX0JSQU5DSCArIEFSQ19PUEVSQU5EX0xJTU0gKyBBUkNfT1BFUkFORF9GQUtFLCBpbnNlcnRfYWJzYWRkciB9LAotCi0vKiBzaXplIGZpZWxkLCBzdG9yZWQgaW4gYml0IDEsMiAqLwotI2RlZmluZSBTSVpFMSAoSlVNUCArIDEpCi0gIHsgJ3onLCAyLCAxLCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogc2l6ZSBmaWVsZCwgc3RvcmVkIGluIGJpdCAxMCwxMSAqLwotI2RlZmluZSBTSVpFMTAgKFNJWkUxICsgMSkKLSAgeyAnWicsIDIsIDEwLCBBUkNfT1BFUkFORF9TVUZGSVgsIH0sCi0KLS8qIHNpemUgZmllbGQsIHN0b3JlZCBpbiBiaXQgMjIsMjMgKi8KLSNkZWZpbmUgU0laRTIyIChTSVpFMTAgKyAxKQotICB7ICd5JywgMiwgMjIsIEFSQ19PUEVSQU5EX1NVRkZJWCwgfSwKLQotLyogc2lnbiBleHRlbmQgZmllbGQsIHN0b3JlZCBpbiBiaXQgMCAqLwotI2RlZmluZSBTSUdOMCAoU0laRTIyICsgMSkKLSAgeyAneCcsIDEsIDAsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBzaWduIGV4dGVuZCBmaWVsZCwgc3RvcmVkIGluIGJpdCA5ICovCi0jZGVmaW5lIFNJR045IChTSUdOMCArIDEpCi0gIHsgJ1gnLCAxLCA5LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogYWRkcmVzcyB3cml0ZSBiYWNrLCBzdG9yZWQgaW4gYml0IDMgKi8KLSNkZWZpbmUgQUREUkVTUzMgKFNJR045ICsgMSkKLSAgeyAndycsIDEsIDMsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBhZGRyZXNzIHdyaXRlIGJhY2ssIHN0b3JlZCBpbiBiaXQgMTIgKi8KLSNkZWZpbmUgQUREUkVTUzEyIChBRERSRVNTMyArIDEpCi0gIHsgJ1cnLCAxLCAxMiwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGFkZHJlc3Mgd3JpdGUgYmFjaywgc3RvcmVkIGluIGJpdCAyNCAqLwotI2RlZmluZSBBRERSRVNTMjQgKEFERFJFU1MxMiArIDEpCi0gIHsgJ3YnLCAxLCAyNCwgQVJDX09QRVJBTkRfU1VGRklYIH0sCi0KLS8qIGNhY2hlIGJ5cGFzcywgc3RvcmVkIGluIGJpdCA1ICovCi0jZGVmaW5lIENBQ0hFQllQQVNTNSAoQUREUkVTUzI0ICsgMSkKLSAgeyAnZScsIDEsIDUsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiBjYWNoZSBieXBhc3MsIHN0b3JlZCBpbiBiaXQgMTQgKi8KLSNkZWZpbmUgQ0FDSEVCWVBBU1MxNCAoQ0FDSEVCWVBBU1M1ICsgMSkKLSAgeyAnRScsIDEsIDE0LCBBUkNfT1BFUkFORF9TVUZGSVggfSwKLQotLyogY2FjaGUgYnlwYXNzLCBzdG9yZWQgaW4gYml0IDI2ICovCi0jZGVmaW5lIENBQ0hFQllQQVNTMjYgKENBQ0hFQllQQVNTMTQgKyAxKQotICB7ICdEJywgMSwgMjYsIEFSQ19PUEVSQU5EX1NVRkZJWCB9LAotCi0vKiB1bm9wIG1hY3JvLCB1c2VkIHRvIGNvcHkgUkVHQiB0byBSRUdDICovCi0jZGVmaW5lIFVOT1BNQUNSTyAoQ0FDSEVCWVBBU1MyNiArIDEpCi0gIHsgJ1UnLCA2LCBBUkNfU0hJRlRfUkVHQywgQVJDX09QRVJBTkRfRkFLRSwgaW5zZXJ0X3Vub3BtYWNybywgZXh0cmFjdF91bm9wbWFjcm8gfSwKLQotLyogJy4nIG1vZGlmaWVyICgnLicgcmVxdWlyZWQpLiAgKi8KLSNkZWZpbmUgTU9ERE9UIChVTk9QTUFDUk8gKyAxKQotICB7ICcuJywgMSwgMCwgQVJDX01PRF9ET1QgfSwKLQotLyogRHVtbXkgJ3InIG1vZGlmaWVyIGZvciB0aGUgcmVnaXN0ZXIgdGFibGUuCi0gICBJdCdzIGNhbGxlZCBhICJkdW1teSIgYmVjYXVzZSB0aGVyZSdzIG5vIHBvaW50IGluIGluc2VydGluZyBhbiAncicgaW50byBhbGwKLSAgIHRoZSAlYS8lYi8lYyBvY2N1cnJlbmNlcyBpbiB0aGUgaW5zbiB0YWJsZS4gICovCi0jZGVmaW5lIFJFRyAoTU9ERE9UICsgMSkKLSAgeyAncicsIDYsIDAsIEFSQ19NT0RfUkVHIH0sCi0KLS8qIEtub3duIGF1eGlsaWFyeSByZWdpc3RlciBtb2RpZmllciAoc3RvcmVkIGluIHNoaW1tIGZpZWxkKS4gICovCi0jZGVmaW5lIEFVWFJFRyAoUkVHICsgMSkKLSAgeyAnQScsIDksIDAsIEFSQ19NT0RfQVVYUkVHIH0sCi0KLS8qIGVuZCBvZiBsaXN0IHBsYWNlIGhvbGRlciAqLwotICB7IDAgfQotfTsKLQwKLS8qIEdpdmVuIGEgZm9ybWF0IGxldHRlciwgeWllbGRzIHRoZSBpbmRleCBpbnRvIGBhcmNfb3BlcmFuZHMnLgotICAgZWc6IGFyY19vcGVyYW5kX21hcFsnYSddID0gUkVHQS4gICovCi11bnNpZ25lZCBjaGFyIGFyY19vcGVyYW5kX21hcFsyNTZdOwotCi0jZGVmaW5lIEkoeCkgKCgoeCkgJiAzMSkgPDwgMjcpCi0jZGVmaW5lIEEoeCkgKCgoeCkgJiBBUkNfTUFTS19SRUcpIDw8IEFSQ19TSElGVF9SRUdBKQotI2RlZmluZSBCKHgpICgoKHgpICYgQVJDX01BU0tfUkVHKSA8PCBBUkNfU0hJRlRfUkVHQikKLSNkZWZpbmUgQyh4KSAoKCh4KSAmIEFSQ19NQVNLX1JFRykgPDwgQVJDX1NISUZUX1JFR0MpCi0jZGVmaW5lIFIoeCxiLG0pICgoKHgpICYgKG0pKSA8PCAoYikpCS8qIHZhbHVlIFgsIG1hc2sgTSwgYXQgYml0IEIgKi8KLQotLyogQVJDIGluc3RydWN0aW9ucy4KLQotICAgTG9uZ2VyIHZlcnNpb25zIG9mIGluc25zIG11c3QgYXBwZWFyIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGlmIGdhcyBzZWVzCi0gICAibHNyIHIyLHIzLDEiIHdoZW4gaXQncyBwYXJzaW5nICJsc3IgJWEsJWIiIGl0IHdpbGwgdGhpbmsgdGhlICIsMSIgaXMKLSAgIGp1bmspLiAgVGhpcyBpc24ndCBuZWNlc3NhcnkgZm9yIGBsZCcgYmVjYXVzZSBvZiB0aGUgdHJhaWxpbmcgJ10nLgotCi0gICBJbnN0cnVjdGlvbnMgdGhhdCBhcmUgcmVhbGx5IG1hY3JvcyBiYXNlZCBvbiBvdGhlciBpbnNucyBtdXN0IGFwcGVhcgotICAgYmVmb3JlIHRoZSByZWFsIGluc24gc28gdGhleSdyZSBjaG9zZW4gd2hlbiBkaXNhc3NlbWJsaW5nLiAgRWc6IFRoZSBgbW92JwotICAgaW5zbiBpcyByZWFsbHkgdGhlIGBhbmQnIGluc24uCi0KLSAgIFRoaXMgdGFibGUgaXMgYmVzdCB2aWV3ZWQgb24gYSB3aWRlIHNjcmVlbiAoMTYxIGNvbHVtbnMpLiAgSSdkIHByZWZlciB0bwotICAga2VlcCBpdCB0aGlzIHdheS4gIFRoZSByZXN0IG9mIHRoZSBmaWxlLCBob3dldmVyLCBzaG91bGQgYmUgdmlld2FibGUgb24gYW4KLSAgIDgwIGNvbHVtbiB0ZXJtaW5hbC4gICovCi0KLS8qID8/PyBUaGlzIHRhYmxlIGFsc28gaW5jbHVkZXMgbWFjcm9zOiBhc2wsIGxzbCwgYW5kIG1vdi4gIFRoZSBwcGMgcG9ydCBoYXMKLSAgIGEgbW9yZSBnZW5lcmFsIGZhY2lsaXR5IGZvciBkZWFsaW5nIHdpdGggbWFjcm9zIHdoaWNoIGNvdWxkIGJlIHVzZWQgaWYKLSAgIHdlIG5lZWQgdG8uICAqLwotCi0vKiBUaGlzIHRhYmxlIGNhbid0IGJlIGBjb25zdCcgYmVjYXVzZSBtZW1iZXJzIGBuZXh0X2FzbScgYW5kIGBuZXh0X2RpcycgYXJlCi0gICBjb21wdXRlZCBhdCBydW4tdGltZS4gIFdlIGNvdWxkIHNwbGl0IHRoaXMgaW50byB0d28sIGJ1dCB0aGF0IGRvZXNuJ3Qgc2VlbQotICAgd29ydGggaXQuICAqLwotCi1zdHJ1Y3QgYXJjX29wY29kZSBhcmNfb3Bjb2Rlc1tdID0gewotCi0gIC8qIE1hY3JvcyBhcHBlYXIgZmlyc3QuICAqLwotICAvKiAibW92IiBpcyByZWFsbHkgYW4gImFuZCIuICAqLwotICB7ICJtb3YlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoMTIpIH0sCi0gIC8qICJhc2wiIGlzIHJlYWxseSBhbiAiYWRkIi4gICovCi0gIHsgImFzbCUucSUuZiAlYSwlYiVGJVMlTCVVIiwJCUkoLTEpLAkJSSg4KSB9LAotICAvKiAibHNsIiBpcyByZWFsbHkgYW4gImFkZCIuICAqLwotICB7ICJsc2wlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoOCkgfSwKLSAgLyogIm5vcCIgaXMgcmVhbGx5IGFuICJ4b3IiLiAgKi8KLSAgeyAibm9wIiwJCQkJMHhmZmZmZmZmZiwJMHg3ZmZmZmZmZiB9LAotICAvKiAicmxjIiBpcyByZWFsbHkgYW4gImFkYyIuICAqLwotICB7ICJybGMlLnElLmYgJWEsJWIlRiVTJUwlVSIsCQlJKC0xKSwJCUkoOSkgfSwKLQotICAvKiBUaGUgcmVzdCBvZiB0aGVzZSBuZWVkbid0IGJlIHNvcnRlZCwgYnV0IGl0IGhlbHBzIHRvIGZpbmQgdGhlbSBpZiB0aGV5IGFyZS4gICovCi0gIHsgImFkYyUucSUuZiAlYSwlYiwlYyVGJVMlTCIsCQlJKC0xKSwJCUkoOSkgfSwKLSAgeyAiYWRkJS5xJS5mICVhLCViLCVjJUYlUyVMIiwJCUkoLTEpLAkJSSg4KSB9LAotICB7ICJhbmQlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEyKSB9LAotICB7ICJhc3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygxKSB9LAotICB7ICJiaWMlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDE0KSB9LAotICB7ICJiJXElLm4gJUIiLAkJCUkoLTEpLAkJSSg0KSwJCUFSQ19PUENPREVfQ09ORF9CUkFOQ0ggfSwKLSAgeyAiYmwlcSUubiAlQiIsCQkJSSgtMSksCQlJKDUpLAkJQVJDX09QQ09ERV9DT05EX0JSQU5DSCB9LAotICB7ICJleHRiJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNykgfSwKLSAgeyAiZXh0dyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDgpIH0sCi0gIHsgImZsYWclLnEgJWIlRyVTJUwiLAkJCUkoLTEpK0EoLTEpK0MoLTEpLAkJSSgzKStBKEFSQ19SRUdfU0hJTU1fVVBEQVRFKStDKDApIH0sCi0gIC8qICVROiBmb3JjZSBjb25kX3A9MSAtLT4gbm8gc2hpbW0gdmFsdWVzICovCi0gIC8qID8/PyBUaGlzIGluc24gYWxsb3dzIGFuIG9wdGlvbmFsIGZsYWdzIHNwZWMuICAqLwotICB7ICJqJXElUSUubiUuZiAlYiVKIiwJCQlJKC0xKStBKC0xKStDKC0xKStSKC0xLDcsMSksCUkoNykrQSgwKStDKDApK1IoMCw3LDEpIH0sCi0gIC8qIFB1dCBvcGNvZGUgMSBsZCBpbnNucyBmaXJzdCBzbyBzaGltbSBnZXRzIHByZWZlcmVkIG92ZXIgbGltbS4gICovCi0gIC8qICJbJWJdIiBpcyBiZWZvcmUgIlslYiwlZF0iIHNvIDAgb2Zmc2V0cyBkb24ndCBnZXQgcHJpbnRlZC4gICovCi0gIHsgImxkJVolLlglLlclLkUgJTAlYSxbJWJdJUwiLAlJKC0xKStSKC0xLDEzLDEpK1IoLTEsMCw1MTEpLAlJKDEpK1IoMCwxMywxKStSKDAsMCw1MTEpIH0sCi0gIHsgImxkJVolLlglLlclLkUgJWEsWyViLCVkXSVTJUwiLAlJKC0xKStSKC0xLDEzLDEpLAkJSSgxKStSKDAsMTMsMSkgfSwKLSAgeyAibGQleiUueCUudyUuZSVRICVhLFslYiwlY10lTCIsCUkoLTEpK1IoLTEsNCwxKStSKC0xLDYsNyksCUkoMCkrUigwLDQsMSkrUigwLDYsNykgfSwKLSAgeyAibHAlcSUubiAlQiIsCQkJSSgtMSksCQlJKDYpLCB9LAotICB7ICJsciAlYSxbJUFiXSVTJUwiLAkJCUkoLTEpK0MoLTEpLAlJKDEpK0MoMHgxMCkgfSwKLSAgeyAibHNyJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoMikgfSwKLSAgeyAib3IlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEzKSB9LAotICB7ICJyb3IlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQygzKSB9LAotICB7ICJycmMlLnElLmYgJWEsJWIlRiVTJUwiLAkJSSgtMSkrQygtMSksCUkoMykrQyg0KSB9LAotICB7ICJzYmMlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDExKSB9LAotICB7ICJzZXhiJS5xJS5mICVhLCViJUYlUyVMIiwJCUkoLTEpK0MoLTEpLAlJKDMpK0MoNSkgfSwKLSAgeyAic2V4dyUucSUuZiAlYSwlYiVGJVMlTCIsCQlJKC0xKStDKC0xKSwJSSgzKStDKDYpIH0sCi0gIHsgInNyICVjLFslQWJdJVMlTCIsCQkJSSgtMSkrQSgtMSksCUkoMikrQSgweDEwKSB9LAotICAvKiAiWyViXSIgaXMgYmVmb3JlICJbJWIsJWRdIiBzbyAwIG9mZnNldHMgZG9uJ3QgZ2V0IHByaW50ZWQuICAqLwotICB7ICJzdCV5JS52JS5EJVEgJTAlYyxbJWJdJUwiLAkJSSgtMSkrUigtMSwyNSwxKStSKC0xLDIxLDEpK1IoLTEsMCw1MTEpLAlJKDIpK1IoMCwyNSwxKStSKDAsMjEsMSkrUigwLDAsNTExKSB9LAotICB7ICJzdCV5JS52JS5EICVjLFslYiwlZF0lUyVMIiwJSSgtMSkrUigtMSwyNSwxKStSKC0xLDIxLDEpLAkJCUkoMikrUigwLDI1LDEpK1IoMCwyMSwxKSB9LAotICB7ICJzdWIlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDEwKSB9LAotICB7ICJ4b3IlLnElLmYgJWEsJWIsJWMlRiVTJUwiLAkJSSgtMSksCQlJKDE1KSB9Ci19OwotY29uc3QgaW50IGFyY19vcGNvZGVzX2NvdW50ID0gc2l6ZW9mIChhcmNfb3Bjb2RlcykgLyBzaXplb2YgKGFyY19vcGNvZGVzWzBdKTsKLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlIGFyY19yZWdfbmFtZXNbXSA9Ci17Ci0gIC8qIFNvcnQgdGhpcyBzbyB0aGF0IHRoZSBmaXJzdCA2MSBlbnRyaWVzIGFyZSBzZXF1ZW50aWFsLgotICAgICBJRTogRm9yIGVhY2ggaSAoaTw2MSksIGFyY19yZWdfbmFtZXNbaV0udmFsdWUgPT0gaS4gICovCi0KLSAgeyAicjAiLCAwLCBSRUcgfSwgeyAicjEiLCAxLCBSRUcgfSwgeyAicjIiLCAyLCBSRUcgfSwgeyAicjMiLCAzLCBSRUcgfSwKLSAgeyAicjQiLCA0LCBSRUcgfSwgeyAicjUiLCA1LCBSRUcgfSwgeyAicjYiLCA2LCBSRUcgfSwgeyAicjciLCA3LCBSRUcgfSwKLSAgeyAicjgiLCA4LCBSRUcgfSwgeyAicjkiLCA5LCBSRUcgfSwgeyAicjEwIiwgMTAsIFJFRyB9LCB7ICJyMTEiLCAxMSwgUkVHIH0sCi0gIHsgInIxMiIsIDEyLCBSRUcgfSwgeyAicjEzIiwgMTMsIFJFRyB9LCB7ICJyMTQiLCAxNCwgUkVHIH0sIHsgInIxNSIsIDE1LCBSRUcgfSwKLSAgeyAicjE2IiwgMTYsIFJFRyB9LCB7ICJyMTciLCAxNywgUkVHIH0sIHsgInIxOCIsIDE4LCBSRUcgfSwgeyAicjE5IiwgMTksIFJFRyB9LAotICB7ICJyMjAiLCAyMCwgUkVHIH0sIHsgInIyMSIsIDIxLCBSRUcgfSwgeyAicjIyIiwgMjIsIFJFRyB9LCB7ICJyMjMiLCAyMywgUkVHIH0sCi0gIHsgInIyNCIsIDI0LCBSRUcgfSwgeyAicjI1IiwgMjUsIFJFRyB9LCB7ICJyMjYiLCAyNiwgUkVHIH0sIHsgImZwIiwgMjcsIFJFRyB9LAotICB7ICJzcCIsIDI4LCBSRUcgfSwgeyAiaWxpbmsxIiwgMjksIFJFRyB9LCB7ICJpbGluazIiLCAzMCwgUkVHIH0sIHsgImJsaW5rIiwgMzEsIFJFRyB9LAotICB7ICJyMzIiLCAzMiwgUkVHIH0sIHsgInIzMyIsIDMzLCBSRUcgfSwgeyAicjM0IiwgMzQsIFJFRyB9LCB7ICJyMzUiLCAzNSwgUkVHIH0sCi0gIHsgInIzNiIsIDM2LCBSRUcgfSwgeyAicjM3IiwgMzcsIFJFRyB9LCB7ICJyMzgiLCAzOCwgUkVHIH0sIHsgInIzOSIsIDM5LCBSRUcgfSwKLSAgeyAicjQwIiwgNDAsIFJFRyB9LCB7ICJyNDEiLCA0MSwgUkVHIH0sIHsgInI0MiIsIDQyLCBSRUcgfSwgeyAicjQzIiwgNDMsIFJFRyB9LAotICB7ICJyNDQiLCA0NCwgUkVHIH0sIHsgInI0NSIsIDQ1LCBSRUcgfSwgeyAicjQ2IiwgNDYsIFJFRyB9LCB7ICJyNDciLCA0NywgUkVHIH0sCi0gIHsgInI0OCIsIDQ4LCBSRUcgfSwgeyAicjQ5IiwgNDksIFJFRyB9LCB7ICJyNTAiLCA1MCwgUkVHIH0sIHsgInI1MSIsIDUxLCBSRUcgfSwKLSAgeyAicjUyIiwgNTIsIFJFRyB9LCB7ICJyNTMiLCA1MywgUkVHIH0sIHsgInI1NCIsIDU0LCBSRUcgfSwgeyAicjU1IiwgNTUsIFJFRyB9LAotICB7ICJyNTYiLCA1NiwgUkVHIH0sIHsgInI1NyIsIDU3LCBSRUcgfSwgeyAicjU4IiwgNTgsIFJFRyB9LCB7ICJyNTkiLCA1OSwgUkVHIH0sCi0gIHsgImxwX2NvdW50IiwgNjAsIFJFRyB9LAotCi0gIC8qIEknZCBwcmVmZXIgdG8gb3V0cHV0IHRoZXNlIGFzICJmcCIgYW5kICJzcCIgYnkgZGVmYXVsdCwgYnV0IHdlIHN0aWxsIG5lZWQKLSAgICAgdG8gcmVjb2duaXplIHRoZSBjYW5vbmljYWwgdmFsdWVzLiAgKi8KLSAgeyAicjI3IiwgMjcsIFJFRyB9LCB7ICJyMjgiLCAyOCwgUkVHIH0sCi0KLSAgLyogU29tZW9uZSBtYXkgd2lzaCB0byByZWZlciB0byB0aGVzZSBpbiB0aGlzIHdheSwgYW5kIGl0J3MgcHJvYmFibHkgYQotICAgICBnb29kIGlkZWEgdG8gcmVzZXJ2ZSB0aGVtIGFzIHN1Y2ggYW55d2F5LiAgKi8KLSAgeyAicjI5IiwgMjksIFJFRyB9LCB7ICJyMzAiLCAzMCwgUkVHIH0sIHsgInIzMSIsIDMxLCBSRUcgfSwgeyAicjYwIiwgNjAsIFJFRyB9LAotCi0gIC8qIFN0YW5kYXJkIGF1eGlsaWFyeSByZWdpc3RlcnMuICAqLwotICB7ICJzdGF0dXMiLAkwLCBBVVhSRUcgfSwKLSAgeyAic2VtYXBob3JlIiwgMSwgQVVYUkVHIH0sCi0gIHsgImxwX3N0YXJ0IiwJMiwgQVVYUkVHIH0sCi0gIHsgImxwX2VuZCIsCTMsIEFVWFJFRyB9LAotICB7ICJpZGVudGl0eSIsCTQsIEFVWFJFRyB9LAotICB7ICJkZWJ1ZyIsCTUsIEFVWFJFRyB9LAotfTsKLWNvbnN0IGludCBhcmNfcmVnX25hbWVzX2NvdW50ID0gc2l6ZW9mIChhcmNfcmVnX25hbWVzKSAvIHNpemVvZiAoYXJjX3JlZ19uYW1lc1swXSk7Ci0KLS8qIFRoZSBzdWZmaXggdGFibGUuCi0gICBPcGVyYW5kcyB3aXRoIHRoZSBzYW1lIG5hbWUgbXVzdCBiZSBzdG9yZWQgdG9nZXRoZXIuICAqLwotCi1jb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgYXJjX3N1ZmZpeGVzW10gPQotewotICAvKiBFbnRyeSAwIGlzIHNwZWNpYWwsIGRlZmF1bHQgdmFsdWVzIGFyZW4ndCBwcmludGVkIGJ5IHRoZSBkaXNhc3NlbWJsZXIuICAqLwotICB7ICIiLCAwLCAtMSB9LAotICB7ICJhbCIsIDAsIENPTkQgfSwKLSAgeyAicmEiLCAwLCBDT05EIH0sCi0gIHsgImVxIiwgMSwgQ09ORCB9LAotICB7ICJ6IiwgMSwgQ09ORCB9LAotICB7ICJuZSIsIDIsIENPTkQgfSwKLSAgeyAibnoiLCAyLCBDT05EIH0sCi0gIHsgInAiLCAzLCBDT05EIH0sCi0gIHsgInBsIiwgMywgQ09ORCB9LAotICB7ICJuIiwgNCwgQ09ORCB9LAotICB7ICJtaSIsIDQsIENPTkQgfSwKLSAgeyAiYyIsIDUsIENPTkQgfSwKLSAgeyAiY3MiLCA1LCBDT05EIH0sCi0gIHsgImxvIiwgNSwgQ09ORCB9LAotICB7ICJuYyIsIDYsIENPTkQgfSwKLSAgeyAiY2MiLCA2LCBDT05EIH0sCi0gIHsgImhzIiwgNiwgQ09ORCB9LAotICB7ICJ2IiwgNywgQ09ORCB9LAotICB7ICJ2cyIsIDcsIENPTkQgfSwKLSAgeyAibnYiLCA4LCBDT05EIH0sCi0gIHsgInZjIiwgOCwgQ09ORCB9LAotICB7ICJndCIsIDksIENPTkQgfSwKLSAgeyAiZ2UiLCAxMCwgQ09ORCB9LAotICB7ICJsdCIsIDExLCBDT05EIH0sCi0gIHsgImxlIiwgMTIsIENPTkQgfSwKLSAgeyAiaGkiLCAxMywgQ09ORCB9LAotICB7ICJscyIsIDE0LCBDT05EIH0sCi0gIHsgInBueiIsIDE1LCBDT05EIH0sCi0gIHsgImYiLCAxLCBGTEFHIH0sCi0gIHsgIm5kIiwgQVJDX0RFTEFZX05PTkUsIERFTEFZIH0sCi0gIHsgImQiLCBBUkNfREVMQVlfTk9STUFMLCBERUxBWSB9LAotICB7ICJqZCIsIEFSQ19ERUxBWV9KVU1QLCBERUxBWSB9LAotLyp7ICJiIiwgNywgU0laRUVYVCB9LCovCi0vKnsgImIiLCA1LCBTSVpFU0VYIH0sKi8KLSAgeyAiYiIsIDEsIFNJWkUxIH0sCi0gIHsgImIiLCAxLCBTSVpFMTAgfSwKLSAgeyAiYiIsIDEsIFNJWkUyMiB9LAotLyp7ICJ3IiwgOCwgU0laRUVYVCB9LCovCi0vKnsgInciLCA2LCBTSVpFU0VYIH0sKi8KLSAgeyAidyIsIDIsIFNJWkUxIH0sCi0gIHsgInciLCAyLCBTSVpFMTAgfSwKLSAgeyAidyIsIDIsIFNJWkUyMiB9LAotICB7ICJ4IiwgMSwgU0lHTjAgfSwKLSAgeyAieCIsIDEsIFNJR045IH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMyB9LAotICB7ICJhIiwgMSwgQUREUkVTUzEyIH0sCi0gIHsgImEiLCAxLCBBRERSRVNTMjQgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzUgfSwKLSAgeyAiZGkiLCAxLCBDQUNIRUJZUEFTUzE0IH0sCi0gIHsgImRpIiwgMSwgQ0FDSEVCWVBBU1MyNiB9LAotfTsKLWNvbnN0IGludCBhcmNfc3VmZml4ZXNfY291bnQgPSBzaXplb2YgKGFyY19zdWZmaXhlcykgLyBzaXplb2YgKGFyY19zdWZmaXhlc1swXSk7Ci0KLS8qIEluZGV4ZWQgYnkgZmlyc3QgbGV0dGVyIG9mIG9wY29kZS4gIFBvaW50cyB0byBjaGFpbiBvZiBvcGNvZGVzIHdpdGggc2FtZQotICAgZmlyc3QgbGV0dGVyLiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXJjX29wY29kZSAqb3Bjb2RlX21hcFsyNiArIDFdOwotCi0vKiBJbmRleGVkIGJ5IGluc24gY29kZS4gIFBvaW50cyB0byBjaGFpbiBvZiBvcGNvZGVzIHdpdGggc2FtZSBpbnNuIGNvZGUuICAqLwotc3RhdGljIHN0cnVjdCBhcmNfb3Bjb2RlICppY29kZV9tYXBbMzJdOwotDAotLyogQ29uZmlndXJhdGlvbiBmbGFncy4gICovCi0KLS8qIFZhcmlvdXMgQVJDX0hBVkVfWFhYIGJpdHMuICAqLwotc3RhdGljIGludCBjcHVfdHlwZTsKLQotLyogVHJhbnNsYXRlIGEgYmZkX21hY2hfYXJjX3h4eCB2YWx1ZSB0byBhIEFSQ19NQUNIX1hYWCB2YWx1ZS4gICovCi0KLWludAotYXJjX2dldF9vcGNvZGVfbWFjaCAoYmZkX21hY2gsIGJpZ19wKQotICAgICBpbnQgYmZkX21hY2gsIGJpZ19wOwotewotICBzdGF0aWMgaW50IG1hY2hfdHlwZV9tYXBbXSA9Ci0gICAgewotICAgICAgQVJDX01BQ0hfQkFTRQotICAgIH07Ci0KLSAgcmV0dXJuIG1hY2hfdHlwZV9tYXBbYmZkX21hY2hdIHwgKGJpZ19wID8gQVJDX01BQ0hfQklHIDogMCk7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW55IHRhYmxlcyB0aGF0IG5lZWQgaXQuCi0gICBNdXN0IGJlIGNhbGxlZCBvbmNlIGF0IHN0YXJ0IHVwIChvciB3aGVuIGZpcnN0IG5lZWRlZCkuCi0KLSAgIEZMQUdTIGlzIGEgc2V0IG9mIGJpdHMgdGhhdCBzYXkgd2hhdCB2ZXJzaW9uIG9mIHRoZSBjcHUgd2UgaGF2ZSwKLSAgIGFuZCBpbiBwYXJ0aWN1bGFyIGF0IGxlYXN0IChvbmUgb2YpIEFSQ19NQUNIX1hYWC4gICovCi0KLXZvaWQKLWFyY19vcGNvZGVfaW5pdF90YWJsZXMgKGZsYWdzKQotICAgICBpbnQgZmxhZ3M7Ci17Ci0gIHN0YXRpYyBpbnQgaW5pdF9wID0gMDsKLQotICBjcHVfdHlwZSA9IGZsYWdzOwotCi0gIC8qIFdlIG1heSBiZSBpbnRlbnRpb25hbGx5IGNhbGxlZCBtb3JlIHRoYW4gb25jZSAoZm9yIGV4YW1wbGUgZ2RiIHdpbGwgY2FsbAotICAgICB1cyBlYWNoIHRpbWUgdGhlIHVzZXIgc3dpdGNoZXMgY3B1KS4gIFRoZXNlIHRhYmxlcyBvbmx5IG5lZWQgdG8gYmUgaW5pdCdkCi0gICAgIG9uY2UgdGhvdWdoLiAgKi8KLSAgLyogPz8/IFdlIGNhbiByZW1vdmUgdGhlIG5lZWQgZm9yIGFyY19vcGNvZGVfc3VwcG9ydGVkIGJ5IHRha2luZyBpdCBpbnRvCi0gICAgIGFjY291bnQgaGVyZSwgYnV0IEknbSBub3Qgc3VyZSBJIHdhbnQgdG8gZG8gdGhhdCB5ZXQgKGlmIGV2ZXIpLiAgKi8KLSAgaWYgKCFpbml0X3ApCi0gICAgewotICAgICAgcmVnaXN0ZXIgaW50IGksbjsKLQotICAgICAgbWVtc2V0IChhcmNfb3BlcmFuZF9tYXAsIDAsIHNpemVvZiAoYXJjX29wZXJhbmRfbWFwKSk7Ci0gICAgICBuID0gc2l6ZW9mIChhcmNfb3BlcmFuZHMpIC8gc2l6ZW9mIChhcmNfb3BlcmFuZHNbMF0pOwotICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkKLQlhcmNfb3BlcmFuZF9tYXBbYXJjX29wZXJhbmRzW2ldLmZtdF0gPSBpOwotCi0gICAgICBtZW1zZXQgKG9wY29kZV9tYXAsIDAsIHNpemVvZiAob3Bjb2RlX21hcCkpOwotICAgICAgbWVtc2V0IChpY29kZV9tYXAsIDAsIHNpemVvZiAoaWNvZGVfbWFwKSk7Ci0gICAgICAvKiBTY2FuIHRoZSB0YWJsZSBiYWNrd2FyZHMgc28gbWFjcm9zIGFwcGVhciBhdCB0aGUgZnJvbnQuICAqLwotICAgICAgZm9yIChpID0gYXJjX29wY29kZXNfY291bnQgLSAxOyBpID49IDA7IC0taSkKLQl7Ci0JICBpbnQgb3Bjb2RlX2hhc2ggPSBBUkNfSEFTSF9PUENPREUgKGFyY19vcGNvZGVzW2ldLnN5bnRheCk7Ci0JICBpbnQgaWNvZGVfaGFzaCA9IEFSQ19IQVNIX0lDT0RFIChhcmNfb3Bjb2Rlc1tpXS52YWx1ZSk7Ci0KLQkgIGFyY19vcGNvZGVzW2ldLm5leHRfYXNtID0gb3Bjb2RlX21hcFtvcGNvZGVfaGFzaF07Ci0JICBvcGNvZGVfbWFwW29wY29kZV9oYXNoXSA9ICZhcmNfb3Bjb2Rlc1tpXTsKLQotCSAgYXJjX29wY29kZXNbaV0ubmV4dF9kaXMgPSBpY29kZV9tYXBbaWNvZGVfaGFzaF07Ci0JICBpY29kZV9tYXBbaWNvZGVfaGFzaF0gPSAmYXJjX29wY29kZXNbaV07Ci0JfQotCi0gICAgICBpbml0X3AgPSAxOwotICAgIH0KLX0KLQotLyogUmV0dXJuIG5vbi16ZXJvIGlmIE9QQ09ERSBpcyBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmllZCBjcHUuCi0gICBDcHUgc2VsZWN0aW9uIGlzIG1hZGUgd2hlbiBjYWxsaW5nIGBhcmNfb3Bjb2RlX2luaXRfdGFibGVzJy4gICovCi0KLWludAotYXJjX29wY29kZV9zdXBwb3J0ZWQgKG9wY29kZSkKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKm9wY29kZTsKLXsKLSAgaWYgKEFSQ19PUENPREVfQ1BVIChvcGNvZGUtPmZsYWdzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoQVJDX09QQ09ERV9DUFUgKG9wY29kZS0+ZmxhZ3MpICYgQVJDX0hBVkVfQ1BVIChjcHVfdHlwZSkpCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgT1BWQUwgaXMgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpZWQgY3B1LgotICAgQ3B1IHNlbGVjdGlvbiBpcyBtYWRlIHdoZW4gY2FsbGluZyBgYXJjX29wY29kZV9pbml0X3RhYmxlcycuICAqLwotCi1pbnQKLWFyY19vcHZhbF9zdXBwb3J0ZWQgKG9wdmFsKQotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKm9wdmFsOwotewotICBpZiAoQVJDX09QVkFMX0NQVSAob3B2YWwtPmZsYWdzKSA9PSAwKQotICAgIHJldHVybiAxOwotICBpZiAoQVJDX09QVkFMX0NQVSAob3B2YWwtPmZsYWdzKSAmIEFSQ19IQVZFX0NQVSAoY3B1X3R5cGUpKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBpbnNuIGluIHRoZSBjaGFpbiBmb3IgYXNzZW1ibGluZyBJTlNOLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKgotYXJjX29wY29kZV9sb29rdXBfYXNtIChpbnNuKQotICAgICBjb25zdCBjaGFyICppbnNuOwotewotICByZXR1cm4gb3Bjb2RlX21hcFtBUkNfSEFTSF9PUENPREUgKGluc24pXTsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBpbnNuIGluIHRoZSBjaGFpbiBmb3IgZGlzYXNzZW1ibGluZyBJTlNOLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGNvZGUgKgotYXJjX29wY29kZV9sb29rdXBfZGlzIChpbnNuKQotICAgICB1bnNpZ25lZCBpbnQgaW5zbjsKLXsKLSAgcmV0dXJuIGljb2RlX21hcFtBUkNfSEFTSF9JQ09ERSAoaW5zbildOwotfQotDAotLyogTm9uemVybyBpZiB3ZSd2ZSBzZWVuIGFuICdmJyBzdWZmaXggKGluIGNlcnRhaW4gaW5zbnMpLiAgKi8KLXN0YXRpYyBpbnQgZmxhZ19wOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIGZpbmlzaGVkIHByb2Nlc3NpbmcgdGhlICdmJyBzdWZmaXguICAqLwotc3RhdGljIGludCBmbGFnc2hpbW1faGFuZGxlZF9wOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIHNlZW4gYSAncScgc3VmZml4IChjb25kaXRpb24gY29kZSkuICAqLwotc3RhdGljIGludCBjb25kX3A7Ci0KLS8qIE5vbnplcm8gaWYgd2UndmUgaW5zZXJ0ZWQgYSBzaGltbS4gICovCi1zdGF0aWMgaW50IHNoaW1tX3A7Ci0KLS8qIFRoZSB2YWx1ZSBvZiB0aGUgc2hpbW0gd2UgaW5zZXJ0ZWQgKGVhY2ggaW5zbiBvbmx5IGdldHMgb25lIGJ1dCBpdCBjYW4KLSAgIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gICovCi1zdGF0aWMgaW50IHNoaW1tOwotCi0vKiBOb256ZXJvIGlmIHdlJ3ZlIGluc2VydGVkIGEgbGltbSAoZHVyaW5nIGFzc2VtYmx5KSBvciBzZWVuIGEgbGltbQotICAgKGR1cmluZyBkaXNhc3NlbWJseSkuICAqLwotc3RhdGljIGludCBsaW1tX3A7Ci0KLS8qIFRoZSB2YWx1ZSBvZiB0aGUgbGltbSB3ZSBpbnNlcnRlZC4gIEVhY2ggaW5zbiBvbmx5IGdldHMgb25lIGJ1dCBpdCBjYW4KLSAgIGFwcGVhciBtdWx0aXBsZSB0aW1lcy4gICovCi1zdGF0aWMgbG9uZyBsaW1tOwotDAotLyogSW5zZXJ0aW9uIGZ1bmN0aW9ucy4gICovCi0KLS8qIENhbGxlZCBieSB0aGUgYXNzZW1ibGVyIGJlZm9yZSBwYXJzaW5nIGFuIGluc3RydWN0aW9uLiAgKi8KLQotdm9pZAotYXJjX29wY29kZV9pbml0X2luc2VydCAoKQotewotICBmbGFnX3AgPSAwOwotICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMDsKLSAgY29uZF9wID0gMDsKLSAgc2hpbW1fcCA9IDA7Ci0gIGxpbW1fcCA9IDA7Ci19Ci0KLS8qIENhbGxlZCBieSB0aGUgYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGUgaW5zbiBoYXMgYSBsaW1tIG9wZXJhbmQuCi0gICBBbHNvIGNhbGxlZCBieSB0aGUgZGlzYXNzZW1ibGVyIHRvIHNlZSBpZiB0aGUgaW5zbiBjb250YWlucyBhIGxpbW0uICAqLwotCi1pbnQKLWFyY19vcGNvZGVfbGltbV9wIChsaW1tcCkKLSAgICAgbG9uZyAqbGltbXA7Ci17Ci0gIGlmIChsaW1tcCkKLSAgICAqbGltbXAgPSBsaW1tOwotICByZXR1cm4gbGltbV9wOwotfQotCi0vKiBJbnNlcnQgYSB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXIgZmllbGQuCi0gICBJZiBSRUcgaXMgTlVMTCwgdGhlbiB0aGlzIGlzIGFjdHVhbGx5IGEgY29uc3RhbnQuCi0KLSAgIFdlIG11c3QgYWxzbyBoYW5kbGUgYXV4aWxpYXJ5IHJlZ2lzdGVycyBmb3IgbHIvc3IgaW5zbnMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9yZWcgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHN0YXRpYyBjaGFyIGJ1ZlsxMDBdOwotCi0gIGlmIChyZWcgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGEgY29uc3RhbnQgdGhhdCBhbHNvIHJlcXVpcmVzIGEgdmFsdWUgc3RvcmVkIGluIGEgcmVnaXN0ZXIKLQkgZmllbGQuICBIYW5kbGUgdGhlc2UgYnkgdXBkYXRpbmcgdGhlIHJlZ2lzdGVyIGZpZWxkIGFuZCBzYXZpbmcgdGhlCi0JIHZhbHVlIGZvciBsYXRlciBoYW5kbGluZyBieSBlaXRoZXIgJVMgKHNoaW1tKSBvciAlTCAobGltbSkuICAqLwotCi0gICAgICAvKiBUcnkgdG8gdXNlIGEgc2hpbW0gdmFsdWUgYmVmb3JlIGEgbGltbSBvbmUuICAqLwotICAgICAgaWYgKEFSQ19TSElNTV9DT05TVF9QICh2YWx1ZSkKLQkgIC8qIElmIHdlJ3ZlIHNlZW4gYSBjb25kaXRpb25hbCBzdWZmaXggd2UgaGF2ZSB0byB1c2UgYSBsaW1tLiAgKi8KLQkgICYmICFjb25kX3AKLQkgIC8qIElmIHdlIGFscmVhZHkgaGF2ZSBhIHNoaW1tIHZhbHVlIHRoYXQgaXMgZGlmZmVyZW50IHRoYW4gb3VycwotCSAgICAgd2UgaGF2ZSB0byB1c2UgYSBsaW1tLiAgKi8KLQkgICYmICghc2hpbW1fcCB8fCBzaGltbSA9PSB2YWx1ZSkpCi0JewotCSAgaW50IG1hcmtlciA9IGZsYWdfcCA/IEFSQ19SRUdfU0hJTU1fVVBEQVRFIDogQVJDX1JFR19TSElNTTsKLQkgIGZsYWdzaGltbV9oYW5kbGVkX3AgPSAxOwotCSAgc2hpbW1fcCA9IDE7Ci0JICBzaGltbSA9IHZhbHVlOwotCSAgaW5zbiB8PSBtYXJrZXIgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0JICAvKiBpbnNuIHw9IHZhbHVlICYgNTExOyAtIGRvbmUgbGF0ZXIgKi8KLQl9Ci0gICAgICAvKiBXZSBoYXZlIHRvIHVzZSBhIGxpbW0uICBJZiB3ZSd2ZSBhbHJlYWR5IHNlZW4gb25lIHRoZXkgbXVzdCBtYXRjaC4gICovCi0gICAgICBlbHNlIGlmICghbGltbV9wIHx8IGxpbW0gPT0gdmFsdWUpCi0JewotCSAgbGltbV9wID0gMTsKLQkgIGxpbW0gPSB2YWx1ZTsKLQkgIGluc24gfD0gQVJDX1JFR19MSU1NIDw8IG9wZXJhbmQtPnNoaWZ0OwotCSAgLyogVGhlIGNvbnN0YW50IGlzIHN0b3JlZCBsYXRlci4gICovCi0JfQotICAgICAgZWxzZQotCXsKLQkgICplcnJtc2cgPSBfKCJ1bmFibGUgdG8gZml0IGRpZmZlcmVudCB2YWx1ZWQgY29uc3RhbnRzIGludG8gaW5zdHJ1Y3Rpb24iKTsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSB0byBoYW5kbGUgYm90aCBub3JtYWwgYW5kIGF1eGlsaWFyeSByZWdpc3RlcnMuICAqLwotCi0gICAgICBpZiAocmVnLT50eXBlID09IEFVWFJFRykKLQl7Ci0JICBpZiAoIShtb2RzICYgQVJDX01PRF9BVVhSRUcpKQotCSAgICAqZXJybXNnID0gXygiYXV4aWxpYXJ5IHJlZ2lzdGVyIG5vdCBhbGxvd2VkIGhlcmUiKTsKLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc24gfD0gQVJDX1JFR19TSElNTSA8PCBvcGVyYW5kLT5zaGlmdDsKLQkgICAgICBpbnNuIHw9IHJlZy0+dmFsdWUgPDwgYXJjX29wZXJhbmRzW3JlZy0+dHlwZV0uc2hpZnQ7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgLyogV2Ugc2hvdWxkIG5ldmVyIGdldCBhbiBpbnZhbGlkIHJlZ2lzdGVyIG51bWJlciBoZXJlLiAgKi8KLQkgIGlmICgodW5zaWduZWQgaW50KSByZWctPnZhbHVlID4gNjApCi0JICAgIHsKLQkgICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAgIHNwcmludGYgKGJ1ZiwgXygiaW52YWxpZCByZWdpc3RlciBudW1iZXIgYCVkJyIpLCByZWctPnZhbHVlKTsKLQkgICAgICAqZXJybXNnID0gYnVmOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIGluc24gfD0gcmVnLT52YWx1ZSA8PCBvcGVyYW5kLT5zaGlmdDsKLQl9Ci0gICAgfQotCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgd2hlbiB3ZSBzZWUgYW4gJ2YnIGZsYWcuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9mbGFnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICAvKiBXZSBjYW4ndCBzdG9yZSBhbnl0aGluZyBpbiB0aGUgaW5zbiB1bnRpbCB3ZSd2ZSBwYXJzZWQgdGhlIHJlZ2lzdGVycy4KLSAgICAgSnVzdCByZWNvcmQgdGhlIGZhY3QgdGhhdCB3ZSd2ZSBnb3QgdGhpcyBmbGFnLiAgYGluc2VydF9yZWcnIHdpbGwgdXNlIGl0Ci0gICAgIHRvIHN0b3JlIHRoZSBjb3JyZWN0IHZhbHVlIChBUkNfUkVHX1NISU1NX1VQREFURSBvciBiaXQgMHgxMDApLiAgKi8KLSAgZmxhZ19wID0gMTsKLQotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGFmdGVyIGNvbXBsZXRlbHkgYnVpbGRpbmcgYW4gaW5zbiB0byBlbnN1cmUgdGhlICdmJyBmbGFnIGdldHMgc2V0Ci0gICBwcm9wZXJseS4gIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gc2V0IHRoaXMgZmxhZyB1bnRpbAotICAgd2UndmUgcGFyc2VkIHRoZSByZWdpc3RlcnMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9mbGFnZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoZmxhZ19wICYmICFmbGFnc2hpbW1faGFuZGxlZF9wKQotICAgIHsKLSAgICAgIGlmIChzaGltbV9wKQotCWFib3J0ICgpOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgICBpbnNuIHw9ICgxIDw8IG9wZXJhbmQtPnNoaWZ0KTsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgd2hlbiB3ZSBzZWUgYSBjb25kaXRpb25hbCBmbGFnIChlZzogLmVxKS4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2NvbmQgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGNvbmRfcCA9IDE7Ci0gIGluc24gfD0gKHZhbHVlICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpIDw8IG9wZXJhbmQtPnNoaWZ0OwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogVXNlZCBpbiB0aGUgImoiIGluc3RydWN0aW9uIHRvIHByZXZlbnQgY29uc3RhbnRzIGZyb20gYmVpbmcgaW50ZXJwcmV0ZWQgYXMKLSAgIHNoaW1tIHZhbHVlcyAod2hpY2ggdGhlIGp1bXAgaW5zbiBkb2Vzbid0IGFjY2VwdCkuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWQKLSAgIHRvIGZvcmNlIHRoZSB1c2Ugb2YgbGltbSB2YWx1ZXMgaW4gb3RoZXIgc2l0dWF0aW9ucyAoZWc6IGxkIHIwLFtmb29dIHVzZXMKLSAgIHRoaXMpLgotICAgPz8/IFRoZSBtZWNoYW5pc20gaXMgc291bmQuICBBY2Nlc3MgdG8gaXQgaXMgYSBiaXQga2x1bmt5IHJpZ2h0IG5vdy4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2ZvcmNlbGltbSAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgY29uZF9wID0gMTsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIFVzZWQgaW4gbGQvc3QgaW5zbnMgdG8gaGFuZGxlIHRoZSBzaGltbSBvZmZzZXQgZmllbGQuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF9zaGltbW9mZnNldCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgbG9uZyBtaW52YWwsIG1heHZhbDsKLSAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgaWYgKHJlZyAhPSBOVUxMKQotICAgIHsKLSAgICAgICplcnJtc2cgPSAicmVnaXN0ZXIgYXBwZWFycyB3aGVyZSBzaGltbSB2YWx1ZSBleHBlY3RlZCI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogVGhpcyBpcyAqd2F5KiBtb3JlIGdlbmVyYWwgdGhhbiBuZWNlc3NhcnksIGJ1dCBtYXliZSBzb21lIGRheSBpdCdsbAotCSBiZSB1c2VmdWwuICAqLwotICAgICAgaWYgKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCXsKLQkgIG1pbnZhbCA9IC0oMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKTsKLQkgIG1heHZhbCA9ICgxIDw8IChvcGVyYW5kLT5iaXRzIC0gMSkpIC0gMTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgbWludmFsID0gMDsKLQkgIG1heHZhbCA9ICgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMTsKLQl9Ci0gICAgICBpZiAodmFsdWUgPCBtaW52YWwgfHwgdmFsdWUgPiBtYXh2YWwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIHNwcmludGYgKGJ1ZiwgXygidmFsdWUgd29uJ3QgZml0IGluIHJhbmdlICVsZCAtICVsZCIpLAotCQkgICBtaW52YWwsIG1heHZhbCk7Ci0JICAqZXJybXNnID0gYnVmOwotCX0KLSAgICAgIGVsc2UKLQlpbnNuIHw9ICh2YWx1ZSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgICB9Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBVc2VkIGluIGxkL3N0IGluc25zIHdoZW4gdGhlIHNoaW1tIG9mZnNldCBpcyAwLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfc2hpbW16ZXJvIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBzaGltbV9wID0gMTsKLSAgc2hpbW0gPSAwOwotICByZXR1cm4gaW5zbjsKLX0KLQotLyogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyBub3JtYWwgaW5zbnMgKGVnOiBhZGQpIHRvIGluc2VydCBhIHNoaW1tCi0gICB2YWx1ZSAoaWYgcHJlc2VudCkgaW50byB0aGUgaW5zbi4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X3NoaW1tZmluaXNoIChpbnNuLCBvcGVyYW5kLCBtb2RzLCByZWcsIHZhbHVlLCBlcnJtc2cpCi0gICAgIGFyY19pbnNuIGluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqcmVnOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoc2hpbW1fcCkKLSAgICBpbnNuIHw9IChzaGltbSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKSA8PCBvcGVyYW5kLT5zaGlmdDsKLSAgcmV0dXJuIGluc247Ci19Ci0KLS8qIENhbGxlZCBhdCB0aGUgZW5kIG9mIHByb2Nlc3Npbmcgbm9ybWFsIGluc25zIChlZzogYWRkKSB0byBpbnNlcnQgYSBsaW1tCi0gICB2YWx1ZSAoaWYgcHJlc2VudCkgaW50byB0aGUgaW5zbi4KLQotICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCB0byBoYW5kbGUgaW5zdHJ1Y3Rpb25zICh3aXRoIDQgYnl0ZQotICAgaW1tZWRpYXRlIG9wZXJhbmRzKS4gIEl0IGlzIG5vdCBpbnRlbmRlZCB0byBoYW5kbGUgZGF0YS4gICovCi0KLS8qID8/PyBBY3R1YWxseSwgdGhlcmUncyBub3RoaW5nIGZvciB1cyB0byBkbyBhcyB3ZSBjYW4ndCBjYWxsIGZyYWdfbW9yZSwgdGhlCi0gICBjYWxsZXIgbXVzdCBkbyB0aGF0LiAgVGhlIGV4dHJhY3QgZm5zIHRha2UgYSBwb2ludGVyIHRvIHR3byB3b3Jkcy4gIFRoZQotICAgaW5zZXJ0IGZucyBjb3VsZCBiZSBjb252ZXJ0ZWQgYW5kIHRoZW4gd2UgY291bGQgZG8gc29tZXRoaW5nIHVzZWZ1bCwgYnV0Ci0gICB0aGVuIHRoZSByZWxvYyBoYW5kbGVycyB3b3VsZCBoYXZlIHRvIGtub3cgdG8gd29yayBvbiB0aGUgc2Vjb25kIHdvcmQgb2YKLSAgIGEgMiB3b3JkIHF1YW50aXR5LiAgVGhhdCdzIHRvbyBtdWNoIHNvIHdlIGRvbid0IGhhbmRsZSB0aGVtLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfbGltbWZpbmlzaCAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGxpbW1fcCkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8sIGdhcyBkb2VzIGl0ICovCi0gIHJldHVybiBpbnNuOwotfQotCi0vKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB1bmFyeSBvcGVyYW5kIG1hY3JvcyB0byBjb3B5IHRoZSBCIGZpZWxkIHRvIEMuICAqLwotCi1zdGF0aWMgYXJjX2luc24KLWluc2VydF91bm9wbWFjcm8gKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGluc24gfD0gKChpbnNuID4+IEFSQ19TSElGVF9SRUdCKSAmIEFSQ19NQVNLX1JFRykgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBJbnNlcnQgYSByZWxhdGl2ZSBhZGRyZXNzIGZvciBhIGJyYW5jaCBpbnNuIChiLCBibCwgb3IgbHApLiAgKi8KLQotc3RhdGljIGFyY19pbnNuCi1pbnNlcnRfcmVsYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgcmVnLCB2YWx1ZSwgZXJybXNnKQotICAgICBhcmNfaW5zbiBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlICYgMykKLSAgICAqZXJybXNnID0gXygiYnJhbmNoIGFkZHJlc3Mgbm90IG9uIDQgYnl0ZSBib3VuZGFyeSIpOwotICBpbnNuIHw9ICgodmFsdWUgPj4gMikgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSkgPDwgb3BlcmFuZC0+c2hpZnQ7Ci0gIHJldHVybiBpbnNuOwotfQotCi0vKiBJbnNlcnQgYSBsaW1tIHZhbHVlIGFzIGEgMjYgYml0IGFkZHJlc3MgcmlnaHQgc2hpZnRlZCAyIGludG8gdGhlIGluc24uCi0KLSAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgaW50ZW5kZWQgdG8gaGFuZGxlIGluc3RydWN0aW9ucyAod2l0aCA0IGJ5dGUKLSAgIGltbWVkaWF0ZSBvcGVyYW5kcykuICBJdCBpcyBub3QgaW50ZW5kZWQgdG8gaGFuZGxlIGRhdGEuICAqLwotCi0vKiA/Pz8gQWN0dWFsbHksIHRoZXJlJ3Mgbm90aGluZyBmb3IgdXMgdG8gZG8gYXMgd2UgY2FuJ3QgY2FsbCBmcmFnX21vcmUsIHRoZQotICAgY2FsbGVyIG11c3QgZG8gdGhhdC4gIFRoZSBleHRyYWN0IGZucyB0YWtlIGEgcG9pbnRlciB0byB0d28gd29yZHMuICBUaGUKLSAgIGluc2VydCBmbnMgY291bGQgYmUgY29udmVydGVkIGFuZCB0aGVuIHdlIGNvdWxkIGRvIHNvbWV0aGluZyB1c2VmdWwsIGJ1dAotICAgdGhlbiB0aGUgcmVsb2MgaGFuZGxlcnMgd291bGQgaGF2ZSB0byBrbm93IHRvIHdvcmsgb24gdGhlIHNlY29uZCB3b3JkIG9mCi0gICBhIDIgd29yZCBxdWFudGl0eS4gIFRoYXQncyB0b28gbXVjaCBzbyB3ZSBkb24ndCBoYW5kbGUgdGhlbS4gICovCi0KLXN0YXRpYyBhcmNfaW5zbgotaW5zZXJ0X2Fic2FkZHIgKGluc24sIG9wZXJhbmQsIG1vZHMsIHJlZywgdmFsdWUsIGVycm1zZykKLSAgICAgYXJjX2luc24gaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kICpvcGVyYW5kOwotICAgICBpbnQgbW9kczsKLSAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWc7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChsaW1tX3ApCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIHJldHVybiBpbnNuOwotfQotDAotLyogRXh0cmFjdGlvbiBmdW5jdGlvbnMuCi0KLSAgIFRoZSBzdWZmaXggZXh0cmFjdGlvbiBmdW5jdGlvbnMnIHJldHVybiB2YWx1ZSBpcyByZWR1bmRhbnQgc2luY2UgaXQgY2FuIGJlCi0gICBvYnRhaW5lZCBmcm9tICgqT1BWQUwpLT52YWx1ZS4gIEhvd2V2ZXIsIHRoZSBib29sZWFuIHN1ZmZpeGVzIGRvbid0IGhhdmUKLSAgIGEgc3VmZml4IHRhYmxlIGVudHJ5IGZvciB0aGUgImZhbHNlIiBjYXNlLCBzbyB2YWx1ZXMgb2YgemVybyBtdXN0IGJlCi0gICBvYnRhaW5lZCBmcm9tIHRoZSByZXR1cm4gdmFsdWUgKCpPUFZBTCA9PSBOVUxMKS4gICovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKmxvb2t1cF9yZWdpc3RlciAoaW50IHR5cGUsIGxvbmcgcmVnbm8pOwotCi0vKiBDYWxsZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBiZWZvcmUgcHJpbnRpbmcgYW4gaW5zdHJ1Y3Rpb24uICAqLwotCi12b2lkCi1hcmNfb3Bjb2RlX2luaXRfZXh0cmFjdCAoKQotewotICBmbGFnX3AgPSAwOwotICBmbGFnc2hpbW1faGFuZGxlZF9wID0gMDsKLSAgc2hpbW1fcCA9IDA7Ci0gIGxpbW1fcCA9IDA7Ci19Ci0KLS8qIEFzIHdlJ3JlIGV4dHJhY3RpbmcgcmVnaXN0ZXJzLCBrZWVwIGFuIGV5ZSBvdXQgZm9yIHRoZSAnZicgaW5kaWNhdG9yCi0gICAoQVJDX1JFR19TSElNTV9VUERBVEUpLiAgSWYgd2UgZmluZCBhIHJlZ2lzdGVyIChub3QgYSBjb25zdGFudCBtYXJrZXIsCi0gICBsaWtlIEFSQ19SRUdfU0hJTU0pLCBzZXQgT1BWQUwgc28gb3VyIGNhbGxlciB3aWxsIGtub3cgdGhpcyBpcyBhIHJlZ2lzdGVyLgotCi0gICBXZSBtdXN0IGFsc28gaGFuZGxlIGF1eGlsaWFyeSByZWdpc3RlcnMgZm9yIGxyL3NyIGluc25zLiAgVGhleSBhcmUganVzdAotICAgY29uc3RhbnRzIHdpdGggc3BlY2lhbCBuYW1lcy4gICovCi0KLXN0YXRpYyBsb25nCi1leHRyYWN0X3JlZyAoaW5zbiwgb3BlcmFuZCwgbW9kcywgb3B2YWwsIGludmFsaWQpCi0gICAgIGFyY19pbnNuICppbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbDsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpbnQgcmVnbm87Ci0gIGxvbmcgdmFsdWU7Ci0KLSAgLyogR2V0IHRoZSByZWdpc3RlciBudW1iZXIuICAqLwotICByZWdubyA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCi0gIC8qIElzIGl0IGEgY29uc3RhbnQgbWFya2VyPyAgKi8KLSAgaWYgKHJlZ25vID09IEFSQ19SRUdfU0hJTU0pCi0gICAgewotICAgICAgdmFsdWUgPSBpbnNuWzBdICYgNTExOwotICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIEFSQ19PUEVSQU5EX1NJR05FRCkKLQkgICYmICh2YWx1ZSAmIDI1NikpCi0JdmFsdWUgLT0gNTEyOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA9PSBBUkNfUkVHX1NISU1NX1VQREFURSkKLSAgICB7Ci0gICAgICB2YWx1ZSA9IGluc25bMF0gJiA1MTE7Ci0gICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotCSAgJiYgKHZhbHVlICYgMjU2KSkKLQl2YWx1ZSAtPSA1MTI7Ci0gICAgICBmbGFnX3AgPSAxOwotICAgICAgZmxhZ3NoaW1tX2hhbmRsZWRfcCA9IDE7Ci0gICAgfQotICBlbHNlIGlmIChyZWdubyA9PSBBUkNfUkVHX0xJTU0pCi0gICAgewotICAgICAgdmFsdWUgPSBpbnNuWzFdOwotICAgICAgbGltbV9wID0gMTsKLSAgICB9Ci0gIC8qIEl0J3MgYSByZWdpc3Rlciwgc2V0IE9QVkFMICh0aGF0J3MgdGhlIG9ubHkgd2F5IHdlIGRpc3Rpbmd1aXNoIHJlZ2lzdGVycwotICAgICBmcm9tIGNvbnN0YW50cyBoZXJlKS4gICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnJlZyA9IGxvb2t1cF9yZWdpc3RlciAoUkVHLCByZWdubyk7Ci0KLSAgICAgIGlmIChyZWcgPT0gTlVMTCkKLQlhYm9ydCAoKTsKLSAgICAgIGlmIChvcHZhbCAhPSBOVUxMKQotCSpvcHZhbCA9IHJlZzsKLSAgICAgIHZhbHVlID0gcmVnbm87Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgZmllbGQgdGFrZXMgYW4gYXV4aWxpYXJ5IHJlZ2lzdGVyLCBzZWUgaWYgaXQncyBhIGtub3duIG9uZS4gICovCi0gIGlmICgobW9kcyAmIEFSQ19NT0RfQVVYUkVHKQotICAgICAgJiYgQVJDX1JFR19DT05TVEFOVF9QIChyZWdubykpCi0gICAgewotICAgICAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICpyZWcgPSBsb29rdXBfcmVnaXN0ZXIgKEFVWFJFRywgdmFsdWUpOwotCi0gICAgICAvKiBUaGlzIGlzIHJlYWxseSBhIGNvbnN0YW50LCBidXQgdGVsbCB0aGUgY2FsbGVyIGl0IGhhcyBhIHNwZWNpYWwKLQkgbmFtZS4gICovCi0gICAgICBpZiAocmVnICE9IE5VTEwgJiYgb3B2YWwgIT0gTlVMTCkKLQkqb3B2YWwgPSByZWc7Ci0gICAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgImZsYWcgdXBkYXRlIiBmaWVsZCBmb3Igc2hpbW0gaW5zbnMuCi0gICBUaGlzIHZhbHVlIGlzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgZmllbGQuICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9mbGFnIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGludCBmOwotICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnZhbDsKLQotICBpZiAoZmxhZ3NoaW1tX2hhbmRsZWRfcCkKLSAgICBmID0gZmxhZ19wICE9IDA7Ci0gIGVsc2UKLSAgICBmID0gKGluc25bMF0gJiAoMSA8PCBvcGVyYW5kLT5zaGlmdCkpICE9IDA7Ci0KLSAgLyogVGhlcmUgaXMgbm8gdGV4dCBmb3IgemVybyB2YWx1ZXMuICAqLwotICBpZiAoZiA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIHZhbCA9IGFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAob3BlcmFuZCwgMSk7Ci0gIGlmIChvcHZhbCAhPSBOVUxMICYmIHZhbCAhPSBOVUxMKQotICAgICpvcHZhbCA9IHZhbDsKLSAgcmV0dXJuIHZhbC0+dmFsdWU7Ci19Ci0KLS8qIEV4dHJhY3QgdGhlIGNvbmRpdGlvbiBjb2RlIChpZiBpdCBleGlzdHMpLgotICAgSWYgd2UndmUgc2VlbiBhIHNoaW1tIHZhbHVlIGluIHRoaXMgaW5zbiAobWVhbmluZyB0aGF0IHRoZSBpbnNuIGNhbid0IGhhdmUKLSAgIGEgY29uZGl0aW9uIGNvZGUgZmllbGQpLCB0aGVuIHdlIGRvbid0IHN0b3JlIGFueXRoaW5nIGluIE9QVkFMIGFuZCByZXR1cm4KLSAgIHplcm8uICAqLwotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9jb25kIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgY29uZDsKLSAgY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICp2YWw7Ci0KLSAgaWYgKGZsYWdzaGltbV9oYW5kbGVkX3ApCi0gICAgcmV0dXJuIDA7Ci0KLSAgY29uZCA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICB2YWwgPSBhcmNfb3Bjb2RlX2xvb2t1cF9zdWZmaXggKG9wZXJhbmQsIGNvbmQpOwotCi0gIC8qIElnbm9yZSBOVUxMIHZhbHVlcyBvZiBgdmFsJy4gIFNldmVyYWwgY29uZGl0aW9uIGNvZGUgdmFsdWVzIGFyZQotICAgICByZXNlcnZlZCBmb3IgZXh0ZW5zaW9ucy4gICovCi0gIGlmIChvcHZhbCAhPSBOVUxMICYmIHZhbCAhPSBOVUxMKQotICAgICpvcHZhbCA9IHZhbDsKLSAgcmV0dXJuIGNvbmQ7Ci19Ci0KLS8qIEV4dHJhY3QgYSBicmFuY2ggYWRkcmVzcy4KLSAgIFdlIHJldHVybiB0aGUgdmFsdWUgYXMgYSByZWFsIGFkZHJlc3MgKG5vdCByaWdodCBzaGlmdGVkIGJ5IDIpLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmVsYWRkciAoaW5zbiwgb3BlcmFuZCwgbW9kcywgb3B2YWwsIGludmFsaWQpCi0gICAgIGFyY19pbnNuICppbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGludCBtb2RzOwotICAgICBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKipvcHZhbDsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBsb25nIGFkZHI7Ci0KLSAgYWRkciA9IChpbnNuWzBdID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgQVJDX09QRVJBTkRfU0lHTkVEKQotICAgICAgJiYgKGFkZHIgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkpCi0gICAgYWRkciAtPSAxIDw8IG9wZXJhbmQtPmJpdHM7Ci0KLSAgcmV0dXJuIGFkZHIgPDwgMjsKLX0KLQotLyogVGhlIG9ubHkgdGhpbmcgdGhpcyBkb2VzIGlzIHNldCB0aGUgYGludmFsaWQnIGZsYWcgaWYgQiAhPSBDLgotICAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgIm1vdiIgbWFjcm8gYXBwZWFycyBiZWZvcmUgaXQncyByZWFsIGluc24gImFuZCIKLSAgIGFuZCB3ZSBkb24ndCB3YW50IHRoZSBkaXNhc3NlbWJsZXIgdG8gY29uZnVzZSB0aGVtLiAgKi8KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfdW5vcG1hY3JvIChpbnNuLCBvcGVyYW5kLCBtb2RzLCBvcHZhbCwgaW52YWxpZCkKLSAgICAgYXJjX2luc24gKmluc247Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqb3BlcmFuZDsKLSAgICAgaW50IG1vZHM7Ci0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqKm9wdmFsOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIC8qIFRoaXMgbWlzc2VzIHRoZSBjYXNlIHdoZXJlIEIgPT0gQVJDX1JFR19TSElNTV9VUERBVEUgJiYKLSAgICAgQyA9PSBBUkNfUkVHX1NISU1NIChvciB2aWNlIHZlcnNhKS4gIE5vIGJpZyBkZWFsLiAgVGhvc2UgaW5zbnMgd2lsbCBnZXQKLSAgICAgcHJpbnRlZCBhcyAiYW5kInMuICAqLwotICBpZiAoKChpbnNuWzBdID4+IEFSQ19TSElGVF9SRUdCKSAmIEFSQ19NQVNLX1JFRykKLSAgICAgICE9ICgoaW5zblswXSA+PiBBUkNfU0hJRlRfUkVHQykgJiBBUkNfTUFTS19SRUcpKQotICAgIGlmIChpbnZhbGlkICE9IE5VTEwpCi0gICAgICAqaW52YWxpZCA9IDE7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFV0aWxpdHkgZm9yIHRoZSBleHRyYWN0aW9uIGZ1bmN0aW9ucyB0byByZXR1cm4gdGhlIGluZGV4IGludG8KLSAgIGBhcmNfc3VmZml4ZXMnLiAgKi8KLQotY29uc3Qgc3RydWN0IGFyY19vcGVyYW5kX3ZhbHVlICoKLWFyY19vcGNvZGVfbG9va3VwX3N1ZmZpeCAodHlwZSwgdmFsdWUpCi0gICAgIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZCAqdHlwZTsKLSAgICAgaW50IHZhbHVlOwotewotICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKnYsKmVuZDsKLQotICAvKiA/Pz8gVGhpcyBpcyBhIGxpdHRsZSBzbG93IGFuZCBjYW4gYmUgc3BlZWRlZCB1cC4gICovCi0KLSAgZm9yICh2ID0gYXJjX3N1ZmZpeGVzLCBlbmQgPSBhcmNfc3VmZml4ZXMgKyBhcmNfc3VmZml4ZXNfY291bnQ7IHYgPCBlbmQ7ICsrdikKLSAgICBpZiAodHlwZSA9PSAmYXJjX29wZXJhbmRzW3YtPnR5cGVdCi0JJiYgdmFsdWUgPT0gdi0+dmFsdWUpCi0gICAgICByZXR1cm4gdjsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXJjX29wZXJhbmRfdmFsdWUgKgotbG9va3VwX3JlZ2lzdGVyICh0eXBlLCByZWdubykKLSAgICAgaW50IHR5cGU7Ci0gICAgIGxvbmcgcmVnbm87Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBhcmNfb3BlcmFuZF92YWx1ZSAqciwqZW5kOwotCi0gIGlmICh0eXBlID09IFJFRykKLSAgICByZXR1cm4gJmFyY19yZWdfbmFtZXNbcmVnbm9dOwotCi0gIC8qID8/PyBUaGlzIGlzIGEgbGl0dGxlIHNsb3cgYW5kIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLQotICBmb3IgKHIgPSBhcmNfcmVnX25hbWVzLCBlbmQgPSBhcmNfcmVnX25hbWVzICsgYXJjX3JlZ19uYW1lc19jb3VudDsKLSAgICAgICByIDwgZW5kOyArK3IpCi0gICAgaWYgKHR5cGUgPT0gci0+dHlwZQkmJiByZWdubyA9PSByLT52YWx1ZSkKLSAgICAgIHJldHVybiByOwotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJtLWRpcy5jIGIvb3Bjb2Rlcy9hcm0tZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTM1OTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcm0tZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjEgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gcHJpbnRpbmcgY29kZSBmb3IgdGhlIEFSTQotICAgQ29weXJpZ2h0IChDKSAxOTk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gCi0gICBDb250cmlidXRlZCBieSBSaWNoYXJkIEVhcm5zaGF3IChyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnKQotICAgTW9kaWZpY2F0aW9uIGJ5IEphbWVzIEcuIFNtaXRoIChqc21pdGhAY3lnbnVzLmNvLnVrKQotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBsaWJvcGNvZGVzLiAKLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLXRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4gCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi1GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi1tb3JlIGRldGFpbHMuIAotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2RlZmluZSBERUZJTkVfVEFCTEUKLSNpbmNsdWRlICJhcm0tb3BjLmgiCi0jaW5jbHVkZSAiY29mZi9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmNvZmYuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogRklYTUU6IFRoaXMgc2hvdWxkbid0IGJlIGRvbmUgaGVyZSAqLwotI2luY2x1ZGUgImVsZi1iZmQuaCIKLSNpbmNsdWRlICJlbGYvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJlbGYvYXJtLmgiCi0KLXN0YXRpYyBjaGFyICogYXJtX2NvbmRpdGlvbmFsW10gPQoteyJlcSIsICJuZSIsICJjcyIsICJjYyIsICJtaSIsICJwbCIsICJ2cyIsICJ2YyIsCi0gImhpIiwgImxzIiwgImdlIiwgImx0IiwgImd0IiwgImxlIiwgIiIsICJudiJ9OwotCi1zdGF0aWMgY2hhciAqIGFybV9yZWduYW1lc19yYXdbXSA9Ci17InIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAicjEzIiwgInIxNCIsICJyMTUifTsKLQotc3RhdGljIGNoYXIgKiBhcm1fcmVnbmFtZXNfc3RhbmRhcmRbXSA9Ci17InIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAicjgiLCAicjkiLCAicjEwIiwgInIxMSIsICJyMTIiLCAic3AiLCAibHIiLCAicGMifTsKLQotc3RhdGljIGNoYXIgKiBhcm1fcmVnbmFtZXNfYXBjc1tdID0KLXsiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAidjEiLCAidjIiLCAidjMiLCAidjQiLAotICJ2NSIsICJ2NiIsICJzbCIsICJmcCIsICJpcCIsICJzcCIsICJsciIsICJwYyJ9OwotCi0vKiBDaG9vc2Ugd2hpY2ggcmVnaXN0ZXIgbmFtZSBzZXQgdG8gdXNlLiAgKi8KLXN0YXRpYyBjaGFyICoqIGFybV9yZWduYW1lcyA9IGFybV9yZWduYW1lc19zdGFuZGFyZDsKLQotc3RhdGljIGNoYXIgKiBhcm1fZnBfY29uc3RbXSA9Ci17IjAuMCIsICIxLjAiLCAiMi4wIiwgIjMuMCIsICI0LjAiLCAiNS4wIiwgIjAuNSIsICIxMC4wIn07Ci0KLXN0YXRpYyBjaGFyICogYXJtX3NoaWZ0W10gPSAKLXsibHNsIiwgImxzciIsICJhc3IiLCAicm9yIn07Ci0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcm0KLSAgUEFSQU1TICgoYmZkX3ZtYSwgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgbG9uZykpOwotCi1zdGF0aWMgdm9pZAotYXJtX2RlY29kZV9zaGlmdCAoZ2l2ZW4sIGZ1bmMsIHN0cmVhbSkKLSAgICAgbG9uZyBnaXZlbjsKLSAgICAgZnByaW50Zl9mdHlwZSBmdW5jOwotICAgICB2b2lkICogc3RyZWFtOwotewotICBmdW5jIChzdHJlYW0sICIlcyIsIGFybV9yZWduYW1lc1tnaXZlbiAmIDB4Zl0pOwotICAKLSAgaWYgKChnaXZlbiAmIDB4ZmYwKSAhPSAwKQotICAgIHsKLSAgICAgIGlmICgoZ2l2ZW4gJiAweDEwKSA9PSAwKQotCXsKLQkgIGludCBhbW91bnQgPSAoZ2l2ZW4gJiAweGY4MCkgPj4gNzsKLQkgIGludCBzaGlmdCA9IChnaXZlbiAmIDB4NjApID4+IDU7Ci0JICAKLQkgIGlmIChhbW91bnQgPT0gMCkKLQkgICAgewotCSAgICAgIGlmIChzaGlmdCA9PSAzKQotCQl7Ci0JCSAgZnVuYyAoc3RyZWFtLCAiLCBycngiKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICAKLQkgICAgICBhbW91bnQgPSAzMjsKLQkgICAgfQotCSAgCi0JICBmdW5jIChzdHJlYW0sICIsICVzICMlZCIsIGFybV9zaGlmdFtzaGlmdF0sIGFtb3VudCk7Ci0JfQotICAgICAgZWxzZQotCWZ1bmMgKHN0cmVhbSwgIiwgJXMgJXMiLCBhcm1fc2hpZnRbKGdpdmVuICYgMHg2MCkgPj4gNV0sCi0JICAgICAgYXJtX3JlZ25hbWVzWyhnaXZlbiAmIDB4ZjAwKSA+PiA4XSk7Ci0gICAgfQotfQotCi0vKiBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChhbHdheXMgNCBvbiBBUk0pLiAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKQotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgIHBjOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci0gICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW47Ci17Ci0gIHN0cnVjdCBhcm1fb3Bjb2RlICogIGluc247Ci0gIHZvaWQgKiAgICAgICAgICAgICAgIHN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgZnByaW50Zl9mdHlwZSAgICAgICAgZnVuYyAgID0gaW5mby0+ZnByaW50Zl9mdW5jOwotCi0gIGZvciAoaW5zbiA9IGFybV9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKLSAgICB7Ci0gICAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCi0JewotCSAgY2hhciAqIGM7Ci0JICAKLQkgIGZvciAoYyA9IGluc24tPmFzc2VtYmxlcjsgKmM7IGMrKykKLQkgICAgewotCSAgICAgIGlmICgqYyA9PSAnJScpCi0JCXsKLQkJICBzd2l0Y2ggKCorK2MpCi0JCSAgICB7Ci0JCSAgICBjYXNlICclJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJSUiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ2EnOgotCQkgICAgICBpZiAoKChnaXZlbiAmIDB4MDAwZjAwMDApID09IDB4MDAwZjAwMDApCi0JCQkgICYmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKSkKLQkJCXsKLQkJCSAgaW50IG9mZnNldCA9IGdpdmVuICYgMHhmZmY7Ci0JCQkgIAotCQkJICBmdW5jIChzdHJlYW0sICJbcGMiKTsKLSAKLQkJCSAgaWYgKGdpdmVuICYgMHgwMTAwMDAwMCkKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQlvZmZzZXQgPSAtIG9mZnNldDsKLQkJCSAgCi0JCQkgICAgICAvKiBwcmUtaW5kZXhlZCAqLwotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiLCAjJXhdIiwgb2Zmc2V0KTsKLQotCQkJICAgICAgb2Zmc2V0ICs9IHBjICsgODsKLQotCQkJICAgICAgLyogQ29wZSB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiB3cml0ZS1iYWNrIGJlaW5nIHVzZWQuCi0JCQkJIFByb2JhYmx5IGEgdmVyeSBkYW5nZXJvdXMgdGhpbmcgZm9yIHRoZSBwcm9ncmFtbWVyCi0JCQkJIHRvIGRvLCBidXQgd2hvIGFyZSB3ZSB0byBhcmd1ZSA/ICAqLwotCQkJICAgICAgaWYgKGdpdmVuICYgMHgwMDIwMDAwMCkKLQkJCQlmdW5jIChzdHJlYW0sICIhIik7Ci0JCQkgICAgfQotCQkJICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgLyogcG9zdCBpbmRleGVkICovCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdLCAjJXgiLCBvZmZzZXQpOwotCi0JCQkgICAgICBvZmZzZXQgPSBwYyArIDg7ICAvKiBpZSBpZ25vcmUgdGhlIG9mZnNldCAqLwotCQkJICAgIH0KLQkJCSAgCi0JCQkgIGZ1bmMgKHN0cmVhbSwgIlx0OyAiKTsKLQkJCSAgaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jIChvZmZzZXQsIGluZm8pOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIlslcyIsIAotCQkJCWFybV9yZWduYW1lc1soZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCQkgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJICAgIHsKLQkJCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAyMDAwMDAwKSA9PSAwKQotCQkJCXsKLQkJCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmZmOwotCQkJCSAgaWYgKG9mZnNldCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiLCAlcyMlZCIsCi0JCQkJCSAgKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgICA/ICItIiA6ICIiKSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQkgICAgICBlbHNlCi0JCQkJewotCQkJCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJID8gIi0iIDogIiIpKTsKLQkJCQkgIGFybV9kZWNvZGVfc2hpZnQgKGdpdmVuLCBmdW5jLCBzdHJlYW0pOwotCQkJCX0KLQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiXSVzIiwgCi0JCQkJICAgICgoZ2l2ZW4gJiAweDAwMjAwMDAwKSAhPSAwKSA/ICIhIiA6ICIiKTsKLQkJCSAgICB9Ci0JCQkgIGVsc2UKLQkJCSAgICB7Ci0JCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMjAwMDAwMCkgPT0gMCkKLQkJCQl7Ci0JCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmZjsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCSAgZWxzZSAKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0JCQkJICBmdW5jIChzdHJlYW0sICJdLCAlcyIsCi0JCQkJCSgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkgCi0JCQkJCSA/ICItIiA6ICIiKSk7Ci0JCQkJICBhcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmIDB4MDA0ZjAwMDApID09IDB4MDA0ZjAwMDApCi0JCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBDIHJlbGF0aXZlIHdpdGggaW1tZWRpYXRlIG9mZnNldCAqLwotCQkJICBpbnQgb2Zmc2V0ID0gKChnaXZlbiAmIDB4ZjAwKSA+PiA0KSB8IChnaXZlbiAmIDB4Zik7Ci0JCQkgIAotCQkJICBpZiAoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCSAgICBvZmZzZXQgPSAtb2Zmc2V0OwotCQkJICAKLQkJCSAgZnVuYyAoc3RyZWFtLCAiW3BjLCAjJXhdXHQ7ICIsIG9mZnNldCk7Ci0JCQkgIAotCQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLQkJCSAgICAob2Zmc2V0ICsgcGMgKyA4LCBpbmZvKTsKLQkJCX0KLQkJICAgICAgZWxzZQotCQkJewotCQkJICBmdW5jIChzdHJlYW0sICJbJXMiLCAKLQkJCQlhcm1fcmVnbmFtZXNbKGdpdmVuID4+IDE2KSAmIDB4Zl0pOwotCQkJICBpZiAoKGdpdmVuICYgMHgwMTAwMDAwMCkgIT0gMCkKLQkJCSAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmUtaW5kZXhlZCAqLwotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDA0MDAwMDApID09IDB4MDA0MDAwMDApCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiwgJXMjJWQiLAotCQkJCQkgICgoKGdpdmVuICYgMHgwMDgwMDAwMCkgPT0gMCkKLQkJCQkJICAgPyAiLSIgOiAiIiksIG9mZnNldCk7Ci0JCQkJfQotCQkJICAgICAgZWxzZQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWdpc3RlciAqLwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiLCAlcyVzIiwKLQkJCQkJKCgoZ2l2ZW4gJiAweDAwODAwMDAwKSA9PSAwKQotCQkJCQkgPyAiLSIgOiAiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtX3JlZ25hbWVzW2dpdmVuICYgMHhmXSk7Ci0JCQkJfQotCi0JCQkgICAgICBmdW5jIChzdHJlYW0sICJdJXMiLCAKLQkJCQkgICAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDApID8gIiEiIDogIiIpOwotCQkJICAgIH0KLQkJCSAgZWxzZQotCQkJICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvc3QtaW5kZXhlZCAqLwotCQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDA0MDAwMDApID09IDB4MDA0MDAwMDApCi0JCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltbWVkaWF0ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAoKGdpdmVuICYgMHhmMDApID4+IDQpIHwgKGdpdmVuICYgMHhmKTsKLQkJCQkgIGlmIChvZmZzZXQpCi0JCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0sICVzIyVkIiwKLQkJCQkJICAoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSAgID8gIi0iIDogIiIpLCBvZmZzZXQpOwotCQkJCSAgZWxzZSAKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJCX0KLQkJCSAgICAgIGVsc2UKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVnaXN0ZXIgKi8KLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIl0sICVzJXMiLAotCQkJCQkoKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDApCi0JCQkJCSA/ICItIiA6ICIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fcmVnbmFtZXNbZ2l2ZW4gJiAweGZdKTsKLQkJCQl9Ci0JCQkgICAgfQotCQkJfQotCQkgICAgICBicmVhazsKLQkJCSAgCi0JCSAgICBjYXNlICdiJzoKLQkJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JCQkoQkRJU1AgKGdpdmVuKSAqIDQgKyBwYyArIDgsIGluZm8pOwotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnYyc6Ci0JCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwKLQkJCSAgICBhcm1fY29uZGl0aW9uYWwgWyhnaXZlbiA+PiAyOCkgJiAweGZdKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ20nOgotCQkgICAgICB7Ci0JCQlpbnQgc3RhcnRlZCA9IDA7Ci0JCQlpbnQgcmVnOwotCi0JCQlmdW5jIChzdHJlYW0sICJ7Iik7Ci0JCQlmb3IgKHJlZyA9IDA7IHJlZyA8IDE2OyByZWcrKykKLQkJCSAgaWYgKChnaXZlbiAmICgxIDw8IHJlZykpICE9IDApCi0JCQkgICAgewotCQkJICAgICAgaWYgKHN0YXJ0ZWQpCi0JCQkJZnVuYyAoc3RyZWFtLCAiLCAiKTsKLQkJCSAgICAgIHN0YXJ0ZWQgPSAxOwotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0JCQkgICAgfQotCQkJZnVuYyAoc3RyZWFtLCAifSIpOwotCQkgICAgICB9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdvJzoKLQkJICAgICAgaWYgKChnaXZlbiAmIDB4MDIwMDAwMDApICE9IDApCi0JCQl7Ci0JCQkgIGludCByb3RhdGUgPSAoZ2l2ZW4gJiAweGYwMCkgPj4gNzsKLQkJCSAgaW50IGltbWVkID0gKGdpdmVuICYgMHhmZik7Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIiMlZCIsCi0JCQkJKChpbW1lZCA8PCAoMzIgLSByb3RhdGUpKQotCQkJCSB8IChpbW1lZCA+PiByb3RhdGUpKSAmIDB4ZmZmZmZmZmYpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQlhcm1fZGVjb2RlX3NoaWZ0IChnaXZlbiwgZnVuYywgc3RyZWFtKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3AnOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDAwZjAwMCkgPT0gMHgwMDAwZjAwMCkKLQkJCWZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ3QnOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMTIwMDAwMCkgPT0gMHgwMDIwMDAwMCkKLQkJCWZ1bmMgKHN0cmVhbSwgInQiKTsKLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ2gnOgotCQkgICAgICBpZiAoKGdpdmVuICYgMHgwMDAwMDAyMCkgPT0gMHgwMDAwMDAyMCkKLQkJCWZ1bmMgKHN0cmVhbSwgImgiKTsKLSAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJiIik7Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdBJzoKLQkJICAgICAgZnVuYyAoc3RyZWFtLCAiWyVzIiwgYXJtX3JlZ25hbWVzIFsoZ2l2ZW4gPj4gMTYpICYgMHhmXSk7Ci0JCSAgICAgIGlmICgoZ2l2ZW4gJiAweDAxMDAwMDAwKSAhPSAwKQotCQkJewotCQkJICBpbnQgb2Zmc2V0ID0gZ2l2ZW4gJiAweGZmOwotCQkJICBpZiAob2Zmc2V0KQotCQkJICAgIGZ1bmMgKHN0cmVhbSwgIiwgJXMjJWRdJXMiLAotCQkJCSAgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDAgPyAiLSIgOiAiIiksCi0JCQkJICBvZmZzZXQgKiA0LAotCQkJCSAgKChnaXZlbiAmIDB4MDAyMDAwMDApICE9IDAgPyAiISIgOiAiIikpOwotCQkJICBlbHNlCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiXSIpOwotCQkJfQotCQkgICAgICBlbHNlCi0JCQl7Ci0JCQkgIGludCBvZmZzZXQgPSBnaXZlbiAmIDB4ZmY7Ci0JCQkgIGlmIChvZmZzZXQpCi0JCQkgICAgZnVuYyAoc3RyZWFtLCAiXSwgJXMjJWQiLAotCQkJCSAgKChnaXZlbiAmIDB4MDA4MDAwMDApID09IDAgPyAiLSIgOiAiIiksCi0JCQkJICBvZmZzZXQgKiA0KTsKLQkJCSAgZWxzZQotCQkJICAgIGZ1bmMgKHN0cmVhbSwgIl0iKTsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0KLQkJICAgIGNhc2UgJ0MnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDA5MDAwMCkKLQkJCXsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl8/Pz8iKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4OTAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl9hbGwiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4MTAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl9jdGwiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIl9mbGciKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCi0JCSAgICBjYXNlICdGJzoKLQkJICAgICAgc3dpdGNoIChnaXZlbiAmIDB4MDA0MDgwMDApCi0JCQl7Ci0JCQljYXNlIDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIjQiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4ODAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMSIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDQwMDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiMiIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIjMiKTsKLQkJCX0KLQkJICAgICAgYnJlYWs7Ci0JCQkKLQkJICAgIGNhc2UgJ1AnOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHgwMDA4MDA4MCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAicyIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHg4MDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZCIpOwotCQkJICBicmVhazsKLQkJCWNhc2UgMHgwMDA4MDAwMDoKLQkJCSAgZnVuYyAoc3RyZWFtLCAiZSIpOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgXygiPGlsbGVnYWwgcHJlY2lzaW9uPiIpKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUSc6Ci0JCSAgICAgIHN3aXRjaCAoZ2l2ZW4gJiAweDAwNDA4MDAwKQotCQkJewotCQkJY2FzZSAwOgotCQkJICBmdW5jIChzdHJlYW0sICJzIik7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAweDgwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgImQiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4MDA0MDAwMDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgImUiKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBmdW5jIChzdHJlYW0sICJwIik7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgJ1InOgotCQkgICAgICBzd2l0Y2ggKGdpdmVuICYgMHg2MCkKLQkJCXsKLQkJCWNhc2UgMDoKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4MjA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgInAiKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDB4NDA6Ci0JCQkgIGZ1bmMgKHN0cmVhbSwgIm0iKTsKLQkJCSAgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJICBmdW5jIChzdHJlYW0sICJ6Iik7Ci0JCQkgIGJyZWFrOwotCQkJfQotCQkgICAgICBicmVhazsKLQotCQkgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiAKLQkJICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLQkJICAgICAgewotCQkJaW50IGJpdHN0YXJ0ID0gKmMrKyAtICcwJzsKLQkJCWludCBiaXRlbmQgPSAwOwotCQkJd2hpbGUgKCpjID49ICcwJyAmJiAqYyA8PSAnOScpCi0JCQkgIGJpdHN0YXJ0ID0gKGJpdHN0YXJ0ICogMTApICsgKmMrKyAtICcwJzsKLQotCQkJc3dpdGNoICgqYykKLQkJCSAgewotCQkJICBjYXNlICctJzoKLQkJCSAgICBjKys7Ci0JCQkgICAgd2hpbGUgKCpjID49ICcwJyAmJiAqYyA8PSAnOScpCi0JCQkgICAgICBiaXRlbmQgPSAoYml0ZW5kICogMTApICsgKmMrKyAtICcwJzsKLQkJCSAgICBpZiAoIWJpdGVuZCkKLQkJCSAgICAgIGFib3J0ICgpOwotCQkJICAgIHN3aXRjaCAoKmMpCi0JCQkgICAgICB7Ci0JCQkgICAgICBjYXNlICdyJzoKLQkJCQl7Ci0JCQkJICBsb25nIHJlZzsKLQkJCQkgIHJlZyA9IGdpdmVuID4+IGJpdHN0YXJ0OwotCQkJCSAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLQkJCQkgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ2QnOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiJWQiLCByZWcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgJ3gnOgotCQkJCXsKLQkJCQkgIGxvbmcgcmVnOwotCQkJCSAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0JCQkJICByZWcgJj0gKDIgPDwgKGJpdGVuZCAtIGJpdHN0YXJ0KSkgLSAxOwotCQkJCSAgZnVuYyAoc3RyZWFtLCAiMHglMDh4IiwgcmVnKTsKLQkJCQkgIAotCQkJCSAgLyogU29tZSBTV0kgaW5zdHJ1Y3Rpb25zIGhhdmUgc3BlY2lhbCBtZWFuaW5ncy4gICovCi0JCQkJICBpZiAoKGdpdmVuICYgMHgwZmZmZmZmZikgPT0gMHgwRkYwMDAwMCkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQiIpOwotCQkJCSAgZWxzZSBpZiAoKGdpdmVuICYgMHgwZmZmZmZmZikgPT0gMHgwRkYwMDAwMSkKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiXHQ7IElNQlJhbmdlIik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSAnZic6Ci0JCQkJewotCQkJCSAgbG9uZyByZWc7Ci0JCQkJICByZWcgPSBnaXZlbiA+PiBiaXRzdGFydDsKLQkJCQkgIHJlZyAmPSAoMiA8PCAoYml0ZW5kIC0gYml0c3RhcnQpKSAtIDE7Ci0JCQkJICBpZiAocmVnID4gNykKLQkJCQkgICAgZnVuYyAoc3RyZWFtLCAiIyVzIiwKLQkJCQkJICBhcm1fZnBfY29uc3RbcmVnICYgN10pOwotCQkJCSAgZWxzZQotCQkJCSAgICBmdW5jIChzdHJlYW0sICJmJWQiLCByZWcpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCSAgICAgIGRlZmF1bHQ6Ci0JCQkJYWJvcnQgKCk7Ci0JCQkgICAgICB9Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgJ2AnOgotCQkJICAgIGMrKzsKLQkJCSAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSA9PSAwKQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7Ci0JCQkgICAgYnJlYWs7Ci0JCQkgIGNhc2UgJ1wnJzoKLQkJCSAgICBjKys7Ci0JCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotCQkJICAgIGJyZWFrOwotCQkJICBjYXNlICc/JzoKLQkJCSAgICArK2M7Ci0JCQkgICAgaWYgKChnaXZlbiAmICgxIDw8IGJpdHN0YXJ0KSkgIT0gMCkKLQkJCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMrKyk7Ci0JCQkgICAgZWxzZQotCQkJICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqKytjKTsKLQkJCSAgICBicmVhazsKLQkJCSAgZGVmYXVsdDoKLQkJCSAgICBhYm9ydCAoKTsKLQkJCSAgfQotCQkJYnJlYWs7Ci0KLQkJICAgICAgZGVmYXVsdDoKLQkJCWFib3J0ICgpOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCX0KLQkgICAgICBlbHNlCi0JCWZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMpOwotCSAgICB9Ci0JICByZXR1cm4gNDsKLQl9Ci0gICAgfQotICBhYm9ydCAoKTsKLX0KLQotLyogUHJpbnQgb25lIGluc3RydWN0aW9uIGZyb20gUEMgb24gSU5GTy0+U1RSRUFNLgotICAgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbi4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl90aHVtYiAocGMsIGluZm8sIGdpdmVuKQotICAgICBiZmRfdm1hICAgICAgICAgICAgICAgICAgIHBjOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci0gICAgIGxvbmcgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW47Ci17Ci0gIHN0cnVjdCB0aHVtYl9vcGNvZGUgKiBpbnNuOwotICB2b2lkICogICAgICAgICAgICAgICAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlICAgICAgICAgZnVuYyA9IGluZm8tPmZwcmludGZfZnVuYzsKLQotICBmb3IgKGluc24gPSB0aHVtYl9vcGNvZGVzOyBpbnNuLT5hc3NlbWJsZXI7IGluc24rKykKLSAgICB7Ci0gICAgICBpZiAoKGdpdmVuICYgaW5zbi0+bWFzaykgPT0gaW5zbi0+dmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyICogYyA9IGluc24tPmFzc2VtYmxlcjsKLQotICAgICAgICAgIC8qIFNwZWNpYWwgcHJvY2Vzc2luZyBmb3IgVGh1bWIgMiBpbnN0cnVjdGlvbiBCTCBzZXF1ZW5jZTogKi8KLSAgICAgICAgICBpZiAoISpjKSAvKiBjaGVjayBmb3IgZW1wdHkgKG5vdCBOVUxMKSBhc3NlbWJsZXIgc3RyaW5nICovCi0gICAgICAgICAgICB7Ci0JICAgICAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfbGluZSAgPSA0OwotCSAgICAgIAotICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlMDR4XHRibFx0IiwgZ2l2ZW4gJiAweGZmZmYpOwotICAgICAgICAgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLSAgICAgICAgICAgICAgICAoQkRJU1AyMyAoZ2l2ZW4pICogMiArIHBjICsgNCwgaW5mbyk7Ci0gICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLQkgICAgICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotCSAgICAgIGluZm8tPmJ5dGVzX3Blcl9saW5lICA9IDQ7Ci0JICAJICAgICAgCi0gICAgICAgICAgICAgIGdpdmVuICY9IDB4ZmZmZjsKLSAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJTA0eFx0IiwgZ2l2ZW4pOwotCSAgICAgIAotICAgICAgICAgICAgICBmb3IgKDsgKmM7IGMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gJyUnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgaW50IGRvbWFza3BjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9tYXNrbHIgPSAwOwotCQkgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCorK2MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJSUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZWc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gKGdpdmVuID4+IDMpICYgMHg3OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnaXZlbiAmICgxIDw8IDYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICs9IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZWc7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gZ2l2ZW4gJiAweDc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdpdmVuICYgKDEgPDwgNykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyArPSA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm1fY29uZGl0aW9uYWwgWyhnaXZlbiA+PiA4KSAmIDB4Zl0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnaXZlbiAmICgxIDw8IDgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFza2xyID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpjID09ICdPJyAmJiAoZ2l2ZW4gJiAoMSA8PCA4KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYXNrcGMgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWc7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAieyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgc3BvdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcywgYW5kIGdlbmVyYXRlIHRoZSByUy1yRSBmb3JtYXQ6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyZWcgPSAwOyAocmVnIDwgOCk7IHJlZysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnaXZlbiAmICgxIDw8IHJlZykpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJXMiLCBhcm1fcmVnbmFtZXNbcmVnXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb21hc2tscikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiLCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgImxyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9tYXNrcGMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgInBjIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICJ9Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMCc6IGNhc2UgJzEnOiBjYXNlICcyJzogY2FzZSAnMyc6IGNhc2UgJzQnOiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzdGFydCA9ICpjKysgLSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdGVuZCA9IDA7Ci0JCQkgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpjID49ICcwJyAmJiAqYyA8PSAnOScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdGFydCA9IChiaXRzdGFydCAqIDEwKSArICpjKysgLSAnMCc7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCpjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlZzsKLQkJCQkgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmMgPj0gJzAnICYmICpjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdGVuZCA9IChiaXRlbmQgKiAxMCkgKyAqYysrIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYml0ZW5kKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gZ2l2ZW4gPj4gYml0c3RhcnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnICY9ICgyIDw8IChiaXRlbmQgLSBiaXRzdGFydCkpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCpjKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVzIiwgYXJtX3JlZ25hbWVzW3JlZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVkIiwgcmVnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyA8PCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1cnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyA8PCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2EnOgotCQkJCSAgICAgIC8qIFBDLXJlbGF0aXZlIGFkZHJlc3MgLS0gdGhlIGJvdHRvbSB0d28KLQkJCQkJIGJpdHMgb2YgdGhlIGFkZHJlc3MgYXJlIGRyb3BwZWQgYmVmb3JlCi0JCQkJCSB0aGUgY2FsY3VsYXRpb24uICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMKLQkJCQkJKCgocGMgKyA0KSAmIH4zKSArIChyZWcgPDwgMiksIGluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIjB4JTA0eCIsIHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gKChyZWcgXiAoMSA8PCBiaXRlbmQpKSAtICgxIDw8IGJpdGVuZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlZCIsIHJlZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gKChyZWcgXiAoMSA8PCBiaXRlbmQpKSAtICgxIDw8IGJpdGVuZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVnICogMiArIHBjICsgNCwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZ2l2ZW4gJiAoMSA8PCBiaXRzdGFydCkpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyAoc3RyZWFtLCAiJWMiLCAqYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc/JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdpdmVuICYgKDEgPDwgYml0c3RhcnQpKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgKHN0cmVhbSwgIiVjIiwgKmMrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICorK2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ICgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICBhYm9ydCAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBmdW5jIChzdHJlYW0sICIlYyIsICpjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgfQotICAgICAgICAgIHJldHVybiAyOwotICAgICAgIH0KLSAgICB9Ci0KLSAgLyogbm8gbWF0Y2ggKi8KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFNlbGVjdCBhIGRpZmZlcmVudCByZWdpc3RlciBuYW1lIHNldC4KLSAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmFtZSBzZXQgc2VsZWN0ZWQgaXMgdGhlIEFQQ1MgbmFtZSBzZXQuICAqLwotaW50Ci1hcm1fdG9nZ2xlX3JlZ25hbWVzICgpCi17Ci0gIGlmIChhcm1fcmVnbmFtZXMgPT0gYXJtX3JlZ25hbWVzX3N0YW5kYXJkKQotICAgIGFybV9yZWduYW1lcyA9IGFybV9yZWduYW1lc19hcGNzOwotICBlbHNlCi0gICAgYXJtX3JlZ25hbWVzID0gYXJtX3JlZ25hbWVzX3N0YW5kYXJkOwotCi0gIHJldHVybiBhcm1fcmVnbmFtZXMgPT0gYXJtX3JlZ25hbWVzX2FwY3M7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wYXJzZV9kaXNhc3NlbWJsZXJfb3B0aW9ucyAob3B0aW9ucykKLSAgICAgY2hhciAqIG9wdGlvbnM7Ci17Ci0gIGlmIChvcHRpb25zID09IE5VTEwpCi0gICAgcmV0dXJuOwotICAgICAgCi0gIGlmIChzdHJuY21wIChvcHRpb25zLCAicmVnLW5hbWVzLSIsIDEwKSA9PSAwKQotICAgIHsKLSAgICAgIG9wdGlvbnMgKz0gMTA7Ci0gICAgICAKLSAgICAgIGlmIChzdHJjbXAgKG9wdGlvbnMsICJzdGQiKSA9PSAwKQotCWFybV9yZWduYW1lcyA9IGFybV9yZWduYW1lc19zdGFuZGFyZDsKLSAgICAgIGVsc2UgaWYgKHN0cmNtcCAob3B0aW9ucywgImFwY3MiKSA9PSAwKQotCWFybV9yZWduYW1lcyA9IGFybV9yZWduYW1lc19hcGNzOwotICAgICAgZWxzZSBpZiAoc3RyY21wIChvcHRpb25zLCAicmF3IikgPT0gMCkKLQlhcm1fcmVnbmFtZXMgPSBhcm1fcmVnbmFtZXNfcmF3OwotICAgICAgZWxzZQotCWZwcmludGYgKHN0ZGVyciwgIlVucmVjb2duaXNlZCByZWdpc3RlciBuYW1lIHNldDogJXNcbiIsIG9wdGlvbnMpOwotICAgIH0KLSAgZWxzZQotICAgIGZwcmludGYgKHN0ZGVyciwgIlVucmVjb2duaXNlZCBkaXNhc3NlbWJsZXIgb3B0aW9uOiAlc1xuIiwgb3B0aW9ucyk7Ci0gIAotICByZXR1cm47Ci19Ci0KLS8qIE5PVEU6IFRoZXJlIGFyZSBubyBjaGVja3MgaW4gdGhlc2Ugcm91dGluZXMgdGhhdCB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIGRhdGEgYnl0ZXMgZXhpc3QgKi8KLQotaW50Ci1wcmludF9pbnNuX2JpZ19hcm0gKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHVuc2lnbmVkIGNoYXIgICAgICBiWzRdOwotICBsb25nICAgICAgICAgICAgICAgZ2l2ZW47Ci0gIGludCAgICAgICAgICAgICAgICBzdGF0dXM7Ci0gIGNvZmZfc3ltYm9sX3R5cGUgKiBjczsKLSAgZWxmX3N5bWJvbF90eXBlICogIGVzOwotICBpbnQgICAgICAgICAgICAgICAgaXNfdGh1bWI7Ci0gIAotICBpZiAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpCi0gICAgewotICAgICAgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zKTsKLSAgICAgIAotICAgICAgLyogVG8gYXZvaWQgcmVwZWF0ZWQgcGFyc2luZyBvZiB0aGlzIG9wdGlvbiwgd2UgcmVtb3ZlIGl0IGhlcmUuICAqLwotICAgICAgaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBOVUxMOwotICAgIH0KLSAgCi0gIGlzX3RodW1iID0gZmFsc2U7Ci0gIGlmIChpbmZvLT5zeW1ib2xzICE9IE5VTEwpCi0gICAgewotICAgICAgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2NvZmZfZmxhdm91cikKLQl7Ci0JICBjcyA9IGNvZmZzeW1ib2wgKCppbmZvLT5zeW1ib2xzKTsKLQkgIGlzX3RodW1iID0gKCAgIGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFQKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQlNUQVQKLQkJICAgICAgfHwgY3MtPm5hdGl2ZS0+dS5zeW1lbnQubl9zY2xhc3MgPT0gQ19USFVNQkxBQkVMCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJFWFRGVU5DCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFURlVOQyk7Ci0JfQotICAgICAgZWxzZSBpZiAoYmZkX2FzeW1ib2xfZmxhdm91ciAoKmluZm8tPnN5bWJvbHMpID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIpCi0JewotCSAgZXMgPSAqKGVsZl9zeW1ib2xfdHlwZSAqKikoaW5mby0+c3ltYm9scyk7Ci0JICBpc190aHVtYiA9IEVMRl9TVF9UWVBFIChlcy0+aW50ZXJuYWxfZWxmX3N5bS5zdF9pbmZvKSA9PQotCSAgICBTVFRfQVJNX1RGVU5DOwotCX0KLSAgICB9Ci0KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX0JJRzsKLQotICAvKiBBbHdheXMgZmV0Y2ggd29yZCBhbGlnbmVkIHZhbHVlcy4gICovCi0gIAotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYyAmIH4gMHgzLCAoYmZkX2J5dGUgKikgJmJbMF0sIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoaXNfdGh1bWIpCi0gICAgewotICAgICAgaWYgKHBjICYgMHgyKQotCXsKLQkgIGdpdmVuID0gKGJbMl0gPDwgOCkgfCBiWzNdOwotCi0JICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jICgocGMgKyA0KSAmIH4gMHgzLCAoYmZkX2J5dGUgKikgYiwgNCwgaW5mbyk7Ci0JICBpZiAoc3RhdHVzICE9IDApCi0JICAgIHsKLQkgICAgICBpbmZvLT5tZW1vcnlfZXJyb3JfZnVuYyAoc3RhdHVzLCBwYyArIDQsIGluZm8pOwotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCSAgCi0JICBnaXZlbiB8PSAoYlswXSA8PCAyNCkgfCAoYlsxXSA8PCAxNik7Ci0JfQotICAgICAgZWxzZQotCWdpdmVuID0gKGJbMF0gPDwgOCkgfCBiWzFdIHwgKGJbMl0gPDwgMjQpIHwgKGJbM10gPDwgMTYpOwotICAgIH0KLSAgZWxzZQotICAgIGdpdmVuID0gKGJbMF0gPDwgMjQpIHwgKGJbMV0gPDwgMTYpIHwgKGJbMl0gPDwgOCkgfCAoYlszXSk7Ci0KLSAgaWYgKGlzX3RodW1iKQotICAgIHN0YXR1cyA9IHByaW50X2luc25fdGh1bWIgKHBjLCBpbmZvLCBnaXZlbik7Ci0gIGVsc2UKLSAgICBzdGF0dXMgPSBwcmludF9pbnNuX2FybSAocGMsIGluZm8sIGdpdmVuKTsKLQotICByZXR1cm4gc3RhdHVzOwotfQotCi1pbnQKLXByaW50X2luc25fbGl0dGxlX2FybSAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciAgICAgIGJbNF07Ci0gIGxvbmcgICAgICAgICAgICAgICBnaXZlbjsKLSAgaW50ICAgICAgICAgICAgICAgIHN0YXR1czsKLSAgY29mZl9zeW1ib2xfdHlwZSAqIGNzOwotICBlbGZfc3ltYm9sX3R5cGUgKiAgZXM7Ci0gIGludCAgICAgICAgICAgICAgICBpc190aHVtYjsKLQotICBpZiAoaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMpCi0gICAgewotICAgICAgcGFyc2VfZGlzYXNzZW1ibGVyX29wdGlvbnMgKGluZm8tPmRpc2Fzc2VtYmxlcl9vcHRpb25zKTsKLSAgICAgIAotICAgICAgLyogVG8gYXZvaWQgcmVwZWF0ZWQgcGFyc2luZyBvZiB0aGlzIG9wdGlvbiwgd2UgcmVtb3ZlIGl0IGhlcmUuICAqLwotICAgICAgaW5mby0+ZGlzYXNzZW1ibGVyX29wdGlvbnMgPSBOVUxMOwotICAgIH0KLSAgCi0gIGlzX3RodW1iID0gZmFsc2U7Ci0gIAotICBpZiAoaW5mby0+c3ltYm9scyAhPSBOVUxMKQotICAgIHsKLSAgICAgIGlmIChiZmRfYXN5bWJvbF9mbGF2b3VyICgqaW5mby0+c3ltYm9scykgPT0gYmZkX3RhcmdldF9jb2ZmX2ZsYXZvdXIpCi0JewotCSAgY3MgPSBjb2Zmc3ltYm9sICgqaW5mby0+c3ltYm9scyk7Ci0JICBpc190aHVtYiA9ICggICBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhUCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJTVEFUCi0JCSAgICAgIHx8IGNzLT5uYXRpdmUtPnUuc3ltZW50Lm5fc2NsYXNzID09IENfVEhVTUJMQUJFTAotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CRVhURlVOQwotCQkgICAgICB8fCBjcy0+bmF0aXZlLT51LnN5bWVudC5uX3NjbGFzcyA9PSBDX1RIVU1CU1RBVEZVTkMpOwotCX0KLSAgICAgIGVsc2UgaWYgKGJmZF9hc3ltYm9sX2ZsYXZvdXIgKCppbmZvLT5zeW1ib2xzKSA9PSBiZmRfdGFyZ2V0X2VsZl9mbGF2b3VyKQotCXsKLQkgIGVzID0gKihlbGZfc3ltYm9sX3R5cGUgKiopKGluZm8tPnN5bWJvbHMpOwotCSAgaXNfdGh1bWIgPSBFTEZfU1RfVFlQRSAoZXMtPmludGVybmFsX2VsZl9zeW0uc3RfaW5mbykgPT0KLQkgICAgU1RUX0FSTV9URlVOQzsKLQl9Ci0gICAgfQotICAKLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gNDsKLSAgaW5mby0+ZGlzcGxheV9lbmRpYW4gPSBCRkRfRU5ESUFOX0xJVFRMRTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgKGJmZF9ieXRlICopICZiWzBdLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwICYmIGlzX3RodW1iKQotICAgIHsKLSAgICAgIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDI7Ci0KLSAgICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKHBjLCAoYmZkX2J5dGUgKikgYiwgMiwgaW5mbyk7Ci0gICAgICBiWzNdID0gYlsyXSA9IDA7Ci0gICAgfQotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBnaXZlbiA9IChiWzBdKSB8IChiWzFdIDw8IDgpIHwgKGJbMl0gPDwgMTYpIHwgKGJbM10gPDwgMjQpOwotCi0gIGlmIChpc190aHVtYikKLSAgICBzdGF0dXMgPSBwcmludF9pbnNuX3RodW1iIChwYywgaW5mbywgZ2l2ZW4pOwotICBlbHNlCi0gICAgc3RhdHVzID0gcHJpbnRfaW5zbl9hcm0gKHBjLCBpbmZvLCBnaXZlbik7Ci0KLSAgcmV0dXJuIHN0YXR1czsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvYXJtLW9wYy5oIGIvb3Bjb2Rlcy9hcm0tb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTI5OGYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9hcm0tb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciB0aGUgQVJNLgotCi0gICBDb3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIAotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi1zdHJ1Y3QgYXJtX29wY29kZSB7Ci0gICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWFzazsJLyogcmVjb2duaXNlIGluc3RydWN0aW9uIGlmIChvcCZtYXNrKT09dmFsdWUgKi8KLSAgICBjaGFyICphc3NlbWJsZXI7CQkvKiBob3cgdG8gZGlzYXNzZW1ibGUgdGhpcyBpbnN0cnVjdGlvbiAqLwotfTsKLQotc3RydWN0IHRodW1iX29wY29kZQotewotICAgIHVuc2lnbmVkIHNob3J0IHZhbHVlLCBtYXNrOwkvKiByZWNvZ25pc2UgaW5zdHJ1Y3Rpb24gaWYgKG9wJm1hc2spPT12YWx1ZSAqLwotICAgIGNoYXIgKiBhc3NlbWJsZXI7CQkvKiBob3cgdG8gZGlzYXNzZW1ibGUgdGhpcyBpbnN0cnVjdGlvbiAqLwotfTsKLQotLyogZm9ybWF0IG9mIHRoZSBhc3NlbWJsZXIgc3RyaW5nIDoKLSAgIAotICAgJSUJCQklCi0gICAlPGJpdGZpZWxkPmQJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPngJCXByaW50IHRoZSBiaXRmaWVsZCBpbiBoZXgKLSAgICU8Yml0ZmllbGQ+cgkJcHJpbnQgYXMgYW4gQVJNIHJlZ2lzdGVyCi0gICAlPGJpdGZpZWxkPmYJCXByaW50IGEgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnQgaWYgPjcgZWxzZSBhCi0JCQlmbG9hdGluZyBwb2ludCByZWdpc3RlcgotICAgJWMJCQlwcmludCBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgMjgtMzEpCi0gICAlUAkJCXByaW50IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBhcml0aG1ldGljIGluc24KLSAgICVRCQkJcHJpbnQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGxkZi9zdGYgaW5zbgotICAgJVIJCQlwcmludCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2RlCi0gICAlPGJpdG51bT4nYwkJcHJpbnQgc3BlY2lmaWVkIGNoYXIgaWZmIGJpdCBpcyBvbmUKLSAgICU8Yml0bnVtPmBjCQlwcmludCBzcGVjaWZpZWQgY2hhciBpZmYgYml0IGlzIHplcm8KLSAgICU8Yml0bnVtPj9hYgkJcHJpbnQgYSBpZiBiaXQgaXMgb25lIGVsc2UgcHJpbnQgYgotICAgJXAJCQlwcmludCAncCcgaWZmIGJpdHMgMTItMTUgYXJlIDE1Ci0gICAldAkJCXByaW50ICd0JyBpZmYgYml0IDIxIHNldCBhbmQgYml0IDI0IGNsZWFyCi0gICAlaCAgICAgICAgICAgICAgICAgICBwcmludCAnaCcgaWZmIGJpdCA1IHNldCwgZWxzZSBwcmludCAnYicKLSAgICVvCQkJcHJpbnQgb3BlcmFuZDIgKGltbWVkaWF0ZSBvciByZWdpc3RlciArIHNoaWZ0KQotICAgJWEJCQlwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGluc3RydWN0aW9uCi0gICAlcyAgICAgICAgICAgICAgICAgICBwcmludCBhZGRyZXNzIGZvciBsZHIvc3RyIGhhbGZ3b3JkL3NpZ25leHRlbmQgaW5zdHJ1Y3Rpb24KLSAgICViCQkJcHJpbnQgYnJhbmNoIGRlc3RpbmF0aW9uCi0gICAlQQkJCXByaW50IGFkZHJlc3MgZm9yIGxkYy9zdGMvbGRmL3N0ZiBpbnN0cnVjdGlvbgotICAgJW0JCQlwcmludCByZWdpc3RlciBtYXNrIGZvciBsZG0vc3RtIGluc3RydWN0aW9uCi0gICAlQwkJCXByaW50IHRoZSBQU1Igc3ViIHR5cGUuCi0gICAlRgkJCXByaW50IHRoZSBDT1VOVCBmaWVsZCBvZiBhIExGTS9TRk0gaW5zdHJ1Y3Rpb24uCi1UaHVtYiBzcGVjaWZpYyBmb3JtYXQgb3B0aW9uczoKLSAgICVEICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIChiaXRzIDAuLjIgYXMgaGlnaCBudW1iZXIgaWYgYml0IDcgc2V0KQotICAgJVMgICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgKGJpdHMgMy4uNSBhcyBoaWdoIG51bWJlciBpZiBiaXQgNiBzZXQpCi0gICAlPGJpdGZpZWxkPkkgICAgICAgICBwcmludCBiaXRmaWVsZCBhcyBhIHNpZ25lZCBkZWNpbWFsCi0gICAJCQkJKHRvcCBiaXQgb2YgcmFuZ2UgYmVpbmcgdGhlIHNpZ24gYml0KQotICAgJU0gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzawotICAgJU4gICAgICAgICAgICAgICAgICAgcHJpbnQgVGh1bWIgcmVnaXN0ZXIgbWFzayAod2l0aCBMUikKLSAgICVPICAgICAgICAgICAgICAgICAgIHByaW50IFRodW1iIHJlZ2lzdGVyIG1hc2sgKHdpdGggUEMpCi0gICAlVCAgICAgICAgICAgICAgICAgICBwcmludCBUaHVtYiBjb25kaXRpb24gY29kZSAoYWx3YXlzIGJpdHMgOC0xMSkKLSAgICU8Yml0ZmllbGQ+QiAgICAgICAgIHByaW50IFRodW1iIGJyYW5jaCBkZXN0aW5hdGlvbiAoc2lnbmVkIGRpc3BsYWNlbWVudCkKLSAgICU8Yml0ZmllbGQ+VyAgICAgICAgIHByaW50IChiaXRmaWVsZCAqIDQpIGFzIGEgZGVjaW1hbAotICAgJTxiaXRmaWVsZD5IICAgICAgICAgcHJpbnQgKGJpdGZpZWxkICogMikgYXMgYSBkZWNpbWFsCi0gICAlPGJpdGZpZWxkPmEgICAgICAgICBwcmludCAoYml0ZmllbGQgKiA0KSBhcyBhIHBjLXJlbCBvZmZzZXQgKyBkZWNvZGVkIHN5bWJvbAotKi8KLQotLyogTm90ZTogVGhlcmUgaXMgYSBwYXJ0aWFsIG9yZGVyaW5nIGluIHRoaXMgdGFibGUgLSBpdCBtdXN0IGJlIHNlYXJjaGVkIGZyb20KLSAgIHRoZSB0b3AgdG8gb2J0YWluIGEgY29ycmVjdCBtYXRjaC4gKi8KLQotc3RhdGljIHN0cnVjdCBhcm1fb3Bjb2RlIGFybV9vcGNvZGVzW10gPSB7Ci0gICAgLyogQVJNIGluc3RydWN0aW9ucyAqLwotICAgIHsweGUxYTAwMDAwLCAweGZmZmZmZmZmLCAibm9wXHRcdFx0KG1vdiByMCxyMCkifSwKLSAgICB7MHgwMTJGRkYxMCwgMHgwZmZmZmZmMCwgImJ4JWNcdCUwLTNyIn0sCi0gICAgezB4MDAwMDAwOTAsIDB4MGZlMDAwZjAsICJtdWwlYyUyMCdzXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyIn0sCi0gICAgezB4MDAyMDAwOTAsIDB4MGZlMDAwZjAsICJtbGElYyUyMCdzXHQlMTYtMTlyLCAlMC0zciwgJTgtMTFyLCAlMTItMTVyIn0sCi0gICAgezB4MDEwMDAwOTAsIDB4MGZiMDBmZjAsICJzd3AlYyUyMidiXHQlMTItMTVyLCAlMC0zciwgWyUxNi0xOXJdIn0sCi0gICAgezB4MDA4MDAwOTAsIDB4MGZhMDAwZjAsICIlMjI/c3VtdWxsJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJTAtM3IsICU4LTExciJ9LAotICAgIHsweDAwYTAwMDkwLCAweDBmYTAwMGYwLCAiJTIyP3N1bWxhbCVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICUwLTNyLCAlOC0xMXIifSwKLSAgICB7MHgwMDAwMDA5MCwgMHgwZTEwMDA5MCwgInN0ciVjJTYncyVoXHQlMTItMTVyLCAlcyJ9LAotICAgIHsweDAwMTAwMDkwLCAweDBlMTAwMDkwLCAibGRyJWMlNidzJWhcdCUxMi0xNXIsICVzIn0sCi0gICAgezB4MDAwMDAwMDAsIDB4MGRlMDAwMDAsICJhbmQlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwMjAwMDAwLCAweDBkZTAwMDAwLCAiZW9yJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMDQwMDAwMCwgMHgwZGUwMDAwMCwgInN1YiVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDA2MDAwMDAsIDB4MGRlMDAwMDAsICJyc2IlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwODAwMDAwLCAweDBkZTAwMDAwLCAiYWRkJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMGEwMDAwMCwgMHgwZGUwMDAwMCwgImFkYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDBjMDAwMDAsIDB4MGRlMDAwMDAsICJzYmMlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAwZTAwMDAwLCAweDBkZTAwMDAwLCAicnNjJWMlMjAnc1x0JTEyLTE1ciwgJTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTIwZjAwMCwgMHgwZGI2ZjAwMCwgIm1zciVjXHQlMjI/c2Nwc3IlQywgJW8ifSwKLSAgICB7MHgwMTBmMDAwMCwgMHgwZmJmMGZmZiwgIm1ycyVjXHQlMTItMTVyLCAlMjI/c2Nwc3IifSwKLSAgICB7MHgwMTAwMDAwMCwgMHgwZGUwMDAwMCwgInRzdCVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDEyMDAwMDAsIDB4MGRlMDAwMDAsICJ0ZXElYyVwXHQlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxNDAwMDAwLCAweDBkZTAwMDAwLCAiY21wJWMlcFx0JTE2LTE5ciwgJW8ifSwKLSAgICB7MHgwMTYwMDAwMCwgMHgwZGUwMDAwMCwgImNtbiVjJXBcdCUxNi0xOXIsICVvIn0sCi0gICAgezB4MDE4MDAwMDAsIDB4MGRlMDAwMDAsICJvcnIlYyUyMCdzXHQlMTItMTVyLCAlMTYtMTlyLCAlbyJ9LAotICAgIHsweDAxYTAwMDAwLCAweDBkZTAwMDAwLCAibW92JWMlMjAnc1x0JTEyLTE1ciwgJW8ifSwKLSAgICB7MHgwMWMwMDAwMCwgMHgwZGUwMDAwMCwgImJpYyVjJTIwJ3NcdCUxMi0xNXIsICUxNi0xOXIsICVvIn0sCi0gICAgezB4MDFlMDAwMDAsIDB4MGRlMDAwMDAsICJtdm4lYyUyMCdzXHQlMTItMTVyLCAlbyJ9LAotICAgIHsweDA0MDAwMDAwLCAweDBlMTAwMDAwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAotICAgIHsweDA2MDAwMDAwLCAweDBlMTAwZmYwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAotICAgIHsweDA0MDAwMDAwLCAweDBjMTAwMDEwLCAic3RyJWMlMjInYiV0XHQlMTItMTVyLCAlYSJ9LAotICAgIHsweDA2MDAwMDEwLCAweDBlMDAwMDEwLCAidW5kZWZpbmVkIn0sCi0gICAgezB4MDQxMDAwMDAsIDB4MGMxMDAwMDAsICJsZHIlYyUyMidiJXRcdCUxMi0xNXIsICVhIn0sCi0gICAgezB4MDgwMDAwMDAsIDB4MGUxMDAwMDAsICJzdG0lYyUyMz9pZCUyND9iYVx0JTE2LTE5ciUyMSchLCAlbSUyMideIn0sCi0gICAgezB4MDgxMDAwMDAsIDB4MGUxMDAwMDAsICJsZG0lYyUyMz9pZCUyND9iYVx0JTE2LTE5ciUyMSchLCAlbSUyMideIn0sCi0gICAgezB4MGEwMDAwMDAsIDB4MGUwMDAwMDAsICJiJTI0J2wlY1x0JWIifSwKLSAgICB7MHgwZjAwMDAwMCwgMHgwZjAwMDAwMCwgInN3aSVjXHQlMC0yM3gifSwKLQotICAgIC8qIEZsb2F0aW5nIHBvaW50IGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucyAqLwotICAgIHsweDBlMDAwMTAwLCAweDBmZjA4ZjEwLCAiYWRmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlMTAwMTAwLCAweDBmZjA4ZjEwLCAibXVmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlMjAwMTAwLCAweDBmZjA4ZjEwLCAic3VmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlMzAwMTAwLCAweDBmZjA4ZjEwLCAicnNmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlNDAwMTAwLCAweDBmZjA4ZjEwLCAiZHZmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlNTAwMTAwLCAweDBmZjA4ZjEwLCAicmRmJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlNjAwMTAwLCAweDBmZjA4ZjEwLCAicG93JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlNzAwMTAwLCAweDBmZjA4ZjEwLCAicnB3JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlODAwMTAwLCAweDBmZjA4ZjEwLCAicm1mJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlOTAwMTAwLCAweDBmZjA4ZjEwLCAiZm1sJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlYTAwMTAwLCAweDBmZjA4ZjEwLCAiZmR2JWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlYjAwMTAwLCAweDBmZjA4ZjEwLCAiZnJkJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlYzAwMTAwLCAweDBmZjA4ZjEwLCAicG9sJWMlUCVSXHQlMTItMTRmLCAlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlMDA4MTAwLCAweDBmZjA4ZjEwLCAibXZmJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlMTA4MTAwLCAweDBmZjA4ZjEwLCAibW5mJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlMjA4MTAwLCAweDBmZjA4ZjEwLCAiYWJzJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlMzA4MTAwLCAweDBmZjA4ZjEwLCAicm5kJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlNDA4MTAwLCAweDBmZjA4ZjEwLCAic3F0JWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlNTA4MTAwLCAweDBmZjA4ZjEwLCAibG9nJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlNjA4MTAwLCAweDBmZjA4ZjEwLCAibGduJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlNzA4MTAwLCAweDBmZjA4ZjEwLCAiZXhwJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlODA4MTAwLCAweDBmZjA4ZjEwLCAic2luJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlOTA4MTAwLCAweDBmZjA4ZjEwLCAiY29zJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlYTA4MTAwLCAweDBmZjA4ZjEwLCAidGFuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlYjA4MTAwLCAweDBmZjA4ZjEwLCAiYXNuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlYzA4MTAwLCAweDBmZjA4ZjEwLCAiYWNzJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlZDA4MTAwLCAweDBmZjA4ZjEwLCAiYXRuJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlZTA4MTAwLCAweDBmZjA4ZjEwLCAidXJkJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlZjA4MTAwLCAweDBmZjA4ZjEwLCAibnJtJWMlUCVSXHQlMTItMTRmLCAlMC0zZiJ9LAotICAgIHsweDBlMDAwMTEwLCAweDBmZjAwZjFmLCAiZmx0JWMlUCVSXHQlMTYtMThmLCAlMTItMTVyIn0sCi0gICAgezB4MGUxMDAxMTAsIDB4MGZmZjBmOTgsICJmaXglYyVSXHQlMTItMTVyLCAlMC0yZiJ9LAotICAgIHsweDBlMjAwMTEwLCAweDBmZmYwZmZmLCAid2ZzJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTMwMDExMCwgMHgwZmZmMGZmZiwgInJmcyVjXHQlMTItMTVyIn0sCi0gICAgezB4MGU0MDAxMTAsIDB4MGZmZjBmZmYsICJ3ZmMlY1x0JTEyLTE1ciJ9LAotICAgIHsweDBlNTAwMTEwLCAweDBmZmYwZmZmLCAicmZjJWNcdCUxMi0xNXIifSwKLSAgICB7MHgwZTkwZjExMCwgMHgwZmY4ZmZmMCwgImNtZiVjXHQlMTYtMThmLCAlMC0zZiJ9LAotICAgIHsweDBlYjBmMTEwLCAweDBmZjhmZmYwLCAiY25mJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVkMGYxMTAsIDB4MGZmOGZmZjAsICJjbWZlJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGVmMGYxMTAsIDB4MGZmOGZmZjAsICJjbmZlJWNcdCUxNi0xOGYsICUwLTNmIn0sCi0gICAgezB4MGMwMDAxMDAsIDB4MGUxMDBmMDAsICJzdGYlYyVRXHQlMTItMTRmLCAlQSJ9LAotICAgIHsweDBjMTAwMTAwLCAweDBlMTAwZjAwLCAibGRmJWMlUVx0JTEyLTE0ZiwgJUEifSwKLSAgICB7MHgwYzAwMDIwMCwgMHgwZTEwMGYwMCwgInNmbSVjXHQlMTItMTRmLCAlRiwgJUEifSwKLSAgICB7MHgwYzEwMDIwMCwgMHgwZTEwMGYwMCwgImxmbSVjXHQlMTItMTRmLCAlRiwgJUEifSwKLQotICAgIC8qIEdlbmVyaWMgY29wcm9jZXNzb3IgaW5zdHJ1Y3Rpb25zICovCi0gICAgezB4MGUwMDAwMDAsIDB4MGYwMDAwMTAsICJjZHAlY1x0JTgtMTFkLCAlMjAtMjNkLCBjciUxMi0xNWQsIGNyJTE2LTE5ZCwgY3IlMC0zZCwgeyU1LTdkfSJ9LAotICAgIHsweDBlMTAwMDEwLCAweDBmMTAwMDEwLCAibXJjJWNcdCU4LTExZCwgJTIxLTIzZCwgJTEyLTE1ciwgY3IlMTYtMTlkLCBjciUwLTNkLCB7JTUtN2R9In0sCi0gICAgezB4MGUwMDAwMTAsIDB4MGYxMDAwMTAsICJtY3IlY1x0JTgtMTFkLCAlMjEtMjNkLCAlMTItMTVyLCBjciUxNi0xOWQsIGNyJTAtM2QsIHslNS03ZH0ifSwKLSAgICB7MHgwYzAwMDAwMCwgMHgwZTEwMDAwMCwgInN0YyVjJTIyJ2xcdCU4LTExZCwgY3IlMTItMTVkLCAlQSJ9LAotICAgIHsweDBjMTAwMDAwLCAweDBlMTAwMDAwLCAibGRjJWMlMjInbFx0JTgtMTFkLCBjciUxMi0xNWQsICVBIn0sCi0gICAgLyogdGhlIHJlc3QgKi8KLSAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0zMXgifSwKLSAgICB7MHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMH0KLX07Ci0KLSNkZWZpbmUgQkRJU1AoeCkgKCgoKHgpICYgMHhmZmZmZmYpIF4gMHg4MDAwMDApIC0gMHg4MDAwMDApIC8qIDI2IGJpdCAqLwotCi1zdGF0aWMgc3RydWN0IHRodW1iX29wY29kZSB0aHVtYl9vcGNvZGVzW10gPQotewotICAvKiBUaHVtYiBpbnN0cnVjdGlvbnMgKi8KLSAgezB4NDZDMCwgMHhGRkZGLCAibm9wXHRcdFx0KG1vdiByOCxyOCkifSwgLyogZm9ybWF0IDUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCB1cGRhdGUgdGhlIFBTUiAqLwotICB7MHgxQzAwLCAweEZGQzAsICJtb3ZcdCUwLTJyLCAlMy01clx0XHQoYWRkICUwLTJyLCAlMy01ciwgIyU2LThkKSJ9LAotICAvKiBmb3JtYXQgNCAqLwotICB7MHg0MDAwLCAweEZGQzAsICJhbmRcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MDQwLCAweEZGQzAsICJlb3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MDgwLCAweEZGQzAsICJsc2xcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MEMwLCAweEZGQzAsICJsc3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTAwLCAweEZGQzAsICJhc3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTQwLCAweEZGQzAsICJhZGNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MTgwLCAweEZGQzAsICJzYmNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MUMwLCAweEZGQzAsICJyb3JcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjAwLCAweEZGQzAsICJ0c3RcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjQwLCAweEZGQzAsICJuZWdcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MjgwLCAweEZGQzAsICJjbXBcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MkMwLCAweEZGQzAsICJjbW5cdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzAwLCAweEZGQzAsICJvcnJcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzQwLCAweEZGQzAsICJtdWxcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0MzgwLCAweEZGQzAsICJiaWNcdCUwLTJyLCAlMy01ciJ9LAotICB7MHg0M0MwLCAweEZGQzAsICJtdm5cdCUwLTJyLCAlMy01ciJ9LAotICAvKiBmb3JtYXQgMTMgKi8KLSAgezB4QjAwMCwgMHhGRjgwLCAiYWRkXHRzcCwgIyUwLTZXIn0sCi0gIHsweEIwODAsIDB4RkY4MCwgInN1Ylx0c3AsICMlMC02VyJ9LAotICAvKiBmb3JtYXQgNSAqLwotICB7MHg0NzAwLCAweEZGODAsICJieFx0JVMifSwKLSAgezB4NDQwMCwgMHhGRjAwLCAiYWRkXHQlRCwgJVMifSwKLSAgezB4NDUwMCwgMHhGRjAwLCAiY21wXHQlRCwgJVMifSwKLSAgezB4NDYwMCwgMHhGRjAwLCAibW92XHQlRCwgJVMifSwKLSAgLyogZm9ybWF0IDE0ICovCi0gIHsweEI0MDAsIDB4RkUwMCwgInB1c2hcdCVOIn0sCi0gIHsweEJDMDAsIDB4RkUwMCwgInBvcFx0JU8ifSwKLSAgLyogZm9ybWF0IDIgKi8KLSAgezB4MTgwMCwgMHhGRTAwLCAiYWRkXHQlMC0yciwgJTMtNXIsICU2LThyIn0sCi0gIHsweDFBMDAsIDB4RkUwMCwgInN1Ylx0JTAtMnIsICUzLTVyLCAlNi04ciJ9LAotICB7MHgxQzAwLCAweEZFMDAsICJhZGRcdCUwLTJyLCAlMy01ciwgIyU2LThkIn0sCi0gIHsweDFFMDAsIDB4RkUwMCwgInN1Ylx0JTAtMnIsICUzLTVyLCAjJTYtOGQifSwKLSAgLyogZm9ybWF0IDggKi8KLSAgezB4NTIwMCwgMHhGRTAwLCAic3RyaFx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDVBMDAsIDB4RkUwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICB7MHg1NjAwLCAweEY2MDAsICJsZHMlMTE/aGJcdCUwLTJyLCBbJTMtNXIsICU2LThyXSJ9LAotICAvKiBmb3JtYXQgNyAqLwotICB7MHg1MDAwLCAweEZBMDAsICJzdHIlMTAnYlx0JTAtMnIsIFslMy01ciwgJTYtOHJdIn0sCi0gIHsweDU4MDAsIDB4RkEwMCwgImxkciUxMCdiXHQlMC0yciwgWyUzLTVyLCAlNi04cl0ifSwKLSAgLyogZm9ybWF0IDEgKi8KLSAgezB4MDAwMCwgMHhGODAwLCAibHNsXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgezB4MDgwMCwgMHhGODAwLCAibHNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgezB4MTAwMCwgMHhGODAwLCAiYXNyXHQlMC0yciwgJTMtNXIsICMlNi0xMGQifSwKLSAgLyogZm9ybWF0IDMgKi8KLSAgezB4MjAwMCwgMHhGODAwLCAibW92XHQlOC0xMHIsICMlMC03ZCJ9LAotICB7MHgyODAwLCAweEY4MDAsICJjbXBcdCU4LTEwciwgIyUwLTdkIn0sCi0gIHsweDMwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCAjJTAtN2QifSwKLSAgezB4MzgwMCwgMHhGODAwLCAic3ViXHQlOC0xMHIsICMlMC03ZCJ9LAotICAvKiBmb3JtYXQgNiAqLwotICB7MHg0ODAwLCAweEY4MDAsICJsZHJcdCU4LTEwciwgW3BjLCAjJTAtN1ddXHQoJTAtN2EpIn0sICAvKiBUT0RPOiBEaXNhc3NlbWJsZSBQQyByZWxhdGl2ZSAiTERSIHJELD08c3ltYm9saWM+IiAqLwotICAvKiBmb3JtYXQgOSAqLwotICB7MHg2MDAwLCAweEY4MDAsICJzdHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDY4MDAsIDB4RjgwMCwgImxkclx0JTAtMnIsIFslMy01ciwgIyU2LTEwV10ifSwKLSAgezB4NzAwMCwgMHhGODAwLCAic3RyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgezB4NzgwMCwgMHhGODAwLCAibGRyYlx0JTAtMnIsIFslMy01ciwgIyU2LTEwZF0ifSwKLSAgLyogZm9ybWF0IDEwICovCi0gIHsweDgwMDAsIDB4RjgwMCwgInN0cmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCi0gIHsweDg4MDAsIDB4RjgwMCwgImxkcmhcdCUwLTJyLCBbJTMtNXIsICMlNi0xMEhdIn0sCi0gIC8qIGZvcm1hdCAxMSAqLwotICB7MHg5MDAwLCAweEY4MDAsICJzdHJcdCU4LTEwciwgW3NwLCAjJTAtN1ddIn0sCi0gIHsweDk4MDAsIDB4RjgwMCwgImxkclx0JTgtMTByLCBbc3AsICMlMC03V10ifSwKLSAgLyogZm9ybWF0IDEyICovCi0gIHsweEEwMDAsIDB4RjgwMCwgImFkZFx0JTgtMTByLCBwYywgIyUwLTdXXHQoYWRyICU4LTEwciwlMC03YSkifSwKLSAgezB4QTgwMCwgMHhGODAwLCAiYWRkXHQlOC0xMHIsIHNwLCAjJTAtN1cifSwKLSAgLyogZm9ybWF0IDE1ICovCi0gIHsweEMwMDAsIDB4RjgwMCwgInN0bWlhXHQlOC0xMHIhLCVNIn0sCi0gIHsweEM4MDAsIDB4RjgwMCwgImxkbWlhXHQlOC0xMHIhLCVNIn0sCi0gIC8qIGZvcm1hdCAxOCAqLwotICB7MHhFMDAwLCAweEY4MDAsICJiXHQlMC0xMEIifSwKLSAgezB4RTgwMCwgMHhGODAwLCAidW5kZWZpbmVkIn0sCi0gIC8qIGZvcm1hdCAxOSAqLwotICB7MHhGMDAwLCAweEY4MDAsICIifSwgLyogc3BlY2lhbCBwcm9jZXNzaW5nIHJlcXVpcmVkIGluIGRpc2Fzc2VtYmxlciAqLwotICB7MHhGODAwLCAweEY4MDAsICJzZWNvbmQgaGFsZiBvZiBCTCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgLyogZm9ybWF0IDE2ICovCi0gIHsweEQwMDAsIDB4RkYwMCwgImJlcVx0JTAtN0IifSwKLSAgezB4RDEwMCwgMHhGRjAwLCAiYm5lXHQlMC03QiJ9LAotICB7MHhEMjAwLCAweEZGMDAsICJiY3NcdCUwLTdCIn0sCi0gIHsweEQzMDAsIDB4RkYwMCwgImJjY1x0JTAtN0IifSwKLSAgezB4RDQwMCwgMHhGRjAwLCAiYm1pXHQlMC03QiJ9LAotICB7MHhENTAwLCAweEZGMDAsICJicGxcdCUwLTdCIn0sCi0gIHsweEQ2MDAsIDB4RkYwMCwgImJ2c1x0JTAtN0IifSwKLSAgezB4RDcwMCwgMHhGRjAwLCAiYnZjXHQlMC03QiJ9LAotICB7MHhEODAwLCAweEZGMDAsICJiaGlcdCUwLTdCIn0sCi0gIHsweEQ5MDAsIDB4RkYwMCwgImJsc1x0JTAtN0IifSwKLSAgezB4REEwMCwgMHhGRjAwLCAiYmdlXHQlMC03QiJ9LAotICB7MHhEQjAwLCAweEZGMDAsICJibHRcdCUwLTdCIn0sCi0gIHsweERDMDAsIDB4RkYwMCwgImJndFx0JTAtN0IifSwKLSAgezB4REQwMCwgMHhGRjAwLCAiYmxlXHQlMC03QiJ9LAotICAvKiBmb3JtYXQgMTcgKi8KLSAgezB4REUwMCwgMHhGRjAwLCAidW5kZWZpbmVkIn0sCi0gIHsweERGMDAsIDB4RkYwMCwgInN3aVx0JTAtN2QifSwKLSAgLyogZm9ybWF0IDkgKi8KLSAgezB4NjAwMCwgMHhGODAwLCAic3RyXHQlMC0yciwgWyUzLTVyLCAjJTYtMTBXXSJ9LAotICB7MHg2ODAwLCAweEY4MDAsICJsZHJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMFddIn0sCi0gIHsweDcwMDAsIDB4RjgwMCwgInN0cmJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMGRdIn0sCi0gIHsweDc4MDAsIDB4RjgwMCwgImxkcmJcdCUwLTJyLCBbJTMtNXIsICMlNi0xMGRdIn0sCi0gIC8qIHRoZSByZXN0ICovCi0gIHsweDAwMDAsIDB4MDAwMCwgInVuZGVmaW5lZCBpbnN0cnVjdGlvbiAlMC0xNXgifSwKLSAgezB4MDAwMCwgMHgwMDAwLCAwfQotfTsKLQotI2RlZmluZSBCRElTUDIzKHgpICgoKCgoKHgpICYgMHgwN2ZmKSA8PCAxMSkgfCAoKCh4KSAmIDB4MDdmZjAwMDApID4+IDE2KSkgXAotICAgICAgICAgICAgICAgICAgICAgXiAweDIwMDAwMCkgLSAweDIwMDAwMCkgLyogMjNiaXQgKi8KLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLWFzbS5jIGIvb3Bjb2Rlcy9jZ2VuLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQ2OTM2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgYXNzZW1ibGVyIHN1cHBvcnQgY29kZS4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJsaWJpYmVydHkuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJvcGNvZGUvY2dlbi5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBTZXQgdGhlIGNnZW5fcGFyc2Vfb3BlcmFuZF9mbiBjYWxsYmFjay4gICovCi0KLXZvaWQKLWNnZW5fc2V0X3BhcnNlX29wZXJhbmRfZm4gKGNkLCBmbikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY2dlbl9wYXJzZV9vcGVyYW5kX2ZuIGZuOwotewotICBjZC0+cGFyc2Vfb3BlcmFuZF9mbiA9IGZuOwotfQotCi0vKiBDYWxsZWQgd2hlbmV2ZXIgc3RhcnRpbmcgdG8gcGFyc2UgYW4gaW5zbi4gICovCi0KLXZvaWQKLWNnZW5faW5pdF9wYXJzZV9vcGVyYW5kIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgLyogVGhpcyB0ZWxscyB0aGUgY2FsbGJhY2sgdG8gcmUtaW5pdGlhbGl6ZS4gICovCi0gICh2b2lkKSAoKiBjZC0+cGFyc2Vfb3BlcmFuZF9mbikKLSAgICAoY2QsIENHRU5fUEFSU0VfT1BFUkFORF9JTklULCBOVUxMLCAwLCAwLCBOVUxMLCBOVUxMKTsKLX0KLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9hc21faGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gSU5TTlMuCi0gICBFTlRTSVpFIGlzIHNpemVvZiAoQ0dFTl9JQkFTRSkgZm9yIHRoZSB0YXJnZXQuCi0gICA/Pz8gTm8gbG9uZ2VyIHVzZWQgYnV0IGxlYXZlIGluIGZvciBub3cuCi0gICBIVEFCTEUgcG9pbnRzIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgSEVOVEJVRiBpcyBhIHBvaW50ZXIgdG8gc3VmZmljaWVudGx5IGxhcmdlIGJ1ZmZlciBvZiBoYXNoIGVudHJpZXMuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBlbnRyeSB0byB1c2UuCi0KLSAgIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyBhZGRpdGlvbnMgYXJlIG1hZGUgdG8gdGhlIGZyb250IG9mIHRoZQotICAgbGlzdCBhbmQgd2Ugd2FudCBlYXJsaWVyIG9uZXMgdG8gYmUgcHJlZmVyZWQuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2FycmF5IChjZCwgaW5zbnMsIGNvdW50LCBlbnRzaXplLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbnM7Ci0gICAgIGludCBjb3VudDsKLSAgICAgaW50IGVudHNpemU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgaW50IGk7Ci0KLSAgZm9yIChpID0gY291bnQgLSAxOyBpID49IDA7IC0taSwgKytoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gJmluc25zW2ldOwotCi0gICAgICBpZiAoISAoKiBjZC0+YXNtX2hhc2hfcCkgKGluc24pKQotCWNvbnRpbnVlOwotICAgICAgaGFzaCA9ICgqIGNkLT5hc21faGFzaCkgKENHRU5fSU5TTl9NTkVNT05JQyAoaW5zbikpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfYXNtX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaGFzaF9pbnNuX2FycmF5IGV4Y2VwdCB0aGUgaW5zbnMgYXJlCi0gICBpbiBhIGxpc3QuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNucywgaHRhYmxlLCBoZW50YnVmKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbnM7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OwotCi0gIGZvciAoaWxpc3QgPSBpbnNuczsgaWxpc3QgIT0gTlVMTDsgaWxpc3QgPSBpbGlzdC0+bmV4dCwgKysgaGVudGJ1ZikKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICAgICAgaWYgKCEgKCogY2QtPmFzbV9oYXNoX3ApIChpbGlzdC0+aW5zbikpCi0JY29udGludWU7Ci0gICAgICBoYXNoID0gKCogY2QtPmFzbV9oYXNoKSAoQ0dFTl9JTlNOX01ORU1PTklDIChpbGlzdC0+aW5zbikpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbGlzdC0+aW5zbjsKLSAgICAgIGh0YWJsZVtoYXNoXSA9IGhlbnRidWY7Ci0gICAgfQotCi0gIHJldHVybiBoZW50YnVmOwotfQotCi0vKiBCdWlsZCB0aGUgYXNzZW1ibGVyIGluc3RydWN0aW9uIGhhc2ggdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfYXNtX2hhc2hfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgY291bnQgPSBjZ2VuX2luc25fY291bnQgKGNkKSArIGNnZW5fbWFjcm9faW5zbl9jb3VudCAoY2QpOwotICBDR0VOX0lOU05fVEFCTEUgKmluc25fdGFibGUgPSAmY2QtPmluc25fdGFibGU7Ci0gIENHRU5fSU5TTl9UQUJMRSAqbWFjcm9faW5zbl90YWJsZSA9ICZjZC0+bWFjcm9faW5zbl90YWJsZTsKLSAgdW5zaWduZWQgaW50IGhhc2hfc2l6ZSA9IGNkLT5hc21faGFzaF9zaXplOwotICBDR0VOX0lOU05fTElTVCAqaGFzaF9lbnRyeV9idWY7Ci0gIENHRU5fSU5TTl9MSVNUICoqYXNtX2hhc2hfdGFibGU7Ci0gIENHRU5fSU5TTl9MSVNUICphc21faGFzaF90YWJsZV9lbnRyaWVzOwotCi0gIC8qIFRoZSBzcGFjZSBhbGxvY2F0ZWQgZm9yIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKLSAgICAgdGhlIGhhc2ggdGFibGUgYW5kIHRoZSBoYXNoIGxpc3RzLiAgKi8KLQotICBhc21faGFzaF90YWJsZSA9IChDR0VOX0lOU05fTElTVCAqKikKLSAgICB4bWFsbG9jIChoYXNoX3NpemUgKiBzaXplb2YgKENHRU5fSU5TTl9MSVNUICopKTsKLSAgbWVtc2V0IChhc21faGFzaF90YWJsZSwgMCwgaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIGFzbV9oYXNoX3RhYmxlX2VudHJpZXMgPSBoYXNoX2VudHJ5X2J1ZiA9IChDR0VOX0lOU05fTElTVCAqKQotICAgIHhtYWxsb2MgKGNvdW50ICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCkpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBpbnNucy4KLSAgICAgRG9uJ3QgaW5jbHVkZSB0aGUgZmlyc3Qgb25lIGFzIGl0IGlzIGEgcmVzZXJ2ZWQgZW50cnkuICAqLwotICAvKiA/Pz8gSXQgd2FzIHRoZSBlbmQgb2YgYWxsIGhhc2ggY2hhaW5zLCBhbmQgYWxzbyB0aGUgc3BlY2lhbAotICAgICAiaW52YWxpZCBpbnNuIiBtYXJrZXIuICBNYXkgYmUgYWJsZSB0byBkbyBpdCBkaWZmZXJlbnRseSBub3cuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2FycmF5IChjZCwKLQkJCQkgICAgaW5zbl90YWJsZS0+aW5pdF9lbnRyaWVzICsgMSwKLQkJCQkgICAgaW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcyAtIDEsCi0JCQkJICAgIGluc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGFzbV9oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIGNvbXBpbGVkIGluIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsIG1hY3JvX2luc25fdGFibGUtPmluaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+bnVtX2luaXRfZW50cmllcywKLQkJCQkgICAgbWFjcm9faW5zbl90YWJsZS0+ZW50cnlfc2l6ZSwKLQkJCQkgICAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICAvKiBBZGQgcnVudGltZSBhZGRlZCBpbnNucy4KLSAgICAgTGF0ZXIgYWRkZWQgaW5zbnMgd2lsbCBiZSBwcmVmZXJlZCBvdmVyIGVhcmxpZXIgb25lcy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fbGlzdCAoY2QsIGluc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkJCSAgIGFzbV9oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgbWFjcm8taW5zbnMuICAqLwotCi0gIGhhc2hfaW5zbl9saXN0IChjZCwgbWFjcm9faW5zbl90YWJsZS0+bmV3X2VudHJpZXMsCi0JCSAgYXNtX2hhc2hfdGFibGUsIGhhc2hfZW50cnlfYnVmKTsKLQotICBjZC0+YXNtX2hhc2hfdGFibGUgPSBhc21faGFzaF90YWJsZTsKLSAgY2QtPmFzbV9oYXNoX3RhYmxlX2VudHJpZXMgPSBhc21faGFzaF90YWJsZV9lbnRyaWVzOwotfQotCi0vKiBSZXR1cm4gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBoYXNoIGxpc3QgZm9yIElOU04uICAqLwotCi1DR0VOX0lOU05fTElTVCAqCi1jZ2VuX2FzbV9sb29rdXBfaW5zbiAoY2QsIGluc24pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKmluc247Ci17Ci0gIHVuc2lnbmVkIGludCBoYXNoOwotCi0gIGlmIChjZC0+YXNtX2hhc2hfdGFibGUgPT0gTlVMTCkKLSAgICBidWlsZF9hc21faGFzaF90YWJsZSAoY2QpOwotCi0gIGhhc2ggPSAoKiBjZC0+YXNtX2hhc2gpIChpbnNuKTsKLSAgcmV0dXJuIGNkLT5hc21faGFzaF90YWJsZVtoYXNoXTsKLX0KLQwKLS8qIEtleXdvcmQgcGFyc2VyLgotICAgVGhlIHJlc3VsdCBpcyBOVUxMIHVwb24gc3VjY2VzcyBvciBhbiBlcnJvciBtZXNzYWdlLgotICAgSWYgc3VjY2Vzc2Z1bCwgKlNUUlAgaXMgdXBkYXRlZCB0byBwb2ludCBwYXNzZWQgdGhlIGtleXdvcmQuCi0KLSAgID8/PyBBdCBwcmVzZW50IHdlIGhhdmUgYSBzdGF0aWMgbm90aW9uIG9mIGhvdyB0byBwaWNrIG91dCBhIGtleXdvcmQuCi0gICBMYXRlciB3ZSBjYW4gYWxsb3cgYSB0YXJnZXQgdG8gY3VzdG9taXplIHRoaXMgaWYgbmVjZXNzYXJ5IFtzYXkgYnkKLSAgIHJlY29yZGluZyBzb21ldGhpbmcgaW4gdGhlIGtleXdvcmQgdGFibGVdLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCBrZXl3b3JkX3RhYmxlLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLSAgY2hhciBidWZbMjU2XTsKLSAgY29uc3QgY2hhciAqcCwqc3RhcnQ7Ci0KLSAgcCA9IHN0YXJ0ID0gKnN0cnA7Ci0KLSAgLyogQWxsb3cgYW55IGZpcnN0IGNoYXJhY3Rlci4KLSAgICAgTm90ZSB0aGF0IHRoaXMgYWxsb3dzIHJlY29nbml6aW5nICIsYSIgZm9yIHRoZSBhbm51bCBmbGFnIGluIHNwYXJjCi0gICAgIGV2ZW4gdGhvdWdoICIsIiBpcyBzdWJzZXF1ZW50bHkgbm90IGEgdmFsaWQga2V5d29yZCBjaGFyLiAgKi8KLSAgaWYgKCpwKQotICAgICsrcDsKLQotICAvKiBOb3cgYWxsb3cgbGV0dGVycywgZGlnaXRzLCBhbmQgXy4gICovCi0gIHdoaWxlICgoKHAgLSBzdGFydCkgPCAoaW50KSBzaXplb2YgKGJ1ZikpCi0JICYmIChpc2FsbnVtICgodW5zaWduZWQgY2hhcikgKnApIHx8ICpwID09ICdfJykpCi0gICAgKytwOwotCi0gIGlmIChwIC0gc3RhcnQgPj0gKGludCkgc2l6ZW9mIChidWYpKQotICAgIHJldHVybiBfKCJ1bnJlY29nbml6ZWQga2V5d29yZC9yZWdpc3RlciBuYW1lIik7Ci0KLSAgbWVtY3B5IChidWYsIHN0YXJ0LCBwIC0gc3RhcnQpOwotICBidWZbcCAtIHN0YXJ0XSA9IDA7Ci0KLSAga2UgPSBjZ2VuX2tleXdvcmRfbG9va3VwX25hbWUgKGtleXdvcmRfdGFibGUsIGJ1Zik7Ci0KLSAgaWYgKGtlICE9IE5VTEwpCi0gICAgewotICAgICAgKnZhbHVlcCA9IGtlLT52YWx1ZTsKLSAgICAgIC8qIERvbid0IGFkdmFuY2UgcG9pbnRlciBpZiB3ZSByZWNvZ25pemVkIHRoZSBudWxsIGtleXdvcmQuICAqLwotICAgICAgaWYgKGtlLT5uYW1lWzBdICE9IDApCi0JKnN0cnAgPSBwOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gIHJldHVybiAidW5yZWNvZ25pemVkIGtleXdvcmQvcmVnaXN0ZXIgbmFtZSI7Ci19Ci0KLS8qIFBhcnNlIGEgc21hbGwgc2lnbmVkIGludGVnZXIgcGFyc2VyLgotICAgPz8/IFZBTFVFUCBpcyBub3QgYSBiZmRfdm1hICogb24gcHVycG9zZSwgdGhvdWdoIHRoaXMgaXMgY29uZnVzaW5nLgotICAgTm90ZSB0aGF0IGlmIHRoZSBjYWxsZXIgZXhwZWN0cyBhIGJmZF92bWEgcmVzdWx0LCBpdCBzaG91bGQgY2FsbAotICAgY2dlbl9wYXJzZV9hZGRyZXNzLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGxvbmcgKnZhbHVlcDsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOVEVHRVIsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19OT05FLAotICAgICAmcmVzdWx0LCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogUGFyc2UgYSBzbWFsbCB1bnNpZ25lZCBpbnRlZ2VyIHBhcnNlci4KLSAgID8/PyBWQUxVRVAgaXMgbm90IGEgYmZkX3ZtYSAqIG9uIHB1cnBvc2UsIHRob3VnaCB0aGlzIGlzIGNvbmZ1c2luZy4KLSAgIE5vdGUgdGhhdCBpZiB0aGUgY2FsbGVyIGV4cGVjdHMgYSBiZmRfdm1hIHJlc3VsdCwgaXQgc2hvdWxkIGNhbGwKLSAgIGNnZW5fcGFyc2VfYWRkcmVzcy4gICovCi0KLWNvbnN0IGNoYXIgKgotY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgYmZkX3ZtYSB2YWx1ZTsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gIGVycm1zZyA9ICgqIGNkLT5wYXJzZV9vcGVyYW5kX2ZuKQotICAgIChjZCwgQ0dFTl9QQVJTRV9PUEVSQU5EX0lOVEVHRVIsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19OT05FLAotICAgICAmcmVzdWx0LCAmdmFsdWUpOwotICAvKiBGSVhNRTogRXhhbWluZSBgcmVzdWx0Jy4gICovCi0gIGlmICghZXJybXNnKQotICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogQWRkcmVzcyBwYXJzZXIuICAqLwotCi1jb25zdCBjaGFyICoKLWNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIG9waW5mbywgcmVzdWx0cCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIGludCBvcGluZm87Ci0gICAgIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCAqcmVzdWx0cDsKLSAgICAgYmZkX3ZtYSAqdmFsdWVwOwotewotICBiZmRfdm1hIHZhbHVlOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICBlcnJtc2cgPSAoKiBjZC0+cGFyc2Vfb3BlcmFuZF9mbikKLSAgICAoY2QsIENHRU5fUEFSU0VfT1BFUkFORF9BRERSRVNTLCBzdHJwLCBvcGluZGV4LCBvcGluZm8sCi0gICAgICZyZXN1bHRfdHlwZSwgJnZhbHVlKTsKLSAgLyogRklYTUU6IEV4YW1pbmUgYHJlc3VsdCcuICAqLwotICBpZiAoIWVycm1zZykKLSAgICB7Ci0gICAgICBpZiAocmVzdWx0cCAhPSBOVUxMKQotCSpyZXN1bHRwID0gcmVzdWx0X3R5cGU7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgfQotICByZXR1cm4gZXJybXNnOwotfQotDAotLyogU2lnbmVkIGludGVnZXIgdmFsaWRhdGlvbiByb3V0aW5lLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3ZhbGlkYXRlX3NpZ25lZF9pbnRlZ2VyICh2YWx1ZSwgbWluLCBtYXgpCi0gICAgIGxvbmcgdmFsdWUsIG1pbiwgbWF4OwotewotICBpZiAodmFsdWUgPCBtaW4gfHwgdmFsdWUgPiBtYXgpCi0gICAgewotICAgICAgc3RhdGljIGNoYXIgYnVmWzEwMF07Ci0KLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChidWYsIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbGQgbm90IGJldHdlZW4gJWxkIGFuZCAlbGQpIiksCi0JCSAgICAgIHZhbHVlLCBtaW4sIG1heCk7Ci0gICAgICByZXR1cm4gYnVmOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogVW5zaWduZWQgaW50ZWdlciB2YWxpZGF0aW9uIHJvdXRpbmUuCi0gICBTdXBwbHlpbmcgYG1pbicgaGVyZSBtYXkgc2VlbSB1bm5lY2Vzc2FyeSwgYnV0IHdlIGFsc28gd2FudCB0byBoYW5kbGUKLSAgIGNhc2VzIHdoZXJlIG1pbiAhPSAwIChhbmQgbWF4ID4gTE9OR19NQVgpLiAgKi8KLQotY29uc3QgY2hhciAqCi1jZ2VuX3ZhbGlkYXRlX3Vuc2lnbmVkX2ludGVnZXIgKHZhbHVlLCBtaW4sIG1heCkKLSAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZSwgbWluLCBtYXg7Ci17Ci0gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkKLSAgICB7Ci0gICAgICBzdGF0aWMgY2hhciBidWZbMTAwXTsKLQotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAlbHUgYW5kICVsdSkiKSwKLQkgICAgICAgdmFsdWUsIG1pbiwgbWF4KTsKLSAgICAgIHJldHVybiBidWY7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jZ2VuLWRpcy5jIGIvb3Bjb2Rlcy9jZ2VuLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGIxY2Q5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvY2dlbi1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKiBDR0VOIGdlbmVyaWMgZGlzYXNzZW1ibGVyIHN1cHBvcnQgY29kZS4KLQotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZCBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICAgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAibGliaWJlcnR5LmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAib3Bjb2RlL2NnZW4uaCIKLQotLyogU3Vicm91dGluZSBvZiBidWlsZF9kaXNfaGFzaF90YWJsZSB0byBhZGQgSU5TTlMgdG8gdGhlIGhhc2ggdGFibGUuCi0KLSAgIENPVU5UIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gSU5TTlMuCi0gICBFTlRTSVpFIGlzIHNpemVvZiAoQ0dFTl9JQkFTRSkgZm9yIHRoZSB0YXJnZXQuCi0gICA/Pz8gTm8gbG9uZ2VyIHVzZWQgYnV0IGxlYXZlIGluIGZvciBub3cuCi0gICBIVEFCTEUgcG9pbnRzIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgSEVOVEJVRiBpcyBhIHBvaW50ZXIgdG8gc3VmZmljaWVudGx5IGxhcmdlIGJ1ZmZlciBvZiBoYXNoIGVudHJpZXMuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBlbnRyeSB0byB1c2UuCi0KLSAgIFRoZSB0YWJsZSBpcyBzY2FubmVkIGJhY2t3YXJkcyBhcyBhZGRpdGlvbnMgYXJlIG1hZGUgdG8gdGhlIGZyb250IG9mIHRoZQotICAgbGlzdCBhbmQgd2Ugd2FudCBlYXJsaWVyIG9uZXMgdG8gYmUgcHJlZmVyZWQuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2FycmF5IChjZCwgaW5zbnMsIGNvdW50LCBlbnRzaXplLCBodGFibGUsIGhlbnRidWYpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqIGluc25zOwotICAgICBpbnQgY291bnQ7Ci0gICAgIGludCBlbnRzaXplOwotICAgICBDR0VOX0lOU05fTElTVCAqKiBodGFibGU7Ci0gICAgIENHRU5fSU5TTl9MSVNUICogaGVudGJ1ZjsKLXsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotICBpbnQgaTsKLQotICBmb3IgKGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgLS1pLCArK2hlbnRidWYpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50IGhhc2g7Ci0gICAgICBjaGFyIGJ1ZiBbNF07Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gJmluc25zW2ldOwotCi0gICAgICBpZiAoISAoKiBjZC0+ZGlzX2hhc2hfcCkgKGluc24pKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBXZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHRhcmdldCB1c2VzIHRoZSBidWZmZXIgb3IgdGhlIGJhc2UgaW5zbgotCSB0byBoYXNoIG9uLCBzbyBzZXQgYm90aCB1cC4gICovCi0KLSAgICAgIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pOwotICAgICAgc3dpdGNoIChDR0VOX0lOU05fTUFTS19CSVRTSVpFIChpbnNuKSkKLQl7Ci0JY2FzZSA4OgotCSAgYnVmWzBdID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDE2OgotCSAgaWYgKGJpZ19wKQotCSAgICBiZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGJyZWFrOwotCWNhc2UgMzI6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaGFzaCA9ICgqIGNkLT5kaXNfaGFzaCkgKGJ1ZiwgdmFsdWUpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZVtoYXNoXTsKLSAgICAgIGhlbnRidWYtPmluc24gPSBpbnNuOwotICAgICAgaHRhYmxlW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgYnVpbGRfZGlzX2hhc2hfdGFibGUgdG8gYWRkIElOU05TIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaGFzaF9pbnNuX2FycmF5IGV4Y2VwdCB0aGUgaW5zbnMgYXJlCi0gICBpbiBhIGxpc3QuICAqLwotCi1zdGF0aWMgQ0dFTl9JTlNOX0xJU1QgKgotaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNucywgaHRhYmxlLCBoZW50YnVmKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbnM7Ci0gICAgIENHRU5fSU5TTl9MSVNUICoqaHRhYmxlOwotICAgICBDR0VOX0lOU05fTElTVCAqaGVudGJ1ZjsKLXsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaWxpc3Q7Ci0KLSAgZm9yIChpbGlzdCA9IGluc25zOyBpbGlzdCAhPSBOVUxMOyBpbGlzdCA9IGlsaXN0LT5uZXh0LCArKyBoZW50YnVmKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGludCBoYXNoOwotICAgICAgY2hhciBidWZbNF07Ci0gICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0gICAgICBpZiAoISAoKiBjZC0+ZGlzX2hhc2hfcCkgKGlsaXN0LT5pbnNuKSkKLQljb250aW51ZTsKLQotICAgICAgLyogV2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSB0YXJnZXQgdXNlcyB0aGUgYnVmZmVyIG9yIHRoZSBiYXNlIGluc24KLQkgdG8gaGFzaCBvbiwgc28gc2V0IGJvdGggdXAuICAqLwotCi0gICAgICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbGlzdC0+aW5zbik7Ci0gICAgICBzd2l0Y2ggKENHRU5fSU5TTl9NQVNLX0JJVFNJWkUgKGlsaXN0LT5pbnNuKSkKLQl7Ci0JY2FzZSA4OgotCSAgYnVmWzBdID0gdmFsdWU7Ci0JICBicmVhazsKLQljYXNlIDE2OgotCSAgaWYgKGJpZ19wKQotCSAgICBiZmRfcHV0YjE2ICgoYmZkX3ZtYSkgdmFsdWUsIGJ1Zik7Ci0JICBlbHNlCi0JICAgIGJmZF9wdXRsMTYgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGJyZWFrOwotCWNhc2UgMzI6Ci0JICBpZiAoYmlnX3ApCi0JICAgIGJmZF9wdXRiMzIgKChiZmRfdm1hKSB2YWx1ZSwgYnVmKTsKLQkgIGVsc2UKLQkgICAgYmZkX3B1dGwzMiAoKGJmZF92bWEpIHZhbHVlLCBidWYpOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGFib3J0ICgpOwotCX0KLQotICAgICAgaGFzaCA9ICgqIGNkLT5kaXNfaGFzaCkgKGJ1ZiwgdmFsdWUpOwotICAgICAgaGVudGJ1Zi0+bmV4dCA9IGh0YWJsZSBbaGFzaF07Ci0gICAgICBoZW50YnVmLT5pbnNuID0gaWxpc3QtPmluc247Ci0gICAgICBodGFibGUgW2hhc2hdID0gaGVudGJ1ZjsKLSAgICB9Ci0KLSAgcmV0dXJuIGhlbnRidWY7Ci19Ci0KLS8qIEJ1aWxkIHRoZSBkaXNhc3NlbWJsZXIgaW5zdHJ1Y3Rpb24gaGFzaCB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9kaXNfaGFzaF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNnZW5faW5zbl9jb3VudCAoY2QpICsgY2dlbl9tYWNyb19pbnNuX2NvdW50IChjZCk7Ci0gIENHRU5fSU5TTl9UQUJMRSAqaW5zbl90YWJsZSA9ICYgY2QtPmluc25fdGFibGU7Ci0gIENHRU5fSU5TTl9UQUJMRSAqbWFjcm9faW5zbl90YWJsZSA9ICYgY2QtPm1hY3JvX2luc25fdGFibGU7Ci0gIHVuc2lnbmVkIGludCBoYXNoX3NpemUgPSBjZC0+ZGlzX2hhc2hfc2l6ZTsKLSAgQ0dFTl9JTlNOX0xJU1QgKmhhc2hfZW50cnlfYnVmOwotICBDR0VOX0lOU05fTElTVCAqKmRpc19oYXNoX3RhYmxlOwotICBDR0VOX0lOU05fTElTVCAqZGlzX2hhc2hfdGFibGVfZW50cmllczsKLQotICAvKiBUaGUgc3BhY2UgYWxsb2NhdGVkIGZvciB0aGUgaGFzaCB0YWJsZSBjb25zaXN0cyBvZiB0d28gcGFydHM6Ci0gICAgIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgaGFzaCBsaXN0cy4gICovCi0KLSAgZGlzX2hhc2hfdGFibGUgPSAoQ0dFTl9JTlNOX0xJU1QgKiopCi0gICAgeG1hbGxvYyAoaGFzaF9zaXplICogc2l6ZW9mIChDR0VOX0lOU05fTElTVCAqKSk7Ci0gIG1lbXNldCAoZGlzX2hhc2hfdGFibGUsIDAsIGhhc2hfc2l6ZSAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QgKikpOwotICBkaXNfaGFzaF90YWJsZV9lbnRyaWVzID0gaGFzaF9lbnRyeV9idWYgPSAoQ0dFTl9JTlNOX0xJU1QgKikKLSAgICB4bWFsbG9jIChjb3VudCAqIHNpemVvZiAoQ0dFTl9JTlNOX0xJU1QpKTsKLQotICAvKiBBZGQgY29tcGlsZWQgaW4gaW5zbnMuCi0gICAgIERvbid0IGluY2x1ZGUgdGhlIGZpcnN0IG9uZSBhcyBpdCBpcyBhIHJlc2VydmVkIGVudHJ5LiAgKi8KLSAgLyogPz8/IEl0IHdhcyB0aGUgZW5kIG9mIGFsbCBoYXNoIGNoYWlucywgYW5kIGFsc28gdGhlIHNwZWNpYWwKLSAgICAgImludmFsaWQgaW5zbiIgbWFya2VyLiAgTWF5IGJlIGFibGUgdG8gZG8gaXQgZGlmZmVyZW50bHkgbm93LiAgKi8KLQotICBoYXNoX2VudHJ5X2J1ZiA9IGhhc2hfaW5zbl9hcnJheSAoY2QsCi0JCQkJICAgIGluc25fdGFibGUtPmluaXRfZW50cmllcyArIDEsCi0JCQkJICAgIGluc25fdGFibGUtPm51bV9pbml0X2VudHJpZXMgLSAxLAotCQkJCSAgICBpbnNuX3RhYmxlLT5lbnRyeV9zaXplLAotCQkJCSAgICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBjb21waWxlZCBpbiBtYWNyby1pbnNucy4gICovCi0KLSAgaGFzaF9lbnRyeV9idWYgPSBoYXNoX2luc25fYXJyYXkgKGNkLCBtYWNyb19pbnNuX3RhYmxlLT5pbml0X2VudHJpZXMsCi0JCQkJICAgIG1hY3JvX2luc25fdGFibGUtPm51bV9pbml0X2VudHJpZXMsCi0JCQkJICAgIG1hY3JvX2luc25fdGFibGUtPmVudHJ5X3NpemUsCi0JCQkJICAgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgLyogQWRkIHJ1bnRpbWUgYWRkZWQgaW5zbnMuCi0gICAgIExhdGVyIGFkZGVkIGluc25zIHdpbGwgYmUgcHJlZmVyZWQgb3ZlciBlYXJsaWVyIG9uZXMuICAqLwotCi0gIGhhc2hfZW50cnlfYnVmID0gaGFzaF9pbnNuX2xpc3QgKGNkLCBpbnNuX3RhYmxlLT5uZXdfZW50cmllcywKLQkJCQkgICBkaXNfaGFzaF90YWJsZSwgaGFzaF9lbnRyeV9idWYpOwotCi0gIC8qIEFkZCBydW50aW1lIGFkZGVkIG1hY3JvLWluc25zLiAgKi8KLQotICBoYXNoX2luc25fbGlzdCAoY2QsIG1hY3JvX2luc25fdGFibGUtPm5ld19lbnRyaWVzLAotCQkgIGRpc19oYXNoX3RhYmxlLCBoYXNoX2VudHJ5X2J1Zik7Ci0KLSAgY2QtPmRpc19oYXNoX3RhYmxlID0gZGlzX2hhc2hfdGFibGU7Ci0gIGNkLT5kaXNfaGFzaF90YWJsZV9lbnRyaWVzID0gZGlzX2hhc2hfdGFibGVfZW50cmllczsKLX0KLQotLyogUmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgaGFzaCBsaXN0IGZvciBJTlNOLiAgKi8KLQotQ0dFTl9JTlNOX0xJU1QgKgotY2dlbl9kaXNfbG9va3VwX2luc24gKGNkLCBidWYsIHZhbHVlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoY2QtPmRpc19oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfZGlzX2hhc2hfdGFibGUgKGNkKTsKLQotICBoYXNoID0gKCogY2QtPmRpc19oYXNoKSAoYnVmLCB2YWx1ZSk7Ci0KLSAgcmV0dXJuIGNkLT5kaXNfaGFzaF90YWJsZVtoYXNoXTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvY2dlbi1vcGMuYyBiL29wY29kZXMvY2dlbi1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4NDBhNi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2NnZW4tb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTcgKzAsMCBAQAotLyogQ0dFTiBnZW5lcmljIG9wY29kZSBzdXBwb3J0LgotCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gICBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAgIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gICA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGFzaF9rZXl3b3JkX25hbWUKLSAgUEFSQU1TICgoY29uc3QgQ0dFTl9LRVlXT1JEICosIGNvbnN0IGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfa2V5d29yZF92YWx1ZQotICBQQVJBTVMgKChjb25zdCBDR0VOX0tFWVdPUkQgKiwgdW5zaWduZWQgaW50KSk7Ci1zdGF0aWMgdm9pZCBidWlsZF9rZXl3b3JkX2hhc2hfdGFibGVzCi0gIFBBUkFNUyAoKENHRU5fS0VZV09SRCAqKSk7Ci0KLS8qIFJldHVybiBudW1iZXIgb2YgaGFzaCB0YWJsZSBlbnRyaWVzIHRvIHVzZSBmb3IgTiBlbGVtZW50cy4gICovCi0jZGVmaW5lIEtFWVdPUkRfSEFTSF9TSVpFKG4pICgobikgPD0gMzEgPyAxNyA6IDMxKQotCi0vKiBMb29rIHVwICpOQU1FUCBpbiB0aGUga2V5d29yZCB0YWJsZSBLVC4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIGtleXdvcmQgZW50cnkgb3IgTlVMTCBpZiBub3QgZm91bmQuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX2xvb2t1cF9uYW1lIChrdCwgbmFtZSkKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICprZTsKLSAgY29uc3QgY2hhciAqcCwqbjsKLQotICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKLQotICBrZSA9IGt0LT5uYW1lX2hhc2hfdGFibGVbaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBuYW1lLCAwKV07Ci0KLSAgLyogV2UgZG8gY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29ucy4KLSAgICAgSWYgdGhhdCBldmVyIGJlY29tZXMgYSBwcm9ibGVtLCBhZGQgYW4gYXR0cmlidXRlIHRoYXQgZGVub3RlcwotICAgICAiZG8gY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbnMiLiAgKi8KLQotICB3aGlsZSAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBuID0gbmFtZTsKLSAgICAgIHAgPSBrZS0+bmFtZTsKLQotICAgICAgd2hpbGUgKCpwCi0JICAgICAmJiAoKnAgPT0gKm4KLQkJIHx8IChpc2FscGhhICgodW5zaWduZWQgY2hhcikgKnApCi0JCSAgICAgJiYgKHRvbG93ZXIgKCh1bnNpZ25lZCBjaGFyKSAqcCkKLQkJCSA9PSB0b2xvd2VyICgodW5zaWduZWQgY2hhcikgKm4pKSkpKQotCSsrbiwgKytwOwotCi0gICAgICBpZiAoISpwICYmICEqbikKLQlyZXR1cm4ga2U7Ci0KLSAgICAgIGtlID0ga2UtPm5leHRfbmFtZTsKLSAgICB9Ci0KLSAgaWYgKGt0LT5udWxsX2VudHJ5KQotICAgIHJldHVybiBrdC0+bnVsbF9lbnRyeTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIExvb2sgdXAgVkFMVUUgaW4gdGhlIGtleXdvcmQgdGFibGUgS1QuCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBrZXl3b3JkIGVudHJ5IG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgQ0dFTl9LRVlXT1JEX0VOVFJZICoKLWNnZW5fa2V5d29yZF9sb29rdXBfdmFsdWUgKGt0LCB2YWx1ZSkKLSAgICAgQ0dFTl9LRVlXT1JEICprdDsKLSAgICAgaW50IHZhbHVlOwotewotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIGtlID0ga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF9rZXl3b3JkX3ZhbHVlIChrdCwgdmFsdWUpXTsKLQotICB3aGlsZSAoa2UgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgPT0ga2UtPnZhbHVlKQotCXJldHVybiBrZTsKLSAgICAgIGtlID0ga2UtPm5leHRfdmFsdWU7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBBZGQgYW4gZW50cnkgdG8gYSBrZXl3b3JkIHRhYmxlLiAgKi8KLQotdm9pZAotY2dlbl9rZXl3b3JkX2FkZCAoa3QsIGtlKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotewotICB1bnNpZ25lZCBpbnQgaGFzaDsKLQotICBpZiAoa3QtPm5hbWVfaGFzaF90YWJsZSA9PSBOVUxMKQotICAgIGJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KTsKLQotICBoYXNoID0gaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBrZS0+bmFtZSwgMCk7Ci0gIGtlLT5uZXh0X25hbWUgPSBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hdOwotICBrdC0+bmFtZV9oYXNoX3RhYmxlW2hhc2hdID0ga2U7Ci0KLSAgaGFzaCA9IGhhc2hfa2V5d29yZF92YWx1ZSAoa3QsIGtlLT52YWx1ZSk7Ci0gIGtlLT5uZXh0X3ZhbHVlID0ga3QtPnZhbHVlX2hhc2hfdGFibGVbaGFzaF07Ci0gIGt0LT52YWx1ZV9oYXNoX3RhYmxlW2hhc2hdID0ga2U7Ci0KLSAgaWYgKGtlLT5uYW1lWzBdID09IDApCi0gICAga3QtPm51bGxfZW50cnkgPSBrZTsKLX0KLQotLyogRklYTUU6IE5lZWQgZnVuY3Rpb24gdG8gcmV0dXJuIGNvdW50IG9mIGtleXdvcmRzLiAgKi8KLQotLyogSW5pdGlhbGl6ZSBhIGtleXdvcmQgdGFibGUgc2VhcmNoLgotICAgU1BFQyBpcyBhIHNwZWNpZmljYXRpb24gb2Ygd2hhdCB0byBzZWFyY2ggZm9yLgotICAgQSB2YWx1ZSBvZiBOVUxMIG1lYW5zIHRvIGZpbmQgZXZlcnkga2V5d29yZC4KLSAgIEN1cnJlbnRseSBOVUxMIGlzIHRoZSBvbmx5IGFjY2VwdGFibGUgdmFsdWUgW2Z1cnRoZXIgc3BlY2lmaWNhdGlvbgotICAgZGVmZXJyZWRdLgotICAgVGhlIHJlc3VsdCBpcyBhbiBvcGFxdWUgZGF0YSBpdGVtIHVzZWQgdG8gcmVjb3JkIHRoZSBzZWFyY2ggc3RhdHVzLgotICAgSXQgaXMgcGFzc2VkIHRvIGVhY2ggY2FsbCB0byBjZ2VuX2tleXdvcmRfc2VhcmNoX25leHQuICAqLwotCi1DR0VOX0tFWVdPUkRfU0VBUkNICi1jZ2VuX2tleXdvcmRfc2VhcmNoX2luaXQgKGt0LCBzcGVjKQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpzcGVjOwotewotICBDR0VOX0tFWVdPUkRfU0VBUkNIIHNlYXJjaDsKLQotICAvKiBGSVhNRTogTmVlZCB0byBzcGVjaWZ5IGZvcm1hdCBvZiBQQVJBTVMuICAqLwotICBpZiAoc3BlYyAhPSBOVUxMKQotICAgIGFib3J0ICgpOwotCi0gIGlmIChrdC0+bmFtZV9oYXNoX3RhYmxlID09IE5VTEwpCi0gICAgYnVpbGRfa2V5d29yZF9oYXNoX3RhYmxlcyAoa3QpOwotCi0gIHNlYXJjaC50YWJsZSA9IGt0OwotICBzZWFyY2guc3BlYyA9IHNwZWM7Ci0gIHNlYXJjaC5jdXJyZW50X2hhc2ggPSAwOwotICBzZWFyY2guY3VycmVudF9lbnRyeSA9IE5VTEw7Ci0gIHJldHVybiBzZWFyY2g7Ci19Ci0KLS8qIFJldHVybiB0aGUgbmV4dCBrZXl3b3JkIHNwZWNpZmllZCBieSBTRUFSQ0guCi0gICBUaGUgcmVzdWx0IGlzIHRoZSBuZXh0IGVudHJ5IG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vIG1vcmUuICAqLwotCi1jb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKgotY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0IChzZWFyY2gpCi0gICAgIENHRU5fS0VZV09SRF9TRUFSQ0ggKnNlYXJjaDsKLXsKLSAgLyogSGFzIHNlYXJjaCBmaW5pc2hlZD8gICovCi0gIGlmIChzZWFyY2gtPmN1cnJlbnRfaGFzaCA9PSBzZWFyY2gtPnRhYmxlLT5oYXNoX3RhYmxlX3NpemUpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgLyogU2VhcmNoIGluIHByb2dyZXNzPyAgKi8KLSAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMCi0gICAgICAvKiBBbnl0aGluZyBsZWZ0IG9uIHRoaXMgaGFzaCBjaGFpbj8gICovCi0gICAgICAmJiBzZWFyY2gtPmN1cnJlbnRfZW50cnktPm5leHRfbmFtZSAhPSBOVUxMKQotICAgIHsKLSAgICAgIHNlYXJjaC0+Y3VycmVudF9lbnRyeSA9IHNlYXJjaC0+Y3VycmVudF9lbnRyeS0+bmV4dF9uYW1lOwotICAgICAgcmV0dXJuIHNlYXJjaC0+Y3VycmVudF9lbnRyeTsKLSAgICB9Ci0KLSAgLyogTW92ZSB0byBuZXh0IGhhc2ggY2hhaW4gW3VubGVzcyB3ZSBoYXZlbid0IHN0YXJ0ZWQgeWV0XS4gICovCi0gIGlmIChzZWFyY2gtPmN1cnJlbnRfZW50cnkgIT0gTlVMTCkKLSAgICArK3NlYXJjaC0+Y3VycmVudF9oYXNoOwotCi0gIHdoaWxlIChzZWFyY2gtPmN1cnJlbnRfaGFzaCA8IHNlYXJjaC0+dGFibGUtPmhhc2hfdGFibGVfc2l6ZSkKLSAgICB7Ci0gICAgICBzZWFyY2gtPmN1cnJlbnRfZW50cnkgPSBzZWFyY2gtPnRhYmxlLT5uYW1lX2hhc2hfdGFibGVbc2VhcmNoLT5jdXJyZW50X2hhc2hdOwotICAgICAgaWYgKHNlYXJjaC0+Y3VycmVudF9lbnRyeSAhPSBOVUxMKQotCXJldHVybiBzZWFyY2gtPmN1cnJlbnRfZW50cnk7Ci0gICAgICArK3NlYXJjaC0+Y3VycmVudF9oYXNoOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJuIGZpcnN0IGVudHJ5IGluIGhhc2ggY2hhaW4gZm9yIE5BTUUuCi0gICBJZiBDQVNFX1NFTlNJVElWRV9QIGlzIG5vbi16ZXJvLCByZXR1cm4gYSBjYXNlIHNlbnNpdGl2ZSBoYXNoLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotaGFzaF9rZXl3b3JkX25hbWUgKGt0LCBuYW1lLCBjYXNlX3NlbnNpdGl2ZV9wKQotICAgICBjb25zdCBDR0VOX0tFWVdPUkQgKmt0OwotICAgICBjb25zdCBjaGFyICpuYW1lOwotICAgICBpbnQgY2FzZV9zZW5zaXRpdmVfcDsKLXsKLSAgdW5zaWduZWQgaW50IGhhc2g7Ci0KLSAgaWYgKGNhc2Vfc2Vuc2l0aXZlX3ApCi0gICAgZm9yIChoYXNoID0gMDsgKm5hbWU7ICsrbmFtZSkKLSAgICAgIGhhc2ggPSAoaGFzaCAqIDk3KSArICh1bnNpZ25lZCBjaGFyKSAqbmFtZTsKLSAgZWxzZQotICAgIGZvciAoaGFzaCA9IDA7ICpuYW1lOyArK25hbWUpCi0gICAgICBoYXNoID0gKGhhc2ggKiA5NykgKyAodW5zaWduZWQgY2hhcikgdG9sb3dlciAoKm5hbWUpOwotICByZXR1cm4gaGFzaCAlIGt0LT5oYXNoX3RhYmxlX3NpemU7Ci19Ci0KLS8qIFJldHVybiBmaXJzdCBlbnRyeSBpbiBoYXNoIGNoYWluIGZvciBWQUxVRS4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWhhc2hfa2V5d29yZF92YWx1ZSAoa3QsIHZhbHVlKQotICAgICBjb25zdCBDR0VOX0tFWVdPUkQgKmt0OwotICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiB2YWx1ZSAlIGt0LT5oYXNoX3RhYmxlX3NpemU7Ci19Ci0KLS8qIEJ1aWxkIGEga2V5d29yZCB0YWJsZSdzIGhhc2ggdGFibGVzLgotICAgV2UgcHJvYmFibHkgbmVlZG4ndCBidWlsZCB0aGUgdmFsdWUgaGFzaCB0YWJsZSBmb3IgdGhlIGFzc2VtYmxlciB3aGVuCi0gICB3ZSdyZSB1c2luZyB0aGUgZGlzYXNzZW1ibGVyLCBidXQgd2Uga2VlcCB0aGluZ3Mgc2ltcGxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2tleXdvcmRfaGFzaF90YWJsZXMgKGt0KQotICAgICBDR0VOX0tFWVdPUkQgKmt0OwotewotICBpbnQgaTsKLSAgLyogVXNlIHRoZSBudW1iZXIgb2YgY29tcGlsZWQgaW4gZW50cmllcyBhcyBhbiBlc3RpbWF0ZSBmb3IgdGhlCi0gICAgIHR5cGljYWwgc2l6ZWQgdGFibGUgW25vdCB0b28gbWFueSBhZGRlZCBhdCBydW50aW1lXS4gICovCi0gIHVuc2lnbmVkIGludCBzaXplID0gS0VZV09SRF9IQVNIX1NJWkUgKGt0LT5udW1faW5pdF9lbnRyaWVzKTsKLQotICBrdC0+aGFzaF90YWJsZV9zaXplID0gc2l6ZTsKLSAga3QtPm5hbWVfaGFzaF90YWJsZSA9IChDR0VOX0tFWVdPUkRfRU5UUlkgKiopCi0gICAgeG1hbGxvYyAoc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLSAgbWVtc2V0IChrdC0+bmFtZV9oYXNoX3RhYmxlLCAwLCBzaXplICogc2l6ZW9mIChDR0VOX0tFWVdPUkRfRU5UUlkgKikpOwotICBrdC0+dmFsdWVfaGFzaF90YWJsZSA9IChDR0VOX0tFWVdPUkRfRU5UUlkgKiopCi0gICAgeG1hbGxvYyAoc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLSAgbWVtc2V0IChrdC0+dmFsdWVfaGFzaF90YWJsZSwgMCwgc2l6ZSAqIHNpemVvZiAoQ0dFTl9LRVlXT1JEX0VOVFJZICopKTsKLQotICAvKiBUaGUgdGFibGUgaXMgc2Nhbm5lZCBiYWNrd2FyZHMgYXMgd2Ugd2FudCBrZXl3b3JkcyBhcHBlYXJpbmcgZWFybGllciB0bwotICAgICBiZSBwcmVmZXJlZCBvdmVyIGxhdGVyIG9uZXMuICAqLwotICBmb3IgKGkgPSBrdC0+bnVtX2luaXRfZW50cmllcyAtIDE7IGkgPj0gMDsgLS1pKQotICAgIGNnZW5fa2V5d29yZF9hZGQgKGt0LCAma3QtPmluaXRfZW50cmllc1tpXSk7Ci19Ci0MCi0vKiBIYXJkd2FyZSBzdXBwb3J0LiAgKi8KLQotLyogTG9va3VwIGEgaGFyZHdhcmUgZWxlbWVudCBieSBpdHMgbmFtZS4KLSAgIFJldHVybnMgTlVMTCBpZiBOQU1FIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgbWFjaC9pc2EuICAqLwotCi1jb25zdCBDR0VOX0hXX0VOVFJZICoKLWNnZW5faHdfbG9va3VwX2J5X25hbWUgKGNkLCBuYW1lKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKmh3ID0gY2QtPmh3X3RhYmxlLmVudHJpZXM7Ci0KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5od190YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChod1tpXSAmJiBzdHJjbXAgKG5hbWUsIGh3W2ldLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIGh3W2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBMb29rdXAgYSBoYXJkd2FyZSBlbGVtZW50IGJ5IGl0cyBudW1iZXIuCi0gICBIYXJkd2FyZSBlbGVtZW50cyBhcmUgZW51bWVyYXRlZCwgaG93ZXZlciBpdCBtYXkgYmUgcG9zc2libGUgdG8gYWRkIHNvbWUKLSAgIGF0IHJ1bnRpbWUsIHRodXMgSFdOVU0gaXMgbm90IGFuIGVudW0gdHlwZSBidXQgcmF0aGVyIGFuIGludC4KLSAgIFJldHVybnMgTlVMTCBpZiBIV05VTSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFjaC4gICovCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgKgotY2dlbl9od19sb29rdXBfYnlfbnVtIChjZCwgaHdudW0pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBod251bTsKLXsKLSAgaW50IGk7Ci0gIGNvbnN0IENHRU5fSFdfRU5UUlkgKipodyA9IGNkLT5od190YWJsZS5lbnRyaWVzOwotCi0gIC8qID8/PyBUaGlzIGNhbiBiZSBzcGVlZGVkIHVwLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IGNkLT5od190YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChod1tpXSAmJiBod251bSA9PSBod1tpXS0+dHlwZSkKLSAgICAgIHJldHVybiBod1tpXTsKLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgc3VwcG9ydC4gICovCi0KLS8qIExvb2t1cCBhbiBvcGVyYW5kIGJ5IGl0cyBuYW1lLgotICAgUmV0dXJucyBOVUxMIGlmIE5BTUUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fT1BFUkFORCAqCi1jZ2VuX29wZXJhbmRfbG9va3VwX2J5X25hbWUgKGNkLCBuYW1lKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9PUEVSQU5EICoqb3AgPSBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzOwotCi0gIGZvciAoaSA9IDA7IGkgPCBjZC0+b3BlcmFuZF90YWJsZS5udW1fZW50cmllczsgKytpKQotICAgIGlmIChvcFtpXSAmJiBzdHJjbXAgKG5hbWUsIG9wW2ldLT5uYW1lKSA9PSAwKQotICAgICAgcmV0dXJuIG9wW2ldOwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBMb29rdXAgYW4gb3BlcmFuZCBieSBpdHMgbnVtYmVyLgotICAgT3BlcmFuZHMgYXJlIGVudW1lcmF0ZWQsIGhvd2V2ZXIgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGFkZCBzb21lCi0gICBhdCBydW50aW1lLCB0aHVzIE9QTlVNIGlzIG5vdCBhbiBlbnVtIHR5cGUgYnV0IHJhdGhlciBhbiBpbnQuCi0gICBSZXR1cm5zIE5VTEwgaWYgT1BOVU0gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudGx5IHNlbGVjdGVkCi0gICBtYWNoL2lzYS4gICovCi0KLWNvbnN0IENHRU5fT1BFUkFORCAqCi1jZ2VuX29wZXJhbmRfbG9va3VwX2J5X251bSAoY2QsIG9wbnVtKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BudW07Ci17Ci0gIHJldHVybiBjZC0+b3BlcmFuZF90YWJsZS5lbnRyaWVzW29wbnVtXTsKLX0KLQwKLS8qIEluc3RydWN0aW9uIHN1cHBvcnQuICAqLwotCi0vKiBSZXR1cm4gbnVtYmVyIG9mIGluc3RydWN0aW9ucy4gIFRoaXMgaW5jbHVkZXMgYW55IGFkZGVkIGF0IHJ1bnRpbWUuICAqLwotCi1pbnQKLWNnZW5faW5zbl9jb3VudCAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBjb3VudCA9IGNkLT5pbnNuX3RhYmxlLm51bV9pbml0X2VudHJpZXM7Ci0gIENHRU5fSU5TTl9MSVNUICpydF9pbnNucyA9IGNkLT5pbnNuX3RhYmxlLm5ld19lbnRyaWVzOwotCi0gIGZvciAoIDsgcnRfaW5zbnMgIT0gTlVMTDsgcnRfaW5zbnMgPSBydF9pbnNucy0+bmV4dCkKLSAgICArK2NvdW50OwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotLyogUmV0dXJuIG51bWJlciBvZiBtYWNyby1pbnN0cnVjdGlvbnMuCi0gICBUaGlzIGluY2x1ZGVzIGFueSBhZGRlZCBhdCBydW50aW1lLiAgKi8KLQotaW50Ci1jZ2VuX21hY3JvX2luc25fY291bnQgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgY291bnQgPSBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzOwotICBDR0VOX0lOU05fTElTVCAqcnRfaW5zbnMgPSBjZC0+bWFjcm9faW5zbl90YWJsZS5uZXdfZW50cmllczsKLQotICBmb3IgKCA7IHJ0X2luc25zICE9IE5VTEw7IHJ0X2luc25zID0gcnRfaW5zbnMtPm5leHQpCi0gICAgKytjb3VudDsKLQotICByZXR1cm4gY291bnQ7Ci19Ci0KLS8qIENvdmVyIGZ1bmN0aW9uIHRvIHJlYWQgYW5kIHByb3Blcmx5IGJ5dGVzd2FwIGFuIGluc24gdmFsdWUuICAqLwotCi1DR0VOX0lOU05fSU5UCi1jZ2VuX2dldF9pbnNuX3ZhbHVlIChjZCwgYnVmLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLQotICBzd2l0Y2ggKGxlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgdmFsdWUgPSAqYnVmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChjZC0+aW5zbl9lbmRpYW4gPT0gQ0dFTl9FTkRJQU5fQklHKQotCXZhbHVlID0gYmZkX2dldGIxNiAoYnVmKTsKLSAgICAgIGVsc2UKLQl2YWx1ZSA9IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JdmFsdWUgPSBiZmRfZ2V0YjMyIChidWYpOwotICAgICAgZWxzZQotCXZhbHVlID0gYmZkX2dldGwzMiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vKiBDb3ZlciBmdW5jdGlvbiB0byBzdG9yZSBhbiBpbnNuIHZhbHVlIHByb3Blcmx5IGJ5dGVzd2FwcGVkLiAgKi8KLQotdm9pZAotY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICBzd2l0Y2ggKGxlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgYnVmWzBdID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JYmZkX3B1dGIxNiAodmFsdWUsIGJ1Zik7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwxNiAodmFsdWUsIGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGNkLT5pbnNuX2VuZGlhbiA9PSBDR0VOX0VORElBTl9CSUcpCi0JYmZkX3B1dGIzMiAodmFsdWUsIGJ1Zik7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAodmFsdWUsIGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotDAotLyogTG9vayB1cCBpbnN0cnVjdGlvbiBJTlNOXypfVkFMVUUgYW5kIGV4dHJhY3QgaXRzIGZpZWxkcy4KLSAgIElOU05fSU5UX1ZBTFVFIGlzIHVzZWQgaWYgQ0dFTl9JTlRfSU5TTl9QLgotICAgT3RoZXJ3aXNlIElOU05fQllURVNfVkFMVUUgaXMgdXNlZC4KLSAgIElOU04sIGlmIG5vbi1udWxsLCBpcyB0aGUgaW5zbiB0YWJsZSBlbnRyeS4KLSAgIE90aGVyd2lzZSBJTlNOXypfVkFMVUUgaXMgZXhhbWluZWQgdG8gY29tcHV0ZSBpdC4KLSAgIExFTkdUSCBpcyB0aGUgYml0IGxlbmd0aCBvZiBJTlNOXypfVkFMVUUgaWYga25vd24sIG90aGVyd2lzZSAwLgotICAgMCBpcyBvbmx5IHZhbGlkIGlmIGBpbnNuID09IE5VTEwgJiYgISBDR0VOX0lOVF9JTlNOX1AnLgotICAgSWYgSU5TTiAhPSBOVUxMLCBMRU5HVEggbXVzdCBiZSB2YWxpZC4KLSAgIEFMSUFTX1AgaXMgbm9uLXplcm8gaWYgYWxpYXMgaW5zbnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBzZWFyY2guCi0KLSAgIFRoZSByZXN1bHQgaXMgYSBwb2ludGVyIHRvIHRoZSBpbnNuIHRhYmxlIGVudHJ5LCBvciBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbgotICAgd2Fzbid0IHJlY29nbml6ZWQuICAqLwotCi0vKiA/Pz8gV2lsbCBuZWVkIHRvIGJlIHJldmlzaXRlZCBmb3IgVkxJVyBhcmNoaXRlY3R1cmVzLiAgKi8KLQotY29uc3QgQ0dFTl9JTlNOICoKLWNnZW5fbG9va3VwX2luc24gKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwgbGVuZ3RoLCBmaWVsZHMsCi0JCSAgYWxpYXNfcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0lOU05fSU5UIGluc25faW50X3ZhbHVlOwotICAgICAvKiA/Pz8gQ0dFTl9JTlNOX0JZVEVTIHdvdWxkIGJlIGEgbmljZSB0eXBlIG5hbWUgdG8gdXNlIGhlcmUuICAqLwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzX3ZhbHVlOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBpbnQgYWxpYXNfcDsKLXsKLSAgdW5zaWduZWQgY2hhciAqYnVmOwotICBDR0VOX0lOU05fSU5UIGJhc2VfaW5zbjsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gKmluZm87Ci0KLSAgaWYgKGNkLT5pbnRfaW5zbl9wKQotICAgIHsKLSAgICAgIGluZm8gPSBOVUxMOwotICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgYWxsb2NhIChjZC0+bWF4X2luc25fYml0c2l6ZSAvIDgpOwotICAgICAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoLCBpbnNuX2ludF92YWx1ZSk7Ci0gICAgICBiYXNlX2luc24gPSBpbnNuX2ludF92YWx1ZTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpbmZvID0gJmV4X2luZm87Ci0gICAgICBleF9pbmZvLmRpc19pbmZvID0gTlVMTDsKLSAgICAgIGV4X2luZm8uaW5zbl9ieXRlcyA9IGluc25fYnl0ZXNfdmFsdWU7Ci0gICAgICBleF9pbmZvLnZhbGlkID0gLTE7Ci0gICAgICBidWYgPSBpbnNuX2J5dGVzX3ZhbHVlOwotICAgICAgYmFzZV9pbnNuID0gY2dlbl9nZXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZiwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgaWYgKCFpbnNuKQotICAgIHsKLSAgICAgIGNvbnN0IENHRU5fSU5TTl9MSVNUICppbnNuX2xpc3Q7Ci0KLSAgICAgIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotCSBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgICAgIGluc25fbGlzdCA9IGNnZW5fZGlzX2xvb2t1cF9pbnNuIChjZCwgYnVmLCBiYXNlX2luc24pOwotICAgICAgd2hpbGUgKGluc25fbGlzdCAhPSBOVUxMKQotCXsKLQkgIGluc24gPSBpbnNuX2xpc3QtPmluc247Ci0KLQkgIGlmIChhbGlhc19wCi0JICAgICAgLyogRklYTUU6IEVuc3VyZSBBTElBUyBhdHRyaWJ1dGUgYWx3YXlzIGhhcyBzYW1lIGluZGV4LiAgKi8KLQkgICAgICB8fCAhIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fQUxJQVMpKQotCSAgICB7Ci0JICAgICAgLyogQmFzaWMgYml0IG1hc2sgbXVzdCBiZSBjb3JyZWN0LiAgKi8KLQkgICAgICAvKiA/Pz8gTWF5IHdpc2ggdG8gYWxsb3cgdGFyZ2V0IHRvIGRlZmVyIHRoaXMgY2hlY2sgdW50aWwgdGhlCi0JCSBleHRyYWN0IGhhbmRsZXIuICAqLwotCSAgICAgIGlmICgoYmFzZV9pbnNuICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JCSAgPT0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pKQotCQl7Ci0JCSAgLyogPz8/IDAgaXMgcGFzc2VkIGZvciBgcGMnICovCi0JCSAgaW50IGVsZW5ndGggPSBDR0VOX0VYVFJBQ1RfRk4gKGNkLCBpbnNuKQotCQkgICAgKGNkLCBpbnNuLCBpbmZvLCBiYXNlX2luc24sIGZpZWxkcywgKGJmZF92bWEpIDApOwotCQkgIGlmIChlbGVuZ3RoID4gMCkKLQkJICAgIHsKLQkJICAgICAgLyogc2FuaXR5IGNoZWNrICovCi0JCSAgICAgIGlmIChsZW5ndGggIT0gMCAmJiBsZW5ndGggIT0gZWxlbmd0aCkKLQkJCWFib3J0ICgpOwotCQkgICAgICByZXR1cm4gaW5zbjsKLQkJICAgIH0KLQkJfQotCSAgICB9Ci0KLQkgIGluc25fbGlzdCA9IGluc25fbGlzdC0+bmV4dDsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogU2FuaXR5IGNoZWNrOiBjYW4ndCBwYXNzIGFuIGFsaWFzIGluc24gaWYgISBhbGlhc19wLiAgKi8KLSAgICAgIGlmICghIGFsaWFzX3AKLQkgICYmIENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fQUxJQVMpKQotCWFib3J0ICgpOwotICAgICAgLyogU2FuaXR5IGNoZWNrOiBsZW5ndGggbXVzdCBiZSBjb3JyZWN0LiAgKi8KLSAgICAgIGlmIChsZW5ndGggIT0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pKQotCWFib3J0ICgpOwotCi0gICAgICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLSAgICAgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JKGNkLCBpbnNuLCBpbmZvLCBiYXNlX2luc24sIGZpZWxkcywgKGJmZF92bWEpIDApOwotICAgICAgLyogU2FuaXR5IGNoZWNrOiBtdXN0IHN1Y2NlZWQuCi0JIENvdWxkIHJlbGF4IHRoaXMgbGF0ZXIgaWYgaXQgZXZlciBwcm92ZXMgdXNlZnVsLiAgKi8KLSAgICAgIGlmIChsZW5ndGggPT0gMCkKLQlhYm9ydCAoKTsKLSAgICAgIHJldHVybiBpbnNuOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQotLyogRmlsbCBpbiB0aGUgb3BlcmFuZCBpbnN0YW5jZXMgdXNlZCBieSBJTlNOIHdob3NlIG9wZXJhbmRzIGFyZSBGSUVMRFMuCi0gICBJTkRJQ0VTIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBvZiBNQVhfT1BFUkFORF9JTlNUQU5DRVMgaW50cyB0byBiZSBmaWxsZWQKLSAgIGluLiAgKi8KLQotdm9pZAotY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyAoY2QsIGluc24sIGZpZWxkcywgaW5kaWNlcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBpbnQgKmluZGljZXM7Ci17Ci0gIGNvbnN0IENHRU5fT1BJTlNUICpvcGluc3Q7Ci0gIGludCBpOwotCi0gIGlmIChpbnNuLT5vcGluc3QgPT0gTlVMTCkKLSAgICBhYm9ydCAoKTsKLSAgZm9yIChpID0gMCwgb3BpbnN0ID0gaW5zbi0+b3BpbnN0OyBvcGluc3QtPnR5cGUgIT0gQ0dFTl9PUElOU1RfRU5EOyArK2ksICsrb3BpbnN0KQotICAgIHsKLSAgICAgIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgb3BfdHlwZSA9IG9waW5zdC0+b3BfdHlwZTsKLSAgICAgIGlmIChvcF90eXBlID09IENHRU5fT1BFUkFORF9OSUwpCi0JaW5kaWNlc1tpXSA9IG9waW5zdC0+aW5kZXg7Ci0gICAgICBlbHNlCi0JaW5kaWNlc1tpXSA9ICgqY2QtPmdldF9pbnRfb3BlcmFuZCkgKGNkLCBvcF90eXBlLCBmaWVsZHMpOwotICAgIH0KLX0KLQotLyogQ292ZXIgZnVuY3Rpb24gdG8gY2dlbl9nZXRfaW5zbl9vcGVyYW5kcyB3aGVuIGVpdGhlciBJTlNOIG9yIEZJRUxEUwotICAgaXNuJ3Qga25vd24uCi0gICBUaGUgSU5TTiwgSU5TTl8qX1ZBTFVFLCBhbmQgTEVOR1RIIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvCi0gICBjZ2VuX2xvb2t1cF9pbnNuIHVuY2hhbmdlZC4KLSAgIElOU05fSU5UX1ZBTFVFIGlzIHVzZWQgaWYgQ0dFTl9JTlRfSU5TTl9QLgotICAgT3RoZXJ3aXNlIElOU05fQllURVNfVkFMVUUgaXMgdXNlZC4KLQotICAgVGhlIHJlc3VsdCBpcyB0aGUgaW5zbiB0YWJsZSBlbnRyeSBvciBOVUxMIGlmIHRoZSBpbnN0cnVjdGlvbiB3YXNuJ3QKLSAgIHJlY29nbml6ZWQuICAqLwotCi1jb25zdCBDR0VOX0lOU04gKgotY2dlbl9sb29rdXBfZ2V0X2luc25fb3BlcmFuZHMgKGNkLCBpbnNuLCBpbnNuX2ludF92YWx1ZSwgaW5zbl9ieXRlc192YWx1ZSwKLQkJCSAgICAgICBsZW5ndGgsIGluZGljZXMsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0lOU05fSU5UIGluc25faW50X3ZhbHVlOwotICAgICAvKiA/Pz8gQ0dFTl9JTlNOX0JZVEVTIHdvdWxkIGJlIGEgbmljZSB0eXBlIG5hbWUgdG8gdXNlIGhlcmUuICAqLwotICAgICB1bnNpZ25lZCBjaGFyICppbnNuX2J5dGVzX3ZhbHVlOwotICAgICBpbnQgbGVuZ3RoOwotICAgICBpbnQgKmluZGljZXM7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci17Ci0gIC8qIFBhc3Mgbm9uLXplcm8gZm9yIEFMSUFTX1Agb25seSBpZiBJTlNOICE9IE5VTEwuCi0gICAgIElmIElOU04gPT0gTlVMTCwgd2Ugd2FudCBhIHJlYWwgaW5zbi4gICovCi0gIGluc24gPSBjZ2VuX2xvb2t1cF9pbnNuIChjZCwgaW5zbiwgaW5zbl9pbnRfdmFsdWUsIGluc25fYnl0ZXNfdmFsdWUsCi0JCQkgICBsZW5ndGgsIGZpZWxkcywgaW5zbiAhPSBOVUxMKTsKLSAgaWYgKCEgaW5zbikKLSAgICByZXR1cm4gTlVMTDsKLQotICBjZ2VuX2dldF9pbnNuX29wZXJhbmRzIChjZCwgaW5zbiwgZmllbGRzLCBpbmRpY2VzKTsKLSAgcmV0dXJuIGluc247Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZy5pbiBiL29wY29kZXMvY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjBhMzIxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvY29uZmlnLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qIGNvbmZpZy5pbi4gIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLwotCi0vKiBEZWZpbmUgaWYgdXNpbmcgYWxsb2NhLmMuICAqLwotI3VuZGVmIENfQUxMT0NBCi0KLS8qIERlZmluZSB0byBlbXB0eSBpZiB0aGUga2V5d29yZCBkb2VzIG5vdCB3b3JrLiAgKi8KLSN1bmRlZiBjb25zdAotCi0vKiBEZWZpbmUgdG8gb25lIG9mIF9nZXRiNjcsIEdFVEI2NywgZ2V0YjY3IGZvciBDcmF5LTIgYW5kIENyYXktWU1QIHN5c3RlbXMuCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIGZvciBhbGxvY2EuYyBzdXBwb3J0IG9uIHRob3NlIHN5c3RlbXMuICAqLwotI3VuZGVmIENSQVlfU1RBQ0tTRUdfRU5ECi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSBhbGxvY2EsIGFzIGEgZnVuY3Rpb24gb3IgbWFjcm8uICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSA8YWxsb2NhLmg+IGFuZCBpdCBzaG91bGQgYmUgdXNlZCAobm90IG9uIFVsdHJpeCkuICAqLwotI3VuZGVmIEhBVkVfQUxMT0NBX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgd29ya2luZyBgbW1hcCcgc3lzdGVtIGNhbGwuICAqLwotI3VuZGVmIEhBVkVfTU1BUAotCi0vKiBEZWZpbmUgYXMgX19pbmxpbmUgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIgY2FsbHMgaXQuICAqLwotI3VuZGVmIGlubGluZQotCi0vKiBEZWZpbmUgdG8gYGxvbmcnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICAqLwotI3VuZGVmIG9mZl90Ci0KLS8qIERlZmluZSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3Igc3RhdCBhbmQgb3RoZXIgdGhpbmdzIHRvIHdvcmsuICAqLwotI3VuZGVmIF9QT1NJWF9TT1VSQ0UKLQotLyogRGVmaW5lIHRvIGB1bnNpZ25lZCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gICovCi0jdW5kZWYgc2l6ZV90Ci0KLS8qIElmIHVzaW5nIHRoZSBDIGltcGxlbWVudGF0aW9uIG9mIGFsbG9jYSwgZGVmaW5lIGlmIHlvdSBrbm93IHRoZQotICAgZGlyZWN0aW9uIG9mIHN0YWNrIGdyb3d0aCBmb3IgeW91ciBzeXN0ZW07IG90aGVyd2lzZSBpdCB3aWxsIGJlCi0gICBhdXRvbWF0aWNhbGx5IGRlZHVjZWQgYXQgcnVuLXRpbWUuCi0gU1RBQ0tfRElSRUNUSU9OID4gMCA9PiBncm93cyB0b3dhcmQgaGlnaGVyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA8IDAgPT4gZ3Jvd3MgdG93YXJkIGxvd2VyIGFkZHJlc3NlcwotIFNUQUNLX0RJUkVDVElPTiA9IDAgPT4gZGlyZWN0aW9uIG9mIGdyb3d0aCB1bmtub3duCi0gKi8KLSN1bmRlZiBTVEFDS19ESVJFQ1RJT04KLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAgKi8KLSN1bmRlZiBTVERDX0hFQURFUlMKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfY291bnQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX0NPVU5UCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgX19hcmd6X25leHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfX19BUkdaX05FWFQKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBfX2FyZ3pfc3RyaW5naWZ5IGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX19fQVJHWl9TVFJJTkdJRlkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBkY2dldHRleHQgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfRENHRVRURVhUCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgZ2V0Y3dkIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVENXRAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldHBhZ2VzaXplIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX0dFVFBBR0VTSVpFCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgbXVubWFwIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX01VTk1BUAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHB1dGVudiBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9QVVRFTlYKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzZXRlbnYgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU0VURU5WCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc2V0bG9jYWxlIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NFVExPQ0FMRQotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHN0cGNweSBmdW5jdGlvbi4gICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjYXNlY21wIGZ1bmN0aW9uLiAgKi8KLSN1bmRlZiBIQVZFX1NUUkNBU0VDTVAKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBzdHJjaHIgZnVuY3Rpb24uICAqLwotI3VuZGVmIEhBVkVfU1RSQ0hSCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGFyZ3ouaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfQVJHWl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGxpbWl0cy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9MSU1JVFNfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxsb2NhbGUuaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfTE9DQUxFX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bWFsbG9jLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX01BTExPQ19ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPG5sX3R5cGVzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX05MX1RZUEVTX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NURExJQl9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9TVFJJTkdfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1NUUklOR1NfSAotCi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvcGFyYW0uaD4gaGVhZGVyIGZpbGUuICAqLwotI3VuZGVmIEhBVkVfU1lTX1BBUkFNX0gKLQotLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAgKi8KLSN1bmRlZiBIQVZFX1VOSVNURF9ICi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHZhbHVlcy5oPiBoZWFkZXIgZmlsZS4gICovCi0jdW5kZWYgSEFWRV9WQUxVRVNfSAotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBQQUNLQUdFCi0KLS8qIFZlcnNpb24gbnVtYmVyIG9mIHBhY2thZ2UgKi8KLSN1bmRlZiBWRVJTSU9OCi0KLS8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgc3RwY3B5IGZ1bmN0aW9uICovCi0jdW5kZWYgSEFWRV9TVFBDUFkKLQotLyogRGVmaW5lIGlmIHlvdXIgbG9jYWxlLmggZmlsZSBjb250YWlucyBMQ19NRVNTQUdFUy4gKi8KLSN1bmRlZiBIQVZFX0xDX01FU1NBR0VTCi0KLS8qIERlZmluZSB0byAxIGlmIE5MUyBpcyByZXF1ZXN0ZWQgKi8KLSN1bmRlZiBFTkFCTEVfTkxTCi0KLS8qIERlZmluZSBhcyAxIGlmIHlvdSBoYXZlIGdldHRleHQgYW5kIGRvbid0IHdhbnQgdG8gdXNlIEdOVSBnZXR0ZXh0LiAqLwotI3VuZGVmIEhBVkVfR0VUVEVYVAotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2NvbmZpZ3VyZSBiL29wY29kZXMvY29uZmlndXJlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MWNmZjEyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvY29uZmlndXJlCisrKyAvZGV2L251bGwKQEAgLTEsNDc1NCArMCwwIEBACi0jISAvYmluL3NoCi0KLSMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgdXNpbmcgYXV0b2NvbmYgdmVyc2lvbiAyLjEzIAotIyBDb3B5cmlnaHQgKEMpIDE5OTIsIDkzLCA5NCwgOTUsIDk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotIwotIyBUaGlzIGNvbmZpZ3VyZSBzY3JpcHQgaXMgZnJlZSBzb2Z0d2FyZTsgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotIyBnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCi0KLSMgRGVmYXVsdHM6Ci1hY19oZWxwPQotYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAotIyBBbnkgYWRkaXRpb25zIGZyb20gY29uZmlndXJlLmluOgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS1lbmFibGUtc2hhcmVkWz1QS0dTXSAgYnVpbGQgc2hhcmVkIGxpYnJhcmllcyBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1zdGF0aWNbPVBLR1NdICBidWlsZCBzdGF0aWMgbGlicmFyaWVzIFtkZWZhdWx0PXllc10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1mYXN0LWluc3RhbGxbPVBLR1NdICBvcHRpbWl6ZSBmb3IgZmFzdCBpbnN0YWxsYXRpb24gW2RlZmF1bHQ9eWVzXSIKLWFjX2hlbHA9IiRhY19oZWxwCi0gIC0td2l0aC1nbnUtbGQgICAgICAgICAgIGFzc3VtZSB0aGUgQyBjb21waWxlciB1c2VzIEdOVSBsZCBbZGVmYXVsdD1ub10iCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbGlidG9vbC1sb2NrICBmb3JjZSBsaWJ0b29sIG5vdCB0byBkbyBmaWxlIGxvY2tpbmciCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS10YXJnZXRzICAgICAgICBhbHRlcm5hdGl2ZSB0YXJnZXQgY29uZmlndXJhdGlvbnMiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jb21tb25iZmRsaWIgICBidWlsZCBzaGFyZWQgQkZEL29wY29kZXMvbGliaWJlcnR5IGxpYnJhcnkiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1tYWludGFpbmVyLW1vZGUgZW5hYmxlIG1ha2UgcnVsZXMgYW5kIGRlcGVuZGVuY2llcyBub3QgdXNlZnVsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc29tZXRpbWVzIGNvbmZ1c2luZykgdG8gdGhlIGNhc3VhbCBpbnN0YWxsZXIiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWRpc2FibGUtbmxzICAgICAgICAgICBkbyBub3QgdXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgotYWNfaGVscD0iJGFjX2hlbHAKLSAgLS13aXRoLWluY2x1ZGVkLWdldHRleHQgdXNlIHRoZSBHTlUgZ2V0dGV4dCBsaWJyYXJ5IGluY2x1ZGVkIGhlcmUiCi1hY19oZWxwPSIkYWNfaGVscAotICAtLWVuYWJsZS1jZ2VuLW1haW50Wz1kaXJdICAgIGJ1aWxkIGNnZW4gZ2VuZXJhdGVkIGZpbGVzIgotCi0jIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgc2V0IGJ5IG9wdGlvbnMuCi0jIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAotIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgotYnVpbGQ9Tk9ORQotY2FjaGVfZmlsZT0uL2NvbmZpZy5jYWNoZQotZXhlY19wcmVmaXg9Tk9ORQotaG9zdD1OT05FCi1ub19jcmVhdGU9Ci1ub25vcHQ9Tk9ORQotbm9fcmVjdXJzaW9uPQotcHJlZml4PU5PTkUKLXByb2dyYW1fcHJlZml4PU5PTkUKLXByb2dyYW1fc3VmZml4PU5PTkUKLXByb2dyYW1fdHJhbnNmb3JtX25hbWU9cyx4LHgsCi1zaWxlbnQ9Ci1zaXRlPQotc3JjZGlyPQotdGFyZ2V0PU5PTkUKLXZlcmJvc2U9Ci14X2luY2x1ZGVzPU5PTkUKLXhfbGlicmFyaWVzPU5PTkUKLWJpbmRpcj0nJHtleGVjX3ByZWZpeH0vYmluJwotc2JpbmRpcj0nJHtleGVjX3ByZWZpeH0vc2JpbicKLWxpYmV4ZWNkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYmV4ZWMnCi1kYXRhZGlyPScke3ByZWZpeH0vc2hhcmUnCi1zeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwotc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCi1sb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJwotbGliZGlyPScke2V4ZWNfcHJlZml4fS9saWInCi1pbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKLW9sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKLWluZm9kaXI9JyR7cHJlZml4fS9pbmZvJwotbWFuZGlyPScke3ByZWZpeH0vbWFuJwotCi0jIEluaXRpYWxpemUgc29tZSBvdGhlciB2YXJpYWJsZXMuCi1zdWJkaXJzPQotTUZMQUdTPSBNQUtFRkxBR1M9Ci1TSEVMTD0ke0NPTkZJR19TSEVMTC0vYmluL3NofQotIyBNYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBwdXQgaW4gYSBzaGVsbCBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotYWNfcHJldj0KLWZvciBhY19vcHRpb24KLWRvCi0KLSAgIyBJZiB0aGUgcHJldmlvdXMgb3B0aW9uIG5lZWRzIGFuIGFyZ3VtZW50LCBhc3NpZ24gaXQuCi0gIGlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICAgIGV2YWwgIiRhY19wcmV2PVwkYWNfb3B0aW9uIgotICAgIGFjX3ByZXY9Ci0gICAgY29udGludWUKLSAgZmkKLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotICAtKj0qKSBhY19vcHRhcmc9YGVjaG8gIiRhY19vcHRpb24iIHwgc2VkICdzL1stX2EtekEtWjAtOV0qPS8vJ2AgOzsKLSAgKikgYWNfb3B0YXJnPSA7OwotICBlc2FjCi0KLSAgIyBBY2NlcHQgdGhlIGltcG9ydGFudCBDeWdudXMgY29uZmlndXJlIG9wdGlvbnMsIHNvIHdlIGNhbiBkaWFnbm9zZSB0eXBvcy4KLQotICBjYXNlICIkYWNfb3B0aW9uIiBpbgotCi0gIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCi0gICAgYWNfcHJldj1iaW5kaXIgOzsKLSAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKLSAgICBiaW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWJ1aWxkIHwgLS1idWlsZCB8IC0tYnVpbCB8IC0tYnVpIHwgLS1idSkKLSAgICBhY19wcmV2PWJ1aWxkIDs7Ci0gIC1idWlsZD0qIHwgLS1idWlsZD0qIHwgLS1idWlsPSogfCAtLWJ1aT0qIHwgLS1idT0qKQotICAgIGJ1aWxkPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWxlIHwgLS1jYWNoZS1maWwgfCAtLWNhY2hlLWZpIFwKLSAgfCAtLWNhY2hlLWYgfCAtLWNhY2hlLSB8IC0tY2FjaGUgfCAtLWNhY2ggfCAtLWNhYyB8IC0tY2EgfCAtLWMpCi0gICAgYWNfcHJldj1jYWNoZV9maWxlIDs7Ci0gIC1jYWNoZS1maWxlPSogfCAtLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsPSogfCAtLWNhY2hlLWZpPSogXAotICB8IC0tY2FjaGUtZj0qIHwgLS1jYWNoZS09KiB8IC0tY2FjaGU9KiB8IC0tY2FjaD0qIHwgLS1jYWM9KiB8IC0tY2E9KiB8IC0tYz0qKQotICAgIGNhY2hlX2ZpbGU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWRhdGFkaXIgfCAtLWRhdGFkaXIgfCAtLWRhdGFkaSB8IC0tZGF0YWQgfCAtLWRhdGEgfCAtLWRhdCB8IC0tZGEpCi0gICAgYWNfcHJldj1kYXRhZGlyIDs7Ci0gIC1kYXRhZGlyPSogfCAtLWRhdGFkaXI9KiB8IC0tZGF0YWRpPSogfCAtLWRhdGFkPSogfCAtLWRhdGE9KiB8IC0tZGF0PSogXAotICB8IC0tZGE9KikKLSAgICBkYXRhZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19vcHRpb258c2VkIC1lICdzLy0qZGlzYWJsZS0vLydgCi0gICAgIyBSZWplY3QgbmFtZXMgdGhhdCBhcmUgbm90IHZhbGlkIHNoZWxsIHZhcmlhYmxlIG5hbWVzLgotICAgIGlmIHRlc3QgLW4gImBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvWy1hLXpBLVowLTlfXS8vZydgIjsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfZmVhdHVyZTogaW52YWxpZCBmZWF0dXJlIG5hbWUiIDE+JjI7IGV4aXQgMTsgfQotICAgIGZpCi0gICAgYWNfZmVhdHVyZT1gZWNobyAkYWNfZmVhdHVyZXwgc2VkICdzLy0vXy9nJ2AKLSAgICBldmFsICJlbmFibGVfJHthY19mZWF0dXJlfT1ubyIgOzsKLQotICAtZW5hYmxlLSogfCAtLWVuYWJsZS0qKQotICAgIGFjX2ZlYXR1cmU9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSplbmFibGUtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX2ZlYXR1cmV8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19mZWF0dXJlOiBpbnZhbGlkIGZlYXR1cmUgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19mZWF0dXJlPWBlY2hvICRhY19mZWF0dXJlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgImVuYWJsZV8ke2FjX2ZlYXR1cmV9PSckYWNfb3B0YXJnJyIgOzsKLQotICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCi0gIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKLSAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCi0gICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OwotICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKLSAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKLSAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCi0gICAgZXhlY19wcmVmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWdhcyB8IC0tZ2FzIHwgLS1nYSB8IC0tZykKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRoLWdhcy4KLSAgICB3aXRoX2dhcz15ZXMgOzsKLQotICAtaGVscCB8IC0taGVscCB8IC0taGVsIHwgLS1oZSkKLSAgICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KLSAgICAjIFRoaXMgbWVzc2FnZSBpcyB0b28gbG9uZyB0byBiZSBhIHN0cmluZyBpbiB0aGUgQS9VWCAzLjEgc2guCi0gICAgY2F0IDw8IEVPRgotVXNhZ2U6IGNvbmZpZ3VyZSBbb3B0aW9uc10gW2hvc3RdCi1PcHRpb25zOiBbZGVmYXVsdHMgaW4gYnJhY2tldHMgYWZ0ZXIgZGVzY3JpcHRpb25zXQotQ29uZmlndXJhdGlvbjoKLSAgLS1jYWNoZS1maWxlPUZJTEUgICAgICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUKLSAgLS1oZWxwICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCi0gIC0tbm8tY3JlYXRlICAgICAgICAgICAgIGRvIG5vdCBjcmVhdGUgb3V0cHV0IGZpbGVzCi0gIC0tcXVpZXQsIC0tc2lsZW50ICAgICAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nLi4uJyBtZXNzYWdlcwotICAtLXZlcnNpb24gICAgICAgICAgICAgICBwcmludCB0aGUgdmVyc2lvbiBvZiBhdXRvY29uZiB0aGF0IGNyZWF0ZWQgY29uZmlndXJlCi1EaXJlY3RvcnkgYW5kIGZpbGUgbmFtZXM6Ci0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgIGluc3RhbGwgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzIGluIFBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJGFjX2RlZmF1bHRfcHJlZml4XQotICAtLWV4ZWMtcHJlZml4PUVQUkVGSVggICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMgaW4gRVBSRUZJWAotICAgICAgICAgICAgICAgICAgICAgICAgICBbc2FtZSBhcyBwcmVmaXhdCi0gIC0tYmluZGlyPURJUiAgICAgICAgICAgIHVzZXIgZXhlY3V0YWJsZXMgaW4gRElSIFtFUFJFRklYL2Jpbl0KLSAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9zYmluXQotICAtLWxpYmV4ZWNkaXI9RElSICAgICAgICBwcm9ncmFtIGV4ZWN1dGFibGVzIGluIERJUiBbRVBSRUZJWC9saWJleGVjXQotICAtLWRhdGFkaXI9RElSICAgICAgICAgICByZWFkLW9ubHkgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgaW4gRElSCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtQUkVGSVgvc2hhcmVdCi0gIC0tc3lzY29uZmRpcj1ESVIgICAgICAgIHJlYWQtb25seSBzaW5nbGUtbWFjaGluZSBkYXRhIGluIERJUiBbUFJFRklYL2V0Y10KLSAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBpbiBESVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWC9jb21dCi0gIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBpbiBESVIgW1BSRUZJWC92YXJdCi0gIC0tbGliZGlyPURJUiAgICAgICAgICAgIG9iamVjdCBjb2RlIGxpYnJhcmllcyBpbiBESVIgW0VQUkVGSVgvbGliXQotICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBpbiBESVIgW1BSRUZJWC9pbmNsdWRlXQotICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBpbiBESVIgWy91c3IvaW5jbHVkZV0KLSAgLS1pbmZvZGlyPURJUiAgICAgICAgICAgaW5mbyBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL2luZm9dCi0gIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIGluIERJUiBbUFJFRklYL21hbl0KLSAgLS1zcmNkaXI9RElSICAgICAgICAgICAgZmluZCB0aGUgc291cmNlcyBpbiBESVIgW2NvbmZpZ3VyZSBkaXIgb3IgLi5dCi0gIC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYIHByZXBlbmQgUFJFRklYIHRvIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi0gIC0tcHJvZ3JhbS1zdWZmaXg9U1VGRklYIGFwcGVuZCBTVUZGSVggdG8gaW5zdGFsbGVkIHByb2dyYW0gbmFtZXMKLSAgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPVBST0dSQU0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuIHNlZCBQUk9HUkFNIG9uIGluc3RhbGxlZCBwcm9ncmFtIG5hbWVzCi1FT0YKLSAgICBjYXQgPDwgRU9GCi1Ib3N0IHR5cGU6Ci0gIC0tYnVpbGQ9QlVJTEQgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgb24gQlVJTEQgW0JVSUxEPUhPU1RdCi0gIC0taG9zdD1IT1NUICAgICAgICAgICAgIGNvbmZpZ3VyZSBmb3IgSE9TVCBbZ3Vlc3NlZF0KLSAgLS10YXJnZXQ9VEFSR0VUICAgICAgICAgY29uZmlndXJlIGZvciBUQVJHRVQgW1RBUkdFVD1IT1NUXQotRmVhdHVyZXMgYW5kIHBhY2thZ2VzOgotICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCi0gIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KLSAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCi0gIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKLSAgLS14LWluY2x1ZGVzPURJUiAgICAgICAgWCBpbmNsdWRlIGZpbGVzIGFyZSBpbiBESVIKLSAgLS14LWxpYnJhcmllcz1ESVIgICAgICAgWCBsaWJyYXJ5IGZpbGVzIGFyZSBpbiBESVIKLUVPRgotICAgIGlmIHRlc3QgLW4gIiRhY19oZWxwIjsgdGhlbgotICAgICAgZWNobyAiLS1lbmFibGUgYW5kIC0td2l0aCBvcHRpb25zIHJlY29nbml6ZWQ6JGFjX2hlbHAiCi0gICAgZmkKLSAgICBleGl0IDAgOzsKLQotICAtaG9zdCB8IC0taG9zdCB8IC0taG9zIHwgLS1obykKLSAgICBhY19wcmV2PWhvc3QgOzsKLSAgLWhvc3Q9KiB8IC0taG9zdD0qIHwgLS1ob3M9KiB8IC0taG89KikKLSAgICBob3N0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGlyIHwgLS1pbmNsdWRlZGkgfCAtLWluY2x1ZGVkIHwgLS1pbmNsdWRlIFwKLSAgfCAtLWluY2x1ZCB8IC0taW5jbHUgfCAtLWluY2wgfCAtLWluYykKLSAgICBhY19wcmV2PWluY2x1ZGVkaXIgOzsKLSAgLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpcj0qIHwgLS1pbmNsdWRlZGk9KiB8IC0taW5jbHVkZWQ9KiB8IC0taW5jbHVkZT0qIFwKLSAgfCAtLWluY2x1ZD0qIHwgLS1pbmNsdT0qIHwgLS1pbmNsPSogfCAtLWluYz0qKQotICAgIGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLWluZm9kaXIgfCAtLWluZm9kaXIgfCAtLWluZm9kaSB8IC0taW5mb2QgfCAtLWluZm8gfCAtLWluZikKLSAgICBhY19wcmV2PWluZm9kaXIgOzsKLSAgLWluZm9kaXI9KiB8IC0taW5mb2Rpcj0qIHwgLS1pbmZvZGk9KiB8IC0taW5mb2Q9KiB8IC0taW5mbz0qIHwgLS1pbmY9KikKLSAgICBpbmZvZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCi0gICAgYWNfcHJldj1saWJkaXIgOzsKLSAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQotICAgIGxpYmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbGliZXhlY2RpciB8IC0tbGliZXhlY2RpciB8IC0tbGliZXhlY2RpIHwgLS1saWJleGVjZCB8IC0tbGliZXhlYyBcCi0gIHwgLS1saWJleGUgfCAtLWxpYmV4IHwgLS1saWJlKQotICAgIGFjX3ByZXY9bGliZXhlY2RpciA7OwotICAtbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGlyPSogfCAtLWxpYmV4ZWNkaT0qIHwgLS1saWJleGVjZD0qIHwgLS1saWJleGVjPSogXAotICB8IC0tbGliZXhlPSogfCAtLWxpYmV4PSogfCAtLWxpYmU9KikKLSAgICBsaWJleGVjZGlyPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGlyIHwgLS1sb2NhbHN0YXRlZGkgfCAtLWxvY2Fsc3RhdGVkIFwKLSAgfCAtLWxvY2Fsc3RhdGUgfCAtLWxvY2Fsc3RhdCB8IC0tbG9jYWxzdGEgfCAtLWxvY2Fsc3QgXAotICB8IC0tbG9jYWxzIHwgLS1sb2NhbCB8IC0tbG9jYSB8IC0tbG9jIHwgLS1sbykKLSAgICBhY19wcmV2PWxvY2Fsc3RhdGVkaXIgOzsKLSAgLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpcj0qIHwgLS1sb2NhbHN0YXRlZGk9KiB8IC0tbG9jYWxzdGF0ZWQ9KiBcCi0gIHwgLS1sb2NhbHN0YXRlPSogfCAtLWxvY2Fsc3RhdD0qIHwgLS1sb2NhbHN0YT0qIHwgLS1sb2NhbHN0PSogXAotICB8IC0tbG9jYWxzPSogfCAtLWxvY2FsPSogfCAtLWxvY2E9KiB8IC0tbG9jPSogfCAtLWxvPSopCi0gICAgbG9jYWxzdGF0ZWRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQotICAgIGFjX3ByZXY9bWFuZGlyIDs7Ci0gIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKLSAgICBtYW5kaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLW5mcCB8IC0tbmZwIHwgLS1uZikKLSAgICAjIE9ic29sZXRlOyB1c2UgLS13aXRob3V0LWZwLgotICAgIHdpdGhfZnA9bm8gOzsKLQotICAtbm8tY3JlYXRlIHwgLS1uby1jcmVhdGUgfCAtLW5vLWNyZWF0IHwgLS1uby1jcmVhIHwgLS1uby1jcmUgXAotICB8IC0tbm8tY3IgfCAtLW5vLWMpCi0gICAgbm9fY3JlYXRlPXllcyA7OwotCi0gIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAotICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKLSAgICBub19yZWN1cnNpb249eWVzIDs7Ci0KLSAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAotICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKLSAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQotICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OwotICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKLSAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAotICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQotICAgIG9sZGluY2x1ZGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByZWZpeCB8IC0tcHJlZml4IHwgLS1wcmVmaSB8IC0tcHJlZiB8IC0tcHJlIHwgLS1wciB8IC0tcCkKLSAgICBhY19wcmV2PXByZWZpeCA7OwotICAtcHJlZml4PSogfCAtLXByZWZpeD0qIHwgLS1wcmVmaT0qIHwgLS1wcmVmPSogfCAtLXByZT0qIHwgLS1wcj0qIHwgLS1wPSopCi0gICAgcHJlZml4PSIkYWNfb3B0YXJnIiA7OwotCi0gIC1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaXggfCAtLXByb2dyYW0tcHJlZmkgfCAtLXByb2dyYW0tcHJlZiBcCi0gIHwgLS1wcm9ncmFtLXByZSB8IC0tcHJvZ3JhbS1wciB8IC0tcHJvZ3JhbS1wKQotICAgIGFjX3ByZXY9cHJvZ3JhbV9wcmVmaXggOzsKLSAgLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZml4PSogfCAtLXByb2dyYW0tcHJlZmk9KiBcCi0gIHwgLS1wcm9ncmFtLXByZWY9KiB8IC0tcHJvZ3JhbS1wcmU9KiB8IC0tcHJvZ3JhbS1wcj0qIHwgLS1wcm9ncmFtLXA9KikKLSAgICBwcm9ncmFtX3ByZWZpeD0iJGFjX29wdGFyZyIgOzsKLQotICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAotICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKLSAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7Ci0gIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAotICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCi0gICAgcHJvZ3JhbV9zdWZmaXg9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWUgXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYSBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS0gXAotICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0gfCAtLXByb2dyYW0tdHJhbnNmb3IgXAotICB8IC0tcHJvZ3JhbS10cmFuc2ZvIHwgLS1wcm9ncmFtLXRyYW5zZiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zIHwgLS1wcm9ncmFtLXRyYW4gXAotICB8IC0tcHJvZ3ItdHJhIHwgLS1wcm9ncmFtLXRyIHwgLS1wcm9ncmFtLXQpCi0gICAgYWNfcHJldj1wcm9ncmFtX3RyYW5zZm9ybV9uYW1lIDs7Ci0gIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbWU9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW09KiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmE9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLT0qIFwKLSAgfCAtLXByb2dyYW0tdHJhbnNmb3JtPSogfCAtLXByb2dyYW0tdHJhbnNmb3I9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zZm89KiB8IC0tcHJvZ3JhbS10cmFuc2Y9KiBcCi0gIHwgLS1wcm9ncmFtLXRyYW5zPSogfCAtLXByb2dyYW0tdHJhbj0qIFwKLSAgfCAtLXByb2dyLXRyYT0qIHwgLS1wcm9ncmFtLXRyPSogfCAtLXByb2dyYW0tdD0qKQotICAgIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKLSAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCi0gICAgc2lsZW50PXllcyA7OwotCi0gIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQotICAgIGFjX3ByZXY9c2JpbmRpciA7OwotICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXAotICB8IC0tc2JpPSogfCAtLXNiPSopCi0gICAgc2JpbmRpcj0iJGFjX29wdGFyZyIgOzsKLQotICAtc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGlyIHwgLS1zaGFyZWRzdGF0ZWRpIFwKLSAgfCAtLXNoYXJlZHN0YXRlZCB8IC0tc2hhcmVkc3RhdGUgfCAtLXNoYXJlZHN0YXQgfCAtLXNoYXJlZHN0YSBcCi0gIHwgLS1zaGFyZWRzdCB8IC0tc2hhcmVkcyB8IC0tc2hhcmVkIHwgLS1zaGFyZSB8IC0tc2hhciBcCi0gIHwgLS1zaGEgfCAtLXNoKQotICAgIGFjX3ByZXY9c2hhcmVkc3RhdGVkaXIgOzsKLSAgLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGlyPSogfCAtLXNoYXJlZHN0YXRlZGk9KiBcCi0gIHwgLS1zaGFyZWRzdGF0ZWQ9KiB8IC0tc2hhcmVkc3RhdGU9KiB8IC0tc2hhcmVkc3RhdD0qIHwgLS1zaGFyZWRzdGE9KiBcCi0gIHwgLS1zaGFyZWRzdD0qIHwgLS1zaGFyZWRzPSogfCAtLXNoYXJlZD0qIHwgLS1zaGFyZT0qIHwgLS1zaGFyPSogXAotICB8IC0tc2hhPSogfCAtLXNoPSopCi0gICAgc2hhcmVkc3RhdGVkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKLSAgICBhY19wcmV2PXNpdGUgOzsKLSAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKLSAgICBzaXRlPSIkYWNfb3B0YXJnIiA7OwotCi0gIC1zcmNkaXIgfCAtLXNyY2RpciB8IC0tc3JjZGkgfCAtLXNyY2QgfCAtLXNyYyB8IC0tc3IpCi0gICAgYWNfcHJldj1zcmNkaXIgOzsKLSAgLXNyY2Rpcj0qIHwgLS1zcmNkaXI9KiB8IC0tc3JjZGk9KiB8IC0tc3JjZD0qIHwgLS1zcmM9KiB8IC0tc3I9KikKLSAgICBzcmNkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaXIgfCAtLXN5c2NvbmZkaSB8IC0tc3lzY29uZmQgfCAtLXN5c2NvbmYgXAotICB8IC0tc3lzY29uIHwgLS1zeXNjbyB8IC0tc3lzYyB8IC0tc3lzIHwgLS1zeSkKLSAgICBhY19wcmV2PXN5c2NvbmZkaXIgOzsKLSAgLXN5c2NvbmZkaXI9KiB8IC0tc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGk9KiB8IC0tc3lzY29uZmQ9KiB8IC0tc3lzY29uZj0qIFwKLSAgfCAtLXN5c2Nvbj0qIHwgLS1zeXNjbz0qIHwgLS1zeXNjPSogfCAtLXN5cz0qIHwgLS1zeT0qKQotICAgIHN5c2NvbmZkaXI9IiRhY19vcHRhcmciIDs7Ci0KLSAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKLSAgICBhY19wcmV2PXRhcmdldCA7OwotICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCi0gICAgdGFyZ2V0PSIkYWNfb3B0YXJnIiA7OwotCi0gIC12IHwgLXZlcmJvc2UgfCAtLXZlcmJvc2UgfCAtLXZlcmJvcyB8IC0tdmVyYm8gfCAtLXZlcmIpCi0gICAgdmVyYm9zZT15ZXMgOzsKLQotICAtdmVyc2lvbiB8IC0tdmVyc2lvbiB8IC0tdmVyc2lvIHwgLS12ZXJzaSB8IC0tdmVycykKLSAgICBlY2hvICJjb25maWd1cmUgZ2VuZXJhdGVkIGJ5IGF1dG9jb25mIHZlcnNpb24gMi4xMyIKLSAgICBleGl0IDAgOzsKLQotICAtd2l0aC0qIHwgLS13aXRoLSopCi0gICAgYWNfcGFja2FnZT1gZWNobyAkYWNfb3B0aW9ufHNlZCAtZSAncy8tKndpdGgtLy8nIC1lICdzLz0uKi8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLV9hLXpBLVowLTldLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGNhc2UgIiRhY19vcHRpb24iIGluCi0gICAgICAqPSopIDs7Ci0gICAgICAqKSBhY19vcHRhcmc9eWVzIDs7Ci0gICAgZXNhYwotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT0nJGFjX29wdGFyZyciIDs7Ci0KLSAgLXdpdGhvdXQtKiB8IC0td2l0aG91dC0qKQotICAgIGFjX3BhY2thZ2U9YGVjaG8gJGFjX29wdGlvbnxzZWQgLWUgJ3MvLSp3aXRob3V0LS8vJ2AKLSAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX3BhY2thZ2V8IHNlZCAncy9bLWEtekEtWjAtOV9dLy9nJ2AiOyB0aGVuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICRhY19wYWNrYWdlOiBpbnZhbGlkIHBhY2thZ2UgbmFtZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBhY19wYWNrYWdlPWBlY2hvICRhY19wYWNrYWdlfCBzZWQgJ3MvLS9fL2cnYAotICAgIGV2YWwgIndpdGhfJHthY19wYWNrYWdlfT1ubyIgOzsKLQotICAtLXgpCi0gICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC14LgotICAgIHdpdGhfeD15ZXMgOzsKLQotICAteC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlcyB8IC0teC1pbmNsdWRlIHwgLS14LWluY2x1ZCB8IC0teC1pbmNsdSBcCi0gIHwgLS14LWluY2wgfCAtLXgtaW5jIHwgLS14LWluIHwgLS14LWkpCi0gICAgYWNfcHJldj14X2luY2x1ZGVzIDs7Ci0gIC14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZXM9KiB8IC0teC1pbmNsdWRlPSogfCAtLXgtaW5jbHVkPSogfCAtLXgtaW5jbHU9KiBcCi0gIHwgLS14LWluY2w9KiB8IC0teC1pbmM9KiB8IC0teC1pbj0qIHwgLS14LWk9KikKLSAgICB4X2luY2x1ZGVzPSIkYWNfb3B0YXJnIiA7OwotCi0gIC14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZXMgfCAtLXgtbGlicmFyaWUgfCAtLXgtbGlicmFyaSBcCi0gIHwgLS14LWxpYnJhciB8IC0teC1saWJyYSB8IC0teC1saWJyIHwgLS14LWxpYiB8IC0teC1saSB8IC0teC1sKQotICAgIGFjX3ByZXY9eF9saWJyYXJpZXMgOzsKLSAgLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWVzPSogfCAtLXgtbGlicmFyaWU9KiB8IC0teC1saWJyYXJpPSogXAotICB8IC0teC1saWJyYXI9KiB8IC0teC1saWJyYT0qIHwgLS14LWxpYnI9KiB8IC0teC1saWI9KiB8IC0teC1saT0qIHwgLS14LWw9KikKLSAgICB4X2xpYnJhcmllcz0iJGFjX29wdGFyZyIgOzsKLQotICAtKikgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiAkYWNfb3B0aW9uOiBpbnZhbGlkIG9wdGlvbjsgdXNlIC0taGVscCB0byBzaG93IHVzYWdlIiAxPiYyOyBleGl0IDE7IH0KLSAgICA7OwotCi0gICopCi0gICAgaWYgdGVzdCAtbiAiYGVjaG8gJGFjX29wdGlvbnwgc2VkICdzL1stYS16MC05Ll0vL2cnYCI7IHRoZW4KLSAgICAgIGVjaG8gImNvbmZpZ3VyZTogd2FybmluZzogJGFjX29wdGlvbjogaW52YWxpZCBob3N0IHR5cGUiIDE+JjIKLSAgICBmaQotICAgIGlmIHRlc3QgIngkbm9ub3B0IiAhPSB4Tk9ORTsgdGhlbgotICAgICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gb25seSBjb25maWd1cmUgZm9yIG9uZSBob3N0IGFuZCBvbmUgdGFyZ2V0IGF0IGEgdGltZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkKLSAgICBub25vcHQ9IiRhY19vcHRpb24iCi0gICAgOzsKLQotICBlc2FjCi1kb25lCi0KLWlmIHRlc3QgLW4gIiRhY19wcmV2IjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG1pc3NpbmcgYXJndW1lbnQgdG8gLS1gZWNobyAkYWNfcHJldiB8IHNlZCAncy9fLy0vZydgIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLXRyYXAgJ3JtIC1mciBjb25mdGVzdCogY29uZmRlZnMqIGNvcmUgY29yZS4qICouY29yZSAkYWNfY2xlYW5fZmlsZXM7IGV4aXQgMScgMSAyIDE1Ci0KLSMgRmlsZSBkZXNjcmlwdG9yIHVzYWdlOgotIyAwIHN0YW5kYXJkIGlucHV0Ci0jIDEgZmlsZSBjcmVhdGlvbgotIyAyIGVycm9ycyBhbmQgd2FybmluZ3MKLSMgMyBzb21lIHN5c3RlbXMgbWF5IG9wZW4gaXQgdG8gL2Rldi90dHkKLSMgNCB1c2VkIG9uIHRoZSBLdWJvdGEgVGl0YW4KLSMgNiBjaGVja2luZyBmb3IuLi4gbWVzc2FnZXMgYW5kIHJlc3VsdHMKLSMgNSBjb21waWxlciBtZXNzYWdlcyBzYXZlZCBpbiBjb25maWcubG9nCi1pZiB0ZXN0ICIkc2lsZW50IiA9IHllczsgdGhlbgotICBleGVjIDY+L2Rldi9udWxsCi1lbHNlCi0gIGV4ZWMgNj4mMQotZmkKLWV4ZWMgNT4uL2NvbmZpZy5sb2cKLQotZWNobyAiXAotVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKLXJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCi0iIDE+JjUKLQotIyBTdHJpcCBvdXQgLS1uby1jcmVhdGUgYW5kIC0tbm8tcmVjdXJzaW9uIHNvIHRoZXkgZG8gbm90IHBpbGUgdXAuCi0jIEFsc28gcXVvdGUgYW55IGFyZ3MgY29udGFpbmluZyBzaGVsbCBtZXRhY2hhcmFjdGVycy4KLWFjX2NvbmZpZ3VyZV9hcmdzPQotZm9yIGFjX2FyZwotZG8KLSAgY2FzZSAiJGFjX2FyZyIgaW4KLSAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKLSAgfCAtLW5vLWNyIHwgLS1uby1jKSA7OwotICAtbm8tcmVjdXJzaW9uIHwgLS1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvIHwgLS1uby1yZWN1cnNpIFwKLSAgfCAtLW5vLXJlY3VycyB8IC0tbm8tcmVjdXIgfCAtLW5vLXJlY3UgfCAtLW5vLXJlYyB8IC0tbm8tcmUgfCAtLW5vLXIpIDs7Ci0gICoiICIqfCoiCSIqfCpbXFtcXVx+XCNcJFxeXCZcKlwoXClce1x9XFxcfFw7XDxcPlw/XSopCi0gIGFjX2NvbmZpZ3VyZV9hcmdzPSIkYWNfY29uZmlndXJlX2FyZ3MgJyRhY19hcmcnIiA7OwotICAqKSBhY19jb25maWd1cmVfYXJncz0iJGFjX2NvbmZpZ3VyZV9hcmdzICRhY19hcmciIDs7Ci0gIGVzYWMKLWRvbmUKLQotIyBOTFMgbnVpc2FuY2VzLgotIyBPbmx5IHNldCB0aGVzZSB0byBDIGlmIGFscmVhZHkgc2V0LiAgVGhlc2UgbXVzdCBub3QgYmUgc2V0IHVuY29uZGl0aW9uYWxseQotIyBiZWNhdXNlIG5vdCBhbGwgc3lzdGVtcyB1bmRlcnN0YW5kIGUuZy4gTEFORz1DIChub3RhYmx5IFNDTykuCi0jIEZpeGluZyBMQ19NRVNTQUdFUyBwcmV2ZW50cyBTb2xhcmlzIHNoIGZyb20gdHJhbnNsYXRpbmcgdmFyIHZhbHVlcyBpbiBgc2V0JyEKLSMgTm9uLUMgTENfQ1RZUEUgdmFsdWVzIGJyZWFrIHRoZSBjdHlwZSBjaGVjay4KLWlmIHRlc3QgIiR7TEFORytzZXR9IiAgID0gc2V0OyB0aGVuIExBTkc9QzsgICBleHBvcnQgTEFORzsgICBmaQotaWYgdGVzdCAiJHtMQ19BTEwrc2V0fSIgPSBzZXQ7IHRoZW4gTENfQUxMPUM7IGV4cG9ydCBMQ19BTEw7IGZpCi1pZiB0ZXN0ICIke0xDX01FU1NBR0VTK3NldH0iID0gc2V0OyB0aGVuIExDX01FU1NBR0VTPUM7IGV4cG9ydCBMQ19NRVNTQUdFUzsgZmkKLWlmIHRlc3QgIiR7TENfQ1RZUEUrc2V0fSIgICAgPSBzZXQ7IHRoZW4gTENfQ1RZUEU9QzsgICAgZXhwb3J0IExDX0NUWVBFOyAgICBmaQotCi0jIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgotcm0gLXJmIGNvbmZ0ZXN0KiBjb25mZGVmcy5oCi0jIEFJWCBjcHAgbG9zZXMgb24gYW4gZW1wdHkgZmlsZSwgc28gbWFrZSBzdXJlIGl0IGNvbnRhaW5zIGF0IGxlYXN0IGEgbmV3bGluZS4KLWVjaG8gPiBjb25mZGVmcy5oCi0KLSMgQSBmaWxlbmFtZSB1bmlxdWUgdG8gdGhpcyBwYWNrYWdlLCByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHRoYXQKLSMgY29uZmlndXJlIGlzIGluLCB3aGljaCB3ZSBjYW4gbG9vayBmb3IgdG8gZmluZCBvdXQgaWYgc3JjZGlyIGlzIGNvcnJlY3QuCi1hY191bmlxdWVfZmlsZT16OGstZGlzLmMKLQotIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgotaWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KLSAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKLSAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIGl0cyBwYXJlbnQuCi0gIGFjX3Byb2c9JDAKLSAgYWNfY29uZmRpcj1gZWNobyAkYWNfcHJvZ3xzZWQgJ3MlL1teL11bXi9dKiQlJSdgCi0gIHRlc3QgIngkYWNfY29uZmRpciIgPSAieCRhY19wcm9nIiAmJiBhY19jb25mZGlyPS4KLSAgc3JjZGlyPSRhY19jb25mZGlyCi0gIGlmIHRlc3QgISAtciAkc3JjZGlyLyRhY191bmlxdWVfZmlsZTsgdGhlbgotICAgIHNyY2Rpcj0uLgotICBmaQotZWxzZQotICBhY19zcmNkaXJfZGVmYXVsdGVkPW5vCi1maQotaWYgdGVzdCAhIC1yICRzcmNkaXIvJGFjX3VuaXF1ZV9maWxlOyB0aGVuCi0gIGlmIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllczsgdGhlbgotICAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBmaW5kIHNvdXJjZXMgaW4gJGFjX2NvbmZkaXIgb3IgLi4iIDE+JjI7IGV4aXQgMTsgfQotICBlbHNlCi0gICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBjYW4gbm90IGZpbmQgc291cmNlcyBpbiAkc3JjZGlyIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLWZpCi1zcmNkaXI9YGVjaG8gIiR7c3JjZGlyfSIgfCBzZWQgJ3MlXChbXi9dXCkvKiQlXDElJ2AKLQotIyBQcmVmZXIgZXhwbGljaXRseSBzZWxlY3RlZCBmaWxlIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgb25lcy4KLWlmIHRlc3QgLXogIiRDT05GSUdfU0lURSI7IHRoZW4KLSAgaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCi0gICAgQ09ORklHX1NJVEU9IiRwcmVmaXgvc2hhcmUvY29uZmlnLnNpdGUgJHByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGVsc2UKLSAgICBDT05GSUdfU0lURT0iJGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlICRhY19kZWZhdWx0X3ByZWZpeC9ldGMvY29uZmlnLnNpdGUiCi0gIGZpCi1maQotZm9yIGFjX3NpdGVfZmlsZSBpbiAkQ09ORklHX1NJVEU7IGRvCi0gIGlmIHRlc3QgLXIgIiRhY19zaXRlX2ZpbGUiOyB0aGVuCi0gICAgZWNobyAibG9hZGluZyBzaXRlIHNjcmlwdCAkYWNfc2l0ZV9maWxlIgotICAgIC4gIiRhY19zaXRlX2ZpbGUiCi0gIGZpCi1kb25lCi0KLWlmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgotICBlY2hvICJsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIgotICAuICRjYWNoZV9maWxlCi1lbHNlCi0gIGVjaG8gImNyZWF0aW5nIGNhY2hlICRjYWNoZV9maWxlIgotICA+ICRjYWNoZV9maWxlCi1maQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1hY19leGVleHQ9Ci1hY19vYmpleHQ9bwotaWYgKGVjaG8gInRlc3RpbmdcYyI7IGVjaG8gMSwyLDMpIHwgZ3JlcCBjID4vZGV2L251bGw7IHRoZW4KLSAgIyBTdGFyZGVudCBWaXN0cmEgU1ZSNCBncmVwIGxhY2tzIC1lLCBzYXlzIGdoYXppQGNhaXAucnV0Z2Vycy5lZHUuCi0gIGlmIChlY2hvIC1uIHRlc3Rpbmc7IGVjaG8gMSwyLDMpIHwgc2VkIHMvLW4veG4vIHwgZ3JlcCB4biA+L2Rldi9udWxsOyB0aGVuCi0gICAgYWNfbj0gYWNfYz0nCi0nIGFjX3Q9JwknCi0gIGVsc2UKLSAgICBhY19uPS1uIGFjX2M9IGFjX3Q9Ci0gIGZpCi1lbHNlCi0gIGFjX249IGFjX2M9J1xjJyBhY190PQotZmkKLQotCi0KLWFjX2F1eF9kaXI9Ci1mb3IgYWNfZGlyIGluICRzcmNkaXIgJHNyY2Rpci8uLiAkc3JjZGlyLy4uLy4uOyBkbwotICBpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC1zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwtc2ggLWMiCi0gICAgYnJlYWsKLSAgZWxpZiB0ZXN0IC1mICRhY19kaXIvaW5zdGFsbC5zaDsgdGhlbgotICAgIGFjX2F1eF9kaXI9JGFjX2RpcgotICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCi0gICAgYnJlYWsKLSAgZmkKLWRvbmUKLWlmIHRlc3QgLXogIiRhY19hdXhfZGlyIjsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZmluZCBpbnN0YWxsLXNoIG9yIGluc3RhbGwuc2ggaW4gJHNyY2RpciAkc3JjZGlyLy4uICRzcmNkaXIvLi4vLi4iIDE+JjI7IGV4aXQgMTsgfQotZmkKLWFjX2NvbmZpZ19ndWVzcz0kYWNfYXV4X2Rpci9jb25maWcuZ3Vlc3MKLWFjX2NvbmZpZ19zdWI9JGFjX2F1eF9kaXIvY29uZmlnLnN1YgotYWNfY29uZmlndXJlPSRhY19hdXhfZGlyL2NvbmZpZ3VyZSAjIFRoaXMgc2hvdWxkIGJlIEN5Z251cyBjb25maWd1cmUuCi0KLQotIyBEbyBzb21lIGVycm9yIGNoZWNraW5nIGFuZCBkZWZhdWx0aW5nIGZvciB0aGUgaG9zdCBhbmQgdGFyZ2V0IHR5cGUuCi0jIFRoZSBpbnB1dHMgYXJlOgotIyAgICBjb25maWd1cmUgLS1ob3N0PUhPU1QgLS10YXJnZXQ9VEFSR0VUIC0tYnVpbGQ9QlVJTEQgTk9OT1BUCi0jCi0jIFRoZSBydWxlcyBhcmU6Ci0jIDEuIFlvdSBhcmUgbm90IGFsbG93ZWQgdG8gc3BlY2lmeSAtLWhvc3QsIC0tdGFyZ2V0LCBhbmQgbm9ub3B0IGF0IHRoZQotIyAgICBzYW1lIHRpbWUuCi0jIDIuIEhvc3QgZGVmYXVsdHMgdG8gbm9ub3B0LgotIyAzLiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBob3N0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGhvc3QsCi0jICAgIGFzIGRldGVybWluZWQgYnkgY29uZmlnLmd1ZXNzLgotIyA0LiBUYXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gbm9ub3B0LgotIyA1LiBJZiBub25vcHQgaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0YXJnZXQgYW5kIGJ1aWxkIGRlZmF1bHQgdG8gaG9zdC4KLQotIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgotIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgotY2FzZSAkaG9zdC0tLSR0YXJnZXQtLS0kbm9ub3B0IGluCi1OT05FLS0tKi0tLSogfCAqLS0tTk9ORS0tLSogfCAqLS0tKi0tLU5PTkUpIDs7Ci0qKSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBvbmx5IGNvbmZpZ3VyZSBmb3Igb25lIGhvc3QgYW5kIG9uZSB0YXJnZXQgYXQgYSB0aW1lIiAxPiYyOyBleGl0IDE7IH0gOzsKLWVzYWMKLQotCi0jIE1ha2Ugc3VyZSB3ZSBjYW4gcnVuIGNvbmZpZy5zdWIuCi1pZiAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiBzdW40ID4vZGV2L251bGwgMj4mMTsgdGhlbiA6Ci1lbHNlIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogY2FuIG5vdCBydW4gJGFjX2NvbmZpZ19zdWIiIDE+JjI7IGV4aXQgMTsgfQotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NTk2OiBjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlIiA+JjUKLQotaG9zdF9hbGlhcz0kaG9zdAotY2FzZSAiJGhvc3RfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkKLSAgICBpZiBob3N0X2FsaWFzPWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX2d1ZXNzYDsgdGhlbiA6Ci0gICAgZWxzZSB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGNhbiBub3QgZ3Vlc3MgaG9zdCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgMT4mMjsgZXhpdCAxOyB9Ci0gICAgZmkgOzsKLSAgKikgaG9zdF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotaG9zdD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGhvc3RfYWxpYXNgCi1ob3N0X2NwdT1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1ob3N0X3ZlbmRvcj1gZWNobyAkaG9zdCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi1ob3N0X29zPWBlY2hvICRob3N0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDMvJ2AKLWVjaG8gIiRhY190IiIkaG9zdCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyB0YXJnZXQgc3lzdGVtIHR5cGUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjYxNzogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKLQotdGFyZ2V0X2FsaWFzPSR0YXJnZXQKLWNhc2UgIiR0YXJnZXRfYWxpYXMiIGluCi1OT05FKQotICBjYXNlICRub25vcHQgaW4KLSAgTk9ORSkgdGFyZ2V0X2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIHRhcmdldF9hbGlhcz0kbm9ub3B0IDs7Ci0gIGVzYWMgOzsKLWVzYWMKLQotdGFyZ2V0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZ2V0X2FsaWFzYAotdGFyZ2V0X2NwdT1gZWNobyAkdGFyZ2V0IHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDEvJ2AKLXRhcmdldF92ZW5kb3I9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wyLydgCi10YXJnZXRfb3M9YGVjaG8gJHRhcmdldCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJHRhcmdldCIgMT4mNgotCi1lY2hvICRhY19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjM1OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1Ci0KLWJ1aWxkX2FsaWFzPSRidWlsZAotY2FzZSAiJGJ1aWxkX2FsaWFzIiBpbgotTk9ORSkKLSAgY2FzZSAkbm9ub3B0IGluCi0gIE5PTkUpIGJ1aWxkX2FsaWFzPSRob3N0X2FsaWFzIDs7Ci0gICopIGJ1aWxkX2FsaWFzPSRub25vcHQgOzsKLSAgZXNhYyA7OwotZXNhYwotCi1idWlsZD1gJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2NvbmZpZ19zdWIgJGJ1aWxkX2FsaWFzYAotYnVpbGRfY3B1PWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wxLydgCi1idWlsZF92ZW5kb3I9YGVjaG8gJGJ1aWxkIHwgc2VkICdzL15cKFteLV0qXCktXChbXi1dKlwpLVwoLipcKSQvXDIvJ2AKLWJ1aWxkX29zPWBlY2hvICRidWlsZCB8IHNlZCAncy9eXChbXi1dKlwpLVwoW14tXSpcKS1cKC4qXCkkL1wzLydgCi1lY2hvICIkYWNfdCIiJGJ1aWxkIiAxPiY2Ci0KLXRlc3QgIiRob3N0X2FsaWFzIiAhPSAiJHRhcmdldF9hbGlhcyIgJiYKLSAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAotICAgIE5PTkVOT05Fcyx4LHgsICYmCi0gIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2NjA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19DQz0iZ2NjIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1pZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY5MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19wcm9nX3JlamVjdGVkPW5vCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgIiRhY19kaXIvJGFjX3dvcmQiID0gIi91c3IvdWNiL2NjIjsgdGhlbgotICAgICAgICBhY19wcm9nX3JlamVjdGVkPXllcwotCWNvbnRpbnVlCi0gICAgICBmaQotICAgICAgYWNfY3ZfcHJvZ19DQz0iY2MiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1pZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCi0gICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KLSAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCi0gIHNoaWZ0Ci0gIGlmIHRlc3QgJCMgLWd0IDA7IHRoZW4KLSAgICAjIFdlIGNob3NlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGZyb20gdGhlIGJvZ3VzIG9uZS4KLSAgICAjIEhvd2V2ZXIsIGl0IGhhcyB0aGUgc2FtZSBiYXNlbmFtZSwgc28gdGhlIGJvZ29uIHdpbGwgYmUgY2hvc2VuCi0gICAgIyBmaXJzdCBpZiB3ZSBzZXQgQ0MgdG8ganVzdCB0aGUgYmFzZW5hbWU7IHVzZSB0aGUgZnVsbCBmaWxlIG5hbWUuCi0gICAgc2hpZnQKLSAgICBzZXQgZHVtbXkgIiRhY19kaXIvJGFjX3dvcmQiICIkQCIKLSAgICBzaGlmdAotICAgIGFjX2N2X3Byb2dfQ0M9IiRAIgotICBmaQotZmkKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICBpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCi0gICAgY2FzZSAiYHVuYW1lIC1zYCIgaW4KLSAgICAqd2luMzIqIHwgKldJTjMyKikKLSAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGNsOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjc0MTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NzczOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQotCi1hY19leHQ9YwotIyBDRkxBR1MgaXMgbm90IGluIGFjX2NwcCBiZWNhdXNlIC1nLCAtTywgZXRjLiBhcmUgbm90IHZhbGlkIGNwcCBvcHRpb25zLgotYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKLWFjX2NvbXBpbGU9JyR7Q0MtY2N9IC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgMT4mNScKLWFjX2xpbms9JyR7Q0MtY2N9IC1vIGNvbmZ0ZXN0JHthY19leGVleHR9ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgMT4mNScKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8IEVPRgotCi0jbGluZSA3ODQgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1tYWluKCl7cmV0dXJuKDApO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo3ODk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODE1OiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIgPiY1Ci1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfY3Jvc3MiIDE+JjYKLWNyb3NzX2NvbXBpbGluZz0kYWNfY3ZfcHJvZ19jY19jcm9zcwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODIwOiBjaGVja2luZyB3aGV0aGVyIHdlIGFyZSB1c2luZyBHTlUgQyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nY2MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC5jIDw8RU9GCi0jaWZkZWYgX19HTlVDX18KLSAgeWVzOwotI2VuZGlmCi1FT0YKLWlmIHsgYWNfdHJ5PScke0NDLWNjfSAtRSBjb25mdGVzdC5jJzsgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4Mjk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODQ4OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGVjaG8gJ3ZvaWQgZigpe30nID4gY29uZnRlc3QuYwotaWYgdGVzdCAteiAiYCR7Q0MtY2N9IC1nIC1jIGNvbmZ0ZXN0LmMgMj4mMWAiOyB0aGVuCi0gIGFjX2N2X3Byb2dfY2NfZz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19jY19nPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfcHJvZ19jY19nIiAxPiY2Ci1pZiB0ZXN0ICIkYWNfdGVzdF9DRkxBR1MiID0gc2V0OyB0aGVuCi0gIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KLSAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KLSAgICBDRkxBR1M9Ii1nIC1PMiIKLSAgZWxzZQotICAgIENGTEFHUz0iLWciCi0gIGZpCi1lbHNlCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ci0gIGZpCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6ODgwOiBjaGVja2luZyBmb3IgUE9TSVhpemVkIElTQyIgPiY1Ci1pZiB0ZXN0IC1kIC9ldGMvY29uZi9rY29uZmlnLmQgJiYKLSAgZ3JlcCBfUE9TSVhfVkVSU0lPTiAvdXNyL2luY2x1ZGUvc3lzL3VuaXN0ZC5oID4vZGV2L251bGwgMj4mMQotdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIElTQz15ZXMgIyBJZiBsYXRlciB0ZXN0cyB3YW50IHRvIGNoZWNrIGZvciBJU0MuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBfUE9TSVhfU09VUkNFIDEKLUVPRgotCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0M9IiRDQyAtcG9zaXgiCi0gIGVsc2UKLSAgICBDQz0iJENDIC1YcCIKLSAgZmkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIElTQz0KLWZpCi0KLQotIyBXZSBjdXJyZW50bHkgb25seSB1c2UgdGhlIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgbmFtZSBvZiBhbnkgc2hhcmVkCi0jIGxpYnJhcnkuICBGb3IgdXNlciBjb252ZW5pZW5jZSwgd2UgYWx3YXlzIHVzZSB0aGUgc2FtZSB2ZXJzaW9uCi0jIG51bWJlciB0aGF0IEJGRCBpcyB1c2luZy4KLUJGRF9WRVJTSU9OPWBncmVwIElOSVRfQVVUT01BS0UgJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaW4gfCBzZWQgLW4gLWUgJ3MvWyAJXS8vZycgLWUgJ3MvXi4qLFwoLipcKSkuKiQvXDEvcCdgCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6OTE4OiBjaGVja2luZyBmb3IgYSBCU0QgY29tcGF0aWJsZSBpbnN0YWxsIiA+JjUKLWlmIHRlc3QgLXogIiRJTlNUQUxMIjsgdGhlbgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfaW5zdGFsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gICAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX0lGUz0iJElGUyI7IElGUz0iOiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICAjIEFjY291bnQgZm9yIHBlb3BsZSB3aG8gcHV0IHRyYWlsaW5nIHNsYXNoZXMgaW4gUEFUSCBlbGVtZW50cy4KLSAgICBjYXNlICIkYWNfZGlyLyIgaW4KLSAgICAvfC4vfC4vL3wvZXRjLyp8L3Vzci9zYmluLyp8L3Vzci9ldGMvKnwvc2Jpbi8qfC91c3IvYWZzd3MvYmluLyp8L3Vzci91Y2IvKikgOzsKLSAgICAqKQotICAgICAgIyBPU0YxIGFuZCBTQ08gT0RUIDMuMCBoYXZlIHRoZWlyIG93biBuYW1lcyBmb3IgaW5zdGFsbC4KLSAgICAgICMgRG9uJ3QgdXNlIGluc3RhbGxic2QgZnJvbSBPU0Ygc2luY2UgaXQgaW5zdGFsbHMgc3R1ZmYgYXMgcm9vdAotICAgICAgIyBieSBkZWZhdWx0LgotICAgICAgZm9yIGFjX3Byb2cgaW4gZ2luc3RhbGwgc2NvaW5zdCBpbnN0YWxsOyBkbwotICAgICAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3Byb2c7IHRoZW4KLQkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCi0gICAgICAgICAgICBncmVwIGRzcG1zZyAkYWNfZGlyLyRhY19wcm9nID4vZGV2L251bGwgMj4mMTsgdGhlbgotCSAgICAjIEFJWCBpbnN0YWxsLiAgSXQgaGFzIGFuIGluY29tcGF0aWJsZSBjYWxsaW5nIGNvbnZlbnRpb24uCi0JICAgIDoKLQkgIGVsc2UKLQkgICAgYWNfY3ZfcGF0aF9pbnN0YWxsPSIkYWNfZGlyLyRhY19wcm9nIC1jIgotCSAgICBicmVhayAyCi0JICBmaQotCWZpCi0gICAgICBkb25lCi0gICAgICA7OwotICAgIGVzYWMKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX0lGUyIKLQotZmkKLSAgaWYgdGVzdCAiJHthY19jdl9wYXRoX2luc3RhbGwrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgICBJTlNUQUxMPSIkYWNfY3ZfcGF0aF9pbnN0YWxsIgotICBlbHNlCi0gICAgIyBBcyBhIGxhc3QgcmVzb3J0LCB1c2UgdGhlIHNsb3cgc2hlbGwgc2NyaXB0LiAgV2UgZG9uJ3QgY2FjaGUgYQotICAgICMgcGF0aCBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAotICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCi0gICAgIyByZW1vdmVkLCBvciBpZiB0aGUgcGF0aCBpcyByZWxhdGl2ZS4KLSAgICBJTlNUQUxMPSIkYWNfaW5zdGFsbF9zaCIKLSAgZmkKLWZpCi1lY2hvICIkYWNfdCIiJElOU1RBTEwiIDE+JjYKLQotIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgotIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KLXRlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKLQotdGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMX1BST0dSQU19JwotCi10ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGJ1aWxkIGVudmlyb25tZW50IGlzIHNhbmUiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjk3MTogY2hlY2tpbmcgd2hldGhlciBidWlsZCBlbnZpcm9ubWVudCBpcyBzYW5lIiA+JjUKLSMgSnVzdCBpbiBjYXNlCi1zbGVlcCAxCi1lY2hvIHRpbWVzdGFtcCA+IGNvbmZ0ZXN0ZmlsZQotIyBEbyBgc2V0JyBpbiBhIHN1YnNoZWxsIHNvIHdlIGRvbid0IGNsb2JiZXIgdGhlIGN1cnJlbnQgc2hlbGwncwotIyBhcmd1bWVudHMuICBNdXN0IHRyeSAtTCBmaXJzdCBpbiBjYXNlIGNvbmZpZ3VyZSBpcyBhY3R1YWxseSBhCi0jIHN5bWxpbms7IHNvbWUgc3lzdGVtcyBwbGF5IHdlaXJkIGdhbWVzIHdpdGggdGhlIG1vZCB0aW1lIG9mIHN5bWxpbmtzCi0jIChlZyBGcmVlQlNEIHJldHVybnMgdGhlIG1vZCB0aW1lIG9mIHRoZSBzeW1saW5rJ3MgY29udGFpbmluZwotIyBkaXJlY3RvcnkpLgotaWYgKAotICAgc2V0IFggYGxzIC1MdCAkc3JjZGlyL2NvbmZpZ3VyZSBjb25mdGVzdGZpbGUgMj4gL2Rldi9udWxsYAotICAgaWYgdGVzdCAiJCoiID0gIlgiOyB0aGVuCi0gICAgICAjIC1MIGRpZG4ndCB3b3JrLgotICAgICAgc2V0IFggYGxzIC10ICRzcmNkaXIvY29uZmlndXJlIGNvbmZ0ZXN0ZmlsZWAKLSAgIGZpCi0gICBpZiB0ZXN0ICIkKiIgIT0gIlggJHNyY2Rpci9jb25maWd1cmUgY29uZnRlc3RmaWxlIiBcCi0gICAgICAmJiB0ZXN0ICIkKiIgIT0gIlggY29uZnRlc3RmaWxlICRzcmNkaXIvY29uZmlndXJlIjsgdGhlbgotCi0gICAgICAjIElmIG5laXRoZXIgbWF0Y2hlZCwgdGhlbiB3ZSBoYXZlIGEgYnJva2VuIGxzLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAjIGlmLCBmb3IgaW5zdGFuY2UsIENPTkZJR19TSEVMTCBpcyBiYXNoIGFuZCBpdCBpbmhlcml0cyBhCi0gICAgICAjIGJyb2tlbiBscyBhbGlhcyBmcm9tIHRoZSBlbnZpcm9ubWVudC4gIFRoaXMgaGFzIGFjdHVhbGx5Ci0gICAgICAjIGhhcHBlbmVkLiAgU3VjaCBhIHN5c3RlbSBjb3VsZCBub3QgYmUgY29uc2lkZXJlZCAic2FuZSIuCi0gICAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGxzIC10IGFwcGVhcnMgdG8gZmFpbC4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBub3QgYSBicm9rZW4KLWFsaWFzIGluIHlvdXIgZW52aXJvbm1lbnQiIDE+JjI7IGV4aXQgMTsgfQotICAgZmkKLQotICAgdGVzdCAiJDIiID0gY29uZnRlc3RmaWxlCi0gICApCi10aGVuCi0gICAjIE9rLgotICAgOgotZWxzZQotICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBuZXdseSBjcmVhdGVkIGZpbGUgaXMgb2xkZXIgdGhhbiBkaXN0cmlidXRlZCBmaWxlcyEKLUNoZWNrIHlvdXIgc3lzdGVtIGNsb2NrIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWlmIHRlc3QgIiRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIiA9IHMseCx4LDsgdGhlbgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPQotZWxzZQotICAjIERvdWJsZSBhbnkgXCBvciAkLiAgZWNobyBtaWdodCBpbnRlcnByZXQgYmFja3NsYXNoZXMuCi0gIGNhdCA8PFxFT0ZfU0VEID4gY29uZnRlc3RzZWQKLXMsXFwsXFxcXCxnOyBzLFwkLCQkLGcKLUVPRl9TRUQKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0iYGVjaG8gJHByb2dyYW1fdHJhbnNmb3JtX25hbWV8c2VkIC1mIGNvbmZ0ZXN0c2VkYCIKLSAgcm0gLWYgY29uZnRlc3RzZWQKLWZpCi10ZXN0ICIkcHJvZ3JhbV9wcmVmaXgiICE9IE5PTkUgJiYKLSAgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyxeLCR7cHJvZ3JhbV9wcmVmaXh9LDsgJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiCi0jIFVzZSBhIGRvdWJsZSAkIHNvIG1ha2UgaWdub3JlcyBpdC4KLXRlc3QgIiRwcm9ncmFtX3N1ZmZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLFwkXCQsJHtwcm9ncmFtX3N1ZmZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLQotIyBzZWQgd2l0aCBubyBmaWxlIGFyZ3MgcmVxdWlyZXMgYSBwcm9ncmFtLgotdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gIiIgJiYgcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZT0icyx4LHgsIgotCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDI4OiBjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiA+JjUKLXNldCBkdW1teSAke01BS0UtbWFrZX07IGFjX21ha2U9YGVjaG8gIiQyIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdG1ha2UgPDxcRU9GCi1hbGw6Ci0JQGVjaG8gJ2FjX21ha2V0ZW1wPSIke01BS0V9IicKLUVPRgotIyBHTlUgbWFrZSBzb21ldGltZXMgcHJpbnRzICJtYWtlWzFdOiBFbnRlcmluZy4uLiIsIHdoaWNoIHdvdWxkIGNvbmZ1c2UgdXMuCi1ldmFsIGAke01BS0UtbWFrZX0gLWYgY29uZnRlc3RtYWtlIDI+L2Rldi9udWxsIHwgZ3JlcCB0ZW1wPWAKLWlmIHRlc3QgLW4gIiRhY19tYWtldGVtcCI7IHRoZW4KLSAgZXZhbCBhY19jdl9wcm9nX21ha2VfJHthY19tYWtlfV9zZXQ9eWVzCi1lbHNlCi0gIGV2YWwgYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0PW5vCi1maQotcm0gLWYgY29uZnRlc3RtYWtlCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfcHJvZ19tYWtlXycke2FjX21ha2V9X3NldGBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICBTRVRfTUFLRT0KLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci0gIFNFVF9NQUtFPSJNQUtFPSR7TUFLRS1tYWtlfSIKLWZpCi0KLQotUEFDS0FHRT1vcGNvZGVzCi0KLVZFUlNJT049JHtCRkRfVkVSU0lPTn0KLQotaWYgdGVzdCAiYGNkICRzcmNkaXIgJiYgcHdkYCIgIT0gImBwd2RgIiAmJiB0ZXN0IC1mICRzcmNkaXIvY29uZmlnLnN0YXR1czsgdGhlbgotICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IHNvdXJjZSBkaXJlY3RvcnkgYWxyZWFkeSBjb25maWd1cmVkOyBydW4gIm1ha2UgZGlzdGNsZWFuIiB0aGVyZSBmaXJzdCIgMT4mMjsgZXhpdCAxOyB9Ci1maQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgUEFDS0FHRSAiJFBBQ0tBR0UiCi1FT0YKLQotY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgVkVSU0lPTiAiJFZFUlNJT04iCi1FT0YKLQotCi0KLW1pc3NpbmdfZGlyPWBjZCAkYWNfYXV4X2RpciAmJiBwd2RgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDc0OiBjaGVja2luZyBmb3Igd29ya2luZyBhY2xvY2FsIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhY2xvY2FsIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQUNMT0NBTD1hY2xvY2FsCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFDTE9DQUw9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGFjbG9jYWwiCi0gICBlY2hvICIkYWNfdCIibWlzc2luZyIgMT4mNgotZmkKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b2NvbmYiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEwODc6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9jb25mIiA+JjUKLSMgUnVuIHRlc3QgaW4gYSBzdWJzaGVsbDsgc29tZSB2ZXJzaW9ucyBvZiBzaCB3aWxsIHByaW50IGFuIGVycm9yIGlmCi0jIGFuIGV4ZWN1dGFibGUgaXMgbm90IGZvdW5kLCBldmVuIGlmIHN0ZGVyciBpcyByZWRpcmVjdGVkLgotIyBSZWRpcmVjdCBzdGRpbiB0byBwbGFjYXRlIG9sZGVyIHZlcnNpb25zIG9mIGF1dG9jb25mLiAgU2lnaC4KLWlmIChhdXRvY29uZiAtLXZlcnNpb24pIDwgL2Rldi9udWxsID4gL2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgIEFVVE9DT05GPWF1dG9jb25mCi0gICBlY2hvICIkYWNfdCIiZm91bmQiIDE+JjYKLWVsc2UKLSAgIEFVVE9DT05GPSIkbWlzc2luZ19kaXIvbWlzc2luZyBhdXRvY29uZiIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBhdXRvbWFrZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEwMDogY2hlY2tpbmcgZm9yIHdvcmtpbmcgYXV0b21ha2UiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9tYWtlIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgQVVUT01BS0U9YXV0b21ha2UKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT01BS0U9IiRtaXNzaW5nX2Rpci9taXNzaW5nIGF1dG9tYWtlIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExMTM6IGNoZWNraW5nIGZvciB3b3JraW5nIGF1dG9oZWFkZXIiID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKGF1dG9oZWFkZXIgLS12ZXJzaW9uKSA8IC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gICBBVVRPSEVBREVSPWF1dG9oZWFkZXIKLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgQVVUT0hFQURFUj0iJG1pc3NpbmdfZGlyL21pc3NpbmcgYXV0b2hlYWRlciIKLSAgIGVjaG8gIiRhY190IiJtaXNzaW5nIiAxPiY2Ci1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtYWtlaW5mbyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTEyNjogY2hlY2tpbmcgZm9yIHdvcmtpbmcgbWFrZWluZm8iID4mNQotIyBSdW4gdGVzdCBpbiBhIHN1YnNoZWxsOyBzb21lIHZlcnNpb25zIG9mIHNoIHdpbGwgcHJpbnQgYW4gZXJyb3IgaWYKLSMgYW4gZXhlY3V0YWJsZSBpcyBub3QgZm91bmQsIGV2ZW4gaWYgc3RkZXJyIGlzIHJlZGlyZWN0ZWQuCi0jIFJlZGlyZWN0IHN0ZGluIHRvIHBsYWNhdGUgb2xkZXIgdmVyc2lvbnMgb2YgYXV0b2NvbmYuICBTaWdoLgotaWYgKG1ha2VpbmZvIC0tdmVyc2lvbikgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgTUFLRUlORk89bWFrZWluZm8KLSAgIGVjaG8gIiRhY190IiJmb3VuZCIgMT4mNgotZWxzZQotICAgTUFLRUlORk89IiRtaXNzaW5nX2Rpci9taXNzaW5nIG1ha2VpbmZvIgotICAgZWNobyAiJGFjX3QiIm1pc3NpbmciIDE+JjYKLWZpCi0KLQotCi1pZiB0ZXN0ICRob3N0ICE9ICRidWlsZDsgdGhlbgotICBhY190b29sX3ByZWZpeD0ke2hvc3RfYWxpYXN9LQotZWxzZQotICBhY190b29sX3ByZWZpeD0KLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTQ5OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVI9IiR7YWNfdG9vbF9wcmVmaXh9YXIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FSIiAmJiBhY19jdl9wcm9nX0FSPSJhciIKLWZpCi1maQotQVI9IiRhY19jdl9wcm9nX0FSIgotaWYgdGVzdCAtbiAiJEFSIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFSIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1yYW5saWIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9cmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjExODE6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCi1pZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJFJBTkxJQiIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEyMTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIFJBTkxJQj0iOiIKLWZpCi1maQotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1zaGFyZWQgb3IgLS1kaXNhYmxlLXNoYXJlZCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9zaGFyZWQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3NoYXJlZCIKLSAgcD0ke1BBQ0tBR0UtZGVmYXVsdH0KLWNhc2UgIiRlbmFibGV2YWwiIGluCi15ZXMpIGVuYWJsZV9zaGFyZWQ9eWVzIDs7Ci1ubykgZW5hYmxlX3NoYXJlZD1ubyA7OwotKikKLSAgZW5hYmxlX3NoYXJlZD1ubwotICAjIExvb2sgYXQgdGhlIGFyZ3VtZW50IHdlIGdvdC4gIFdlIHVzZSBhbGwgdGhlIGNvbW1vbiBsaXN0IHNlcGFyYXRvcnMuCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfTosIgotICBmb3IgcGtnIGluICRlbmFibGV2YWw7IGRvCi0gICAgaWYgdGVzdCAiWCRwa2ciID0gIlgkcCI7IHRoZW4KLSAgICAgIGVuYWJsZV9zaGFyZWQ9eWVzCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgOzsKLWVzYWMKLWVsc2UKLSAgZW5hYmxlX3NoYXJlZD1ubwotZmkKLQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtc3RhdGljIG9yIC0tZGlzYWJsZS1zdGF0aWMgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfc3RhdGljK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9zdGF0aWMiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfc3RhdGljPXllcyA7Owotbm8pIGVuYWJsZV9zdGF0aWM9bm8gOzsKLSopCi0gIGVuYWJsZV9zdGF0aWM9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfc3RhdGljPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9zdGF0aWM9eWVzCi1maQotCi0jIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtZmFzdC1pbnN0YWxsIG9yIC0tZGlzYWJsZS1mYXN0LWluc3RhbGwgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfZmFzdF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9mYXN0X2luc3RhbGwiCi0gIHA9JHtQQUNLQUdFLWRlZmF1bHR9Ci1jYXNlICIkZW5hYmxldmFsIiBpbgoteWVzKSBlbmFibGVfZmFzdF9pbnN0YWxsPXllcyA7Owotbm8pIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8gOzsKLSopCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9bm8KLSAgIyBMb29rIGF0IHRoZSBhcmd1bWVudCB3ZSBnb3QuICBXZSB1c2UgYWxsIHRoZSBjb21tb24gbGlzdCBzZXBhcmF0b3JzLgotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306LCIKLSAgZm9yIHBrZyBpbiAkZW5hYmxldmFsOyBkbwotICAgIGlmIHRlc3QgIlgkcGtnIiA9ICJYJHAiOyB0aGVuCi0gICAgICBlbmFibGVfZmFzdF9pbnN0YWxsPXllcwotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIDs7Ci1lc2FjCi1lbHNlCi0gIGVuYWJsZV9mYXN0X2luc3RhbGw9eWVzCi1maQotCi0jIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzMTk6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19SQU5MSUInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgotICBhY19jdl9wcm9nX1JBTkxJQj0iJFJBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfUkFOTElCPSJyYW5saWIiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX1JBTkxJQiIgJiYgYWNfY3ZfcHJvZ19SQU5MSUI9IjoiCi1maQotZmkKLVJBTkxJQj0iJGFjX2N2X3Byb2dfUkFOTElCIgotaWYgdGVzdCAtbiAiJFJBTkxJQiI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRSQU5MSUIiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0jIENoZWNrIHdoZXRoZXIgLS13aXRoLWdudS1sZCBvciAtLXdpdGhvdXQtZ251LWxkIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7d2l0aF9nbnVfbGQrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgd2l0aHZhbD0iJHdpdGhfZ251X2xkIgotICB0ZXN0ICIkd2l0aHZhbCIgPSBubyB8fCB3aXRoX2dudV9sZD15ZXMKLWVsc2UKLSAgd2l0aF9nbnVfbGQ9bm8KLWZpCi0KLWFjX3Byb2c9bGQKLWlmIHRlc3QgIiRhY19jdl9wcm9nX2djYyIgPSB5ZXM7IHRoZW4KLSAgIyBDaGVjayBpZiBnY2MgLXByaW50LXByb2ctbmFtZT1sZCBnaXZlcyBhIHBhdGguCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsZCB1c2VkIGJ5IEdDQyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM1ODogY2hlY2tpbmcgZm9yIGxkIHVzZWQgYnkgR0NDIiA+JjUKLSAgYWNfcHJvZz1gKCRDQyAtcHJpbnQtcHJvZy1uYW1lPWxkKSAyPiY1YAotICBjYXNlICIkYWNfcHJvZyIgaW4KLSAgICAjIEFjY2VwdCBhYnNvbHV0ZSBwYXRocy4KLSAgICAvKiB8IFtBLVphLXpdOltcXC9dKikKLSAgICAgIHJlX2RpcmVsdD0nL1teL11bXi9dKi9cLlwuLycKLSAgICAgICMgQ2Fub25pY2FsaXplIHRoZSBwYXRoIG9mIGxkCi0gICAgICBhY19wcm9nPWBlY2hvICRhY19wcm9nfCBzZWQgJ3MlXFxcXCUvJWcnYAotICAgICAgd2hpbGUgZWNobyAkYWNfcHJvZyB8IGdyZXAgIiRyZV9kaXJlbHQiID4gL2Rldi9udWxsIDI+JjE7IGRvCi0JYWNfcHJvZz1gZWNobyAkYWNfcHJvZ3wgc2VkICJzJSRyZV9kaXJlbHQlLyUiYAotICAgICAgZG9uZQotICAgICAgdGVzdCAteiAiJExEIiAmJiBMRD0iJGFjX3Byb2ciCi0gICAgICA7OwotICAiIikKLSAgICAjIElmIGl0IGZhaWxzLCB0aGVuIHByZXRlbmQgd2UgYXJlbid0IHVzaW5nIEdDQy4KLSAgICBhY19wcm9nPWxkCi0gICAgOzsKLSAgKikKLSAgICAjIElmIGl0IGlzIHJlbGF0aXZlLCB0aGVuIHNlYXJjaCBmb3IgdGhlIGZpcnN0IGxkIGluIFBBVEguCi0gICAgd2l0aF9nbnVfbGQ9dW5rbm93bgotICAgIDs7Ci0gIGVzYWMKLWVsaWYgdGVzdCAiJHdpdGhfZ251X2xkIiA9IHllczsgdGhlbgotICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMzgyOiBjaGVja2luZyBmb3IgR05VIGxkIiA+JjUKLWVsc2UKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIG5vbi1HTlUgbGQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjEzODU6IGNoZWNraW5nIGZvciBub24tR05VIGxkIiA+JjUKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9MRCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLXogIiRMRCI7IHRoZW4KLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgIiRhY19kaXIvJGFjX3Byb2ciOyB0aGVuCi0gICAgICBhY19jdl9wYXRoX0xEPSIkYWNfZGlyLyRhY19wcm9nIgotICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb2dyYW0gaXMgR05VIGxkLiAgSSdkIHJhdGhlciB1c2UgLS12ZXJzaW9uLAotICAgICAgIyBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotICAgICAgIyBCcmVhayBvbmx5IGlmIGl0IHdhcyB0aGUgR05VL25vbi1HTlUgbGQgdGhhdCB3ZSBwcmVmZXIuCi0gICAgICBpZiAiJGFjX2N2X3BhdGhfTEQiIC12IDI+JjEgPCAvZGV2L251bGwgfCBlZ3JlcCAnKEdOVXx3aXRoIEJGRCknID4gL2Rldi9udWxsOyB0aGVuCi0JdGVzdCAiJHdpdGhfZ251X2xkIiAhPSBubyAmJiBicmVhawotICAgICAgZWxzZQotCXRlc3QgIiR3aXRoX2dudV9sZCIgIT0geWVzICYmIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1lbHNlCi0gIGFjX2N2X3BhdGhfTEQ9IiRMRCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi1maQotZmkKLQotTEQ9IiRhY19jdl9wYXRoX0xEIgotaWYgdGVzdCAtbiAiJExEIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJExEIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLXRlc3QgLXogIiRMRCIgJiYgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBubyBhY2NlcHRhYmxlIGxkIGZvdW5kIGluIFwkUEFUSCIgMT4mMjsgZXhpdCAxOyB9Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGlmIHRoZSBsaW5rZXIgKCRMRCkgaXMgR05VIGxkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDIxOiBjaGVja2luZyBpZiB0aGUgbGlua2VyICgkTEQpIGlzIEdOVSBsZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19nbnVfbGQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAjIEknZCByYXRoZXIgdXNlIC0tdmVyc2lvbiBoZXJlLCBidXQgYXBwYXJlbnRseSBzb21lIEdOVSBsZCdzIG9ubHkgYWNjZXB0IC12LgotaWYgJExEIC12IDI+JjEgPC9kZXYvbnVsbCB8IGVncmVwICcoR05VfHdpdGggQkZEKScgMT4mNTsgdGhlbgotICBhY19jdl9wcm9nX2dudV9sZD15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nbnVfbGQ9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ251X2xkIiAxPiY2Ci0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEJTRC1jb21wYXRpYmxlIG5tIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNDM3OiBjaGVja2luZyBmb3IgQlNELWNvbXBhdGlibGUgbm0iID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTk0nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkTk0iOyB0aGVuCi0gICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotICBhY19jdl9wYXRoX05NPSIkTk0iCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEggL3Vzci9jY3MvYmluIC91c3IvdWNiIC9iaW47IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvbm07IHRoZW4KLSAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBubSBhY2NlcHRzIGEgQlNELWNvbXBhdCBmbGFnLgotICAgICAgIyBBZGRpbmcgdGhlIGBzZWQgMXEnIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBvbiBIUC1VWCwgd2hpY2ggc2F5czoKLSAgICAgICMgICBubTogdW5rbm93biBvcHRpb24gIkIiIGlnbm9yZWQKLSAgICAgIGlmICgkYWNfZGlyL25tIC1CIC9kZXYvbnVsbCAyPiYxIHwgc2VkICcxcSc7IGV4aXQgMCkgfCBlZ3JlcCAvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgotCWFjX2N2X3BhdGhfTk09IiRhY19kaXIvbm0gLUIiCi0JYnJlYWsKLSAgICAgIGVsaWYgKCRhY19kaXIvbm0gLXAgL2Rldi9udWxsIDI+JjEgfCBzZWQgJzFxJzsgZXhpdCAwKSB8IGVncmVwIC9kZXYvbnVsbCA+L2Rldi9udWxsOyB0aGVuCi0JYWNfY3ZfcGF0aF9OTT0iJGFjX2Rpci9ubSAtcCIKLQlicmVhawotICAgICAgZWxzZQotCWFjX2N2X3BhdGhfTk09JHthY19jdl9wYXRoX05NPSIkYWNfZGlyL25tIn0gIyBrZWVwIHRoZSBmaXJzdCBtYXRjaCwgYnV0Ci0JY29udGludWUgIyBzbyB0aGF0IHdlIGNhbiB0cnkgdG8gZmluZCBvbmUgdGhhdCBzdXBwb3J0cyBCU0QgZmxhZ3MKLSAgICAgIGZpCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfTk0iICYmIGFjX2N2X3BhdGhfTk09bm0KLWZpCi1maQotCi1OTT0iJGFjX2N2X3BhdGhfTk0iCi1lY2hvICIkYWNfdCIiJE5NIiAxPiY2Ci0KLQotIyBDaGVjayBmb3IgY29tbWFuZCB0byBncmFiIHRoZSByYXcgc3ltYm9sIG5hbWUgZm9sbG93ZWQgYnkgQyBzeW1ib2wgZnJvbSBubS4KLWVjaG8gJGFjX24gImNoZWNraW5nIGNvbW1hbmQgdG8gcGFyc2UgJE5NIG91dHB1dCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQ3NTogY2hlY2tpbmcgY29tbWFuZCB0byBwYXJzZSAkTk0gb3V0cHV0IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgIyBUaGVzZSBhcmUgc2FuZSBkZWZhdWx0cyB0aGF0IHdvcmsgb24gYXQgbGVhc3QgYSBmZXcgb2xkIHN5c3RlbXMuCi0jIHtUaGV5IGNvbWUgZnJvbSBVbHRyaXguICBXaGF0IGNvdWxkIGJlIG9sZGVyIHRoYW4gVWx0cml4PyEhIDspfQotCi0jIENoYXJhY3RlciBjbGFzcyBkZXNjcmliaW5nIE5NIGdsb2JhbCBzeW1ib2wgY29kZXMuCi1hY19zeW1jb2RlPSdbQkNERUdSU1RdJwotCi0jIFJlZ2V4cCB0byBtYXRjaCBzeW1ib2xzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gQy4KLWFjX3N5bXBhdD0nXChbX0EtWmEtel1bX0EtWmEtejAtOV0qXCknCi0KLSMgVHJhbnNmb3JtIHRoZSBhYm92ZSBpbnRvIGEgcmF3IHN5bWJvbCBhbmQgYSBDIHN5bWJvbC4KLWFjX3N5bXhmcm09J1wxIFwyXDMgXDMnCi0KLSMgVHJhbnNmb3JtIGFuIGV4dHJhY3RlZCBzeW1ib2wgbGluZSBpbnRvIGEgcHJvcGVyIEMgZGVjbGFyYXRpb24KLWFjX2dsb2JhbF9zeW1ib2xfdG9fY2RlY2w9InNlZCAtbiAtZSAncy9eLiAuKiBcKC4qXCkkL2V4dGVybiBjaGFyIFwxOy9wJyIKLQotIyBEZWZpbmUgc3lzdGVtLXNwZWNpZmljIHZhcmlhYmxlcy4KLWNhc2UgIiRob3N0X29zIiBpbgotYWl4KikKLSAgYWNfc3ltY29kZT0nW0JDRFRdJwotICA7OwotY3lnd2luKiB8IG1pbmd3KikKLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi0gIDs7Ci1ocHV4KikKLSAgYWNfZ2xvYmFsX3N5bWJvbF90b19jZGVjbD0ic2VkIC1uIC1lICdzL15UIC4qIFwoLipcKSQvZXh0ZXJuIGNoYXIgXDEoKTsvcCcgLWUgJ3MvXi4gLiogXCguKlwpJC9leHRlcm4gY2hhciBcMTsvcCciCi0gIDs7Ci1pcml4KikKLSAgYWNfc3ltY29kZT0nW0JDREVHUlNUXScKLSAgOzsKLXNvbGFyaXMqKQotICBhY19zeW1jb2RlPSdbQkRUXScKLSAgOzsKLWVzYWMKLQotIyBJZiB3ZSdyZSB1c2luZyBHTlUgbm0sIHRoZW4gdXNlIGl0cyBzdGFuZGFyZCBzeW1ib2wgY29kZXMuCi1pZiAkTk0gLVYgMj4mMSB8IGVncmVwICcoR05VfHdpdGggQkZEKScgPiAvZGV2L251bGw7IHRoZW4KLSAgYWNfc3ltY29kZT0nW0FCQ0RHSVNUV10nCi1maQotCi0jIFRyeSB3aXRob3V0IGEgcHJlZml4IHVuZGVyY29yZSwgdGhlbiB3aXRoIGl0LgotZm9yIGFjX3N5bXByZnggaW4gIiIgIl8iOyBkbwotCi0gIGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGU9InNlZCAtbiAtZSAncy9eLiogCVwoJGFjX3N5bWNvZGVcKSAJIAkqXCgkYWNfc3ltcHJmeFwpJGFjX3N5bXBhdCQvJGFjX3N5bXhmcm0vcCciCi0KLSAgIyBDaGVjayB0byBzZWUgdGhhdCB0aGUgcGlwZSB3b3JrcyBjb3JyZWN0bHkuCi0gIGFjX3BpcGVfd29ya3M9bm8KLSAgcm0gLWYgY29uZnRlc3QuJGFjX2V4dAotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1jaGFyIG5tX3Rlc3RfdmFyOwotdm9pZCBubV90ZXN0X2Z1bmMoKXt9Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotaW50IG1haW4oKXtubV90ZXN0X3Zhcj0nYSc7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotCi0gIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTUzODogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICAgICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICAgIGFjX25saXN0PWNvbmZ0ZXN0Lm5tCi0gIAotICAgIGlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU0MjogXCIkTk0gY29uZnRlc3QuJGFjX29iamV4dCBcfCAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSBcPiAkYWNfbmxpc3RcIikgMT4mNTsgKGV2YWwgJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0KSAyPiY1OyB9ICYmIHRlc3QgLXMgIiRhY19ubGlzdCI7IHRoZW4KLQotICAgICAgIyBUcnkgc29ydGluZyBhbmQgdW5pcXVpZnlpbmcgdGhlIG91dHB1dC4KLSAgICAgIGlmIHNvcnQgIiRhY19ubGlzdCIgfCB1bmlxID4gIiRhY19ubGlzdCJUOyB0aGVuCi0JbXYgLWYgIiRhY19ubGlzdCJUICIkYWNfbmxpc3QiCi0gICAgICBlbHNlCi0Jcm0gLWYgIiRhY19ubGlzdCJUCi0gICAgICBmaQotCi0gICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIHNuYWdnZWQgYWxsIHRoZSBzeW1ib2xzIHdlIG5lZWQuCi0gICAgICBpZiBlZ3JlcCAnIG5tX3Rlc3RfdmFyJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCWlmIGVncmVwICcgbm1fdGVzdF9mdW5jJCcgIiRhY19ubGlzdCIgPi9kZXYvbnVsbDsgdGhlbgotCSAgY2F0IDw8RU9GID4gY29uZnRlc3QuYwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1FT0YKLQkgICMgTm93IGdlbmVyYXRlIHRoZSBzeW1ib2wgZmlsZS4KLQkgIGV2YWwgIiRhY19nbG9iYWxfc3ltYm9sX3RvX2NkZWNsIicgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jJwotCi0JICBjYXQgPDxFT0YgPj4gY29uZnRlc3QuYwotI2lmIGRlZmluZWQgKF9fU1REQ19fKSAmJiBfX1NURENfXwotIyBkZWZpbmUgbHRfcHRyX3Qgdm9pZCAqCi0jZWxzZQotIyBkZWZpbmUgbHRfcHRyX3QgY2hhciAqCi0jIGRlZmluZSBjb25zdAotI2VuZGlmCi0KLS8qIFRoZSBtYXBwaW5nIGJldHdlZW4gc3ltYm9sIG5hbWVzIGFuZCBzeW1ib2xzLiAqLwotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqbmFtZTsKLSAgbHRfcHRyX3QgYWRkcmVzczsKLX0KLWx0X3ByZWxvYWRlZF9zeW1ib2xzW10gPQotewotRU9GCi0Jc2VkICdzL14uIFwoLipcKSBcKC4qXCkkLyAgeyJcMiIsIChsdF9wdHJfdCkgXCZcMn0sLycgPCAiJGFjX25saXN0IiA+PiBjb25mdGVzdC5jCi0JY2F0IDw8XEVPRiA+PiBjb25mdGVzdC5jCi0gIHswLCAobHRfcHRyX3QpIDB9Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotRU9GCi0JICAjIE5vdyB0cnkgbGlua2luZyB0aGUgdHdvIGZpbGVzLgotCSAgbXYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdG0uJGFjX29iamV4dAotCSAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKLQkgIGFjX3NhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgotCSAgTElCUz0iY29uZnRlc3RtLiRhY19vYmpleHQiCi0JICBDRkxBR1M9IiRDRkxBR1Mkbm9fYnVpbHRpbl9mbGFnIgotCSAgaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTk0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KLQkgICAgYWNfcGlwZV93b3Jrcz15ZXMKLQkgIGVsc2UKLQkgICAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLQkgICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0JICBmaQotCSAgTElCUz0iJGFjX3NhdmVfTElCUyIKLQkgIENGTEFHUz0iJGFjX3NhdmVfQ0ZMQUdTIgotCWVsc2UKLQkgIGVjaG8gImNhbm5vdCBmaW5kIG5tX3Rlc3RfZnVuYyBpbiAkYWNfbmxpc3QiID4mNQotCWZpCi0gICAgICBlbHNlCi0JZWNobyAiY2Fubm90IGZpbmQgbm1fdGVzdF92YXIgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZWxzZQotICAgICAgZWNobyAiY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gIiRwcm9nbmFtZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gICAgY2F0IGNvbmZ0ZXN0LmMgPiY1Ci0gIGZpCi0gIHJtIC1yZiBjb25mdGVzdCoKLQotICAjIERvIG5vdCB1c2UgdGhlIGdsb2JhbF9zeW1ib2xfcGlwZSB1bmxlc3MgaXQgd29ya3MuCi0gIGlmIHRlc3QgIiRhY19waXBlX3dvcmtzIiA9IHllczsgdGhlbgotICAgIGlmIHRlc3QgeCIkYWNfc3ltcHJmeCIgPSB4Il8iOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi0gICAgZmkKLSAgICBicmVhawotICBlbHNlCi0gICAgYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZT0KLSAgZmkKLWRvbmUKLQotZmkKLQotCi1hY19yZXN1bHQ9eWVzCi1pZiB0ZXN0IC16ICIkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSI7IHRoZW4KLSAgIGFjX3Jlc3VsdD1ubwotZmkKLWVjaG8gIiRhY190IiIkYWNfcmVzdWx0IiAxPiY2Ci0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBfIHByZWZpeCBpbiBjb21waWxlZCBzeW1ib2xzIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNjQwOiBjaGVja2luZyBmb3IgXyBwcmVmaXggaW4gY29tcGlsZWQgc3ltYm9scyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgYWNfY3Zfc3lzX3N5bWJvbF91bmRlcnNjb3JlPW5vCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi12b2lkIG5tX3Rlc3RfZnVuYygpe30KLWludCBtYWluKCl7bm1fdGVzdF9mdW5jO3JldHVybiAwO30KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNjQ5OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gICMgTm93IHRyeSB0byBncmFiIHRoZSBzeW1ib2xzLgotICBhY19ubGlzdD1jb25mdGVzdC5ubQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTI6IFwiJE5NIGNvbmZ0ZXN0LiRhY19vYmpleHQgXHwgJGFjX2N2X3N5c19nbG9iYWxfc3ltYm9sX3BpcGUgXD4gJGFjX25saXN0XCIpIDE+JjU7IChldmFsICROTSBjb25mdGVzdC4kYWNfb2JqZXh0IFx8ICRhY19jdl9zeXNfZ2xvYmFsX3N5bWJvbF9waXBlIFw+ICRhY19ubGlzdCkgMj4mNTsgfSAmJiB0ZXN0IC1zICIkYWNfbmxpc3QiOyB0aGVuCi0gICAgIyBTZWUgd2hldGhlciB0aGUgc3ltYm9scyBoYXZlIGEgbGVhZGluZyB1bmRlcnNjb3JlLgotICAgIGlmIGVncmVwICdeLiBfbm1fdGVzdF9mdW5jJyAiJGFjX25saXN0IiA+L2Rldi9udWxsOyB0aGVuCi0gICAgICBhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmU9eWVzCi0gICAgZWxzZQotICAgICAgaWYgZWdyZXAgJ14uIG5tX3Rlc3RfZnVuYyAnICIkYWNfbmxpc3QiID4vZGV2L251bGw7IHRoZW4KLQk6Ci0gICAgICBlbHNlCi0JZWNobyAiY29uZmlndXJlOiBjYW5ub3QgZmluZCBubV90ZXN0X2Z1bmMgaW4gJGFjX25saXN0IiA+JjUKLSAgICAgIGZpCi0gICAgZmkKLSAgZWxzZQotICAgIGVjaG8gImNvbmZpZ3VyZTogY2Fubm90IHJ1biAkYWNfY3Zfc3lzX2dsb2JhbF9zeW1ib2xfcGlwZSIgPiY1Ci0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC5jID4mNQotZmkKLXJtIC1yZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9zeXNfc3ltYm9sX3VuZGVyc2NvcmUiIDE+JjYKLVVTRV9TWU1CT0xfVU5ERVJTQ09SRT0ke2FjX2N2X3N5c19zeW1ib2xfdW5kZXJzY29yZT1ub30KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY3ODogY2hlY2tpbmcgd2hldGhlciBsbiAtcyB3b3JrcyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19MTl9TJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgcm0gLWYgY29uZnRlc3RkYXRhCi1pZiBsbiAtcyBYIGNvbmZ0ZXN0ZGF0YSAyPi9kZXYvbnVsbAotdGhlbgotICBybSAtZiBjb25mdGVzdGRhdGEKLSAgYWNfY3ZfcHJvZ19MTl9TPSJsbiAtcyIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19MTl9TPWxuCi1maQotZmkKLUxOX1M9IiRhY19jdl9wcm9nX0xOX1MiCi1pZiB0ZXN0ICIkYWNfY3ZfcHJvZ19MTl9TIiA9ICJsbiAtcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotIyBDaGVjayBmb3IgYW55IHNwZWNpYWwgZmxhZ3MgdG8gcGFzcyB0byBsdGNvbmZpZy4KLWxpYnRvb2xfZmxhZ3M9Ii0tY2FjaGUtZmlsZT0kY2FjaGVfZmlsZSIKLXRlc3QgIiRlbmFibGVfc2hhcmVkIiA9IG5vICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZGlzYWJsZS1zaGFyZWQiCi10ZXN0ICIkZW5hYmxlX3N0YXRpYyIgPSBubyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLWRpc2FibGUtc3RhdGljIgotdGVzdCAiJGVuYWJsZV9mYXN0X2luc3RhbGwiID0gbm8gJiYgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWZhc3QtaW5zdGFsbCIKLXRlc3QgIiRsdF9kbG9wZW4iID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tZW5hYmxlLWRsb3BlbiIKLXRlc3QgIiRzaWxlbnQiID0geWVzICYmIGxpYnRvb2xfZmxhZ3M9IiRsaWJ0b29sX2ZsYWdzIC0tc2lsZW50IgotdGVzdCAiJGFjX2N2X3Byb2dfZ2NjIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ2NjIgotdGVzdCAiJGFjX2N2X3Byb2dfZ251X2xkIiA9IHllcyAmJiBsaWJ0b29sX2ZsYWdzPSIkbGlidG9vbF9mbGFncyAtLXdpdGgtZ251LWxkIgotCi0jIFNvbWUgZmxhZ3MgbmVlZCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjb21waWxlciBvciBsaW5rZXIgZm9yIGdvb2QKLSMgbGlidG9vbCBzdXBwb3J0LgotY2FzZSAiJGhvc3QiIGluCi0qLSotaXJpeDYqKQotICAjIEZpbmQgb3V0IHdoaWNoIEFCSSB3ZSBhcmUgdXNpbmcuCi0gIGVjaG8gJyNsaW5lIDE3MTQgImNvbmZpZ3VyZSInID4gY29uZnRlc3QuJGFjX2V4dAotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3MTU6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KLSAgICBjYXNlICJgL3Vzci9iaW4vZmlsZSBjb25mdGVzdC5vYCIgaW4KLSAgICAqMzItYml0KikKLSAgICAgIExEPSIke0xELWxkfSAtMzIiCi0gICAgICA7OwotICAgICpOMzIqKQotICAgICAgTEQ9IiR7TEQtbGR9IC1uMzIiCi0gICAgICA7OwotICAgICo2NC1iaXQqKQotICAgICAgTEQ9IiR7TEQtbGR9IC02NCIKLSAgICAgIDs7Ci0gICAgZXNhYwotICBmaQotICBybSAtcmYgY29uZnRlc3QqCi0gIDs7Ci0KLSotKi1zY28zLjJ2NSopCi0gICMgT24gU0NPIE9wZW5TZXJ2ZXIgNSwgd2UgbmVlZCAtYmVsZiB0byBnZXQgZnVsbC1mZWF0dXJlZCBiaW5hcmllcy4KLSAgU0FWRV9DRkxBR1M9IiRDRkxBR1MiCi0gIENGTEFHUz0iJENGTEFHUyAtYmVsZiIKLSAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTczNjogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciBuZWVkcyAtYmVsZiIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snbHRfY3ZfY2NfbmVlZHNfYmVsZicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3NDg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGx0X2N2X2NjX25lZWRzX2JlbGY9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkbHRfY3ZfY2NfbmVlZHNfYmVsZiIgMT4mNgotICBpZiB0ZXN0IHgiJGx0X2N2X2NjX25lZWRzX2JlbGYiICE9IHgieWVzIjsgdGhlbgotICAgICMgdGhpcyBpcyBwcm9iYWJseSBnY2MgMi44LjAsIGVnY3MgMS4wIG9yIG5ld2VyOyBubyBuZWVkIGZvciAtYmVsZgotICAgIENGTEFHUz0iJFNBVkVfQ0ZMQUdTIgotICBmaQotICA7OwotCi0qLSotY3lnd2luKikKLSAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15ICR7YWNfdG9vbF9wcmVmaXh9ZGxsdG9vbDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzcxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfRExMVE9PTCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBhY19jdl9wcm9nX0RMTFRPT0w9IiRETExUT09MIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19ETExUT09MPSIke2FjX3Rvb2xfcHJlZml4fWRsbHRvb2wiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLURMTFRPT0w9IiRhY19jdl9wcm9nX0RMTFRPT0wiCi1pZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRETExUT09MIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCi1pZiB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19ETExUT09MIjsgdGhlbgotaWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImRsbHRvb2wiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGRsbHRvb2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTgwMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0RMTFRPT0wnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkRExMVE9PTCI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19ETExUT09MPSIkRExMVE9PTCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfRExMVE9PTD0iZGxsdG9vbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3Byb2dfRExMVE9PTCIgJiYgYWNfY3ZfcHJvZ19ETExUT09MPSJmYWxzZSIKLWZpCi1maQotRExMVE9PTD0iJGFjX2N2X3Byb2dfRExMVE9PTCIKLWlmIHRlc3QgLW4gIiRETExUT09MIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJERMTFRPT0wiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1lbHNlCi0gIERMTFRPT0w9ImZhbHNlIgotZmkKLWZpCi0KLSMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hcyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hczsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxODM4OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQVMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQVMiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQVM9IiRBUyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQVM9IiR7YWNfdG9vbF9wcmVmaXh9YXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi1maQotZmkKLUFTPSIkYWNfY3ZfcHJvZ19BUyIKLWlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRBUyIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVMiOyB0aGVuCi1pZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCi0gICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiYXMiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGFzOyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4NzA6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19BUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGlmIHRlc3QgLW4gIiRBUyI7IHRoZW4KLSAgYWNfY3ZfcHJvZ19BUz0iJEFTIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KLWVsc2UKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcHJvZ19BUz0iYXMiCi0gICAgICBicmVhawotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wcm9nX0FTIiAmJiBhY19jdl9wcm9nX0FTPSJmYWxzZSIKLWZpCi1maQotQVM9IiRhY19jdl9wcm9nX0FTIgotaWYgdGVzdCAtbiAiJEFTIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEFTIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotICBBUz0iZmFsc2UiCi1maQotZmkKLQotCi0gIDs7Ci0KLWVzYWMKLQotIyBlbmFibGUgdGhlIC0tZGlzYWJsZS1saWJ0b29sLWxvY2sgc3dpdGNoCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1saWJ0b29sLWxvY2sgb3IgLS1kaXNhYmxlLWxpYnRvb2wtbG9jayB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9saWJ0b29sX2xvY2src2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2xpYnRvb2xfbG9jayIKLSAgbmVlZF9sb2Nrcz0kZW5hYmxldmFsCi1lbHNlCi0gIG5lZWRfbG9ja3M9eWVzCi1maQotCi0KLWlmIHRlc3QgeCIkbmVlZF9sb2NrcyIgPSB4bm87IHRoZW4KLSAgbGlidG9vbF9mbGFncz0iJGxpYnRvb2xfZmxhZ3MgLS1kaXNhYmxlLWxvY2siCi1maQotCi0KLSMgU2F2ZSBjYWNoZSwgc28gdGhhdCBsdGNvbmZpZyBjYW4gbG9hZCBpdAotY2F0ID4gY29uZmNhY2hlIDw8XEVPRgotIyBUaGlzIGZpbGUgaXMgYSBzaGVsbCBzY3JpcHQgdGhhdCBjYWNoZXMgdGhlIHJlc3VsdHMgb2YgY29uZmlndXJlCi0jIHRlc3RzIHJ1biBvbiB0aGlzIHN5c3RlbSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBjb25maWd1cmUKLSMgc2NyaXB0cyBhbmQgY29uZmlndXJlIHJ1bnMuICBJdCBpcyBub3QgdXNlZnVsIG9uIG90aGVyIHN5c3RlbXMuCi0jIElmIGl0IGNvbnRhaW5zIHJlc3VsdHMgeW91IGRvbid0IHdhbnQgdG8ga2VlcCwgeW91IG1heSByZW1vdmUgb3IgZWRpdCBpdC4KLSMKLSMgQnkgZGVmYXVsdCwgY29uZmlndXJlIHVzZXMgLi9jb25maWcuY2FjaGUgYXMgdGhlIGNhY2hlIGZpbGUsCi0jIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90IGV4aXN0IGFscmVhZHkuICBZb3UgY2FuIGdpdmUgY29uZmlndXJlCi0jIHRoZSAtLWNhY2hlLWZpbGU9RklMRSBvcHRpb24gdG8gdXNlIGEgZGlmZmVyZW50IGNhY2hlIGZpbGU7IHRoYXQgaXMKLSMgd2hhdCBjb25maWd1cmUgZG9lcyB3aGVuIGl0IGNhbGxzIGNvbmZpZ3VyZSBzY3JpcHRzIGluCi0jIHN1YmRpcmVjdG9yaWVzLCBzbyB0aGV5IHNoYXJlIHRoZSBjYWNoZS4KLSMgR2l2aW5nIC0tY2FjaGUtZmlsZT0vZGV2L251bGwgZGlzYWJsZXMgY2FjaGluZywgZm9yIGRlYnVnZ2luZyBjb25maWd1cmUuCi0jIGNvbmZpZy5zdGF0dXMgb25seSBwYXlzIGF0dGVudGlvbiB0byB0aGUgY2FjaGUgZmlsZSBpZiB5b3UgZ2l2ZSBpdCB0aGUKLSMgLS1yZWNoZWNrIG9wdGlvbiB0byByZXJ1biBjb25maWd1cmUuCi0jCi1FT0YKLSMgVGhlIGZvbGxvd2luZyB3YXkgb2Ygd3JpdGluZyB0aGUgY2FjaGUgbWlzaGFuZGxlcyBuZXdsaW5lcyBpbiB2YWx1ZXMsCi0jIGJ1dCB3ZSBrbm93IG9mIG5vIHdvcmthcm91bmQgdGhhdCBpcyBzaW1wbGUsIHBvcnRhYmxlLCBhbmQgZWZmaWNpZW50LgotIyBTbywgZG9uJ3QgcHV0IG5ld2xpbmVzIGluIGNhY2hlIHZhcmlhYmxlcycgdmFsdWVzLgotIyBVbHRyaXggc2ggc2V0IHdyaXRlcyB0byBzdGRlcnIgYW5kIGNhbid0IGJlIHJlZGlyZWN0ZWQgZGlyZWN0bHksCi0jIGFuZCBzZXRzIHRoZSBoaWdoIGJpdCBpbiB0aGUgY2FjaGUgZmlsZSB1bmxlc3Mgd2UgYXNzaWduIHRvIHRoZSB2YXJzLgotKHNldCkgMj4mMSB8Ci0gIGNhc2UgYChhY19zcGFjZT0nICc7IHNldCB8IGdyZXAgYWNfc3BhY2UpIDI+JjFgIGluCi0gICphY19zcGFjZT1cICopCi0gICAgIyBgc2V0JyBkb2VzIG5vdCBxdW90ZSBjb3JyZWN0bHksIHNvIGFkZCBxdW90ZXMgKGRvdWJsZS1xdW90ZSBzdWJzdGl0dXRpb24KLSAgICAjIHR1cm5zIFxcXFwgaW50byBcXCwgYW5kIHNlZCB0dXJucyBcXCBpbnRvIFwpLgotICAgIHNlZCAtbiBcCi0gICAgICAtZSAicy8nLydcXFxcJycvZyIgXAotICAgICAgLWUgInMvXlxcKFthLXpBLVowLTlfXSpfY3ZfW2EtekEtWjAtOV9dKlxcKT1cXCguKlxcKS9cXDE9XCR7XFwxPSdcXDInfS9wIgotICAgIDs7Ci0gICopCi0gICAgIyBgc2V0JyBxdW90ZXMgY29ycmVjdGx5IGFzIHJlcXVpcmVkIGJ5IFBPU0lYLCBzbyBkbyBub3QgYWRkIHF1b3Rlcy4KLSAgICBzZWQgLW4gLWUgJ3MvXlwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXCk9XCguKlwpL1wxPSR7XDE9XDJ9L3AnCi0gICAgOzsKLSAgZXNhYyA+PiBjb25mY2FjaGUKLWlmIGNtcCAtcyAkY2FjaGVfZmlsZSBjb25mY2FjaGU7IHRoZW4KLSAgOgotZWxzZQotICBpZiB0ZXN0IC13ICRjYWNoZV9maWxlOyB0aGVuCi0gICAgZWNobyAidXBkYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gICAgY2F0IGNvbmZjYWNoZSA+ICRjYWNoZV9maWxlCi0gIGVsc2UKLSAgICBlY2hvICJub3QgdXBkYXRpbmcgdW53cml0YWJsZSBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgZmkKLWZpCi1ybSAtZiBjb25mY2FjaGUKLQotCi0jIEFjdHVhbGx5IGNvbmZpZ3VyZSBsaWJ0b29sLiAgYWNfYXV4X2RpciBpcyB3aGVyZSBpbnN0YWxsLXNoIGlzIGZvdW5kLgotQ0M9IiRDQyIgQ0ZMQUdTPSIkQ0ZMQUdTIiBDUFBGTEFHUz0iJENQUEZMQUdTIiBcCi1MRD0iJExEIiBOTT0iJE5NIiBSQU5MSUI9IiRSQU5MSUIiIExOX1M9IiRMTl9TIiBcCi1ETExUT09MPSIkRExMVE9PTCIgQVM9IiRBUyIgXAotJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJGFjX2F1eF9kaXIvbHRjb25maWcgLS1uby1yZWV4ZWMgXAotJGxpYnRvb2xfZmxhZ3MgLS1uby12ZXJpZnkgJGFjX2F1eF9kaXIvbHRtYWluLnNoICRob3N0IFwKLXx8IHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogbGlidG9vbCBjb25maWd1cmUgZmFpbGVkIiAxPiYyOyBleGl0IDE7IH0KLQotIyBSZWxvYWQgY2FjaGUsIHRoYXQgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBieSBsdGNvbmZpZwotaWYgdGVzdCAtciAiJGNhY2hlX2ZpbGUiOyB0aGVuCi0gIGVjaG8gImxvYWRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gIC4gJGNhY2hlX2ZpbGUKLWVsc2UKLSAgZWNobyAiY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiCi0gID4gJGNhY2hlX2ZpbGUKLWZpCi0KLQotIyBUaGlzIGNhbiBiZSB1c2VkIHRvIHJlYnVpbGQgbGlidG9vbCB3aGVuIG5lZWRlZAotTElCVE9PTF9ERVBTPSIkYWNfYXV4X2Rpci9sdGNvbmZpZyAkYWNfYXV4X2Rpci9sdG1haW4uc2giCi0KLSMgQWx3YXlzIHVzZSBvdXIgb3duIGxpYnRvb2wuCi1MSUJUT09MPSckKFNIRUxMKSAkKHRvcF9idWlsZGRpcikvbGlidG9vbCcKLQotIyBSZWRpcmVjdCB0aGUgY29uZmlnLmxvZyBvdXRwdXQgYWdhaW4sIHNvIHRoYXQgdGhlIGx0Y29uZmlnIGxvZyBpcyBub3QKLSMgY2xvYmJlcmVkIGJ5IHRoZSBuZXh0IG1lc3NhZ2UuCi1leGVjIDU+Pi4vY29uZmlnLmxvZwotCi0KLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS10YXJnZXRzIG9yIC0tZGlzYWJsZS10YXJnZXRzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX3RhcmdldHMrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX3RhcmdldHMiCi0gIGNhc2UgIiR7ZW5hYmxldmFsfSIgaW4KLSAgeWVzIHwgIiIpIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCciIDE+JjI7IGV4aXQgMTsgfQotICAgICAgICAgICAgOzsKLSAgbm8pICAgICAgIGVuYWJsZV90YXJnZXRzPSA7OwotICAqKSAgICAgICAgZW5hYmxlX3RhcmdldHM9JGVuYWJsZXZhbCA7OwotZXNhYwotZmkKLSMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jb21tb25iZmRsaWIgb3IgLS1kaXNhYmxlLWNvbW1vbmJmZGxpYiB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke2VuYWJsZV9jb21tb25iZmRsaWIrc2V0fSIgPSBzZXQ7IHRoZW4KLSAgZW5hYmxldmFsPSIkZW5hYmxlX2NvbW1vbmJmZGxpYiIKLSAgY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMpIGNvbW1vbmJmZGxpYj10cnVlIDs7Ci0gIG5vKSAgY29tbW9uYmZkbGliPWZhbHNlIDs7Ci0gICopICAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBiYWQgdmFsdWUgJHtlbmFibGV2YWx9IGZvciBvcGNvZGVzIGNvbW1vbmJmZGxpYiBvcHRpb24iIDE+JjI7IGV4aXQgMTsgfSA7OwotZXNhYwotZmkKLQotCi0KLQotCi1pZiB0ZXN0IC16ICIkdGFyZ2V0IiA7IHRoZW4KLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IFVucmVjb2duaXplZCB0YXJnZXQgc3lzdGVtIHR5cGU7IHBsZWFzZSBjaGVjayBjb25maWcuc3ViLiIgMT4mMjsgZXhpdCAxOyB9Ci1maQotaWYgdGVzdCAiJHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gcyx4LHgsOyB0aGVuCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9Ci1lbHNlCi0gICMgRG91YmxlIGFueSBcIG9yICQuICBlY2hvIG1pZ2h0IGludGVycHJldCBiYWNrc2xhc2hlcy4KLSAgY2F0IDw8XEVPRl9TRUQgPiBjb25mdGVzdHNlZAotcyxcXCxcXFxcLGc7IHMsXCQsJCQsZwotRU9GX1NFRAotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJgZWNobyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZXxzZWQgLWYgY29uZnRlc3RzZWRgIgotICBybSAtZiBjb25mdGVzdHNlZAotZmkKLXRlc3QgIiRwcm9ncmFtX3ByZWZpeCIgIT0gTk9ORSAmJgotICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLF4sJHtwcm9ncmFtX3ByZWZpeH0sOyAkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIKLSMgVXNlIGEgZG91YmxlICQgc28gbWFrZSBpZ25vcmVzIGl0LgotdGVzdCAiJHByb2dyYW1fc3VmZml4IiAhPSBOT05FICYmCi0gIHByb2dyYW1fdHJhbnNmb3JtX25hbWU9InMsXCRcJCwke3Byb2dyYW1fc3VmZml4fSw7ICRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lIgotCi0jIHNlZCB3aXRoIG5vIGZpbGUgYXJncyByZXF1aXJlcyBhIHByb2dyYW0uCi10ZXN0ICIkcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSIgPSAiIiAmJiBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSJzLHgseCwiCi0KLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0byBlbmFibGUgbWFpbnRhaW5lci1zcGVjaWZpYyBwb3J0aW9ucyBvZiBNYWtlZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIwNDk6IGNoZWNraW5nIHdoZXRoZXIgdG8gZW5hYmxlIG1haW50YWluZXItc3BlY2lmaWMgcG9ydGlvbnMgb2YgTWFrZWZpbGVzIiA+JjUKLSAgICAjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtbWFpbnRhaW5lci1tb2RlIG9yIC0tZGlzYWJsZS1tYWludGFpbmVyLW1vZGUgd2FzIGdpdmVuLgotaWYgdGVzdCAiJHtlbmFibGVfbWFpbnRhaW5lcl9tb2RlK3NldH0iID0gc2V0OyB0aGVuCi0gIGVuYWJsZXZhbD0iJGVuYWJsZV9tYWludGFpbmVyX21vZGUiCi0gIFVTRV9NQUlOVEFJTkVSX01PREU9JGVuYWJsZXZhbAotZWxzZQotICBVU0VfTUFJTlRBSU5FUl9NT0RFPW5vCi1maQotCi0gIGVjaG8gIiRhY190IiIkVVNFX01BSU5UQUlORVJfTU9ERSIgMT4mNgotICAKLQotaWYgdGVzdCAkVVNFX01BSU5UQUlORVJfTU9ERSA9IHllczsgdGhlbgotICBNQUlOVEFJTkVSX01PREVfVFJVRT0KLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPScjJwotZWxzZQotICBNQUlOVEFJTkVSX01PREVfVFJVRT0nIycKLSAgTUFJTlRBSU5FUl9NT0RFX0ZBTFNFPQotZmkKLSAgTUFJTlQ9JE1BSU5UQUlORVJfTU9ERV9UUlVFCi0gIAotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDcyOiBjaGVja2luZyBmb3IgQ3lnd2luIGVudmlyb25tZW50IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jeWd3aW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDc3ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotaW50IG1haW4oKSB7Ci0KLSNpZm5kZWYgX19DWUdXSU5fXwotI2RlZmluZSBfX0NZR1dJTl9fIF9fQ1lHV0lOMzJfXwotI2VuZGlmCi1yZXR1cm4gX19DWUdXSU5fXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDg4OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY3lnd2luPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9jeWd3aW49bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jeWd3aW4iIDE+JjYKLUNZR1dJTj0KLXRlc3QgIiRhY19jdl9jeWd3aW4iID0geWVzICYmIENZR1dJTj15ZXMKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBtaW5ndzMyIGVudmlyb25tZW50IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTA1OiBjaGVja2luZyBmb3IgbWluZ3czMiBlbnZpcm9ubWVudCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbWluZ3czMicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMTAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLXJldHVybiBfX01JTkdXMzJfXzsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMTE3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfbWluZ3czMj1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0Kgotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X21pbmd3MzIiIDE+JjYKLU1JTkdXMzI9Ci10ZXN0ICIkYWNfY3ZfbWluZ3czMiIgPSB5ZXMgJiYgTUlOR1czMj15ZXMKLQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgZXhlY3V0YWJsZSBzdWZmaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMzY6IGNoZWNraW5nIGZvciBleGVjdXRhYmxlIHN1ZmZpeCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZXhlZXh0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJENZR1dJTiIgPSB5ZXMgfHwgdGVzdCAiJE1JTkdXMzIiID0geWVzOyB0aGVuCi0gIGFjX2N2X2V4ZWV4dD0uZXhlCi1lbHNlCi0gIHJtIC1mIGNvbmZ0ZXN0KgotICBlY2hvICdpbnQgbWFpbiAoKSB7IHJldHVybiAwOyB9JyA+IGNvbmZ0ZXN0LiRhY19leHQKLSAgYWNfY3ZfZXhlZXh0PQotICBpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIxNDY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH07IHRoZW4KLSAgICBmb3IgZmlsZSBpbiBjb25mdGVzdC4qOyBkbwotICAgICAgY2FzZSAkZmlsZSBpbgotICAgICAgKi5jIHwgKi5vIHwgKi5vYmogfCAqLmlsayB8ICoucGRiKSA7OwotICAgICAgKikgYWNfY3ZfZXhlZXh0PWBlY2hvICRmaWxlIHwgc2VkIC1lIHMvY29uZnRlc3QvL2AgOzsKLSAgICAgIGVzYWMKLSAgICBkb25lCi0gIGVsc2UKLSAgICB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IGluc3RhbGxhdGlvbiBvciBjb25maWd1cmF0aW9uIHByb2JsZW06IGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLSAgZmkKLSAgcm0gLWYgY29uZnRlc3QqCi0gIHRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iID0geCAmJiBhY19jdl9leGVleHQ9bm8KLWZpCi1maQotCi1FWEVFWFQ9IiIKLXRlc3QgeCIke2FjX2N2X2V4ZWV4dH0iICE9IHhubyAmJiBFWEVFWFQ9JHthY19jdl9leGVleHR9Ci1lY2hvICIkYWNfdCIiJHthY19jdl9leGVleHR9IiAxPiY2Ci1hY19leGVleHQ9JEVYRUVYVAotCi0KLSMgaG9zdC1zcGVjaWZpYyBzdHVmZjoKLQotIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMTcyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX2R1bW15PSIkUEFUSCIKLSAgZm9yIGFjX2RpciBpbiAkYWNfZHVtbXk7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3Byb2dfQ0M9ImdjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotaWYgdGVzdCAteiAiJENDIjsgdGhlbgotICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBjYzsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMjAyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCi1lbHNlCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IjoiCi0gIGFjX3Byb2dfcmVqZWN0ZWQ9bm8KLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAiJGFjX2Rpci8kYWNfd29yZCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCi0gICAgICAgIGFjX3Byb2dfcmVqZWN0ZWQ9eWVzCi0JY29udGludWUKLSAgICAgIGZpCi0gICAgICBhY19jdl9wcm9nX0NDPSJjYyIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWlmIHRlc3QgJGFjX3Byb2dfcmVqZWN0ZWQgPSB5ZXM7IHRoZW4KLSAgIyBXZSBmb3VuZCBhIGJvZ29uIGluIHRoZSBwYXRoLCBzbyBtYWtlIHN1cmUgd2UgbmV2ZXIgdXNlIGl0LgotICBzZXQgZHVtbXkgJGFjX2N2X3Byb2dfQ0MKLSAgc2hpZnQKLSAgaWYgdGVzdCAkIyAtZ3QgMDsgdGhlbgotICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgotICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KLSAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KLSAgICBzaGlmdAotICAgIHNldCBkdW1teSAiJGFjX2Rpci8kYWNfd29yZCIgIiRAIgotICAgIHNoaWZ0Ci0gICAgYWNfY3ZfcHJvZ19DQz0iJEAiCi0gIGZpCi1maQotZmkKLWZpCi1DQz0iJGFjX2N2X3Byb2dfQ0MiCi1pZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkQ0MiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gIGlmIHRlc3QgLXogIiRDQyI7IHRoZW4KLSAgICBjYXNlICJgdW5hbWUgLXNgIiBpbgotICAgICp3aW4zMiogfCAqV0lOMzIqKQotICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJjbCIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCi1zZXQgZHVtbXkgY2w7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI1MzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0NDJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgotZWxzZQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBhY19jdl9wcm9nX0NDPSJjbCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLWZpCi1maQotQ0M9IiRhY19jdl9wcm9nX0NDIgotaWYgdGVzdCAtbiAiJENDIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJENDIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLSA7OwotICAgIGVzYWMKLSAgZmkKLSAgdGVzdCAteiAiJENDIiAmJiB7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6IG5vIGFjY2VwdGFibGUgY2MgZm91bmQgaW4gXCRQQVRIIiAxPiYyOyBleGl0IDE7IH0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjI4NTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKLQotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PCBFT0YKLQotI2xpbmUgMjI5NiAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLW1haW4oKXtyZXR1cm4oMCk7fQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBhY19jdl9wcm9nX2NjX3dvcmtzPXllcwotICAjIElmIHdlIGNhbid0IHJ1biBhIHRyaXZpYWwgcHJvZ3JhbSwgd2UgYXJlIHByb2JhYmx5IHVzaW5nIGEgY3Jvc3MgY29tcGlsZXIuCi0gIGlmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbDsgdGhlbgotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9bm8KLSAgZWxzZQotICAgIGFjX2N2X3Byb2dfY2NfY3Jvc3M9eWVzCi0gIGZpCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBhY19jdl9wcm9nX2NjX3dvcmtzPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotYWNfZXh0PWMKLSMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KLWFjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCi1hY19jb21waWxlPScke0NDLWNjfSAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0IDE+JjUnCi1hY19saW5rPScke0NDLWNjfSAtbyBjb25mdGVzdCR7YWNfZXhlZXh0fSAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTIDE+JjUnCi1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9wcm9nX2NjX3dvcmtzID0gbm87IHRoZW4KLSAgeyBlY2hvICJjb25maWd1cmU6IGVycm9yOiBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBwcm9ibGVtOiBDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMuIiAxPiYyOyBleGl0IDE7IH0KLWZpCi1lY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgaXMgYSBjcm9zcy1jb21waWxlciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjMyNzogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQotZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2Ci1jcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIzMzI6IGNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIEdOVSBDIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2djYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LmMgPDxFT0YKLSNpZmRlZiBfX0dOVUNfXwotICB5ZXM7Ci0jZW5kaWYKLUVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzNDE6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9OyB9IHwgZWdyZXAgeWVzID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBhY19jdl9wcm9nX2djYz15ZXMKLWVsc2UKLSAgYWNfY3ZfcHJvZ19nY2M9bm8KLWZpCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfZ2NjIiAxPiY2Ci0KLWlmIHRlc3QgJGFjX2N2X3Byb2dfZ2NjID0geWVzOyB0aGVuCi0gIEdDQz15ZXMKLWVsc2UKLSAgR0NDPQotZmkKLQotYWNfdGVzdF9DRkxBR1M9IiR7Q0ZMQUdTK3NldH0iCi1hY19zYXZlX0NGTEFHUz0iJENGTEFHUyIKLUNGTEFHUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjM2MDogY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX2NjX2cnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBlY2hvICd2b2lkIGYoKXt9JyA+IGNvbmZ0ZXN0LmMKLWlmIHRlc3QgLXogImAke0NDLWNjfSAtZyAtYyBjb25mdGVzdC5jIDI+JjFgIjsgdGhlbgotICBhY19jdl9wcm9nX2NjX2c9eWVzCi1lbHNlCi0gIGFjX2N2X3Byb2dfY2NfZz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X3Byb2dfY2NfZyIgMT4mNgotaWYgdGVzdCAiJGFjX3Rlc3RfQ0ZMQUdTIiA9IHNldDsgdGhlbgotICBDRkxBR1M9IiRhY19zYXZlX0NGTEFHUyIKLWVsaWYgdGVzdCAkYWNfY3ZfcHJvZ19jY19nID0geWVzOyB0aGVuCi0gIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCi0gICAgQ0ZMQUdTPSItZyAtTzIiCi0gIGVsc2UKLSAgICBDRkxBR1M9Ii1nIgotICBmaQotZWxzZQotICBpZiB0ZXN0ICIkR0NDIiA9IHllczsgdGhlbgotICAgIENGTEFHUz0iLU8yIgotICBlbHNlCi0gICAgQ0ZMQUdTPQotICBmaQotZmkKLQotCi1BTExfTElOR1VBUz0KLWVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzk0OiBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3NvciIgPiY1Ci0jIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgotaWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KLSAgQ1BQPQotZmkKLWlmIHRlc3QgLXogIiRDUFAiOyB0aGVuCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DUFAnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgICMgVGhpcyBtdXN0IGJlIGluIGRvdWJsZSBxdW90ZXMsIG5vdCBzaW5nbGUgcXVvdGVzLCBiZWNhdXNlIENQUCBtYXkgZ2V0Ci0gICMgc3Vic3RpdHV0ZWQgaW50byB0aGUgTWFrZWZpbGUgYW5kICIke0NDLWNjfSIgd2lsbCBjb25mdXNlIG1ha2UuCi0gIENQUD0iJHtDQy1jY30gLUUiCi0gICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCi0gICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MDkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0MTU6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1FIC10cmFkaXRpb25hbC1jcHAiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0MjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0MzI6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9IiR7Q0MtY2N9IC1ub2xvZ28gLUUiCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGFzc2VydC5oPgotU3ludGF4IEVycm9yCi1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0NDk6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBDUFA9L2xpYi9jcHAKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1ybSAtZiBjb25mdGVzdCoKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotICBDUFA9IiRhY19jdl9wcm9nX0NQUCIKLWVsc2UKLSAgYWNfY3ZfcHJvZ19DUFA9IiRDUFAiCi1maQotZWNobyAiJGFjX3QiIiRDUFAiIDE+JjYKLQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI0NzQ6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI0NzkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjI0ODc6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPXllcwotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KLSAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjUwNCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIm1lbWNociIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCi1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNTIyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiZnJlZSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIDoKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9oZWFkZXJfc3RkYz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotCi1pZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgotICAjIC9iaW4vY2MgaW4gSXJpeC00LjAuNSBnZXRzIG5vbi1BTlNJIGN0eXBlIG1hY3JvcyB1bmxlc3MgdXNpbmcgLWFuc2kuCi1pZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllczsgdGhlbgotICA6Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1NDMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIElTTE9XRVIoYykgKCdhJyA8PSAoYykgJiYgKGMpIDw9ICd6JykKLSNkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQotI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKLWludCBtYWluICgpIHsgaW50IGk7IGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKLWlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkgfHwgdG91cHBlciAoaSkgIT0gVE9VUFBFUiAoaSkpIGV4aXQoMik7Ci1leGl0ICgwKTsgfQotCi1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjU1NDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAotdGhlbgotICA6Ci1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9zdGRjPW5vCi1maQotcm0gLWZyIGNvbmZ0ZXN0KgotZmkKLQotZmkKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfaGVhZGVyX3N0ZGMiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBTVERDX0hFQURFUlMgMQotRU9GCi0KLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNTc4OiBjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19jb25zdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI1ODMgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLQotLyogVWx0cml4IG1pcHMgY2MgcmVqZWN0cyB0aGlzLiAgKi8KLXR5cGVkZWYgaW50IGNoYXJzZXRbMl07IGNvbnN0IGNoYXJzZXQgeDsKLS8qIFN1bk9TIDQuMS4xIGNjIHJlamVjdHMgdGhpcy4gICovCi1jaGFyIGNvbnN0ICpjb25zdCAqY2NwOwotY2hhciAqKnA7Ci0vKiBORUMgU1ZSNC4wLjIgbWlwcyBjYyByZWplY3RzIHRoaXMuICAqLwotc3RydWN0IHBvaW50IHtpbnQgeCwgeTt9Owotc3RhdGljIHN0cnVjdCBwb2ludCBjb25zdCB6ZXJvID0gezAsMH07Ci0vKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMuCi0gICBJdCBkb2VzIG5vdCBsZXQgeW91IHN1YnRyYWN0IG9uZSBjb25zdCBYKiBwb2ludGVyIGZyb20gYW5vdGhlciBpbiBhbiBhcm0KLSAgIG9mIGFuIGlmLWV4cHJlc3Npb24gd2hvc2UgaWYtcGFydCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uICovCi1jb25zdCBjaGFyICpnID0gInN0cmluZyI7Ci1jY3AgPSAmZyArIChnID8gZy1nIDogMCk7Ci0vKiBIUFVYIDcuMCBjYyByZWplY3RzIHRoZXNlLiAqLwotKytjY3A7Ci1wID0gKGNoYXIqKikgY2NwOwotY2NwID0gKGNoYXIgY29uc3QgKmNvbnN0ICopIHA7Ci17IC8qIFNDTyAzLjJ2NCBjYyByZWplY3RzIHRoaXMuICAqLwotICBjaGFyICp0OwotICBjaGFyIGNvbnN0ICpzID0gMCA/IChjaGFyICopIDAgOiAoY2hhciBjb25zdCAqKSAwOwotCi0gICp0KysgPSAwOwotfQoteyAvKiBTb21lb25lIHRoaW5rcyB0aGUgU3VuIHN1cHBvc2VkbHktQU5TSSBjb21waWxlciB3aWxsIHJlamVjdCB0aGlzLiAgKi8KLSAgaW50IHhbXSA9IHsyNSwgMTd9OwotICBjb25zdCBpbnQgKmZvbyA9ICZ4WzBdOwotICArK2ZvbzsKLX0KLXsgLyogU3VuIFNDMS4wIEFOU0kgY29tcGlsZXIgcmVqZWN0cyB0aGlzIC0tIGJ1dCBub3QgdGhlIGFib3ZlLiAqLwotICB0eXBlZGVmIGNvbnN0IGludCAqaXB0cjsKLSAgaXB0ciBwID0gMDsKLSAgKytwOwotfQoteyAvKiBBSVggWEwgQyAxLjAyLjAuMCByZWplY3RzIHRoaXMgc2F5aW5nCi0gICAgICJrLmMiLCBsaW5lIDIuMjc6IDE1MDYtMDI1IChTKSBPcGVyYW5kIG11c3QgYmUgYSBtb2RpZmlhYmxlIGx2YWx1ZS4gKi8KLSAgc3RydWN0IHMgeyBpbnQgajsgY29uc3QgaW50ICphcFszXTsgfTsKLSAgc3RydWN0IHMgKmI7IGItPmogPSA1OwotfQoteyAvKiBVTFRSSVgtMzIgVjMuMSAoUmV2IDkpIHZjYyByZWplY3RzIHRoaXMgKi8KLSAgY29uc3QgaW50IGZvbyA9IDEwOwotfQotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjYzMjogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2NfY29uc3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19jb25zdCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfY19jb25zdCA9IG5vOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBjb25zdCAKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgaW5saW5lIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNjUzOiBjaGVja2luZyBmb3IgaW5saW5lIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2lubGluZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX2N2X2NfaW5saW5lPW5vCi1mb3IgYWNfa3cgaW4gaW5saW5lIF9faW5saW5lX18gX19pbmxpbmU7IGRvCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI2NjAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLX0gJGFjX2t3IGZvbygpIHsKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyNjY3OiBcIiRhY19jb21waWxlXCIpIDE+JjU7IChldmFsICRhY19jb21waWxlKSAyPiY1OyB9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfY19pbmxpbmU9JGFjX2t3OyBicmVhawotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWRvbmUKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9jX2lubGluZSIgMT4mNgotY2FzZSAiJGFjX2N2X2NfaW5saW5lIiBpbgotICBpbmxpbmUgfCB5ZXMpIDs7Ci0gIG5vKSBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgaW5saW5lIAotRU9GCi0gOzsKLSAgKikgIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIGlubGluZSAkYWNfY3ZfY19pbmxpbmUKLUVPRgotIDs7Ci1lc2FjCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBvZmZfdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjY5MzogY2hlY2tpbmcgZm9yIG9mZl90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX29mZl90JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjY5OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaWYgU1REQ19IRUFERVJTCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLUVPRgotaWYgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+JjUgfAotICBlZ3JlcCAiKF58W15hLXpBLVpfMC05XSlvZmZfdFteYS16QS1aXzAtOV0iID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X3R5cGVfb2ZmX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9vZmZfdD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotZWNobyAiJGFjX3QiIiRhY19jdl90eXBlX29mZl90IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl90eXBlX29mZl90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIG9mZl90IGxvbmcKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzI2OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3MzEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmIFNURENfSEVBREVSUwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2VuZGlmCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIihefFteYS16QS1aXzAtOV0pc2l6ZV90W15hLXpBLVpfMC05XSIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9eWVzCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfdHlwZV9zaXplX3Q9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLWVjaG8gIiRhY190IiIkYWNfY3ZfdHlwZV9zaXplX3QiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X3R5cGVfc2l6ZV90ID0gbm87IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIHNpemVfdCB1bnNpZ25lZAotRU9GCi0KLWZpCi0KLSMgVGhlIFVsdHJpeCA0LjIgbWlwcyBidWlsdGluIGFsbG9jYSBkZWNsYXJlZCBieSBhbGxvY2EuaCBvbmx5IHdvcmtzCi0jIGZvciBjb25zdGFudCBhcmd1bWVudHMuICBVc2VsZXNzIQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHdvcmtpbmcgYWxsb2NhLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI3NjE6IGNoZWNraW5nIGZvciB3b3JraW5nIGFsbG9jYS5oIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfYWxsb2NhX2gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyNzY2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxhbGxvY2EuaD4KLWludCBtYWluKCkgewotY2hhciAqcCA9IGFsbG9jYSgyICogc2l6ZW9mKGludCkpOwotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI3NzM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2hlYWRlcl9hbGxvY2FfaD15ZXMKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfaGVhZGVyX2FsbG9jYV9oPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2hlYWRlcl9hbGxvY2FfaCIgMT4mNgotaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2FsbG9jYV9oID0geWVzOyB0aGVuCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0FMTE9DQV9IIDEKLUVPRgotCi1maQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgYWxsb2NhIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyNzk0OiBjaGVja2luZyBmb3IgYWxsb2NhIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2FsbG9jYV93b3Jrcycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDI3OTkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi0jaWZkZWYgX19HTlVDX18KLSMgZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCi0jZWxzZQotIyBpZmRlZiBfTVNDX1ZFUgotIyAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBkZWZpbmUgYWxsb2NhIF9hbGxvY2EKLSMgZWxzZQotIyAgaWYgSEFWRV9BTExPQ0FfSAotIyAgIGluY2x1ZGUgPGFsbG9jYS5oPgotIyAgZWxzZQotIyAgIGlmZGVmIF9BSVgKLSAjcHJhZ21hIGFsbG9jYQotIyAgIGVsc2UKLSMgICAgaWZuZGVmIGFsbG9jYSAvKiBwcmVkZWZpbmVkIGJ5IEhQIGNjICtPbGliY2FsbHMgKi8KLWNoYXIgKmFsbG9jYSAoKTsKLSMgICAgZW5kaWYKLSMgICBlbmRpZgotIyAgZW5kaWYKLSMgZW5kaWYKLSNlbmRpZgotCi1pbnQgbWFpbigpIHsKLWNoYXIgKnAgPSAoY2hhciAqKSBhbGxvY2EoMSk7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjgyNzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgYWNfY3ZfZnVuY19hbGxvY2Ffd29ya3M9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzIiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9mdW5jX2FsbG9jYV93b3JrcyA9IHllczsgdGhlbgotICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9BTExPQ0EgMQotRU9GCi0KLWZpCi0KLWlmIHRlc3QgJGFjX2N2X2Z1bmNfYWxsb2NhX3dvcmtzID0gbm87IHRoZW4KLSAgIyBUaGUgU1ZSMyBsaWJQVyBhbmQgU1ZSNCBsaWJ1Y2IgYm90aCBjb250YWluIGluY29tcGF0aWJsZSBmdW5jdGlvbnMKLSAgIyB0aGF0IGNhdXNlIHRyb3VibGUuICBTb21lIHZlcnNpb25zIGRvIG5vdCBldmVuIGNvbnRhaW4gYWxsb2NhIG9yCi0gICMgY29udGFpbiBhIGJ1Z2d5IHZlcnNpb24uICBJZiB5b3Ugc3RpbGwgd2FudCB0byB1c2UgdGhlaXIgYWxsb2NhLAotICAjIHVzZSBhciB0byBleHRyYWN0IGFsbG9jYS5vIGZyb20gdGhlbSBpbnN0ZWFkIG9mIGNvbXBpbGluZyBhbGxvY2EuYy4KLSAgQUxMT0NBPWFsbG9jYS4ke2FjX29iamV4dH0KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIENfQUxMT0NBIDEKLUVPRgotCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI4NTk6IGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhIG5lZWRzIENyYXkgaG9va3MiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X29zX2NyYXknK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyODY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZiBkZWZpbmVkKENSQVkpICYmICEgZGVmaW5lZChDUkFZMikKLXdlYmVjcmF5Ci0jZWxzZQotd2Vub3RiZWNyYXkKLSNlbmRpZgotCi1FT0YKLWlmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKLSAgZWdyZXAgIndlYmVjcmF5IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhY19jdl9vc19jcmF5PXllcwotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFjX2N2X29zX2NyYXk9bm8KLWZpCi1ybSAtZiBjb25mdGVzdCoKLQotZmkKLQotZWNobyAiJGFjX3QiIiRhY19jdl9vc19jcmF5IiAxPiY2Ci1pZiB0ZXN0ICRhY19jdl9vc19jcmF5ID0geWVzOyB0aGVuCi1mb3IgYWNfZnVuYyBpbiBfZ2V0YjY3IEdFVEI2NyBnZXRiNjc7IGRvCi0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjg4OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjg5NCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyOTE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIENSQVlfU1RBQ0tTRUdfRU5EICRhY19mdW5jCi1FT0YKLQotICBicmVhawotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLWRvbmUKLWZpCi0KLWVjaG8gJGFjX24gImNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjI5NDQ6IGNoZWNraW5nIHN0YWNrIGRpcmVjdGlvbiBmb3IgQyBhbGxvY2EiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Nfc3RhY2tfZGlyZWN0aW9uJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MAotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyOTUyICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLWZpbmRfc3RhY2tfZGlyZWN0aW9uICgpCi17Ci0gIHN0YXRpYyBjaGFyICphZGRyID0gMDsKLSAgYXV0byBjaGFyIGR1bW15OwotICBpZiAoYWRkciA9PSAwKQotICAgIHsKLSAgICAgIGFkZHIgPSAmZHVtbXk7Ci0gICAgICByZXR1cm4gZmluZF9zdGFja19kaXJlY3Rpb24gKCk7Ci0gICAgfQotICBlbHNlCi0gICAgcmV0dXJuICgmZHVtbXkgPiBhZGRyKSA/IDEgOiAtMTsKLX0KLW1haW4gKCkKLXsKLSAgZXhpdCAoZmluZF9zdGFja19kaXJlY3Rpb24oKSA8IDApOwotfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjI5NzE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fSAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKLXRoZW4KLSAgYWNfY3ZfY19zdGFja19kaXJlY3Rpb249MQotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLWZyIGNvbmZ0ZXN0KgotICBhY19jdl9jX3N0YWNrX2RpcmVjdGlvbj0tMQotZmkKLXJtIC1mciBjb25mdGVzdCoKLWZpCi0KLWZpCi0KLWVjaG8gIiRhY190IiIkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24iIDE+JjYKLWNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lIFNUQUNLX0RJUkVDVElPTiAkYWNfY3ZfY19zdGFja19kaXJlY3Rpb24KLUVPRgotCi1maQotCi1mb3IgYWNfaGRyIGluIHVuaXN0ZC5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mjk5NjogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMwMDEgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMwMDY6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1mb3IgYWNfZnVuYyBpbiBnZXRwYWdlc2l6ZQotZG8KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzAzNTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jXyRhY19mdW5jJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzA0MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCi0gICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciAkYWNfZnVuYygpOyBiZWxvdy4gICovCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyICRhY19mdW5jKCk7Ci0KLWludCBtYWluKCkgewotCi0vKiBUaGUgR05VIEMgbGlicmFyeSBkZWZpbmVzIHRoaXMgZm9yIGZ1bmN0aW9ucyB3aGljaCBpdCBpbXBsZW1lbnRzCi0gICAgdG8gYWx3YXlzIGZhaWwgd2l0aCBFTk9TWVMuICBTb21lIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgbmFtZWQKLSAgICBzb21ldGhpbmcgc3RhcnRpbmcgd2l0aCBfXyBhbmQgdGhlIG5vcm1hbCBuYW1lIGlzIGFuIGFsaWFzLiAgKi8KLSNpZiBkZWZpbmVkIChfX3N0dWJfJGFjX2Z1bmMpIHx8IGRlZmluZWQgKF9fc3R1Yl9fXyRhY19mdW5jKQotY2hva2UgbWUKLSNlbHNlCi0kYWNfZnVuYygpOwotI2VuZGlmCi0KLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMDYzOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPXllcyIKLWVsc2UKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi0KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2Z1bmNfJyRhY19mdW5jYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gICAgYWNfdHJfZnVuYz1IQVZFX2BlY2hvICRhY19mdW5jIHwgdHIgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfZnVuYyAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi1lY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMDg4OiBjaGVja2luZyBmb3Igd29ya2luZyBtbWFwIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX21tYXBfZml4ZWRfbWFwcGVkJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgYWNfY3ZfZnVuY19tbWFwX2ZpeGVkX21hcHBlZD1ubwotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMDk2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLQotLyogVGhhbmtzIHRvIE1pa2UgSGFlcnRlbCBhbmQgSmltIEF2ZXJhIGZvciB0aGlzIHRlc3QuCi0gICBIZXJlIGlzIGEgbWF0cml4IG9mIG1tYXAgcG9zc2liaWxpdGllczoKLQltbWFwIHByaXZhdGUgbm90IGZpeGVkCi0JbW1hcCBwcml2YXRlIGZpeGVkIGF0IHNvbWV3aGVyZSBjdXJyZW50bHkgdW5tYXBwZWQKLQltbWFwIHByaXZhdGUgZml4ZWQgYXQgc29tZXdoZXJlIGFscmVhZHkgbWFwcGVkCi0JbW1hcCBzaGFyZWQgbm90IGZpeGVkCi0JbW1hcCBzaGFyZWQgZml4ZWQgYXQgc29tZXdoZXJlIGN1cnJlbnRseSB1bm1hcHBlZAotCW1tYXAgc2hhcmVkIGZpeGVkIGF0IHNvbWV3aGVyZSBhbHJlYWR5IG1hcHBlZAotICAgRm9yIHByaXZhdGUgbWFwcGluZ3MsIHdlIHNob3VsZCB2ZXJpZnkgdGhhdCBjaGFuZ2VzIGNhbm5vdCBiZSByZWFkKCkKLSAgIGJhY2sgZnJvbSB0aGUgZmlsZSwgbm9yIG1tYXAncyBiYWNrIGZyb20gdGhlIGZpbGUgYXQgYSBkaWZmZXJlbnQKLSAgIGFkZHJlc3MuICAoVGhlcmUgaGF2ZSBiZWVuIHN5c3RlbXMgd2hlcmUgcHJpdmF0ZSB3YXMgbm90IGNvcnJlY3RseQotICAgaW1wbGVtZW50ZWQgbGlrZSB0aGUgaW5mYW1vdXMgaTM4NiBzdnI0LjAsIGFuZCBzeXN0ZW1zIHdoZXJlIHRoZQotICAgVk0gcGFnZSBjYWNoZSB3YXMgbm90IGNvaGVyZW50IHdpdGggdGhlIGZpbGVzeXN0ZW0gYnVmZmVyIGNhY2hlCi0gICBsaWtlIGVhcmx5IHZlcnNpb25zIG9mIEZyZWVCU0QgYW5kIHBvc3NpYmx5IGNvbnRlbXBvcmFyeSBOZXRCU0QuKQotICAgRm9yIHNoYXJlZCBtYXBwaW5ncywgd2Ugc2hvdWxkIGNvbnZlcnNlbHkgdmVyaWZ5IHRoYXQgY2hhbmdlcyBnZXQKLSAgIHByb3BvZ2F0ZWQgYmFjayB0byBhbGwgdGhlIHBsYWNlcyB0aGV5J3JlIHN1cHBvc2VkIHRvIGJlLgotCi0gICBHcmVwIHdhbnRzIHByaXZhdGUgZml4ZWQgYWxyZWFkeSBtYXBwZWQuCi0gICBUaGUgbWFpbiB0aGluZ3MgZ3JlcCBuZWVkcyB0byBrbm93IGFib3V0IG1tYXAgYXJlOgotICAgKiBkb2VzIGl0IGV4aXN0IGFuZCBpcyBpdCBzYWZlIHRvIHdyaXRlIGludG8gdGhlIG1tYXAnZCBhcmVhCi0gICAqIGhvdyB0byB1c2UgaXQgKEJTRCB2YXJpYW50cykgICovCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotCi0vKiBUaGlzIG1lc3Mgd2FzIGNvcGllZCBmcm9tIHRoZSBHTlUgZ2V0cGFnZXNpemUuaC4gICovCi0jaWZuZGVmIEhBVkVfR0VUUEFHRVNJWkUKLSMgaWZkZWYgSEFWRV9VTklTVERfSAotIyAgaW5jbHVkZSA8dW5pc3RkLmg+Ci0jIGVuZGlmCi0KLS8qIEFzc3VtZSB0aGF0IGFsbCBzeXN0ZW1zIHRoYXQgY2FuIHJ1biBjb25maWd1cmUgaGF2ZSBzeXMvcGFyYW0uaC4gICovCi0jIGlmbmRlZiBIQVZFX1NZU19QQVJBTV9ICi0jICBkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCi0jIGVuZGlmCi0KLSMgaWZkZWYgX1NDX1BBR0VTSVpFCi0jICBkZWZpbmUgZ2V0cGFnZXNpemUoKSBzeXNjb25mKF9TQ19QQUdFU0laRSkKLSMgZWxzZSAvKiBubyBfU0NfUEFHRVNJWkUgKi8KLSMgIGlmZGVmIEhBVkVfU1lTX1BBUkFNX0gKLSMgICBpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSMgICBpZmRlZiBFWEVDX1BBR0VTSVpFCi0jICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIEVYRUNfUEFHRVNJWkUKLSMgICBlbHNlIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgICAgaWZkZWYgTkJQRwotIyAgICAgZGVmaW5lIGdldHBhZ2VzaXplKCkgTkJQRyAqIENMU0laRQotIyAgICAgaWZuZGVmIENMU0laRQotIyAgICAgIGRlZmluZSBDTFNJWkUgMQotIyAgICAgZW5kaWYgLyogbm8gQ0xTSVpFICovCi0jICAgIGVsc2UgLyogbm8gTkJQRyAqLwotIyAgICAgaWZkZWYgTkJQQwotIyAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIE5CUEMKLSMgICAgIGVsc2UgLyogbm8gTkJQQyAqLwotIyAgICAgIGlmZGVmIFBBR0VTSVpFCi0jICAgICAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIFBBR0VTSVpFCi0jICAgICAgZW5kaWYgLyogUEFHRVNJWkUgKi8KLSMgICAgIGVuZGlmIC8qIG5vIE5CUEMgKi8KLSMgICAgZW5kaWYgLyogbm8gTkJQRyAqLwotIyAgIGVuZGlmIC8qIG5vIEVYRUNfUEFHRVNJWkUgKi8KLSMgIGVsc2UgLyogbm8gSEFWRV9TWVNfUEFSQU1fSCAqLwotIyAgIGRlZmluZSBnZXRwYWdlc2l6ZSgpIDgxOTIJLyogcHVudCB0b3RhbGx5ICovCi0jICBlbmRpZiAvKiBubyBIQVZFX1NZU19QQVJBTV9IICovCi0jIGVuZGlmIC8qIG5vIF9TQ19QQUdFU0laRSAqLwotCi0jZW5kaWYgLyogbm8gSEFWRV9HRVRQQUdFU0laRSAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgeyB2b2lkICptYWxsb2ModW5zaWduZWQpOyB9Ci0jZWxzZQotY2hhciAqbWFsbG9jKCk7Ci0jZW5kaWYKLQotaW50Ci1tYWluKCkKLXsKLQljaGFyICpkYXRhLCAqZGF0YTIsICpkYXRhMzsKLQlpbnQgaSwgcGFnZXNpemU7Ci0JaW50IGZkOwotCi0JcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOwotCi0JLyoKLQkgKiBGaXJzdCwgbWFrZSBhIGZpbGUgd2l0aCBzb21lIGtub3duIGdhcmJhZ2UgaW4gaXQuCi0JICovCi0JZGF0YSA9IG1hbGxvYyhwYWdlc2l6ZSk7Ci0JaWYgKCFkYXRhKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQkqKGRhdGEgKyBpKSA9IHJhbmQoKTsKLQl1bWFzaygwKTsKLQlmZCA9IGNyZWF0KCJjb25mdGVzdG1tYXAiLCAwNjAwKTsKLQlpZiAoZmQgPCAwKQotCQlleGl0KDEpOwotCWlmICh3cml0ZShmZCwgZGF0YSwgcGFnZXNpemUpICE9IHBhZ2VzaXplKQotCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQotCS8qCi0JICogTmV4dCwgdHJ5IHRvIG1tYXAgdGhlIGZpbGUgYXQgYSBmaXhlZCBhZGRyZXNzIHdoaWNoCi0JICogYWxyZWFkeSBoYXMgc29tZXRoaW5nIGVsc2UgYWxsb2NhdGVkIGF0IGl0LiAgSWYgd2UgY2FuLAotCSAqIGFsc28gbWFrZSBzdXJlIHRoYXQgd2Ugc2VlIHRoZSBzYW1lIGdhcmJhZ2UuCi0JICovCi0JZmQgPSBvcGVuKCJjb25mdGVzdG1tYXAiLCBPX1JEV1IpOwotCWlmIChmZCA8IDApCi0JCWV4aXQoMSk7Ci0JZGF0YTIgPSBtYWxsb2MoMiAqIHBhZ2VzaXplKTsKLQlpZiAoIWRhdGEyKQotCQlleGl0KDEpOwotCWRhdGEyICs9IChwYWdlc2l6ZSAtICgoaW50KSBkYXRhMiAmIChwYWdlc2l6ZSAtIDEpKSkgJiAocGFnZXNpemUgLSAxKTsKLQlpZiAoZGF0YTIgIT0gbW1hcChkYXRhMiwgcGFnZXNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JICAgIE1BUF9QUklWQVRFIHwgTUFQX0ZJWEVELCBmZCwgMEwpKQotCQlleGl0KDEpOwotCWZvciAoaSA9IDA7IGkgPCBwYWdlc2l6ZTsgKytpKQotCQlpZiAoKihkYXRhICsgaSkgIT0gKihkYXRhMiArIGkpKQotCQkJZXhpdCgxKTsKLQotCS8qCi0JICogRmluYWxseSwgbWFrZSBzdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgbWFwcGVkIGFyZWEKLQkgKiBkbyBub3QgcGVyY29sYXRlIGJhY2sgdG8gdGhlIGZpbGUgYXMgc2VlbiBieSByZWFkKCkuCi0JICogKFRoaXMgaXMgYSBidWcgb24gc29tZSB2YXJpYW50cyBvZiBpMzg2IHN2cjQuMC4pCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCSooZGF0YTIgKyBpKSA9ICooZGF0YTIgKyBpKSArIDE7Ci0JZGF0YTMgPSBtYWxsb2MocGFnZXNpemUpOwotCWlmICghZGF0YTMpCi0JCWV4aXQoMSk7Ci0JaWYgKHJlYWQoZmQsIGRhdGEzLCBwYWdlc2l6ZSkgIT0gcGFnZXNpemUpCi0JCWV4aXQoMSk7Ci0JZm9yIChpID0gMDsgaSA8IHBhZ2VzaXplOyArK2kpCi0JCWlmICgqKGRhdGEgKyBpKSAhPSAqKGRhdGEzICsgaSkpCi0JCQlleGl0KDEpOwotCWNsb3NlKGZkKTsKLQl1bmxpbmsoImNvbmZ0ZXN0bW1hcCIpOwotCWV4aXQoMCk7Ci19Ci0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozMjM2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH0gJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCi10aGVuCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtZnIgY29uZnRlc3QqCi0gIGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQ9bm8KLWZpCi1ybSAtZnIgY29uZnRlc3QqCi1maQotCi1maQotCi1lY2hvICIkYWNfdCIiJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQiIDE+JjYKLWlmIHRlc3QgJGFjX2N2X2Z1bmNfbW1hcF9maXhlZF9tYXBwZWQgPSB5ZXM7IHRoZW4KLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCi0jZGVmaW5lIEhBVkVfTU1BUCAxCi1FT0YKLQotZmkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICBmb3IgYWNfaGRyIGluIGFyZ3ouaCBsaW1pdHMuaCBsb2NhbGUuaCBubF90eXBlcy5oIG1hbGxvYy5oIHN0cmluZy5oIFwKLXVuaXN0ZC5oIHZhbHVlcy5oIHN5cy9wYXJhbS5oCi1kbwotYWNfc2FmZT1gZWNobyAiJGFjX2hkciIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzI2NDogY2hlY2tpbmcgZm9yICRhY19oZHIiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMyNjkgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPCRhY19oZHI+Ci1FT0YKLWFjX3RyeT0iJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0ID4vZGV2L251bGwgMj5jb25mdGVzdC5vdXQiCi17IChldmFsIGVjaG8gY29uZmlndXJlOjMyNzQ6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Ci1hY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgIl5jb25mdGVzdC4ke2FjX2V4dH1cJCJgCi1pZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT15ZXMiCi1lbHNlCi0gIGVjaG8gIiRhY19lcnIiID4mNQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyXyckYWNfc2FmZWBcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2hkcj1IQVZFX2BlY2hvICRhY19oZHIgfCBzZWQgJ3klYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXouLy0lQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpfX18lJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2hkciAxCi1FT0YKLSAKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotCi0gICBmb3IgYWNfZnVuYyBpbiBnZXRjd2QgbXVubWFwIHB1dGVudiBzZXRlbnYgc2V0bG9jYWxlIHN0cmNociBzdHJjYXNlY21wIFwKLV9fYXJnel9jb3VudCBfX2FyZ3pfc3RyaW5naWZ5IF9fYXJnel9uZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozMzA0OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzMzA5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjMzMzI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQotICAgaWYgdGVzdCAiJHthY19jdl9mdW5jX3N0cGNweStzZXR9IiAhPSAic2V0IjsgdGhlbgotICAgICBmb3IgYWNfZnVuYyBpbiBzdHBjcHkKLWRvCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2Z1bmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjMzNjE6IGNoZWNraW5nIGZvciAkYWNfZnVuYyIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY18kYWNfZnVuYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDMzNjYgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAotICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwotI2luY2x1ZGUgPGFzc2VydC5oPgotLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KLS8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKLSAgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLwotY2hhciAkYWNfZnVuYygpOwotCi1pbnQgbWFpbigpIHsKLQotLyogVGhlIEdOVSBDIGxpYnJhcnkgZGVmaW5lcyB0aGlzIGZvciBmdW5jdGlvbnMgd2hpY2ggaXQgaW1wbGVtZW50cwotICAgIHRvIGFsd2F5cyBmYWlsIHdpdGggRU5PU1lTLiAgU29tZSBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IG5hbWVkCi0gICAgc29tZXRoaW5nIHN0YXJ0aW5nIHdpdGggX18gYW5kIHRoZSBub3JtYWwgbmFtZSBpcyBhbiBhbGlhcy4gICovCi0jaWYgZGVmaW5lZCAoX19zdHViXyRhY19mdW5jKSB8fCBkZWZpbmVkIChfX3N0dWJfX18kYWNfZnVuYykKLWNob2tlIG1lCi0jZWxzZQotJGFjX2Z1bmMoKTsKLSNlbmRpZgotCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzM4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9mdW5jXyckYWNfZnVuY2BcIiA9IHllcyI7IHRoZW4KLSAgZWNobyAiJGFjX3QiInllcyIgMT4mNgotICAgIGFjX3RyX2Z1bmM9SEFWRV9gZWNobyAkYWNfZnVuYyB8IHRyICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJ2AKLSAgY2F0ID4+IGNvbmZkZWZzLmggPDxFT0YKLSNkZWZpbmUgJGFjX3RyX2Z1bmMgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotICAgZmkKLSAgIGlmIHRlc3QgIiR7YWNfY3ZfZnVuY19zdHBjcHl9IiA9ICJ5ZXMiOyB0aGVuCi0gICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX1NUUENQWSAxCi1FT0YKLQotICAgZmkKLQotICAgaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX2xvY2FsZV9oID0geWVzOyB0aGVuCi0gICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIExDX01FU1NBR0VTIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDIzOiBjaGVja2luZyBmb3IgTENfTUVTU0FHRVMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FtX2N2X3ZhbF9MQ19NRVNTQUdFUycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM0MjggImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxvY2FsZS5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gTENfTUVTU0FHRVMKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTozNDM1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Qke2FjX2V4ZWV4dH07IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBhbV9jdl92YWxfTENfTUVTU0FHRVM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGFtX2N2X3ZhbF9MQ19NRVNTQUdFUz1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRhbV9jdl92YWxfTENfTUVTU0FHRVMiIDE+JjYKLSAgICBpZiB0ZXN0ICRhbV9jdl92YWxfTENfTUVTU0FHRVMgPSB5ZXM7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBIQVZFX0xDX01FU1NBR0VTIDEKLUVPRgotCi0gICAgZmkKLSAgZmkKLSAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgTkxTIGlzIHJlcXVlc3RlZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MzQ1NjogY2hlY2tpbmcgd2hldGhlciBOTFMgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLW5scyBvciAtLWRpc2FibGUtbmxzIHdhcyBnaXZlbi4KLWlmIHRlc3QgIiR7ZW5hYmxlX25scytzZXR9IiA9IHNldDsgdGhlbgotICBlbmFibGV2YWw9IiRlbmFibGVfbmxzIgotICBVU0VfTkxTPSRlbmFibGV2YWwKLWVsc2UKLSAgVVNFX05MUz15ZXMKLWZpCi0KLSAgICBlY2hvICIkYWNfdCIiJFVTRV9OTFMiIDE+JjYKLSAgICAKLQotICAgIFVTRV9JTkNMVURFRF9MSUJJTlRMPW5vCi0KLSAgICAgICAgaWYgdGVzdCAiJFVTRV9OTFMiID0gInllcyI7IHRoZW4KLSAgICAgIGNhdCA+PiBjb25mZGVmcy5oIDw8XEVPRgotI2RlZmluZSBFTkFCTEVfTkxTIDEKLUVPRgotCi0gICAgICBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNDc2OiBjaGVja2luZyB3aGV0aGVyIGluY2x1ZGVkIGdldHRleHQgaXMgcmVxdWVzdGVkIiA+JjUKLSAgICAgICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtaW5jbHVkZWQtZ2V0dGV4dCBvciAtLXdpdGhvdXQtaW5jbHVkZWQtZ2V0dGV4dCB3YXMgZ2l2ZW4uCi1pZiB0ZXN0ICIke3dpdGhfaW5jbHVkZWRfZ2V0dGV4dCtzZXR9IiA9IHNldDsgdGhlbgotICB3aXRodmFsPSIkd2l0aF9pbmNsdWRlZF9nZXR0ZXh0IgotICBubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0PSR3aXRodmFsCi1lbHNlCi0gIG5sc19jdl9mb3JjZV91c2VfZ251X2dldHRleHQ9bm8KLWZpCi0KLSAgICAgIGVjaG8gIiRhY190IiIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIgMT4mNgotCi0gICAgICBubHNfY3ZfdXNlX2dudV9nZXR0ZXh0PSIkbmxzX2N2X2ZvcmNlX3VzZV9nbnVfZ2V0dGV4dCIKLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfZm9yY2VfdXNlX2dudV9nZXR0ZXh0IiAhPSAieWVzIjsgdGhlbgotICAgICAgICAgICAgICAgICAgICAgICAgCQlubHNfY3ZfaGVhZGVyX2ludGw9Ci0JbmxzX2N2X2hlYWRlcl9saWJndD0KLQlDQVRPQkpFWFQ9Tk9ORQotCi0JYWNfc2FmZT1gZWNobyAibGliaW50bC5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaWJpbnRsLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM0OTU6IGNoZWNraW5nIGZvciBsaWJpbnRsLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM1MDAgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpYmludGwuaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUwNTogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1MjI6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzUyNyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0jaW5jbHVkZSA8bGliaW50bC5oPgotaW50IG1haW4oKSB7Ci1yZXR1cm4gKGludCkgZ2V0dGV4dCAoIiIpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MzUzNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0JHthY19leGVleHR9OyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmM9eWVzCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjPW5vCi1maQotcm0gLWYgY29uZnRlc3QqCi1maQotCi1lY2hvICIkYWNfdCIiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiAxPiY2Ci0KLQkgICBpZiB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmMiICE9ICJ5ZXMiOyB0aGVuCi0JICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNTUwOiBjaGVja2luZyBmb3IgYmluZHRleHRkb21haW4gaW4gLWxpbnRsIiA+JjUKLWFjX2xpYl92YXI9YGVjaG8gaW50bCdfJ2JpbmR0ZXh0ZG9tYWluIHwgc2VkICd5JS4vKy0lX19wXyUnYAotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGFjX3NhdmVfTElCUz0iJExJQlMiCi1MSUJTPSItbGludGwgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU1OCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0vKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwotLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgotICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCi1jaGFyIGJpbmR0ZXh0ZG9tYWluKCk7Ci0KLWludCBtYWluKCkgewotYmluZHRleHRkb21haW4oKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1Njk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLUxJQlM9IiRhY19zYXZlX0xJQlMiCi0KLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9saWJfJyRhY19saWJfdmFyYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM1ODU6IGNoZWNraW5nIGZvciBnZXR0ZXh0IGluIGxpYmludGwiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2d0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMzU5MCAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgewotcmV0dXJuIChpbnQpIGdldHRleHQgKCIiKQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM1OTc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJpbnRsPXllcwotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBndF9jdl9mdW5jX2dldHRleHRfbGliaW50bD1ubwotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotZWNobyAiJGFjX3QiIiRndF9jdl9mdW5jX2dldHRleHRfbGliaW50bCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQkgICBmaQotCi0JICAgaWYgdGVzdCAiJGd0X2N2X2Z1bmNfZ2V0dGV4dF9saWJjIiA9ICJ5ZXMiIFwKLQkgICAgICB8fCB0ZXN0ICIkZ3RfY3ZfZnVuY19nZXR0ZXh0X2xpYmludGwiID0gInllcyI7IHRoZW4KLQkgICAgICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKLSNkZWZpbmUgSEFWRV9HRVRURVhUIDEKLUVPRgotCi0JICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjI1OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im5vIgotICA7OwotZXNhYwotZmkKLU1TR0ZNVD0iJGFjX2N2X3BhdGhfTVNHRk1UIgotaWYgdGVzdCAtbiAiJE1TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCSAgICAgIGlmIHRlc3QgIiRNU0dGTVQiICE9ICJubyI7IHRoZW4KLQkJZm9yIGFjX2Z1bmMgaW4gZGNnZXR0ZXh0Ci1kbwotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19mdW5jIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNjU5OiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAzNjY0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLS8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKLSAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLS8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCi0vKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCi0gICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KLWNoYXIgJGFjX2Z1bmMoKTsKLQotaW50IG1haW4oKSB7Ci0KLS8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKLSAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAotICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLwotI2lmIGRlZmluZWQgKF9fc3R1Yl8kYWNfZnVuYykgfHwgZGVmaW5lZCAoX19zdHViX19fJGFjX2Z1bmMpCi1jaG9rZSBtZQotI2Vsc2UKLSRhY19mdW5jKCk7Ci0jZW5kaWYKLQotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM2ODc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2Z1bmNfJGFjX2Z1bmM9eWVzIgotZWxzZQotICBlY2hvICJjb25maWd1cmU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQotICBjYXQgY29uZnRlc3QuJGFjX2V4dCA+JjUKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9mdW5jXyRhY19mdW5jPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfZnVuY18nJGFjX2Z1bmNgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9mdW5jPUhBVkVfYGVjaG8gJGFjX2Z1bmMgfCB0ciAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWidgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9mdW5jIDEKLUVPRgotIAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi1kb25lCi0KLQkJIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnbXNnZm10Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSBnbXNnZm10OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM3MTQ6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9HTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJEdNU0dGTVQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX0dNU0dGTVQ9IiRHTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgPzovKikJCQkgCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBkb3MgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iOiIKLSAgYWNfZHVtbXk9IiRQQVRIIgotICBmb3IgYWNfZGlyIGluICRhY19kdW1teTsgZG8gCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGFjX2N2X3BhdGhfR01TR0ZNVD0iJGFjX2Rpci8kYWNfd29yZCIKLSAgICAgIGJyZWFrCi0gICAgZmkKLSAgZG9uZQotICBJRlM9IiRhY19zYXZlX2lmcyIKLSAgdGVzdCAteiAiJGFjX2N2X3BhdGhfR01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkTVNHRk1UIgotICA7OwotZXNhYwotZmkKLUdNU0dGTVQ9IiRhY19jdl9wYXRoX0dNU0dGTVQiCi1pZiB0ZXN0IC1uICIkR01TR0ZNVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRHTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotCQkjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInhnZXR0ZXh0Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KLXNldCBkdW1teSB4Z2V0dGV4dDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozNzUwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfWEdFVFRFWFQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkWEdFVFRFWFQiIGluCi0gIC8qKQotICBhY19jdl9wYXRoX1hHRVRURVhUPSIkWEdFVFRFWFQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSIke0lGU306IgotICBmb3IgYWNfZGlyIGluICRQQVRIOyBkbwotICAgIHRlc3QgLXogIiRhY19kaXIiICYmIGFjX2Rpcj0uCi0gICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY193b3JkOyB0aGVuCi0gICAgICBpZiB0ZXN0IC16ICJgJGFjX2Rpci8kYWNfd29yZCAtaCAyPiYxIHwgZ3JlcCAnKEhFTFApJ2AiOyB0aGVuCi0JYWNfY3ZfcGF0aF9YR0VUVEVYVD0iJGFjX2Rpci8kYWNfd29yZCIKLQlicmVhawotICAgICAgZmkKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIgJiYgYWNfY3ZfcGF0aF9YR0VUVEVYVD0iOiIKLSAgOzsKLWVzYWMKLWZpCi1YR0VUVEVYVD0iJGFjX2N2X3BhdGhfWEdFVFRFWFQiCi1pZiB0ZXN0IC1uICIkWEdFVFRFWFQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkWEdFVFRFWFQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0JCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDM3ODIgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsKLWV4dGVybiBpbnQgX25sX21zZ19jYXRfY250cjsKLQkJCSAgICAgICByZXR1cm4gX25sX21zZ19jYXRfY250cgotOyByZXR1cm4gMDsgfQotRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjM3OTA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCR7YWNfZXhlZXh0fTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0uZ21vCi0JCSAgIERBVEFESVJOQU1FPXNoYXJlCi1lbHNlCi0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIENBVE9CSkVYVD0ubW8KLQkJICAgREFUQURJUk5BTUU9bGliCi1maQotcm0gLWYgY29uZnRlc3QqCi0JCUlOU1RPQkpFWFQ9Lm1vCi0JICAgICAgZmkKLQkgICAgZmkKLQkKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0KLQkgICAgICAgIAotICAgICAgICBpZiB0ZXN0ICIkQ0FUT0JKRVhUIiA9ICJOT05FIjsgdGhlbgotCSAgCSAgCSAgbmxzX2N2X3VzZV9nbnVfZ2V0dGV4dD15ZXMKLSAgICAgICAgZmkKLSAgICAgIGZpCi0KLSAgICAgIGlmIHRlc3QgIiRubHNfY3ZfdXNlX2dudV9nZXR0ZXh0IiA9ICJ5ZXMiOyB0aGVuCi0gICAgICAgICAgICAgICAgSU5UTE9CSlM9IlwkKEdFVFRPQkpTKSIKLSAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IG1zZ2ZtdDsgYWNfd29yZD0kMgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTozODIyOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3BhdGhfTVNHRk1UJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2FzZSAiJE1TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfTVNHRk1UPSIkTVNHRk1UIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdCB3aXRoIGEgcGF0aC4KLSAgOzsKLSAgKikKLSAgSUZTPSIke0lGUz0gCX0iOyBhY19zYXZlX2lmcz0iJElGUyI7IElGUz0iJHtJRlN9OiIKLSAgZm9yIGFjX2RpciBpbiAkUEFUSDsgZG8KLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgaWYgdGVzdCAteiAiYCRhY19kaXIvJGFjX3dvcmQgLWggMj4mMSB8IGdyZXAgJ2R2ICdgIjsgdGhlbgotCWFjX2N2X3BhdGhfTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX01TR0ZNVCIgJiYgYWNfY3ZfcGF0aF9NU0dGTVQ9Im1zZ2ZtdCIKLSAgOzsKLWVzYWMKLWZpCi1NU0dGTVQ9IiRhY19jdl9wYXRoX01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRNU0dGTVQiOyB0aGVuCi0gIGVjaG8gIiRhY190IiIkTVNHRk1UIiAxPiY2Ci1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImdtc2dmbXQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IGdtc2dmbXQ7IGFjX3dvcmQ9JDIKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6Mzg1NjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX0dNU0dGTVQnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXNlICIkR01TR0ZNVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfR01TR0ZNVD0iJEdNU0dGTVQiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0IHdpdGggYSBwYXRoLgotICA7OwotICA/Oi8qKQkJCSAKLSAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkR01TR0ZNVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIGRvcyBwYXRoLgotICA7OwotICAqKQotICBJRlM9IiR7SUZTPSAJfSI7IGFjX3NhdmVfaWZzPSIkSUZTIjsgSUZTPSI6IgotICBhY19kdW1teT0iJFBBVEgiCi0gIGZvciBhY19kaXIgaW4gJGFjX2R1bW15OyBkbyAKLSAgICB0ZXN0IC16ICIkYWNfZGlyIiAmJiBhY19kaXI9LgotICAgIGlmIHRlc3QgLWYgJGFjX2Rpci8kYWNfd29yZDsgdGhlbgotICAgICAgYWNfY3ZfcGF0aF9HTVNHRk1UPSIkYWNfZGlyLyRhY193b3JkIgotICAgICAgYnJlYWsKLSAgICBmaQotICBkb25lCi0gIElGUz0iJGFjX3NhdmVfaWZzIgotICB0ZXN0IC16ICIkYWNfY3ZfcGF0aF9HTVNHRk1UIiAmJiBhY19jdl9wYXRoX0dNU0dGTVQ9IiRNU0dGTVQiCi0gIDs7Ci1lc2FjCi1maQotR01TR0ZNVD0iJGFjX2N2X3BhdGhfR01TR0ZNVCIKLWlmIHRlc3QgLW4gIiRHTVNHRk1UIjsgdGhlbgotICBlY2hvICIkYWNfdCIiJEdNU0dGTVQiIDE+JjYKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi0gICAgICAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAieGdldHRleHQiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgotc2V0IGR1bW15IHhnZXR0ZXh0OyBhY193b3JkPSQyCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM4OTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9YR0VUVEVYVCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhc2UgIiRYR0VUVEVYVCIgaW4KLSAgLyopCi0gIGFjX2N2X3BhdGhfWEdFVFRFWFQ9IiRYR0VUVEVYVCIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3Qgd2l0aCBhIHBhdGguCi0gIDs7Ci0gICopCi0gIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9pZnM9IiRJRlMiOyBJRlM9IiR7SUZTfToiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgdGVzdCAteiAiJGFjX2RpciIgJiYgYWNfZGlyPS4KLSAgICBpZiB0ZXN0IC1mICRhY19kaXIvJGFjX3dvcmQ7IHRoZW4KLSAgICAgIGlmIHRlc3QgLXogImAkYWNfZGlyLyRhY193b3JkIC1oIDI+JjEgfCBncmVwICcoSEVMUCknYCI7IHRoZW4KLQlhY19jdl9wYXRoX1hHRVRURVhUPSIkYWNfZGlyLyRhY193b3JkIgotCWJyZWFrCi0gICAgICBmaQotICAgIGZpCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9pZnMiCi0gIHRlc3QgLXogIiRhY19jdl9wYXRoX1hHRVRURVhUIiAmJiBhY19jdl9wYXRoX1hHRVRURVhUPSI6IgotICA7OwotZXNhYwotZmkKLVhHRVRURVhUPSIkYWNfY3ZfcGF0aF9YR0VUVEVYVCIKLWlmIHRlc3QgLW4gIiRYR0VUVEVYVCI7IHRoZW4KLSAgZWNobyAiJGFjX3QiIiRYR0VUVEVYVCIgMT4mNgotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLSAgICAgICAgCi0JVVNFX0lOQ0xVREVEX0xJQklOVEw9eWVzCi0gICAgICAgIENBVE9CSkVYVD0uZ21vCi0gICAgICAgIElOU1RPQkpFWFQ9Lm1vCi0gICAgICAgIERBVEFESVJOQU1FPXNoYXJlCi0JSU5UTERFUFM9JyQodG9wX2J1aWxkZGlyKS8uLi9pbnRsL2xpYmludGwuYScKLQlJTlRMTElCUz0kSU5UTERFUFMKLQlMSUJTPWBlY2hvICRMSUJTIHwgc2VkIC1lICdzLy1saW50bC8vJ2AKLSAgICAgICAgbmxzX2N2X2hlYWRlcl9pbnRsPWxpYmludGwuaAotICAgICAgICBubHNfY3ZfaGVhZGVyX2xpYmd0PWxpYmdldHRleHQuaAotICAgICAgZmkKLQotICAgICAgICAgICAgaWYgdGVzdCAiJFhHRVRURVhUIiAhPSAiOiI7IHRoZW4KLQkJCWlmICRYR0VUVEVYVCAtLW9taXQtaGVhZGVyIC9kZXYvbnVsbCAyPiAvZGV2L251bGw7IHRoZW4KLQkgIDogOwotCWVsc2UKLQkgIGVjaG8gIiRhY190IiJmb3VuZCB4Z2V0dGV4dCBwcm9ncmFtcyBpcyBub3QgR05VIHhnZXR0ZXh0OyBpZ25vcmUgaXQiIDE+JjYKLQkgIFhHRVRURVhUPSI6IgotCWZpCi0gICAgICBmaQotCi0gICAgICAjIFdlIG5lZWQgdG8gcHJvY2VzcyB0aGUgcG8vIGRpcmVjdG9yeS4KLSAgICAgIFBPU1VCPXBvCi0gICAgZWxzZQotICAgICAgREFUQURJUk5BTUU9c2hhcmUKLSAgICAgIG5sc19jdl9oZWFkZXJfaW50bD1saWJpbnRsLmgKLSAgICAgIG5sc19jdl9oZWFkZXJfbGliZ3Q9bGliZ2V0dGV4dC5oCi0gICAgZmkKLQotICAgICMgSWYgdGhpcyBpcyB1c2VkIGluIEdOVSBnZXR0ZXh0IHdlIGhhdmUgdG8gc2V0IFVTRV9OTFMgdG8gYHllcycKLSAgICAjIGJlY2F1c2Ugc29tZSBvZiB0aGUgc291cmNlcyBhcmUgb25seSBidWlsdCBmb3IgdGhpcyBnb2FsLgotICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9IGdldHRleHQ7IHRoZW4KLSAgICAgIFVTRV9OTFM9eWVzCi0gICAgICBVU0VfSU5DTFVERURfTElCSU5UTD15ZXMKLSAgICBmaQotCi0gICAgICAgICAgICAgICAgZm9yIGxhbmcgaW4gJEFMTF9MSU5HVUFTOyBkbwotICAgICAgR01PRklMRVM9IiRHTU9GSUxFUyAkbGFuZy5nbW8iCi0gICAgICBQT0ZJTEVTPSIkUE9GSUxFUyAkbGFuZy5wbyIKLSAgICBkb25lCi0KLSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gICAgCi0gIAotCi0gICBpZiB0ZXN0ICJ4JENBVE9CSkVYVCIgIT0gIngiOyB0aGVuCi0gICAgIGlmIHRlc3QgIngkQUxMX0xJTkdVQVMiID0gIngiOyB0aGVuCi0gICAgICAgTElOR1VBUz0KLSAgICAgZWxzZQotICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjM5ODI6IGNoZWNraW5nIGZvciBjYXRhbG9ncyB0byBiZSBpbnN0YWxsZWQiID4mNQotICAgICAgIE5FV19MSU5HVUFTPQotICAgICAgIGZvciBsYW5nIGluICR7TElOR1VBUz0kQUxMX0xJTkdVQVN9OyBkbwotICAgICAgICAgY2FzZSAiJEFMTF9MSU5HVUFTIiBpbgotICAgICAgICAgICokbGFuZyopIE5FV19MSU5HVUFTPSIkTkVXX0xJTkdVQVMgJGxhbmciIDs7Ci0gICAgICAgICBlc2FjCi0gICAgICAgZG9uZQotICAgICAgIExJTkdVQVM9JE5FV19MSU5HVUFTCi0gICAgICAgZWNobyAiJGFjX3QiIiRMSU5HVUFTIiAxPiY2Ci0gICAgIGZpCi0KLSAgICAgICAgICBpZiB0ZXN0IC1uICIkTElOR1VBUyI7IHRoZW4KLSAgICAgICBmb3IgbGFuZyBpbiAkTElOR1VBUzsgZG8gQ0FUQUxPR1M9IiRDQVRBTE9HUyAkbGFuZyRDQVRPQkpFWFQiOyBkb25lCi0gICAgIGZpCi0gICBmaQotCi0gICAgICAgICAgICBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfbG9jYWxlX2ggPSB5ZXM7IHRoZW4KLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iI2luY2x1ZGUgPGxvY2FsZS5oPiIKLSAgIGVsc2UKLSAgICAgSU5DTFVERV9MT0NBTEVfSD0iXAotLyogVGhlIHN5c3RlbSBkb2VzIG5vdCBwcm92aWRlIHRoZSBoZWFkZXIgPGxvY2FsZS5oPi4gIFRha2UgY2FyZSB5b3Vyc2VsZi4gICovIgotICAgZmkKLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1mICRzcmNkaXIvcG8ydGJsLnNlZC5pbjsgdGhlbgotICAgICAgaWYgdGVzdCAiJENBVE9CSkVYVCIgPSAiLmNhdCI7IHRoZW4KLQkgYWNfc2FmZT1gZWNobyAibGludXgvdmVyc2lvbi5oIiB8IHNlZCAneSUuLystJV9fcF8lJ2AKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQwMTA6IGNoZWNraW5nIGZvciBsaW51eC92ZXJzaW9uLmgiID4mNQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl8kYWNfc2FmZScrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCi0gIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2Ci1lbHNlCi0gIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDQwMTUgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLUVPRgotYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6NDAyMDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KLWFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0IHwgZ3JlcCAtdiAiXmNvbmZ0ZXN0LiR7YWNfZXh0fVwkImAKLWlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPXllcyIKLWVsc2UKLSAgZWNobyAiJGFjX2VyciIgPiY1Ci0gIGVjaG8gImNvbmZpZ3VyZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1Ci0gIGNhdCBjb25mdGVzdC4kYWNfZXh0ID4mNQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2hlYWRlcl8kYWNfc2FmZT1ubyIKLWZpCi1ybSAtZiBjb25mdGVzdCoKLWZpCi1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9oZWFkZXJfJyRhY19zYWZlYFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIG1zZ2Zvcm1hdD1saW51eAotZWxzZQotICBlY2hvICIkYWNfdCIibm8iIDE+JjYKLW1zZ2Zvcm1hdD14b3BlbgotZmkKLQotCi0JICAgICAgICAgIAkgc2VkIC1lICcvXiMvZCcgJHNyY2Rpci8kbXNnZm9ybWF0LW1zZy5zZWQgPiBwbzJtc2cuc2VkCi0gICAgICBmaQotICAgICAgICAgICAgc2VkIC1lICcvXiMuKlteXFxdJC9kJyAtZSAnL14jJC9kJyBcCi0JICRzcmNkaXIvcG8ydGJsLnNlZC5pbiA+IHBvMnRibC5zZWQKLSAgIGZpCi0KLSAgICAgICAgICAgIGlmIHRlc3QgIiRQQUNLQUdFIiA9ICJnZXR0ZXh0IjsgdGhlbgotICAgICBHVF9OTz0iI05PIyIKLSAgICAgR1RfWUVTPQotICAgZWxzZQotICAgICBHVF9OTz0KLSAgICAgR1RfWUVTPSIjWUVTIyIKLSAgIGZpCi0gICAKLSAgIAotCi0gICBNS0lOU1RBTExESVJTPSJcJChzcmNkaXIpLy4uLy4uL21raW5zdGFsbGRpcnMiCi0gICAKLQotICAgICAgbD0KLSAgIAotCi0gICAgICAgICAgICBpZiB0ZXN0IC1kICRzcmNkaXIvcG87IHRoZW4KLSAgICAgIHRlc3QgLWQgcG8gfHwgbWtkaXIgcG8KLSAgICAgIGlmIHRlc3QgIngkc3JjZGlyIiAhPSAieC4iOyB0aGVuCi0JIGlmIHRlc3QgInhgZWNobyAkc3JjZGlyIHwgc2VkICdzQC8uKkBAJ2AiID0gIngiOyB0aGVuCi0JICAgIHBvc3JjcHJlZml4PSIkc3JjZGlyLyIKLQkgZWxzZQotCSAgICBwb3NyY3ByZWZpeD0iLi4vJHNyY2Rpci8iCi0JIGZpCi0gICAgICBlbHNlCi0JIHBvc3JjcHJlZml4PSIuLi8iCi0gICAgICBmaQotICAgICAgcm0gLWYgcG8vUE9URklMRVMKLSAgICAgIHNlZCAtZSAiL14jL2QiIC1lICIvXlwkL2QiIC1lICJzLC4qLAkkcG9zcmNwcmVmaXgmIFxcXFwsIiAtZSAiXCRzL1woLipcKSBcXFxcL1wxLyIgXAotCSA8ICRzcmNkaXIvcG8vUE9URklMRVMuaW4gPiBwby9QT1RGSUxFUwotICAgZmkKLSAgCi0KLS4gJHtzcmNkaXJ9Ly4uL2JmZC9jb25maWd1cmUuaG9zdAotCi0KLSMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAotIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCi0jIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKLSMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCi0jIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKLSMgSVJJWCAvc2Jpbi9pbnN0YWxsCi0jIEFJWCAvYmluL2luc3RhbGwKLSMgQUlYIDQgL3Vzci9iaW4vaW5zdGFsbGJzZCwgd2hpY2ggZG9lc24ndCB3b3JrIHdpdGhvdXQgYSAtZyBmbGFnCi0jIEFGUyAvdXNyL2Fmc3dzL2Jpbi9pbnN0YWxsLCB3aGljaCBtaXNoYW5kbGVzIG5vbmV4aXN0ZW50IGFyZ3MKLSMgU1ZSNCAvdXNyL3VjYi9pbnN0YWxsLCB3aGljaCB0cmllcyB0byB1c2UgdGhlIG5vbmV4aXN0ZW50IGdyb3VwICJzdGFmZiIKLSMgLi9pbnN0YWxsLCB3aGljaCBjYW4gYmUgZXJyb25lb3VzbHkgY3JlYXRlZCBieSBtYWtlIGZyb20gLi9pbnN0YWxsLnNoLgotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NDA5NzogY2hlY2tpbmcgZm9yIGEgQlNEIGNvbXBhdGlibGUgaW5zdGFsbCIgPiY1Ci1pZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wYXRoX2luc3RhbGwnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICAgIElGUz0iJHtJRlM9IAl9IjsgYWNfc2F2ZV9JRlM9IiRJRlMiOyBJRlM9IjoiCi0gIGZvciBhY19kaXIgaW4gJFBBVEg7IGRvCi0gICAgIyBBY2NvdW50IGZvciBwZW9wbGUgd2hvIHB1dCB0cmFpbGluZyBzbGFzaGVzIGluIFBBVEggZWxlbWVudHMuCi0gICAgY2FzZSAiJGFjX2Rpci8iIGluCi0gICAgL3wuL3wuLy98L2V0Yy8qfC91c3Ivc2Jpbi8qfC91c3IvZXRjLyp8L3NiaW4vKnwvdXNyL2Fmc3dzL2Jpbi8qfC91c3IvdWNiLyopIDs7Ci0gICAgKikKLSAgICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCi0gICAgICAjIERvbid0IHVzZSBpbnN0YWxsYnNkIGZyb20gT1NGIHNpbmNlIGl0IGluc3RhbGxzIHN0dWZmIGFzIHJvb3QKLSAgICAgICMgYnkgZGVmYXVsdC4KLSAgICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KLSAgICAgICAgaWYgdGVzdCAtZiAkYWNfZGlyLyRhY19wcm9nOyB0aGVuCi0JICBpZiB0ZXN0ICRhY19wcm9nID0gaW5zdGFsbCAmJgotICAgICAgICAgICAgZ3JlcCBkc3Btc2cgJGFjX2Rpci8kYWNfcHJvZyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KLQkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgotCSAgICA6Ci0JICBlbHNlCi0JICAgIGFjX2N2X3BhdGhfaW5zdGFsbD0iJGFjX2Rpci8kYWNfcHJvZyAtYyIKLQkgICAgYnJlYWsgMgotCSAgZmkKLQlmaQotICAgICAgZG9uZQotICAgICAgOzsKLSAgICBlc2FjCi0gIGRvbmUKLSAgSUZTPSIkYWNfc2F2ZV9JRlMiCi0KLWZpCi0gIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCi0gICAgSU5TVEFMTD0iJGFjX2N2X3BhdGhfaW5zdGFsbCIKLSAgZWxzZQotICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdXNlIHRoZSBzbG93IHNoZWxsIHNjcmlwdC4gIFdlIGRvbid0IGNhY2hlIGEKLSAgICAjIHBhdGggZm9yIElOU1RBTEwgd2l0aGluIGEgc291cmNlIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGF0IHdpbGwKLSAgICAjIGJyZWFrIG90aGVyIHBhY2thZ2VzIHVzaW5nIHRoZSBjYWNoZSBpZiB0aGF0IGRpcmVjdG9yeSBpcwotICAgICMgcmVtb3ZlZCwgb3IgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUuCi0gICAgSU5TVEFMTD0iJGFjX2luc3RhbGxfc2giCi0gIGZpCi1maQotZWNobyAiJGFjX3QiIiRJTlNUQUxMIiAxPiY2Ci0KLSMgVXNlIHRlc3QgLXogYmVjYXVzZSBTdW5PUzQgc2ggbWlzaGFuZGxlcyBicmFjZXMgaW4gJHt2YXItdmFsfS4KLSMgSXQgdGhpbmtzIHRoZSBmaXJzdCBjbG9zZSBicmFjZSBlbmRzIHRoZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCi10ZXN0IC16ICIkSU5TVEFMTF9QUk9HUkFNIiAmJiBJTlNUQUxMX1BST0dSQU09JyR7SU5TVEFMTH0nCi0KLXRlc3QgLXogIiRJTlNUQUxMX1NDUklQVCIgJiYgSU5TVEFMTF9TQ1JJUFQ9JyR7SU5TVEFMTF9QUk9HUkFNfScKLQotdGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKLQotCi1mb3IgYWNfaGRyIGluIHN0cmluZy5oIHN0cmluZ3MuaCBzdGRsaWIuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgc2VkICd5JS4vKy0lX19wXyUnYAotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY19oZHIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjQxNTQ6IGNoZWNraW5nIGZvciAkYWNfaGRyIiA+JjUKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfJGFjX3NhZmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA0MTU5ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDwkYWNfaGRyPgotRU9GCi1hY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo0MTY0OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQotYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICJeY29uZnRlc3QuJHthY19leHR9XCQiYAotaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfJGFjX3NhZmU9eWVzIgotZWxzZQotICBlY2hvICIkYWNfZXJyIiA+JjUKLSAgZWNobyAiY29uZmlndXJlOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKLSAgY2F0IGNvbmZ0ZXN0LiRhY19leHQgPiY1Ci0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfaGVhZGVyXyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotZmkKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJGFjX2N2X2hlYWRlcl8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgc2VkICd5JWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Li8tJUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaX19fJSdgCi0gIGNhdCA+PiBjb25mZGVmcy5oIDw8RU9GCi0jZGVmaW5lICRhY190cl9oZHIgMQotRU9GCi0gCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLWRvbmUKLQotCi0KLXVzaW5nX2NnZW49bm8KLQotIyBIb3JyaWJsZSBoYWNrcyB0byBidWlsZCBETExzIG9uIFdpbmRvd3MuCi1XSU4zMkxERkxBR1M9Ci1XSU4zMkxJQkFERD0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotY3lnd2luKikKLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gInllcyI7IHRoZW4KLSAgICBXSU4zMkxERkxBR1M9Ii1uby11bmRlZmluZWQiCi0gICAgV0lOMzJMSUJBREQ9Ii1MYHB3ZGAvLi4vYmZkIC1sYmZkIC1MYHB3ZGAvLi4vbGliaWJlcnR5IC1saWJlcnR5IC1MYHB3ZGAvLi4vaW50bCAtbGludGwgLWxjeWd3aW4iCi0gIGZpCi0gIDs7Ci1lc2FjCi0KLQotCi0jIHRhcmdldC1zcGVjaWZpYyBzdHVmZjoKLQotIyBDYW5vbmljYWxpemUgdGhlIHNlY29uZGFyeSB0YXJnZXQgbmFtZXMuCi1pZiB0ZXN0IC1uICIkZW5hYmxlX3RhcmdldHMiIDsgdGhlbgotICAgIGZvciB0YXJnIGluIGBlY2hvICRlbmFibGVfdGFyZ2V0cyB8IHNlZCAncy8sLyAvZydgCi0gICAgZG8KLQlyZXN1bHQ9YCR7Q09ORklHX1NIRUxMLS9iaW4vc2h9ICRhY19jb25maWdfc3ViICR0YXJnIDI+L2Rldi9udWxsYAotCWlmIHRlc3QgLW4gIiRyZXN1bHQiIDsgdGhlbgotCSAgICBjYW5vbl90YXJnZXRzPSIkY2Fub25fdGFyZ2V0cyAkcmVzdWx0IgotCWVsc2UKLQkgICAgIyBBbGxvdyB0YXJnZXRzIHRoYXQgY29uZmlnLnN1YiBkb2Vzbid0IHJlY29nbml6ZSwgbGlrZSAiYWxsIi4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHRhcmciCi0JZmkKLSAgICBkb25lCi1maQotCi1hbGxfdGFyZ2V0cz1mYWxzZQotc2VsYXJjaHM9Ci1mb3IgdGFyZyBpbiAkdGFyZ2V0ICRjYW5vbl90YXJnZXRzCi1kbwotICAgIGlmIHRlc3QgIngkdGFyZyIgPSAieGFsbCIgOyB0aGVuCi0gICAgICAgIGFsbF90YXJnZXRzPXRydWUKLSAgICBlbHNlCi0JLiAkc3JjZGlyLy4uL2JmZC9jb25maWcuYmZkCi0Jc2VsYXJjaHM9IiRzZWxhcmNocyAkdGFyZ19hcmNocyIKLSAgICBmaQotZG9uZQkKLQotIyBVdGlsaXR5IHZhciwgZG9jdW1lbnRzIGdlbmVyaWMgY2dlbiBzdXBwb3J0IGZpbGVzLgotCi1jZ2VuX2ZpbGVzPSJjZ2VuLW9wYy5sbyBjZ2VuLWFzbS5sbyBjZ2VuLWRpcy5sbyIKLQotIyBXZSBkb24ndCBkbyBhbnkgbGlua3MgYmFzZWQgb24gdGhlIHRhcmdldCBzeXN0ZW0sIGp1c3QgbWFrZWZpbGUgY29uZmlnLgotCi1pZiB0ZXN0IHgke2FsbF90YXJnZXRzfSA9IHhmYWxzZSA7IHRoZW4KLQotICAgICMgVGFyZ2V0IGFyY2hpdGVjdHVyZSAubyBmaWxlcy4KLSAgICB0YT0KLQotICAgIGZvciBhcmNoIGluICRzZWxhcmNocwotICAgIGRvCi0JYWQ9YGVjaG8gJGFyY2ggfCBzZWQgLWUgcy9iZmRfLy9nIC1lIHMvX2FyY2gvL2dgCi0JYXJjaGRlZnM9IiRhcmNoZGVmcyAtREFSQ0hfJGFkIgotCWNhc2UgIiRhcmNoIiBpbgotCWJmZF9hMjlrX2FyY2gpCQl0YT0iJHRhIGEyOWstZGlzLmxvIiA7OwotCWJmZF9hbGxpYW50X2FyY2gpCTs7Ci0JYmZkX2FscGhhX2FyY2gpCQl0YT0iJHRhIGFscGhhLWRpcy5sbyBhbHBoYS1vcGMubG8iIDs7Ci0JYmZkX2FyY19hcmNoKQkJdGE9IiR0YSBhcmMtZGlzLmxvIGFyYy1vcGMubG8iIDs7Ci0JYmZkX2FybV9hcmNoKQkJdGE9IiR0YSBhcm0tZGlzLmxvIiA7OwotCWJmZF9jb252ZXhfYXJjaCkJOzsKLQliZmRfZDEwdl9hcmNoKQkJdGE9IiR0YSBkMTB2LWRpcy5sbyBkMTB2LW9wYy5sbyIgOzsKLQliZmRfZDMwdl9hcmNoKQkJdGE9IiR0YSBkMzB2LWRpcy5sbyBkMzB2LW9wYy5sbyIgOzsKLQliZmRfZnIzMF9hcmNoKSAgICAgICAgICB0YT0iJHRhIGZyMzAtYXNtLmxvIGZyMzAtZGVzYy5sbyBmcjMwLWRpcy5sbyBmcjMwLWlibGQubG8gZnIzMC1vcGMubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX2g4MzAwX2FyY2gpCQl0YT0iJHRhIGg4MzAwLWRpcy5sbyIgOzsKLQliZmRfaDg1MDBfYXJjaCkJCXRhPSIkdGEgaDg1MDAtZGlzLmxvIiA7OwotCWJmZF9ocHBhX2FyY2gpCQl0YT0iJHRhIGhwcGEtZGlzLmxvIiA7OwotCWJmZF9pMzg2X2FyY2gpCQl0YT0iJHRhIGkzODYtZGlzLmxvIiA7OwotCWJmZF9pODYwX2FyY2gpCQk7OwotCWJmZF9pOTYwX2FyY2gpCQl0YT0iJHRhIGk5NjAtZGlzLmxvIiA7OwotCWJmZF9tMzJyX2FyY2gpCQl0YT0iJHRhIG0zMnItYXNtLmxvIG0zMnItZGVzYy5sbyBtMzJyLWRpcy5sbyBtMzJyLWlibGQubG8gbTMyci1vcGMubG8gbTMyci1vcGluc3QubG8iIHVzaW5nX2NnZW49eWVzIDs7Ci0JYmZkX202OGtfYXJjaCkJCXRhPSIkdGEgbTY4ay1kaXMubG8gbTY4ay1vcGMubG8iIDs7Ci0JYmZkX204OGtfYXJjaCkJCXRhPSIkdGEgbTg4ay1kaXMubG8iIDs7Ci0JYmZkX21jb3JlX2FyY2gpCQl0YT0iJHRhIG1jb3JlLWRpcy5sbyIgOzsKLQliZmRfbWlwc19hcmNoKQkJdGE9IiR0YSBtaXBzLWRpcy5sbyBtaXBzLW9wYy5sbyBtaXBzMTYtb3BjLmxvIiA7OwotCWJmZF9tbjEwMjAwX2FyY2gpCXRhPSIkdGEgbTEwMjAwLWRpcy5sbyBtMTAyMDAtb3BjLmxvIiA7OwotCWJmZF9tbjEwMzAwX2FyY2gpCXRhPSIkdGEgbTEwMzAwLWRpcy5sbyBtMTAzMDAtb3BjLmxvIiA7OwotCWJmZF9uczMya19hcmNoKQkJdGE9IiR0YSBuczMyay1kaXMubG8iIDs7Ci0JYmZkX3Bvd2VycGNfYXJjaCkJdGE9IiR0YSBwcGMtZGlzLmxvIHBwYy1vcGMubG8iIDs7Ci0JYmZkX3B5cmFtaWRfYXJjaCkJOzsKLQliZmRfcm9tcF9hcmNoKQkJOzsKLQliZmRfcnM2MDAwX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9zaF9hcmNoKQkJdGE9IiR0YSBzaC1kaXMubG8iIDs7Ci0JYmZkX3NwYXJjX2FyY2gpCQl0YT0iJHRhIHNwYXJjLWRpcy5sbyBzcGFyYy1vcGMubG8iIDs7Ci0JYmZkX3RhaG9lX2FyY2gpCQk7OwotCWJmZF90aWMzMF9hcmNoKQkJdGE9IiR0YSB0aWMzMC1kaXMubG8iIDs7Ci0JYmZkX3RpYzgwX2FyY2gpCQl0YT0iJHRhIHRpYzgwLWRpcy5sbyB0aWM4MC1vcGMubG8iIDs7Ci0JYmZkX3Y4NTBfYXJjaCkJCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3Y4NTBlX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZWFfYXJjaCkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdmF4X2FyY2gpCQl0YT0iJHRhIHZheC1kaXMubG8iIDs7Ci0JYmZkX3c2NV9hcmNoKQkJdGE9IiR0YSB3NjUtZGlzLmxvIiA7OwotCWJmZF93ZTMya19hcmNoKQkJOzsKLQliZmRfejhrX2FyY2gpCQl0YT0iJHRhIHo4ay1kaXMubG8iIDs7Ci0KLQkiIikJCQk7OwotCSopCQl7IGVjaG8gImNvbmZpZ3VyZTogZXJyb3I6ICoqKiB1bmtub3duIHRhcmdldCBhcmNoaXRlY3R1cmUgJGFyY2giIDE+JjI7IGV4aXQgMTsgfSA7OwotCWVzYWMKLSAgICBkb25lCi0KLSAgICBpZiB0ZXN0ICR1c2luZ19jZ2VuID0geWVzIDsgdGhlbgotCXRhPSIkdGEgJGNnZW5fZmlsZXMiCi0gICAgZmkKLQotICAgICMgV2VlZCBvdXQgZHVwbGljYXRlIC5vIGZpbGVzLgotICAgIGY9IiIKLSAgICBmb3IgaSBpbiAkdGEgOyBkbwotCWNhc2UgIiAkZiAiIGluCi0JKiIgJGkgIiopIDs7Ci0JKikgZj0iJGYgJGkiIDs7Ci0JZXNhYwotICAgIGRvbmUKLSAgICB0YT0iJGYiCi0KLSAgICAjIEFuZCBkdXBsaWNhdGUgLUQgZmxhZ3MuCi0gICAgZj0iIgotICAgIGZvciBpIGluICRhcmNoZGVmcyA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIGFyY2hkZWZzPSIkZiIKLQotICAgIEJGRF9NQUNISU5FUz0iJHRhIgotCi1lbHNlCSMgYWxsX3RhcmdldHMgaXMgdHJ1ZQotICAgIGFyY2hkZWZzPS1EQVJDSF9hbGwKLSAgICBCRkRfTUFDSElORVM9JyQoQUxMX01BQ0hJTkVTKScKLWZpCi0KLQotCi0KLXRyYXAgJycgMSAyIDE1Ci1jYXQgPiBjb25mY2FjaGUgPDxcRU9GCi0jIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKLSMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQotIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucy4gIEl0IGlzIG5vdCB1c2VmdWwgb24gb3RoZXIgc3lzdGVtcy4KLSMgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotIwotIyBCeSBkZWZhdWx0LCBjb25maWd1cmUgdXNlcyAuL2NvbmZpZy5jYWNoZSBhcyB0aGUgY2FjaGUgZmlsZSwKLSMgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QgYWxyZWFkeS4gIFlvdSBjYW4gZ2l2ZSBjb25maWd1cmUKLSMgdGhlIC0tY2FjaGUtZmlsZT1GSUxFIG9wdGlvbiB0byB1c2UgYSBkaWZmZXJlbnQgY2FjaGUgZmlsZTsgdGhhdCBpcwotIyB3aGF0IGNvbmZpZ3VyZSBkb2VzIHdoZW4gaXQgY2FsbHMgY29uZmlndXJlIHNjcmlwdHMgaW4KLSMgc3ViZGlyZWN0b3JpZXMsIHNvIHRoZXkgc2hhcmUgdGhlIGNhY2hlLgotIyBHaXZpbmcgLS1jYWNoZS1maWxlPS9kZXYvbnVsbCBkaXNhYmxlcyBjYWNoaW5nLCBmb3IgZGVidWdnaW5nIGNvbmZpZ3VyZS4KLSMgY29uZmlnLnN0YXR1cyBvbmx5IHBheXMgYXR0ZW50aW9uIHRvIHRoZSBjYWNoZSBmaWxlIGlmIHlvdSBnaXZlIGl0IHRoZQotIyAtLXJlY2hlY2sgb3B0aW9uIHRvIHJlcnVuIGNvbmZpZ3VyZS4KLSMKLUVPRgotIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKLSMgYnV0IHdlIGtub3cgb2Ygbm8gd29ya2Fyb3VuZCB0aGF0IGlzIHNpbXBsZSwgcG9ydGFibGUsIGFuZCBlZmZpY2llbnQuCi0jIFNvLCBkb24ndCBwdXQgbmV3bGluZXMgaW4gY2FjaGUgdmFyaWFibGVzJyB2YWx1ZXMuCi0jIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKLSMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCi0oc2V0KSAyPiYxIHwKLSAgY2FzZSBgKGFjX3NwYWNlPScgJzsgc2V0IHwgZ3JlcCBhY19zcGFjZSkgMj4mMWAgaW4KLSAgKmFjX3NwYWNlPVwgKikKLSAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlcyAoZG91YmxlLXF1b3RlIHN1YnN0aXR1dGlvbgotICAgICMgdHVybnMgXFxcXCBpbnRvIFxcLCBhbmQgc2VkIHR1cm5zIFxcIGludG8gXCkuCi0gICAgc2VkIC1uIFwKLSAgICAgIC1lICJzLycvJ1xcXFwnJy9nIiBcCi0gICAgICAtZSAicy9eXFwoW2EtekEtWjAtOV9dKl9jdl9bYS16QS1aMC05X10qXFwpPVxcKC4qXFwpL1xcMT1cJHtcXDE9J1xcMid9L3AiCi0gICAgOzsKLSAgKikKLSAgICAjIGBzZXQnIHF1b3RlcyBjb3JyZWN0bHkgYXMgcmVxdWlyZWQgYnkgUE9TSVgsIHNvIGRvIG5vdCBhZGQgcXVvdGVzLgotICAgIHNlZCAtbiAtZSAncy9eXChbYS16QS1aMC05X10qX2N2X1thLXpBLVowLTlfXSpcKT1cKC4qXCkvXDE9JHtcMT1cMn0vcCcKLSAgICA7OwotICBlc2FjID4+IGNvbmZjYWNoZQotaWYgY21wIC1zICRjYWNoZV9maWxlIGNvbmZjYWNoZTsgdGhlbgotICA6Ci1lbHNlCi0gIGlmIHRlc3QgLXcgJGNhY2hlX2ZpbGU7IHRoZW4KLSAgICBlY2hvICJ1cGRhdGluZyBjYWNoZSAkY2FjaGVfZmlsZSIKLSAgICBjYXQgY29uZmNhY2hlID4gJGNhY2hlX2ZpbGUKLSAgZWxzZQotICAgIGVjaG8gIm5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIgotICBmaQotZmkKLXJtIC1mIGNvbmZjYWNoZQotCi10cmFwICdybSAtZnIgY29uZnRlc3QqIGNvbmZkZWZzKiBjb3JlIGNvcmUuKiAqLmNvcmUgJGFjX2NsZWFuX2ZpbGVzOyBleGl0IDEnIDEgMiAxNQotCi10ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4Ci0jIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KLXRlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKLQotIyBBbnkgYXNzaWdubWVudCB0byBWUEFUSCBjYXVzZXMgU3VuIG1ha2UgdG8gb25seSBleGVjdXRlCi0jIHRoZSBmaXJzdCBzZXQgb2YgZG91YmxlLWNvbG9uIHJ1bGVzLCBzbyByZW1vdmUgaXQgaWYgbm90IG5lZWRlZC4KLSMgSWYgdGhlcmUgaXMgYSBjb2xvbiBpbiB0aGUgcGF0aCwgd2UgbmVlZCB0byBrZWVwIGl0LgotaWYgdGVzdCAieCRzcmNkaXIiID0geC47IHRoZW4KLSAgYWNfdnBzdWI9Jy9eWyAJXSpWUEFUSFsgCV0qPVteOl0qJC9kJwotZmkKLQotdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotCi1ERUZTPS1ESEFWRV9DT05GSUdfSAotCi0jIFdpdGhvdXQgdGhlICIuLyIsIHNvbWUgc2hlbGxzIGxvb2sgaW4gUEFUSCBmb3IgY29uZmlnLnN0YXR1cy4KLTogJHtDT05GSUdfU1RBVFVTPS4vY29uZmlnLnN0YXR1c30KLQotZWNobyBjcmVhdGluZyAkQ09ORklHX1NUQVRVUwotcm0gLWYgJENPTkZJR19TVEFUVVMKLWNhdCA+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0jISAvYmluL3NoCi0jIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNvbmZpZ3VyZS4KLSMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotIyBUaGlzIGRpcmVjdG9yeSB3YXMgY29uZmlndXJlZCBhcyBmb2xsb3dzLAotIyBvbiBob3N0IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYDoKLSMKLSMgJDAgJGFjX2NvbmZpZ3VyZV9hcmdzCi0jCi0jIENvbXBpbGVyIG91dHB1dCBwcm9kdWNlZCBieSBjb25maWd1cmUsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0jIGNvbmZpZ3VyZSwgaXMgaW4gLi9jb25maWcubG9nIGlmIGl0IGV4aXN0cy4KLQotYWNfY3NfdXNhZ2U9IlVzYWdlOiAkQ09ORklHX1NUQVRVUyBbLS1yZWNoZWNrXSBbLS12ZXJzaW9uXSBbLS1oZWxwXSIKLWZvciBhY19vcHRpb24KLWRvCi0gIGNhc2UgIlwkYWNfb3B0aW9uIiBpbgotICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKLSAgICBlY2hvICJydW5uaW5nIFwke0NPTkZJR19TSEVMTC0vYmluL3NofSAkMCAkYWNfY29uZmlndXJlX2FyZ3MgLS1uby1jcmVhdGUgLS1uby1yZWN1cnNpb24iCi0gICAgZXhlYyBcJHtDT05GSUdfU0hFTEwtL2Jpbi9zaH0gJDAgJGFjX2NvbmZpZ3VyZV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uIDs7Ci0gIC12ZXJzaW9uIHwgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12KQotICAgIGVjaG8gIiRDT05GSUdfU1RBVFVTIGdlbmVyYXRlZCBieSBhdXRvY29uZiB2ZXJzaW9uIDIuMTMiCi0gICAgZXhpdCAwIDs7Ci0gIC1oZWxwIHwgLS1oZWxwIHwgLS1oZWwgfCAtLWhlIHwgLS1oKQotICAgIGVjaG8gIlwkYWNfY3NfdXNhZ2UiOyBleGl0IDAgOzsKLSAgKikgZWNobyAiXCRhY19jc191c2FnZSI7IGV4aXQgMSA7OwotICBlc2FjCi1kb25lCi0KLWFjX2dpdmVuX3NyY2Rpcj0kc3JjZGlyCi1hY19naXZlbl9JTlNUQUxMPSIkSU5TVEFMTCIKLQotdHJhcCAncm0gLWZyIGBlY2hvICJNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluIGNvbmZpZy5oOmNvbmZpZy5pbiIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLQotIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4KLXNlZCAncy8lQC9AQC87IHMvQCUvQEAvOyBzLyVnXCQvQGcvOyAvQGdcJC9zL1tcXFxcJiVdL1xcXFwmL2c7Ci0gcy9AQC8lQC87IHMvQEAvQCUvOyBzL0BnXCQvJWcvJyA+IGNvbmZ0ZXN0LnN1YnMgPDxcXENFT0YKLSRhY192cHN1YgotJGV4dHJhc3ViCi1zJUBTSEVMTEAlJFNIRUxMJWcKLXMlQENGTEFHU0AlJENGTEFHUyVnCi1zJUBDUFBGTEFHU0AlJENQUEZMQUdTJWcKLXMlQENYWEZMQUdTQCUkQ1hYRkxBR1MlZwotcyVARkZMQUdTQCUkRkZMQUdTJWcKLXMlQERFRlNAJSRERUZTJWcKLXMlQExERkxBR1NAJSRMREZMQUdTJWcKLXMlQExJQlNAJSRMSUJTJWcKLXMlQGV4ZWNfcHJlZml4QCUkZXhlY19wcmVmaXglZwotcyVAcHJlZml4QCUkcHJlZml4JWcKLXMlQHByb2dyYW1fdHJhbnNmb3JtX25hbWVAJSRwcm9ncmFtX3RyYW5zZm9ybV9uYW1lJWcKLXMlQGJpbmRpckAlJGJpbmRpciVnCi1zJUBzYmluZGlyQCUkc2JpbmRpciVnCi1zJUBsaWJleGVjZGlyQCUkbGliZXhlY2RpciVnCi1zJUBkYXRhZGlyQCUkZGF0YWRpciVnCi1zJUBzeXNjb25mZGlyQCUkc3lzY29uZmRpciVnCi1zJUBzaGFyZWRzdGF0ZWRpckAlJHNoYXJlZHN0YXRlZGlyJWcKLXMlQGxvY2Fsc3RhdGVkaXJAJSRsb2NhbHN0YXRlZGlyJWcKLXMlQGxpYmRpckAlJGxpYmRpciVnCi1zJUBpbmNsdWRlZGlyQCUkaW5jbHVkZWRpciVnCi1zJUBvbGRpbmNsdWRlZGlyQCUkb2xkaW5jbHVkZWRpciVnCi1zJUBpbmZvZGlyQCUkaW5mb2RpciVnCi1zJUBtYW5kaXJAJSRtYW5kaXIlZwotcyVAaG9zdEAlJGhvc3QlZwotcyVAaG9zdF9hbGlhc0AlJGhvc3RfYWxpYXMlZwotcyVAaG9zdF9jcHVAJSRob3N0X2NwdSVnCi1zJUBob3N0X3ZlbmRvckAlJGhvc3RfdmVuZG9yJWcKLXMlQGhvc3Rfb3NAJSRob3N0X29zJWcKLXMlQHRhcmdldEAlJHRhcmdldCVnCi1zJUB0YXJnZXRfYWxpYXNAJSR0YXJnZXRfYWxpYXMlZwotcyVAdGFyZ2V0X2NwdUAlJHRhcmdldF9jcHUlZwotcyVAdGFyZ2V0X3ZlbmRvckAlJHRhcmdldF92ZW5kb3IlZwotcyVAdGFyZ2V0X29zQCUkdGFyZ2V0X29zJWcKLXMlQGJ1aWxkQCUkYnVpbGQlZwotcyVAYnVpbGRfYWxpYXNAJSRidWlsZF9hbGlhcyVnCi1zJUBidWlsZF9jcHVAJSRidWlsZF9jcHUlZwotcyVAYnVpbGRfdmVuZG9yQCUkYnVpbGRfdmVuZG9yJWcKLXMlQGJ1aWxkX29zQCUkYnVpbGRfb3MlZwotcyVAQ0NAJSRDQyVnCi1zJUBJTlNUQUxMX1BST0dSQU1AJSRJTlNUQUxMX1BST0dSQU0lZwotcyVASU5TVEFMTF9TQ1JJUFRAJSRJTlNUQUxMX1NDUklQVCVnCi1zJUBJTlNUQUxMX0RBVEFAJSRJTlNUQUxMX0RBVEElZwotcyVAUEFDS0FHRUAlJFBBQ0tBR0UlZwotcyVAVkVSU0lPTkAlJFZFUlNJT04lZwotcyVAQUNMT0NBTEAlJEFDTE9DQUwlZwotcyVAQVVUT0NPTkZAJSRBVVRPQ09ORiVnCi1zJUBBVVRPTUFLRUAlJEFVVE9NQUtFJWcKLXMlQEFVVE9IRUFERVJAJSRBVVRPSEVBREVSJWcKLXMlQE1BS0VJTkZPQCUkTUFLRUlORk8lZwotcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCi1zJUBBUkAlJEFSJWcKLXMlQFJBTkxJQkAlJFJBTkxJQiVnCi1zJUBMREAlJExEJWcKLXMlQE5NQCUkTk0lZwotcyVAVVNFX1NZTUJPTF9VTkRFUlNDT1JFQCUkVVNFX1NZTUJPTF9VTkRFUlNDT1JFJWcKLXMlQExOX1NAJSRMTl9TJWcKLXMlQERMTFRPT0xAJSRETExUT09MJWcKLXMlQEFTQCUkQVMlZwotcyVATElCVE9PTEAlJExJQlRPT0wlZwotcyVATUFJTlRBSU5FUl9NT0RFX1RSVUVAJSRNQUlOVEFJTkVSX01PREVfVFJVRSVnCi1zJUBNQUlOVEFJTkVSX01PREVfRkFMU0VAJSRNQUlOVEFJTkVSX01PREVfRkFMU0UlZwotcyVATUFJTlRAJSRNQUlOVCVnCi1zJUBFWEVFWFRAJSRFWEVFWFQlZwotcyVAQ1BQQCUkQ1BQJWcKLXMlQEFMTE9DQUAlJEFMTE9DQSVnCi1zJUBVU0VfTkxTQCUkVVNFX05MUyVnCi1zJUBNU0dGTVRAJSRNU0dGTVQlZwotcyVAR01TR0ZNVEAlJEdNU0dGTVQlZwotcyVAWEdFVFRFWFRAJSRYR0VUVEVYVCVnCi1zJUBVU0VfSU5DTFVERURfTElCSU5UTEAlJFVTRV9JTkNMVURFRF9MSUJJTlRMJWcKLXMlQENBVEFMT0dTQCUkQ0FUQUxPR1MlZwotcyVAQ0FUT0JKRVhUQCUkQ0FUT0JKRVhUJWcKLXMlQERBVEFESVJOQU1FQCUkREFUQURJUk5BTUUlZwotcyVAR01PRklMRVNAJSRHTU9GSUxFUyVnCi1zJUBJTlNUT0JKRVhUQCUkSU5TVE9CSkVYVCVnCi1zJUBJTlRMREVQU0AlJElOVExERVBTJWcKLXMlQElOVExMSUJTQCUkSU5UTExJQlMlZwotcyVASU5UTE9CSlNAJSRJTlRMT0JKUyVnCi1zJUBQT0ZJTEVTQCUkUE9GSUxFUyVnCi1zJUBQT1NVQkAlJFBPU1VCJWcKLXMlQElOQ0xVREVfTE9DQUxFX0hAJSRJTkNMVURFX0xPQ0FMRV9IJWcKLXMlQEdUX05PQCUkR1RfTk8lZwotcyVAR1RfWUVTQCUkR1RfWUVTJWcKLXMlQE1LSU5TVEFMTERJUlNAJSRNS0lOU1RBTExESVJTJWcKLXMlQGxAJSRsJWcKLXMlQEhERUZJTkVTQCUkSERFRklORVMlZwotcyVAQ0dFTl9NQUlOVF9UUlVFQCUkQ0dFTl9NQUlOVF9UUlVFJWcKLXMlQENHRU5fTUFJTlRfRkFMU0VAJSRDR0VOX01BSU5UX0ZBTFNFJWcKLXMlQGNnZW5kaXJAJSRjZ2VuZGlyJWcKLXMlQGNnZW5AJSRjZ2VuJWcKLXMlQFdJTjMyTERGTEFHU0AlJFdJTjMyTERGTEFHUyVnCi1zJUBXSU4zMkxJQkFEREAlJFdJTjMyTElCQUREJWcKLXMlQGFyY2hkZWZzQCUkYXJjaGRlZnMlZwotcyVAQkZEX01BQ0hJTkVTQCUkQkZEX01BQ0hJTkVTJWcKLQotQ0VPRgotRU9GCi0KLWNhdCA+PiAkQ09ORklHX1NUQVRVUyA8PFxFT0YKLQotIyBTcGxpdCB0aGUgc3Vic3RpdHV0aW9ucyBpbnRvIGJpdGUtc2l6ZWQgcGllY2VzIGZvciBzZWRzIHdpdGgKLSMgc21hbGwgY29tbWFuZCBudW1iZXIgbGltaXRzLCBsaWtlIG9uIERpZ2l0YWwgT1NGLzEgYW5kIEhQLVVYLgotYWNfbWF4X3NlZF9jbWRzPTkwICMgTWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gcHV0IGluIGEgc2VkIHNjcmlwdC4KLWFjX2ZpbGU9MSAjIE51bWJlciBvZiBjdXJyZW50IGZpbGUuCi1hY19iZWc9MSAjIEZpcnN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX2VuZD0kYWNfbWF4X3NlZF9jbWRzICMgTGluZSBhZnRlciBsYXN0IGxpbmUgZm9yIGN1cnJlbnQgZmlsZS4KLWFjX21vcmVfbGluZXM9OgotYWNfc2VkX2NtZHM9IiIKLXdoaWxlICRhY19tb3JlX2xpbmVzOyBkbwotICBpZiB0ZXN0ICRhY19iZWcgLWd0IDE7IHRoZW4KLSAgICBzZWQgIjEsJHthY19iZWd9ZDsgJHthY19lbmR9cSIgY29uZnRlc3Quc3VicyA+IGNvbmZ0ZXN0LnMkYWNfZmlsZQotICBlbHNlCi0gICAgc2VkICIke2FjX2VuZH1xIiBjb25mdGVzdC5zdWJzID4gY29uZnRlc3QucyRhY19maWxlCi0gIGZpCi0gIGlmIHRlc3QgISAtcyBjb25mdGVzdC5zJGFjX2ZpbGU7IHRoZW4KLSAgICBhY19tb3JlX2xpbmVzPWZhbHNlCi0gICAgcm0gLWYgY29uZnRlc3QucyRhY19maWxlCi0gIGVsc2UKLSAgICBpZiB0ZXN0IC16ICIkYWNfc2VkX2NtZHMiOyB0aGVuCi0gICAgICBhY19zZWRfY21kcz0ic2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBlbHNlCi0gICAgICBhY19zZWRfY21kcz0iJGFjX3NlZF9jbWRzIHwgc2VkIC1mIGNvbmZ0ZXN0LnMkYWNfZmlsZSIKLSAgICBmaQotICAgIGFjX2ZpbGU9YGV4cHIgJGFjX2ZpbGUgKyAxYAotICAgIGFjX2JlZz0kYWNfZW5kCi0gICAgYWNfZW5kPWBleHByICRhY19lbmQgKyAkYWNfbWF4X3NlZF9jbWRzYAotICBmaQotZG9uZQotaWYgdGVzdCAteiAiJGFjX3NlZF9jbWRzIjsgdGhlbgotICBhY19zZWRfY21kcz1jYXQKLWZpCi1FT0YKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLUNPTkZJR19GSUxFUz1cJHtDT05GSUdfRklMRVMtIk1ha2VmaWxlIHBvL01ha2VmaWxlLmluOnBvL01ha2UtaW4ifQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi1mb3IgYWNfZmlsZSBpbiAuLiAkQ09ORklHX0ZJTEVTOyBkbyBpZiB0ZXN0ICJ4JGFjX2ZpbGUiICE9IHguLjsgdGhlbgotICAjIFN1cHBvcnQgIm91dGZpbGVbOmluZmlsZVs6aW5maWxlLi4uXV0iLCBkZWZhdWx0aW5nIGluZmlsZT0ib3V0ZmlsZS5pbiIuCi0gIGNhc2UgIiRhY19maWxlIiBpbgotICAqOiopIGFjX2ZpbGVfaW49YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlW146XSo6JSUnYAotICAgICAgIGFjX2ZpbGU9YGVjaG8gIiRhY19maWxlInxzZWQgJ3MlOi4qJSUnYCA7OwotICAqKSBhY19maWxlX2luPSIke2FjX2ZpbGV9LmluIiA7OwotICBlc2FjCi0KLSAgIyBBZGp1c3QgYSByZWxhdGl2ZSBzcmNkaXIsIHRvcF9zcmNkaXIsIGFuZCBJTlNUQUxMIGZvciBzdWJkaXJlY3Rvcmllcy4KLQotICAjIFJlbW92ZSBsYXN0IHNsYXNoIGFuZCBhbGwgdGhhdCBmb2xsb3dzIGl0LiAgTm90IGFsbCBzeXN0ZW1zIGhhdmUgZGlybmFtZS4KLSAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgaWYgdGVzdCAiJGFjX2RpciIgIT0gIiRhY19maWxlIiAmJiB0ZXN0ICIkYWNfZGlyIiAhPSAuOyB0aGVuCi0gICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICB0ZXN0ICEgLWQgIiRhY19kaXIiICYmIG1rZGlyICIkYWNfZGlyIgotICAgIGFjX2Rpcl9zdWZmaXg9Ii9gZWNobyAkYWNfZGlyfHNlZCAncyVeXC4vJSUnYCIKLSAgICAjIEEgIi4uLyIgZm9yIGVhY2ggZGlyZWN0b3J5IGluICRhY19kaXJfc3VmZml4LgotICAgIGFjX2RvdHM9YGVjaG8gJGFjX2Rpcl9zdWZmaXh8c2VkICdzJS9bXi9dKiUuLi8lZydgCi0gIGVsc2UKLSAgICBhY19kaXJfc3VmZml4PSBhY19kb3RzPQotICBmaQotCi0gIGNhc2UgIiRhY19naXZlbl9zcmNkaXIiIGluCi0gIC4pICBzcmNkaXI9LgotICAgICAgaWYgdGVzdCAteiAiJGFjX2RvdHMiOyB0aGVuIHRvcF9zcmNkaXI9LgotICAgICAgZWxzZSB0b3Bfc3JjZGlyPWBlY2hvICRhY19kb3RzfHNlZCAncyUvJCUlJ2A7IGZpIDs7Ci0gIC8qKSBzcmNkaXI9IiRhY19naXZlbl9zcmNkaXIkYWNfZGlyX3N1ZmZpeCI7IHRvcF9zcmNkaXI9IiRhY19naXZlbl9zcmNkaXIiIDs7Ci0gICopICMgUmVsYXRpdmUgcGF0aC4KLSAgICBzcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciRhY19kaXJfc3VmZml4IgotICAgIHRvcF9zcmNkaXI9IiRhY19kb3RzJGFjX2dpdmVuX3NyY2RpciIgOzsKLSAgZXNhYwotCi0gIGNhc2UgIiRhY19naXZlbl9JTlNUQUxMIiBpbgotICBbLyRdKikgSU5TVEFMTD0iJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gICopIElOU1RBTEw9IiRhY19kb3RzJGFjX2dpdmVuX0lOU1RBTEwiIDs7Ci0gIGVzYWMKLQotICBlY2hvIGNyZWF0aW5nICIkYWNfZmlsZSIKLSAgcm0gLWYgIiRhY19maWxlIgotICBjb25maWd1cmVfaW5wdXQ9IkdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gYGVjaG8gJGFjX2ZpbGVfaW58c2VkICdzJS4qLyUlJ2AgYnkgY29uZmlndXJlLiIKLSAgY2FzZSAiJGFjX2ZpbGUiIGluCi0gICpNYWtlZmlsZSopIGFjX2NvbXN1Yj0iMWlcXAotIyAkY29uZmlndXJlX2lucHV0IiA7OwotICAqKSBhY19jb21zdWI9IDs7Ci0gIGVzYWMKLQotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBzZWQgLWUgIiRhY19jb21zdWIKLXMlQGNvbmZpZ3VyZV9pbnB1dEAlJGNvbmZpZ3VyZV9pbnB1dCVnCi1zJUBzcmNkaXJAJSRzcmNkaXIlZwotcyVAdG9wX3NyY2RpckAlJHRvcF9zcmNkaXIlZwotcyVASU5TVEFMTEAlJElOU1RBTEwlZwotIiAkYWNfZmlsZV9pbnB1dHMgfCAoZXZhbCAiJGFjX3NlZF9jbWRzIikgPiAkYWNfZmlsZQotZmk7IGRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnMqCi0KLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1pZiB0ZXN0ICIke0NPTkZJR19IRUFERVJTK3NldH0iICE9IHNldDsgdGhlbgotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxFT0YKLSAgQ09ORklHX0hFQURFUlM9ImNvbmZpZy5oOmNvbmZpZy5pbiIKLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotZmkKLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVbOmluZmlsZS4uLl1dIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJVteOl0qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBhY19maWxlX2lucHV0cz1gZWNobyAkYWNfZmlsZV9pbnxzZWQgLWUgInMlXiUkYWNfZ2l2ZW5fc3JjZGlyLyUiIC1lICJzJTolICRhY19naXZlbl9zcmNkaXIvJWciYAotICBjYXQgJGFjX2ZpbGVfaW5wdXRzID4gY29uZnRlc3QuaW4KLQotRU9GCi0KLSMgVHJhbnNmb3JtIGNvbmZkZWZzLmggaW50byBhIHNlZCBzY3JpcHQgY29uZnRlc3QudmFscyB0aGF0IHN1YnN0aXR1dGVzCi0jIHRoZSBwcm9wZXIgdmFsdWVzIGludG8gY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4gIEFuZCBmaXJzdDoKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIG9uIHRoZSByaWdodCBzaWRlIG9mIGEgc2VkIHN1YnN0IGluIGNvbmZpZy5zdGF0dXMuCi0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBpbiBhbiB1bnF1b3RlZCBoZXJlIGRvY3VtZW50IGluIGNvbmZpZy5zdGF0dXMuCi1ybSAtZiBjb25mdGVzdC52YWxzCi1jYXQgPiBjb25mdGVzdC5oZHIgPDxcRU9GCi1zL1tcXCYlXS9cXCYvZwotcyVbXFwkYF0lXFwmJWcKLXMlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSAqXCguKlwpJSR7YWNfZEF9XDEke2FjX2RCfVwxJHthY19kQ31cMiR7YWNfZER9JWdwCi1zJWFjX2QlYWNfdSVncAotcyVhY191JWFjX2UlZ3AKLUVPRgotc2VkIC1uIC1mIGNvbmZ0ZXN0LmhkciBjb25mZGVmcy5oID4gY29uZnRlc3QudmFscwotcm0gLWYgY29uZnRlc3QuaGRyCi0KLSMgVGhpcyBzZWQgY29tbWFuZCByZXBsYWNlcyAjdW5kZWYgd2l0aCBjb21tZW50cy4gIFRoaXMgaXMgbmVjZXNzYXJ5LCBmb3IKLSMgZXhhbXBsZSwgaW4gdGhlIGNhc2Ugb2YgX1BPU0lYX1NPVVJDRSwgd2hpY2ggaXMgcHJlZGVmaW5lZCBhbmQgcmVxdWlyZWQKLSMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgotY2F0ID4+IGNvbmZ0ZXN0LnZhbHMgPDxcRU9GCi1zJV5bIAldKiNbIAldKnVuZGVmWyAJXVsgCV0qW2EtekEtWl9dW2EtekEtWl8wLTldKiUvKiAmICovJQotRU9GCi0KLSMgQnJlYWsgdXAgY29uZnRlc3QudmFscyBiZWNhdXNlIHNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvbgotIyB0aGUgc2l6ZSBvZiBoZXJlIGRvY3VtZW50cywgYW5kIG9sZCBzZWRzIGhhdmUgc21hbGwgbGltaXRzIHRvby4KLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgICMgUmVtb3ZlIGxhc3Qgc2xhc2ggYW5kIGFsbCB0aGF0IGZvbGxvd3MgaXQuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lLgotICAgICAgYWNfZGlyPWBlY2hvICRhY19maWxlfHNlZCAncyUvW14vXVteL10qJCUlJ2AKLSAgICAgIGlmIHRlc3QgIiRhY19kaXIiICE9ICIkYWNfZmlsZSIgJiYgdGVzdCAiJGFjX2RpciIgIT0gLjsgdGhlbgotICAgICAgIyBUaGUgZmlsZSBpcyBpbiBhIHN1YmRpcmVjdG9yeS4KLSAgICAgIHRlc3QgISAtZCAiJGFjX2RpciIgJiYgbWtkaXIgIiRhY19kaXIiCi0gICAgZmkKLSAgICBybSAtZiAkYWNfZmlsZQotICAgIG12IGNvbmZ0ZXN0LmggJGFjX2ZpbGUKLSAgZmkKLWZpOyBkb25lCi0KLUVPRgotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8RU9GCi0KLQotRU9GCi1jYXQgPj4gJENPTkZJR19TVEFUVVMgPDxcRU9GCi10ZXN0IC16ICIkQ09ORklHX0hFQURFUlMiIHx8IGVjaG8gdGltZXN0YW1wID4gc3RhbXAtaAotc2VkIC1lICcvUE9URklMRVMgPS9yIHBvL1BPVEZJTEVTJyBwby9NYWtlZmlsZS5pbiA+IHBvL01ha2VmaWxlCi1leGl0IDAKLUVPRgotY2htb2QgK3ggJENPTkZJR19TVEFUVVMKLXJtIC1mciBjb25mZGVmcyogJGFjX2NsZWFuX2ZpbGVzCi10ZXN0ICIkbm9fY3JlYXRlIiA9IHllcyB8fCAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkQ09ORklHX1NUQVRVUyB8fCBleGl0IDEKLQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jb25maWd1cmUuYmF0IGIvb3Bjb2Rlcy9jb25maWd1cmUuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjJjNmQxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvY29uZmlndXJlLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLUBlY2hvIG9mZg0KLWVjaG8gQ29uZmlndXJpbmcgb3Bjb2RlcyBmb3IgZ28zMg0KLXJlbSBUaGlzIGJhdGNoIGZpbGUgYXNzdW1lcyBhIHVuaXgtdHlwZSAic2VkIiBwcm9ncmFtDQotDQotZWNobyAjIE1ha2VmaWxlIGdlbmVyYXRlZCBieSAiY29uZmlndXJlLmJhdCI+IE1ha2VmaWxlDQotDQotaWYgZXhpc3QgY29uZmlnLnNlZCBkZWwgY29uZmlnLnNlZA0KLQ0KLWVjaG8gIi9cLm9bIAldKjovIHMvY29uZmlnLnN0YXR1cy8vCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0NDID0gY2MvQ0MgPSBnY2MvCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AQkZEX01BQ0hJTkVTQC9pMzg2LWRpcy5vLwkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicy9AYXJjaGRlZnNALy1EQVJDSF9pMzg2LwkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQGZyYWdzQC8vCQkJCQkiPj4gY29uZmlnLnNlZA0KLWVjaG8gInMvQHNyY2RpckAvLwkJCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzIUBwcmVmaXhAIS91c3IvbG9jYWwhCQkJCSI+PiBjb25maWcuc2VkDQotZWNobyAicyFAZXhlY19wcmVmaXhAIS91c3IvbG9jYWwhCQkJIj4+IGNvbmZpZy5zZWQNCi1lY2hvICJzL0BSQU5MSUJAL3JhbmxpYi8JCQkJIj4+IGNvbmZpZy5zZWQNCi0NCi1lY2hvICJzL15bIAldKnJtLwktcm0vCQkJCSI+PiBjb25maWcuc2VkDQotDQotc2VkIC1lICJzL15cIi8vIiAtZSAicy9cIiQvLyIgLWUgInMvWyAJXSokLy8iIGNvbmZpZy5zZWQgPiBjb25maWcyLnNlZA0KLXNlZCAtZiBjb25maWcyLnNlZCBNYWtlZmlsZS5pbiA+PiBNYWtlZmlsZQ0KLWRlbCBjb25maWcuc2VkDQotZGVsIGNvbmZpZzIuc2VkDQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9jb25maWd1cmUuaW4gYi9vcGNvZGVzL2NvbmZpZ3VyZS5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3ODU4MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2NvbmZpZ3VyZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi1kbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KLWRubAotCi1BQ19QUkVSRVEoMi4xMykKLUFDX0lOSVQoejhrLWRpcy5jKQotCi1BQ19DQU5PTklDQUxfU1lTVEVNCi1BQ19JU0NfUE9TSVgKLQotIyBXZSBjdXJyZW50bHkgb25seSB1c2UgdGhlIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgbmFtZSBvZiBhbnkgc2hhcmVkCi0jIGxpYnJhcnkuICBGb3IgdXNlciBjb252ZW5pZW5jZSwgd2UgYWx3YXlzIHVzZSB0aGUgc2FtZSB2ZXJzaW9uCi0jIG51bWJlciB0aGF0IEJGRCBpcyB1c2luZy4KLWNoYW5nZXF1b3RlKCwpZG5sCi1CRkRfVkVSU0lPTj1gZ3JlcCBJTklUX0FVVE9NQUtFICR7c3JjZGlyfS8uLi9iZmQvY29uZmlndXJlLmluIHwgc2VkIC1uIC1lICdzL1sgCV0vL2cnIC1lICdzL14uKixcKC4qXCkpLiokL1wxL3AnYAotY2hhbmdlcXVvdGUoWyxdKWRubAotCi1BTV9JTklUX0FVVE9NQUtFKG9wY29kZXMsICR7QkZEX1ZFUlNJT059KQotCi1kbmwgVGhlc2UgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIEFNX1BST0dfTElCVE9PTCwgYmVjYXVzZSBpdCBtYXkgd2FudAotZG5sIHRvIGNhbGwgQUNfQ0hFQ0tfUFJPRy4KLUFDX0NIRUNLX1RPT0woQVIsIGFyKQotQUNfQ0hFQ0tfVE9PTChSQU5MSUIsIHJhbmxpYiwgOikKLQotZG5sIERlZmF1bHQgdG8gYSBub24gc2hhcmVkIGxpYnJhcnkuICBUaGlzIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZQotZG5sIGNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtc2hhcmVkLgotQU1fRElTQUJMRV9TSEFSRUQKLQotQU1fUFJPR19MSUJUT09MCi0KLUFDX0FSR19FTkFCTEUodGFyZ2V0cywKLVsgIC0tZW5hYmxlLXRhcmdldHMgICAgICAgIGFsdGVybmF0aXZlIHRhcmdldCBjb25maWd1cmF0aW9uc10sCi1bY2FzZSAiJHtlbmFibGV2YWx9IiBpbgotICB5ZXMgfCAiIikgQUNfRVJST1IoZW5hYmxlLXRhcmdldHMgb3B0aW9uIG11c3Qgc3BlY2lmeSB0YXJnZXQgbmFtZXMgb3IgJ2FsbCcpCi0gICAgICAgICAgICA7OwotICBubykgICAgICAgZW5hYmxlX3RhcmdldHM9IDs7Ci0gICopICAgICAgICBlbmFibGVfdGFyZ2V0cz0kZW5hYmxldmFsIDs7Ci1lc2FjXSlkbmwKLUFDX0FSR19FTkFCTEUoY29tbW9uYmZkbGliLAotWyAgLS1lbmFibGUtY29tbW9uYmZkbGliICAgYnVpbGQgc2hhcmVkIEJGRC9vcGNvZGVzL2xpYmliZXJ0eSBsaWJyYXJ5XSwKLVtjYXNlICIke2VuYWJsZXZhbH0iIGluCi0gIHllcykgY29tbW9uYmZkbGliPXRydWUgOzsKLSAgbm8pICBjb21tb25iZmRsaWI9ZmFsc2UgOzsKLSAgKikgICBBQ19NU0dfRVJST1IoW2JhZCB2YWx1ZSAke2VuYWJsZXZhbH0gZm9yIG9wY29kZXMgY29tbW9uYmZkbGliIG9wdGlvbl0pIDs7Ci1lc2FjXSlkbmwKLQotQU1fQ09ORklHX0hFQURFUihjb25maWcuaDpjb25maWcuaW4pCi0KLWlmIHRlc3QgLXogIiR0YXJnZXQiIDsgdGhlbgotICAgIEFDX01TR19FUlJPUihVbnJlY29nbml6ZWQgdGFyZ2V0IHN5c3RlbSB0eXBlOyBwbGVhc2UgY2hlY2sgY29uZmlnLnN1Yi4pCi1maQotQUNfQVJHX1BST0dSQU0KLQotQU1fTUFJTlRBSU5FUl9NT0RFCi1BQ19FWEVFWFQKLQotIyBob3N0LXNwZWNpZmljIHN0dWZmOgotCi1BQ19QUk9HX0NDCi0KLUFMTF9MSU5HVUFTPQotQ1lfR05VX0dFVFRFWFQKLQotLiAke3NyY2Rpcn0vLi4vYmZkL2NvbmZpZ3VyZS5ob3N0Ci0KLUFDX1NVQlNUKEhERUZJTkVTKQotQUNfUFJPR19JTlNUQUxMCi0KLUFDX0NIRUNLX0hFQURFUlMoc3RyaW5nLmggc3RyaW5ncy5oIHN0ZGxpYi5oKQotCi0KLXVzaW5nX2NnZW49bm8KLQotIyBIb3JyaWJsZSBoYWNrcyB0byBidWlsZCBETExzIG9uIFdpbmRvd3MuCi1XSU4zMkxERkxBR1M9Ci1XSU4zMkxJQkFERD0KLWNhc2UgIiR7aG9zdH0iIGluCi0qLSotY3lnd2luKikKLSAgaWYgdGVzdCAiJGVuYWJsZV9zaGFyZWQiID0gInllcyI7IHRoZW4KLSAgICBXSU4zMkxERkxBR1M9Ii1uby11bmRlZmluZWQiCi0gICAgV0lOMzJMSUJBREQ9Ii1MYHB3ZGAvLi4vYmZkIC1sYmZkIC1MYHB3ZGAvLi4vbGliaWJlcnR5IC1saWJlcnR5IC1MYHB3ZGAvLi4vaW50bCAtbGludGwgLWxjeWd3aW4iCi0gIGZpCi0gIDs7Ci1lc2FjCi1BQ19TVUJTVChXSU4zMkxERkxBR1MpCi1BQ19TVUJTVChXSU4zMkxJQkFERCkKLQotIyB0YXJnZXQtc3BlY2lmaWMgc3R1ZmY6Ci0KLSMgQ2Fub25pY2FsaXplIHRoZSBzZWNvbmRhcnkgdGFyZ2V0IG5hbWVzLgotaWYgdGVzdCAtbiAiJGVuYWJsZV90YXJnZXRzIiA7IHRoZW4KLSAgICBmb3IgdGFyZyBpbiBgZWNobyAkZW5hYmxlX3RhcmdldHMgfCBzZWQgJ3MvLC8gL2cnYAotICAgIGRvCi0JcmVzdWx0PWAke0NPTkZJR19TSEVMTC0vYmluL3NofSAkYWNfY29uZmlnX3N1YiAkdGFyZyAyPi9kZXYvbnVsbGAKLQlpZiB0ZXN0IC1uICIkcmVzdWx0IiA7IHRoZW4KLQkgICAgY2Fub25fdGFyZ2V0cz0iJGNhbm9uX3RhcmdldHMgJHJlc3VsdCIKLQllbHNlCi0JICAgICMgQWxsb3cgdGFyZ2V0cyB0aGF0IGNvbmZpZy5zdWIgZG9lc24ndCByZWNvZ25pemUsIGxpa2UgImFsbCIuCi0JICAgIGNhbm9uX3RhcmdldHM9IiRjYW5vbl90YXJnZXRzICR0YXJnIgotCWZpCi0gICAgZG9uZQotZmkKLQotYWxsX3RhcmdldHM9ZmFsc2UKLXNlbGFyY2hzPQotZm9yIHRhcmcgaW4gJHRhcmdldCAkY2Fub25fdGFyZ2V0cwotZG8KLSAgICBpZiB0ZXN0ICJ4JHRhcmciID0gInhhbGwiIDsgdGhlbgotICAgICAgICBhbGxfdGFyZ2V0cz10cnVlCi0gICAgZWxzZQotCS4gJHNyY2Rpci8uLi9iZmQvY29uZmlnLmJmZAotCXNlbGFyY2hzPSIkc2VsYXJjaHMgJHRhcmdfYXJjaHMiCi0gICAgZmkKLWRvbmUJCi0KLSMgVXRpbGl0eSB2YXIsIGRvY3VtZW50cyBnZW5lcmljIGNnZW4gc3VwcG9ydCBmaWxlcy4KLQotY2dlbl9maWxlcz0iY2dlbi1vcGMubG8gY2dlbi1hc20ubG8gY2dlbi1kaXMubG8iCi0KLSMgV2UgZG9uJ3QgZG8gYW55IGxpbmtzIGJhc2VkIG9uIHRoZSB0YXJnZXQgc3lzdGVtLCBqdXN0IG1ha2VmaWxlIGNvbmZpZy4KLQotaWYgdGVzdCB4JHthbGxfdGFyZ2V0c30gPSB4ZmFsc2UgOyB0aGVuCi0KLSAgICAjIFRhcmdldCBhcmNoaXRlY3R1cmUgLm8gZmlsZXMuCi0gICAgdGE9Ci0KLSAgICBmb3IgYXJjaCBpbiAkc2VsYXJjaHMKLSAgICBkbwotCWFkPWBlY2hvICRhcmNoIHwgc2VkIC1lIHMvYmZkXy8vZyAtZSBzL19hcmNoLy9nYAotCWFyY2hkZWZzPSIkYXJjaGRlZnMgLURBUkNIXyRhZCIKLQljYXNlICIkYXJjaCIgaW4KLQliZmRfYTI5a19hcmNoKQkJdGE9IiR0YSBhMjlrLWRpcy5sbyIgOzsKLQliZmRfYWxsaWFudF9hcmNoKQk7OwotCWJmZF9hbHBoYV9hcmNoKQkJdGE9IiR0YSBhbHBoYS1kaXMubG8gYWxwaGEtb3BjLmxvIiA7OwotCWJmZF9hcmNfYXJjaCkJCXRhPSIkdGEgYXJjLWRpcy5sbyBhcmMtb3BjLmxvIiA7OwotCWJmZF9hcm1fYXJjaCkJCXRhPSIkdGEgYXJtLWRpcy5sbyIgOzsKLQliZmRfY29udmV4X2FyY2gpCTs7Ci0JYmZkX2QxMHZfYXJjaCkJCXRhPSIkdGEgZDEwdi1kaXMubG8gZDEwdi1vcGMubG8iIDs7Ci0JYmZkX2QzMHZfYXJjaCkJCXRhPSIkdGEgZDMwdi1kaXMubG8gZDMwdi1vcGMubG8iIDs7Ci0JYmZkX2ZyMzBfYXJjaCkgICAgICAgICAgdGE9IiR0YSBmcjMwLWFzbS5sbyBmcjMwLWRlc2MubG8gZnIzMC1kaXMubG8gZnIzMC1pYmxkLmxvIGZyMzAtb3BjLmxvIiB1c2luZ19jZ2VuPXllcyA7OwotCWJmZF9oODMwMF9hcmNoKQkJdGE9IiR0YSBoODMwMC1kaXMubG8iIDs7Ci0JYmZkX2g4NTAwX2FyY2gpCQl0YT0iJHRhIGg4NTAwLWRpcy5sbyIgOzsKLQliZmRfaHBwYV9hcmNoKQkJdGE9IiR0YSBocHBhLWRpcy5sbyIgOzsKLQliZmRfaTM4Nl9hcmNoKQkJdGE9IiR0YSBpMzg2LWRpcy5sbyIgOzsKLQliZmRfaTg2MF9hcmNoKQkJOzsKLQliZmRfaTk2MF9hcmNoKQkJdGE9IiR0YSBpOTYwLWRpcy5sbyIgOzsKLQliZmRfbTMycl9hcmNoKQkJdGE9IiR0YSBtMzJyLWFzbS5sbyBtMzJyLWRlc2MubG8gbTMyci1kaXMubG8gbTMyci1pYmxkLmxvIG0zMnItb3BjLmxvIG0zMnItb3BpbnN0LmxvIiB1c2luZ19jZ2VuPXllcyA7OwotCWJmZF9tNjhrX2FyY2gpCQl0YT0iJHRhIG02OGstZGlzLmxvIG02OGstb3BjLmxvIiA7OwotCWJmZF9tODhrX2FyY2gpCQl0YT0iJHRhIG04OGstZGlzLmxvIiA7OwotCWJmZF9tY29yZV9hcmNoKQkJdGE9IiR0YSBtY29yZS1kaXMubG8iIDs7Ci0JYmZkX21pcHNfYXJjaCkJCXRhPSIkdGEgbWlwcy1kaXMubG8gbWlwcy1vcGMubG8gbWlwczE2LW9wYy5sbyIgOzsKLQliZmRfbW4xMDIwMF9hcmNoKQl0YT0iJHRhIG0xMDIwMC1kaXMubG8gbTEwMjAwLW9wYy5sbyIgOzsKLQliZmRfbW4xMDMwMF9hcmNoKQl0YT0iJHRhIG0xMDMwMC1kaXMubG8gbTEwMzAwLW9wYy5sbyIgOzsKLQliZmRfbnMzMmtfYXJjaCkJCXRhPSIkdGEgbnMzMmstZGlzLmxvIiA7OwotCWJmZF9wb3dlcnBjX2FyY2gpCXRhPSIkdGEgcHBjLWRpcy5sbyBwcGMtb3BjLmxvIiA7OwotCWJmZF9weXJhbWlkX2FyY2gpCTs7Ci0JYmZkX3JvbXBfYXJjaCkJCTs7Ci0JYmZkX3JzNjAwMF9hcmNoKQl0YT0iJHRhIHBwYy1kaXMubG8gcHBjLW9wYy5sbyIgOzsKLQliZmRfc2hfYXJjaCkJCXRhPSIkdGEgc2gtZGlzLmxvIiA7OwotCWJmZF9zcGFyY19hcmNoKQkJdGE9IiR0YSBzcGFyYy1kaXMubG8gc3BhcmMtb3BjLmxvIiA7OwotCWJmZF90YWhvZV9hcmNoKQkJOzsKLQliZmRfdGljMzBfYXJjaCkJCXRhPSIkdGEgdGljMzAtZGlzLmxvIiA7OwotCWJmZF90aWM4MF9hcmNoKQkJdGE9IiR0YSB0aWM4MC1kaXMubG8gdGljODAtb3BjLmxvIiA7OwotCWJmZF92ODUwX2FyY2gpCQl0YT0iJHRhIHY4NTAtb3BjLmxvIHY4NTAtZGlzLmxvIiA7OwotCWJmZF92ODUwZV9hcmNoKQkJdGE9IiR0YSB2ODUwLW9wYy5sbyB2ODUwLWRpcy5sbyIgOzsKLQliZmRfdjg1MGVhX2FyY2gpCXRhPSIkdGEgdjg1MC1vcGMubG8gdjg1MC1kaXMubG8iIDs7Ci0JYmZkX3ZheF9hcmNoKQkJdGE9IiR0YSB2YXgtZGlzLmxvIiA7OwotCWJmZF93NjVfYXJjaCkJCXRhPSIkdGEgdzY1LWRpcy5sbyIgOzsKLQliZmRfd2UzMmtfYXJjaCkJCTs7Ci0JYmZkX3o4a19hcmNoKQkJdGE9IiR0YSB6OGstZGlzLmxvIiA7OwotCi0JIiIpCQkJOzsKLQkqKQkJQUNfTVNHX0VSUk9SKCoqKiB1bmtub3duIHRhcmdldCBhcmNoaXRlY3R1cmUgJGFyY2gpIDs7Ci0JZXNhYwotICAgIGRvbmUKLQotICAgIGlmIHRlc3QgJHVzaW5nX2NnZW4gPSB5ZXMgOyB0aGVuCi0JdGE9IiR0YSAkY2dlbl9maWxlcyIKLSAgICBmaQotCi0gICAgIyBXZWVkIG91dCBkdXBsaWNhdGUgLm8gZmlsZXMuCi0gICAgZj0iIgotICAgIGZvciBpIGluICR0YSA7IGRvCi0JY2FzZSAiICRmICIgaW4KLQkqIiAkaSAiKikgOzsKLQkqKSBmPSIkZiAkaSIgOzsKLQllc2FjCi0gICAgZG9uZQotICAgIHRhPSIkZiIKLQotICAgICMgQW5kIGR1cGxpY2F0ZSAtRCBmbGFncy4KLSAgICBmPSIiCi0gICAgZm9yIGkgaW4gJGFyY2hkZWZzIDsgZG8KLQljYXNlICIgJGYgIiBpbgotCSoiICRpICIqKSA7OwotCSopIGY9IiRmICRpIiA7OwotCWVzYWMKLSAgICBkb25lCi0gICAgYXJjaGRlZnM9IiRmIgotCi0gICAgQkZEX01BQ0hJTkVTPSIkdGEiCi0KLWVsc2UJIyBhbGxfdGFyZ2V0cyBpcyB0cnVlCi0gICAgYXJjaGRlZnM9LURBUkNIX2FsbAotICAgIEJGRF9NQUNISU5FUz0nJChBTExfTUFDSElORVMpJwotZmkKLQotQUNfU1VCU1QoYXJjaGRlZnMpCi1BQ19TVUJTVChCRkRfTUFDSElORVMpCi0KLUFDX09VVFBVVChNYWtlZmlsZSBwby9NYWtlZmlsZS5pbjpwby9NYWtlLWluLAotW3NlZCAtZSAnL1BPVEZJTEVTID0vciBwby9QT1RGSUxFUycgcG8vTWFrZWZpbGUuaW4gPiBwby9NYWtlZmlsZV0pCmRpZmYgLS1naXQgYS9vcGNvZGVzL2QxMHYtZGlzLmMgYi9vcGNvZGVzL2QxMHYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMWE3ZDMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMTB2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzAxICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIEQxMFYgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLS8qIHRoZSBQQyB3cmFwcyBhdCAxOCBiaXRzLCBleGNlcHQgZm9yIHRoZSBzZWdtZW50IG51bWJlciAqLwotLyogc28gdXNlIHRoaXMgbWFzayB0byBrZWVwIHRoZSBwYXJ0cyB3ZSB3YW50ICovCi0jZGVmaW5lIFBDX01BU0sJMHgwMzAzRkZGRgotCi1zdGF0aWMgdm9pZCBkaXNfMl9zaG9ydCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nIGluc24sIGJmZF92bWEgbWVtYWRkciwgCi0JCQkJIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvLCBpbnQgb3JkZXIpKTsKLXN0YXRpYyB2b2lkIGRpc19sb25nIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcgaW5zbiwgYmZkX3ZtYSBtZW1hZGRyLCAKLQkJCSAgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvKSk7Ci0KLWludCAKLXByaW50X2luc25fZDEwdiAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0KLSAgc3RhdHVzID0gaW5zbiAmIEZNMTE7Ci0gIHN3aXRjaCAoc3RhdHVzKSB7Ci0gIGNhc2UgMDoKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMik7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0wMToKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0xMDoKLSAgICBkaXNfMl9zaG9ydCAoaW5zbiwgbWVtYWRkciwgaW5mbywgMSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRk0xMToKLSAgICBkaXNfbG9uZyAoaW5zbiwgbWVtYWRkciwgaW5mbyk7Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChvcGVyLCBpbnNuLCBvcCwgbWVtYWRkciwgaW5mbykKLSAgICAgc3RydWN0IGQxMHZfb3BlcmFuZCAqb3BlcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzdHJ1Y3QgZDEwdl9vcGNvZGUgKm9wOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgbnVtLCBzaGlmdDsKLQotICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9BVE1JTlVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQC0iKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX01JTlVTKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOyAgIAotICAgICAgcmV0dXJuOwotICAgIH0KLSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfUExVUykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIisiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUU0lHTikKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUUEFSKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCgiKTsgICAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgc2hpZnQgPSBvcGVyLT5zaGlmdDsKLQotICAvKiB0aGUgTE9OR19MIGZvcm1hdCBzaGlmdHMgcmVnaXN0ZXJzIG92ZXIgYnkgMTUgKi8KLSAgaWYgKG9wLT5mb3JtYXQgPT0gTE9OR19MICYmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKSkKLSAgICBzaGlmdCArPSAxNTsKLQotICBudW0gPSAoaW5zbiA+PiBzaGlmdCkgJiAoMHg3RkZGRkZGRiA+PiAoMzEgLSBvcGVyLT5iaXRzKSk7Ci0KLSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpCi0gICAgewotICAgICAgaW50IGk7Ci0gICAgICBpbnQgbWF0Y2g9MDsKLSAgICAgIG51bSArPSAob3Blci0+ZmxhZ3MKLQkgICAgICAmIChPUEVSQU5EX0dQUnxPUEVSQU5EX0ZGTEFHfE9QRVJBTkRfQ0ZMQUd8T1BFUkFORF9DT05UUk9MKSk7Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiAoT1BFUkFORF9BQ0MwfE9QRVJBTkRfQUNDMSkpCi0JbnVtICs9IG51bSA/IE9QRVJBTkRfQUNDMSA6IE9QRVJBTkRfQUNDMDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCBkMTB2X3JlZ19uYW1lX2NudCgpOyBpKyspCi0JewotCSAgaWYgKG51bSA9PSBkMTB2X3ByZWRlZmluZWRfcmVnaXN0ZXJzW2ldLnZhbHVlKQotCSAgICB7Ci0JICAgICAgaWYgKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpOwotCSAgICAgIGVsc2UKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsZDEwdl9wcmVkZWZpbmVkX3JlZ2lzdGVyc1tpXS5uYW1lKTsKLQkgICAgICBtYXRjaD0xOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgaWYgKG1hdGNoID09IDApCi0JewotCSAgLyogdGhpcyB3b3VsZCBvbmx5IGdldCBleGVjdXRlZCBpZiBhIHJlZ2lzdGVyIHdhcyBub3QgaW4gdGhlIAotCSAgICAgcmVnaXN0ZXIgdGFibGUgKi8KLQkgIGlmIChvcGVyLT5mbGFncyAmIChPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxKSkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhIik7Ci0JICBlbHNlIGlmIChvcGVyLT5mbGFncyAmIE9QRVJBTkRfQ09OVFJPTCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJjciIpOwotCSAgZWxzZSBpZihvcGVyLT5mbGFncyAmIE9QRVJBTkRfUkVHKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIiKTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLG51bSk7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIGFkZHJlc3NlcyBhcmUgcmlnaHQtc2hpZnRlZCBieSAyICovCi0gICAgICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX0FERFIpCi0JewotCSAgbG9uZyBtYXg7Ci0JICBpbnQgbmVnPTA7Ci0JICBtYXggPSAoMSA8PCAob3Blci0+Yml0cyAtIDEpKTsKLQkgIGlmIChudW0gJiBtYXgpCi0JICAgIHsKLQkgICAgICBudW0gPSAtbnVtICYgKCgxIDw8IG9wZXItPmJpdHMpLTEpOwotCSAgICAgIG5lZyA9IDE7Ci0JICAgIH0KLQkgIG51bSA9IG51bTw8MjsKLQkgIGlmIChpbmZvLT5mbGFncyAmIElOU05fSEFTX1JFTE9DKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG51bSAmIFBDX01BU0ssIGluZm8pOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgaWYgKG5lZykKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciAtIG51bSkgJiBQQ19NQVNLLCBpbmZvKTsKLQkgICAgICBlbHNlCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyBudW0pICYgUENfTUFTSywgaW5mbyk7Ci0JICAgIH0KLQl9Ci0gICAgICBlbHNlCi0JewotCSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSUdORUQpCi0JICAgIHsKLQkgICAgICBpbnQgbWF4ID0gKDEgPDwgKG9wZXItPmJpdHMgLSAxKSk7Ci0JICAgICAgaWYgKG51bSAmIG1heCkKLQkJewotCQkgIG51bSA9IC1udW0gJiAoKDEgPDwgb3Blci0+Yml0cyktMSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7Ci0JCX0KLQkgICAgfQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IixudW0pOwotCX0KLSAgICB9Ci19Ci0KLQotc3RhdGljIHZvaWQKLWRpc19sb25nIChpbnNuLCBtZW1hZGRyLCBpbmZvKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBpOwotICBjaGFyIGJ1ZlszMl07Ci0gIHN0cnVjdCBkMTB2X29wY29kZSAqb3AgPSAoc3RydWN0IGQxMHZfb3Bjb2RlICopZDEwdl9vcGNvZGVzOwotICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgbmVlZF9wYXJlbiA9IDA7Ci0gIGludCBtYXRjaCA9IDA7Ci0KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmICgob3AtPmZvcm1hdCAmIExPTkdfT1BDT0RFKSAmJiAoKG9wLT5tYXNrICYgaW5zbikgPT0gb3AtPm9wY29kZSkpCi0JewotCSAgbWF0Y2ggPSAxOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc1x0Iiwgb3AtPm5hbWUpOyAgIAotCSAgZm9yICggaT0wOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQkgICAgewotCSAgICAgIG9wZXIgPSAoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV07Ci0JICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JCW5lZWRfcGFyZW4gPSAxOwotCSAgICAgIHByaW50X29wZXJhbmQgKG9wZXIsIGluc24sIG9wLCBtZW1hZGRyLCBpbmZvKTsKLQkgICAgICBpZiAob3AtPm9wZXJhbmRzW2krMV0gJiYgb3Blci0+Yml0cyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfUExVUyAmJgotCQkgIGQxMHZfb3BlcmFuZHNbb3AtPm9wZXJhbmRzW2krMV1dLmZsYWdzICE9IE9QRVJBTkRfTUlOVVMpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCAiKTsgICAKLQkgICAgfQotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLGluc24pOyAgIAotCi0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOyAgIAotfQotCi1zdGF0aWMgdm9pZAotZGlzXzJfc2hvcnQgKGluc24sIG1lbWFkZHIsIGluZm8sIG9yZGVyKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBvcmRlcjsKLXsKLSAgaW50IGksajsKLSAgY2hhciBhc3RyWzJdWzMyXTsKLSAgdW5zaWduZWQgaW50IGluc1syXTsKLSAgc3RydWN0IGQxMHZfb3Bjb2RlICpvcDsKLSAgY2hhciBidWZbMzJdOwotICBpbnQgbWF0Y2gsIG51bV9tYXRjaD0wOwotICBzdHJ1Y3QgZDEwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgbmVlZF9wYXJlbiA9IDA7Ci0KLSAgaW5zWzBdID0gKGluc24gJiAweDNGRkZGRkZGKSA+PiAxNTsKLSAgaW5zWzFdID0gaW5zbiAmIDB4MDAwMDdGRkY7Ci0KLSAgZm9yKGo9MDtqPDI7aisrKQotICAgIHsKLSAgICAgIG9wID0gKHN0cnVjdCBkMTB2X29wY29kZSAqKWQxMHZfb3Bjb2RlczsKLSAgICAgIG1hdGNoPTA7Ci0gICAgICB3aGlsZSAob3AtPm5hbWUpCi0JewotCSAgaWYgKChvcC0+Zm9ybWF0ICYgU0hPUlRfT1BDT0RFKSAmJiAoKG9wLT5tYXNrICYgaW5zW2pdKSA9PSBvcC0+b3Bjb2RlKSkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsb3AtPm5hbWUpOyAgIAotCSAgICAgIGZvciAoaT0wOyBvcC0+b3BlcmFuZHNbaV07IGkrKykKLQkJewotCQkgIG9wZXIgPSAoc3RydWN0IGQxMHZfb3BlcmFuZCAqKSZkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpXV07Ci0JCSAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JCSAgICBuZWVkX3BhcmVuID0gMTsKLQkJICBwcmludF9vcGVyYW5kIChvcGVyLCBpbnNbal0sIG9wLCBtZW1hZGRyLCBpbmZvKTsKLQkJICBpZiAob3AtPm9wZXJhbmRzW2krMV0gJiYgb3Blci0+Yml0cyAmJiAKLQkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX1BMVVMgJiYKLQkJICBkMTB2X29wZXJhbmRzW29wLT5vcGVyYW5kc1tpKzFdXS5mbGFncyAhPSBPUEVSQU5EX01JTlVTKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsICIpOyAgIAotCQl9Ci0JICAgICAgbWF0Y2ggPSAxOwotCSAgICAgIG51bV9tYXRjaCsrOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBvcCsrOwotCX0KLSAgICAgIGlmICghbWF0Y2gpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ1bmtub3duIik7ICAgCi0KLSAgICAgIHN3aXRjaCAob3JkZXIpCi0JewotCWNhc2UgMDoKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQtPlx0Iik7ICAgCi0JICBvcmRlciA9IC0xOwotCSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdDwtXHQiKTsgICAKLQkgIG9yZGVyID0gLTE7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0fHxcdCIpOyAgIAotCSAgb3JkZXIgPSAtMTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIGlmIChudW1fbWF0Y2ggPT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCUwOHgiLGluc24pOyAgIAotCi0gIGlmIChuZWVkX3BhcmVuKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOyAgIAotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kMTB2LW9wYy5jIGIvb3Bjb2Rlcy9kMTB2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGEwMmQwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZDEwdi1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKiBkMTB2LW9wYy5jIC0tIEQxMFYgb3Bjb2RlIGxpc3QKLSAgIENvcHlyaWdodCAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgV3JpdHRlbiBieSBNYXJ0aW4gSHVudCwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvZDEwdi5oIgotCi0KLS8qICAgVGhlIHRhYmxlIGlzIHNvcnRlZC4gU3VpdGFibGUgZm9yIHNlYXJjaGluZyBieSBhIGJpbmFyeSBzZWFyY2guICovCi1jb25zdCBzdHJ1Y3QgcGRfcmVnIGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnNbXSA9Ci17Ci0gIHsgImEwIiwgTlVMTCwgT1BFUkFORF9BQ0MwKzAgfSwKLSAgeyAiYTEiLCBOVUxMLCBPUEVSQU5EX0FDQzErMSB9LAotICB7ICJicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiYyIsIE5VTEwsIE9QRVJBTkRfQ0ZMQUcrMyB9LAotICB7ICJjcjAiLCAicHN3IiwgT1BFUkFORF9DT05UUk9MIH0sCi0gIHsgImNyMSIsICJicHN3IiwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiY3IxMCIsICJtb2RfcyIsIE9QRVJBTkRfQ09OVFJPTCsxMCB9LAotICB7ICJjcjExIiwgIm1vZF9lIiwgT1BFUkFORF9DT05UUk9MKzExIH0sCi0gIHsgImNyMTIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTIgfSwKLSAgeyAiY3IxMyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxMyB9LAotICB7ICJjcjE0IiwgImliYSIsIE9QRVJBTkRfQ09OVFJPTCsxNCB9LAotICB7ICJjcjE1IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE1IH0sCi0gIHsgImNyMiIsICJwYyIsIE9QRVJBTkRfQ09OVFJPTCsyIH0sCi0gIHsgImNyMyIsICJicGMiLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJjcjQiLCAiZHBzdyIsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImNyNSIsICJkcGMiLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJjcjYiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNiB9LAotICB7ICJjcjciLCAicnB0X2MiLCBPUEVSQU5EX0NPTlRST0wrNyB9LAotICB7ICJjcjgiLCAicnB0X3MiLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJjcjkiLCAicnB0X2UiLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJkcGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJkcHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiZjAiLCBOVUxMLCBPUEVSQU5EX0ZGTEFHKzAgfSwKLSAgeyAiZjEiLCBOVUxMLCBPUEVSQU5EX0ZGTEFHKzEgfSwKLSAgeyAiaWJhIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImxpbmsiLCAicjEzIiwgT1BFUkFORF9HUFIrMTMgfSwKLSAgeyAibW9kX2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAibW9kX3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMCB9LAotICB7ICJyMCIsIE5VTEwsIE9QRVJBTkRfR1BSKzAgfSwKLSAgeyAicjAtcjEiLCBOVUxMLCBPUEVSQU5EX0dQUiswfSwKLSAgeyAicjEiLCBOVUxMLCBPUEVSQU5EX0dQUisxIH0sCi0gIHsgInIxIiwgTlVMTCwgT1BFUkFORF9HUFIrMSB9LAotICB7ICJyMTAiLCBOVUxMLCBPUEVSQU5EX0dQUisxMCB9LAotICB7ICJyMTAtcjExIiwgTlVMTCwgT1BFUkFORF9HUFIrMTAgfSwKLSAgeyAicjExIiwgTlVMTCwgT1BFUkFORF9HUFIrMTEgfSwKLSAgeyAicjEyIiwgTlVMTCwgT1BFUkFORF9HUFIrMTIgfSwKLSAgeyAicjEyLXIxMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzEyIH0sCi0gIHsgInIxMyIsIE5VTEwsIE9QRVJBTkRfR1BSKzEzIH0sCi0gIHsgInIxNCIsIE5VTEwsIE9QRVJBTkRfR1BSKzE0IH0sCi0gIHsgInIxNC1yMTUiLCBOVUxMLCBPUEVSQU5EX0dQUisxNCB9LAotICB7ICJyMTUiLCAic3AiLCBPUEVSQU5EX0dQUisxNSB9LAotICB7ICJyMiIsIE5VTEwsIE9QRVJBTkRfR1BSKzIgfSwKLSAgeyAicjItcjMiLCBOVUxMLCBPUEVSQU5EX0dQUisyIH0sCi0gIHsgInIzIiwgTlVMTCwgT1BFUkFORF9HUFIrMyB9LAotICB7ICJyNCIsIE5VTEwsIE9QRVJBTkRfR1BSKzQgfSwKLSAgeyAicjQtcjUiLCBOVUxMLCBPUEVSQU5EX0dQUis0IH0sCi0gIHsgInI1IiwgTlVMTCwgT1BFUkFORF9HUFIrNSB9LAotICB7ICJyNiIsIE5VTEwsIE9QRVJBTkRfR1BSKzYgfSwKLSAgeyAicjYtcjciLCBOVUxMLCBPUEVSQU5EX0dQUis2IH0sCi0gIHsgInI3IiwgTlVMTCwgT1BFUkFORF9HUFIrNyB9LAotICB7ICJyOCIsIE5VTEwsIE9QRVJBTkRfR1BSKzggfSwKLSAgeyAicjgtcjkiLCBOVUxMLCBPUEVSQU5EX0dQUis4IH0sCi0gIHsgInI5IiwgTlVMTCwgT1BFUkFORF9HUFIrOSB9LAotICB7ICJycHRfYyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs3IH0sCi0gIHsgInJwdF9lIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAicnB0X3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOCB9LAotICB7ICJzcCIsIE5VTEwsIE9QRVJBTkRfR1BSKzE1IH0sCi19OwotCi1pbnQgCi1kMTB2X3JlZ19uYW1lX2NudCgpCi17Ci0gIHJldHVybiAoc2l6ZW9mKGQxMHZfcHJlZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKTsKLX0KLQotY29uc3Qgc3RydWN0IGQxMHZfb3BlcmFuZCBkMTB2X29wZXJhbmRzW10gPQotewotI2RlZmluZSBVTlVTRUQJKDApCi0gIHsgMCwgMCwgMCB9LAotI2RlZmluZSBSU1JDCShVTlVTRUQgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfR1BSfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJEU1QJKFJTUkMgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfREVTVHxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBU1JDCShSRFNUICsgMSkKLSAgeyAxLCA0LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFTUkMwT05MWSAoQVNSQyArIDEpCi0gIHsgMSwgNCwgT1BFUkFORF9BQ0MwfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIEFEU1QJKEFTUkMwT05MWSArIDEpCi0gIHsgMSwgOCwgT1BFUkFORF9ERVNUfE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUlNSQ0UJKEFEU1QgKyAxKQotICB7IDQsIDEsIE9QRVJBTkRfRVZFTnxPUEVSQU5EX0dQUnxPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSRFNURQkoUlNSQ0UgKyAxKQotICB7IDQsIDUsIE9QRVJBTkRfRVZFTnxPUEVSQU5EX0RFU1R8T1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgTlVNMTYJKFJEU1RFICsgMSkKLSAgeyAxNiwgMCwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgTlVNMwkoTlVNMTYgKyAxKQkJCS8qIHJhYywgcmFjaGkgKi8KLSAgeyAzLCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBOVU00CShOVU0zICsgMSkKLSAgeyA0LCAxLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBVTlVNNAkoTlVNNCArIDEpCi0gIHsgNCwgMSwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgVU5VTTRTCShVTlVNNCArIDEpCQkJLyogYWRkaSwgc2xsaSwgc3JhaSwgc3JsaSwgc3ViaSAqLwotICB7IDQsIDEsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgVU5VTTgJKFVOVU00UyArIDEpCQkJLyogcmVwaSAqLwotICB7IDgsIDE2LCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBVTlVNMTYJKFVOVU04ICsgMSkJCQkvKiBjbXB1aSAqLwotICB7IDE2LCAwLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBBTlVNMTYJKFVOVU0xNiArIDEpCi0gIHsgMTYsIDAsIE9QRVJBTkRfQUREUnxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBBTlVNOAkoQU5VTTE2ICsgMSkKLSAgeyA4LCAwLCBPUEVSQU5EX0FERFJ8T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgQVNSQzIJKEFOVU04ICsgMSkKLSAgeyAxLCA4LCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIFJTUkMyCShBU1JDMiArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgUlNSQzJFCShSU1JDMiArIDEpCi0gIHsgNCwgNSwgT1BFUkFORF9HUFJ8T1BFUkFORF9SRUd8T1BFUkFORF9FVkVOIH0sCi0jZGVmaW5lIEFTUkMwCShSU1JDMkUgKyAxKQotICB7IDEsIDAsIE9QRVJBTkRfQUNDMHxPUEVSQU5EX0FDQzF8T1BFUkFORF9SRUcgfSwKLSNkZWZpbmUgQURTVDAJKEFTUkMwICsgMSkKLSAgeyAxLCAwLCBPUEVSQU5EX0FDQzB8T1BFUkFORF9BQ0MxfE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBGRlNSQwkoQURTVDAgKyAxKQotICB7IDIsIDEsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GRkxBRyB9LAotI2RlZmluZSBDRlNSQwkoRkZTUkMgKyAxKQotICB7IDIsIDEsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9DRkxBRyB9LAotI2RlZmluZSBGRFNUCShDRlNSQyArIDEpCi0gIHsgMSwgNSwgT1BFUkFORF9SRUcgfCBPUEVSQU5EX0ZGTEFHIHwgT1BFUkFORF9ERVNUfSwKLSNkZWZpbmUgQVRTSUdOCShGRFNUICsgMSkKLSAgeyAwLCAwLCBPUEVSQU5EX0FUU0lHTn0sCi0jZGVmaW5lIEFUUEFSCShBVFNJR04gKyAxKQkvKiAiQCgiICovCi0gIHsgMCwgMCwgT1BFUkFORF9BVFBBUn0sCi0jZGVmaW5lIFBMVVMJKEFUUEFSICsgMSkJLyogcG9zdGluY3JlbWVudCAqLwotICB7IDAsIDAsIE9QRVJBTkRfUExVU30sCi0jZGVmaW5lIE1JTlVTCShQTFVTICsgMSkJLyogcG9zdGRlY3JlbWVudCAqLwotICB7IDAsIDAsIE9QRVJBTkRfTUlOVVN9LAotI2RlZmluZSBBVE1JTlVTCShNSU5VUyArIDEpCS8qIHByZWRlY3JlbWVudCAqLwotICB7IDAsIDAsIE9QRVJBTkRfQVRNSU5VU30sCi0jZGVmaW5lIENTUkMJKEFUTUlOVVMgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNCwgMSwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfSwKLSNkZWZpbmUgQ0RTVAkoQ1NSQyArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA0LCA1LCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x8T1BFUkFORF9ERVNUfSwKLX07Ci0KLWNvbnN0IHN0cnVjdCBkMTB2X29wY29kZSBkMTB2X29wY29kZXNbXSA9IHsKLSAgeyAiYWJzIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDQ2MDcsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAiYWJzIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NTYwNywgMHg3ZWZmLCB7IEFEU1QgfSB9LAotICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXQ0FSLCAweDAyMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAiYWRkIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxMjAxLCAweDdlZTMsIHsgQURTVCwgUlNSQ0UgfSB9LAotICB7ICJhZGQiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEyMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAiYWRkMnciLCBTSE9SVF8yLCAyLCBJVSwgUEFSfFdDQVIsIDB4MTIwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCi0gIHsgImFkZDMiLCBMT05HX0wsIDEsIE1VLCBTRVF8V0NBUiwgMHgxMDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgeyAiYWRkYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMjAwLCAweDNmZmZmZTIyLCB7IFJEU1RFLCBSU1JDRSwgQVNSQzAgfSB9LAotICB7ICJhZGRhYzMiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDAyMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAiYWRkYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTIwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAiYWRkYWMzcyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMTIwMiwgMHgzZmZmZmUyZSwgeyBSRFNURSwgQVNSQywgQVNSQzAgfSB9LAotICB7ICJhZGRpIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0NBUiwgIDB4MjAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTRTIH0gfSwKLSAgeyAiYW5kIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4YzAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgImFuZDMiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4NjAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBSU1JDLCBOVU0xNiB9IH0sCi0gIHsgImJjbHJpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHhjMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImJsIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMCwgOCwgMTYsIDAgfSB9LAotICB7ICJibC5zIiwgU0hPUlRfQiwgMywgTVUsIEJSQU5DSF9MSU5LfFBBUiwgMHg0OTAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJibC5sIiwgTE9OR19CLCAzLCBNVSwgQlJBTkNIX0xJTkt8U0VRLCAweDI0ODAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJub3RpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHhhMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImJyYSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYnJhLnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIfFBBUiwgMHg0ODAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJicmEubCIsIExPTkdfQiwgMywgTVUsIEJSQU5DSHxTRVEsIDB4MjQwMDAwMDAsIDB4M2ZmZjAwMDAsIHsgQU5VTTE2IH0gfSwKLSAgeyAiYnJmMGYiLCBPUENPREVfRkFLRSwgMCwgMCwgMCwgMCwgMCwgeyAwLCA4LCAxNiwgMCB9IH0sCi0gIHsgImJyZjBmLnMiLCBTSE9SVF9CLCAzLCBNVSwgQlJBTkNIfFBBUnxSRjAsIDB4NGEwMCwgMHg3ZjAwLCB7IEFOVU04IH0gfSwKLSAgeyAiYnJmMGYubCIsIExPTkdfQiwgMywgTVUsIFNFUSwgMHgyNTAwMDAwMCwgMHgzZmZmMDAwMCwgeyBBTlVNMTYgfSB9LAotICB7ICJicmYwdCIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDAsIDgsIDE2LCAwIH0gfSwKLSAgeyAiYnJmMHQucyIsIFNIT1JUX0IsIDMsIE1VLCBCUkFOQ0h8UEFSfFJGMCwgMHg0YjAwLCAweDdmMDAsIHsgQU5VTTggfSB9LAotICB7ICJicmYwdC5sIiwgTE9OR19CLCAzLCBNVSwgU0VRLCAweDI1ODAwMDAwLCAweDNmZmYwMDAwLCB7IEFOVU0xNiB9IH0sCi0gIHsgImJzZXRpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg4MDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgImJ0c3RpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4ZTAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJjbHJhYyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTYwMSwgMHg3ZWZmLCB7IEFEU1QgfSB9LAotICB7ICJjbXAiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxXRjAsIDB4NjAwLCAweDdlMDEsIHsgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJjbXAiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgxNjAzLCAweDdlZWYsIHsgQVNSQzIsIEFTUkMgfSB9LAotICB7ICJjbXBlcSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0MDAsIDB4N2UwMSwgeyBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgImNtcGVxIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MTQwMywgMHg3ZWVmLCB7IEFTUkMyLCBBU1JDIH0gfSwKLSAgeyAiY21wZXFpIiwgT1BDT0RFX0ZBS0UsIDAsIDAsIDAsIDAsIDAsIHsgMSwgNCwgMTYsIDAgfSB9LAotICB7ICJjbXBlcWkucyIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0MDEsIDB4N2UwMSwgeyBSU1JDMiwgTlVNNCB9IH0sCi0gIHsgImNtcGVxaS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAiY21waSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKLSAgeyAiY21waS5zIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0YwLCAweDYwMSwgMHg3ZTAxLCB7IFJTUkMyLCBOVU00IH0gfSwKLSAgeyAiY21waS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDMwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAiY21wdSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSfFdGMCwgMHg0NjAwLCAweDdlMDEsIHsgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJjbXB1aSIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgyMzAwMDAwMCwgMHgzZjBmMDAwMCwgeyBSU1JDMiwgVU5VTTE2IH0gfSwKLSAgeyAiY3BmZyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NGUwOSwgMHg3ZmQ5LCB7IEZEU1QsIEZGU1JDIH0gfSwKLSAgeyAiY3BmZyIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NGUwOSwgMHg3ZmQ5LCB7IEZEU1QsIENGU1JDIH0gfSwKLSAgeyAiZGJ0IiwgU0hPUlRfMiwgNSwgTVUsIFBBUiwgMHg1ZjIwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImRpdnMiLCBMT05HX0wsIDEsIEJPVEgsIFNFUSwgMHgxNDAwMjgwMCwgMHgzZjEwZmUyMSwgeyBSRFNURSwgUlNSQyB9IH0sCi0gIHsgImV4ZWYwZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTA0LCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWYwdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTI0LCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWYxZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTQwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWYxdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTQyLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWZhZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTAwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZWZhdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTAyLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZXRhZiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTIwLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4ZXRhdCIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFST05MWSwgMHg0ZTIyLCAweDdmZmYsIHsgMCB9IH0sCi0gIHsgImV4cCIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNTAwMmEwMCwgMHgzZmZmZmUwMywgeyBSRFNULCBSU1JDRSB9IH0sCi0gIHsgImV4cCIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNTAwMmEwMiwgMHgzZmZmZmUwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAiamwiLCBTSE9SVF8yLCAzLCBNVSwgQlJBTkNIX0xJTkt8UEFSLCAweDRkMDAsIDB4N2ZlMSwgeyBSU1JDIH0gfSwKLSAgeyAiam1wIiwgU0hPUlRfMiwgMywgTVUsIEJSQU5DSHxQQVIsIDB4NGMwMCwgMHg3ZmUxLCB7IFJTUkMgfSB9LAotICB7ICJsZCIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMDAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2NDAxLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDLCBNSU5VUyB9IH0sCi0gIHsgImxkIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYwMDEsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJsZCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MDAwLCAweDdlMDEsIHsgUkRTVCwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAibGQydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzMTAwMDAwMCwgMHgzZjEwMDAwMCwgeyBSRFNURSwgQVRQQVIsIE5VTTE2LCBSU1JDIH0gfSwKLSAgeyAibGQydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2NjAxLCAweDdlMjEsIHsgUkRTVEUsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJsZDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDYyMDEsIDB4N2UyMSwgeyBSRFNURSwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKLSAgeyAibGQydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8Uk1FTSwgMHg2MjAwLCAweDdlMjEsIHsgUkRTVEUsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgImxkYiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzODAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZGIiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJNRU0sIDB4NzAwMCwgMHg3ZTAxLCB7IFJEU1QsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgImxkaSIsIE9QQ09ERV9GQUtFLCAwLCAwLCAwLCAwLCAwLCB7IDEsIDQsIDE2LCAwIH0gfSwKLSAgeyAibGRpLnMiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSTUVNLCAweDQwMDEsIDB4N2UwMSAsIHsgUkRTVCwgTlVNNCB9IH0sCi0gIHsgImxkaS5sIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDIwMDAwMDAwLCAweDNmMGYwMDAwLCB7IFJEU1QsIE5VTTE2IH0gfSwKLSAgeyAibGR1YiIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzOTAwMDAwMCwgMHgzZjAwMDAwMCwgeyBSRFNULCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJsZHViIiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxSTUVNLCAweDcyMDAsIDB4N2UwMSwgeyBSRFNULCBBVFNJR04sIFJTUkMgfSB9LAotICB7ICJtYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDJhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtYWNzdSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWEwMCwgMHg3ZTAwLCB7IEFEU1QwLCBSU1JDMiwgUlNSQyB9IH0sCi0gIHsgIm1hY3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNhMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtYXgiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdGMCwgMHgyNjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDAsIDB4N2VlMywgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgIm1heCIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDIsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MjYwMSwgMHg3ZTAxICwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibWluIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4MzYwMSwgMHg3ZWUzICwgeyBBRFNULCBSU1JDRSB9IH0sCi0gIHsgIm1pbiIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDM2MDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibXNiIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXNic3UiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDE4MDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtc2J1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzODAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyZTAwLCAweDdlMDEgLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdWx4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVseHN1IiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxYzAwLCAweDdlMDAsIHsgQURTVDAsIFJTUkMyLCBSU1JDIH0gfSwKLSAgeyAibXVseHUiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNjMDAsIDB4N2UwMCwgeyBBRFNUMCwgUlNSQzIsIFJTUkMgfSB9LAotICB7ICJtdiIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDQwMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXYydyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4NTAwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCi0gIHsgIm12MndmYWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDAsIDB4N2UyZiwgeyBSRFNURSwgQVNSQyB9IH0sCi0gIHsgIm12Mnd0YWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDEsIDB4N2VlMywgeyBSU1JDRSwgQURTVCB9IH0sCi0gIHsgIm12YWMiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDNlMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAibXZiIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHg1NDAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm12ZjBmIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8UkYwLCAweDQ0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibXZmMHQiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUnxSRjAsIDB4NDQwMSwgMHg3ZTAxLCB7IFJEU1QsIFJTUkMgfSB9LAotICB7ICJtdmZhY2ciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDQsIDB4N2UwZiwgeyBSRFNULCBBU1JDIH0gfSwKLSAgeyAibXZmYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUwMCwgMHg3ZTBmLCB7IFJEU1QsIEFTUkMgfSB9LAotICB7ICJtdmZhY2xvIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTAyLCAweDdlMGYsIHsgUkRTVCwgQVNSQyB9IH0sCi0gIHsgIm12ZmMiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDUyMDAsIDB4N2UwMSwgeyBSRFNULCBDU1JDIH0gfSwKLSAgeyAibXZ0YWNnIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgxZTQxLCAweDdlZTEsIHsgUlNSQywgQURTVCB9IH0sCi0gIHsgIm12dGFjaGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDFlMDEsIDB4N2VlMSwgeyBSU1JDLCBBRFNUIH0gfSwKLSAgeyAibXZ0YWNsbyIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MWUyMSwgMHg3ZWUxLCB7IFJTUkMsIEFEU1QgfSB9LAotICB7ICJtdnRjIiwgU0hPUlRfMiwgMSwgTVUsIFBBUiwgMHg1NjAwLCAweDdlMDEsIHsgUlNSQywgQ0RTVCB9IH0sCi0gIHsgIm12dWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU0MDEsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAibmVnIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NDYwNSwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJuZWciLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDU2MDUsIDB4N2VmZiwgeyBBRFNUIH0gfSwKLSAgeyAibm9wIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4NWUwMCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJub3QiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHg0NjAzLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgIm9yIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVIsIDB4ODAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgIm9yMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg0MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgeyAicmFjIiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxXRjAsIDB4NTIwMSwgMHg3ZTIxLCB7IFJEU1RFLCBBU1JDME9OTFksIE5VTTMgfSB9LAotICB7ICJyYWNoaSIsIFNIT1JUXzIsIDEsIElVLCBQQVJ8V0YwLCAweDQyMDEsIDB4N2UwMSwgeyBSRFNULCBBU1JDLCBOVU0zIH0gfSwKLSAgeyAicmVwIiwgTE9OR19MLCAyLCBNVSwgU0VRLCAweDI3MDAwMDAwLCAweDNmZjAwMDAwLCB7IFJTUkMsIEFOVU0xNiB9IH0sCi0gIHsgInJlcGkiLCBMT05HX0wsIDIsIE1VLCBTRVEsIDB4MmYwMDAwMDAsIDB4M2YwMDAwMDAsIHsgVU5VTTgsIEFOVU0xNiB9IH0sCi0gIHsgInJ0ZCIsIFNIT1JUXzIsIDMsIE1VLCBQQVIsIDB4NWY2MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJydGUiLCBTSE9SVF8yLCAzLCBNVSwgUEFSLCAweDVmNDAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAic2FkZCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTIyMywgMHg3ZWVmLCB7IEFEU1QsIEFTUkMgfSB9LAotICB7ICJzZXRmMGYiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFJGMCwgMHg0NjExLCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInNldGYwdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8UkYwLCAweDQ2MTMsIDB4N2UxZiwgeyBSRFNUIH0gfSwKLSAgeyAic2xlZXAiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmYzAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAic2xsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMjAwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInNsbCIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MzIwMCwgMHg3ZWUxLCB7IEFEU1QsIFJTUkMgfSB9LAotICB7ICJzbGxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgyMjAxLCAweDdlMDEsIHsgUkRTVCwgVU5VTTQgfSB9LAotICB7ICJzbGxpIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMjAxLCAweDdlZTEsIHsgQURTVCwgVU5VTTRTIH0gfSwKLSAgeyAic2x4IiwgU0hPUlRfMiwgMSwgSVUsIFBBUnxSRjAsIDB4NDYwYiwgMHg3ZTFmLCB7IFJEU1QgfSB9LAotICB7ICJzcmEiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI0MDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3JhIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzNDAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNyYWkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDI0MDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNyYWkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDM0MDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzcmwiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIwMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAic3JsIiwgU0hPUlRfMiwgMSwgSVUsIFBBUiwgMHgzMDAwLCAweDdlZTEsIHsgQURTVCwgUlNSQyB9IH0sCi0gIHsgInNybGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDIwMDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNCB9IH0sCi0gIHsgInNybGkiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDMwMDEsIDB4N2VlMSwgeyBBRFNULCBVTlVNNFMgfSB9LAotICB7ICJzcngiLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFJGMCwgMHg0NjA5LCAweDdlMWYsIHsgUkRTVCB9IH0sCi0gIHsgInN0IiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweDM0MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJTUkMyLCBBVFBBUiwgTlVNMTYsIFJTUkMgfSB9LAotICB7ICJzdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ODAwLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZjMWYsIDB4N2UxZiwgeyBSU1JDMiwgQVRNSU5VUywgUlNSQyB9IH0sCi0gIHsgInN0IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDY4MDEsIDB4N2UwMSwgeyBSU1JDMiwgQVRTSUdOLCBSU1JDLCBQTFVTIH0gfSwKLSAgeyAic3QiLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmMwMSwgMHg3ZTAxLCB7IFJTUkMyLCBBVFNJR04sIFJTUkMsIE1JTlVTIH0gfSwKLSAgeyAic3QydyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHgzNTAwMDAwMCwgMHgzZjEwMDAwMCwgeyBSU1JDMkUsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgInN0MnciLCBTSE9SVF8yLCAxLCBNVSwgUEFSfFdNRU0sIDB4NmEwMCwgMHg3ZTIxLCB7IFJTUkMyRSwgQVRTSUdOLCBSU1JDIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2ZTFmLCAweDdlM2YsIHsgUlNSQzJFLCBBVE1JTlVTLCBSU1JDIH0gfSwKLSAgeyAic3QydyIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg2YTAxLCAweDdlMjEsIHsgUlNSQzJFLCBBVFNJR04sIFJTUkMsIFBMVVMgfSB9LAotICB7ICJzdDJ3IiwgU0hPUlRfMiwgMSwgTVUsIFBBUnxXTUVNLCAweDZlMDEsIDB4N2UyMSwgeyBSU1JDMkUsIEFUU0lHTiwgUlNSQywgTUlOVVMgfSB9LAotICB7ICJzdGIiLCBMT05HX0wsIDEsIE1VLCBTRVEsIDB4M2MwMDAwMDAsIDB4M2YwMDAwMDAsIHsgUlNSQzIsIEFUUEFSLCBOVU0xNiwgUlNSQyB9IH0sCi0gIHsgInN0YiIsIFNIT1JUXzIsIDEsIE1VLCBQQVJ8V01FTSwgMHg3ODAwLCAweDdlMDEsIHsgUlNSQzIsIEFUU0lHTiwgUlNSQyB9IH0sCi0gIHsgInN0b3AiLCBTSE9SVF8yLCAxLCBNVSwgUEFSLCAweDVmZTAsIDB4N2ZmZiwgeyAwIH0gfSwKLSAgeyAic3ViIiwgU0hPUlRfMiwgMSwgRUlUSEVSLCBQQVJ8V0NBUiwgMHgwLCAweDdlMDEsIHsgUkRTVCwgUlNSQyB9IH0sCi0gIHsgInN1YiIsIFNIT1JUXzIsIDEsIElVLCBQQVIsIDB4MTAwMSwgMHg3ZWUzLCB7IEFEU1QsIFJTUkMgfSB9LAotICB7ICJzdWIiLCBTSE9SVF8yLCAxLCBJVSwgUEFSLCAweDEwMDMsIDB4N2VlZiwgeyBBRFNULCBBU1JDIH0gfSwKLSAgeyAic3ViMnciLCBTSE9SVF8yLCAxLCBJVSwgUEFSfFdDQVIsIDB4MTAwMCwgMHg3ZTIzLCB7IFJEU1RFLCBSU1JDRSB9IH0sCi0gIHsgInN1YmFjMyIsIExPTkdfUiwgMSwgSVUsIFNFUSwgMHgxNzAwMDAwMCwgMHgzZmZmZmUyMiwgeyBSRFNURSwgUlNSQ0UsIEFTUkMwIH0gfSwKLSAgeyAic3ViYWMzIiwgTE9OR19SLCAxLCBJVSwgU0VRLCAweDE3MDAwMDAyLCAweDNmZmZmZTJlLCB7IFJEU1RFLCBBU1JDLCBBU1JDMCB9IH0sCi0gIHsgInN1YmFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEwMDAsIDB4M2ZmZmZlMjIsIHsgUkRTVEUsIFJTUkNFLCBBU1JDMCB9IH0sCi0gIHsgInN1YmFjM3MiLCBMT05HX1IsIDEsIElVLCBTRVEsIDB4MTcwMDEwMDIsIDB4M2ZmZmZlMmUsIHsgUkRTVEUsIEFTUkMsIEFTUkMwIH0gfSwKLSAgeyAic3ViaSIsIFNIT1JUXzIsIDEsIEVJVEhFUiwgUEFSLCAweDEsIDB4N2UwMSwgeyBSRFNULCBVTlVNNFMgfSB9LAotICB7ICJ0cmFwIiwgU0hPUlRfMiwgNSwgTVUsIEJSQU5DSF9MSU5LfFBBUiwgMHg1ZjAwLCAweDdmZTEsIHsgVU5VTTQgfSB9LAotICB7ICJ0c3QwaSIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg3MDAwMDAwLCAweDNmMGYwMDAwLCB7IFJTUkMyLCBOVU0xNiB9IH0sCi0gIHsgInRzdDFpIiwgTE9OR19MLCAxLCBNVSwgU0VRLCAweGYwMDAwMDAsIDB4M2YwZjAwMDAsIHsgUlNSQzIsIE5VTTE2IH0gfSwKLSAgeyAid2FpdCIsIFNIT1JUXzIsIDEsIE1VLCBQQVIsIDB4NWY4MCwgMHg3ZmZmLCB7IDAgfSB9LAotICB7ICJ4b3IiLCBTSE9SVF8yLCAxLCBFSVRIRVIsIFBBUiwgMHhhMDAsIDB4N2UwMSwgeyBSRFNULCBSU1JDIH0gfSwKLSAgeyAieG9yMyIsIExPTkdfTCwgMSwgTVUsIFNFUSwgMHg1MDAwMDAwLCAweDNmMDAwMDAwLCB7IFJEU1QsIFJTUkMsIE5VTTE2IH0gfSwKLSAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCB7IDAgfSB9LAotfTsKLQotCmRpZmYgLS1naXQgYS9vcGNvZGVzL2QzMHYtZGlzLmMgYi9vcGNvZGVzL2QzMHYtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNThiNzUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9kMzB2LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIEQzMFYgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJvcGNvZGUvZDMwdi5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSNkZWZpbmUgUENfTUFTSyAweEZGRkZGRkZGCi0KLXN0YXRpYyBpbnQgbG9va3VwX29wY29kZSBQQVJBTVMgKCggc3RydWN0IGQzMHZfaW5zbiAqaW5zbiwgbG9uZyBudW0sIGludCBpc19sb25nICkpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5zbiBQQVJBTVMgKCggc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm8sIGJmZF92bWEgbWVtYWRkciwgbG9uZyBsb25nIG51bSwgCi0JCQkJIHN0cnVjdCBkMzB2X2luc24gKmluc24sIGludCBpc19sb25nLCBpbnQgc2hvd19leHQgKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfdmFsdWUgUEFSQU1TICgoIGxvbmcgbG9uZyBudW0sIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXIsIGludCBpc19sb25nICkpOwotCi1pbnQgCi1wcmludF9pbnNuX2QzMHYgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBzdGF0dXMsIHJlc3VsdDsKLSAgYmZkX2J5dGUgYnVmZmVyWzEyXTsKLSAgdW5zaWduZWQgbG9uZyBpbjEsaW4yOwotICBzdHJ1Y3QgZDMwdl9pbnNuIGluc247Ci0gIGxvbmcgbG9uZyBudW07Ci0KLSAgaW5zbi5mb3JtID0gKHN0cnVjdCBkMzB2X2Zvcm1hdCAqKU5VTEw7Ci0KLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA4OwotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSA0OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGluMSA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkcis0LCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA4OwotICAgICAgaWYgKCEocmVzdWx0ID0gbG9va3VwX29wY29kZSgmaW5zbiwgaW4xLCAwKSkpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHgleCIsaW4xKTsKLSAgICAgIGVsc2UKLQlwcmludF9pbnNuKGluZm8sIG1lbWFkZHIsIChsb25nIGxvbmcpIGluMSwgJmluc24sIDAsIHJlc3VsdCk7Ci0gICAgICByZXR1cm4gNDsgICAgICAKLSAgICB9Ci0gIGluMiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gIAotICBpZiAoaW4xICYgaW4yICYgRk0wMSkKLSAgICB7Ci0gICAgICAvKiBMT05HIGluc3RydWN0aW9uICovCi0gICAgICBpZiAoIShyZXN1bHQgPSBsb29rdXBfb3Bjb2RlKCZpbnNuLCBpbjEsIDEpKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5sb25nXHQweCV4LDB4JXgiLGluMSxpbjIpOwotCSAgcmV0dXJuIDg7Ci0JfQotICAgICAgbnVtID0gKGxvbmcgbG9uZylpbjEgPDwgMzIgfCBpbjI7Ci0gICAgICBwcmludF9pbnNuKGluZm8sIG1lbWFkZHIsIG51bSwgJmluc24sIDEsIHJlc3VsdCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbnVtID0gaW4xOwotICAgICAgaWYgKCEocmVzdWx0ID0gbG9va3VwX29wY29kZSgmaW5zbiwgaW4xLCAwKSkpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHgleCIsaW4xKTsKLSAgICAgIGVsc2UKLQlwcmludF9pbnNuKGluZm8sIG1lbWFkZHIsIG51bSwgJmluc24sIDAsIHJlc3VsdCk7Ci0gICAgICAKLSAgICAgIHN3aXRjaCAoICgoaW4xPj4zMSk8PDEpIHwgKGluMj4+MzEpICkKLQl7Ci0JY2FzZSAwOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJcdHx8XHQiKTsgICAKLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQtPlx0Iik7ICAgCi0JICBicmVhazsKLQljYXNlIDI6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0PC1cdCIpOyAgIAotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgICAKLSAgICAgIGluc24uZm9ybSA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKilOVUxMOwotICAgICAgbnVtID0gaW4yOwotICAgICAgaWYgKCEocmVzdWx0ID0gbG9va3VwX29wY29kZSgmaW5zbiwgaW4yLCAwKSkpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIubG9uZ1x0MHgleCIsaW4yKTsKLSAgICAgIGVsc2UKLQlwcmludF9pbnNuKGluZm8sIG1lbWFkZHIsIG51bSwgJmluc24sIDAsIHJlc3VsdCk7Ci0KLSAgICB9Ci0gIHJldHVybiA4OwotfQotCi0KLS8qIHJldHVybnMgMCBpZiBsb29rdXAgZmFpbHMgKi8KLS8qIDEgaWYgZm91bmQgYW5kIG9ubHkgb25lIGZvcm0gKi8KLS8qIDIgaWYgZm91bmQgYW5kIHRoZXJlIGFyZSBzaG9ydCBhbmQgbG9uZyBmb3JtcyAqLwotc3RhdGljIGludAotbG9va3VwX29wY29kZSAoaW5zbiwgbnVtLCBpc19sb25nKQotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICppbnNuOwotICAgICBsb25nIG51bTsKLSAgICAgaW50IGlzX2xvbmc7Ci17Ci0gIGludCBpPTAsIGluZGV4OwotICBzdHJ1Y3QgZDMwdl9mb3JtYXQgKmY7Ci0gIHN0cnVjdCBkMzB2X29wY29kZSAqb3AgPSAoc3RydWN0IGQzMHZfb3Bjb2RlICopZDMwdl9vcGNvZGVfdGFibGU7Ci0gIGludCBvcDEgPSAobnVtID4+IDI1KSAmIDB4NzsKLSAgaW50IG9wMiA9IChudW0gPj4gMjApICYgMHgxZjsKLSAgaW50IG1vZCA9IChudW0gPj4gMTgpICYgMHgzOwotCi0gIC8qIGZpbmQgdGhlIG9wY29kZSAqLwotICBkbyB7Ci0gICAgaWYgKChvcC0+b3AxID09IG9wMSkgJiYgKG9wLT5vcDIgPT0gb3AyKSkKLSAgICAgIGJyZWFrOwotICAgIG9wKys7Ci0gIH0gd2hpbGUgKG9wLT5uYW1lKTsKLQotICBpZiAoIW9wIHx8ICFvcC0+bmFtZSkKLSAgICByZXR1cm4gMDsKLQotICB3aGlsZSAob3AtPm9wMSA9PSBvcDEgJiYgb3AtPm9wMiA9PSBvcDIpCi0gICAgewotICAgICAgLyogc2NhbiB0aHJvdWdoIGFsbCB0aGUgZm9ybWF0cyBmb3IgdGhlIG9wY29kZSAgKi8KLSAgICAgIGluZGV4ID0gb3AtPmZvcm1hdFtpKytdOwotICAgICAgZG8gCi0JewotCSAgZiA9IChzdHJ1Y3QgZDMwdl9mb3JtYXQgKikmZDMwdl9mb3JtYXRfdGFibGVbaW5kZXhdOwotCSAgd2hpbGUgKGYtPmZvcm0gPT0gaW5kZXgpCi0JICAgIHsKLQkgICAgICBpZiAoKCFpc19sb25nIHx8IGYtPmZvcm0gPj0gTE9ORykgJiYgKGYtPm1vZGlmaWVyID09IG1vZCkpCi0JCXsKLQkJICBpbnNuLT5mb3JtID0gZjsKLQkJICBicmVhazsKLQkJfQotCSAgICAgIGYrKzsKLQkgICAgfQotCSAgaWYgKGluc24tPmZvcm0pCi0JICAgIGJyZWFrOwotCX0gd2hpbGUgKChpbmRleCA9IG9wLT5mb3JtYXRbaSsrXSkgIT0gMCk7Ci0gICAgICBpZiAoaW5zbi0+Zm9ybSkKLQlicmVhazsKLSAgICAgIG9wKys7Ci0gICAgICBpPTA7Ci0gICAgfQotICBpZiAoaW5zbi0+Zm9ybSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIGluc24tPm9wID0gb3A7Ci0gIGluc24tPmVjYyA9IChudW0gPj4gMjgpICYgMHg3OwotICBpZiAob3AtPmZvcm1hdFsxXSkKLSAgICByZXR1cm4gMjsKLSAgZWxzZQotICAgIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyB2b2lkIAotcHJpbnRfaW5zbiAoIGluZm8sIG1lbWFkZHIsIG51bSwgaW5zbiwgaXNfbG9uZywgc2hvd19leHQgKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBsb25nIGxvbmcgbnVtOwotICAgICBzdHJ1Y3QgZDMwdl9pbnNuICppbnNuOwotICAgICBpbnQgaXNfbG9uZzsKLSAgICAgaW50IHNob3dfZXh0OwotewotICBpbnQgdmFsLCBvcG51bSwgbmVlZF9jb21tYT0wOwotICBzdHJ1Y3QgZDMwdl9vcGVyYW5kICpvcGVyOwotICBpbnQgaSwgbWF0Y2gsIG9waW5kPTAsIG5lZWRfcGFyZW49MCwgZm91bmRfY29udHJvbD0wOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLGluc24tPm9wLT5uYW1lKTsKLQotICAvKiBjaGVjayBmb3IgQ01QIG9yIENNUFUgKi8KLSAgaWYgKGQzMHZfb3BlcmFuZF90YWJsZVtpbnNuLT5mb3JtLT5vcGVyYW5kc1swXV0uZmxhZ3MgJiBPUEVSQU5EX05BTUUpCi0gICAgewotICAgICAgb3BpbmQrKzsKLSAgICAgIHZhbCA9IGV4dHJhY3RfdmFsdWUobnVtLChzdHJ1Y3QgZDMwdl9vcGVyYW5kICopJmQzMHZfb3BlcmFuZF90YWJsZVtpbnNuLT5mb3JtLT5vcGVyYW5kc1swXV0saXNfbG9uZyk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIixkMzB2X2NjX25hbWVzW3ZhbF0pOwotICAgIH0KLQotICAvKiBhZGQgaW4gIi5zIiBvciAiLmwiICovCi0gIGlmIChzaG93X2V4dCA9PSAyKQotICAgIHsKLSAgICAgIGlmIChpc19sb25nKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmwiKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi5zIik7Ci0gICAgfQotCi0gIGlmIChpbnNuLT5lY2MpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIvJXMiLGQzMHZfZWNjX25hbWVzW2luc24tPmVjY10pOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotICB3aGlsZSAoKG9wbnVtID0gaW5zbi0+Zm9ybS0+b3BlcmFuZHNbb3BpbmQrK10pICE9IDApCi0gICAgewotICAgICAgaW50IGJpdHM7Ci0gICAgICBvcGVyID0gKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW29wbnVtXTsKLSAgICAgIGJpdHMgPSBvcGVyLT5iaXRzOwotICAgICAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSElGVCkKLQliaXRzICs9IDM7Ci0KLSAgICAgIGlmIChuZWVkX2NvbW1hICYmIG9wZXItPmZsYWdzICE9IE9QRVJBTkRfUExVUyAmJiBvcGVyLT5mbGFncyAhPSBPUEVSQU5EX01JTlVTKQotCXsKLQkgIG5lZWRfY29tbWE9MDsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCAiKTsKLQl9Ci0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX0FUTUlOVVMpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJALSIpOwotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfTUlOVVMpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItIik7ICAgCi0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAob3Blci0+ZmxhZ3MgPT0gT1BFUkFORF9QTFVTKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKyIpOyAgIAotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRTSUdOKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiQCIpOyAgIAotCSAgY29udGludWU7Ci0JfQotICAgICAgaWYgKG9wZXItPmZsYWdzID09IE9QRVJBTkRfQVRQQVIpCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCIpOyAgIAotCSAgbmVlZF9wYXJlbiA9IDE7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmIChvcGVyLT5mbGFncyA9PSBPUEVSQU5EX1NQRUNJQUwpCi0JY29udGludWU7Ci0KLSAgICAgIHZhbCA9IGV4dHJhY3RfdmFsdWUobnVtLCBvcGVyLCBpc19sb25nKTsKLSAgICAgIAotICAgICAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9SRUcpCi0JewotCSAgbWF0Y2ggPSAwOwotCSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9DT05UUk9MKQotCSAgICB7Ci0JICAgICAgc3RydWN0IGQzMHZfb3BlcmFuZCAqb3BlcjMgPSAKLQkJKHN0cnVjdCBkMzB2X29wZXJhbmQgKikmZDMwdl9vcGVyYW5kX3RhYmxlW2luc24tPmZvcm0tPm9wZXJhbmRzWzJdXTsJICAgICAgCi0JICAgICAgaW50IGlkID0gZXh0cmFjdF92YWx1ZSAobnVtLCBvcGVyMywgaXNfbG9uZyApOwotCSAgICAgIGZvdW5kX2NvbnRyb2wgPSAxOwotCSAgICAgIHN3aXRjaCAoIGlkICkKLQkJewotCQljYXNlIDA6Ci0JCSAgdmFsIHw9IE9QRVJBTkRfQ09OVFJPTDsKLQkJICBicmVhazsKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCSAgdmFsID0gT1BFUkFORF9DT05UUk9MICsgTUFYX0NPTlRST0xfUkVHICsgaWQ7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgMzoKLQkJICB2YWwgfD0gT1BFUkFORF9GTEFHOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgIGZwcmludGYoc3RkZXJyLCJpbGxlZ2FsIGlkICglZClcbiIsaWQpOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9BQ0MpCi0JICAgIHZhbCB8PSBPUEVSQU5EX0FDQzsKLQkgIGVsc2UgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9GTEFHKQotCSAgICB2YWwgfD0gT1BFUkFORF9GTEFHOwotCSAgZm9yIChpPTA7aTxyZWdfbmFtZV9jbnQoKTtpKyspCi0JICAgIHsKLQkgICAgICBpZiAodmFsID09IHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS52YWx1ZSkKLQkJewotCQkgIGlmIChwcmVfZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkJICAgICAgKGluZm8tPnN0cmVhbSwgIiVzIixwcmVfZGVmaW5lZF9yZWdpc3RlcnNbaV0ucG5hbWUpOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkgICAgICAoaW5mby0+c3RyZWFtLCAiJXMiLHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tpXS5uYW1lKTsKLQkJICBtYXRjaD0xOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLQkgIGlmIChtYXRjaD09MCkKLQkgICAgewotCSAgICAgIC8qIHRoaXMgd291bGQgb25seSBnZXQgZXhlY3V0ZWQgaWYgYSByZWdpc3RlciB3YXMgbm90IGluIHRoZSAKLQkJIHJlZ2lzdGVyIHRhYmxlICovCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCShpbmZvLT5zdHJlYW0sIF8oIjx1bmtub3duIHJlZ2lzdGVyICVkPiIpLCB2YWwgJiAweDNGKTsJICAgICAgCi0JICAgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLT5vcC0+cmVsb2NfZmxhZyA9PSBSRUxPQ19QQ1JFTCB8fCAKLQkgICAgICAgKG9waW5kID09IDEgJiYgKGluc24tPmZvcm0tPmZvcm0gPT0gU0hPUlRfRDIgfHwgaW5zbi0+Zm9ybS0+Zm9ybSA9PSBMT05HX0QpKSkKLQl7Ci0JICBsb25nIG1heDsKLQkgIGludCBuZWc9MDsKLQkgIG1heCA9ICgxIDw8IChiaXRzIC0gMSkpOwotCSAgaWYgKHZhbCAmIG1heCkKLQkgICAgewotCSAgICAgIGlmIChiaXRzID09IDMyKQotCQl2YWwgPSAtdmFsOwotCSAgICAgIGVsc2UKLQkJdmFsID0gLXZhbCAmICgoMSA8PCBiaXRzKS0xKTsKLQkgICAgICBuZWcgPSAxOwotCSAgICB9Ci0JICBpZiAob3BpbmQgPT0gMSAmJiAoaW5zbi0+Zm9ybS0+Zm9ybSA9PSBTSE9SVF9EMiB8fCBpbnNuLT5mb3JtLT5mb3JtID09IExPTkdfRCkpCi0JICAgIHsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4Iix2YWwpOwotCSAgICB9Ci0JICBlbHNlIHsKLQkgICAgaWYgKG5lZykKLQkgICAgICB7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSV4XHQoIix2YWwpOwotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChtZW1hZGRyIC0gdmFsKSAmIFBDX01BU0ssIGluZm8pOwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXhcdCgiLHZhbCk7Ci0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKG1lbWFkZHIgKyB2YWwpICYgUENfTUFTSywgaW5mbyk7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICAgIH0KLQkgIH0KLQl9Ci0gICAgICBlbHNlIGlmIChpbnNuLT5vcC0+cmVsb2NfZmxhZyA9PSBSRUxPQ19BQlMpCi0JewotCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwsIGluZm8pOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBpZiAob3Blci0+ZmxhZ3MgJiBPUEVSQU5EX1NJR05FRCkKLQkgICAgewotCSAgICAgIGludCBtYXggPSAoMSA8PCAoYml0cyAtIDEpKTsKLQkgICAgICBpZiAodmFsICYgbWF4KQotCQl7Ci0JCSAgdmFsID0gLXZhbDsKLQkJICBpZiAoYml0cyA8IDMyKQotCQkgICAgdmFsICY9ICgoMSA8PCBiaXRzKSAtIDEpOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSIpOwotCQl9Ci0JICAgIH0KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsdmFsKTsKLQl9Ci0gICAgICAvKiBpZiB0aGVyZSBpcyBhbm90aGVyIG9wZXJhbmQsIHRoZW4gd3JpdGUgYSBjb21tYSBhbmQgc3BhY2UgKi8KLSAgICAgIGlmIChpbnNuLT5mb3JtLT5vcGVyYW5kc1tvcGluZF0gJiYgIShmb3VuZF9jb250cm9sICYmIG9waW5kID09IDIpKQotCW5lZWRfY29tbWEgPSAxOwotICAgIH0KLSAgaWYgKG5lZWRfcGFyZW4pCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIpIik7Ci19Ci0KLQotCi1zdGF0aWMgaW50Ci1leHRyYWN0X3ZhbHVlIChudW0sIG9wZXIsIGlzX2xvbmcpCi0gICAgIGxvbmcgbG9uZyBudW07Ci0gICAgIHN0cnVjdCBkMzB2X29wZXJhbmQgKm9wZXI7Ci0gICAgIGludCBpc19sb25nOwotewotICBpbnQgdmFsOwotICBpbnQgc2hpZnQgPSAxMiAtIG9wZXItPnBvc2l0aW9uOwotICBpbnQgbWFzayA9ICgweEZGRkZGRkZGID4+ICgzMiAtIG9wZXItPmJpdHMpKTsKLQotICBpZiAoaXNfbG9uZykKLSAgICB7Ci0gICAgICBpZiAob3Blci0+Yml0cyA9PSAzMikgCi0JewotCSAgLyogcGllY2UgdG9nZXRoZXIgMzItYml0IGNvbnN0YW50ICovCi0JICB2YWwgPSAoKG51bSAmIDB4M0ZGRkYpCi0JCSB8ICgobnVtICYgMHhGRjAwMDAwKSA+PiAyKQotCQkgfCAoKG51bSAmIDB4M0YwMDAwMDAwMExMKSA+PiA2KSk7Ci0JfQotICAgICAgZWxzZQkKLQl2YWwgPSAobnVtID4+ICgzMiArIHNoaWZ0KSkgJiBtYXNrOwkKLSAgICB9Ci0gIGVsc2UKLSAgICB2YWwgPSAobnVtID4+IHNoaWZ0KSAmIG1hc2s7Ci0KLSAgaWYgKG9wZXItPmZsYWdzICYgT1BFUkFORF9TSElGVCkKLSAgICB2YWwgPDw9IDM7Ci0KLSAgcmV0dXJuIHZhbDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZDMwdi1vcGMuYyBiL29wY29kZXMvZDMwdi1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2NWU3Yy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2QzMHYtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLyogZDMwdi1vcGMuYyAtLSBEMzBWIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgMTk5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgTWFydGluIEh1bnQsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL2QzMHYuaCIKLQotCi0vKiBUaGlzIHRhYmxlIGlzIHNvcnRlZC4gKi8KLS8qIElmIHlvdSBhZGQgYW55dGhpbmcsIGl0IE1VU1QgYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyICovCi0vKiBUaGUgZmlyc3QgZmllbGQgaXMgdGhlIG5hbWUgdGhlIGFzc2VtYmxlciB1c2VzIHdoZW4gbG9va2luZyAqLwotLyogdXAgb3Jjb2Rlcy4gIFRoZSBzZWNvbmQgZmllbGQgaXMgdGhlIG5hbWUgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIHVzZS4gKi8KLS8qIFRoaXMgYWxsb3dzIHRoZSBhc3NlbWJsZXIgdG8gYXNzZW1ibGUgcmVmZXJlbmNlcyB0byByNjMgKGZvciBleGFtcGxlKSAqLwotLyogb3IgInNwIi4gIFRoZSBkaXNhc3NlbWJsZXIgd2lsbCBhbHdheXMgdXNlIHRoZSBwcmVmZXJyZWQgZm9ybSAoc3ApICovCi1jb25zdCBzdHJ1Y3QgcGRfcmVnIHByZV9kZWZpbmVkX3JlZ2lzdGVyc1tdID0KLXsKLSAgeyAiYTAiLCBOVUxMLCBPUEVSQU5EX0FDQyswIH0sCi0gIHsgImExIiwgTlVMTCwgT1BFUkFORF9BQ0MrMSB9LAotICB7ICJicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJicHN3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEgfSwKLSAgeyAiYyIsICJjIiwgT1BFUkFORF9GTEFHKzcgfSwKLSAgeyAiY3IwIiwgInBzdyIsIE9QRVJBTkRfQ09OVFJPTCB9LAotICB7ICJjcjEiLCAiYnBzdyIsIE9QRVJBTkRfQ09OVFJPTCsxIH0sCi0gIHsgImNyMTAiLCAibW9kX3MiLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAiY3IxMSIsICJtb2RfZSIsIE9QRVJBTkRfQ09OVFJPTCsxMSB9LAotICB7ICJjcjEyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzEyIH0sCi0gIHsgImNyMTMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTMgfSwKLSAgeyAiY3IxNCIsICJpYmEiLCBPUEVSQU5EX0NPTlRST0wrMTQgfSwKLSAgeyAiY3IxNSIsICJlaXRfdmIiLCBPUEVSQU5EX0NPTlRST0wrMTUgfSwKLSAgeyAiY3IxNiIsICJpbnRfcyIsIE9QRVJBTkRfQ09OVFJPTCsxNiB9LAotICB7ICJjcjE3IiwgImludF9tIiwgT1BFUkFORF9DT05UUk9MKzE3IH0sCi0gIHsgImNyMTgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTggfSwKLSAgeyAiY3IxOSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxOSB9LAotICB7ICJjcjIiLCAicGMiLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJjcjIwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIwIH0sCi0gIHsgImNyMjEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjEgfSwKLSAgeyAiY3IyMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyMiB9LAotICB7ICJjcjIzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzIzIH0sCi0gIHsgImNyMjQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjQgfSwKLSAgeyAiY3IyNSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyNSB9LAotICB7ICJjcjI2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI2IH0sCi0gIHsgImNyMjciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMjcgfSwKLSAgeyAiY3IyOCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsyOCB9LAotICB7ICJjcjI5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzI5IH0sCi0gIHsgImNyMyIsICJicGMiLCBPUEVSQU5EX0NPTlRST0wrMyB9LAotICB7ICJjcjMwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMwIH0sCi0gIHsgImNyMzEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzEgfSwKLSAgeyAiY3IzMiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszMiB9LAotICB7ICJjcjMzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzMzIH0sCi0gIHsgImNyMzQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzQgfSwKLSAgeyAiY3IzNSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszNSB9LAotICB7ICJjcjM2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM2IH0sCi0gIHsgImNyMzciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMzcgfSwKLSAgeyAiY3IzOCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCszOCB9LAotICB7ICJjcjM5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzM5IH0sCi0gIHsgImNyNCIsICJkcHN3IiwgT1BFUkFORF9DT05UUk9MKzQgfSwKLSAgeyAiY3I0MCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MCB9LAotICB7ICJjcjQxIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQxIH0sCi0gIHsgImNyNDIiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDIgfSwKLSAgeyAiY3I0MyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0MyB9LAotICB7ICJjcjQ0IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ0IH0sCi0gIHsgImNyNDUiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDUgfSwKLSAgeyAiY3I0NiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0NiB9LAotICB7ICJjcjQ3IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzQ3IH0sCi0gIHsgImNyNDgiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNDggfSwKLSAgeyAiY3I0OSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0OSB9LAotICB7ICJjcjUiLCJkcGMiLCBPUEVSQU5EX0NPTlRST0wrNSB9LAotICB7ICJjcjUwIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUwIH0sCi0gIHsgImNyNTEiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTEgfSwKLSAgeyAiY3I1MiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1MiB9LAotICB7ICJjcjUzIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUzIH0sCi0gIHsgImNyNTQiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTQgfSwKLSAgeyAiY3I1NSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1NSB9LAotICB7ICJjcjU2IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU2IH0sCi0gIHsgImNyNTciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNTcgfSwKLSAgeyAiY3I1OCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs1OCB9LAotICB7ICJjcjU5IiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzU5IH0sCi0gIHsgImNyNiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2IH0sCi0gIHsgImNyNjAiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjAgfSwKLSAgeyAiY3I2MSIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs2MSB9LAotICB7ICJjcjYyIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzYyIH0sCi0gIHsgImNyNjMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrNjMgfSwKLSAgeyAiY3I3IiwgInJwdF9jIiwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAiY3I4IiwgInJwdF9zIiwgT1BFUkFORF9DT05UUk9MKzggfSwKLSAgeyAiY3I5IiwgInJwdF9lIiwgT1BFUkFORF9DT05UUk9MKzkgfSwKLSAgeyAiZHBjIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzUgfSwKLSAgeyAiZHBzdyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs0IH0sCi0gIHsgImVpdF92YiIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCsxNSB9LAotICB7ICJmMCIsIE5VTEwsIE9QRVJBTkRfRkxBRyswIH0sCi0gIHsgImYxIiwgTlVMTCwgT1BFUkFORF9GTEFHKzEgfSwKLSAgeyAiZjIiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrMiB9LAotICB7ICJmMyIsIE5VTEwsIE9QRVJBTkRfRkxBRyszIH0sCi0gIHsgImY0IiwgInMiLCBPUEVSQU5EX0ZMQUcrNCB9LAotICB7ICJmNSIsICJ2IiwgT1BFUkFORF9GTEFHKzUgfSwKLSAgeyAiZjYiLCAidmEiLCBPUEVSQU5EX0ZMQUcrNiB9LAotICB7ICJmNyIsICJjIiwgT1BFUkFORF9GTEFHKzcgfSwKLSAgeyAiaWJhIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE0IH0sCi0gIHsgImludF9tIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE3IH0sCi0gIHsgImludF9zIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzE2IH0sCi0gIHsgImxpbmsiLCAicjYyIiwgNjIgfSwKLSAgeyAibW9kX2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTEgfSwKLSAgeyAibW9kX3MiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMTAgfSwKLSAgeyAicGMiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrMiB9LAotICB7ICJwc3ciLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wgfSwKLSAgeyAicHN3aCIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCtNQVhfQ09OVFJPTF9SRUcrMiB9LAotICB7ICJwc3dsIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MK01BWF9DT05UUk9MX1JFRysxIH0sCi0gIHsgInIwIiwgTlVMTCwgMCB9LAotICB7ICJyMSIsIE5VTEwsIDEgfSwKLSAgeyAicjEwIiwgTlVMTCwgMTAgfSwKLSAgeyAicjExIiwgTlVMTCwgMTEgfSwKLSAgeyAicjEyIiwgTlVMTCwgMTIgfSwKLSAgeyAicjEzIiwgTlVMTCwgMTMgfSwKLSAgeyAicjE0IiwgTlVMTCwgMTQgfSwKLSAgeyAicjE1IiwgTlVMTCwgMTUgfSwKLSAgeyAicjE2IiwgTlVMTCwgMTYgfSwKLSAgeyAicjE3IiwgTlVMTCwgMTcgfSwKLSAgeyAicjE4IiwgTlVMTCwgMTggfSwKLSAgeyAicjE5IiwgTlVMTCwgMTkgfSwKLSAgeyAicjIiLCBOVUxMLCAyIH0sCi0gIHsgInIyMCIsIE5VTEwsIDIwIH0sCi0gIHsgInIyMSIsIE5VTEwsIDIxIH0sCi0gIHsgInIyMiIsIE5VTEwsIDIyIH0sCi0gIHsgInIyMyIsIE5VTEwsIDIzIH0sCi0gIHsgInIyNCIsIE5VTEwsIDI0IH0sCi0gIHsgInIyNSIsIE5VTEwsIDI1IH0sCi0gIHsgInIyNiIsIE5VTEwsIDI2IH0sCi0gIHsgInIyNyIsIE5VTEwsIDI3IH0sCi0gIHsgInIyOCIsIE5VTEwsIDI4IH0sCi0gIHsgInIyOSIsIE5VTEwsIDI5IH0sCi0gIHsgInIzIiwgTlVMTCwgMyB9LAotICB7ICJyMzAiLCBOVUxMLCAzMCB9LAotICB7ICJyMzEiLCBOVUxMLCAzMSB9LAotICB7ICJyMzIiLCBOVUxMLCAzMiB9LAotICB7ICJyMzMiLCBOVUxMLCAzMyB9LAotICB7ICJyMzQiLCBOVUxMLCAzNCB9LAotICB7ICJyMzUiLCBOVUxMLCAzNSB9LAotICB7ICJyMzYiLCBOVUxMLCAzNiB9LAotICB7ICJyMzciLCBOVUxMLCAzNyB9LAotICB7ICJyMzgiLCBOVUxMLCAzOCB9LAotICB7ICJyMzkiLCBOVUxMLCAzOSB9LAotICB7ICJyNCIsIE5VTEwsIDQgfSwKLSAgeyAicjQwIiwgTlVMTCwgNDAgfSwKLSAgeyAicjQxIiwgTlVMTCwgNDEgfSwKLSAgeyAicjQyIiwgTlVMTCwgNDIgfSwKLSAgeyAicjQzIiwgTlVMTCwgNDMgfSwKLSAgeyAicjQ0IiwgTlVMTCwgNDQgfSwKLSAgeyAicjQ1IiwgTlVMTCwgNDUgfSwKLSAgeyAicjQ2IiwgTlVMTCwgNDYgfSwKLSAgeyAicjQ3IiwgTlVMTCwgNDcgfSwKLSAgeyAicjQ4IiwgTlVMTCwgNDggfSwKLSAgeyAicjQ5IiwgTlVMTCwgNDkgfSwKLSAgeyAicjUiLCBOVUxMLCA1IH0sCi0gIHsgInI1MCIsIE5VTEwsIDUwIH0sCi0gIHsgInI1MSIsIE5VTEwsIDUxIH0sCi0gIHsgInI1MiIsIE5VTEwsIDUyIH0sCi0gIHsgInI1MyIsIE5VTEwsIDUzIH0sCi0gIHsgInI1NCIsIE5VTEwsIDU0IH0sCi0gIHsgInI1NSIsIE5VTEwsIDU1IH0sCi0gIHsgInI1NiIsIE5VTEwsIDU2IH0sCi0gIHsgInI1NyIsIE5VTEwsIDU3IH0sCi0gIHsgInI1OCIsIE5VTEwsIDU4IH0sCi0gIHsgInI1OSIsIE5VTEwsIDU5IH0sCi0gIHsgInI2IiwgTlVMTCwgNiB9LAotICB7ICJyNjAiLCBOVUxMLCA2MCB9LAotICB7ICJyNjEiLCBOVUxMLCA2MSB9LAotICB7ICJyNjIiLCAibGluayIsIDYyIH0sCi0gIHsgInI2MyIsICJzcCIsIDYzIH0sCi0gIHsgInI3IiwgTlVMTCwgNyB9LAotICB7ICJyOCIsIE5VTEwsIDggfSwKLSAgeyAicjkiLCBOVUxMLCA5IH0sCi0gIHsgInJwdF9jIiwgTlVMTCwgT1BFUkFORF9DT05UUk9MKzcgfSwKLSAgeyAicnB0X2UiLCBOVUxMLCBPUEVSQU5EX0NPTlRST0wrOSB9LAotICB7ICJycHRfcyIsIE5VTEwsIE9QRVJBTkRfQ09OVFJPTCs4IH0sCi0gIHsgInMiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNCB9LAotICB7ICJzcCIsIE5VTEwsIDYzIH0sCi0gIHsgInYiLCBOVUxMLCBPUEVSQU5EX0ZMQUcrNSB9LAotICB7ICJ2YSIsIE5VTEwsIE9QRVJBTkRfRkxBRys2IH0sCi19OwotCi1pbnQgCi1yZWdfbmFtZV9jbnQoKQotewotICByZXR1cm4gKHNpemVvZihwcmVfZGVmaW5lZF9yZWdpc3RlcnMpIC8gc2l6ZW9mKHN0cnVjdCBwZF9yZWcpKTsKLX0KLQotLyogT1BDT0RFIFRBQkxFICovCi0vKiBUaGUgZm9ybWF0IG9mIHRoaXMgdGFibGUgaXMgZGVmaW5lZCBpbiBvcGNvZGUvZDMwdi5oICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9vcGNvZGUgZDMwdl9vcGNvZGVfdGFibGVbXSA9IHsKLSAgeyAiYWJzIiwgSUFMVTEsIDB4OCwgeyBTSE9SVF9VIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhZGQiLCBJQUxVMSwgMHgwLCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIDAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGQyaCIsIElBTFUxLCAweDEsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhZGRjIiwgSUFMVTEsIDB4NCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19DLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxsbCIsIElBTFUxLCAweDEwLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhsbGgiLCBJQUxVMSwgMHgxMSwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRobGhsIiwgSUFMVTEsIDB4MTIsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGxoaCIsIElBTFUxLCAweDEzLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhobGwiLCBJQUxVMSwgMHgxNCwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRoaGxoIiwgSUFMVTEsIDB4MTUsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCBGTEFHX0NWVkEsIDAgfSwKLSAgeyAiYWRkaGhobCIsIElBTFUxLCAweDE2LCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZGhoaGgiLCBJQUxVMSwgMHgxNywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgRkxBR19BRERTVUJwcHAsIEZMQUdfQ1ZWQSwgMCB9LAotICB7ICJhZGRzIiwgSUFMVTEsIDB4NiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgImFkZHMyaCIsIElBTFUxLCAweDcsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYW5kIiwgTE9HSUMsIDB4MTgsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiYW5kZmciLCBMT0dJQywgMHg4LCB7IFNIT1JUX0YgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImF2ZyIsIElBTFUxLCAweGEsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJhdmcyaCIsIElBTFUxLCAweGIsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJiY2xyIiwgTE9HSUMsIDB4MywgeyBTSE9SVF9BIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImJub3QiLCBMT0dJQywgMHgxLCB7IFNIT1JUX0EgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiYnJhIiwgQlJBLCAwLCB7IFNIT1JUX0IxLCBTSE9SVF9CMiwgTE9OR19VIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnJhdG56IiwgQlJBLCAweDQsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnJhdHpyIiwgQlJBLCAweDQsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAsIDAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImJzZXQiLCBMT0dJQywgMHgyLCB7IFNIT1JUX0EgfSwgRUlUSEVSX0JVVF9QUkVGRVJfTVUsIDAsIDAsIDAgfSwKLSAgeyAiYnNyIiwgQlJBLCAweDIsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJic3J0bnoiLCBCUkEsIDB4NiwgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJic3J0enIiLCBCUkEsIDB4NiwgeyBTSE9SVF9CMywgTE9OR18yIH0sIE1VLCBGTEFHX0pTUiwgMCwgUkVMT0NfUENSRUwgfSwKLSAgeyAiYnRzdCIsIExPR0lDLCAwLCB7IFNIT1JUX0FGIH0sIEVJVEhFUl9CVVRfUFJFRkVSX01VLCAwLCAwLCAwIH0sCi0gIHsgImNtcCIsIExPR0lDLCAweEMsIHsgU0hPUlRfQ01QLCBMT05HX0NNUCB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiY21wdSIsIExPR0lDLCAweEQsIHsgU0hPUlRfQ01QVSwgTE9OR19DTVAgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImRicmEiLCBCUkEsIDB4MTAsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KTVAgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnJhaSIsIEJSQSwgMHgxNCwgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pNUCB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRic3IiLCBCUkEsIDB4MTIsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJkYnNyaSIsIEJSQSwgMHgxNiwgeyBTSE9SVF9EMiwgTE9OR19EIH0sIE1VLCBGTEFHX0pTUiB8IEZMQUdfREVMQVksIEZMQUdfUlAsIFJFTE9DX1BDUkVMIH0sCi0gIHsgImRidCIsIEJSQSwgMHhiLCB7IFNIT1JUX05PTkUgfSwgTVUsIEZMQUdfSlNSLCBGTEFHX0xLUiwgMCB9LAotICB7ICJkam1wIiwgQlJBLCAweDExLCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCi0gIHsgImRqbXBpIiwgQlJBLCAweDE1LCB7IFNIT1JUX0QyLCBMT05HX0QgfSwgTVUsIEZMQUdfSk1QIHwgRkxBR19ERUxBWSwgRkxBR19SUCwgUkVMT0NfQUJTIH0sCi0gIHsgImRqc3IiLCBCUkEsIDB4MTMsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiZGpzcmkiLCBCUkEsIDB4MTcsIHsgU0hPUlRfRDIsIExPTkdfRCB9LCBNVSwgRkxBR19KU1IgfCBGTEFHX0RFTEFZLCBGTEFHX1JQLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wIiwgQlJBLCAweDEsIHsgU0hPUlRfQjEsIFNIT1JUX0IyLCBMT05HX1UgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam1wdG56IiwgQlJBLCAweDUsIHsgU0hPUlRfQjNiLCBMT05HXzJiIH0sIE1VLCBGTEFHX0pNUCwgMCwgUkVMT0NfQUJTIH0sCi0gIHsgImptcHR6ciIsIEJSQSwgMHg1LCB7IFNIT1JUX0IzLCBMT05HXzIgfSwgTVUsIEZMQUdfSk1QLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAiam9pbmxsIiwgSUFMVTEsIDB4QywgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqb2lubGgiLCBJQUxVMSwgMHhELCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgImpvaW5obCIsIElBTFUxLCAweEUsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAiam9pbmhoIiwgSUFMVTEsIDB4RiwgeyBTSE9SVF9BLCBMT05HIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJqc3IiLCBCUkEsIDB4MywgeyBTSE9SVF9CMSwgU0hPUlRfQjIsIExPTkdfVSB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJqc3J0bnoiLCBCUkEsIDB4NywgeyBTSE9SVF9CM2IsIExPTkdfMmIgfSwgTVUsIEZMQUdfSlNSLCAwLCBSRUxPQ19BQlMgfSwKLSAgeyAianNydHpyIiwgQlJBLCAweDcsIHsgU0hPUlRfQjMsIExPTkdfMiB9LCBNVSwgRkxBR19KU1IsIDAsIFJFTE9DX0FCUyB9LAotICB7ICJsZDJoIiwgSU1FTSwgMHgzLCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZDJ3IiwgSU1FTSwgMHg2LCB7IFNIT1JUX00yLCBMT05HX00yIH0sIE1VLCBGTEFHX01FTSB8IEZMQUdfMldPUkQsIDAsIDAgfSwKLSAgeyAibGQ0YmgiLCBJTUVNLCAweDUsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNIHwgRkxBR18yV09SRCwgMCwgMCB9LAotICB7ICJsZDRiaHUiLCBJTUVNLCAweGQsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkYiIsIElNRU0sIDAsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZGJ1IiwgSU1FTSwgMHg5LCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRoIiwgSU1FTSwgMHgyLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgRkxBR19NRU0sIDAsIDAgfSwKLSAgeyAibGRoaCIsIElNRU0sIDB4MSwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIEZMQUdfTUVNLCAwLCAwIH0sCi0gIHsgImxkaHUiLCBJTUVNLCAweGEsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJsZHciLCBJTUVNLCAweDQsIHsgU0hPUlRfTSwgTE9OR19NIH0sIE1VLCBGTEFHX01FTSwgMCwgMCB9LAotICB7ICJtYWMwIiwgSUFMVTIsIDB4MTQsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtYWMxIiwgSUFMVTIsIDB4MTQsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibWFjczAiLCBJQUxVMiwgMHgxNSwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1hY3MxIiwgSUFMVTIsIDB4MTUsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibW9kZGVjIiwgSU1FTSwgMHg3LCB7IFNIT1JUX01PRERFQyB9LCBNVSwgMCwgMCwgMCB9LAotICB7ICJtb2RpbmMiLCBJTUVNLCAweDcsIHsgU0hPUlRfTU9ESU5DIH0sIE1VLCAwLCAwLCAwIH0sCi0gIHsgIm1zdWIwIiwgSUFMVTIsIDB4MTYsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtc3ViMSIsIElBTFUyLCAweDE2LCB7IFNIT1JUX0ExIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm1zdWJzMCIsIElBTFUyLCAweDE3LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXN1YnMxIiwgSUFMVTIsIDB4MTcsIHsgU0hPUlRfQTEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXVsIiwgSUFMVTIsIDB4MTAsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwzMiwgMCwgMCB9LAotICB7ICJtdWwyaCIsIElBTFUyLCAwLCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhsbCIsIElBTFUyLCAweDQsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWxoeGxoIiwgSUFMVTIsIDB4NSwgeyBTSE9SVF9BIH0sIElVLCBGTEFHX01VTDE2LCAwLCAwIH0sCi0gIHsgIm11bGh4aGwiLCBJQUxVMiwgMHg2LCB7IFNIT1JUX0EgfSwgSVUsIEZMQUdfTVVMMTYsIDAsIDAgfSwKLSAgeyAibXVsaHhoaCIsIElBTFUyLCAweDcsIHsgU0hPUlRfQSB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWx4IiwgSUFMVTIsIDB4MTgsIHsgU0hPUlRfQUEgfSwgSVUsIEZMQUdfTVVMMzIsIDAsIDAgfSwKLSAgeyAibXVseDJoIiwgSUFMVTIsIDB4MSwgeyBTSE9SVF9BMiB9LCBJVSwgRkxBR19NVUwxNiwgMCwgMCB9LAotICB7ICJtdWx4cyIsIElBTFUyLCAweDE5LCB7IFNIT1JUX0FBIH0sIElVLCBGTEFHX01VTDMyLCAwLCAwIH0sCi0gIHsgIm12ZmFjYyIsIElBTFUyLCAweDFmLCB7IFNIT1JUX1JBIH0sIElVLCAwLCAwLCAwIH0sCi0gIHsgIm12ZnN5cyIsIEJSQSwgMHgxZSwgeyBTSE9SVF9DMSB9LCBNVSwgRkxBR19BTEwsIEZMQUdfQUxMLCAwIH0sCi0gIHsgIm12dGFjYyIsIElBTFUyLCAweGYsIHsgU0hPUlRfQUEgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAibXZ0c3lzIiwgQlJBLCAweGUsIHsgU0hPUlRfQzIgfSwgTVUsIEZMQUdfQUxMLCBGTEFHX0FMTCwgMCB9LAotICB7ICJub3AiLCBCUkEsIDB4RiwgeyBTSE9SVF9OT05FIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJub3QiLCBMT0dJQywgMHgxOSwgeyBTSE9SVF9VIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJub3RmZyIsIExPR0lDLCAweDksIHsgU0hPUlRfVUYgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgIm9yIiwgTE9HSUMsIDB4MWEsIHsgU0hPUlRfQSwgTE9ORyB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAib3JmZyIsIExPR0lDLCAweGEsIHsgU0hPUlRfRiB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAicmVpdCIsIEJSQSwgMHg4LCB7IFNIT1JUX05PTkUgfSwgTVUsIEZMQUdfU00gfCBGTEFHX0pNUCwgRkxBR19TTSB8IEZMQUdfTEtSLCAwIH0sCi0gIHsgInJlcGVhdCIsIEJSQSwgMHgxOCwgeyBTSE9SVF9EMSwgTE9OR18yIH0sIE1VLCBGTEFHX1JQLCBGTEFHX1JQLCBSRUxPQ19QQ1JFTCB9LAotICB7ICJyZXBlYXRpIiwgQlJBLCAweDFhLCB7IFNIT1JUX0QyQiwgTE9OR19EYiB9LCBNVSwgRkxBR19SUCwgRkxBR19SUCwgUkVMT0NfUENSRUwgfSwKLSAgeyAicm90IiwgTE9HSUMsIDB4MTQsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAicm90MmgiLCBMT0dJQywgMHgxNSwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJydGQiLCBCUkEsIDB4YSwgeyBTSE9SVF9OT05FIH0sIE1VLCBGTEFHX0pNUCwgRkxBR19MS1IsIDAgfSwKLSAgeyAic2F0IiwgSUFMVTIsIDB4OCwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzYXQyaCIsIElBTFUyLCAweDksIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAic2F0aGwiLCBJQUxVMiwgMHgxYywgeyBTSE9SVF9BNSB9LCBJVSwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic2F0aGgiLCBJQUxVMiwgMHgxZCwgeyBTSE9SVF9BNSB9LCBJVSwgRkxBR19BRERTVUJwcHAsIDAsIDAgfSwKLSAgeyAic2F0eiIsIElBTFUyLCAweGEsIHsgU0hPUlRfQTUgfSwgSVUsIDAsIDAsIDAgfSwKLSAgeyAic2F0ejJoIiwgSUFMVTIsIDB4YiwgeyBTSE9SVF9BNSB9LCBJVSwgMCwgMCwgMCB9LAotICB7ICJzcmEiLCBMT0dJQywgMHgxMCwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmEyaCIsIExPR0lDLCAweDExLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNyYWhoIiwgTE9HSUMsIDB4NSwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzcmFobCIsIExPR0lDLCAweDQsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JjIiwgTE9HSUMsIDB4MTYsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIEZMQUdfQUREU1VCcHBwLCAwLCAwIH0sCi0gIHsgInNybCIsIExPR0lDLCAweDEyLCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNybDJoIiwgTE9HSUMsIDB4MTMsIHsgU0hPUlRfQSB9LCBFSVRIRVIsIDAsIDAsIDAgfSwKLSAgeyAic3JsaGgiLCBMT0dJQywgMHg3LCB7IFNIT1JUX0EgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInNybGhsIiwgTE9HSUMsIDB4NiwgeyBTSE9SVF9BIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7ICJzdDJoIiwgSU1FTSwgMHgxMywgeyBTSE9SVF9NMiwgTE9OR19NMiB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3QydyIsIElNRU0sIDB4MTYsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR18yV09SRCwgMCB9LAotICB7ICJzdDRoYiIsIElNRU0sIDB4MTUsIHsgU0hPUlRfTTIsIExPTkdfTTIgfSwgTVUsIDAsIEZMQUdfTUVNIHwgRkxBR18yV09SRCwgMCB9LAotICB7ICJzdGIiLCBJTUVNLCAweDEwLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3RoIiwgSU1FTSwgMHgxMiwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCi0gIHsgInN0aGgiLCBJTUVNLCAweDExLCB7IFNIT1JUX00sIExPTkdfTSB9LCBNVSwgMCwgRkxBR19NRU0sIDAgfSwKLSAgeyAic3R3IiwgSU1FTSwgMHgxNCwgeyBTSE9SVF9NLCBMT05HX00gfSwgTVUsIDAsIEZMQUdfTUVNLCAwIH0sCi0gIHsgInN1YiIsIElBTFUxLCAweDIsIHsgU0hPUlRfQSwgTE9OR30sIEVJVEhFUiwgMCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YjJoIiwgSUFMVTEsIDB4MywgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInN1YmIiLCBJQUxVMSwgMHg1LCB7IFNIT1JUX0EsIExPTkd9LCBFSVRIRVIsIEZMQUdfQywgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsbGwiLCBJQUxVMSwgMHgxOCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsbGgiLCBJQUxVMSwgMHgxOSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsaGwiLCBJQUxVMSwgMHgxYSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhsaGgiLCBJQUxVMSwgMHgxYiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhobGwiLCBJQUxVMSwgMHgxYywgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhobGgiLCBJQUxVMSwgMHgxZCwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhoaGwiLCBJQUxVMSwgMHgxZSwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInN1YmhoaGgiLCBJQUxVMSwgMHgxZiwgeyBTSE9SVF9BLCBMT05HfSwgRUlUSEVSLCBGTEFHX0FERFNVQnBwcCwgRkxBR19DVlZBLCAwIH0sCi0gIHsgInRyYXAiLCBCUkEsIDB4OSwgeyBTSE9SVF9CMSwgU0hPUlRfVH0sIE1VLCBGTEFHX0pTUiwgRkxBR19TTSB8IEZMQUdfTEtSLCAwIH0sCi0gIHsgInhvciIsIExPR0lDLCAweDFiLCB7IFNIT1JUX0EsIExPTkcgfSwgRUlUSEVSLCAwLCAwLCAwIH0sCi0gIHsgInhvcmZnIiwgTE9HSUMsIDB4YiwgeyBTSE9SVF9GIH0sIEVJVEhFUiwgMCwgMCwgMCB9LAotICB7IE5VTEwsIDAsIDAsIHsgMCB9LCAwLCAwLCAwLCAwIH0sCi19OwotCi0KLS8qIG5vdyBkZWZpbmUgdGhlIG9wZXJhbmQgdHlwZXMgKi8KLS8qIGZvcm1hdCBpcyBsZW5ndGgsIGJpdHMsIHBvc2l0aW9uLCBmbGFncyAqLwotY29uc3Qgc3RydWN0IGQzMHZfb3BlcmFuZCBkMzB2X29wZXJhbmRfdGFibGVbXSA9Ci17Ci0jZGVmaW5lIFVOVVNFRAkoMCkKLSAgeyAwLCAwLCAwLCAwIH0sCi0jZGVmaW5lIFJhCShVTlVTRUQgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBSYTIJKFJhICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFR3xPUEVSQU5EX0RFU1R8T1BFUkFORF8yUkVHIH0sCi0jZGVmaW5lIFJhMwkoUmEyICsgMSkKLSAgeyA2LCA2LCAwLCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSYgkoUmEzICsgMSkKLSAgeyA2LCA2LCA2LCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBSYwkoUmIgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX1JFRyB9LAotI2RlZmluZSBBYQkoUmMgKyAxKQotICB7IDYsIDEsIDAsIE9QRVJBTkRfQUNDfE9QRVJBTkRfUkVHfE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBBYgkoQWEgKyAxKQotICB7IDYsIDEsIDYsIE9QRVJBTkRfQUNDfE9QRVJBTkRfUkVHIH0sCi0jZGVmaW5lIElNTTUJKEFiICsgMSkKLSAgeyA2LCA1LCAxMiwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgSU1NNVUJKElNTTUgKyAxKQotICB7IDYsIDUsIDEyLCBPUEVSQU5EX05VTXxPUEVSQU5EX1NJR05FRCB9LAotI2RlZmluZSBJTU01UzMJKElNTTVVICsgMSkKLSAgeyA2LCA1LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgSU1NNgkoSU1NNVMzICsgMSkKLSAgeyA2LCA2LCAxMiwgT1BFUkFORF9OVU18T1BFUkFORF9TSUdORUQgfSwKLSNkZWZpbmUgSU1NNlUJKElNTTYgKyAxKQotICB7IDYsIDYsIDAsIE9QRVJBTkRfTlVNIH0sCi0jZGVmaW5lIElNTTZVMgkoSU1NNlUgKyAxKQotICB7IDYsIDYsIDEyLCBPUEVSQU5EX05VTSB9LAotI2RlZmluZSBJTU02UzMJKElNTTZVMiArIDEpCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9OVU18T1BFUkFORF9TSElGVCB9LAotI2RlZmluZSBJTU0xMlMzCShJTU02UzMgKyAxKQotICB7IDEyLCAxMiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgSU1NMTJTM1UgKElNTTEyUzMgKyAxKQotICB7IDEyLCAxMiwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgSU1NMThTMwkoSU1NMTJTM1UgKyAxKQotICB7IDE4LCAxOCwgMTIsIE9QRVJBTkRfTlVNfE9QRVJBTkRfU0lHTkVEfE9QRVJBTkRfU0hJRlQgfSwKLSNkZWZpbmUgSU1NMzIJKElNTTE4UzMgKyAxKQotICB7IDMyLCAzMiwgMCwgT1BFUkFORF9OVU0gfSwKLSNkZWZpbmUgRmEJKElNTTMyICsgMSkKLSAgeyA2LCAzLCAwLCBPUEVSQU5EX1JFRyB8IE9QRVJBTkRfRkxBRyB8IE9QRVJBTkRfREVTVCB9LAotI2RlZmluZSBGYgkoRmEgKyAxKQotICB7IDYsIDMsIDYsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GTEFHIH0sCi0jZGVmaW5lIEZjCShGYiArIDEpCi0gIHsgNiwgMywgMTIsIE9QRVJBTkRfUkVHIHwgT1BFUkFORF9GTEFHIH0sCi0jZGVmaW5lIEFUU0lHTgkoRmMgKyAxKQotICB7IDAsIDAsIDAsIE9QRVJBTkRfQVRTSUdOfSwKLSNkZWZpbmUgQVRQQVIJKEFUU0lHTiArIDEpCS8qICJAKCIgKi8KLSAgeyAwLCAwLCAwLCBPUEVSQU5EX0FUUEFSfSwKLSNkZWZpbmUgUExVUwkoQVRQQVIgKyAxKQkvKiBwb3N0aW5jcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9QTFVTfSwKLSNkZWZpbmUgTUlOVVMJKFBMVVMgKyAxKQkvKiBwb3N0ZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9NSU5VU30sCi0jZGVmaW5lIEFUTUlOVVMJKE1JTlVTICsgMSkJLyogcHJlZGVjcmVtZW50ICovCi0gIHsgMCwgMCwgMCwgT1BFUkFORF9BVE1JTlVTfSwKLSNkZWZpbmUgQ2EJKEFUTUlOVVMgKyAxKQkvKiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgNiwgNiwgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9DT05UUk9MfE9QRVJBTkRfREVTVH0sCi0jZGVmaW5lIENiCShDYSArIDEpCS8qIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSAgeyA2LCA2LCA2LCBPUEVSQU5EX1JFR3xPUEVSQU5EX0NPTlRST0x9LAotI2RlZmluZSBDQwkoQ2IgKyAxKQkvKiBjb25kaXRpb24gY29kZSAoQ01QY2MgYW5kIENNUFVjYykgKi8KLSAgeyAzLCAzLCAtMywgT1BFUkFORF9OQU1FfSwKLSNkZWZpbmUgRmEyCShDQyArIDEpCS8qIGZsYWcgcmVnaXN0ZXIgKENNUGNjIGFuZCBDTVBVY2MpICovCi0gIHsgMywgMywgMCwgT1BFUkFORF9SRUd8T1BFUkFORF9GTEFHfE9QRVJBTkRfREVTVH0sCi0jZGVmaW5lIEZha2UJKEZhMiArIDEpCS8qIHBsYWNlIGhvbGRlciBmb3IgImlkIiBmaWVsZCBpbiBtdmZzeXMgYW5kIG12dHN5cyAqLwotICB7IDYsIDIsIDEyLCBPUEVSQU5EX1NQRUNJQUx9LAotfTsKLQotLyogbm93IHdlIG5lZWQgdG8gZGVmaW5lIHRoZSBpbnN0cnVjdGlvbiBmb3JtYXRzICovCi1jb25zdCBzdHJ1Y3QgZDMwdl9mb3JtYXQgZDMwdl9mb3JtYXRfdGFibGVbXSA9Ci17Ci0gIHsgMCwgMCwgeyAwIH0gfSwKLSAgeyBTSE9SVF9NLCAwLCB7IFJhLCBBVFBBUiwgUmIsIFJjIH0gfSwJLyogUmEsQChSYixSYykgKi8KLSAgeyBTSE9SVF9NLCAxLCB7IFJhLCBBVFBBUiwgUmIsIFBMVVMsIFJjIH0gfSwJLyogUmEsQChSYissUmMpICovCi0gIHsgU0hPUlRfTSwgMiwgeyBSYSwgQVRQQVIsIFJiLCBJTU02IH0gfSwJLyogUmEsQChSYixpbW02KSAqLwotICB7IFNIT1JUX00sIDMsIHsgUmEsIEFUUEFSLCBSYiwgTUlOVVMsIFJjIH0gfSwJLyogUmEsQChSYi0sUmMpICovCi0gIHsgU0hPUlRfTTIsIDAsIHsgUmEyLCBBVFBBUiwgUmIsIFJjIH0gfSwJLyogUmEsQChSYixSYykgKi8KLSAgeyBTSE9SVF9NMiwgMSwgeyBSYTIsIEFUUEFSLCBSYiwgUExVUywgUmMgfSB9LAkvKiBSYSxAKFJiKyxSYykgKi8KLSAgeyBTSE9SVF9NMiwgMiwgeyBSYTIsIEFUUEFSLCBSYiwgSU1NNiB9IH0sCS8qIFJhLEAoUmIsaW1tNikgKi8KLSAgeyBTSE9SVF9NMiwgMywgeyBSYTIsIEFUUEFSLCBSYiwgTUlOVVMsIFJjIH0gfSwJLyogUmEsQChSYi0sUmMpICovCi0gIHsgU0hPUlRfQSwgMCwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjICovCi0gIHsgU0hPUlRfQSwgMiwgeyBSYSwgUmIsIElNTTYgfSB9LAkJLyogUmEsUmIsaW1tNiAqLwotICB7IFNIT1JUX0IxLCAwLCB7IFJjIH0gfSwJCQkvKiBSYyAqLwotICB7IFNIT1JUX0IyLCAyLCB7IElNTTE4UzMgfSB9LAkJCS8qIGltbTE4ICovCi0gIHsgU0hPUlRfQjMsIDAsIHsgUmEzLCBSYyB9IH0sCQkJLyogUmEsUmMgKi8KLSAgeyBTSE9SVF9CMywgMiwgeyBSYTMsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTIgKi8KLSAgeyBTSE9SVF9CM2IsIDEsIHsgUmEzLCBSYyB9IH0sCQkvKiBSYSxSYyAqLwotICB7IFNIT1JUX0IzYiwgMywgeyBSYTMsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTIgKi8KLSAgeyBTSE9SVF9EMSwgMCwgeyBSYSwgUmMgfSB9LAkJCS8qIFJhLFJjICovCi0gIHsgU0hPUlRfRDEsIDIsIHsgUmEsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTJzMyAqLwotICB7IFNIT1JUX0QyLCAwLCB7IElNTTZTMywgUmMgfSB9LAkJLyogaW1tNnMzLFJjICovCi0gIHsgU0hPUlRfRDIsIDIsIHsgSU1NNlMzLCBJTU0xMlMzIH0gfSwJCS8qIGltbTZzMyxpbW0xMnMzICovCi0gIHsgU0hPUlRfRDJCLCAwLCB7IElNTTZVLCBSYyB9IH0sCQkvKiBpbW02dSxSYyAqLwotICB7IFNIT1JUX0QyQiwgMiwgeyBJTU02VSwgSU1NMTJTM1UgfSB9LAkvKiBpbW02dSxpbW0xMnMzdSAqLwotICB7IFNIT1JUX1UsIDAsIHsgUmEsIFJiIH0gfSwJCQkvKiBSYSxSYiAqLwotICB7IFNIT1JUX1UsIDIsIHsgUmEsIElNTTEyUzMgfSB9LAkJLyogUmEsaW1tMTIgKHJlcGVhdCkgKi8KLSAgeyBTSE9SVF9GLCAwLCB7IEZhLCBGYiwgRmMgfSB9LAkJLyogRmEsRmIsRmMgIChvcmZnLCB4b3JmZykgKi8KLSAgeyBTSE9SVF9GLCAyLCB7IEZhLCBGYiwgSU1NNiB9IH0sCQkvKiBGYSxGYixpbW02ICovCi0gIHsgU0hPUlRfQUYsIDAsIHsgRmEsIFJiLCBSYyB9IH0sCQkvKiBGYSxSYixSYyAqLwotICB7IFNIT1JUX0FGLCAyLCB7IEZhLCBSYiwgSU1NNiB9IH0sCQkvKiBGYSxSYixpbW02ICovCi0gIHsgU0hPUlRfVCwgMiwgeyBJTU01IH0gfSwJCQkvKiBpbW01czMgICAodHJhcCkgKi8KLSAgeyBTSE9SVF9BNSwgMCwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjICovCi0gIHsgU0hPUlRfQTUsIDIsIHsgUmEsIFJiLCBJTU01IH0gfSwJCS8qIFJhLFJiLGltbTUgICAgKHNhdCopICovCi0gIHsgU0hPUlRfQ01QLCAwLCB7IENDLCBGYTIsIFJiLCBSY30gfSwJCS8qIENDICBGYTIsUmIsUmMgKi8KLSAgeyBTSE9SVF9DTVAsIDIsIHsgQ0MsIEZhMiwgUmIsIElNTTZ9IH0sCS8qIENDICBGYTIsUmIsaW1tNiAqLwotICB7IFNIT1JUX0NNUFUsIDAsIHsgQ0MsIEZhMiwgUmIsIFJjfSB9LAkvKiBDQyAgRmEyLFJiLFJjICovCi0gIHsgU0hPUlRfQ01QVSwgMiwgeyBDQywgRmEyLCBSYiwgSU1NNlUyfSB9LAkvKiBDQyAgRmEyLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9BMSwgMSwgeyBSYSwgUmIsIFJjIH0gfSwJCS8qIFJhLFJiLFJjIGZvciBNQUMgd2hlcmUgYT0xICovCi0gIHsgU0hPUlRfQTEsIDMsIHsgUmEsIFJiLCBJTU02IH0gfSwJCS8qIFJhLFJiLGltbTYgZm9yIE1BQyB3aGVyZSBhPTEgKi8KLSAgeyBTSE9SVF9BQSwgMCwgeyBBYSwgUmIsIFJjIH0gfSwJCS8qIEFhLFJiLFJjICovCi0gIHsgU0hPUlRfQUEsIDIsIHsgQWEsIFJiLCBJTU02IH0gfSwJCS8qIEFhLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9SQSwgMCwgeyBSYSwgQWIsIFJjIH0gfSwJCS8qIFJhLEFiLFJjICovCi0gIHsgU0hPUlRfUkEsIDIsIHsgUmEsIEFiLCBJTU02VTIgfSB9LAkJLyogUmEsQWIsaW1tNnUgKi8KLSAgeyBTSE9SVF9NT0RJTkMsIDEsIHsgUmIsIElNTTUgfSB9LAkJLyogUmIsaW1tNSAobW9kaW5jKSAqLwotICB7IFNIT1JUX01PRERFQywgMywgeyBSYiwgSU1NNSB9IH0sCQkvKiBSYixpbW01IChtb2RkZWMpICovCi0gIHsgU0hPUlRfQzEsIDAsIHsgUmEsIENiLCBGYWtlIH0gfSwJCS8qIFJhLENiIChtdmZzeXMpICovCi0gIHsgU0hPUlRfQzIsIDAsIHsgQ2EsIFJiLCBGYWtlIH0gfSwJCS8qIENhLFJiIChtdnRzeXMpICovCi0gIHsgU0hPUlRfVUYsIDAsIHsgRmEsIEZiIH0gfSwJCQkvKiBGYSxGYiAgKG5vdGZnKSAqLwotICB7IFNIT1JUX0EyLCAwLCB7IFJhMiwgUmIsIFJjIH0gfSwJCS8qIFJhMixSYixSYyAqLwotICB7IFNIT1JUX0EyLCAyLCB7IFJhMiwgUmIsIElNTTYgfSB9LAkJLyogUmEyLFJiLGltbTYgKi8KLSAgeyBTSE9SVF9BNVMsIDAsIHsgUmEsIFJiLCBSYyB9IH0sCQkvKiBSYSxSYixSYyAqLwotICB7IFNIT1JUX0E1UywgMiwgeyBSYSwgUmIsIElNTTVVIH0gfSwJCS8qIFJhLFJiLGltbTV1ICAgKHNoaWZ0cykgKi8KLSAgeyBTSE9SVF9OT05FLCAwLCB7IDAgfSB9LAkJCS8qIG5vIG9wZXJhbmRzIChub3AsIHJlaXQpICovCi0gIHsgTE9ORywgMiwgeyBSYSwgUmIsIElNTTMyIH0gfSwJCS8qIFJhLFJiLGltbTMyICovCi0gIHsgTE9OR19VLCAyLCB7IElNTTMyIH0gfSwJCQkvKiBpbW0zMiAqLwotICB7IExPTkdfQUYsIDIsIHsgRmEsIFJiLCBJTU0zMiB9IH0sCQkvKiBGYSxSYixpbW0zMiAqLwotICB7IExPTkdfQ01QLCAyLCB7IENDLCBGYTIsIFJiLCBJTU0zMn0gfSwJLyogQ0MgIEZhMixSYixpbW0zMiAqLwotICB7IExPTkdfTSwgMiwgeyBSYSwgQVRQQVIsIFJiLCBJTU0zMiB9IH0sCS8qIFJhLEAoUmIsaW1tMzIpICovCi0gIHsgTE9OR19NMiwgMiwgeyBSYTIsIEFUUEFSLCBSYiwgSU1NMzIgfSB9LAkvKiBSYSxAKFJiLGltbTMyKSAqLwotICB7IExPTkdfMiwgMiwgeyBSYTMsIElNTTMyIH0gfSwJCS8qIFJhLGltbTMyICovCi0gIHsgTE9OR18yYiwgMywgeyBSYTMsIElNTTMyIH0gfSwJCS8qIFJhLGltbTMyICovCi0gIHsgTE9OR19ELCAyLCB7IElNTTZTMywgSU1NMzIgfSB9LAkJLyogaW1tNnMzLGltbTMyICovCi0gIHsgTE9OR19EYiwgMiwgeyBJTU02VSwgSU1NMzIgfSB9LAkJLyogaW1tNixpbW0zMiAqLwotICB7IDAsIDAsIHsgMCB9IH0sCi19OwotCi1jb25zdCBjaGFyICpkMzB2X2VjY19uYW1lc1tdID0KLXsKLSAgImFsIiwKLSAgInR4IiwKLSAgImZ4IiwKLSAgInh0IiwKLSAgInhmIiwKLSAgInR0IiwKLSAgInRmIiwKLSAgInJlcyIKLX07Ci0KLWNvbnN0IGNoYXIgKmQzMHZfY2NfbmFtZXNbXSA9Ci17Ci0gICJlcSIsCi0gICJuZSIsCi0gICJndCIsCi0gICJnZSIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJwcyIsCi0gICJuZyIsCi0gIE5VTEwKLX07CmRpZmYgLS1naXQgYS9vcGNvZGVzL2RlcC1pbi5zZWQgYi9vcGNvZGVzL2RlcC1pbi5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMGRlZTU2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZGVwLWluLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTpsb29wCi0vXFwkL04KLXMvXFxcbiAqLyAvZwotdCBsb29wCi0KLXMhXC5vOiEubG86IQotcyEgQEJGRF9IQCEgJChCRkRfSCkhZwotcyFASU5DRElSQCEkKElOQ0RJUikhZwotcyFAQkZERElSQCEkKEJGRERJUikhZwotcyFAU1JDRElSQC8hIWcKLQotcy9cXFxuICovIC9nCi0KLXMvICokLy8KLXMvICAqLyAvZwotcy8gKjovOi9nCi0vOiQvZAotCi1zL1woLlx7NTBcfVteIF0qXCkgL1wxIFxcXAotICAvZwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kaXMtYnVmLmMgYi9vcGNvZGVzL2Rpcy1idWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2YmUyZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2Rpcy1idWYuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBmcm9tIGEgYnVmZmVyLCBmb3IgR05VLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEdldCBMRU5HVEggYnl0ZXMgZnJvbSBpbmZvJ3MgYnVmZmVyLCBhdCB0YXJnZXQgYWRkcmVzcyBtZW1hZGRyLgotICAgVHJhbnNmZXIgdGhlbSB0byBteWFkZHIuICAqLwotaW50Ci1idWZmZXJfcmVhZF9tZW1vcnkgKG1lbWFkZHIsIG15YWRkciwgbGVuZ3RoLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGJmZF9ieXRlICpteWFkZHI7Ci0gICAgIGludCBsZW5ndGg7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpZiAobWVtYWRkciA8IGluZm8tPmJ1ZmZlcl92bWEKLSAgICAgIHx8IG1lbWFkZHIgKyBsZW5ndGggPiBpbmZvLT5idWZmZXJfdm1hICsgaW5mby0+YnVmZmVyX2xlbmd0aCkKLSAgICAvKiBPdXQgb2YgYm91bmRzLiAgVXNlIEVJTyBiZWNhdXNlIEdEQiB1c2VzIGl0LiAgKi8KLSAgICByZXR1cm4gRUlPOwotICBtZW1jcHkgKG15YWRkciwgaW5mby0+YnVmZmVyICsgKG1lbWFkZHIgLSBpbmZvLT5idWZmZXJfdm1hKSwgbGVuZ3RoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFByaW50IGFuIGVycm9yIG1lc3NhZ2UuICBXZSBjYW4gYXNzdW1lIHRoYXQgdGhpcyBpcyBpbiByZXNwb25zZSB0bwotICAgYW4gZXJyb3IgcmV0dXJuIGZyb20gYnVmZmVyX3JlYWRfbWVtb3J5LiAgKi8KLXZvaWQKLXBlcnJvcl9tZW1vcnkgKHN0YXR1cywgbWVtYWRkciwgaW5mbykKLSAgICAgaW50IHN0YXR1czsKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKHN0YXR1cyAhPSBFSU8pCi0gICAgLyogQ2FuJ3QgaGFwcGVuLiAgKi8KLSAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgXygiVW5rbm93biBlcnJvciAlZFxuIiksIHN0YXR1cyk7Ci0gIGVsc2UKLSAgICAvKiBBY3R1YWxseSwgYWRkcmVzcyBiZXR3ZWVuIG1lbWFkZHIgYW5kIG1lbWFkZHIgKyBsZW4gd2FzCi0gICAgICAgb3V0IG9mIGJvdW5kcy4gICovCi0gICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sCi0JCQlfKCJBZGRyZXNzIDB4JXggaXMgb3V0IG9mIGJvdW5kcy5cbiIpLCBtZW1hZGRyKTsKLX0KLQotLyogVGhpcyBjb3VsZCBiZSBpbiBhIHNlcGFyYXRlIGZpbGUsIHRvIHNhdmUgbWluaXNjdWxlIGFtb3VudHMgb2Ygc3BhY2UKLSAgIGluIHN0YXRpY2FsbHkgbGlua2VkIGV4ZWN1dGFibGVzLiAgKi8KLQotLyogSnVzdCBwcmludCB0aGUgYWRkcmVzcyBpcyBoZXguICBUaGlzIGlzIGluY2x1ZGVkIGZvciBjb21wbGV0ZW5lc3MgZXZlbgotICAgdGhvdWdoIGJvdGggR0RCIGFuZCBvYmpkdW1wIHByb3ZpZGUgdGhlaXIgb3duICh0byBwcmludCBzeW1ib2xpYwotICAgYWRkcmVzc2VzKS4gICovCi0KLXZvaWQKLWdlbmVyaWNfcHJpbnRfYWRkcmVzcyAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgYWRkcik7Ci19Ci0KLS8qIEp1c3QgY29uY2F0ZW5hdGUgdGhlIGFkZHJlc3MgYXMgaGV4LiAgVGhpcyBpcyBpbmNsdWRlZCBmb3IKLSAgIGNvbXBsZXRlbmVzcyBldmVuIHRob3VnaCBib3RoIEdEQiBhbmQgb2JqZHVtcCBwcm92aWRlIHRoZWlyIG93biAodG8KLSAgIHByaW50IHN5bWJvbGljIGFkZHJlc3NlcykuICAqLwotCi12b2lkCi1nZW5lcmljX3N0cmNhdF9hZGRyZXNzIChhZGRyLCBidWYsIGxlbikKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBsZW47Ci17Ci0gIGlmIChidWYgIT0gKGNoYXIgKilOVUxMICYmIGxlbiA+IDApCi0gICAgewotICAgICAgY2hhciB0bXBCdWZbMzBdOwotCi0gICAgICBzcHJpbnRmX3ZtYSAodG1wQnVmLCBhZGRyKTsKLSAgICAgIGlmICgoc3RybGVuIChidWYpICsgc3RybGVuICh0bXBCdWYpKSA8PSBsZW4pCi0Jc3RyY2F0IChidWYsIHRtcEJ1Zik7Ci0gICAgICBlbHNlCi0Jc3RybmNhdCAoYnVmLCB0bXBCdWYsIChsZW4gLSBzdHJsZW4oYnVmKSkpOwotICAgIH0KLSAgcmV0dXJuOwotfQotCi0vKiBKdXN0IHJldHVybiB0aGUgZ2l2ZW4gYWRkcmVzcy4gICovCi0KLWludAotZ2VuZXJpY19zeW1ib2xfYXRfYWRkcmVzcyAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqIGluZm87Ci17Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jIGIvb3Bjb2Rlcy9kaXNhc3NlbWJsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZkNWQ1Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZGlzYXNzZW1ibGUuYworKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKiBTZWxlY3QgZGlzYXNzZW1ibHkgcm91dGluZSBmb3Igc3BlY2lmaWVkIGFyY2hpdGVjdHVyZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi0jaWZkZWYgQVJDSF9hbGwKLSNkZWZpbmUgQVJDSF9hMjlrCi0jZGVmaW5lIEFSQ0hfYWxwaGEKLSNkZWZpbmUgQVJDSF9hcmMKLSNkZWZpbmUgQVJDSF9hcm0KLSNkZWZpbmUgQVJDSF9kMTB2Ci0jZGVmaW5lIEFSQ0hfZDMwdgotI2RlZmluZSBBUkNIX2g4MzAwCi0jZGVmaW5lIEFSQ0hfaDg1MDAKLSNkZWZpbmUgQVJDSF9ocHBhCi0jZGVmaW5lIEFSQ0hfaTM4NgotI2RlZmluZSBBUkNIX2k5NjAKLSNkZWZpbmUgQVJDSF9mcjMwCi0jZGVmaW5lIEFSQ0hfbTMycgotI2RlZmluZSBBUkNIX202OGsKLSNkZWZpbmUgQVJDSF9tODhrCi0jZGVmaW5lIEFSQ0hfbWNvcmUKLSNkZWZpbmUgQVJDSF9taXBzCi0jZGVmaW5lIEFSQ0hfbW4xMDIwMAotI2RlZmluZSBBUkNIX21uMTAzMDAKLSNkZWZpbmUgQVJDSF9uczMyawotI2RlZmluZSBBUkNIX3Bvd2VycGMKLSNkZWZpbmUgQVJDSF9yczYwMDAKLSNkZWZpbmUgQVJDSF9zaAotI2RlZmluZSBBUkNIX3NwYXJjCi0jZGVmaW5lIEFSQ0hfdGljMzAKLSNkZWZpbmUgQVJDSF90aWM4MAotI2RlZmluZSBBUkNIX3Y4NTAKLSNkZWZpbmUgQVJDSF92YXgKLSNkZWZpbmUgQVJDSF93NjUKLSNkZWZpbmUgQVJDSF96OGsKLSNlbmRpZgotCi0KLWRpc2Fzc2VtYmxlcl9mdHlwZQotZGlzYXNzZW1ibGVyIChhYmZkKQotICAgICBiZmQgKmFiZmQ7Ci17Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhID0gYmZkX2dldF9hcmNoIChhYmZkKTsKLSAgZGlzYXNzZW1ibGVyX2Z0eXBlIGRpc2Fzc2VtYmxlOwotCi0gIHN3aXRjaCAoYSkKLSAgICB7Ci0gICAgICAvKiBJZiB5b3UgYWRkIGEgY2FzZSB0byB0aGlzIHRhYmxlLCBhbHNvIGFkZCBpdCB0byB0aGUKLQkgQVJDSF9hbGwgZGVmaW5pdGlvbiByaWdodCBhYm92ZSB0aGlzIGZ1bmN0aW9uLiAgKi8KLSNpZmRlZiBBUkNIX2EyOWsKLSAgICBjYXNlIGJmZF9hcmNoX2EyOWs6Ci0gICAgICAvKiBBcyBmYXIgYXMgSSBrbm93IHdlIG9ubHkgaGFuZGxlIGJpZy1lbmRpYW4gMjlrIG9iamVjdHMuICAqLwotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2JpZ19hMjlrOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2FscGhhCi0gICAgY2FzZSBiZmRfYXJjaF9hbHBoYToKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9hbHBoYTsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9hcmMKLSAgICBjYXNlIGJmZF9hcmNoX2FyYzoKLSAgICAgIHsKLQlkaXNhc3NlbWJsZSA9IGFyY19nZXRfZGlzYXNzZW1ibGVyIChiZmRfZ2V0X21hY2ggKGFiZmQpLAotCQkJCQkgICAgYmZkX2JpZ19lbmRpYW4gKGFiZmQpKTsKLQlicmVhazsKLSAgICAgIH0KLSNlbmRpZgotI2lmZGVmIEFSQ0hfYXJtCi0gICAgY2FzZSBiZmRfYXJjaF9hcm06Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfYXJtOwotICAgICAgZWxzZQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9saXR0bGVfYXJtOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2QxMHYKLSAgICBjYXNlIGJmZF9hcmNoX2QxMHY6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fZDEwdjsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9kMzB2Ci0gICAgY2FzZSBiZmRfYXJjaF9kMzB2OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2QzMHY7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaDgzMDAKLSAgICBjYXNlIGJmZF9hcmNoX2g4MzAwOgotICAgICAgaWYgKGJmZF9nZXRfbWFjaChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMGgpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4MzAwaDsKLSAgICAgIGVsc2UgaWYgKGJmZF9nZXRfbWFjaChhYmZkKSA9PSBiZmRfbWFjaF9oODMwMHMpCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4MzAwczsKLSAgICAgIGVsc2UgCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2g4MzAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2g4NTAwCi0gICAgY2FzZSBiZmRfYXJjaF9oODUwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9oODUwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9ocHBhCi0gICAgY2FzZSBiZmRfYXJjaF9ocHBhOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2hwcGE7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaTM4NgotICAgIGNhc2UgYmZkX2FyY2hfaTM4NjoKLSAgICAgIGlmIChiZmRfZ2V0X21hY2ggKGFiZmQpID09IGJmZF9tYWNoX2kzODZfaTM4Nl9pbnRlbF9zeW50YXgpCi0gICAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9pMzg2X2ludGVsOwotICAgICAgZWxzZQotICAgICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25faTM4Nl9hdHQ7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfaTk2MAotICAgIGNhc2UgYmZkX2FyY2hfaTk2MDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9pOTYwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX2ZyMzAKLSAgICBjYXNlIGJmZF9hcmNoX2ZyMzA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fZnIzMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9tMzJyCi0gICAgY2FzZSBiZmRfYXJjaF9tMzJyOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX20zMnI7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbTY4awotICAgIGNhc2UgYmZkX2FyY2hfbTY4azoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tNjhrOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX204OGsKLSAgICBjYXNlIGJmZF9hcmNoX204OGs6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbTg4azsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9uczMyawotICAgIGNhc2UgYmZkX2FyY2hfbnMzMms6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbnMzMms7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbWNvcmUKLSAgICBjYXNlIGJmZF9hcmNoX21jb3JlOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX21jb3JlOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX21pcHMKLSAgICBjYXNlIGJmZF9hcmNoX21pcHM6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9iaWdfbWlwczsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbGl0dGxlX21pcHM7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfbW4xMDIwMAotICAgIGNhc2UgYmZkX2FyY2hfbW4xMDIwMDoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9tbjEwMjAwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX21uMTAzMDAKLSAgICBjYXNlIGJmZF9hcmNoX21uMTAzMDA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fbW4xMDMwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9wb3dlcnBjCi0gICAgY2FzZSBiZmRfYXJjaF9wb3dlcnBjOgotICAgICAgaWYgKGJmZF9iaWdfZW5kaWFuIChhYmZkKSkKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fYmlnX3Bvd2VycGM7Ci0gICAgICBlbHNlCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX2xpdHRsZV9wb3dlcnBjOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3JzNjAwMAotICAgIGNhc2UgYmZkX2FyY2hfcnM2MDAwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3JzNjAwMDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF9zaAotICAgIGNhc2UgYmZkX2FyY2hfc2g6Ci0gICAgICBpZiAoYmZkX2JpZ19lbmRpYW4gKGFiZmQpKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9zaDsKLSAgICAgIGVsc2UKLQlkaXNhc3NlbWJsZSA9IHByaW50X2luc25fc2hsOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3NwYXJjCi0gICAgY2FzZSBiZmRfYXJjaF9zcGFyYzoKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl9zcGFyYzsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF90aWMzMAotICAgIGNhc2UgYmZkX2FyY2hfdGljMzA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdGljMzA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfdGljODAKLSAgICBjYXNlIGJmZF9hcmNoX3RpYzgwOgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3RpYzgwOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3Y4NTAKLSAgICBjYXNlIGJmZF9hcmNoX3Y4NTA6Ci0gICAgICBkaXNhc3NlbWJsZSA9IHByaW50X2luc25fdjg1MDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQVJDSF93NjUKLSAgICBjYXNlIGJmZF9hcmNoX3c2NToKLSAgICAgIGRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl93NjU7Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIEFSQ0hfejhrCi0gICAgY2FzZSBiZmRfYXJjaF96OGs6Ci0gICAgICBpZiAoYmZkX2dldF9tYWNoKGFiZmQpID09IGJmZF9tYWNoX3o4MDAxKQotCWRpc2Fzc2VtYmxlID0gcHJpbnRfaW5zbl96ODAwMTsKLSAgICAgIGVsc2UgCi0JZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3o4MDAyOwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBBUkNIX3ZheAotICAgIGNhc2UgYmZkX2FyY2hfdmF4OgotICAgICAgZGlzYXNzZW1ibGUgPSBwcmludF9pbnNuX3ZheDsKLSAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIGRpc2Fzc2VtYmxlOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9mcjMwLWFzbS5jIGIvb3Bjb2Rlcy9mcjMwLWFzbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjVjY2RjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1hc20uYworKysgL2Rldi9udWxsCkBAIC0xLDU2MCArMCwwIEBACi0vKiBBc3NlbWJsZXIgaW50ZXJmYWNlIGZvciB0YXJnZXRzIHVzaW5nIENHRU4uIC0qLSBDIC0qLQotICAgQ0dFTjogQ3B1IHRvb2xzIEdFTmVyYXRvcgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4tYXNtLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLSN1bmRlZiBtaW4KLSNkZWZpbmUgbWluKGEsYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKLSN1bmRlZiBtYXgKLSNkZWZpbmUgbWF4KGEsYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBwYXJzZV9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgY29uc3QgY2hhciAqKiwgQ0dFTl9GSUVMRFMgKikpOwotDAotLyogLS0gYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gYXNtLmMgKi8KLS8qIEhhbmRsZSByZWdpc3RlciBsaXN0cyBmb3IgTERNeCBhbmQgU1RNeCAgKi8KLQotc3RhdGljIGludAotcGFyc2VfcmVnaXN0ZXJfbnVtYmVyIChzdHJwKQotICAgICBjb25zdCBjaGFyICoqc3RycDsKLXsKLSAgaW50IHJlZ25vOwotICBpZiAoKipzdHJwIDwgJzAnIHx8ICoqc3RycCA+ICc5JykKLSAgICByZXR1cm4gLTE7IC8qIGVycm9yICovCi0gIHJlZ25vID0gKipzdHJwIC0gJzAnOwotICArKypzdHJwOwotCi0gIGlmICgqKnN0cnAgPj0gJzAnICYmICoqc3RycCA8PSAnOScpCi0gICAgewotICAgICAgcmVnbm8gPSByZWdubyAqIDEwICsgKCoqc3RycCAtICcwJyk7Ci0gICAgICArKypzdHJwOwotICAgIH0KLQotICByZXR1cm4gcmVnbm87Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIGhpZ2hfbG93LCBsb2FkX3N0b3JlKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLSAgICAgaW50IGhpZ2hfbG93OyAgIC8qIDAgPT0gaGlnaCwgMSA9PSBsb3cgKi8KLSAgICAgaW50IGxvYWRfc3RvcmU7IC8qIDAgPT0gbG9hZCwgMSA9PSBzdG9yZSAqLwotewotICBpbnQgcmVnbm87Ci0gICp2YWx1ZXAgPSAwOwotICB3aGlsZSAoKipzdHJwICYmICoqc3RycCAhPSAnKScpCi0gICAgewotICAgICAgaWYgKCoqc3RycCAhPSAnUicgJiYgKipzdHJwICE9ICdyJykKLQlicmVhazsKLSAgICAgICsrKnN0cnA7Ci0KLSAgICAgIHJlZ25vID0gcGFyc2VfcmVnaXN0ZXJfbnVtYmVyIChzdHJwKTsKLSAgICAgIGlmIChyZWdubyA9PSAtMSkKLQlyZXR1cm4gIlJlZ2lzdGVyIG51bWJlciBpcyBub3QgdmFsaWQiOwotICAgICAgaWYgKHJlZ25vID4gNyAmJiAhaGlnaF9sb3cpCi0JcmV0dXJuICJSZWdpc3RlciBtdXN0IGJlIGJldHdlZW4gcjAgYW5kIHI3IjsKLSAgICAgIGlmIChyZWdubyA8IDggJiYgaGlnaF9sb3cpCi0JcmV0dXJuICJSZWdpc3RlciBtdXN0IGJlIGJldHdlZW4gcjggYW5kIHIxNSI7Ci0KLSAgICAgIGlmIChoaWdoX2xvdykKLQlyZWdubyAtPSA4OwotCi0gICAgICBpZiAobG9hZF9zdG9yZSkgLyogbWFzayBpcyByZXZlcnNlZCBmb3Igc3RvcmUgKi8KLQkqdmFsdWVwIHw9IDB4ODAgPj4gcmVnbm87Ci0gICAgICBlbHNlCi0JKnZhbHVlcCB8PSAxIDw8IHJlZ25vOwotCi0gICAgICBpZiAoKipzdHJwID09ICcsJykKLQl7Ci0JICBpZiAoKigqc3RycCArIDEpID09ICcpJykKLQkgICAgYnJlYWs7Ci0JICArKypzdHJwOwotCX0KLSAgICB9Ci0KLSAgaWYgKCEqc3RycCB8fCAqKnN0cnAgIT0gJyknKQotICAgIHJldHVybiAiUmVnaXN0ZXIgbGlzdCBpcyBub3QgdmFsaWQiOwotCi0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAwLypsb3cqLywgMC8qbG9hZCovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxLypoaWdoKi8sIDAvKmxvYWQqLyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX2xvd19yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgcmV0dXJuIHBhcnNlX3JlZ2lzdGVyX2xpc3QgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXAsIDAvKmxvdyovLCAxLypzdG9yZSovKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIHJldHVybiBwYXJzZV9yZWdpc3Rlcl9saXN0IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwLCAxLypoaWdoKi8sIDEvKnN0b3JlKi8pOwotfQotCi0vKiAtLSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIHBhcnNpbmcuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgYmFzaWNhbGx5IGp1c3QgYSBiaWcgc3dpdGNoIHN0YXRlbWVudC4gIEVhcmxpZXIgdmVyc2lvbnMKLSAgIHVzZWQgdGFibGVzIHRvIGxvb2sgdXAgdGhlIGZ1bmN0aW9uIHRvIHVzZSwgYnV0Ci0gICAtIGlmIHRoZSB0YWJsZSBjb250YWlucyBib3RoIGFzc2VtYmxlciBhbmQgZGlzYXNzZW1ibGVyIGZ1bmN0aW9ucyB0aGVuCi0gICAgIHRoZSBkaXNhc3NlbWJsZXIgY29udGFpbnMgbXVjaCBvZiB0aGUgYXNzZW1ibGVyIGFuZCB2aWNlLXZlcnNhLAotICAgLSB0aGVyZSdzIGEgbG90IG9mIGlubGluaW5nIHBvc3NpYmlsaXRpZXMgYXMgdGhpbmdzIGdyb3csCi0gICAtIHVzaW5nIGEgc3dpdGNoIHN0YXRlbWVudCBhdm9pZHMgdGhlIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0KLSAgIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW92ZWQgaW50byBgcGFyc2VfaW5zbl9ub3JtYWwnLCBidXQga2VlcGluZyBpdAotICAgc2VwYXJhdGUgbWFrZXMgY2xlYXIgdGhlIGludGVyZmFjZSBiZXR3ZWVuIGBwYXJzZV9pbnNuX25vcm1hbCcgYW5kIGVhY2ggb2YKLSAgIHRoZSBoYW5kbGVycy4KLSovCi0KLWNvbnN0IGNoYXIgKgotZnIzMF9jZ2VuX3BhcnNlX29wZXJhbmQgKGNkLCBvcGluZGV4LCBzdHJwLCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBjaGFyICoqIHN0cnA7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotewotICBjb25zdCBjaGFyICogZXJybXNnOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9DUmkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCAmIGZpZWxkcy0+Zl9DUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcjEzLCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE0LCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE1LCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfUmljKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfa2V5d29yZCAoY2QsIHN0cnAsICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCAmIGZpZWxkcy0+Zl9Saik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX1JqYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsICYgZmllbGRzLT5mX1JzMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsICYgZmllbGRzLT5mX1JzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfQ0MsICZmaWVsZHMtPmZfY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9DQ0MsICZmaWVsZHMtPmZfY2NjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVIxMCwgJmZpZWxkcy0+Zl9kaXIxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVI4LCAmZmllbGRzLT5mX2RpcjgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfRElSOSwgJmZpZWxkcy0+Zl9kaXI5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJU1AxMCwgJmZpZWxkcy0+Zl9kaXNwMTApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9ESVNQOCwgJmZpZWxkcy0+Zl9kaXNwOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0RJU1A5LCAmZmllbGRzLT5mX2Rpc3A5KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfSTIwLCAmZmllbGRzLT5mX2kyMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0kzMiwgJmZpZWxkcy0+Zl9pMzIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX0k4LCAmZmllbGRzLT5mX2k4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfTEFCRUwxMiwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9MQUJFTDksIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfTTQsICZmaWVsZHMtPmZfbTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBmcjMwX2NnZW5fb3B2YWxfaF9wcywgJiBmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZXJybXNnID0gcGFyc2VfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xELCAmZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9oaV9yZWdpc3Rlcl9saXN0X3N0IChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QsICZmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV9sb3dfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCwgJmZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9TMTAsICZmaWVsZHMtPmZfczEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTEwLCAmZmllbGRzLT5mX3UxMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3Vuc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBGUjMwX09QRVJBTkRfVTQsICZmaWVsZHMtPmZfdTQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VNEMsICZmaWVsZHMtPmZfdTRjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIEZSMzBfT1BFUkFORF9VOCwgJmZpZWxkcy0+Zl91OCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgRlIzMF9PUEVSQU5EX1VESVNQNiwgJmZpZWxkcy0+Zl91ZGlzcDYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwYXJzaW5nLlxuIiksIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi1jZ2VuX3BhcnNlX2ZuICogY29uc3QgZnIzMF9jZ2VuX3BhcnNlX2hhbmRsZXJzW10gPSAKLXsKLSAgcGFyc2VfaW5zbl9ub3JtYWwsCi19OwotCi12b2lkCi1mcjMwX2NnZW5faW5pdF9hc20gKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBmcjMwX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgZnIzMF9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cGFyc2VfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9wYXJzZV9oYW5kbGVyc1swXTsKLSAgY2QtPnBhcnNlX29wZXJhbmQgPSBmcjMwX2NnZW5fcGFyc2Vfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBpbnNuIHBhcnNlci4KLQotICAgVGhlIHN5bnRheCBzdHJpbmcgaXMgc2Nhbm5lZCBhbmQgb3BlcmFuZHMgYXJlIHBhcnNlZCBhbmQgc3RvcmVkIGluIEZJRUxEUy4KLSAgIFJlbG9jcyBhcmUgcXVldWVkIGFzIHdlIGdvIHZpYSBvdGhlciBjYWxsYmFja3MuCi0KLSAgID8/PyBOb3RlIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgYW4gYWxsLW9yLW5vdGhpbmcgcGFyc2VyLiAgSWYgd2UgZmFpbCB0bwotICAgcGFyc2UgdGhlIGluc3RydWN0aW9uLCB3ZSByZXR1cm4gMCBhbmQgdGhlIGNhbGxlciB3aWxsIHN0YXJ0IG92ZXIgZnJvbQotICAgdGhlIGJlZ2lubmluZy4gIEJhY2t0cmFja2luZyB3aWxsIGJlIG5lY2Vzc2FyeSBpbiBwYXJzaW5nIHN1YmV4cHJlc3Npb25zLAotICAgYnV0IHRoYXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuICBOb3QgaGFuZGxpbmcgYmFja3RyYWNraW5nIGhlcmUgbWF5IGdldAotICAgZXhwZW5zaXZlIGluIHRoZSBjYXNlIG9mIHRoZSBtNjhrLiAgRGVhbCB3aXRoIGxhdGVyLgotCi0gICBSZXR1cm5zIE5VTEwgZm9yIHN1Y2Nlc3MsIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGZhaWx1cmUuCi0qLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9pbnNuX25vcm1hbCAoY2QsIGluc24sIHN0cnAsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLXsKLSAgLyogPz8/IFJ1bnRpbWUgYWRkZWQgaW5zbnMgbm90IGhhbmRsZWQgeWV0LiAgKi8KLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCBjaGFyICpzdHIgPSAqc3RycDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBjb25zdCBjaGFyICpwOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgLyogRklYTUU6IHdpcCAqLwotICBpbnQgcGFzdF9vcGNvZGVfcDsKLSNlbmRpZgotCi0gIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoZSBtbmVtb25pYyBpcyBmaXJzdCAodGhlcmUgYXJlIG5vIGxlYWRpbmcgb3BlcmFuZHMpLgotICAgICBXZSBjYW4gcGFyc2UgaXQgd2l0aG91dCBuZWVkaW5nIHRvIHNldCB1cCBvcGVyYW5kIHBhcnNpbmcuCi0gICAgIEdBUydzIGlucHV0IHNjcnViYmVyIHdpbGwgZW5zdXJlIG1uZW1vbmljcyBhcmUgbG93ZXJjYXNlLCBidXQgd2UgbWF5Ci0gICAgIG5vdCBiZSBjYWxsZWQgZnJvbSBHQVMuICAqLwotICBwID0gQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKTsKLSAgd2hpbGUgKCpwICYmIHRvbG93ZXIgKCpwKSA9PSB0b2xvd2VyICgqc3RyKSkKLSAgICArK3AsICsrc3RyOwotICAKLSAgaWYgKCogcCB8fCAoKiBzdHIgJiYgIWlzc3BhY2UgKCogc3RyKSkpCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotCi0gIENHRU5fSU5JVF9QQVJTRSAoY2QpOwotICBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0jZW5kaWYKLQotICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLSAgICAgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOwotCi0gIC8qIE1uZW1vbmljcyBjb21lIGZpcnN0IGZvciBub3csIGVuc3VyZSB2YWxpZCBzdHJpbmcuICAqLwotICBpZiAoISBDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqIHN5bikpCi0gICAgYWJvcnQgKCk7Ci0KLSAgKytzeW47Ci0KLSAgd2hpbGUgKCogc3luICE9IDApCi0gICAgewotICAgICAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQl7Ci0JICBpZiAoKnN0ciA9PSBDR0VOX1NZTlRBWF9DSEFSICgqIHN5bikpCi0JICAgIHsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0JICAgICAgaWYgKCogc3luID09ICcgJykKLQkJcGFzdF9vcGNvZGVfcCA9IDE7Ci0jZW5kaWYKLQkgICAgICArKyBzeW47Ci0JICAgICAgKysgc3RyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uICAqLwotCSAgICAgIC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIHJldHVybiBzb21ldGhpbmcgbGlrZQotCQkgImV4cGVjdGVkIGNoYXIgYGMnIiAqLwotCSAgICAgIHJldHVybiBfKCJzeW50YXggZXJyb3IiKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQgb2Ygc29tZSBzb3J0LiAgKi8KLSAgICAgIGVycm1zZyA9IGZyMzBfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQkgICZzdHIsIGZpZWxkcyk7Ci0gICAgICBpZiAoZXJybXNnKQotCXJldHVybiBlcnJtc2c7Ci0KLSAgICAgIC8qIERvbmUgd2l0aCB0aGlzIG9wZXJhbmQsIGNvbnRpbnVlIHdpdGggbmV4dCBvbmUuICAqLwotICAgICAgKysgc3luOwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW50YXggc3RyaW5nLCB3ZSdyZSBkb25lLiAgKi8KLSAgaWYgKCogc3luID09ICdcMCcpCi0gICAgewotICAgICAgLyogRklYTUU6IEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4KLQkgYmxhbmtzIG5vdy4gIElFOiBXZSBuZWVkbid0IHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHZlcnNpb24gb2YKLQkgdGhlIGluc24gYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCBsb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgYXBwZWFyCi0JIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0JKysgc3RyOwotCi0gICAgICBpZiAoKiBzdHIgIT0gJ1wwJykKLQlyZXR1cm4gXygianVuayBhdCBlbmQgb2YgbGluZSIpOyAvKiBGSVhNRTogd291bGQgbGlrZSB0byBpbmNsdWRlIGBzdHInICovCi0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4gICovCi0gIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLX0KLQwKLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFNUUiBwb2ludHMgdG8gdGhlIGluc24gdG8gYmUgYXNzZW1ibGVkLgotICAgV2UgYXNzdW1lIGFsbCBuZWNlc3NhcnkgdGFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgIFRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24sIGxlc3MgYW55IGZpeHVwcywgaXMgc3RvcmVkIGluIEJVRi4KLSAgIFJlbWVtYmVyIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIHRoZW4gQlVGIGlzIGFuIGludCBhbmQgdGh1cyB0aGUgdmFsdWUKLSAgIHN0aWxsIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byB0YXJnZXQgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRiBpcyBhbiBhcnJheQotICAgb2YgYnl0ZXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgaW5zbidzIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUsCi0gICBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VyZWQgKGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBoYXZlIGFscmVhZHkgYmVlbgotICAgcHJpbnRlZCkuCi0KLSAgIE5vdGUgdGhhdCB3aGVuIHByb2Nlc3NpbmcgKG5vbi1hbGlhcykgbWFjcm8taW5zbnMsCi0gICB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2VzLgotCi0gICA/Pz8gSXQncyBwb3NzaWJsZSB0byBtYWtlIHRoaXMgY3B1LWluZGVwZW5kZW50LgotICAgT25lIHdvdWxkIGhhdmUgdG8gZGVhbCB3aXRoIGEgZmV3IG1pbm9yIHRoaW5ncy4KLSAgIEF0IHRoaXMgcG9pbnQgaW4gdGltZSBkb2luZyBzbyB3b3VsZCBiZSBtb3JlIG9mIGEgY3VyaW9zaXR5IHRoYW4gdXNlZnVsCi0gICBbZm9yIGV4YW1wbGUgdGhpcyBmaWxlIGlzbid0IF90aGF0XyBiaWddLCBidXQga2VlcGluZyB0aGUgcG9zc2liaWxpdHkgaW4KLSAgIG1pbmQgaGVscHMga2VlcCB0aGUgZGVzaWduIGNsZWFuLiAgKi8KLQotY29uc3QgQ0dFTl9JTlNOICoKLWZyMzBfY2dlbl9hc3NlbWJsZV9pbnNuIChjZCwgc3RyLCBmaWVsZHMsIGJ1ZiwgZXJybXNnKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmOwotICAgICBjaGFyICoqZXJybXNnOwotewotICBjb25zdCBjaGFyICpzdGFydDsKLSAgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OwotCi0gIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0gICAgKysgc3RyOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoZWQgbGlzdHMuCi0gICAgIEdldCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuICAqLwotICBpbGlzdCA9IENHRU5fQVNNX0xPT0tVUF9JTlNOIChjZCwgc3RyKTsKLQotICAvKiBLZWVwIGxvb2tpbmcgdW50aWwgd2UgZmluZCBhIG1hdGNoLiAgKi8KLQotICBzdGFydCA9IHN0cjsKLSAgZm9yICggOyBpbGlzdCAhPSBOVUxMIDsgaWxpc3QgPSBDR0VOX0FTTV9ORVhUX0lOU04gKGlsaXN0KSkKLSAgICB7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpbGlzdC0+aW5zbjsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyB1bnN1cHBvcnRlZCBvcGNvZGVzIHNob3VsZG4ndCBiZSBpbiB0aGUgaGFzaCBsaXN0cyAqLwotICAgICAgLyogSXMgdGhpcyBpbnNuIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgY3B1PyAgKi8KLSAgICAgIGlmICghIGZyMzBfY2dlbl9pbnNuX3N1cHBvcnRlZCAoY2QsIGluc24pKQotCWNvbnRpbnVlOwotI2VuZGlmCi0KLSAgICAgIC8qIElmIHRoZSBSRUxBWCBhdHRyaWJ1dGUgaXMgc2V0LCB0aGlzIGlzIGFuIGluc24gdGhhdCBzaG91bGRuJ3QgYmUKLQkgY2hvc2VuIGltbWVkaWF0ZWx5LiAgSW5zdGVhZCwgaXQgaXMgdXNlZCBkdXJpbmcgYXNzZW1ibGVyL2xpbmtlcgotCSByZWxheGF0aW9uIGlmIHBvc3NpYmxlLiAgKi8KLSAgICAgIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzdHIgPSBzdGFydDsKLQotICAgICAgLyogQWxsb3cgcGFyc2UvaW5zZXJ0IGhhbmRsZXJzIHRvIG9idGFpbiBsZW5ndGggb2YgaW5zbi4gICovCi0gICAgICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotCi0gICAgICBpZiAoISBDR0VOX1BBUlNFX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCAmIHN0ciwgZmllbGRzKSkKLQl7Ci0JICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLQkgIGlmIChDR0VOX0lOU0VSVF9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgZmllbGRzLCBidWYsIChiZmRfdm1hKSAwKQotCSAgICAgICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBhY3R1YWxseSBvdXRwdXQgdGhlIGluc24gYW5kIGFueQotCSAgICAgcXVldWVkIHJlbG9jcy4gICovCi0JICByZXR1cm4gaW5zbjsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0aGUgbmV4dCBlbnRyeS4gICovCi0gICAgfQotCi0gIC8qIEZJWE1FOiBXZSBjYW4gcmV0dXJuIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhhbiB0aGlzLgotICAgICBOZWVkIHRvIHRyYWNrIHdoeSBpdCBmYWlsZWQgYW5kIHBpY2sgdGhlIHJpZ2h0IG9uZS4gICovCi0gIHsKLSAgICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgICBpZiAoc3RybGVuIChzdGFydCkgPiA1MCkKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMuLi4nIiksIHN0YXJ0KTsKLSAgICBlbHNlIAotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcyciKSwgc3RhcnQpOwotICAgICAgCi0gICAgKmVycm1zZyA9IGVycmJ1ZjsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotDAotI2lmIDAgLyogVGhpcyBjYWxscyBiYWNrIHRvIEdBUyB3aGljaCB3ZSBjYW4ndCBkbyB3aXRob3V0IGNhcmUuICAqLwotCi0vKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCi0gICBUaGlzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCi0gICA/Pz8gSW50ZXJlc3RpbmcgaWRlYSBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgotICAgRklYTUU6IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXZvaWQKLWZyMzBfY2dlbl9hc21faGFzaF9rZXl3b3JkcyAoY2QsIG9wdmFscykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9LRVlXT1JEICpvcHZhbHM7Ci17Ci0gIENHRU5fS0VZV09SRF9TRUFSQ0ggc2VhcmNoID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0IChvcHZhbHMsIE5VTEwpOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKiBrZTsKLQotICB3aGlsZSAoKGtlID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0ICgmIHNlYXJjaCkpICE9IE5VTEwpCi0gICAgewotI2lmIDAgLyogVW5uZWNlc3NhcnksIHNob3VsZCBiZSBkb25lIGluIHRoZSBzZWFyY2ggcm91dGluZS4gICovCi0gICAgICBpZiAoISBmcjMwX2NnZW5fb3B2YWxfc3VwcG9ydGVkIChrZSkpCi0JY29udGludWU7Ci0jZW5kaWYKLSAgICAgIGNnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAoY2QsIGtlLT5uYW1lLCBrZS0+dmFsdWUpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1kZXNjLmMgYi9vcGNvZGVzL2ZyMzAtZGVzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTBmMDRiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1kZXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQzICswLDAgQEAKLS8qIENQVSBkYXRhIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAiZnIzMC1kZXNjLmgiCi0jaW5jbHVkZSAiZnIzMC1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogQXR0cmlidXRlcy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgYm9vbF9hdHRyW10gPQotewotICB7ICIjZiIsIDAgfSwKLSAgeyAiI3QiLCAxIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIE1BQ0hfYXR0cltdID0KLXsKLSAgeyAiYmFzZSIsIE1BQ0hfQkFTRSB9LAotICB7ICJmcjMwIiwgTUFDSF9GUjMwIH0sCi0gIHsgIm1heCIsIE1BQ0hfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIElTQV9hdHRyW10gPQotewotICB7ICJmcjMwIiwgSVNBX0ZSMzAgfSwKLSAgeyAibWF4IiwgSVNBX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDUkVMLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkFCUy1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRVNFUlZFRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkNBQ0hFLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQUk9GSUxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7IDAsIDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIGZyMzBfY2dlbl9vcGVyYW5kX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQ1JFTC1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJBQlMtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTkVHQVRJVkUiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTRU0tT05MWSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiSEFTSC1QUkVGSVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX2luc25fYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIkFMSUFTIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJVTkNPTkQtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDT05ELUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0tJUC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkRFTEFZLVNMT1QiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTEFYQUJMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVgiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5PLURJUyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUEJCIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJOT1QtSU4tREVMQVktU0xPVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLS8qIEluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lTQSBmcjMwX2NnZW5faXNhX3RhYmxlW10gPSB7Ci0gIHsgImZyMzAiLCAxNiwgMTYsIDE2LCA0OCwgIH0sCi0gIHsgMCB9Ci19OwotCi0vKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fTUFDSCBmcjMwX2NnZW5fbWFjaF90YWJsZVtdID0gewotICB7ICJmcjMwIiwgImZyMzAiLCBNQUNIX0ZSMzAgfSwKLSAgeyAwIH0KLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgInIwIiwgMCB9LAotICB7ICJyMSIsIDEgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9LAotICB7ICJhYyIsIDEzIH0sCi0gIHsgImZwIiwgMTQgfSwKLSAgeyAic3AiLCAxNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzID0KLXsKLSAgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1swXSwKLSAgMTkKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgImNyMCIsIDAgfSwKLSAgeyAiY3IxIiwgMSB9LAotICB7ICJjcjIiLCAyIH0sCi0gIHsgImNyMyIsIDMgfSwKLSAgeyAiY3I0IiwgNCB9LAotICB7ICJjcjUiLCA1IH0sCi0gIHsgImNyNiIsIDYgfSwKLSAgeyAiY3I3IiwgNyB9LAotICB7ICJjcjgiLCA4IH0sCi0gIHsgImNyOSIsIDkgfSwKLSAgeyAiY3IxMCIsIDEwIH0sCi0gIHsgImNyMTEiLCAxMSB9LAotICB7ICJjcjEyIiwgMTIgfSwKLSAgeyAiY3IxMyIsIDEzIH0sCi0gIHsgImNyMTQiLCAxNCB9LAotICB7ICJjcjE1IiwgMTUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lcyA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzX2VudHJpZXNbMF0sCi0gIDE2Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lc19lbnRyaWVzW10gPQotewotICB7ICJ0YnIiLCAwIH0sCi0gIHsgInJwIiwgMSB9LAotICB7ICJzc3AiLCAyIH0sCi0gIHsgInVzcCIsIDMgfSwKLSAgeyAibWRoIiwgNCB9LAotICB7ICJtZGwiLCA1IH0KLX07Ci0KLUNHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lc19lbnRyaWVzWzBdLAotICA2Ci19OwotCi1zdGF0aWMgQ0dFTl9LRVlXT1JEX0VOVFJZIGZyMzBfY2dlbl9vcHZhbF9oX3BzX2VudHJpZXNbXSA9Ci17Ci0gIHsgInBzIiwgMCB9Ci19OwotCi1DR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcHMgPQotewotICAmIGZyMzBfY2dlbl9vcHZhbF9oX3BzX2VudHJpZXNbMF0sCi0gIDEKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgZnIzMF9jZ2VuX29wdmFsX2hfcjEzX2VudHJpZXNbXSA9Ci17Ci0gIHsgInIxMyIsIDAgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxMyA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2hfcjEzX2VudHJpZXNbMF0sCi0gIDEKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgZnIzMF9jZ2VuX29wdmFsX2hfcjE0X2VudHJpZXNbXSA9Ci17Ci0gIHsgInIxNCIsIDAgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxNCA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE0X2VudHJpZXNbMF0sCi0gIDEKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgZnIzMF9jZ2VuX29wdmFsX2hfcjE1X2VudHJpZXNbXSA9Ci17Ci0gIHsgInIxNSIsIDAgfQotfTsKLQotQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxNSA9Ci17Ci0gICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE1X2VudHJpZXNbMF0sCi0gIDEKLX07Ci0KLQotCi0vKiBUaGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9IV18sYSkpCi0KLWNvbnN0IENHRU5fSFdfRU5UUlkgZnIzMF9jZ2VuX2h3X3RhYmxlW10gPQotewotICB7ICJoLW1lbW9yeSIsIEhXX0hfTUVNT1JZLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2ludCIsIEhXX0hfU0lOVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXVpbnQiLCBIV19IX1VJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1hZGRyIiwgSFdfSF9BRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaWFkZHIiLCBIV19IX0lBRERSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcGMiLCBIV19IX1BDLCBDR0VOX0FTTV9OT05FLCAwLCB7IDB8QShQUk9GSUxFKXxBKFBDKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1nciIsIEhXX0hfR1IsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCB7IDB8QShDQUNIRV9BRERSKXxBKFBST0ZJTEUpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWNyIiwgSFdfSF9DUiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1kciIsIEhXX0hfRFIsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcHMiLCBIV19IX1BTLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIGZyMzBfY2dlbl9vcHZhbF9oX3BzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcjEzIiwgSFdfSF9SMTMsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2hfcjEzLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcjE0IiwgSFdfSF9SMTQsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtcjE1IiwgSFdfSF9SMTUsIENHRU5fQVNNX0tFWVdPUkQsIChQVFIpICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE1LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtbmJpdCIsIEhXX0hfTkJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXpiaXQiLCBIV19IX1pCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC12Yml0IiwgSFdfSF9WQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtY2JpdCIsIEhXX0hfQ0JJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWliaXQiLCBIV19IX0lCSVQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1zYml0IiwgSFdfSF9TQklULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtdGJpdCIsIEhXX0hfVEJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWQwYml0IiwgSFdfSF9EMEJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWQxYml0IiwgSFdfSF9EMUJJVCwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWNjciIsIEhXX0hfQ0NSLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtc2NyIiwgSFdfSF9TQ1IsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1pbG0iLCBIV19IX0lMTSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotLyogVGhlIGluc3RydWN0aW9uIGZpZWxkIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSUZMRF8sYSkpCi0KLWNvbnN0IENHRU5fSUZMRCBmcjMwX2NnZW5faWZsZF90YWJsZVtdID0KLXsKLSAgeyBGUjMwX0ZfTklMLCAiZi1uaWwiLCAwLCAwLCAwLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9PUDEsICJmLW9wMSIsIDAsIDE2LCAwLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9PUDIsICJmLW9wMiIsIDAsIDE2LCA0LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9PUDMsICJmLW9wMyIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9PUDQsICJmLW9wNCIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfT1A1LCAiZi1vcDUiLCAwLCAxNiwgNCwgMSwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfQ0MsICJmLWNjIiwgMCwgMTYsIDQsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0NDQywgImYtY2NjIiwgMTYsIDE2LCAwLCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SSiwgImYtUmoiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkksICJmLVJpIiwgMCwgMTYsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SUzEsICJmLVJzMSIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SUzIsICJmLVJzMiIsIDAsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfUkpDLCAiZi1SamMiLCAxNiwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JJQywgImYtUmljIiwgMTYsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfQ1JKLCAiZi1DUmoiLCAxNiwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0NSSSwgImYtQ1JpIiwgMTYsIDE2LCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfVTQsICJmLXU0IiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1U0QywgImYtdTRjIiwgMCwgMTYsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9JNCwgImYtaTQiLCAwLCAxNiwgOCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfTTQsICJmLW00IiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1U4LCAiZi11OCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9JOCwgImYtaTgiLCAwLCAxNiwgNCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTIwXzQsICJmLWkyMC00IiwgMCwgMTYsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0kyMF8xNiwgImYtaTIwLTE2IiwgMTYsIDE2LCAwLCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfSTMyLCAiZi1pMzIiLCAxNiwgMzIsIDAsIDMyLCB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9VRElTUDYsICJmLXVkaXNwNiIsIDAsIDE2LCA4LCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVNQOCwgImYtZGlzcDgiLCAwLCAxNiwgNCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElTUDksICJmLWRpc3A5IiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJU1AxMCwgImYtZGlzcDEwIiwgMCwgMTYsIDQsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1MxMCwgImYtczEwIiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1UxMCwgImYtdTEwIiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JFTDksICJmLXJlbDkiLCAwLCAxNiwgOCwgOCwgeyAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9ESVI4LCAiZi1kaXI4IiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX0RJUjksICJmLWRpcjkiLCAwLCAxNiwgOCwgOCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBGUjMwX0ZfRElSMTAsICJmLWRpcjEwIiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JFTDEyLCAiZi1yZWwxMiIsIDAsIDE2LCA1LCAxMSwgeyAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUdMSVNUX0hJX1NULCAiZi1yZWdsaXN0X2hpX3N0IiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JFR0xJU1RfTE9XX1NULCAiZi1yZWdsaXN0X2xvd19zdCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IEZSMzBfRl9SRUdMSVNUX0hJX0xELCAiZi1yZWdsaXN0X2hpX2xkIiwgMCwgMTYsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgRlIzMF9GX1JFR0xJU1RfTE9XX0xELCAiZi1yZWdsaXN0X2xvd19sZCIsIDAsIDE2LCA4LCA4LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IDAgfQotfTsKLQotI3VuZGVmIEEKLQotLyogVGhlIG9wZXJhbmQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9PUEVSQU5EXyxhKSkKLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoRlIzMF9PUEVSQU5EXyxvcCkKLQotY29uc3QgQ0dFTl9PUEVSQU5EIGZyMzBfY2dlbl9vcGVyYW5kX3RhYmxlW10gPQotewotLyogcGM6IHByb2dyYW0gY291bnRlciAqLwotICB7ICJwYyIsIEZSMzBfT1BFUkFORF9QQywgSFdfSF9QQywgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUmk6IGRlc3RpbmF0aW9uIHJlZ2lzdGVyICovCi0gIHsgIlJpIiwgRlIzMF9PUEVSQU5EX1JJLCBIV19IX0dSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUmo6IHNvdXJjZSByZWdpc3RlciAqLwotICB7ICJSaiIsIEZSMzBfT1BFUkFORF9SSiwgSFdfSF9HUiwgOCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUmljOiB0YXJnZXQgcmVnaXN0ZXIgY29wcm9jIGluc24gKi8KLSAgeyAiUmljIiwgRlIzMF9PUEVSQU5EX1JJQywgSFdfSF9HUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFJqYzogc291cmNlIHJlZ2lzdGVyIGNvcHJvYyBpbnNuICovCi0gIHsgIlJqYyIsIEZSMzBfT1BFUkFORF9SSkMsIEhXX0hfR1IsIDgsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIENSaTogY29wcm9jZXNzb3IgcmVnaXN0ZXIgKi8KLSAgeyAiQ1JpIiwgRlIzMF9PUEVSQU5EX0NSSSwgSFdfSF9DUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIENSajogY29wcm9jZXNzb3IgcmVnaXN0ZXIgKi8KLSAgeyAiQ1JqIiwgRlIzMF9PUEVSQU5EX0NSSiwgSFdfSF9DUiwgOCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUnMxOiBkZWRpY2F0ZWQgcmVnaXN0ZXIgKi8KLSAgeyAiUnMxIiwgRlIzMF9PUEVSQU5EX1JTMSwgSFdfSF9EUiwgOCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUnMyOiBkZWRpY2F0ZWQgcmVnaXN0ZXIgKi8KLSAgeyAiUnMyIiwgRlIzMF9PUEVSQU5EX1JTMiwgSFdfSF9EUiwgMTIsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIFIxMzogR2VuZXJhbCBSZWdpc3RlciAxMyAqLwotICB7ICJSMTMiLCBGUjMwX09QRVJBTkRfUjEzLCBIV19IX1IxMywgMCwgMCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogUjE0OiBHZW5lcmFsIFJlZ2lzdGVyIDE0ICovCi0gIHsgIlIxNCIsIEZSMzBfT1BFUkFORF9SMTQsIEhXX0hfUjE0LCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBSMTU6IEdlbmVyYWwgUmVnaXN0ZXIgMTUgKi8KLSAgeyAiUjE1IiwgRlIzMF9PUEVSQU5EX1IxNSwgSFdfSF9SMTUsIDAsIDAsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHBzOiBQcm9ncmFtIFN0YXR1cyByZWdpc3RlciAqLwotICB7ICJwcyIsIEZSMzBfT1BFUkFORF9QUywgSFdfSF9QUywgMCwgMCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdTQ6IDQgIGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidTQiLCBGUjMwX09QRVJBTkRfVTQsIEhXX0hfVUlOVCwgOCwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdTRjOiA0ICBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInU0YyIsIEZSMzBfT1BFUkFORF9VNEMsIEhXX0hfVUlOVCwgMTIsIDQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHU4OiA4ICBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInU4IiwgRlIzMF9PUEVSQU5EX1U4LCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGk4OiA4ICBiaXQgdW5zaWduZWQgaW1tZWRpYXRlICovCi0gIHsgImk4IiwgRlIzMF9PUEVSQU5EX0k4LCBIV19IX1VJTlQsIDQsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVkaXNwNjogNiAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1ZGlzcDYiLCBGUjMwX09QRVJBTkRfVURJU1A2LCBIV19IX1VJTlQsIDgsIDQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3A4OiA4ICBiaXQgc2lnbmVkICAgaW1tZWRpYXRlICovCi0gIHsgImRpc3A4IiwgRlIzMF9PUEVSQU5EX0RJU1A4LCBIV19IX1NJTlQsIDQsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3A5OiA5ICBiaXQgc2lnbmVkICAgaW1tZWRpYXRlICovCi0gIHsgImRpc3A5IiwgRlIzMF9PUEVSQU5EX0RJU1A5LCBIV19IX1NJTlQsIDQsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3AxMDogMTAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLwotICB7ICJkaXNwMTAiLCBGUjMwX09QRVJBTkRfRElTUDEwLCBIV19IX1NJTlQsIDQsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHMxMDogMTAgYml0IHNpZ25lZCAgIGltbWVkaWF0ZSAqLwotICB7ICJzMTAiLCBGUjMwX09QRVJBTkRfUzEwLCBIV19IX1NJTlQsIDgsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHUxMDogMTAgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotICB7ICJ1MTAiLCBGUjMwX09QRVJBTkRfVTEwLCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGkzMjogMzIgYml0IGltbWVkaWF0ZSAqLwotICB7ICJpMzIiLCBGUjMwX09QRVJBTkRfSTMyLCBIV19IX1VJTlQsIDAsIDMyLAotICAgIHsgMHxBKEhBU0hfUFJFRklYKXxBKFNJR05fT1BUKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBtNDogNCAgYml0IG5lZ2F0aXZlIGltbWVkaWF0ZSAqLwotICB7ICJtNCIsIEZSMzBfT1BFUkFORF9NNCwgSFdfSF9TSU5ULCA4LCA0LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpMjA6IDIwIGJpdCBpbW1lZGlhdGUgKi8KLSAgeyAiaTIwIiwgRlIzMF9PUEVSQU5EX0kyMCwgSFdfSF9VSU5ULCAwLCAyMCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCl8QShWSVJUVUFMKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXI4OiA4ICBiaXQgZGlyZWN0IGFkZHJlc3MgKi8KLSAgeyAiZGlyOCIsIEZSMzBfT1BFUkFORF9ESVI4LCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpcjk6IDkgIGJpdCBkaXJlY3QgYWRkcmVzcyAqLwotICB7ICJkaXI5IiwgRlIzMF9PUEVSQU5EX0RJUjksIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlyMTA6IDEwIGJpdCBkaXJlY3QgYWRkcmVzcyAqLwotICB7ICJkaXIxMCIsIEZSMzBfT1BFUkFORF9ESVIxMCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBsYWJlbDk6IDkgIGJpdCBwYyByZWxhdGl2ZSBhZGRyZXNzICovCi0gIHsgImxhYmVsOSIsIEZSMzBfT1BFUkFORF9MQUJFTDksIEhXX0hfSUFERFIsIDgsIDgsCi0gICAgeyAwfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogbGFiZWwxMjogMTIgYml0IHBjIHJlbGF0aXZlIGFkZHJlc3MgKi8KLSAgeyAibGFiZWwxMiIsIEZSMzBfT1BFUkFORF9MQUJFTDEyLCBIV19IX0lBRERSLCA1LCAxMSwKLSAgICB7IDB8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiByZWdsaXN0X2xvd19sZDogOCBiaXQgbG93IHJlZ2lzdGVyIG1hc2sgZm9yIGxkbSAqLwotICB7ICJyZWdsaXN0X2xvd19sZCIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCwgSFdfSF9VSU5ULCA4LCA4LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiByZWdsaXN0X2hpX2xkOiA4IGJpdCBoaWdoIHJlZ2lzdGVyIG1hc2sgZm9yIGxkbSAqLwotICB7ICJyZWdsaXN0X2hpX2xkIiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcmVnbGlzdF9sb3dfc3Q6IDggYml0IGxvdyByZWdpc3RlciBtYXNrIGZvciBzdG0gKi8KLSAgeyAicmVnbGlzdF9sb3dfc3QiLCBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QsIEhXX0hfVUlOVCwgOCwgOCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogcmVnbGlzdF9oaV9zdDogOCBiaXQgaGlnaCByZWdpc3RlciBtYXNrIGZvciBzdG0gKi8KLSAgeyAicmVnbGlzdF9oaV9zdCIsIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NULCBIV19IX1VJTlQsIDgsIDgsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGNjOiBjb25kaXRpb24gY29kZXMgKi8KLSAgeyAiY2MiLCBGUjMwX09QRVJBTkRfQ0MsIEhXX0hfVUlOVCwgNCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY2NjOiBjb3Byb2Nlc3NvciBjYWxjICovCi0gIHsgImNjYyIsIEZSMzBfT1BFUkFORF9DQ0MsIEhXX0hfVUlOVCwgMCwgOCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogbmJpdDogbmVnYXRpdmUgICBiaXQgKi8KLSAgeyAibmJpdCIsIEZSMzBfT1BFUkFORF9OQklULCBIV19IX05CSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHZiaXQ6IG92ZXJmbG93ICAgYml0ICovCi0gIHsgInZiaXQiLCBGUjMwX09QRVJBTkRfVkJJVCwgSFdfSF9WQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB6Yml0OiB6ZXJvICAgICAgIGJpdCAqLwotICB7ICJ6Yml0IiwgRlIzMF9PUEVSQU5EX1pCSVQsIEhXX0hfWkJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY2JpdDogY2FycnkgICAgICBiaXQgKi8KLSAgeyAiY2JpdCIsIEZSMzBfT1BFUkFORF9DQklULCBIV19IX0NCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGliaXQ6IGludGVycnVwdCAgYml0ICovCi0gIHsgImliaXQiLCBGUjMwX09QRVJBTkRfSUJJVCwgSFdfSF9JQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBzYml0OiBzdGFjayAgICAgIGJpdCAqLwotICB7ICJzYml0IiwgRlIzMF9PUEVSQU5EX1NCSVQsIEhXX0hfU0JJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdGJpdDogdHJhY2UgdHJhcCBiaXQgKi8KLSAgeyAidGJpdCIsIEZSMzBfT1BFUkFORF9UQklULCBIV19IX1RCSVQsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGQwYml0OiBkaXZpc2lvbiAwIGJpdCAqLwotICB7ICJkMGJpdCIsIEZSMzBfT1BFUkFORF9EMEJJVCwgSFdfSF9EMEJJVCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZDFiaXQ6IGRpdmlzaW9uIDEgYml0ICovCi0gIHsgImQxYml0IiwgRlIzMF9PUEVSQU5EX0QxQklULCBIV19IX0QxQklULCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBjY3I6IGNvbmRpdGlvbiBjb2RlIGJpdHMgKi8KLSAgeyAiY2NyIiwgRlIzMF9PUEVSQU5EX0NDUiwgSFdfSF9DQ1IsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNjcjogc3lzdGVtIGNvbmRpdGlvbiBiaXRzICovCi0gIHsgInNjciIsIEZSMzBfT1BFUkFORF9TQ1IsIEhXX0hfU0NSLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBpbG06IGludGVycnVwdCBsZXZlbCBtYXNrICovCi0gIHsgImlsbSIsIEZSMzBfT1BFUkFORF9JTE0sIEhXX0hfSUxNLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgZnIzMF9jZ2VuX2luc25fdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyAwLCAwLCAwIH0sCi0vKiBhZGQgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERCwgImFkZCIsICJhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGQgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FEREksICJhZGRpIiwgImFkZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZDIgJG00LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERDIsICJhZGQyIiwgImFkZDIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRjICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BRERDLCAiYWRkYyIsICJhZGRjIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkbiAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQURETiwgImFkZG4iLCAiYWRkbiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZG4gJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FERE5JLCAiYWRkbmkiLCAiYWRkbiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZG4yICRtNCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BREROMiwgImFkZG4yIiwgImFkZG4yIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3ViICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVUIsICJzdWIiLCAic3ViIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3ViYyAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1VCQywgInN1YmMiLCAic3ViYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN1Ym4gJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NVQk4sICJzdWJuIiwgInN1Ym4iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXAgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NNUCwgImNtcCIsICJjbXAiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXAgJHU0LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NNUEksICJjbXBpIiwgImNtcCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcDIgJG00LCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NNUDIsICJjbXAyIiwgImNtcDIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhbmQgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FORCwgImFuZCIsICJhbmQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvciAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fT1IsICJvciIsICJvciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGVvciAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRU9SLCAiZW9yIiwgImVvciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZCAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FORE0sICJhbmRtIiwgImFuZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZGggJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkRILCAiYW5kaCIsICJhbmRoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kYiAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0FOREIsICJhbmRiIiwgImFuZGIiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvciAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09STSwgIm9ybSIsICJvciIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG9yaCAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX09SSCwgIm9yaCIsICJvcmgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvcmIgJFJqLEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9PUkIsICJvcmIiLCAib3JiIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW9yICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRU9STSwgImVvcm0iLCAiZW9yIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZW9yaCAkUmosQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VPUkgsICJlb3JoIiwgImVvcmgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBlb3JiICRSaixAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRU9SQiwgImVvcmIiLCAiZW9yYiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJhbmRsICR1NCxAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkFOREwsICJiYW5kbCIsICJiYW5kbCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJvcmwgJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CT1JMLCAiYm9ybCIsICJib3JsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmVvcmwgJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CRU9STCwgImJlb3JsIiwgImJlb3JsIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmFuZGggJHU0LEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CQU5ESCwgImJhbmRoIiwgImJhbmRoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm9yaCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JPUkgsICJib3JoIiwgImJvcmgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZW9yaCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JFT1JILCAiYmVvcmgiLCAiYmVvcmgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBidHN0bCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JUU1RMLCAiYnRzdGwiLCAiYnRzdGwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBidHN0aCAkdTQsQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JUU1RILCAiYnRzdGgiLCAiYnRzdGgiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWwgJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01VTCwgIm11bCIsICJtdWwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWx1ICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NVUxVLCAibXVsdSIsICJtdWx1IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXVsaCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTVVMSCwgIm11bGgiLCAibXVsaCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG11bHVoICRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NVUxVSCwgIm11bHVoIiwgIm11bHVoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZGl2MHMgJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRElWMFMsICJkaXYwcyIsICJkaXYwcyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdjB1ICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjBVLCAiZGl2MHUiLCAiZGl2MHUiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXYxICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjEsICJkaXYxIiwgImRpdjEiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXYyICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RJVjIsICJkaXYyIiwgImRpdjIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkaXYzICovCi0gIHsKLSAgICBGUjMwX0lOU05fRElWMywgImRpdjMiLCAiZGl2MyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdjRzICovCi0gIHsKLSAgICBGUjMwX0lOU05fRElWNFMsICJkaXY0cyIsICJkaXY0cyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzbCAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTFNMLCAibHNsIiwgImxzbCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzbCAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTFNMSSwgImxzbGkiLCAibHNsIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbHNsMiAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTFNMMiwgImxzbDIiLCAibHNsMiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzciAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTFNSLCAibHNyIiwgImxzciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxzciAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTFNSSSwgImxzcmkiLCAibHNyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbHNyMiAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTFNSMiwgImxzcjIiLCAibHNyMiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFzciAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQVNSLCAiYXNyIiwgImFzciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFzciAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQVNSSSwgImFzcmkiLCAiYXNyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYXNyMiAkdTQsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQVNSMiwgImFzcjIiLCAiYXNyMiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTo4ICRpOCwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MREk4LCAibGRpOCIsICJsZGk6OCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaToyMCAkaTIwLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xESTIwLCAibGRpMjAiLCAibGRpOjIwIiwgMzIsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpOjMyICRpMzIsJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERJMzIsICJsZGkzMiIsICJsZGk6MzIiLCA0OCwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAJFJqLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xELCAibGQiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoIEAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERVSCwgImxkdWgiLCAibGR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgQCRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFVCLCAibGR1YiIsICJsZHViIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTMsICJsZHIxMyIsICJsZCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTNVSCwgImxkcjEzdWgiLCAibGR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTNVQiwgImxkcjEzdWIiLCAibGR1YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkIEAoJFIxNCwkZGlzcDEwKSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNCwgImxkcjE0IiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1aCBAKCRSMTQsJGRpc3A5KSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNFVILCAibGRyMTR1aCIsICJsZHVoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1YiBAKCRSMTQsJGRpc3A4KSwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFIxNFVCLCAibGRyMTR1YiIsICJsZHViIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCgkUjE1LCR1ZGlzcDYpLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE1LCAibGRyMTUiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERSMTVHUiwgImxkcjE1Z3IiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJFJzMiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE1RFIsICJsZHIxNWRyIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQgQCRSMTUrLCRwcyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xEUjE1UFMsICJsZHIxNXBzIiwgImxkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJFJpLEAkUmogKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVCwgInN0IiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RoICRSaSxAJFJqICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RILCAic3RoIiwgInN0aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0YiAkUmksQCRSaiAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUQiwgInN0YiIsICJzdGIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxMywgInN0cjEzIiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RoICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjEzSCwgInN0cjEzaCIsICJzdGgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTNCLCAic3RyMTNiIiwgInN0YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTQsJGRpc3AxMCkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNCwgInN0cjE0IiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RoICRSaSxAKCRSMTQsJGRpc3A5KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE0SCwgInN0cjE0aCIsICJzdGgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAoJFIxNCwkZGlzcDgpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSMTRCLCAic3RyMTRiIiwgInN0YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTUsJHVkaXNwNikgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNSwgInN0cjE1IiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJFJpLEAtJFIxNSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUUjE1R1IsICJzdHIxNWdyIiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJFJzMixALSRSMTUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNURSLCAic3RyMTVkciIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0ICRwcyxALSRSMTUgKi8KLSAgewotICAgIEZSMzBfSU5TTl9TVFIxNVBTLCAic3RyMTVwcyIsICJzdCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdiAkUmosJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTU9WLCAibW92IiwgIm1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdiAkUnMxLCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01PVkRSLCAibW92ZHIiLCAibW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbW92ICRwcywkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9NT1ZQUywgIm1vdnBzIiwgIm1vdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIG1vdiAkUmksJFJzMSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01PVjJEUiwgIm1vdjJkciIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtb3YgJFJpLCRwcyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX01PVjJQUywgIm1vdjJwcyIsICJtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBqbXAgQCRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0pNUCwgImptcCIsICJqbXAiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGptcDpkIEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9KTVBELCAiam1wZCIsICJqbXA6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjYWxsIEAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DQUxMUiwgImNhbGxyIiwgImNhbGwiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNhbGw6ZCBAJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ0FMTFJELCAiY2FsbHJkIiwgImNhbGw6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjYWxsICRsYWJlbDEyICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ0FMTCwgImNhbGwiLCAiY2FsbCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY2FsbDpkICRsYWJlbDEyICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ0FMTEQsICJjYWxsZCIsICJjYWxsOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcmV0ICovCi0gIHsKLSAgICBGUjMwX0lOU05fUkVULCAicmV0IiwgInJldCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcmV0OmQgKi8KLSAgewotICAgIEZSMzBfSU5TTl9SRVRfRCwgInJldDpkIiwgInJldDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGludCAkdTggKi8KLSAgewotICAgIEZSMzBfSU5TTl9JTlQsICJpbnQiLCAiaW50IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBpbnRlICovCi0gIHsKLSAgICBGUjMwX0lOU05fSU5URSwgImludGUiLCAiaW50ZSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcmV0aSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1JFVEksICJyZXRpIiwgInJldGkiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBicmE6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlJBRCwgImJyYWQiLCAiYnJhOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CUkEsICJicmEiLCAiYnJhIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibm86ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5PRCwgImJub2QiLCAiYm5vOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJubyAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5PLCAiYm5vIiwgImJubyIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJlcTpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CRVFELCAiYmVxZCIsICJiZXE6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmVxICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CRVEsICJiZXEiLCAiYmVxIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5lOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JORUQsICJibmVkIiwgImJuZTpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmUgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JORSwgImJuZSIsICJibmUiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYzpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CQ0QsICJiY2QiLCAiYmM6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmMgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JDLCAiYmMiLCAiYmMiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5DRCwgImJuY2QiLCAiYm5jOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuYyAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk5DLCAiYm5jIiwgImJuYyIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JORCwgImJuZCIsICJibjpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibiAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQk4sICJibiIsICJibiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJwOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JQRCwgImJwZCIsICJicDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBicCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlAsICJicCIsICJicCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJ2OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JWRCwgImJ2ZCIsICJidjpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBidiAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQlYsICJidiIsICJidiIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJudjpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTlZELCAiYm52ZCIsICJibnY6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm52ICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTlYsICJibnYiLCAiYm52IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmx0OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMVEQsICJibHRkIiwgImJsdDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibHQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JMVCwgImJsdCIsICJibHQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZ2U6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkdFRCwgImJnZWQiLCAiYmdlOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJnZSAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkdFLCAiYmdlIiwgImJnZSIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJsZTpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTEVELCAiYmxlZCIsICJibGU6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmxlICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CTEUsICJibGUiLCAiYmxlIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmd0OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JHVEQsICJiZ3RkIiwgImJndDpkIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpfEEoREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZ3QgJGxhYmVsOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0JHVCwgImJndCIsICJiZ3QiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibHM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxTRCwgImJsc2QiLCAiYmxzOmQiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCl8QShDT05EX0NUSSl8QShERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJscyAkbGFiZWw5ICovCi0gIHsKLSAgICBGUjMwX0lOU05fQkxTLCAiYmxzIiwgImJscyIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJoaTpkICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CSElELCAiYmhpZCIsICJiaGk6ZCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKXxBKENPTkRfQ1RJKXxBKERFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmhpICRsYWJlbDkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9CSEksICJiaGkiLCAiYmhpIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdiAkUjEzLEAkZGlyMTAgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzLCAiZG1vdnIxMyIsICJkbW92IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmggJFIxMyxAJGRpcjkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzSCwgImRtb3ZyMTNoIiwgImRtb3ZoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmIgJFIxMyxAJGRpcjggKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WUjEzQiwgImRtb3ZyMTNiIiwgImRtb3ZiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdiBAJFIxMyssQCRkaXIxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1ZSMTNQSSwgImRtb3ZyMTNwaSIsICJkbW92IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmggQCRSMTMrLEAkZGlyOSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1ZSMTNQSUgsICJkbW92cjEzcGloIiwgImRtb3ZoIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdmIgQCRSMTMrLEAkZGlyOCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1ZSMTNQSUIsICJkbW92cjEzcGliIiwgImRtb3ZiIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdiBAJFIxNSssQCRkaXIxMCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1ZSMTVQSSwgImRtb3ZyMTVwaSIsICJkbW92IiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdiBAJGRpcjEwLCRSMTMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxMywgImRtb3YycjEzIiwgImRtb3YiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92aCBAJGRpcjksJFIxMyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzSCwgImRtb3YycjEzaCIsICJkbW92aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZiIEAkZGlyOCwkUjEzICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTNCLCAiZG1vdjJyMTNiIiwgImRtb3ZiIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdiBAJGRpcjEwLEAkUjEzKyAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjEzUEksICJkbW92MnIxM3BpIiwgImRtb3YiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBkbW92aCBAJGRpcjksQCRSMTMrICovCi0gIHsKLSAgICBGUjMwX0lOU05fRE1PVjJSMTNQSUgsICJkbW92MnIxM3BpaCIsICJkbW92aCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRtb3ZiIEAkZGlyOCxAJFIxMysgKi8KLSAgewotICAgIEZSMzBfSU5TTl9ETU9WMlIxM1BJQiwgImRtb3YycjEzcGliIiwgImRtb3ZiIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZG1vdiBAJGRpcjEwLEAtJFIxNSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0RNT1YyUjE1UEQsICJkbW92MnIxNXBkIiwgImRtb3YiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHJlcyBAJFJpKywkdTQgKi8KLSAgewotICAgIEZSMzBfSU5TTl9MRFJFUywgImxkcmVzIiwgImxkcmVzIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RyZXMgJHU0LEAkUmkrICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RSRVMsICJzdHJlcyIsICJzdHJlcyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNvcG9wICR1NGMsJGNjYywkQ1JqLCRDUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DT1BPUCwgImNvcG9wIiwgImNvcG9wIiwgMzIsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY29wbGQgJHU0YywkY2NjLCRSamMsJENSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0NPUExELCAiY29wbGQiLCAiY29wbGQiLCAzMiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjb3BzdCAkdTRjLCRjY2MsJENSaiwkUmljICovCi0gIHsKLSAgICBGUjMwX0lOU05fQ09QU1QsICJjb3BzdCIsICJjb3BzdCIsIDMyLAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNvcHN2ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KLSAgewotICAgIEZSMzBfSU5TTl9DT1BTViwgImNvcHN2IiwgImNvcHN2IiwgMzIsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbm9wICovCi0gIHsKLSAgICBGUjMwX0lOU05fTk9QLCAibm9wIiwgIm5vcCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFuZGNjciAkdTggKi8KLSAgewotICAgIEZSMzBfSU5TTl9BTkRDQ1IsICJhbmRjY3IiLCAiYW5kY2NyIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3JjY3IgJHU4ICovCi0gIHsKLSAgICBGUjMwX0lOU05fT1JDQ1IsICJvcmNjciIsICJvcmNjciIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aWxtICR1OCAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUSUxNLCAic3RpbG0iLCAic3RpbG0iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRzcCAkczEwICovCi0gIHsKLSAgICBGUjMwX0lOU05fQUREU1AsICJhZGRzcCIsICJhZGRzcCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGV4dHNiICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VYVFNCLCAiZXh0c2IiLCAiZXh0c2IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBleHR1YiAkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9FWFRVQiwgImV4dHViIiwgImV4dHViIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogZXh0c2ggJFJpICovCi0gIHsKLSAgICBGUjMwX0lOU05fRVhUU0gsICJleHRzaCIsICJleHRzaCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGV4dHVoICRSaSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0VYVFVILCAiZXh0dWgiLCAiZXh0dWgiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZG0wICgkcmVnbGlzdF9sb3dfbGQpICovCi0gIHsKLSAgICBGUjMwX0lOU05fTERNMCwgImxkbTAiLCAibGRtMCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkbTEgKCRyZWdsaXN0X2hpX2xkKSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX0xETTEsICJsZG0xIiwgImxkbTEiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdG0wICgkcmVnbGlzdF9sb3dfc3QpICovCi0gIHsKLSAgICBGUjMwX0lOU05fU1RNMCwgInN0bTAiLCAic3RtMCIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0bTEgKCRyZWdsaXN0X2hpX3N0KSAqLwotICB7Ci0gICAgRlIzMF9JTlNOX1NUTTEsICJzdG0xIiwgInN0bTEiLCAxNiwKLSAgICB7IDB8QShOT1RfSU5fREVMQVlfU0xPVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBlbnRlciAkdTEwICovCi0gIHsKLSAgICBGUjMwX0lOU05fRU5URVIsICJlbnRlciIsICJlbnRlciIsIDE2LAotICAgIHsgMHxBKE5PVF9JTl9ERUxBWV9TTE9UKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxlYXZlICovCi0gIHsKLSAgICBGUjMwX0lOU05fTEVBVkUsICJsZWF2ZSIsICJsZWF2ZSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHhjaGIgQCRSaiwkUmkgKi8KLSAgewotICAgIEZSMzBfSU5TTl9YQ0hCLCAieGNoYiIsICJ4Y2hiIiwgMTYsCi0gICAgeyAwfEEoTk9UX0lOX0RFTEFZX1NMT1QpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1AKLQotLyogSW5pdGlhbGl6ZSBhbnl0aGluZyBuZWVkZWQgdG8gYmUgZG9uZSBvbmNlLCBiZWZvcmUgYW55IGNwdV9vcGVuIGNhbGwuICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF90YWJsZXMgKCkKLXsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gbG9vayB1cCBhIG1hY2ggdmlhIGl0cyBiZmQgbmFtZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggKgotbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lICh0YWJsZSwgbmFtZSkKLSAgICAgY29uc3QgQ0dFTl9NQUNIICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgd2hpbGUgKHRhYmxlLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHRhYmxlLT5iZmRfbmFtZSkgPT0gMCkKLQlyZXR1cm4gdGFibGU7Ci0gICAgICArK3RhYmxlOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9od190YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqaW5pdCA9ICYgZnIzMF9jZ2VuX2h3X3RhYmxlWzBdOwotICAvKiBNQVhfSFcgaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVudHJpZXMuCi0gICAgIEhvd2V2ZXIgZWFjaCBlbnRyeSBpcyBpbmRleGVkIGJ5IGl0J3MgZW51bSBzbyB0aGVyZSBjYW4gYmUgaG9sZXMgaW4KLSAgICAgdGhlIHRhYmxlLiAgKi8KLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9IV19FTlRSWSAqKikgeG1hbGxvYyAoTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLQotICBjZC0+aHdfdGFibGUuaW5pdF9lbnRyaWVzID0gaW5pdDsKLSAgY2QtPmh3X3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSFdfRU5UUlkpOwotICBtZW1zZXQgKHNlbGVjdGVkLCAwLCBNQVhfSFcgKiBzaXplb2YgKENHRU5fSFdfRU5UUlkgKikpOwotICAvKiA/Pz8gRm9yIG5vdyB3ZSBqdXN0IHVzZSBtYWNocyB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9IV19BVFRSX1ZBTFVFICgmaW5pdFtpXSwgQ0dFTl9IV19NQUNIKQotCSYgbWFjaHMpCi0gICAgICBzZWxlY3RlZFtpbml0W2ldLnR5cGVdID0gJmluaXRbaV07Ci0gIGNkLT5od190YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5od190YWJsZS5udW1fZW50cmllcyA9IE1BWF9IVzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2lmaWVsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgY2QtPmlmbGRfdGFibGUgPSAmIGZyMzBfY2dlbl9pZmxkX3RhYmxlWzBdOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9PUEVSQU5EICppbml0ID0gJiBmcjMwX2NnZW5fb3BlcmFuZF90YWJsZVswXTsKLSAgLyogTUFYX09QRVJBTkRTIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fT1BFUkFORCAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9PUEVSQU5EICoqKSB4bWFsbG9jIChNQVhfT1BFUkFORFMgKiBzaXplb2YgKENHRU5fT1BFUkFORCAqKSk7Ci0KLSAgY2QtPm9wZXJhbmRfdGFibGUuaW5pdF9lbnRyaWVzID0gaW5pdDsKLSAgY2QtPm9wZXJhbmRfdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9PUEVSQU5EKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotICAvKiA/Pz8gRm9yIG5vdyB3ZSBqdXN0IHVzZSBtYWNoIHRvIGRldGVybWluZSB3aGljaCBvbmVzIHdlIHdhbnQuICAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLm5hbWUgIT0gTlVMTDsgKytpKQotICAgIGlmIChDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fT1BFUkFORF9NQUNIKQotCSYgbWFjaHMpCi0gICAgICBzZWxlY3RlZFtpbml0W2ldLnR5cGVdID0gJmluaXRbaV07Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXMgPSBzZWxlY3RlZDsKLSAgY2QtPm9wZXJhbmRfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfT1BFUkFORFM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZnIzMF9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4KLSAgID8/PyBUaGlzIGNvdWxkIGxlYXZlIG91dCBpbnNucyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgbWFjaC9pc2EsCi0gICBidXQgdGhhdCB3b3VsZCBjYXVzZSBlcnJvcnMgbGlrZSAiZm9vIG9ubHkgc3VwcG9ydGVkIGJ5IGJhciIgdG8gYmVjb21lCi0gICAidW5rbm93biBpbnNuIiwgc28gZm9yIG5vdyB3ZSBpbmNsdWRlIGFsbCBpbnNucyBhbmQgcmVxdWlyZSB0aGUgYXBwIHRvCi0gICBkbyB0aGUgY2hlY2tpbmcgbGF0ZXIuCi0gICA/Pz8gT24gdGhlIG90aGVyIGhhbmQsIHBhcnNpbmcgb2Ygc3VjaCBpbnNucyBtYXkgcmVxdWlyZSB0aGVpciBoYXJkd2FyZSBvcgotICAgb3BlcmFuZCBlbGVtZW50cyB0byBiZSBpbiB0aGUgdGFibGUgW3doaWNoIHRoZXkgbWlnaHRuJ3QgYmVdLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2luc25fdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgZnIzMF9jZ2VuX2luc25fdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0KLSAgbWVtc2V0IChpbnNucywgMCwgTUFYX0lOU05TICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQotICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyA9IGluc25zOwotICBjZC0+aW5zbl90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0lCQVNFKTsKLSAgY2QtPmluc25fdGFibGUubnVtX2luaXRfZW50cmllcyA9IE1BWF9JTlNOUzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBmcjMwX2NnZW5fY3B1X29wZW4gdG8gcmVidWlsZCB0aGUgdGFibGVzLiAgKi8KLQotc3RhdGljIHZvaWQKLWZyMzBfY2dlbl9yZWJ1aWxkX3RhYmxlcyAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGksbl9pc2FzLG5fbWFjaHM7Ci0gIHVuc2lnbmVkIGludCBpc2FzID0gY2QtPmlzYXM7Ci0gIHVuc2lnbmVkIGludCBtYWNocyA9IGNkLT5tYWNoczsKLQotICBjZC0+aW50X2luc25fcCA9IENHRU5fSU5UX0lOU05fUDsKLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgaXNhIHNwZWMuICAqLwotI2RlZmluZSBVTlNFVCAoQ0dFTl9TSVpFX1VOS05PV04gKyAxKQotICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBVTlNFVDsKLSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5taW5faW5zbl9iaXRzaXplID0gNjU1MzU7IC8qIHNvbWUgcmlkaWN1bG91c2x5IGJpZyBudW1iZXIgKi8KLSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lTQVM7ICsraSkKLSAgICBpZiAoKCgxIDw8IGkpICYgaXNhcykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX0lTQSAqaXNhID0gJiBmcjMwX2NnZW5faXNhX3RhYmxlW2ldOwotCi0JLyogRGVmYXVsdCBpbnNuIHNpemVzIG9mIGFsbCBzZWxlY3RlZCBpc2FzIG11c3QgYmUgZXF1YWwgb3Igd2Ugc2V0Ci0JICAgdGhlIHJlc3VsdCB0byAwLCBtZWFuaW5nICJ1bmtub3duIi4gICovCi0JaWYgKGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9PSBVTlNFVCkKLQkgIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0JZWxzZSBpZiAoaXNhLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9PSBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUpCi0JICA7IC8qIHRoaXMgaXMgb2sgKi8KLQllbHNlCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBDR0VOX1NJWkVfVU5LTk9XTjsKLQotCS8qIEJhc2UgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+YmFzZV9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBpc2EtPmJhc2VfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+YmFzZV9pbnNuX2JpdHNpemUgPT0gY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBTZXQgbWluLG1heCBpbnNuIHNpemVzLiAgKi8KLQlpZiAoaXNhLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPm1pbl9pbnNuX2JpdHNpemUpCi0JICBjZC0+bWluX2luc25fYml0c2l6ZSA9IGlzYS0+bWluX2luc25fYml0c2l6ZTsKLQlpZiAoaXNhLT5tYXhfaW5zbl9iaXRzaXplID4gY2QtPm1heF9pbnNuX2JpdHNpemUpCi0JICBjZC0+bWF4X2luc25fYml0c2l6ZSA9IGlzYS0+bWF4X2luc25fYml0c2l6ZTsKLQotCSsrbl9pc2FzOwotICAgICAgfQotCi0gIC8qIERhdGEgZGVyaXZlZCBmcm9tIHRoZSBtYWNoIHNwZWMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX01BQ0hTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIG1hY2hzKSAhPSAwKQotICAgICAgewotCWNvbnN0IENHRU5fTUFDSCAqbWFjaCA9ICYgZnIzMF9jZ2VuX21hY2hfdGFibGVbaV07Ci0KLQkrK25fbWFjaHM7Ci0gICAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIGh3IGVsZW1lbnRzIGFyZSB1c2VkIGJ5IE1BQ0guICAqLwotICBidWlsZF9od190YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpZmllbGQgdGFibGUuICAqLwotICBidWlsZF9pZmllbGRfdGFibGUgKGNkKTsKLQotICAvKiBEZXRlcm1pbmUgd2hpY2ggb3BlcmFuZHMgYXJlIHVzZWQgYnkgTUFDSC9JU0EuICAqLwotICBidWlsZF9vcGVyYW5kX3RhYmxlIChjZCk7Ci0KLSAgLyogQnVpbGQgdGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLSAgYnVpbGRfaW5zbl90YWJsZSAoY2QpOwotfQotCi0vKiBJbml0aWFsaXplIGEgY3B1IHRhYmxlIGFuZCByZXR1cm4gYSBkZXNjcmlwdG9yLgotICAgSXQncyBtdWNoIGxpa2Ugb3BlbmluZyBhIGZpbGUsIGFuZCBtdXN0IGJlIHRoZSBmaXJzdCBmdW5jdGlvbiBjYWxsZWQuCi0gICBUaGUgYXJndW1lbnRzIGFyZSBhIHNldCBvZiAodHlwZS92YWx1ZSkgcGFpcnMsIHRlcm1pbmF0ZWQgd2l0aAotICAgQ0dFTl9DUFVfT1BFTl9FTkQuCi0KLSAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzOgotICAgQ0dFTl9DUFVfT1BFTl9JU0FTOiAgICBiaXRtYXAgb2YgdmFsdWVzIGluIGVudW0gaXNhX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fTUFDSFM6ICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIG1hY2hfYXR0cgotICAgQ0dFTl9DUFVfT1BFTl9CRkRNQUNIOiBzcGVjaWZ5IDEgbWFjaCB1c2luZyBiZmQgbmFtZQotICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU46ICBzcGVjaWZ5IGVuZGlhbiBjaG9pY2UKLSAgIENHRU5fQ1BVX09QRU5fRU5EOiAgICAgdGVybWluYXRlcyBhcmd1bWVudHMKLQotICAgPz8/IFNpbXVsdGFuZW91cyBtdWx0aXBsZSBpc2FzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlLCBidXQgaXQncyBub3QgKHlldCkKLSAgIHByZWNsdWRlZC4KLQotICAgPz8/IFdlIG9ubHkgc3VwcG9ydCBJU08gQyBzdGRhcmdzIGhlcmUsIG5vdCBLJlIuCi0gICBMYXppbmVzcywgcGx1cyBleHBlcmltZW50IHRvIHNlZSBpZiBhbnl0aGluZyByZXF1aXJlcyBLJlIgLSBldmVudHVhbGx5Ci0gICBLJlIgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIC0gZS5nLiBHREIgaXMgY3VycmVudGx5IHRyeWluZyB0aGlzLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotZnIzMF9jZ2VuX2NwdV9vcGVuIChlbnVtIGNnZW5fY3B1X29wZW5fYXJnIGFyZ190eXBlLCAuLi4pCi17Ci0gIENHRU5fQ1BVX1RBQkxFICpjZCA9IChDR0VOX0NQVV9UQUJMRSAqKSB4bWFsbG9jIChzaXplb2YgKENHRU5fQ1BVX1RBQkxFKSk7Ci0gIHN0YXRpYyBpbnQgaW5pdF9wOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IDA7ICAvKiAwID0gInVuc3BlY2lmaWVkIiAqLwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSAwOyAvKiAwID0gInVuc3BlY2lmaWVkIiAqLwotICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbiA9IENHRU5fRU5ESUFOX1VOS05PV047Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgaWYgKCEgaW5pdF9wKQotICAgIHsKLSAgICAgIGluaXRfdGFibGVzICgpOwotICAgICAgaW5pdF9wID0gMTsKLSAgICB9Ci0KLSAgbWVtc2V0IChjZCwgMCwgc2l6ZW9mICgqY2QpKTsKLQotICB2YV9zdGFydCAoYXAsIGFyZ190eXBlKTsKLSAgd2hpbGUgKGFyZ190eXBlICE9IENHRU5fQ1BVX09QRU5fRU5EKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYXJnX3R5cGUpCi0JewotCWNhc2UgQ0dFTl9DUFVfT1BFTl9JU0FTIDoKLQkgIGlzYXMgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCBpbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX01BQ0hTIDoKLQkgIG1hY2hzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9CRkRNQUNIIDoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZSA9IHZhX2FyZyAoYXAsIGNvbnN0IGNoYXIgKik7Ci0JICAgIGNvbnN0IENHRU5fTUFDSCAqbWFjaCA9Ci0JICAgICAgbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lIChmcjMwX2NnZW5fbWFjaF90YWJsZSwgbmFtZSk7Ci0KLQkgICAgbWFjaHMgfD0gbWFjaC0+bnVtIDw8IDE7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgQ0dFTl9DUFVfT1BFTl9FTkRJQU4gOgotCSAgZW5kaWFuID0gdmFfYXJnIChhcCwgZW51bSBjZ2VuX2VuZGlhbik7Ci0JICBicmVhazsKLQlkZWZhdWx0IDoKLQkgIGZwcmludGYgKHN0ZGVyciwgImZyMzBfY2dlbl9jcHVfb3BlbjogdW5zdXBwb3J0ZWQgYXJndW1lbnQgYCVkJ1xuIiwKLQkJICAgYXJnX3R5cGUpOwotCSAgYWJvcnQgKCk7IC8qID8/PyByZXR1cm4gTlVMTD8gKi8KLQl9Ci0gICAgICBhcmdfdHlwZSA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9jcHVfb3Blbl9hcmcpOwotICAgIH0KLSAgdmFfZW5kIChhcCk7Ci0KLSAgLyogbWFjaCB1bnNwZWNpZmllZCBtZWFucyAiYWxsIiAqLwotICBpZiAobWFjaHMgPT0gMCkKLSAgICBtYWNocyA9ICgxIDw8IE1BWF9NQUNIUykgLSAxOwotICAvKiBiYXNlIG1hY2ggaXMgYWx3YXlzIHNlbGVjdGVkICovCi0gIG1hY2hzIHw9IDE7Ci0gIC8qIGlzYSB1bnNwZWNpZmllZCBtZWFucyAiYWxsIiAqLwotICBpZiAoaXNhcyA9PSAwKQotICAgIGlzYXMgPSAoMSA8PCBNQVhfSVNBUykgLSAxOwotICBpZiAoZW5kaWFuID09IENHRU5fRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgLyogPz8/IElmIHRhcmdldCBoYXMgb25seSBvbmUsIGNvdWxkIGhhdmUgYSBkZWZhdWx0LiAgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgImZyMzBfY2dlbl9jcHVfb3Blbjogbm8gZW5kaWFubmVzcyBzcGVjaWZpZWRcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGNkLT5pc2FzID0gaXNhczsKLSAgY2QtPm1hY2hzID0gbWFjaHM7Ci0gIGNkLT5lbmRpYW4gPSBlbmRpYW47Ci0gIC8qIEZJWE1FOiBmb3IgdGhlIHNwYXJjIGNhc2Ugd2UgY2FuIGRldGVybWluZSBpbnNuLWVuZGlhbm5lc3Mgc3RhdGljYWxseS4KLSAgICAgVGhlIHdvcnJ5IGhlcmUgaXMgd2hlcmUgYm90aCBkYXRhIGFuZCBpbnNuIGVuZGlhbiBjYW4gYmUgaW5kZXBlbmRlbnRseQotICAgICBjaG9zZW4sIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgYW5vdGhlciBhcmd1bWVudC4KLSAgICAgQWN0dWFsbHksIHdpbGwgd2FudCB0byBhbGxvdyBmb3IgbW9yZSBhcmd1bWVudHMgaW4gdGhlIGZ1dHVyZSBhbnl3YXkuICAqLwotICBjZC0+aW5zbl9lbmRpYW4gPSBlbmRpYW47Ci0KLSAgLyogVGFibGUgKHJlKWJ1aWxkZXIuICAqLwotICBjZC0+cmVidWlsZF90YWJsZXMgPSBmcjMwX2NnZW5fcmVidWlsZF90YWJsZXM7Ci0gIGZyMzBfY2dlbl9yZWJ1aWxkX3RhYmxlcyAoY2QpOwotCi0gIHJldHVybiAoQ0dFTl9DUFVfREVTQykgY2Q7Ci19Ci0KLS8qIENvdmVyIGZuIHRvIGZyMzBfY2dlbl9jcHVfb3BlbiB0byBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlIG9mIDEgaXNhLCAxIG1hY2guCi0gICBNQUNIX05BTUUgaXMgdGhlIGJmZCBuYW1lIG9mIHRoZSBtYWNoLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotZnIzMF9jZ2VuX2NwdV9vcGVuXzEgKG1hY2hfbmFtZSwgZW5kaWFuKQotICAgICBjb25zdCBjaGFyICptYWNoX25hbWU7Ci0gICAgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuOwotewotICByZXR1cm4gZnIzMF9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORElBTiwgZW5kaWFuLAotCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5EKTsKLX0KLQotLyogQ2xvc2UgYSBjcHUgdGFibGUuCi0gICA/Pz8gVGhpcyBjYW4gbGl2ZSBpbiBhIG1hY2hpbmUgaW5kZXBlbmRlbnQgZmlsZSwgYnV0IHRoZXJlJ3MgY3VycmVudGx5Ci0gICBubyBwbGFjZSB0byBwdXQgdGhpcyBmaWxlICh0aGVyZSdzIG5vIGxpYmNnZW4pLiAgbGlib3Bjb2RlcyBpcyB0aGUgd3JvbmcKLSAgIHBsYWNlIGFzIHNvbWUgc2ltdWxhdG9yIHBvcnRzIHVzZSB0aGlzIGJ1dCB0aGV5IGRvbid0IHVzZSBsaWJvcGNvZGVzLiAgKi8KLQotdm9pZAotZnIzMF9jZ2VuX2NwdV9jbG9zZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGlmIChjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpOwotICBpZiAoY2QtPmh3X3RhYmxlLmVudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSFdfRU5UUlkgKikgY2QtPmh3X3RhYmxlLmVudHJpZXMpOwotICBmcmVlIChjZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1kZXNjLmggYi9vcGNvZGVzL2ZyMzAtZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjg5MTU2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1kZXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyogQ1BVIGRhdGEgaGVhZGVyIGZvciBmcjMwLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIEZSMzBfQ1BVX0gKLSNkZWZpbmUgRlIzMF9DUFVfSAotCi0jZGVmaW5lIENHRU5fQVJDSCBmcjMwCi0KLS8qIEdpdmVuIHN5bWJvbCBTLCByZXR1cm4gZnIzMF9jZ2VuXzxTPi4gICovCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKGZyMzAsX2NnZW5fLHMpCi0KLS8qIFNlbGVjdGVkIGNwdSBmYW1pbGllcy4gICovCi0jZGVmaW5lIEhBVkVfQ1BVX0ZSMzBCRgotCi0jZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAotCi0vKiBNYXhpbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fU0laRSA2Ci0KLSNkZWZpbmUgQ0dFTl9JTlRfSU5TTl9QIDAKLQotLyogRklYTUU6IE5lZWQgdG8gY29tcHV0ZSBDR0VOX01BWF9TWU5UQVhfQllURVMuICAqLwotCi0vKiBDR0VOX01ORU1PTklDX09QRVJBTkRTIGlzIGRlZmluZWQgaWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMuCi0gICBlLmcuIEluICJiLGEgZm9vIiB0aGUgIixhIiBpcyBhbiBvcGVyYW5kLiAgSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMKLSAgIHdlIGNhbid0IGhhc2ggb24gZXZlcnl0aGluZyB1cCB0byB0aGUgc3BhY2UuICAqLwotI2RlZmluZSBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBhbnkgaW5zbiBvciBtYWNyby1pbnNuIGhhcy4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fT1BFUkFORFMgMTYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZmllbGRzIGluIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyA3Ci0KLS8qIEVudW1zLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDEgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AxIHsKLSAgT1AxXzAsIE9QMV8xLCBPUDFfMiwgT1AxXzMKLSAsIE9QMV80LCBPUDFfNSwgT1AxXzYsIE9QMV83Ci0gLCBPUDFfOCwgT1AxXzksIE9QMV9BLCBPUDFfQgotICwgT1AxX0MsIE9QMV9ELCBPUDFfRSwgT1AxX0YKLX0gSU5TTl9PUDE7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3AyIGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wMiB7Ci0gIE9QMl8wLCBPUDJfMSwgT1AyXzIsIE9QMl8zCi0gLCBPUDJfNCwgT1AyXzUsIE9QMl82LCBPUDJfNwotICwgT1AyXzgsIE9QMl85LCBPUDJfQSwgT1AyX0IKLSAsIE9QMl9DLCBPUDJfRCwgT1AyX0UsIE9QMl9GCi19IElOU05fT1AyOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnNuIG9wMyBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDMgewotICBPUDNfMCwgT1AzXzEsIE9QM18yLCBPUDNfMwotICwgT1AzXzQsIE9QM181LCBPUDNfNiwgT1AzXzcKLSAsIE9QM184LCBPUDNfOSwgT1AzX0EsIE9QM19CCi0gLCBPUDNfQywgT1AzX0QsIE9QM19FLCBPUDNfRgotfSBJTlNOX09QMzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBvcDQgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3A0IHsKLSAgT1A0XzAKLX0gSU5TTl9PUDQ7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGluc24gb3A1IGVudW1zLiAgKi8KLXR5cGVkZWYgZW51bSBpbnNuX29wNSB7Ci0gIE9QNV8wLCBPUDVfMQotfSBJTlNOX09QNTsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBjYyBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9jYyB7Ci0gIENDX1JBLCBDQ19OTywgQ0NfRVEsIENDX05FCi0gLCBDQ19DLCBDQ19OQywgQ0NfTiwgQ0NfUAotICwgQ0NfViwgQ0NfTlYsIENDX0xULCBDQ19HRQotICwgQ0NfTEUsIENDX0dULCBDQ19MUywgQ0NfSEkKLX0gSU5TTl9DQzsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBncl9uYW1lcyB7Ci0gIEhfR1JfUjAgPSAwLCBIX0dSX1IxID0gMSwgSF9HUl9SMiA9IDIsIEhfR1JfUjMgPSAzCi0gLCBIX0dSX1I0ID0gNCwgSF9HUl9SNSA9IDUsIEhfR1JfUjYgPSA2LCBIX0dSX1I3ID0gNwotICwgSF9HUl9SOCA9IDgsIEhfR1JfUjkgPSA5LCBIX0dSX1IxMCA9IDEwLCBIX0dSX1IxMSA9IDExCi0gLCBIX0dSX1IxMiA9IDEyLCBIX0dSX1IxMyA9IDEzLCBIX0dSX1IxNCA9IDE0LCBIX0dSX1IxNSA9IDE1Ci0gLCBIX0dSX0FDID0gMTMsIEhfR1JfRlAgPSAxNCwgSF9HUl9TUCA9IDE1Ci19IEdSX05BTUVTOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGNyX25hbWVzIHsKLSAgSF9DUl9DUjAsIEhfQ1JfQ1IxLCBIX0NSX0NSMiwgSF9DUl9DUjMKLSAsIEhfQ1JfQ1I0LCBIX0NSX0NSNSwgSF9DUl9DUjYsIEhfQ1JfQ1I3Ci0gLCBIX0NSX0NSOCwgSF9DUl9DUjksIEhfQ1JfQ1IxMCwgSF9DUl9DUjExCi0gLCBIX0NSX0NSMTIsIEhfQ1JfQ1IxMywgSF9DUl9DUjE0LCBIX0NSX0NSMTUKLX0gQ1JfTkFNRVM7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIC4gICovCi10eXBlZGVmIGVudW0gZHJfbmFtZXMgewotICBIX0RSX1RCUiwgSF9EUl9SUCwgSF9EUl9TU1AsIEhfRFJfVVNQCi0gLCBIX0RSX01ESCwgSF9EUl9NREwKLX0gRFJfTkFNRVM7Ci0KLS8qIEF0dHJpYnV0ZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtYWNoaW5lIHR5cGUgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBtYWNoX2F0dHIgewotICBNQUNIX0JBU0UsIE1BQ0hfRlIzMCwgTUFDSF9NQVgKLX0gTUFDSF9BVFRSOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBpbnN0cnVjdGlvbiBzZXQgc2VsZWN0aW9uLiAgKi8KLXR5cGVkZWYgZW51bSBpc2FfYXR0ciB7Ci0gIElTQV9GUjMwLCBJU0FfTUFYCi19IElTQV9BVFRSOwotCi0vKiBOdW1iZXIgb2YgYXJjaGl0ZWN0dXJlIHZhcmlhbnRzLiAgKi8KLSNkZWZpbmUgTUFYX0lTQVMgIDEKLSNkZWZpbmUgTUFYX01BQ0hTICgoaW50KSBNQUNIX01BWCkKLQotLyogSWZpZWxkIHN1cHBvcnQuICAqLwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGNnZW5faWZsZCBmcjMwX2NnZW5faWZsZF90YWJsZVtdOwotCi0vKiBJZmllbGQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2lmbGQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faWZsZF9hdHRyIHsKLSAgQ0dFTl9JRkxEX1ZJUlRVQUwsIENHRU5fSUZMRF9QQ1JFTF9BRERSLCBDR0VOX0lGTERfQUJTX0FERFIsIENHRU5fSUZMRF9SRVNFUlZFRAotICwgQ0dFTl9JRkxEX1NJR05fT1BULCBDR0VOX0lGTERfU0lHTkVELCBDR0VOX0lGTERfRU5EX0JPT0xTLCBDR0VOX0lGTERfU1RBUlRfTkJPT0xTID0gMzEKLSAsIENHRU5fSUZMRF9NQUNILCBDR0VOX0lGTERfRU5EX05CT09MUwotfSBDR0VOX0lGTERfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faWZsZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIChDR0VOX0lGTERfRU5EX05CT09MUyAtIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIGlmaWVsZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gaWZpZWxkX3R5cGUgewotICBGUjMwX0ZfTklMLCBGUjMwX0ZfT1AxLCBGUjMwX0ZfT1AyLCBGUjMwX0ZfT1AzCi0gLCBGUjMwX0ZfT1A0LCBGUjMwX0ZfT1A1LCBGUjMwX0ZfQ0MsIEZSMzBfRl9DQ0MKLSAsIEZSMzBfRl9SSiwgRlIzMF9GX1JJLCBGUjMwX0ZfUlMxLCBGUjMwX0ZfUlMyCi0gLCBGUjMwX0ZfUkpDLCBGUjMwX0ZfUklDLCBGUjMwX0ZfQ1JKLCBGUjMwX0ZfQ1JJCi0gLCBGUjMwX0ZfVTQsIEZSMzBfRl9VNEMsIEZSMzBfRl9JNCwgRlIzMF9GX000Ci0gLCBGUjMwX0ZfVTgsIEZSMzBfRl9JOCwgRlIzMF9GX0kyMF80LCBGUjMwX0ZfSTIwXzE2Ci0gLCBGUjMwX0ZfSTIwLCBGUjMwX0ZfSTMyLCBGUjMwX0ZfVURJU1A2LCBGUjMwX0ZfRElTUDgKLSAsIEZSMzBfRl9ESVNQOSwgRlIzMF9GX0RJU1AxMCwgRlIzMF9GX1MxMCwgRlIzMF9GX1UxMAotICwgRlIzMF9GX1JFTDksIEZSMzBfRl9ESVI4LCBGUjMwX0ZfRElSOSwgRlIzMF9GX0RJUjEwCi0gLCBGUjMwX0ZfUkVMMTIsIEZSMzBfRl9SRUdMSVNUX0hJX1NULCBGUjMwX0ZfUkVHTElTVF9MT1dfU1QsIEZSMzBfRl9SRUdMSVNUX0hJX0xECi0gLCBGUjMwX0ZfUkVHTElTVF9MT1dfTEQsIEZSMzBfRl9NQVgKLX0gSUZJRUxEX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0lGTEQgKChpbnQpIEZSMzBfRl9NQVgpCi0KLS8qIEhhcmR3YXJlIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9odyBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od19hdHRyIHsKLSAgQ0dFTl9IV19WSVJUVUFMLCBDR0VOX0hXX0NBQ0hFX0FERFIsIENHRU5fSFdfUEMsIENHRU5fSFdfUFJPRklMRQotICwgQ0dFTl9IV19FTkRfQk9PTFMsIENHRU5fSFdfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSFdfTUFDSCwgQ0dFTl9IV19FTkRfTkJPT0xTCi19IENHRU5fSFdfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faHdfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgKENHRU5fSFdfRU5EX05CT09MUyAtIENHRU5fSFdfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgZnIzMCBoYXJkd2FyZSB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od190eXBlIHsKLSAgSFdfSF9NRU1PUlksIEhXX0hfU0lOVCwgSFdfSF9VSU5ULCBIV19IX0FERFIKLSAsIEhXX0hfSUFERFIsIEhXX0hfUEMsIEhXX0hfR1IsIEhXX0hfQ1IKLSAsIEhXX0hfRFIsIEhXX0hfUFMsIEhXX0hfUjEzLCBIV19IX1IxNAotICwgSFdfSF9SMTUsIEhXX0hfTkJJVCwgSFdfSF9aQklULCBIV19IX1ZCSVQKLSAsIEhXX0hfQ0JJVCwgSFdfSF9JQklULCBIV19IX1NCSVQsIEhXX0hfVEJJVAotICwgSFdfSF9EMEJJVCwgSFdfSF9EMUJJVCwgSFdfSF9DQ1IsIEhXX0hfU0NSCi0gLCBIV19IX0lMTSwgSFdfTUFYCi19IENHRU5fSFdfVFlQRTsKLQotI2RlZmluZSBNQVhfSFcgKChpbnQpIEhXX01BWCkKLQotLyogT3BlcmFuZCBhdHRyaWJ1dGUgaW5kaWNlcy4gICovCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGNnZW5fb3BlcmFuZCBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX2F0dHIgewotICBDR0VOX09QRVJBTkRfVklSVFVBTCwgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIsIENHRU5fT1BFUkFORF9BQlNfQUREUiwgQ0dFTl9PUEVSQU5EX1NJR05fT1BUCi0gLCBDR0VOX09QRVJBTkRfU0lHTkVELCBDR0VOX09QRVJBTkRfTkVHQVRJVkUsIENHRU5fT1BFUkFORF9SRUxBWCwgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZCi0gLCBDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgsIENHRU5fT1BFUkFORF9FTkRfQk9PTFMsIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9PUEVSQU5EX01BQ0gKLSAsIENHRU5fT1BFUkFORF9FTkRfTkJPT0xTCi19IENHRU5fT1BFUkFORF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9vcGVyYW5kX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMgKENHRU5fT1BFUkFORF9FTkRfTkJPT0xTIC0gQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIGZyMzAgb3BlcmFuZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgewotICBGUjMwX09QRVJBTkRfUEMsIEZSMzBfT1BFUkFORF9SSSwgRlIzMF9PUEVSQU5EX1JKLCBGUjMwX09QRVJBTkRfUklDCi0gLCBGUjMwX09QRVJBTkRfUkpDLCBGUjMwX09QRVJBTkRfQ1JJLCBGUjMwX09QRVJBTkRfQ1JKLCBGUjMwX09QRVJBTkRfUlMxCi0gLCBGUjMwX09QRVJBTkRfUlMyLCBGUjMwX09QRVJBTkRfUjEzLCBGUjMwX09QRVJBTkRfUjE0LCBGUjMwX09QRVJBTkRfUjE1Ci0gLCBGUjMwX09QRVJBTkRfUFMsIEZSMzBfT1BFUkFORF9VNCwgRlIzMF9PUEVSQU5EX1U0QywgRlIzMF9PUEVSQU5EX1U4Ci0gLCBGUjMwX09QRVJBTkRfSTgsIEZSMzBfT1BFUkFORF9VRElTUDYsIEZSMzBfT1BFUkFORF9ESVNQOCwgRlIzMF9PUEVSQU5EX0RJU1A5Ci0gLCBGUjMwX09QRVJBTkRfRElTUDEwLCBGUjMwX09QRVJBTkRfUzEwLCBGUjMwX09QRVJBTkRfVTEwLCBGUjMwX09QRVJBTkRfSTMyCi0gLCBGUjMwX09QRVJBTkRfTTQsIEZSMzBfT1BFUkFORF9JMjAsIEZSMzBfT1BFUkFORF9ESVI4LCBGUjMwX09QRVJBTkRfRElSOQotICwgRlIzMF9PUEVSQU5EX0RJUjEwLCBGUjMwX09QRVJBTkRfTEFCRUw5LCBGUjMwX09QRVJBTkRfTEFCRUwxMiwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xECi0gLCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCwgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NULCBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCwgRlIzMF9PUEVSQU5EX0NDCi0gLCBGUjMwX09QRVJBTkRfQ0NDLCBGUjMwX09QRVJBTkRfTkJJVCwgRlIzMF9PUEVSQU5EX1ZCSVQsIEZSMzBfT1BFUkFORF9aQklUCi0gLCBGUjMwX09QRVJBTkRfQ0JJVCwgRlIzMF9PUEVSQU5EX0lCSVQsIEZSMzBfT1BFUkFORF9TQklULCBGUjMwX09QRVJBTkRfVEJJVAotICwgRlIzMF9PUEVSQU5EX0QwQklULCBGUjMwX09QRVJBTkRfRDFCSVQsIEZSMzBfT1BFUkFORF9DQ1IsIEZSMzBfT1BFUkFORF9TQ1IKLSAsIEZSMzBfT1BFUkFORF9JTE0sIEZSMzBfT1BFUkFORF9NQVgKLX0gQ0dFTl9PUEVSQU5EX1RZUEU7Ci0KLS8qIE51bWJlciBvZiBvcGVyYW5kcyB0eXBlcy4gICovCi0jZGVmaW5lIE1BWF9PUEVSQU5EUyAoKGludCkgRlIzMF9PUEVSQU5EX01BWCkKLQotLyogTWF4aW11bSBudW1iZXIgb2Ygb3BlcmFuZHMgcmVmZXJlbmNlZCBieSBhbnkgaW5zbi4gICovCi0jZGVmaW5lIE1BWF9PUEVSQU5EX0lOU1RBTkNFUyA4Ci0KLS8qIEluc24gYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2luc24gYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl9hdHRyIHsKLSAgQ0dFTl9JTlNOX0FMSUFTLCBDR0VOX0lOU05fVklSVFVBTCwgQ0dFTl9JTlNOX1VOQ09ORF9DVEksIENHRU5fSU5TTl9DT05EX0NUSQotICwgQ0dFTl9JTlNOX1NLSVBfQ1RJLCBDR0VOX0lOU05fREVMQVlfU0xPVCwgQ0dFTl9JTlNOX1JFTEFYQUJMRSwgQ0dFTl9JTlNOX1JFTEFYCi0gLCBDR0VOX0lOU05fTk9fRElTLCBDR0VOX0lOU05fUEJCLCBDR0VOX0lOU05fTk9UX0lOX0RFTEFZX1NMT1QsIENHRU5fSU5TTl9FTkRfQk9PTFMKLSAsIENHRU5fSU5TTl9TVEFSVF9OQk9PTFMgPSAzMSwgQ0dFTl9JTlNOX01BQ0gsIENHRU5fSU5TTl9FTkRfTkJPT0xTCi19IENHRU5fSU5TTl9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pbnNuX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTkJPT0xfQVRUUlMgKENHRU5fSU5TTl9FTkRfTkJPT0xTIC0gQ0dFTl9JTlNOX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIGNnZW4uaCB1c2VzIHRoaW5ncyB3ZSBqdXN0IGRlZmluZWQuICAqLwotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgZnIzMF9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBmcjMwX2NnZW5faW5zbl9hdHRyX3RhYmxlW107Ci0KLS8qIEhhcmR3YXJlIGRlY2xzLiAgKi8KLQotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9jcl9uYW1lczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2RyX25hbWVzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9wczsKLWV4dGVybiBDR0VOX0tFWVdPUkQgZnIzMF9jZ2VuX29wdmFsX2hfcjEzOwotZXh0ZXJuIENHRU5fS0VZV09SRCBmcjMwX2NnZW5fb3B2YWxfaF9yMTQ7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIGZyMzBfY2dlbl9vcHZhbF9oX3IxNTsKLQotCi0KLQotI2VuZGlmIC8qIEZSMzBfQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1kaXMuYyBiL29wY29kZXMvZnIzMC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3YzE4Yy4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2ZyMzAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KLSAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWRpcy5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIERlZmF1bHQgdGV4dCB0byBwcmludCBpZiBhbiBpbnN0cnVjdGlvbiBpc24ndCByZWNvZ25pemVkLiAgKi8KLSNkZWZpbmUgVU5LTk9XTl9JTlNOX01TRyBfKCIqdW5rbm93bioiKQotCi1zdGF0aWMgdm9pZCBwcmludF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfYWRkcmVzcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGJmZF92bWEsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9rZXl3b3JkCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgQ0dFTl9LRVlXT1JEICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9GSUVMRFMgKiwKLQkgICAgICBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBpbnQgcHJpbnRfaW5zbiBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLAotCQkJICAgICAgIGRpc2Fzc2VtYmxlX2luZm8gKiwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZGVmYXVsdF9wcmludF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotDAotLyogLS0gZGlzYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gZGlzLmMgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgb2Zmc2V0LCBsb2FkX3N0b3JlKQotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGxvbmcgb2Zmc2V0OwotICAgICBpbnQgbG9hZF9zdG9yZTsgLyogMCA9PSBsb2FkLCAxID09IHN0b3JlICovCi17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSBkaXNfaW5mbzsKLSAgaW50IG1hc2s7Ci0gIGludCBpbmRleCA9IDA7Ci0gIGNoYXIqIGNvbW1hID0gIiI7Ci0KLSAgaWYgKGxvYWRfc3RvcmUpCi0gICAgbWFzayA9IDB4ODA7Ci0gIGVsc2UKLSAgICBtYXNrID0gMTsKLQotICBpZiAodmFsdWUgJiBtYXNrKQotICAgIHsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciVpIiwgaW5kZXggKyBvZmZzZXQpOwotICAgICAgY29tbWEgPSAiLCI7Ci0gICAgfQotICAgIAotICBmb3IgKGluZGV4ID0gMTsgaW5kZXggPD0gNzsgKytpbmRleCkKLSAgICB7Ci0gICAgICBpZiAobG9hZF9zdG9yZSkKLQltYXNrID4+PSAxOwotICAgICAgZWxzZQotCW1hc2sgPDw9IDE7Ci0KLSAgICAgIGlmICh2YWx1ZSAmIG1hc2spCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc3IlaSIsIGNvbW1hLCBpbmRleCArIG9mZnNldCk7Ci0JICBjb21tYSA9ICIsIjsKLQl9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfaGlfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBwcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIDgsIDAvKmxvYWQqLyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9sZCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBwcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIDAsIDAvKmxvYWQqLyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9oaV9yZWdpc3Rlcl9saXN0X3N0IChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIHByaW50X3JlZ2lzdGVyX2xpc3QgKGRpc19pbmZvLCB2YWx1ZSwgOCwgMS8qc3RvcmUqLyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1wcmludF9sb3dfcmVnaXN0ZXJfbGlzdF9zdCAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBwcmludF9yZWdpc3Rlcl9saXN0IChkaXNfaW5mbywgdmFsdWUsIDAsIDEvKnN0b3JlKi8pOwotfQotCi1zdGF0aWMgdm9pZAotcHJpbnRfbTQgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLX0KLS8qIC0tICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIHByaW50aW5nIG9wZXJhbmRzLgotICAgWElORk8gaXMgYSBgdm9pZCAqJyBhbmQgbm90IGEgYGRpc2Fzc2VtYmxlX2luZm8gKicgdG8gbm90IHB1dCBhIHJlcXVpcmVtZW50Ci0gICBvZiBkaXMtYXNtLmggb24gY2dlbi5oLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi12b2lkCi1mcjMwX2NnZW5fcHJpbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHhpbmZvLCBmaWVsZHMsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgUFRSIHhpbmZvOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICB2b2lkIGNvbnN0ICphdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgeGluZm87Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfQ1JpLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfY3JfbmFtZXMsIGZpZWxkcy0+Zl9DUmosIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9oX3IxMywgZmllbGRzLT5mX25pbCwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcjE0LCBmaWVsZHMtPmZfbmlsLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfaF9yMTUsIGZpZWxkcy0+Zl9uaWwsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmksIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX1JpYywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9SaiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfUmpjLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBmcjMwX2NnZW5fb3B2YWxfZHJfbmFtZXMsIGZpZWxkcy0+Zl9SczEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIGZyMzBfY2dlbl9vcHZhbF9kcl9uYW1lcywgZmllbGRzLT5mX1JzMiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfY2MsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9jY2MsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2RpcjEwLCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2RpcjgsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlyOSwgMCwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3AxMCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2Rpc3A4LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDksIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfaTIwLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpfCgxPDxDR0VOX09QRVJBTkRfVklSVFVBTCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9pMzIsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9TSUdOX09QVCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2k4LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9yZWwxMiwgMHwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICBwcmludF9hZGRyZXNzIChjZCwgaW5mbywgZmllbGRzLT5mX3JlbDksIDB8KDE8PENHRU5fT1BFUkFORF9QQ1JFTF9BRERSKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBwcmludF9tNCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9tNCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1NJR05FRCl8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgZnIzMF9jZ2VuX29wdmFsX2hfcHMsIGZpZWxkcy0+Zl9uaWwsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBwcmludF9oaV9yZWdpc3Rlcl9saXN0X2xkIChjZCwgaW5mbywgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICBwcmludF9oaV9yZWdpc3Rlcl9saXN0X3N0IChjZCwgaW5mbywgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgcHJpbnRfbG93X3JlZ2lzdGVyX2xpc3RfbGQgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgcHJpbnRfbG93X3JlZ2lzdGVyX2xpc3Rfc3QgKGNkLCBpbmZvLCBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QsIDAsIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zMTAsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTEwLCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91NCwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3U0YywgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdTgsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91ZGlzcDYsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwcmludGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgIGFib3J0ICgpOwotICB9Ci19Ci0KLWNnZW5fcHJpbnRfZm4gKiBjb25zdCBmcjMwX2NnZW5fcHJpbnRfaGFuZGxlcnNbXSA9IAotewotICBwcmludF9pbnNuX25vcm1hbCwKLX07Ci0KLQotdm9pZAotZnIzMF9jZ2VuX2luaXRfZGlzIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgZnIzMF9jZ2VuX2luaXRfb3Bjb2RlX3RhYmxlIChjZCk7Ci0gIGZyMzBfY2dlbl9pbml0X2libGRfdGFibGUgKGNkKTsKLSAgY2QtPnByaW50X2hhbmRsZXJzID0gJiBmcjMwX2NnZW5fcHJpbnRfaGFuZGxlcnNbMF07Ci0gIGNkLT5wcmludF9vcGVyYW5kID0gZnIzMF9jZ2VuX3ByaW50X29wZXJhbmQ7Ci19Ci0KLQwKLS8qIERlZmF1bHQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9ub3JtYWwgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9OT1JNQUwKLSAgQ0dFTl9QUklOVF9OT1JNQUwgKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpOwotI2VuZGlmCi0KLSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGF0dHJpYnV0ZXMuICAqLwotICBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0VNX09OTFkpKQotICAgIDsgLyogbm90aGluZyB0byBkbyAqLwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TSUdORUQpKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIHZhbHVlKTsKLX0KLQotLyogRGVmYXVsdCBhZGRyZXNzIGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYWRkcmVzcyAoY2QsIGRpc19pbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIFBUUiBkaXNfaW5mbzsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgbGVuZ3RoOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0KLSNpZmRlZiBDR0VOX1BSSU5UX0FERFJFU1MKLSAgQ0dFTl9QUklOVF9BRERSRVNTIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfUENSRUxfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX0FCU19BRERSKSkKLSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKHZhbHVlLCBpbmZvKTsKLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIChsb25nKSB2YWx1ZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgKGxvbmcpIHZhbHVlKTsKLX0KLQotLyogS2V5d29yZCBwcmludCBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2tleXdvcmQgKGNkLCBkaXNfaW5mbywga2V5d29yZF90YWJsZSwgdmFsdWUsIGF0dHJzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIENHRU5fS0VZV09SRCAqa2V5d29yZF90YWJsZTsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotewotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gIGNvbnN0IENHRU5fS0VZV09SRF9FTlRSWSAqa2U7Ci0KLSAga2UgPSBjZ2VuX2tleXdvcmRfbG9va3VwX3ZhbHVlIChrZXl3b3JkX3RhYmxlLCB2YWx1ZSk7Ci0gIGlmIChrZSAhPSBOVUxMKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBrZS0+bmFtZSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIj8/PyIpOwotfQotDAotLyogRGVmYXVsdCBpbnNuIHByaW50ZXIuCi0KLSAgIERJU19JTkZPIGlzIGRlZmluZWQgYXMgYFBUUicgc28gdGhlIGRpc2Fzc2VtYmxlciBuZWVkbid0IGtub3cgYW55dGhpbmcKLSAgIGFib3V0IGRpc2Fzc2VtYmxlX2luZm8uICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbl9ub3JtYWwgKGNkLCBkaXNfaW5mbywgaW5zbiwgZmllbGRzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZGlzX2luZm87Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN5bjsKLQotICBDR0VOX0lOSVRfUFJJTlQgKGNkKTsKLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKnN5bjsgKytzeW4pCi0gICAgewotICAgICAgaWYgKENHRU5fU1lOVEFYX01ORU1PTklDX1AgKCpzeW4pKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBDR0VOX0lOU05fTU5FTU9OSUMgKGluc24pKTsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCpzeW4pKQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCBDR0VOX1NZTlRBWF9DSEFSICgqc3luKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgYW4gb3BlcmFuZC4gICovCi0gICAgICBmcjMwX2NnZW5fcHJpbnRfb3BlcmFuZCAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwgaW5mbywKLQkJCQkgZmllbGRzLCBDR0VOX0lOU05fQVRUUlMgKGluc24pLCBwYywgbGVuZ3RoKTsKLSAgICB9Ci19Ci0MCi0vKiBVdGlsaXR5IHRvIHByaW50IGFuIGluc24uCi0gICBCVUYgaXMgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbiwgdGFyZ2V0IGJ5dGUgb3JkZXIsIEJVRkxFTiBieXRlcyBsb25nLgotICAgVGhlIHJlc3VsdCBpcyB0aGUgc2l6ZSBvZiB0aGUgaW5zbiBpbiBieXRlcyBvciB6ZXJvIGZvciBhbiB1bmtub3duIGluc24KLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycyBmZXRjaGluZyBkYXRhIChtZW1vcnlfZXJyb3JfZnVuYyB3aWxsIGhhdmUKLSAgIGJlZW4gY2FsbGVkKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCBidWZsZW4pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGNoYXIgKmJ1ZjsKLSAgICAgaW50IGJ1ZmxlbjsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuX3ZhbHVlOwotICBjb25zdCBDR0VOX0lOU05fTElTVCAqaW5zbl9saXN0OwotICBDR0VOX0VYVFJBQ1RfSU5GTyBleF9pbmZvOwotCi0gIGV4X2luZm8uZGlzX2luZm8gPSBpbmZvOwotICBleF9pbmZvLnZhbGlkID0gKDEgPDwgKGNkLT5iYXNlX2luc25fYml0c2l6ZSAvIDgpKSAtIDE7Ci0gIGV4X2luZm8uaW5zbl9ieXRlcyA9IGJ1ZjsKLQotICBzd2l0Y2ggKGJ1ZmxlbikKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgaW5zbl92YWx1ZSA9IGJ1ZlswXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIGluc25fdmFsdWUgPSBpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgPyBiZmRfZ2V0YjE2IChidWYpIDogYmZkX2dldGwxNiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGluc25fdmFsdWUgPSBpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcgPyBiZmRfZ2V0YjMyIChidWYpIDogYmZkX2dldGwzMiAoYnVmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogVGhlIGluc3RydWN0aW9ucyBhcmUgc3RvcmVkIGluIGhhc2ggbGlzdHMuCi0gICAgIFBpY2sgdGhlIGZpcnN0IG9uZSBhbmQga2VlcCB0cnlpbmcgdW50aWwgd2UgZmluZCB0aGUgcmlnaHQgb25lLiAgKi8KLQotICBpbnNuX2xpc3QgPSBDR0VOX0RJU19MT09LVVBfSU5TTiAoY2QsIGJ1ZiwgaW5zbl92YWx1ZSk7Ci0gIHdoaWxlIChpbnNuX2xpc3QgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpbnNuX2xpc3QtPmluc247Ci0gICAgICBDR0VOX0ZJRUxEUyBmaWVsZHM7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0jaWYgMCAvKiBub3QgbmVlZGVkIGFzIGluc24gc2hvdWxkbid0IGJlIGluIGhhc2ggbGlzdHMgaWYgbm90IHN1cHBvcnRlZCAqLwotICAgICAgLyogU3VwcG9ydGVkIGJ5IHRoaXMgY3B1PyAgKi8KLSAgICAgIGlmICghIGZyMzBfY2dlbl9pbnNuX3N1cHBvcnRlZCAoY2QsIGluc24pKQotCWNvbnRpbnVlOwotI2VuZGlmCi0KLSAgICAgIC8qIEJhc2ljIGJpdCBtYXNrIG11c3QgYmUgY29ycmVjdC4gICovCi0gICAgICAvKiA/Pz8gTWF5IHdpc2ggdG8gYWxsb3cgdGFyZ2V0IHRvIGRlZmVyIHRoaXMgY2hlY2sgdW50aWwgdGhlIGV4dHJhY3QKLQkgaGFuZGxlci4gICovCi0gICAgICBpZiAoKGluc25fdmFsdWUgJiBDR0VOX0lOU05fQkFTRV9NQVNLIChpbnNuKSkKLQkgID09IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKSkKLQl7Ci0JICAvKiBQcmludGluZyBpcyBoYW5kbGVkIGluIHR3byBwYXNzZXMuICBUaGUgZmlyc3QgcGFzcyBwYXJzZXMgdGhlCi0JICAgICBtYWNoaW5lIGluc24gYW5kIGV4dHJhY3RzIHRoZSBmaWVsZHMuICBUaGUgc2Vjb25kIHBhc3MgcHJpbnRzCi0JICAgICB0aGVtLiAgKi8KLQotCSAgbGVuZ3RoID0gQ0dFTl9FWFRSQUNUX0ZOIChjZCwgaW5zbikKLQkgICAgKGNkLCBpbnNuLCAmZXhfaW5mbywgaW5zbl92YWx1ZSwgJmZpZWxkcywgcGMpOwotCSAgLyogbGVuZ3RoIDwgMCAtPiBlcnJvciAqLwotCSAgaWYgKGxlbmd0aCA8IDApCi0JICAgIHJldHVybiBsZW5ndGg7Ci0JICBpZiAobGVuZ3RoID4gMCkKLQkgICAgewotCSAgICAgIENHRU5fUFJJTlRfRk4gKGNkLCBpbnNuKSAoY2QsIGluZm8sIGluc24sICZmaWVsZHMsIHBjLCBsZW5ndGgpOwotCSAgICAgIC8qIGxlbmd0aCBpcyBpbiBiaXRzLCByZXN1bHQgaXMgaW4gYnl0ZXMgKi8KLQkgICAgICByZXR1cm4gbGVuZ3RoIC8gODsKLQkgICAgfQotCX0KLQotICAgICAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTkVYVF9JTlNOIChpbnNuX2xpc3QpOwotICAgIH0KLQotICByZXR1cm4gMDsKLX0KLQotLyogRGVmYXVsdCB2YWx1ZSBmb3IgQ0dFTl9QUklOVF9JTlNOLgotICAgVGhlIHJlc3VsdCBpcyB0aGUgc2l6ZSBvZiB0aGUgaW5zbiBpbiBieXRlcyBvciB6ZXJvIGZvciBhbiB1bmtub3duIGluc24KLSAgIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VyZWQgZmV0Y2hpbmcgYnl0ZXMuICAqLwotCi0jaWZuZGVmIENHRU5fUFJJTlRfSU5TTgotI2RlZmluZSBDR0VOX1BSSU5UX0lOU04gZGVmYXVsdF9wcmludF9pbnNuCi0jZW5kaWYKLQotc3RhdGljIGludAotZGVmYXVsdF9wcmludF9pbnNuIChjZCwgcGMsIGluZm8pCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGNoYXIgYnVmW0NHRU5fTUFYX0lOU05fU0laRV07Ci0gIGludCBzdGF0dXM7Ci0KLSAgLyogUmVhZCB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmLCBjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgcmV0dXJuIHByaW50X2luc24gKGNkLCBwYywgaW5mbywgYnVmLCBjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KTsKLX0KLQotLyogTWFpbiBlbnRyeSBwb2ludC4KLSAgIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIFBDIG9uIElORk8tPlNUUkVBTS4KLSAgIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gKGluIGJ5dGVzKS4gICovCi0KLWludAotcHJpbnRfaW5zbl9mcjMwIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgc3RhdGljIENHRU5fQ1BVX0RFU0MgY2QgPSAwOwotICBzdGF0aWMgcHJldl9pc2EscHJldl9tYWNoLHByZXZfZW5kaWFuOwotICBpbnQgbGVuZ3RoOwotICBpbnQgaXNhLG1hY2g7Ci0gIGludCBlbmRpYW4gPSAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHCi0JCT8gQ0dFTl9FTkRJQU5fQklHCi0JCTogQ0dFTl9FTkRJQU5fTElUVExFKTsKLSAgZW51bSBiZmRfYXJjaGl0ZWN0dXJlIGFyY2g7Ci0KLSAgLyogPz8/IGdkYiB3aWxsIHNldCBtYWNoIGJ1dCBsZWF2ZSB0aGUgYXJjaGl0ZWN0dXJlIGFzICJ1bmtub3duIiAqLwotI2lmbmRlZiBDR0VOX0JGRF9BUkNICi0jZGVmaW5lIENHRU5fQkZEX0FSQ0ggYmZkX2FyY2hfZnIzMAotI2VuZGlmCi0gIGFyY2ggPSBpbmZvLT5hcmNoOwotICBpZiAoYXJjaCA9PSBiZmRfYXJjaF91bmtub3duKQotICAgIGFyY2ggPSBDR0VOX0JGRF9BUkNIOwotICAgICAgCi0gIC8qIFRoZXJlJ3Mgbm8gc3RhbmRhcmQgd2F5IHRvIGNvbXB1dGUgdGhlIGlzYSBudW1iZXIgKGUuZy4gZm9yIGFybSB0aHVtYikKLSAgICAgc28gd2UgbGVhdmUgaXQgdG8gdGhlIHRhcmdldC4gICovCi0jaWZkZWYgQ0dFTl9DT01QVVRFX0lTQQotICBpc2EgPSBDR0VOX0NPTVBVVEVfSVNBIChpbmZvKTsKLSNlbHNlCi0gIGlzYSA9IDA7Ci0jZW5kaWYKLQotICBtYWNoID0gaW5mby0+bWFjaDsKLQotICAvKiBJZiB3ZSd2ZSBzd2l0Y2hlZCBjcHUncywgY2xvc2UgdGhlIGN1cnJlbnQgdGFibGUgYW5kIG9wZW4gYSBuZXcgb25lLiAgKi8KLSAgaWYgKGNkCi0gICAgICAmJiAoaXNhICE9IHByZXZfaXNhCi0JICB8fCBtYWNoICE9IHByZXZfbWFjaAotCSAgfHwgZW5kaWFuICE9IHByZXZfZW5kaWFuKSkKLSAgICB7Ci0gICAgICBmcjMwX2NnZW5fY3B1X2Nsb3NlIChjZCk7Ci0gICAgICBjZCA9IDA7Ci0gICAgfQotCi0gIC8qIElmIHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgeWV0LCBpbml0aWFsaXplIHRoZSBvcGNvZGUgdGFibGUuICAqLwotICBpZiAoISBjZCkKLSAgICB7Ci0gICAgICBjb25zdCBiZmRfYXJjaF9pbmZvX3R5cGUgKmFyY2hfdHlwZSA9IGJmZF9sb29rdXBfYXJjaCAoYXJjaCwgbWFjaCk7Ci0gICAgICBjb25zdCBjaGFyICptYWNoX25hbWU7Ci0KLSAgICAgIGlmICghYXJjaF90eXBlKQotCWFib3J0ICgpOwotICAgICAgbWFjaF9uYW1lID0gYXJjaF90eXBlLT5wcmludGFibGVfbmFtZTsKLQotICAgICAgcHJldl9pc2EgPSBpc2E7Ci0gICAgICBwcmV2X21hY2ggPSBtYWNoOwotICAgICAgcHJldl9lbmRpYW4gPSBlbmRpYW47Ci0gICAgICBjZCA9IGZyMzBfY2dlbl9jcHVfb3BlbiAoQ0dFTl9DUFVfT1BFTl9JU0FTLCBwcmV2X2lzYSwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9CRkRNQUNILCBtYWNoX25hbWUsCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5ESUFOLCBwcmV2X2VuZGlhbiwKLQkJCQkgQ0dFTl9DUFVfT1BFTl9FTkQpOwotICAgICAgaWYgKCFjZCkKLQlhYm9ydCAoKTsKLSAgICAgIGZyMzBfY2dlbl9pbml0X2RpcyAoY2QpOwotICAgIH0KLQotICAvKiBXZSB0cnkgdG8gaGF2ZSBhcyBtdWNoIGNvbW1vbiBjb2RlIGFzIHBvc3NpYmxlLgotICAgICBCdXQgYXQgdGhpcyBwb2ludCBzb21lIHRhcmdldHMgbmVlZCB0byB0YWtlIG92ZXIuICAqLwotICAvKiA/Pz8gU29tZSB0YXJnZXRzIG1heSBuZWVkIGEgaG9vayBlbHNld2hlcmUuICBUcnkgdG8gYXZvaWQgdGhpcywKLSAgICAgYnV0IGlmIG5vdCBwb3NzaWJsZSB0cnkgdG8gbW92ZSB0aGlzIGhvb2sgZWxzZXdoZXJlIHJhdGhlciB0aGFuCi0gICAgIGhhdmUgdHdvIGhvb2tzLiAgKi8KLSAgbGVuZ3RoID0gQ0dFTl9QUklOVF9JTlNOIChjZCwgcGMsIGluZm8pOwotICBpZiAobGVuZ3RoID4gMCkKLSAgICByZXR1cm4gbGVuZ3RoOwotICBpZiAobGVuZ3RoIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIFVOS05PV05fSU5TTl9NU0cpOwotICByZXR1cm4gY2QtPmRlZmF1bHRfaW5zbl9iaXRzaXplIC8gODsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvZnIzMC1pYmxkLmMgYi9vcGNvZGVzL2ZyMzAtaWJsZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODY2MTNkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvZnIzMC1pYmxkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTA2ICswLDAgQEAKLS8qIEluc3RydWN0aW9uIGJ1aWxkaW5nL2V4dHJhY3Rpb24gc3VwcG9ydCBmb3IgZnIzMC4gLSotIEMgLSotCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IuCi0tIHRoZSByZXN1bHRhbnQgZmlsZSBpcyBtYWNoaW5lIGdlbmVyYXRlZCwgY2dlbi1pYmxkLmluIGlzbid0Ci0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0vKiA/Pz8gRXZlbnR1YWxseSBtb3JlIGFuZCBtb3JlIG9mIHRoaXMgc3R1ZmYgY2FuIGdvIHRvIGNwdS1pbmRlcGVuZGVudCBmaWxlcy4KLSAgIEtlZXAgdGhhdCBpbiBtaW5kLiAgKi8KLQotI2luY2x1ZGUgInN5c2RlcC5oIgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJmcjMwLWRlc2MuaCIKLSNpbmNsdWRlICJmcjMwLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jdW5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0KLS8qIFVzZWQgYnkgdGhlIGlmaWVsZCBydHggZnVuY3Rpb24uICAqLwotI2RlZmluZSBGTEQoZikgKGZpZWxkcy0+ZikKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBpbnNlcnRfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGxvbmcsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgQ0dFTl9JTlNOX0JZVEVTX1BUUikpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBpbnNlcnRfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosCi0JICAgICAgQ0dFTl9GSUVMRFMgKiwgQ0dFTl9JTlNOX0JZVEVTX1BUUiwgYmZkX3ZtYSkpOwotCi1zdGF0aWMgaW50IGV4dHJhY3Rfbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIENHRU5fRVhUUkFDVF9JTkZPICosIENHRU5fSU5TTl9JTlQsCi0JICAgICAgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCBiZmRfdm1hLCBsb25nICopKTsKLXN0YXRpYyBpbnQgZXh0cmFjdF9pbnNuX25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9FWFRSQUNUX0lORk8gKiwKLQkgICAgICBDR0VOX0lOU05fSU5ULCBDR0VOX0ZJRUxEUyAqLCBiZmRfdm1hKSk7Ci0MCi0vKiBPcGVyYW5kIGluc2VydGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGluc2VydF9ub3JtYWwuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgdm9pZAotaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgeCA9ICh4ICYgfihtYXNrIDw8IHNoaWZ0KSkgfCAoKHZhbHVlICYgbWFzaykgPDwgc2hpZnQpOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgICpidWZwID0geDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIxNiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwxNiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JewotCSAgYnVmcFswXSA9IHggPj4gMTY7Ci0JICBiZmRfcHV0YjE2ICh4LCBidWZwICsgMSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotCSAgYnVmcFsyXSA9IHggPj4gMTY7Ci0JfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQliZmRfcHV0YjMyICh4LCBidWZwKTsKLSAgICAgIGVsc2UKLQliZmRfcHV0bDMyICh4LCBidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotLyogRGVmYXVsdCBpbnNlcnRpb24gcm91dGluZS4KLQotICAgQVRUUlMgaXMgYSBtYXNrIG9mIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuCi0gICBXT1JEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJpdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgV09SRF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBiaXRzIGluIHdoaWNoIHRoZSB2YWx1ZSByZXNpZGVzLgotICAgU1RBUlQgaXMgdGhlIHN0YXJ0aW5nIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQsIGFyY2hpdGVjdHVyZSBvcmlnaW4uCi0gICBMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBWQUxVRSBpbiBiaXRzLgotICAgVE9UQUxfTEVOR1RIIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cy4KLQotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLS8qID8/PyBUaGlzIGR1cGxpY2F0ZXMgZnVuY3Rpb25hbGl0eSB3aXRoIGJmZCdzIGhvd3RvIHRhYmxlIGFuZAotICAgYmZkX2luc3RhbGxfcmVsb2NhdGlvbi4gICovCi0vKiA/Pz8gVGhpcyBkb2Vzbid0IGhhbmRsZSBiZmRfdm1hJ3MuICBDcmVhdGUgYW5vdGhlciBmdW5jdGlvbiB3aGVuCi0gICBuZWNlc3NhcnkuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1pbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIGF0dHJzLCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsCi0JICAgICAgIHRvdGFsX2xlbmd0aCwgYnVmZmVyKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci17Ci0gIHN0YXRpYyBjaGFyIGVycmJ1ZlsxMDBdOwotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICB1bnNpZ25lZCBsb25nIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZS4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICByZXR1cm4gTlVMTDsKLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBiYXNlLWluc24tYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBFbnN1cmUgVkFMVUUgd2lsbCBmaXQuICAqLwotICBpZiAoISBDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgbWF4dmFsID0gbWFzazsKLSAgICAgIGlmICgodW5zaWduZWQgbG9uZykgdmFsdWUgPiBtYXh2YWwpCi0JewotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgIHNwcmludGYgKGVycmJ1ZiwKLQkJICAgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsdSBub3QgYmV0d2VlbiAwIGFuZCAlbHUpIiksCi0JCSAgIHZhbHVlLCBtYXh2YWwpOwotCSAgcmV0dXJuIGVycmJ1ZjsKLQl9Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgbG9uZyBtaW52YWwgPSAtICgxTCA8PCAobGVuZ3RoIC0gMSkpOwotICAgICAgbG9uZyBtYXh2YWwgPSAoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDE7Ci0gICAgICBpZiAodmFsdWUgPCBtaW52YWwgfHwgdmFsdWUgPiBtYXh2YWwpCi0JewotCSAgc3ByaW50ZgotCSAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSAgICAoZXJyYnVmLCBfKCJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWxkIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIpLAotCSAgICAgdmFsdWUsIG1pbnZhbCwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLQotI2lmIENHRU5fSU5UX0lOU05fUAotCi0gIHsKLSAgICBpbnQgc2hpZnQ7Ci0KLSAgICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gICAgZWxzZQotICAgICAgc2hpZnQgPSB3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCk7Ci0gICAgKmJ1ZmZlciA9ICgqYnVmZmVyICYgfihtYXNrIDw8IHNoaWZ0KSkgfCAoKHZhbHVlICYgbWFzaykgPDwgc2hpZnQpOwotICB9Ci0KLSNlbHNlIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgewotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnAgPSAodW5zaWduZWQgY2hhciAqKSBidWZmZXIgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICBpbnNlcnRfMSAoY2QsIHZhbHVlLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCk7Ci0gIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIERlZmF1bHQgaW5zbiBidWlsZGVyIChpbnNlcnQgaGFuZGxlcikuCi0gICBUaGUgaW5zdHJ1Y3Rpb24gaXMgcmVjb3JkZWQgaW4gQ0dFTl9JTlRfSU5TTl9QIGJ5dGUgb3JkZXIKLSAgIChtZWFuaW5nIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIEJVRkZFUiBpcyBhbiBpbnQgKiBhbmQgdGh1cyB0aGUgdmFsdWUgaXMKLSAgIHJlY29yZGVkIGluIGhvc3QgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRkZFUiBpcyBhbiBhcnJheSBvZiBieXRlcyBhbmQgdGhlCi0gICB2YWx1ZSBpcyByZWNvcmRlZCBpbiB0YXJnZXQgYnl0ZSBvcmRlcikuCi0gICBUaGUgcmVzdWx0IGlzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBzdWNjZXNzLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X2luc25fbm9ybWFsIChjZCwgaW5zbiwgZmllbGRzLCBidWZmZXIsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBDR0VOX0lOU04gKiBpbnNuOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqIHN5bjsKLQotICBDR0VOX0lOSVRfSU5TRVJUIChjZCk7Ci0gIHZhbHVlID0gQ0dFTl9JTlNOX0JBU0VfVkFMVUUgKGluc24pOwotCi0gIC8qIElmIHdlJ3JlIHJlY29yZGluZyBpbnNucyBhcyBudW1iZXJzIChyYXRoZXIgdGhhbiBhIHN0cmluZyBvZiBieXRlcyksCi0gICAgIHRhcmdldCBieXRlIG9yZGVyIGhhbmRsaW5nIGlzIGRlZmVycmVkIHVudGlsIGxhdGVyLiAgKi8KLQotI2lmIENHRU5fSU5UX0lOU05fUAotCi0gICpidWZmZXIgPSB2YWx1ZTsKLQotI2Vsc2UKLQotICBjZ2VuX3B1dF9pbnNuX3ZhbHVlIChjZCwgYnVmZmVyLCBtaW4gKGNkLT5iYXNlX2luc25fYml0c2l6ZSwKLQkJCQkJQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSksCi0JCSAgICAgICB2YWx1ZSk7Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIC8qID8/PyBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gc2NhbiB0aGUgZm9ybWF0J3MgZmllbGRzLgotICAgICBTdGlsbCBuZWVkIHRvIGJlIGFibGUgdG8gaW5zZXJ0IGEgdmFsdWUgYmFzZWQgb24gdGhlIG9wZXJhbmQgdGhvdWdoOwotICAgICBlLmcuIHN0b3JpbmcgYSBicmFuY2ggZGlzcGxhY2VtZW50IHRoYXQgZ290IHJlc29sdmVkIGxhdGVyLgotICAgICBOZWVkcyBtb3JlIHRob3VnaHQgZmlyc3QuICAqLwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqIHN5biAhPSAnXDAnOyArKyBzeW4pCi0gICAgewotICAgICAgY29uc3QgY2hhciAqZXJybXNnOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqIHN5bikpCi0JY29udGludWU7Ci0KLSAgICAgIGVycm1zZyA9ICgqIGNkLT5pbnNlcnRfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJICAgICAgIGZpZWxkcywgYnVmZmVyLCBwYyk7Ci0gICAgICBpZiAoZXJybXNnKQotCXJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBOVUxMOwotfQotDAotLyogT3BlcmFuZCBleHRyYWN0aW9uLiAgKi8KLQotI2lmICEgQ0dFTl9JTlRfSU5TTl9QCi0KLS8qIFN1YnJvdXRpbmUgb2YgZXh0cmFjdF9ub3JtYWwuCi0gICBFbnN1cmUgc3VmZmljaWVudCBieXRlcyBhcmUgY2FjaGVkIGluIEVYX0lORk8uCi0gICBPRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgaW5zbiBvZiB0aGUgdmFsdWUuCi0gICBCWVRFUyBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBuZWVkZWQgdmFsdWUuCi0gICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgaW50Ci1maWxsX2NhY2hlIChjZCwgZXhfaW5mbywgb2Zmc2V0LCBieXRlcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBpbnQgb2Zmc2V0LCBieXRlczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgLyogSXQncyBkb3VidGZ1bCB0aGF0IHRoZSBtaWRkbGUgcGFydCBoYXMgYWxyZWFkeSBiZWVuIGZldGNoZWQgc28KLSAgICAgd2UgZG9uJ3Qgb3B0aW1pemUgdGhhdCBjYXNlLiAga2lzcy4gICovCi0gIGludCBtYXNrOwotICBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgZXhfaW5mby0+ZGlzX2luZm87Ci0KLSAgLyogRmlyc3QgZG8gYSBxdWljayBjaGVjay4gICovCi0gIG1hc2sgPSAoMSA8PCBieXRlcykgLSAxOwotICBpZiAoKChleF9pbmZvLT52YWxpZCA+PiBvZmZzZXQpICYgbWFzaykgPT0gbWFzaykKLSAgICByZXR1cm4gMTsKLQotICAvKiBTZWFyY2ggZm9yIHRoZSBmaXJzdCBieXRlIHdlIG5lZWQgdG8gcmVhZC4gICovCi0gIGZvciAobWFzayA9IDEgPDwgb2Zmc2V0OyBieXRlcyA+IDA7IC0tYnl0ZXMsICsrb2Zmc2V0LCBtYXNrIDw8PSAxKQotICAgIGlmICghIChtYXNrICYgZXhfaW5mby0+dmFsaWQpKQotICAgICAgYnJlYWs7Ci0KLSAgaWYgKGJ5dGVzKQotICAgIHsKLSAgICAgIGludCBzdGF0dXM7Ci0KLSAgICAgIHBjICs9IG9mZnNldDsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkocGMsIGV4X2luZm8tPmluc25fYnl0ZXMgKyBvZmZzZXQsIGJ5dGVzLCBpbmZvKTsKLQotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHBjLCBpbmZvKTsKLQkgIHJldHVybiAwOwotCX0KLQotICAgICAgZXhfaW5mby0+dmFsaWQgfD0gKCgxIDw8IGJ5dGVzKSAtIDEpIDw8IG9mZnNldDsKLSAgICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgZXh0cmFjdF9ub3JtYWwuICAqLwotCi1zdGF0aWMgQ0dFTl9JTkxJTkUgbG9uZwotZXh0cmFjdF8xIChjZCwgZXhfaW5mbywgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnAsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IHN0YXJ0LGxlbmd0aCx3b3JkX2xlbmd0aDsKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmcDsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgdW5zaWduZWQgbG9uZyB4LG1hc2s7Ci0gIGludCBzaGlmdDsKLSAgaW50IGJpZ19wID0gQ0dFTl9DUFVfSU5TTl9FTkRJQU4gKGNkKSA9PSBDR0VOX0VORElBTl9CSUc7Ci0KLSAgc3dpdGNoICh3b3JkX2xlbmd0aCkKLSAgICB7Ci0gICAgY2FzZSA4OgotICAgICAgeCA9ICpidWZwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIxNiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXggPSAoYnVmcFswXSA8PCAxNikgfCBiZmRfZ2V0YjE2IChidWZwICsgMSk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMTYgKGJ1ZnApIHwgKGJ1ZnBbMl0gPDwgMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gYmZkX2dldGIzMiAoYnVmcCk7Ci0gICAgICBlbHNlCi0JeCA9IGJmZF9nZXRsMzIgKGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdCA6Ci0gICAgICBhYm9ydCAoKTsKLSAgICB9Ci0KLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0gIGlmIChDR0VOX0lOU05fTFNCMF9QKQotICAgIHNoaWZ0ID0gKHN0YXJ0ICsgMSkgLSBsZW5ndGg7Ci0gIGVsc2UKLSAgICBzaGlmdCA9ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICByZXR1cm4gKHggPj4gc2hpZnQpICYgbWFzazsKLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgZXh0cmFjdGlvbiByb3V0aW5lLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIG9mIHRoZSBpbnNuIGluIGhvc3Qgb3JkZXIsCi0gICBvciBzb21ldGltZXMgbGVzcyBmb3IgY2FzZXMgbGlrZSB0aGUgbTMyciB3aGVyZSB0aGUgYmFzZSBpbnNuIHNpemUgaXMgMzIKLSAgIGJ1dCBzb21lIGluc25zIGFyZSAxNiBiaXRzLgotICAgQVRUUlMgaXMgYSBtYXNrIG9mIHRoZSBib29sZWFuIGF0dHJpYnV0ZXMuICBXZSBvbmx5IG5lZWQgYFNJR05FRCcsCi0gICBidXQgZm9yIGdlbmVyYWxpdHkgd2UgdGFrZSBhIGJpdG1hc2sgb2YgYWxsIG9mIHRoZW0uCi0gICBXT1JEX09GRlNFVCBpcyB0aGUgb2Zmc2V0IGluIGJpdHMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgV09SRF9MRU5HVEggaXMgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBpbiBiaXRzIGluIHdoaWNoIHRoZSB2YWx1ZSByZXNpZGVzLgotICAgU1RBUlQgaXMgdGhlIHN0YXJ0aW5nIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQsIGFyY2hpdGVjdHVyZSBvcmlnaW4uCi0gICBMRU5HVEggaXMgdGhlIGxlbmd0aCBvZiBWQUxVRSBpbiBiaXRzLgotICAgVE9UQUxfTEVOR1RIIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGluc24gaW4gYml0cy4KLQotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotLyogPz8/IFRoZSByZXR1cm4gY29kZSBpc24ndCBwcm9wZXJseSB1c2VkLiAgd2lwLiAgKi8KLQotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsCi0JCXdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGgsIHBjLCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIENHRU5fRVhUUkFDVF9JTkZPICpleF9pbmZvOwotICAgICBDR0VOX0lOU05fSU5UIGluc25fdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgdW5zaWduZWQgaW50IHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoOwotICAgICBiZmRfdm1hIHBjOwotICAgICBsb25nICp2YWx1ZXA7Ci17Ci0gIENHRU5fSU5TTl9JTlQgdmFsdWU7Ci0KLSAgLyogSWYgTEVOR1RIIGlzIHplcm8sIHRoaXMgb3BlcmFuZCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gdGhlIHZhbHVlCi0gICAgIHNvIGdpdmUgaXQgYSBzdGFuZGFyZCB2YWx1ZSBvZiB6ZXJvLiAgKi8KLSAgaWYgKGxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgICp2YWx1ZXAgPSAwOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmIChDR0VOX0lOVF9JTlNOX1AKLSAgICAgICYmIHdvcmRfb2Zmc2V0ICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0gICAgYWJvcnQgKCk7Ci0KLSAgLyogRm9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbnNucyBzbWFsbGVyIHRoYW4gdGhlIGluc24tYmFzZS1iaXRzaXplLAotICAgICB3b3JkX2xlbmd0aCBtYXkgYmUgdG9vIGJpZy4gICovCi0gIGlmIChjZC0+bWluX2luc25fYml0c2l6ZSA8IGNkLT5iYXNlX2luc25fYml0c2l6ZSkKLSAgICB7Ci0gICAgICBpZiAod29yZF9vZmZzZXQgPT0gMAotCSAgJiYgd29yZF9sZW5ndGggPiB0b3RhbF9sZW5ndGgpCi0Jd29yZF9sZW5ndGggPSB0b3RhbF9sZW5ndGg7Ci0gICAgfQotCi0gIC8qIERvZXMgdGhlIHZhbHVlIHJlc2lkZSBpbiBJTlNOX1ZBTFVFPyAgKi8KLQotICBpZiAod29yZF9vZmZzZXQgPT0gMCkKLSAgICB7Ci0gICAgICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICAgICAgQ0dFTl9JTlNOX0lOVCBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAgICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0JdmFsdWUgPSBpbnNuX3ZhbHVlID4+ICgoc3RhcnQgKyAxKSAtIGxlbmd0aCk7Ci0gICAgICBlbHNlCi0JdmFsdWUgPSBpbnNuX3ZhbHVlID4+ICh3b3JkX2xlbmd0aCAtIChzdGFydCArIGxlbmd0aCkpOwotICAgICAgdmFsdWUgJj0gbWFzazsKLSAgICAgIC8qIHNpZ24gZXh0ZW5kPyAqLwotICAgICAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9JRkxEX1NJR05FRCkKLQkgICYmICh2YWx1ZSAmICgxTCA8PCAobGVuZ3RoIC0gMSkpKSkKLQl2YWx1ZSB8PSB+bWFzazsKLSAgICB9Ci0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0gIGVsc2UKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gZXhfaW5mby0+aW5zbl9ieXRlcyArIHdvcmRfb2Zmc2V0IC8gODsKLQotICAgICAgaWYgKHdvcmRfbGVuZ3RoID4gMzIpCi0JYWJvcnQgKCk7Ci0KLSAgICAgIGlmIChmaWxsX2NhY2hlIChjZCwgZXhfaW5mbywgd29yZF9vZmZzZXQgLyA4LCB3b3JkX2xlbmd0aCAvIDgsIHBjKSA9PSAwKQotCXJldHVybiAwOwotCi0gICAgICB2YWx1ZSA9IGV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYyk7Ci0gICAgfQotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAqdmFsdWVwID0gdmFsdWU7Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8qIERlZmF1bHQgaW5zbiBleHRyYWN0b3IuCi0KLSAgIElOU05fVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMsIHRyYW5zbGF0ZWQgdG8gaG9zdCBvcmRlci4KLSAgIFRoZSBleHRyYWN0ZWQgZmllbGRzIGFyZSBzdG9yZWQgaW4gRklFTERTLgotICAgRVhfSU5GTyBpcyB1c2VkIHRvIGhhbmRsZSByZWFkaW5nIHZhcmlhYmxlIGxlbmd0aCBpbnNucy4KLSAgIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMsIG9yIDAgaWYgbm8gbWF0Y2gsCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0X2luc25fbm9ybWFsIChjZCwgaW5zbiwgZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN5bjsKLQotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotCi0gIENHRU5fSU5JVF9FWFRSQUNUIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGludCBsZW5ndGg7Ci0KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCpzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBsZW5ndGggPSAoKiBjZC0+ZXh0cmFjdF9vcGVyYW5kKSAoY2QsIENHRU5fU1lOVEFYX0ZJRUxEICgqc3luKSwKLQkJCQkJZXhfaW5mbywgaW5zbl92YWx1ZSwgZmllbGRzLCBwYyk7Ci0gICAgICBpZiAobGVuZ3RoIDw9IDApCi0JcmV0dXJuIGxlbmd0aDsKLSAgICB9Ci0KLSAgLyogV2UgcmVjb2duaXplZCBhbmQgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCB0aGlzIGluc24uICAqLwotICByZXR1cm4gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotfQotDAotLyogbWFjaGluZSBnZW5lcmF0ZWQgY29kZSBhZGRlZCBoZXJlICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIG9wZXJhbmQgaW5zZXJ0aW9uLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuICBJdCdzIGFsc28gbmVlZGVkIGJ5IEdBUyB0byBpbnNlcnQgb3BlcmFuZHMgdGhhdCBjb3VsZG4ndCBiZQotICAgcmVzb2x2ZWQgZHVyaW5nIHBhcnNpbmcuCi0qLwotCi1jb25zdCBjaGFyICoKLWZyMzBfY2dlbl9pbnNlcnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBDR0VOX0lOU05fQllURVNfUFRSIGJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgY2hhciAqIGVycm1zZzsKLSAgdW5zaWduZWQgaW50IHRvdGFsX2xlbmd0aCA9IENHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcyk7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9DUmksIDAsIDE2LCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX0NSaiwgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9uaWwsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX25pbCwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfbmlsLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JpLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JpYywgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SaiwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX1JqYywgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SczEsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9SczIsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9jYywgMCwgMCwgNCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2NjYywgMCwgMTYsIDAsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlyMTA7Ci0gICAgICAgIHZhbHVlID0gKCh1bnNpZ25lZCBpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2RpcjgsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXI5OwotICAgICAgICB2YWx1ZSA9ICgodW5zaWduZWQgaW50KSAodmFsdWUpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDEwOwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2Rpc3A4LCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwOTsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKHZhbHVlKSA+PiAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA0LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHsKLXsKLSAgRkxEIChmX2kyMF80KSA9ICgodW5zaWduZWQgaW50KSAoRkxEIChmX2kyMCkpID4+ICgxNikpOwotICBGTEQgKGZfaTIwXzE2KSA9ICgoRkxEIChmX2kyMCkpICYgKDY1NTM1KSk7Ci19Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTIwXzQsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICAgIGlmIChlcnJtc2cpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTIwXzE2LCAwLCAxNiwgMCwgMTYsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICAgIGlmIChlcnJtc2cpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9pMzIsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDE2LCAwLCAzMiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfaTgsIDAsIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWwxMjsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKCgocGMpICsgKDIpKSkpKSA+PiAoMSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDUsIDExLCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWw5OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgKyAoMikpKSkpID4+ICgxKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9tNDsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSAmICgxNSkpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX25pbCwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0LCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9zMTA7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICh2YWx1ZSkgPj4gKDIpKTsKLSAgICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfdTEwOwotICAgICAgICB2YWx1ZSA9ICgodW5zaWduZWQgaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdTQsIDAsIDAsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91NGMsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91OCwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSBmaWVsZHMtPmZfdWRpc3A2OwotICAgICAgICB2YWx1ZSA9ICgodW5zaWduZWQgaW50KSAodmFsdWUpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgYnVpbGRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBleHRyYWN0aW9uLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1pbnQKLWZyMzBfY2dlbl9leHRyYWN0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGludCBsZW5ndGg7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfQ1JpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDE2LCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfQ1JqKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDAsIDAsIDAsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SaSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgMTIsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SaWMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfUmopOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMTYsIDgsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9SamMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JzMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX1JzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDQsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9jYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgMCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2NjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgyKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXIxMCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9kaXI4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDgsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMSkpOwotICAgICAgICBmaWVsZHMtPmZfZGlyOSA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgNCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgyKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMTAgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9kaXNwOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSAoKHZhbHVlKSA8PCAoMSkpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDkgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICB7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2kyMF80KTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAxNiwgMCwgMTYsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pMjBfMTYpOwotewotICBGTEQgKGZfaTIwKSA9ICgoKChGTEQgKGZfaTIwXzQpKSA8PCAoMTYpKSkgfCAoRkxEIChmX2kyMF8xNikpKTsKLX0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDE2LCAwLCAzMiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2kzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDQsIDgsIDE2LCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9pOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA1LCAxMSwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDEpKSkgKyAoKChwYykgKyAoMikpKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9yZWwxMiA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKXwoMTw8Q0dFTl9JRkxEX1BDUkVMX0FERFIpLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMSkpKSArICgoKHBjKSArICgyKSkpKTsKLSAgICAgICAgZmllbGRzLT5mX3JlbDkgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCh2YWx1ZSkgfCAoKCgtMSkgPDwgKDQpKSkpOwotICAgICAgICBmaWVsZHMtPmZfbTQgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfbmlsKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA4LCA4LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3QpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZTsKLSAgICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgyKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9zMTAgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgyKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl91MTAgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3U0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAxNiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdTRjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgOCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3U4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgOCwgNCwgMTYsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgodmFsdWUpIDw8ICgyKSk7Ci0gICAgICAgIGZpZWxkcy0+Zl91ZGlzcDYgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZGVjb2RpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICByZXR1cm4gbGVuZ3RoOwotfQotCi1jZ2VuX2luc2VydF9mbiAqIGNvbnN0IGZyMzBfY2dlbl9pbnNlcnRfaGFuZGxlcnNbXSA9IAotewotICBpbnNlcnRfaW5zbl9ub3JtYWwsCi19OwotCi1jZ2VuX2V4dHJhY3RfZm4gKiBjb25zdCBmcjMwX2NnZW5fZXh0cmFjdF9oYW5kbGVyc1tdID0gCi17Ci0gIGV4dHJhY3RfaW5zbl9ub3JtYWwsCi19OwotCi0vKiBHZXR0aW5nIHZhbHVlcyBmcm9tIGNnZW5fZmllbGRzIGlzIGhhbmRsZWQgYnkgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucy4KLSAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFZBTFVFIGFyZ3VtZW50IHRoZXkgcmV0dXJuLgotICAgVE9ETzogZmxvYXRpbmcgcG9pbnQsIGlubGluaW5nIHN1cHBvcnQsIHJlbW92ZSBjYXNlcyB3aGVyZSByZXN1bHQgdHlwZQotICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KLQotaW50Ci1mcjMwX2NnZW5fZ2V0X2ludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGludCB2YWx1ZTsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9DUmk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkogOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JqOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjEzIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTUgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSUMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmljOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkogOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmo7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSkMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUmpjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMxIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JzMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9jYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDQyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9jY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVIxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXIxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1AxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTIwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2kyMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kzMiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMzI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMMTIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVsMTI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVsOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX000IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX200OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUFMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9MRCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9ISV9TVCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfTEQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19TVCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1MxMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNEMgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTRjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VRElTUDYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWRpc3A2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1iZmRfdm1hCi1mcjMwX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfQ1JpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX0NSajsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfbmlsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JpYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX1JqYzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9SczE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfUnMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2M7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfY2NjOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlyMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpcjk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9pMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTMyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDEyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlbDk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9tNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9sZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9oaV9zdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3JlZ2xpc3RfbG93X2xkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfc3Q7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfczEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3UxMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U0YzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3U4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VkaXNwNjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgZ2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogU3R1ZmZpbmcgdmFsdWVzIGluIGNnZW5fZmllbGRzIGlzIGhhbmRsZWQgYnkgYSBjb2xsZWN0aW9uIG9mIGZ1bmN0aW9ucy4KLSAgIFRoZXkgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHR5cGUgb2YgdGhlIFZBTFVFIGFyZ3VtZW50IHRoZXkgYWNjZXB0LgotICAgVE9ETzogZmxvYXRpbmcgcG9pbnQsIGlubGluaW5nIHN1cHBvcnQsIHJlbW92ZSBjYXNlcyB3aGVyZSBhcmd1bWVudCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi12b2lkCi1mcjMwX2NnZW5fc2V0X2ludF9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JJIDoKLSAgICAgIGZpZWxkcy0+Zl9DUmkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NSSiA6Ci0gICAgICBmaWVsZHMtPmZfQ1JqID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTMgOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE0IDoKLSAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxNSA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSSA6Ci0gICAgICBmaWVsZHMtPmZfUmkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJQyA6Ci0gICAgICBmaWVsZHMtPmZfUmljID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SSiA6Ci0gICAgICBmaWVsZHMtPmZfUmogPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKQyA6Ci0gICAgICBmaWVsZHMtPmZfUmpjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzEgOgotICAgICAgZmllbGRzLT5mX1JzMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUlMyIDoKLSAgICAgIGZpZWxkcy0+Zl9SczIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0NDIDoKLSAgICAgIGZpZWxkcy0+Zl9jYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0NDIDoKLSAgICAgIGZpZWxkcy0+Zl9jY2MgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJUjEwIDoKLSAgICAgIGZpZWxkcy0+Zl9kaXIxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOCA6Ci0gICAgICBmaWVsZHMtPmZfZGlyOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSOSA6Ci0gICAgICBmaWVsZHMtPmZfZGlyOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDEwIDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDkgOgotICAgICAgZmllbGRzLT5mX2Rpc3A5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMjAgOgotICAgICAgZmllbGRzLT5mX2kyMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTMyIDoKLSAgICAgIGZpZWxkcy0+Zl9pMzIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0k4IDoKLSAgICAgIGZpZWxkcy0+Zl9pOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUwxMiA6Ci0gICAgICBmaWVsZHMtPmZfcmVsMTIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0xBQkVMOSA6Ci0gICAgICBmaWVsZHMtPmZfcmVsOSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTTQgOgotICAgICAgZmllbGRzLT5mX200ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9QUyA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX0xEIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX2xkID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0hJX1NUIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2hpX3N0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SRUdMSVNUX0xPV19MRCA6Ci0gICAgICBmaWVsZHMtPmZfcmVnbGlzdF9sb3dfbGQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX1NUIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19zdCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUzEwIDoKLSAgICAgIGZpZWxkcy0+Zl9zMTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1UxMCA6Ci0gICAgICBmaWVsZHMtPmZfdTEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VNCA6Ci0gICAgICBmaWVsZHMtPmZfdTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0QyA6Ci0gICAgICBmaWVsZHMtPmZfdTRjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9VOCA6Ci0gICAgICBmaWVsZHMtPmZfdTggPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1VESVNQNiA6Ci0gICAgICBmaWVsZHMtPmZfdWRpc3A2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgaW50IG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLX0KLQotdm9pZAotZnIzMF9jZ2VuX3NldF92bWFfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgYmZkX3ZtYSB2YWx1ZTsKLXsKLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DUkkgOgotICAgICAgZmllbGRzLT5mX0NSaSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ1JKIDoKLSAgICAgIGZpZWxkcy0+Zl9DUmogPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1IxMyA6Ci0gICAgICBmaWVsZHMtPmZfbmlsID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SMTQgOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUjE1IDoKLSAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JJIDoKLSAgICAgIGZpZWxkcy0+Zl9SaSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUklDIDoKLSAgICAgIGZpZWxkcy0+Zl9SaWMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JKIDoKLSAgICAgIGZpZWxkcy0+Zl9SaiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkpDIDoKLSAgICAgIGZpZWxkcy0+Zl9SamMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JTMSA6Ci0gICAgICBmaWVsZHMtPmZfUnMxID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9SUzIgOgotICAgICAgZmllbGRzLT5mX1JzMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfQ0MgOgotICAgICAgZmllbGRzLT5mX2NjID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9DQ0MgOgotICAgICAgZmllbGRzLT5mX2NjYyA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElSMTAgOgotICAgICAgZmllbGRzLT5mX2RpcjEwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI4IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXI4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVI5IDoKLSAgICAgIGZpZWxkcy0+Zl9kaXI5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQMTAgOgotICAgICAgZmllbGRzLT5mX2Rpc3AxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9ESVNQOSA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDkgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX0kyMCA6Ci0gICAgICBmaWVsZHMtPmZfaTIwID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9JMzIgOgotICAgICAgZmllbGRzLT5mX2kzMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfSTggOgotICAgICAgZmllbGRzLT5mX2k4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9MQUJFTDEyIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWwxMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfTEFCRUw5IDoKLSAgICAgIGZpZWxkcy0+Zl9yZWw5ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9NNCA6Ci0gICAgICBmaWVsZHMtPmZfbTQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1BTIDoKLSAgICAgIGZpZWxkcy0+Zl9uaWwgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfTEQgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfaGlfbGQgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfSElfU1QgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfaGlfc3QgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1JFR0xJU1RfTE9XX0xEIDoKLSAgICAgIGZpZWxkcy0+Zl9yZWdsaXN0X2xvd19sZCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfUkVHTElTVF9MT1dfU1QgOgotICAgICAgZmllbGRzLT5mX3JlZ2xpc3RfbG93X3N0ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZSMzBfT1BFUkFORF9TMTAgOgotICAgICAgZmllbGRzLT5mX3MxMCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTEwIDoKLSAgICAgIGZpZWxkcy0+Zl91MTAgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U0IDoKLSAgICAgIGZpZWxkcy0+Zl91NCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVTRDIDoKLSAgICAgIGZpZWxkcy0+Zl91NGMgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlIzMF9PUEVSQU5EX1U4IDoKLSAgICAgIGZpZWxkcy0+Zl91OCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUjMwX09QRVJBTkRfVURJU1A2IDoKLSAgICAgIGZpZWxkcy0+Zl91ZGlzcDYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgaW5zdHJ1Y3Rpb24gYnVpbGRlciB0YWJsZXMuICAqLwotCi12b2lkCi1mcjMwX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgY2QtPmluc2VydF9oYW5kbGVycyA9ICYgZnIzMF9jZ2VuX2luc2VydF9oYW5kbGVyc1swXTsKLSAgY2QtPmV4dHJhY3RfaGFuZGxlcnMgPSAmIGZyMzBfY2dlbl9leHRyYWN0X2hhbmRsZXJzWzBdOwotCi0gIGNkLT5pbnNlcnRfb3BlcmFuZCA9IGZyMzBfY2dlbl9pbnNlcnRfb3BlcmFuZDsKLSAgY2QtPmV4dHJhY3Rfb3BlcmFuZCA9IGZyMzBfY2dlbl9leHRyYWN0X29wZXJhbmQ7Ci0KLSAgY2QtPmdldF9pbnRfb3BlcmFuZCA9IGZyMzBfY2dlbl9nZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5zZXRfaW50X29wZXJhbmQgPSBmcjMwX2NnZW5fc2V0X2ludF9vcGVyYW5kOwotICBjZC0+Z2V0X3ZtYV9vcGVyYW5kID0gZnIzMF9jZ2VuX2dldF92bWFfb3BlcmFuZDsKLSAgY2QtPnNldF92bWFfb3BlcmFuZCA9IGZyMzBfY2dlbl9zZXRfdm1hX29wZXJhbmQ7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtb3BjLmMgYi9vcGNvZGVzL2ZyMzAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjEwMGQuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2OCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUgZm9yIGZyMzAuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgImZyMzAtZGVzYy5oIgotI2luY2x1ZGUgImZyMzAtb3BjLmgiCi0KLS8qIFRoZSBoYXNoIGZ1bmN0aW9ucyBhcmUgcmVjb3JkZWQgaGVyZSB0byBoZWxwIGtlZXAgYXNzZW1ibGVyIGNvZGUgb3V0IG9mCi0gICB0aGUgZGlzYXNzZW1ibGVyIGFuZCB2aWNlIHZlcnNhLiAgKi8KLQotc3RhdGljIGludCBhc21faGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgZGlzX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRpc19oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0KLS8qIEluc3RydWN0aW9uIGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIEYoZikgJiBmcjMwX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChGUjMwXyxmKV0KLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2VtcHR5ID0gewotICAwLCAwLCAweDAsIHsgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SSiksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGRpID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VNCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9NNCksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kaXYwcyA9IHsKLSAgMTYsIDE2LCAweGZmZjAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2RpdjMgPSB7Ci0gIDE2LCAxNiwgMHhmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfT1A0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpOCA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX0k4KSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTIwID0gewotICAxNiwgMzIsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfSTIwKSwgRiAoRl9PUDIpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMzIgPSB7Ci0gIDE2LCA0OCwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9JMzIpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE0ID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfRElTUDEwKSwgRiAoRl9SSSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkcjE0dWggPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9ESVNQOSksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNHViID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfRElTUDgpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRyMTUgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1VESVNQNiksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHIxNWRyID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9PUDMpLCBGIChGX1JTMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X21vdmRyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9SUzEpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY2FsbCA9IHsKLSAgMTYsIDE2LCAweGY4MDAsIHsgRiAoRl9PUDEpLCBGIChGX09QNSksIEYgKEZfUkVMMTIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9pbnQgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1U4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYnJhZCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX0NDKSwgRiAoRl9SRUw5KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfZG1vdnIxMyA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfRElSMTApLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9kbW92cjEzaCA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfRElSOSksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2Rtb3ZyMTNiID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9ESVI4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY29wb3AgPSB7Ci0gIDE2LCAzMiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQ0MpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9DUkopLCBGIChGX1U0QyksIEYgKEZfQ1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY29wbGQgPSB7Ci0gIDE2LCAzMiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQ0MpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9SSkMpLCBGIChGX1U0QyksIEYgKEZfQ1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfY29wc3QgPSB7Ci0gIDE2LCAzMiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9DQ0MpLCBGIChGX09QMiksIEYgKEZfT1AzKSwgRiAoRl9DUkopLCBGIChGX1U0QyksIEYgKEZfUklDKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkc3AgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1MxMCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkbTAgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfTE9XX0xEKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRtMSA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9ISV9MRCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0bTAgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9PUDIpLCBGIChGX1JFR0xJU1RfTE9XX1NUKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RtMSA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX09QMiksIEYgKEZfUkVHTElTVF9ISV9TVCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2VudGVyID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfT1AyKSwgRiAoRl9VMTApLCAwIH0KLX07Ci0KLSN1bmRlZiBGCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoRlIzMF9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIGZyMzBfY2dlbl9pbnNuX29wY29kZV90YWJsZVtNQVhfSU5TTlNdID0KLXsKLSAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgotICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgotICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLwotICB7IHsgMCB9IH0sCi0vKiBhZGQgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTYwMCB9Ci0gIH0sCi0vKiBhZGQgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGE0MDAgfQotICB9LAotLyogYWRkMiAkbTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQyLCB7IDB4YTUwMCB9Ci0gIH0sCi0vKiBhZGRjICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGE3MDAgfQotICB9LAotLyogYWRkbiAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhMjAwIH0KLSAgfSwKLS8qIGFkZG4gJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGEwMDAgfQotICB9LAotLyogYWRkbjIgJG00LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKE00KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMiwgeyAweGExMDAgfQotICB9LAotLyogc3ViICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFjMDAgfQotICB9LAotLyogc3ViYyAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhhZDAwIH0KLSAgfSwKLS8qIHN1Ym4gJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWUwMCB9Ci0gIH0sCi0vKiBjbXAgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWEwMCB9Ci0gIH0sCi0vKiBjbXAgJHU0LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweGE4MDAgfQotICB9LAotLyogY21wMiAkbTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQyLCB7IDB4YTkwMCB9Ci0gIH0sCi0vKiBhbmQgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODIwMCB9Ci0gIH0sCi0vKiBvciAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5MjAwIH0KLSAgfSwKLS8qIGVvciAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5YTAwIH0KLSAgfSwKLS8qIGFuZCAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4NDAwIH0KLSAgfSwKLS8qIGFuZGggJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4ODUwMCB9Ci0gIH0sCi0vKiBhbmRiICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDg2MDAgfQotICB9LAotLyogb3IgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTQwMCB9Ci0gIH0sCi0vKiBvcmggJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTUwMCB9Ci0gIH0sCi0vKiBvcmIgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OTYwMCB9Ci0gIH0sCi0vKiBlb3IgJFJqLEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OWMwMCB9Ci0gIH0sCi0vKiBlb3JoICRSaixAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDlkMDAgfQotICB9LAotLyogZW9yYiAkUmosQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg5ZTAwIH0KLSAgfSwKLS8qIGJhbmRsICR1NCxAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHg4MDAwIH0KLSAgfSwKLS8qIGJvcmwgJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDkwMDAgfQotICB9LAotLyogYmVvcmwgJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDk4MDAgfQotICB9LAotLyogYmFuZGggJHU0LEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgJ0AnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkaSwgeyAweDgxMDAgfQotICB9LAotLyogYm9yaCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4OTEwMCB9Ci0gIH0sCi0vKiBiZW9yaCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4OTkwMCB9Ci0gIH0sCi0vKiBidHN0bCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4ODgwMCB9Ci0gIH0sCi0vKiBidHN0aCAkdTQsQCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4ODkwMCB9Ci0gIH0sCi0vKiBtdWwgJFJqLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YWYwMCB9Ci0gIH0sCi0vKiBtdWx1ICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGFiMDAgfQotICB9LAotLyogbXVsaCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiZjAwIH0KLSAgfSwKLS8qIG11bHVoICRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGJiMDAgfQotICB9LAotLyogZGl2MHMgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzQwIH0KLSAgfSwKLS8qIGRpdjB1ICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc1MCB9Ci0gIH0sCi0vKiBkaXYxICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc2MCB9Ci0gIH0sCi0vKiBkaXYyICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc3MCB9Ci0gIH0sCi0vKiBkaXYzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZjYwIH0KLSAgfSwKLS8qIGRpdjRzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZjcwIH0KLSAgfSwKLS8qIGxzbCAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiNjAwIH0KLSAgfSwKLS8qIGxzbCAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjQwMCB9Ci0gIH0sCi0vKiBsc2wyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiNTAwIH0KLSAgfSwKLS8qIGxzciAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiMjAwIH0KLSAgfSwKLS8qIGxzciAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjAwMCB9Ci0gIH0sCi0vKiBsc3IyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiMTAwIH0KLSAgfSwKLS8qIGFzciAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhiYTAwIH0KLSAgfSwKLS8qIGFzciAkdTQsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTQpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4YjgwMCB9Ci0gIH0sCi0vKiBhc3IyICR1NCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiOTAwIH0KLSAgfSwKLS8qIGxkaTo4ICRpOCwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJOCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTgsIHsgMHhjMDAwIH0KLSAgfSwKLS8qIGxkaToyMCAkaTIwLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEkyMCksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTIwLCB7IDB4OWIwMCB9Ci0gIH0sCi0vKiBsZGk6MzIgJGkzMiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChJMzIpLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZGkzMiwgeyAweDlmODAgfQotICB9LAotLyogbGQgQCRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4NDAwIH0KLSAgfSwKLS8qIGxkdWggQCRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4NTAwIH0KLSAgfSwKLS8qIGxkdWIgQCRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4NjAwIH0KLSAgfSwKLS8qIGxkIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MCB9Ci0gIH0sCi0vKiBsZHVoIEAoJFIxMywkUmopLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAwIH0KLSAgfSwKLS8qIGxkdWIgQCgkUjEzLCRSaiksJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMDAgfQotICB9LAotLyogbGQgQCgkUjE0LCRkaXNwMTApLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQMTApLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0LCB7IDB4MjAwMCB9Ci0gIH0sCi0vKiBsZHVoIEAoJFIxNCwkZGlzcDkpLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCAnKCcsIE9QIChSMTQpLCAnLCcsIE9QIChESVNQOSksICcpJywgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTR1aCwgeyAweDQwMDAgfQotICB9LAotLyogbGR1YiBAKCRSMTQsJGRpc3A4KSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDgpLCAnKScsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0dWIsIHsgMHg2MDAwIH0KLSAgfSwKLS8qIGxkIEAoJFIxNSwkdWRpc3A2KSwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgJygnLCBPUCAoUjE1KSwgJywnLCBPUCAoVURJU1A2KSwgJyknLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNSwgeyAweDMwMCB9Ci0gIH0sCi0vKiBsZCBAJFIxNSssJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4NzAwIH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkUnMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTUpLCAnKycsICcsJywgT1AgKFJTMiksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNWRyLCB7IDB4NzgwIH0KLSAgfSwKLS8qIGxkIEAkUjE1KywkcHMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxNSksICcrJywgJywnLCBPUCAoUFMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDc5MCB9Ci0gIH0sCi0vKiBzdCAkUmksQCRSaiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsIE9QIChSSiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxNDAwIH0KLSAgfSwKLS8qIHN0aCAkUmksQCRSaiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsIE9QIChSSiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxNTAwIH0KLSAgfSwKLS8qIHN0YiAkUmksQCRSaiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsIE9QIChSSiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxNjAwIH0KLSAgfSwKLS8qIHN0ICRSaSxAKCRSMTMsJFJqKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxMyksICcsJywgT1AgKFJKKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAwMCB9Ci0gIH0sCi0vKiBzdGggJFJpLEAoJFIxMywkUmopICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjEzKSwgJywnLCBPUCAoUkopLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMTAwIH0KLSAgfSwKLS8qIHN0YiAkUmksQCgkUjEzLCRSaikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnKCcsIE9QIChSMTMpLCAnLCcsIE9QIChSSiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEyMDAgfQotICB9LAotLyogc3QgJFJpLEAoJFIxNCwkZGlzcDEwKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCAnQCcsICcoJywgT1AgKFIxNCksICcsJywgT1AgKERJU1AxMCksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkcjE0LCB7IDB4MzAwMCB9Ci0gIH0sCi0vKiBzdGggJFJpLEAoJFIxNCwkZGlzcDkpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDkpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNHVoLCB7IDB4NTAwMCB9Ci0gIH0sCi0vKiBzdGIgJFJpLEAoJFIxNCwkZGlzcDgpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE0KSwgJywnLCBPUCAoRElTUDgpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNHViLCB7IDB4NzAwMCB9Ci0gIH0sCi0vKiBzdCAkUmksQCgkUjE1LCR1ZGlzcDYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAnLCcsICdAJywgJygnLCBPUCAoUjE1KSwgJywnLCBPUCAoVURJU1A2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRyMTUsIHsgMHgxMzAwIH0KLSAgfSwKLS8qIHN0ICRSaSxALSRSMTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksICcsJywgJ0AnLCAnLScsIE9QIChSMTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHgxNzAwIH0KLSAgfSwKLS8qIHN0ICRSczIsQC0kUjE1ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUlMyKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAotICAgICYgaWZtdF9sZHIxNWRyLCB7IDB4MTc4MCB9Ci0gIH0sCi0vKiBzdCAkcHMsQC0kUjE1ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUFMpLCAnLCcsICdAJywgJy0nLCBPUCAoUjE1KSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHgxNzkwIH0KLSAgfSwKLS8qIG1vdiAkUmosJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkopLCAnLCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHg4YjAwIH0KLSAgfSwKLS8qIG1vdiAkUnMxLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJTMSksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X21vdmRyLCB7IDB4YjcwMCB9Ci0gIH0sCi0vKiBtb3YgJHBzLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFBTKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHgxNzEwIH0KLSAgfSwKLS8qIG1vdiAkUmksJFJzMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCBPUCAoUlMxKSwgMCB9IH0sCi0gICAgJiBpZm10X21vdmRyLCB7IDB4YjMwMCB9Ci0gIH0sCi0vKiBtb3YgJFJpLCRwcyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgJywnLCBPUCAoUFMpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg3MTAgfQotICB9LAotLyogam1wIEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTcwMCB9Ci0gIH0sCi0vKiBqbXA6ZCBAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDlmMDAgfQotICB9LAotLyogY2FsbCBAJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3MTAgfQotICB9LAotLyogY2FsbDpkIEAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OWYxMCB9Ci0gIH0sCi0vKiBjYWxsICRsYWJlbDEyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUwxMiksIDAgfSB9LAotICAgICYgaWZtdF9jYWxsLCB7IDB4ZDAwMCB9Ci0gIH0sCi0vKiBjYWxsOmQgJGxhYmVsMTIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDEyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NhbGwsIHsgMHhkODAwIH0KLSAgfSwKLS8qIHJldCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OTcyMCB9Ci0gIH0sCi0vKiByZXQ6ZCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWYyMCB9Ci0gIH0sCi0vKiBpbnQgJHU4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfaW50LCB7IDB4MWYwMCB9Ci0gIH0sCi0vKiBpbnRlICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZjMwIH0KLSAgfSwKLS8qIHJldGkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MywgeyAweDk3MzAgfQotICB9LAotLyogYnJhOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjAwMCB9Ci0gIH0sCi0vKiBicmEgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTAwMCB9Ci0gIH0sCi0vKiBibm86ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmMTAwIH0KLSAgfSwKLS8qIGJubyAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlMTAwIH0KLSAgfSwKLS8qIGJlcTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGYyMDAgfQotICB9LAotLyogYmVxICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGUyMDAgfQotICB9LAotLyogYm5lOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjMwMCB9Ci0gIH0sCi0vKiBibmUgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTMwMCB9Ci0gIH0sCi0vKiBiYzpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY0MDAgfQotICB9LAotLyogYmMgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZTQwMCB9Ci0gIH0sCi0vKiBibmM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmNTAwIH0KLSAgfSwKLS8qIGJuYyAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlNTAwIH0KLSAgfSwKLS8qIGJuOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjYwMCB9Ci0gIH0sCi0vKiBibiAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlNjAwIH0KLSAgfSwKLS8qIGJwOmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjcwMCB9Ci0gIH0sCi0vKiBicCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlNzAwIH0KLSAgfSwKLS8qIGJ2OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZjgwMCB9Ci0gIH0sCi0vKiBidiAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlODAwIH0KLSAgfSwKLS8qIGJudjpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGY5MDAgfQotICB9LAotLyogYm52ICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGU5MDAgfQotICB9LAotLyogYmx0OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmEwMCB9Ci0gIH0sCi0vKiBibHQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWEwMCB9Ci0gIH0sCi0vKiBiZ2U6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmYjAwIH0KLSAgfSwKLS8qIGJnZSAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlYjAwIH0KLSAgfSwKLS8qIGJsZTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZjMDAgfQotICB9LAotLyogYmxlICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVjMDAgfQotICB9LAotLyogYmd0OmQgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZmQwMCB9Ci0gIH0sCi0vKiBiZ3QgJGxhYmVsOSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKExBQkVMOSksIDAgfSB9LAotICAgICYgaWZtdF9icmFkLCB7IDB4ZWQwMCB9Ci0gIH0sCi0vKiBibHM6ZCAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhmZTAwIH0KLSAgfSwKLS8qIGJscyAkbGFiZWw5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoTEFCRUw5KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYWQsIHsgMHhlZTAwIH0KLSAgfSwKLS8qIGJoaTpkICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGZmMDAgfQotICB9LAotLyogYmhpICRsYWJlbDkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChMQUJFTDkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhZCwgeyAweGVmMDAgfQotICB9LAotLyogZG1vdiAkUjEzLEAkZGlyMTAgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSMTMpLCAnLCcsICdAJywgT1AgKERJUjEwKSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHgxODAwIH0KLSAgfSwKLS8qIGRtb3ZoICRSMTMsQCRkaXI5ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUjEzKSwgJywnLCAnQCcsIE9QIChESVI5KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNoLCB7IDB4MTkwMCB9Ci0gIH0sCi0vKiBkbW92YiAkUjEzLEAkZGlyOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFIxMyksICcsJywgJ0AnLCBPUCAoRElSOCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzYiwgeyAweDFhMDAgfQotICB9LAotLyogZG1vdiBAJFIxMyssQCRkaXIxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjEzKSwgJysnLCAnLCcsICdAJywgT1AgKERJUjEwKSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHgxYzAwIH0KLSAgfSwKLS8qIGRtb3ZoIEAkUjEzKyxAJGRpcjkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFIxMyksICcrJywgJywnLCAnQCcsIE9QIChESVI5KSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNoLCB7IDB4MWQwMCB9Ci0gIH0sCi0vKiBkbW92YiBAJFIxMyssQCRkaXI4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChSMTMpLCAnKycsICcsJywgJ0AnLCBPUCAoRElSOCksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzYiwgeyAweDFlMDAgfQotICB9LAotLyogZG1vdiBAJFIxNSssQCRkaXIxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUjE1KSwgJysnLCAnLCcsICdAJywgT1AgKERJUjEwKSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTMsIHsgMHgxYjAwIH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCwkUjEzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVIxMCksICcsJywgT1AgKFIxMyksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4ODAwIH0KLSAgfSwKLS8qIGRtb3ZoIEAkZGlyOSwkUjEzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI5KSwgJywnLCBPUCAoUjEzKSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNoLCB7IDB4OTAwIH0KLSAgfSwKLS8qIGRtb3ZiIEAkZGlyOCwkUjEzICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnQCcsIE9QIChESVI4KSwgJywnLCBPUCAoUjEzKSwgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4YTAwIH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCxAJFIxMysgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjEwKSwgJywnLCAnQCcsIE9QIChSMTMpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4YzAwIH0KLSAgfSwKLS8qIGRtb3ZoIEAkZGlyOSxAJFIxMysgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjkpLCAnLCcsICdAJywgT1AgKFIxMyksICcrJywgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNoLCB7IDB4ZDAwIH0KLSAgfSwKLS8qIGRtb3ZiIEAkZGlyOCxAJFIxMysgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjgpLCAnLCcsICdAJywgT1AgKFIxMyksICcrJywgMCB9IH0sCi0gICAgJiBpZm10X2Rtb3ZyMTNiLCB7IDB4ZTAwIH0KLSAgfSwKLS8qIGRtb3YgQCRkaXIxMCxALSRSMTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKERJUjEwKSwgJywnLCAnQCcsICctJywgT1AgKFIxNSksIDAgfSB9LAotICAgICYgaWZtdF9kbW92cjEzLCB7IDB4YjAwIH0KLSAgfSwKLS8qIGxkcmVzIEAkUmkrLCR1NCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJ0AnLCBPUCAoUkkpLCAnKycsICcsJywgT1AgKFU0KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiYzAwIH0KLSAgfSwKLS8qIHN0cmVzICR1NCxAJFJpKyAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU0KSwgJywnLCAnQCcsIE9QIChSSSksICcrJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZGksIHsgMHhiZDAwIH0KLSAgfSwKLS8qIGNvcG9wICR1NGMsJGNjYywkQ1JqLCRDUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNEMpLCAnLCcsIE9QIChDQ0MpLCAnLCcsIE9QIChDUkopLCAnLCcsIE9QIChDUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfY29wb3AsIHsgMHg5ZmMwIH0KLSAgfSwKLS8qIGNvcGxkICR1NGMsJGNjYywkUmpjLCRDUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNEMpLCAnLCcsIE9QIChDQ0MpLCAnLCcsIE9QIChSSkMpLCAnLCcsIE9QIChDUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfY29wbGQsIHsgMHg5ZmQwIH0KLSAgfSwKLS8qIGNvcHN0ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNEMpLCAnLCcsIE9QIChDQ0MpLCAnLCcsIE9QIChDUkopLCAnLCcsIE9QIChSSUMpLCAwIH0gfSwKLSAgICAmIGlmbXRfY29wc3QsIHsgMHg5ZmUwIH0KLSAgfSwKLS8qIGNvcHN2ICR1NGMsJGNjYywkQ1JqLCRSaWMgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVNEMpLCAnLCcsIE9QIChDQ0MpLCAnLCcsIE9QIChDUkopLCAnLCcsIE9QIChSSUMpLCAwIH0gfSwKLSAgICAmIGlmbXRfY29wc3QsIHsgMHg5ZmYwIH0KLSAgfSwKLS8qIG5vcCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9kaXYzLCB7IDB4OWZhMCB9Ci0gIH0sCi0vKiBhbmRjY3IgJHU4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfaW50LCB7IDB4ODMwMCB9Ci0gIH0sCi0vKiBvcmNjciAkdTggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChVOCksIDAgfSB9LAotICAgICYgaWZtdF9pbnQsIHsgMHg5MzAwIH0KLSAgfSwKLS8qIHN0aWxtICR1OCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFU4KSwgMCB9IH0sCi0gICAgJiBpZm10X2ludCwgeyAweDg3MDAgfQotICB9LAotLyogYWRkc3AgJHMxMCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFMxMCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRzcCwgeyAweGEzMDAgfQotICB9LAotLyogZXh0c2IgJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5NzgwIH0KLSAgfSwKLS8qIGV4dHViICRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjBzLCB7IDB4OTc5MCB9Ci0gIH0sCi0vKiBleHRzaCAkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChSSSksIDAgfSB9LAotICAgICYgaWZtdF9kaXYwcywgeyAweDk3YTAgfQotICB9LAotLyogZXh0dWggJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2MHMsIHsgMHg5N2IwIH0KLSAgfSwKLS8qIGxkbTAgKCRyZWdsaXN0X2xvd19sZCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfTE9XX0xEKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRtMCwgeyAweDhjMDAgfQotICB9LAotLyogbGRtMSAoJHJlZ2xpc3RfaGlfbGQpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCAnKCcsIE9QIChSRUdMSVNUX0hJX0xEKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRtMSwgeyAweDhkMDAgfQotICB9LAotLyogc3RtMCAoJHJlZ2xpc3RfbG93X3N0KSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgJygnLCBPUCAoUkVHTElTVF9MT1dfU1QpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdG0wLCB7IDB4OGUwMCB9Ci0gIH0sCi0vKiBzdG0xICgkcmVnbGlzdF9oaV9zdCkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICcoJywgT1AgKFJFR0xJU1RfSElfU1QpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdG0xLCB7IDB4OGYwMCB9Ci0gIH0sCi0vKiBlbnRlciAkdTEwICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVTEwKSwgMCB9IH0sCi0gICAgJiBpZm10X2VudGVyLCB7IDB4ZjAwIH0KLSAgfSwKLS8qIGxlYXZlICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X2RpdjMsIHsgMHg5ZjkwIH0KLSAgfSwKLS8qIHhjaGIgQCRSaiwkUmkgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsICdAJywgT1AgKFJKKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4OGEwMCB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotLyogRm9ybWF0cyBmb3IgQUxJQVMgbWFjcm8taW5zbnMuICAqLwotCi0jZGVmaW5lIEYoZikgJiBmcjMwX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChGUjMwXyxmKV0KLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaThtID0gewotICAxNiwgMTYsIDB4ZjAwMCwgeyBGIChGX09QMSksIEYgKEZfSTgpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMjBtID0gewotICAxNiwgMzIsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfSTIwKSwgRiAoRl9PUDIpLCBGIChGX1JJKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRpMzJtID0gewotICAxNiwgNDgsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfSTMyKSwgRiAoRl9PUDIpLCBGIChGX09QMyksIEYgKEZfUkkpLCAwIH0KLX07Ci0KLSN1bmRlZiBGCi0KLS8qIEVhY2ggbm9uLXNpbXBsZSBtYWNybyBlbnRyeSBwb2ludHMgdG8gYW4gYXJyYXkgb2YgZXhwYW5zaW9uIHBvc3NpYmlsaXRpZXMuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgTU5FTSBDR0VOX1NZTlRBWF9NTkVNT05JQyAvKiBzeW50YXggdmFsdWUgZm9yIG1uZW1vbmljICovCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKEZSMzBfT1BFUkFORF8sb3ApCi0jZGVmaW5lIE9QKGZpZWxkKSBDR0VOX1NZTlRBWF9NQUtFX0ZJRUxEIChPUEVSQU5EIChmaWVsZCkpCi0KLS8qIFRoZSBtYWNybyBpbnN0cnVjdGlvbiB0YWJsZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lCQVNFIGZyMzBfY2dlbl9tYWNyb19pbnNuX3RhYmxlW10gPQotewotLyogbGRpOCAkaTgsJFJpICovCi0gIHsKLSAgICAtMSwgImxkaThtIiwgImxkaTgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpMjAgJGkyMCwkUmkgKi8KLSAgewotICAgIC0xLCAibGRpMjBtIiwgImxkaTIwIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaTMyICRpMzIsJFJpICovCi0gIHsKLSAgICAtMSwgImxkaTMybSIsICJsZGkzMiIsIDQ4LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi19OwotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIGZyMzBfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVtdID0KLXsKLS8qIGxkaTggJGk4LCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEk4KSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpOG0sIHsgMHhjMDAwIH0KLSAgfSwKLS8qIGxkaTIwICRpMjAsJFJpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoSTIwKSwgJywnLCBPUCAoUkkpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMjBtLCB7IDB4OWIwMCB9Ci0gIH0sCi0vKiBsZGkzMiAkaTMyLCRSaSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKEkzMiksICcsJywgT1AgKFJJKSwgMCB9IH0sCi0gICAgJiBpZm10X2xkaTMybSwgeyAweDlmODAgfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1BFUkFORAotI3VuZGVmIE9QCi0KLSNpZm5kZWYgQ0dFTl9BU01fSEFTSF9QCi0jZGVmaW5lIENHRU5fQVNNX0hBU0hfUChpbnNuKSAxCi0jZW5kaWYKLQotI2lmbmRlZiBDR0VOX0RJU19IQVNIX1AKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9QKGluc24pIDEKLSNlbmRpZgotCi0vKiBSZXR1cm4gbm9uLXplcm8gaWYgSU5TTiBpcyB0byBiZSBhZGRlZCB0byB0aGUgaGFzaCB0YWJsZS4KLSAgIFRhcmdldHMgYXJlIGZyZWUgdG8gb3ZlcnJpZGUgQ0dFTl97QVNNLERJU31fSEFTSF9QIGluIHRoZSAub3BjIGZpbGUuICAqLwotCi1zdGF0aWMgaW50Ci1hc21faGFzaF9pbnNuX3AgKGluc24pCi0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLXsKLSAgcmV0dXJuIENHRU5fQVNNX0hBU0hfUCAoaW5zbik7Ci19Ci0KLXN0YXRpYyBpbnQKLWRpc19oYXNoX2luc25fcCAoaW5zbikKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotewotICAvKiBJZiBidWlsZGluZyB0aGUgaGFzaCB0YWJsZSBhbmQgdGhlIE5PLURJUyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwKLSAgICAgaWdub3JlLiAgKi8KLSAgaWYgKENHRU5fSU5TTl9BVFRSX1ZBTFVFIChpbnNuLCBDR0VOX0lOU05fTk9fRElTKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIENHRU5fRElTX0hBU0hfUCAoaW5zbik7Ci19Ci0KLSNpZm5kZWYgQ0dFTl9BU01fSEFTSAotI2RlZmluZSBDR0VOX0FTTV9IQVNIX1NJWkUgMTI3Ci0jaWZkZWYgQ0dFTl9NTkVNT05JQ19PUEVSQU5EUwotI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKQotI2Vsc2UKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSChtbmVtKSAoKih1bnNpZ25lZCBjaGFyICopIChtbmVtKSAlIENHRU5fQVNNX0hBU0hfU0laRSkgLypGSVhNRSovCi0jZW5kaWYKLSNlbmRpZgotCi0vKiBJdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZSB0byBwcm92aWRlIGEgZGVmYXVsdCBoZXJlLAotICAgYnV0IHdoaWxlIHRoaXMgaXMgdW5kZXIgZGV2ZWxvcG1lbnQgd2UgZG8uCi0gICBCVUZGRVIgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgotICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLwotCi0jaWZuZGVmIENHRU5fRElTX0hBU0gKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9TSVpFIDI1NgotI2RlZmluZSBDR0VOX0RJU19IQVNIKGJ1ZiwgdmFsdWUpICgqKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZikpCi0jZW5kaWYKLQotLyogVGhlIHJlc3VsdCBpcyB0aGUgaGFzaCB2YWx1ZSBvZiB0aGUgaW5zbi4KLSAgIFRhcmdldHMgYXJlIGZyZWUgdG8gb3ZlcnJpZGUgQ0dFTl97QVNNLERJU31fSEFTSCBpbiB0aGUgLm9wYyBmaWxlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotYXNtX2hhc2hfaW5zbiAobW5lbSkKLSAgICAgY29uc3QgY2hhciAqIG1uZW07Ci17Ci0gIHJldHVybiBDR0VOX0FTTV9IQVNIIChtbmVtKTsKLX0KLQotLyogQlVGIGlzIGEgcG9pbnRlciB0byB0aGUgYnl0ZXMgb2YgdGhlIGluc24sIHRhcmdldCBvcmRlci4KLSAgIFZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzIGFzIGFuIGludCBpbiBob3N0IG9yZGVyLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZGlzX2hhc2hfaW5zbiAoYnVmLCB2YWx1ZSkKLSAgICAgY29uc3QgY2hhciAqIGJ1ZjsKLSAgICAgQ0dFTl9JTlNOX0lOVCB2YWx1ZTsKLXsKLSAgcmV0dXJuIENHRU5fRElTX0hBU0ggKGJ1ZiwgdmFsdWUpOwotfQotCi0vKiBTZXQgdGhlIHJlY29yZGVkIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiB0aGUgQ0dFTl9GSUVMRFMgc3RydWN0LiAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9maWVsZHNfYml0c2l6ZSAoZmllbGRzLCBzaXplKQotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICBpbnQgc2l6ZTsKLXsKLSAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IHNpemU7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRvIGNhbGwgYmVmb3JlIHVzaW5nIHRoZSBvcGVyYW5kIGluc3RhbmNlIHRhYmxlLgotICAgVGhpcyBwbHVncyB0aGUgb3Bjb2RlIGVudHJpZXMgYW5kIG1hY3JvIGluc3RydWN0aW9ucyBpbnRvIHRoZSBjcHUgdGFibGUuICAqLwotCi12b2lkCi1mcjMwX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgaTsKLSAgaW50IG51bV9tYWNyb3MgPSAoc2l6ZW9mIChmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZSkgLwotCQkgICAgc2l6ZW9mIChmcjMwX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXSkpOwotICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgZnIzMF9jZ2VuX21hY3JvX2luc25fdGFibGVbMF07Ci0gIGNvbnN0IENHRU5fT1BDT0RFICpvYyA9ICYgZnIzMF9jZ2VuX21hY3JvX2luc25fb3Bjb2RlX3RhYmxlWzBdOwotICBDR0VOX0lOU04gKmluc25zID0gKENHRU5fSU5TTiAqKSB4bWFsbG9jIChudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgbWVtc2V0IChpbnNucywgMCwgbnVtX21hY3JvcyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fbWFjcm9zOyArK2kpCi0gICAgewotICAgICAgaW5zbnNbaV0uYmFzZSA9ICZpYltpXTsKLSAgICAgIGluc25zW2ldLm9wY29kZSA9ICZvY1tpXTsKLSAgICB9Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLmluaXRfZW50cmllcyA9IGluc25zOwotICBjZC0+bWFjcm9faW5zbl90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0lCQVNFKTsKLSAgY2QtPm1hY3JvX2luc25fdGFibGUubnVtX2luaXRfZW50cmllcyA9IG51bV9tYWNyb3M7Ci0KLSAgb2MgPSAmIGZyMzBfY2dlbl9pbnNuX29wY29kZV90YWJsZVswXTsKLSAgaW5zbnMgPSAoQ0dFTl9JTlNOICopIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllczsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQotICAgIGluc25zW2ldLm9wY29kZSA9ICZvY1tpXTsKLQotICBjZC0+c2l6ZW9mX2ZpZWxkcyA9IHNpemVvZiAoQ0dFTl9GSUVMRFMpOwotICBjZC0+c2V0X2ZpZWxkc19iaXRzaXplID0gc2V0X2ZpZWxkc19iaXRzaXplOwotCi0gIGNkLT5hc21faGFzaF9wID0gYXNtX2hhc2hfaW5zbl9wOwotICBjZC0+YXNtX2hhc2ggPSBhc21faGFzaF9pbnNuOwotICBjZC0+YXNtX2hhc2hfc2l6ZSA9IENHRU5fQVNNX0hBU0hfU0laRTsKLQotICBjZC0+ZGlzX2hhc2hfcCA9IGRpc19oYXNoX2luc25fcDsKLSAgY2QtPmRpc19oYXNoID0gZGlzX2hhc2hfaW5zbjsKLSAgY2QtPmRpc19oYXNoX3NpemUgPSBDR0VOX0RJU19IQVNIX1NJWkU7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL2ZyMzAtb3BjLmggYi9vcGNvZGVzL2ZyMzAtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODdlZDUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9mcjMwLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qIEluc3RydWN0aW9uIG9wY29kZSBoZWFkZXIgZm9yIGZyMzAuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpZm5kZWYgRlIzMF9PUENfSAotI2RlZmluZSBGUjMwX09QQ19ICi0KLS8qIC0tIG9wYy5oICovCi0KLS8qID8/PyBUaGlzIGNhbiBiZSBpbXByb3ZlZCB1cG9uLiAgKi8KLSN1bmRlZiBDR0VOX0RJU19IQVNIX1NJWkUKLSNkZWZpbmUgQ0dFTl9ESVNfSEFTSF9TSVpFIDE2Ci0jdW5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBDR0VOX0RJU19IQVNIKGJ1ZmZlciwgdmFsdWUpICgoKHVuc2lnbmVkIGNoYXIgKikgKGJ1ZmZlcikpWzBdID4+IDQpCi0KLS8qIC0tICovCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBmcjMwIGluc3RydWN0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fdHlwZSB7Ci0gIEZSMzBfSU5TTl9JTlZBTElELCBGUjMwX0lOU05fQURELCBGUjMwX0lOU05fQURESSwgRlIzMF9JTlNOX0FERDIKLSAsIEZSMzBfSU5TTl9BRERDLCBGUjMwX0lOU05fQURETiwgRlIzMF9JTlNOX0FERE5JLCBGUjMwX0lOU05fQURETjIKLSAsIEZSMzBfSU5TTl9TVUIsIEZSMzBfSU5TTl9TVUJDLCBGUjMwX0lOU05fU1VCTiwgRlIzMF9JTlNOX0NNUAotICwgRlIzMF9JTlNOX0NNUEksIEZSMzBfSU5TTl9DTVAyLCBGUjMwX0lOU05fQU5ELCBGUjMwX0lOU05fT1IKLSAsIEZSMzBfSU5TTl9FT1IsIEZSMzBfSU5TTl9BTkRNLCBGUjMwX0lOU05fQU5ESCwgRlIzMF9JTlNOX0FOREIKLSAsIEZSMzBfSU5TTl9PUk0sIEZSMzBfSU5TTl9PUkgsIEZSMzBfSU5TTl9PUkIsIEZSMzBfSU5TTl9FT1JNCi0gLCBGUjMwX0lOU05fRU9SSCwgRlIzMF9JTlNOX0VPUkIsIEZSMzBfSU5TTl9CQU5ETCwgRlIzMF9JTlNOX0JPUkwKLSAsIEZSMzBfSU5TTl9CRU9STCwgRlIzMF9JTlNOX0JBTkRILCBGUjMwX0lOU05fQk9SSCwgRlIzMF9JTlNOX0JFT1JICi0gLCBGUjMwX0lOU05fQlRTVEwsIEZSMzBfSU5TTl9CVFNUSCwgRlIzMF9JTlNOX01VTCwgRlIzMF9JTlNOX01VTFUKLSAsIEZSMzBfSU5TTl9NVUxILCBGUjMwX0lOU05fTVVMVUgsIEZSMzBfSU5TTl9ESVYwUywgRlIzMF9JTlNOX0RJVjBVCi0gLCBGUjMwX0lOU05fRElWMSwgRlIzMF9JTlNOX0RJVjIsIEZSMzBfSU5TTl9ESVYzLCBGUjMwX0lOU05fRElWNFMKLSAsIEZSMzBfSU5TTl9MU0wsIEZSMzBfSU5TTl9MU0xJLCBGUjMwX0lOU05fTFNMMiwgRlIzMF9JTlNOX0xTUgotICwgRlIzMF9JTlNOX0xTUkksIEZSMzBfSU5TTl9MU1IyLCBGUjMwX0lOU05fQVNSLCBGUjMwX0lOU05fQVNSSQotICwgRlIzMF9JTlNOX0FTUjIsIEZSMzBfSU5TTl9MREk4LCBGUjMwX0lOU05fTERJMjAsIEZSMzBfSU5TTl9MREkzMgotICwgRlIzMF9JTlNOX0xELCBGUjMwX0lOU05fTERVSCwgRlIzMF9JTlNOX0xEVUIsIEZSMzBfSU5TTl9MRFIxMwotICwgRlIzMF9JTlNOX0xEUjEzVUgsIEZSMzBfSU5TTl9MRFIxM1VCLCBGUjMwX0lOU05fTERSMTQsIEZSMzBfSU5TTl9MRFIxNFVICi0gLCBGUjMwX0lOU05fTERSMTRVQiwgRlIzMF9JTlNOX0xEUjE1LCBGUjMwX0lOU05fTERSMTVHUiwgRlIzMF9JTlNOX0xEUjE1RFIKLSAsIEZSMzBfSU5TTl9MRFIxNVBTLCBGUjMwX0lOU05fU1QsIEZSMzBfSU5TTl9TVEgsIEZSMzBfSU5TTl9TVEIKLSAsIEZSMzBfSU5TTl9TVFIxMywgRlIzMF9JTlNOX1NUUjEzSCwgRlIzMF9JTlNOX1NUUjEzQiwgRlIzMF9JTlNOX1NUUjE0Ci0gLCBGUjMwX0lOU05fU1RSMTRILCBGUjMwX0lOU05fU1RSMTRCLCBGUjMwX0lOU05fU1RSMTUsIEZSMzBfSU5TTl9TVFIxNUdSCi0gLCBGUjMwX0lOU05fU1RSMTVEUiwgRlIzMF9JTlNOX1NUUjE1UFMsIEZSMzBfSU5TTl9NT1YsIEZSMzBfSU5TTl9NT1ZEUgotICwgRlIzMF9JTlNOX01PVlBTLCBGUjMwX0lOU05fTU9WMkRSLCBGUjMwX0lOU05fTU9WMlBTLCBGUjMwX0lOU05fSk1QCi0gLCBGUjMwX0lOU05fSk1QRCwgRlIzMF9JTlNOX0NBTExSLCBGUjMwX0lOU05fQ0FMTFJELCBGUjMwX0lOU05fQ0FMTAotICwgRlIzMF9JTlNOX0NBTExELCBGUjMwX0lOU05fUkVULCBGUjMwX0lOU05fUkVUX0QsIEZSMzBfSU5TTl9JTlQKLSAsIEZSMzBfSU5TTl9JTlRFLCBGUjMwX0lOU05fUkVUSSwgRlIzMF9JTlNOX0JSQUQsIEZSMzBfSU5TTl9CUkEKLSAsIEZSMzBfSU5TTl9CTk9ELCBGUjMwX0lOU05fQk5PLCBGUjMwX0lOU05fQkVRRCwgRlIzMF9JTlNOX0JFUQotICwgRlIzMF9JTlNOX0JORUQsIEZSMzBfSU5TTl9CTkUsIEZSMzBfSU5TTl9CQ0QsIEZSMzBfSU5TTl9CQwotICwgRlIzMF9JTlNOX0JOQ0QsIEZSMzBfSU5TTl9CTkMsIEZSMzBfSU5TTl9CTkQsIEZSMzBfSU5TTl9CTgotICwgRlIzMF9JTlNOX0JQRCwgRlIzMF9JTlNOX0JQLCBGUjMwX0lOU05fQlZELCBGUjMwX0lOU05fQlYKLSAsIEZSMzBfSU5TTl9CTlZELCBGUjMwX0lOU05fQk5WLCBGUjMwX0lOU05fQkxURCwgRlIzMF9JTlNOX0JMVAotICwgRlIzMF9JTlNOX0JHRUQsIEZSMzBfSU5TTl9CR0UsIEZSMzBfSU5TTl9CTEVELCBGUjMwX0lOU05fQkxFCi0gLCBGUjMwX0lOU05fQkdURCwgRlIzMF9JTlNOX0JHVCwgRlIzMF9JTlNOX0JMU0QsIEZSMzBfSU5TTl9CTFMKLSAsIEZSMzBfSU5TTl9CSElELCBGUjMwX0lOU05fQkhJLCBGUjMwX0lOU05fRE1PVlIxMywgRlIzMF9JTlNOX0RNT1ZSMTNICi0gLCBGUjMwX0lOU05fRE1PVlIxM0IsIEZSMzBfSU5TTl9ETU9WUjEzUEksIEZSMzBfSU5TTl9ETU9WUjEzUElILCBGUjMwX0lOU05fRE1PVlIxM1BJQgotICwgRlIzMF9JTlNOX0RNT1ZSMTVQSSwgRlIzMF9JTlNOX0RNT1YyUjEzLCBGUjMwX0lOU05fRE1PVjJSMTNILCBGUjMwX0lOU05fRE1PVjJSMTNCCi0gLCBGUjMwX0lOU05fRE1PVjJSMTNQSSwgRlIzMF9JTlNOX0RNT1YyUjEzUElILCBGUjMwX0lOU05fRE1PVjJSMTNQSUIsIEZSMzBfSU5TTl9ETU9WMlIxNVBECi0gLCBGUjMwX0lOU05fTERSRVMsIEZSMzBfSU5TTl9TVFJFUywgRlIzMF9JTlNOX0NPUE9QLCBGUjMwX0lOU05fQ09QTEQKLSAsIEZSMzBfSU5TTl9DT1BTVCwgRlIzMF9JTlNOX0NPUFNWLCBGUjMwX0lOU05fTk9QLCBGUjMwX0lOU05fQU5EQ0NSCi0gLCBGUjMwX0lOU05fT1JDQ1IsIEZSMzBfSU5TTl9TVElMTSwgRlIzMF9JTlNOX0FERFNQLCBGUjMwX0lOU05fRVhUU0IKLSAsIEZSMzBfSU5TTl9FWFRVQiwgRlIzMF9JTlNOX0VYVFNILCBGUjMwX0lOU05fRVhUVUgsIEZSMzBfSU5TTl9MRE0wCi0gLCBGUjMwX0lOU05fTERNMSwgRlIzMF9JTlNOX1NUTTAsIEZSMzBfSU5TTl9TVE0xLCBGUjMwX0lOU05fRU5URVIKLSAsIEZSMzBfSU5TTl9MRUFWRSwgRlIzMF9JTlNOX1hDSEIsIEZSMzBfSU5TTl9NQVgKLX0gQ0dFTl9JTlNOX1RZUEU7Ci0KLS8qIEluZGV4IG9mIGBpbnZhbGlkJyBpbnNuIHBsYWNlIGhvbGRlci4gICovCi0jZGVmaW5lIENHRU5fSU5TTl9JTlZBTElEIEZSMzBfSU5TTl9JTlZBTElECi0KLS8qIFRvdGFsIG51bWJlciBvZiBpbnNucyBpbiB0YWJsZS4gICovCi0jZGVmaW5lIE1BWF9JTlNOUyAoKGludCkgRlIzMF9JTlNOX01BWCkKLQotLyogVGhpcyBzdHJ1Y3QgcmVjb3JkcyBkYXRhIHByaW9yIHRvIGluc2VydGlvbiBvciBhZnRlciBleHRyYWN0aW9uLiAgKi8KLXN0cnVjdCBjZ2VuX2ZpZWxkcwotewotICBpbnQgbGVuZ3RoOwotICBsb25nIGZfbmlsOwotICBsb25nIGZfb3AxOwotICBsb25nIGZfb3AyOwotICBsb25nIGZfb3AzOwotICBsb25nIGZfb3A0OwotICBsb25nIGZfb3A1OwotICBsb25nIGZfY2M7Ci0gIGxvbmcgZl9jY2M7Ci0gIGxvbmcgZl9SajsKLSAgbG9uZyBmX1JpOwotICBsb25nIGZfUnMxOwotICBsb25nIGZfUnMyOwotICBsb25nIGZfUmpjOwotICBsb25nIGZfUmljOwotICBsb25nIGZfQ1JqOwotICBsb25nIGZfQ1JpOwotICBsb25nIGZfdTQ7Ci0gIGxvbmcgZl91NGM7Ci0gIGxvbmcgZl9pNDsKLSAgbG9uZyBmX200OwotICBsb25nIGZfdTg7Ci0gIGxvbmcgZl9pODsKLSAgbG9uZyBmX2kyMF80OwotICBsb25nIGZfaTIwXzE2OwotICBsb25nIGZfaTIwOwotICBsb25nIGZfaTMyOwotICBsb25nIGZfdWRpc3A2OwotICBsb25nIGZfZGlzcDg7Ci0gIGxvbmcgZl9kaXNwOTsKLSAgbG9uZyBmX2Rpc3AxMDsKLSAgbG9uZyBmX3MxMDsKLSAgbG9uZyBmX3UxMDsKLSAgbG9uZyBmX3JlbDk7Ci0gIGxvbmcgZl9kaXI4OwotICBsb25nIGZfZGlyOTsKLSAgbG9uZyBmX2RpcjEwOwotICBsb25nIGZfcmVsMTI7Ci0gIGxvbmcgZl9yZWdsaXN0X2hpX3N0OwotICBsb25nIGZfcmVnbGlzdF9sb3dfc3Q7Ci0gIGxvbmcgZl9yZWdsaXN0X2hpX2xkOwotICBsb25nIGZfcmVnbGlzdF9sb3dfbGQ7Ci19OwotCi0jZGVmaW5lIENHRU5fSU5JVF9QQVJTRShvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX0lOU0VSVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX0VYVFJBQ1Qob2QpIFwKLXtcCi19Ci0jZGVmaW5lIENHRU5fSU5JVF9QUklOVChvZCkgXAote1wKLX0KLQotCi0jZW5kaWYgLyogRlIzMF9PUENfSCAqLwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9oODMwMC1kaXMuYyBiL29wY29kZXMvaDgzMDAtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NzUzYTkuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9oODMwMC1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBoODMwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTMsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0KLSNkZWZpbmUgaDhfb3Bjb2RlcyBoOG9wcwotI2luY2x1ZGUgIm9wY29kZS9oODMwMC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotCi0vKiBSdW4gdGhyb3VnaCB0aGUgb3Bjb2RlcyBhbmQgc29ydCB0aGVtIGludG8gb3JkZXIgdG8gbWFrZSB0aGVtIGVhc3kKLSAgIHRvIGRpc2Fzc2VtYmxlCi0gKi8KLXN0YXRpYyB2b2lkCi1iZmRfaDhfZGlzYXNzZW1ibGVfaW5pdCAoKQotewotICB1bnNpZ25lZCBpbnQgaTsKLQotCi0gIHN0cnVjdCBoOF9vcGNvZGUgKnA7Ci0KLSAgZm9yIChwID0gaDhfb3Bjb2RlczsgcC0+bmFtZTsgcCsrKQotICAgIHsKLSAgICAgIGludCBuMSA9IDA7Ci0gICAgICBpbnQgbjIgPSAwOwotCi0gICAgICBpZiAoKGludCkgcC0+ZGF0YS5uaWJbMF0gPCAxNikKLQl7Ci0JICBuMSA9IChpbnQpIHAtPmRhdGEubmliWzBdOwotCX0KLSAgICAgIGVsc2UKLQluMSA9IDA7Ci0gICAgICBpZiAoKGludCkgcC0+ZGF0YS5uaWJbMV0gPCAxNikKLQl7Ci0JICBuMiA9IChpbnQpIHAtPmRhdGEubmliWzFdOwotCX0KLSAgICAgIGVsc2UKLQluMiA9IDA7Ci0KLSAgICAgIC8qIEp1c3QgbWFrZSBzdXJlIHRoZXJlIGFyZSBhbiBldmVuIG51bWJlciBvZiBuaWJibGVzIGluIGl0LCBhbmQKLQkgdGhhdCB0aGUgY291bnQgaXMgdGhlIHNhbWUgcyB0aGUgbGVuZ3RoICovCi0gICAgICBmb3IgKGkgPSAwOyBwLT5kYXRhLm5pYltpXSAhPSBFOyBpKyspCi0JLypFTVBUWSovIDsKLSAgICAgIGlmIChpICYgMSkKLQlhYm9ydCAoKTsKLSAgICAgIHAtPmxlbmd0aCA9IGkgLyAyOwotICAgIH0KLQotfQotCi0KLXVuc2lnbmVkIGludAotYmZkX2g4X2Rpc2Fzc2VtYmxlIChhZGRyLCBpbmZvLCBtb2RlKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGludCBtb2RlOwotewotICAvKiBGaW5kIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgdGFibGUgZm9yIHRoaXMgb3Bjb2RlICovCi0gIHN0YXRpYyBDT05TVCBjaGFyICpyZWduYW1lc1tdID0KLSAgICB7Ci0gICAgICAicjBoIiwgInIxaCIsICJyMmgiLCAicjNoIiwgInI0aCIsICJyNWgiLCAicjZoIiwgInI3aCIsCi0gICAgICAicjBsIiwgInIxbCIsICJyMmwiLCAicjNsIiwgInI0bCIsICJyNWwiLCAicjZsIiwgInI3bCJ9OwotICAKLSAgc3RhdGljIENPTlNUIGNoYXIgKndyZWduYW1lc1tdID0KLSAgICB7Ci0gICAgICAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLCAicjUiLCAicjYiLCAicjciLAotICAgICAgImUwIiwgImUxIiwgImUyIiwgImUzIiwgImU0IiwgImU1IiwgImU2IiwgImU3IgotICAgICAgfTsKLSAgCi0gIHN0YXRpYyBDT05TVCBjaGFyICpscmVnbmFtZXNbXSA9Ci0gICAgewotICAgICAgImVyMCIsICJlcjEiLCAiZXIyIiwgImVyMyIsICJlcjQiLCAiZXI1IiwgImVyNiIsICJlcjciLAotICAgICAgImVyMCIsICJlcjEiLCAiZXIyIiwgImVyMyIsICJlcjQiLCAiZXI1IiwgImVyNiIsICJlcjciCi0gICAgICB9Ci0gIDsKLQotICBpbnQgcnMgPSAwOwotICBpbnQgcmQgPSAwOwotICBpbnQgcmRpc3AgPSAwOwotICBpbnQgYWJzID0gMDsKLSAgaW50IGJpdCA9IDA7Ci0gIGludCBwbGVuID0gMDsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdCA9IDA7Ci0gIHN0cnVjdCBoOF9vcGNvZGUgKnEgPSBoOF9vcGNvZGVzOwotICBjaGFyIENPTlNUICoqcHJlZ25hbWVzID0gbW9kZSAhPSAwID8gbHJlZ25hbWVzIDogd3JlZ25hbWVzOwotICBpbnQgc3RhdHVzOwotICBpbnQgbDsKLSAgCi0gIHVuc2lnbmVkIGNoYXIgZGF0YVsyMF07ICAKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlIGZwcmludGYgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0KLSAgaWYgKCFpbml0KQotICAgIHsKLSAgICAgIGJmZF9oOF9kaXNhc3NlbWJsZV9pbml0ICgpOwotICAgICAgaW5pdCA9IDE7Ci0gICAgfQotCi0gIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMoYWRkciwgZGF0YSwgMiwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkgCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMoc3RhdHVzLCBhZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIGZvciAobCA9IDI7IHN0YXR1cyA9PSAwICYmIGwgPCAxMDsgbCs9MikKLSAgICB7Ci0gICAgICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jKGFkZHIrbCwgZGF0YStsLCAyLCBpbmZvKTsKLSAgICB9Ci0gIAotICAKLQotICAvKiBGaW5kIHRoZSBleGFjdCBvcGNvZGUvYXJnIGNvbWJvICovCi0gIHdoaWxlIChxLT5uYW1lKQotICAgIHsKLSAgICAgIG9wX3R5cGUgKm5pYjsKLSAgICAgIHVuc2lnbmVkIGludCBsZW4gPSAwOwotCi0gICAgICBuaWIgPSBxLT5kYXRhLm5pYjsKLSAgICAgIAotICAgICAgd2hpbGUgKDEpCi0JewotCSAgb3BfdHlwZSBsb29raW5nX2ZvciA9ICpuaWI7Ci0JICBpbnQgdGhpc25pYiA9IGRhdGFbbGVuID4+IDFdOwotCSAgCi0JICB0aGlzbmliID0gKGxlbiAmIDEpID8gKHRoaXNuaWIgJiAweGYpIDogKCh0aGlzbmliID4+IDQpICYgMHhmKTsKLQkgIAotCSAgaWYgKGxvb2tpbmdfZm9yIDwgMTYgJiYgbG9va2luZ19mb3IgPj0wKSAKLQkgICAgewotCSAgICAgIAotCSAgICAgIGlmIChsb29raW5nX2ZvciAhPSB0aGlzbmliKSAKLQkJZ290byBmYWlsOwotCSAgICB9Ci0JICAKLQkgIGVsc2UgCi0JICAgIHsKLQkgICAgICAKLQkgICAgICBpZiAoKGludCkgbG9va2luZ19mb3IgJiAoaW50KSBCMzEpCi0JCXsKLQkJICBpZiAoISAoKChpbnQpIHRoaXNuaWIgJiAweDgpICE9IDApKSAKLQkJICAgIGdvdG8gZmFpbDsKLQkJICBsb29raW5nX2ZvciA9IChvcF90eXBlKSAoKGludCkgbG9va2luZ19mb3IgJiB+KGludCkgQjMxKTsKLQkJfQotCSAgICAgIGlmICgoaW50KSBsb29raW5nX2ZvciAmIChpbnQpIEIzMCkKLQkJewotCQkgIGlmICghKCgoaW50KSB0aGlzbmliICYgMHg4KSA9PSAwKSkgCi0JCSAgICBnb3RvIGZhaWw7Ci0JCSAgbG9va2luZ19mb3IgPSAob3BfdHlwZSkgKChpbnQpIGxvb2tpbmdfZm9yICYgfihpbnQpIEIzMCk7Ci0JCX0KLQotCSAgICAgIGlmIChsb29raW5nX2ZvciAmIERCSVQpCi0JCXsKLQkJICBpZiAoKGxvb2tpbmdfZm9yICYgNSkgIT0gKHRoaXNuaWIgJjUpKSBnb3RvIGZhaWw7Ci0JCSAgYWJzID0gKHRoaXNuaWIgJiAweDgpID8gMiA6IDE7Ci0JCX0JCSAgCi0JICAgICAgCi0JICAgICAgZWxzZSAgaWYgKGxvb2tpbmdfZm9yICYgKFJFRyB8IElORHxJTkN8REVDKSkKLQkJewotCQkgIGlmIChsb29raW5nX2ZvciAmIFNSQykKLQkJICAgIHsKLQkJICAgICAgcnMgPSB0aGlzbmliOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgcmQgPSB0aGlzbmliOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzE2KQotCQl7Ci0JCSAgYWJzID0gKGRhdGFbbGVuID4+IDFdKSAqIDI1NiArIGRhdGFbKGxlbiArIDIpID4+IDFdOwotCQkgIHBsZW4gPSAxNjsKLQkgICAgICAKLQkJfQotCSAgICAgIGVsc2UgaWYobG9va2luZ19mb3IgJiBBQlNKTVApCi0JCXsKLQkJICBhYnMgPQotCQkgICAgKGRhdGFbMV0gPDwgMTYpCi0JCSAgICAgIHwgKGRhdGFbMl0gPDwgOCkKLQkJCXwgKGRhdGFbM10pOwotCQl9Ci0JICAgICAgZWxzZSBpZihsb29raW5nX2ZvciAmIE1FTUlORCkKLQkJewotCQkgIGFicyA9IGRhdGFbMV07Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMzIpCi0JCXsKLQkJICBpbnQgaSA9IGxlbiA+PiAxOwotCQkgIGFicyA9IChkYXRhW2ldIDw8IDI0KQotCQkgICAgfCAoZGF0YVtpICsgMV0gPDwgMTYpCi0JCSAgICAgIHwgKGRhdGFbaSArIDJdIDw8IDgpCi0JCQl8IChkYXRhW2krIDNdKTsKLQotCQkgIHBsZW4gPTMyOwotCSAgICAgIAotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzI0KQotCQl7Ci0JCSAgaW50IGkgPSBsZW4gPj4gMTsKLQkJICBhYnMgPSAoZGF0YVtpXSA8PCAxNikgfCAoZGF0YVtpICsgMV0gPDwgOCl8ICAoZGF0YVtpKzJdKTsKLQkJICBwbGVuID0yNDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKGxvb2tpbmdfZm9yICYgSUdOT1JFKQotCQl7Ci0JCSAgCi0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIERJU1BSRUcpCi0JCXsKLQkJICByZGlzcCA9IHRoaXNuaWI7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIEtCSVQpCi0JCXsKLQkJICBzd2l0Y2ggKHRoaXNuaWIpIAotCQkgICAgewotCQkgICAgY2FzZSA5OgotCQkgICAgICBhYnMgPSA0OwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgODoKLQkJICAgICAgYWJzID0gMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDA6Ci0JCSAgICAgIGFicyA9IDE7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgZGVmYXVsdDoKLQkJICAgICAgZ290byBmYWlsOwotCQkgICAgfQotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgJiBMXzgpCi0JCXsKLQkJICBwbGVuID0gODsJCSAgCi0JCSAgYWJzID0gZGF0YVtsZW4gPj4gMV07Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMykKLQkJewotCQkgIGJpdCA9IHRoaXNuaWIgJiAweDc7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIExfMikKLQkJewotCQkgIHBsZW4gPSAyOwotCQkgIGFicyA9IHRoaXNuaWIgJiAweDM7Ci0JCX0KLQkgICAgICBlbHNlIGlmIChsb29raW5nX2ZvciAmIE1BQ1JFRykKLQkJewotCQkgIGFicyA9ICh0aGlzbmliID09IDMpOwotCQl9Ci0JICAgICAgZWxzZSBpZiAobG9va2luZ19mb3IgPT0gRSkKLQkJewotCi0JCSAgewotCQkgICAgaW50IGk7Ci0KLQkJICAgIGZvciAoaSA9IDA7IGkgPCBxLT5sZW5ndGg7IGkrKykKLQkJICAgICAgewotCQkJZnByaW50ZiAoc3RyZWFtLCAiJTAyeCAiLCBkYXRhW2ldKTsKLQkJICAgICAgfQotCQkgICAgZm9yICg7IGkgPCA2OyBpKyspCi0JCSAgICAgIHsKLQkJCWZwcmludGYgKHN0cmVhbSwgIiAgICIpOwotCQkgICAgICB9Ci0JCSAgfQotCQkgIGZwcmludGYgKHN0cmVhbSwgIiVzXHQiLCBxLT5uYW1lKTsKLQotCQkgIC8qIEdyb3NzLiAgRGlzZ3VzdGluZy4gICovCi0JCSAgaWYgKHN0cmNtcCAocS0+bmFtZSwgImxkbS5sIikgPT0gMCkKLQkJICAgIHsKLQkJICAgICAgaW50IGNvdW50LCBoaWdoOwotCi0JCSAgICAgIGNvdW50ID0gKGRhdGFbMV0gPj4gNCkgJiAweDM7Ci0JCSAgICAgIGhpZ2ggPSBkYXRhWzNdICYgMHg3OwotCi0JCSAgICAgIGZwcmludGYgKHN0cmVhbSwgIkBzcCssZXIlZC1lciVkIiwgaGlnaCAtIGNvdW50LCBoaWdoKTsKLQkJICAgICAgcmV0dXJuIHEtPmxlbmd0aDsKLQkJICAgIH0KLQotCQkgIGlmIChzdHJjbXAgKHEtPm5hbWUsICJzdG0ubCIpID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGludCBjb3VudCwgbG93OwotCi0JCSAgICAgIGNvdW50ID0gKGRhdGFbMV0gPj4gNCkgJiAweDM7Ci0JCSAgICAgIGxvdyA9IGRhdGFbM10gJiAweDc7Ci0KLQkJICAgICAgZnByaW50ZiAoc3RyZWFtLCAiZXIlZC1lciVkLEAtc3AiLCBsb3csIGxvdyArIGNvdW50KTsKLQkJICAgICAgcmV0dXJuIHEtPmxlbmd0aDsKLQkJICAgIH0KLQotCQkgIC8qIEZpbGwgaW4gdGhlIGFyZ3MgKi8KLQkJICB7Ci0JCSAgICBvcF90eXBlICphcmdzID0gcS0+YXJncy5uaWI7Ci0JCSAgICBpbnQgaGFkb25lID0gMDsKLQotCi0JCSAgICB3aGlsZSAoKmFyZ3MgIT0gRSkKLQkJICAgICAgewotCQkJaW50IHggPSAqYXJnczsKLQkJCWlmIChoYWRvbmUpCi0JCQkgIGZwcmludGYgKHN0cmVhbSwgIiwiKTsKLQotCi0JCQlpZiAoeCAmIExfMykKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIiMweCV4IiwgKHVuc2lnbmVkKSBiaXQpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgKElNTXxLQklUfERCSVQpKQotCQkJICB7Ci0JCQkgICAgLyogQmxldGNoLiAgRm9yIHNoYWwgIzIsZXIwIGFuZCBmcmllbmRzLiAgKi8KLQkJCSAgICBpZiAoKihhcmdzKzEpICYgU1JDX0lOX0RTVCkKLQkJCSAgICAgIGFicyA9IDI7Ci0KLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICIjMHgleCIsICh1bnNpZ25lZCkgYWJzKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIFJFRykKLQkJCSAgewotCQkJICAgIGludCBybiA9ICh4ICYgRFNUKSA/IHJkIDogcnM7Ci0JCQkgICAgc3dpdGNoICh4ICYgU0laRSkKLQkJCSAgICAgIHsKLQkJCSAgICAgIGNhc2UgTF84OgotCQkJCWZwcmludGYgKHN0cmVhbSwgIiVzIiwgcmVnbmFtZXNbcm5dKTsKLQkJCQlicmVhazsKLQkJCSAgICAgIGNhc2UgTF8xNjoKLQkJCQlmcHJpbnRmIChzdHJlYW0sICIlcyIsIHdyZWduYW1lc1tybl0pOwotCQkJCWJyZWFrOwotCQkJICAgICAgY2FzZSBMX1A6Ci0JCQkgICAgICBjYXNlIExfMzI6Ci0JCQkJZnByaW50ZiAoc3RyZWFtLCAiJXMiLCBscmVnbmFtZXNbcm5dKTsKLQkJCQlicmVhazsKLQkJICAgIAotCQkJICAgICAgfQotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgTUFDUkVHKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAibWFjJWMiLCBhYnMgPyAnbCcgOiAnaCcpOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgSU5DKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQCVzKyIsIHByZWduYW1lc1tyc10pOwotCQkJICB9Ci0JCQllbHNlIGlmICh4ICYgREVDKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQC0lcyIsIHByZWduYW1lc1tyZF0pOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiBJTkQpCi0JCQkgIHsKLQkJCSAgICBpbnQgcm4gPSAoeCAmIERTVCkgPyByZCA6IHJzOwotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkAlcyIsIHByZWduYW1lc1tybl0pOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiBBQlM4TUVNKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQDB4JXg6OCIsICh1bnNpZ25lZCkgYWJzKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgKEFCU3xBQlNKTVApKQotCQkJICB7Ci0JCQkgICAgZnByaW50ZiAoc3RyZWFtLCAiQDB4JXg6JWQiLCAodW5zaWduZWQpIGFicywgcGxlbik7Ci0JCQkgIH0KLQotCQkJZWxzZSBpZiAoeCAmIE1FTUlORCkKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgIkBAJWQgKCV4KSIsIGFicywgYWJzKTsKLQkJCSAgfQotCi0JCQllbHNlIGlmICh4ICYgUENSRUwpCi0JCQkgIHsKLQkJCSAgICBpZiAoeCAmIExfMTYpIAotCQkJICAgICAgewotCQkJCWFicyAgKz0yOwotCQkJCWZwcmludGYgKHN0cmVhbSwgIi4lcyVkICgleCkiLCAoc2hvcnQpIGFicyA+IDAgPyAiKyIgOiAiIiwgKHNob3J0KSBhYnMsCi0JCQkJCSBhZGRyICsgKHNob3J0KSBhYnMgKyAyKTsKLQkJCSAgICAgIH0KLQkJCSAgICBlbHNlIHsKLQkJCSAgICAgIGZwcmludGYgKHN0cmVhbSwgIi4lcyVkICgleCkiLCAoY2hhcikgYWJzID4gMCA/ICIrIiA6ICIiLCAoY2hhcikgYWJzLAotCQkJCSAgICAgICBhZGRyICsgKGNoYXIpIGFicyArIDIpOwotCQkJICAgIH0KLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIERJU1ApCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJAKDB4JXg6JWQsJXMpIiwgYWJzLHBsZW4sIHByZWduYW1lc1tyZGlzcF0pOwotCQkJICB9Ci0KLQkJCWVsc2UgaWYgKHggJiBDQ1IpCi0JCQkgIHsKLQkJCSAgICBmcHJpbnRmIChzdHJlYW0sICJjY3IiKTsKLQkJCSAgfQotCQkJZWxzZSBpZiAoeCAmIEVYUikKLQkJCSAgewotCQkJICAgIGZwcmludGYgKHN0cmVhbSwgImV4ciIpOwotCQkJICB9Ci0JCQllbHNlCi0JCQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkgIGZwcmludGYgKHN0cmVhbSwgXygiSG1tbW0gJXgiKSwgeCk7Ci0JCQloYWRvbmUgPSAxOwotCQkJYXJncysrOwotCQkgICAgICB9Ci0JCSAgfQotCQkgIHJldHVybiBxLT5sZW5ndGg7Ci0JCX0KLQotICAgICAgCi0JICAgICAgZWxzZQotCQl7Ci0JCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJICBmcHJpbnRmIChzdHJlYW0sIF8oIkRvbid0IHVuZGVyc3RhbmQgJXggXG4iKSwgbG9va2luZ19mb3IpOwotCQl9Ci0JICAgIH0KLQkgIAotCSAgbGVuKys7Ci0JICBuaWIrKzsKLQl9Ci0gICAgICAKLSAgICBmYWlsOgotICAgICAgcSsrOwotICAgIH0KLQotICAvKiBGZWxsIG9mIHRoZSBlbmQgKi8KLSAgZnByaW50ZiAoc3RyZWFtLCAiJTAyeCAlMDJ4ICAgICAgICAud29yZFx0SCcleCxIJyV4IiwKLQkgICBkYXRhWzBdLCBkYXRhWzFdLAotCSAgIGRhdGFbMF0sIGRhdGFbMV0pOwotICByZXR1cm4gMjsKLX0KLQotaW50IAotcHJpbnRfaW5zbl9oODMwMCAoYWRkciwgaW5mbykKLWJmZF92bWEgYWRkcjsgCi1kaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gYmZkX2g4X2Rpc2Fzc2VtYmxlIChhZGRyLCBpbmZvICwgMCk7Ci19Ci0KLWludCAKLXByaW50X2luc25faDgzMDBoIChhZGRyLCBpbmZvKQotYmZkX3ZtYSBhZGRyOwotZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmV0dXJuIGJmZF9oOF9kaXNhc3NlbWJsZSAoYWRkciwgaW5mbyAsIDEpOwotfQotCi1pbnQgCi1wcmludF9pbnNuX2g4MzAwcyAoYWRkciwgaW5mbykKLWJmZF92bWEgYWRkcjsKLWRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBiZmRfaDhfZGlzYXNzZW1ibGUgKGFkZHIsIGluZm8gLCAyKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaDg1MDAtZGlzLmMgYi9vcGNvZGVzL2g4NTAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjg1OGM5Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvaDg1MDAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgaDg1MDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIERJU0FTU0VNQkxFUl9UQUJMRQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2luY2x1ZGUgImg4NTAwLW9wYy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogTWF4aW11bSBsZW5ndGggb2YgYW4gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNQVhMRU4gOAotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLXN0cnVjdCBwcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKSBpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGNoYXIgKmNybmFtZVtdID0KLXsic3IiLCAiY2NyIiwgIioiLCAiYnIiLCAiZXAiLCAiZHAiLCAiKiIsICJ0cCJ9OwotCi1pbnQKLXByaW50X2luc25faDg1MDAgKGFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaDg1MDBfb3Bjb2RlX2luZm8gKm9wY29kZTsKLSAgdm9pZCAqc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHJpbnRmX2Z0eXBlIGZ1bmMgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0KLSAgc3RydWN0IHByaXZhdGUgcHJpdjsKLSAgYmZkX2J5dGUgKmJ1ZmZlciA9IHByaXYudGhlX2J1ZmZlcjsKLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmIHByaXY7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IGFkZHI7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotaWYgKDApICB7Ci0gICAgc3RhdGljICAgIGludCBvbmU7Ci0gICAgaWYgKCFvbmUgKSAKLSAgICAgIHsKLQlvbmUgPSAxOwotCWZvciAob3Bjb2RlID0gaDg1MDBfdGFibGU7IG9wY29kZS0+bmFtZTsgb3Bjb2RlKyspCi0JICB7Ci0JICAgIGlmICgob3Bjb2RlLT5ieXRlc1swXS5jb250ZW50cyAmIDB4OCkgPT0gMCkKLQkgICAgICBwcmludGYoIiVzXG4iLCBvcGNvZGUtPm5hbWUpOwotCSAgfQotICAgICAgfQotICB9Ci0KLQotICAvKiBSdW4gZG93biB0aGUgdGFibGUgdG8gZmluZCB0aGUgb25lIHdoaWNoIG1hdGNoZXMgKi8KLSAgZm9yIChvcGNvZGUgPSBoODUwMF90YWJsZTsgb3Bjb2RlLT5uYW1lOyBvcGNvZGUrKykKLSAgICB7Ci0gICAgICBpbnQgYnl0ZTsKLSAgICAgIGludCBybiA9IDA7Ci0gICAgICBpbnQgcmQgPSAwOwotICAgICAgaW50IHJzID0gMDsKLSAgICAgIGludCBkaXNwID0gMDsKLSAgICAgIGludCBhYnMgPSAwOwotICAgICAgaW50IGltbSA9IDA7Ci0gICAgICBpbnQgcGNyZWwgPSAwOwotICAgICAgaW50IHFpbSA9IDA7Ci0gICAgICBpbnQgaTsKLSAgICAgIGludCBjciA9IDA7Ci0gICAgICBmb3IgKGJ5dGUgPSAwOyBieXRlIDwgb3Bjb2RlLT5sZW5ndGg7IGJ5dGUrKykKLQl7Ci0JICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMSk7Ci0JICBpZiAoKGJ1ZmZlcltieXRlXSAmIG9wY29kZS0+Ynl0ZXNbYnl0ZV0ubWFzaykKLQkgICAgICAhPSAob3Bjb2RlLT5ieXRlc1tieXRlXS5jb250ZW50cykpCi0JICAgIHsKLQkgICAgICBnb3RvIG5leHQ7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIGV4dHJhY3QgYW55IGluZm8gcGFydHMgKi8KLQkgICAgICBzd2l0Y2ggKG9wY29kZS0+Ynl0ZXNbYnl0ZV0uaW5zZXJ0KQotCQl7Ci0JCWNhc2UgMDoKLQkJY2FzZSBGUDoKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkgIGZ1bmMgKHN0cmVhbSwgXygiY2FuJ3QgY29wZSB3aXRoIGluc2VydCAlZFxuIiksCi0JCQlvcGNvZGUtPmJ5dGVzW2J5dGVdLmluc2VydCk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUk46Ci0JCSAgcm4gPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUlM6Ci0JCSAgcnMgPSBidWZmZXJbYnl0ZV0gJiAweDc7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgQ1JCOgotCQkgIGNyID0gYnVmZmVyW2J5dGVdICYgMHg3OwotCQkgIGlmIChjciA9PSAwKQotCQkgICAgZ290byBuZXh0OwotCQkgIGJyZWFrOwotCQljYXNlIENSVzoKLQkJICBjciA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBpZiAoY3IgIT0gMCkKLQkJICAgIGdvdG8gbmV4dDsKLQkJICBicmVhazsKLQkJY2FzZSBESVNQMTY6Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgYnl0ZSArIDIpOwotCQkgIGRpc3AgPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIEZQSU5EX0Q4OgotCQljYXNlIERJU1A4OgotCQkgIGRpc3AgPSAoKGNoYXIpIChidWZmZXJbYnl0ZV0pKTsKLQkJICBicmVhazsKLQkJY2FzZSBSRDoKLQkJY2FzZSBSRElORDoKLQkJICByZCA9IGJ1ZmZlcltieXRlXSAmIDB4NzsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMyNDoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMyk7Ci0JCSAgYWJzID0KLQkJICAgIChidWZmZXJbYnl0ZV0gPDwgMTYpCi0JCSAgICB8IChidWZmZXJbYnl0ZSArIDFdIDw8IDgpCi0JCSAgICB8IChidWZmZXJbYnl0ZSArIDJdKTsKLQkJICBicmVhazsKLQkJY2FzZSBBQlMxNjoKLQkJICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBieXRlICsgMik7Ci0JCSAgYWJzID0gKGJ1ZmZlcltieXRlXSA8PCA4KSB8IChidWZmZXJbYnl0ZSArIDFdKTsKLQkJICBicmVhazsKLQkJY2FzZSBBQlM4OgotCQkgIGFicyA9IChidWZmZXJbYnl0ZV0pOwotCQkgIGJyZWFrOwotCQljYXNlIElNTTE2OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKLQkJICBpbW0gPSAoYnVmZmVyW2J5dGVdIDw8IDgpIHwgKGJ1ZmZlcltieXRlICsgMV0pOwotCQkgIGJyZWFrOwotCQljYXNlIElNTTQ6Ci0JCSAgaW1tID0gKGJ1ZmZlcltieXRlXSkgJiAweGY7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgSU1NODoKLQkJY2FzZSBSTElTVDoKLQkJICBpbW0gPSAoYnVmZmVyW2J5dGVdKTsKLQkJICBicmVhazsKLQkJY2FzZSBQQ1JFTDE2OgotCQkgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIGJ5dGUgKyAyKTsKLQkJICBwY3JlbCA9IChidWZmZXJbYnl0ZV0gPDwgOCkgfCAoYnVmZmVyW2J5dGUgKyAxXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUENSRUw4OgotCQkgIHBjcmVsID0gKGJ1ZmZlcltieXRlXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgUUlNOgotCQkgIHN3aXRjaCAoYnVmZmVyW2J5dGVdICYgMHg3KQotCQkgICAgewotCQkgICAgY2FzZSAwOgotCQkgICAgICBxaW0gPSAxOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgMToKLQkJICAgICAgcWltID0gMjsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICBjYXNlIDQ6Ci0JCSAgICAgIHFpbSA9IC0xOwotCQkgICAgICBicmVhazsKLQkJICAgIGNhc2UgNToKLQkJICAgICAgcWltID0gLTI7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCQkgIGJyZWFrOwotCi0JCX0KLQkgICAgfQotCX0KLSAgICAgIC8qIFdlIGdldCBoZXJlIHdoZW4gYWxsIHRoZSBtYXNrcyBoYXZlIHBhc3NlZCBzbyB3ZSBjYW4gb3V0cHV0IHRoZQotCSBvcGVyYW5kcyovCi0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyBvcGNvZGUtPmxlbmd0aCk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgb3Bjb2RlLT5sZW5ndGg7IGkrKykKLQl7Ci0JICAoZnVuYykgKHN0cmVhbSwgIiUwMnggIiwgYnVmZmVyW2ldKTsKLQl9Ci0gICAgICBmb3IgKDsgaSA8IDY7IGkrKykKLQl7Ci0JICAoZnVuYykgKHN0cmVhbSwgIiAgICIpOwotCX0KLSAgICAgIChmdW5jKSAoc3RyZWFtLCAiJXNcdCIsIG9wY29kZS0+bmFtZSk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgb3Bjb2RlLT5uYXJnczsgaSsrKQotCXsKLQkgIGlmIChpKQotCSAgICAoZnVuYykgKHN0cmVhbSwgIiwiKTsKLQkgIHN3aXRjaCAob3Bjb2RlLT5hcmdfdHlwZVtpXSkKLQkgICAgewotCSAgICBjYXNlIEZQOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgImZwIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUk5JTkRfRDE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDoxNixyJWQpIiwgZGlzcCwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5EX0Q4OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDo4ICglZCksciVkKSIsIGRpc3AgJiAweGZmLCBkaXNwLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkRfRDE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDoxNixyJWQpIiwgZGlzcCwgcmQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJESU5EX0Q4OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDo4ICglZCksIHIlZCkiLCBkaXNwICYgMHhmZiwgZGlzcCwgcmQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQSU5EX0Q4OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAoMHgleDo4ICglZCksIGZwKSIsIGRpc3AgJiAweGZmLCBkaXNwLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ1JCOgotCSAgICBjYXNlIENSVzoKLQkgICAgICBmdW5jIChzdHJlYW0sICIlcyIsIGNybmFtZVtjcl0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgInIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRDoKLQkgICAgICBmdW5jIChzdHJlYW0sICJyJWQiLCByZCk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUlM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiciVkIiwgcnMpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOREVDOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAtciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5DOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkByJWQrIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFJOSU5EOgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkByJWQiLCBybik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkRJTkQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQHIlZCIsIHJkKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBTUElOQzoKLQkgICAgICBmdW5jIChzdHJlYW0sICJAc3ArIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgU1BERUM6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQC1zcCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFCUzI0OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAweCUweDoyNCIsIGFicyk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQUJTMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiQDB4JTB4OjE2IiwgYWJzICYgMHhmZmZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBQlM4OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIkAweCUweDo4IiwgYWJzICYgMHhmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgSU1NMTY6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiIzB4JTB4OjE2IiwgaW1tICYgMHhmZmZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSTElTVDoKLQkgICAgICB7Ci0JCWludCBpOwotCQlpbnQgbmMgPSAwOwotCQlmdW5jIChzdHJlYW0sICIoIik7Ci0JCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCSAgewotCQkgICAgaWYgKGltbSAmICgxIDw8IGkpKQotCQkgICAgICB7Ci0JCQlmdW5jIChzdHJlYW0sICJyJWQiLCBpKTsKLQkJCWlmIChuYykKLQkJCSAgZnVuYyAoc3RyZWFtLCAiLCIpOwotCQkJbmMgPSAxOwotCQkgICAgICB9Ci0JCSAgfQotCQlmdW5jIChzdHJlYW0sICIpIik7Ci0JICAgICAgfQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTTg6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiIzB4JTB4OjgiLCBpbW0gJiAweGZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBQQ1JFTDE2OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIjB4JTB4OjE2IiwgKHBjcmVsICsgYWRkciArIG9wY29kZS0+bGVuZ3RoKSAmIDB4ZmZmZik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUENSRUw4OgotCSAgICAgIGZ1bmMgKHN0cmVhbSwgIiMweCUweDo4IiwKLQkJICAgICgoY2hhcikgcGNyZWwgKyBhZGRyICsgb3Bjb2RlLT5sZW5ndGgpICYgMHhmZmZmKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBRSU06Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiIyVkOnEiLCBxaW0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIElNTTQ6Ci0JICAgICAgZnVuYyAoc3RyZWFtLCAiIyVkOjQiLCBpbW0pOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JfQotICAgICAgcmV0dXJuIG9wY29kZS0+bGVuZ3RoOwotICAgIG5leHQ6OwotICAgIH0KLQotICAvKiBDb3VsZG4ndCB1bmRlcnN0YW5kIGFueXRoaW5nICovCi0gIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gIGZ1bmMgKHN0cmVhbSwgXygiJTAyeFx0XHQqdW5rbm93bioiKSwgYnVmZmVyWzBdKTsKLSAgcmV0dXJuIDE7Ci0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaDg1MDAtb3BjLmggYi9vcGNvZGVzL2g4NTAwLW9wYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDk0OWFmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvaDg1MDAtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODM2ICswLDAgQEAKLXR5cGVkZWYgZW51bQotewotICBHUjAsR1IxLEdSMixHUjMsR1I0LEdSNSxHUjYsR1I3LAotICBHUFIwLCBHUFIxLCBHUFIyLCBHUFIzLCBHUFI0LCBHUFI1LCBHUFI2LCBHUFI3LAotICBHQ0NSLCBHUEMsIAotICBHU0VHQywgR1NFR0QsIEdTRUdFLCBHU0VHVCxHTEFTVAotfSBnZGJyZWdfdHlwZTsKLSNkZWZpbmUgT19YT1JDIDEKLSNkZWZpbmUgT19YT1IgMgotI2RlZmluZSBPX1hDSCAzCi0jZGVmaW5lIE9fVU5MSyA0Ci0jZGVmaW5lIE9fVFNUIDUKLSNkZWZpbmUgT19UUkFQQSA2Ci0jZGVmaW5lIE9fVFJBUF9WUyA3Ci0jZGVmaW5lIE9fVEFTIDgKLSNkZWZpbmUgT19TV0FQIDkKLSNkZWZpbmUgT19TVUJYIDEwCi0jZGVmaW5lIE9fU1VCUyAxMQotI2RlZmluZSBPX1NVQiAxMgotI2RlZmluZSBPX1NUTSAxMwotI2RlZmluZSBPX1NUQyAxNAotI2RlZmluZSBPX1NMRUVQIDE1Ci0jZGVmaW5lIE9fU0hMUiAxNgotI2RlZmluZSBPX1NITEwgMTcKLSNkZWZpbmUgT19TSEFSIDE4Ci0jZGVmaW5lIE9fU0hBTCAxOQotI2RlZmluZSBPX1NDQl9ORSAyMAotI2RlZmluZSBPX1NDQl9GIDIxCi0jZGVmaW5lIE9fU0NCX0VRIDIyCi0jZGVmaW5lIE9fUlRTIDIzCi0jZGVmaW5lIE9fUlREIDI0Ci0jZGVmaW5lIE9fUk9UWFIgMjUKLSNkZWZpbmUgT19ST1RYTCAyNgotI2RlZmluZSBPX1JPVFIgMjcKLSNkZWZpbmUgT19ST1RMIDI4Ci0jZGVmaW5lIE9fUFJUUyAyOQotI2RlZmluZSBPX1BSVEQgMzAKLSNkZWZpbmUgT19QSlNSIDMxCi0jZGVmaW5lIE9fUEpNUCAzMgotI2RlZmluZSBPX09SQyAzMwotI2RlZmluZSBPX09SIDM0Ci0jZGVmaW5lIE9fTk9UIDM1Ci0jZGVmaW5lIE9fTk9QIDM2Ci0jZGVmaW5lIE9fTkVHIDM3Ci0jZGVmaW5lIE9fTVVMWFUgMzgKLSNkZWZpbmUgT19NT1ZUUEUgMzkKLSNkZWZpbmUgT19NT1ZGUEUgNDAKLSNkZWZpbmUgT19NT1YgNDEKLSNkZWZpbmUgT19MSU5LIDQyCi0jZGVmaW5lIE9fTERNIDQzCi0jZGVmaW5lIE9fTERDIDQ0Ci0jZGVmaW5lIE9fSlNSIDQ1Ci0jZGVmaW5lIE9fSk1QIDQ2Ci0jZGVmaW5lIE9fRVhUVSA0NwotI2RlZmluZSBPX0VYVFMgNDgKLSNkZWZpbmUgT19EU1VCIDQ5Ci0jZGVmaW5lIE9fRElWWFUgNTAKLSNkZWZpbmUgT19EQUREIDUxCi0jZGVmaW5lIE9fQ01QIDUyCi0jZGVmaW5lIE9fQ0xSIDUzCi0jZGVmaW5lIE9fQlZTIDU0Ci0jZGVmaW5lIE9fQlZDIDU1Ci0jZGVmaW5lIE9fQlRTVCA1NgotI2RlZmluZSBPX0JUIDU3Ci0jZGVmaW5lIE9fQlNSIDU4Ci0jZGVmaW5lIE9fQlNFVCA1OQotI2RlZmluZSBPX0JSTiA2MAotI2RlZmluZSBPX0JSQSA2MQotI2RlZmluZSBPX0JQVCA2MgotI2RlZmluZSBPX0JQTCA2MwotI2RlZmluZSBPX0JOT1QgNjQKLSNkZWZpbmUgT19CTkUgNjUKLSNkZWZpbmUgT19CTUkgNjYKLSNkZWZpbmUgT19CTFQgNjcKLSNkZWZpbmUgT19CTFMgNjgKLSNkZWZpbmUgT19CTE8gNjkKLSNkZWZpbmUgT19CTEUgNzAKLSNkZWZpbmUgT19CSFMgNzEKLSNkZWZpbmUgT19CSEkgNzIKLSNkZWZpbmUgT19CR1QgNzMKLSNkZWZpbmUgT19CR0UgNzQKLSNkZWZpbmUgT19CRiA3NQotI2RlZmluZSBPX0JFUSA3NgotI2RlZmluZSBPX0JDUyA3NwotI2RlZmluZSBPX0JDTFIgNzgKLSNkZWZpbmUgT19CQ0MgNzkKLSNkZWZpbmUgT19BTkRDIDgwCi0jZGVmaW5lIE9fQU5EIDgxCi0jZGVmaW5lIE9fQUREWCA4MgotI2RlZmluZSBPX0FERFMgODMKLSNkZWZpbmUgT19BREQgODQKLSNkZWZpbmUgT19CWVRFIDEyOAotI2RlZmluZSBPX1dPUkQgMHgwMDAKLSNkZWZpbmUgT19VTlNaIDB4MDAwCi0jZGVmaW5lIEZQSU5EX0Q4CTEwCi0jZGVmaW5lIFJESU5EX0QxNgkxMQotI2RlZmluZSBSRElORF9EOAkxMgotI2RlZmluZSBTUERFQwkxMwotI2RlZmluZSBSRElORAkxNAotI2RlZmluZSBSTgkxNQotI2RlZmluZSBSTklORF9EOAkxNgotI2RlZmluZSBSTklORF9EMTYJMTcKLSNkZWZpbmUgUk5ERUMJMTgKLSNkZWZpbmUgUk5JTkMJMTkKLSNkZWZpbmUgUk5JTkQJMjAKLSNkZWZpbmUgU1BJTkMJMjEKLSNkZWZpbmUgQUJTMTYJMjIKLSNkZWZpbmUgQUJTMjQJMjMKLSNkZWZpbmUgUENSRUwxNgkyNAotI2RlZmluZSBQQ1JFTDgJMjUKLSNkZWZpbmUgQUJTOAkyNgotI2RlZmluZSBDUkIJMjcKLSNkZWZpbmUgQ1IJMjgKLSNkZWZpbmUgQ1JXCTI5Ci0jZGVmaW5lIERJU1AxNgkzMAotI2RlZmluZSBESVNQOAkzMQotI2RlZmluZSBGUAkzMgotI2RlZmluZSBJTU0xNgkzMwotI2RlZmluZSBJTU00CTM0Ci0jZGVmaW5lIElNTTgJMzUKLSNkZWZpbmUgUkxJU1QJMzYKLSNkZWZpbmUgUUlNCTM3Ci0jZGVmaW5lIFJECTM4Ci0jZGVmaW5lIFJTCTM5Ci0jZGVmaW5lIFNQCTQwCi10eXBlZGVmIGVudW0geyBBQ19CQUQsIEFDX0VJLCBBQ19SSSwgQUNfRCwgQUNfLEFDX0VSUiwgQUNfWCxBQ19CLCBBQ19FRSxBQ19SUixBQ19JRSwKLSBBQ19SRSxBQ19FLCBBQ19JLCBBQ19FUixBQ19JUlIsIEFDX0lSLCBBQ19SRVIsIEFDX0VSRSxBQ19FSUUgfSBhZGRyX2NsYXNzX3R5cGU7IAotdHlwZWRlZiBzdHJ1Y3QgewotCXNob3J0IGludCBpZHg7Ci0JY2hhciBmbGFncyxzcmMxLHNyYzIsZHN0OwotCXVuc2lnbmVkIGNoYXIgZmxhdm9yOwotCWNoYXIgKm5hbWU7Ci0JaW50IG5hcmdzOwotCWludCBhcmdfdHlwZVsyXTsKLQlpbnQgbGVuZ3RoOwotCXN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgY29udGVudHM7dW5zaWduZWQgY2hhciBtYXNrOyBjaGFyIGluc2VydDsgfSBieXRlc1s2XTsKLX0gaDg1MDBfb3Bjb2RlX2luZm87Ci1oODUwMF9vcGNvZGVfaW5mbyBoODUwMF90YWJsZVtdCi0jaWZkZWYgQVNTRU1CTEVSX1RBQkxFCi0jaWZkZWYgREVGSU5FX1RBQkxFCi09ewotLyoKLXsxMDEsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSwKLQkJCQkJCQkJICAgezB4MDAsMHgwMCxBQlMxNiB9LAotCQkJCQkJCQkgICB7MHgwMCwweDAwLCB9LAotCQkJCQkJCQkgICB7MHgwNywweGZmLCB9LAotCQkJCQkJCQkgICB7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LCovCi0KLXsxLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19XT1JELCJ4b3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxDUlcgfX19LAotezIsJ3MnLCdFJywnQycsJ0MnLE9fWE9SQ3xPX0JZVEUsInhvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDY4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MywnbScsJ0UnLCdEJywnRCcsT19YT1J8T19XT1JELCJ4b3IudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17NSwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19VTlNaLCJ4b3IiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXs1LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1VOU1osInhvciIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezUsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fVU5TWiwieG9yIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezYsJy0nLCdYJywnIScsJyEnLE9fWENIfE9fV09SRCwieGNoLnciLDIse1JTLFJEfSwyLAl7ezB4YTgsMHhmOCxSUyB9LHsweDkwLDB4ZjgsUkQgfX19LAotezcsJy0nLCdYJywnIScsJyEnLE9fWENIfE9fVU5TWiwieGNoIiwyLHtSUyxSRH0sMiwJe3sweGE4LDB4ZjgsUlMgfSx7MHg5MCwweGY4LFJEIH19fSwKLXs4LCctJywnQicsJyEnLCchJyxPX1VOTEt8T19VTlNaLCJ1bmxrIiwxLHtGUCwwfSwxLAl7ezB4MGYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezExLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1VOU1osInRzdCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MTEsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fVU5TWiwidHN0IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXsxMSwnYScsJ0UnLCchJywnIScsT19UU1R8T19VTlNaLCJ0c3QiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTIsJy0nLCdJJywnIScsJyEnLE9fVFJBUEF8T19VTlNaLCJ0cmFwYSIsMSx7SU1NNCwwfSwyLAl7ezB4MDgsMHhmZiwgfSx7MHgxMCwweGYwLElNTTQgfX19LAotezEzLCctJywnQicsJyEnLCchJyxPX1RSQVBfVlN8T19VTlNaLCJ0cmFwL3ZzIiwwLHswLDB9LDEsCXt7MHgwOSwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNywweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTUsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fVU5TWiwidGFzIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNSwncycsJ0UnLCchJywnRScsT19UQVN8T19VTlNaLCJ0YXMiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTcsMHhmZiwgfX19LAotezE1LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX1VOU1osInRhcyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxNiwnbScsJ0QnLCchJywnRCcsT19TV0FQfE9fQllURSwic3dhcC5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEwLDB4ZmYsIH19fSwKLXsxNywnbScsJ0QnLCchJywnRCcsT19TV0FQfE9fVU5TWiwic3dhcCIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMCwweGZmLCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE4LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19XT1JELCJzdWJ4LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezIwLCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19VTlNaLCJzdWJ4IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjAsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1VOU1osInN1YngiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fVU5TWiwic3VieCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIyLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19CWVRFLCJzdWJzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjMsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1VOU1osInN1YnMiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMywnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fVU5TWiwic3VicyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezIzLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19VTlNaLCJzdWJzIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezI2LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1VOU1osInN1YiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjYsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fVU5TWiwic3ViIiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyNiwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19VTlNaLCJzdWIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjcsJy0nLCdJJywnIScsJ0UnLE9fU1RNfE9fVU5TWiwic3RtIiwyLHtSTElTVCxTUERFQ30sMiwJe3sweDEyLDB4ZmYsIH0sezB4MDAsMHgwMCxSTElTVCB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTn0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTgsMHhmOCxDUlcgfX19LAotezI4LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1dPUkQsInN0Yy53IiwyLHtDUlcsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOCwncycsJ0MnLCchJywnRScsT19TVEN8T19XT1JELCJzdGMudyIsMix7Q1JXLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MjgsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fV09SRCwic3RjLnciLDIse0NSVyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOfSwyLAkJe3sweGEwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTgsMHhmOCxDUkIgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JXLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUlcgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUkIsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSVyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSVyB9fX0sCi17MzAsJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fVU5TWiwic3RjIiwyLHtDUlcsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDk4LDB4ZjgsQ1JXIH19fSwKLXszMCwncycsJ0MnLCchJywnRScsT19TVEN8T19VTlNaLCJzdGMiLDIse0NSQixBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMwLCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX1VOU1osInN0YyIsMix7Q1JCLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMxLCctJywnIScsJyEnLCchJyxPX1NMRUVQfE9fVU5TWiwic2xlZXAiLDAsezAsMH0sMSwJe3sweDFhLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWIsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzQsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1VOU1osInNobHIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNCwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fVU5TWiwic2hsciIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM0LCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19VTlNaLCJzaGxyIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWEsMHhmZiwgfX19LAotezM2LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19CWVRFLCJzaGxsLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNywnaCcsJ0UnLCchJywnRScsT19TSExMfE9fVU5TWiwic2hsbCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezM3LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19VTlNaLCJzaGxsIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzcsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1VOU1osInNobGwiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezM5LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19CWVRFLCJzaGFyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezQwLCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19VTlNaLCJzaGFyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17NDAsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1VOU1osInNoYXIiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fVU5TWiwic2hhciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTgsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NDMsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1VOU1osInNoYWwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MywnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fVU5TWiwic2hhbCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQzLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19VTlNaLCJzaGFsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezQ0LCctJywnQicsJ1MnLCdTJyxPX1NDQl9ORXxPX1VOU1osInNjYi9uZSIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDYsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezQ1LCctJywnQicsJ1MnLCdTJyxPX1NDQl9GfE9fVU5TWiwic2NiL2YiLDIse1JTLFBDUkVMOH0sMywJe3sweDAxLDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0NiwnLScsJ0InLCdTJywnUycsT19TQ0JfRVF8T19VTlNaLCJzY2IvZXEiLDIse1JTLFBDUkVMOH0sMywJe3sweDA3LDB4ZmYsIH0sezB4YjgsMHhmOCxSUyB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXs0NywnLScsJ0InLCchJywnIScsT19SVFN8T19VTlNaLCJydHMiLDAsezAsMH0sMSwJe3sweDE5LDB4ZmYsIH19fSwKLXs0OCwnLScsJ0InLCchJywnIScsT19SVER8T19VTlNaLCJydGQiLDEse0lNTTgsMH0sMiwJe3sweDE0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs0OCwnLScsJ0InLCchJywnIScsT19SVER8T19VTlNaLCJydGQiLDEse0lNTTE2LDB9LDMsCXt7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZiwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWYsMHhmZiwgfX19LAotezUxLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fVU5TWiwicm90eHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1VOU1osInJvdHhyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NTEsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19VTlNaLCJyb3R4ciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZSwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NTQsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19VTlNaLCJyb3R4bCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezU0LCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fVU5TWiwicm90eGwiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs1NCwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1VOU1osInJvdHhsIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU1LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19XT1JELCJyb3RyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs1NywnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fVU5TWiwicm90ciIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezU3LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19VTlNaLCJyb3RyIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTcsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1VOU1osInJvdHIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWMsMHhmZiwgfX19LAotezYwLCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19VTlNaLCJyb3RsIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NjAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1VOU1osInJvdGwiLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fVU5TWiwicm90bCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2MSwnLScsJ0InLCchJywnIScsT19QUlRTfE9fVU5TWiwicHJ0cyIsMCx7MCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHgxOSwweGZmLCB9fX0sCi17NjIsJy0nLCdCJywnIScsJyEnLE9fUFJURHxPX1VOU1osInBydGQiLDEse0lNTTgsMH0sMywJe3sweDExLDB4ZmYsIH0sezB4MTQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU0xNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHgxYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17NjMsJy0nLCdKJywnIScsJyEnLE9fUEpTUnxPX1VOU1osInBqc3IiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGM4LDB4ZjgsUkRJTkQgfX19LAotezYzLCctJywnSicsJyEnLCchJyxPX1BKU1J8T19VTlNaLCJwanNyIiwxLHtBQlMyNCwwfSw0LAl7ezB4MDMsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzI0IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17NjQsJy0nLCdKJywnIScsJyEnLE9fUEpNUHxPX1VOU1osInBqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGMwLDB4ZjgsUkRJTkQgfX19LAotezY0LCctJywnSicsJyEnLCchJyxPX1BKTVB8T19VTlNaLCJwam1wIiwxLHtBQlMyNCwwfSw0LAl7ezB4MTMsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzI0IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17NjUsJ3MnLCdJJywnQycsJ0MnLE9fT1JDfE9fV09SRCwib3JjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxDUlcgfX19LAotezY2LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX0JZVEUsIm9yYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDgsMHhmOCxDUkIgfX19LAotezY3LCdzJywnSScsJ0MnLCdDJyxPX09SQ3xPX1VOU1osIm9yYyIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQ4LDB4ZjgsQ1JCIH19fSwKLXs2NywncycsJ0knLCdDJywnQycsT19PUkN8T19VTlNaLCJvcmMiLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxDUlcgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY5LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fQllURSwib3IuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1VOU1osIm9yIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzAsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19VTlNaLCJvciIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezcwLCdtJywnRScsJ0QnLCdEJyxPX09SfE9fVU5TWiwib3IiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NzMsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fVU5TWiwibm90IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs3MywnbScsJ0UnLCchJywnRScsT19OT1R8T19VTlNaLCJub3QiLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezczLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1VOU1osIm5vdCIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs3NCwnLScsJyEnLCchJywnIScsT19OT1B8T19VTlNaLCJub3AiLDAsezAsMH0sMSwJe3sweDAwLDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNCwweGZmLCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTQsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3NywnYScsJ0UnLCchJywnRScsT19ORUd8T19VTlNaLCJuZWciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezc3LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1VOU1osIm5lZyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NzcsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fVU5TWiwibmVnIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1VOU1osIm11bHh1IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODAsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19VTlNaLCJtdWx4dSIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgwLCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fVU5TWiwibXVseHUiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODIsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fVU5TWiwibW92dHBlIiwyLHtSUyxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs4MiwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19VTlNaLCJtb3Z0cGUiLDIse1JTLEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgyLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX1VOU1osIm1vdnRwZSIsMix7UlMsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTixSRH0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklOQyxSRH0sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORCxSRH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTkRFQyxSRH0sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtJTU04LFJEfSw0LAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlM4LFJEfSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtSTklORF9EOCxSRH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7QUJTMTYsUkR9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0QxNixSRH0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOLFJEfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklOQyxSRH0sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7Uk5JTkQsUkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOREVDLFJEfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtJTU04LFJEfSw0LAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7QUJTOCxSRH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDAsMHhmZiwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs4NCwnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19VTlNaLCJtb3ZmcGUiLDIse1JOSU5EX0Q4LFJEfSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezg0LCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX1VOU1osIm1vdmZwZSIsMix7QUJTMTYsUkR9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODQsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fVU5TWiwibW92ZnBlIiwyLHtSTklORF9EMTYsUkR9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OnMudyIsMix7UlMsQUJTOH0sMiwJe3sweDc4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpzLmIiLDIse1JTLEFCUzh9LDIsCXt7MHg3MCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4NywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6cyIsMix7UlMsQUJTOH0sMiwJe3sweDc4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg4LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpsLnciLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4OSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6bC5iIiwyLHtBQlM4LFJEfSwyLAl7ezB4NjAsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17OTAsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmwiLDIse0FCUzgsUkR9LDIsCXt7MHg2OCwweGY4LFJEIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs5MSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6aS53IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkyLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjppIiwgIDIse0lNTTE2LFJEfSwzLAl7ezB4NTgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk4sUkR9LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LHt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixBQlM4fSw1LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LHt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklORH0sMywJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxSTklOQ30sMywJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTUsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTUsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk1LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTE2LFJOSU5EX0Q4fSw1LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17OTUsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92OmciLDIse0lNTTgsQUJTMTZ9LDUsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs5NSwnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezk1LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdjpnIiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5NiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDk4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zi53IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NywnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDkwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5NywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zi5iIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDgwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXs5OCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3Y6ZiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTgsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmYiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezk5LCdtJywnSScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjplLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDAsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92OmUiLDIse0lNTTgsUkR9LDIsCXt7MHg1MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsQUJTOH0sMiwJe3sweDc4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAxLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDg4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDEsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMSwnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3YudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAxLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdi53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtGUElORF9EOCxSRH0sMiwJe3sweDgwLDB4ZjgsUkQgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLEFCUzh9LDIsCXt7MHg3MCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxGUElORF9EOH0sMiwJe3sweDkwLDB4ZjgsUlMgfSx7MHgwMCwweDAwLEZQSU5EX0Q4IH19fSwKLXsxMDIsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtBQlM4LFJEfSwyLAl7ezB4NjAsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NTAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5DfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAyLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDIsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAyLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdi5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMiwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3YuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtBQlM4LFJEfSwyLAl7ezB4NjgsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsQUJTOH0sMiwJe3sweDc4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLEZQSU5EX0Q4fSwyLAl7ezB4OTgsMHhmOCxSUyB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0ZQSU5EX0Q4LFJEfSwyLAl7ezB4ODgsMHhmOCxSRCB9LHsweDAwLDB4MDAsRlBJTkRfRDggfX19LAotLyp7MTAzLCdtJywnSScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NOCxSRH0sMiwJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTggfX19LCovCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUk5JTkR9LDMsCXt7MHhkOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5MCwweGY4LFJTIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSRH0sMywJe3sweDU4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsQUJTOH0sNCwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEwMywnbScsJ1MnLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkR9LDQsCXt7MHhkOCwweGY4LFJOIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTAzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezEwMywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1VOU1osIm1vdiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4MCwweGY4LFJEIH19fSwKLXsxMDMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwMywnbScsJ0knLCchJywnRScsT19NT1Z8T19VTlNaLCJtb3YiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTAzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1VOU1osIm1vdiIsMix7SU1NMTYsQUJTMTZ9LDYsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fVU5TWiwibW92IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTh9LDIsCXt7MHgxNywweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTA0LCctJywnUycsJ0knLCchJyxPX0xJTkt8T19VTlNaLCJsaW5rIiwyLHtGUCxJTU0xNn0sMywJe3sweDFmLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDUsJy0nLCdFJywnIScsJ0MnLE9fTERNfE9fVU5TWiwibGRtIiwyLHtTUElOQyxSTElTVH0sMiwJe3sweDAyLDB4ZmYsIH0sezB4MDAsMHgwMCxSTElTVCB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTixDUld9LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse1JOSU5ELENSV30sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTklOQyxDUld9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7Uk5ERUMsQ1JXfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0FCUzgsQ1JXfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTklORF9EOCxDUld9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDYsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fV09SRCwibGRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwNiwncycsJ0UnLCchJywnQycsT19MREN8T19XT1JELCJsZGMudyIsMix7QUJTMTYsQ1JXfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtSTklORF9EMTYsQ1JXfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTixDUkJ9LDIsCQl7ezB4YTAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOREVDLENSQn0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklOQyxDUkJ9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkQsQ1JCfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlM4LENSQn0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDgsQ1JCfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtBQlMxNixDUkJ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5EX0QxNixDUkJ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTixDUld9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOLENSQn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkMsQ1JXfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTklORCxDUkJ9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOREVDLENSV30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkQsQ1JXfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMDgsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fVU5TWiwibGRjIiwyLHtSTkRFQyxDUkJ9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5DLENSQn0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7QUJTOCxDUld9LDMsCQl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7QUJTOCxDUkJ9LDMsCQl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7SU1NOCxDUkJ9LDMsCQl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkRfRDgsQ1JXfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkRfRDgsQ1JCfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7QUJTMTYsQ1JCfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7QUJTMTYsQ1JXfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSVyB9fX0sCi17MTA4LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1VOU1osImxkYyIsMix7Uk5JTkRfRDE2LENSV30sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUlcgfX19LAotezEwOCwncycsJ0UnLCchJywnQycsT19MREN8T19VTlNaLCJsZGMiLDIse1JOSU5EX0QxNixDUkJ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhkOCwweGY4LFJEIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtBQlMxNiwwfSwzLAl7ezB4MTgsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGU4LDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweGY4LDB4ZjgsUkRJTkRfRDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkQsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4ZDAsMHhmOCxSRCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7QUJTMTYsMH0sMywJe3sweDEwLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHhlMCwweGY4LFJESU5EX0Q4IH0sezB4MDAsMHgwMCwgfX19LAotezExMCwnLScsJ0InLCchJywnIScsT19KTVB8T19VTlNaLCJqbXAiLDEse1JESU5EX0QxNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHhmMCwweGY4LFJESU5EX0QxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHgwMCwgfX19LAotezExMSwncycsJ0QnLCchJywnRCcsT19FWFRVfE9fQllURSwiZXh0dS5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDEyLDB4ZmYsIH19fSwKLXsxMTIsJ3MnLCdEJywnIScsJ0QnLE9fRVhUVXxPX1VOU1osImV4dHUiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTIsMHhmZiwgfX19LAotezExMywncycsJ0QnLCchJywnRCcsT19FWFRTfE9fQllURSwiZXh0cy5iIiwxLHtSRCwwfSwyLAl7ezB4YTAsMHhmOCxSRCB9LHsweDExLDB4ZmYsIH19fSwKLXsxMTQsJ3MnLCdEJywnIScsJ0QnLE9fRVhUU3xPX1VOU1osImV4dHMiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTEsMHhmZiwgfX19LAotezExNSwncycsJ0QnLCchJywnIScsT19EU1VCfE9fVU5TWiwiZHN1YiIsMix7UlMsUkR9LDMsCXt7MHhhMCwweGY4LFJTIH0sezB4MDAsMHhmZiwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE4LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fVU5TWiwiZGl2eHUiLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTgsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19VTlNaLCJkaXZ4dSIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOCwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1VOU1osImRpdnh1IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExOSwncycsJ0QnLCchJywnIScsT19EQUREfE9fVU5TWiwiZGFkZCIsMix7UlMsUkR9LDMsCXt7MHhhMCwweGY4LFJTIH0sezB4MDAsMHhmZiwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxMjAsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjEsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmkiLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSx7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOSU5EX0QxNn0sNSwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk4sUkR9LDIsCQl7ezB4YTgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjQsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTn0sNCwJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI0LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXA6ZyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjQsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wOmciLDIse0lNTTE2LFJOSU5EX0QxNn0sNix7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI0LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDpnIiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6ZS5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NDAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI2LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcDplIiwyLHtJTU04LFJEfSwyLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTixSRH0sMiwJCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjcsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSRH0sMywJe3sweDQ4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTkRFQ30sNCwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixSTklORH0sNCwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk59LDQsCXt7MHhhOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyNywnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXAudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjcsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNix7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI3LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcC53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk4sUkR9LDIsCQl7ezB4YTAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUkR9LDIsCXt7MHg0MCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTn0sMywJe3sweGEwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjgsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjgsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxBQlM4fSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI4LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtJTU04LFJOSU5EX0Q4fSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI4LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyOCwnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXAuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjksJ2EnLCdEJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU04LFJEfSwyLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUkR9LDMsCXt7MHg0OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7QUJTOCxSRH0sMywJCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOfSw0LAkJe3sweGE4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTI5LCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjksJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fVU5TWiwiY21wIiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyOSwnYScsJ0UnLCdJJywnIScsT19DTVB8T19VTlNaLCJjbXAiLDIse0lNTTE2LEFCUzE2fSw2LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTI5LCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1VOU1osImNtcCIsMix7SU1NMTYsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkMsMH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezEzMiwnYycsJyEnLCchJywnRScsT19DTFJ8T19VTlNaLCJjbHIiLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzIsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fVU5TWiwiY2xyIiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMyLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1VOU1osImNsciIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzMsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fV09SRCwiYnZzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzNCwnLScsJ0InLCchJywnIScsT19CVlN8T19CWVRFLCJidnMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzUsJy0nLCdCJywnIScsJyEnLE9fQlZTfE9fVU5TWiwiYnZzIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzNSwnLScsJ0InLCchJywnIScsT19CVlN8T19VTlNaLCJidnMiLDEse1BDUkVMMTYsMH0sMywJe3sweDM5LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzNiwnLScsJ0InLCchJywnIScsT19CVkN8T19XT1JELCJidmMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTM3LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX0JZVEUsImJ2Yy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzOCwnLScsJ0InLCchJywnIScsT19CVkN8T19VTlNaLCJidmMiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTM4LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX1VOU1osImJ2YyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzgsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQwLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTQxLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19VTlNaLCJidHN0IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fVU5TWiwiYnRzdCIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDEsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1VOU1osImJ0c3QiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MiwnLScsJ0InLCchJywnIScsT19CVHxPX1dPUkQsImJ0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0MywnLScsJ0InLCchJywnIScsT19CVHxPX0JZVEUsImJ0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ0LCctJywnQicsJyEnLCchJyxPX0JUfE9fVU5TWiwiYnQiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ0LCctJywnQicsJyEnLCchJyxPX0JUfE9fVU5TWiwiYnQiLDEse1BDUkVMMTYsMH0sMywJe3sweDMwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE0NSwnLScsJ0InLCchJywnIScsT19CU1J8T19XT1JELCJic3IudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MWUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQ2LCctJywnQicsJyEnLCchJyxPX0JTUnxPX0JZVEUsImJzci5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDBlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE0NywnLScsJ0InLCchJywnIScsT19CU1J8T19VTlNaLCJic3IiLDEse1BDUkVMOCwwfSwyLAl7ezB4MGUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTQ3LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1VOU1osImJzciIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MWUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTUwLCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19VTlNaLCJic2V0IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fVU5TWiwiYnNldCIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNTAsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1VOU1osImJzZXQiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE1MSwnLScsJ0InLCchJywnIScsT19CUk58T19XT1JELCJicm4udyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTUyLCctJywnQicsJyEnLCchJyxPX0JSTnxPX0JZVEUsImJybi5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1MywnLScsJ0InLCchJywnIScsT19CUk58T19VTlNaLCJicm4iLDEse1BDUkVMOCwwfSwyLAl7ezB4MjEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTUzLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1VOU1osImJybiIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTU0LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1dPUkQsImJyYS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTUsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fQllURSwiYnJhLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTU2LCctJywnQicsJyEnLCchJyxPX0JSQXxPX1VOU1osImJyYSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNTYsJy0nLCdCJywnIScsJyEnLE9fQlJBfE9fVU5TWiwiYnJhIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTcsJy0nLCchJywnIScsJyEnLE9fQlBUfE9fVU5TWiwiYnB0IiwwLHswLDB9LDEsCXt7MHgwYiwweGZmLCB9fX0sCi17MTU4LCctJywnQicsJyEnLCchJyxPX0JQTHxPX1dPUkQsImJwbC53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTksJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fQllURSwiYnBsLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmEsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTYwLCctJywnQicsJyEnLCchJyxPX0JQTHxPX1VOU1osImJwbCIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjAsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fVU5TWiwiYnBsIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsxNjMsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1VOU1osImJub3QiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTYzLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19VTlNaLCJibm90IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezE2MywnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MywnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fVU5TWiwiYm5vdCIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MTY0LCctJywnQicsJyEnLCchJyxPX0JORXxPX1dPUkQsImJuZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjUsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fQllURSwiYm5lLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTY2LCctJywnQicsJyEnLCchJyxPX0JORXxPX1VOU1osImJuZSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjYsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fVU5TWiwiYm5lIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNjcsJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fV09SRCwiYm1pLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2OCwnLScsJ0InLCchJywnIScsT19CTUl8T19CWVRFLCJibWkuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjksJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fVU5TWiwiYm1pIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2OSwnLScsJ0InLCchJywnIScsT19CTUl8T19VTlNaLCJibWkiLDEse1BDUkVMMTYsMH0sMywJe3sweDNiLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MCwnLScsJ0InLCchJywnIScsT19CTFR8T19XT1JELCJibHQudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2QsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTcxLCctJywnQicsJyEnLCchJyxPX0JMVHxPX0JZVEUsImJsdC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3MiwnLScsJ0InLCchJywnIScsT19CTFR8T19VTlNaLCJibHQiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTcyLCctJywnQicsJyEnLCchJyxPX0JMVHxPX1VOU1osImJsdCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2QsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTczLCctJywnQicsJyEnLCchJyxPX0JMU3xPX1dPUkQsImJscy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzQsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fQllURSwiYmxzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTc1LCctJywnQicsJyEnLCchJyxPX0JMU3xPX1VOU1osImJscyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzUsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fVU5TWiwiYmxzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzYsJy0nLCdCJywnIScsJyEnLE9fQkxPfE9fV09SRCwiYmxvLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3NywnLScsJ0InLCchJywnIScsT19CTE98T19CWVRFLCJibG8uYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzgsJy0nLCdCJywnIScsJyEnLE9fQkxPfE9fVU5TWiwiYmxvIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3OCwnLScsJ0InLCchJywnIScsT19CTE98T19VTlNaLCJibG8iLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3OSwnLScsJ0InLCchJywnIScsT19CTEV8T19XT1JELCJibGUudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2YsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTgwLCctJywnQicsJyEnLCchJyxPX0JMRXxPX0JZVEUsImJsZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4MSwnLScsJ0InLCchJywnIScsT19CTEV8T19VTlNaLCJibGUiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTgxLCctJywnQicsJyEnLCchJyxPX0JMRXxPX1VOU1osImJsZSIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2YsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTgyLCctJywnQicsJyEnLCchJyxPX0JIU3xPX1dPUkQsImJocy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODMsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fQllURSwiYmhzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTg0LCctJywnQicsJyEnLCchJyxPX0JIU3xPX1VOU1osImJocyIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODQsJy0nLCdCJywnIScsJyEnLE9fQkhTfE9fVU5TWiwiYmhzIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODUsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fV09SRCwiYmhpLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4NiwnLScsJ0InLCchJywnIScsT19CSEl8T19CWVRFLCJiaGkuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODcsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fVU5TWiwiYmhpIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NywnLScsJ0InLCchJywnIScsT19CSEl8T19VTlNaLCJiaGkiLDEse1BDUkVMMTYsMH0sMywJe3sweDMyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4OCwnLScsJ0InLCchJywnIScsT19CR1R8T19XT1JELCJiZ3QudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2UsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTg5LCctJywnQicsJyEnLCchJyxPX0JHVHxPX0JZVEUsImJndC5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJlLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5MCwnLScsJ0InLCchJywnIScsT19CR1R8T19VTlNaLCJiZ3QiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkwLCctJywnQicsJyEnLCchJyxPX0JHVHxPX1VOU1osImJndCIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2UsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTkxLCctJywnQicsJyEnLCchJyxPX0JHRXxPX1dPUkQsImJnZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTIsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fQllURSwiYmdlLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkzLCctJywnQicsJyEnLCchJyxPX0JHRXxPX1VOU1osImJnZSIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTMsJy0nLCdCJywnIScsJyEnLE9fQkdFfE9fVU5TWiwiYmdlIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTQsJy0nLCdCJywnIScsJyEnLE9fQkZ8T19XT1JELCJiZi53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTUsJy0nLCdCJywnIScsJyEnLE9fQkZ8T19CWVRFLCJiZi5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5NiwnLScsJ0InLCchJywnIScsT19CRnxPX1VOU1osImJmIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5NiwnLScsJ0InLCchJywnIScsT19CRnxPX1VOU1osImJmIiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxOTcsJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fV09SRCwiYmVxLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE5OCwnLScsJ0InLCchJywnIScsT19CRVF8T19CWVRFLCJiZXEuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxOTksJy0nLCdCJywnIScsJyEnLE9fQkVRfE9fVU5TWiwiYmVxIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE5OSwnLScsJ0InLCchJywnIScsT19CRVF8T19VTlNaLCJiZXEiLDEse1BDUkVMMTYsMH0sMywJe3sweDM3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezIwMCwnLScsJ0InLCchJywnIScsT19CQ1N8T19XT1JELCJiY3MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjAxLCctJywnQicsJyEnLCchJyxPX0JDU3xPX0JZVEUsImJjcy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwMiwnLScsJ0InLCchJywnIScsT19CQ1N8T19VTlNaLCJiY3MiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjAyLCctJywnQicsJyEnLCchJyxPX0JDU3xPX1VOU1osImJjcyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA1LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19VTlNaLCJiY2xyIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNSwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fVU5TWiwiYmNsciIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse1JTLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsyMDUsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1VOU1osImJjbHIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIwNiwnLScsJ0InLCchJywnIScsT19CQ0N8T19XT1JELCJiY2MudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjA3LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX0JZVEUsImJjYy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwOCwnLScsJ0InLCchJywnIScsT19CQ0N8T19VTlNaLCJiY2MiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjA4LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1VOU1osImJjYyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzQsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjA5LCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19XT1JELCJhbmRjLnciLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxDUlcgfX19LAotezIxMCwncycsJ0knLCdTJywnUycsT19BTkRDfE9fQllURSwiYW5kYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTgsMHhmOCxDUkIgfX19LAotezIxMSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fVU5TWiwiYW5kYyIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDU4LDB4ZjgsQ1JCIH19fSwKLXsyMTEsJ3MnLCdJJywnUycsJ1MnLE9fQU5EQ3xPX1VOU1osImFuZGMiLDIse0lNTTE2LENSV30sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxDUlcgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEyLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1dPUkQsImFuZC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMTQsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fVU5TWiwiYW5kIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE0LCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX1VOU1osImFuZCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIxNCwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19VTlNaLCJhbmQiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjE3LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19VTlNaLCJhZGR4IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1VOU1osImFkZHgiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIxNywnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fVU5TWiwiYWRkeCIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMjAsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1VOU1osImFkZHMiLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fVU5TWiwiYWRkcyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjIwLCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19VTlNaLCJhZGRzIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjMsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkOnEiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyMywnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQ6cSIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIzLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZDpxIiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI2LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZDpnIiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkOmciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNiwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQ6ZyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjcsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtRSU0sUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjcsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNywnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyNywnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQudyIsMix7UUlNLEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI3LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZC53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI4LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtRSU0sUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQuYiIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI4LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZC5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjgsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkLmIiLDIse1FJTSxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1VOU1osImFkZCIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjksJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fVU5TWiwiYWRkIiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI5LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1VOU1osImFkZCIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIyOSwnYScsJ0knLCdFJywnRScsT19BRER8T19VTlNaLCJhZGQiLDIse1FJTSxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyOSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19VTlNaLCJhZGQiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi0wLDAsMH0KLSNlbmRpZgotOwotI2VuZGlmCi0jaWZkZWYgRElTQVNTRU1CTEVSX1RBQkxFCi0jaWZkZWYgREVGSU5FX1RBQkxFCi09ewotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDYwLDB4ZjgsUkQgfX19LAotezI5LCdzJywnQycsJyEnLCdFJyxPX1NUQ3xPX0JZVEUsInN0Yy5iIiwyLHtDUkIsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDk4LDB4ZjgsQ1JCIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4OTgsMHhmOCxDUkIgfX19LAotezMsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fV09SRCwieG9yLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjUsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fQllURSwic3ViLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXs2LCctJywnWCcsJyEnLCchJyxPX1hDSHxPX1dPUkQsInhjaC53IiwyLHtSUyxSRH0sMiwJe3sweGE4LDB4ZjgsUlMgfSx7MHg5MCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE2LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxMCwnYScsJ0UnLCchJywnIScsT19UU1R8T19CWVRFLCJ0c3QuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDMwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTYsMHhmZiwgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgzMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNiwweGZmLCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MjQsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCfE9fV09SRCwic3ViLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MTYsJ20nLCdEJywnIScsJ0QnLE9fU1dBUHxPX1dPUkQsInN3YXAuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMCwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTcsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNywweGZmLCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxNCwncycsJ0UnLCchJywnRScsT19UQVN8T19CWVRFLCJ0YXMuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTixSRH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxOSwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fQllURSwic3VieC5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezE5LCdhJywnRScsJ0QnLCdEJyxPX1NVQlh8T19CWVRFLCJzdWJ4LmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MjEsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX1dPUkQsInN1YnMudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgzOCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMiwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fQllURSwic3Vicy5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgzOCwweGY4LFJEIH19fSwKLXs0LCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX0JZVEUsInhvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyLCdzJywnRScsJ0MnLCdDJyxPX1hPUkN8T19CWVRFLCJ4b3JjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg2OCwweGY4LENSQiB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTYsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsyNSwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19CWVRFLCJzdWIuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MzgsMHhmOCxSRCB9fX0sCi17NCwnbScsJ0UnLCdEJywnRCcsT19YT1J8T19CWVRFLCJ4b3IuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MjksJ3MnLCdDJywnIScsJ0UnLE9fU1RDfE9fQllURSwic3RjLmIiLDIse0NSQixBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YjAsMHhmOCxSRCB9fX0sCi17MTAsJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fQllURSwidHN0LmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTYsMHhmZiwgfX19LAotezE0LCdzJywnRScsJyEnLCdFJyxPX1RBU3xPX0JZVEUsInRhcy5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE3LDB4ZmYsIH19fSwKLXsxMiwnLScsJ0knLCchJywnIScsT19UUkFQQXxPX1VOU1osInRyYXBhIiwxLHtJTU00LDB9LDIsCXt7MHgwOCwweGZmLCB9LHsweDEwLDB4ZjAsSU1NNCB9fX0sCi17MTMsJy0nLCdCJywnIScsJyEnLE9fVFJBUF9WU3xPX1VOU1osInRyYXAvdnMiLDAsezAsMH0sMSwJe3sweDA5LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MSwncycsJ0UnLCdDJywnQycsT19YT1JDfE9fV09SRCwieG9yYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsQ1JXIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4YjAsMHhmOCxSRCB9fX0sCi17OSwnYScsJ0UnLCchJywnIScsT19UU1R8T19XT1JELCJ0c3QudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTYsMHhmZiwgfX19LAotezI0LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX1dPUkQsInN1Yi53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzMCwweGY4LFJEIH19fSwKLXsyMSwnLScsJ0UnLCdEJywnRCcsT19TVUJTfE9fV09SRCwic3Vicy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgzOCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2MCwweGY4LFJEIH19fSwKLXsxOCwnYScsJ0UnLCdEJywnRCcsT19TVUJYfE9fV09SRCwic3VieC53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiMCwweGY4LFJEIH19fSwKLXs5LCdhJywnRScsJyEnLCchJyxPX1RTVHxPX1dPUkQsInRzdC53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE2LDB4ZmYsIH19fSwKLXs4LCctJywnQicsJyEnLCchJyxPX1VOTEt8T19VTlNaLCJ1bmxrIiwxLHtGUCwwfSwxLAl7ezB4MGYsMHhmZiwgfX19LAotezI1LCdhJywnRScsJ0QnLCdEJyxPX1NVQnxPX0JZVEUsInN1Yi5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MzAsMHhmOCxSRCB9fX0sCi17MjIsJy0nLCdFJywnRCcsJ0QnLE9fU1VCU3xPX0JZVEUsInN1YnMuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDM4LDB4ZjgsUkQgfX19LAotezQsJ20nLCdFJywnRCcsJ0QnLE9fWE9SfE9fQllURSwieG9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg2MCwweGY4LFJEIH19fSwKLXsyOSwncycsJ0MnLCchJywnRScsT19TVEN8T19CWVRFLCJzdGMuYiIsMix7Q1JCLEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg5OCwweGY4LENSQiB9fX0sCi17MjcsJy0nLCdJJywnIScsJ0UnLE9fU1RNfE9fVU5TWiwic3RtIiwyLHtSTElTVCxTUERFQ30sMiwJe3sweDEyLDB4ZmYsIH0sezB4MDAsMHgwMCxSTElTVCB9fX0sCi17MTksJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX0JZVEUsInN1YnguYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezEwLCdhJywnRScsJyEnLCchJyxPX1RTVHxPX0JZVEUsInRzdC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNiwweGZmLCB9fX0sCi17MTQsJ3MnLCdFJywnIScsJ0UnLE9fVEFTfE9fQllURSwidGFzLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE3LDB4ZmYsIH19fSwKLXsyNCwnYScsJ0UnLCdEJywnRCcsT19TVUJ8T19XT1JELCJzdWIudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDMwLDB4ZjgsUkQgfX19LAotezIxLCctJywnRScsJ0QnLCdEJyxPX1NVQlN8T19XT1JELCJzdWJzLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgzOCwweGY4LFJEIH19fSwKLXszLCdtJywnRScsJ0QnLCdEJyxPX1hPUnxPX1dPUkQsInhvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjAsMHhmOCxSRCB9fX0sCi17MTgsJ2EnLCdFJywnRCcsJ0QnLE9fU1VCWHxPX1dPUkQsInN1YngudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGIwLDB4ZjgsUkQgfX19LAotezksJ2EnLCdFJywnIScsJyEnLE9fVFNUfE9fV09SRCwidHN0LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE2LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE5LDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWIsMHhmZiwgfX19LAotezM1LCdoJywnRScsJyEnLCdFJyxPX1NITEx8T19XT1JELCJzaGxsLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszMywnaCcsJ0UnLCchJywnRScsT19TSExSfE9fQllURSwic2hsci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNiwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fQllURSwic2hsbC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFhLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzUsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX1dPUkQsInNobGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYSwweGZmLCB9fX0sCi17MzYsJ2gnLCdFJywnIScsJ0UnLE9fU0hMTHxPX0JZVEUsInNobGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWEsMHhmZiwgfX19LAotezMzLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19CWVRFLCJzaGxyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszNSwnaCcsJ0UnLCchJywnRScsT19TSExMfE9fV09SRCwic2hsbC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYSwweGZmLCB9fX0sCi17MzIsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX1dPUkQsInNobHIudyIsMSx7Uk5JTkQsMH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTksMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxOSwweGZmLCB9fX0sCi17MzksJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX0JZVEUsInNoYXIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxOSwweGZmLCB9fX0sCi17MzMsJ2gnLCdFJywnIScsJ0UnLE9fU0hMUnxPX0JZVEUsInNobHIuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYiwweGZmLCB9fX0sCi17MzgsJ2gnLCdFJywnIScsJ0UnLE9fU0hBUnxPX1dPUkQsInNoYXIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTksMHhmZiwgfX19LAotezMyLCdoJywnRScsJyEnLCdFJyxPX1NITFJ8T19XT1JELCJzaGxyLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOCwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fV09SRCwic2hhci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFiLDB4ZmYsIH19fSwKLXszOSwnaCcsJ0UnLCchJywnRScsT19TSEFSfE9fQllURSwic2hhci5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOSwweGZmLCB9fX0sCi17MzEsJy0nLCchJywnIScsJyEnLE9fU0xFRVB8T19VTlNaLCJzbGVlcCIsMCx7MCwwfSwxLAl7ezB4MWEsMHhmZiwgfX19LAotezM4LCdoJywnRScsJyEnLCdFJyxPX1NIQVJ8T19XT1JELCJzaGFyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE5LDB4ZmYsIH19fSwKLXszMiwnaCcsJ0UnLCchJywnRScsT19TSExSfE9fV09SRCwic2hsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYiwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORCwwfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MSwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fV09SRCwic2hhbC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE4LDB4ZmYsIH19fSwKLXs0MiwnaCcsJ0UnLCchJywnRScsT19TSEFMfE9fQllURSwic2hhbC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxOCwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZSwweGZmLCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWUsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxOCwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTgsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTMsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19CWVRFLCJyb3R4bC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MywnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX0JZVEUsInJvdHhsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxZiwweGZmLCB9fX0sCi17NTIsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWEx8T19XT1JELCJyb3R4bC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWYsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZiwweGZmLCB9fX0sCi17NDUsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0Z8T19VTlNaLCJzY2IvZiIsMix7UlMsUENSRUw4fSwzLAl7ezB4MDEsMHhmZiwgfSx7MHhiOCwweGY4LFJTIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxZSwweGZmLCB9fX0sCi17NTAsJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19CWVRFLCJyb3R4ci5iIiwxLHtJTU04LDB9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs1MCwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX0JZVEUsInJvdHhyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWYsMHhmZiwgfX19LAotezQ5LCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fV09SRCwicm90eHIudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQyLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19CWVRFLCJzaGFsLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTgsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NDQsJy0nLCdCJywnUycsJ1MnLE9fU0NCX05FfE9fVU5TWiwic2NiL25lIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNiwweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDYsJy0nLCdCJywnUycsJ1MnLE9fU0NCX0VRfE9fVU5TWiwic2NiL2VxIiwyLHtSUyxQQ1JFTDh9LDMsCXt7MHgwNywweGZmLCB9LHsweGI4LDB4ZjgsUlMgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17NDEsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX1dPUkQsInNoYWwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzgsMH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MTgsMHhmZiwgfX19LAotezUyLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fV09SRCwicm90eGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZSwweGZmLCB9fX0sCi17NDksJ2gnLCdFJywnIScsJ0UnLE9fUk9UWFJ8T19XT1JELCJyb3R4ci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFmLDB4ZmYsIH19fSwKLXs0OCwnLScsJ0InLCchJywnIScsT19SVER8T19VTlNaLCJydGQiLDEse0lNTTE2LDB9LDMsCXt7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17NDgsJy0nLCdCJywnIScsJyEnLE9fUlREfE9fVU5TWiwicnRkIiwxLHtJTU04LDB9LDIsCXt7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NDIsJ2gnLCdFJywnIScsJ0UnLE9fU0hBTHxPX0JZVEUsInNoYWwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTgsMHhmZiwgfX19LAotezUzLCdoJywnRScsJyEnLCdFJyxPX1JPVFhMfE9fQllURSwicm90eGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWUsMHhmZiwgfX19LAotezUwLCdoJywnRScsJyEnLCdFJyxPX1JPVFhSfE9fQllURSwicm90eHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWYsMHhmZiwgfX19LAotezQ3LCctJywnQicsJyEnLCchJyxPX1JUU3xPX1VOU1osInJ0cyIsMCx7MCwwfSwxLAl7ezB4MTksMHhmZiwgfX19LAotezQxLCdoJywnRScsJyEnLCdFJyxPX1NIQUx8T19XT1JELCJzaGFsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE4LDB4ZmYsIH19fSwKLXs1MiwnaCcsJ0UnLCchJywnRScsT19ST1RYTHxPX1dPUkQsInJvdHhsLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFlLDB4ZmYsIH19fSwKLXs0OSwnaCcsJ0UnLCchJywnRScsT19ST1RYUnxPX1dPUkQsInJvdHhyLnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFmLDB4ZmYsIH19fSwKLXs5OSwnbScsJ0knLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6ZS5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NTAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17OTcsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmYuYiIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4MCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTYsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmYudyIsMix7RlBJTkRfRDgsUkR9LDIsCXt7MHg4OCwweGY4LFJEIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTcsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmYuYiIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5MCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTYsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmYudyIsMix7UlMsRlBJTkRfRDh9LDIsCXt7MHg5OCwweGY4LFJTIH0sezB4MDAsMHgwMCxGUElORF9EOCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17OTEsJ20nLCdJJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmkudyIsMix7SU1NMTYsUkR9LDMsCXt7MHg1OCwweGY4LFJEIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs4OSwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6bC5iIiwyLHtBQlM4LFJEfSwyLAl7ezB4NjAsMHhmOCxSRCB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODgsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmwudyIsMix7QUJTOCxSRH0sMiwJe3sweDY4LDB4ZjgsUkQgfSx7MHgwMCwweDAwLEFCUzggfX19LAotezg2LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpzLmIiLDIse1JTLEFCUzh9LDIsCXt7MHg3MCwweGY4LFJTIH0sezB4MDAsMHgwMCxBQlM4IH19fSwKLXs4NSwnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6cy53IiwyLHtSUyxBQlM4fSwyLAl7ezB4NzgsMHhmOCxSUyB9LHsweDAwLDB4MDAsQUJTOCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOLFJEfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk4sMH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOREVDLFJEfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs4MSwnLScsJ1MnLCchJywnRScsT19NT1ZUUEV8T19CWVRFLCJtb3Z0cGUuYiIsMix7UlMsUk59LDMsCXt7MHhhMCwweGY4LFJOIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOLDB9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOLDB9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTiwwfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTkRFQ30sMywJe3sweGIwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOREVDLDB9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7Uk5ERUMsMH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5ERUMsMH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NzYsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fQllURSwibmVnLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklOQywwfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7Uk5JTkMsMH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgxZCwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxNCwweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MTUsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTQsMHhmZiwgfX19LAotezcxLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX1dPUkQsIm5vdC53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORCwwfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNSwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxNCwweGZmLCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORF9EOCwwfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgxZCwweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezY4LCdtJywnRScsJ0QnLCdEJyxPX09SfE9fV09SRCwib3IudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3NSwnYScsJ0UnLCchJywnRScsT19ORUd8T19XT1JELCJuZWcudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezYzLCctJywnSicsJyEnLCchJyxPX1BKU1J8T19VTlNaLCJwanNyIiwxLHtBQlMyNCwwfSw0LAl7ezB4MDMsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzI0IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2NiwncycsJ0knLCdDJywnQycsT19PUkN8T19CWVRFLCJvcmMuYiIsMix7SU1NOCxDUkJ9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDQ4LDB4ZjgsQ1JCIH19fSwKLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxNCwweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxYywweGZmLCB9fX0sCi17NjksJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19CWVRFLCJvci5iIiwyLHtBQlM4LFJEfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg0MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezU5LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19CWVRFLCJyb3RsLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NzIsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fQllURSwibm90LmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MTUsMHhmZiwgfX19LAotezc2LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX0JZVEUsIm5lZy5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MiwnbScsJ0UnLCchJywnRScsT19OT1R8T19CWVRFLCJub3QuYiIsMSx7QUJTOCwwfSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17OTQsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7SU1NOCxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs3NCwnLScsJyEnLCchJywnIScsT19OT1B8T19VTlNaLCJub3AiLDAsezAsMH0sMSwJe3sweDAwLDB4ZmYsIH19fSwKLXs1OSwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fQllURSwicm90bC5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs2NSwncycsJ0knLCdDJywnQycsT19PUkN8T19XT1JELCJvcmMudyIsMix7SU1NMTYsQ1JXfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHg0OCwweGY4LENSVyB9fX0sCi17NzUsJ2EnLCdFJywnIScsJ0UnLE9fTkVHfE9fV09SRCwibmVnLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7SU1NMTYsMH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4MTUsMHhmZiwgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse0lNTTE2LDB9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDFjLDB4ZmYsIH19fSwKLXs2OCwnbScsJ0UnLCdEJywnRCcsT19PUnxPX1dPUkQsIm9yLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQwLDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDE0LDB4ZmYsIH19fSwKLXs3MSwnbScsJ0UnLCchJywnRScsT19OT1R8T19XT1JELCJub3QudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxNSwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxZCwweGZmLCB9fX0sCi17NjQsJy0nLCdKJywnIScsJyEnLE9fUEpNUHxPX1VOU1osInBqbXAiLDEse1JESU5ELDB9LDIsCXt7MHgxMSwweGZmLCB9LHsweGMwLDB4ZjgsUkRJTkQgfX19LAotezYzLCctJywnSicsJyEnLCchJyxPX1BKU1J8T19VTlNaLCJwanNyIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhjOCwweGY4LFJESU5EIH19fSwKLXs2MiwnLScsJ0InLCchJywnIScsT19QUlREfE9fVU5TWiwicHJ0ZCIsMSx7SU1NOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHgxNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17NjEsJy0nLCdCJywnIScsJyEnLE9fUFJUU3xPX1VOU1osInBydHMiLDAsezAsMH0sMiwJe3sweDExLDB4ZmYsIH0sezB4MTksMHhmZiwgfX19LAotezYyLCctJywnQicsJyEnLCchJyxPX1BSVER8T19VTlNaLCJwcnRkIiwxLHtJTU0xNiwwfSw0LAl7ezB4MTEsMHhmZiwgfSx7MHgxYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17NjQsJy0nLCdKJywnIScsJyEnLE9fUEpNUHxPX1VOU1osInBqbXAiLDEse0FCUzI0LDB9LDQsCXt7MHgxMywweGZmLCB9LHsweDAwLDB4MDAsQUJTMjQgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4MDAsIH19fSwKLXs2OSwnbScsJ0UnLCdEJywnRCcsT19PUnxPX0JZVEUsIm9yLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg0MCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOREVDLDB9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzgsJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19XT1JELCJtdWx4dS53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MWMsMHhmZiwgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OCwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX1dPUkQsIm11bHh1LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NzksJ3AnLCdFJywnRCcsJ0QnLE9fTVVMWFV8T19CWVRFLCJtdWx4dS5iIiwyLHtJTU04LFJEfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHhhOCwweGY4LFJEIH19fSwKLXs3OSwncCcsJ0UnLCdEJywnRCcsT19NVUxYVXxPX0JZVEUsIm11bHh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTgsMHhmOCxSRCB9fX0sCi17NTgsJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX1dPUkQsInJvdGwudyIsMSx7QUJTOCwwfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgxYywweGZmLCB9fX0sCi17OTQsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezc5LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fQllURSwibXVseHUuYiIsMix7QUJTMTYsUkR9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklOQ30sMywJe3sweGMwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5DLDB9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwMCwweGZmLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU4LCdoJywnRScsJyEnLCdFJyxPX1JPVEx8T19XT1JELCJyb3RsLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MWMsMHhmZiwgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxSTklORF9EMTZ9LDUsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODEsJy0nLCdTJywnIScsJ0UnLE9fTU9WVFBFfE9fQllURSwibW92dHBlLmIiLDIse1JTLEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDAwLDB4ZmYsIH0sezB4OTAsMHhmOCxSUyB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5ELFJEfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5DLFJEfSwzLAl7ezB4YzAsMHhmOCxSTiB9LHsweDAwLDB4ZmYsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17NTYsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX0JZVEUsInJvdHIuYiIsMSx7Uk5JTkRfRDE2LDB9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse1JOSU5EX0Q4LFJEfSw0LAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkRfRDh9LDQsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXs4MywnLScsJ0UnLCchJywnRCcsT19NT1ZGUEV8T19CWVRFLCJtb3ZmcGUuYiIsMix7Uk5JTkRfRDE2LFJEfSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtJTU04LFJEfSw0LAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgzLCctJywnRScsJyEnLCdEJyxPX01PVkZQRXxPX0JZVEUsIm1vdmZwZS5iIiwyLHtBQlM4LFJEfSw0LAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5ELDB9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs1NiwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fQllURSwicm90ci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORCxSRH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5MywnbScsJ1MnLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0lNTTgsMH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MWQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0FCUzgsMH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MWQsMHhmZiwgfX19LAotezkzLCdtJywnUycsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5ERUN9LDMsCXt7MHhiMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOREVDfSw0LAl7ezB4YjgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLQotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5DfSw0LAl7ezB4YzgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsUk5JTkN9LDQsCXt7MHhjOCwweGY4LFJOIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs5NCwnbScsJ0UnLCchJywnRCcsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4MCwweGY4LFJEIH19fSwKLXs5NCwnbScsJ1MnLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LFJOSU5EfSwzLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTQsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fQllURSwibW92OmcuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg5MCwweGY4LFJTIH19fSwKLQotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NMTYsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsUk5JTkRfRDh9LDUsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSTklORF9EMTZ9LDYsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTgsUk5JTkRfRDE2fSw2LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDAwLDB4MDAsIH19fSwKLQotezkzLCdtJywnRScsJyEnLCdEJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnRScsJyEnLCdEJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezk0LCdtJywnUycsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezk0LCdtJywnSScsJyEnLCdFJyxPX01PVnxPX0JZVEUsIm1vdjpnLmIiLDIse0lNTTgsQUJTOH0sNCwJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezkzLCdtJywnSScsJyEnLCdFJyxPX01PVnxPX1dPUkQsIm1vdjpnLnciLDIse0lNTTE2LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA3LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU04LEFCUzh9LDUsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA2LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MDAsMHgwMCwgfX19LAotCi0KLXs1NSwnaCcsJ0UnLCchJywnRScsT19ST1RSfE9fV09SRCwicm90ci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxZCwweGZmLCB9fX0sCi17OTMsJ20nLCdFJywnIScsJ0QnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ODAsMHhmOCxSRCB9fX0sCi17ODMsJy0nLCdFJywnIScsJ0QnLE9fTU9WRlBFfE9fQllURSwibW92ZnBlLmIiLDIse0FCUzE2LFJEfSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweGZmLCB9LHsweDgwLDB4ZjgsUkQgfX19LAotezgxLCctJywnUycsJyEnLCdFJyxPX01PVlRQRXxPX0JZVEUsIm1vdnRwZS5iIiwyLHtSUyxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDAsMHhmZiwgfSx7MHg5MCwweGY4LFJTIH19fSwKLXs5NCwnbScsJ0knLCchJywnRScsT19NT1Z8T19CWVRFLCJtb3Y6Zy5iIiwyLHtJTU04LEFCUzE2fSw1LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNiwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi0KLXs5MywnbScsJ0knLCchJywnRScsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDcsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotCi17OTMsJ20nLCdJJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7SU1NOCxBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDYsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgwMCwweDAwLCB9fX0sCi0KLXs3NiwnYScsJ0UnLCchJywnRScsT19ORUd8T19CWVRFLCJuZWcuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTQsMHhmZiwgfX19LAotezU2LCdoJywnRScsJyEnLCdFJyxPX1JPVFJ8T19CWVRFLCJyb3RyLmIiLDEse0FCUzE2LDB9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDFkLDB4ZmYsIH19fSwKLXs5MywnbScsJ0UnLCchJywnRCcsT19NT1Z8T19XT1JELCJtb3Y6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODAsMHhmOCxSRCB9fX0sCi17OTMsJ20nLCdTJywnIScsJ0UnLE9fTU9WfE9fV09SRCwibW92OmcudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDkwLDB4ZjgsUlMgfX19LAotezc4LCdwJywnRScsJ0QnLCdEJyxPX01VTFhVfE9fV09SRCwibXVseHUudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGE4LDB4ZjgsUkQgfX19LAotezc1LCdhJywnRScsJyEnLCdFJyxPX05FR3xPX1dPUkQsIm5lZy53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNCwweGZmLCB9fX0sCi17NTUsJ2gnLCdFJywnIScsJ0UnLE9fUk9UUnxPX1dPUkQsInJvdHIudyIsMSx7QUJTMTYsMH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWQsMHhmZiwgfX19LAotezcyLCdtJywnRScsJyEnLCdFJyxPX05PVHxPX0JZVEUsIm5vdC5iIiwxLHtBQlMxNiwwfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxNSwweGZmLCB9fX0sCi17NjgsJ20nLCdFJywnRCcsJ0QnLE9fT1J8T19XT1JELCJvci53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDAsMHhmOCxSRCB9fX0sCi17NzEsJ20nLCdFJywnIScsJ0UnLE9fTk9UfE9fV09SRCwibm90LnciLDEse0FCUzE2LDB9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDE1LDB4ZmYsIH19fSwKLXs1OCwnaCcsJ0UnLCchJywnRScsT19ST1RMfE9fV09SRCwicm90bC53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxYywweGZmLCB9fX0sCi17NTksJ2gnLCdFJywnIScsJ0UnLE9fUk9UTHxPX0JZVEUsInJvdGwuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MWMsMHhmZiwgfX19LAotezEyNSwnYScsJ0QnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6ZS5iIiwyLHtJTU04LFJEfSwyLAl7ezB4NDAsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOfSwzLAl7ezB4YTAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOfSw0LAl7ezB4YTgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOLENSQn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTIwLCdhJywnRCcsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDppLnciLDIse0lNTTE2LFJEfSwzLAl7ezB4NDgsMHhmOCxSRCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk4sUkR9LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE5LCdzJywnRCcsJyEnLCchJyxPX0RBRER8T19VTlNaLCJkYWRkIiwyLHtSUyxSRH0sMywJe3sweGEwLDB4ZjgsUlMgfSx7MHgwMCwweGZmLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezExNSwncycsJ0QnLCchJywnIScsT19EU1VCfE9fVU5TWiwiZHN1YiIsMix7UlMsUkR9LDMsCXt7MHhhMCwweGY4LFJTIH0sezB4MDAsMHhmZiwgfSx7MHhiMCwweGY4LFJEIH19fSwKLXsxMTMsJ3MnLCdEJywnIScsJ0QnLE9fRVhUU3xPX0JZVEUsImV4dHMuYiIsMSx7UkQsMH0sMiwJe3sweGEwLDB4ZjgsUkQgfSx7MHgxMSwweGZmLCB9fX0sCi17MTExLCdzJywnRCcsJyEnLCdEJyxPX0VYVFV8T19CWVRFLCJleHR1LmIiLDEse1JELDB9LDIsCXt7MHhhMCwweGY4LFJEIH0sezB4MTIsMHhmZiwgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkRfRDgsQ1JCfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTklORF9EMTYsQ1JCfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7QUJTMTYsMH0sMywJe3sweDEwLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhkMCwweGY4LFJEIH19fSwKLXsxMDksJy0nLCdCJywnIScsJyEnLE9fSlNSfE9fVU5TWiwianNyIiwxLHtSRElORCwwfSwyLAl7ezB4MTEsMHhmZiwgfSx7MHhkOCwweGY4LFJEIH19fSwKLXsxMTAsJy0nLCdCJywnIScsJyEnLE9fSk1QfE9fVU5TWiwiam1wIiwxLHtSRElORF9EOCwwfSwzLAl7ezB4MTEsMHhmZiwgfSx7MHhlMCwweGY4LFJESU5EX0Q4IH0sezB4MDAsMHgwMCwgfX19LAotezEwOSwnLScsJ0InLCchJywnIScsT19KU1J8T19VTlNaLCJqc3IiLDEse1JESU5EX0Q4LDB9LDMsCXt7MHgxMSwweGZmLCB9LHsweGU4LDB4ZjgsUkRJTkRfRDggfSx7MHgwMCwweDAwLCB9fX0sCi17MTEwLCctJywnQicsJyEnLCchJyxPX0pNUHxPX1VOU1osImptcCIsMSx7UkRJTkRfRDE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweGYwLDB4ZjgsUkRJTkRfRDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7UkRJTkRfRDE2LDB9LDQsCXt7MHgxMSwweGZmLCB9LHsweGY4LDB4ZjgsUkRJTkRfRDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwMCwweDAwLCB9fX0sCi17MTA5LCctJywnQicsJyEnLCchJyxPX0pTUnxPX1VOU1osImpzciIsMSx7QUJTMTYsMH0sMywJe3sweDE4LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse0FCUzE2LENSQn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse1JOREVDLFJEfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7Uk5JTkMsQ1JCfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMDcsJ3MnLCdFJywnIScsJ0MnLE9fTERDfE9fQllURSwibGRjLmIiLDIse1JOSU5ELENSQn0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg4OCwweGY4LENSQiB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE3LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fQllURSwiZGl2eHUuYiIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtJTU04LENSQn0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4ODgsMHhmOCxDUkIgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNywncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX0JZVEUsImRpdnh1LmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezExNiwncycsJ0UnLCdEJywnRCcsT19ESVZYVXxPX1dPUkQsImRpdnh1LnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMTcsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19CWVRFLCJkaXZ4dS5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YjgsMHhmOCxSRCB9fX0sCi17MTE2LCdzJywnRScsJ0QnLCdEJyxPX0RJVlhVfE9fV09SRCwiZGl2eHUudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGI4LDB4ZjgsUkQgfX19LAotezEwNywncycsJ0UnLCchJywnQycsT19MREN8T19CWVRFLCJsZGMuYiIsMix7QUJTOCxDUkJ9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDg4LDB4ZjgsQ1JCIH19fSwKLXsxMTYsJ3MnLCdFJywnRCcsJ0QnLE9fRElWWFV8T19XT1JELCJkaXZ4dS53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhiOCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTA3LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX0JZVEUsImxkYy5iIiwyLHtSTkRFQyxDUkJ9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ODgsMHhmOCxDUkIgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LFJOREVDfSwzLAl7ezB4YjAsMHhmOCxSTiB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsUk5ERUN9LDQsCXt7MHhiOCwweGY4LFJOIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkN9LDMsCXt7MHhjMCwweGY4LFJOIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklOQ30sNCwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTIyLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse1JOSU5DLFJEfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0QnLCdFJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORH0sMywJe3sweGQwLDB4ZjgsUk4gfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EfSw0LAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSTklORF9EOH0sNCwJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSTklORF9EOH0sNSwJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORF9EOCxSRH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0lNTTgsUk5JTkRfRDE2fSw1LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTIyLCdhJywnRScsJ0knLCchJyxPX0NNUHxPX1dPUkQsImNtcDpnLnciLDIse0lNTTE2LFJOSU5EX0QxNn0sNiwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEwNSwnLScsJ0UnLCchJywnQycsT19MRE18T19VTlNaLCJsZG0iLDIse1NQSU5DLFJMSVNUfSwyLAl7ezB4MDIsMHhmZiwgfSx7MHgwMCwweDAwLFJMSVNUIH19fSwKLXsxMjMsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDcwLDB4ZjgsUkQgfX19LAotezEyMywnYScsJ0UnLCdJJywnIScsT19DTVB8T19CWVRFLCJjbXA6Zy5iIiwyLHtJTU04LEFCUzh9LDQsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH19fSwKLXsxMjIsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7SU1NMTYsQUJTOH0sNSwJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixSRH0sNCwJe3sweDBjLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTA2LCdzJywnRScsJyEnLCdDJyxPX0xEQ3xPX1dPUkQsImxkYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDg4LDB4ZjgsQ1JXIH19fSwKLXsxMjIsJ2EnLCdEJywnRScsJyEnLE9fQ01QfE9fV09SRCwiY21wOmcudyIsMix7QUJTOCxSRH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTIzLCdhJywnRCcsJ0UnLCchJyxPX0NNUHxPX0JZVEUsImNtcDpnLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg3MCwweGY4LFJEIH19fSwKLXsxMjMsJ2EnLCdFJywnSScsJyEnLE9fQ01QfE9fQllURSwiY21wOmcuYiIsMix7SU1NOCxBQlMxNn0sNSwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfX19LAotezEyMiwnYScsJ0UnLCdJJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtJTU0xNixBQlMxNn0sNiwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfX19LAotezEyMiwnYScsJ0QnLCdFJywnIScsT19DTVB8T19XT1JELCJjbXA6Zy53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzAsMHhmOCxSRCB9fX0sCi17MTA0LCctJywnUycsJ0knLCchJyxPX0xJTkt8T19VTlNaLCJsaW5rIiwyLHtGUCxJTU0xNn0sMywJe3sweDFmLDB4ZmYsIH0sezB4MDAsMHgwMCxJTU0xNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxMDQsJy0nLCdTJywnSScsJyEnLE9fTElOS3xPX1VOU1osImxpbmsiLDIse0ZQLElNTTh9LDIsCXt7MHgxNywweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTiwwfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtSTkRFQywwfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5DLDB9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkQsMH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7Uk5JTkRfRDgsMH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MTMsMHhmZiwgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzEsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fQllURSwiY2xyLmIiLDEse1JOSU5EX0QxNiwwfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklORF9EMTYsMH0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7SU1NOCwwfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHgxMywweGZmLCB9fX0sCi17MTMxLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX0JZVEUsImNsci5iIiwxLHtBQlM4LDB9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTQwLCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19CWVRFLCJidHN0LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTkRFQywwfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhmMCwweGYwLElNTTQgfX19LAotezE0MCwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fQllURSwiYnRzdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg3OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5EX0Q4LDB9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxMzksJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGYwLDB4ZjAsSU1NNCB9fX0sCi17MTM5LCdiJywnRScsJ1MnLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtJTU0xNiwwfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTM5LCdiJywnRScsJ0knLCdFJyxPX0JUU1R8T19XT1JELCJidHN0LnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxMzksJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX1dPUkQsImJ0c3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlM4LDB9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDAsJ2InLCdFJywnSScsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4ZjAsMHhmMCxJTU00IH19fSwKLXsxNDAsJ2InLCdFJywnUycsJ0UnLE9fQlRTVHxPX0JZVEUsImJ0c3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDc4LDB4ZjgsUlMgfX19LAotezEzMSwnYycsJyEnLCchJywnRScsT19DTFJ8T19CWVRFLCJjbHIuYiIsMSx7QUJTMTYsMH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MTMsMHhmZiwgfX19LAotezEzOSwnYicsJ0UnLCdJJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhmMCwweGYwLElNTTQgfX19LAotezEzOSwnYicsJ0UnLCdTJywnRScsT19CVFNUfE9fV09SRCwiYnRzdC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NzgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtBQlMxNiwwfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgxMywweGZmLCB9fX0sCi17MTM3LCctJywnQicsJyEnLCchJyxPX0JWQ3xPX0JZVEUsImJ2Yy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezEzNCwnLScsJ0InLCchJywnIScsT19CVlN8T19CWVRFLCJidnMuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyOSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxMzYsJy0nLCdCJywnIScsJyEnLE9fQlZDfE9fV09SRCwiYnZjLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM4LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezEzMywnLScsJ0InLCchJywnIScsT19CVlN8T19XT1JELCJidnMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzksMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezEzMCwnYycsJyEnLCchJywnRScsT19DTFJ8T19XT1JELCJjbHIudyIsMSx7Uk4sMH0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHgxMywweGZmLCB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ5LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDgsJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTMwLCdjJywnIScsJyEnLCdFJyxPX0NMUnxPX1dPUkQsImNsci53IiwxLHtSTklOQywwfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDEzLDB4ZmYsIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDgsJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX1dPUkQsImJzZXQudyIsMix7SU1NNCxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxMzAsJ2MnLCchJywnIScsJ0UnLE9fQ0xSfE9fV09SRCwiY2xyLnciLDEse1JOSU5ELDB9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MTMsMHhmZiwgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LFJOSU5EX0Q4fSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OSwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg0OCwweGY4LFJTIH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxSTklORF9EMTZ9LDQsCXt7MHhmMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ4LCdiJywnRScsJ0knLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxSTklORF9EMTZ9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OSwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fQllURSwiYnNldC5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ5LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19CWVRFLCJic2V0LmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGMwLDB4ZjAsSU1NNCB9fX0sCi17MTQ4LCdiJywnRScsJ1MnLCdFJyxPX0JTRVR8T19XT1JELCJic2V0LnciLDIse1JTLEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0NiwnLScsJ0InLCchJywnIScsT19CU1J8T19CWVRFLCJic3IuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgwZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNDksJ2InLCdFJywnSScsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7SU1NNCxBQlMxNn0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YzAsMHhmMCxJTU00IH19fSwKLXsxNDksJ2InLCdFJywnUycsJ0UnLE9fQlNFVHxPX0JZVEUsImJzZXQuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDQ4LDB4ZjgsUlMgfX19LAotezE0OCwnYicsJ0UnLCdJJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhjMCwweGYwLElNTTQgfX19LAotezE0OCwnYicsJ0UnLCdTJywnRScsT19CU0VUfE9fV09SRCwiYnNldC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NDgsMHhmOCxSUyB9fX0sCi17MTQ1LCctJywnQicsJyEnLCchJyxPX0JTUnxPX1dPUkQsImJzci53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgxZSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDQsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7SU1NNCxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTixSRH0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTn0sMiwJe3sweGEwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk59LDIsCXt7MHhhMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOLFJEfSwyLAl7ezB4YTAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk59LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOLFJEfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOfSwyLAl7ezB4YTgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTn0sMiwJe3sweGE4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk4sUkR9LDIsCXt7MHhhOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5ERUMsUkR9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjEzLCdtJywnRScsJ0QnLCdEJyxPX0FORHxPX0JZVEUsImFuZC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5ERUN9LDIsCXt7MHhiMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOREVDfSwyLAl7ezB4YjAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTkRFQyxSRH0sMiwJe3sweGIwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOREVDfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTkRFQyxSRH0sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTkRFQ30sMiwJe3sweGI4LDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5ERUN9LDIsCXt7MHhiOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse1JOREVDLFJEfSwyLAl7ezB4YjgsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5DLFJEfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkN9LDIsCXt7MHhjMCwweGY4LFJOIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklOQ30sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5DfSwyLAl7ezB4YzAsMHhmOCxSTiB9LHsweDY4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtSTklOQyxSRH0sMiwJe3sweGMwLDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHhhMCwweGY4LFJEIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkN9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjIsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7SU1NNCxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyNCwnYScsJ0UnLCdEJywnRCcsT19BRER8T19XT1JELCJhZGQ6Zy53IiwyLHtSTklOQyxSRH0sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4MjgsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5DfSwyLAl7ezB4YzgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkMsUkR9LDIsCXt7MHhjOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxSTklOQ30sMiwJe3sweGM4LDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI1LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX0JZVEUsImFkZDpnLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOSwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fQllURSwiYWRkcy5iIiwyLHtSTklORCxSRH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtSUyxSTklORH0sMiwJe3sweGQwLDB4ZjgsUk4gfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsUk5JTkR9LDIsCXt7MHhkMCwweGY4LFJOIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDAsMHhmOCxSTiB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtJTU00LFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYxLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse0lNTTQsUk5JTkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse1JOSU5ELFJEfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse1JTLFJOSU5EfSwyLAl7ezB4ZDgsMHhmOCxSTiB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxSTklORH0sMiwJe3sweGQ4LDB4ZjgsUk4gfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkQsUkR9LDIsCXt7MHhkOCwweGY4LFJOIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIyLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX0JZVEUsImFkZDpxLmIiLDIse1FJTSxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtSTklORF9EOCxSRH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsUk5JTkRfRDh9LDMsCXt7MHhlMCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxSTklORF9EOH0sMywJe3sweGUwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnSScsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsxNjEsJ2InLCdFJywnSScsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7SU1NNCxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse1JOSU5EX0Q4LFJEfSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxSTklORF9EOH0sMywJe3sweGU4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1A4IH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MjA0LCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sUk5JTkRfRDE2fSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTgsMHhmOCxSUyB9fX0sCi17MTYxLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19XT1JELCJibm90LnciLDIse1JTLFJOSU5EX0Q4fSwzLAl7ezB4ZTgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkRfRDgsUkR9LDMsCXt7MHhlOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMTksJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX0JZVEUsImFkZHMuYiIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjAsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse1JOSU5EX0QxNixSRH0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MTYyLCdiJywnRScsJ1MnLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse1JTLFJOSU5EX0QxNn0sNCwJe3sweGYwLDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjEsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fV09SRCwiYWRkOnEudyIsMix7UUlNLFJOSU5EX0QxNn0sNCwJe3sweGY4LDB4ZjgsUk4gfSx7MHgwMCwweDAwLERJU1AxNiB9LHsweDAwLDB4MDAsIH0sezB4MDgsMHhmOCxRSU0gfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtSTklORF9EMTYsUkR9LDQsCXt7MHhmOCwweGY4LFJOIH0sezB4MDAsMHgwMCxESVNQMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsUk5JTkRfRDE2fSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7Uk5JTkRfRDE2LFJEfSw0LAl7ezB4ZjgsMHhmOCxSTiB9LHsweDAwLDB4MDAsRElTUDE2IH0sezB4MDAsMHgwMCwgfSx7MHhhMCwweGY4LFJEIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7SU1NOCxSRH0sMywJe3sweDA0LDB4ZmYsIH0sezB4MDAsMHgwMCxJTU04IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjEwLCdzJywnSScsJ1MnLCdTJyxPX0FOREN8T19CWVRFLCJhbmRjLmIiLDIse0lNTTgsQ1JCfSwzLAl7ezB4MDQsMHhmZiwgfSx7MHgwMCwweDAwLElNTTggfSx7MHg1OCwweGY4LENSQiB9fX0sCi17MjE2LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19CWVRFLCJhZGR4LmIiLDIse0lNTTgsUkR9LDMsCXt7MHgwNCwweGZmLCB9LHsweDAwLDB4MDAsSU1NOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MTYyLCdiJywnRScsJ0knLCdFJyxPX0JOT1R8T19CWVRFLCJibm90LmIiLDIse0lNTTQsQUJTOH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZTAsMHhmMCxJTU00IH19fSwKLXsyMjIsJ2EnLCdJJywnRScsJ0UnLE9fQUREfE9fQllURSwiYWRkOnEuYiIsMix7UUlNLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fQllURSwiYWRkOmcuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse0FCUzgsUkR9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMywnbScsJ0UnLCdEJywnRCcsT19BTkR8T19CWVRFLCJhbmQuYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NTAsMHhmOCxSRCB9fX0sCi17MjA0LCdiJywnRScsJ1MnLCdFJyxPX0JDTFJ8T19CWVRFLCJiY2xyLmIiLDIse1JTLEFCUzh9LDMsCXt7MHgwNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezE2MiwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtSUyxBQlM4fSwzLAl7ezB4MDUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg2OCwweGY4LFJTIH19fSwKLXsyMTYsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX0JZVEUsImFkZHguYiIsMix7QUJTOCxSRH0sMywJe3sweDA1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0lNTTE2LFJEfSw0LAl7ezB4MGMsMHhmZiwgfSx7MHgwMCwweDAwLElNTTE2IH0sezB4MDAsMHgwMCwgfSx7MHgyMCwweGY4LFJEIH19fSwKLXsyMTgsJy0nLCdFJywnRCcsJ0QnLE9fQUREU3xPX1dPUkQsImFkZHMudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDI4LDB4ZjgsUkQgfX19LAotezIxMiwnbScsJ0UnLCdEJywnRCcsT19BTkR8T19XT1JELCJhbmQudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwOSwncycsJ0knLCdTJywnUycsT19BTkRDfE9fV09SRCwiYW5kYy53IiwyLHtJTU0xNixDUld9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsQ1JXIH19fSwKLXsyMTUsJ2EnLCdFJywnRCcsJ0QnLE9fQUREWHxPX1dPUkQsImFkZHgudyIsMix7SU1NMTYsUkR9LDQsCXt7MHgwYywweGZmLCB9LHsweDAwLDB4MDAsSU1NMTYgfSx7MHgwMCwweDAwLCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LEFCUzh9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGUwLDB4ZjAsSU1NNCB9fX0sCi17MjIxLCdhJywnSScsJ0UnLCdFJyxPX0FERHxPX1dPUkQsImFkZDpxLnciLDIse1FJTSxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgwOCwweGY4LFFJTSB9fX0sCi17MjI0LCdhJywnRScsJ0QnLCdEJyxPX0FERHxPX1dPUkQsImFkZDpnLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezIxOCwnLScsJ0UnLCdEJywnRCcsT19BRERTfE9fV09SRCwiYWRkcy53IiwyLHtBQlM4LFJEfSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHgyOCwweGY4LFJEIH19fSwKLXsxNTcsJy0nLCchJywnIScsJyEnLE9fQlBUfE9fVU5TWiwiYnB0IiwwLHswLDB9LDEsCXt7MHgwYiwweGZmLCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4ZDAsMHhmMCxJTU00IH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweDUwLDB4ZjgsUkQgfX19LAotezIwMywnYicsJ0UnLCdTJywnRScsT19CQ0xSfE9fV09SRCwiYmNsci53IiwyLHtSUyxBQlM4fSwzLAl7ezB4MGQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzggfSx7MHg1OCwweGY4LFJTIH19fSwKLXsxNjEsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX1dPUkQsImJub3QudyIsMix7UlMsQUJTOH0sMywJe3sweDBkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlM4IH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MjE1LCdhJywnRScsJ0QnLCdEJyxPX0FERFh8T19XT1JELCJhZGR4LnciLDIse0FCUzgsUkR9LDMsCXt7MHgwZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTOCB9LHsweGEwLDB4ZjgsUkQgfX19LAotezIwNCwnYicsJ0UnLCdJJywnRScsT19CQ0xSfE9fQllURSwiYmNsci5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhkMCwweGYwLElNTTQgfX19LAotezIyNSwnYScsJ0UnLCdEJywnRCcsT19BRER8T19CWVRFLCJhZGQ6Zy5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4MjAsMHhmOCxSRCB9fX0sCi17MjE5LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19CWVRFLCJhZGRzLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTMsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fQllURSwiYW5kLmIiLDIse0FCUzE2LFJEfSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDQsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX0JZVEUsImJjbHIuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIxNiwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fQllURSwiYWRkeC5iIiwyLHtBQlMxNixSRH0sNCwJe3sweDE1LDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MjAzLCdiJywnRScsJ0knLCdFJyxPX0JDTFJ8T19XT1JELCJiY2xyLnciLDIse0lNTTQsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweGQwLDB4ZjAsSU1NNCB9fX0sCi17MjE4LCctJywnRScsJ0QnLCdEJyxPX0FERFN8T19XT1JELCJhZGRzLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHgyOCwweGY4LFJEIH19fSwKLXsyMTIsJ20nLCdFJywnRCcsJ0QnLE9fQU5EfE9fV09SRCwiYW5kLnciLDIse0FCUzE2LFJEfSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHg1MCwweGY4LFJEIH19fSwKLXsyMDMsJ2InLCdFJywnUycsJ0UnLE9fQkNMUnxPX1dPUkQsImJjbHIudyIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDU4LDB4ZjgsUlMgfX19LAotezIxNSwnYScsJ0UnLCdEJywnRCcsT19BRERYfE9fV09SRCwiYWRkeC53IiwyLHtBQlMxNixSRH0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4YTAsMHhmOCxSRCB9fX0sCi17MTU1LCctJywnQicsJyEnLCchJyxPX0JSQXxPX0JZVEUsImJyYS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIwLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE2MiwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fQllURSwiYm5vdC5iIiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MTUsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMiwnYScsJ0knLCdFJywnRScsT19BRER8T19CWVRFLCJhZGQ6cS5iIiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsxNjIsJ2InLCdFJywnUycsJ0UnLE9fQk5PVHxPX0JZVEUsImJub3QuYiIsMix7UlMsQUJTMTZ9LDQsCXt7MHgxNSwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDY4LDB4ZjgsUlMgfX19LAotezE2MSwnYicsJ0UnLCdJJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtJTU00LEFCUzE2fSw0LAl7ezB4MWQsMHhmZiwgfSx7MHgwMCwweDAwLEFCUzE2IH0sezB4MDAsMHgwMCwgfSx7MHhlMCwweGYwLElNTTQgfX19LAotezIyMSwnYScsJ0knLCdFJywnRScsT19BRER8T19XT1JELCJhZGQ6cS53IiwyLHtRSU0sQUJTMTZ9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDA4LDB4ZjgsUUlNIH19fSwKLXsyMjQsJ2EnLCdFJywnRCcsJ0QnLE9fQUREfE9fV09SRCwiYWRkOmcudyIsMix7QUJTMTYsUkR9LDQsCXt7MHgxZCwweGZmLCB9LHsweDAwLDB4MDAsQUJTMTYgfSx7MHgwMCwweDAwLCB9LHsweDIwLDB4ZjgsUkQgfX19LAotezE2MSwnYicsJ0UnLCdTJywnRScsT19CTk9UfE9fV09SRCwiYm5vdC53IiwyLHtSUyxBQlMxNn0sNCwJe3sweDFkLDB4ZmYsIH0sezB4MDAsMHgwMCxBQlMxNiB9LHsweDAwLDB4MDAsIH0sezB4NjgsMHhmOCxSUyB9fX0sCi17MTUyLCctJywnQicsJyEnLCchJyxPX0JSTnxPX0JZVEUsImJybi5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDIxLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE4NiwnLScsJ0InLCchJywnIScsT19CSEl8T19CWVRFLCJiaGkuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyMiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNzQsJy0nLCdCJywnIScsJyEnLE9fQkxTfE9fQllURSwiYmxzLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MjA3LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX0JZVEUsImJjYy5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI0LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezIwMSwnLScsJ0InLCchJywnIScsT19CQ1N8T19CWVRFLCJiY3MuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyNSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjUsJy0nLCdCJywnIScsJyEnLE9fQk5FfE9fQllURSwiYm5lLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MjYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTk4LCctJywnQicsJyEnLCchJyxPX0JFUXxPX0JZVEUsImJlcS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDI3LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1OSwnLScsJ0InLCchJywnIScsT19CUEx8T19CWVRFLCJicGwuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyYSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxNjgsJy0nLCdCJywnIScsJyEnLE9fQk1JfE9fQllURSwiYm1pLmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmIsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTkyLCctJywnQicsJyEnLCchJyxPX0JHRXxPX0JZVEUsImJnZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJjLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE3MSwnLScsJ0InLCchJywnIScsT19CTFR8T19CWVRFLCJibHQuYiIsMSx7UENSRUw4LDB9LDIsCXt7MHgyZCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUw4IH19fSwKLXsxODksJy0nLCdCJywnIScsJyEnLE9fQkdUfE9fQllURSwiYmd0LmIiLDEse1BDUkVMOCwwfSwyLAl7ezB4MmUsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMOCB9fX0sCi17MTgwLCctJywnQicsJyEnLCchJyxPX0JMRXxPX0JZVEUsImJsZS5iIiwxLHtQQ1JFTDgsMH0sMiwJe3sweDJmLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDggfX19LAotezE1NCwnLScsJ0InLCchJywnIScsT19CUkF8T19XT1JELCJicmEudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzAsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTUxLCctJywnQicsJyEnLCchJyxPX0JSTnxPX1dPUkQsImJybi53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzMSwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxODUsJy0nLCdCJywnIScsJyEnLE9fQkhJfE9fV09SRCwiYmhpLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDMyLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE3MywnLScsJ0InLCchJywnIScsT19CTFN8T19XT1JELCJibHMudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzMsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MjA2LCctJywnQicsJyEnLCchJyxPX0JDQ3xPX1dPUkQsImJjYy53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNCwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsyMDAsJy0nLCdCJywnIScsJyEnLE9fQkNTfE9fV09SRCwiYmNzLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDM1LDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2NCwnLScsJ0InLCchJywnIScsT19CTkV8T19XT1JELCJibmUudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4MzYsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTk3LCctJywnQicsJyEnLCchJyxPX0JFUXxPX1dPUkQsImJlcS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzNywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNTgsJy0nLCdCJywnIScsJyEnLE9fQlBMfE9fV09SRCwiYnBsLnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNhLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE2NywnLScsJ0InLCchJywnIScsT19CTUl8T19XT1JELCJibWkudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2IsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTkxLCctJywnQicsJyEnLCchJyxPX0JHRXxPX1dPUkQsImJnZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzYywweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLXsxNzAsJy0nLCdCJywnIScsJyEnLE9fQkxUfE9fV09SRCwiYmx0LnciLDEse1BDUkVMMTYsMH0sMywJe3sweDNkLDB4ZmYsIH0sezB4MDAsMHgwMCxQQ1JFTDE2IH0sezB4MDAsMHgwMCwgfX19LAotezE4OCwnLScsJ0InLCchJywnIScsT19CR1R8T19XT1JELCJiZ3QudyIsMSx7UENSRUwxNiwwfSwzLAl7ezB4M2UsMHhmZiwgfSx7MHgwMCwweDAwLFBDUkVMMTYgfSx7MHgwMCwweDAwLCB9fX0sCi17MTc5LCctJywnQicsJyEnLCchJyxPX0JMRXxPX1dPUkQsImJsZS53IiwxLHtQQ1JFTDE2LDB9LDMsCXt7MHgzZiwweGZmLCB9LHsweDAwLDB4MDAsUENSRUwxNiB9LHsweDAwLDB4MDAsIH19fSwKLS8qIAotUk4sUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOICAncycsJ0MnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTkRFQyAgJ3MnLCdDJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1DUkIsUk5JTkMgICdzJywnQycsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLFJOSU5EICAncycsJ0MnLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixSTklORF9EMTYgICdzJywnQycsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJTLFJEICAnLScsJ1gnLCchJywnIScKLVJOLDAgICdhJywnRScsJyEnLCchJwotUlMsUkQgICctJywnWCcsJyEnLCchJwotUk4sMCAgJ2EnLCdFJywnIScsJyEnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQywwICAnYScsJ0UnLCchJywnIScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLDAgICdhJywnRScsJyEnLCchJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJyEnCi1STklOQywwICAnYScsJ0UnLCchJywnIScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdhJywnRScsJyEnLCchJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJyEnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLDAgICdhJywnRScsJyEnLCchJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJyEnCi1STkRFQywwICAnYScsJ0UnLCchJywnIScKLVJOSU5DLDAgICdhJywnRScsJyEnLCchJwotQUJTOCwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0Q4LDAgICdhJywnRScsJyEnLCchJwotUkQsMCAgJ20nLCdEJywnIScsJ0QnCi1BQlMxNiwwICAnYScsJ0UnLCchJywnIScKLVJOSU5EX0QxNiwwICAnYScsJ0UnLCchJywnIScKLVJOLDAgICdzJywnRScsJyEnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ3MnLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQywwICAncycsJ0UnLCchJywnRScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdzJywnRScsJyEnLCdFJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ3MnLCdFJywnIScsJ0UnCi1STiwwICAncycsJ0UnLCchJywnRScKLVJOSU5ELDAgICdzJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ3MnLCdFJywnIScsJ0UnCi1STkRFQywwICAncycsJ0UnLCchJywnRScKLUlNTTgsMCAgJ3MnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdzJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ3MnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAncycsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAncycsJ0UnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJELDAgICdtJywnRCcsJyEnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNiwwICAncycsJ0UnLCchJywnRScKLUlNTTE2LDAgICdhJywnRScsJyEnLCchJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LDAgICdhJywnRScsJyEnLCchJwotSU1NOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnRScsJ0MnLCdDJwotSU1NOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LDAgICdhJywnRScsJyEnLCchJwotSU1NOCwwICAncycsJ0UnLCchJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLUNSQixBQlM4ICAncycsJ0MnLCchJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCwwICAnYScsJ0UnLCchJywnIScKLUFCUzgsMCAgJ3MnLCdFJywnIScsJ0UnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU00LDAgICctJywnSScsJyEnLCchJwotMCwwICAnLScsJ0InLCchJywnIScKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LENSVyAgJ3MnLCdFJywnQycsJ0MnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU0xNiwwICAnYScsJ0UnLCchJywnIScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCwwICAnYScsJ0UnLCchJywnIScKLUZQLDAgICctJywnQicsJyEnLCchJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQ1JCLEFCUzE2ICAncycsJ0MnLCchJywnRScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJMSVNULFNQREVDICAnLScsJ0knLCchJywnRScKLUNSVyxSTiAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5ERUMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5DICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORCAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsQUJTOCAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkRfRDggICdzJywnQycsJyEnLCdFJwotQ1JXLEFCUzE2ICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORF9EMTYgICdzJywnQycsJyEnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJyEnCi1BQlMxNiwwICAncycsJ0UnLCchJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LDAgICdhJywnRScsJyEnLCchJwotQ1JXLFJOICAncycsJ0MnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotQ1JCLFJOREVDICAncycsJ0MnLCchJywnRScKLUNSVyxSTklORCAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOREVDICAncycsJ0MnLCchJywnRScKLUNSQixSTklORCAgJ3MnLCdDJywnIScsJ0UnCi1DUkIsUk5JTkMgICdzJywnQycsJyEnLCdFJwotQ1JXLFJOSU5EX0Q4ICAncycsJ0MnLCchJywnRScKLUNSQixBQlM4ICAncycsJ0MnLCchJywnRScKLUNSQixSTklORF9EOCAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsQUJTOCAgJ3MnLCdDJywnIScsJ0UnCi1DUlcsUk5JTkRfRDE2ICAncycsJ0MnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotQ1JCLEFCUzE2ICAncycsJ0MnLCchJywnRScKLUNSQixSTklORF9EMTYgICdzJywnQycsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUNSVyxBQlMxNiAgJ3MnLCdDJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotQ1JCLFJOICAncycsJ0MnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotMCwwICAnLScsJyEnLCchJywnIScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0QxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUlMsUENSRUw4ICAnLScsJ0InLCdTJywnUycKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxQQ1JFTDggICctJywnQicsJ1MnLCdTJwotUlMsUENSRUw4ICAnLScsJ0InLCdTJywnUycKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNiwwICAnLScsJ0InLCchJywnIScKLUlNTTgsMCAgJy0nLCdCJywnIScsJyEnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi0wLDAgICctJywnQicsJyEnLCchJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUlMsRlBJTkRfRDggICdtJywnUycsJyEnLCdFJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0knLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk4sUkQgICctJywnRScsJyEnLCdEJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnIScsJ0QnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotUlMsUk4gICctJywnUycsJyEnLCdFJwotUk4sMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOLDAgICdhJywnRScsJyEnLCdFJwotUk4sMCAgJ20nLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOLDAgICdhJywnRScsJyEnLCdFJwotUk4sMCAgJ20nLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTkRFQyAgJy0nLCdTJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdhJywnRScsJyEnLCdFJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STiwwICAnaCcsJ0UnLCchJywnRScKLVJOREVDLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklOQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LDAgICdoJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1STkRFQywwICAnYScsJ0UnLCchJywnRScKLVJOREVDLDAgICdtJywnRScsJyEnLCdFJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUk5ERUMsMCAgJ20nLCdFJywnIScsJ0UnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLDAgICdhJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ20nLCdFJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQywwICAnYScsJ0UnLCchJywnRScKLUlNTTgsQ1JCICAncycsJ0knLCdDJywnQycKLUlNTTE2LENSVyAgJ3MnLCdJJywnQycsJ0MnCi1STklOQywwICAnbScsJ0UnLCchJywnRScKLVJOSU5DLDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORCwwICAnbScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkQsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORCwwICAnbScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnbScsJ0UnLCchJywnRScKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMyNCwwICAnLScsJ0onLCchJywnIScKLUlNTTgsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnSScsJ0MnLCdDJwotSU1NOCwwICAnYScsJ0UnLCchJywnRScKLUlNTTgsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOLFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU04LDAgICdtJywnRScsJyEnLCdFJwotQUJTOCwwICAnYScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ20nLCdFJywnIScsJ0UnCi1STiwwICAnbScsJ0UnLCchJywnRScKLVJOSU5ELDAgICdtJywnRScsJyEnLCdFJwotUk5ERUMsMCAgJ20nLCdFJywnIScsJ0UnCi1STklOQywwICAnbScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnbScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdtJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1JTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi0wLDAgICctJywnIScsJyEnLCchJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LENSVyAgJ3MnLCdJJywnQycsJ0MnCi1JTU0xNiwwICAnYScsJ0UnLCchJywnRScKLUlNTTE2LDAgICdtJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzgsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlM4LDAgICdtJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJESU5ELDAgICctJywnSicsJyEnLCchJwotUkRJTkQsMCAgJy0nLCdKJywnIScsJyEnCi1JTU04LDAgICctJywnQicsJyEnLCchJwotMCwwICAnLScsJ0InLCchJywnIScKLUlNTTE2LDAgICctJywnQicsJyEnLCchJwotQUJTMjQsMCAgJy0nLCdKJywnIScsJyEnCi1BQlMxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STiwwICAnYScsJ0UnLCchJywnRScKLVJOREVDLDAgICdhJywnRScsJyEnLCdFJwotUk5JTkMsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORCwwICAnYScsJ0UnLCchJywnRScKLUFCUzgsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORF9EOCwwICAnYScsJ0UnLCchJywnRScKLUFCUzE2LDAgICdhJywnRScsJyEnLCdFJwotSU1NMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1STklORF9EMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1STkRFQyxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STkRFQywwICAnaCcsJ0UnLCchJywnRScKLVJOSU5DLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAncCcsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1JTU04LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdwJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlM4LDAgICdoJywnRScsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotQUJTMTYsUkQgICdwJywnRScsJ0QnLCdEJwotUk4sUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICdwJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdwJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdwJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3AnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ3AnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdwJywnRScsJ0QnLCdEJwotUlMsUk5JTkMgICctJywnUycsJyEnLCdFJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTklORCAgJy0nLCdTJywnIScsJ0UnCi1STklORCwwICAnaCcsJ0UnLCchJywnRScKLVJTLFJOSU5EX0Q4ICAnLScsJ1MnLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklORF9EMTYgICctJywnUycsJyEnLCdFJwotUlMsQUJTOCAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTiAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTkRFQyAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTklORCAgJy0nLCdTJywnIScsJ0UnCi1SUyxSTklOQyAgJy0nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnLScsJ1MnLCchJywnRScKLVJOSU5ELFJEICAnLScsJ0UnLCchJywnRCcKLVJTLEFCUzE2ICAnLScsJ1MnLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJy0nLCdTJywnIScsJ0UnCi1STklOQyxSRCAgJy0nLCdFJywnIScsJ0QnCi1STklORF9EMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJy0nLCdTJywnIScsJ0UnCi1STklORF9EOCxSRCAgJy0nLCdFJywnIScsJ0QnCi1JTU04LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnIScsJ0QnCi1JTU04LFJEICAnLScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICctJywnRScsJyEnLCdEJwotUk4sUkQgICctJywnRScsJyEnLCdEJwotUk5JTkMsMCAgJ2gnLCdFJywnIScsJ0UnCi1STklORCxSRCAgJy0nLCdFJywnIScsJ0QnCi1STkRFQyxSRCAgJy0nLCdFJywnIScsJ0QnCi1JTU04LFJEICAnLScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICctJywnRScsJyEnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJyEnLCdEJwotQUJTMTYsUkQgICctJywnRScsJyEnLCdEJwotUk5JTkRfRDE2LFJEICAnLScsJ0UnLCchJywnRCcKLVJOSU5ELDAgICdoJywnRScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJOSU5DLFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsMCAgJ2gnLCdFJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdJJywnIScsJ0QnCi1SUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU04LDAgICdoJywnRScsJyEnLCdFJwotQUJTOCwwICAnaCcsJ0UnLCchJywnRScKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotUk5JTkMsUkQgICctJywnRScsJyEnLCdEJwotSU1NOCxSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTkRFQyAgJ20nLCdJJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCi1JTU04LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5DICAnbScsJ0knLCchJywnRScKLVJOSU5ELFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkQgICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EMTYgICdtJywnUycsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotSU1NOCxBQlM4ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCchJywnRCcKLVJTLEFCUzE2ICAnLScsJ1MnLCchJywnRScKLUlNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTMTYgICdtJywnSScsJyEnLCdFJwotQUJTMTYsMCAgJ2EnLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLUFCUzE2LFJEICAncCcsJ0UnLCdEJywnRCcKLUFCUzE2LDAgICdhJywnRScsJyEnLCdFJwotQUJTMTYsMCAgJ2gnLCdFJywnIScsJ0UnCi1SUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUk5JTkQgICdtJywnSScsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJOREVDICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkMgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LEFCUzggICdtJywnSScsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOREVDICAnbScsJ0knLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTE2LEFCUzggICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUFCUzE2LDAgICdtJywnRScsJyEnLCdFJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotQUJTMTYsMCAgJ20nLCdFJywnIScsJ0UnCi1BQlMxNiwwICAnaCcsJ0UnLCchJywnRScKLVJTLEZQSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUZQSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzE2LDAgICdoJywnRScsJyEnLCdFJwotSU1NOCxSRCAgJ20nLCdJJywnIScsJ0QnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkQgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkMgICdtJywnUycsJyEnLCdFJwotUlMsUk5ERUMgICdtJywnUycsJyEnLCdFJwotUk5JTkQsUkQgICdtJywnRScsJyEnLCdEJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJyEnLCdEJwotUk4sUkQgICdtJywnRScsJyEnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1JTU0xNixSRCAgJ20nLCdJJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOREVDICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5EICAnbScsJ0knLCchJywnRScKLVJTLFJOSU5EX0QxNiAgJ20nLCdTJywnIScsJ0UnCi1SUyxBQlMxNiAgJ20nLCdTJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSRCAgJ20nLCdFJywnIScsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJyEnLCdEJwotSU1NMTYsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTMTYgICdtJywnSScsJyEnLCdFJwotRlBJTkRfRDgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCi1STkRFQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUkQgICdtJywnSScsJyEnLCdEJwotSU1NOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxBQlM4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOREVDICAnbScsJ0knLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsUk5JTkRfRDggICdtJywnUycsJyEnLCdFJwotSU1NOCxSTklORF9EOCAgJ20nLCdJJywnIScsJ0UnCi1BQlMxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LEFCUzggICdtJywnSScsJyEnLCdFJwotUlMsQUJTMTYgICdtJywnUycsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LEFCUzE2ICAnbScsJ0knLCchJywnRScKLUlNTTgsUk5JTkRfRDE2ICAnbScsJ0knLCchJywnRScKLUFCUzgsUkQgICdtJywnRScsJyEnLCdEJwotUlMsQUJTOCAgJ20nLCdTJywnIScsJ0UnCi1STklORCxSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxSTklORCAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTklOQyAgJ20nLCdTJywnIScsJ0UnCi1SUyxSTkRFQyAgJ20nLCdTJywnIScsJ0UnCi1STixSRCAgJ20nLCdFJywnIScsJ0QnCi1SUyxGUElORF9EOCAgJ20nLCdTJywnIScsJ0UnCi1STklOQyxSRCAgJ20nLCdFJywnIScsJ0QnCi1GUElORF9EOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU04LFJEICAnbScsJ0knLCchJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCchJywnRCcKLVJTLFJOSU5EX0Q4ICAnbScsJ1MnLCchJywnRScKLUlNTTgsUk5JTkQgICdtJywnSScsJyEnLCdFJwotSU1NOCxSTklOQyAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOREVDICAnbScsJ0knLCchJywnRScKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCchJywnRCcKLVJTLEFCUzggICdtJywnUycsJyEnLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnIScsJ0QnCi1JTU0xNixSRCAgJ20nLCdJJywnIScsJ0QnCi1JTU04LEFCUzggICdtJywnSScsJyEnLCdFJwotUlMsUk5JTkRfRDE2ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJOSU5EICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOSU5DICAnbScsJ0knLCchJywnRScKLUlNTTE2LFJOREVDICAnbScsJ0knLCchJywnRScKLVJTLEFCUzE2ICAnbScsJ1MnLCchJywnRScKLUlNTTE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTgsUk5JTkRfRDggICdtJywnSScsJyEnLCdFJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCchJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCchJywnRCcKLUlNTTE2LFJOSU5EX0Q4ICAnbScsJ0knLCchJywnRScKLUlNTTgsQUJTMTYgICdtJywnSScsJyEnLCdFJwotSU1NMTYsQUJTOCAgJ20nLCdJJywnIScsJ0UnCi1JTU04LFJOSU5EX0QxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixBQlMxNiAgJ20nLCdJJywnIScsJ0UnCi1JTU0xNixSTklORF9EMTYgICdtJywnSScsJyEnLCdFJwotSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOICAnYScsJ0UnLCdJJywnIScKLVJOLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORCxDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkMsQ1JXICAncycsJ0UnLCchJywnQycKLVJOREVDLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EOCxDUlcgICdzJywnRScsJyEnLCdDJwotSU1NMTYsUk4gICdhJywnRScsJ0knLCchJwotQUJTMTYsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5EX0QxNixDUlcgICdzJywnRScsJyEnLCdDJwotUk4sQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzgsQ1JXICAncycsJ0UnLCchJywnQycKLUlNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKLVJOLFJEICAncycsJ0UnLCdEJywnRCcKLVJTLFJEICAncycsJ0QnLCchJywnIScKLVJTLFJEICAncycsJ0QnLCchJywnIScKLVJELDAgICdzJywnRCcsJyEnLCdEJwotUkQsMCAgJ3MnLCdEJywnIScsJ0QnCi1STixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EOCxDUkIgICdzJywnRScsJyEnLCdDJwotUk4sQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5DLENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORCxDUkIgICdzJywnRScsJyEnLCdDJwotUk5ERUMsQ1JXICAncycsJ0UnLCchJywnQycKLVJOSU5ELENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STkRFQyxDUkIgICdzJywnRScsJyEnLCdDJwotUk5JTkMsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzgsQ1JXICAncycsJ0UnLCchJywnQycKLUFCUzgsQ1JCICAncycsJ0UnLCchJywnQycKLUlNTTgsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5EX0Q4LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EOCxDUkIgICdzJywnRScsJyEnLCdDJwotQUJTMTYsQ1JCICAncycsJ0UnLCchJywnQycKLUFCUzE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1JTU0xNixDUlcgICdzJywnRScsJyEnLCdDJwotUk5JTkRfRDE2LENSVyAgJ3MnLCdFJywnIScsJ0MnCi1STklORF9EMTYsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5EX0QxNixDUkIgICdzJywnRScsJyEnLCdDJwotQUJTMTYsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORCwwICAnLScsJ0InLCchJywnIScKLVJESU5ELDAgICctJywnQicsJyEnLCchJwotUkRJTkRfRDgsMCAgJy0nLCdCJywnIScsJyEnCi1SRElORF9EOCwwICAnLScsJ0InLCchJywnIScKLVJESU5EX0QxNiwwICAnLScsJ0InLCchJywnIScKLVJESU5EX0QxNiwwICAnLScsJ0InLCchJywnIScKLUFCUzE2LDAgICctJywnQicsJyEnLCchJwotUkQsMCAgJ3MnLCdEJywnIScsJ0QnCi1BQlMxNixDUkIgICdzJywnRScsJyEnLCdDJwotUkQsMCAgJ3MnLCdEJywnIScsJ0QnCi1STixDUlcgICdzJywnRScsJyEnLCdDJwotUk5ERUMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkMsQ1JCICAncycsJ0UnLCchJywnQycKLVJOSU5DLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5ELENSQiAgJ3MnLCdFJywnIScsJ0MnCi1STklORCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdzJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAncycsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0UnLCchJywnQycKLUlNTTgsUkQgICdzJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAncycsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAncycsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAncycsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ3MnLCdFJywnRCcsJ0QnCi1BQlM4LENSQiAgJ3MnLCdFJywnIScsJ0MnCi1BQlM4LFJEICAncycsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0QnLCdJJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLENSQiAgJ3MnLCdFJywnIScsJ0MnCi1JTU04LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk5JTkMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkMgICdhJywnRScsJ0knLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NOCxSTklORCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLVNQSU5DLFJMSVNUICAnLScsJ0UnLCchJywnQycKLUlNTTgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixDUlcgICdzJywnRScsJyEnLCdDJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLUFCUzE2LFJEICAnYScsJ0QnLCdFJywnIScKLUZQLElNTTE2ICAnLScsJ1MnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5DLFJEICAnYScsJ0QnLCdFJywnIScKLVJOREVDLFJEICAnYScsJ0QnLCdFJywnIScKLVJOSU5EX0Q4LFJEICAnYScsJ0QnLCdFJywnIScKLUFCUzgsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk5JTkMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkQgICdhJywnRScsJ0knLCchJwotSU1NMTYsUk4gICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5ERUMgICdhJywnRScsJ0knLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkRfRDE2LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzggICdhJywnRScsJ0knLCchJwotSU1NMTYsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLUZQLElNTTggICctJywnUycsJ0knLCchJwotSU1NOCxSRCAgJ2EnLCdEJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnSScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlM4LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTE2LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOREVDICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlM4ICAnYScsJ0UnLCdJJywnIScKLUlNTTE2LFJOSU5EX0QxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1STixSRCAgJ2EnLCdEJywnRScsJyEnCi1STkRFQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklOQyxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJEICAnYScsJ0QnLCdJJywnIScKLVJOSU5ELFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUk4gICdhJywnRScsJ0knLCchJwotSU1NOCxSTklORCAgJ2EnLCdFJywnSScsJyEnCi1JTU04LFJOSU5DICAnYScsJ0UnLCdJJywnIScKLUlNTTgsUk5ERUMgICdhJywnRScsJ0knLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1STklORF9EOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1BQlMxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LFJOSU5EX0Q4ICAnYScsJ0UnLCdJJywnIScKLVJOSU5EX0QxNixSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU04LEFCUzE2ICAnYScsJ0UnLCdJJywnIScKLUlNTTgsUk5JTkRfRDE2ICAnYScsJ0UnLCdJJywnIScKLVJOLFJEICAnYScsJ0QnLCdFJywnIScKLUlNTTgsUkQgICdhJywnRCcsJ0knLCchJwotUk5JTkMsUkQgICdhJywnRCcsJ0UnLCchJwotUk5JTkQsUkQgICdhJywnRCcsJ0UnLCchJwotUk5ERUMsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0knLCchJwotUk5JTkRfRDgsUkQgICdhJywnRCcsJ0UnLCchJwotQUJTOCxSRCAgJ2EnLCdEJywnRScsJyEnCi1JTU0xNixSTiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTkRFQyAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORCAgJ2EnLCdFJywnSScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUk5JTkMgICdhJywnRScsJ0knLCchJwotQUJTMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsUkQgICdhJywnRCcsJ0UnLCchJwotSU1NMTYsQUJTOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EOCAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixBQlMxNiAgJ2EnLCdFJywnSScsJyEnCi1JTU0xNixSTklORF9EMTYgICdhJywnRScsJ0knLCchJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLVJOLDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVJOREVDLDAgICdjJywnIScsJyEnLCdFJwotUk5JTkMsMCAgJ2MnLCchJywnIScsJ0UnCi1STklORCwwICAnYycsJyEnLCchJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0Q4LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJOSU5EX0QxNiwwICAnYycsJyEnLCchJywnRScKLVJOSU5EX0QxNiwwICAnYycsJyEnLCchJywnRScKLUlNTTgsMCAgJ2MnLCchJywnIScsJ0UnCi1BQlM4LDAgICdjJywnIScsJyEnLCdFJwotUk4sMCAgJ2MnLCchJywnIScsJ0UnCi1STklORCwwICAnYycsJyEnLCchJywnRScKLVJOSU5DLDAgICdjJywnIScsJyEnLCdFJwotUk5ERUMsMCAgJ2MnLCchJywnIScsJ0UnCi1BQlM4LDAgICdjJywnIScsJyEnLCdFJwotUk5JTkRfRDgsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU0xNiwwICAnYycsJyEnLCchJywnRScKLUFCUzE2LDAgICdjJywnIScsJyEnLCdFJwotUk5JTkRfRDE2LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUk5ERUMsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EOCwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU0xNiwwICAnYycsJyEnLCchJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUFCUzgsMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUFCUzE2LDAgICdjJywnIScsJyEnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1BQlMxNiwwICAnYycsJyEnLCchJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTkRFQyAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUk4sMCAgJ2MnLCchJywnIScsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1STklOQywwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1STklORCwwICAnYycsJyEnLCchJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlMxNiAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDE2ICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVJOLFJEICAnLScsJ0UnLCdEJywnRCcKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUlMsUk4gICdiJywnRScsJ1MnLCdFJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1STixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnLScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJTLFJOREVDICAnYicsJ0UnLCdTJywnRScKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5ERUMgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk4gICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTkRFQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklOQyAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJy0nLCdFJywnRCcsJ0QnCi1SUyxSTklOQyAgJ2InLCdFJywnUycsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUUlNLFJOSU5DICAnYScsJ0knLCdFJywnRScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5DICAnYicsJ0UnLCdJJywnRScKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJTLFJOSU5DICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5DLFJEICAnbScsJ0UnLCdEJywnRCcKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTklORCAgJ2InLCdFJywnUycsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5EICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkQgICdiJywnRScsJ0knLCdFJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnLScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EICAnYicsJ0UnLCdTJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NNCxSTklORF9EOCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EX0Q4ICAnYicsJ0UnLCdJJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxSTklORF9EOCAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1SUyxSTiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOREVDICAnYicsJ0UnLCdJJywnRScKLUlNTTQsUk5JTkMgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkQgICdiJywnRScsJ1MnLCdFJwotUlMsUk5JTkMgICdiJywnRScsJ1MnLCdFJwotUlMsUk5ERUMgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORCAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOICAnYicsJ0UnLCdJJywnRScKLVJTLFJOSU5EX0Q4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsQUJTOCAgJ2InLCdFJywnSScsJ0UnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLUlNTTQsUk5JTkRfRDggICdiJywnRScsJ0knLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1SUyxSTklORF9EMTYgICdiJywnRScsJ1MnLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxSTklORF9EMTYgICdiJywnRScsJ0knLCdFJwotUlMsUk5JTkRfRDggICdiJywnRScsJ1MnLCdFJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVBDUkVMOCwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTgsQ1JCICAncycsJ0knLCdTJywnUycKLUlNTTE2LENSVyAgJ3MnLCdJJywnUycsJ1MnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1JTU00LFJOSU5EX0QxNiAgJ2InLCdFJywnSScsJ0UnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLVJOSU5EX0QxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsUk5JTkRfRDE2ICAnYicsJ0UnLCdTJywnRScKLVJTLFJOSU5EX0QxNiAgJ2InLCdFJywnUycsJ0UnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU04LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTgsUkQgICdtJywnRScsJ0QnLCdEJwotSU1NOCxDUkIgICdzJywnSScsJ1MnLCdTJwotSU1NOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STixSRCAgJ20nLCdFJywnRCcsJ0QnCi1STkRFQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ20nLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0Q4LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJOSU5EX0QxNixSRCAgJ20nLCdFJywnRCcsJ0QnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotSU1NNCxBQlM4ICAnYicsJ0UnLCdJJywnRScKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotUlMsQUJTOCAgJ2InLCdFJywnUycsJ0UnCi1BQlM4LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUlNTTE2LFJEICAnbScsJ0UnLCdEJywnRCcKLUlNTTE2LENSVyAgJ3MnLCdJJywnUycsJ1MnCi1JTU0xNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotUUlNLEFCUzggICdhJywnSScsJ0UnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlM4LFJEICAnLScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLTAsMCAgJy0nLCchJywnIScsJyEnCi1JTU00LEFCUzggICdiJywnRScsJ0knLCdFJwotQUJTOCxSRCAgJ20nLCdFJywnRCcsJ0QnCi1SUyxBQlM4ICAnYicsJ0UnLCdTJywnRScKLVJTLEFCUzggICdiJywnRScsJ1MnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1JTU00LEFCUzE2ICAnYicsJ0UnLCdJJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnLScsJ0UnLCdEJywnRCcKLUFCUzE2LFJEICAnbScsJ0UnLCdEJywnRCcKLVJTLEFCUzE2ICAnYicsJ0UnLCdTJywnRScKLUFCUzE2LFJEICAnYScsJ0UnLCdEJywnRCcKLUlNTTQsQUJTMTYgICdiJywnRScsJ0knLCdFJwotQUJTMTYsUkQgICctJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdtJywnRScsJ0QnLCdEJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUk4sUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkQsUkQgICctJywnRScsJ0QnLCdEJwotUk5JTkMsUkQgICctJywnRScsJ0QnLCdEJwotUk5ERUMsUkQgICctJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJy0nLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1JTU0xNixSRCAgJy0nLCdFJywnRCcsJ0QnCi1STklORF9EMTYsUkQgICctJywnRScsJ0QnLCdEJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotSU1NNCxBQlMxNiAgJ2InLCdFJywnSScsJ0UnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUlMsQUJTMTYgICdiJywnRScsJ1MnLCdFJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUENSRUw4LDAgICctJywnQicsJyEnLCchJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVFJTSxSTkRFQyAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkMgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDgsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVBDUkVMMTYsMCAgJy0nLCdCJywnIScsJyEnCi1QQ1JFTDE2LDAgICctJywnQicsJyEnLCchJwotUENSRUwxNiwwICAnLScsJ0InLCchJywnIScKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOREVDLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5DLFJEICAnYScsJ0UnLCdEJywnRCcKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotSU1NMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORF9EOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk4sUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1STkRFQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkQgICdhJywnSScsJ0UnLCdFJwotUk5JTkMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOREVDICAnYScsJ0knLCdFJywnRScKLVJOSU5ELFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTklORF9EOCAgJ2EnLCdJJywnRScsJ0UnCi1JTU04LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlM4ICAnYScsJ0knLCdFJywnRScKLUFCUzgsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EX0QxNiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sQUJTMTYgICdhJywnSScsJ0UnLCdFJwotQUJTMTYsUkQgICdhJywnRScsJ0QnLCdEJwotUk5JTkRfRDE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVJOLFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxSTiAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5ERUMgICdhJywnSScsJ0UnLCdFJwotUk5ERUMsUkQgICdhJywnRScsJ0QnLCdEJwotUUlNLFJOSU5EICAnYScsJ0knLCdFJywnRScKLVFJTSxSTklOQyAgJ2EnLCdJJywnRScsJ0UnCi1STklOQyxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1STklORCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sQUJTOCAgJ2EnLCdJJywnRScsJ0UnCi1RSU0sUk5JTkRfRDggICdhJywnSScsJ0UnLCdFJwotUk5JTkRfRDgsUkQgICdhJywnRScsJ0QnLCdEJwotQUJTOCxSRCAgJ2EnLCdFJywnRCcsJ0QnCi1BQlMxNixSRCAgJ2EnLCdFJywnRCcsJ0QnCi1RSU0sUk5JTkRfRDE2ICAnYScsJ0knLCdFJywnRScKLUlNTTE2LFJEICAnYScsJ0UnLCdEJywnRCcKLVFJTSxBQlMxNiAgJ2EnLCdJJywnRScsJ0UnCi1STklORF9EMTYsUkQgICdhJywnRScsJ0QnLCdEJwotKi8gCi17MCwwLDB9fQotI2VuZGlmCi07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvaHBwYS1kaXMuYyBiL29wY29kZXMvaHBwYS1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0NWQ1ZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2hwcGEtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGZvciB0aGUgUEEtUklTQy4gU29tZXdoYXQgZGVyaXZlZCBmcm9tIHNwYXJjLXBpbnNuLmMuCi0gICBDb3B5cmlnaHQgMTk4OSwgMTk5MCwgMTk5MiwgMTk5MyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotICAgQ29udHJpYnV0ZWQgYnkgdGhlIENlbnRlciBmb3IgU29mdHdhcmUgU2NpZW5jZSBhdCB0aGUKLSAgIFVuaXZlcnNpdHkgb2YgVXRhaCAocGEtZ2RiLWJ1Z3NAY3MudXRhaC5lZHUpLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAibGliaHBwYS5oIgotI2luY2x1ZGUgIm9wY29kZS9ocHBhLmgiCi0KLS8qIEludGVnZXIgcmVnaXN0ZXIgbmFtZXMsIGluZGV4ZWQgYnkgdGhlIG51bWJlcnMgd2hpY2ggYXBwZWFyIGluIHRoZQotICAgb3Bjb2Rlcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmVnX25hbWVzW10gPSAKLSB7ImZsYWdzIiwgInIxIiwgInJwIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiwKLSAgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgInIxNiIsICJyMTciLCAicjE4IiwgInIxOSIsCi0gICJyMjAiLCAicjIxIiwgInIyMiIsICJyMjMiLCAicjI0IiwgInIyNSIsICJyMjYiLCAiZHAiLCAicmV0MCIsICJyZXQxIiwKLSAgInNwIiwgInIzMSJ9OwotCi0vKiBGbG9hdGluZyBwb2ludCByZWdpc3RlciBuYW1lcywgaW5kZXhlZCBieSB0aGUgbnVtYmVycyB3aGljaCBhcHBlYXIgaW4gdGhlCi0gICBvcGNvZGVzLiAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmcF9yZWdfbmFtZXNbXSA9IAotIHsiZnBzciIsICJmcGUyIiwgImZwZTQiLCAiZnBlNiIsIAotICAiZnI0IiwgImZyNSIsICJmcjYiLCAiZnI3IiwgImZyOCIsIAotICAiZnI5IiwgImZyMTAiLCAiZnIxMSIsICJmcjEyIiwgImZyMTMiLCAiZnIxNCIsICJmcjE1IiwgCi0gICJmcjE2IiwgImZyMTciLCAiZnIxOCIsICJmcjE5IiwgImZyMjAiLCAiZnIyMSIsICJmcjIyIiwgImZyMjMiLAotICAiZnIyNCIsICJmcjI1IiwgImZyMjYiLCAiZnIyNyIsICJmcjI4IiwgImZyMjkiLCAiZnIzMCIsICJmcjMxIn07Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50IENPUkVfQUREUjsKLQotLyogR2V0IGF0IHZhcmlvdXMgcmVsZXZlbnQgZmllbGRzIG9mIGFuIGluc3RydWN0aW9uIHdvcmQuICovCi0KLSNkZWZpbmUgTUFTS181IDB4MWYKLSNkZWZpbmUgTUFTS18xMSAweDdmZgotI2RlZmluZSBNQVNLXzE0IDB4M2ZmZgotI2RlZmluZSBNQVNLXzIxIDB4MWZmZmZmCi0KLS8qIFRoaXMgbWFjcm8gZ2V0cyBiaXQgZmllbGRzIHVzaW5nIEhQJ3MgbnVtYmVyaW5nIChNU0IgPSAwKSAqLwotCi0jZGVmaW5lIEdFVF9GSUVMRChYLCBGUk9NLCBUTykgXAotICAoKFgpID4+ICgzMSAtIChUTykpICYgKCgxIDw8ICgoVE8pIC0gKEZST00pICsgMSkpIC0gMSkpCi0KLS8qIFNvbWUgb2YgdGhlc2UgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byAyLWQgYXJyYXlzIGJlY2F1c2UgdGhleQotICAgY29uc3VtZSBsZXNzIHN0b3JhZ2UgdGhpcyB3YXkuICBJZiB0aGUgbWFpbnRlbmFuY2UgYmVjb21lcyBhCi0gICBwcm9ibGVtLCBjb252ZXJ0IHRoZW0gYmFjayB0byBjb25zdCAxLWQgcG9pbnRlciBhcnJheXMuICAqLwotc3RhdGljIGNvbnN0IGNoYXIgY29udHJvbF9yZWdbXVs2XSA9IHsKLSAgInJjdHIiLCAiY3IxIiwgImNyMiIsICJjcjMiLCAiY3I0IiwgImNyNSIsICJjcjYiLCAiY3I3IiwKLSAgInBpZHIxIiwgInBpZHIyIiwgImNjciIsICJzYXIiLCAicGlkcjMiLCAicGlkcjQiLAotICAiaXZhIiwgImVpZW0iLCAiaXRtciIsICJwY3NxIiwgInBjb3EiLCAiaWlyIiwgImlzciIsCi0gICJpb3IiLCAiaXBzdyIsICJlaXJyIiwgInRyMCIsICJ0cjEiLCAidHIyIiwgInRyMyIsCi0gICJ0cjQiLCAidHI1IiwgInRyNiIsICJ0cjciCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciBjb21wYXJlX2NvbmRfbmFtZXNbXVs1XSA9IHsKLSAgIiIsICIsPSIsICIsPCIsICIsPD0iLCAiLDw8IiwgIiw8PD0iLCAiLHN2IiwKLSAgIixvZCIsICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsPiIsICIsPj49IiwKLSAgIiw+PiIsICIsbnN2IiwgIixldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciBhZGRfY29uZF9uYW1lc1tdWzVdID0gewotICAiIiwgIiw9IiwgIiw8IiwgIiw8PSIsICIsbnV2IiwgIix6bnYiLCAiLHN2IiwKLSAgIixvZCIsICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsPiIsICIsdXYiLAotICAiLHZueiIsICIsbnN2IiwgIixldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbG9naWNhbF9jb25kX25hbWVzW10gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLDw9IiwgMCwgMCwgMCwgIixvZCIsCi0gICIsdHIiLCAiLDw+IiwgIiw+PSIsICIsPiIsIDAsIDAsIDAsICIsZXYifTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1bml0X2NvbmRfbmFtZXNbXSA9IHsKLSAgIiIsIDAsICIsc2J6IiwgIixzaHoiLCAiLHNkYyIsIDAsICIsc2JjIiwgIixzaGMiLAotICAiLHRyIiwgMCwgIixuYnoiLCAiLG5oeiIsICIsbmRjIiwgMCwgIixuYmMiLCAiLG5oYyIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciBzaGlmdF9jb25kX25hbWVzW11bNF0gPSB7Ci0gICIiLCAiLD0iLCAiLDwiLCAiLG9kIiwgIix0ciIsICIsPD4iLCAiLD49IiwgIixldiIKLX07Ci1zdGF0aWMgY29uc3QgY2hhciBpbmRleF9jb21wbF9uYW1lc1tdWzRdID0geyIiLCAiLG0iLCAiLHMiLCAiLHNtIn07Ci1zdGF0aWMgY29uc3QgY2hhciBzaG9ydF9sZHN0X2NvbXBsX25hbWVzW11bNF0gPSB7IiIsICIsbWEiLCAiIiwgIixtYiJ9Owotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNob3J0X2J5dGVzX2NvbXBsX25hbWVzW10gPSB7Ci0gICIiLCAiLGIsbSIsICIsZSIsICIsZSxtIgotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbG9hdF9mb3JtYXRfbmFtZXNbXSA9IHsiLHNnbCIsICIsZGJsIiwgIiIsICIscXVhZCJ9Owotc3RhdGljIGNvbnN0IGNoYXIgZmxvYXRfY29tcF9uYW1lc1tdWzhdID0KLXsKLSAgIixmYWxzZT8iLCAiLGZhbHNlIiwgIiw/IiwgIiwhPD0+IiwgIiw9IiwgIiw9dCIsICIsPz0iLCAiLCE8PiIsCi0gICIsIT8+PSIsICIsPCIsICIsPzwiLCAiLCE+PSIsICIsIT8+IiwgIiw8PSIsICIsPzw9IiwgIiwhPiIsCi0gICIsIT88PSIsICIsPiIsICIsPz4iLCAiLCE8PSIsICIsIT88IiwgIiw+PSIsICIsPz49IiwgIiwhPCIsCi0gICIsIT89IiwgIiw8PiIsICIsIT0iLCAiLCE9dCIsICIsIT8iLCAiLDw9PiIsICIsdHJ1ZT8iLCAiLHRydWUiCi19OwotCi0vKiBGb3IgYSBidW5jaCBvZiBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb25zIGZvcm0gYW4gaW5kZXggaW50byBhIAotICAgY29tcGxldGVyIG5hbWUgdGFibGUuICovCi0jZGVmaW5lIEdFVF9DT01QTChpbnNuKSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIHwgXAotCQkJIEdFVF9GSUVMRCAoaW5zbiwgMTgsIDE4KSA8PCAxKQotCi0jZGVmaW5lIEdFVF9DT05EKGluc24pIChHRVRfRklFTEQgKChpbnNuKSwgMTYsIDE4KSArIFwKLQkJCShHRVRfRklFTEQgKChpbnNuKSwgMTksIDE5KSA/IDggOiAwKSkKLQotLyogVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCByZWdpc3RlcnMuICBQdXQgdGhlc2UgZmlyc3QsIHNvIGdjYydzIGZ1bmN0aW9uCi0gICBpbmxpbmluZyBjYW4gZG8gaXRzIHN0dWZmLiAgKi8KLQotI2RlZmluZSBmcHV0c19maWx0ZXJlZChTVFIsRikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIFNUUikKLQotc3RhdGljIHZvaWQKLWZwdXRfcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHJlZyA/IHJlZ19uYW1lc1tyZWddIDogInIwIik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1mcHV0X2ZwX3JlZyAocmVnLCBpbmZvKQotICAgICB1bnNpZ25lZCByZWc7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCByZWcgPyBmcF9yZWdfbmFtZXNbcmVnXSA6ICJmcjAiKTsKLX0KLQotc3RhdGljIHZvaWQKLWZwdXRfZnBfcmVnX3IgKHJlZywgaW5mbykKLSAgICAgdW5zaWduZWQgcmVnOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICAvKiBTcGVjaWFsIGNhc2UgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIHJlZ2lzdGVycy4gICovCi0gIGlmIChyZWcgPCA0KQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZnBlJWQiLCByZWcgKiAyICsgMSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzUiIsIHJlZyA/IGZwX3JlZ19uYW1lc1tyZWddIAotCQkJCQkJICAgIDogImZyMCIpOwotfQotCi1zdGF0aWMgdm9pZAotZnB1dF9jcmVnIChyZWcsIGluZm8pCi0gICAgIHVuc2lnbmVkIHJlZzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIGNvbnRyb2xfcmVnW3JlZ10pOwotfQotCi0vKiBwcmludCBjb25zdGFudHMgd2l0aCBzaWduICovCi0KLXN0YXRpYyB2b2lkCi1mcHV0X2NvbnN0IChudW0sIGluZm8pCi0gICAgIHVuc2lnbmVkIG51bTsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaWYgKChpbnQpbnVtIDwgMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0leCIsIC0oaW50KW51bSk7Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4IiwgbnVtKTsKLX0KLQotLyogUm91dGluZXMgdG8gZXh0cmFjdCB2YXJpb3VzIHNpemVkIGNvbnN0YW50cyBvdXQgb2YgaHBwYQotICAgaW5zdHJ1Y3Rpb25zLiAqLwotCi0vKiBleHRyYWN0IGEgMy1iaXQgc3BhY2UgcmVnaXN0ZXIgbnVtYmVyIGZyb20gYSBiZSwgYmxlLCBtdHNwIG9yIG1mc3AgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMyAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIEdFVF9GSUVMRCAod29yZCwgMTgsIDE4KSA8PCAyIHwgR0VUX0ZJRUxEICh3b3JkLCAxNiwgMTcpOwotfQotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzVfbG9hZCAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCA+PiAxNiAmIE1BU0tfNSwgNSk7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgc3R7Ymh3fXMgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfNV9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuIGxvd19zaWduX2V4dGVuZCAod29yZCAmIE1BU0tfNSwgNSk7Ci19Ci0KLS8qIGV4dHJhY3QgdGhlIGltbWVkaWF0ZSBmaWVsZCBmcm9tIGEgYnJlYWsgaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF81cl9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuICh3b3JkICYgTUFTS181KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSB7c3J9c20gaW5zdHJ1Y3Rpb24gKi8KLXN0YXRpYyB1bnNpZ25lZAotZXh0cmFjdF81Ul9zdG9yZSAod29yZCkKLSAgICAgdW5zaWduZWQgd29yZDsKLXsKLSAgcmV0dXJuICh3b3JkID4+IDE2ICYgTUFTS181KTsKLX0KLQotLyogZXh0cmFjdCB0aGUgaW1tZWRpYXRlIGZpZWxkIGZyb20gYSBiYiBpbnN0cnVjdGlvbiAqLwotc3RhdGljIHVuc2lnbmVkCi1leHRyYWN0XzVRX3N0b3JlICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gKHdvcmQgPj4gMjEgJiBNQVNLXzUpOwotfQotCi0vKiBleHRyYWN0IGFuIDExIGJpdCBpbW1lZGlhdGUgZmllbGQgKi8KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTEgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBsb3dfc2lnbl9leHRlbmQgKHdvcmQgJiBNQVNLXzExLCAxMSk7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxNCBiaXQgaW1tZWRpYXRlIGZpZWxkICovCi1zdGF0aWMgaW50Ci1leHRyYWN0XzE0ICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gbG93X3NpZ25fZXh0ZW5kICh3b3JkICYgTUFTS18xNCwgMTQpOwotfQotCi0vKiBleHRyYWN0IGEgMjEgYml0IGNvbnN0YW50ICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMjEgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIGludCB2YWw7Ci0KLSAgd29yZCAmPSBNQVNLXzIxOwotICB3b3JkIDw8PSAxMTsKLSAgdmFsID0gR0VUX0ZJRUxEICh3b3JkLCAyMCwgMjApOwotICB2YWwgPDw9IDExOwotICB2YWwgfD0gR0VUX0ZJRUxEICh3b3JkLCA5LCAxOSk7Ci0gIHZhbCA8PD0gMjsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgNSwgNik7Ci0gIHZhbCA8PD0gNTsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgMCwgNCk7Ci0gIHZhbCA8PD0gMjsKLSAgdmFsIHw9IEdFVF9GSUVMRCAod29yZCwgNywgOCk7Ci0gIHJldHVybiBzaWduX2V4dGVuZCAodmFsLCAyMSkgPDwgMTE7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxMiBiaXQgY29uc3RhbnQgZnJvbSBicmFuY2ggaW5zdHJ1Y3Rpb25zICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3RfMTIgKHdvcmQpCi0gICAgIHVuc2lnbmVkIHdvcmQ7Ci17Ci0gIHJldHVybiBzaWduX2V4dGVuZCAoR0VUX0ZJRUxEICh3b3JkLCAxOSwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDI5LCAyOSkgPDwgMTAgfAotICAgICAgICAgICAgICAgICAgICAgICh3b3JkICYgMHgxKSA8PCAxMSwgMTIpIDw8IDI7Ci19Ci0KLS8qIGV4dHJhY3QgYSAxNyBiaXQgY29uc3RhbnQgZnJvbSBicmFuY2ggaW5zdHJ1Y3Rpb25zLCByZXR1cm5pbmcgdGhlCi0gICAxOSBiaXQgc2lnbmVkIHZhbHVlLiAqLwotCi1zdGF0aWMgaW50Ci1leHRyYWN0XzE3ICh3b3JkKQotICAgICB1bnNpZ25lZCB3b3JkOwotewotICByZXR1cm4gc2lnbl9leHRlbmQgKEdFVF9GSUVMRCAod29yZCwgMTksIDI4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEICh3b3JkLCAyOSwgMjkpIDw8IDEwIHwKLSAgICAgICAgICAgICAgICAgICAgICBHRVRfRklFTEQgKHdvcmQsIDExLCAxNSkgPDwgMTEgfAotICAgICAgICAgICAgICAgICAgICAgICh3b3JkICYgMHgxKSA8PCAxNiwgMTcpIDw8IDI7Ci19Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbi4gICovCi1pbnQKLXByaW50X2luc25faHBwYSAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGludCBpbnNuLCBpOwotCi0gIHsKLSAgICBpbnQgc3RhdHVzID0KLSAgICAgICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLSAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICB7Ci0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JcmV0dXJuIC0xOwotICAgICAgfQotICB9Ci0KLSAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTU9QQ09ERVM7ICsraSkKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcGFfb3Bjb2RlICpvcGNvZGUgPSAmcGFfb3Bjb2Rlc1tpXTsKLSAgICAgIGlmICgoaW5zbiAmIG9wY29kZS0+bWFzaykgPT0gb3Bjb2RlLT5tYXRjaCkKLQl7Ci0JICByZWdpc3RlciBjb25zdCBjaGFyICpzOwotCSAgCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb3Bjb2RlLT5uYW1lKTsKLQotCSAgaWYgKCFzdHJjaHIgKCJjZkNZPD8hQC0rJlU+fm5ITlpGSU1hZHV8Iiwgb3Bjb2RlLT5hcmdzWzBdKSkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JICBmb3IgKHMgPSBvcGNvZGUtPmFyZ3M7ICpzICE9ICdcMCc7ICsrcykKLQkgICAgewotCSAgICAgIHN3aXRjaCAoKnMpCi0JCXsKLQkJY2FzZSAneCc6Ci0JCSAgZnB1dF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMTEsIDE1KSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1gnOgotICAgICAgICAgICAgICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjUsIDI1KSkKLQkJICAgICAgZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdiJzoKLQkJICBmcHV0X3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdeJzoKLQkJICBmcHV0X2NyZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnRSc6Ci0gICAgICAgICAgICAgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkgICAgICBmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDYsIDEwKSwgaW5mbyk7Ci0JCSAgZWxzZQotCQkgICAgICBmcHV0X2ZwX3JlZyAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd0JzoKLQkJICBmcHV0X3JlZyAoR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAndic6Ci0gICAgICAgICAgICAgICAgICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNSwgMjUpKQotCQkgICAgICBmcHV0X2ZwX3JlZ19yIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICAgZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3knOgotCQkgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDI3LCAzMSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICc0JzoKLQkJICB7Ci0JCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCk7Ci0KLQkJICAgIHJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkgICAgZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJzYnOgotCQkgIHsKLQkJICAgIGludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDExLCAxNSk7Ci0KLQkJICAgIHJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkgICAgZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJzcnOgotCQkgIHsKLQkJICAgIGludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDI3LCAzMSk7Ci0KLQkJICAgIHJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkgICAgZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJzgnOgotCQkgIHsKLQkJICAgIGludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDE2LCAyMCk7Ci0KLQkJICAgIHJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkgICAgZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJzknOgotCQkgIHsKLQkJICAgIGludCByZWcgPSBHRVRfRklFTEQgKGluc24sIDIxLCAyNSk7Ci0KLQkJICAgIHJlZyB8PSAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpIDw8IDQpOwotCQkgICAgZnB1dF9mcF9yZWcgKHJlZywgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCWNhc2UgJzUnOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNV9sb2FkIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3MnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLAotCQkJCQkgInNyJWQiLCBHRVRfRklFTEQgKGluc24sIDE2LCAxNykpOwotCQkgIGJyZWFrOwotCQljYXNlICdTJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInNyJWQiLCBleHRyYWN0XzMgKGluc24pKTsKLQkJICBicmVhazsKLQkJY2FzZSAnYyc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBpbmRleF9jb21wbF9uYW1lc1tHRVRfQ09NUEwgKGluc24pXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0MnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgc2hvcnRfbGRzdF9jb21wbF9uYW1lc1tHRVRfQ09NUEwgKGluc24pXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1knOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkgICAgc2hvcnRfYnl0ZXNfY29tcGxfbmFtZXNbR0VUX0NPTVBMIChpbnNuKV0pOwotCQkgIGJyZWFrOwotCQkvKiB0aGVzZSBmb3VyIGNvbmRpdGlvbnMgYXJlIGZvciB0aGUgc2V0IG9mIGluc3RydWN0aW9ucwotCQkgICB3aGljaCBkaXN0aW5ndWlzaCB0cnVlL2ZhbHNlIGNvbmRpdGlvbnMgYnkgb3Bjb2RlIHJhdGhlcgotCQkgICB0aGFuIGJ5IHRoZSAnZicgYml0IChzaWdoKTogY29tYiwgY29taWIsIGFkZGIsIGFkZGliICovCi0JCWNhc2UgJzwnOgotCQkgIGZwdXRzX2ZpbHRlcmVkIChjb21wYXJlX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSwKLQkJCQkgIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICc/JzoKLQkJICBmcHV0c19maWx0ZXJlZCAoY29tcGFyZV9jb25kX25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KQotCQkJCSAgKyBHRVRfRklFTEQgKGluc24sIDQsIDQpICogOF0sIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdAJzoKLQkJICBmcHV0c19maWx0ZXJlZCAoYWRkX2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpCi0JCQkJICArIEdFVF9GSUVMRCAoaW5zbiwgNCwgNCkgKiA4XSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2EnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJIGNvbXBhcmVfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJICBicmVhazsKLQkJY2FzZSAnZCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCQkgYWRkX2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJyEnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkJCSAgICBhZGRfY29uZF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE2LCAxOCldKTsKLQkJICBicmVhazsKLQotCQljYXNlICcmJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIGxvZ2ljYWxfY29uZF9uYW1lc1tHRVRfQ09ORCAoaW5zbildKTsKLQkJICBicmVhazsKLQkJY2FzZSAnVSc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICB1bml0X2NvbmRfbmFtZXNbR0VUX0NPTkQgKGluc24pXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3wnOgotCQljYXNlICc+JzoKLQkJY2FzZSAnfic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCSAgICAoaW5mby0+c3RyZWFtLCAiJXMiLAotCQkgICAgIHNoaWZ0X2NvbmRfbmFtZXNbR0VUX0ZJRUxEIChpbnNuLCAxNiwgMTgpXSk7Ci0KLQkJICAvKiBJZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gYXJncyBpcyAnbicsIGl0IHdpbGwgaGFuZGxlCi0JCSAgICAgcHV0dGluZyBvdXQgdGhlIHNwYWNlLiAgKi8KLQkJICBpZiAoc1sxXSAhPSAnbicpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICBicmVhazsKLQkJY2FzZSAnVic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81X3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3InOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfNXJfc3RvcmUgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnUic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF81Ul9zdG9yZSAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdRJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzVRX3N0b3JlIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ2knOgotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTEgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnaic6Ci0JCSAgZnB1dF9jb25zdCAoZXh0cmFjdF8xNCAoaW5zbiksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdrJzoKLQkJICBmcHV0X2NvbnN0IChleHRyYWN0XzIxIChpbnNuKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ24nOgotCQkgIGlmIChpbnNuICYgMHgyKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsbiAiKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAiKTsKLQkJICBicmVhazsKLQkJY2FzZSAnTic6Ci0JCSAgaWYgKChpbnNuICYgMHgyMCkgJiYgc1sxXSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG4gIik7Ci0JCSAgZWxzZSBpZiAoaW5zbiAmIDB4MjApCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIixuIik7Ci0JCSAgZWxzZSBpZiAoc1sxXSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCQkgIGJyZWFrOwotCQljYXNlICd3JzoKLQkJICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKG1lbWFkZHIgKyA4ICsgZXh0cmFjdF8xMiAoaW5zbiksCi0JCQkJCSAgICAgICBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnVyc6Ci0JCSAgLyogMTcgYml0IFBDLXJlbGF0aXZlIGJyYW5jaC4gICovCi0JCSAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciArIDggCi0JCQkJCQkrIGV4dHJhY3RfMTcgKGluc24pKSwKLQkJCQkJICAgICAgIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICd6JzoKLQkJICAvKiAxNyBiaXQgZGlzcGxhY2VtZW50LiAgVGhpcyBpcyBhbiBvZmZzZXQgZnJvbSBhIHJlZ2lzdGVyCi0JCSAgICAgc28gaXQgZ2V0cyBkaXNhc3NzZW1ibGVkIGFzIGp1c3QgYSBudW1iZXIsIG5vdCBhbnkgc29ydAotCQkgICAgIG9mIGFkZHJlc3MuICAqLwotCQkgIGZwdXRfY29uc3QgKGV4dHJhY3RfMTcgKGluc24pLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAncCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIDMxIC0gR0VUX0ZJRUxEIChpbnNuLCAyMiwgMjYpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnUCc6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkJICAgIEdFVF9GSUVMRCAoaW5zbiwgMjIsIDI2KSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ1QnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQiLAotCQkJCSAgICAzMiAtIEdFVF9GSUVMRCAoaW5zbiwgMjcsIDMxKSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0EnOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTgpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnWic6Ci0JCSAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjYsIDI2KSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLG0gIik7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0QnOgotCQkgIGZwdXRfY29uc3QgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMzEpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnZic6Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJWQiLCBHRVRfRklFTEQgKGluc24sIDIzLCAyNSkpOwotCQkgIGJyZWFrOwotCQljYXNlICdPJzoKLQkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCA2LDIwKSA8PCA1IHwKLQkJCSAgICAgICBHRVRfRklFTEQgKGluc24sIDI3LCAzMSkpLCBpbmZvKTsKLQkJICBicmVhazsKLQkJY2FzZSAnbyc6Ci0JCSAgZnB1dF9jb25zdCAoR0VUX0ZJRUxEIChpbnNuLCA2LCAyMCksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICczJzoKLQkJICB7Ci0JCSAgICBpbnQgcmVnID0gR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjIpOwotCQkgICAgcmVnIHw9IEdFVF9GSUVMRCAoaW5zbiwgMTYsIDE4KSA8PCAyOwotCQkgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjMsIDIzKSAhPSAwKQotCQkgICAgICBmcHV0X2ZwX3JlZ19yIChyZWcsIGluZm8pOwotCQkgICAgZWxzZQotCQkgICAgICBmcHV0X2ZwX3JlZyAocmVnLCBpbmZvKTsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQotCQljYXNlICcyJzoKLQkJICBmcHV0X2NvbnN0ICgoR0VUX0ZJRUxEIChpbnNuLCA2LCAyMikgPDwgNSB8Ci0JCQkgICAgICAgR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzEnOgotCQkgIGZwdXRfY29uc3QgKChHRVRfRklFTEQgKGluc24sIDExLCAyMCkgPDwgNSB8Ci0JCQkgICAgICAgR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJzAnOgotCQkgIGZwdXRfY29uc3QgKChHRVRfRklFTEQgKGluc24sIDE2LCAyMCkgPDwgNSB8Ci0JCQkgICAgICAgR0VUX0ZJRUxEIChpbnNuLCAyNywgMzEpKSwgaW5mbyk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ3UnOgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCVkIiwgR0VUX0ZJRUxEIChpbnNuLCAyMywgMjUpKTsKLQkJICBicmVhazsKLQkJY2FzZSAnRic6Ci0JCSAgLyogaWYgbm8gZGVzdGluYXRpb24gY29tcGxldGVyIGFuZCBub3QgYmVmb3JlIGEgY29tcGxldGVyCi0JCSAgICAgZm9yIGZjbXAsIG5lZWQgYSBzcGFjZSBoZXJlICovCi0JCSAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjEsIDIyKSA9PSAxIHx8IHNbMV0gPT0gJ00nKQotCQkgICAgZnB1dHNfZmlsdGVyZWQgKGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQgKGluc24sIDE5LCAyMCldLAotCQkJCSAgICBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJCSAgIGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAoaW5zbiwgMTksIDIwKV0pOwotCQkgIGJyZWFrOwotCQljYXNlICdHJzoKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIGZsb2F0X2Zvcm1hdF9uYW1lc1tHRVRfRklFTEQgKGluc24sCi0JCQkJCQkJCSAgMTcsIDE4KV0pOwotCQkgIGJyZWFrOwotCQljYXNlICdIJzoKLQkJICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyNiwgMjYpID09IDEpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzICIsCi0JCQkJICAgIGZsb2F0X2Zvcm1hdF9uYW1lc1swXSk7Ci0JCSAgZWxzZQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyAiLAotCQkJCSAgICBmbG9hdF9mb3JtYXRfbmFtZXNbMV0pOwotCQkgIGJyZWFrOwotCQljYXNlICdJJzoKLQkJICAvKiBpZiBubyBkZXN0aW5hdGlvbiBjb21wbGV0ZXIgYW5kIG5vdCBiZWZvcmUgYSBjb21wbGV0ZXIKLQkJICAgICBmb3IgZmNtcCwgbmVlZCBhIHNwYWNlIGhlcmUgKi8KLQkJICBpZiAoR0VUX0ZJRUxEIChpbnNuLCAyMSwgMjIpID09IDEgfHwgc1sxXSA9PSAnTScpCi0JCSAgICBmcHV0c19maWx0ZXJlZCAoZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRCAoaW5zbiwgMjAsIDIwKV0sCi0JCQkJICAgIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgZmxvYXRfZm9ybWF0X25hbWVzW0dFVF9GSUVMRAotCQkJCQkJCSAgICAgIChpbnNuLCAyMCwgMjApXSk7Ci0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0onOgotICAgICAgICAgICAgICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMjQsIDI0KSkKLQkJICAgICAgZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCA2LCAxMCksIGluZm8pOwotCQkgIGVsc2UKLQkJICAgICAgZnB1dF9mcF9yZWcgKEdFVF9GSUVMRCAoaW5zbiwgNiwgMTApLCBpbmZvKTsKLQkJICAgICAgCi0JCSAgYnJlYWs7Ci0JCWNhc2UgJ0snOgotICAgICAgICAgICAgICAgICAgaWYgKEdFVF9GSUVMRCAoaW5zbiwgMTksIDE5KSkKLQkJICAgICAgZnB1dF9mcF9yZWdfciAoR0VUX0ZJRUxEIChpbnNuLCAxMSwgMTUpLCBpbmZvKTsKLQkJICBlbHNlCi0JCSAgICAgIGZwdXRfZnBfcmVnIChHRVRfRklFTEQgKGluc24sIDExLCAxNSksIGluZm8pOwotCQkgIGJyZWFrOwotCQljYXNlICdNJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMgIiwKLQkJCQkJICAgZmxvYXRfY29tcF9uYW1lc1tHRVRfRklFTEQKLQkJCQkJCQkgICAgICAoaW5zbiwgMjcsIDMxKV0pOwotCQkgIGJyZWFrOwotCQlkZWZhdWx0OgotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWMiLCAqcyk7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAgfQotCSAgcmV0dXJuIHNpemVvZihpbnNuKTsKLQl9Ci0gICAgfQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlOHgiLCBpbnNuKTsKLSAgcmV0dXJuIHNpemVvZihpbnNuKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaTM4Ni1kaXMuYyBiL29wY29kZXMvaTM4Ni1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFkOGY3ZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2kzODYtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjg4ICswLDAgQEAKLS8qIFByaW50IGkzODYgaW5zdHJ1Y3Rpb25zIGZvciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODgsIDg5LCA5MSwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQi4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyoKLSAqIDgwMzg2IGluc3RydWN0aW9uIHByaW50ZXIgYnkgUGFjZSBXaWxsaXNzb24gKHBhY2VAcHJlcC5haS5taXQuZWR1KQotICogSnVseSAxOTg4Ci0gKiAgbW9kaWZpZWQgYnkgSm9obiBIYXNzZXkgKGhhc3NleUBkZy1ydHAuZGcuY29tKQotICovCi0KLS8qCi0gKiBUaGUgbWFpbiB0YWJsZXMgZGVzY3JpYmluZyB0aGUgaW5zdHJ1Y3Rpb25zIGlzIGVzc2VudGlhbGx5IGEgY29weQotICogb2YgdGhlICJPcGNvZGUgTWFwIiBjaGFwdGVyIChBcHBlbmRpeCBBKSBvZiB0aGUgSW50ZWwgODAzODYKLSAqIFByb2dyYW1tZXJzIE1hbnVhbC4gIFVzdWFsbHksIHRoZXJlIGlzIGEgY2FwaXRhbCBsZXR0ZXIsIGZvbGxvd2VkCi0gKiBieSBhIHNtYWxsIGxldHRlci4gIFRoZSBjYXBpdGFsIGxldHRlciB0ZWxsIHRoZSBhZGRyZXNzaW5nIG1vZGUsCi0gKiBhbmQgdGhlIHNtYWxsIGxldHRlciB0ZWxscyBhYm91dCB0aGUgb3BlcmFuZCBzaXplLiAgUmVmZXIgdG8KLSAqIHRoZSBJbnRlbCBtYW51YWwgZm9yIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2RlZmluZSBNQVhMRU4gMjAKLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi0jaWZuZGVmIFVOSVhXQVJFX0NPTVBBVAotLyogU2V0IG5vbi16ZXJvIGZvciBicm9rZW4sIGNvbXBhdGlibGUgaW5zdHJ1Y3Rpb25zLiAgU2V0IHRvIHplcm8gZm9yCi0gICBub24tYnJva2VuIG9wY29kZXMuICAqLwotI2RlZmluZSBVTklYV0FSRV9DT01QQVQgMQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgZmV0Y2hfZGF0YSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0cnVjdCBkaXNfcHJpdmF0ZQotewotICAvKiBQb2ludHMgdG8gZmlyc3QgYnl0ZSBub3QgZmV0Y2hlZC4gICovCi0gIGJmZF9ieXRlICptYXhfZmV0Y2hlZDsKLSAgYmZkX2J5dGUgdGhlX2J1ZmZlcltNQVhMRU5dOwotICBiZmRfdm1hIGluc25fc3RhcnQ7Ci0gIGptcF9idWYgYmFpbG91dDsKLX07Ci0KLS8qIFRoZSBvcGNvZGUgZm9yIHRoZSBmd2FpdCBpbnN0cnVjdGlvbiwgd2hpY2ggd2UgdHJlYXQgYXMgYSBwcmVmaXgKLSAgIHdoZW4gd2UgY2FuLiAgKi8KLSNkZWZpbmUgRldBSVRfT1BDT0RFICgweDliKQotCi0vKiBGbGFncyBmb3IgdGhlIHByZWZpeGVzIGZvciB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4gIFNlZSBiZWxvdy4gICovCi1zdGF0aWMgaW50IHByZWZpeGVzOwotCi0vKiBGbGFncyBmb3IgcHJlZml4ZXMgd2hpY2ggd2Ugc29tZWhvdyBoYW5kbGVkIHdoZW4gcHJpbnRpbmcgdGhlCi0gICBjdXJyZW50IGluc3RydWN0aW9uLiAgKi8KLXN0YXRpYyBpbnQgdXNlZF9wcmVmaXhlczsKLQotLyogRmxhZ3Mgc3RvcmVkIGluIFBSRUZJWEVTLiAgKi8KLSNkZWZpbmUgUFJFRklYX1JFUFogMQotI2RlZmluZSBQUkVGSVhfUkVQTlogMgotI2RlZmluZSBQUkVGSVhfTE9DSyA0Ci0jZGVmaW5lIFBSRUZJWF9DUyA4Ci0jZGVmaW5lIFBSRUZJWF9TUyAweDEwCi0jZGVmaW5lIFBSRUZJWF9EUyAweDIwCi0jZGVmaW5lIFBSRUZJWF9FUyAweDQwCi0jZGVmaW5lIFBSRUZJWF9GUyAweDgwCi0jZGVmaW5lIFBSRUZJWF9HUyAweDEwMAotI2RlZmluZSBQUkVGSVhfREFUQSAweDIwMAotI2RlZmluZSBQUkVGSVhfQUREUiAweDQwMAotI2RlZmluZSBQUkVGSVhfRldBSVQgMHg4MDAKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IGRpc19wcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IGRpc19wcml2YXRlICpwcml2ID0gKHN0cnVjdCBkaXNfcHJpdmF0ZSAqKWluZm8tPnByaXZhdGVfZGF0YTsKLSAgYmZkX3ZtYSBzdGFydCA9IHByaXYtPmluc25fc3RhcnQgKyAocHJpdi0+bWF4X2ZldGNoZWQgLSBwcml2LT50aGVfYnVmZmVyKTsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChzdGFydCwKLQkJCQkgICAgICBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBhZGRyIC0gcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBkaWQgbWFuYWdlIHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUsIHRoZW4KLSAgICAgICAgIHByaW50X2luc25faTM4NiB3aWxsIGRvIHNvbWV0aGluZyBzZW5zaWJsZS4gIE90aGVyd2lzZSwgcHJpbnQKLSAgICAgICAgIGFuIGVycm9yLiAgV2UgZG8gdGhhdCBoZXJlIGJlY2F1c2UgdGhpcyBpcyB3aGVyZSB3ZSBrbm93Ci0gICAgICAgICBTVEFUVVMuICAqLwotICAgICAgaWYgKHByaXYtPm1heF9mZXRjaGVkID09IHByaXYtPnRoZV9idWZmZXIpCi0JKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotICByZXR1cm4gMTsKLX0KLQotI2RlZmluZSBFYiBPUF9FLCBiX21vZGUKLSNkZWZpbmUgaW5kaXJFYiBPUF9pbmRpckUsIGJfbW9kZQotI2RlZmluZSBHYiBPUF9HLCBiX21vZGUKLSNkZWZpbmUgRXYgT1BfRSwgdl9tb2RlCi0jZGVmaW5lIEVkIE9QX0UsIGRfbW9kZQotI2RlZmluZSBpbmRpckV2IE9QX2luZGlyRSwgdl9tb2RlCi0jZGVmaW5lIEV3IE9QX0UsIHdfbW9kZQotI2RlZmluZSBNYSBPUF9FLCB2X21vZGUKLSNkZWZpbmUgTSBPUF9FLCAwCQkvKiBsZWEgKi8KLSNkZWZpbmUgTXAgT1BfRSwgMAkJLyogMzIgb3IgNDggYml0IG1lbW9yeSBvcGVyYW5kIGZvciBMRFMsIExFUyBldGMgKi8KLSNkZWZpbmUgR3YgT1BfRywgdl9tb2RlCi0jZGVmaW5lIEd3IE9QX0csIHdfbW9kZQotI2RlZmluZSBSZCBPUF9SZCwgZF9tb2RlCi0jZGVmaW5lIEliIE9QX0ksIGJfbW9kZQotI2RlZmluZSBzSWIgT1Bfc0ksIGJfbW9kZQkvKiBzaWduIGV4dGVuZWQgYnl0ZSAqLwotI2RlZmluZSBJdiBPUF9JLCB2X21vZGUKLSNkZWZpbmUgSXcgT1BfSSwgd19tb2RlCi0jZGVmaW5lIEpiIE9QX0osIGJfbW9kZQotI2RlZmluZSBKdiBPUF9KLCB2X21vZGUKLSNkZWZpbmUgQ2QgT1BfQywgZF9tb2RlCi0jZGVmaW5lIERkIE9QX0QsIGRfbW9kZQotI2RlZmluZSBUZCBPUF9ULCBkX21vZGUKLQotI2RlZmluZSBlQVggT1BfUkVHLCBlQVhfcmVnCi0jZGVmaW5lIGVCWCBPUF9SRUcsIGVCWF9yZWcKLSNkZWZpbmUgZUNYIE9QX1JFRywgZUNYX3JlZwotI2RlZmluZSBlRFggT1BfUkVHLCBlRFhfcmVnCi0jZGVmaW5lIGVTUCBPUF9SRUcsIGVTUF9yZWcKLSNkZWZpbmUgZUJQIE9QX1JFRywgZUJQX3JlZwotI2RlZmluZSBlU0kgT1BfUkVHLCBlU0lfcmVnCi0jZGVmaW5lIGVESSBPUF9SRUcsIGVESV9yZWcKLSNkZWZpbmUgQUwgT1BfUkVHLCBhbF9yZWcKLSNkZWZpbmUgQ0wgT1BfUkVHLCBjbF9yZWcKLSNkZWZpbmUgREwgT1BfUkVHLCBkbF9yZWcKLSNkZWZpbmUgQkwgT1BfUkVHLCBibF9yZWcKLSNkZWZpbmUgQUggT1BfUkVHLCBhaF9yZWcKLSNkZWZpbmUgQ0ggT1BfUkVHLCBjaF9yZWcKLSNkZWZpbmUgREggT1BfUkVHLCBkaF9yZWcKLSNkZWZpbmUgQkggT1BfUkVHLCBiaF9yZWcKLSNkZWZpbmUgQVggT1BfUkVHLCBheF9yZWcKLSNkZWZpbmUgRFggT1BfUkVHLCBkeF9yZWcKLSNkZWZpbmUgaW5kaXJEWCBPUF9SRUcsIGluZGlyX2R4X3JlZwotCi0jZGVmaW5lIFN3IE9QX1NFRywgd19tb2RlCi0jZGVmaW5lIEFwIE9QX0RJUiwgMAotI2RlZmluZSBPYiBPUF9PRkYsIGJfbW9kZQotI2RlZmluZSBPdiBPUF9PRkYsIHZfbW9kZQotI2RlZmluZSBYYiBPUF9EU3JlZywgZVNJX3JlZwotI2RlZmluZSBYdiBPUF9EU3JlZywgZVNJX3JlZwotI2RlZmluZSBZYiBPUF9FU3JlZywgZURJX3JlZwotI2RlZmluZSBZdiBPUF9FU3JlZywgZURJX3JlZwotI2RlZmluZSBEU0JYIE9QX0RTcmVnLCBlQlhfcmVnCi0KLSNkZWZpbmUgZXMgT1BfUkVHLCBlc19yZWcKLSNkZWZpbmUgc3MgT1BfUkVHLCBzc19yZWcKLSNkZWZpbmUgY3MgT1BfUkVHLCBjc19yZWcKLSNkZWZpbmUgZHMgT1BfUkVHLCBkc19yZWcKLSNkZWZpbmUgZnMgT1BfUkVHLCBmc19yZWcKLSNkZWZpbmUgZ3MgT1BfUkVHLCBnc19yZWcKLQotI2RlZmluZSBNWCBPUF9NTVgsIDAKLSNkZWZpbmUgWE0gT1BfWE1NLCAwCi0jZGVmaW5lIEVNIE9QX0VNLCB2X21vZGUKLSNkZWZpbmUgRVggT1BfRVgsIHZfbW9kZQotI2RlZmluZSBNUyBPUF9NUywgdl9tb2RlCi0jZGVmaW5lIE5vbmUgT1BfRSwgMAotI2RlZmluZSBPUFNVRiBPUF8zRE5vd1N1ZmZpeCwgMAotI2RlZmluZSBPUFNJTUQgT1BfU0lNRF9TdWZmaXgsIDAKLQotLyogYml0cyBpbiBzaXplZmxhZyAqLwotI2lmIDAgLyogbGVhdmUgdW5kZWZpbmVkIHVudGlsIHNvbWVvbmUgYWRkcyB0aGUgZXh0cmEgZmxhZyB0byBvYmpkdW1wICovCi0jZGVmaW5lIFNVRkZJWF9BTFdBWVMgNAotI2VuZGlmCi0jZGVmaW5lIEFGTEFHIDIKLSNkZWZpbmUgREZMQUcgMQotCi10eXBlZGVmIHZvaWQgKCpvcF9ydG4pIFBBUkFNUyAoKGludCBieXRlbW9kZSwgaW50IHNpemVmbGFnKSk7Ci0KLXN0YXRpYyB2b2lkIE9QX0UgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0cgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0kgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX2luZGlyRSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1Bfc0kgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1JFRyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfSiBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRElSIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9PRkYgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX0VTcmVnIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9EU3JlZyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU0VHIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9DIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9EIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9UIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9SZCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU1QgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX1NUaSAgUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX01NWCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfWE1NIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF9FTSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfRVggUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIE9QX01TIFBBUkFNUyAoKGludCwgaW50KSk7Ci1zdGF0aWMgdm9pZCBPUF8zRE5vd1N1ZmZpeCBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgT1BfU0lNRF9TdWZmaXggUEFSQU1TICgoaW50LCBpbnQpKTsKLXN0YXRpYyB2b2lkIFNJTURfRml4dXAgUEFSQU1TICgoaW50LCBpbnQpKTsKLQotc3RhdGljIHZvaWQgYXBwZW5kX3NlZyBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgdm9pZCBzZXRfb3AgUEFSQU1TICgodW5zaWduZWQgaW50IG9wKSk7Ci1zdGF0aWMgdm9pZCBwdXRvcCBQQVJBTVMgKChjb25zdCBjaGFyICp0ZW1wbGF0ZSwgaW50IHNpemVmbGFnKSk7Ci1zdGF0aWMgdm9pZCBkb2Zsb2F0IFBBUkFNUyAoKGludCBzaXplZmxhZykpOwotc3RhdGljIGludCBnZXQxNiBQQVJBTVMgKCh2b2lkKSk7Ci1zdGF0aWMgaW50IGdldDMyIFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyB2b2lkIGNrcHJlZml4IFBBUkFNUyAoKHZvaWQpKTsKLXN0YXRpYyBjb25zdCBjaGFyICpwcmVmaXhfbmFtZSBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgcHRyX3JlZyBQQVJBTVMgKChpbnQsIGludCkpOwotc3RhdGljIHZvaWQgQmFkT3AgUEFSQU1TICgodm9pZCkpOwotCi0jZGVmaW5lIGJfbW9kZSAxCi0jZGVmaW5lIHZfbW9kZSAyCi0jZGVmaW5lIHdfbW9kZSAzCi0jZGVmaW5lIGRfbW9kZSA0Ci0jZGVmaW5lIHhfbW9kZSA1Ci0KLSNkZWZpbmUgZXNfcmVnIDEwMAotI2RlZmluZSBjc19yZWcgMTAxCi0jZGVmaW5lIHNzX3JlZyAxMDIKLSNkZWZpbmUgZHNfcmVnIDEwMwotI2RlZmluZSBmc19yZWcgMTA0Ci0jZGVmaW5lIGdzX3JlZyAxMDUKLQotI2RlZmluZSBlQVhfcmVnIDEwOAotI2RlZmluZSBlQ1hfcmVnIDEwOQotI2RlZmluZSBlRFhfcmVnIDExMAotI2RlZmluZSBlQlhfcmVnIDExMQotI2RlZmluZSBlU1BfcmVnIDExMgotI2RlZmluZSBlQlBfcmVnIDExMwotI2RlZmluZSBlU0lfcmVnIDExNAotI2RlZmluZSBlRElfcmVnIDExNQotCi0jZGVmaW5lIGFsX3JlZyAxMTYKLSNkZWZpbmUgY2xfcmVnIDExNwotI2RlZmluZSBkbF9yZWcgMTE4Ci0jZGVmaW5lIGJsX3JlZyAxMTkKLSNkZWZpbmUgYWhfcmVnIDEyMAotI2RlZmluZSBjaF9yZWcgMTIxCi0jZGVmaW5lIGRoX3JlZyAxMjIKLSNkZWZpbmUgYmhfcmVnIDEyMwotCi0jZGVmaW5lIGF4X3JlZyAxMjQKLSNkZWZpbmUgY3hfcmVnIDEyNQotI2RlZmluZSBkeF9yZWcgMTI2Ci0jZGVmaW5lIGJ4X3JlZyAxMjcKLSNkZWZpbmUgc3BfcmVnIDEyOAotI2RlZmluZSBicF9yZWcgMTI5Ci0jZGVmaW5lIHNpX3JlZyAxMzAKLSNkZWZpbmUgZGlfcmVnIDEzMQotCi0jZGVmaW5lIGluZGlyX2R4X3JlZyAxNTAKLQotI2RlZmluZSBVU0VfR1JPVVBTIDEKLSNkZWZpbmUgVVNFX1BSRUZJWF9VU0VSX1RBQkxFIDIKLQotI2RlZmluZSBHUlAxYiBOVUxMLCBOVUxMLCAwLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDFTIE5VTEwsIE5VTEwsIDEsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMVNzIE5VTEwsIE5VTEwsIDIsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMmIgTlVMTCwgTlVMTCwgMywgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAyUyBOVUxMLCBOVUxMLCA0LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDJiX29uZSBOVUxMLCBOVUxMLCA1LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDJTX29uZSBOVUxMLCBOVUxMLCA2LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDJiX2NsIE5VTEwsIE5VTEwsIDcsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQMlNfY2wgTlVMTCwgTlVMTCwgOCwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlAzYiBOVUxMLCBOVUxMLCA5LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDNTIE5VTEwsIE5VTEwsIDEwLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDQgIE5VTEwsIE5VTEwsIDExLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDUgIE5VTEwsIE5VTEwsIDEyLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDYgIE5VTEwsIE5VTEwsIDEzLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDcgTlVMTCwgTlVMTCwgMTQsIE5VTEwsIFVTRV9HUk9VUFMKLSNkZWZpbmUgR1JQOCBOVUxMLCBOVUxMLCAxNSwgTlVMTCwgVVNFX0dST1VQUwotI2RlZmluZSBHUlA5IE5VTEwsIE5VTEwsIDE2LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDEwIE5VTEwsIE5VTEwsIDE3LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDExIE5VTEwsIE5VTEwsIDE4LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDEyIE5VTEwsIE5VTEwsIDE5LCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDEzIE5VTEwsIE5VTEwsIDIwLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUDE0IE5VTEwsIE5VTEwsIDIxLCBOVUxMLCBVU0VfR1JPVVBTCi0jZGVmaW5lIEdSUEFNRCBOVUxMLCBOVUxMLCAyMiwgTlVMTCwgVVNFX0dST1VQUwotCi0jZGVmaW5lIFBSRUdSUDAgTlVMTCwgTlVMTCwgMCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDEgTlVMTCwgTlVMTCwgMSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDIgTlVMTCwgTlVMTCwgMiwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDMgTlVMTCwgTlVMTCwgMywgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDQgTlVMTCwgTlVMTCwgNCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDUgTlVMTCwgTlVMTCwgNSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDYgTlVMTCwgTlVMTCwgNiwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDcgTlVMTCwgTlVMTCwgNywgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDggTlVMTCwgTlVMTCwgOCwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDkgTlVMTCwgTlVMTCwgOSwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDEwIE5VTEwsIE5VTEwsIDEwLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQMTEgTlVMTCwgTlVMTCwgMTEsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotI2RlZmluZSBQUkVHUlAxMiBOVUxMLCBOVUxMLCAxMiwgTlVMTCwgVVNFX1BSRUZJWF9VU0VSX1RBQkxFCi0jZGVmaW5lIFBSRUdSUDEzIE5VTEwsIE5VTEwsIDEzLCBOVUxMLCBVU0VfUFJFRklYX1VTRVJfVEFCTEUKLSNkZWZpbmUgUFJFR1JQMTQgTlVMTCwgTlVMTCwgMTQsIE5VTEwsIFVTRV9QUkVGSVhfVVNFUl9UQUJMRQotCi0jZGVmaW5lIEZMT0FUQ09ERSA1MAotI2RlZmluZSBGTE9BVCBOVUxMLCBOVUxMLCBGTE9BVENPREUKLQotc3RydWN0IGRpczM4NiB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIG9wX3J0biBvcDE7Ci0gIGludCBieXRlbW9kZTE7Ci0gIG9wX3J0biBvcDI7Ci0gIGludCBieXRlbW9kZTI7Ci0gIG9wX3J0biBvcDM7Ci0gIGludCBieXRlbW9kZTM7Ci19OwotCi0vKiBVcHBlciBjYXNlIGxldHRlcnMgaW4gdGhlIGluc3RydWN0aW9uIG5hbWVzIGhlcmUgYXJlIG1hY3Jvcy4KLSAgICdBJyA9PiBwcmludCAnYicgaWYgbm8gcmVnaXN0ZXIgb3BlcmFuZHMgb3Igc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnQicgPT4gcHJpbnQgJ2InIGlmIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ0UnID0+IHByaW50ICdlJyBpZiAzMi1iaXQgZm9ybSBvZiBqY3h6Ci0gICAnTCcgPT4gcHJpbnQgJ2wnIGlmIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ04nID0+IHByaW50ICduJyBpZiBpbnN0cnVjdGlvbiBoYXMgbm8gd2FpdCAicHJlZml4IgotICAgJ1AnID0+IHByaW50ICd3JyBvciAnbCcgaWYgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wZXJhbmQgc2l6ZSBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBzdWZmaXhfYWx3YXlzIGlzIHRydWUKLSAgICdRJyA9PiBwcmludCAndycgb3IgJ2wnIGlmIG5vIHJlZ2lzdGVyIG9wZXJhbmRzIG9yIHN1ZmZpeF9hbHdheXMgaXMgdHJ1ZQotICAgJ1InID0+IHByaW50ICd3JyBvciAnbCcgKCJ3ZCIgb3IgImRxIiBpbiBpbnRlbCBtb2RlKQotICAgJ1MnID0+IHByaW50ICd3JyBvciAnbCcgaWYgc3VmZml4X2Fsd2F5cyBpcyB0cnVlCi0gICAnVycgPT4gcHJpbnQgJ2InIG9yICd3JyAoInciIG9yICJkZSIgaW4gaW50ZWwgbW9kZSkKLSovCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl9hdHRbXSA9IHsKLSAgLyogMDAgKi8KLSAgeyAiYWRkQiIsCUViLCBHYiB9LAotICB7ICJhZGRTIiwJRXYsIEd2IH0sCi0gIHsgImFkZEIiLAlHYiwgRWIgfSwKLSAgeyAiYWRkUyIsCUd2LCBFdiB9LAotICB7ICJhZGRCIiwJQUwsIEliIH0sCi0gIHsgImFkZFMiLAllQVgsIEl2IH0sCi0gIHsgInB1c2hQIiwJZXMgfSwKLSAgeyAicG9wUCIsCWVzIH0sCi0gIC8qIDA4ICovCi0gIHsgIm9yQiIsCUViLCBHYiB9LAotICB7ICJvclMiLAlFdiwgR3YgfSwKLSAgeyAib3JCIiwJR2IsIEViIH0sCi0gIHsgIm9yUyIsCUd2LCBFdiB9LAotICB7ICJvckIiLAlBTCwgSWIgfSwKLSAgeyAib3JTIiwJZUFYLCBJdiB9LAotICB7ICJwdXNoUCIsCWNzIH0sCi0gIHsgIihiYWQpIiB9LAkvKiAweDBmIGV4dGVuZGVkIG9wY29kZSBlc2NhcGUgKi8KLSAgLyogMTAgKi8KLSAgeyAiYWRjQiIsCUViLCBHYiB9LAotICB7ICJhZGNTIiwJRXYsIEd2IH0sCi0gIHsgImFkY0IiLAlHYiwgRWIgfSwKLSAgeyAiYWRjUyIsCUd2LCBFdiB9LAotICB7ICJhZGNCIiwJQUwsIEliIH0sCi0gIHsgImFkY1MiLAllQVgsIEl2IH0sCi0gIHsgInB1c2hQIiwJc3MgfSwKLSAgeyAicG9wUCIsCXNzIH0sCi0gIC8qIDE4ICovCi0gIHsgInNiYkIiLAlFYiwgR2IgfSwKLSAgeyAic2JiUyIsCUV2LCBHdiB9LAotICB7ICJzYmJCIiwJR2IsIEViIH0sCi0gIHsgInNiYlMiLAlHdiwgRXYgfSwKLSAgeyAic2JiQiIsCUFMLCBJYiB9LAotICB7ICJzYmJTIiwJZUFYLCBJdiB9LAotICB7ICJwdXNoUCIsCWRzIH0sCi0gIHsgInBvcFAiLAlkcyB9LAotICAvKiAyMCAqLwotICB7ICJhbmRCIiwJRWIsIEdiIH0sCi0gIHsgImFuZFMiLAlFdiwgR3YgfSwKLSAgeyAiYW5kQiIsCUdiLCBFYiB9LAotICB7ICJhbmRTIiwJR3YsIEV2IH0sCi0gIHsgImFuZEIiLAlBTCwgSWIgfSwKLSAgeyAiYW5kUyIsCWVBWCwgSXYgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIEVTIHByZWZpeCAqLwotICB7ICJkYWEiIH0sCi0gIC8qIDI4ICovCi0gIHsgInN1YkIiLAlFYiwgR2IgfSwKLSAgeyAic3ViUyIsCUV2LCBHdiB9LAotICB7ICJzdWJCIiwJR2IsIEViIH0sCi0gIHsgInN1YlMiLAlHdiwgRXYgfSwKLSAgeyAic3ViQiIsCUFMLCBJYiB9LAotICB7ICJzdWJTIiwJZUFYLCBJdiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgQ1MgcHJlZml4ICovCi0gIHsgImRhcyIgfSwKLSAgLyogMzAgKi8KLSAgeyAieG9yQiIsCUViLCBHYiB9LAotICB7ICJ4b3JTIiwJRXYsIEd2IH0sCi0gIHsgInhvckIiLAlHYiwgRWIgfSwKLSAgeyAieG9yUyIsCUd2LCBFdiB9LAotICB7ICJ4b3JCIiwJQUwsIEliIH0sCi0gIHsgInhvclMiLAllQVgsIEl2IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBTUyBwcmVmaXggKi8KLSAgeyAiYWFhIiB9LAotICAvKiAzOCAqLwotICB7ICJjbXBCIiwJRWIsIEdiIH0sCi0gIHsgImNtcFMiLAlFdiwgR3YgfSwKLSAgeyAiY21wQiIsCUdiLCBFYiB9LAotICB7ICJjbXBTIiwJR3YsIEV2IH0sCi0gIHsgImNtcEIiLAlBTCwgSWIgfSwKLSAgeyAiY21wUyIsCWVBWCwgSXYgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIERTIHByZWZpeCAqLwotICB7ICJhYXMiIH0sCi0gIC8qIDQwICovCi0gIHsgImluY1MiLAllQVggfSwKLSAgeyAiaW5jUyIsCWVDWCB9LAotICB7ICJpbmNTIiwJZURYIH0sCi0gIHsgImluY1MiLAllQlggfSwKLSAgeyAiaW5jUyIsCWVTUCB9LAotICB7ICJpbmNTIiwJZUJQIH0sCi0gIHsgImluY1MiLAllU0kgfSwKLSAgeyAiaW5jUyIsCWVESSB9LAotICAvKiA0OCAqLwotICB7ICJkZWNTIiwJZUFYIH0sCi0gIHsgImRlY1MiLAllQ1ggfSwKLSAgeyAiZGVjUyIsCWVEWCB9LAotICB7ICJkZWNTIiwJZUJYIH0sCi0gIHsgImRlY1MiLAllU1AgfSwKLSAgeyAiZGVjUyIsCWVCUCB9LAotICB7ICJkZWNTIiwJZVNJIH0sCi0gIHsgImRlY1MiLAllREkgfSwKLSAgLyogNTAgKi8KLSAgeyAicHVzaFMiLAllQVggfSwKLSAgeyAicHVzaFMiLAllQ1ggfSwKLSAgeyAicHVzaFMiLAllRFggfSwKLSAgeyAicHVzaFMiLAllQlggfSwKLSAgeyAicHVzaFMiLAllU1AgfSwKLSAgeyAicHVzaFMiLAllQlAgfSwKLSAgeyAicHVzaFMiLAllU0kgfSwKLSAgeyAicHVzaFMiLAllREkgfSwKLSAgLyogNTggKi8KLSAgeyAicG9wUyIsCWVBWCB9LAotICB7ICJwb3BTIiwJZUNYIH0sCi0gIHsgInBvcFMiLAllRFggfSwKLSAgeyAicG9wUyIsCWVCWCB9LAotICB7ICJwb3BTIiwJZVNQIH0sCi0gIHsgInBvcFMiLAllQlAgfSwKLSAgeyAicG9wUyIsCWVTSSB9LAotICB7ICJwb3BTIiwJZURJIH0sCi0gIC8qIDYwICovCi0gIHsgInB1c2hhUCIgfSwKLSAgeyAicG9wYVAiIH0sCi0gIHsgImJvdW5kUyIsCUd2LCBNYSB9LAotICB7ICJhcnBsIiwJRXcsIEd3IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIHNlZyBmcyAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiBzZWcgZ3MgKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogb3Agc2l6ZSBwcmVmaXggKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogYWRyIHNpemUgcHJlZml4ICovCi0gIC8qIDY4ICovCi0gIHsgInB1c2hQIiwJSXYgfSwJCS8qIDM4NiBib29rIHdyb25nICovCi0gIHsgImltdWxTIiwJR3YsIEV2LCBJdiB9LAotICB7ICJwdXNoUCIsCXNJYiB9LAkJLyogcHVzaCBvZiBieXRlIHJlYWxseSBwdXNoZXMgMiBvciA0IGJ5dGVzICovCi0gIHsgImltdWxTIiwJR3YsIEV2LCBzSWIgfSwKLSAgeyAiaW5zYiIsCVliLCBpbmRpckRYIH0sCi0gIHsgImluc1IiLAlZdiwgaW5kaXJEWCB9LAotICB7ICJvdXRzYiIsCWluZGlyRFgsIFhiIH0sCi0gIHsgIm91dHNSIiwJaW5kaXJEWCwgWHYgfSwKLSAgLyogNzAgKi8KLSAgeyAiam8iLAlKYiB9LAotICB7ICJqbm8iLAlKYiB9LAotICB7ICJqYiIsCUpiIH0sCi0gIHsgImphZSIsCUpiIH0sCi0gIHsgImplIiwJSmIgfSwKLSAgeyAiam5lIiwJSmIgfSwKLSAgeyAiamJlIiwJSmIgfSwKLSAgeyAiamEiLAlKYiB9LAotICAvKiA3OCAqLwotICB7ICJqcyIsCUpiIH0sCi0gIHsgImpucyIsCUpiIH0sCi0gIHsgImpwIiwJSmIgfSwKLSAgeyAiam5wIiwJSmIgfSwKLSAgeyAiamwiLAlKYiB9LAotICB7ICJqZ2UiLAlKYiB9LAotICB7ICJqbGUiLAlKYiB9LAotICB7ICJqZyIsCUpiIH0sCi0gIC8qIDgwICovCi0gIHsgR1JQMWIgfSwKLSAgeyBHUlAxUyB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyBHUlAxU3MgfSwKLSAgeyAidGVzdEIiLAlFYiwgR2IgfSwKLSAgeyAidGVzdFMiLAlFdiwgR3YgfSwKLSAgeyAieGNoZ0IiLAlFYiwgR2IgfSwKLSAgeyAieGNoZ1MiLAlFdiwgR3YgfSwKLSAgLyogODggKi8KLSAgeyAibW92QiIsCUViLCBHYiB9LAotICB7ICJtb3ZTIiwJRXYsIEd2IH0sCi0gIHsgIm1vdkIiLAlHYiwgRWIgfSwKLSAgeyAibW92UyIsCUd2LCBFdiB9LAotICB7ICJtb3ZRIiwJRXYsIFN3IH0sCi0gIHsgImxlYVMiLAlHdiwgTSB9LAotICB7ICJtb3ZRIiwJU3csIEV2IH0sCi0gIHsgInBvcFEiLAlFdiB9LAotICAvKiA5MCAqLwotICB7ICJub3AiIH0sCi0gIHsgInhjaGdTIiwJZUNYLCBlQVggfSwKLSAgeyAieGNoZ1MiLAllRFgsIGVBWCB9LAotICB7ICJ4Y2hnUyIsCWVCWCwgZUFYIH0sCi0gIHsgInhjaGdTIiwJZVNQLCBlQVggfSwKLSAgeyAieGNoZ1MiLAllQlAsIGVBWCB9LAotICB7ICJ4Y2hnUyIsCWVTSSwgZUFYIH0sCi0gIHsgInhjaGdTIiwJZURJLCBlQVggfSwKLSAgLyogOTggKi8KLSAgeyAiY1d0UiIgfSwKLSAgeyAiY1J0ZCIgfSwKLSAgeyAibGNhbGxQIiwJQXAgfSwKLSAgeyAiKGJhZCkiIH0sCQkvKiBmd2FpdCAqLwotICB7ICJwdXNoZlAiIH0sCi0gIHsgInBvcGZQIiB9LAotICB7ICJzYWhmIiB9LAotICB7ICJsYWhmIiB9LAotICAvKiBhMCAqLwotICB7ICJtb3ZCIiwJQUwsIE9iIH0sCi0gIHsgIm1vdlMiLAllQVgsIE92IH0sCi0gIHsgIm1vdkIiLAlPYiwgQUwgfSwKLSAgeyAibW92UyIsCU92LCBlQVggfSwKLSAgeyAibW92c2IiLAlZYiwgWGIgfSwKLSAgeyAibW92c1IiLAlZdiwgWHYgfSwKLSAgeyAiY21wc2IiLAlYYiwgWWIgfSwKLSAgeyAiY21wc1IiLAlYdiwgWXYgfSwKLSAgLyogYTggKi8KLSAgeyAidGVzdEIiLAlBTCwgSWIgfSwKLSAgeyAidGVzdFMiLAllQVgsIEl2IH0sCi0gIHsgInN0b3NCIiwJWWIsIEFMIH0sCi0gIHsgInN0b3NTIiwJWXYsIGVBWCB9LAotICB7ICJsb2RzQiIsCUFMLCBYYiB9LAotICB7ICJsb2RzUyIsCWVBWCwgWHYgfSwKLSAgeyAic2Nhc0IiLAlBTCwgWWIgfSwKLSAgeyAic2Nhc1MiLAllQVgsIFl2IH0sCi0gIC8qIGIwICovCi0gIHsgIm1vdkIiLAlBTCwgSWIgfSwKLSAgeyAibW92QiIsCUNMLCBJYiB9LAotICB7ICJtb3ZCIiwJREwsIEliIH0sCi0gIHsgIm1vdkIiLAlCTCwgSWIgfSwKLSAgeyAibW92QiIsCUFILCBJYiB9LAotICB7ICJtb3ZCIiwJQ0gsIEliIH0sCi0gIHsgIm1vdkIiLAlESCwgSWIgfSwKLSAgeyAibW92QiIsCUJILCBJYiB9LAotICAvKiBiOCAqLwotICB7ICJtb3ZTIiwJZUFYLCBJdiB9LAotICB7ICJtb3ZTIiwJZUNYLCBJdiB9LAotICB7ICJtb3ZTIiwJZURYLCBJdiB9LAotICB7ICJtb3ZTIiwJZUJYLCBJdiB9LAotICB7ICJtb3ZTIiwJZVNQLCBJdiB9LAotICB7ICJtb3ZTIiwJZUJQLCBJdiB9LAotICB7ICJtb3ZTIiwJZVNJLCBJdiB9LAotICB7ICJtb3ZTIiwJZURJLCBJdiB9LAotICAvKiBjMCAqLwotICB7IEdSUDJiIH0sCi0gIHsgR1JQMlMgfSwKLSAgeyAicmV0UCIsCUl3IH0sCi0gIHsgInJldFAiIH0sCi0gIHsgImxlc1MiLAlHdiwgTXAgfSwKLSAgeyAibGRzUyIsCUd2LCBNcCB9LAotICB7ICJtb3ZBIiwJRWIsIEliIH0sCi0gIHsgIm1vdlEiLAlFdiwgSXYgfSwKLSAgLyogYzggKi8KLSAgeyAiZW50ZXJQIiwJSXcsIEliIH0sCi0gIHsgImxlYXZlUCIgfSwKLSAgeyAibHJldFAiLAlJdyB9LAotICB7ICJscmV0UCIgfSwKLSAgeyAiaW50MyIgfSwKLSAgeyAiaW50IiwJSWIgfSwKLSAgeyAiaW50byIgfSwKLSAgeyAiaXJldFAiIH0sCi0gIC8qIGQwICovCi0gIHsgR1JQMmJfb25lIH0sCi0gIHsgR1JQMlNfb25lIH0sCi0gIHsgR1JQMmJfY2wgfSwKLSAgeyBHUlAyU19jbCB9LAotICB7ICJhYW0iLAlzSWIgfSwKLSAgeyAiYWFkIiwJc0liIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJ4bGF0IiwJRFNCWCB9LAotICAvKiBkOCAqLwotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgLyogZTAgKi8KLSAgeyAibG9vcG5lIiwJSmIgfSwKLSAgeyAibG9vcGUiLAlKYiB9LAotICB7ICJsb29wIiwJSmIgfSwKLSAgeyAiakVjeHoiLAlKYiB9LAotICB7ICJpbkIiLAlBTCwgSWIgfSwKLSAgeyAiaW5TIiwJZUFYLCBJYiB9LAotICB7ICJvdXRCIiwJSWIsIEFMIH0sCi0gIHsgIm91dFMiLAlJYiwgZUFYIH0sCi0gIC8qIGU4ICovCi0gIHsgImNhbGxQIiwJSnYgfSwKLSAgeyAiam1wUCIsCUp2IH0sCi0gIHsgImxqbXBQIiwJQXAgfSwKLSAgeyAiam1wIiwJSmIgfSwKLSAgeyAiaW5CIiwJQUwsIGluZGlyRFggfSwKLSAgeyAiaW5TIiwJZUFYLCBpbmRpckRYIH0sCi0gIHsgIm91dEIiLAlpbmRpckRYLCBBTCB9LAotICB7ICJvdXRTIiwJaW5kaXJEWCwgZUFYIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIGxvY2sgcHJlZml4ICovCi0gIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiByZXBuZSAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiByZXB6ICovCi0gIHsgImhsdCIgfSwKLSAgeyAiY21jIiB9LAotICB7IEdSUDNiIH0sCi0gIHsgR1JQM1MgfSwKLSAgLyogZjggKi8KLSAgeyAiY2xjIiB9LAotICB7ICJzdGMiIH0sCi0gIHsgImNsaSIgfSwKLSAgeyAic3RpIiB9LAotICB7ICJjbGQiIH0sCi0gIHsgInN0ZCIgfSwKLSAgeyBHUlA0IH0sCi0gIHsgR1JQNSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X2ludGVsW10gPSB7Ci0gIC8qIDAwICovCi0gIHsgImFkZCIsCUViLCBHYiB9LAotICB7ICJhZGQiLAlFdiwgR3YgfSwKLSAgeyAiYWRkIiwJR2IsIEViIH0sCi0gIHsgImFkZCIsCUd2LCBFdiB9LAotICB7ICJhZGQiLAlBTCwgSWIgfSwKLSAgeyAiYWRkIiwJZUFYLCBJdiB9LAotICB7ICJwdXNoIiwJZXMgfSwKLSAgeyAicG9wIiwJZXMgfSwKLSAgLyogMDggKi8KLSAgeyAib3IiLAlFYiwgR2IgfSwKLSAgeyAib3IiLAlFdiwgR3YgfSwKLSAgeyAib3IiLAlHYiwgRWIgfSwKLSAgeyAib3IiLAlHdiwgRXYgfSwKLSAgeyAib3IiLAlBTCwgSWIgfSwKLSAgeyAib3IiLAllQVgsIEl2IH0sCi0gIHsgInB1c2giLAljcyB9LAotICB7ICIoYmFkKSIgfSwJLyogMHgwZiBleHRlbmRlZCBvcGNvZGUgZXNjYXBlICovCi0gIC8qIDEwICovCi0gIHsgImFkYyIsCUViLCBHYiB9LAotICB7ICJhZGMiLAlFdiwgR3YgfSwKLSAgeyAiYWRjIiwJR2IsIEViIH0sCi0gIHsgImFkYyIsCUd2LCBFdiB9LAotICB7ICJhZGMiLAlBTCwgSWIgfSwKLSAgeyAiYWRjIiwJZUFYLCBJdiB9LAotICB7ICJwdXNoIiwJc3MgfSwKLSAgeyAicG9wIiwJc3MgfSwKLSAgLyogMTggKi8KLSAgeyAic2JiIiwJRWIsIEdiIH0sCi0gIHsgInNiYiIsCUV2LCBHdiB9LAotICB7ICJzYmIiLAlHYiwgRWIgfSwKLSAgeyAic2JiIiwJR3YsIEV2IH0sCi0gIHsgInNiYiIsCUFMLCBJYiB9LAotICB7ICJzYmIiLAllQVgsIEl2IH0sCi0gIHsgInB1c2giLAlkcyB9LAotICB7ICJwb3AiLAlkcyB9LAotICAvKiAyMCAqLwotICB7ICJhbmQiLAlFYiwgR2IgfSwKLSAgeyAiYW5kIiwJRXYsIEd2IH0sCi0gIHsgImFuZCIsCUdiLCBFYiB9LAotICB7ICJhbmQiLAlHdiwgRXYgfSwKLSAgeyAiYW5kIiwJQUwsIEliIH0sCi0gIHsgImFuZCIsCWVBWCwgSXYgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIEVTIHByZWZpeCAqLwotICB7ICJkYWEiIH0sCi0gIC8qIDI4ICovCi0gIHsgInN1YiIsCUViLCBHYiB9LAotICB7ICJzdWIiLAlFdiwgR3YgfSwKLSAgeyAic3ViIiwJR2IsIEViIH0sCi0gIHsgInN1YiIsCUd2LCBFdiB9LAotICB7ICJzdWIiLAlBTCwgSWIgfSwKLSAgeyAic3ViIiwJZUFYLCBJdiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBTRUcgQ1MgcHJlZml4ICovCi0gIHsgImRhcyIgfSwKLSAgLyogMzAgKi8KLSAgeyAieG9yIiwJRWIsIEdiIH0sCi0gIHsgInhvciIsCUV2LCBHdiB9LAotICB7ICJ4b3IiLAlHYiwgRWIgfSwKLSAgeyAieG9yIiwJR3YsIEV2IH0sCi0gIHsgInhvciIsCUFMLCBJYiB9LAotICB7ICJ4b3IiLAllQVgsIEl2IH0sCi0gIHsgIihiYWQpIiB9LAkJCS8qIFNFRyBTUyBwcmVmaXggKi8KLSAgeyAiYWFhIiB9LAotICAvKiAzOCAqLwotICB7ICJjbXAiLAlFYiwgR2IgfSwKLSAgeyAiY21wIiwJRXYsIEd2IH0sCi0gIHsgImNtcCIsCUdiLCBFYiB9LAotICB7ICJjbXAiLAlHdiwgRXYgfSwKLSAgeyAiY21wIiwJQUwsIEliIH0sCi0gIHsgImNtcCIsCWVBWCwgSXYgfSwKLSAgeyAiKGJhZCkiIH0sCQkJLyogU0VHIERTIHByZWZpeCAqLwotICB7ICJhYXMiIH0sCi0gIC8qIDQwICovCi0gIHsgImluYyIsCWVBWCB9LAotICB7ICJpbmMiLAllQ1ggfSwKLSAgeyAiaW5jIiwJZURYIH0sCi0gIHsgImluYyIsCWVCWCB9LAotICB7ICJpbmMiLAllU1AgfSwKLSAgeyAiaW5jIiwJZUJQIH0sCi0gIHsgImluYyIsCWVTSSB9LAotICB7ICJpbmMiLAllREkgfSwKLSAgLyogNDggKi8KLSAgeyAiZGVjIiwJZUFYIH0sCi0gIHsgImRlYyIsCWVDWCB9LAotICB7ICJkZWMiLAllRFggfSwKLSAgeyAiZGVjIiwJZUJYIH0sCi0gIHsgImRlYyIsCWVTUCB9LAotICB7ICJkZWMiLAllQlAgfSwKLSAgeyAiZGVjIiwJZVNJIH0sCi0gIHsgImRlYyIsCWVESSB9LAotICAvKiA1MCAqLwotICB7ICJwdXNoIiwJZUFYIH0sCi0gIHsgInB1c2giLAllQ1ggfSwKLSAgeyAicHVzaCIsCWVEWCB9LAotICB7ICJwdXNoIiwJZUJYIH0sCi0gIHsgInB1c2giLAllU1AgfSwKLSAgeyAicHVzaCIsCWVCUCB9LAotICB7ICJwdXNoIiwJZVNJIH0sCi0gIHsgInB1c2giLAllREkgfSwKLSAgLyogNTggKi8KLSAgeyAicG9wIiwJZUFYIH0sCi0gIHsgInBvcCIsCWVDWCB9LAotICB7ICJwb3AiLAllRFggfSwKLSAgeyAicG9wIiwJZUJYIH0sCi0gIHsgInBvcCIsCWVTUCB9LAotICB7ICJwb3AiLAllQlAgfSwKLSAgeyAicG9wIiwJZVNJIH0sCi0gIHsgInBvcCIsCWVESSB9LAotICAvKiA2MCAqLwotICB7ICJwdXNoYSIgfSwKLSAgeyAicG9wYSIgfSwKLSAgeyAiYm91bmQiLAlHdiwgTWEgfSwKLSAgeyAiYXJwbCIsCUV3LCBHdyB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiBzZWcgZnMgKi8KLSAgeyAiKGJhZCkiIH0sCQkJLyogc2VnIGdzICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIG9wIHNpemUgcHJlZml4ICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIGFkciBzaXplIHByZWZpeCAqLwotICAvKiA2OCAqLwotICB7ICJwdXNoIiwJSXYgfSwJCS8qIDM4NiBib29rIHdyb25nICovCi0gIHsgImltdWwiLAlHdiwgRXYsIEl2IH0sCi0gIHsgInB1c2giLAlzSWIgfSwJCS8qIHB1c2ggb2YgYnl0ZSByZWFsbHkgcHVzaGVzIDIgb3IgNCBieXRlcyAqLwotICB7ICJpbXVsIiwJR3YsIEV2LCBzSWIgfSwKLSAgeyAiaW5zIiwJWWIsIGluZGlyRFggfSwKLSAgeyAiaW5zIiwJWXYsIGluZGlyRFggfSwKLSAgeyAib3V0cyIsCWluZGlyRFgsIFhiIH0sCi0gIHsgIm91dHMiLAlpbmRpckRYLCBYdiB9LAotICAvKiA3MCAqLwotICB7ICJqbyIsCUpiIH0sCi0gIHsgImpubyIsCUpiIH0sCi0gIHsgImpiIiwJSmIgfSwKLSAgeyAiamFlIiwJSmIgfSwKLSAgeyAiamUiLAlKYiB9LAotICB7ICJqbmUiLAlKYiB9LAotICB7ICJqYmUiLAlKYiB9LAotICB7ICJqYSIsCUpiIH0sCi0gIC8qIDc4ICovCi0gIHsgImpzIiwJSmIgfSwKLSAgeyAiam5zIiwJSmIgfSwKLSAgeyAianAiLAlKYiB9LAotICB7ICJqbnAiLAlKYiB9LAotICB7ICJqbCIsCUpiIH0sCi0gIHsgImpnZSIsCUpiIH0sCi0gIHsgImpsZSIsCUpiIH0sCi0gIHsgImpnIiwJSmIgfSwKLSAgLyogODAgKi8KLSAgeyBHUlAxYiB9LAotICB7IEdSUDFTIH0sCi0gIHsgIihiYWQpIiB9LAotICB7IEdSUDFTcyB9LAotICB7ICJ0ZXN0IiwJRWIsIEdiIH0sCi0gIHsgInRlc3QiLAlFdiwgR3YgfSwKLSAgeyAieGNoZyIsCUViLCBHYiB9LAotICB7ICJ4Y2hnIiwJRXYsIEd2IH0sCi0gIC8qIDg4ICovCi0gIHsgIm1vdiIsCUViLCBHYiB9LAotICB7ICJtb3YiLAlFdiwgR3YgfSwKLSAgeyAibW92IiwJR2IsIEViIH0sCi0gIHsgIm1vdiIsCUd2LCBFdiB9LAotICB7ICJtb3YiLAlFdiwgU3cgfSwKLSAgeyAibGVhIiwJR3YsIE0gfSwKLSAgeyAibW92IiwJU3csIEV2IH0sCi0gIHsgInBvcCIsCUV2IH0sCi0gIC8qIDkwICovCi0gIHsgIm5vcCIgfSwKLSAgeyAieGNoZyIsCWVDWCwgZUFYIH0sCi0gIHsgInhjaGciLAllRFgsIGVBWCB9LAotICB7ICJ4Y2hnIiwJZUJYLCBlQVggfSwKLSAgeyAieGNoZyIsCWVTUCwgZUFYIH0sCi0gIHsgInhjaGciLAllQlAsIGVBWCB9LAotICB7ICJ4Y2hnIiwJZVNJLCBlQVggfSwKLSAgeyAieGNoZyIsCWVESSwgZUFYIH0sCi0gIC8qIDk4ICovCi0gIHsgImNXIiB9LAkJLyogY3dkZSBhbmQgY2J3ICovCi0gIHsgImNSIiB9LAkJLyogY2RxIGFuZCBjd2QgKi8KLSAgeyAibGNhbGwiLAlBcCB9LAotICB7ICIoYmFkKSIgfSwJCS8qIGZ3YWl0ICovCi0gIHsgInB1c2hmIiB9LAotICB7ICJwb3BmIiB9LAotICB7ICJzYWhmIiB9LAotICB7ICJsYWhmIiB9LAotICAvKiBhMCAqLwotICB7ICJtb3YiLAlBTCwgT2IgfSwKLSAgeyAibW92IiwJZUFYLCBPdiB9LAotICB7ICJtb3YiLAlPYiwgQUwgfSwKLSAgeyAibW92IiwJT3YsIGVBWCB9LAotICB7ICJtb3ZzIiwJWWIsIFhiIH0sCi0gIHsgIm1vdnMiLAlZdiwgWHYgfSwKLSAgeyAiY21wcyIsCVhiLCBZYiB9LAotICB7ICJjbXBzIiwJWHYsIFl2IH0sCi0gIC8qIGE4ICovCi0gIHsgInRlc3QiLAlBTCwgSWIgfSwKLSAgeyAidGVzdCIsCWVBWCwgSXYgfSwKLSAgeyAic3RvcyIsCVliLCBBTCB9LAotICB7ICJzdG9zIiwJWXYsIGVBWCB9LAotICB7ICJsb2RzIiwJQUwsIFhiIH0sCi0gIHsgImxvZHMiLAllQVgsIFh2IH0sCi0gIHsgInNjYXMiLAlBTCwgWWIgfSwKLSAgeyAic2NhcyIsCWVBWCwgWXYgfSwKLSAgLyogYjAgKi8KLSAgeyAibW92IiwJQUwsIEliIH0sCi0gIHsgIm1vdiIsCUNMLCBJYiB9LAotICB7ICJtb3YiLAlETCwgSWIgfSwKLSAgeyAibW92IiwJQkwsIEliIH0sCi0gIHsgIm1vdiIsCUFILCBJYiB9LAotICB7ICJtb3YiLAlDSCwgSWIgfSwKLSAgeyAibW92IiwJREgsIEliIH0sCi0gIHsgIm1vdiIsCUJILCBJYiB9LAotICAvKiBiOCAqLwotICB7ICJtb3YiLAllQVgsIEl2IH0sCi0gIHsgIm1vdiIsCWVDWCwgSXYgfSwKLSAgeyAibW92IiwJZURYLCBJdiB9LAotICB7ICJtb3YiLAllQlgsIEl2IH0sCi0gIHsgIm1vdiIsCWVTUCwgSXYgfSwKLSAgeyAibW92IiwJZUJQLCBJdiB9LAotICB7ICJtb3YiLAllU0ksIEl2IH0sCi0gIHsgIm1vdiIsCWVESSwgSXYgfSwKLSAgLyogYzAgKi8KLSAgeyBHUlAyYiB9LAotICB7IEdSUDJTIH0sCi0gIHsgInJldCIsCUl3IH0sCi0gIHsgInJldCIgfSwKLSAgeyAibGVzIiwJR3YsIE1wIH0sCi0gIHsgImxkcyIsCUd2LCBNcCB9LAotICB7ICJtb3YiLAlFYiwgSWIgfSwKLSAgeyAibW92IiwJRXYsIEl2IH0sCi0gIC8qIGM4ICovCi0gIHsgImVudGVyIiwJSXcsIEliIH0sCi0gIHsgImxlYXZlIiB9LAotICB7ICJscmV0IiwJSXcgfSwKLSAgeyAibHJldCIgfSwKLSAgeyAiaW50MyIgfSwKLSAgeyAiaW50IiwJSWIgfSwKLSAgeyAiaW50byIgfSwKLSAgeyAiaXJldCIgfSwKLSAgLyogZDAgKi8KLSAgeyBHUlAyYl9vbmUgfSwKLSAgeyBHUlAyU19vbmUgfSwKLSAgeyBHUlAyYl9jbCB9LAotICB7IEdSUDJTX2NsIH0sCi0gIHsgImFhbSIsCXNJYiB9LAotICB7ICJhYWQiLAlzSWIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInhsYXQiLAlEU0JYIH0sCi0gIC8qIGQ4ICovCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICB7IEZMT0FUIH0sCi0gIHsgRkxPQVQgfSwKLSAgeyBGTE9BVCB9LAotICAvKiBlMCAqLwotICB7ICJsb29wbmUiLAlKYiB9LAotICB7ICJsb29wZSIsCUpiIH0sCi0gIHsgImxvb3AiLAlKYiB9LAotICB7ICJqRWN4eiIsCUpiIH0sCi0gIHsgImluIiwJQUwsIEliIH0sCi0gIHsgImluIiwJZUFYLCBJYiB9LAotICB7ICJvdXQiLAlJYiwgQUwgfSwKLSAgeyAib3V0IiwJSWIsIGVBWCB9LAotICAvKiBlOCAqLwotICB7ICJjYWxsIiwJSnYgfSwKLSAgeyAiam1wIiwJSnYgfSwKLSAgeyAibGptcCIsCUFwIH0sCi0gIHsgImptcCIsCUpiIH0sCi0gIHsgImluIiwJQUwsIGluZGlyRFggfSwKLSAgeyAiaW4iLAllQVgsIGluZGlyRFggfSwKLSAgeyAib3V0IiwJaW5kaXJEWCwgQUwgfSwKLSAgeyAib3V0IiwJaW5kaXJEWCwgZUFYIH0sCi0gIC8qIGYwICovCi0gIHsgIihiYWQpIiB9LAkJCS8qIGxvY2sgcHJlZml4ICovCi0gIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwJCQkvKiByZXBuZSAqLwotICB7ICIoYmFkKSIgfSwJCQkvKiByZXB6ICovCi0gIHsgImhsdCIgfSwKLSAgeyAiY21jIiB9LAotICB7IEdSUDNiIH0sCi0gIHsgR1JQM1MgfSwKLSAgLyogZjggKi8KLSAgeyAiY2xjIiB9LAotICB7ICJzdGMiIH0sCi0gIHsgImNsaSIgfSwKLSAgeyAic3RpIiB9LAotICB7ICJjbGQiIH0sCi0gIHsgInN0ZCIgfSwKLSAgeyBHUlA0IH0sCi0gIHsgR1JQNSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZGlzMzg2X3R3b2J5dGVfYXR0W10gPSB7Ci0gIC8qIDAwICovCi0gIHsgR1JQNiB9LAotICB7IEdSUDcgfSwKLSAgeyAibGFyUyIsIEd2LCBFdyB9LAotICB7ICJsc2xTIiwgR3YsIEV3IH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAiY2x0cyIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIC8qIDA4ICovCi0gIHsgImludmQiIH0sCi0gIHsgIndiaW52ZCIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInVkMmEiIH0sCi0gIHsgIihiYWQpIiB9LAotICB7IEdSUEFNRCB9LAotICB7ICJmZW1tcyIgfSwKLSAgeyAiIiwgTVgsIEVNLCBPUFNVRiB9LCAvKiBTZWUgT1BfM0ROb3dTdWZmaXggKi8KLSAgLyogMTAgKi8KLSAgeyBQUkVHUlA4IH0sCi0gIHsgUFJFR1JQOSB9LAotICB7ICJtb3ZscHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdoJyB9LCAgLyogcmVhbGx5IG9ubHkgMiBvcGVyYW5kcyAqLwotICB7ICJtb3ZscHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdoJyB9LAotICB7ICJ1bnBja2xwcyIsIFhNLCBFWCB9LAotICB7ICJ1bnBja2hwcyIsIFhNLCBFWCB9LAotICB7ICJtb3ZocHMiLCBYTSwgRVgsIFNJTURfRml4dXAsICdsJyB9LAotICB7ICJtb3ZocHMiLCBFWCwgWE0sIFNJTURfRml4dXAsICdsJyB9LAotICAvKiAxOCAqLwotICB7IEdSUDE0IH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIC8qIDIwICovCi0gIC8qIHRoZXNlIGFyZSBhbGwgYmFja3dhcmQgaW4gYXBwZW5kaXggQSBvZiB0aGUgaW50ZWwgYm9vayAqLwotICB7ICJtb3ZMIiwgUmQsIENkIH0sCi0gIHsgIm1vdkwiLCBSZCwgRGQgfSwKLSAgeyAibW92TCIsIENkLCBSZCB9LAotICB7ICJtb3ZMIiwgRGQsIFJkIH0sCi0gIHsgIm1vdkwiLCBSZCwgVGQgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIm1vdkwiLCBUZCwgUmQgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIC8qIDI4ICovCi0gIHsgIm1vdmFwcyIsIFhNLCBFWCB9LAotICB7ICJtb3ZhcHMiLCBFWCwgWE0gfSwKLSAgeyBQUkVHUlAyIH0sCi0gIHsgIm1vdm50cHMiLCBFdiwgWE0gfSwKLSAgeyBQUkVHUlA0IH0sCi0gIHsgUFJFR1JQMyB9LAotICB7ICJ1Y29taXNzIiwgWE0sIEVYIH0sCi0gIHsgImNvbWlzcyIsIFhNLCBFWCB9LAotICAvKiAzMCAqLwotICB7ICJ3cm1zciIgfSwgIHsgInJkdHNjIiB9LCAgeyAicmRtc3IiIH0sICB7ICJyZHBtYyIgfSwKLSAgeyAic3lzZW50ZXIiIH0sICB7ICJzeXNleGl0IiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgLyogMzggKi8KLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICAvKiA0MCAqLwotICB7ICJjbW92byIsIEd2LEV2IH0sIHsgImNtb3ZubyIsIEd2LEV2IH0sIHsgImNtb3ZiIiwgR3YsRXYgfSwgeyAiY21vdmFlIiwgR3YsRXYgfSwKLSAgeyAiY21vdmUiLCBHdixFdiB9LCB7ICJjbW92bmUiLCBHdixFdiB9LCB7ICJjbW92YmUiLCBHdixFdiB9LCB7ICJjbW92YSIsIEd2LEV2IH0sCi0gIC8qIDQ4ICovCi0gIHsgImNtb3ZzIiwgR3YsRXYgfSwgeyAiY21vdm5zIiwgR3YsRXYgfSwgeyAiY21vdnAiLCBHdixFdiB9LCB7ICJjbW92bnAiLCBHdixFdiB9LAotICB7ICJjbW92bCIsIEd2LEV2IH0sIHsgImNtb3ZnZSIsIEd2LEV2IH0sIHsgImNtb3ZsZSIsIEd2LEV2IH0sIHsgImNtb3ZnIiwgR3YsRXYgfSwKLSAgLyogNTAgKi8KLSAgeyAibW92bXNrcHMiLCBHdiwgRVggfSwKLSAgeyBQUkVHUlAxMyB9LAotICB7IFBSRUdSUDEyIH0sCi0gIHsgUFJFR1JQMTEgfSwKLSAgeyAiYW5kcHMiLCBYTSwgRVggfSwKLSAgeyAiYW5kbnBzIiwgWE0sIEVYIH0sCi0gIHsgIm9ycHMiLCBYTSwgRVggfSwKLSAgeyAieG9ycHMiLCBYTSwgRVggfSwKLSAgLyogNTggKi8KLSAgeyBQUkVHUlAwIH0sCi0gIHsgUFJFR1JQMTAgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LAotICB7IFBSRUdSUDE0IH0sCi0gIHsgUFJFR1JQNyB9LAotICB7IFBSRUdSUDUgfSwKLSAgeyBQUkVHUlA2IH0sCi0gIC8qIDYwICovCi0gIHsgInB1bnBja2xidyIsIE1YLCBFTSB9LAotICB7ICJwdW5wY2tsd2QiLCBNWCwgRU0gfSwKLSAgeyAicHVucGNrbGRxIiwgTVgsIEVNIH0sCi0gIHsgInBhY2tzc3diIiwgTVgsIEVNIH0sCi0gIHsgInBjbXBndGIiLCBNWCwgRU0gfSwKLSAgeyAicGNtcGd0dyIsIE1YLCBFTSB9LAotICB7ICJwY21wZ3RkIiwgTVgsIEVNIH0sCi0gIHsgInBhY2t1c3diIiwgTVgsIEVNIH0sCi0gIC8qIDY4ICovCi0gIHsgInB1bnBja2hidyIsIE1YLCBFTSB9LAotICB7ICJwdW5wY2tod2QiLCBNWCwgRU0gfSwKLSAgeyAicHVucGNraGRxIiwgTVgsIEVNIH0sCi0gIHsgInBhY2tzc2R3IiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIm1vdmQiLCBNWCwgRWQgfSwKLSAgeyAibW92cSIsIE1YLCBFTSB9LAotICAvKiA3MCAqLwotICB7ICJwc2h1ZnciLCBNWCwgRU0sIEliIH0sCi0gIHsgR1JQMTAgfSwKLSAgeyBHUlAxMSB9LAotICB7IEdSUDEyIH0sCi0gIHsgInBjbXBlcWIiLCBNWCwgRU0gfSwKLSAgeyAicGNtcGVxdyIsIE1YLCBFTSB9LAotICB7ICJwY21wZXFkIiwgTVgsIEVNIH0sCi0gIHsgImVtbXMiIH0sCi0gIC8qIDc4ICovCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICJtb3ZkIiwgRWQsIE1YIH0sCi0gIHsgIm1vdnEiLCBFTSwgTVggfSwKLSAgLyogODAgKi8KLSAgeyAiam8iLCBKdiB9LAotICB7ICJqbm8iLCBKdiB9LAotICB7ICJqYiIsIEp2IH0sCi0gIHsgImphZSIsIEp2IH0sCi0gIHsgImplIiwgSnYgfSwKLSAgeyAiam5lIiwgSnYgfSwKLSAgeyAiamJlIiwgSnYgfSwKLSAgeyAiamEiLCBKdiB9LAotICAvKiA4OCAqLwotICB7ICJqcyIsIEp2IH0sCi0gIHsgImpucyIsIEp2IH0sCi0gIHsgImpwIiwgSnYgfSwKLSAgeyAiam5wIiwgSnYgfSwKLSAgeyAiamwiLCBKdiB9LAotICB7ICJqZ2UiLCBKdiB9LAotICB7ICJqbGUiLCBKdiB9LAotICB7ICJqZyIsIEp2IH0sCi0gIC8qIDkwICovCi0gIHsgInNldG8iLCBFYiB9LAotICB7ICJzZXRubyIsIEViIH0sCi0gIHsgInNldGIiLCBFYiB9LAotICB7ICJzZXRhZSIsIEViIH0sCi0gIHsgInNldGUiLCBFYiB9LAotICB7ICJzZXRuZSIsIEViIH0sCi0gIHsgInNldGJlIiwgRWIgfSwKLSAgeyAic2V0YSIsIEViIH0sCi0gIC8qIDk4ICovCi0gIHsgInNldHMiLCBFYiB9LAotICB7ICJzZXRucyIsIEViIH0sCi0gIHsgInNldHAiLCBFYiB9LAotICB7ICJzZXRucCIsIEViIH0sCi0gIHsgInNldGwiLCBFYiB9LAotICB7ICJzZXRnZSIsIEViIH0sCi0gIHsgInNldGxlIiwgRWIgfSwKLSAgeyAic2V0ZyIsIEViIH0sCi0gIC8qIGEwICovCi0gIHsgInB1c2hQIiwgZnMgfSwKLSAgeyAicG9wUCIsIGZzIH0sCi0gIHsgImNwdWlkIiB9LAotICB7ICJidFMiLCBFdiwgR3YgfSwKLSAgeyAic2hsZFMiLCBFdiwgR3YsIEliIH0sCi0gIHsgInNobGRTIiwgRXYsIEd2LCBDTCB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIC8qIGE4ICovCi0gIHsgInB1c2hQIiwgZ3MgfSwKLSAgeyAicG9wUCIsIGdzIH0sCi0gIHsgInJzbSIgfSwKLSAgeyAiYnRzUyIsIEV2LCBHdiB9LAotICB7ICJzaHJkUyIsIEV2LCBHdiwgSWIgfSwKLSAgeyAic2hyZFMiLCBFdiwgR3YsIENMIH0sCi0gIHsgR1JQMTMgfSwKLSAgeyAiaW11bFMiLCBHdiwgRXYgfSwKLSAgLyogYjAgKi8KLSAgeyAiY21weGNoZ0IiLCBFYiwgR2IgfSwKLSAgeyAiY21weGNoZ1MiLCBFdiwgR3YgfSwKLSAgeyAibHNzUyIsIEd2LCBNcCB9LAotICB7ICJidHJTIiwgRXYsIEd2IH0sCi0gIHsgImxmc1MiLCBHdiwgTXAgfSwKLSAgeyAibGdzUyIsIEd2LCBNcCB9LAotICB7ICJtb3Z6YlIiLCBHdiwgRWIgfSwKLSAgeyAibW92endSIiwgR3YsIEV3IH0sIC8qIHllcywgdGhlcmUgcmVhbGx5IGlzIG1vdnp3dyAhICovCi0gIC8qIGI4ICovCi0gIHsgIihiYWQpIiB9LAotICB7ICJ1ZDJiIiB9LAotICB7IEdSUDggfSwKLSAgeyAiYnRjUyIsIEV2LCBHdiB9LAotICB7ICJic2ZTIiwgR3YsIEV2IH0sCi0gIHsgImJzclMiLCBHdiwgRXYgfSwKLSAgeyAibW92c2JSIiwgR3YsIEViIH0sCi0gIHsgIm1vdnN3UiIsIEd2LCBFdyB9LCAvKiB5ZXMsIHRoZXJlIHJlYWxseSBpcyBtb3Zzd3cgISAqLwotICAvKiBjMCAqLwotICB7ICJ4YWRkQiIsIEViLCBHYiB9LAotICB7ICJ4YWRkUyIsIEV2LCBHdiB9LAotICB7IFBSRUdSUDEgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBpbnNydyIsIE1YLCBFdiwgSWIgfSwKLSAgeyAicGV4dHJ3IiwgRXYsIE1YLCBJYiB9LAotICB7ICJzaHVmcHMiLCBYTSwgRVgsIEliIH0sCi0gIHsgR1JQOSB9LAotICAvKiBjOCAqLwotICB7ICJic3dhcCIsIGVBWCB9LAkvKiBic3dhcCBkb2Vzbid0IHN1cHBvcnQgMTYgYml0IHJlZ3MgKi8KLSAgeyAiYnN3YXAiLCBlQ1ggfSwKLSAgeyAiYnN3YXAiLCBlRFggfSwKLSAgeyAiYnN3YXAiLCBlQlggfSwKLSAgeyAiYnN3YXAiLCBlU1AgfSwKLSAgeyAiYnN3YXAiLCBlQlAgfSwKLSAgeyAiYnN3YXAiLCBlU0kgfSwKLSAgeyAiYnN3YXAiLCBlREkgfSwKLSAgLyogZDAgKi8KLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBzcmx3IiwgTVgsIEVNIH0sCi0gIHsgInBzcmxkIiwgTVgsIEVNIH0sCi0gIHsgInBzcmxxIiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwbXVsbHciLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBtb3Ztc2tiIiwgRXYsIE1YIH0sCi0gIC8qIGQ4ICovCi0gIHsgInBzdWJ1c2IiLCBNWCwgRU0gfSwKLSAgeyAicHN1YnVzdyIsIE1YLCBFTSB9LAotICB7ICJwbWludWIiLCBNWCwgRU0gfSwKLSAgeyAicGFuZCIsIE1YLCBFTSB9LAotICB7ICJwYWRkdXNiIiwgTVgsIEVNIH0sCi0gIHsgInBhZGR1c3ciLCBNWCwgRU0gfSwKLSAgeyAicG1heHViIiwgTVgsIEVNIH0sCi0gIHsgInBhbmRuIiwgTVgsIEVNIH0sCi0gIC8qIGUwICovCi0gIHsgInBhdmdiIiwgTVgsIEVNIH0sCi0gIHsgInBzcmF3IiwgTVgsIEVNIH0sCi0gIHsgInBzcmFkIiwgTVgsIEVNIH0sCi0gIHsgInBhdmd3IiwgTVgsIEVNIH0sCi0gIHsgInBtdWxodXciLCBNWCwgRU0gfSwKLSAgeyAicG11bGh3IiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJtb3ZudHEiLCBFdiwgTVggfSwKLSAgLyogZTggKi8KLSAgeyAicHN1YnNiIiwgTVgsIEVNIH0sCi0gIHsgInBzdWJzdyIsIE1YLCBFTSB9LAotICB7ICJwbWluc3ciLCBNWCwgRU0gfSwKLSAgeyAicG9yIiwgTVgsIEVNIH0sCi0gIHsgInBhZGRzYiIsIE1YLCBFTSB9LAotICB7ICJwYWRkc3ciLCBNWCwgRU0gfSwKLSAgeyAicG1heHN3IiwgTVgsIEVNIH0sCi0gIHsgInB4b3IiLCBNWCwgRU0gfSwKLSAgLyogZjAgKi8KLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBzbGx3IiwgTVgsIEVNIH0sCi0gIHsgInBzbGxkIiwgTVgsIEVNIH0sCi0gIHsgInBzbGxxIiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwbWFkZHdkIiwgTVgsIEVNIH0sCi0gIHsgInBzYWRidyIsIE1YLCBFTSB9LAotICB7ICJtYXNrbW92cSIsIE1YLCBFTSB9LAotICAvKiBmOCAqLwotICB7ICJwc3ViYiIsIE1YLCBFTSB9LAotICB7ICJwc3VidyIsIE1YLCBFTSB9LAotICB7ICJwc3ViZCIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicGFkZGIiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHciLCBNWCwgRU0gfSwKLSAgeyAicGFkZGQiLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGRpczM4Nl90d29ieXRlX2ludGVsW10gPSB7Ci0gIC8qIDAwICovCi0gIHsgR1JQNiB9LAotICB7IEdSUDcgfSwKLSAgeyAibGFyIiwgR3YsIEV3IH0sCi0gIHsgImxzbCIsIEd2LCBFdyB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgImNsdHMiIH0sCi0gIHsgIihiYWQpIiB9LAotICAvKiAwOCAqLwotICB7ICJpbnZkIiB9LAotICB7ICJ3YmludmQiIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJ1ZDJhIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyBHUlBBTUQgfSwKLSAgeyAiZmVtbXMiIH0sCi0gIHsgIiIsIE1YLCBFTSwgT1BTVUYgfSwgLyogU2VlIE9QXzNETm93U3VmZml4ICovCi0gIC8qIDEwICovCi0gIHsgUFJFR1JQOCB9LAotICB7IFBSRUdSUDkgfSwKLSAgeyAibW92bHBzIiwgWE0sIEVYLCBTSU1EX0ZpeHVwLCAnaCcgfSwgIC8qIHJlYWxseSBvbmx5IDIgb3BlcmFuZHMgKi8KLSAgeyAibW92bHBzIiwgRVgsIFhNLCBTSU1EX0ZpeHVwLCAnaCcgfSwKLSAgeyAidW5wY2tscHMiLCBYTSwgRVggfSwKLSAgeyAidW5wY2tocHMiLCBYTSwgRVggfSwKLSAgeyAibW92aHBzIiwgWE0sIEVYLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgeyAibW92aHBzIiwgRVgsIFhNLCBTSU1EX0ZpeHVwLCAnbCcgfSwKLSAgLyogMTggKi8KLSAgeyBHUlAxNCB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICAvKiAyMCAqLwotICAvKiB0aGVzZSBhcmUgYWxsIGJhY2t3YXJkIGluIGFwcGVuZGl4IEEgb2YgdGhlIGludGVsIGJvb2sgKi8KLSAgeyAibW92IiwgUmQsIENkIH0sCi0gIHsgIm1vdiIsIFJkLCBEZCB9LAotICB7ICJtb3YiLCBDZCwgUmQgfSwKLSAgeyAibW92IiwgRGQsIFJkIH0sCi0gIHsgIm1vdiIsIFJkLCBUZCB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAibW92IiwgVGQsIFJkIH0sCi0gIHsgIihiYWQpIiB9LAotICAvKiAyOCAqLwotICB7ICJtb3ZhcHMiLCBYTSwgRVggfSwKLSAgeyAibW92YXBzIiwgRVgsIFhNIH0sCi0gIHsgUFJFR1JQMiB9LAotICB7ICJtb3ZudHBzIiwgRXYsIFhNIH0sCi0gIHsgUFJFR1JQNCB9LAotICB7IFBSRUdSUDMgfSwKLSAgeyAidWNvbWlzcyIsIFhNLCBFWCB9LAotICB7ICJjb21pc3MiLCBYTSwgRVggfSwKLSAgLyogMzAgKi8KLSAgeyAid3Jtc3IiIH0sICB7ICJyZHRzYyIgfSwgIHsgInJkbXNyIiB9LCAgeyAicmRwbWMiIH0sCi0gIHsgInN5c2VudGVyIiB9LCAgeyAic3lzZXhpdCIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sCi0gIC8qIDM4ICovCi0gIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgLyogNDAgKi8KLSAgeyAiY21vdm8iLCBHdixFdiB9LCB7ICJjbW92bm8iLCBHdixFdiB9LCB7ICJjbW92YiIsIEd2LEV2IH0sIHsgImNtb3ZhZSIsIEd2LEV2IH0sCi0gIHsgImNtb3ZlIiwgR3YsRXYgfSwgeyAiY21vdm5lIiwgR3YsRXYgfSwgeyAiY21vdmJlIiwgR3YsRXYgfSwgeyAiY21vdmEiLCBHdixFdiB9LAotICAvKiA0OCAqLwotICB7ICJjbW92cyIsIEd2LEV2IH0sIHsgImNtb3ZucyIsIEd2LEV2IH0sIHsgImNtb3ZwIiwgR3YsRXYgfSwgeyAiY21vdm5wIiwgR3YsRXYgfSwKLSAgeyAiY21vdmwiLCBHdixFdiB9LCB7ICJjbW92Z2UiLCBHdixFdiB9LCB7ICJjbW92bGUiLCBHdixFdiB9LCB7ICJjbW92ZyIsIEd2LEV2IH0sCi0gIC8qIDUwICovCi0gIHsgIm1vdm1za3BzIiwgR3YsIEVYIH0sCi0gIHsgUFJFR1JQMTMgfSwKLSAgeyBQUkVHUlAxMiB9LAotICB7IFBSRUdSUDExIH0sCi0gIHsgImFuZHBzIiwgWE0sIEVYIH0sCi0gIHsgImFuZG5wcyIsIFhNLCBFWCB9LAotICB7ICJvcnBzIiwgWE0sIEVYIH0sCi0gIHsgInhvcnBzIiwgWE0sIEVYIH0sCi0gIC8qIDU4ICovCi0gIHsgUFJFR1JQMCB9LAotICB7IFBSRUdSUDEwIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyBQUkVHUlAxNCB9LAotICB7IFBSRUdSUDcgfSwKLSAgeyBQUkVHUlA1IH0sCi0gIHsgUFJFR1JQNiB9LAotICAvKiA2MCAqLwotICB7ICJwdW5wY2tsYnciLCBNWCwgRU0gfSwKLSAgeyAicHVucGNrbHdkIiwgTVgsIEVNIH0sCi0gIHsgInB1bnBja2xkcSIsIE1YLCBFTSB9LAotICB7ICJwYWNrc3N3YiIsIE1YLCBFTSB9LAotICB7ICJwY21wZ3RiIiwgTVgsIEVNIH0sCi0gIHsgInBjbXBndHciLCBNWCwgRU0gfSwKLSAgeyAicGNtcGd0ZCIsIE1YLCBFTSB9LAotICB7ICJwYWNrdXN3YiIsIE1YLCBFTSB9LAotICAvKiA2OCAqLwotICB7ICJwdW5wY2toYnciLCBNWCwgRU0gfSwKLSAgeyAicHVucGNraHdkIiwgTVgsIEVNIH0sCi0gIHsgInB1bnBja2hkcSIsIE1YLCBFTSB9LAotICB7ICJwYWNrc3NkdyIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LAotICB7ICJtb3ZkIiwgTVgsIEVkIH0sCi0gIHsgIm1vdnEiLCBNWCwgRU0gfSwKLSAgLyogNzAgKi8KLSAgeyAicHNodWZ3IiwgTVgsIEVNLCBJYiB9LAotICB7IEdSUDEwIH0sCi0gIHsgR1JQMTEgfSwKLSAgeyBHUlAxMiB9LAotICB7ICJwY21wZXFiIiwgTVgsIEVNIH0sCi0gIHsgInBjbXBlcXciLCBNWCwgRU0gfSwKLSAgeyAicGNtcGVxZCIsIE1YLCBFTSB9LAotICB7ICJlbW1zIiB9LAotICAvKiA3OCAqLwotICB7ICIoYmFkKSIgfSwgIHsgIihiYWQpIiB9LCAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAiKGJhZCkiIH0sICB7ICIoYmFkKSIgfSwKLSAgeyAibW92ZCIsIEVkLCBNWCB9LAotICB7ICJtb3ZxIiwgRU0sIE1YIH0sCi0gIC8qIDgwICovCi0gIHsgImpvIiwgSnYgfSwKLSAgeyAiam5vIiwgSnYgfSwKLSAgeyAiamIiLCBKdiB9LAotICB7ICJqYWUiLCBKdiB9LAotICB7ICJqZSIsIEp2IH0sCi0gIHsgImpuZSIsIEp2IH0sCi0gIHsgImpiZSIsIEp2IH0sCi0gIHsgImphIiwgSnYgfSwKLSAgLyogODggKi8KLSAgeyAianMiLCBKdiB9LAotICB7ICJqbnMiLCBKdiB9LAotICB7ICJqcCIsIEp2IH0sCi0gIHsgImpucCIsIEp2IH0sCi0gIHsgImpsIiwgSnYgfSwKLSAgeyAiamdlIiwgSnYgfSwKLSAgeyAiamxlIiwgSnYgfSwKLSAgeyAiamciLCBKdiB9LAotICAvKiA5MCAqLwotICB7ICJzZXRvIiwgRWIgfSwKLSAgeyAic2V0bm8iLCBFYiB9LAotICB7ICJzZXRiIiwgRWIgfSwKLSAgeyAic2V0YWUiLCBFYiB9LAotICB7ICJzZXRlIiwgRWIgfSwKLSAgeyAic2V0bmUiLCBFYiB9LAotICB7ICJzZXRiZSIsIEViIH0sCi0gIHsgInNldGEiLCBFYiB9LAotICAvKiA5OCAqLwotICB7ICJzZXRzIiwgRWIgfSwKLSAgeyAic2V0bnMiLCBFYiB9LAotICB7ICJzZXRwIiwgRWIgfSwKLSAgeyAic2V0bnAiLCBFYiB9LAotICB7ICJzZXRsIiwgRWIgfSwKLSAgeyAic2V0Z2UiLCBFYiB9LAotICB7ICJzZXRsZSIsIEViIH0sCi0gIHsgInNldGciLCBFYiB9LAotICAvKiBhMCAqLwotICB7ICJwdXNoIiwgZnMgfSwKLSAgeyAicG9wIiwgZnMgfSwKLSAgeyAiY3B1aWQiIH0sCi0gIHsgImJ0IiwgRXYsIEd2IH0sCi0gIHsgInNobGQiLCBFdiwgR3YsIEliIH0sCi0gIHsgInNobGQiLCBFdiwgR3YsIENMIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICIoYmFkKSIgfSwKLSAgLyogYTggKi8KLSAgeyAicHVzaCIsIGdzIH0sCi0gIHsgInBvcCIsIGdzIH0sCi0gIHsgInJzbSIgfSwKLSAgeyAiYnRzIiwgRXYsIEd2IH0sCi0gIHsgInNocmQiLCBFdiwgR3YsIEliIH0sCi0gIHsgInNocmQiLCBFdiwgR3YsIENMIH0sCi0gIHsgR1JQMTMgfSwKLSAgeyAiaW11bCIsIEd2LCBFdiB9LAotICAvKiBiMCAqLwotICB7ICJjbXB4Y2hnIiwgRWIsIEdiIH0sCi0gIHsgImNtcHhjaGciLCBFdiwgR3YgfSwKLSAgeyAibHNzIiwgR3YsIE1wIH0sCi0gIHsgImJ0ciIsIEV2LCBHdiB9LAotICB7ICJsZnMiLCBHdiwgTXAgfSwKLSAgeyAibGdzIiwgR3YsIE1wIH0sCi0gIHsgIm1vdnp4IiwgR3YsIEViIH0sCi0gIHsgIm1vdnp4IiwgR3YsIEV3IH0sCi0gIC8qIGI4ICovCi0gIHsgIihiYWQpIiB9LAotICB7ICJ1ZDJiIiB9LAotICB7IEdSUDggfSwKLSAgeyAiYnRjIiwgRXYsIEd2IH0sCi0gIHsgImJzZiIsIEd2LCBFdiB9LAotICB7ICJic3IiLCBHdiwgRXYgfSwKLSAgeyAibW92c3giLCBHdiwgRWIgfSwKLSAgeyAibW92c3giLCBHdiwgRXcgfSwKLSAgLyogYzAgKi8KLSAgeyAieGFkZCIsIEViLCBHYiB9LAotICB7ICJ4YWRkIiwgRXYsIEd2IH0sCi0gIHsgUFJFR1JQMSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicGluc3J3IiwgTVgsIEV2LCBJYiB9LAotICB7ICJwZXh0cnciLCBFdiwgTVgsIEliIH0sCi0gIHsgInNodWZwcyIsIFhNLCBFWCwgSWIgfSwKLSAgeyBHUlA5IH0sCi0gIC8qIGM4ICovCi0gIHsgImJzd2FwIiwgZUFYIH0sCS8qIGJzd2FwIGRvZXNuJ3Qgc3VwcG9ydCAxNiBiaXQgcmVncyAqLwotICB7ICJic3dhcCIsIGVDWCB9LAotICB7ICJic3dhcCIsIGVEWCB9LAotICB7ICJic3dhcCIsIGVCWCB9LAotICB7ICJic3dhcCIsIGVTUCB9LAotICB7ICJic3dhcCIsIGVCUCB9LAotICB7ICJic3dhcCIsIGVTSSB9LAotICB7ICJic3dhcCIsIGVESSB9LAotICAvKiBkMCAqLwotICB7ICIoYmFkKSIgfSwKLSAgeyAicHNybHciLCBNWCwgRU0gfSwKLSAgeyAicHNybGQiLCBNWCwgRU0gfSwKLSAgeyAicHNybHEiLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBtdWxsdyIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfSwKLSAgeyAicG1vdm1za2IiLCBFdiwgTVggfSwKLSAgLyogZDggKi8KLSAgeyAicHN1YnVzYiIsIE1YLCBFTSB9LAotICB7ICJwc3VidXN3IiwgTVgsIEVNIH0sCi0gIHsgInBtaW51YiIsIE1YLCBFTSB9LAotICB7ICJwYW5kIiwgTVgsIEVNIH0sCi0gIHsgInBhZGR1c2IiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHVzdyIsIE1YLCBFTSB9LAotICB7ICJwbWF4dWIiLCBNWCwgRU0gfSwKLSAgeyAicGFuZG4iLCBNWCwgRU0gfSwKLSAgLyogZTAgKi8KLSAgeyAicGF2Z2IiLCBNWCwgRU0gfSwKLSAgeyAicHNyYXciLCBNWCwgRU0gfSwKLSAgeyAicHNyYWQiLCBNWCwgRU0gfSwKLSAgeyAicGF2Z3ciLCBNWCwgRU0gfSwKLSAgeyAicG11bGh1dyIsIE1YLCBFTSB9LAotICB7ICJwbXVsaHciLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgIm1vdm50cSIsIEV2LCBNWCB9LAotICAvKiBlOCAqLwotICB7ICJwc3Vic2IiLCBNWCwgRU0gfSwKLSAgeyAicHN1YnN3IiwgTVgsIEVNIH0sCi0gIHsgInBtaW5zdyIsIE1YLCBFTSB9LAotICB7ICJwb3IiLCBNWCwgRU0gfSwKLSAgeyAicGFkZHNiIiwgTVgsIEVNIH0sCi0gIHsgInBhZGRzdyIsIE1YLCBFTSB9LAotICB7ICJwbWF4c3ciLCBNWCwgRU0gfSwKLSAgeyAicHhvciIsIE1YLCBFTSB9LAotICAvKiBmMCAqLwotICB7ICIoYmFkKSIgfSwKLSAgeyAicHNsbHciLCBNWCwgRU0gfSwKLSAgeyAicHNsbGQiLCBNWCwgRU0gfSwKLSAgeyAicHNsbHEiLCBNWCwgRU0gfSwKLSAgeyAiKGJhZCkiIH0sCi0gIHsgInBtYWRkd2QiLCBNWCwgRU0gfSwKLSAgeyAicHNhZGJ3IiwgTVgsIEVNIH0sCi0gIHsgIm1hc2ttb3ZxIiwgTVgsIEVNIH0sCi0gIC8qIGY4ICovCi0gIHsgInBzdWJiIiwgTVgsIEVNIH0sCi0gIHsgInBzdWJ3IiwgTVgsIEVNIH0sCi0gIHsgInBzdWJkIiwgTVgsIEVNIH0sCi0gIHsgIihiYWQpIiB9LAotICB7ICJwYWRkYiIsIE1YLCBFTSB9LAotICB7ICJwYWRkdyIsIE1YLCBFTSB9LAotICB7ICJwYWRkZCIsIE1YLCBFTSB9LAotICB7ICIoYmFkKSIgfQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgb25lYnl0ZV9oYXNfbW9kcm1bMjU2XSA9IHsKLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogMDAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMDAgKi8KLSAgLyogMTAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMTAgKi8KLSAgLyogMjAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMjAgKi8KLSAgLyogMzAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMCwwLDAsMCwgLyogMzAgKi8KLSAgLyogNDAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNDAgKi8KLSAgLyogNTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNTAgKi8KLSAgLyogNjAgKi8gMCwwLDEsMSwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwgLyogNjAgKi8KLSAgLyogNzAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogNzAgKi8KLSAgLyogODAgKi8gMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwgLyogODAgKi8KLSAgLyogOTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogOTAgKi8KLSAgLyogYTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYTAgKi8KLSAgLyogYjAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogYjAgKi8KLSAgLyogYzAgKi8gMSwxLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwgLyogYzAgKi8KLSAgLyogZDAgKi8gMSwxLDEsMSwwLDAsMCwwLDEsMSwxLDEsMSwxLDEsMSwgLyogZDAgKi8KLSAgLyogZTAgKi8gMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwgLyogZTAgKi8KLSAgLyogZjAgKi8gMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsMSAgLyogZjAgKi8KLSAgLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgKi8KLSAgLyogICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYyBkIGUgZiAgICAgICAgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHR3b2J5dGVfaGFzX21vZHJtWzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsIC8qIDBmICovCi0gIC8qIDEwICovIDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCi0gIC8qIDIwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDJmICovCi0gIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCi0gIC8qIDQwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDRmICovCi0gIC8qIDUwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsIC8qIDVmICovCi0gIC8qIDYwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsIC8qIDZmICovCi0gIC8qIDcwICovIDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDEsIC8qIDdmICovCi0gIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCi0gIC8qIDkwICovIDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIDlmICovCi0gIC8qIGEwICovIDAsMCwwLDEsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDEsIC8qIGFmICovCi0gIC8qIGIwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMSwxLDEsIC8qIGJmICovCi0gIC8qIGMwICovIDEsMSwxLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCi0gIC8qIGQwICovIDAsMSwxLDEsMCwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIGRmICovCi0gIC8qIGUwICovIDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsIC8qIGVmICovCi0gIC8qIGYwICovIDAsMSwxLDEsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDAgIC8qIGZmICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0d29ieXRlX3VzZXNfZjNfcHJlZml4WzI1Nl0gPSB7Ci0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qIDAwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDBmICovCi0gIC8qIDEwICovIDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDFmICovCi0gIC8qIDIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDAsIC8qIDJmICovCi0gIC8qIDMwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDNmICovCi0gIC8qIDQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDRmICovCi0gIC8qIDUwICovIDAsMSwxLDEsMCwwLDAsMCwxLDEsMCwwLDEsMSwxLDEsIC8qIDVmICovCi0gIC8qIDYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDZmICovCi0gIC8qIDcwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDdmICovCi0gIC8qIDgwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDhmICovCi0gIC8qIDkwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIDlmICovCi0gIC8qIGEwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGFmICovCi0gIC8qIGIwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGJmICovCi0gIC8qIGMwICovIDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGNmICovCi0gIC8qIGQwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGRmICovCi0gIC8qIGUwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIGVmICovCi0gIC8qIGYwICovIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgIC8qIGZmICovCi0gIC8qICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICovCi0gIC8qICAgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgYSBiIGMgZCBlIGYgICAgICAgICovCi19OwotCi1zdGF0aWMgY2hhciBvYnVmWzEwMF07Ci1zdGF0aWMgY2hhciAqb2J1ZnA7Ci1zdGF0aWMgY2hhciBzY3JhdGNoYnVmWzEwMF07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqc3RhcnRfY29kZXA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciAqaW5zbl9jb2RlcDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyICpjb2RlcDsKLXN0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICp0aGVfaW5mbzsKLXN0YXRpYyBpbnQgbW9kOwotc3RhdGljIGludCBybTsKLXN0YXRpYyBpbnQgcmVnOwotc3RhdGljIHZvaWQgb2FwcGVuZCBQQVJBTVMgKChjb25zdCBjaGFyICpzKSk7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lczMyW109ewotICAiJWVheCIsIiVlY3giLCIlZWR4IiwiJWVieCIsICIlZXNwIiwiJWVicCIsIiVlc2kiLCIlZWRpIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXMxNltdID0gewotICAiJWF4IiwiJWN4IiwiJWR4IiwiJWJ4IiwiJXNwIiwiJWJwIiwiJXNpIiwiJWRpIiwKLX07Ci1zdGF0aWMgY29uc3QgY2hhciAqbmFtZXM4W10gPSB7Ci0gICIlYWwiLCIlY2wiLCIlZGwiLCIlYmwiLCIlYWgiLCIlY2giLCIlZGgiLCIlYmgiLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICpuYW1lc19zZWdbXSA9IHsKLSAgIiVlcyIsIiVjcyIsIiVzcyIsIiVkcyIsIiVmcyIsIiVncyIsIiU/IiwiJT8iLAotfTsKLXN0YXRpYyBjb25zdCBjaGFyICppbmRleDE2W10gPSB7Ci0gICIlYngsJXNpIiwiJWJ4LCVkaSIsIiVicCwlc2kiLCIlYnAsJWRpIiwiJXNpIiwiJWRpIiwiJWJwIiwiJWJ4IgotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkaXMzODYgZ3Jwc1tdWzhdID0gewotICAvKiBHUlAxYiAqLwotICB7Ci0gICAgeyAiYWRkQSIsCUViLCBJYiB9LAotICAgIHsgIm9yQSIsCUViLCBJYiB9LAotICAgIHsgImFkY0EiLAlFYiwgSWIgfSwKLSAgICB7ICJzYmJBIiwJRWIsIEliIH0sCi0gICAgeyAiYW5kQSIsCUViLCBJYiB9LAotICAgIHsgInN1YkEiLAlFYiwgSWIgfSwKLSAgICB7ICJ4b3JBIiwJRWIsIEliIH0sCi0gICAgeyAiY21wQSIsCUViLCBJYiB9Ci0gIH0sCi0gIC8qIEdSUDFTICovCi0gIHsKLSAgICB7ICJhZGRRIiwJRXYsIEl2IH0sCi0gICAgeyAib3JRIiwJRXYsIEl2IH0sCi0gICAgeyAiYWRjUSIsCUV2LCBJdiB9LAotICAgIHsgInNiYlEiLAlFdiwgSXYgfSwKLSAgICB7ICJhbmRRIiwJRXYsIEl2IH0sCi0gICAgeyAic3ViUSIsCUV2LCBJdiB9LAotICAgIHsgInhvclEiLAlFdiwgSXYgfSwKLSAgICB7ICJjbXBRIiwJRXYsIEl2IH0KLSAgfSwKLSAgLyogR1JQMVNzICovCi0gIHsKLSAgICB7ICJhZGRRIiwJRXYsIHNJYiB9LAotICAgIHsgIm9yUSIsCUV2LCBzSWIgfSwKLSAgICB7ICJhZGNRIiwJRXYsIHNJYiB9LAotICAgIHsgInNiYlEiLAlFdiwgc0liIH0sCi0gICAgeyAiYW5kUSIsCUV2LCBzSWIgfSwKLSAgICB7ICJzdWJRIiwJRXYsIHNJYiB9LAotICAgIHsgInhvclEiLAlFdiwgc0liIH0sCi0gICAgeyAiY21wUSIsCUV2LCBzSWIgfQotICB9LAotICAvKiBHUlAyYiAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBJYiB9LAotICAgIHsgInJvckEiLAlFYiwgSWIgfSwKLSAgICB7ICJyY2xBIiwJRWIsIEliIH0sCi0gICAgeyAicmNyQSIsCUViLCBJYiB9LAotICAgIHsgInNobEEiLAlFYiwgSWIgfSwKLSAgICB7ICJzaHJBIiwJRWIsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAic2FyQSIsCUViLCBJYiB9LAotICB9LAotICAvKiBHUlAyUyAqLwotICB7Ci0gICAgeyAicm9sUSIsCUV2LCBJYiB9LAotICAgIHsgInJvclEiLAlFdiwgSWIgfSwKLSAgICB7ICJyY2xRIiwJRXYsIEliIH0sCi0gICAgeyAicmNyUSIsCUV2LCBJYiB9LAotICAgIHsgInNobFEiLAlFdiwgSWIgfSwKLSAgICB7ICJzaHJRIiwJRXYsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAic2FyUSIsCUV2LCBJYiB9LAotICB9LAotICAvKiBHUlAyYl9vbmUgKi8KLSAgewotICAgIHsgInJvbEEiLAlFYiB9LAotICAgIHsgInJvckEiLAlFYiB9LAotICAgIHsgInJjbEEiLAlFYiB9LAotICAgIHsgInJjckEiLAlFYiB9LAotICAgIHsgInNobEEiLAlFYiB9LAotICAgIHsgInNockEiLAlFYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInNhckEiLAlFYiB9LAotICB9LAotICAvKiBHUlAyU19vbmUgKi8KLSAgewotICAgIHsgInJvbFEiLAlFdiB9LAotICAgIHsgInJvclEiLAlFdiB9LAotICAgIHsgInJjbFEiLAlFdiB9LAotICAgIHsgInJjclEiLAlFdiB9LAotICAgIHsgInNobFEiLAlFdiB9LAotICAgIHsgInNoclEiLAlFdiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInNhclEiLAlFdiB9LAotICB9LAotICAvKiBHUlAyYl9jbCAqLwotICB7Ci0gICAgeyAicm9sQSIsCUViLCBDTCB9LAotICAgIHsgInJvckEiLAlFYiwgQ0wgfSwKLSAgICB7ICJyY2xBIiwJRWIsIENMIH0sCi0gICAgeyAicmNyQSIsCUViLCBDTCB9LAotICAgIHsgInNobEEiLAlFYiwgQ0wgfSwKLSAgICB7ICJzaHJBIiwJRWIsIENMIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAic2FyQSIsCUViLCBDTCB9LAotICB9LAotICAvKiBHUlAyU19jbCAqLwotICB7Ci0gICAgeyAicm9sUSIsCUV2LCBDTCB9LAotICAgIHsgInJvclEiLAlFdiwgQ0wgfSwKLSAgICB7ICJyY2xRIiwJRXYsIENMIH0sCi0gICAgeyAicmNyUSIsCUV2LCBDTCB9LAotICAgIHsgInNobFEiLAlFdiwgQ0wgfSwKLSAgICB7ICJzaHJRIiwJRXYsIENMIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAic2FyUSIsCUV2LCBDTCB9Ci0gIH0sCi0gIC8qIEdSUDNiICovCi0gIHsKLSAgICB7ICJ0ZXN0QSIsCUViLCBJYiB9LAotICAgIHsgIihiYWQpIiwJRWIgfSwKLSAgICB7ICJub3RBIiwJRWIgfSwKLSAgICB7ICJuZWdBIiwJRWIgfSwKLSAgICB7ICJtdWxCIiwJQUwsIEViIH0sCi0gICAgeyAiaW11bEIiLAlBTCwgRWIgfSwKLSAgICB7ICJkaXZCIiwJQUwsIEViIH0sCi0gICAgeyAiaWRpdkIiLAlBTCwgRWIgfQotICB9LAotICAvKiBHUlAzUyAqLwotICB7Ci0gICAgeyAidGVzdFEiLAlFdiwgSXYgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJub3RRIiwJRXYgfSwKLSAgICB7ICJuZWdRIiwJRXYgfSwKLSAgICB7ICJtdWxTIiwJZUFYLCBFdiB9LAotICAgIHsgImltdWxTIiwJZUFYLCBFdiB9LAotICAgIHsgImRpdlMiLAllQVgsIEV2IH0sCi0gICAgeyAiaWRpdlMiLAllQVgsIEV2IH0sCi0gIH0sCi0gIC8qIEdSUDQgKi8KLSAgewotICAgIHsgImluY0EiLCBFYiB9LAotICAgIHsgImRlY0EiLCBFYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBHUlA1ICovCi0gIHsKLSAgICB7ICJpbmNRIiwJRXYgfSwKLSAgICB7ICJkZWNRIiwJRXYgfSwKLSAgICB7ICJjYWxsUCIsCWluZGlyRXYgfSwKLSAgICB7ICJjYWxsUCIsCWluZGlyRXYgfSwKLSAgICB7ICJqbXBQIiwJaW5kaXJFdiB9LAotICAgIHsgImxqbXBQIiwJaW5kaXJFdiB9LAotICAgIHsgInB1c2hRIiwJRXYgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogR1JQNiAqLwotICB7Ci0gICAgeyAic2xkdCIsCUV3IH0sCi0gICAgeyAic3RyIiwJRXcgfSwKLSAgICB7ICJsbGR0IiwJRXcgfSwKLSAgICB7ICJsdHIiLAlFdyB9LAotICAgIHsgInZlcnIiLAlFdyB9LAotICAgIHsgInZlcnciLAlFdyB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9Ci0gIH0sCi0gIC8qIEdSUDcgKi8KLSAgewotICAgIHsgInNnZHQiLCBFdyB9LAotICAgIHsgInNpZHQiLCBFdyB9LAotICAgIHsgImxnZHQiLCBFdyB9LAotICAgIHsgImxpZHQiLCBFdyB9LAotICAgIHsgInNtc3ciLCBFdyB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgImxtc3ciLCBFdyB9LAotICAgIHsgImludmxwZyIsIEV3IH0sCi0gIH0sCi0gIC8qIEdSUDggKi8KLSAgewotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgImJ0USIsCUV2LCBJYiB9LAotICAgIHsgImJ0c1EiLAlFdiwgSWIgfSwKLSAgICB7ICJidHJRIiwJRXYsIEliIH0sCi0gICAgeyAiYnRjUSIsCUV2LCBJYiB9LAotICB9LAotICAvKiBHUlA5ICovCi0gIHsKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJjbXB4Y2hnOGIiLCBFdiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBHUlAxMCAqLwotICB7Ci0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAicHNybHciLCBNUywgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJwc3JhdyIsIE1TLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInBzbGx3IiwgTVMsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gIH0sCi0gIC8qIEdSUDExICovCi0gIHsKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJwc3JsZCIsIE1TLCBJYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInBzcmFkIiwgTVMsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAicHNsbGQiLCBNUywgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogR1JQMTIgKi8KLSAgewotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgInBzcmxxIiwgTVMsIEliIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAicHNsbHEiLCBNUywgSWIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogR1JQMTMgKi8KLSAgewotICAgIHsgImZ4c2F2ZSIsIEV2IH0sCi0gICAgeyAiZnhyc3RvciIsIEV2IH0sCi0gICAgeyAibGRteGNzciIsIEV2IH0sCi0gICAgeyAic3RteGNzciIsIEV2IH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyAic2ZlbmNlIiwgTm9uZSB9LAotICB9LAotICAvKiBHUlAxNCAqLwotICB7Ci0gICAgeyAicHJlZmV0Y2hudGEiLCBFdiB9LAotICAgIHsgInByZWZldGNodDAiLCBFdiB9LAotICAgIHsgInByZWZldGNodDEiLCBFdiB9LAotICAgIHsgInByZWZldGNodDIiLCBFdiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9LAotICAvKiBHUlBBTUQgKi8KLSAgewotICAgIHsgInByZWZldGNoIiwgRWIgfSwKLSAgICB7ICJwcmVmZXRjaHciLCBFYiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgIihiYWQpIiB9LAotICB9Ci0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IHByZWZpeF91c2VyX3RhYmxlW11bMl0gPSB7Ci0gIC8qIFBSRUdSUDAgKi8KLSAgewotICAgIHsgImFkZHBzIiwgWE0sIEVYIH0sCi0gICAgeyAiYWRkc3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQMSAqLwotICB7Ci0gICAgeyAiIiwgWE0sIEVYLCBPUFNJTUQgfSwJLyogU2VlIE9QX1NJTURfU1VGRklYICovCi0gICAgeyAiIiwgWE0sIEVYLCBPUFNJTUQgfSwKLSAgfSwKLSAgLyogUFJFR1JQMiAqLwotICB7Ci0gICAgeyAiY3Z0cGkycHMiLCBYTSwgRU0gfSwKLSAgICB7ICJjdnRzaTJzcyIsIFhNLCBFdiB9LAotICB9LAotICAvKiBQUkVHUlAzICovCi0gIHsKLSAgICB7ICJjdnRwczJwaSIsIE1YLCBFWCB9LAotICAgIHsgImN2dHNzMnNpIiwgR3YsIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDQgKi8KLSAgewotICAgIHsgImN2dHRwczJwaSIsIE1YLCBFWCB9LAotICAgIHsgImN2dHRzczJzaSIsIEd2LCBFWCB9LAotICB9LAotICAvKiBQUkVHUlA1ICovCi0gIHsKLSAgICB7ICJkaXZwcyIsIFhNLCBFWCB9LAotICAgIHsgImRpdnNzIiwgWE0sIEVYIH0sCi0gIH0sCi0gIC8qIFBSRUdSUDYgKi8KLSAgewotICAgIHsgIm1heHBzIiwgWE0sIEVYIH0sCi0gICAgeyAibWF4c3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQNyAqLwotICB7Ci0gICAgeyAibWlucHMiLCBYTSwgRVggfSwKLSAgICB7ICJtaW5zcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlA4ICovCi0gIHsKLSAgICB7ICJtb3Z1cHMiLCBYTSwgRVggfSwKLSAgICB7ICJtb3ZzcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlA5ICovCi0gIHsKLSAgICB7ICJtb3Z1cHMiLCBFWCwgWE0gfSwKLSAgICB7ICJtb3ZzcyIsIEVYLCBYTSB9LAotICB9LAotICAvKiBQUkVHUlAxMCAqLwotICB7Ci0gICAgeyAibXVscHMiLCBYTSwgRVggfSwKLSAgICB7ICJtdWxzcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlAxMSAqLwotICB7Ci0gICAgeyAicmNwcHMiLCBYTSwgRVggfSwKLSAgICB7ICJyY3BzcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlAxMiAqLwotICB7Ci0gICAgeyAicnNxcnRwcyIsIFhNLCBFWCB9LAotICAgIHsgInJzcXJ0c3MiLCBYTSwgRVggfSwKLSAgfSwKLSAgLyogUFJFR1JQMTMgKi8KLSAgewotICAgIHsgInNxcnRwcyIsIFhNLCBFWCB9LAotICAgIHsgInNxcnRzcyIsIFhNLCBFWCB9LAotICB9LAotICAvKiBQUkVHUlAxNCAqLwotICB7Ci0gICAgeyAic3VicHMiLCBYTSwgRVggfSwKLSAgICB7ICJzdWJzcyIsIFhNLCBFWCB9LAotICB9Ci19OwotCi0jZGVmaW5lIElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUiBfKCI8aW50ZXJuYWwgZGlzYXNzZW1ibGVyIGVycm9yPiIpCi0KLXN0YXRpYyB2b2lkCi1ja3ByZWZpeCAoKQotewotICBwcmVmaXhlcyA9IDA7Ci0gIHVzZWRfcHJlZml4ZXMgPSAwOwotICB3aGlsZSAoMSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgICAgIHN3aXRjaCAoKmNvZGVwKQotCXsKLQljYXNlIDB4ZjM6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfUkVQWjsKLQkgIGJyZWFrOwotCWNhc2UgMHhmMjoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9SRVBOWjsKLQkgIGJyZWFrOwotCWNhc2UgMHhmMDoKLQkgIHByZWZpeGVzIHw9IFBSRUZJWF9MT0NLOwotCSAgYnJlYWs7Ci0JY2FzZSAweDJlOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0NTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDM2OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX1NTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDNlOgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0RTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDI2OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0VTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY0OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0ZTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY1OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0dTOwotCSAgYnJlYWs7Ci0JY2FzZSAweDY2OgotCSAgcHJlZml4ZXMgfD0gUFJFRklYX0RBVEE7Ci0JICBicmVhazsKLQljYXNlIDB4Njc6Ci0JICBwcmVmaXhlcyB8PSBQUkVGSVhfQUREUjsKLQkgIGJyZWFrOwotCWNhc2UgRldBSVRfT1BDT0RFOgotCSAgLyogZndhaXQgaXMgcmVhbGx5IGFuIGluc3RydWN0aW9uLiAgSWYgdGhlcmUgYXJlIHByZWZpeGVzCi0JICAgICBiZWZvcmUgdGhlIGZ3YWl0LCB0aGV5IGJlbG9uZyB0byB0aGUgZndhaXQsICpub3QqIHRvIHRoZQotCSAgICAgZm9sbG93aW5nIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChwcmVmaXhlcykKLQkgICAgewotCSAgICAgIHByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKLQkgICAgICBjb2RlcCsrOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAgcHJlZml4ZXMgPSBQUkVGSVhfRldBSVQ7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcmV0dXJuOwotCX0KLSAgICAgIGNvZGVwKys7Ci0gICAgfQotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByZWZpeCBieXRlIFBSRUYsIG9yIE5VTEwgaWYgUFJFRiBpcyBub3QgYQotICAgcHJlZml4IGJ5dGUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wcmVmaXhfbmFtZSAocHJlZiwgc2l6ZWZsYWcpCi0gICAgIGludCBwcmVmOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHN3aXRjaCAocHJlZikKLSAgICB7Ci0gICAgY2FzZSAweGYzOgotICAgICAgcmV0dXJuICJyZXB6IjsKLSAgICBjYXNlIDB4ZjI6Ci0gICAgICByZXR1cm4gInJlcG56IjsKLSAgICBjYXNlIDB4ZjA6Ci0gICAgICByZXR1cm4gImxvY2siOwotICAgIGNhc2UgMHgyZToKLSAgICAgIHJldHVybiAiY3MiOwotICAgIGNhc2UgMHgzNjoKLSAgICAgIHJldHVybiAic3MiOwotICAgIGNhc2UgMHgzZToKLSAgICAgIHJldHVybiAiZHMiOwotICAgIGNhc2UgMHgyNjoKLSAgICAgIHJldHVybiAiZXMiOwotICAgIGNhc2UgMHg2NDoKLSAgICAgIHJldHVybiAiZnMiOwotICAgIGNhc2UgMHg2NToKLSAgICAgIHJldHVybiAiZ3MiOwotICAgIGNhc2UgMHg2NjoKLSAgICAgIHJldHVybiAoc2l6ZWZsYWcgJiBERkxBRykgPyAiZGF0YTE2IiA6ICJkYXRhMzIiOwotICAgIGNhc2UgMHg2NzoKLSAgICAgIHJldHVybiAoc2l6ZWZsYWcgJiBBRkxBRykgPyAiYWRkcjE2IiA6ICJhZGRyMzIiOwotICAgIGNhc2UgRldBSVRfT1BDT0RFOgotICAgICAgcmV0dXJuICJmd2FpdCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotc3RhdGljIGNoYXIgb3Axb3V0WzEwMF0sIG9wMm91dFsxMDBdLCBvcDNvdXRbMTAwXTsKLXN0YXRpYyBpbnQgb3BfYWQsIG9wX2luZGV4WzNdOwotc3RhdGljIHVuc2lnbmVkIGludCBvcF9hZGRyZXNzWzNdOwotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydF9wYzsKLQotDAotLyoKLSAqICAgT24gdGhlIDM4NidzIG9mIDE5ODgsIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbiBpcyAxNSBieXRlcy4KLSAqICAgKHNlZSB0b3BpYyAiUmVkdW5kYW50IHByZWZpeGVzIiBpbiB0aGUgIkRpZmZlcmVuY2VzIGZyb20gODA4NiIKLSAqICAgc2VjdGlvbiBvZiB0aGUgIlZpcnR1YWwgODA4NiBNb2RlIiBjaGFwdGVyLikKLSAqICdwYycgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24sIGl0IHdpbGwKLSAqICAgYmUgdXNlZCB0byBwcmludCB0aGUgdGFyZ2V0IGFkZHJlc3MgaWYgdGhpcyBpcyBhIHJlbGF0aXZlIGp1bXAgb3IgY2FsbAotICogVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIGluc3RydWN0aW9uIGluIGJ5dGVzLgotICovCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9pMzg2Ci0gIFBBUkFNUyAoKGJmZF92bWEgcGMsIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8pKTsKLQotc3RhdGljIGNoYXIgaW50ZWxfc3ludGF4Owotc3RhdGljIGNoYXIgb3Blbl9jaGFyOwotc3RhdGljIGNoYXIgY2xvc2VfY2hhcjsKLXN0YXRpYyBjaGFyIHNlcGFyYXRvcl9jaGFyOwotc3RhdGljIGNoYXIgc2NhbGVfY2hhcjsKLQotaW50Ci1wcmludF9pbnNuX2kzODZfYXR0IChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50ZWxfc3ludGF4ID0gMDsKLSAgb3Blbl9jaGFyID0gJygnOwotICBjbG9zZV9jaGFyID0gICcpJzsKLSAgc2VwYXJhdG9yX2NoYXIgPSAnLCc7Ci0gIHNjYWxlX2NoYXIgPSAnLCc7Ci0KLSAgcmV0dXJuIHByaW50X2luc25faTM4NiAocGMsIGluZm8pOwotfQotCi1pbnQKLXByaW50X2luc25faTM4Nl9pbnRlbCAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludGVsX3N5bnRheCA9IDE7Ci0gIG9wZW5fY2hhciA9ICdbJzsKLSAgY2xvc2VfY2hhciA9ICddJzsKLSAgc2VwYXJhdG9yX2NoYXIgPSAnKyc7Ci0gIHNjYWxlX2NoYXIgPSAnKic7Ci0KLSAgcmV0dXJuIHByaW50X2luc25faTM4NiAocGMsIGluZm8pOwotfQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2kzODYgKHBjLCBpbmZvKQotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3QgZGlzMzg2ICpkcDsKLSAgaW50IGk7Ci0gIGludCB0d29fc291cmNlX29wczsKLSAgY2hhciAqZmlyc3QsICpzZWNvbmQsICp0aGlyZDsKLSAgaW50IG5lZWRjb21tYTsKLSAgdW5zaWduZWQgY2hhciBuZWVkX21vZHJtOwotICB1bnNpZ25lZCBjaGFyIHVzZXNfZjNfcHJlZml4OwotICBpbnQgc2l6ZWZsYWcsIG9yaWdfc2l6ZWZsYWc7Ci0KLSAgc3RydWN0IGRpc19wcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICppbmJ1ZiA9IHByaXYudGhlX2J1ZmZlcjsKLQotICBpZiAoaW5mby0+bWFjaCA9PSBiZmRfbWFjaF9pMzg2X2kzODYKLSAgICAgIHx8IGluZm8tPm1hY2ggPT0gYmZkX21hY2hfaTM4Nl9pMzg2X2ludGVsX3N5bnRheCkKLSAgICBzaXplZmxhZyA9IEFGTEFHfERGTEFHOwotICBlbHNlIGlmIChpbmZvLT5tYWNoID09IGJmZF9tYWNoX2kzODZfaTgwODYpCi0gICAgc2l6ZWZsYWcgPSAwOwotICBlbHNlCi0gICAgYWJvcnQgKCk7Ci0gIG9yaWdfc2l6ZWZsYWcgPSBzaXplZmxhZzsKLQotICAvKiBUaGUgb3V0cHV0IGxvb2tzIGJldHRlciBpZiB3ZSBwdXQgNiBieXRlcyBvbiBhIGxpbmUsIHNpbmNlIHRoYXQKLSAgICAgcHV0cyBtb3N0IGxvbmcgd29yZCBpbnN0cnVjdGlvbnMgb24gYSBzaW5nbGUgbGluZS4gICovCi0gIGluZm8tPmJ5dGVzX3Blcl9saW5lID0gNjsKLQotICBpbmZvLT5wcml2YXRlX2RhdGEgPSAoUFRSKSAmcHJpdjsKLSAgcHJpdi5tYXhfZmV0Y2hlZCA9IHByaXYudGhlX2J1ZmZlcjsKLSAgcHJpdi5pbnNuX3N0YXJ0ID0gcGM7Ci0KLSAgb2J1ZlswXSA9IDA7Ci0gIG9wMW91dFswXSA9IDA7Ci0gIG9wMm91dFswXSA9IDA7Ci0gIG9wM291dFswXSA9IDA7Ci0KLSAgb3BfaW5kZXhbMF0gPSBvcF9pbmRleFsxXSA9IG9wX2luZGV4WzJdID0gLTE7Ci0KLSAgdGhlX2luZm8gPSBpbmZvOwotICBzdGFydF9wYyA9IHBjOwotICBzdGFydF9jb2RlcCA9IGluYnVmOwotICBjb2RlcCA9IGluYnVmOwotCi0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAvKiBHZXR0aW5nIGhlcmUgbWVhbnMgd2UgdHJpZWQgZm9yIGRhdGEgYnV0IGRpZG4ndCBnZXQgaXQuICBUaGF0Ci0gICAgICAgICBtZWFucyB3ZSBoYXZlIGFuIGluY29tcGxldGUgaW5zdHJ1Y3Rpb24gb2Ygc29tZSBzb3J0LiAgSnVzdAotICAgICAgICAgcHJpbnQgdGhlIGZpcnN0IGJ5dGUgYXMgYSBwcmVmaXggb3IgYSAuYnl0ZSBwc2V1ZG8tb3AuICAqLwotICAgICAgaWYgKGNvZGVwID4gaW5idWYpCi0JewotCSAgbmFtZSA9IHByZWZpeF9uYW1lIChpbmJ1ZlswXSwgb3JpZ19zaXplZmxhZyk7Ci0JICBpZiAobmFtZSAhPSBOVUxMKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBKdXN0IHByaW50IHRoZSBmaXJzdCBieXRlIGFzIGEgLmJ5dGUgaW5zdHJ1Y3Rpb24uICAqLwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmJ5dGUgMHgleCIsCi0JCQkJICAgICAodW5zaWduZWQgaW50KSBpbmJ1ZlswXSk7Ci0JICAgIH0KLQotCSAgcmV0dXJuIDE7Ci0JfQotCi0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGNrcHJlZml4ICgpOwotCi0gIGluc25fY29kZXAgPSBjb2RlcDsKLQotICBGRVRDSF9EQVRBIChpbmZvLCBjb2RlcCArIDEpOwotICB0d29fc291cmNlX29wcyA9ICgqY29kZXAgPT0gMHg2MikgfHwgKCpjb2RlcCA9PSAweGM4KTsKLQotICBvYnVmcCA9IG9idWY7Ci0KLSAgaWYgKChwcmVmaXhlcyAmIFBSRUZJWF9GV0FJVCkKLSAgICAgICYmICgoKmNvZGVwIDwgMHhkOCkgfHwgKCpjb2RlcCA+IDB4ZGYpKSkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0gICAgICAvKiBmd2FpdCBub3QgZm9sbG93ZWQgYnkgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb24uICBQcmludCB0aGUKLSAgICAgICAgIGZpcnN0IHByZWZpeCwgd2hpY2ggaXMgcHJvYmFibHkgZndhaXQgaXRzZWxmLiAgKi8KLSAgICAgIG5hbWUgPSBwcmVmaXhfbmFtZSAoaW5idWZbMF0sIG9yaWdfc2l6ZWZsYWcpOwotICAgICAgaWYgKG5hbWUgPT0gTlVMTCkKLQluYW1lID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWUpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gIGlmICgqY29kZXAgPT0gMHgwZikKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBjb2RlcCArIDIpOwotICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgZHAgPSAmZGlzMzg2X3R3b2J5dGVfaW50ZWxbKisrY29kZXBdOwotICAgICAgZWxzZQotICAgICAgICBkcCA9ICZkaXMzODZfdHdvYnl0ZV9hdHRbKisrY29kZXBdOwotICAgICAgbmVlZF9tb2RybSA9IHR3b2J5dGVfaGFzX21vZHJtWypjb2RlcF07Ci0gICAgICB1c2VzX2YzX3ByZWZpeCA9IHR3b2J5dGVfdXNlc19mM19wcmVmaXhbKmNvZGVwXTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICBkcCA9ICZkaXMzODZfaW50ZWxbKmNvZGVwXTsKLSAgICAgIGVsc2UKLSAgICAgICAgZHAgPSAmZGlzMzg2X2F0dFsqY29kZXBdOwotICAgICAgbmVlZF9tb2RybSA9IG9uZWJ5dGVfaGFzX21vZHJtWypjb2RlcF07Ci0gICAgICB1c2VzX2YzX3ByZWZpeCA9IDA7Ci0gICAgfQotICBjb2RlcCsrOwotCi0gIGlmICghdXNlc19mM19wcmVmaXggJiYgKHByZWZpeGVzICYgUFJFRklYX1JFUFopKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCJyZXB6ICIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfUkVQWjsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9SRVBOWikKLSAgICB7Ci0gICAgICBvYXBwZW5kICgicmVwbnogIik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9SRVBOWjsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9MT0NLKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCJsb2NrICIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfTE9DSzsKLSAgICB9Ci0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RBVEEpCi0gICAgc2l6ZWZsYWcgXj0gREZMQUc7Ci0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0FERFIpCi0gICAgewotICAgICAgc2l6ZWZsYWcgXj0gQUZMQUc7Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLSAgICAgICAgb2FwcGVuZCAoImFkZHIzMiAiKTsKLSAgICAgIGVsc2UKLQlvYXBwZW5kICgiYWRkcjE2ICIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfQUREUjsKLSAgICB9Ci0KLSAgaWYgKG5lZWRfbW9kcm0pCi0gICAgewotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgY29kZXAgKyAxKTsKLSAgICAgIG1vZCA9ICgqY29kZXAgPj4gNikgJiAzOwotICAgICAgcmVnID0gKCpjb2RlcCA+PiAzKSAmIDc7Ci0gICAgICBybSA9ICpjb2RlcCAmIDc7Ci0gICAgfQotCi0gIGlmIChkcC0+bmFtZSA9PSBOVUxMICYmIGRwLT5ieXRlbW9kZTEgPT0gRkxPQVRDT0RFKQotICAgIHsKLSAgICAgIGRvZmxvYXQgKHNpemVmbGFnKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoZHAtPm5hbWUgPT0gTlVMTCkKLQl7Ci0JICBzd2l0Y2goZHAtPmJ5dGVtb2RlMikKLQkgICAgewotCSAgICAgIGNhc2UgVVNFX0dST1VQUzoKLQkgICAgICAgIGRwID0gJmdycHNbZHAtPmJ5dGVtb2RlMV1bcmVnXTsKLQkJYnJlYWs7Ci0JICAgICAgY2FzZSBVU0VfUFJFRklYX1VTRVJfVEFCTEU6Ci0JCWRwID0gJnByZWZpeF91c2VyX3RhYmxlW2RwLT5ieXRlbW9kZTFdW3ByZWZpeGVzICYgUFJFRklYX1JFUFogPyAxIDogMF07Ci0JCXVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX1JFUFopOwotCQlicmVhazsKLQkgICAgICBkZWZhdWx0OgotCQlvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOwotCQlicmVhazsKLQkgICAgfQotCX0KLQotICAgICAgcHV0b3AgKGRwLT5uYW1lLCBzaXplZmxhZyk7Ci0KLSAgICAgIG9idWZwID0gb3Axb3V0OwotICAgICAgb3BfYWQgPSAyOwotICAgICAgaWYgKGRwLT5vcDEpCi0JKCpkcC0+b3AxKShkcC0+Ynl0ZW1vZGUxLCBzaXplZmxhZyk7Ci0KLSAgICAgIG9idWZwID0gb3Ayb3V0OwotICAgICAgb3BfYWQgPSAxOwotICAgICAgaWYgKGRwLT5vcDIpCi0JKCpkcC0+b3AyKShkcC0+Ynl0ZW1vZGUyLCBzaXplZmxhZyk7Ci0KLSAgICAgIG9idWZwID0gb3Azb3V0OwotICAgICAgb3BfYWQgPSAwOwotICAgICAgaWYgKGRwLT5vcDMpCi0JKCpkcC0+b3AzKShkcC0+Ynl0ZW1vZGUzLCBzaXplZmxhZyk7Ci0gICAgfQotCi0gIC8qIFNlZSBpZiBhbnkgcHJlZml4ZXMgd2VyZSBub3QgdXNlZC4gIElmIHNvLCBwcmludCB0aGUgZmlyc3Qgb25lCi0gICAgIHNlcGFyYXRlbHkuICBJZiB3ZSBkb24ndCBkbyB0aGlzLCB3ZSdsbCB3aW5kIHVwIHByaW50aW5nIGFuCi0gICAgIGluc3RydWN0aW9uIHN0cmVhbSB3aGljaCBkb2VzIG5vdCBwcmVjaXNlbHkgY29ycmVzcG9uZCB0byB0aGUKLSAgICAgYnl0ZXMgd2UgYXJlIGRpc2Fzc2VtYmxpbmcuICAqLwotICBpZiAoKHByZWZpeGVzICYgfnVzZWRfcHJlZml4ZXMpICE9IDApCi0gICAgewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgbmFtZSA9IHByZWZpeF9uYW1lIChpbmJ1ZlswXSwgb3JpZ19zaXplZmxhZyk7Ci0gICAgICBpZiAobmFtZSA9PSBOVUxMKQotCW5hbWUgPSBJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1I7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgb2J1ZnAgPSBvYnVmICsgc3RybGVuIChvYnVmKTsKLSAgZm9yIChpID0gc3RybGVuIChvYnVmKTsgaSA8IDY7IGkrKykKLSAgICBvYXBwZW5kICgiICIpOwotICBvYXBwZW5kICgiICIpOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgb2J1Zik7Ci0KLSAgLyogVGhlIGVudGVyIGFuZCBib3VuZCBpbnN0cnVjdGlvbnMgYXJlIHByaW50ZWQgd2l0aCBvcGVyYW5kcyBpbiB0aGUgc2FtZQotICAgICBvcmRlciBhcyB0aGUgaW50ZWwgYm9vazsgZXZlcnl0aGluZyBlbHNlIGlzIHByaW50ZWQgaW4gcmV2ZXJzZSBvcmRlci4gICovCi0gIGlmIChpbnRlbF9zeW50YXggfHwgdHdvX3NvdXJjZV9vcHMpCi0gICAgewotICAgICAgZmlyc3QgPSBvcDFvdXQ7Ci0gICAgICBzZWNvbmQgPSBvcDJvdXQ7Ci0gICAgICB0aGlyZCA9IG9wM291dDsKLSAgICAgIG9wX2FkID0gb3BfaW5kZXhbMF07Ci0gICAgICBvcF9pbmRleFswXSA9IG9wX2luZGV4WzJdOwotICAgICAgb3BfaW5kZXhbMl0gPSBvcF9hZDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBmaXJzdCA9IG9wM291dDsKLSAgICAgIHNlY29uZCA9IG9wMm91dDsKLSAgICAgIHRoaXJkID0gb3Axb3V0OwotICAgIH0KLSAgbmVlZGNvbW1hID0gMDsKLSAgaWYgKCpmaXJzdCkKLSAgICB7Ci0gICAgICBpZiAob3BfaW5kZXhbMF0gIT0gLTEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgoYmZkX3ZtYSkgb3BfYWRkcmVzc1tvcF9pbmRleFswXV0sIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBmaXJzdCk7Ci0gICAgICBuZWVkY29tbWEgPSAxOwotICAgIH0KLSAgaWYgKCpzZWNvbmQpCi0gICAgewotICAgICAgaWYgKG5lZWRjb21tYSkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLSAgICAgIGlmIChvcF9pbmRleFsxXSAhPSAtMSkKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSBvcF9hZGRyZXNzW29wX2luZGV4WzFdXSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHNlY29uZCk7Ci0gICAgICBuZWVkY29tbWEgPSAxOwotICAgIH0KLSAgaWYgKCp0aGlyZCkKLSAgICB7Ci0gICAgICBpZiAobmVlZGNvbW1hKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLCIpOwotICAgICAgaWYgKG9wX2luZGV4WzJdICE9IC0xKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGJmZF92bWEpIG9wX2FkZHJlc3Nbb3BfaW5kZXhbMl1dLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgdGhpcmQpOwotICAgIH0KLSAgcmV0dXJuIGNvZGVwIC0gaW5idWY7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpmbG9hdF9tZW1fYXR0W10gPSB7Ci0gIC8qIGQ4ICovCi0gICJmYWRkcyIsCi0gICJmbXVscyIsCi0gICJmY29tcyIsCi0gICJmY29tcHMiLAotICAiZnN1YnMiLAotICAiZnN1YnJzIiwKLSAgImZkaXZzIiwKLSAgImZkaXZycyIsCi0gIC8qICBkOSAqLwotICAiZmxkcyIsCi0gICIoYmFkKSIsCi0gICJmc3RzIiwKLSAgImZzdHBzIiwKLSAgImZsZGVudiIsCi0gICJmbGRjdyIsCi0gICJmTnN0ZW52IiwKLSAgImZOc3RjdyIsCi0gIC8qIGRhICovCi0gICJmaWFkZGwiLAotICAiZmltdWxsIiwKLSAgImZpY29tbCIsCi0gICJmaWNvbXBsIiwKLSAgImZpc3VibCIsCi0gICJmaXN1YnJsIiwKLSAgImZpZGl2bCIsCi0gICJmaWRpdnJsIiwKLSAgLyogZGIgKi8KLSAgImZpbGRsIiwKLSAgIihiYWQpIiwKLSAgImZpc3RsIiwKLSAgImZpc3RwbCIsCi0gICIoYmFkKSIsCi0gICJmbGR0IiwKLSAgIihiYWQpIiwKLSAgImZzdHB0IiwKLSAgLyogZGMgKi8KLSAgImZhZGRsIiwKLSAgImZtdWxsIiwKLSAgImZjb21sIiwKLSAgImZjb21wbCIsCi0gICJmc3VibCIsCi0gICJmc3VicmwiLAotICAiZmRpdmwiLAotICAiZmRpdnJsIiwKLSAgLyogZGQgKi8KLSAgImZsZGwiLAotICAiKGJhZCkiLAotICAiZnN0bCIsCi0gICJmc3RwbCIsCi0gICJmcnN0b3IiLAotICAiKGJhZCkiLAotICAiZk5zYXZlIiwKLSAgImZOc3RzdyIsCi0gIC8qIGRlICovCi0gICJmaWFkZCIsCi0gICJmaW11bCIsCi0gICJmaWNvbSIsCi0gICJmaWNvbXAiLAotICAiZmlzdWIiLAotICAiZmlzdWJyIiwKLSAgImZpZGl2IiwKLSAgImZpZGl2ciIsCi0gIC8qIGRmICovCi0gICJmaWxkIiwKLSAgIihiYWQpIiwKLSAgImZpc3QiLAotICAiZmlzdHAiLAotICAiZmJsZCIsCi0gICJmaWxkbGwiLAotICAiZmJzdHAiLAotICAiZmlzdHBsbCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZmxvYXRfbWVtX2ludGVsW10gPSB7Ci0gIC8qIGQ4ICovCi0gICJmYWRkIiwKLSAgImZtdWwiLAotICAiZmNvbSIsCi0gICJmY29tcCIsCi0gICJmc3ViIiwKLSAgImZzdWJyIiwKLSAgImZkaXYiLAotICAiZmRpdnIiLAotICAvKiAgZDkgKi8KLSAgImZsZCIsCi0gICIoYmFkKSIsCi0gICJmc3QiLAotICAiZnN0cCIsCi0gICJmbGRlbnYiLAotICAiZmxkY3ciLAotICAiZk5zdGVudiIsCi0gICJmTnN0Y3ciLAotICAvKiBkYSAqLwotICAiZmlhZGQiLAotICAiZmltdWwiLAotICAiZmljb20iLAotICAiZmljb21wIiwKLSAgImZpc3ViIiwKLSAgImZpc3ViciIsCi0gICJmaWRpdiIsCi0gICJmaWRpdnIiLAotICAvKiBkYiAqLwotICAiZmlsZCIsCi0gICIoYmFkKSIsCi0gICJmaXN0IiwKLSAgImZpc3RwIiwKLSAgIihiYWQpIiwKLSAgImZsZCIsCi0gICIoYmFkKSIsCi0gICJmc3RwIiwKLSAgLyogZGMgKi8KLSAgImZhZGQiLAotICAiZm11bCIsCi0gICJmY29tIiwKLSAgImZjb21wIiwKLSAgImZzdWIiLAotICAiZnN1YnIiLAotICAiZmRpdiIsCi0gICJmZGl2ciIsCi0gIC8qIGRkICovCi0gICJmbGQiLAotICAiKGJhZCkiLAotICAiZnN0IiwKLSAgImZzdHAiLAotICAiZnJzdG9yIiwKLSAgIihiYWQpIiwKLSAgImZOc2F2ZSIsCi0gICJmTnN0c3ciLAotICAvKiBkZSAqLwotICAiZmlhZGQiLAotICAiZmltdWwiLAotICAiZmljb20iLAotICAiZmljb21wIiwKLSAgImZpc3ViIiwKLSAgImZpc3ViciIsCi0gICJmaWRpdiIsCi0gICJmaWRpdnIiLAotICAvKiBkZiAqLwotICAiZmlsZCIsCi0gICIoYmFkKSIsCi0gICJmaXN0IiwKLSAgImZpc3RwIiwKLSAgImZibGQiLAotICAiZmlsZCIsCi0gICJmYnN0cCIsCi0gICJmaXN0cGxsIiwKLX07Ci0KLSNkZWZpbmUgU1QgT1BfU1QsIDAKLSNkZWZpbmUgU1RpIE9QX1NUaSwgMAotCi0jZGVmaW5lIEZHUlBkOV8yIE5VTEwsIE5VTEwsIDAKLSNkZWZpbmUgRkdSUGQ5XzQgTlVMTCwgTlVMTCwgMQotI2RlZmluZSBGR1JQZDlfNSBOVUxMLCBOVUxMLCAyCi0jZGVmaW5lIEZHUlBkOV82IE5VTEwsIE5VTEwsIDMKLSNkZWZpbmUgRkdSUGQ5XzcgTlVMTCwgTlVMTCwgNAotI2RlZmluZSBGR1JQZGFfNSBOVUxMLCBOVUxMLCA1Ci0jZGVmaW5lIEZHUlBkYl80IE5VTEwsIE5VTEwsIDYKLSNkZWZpbmUgRkdSUGRlXzMgTlVMTCwgTlVMTCwgNwotI2RlZmluZSBGR1JQZGZfNCBOVUxMLCBOVUxMLCA4Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzMzg2IGZsb2F0X3JlZ1tdWzhdID0gewotICAvKiBkOCAqLwotICB7Ci0gICAgeyAiZmFkZCIsCVNULCBTVGkgfSwKLSAgICB7ICJmbXVsIiwJU1QsIFNUaSB9LAotICAgIHsgImZjb20iLAlTVGkgfSwKLSAgICB7ICJmY29tcCIsCVNUaSB9LAotICAgIHsgImZzdWIiLAlTVCwgU1RpIH0sCi0gICAgeyAiZnN1YnIiLAlTVCwgU1RpIH0sCi0gICAgeyAiZmRpdiIsCVNULCBTVGkgfSwKLSAgICB7ICJmZGl2ciIsCVNULCBTVGkgfSwKLSAgfSwKLSAgLyogZDkgKi8KLSAgewotICAgIHsgImZsZCIsCVNUaSB9LAotICAgIHsgImZ4Y2giLAlTVGkgfSwKLSAgICB7IEZHUlBkOV8yIH0sCi0gICAgeyAiKGJhZCkiIH0sCi0gICAgeyBGR1JQZDlfNCB9LAotICAgIHsgRkdSUGQ5XzUgfSwKLSAgICB7IEZHUlBkOV82IH0sCi0gICAgeyBGR1JQZDlfNyB9LAotICB9LAotICAvKiBkYSAqLwotICB7Ci0gICAgeyAiZmNtb3ZiIiwJU1QsIFNUaSB9LAotICAgIHsgImZjbW92ZSIsCVNULCBTVGkgfSwKLSAgICB7ICJmY21vdmJlIixTVCwgU1RpIH0sCi0gICAgeyAiZmNtb3Z1IiwJU1QsIFNUaSB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgRkdSUGRhXzUgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogZGIgKi8KLSAgewotICAgIHsgImZjbW92bmIiLFNULCBTVGkgfSwKLSAgICB7ICJmY21vdm5lIixTVCwgU1RpIH0sCi0gICAgeyAiZmNtb3ZuYmUiLFNULCBTVGkgfSwKLSAgICB7ICJmY21vdm51IixTVCwgU1RpIH0sCi0gICAgeyBGR1JQZGJfNCB9LAotICAgIHsgImZ1Y29taSIsCVNULCBTVGkgfSwKLSAgICB7ICJmY29taSIsCVNULCBTVGkgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogZGMgKi8KLSAgewotICAgIHsgImZhZGQiLAlTVGksIFNUIH0sCi0gICAgeyAiZm11bCIsCVNUaSwgU1QgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLSAgICB7ICJmc3ViIiwJU1RpLCBTVCB9LAotICAgIHsgImZzdWJyIiwJU1RpLCBTVCB9LAotICAgIHsgImZkaXYiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdnIiLAlTVGksIFNUIH0sCi0jZWxzZQotICAgIHsgImZzdWJyIiwJU1RpLCBTVCB9LAotICAgIHsgImZzdWIiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdnIiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdiIsCVNUaSwgU1QgfSwKLSNlbmRpZgotICB9LAotICAvKiBkZCAqLwotICB7Ci0gICAgeyAiZmZyZWUiLAlTVGkgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICJmc3QiLAlTVGkgfSwKLSAgICB7ICJmc3RwIiwJU1RpIH0sCi0gICAgeyAiZnVjb20iLAlTVGkgfSwKLSAgICB7ICJmdWNvbXAiLAlTVGkgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLSAgLyogZGUgKi8KLSAgewotICAgIHsgImZhZGRwIiwJU1RpLCBTVCB9LAotICAgIHsgImZtdWxwIiwJU1RpLCBTVCB9LAotICAgIHsgIihiYWQpIiB9LAotICAgIHsgRkdSUGRlXzMgfSwKLSNpZiBVTklYV0FSRV9DT01QQVQKLSAgICB7ICJmc3VicCIsCVNUaSwgU1QgfSwKLSAgICB7ICJmc3VicnAiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdnAiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdnJwIiwJU1RpLCBTVCB9LAotI2Vsc2UKLSAgICB7ICJmc3VicnAiLAlTVGksIFNUIH0sCi0gICAgeyAiZnN1YnAiLAlTVGksIFNUIH0sCi0gICAgeyAiZmRpdnJwIiwJU1RpLCBTVCB9LAotICAgIHsgImZkaXZwIiwJU1RpLCBTVCB9LAotI2VuZGlmCi0gIH0sCi0gIC8qIGRmICovCi0gIHsKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgICB7IEZHUlBkZl80IH0sCi0gICAgeyAiZnVjb21pcCIsU1QsIFNUaSB9LAotICAgIHsgImZjb21pcCIsIFNULCBTVGkgfSwKLSAgICB7ICIoYmFkKSIgfSwKLSAgfSwKLX07Ci0KLQotc3RhdGljIGNoYXIgKmZncnBzW11bOF0gPSB7Ci0gIC8qIGQ5XzIgIDAgKi8KLSAgewotICAgICJmbm9wIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGQ5XzQgIDEgKi8KLSAgewotICAgICJmY2hzIiwiZmFicyIsIihiYWQpIiwiKGJhZCkiLCJmdHN0IiwiZnhhbSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGQ5XzUgIDIgKi8KLSAgewotICAgICJmbGQxIiwiZmxkbDJ0IiwiZmxkbDJlIiwiZmxkcGkiLCJmbGRsZzIiLCJmbGRsbjIiLCJmbGR6IiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGQ5XzYgIDMgKi8KLSAgewotICAgICJmMnhtMSIsImZ5bDJ4IiwiZnB0YW4iLCJmcGF0YW4iLCJmeHRyYWN0IiwiZnByZW0xIiwiZmRlY3N0cCIsImZpbmNzdHAiLAotICB9LAotCi0gIC8qIGQ5XzcgIDQgKi8KLSAgewotICAgICJmcHJlbSIsImZ5bDJ4cDEiLCJmc3FydCIsImZzaW5jb3MiLCJmcm5kaW50IiwiZnNjYWxlIiwiZnNpbiIsImZjb3MiLAotICB9LAotCi0gIC8qIGRhXzUgIDUgKi8KLSAgewotICAgICIoYmFkKSIsImZ1Y29tcHAiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGRiXzQgIDYgKi8KLSAgewotICAgICJmZW5pKDI4NyBvbmx5KSIsImZkaXNpKDI4NyBvbmx5KSIsImZOY2xleCIsImZOaW5pdCIsCi0gICAgImZOc2V0cG0oMjg3IG9ubHkpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwKLSAgfSwKLQotICAvKiBkZV8zICA3ICovCi0gIHsKLSAgICAiKGJhZCkiLCJmY29tcHAiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLAotICB9LAotCi0gIC8qIGRmXzQgIDggKi8KLSAgewotICAgICJmTnN0c3ciLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsIihiYWQpIiwiKGJhZCkiLCIoYmFkKSIsCi0gIH0sCi19OwotCi1zdGF0aWMgdm9pZAotZG9mbG9hdCAoc2l6ZWZsYWcpCi0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgY29uc3Qgc3RydWN0IGRpczM4NiAqZHA7Ci0gIHVuc2lnbmVkIGNoYXIgZmxvYXRvcDsKLQotICBmbG9hdG9wID0gY29kZXBbLTFdOwotCi0gIGlmIChtb2QgIT0gMykKLSAgICB7Ci0gICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICBwdXRvcCAoZmxvYXRfbWVtX2ludGVsWyhmbG9hdG9wIC0gMHhkOCApICogOCArIHJlZ10sIHNpemVmbGFnKTsKLSAgICAgIGVsc2UKLSAgICAgICAgcHV0b3AgKGZsb2F0X21lbV9hdHRbKGZsb2F0b3AgLSAweGQ4ICkgKiA4ICsgcmVnXSwgc2l6ZWZsYWcpOwotICAgICAgb2J1ZnAgPSBvcDFvdXQ7Ci0gICAgICBpZiAoZmxvYXRvcCA9PSAweGRiKQotICAgICAgICBPUF9FICh4X21vZGUsIHNpemVmbGFnKTsKLSAgICAgIGVsc2UgaWYgKGZsb2F0b3AgPT0gMHhkZCkKLSAgICAgICAgT1BfRSAoZF9tb2RlLCBzaXplZmxhZyk7Ci0gICAgICBlbHNlCi0gICAgICAgIE9QX0UgKHZfbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgY29kZXArKzsKLQotICBkcCA9ICZmbG9hdF9yZWdbZmxvYXRvcCAtIDB4ZDhdW3JlZ107Ci0gIGlmIChkcC0+bmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAgIHB1dG9wIChmZ3Jwc1tkcC0+Ynl0ZW1vZGUxXVtybV0sIHNpemVmbGFnKTsKLQotICAgICAgLyogaW5zdHJ1Y3Rpb24gZm5zdHN3IGlzIG9ubHkgb25lIHdpdGggc3RyYW5nZSBhcmcgKi8KLSAgICAgIGlmIChmbG9hdG9wID09IDB4ZGYgJiYgY29kZXBbLTFdID09IDB4ZTApCi0Jc3RyY3B5IChvcDFvdXQsIG5hbWVzMTZbMF0pOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHB1dG9wIChkcC0+bmFtZSwgc2l6ZWZsYWcpOwotCi0gICAgICBvYnVmcCA9IG9wMW91dDsKLSAgICAgIGlmIChkcC0+b3AxKQotCSgqZHAtPm9wMSkoZHAtPmJ5dGVtb2RlMSwgc2l6ZWZsYWcpOwotICAgICAgb2J1ZnAgPSBvcDJvdXQ7Ci0gICAgICBpZiAoZHAtPm9wMikKLQkoKmRwLT5vcDIpKGRwLT5ieXRlbW9kZTIsIHNpemVmbGFnKTsKLSAgICB9Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU1QgKGlnbm9yZSwgc2l6ZWZsYWcpCi0gICAgIGludCBpZ25vcmU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgb2FwcGVuZCAoIiVzdCIpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX1NUaSAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVzdCglZCkiLCBybSk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0KLS8qIGNhcGl0YWwgbGV0dGVycyBpbiB0ZW1wbGF0ZSBhcmUgbWFjcm9zICovCi1zdGF0aWMgdm9pZAotcHV0b3AgKHRlbXBsYXRlLCBzaXplZmxhZykKLSAgICAgY29uc3QgY2hhciAqdGVtcGxhdGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgY29uc3QgY2hhciAqcDsKLQotICBmb3IgKHAgPSB0ZW1wbGF0ZTsgKnA7IHArKykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCpwKQotCXsKLQlkZWZhdWx0OgotCSAgKm9idWZwKysgPSAqcDsKLQkgIGJyZWFrOwotCWNhc2UgJ0EnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmIChtb2QgIT0gMwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgICAgICB8fCAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotI2VuZGlmCi0JICAgICAgKQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLQkgIGJyZWFrOwotCWNhc2UgJ0InOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSAnRSc6CQkvKiBGb3IgamN4ei9qZWN4eiAqLwotCSAgaWYgKHNpemVmbGFnICYgQUZMQUcpCi0JICAgICpvYnVmcCsrID0gJ2UnOwotCSAgYnJlYWs7Ci0JY2FzZSAnTCc6Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIFNVRkZJWF9BTFdBWVMKLQkgIGlmIChzaXplZmxhZyAmIFNVRkZJWF9BTFdBWVMpCi0JICAgICpvYnVmcCsrID0gJ2wnOwotI2VuZGlmCi0JICBicmVhazsKLQljYXNlICdOJzoKLQkgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfRldBSVQpID09IDApCi0JICAgICpvYnVmcCsrID0gJ24nOwotCSAgZWxzZQotCSAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GV0FJVDsKLQkgIGJyZWFrOwotCWNhc2UgJ1AnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLQkgIGlmICgocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICAgICAgfHwgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdRJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgYnJlYWs7Ci0JICBpZiAobW9kICE9IDMKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICAgICAgfHwgKHNpemVmbGFnICYgU1VGRklYX0FMV0FZUykKLSNlbmRpZgotCSAgICAgICkKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlICdSJzoKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCXsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJICAqb2J1ZnArKyA9ICdxJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpvYnVmcCsrID0gJ3cnOwotCQkgICpvYnVmcCsrID0gJ2QnOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCQkqb2J1ZnArKyA9ICdsJzsKLQkgICAgICBlbHNlCi0JCSpvYnVmcCsrID0gJ3cnOwotCSAgICB9Ci0JICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLQkgIGJyZWFrOwotCWNhc2UgJ1MnOgotICAgICAgICAgIGlmIChpbnRlbF9zeW50YXgpCi0gICAgICAgICAgICBicmVhazsKLSNpZmRlZiBTVUZGSVhfQUxXQVlTCi0JICBpZiAoc2l6ZWZsYWcgJiBTVUZGSVhfQUxXQVlTKQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCSpvYnVmcCsrID0gJ2wnOwotCSAgICAgIGVsc2UKLQkJKm9idWZwKysgPSAndyc7Ci0JICAgICAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICAgIH0KLSNlbmRpZgotCSAgYnJlYWs7Ci0JY2FzZSAnVyc6Ci0JICAvKiBvcGVyYW5kIHNpemUgZmxhZyBmb3IgY3d0bCwgY2J0dyAqLwotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgICpvYnVmcCsrID0gJ3cnOwotCSAgZWxzZQotCSAgICAqb2J1ZnArKyA9ICdiJzsKLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotCSAgICB7Ci0JICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JCXsKLQkJICAqb2J1ZnArKyA9ICdkJzsKLQkJICAqb2J1ZnArKyA9ICdlJzsKLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkgICpvYnVmcCsrID0gJ3cnOwotCQl9Ci0JICAgIH0KLQkgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgKm9idWZwID0gMDsKLX0KLQotc3RhdGljIHZvaWQKLW9hcHBlbmQgKHMpCi0gICAgIGNvbnN0IGNoYXIgKnM7Ci17Ci0gIHN0cmNweSAob2J1ZnAsIHMpOwotICBvYnVmcCArPSBzdHJsZW4gKHMpOwotfQotCi1zdGF0aWMgdm9pZAotYXBwZW5kX3NlZyAoKQotewotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfQ1MpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVjczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0NTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0RTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZHM6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9EUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9TUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJXNzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfU1M7Ci0gICAgfQotICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfRVMpCi0gICAgewotICAgICAgb2FwcGVuZCAoIiVlczoiKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gUFJFRklYX0VTOwotICAgIH0KLSAgaWYgKHByZWZpeGVzICYgUFJFRklYX0ZTKQotICAgIHsKLSAgICAgIG9hcHBlbmQgKCIlZnM6Iik7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IFBSRUZJWF9GUzsKLSAgICB9Ci0gIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9HUykKLSAgICB7Ci0gICAgICBvYXBwZW5kICgiJWdzOiIpOwotICAgICAgdXNlZF9wcmVmaXhlcyB8PSBQUkVGSVhfR1M7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZAotT1BfaW5kaXJFIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAoIWludGVsX3N5bnRheCkKLSAgICBvYXBwZW5kICgiKiIpOwotICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKQotICAgICBpbnQgYnl0ZW1vZGU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IGRpc3A7Ci0KLSAgLyogc2tpcCBtb2Qvcm0gYnl0ZSAqLwotICBjb2RlcCsrOwotCi0gIGlmIChtb2QgPT0gMykKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGJ5dGVtb2RlKQotCXsKLQljYXNlIGJfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzOFtybV0pOwotCSAgYnJlYWs7Ci0JY2FzZSB3X21vZGU6Ci0JICBvYXBwZW5kIChuYW1lczE2W3JtXSk7Ci0JICBicmVhazsKLQljYXNlIGRfbW9kZToKLQkgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGJyZWFrOwotCWNhc2Ugdl9tb2RlOgotCSAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbcm1dKTsKLQkgIGVsc2UKLQkgICAgb2FwcGVuZCAobmFtZXMxNltybV0pOwotCSAgdXNlZF9wcmVmaXhlcyB8PSAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSk7Ci0JICBicmVhazsKLQljYXNlIDA6Ci0JICBpZiAoICEoY29kZXBbLTJdID09IDB4QUUgJiYgY29kZXBbLTFdID09IDB4RjggLyogc2ZlbmNlICovKSkKLQkgICAgQmFkT3AoKTsJLyogYmFkIHNmZW5jZSxsZWEsbGRzLGxlcyxsZnMsbGdzLGxzcyBtb2RybSAqLwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0JICBicmVhazsKLQl9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGRpc3AgPSAwOwotICBhcHBlbmRfc2VnICgpOwotCi0gIGlmIChzaXplZmxhZyAmIEFGTEFHKSAvKiAzMiBiaXQgYWRkcmVzcyBtb2RlICovCi0gICAgewotICAgICAgaW50IGhhdmVzaWI7Ci0gICAgICBpbnQgaGF2ZWJhc2U7Ci0gICAgICBpbnQgYmFzZTsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICBpbnQgc2NhbGUgPSAwOwotCi0gICAgICBoYXZlc2liID0gMDsKLSAgICAgIGhhdmViYXNlID0gMTsKLSAgICAgIGJhc2UgPSBybTsKLQotICAgICAgaWYgKGJhc2UgPT0gNCkKLQl7Ci0JICBoYXZlc2liID0gMTsKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgc2NhbGUgPSAoKmNvZGVwID4+IDYpICYgMzsKLQkgIGluZGV4ID0gKCpjb2RlcCA+PiAzKSAmIDc7Ci0JICBiYXNlID0gKmNvZGVwICYgNzsKLQkgIGNvZGVwKys7Ci0JfQotCi0gICAgICBzd2l0Y2ggKG1vZCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKGJhc2UgPT0gNSkKLQkgICAgewotCSAgICAgIGhhdmViYXNlID0gMDsKLQkgICAgICBkaXNwID0gZ2V0MzIgKCk7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgZGlzcCA9ICpjb2RlcCsrOwotCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGRpc3AgPSBnZXQzMiAoKTsKLQkgIGJyZWFrOwotCX0KLQotICAgICAgaWYgKCFpbnRlbF9zeW50YXgpCi0gICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgIH0KLQotICAgICAgaWYgKGhhdmViYXNlIHx8IChoYXZlc2liICYmIChpbmRleCAhPSA0IHx8IHNjYWxlICE9IDApKSkKLQl7Ci0gICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3dpdGNoIChieXRlbW9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBiX21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJCWVRFIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Ugd19tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIHZfbW9kZToKLSAgICAgICAgICAgICAgICAgIG9hcHBlbmQoIkRXT1JEIFBUUiAiKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZF9tb2RlOgotICAgICAgICAgICAgICAgICAgb2FwcGVuZCgiUVdPUkQgUFRSICIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSB4X21vZGU6Ci0gICAgICAgICAgICAgICAgICBvYXBwZW5kKCJYV09SRCBQVFIgIik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgIH0KLQkgICpvYnVmcCsrID0gb3Blbl9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICBpZiAoaGF2ZWJhc2UpCi0JICAgIG9hcHBlbmQgKG5hbWVzMzJbYmFzZV0pOwotCSAgaWYgKGhhdmVzaWIpCi0JICAgIHsKLQkgICAgICBpZiAoaW5kZXggIT0gNCkKLQkJewotICAgICAgICAgICAgICAgICAgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlYmFzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKm9idWZwKysgPSBzZXBhcmF0b3JfY2hhcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKm9idWZwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJXMiLCBuYW1lczMyW2luZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLQkJICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIsJXMiLCBuYW1lczMyW2luZGV4XSk7Ci0JCSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0JCX0KLSAgICAgICAgICAgICAgaWYgKCFpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgIHx8IChpbnRlbF9zeW50YXgKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSBiX21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB3X21vZGUKLSAgICAgICAgICAgICAgICAgICAgICAmJiBieXRlbW9kZSAhPSB2X21vZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICpvYnVmcCsrID0gc2NhbGVfY2hhcjsKLSAgICAgICAgICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIDEgPDwgc2NhbGUpOwotCSAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0JICAgIH0KLSAgICAgICAgICBpZiAoaW50ZWxfc3ludGF4KQotICAgICAgICAgICAgaWYgKG1vZCAhPSAwIHx8IGJhc2UgPT0gNSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIERvbid0IHByaW50IHplcm8gZGlzcGxhY2VtZW50cyAqLwotICAgICAgICAgICAgICAgIGlmIChkaXNwID4gMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIislZCIsIGRpc3ApOwotICAgICAgICAgICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChkaXNwIDwgMCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7Ci0gICAgICAgICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLQkgICpvYnVmcCsrID0gY2xvc2VfY2hhcjsKLSAgICAgICAgICAqb2J1ZnAgPSAnXDAnOwotCX0KLSAgICAgIGVsc2UgaWYgKGludGVsX3N5bnRheCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChtb2QgIT0gMCB8fCBiYXNlID09IDUpCi0gICAgICAgICAgICB7Ci0JICAgICAgaWYgKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9TUyB8IFBSRUZJWF9EUwotCQkJICAgICAgfCBQUkVGSVhfRVMgfCBQUkVGSVhfRlMgfCBQUkVGSVhfR1MpKQotCQk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgb2FwcGVuZCAobmFtZXNfc2VnWzNdKTsKLQkJICBvYXBwZW5kICgiOiIpOwotCQl9Ci0gICAgICAgICAgICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIweCV4IiwgZGlzcCk7Ci0gICAgICAgICAgICAgIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICBlbHNlCi0gICAgeyAvKiAxNiBiaXQgYWRkcmVzcyBtb2RlICovCi0gICAgICBzd2l0Y2ggKG1vZCkKLQl7Ci0JY2FzZSAwOgotCSAgaWYgKHJtID09IDYpCi0JICAgIHsKLQkgICAgICBkaXNwID0gZ2V0MTYgKCk7Ci0JICAgICAgaWYgKChkaXNwICYgMHg4MDAwKSAhPSAwKQotCQlkaXNwIC09IDB4MTAwMDA7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgMToKLQkgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotCSAgZGlzcCA9ICpjb2RlcCsrOwotCSAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDsKLQkgIGJyZWFrOwotCWNhc2UgMjoKLQkgIGRpc3AgPSBnZXQxNiAoKTsKLQkgIGlmICgoZGlzcCAmIDB4ODAwMCkgIT0gMCkKLQkgICAgZGlzcCAtPSAweDEwMDAwOwotCSAgYnJlYWs7Ci0JfQotCi0gICAgICBpZiAoIWludGVsX3N5bnRheCkKLSAgICAgICAgaWYgKG1vZCAhPSAwIHx8IHJtID09IDYpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiVkIiwgZGlzcCk7Ci0gICAgICAgICAgICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLSAgICAgICAgICB9Ci0KLSAgICAgIGlmIChtb2QgIT0gMCB8fCBybSAhPSA2KQotCXsKLQkgICpvYnVmcCsrID0gb3Blbl9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JICBvYXBwZW5kIChpbmRleDE2W3JtXSk7Ci0gICAgICAgICAgKm9idWZwKysgPSBjbG9zZV9jaGFyOwotICAgICAgICAgICpvYnVmcCA9ICdcMCc7Ci0JfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQKLU9QX0cgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHN3aXRjaCAoYnl0ZW1vZGUpCi0gICAgewotICAgIGNhc2UgYl9tb2RlOgotICAgICAgb2FwcGVuZCAobmFtZXM4W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczE2W3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBkX21vZGU6Ci0gICAgICBvYXBwZW5kIChuYW1lczMyW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlvYXBwZW5kIChuYW1lczMyW3JlZ10pOwotICAgICAgZWxzZQotCW9hcHBlbmQgKG5hbWVzMTZbcmVnXSk7Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBvYXBwZW5kIChJTlRFUk5BTF9ESVNBU1NFTUJMRVJfRVJST1IpOwotICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50Ci1nZXQzMiAoKQotewotICBpbnQgeCA9IDA7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgNCk7Ci0gIHggPSAqY29kZXArKyAmIDB4ZmY7Ci0gIHggfD0gKCpjb2RlcCsrICYgMHhmZikgPDwgODsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAxNjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCAyNDsKLSAgcmV0dXJuIHg7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldDE2ICgpCi17Ci0gIGludCB4ID0gMDsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAyKTsKLSAgeCA9ICpjb2RlcCsrICYgMHhmZjsKLSAgeCB8PSAoKmNvZGVwKysgJiAweGZmKSA8PCA4OwotICByZXR1cm4geDsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9vcCAob3ApCi0gICAgIHVuc2lnbmVkIGludCBvcDsKLXsKLSAgb3BfaW5kZXhbb3BfYWRdID0gb3BfYWQ7Ci0gIG9wX2FkZHJlc3Nbb3BfYWRdID0gb3A7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9SRUcgKGNvZGUsIHNpemVmbGFnKQotICAgICBpbnQgY29kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICpzOwotCi0gIHN3aXRjaCAoY29kZSkKLSAgICB7Ci0gICAgY2FzZSBpbmRpcl9keF9yZWc6Ci0gICAgICBzID0gIiglZHgpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYXhfcmVnOiBjYXNlIGN4X3JlZzogY2FzZSBkeF9yZWc6IGNhc2UgYnhfcmVnOgotICAgIGNhc2Ugc3BfcmVnOiBjYXNlIGJwX3JlZzogY2FzZSBzaV9yZWc6IGNhc2UgZGlfcmVnOgotICAgICAgcyA9IG5hbWVzMTZbY29kZSAtIGF4X3JlZ107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGVzX3JlZzogY2FzZSBzc19yZWc6IGNhc2UgY3NfcmVnOgotICAgIGNhc2UgZHNfcmVnOiBjYXNlIGZzX3JlZzogY2FzZSBnc19yZWc6Ci0gICAgICBzID0gbmFtZXNfc2VnW2NvZGUgLSBlc19yZWddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBhbF9yZWc6IGNhc2UgYWhfcmVnOiBjYXNlIGNsX3JlZzogY2FzZSBjaF9yZWc6Ci0gICAgY2FzZSBkbF9yZWc6IGNhc2UgZGhfcmVnOiBjYXNlIGJsX3JlZzogY2FzZSBiaF9yZWc6Ci0gICAgICBzID0gbmFtZXM4W2NvZGUgLSBhbF9yZWddOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBlQVhfcmVnOiBjYXNlIGVDWF9yZWc6IGNhc2UgZURYX3JlZzogY2FzZSBlQlhfcmVnOgotICAgIGNhc2UgZVNQX3JlZzogY2FzZSBlQlBfcmVnOiBjYXNlIGVTSV9yZWc6IGNhc2UgZURJX3JlZzoKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCXMgPSBuYW1lczMyW2NvZGUgLSBlQVhfcmVnXTsKLSAgICAgIGVsc2UKLQlzID0gbmFtZXMxNltjb2RlIC0gZUFYX3JlZ107Ci0gICAgICB1c2VkX3ByZWZpeGVzIHw9IChwcmVmaXhlcyAmIFBSRUZJWF9EQVRBKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzID0gSU5URVJOQUxfRElTQVNTRU1CTEVSX0VSUk9SOwotICAgICAgYnJlYWs7Ci0gICAgfQotICBvYXBwZW5kIChzKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0kgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGludCBvcDsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgb3AgPSAqY29kZXArKyAmIDB4ZmY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHZfbW9kZToKLSAgICAgIGlmIChzaXplZmxhZyAmIERGTEFHKQotCW9wID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0Jb3AgPSBnZXQxNiAoKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvcCA9IGdldDE2ICgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIGlmIChpbnRlbF9zeW50YXgpCi0gICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBvcCk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgiLCBvcCk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotICBzY3JhdGNoYnVmWzBdID0gJ1wwJzsKLX0KLQotc3RhdGljIHZvaWQKLU9QX3NJIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgb3A7Ci0KLSAgc3dpdGNoIChieXRlbW9kZSkKLSAgICB7Ci0gICAgY2FzZSBiX21vZGU6Ci0gICAgICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgICAgIG9wID0gKmNvZGVwKys7Ci0gICAgICBpZiAoKG9wICYgMHg4MCkgIT0gMCkKLQlvcCAtPSAweDEwMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2Ugdl9tb2RlOgotICAgICAgaWYgKHNpemVmbGFnICYgREZMQUcpCi0Jb3AgPSBnZXQzMiAoKTsKLSAgICAgIGVsc2UKLQl7Ci0JICBvcCA9IGdldDE2KCk7Ci0JICBpZiAoKG9wICYgMHg4MDAwKSAhPSAwKQotCSAgICBvcCAtPSAweDEwMDAwOwotCX0KLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB3X21vZGU6Ci0gICAgICBvcCA9IGdldDE2ICgpOwotICAgICAgaWYgKChvcCAmIDB4ODAwMCkgIT0gMCkKLQlvcCAtPSAweDEwMDAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBpZiAoaW50ZWxfc3ludGF4KQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIlZCIsIG9wKTsKLSAgZWxzZQotICAgIHNwcmludGYgKHNjcmF0Y2hidWYsICIkMHgleCIsIG9wKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9KIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgZGlzcDsKLSAgaW50IG1hc2sgPSAtMTsKLQotICBzd2l0Y2ggKGJ5dGVtb2RlKQotICAgIHsKLSAgICBjYXNlIGJfbW9kZToKLSAgICAgIEZFVENIX0RBVEEgKHRoZV9pbmZvLCBjb2RlcCArIDEpOwotICAgICAgZGlzcCA9ICpjb2RlcCsrOwotICAgICAgaWYgKChkaXNwICYgMHg4MCkgIT0gMCkKLQlkaXNwIC09IDB4MTAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB2X21vZGU6Ci0gICAgICBpZiAoc2l6ZWZsYWcgJiBERkxBRykKLQlkaXNwID0gZ2V0MzIgKCk7Ci0gICAgICBlbHNlCi0JewotCSAgZGlzcCA9IGdldDE2ICgpOwotCSAgLyogZm9yIHNvbWUgcmVhc29uLCBhIGRhdGExNiBwcmVmaXggb24gYSBqdW1wIGluc3RydWN0aW9uCi0JICAgICBtZWFucyB0aGF0IHRoZSBwYyBpcyBtYXNrZWQgdG8gMTYgYml0cyBhZnRlciB0aGUKLQkgICAgIGRpc3BsYWNlbWVudCBpcyBhZGRlZCEgICovCi0JICBtYXNrID0gMHhmZmZmOwotCX0KLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIG9hcHBlbmQgKElOVEVSTkFMX0RJU0FTU0VNQkxFUl9FUlJPUik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICBkaXNwID0gKHN0YXJ0X3BjICsgY29kZXAgLSBzdGFydF9jb2RlcCArIGRpc3ApICYgbWFzazsKLSAgc2V0X29wIChkaXNwKTsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBkaXNwKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfU0VHIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzdGF0aWMgY2hhciAqc3JlZ1tdID0gewotICAgICIlZXMiLCIlY3MiLCIlc3MiLCIlZHMiLCIlZnMiLCIlZ3MiLCIlPyIsIiU/IiwKLSAgfTsKLQotICBvYXBwZW5kIChzcmVnW3JlZ10pOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX0RJUiAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXk7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgaW50IHNlZywgb2Zmc2V0OwotCi0gIGlmIChzaXplZmxhZyAmIERGTEFHKQotICAgIHsKLSAgICAgIG9mZnNldCA9IGdldDMyICgpOwotICAgICAgc2VnID0gZ2V0MTYgKCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgb2Zmc2V0ID0gZ2V0MTYgKCk7Ci0gICAgICBzZWcgPSBnZXQxNiAoKTsKLSAgICB9Ci0gIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX0RBVEEpOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJDB4JXgsJDB4JXgiLCBzZWcsIG9mZnNldCk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX09GRiAoaWdub3JlLCBzaXplZmxhZykKLSAgICAgaW50IGlnbm9yZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpbnQgb2ZmOwotCi0gIGFwcGVuZF9zZWcgKCk7Ci0KLSAgaWYgKHNpemVmbGFnICYgQUZMQUcpCi0gICAgb2ZmID0gZ2V0MzIgKCk7Ci0gIGVsc2UKLSAgICBvZmYgPSBnZXQxNiAoKTsKLQotICBpZiAoaW50ZWxfc3ludGF4KQotICAgIHsKLSAgICAgIGlmICghKHByZWZpeGVzICYgKFBSRUZJWF9DUyB8IFBSRUZJWF9TUyB8IFBSRUZJWF9EUwotCQkgICAgICAgIHwgUFJFRklYX0VTIHwgUFJFRklYX0ZTIHwgUFJFRklYX0dTKSkpCi0JewotCSAgb2FwcGVuZCAobmFtZXNfc2VnWzNdKTsKLQkgIG9hcHBlbmQgKCI6Iik7Ci0JfQotICAgIH0KLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIjB4JXgiLCBvZmYpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLXB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKQotICAgICBpbnQgY29kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICpzOwotICBvYXBwZW5kICgiKCIpOwotICBpZiAoc2l6ZWZsYWcgJiBBRkxBRykKLSAgICBzID0gbmFtZXMzMltjb2RlIC0gZUFYX3JlZ107Ci0gIGVsc2UKLSAgICBzID0gbmFtZXMxNltjb2RlIC0gZUFYX3JlZ107Ci0gIG9hcHBlbmQgKHMpOwotICBvYXBwZW5kICgiKSIpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRVNyZWcgKGNvZGUsIHNpemVmbGFnKQotICAgICBpbnQgY29kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBvYXBwZW5kICgiJWVzOiIpOwotICBwdHJfcmVnIChjb2RlLCBzaXplZmxhZyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9EU3JlZyAoY29kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBjb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmICgocHJlZml4ZXMKLSAgICAgICAmIChQUkVGSVhfQ1MKLQkgIHwgUFJFRklYX0RTCi0JICB8IFBSRUZJWF9TUwotCSAgfCBQUkVGSVhfRVMKLQkgIHwgUFJFRklYX0ZTCi0JICB8IFBSRUZJWF9HUykpID09IDApCi0gICAgcHJlZml4ZXMgfD0gUFJFRklYX0RTOwotICBhcHBlbmRfc2VnKCk7Ci0gIHB0cl9yZWcgKGNvZGUsIHNpemVmbGFnKTsKLX0KLQotLyogQVJHU1VTRUQgKi8KLXN0YXRpYyB2b2lkCi1PUF9DIChkdW1teSwgc2l6ZWZsYWcpCi0gICAgIGludCBkdW1teTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVjciVkIiwgcmVnKTsKLSAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci19Ci0KLS8qIEFSR1NVU0VEICovCi1zdGF0aWMgdm9pZAotT1BfRCAoZHVtbXksIHNpemVmbGFnKQotICAgICBpbnQgZHVtbXk7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlZGIlZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi0vKiBBUkdTVVNFRCAqLwotc3RhdGljIHZvaWQKLU9QX1QgKGR1bW15LCBzaXplZmxhZykKLSAgICAgaW50IGR1bW15OwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIHNwcmludGYgKHNjcmF0Y2hidWYsICIlJXRyJWQiLCByZWcpOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX1JkIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kID09IDMpCi0gICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKLSAgZWxzZQotICAgIEJhZE9wKCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1PUF9NTVggKGlnbm9yZSwgc2l6ZWZsYWcpCi0gICAgIGludCBpZ25vcmU7Ci0gICAgIGludCBzaXplZmxhZzsKLXsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUlbW0lZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfWE1NIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSV4bW0lZCIsIHJlZyk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfRU0gKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgIT0gMykKLSAgICB7Ci0gICAgICBPUF9FIChieXRlbW9kZSwgc2l6ZWZsYWcpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICBjb2RlcCsrOwotICBzcHJpbnRmIChzY3JhdGNoYnVmLCAiJSVtbSVkIiwgcm0pOwotICBvYXBwZW5kIChzY3JhdGNoYnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLU9QX0VYIChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBpZiAobW9kICE9IDMpCi0gICAgewotICAgICAgT1BfRSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgY29kZXArKzsKLSAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgIiUleG1tJWQiLCBybSk7Ci0gIG9hcHBlbmQgKHNjcmF0Y2hidWYpOwotfQotCi1zdGF0aWMgdm9pZAotT1BfTVMgKGJ5dGVtb2RlLCBzaXplZmxhZykKLSAgICAgaW50IGJ5dGVtb2RlOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIGlmIChtb2QgPT0gMykKLSAgICBPUF9FTSAoYnl0ZW1vZGUsIHNpemVmbGFnKTsKLSAgZWxzZQotICAgIEJhZE9wKCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpTdWZmaXgzRE5vd1tdID0gewotLyogMDAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDA0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAwOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMEMgKi8JTlVMTCwJCSJwaTJmZCIsCU5VTEwsCQlOVUxMLAotLyogMTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDE0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAxOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMUMgKi8JTlVMTCwJCSJwZjJpZCIsCU5VTEwsCQlOVUxMLAotLyogMjAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDI0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAyOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMkMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDMwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiAzNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogMzggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDNDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA0MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNDQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDQ4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA0QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNTAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDU0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA1OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNUMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDYwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA2NCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNjggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDZDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA3MCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogNzQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDc4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA3QyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogODAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDg0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiA4OCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogOEMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIDkwICovCSJwZmNtcGdlIiwJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogOTQgKi8JInBmbWluIiwJTlVMTCwJCSJwZnJjcCIsCSJwZnJzcXJ0IiwKLS8qIDk4ICovCU5VTEwsCQlOVUxMLAkJInBmc3ViIiwJTlVMTCwKLS8qIDlDICovCU5VTEwsCQlOVUxMLAkJInBmYWRkIiwJTlVMTCwKLS8qIEEwICovCSJwZmNtcGd0IiwJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQTQgKi8JInBmbWF4IiwJTlVMTCwJCSJwZnJjcGl0MSIsCSJwZnJzcWl0MSIsCi0vKiBBOCAqLwlOVUxMLAkJTlVMTCwJCSJwZnN1YnIiLAlOVUxMLAotLyogQUMgKi8JTlVMTCwJCU5VTEwsCQkicGZhY2MiLAlOVUxMLAotLyogQjAgKi8JInBmY21wZXEiLAlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBCNCAqLwkicGZtdWwiLAlOVUxMLAkJInBmcmNwaXQyIiwJInBmbXVsaHJ3IiwKLS8qIEI4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBCQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQkicGF2Z3VzYiIsCi0vKiBDMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogQzQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEM4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBDQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRDAgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEQ0ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBEOCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogREMgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEUwICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBFNCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRTggKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEVDICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGMCAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotLyogRjQgKi8JTlVMTCwJCU5VTEwsCQlOVUxMLAkJTlVMTCwKLS8qIEY4ICovCU5VTEwsCQlOVUxMLAkJTlVMTCwJCU5VTEwsCi0vKiBGQyAqLwlOVUxMLAkJTlVMTCwJCU5VTEwsCQlOVUxMLAotfTsKLQotc3RhdGljIHZvaWQKLU9QXzNETm93U3VmZml4IChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICBjb25zdCBjaGFyICptbmVtb25pYzsKLQotICBGRVRDSF9EQVRBICh0aGVfaW5mbywgY29kZXAgKyAxKTsKLSAgLyogQU1EIDNETm93ISBpbnN0cnVjdGlvbnMgYXJlIHNwZWNpZmllZCBieSBhbiBvcGNvZGUgc3VmZml4IGluIHRoZQotICAgICBwbGFjZSB3aGVyZSBhbiA4LWJpdCBpbW1lZGlhdGUgd291bGQgbm9ybWFsbHkgZ28uICBpZS4gdGhlIGxhc3QKLSAgICAgYnl0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotICBvYnVmcCA9IG9idWYgKyBzdHJsZW4ob2J1Zik7Ci0gIG1uZW1vbmljID0gU3VmZml4M0ROb3dbKmNvZGVwKysgJiAweGZmXTsKLSAgaWYgKG1uZW1vbmljKQotICAgIG9hcHBlbmQgKG1uZW1vbmljKTsKLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIFNpbmNlIGEgdmFyaWFibGUgc2l6ZWQgbW9kcm0vc2liIGNodW5rIGlzIGJldHdlZW4gdGhlIHN0YXJ0Ci0JIG9mIHRoZSBvcGNvZGUgKDB4MGYwZikgYW5kIHRoZSBvcGNvZGUgc3VmZml4LCB3ZSBuZWVkIHRvIGRvCi0JIGFsbCB0aGUgbW9kcm0gcHJvY2Vzc2luZyBmaXJzdCwgYW5kIGRvbid0IGtub3cgdW50aWwgbm93IHRoYXQKLQkgd2UgaGF2ZSBhIGJhZCBvcGNvZGUuICBUaGlzIG5lY2Vzc2l0YXRlcyBzb21lIGNsZWFuaW5nIHVwLiAgKi8KLSAgICAgIG9wMW91dFswXSA9ICdcMCc7Ci0gICAgICBvcDJvdXRbMF0gPSAnXDAnOwotICAgICAgQmFkT3AoKTsKLSAgICB9Ci19Ci0KLQotc3RhdGljIGNvbnN0IGNoYXIgKnNpbWRfY21wX29wIFtdID0gewotICAiZXEiLAotICAibHQiLAotICAibGUiLAotICAidW5vcmQiLAotICAibmVxIiwKLSAgIm5sdCIsCi0gICJubGUiLAotICAib3JkIgotfTsKLQotc3RhdGljIHZvaWQKLU9QX1NJTURfU3VmZml4IChieXRlbW9kZSwgc2l6ZWZsYWcpCi0gICAgIGludCBieXRlbW9kZTsKLSAgICAgaW50IHNpemVmbGFnOwotewotICB1bnNpZ25lZCBpbnQgY21wX3R5cGU7Ci0KLSAgRkVUQ0hfREFUQSAodGhlX2luZm8sIGNvZGVwICsgMSk7Ci0gIG9idWZwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgY21wX3R5cGUgPSAqY29kZXArKyAmIDB4ZmY7Ci0gIGlmIChjbXBfdHlwZSA8IDgpCi0gICAgewotICAgICAgc3ByaW50ZiAoc2NyYXRjaGJ1ZiwgImNtcCVzJWNzIiwKLQkgICAgICAgc2ltZF9jbXBfb3BbY21wX3R5cGVdLAotCSAgICAgICBwcmVmaXhlcyAmIFBSRUZJWF9SRVBaID8gJ3MnIDogJ3AnKTsKLSAgICAgIHVzZWRfcHJlZml4ZXMgfD0gKHByZWZpeGVzICYgUFJFRklYX1JFUFopOwotICAgICAgb2FwcGVuZCAoc2NyYXRjaGJ1Zik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhIGJhZCBleHRlbnNpb24gYnl0ZS4gIENsZWFuIHVwLiAgKi8KLSAgICAgIG9wMW91dFswXSA9ICdcMCc7Ci0gICAgICBvcDJvdXRbMF0gPSAnXDAnOwotICAgICAgQmFkT3AoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi1TSU1EX0ZpeHVwIChleHRyYWNoYXIsIHNpemVmbGFnKQotICAgICBpbnQgZXh0cmFjaGFyOwotICAgICBpbnQgc2l6ZWZsYWc7Ci17Ci0gIC8qIENoYW5nZSBtb3ZscHMvbW92aHBzIHRvIG1vdmhscHMvbW92bGhwcyBmb3IgMiByZWdpc3RlciBvcGVyYW5kCi0gICAgIGZvcm1zIG9mIHRoZXNlIGluc3RydWN0aW9ucy4gICovCi0gIGlmIChtb2QgPT0gMykKLSAgICB7Ci0gICAgICBjaGFyICpwID0gb2J1ZiArIHN0cmxlbihvYnVmKTsKLSAgICAgICoocCsxKSA9ICdcMCc7Ci0gICAgICAqcCAgICAgPSAqKHAtMSk7Ci0gICAgICAqKHAtMSkgPSAqKHAtMik7Ci0gICAgICAqKHAtMikgPSAqKHAtMyk7Ci0gICAgICAqKHAtMykgPSBleHRyYWNoYXI7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBCYWRPcCAodm9pZCkKLXsKLSAgY29kZXAgPSBpbnNuX2NvZGVwICsgMTsJLyogdGhyb3cgYXdheSBwcmVmaXhlcyBhbmQgMXN0LiBvcGNvZGUgYnl0ZSAqLwotICBvYXBwZW5kICgiKGJhZCkiKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvaTk2MC1kaXMuYyBiL29wY29kZXMvaTk2MC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBiZDg0OC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL2k5NjAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgaTgwOTYwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MCwgOTEsIDkzLCA5NCwgOTUsIDk2LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKLUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmVnX25hbWVzW10gPSB7Ci0vKiAgMCAqLwkicGZwIiwgInNwIiwgICJyaXAiLCAicjMiLCAgInI0IiwgICJyNSIsICAicjYiLCAgInI3IiwgCi0vKiAgOCAqLwkicjgiLCAgInI5IiwgICJyMTAiLCAicjExIiwgInIxMiIsICJyMTMiLCAicjE0IiwgInIxNSIsCi0vKiAxNiAqLwkiZzAiLCAgImcxIiwgICJnMiIsICAiZzMiLCAgImc0IiwgICJnNSIsICAiZzYiLCAgImc3IiwgCi0vKiAyNCAqLwkiZzgiLCAgImc5IiwgICJnMTAiLCAiZzExIiwgImcxMiIsICJnMTMiLCAiZzE0IiwgImZwIiwgCi0vKiAzMiAqLwkicGMiLCAgImFjIiwgICJpcCIsICAidGMiLCAgImZwMCIsICJmcDEiLCAiZnAyIiwgImZwMyIgCi19OwotCi0KLXN0YXRpYyBGSUxFICpzdHJlYW07CQkvKiBPdXRwdXQgZ29lcyBoZXJlICovCi1zdGF0aWMgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci1zdGF0aWMgdm9pZCBwcmludF9hZGRyKCk7Ci1zdGF0aWMgdm9pZCBjdHJsKCk7Ci1zdGF0aWMgdm9pZCBjb2JyKCk7Ci1zdGF0aWMgdm9pZCByZWcoKTsKLXN0YXRpYyBpbnQgbWVtKCk7Ci1zdGF0aWMgdm9pZCBlYSgpOwotc3RhdGljIHZvaWQgZHN0b3AoKTsKLXN0YXRpYyB2b2lkIHJlZ29wKCk7Ci1zdGF0aWMgdm9pZCBpbnZhbGlkKCk7Ci1zdGF0aWMgaW50IHBpbnNuKCk7Ci1zdGF0aWMgdm9pZCBwdXRfYWJzKCk7Ci0KLQotLyogUHJpbnQgdGhlIGk5NjAgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyAnbWVtYWRkcicgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gSU5GTy0+U1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCi0KLWludAotcHJpbnRfaW5zbl9pOTYwIChtZW1hZGRyLCBpbmZvX2FyZykKLSAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm9fYXJnOwotewotICB1bnNpZ25lZCBpbnQgd29yZDEsIHdvcmQyID0gMHhkZWFkYmVlZjsKLSAgYmZkX2J5dGUgYnVmZmVyWzhdOwotICBpbnQgc3RhdHVzOwotCi0gIGluZm8gPSBpbmZvX2FyZzsKLSAgc3RyZWFtID0gaW5mby0+c3RyZWFtOwotCi0gIC8qIFJlYWQgd29yZDEuICBPbmx5IHJlYWQgd29yZDIgaWYgdGhlIGluc3RydWN0aW9uCi0gICAgIG5lZWRzIGl0LCB0byBwcmV2ZW50IHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgc2VjdGlvbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgKGJmZF9ieXRlICopIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgd29yZDEgPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0gIC8qIERpdmlkZSBpbnN0cnVjdGlvbiBzZXQgaW50byBjbGFzc2VzIGJhc2VkIG9uIGhpZ2ggNCBiaXRzIG9mIG9wY29kZS4gICovCi0gIHN3aXRjaCAoICh3b3JkMSA+PiAyOCkgJiAweGYgKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDg6Ci0gICAgY2FzZSAweDk6Ci0gICAgY2FzZSAweGE6Ci0gICAgY2FzZSAweGI6Ci0gICAgY2FzZSAweGM6Ci0gICAgICAvKiBSZWFkIHdvcmQyLiAgKi8KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykKLQkobWVtYWRkciArIDQsIChiZmRfYnl0ZSAqKSAoYnVmZmVyICsgNCksIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIHdvcmQyID0gYmZkX2dldGwzMiAoYnVmZmVyICsgNCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHBpbnNuKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKTsKLX0KLQwKLSNkZWZpbmUgSU5fR0RCCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJQWxsIGNvZGUgYmVsb3cgdGhpcyBwb2ludCBzaG91bGQgYmUgaWRlbnRpY2FsIHdpdGggdGhhdCBvZgotICoJdGhlIGRpc2Fzc2VtYmxlciBpbiBnZG1wOTYwLgotCi0gQSBub2JsZSBzZW50aW1lbnQsIGJ1dCBhdCBsZWFzdCBpbiBjb3NtZXRpYyB3YXlzIChpbmZvLT5mcHJpbnRmX2Z1bmMpLCBpdAotIGp1c3QgYWluJ3Qgc28uIC1raW5nZG9uLCAzMSBNYXIgOTMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHRhYmVudCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHNob3J0IG51bW9wczsKLX07Ci0KLXN0cnVjdCBzcGFyc2VfdGFiZW50IHsKLSAgaW50IG9wY29kZTsKLSAgY2hhciAqbmFtZTsKLSAgc2hvcnQgbnVtb3BzOwotfTsKLQotc3RhdGljIGludAotcGluc24oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotCWludCBpbnN0cl9sZW47Ci0KLQlpbnN0cl9sZW4gPSA0OwotCXB1dF9hYnMoIHdvcmQxLCB3b3JkMiApOwotCi0JLyogRGl2aWRlIGluc3RydWN0aW9uIHNldCBpbnRvIGNsYXNzZXMgYmFzZWQgb24gaGlnaCA0IGJpdHMgb2Ygb3Bjb2RlKi8KLQlzd2l0Y2ggKCAod29yZDEgPj4gMjgpICYgMHhmICl7Ci0JY2FzZSAweDA6Ci0JY2FzZSAweDE6Ci0JCWN0cmwoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApOwotCQlicmVhazsKLQljYXNlIDB4MjoKLQljYXNlIDB4MzoKLQkJY29iciggbWVtYWRkciwgd29yZDEsIHdvcmQyICk7Ci0JCWJyZWFrOwotCWNhc2UgMHg1OgotCWNhc2UgMHg2OgotCWNhc2UgMHg3OgotCQlyZWcoIHdvcmQxICk7Ci0JCWJyZWFrOwotCWNhc2UgMHg4OgotCWNhc2UgMHg5OgotCWNhc2UgMHhhOgotCWNhc2UgMHhiOgotCWNhc2UgMHhjOgotCQlpbnN0cl9sZW4gPSBtZW0oIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiwgMCApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBpbnZhbGlkIGluc3RydWN0aW9uLCBwcmludCBhcyBkYXRhIHdvcmQgKi8gCi0JCWludmFsaWQoIHdvcmQxICk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gaW5zdHJfbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIENUUkwgZm9ybWF0CQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1jdHJsKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIgKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxLCB3b3JkMjsKLXsKLQlpbnQgaTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHRhYmVudCBjdHJsX3RhYltdID0gewotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwMCAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwMSAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwMiAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwMyAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwNCAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwNSAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwNiAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwNyAqLwotCSAgeyAiYiIsCQkxLCB9LAkvKiAweDA4ICovCi0JICB7ICJjYWxsIiwJCTEsIH0sCS8qIDB4MDkgKi8KLQkgIHsgInJldCIsCQkwLCB9LAkvKiAweDBhICovCi0JICB7ICJiYWwiLAkJMSwgfSwJLyogMHgwYiAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwYyAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwZCAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwZSAqLwotCSAgeyBOVUxMLAkJMCwgfSwJLyogMHgwZiAqLwotCSAgeyAiYm5vIiwJCTEsIH0sCS8qIDB4MTAgKi8KLQkgIHsgImJnIiwJCTEsIH0sCS8qIDB4MTEgKi8KLQkgIHsgImJlIiwJCTEsIH0sCS8qIDB4MTIgKi8KLQkgIHsgImJnZSIsCQkxLCB9LAkvKiAweDEzICovCi0JICB7ICJibCIsCQkxLCB9LAkvKiAweDE0ICovCi0JICB7ICJibmUiLAkJMSwgfSwJLyogMHgxNSAqLwotCSAgeyAiYmxlIiwJCTEsIH0sCS8qIDB4MTYgKi8KLQkgIHsgImJvIiwJCTEsIH0sCS8qIDB4MTcgKi8KLQkgIHsgImZhdWx0bm8iLAkJMCwgfSwJLyogMHgxOCAqLwotCSAgeyAiZmF1bHRnIiwJCTAsIH0sCS8qIDB4MTkgKi8KLQkgIHsgImZhdWx0ZSIsCQkwLCB9LAkvKiAweDFhICovCi0JICB7ICJmYXVsdGdlIiwJCTAsIH0sCS8qIDB4MWIgKi8KLQkgIHsgImZhdWx0bCIsCQkwLCB9LAkvKiAweDFjICovCi0JICB7ICJmYXVsdG5lIiwJCTAsIH0sCS8qIDB4MWQgKi8KLQkgIHsgImZhdWx0bGUiLAkJMCwgfSwJLyogMHgxZSAqLwotCSAgeyAiZmF1bHRvIiwJCTAsIH0sCS8qIDB4MWYgKi8KLQl9OwotCi0JaSA9ICh3b3JkMSA+PiAyNCkgJiAweGZmOwotCWlmICggKGN0cmxfdGFiW2ldLm5hbWUgPT0gTlVMTCkgfHwgKCh3b3JkMSAmIDEpICE9IDApICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybjsKLQl9Ci0KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sIGN0cmxfdGFiW2ldLm5hbWUgKTsKLQlpZiAoIHdvcmQxICYgMiApewkJLyogUHJlZGljdHMgYnJhbmNoIG5vdCB0YWtlbiAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKCBzdHJlYW0sICIuZiIgKTsKLQl9Ci0KLQlpZiAoIGN0cmxfdGFiW2ldLm51bW9wcyA9PSAxICl7Ci0JCS8qIEVYVFJBQ1QgRElTUExBQ0VNRU5UIEFORCBDT05WRVJUIFRPIEFERFJFU1MgKi8KLQkJd29yZDEgJj0gMHgwMGZmZmZmZjsKLQkJaWYgKCB3b3JkMSAmIDB4MDA4MDAwMDAgKXsJCS8qIFNpZ24gYml0IGlzIHNldCAqLwotCQkJd29yZDEgfD0gKC0xICYgfjB4ZmZmZmZmKTsJLyogU2lnbiBleHRlbmQgKi8KLQkJfQotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlx0IiApOwotCQlwcmludF9hZGRyKCB3b3JkMSArIG1lbWFkZHIgKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogQ09CUiBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLWNvYnIoIG1lbWFkZHIsIHdvcmQxLCB3b3JkMiApCi0gICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgIHVuc2lnbmVkIGxvbmcgd29yZDEsIHdvcmQyOwotewotCWludCBzcmMxOwotCWludCBzcmMyOwotCWludCBpOwotCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCB0YWJlbnQgY29icl90YWJbXSA9IHsKLQkgIHsgInRlc3RubyIsCTEsIH0sCS8qIDB4MjAgKi8KLQkgIHsgInRlc3RnIiwJMSwgfSwJLyogMHgyMSAqLwotCSAgeyAidGVzdGUiLAkxLCB9LAkvKiAweDIyICovCi0JICB7ICJ0ZXN0Z2UiLAkxLCB9LAkvKiAweDIzICovCi0JICB7ICJ0ZXN0bCIsCTEsIH0sCS8qIDB4MjQgKi8KLQkgIHsgInRlc3RuZSIsCTEsIH0sCS8qIDB4MjUgKi8KLQkgIHsgInRlc3RsZSIsCTEsIH0sCS8qIDB4MjYgKi8KLQkgIHsgInRlc3RvIiwJMSwgfSwJLyogMHgyNyAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDI4ICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MjkgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyYSAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJiICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmMgKi8KLQkgIHsgTlVMTCwJMCwgfSwJLyogMHgyZCAqLwotCSAgeyBOVUxMLAkwLCB9LAkvKiAweDJlICovCi0JICB7IE5VTEwsCTAsIH0sCS8qIDB4MmYgKi8KLQkgIHsgImJiYyIsCTMsIH0sCS8qIDB4MzAgKi8KLQkgIHsgImNtcG9iZyIsCTMsIH0sCS8qIDB4MzEgKi8KLQkgIHsgImNtcG9iZSIsCTMsIH0sCS8qIDB4MzIgKi8KLQkgIHsgImNtcG9iZ2UiLAkzLCB9LAkvKiAweDMzICovCi0JICB7ICJjbXBvYmwiLAkzLCB9LAkvKiAweDM0ICovCi0JICB7ICJjbXBvYm5lIiwJMywgfSwJLyogMHgzNSAqLwotCSAgeyAiY21wb2JsZSIsCTMsIH0sCS8qIDB4MzYgKi8KLQkgIHsgImJicyIsCTMsIH0sCS8qIDB4MzcgKi8KLQkgIHsgImNtcGlibm8iLAkzLCB9LAkvKiAweDM4ICovCi0JICB7ICJjbXBpYmciLAkzLCB9LAkvKiAweDM5ICovCi0JICB7ICJjbXBpYmUiLAkzLCB9LAkvKiAweDNhICovCi0JICB7ICJjbXBpYmdlIiwJMywgfSwJLyogMHgzYiAqLwotCSAgeyAiY21waWJsIiwJMywgfSwJLyogMHgzYyAqLwotCSAgeyAiY21waWJuZSIsCTMsIH0sCS8qIDB4M2QgKi8KLQkgIHsgImNtcGlibGUiLAkzLCB9LAkvKiAweDNlICovCi0JICB7ICJjbXBpYm8iLAkzLCB9LAkvKiAweDNmICovCi0JfTsKLQotCWkgPSAoKHdvcmQxID4+IDI0KSAmIDB4ZmYpIC0gMHgyMDsKLQlpZiAoIGNvYnJfdGFiW2ldLm5hbWUgPT0gTlVMTCApewotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpICggc3RyZWFtLCBjb2JyX3RhYltpXS5uYW1lICk7Ci0JaWYgKCB3b3JkMSAmIDIgKXsJCS8qIFByZWRpY3RzIGJyYW5jaCBub3QgdGFrZW4gKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpICggc3RyZWFtLCAiLmYiICk7Ci0JfQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiXHQiICk7Ci0KLQlzcmMxID0gKHdvcmQxID4+IDE5KSAmIDB4MWY7Ci0Jc3JjMiA9ICh3b3JkMSA+PiAxNCkgJiAweDFmOwotCi0JaWYgKCB3b3JkMSAmIDB4MDIwMDAgKXsJCS8qIE0xIGlzIDEgKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlZCIsIHNyYzEgKTsKLQl9IGVsc2UgewkJCS8qIE0xIGlzIDAgKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tzcmMxXSApOwotCX0KLQotCWlmICggY29icl90YWJbaV0ubnVtb3BzID4gMSApewotCQlpZiAoIHdvcmQxICYgMSApewkJLyogUzIgaXMgMSAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsc2YlZCwiLCBzcmMyICk7Ci0JCX0gZWxzZSB7CQkJLyogUzEgaXMgMCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsJXMsIiwgcmVnX25hbWVzW3NyYzJdICk7Ci0JCX0KLQotCQkvKiBFeHRyYWN0IGRpc3BsYWNlbWVudCBhbmQgY29udmVydCB0byBhZGRyZXNzCi0JCSAqLwotCQl3b3JkMSAmPSAweDAwMDAxZmZjOwotCQlpZiAoIHdvcmQxICYgMHgwMDAwMTAwMCApewkvKiBOZWdhdGl2ZSBkaXNwbGFjZW1lbnQgKi8KLQkJCXdvcmQxIHw9ICgtMSAmIH4weDFmZmYpOwkvKiBTaWduIGV4dGVuZCAqLwotCQl9Ci0JCXByaW50X2FkZHIoIG1lbWFkZHIgKyB3b3JkMSApOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBNRU0gZm9ybWF0CQkJCSovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQJCQkJLyogcmV0dXJucyBpbnN0cnVjdGlvbiBsZW5ndGg6IDQgb3IgOCAqLwotbWVtKCBtZW1hZGRyLCB3b3JkMSwgd29yZDIsIG5vcHJpbnQgKQotICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxLCB3b3JkMjsKLSAgICBpbnQgbm9wcmludDsJCS8qIElmIFRSVUUsIHJldHVybiBpbnN0cnVjdGlvbiBsZW5ndGgsIGJ1dAotCQkJCSAqIGRvbid0IG91dHB1dCBhbnkgdGV4dC4KLQkJCQkgKi8KLXsKLQlpbnQgaSwgajsKLQlpbnQgbGVuOwotCWludCBtb2RlOwotCWludCBvZmZzZXQ7Ci0JY29uc3QgY2hhciAqcmVnMSwgKnJlZzIsICpyZWczOwotCi0JLyogVGhpcyBsb29rdXAgdGFibGUgaXMgdG9vIHNwYXJzZSB0byBtYWtlIGl0IHdvcnRoIHR5cGluZyBpbiwgYnV0IG5vdAotCSAgIHNvIGxhcmdlIGFzIHRvIG1ha2UgYSBzcGFyc2UgYXJyYXkgbmVjZXNzYXJ5LiAgV2UgY3JlYXRlIHRoZSB0YWJsZQotCSAgIGF0IHJ1bnRpbWUuICAqLwotCi0JLyoKLQkgKiBOT1RFOiBJbiB0aGlzIHRhYmxlLCB0aGUgbWVhbmluZyBvZiAnbnVtb3BzJyBpczoKLQkgKgkgMTogc2luZ2xlIG9wZXJhbmQKLQkgKgkgMjogMiBvcGVyYW5kcywgbG9hZCBpbnN0cnVjdGlvbgotCSAqCS0yOiAyIG9wZXJhbmRzLCBzdG9yZSBpbnN0cnVjdGlvbgotCSAqLwotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50ICptZW1fdGFiOwotLyogT3Bjb2RlcyBvZiAweDhYLCA5WCwgYVgsIGJYLCBhbmQgY1ggbXVzdCBiZSBpbiB0aGUgdGFibGUuICAqLwotI2RlZmluZSBNRU1fTUlOCTB4ODAKLSNkZWZpbmUgTUVNX01BWAkweGNmCi0jZGVmaW5lIE1FTV9TSVoJKCAqIHNpemVvZihzdHJ1Y3QgdGFiZW50KSkKLQotCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcnNlX3RhYmVudCBtZW1faW5pdFtdID0gewotCSAgeyAweDgwLAkibGRvYiIsCSAyIH0sCi0JICB7IDB4ODIsCSJzdG9iIiwJLTIgfSwKLQkgIHsgMHg4NCwJImJ4IiwJIDEgfSwKLQkgIHsgMHg4NSwJImJhbHgiLAkgMiB9LAotCSAgeyAweDg2LAkiY2FsbHgiLCAxIH0sCi0JICB7IDB4ODgsCSJsZG9zIiwJIDIgfSwKLQkgIHsgMHg4YSwJInN0b3MiLAktMiB9LAotCSAgeyAweDhjLAkibGRhIiwJIDIgfSwKLQkgIHsgMHg5MCwJImxkIiwJIDIgfSwKLQkgIHsgMHg5MiwJInN0IiwJLTIgfSwKLQkgIHsgMHg5OCwJImxkbCIsCSAyIH0sCi0JICB7IDB4OWEsCSJzdGwiLAktMiB9LAotCSAgeyAweGEwLAkibGR0IiwJIDIgfSwKLQkgIHsgMHhhMiwJInN0dCIsCS0yIH0sCi0JICB7IDB4YWMsCSJkY2ludmEiLCAxIH0sCi0JICB7IDB4YjAsCSJsZHEiLAkgMiB9LAotCSAgeyAweGIyLAkic3RxIiwJLTIgfSwKLQkgIHsgMHhjMCwJImxkaWIiLAkgMiB9LAotCSAgeyAweGMyLAkic3RpYiIsCS0yIH0sCi0JICB7IDB4YzgsCSJsZGlzIiwJIDIgfSwKLQkgIHsgMHhjYSwJInN0aXMiLAktMiB9LAotCSAgeyAwLAkJTlVMTCwJMCB9Ci0JfTsKLQlzdGF0aWMgc3RydWN0IHRhYmVudCBtZW1fdGFiX2J1ZltNRU1fTUFYIC0gTUVNX01JTiArIDFdOwotCi0JaWYgKCBtZW1fdGFiID09IE5VTEwgKXsKLQkJbWVtX3RhYiA9IG1lbV90YWJfYnVmOwotCQlmb3IgKCBpID0gMDsgbWVtX2luaXRbaV0ub3Bjb2RlICE9IDA7IGkrKyApewotCQkJaiA9IG1lbV9pbml0W2ldLm9wY29kZSAtIE1FTV9NSU47Ci0JCQltZW1fdGFiW2pdLm5hbWUgPSBtZW1faW5pdFtpXS5uYW1lOwotCQkJbWVtX3RhYltqXS5udW1vcHMgPSBtZW1faW5pdFtpXS5udW1vcHM7Ci0JCX0KLQl9Ci0KLQlpID0gKCh3b3JkMSA+PiAyNCkgJiAweGZmKSAtIE1FTV9NSU47Ci0JbW9kZSA9ICh3b3JkMSA+PiAxMCkgJiAweGY7Ci0KLQlpZiAoIChtZW1fdGFiW2ldLm5hbWUgIT0gTlVMTCkJCS8qIFZhbGlkIGluc3RydWN0aW9uICovCi0JJiYgICAoKG1vZGUgPT0gNSkgfHwgKG1vZGUgPj0xMikpICl7CS8qIFdpdGggMzItYml0IGRpc3BsYWNlbWVudCAqLwotCQlsZW4gPSA4OwotCX0gZWxzZSB7Ci0JCWxlbiA9IDQ7Ci0JfQotCi0JaWYgKCBub3ByaW50ICl7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JaWYgKCAobWVtX3RhYltpXS5uYW1lID09IE5VTEwpIHx8IChtb2RlID09IDYpICl7Ci0JCWludmFsaWQoIHdvcmQxICk7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlc1x0IiwgbWVtX3RhYltpXS5uYW1lICk7Ci0KLQlyZWcxID0gcmVnX25hbWVzWyAod29yZDEgPj4gMTkpICYgMHgxZiBdOwkvKiBNRU1CIG9ubHkgKi8KLQlyZWcyID0gcmVnX25hbWVzWyAod29yZDEgPj4gMTQpICYgMHgxZiBdOwotCXJlZzMgPSByZWdfbmFtZXNbIHdvcmQxICYgMHgxZiBdOwkJLyogTUVNQiBvbmx5ICovCi0Jb2Zmc2V0ID0gd29yZDEgJiAweGZmZjsJCQkJLyogTUVNQSBvbmx5ICAqLwotCi0Jc3dpdGNoICggbWVtX3RhYltpXS5udW1vcHMgKXsKLQotCWNhc2UgMjogLyogTE9BRCBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgJiA0ICl7CQkJLyogTUVNQiBGT1JNQVQgKi8KLQkJCWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKTsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCVzIiwgcmVnMSApOwotCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIweCV4IiwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKLQkJCWlmIChtb2RlICYgOCkgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJCX0KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCVzIiwgcmVnMSApOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSAtMjogLyogU1RPUkUgSU5TVFJVQ1RJT04gKi8KLQkJaWYgKCBtb2RlICYgNCApewkJCS8qIE1FTUIgRk9STUFUICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVzLCIsIHJlZzEgKTsKLQkJCWVhKCBtZW1hZGRyLCBtb2RlLCByZWcyLCByZWczLCB3b3JkMSwgd29yZDIgKTsKLQkJfSBlbHNlIHsJCQkJLyogTUVNQSBGT1JNQVQgKi8KLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiJXMsMHgleCIsIHJlZzEsICh1bnNpZ25lZCkgb2Zmc2V0ICk7Ci0JCQlpZiAobW9kZSAmIDgpIHsKLQkJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcykiLCByZWcyICk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIDE6IC8qIEJYL0NBTExYIElOU1RSVUNUSU9OICovCi0JCWlmICggbW9kZSAmIDQgKXsJCQkvKiBNRU1CIEZPUk1BVCAqLwotCQkJZWEoIG1lbWFkZHIsIG1vZGUsIHJlZzIsIHJlZzMsIHdvcmQxLCB3b3JkMiApOwotCQl9IGVsc2UgewkJCQkvKiBNRU1BIEZPUk1BVCAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIweCV4IiwgKHVuc2lnbmVkKSBvZmZzZXQgKTsKLQkJCWlmIChtb2RlICYgOCkgewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKSIsIHJlZzIgKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gbGVuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJFRyBmb3JtYXQJCQkJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQKLXJlZyggd29yZDEgKQotICAgIHVuc2lnbmVkIGxvbmcgd29yZDE7Ci17Ci0JaW50IGksIGo7Ci0JaW50IG9wY29kZTsKLQlpbnQgZnA7Ci0JaW50IG0xLCBtMiwgbTM7Ci0JaW50IHMxLCBzMjsKLQlpbnQgc3JjLCBzcmMyLCBkc3Q7Ci0JY2hhciAqbW5lbXA7Ci0KLQkvKiBUaGlzIGxvb2t1cCB0YWJsZSBpcyB0b28gc3BhcnNlIHRvIG1ha2UgaXQgd29ydGggdHlwaW5nIGluLCBidXQgbm90Ci0JICAgc28gbGFyZ2UgYXMgdG8gbWFrZSBhIHNwYXJzZSBhcnJheSBuZWNlc3NhcnkuICBXZSBjcmVhdGUgdGhlIHRhYmxlCi0JICAgYXQgcnVudGltZS4gICovCi0KLQkvKgotCSAqIE5PVEU6IEluIHRoaXMgdGFibGUsIHRoZSBtZWFuaW5nIG9mICdudW1vcHMnIGlzOgotCSAqCSAxOiBzaW5nbGUgb3BlcmFuZCwgd2hpY2ggaXMgTk9UIGEgZGVzdGluYXRpb24uCi0JICoJLTE6IHNpbmdsZSBvcGVyYW5kLCB3aGljaCBJUyBhIGRlc3RpbmF0aW9uLgotCSAqCSAyOiAyIG9wZXJhbmRzLCB0aGUgMm5kIG9mIHdoaWNoIGlzIE5PVCBhIGRlc3RpbmF0aW9uLgotCSAqCS0yOiAyIG9wZXJhbmRzLCB0aGUgMm5kIG9mIHdoaWNoIElTIGEgZGVzdGluYXRpb24uCi0JICoJIDM6IDMgb3BlcmFuZHMKLQkgKgotCSAqCUlmIGFuIG9wY29kZSBtbmVtb25pYyBiZWdpbnMgd2l0aCAiRiIsIGl0IGlzIGEgZmxvYXRpbmctcG9pbnQKLQkgKglvcGNvZGUgKHRoZSAiRiIgaXMgbm90IHByaW50ZWQpLgotCSAqLwotCi0Jc3RhdGljIHN0cnVjdCB0YWJlbnQgKnJlZ190YWI7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyc2VfdGFiZW50IHJlZ19pbml0W10gPSB7Ci0jZGVmaW5lIFJFR19NSU4JMHg1ODAKLQkgIHsgMHg1ODAsCSJub3RiaXQiLAkzIH0sCi0JICB7IDB4NTgxLAkiYW5kIiwJCTMgfSwKLQkgIHsgMHg1ODIsCSJhbmRub3QiLAkzIH0sCi0JICB7IDB4NTgzLAkic2V0Yml0IiwJMyB9LAotCSAgeyAweDU4NCwJIm5vdGFuZCIsCTMgfSwKLQkgIHsgMHg1ODYsCSJ4b3IiLAkJMyB9LAotCSAgeyAweDU4NywJIm9yIiwJCTMgfSwKLQkgIHsgMHg1ODgsCSJub3IiLAkJMyB9LAotCSAgeyAweDU4OSwJInhub3IiLAkJMyB9LAotCSAgeyAweDU4YSwJIm5vdCIsCQktMiB9LAotCSAgeyAweDU4YiwJIm9ybm90IiwJMyB9LAotCSAgeyAweDU4YywJImNscmJpdCIsCTMgfSwKLQkgIHsgMHg1OGQsCSJub3RvciIsCTMgfSwKLQkgIHsgMHg1OGUsCSJuYW5kIiwJCTMgfSwKLQkgIHsgMHg1OGYsCSJhbHRlcmJpdCIsCTMgfSwKLQkgIHsgMHg1OTAsIAkiYWRkbyIsCQkzIH0sCi0JICB7IDB4NTkxLCAJImFkZGkiLAkJMyB9LAotCSAgeyAweDU5MiwgCSJzdWJvIiwJCTMgfSwKLQkgIHsgMHg1OTMsIAkic3ViaSIsCQkzIH0sCi0JICB7IDB4NTk0LAkiY21wb2IiLAkyIH0sCi0JICB7IDB4NTk1LAkiY21waWIiLAkyIH0sCi0JICB7IDB4NTk2LAkiY21wb3MiLAkyIH0sCi0JICB7IDB4NTk3LAkiY21waXMiLAkyIH0sCi0JICB7IDB4NTk4LCAJInNocm8iLAkJMyB9LAotCSAgeyAweDU5YSwgCSJzaHJkaSIsCTMgfSwKLQkgIHsgMHg1OWIsIAkic2hyaSIsCQkzIH0sCi0JICB7IDB4NTljLCAJInNobG8iLAkJMyB9LAotCSAgeyAweDU5ZCwgCSJyb3RhdGUiLAkzIH0sCi0JICB7IDB4NTllLCAJInNobGkiLAkJMyB9LAotCSAgeyAweDVhMCwgCSJjbXBvIiwJCTIgfSwKLQkgIHsgMHg1YTEsIAkiY21waSIsCQkyIH0sCi0JICB7IDB4NWEyLCAJImNvbmNtcG8iLAkyIH0sCi0JICB7IDB4NWEzLCAJImNvbmNtcGkiLAkyIH0sCi0JICB7IDB4NWE0LCAJImNtcGluY28iLAkzIH0sCi0JICB7IDB4NWE1LCAJImNtcGluY2kiLAkzIH0sCi0JICB7IDB4NWE2LCAJImNtcGRlY28iLAkzIH0sCi0JICB7IDB4NWE3LCAJImNtcGRlY2kiLAkzIH0sCi0JICB7IDB4NWFjLCAJInNjYW5ieXRlIiwJMiB9LAotCSAgeyAweDVhZCwJImJzd2FwIiwJLTIgfSwKLQkgIHsgMHg1YWUsIAkiY2hrYml0IiwJMiB9LAotCSAgeyAweDViMCwgCSJhZGRjIiwJCTMgfSwKLQkgIHsgMHg1YjIsIAkic3ViYyIsCQkzIH0sCi0JICB7IDB4NWI0LAkiaW50ZGlzIiwJMCB9LAotCSAgeyAweDViNSwJImludGVuIiwJMCB9LAotCSAgeyAweDVjYywJIm1vdiIsCQktMiB9LAotCSAgeyAweDVkOCwJImVzaHJvIiwJMyB9LAotCSAgeyAweDVkYywJIm1vdmwiLAkJLTIgfSwKLQkgIHsgMHg1ZWMsCSJtb3Z0IiwJCS0yIH0sCi0JICB7IDB4NWZjLAkibW92cSIsCQktMiB9LAotCSAgeyAweDYwMCwJInN5bm1vdiIsCTIgfSwKLQkgIHsgMHg2MDEsCSJzeW5tb3ZsIiwJMiB9LAotCSAgeyAweDYwMiwJInN5bm1vdnEiLAkyIH0sCi0JICB7IDB4NjAzLAkiY21wc3RyIiwJMyB9LAotCSAgeyAweDYwNCwJIm1vdnFzdHIiLAkzIH0sCi0JICB7IDB4NjA1LAkibW92c3RyIiwJMyB9LAotCSAgeyAweDYxMCwJImF0bW9kIiwJMyB9LAotCSAgeyAweDYxMiwJImF0YWRkIiwJMyB9LAotCSAgeyAweDYxMywJImluc3BhY2MiLAktMiB9LAotCSAgeyAweDYxNCwJImxkcGh5IiwJLTIgfSwKLQkgIHsgMHg2MTUsCSJzeW5sZCIsCS0yIH0sCi0JICB7IDB4NjE3LAkiZmlsbCIsCQkzIH0sCi0JICB7IDB4NjMwLAkic2RtYSIsCQkzIH0sCi0JICB7IDB4NjMxLAkidWRtYSIsCQkwIH0sCi0JICB7IDB4NjQwLAkic3BhbmJpdCIsCS0yIH0sCi0JICB7IDB4NjQxLAkic2NhbmJpdCIsCS0yIH0sCi0JICB7IDB4NjQyLAkiZGFkZGMiLAkzIH0sCi0JICB7IDB4NjQzLAkiZHN1YmMiLAkzIH0sCi0JICB7IDB4NjQ0LAkiZG1vdnQiLAktMiB9LAotCSAgeyAweDY0NSwJIm1vZGFjIiwJMyB9LAotCSAgeyAweDY0NiwJImNvbmRyZWMiLAktMiB9LAotCSAgeyAweDY1MCwJIm1vZGlmeSIsCTMgfSwKLQkgIHsgMHg2NTEsCSJleHRyYWN0IiwJMyB9LAotCSAgeyAweDY1NCwJIm1vZHRjIiwJMyB9LAotCSAgeyAweDY1NSwJIm1vZHBjIiwJMyB9LAotCSAgeyAweDY1NiwJInJlY2VpdmUiLAktMiB9LAotCSAgeyAweDY1OCwJImludGN0bCIsCS0yIH0sCi0JICB7IDB4NjU5LAkic3lzY3RsIiwJMyB9LAotCSAgeyAweDY1YiwJImljY3RsIiwJMyB9LAotCSAgeyAweDY1YywJImRjY3RsIiwJMyB9LAotCSAgeyAweDY1ZCwJImhhbHQiLAkJMCB9LAotCSAgeyAweDY2MCwJImNhbGxzIiwJMSB9LAotCSAgeyAweDY2MiwJInNlbmQiLAkJMyB9LAotCSAgeyAweDY2MywJInNlbmRzZXJ2IiwJMSB9LAotCSAgeyAweDY2NCwJInJlc3VtcHJjcyIsCTEgfSwKLQkgIHsgMHg2NjUsCSJzY2hlZHByY3MiLAkxIH0sCi0JICB7IDB4NjY2LAkic2F2ZXByY3MiLAkwIH0sCi0JICB7IDB4NjY4LAkiY29uZHdhaXQiLAkxIH0sCi0JICB7IDB4NjY5LAkid2FpdCIsCQkxIH0sCi0JICB7IDB4NjZhLAkic2lnbmFsIiwJMSB9LAotCSAgeyAweDY2YiwJIm1hcmsiLAkJMCB9LAotCSAgeyAweDY2YywJImZtYXJrIiwJMCB9LAotCSAgeyAweDY2ZCwJImZsdXNocmVnIiwJMCB9LAotCSAgeyAweDY2ZiwJInN5bmNmIiwJMCB9LAotCSAgeyAweDY3MCwJImVtdWwiLAkJMyB9LAotCSAgeyAweDY3MSwJImVkaXYiLAkJMyB9LAotCSAgeyAweDY3MywgCSJsZHRpbWUiLAktMSB9LAotCSAgeyAweDY3NCwJIkZjdnRpciIsCS0yIH0sCi0JICB7IDB4Njc1LAkiRmN2dGlsciIsCS0yIH0sCi0JICB7IDB4Njc2LAkiRnNjYWxlcmwiLAkzIH0sCi0JICB7IDB4Njc3LAkiRnNjYWxlciIsCTMgfSwKLQkgIHsgMHg2ODAsCSJGYXRhbnIiLAkzIH0sCi0JICB7IDB4NjgxLAkiRmxvZ2VwciIsCTMgfSwKLQkgIHsgMHg2ODIsCSJGbG9nciIsCTMgfSwKLQkgIHsgMHg2ODMsCSJGcmVtciIsCTMgfSwKLQkgIHsgMHg2ODQsCSJGY21wb3IiLAkyIH0sCi0JICB7IDB4Njg1LAkiRmNtcHIiLAkyIH0sCi0JICB7IDB4Njg4LAkiRnNxcnRyIiwJLTIgfSwKLQkgIHsgMHg2ODksCSJGZXhwciIsCS0yIH0sCi0JICB7IDB4NjhhLAkiRmxvZ2JuciIsCS0yIH0sCi0JICB7IDB4NjhiLAkiRnJvdW5kciIsCS0yIH0sCi0JICB7IDB4NjhjLAkiRnNpbnIiLAktMiB9LAotCSAgeyAweDY4ZCwJIkZjb3NyIiwJLTIgfSwKLQkgIHsgMHg2OGUsCSJGdGFuciIsCS0yIH0sCi0JICB7IDB4NjhmLAkiRmNsYXNzciIsCTEgfSwKLQkgIHsgMHg2OTAsCSJGYXRhbnJsIiwJMyB9LAotCSAgeyAweDY5MSwJIkZsb2dlcHJsIiwJMyB9LAotCSAgeyAweDY5MiwJIkZsb2dybCIsCTMgfSwKLQkgIHsgMHg2OTMsCSJGcmVtcmwiLAkzIH0sCi0JICB7IDB4Njk0LAkiRmNtcG9ybCIsCTIgfSwKLQkgIHsgMHg2OTUsCSJGY21wcmwiLAkyIH0sCi0JICB7IDB4Njk4LAkiRnNxcnRybCIsCS0yIH0sCi0JICB7IDB4Njk5LAkiRmV4cHJsIiwJLTIgfSwKLQkgIHsgMHg2OWEsCSJGbG9nYm5ybCIsCS0yIH0sCi0JICB7IDB4NjliLAkiRnJvdW5kcmwiLAktMiB9LAotCSAgeyAweDY5YywJIkZzaW5ybCIsCS0yIH0sCi0JICB7IDB4NjlkLAkiRmNvc3JsIiwJLTIgfSwKLQkgIHsgMHg2OWUsCSJGdGFucmwiLAktMiB9LAotCSAgeyAweDY5ZiwJIkZjbGFzc3JsIiwJMSB9LAotCSAgeyAweDZjMCwJIkZjdnRyaSIsCS0yIH0sCi0JICB7IDB4NmMxLAkiRmN2dHJpbCIsCS0yIH0sCi0JICB7IDB4NmMyLAkiRmN2dHpyaSIsCS0yIH0sCi0JICB7IDB4NmMzLAkiRmN2dHpyaWwiLAktMiB9LAotCSAgeyAweDZjOSwJIkZtb3ZyIiwJLTIgfSwKLQkgIHsgMHg2ZDksCSJGbW92cmwiLAktMiB9LAotCSAgeyAweDZlMSwgCSJGbW92cmUiLAktMiB9LAotCSAgeyAweDZlMiwgCSJGY3B5c3JlIiwJMyB9LAotCSAgeyAweDZlMywgCSJGY3B5cnNyZSIsCTMgfSwKLQkgIHsgMHg3MDEsCSJtdWxvIiwJCTMgfSwKLQkgIHsgMHg3MDgsCSJyZW1vIiwJCTMgfSwKLQkgIHsgMHg3MGIsCSJkaXZvIiwJCTMgfSwKLQkgIHsgMHg3NDEsCSJtdWxpIiwJCTMgfSwKLQkgIHsgMHg3NDgsCSJyZW1pIiwJCTMgfSwKLQkgIHsgMHg3NDksCSJtb2RpIiwJCTMgfSwKLQkgIHsgMHg3NGIsCSJkaXZpIiwJCTMgfSwKLQkgIHsgMHg3ODAsCSJhZGRvbm8iLAkzIH0sCi0JICB7IDB4NzgxLAkiYWRkaW5vIiwJMyB9LAotCSAgeyAweDc4MiwJInN1Ym9ubyIsCTMgfSwKLQkgIHsgMHg3ODMsCSJzdWJpbm8iLAkzIH0sCi0JICB7IDB4Nzg0LAkic2Vsbm8iLAkzIH0sCi0JICB7IDB4NzhiLAkiRmRpdnIiLAkzIH0sCi0JICB7IDB4NzhjLAkiRm11bHIiLAkzIH0sCi0JICB7IDB4NzhkLAkiRnN1YnIiLAkzIH0sCi0JICB7IDB4NzhmLAkiRmFkZHIiLAkzIH0sCi0JICB7IDB4NzkwLAkiYWRkb2ciLAkzIH0sCi0JICB7IDB4NzkxLAkiYWRkaWciLCAgICAgICAgMyB9LAotCSAgeyAweDc5MiwJInN1Ym9nIiwJMyB9LAotCSAgeyAweDc5MywJInN1YmlnIiwJMyB9LAotCSAgeyAweDc5NCwJInNlbGciLAkJMyB9LAotCSAgeyAweDc5YiwJIkZkaXZybCIsCTMgfSwKLQkgIHsgMHg3OWMsCSJGbXVscmwiLAkzIH0sCi0JICB7IDB4NzlkLAkiRnN1YnJsIiwJMyB9LAotCSAgeyAweDc5ZiwJIkZhZGRybCIsCTMgfSwKLQkgIHsgMHg3YTAsCSJhZGRvZSIsCTMgfSwKLQkgIHsgMHg3YTEsCSJhZGRpZSIsICAgICAgICAzIH0sCi0JICB7IDB4N2EyLAkic3Vib2UiLAkzIH0sCi0JICB7IDB4N2EzLAkic3ViaWUiLAkzIH0sCi0JICB7IDB4N2E0LAkic2VsZSIsCQkzIH0sCi0JICB7IDB4N2IwLAkiYWRkb2dlIiwJMyB9LAotCSAgeyAweDdiMSwJImFkZGlnZSIsCTMgfSwKLQkgIHsgMHg3YjIsCSJzdWJvZ2UiLAkzIH0sCi0JICB7IDB4N2IzLAkic3ViaWdlIiwJMyB9LAotCSAgeyAweDdiNCwJInNlbGdlIiwJMyB9LAotCSAgeyAweDdjMCwJImFkZG9sIiwJMyB9LAotCSAgeyAweDdjMSwJImFkZGlsIiwJMyB9LAotCSAgeyAweDdjMiwJInN1Ym9sIiwJMyB9LAotCSAgeyAweDdjMywJInN1YmlsIiwJMyB9LAotCSAgeyAweDdjNCwJInNlbGwiLAkJMyB9LAotCSAgeyAweDdkMCwJImFkZG9uZSIsCTMgfSwKLQkgIHsgMHg3ZDEsCSJhZGRpbmUiLAkzIH0sCi0JICB7IDB4N2QyLAkic3Vib25lIiwJMyB9LAotCSAgeyAweDdkMywJInN1YmluZSIsCTMgfSwKLQkgIHsgMHg3ZDQsCSJzZWxuZSIsCTMgfSwKLQkgIHsgMHg3ZTAsCSJhZGRvbGUiLAkzIH0sCi0JICB7IDB4N2UxLAkiYWRkaWxlIiwJMyB9LAotCSAgeyAweDdlMiwJInN1Ym9sZSIsCTMgfSwKLQkgIHsgMHg3ZTMsCSJzdWJpbGUiLAkzIH0sCi0JICB7IDB4N2U0LAkic2VsbGUiLAkzIH0sCi0JICB7IDB4N2YwLAkiYWRkb28iLAkzIH0sCi0JICB7IDB4N2YxLAkiYWRkaW8iLAkzIH0sCi0JICB7IDB4N2YyLAkic3Vib28iLAkzIH0sCi0JICB7IDB4N2YzLAkic3ViaW8iLAkzIH0sCi0JICB7IDB4N2Y0LAkic2VsbyIsCQkzIH0sCi0jZGVmaW5lIFJFR19NQVggMHg3ZjQKLQkgIHsgMCwJCU5VTEwsCQkwIH0KLQl9OwotCXN0YXRpYyBzdHJ1Y3QgdGFiZW50IHJlZ190YWJfYnVmW1JFR19NQVggLSBSRUdfTUlOICsgMV07Ci0KLQlpZiAoIHJlZ190YWIgPT0gTlVMTCApewotCQlyZWdfdGFiID0gcmVnX3RhYl9idWY7Ci0JCWZvciAoIGkgPSAwOyByZWdfaW5pdFtpXS5vcGNvZGUgIT0gMDsgaSsrICl7Ci0JCQlqID0gcmVnX2luaXRbaV0ub3Bjb2RlIC0gUkVHX01JTjsKLQkJCXJlZ190YWJbal0ubmFtZSA9IHJlZ19pbml0W2ldLm5hbWU7Ci0JCQlyZWdfdGFiW2pdLm51bW9wcyA9IHJlZ19pbml0W2ldLm51bW9wczsKLQkJfQotCX0KLQotCW9wY29kZSA9ICgod29yZDEgPj4gMjApICYgMHhmZjApIHwgKCh3b3JkMSA+PiA3KSAmIDB4Zik7Ci0JaSA9IG9wY29kZSAtIFJFR19NSU47Ci0KLQlpZiAoIChvcGNvZGU8UkVHX01JTikgfHwgKG9wY29kZT5SRUdfTUFYKSB8fCAocmVnX3RhYltpXS5uYW1lPT1OVUxMKSApewotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotCi0JbW5lbXAgPSByZWdfdGFiW2ldLm5hbWU7Ci0JaWYgKCAqbW5lbXAgPT0gJ0YnICl7Ci0JCWZwID0gMTsKLQkJbW5lbXArKzsKLQl9IGVsc2UgewotCQlmcCA9IDA7Ci0JfQotCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIG1uZW1wICk7Ci0KLQlzMSAgID0gKHdvcmQxID4+IDUpICAmIDE7Ci0JczIgICA9ICh3b3JkMSA+PiA2KSAgJiAxOwotCW0xICAgPSAod29yZDEgPj4gMTEpICYgMTsKLQltMiAgID0gKHdvcmQxID4+IDEyKSAmIDE7Ci0JbTMgICA9ICh3b3JkMSA+PiAxMykgJiAxOwotCXNyYyAgPSAgd29yZDEgICAgICAgICYgMHgxZjsKLQlzcmMyID0gKHdvcmQxID4+IDE0KSAmIDB4MWY7Ci0JZHN0ICA9ICh3b3JkMSA+PiAxOSkgJiAweDFmOwotCi0JaWYgICggcmVnX3RhYltpXS5udW1vcHMgIT0gMCApewotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlx0IiApOwotCi0JCXN3aXRjaCAoIHJlZ190YWJbaV0ubnVtb3BzICl7Ci0JCWNhc2UgMToKLQkJCXJlZ29wKCBtMSwgczEsIHNyYywgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIC0xOgotCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJcmVnb3AoIG0yLCBzMiwgc3JjMiwgZnAgKTsKLQkJCWJyZWFrOwotCQljYXNlIC0yOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJZHN0b3AoIG0zLCBkc3QsIGZwICk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJcmVnb3AoIG0xLCBzMSwgc3JjLCBmcCApOwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIsIiApOwotCQkJcmVnb3AoIG0yLCBzMiwgc3JjMiwgZnAgKTsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiLCIgKTsKLQkJCWRzdG9wKCBtMywgZHN0LCBmcCApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLQotLyoKLSAqIFByaW50IG91dCBlZmZlY3RpdmUgYWRkcmVzcyBmb3IgbWVtYiBpbnN0cnVjdGlvbnMuCi0gKi8KLXN0YXRpYyB2b2lkCi1lYSggbWVtYWRkciwgbW9kZSwgcmVnMiwgcmVnMywgd29yZDEsIHdvcmQyICkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBpbnQgbW9kZTsKLSAgICAgY2hhciAqcmVnMiwgKnJlZzM7Ci0gICAgIGludCB3b3JkMTsKLSAgICAgdW5zaWduZWQgaW50IHdvcmQyOwotewotCWludCBzY2FsZTsKLQlzdGF0aWMgY29uc3QgaW50IHNjYWxlX3RhYltdID0geyAxLCAyLCA0LCA4LCAxNiB9OwotCi0Jc2NhbGUgPSAod29yZDEgPj4gNykgJiAweDA3OwotCWlmICggKHNjYWxlID4gNCkgfHwgKCgod29yZDEgPj4gNSkgJiAweDAzKSAhPSAwKSApewotCQlpbnZhbGlkKCB3b3JkMSApOwotCQlyZXR1cm47Ci0JfQotCXNjYWxlID0gc2NhbGVfdGFiW3NjYWxlXTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgNDoJIAkJCQkJLyogKHJlZykgKi8KLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQlicmVhazsKLQljYXNlIDU6CQkJCQkJLyogZGlzcGwrOChpcCkgKi8KLQkJcHJpbnRfYWRkciggd29yZDIrOCttZW1hZGRyICk7Ci0JCWJyZWFrOwotCWNhc2UgNzoJCQkJCQkvKiAocmVnKVtpbmRleCpzY2FsZV0gKi8KLQkJaWYgKHNjYWxlID09IDEpIHsKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiKCVzKVslc10iLCByZWcyLCByZWczICk7Ci0JCX0gZWxzZSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXMqJWRdIixyZWcyLHJlZzMsc2NhbGUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMTI6CQkJCQkvKiBkaXNwbGFjZW1lbnQgKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJYnJlYWs7Ci0JY2FzZSAxMzoJCQkJCS8qIGRpc3BsKHJlZykgKi8KLQkJcHJpbnRfYWRkciggKGJmZF92bWEpd29yZDIgKTsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpIiwgcmVnMiApOwotCQlicmVhazsKLQljYXNlIDE0OgkJCQkJLyogZGlzcGxbaW5kZXgqc2NhbGVdICovCi0JCXByaW50X2FkZHIoIChiZmRfdm1hKXdvcmQyICk7Ci0JCWlmIChzY2FsZSA9PSAxKSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlslc10iLCByZWczICk7Ci0JCX0gZWxzZSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIlslcyolZF0iLCByZWczLCBzY2FsZSApOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMTU6CQkJCS8qIGRpc3BsKHJlZylbaW5kZXgqc2NhbGVdICovCi0JCXByaW50X2FkZHIoIChiZmRfdm1hKXdvcmQyICk7Ci0JCWlmIChzY2FsZSA9PSAxKSB7Ci0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiglcylbJXNdIiwgcmVnMiwgcmVnMyApOwotCQl9IGVsc2UgewotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIoJXMpWyVzKiVkXSIscmVnMixyZWczLHNjYWxlICk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaW52YWxpZCggd29yZDEgKTsKLQkJcmV0dXJuOwotCX0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogUmVnaXN0ZXIgSW5zdHJ1Y3Rpb24gT3BlcmFuZCAgCQkqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkCi1yZWdvcCggbW9kZSwgc3BlYywgcmVnLCBmcCApCi0gICAgaW50IG1vZGUsIHNwZWMsIHJlZywgZnA7Ci17Ci0JaWYgKCBmcCApewkJCQkvKiBGTE9BVElORyBQT0lOVCBJTlNUUlVDVElPTiAqLwotCQlpZiAoIG1vZGUgPT0gMSApewkJCS8qIEZQIG9wZXJhbmQgKi8KLQkJCXN3aXRjaCAoIHJlZyApewotCQkJY2FzZSAwOiAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJmcDAiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAxOiAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJmcDEiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAyOiAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJmcDIiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAzOiAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICJmcDMiICk7Ci0JCQkgIGJyZWFrOwotCQkJY2FzZSAxNjogKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIwZjAuMCIgKTsKLQkJCSAgYnJlYWs7Ci0JCQljYXNlIDIyOiAoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIjBmMS4wIiApOwotCQkJICBicmVhazsKLQkJCWRlZmF1bHQ6ICgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCAiPyIgKTsKLQkJCSAgYnJlYWs7Ci0JCQl9Ci0JCX0gZWxzZSB7CQkJCS8qIE5vbi1GUCByZWdpc3RlciAqLwotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sIHJlZ19uYW1lc1tyZWddICk7Ci0JCX0KLQl9IGVsc2UgewkJCQkvKiBOT1QgRkxPQVRJTkcgUE9JTlQgKi8KLQkJaWYgKCBtb2RlID09IDEgKXsJCQkvKiBMaXRlcmFsICovCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiVkIiwgcmVnICk7Ci0JCX0gZWxzZSB7CQkJCS8qIFJlZ2lzdGVyICovCi0JCQlpZiAoIHNwZWMgPT0gMCApewotCQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSggc3RyZWFtLCByZWdfbmFtZXNbcmVnXSApOwotCQkJfSBlbHNlIHsKLQkJCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgInNmJWQiLCByZWcgKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJlZ2lzdGVyIEluc3RydWN0aW9uIERlc3RpbmF0aW9uIE9wZXJhbmQJKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZAotZHN0b3AoIG1vZGUsIHJlZywgZnAgKQotICAgIGludCBtb2RlLCByZWcsIGZwOwotewotCS8qICdkc3QnIG9wZXJhbmQgY2FuJ3QgYmUgYSBsaXRlcmFsLiBPbiBub24tRlAgaW5zdHJ1Y3Rpb25zLCAgcmVnaXN0ZXIKLQkgKiBtb2RlIGlzIGFzc3VtZWQgYW5kICJtMyIgYWN0cyBhcyBpZiB3ZXJlICJzMyI7ICBvbiBGUC1pbnN0cnVjdGlvbnMsCi0JICogc2YgcmVnaXN0ZXJzIGFyZSBub3QgYWxsb3dlZCBzbyBtMyBhY3RzIG5vcm1hbGx5LgotCSAqLwotCSBpZiAoIGZwICl7Ci0JCXJlZ29wKCBtb2RlLCAwLCByZWcsIGZwICk7Ci0JIH0gZWxzZSB7Ci0JCXJlZ29wKCAwLCBtb2RlLCByZWcsIGZwICk7Ci0JIH0KLX0KLQotCi1zdGF0aWMgdm9pZAotaW52YWxpZCggd29yZDEgKQotICAgIGludCB3b3JkMTsKLXsKLQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIi53b3JkXHQweCUwOHgiLCAodW5zaWduZWQpIHdvcmQxICk7Ci19CQotCi1zdGF0aWMgdm9pZAotcHJpbnRfYWRkcihhKQotYmZkX3ZtYSBhOwotewotICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGEsIGluZm8pOwotfQotCi1zdGF0aWMgdm9pZAotcHV0X2Ficyggd29yZDEsIHdvcmQyICkKLSAgICB1bnNpZ25lZCBsb25nIHdvcmQxLCB3b3JkMjsKLXsKLSNpZmRlZiBJTl9HREIKLQlyZXR1cm47Ci0jZWxzZQotCWludCBsZW47Ci0KLQlzd2l0Y2ggKCAod29yZDEgPj4gMjgpICYgMHhmICl7Ci0JY2FzZSAweDg6Ci0JY2FzZSAweDk6Ci0JY2FzZSAweGE6Ci0JY2FzZSAweGI6Ci0JY2FzZSAweGM6Ci0JCS8qIE1FTSBmb3JtYXQgaW5zdHJ1Y3Rpb24gKi8KLQkJbGVuID0gbWVtKCAwLCB3b3JkMSwgd29yZDIsIDEgKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJbGVuID0gNDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCBsZW4gPT0gOCApewotCQkoKmluZm8tPmZwcmludGZfZnVuYykoIHN0cmVhbSwgIiUwOHggJTA4eFx0Iiwgd29yZDEsIHdvcmQyICk7Ci0JfSBlbHNlIHsKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpKCBzdHJlYW0sICIlMDh4ICAgICAgICAgXHQiLCB3b3JkMSApOwotCX0KLTsKLQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDIwMC1kaXMuYyBiL29wY29kZXMvbTEwMjAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJjN2UzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMjAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIE1OMTAyMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyB2b2lkIGRpc2Fzc2VtYmxlIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosCi0JCQkJIHVuc2lnbmVkIGxvbmcgaW5zbiwgdW5zaWduZWQgbG9uZywKLQkJCQkgdW5zaWduZWQgaW50KSk7Ci0KLWludCAKLXByaW50X2luc25fbW4xMDIwMCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGxvbmcgZXh0ZW5zaW9uID0gMDsKLSAgdW5zaWduZWQgaW50IGNvbnN1bWU7Ci0KLSAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLwotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDEsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGluc24gPSAqKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyOwotCi0gIC8qIFRoZXNlIGFyZSBvbmUgYnl0ZSBpbnNucy4gICovCi0gIGlmICgoaW5zbiAmIDB4ZjApID09IDB4MDAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHgxMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDIwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4MzAKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDkwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4YTAKLSAgICAgIHx8IChpbnNuICYgMHhmMCkgPT0gMHhiMAotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGViCi0gICAgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjYKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmZQotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGZmKQotICAgIHsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gMTsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHR3byBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGYwKSA9PSAweDQwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDUwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDYwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDcwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDgwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ0Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ4Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGUwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweGU0Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGU4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGU5Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGVhCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYwCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYxCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYyCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGYzKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjE2IChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDI7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSB0aHJlZSBieXRlIGluc25zIHdpdGggYSAxNmJpdCBvcGVyYW5kIGluIGxpdHRsZQotICAgICBlbmRpYW4gZm9ybS4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmMCkgPT0gMHhjMAotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkYwotCSAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhlYwotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmOAotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmOQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYgotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYwotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmZCkKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMSwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIDw8PSAxNjsKLSAgICAgIGluc24gfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0gICAgICBjb25zdW1lID0gMzsKLSAgICB9Ci0gIC8qIFRoZXNlIGFyZSB0aHJlZSBieXRlIGluc25zIHRvbywgYnV0IHdlIGRvbid0IGhhdmUgdG8gbWVzcyB3aXRoCi0gICAgIGVuZGlhbm5lc3Mgc3R1ZmYuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjUpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA8PD0gMTY7Ci0gICAgICBpbnNuIHw9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBleHRlbnNpb24gPSAwOwotICAgICAgY29uc3VtZSA9IDM7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmb3VyIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjcpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgICAgIGluc24gPDw9IDE2OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotICAgICAgZXh0ZW5zaW9uID0gMDsKLSAgICAgIGNvbnN1bWUgPSA0OwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgZml2ZSBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGZmKSA9PSAweGY0KQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBpbnNuIDw8PSAxNjsKLQotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDQsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiB8PSAoKih1bnNpZ25lZCBjaGFyICopYnVmZmVyIDw8IDgpICYgMHhmZjAwOwotCi0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMywgYnVmZmVyLCAxLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuIHw9ICgqKHVuc2lnbmVkIGNoYXIgKilidWZmZXIpICYgMHhmZjsKLQotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgZXh0ZW5zaW9uID0gKCoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcikgJiAweGZmOwotICAgICAgY29uc3VtZSA9IDU7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oInVua25vd25cdDB4JTAyeCIpLCBpbnNuKTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBkaXNhc3NlbWJsZSAobWVtYWRkciwgaW5mbywgaW5zbiwgZXh0ZW5zaW9uLCBjb25zdW1lKTsKLQotICByZXR1cm4gY29uc3VtZTsKLX0KLQotc3RhdGljIHZvaWQKLWRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuLCBleHRlbnNpb24sIHNpemUpCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgbG9uZyBleHRlbnNpb247Ci0gICAgIHVuc2lnbmVkIGludCBzaXplOwotewotICBzdHJ1Y3QgbW4xMDIwMF9vcGNvZGUgKm9wID0gKHN0cnVjdCBtbjEwMjAwX29wY29kZSAqKW1uMTAyMDBfb3Bjb2RlczsKLSAgY29uc3Qgc3RydWN0IG1uMTAyMDBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgaW50IG1hdGNoID0gMDsKLQotICAvKiBGaW5kIHRoZSBvcGNvZGUuICAqLwotICB3aGlsZSAob3AtPm5hbWUpCi0gICAgewotICAgICAgaW50IG15c2l6ZSwgZXh0cmFfc2hpZnQ7Ci0KLSAgICAgIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8xKQotCW15c2l6ZSA9IDE7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8yCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzQpCi0JbXlzaXplID0gMjsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzMKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNSkKLQlteXNpemUgPSAzOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfNikKLQlteXNpemUgPSA0OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfNykKLQlteXNpemUgPSA1OwotICAgICAgZWxzZQotCWFib3J0ICgpOwotCQotICAgICAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UXzIgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNSkKLQlleHRyYV9zaGlmdCA9IDg7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF8zCi0JICAgICAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UXzYKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfNykKLQlleHRyYV9zaGlmdCA9IDE2OwotICAgICAgZWxzZQotCWV4dHJhX3NoaWZ0ID0gMDsKLQotICAgICAgaWYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUKLQkgICYmIHNpemUgPT0gKHVuc2lnbmVkIGludCkgbXlzaXplKQotCXsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotCSAgdW5zaWduZWQgaW50IG5vY29tbWE7Ci0JICBpbnQgcGFyZW4gPSAwOwotCSAgCi0JICBtYXRjaCA9IDE7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzXHQiLCBvcC0+bmFtZSk7Ci0KLQkgIC8qIE5vdyBwcmludCB0aGUgb3BlcmFuZHMuICAqLwotCSAgZm9yIChvcGluZGV4X3B0ciA9IG9wLT5vcGVyYW5kcywgbm9jb21tYSA9IDE7Ci0JICAgICAgICpvcGluZGV4X3B0ciAhPSAwOwotCSAgICAgICBvcGluZGV4X3B0cisrKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotCSAgICAgIG9wZXJhbmQgPSAmbW4xMDIwMF9vcGVyYW5kc1sqb3BpbmRleF9wdHJdOwotCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCkgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKGluc24gJiAweGZmZmYpIDw8IDg7Ci0JCSAgdmFsdWUgfD0gZXh0ZW5zaW9uOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0KSkKLQkJCSAgICYgKCgxTCA8PCBvcGVyYW5kLT5iaXRzKSAtIDFMKSk7Ci0JCX0KLQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfU0lHTkVEKSAhPSAwKQotCQl2YWx1ZSA9ICgobG9uZykodmFsdWUgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpCi0JCQkgID4+ICgzMiAtIG9wZXJhbmQtPmJpdHMpKTsKLQotCSAgICAgIGlmICghbm9jb21tYQotCQkgICYmICghcGFyZW4KLQkJICAgICAgfHwgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9QQVJFTikgPT0gMCkpKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQotCSAgICAgIG5vY29tbWEgPSAwOwotCQkKLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0RSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImQlZCIsIHZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX0FSRUcpICE9IDApCi0JCXsKLQkJICB2YWx1ZSA9ICgoaW5zbiA+PiAob3BlcmFuZC0+c2hpZnQgKyBleHRyYV9zaGlmdCkpCi0JCQkgICAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpKTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImElZCIsIHZhbHVlKTsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BTVykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJwc3ciKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAyMDBfT1BFUkFORF9NRFIpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibWRyIik7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMjAwX09QRVJBTkRfUEFSRU4pICE9IDApCi0JCXsKLQkJICBpZiAocGFyZW4pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCIpOwotCQkgICAgICBub2NvbW1hID0gMTsKLQkJICAgIH0KLQkJICBwYXJlbiA9ICFwYXJlbjsKLQkJfQotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX1BDUkVMKSAhPSAwKQotCQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKCh2YWx1ZSArIG1lbWFkZHIgKyBteXNpemUpICYgMHhmZmZmZmYsIGluZm8pOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDIwMF9PUEVSQU5EX01FTUFERFIpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotCi0JICAgICAgZWxzZSAKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0JICAgIH0KLQkgIC8qIEFsbCBkb25lLiAqLwotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICB7Ci0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIF8oInVua25vd25cdDB4JTA0bHgiKSwgaW5zbik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tMTAyMDAtb3BjLmMgYi9vcGNvZGVzL20xMDIwMC1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3MGI5MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20xMDIwMC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKiBBc3NlbWJsZSBNYXRzdXNoaXRhIE1OMTAyMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDIwMC5oIgotCi0MCi1jb25zdCBzdHJ1Y3QgbW4xMDIwMF9vcGVyYW5kIG1uMTAyMDBfb3BlcmFuZHNbXSA9IHsKLSNkZWZpbmUgVU5VU0VECTAKLSAgezAsIDAsIDB9LCAKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETjAgICAgICAoVU5VU0VEKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMSAgICAgIChETjArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTAgICAgICAoRE4xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMSAgICAgIChETTArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9EUkVHfSwKLQotLyogYW4gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjAgICAgICAoRE0xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFOMSAgICAgIChBTjArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTTAgICAgICAoQU4xKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMSAgICAgIChBTTArMSkKLSAgezIsIDIsIE1OMTAyMDBfT1BFUkFORF9BUkVHfSwKLQotLyogOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTggICAgKEFNMSsxKQotICB7OCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2ICAgIChJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgcGMtcmVsYXRpdmUgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHBjLXJlbGF0aXZlIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2X1BDUkVMICAgIChJTU0xNisxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAyMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAxNmJpdCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NMTZfTUVNICAgIChJTU0xNl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDIwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAyNCBpbW1lZGlhdGUsIGxvdyAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZC4gICovCi0KLSNkZWZpbmUgSU1NMjQgICAgKElNTTE2X01FTSsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRH0sCi0KLS8qIDMyYml0IHBjLXJlbGF0aXZlIG9mZnNldC4gICovCi0jZGVmaW5lIElNTTI0X1BDUkVMICAgIChJTU0yNCsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAyMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAyMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAzMmJpdCBtZW1vcnkgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMjRfTUVNICAgIChJTU0yNF9QQ1JFTCsxKQotICB7MjQsIDAsIE1OMTAyMDBfT1BFUkFORF9FWFRFTkRFRCB8IE1OMTAyMDBfT1BFUkFORF9NRU1BRERSfSwKLQotLyogUHJvY2Vzc29yIHN0YXR1cyB3b3JkLiAgKi8KLSNkZWZpbmUgUFNXICAgIChJTU0yNF9NRU0rMSkKLSAgezAsIDAsIE1OMTAyMDBfT1BFUkFORF9QU1d9LAotCi0vKiBNRFIgcmVnaXN0ZXIuICAqLwotI2RlZmluZSBNRFIgICAgKFBTVysxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX01EUn0sCi0KLS8qIEluZGV4IHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgREkgKE1EUisxKQotICB7MiwgNCwgTU4xMDIwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiA4IGJpdCBzaWduZWQgZGlzcGxhY2VtZW50LCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDggICAgKERJKzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMzJiaXQgZGlzcGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDE2ICAgIChTRDgrMSkKLSAgezE2LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiA4IGJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDhOX1BDUkVMICAgIChTRDE2KzEpCi0gIHs4LCAwLCBNTjEwMjAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDIwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDIwMF9PUEVSQU5EX1JFTEFYfSwKLQotLyogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTggICAgKFNEOE5fUENSRUwrMSkKLSAgezgsIDAsIE1OMTAyMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMjAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIDMyYml0ICBpbW1lZGlhdGUuICAqLwotI2RlZmluZSBTSU1NMTYgICAgKFNJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgd2hpY2ggbWF5IG5vdCBwcm9tb3RlLiAgKi8KLSNkZWZpbmUgU0lNTTE2TiAgICAoU0lNTTE2KzEpCi0gIHsxNiwgMCwgTU4xMDIwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAyMDBfT1BFUkFORF9OT0NIRUNLfSwKLQotLyogRWl0aGVyIGFuIG9wZW4gcGFyZW4gb3IgY2xvc2UgcGFyZW4uICAqLwotI2RlZmluZSBQQVJFTgkoU0lNTTE2TisxKQotICB7MCwgMCwgTU4xMDIwMF9PUEVSQU5EX1BBUkVOfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBETjAxICAgICAoUEFSRU4rMSkKLSAgezIsIDAsIE1OMTAyMDBfT1BFUkFORF9EUkVHIHwgTU4xMDIwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogYW4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEFOMDEgICAgIChETjAxKzEpCi0gIHsyLCAwLCBNTjEwMjAwX09QRVJBTkRfQVJFRyB8IE1OMTAyMDBfT1BFUkFORF9SRVBFQVRFRH0sCi19IDsgCi0KLSNkZWZpbmUgTUVNKEFERFIpIFBBUkVOLCBBRERSLCBQQVJFTiAKLSNkZWZpbmUgTUVNMihBRERSMSxBRERSMikgUEFSRU4sIEFERFIxLCBBRERSMiwgUEFSRU4gCi0MCi0vKiBUaGUgb3Bjb2RlIHRhYmxlLgotCi0gICBUaGUgZm9ybWF0IG9mIHRoZSBvcGNvZGUgdGFibGUgaXM6Ci0KLSAgIE5BTUUJCU9QQ09ERQkJTUFTSwkJeyBPUEVSQU5EUyB9Ci0KLSAgIE5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGluc3RydWN0aW9uLgotICAgT1BDT0RFIGlzIHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCi0gICBNQVNLIGlzIHRoZSBvcGNvZGUgbWFzazsgdGhpcyBpcyB1c2VkIHRvIHRlbGwgdGhlIGRpc2Fzc2VtYmxlcgotICAgICB3aGljaCBiaXRzIGluIHRoZSBhY3R1YWwgb3Bjb2RlIG11c3QgbWF0Y2ggT1BDT0RFLgotICAgT1BFUkFORFMgaXMgdGhlIGxpc3Qgb2Ygb3BlcmFuZHMuCi0KLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4gICovCi0KLWNvbnN0IHN0cnVjdCBtbjEwMjAwX29wY29kZSBtbjEwMjAwX29wY29kZXNbXSA9IHsKLXsgIm1vdiIsCTB4ODAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7U0lNTTgsIEROMDF9fSwKLXsgIm1vdiIsCTB4ODAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoteyAibW92IiwJMHhmMjMwLAkJMHhmZmYwLAkJRk1UXzQsIHtETTEsIEFOMH19LAoteyAibW92IiwJMHhmMmYwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoteyAibW92IiwJMHhmMjcwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoteyAibW92IiwJMHhmM2YwLAkJMHhmZmZjLAkJRk1UXzQsIHtQU1csIEROMH19LAoteyAibW92IiwJMHhmM2QwLAkJMHhmZmYzLAkJRk1UXzQsIHtETjEsIFBTV319LAoteyAibW92IiwJMHhmM2UwLAkJMHhmZmZjLAkJRk1UXzQsIHtNRFIsIEROMH19LAoteyAibW92IiwJMHhmM2MwLAkJMHhmZmYzLAkJRk1UXzQsIHtETjEsIE1EUn19LAoteyAibW92IiwJMHgyMCwJCTB4ZjAsCQlGTVRfMSwge01FTShBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4NjAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92IiwJMHhmN2MwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtNRU0yKFNEMTYsIEFOMSksIERNMH19LAoteyAibW92IiwJMHhmNDgwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92IiwJMHhmMTQwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKLXsgIm1vdiIsCTB4YzgwMDAwLAkweGZjMDAwMCwJRk1UXzMsIHtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3YiLAkweGY0YzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLXsgIm1vdiIsCTB4NzAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7TUVNMihTRDgsQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweDcwMDAsCQkweGYwMDAsCQlGTVRfMiwge01FTShBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjdiMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjRmMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7TUVNMihJTU0yNCxBTjEpLCBBTTB9fSwKLXsgIm1vdiIsCTB4ZjEwMCwJCTB4ZmZjMCwJCUZNVF80LCB7TUVNMihESSwgQU4xKSwgQU0wfX0sCi17ICJtb3YiLAkweGY3MzAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge01FTShJTU0xNl9NRU0pLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjRkMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7TUVNKElNTTI0X01FTSksIEFOMH19LAoteyAibW92IiwJMHgwMCwJCTB4ZjAsCQlGTVRfMSwge0RNMCwgTUVNKEFOMSl9fSwKLXsgIm1vdiIsCTB4NDAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7RE0wLCBNRU0yKFNEOCwgQU4xKX19LAoteyAibW92IiwJMHhmNzgwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92IiwJMHhmNDAwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtETTAsIE1FTTIoSU1NMjQsIEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjFjMCwJCTB4ZmZjMCwJCUZNVF80LCB7RE0wLCBNRU0yKERJLCBBTjEpfX0sCi17ICJtb3YiLAkweGMwMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7RE4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmNDQwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtETjAsIE1FTShJTU0yNF9NRU0pfX0sCi17ICJtb3YiLAkweDUwMDAsCQkweGYwMDAsCQlGTVRfMiwge0FNMCwgTUVNMihTRDgsIEFOMSl9fSwKLXsgIm1vdiIsCTB4NTAwMCwJCTB4ZjAwMCwJCUZNVF8yLCB7QU0wLCBNRU0oQU4xKX19LAoteyAibW92IiwJMHhmN2EwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtBTTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92IiwJMHhmNDEwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtBTTAsIE1FTTIoSU1NMjQsQU4xKX19LAoteyAibW92IiwJMHhmMTgwLAkJMHhmZmMwLAkJRk1UXzQsIHtBTTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdiIsCTB4ZjcyMDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7QU4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmNDUwMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtBTjAsIE1FTShJTU0yNF9NRU0pfX0sCi17ICJtb3YiLAkweGY4MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7U0lNTTE2LCBETjB9fSwKLXsgIm1vdiIsCTB4ZjQ3MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAibW92IiwJMHhkYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0lNTTE2LCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjQ3NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAotCi17ICJtb3Z4IiwJMHhmNTcwMDAsCTB4ZmZmMDAwLAlGTVRfNSwge01FTTIoU0Q4LCBBTjEpLCBETTB9fSwKLXsgIm1vdngiLAkweGY3NzAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNiwge01FTTIoU0QxNiwgQU4xKSwgRE0wfX0sCi17ICJtb3Z4IiwJMHhmNGIwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92eCIsCTB4ZjU1MDAwLAkweGZmZjAwMCwJRk1UXzUsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3Z4IiwJMHhmNzYwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92eCIsCTB4ZjQzMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCi0KLXsgIm1vdmIiLAkweGY1MjAwMCwJMHhmZmYwMDAsCUZNVF81LCB7TUVNMihTRDgsIEFOMSksIERNMH19LAoteyAibW92YiIsCTB4ZjdkMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGY0YTAwMDAwLAkweGZmZjAwMDAwLAlGTVRfNywge01FTTIoSU1NMjQsQU4xKSwgRE0wfX0sCi17ICJtb3ZiIiwJMHhmMDQwLAkJMHhmZmMwLAkJRk1UXzQsIHtNRU0yKERJLCBBTjEpLCBETTB9fSwKLXsgIm1vdmIiLAkweGY0YzQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLXsgIm1vdmIiLAkweDEwLAkJMHhmMCwJCUZNVF8xLCB7RE0wLCBNRU0oQU4xKX19LAoteyAibW92YiIsCTB4ZjUxMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtETTAsIE1FTTIoU0Q4LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmNzkwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzYsIHtETTAsIE1FTTIoU0QxNiwgQU4xKX19LAoteyAibW92YiIsCTB4ZjQyMDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF83LCB7RE0wLCBNRU0yKElNTTI0LCBBTjEpfX0sCi17ICJtb3ZiIiwJMHhmMGMwLAkJMHhmZmMwLAkJRk1UXzQsIHtETTAsIE1FTTIoREksIEFOMSl9fSwKLXsgIm1vdmIiLAkweGM0MDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7RE4wLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92YiIsCTB4ZjQ0NDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7RE4wLCBNRU0oSU1NMjRfTUVNKX19LAotCi17ICJtb3ZidSIsCTB4MzAsCQkweGYwLAkJRk1UXzEsIHtNRU0oQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4ZjUzMDAwLAkweGZmZjAwMCwJRk1UXzUsIHtNRU0yKFNEOCwgQU4xKSwgRE0wfX0sCi17ICJtb3ZidSIsCTB4Zjc1MDAwMDAsCTB4ZmZmMDAwMDAsCUZNVF82LCB7TUVNMihTRDE2LCBBTjEpLCBETTB9fSwKLXsgIm1vdmJ1IiwJMHhmNDkwMDAwMCwJMHhmZmYwMDAwMCwJRk1UXzcsIHtNRU0yKElNTTI0LEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGYwODAsCQkweGZmYzAsCQlGTVRfNCwge01FTTIoREksIEFOMSksIERNMH19LAoteyAibW92YnUiLAkweGNjMDAwMCwJMHhmYzAwMDAsCUZNVF8zLCB7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92YnUiLAkweGY0YzgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge01FTShJTU0yNF9NRU0pLCBETjB9fSwKLQoteyAiZXh0IiwJMHhmM2MxLAkJMHhmZmYzLAkJRk1UXzQsIHtETjF9fSwKLXsgImV4dHgiLAkweGIwLCAJCTB4ZmMsCQlGTVRfMSwge0ROMH19LAoteyAiZXh0eHUiLAkweGI0LAkJMHhmYywJCUZNVF8xLCB7RE4wfX0sCi17ICJleHR4YiIsCTB4YjgsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLXsgImV4dHhidSIsCTB4YmMsCQkweGZjLAkJRk1UXzEsIHtETjB9fSwKLQoteyAiYWRkIiwJMHg5MCwJCTB4ZjAsCQlGTVRfMSwge0ROMSwgRE0wfX0sCi17ICJhZGQiLAkweGYyMDAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJhZGQiLAkweGYyYzAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJhZGQiLAkweGYyNDAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJhZGQiLAkweGQ0MDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBETjB9fSwKLXsgImFkZCIsCTB4ZjcxODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBETjB9fSwKLXsgImFkZCIsCTB4ZjQ2MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAiYWRkIiwJMHhkMDAwLAkJMHhmYzAwLAkJRk1UXzIsIHtTSU1NOCwgQU4wfX0sCi17ICJhZGQiLAkweGY3MDgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNiwgQU4wfX0sCi17ICJhZGQiLAkweGY0NjQwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBBTjB9fSwKLXsgImFkZGMiLAkweGYyODAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJhZGRuZiIsCTB4ZjUwYzAwLAkweGZmZmMwMCwJRk1UXzUsIHtTSU1NOCwgQU4wfX0sCi0KLXsgInN1YiIsCTB4YTAsCQkweGYwLAkJRk1UXzEsIHtETjEsIERNMH19LAoteyAic3ViIiwJMHhmMjEwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIEFOMH19LAoteyAic3ViIiwJMHhmMmQwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIERNMH19LAoteyAic3ViIiwJMHhmMjUwLAkJMHhmZmYwLAkJRk1UXzQsIHtBTjEsIEFNMH19LAoteyAic3ViIiwJMHhmNzFjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtJTU0xNiwgRE4wfX0sCi17ICJzdWIiLAkweGY0NjgwMDAwLAkweGZmZmMwMDAwLAlGTVRfNywge0lNTTI0LCBETjB9fSwKLXsgInN1YiIsCTB4ZjcwYzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7SU1NMTYsIEFOMH19LAoteyAic3ViIiwJMHhmNDZjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzcsIHtJTU0yNCwgQU4wfX0sCi17ICJzdWJjIiwJMHhmMjkwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJtdWwiLAkweGYzNDAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJtdWx1IiwJMHhmMzUwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJkaXZ1IiwJMHhmMzYwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAotCi17ICJjbXAiLAkweGYzOTAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJjbXAiLAkweGYyMjAsCQkweGZmZjAsCQlGTVRfNCwge0RNMSwgQU4wfX0sCi17ICJjbXAiLAkweGYyZTAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgRE0wfX0sCi17ICJjbXAiLAkweGYyNjAsCQkweGZmZjAsCQlGTVRfNCwge0FOMSwgQU0wfX0sCi17ICJjbXAiLAkweGQ4MDAsCQkweGZjMDAsCQlGTVRfMiwge1NJTU04LCBETjB9fSwKLXsgImNtcCIsCTB4Zjc0ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2LCBETjB9fSwKLXsgImNtcCIsCTB4ZjQ3ODAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEROMH19LAoteyAiY21wIiwJMHhlYzAwMDAsCTB4ZmMwMDAwLAlGTVRfMywge0lNTTE2LCBBTjB9fSwKLXsgImNtcCIsCTB4ZjQ3YzAwMDAsCTB4ZmZmYzAwMDAsCUZNVF83LCB7SU1NMjQsIEFOMH19LAotCi17ICJhbmQiLAkweGYzMDAsCQkweGZmZjAsCQlGTVRfNCwge0ROMSwgRE0wfX0sCi17ICJhbmQiLAkweGY1MDAwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCi17ICJhbmQiLAkweGY3MDAwMDAwLAkweGZmZmMwMDAwLAlGTVRfNiwge1NJTU0xNk4sIEROMH19LAoteyAiYW5kIiwJMHhmNzEwMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBQU1d9fSwKLXsgIm9yIiwJCTB4ZjMxMCwJCTB4ZmZmMCwJCUZNVF80LCB7RE4xLCBETTB9fSwKLXsgIm9yIiwJCTB4ZjUwODAwLAkweGZmZmMwMCwJRk1UXzUsIHtJTU04LCBETjB9fSwKLXsgIm9yIiwJCTB4Zjc0MDAwMDAsCTB4ZmZmYzAwMDAsCUZNVF82LCB7U0lNTTE2TiwgRE4wfX0sCi17ICJvciIsCQkweGY3MTQwMDAwLAkweGZmZmYwMDAwLAlGTVRfNiwge1NJTU0xNk4sIFBTV319LAoteyAieG9yIiwJMHhmMzIwLAkJMHhmZmYwLAkJRk1UXzQsIHtETjEsIERNMH19LAoteyAieG9yIiwJMHhmNzRjMDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgIm5vdCIsCTB4ZjNlNCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi0KLXsgImFzciIsCTB4ZjMzOCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi17ICJsc3IiLAkweGYzM2MsCQkweGZmZmMsCQlGTVRfNCwge0ROMH19LAoteyAicm9yIiwJMHhmMzM0LAkJMHhmZmZjLAkJRk1UXzQsIHtETjB9fSwKLXsgInJvbCIsCTB4ZjMzMCwJCTB4ZmZmYywJCUZNVF80LCB7RE4wfX0sCi0KLXsgImJ0c3QiLAkweGY1MDQwMCwJMHhmZmZjMDAsCUZNVF81LCB7SU1NOCwgRE4wfX0sCi17ICJidHN0IiwJMHhmNzA0MDAwMCwJMHhmZmZjMDAwMCwJRk1UXzYsIHtTSU1NMTZOLCBETjB9fSwKLXsgImJzZXQiLAkweGYwMjAsCQkweGZmZjAsCQlGTVRfNCwge0RNMCwgTUVNKEFOMSl9fSwKLXsgImJjbHIiLAkweGYwMzAsCQkweGZmZjAsCQlGTVRfNCwge0RNMCwgTUVNKEFOMSl9fSwKLQoteyAiYmVxIiwJMHhlODAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibmUiLAkweGU5MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJsdCIsCTB4ZTAwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxlIiwJMHhlMzAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ2UiLAkweGUyMDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJndCIsCTB4ZTEwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmNzIiwJMHhlNDAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJibHMiLAkweGU3MDAsCQkweGZmMDAsCQlGTVRfMiwge1NEOE5fUENSRUx9fSwKLXsgImJjYyIsCTB4ZTYwMCwJCTB4ZmYwMCwJCUZNVF8yLCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmhpIiwJMHhlNTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi17ICJidmMiLAkweGY1ZmMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnZzIiwJMHhmNWZkMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJuYyIsCTB4ZjVmZTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibnMiLAkweGY1ZmYwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnJhIiwJMHhlYTAwLAkJMHhmZjAwLAkJRk1UXzIsIHtTRDhOX1BDUkVMfX0sCi0KLXsgImJlcXgiLAkweGY1ZTgwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5leCIsCTB4ZjVlOTAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJibHR4IiwJMHhmNWUwMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJsZXgiLAkweGY1ZTMwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmdleCIsCTB4ZjVlMjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiZ3R4IiwJMHhmNWUxMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJjc3giLAkweGY1ZTQwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYmxzeCIsCTB4ZjVlNzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJiY2N4IiwJMHhmNWU2MDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJoaXgiLAkweGY1ZTUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYnZjeCIsCTB4ZjVlYzAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi17ICJidnN4IiwJMHhmNWVkMDAsCTB4ZmZmZjAwLAlGTVRfNSwge1NEOE5fUENSRUx9fSwKLXsgImJuY3giLAkweGY1ZWUwMCwJMHhmZmZmMDAsCUZNVF81LCB7U0Q4Tl9QQ1JFTH19LAoteyAiYm5zeCIsCTB4ZjVlZjAwLAkweGZmZmYwMCwJRk1UXzUsIHtTRDhOX1BDUkVMfX0sCi0KLXsgImptcCIsCTB4ZmMwMDAwLAkweGZmMDAwMCwJRk1UXzMsIHtJTU0xNl9QQ1JFTH19LAoteyAiam1wIiwJMHhmNGUwMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzcsIHtJTU0yNF9QQ1JFTH19LAoteyAiam1wIiwJMHhmMDAwLAkJMHhmZmYzLAkJRk1UXzQsIHtQQVJFTixBTjEsUEFSRU59fSwKLXsgImpzciIsCTB4ZmQwMDAwLAkweGZmMDAwMCwJRk1UXzMsIHtJTU0xNl9QQ1JFTH19LAoteyAianNyIiwJMHhmNGUxMDAwMCwJMHhmZmZmMDAwMCwJRk1UXzcsIHtJTU0yNF9QQ1JFTH19LAoteyAianNyIiwJMHhmMDAxLAkJMHhmZmYzLAkJRk1UXzQsIHtQQVJFTixBTjEsUEFSRU59fSwKLQoteyAibm9wIiwJMHhmNiwJCTB4ZmYsCQlGTVRfMSwge1VOVVNFRH19LAotCi17ICJydHMiLAkweGZlLAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi17ICJydGkiLAkweGViLAkJMHhmZiwJCUZNVF8xLCB7VU5VU0VEfX0sCi0KLS8qIEV4dGVuc2lvbi4gIFdlIG5lZWQgc29tZSBpbnN0cnVjdGlvbiB0byB0cmlnZ2VyICJlbXVsYXRlZCBzeXNjYWxscyIKLSAgIGZvciBvdXIgc2ltdWxhdG9yLiAgKi8KLXsgInN5c2NhbGwiLAkweGYwMTAsCQkweGZmZmYsCQlGTVRfNCwge1VOVVNFRH19LAotCi0vKiBFeHRlbnNpb24uICBXaGVuIHRhbGtpbmcgdG8gdGhlIHNpbXVsYXRvciwgZ2RiIHJlcXVpcmVzIHNvbWUgaW5zdHJ1Y3Rpb24KLSAgIHRoYXQgd2lsbCB0cmlnZ2VyIGEgImJyZWFrcG9pbnQiIChyZWFsbHkganVzdCBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzbid0Ci0gICBvdGhlcndpc2UgdXNlZCBieSB0aGUgdG9vbHMuICBUaGlzIGluc3RydWN0aW9uIG11c3QgYmUgdGhlIHNhbWUgc2l6ZQotICAgYXMgdGhlIHNtYWxsZXN0IGluc3RydWN0aW9uIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gIEluIHRoZSBjYXNlIG9mIHRoZQotICAgbW4xMHgwMCB0aGUgImJyZWFrIiBpbnN0cnVjdGlvbiBtdXN0IGJlIG9uZSBieXRlLiAgMHhmZiBpcyBhdmFpbGFibGUgb24KLSAgIGJvdGggbW4xMHgwMCBhcmNoaXRlY3R1cmVzLiAgKi8KLXsgImJyZWFrIiwgICAgICAweGZmLCAgICAgICAgICAgMHhmZiwgICAgICAgICAgIEZNVF8xLCB7VU5VU0VEfX0sCi0KLXsgMCwgMCwgMCwgMCwgezB9fSwKLQotfSA7Ci0KLWNvbnN0IGludCBtbjEwMjAwX251bV9vcGNvZGVzID0KLSAgc2l6ZW9mIChtbjEwMjAwX29wY29kZXMpIC8gc2l6ZW9mIChtbjEwMjAwX29wY29kZXNbMF0pOwotCi0MCmRpZmYgLS1naXQgYS9vcGNvZGVzL20xMDMwMC1kaXMuYyBiL29wY29kZXMvbTEwMzAwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTViZmZjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTEwMzAwLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQ4ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIE1OMTAzMDAgaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvbW4xMDMwMC5oIiAKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyB2b2lkIGRpc2Fzc2VtYmxlIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosCi0JCQkJIHVuc2lnbmVkIGxvbmcgaW5zbiwgdW5zaWduZWQgaW50KSk7Ci0KLWludCAKLXByaW50X2luc25fbW4xMDMwMCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IHN0YXR1czsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIHVuc2lnbmVkIGludCBjb25zdW1lOwotCi0gIC8qIEZpcnN0IGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgb3Bjb2RlIGlzLiAgKi8KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAxLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgaW5zbiA9ICoodW5zaWduZWQgY2hhciAqKSBidWZmZXI7Ci0KLSAgLyogVGhlc2UgYXJlIG9uZSBieXRlIGluc25zLiAgKi8KLSAgaWYgKChpbnNuICYgMHhmMykgPT0gMHgwMAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDEwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4M2MKLSAgICAgIHx8IChpbnNuICYgMHhmMykgPT0gMHg0MQotICAgICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQwCi0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4NTAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHg1NAotICAgICAgfHwgKGluc24gJiAweGYwKSA9PSAweDYwCi0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4NzAKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4ODAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHg5MAotCSAgJiYgKGluc24gJiAweDBjKSA+PiAyICE9IChpbnNuICYgMHgwMykpCi0gICAgICB8fCAoKGluc24gJiAweGYwKSA9PSAweGEwCi0JICAmJiAoaW5zbiAmIDB4MGMpID4+IDIgIT0gKGluc24gJiAweDAzKSkKLSAgICAgIHx8ICgoaW5zbiAmIDB4ZjApID09IDB4YjAKLQkgICYmIChpbnNuICYgMHgwYykgPj4gMiAhPSAoaW5zbiAmIDB4MDMpKQotICAgICAgfHwgKGluc24gJiAweGZmKSA9PSAweGNiCi0gICAgICB8fCAoaW5zbiAmIDB4ZmMpID09IDB4ZDAKLSAgICAgIHx8IChpbnNuICYgMHhmYykgPT0gMHhkNAotICAgICAgfHwgKGluc24gJiAweGZjKSA9PSAweGQ4Ci0gICAgICB8fCAoaW5zbiAmIDB4ZjApID09IDB4ZTAKLSAgICAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmZikKLSAgICB7Ci0gICAgICBjb25zdW1lID0gMTsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHR3byBieXRlIGluc25zLiAgKi8KLSAgZWxzZSBpZiAoKGluc24gJiAweGYwKSA9PSAweDgwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweDkwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweGEwCi0JICAgfHwgKGluc24gJiAweGYwKSA9PSAweGIwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDIwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDI4Ci0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQzCi0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDQyCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDU4Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDVjCi0JICAgfHwgKChpbnNuICYgMHhmMCkgPT0gMHhjMAotCSAgICAgICAmJiAoaW5zbiAmIDB4ZmYpICE9IDB4Y2IKLQkgICAgICAgJiYgKGluc24gJiAweGZmKSAhPSAweGNjCi0JICAgICAgICYmIChpbnNuICYgMHhmZikgIT0gMHhjZCkKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjAKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjEKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjIKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjMKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjQKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjUKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZjYpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gMjsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIHRocmVlIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZjgKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4Y2MgCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGY5Ci0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDAxCi0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDAyCi0JICAgfHwgKGluc24gJiAweGYzKSA9PSAweDAzCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDI0Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDJjCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDMwCi0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDM0Ci0JICAgfHwgKGluc24gJiAweGZjKSA9PSAweDM4Ci0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGRlCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGRmCi0JICAgfHwgKGluc24gJiAweGZmKSA9PSAweGNjKQotICAgIHsKLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBpbnNuIDw8PSA4OwotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMSwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JICByZXR1cm4gLTE7Ci0JfQotICAgICAgaW5zbiB8PSAqKHVuc2lnbmVkIGNoYXIgKilidWZmZXI7Ci0gICAgICBjb25zdW1lID0gMzsKLSAgICB9Ci0KLSAgLyogVGhlc2UgYXJlIGZvdXIgYnl0ZSBpbnNucy4gICovCi0gIGVsc2UgaWYgKChpbnNuICYgMHhmZikgPT0gMHhmYQotCSAgIHx8IChpbnNuICYgMHhmZikgPT0gMHhmYikKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDQ7Ci0gICAgfQotCi0gIC8qIFRoZXNlIGFyZSBmaXZlIGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4Y2QKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZGMpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgICAgIGNvbnN1bWUgPSA1OwotICAgIH0KLQotICAvKiBUaGVzZSBhcmUgc2l4IGJ5dGUgaW5zbnMuICAqLwotICBlbHNlIGlmICgoaW5zbiAmIDB4ZmYpID09IDB4ZmQKLQkgICB8fCAoaW5zbiAmIDB4ZmYpID09IDB4ZmMpCi0gICAgewotICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGluc24gPSBiZmRfZ2V0YjMyIChidWZmZXIpOwotICAgICAgY29uc3VtZSA9IDY7Ci0gICAgfQotCi0gIC8qIEVsc2UgaXRzIGEgc2V2ZW4gYnl0ZSBpbnNucyAoaW4gdGhlb3J5KS4gICovCi0gIGVsc2UKLSAgICB7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCXsKLQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCSAgcmV0dXJuIC0xOwotCX0KLQotICAgICAgaW5zbiA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgICBjb25zdW1lID0gNzsKLSAgICB9Ci0KLSAgZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIGNvbnN1bWUpOwotCi0gIHJldHVybiBjb25zdW1lOwotfQotCi1zdGF0aWMgdm9pZAotZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24sIHNpemUpCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgdW5zaWduZWQgaW50IHNpemU7Ci17Ci0gIHN0cnVjdCBtbjEwMzAwX29wY29kZSAqb3AgPSAoc3RydWN0IG1uMTAzMDBfb3Bjb2RlICopbW4xMDMwMF9vcGNvZGVzOwotICBjb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGVyYW5kICpvcGVyYW5kOwotICBiZmRfYnl0ZSBidWZmZXJbNF07Ci0gIHVuc2lnbmVkIGxvbmcgZXh0ZW5zaW9uID0gMDsKLSAgaW50IHN0YXR1cywgbWF0Y2ggPSAwOwotCi0gIC8qIEZpbmQgdGhlIG9wY29kZS4gICovCi0gIHdoaWxlIChvcC0+bmFtZSkKLSAgICB7Ci0gICAgICBpbnQgbXlzaXplLCBleHRyYV9zaGlmdDsKLQotICAgICAgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1MwKQotCW15c2l6ZSA9IDE7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9TMQotCSAgICAgICB8fCBvcC0+Zm9ybWF0ID09IEZNVF9EMCkKLQlteXNpemUgPSAyOwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfUzIKLQkgICAgICAgfHwgb3AtPmZvcm1hdCA9PSBGTVRfRDEpCi0JbXlzaXplID0gMzsKLSAgICAgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX1M0KQotCW15c2l6ZSA9IDU7Ci0gICAgICBlbHNlIGlmIChvcC0+Zm9ybWF0ID09IEZNVF9EMikKLQlteXNpemUgPSA0OwotICAgICAgZWxzZSBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDQpCi0JbXlzaXplID0gNjsKLSAgICAgIGVsc2UKLQlteXNpemUgPSA3OwotCQotICAgICAgaWYgKChvcC0+bWFzayAmIGluc24pID09IG9wLT5vcGNvZGUKLQkgICYmIHNpemUgPT0gKHVuc2lnbmVkIGludCkgbXlzaXplCi0JICAmJiAob3AtPm1hY2hpbmUgPT0gMAotCSAgICAgIHx8IG9wLT5tYWNoaW5lID09IGluZm8tPm1hY2gpKQotCXsKLQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXhfcHRyOwotCSAgdW5zaWduZWQgaW50IG5vY29tbWE7Ci0JICBpbnQgcGFyZW4gPSAwOwotCSAgCi0JICBpZiAob3AtPmZvcm1hdCA9PSBGTVRfRDEgfHwgb3AtPmZvcm1hdCA9PSBGTVRfUzEpCi0JICAgIGV4dHJhX3NoaWZ0ID0gODsKLQkgIGVsc2UgaWYgKG9wLT5mb3JtYXQgPT0gRk1UX0QyIHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q0Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1MyIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1M0Ci0JCSAgIHx8IG9wLT5mb3JtYXQgPT0gRk1UX1M2IHx8IG9wLT5mb3JtYXQgPT0gRk1UX0Q1KQotCSAgICBleHRyYV9zaGlmdCA9IDE2OwotCSAgZWxzZQotCSAgICBleHRyYV9zaGlmdCA9IDA7Ci0KLQkgIGlmIChzaXplID09IDEgfHwgc2l6ZSA9PSAyKQotCSAgICB7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSAzCi0JCSAgICYmIChvcC0+Zm9ybWF0ID09IEZNVF9EMQotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGRmMDAwMAotCQkgICAgICAgfHwgb3AtPm9wY29kZSA9PSAweGRlMDAwMCkpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDMpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmYwMDAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCi0JICAgICAgaW5zbiB8PSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCSAgICAgIGV4dGVuc2lvbiA9IDA7Ci0JICAgIH0KLQkgIGVsc2UgaWYgKHNpemUgPT0gNAotCQkgICAmJiAob3AtPm9wY29kZSA9PSAweGZhZjgwMDAwCi0JCSAgICAgICB8fCBvcC0+b3Bjb2RlID09IDB4ZmFmMDAwMDAKLQkJICAgICAgIHx8IG9wLT5vcGNvZGUgPT0gMHhmYWY0MDAwMCkpCi0JICAgIHsKLQkgICAgICBleHRlbnNpb24gPSAwOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDQpCi0JICAgIHsKLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0KLQkgICAgICBpbnNuIHw9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0JICAgICAgZXh0ZW5zaW9uID0gMDsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA1ICYmIG9wLT5vcGNvZGUgPT0gMHhkYzAwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgJiAweGZmZmZmZjAwKSA+PiA4OwotCSAgICAgIGV4dGVuc2lvbiA9IHRlbXAgJiAweGZmOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDUpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAxLCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwxNiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZjAwMDBmZjsKLQkgICAgICBpbnNuIHw9IHRlbXAgPDwgODsKLQotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA0LCBidWZmZXIsIDEsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiA9ICoodW5zaWduZWQgY2hhciAqKWJ1ZmZlcjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA2KQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgbG9uZyB0ZW1wID0gMDsKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgMiwgYnVmZmVyLCA0LCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICB0ZW1wIHw9IGJmZF9nZXRsMzIgKGJ1ZmZlcik7Ci0KLQkgICAgICBpbnNuICY9IDB4ZmZmZjAwMDA7Ci0JICAgICAgaW5zbiB8PSAodGVtcCA+PiAxNikgJiAweGZmZmY7Ci0JICAgICAgZXh0ZW5zaW9uID0gdGVtcCAmIDB4ZmZmZjsKLQkgICAgfQotCSAgZWxzZSBpZiAoc2l6ZSA9PSA3ICYmIG9wLT5vcGNvZGUgPT0gMHhkZDAwMDAwMCkKLQkgICAgewotCSAgICAgIHVuc2lnbmVkIGxvbmcgdGVtcCA9IDA7Ci0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciArIDEsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0JICAgICAgaWYgKHN0YXR1cyAhPSAwKQotCQl7Ci0JCSAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0JCSAgcmV0dXJuOwotCQl9Ci0JICAgICAgdGVtcCB8PSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0JICAgICAgaW5zbiAmPSAweGZmMDAwMDAwOwotCSAgICAgIGluc24gfD0gKHRlbXAgPj4gOCkgJiAweGZmZmZmZjsKLQkgICAgICBleHRlbnNpb24gPSAodGVtcCAmIDB4ZmYpIDw8IDE2OwotCSAgICAgIAotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyA1LCBidWZmZXIsIDIsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIGV4dGVuc2lvbiB8PSBiZmRfZ2V0YjE2IChidWZmZXIpOwotCSAgICB9Ci0JICBlbHNlIGlmIChzaXplID09IDcpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHRlbXAgPSAwOwotCSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIgKyAyLCBidWZmZXIsIDQsIGluZm8pOwotCSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQkJewotCQkgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQkgIHJldHVybjsKLQkJfQotCSAgICAgIHRlbXAgfD0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLQotCSAgICAgIGluc24gJj0gMHhmZmZmMDAwMDsKLQkgICAgICBpbnNuIHw9ICh0ZW1wID4+IDE2KSAmIDB4ZmZmZjsKLQkgICAgICBleHRlbnNpb24gPSAodGVtcCAmIDB4ZmZmZikgPDwgODsKLQkgICAgICAKLQkgICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgNiwgYnVmZmVyLCAxLCBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzICE9IDApCi0JCXsKLQkJICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkJICByZXR1cm47Ci0JCX0KLQkgICAgICBleHRlbnNpb24gfD0gKih1bnNpZ25lZCBjaGFyICopYnVmZmVyOwotCSAgICB9Ci0KLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLQotCSAgLyogTm93IHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0JICBmb3IgKG9waW5kZXhfcHRyID0gb3AtPm9wZXJhbmRzLCBub2NvbW1hID0gMTsKLQkgICAgICAgKm9waW5kZXhfcHRyICE9IDA7Ci0JICAgICAgIG9waW5kZXhfcHRyKyspCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotCi0JICAgICAgb3BlcmFuZCA9ICZtbjEwMzAwX29wZXJhbmRzWypvcGluZGV4X3B0cl07Ci0KLQotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfU1BMSVQpICE9IDApCi0JCXsKLQkJICB1bnNpZ25lZCBsb25nIHRlbXA7Ci0JCSAgdmFsdWUgPSBpbnNuICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSk7Ci0JCSAgdmFsdWUgPDw9ICgzMiAtIG9wZXJhbmQtPmJpdHMpOwotCQkgIHRlbXAgPSBleHRlbnNpb24gPj4gb3BlcmFuZC0+c2hpZnQ7Ci0JCSAgdGVtcCAmPSAoKDEgPDwgKDMyIC0gb3BlcmFuZC0+Yml0cykpIC0gMSk7Ci0JCSAgdmFsdWUgfD0gdGVtcDsKLQkJfQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9FWFRFTkRFRCkgIT0gMCkKLQkJewotCQkgIHZhbHVlID0gKChleHRlbnNpb24gPj4gKG9wZXJhbmQtPnNoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0KSkKLQkJCSAgICYgKCgxIDw8IG9wZXJhbmQtPmJpdHMpIC0gMSkpOwotCQl9Ci0KLQkgICAgICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCkgIT0gMAotCQkgICkKLQkJdmFsdWUgPSAoKGxvbmcpKHZhbHVlIDw8ICgzMiAtIG9wZXJhbmQtPmJpdHMpKQotCQkJICA+PiAoMzIgLSBvcGVyYW5kLT5iaXRzKSk7Ci0KLQkgICAgICBpZiAoIW5vY29tbWEKLQkJICAmJiAoIXBhcmVuCi0JCSAgICAgIHx8ICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUEFSRU4pID09IDApKSkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0KLQkgICAgICBub2NvbW1hID0gMDsKLQkJCi0JICAgICAgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9EUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkJWQiLCB2YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9BUkVHKSAhPSAwKQotCQl7Ci0JCSAgdmFsdWUgPSAoKGluc24gPj4gKG9wZXJhbmQtPnNoaWZ0ICsgZXh0cmFfc2hpZnQpKQotCQkJICAgJiAoKDEgPDwgb3BlcmFuZC0+Yml0cykgLSAxKSk7Ci0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhJWQiLCB2YWx1ZSk7Ci0JCX0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9TUCkgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJzcCIpOwotCi0JICAgICAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgTU4xMDMwMF9PUEVSQU5EX1BTVykgIT0gMCkKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJwc3ciKTsKLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9NRFIpICE9IDApCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAibWRyIik7Ci0KLQotCSAgICAgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIE1OMTAzMDBfT1BFUkFORF9QQVJFTikgIT0gMCkKLQkJewotCQkgIGlmIChwYXJlbikKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JCSAgICAgIG5vY29tbWEgPSAxOwotCQkgICAgfQotCQkgIHBhcmVuID0gIXBhcmVuOwotCQl9Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUENSRUwpICE9IDApCi0JCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoKGxvbmcpIHZhbHVlICsgbWVtYWRkciwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfTUVNQUREUikgIT0gMCkKLQkJKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0KLQkgICAgICBlbHNlIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1QpICE9IDApCi0JCXsKLQkJICBpbnQgY29tbWEgPSAwOwotCi0JCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJbIik7Ci0JCSAgaWYgKHZhbHVlICYgMHg4MCkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkMiIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDQwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJkMyIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDIwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhMiIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDEwKQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJhMyIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICBpZiAodmFsdWUgJiAweDA4KQotCQkgICAgewotCQkgICAgICBpZiAoY29tbWEpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJvdGhlciIpOwotCQkgICAgICBjb21tYSA9IDE7Ci0JCSAgICB9Ci0KLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIl0iKTsKLQkJfQotCi0JICAgICAgZWxzZSAKLQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbHVlKTsKLQkgICAgfQotCSAgLyogQWxsIGRvbmUuICovCi0JICBicmVhazsKLQl9Ci0gICAgICBvcCsrOwotICAgIH0KLQotICBpZiAoIW1hdGNoKQotICAgIHsKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgXygidW5rbm93blx0MHglMDR4IiksIGluc24pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTEwMzAwLW9wYy5jIGIvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGMwZjMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMTAzMDAtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyogQXNzZW1ibGUgTWF0c3VzaGl0YSBNTjEwMzAwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogVGhpcyBmaWxlIGlzIGZvcm1hdHRlZCBhdCA+IDgwIGNvbHVtbnMuICBBdHRlbXB0aW5nIHRvIHJlYWQgaXQgb24gYQotICAgc2NyZWVlbiB3aXRoIGxlc3MgdGhhbiA4MCBjb2x1bW5zIHdpbGwgYmUgZGlmZmljdWx0LiAgKi8KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9tbjEwMzAwLmgiCi0KLQwKLWNvbnN0IHN0cnVjdCBtbjEwMzAwX29wZXJhbmQgbW4xMDMwMF9vcGVyYW5kc1tdID0gewotI2RlZmluZSBVTlVTRUQJMAotICB7MCwgMCwgMH0sIAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMCAgICAgIChVTlVTRUQrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG4gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgRE4xICAgICAgKEROMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0RSRUd9LAotCi0vKiBkbiByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEROMiAgICAgIChETjErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIGZpcnN0IHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTAgICAgICAoRE4yKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGRtIHJlZ2lzdGVyIGluIHRoZSBzZWNvbmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIERNMSAgICAgIChETTArMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogZG0gcmVnaXN0ZXIgaW4gdGhlIHRoaXJkIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBETTIgICAgICAoRE0xKzEpCi0gIHsyLCA0LCBNTjEwMzAwX09QRVJBTkRfRFJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSBmaXJzdCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4wICAgICAgKERNMisxKQotICB7MiwgMCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbiByZWdpc3RlciBpbiB0aGUgc2Vjb25kIHJlZ2lzdGVyIG9wZXJhbmQgcG9zaXRpb24uICAqLwotI2RlZmluZSBBTjEgICAgICAoQU4wKzEpCi0gIHsyLCAyLCBNTjEwMzAwX09QRVJBTkRfQVJFR30sCi0KLS8qIGFuIHJlZ2lzdGVyIGluIHRoZSB0aGlyZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU4yICAgICAgKEFOMSsxKQotICB7MiwgNCwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgZmlyc3QgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMCAgICAgIChBTjIrMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogYW0gcmVnaXN0ZXIgaW4gdGhlIHNlY29uZCByZWdpc3RlciBvcGVyYW5kIHBvc2l0aW9uLiAgKi8KLSNkZWZpbmUgQU0xICAgICAgKEFNMCsxKQotICB7MiwgMiwgTU4xMDMwMF9PUEVSQU5EX0FSRUd9LAotCi0vKiBhbSByZWdpc3RlciBpbiB0aGUgdGhpcmQgcmVnaXN0ZXIgb3BlcmFuZCBwb3NpdGlvbi4gICovCi0jZGVmaW5lIEFNMiAgICAgIChBTTErMSkKLSAgezIsIDQsIE1OMTAzMDBfT1BFUkFORF9BUkVHfSwKLQotLyogOCBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTggICAgKEFNMisxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgdW5zaWduZWQgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQKLSAgIHVuc2lnbmVkIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2ICAgIChJTU04KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgcGMtcmVsYXRpdmUgaW1tZWRpYXRlIHdoaWNoIG1heSBwcm9tb3RlIHRvIGEgMTZiaXQKLSAgIHBjLXJlbGF0aXZlIGltbWVkaWF0ZS4gICovCi0jZGVmaW5lIElNTTE2X1BDUkVMICAgIChJTU0xNisxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QQ1JFTCB8IE1OMTAzMDBfT1BFUkFORF9SRUxBWCB8IE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiAxNmJpdCB1bnNpZ25lZCBkaXNwYWNlbWVudCBpbiBhIG1lbW9yeSBvcGVyYXRpb24gd2hpY2gKLSAgIG1heSBwcm9tb3RlIHRvIGEgMzJiaXQgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgSU1NMTZfTUVNICAgIChJTU0xNl9QQ1JFTCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMTYgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgMTZiaXRzIGluIHRoZSBleHRlbnNpb24gd29yZC4gCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMiAgICAoSU1NMTZfTUVNKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUfSwKLQotLyogMzJiaXQgcGMtcmVsYXRpdmUgb2Zmc2V0LiAgKi8KLSNkZWZpbmUgSU1NMzJfUENSRUwgICAgKElNTTMyKzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMfSwKLQotLyogMzJiaXQgbWVtb3J5IG9mZnNldC4gICovCi0jZGVmaW5lIElNTTMyX01FTSAgICAoSU1NMzJfUENSRUwrMSkKLSAgezE2LCAwLCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfTUVNQUREUn0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAxNiBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCAxNmJpdHMgaW4gdGhlIGV4dGVuc2lvbiB3b3JkLCBsb3cgMTZiaXRzIGFyZSBsZWZ0Ci0gICBzaGlmdGVkIDggcGxhY2VzLiAKLQotICAgVGhlICJiaXRzIiBmaWVsZCBpbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgaW4gdGhlCi0gICBtYWluIGluc3RydWN0aW9uIHdvcmQgZm9yIE1OMTAzMDBfT1BFUkFORF9TUExJVCEgICovCi0jZGVmaW5lIElNTTMyX0xPV1NISUZUOCAgICAoSU1NMzJfTUVNKzEpCi0gIHsxNiwgOCwgTU4xMDMwMF9PUEVSQU5EX1NQTElUIHwgTU4xMDMwMF9PUEVSQU5EX01FTUFERFJ9LAotCi0vKiAzMmJpdCBpbW1lZGlhdGUsIGhpZ2ggMjQgYml0cyBpbiB0aGUgbWFpbiBpbnN0cnVjdGlvbgotICAgd29yZCwgOCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuCi0KLSAgIFRoZSAiYml0cyIgZmllbGQgaW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIGluIHRoZQotICAgbWFpbiBpbnN0cnVjdGlvbiB3b3JkIGZvciBNTjEwMzAwX09QRVJBTkRfU1BMSVQhICAqLwotI2RlZmluZSBJTU0zMl9ISUdIMjQgICAgKElNTTMyX0xPV1NISUZUOCsxKQotICB7MjQsIDAsIE1OMTAzMDBfT1BFUkFORF9TUExJVCB8IE1OMTAzMDBfT1BFUkFORF9QQ1JFTH0sCi0KLS8qIDMyYml0IGltbWVkaWF0ZSwgaGlnaCAyNCBiaXRzIGluIHRoZSBtYWluIGluc3RydWN0aW9uCi0gICB3b3JkLCA4IGluIHRoZSBleHRlbnNpb24gd29yZCwgbG93IDggYml0cyBhcmUgbGVmdAotICAgc2hpZnRlZCAxNiBwbGFjZXMuIAotCi0gICBUaGUgImJpdHMiIGZpZWxkIGluZGljYXRlcyBob3cgbWFueSBiaXRzIGFyZSBpbiB0aGUKLSAgIG1haW4gaW5zdHJ1Y3Rpb24gd29yZCBmb3IgTU4xMDMwMF9PUEVSQU5EX1NQTElUISAgKi8KLSNkZWZpbmUgSU1NMzJfSElHSDI0X0xPV1NISUZUMTYgICAgKElNTTMyX0hJR0gyNCsxKQotICB7MjQsIDE2LCBNTjEwMzAwX09QRVJBTkRfU1BMSVQgfCBNTjEwMzAwX09QRVJBTkRfUENSRUx9LAotCi0vKiBTdGFjayBwb2ludGVyLiAgKi8KLSNkZWZpbmUgU1AgICAgKElNTTMyX0hJR0gyNF9MT1dTSElGVDE2KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU1B9LAotCi0vKiBQcm9jZXNzb3Igc3RhdHVzIHdvcmQuICAqLwotI2RlZmluZSBQU1cgICAgKFNQKzEpCi0gIHswLCAwLCBNTjEwMzAwX09QRVJBTkRfUFNXfSwKLQotLyogTURSIHJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgTURSICAgIChQU1crMSkKLSAgezAsIDAsIE1OMTAzMDBfT1BFUkFORF9NRFJ9LAotCi0vKiBJbmRleCByZWdpc3Rlci4gICovCi0jZGVmaW5lIERJIChNRFIrMSkKLSAgezIsIDIsIE1OMTAzMDBfT1BFUkFORF9EUkVHfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCwgbWF5IHByb21vdGUgdG8gMTZiaXQgc2lnbmVkIGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0Q4ICAgIChESSsxKQotICB7OCwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogMTYgYml0IHNpZ25lZCBkaXNwbGFjZW1lbnQsIG1heSBwcm9tb3RlIHRvIDMyYml0IGRpc3BhY2VtZW50LiAgKi8KLSNkZWZpbmUgU0QxNiAgICAoU0Q4KzEpCi0gIHsxNiwgMCwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRCB8IE1OMTAzMDBfT1BFUkFORF9QUk9NT1RFfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCB0aGF0IGNhbiBub3QgcHJvbW90ZS4gICovCi0jZGVmaW5lIFNEOE4gICAgKFNEMTYrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUR9LAotCi0vKiA4IGJpdCBwYy1yZWxhdGl2ZSBkaXNwbGFjZW1lbnQuICAqLwotI2RlZmluZSBTRDhOX1BDUkVMICAgIChTRDhOKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYfSwKLQotLyogOCBiaXQgc2lnbmVkIGRpc3BsYWNlbWVudCBzaGlmdGVkIGxlZnQgOCBiaXRzIGluIHRoZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNEOE5fU0hJRlQ4ICAgIChTRDhOX1BDUkVMKzEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEfSwKLQotLyogOCBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAxNmJpdCBzaWduZWQgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTggICAgKFNEOE5fU0hJRlQ4KzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfU0lHTkVEIHwgTU4xMDMwMF9PUEVSQU5EX1BST01PVEV9LAotCi0vKiAxNiBiaXQgc2lnbmVkIGltbWVkaWF0ZSB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCAgaW1tZWRpYXRlLiAgKi8KLSNkZWZpbmUgU0lNTTE2ICAgIChTSU1NOCsxKQotICB7MTYsIDAsIE1OMTAzMDBfT1BFUkFORF9TSUdORUQgfCBNTjEwMzAwX09QRVJBTkRfUFJPTU9URX0sCi0KLS8qIEVpdGhlciBhbiBvcGVuIHBhcmVuIG9yIGNsb3NlIHBhcmVuLiAgKi8KLSNkZWZpbmUgUEFSRU4JKFNJTU0xNisxKQotICB7MCwgMCwgTU4xMDMwMF9PUEVSQU5EX1BBUkVOfSwgCi0KLS8qIGRuIHJlZ2lzdGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgZmlyc3QgYW5kIHNlY29uZCByZWdpc3RlciBwb3NpdGlvbnMuICAqLwotI2RlZmluZSBETjAxICAgICAoUEFSRU4rMSkKLSAgezIsIDAsIE1OMTAzMDBfT1BFUkFORF9EUkVHIHwgTU4xMDMwMF9PUEVSQU5EX1JFUEVBVEVEfSwKLQotLyogYW4gcmVnaXN0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHJlZ2lzdGVyIHBvc2l0aW9ucy4gICovCi0jZGVmaW5lIEFOMDEgICAgIChETjAxKzEpCi0gIHsyLCAwLCBNTjEwMzAwX09QRVJBTkRfQVJFRyB8IE1OMTAzMDBfT1BFUkFORF9SRVBFQVRFRH0sCi0KLS8qIDE2Yml0IHBjLXJlbGF0aXZlIGRpc3BsYWNlbWVudCB3aGljaCBtYXkgcHJvbW90ZSB0byAzMmJpdCBwYy1yZWxhdGl2ZQotICAgZGlzcGxhY2VtZW50LiAgKi8KLSNkZWZpbmUgRDE2X1NISUZUIChBTjAxKzEpCi0gIHsxNiwgOCwgTU4xMDMwMF9PUEVSQU5EX1BDUkVMIHwgTU4xMDMwMF9PUEVSQU5EX1JFTEFYIHwgTU4xMDMwMF9PUEVSQU5EX1NJR05FRH0sCi0KLS8qIDggYml0IGltbWVkaWF0ZSBmb3VuZCBpbiB0aGUgZXh0ZW5zaW9uIHdvcmQuICAqLwotI2RlZmluZSBJTU04RSAgICAoRDE2X1NISUZUKzEpCi0gIHs4LCAwLCBNTjEwMzAwX09QRVJBTkRfRVhURU5ERUR9LAotCi0vKiBSZWdpc3RlciBsaXN0IGZvdW5kIGluIHRoZSBleHRlbnNpb24gd29yZCBzaGlmdGVkIDggYml0cyBsZWZ0LiAgKi8KLSNkZWZpbmUgUkVHU0VfU0hJRlQ4ICAgIChJTU04RSsxKQotICB7OCwgOCwgTU4xMDMwMF9PUEVSQU5EX0VYVEVOREVEIHwgTU4xMDMwMF9PUEVSQU5EX1JFR19MSVNUfSwKLQotLyogUmVnaXN0ZXIgbGlzdCBzaGlmdGVkIDggYml0cyBsZWZ0LiAgKi8KLSNkZWZpbmUgUkVHU19TSElGVDggKFJFR1NFX1NISUZUOCArIDEpCi0gIHs4LCA4LCBNTjEwMzAwX09QRVJBTkRfUkVHX0xJU1R9LAotCi0vKiBSZWlnc3RlciBsaXN0LiAgKi8KLSNkZWZpbmUgUkVHUyAgICAoUkVHU19TSElGVDgrMSkKLSAgezgsIDAsIE1OMTAzMDBfT1BFUkFORF9SRUdfTElTVH0sCi0KLQotfSA7IAotCi0jZGVmaW5lIE1FTShBRERSKSBQQVJFTiwgQUREUiwgUEFSRU4gCi0jZGVmaW5lIE1FTUlOQyhBRERSKSBQQVJFTiwgQUREUiwgUExVUywgUEFSRU4gCi0jZGVmaW5lIE1FTUlOQzIoQUREUixJTkMpIFBBUkVOLCBBRERSLCBQTFVTLCBJTkMsIFBBUkVOIAotI2RlZmluZSBNRU0yKEFERFIxLEFERFIyKSBQQVJFTiwgQUREUjEsIEFERFIyLCBQQVJFTiAKLQwKLS8qIFRoZSBvcGNvZGUgdGFibGUuCi0KLSAgIFRoZSBmb3JtYXQgb2YgdGhlIG9wY29kZSB0YWJsZSBpczoKLQotICAgTkFNRQkJT1BDT0RFCQlNQVNLCU1BVENIX01BU0ssIEZPUk1BVCwgUFJPQ0VTU09SCXsgT1BFUkFORFMgfQotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuICAqLwotCi1jb25zdCBzdHJ1Y3QgbW4xMDMwMF9vcGNvZGUgbW4xMDMwMF9vcGNvZGVzW10gPSB7Ci17ICJtb3YiLAkweDgwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NJTU04LCBETjAxfX0sCi17ICJtb3YiLAkweDgwLAkgICAgIDB4ZjAsCSAgMHgzLCAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgIm1vdiIsCTB4ZjFlMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjFkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgIm1vdiIsCTB4OTAwMCwJICAgICAweGYwMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7SU1NOCwgQU4wMX19LAoteyAibW92IiwJMHg5MCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0FNMSwgQU4wfX0sCi17ICJtb3YiLAkweDNjLAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7U1AsIEFOMH19LAoteyAibW92IiwJMHhmMmYwLAkgICAgIDB4ZmZmMywJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIFNQfX0sCi17ICJtb3YiLAkweGYyZTQsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe1BTVywgRE4wfX0sCi17ICJtb3YiLAkweGYyZjMsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgUFNXfX0sCi17ICJtb3YiLAkweGYyZTAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe01EUiwgRE4wfX0sCi17ICJtb3YiLAkweGYyZjIsCSAgICAgMHhmZmYzLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTURSfX0sCi17ICJtb3YiLAkweDcwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92IiwJMHg1ODAwLAkgICAgIDB4ZmNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0oU1ApLCBETjB9fSwKLXsgIm1vdiIsCTB4MzAwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7TUVNKElNTTE2X01FTSksIEROMH19LAoteyAibW92IiwJMHhmMDAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0oQU0wKSwgQU4xfX0sCi17ICJtb3YiLAkweDVjMDAsCSAgICAgMHhmY2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIEFOMH19LAoteyAibW92IiwJMHhmYWEwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweDYwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAibW92IiwJMHg0MjAwLAkgICAgIDB4ZjNmZiwJICAwLCAgICBGTVRfUzEsIDAsCXtETTEsIE1FTShTUCl9fSwKLXsgIm1vdiIsCTB4MDEwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92IiwJMHhmMDEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIE1FTShBTjApfX0sCi17ICJtb3YiLAkweDQzMDAsCSAgICAgMHhmM2ZmLAkgIDAsICAgIEZNVF9TMSwgMCwJe0FNMSwgTUVNKFNQKX19LAoteyAibW92IiwJMHhmYTgwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtBTTEsIE1FTShJTU0xNl9NRU0pfX0sCi17ICJtb3YiLAkweDVjMDAsCSAgICAgMHhmYzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjgwMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7TUVNMihTRDgsIEFNMCksIEROMX19LAoteyAibW92IiwJMHhmYTAwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92IiwJMHg1ODAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtNRU0yKElNTTgsIFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweGZhYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe01FTTIoSU1NMTYsIFNQKSwgRE4wfX0sCi17ICJtb3YiLAkweGYzMDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92IiwJMHhmODIwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCxBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4ZmEyMDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBBTjF9fSwKLXsgIm1vdiIsCTB4ZmFiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZjM4MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNMihESSwgQU0wKSwgQU4yfX0sCi17ICJtb3YiLAkweDQzMDAsCSAgICAgMHhmMzAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0FNMSwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdiIsCTB4ZjgxMDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92IiwJMHhmYTEwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoU0QxNiwgQU4wKX19LAoteyAibW92IiwJMHg0MjAwLAkgICAgIDB4ZjMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtETTEsIE1FTTIoSU1NOCwgU1ApfX0sCi17ICJtb3YiLAkweGZhOTEwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3YiLAkweGYzNDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoteyAibW92IiwJMHhmODMwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtBTTEsIE1FTTIoU0Q4LCBBTjApfX0sCi17ICJtb3YiLAkweGZhMzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0FNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3YiLAkweGZhOTAwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0FNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3YiLAkweGYzYzAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMiwgTUVNMihESSwgQU4wKX19LAotCi0vKiBUaGVzZSBtdXN0IGNvbWUgYWZ0ZXIgbW9zdCBvZiB0aGUgb3RoZXIgbW92ZSBpbnN0cnVjdGlvbnMgdG8gYXZvaWQgbWF0Y2hpbmcKLSAgIGEgc3ltYm9saWMgbmFtZSB3aXRoIElNTXh4IG9wZXJhbmRzLiAgVWdoLiAgKi8KLXsgIm1vdiIsCTB4MmMwMDAwLCAgICAweGZjMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7U0lNTTE2LCBETjB9fSwKLXsgIm1vdiIsCTB4ZmNjYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAibW92IiwJMHgyNDAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtJTU0xNiwgQU4wfX0sCi17ICJtb3YiLAkweGZjZGMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKLXsgIm1vdiIsCTB4ZmNhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92IiwJMHhmY2EwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgQU4wfX0sCi17ICJtb3YiLAkweGZjODEwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLXsgIm1vdiIsCTB4ZmM4MDAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7QU0xLCBNRU0oSU1NMzJfTUVNKX19LAoteyAibW92IiwJMHhmYzAwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92IiwJMHhmY2I0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEROMH19LAoteyAibW92IiwJMHhmYzIwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEFOMX19LAoteyAibW92IiwJMHhmY2IwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLCBTUCksIEFOMH19LAoteyAibW92IiwJMHhmYzEwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsQU4wKX19LAoteyAibW92IiwJMHhmYzkxMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92IiwJMHhmYzMwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtBTTEsIE1FTTIoSU1NMzIsQU4wKX19LAoteyAibW92IiwJMHhmYzkwMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtBTTEsIE1FTTIoSU1NMzIsIFNQKX19LAotLyogVGhlc2Ugbm9uLXByb21vdGluZyB2YXJpYW50cyBuZWVkIHRvIGNvbWUgYWZ0ZXIgYWxsIHRoZSBvdGhlciBtZW1vcnkKLSAgIG1vdmVzLiAgKi8KLXsgIm1vdiIsCTB4ZjhmMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7TUVNMihTRDhOLCBBTTApLCBTUH19LAoteyAibW92IiwJMHhmOGY0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTUCwgTUVNMihTRDhOLCBBTjApfX0sCi0KLQotCi17ICJtb3ZidSIsCTB4ZjA0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7TUVNKEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGY4NDAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoU0Q4LCBBTTApLCBETjF9fSwKLXsgIm1vdmJ1IiwJMHhmYTQwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKFNEMTYsIEFNMCksIEROMX19LAoteyAibW92YnUiLAkweGY4YjgwMCwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTShTUCksIEROMH19LAoteyAibW92YnUiLAkweGY4YjgwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe01FTTIoSU1NOCwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmYWI4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtNRU0yKElNTTE2LCBTUCksIEROMH19LAoteyAibW92YnUiLAkweGY0MDAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTTIoREksIEFNMCksIEROMn19LAoteyAibW92YnUiLAkweDM0MDAwMCwgICAgMHhmYzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe01FTShJTU0xNl9NRU0pLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmMDUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIE1FTShBTjApfX0sCi17ICJtb3ZidSIsCTB4Zjg1MDAwLCAgICAweGZmZjAwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKFNEOCwgQU4wKX19LAoteyAibW92YnUiLAkweGZhNTAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihTRDE2LCBBTjApfX0sCi17ICJtb3ZidSIsCTB4Zjg5MjAwLCAgICAweGZmZjNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0oU1ApfX0sCi17ICJtb3ZidSIsCTB4Zjg5MjAwLCAgICAweGZmZjMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE0xLCBNRU0yKElNTTgsIFNQKX19LAoteyAibW92YnUiLAkweGZhOTIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0RNMSwgTUVNMihJTU0xNiwgU1ApfX0sCi17ICJtb3ZidSIsCTB4ZjQ0MCwJICAgICAweGZmYzAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0yLCBNRU0yKERJLCBBTjApfX0sCi17ICJtb3ZidSIsCTB4MDIwMDAwLCAgICAweGYzMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7RE0xLCBNRU0oSU1NMTZfTUVNKX19LAoteyAibW92YnUiLAkweGZjNDAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsQU0wKSwgRE4xfX0sCi17ICJtb3ZidSIsCTB4ZmNiODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNMihJTU0zMiwgU1ApLCBETjB9fSwKLXsgIm1vdmJ1IiwJMHhmY2E4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0oSU1NMzJfTUVNKSwgRE4wfX0sCi17ICJtb3ZidSIsCTB4ZmM1MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLEFOMCl9fSwKLXsgIm1vdmJ1IiwJMHhmYzkyMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTTIoSU1NMzIsIFNQKX19LAoteyAibW92YnUiLAkweGZjODIwMDAwLCAgMHhmZmYzMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNKElNTTMyX01FTSl9fSwKLQoteyAibW92aHUiLAkweGYwNjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe01FTShBTTApLCBETjF9fSwKLXsgIm1vdmh1IiwJMHhmODYwMDAsICAgIDB4ZmZmMDAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKFNEOCwgQU0wKSwgRE4xfX0sCi17ICJtb3ZodSIsCTB4ZmE2MDAwMDAsICAweGZmZjAwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihTRDE2LCBBTTApLCBETjF9fSwKLXsgIm1vdmh1IiwJMHhmOGJjMDAsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0oU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmOGJjMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtNRU0yKElNTTgsIFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZmFiYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7TUVNMihJTU0xNiwgU1ApLCBETjB9fSwKLXsgIm1vdmh1IiwJMHhmNDgwLAkgICAgIDB4ZmZjMCwJICAwLCAgICBGTVRfRDAsIDAsCXtNRU0yKERJLCBBTTApLCBETjJ9fSwKLXsgIm1vdmh1IiwJMHgzODAwMDAsICAgIDB4ZmMwMDAwLCAgICAwLCAgICBGTVRfUzIsIDAsCXtNRU0oSU1NMTZfTUVNKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZjA3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAibW92aHUiLAkweGY4NzAwMCwgICAgMHhmZmYwMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihTRDgsIEFOMCl9fSwKLXsgIm1vdmh1IiwJMHhmYTcwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoU0QxNiwgQU4wKX19LAoteyAibW92aHUiLAkweGY4OTMwMCwgICAgMHhmZmYzZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNKFNQKX19LAoteyAibW92aHUiLAkweGY4OTMwMCwgICAgMHhmZmYzMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0RNMSwgTUVNMihJTU04LCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmYTkzMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtETTEsIE1FTTIoSU1NMTYsIFNQKX19LAoteyAibW92aHUiLAkweGY0YzAsCSAgICAgMHhmZmMwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMiwgTUVNMihESSwgQU4wKX19LAoteyAibW92aHUiLAkweDAzMDAwMCwgICAgMHhmMzAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0RNMSwgTUVNKElNTTE2X01FTSl9fSwKLXsgIm1vdmh1IiwJMHhmYzYwMDAwMCwgIDB4ZmZmMDAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtNRU0yKElNTTMyLEFNMCksIEROMX19LAoteyAibW92aHUiLAkweGZjYmMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe01FTTIoSU1NMzIsIFNQKSwgRE4wfX0sCi17ICJtb3ZodSIsCTB4ZmNhYzAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7TUVNKElNTTMyX01FTSksIEROMH19LAoteyAibW92aHUiLAkweGZjNzAwMDAwLCAgMHhmZmYwMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0RNMSwgTUVNMihJTU0zMixBTjApfX0sCi17ICJtb3ZodSIsCTB4ZmM5MzAwMDAsICAweGZmZjMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7RE0xLCBNRU0yKElNTTMyLCBTUCl9fSwKLXsgIm1vdmh1IiwJMHhmYzgzMDAwMCwgIDB4ZmZmMzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtETTEsIE1FTShJTU0zMl9NRU0pfX0sCi0KLXsgImV4dCIsCTB4ZjJkMCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi0KLXsgImV4dGIiLAkweDEwLCAJICAgICAweGZjLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMH19LAotCi17ICJleHRidSIsCTB4MTQsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLQoteyAiZXh0aCIsCTB4MTgsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtETjB9fSwKLQoteyAiZXh0aHUiLAkweDFjLAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi0KLXsgIm1vdm0iLAkweGNlMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe01FTShTUCksIFJFR1N9fSwKLXsgIm1vdm0iLAkweGNmMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1JFR1MsIE1FTShTUCl9fSwKLQoteyAiY2xyIiwJMHgwMCwJICAgICAweGYzLAkgIDAsICAgIEZNVF9TMCwgMCwJe0ROMX19LAotCi17ICJhZGQiLAkweGUwLAkgICAgIDB4ZjAsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFkZCIsCTB4ZjE2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBBTjB9fSwKLXsgImFkZCIsCTB4ZjE1MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBETjB9fSwKLXsgImFkZCIsCTB4ZjE3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7QU0xLCBBTjB9fSwKLXsgImFkZCIsCTB4MjgwMCwJICAgICAweGZjMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0lNTTgsIEROMH19LAoteyAiYWRkIiwJMHhmYWMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAiYWRkIiwJMHgyMDAwLAkgICAgIDB4ZmMwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgQU4wfX0sCi17ICJhZGQiLAkweGZhZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe1NJTU0xNiwgQU4wfX0sCi17ICJhZGQiLAkweGY4ZmUwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBTUH19LAoteyAiYWRkIiwJMHhmYWZlMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIFNQfX0sCi17ICJhZGQiLAkweGZjYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImFkZCIsCTB4ZmNkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAoteyAiYWRkIiwJMHhmY2ZlMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgU1B9fSwKLQoteyAiYWRkYyIsCTB4ZjE0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLQoteyAic3ViIiwJMHhmMTAwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAic3ViIiwJMHhmMTIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEFOMH19LAoteyAic3ViIiwJMHhmMTEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEROMH19LAoteyAic3ViIiwJMHhmMTMwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtBTTEsIEFOMH19LAoteyAic3ViIiwJMHhmY2M0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJzdWIiLAkweGZjZDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBBTjB9fSwKLQoteyAic3ViYyIsCTB4ZjE4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLQoteyAibXVsIiwJMHhmMjQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAotCi17ICJtdWx1IiwJMHhmMjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAotCi17ICJkaXYiLAkweGYyNjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi0KLXsgImRpdnUiLAkweGYyNzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi0KLXsgImluYyIsCTB4NDAsCSAgICAgMHhmMywJICAwLCAgICBGTVRfUzAsIDAsCXtETjF9fSwKLXsgImluYyIsCTB4NDEsCSAgICAgMHhmMywJICAwLCAgICBGTVRfUzAsIDAsCXtBTjF9fSwKLQoteyAiaW5jNCIsCTB4NTAsCSAgICAgMHhmYywJICAwLCAgICBGTVRfUzAsIDAsCXtBTjB9fSwKLQoteyAiY21wIiwJMHhhMDAwLAkgICAgIDB4ZjAwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTSU1NOCwgRE4wMX19LAoteyAiY21wIiwJMHhhMCwJICAgICAweGYwLAkgIDB4MywgIEZNVF9TMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJjbXAiLAkweGYxYTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgQU4wfX0sCi17ICJjbXAiLAkweGYxOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0FNMSwgRE4wfX0sCi17ICJjbXAiLAkweGIwMDAsCSAgICAgMHhmMDAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe0lNTTgsIEFOMDF9fSwKLXsgImNtcCIsCTB4YjAsCSAgICAgMHhmMCwJICAweDMsICBGTVRfUzAsIDAsCXtBTTEsIEFOMH19LAoteyAiY21wIiwJMHhmYWM4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtTSU1NMTYsIEROMH19LAoteyAiY21wIiwJMHhmYWQ4MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgQU4wfX0sCi17ICJjbXAiLAkweGZjYzgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImNtcCIsCTB4ZmNkODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEFOMH19LAotCi17ICJhbmQiLAkweGYyMDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJhbmQiLAkweGY4ZTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAiYW5kIiwJMHhmYWUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJhbmQiLAkweGZhZmMwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBQU1d9fSwKLXsgImFuZCIsCTB4ZmNlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAotCi17ICJvciIsCQkweGYyMTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJvciIsCQkweGY4ZTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAib3IiLAkJMHhmYWU0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNiwgRE4wfX0sCi17ICJvciIsCQkweGZhZmQwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBQU1d9fSwKLXsgIm9yIiwJCTB4ZmNlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAotCi17ICJ4b3IiLAkweGYyMjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ4b3IiLAkweGZhZTgwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgInhvciIsCTB4ZmNlODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAotCi17ICJub3QiLAkweGYyMzAsCSAgICAgMHhmZmZjLAkgIDAsICAgIEZNVF9EMCwgMCwJe0ROMH19LAotCi17ICJidHN0IiwJMHhmOGVjMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImJ0c3QiLAkweGZhZWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwJe0lNTTE2LCBETjB9fSwKLXsgImJ0c3QiLAkweGZjZWMwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgImJ0c3QiLAkweGZlMDIwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoteyAiYnRzdCIsCTB4ZmFmODAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAJe0lNTTgsIE1FTTIoU0Q4Tl9TSElGVDgsIEFOMCl9fSwKLQoteyAiYnNldCIsCTB4ZjA4MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBNRU0oQU4wKX19LAoteyAiYnNldCIsCTB4ZmUwMDAwMDAsICAweGZmZmYwMDAwLCAgMCwgICAgRk1UX0Q1LCAwLAl7SU1NOEUsIE1FTShJTU0zMl9MT1dTSElGVDgpfX0sCi17ICJic2V0IiwJMHhmYWYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU04LCBNRU0yKFNEOE5fU0hJRlQ4LCBBTjApfX0sCi0KLXsgImJjbHIiLAkweGYwOTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgTUVNKEFOMCl9fSwKLXsgImJjbHIiLAkweGZlMDEwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENSwgMCwJe0lNTThFLCBNRU0oSU1NMzJfTE9XU0hJRlQ4KX19LAoteyAiYmNsciIsCTB4ZmFmNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLAl7SU1NOCwgTUVNMihTRDhOX1NISUZUOCxBTjApfX0sCi0KLXsgImFzciIsCTB4ZjJiMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgImFzciIsCTB4ZjhjODAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJhc3IiLAkweGY4YzgwMSwgICAgMHhmZmZjZmYsICAgIDAsICAgIEZNVF9EMSwgMCwJe0ROMH19LAotCi17ICJsc3IiLAkweGYyYTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJsc3IiLAkweGY4YzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAibHNyIiwJMHhmOGM0MDEsICAgIDB4ZmZmY2ZmLCAgICAwLCAgICBGTVRfRDEsIDAsCXtETjB9fSwKLQoteyAiYXNsIiwJMHhmMjkwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAiYXNsIiwJMHhmOGMwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgImFzbCIsCTB4ZjhjMDAxLCAgICAweGZmZmNmZiwgICAgMCwgICAgRk1UX0QxLCAwLAl7RE4wfX0sCi0KLXsgImFzbDIiLAkweDU0LAkgICAgIDB4ZmMsCSAgMCwgICAgRk1UX1MwLCAwLAl7RE4wfX0sCi0KLXsgInJvciIsCTB4ZjI4NCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi0KLXsgInJvbCIsCTB4ZjI4MCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE4wfX0sCi0KLXsgImJlcSIsCTB4YzgwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5lIiwJMHhjOTAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJiZ3QiLAkweGMxMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJnZSIsCTB4YzIwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmxlIiwJMHhjMzAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibHQiLAkweGMwMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJoaSIsCTB4YzUwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYmNjIiwJMHhjNjAwLAkgICAgIDB4ZmYwMCwJICAwLCAgICBGTVRfUzEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJibHMiLAkweGM3MDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJjcyIsCTB4YzQwMCwJICAgICAweGZmMDAsCSAgMCwgICAgRk1UX1MxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYnZjIiwJMHhmOGU4MDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJidnMiLAkweGY4ZTkwMCwgICAgMHhmZmZmMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NEOE5fUENSRUx9fSwKLXsgImJuYyIsCTB4ZjhlYTAwLCAgICAweGZmZmYwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0Q4Tl9QQ1JFTH19LAoteyAiYm5zIiwJMHhmOGViMDAsICAgIDB4ZmZmZjAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTRDhOX1BDUkVMfX0sCi17ICJicmEiLAkweGNhMDAsCSAgICAgMHhmZjAwLAkgIDAsICAgIEZNVF9TMSwgMCwJe1NEOE5fUENSRUx9fSwKLQoteyAibGVxIiwJMHhkOCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibG5lIiwJMHhkOSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGd0IiwJMHhkMSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGdlIiwJMHhkMiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGxlIiwJMHhkMywJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGx0IiwJMHhkMCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGhpIiwJMHhkNSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGNjIiwJMHhkNiwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGxzIiwJMHhkNywJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibGNzIiwJMHhkNCwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAibHJhIiwJMHhkYSwJICAgICAweGZmLAkgIDAsICAgIEZNVF9TMCwgMCwJe1VOVVNFRH19LAoteyAic2V0bGIiLAkweGRiLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLXsgImptcCIsCTB4ZjBmNCwJICAgICAweGZmZmMsCSAgMCwgICAgRk1UX0QwLCAwLAl7UEFSRU4sQU4wLFBBUkVOfX0sCi17ICJqbXAiLAkweGNjMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe0lNTTE2X1BDUkVMfX0sCi17ICJqbXAiLAkweGRjMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNCwgMCwJe0lNTTMyX0hJR0gyNH19LAoteyAiY2FsbCIsCTB4Y2QwMDAwMDAsICAweGZmMDAwMDAwLCAgMCwgICAgRk1UX1M0LCAwLAl7RDE2X1NISUZULFJFR1MsSU1NOEV9fSwKLXsgImNhbGwiLAkweGRkMDAwMDAwLCAgMHhmZjAwMDAwMCwgIDAsICAgIEZNVF9TNiwgMCwJe0lNTTMyX0hJR0gyNF9MT1dTSElGVDE2LCBSRUdTRV9TSElGVDgsSU1NOEV9fSwKLXsgImNhbGxzIiwJMHhmMGYwLAkgICAgIDB4ZmZmYywJICAwLCAgICBGTVRfRDAsIDAsCXtQQVJFTixBTjAsUEFSRU59fSwKLXsgImNhbGxzIiwJMHhmYWZmMDAwMCwgIDB4ZmZmZjAwMDAsICAwLCAgICBGTVRfRDIsIDAsCXtJTU0xNl9QQ1JFTH19LAoteyAiY2FsbHMiLAkweGZjZmYwMDAwLCAgMHhmZmZmMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyX1BDUkVMfX0sCi0KLXsgInJldCIsCTB4ZGYwMDAwLCAgICAweGZmMDAwMCwgICAgMCwgICAgRk1UX1MyLCAwLAl7UkVHU19TSElGVDgsIElNTTh9fSwKLXsgInJldGYiLAkweGRlMDAwMCwgICAgMHhmZjAwMDAsICAgIDAsICAgIEZNVF9TMiwgMCwJe1JFR1NfU0hJRlQ4LCBJTU04fX0sCi17ICJyZXRzIiwJMHhmMGZjLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInJ0aSIsCTB4ZjBmZCwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJ0cmFwIiwJMHhmMGZlLAkgICAgIDB4ZmZmZiwJICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLXsgInJ0bSIsCTB4ZjBmZiwJICAgICAweGZmZmYsCSAgMCwgICAgRk1UX0QwLCAwLAl7VU5VU0VEfX0sCi17ICJub3AiLAkweGNiLAkgICAgIDB4ZmYsCSAgMCwgICAgRk1UX1MwLCAwLAl7VU5VU0VEfX0sCi0KLS8qIFVERiBpbnN0cnVjdGlvbnMuICAqLwoteyAidWRmMDAiLAkweGY2MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMCIsCTB4ZjkwMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDAiLAkweGZiMDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAwIiwJMHhmZDAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZjYxMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjAxIiwJMHhmOTEwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwMSIsCTB4ZmIxMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDEiLAkweGZkMTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjAyIiwJMHhmNjIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDIiLAkweGY5MjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjAyIiwJMHhmYjIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwMiIsCTB4ZmQyMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDMiLAkweGY2MzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwMyIsCTB4ZjkzMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDMiLAkweGZiMzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjAzIiwJMHhmZDMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZjY0MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA0IiwJMHhmOTQwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNCIsCTB4ZmI0MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDQiLAkweGZkNDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA1IiwJMHhmNjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDUiLAkweGY5NTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA1IiwJMHhmYjUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwNSIsCTB4ZmQ1MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDYiLAkweGY2NjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwNiIsCTB4Zjk2MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDYiLAkweGZiNjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA2IiwJMHhmZDYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZjY3MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjA3IiwJMHhmOTcwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYwNyIsCTB4ZmI3MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMDciLAkweGZkNzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjA4IiwJMHhmNjgwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMDgiLAkweGY5ODAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjA4IiwJMHhmYjgwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYwOCIsCTB4ZmQ4MDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMDkiLAkweGY2OTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYwOSIsCTB4Zjk5MDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMDkiLAkweGZiOTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjA5IiwJMHhmZDkwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZjZhMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEwIiwJMHhmOWEwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMCIsCTB4ZmJhMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTAiLAkweGZkYTAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjExIiwJMHhmNmIwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTEiLAkweGY5YjAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjExIiwJMHhmYmIwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxMSIsCTB4ZmRiMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTIiLAkweGY2YzAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxMiIsCTB4ZjljMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTIiLAkweGZiYzAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjEyIiwJMHhmZGMwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZjZkMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjEzIiwJMHhmOWQwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtTSU1NOCwgRE4wfX0sCi17ICJ1ZGYxMyIsCTB4ZmJkMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtTSU1NMTYsIEROMH19LAoteyAidWRmMTMiLAkweGZkZDAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZjE0IiwJMHhmNmUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMTQiLAkweGY5ZTAwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe1NJTU04LCBETjB9fSwKLXsgInVkZjE0IiwJMHhmYmUwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge1NJTU0xNiwgRE4wfX0sCi17ICJ1ZGYxNCIsCTB4ZmRlMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmMTUiLAkweGY2ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYxNSIsCTB4ZjlmMDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7U0lNTTgsIEROMH19LAoteyAidWRmMTUiLAkweGZiZjAwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7U0lNTTE2LCBETjB9fSwKLXsgInVkZjE1IiwJMHhmZGYwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGYyMCIsCTB4ZjUwMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjIxIiwJMHhmNTEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjIiLAkweGY1MjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyMyIsCTB4ZjUzMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI0IiwJMHhmNTQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjUiLAkweGY1NTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyNiIsCTB4ZjU2MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjI3IiwJMHhmNTcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMjgiLAkweGY1ODAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYyOSIsCTB4ZjU5MCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMwIiwJMHhmNWEwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzEiLAkweGY1YjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzMiIsCTB4ZjVjMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZjMzIiwJMHhmNWQwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIDAsCXtETTEsIEROMH19LAoteyAidWRmMzQiLAkweGY1ZTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgMCwJe0RNMSwgRE4wfX0sCi17ICJ1ZGYzNSIsCTB4ZjVmMCwJICAgICAweGZmZjAsCSAgMCwgICAgRk1UX0QwLCAwLAl7RE0xLCBETjB9fSwKLXsgInVkZnUwMCIsCTB4ZjkwNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDAiLAkweGZiMDQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAwIiwJMHhmZDA0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDEiLAkweGY5MTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTAxIiwJMHhmYjE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwMSIsCTB4ZmQxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTAyIiwJMHhmOTI0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwMiIsCTB4ZmIyNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDIiLAkweGZkMjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwMyIsCTB4ZjkzNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDMiLAkweGZiMzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTAzIiwJMHhmZDM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDQiLAkweGY5NDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA0IiwJMHhmYjQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNCIsCTB4ZmQ0NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA1IiwJMHhmOTU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwNSIsCTB4ZmI1NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDUiLAkweGZkNTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwNiIsCTB4Zjk2NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDYiLAkweGZiNjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA2IiwJMHhmZDY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MDciLAkweGY5NzQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTA3IiwJMHhmYjc0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUwNyIsCTB4ZmQ3NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTA4IiwJMHhmOTg0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUwOCIsCTB4ZmI4NDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MDgiLAkweGZkODQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUwOSIsCTB4Zjk5NDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MDkiLAkweGZiOTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTA5IiwJMHhmZDk0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTAiLAkweGY5YTQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEwIiwJMHhmYmE0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMCIsCTB4ZmRhNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTExIiwJMHhmOWI0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxMSIsCTB4ZmJiNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTEiLAkweGZkYjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxMiIsCTB4ZjljNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTIiLAkweGZiYzQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTEyIiwJMHhmZGM0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi17ICJ1ZGZ1MTMiLAkweGY5ZDQwMCwgICAgMHhmZmZjMDAsICAgIDAsICAgIEZNVF9EMSwgMCwJe0lNTTgsIEROMH19LAoteyAidWRmdTEzIiwJMHhmYmQ0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIDAsICAgICAge0lNTTE2LCBETjB9fSwKLXsgInVkZnUxMyIsCTB4ZmRkNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCAwLAl7SU1NMzIsIEROMH19LAoteyAidWRmdTE0IiwJMHhmOWU0MDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIDAsCXtJTU04LCBETjB9fSwKLXsgInVkZnUxNCIsCTB4ZmJlNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0QyLCAwLCAgICAgIHtJTU0xNiwgRE4wfX0sCi17ICJ1ZGZ1MTQiLAkweGZkZTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9ENCwgMCwJe0lNTTMyLCBETjB9fSwKLXsgInVkZnUxNSIsCTB4ZjlmNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCAwLAl7SU1NOCwgRE4wfX0sCi17ICJ1ZGZ1MTUiLAkweGZiZjQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgMCwgICAgICB7SU1NMTYsIEROMH19LAoteyAidWRmdTE1IiwJMHhmZGY0MDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDQsIDAsCXtJTU0zMiwgRE4wfX0sCi0KLXsgInB1dHgiLAkweGY1MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0ROMDF9fSwKLXsgImdldHgiLAkweGY2ZjAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0ROMDF9fSwKLXsgIm11bHEiLAkweGY2MDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJtdWxxIiwJMHhmOTAwMDAsICAgIDB4ZmZmYzAwLCAgICAwLCAgICBGTVRfRDEsIEFNMzAsCXtTSU1NOCwgRE4wfX0sCi17ICJtdWxxIiwJMHhmYjAwMDAwMCwgIDB4ZmZmYzAwMDAsICAwLCAgICBGTVRfRDIsIEFNMzAsCXtTSU1NMTYsIEROMH19LAoteyAibXVscSIsCTB4ZmQwMDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMwLAl7SU1NMzIsIEROMH19LAoteyAibXVscXUiLAkweGY2MTAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZjkxNDAwLCAgICAweGZmZmMwMCwgICAgMCwgICAgRk1UX0QxLCBBTTMwLAl7U0lNTTgsIEROMH19LAoteyAibXVscXUiLAkweGZiMTQwMDAwLCAgMHhmZmZjMDAwMCwgIDAsICAgIEZNVF9EMiwgQU0zMCwJe1NJTU0xNiwgRE4wfX0sCi17ICJtdWxxdSIsCTB4ZmQxNDAwMDAsICAweGZmZmMwMDAwLCAgMCwgICAgRk1UX0Q0LCBBTTMwLAl7SU1NMzIsIEROMH19LAoteyAic2F0MTYiLAkweGY2NDAsCSAgICAgMHhmZmYwLAkgIDAsICAgIEZNVF9EMCwgQU0zMCwJe0RNMSwgRE4wfX0sCi0KLXsgInNhdDI0IiwJMHhmNjUwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAotCi17ICJic2NoIiwJMHhmNjcwLAkgICAgIDB4ZmZmMCwJICAwLCAgICBGTVRfRDAsIEFNMzAsCXtETTEsIEROMH19LAotCi0vKiBFeHRlbnNpb24uICBXZSBuZWVkIHNvbWUgaW5zdHJ1Y3Rpb24gdG8gdHJpZ2dlciAiZW11bGF0ZWQgc3lzY2FsbHMiCi0gICBmb3Igb3VyIHNpbXVsYXRvci4gICovCi17ICJzeXNjYWxsIiwgICAgMHhmMGMwLCAgICAgIDB4ZmZmZiwgICAgICAwLCAgICBGTVRfRDAsIDAsCXtVTlVTRUR9fSwKLQotLyogRXh0ZW5zaW9uLiAgV2hlbiB0YWxraW5nIHRvIHRoZSBzaW11bGF0b3IsIGdkYiByZXF1aXJlcyBzb21lIGluc3RydWN0aW9uCi0gICB0aGF0IHdpbGwgdHJpZ2dlciBhICJicmVha3BvaW50IiAocmVhbGx5IGp1c3QgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBpc24ndAotICAgb3RoZXJ3aXNlIHVzZWQgYnkgdGhlIHRvb2xzLiAgVGhpcyBpbnN0cnVjdGlvbiBtdXN0IGJlIHRoZSBzYW1lIHNpemUKLSAgIGFzIHRoZSBzbWFsbGVzdCBpbnN0cnVjdGlvbiBvbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBJbiB0aGUgY2FzZSBvZiB0aGUKLSAgIG1uMTB4MDAgdGhlICJicmVhayIgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBvbmUgYnl0ZS4gIDB4ZmYgaXMgYXZhaWxhYmxlIG9uCi0gICBib3RoIG1uMTB4MDAgYXJjaGl0ZWN0dXJlcy4gICovCi17ICJicmVhayIsCTB4ZmYsCSAgICAgMHhmZiwJICAwLCAgICBGTVRfUzAsIDAsCXtVTlVTRUR9fSwKLQotIAoteyAwLCAwLCAwLCAwLCAwLCAwLCB7MH19LAotCi19IDsKLQotY29uc3QgaW50IG1uMTAzMDBfbnVtX29wY29kZXMgPQotICBzaXplb2YgKG1uMTAzMDBfb3Bjb2RlcykgLyBzaXplb2YgKG1uMTAzMDBfb3Bjb2Rlc1swXSk7Ci0KLQwKZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1hc20uYyBiL29wY29kZXMvbTMyci1hc20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc4Y2Q3My4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItYXNtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTYgKzAsMCBAQAotLyogQXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KLSAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWFzbS5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0jdW5kZWYgbWluCi0jZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgbWF4Ci0jZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogcGFyc2VfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIGNvbnN0IGNoYXIgKiosIENHRU5fRklFTERTICopKTsKLQwKLS8qIC0tIGFzc2VtYmxlciByb3V0aW5lcyBpbnNlcnRlZCBoZXJlICovCi0KLS8qIC0tIGFzbS5jICovCi0KLS8qIEhhbmRsZSAnIycgcHJlZml4ZXMgKGkuZS4gc2tpcCBvdmVyIHRoZW0pLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGFzaCAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBIYW5kbGUgc2hpZ2goKSwgaGlnaCgpLiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2VfaGkxNiAoY2QsIHN0cnAsIG9waW5kZXgsIHZhbHVlcCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgY2hhciAqKnN0cnA7Ci0gICAgIGludCBvcGluZGV4OwotICAgICB1bnNpZ25lZCBsb25nICp2YWx1ZXA7Ci17Ci0gIGNvbnN0IGNoYXIgKmVycm1zZzsKLSAgZW51bSBjZ2VuX3BhcnNlX29wZXJhbmRfcmVzdWx0IHJlc3VsdF90eXBlOwotICBiZmRfdm1hIHZhbHVlOwotCi0gIGlmICgqKnN0cnAgPT0gJyMnKQotICAgICsrKnN0cnA7Ci0KLSAgaWYgKHN0cm5jYXNlY21wICgqc3RycCwgImhpZ2goIiwgNSkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA1OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfSEkxNl9VTE8sCi0JCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0gIAkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlID4+PSAxNjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotICBlbHNlIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJzaGlnaCgiLCA2KSA9PSAwKQotICAgIHsKLSAgICAgICpzdHJwICs9IDY7Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBvcGluZGV4LCBCRkRfUkVMT0NfTTMyUl9ISTE2X1NMTywKLSAJCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0JICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKLQl2YWx1ZSA9ICh2YWx1ZSA+PiAxNikgKyAodmFsdWUgJiAweDgwMDAgPyAxIDogMCk7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogSGFuZGxlIGxvdygpIGluIGEgc2lnbmVkIGNvbnRleHQuICBBbHNvIGhhbmRsZSBzZGEoKS4KLSAgIFRoZSBzaWduZWRuZXNzIG9mIHRoZSB2YWx1ZSBkb2Vzbid0IG1hdHRlciB0byBsb3coKSwgYnV0IHRoaXMgYWxzbwotICAgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBsb3coKSBpc24ndCBwcmVzZW50LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotcGFyc2Vfc2xvMTYgKGNkLCBzdHJwLCBvcGluZGV4LCB2YWx1ZXApCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IGNoYXIgKipzdHJwOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBjb25zdCBjaGFyICplcnJtc2c7Ci0gIGVudW0gY2dlbl9wYXJzZV9vcGVyYW5kX3Jlc3VsdCByZXN1bHRfdHlwZTsKLSAgYmZkX3ZtYSB2YWx1ZTsKLQotICBpZiAoKipzdHJwID09ICcjJykKLSAgICArKypzdHJwOwotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJsb3coIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfTE8xNiwKLQkJCQkgICAmcmVzdWx0X3R5cGUsICZ2YWx1ZSk7Ci0gICAgICBpZiAoKipzdHJwICE9ICcpJykKLQlyZXR1cm4gIm1pc3NpbmcgYCknIjsKLSAgICAgICsrKnN0cnA7Ci0gICAgICBpZiAoZXJybXNnID09IE5VTEwKLQkgICYmIHJlc3VsdF90eXBlID09IENHRU5fUEFSU0VfT1BFUkFORF9SRVNVTFRfTlVNQkVSKQotCXZhbHVlICY9IDB4ZmZmZjsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIGlmIChzdHJuY2FzZWNtcCAoKnN0cnAsICJzZGEoIiwgNCkgPT0gMCkKLSAgICB7Ci0gICAgICAqc3RycCArPSA0OwotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgb3BpbmRleCwgQkZEX1JFTE9DX00zMlJfU0RBMTYsCi0JCQkJICAgTlVMTCwgJnZhbHVlKTsKLSAgICAgIGlmICgqKnN0cnAgIT0gJyknKQotCXJldHVybiAibWlzc2luZyBgKSciOwotICAgICAgKysqc3RycDsKLSAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBlcnJtc2c7Ci0gICAgfQotCi0gIHJldHVybiBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogSGFuZGxlIGxvdygpIGluIGFuIHVuc2lnbmVkIGNvbnRleHQuCi0gICBUaGUgc2lnbmVkbmVzcyBvZiB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIgdG8gbG93KCksIGJ1dCB0aGlzIGFsc28KLSAgIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgbG93KCkgaXNuJ3QgcHJlc2VudC4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLXBhcnNlX3VsbzE2IChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIHVuc2lnbmVkIGxvbmcgKnZhbHVlcDsKLXsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBlbnVtIGNnZW5fcGFyc2Vfb3BlcmFuZF9yZXN1bHQgcmVzdWx0X3R5cGU7Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgaWYgKCoqc3RycCA9PSAnIycpCi0gICAgKysqc3RycDsKLQotICBpZiAoc3RybmNhc2VjbXAgKCpzdHJwLCAibG93KCIsIDQpID09IDApCi0gICAgewotICAgICAgKnN0cnAgKz0gNDsKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIG9waW5kZXgsIEJGRF9SRUxPQ19NMzJSX0xPMTYsCi0JCQkJICAgJnJlc3VsdF90eXBlLCAmdmFsdWUpOwotICAgICAgaWYgKCoqc3RycCAhPSAnKScpCi0JcmV0dXJuICJtaXNzaW5nIGApJyI7Ci0gICAgICArKypzdHJwOwotICAgICAgaWYgKGVycm1zZyA9PSBOVUxMCi0JICAmJiByZXN1bHRfdHlwZSA9PSBDR0VOX1BBUlNFX09QRVJBTkRfUkVTVUxUX05VTUJFUikKLQl2YWx1ZSAmPSAweGZmZmY7Ci0gICAgICAqdmFsdWVwID0gdmFsdWU7Ci0gICAgICByZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgb3BpbmRleCwgdmFsdWVwKTsKLX0KLQotLyogLS0gKi8KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBwYXJzaW5nLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHBhcnNlX2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcGFyc2VfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1jb25zdCBjaGFyICoKLW0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgb3BpbmRleCwgc3RycCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgY2hhciAqKiBzdHJwOwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgY29uc3QgY2hhciAqIGVycm1zZzsKLQotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgMCwgTlVMTCwgICYgdmFsdWUpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgewotICAgICAgICBiZmRfdm1hIHZhbHVlOwotICAgICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2FkZHJlc3MgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfRElTUDI0LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwMjQgPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHsKLSAgICAgICAgYmZkX3ZtYSB2YWx1ZTsKLSAgICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9hZGRyZXNzIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX0RJU1A4LCAwLCBOVUxMLCAgJiB2YWx1ZSk7Ci0gICAgICAgIGZpZWxkcy0+Zl9kaXNwOCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV9rZXl3b3JkIChjZCwgc3RycCwgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgZXJybXNnID0gcGFyc2VfaGFzaCAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9IQVNILCAmZmllbGRzLT5mX25pbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX2hpMTYgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfSEkxNiwgJmZpZWxkcy0+Zl9oaTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2Vfc2lnbmVkX2ludGVnZXIgKGNkLCBzdHJwLCBNMzJSX09QRVJBTkRfU0lNTTE2LCAmZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX3NpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NJTU04LCAmZmllbGRzLT5mX3NpbW04KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIGVycm1zZyA9IHBhcnNlX3NsbzE2IChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1NMTzE2LCAmZmllbGRzLT5mX3NpbW0xNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBlcnJtc2cgPSBjZ2VuX3BhcnNlX2tleXdvcmQgKGNkLCBzdHJwLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NMTYsICZmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICB7Ci0gICAgICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfYWRkcmVzcyAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NMjQsIDAsIE5VTEwsICAmIHZhbHVlKTsKLSAgICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZXJybXNnID0gY2dlbl9wYXJzZV91bnNpZ25lZF9pbnRlZ2VyIChjZCwgc3RycCwgTTMyUl9PUEVSQU5EX1VJTU00LCAmZmllbGRzLT5mX3VpbW00KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGVycm1zZyA9IGNnZW5fcGFyc2VfdW5zaWduZWRfaW50ZWdlciAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VSU1NNSwgJmZpZWxkcy0+Zl91aW1tNSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBlcnJtc2cgPSBwYXJzZV91bG8xNiAoY2QsIHN0cnAsIE0zMlJfT1BFUkFORF9VTE8xNiwgJmZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBwYXJzaW5nLlxuIiksIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gZXJybXNnOwotfQotCi1jZ2VuX3BhcnNlX2ZuICogY29uc3QgbTMycl9jZ2VuX3BhcnNlX2hhbmRsZXJzW10gPSAKLXsKLSAgcGFyc2VfaW5zbl9ub3JtYWwsCi19OwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9hc20gKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBtMzJyX2NnZW5faW5pdF9vcGNvZGVfdGFibGUgKGNkKTsKLSAgbTMycl9jZ2VuX2luaXRfaWJsZF90YWJsZSAoY2QpOwotICBjZC0+cGFyc2VfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9wYXJzZV9oYW5kbGVyc1swXTsKLSAgY2QtPnBhcnNlX29wZXJhbmQgPSBtMzJyX2NnZW5fcGFyc2Vfb3BlcmFuZDsKLX0KLQotDAotLyogRGVmYXVsdCBpbnNuIHBhcnNlci4KLQotICAgVGhlIHN5bnRheCBzdHJpbmcgaXMgc2Nhbm5lZCBhbmQgb3BlcmFuZHMgYXJlIHBhcnNlZCBhbmQgc3RvcmVkIGluIEZJRUxEUy4KLSAgIFJlbG9jcyBhcmUgcXVldWVkIGFzIHdlIGdvIHZpYSBvdGhlciBjYWxsYmFja3MuCi0KLSAgID8/PyBOb3RlIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgYW4gYWxsLW9yLW5vdGhpbmcgcGFyc2VyLiAgSWYgd2UgZmFpbCB0bwotICAgcGFyc2UgdGhlIGluc3RydWN0aW9uLCB3ZSByZXR1cm4gMCBhbmQgdGhlIGNhbGxlciB3aWxsIHN0YXJ0IG92ZXIgZnJvbQotICAgdGhlIGJlZ2lubmluZy4gIEJhY2t0cmFja2luZyB3aWxsIGJlIG5lY2Vzc2FyeSBpbiBwYXJzaW5nIHN1YmV4cHJlc3Npb25zLAotICAgYnV0IHRoYXQgY2FuIGJlIGhhbmRsZWQgdGhlcmUuICBOb3QgaGFuZGxpbmcgYmFja3RyYWNraW5nIGhlcmUgbWF5IGdldAotICAgZXhwZW5zaXZlIGluIHRoZSBjYXNlIG9mIHRoZSBtNjhrLiAgRGVhbCB3aXRoIGxhdGVyLgotCi0gICBSZXR1cm5zIE5VTEwgZm9yIHN1Y2Nlc3MsIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGZhaWx1cmUuCi0qLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1wYXJzZV9pbnNuX25vcm1hbCAoY2QsIGluc24sIHN0cnAsIGZpZWxkcykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotICAgICBjb25zdCBjaGFyICoqc3RycDsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLXsKLSAgLyogPz8/IFJ1bnRpbWUgYWRkZWQgaW5zbnMgbm90IGhhbmRsZWQgeWV0LiAgKi8KLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCBjaGFyICpzdHIgPSAqc3RycDsKLSAgY29uc3QgY2hhciAqZXJybXNnOwotICBjb25zdCBjaGFyICpwOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICogc3luOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgLyogRklYTUU6IHdpcCAqLwotICBpbnQgcGFzdF9vcGNvZGVfcDsKLSNlbmRpZgotCi0gIC8qIEZvciBub3cgd2UgYXNzdW1lIHRoZSBtbmVtb25pYyBpcyBmaXJzdCAodGhlcmUgYXJlIG5vIGxlYWRpbmcgb3BlcmFuZHMpLgotICAgICBXZSBjYW4gcGFyc2UgaXQgd2l0aG91dCBuZWVkaW5nIHRvIHNldCB1cCBvcGVyYW5kIHBhcnNpbmcuCi0gICAgIEdBUydzIGlucHV0IHNjcnViYmVyIHdpbGwgZW5zdXJlIG1uZW1vbmljcyBhcmUgbG93ZXJjYXNlLCBidXQgd2UgbWF5Ci0gICAgIG5vdCBiZSBjYWxsZWQgZnJvbSBHQVMuICAqLwotICBwID0gQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKTsKLSAgd2hpbGUgKCpwICYmIHRvbG93ZXIgKCpwKSA9PSB0b2xvd2VyICgqc3RyKSkKLSAgICArK3AsICsrc3RyOwotICAKLSAgaWYgKCogcCB8fCAoKiBzdHIgJiYgIWlzc3BhY2UgKCogc3RyKSkpCi0gICAgcmV0dXJuIF8oInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIpOwotCi0gIENHRU5fSU5JVF9QQVJTRSAoY2QpOwotICBjZ2VuX2luaXRfcGFyc2Vfb3BlcmFuZCAoY2QpOwotI2lmZGVmIENHRU5fTU5FTU9OSUNfT1BFUkFORFMKLSAgcGFzdF9vcGNvZGVfcCA9IDA7Ci0jZW5kaWYKLQotICAvKiBXZSBkb24ndCBjaGVjayBmb3IgKCpzdHIgIT0gJ1wwJykgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gcGFyc2UKLSAgICAgYW55IHRyYWlsaW5nIGZha2UgYXJndW1lbnRzIGluIHRoZSBzeW50YXggc3RyaW5nLiAgKi8KLSAgc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOwotCi0gIC8qIE1uZW1vbmljcyBjb21lIGZpcnN0IGZvciBub3csIGVuc3VyZSB2YWxpZCBzdHJpbmcuICAqLwotICBpZiAoISBDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqIHN5bikpCi0gICAgYWJvcnQgKCk7Ci0KLSAgKytzeW47Ci0KLSAgd2hpbGUgKCogc3luICE9IDApCi0gICAgewotICAgICAgLyogTm9uIG9wZXJhbmQgY2hhcnMgbXVzdCBtYXRjaCBleGFjdGx5LiAgKi8KLSAgICAgIGlmIChDR0VOX1NZTlRBWF9DSEFSX1AgKCogc3luKSkKLQl7Ci0JICBpZiAoKnN0ciA9PSBDR0VOX1NZTlRBWF9DSEFSICgqIHN5bikpCi0JICAgIHsKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0JICAgICAgaWYgKCogc3luID09ICcgJykKLQkJcGFzdF9vcGNvZGVfcCA9IDE7Ci0jZW5kaWYKLQkgICAgICArKyBzeW47Ci0JICAgICAgKysgc3RyOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICAvKiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uICAqLwotCSAgICAgIC8qIEZJWE1FOiB3b3VsZCBsaWtlIHRvIHJldHVybiBzb21ldGhpbmcgbGlrZQotCQkgImV4cGVjdGVkIGNoYXIgYGMnIiAqLwotCSAgICAgIHJldHVybiBfKCJzeW50YXggZXJyb3IiKTsKLQkgICAgfQotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQgb2Ygc29tZSBzb3J0LiAgKi8KLSAgICAgIGVycm1zZyA9IG0zMnJfY2dlbl9wYXJzZV9vcGVyYW5kIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCQkgICZzdHIsIGZpZWxkcyk7Ci0gICAgICBpZiAoZXJybXNnKQotCXJldHVybiBlcnJtc2c7Ci0KLSAgICAgIC8qIERvbmUgd2l0aCB0aGlzIG9wZXJhbmQsIGNvbnRpbnVlIHdpdGggbmV4dCBvbmUuICAqLwotICAgICAgKysgc3luOwotICAgIH0KLQotICAvKiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzeW50YXggc3RyaW5nLCB3ZSdyZSBkb25lLiAgKi8KLSAgaWYgKCogc3luID09ICdcMCcpCi0gICAgewotICAgICAgLyogRklYTUU6IEZvciB0aGUgbW9tZW50IHdlIGFzc3VtZSBhIHZhbGlkIGBzdHInIGNhbiBvbmx5IGNvbnRhaW4KLQkgYmxhbmtzIG5vdy4gIElFOiBXZSBuZWVkbid0IHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHZlcnNpb24gb2YKLQkgdGhlIGluc24gYW5kIGl0IGlzIGFzc3VtZWQgdGhhdCBsb25nZXIgdmVyc2lvbnMgb2YgaW5zbnMgYXBwZWFyCi0JIGJlZm9yZSBzaG9ydGVyIG9uZXMgKGVnOiBsc3IgcjIscjMsMSB2cyBsc3IgcjIscjMpLiAgKi8KLSAgICAgIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0JKysgc3RyOwotCi0gICAgICBpZiAoKiBzdHIgIT0gJ1wwJykKLQlyZXR1cm4gXygianVuayBhdCBlbmQgb2YgbGluZSIpOyAvKiBGSVhNRTogd291bGQgbGlrZSB0byBpbmNsdWRlIGBzdHInICovCi0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAvKiBXZSBjb3VsZG4ndCBwYXJzZSBpdC4gICovCi0gIHJldHVybiBfKCJ1bnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb24iKTsKLX0KLQwKLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBlYWNoIGluc3RydWN0aW9uIHRvIGJlIGFzc2VtYmxlZC4KLSAgIFNUUiBwb2ludHMgdG8gdGhlIGluc24gdG8gYmUgYXNzZW1ibGVkLgotICAgV2UgYXNzdW1lIGFsbCBuZWNlc3NhcnkgdGFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KLSAgIFRoZSBhc3NlbWJsZWQgaW5zdHJ1Y3Rpb24sIGxlc3MgYW55IGZpeHVwcywgaXMgc3RvcmVkIGluIEJVRi4KLSAgIFJlbWVtYmVyIHRoYXQgaWYgQ0dFTl9JTlRfSU5TTl9QIHRoZW4gQlVGIGlzIGFuIGludCBhbmQgdGh1cyB0aGUgdmFsdWUKLSAgIHN0aWxsIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byB0YXJnZXQgYnl0ZSBvcmRlciwgb3RoZXJ3aXNlIEJVRiBpcyBhbiBhcnJheQotICAgb2YgYnl0ZXMgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIuCi0gICBUaGUgcmVzdWx0IGlzIGEgcG9pbnRlciB0byB0aGUgaW5zbidzIGVudHJ5IGluIHRoZSBvcGNvZGUgdGFibGUsCi0gICBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VyZWQgKGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBoYXZlIGFscmVhZHkgYmVlbgotICAgcHJpbnRlZCkuCi0KLSAgIE5vdGUgdGhhdCB3aGVuIHByb2Nlc3NpbmcgKG5vbi1hbGlhcykgbWFjcm8taW5zbnMsCi0gICB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2VzLgotCi0gICA/Pz8gSXQncyBwb3NzaWJsZSB0byBtYWtlIHRoaXMgY3B1LWluZGVwZW5kZW50LgotICAgT25lIHdvdWxkIGhhdmUgdG8gZGVhbCB3aXRoIGEgZmV3IG1pbm9yIHRoaW5ncy4KLSAgIEF0IHRoaXMgcG9pbnQgaW4gdGltZSBkb2luZyBzbyB3b3VsZCBiZSBtb3JlIG9mIGEgY3VyaW9zaXR5IHRoYW4gdXNlZnVsCi0gICBbZm9yIGV4YW1wbGUgdGhpcyBmaWxlIGlzbid0IF90aGF0XyBiaWddLCBidXQga2VlcGluZyB0aGUgcG9zc2liaWxpdHkgaW4KLSAgIG1pbmQgaGVscHMga2VlcCB0aGUgZGVzaWduIGNsZWFuLiAgKi8KLQotY29uc3QgQ0dFTl9JTlNOICoKLW0zMnJfY2dlbl9hc3NlbWJsZV9pbnNuIChjZCwgc3RyLCBmaWVsZHMsIGJ1ZiwgZXJybXNnKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmOwotICAgICBjaGFyICoqZXJybXNnOwotewotICBjb25zdCBjaGFyICpzdGFydDsKLSAgQ0dFTl9JTlNOX0xJU1QgKmlsaXN0OwotCi0gIC8qIFNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZS4gICovCi0gIHdoaWxlIChpc3NwYWNlICgqIHN0cikpCi0gICAgKysgc3RyOwotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoZWQgbGlzdHMuCi0gICAgIEdldCB0aGUgZmlyc3QgaW4gdGhlIGxpc3QuICAqLwotICBpbGlzdCA9IENHRU5fQVNNX0xPT0tVUF9JTlNOIChjZCwgc3RyKTsKLQotICAvKiBLZWVwIGxvb2tpbmcgdW50aWwgd2UgZmluZCBhIG1hdGNoLiAgKi8KLQotICBzdGFydCA9IHN0cjsKLSAgZm9yICggOyBpbGlzdCAhPSBOVUxMIDsgaWxpc3QgPSBDR0VOX0FTTV9ORVhUX0lOU04gKGlsaXN0KSkKLSAgICB7Ci0gICAgICBjb25zdCBDR0VOX0lOU04gKmluc24gPSBpbGlzdC0+aW5zbjsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyB1bnN1cHBvcnRlZCBvcGNvZGVzIHNob3VsZG4ndCBiZSBpbiB0aGUgaGFzaCBsaXN0cyAqLwotICAgICAgLyogSXMgdGhpcyBpbnNuIHN1cHBvcnRlZCBieSB0aGUgc2VsZWN0ZWQgY3B1PyAgKi8KLSAgICAgIGlmICghIG0zMnJfY2dlbl9pbnNuX3N1cHBvcnRlZCAoY2QsIGluc24pKQotCWNvbnRpbnVlOwotI2VuZGlmCi0KLSAgICAgIC8qIElmIHRoZSBSRUxBWCBhdHRyaWJ1dGUgaXMgc2V0LCB0aGlzIGlzIGFuIGluc24gdGhhdCBzaG91bGRuJ3QgYmUKLQkgY2hvc2VuIGltbWVkaWF0ZWx5LiAgSW5zdGVhZCwgaXQgaXMgdXNlZCBkdXJpbmcgYXNzZW1ibGVyL2xpbmtlcgotCSByZWxheGF0aW9uIGlmIHBvc3NpYmxlLiAgKi8KLSAgICAgIGlmIChDR0VOX0lOU05fQVRUUl9WQUxVRSAoaW5zbiwgQ0dFTl9JTlNOX1JFTEFYKSAhPSAwKQotCWNvbnRpbnVlOwotCi0gICAgICBzdHIgPSBzdGFydDsKLQotICAgICAgLyogQWxsb3cgcGFyc2UvaW5zZXJ0IGhhbmRsZXJzIHRvIG9idGFpbiBsZW5ndGggb2YgaW5zbi4gICovCi0gICAgICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gQ0dFTl9JTlNOX0JJVFNJWkUgKGluc24pOwotCi0gICAgICBpZiAoISBDR0VOX1BBUlNFX0ZOIChjZCwgaW5zbikgKGNkLCBpbnNuLCAmIHN0ciwgZmllbGRzKSkKLQl7Ci0JICAvKiA/Pz8gMCBpcyBwYXNzZWQgZm9yIGBwYycgKi8KLQkgIGlmIChDR0VOX0lOU0VSVF9GTiAoY2QsIGluc24pIChjZCwgaW5zbiwgZmllbGRzLCBidWYsIChiZmRfdm1hKSAwKQotCSAgICAgICE9IE5VTEwpCi0JICAgIGNvbnRpbnVlOwotCSAgLyogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBhY3R1YWxseSBvdXRwdXQgdGhlIGluc24gYW5kIGFueQotCSAgICAgcXVldWVkIHJlbG9jcy4gICovCi0JICByZXR1cm4gaW5zbjsKLQl9Ci0KLSAgICAgIC8qIFRyeSB0aGUgbmV4dCBlbnRyeS4gICovCi0gICAgfQotCi0gIC8qIEZJWE1FOiBXZSBjYW4gcmV0dXJuIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhhbiB0aGlzLgotICAgICBOZWVkIHRvIHRyYWNrIHdoeSBpdCBmYWlsZWQgYW5kIHBpY2sgdGhlIHJpZ2h0IG9uZS4gICovCi0gIHsKLSAgICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgICBpZiAoc3RybGVuIChzdGFydCkgPiA1MCkKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBzcHJpbnRmIChlcnJidWYsIF8oImJhZCBpbnN0cnVjdGlvbiBgJS41MHMuLi4nIiksIHN0YXJ0KTsKLSAgICBlbHNlIAotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIHNwcmludGYgKGVycmJ1ZiwgXygiYmFkIGluc3RydWN0aW9uIGAlLjUwcyciKSwgc3RhcnQpOwotICAgICAgCi0gICAgKmVycm1zZyA9IGVycmJ1ZjsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotDAotI2lmIDAgLyogVGhpcyBjYWxscyBiYWNrIHRvIEdBUyB3aGljaCB3ZSBjYW4ndCBkbyB3aXRob3V0IGNhcmUuICAqLwotCi0vKiBSZWNvcmQgZWFjaCBtZW1iZXIgb2YgT1BWQUxTIGluIHRoZSBhc3NlbWJsZXIncyBzeW1ib2wgdGFibGUuCi0gICBUaGlzIGxldHMgR0FTIHBhcnNlIHJlZ2lzdGVycyBmb3IgdXMuCi0gICA/Pz8gSW50ZXJlc3RpbmcgaWRlYSBidXQgbm90IGN1cnJlbnRseSB1c2VkLiAgKi8KLQotLyogUmVjb3JkIGVhY2ggbWVtYmVyIG9mIE9QVkFMUyBpbiB0aGUgYXNzZW1ibGVyJ3Mgc3ltYm9sIHRhYmxlLgotICAgRklYTUU6IE5vdCBjdXJyZW50bHkgdXNlZC4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9hc21faGFzaF9rZXl3b3JkcyAoY2QsIG9wdmFscykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9LRVlXT1JEICpvcHZhbHM7Ci17Ci0gIENHRU5fS0VZV09SRF9TRUFSQ0ggc2VhcmNoID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9pbml0IChvcHZhbHMsIE5VTEwpOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKiBrZTsKLQotICB3aGlsZSAoKGtlID0gY2dlbl9rZXl3b3JkX3NlYXJjaF9uZXh0ICgmIHNlYXJjaCkpICE9IE5VTEwpCi0gICAgewotI2lmIDAgLyogVW5uZWNlc3NhcnksIHNob3VsZCBiZSBkb25lIGluIHRoZSBzZWFyY2ggcm91dGluZS4gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5fb3B2YWxfc3VwcG9ydGVkIChrZSkpCi0JY29udGludWU7Ci0jZW5kaWYKLSAgICAgIGNnZW5fYXNtX3JlY29yZF9yZWdpc3RlciAoY2QsIGtlLT5uYW1lLCBrZS0+dmFsdWUpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qIDAgKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kZXNjLmMgYi9vcGNvZGVzL20zMnItZGVzYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2I1NDYyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kZXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUwICswLDAgQEAKLS8qIENQVSBkYXRhIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogQXR0cmlidXRlcy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0FUVFJfRU5UUlkgYm9vbF9hdHRyW10gPQotewotICB7ICIjZiIsIDAgfSwKLSAgeyAiI3QiLCAxIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIE1BQ0hfYXR0cltdID0KLXsKLSAgeyAiYmFzZSIsIE1BQ0hfQkFTRSB9LAotICB7ICJtMzJyIiwgTUFDSF9NMzJSIH0sCi0gIHsgIm1heCIsIE1BQ0hfTUFYIH0sCi0gIHsgMCwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9BVFRSX0VOVFJZIElTQV9hdHRyW10gPQotewotICB7ICJtMzJyIiwgSVNBX00zMlIgfSwKLSAgeyAibWF4IiwgSVNBX01BWCB9LAotICB7IDAsIDAgfQotfTsKLQotY29uc3QgQ0dFTl9BVFRSX1RBQkxFIG0zMnJfY2dlbl9pZmllbGRfYXR0cl90YWJsZVtdID0KLXsKLSAgeyAiTUFDSCIsICYgTUFDSF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlBDUkVMLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkFCUy1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRVNFUlZFRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0lHTi1PUFQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR05FRCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMT0MiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgMCwgMCwgMCB9Ci19OwotCi1jb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX2hhcmR3YXJlX2F0dHJfdGFibGVbXSA9Ci17Ci0gIHsgIk1BQ0giLCAmIE1BQ0hfYXR0clswXSB9LAotICB7ICJWSVJUVUFMIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJDQUNIRS1BRERSIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQyIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUFJPRklMRSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5fb3BlcmFuZF9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiVklSVFVBTCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUENSRUwtQUREUiIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiQUJTLUFERFIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlNJR04tT1BUIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTSUdORUQiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIk5FR0FUSVZFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiU0VNLU9OTFkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlJFTE9DIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJIQVNILVBSRUZJWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLWNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faW5zbl9hdHRyX3RhYmxlW10gPQotewotICB7ICJNQUNIIiwgJiBNQUNIX2F0dHJbMF0gfSwKLSAgeyAiQUxJQVMiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlZJUlRVQUwiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIlVOQ09ORC1DVEkiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkNPTkQtQ1RJIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJTS0lQLUNUSSIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiREVMQVktU0xPVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiUkVMQVhBQkxFIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJSRUxBWCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAiTk8tRElTIiwgJmJvb2xfYXR0clswXSwgJmJvb2xfYXR0clswXSB9LAotICB7ICJQQkIiLCAmYm9vbF9hdHRyWzBdLCAmYm9vbF9hdHRyWzBdIH0sCi0gIHsgIkZJTEwtU0xPVCIsICZib29sX2F0dHJbMF0sICZib29sX2F0dHJbMF0gfSwKLSAgeyAwLCAwLCAwIH0KLX07Ci0KLS8qIEluc3RydWN0aW9uIHNldCB2YXJpYW50cy4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX0lTQSBtMzJyX2NnZW5faXNhX3RhYmxlW10gPSB7Ci0gIHsgIm0zMnIiLCAzMiwgMzIsIDE2LCAzMiwgIH0sCi0gIHsgMCB9Ci19OwotCi0vKiBNYWNoaW5lIHZhcmlhbnRzLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fTUFDSCBtMzJyX2NnZW5fbWFjaF90YWJsZVtdID0gewotICB7ICJtMzJyIiwgIm0zMnIiLCBNQUNIX00zMlIgfSwKLSAgeyAwIH0KLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgImZwIiwgMTMgfSwKLSAgeyAibHIiLCAxNCB9LAotICB7ICJzcCIsIDE1IH0sCi0gIHsgInIwIiwgMCB9LAotICB7ICJyMSIsIDEgfSwKLSAgeyAicjIiLCAyIH0sCi0gIHsgInIzIiwgMyB9LAotICB7ICJyNCIsIDQgfSwKLSAgeyAicjUiLCA1IH0sCi0gIHsgInI2IiwgNiB9LAotICB7ICJyNyIsIDcgfSwKLSAgeyAicjgiLCA4IH0sCi0gIHsgInI5IiwgOSB9LAotICB7ICJyMTAiLCAxMCB9LAotICB7ICJyMTEiLCAxMSB9LAotICB7ICJyMTIiLCAxMiB9LAotICB7ICJyMTMiLCAxMyB9LAotICB7ICJyMTQiLCAxNCB9LAotICB7ICJyMTUiLCAxNSB9Ci19OwotCi1DR0VOX0tFWVdPUkQgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzID0KLXsKLSAgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXNfZW50cmllc1swXSwKLSAgMTkKLX07Ci0KLXN0YXRpYyBDR0VOX0tFWVdPUkRfRU5UUlkgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzX2VudHJpZXNbXSA9Ci17Ci0gIHsgInBzdyIsIDAgfSwKLSAgeyAiY2JyIiwgMSB9LAotICB7ICJzcGkiLCAyIH0sCi0gIHsgInNwdSIsIDMgfSwKLSAgeyAiYnBjIiwgNiB9LAotICB7ICJiYnBzdyIsIDggfSwKLSAgeyAiYmJwYyIsIDE0IH0sCi0gIHsgImNyMCIsIDAgfSwKLSAgeyAiY3IxIiwgMSB9LAotICB7ICJjcjIiLCAyIH0sCi0gIHsgImNyMyIsIDMgfSwKLSAgeyAiY3I0IiwgNCB9LAotICB7ICJjcjUiLCA1IH0sCi0gIHsgImNyNiIsIDYgfSwKLSAgeyAiY3I3IiwgNyB9LAotICB7ICJjcjgiLCA4IH0sCi0gIHsgImNyOSIsIDkgfSwKLSAgeyAiY3IxMCIsIDEwIH0sCi0gIHsgImNyMTEiLCAxMSB9LAotICB7ICJjcjEyIiwgMTIgfSwKLSAgeyAiY3IxMyIsIDEzIH0sCi0gIHsgImNyMTQiLCAxNCB9LAotICB7ICJjcjE1IiwgMTUgfQotfTsKLQotQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcyA9Ci17Ci0gICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzX2VudHJpZXNbMF0sCi0gIDIzCi19OwotCi0KLQotLyogVGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fSFdfLGEpKQotCi1jb25zdCBDR0VOX0hXX0VOVFJZIG0zMnJfY2dlbl9od190YWJsZVtdID0KLXsKLSAgeyAiaC1tZW1vcnkiLCBIV19IX01FTU9SWSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNpbnQiLCBIV19IX1NJTlQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC11aW50IiwgSFdfSF9VSU5ULCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtYWRkciIsIEhXX0hfQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWlhZGRyIiwgSFdfSF9JQUREUiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXBjIiwgSFdfSF9QQywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwfEEoUFJPRklMRSl8QShQQyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtaGkxNiIsIEhXX0hfSEkxNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLXVsbzE2IiwgSFdfSF9VTE8xNiwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWdyIiwgSFdfSF9HUiwgQ0dFTl9BU01fS0VZV09SRCwgKFBUUikgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIHsgMHxBKENBQ0hFX0FERFIpfEEoUFJPRklMRSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgImgtY3IiLCBIV19IX0NSLCBDR0VOX0FTTV9LRVlXT1JELCAoUFRSKSAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWNvbmQiLCBIV19IX0NPTkQsIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1wc3ciLCBIV19IX1BTVywgQ0dFTl9BU01fTk9ORSwgMCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSB9LAotICB7ICJoLWJwc3ciLCBIV19IX0JQU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1iYnBzdyIsIEhXX0hfQkJQU1csIENHRU5fQVNNX05PTkUsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gfSwKLSAgeyAiaC1sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX0FTTV9OT05FLCAwLCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9IH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0vKiBUaGUgaW5zdHJ1Y3Rpb24gZmllbGQgdGFibGUuICAqLwotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JRkxEXyxhKSkKLQotY29uc3QgQ0dFTl9JRkxEIG0zMnJfY2dlbl9pZmxkX3RhYmxlW10gPQotewotICB7IE0zMlJfRl9OSUwsICJmLW5pbCIsIDAsIDAsIDAsIDAsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMSwgImYtb3AxIiwgMCwgMzIsIDAsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX09QMiwgImYtb3AyIiwgMCwgMzIsIDgsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0NPTkQsICJmLWNvbmQiLCAwLCAzMiwgNCwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfUjEsICJmLXIxIiwgMCwgMzIsIDQsIDQsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1IyLCAiZi1yMiIsIDAsIDMyLCAxMiwgNCwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0lNTTgsICJmLXNpbW04IiwgMCwgMzIsIDgsIDgsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1NJTU0xNiwgImYtc2ltbTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfU0hJRlRfT1AyLCAiZi1zaGlmdC1vcDIiLCAwLCAzMiwgOCwgMywgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTQsICJmLXVpbW00IiwgMCwgMzIsIDEyLCA0LCB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9VSU1NNSwgImYtdWltbTUiLCAwLCAzMiwgMTEsIDUsIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX1VJTU0xNiwgImYtdWltbTE2IiwgMCwgMzIsIDE2LCAxNiwgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfVUlNTTI0LCAiZi11aW1tMjQiLCAwLCAzMiwgOCwgMjQsIHsgMHxBKFJFTE9DKXxBKEFCU19BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgTTMyUl9GX0hJMTYsICJmLWhpMTYiLCAwLCAzMiwgMTYsIDE2LCB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQOCwgImYtZGlzcDgiLCAwLCAzMiwgOCwgOCwgeyAwfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotICB7IE0zMlJfRl9ESVNQMTYsICJmLWRpc3AxNiIsIDAsIDMyLCAxNiwgMTYsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyBNMzJSX0ZfRElTUDI0LCAiZi1kaXNwMjQiLCAwLCAzMiwgOCwgMjQsIHsgMHxBKFJFTE9DKXxBKFBDUkVMX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLSAgeyAwIH0KLX07Ci0KLSN1bmRlZiBBCi0KLS8qIFRoZSBvcGVyYW5kIHRhYmxlLiAgKi8KLQotI2RlZmluZSBBKGEpICgxIDw8IENPTkNBVDIgKENHRU5fT1BFUkFORF8sYSkpCi0jZGVmaW5lIE9QRVJBTkQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCi0KLWNvbnN0IENHRU5fT1BFUkFORCBtMzJyX2NnZW5fb3BlcmFuZF90YWJsZVtdID0KLXsKLS8qIHBjOiBwcm9ncmFtIGNvdW50ZXIgKi8KLSAgeyAicGMiLCBNMzJSX09QRVJBTkRfUEMsIEhXX0hfUEMsIDAsIDAsCi0gICAgeyAwfEEoU0VNX09OTFkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNyOiBzb3VyY2UgcmVnaXN0ZXIgKi8KLSAgeyAic3IiLCBNMzJSX09QRVJBTkRfU1IsIEhXX0hfR1IsIDEyLCA0LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkcjogZGVzdGluYXRpb24gcmVnaXN0ZXIgKi8KLSAgeyAiZHIiLCBNMzJSX09QRVJBTkRfRFIsIEhXX0hfR1IsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNyYzE6IHNvdXJjZSByZWdpc3RlciAxICovCi0gIHsgInNyYzEiLCBNMzJSX09QRVJBTkRfU1JDMSwgSFdfSF9HUiwgNCwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc3JjMjogc291cmNlIHJlZ2lzdGVyIDIgKi8KLSAgeyAic3JjMiIsIE0zMlJfT1BFUkFORF9TUkMyLCBIV19IX0dSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2NyOiBzb3VyY2UgY29udHJvbCByZWdpc3RlciAqLwotICB7ICJzY3IiLCBNMzJSX09QRVJBTkRfU0NSLCBIV19IX0NSLCAxMiwgNCwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGNyOiBkZXN0aW5hdGlvbiBjb250cm9sIHJlZ2lzdGVyICovCi0gIHsgImRjciIsIE0zMlJfT1BFUkFORF9EQ1IsIEhXX0hfQ1IsIDQsIDQsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNpbW04OiA4IGJpdCBzaWduZWQgaW1tZWRpYXRlICovCi0gIHsgInNpbW04IiwgTTMyUl9PUEVSQU5EX1NJTU04LCBIV19IX1NJTlQsIDgsIDgsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHNpbW0xNjogMTYgYml0IHNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAic2ltbTE2IiwgTTMyUl9PUEVSQU5EX1NJTU0xNiwgSFdfSF9TSU5ULCAxNiwgMTYsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIHVpbW00OiA0IGJpdCB0cmFwIG51bWJlciAqLwotICB7ICJ1aW1tNCIsIE0zMlJfT1BFUkFORF9VSU1NNCwgSFdfSF9VSU5ULCAxMiwgNCwKLSAgICB7IDB8QShIQVNIX1BSRUZJWCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWltbTU6IDUgYml0IHNoaWZ0IGNvdW50ICovCi0gIHsgInVpbW01IiwgTTMyUl9PUEVSQU5EX1VJTU01LCBIV19IX1VJTlQsIDExLCA1LAotICAgIHsgMHxBKEhBU0hfUFJFRklYKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tMTY6IDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLSAgeyAidWltbTE2IiwgTTMyUl9PUEVSQU5EX1VJTU0xNiwgSFdfSF9VSU5ULCAxNiwgMTYsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGhhc2g6ICMgcHJlZml4ICovCi0gIHsgImhhc2giLCBNMzJSX09QRVJBTkRfSEFTSCwgSFdfSF9TSU5ULCAwLCAwLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBoaTE2OiBoaWdoIDE2IGJpdCBpbW1lZGlhdGUsIHNpZ24gb3B0aW9uYWwgKi8KLSAgeyAiaGkxNiIsIE0zMlJfT1BFUkFORF9ISTE2LCBIV19IX0hJMTYsIDE2LCAxNiwKLSAgICB7IDB8QShTSUdOX09QVCksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogc2xvMTY6IDE2IGJpdCBzaWduZWQgaW1tZWRpYXRlLCBmb3IgbG93KCkgKi8KLSAgeyAic2xvMTYiLCBNMzJSX09QRVJBTkRfU0xPMTYsIEhXX0hfU0xPMTYsIDE2LCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogdWxvMTY6IDE2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUsIGZvciBsb3coKSAqLwotICB7ICJ1bG8xNiIsIE0zMlJfT1BFUkFORF9VTE8xNiwgSFdfSF9VTE8xNiwgMTYsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiB1aW1tMjQ6IDI0IGJpdCBhZGRyZXNzICovCi0gIHsgInVpbW0yNCIsIE0zMlJfT1BFUkFORF9VSU1NMjQsIEhXX0hfQUREUiwgOCwgMjQsCi0gICAgeyAwfEEoSEFTSF9QUkVGSVgpfEEoUkVMT0MpfEEoQUJTX0FERFIpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfSAgfSwKLS8qIGRpc3A4OiA4IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDgiLCBNMzJSX09QRVJBTkRfRElTUDgsIEhXX0hfSUFERFIsIDgsIDgsCi0gICAgeyAwfEEoUkVMQVgpfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogZGlzcDE2OiAxNiBiaXQgZGlzcGxhY2VtZW50ICovCi0gIHsgImRpc3AxNiIsIE0zMlJfT1BFUkFORF9ESVNQMTYsIEhXX0hfSUFERFIsIDE2LCAxNiwKLSAgICB7IDB8QShSRUxPQyl8QShQQ1JFTF9BRERSKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0vKiBkaXNwMjQ6IDI0IGJpdCBkaXNwbGFjZW1lbnQgKi8KLSAgeyAiZGlzcDI0IiwgTTMyUl9PUEVSQU5EX0RJU1AyNCwgSFdfSF9JQUREUiwgOCwgMjQsCi0gICAgeyAwfEEoUkVMQVgpfEEoUkVMT0MpfEEoUENSRUxfQUREUiksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogY29uZGJpdDogY29uZGl0aW9uIGJpdCAqLwotICB7ICJjb25kYml0IiwgTTMyUl9PUEVSQU5EX0NPTkRCSVQsIEhXX0hfQ09ORCwgMCwgMCwKLSAgICB7IDB8QShTRU1fT05MWSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9ICB9LAotLyogYWNjdW06IGFjY3VtdWxhdG9yICovCi0gIHsgImFjY3VtIiwgTTMyUl9PUEVSQU5EX0FDQ1VNLCBIV19IX0FDQ1VNLCAwLCAwLAotICAgIHsgMHxBKFNFTV9PTkxZKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0gIH0sCi0gIHsgMCB9Ci19OwotCi0jdW5kZWYgQQotCi0jZGVmaW5lIEEoYSkgKDEgPDwgQ09OQ0FUMiAoQ0dFTl9JTlNOXyxhKSkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgbTMycl9jZ2VuX2luc25fdGFibGVbTUFYX0lOU05TXSA9Ci17Ci0gIC8qIFNwZWNpYWwgbnVsbCBmaXJzdCBlbnRyeS4KLSAgICAgQSBgbnVtJyB2YWx1ZSBvZiB6ZXJvIGlzIHRodXMgaW52YWxpZC4KLSAgICAgQWxzbywgdGhlIHNwZWNpYWwgYGludmFsaWQnIGluc24gcmVzaWRlcyBoZXJlLiAgKi8KLSAgeyAwLCAwLCAwIH0sCi0vKiBhZGQgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERCwgImFkZCIsICJhZGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGQzICRkciwkc3IsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BREQzLCAiYWRkMyIsICJhZGQzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BTkQsICJhbmQiLCAiYW5kIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYW5kMyAkZHIsJHNyLCR1aW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BTkQzLCAiYW5kMyIsICJhbmQzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogb3IgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX09SLCAib3IiLCAib3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBvcjMgJGRyLCRzciwkaGFzaCR1bG8xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX09SMywgIm9yMyIsICJvcjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4b3IgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1hPUiwgInhvciIsICJ4b3IiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiB4b3IzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1hPUjMsICJ4b3IzIiwgInhvcjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERJLCAiYWRkaSIsICJhZGRpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYWRkdiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fQUREViwgImFkZHYiLCAiYWRkdiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0FERFYzLCAiYWRkdjMiLCAiYWRkdjMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBhZGR4ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9BRERYLCAiYWRkeCIsICJhZGR4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmMucyAkZGlzcDggKi8KLSAgewotICAgIE0zMlJfSU5TTl9CQzgsICJiYzgiLCAiYmMucyIsIDE2LAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJjLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JDMjQsICJiYzI0IiwgImJjLmwiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZXEgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JFUSwgImJlcSIsICJiZXEiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiZXF6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CRVFaLCAiYmVxeiIsICJiZXF6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmdleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkdFWiwgImJnZXoiLCAiYmdleiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJndHogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JHVFosICJiZ3R6IiwgImJndHoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibGV6ICRzcmMyLCRkaXNwMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9CTEVaLCAiYmxleiIsICJibGV6IiwgMzIsCi0gICAgeyAwfEEoQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmx0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkxUWiwgImJsdHoiLCAiYmx0eiIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuZXogJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JORVosICJibmV6IiwgImJuZXoiLCAzMiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibC5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JMOCwgImJsOCIsICJibC5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmwubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQkwyNCwgImJsMjQiLCAiYmwubCIsIDMyLAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jLnMgJGRpc3A4ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DOCwgImJuYzgiLCAiYm5jLnMiLCAxNiwKLSAgICB7IDB8QShDT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBibmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5DMjQsICJibmMyNCIsICJibmMubCIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJuZSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQk5FLCAiYm5lIiwgImJuZSIsIDMyLAotICAgIHsgMHxBKENPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYS5zICRkaXNwOCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JSQTgsICJicmE4IiwgImJyYS5zIiwgMTYsCi0gICAgeyAwfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYnJhLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0JSQTI0LCAiYnJhMjQiLCAiYnJhLmwiLCAzMiwKLSAgICB7IDB8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGNtcCAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUCwgImNtcCIsICJjbXAiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXBpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9DTVBJLCAiY21waSIsICJjbXBpIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogY21wdSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0NNUFUsICJjbXB1IiwgImNtcHUiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBjbXB1aSAkc3JjMiwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fQ01QVUksICJjbXB1aSIsICJjbXB1aSIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdiAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fRElWLCAiZGl2IiwgImRpdiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGRpdnUgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0RJVlUsICJkaXZ1IiwgImRpdnUiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZW0gJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1JFTSwgInJlbSIsICJyZW0iLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiByZW11ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9SRU1VLCAicmVtdSIsICJyZW11IiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogamwgJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fSkwsICJqbCIsICJqbCIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGptcCAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9KTVAsICJqbXAiLCAiam1wIiwgMTYsCi0gICAgeyAwfEEoVU5DT05EX0NUSSksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xELCAibGQiLCAibGQiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEX0QsICJsZC1kIiwgImxkIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRiICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERCLCAibGRiIiwgImxkYiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkYiAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEQl9ELCAibGRiLWQiLCAibGRiIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRoICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERILCAibGRoIiwgImxkaCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xESF9ELCAibGRoLWQiLCAibGRoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1YiAkZHIsQCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEVUIsICJsZHViIiwgImxkdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVQl9ELCAibGR1Yi1kIiwgImxkdWIiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERVSCwgImxkdWgiLCAibGR1aCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MRFVIX0QsICJsZHVoLWQiLCAibGR1aCIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRkcixAJHNyKyAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEX1BMVVMsICJsZC1wbHVzIiwgImxkIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGQyNCAkZHIsJHVpbW0yNCAqLwotICB7Ci0gICAgTTMyUl9JTlNOX0xEMjQsICJsZDI0IiwgImxkMjQiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGk4ICRkciwkc2ltbTggKi8KLSAgewotICAgIE0zMlJfSU5TTl9MREk4LCAibGRpOCIsICJsZGk4IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpMTYgJGRyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fTERJMTYsICJsZGkxNiIsICJsZGkxNiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxvY2sgJGRyLEAkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9MT0NLLCAibG9jayIsICJsb2NrIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbWFjaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNISSwgIm1hY2hpIiwgIm1hY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbWFjbG8gJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NQUNMTywgIm1hY2xvIiwgIm1hY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbWFjd2hpICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTUFDV0hJLCAibWFjd2hpIiwgIm1hY3doaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG1hY3dsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01BQ1dMTywgIm1hY3dsbyIsICJtYWN3bG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdWwgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTCwgIm11bCIsICJtdWwiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdWxoaSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTEhJLCAibXVsaGkiLCAibXVsaGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdWxsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01VTExPLCAibXVsbG8iLCAibXVsbG8iLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfTTMyUikgfSB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVUxXSEksICJtdWx3aGkiLCAibXVsd2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXVsd2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVVMV0xPLCAibXVsd2xvIiwgIm11bHdsbyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG12ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NViwgIm12IiwgIm12IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbXZmYWNoaSAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ0hJLCAibXZmYWNoaSIsICJtdmZhY2hpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZmYWNsbyAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ0xPLCAibXZmYWNsbyIsICJtdmZhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZmYWNtaSAkZHIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVkZBQ01JLCAibXZmYWNtaSIsICJtdmZhY21pIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZmYyAkZHIsJHNjciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WRkMsICJtdmZjIiwgIm12ZmMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBtdnRhY2hpICRzcmMxICovCi0gIHsKLSAgICBNMzJSX0lOU05fTVZUQUNISSwgIm12dGFjaGkiLCAibXZ0YWNoaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIG12dGFjbG8gJHNyYzEgKi8KLSAgewotICAgIE0zMlJfSU5TTl9NVlRBQ0xPLCAibXZ0YWNsbyIsICJtdnRhY2xvIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogbXZ0YyAkc3IsJGRjciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX01WVEMsICJtdnRjIiwgIm12dGMiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBuZWcgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX05FRywgIm5lZyIsICJuZWciLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIE0zMlJfSU5TTl9OT1AsICJub3AiLCAibm9wIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbm90ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9OT1QsICJub3QiLCAibm90IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcmFjICovCi0gIHsKLSAgICBNMzJSX0lOU05fUkFDLCAicmFjIiwgInJhYyIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9NMzJSKSB9IH0KLSAgfSwKLS8qIHJhY2ggKi8KLSAgewotICAgIE0zMlJfSU5TTl9SQUNILCAicmFjaCIsICJyYWNoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX00zMlIpIH0gfQotICB9LAotLyogcnRlICovCi0gIHsKLSAgICBNMzJSX0lOU05fUlRFLCAicnRlIiwgInJ0ZSIsIDE2LAotICAgIHsgMHxBKFVOQ09ORF9DVEkpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc2V0aCAkZHIsJGhhc2gkaGkxNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NFVEgsICJzZXRoIiwgInNldGgiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzbGwgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTCwgInNsbCIsICJzbGwiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzbGwzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NMTDMsICJzbGwzIiwgInNsbDMiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzbGxpICRkciwkdWltbTUgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TTExJLCAic2xsaSIsICJzbGxpIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JhICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkEsICJzcmEiLCAic3JhIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JhMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TUkEzLCAic3JhMyIsICJzcmEzIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3JhaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JBSSwgInNyYWkiLCAic3JhaSIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNybCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMLCAic3JsIiwgInNybCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNybDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1JMMywgInNybDMiLCAic3JsMyIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHNybGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NSTEksICJzcmxpIiwgInNybGkiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVCwgInN0IiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc2xvMTYsJHNyYzIpICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RfRCwgInN0LWQiLCAic3QiLCAzMiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1RCLCAic3RiIiwgInN0YiIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzbG8xNiwkc3JjMikgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEJfRCwgInN0Yi1kIiwgInN0YiIsIDMyLAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVEgsICJzdGgiLCAic3RoIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUSF9ELCAic3RoLWQiLCAic3RoIiwgMzIsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCskc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUX1BMVVMsICJzdC1wbHVzIiwgInN0IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHNyYzEsQC0kc3JjMiAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NUX01JTlVTLCAic3QtbWludXMiLCAic3QiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWIgJGRyLCRzciAqLwotICB7Ci0gICAgTTMyUl9JTlNOX1NVQiwgInN1YiIsICJzdWIiLCAxNiwKLSAgICB7IDAsIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdWJ2ICRkciwkc3IgKi8KLSAgewotICAgIE0zMlJfSU5TTl9TVUJWLCAic3VidiIsICJzdWJ2IiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3VieCAkZHIsJHNyICovCi0gIHsKLSAgICBNMzJSX0lOU05fU1VCWCwgInN1YngiLCAic3VieCIsIDE2LAotICAgIHsgMCwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHRyYXAgJHVpbW00ICovCi0gIHsKLSAgICBNMzJSX0lOU05fVFJBUCwgInRyYXAiLCAidHJhcCIsIDE2LAotICAgIHsgMHxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIHVubG9jayAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIE0zMlJfSU5TTl9VTkxPQ0ssICJ1bmxvY2siLCAidW5sb2NrIiwgMTYsCi0gICAgeyAwLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotfTsKLQotI3VuZGVmIEEKLSN1bmRlZiBNTkVNCi0jdW5kZWYgT1AKLQotLyogSW5pdGlhbGl6ZSBhbnl0aGluZyBuZWVkZWQgdG8gYmUgZG9uZSBvbmNlLCBiZWZvcmUgYW55IGNwdV9vcGVuIGNhbGwuICAqLwotCi1zdGF0aWMgdm9pZAotaW5pdF90YWJsZXMgKCkKLXsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gbG9vayB1cCBhIG1hY2ggdmlhIGl0cyBiZmQgbmFtZS4gICovCi0KLXN0YXRpYyBjb25zdCBDR0VOX01BQ0ggKgotbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lICh0YWJsZSwgbmFtZSkKLSAgICAgY29uc3QgQ0dFTl9NQUNIICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgd2hpbGUgKHRhYmxlLT5uYW1lKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHRhYmxlLT5iZmRfbmFtZSkgPT0gMCkKLQlyZXR1cm4gdGFibGU7Ci0gICAgICArK3RhYmxlOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4gICovCi0KLXN0YXRpYyB2b2lkCi1idWlsZF9od190YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqaW5pdCA9ICYgbTMycl9jZ2VuX2h3X3RhYmxlWzBdOwotICAvKiBNQVhfSFcgaXMgb25seSBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIGVudHJpZXMuCi0gICAgIEhvd2V2ZXIgZWFjaCBlbnRyeSBpcyBpbmRleGVkIGJ5IGl0J3MgZW51bSBzbyB0aGVyZSBjYW4gYmUgaG9sZXMgaW4KLSAgICAgdGhlIHRhYmxlLiAgKi8KLSAgY29uc3QgQ0dFTl9IV19FTlRSWSAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9IV19FTlRSWSAqKikgeG1hbGxvYyAoTUFYX0hXICogc2l6ZW9mIChDR0VOX0hXX0VOVFJZICopKTsKLQotICBjZC0+aHdfdGFibGUuaW5pdF9lbnRyaWVzID0gaW5pdDsKLSAgY2QtPmh3X3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSFdfRU5UUlkpOwotICBtZW1zZXQgKHNlbGVjdGVkLCAwLCBNQVhfSFcgKiBzaXplb2YgKENHRU5fSFdfRU5UUlkgKikpOwotICAvKiA/Pz8gRm9yIG5vdyB3ZSBqdXN0IHVzZSBtYWNocyB0byBkZXRlcm1pbmUgd2hpY2ggb25lcyB3ZSB3YW50LiAgKi8KLSAgZm9yIChpID0gMDsgaW5pdFtpXS5uYW1lICE9IE5VTEw7ICsraSkKLSAgICBpZiAoQ0dFTl9IV19BVFRSX1ZBTFVFICgmaW5pdFtpXSwgQ0dFTl9IV19NQUNIKQotCSYgbWFjaHMpCi0gICAgICBzZWxlY3RlZFtpbml0W2ldLnR5cGVdID0gJmluaXRbaV07Ci0gIGNkLT5od190YWJsZS5lbnRyaWVzID0gc2VsZWN0ZWQ7Ci0gIGNkLT5od190YWJsZS5udW1fZW50cmllcyA9IE1BWF9IVzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gYnVpbGQgdGhlIGhhcmR3YXJlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2lmaWVsZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgY2QtPmlmbGRfdGFibGUgPSAmIG0zMnJfY2dlbl9pZmxkX3RhYmxlWzBdOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBidWlsZCB0aGUgaGFyZHdhcmUgdGFibGUuICAqLwotCi1zdGF0aWMgdm9pZAotYnVpbGRfb3BlcmFuZF90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGk7Ci0gIGludCBtYWNocyA9IGNkLT5tYWNoczsKLSAgY29uc3QgQ0dFTl9PUEVSQU5EICppbml0ID0gJiBtMzJyX2NnZW5fb3BlcmFuZF90YWJsZVswXTsKLSAgLyogTUFYX09QRVJBTkRTIGlzIG9ubHkgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiBzZWxlY3RlZCBlbnRyaWVzLgotICAgICBIb3dldmVyIGVhY2ggZW50cnkgaXMgaW5kZXhlZCBieSBpdCdzIGVudW0gc28gdGhlcmUgY2FuIGJlIGhvbGVzIGluCi0gICAgIHRoZSB0YWJsZS4gICovCi0gIGNvbnN0IENHRU5fT1BFUkFORCAqKnNlbGVjdGVkID0KLSAgICAoY29uc3QgQ0dFTl9PUEVSQU5EICoqKSB4bWFsbG9jIChNQVhfT1BFUkFORFMgKiBzaXplb2YgKENHRU5fT1BFUkFORCAqKSk7Ci0KLSAgY2QtPm9wZXJhbmRfdGFibGUuaW5pdF9lbnRyaWVzID0gaW5pdDsKLSAgY2QtPm9wZXJhbmRfdGFibGUuZW50cnlfc2l6ZSA9IHNpemVvZiAoQ0dFTl9PUEVSQU5EKTsKLSAgbWVtc2V0IChzZWxlY3RlZCwgMCwgTUFYX09QRVJBTkRTICogc2l6ZW9mIChDR0VOX09QRVJBTkQgKikpOwotICAvKiA/Pz8gRm9yIG5vdyB3ZSBqdXN0IHVzZSBtYWNoIHRvIGRldGVybWluZSB3aGljaCBvbmVzIHdlIHdhbnQuICAqLwotICBmb3IgKGkgPSAwOyBpbml0W2ldLm5hbWUgIT0gTlVMTDsgKytpKQotICAgIGlmIChDR0VOX09QRVJBTkRfQVRUUl9WQUxVRSAoJmluaXRbaV0sIENHRU5fT1BFUkFORF9NQUNIKQotCSYgbWFjaHMpCi0gICAgICBzZWxlY3RlZFtpbml0W2ldLnR5cGVdID0gJmluaXRbaV07Ci0gIGNkLT5vcGVyYW5kX3RhYmxlLmVudHJpZXMgPSBzZWxlY3RlZDsKLSAgY2QtPm9wZXJhbmRfdGFibGUubnVtX2VudHJpZXMgPSBNQVhfT1BFUkFORFM7Ci19Ci0KLS8qIFN1YnJvdXRpbmUgb2YgbTMycl9jZ2VuX2NwdV9vcGVuIHRvIGJ1aWxkIHRoZSBoYXJkd2FyZSB0YWJsZS4KLSAgID8/PyBUaGlzIGNvdWxkIGxlYXZlIG91dCBpbnNucyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzcGVjaWZpZWQgbWFjaC9pc2EsCi0gICBidXQgdGhhdCB3b3VsZCBjYXVzZSBlcnJvcnMgbGlrZSAiZm9vIG9ubHkgc3VwcG9ydGVkIGJ5IGJhciIgdG8gYmVjb21lCi0gICAidW5rbm93biBpbnNuIiwgc28gZm9yIG5vdyB3ZSBpbmNsdWRlIGFsbCBpbnNucyBhbmQgcmVxdWlyZSB0aGUgYXBwIHRvCi0gICBkbyB0aGUgY2hlY2tpbmcgbGF0ZXIuCi0gICA/Pz8gT24gdGhlIG90aGVyIGhhbmQsIHBhcnNpbmcgb2Ygc3VjaCBpbnNucyBtYXkgcmVxdWlyZSB0aGVpciBoYXJkd2FyZSBvcgotICAgb3BlcmFuZCBlbGVtZW50cyB0byBiZSBpbiB0aGUgdGFibGUgW3doaWNoIHRoZXkgbWlnaHRuJ3QgYmVdLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2luc25fdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9UQUJMRSAqY2Q7Ci17Ci0gIGludCBpOwotICBjb25zdCBDR0VOX0lCQVNFICppYiA9ICYgbTMycl9jZ2VuX2luc25fdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKE1BWF9JTlNOUyAqIHNpemVvZiAoQ0dFTl9JTlNOKSk7Ci0KLSAgbWVtc2V0IChpbnNucywgMCwgTUFYX0lOU05TICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOUzsgKytpKQotICAgIGluc25zW2ldLmJhc2UgPSAmaWJbaV07Ci0gIGNkLT5pbnNuX3RhYmxlLmluaXRfZW50cmllcyA9IGluc25zOwotICBjZC0+aW5zbl90YWJsZS5lbnRyeV9zaXplID0gc2l6ZW9mIChDR0VOX0lCQVNFKTsKLSAgY2QtPmluc25fdGFibGUubnVtX2luaXRfZW50cmllcyA9IE1BWF9JTlNOUzsKLX0KLQotLyogU3Vicm91dGluZSBvZiBtMzJyX2NnZW5fY3B1X29wZW4gdG8gcmVidWlsZCB0aGUgdGFibGVzLiAgKi8KLQotc3RhdGljIHZvaWQKLW0zMnJfY2dlbl9yZWJ1aWxkX3RhYmxlcyAoY2QpCi0gICAgIENHRU5fQ1BVX1RBQkxFICpjZDsKLXsKLSAgaW50IGksbl9pc2FzLG5fbWFjaHM7Ci0gIHVuc2lnbmVkIGludCBpc2FzID0gY2QtPmlzYXM7Ci0gIHVuc2lnbmVkIGludCBtYWNocyA9IGNkLT5tYWNoczsKLQotICBjZC0+aW50X2luc25fcCA9IENHRU5fSU5UX0lOU05fUDsKLQotICAvKiBEYXRhIGRlcml2ZWQgZnJvbSB0aGUgaXNhIHNwZWMuICAqLwotI2RlZmluZSBVTlNFVCAoQ0dFTl9TSVpFX1VOS05PV04gKyAxKQotICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBVTlNFVDsKLSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gVU5TRVQ7Ci0gIGNkLT5taW5faW5zbl9iaXRzaXplID0gNjU1MzU7IC8qIHNvbWUgcmlkaWN1bG91c2x5IGJpZyBudW1iZXIgKi8KLSAgY2QtPm1heF9pbnNuX2JpdHNpemUgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lTQVM7ICsraSkKLSAgICBpZiAoKCgxIDw8IGkpICYgaXNhcykgIT0gMCkKLSAgICAgIHsKLQljb25zdCBDR0VOX0lTQSAqaXNhID0gJiBtMzJyX2NnZW5faXNhX3RhYmxlW2ldOwotCi0JLyogRGVmYXVsdCBpbnNuIHNpemVzIG9mIGFsbCBzZWxlY3RlZCBpc2FzIG11c3QgYmUgZXF1YWwgb3Igd2Ugc2V0Ci0JICAgdGhlIHJlc3VsdCB0byAwLCBtZWFuaW5nICJ1bmtub3duIi4gICovCi0JaWYgKGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9PSBVTlNFVCkKLQkgIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9IGlzYS0+ZGVmYXVsdF9pbnNuX2JpdHNpemU7Ci0JZWxzZSBpZiAoaXNhLT5kZWZhdWx0X2luc25fYml0c2l6ZSA9PSBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUpCi0JICA7IC8qIHRoaXMgaXMgb2sgKi8KLQllbHNlCi0JICBjZC0+ZGVmYXVsdF9pbnNuX2JpdHNpemUgPSBDR0VOX1NJWkVfVU5LTk9XTjsKLQotCS8qIEJhc2UgaW5zbiBzaXplcyBvZiBhbGwgc2VsZWN0ZWQgaXNhcyBtdXN0IGJlIGVxdWFsIG9yIHdlIHNldAotCSAgIHRoZSByZXN1bHQgdG8gMCwgbWVhbmluZyAidW5rbm93biIuICAqLwotCWlmIChjZC0+YmFzZV9pbnNuX2JpdHNpemUgPT0gVU5TRVQpCi0JICBjZC0+YmFzZV9pbnNuX2JpdHNpemUgPSBpc2EtPmJhc2VfaW5zbl9iaXRzaXplOwotCWVsc2UgaWYgKGlzYS0+YmFzZV9pbnNuX2JpdHNpemUgPT0gY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotCSAgOyAvKiB0aGlzIGlzIG9rICovCi0JZWxzZQotCSAgY2QtPmJhc2VfaW5zbl9iaXRzaXplID0gQ0dFTl9TSVpFX1VOS05PV047Ci0KLQkvKiBTZXQgbWluLG1heCBpbnNuIHNpemVzLiAgKi8KLQlpZiAoaXNhLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPm1pbl9pbnNuX2JpdHNpemUpCi0JICBjZC0+bWluX2luc25fYml0c2l6ZSA9IGlzYS0+bWluX2luc25fYml0c2l6ZTsKLQlpZiAoaXNhLT5tYXhfaW5zbl9iaXRzaXplID4gY2QtPm1heF9pbnNuX2JpdHNpemUpCi0JICBjZC0+bWF4X2luc25fYml0c2l6ZSA9IGlzYS0+bWF4X2luc25fYml0c2l6ZTsKLQotCSsrbl9pc2FzOwotICAgICAgfQotCi0gIC8qIERhdGEgZGVyaXZlZCBmcm9tIHRoZSBtYWNoIHNwZWMuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX01BQ0hTOyArK2kpCi0gICAgaWYgKCgoMSA8PCBpKSAmIG1hY2hzKSAhPSAwKQotICAgICAgewotCWNvbnN0IENHRU5fTUFDSCAqbWFjaCA9ICYgbTMycl9jZ2VuX21hY2hfdGFibGVbaV07Ci0KLQkrK25fbWFjaHM7Ci0gICAgICB9Ci0KLSAgLyogRGV0ZXJtaW5lIHdoaWNoIGh3IGVsZW1lbnRzIGFyZSB1c2VkIGJ5IE1BQ0guICAqLwotICBidWlsZF9od190YWJsZSAoY2QpOwotCi0gIC8qIEJ1aWxkIHRoZSBpZmllbGQgdGFibGUuICAqLwotICBidWlsZF9pZmllbGRfdGFibGUgKGNkKTsKLQotICAvKiBEZXRlcm1pbmUgd2hpY2ggb3BlcmFuZHMgYXJlIHVzZWQgYnkgTUFDSC9JU0EuICAqLwotICBidWlsZF9vcGVyYW5kX3RhYmxlIChjZCk7Ci0KLSAgLyogQnVpbGQgdGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLSAgYnVpbGRfaW5zbl90YWJsZSAoY2QpOwotfQotCi0vKiBJbml0aWFsaXplIGEgY3B1IHRhYmxlIGFuZCByZXR1cm4gYSBkZXNjcmlwdG9yLgotICAgSXQncyBtdWNoIGxpa2Ugb3BlbmluZyBhIGZpbGUsIGFuZCBtdXN0IGJlIHRoZSBmaXJzdCBmdW5jdGlvbiBjYWxsZWQuCi0gICBUaGUgYXJndW1lbnRzIGFyZSBhIHNldCBvZiAodHlwZS92YWx1ZSkgcGFpcnMsIHRlcm1pbmF0ZWQgd2l0aAotICAgQ0dFTl9DUFVfT1BFTl9FTkQuCi0KLSAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzOgotICAgQ0dFTl9DUFVfT1BFTl9JU0FTOiAgICBiaXRtYXAgb2YgdmFsdWVzIGluIGVudW0gaXNhX2F0dHIKLSAgIENHRU5fQ1BVX09QRU5fTUFDSFM6ICAgYml0bWFwIG9mIHZhbHVlcyBpbiBlbnVtIG1hY2hfYXR0cgotICAgQ0dFTl9DUFVfT1BFTl9CRkRNQUNIOiBzcGVjaWZ5IDEgbWFjaCB1c2luZyBiZmQgbmFtZQotICAgQ0dFTl9DUFVfT1BFTl9FTkRJQU46ICBzcGVjaWZ5IGVuZGlhbiBjaG9pY2UKLSAgIENHRU5fQ1BVX09QRU5fRU5EOiAgICAgdGVybWluYXRlcyBhcmd1bWVudHMKLQotICAgPz8/IFNpbXVsdGFuZW91cyBtdWx0aXBsZSBpc2FzIG1pZ2h0IG5vdCBtYWtlIHNlbnNlLCBidXQgaXQncyBub3QgKHlldCkKLSAgIHByZWNsdWRlZC4KLQotICAgPz8/IFdlIG9ubHkgc3VwcG9ydCBJU08gQyBzdGRhcmdzIGhlcmUsIG5vdCBLJlIuCi0gICBMYXppbmVzcywgcGx1cyBleHBlcmltZW50IHRvIHNlZSBpZiBhbnl0aGluZyByZXF1aXJlcyBLJlIgLSBldmVudHVhbGx5Ci0gICBLJlIgd2lsbCBubyBsb25nZXIgYmUgc3VwcG9ydGVkIC0gZS5nLiBHREIgaXMgY3VycmVudGx5IHRyeWluZyB0aGlzLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotbTMycl9jZ2VuX2NwdV9vcGVuIChlbnVtIGNnZW5fY3B1X29wZW5fYXJnIGFyZ190eXBlLCAuLi4pCi17Ci0gIENHRU5fQ1BVX1RBQkxFICpjZCA9IChDR0VOX0NQVV9UQUJMRSAqKSB4bWFsbG9jIChzaXplb2YgKENHRU5fQ1BVX1RBQkxFKSk7Ci0gIHN0YXRpYyBpbnQgaW5pdF9wOwotICB1bnNpZ25lZCBpbnQgaXNhcyA9IDA7ICAvKiAwID0gInVuc3BlY2lmaWVkIiAqLwotICB1bnNpZ25lZCBpbnQgbWFjaHMgPSAwOyAvKiAwID0gInVuc3BlY2lmaWVkIiAqLwotICBlbnVtIGNnZW5fZW5kaWFuIGVuZGlhbiA9IENHRU5fRU5ESUFOX1VOS05PV047Ci0gIHZhX2xpc3QgYXA7Ci0KLSAgaWYgKCEgaW5pdF9wKQotICAgIHsKLSAgICAgIGluaXRfdGFibGVzICgpOwotICAgICAgaW5pdF9wID0gMTsKLSAgICB9Ci0KLSAgbWVtc2V0IChjZCwgMCwgc2l6ZW9mICgqY2QpKTsKLQotICB2YV9zdGFydCAoYXAsIGFyZ190eXBlKTsKLSAgd2hpbGUgKGFyZ190eXBlICE9IENHRU5fQ1BVX09QRU5fRU5EKQotICAgIHsKLSAgICAgIHN3aXRjaCAoYXJnX3R5cGUpCi0JewotCWNhc2UgQ0dFTl9DUFVfT1BFTl9JU0FTIDoKLQkgIGlzYXMgPSB2YV9hcmcgKGFwLCB1bnNpZ25lZCBpbnQpOwotCSAgYnJlYWs7Ci0JY2FzZSBDR0VOX0NQVV9PUEVOX01BQ0hTIDoKLQkgIG1hY2hzID0gdmFfYXJnIChhcCwgdW5zaWduZWQgaW50KTsKLQkgIGJyZWFrOwotCWNhc2UgQ0dFTl9DUFVfT1BFTl9CRkRNQUNIIDoKLQkgIHsKLQkgICAgY29uc3QgY2hhciAqbmFtZSA9IHZhX2FyZyAoYXAsIGNvbnN0IGNoYXIgKik7Ci0JICAgIGNvbnN0IENHRU5fTUFDSCAqbWFjaCA9Ci0JICAgICAgbG9va3VwX21hY2hfdmlhX2JmZF9uYW1lIChtMzJyX2NnZW5fbWFjaF90YWJsZSwgbmFtZSk7Ci0KLQkgICAgbWFjaHMgfD0gbWFjaC0+bnVtIDw8IDE7Ci0JICAgIGJyZWFrOwotCSAgfQotCWNhc2UgQ0dFTl9DUFVfT1BFTl9FTkRJQU4gOgotCSAgZW5kaWFuID0gdmFfYXJnIChhcCwgZW51bSBjZ2VuX2VuZGlhbik7Ci0JICBicmVhazsKLQlkZWZhdWx0IDoKLQkgIGZwcmludGYgKHN0ZGVyciwgIm0zMnJfY2dlbl9jcHVfb3BlbjogdW5zdXBwb3J0ZWQgYXJndW1lbnQgYCVkJ1xuIiwKLQkJICAgYXJnX3R5cGUpOwotCSAgYWJvcnQgKCk7IC8qID8/PyByZXR1cm4gTlVMTD8gKi8KLQl9Ci0gICAgICBhcmdfdHlwZSA9IHZhX2FyZyAoYXAsIGVudW0gY2dlbl9jcHVfb3Blbl9hcmcpOwotICAgIH0KLSAgdmFfZW5kIChhcCk7Ci0KLSAgLyogbWFjaCB1bnNwZWNpZmllZCBtZWFucyAiYWxsIiAqLwotICBpZiAobWFjaHMgPT0gMCkKLSAgICBtYWNocyA9ICgxIDw8IE1BWF9NQUNIUykgLSAxOwotICAvKiBiYXNlIG1hY2ggaXMgYWx3YXlzIHNlbGVjdGVkICovCi0gIG1hY2hzIHw9IDE7Ci0gIC8qIGlzYSB1bnNwZWNpZmllZCBtZWFucyAiYWxsIiAqLwotICBpZiAoaXNhcyA9PSAwKQotICAgIGlzYXMgPSAoMSA8PCBNQVhfSVNBUykgLSAxOwotICBpZiAoZW5kaWFuID09IENHRU5fRU5ESUFOX1VOS05PV04pCi0gICAgewotICAgICAgLyogPz8/IElmIHRhcmdldCBoYXMgb25seSBvbmUsIGNvdWxkIGhhdmUgYSBkZWZhdWx0LiAgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgIm0zMnJfY2dlbl9jcHVfb3Blbjogbm8gZW5kaWFubmVzcyBzcGVjaWZpZWRcbiIpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIGNkLT5pc2FzID0gaXNhczsKLSAgY2QtPm1hY2hzID0gbWFjaHM7Ci0gIGNkLT5lbmRpYW4gPSBlbmRpYW47Ci0gIC8qIEZJWE1FOiBmb3IgdGhlIHNwYXJjIGNhc2Ugd2UgY2FuIGRldGVybWluZSBpbnNuLWVuZGlhbm5lc3Mgc3RhdGljYWxseS4KLSAgICAgVGhlIHdvcnJ5IGhlcmUgaXMgd2hlcmUgYm90aCBkYXRhIGFuZCBpbnNuIGVuZGlhbiBjYW4gYmUgaW5kZXBlbmRlbnRseQotICAgICBjaG9zZW4sIGluIHdoaWNoIGNhc2UgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgYW5vdGhlciBhcmd1bWVudC4KLSAgICAgQWN0dWFsbHksIHdpbGwgd2FudCB0byBhbGxvdyBmb3IgbW9yZSBhcmd1bWVudHMgaW4gdGhlIGZ1dHVyZSBhbnl3YXkuICAqLwotICBjZC0+aW5zbl9lbmRpYW4gPSBlbmRpYW47Ci0KLSAgLyogVGFibGUgKHJlKWJ1aWxkZXIuICAqLwotICBjZC0+cmVidWlsZF90YWJsZXMgPSBtMzJyX2NnZW5fcmVidWlsZF90YWJsZXM7Ci0gIG0zMnJfY2dlbl9yZWJ1aWxkX3RhYmxlcyAoY2QpOwotCi0gIHJldHVybiAoQ0dFTl9DUFVfREVTQykgY2Q7Ci19Ci0KLS8qIENvdmVyIGZuIHRvIG0zMnJfY2dlbl9jcHVfb3BlbiB0byBoYW5kbGUgdGhlIHNpbXBsZSBjYXNlIG9mIDEgaXNhLCAxIG1hY2guCi0gICBNQUNIX05BTUUgaXMgdGhlIGJmZCBuYW1lIG9mIHRoZSBtYWNoLiAgKi8KLQotQ0dFTl9DUFVfREVTQwotbTMycl9jZ2VuX2NwdV9vcGVuXzEgKG1hY2hfbmFtZSwgZW5kaWFuKQotICAgICBjb25zdCBjaGFyICptYWNoX25hbWU7Ci0gICAgIGVudW0gY2dlbl9lbmRpYW4gZW5kaWFuOwotewotICByZXR1cm4gbTMycl9jZ2VuX2NwdV9vcGVuIChDR0VOX0NQVV9PUEVOX0JGRE1BQ0gsIG1hY2hfbmFtZSwKLQkJCSAgICAgICBDR0VOX0NQVV9PUEVOX0VORElBTiwgZW5kaWFuLAotCQkJICAgICAgIENHRU5fQ1BVX09QRU5fRU5EKTsKLX0KLQotLyogQ2xvc2UgYSBjcHUgdGFibGUuCi0gICA/Pz8gVGhpcyBjYW4gbGl2ZSBpbiBhIG1hY2hpbmUgaW5kZXBlbmRlbnQgZmlsZSwgYnV0IHRoZXJlJ3MgY3VycmVudGx5Ci0gICBubyBwbGFjZSB0byBwdXQgdGhpcyBmaWxlICh0aGVyZSdzIG5vIGxpYmNnZW4pLiAgbGlib3Bjb2RlcyBpcyB0aGUgd3JvbmcKLSAgIHBsYWNlIGFzIHNvbWUgc2ltdWxhdG9yIHBvcnRzIHVzZSB0aGlzIGJ1dCB0aGV5IGRvbid0IHVzZSBsaWJvcGNvZGVzLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX2NwdV9jbG9zZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGlmIChjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSU5TTiAqKSBjZC0+aW5zbl90YWJsZS5pbml0X2VudHJpZXMpOwotICBpZiAoY2QtPmh3X3RhYmxlLmVudHJpZXMpCi0gICAgZnJlZSAoKENHRU5fSFdfRU5UUlkgKikgY2QtPmh3X3RhYmxlLmVudHJpZXMpOwotICBmcmVlIChjZCk7Ci19Ci0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kZXNjLmggYi9vcGNvZGVzL20zMnItZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM2MzZjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTMyci1kZXNjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyogQ1BVIGRhdGEgaGVhZGVyIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaWZuZGVmIE0zMlJfQ1BVX0gKLSNkZWZpbmUgTTMyUl9DUFVfSAotCi0jZGVmaW5lIENHRU5fQVJDSCBtMzJyCi0KLS8qIEdpdmVuIHN5bWJvbCBTLCByZXR1cm4gbTMycl9jZ2VuXzxTPi4gICovCi0jZGVmaW5lIENHRU5fU1lNKHMpIENPTkNBVDMgKG0zMnIsX2NnZW5fLHMpCi0KLS8qIFNlbGVjdGVkIGNwdSBmYW1pbGllcy4gICovCi0jZGVmaW5lIEhBVkVfQ1BVX00zMlJCRgotCi0jZGVmaW5lIENHRU5fSU5TTl9MU0IwX1AgMAotCi0vKiBNYXhpbXVtIHNpemUgb2YgYW55IGluc24gKGluIGJ5dGVzKS4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fU0laRSA0Ci0KLSNkZWZpbmUgQ0dFTl9JTlRfSU5TTl9QIDEKLQotLyogRklYTUU6IE5lZWQgdG8gY29tcHV0ZSBDR0VOX01BWF9TWU5UQVhfQllURVMuICAqLwotCi0vKiBDR0VOX01ORU1PTklDX09QRVJBTkRTIGlzIGRlZmluZWQgaWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMuCi0gICBlLmcuIEluICJiLGEgZm9vIiB0aGUgIixhIiBpcyBhbiBvcGVyYW5kLiAgSWYgbW5lbW9uaWNzIGhhdmUgb3BlcmFuZHMKLSAgIHdlIGNhbid0IGhhc2ggb24gZXZlcnl0aGluZyB1cCB0byB0aGUgc3BhY2UuICAqLwotI2RlZmluZSBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyBhbnkgaW5zbiBvciBtYWNyby1pbnNuIGhhcy4gICovCi0jZGVmaW5lIENHRU5fTUFYX0lOU05fT1BFUkFORFMgMTYKLQotLyogTWF4aW11bSBudW1iZXIgb2YgZmllbGRzIGluIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQ0dFTl9NQVhfSUZNVF9PUEVSQU5EUyA3Ci0KLS8qIEVudW1zLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zbiBmb3JtYXQgZW51bXMuICAqLwotdHlwZWRlZiBlbnVtIGluc25fb3AxIHsKLSAgT1AxXzAsIE9QMV8xLCBPUDFfMiwgT1AxXzMKLSAsIE9QMV80LCBPUDFfNSwgT1AxXzYsIE9QMV83Ci0gLCBPUDFfOCwgT1AxXzksIE9QMV8xMCwgT1AxXzExCi0gLCBPUDFfMTIsIE9QMV8xMywgT1AxXzE0LCBPUDFfMTUKLX0gSU5TTl9PUDE7Ci0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG9wMiBlbnVtcy4gICovCi10eXBlZGVmIGVudW0gaW5zbl9vcDIgewotICBPUDJfMCwgT1AyXzEsIE9QMl8yLCBPUDJfMwotICwgT1AyXzQsIE9QMl81LCBPUDJfNiwgT1AyXzcKLSAsIE9QMl84LCBPUDJfOSwgT1AyXzEwLCBPUDJfMTEKLSAsIE9QMl8xMiwgT1AyXzEzLCBPUDJfMTQsIE9QMl8xNQotfSBJTlNOX09QMjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgLiAgKi8KLXR5cGVkZWYgZW51bSBncl9uYW1lcyB7Ci0gIEhfR1JfRlAgPSAxMywgSF9HUl9MUiA9IDE0LCBIX0dSX1NQID0gMTUsIEhfR1JfUjAgPSAwCi0gLCBIX0dSX1IxID0gMSwgSF9HUl9SMiA9IDIsIEhfR1JfUjMgPSAzLCBIX0dSX1I0ID0gNAotICwgSF9HUl9SNSA9IDUsIEhfR1JfUjYgPSA2LCBIX0dSX1I3ID0gNywgSF9HUl9SOCA9IDgKLSAsIEhfR1JfUjkgPSA5LCBIX0dSX1IxMCA9IDEwLCBIX0dSX1IxMSA9IDExLCBIX0dSX1IxMiA9IDEyCi0gLCBIX0dSX1IxMyA9IDEzLCBIX0dSX1IxNCA9IDE0LCBIX0dSX1IxNSA9IDE1Ci19IEdSX05BTUVTOwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciAuICAqLwotdHlwZWRlZiBlbnVtIGNyX25hbWVzIHsKLSAgSF9DUl9QU1cgPSAwLCBIX0NSX0NCUiA9IDEsIEhfQ1JfU1BJID0gMiwgSF9DUl9TUFUgPSAzCi0gLCBIX0NSX0JQQyA9IDYsIEhfQ1JfQkJQU1cgPSA4LCBIX0NSX0JCUEMgPSAxNCwgSF9DUl9DUjAgPSAwCi0gLCBIX0NSX0NSMSA9IDEsIEhfQ1JfQ1IyID0gMiwgSF9DUl9DUjMgPSAzLCBIX0NSX0NSNCA9IDQKLSAsIEhfQ1JfQ1I1ID0gNSwgSF9DUl9DUjYgPSA2LCBIX0NSX0NSNyA9IDcsIEhfQ1JfQ1I4ID0gOAotICwgSF9DUl9DUjkgPSA5LCBIX0NSX0NSMTAgPSAxMCwgSF9DUl9DUjExID0gMTEsIEhfQ1JfQ1IxMiA9IDEyCi0gLCBIX0NSX0NSMTMgPSAxMywgSF9DUl9DUjE0ID0gMTQsIEhfQ1JfQ1IxNSA9IDE1Ci19IENSX05BTUVTOwotCi0vKiBBdHRyaWJ1dGVzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbWFjaGluZSB0eXBlIHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gbWFjaF9hdHRyIHsKLSAgTUFDSF9CQVNFLCBNQUNIX00zMlIKLSAsIE1BQ0hfTUFYCi19IE1BQ0hfQVRUUjsKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgaW5zdHJ1Y3Rpb24gc2V0IHNlbGVjdGlvbi4gICovCi10eXBlZGVmIGVudW0gaXNhX2F0dHIgewotICBJU0FfTTMyUiwgSVNBX01BWAotfSBJU0FfQVRUUjsKLQotLyogTnVtYmVyIG9mIGFyY2hpdGVjdHVyZSB2YXJpYW50cy4gICovCi0jZGVmaW5lIE1BWF9JU0FTICAxCi0jZGVmaW5lIE1BWF9NQUNIUyAoKGludCkgTUFDSF9NQVgpCi0KLS8qIElmaWVsZCBzdXBwb3J0LiAgKi8KLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBjZ2VuX2lmbGQgbTMycl9jZ2VuX2lmbGRfdGFibGVbXTsKLQotLyogSWZpZWxkIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9pZmxkIGF0dHJzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2lmbGRfYXR0ciB7Ci0gIENHRU5fSUZMRF9WSVJUVUFMLCBDR0VOX0lGTERfUENSRUxfQUREUiwgQ0dFTl9JRkxEX0FCU19BRERSLCBDR0VOX0lGTERfUkVTRVJWRUQKLSAsIENHRU5fSUZMRF9TSUdOX09QVCwgQ0dFTl9JRkxEX1NJR05FRCwgQ0dFTl9JRkxEX1JFTE9DLCBDR0VOX0lGTERfRU5EX0JPT0xTCi0gLCBDR0VOX0lGTERfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSUZMRF9NQUNILCBDR0VOX0lGTERfRU5EX05CT09MUwotfSBDR0VOX0lGTERfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faWZsZF9hdHRyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JRkxEX05CT09MX0FUVFJTIChDR0VOX0lGTERfRU5EX05CT09MUyAtIENHRU5fSUZMRF9TVEFSVF9OQk9PTFMgLSAxKQotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGlmaWVsZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gaWZpZWxkX3R5cGUgewotICBNMzJSX0ZfTklMLCBNMzJSX0ZfT1AxLCBNMzJSX0ZfT1AyLCBNMzJSX0ZfQ09ORAotICwgTTMyUl9GX1IxLCBNMzJSX0ZfUjIsIE0zMlJfRl9TSU1NOCwgTTMyUl9GX1NJTU0xNgotICwgTTMyUl9GX1NISUZUX09QMiwgTTMyUl9GX1VJTU00LCBNMzJSX0ZfVUlNTTUsIE0zMlJfRl9VSU1NMTYKLSAsIE0zMlJfRl9VSU1NMjQsIE0zMlJfRl9ISTE2LCBNMzJSX0ZfRElTUDgsIE0zMlJfRl9ESVNQMTYKLSAsIE0zMlJfRl9ESVNQMjQKLSAsIE0zMlJfRl9NQVgKLX0gSUZJRUxEX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0lGTEQgKChpbnQpIE0zMlJfRl9NQVgpCi0KLS8qIEhhcmR3YXJlIGF0dHJpYnV0ZSBpbmRpY2VzLiAgKi8KLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgY2dlbl9odyBhdHRycy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od19hdHRyIHsKLSAgQ0dFTl9IV19WSVJUVUFMLCBDR0VOX0hXX0NBQ0hFX0FERFIsIENHRU5fSFdfUEMsIENHRU5fSFdfUFJPRklMRQotICwgQ0dFTl9IV19FTkRfQk9PTFMsIENHRU5fSFdfU1RBUlRfTkJPT0xTID0gMzEsIENHRU5fSFdfTUFDSCwgQ0dFTl9IV19FTkRfTkJPT0xTCi19IENHRU5fSFdfQVRUUjsKLQotLyogTnVtYmVyIG9mIG5vbi1ib29sZWFuIGVsZW1lbnRzIGluIGNnZW5faHdfYXR0ci4gICovCi0jZGVmaW5lIENHRU5fSFdfTkJPT0xfQVRUUlMgKENHRU5fSFdfRU5EX05CT09MUyAtIENHRU5fSFdfU1RBUlRfTkJPT0xTIC0gMSkKLQotLyogRW51bSBkZWNsYXJhdGlvbiBmb3IgbTMyciBoYXJkd2FyZSB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9od190eXBlIHsKLSAgSFdfSF9NRU1PUlksIEhXX0hfU0lOVCwgSFdfSF9VSU5ULCBIV19IX0FERFIKLSAsIEhXX0hfSUFERFIsIEhXX0hfUEMsIEhXX0hfSEkxNiwgSFdfSF9TTE8xNgotICwgSFdfSF9VTE8xNiwgSFdfSF9HUiwgSFdfSF9DUiwgSFdfSF9BQ0NVTQotICwgSFdfSF9DT05ELCBIV19IX1BTVywgSFdfSF9CUFNXLCBIV19IX0JCUFNXCi0gLCBIV19IX0xPQ0ssIEhXX01BWAotfSBDR0VOX0hXX1RZUEU7Ci0KLSNkZWZpbmUgTUFYX0hXICgoaW50KSBIV19NQVgpCi0KLS8qIE9wZXJhbmQgYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX29wZXJhbmQgYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5fb3BlcmFuZF9hdHRyIHsKLSAgQ0dFTl9PUEVSQU5EX1ZJUlRVQUwsIENHRU5fT1BFUkFORF9QQ1JFTF9BRERSLCBDR0VOX09QRVJBTkRfQUJTX0FERFIsIENHRU5fT1BFUkFORF9TSUdOX09QVAotICwgQ0dFTl9PUEVSQU5EX1NJR05FRCwgQ0dFTl9PUEVSQU5EX05FR0FUSVZFLCBDR0VOX09QRVJBTkRfUkVMQVgsIENHRU5fT1BFUkFORF9TRU1fT05MWQotICwgQ0dFTl9PUEVSQU5EX1JFTE9DLCBDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgsIENHRU5fT1BFUkFORF9FTkRfQk9PTFMsIENHRU5fT1BFUkFORF9TVEFSVF9OQk9PTFMgPSAzMQotICwgQ0dFTl9PUEVSQU5EX01BQ0gsIENHRU5fT1BFUkFORF9FTkRfTkJPT0xTCi19IENHRU5fT1BFUkFORF9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9vcGVyYW5kX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX09QRVJBTkRfTkJPT0xfQVRUUlMgKENHRU5fT1BFUkFORF9FTkRfTkJPT0xTIC0gQ0dFTl9PUEVSQU5EX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIEVudW0gZGVjbGFyYXRpb24gZm9yIG0zMnIgb3BlcmFuZCB0eXBlcy4gICovCi10eXBlZGVmIGVudW0gY2dlbl9vcGVyYW5kX3R5cGUgewotICBNMzJSX09QRVJBTkRfUEMsIE0zMlJfT1BFUkFORF9TUiwgTTMyUl9PUEVSQU5EX0RSLCBNMzJSX09QRVJBTkRfU1JDMQotICwgTTMyUl9PUEVSQU5EX1NSQzIsIE0zMlJfT1BFUkFORF9TQ1IsIE0zMlJfT1BFUkFORF9EQ1IsIE0zMlJfT1BFUkFORF9TSU1NOAotICwgTTMyUl9PUEVSQU5EX1NJTU0xNiwgTTMyUl9PUEVSQU5EX1VJTU00LCBNMzJSX09QRVJBTkRfVUlNTTUsIE0zMlJfT1BFUkFORF9VSU1NMTYKLSAsIE0zMlJfT1BFUkFORF9IQVNILCBNMzJSX09QRVJBTkRfSEkxNiwgTTMyUl9PUEVSQU5EX1NMTzE2LCBNMzJSX09QRVJBTkRfVUxPMTYKLSAsIE0zMlJfT1BFUkFORF9VSU1NMjQsIE0zMlJfT1BFUkFORF9ESVNQOCwgTTMyUl9PUEVSQU5EX0RJU1AxNiwgTTMyUl9PUEVSQU5EX0RJU1AyNAotICwgTTMyUl9PUEVSQU5EX0NPTkRCSVQsIE0zMlJfT1BFUkFORF9BQ0NVTSwgTTMyUl9PUEVSQU5EX01BWAotfSBDR0VOX09QRVJBTkRfVFlQRTsKLQotLyogTnVtYmVyIG9mIG9wZXJhbmRzIHR5cGVzLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRTICgoaW50KSBNMzJSX09QRVJBTkRfTUFYKQotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBvcGVyYW5kcyByZWZlcmVuY2VkIGJ5IGFueSBpbnNuLiAgKi8KLSNkZWZpbmUgTUFYX09QRVJBTkRfSU5TVEFOQ0VTIDExCi0KLS8qIEluc24gYXR0cmlidXRlIGluZGljZXMuICAqLwotCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBjZ2VuX2luc24gYXR0cnMuICAqLwotdHlwZWRlZiBlbnVtIGNnZW5faW5zbl9hdHRyIHsKLSAgQ0dFTl9JTlNOX0FMSUFTLCBDR0VOX0lOU05fVklSVFVBTCwgQ0dFTl9JTlNOX1VOQ09ORF9DVEksIENHRU5fSU5TTl9DT05EX0NUSQotICwgQ0dFTl9JTlNOX1NLSVBfQ1RJLCBDR0VOX0lOU05fREVMQVlfU0xPVCwgQ0dFTl9JTlNOX1JFTEFYQUJMRSwgQ0dFTl9JTlNOX1JFTEFYCi0gLCBDR0VOX0lOU05fTk9fRElTLCBDR0VOX0lOU05fUEJCLCBDR0VOX0lOU05fRklMTF9TTE9ULCBDR0VOX0lOU05fU1BFQ0lBTAotICwgQ0dFTl9JTlNOX0VORF9CT09MUywgQ0dFTl9JTlNOX1NUQVJUX05CT09MUyA9IDMxLCBDR0VOX0lOU05fTUFDSCwgQ0dFTl9JTlNOX1BJUEUKLSAsIENHRU5fSU5TTl9FTkRfTkJPT0xTCi19IENHRU5fSU5TTl9BVFRSOwotCi0vKiBOdW1iZXIgb2Ygbm9uLWJvb2xlYW4gZWxlbWVudHMgaW4gY2dlbl9pbnNuX2F0dHIuICAqLwotI2RlZmluZSBDR0VOX0lOU05fTkJPT0xfQVRUUlMgKENHRU5fSU5TTl9FTkRfTkJPT0xTIC0gQ0dFTl9JTlNOX1NUQVJUX05CT09MUyAtIDEpCi0KLS8qIGNnZW4uaCB1c2VzIHRoaW5ncyB3ZSBqdXN0IGRlZmluZWQuICAqLwotI2luY2x1ZGUgIm9wY29kZS9jZ2VuLmgiCi0KLS8qIEF0dHJpYnV0ZXMuICAqLwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faGFyZHdhcmVfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faWZpZWxkX2F0dHJfdGFibGVbXTsKLWV4dGVybiBjb25zdCBDR0VOX0FUVFJfVEFCTEUgbTMycl9jZ2VuX29wZXJhbmRfYXR0cl90YWJsZVtdOwotZXh0ZXJuIGNvbnN0IENHRU5fQVRUUl9UQUJMRSBtMzJyX2NnZW5faW5zbl9hdHRyX3RhYmxlW107Ci0KLS8qIEhhcmR3YXJlIGRlY2xzLiAgKi8KLQotZXh0ZXJuIENHRU5fS0VZV09SRCBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXM7Ci1leHRlcm4gQ0dFTl9LRVlXT1JEIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lczsKLQotCi0KLQotI2VuZGlmIC8qIE0zMlJfQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1kaXMuYyBiL29wY29kZXMvbTMyci1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjNTkxYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGVyIGludGVyZmFjZSBmb3IgdGFyZ2V0cyB1c2luZyBDR0VOLiAtKi0gQyAtKi0KLSAgIENHRU46IENwdSB0b29scyBHRU5lcmF0b3IKLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLS0gdGhlIHJlc3VsdGFudCBmaWxlIGlzIG1hY2hpbmUgZ2VuZXJhdGVkLCBjZ2VuLWRpcy5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIERlZmF1bHQgdGV4dCB0byBwcmludCBpZiBhbiBpbnN0cnVjdGlvbiBpc24ndCByZWNvZ25pemVkLiAgKi8KLSNkZWZpbmUgVU5LTk9XTl9JTlNOX01TRyBfKCIqdW5rbm93bioiKQotCi1zdGF0aWMgdm9pZCBwcmludF9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBsb25nLCB1bnNpZ25lZCBpbnQsIGJmZF92bWEsIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfYWRkcmVzcwotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBQVFIsIGJmZF92bWEsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgaW50KSk7Ci1zdGF0aWMgdm9pZCBwcmludF9rZXl3b3JkCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIFBUUiwgQ0dFTl9LRVlXT1JEICosIGxvbmcsIHVuc2lnbmVkIGludCkpOwotc3RhdGljIHZvaWQgcHJpbnRfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgUFRSLCBjb25zdCBDR0VOX0lOU04gKiwgQ0dFTl9GSUVMRFMgKiwKLQkgICAgICBiZmRfdm1hLCBpbnQpKTsKLXN0YXRpYyBpbnQgcHJpbnRfaW5zbiBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBiZmRfdm1hLAotCQkJICAgICAgIGRpc2Fzc2VtYmxlX2luZm8gKiwgY2hhciAqLCBpbnQpKTsKLXN0YXRpYyBpbnQgZGVmYXVsdF9wcmludF9pbnNuCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotDAotLyogLS0gZGlzYXNzZW1ibGVyIHJvdXRpbmVzIGluc2VydGVkIGhlcmUgKi8KLQotLyogLS0gZGlzLmMgKi8KLQotLyogSW1tZWRpYXRlIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCAnIycuICAqLwotCi0jZGVmaW5lIENHRU5fUFJJTlRfTk9STUFMKGNkLCBpbmZvLCB2YWx1ZSwgYXR0cnMsIHBjLCBsZW5ndGgpIFwKLWRvIHsgXAotICBpZiAoQ0dFTl9CT09MX0FUVFIgKChhdHRycyksIENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCkpIFwKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMiKTsgXAotfSB3aGlsZSAoMCkKLQotLyogSGFuZGxlICcjJyBwcmVmaXhlcyBhcyBvcGVyYW5kcy4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9oYXNoIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIjIik7Ci19Ci0KLSN1bmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIG15X3ByaW50X2luc24KLQotc3RhdGljIGludAotbXlfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZmZlcltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBjaGFyICpidWYgPSBidWZmZXI7Ci0gIGludCBzdGF0dXM7Ci0gIGludCBidWZsZW4gPSAocGMgJiAzKSA9PSAwID8gNCA6IDI7Ci0KLSAgLyogUmVhZCB0aGUgYmFzZSBwYXJ0IG9mIHRoZSBpbnNuLiAgKi8KLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChwYywgYnVmLCBidWZsZW4sIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgcGMsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAvKiAzMiBiaXQgaW5zbj8gICovCi0gIGlmICgocGMgJiAzKSA9PSAwICYmIChidWZbMF0gJiAweDgwKSAhPSAwKQotICAgIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKTsKLQotICAvKiBQcmludCB0aGUgZmlyc3QgaW5zbi4gICovCi0gIGlmICgocGMgJiAzKSA9PSAwKQotICAgIHsKLSAgICAgIGlmIChwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgMikgPT0gMCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0gICAgICBidWYgKz0gMjsKLSAgICB9Ci0KLSAgaWYgKGJ1ZlswXSAmIDB4ODApCi0gICAgewotICAgICAgLyogUGFyYWxsZWwuICAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgfHwgIik7Ci0gICAgICBidWZbMF0gJj0gMHg3ZjsKLSAgICB9Ci0gIGVsc2UKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiAtPiAiKTsKLQotICAvKiBUaGUgIiYgMyIgaXMgdG8gcGFzcyBhIGNvbnNpc3RlbnQgYWRkcmVzcy4KLSAgICAgUGFyYWxsZWwgaW5zbnMgYXJndWFibHkgYm90aCBiZWdpbiBvbiB0aGUgd29yZCBib3VuZGFyeS4KLSAgICAgQWxzbywgYnJhbmNoIGluc25zIGFyZSBjYWxjdWxhdGVkIHJlbGF0aXZlIHRvIHRoZSB3b3JkIGJvdW5kYXJ5LiAgKi8KLSAgaWYgKHByaW50X2luc24gKGNkLCBwYyAmIH4gKGJmZF92bWEpIDMsIGluZm8sIGJ1ZiwgMikgPT0gMCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgVU5LTk9XTl9JTlNOX01TRyk7Ci0KLSAgcmV0dXJuIChwYyAmIDMpID8gMiA6IDQ7Ci19Ci0KLS8qIC0tICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnQgZm9yIHByaW50aW5nIG9wZXJhbmRzLgotICAgWElORk8gaXMgYSBgdm9pZCAqJyBhbmQgbm90IGEgYGRpc2Fzc2VtYmxlX2luZm8gKicgdG8gbm90IHB1dCBhIHJlcXVpcmVtZW50Ci0gICBvZiBkaXMtYXNtLmggb24gY2dlbi5oLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi12b2lkCi1tMzJyX2NnZW5fcHJpbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIHhpbmZvLCBmaWVsZHMsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgUFRSIHhpbmZvOwotICAgICBDR0VOX0ZJRUxEUyAqZmllbGRzOwotICAgICB2b2lkIGNvbnN0ICphdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSBkaXNhc3NlbWJsZV9pbmZvICppbmZvID0gKGRpc2Fzc2VtYmxlX2luZm8gKikgeGluZm87Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2NyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDE2LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHByaW50X2FkZHJlc3MgKGNkLCBpbmZvLCBmaWVsZHMtPmZfZGlzcDI0LCAwfCgxPDxDR0VOX09QRVJBTkRfUkVMQVgpfCgxPDxDR0VOX09QRVJBTkRfUkVMT0MpfCgxPDxDR0VOX09QRVJBTkRfUENSRUxfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl9kaXNwOCwgMHwoMTw8Q0dFTl9PUEVSQU5EX1JFTEFYKXwoMTw8Q0dFTl9PUEVSQU5EX1JFTE9DKXwoMTw8Q0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgcHJpbnRfaGFzaCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9uaWwsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX2hpMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdOX09QVCksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9jcl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTE2LCAwfCgxPDxDR0VOX09QRVJBTkRfU0lHTkVEKXwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfc2ltbTgsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fT1BFUkFORF9TSUdORUQpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIHByaW50X2tleXdvcmQgKGNkLCBpbmZvLCAmIG0zMnJfY2dlbl9vcHZhbF9ncl9uYW1lcywgZmllbGRzLT5mX3IyLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgcHJpbnRfa2V5d29yZCAoY2QsIGluZm8sICYgbTMycl9jZ2VuX29wdmFsX2dyX25hbWVzLCBmaWVsZHMtPmZfcjEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBwcmludF9rZXl3b3JkIChjZCwgaW5mbywgJiBtMzJyX2NnZW5fb3B2YWxfZ3JfbmFtZXMsIGZpZWxkcy0+Zl9yMiwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW0xNiwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgcHJpbnRfYWRkcmVzcyAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tMjQsIDB8KDE8PENHRU5fT1BFUkFORF9IQVNIX1BSRUZJWCl8KDE8PENHRU5fT1BFUkFORF9SRUxPQyl8KDE8PENHRU5fT1BFUkFORF9BQlNfQUREUiksIHBjLCBsZW5ndGgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgcHJpbnRfbm9ybWFsIChjZCwgaW5mbywgZmllbGRzLT5mX3VpbW00LCAwfCgxPDxDR0VOX09QRVJBTkRfSEFTSF9QUkVGSVgpLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIHByaW50X25vcm1hbCAoY2QsIGluZm8sIGZpZWxkcy0+Zl91aW1tNSwgMHwoMTw8Q0dFTl9PUEVSQU5EX0hBU0hfUFJFRklYKSwgcGMsIGxlbmd0aCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICBwcmludF9ub3JtYWwgKGNkLCBpbmZvLCBmaWVsZHMtPmZfdWltbTE2LCAwLCBwYywgbGVuZ3RoKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICBhYm9ydCAoKTsKLSAgfQotfQotCi1jZ2VuX3ByaW50X2ZuICogY29uc3QgbTMycl9jZ2VuX3ByaW50X2hhbmRsZXJzW10gPSAKLXsKLSAgcHJpbnRfaW5zbl9ub3JtYWwsCi19OwotCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X2RpcyAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIG0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpOwotICBtMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCk7Ci0gIGNkLT5wcmludF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX3ByaW50X2hhbmRsZXJzWzBdOwotICBjZC0+cHJpbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9wcmludF9vcGVyYW5kOwotfQotCi0MCi0vKiBEZWZhdWx0IHByaW50IGhhbmRsZXIuICAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfbm9ybWFsIChjZCwgZGlzX2luZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBsb25nIHZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGRpc2Fzc2VtYmxlX2luZm8gKmluZm8gPSAoZGlzYXNzZW1ibGVfaW5mbyAqKSBkaXNfaW5mbzsKLQotI2lmZGVmIENHRU5fUFJJTlRfTk9STUFMCi0gIENHRU5fUFJJTlRfTk9STUFMIChjZCwgaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKTsKLSNlbmRpZgotCi0gIC8qIFByaW50IHRoZSBvcGVyYW5kIGFzIGRpcmVjdGVkIGJ5IHRoZSBhdHRyaWJ1dGVzLiAgKi8KLSAgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NFTV9PTkxZKSkKLSAgICA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgZWxzZSBpZiAoQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX09QRVJBTkRfU0lHTkVEKSkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVsZCIsIHZhbHVlKTsKLSAgZWxzZQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHglbHgiLCB2YWx1ZSk7Ci19Ci0KLS8qIERlZmF1bHQgYWRkcmVzcyBoYW5kbGVyLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2FkZHJlc3MgKGNkLCBkaXNfaW5mbywgdmFsdWUsIGF0dHJzLCBwYywgbGVuZ3RoKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBQVFIgZGlzX2luZm87Ci0gICAgIGJmZF92bWEgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgaW50IGxlbmd0aDsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotCi0jaWZkZWYgQ0dFTl9QUklOVF9BRERSRVNTCi0gIENHRU5fUFJJTlRfQUREUkVTUyAoY2QsIGluZm8sIHZhbHVlLCBhdHRycywgcGMsIGxlbmd0aCk7Ci0jZW5kaWYKLQotICAvKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgYXR0cmlidXRlcy4gICovCi0gIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9TRU1fT05MWSkpCi0gICAgOyAvKiBub3RoaW5nIHRvIGRvICovCi0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1BDUkVMX0FERFIpKQotICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICBlbHNlIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fT1BFUkFORF9BQlNfQUREUikpCi0gICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWx1ZSwgaW5mbyk7Ci0gIGVsc2UgaWYgKENHRU5fQk9PTF9BVFRSIChhdHRycywgQ0dFTl9PUEVSQU5EX1NJR05FRCkpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCAobG9uZykgdmFsdWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCVseCIsIChsb25nKSB2YWx1ZSk7Ci19Ci0KLS8qIEtleXdvcmQgcHJpbnQgaGFuZGxlci4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9rZXl3b3JkIChjZCwgZGlzX2luZm8sIGtleXdvcmRfdGFibGUsIHZhbHVlLCBhdHRycykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBDR0VOX0tFWVdPUkQgKmtleXdvcmRfdGFibGU7Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGludCBhdHRyczsKLXsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCBDR0VOX0tFWVdPUkRfRU5UUlkgKmtlOwotCi0gIGtlID0gY2dlbl9rZXl3b3JkX2xvb2t1cF92YWx1ZSAoa2V5d29yZF90YWJsZSwgdmFsdWUpOwotICBpZiAoa2UgIT0gTlVMTCkKLSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwga2UtPm5hbWUpOwotICBlbHNlCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI/Pz8iKTsKLX0KLQwKLS8qIERlZmF1bHQgaW5zbiBwcmludGVyLgotCi0gICBESVNfSU5GTyBpcyBkZWZpbmVkIGFzIGBQVFInIHNvIHRoZSBkaXNhc3NlbWJsZXIgbmVlZG4ndCBrbm93IGFueXRoaW5nCi0gICBhYm91dCBkaXNhc3NlbWJsZV9pbmZvLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X2luc25fbm9ybWFsIChjZCwgZGlzX2luZm8sIGluc24sIGZpZWxkcywgcGMsIGxlbmd0aCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgUFRSIGRpc19pbmZvOwotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGludCBsZW5ndGg7Ci17Ci0gIGNvbnN0IENHRU5fU1lOVEFYICpzeW50YXggPSBDR0VOX0lOU05fU1lOVEFYIChpbnNuKTsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGRpc19pbmZvOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9JTklUX1BSSU5UIChjZCk7Ci0KLSAgZm9yIChzeW4gPSBDR0VOX1NZTlRBWF9TVFJJTkcgKHN5bnRheCk7ICpzeW47ICsrc3luKQotICAgIHsKLSAgICAgIGlmIChDR0VOX1NZTlRBWF9NTkVNT05JQ19QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgQ0dFTl9JTlNOX01ORU1PTklDIChpbnNuKSk7Ci0JICBjb250aW51ZTsKLQl9Ci0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQl7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgQ0dFTl9TWU5UQVhfQ0hBUiAoKnN5bikpOwotCSAgY29udGludWU7Ci0JfQotCi0gICAgICAvKiBXZSBoYXZlIGFuIG9wZXJhbmQuICAqLwotICAgICAgbTMycl9jZ2VuX3ByaW50X29wZXJhbmQgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksIGluZm8sCi0JCQkJIGZpZWxkcywgQ0dFTl9JTlNOX0FUVFJTIChpbnNuKSwgcGMsIGxlbmd0aCk7Ci0gICAgfQotfQotDAotLyogVXRpbGl0eSB0byBwcmludCBhbiBpbnNuLgotICAgQlVGIGlzIHRoZSBiYXNlIHBhcnQgb2YgdGhlIGluc24sIHRhcmdldCBieXRlIG9yZGVyLCBCVUZMRU4gYnl0ZXMgbG9uZy4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnMgZmV0Y2hpbmcgZGF0YSAobWVtb3J5X2Vycm9yX2Z1bmMgd2lsbCBoYXZlCi0gICBiZWVuIGNhbGxlZCkuICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgYnVmbGVuKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBjaGFyICpidWY7Ci0gICAgIGludCBidWZsZW47Ci17Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbl92YWx1ZTsKLSAgY29uc3QgQ0dFTl9JTlNOX0xJU1QgKmluc25fbGlzdDsKLSAgQ0dFTl9FWFRSQUNUX0lORk8gZXhfaW5mbzsKLQotICBleF9pbmZvLmRpc19pbmZvID0gaW5mbzsKLSAgZXhfaW5mby52YWxpZCA9ICgxIDw8IChjZC0+YmFzZV9pbnNuX2JpdHNpemUgLyA4KSkgLSAxOwotICBleF9pbmZvLmluc25fYnl0ZXMgPSBidWY7Ci0KLSAgc3dpdGNoIChidWZsZW4pCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIGluc25fdmFsdWUgPSBidWZbMF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIxNiAoYnVmKSA6IGJmZF9nZXRsMTYgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBpbnNuX3ZhbHVlID0gaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHID8gYmZkX2dldGIzMiAoYnVmKSA6IGJmZF9nZXRsMzIgKGJ1Zik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFRoZSBpbnN0cnVjdGlvbnMgYXJlIHN0b3JlZCBpbiBoYXNoIGxpc3RzLgotICAgICBQaWNrIHRoZSBmaXJzdCBvbmUgYW5kIGtlZXAgdHJ5aW5nIHVudGlsIHdlIGZpbmQgdGhlIHJpZ2h0IG9uZS4gICovCi0KLSAgaW5zbl9saXN0ID0gQ0dFTl9ESVNfTE9PS1VQX0lOU04gKGNkLCBidWYsIGluc25fdmFsdWUpOwotICB3aGlsZSAoaW5zbl9saXN0ICE9IE5VTEwpCi0gICAgewotICAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuID0gaW5zbl9saXN0LT5pbnNuOwotICAgICAgQ0dFTl9GSUVMRFMgZmllbGRzOwotICAgICAgaW50IGxlbmd0aDsKLQotI2lmIDAgLyogbm90IG5lZWRlZCBhcyBpbnNuIHNob3VsZG4ndCBiZSBpbiBoYXNoIGxpc3RzIGlmIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgIC8qIFN1cHBvcnRlZCBieSB0aGlzIGNwdT8gICovCi0gICAgICBpZiAoISBtMzJyX2NnZW5faW5zbl9zdXBwb3J0ZWQgKGNkLCBpbnNuKSkKLQljb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAvKiBCYXNpYyBiaXQgbWFzayBtdXN0IGJlIGNvcnJlY3QuICAqLwotICAgICAgLyogPz8/IE1heSB3aXNoIHRvIGFsbG93IHRhcmdldCB0byBkZWZlciB0aGlzIGNoZWNrIHVudGlsIHRoZSBleHRyYWN0Ci0JIGhhbmRsZXIuICAqLwotICAgICAgaWYgKChpbnNuX3ZhbHVlICYgQ0dFTl9JTlNOX0JBU0VfTUFTSyAoaW5zbikpCi0JICA9PSBDR0VOX0lOU05fQkFTRV9WQUxVRSAoaW5zbikpCi0JewotCSAgLyogUHJpbnRpbmcgaXMgaGFuZGxlZCBpbiB0d28gcGFzc2VzLiAgVGhlIGZpcnN0IHBhc3MgcGFyc2VzIHRoZQotCSAgICAgbWFjaGluZSBpbnNuIGFuZCBleHRyYWN0cyB0aGUgZmllbGRzLiAgVGhlIHNlY29uZCBwYXNzIHByaW50cwotCSAgICAgdGhlbS4gICovCi0KLQkgIGxlbmd0aCA9IENHRU5fRVhUUkFDVF9GTiAoY2QsIGluc24pCi0JICAgIChjZCwgaW5zbiwgJmV4X2luZm8sIGluc25fdmFsdWUsICZmaWVsZHMsIHBjKTsKLQkgIC8qIGxlbmd0aCA8IDAgLT4gZXJyb3IgKi8KLQkgIGlmIChsZW5ndGggPCAwKQotCSAgICByZXR1cm4gbGVuZ3RoOwotCSAgaWYgKGxlbmd0aCA+IDApCi0JICAgIHsKLQkgICAgICBDR0VOX1BSSU5UX0ZOIChjZCwgaW5zbikgKGNkLCBpbmZvLCBpbnNuLCAmZmllbGRzLCBwYywgbGVuZ3RoKTsKLQkgICAgICAvKiBsZW5ndGggaXMgaW4gYml0cywgcmVzdWx0IGlzIGluIGJ5dGVzICovCi0JICAgICAgcmV0dXJuIGxlbmd0aCAvIDg7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIGluc25fbGlzdCA9IENHRU5fRElTX05FWFRfSU5TTiAoaW5zbl9saXN0KTsKLSAgICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIERlZmF1bHQgdmFsdWUgZm9yIENHRU5fUFJJTlRfSU5TTi4KLSAgIFRoZSByZXN1bHQgaXMgdGhlIHNpemUgb2YgdGhlIGluc24gaW4gYnl0ZXMgb3IgemVybyBmb3IgYW4gdW5rbm93biBpbnNuCi0gICBvciAtMSBpZiBhbiBlcnJvciBvY2N1cmVkIGZldGNoaW5nIGJ5dGVzLiAgKi8KLQotI2lmbmRlZiBDR0VOX1BSSU5UX0lOU04KLSNkZWZpbmUgQ0dFTl9QUklOVF9JTlNOIGRlZmF1bHRfcHJpbnRfaW5zbgotI2VuZGlmCi0KLXN0YXRpYyBpbnQKLWRlZmF1bHRfcHJpbnRfaW5zbiAoY2QsIHBjLCBpbmZvKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBiZmRfdm1hIHBjOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjaGFyIGJ1ZltDR0VOX01BWF9JTlNOX1NJWkVdOwotICBpbnQgc3RhdHVzOwotCi0gIC8qIFJlYWQgdGhlIGJhc2UgcGFydCBvZiB0aGUgaW5zbi4gICovCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocGMsIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuIChjZCwgcGMsIGluZm8sIGJ1ZiwgY2QtPmJhc2VfaW5zbl9iaXRzaXplIC8gOCk7Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQuCi0gICBQcmludCBvbmUgaW5zdHJ1Y3Rpb24gZnJvbSBQQyBvbiBJTkZPLT5TVFJFQU0uCi0gICBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uIChpbiBieXRlcykuICAqLwotCi1pbnQKLXByaW50X2luc25fbTMyciAocGMsIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN0YXRpYyBDR0VOX0NQVV9ERVNDIGNkID0gMDsKLSAgc3RhdGljIHByZXZfaXNhLHByZXZfbWFjaCxwcmV2X2VuZGlhbjsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGlzYSxtYWNoOwotICBpbnQgZW5kaWFuID0gKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQk/IENHRU5fRU5ESUFOX0JJRwotCQk6IENHRU5fRU5ESUFOX0xJVFRMRSk7Ci0gIGVudW0gYmZkX2FyY2hpdGVjdHVyZSBhcmNoOwotCi0gIC8qID8/PyBnZGIgd2lsbCBzZXQgbWFjaCBidXQgbGVhdmUgdGhlIGFyY2hpdGVjdHVyZSBhcyAidW5rbm93biIgKi8KLSNpZm5kZWYgQ0dFTl9CRkRfQVJDSAotI2RlZmluZSBDR0VOX0JGRF9BUkNIIGJmZF9hcmNoX20zMnIKLSNlbmRpZgotICBhcmNoID0gaW5mby0+YXJjaDsKLSAgaWYgKGFyY2ggPT0gYmZkX2FyY2hfdW5rbm93bikKLSAgICBhcmNoID0gQ0dFTl9CRkRfQVJDSDsKLSAgICAgIAotICAvKiBUaGVyZSdzIG5vIHN0YW5kYXJkIHdheSB0byBjb21wdXRlIHRoZSBpc2EgbnVtYmVyIChlLmcuIGZvciBhcm0gdGh1bWIpCi0gICAgIHNvIHdlIGxlYXZlIGl0IHRvIHRoZSB0YXJnZXQuICAqLwotI2lmZGVmIENHRU5fQ09NUFVURV9JU0EKLSAgaXNhID0gQ0dFTl9DT01QVVRFX0lTQSAoaW5mbyk7Ci0jZWxzZQotICBpc2EgPSAwOwotI2VuZGlmCi0KLSAgbWFjaCA9IGluZm8tPm1hY2g7Ci0KLSAgLyogSWYgd2UndmUgc3dpdGNoZWQgY3B1J3MsIGNsb3NlIHRoZSBjdXJyZW50IHRhYmxlIGFuZCBvcGVuIGEgbmV3IG9uZS4gICovCi0gIGlmIChjZAotICAgICAgJiYgKGlzYSAhPSBwcmV2X2lzYQotCSAgfHwgbWFjaCAhPSBwcmV2X21hY2gKLQkgIHx8IGVuZGlhbiAhPSBwcmV2X2VuZGlhbikpCi0gICAgewotICAgICAgbTMycl9jZ2VuX2NwdV9jbG9zZSAoY2QpOwotICAgICAgY2QgPSAwOwotICAgIH0KLQotICAvKiBJZiB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHlldCwgaW5pdGlhbGl6ZSB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKCEgY2QpCi0gICAgewotICAgICAgY29uc3QgYmZkX2FyY2hfaW5mb190eXBlICphcmNoX3R5cGUgPSBiZmRfbG9va3VwX2FyY2ggKGFyY2gsIG1hY2gpOwotICAgICAgY29uc3QgY2hhciAqbWFjaF9uYW1lOwotCi0gICAgICBpZiAoIWFyY2hfdHlwZSkKLQlhYm9ydCAoKTsKLSAgICAgIG1hY2hfbmFtZSA9IGFyY2hfdHlwZS0+cHJpbnRhYmxlX25hbWU7Ci0KLSAgICAgIHByZXZfaXNhID0gaXNhOwotICAgICAgcHJldl9tYWNoID0gbWFjaDsKLSAgICAgIHByZXZfZW5kaWFuID0gZW5kaWFuOwotICAgICAgY2QgPSBtMzJyX2NnZW5fY3B1X29wZW4gKENHRU5fQ1BVX09QRU5fSVNBUywgcHJldl9pc2EsCi0JCQkJIENHRU5fQ1BVX09QRU5fQkZETUFDSCwgbWFjaF9uYW1lLAotCQkJCSBDR0VOX0NQVV9PUEVOX0VORElBTiwgcHJldl9lbmRpYW4sCi0JCQkJIENHRU5fQ1BVX09QRU5fRU5EKTsKLSAgICAgIGlmICghY2QpCi0JYWJvcnQgKCk7Ci0gICAgICBtMzJyX2NnZW5faW5pdF9kaXMgKGNkKTsKLSAgICB9Ci0KLSAgLyogV2UgdHJ5IHRvIGhhdmUgYXMgbXVjaCBjb21tb24gY29kZSBhcyBwb3NzaWJsZS4KLSAgICAgQnV0IGF0IHRoaXMgcG9pbnQgc29tZSB0YXJnZXRzIG5lZWQgdG8gdGFrZSBvdmVyLiAgKi8KLSAgLyogPz8/IFNvbWUgdGFyZ2V0cyBtYXkgbmVlZCBhIGhvb2sgZWxzZXdoZXJlLiAgVHJ5IHRvIGF2b2lkIHRoaXMsCi0gICAgIGJ1dCBpZiBub3QgcG9zc2libGUgdHJ5IHRvIG1vdmUgdGhpcyBob29rIGVsc2V3aGVyZSByYXRoZXIgdGhhbgotICAgICBoYXZlIHR3byBob29rcy4gICovCi0gIGxlbmd0aCA9IENHRU5fUFJJTlRfSU5TTiAoY2QsIHBjLCBpbmZvKTsKLSAgaWYgKGxlbmd0aCA+IDApCi0gICAgcmV0dXJuIGxlbmd0aDsKLSAgaWYgKGxlbmd0aCA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBVTktOT1dOX0lOU05fTVNHKTsKLSAgcmV0dXJuIGNkLT5kZWZhdWx0X2luc25fYml0c2l6ZSAvIDg7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItaWJsZC5jIGIvb3Bjb2Rlcy9tMzJyLWlibGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmExNWQ3ZS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItaWJsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMCArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBidWlsZGluZy9leHRyYWN0aW9uIHN1cHBvcnQgZm9yIG0zMnIuIC0qLSBDIC0qLQotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOOiBDcHUgdG9vbHMgR0VOZXJhdG9yLgotLSB0aGUgcmVzdWx0YW50IGZpbGUgaXMgbWFjaGluZSBnZW5lcmF0ZWQsIGNnZW4taWJsZC5pbiBpc24ndAotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotLyogPz8/IEV2ZW50dWFsbHkgbW9yZSBhbmQgbW9yZSBvZiB0aGlzIHN0dWZmIGNhbiBnbyB0byBjcHUtaW5kZXBlbmRlbnQgZmlsZXMuCi0gICBLZWVwIHRoYXQgaW4gbWluZC4gICovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiYmZkLmgiCi0jaW5jbHVkZSAic3ltY2F0LmgiCi0jaW5jbHVkZSAibTMyci1kZXNjLmgiCi0jaW5jbHVkZSAibTMyci1vcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotI3VuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQotI3VuZGVmIG1heAotI2RlZmluZSBtYXgoYSxiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQotCi0vKiBVc2VkIGJ5IHRoZSBpZmllbGQgcnR4IGZ1bmN0aW9uLiAgKi8KLSNkZWZpbmUgRkxEKGYpIChmaWVsZHMtPmYpCi0KLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBsb25nLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIENHRU5fSU5TTl9CWVRFU19QVFIpKTsKLXN0YXRpYyBjb25zdCBjaGFyICogaW5zZXJ0X2luc25fbm9ybWFsCi0gICAgIFBBUkFNUyAoKENHRU5fQ1BVX0RFU0MsIGNvbnN0IENHRU5fSU5TTiAqLAotCSAgICAgIENHRU5fRklFTERTICosIENHRU5fSU5TTl9CWVRFU19QVFIsIGJmZF92bWEpKTsKLQotc3RhdGljIGludCBleHRyYWN0X25vcm1hbAotICAgICBQQVJBTVMgKChDR0VOX0NQVV9ERVNDLCBDR0VOX0VYVFJBQ1RfSU5GTyAqLCBDR0VOX0lOU05fSU5ULAotCSAgICAgIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwKLQkgICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgYmZkX3ZtYSwgbG9uZyAqKSk7Ci1zdGF0aWMgaW50IGV4dHJhY3RfaW5zbl9ub3JtYWwKLSAgICAgUEFSQU1TICgoQ0dFTl9DUFVfREVTQywgY29uc3QgQ0dFTl9JTlNOICosIENHRU5fRVhUUkFDVF9JTkZPICosCi0JICAgICAgQ0dFTl9JTlNOX0lOVCwgQ0dFTl9GSUVMRFMgKiwgYmZkX3ZtYSkpOwotDAotLyogT3BlcmFuZCBpbnNlcnRpb24uICAqLwotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotLyogU3Vicm91dGluZSBvZiBpbnNlcnRfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIHZvaWQKLWluc2VydF8xIChjZCwgdmFsdWUsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBpbnQgc3RhcnQsbGVuZ3RoLHdvcmRfbGVuZ3RoOwotICAgICB1bnNpZ25lZCBjaGFyICpidWZwOwotewotICB1bnNpZ25lZCBsb25nIHgsbWFzazsKLSAgaW50IHNoaWZ0OwotICBpbnQgYmlnX3AgPSBDR0VOX0NQVV9JTlNOX0VORElBTiAoY2QpID09IENHRU5fRU5ESUFOX0JJRzsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICB4ID0gKmJ1ZnA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjE2IChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgLyogPz8/IFRoaXMgbWF5IG5lZWQgcmV3b3JraW5nIGFzIHRoZXNlIGNhc2VzIGRvbid0IG5lY2Vzc2FyaWx5Ci0JIHdhbnQgdGhlIGZpcnN0IGJ5dGUgYW5kIHRoZSBsYXN0IHR3byBieXRlcyBoYW5kbGVkIGxpa2UgdGhpcy4gICovCi0gICAgICBpZiAoYmlnX3ApCi0JeCA9IChidWZwWzBdIDw8IDE2KSB8IGJmZF9nZXRiMTYgKGJ1ZnAgKyAxKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwxNiAoYnVmcCkgfCAoYnVmcFsyXSA8PCAxNik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMyOgotICAgICAgaWYgKGJpZ19wKQotCXggPSBiZmRfZ2V0YjMyIChidWZwKTsKLSAgICAgIGVsc2UKLQl4ID0gYmZkX2dldGwzMiAoYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLQotICAvKiBXcml0dGVuIHRoaXMgd2F5IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIuICAqLwotICBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLSAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgc2hpZnQgPSAoc3RhcnQgKyAxKSAtIGxlbmd0aDsKLSAgZWxzZQotICAgIHNoaWZ0ID0gKHdvcmRfbGVuZ3RoIC0gKHN0YXJ0ICsgbGVuZ3RoKSk7Ci0gIHggPSAoeCAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLQotICBzd2l0Y2ggKHdvcmRfbGVuZ3RoKQotICAgIHsKLSAgICBjYXNlIDg6Ci0gICAgICAqYnVmcCA9IHg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE2OgotICAgICAgaWYgKGJpZ19wKQotCWJmZF9wdXRiMTYgKHgsIGJ1ZnApOwotICAgICAgZWxzZQotCWJmZF9wdXRsMTYgKHgsIGJ1ZnApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNDoKLSAgICAgIC8qID8/PyBUaGlzIG1heSBuZWVkIHJld29ya2luZyBhcyB0aGVzZSBjYXNlcyBkb24ndCBuZWNlc3NhcmlseQotCSB3YW50IHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgbGFzdCB0d28gYnl0ZXMgaGFuZGxlZCBsaWtlIHRoaXMuICAqLwotICAgICAgaWYgKGJpZ19wKQotCXsKLQkgIGJ1ZnBbMF0gPSB4ID4+IDE2OwotCSAgYmZkX3B1dGIxNiAoeCwgYnVmcCArIDEpOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBiZmRfcHV0bDE2ICh4LCBidWZwKTsKLQkgIGJ1ZnBbMl0gPSB4ID4+IDE2OwotCX0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JYmZkX3B1dGIzMiAoeCwgYnVmcCk7Ci0gICAgICBlbHNlCi0JYmZkX3B1dGwzMiAoeCwgYnVmcCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0IDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLS8qIERlZmF1bHQgaW5zZXJ0aW9uIHJvdXRpbmUuCi0KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFRoZSByZXN1bHQgaXMgYW4gZXJyb3IgbWVzc2FnZSBvciBOVUxMIGlmIHN1Y2Nlc3MuICAqLwotCi0vKiA/Pz8gVGhpcyBkdXBsaWNhdGVzIGZ1bmN0aW9uYWxpdHkgd2l0aCBiZmQncyBob3d0byB0YWJsZSBhbmQKLSAgIGJmZF9pbnN0YWxsX3JlbG9jYXRpb24uICAqLwotLyogPz8/IFRoaXMgZG9lc24ndCBoYW5kbGUgYmZkX3ZtYSdzLiAgQ3JlYXRlIGFub3RoZXIgZnVuY3Rpb24gd2hlbgotICAgbmVjZXNzYXJ5LiAgKi8KLQotc3RhdGljIGNvbnN0IGNoYXIgKgotaW5zZXJ0X25vcm1hbCAoY2QsIHZhbHVlLCBhdHRycywgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLAotCSAgICAgICB0b3RhbF9sZW5ndGgsIGJ1ZmZlcikKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgdW5zaWduZWQgaW50IGF0dHJzOwotICAgICB1bnNpZ25lZCBpbnQgd29yZF9vZmZzZXQsIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCB0b3RhbF9sZW5ndGg7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotewotICBzdGF0aWMgY2hhciBlcnJidWZbMTAwXTsKLSAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgdW5zaWduZWQgbG9uZyBtYXNrID0gKCgoMUwgPDwgKGxlbmd0aCAtIDEpKSAtIDEpIDw8IDEpIHwgMTsKLQotICAvKiBJZiBMRU5HVEggaXMgemVybywgdGhpcyBvcGVyYW5kIGRvZXNuJ3QgY29udHJpYnV0ZSB0byB0aGUgdmFsdWUuICAqLwotICBpZiAobGVuZ3RoID09IDApCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKENHRU5fSU5UX0lOU05fUAotICAgICAgJiYgd29yZF9vZmZzZXQgIT0gMCkKLSAgICBhYm9ydCAoKTsKLQotICBpZiAod29yZF9sZW5ndGggPiAzMikKLSAgICBhYm9ydCAoKTsKLQotICAvKiBGb3IgYXJjaGl0ZWN0dXJlcyB3aXRoIGluc25zIHNtYWxsZXIgdGhhbiB0aGUgYmFzZS1pbnNuLWJpdHNpemUsCi0gICAgIHdvcmRfbGVuZ3RoIG1heSBiZSB0b28gYmlnLiAgKi8KLSAgaWYgKGNkLT5taW5faW5zbl9iaXRzaXplIDwgY2QtPmJhc2VfaW5zbl9iaXRzaXplKQotICAgIHsKLSAgICAgIGlmICh3b3JkX29mZnNldCA9PSAwCi0JICAmJiB3b3JkX2xlbmd0aCA+IHRvdGFsX2xlbmd0aCkKLQl3b3JkX2xlbmd0aCA9IHRvdGFsX2xlbmd0aDsKLSAgICB9Ci0KLSAgLyogRW5zdXJlIFZBTFVFIHdpbGwgZml0LiAgKi8KLSAgaWYgKCEgQ0dFTl9CT09MX0FUVFIgKGF0dHJzLCBDR0VOX0lGTERfU0lHTkVEKSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1heHZhbCA9IG1hc2s7Ci0gICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpIHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JICBzcHJpbnRmIChlcnJidWYsCi0JCSAgIF8oIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIpLAotCQkgICB2YWx1ZSwgbWF4dmFsKTsKLQkgIHJldHVybiBlcnJidWY7Ci0JfQotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGxvbmcgbWludmFsID0gLSAoMUwgPDwgKGxlbmd0aCAtIDEpKTsKLSAgICAgIGxvbmcgbWF4dmFsID0gKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxOwotICAgICAgaWYgKHZhbHVlIDwgbWludmFsIHx8IHZhbHVlID4gbWF4dmFsKQotCXsKLQkgIHNwcmludGYKLQkgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICAgKGVycmJ1ZiwgXygib3BlcmFuZCBvdXQgb2YgcmFuZ2UgKCVsZCBub3QgYmV0d2VlbiAlbGQgYW5kICVsZCkiKSwKLQkgICAgIHZhbHVlLCBtaW52YWwsIG1heHZhbCk7Ci0JICByZXR1cm4gZXJyYnVmOwotCX0KLSAgICB9Ci0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICB7Ci0gICAgaW50IHNoaWZ0OwotCi0gICAgaWYgKENHRU5fSU5TTl9MU0IwX1ApCi0gICAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICAgIGVsc2UKLSAgICAgIHNoaWZ0ID0gd29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpOwotICAgICpidWZmZXIgPSAoKmJ1ZmZlciAmIH4obWFzayA8PCBzaGlmdCkpIHwgKCh2YWx1ZSAmIG1hc2spIDw8IHNoaWZ0KTsKLSAgfQotCi0jZWxzZSAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHsKLSAgICB1bnNpZ25lZCBjaGFyICpidWZwID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyICsgd29yZF9vZmZzZXQgLyA4OwotCi0gICAgaW5zZXJ0XzEgKGNkLCB2YWx1ZSwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIGJ1ZnApOwotICB9Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0gIHJldHVybiBOVUxMOwotfQotCi0vKiBEZWZhdWx0IGluc24gYnVpbGRlciAoaW5zZXJ0IGhhbmRsZXIpLgotICAgVGhlIGluc3RydWN0aW9uIGlzIHJlY29yZGVkIGluIENHRU5fSU5UX0lOU05fUCBieXRlIG9yZGVyCi0gICAobWVhbmluZyB0aGF0IGlmIENHRU5fSU5UX0lOU05fUCBCVUZGRVIgaXMgYW4gaW50ICogYW5kIHRodXMgdGhlIHZhbHVlIGlzCi0gICByZWNvcmRlZCBpbiBob3N0IGJ5dGUgb3JkZXIsIG90aGVyd2lzZSBCVUZGRVIgaXMgYW4gYXJyYXkgb2YgYnl0ZXMgYW5kIHRoZQotICAgdmFsdWUgaXMgcmVjb3JkZWQgaW4gdGFyZ2V0IGJ5dGUgb3JkZXIpLgotICAgVGhlIHJlc3VsdCBpcyBhbiBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgc3VjY2Vzcy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICoKLWluc2VydF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGZpZWxkcywgYnVmZmVyLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgY29uc3QgQ0dFTl9JTlNOICogaW5zbjsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIENHRU5fSU5TTl9CWVRFU19QVFIgYnVmZmVyOwotICAgICBiZmRfdm1hIHBjOwotewotICBjb25zdCBDR0VOX1NZTlRBWCAqc3ludGF4ID0gQ0dFTl9JTlNOX1NZTlRBWCAoaW5zbik7Ci0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeW47Ci0KLSAgQ0dFTl9JTklUX0lOU0VSVCAoY2QpOwotICB2YWx1ZSA9IENHRU5fSU5TTl9CQVNFX1ZBTFVFIChpbnNuKTsKLQotICAvKiBJZiB3ZSdyZSByZWNvcmRpbmcgaW5zbnMgYXMgbnVtYmVycyAocmF0aGVyIHRoYW4gYSBzdHJpbmcgb2YgYnl0ZXMpLAotICAgICB0YXJnZXQgYnl0ZSBvcmRlciBoYW5kbGluZyBpcyBkZWZlcnJlZCB1bnRpbCBsYXRlci4gICovCi0KLSNpZiBDR0VOX0lOVF9JTlNOX1AKLQotICAqYnVmZmVyID0gdmFsdWU7Ci0KLSNlbHNlCi0KLSAgY2dlbl9wdXRfaW5zbl92YWx1ZSAoY2QsIGJ1ZmZlciwgbWluIChjZC0+YmFzZV9pbnNuX2JpdHNpemUsCi0JCQkJCUNHRU5fRklFTERTX0JJVFNJWkUgKGZpZWxkcykpLAotCQkgICAgICAgdmFsdWUpOwotCi0jZW5kaWYgLyogISBDR0VOX0lOVF9JTlNOX1AgKi8KLQotICAvKiA/Pz8gSXQgd291bGQgYmUgYmV0dGVyIHRvIHNjYW4gdGhlIGZvcm1hdCdzIGZpZWxkcy4KLSAgICAgU3RpbGwgbmVlZCB0byBiZSBhYmxlIHRvIGluc2VydCBhIHZhbHVlIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHRob3VnaDsKLSAgICAgZS5nLiBzdG9yaW5nIGEgYnJhbmNoIGRpc3BsYWNlbWVudCB0aGF0IGdvdCByZXNvbHZlZCBsYXRlci4KLSAgICAgTmVlZHMgbW9yZSB0aG91Z2h0IGZpcnN0LiAgKi8KLQotICBmb3IgKHN5biA9IENHRU5fU1lOVEFYX1NUUklORyAoc3ludGF4KTsgKiBzeW4gIT0gJ1wwJzsgKysgc3luKQotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKLQotICAgICAgaWYgKENHRU5fU1lOVEFYX0NIQVJfUCAoKiBzeW4pKQotCWNvbnRpbnVlOwotCi0gICAgICBlcnJtc2cgPSAoKiBjZC0+aW5zZXJ0X29wZXJhbmQpIChjZCwgQ0dFTl9TWU5UQVhfRklFTEQgKCpzeW4pLAotCQkJCSAgICAgICBmaWVsZHMsIGJ1ZmZlciwgcGMpOwotICAgICAgaWYgKGVycm1zZykKLQlyZXR1cm4gZXJybXNnOwotICAgIH0KLQotICByZXR1cm4gTlVMTDsKLX0KLQwKLS8qIE9wZXJhbmQgZXh0cmFjdGlvbi4gICovCi0KLSNpZiAhIENHRU5fSU5UX0lOU05fUAotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLgotICAgRW5zdXJlIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGNhY2hlZCBpbiBFWF9JTkZPLgotICAgT0ZGU0VUIGlzIHRoZSBvZmZzZXQgaW4gYnl0ZXMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGluc24gb2YgdGhlIHZhbHVlLgotICAgQllURVMgaXMgdGhlIGxlbmd0aCBvZiB0aGUgbmVlZGVkIHZhbHVlLgotICAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGludAotZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIG9mZnNldCwgYnl0ZXMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgaW50IG9mZnNldCwgYnl0ZXM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIC8qIEl0J3MgZG91YnRmdWwgdGhhdCB0aGUgbWlkZGxlIHBhcnQgaGFzIGFscmVhZHkgYmVlbiBmZXRjaGVkIHNvCi0gICAgIHdlIGRvbid0IG9wdGltaXplIHRoYXQgY2FzZS4gIGtpc3MuICAqLwotICBpbnQgbWFzazsKLSAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbyA9IChkaXNhc3NlbWJsZV9pbmZvICopIGV4X2luZm8tPmRpc19pbmZvOwotCi0gIC8qIEZpcnN0IGRvIGEgcXVpY2sgY2hlY2suICAqLwotICBtYXNrID0gKDEgPDwgYnl0ZXMpIC0gMTsKLSAgaWYgKCgoZXhfaW5mby0+dmFsaWQgPj4gb2Zmc2V0KSAmIG1hc2spID09IG1hc2spCi0gICAgcmV0dXJuIDE7Ci0KLSAgLyogU2VhcmNoIGZvciB0aGUgZmlyc3QgYnl0ZSB3ZSBuZWVkIHRvIHJlYWQuICAqLwotICBmb3IgKG1hc2sgPSAxIDw8IG9mZnNldDsgYnl0ZXMgPiAwOyAtLWJ5dGVzLCArK29mZnNldCwgbWFzayA8PD0gMSkKLSAgICBpZiAoISAobWFzayAmIGV4X2luZm8tPnZhbGlkKSkKLSAgICAgIGJyZWFrOwotCi0gIGlmIChieXRlcykKLSAgICB7Ci0gICAgICBpbnQgc3RhdHVzOwotCi0gICAgICBwYyArPSBvZmZzZXQ7Ci0gICAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JKHBjLCBleF9pbmZvLT5pbnNuX2J5dGVzICsgb2Zmc2V0LCBieXRlcywgaW5mbyk7Ci0KLSAgICAgIGlmIChzdGF0dXMgIT0gMCkKLQl7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBwYywgaW5mbyk7Ci0JICByZXR1cm4gMDsKLQl9Ci0KLSAgICAgIGV4X2luZm8tPnZhbGlkIHw9ICgoMSA8PCBieXRlcykgLSAxKSA8PCBvZmZzZXQ7Ci0gICAgfQotCi0gIHJldHVybiAxOwotfQotCi0vKiBTdWJyb3V0aW5lIG9mIGV4dHJhY3Rfbm9ybWFsLiAgKi8KLQotc3RhdGljIENHRU5fSU5MSU5FIGxvbmcKLWV4dHJhY3RfMSAoY2QsIGV4X2luZm8sIHN0YXJ0LCBsZW5ndGgsIHdvcmRfbGVuZ3RoLCBidWZwLCBwYykKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIGludCBzdGFydCxsZW5ndGgsd29yZF9sZW5ndGg7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZnA7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgeCxtYXNrOwotICBpbnQgc2hpZnQ7Ci0gIGludCBiaWdfcCA9IENHRU5fQ1BVX0lOU05fRU5ESUFOIChjZCkgPT0gQ0dFTl9FTkRJQU5fQklHOwotCi0gIHN3aXRjaCAod29yZF9sZW5ndGgpCi0gICAgewotICAgIGNhc2UgODoKLSAgICAgIHggPSAqYnVmcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMTYgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAvKiA/Pz8gVGhpcyBtYXkgbmVlZCByZXdvcmtpbmcgYXMgdGhlc2UgY2FzZXMgZG9uJ3QgbmVjZXNzYXJpbHkKLQkgd2FudCB0aGUgZmlyc3QgYnl0ZSBhbmQgdGhlIGxhc3QgdHdvIGJ5dGVzIGhhbmRsZWQgbGlrZSB0aGlzLiAgKi8KLSAgICAgIGlmIChiaWdfcCkKLQl4ID0gKGJ1ZnBbMF0gPDwgMTYpIHwgYmZkX2dldGIxNiAoYnVmcCArIDEpOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDE2IChidWZwKSB8IChidWZwWzJdIDw8IDE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBpZiAoYmlnX3ApCi0JeCA9IGJmZF9nZXRiMzIgKGJ1ZnApOwotICAgICAgZWxzZQotCXggPSBiZmRfZ2V0bDMyIChidWZwKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQgOgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIC8qIFdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ci4gICovCi0gIG1hc2sgPSAoKCgxTCA8PCAobGVuZ3RoIC0gMSkpIC0gMSkgPDwgMSkgfCAxOwotICBpZiAoQ0dFTl9JTlNOX0xTQjBfUCkKLSAgICBzaGlmdCA9IChzdGFydCArIDEpIC0gbGVuZ3RoOwotICBlbHNlCi0gICAgc2hpZnQgPSAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgcmV0dXJuICh4ID4+IHNoaWZ0KSAmIG1hc2s7Ci19Ci0KLSNlbmRpZiAvKiAhIENHRU5fSU5UX0lOU05fUCAqLwotCi0vKiBEZWZhdWx0IGV4dHJhY3Rpb24gcm91dGluZS4KLQotICAgSU5TTl9WQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBvZiB0aGUgaW5zbiBpbiBob3N0IG9yZGVyLAotICAgb3Igc29tZXRpbWVzIGxlc3MgZm9yIGNhc2VzIGxpa2UgdGhlIG0zMnIgd2hlcmUgdGhlIGJhc2UgaW5zbiBzaXplIGlzIDMyCi0gICBidXQgc29tZSBpbnNucyBhcmUgMTYgYml0cy4KLSAgIEFUVFJTIGlzIGEgbWFzayBvZiB0aGUgYm9vbGVhbiBhdHRyaWJ1dGVzLiAgV2Ugb25seSBuZWVkIGBTSUdORUQnLAotICAgYnV0IGZvciBnZW5lcmFsaXR5IHdlIHRha2UgYSBiaXRtYXNrIG9mIGFsbCBvZiB0aGVtLgotICAgV09SRF9PRkZTRVQgaXMgdGhlIG9mZnNldCBpbiBiaXRzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnNuIG9mIHRoZSB2YWx1ZS4KLSAgIFdPUkRfTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIHdvcmQgaW4gYml0cyBpbiB3aGljaCB0aGUgdmFsdWUgcmVzaWRlcy4KLSAgIFNUQVJUIGlzIHRoZSBzdGFydGluZyBiaXQgbnVtYmVyIGluIHRoZSB3b3JkLCBhcmNoaXRlY3R1cmUgb3JpZ2luLgotICAgTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgVkFMVUUgaW4gYml0cy4KLSAgIFRPVEFMX0xFTkdUSCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIGJpdHMuCi0KLSAgIFJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4gICovCi0KLS8qID8/PyBUaGUgcmV0dXJuIGNvZGUgaXNuJ3QgcHJvcGVybHkgdXNlZC4gIHdpcC4gICovCi0KLS8qID8/PyBUaGlzIGRvZXNuJ3QgaGFuZGxlIGJmZF92bWEncy4gIENyZWF0ZSBhbm90aGVyIGZ1bmN0aW9uIHdoZW4KLSAgIG5lY2Vzc2FyeS4gICovCi0KLXN0YXRpYyBpbnQKLWV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgYXR0cnMsIHdvcmRfb2Zmc2V0LCBzdGFydCwgbGVuZ3RoLAotCQl3b3JkX2xlbmd0aCwgdG90YWxfbGVuZ3RoLCBwYywgdmFsdWVwKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBDR0VOX0VYVFJBQ1RfSU5GTyAqZXhfaW5mbzsKLSAgICAgQ0dFTl9JTlNOX0lOVCBpbnNuX3ZhbHVlOwotICAgICB1bnNpZ25lZCBpbnQgYXR0cnM7Ci0gICAgIHVuc2lnbmVkIGludCB3b3JkX29mZnNldCwgc3RhcnQsIGxlbmd0aCwgd29yZF9sZW5ndGgsIHRvdGFsX2xlbmd0aDsKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgbG9uZyAqdmFsdWVwOwotewotICBDR0VOX0lOU05fSU5UIHZhbHVlOwotCi0gIC8qIElmIExFTkdUSCBpcyB6ZXJvLCB0aGlzIG9wZXJhbmQgZG9lc24ndCBjb250cmlidXRlIHRvIHRoZSB2YWx1ZQotICAgICBzbyBnaXZlIGl0IGEgc3RhbmRhcmQgdmFsdWUgb2YgemVyby4gICovCi0gIGlmIChsZW5ndGggPT0gMCkKLSAgICB7Ci0gICAgICAqdmFsdWVwID0gMDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLQotICBpZiAoQ0dFTl9JTlRfSU5TTl9QCi0gICAgICAmJiB3b3JkX29mZnNldCAhPSAwKQotICAgIGFib3J0ICgpOwotCi0gIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotICAgIGFib3J0ICgpOwotCi0gIC8qIEZvciBhcmNoaXRlY3R1cmVzIHdpdGggaW5zbnMgc21hbGxlciB0aGFuIHRoZSBpbnNuLWJhc2UtYml0c2l6ZSwKLSAgICAgd29yZF9sZW5ndGggbWF5IGJlIHRvbyBiaWcuICAqLwotICBpZiAoY2QtPm1pbl9pbnNuX2JpdHNpemUgPCBjZC0+YmFzZV9pbnNuX2JpdHNpemUpCi0gICAgewotICAgICAgaWYgKHdvcmRfb2Zmc2V0ID09IDAKLQkgICYmIHdvcmRfbGVuZ3RoID4gdG90YWxfbGVuZ3RoKQotCXdvcmRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwotICAgIH0KLQotICAvKiBEb2VzIHRoZSB2YWx1ZSByZXNpZGUgaW4gSU5TTl9WQUxVRT8gICovCi0KLSAgaWYgKHdvcmRfb2Zmc2V0ID09IDApCi0gICAgewotICAgICAgLyogV3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyLiAgKi8KLSAgICAgIENHRU5fSU5TTl9JTlQgbWFzayA9ICgoKDFMIDw8IChsZW5ndGggLSAxKSkgLSAxKSA8PCAxKSB8IDE7Ci0KLSAgICAgIGlmIChDR0VOX0lOU05fTFNCMF9QKQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAoKHN0YXJ0ICsgMSkgLSBsZW5ndGgpOwotICAgICAgZWxzZQotCXZhbHVlID0gaW5zbl92YWx1ZSA+PiAod29yZF9sZW5ndGggLSAoc3RhcnQgKyBsZW5ndGgpKTsKLSAgICAgIHZhbHVlICY9IG1hc2s7Ci0gICAgICAvKiBzaWduIGV4dGVuZD8gKi8KLSAgICAgIGlmIChDR0VOX0JPT0xfQVRUUiAoYXR0cnMsIENHRU5fSUZMRF9TSUdORUQpCi0JICAmJiAodmFsdWUgJiAoMUwgPDwgKGxlbmd0aCAtIDEpKSkpCi0JdmFsdWUgfD0gfm1hc2s7Ci0gICAgfQotCi0jaWYgISBDR0VOX0lOVF9JTlNOX1AKLQotICBlbHNlCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqYnVmcCA9IGV4X2luZm8tPmluc25fYnl0ZXMgKyB3b3JkX29mZnNldCAvIDg7Ci0KLSAgICAgIGlmICh3b3JkX2xlbmd0aCA+IDMyKQotCWFib3J0ICgpOwotCi0gICAgICBpZiAoZmlsbF9jYWNoZSAoY2QsIGV4X2luZm8sIHdvcmRfb2Zmc2V0IC8gOCwgd29yZF9sZW5ndGggLyA4LCBwYykgPT0gMCkKLQlyZXR1cm4gMDsKLQotICAgICAgdmFsdWUgPSBleHRyYWN0XzEgKGNkLCBleF9pbmZvLCBzdGFydCwgbGVuZ3RoLCB3b3JkX2xlbmd0aCwgYnVmcCwgcGMpOwotICAgIH0KLQotI2VuZGlmIC8qICEgQ0dFTl9JTlRfSU5TTl9QICovCi0KLSAgKnZhbHVlcCA9IHZhbHVlOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBEZWZhdWx0IGluc24gZXh0cmFjdG9yLgotCi0gICBJTlNOX1ZBTFVFIGlzIHRoZSBmaXJzdCBiYXNlX2luc25fYml0c2l6ZSBiaXRzLCB0cmFuc2xhdGVkIHRvIGhvc3Qgb3JkZXIuCi0gICBUaGUgZXh0cmFjdGVkIGZpZWxkcyBhcmUgc3RvcmVkIGluIEZJRUxEUy4KLSAgIEVYX0lORk8gaXMgdXNlZCB0byBoYW5kbGUgcmVhZGluZyB2YXJpYWJsZSBsZW5ndGggaW5zbnMuCi0gICBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW5zbiBpbiBiaXRzLCBvciAwIGlmIG5vIG1hdGNoLAotICAgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJzIGZldGNoaW5nIGRhdGEgKG1lbW9yeV9lcnJvcl9mdW5jIHdpbGwgaGF2ZQotICAgYmVlbiBjYWxsZWQpLiAgKi8KLQotc3RhdGljIGludAotZXh0cmFjdF9pbnNuX25vcm1hbCAoY2QsIGluc24sIGV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGNvbnN0IENHRU5fSU5TTiAqaW5zbjsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKmZpZWxkczsKLSAgICAgYmZkX3ZtYSBwYzsKLXsKLSAgY29uc3QgQ0dFTl9TWU5UQVggKnN5bnRheCA9IENHRU5fSU5TTl9TWU5UQVggKGluc24pOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpzeW47Ci0KLSAgQ0dFTl9GSUVMRFNfQklUU0laRSAoZmllbGRzKSA9IENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLQotICBDR0VOX0lOSVRfRVhUUkFDVCAoY2QpOwotCi0gIGZvciAoc3luID0gQ0dFTl9TWU5UQVhfU1RSSU5HIChzeW50YXgpOyAqc3luOyArK3N5bikKLSAgICB7Ci0gICAgICBpbnQgbGVuZ3RoOwotCi0gICAgICBpZiAoQ0dFTl9TWU5UQVhfQ0hBUl9QICgqc3luKSkKLQljb250aW51ZTsKLQotICAgICAgbGVuZ3RoID0gKCogY2QtPmV4dHJhY3Rfb3BlcmFuZCkgKGNkLCBDR0VOX1NZTlRBWF9GSUVMRCAoKnN5biksCi0JCQkJCWV4X2luZm8sIGluc25fdmFsdWUsIGZpZWxkcywgcGMpOwotICAgICAgaWYgKGxlbmd0aCA8PSAwKQotCXJldHVybiBsZW5ndGg7Ci0gICAgfQotCi0gIC8qIFdlIHJlY29nbml6ZWQgYW5kIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgdGhpcyBpbnNuLiAgKi8KLSAgcmV0dXJuIENHRU5fSU5TTl9CSVRTSVpFIChpbnNuKTsKLX0KLQwKLS8qIG1hY2hpbmUgZ2VuZXJhdGVkIGNvZGUgYWRkZWQgaGVyZSAqLwotCi0vKiBNYWluIGVudHJ5IHBvaW50IGZvciBvcGVyYW5kIGluc2VydGlvbi4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBiYXNpY2FsbHkganVzdCBhIGJpZyBzd2l0Y2ggc3RhdGVtZW50LiAgRWFybGllciB2ZXJzaW9ucwotICAgdXNlZCB0YWJsZXMgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdG8gdXNlLCBidXQKLSAgIC0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGJvdGggYXNzZW1ibGVyIGFuZCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zIHRoZW4KLSAgICAgdGhlIGRpc2Fzc2VtYmxlciBjb250YWlucyBtdWNoIG9mIHRoZSBhc3NlbWJsZXIgYW5kIHZpY2UtdmVyc2EsCi0gICAtIHRoZXJlJ3MgYSBsb3Qgb2YgaW5saW5pbmcgcG9zc2liaWxpdGllcyBhcyB0aGluZ3MgZ3JvdywKLSAgIC0gdXNpbmcgYSBzd2l0Y2ggc3RhdGVtZW50IGF2b2lkcyB0aGUgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4KLQotICAgVGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBtb3ZlZCBpbnRvIGBwYXJzZV9pbnNuX25vcm1hbCcsIGJ1dCBrZWVwaW5nIGl0Ci0gICBzZXBhcmF0ZSBtYWtlcyBjbGVhciB0aGUgaW50ZXJmYWNlIGJldHdlZW4gYHBhcnNlX2luc25fbm9ybWFsJyBhbmQgZWFjaCBvZgotICAgdGhlIGhhbmRsZXJzLiAgSXQncyBhbHNvIG5lZWRlZCBieSBHQVMgdG8gaW5zZXJ0IG9wZXJhbmRzIHRoYXQgY291bGRuJ3QgYmUKLSAgIHJlc29sdmVkIGR1cmluZyBwYXJzaW5nLgotKi8KLQotY29uc3QgY2hhciAqCi1tMzJyX2NnZW5faW5zZXJ0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMsIGJ1ZmZlciwgcGMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgQ0dFTl9JTlNOX0JZVEVTX1BUUiBidWZmZXI7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGNvbnN0IGNoYXIgKiBlcnJtc2c7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfcjEsIDAsIDAsIDQsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxNjsKLSAgICAgICAgdmFsdWUgPSAoKGludCkgKCgodmFsdWUpIC0gKHBjKSkpID4+ICgyKSk7Ci0gICAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCB2YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMjQ7Ci0gICAgICAgIHZhbHVlID0gKChpbnQpICgoKHZhbHVlKSAtIChwYykpKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgICB2YWx1ZSA9ICgoaW50KSAoKCh2YWx1ZSkgLSAoKChwYykgJiAoLTQpKSkpKSA+PiAoMikpOwotICAgICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IxLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX25pbCwgMCwgMCwgMCwgMCwgMCwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX2hpMTYsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3NpbW0xNiwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfc2ltbTgsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCA4LCA4LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9zaW1tMTYsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3IyLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl9yMiwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tMTYsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW0yNCwgMHwoMTw8Q0dFTl9JRkxEX1JFTE9DKXwoMTw8Q0dFTl9JRkxEX0FCU19BRERSKSwgMCwgOCwgMjQsIDMyLCB0b3RhbF9sZW5ndGgsIGJ1ZmZlcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICBlcnJtc2cgPSBpbnNlcnRfbm9ybWFsIChjZCwgZmllbGRzLT5mX3VpbW00LCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIGVycm1zZyA9IGluc2VydF9ub3JtYWwgKGNkLCBmaWVsZHMtPmZfdWltbTUsIDAsIDAsIDExLCA1LCAzMiwgdG90YWxfbGVuZ3RoLCBidWZmZXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgZXJybXNnID0gaW5zZXJ0X25vcm1hbCAoY2QsIGZpZWxkcy0+Zl91aW1tMTYsIDAsIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgYnVmZmVyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgYnVpbGRpbmcgaW5zbi5cbiIpLAotCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIGVycm1zZzsKLX0KLQotLyogTWFpbiBlbnRyeSBwb2ludCBmb3Igb3BlcmFuZCBleHRyYWN0aW9uLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIGJhc2ljYWxseSBqdXN0IGEgYmlnIHN3aXRjaCBzdGF0ZW1lbnQuICBFYXJsaWVyIHZlcnNpb25zCi0gICB1c2VkIHRhYmxlcyB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0byB1c2UsIGJ1dAotICAgLSBpZiB0aGUgdGFibGUgY29udGFpbnMgYm90aCBhc3NlbWJsZXIgYW5kIGRpc2Fzc2VtYmxlciBmdW5jdGlvbnMgdGhlbgotICAgICB0aGUgZGlzYXNzZW1ibGVyIGNvbnRhaW5zIG11Y2ggb2YgdGhlIGFzc2VtYmxlciBhbmQgdmljZS12ZXJzYSwKLSAgIC0gdGhlcmUncyBhIGxvdCBvZiBpbmxpbmluZyBwb3NzaWJpbGl0aWVzIGFzIHRoaW5ncyBncm93LAotICAgLSB1c2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQgYXZvaWRzIHRoZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGNvdWxkIGJlIG1vdmVkIGludG8gYHByaW50X2luc25fbm9ybWFsJywgYnV0IGtlZXBpbmcgaXQKLSAgIHNlcGFyYXRlIG1ha2VzIGNsZWFyIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBgcHJpbnRfaW5zbl9ub3JtYWwnIGFuZCBlYWNoIG9mCi0gICB0aGUgaGFuZGxlcnMuCi0qLwotCi1pbnQKLW0zMnJfY2dlbl9leHRyYWN0X29wZXJhbmQgKGNkLCBvcGluZGV4LCBleF9pbmZvLCBpbnNuX3ZhbHVlLCBmaWVsZHMsIHBjKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgQ0dFTl9FWFRSQUNUX0lORk8gKmV4X2luZm87Ci0gICAgIENHRU5fSU5TTl9JTlQgaW5zbl92YWx1ZTsKLSAgICAgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci0gICAgIGJmZF92bWEgcGM7Ci17Ci0gIGludCBsZW5ndGg7Ci0gIHVuc2lnbmVkIGludCB0b3RhbF9sZW5ndGggPSBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArIChwYykpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgewotICAgICAgICBsb25nIHZhbHVlOwotICAgICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpfCgxPDxDR0VOX0lGTERfUkVMT0MpfCgxPDxDR0VOX0lGTERfUENSRUxfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gKCgoKHZhbHVlKSA8PCAoMikpKSArIChwYykpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDI0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB7Ci0gICAgICAgIGxvbmcgdmFsdWU7Ci0gICAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCl8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9QQ1JFTF9BRERSKSwgMCwgOCwgOCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgdmFsdWUpOwotICAgICAgICB2YWx1ZSA9ICgoKCh2YWx1ZSkgPDwgKDIpKSkgKyAoKChwYykgJiAoLTQpKSkpOwotICAgICAgICBmaWVsZHMtPmZfZGlzcDggPSB2YWx1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgNCwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAwLCAwLCAwLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9uaWwpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdOX09QVCksIDAsIDE2LCAxNiwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX2hpMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9yMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwfCgxPDxDR0VOX0lGTERfU0lHTkVEKSwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfc2ltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMHwoMTw8Q0dFTl9JRkxEX1NJR05FRCksIDAsIDgsIDgsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9TSUdORUQpLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl9zaW1tMTYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxMiwgNCwgMzIsIHRvdGFsX2xlbmd0aCwgcGMsICYgZmllbGRzLT5mX3IyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCA0LCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDEyLCA0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfcjIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTYsIDE2LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTE2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDB8KDE8PENHRU5fSUZMRF9SRUxPQyl8KDE8PENHRU5fSUZMRF9BQlNfQUREUiksIDAsIDgsIDI0LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTI0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIGxlbmd0aCA9IGV4dHJhY3Rfbm9ybWFsIChjZCwgZXhfaW5mbywgaW5zbl92YWx1ZSwgMCwgMCwgMTIsIDQsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBsZW5ndGggPSBleHRyYWN0X25vcm1hbCAoY2QsIGV4X2luZm8sIGluc25fdmFsdWUsIDAsIDAsIDExLCA1LCAzMiwgdG90YWxfbGVuZ3RoLCBwYywgJiBmaWVsZHMtPmZfdWltbTUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgbGVuZ3RoID0gZXh0cmFjdF9ub3JtYWwgKGNkLCBleF9pbmZvLCBpbnNuX3ZhbHVlLCAwLCAwLCAxNiwgMTYsIDMyLCB0b3RhbF9sZW5ndGgsIHBjLCAmIGZpZWxkcy0+Zl91aW1tMTYpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBkZWNvZGluZyBpbnNuLlxuIiksCi0JICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLWNnZW5faW5zZXJ0X2ZuICogY29uc3QgbTMycl9jZ2VuX2luc2VydF9oYW5kbGVyc1tdID0gCi17Ci0gIGluc2VydF9pbnNuX25vcm1hbCwKLX07Ci0KLWNnZW5fZXh0cmFjdF9mbiAqIGNvbnN0IG0zMnJfY2dlbl9leHRyYWN0X2hhbmRsZXJzW10gPSAKLXsKLSAgZXh0cmFjdF9pbnNuX25vcm1hbCwKLX07Ci0KLS8qIEdldHRpbmcgdmFsdWVzIGZyb20gY2dlbl9maWVsZHMgaXMgaGFuZGxlZCBieSBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb25zLgotICAgVGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgdHlwZSBvZiB0aGUgVkFMVUUgYXJndW1lbnQgdGhleSByZXR1cm4uCi0gICBUT0RPOiBmbG9hdGluZyBwb2ludCwgaW5saW5pbmcgc3VwcG9ydCwgcmVtb3ZlIGNhc2VzIHdoZXJlIHJlc3VsdCB0eXBlCi0gICBub3QgYXBwcm9wcmlhdGUuICAqLwotCi1pbnQKLW0zMnJfY2dlbl9nZXRfaW50X29wZXJhbmQgKGNkLCBvcGluZGV4LCBmaWVsZHMpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBjb25zdCBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLXsKLSAgaW50IHZhbHVlOwotCi0gIHN3aXRjaCAob3BpbmRleCkKLSAgICB7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRENSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AyNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9kaXNwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEFTSCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9uaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ISTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2hpMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTggOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfc2ltbTg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzEgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMyIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0yNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMjQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU01IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW01OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUxPMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0IDoKLSAgICAgIC8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0gICAgICBmcHJpbnRmIChzdGRlcnIsIF8oIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIGludCBvcGVyYW5kLlxuIiksCi0JCSAgICAgICBvcGluZGV4KTsKLSAgICAgIGFib3J0ICgpOwotICB9Ci0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1iZmRfdm1hCi1tMzJyX2NnZW5fZ2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotICAgICBpbnQgb3BpbmRleDsKLSAgICAgY29uc3QgQ0dFTl9GSUVMRFMgKiBmaWVsZHM7Ci17Ci0gIGJmZF92bWEgdmFsdWU7Ci0KLSAgc3dpdGNoIChvcGluZGV4KQotICAgIHsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EQ1IgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfZGlzcDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3AyNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1A4IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX2Rpc3A4OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRFIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9IQVNIIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX25pbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hJMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfaGkxNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NDUiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU0xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tMTY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TSU1NOCA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9zaW1tODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NMTzE2IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3NpbW0xNjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSIDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3IyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMSA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl9yMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NSQzIgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfcjI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMTYgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTI0IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW0yNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU00IDoKLSAgICAgIHZhbHVlID0gZmllbGRzLT5mX3VpbW00OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTUgOgotICAgICAgdmFsdWUgPSBmaWVsZHMtPmZfdWltbTU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VTE8xNiA6Ci0gICAgICB2YWx1ZSA9IGZpZWxkcy0+Zl91aW1tMTY7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQgOgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgIGZwcmludGYgKHN0ZGVyciwgXygiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgdm1hIG9wZXJhbmQuXG4iKSwKLQkJICAgICAgIG9waW5kZXgpOwotICAgICAgYWJvcnQgKCk7Ci0gIH0KLQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLS8qIFN0dWZmaW5nIHZhbHVlcyBpbiBjZ2VuX2ZpZWxkcyBpcyBoYW5kbGVkIGJ5IGEgY29sbGVjdGlvbiBvZiBmdW5jdGlvbnMuCi0gICBUaGV5IGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHRoZSB0eXBlIG9mIHRoZSBWQUxVRSBhcmd1bWVudCB0aGV5IGFjY2VwdC4KLSAgIFRPRE86IGZsb2F0aW5nIHBvaW50LCBpbmxpbmluZyBzdXBwb3J0LCByZW1vdmUgY2FzZXMgd2hlcmUgYXJndW1lbnQgdHlwZQotICAgbm90IGFwcHJvcHJpYXRlLiAgKi8KLQotdm9pZAotbTMycl9jZ2VuX3NldF9pbnRfb3BlcmFuZCAoY2QsIG9waW5kZXgsIGZpZWxkcywgdmFsdWUpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci0gICAgIGludCBvcGluZGV4OwotICAgICBDR0VOX0ZJRUxEUyAqIGZpZWxkczsKLSAgICAgaW50IHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBmaWVsZHMtPmZfaGkxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZmllbGRzLT5mX3VpbW00ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTUgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi12b2lkCi1tMzJyX2NnZW5fc2V0X3ZtYV9vcGVyYW5kIChjZCwgb3BpbmRleCwgZmllbGRzLCB2YWx1ZSkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLSAgICAgaW50IG9waW5kZXg7Ci0gICAgIENHRU5fRklFTERTICogZmllbGRzOwotICAgICBiZmRfdm1hIHZhbHVlOwotewotICBzd2l0Y2ggKG9waW5kZXgpCi0gICAgewotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RDUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0RJU1AxNiA6Ci0gICAgICBmaWVsZHMtPmZfZGlzcDE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9ESVNQMjQgOgotICAgICAgZmllbGRzLT5mX2Rpc3AyNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfRElTUDggOgotICAgICAgZmllbGRzLT5mX2Rpc3A4ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9EUiA6Ci0gICAgICBmaWVsZHMtPmZfcjEgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX0hBU0ggOgotICAgICAgZmllbGRzLT5mX25pbCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfSEkxNiA6Ci0gICAgICBmaWVsZHMtPmZfaGkxNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0NSIDoKLSAgICAgIGZpZWxkcy0+Zl9yMiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0lNTTE2IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1NJTU04IDoKLSAgICAgIGZpZWxkcy0+Zl9zaW1tOCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU0xPMTYgOgotICAgICAgZmllbGRzLT5mX3NpbW0xNiA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1IgOgotICAgICAgZmllbGRzLT5mX3IyID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9TUkMxIDoKLSAgICAgIGZpZWxkcy0+Zl9yMSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfU1JDMiA6Ci0gICAgICBmaWVsZHMtPmZfcjIgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VJTU0xNiA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTE2ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NMjQgOgotICAgICAgZmllbGRzLT5mX3VpbW0yNCA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNMzJSX09QRVJBTkRfVUlNTTQgOgotICAgICAgZmllbGRzLT5mX3VpbW00ID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE0zMlJfT1BFUkFORF9VSU1NNSA6Ci0gICAgICBmaWVsZHMtPmZfdWltbTUgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTTMyUl9PUEVSQU5EX1VMTzE2IDoKLSAgICAgIGZpZWxkcy0+Zl91aW1tMTYgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdCA6Ci0gICAgICAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotICAgICAgZnByaW50ZiAoc3RkZXJyLCBfKCJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyB2bWEgb3BlcmFuZC5cbiIpLAotCQkgICAgICAgb3BpbmRleCk7Ci0gICAgICBhYm9ydCAoKTsKLSAgfQotfQotCi0vKiBGdW5jdGlvbiB0byBjYWxsIGJlZm9yZSB1c2luZyB0aGUgaW5zdHJ1Y3Rpb24gYnVpbGRlciB0YWJsZXMuICAqLwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9pYmxkX3RhYmxlIChjZCkKLSAgICAgQ0dFTl9DUFVfREVTQyBjZDsKLXsKLSAgY2QtPmluc2VydF9oYW5kbGVycyA9ICYgbTMycl9jZ2VuX2luc2VydF9oYW5kbGVyc1swXTsKLSAgY2QtPmV4dHJhY3RfaGFuZGxlcnMgPSAmIG0zMnJfY2dlbl9leHRyYWN0X2hhbmRsZXJzWzBdOwotCi0gIGNkLT5pbnNlcnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9pbnNlcnRfb3BlcmFuZDsKLSAgY2QtPmV4dHJhY3Rfb3BlcmFuZCA9IG0zMnJfY2dlbl9leHRyYWN0X29wZXJhbmQ7Ci0KLSAgY2QtPmdldF9pbnRfb3BlcmFuZCA9IG0zMnJfY2dlbl9nZXRfaW50X29wZXJhbmQ7Ci0gIGNkLT5zZXRfaW50X29wZXJhbmQgPSBtMzJyX2NnZW5fc2V0X2ludF9vcGVyYW5kOwotICBjZC0+Z2V0X3ZtYV9vcGVyYW5kID0gbTMycl9jZ2VuX2dldF92bWFfb3BlcmFuZDsKLSAgY2QtPnNldF92bWFfb3BlcmFuZCA9IG0zMnJfY2dlbl9zZXRfdm1hX29wZXJhbmQ7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItb3BjLmMgYi9vcGNvZGVzL20zMnItb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZWRmOWEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMSArMCwwIEBACi0vKiBJbnN0cnVjdGlvbiBvcGNvZGUgdGFibGUgZm9yIG0zMnIuCi0KLVRISVMgRklMRSBJUyBNQUNISU5FIEdFTkVSQVRFRCBXSVRIIENHRU4uCi0KLUNvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBCaW51dGlscyBhbmQvb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLWFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLTU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSovCi0KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgImJmZC5oIgotI2luY2x1ZGUgInN5bWNhdC5oIgotI2luY2x1ZGUgIm0zMnItZGVzYy5oIgotI2luY2x1ZGUgIm0zMnItb3BjLmgiCi0KLS8qIFRoZSBoYXNoIGZ1bmN0aW9ucyBhcmUgcmVjb3JkZWQgaGVyZSB0byBoZWxwIGtlZXAgYXNzZW1ibGVyIGNvZGUgb3V0IG9mCi0gICB0aGUgZGlzYXNzZW1ibGVyIGFuZCB2aWNlIHZlcnNhLiAgKi8KLQotc3RhdGljIGludCBhc21faGFzaF9pbnNuX3AgUEFSQU1TICgoY29uc3QgQ0dFTl9JTlNOICopKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXNtX2hhc2hfaW5zbiBQQVJBTVMgKChjb25zdCBjaGFyICopKTsKLXN0YXRpYyBpbnQgZGlzX2hhc2hfaW5zbl9wIFBBUkFNUyAoKGNvbnN0IENHRU5fSU5TTiAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRpc19oYXNoX2luc24gUEFSQU1TICgoY29uc3QgY2hhciAqLCBDR0VOX0lOU05fSU5UKSk7Ci0KLS8qIEluc3RydWN0aW9uIGZvcm1hdHMuICAqLwotCi0jZGVmaW5lIEYoZikgJiBtMzJyX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChNMzJSXyxmKV0KLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2VtcHR5ID0gewotICAwLCAwLCAweDAsIHsgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYWRkID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGQzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hbmQzID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9VSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9vcjMgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1VJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2FkZGkgPSB7Ci0gIDE2LCAxNiwgMHhmMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfU0lNTTgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9hZGR2MyA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmM4ID0gewotICAxNiwgMTYsIDB4ZmYwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1A4KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmMyNCA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmVxID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9ESVNQMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iZXF6ID0gewotICAzMiwgMzIsIDB4ZmZmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9ESVNQMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9jbXAgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2NtcGkgPSB7Ci0gIDMyLCAzMiwgMHhmZmYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2RpdiA9IHsKLSAgMzIsIDMyLCAweGYwZjBmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfamwgPSB7Ci0gIDE2LCAxNiwgMHhmZmYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkMjQgPSB7Ci0gIDMyLCAzMiwgMHhmMDAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1VJTU0yNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTE2ID0gewotICAzMiwgMzIsIDB4ZjBmZjAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdmZhY2hpID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdmZjID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdnRhY2hpID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9tdnRjID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ub3AgPSB7Ci0gIDE2LCAxNiwgMHhmZmZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3NldGggPSB7Ci0gIDMyLCAzMiwgMHhmMGZmMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX0hJMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zbGxpID0gewotICAxNiwgMTYsIDB4ZjBlMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX1NISUZUX09QMiksIEYgKEZfVUlNTTUpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdF9kID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF90cmFwID0gewotICAxNiwgMTYsIDB4ZmZmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfVUlNTTQpLCAwIH0KLX07Ci0KLSN1bmRlZiBGCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIG0zMnJfY2dlbl9pbnNuX29wY29kZV90YWJsZVtNQVhfSU5TTlNdID0KLXsKLSAgLyogU3BlY2lhbCBudWxsIGZpcnN0IGVudHJ5LgotICAgICBBIGBudW0nIHZhbHVlIG9mIHplcm8gaXMgdGh1cyBpbnZhbGlkLgotICAgICBBbHNvLCB0aGUgc3BlY2lhbCBgaW52YWxpZCcgaW5zbiByZXNpZGVzIGhlcmUuICAqLwotICB7IHsgMCB9IH0sCi0vKiBhZGQgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YTAgfQotICB9LAotLyogYWRkMyAkZHIsJHNyLCRoYXNoJHNsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweDgwYTAwMDAwIH0KLSAgfSwKLS8qIGFuZCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHhjMCB9Ci0gIH0sCi0vKiBhbmQzICRkciwkc3IsJHVpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChVSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYW5kMywgeyAweDgwYzAwMDAwIH0KLSAgfSwKLS8qIG9yICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGUwIH0KLSAgfSwKLS8qIG9yMyAkZHIsJHNyLCRoYXNoJHVsbzE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKEhBU0gpLCBPUCAoVUxPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfb3IzLCB7IDB4ODBlMDAwMDAgfQotICB9LAotLyogeG9yICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweGQwIH0KLSAgfSwKLS8qIHhvcjMgJGRyLCRzciwkdWltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFVJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hbmQzLCB7IDB4ODBkMDAwMDAgfQotICB9LAotLyogYWRkaSAkZHIsJHNpbW04ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTSU1NOCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4NDAwMCB9Ci0gIH0sCi0vKiBhZGR2ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDgwIH0KLSAgfSwKLS8qIGFkZHYzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg4MDgwMDAwMCB9Ci0gIH0sCi0vKiBhZGR4ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDkwIH0KLSAgfSwKLS8qIGJjLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2MwMCB9Ci0gIH0sCi0vKiBiYy5sICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNCwgeyAweGZjMDAwMDAwIH0KLSAgfSwKLS8qIGJlcSAkc3JjMSwkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAnLCcsIE9QIChESVNQMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmVxLCB7IDB4YjAwMDAwMDAgfQotICB9LAotLyogYmVxeiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjA4MDAwMDAgfQotICB9LAotLyogYmdleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBiMDAwMDAgfQotICB9LAotLyogYmd0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBkMDAwMDAgfQotICB9LAotLyogYmxleiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBjMDAwMDAgfQotICB9LAotLyogYmx0eiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjBhMDAwMDAgfQotICB9LAotLyogYm5leiAkc3JjMiwkZGlzcDE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKERJU1AxNiksIDAgfSB9LAotICAgICYgaWZtdF9iZXF6LCB7IDB4YjA5MDAwMDAgfQotICB9LAotLyogYmwucyAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9iYzgsIHsgMHg3ZTAwIH0KLSAgfSwKLS8qIGJsLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmUwMDAwMDAgfQotICB9LAotLyogYm5jLnMgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmM4LCB7IDB4N2QwMCB9Ci0gIH0sCi0vKiBibmMubCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjMjQsIHsgMHhmZDAwMDAwMCB9Ci0gIH0sCi0vKiBibmUgJHNyYzEsJHNyYzIsJGRpc3AxNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgJywnLCBPUCAoRElTUDE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2JlcSwgeyAweGIwMTAwMDAwIH0KLSAgfSwKLS8qIGJyYS5zICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOCwgeyAweDdmMDAgfQotICB9LAotLyogYnJhLmwgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9iYzI0LCB7IDB4ZmYwMDAwMDAgfQotICB9LAotLyogY21wICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4NDAgfQotICB9LAotLyogY21waSAkc3JjMiwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9jbXBpLCB7IDB4ODA0MDAwMDAgfQotICB9LAotLyogY21wdSAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDUwIH0KLSAgfSwKLS8qIGNtcHVpICRzcmMyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcGksIHsgMHg4MDUwMDAwMCB9Ci0gIH0sCi0vKiBkaXYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAwMDAwMDAgfQotICB9LAotLyogZGl2dSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDEwMDAwMCB9Ci0gIH0sCi0vKiByZW0gJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfZGl2LCB7IDB4OTAyMDAwMDAgfQotICB9LAotLyogcmVtdSAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9kaXYsIHsgMHg5MDMwMDAwMCB9Ci0gIH0sCi0vKiBqbCAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9qbCwgeyAweDFlYzAgfQotICB9LAotLyogam1wICRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2psLCB7IDB4MWZjMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGMwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMGMwMDAwMCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjA4MCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwODAwMDAwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGEwIH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc2xvMTYsJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNMTzE2KSwgJywnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9hZGQzLCB7IDB4YTBhMDAwMDAgfQotICB9LAotLyogbGR1YiAkZHIsQCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMDkwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNsbzE2LCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTTE8xNiksICcsJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkMywgeyAweGEwOTAwMDAwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MjBiMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzbG8xNiwkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2FkZDMsIHsgMHhhMGIwMDAwMCB9Ci0gIH0sCi0vKiBsZCAkZHIsQCRzcisgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCBPUCAoU1IpLCAnKycsIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgyMGUwIH0KLSAgfSwKLS8qIGxkMjQgJGRyLCR1aW1tMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU0yNCksIDAgfSB9LAotICAgICYgaWZtdF9sZDI0LCB7IDB4ZTAwMDAwMDAgfQotICB9LAotLyogbGRpOCAkZHIsJHNpbW04ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTSU1NOCksIDAgfSB9LAotICAgICYgaWZtdF9hZGRpLCB7IDB4NjAwMCB9Ci0gIH0sCi0vKiBsZGkxNiAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMTYsIHsgMHg5MGYwMDAwMCB9Ci0gIH0sCi0vKiBsb2NrICRkcixAJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwZDAgfQotICB9LAotLyogbWFjaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDQwIH0KLSAgfSwKLS8qIG1hY2xvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzA1MCB9Ci0gIH0sCi0vKiBtYWN3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDYwIH0KLSAgfSwKLS8qIG1hY3dsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwNzAgfQotICB9LAotLyogbXVsICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwNjAgfQotICB9LAotLyogbXVsaGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDAwIH0KLSAgfSwKLS8qIG11bGxvICRzcmMxLCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MzAxMCB9Ci0gIH0sCi0vKiBtdWx3aGkgJHNyYzEsJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgzMDIwIH0KLSAgfSwKLS8qIG11bHdsbyAkc3JjMSwkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDMwMzAgfQotICB9LAotLyogbXYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTA4MCB9Ci0gIH0sCi0vKiBtdmZhY2hpICRkciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgMCB9IH0sCi0gICAgJiBpZm10X212ZmFjaGksIHsgMHg1MGYwIH0KLSAgfSwKLS8qIG12ZmFjbG8gJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYWNoaSwgeyAweDUwZjEgfQotICB9LAotLyogbXZmYWNtaSAkZHIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksIDAgfSB9LAotICAgICYgaWZtdF9tdmZhY2hpLCB7IDB4NTBmMiB9Ci0gIH0sCi0vKiBtdmZjICRkciwkc2NyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTQ1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZmYywgeyAweDEwOTAgfQotICB9LAotLyogbXZ0YWNoaSAkc3JjMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YWNoaSwgeyAweDUwNzAgfQotICB9LAotLyogbXZ0YWNsbyAkc3JjMSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAwIH0gfSwKLSAgICAmIGlmbXRfbXZ0YWNoaSwgeyAweDUwNzEgfQotICB9LAotLyogbXZ0YyAkc3IsJGRjciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSKSwgJywnLCBPUCAoRENSKSwgMCB9IH0sCi0gICAgJiBpZm10X212dGMsIHsgMHgxMGEwIH0KLSAgfSwKLS8qIG5lZyAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgzMCB9Ci0gIH0sCi0vKiBub3AgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAwIH0gfSwKLSAgICAmIGlmbXRfbm9wLCB7IDB4NzAwMCB9Ci0gIH0sCi0vKiBub3QgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4YjAgfQotICB9LAotLyogcmFjICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgMCB9IH0sCi0gICAgJiBpZm10X25vcCwgeyAweDUwOTAgfQotICB9LAotLyogcmFjaCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHg1MDgwIH0KLSAgfSwKLS8qIHJ0ZSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sIDAgfSB9LAotICAgICYgaWZtdF9ub3AsIHsgMHgxMGQ2IH0KLSAgfSwKLS8qIHNldGggJGRyLCRoYXNoJGhpMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoSEkxNiksIDAgfSB9LAotICAgICYgaWZtdF9zZXRoLCB7IDB4ZDBjMDAwMDAgfQotICB9LAotLyogc2xsICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwNDAgfQotICB9LAotLyogc2xsMyAkZHIsJHNyLCRzaW1tMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgJywnLCBPUCAoU0lNTTE2KSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZHYzLCB7IDB4OTBjMDAwMDAgfQotICB9LAotLyogc2xsaSAkZHIsJHVpbW01ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChVSU1NNSksIDAgfSB9LAotICAgICYgaWZtdF9zbGxpLCB7IDB4NTA0MCB9Ci0gIH0sCi0vKiBzcmEgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MTAyMCB9Ci0gIH0sCi0vKiBzcmEzICRkciwkc3IsJHNpbW0xNiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAnLCcsIE9QIChTSU1NMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkdjMsIHsgMHg5MGEwMDAwMCB9Ci0gIH0sCi0vKiBzcmFpICRkciwkdWltbTUgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFVJTU01KSwgMCB9IH0sCi0gICAgJiBpZm10X3NsbGksIHsgMHg1MDIwIH0KLSAgfSwKLS8qIHNybCAkZHIsJHNyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksIDAgfSB9LAotICAgICYgaWZtdF9hZGQsIHsgMHgxMDAwIH0KLSAgfSwKLS8qIHNybDMgJGRyLCRzciwkc2ltbTE2ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsIE9QIChTUiksICcsJywgT1AgKFNJTU0xNiksIDAgfSB9LAotICAgICYgaWZtdF9hZGR2MywgeyAweDkwODAwMDAwIH0KLSAgfSwKLS8qIHNybGkgJGRyLCR1aW1tNSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoVUlNTTUpLCAwIH0gfSwKLSAgICAmIGlmbXRfc2xsaSwgeyAweDUwMDAgfQotICB9LAotLyogc3QgJHNyYzEsQCRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCBPUCAoU1JDMiksIDAgfSB9LAotICAgICYgaWZtdF9jbXAsIHsgMHgyMDQwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwNDAwMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwMDAwMDAwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwMjAgfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNsbzE2LCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU0xPMTYpLCAnLCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RfZCwgeyAweGEwMjAwMDAwIH0KLSAgfSwKLS8qIHN0ICRzcmMxLEArJHNyYzIgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcrJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA2MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxALSRzcmMyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnLScsIE9QIChTUkMyKSwgMCB9IH0sCi0gICAgJiBpZm10X2NtcCwgeyAweDIwNzAgfQotICB9LAotLyogc3ViICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDIwIH0KLSAgfSwKLS8qIHN1YnYgJGRyLCRzciAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU1IpLCAwIH0gfSwKLSAgICAmIGlmbXRfYWRkLCB7IDB4MCB9Ci0gIH0sCi0vKiBzdWJ4ICRkciwkc3IgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKFNSKSwgMCB9IH0sCi0gICAgJiBpZm10X2FkZCwgeyAweDEwIH0KLSAgfSwKLS8qIHRyYXAgJHVpbW00ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoVUlNTTQpLCAwIH0gfSwKLSAgICAmIGlmbXRfdHJhcCwgeyAweDEwZjAgfQotICB9LAotLyogdW5sb2NrICRzcmMxLEAkc3JjMiAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgT1AgKFNSQzIpLCAwIH0gfSwKLSAgICAmIGlmbXRfY21wLCB7IDB4MjA1MCB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotLyogRm9ybWF0cyBmb3IgQUxJQVMgbWFjcm8taW5zbnMuICAqLwotCi0jZGVmaW5lIEYoZikgJiBtMzJyX2NnZW5faWZsZF90YWJsZVtDT05DQVQyIChNMzJSXyxmKV0KLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JjOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9iYzI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYmw4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JsMjRyID0gewotICAzMiwgMzIsIDB4ZmYwMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQMjQpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9ibmM4ciA9IHsKLSAgMTYsIDE2LCAweGZmMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9ESVNQOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2JuYzI0ciA9IHsKLSAgMzIsIDMyLCAweGZmMDAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDI0KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfYnJhOHIgPSB7Ci0gIDE2LCAxNiwgMHhmZjAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfRElTUDgpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9icmEyNHIgPSB7Ci0gIDMyLCAzMiwgMHhmZjAwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX0RJU1AyNCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGJfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRiX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGRoX2QyID0gewotICAzMiwgMzIsIDB4ZjBmMDAwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgRiAoRl9TSU1NMTYpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZHViXzIgPSB7Ci0gIDE2LCAxNiwgMHhmMGYwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkdWhfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfbGR1aF9kMiA9IHsKLSAgMzIsIDMyLCAweGYwZjAwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfcG9wID0gewotICAxNiwgMTYsIDB4ZjBmZiwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9sZGk4YSA9IHsKLSAgMTYsIDE2LCAweGYwMDAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9TSU1NOCksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X2xkaTE2YSA9IHsKLSAgMzIsIDMyLCAweGYwZmYwMDAwLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIEYgKEZfU0lNTTE2KSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfMiA9IHsKLSAgMTYsIDE2LCAweGYwZjAsIHsgRiAoRl9PUDEpLCBGIChGX1IxKSwgRiAoRl9PUDIpLCBGIChGX1IyKSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9JRk1UIGlmbXRfc3RfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0Yl8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGJfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3N0aF8yID0gewotICAxNiwgMTYsIDB4ZjBmMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCAwIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX0lGTVQgaWZtdF9zdGhfZDIgPSB7Ci0gIDMyLCAzMiwgMHhmMGYwMDAwMCwgeyBGIChGX09QMSksIEYgKEZfUjEpLCBGIChGX09QMiksIEYgKEZfUjIpLCBGIChGX1NJTU0xNiksIDAgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fSUZNVCBpZm10X3B1c2ggPSB7Ci0gIDE2LCAxNiwgMHhmMGZmLCB7IEYgKEZfT1AxKSwgRiAoRl9SMSksIEYgKEZfT1AyKSwgRiAoRl9SMiksIDAgfQotfTsKLQotI3VuZGVmIEYKLQotLyogRWFjaCBub24tc2ltcGxlIG1hY3JvIGVudHJ5IHBvaW50cyB0byBhbiBhcnJheSBvZiBleHBhbnNpb24gcG9zc2liaWxpdGllcy4gICovCi0KLSNkZWZpbmUgQShhKSAoMSA8PCBDT05DQVQyIChDR0VOX0lOU05fLGEpKQotI2RlZmluZSBNTkVNIENHRU5fU1lOVEFYX01ORU1PTklDIC8qIHN5bnRheCB2YWx1ZSBmb3IgbW5lbW9uaWMgKi8KLSNkZWZpbmUgT1BFUkFORChvcCkgQ09OQ0FUMiAoTTMyUl9PUEVSQU5EXyxvcCkKLSNkZWZpbmUgT1AoZmllbGQpIENHRU5fU1lOVEFYX01BS0VfRklFTEQgKE9QRVJBTkQgKGZpZWxkKSkKLQotLyogVGhlIG1hY3JvIGluc3RydWN0aW9uIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fSUJBU0UgbTMycl9jZ2VuX21hY3JvX2luc25fdGFibGVbXSA9Ci17Ci0vKiBiYyAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYmM4ciIsICJiYyIsIDE2LAotICAgIHsgMHxBKFJFTEFYQUJMRSl8QShDT05EX0NUSSl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBiYyAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJjMjRyIiwgImJjIiwgMzIsCi0gICAgeyAwfEEoUkVMQVgpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmwgJGRpc3A4ICovCi0gIHsKLSAgICAtMSwgImJsOHIiLCAiYmwiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoRklMTF9TTE9UKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYmwgJGRpc3AyNCAqLwotICB7Ci0gICAgLTEsICJibDI0ciIsICJibCIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKFVOQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jICRkaXNwOCAqLwotICB7Ci0gICAgLTEsICJibmM4ciIsICJibmMiLCAxNiwKLSAgICB7IDB8QShSRUxBWEFCTEUpfEEoQ09ORF9DVEkpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogYm5jICRkaXNwMjQgKi8KLSAgewotICAgIC0xLCAiYm5jMjRyIiwgImJuYyIsIDMyLAotICAgIHsgMHxBKFJFTEFYKXxBKENPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYSAkZGlzcDggKi8KLSAgewotICAgIC0xLCAiYnJhOHIiLCAiYnJhIiwgMTYsCi0gICAgeyAwfEEoUkVMQVhBQkxFKXxBKEZJTExfU0xPVCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGJyYSAkZGlzcDI0ICovCi0gIHsKLSAgICAtMSwgImJyYTI0ciIsICJicmEiLCAzMiwKLSAgICB7IDB8QShSRUxBWCl8QShVTkNPTkRfQ1RJKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGQtMiIsICJsZCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZC1kMiIsICJsZCIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZGItMiIsICJsZGIiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRiICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkYi1kMiIsICJsZGIiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRoICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGRoLTIiLCAibGRoIiwgMTYsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkaCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZGgtZDIiLCAibGRoIiwgMzIsCi0gICAgeyAwfEEoTk9fRElTKXxBKEFMSUFTKSwgeyAoMTw8TUFDSF9CQVNFKSB9IH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgLTEsICJsZHViLTIiLCAibGR1YiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHViICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgImxkdWItZDIiLCAibGR1YiIsIDMyLAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzcikgKi8KLSAgewotICAgIC0xLCAibGR1aC0yIiwgImxkdWgiLCAxNiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGR1aCAkZHIsQCgkc3IsJHNsbzE2KSAqLwotICB7Ci0gICAgLTEsICJsZHVoLWQyIiwgImxkdWgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcG9wICRkciAqLwotICB7Ci0gICAgLTEsICJwb3AiLCAicG9wIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpICRkciwkc2ltbTggKi8KLSAgewotICAgIC0xLCAibGRpOGEiLCAibGRpIiwgMTYsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogbGRpICRkciwkaGFzaCRzbG8xNiAqLwotICB7Ci0gICAgLTEsICJsZGkxNmEiLCAibGRpIiwgMzIsCi0gICAgeyAwfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIC0xLCAic3QtMiIsICJzdCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIC0xLCAic3QtZDIiLCAic3QiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICAtMSwgInN0Yi0yIiwgInN0YiIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGIgJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0Yi1kMiIsICJzdGIiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogc3RoICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICAtMSwgInN0aC0yIiwgInN0aCIsIDE2LAotICAgIHsgMHxBKE5PX0RJUyl8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICAtMSwgInN0aC1kMiIsICJzdGgiLCAzMiwKLSAgICB7IDB8QShOT19ESVMpfEEoQUxJQVMpLCB7ICgxPDxNQUNIX0JBU0UpIH0gfQotICB9LAotLyogcHVzaCAkc3JjMSAqLwotICB7Ci0gICAgLTEsICJwdXNoIiwgInB1c2giLCAxNiwKLSAgICB7IDB8QShBTElBUyksIHsgKDE8PE1BQ0hfQkFTRSkgfSB9Ci0gIH0sCi19OwotCi0vKiBUaGUgbWFjcm8gaW5zdHJ1Y3Rpb24gb3Bjb2RlIHRhYmxlLiAgKi8KLQotc3RhdGljIGNvbnN0IENHRU5fT1BDT0RFIG0zMnJfY2dlbl9tYWNyb19pbnNuX29wY29kZV90YWJsZVtdID0KLXsKLS8qIGJjICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JjOHIsIHsgMHg3YzAwIH0KLSAgfSwKLS8qIGJjICRkaXNwMjQgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQMjQpLCAwIH0gfSwKLSAgICAmIGlmbXRfYmMyNHIsIHsgMHhmYzAwMDAwMCB9Ci0gIH0sCi0vKiBibCAkZGlzcDggKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChESVNQOCksIDAgfSB9LAotICAgICYgaWZtdF9ibDhyLCB7IDB4N2UwMCB9Ci0gIH0sCi0vKiBibCAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JsMjRyLCB7IDB4ZmUwMDAwMDAgfQotICB9LAotLyogYm5jICRkaXNwOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1A4KSwgMCB9IH0sCi0gICAgJiBpZm10X2JuYzhyLCB7IDB4N2QwMCB9Ci0gIH0sCi0vKiBibmMgJGRpc3AyNCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERJU1AyNCksIDAgfSB9LAotICAgICYgaWZtdF9ibmMyNHIsIHsgMHhmZDAwMDAwMCB9Ci0gIH0sCi0vKiBicmEgJGRpc3A4ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDgpLCAwIH0gfSwKLSAgICAmIGlmbXRfYnJhOHIsIHsgMHg3ZjAwIH0KLSAgfSwKLS8qIGJyYSAkZGlzcDI0ICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRElTUDI0KSwgMCB9IH0sCi0gICAgJiBpZm10X2JyYTI0ciwgeyAweGZmMDAwMDAwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkXzIsIHsgMHgyMGMwIH0KLSAgfSwKLS8qIGxkICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkX2QyLCB7IDB4YTBjMDAwMDAgfQotICB9LAotLyogbGRiICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkYl8yLCB7IDB4MjA4MCB9Ci0gIH0sCi0vKiBsZGIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRiX2QyLCB7IDB4YTA4MDAwMDAgfQotICB9LAotLyogbGRoICRkcixAKCRzcikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkaF8yLCB7IDB4MjBhMCB9Ci0gIH0sCi0vKiBsZGggJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRoX2QyLCB7IDB4YTBhMDAwMDAgfQotICB9LAotLyogbGR1YiAkZHIsQCgkc3IpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9sZHViXzIsIHsgMHgyMDkwIH0KLSAgfSwKLS8qIGxkdWIgJGRyLEAoJHNyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgJ0AnLCAnKCcsIE9QIChTUiksICcsJywgT1AgKFNMTzE2KSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1Yl9kMiwgeyAweGEwOTAwMDAwIH0KLSAgfSwKLS8qIGxkdWggJGRyLEAoJHNyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCAnQCcsICcoJywgT1AgKFNSKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfbGR1aF8yLCB7IDB4MjBiMCB9Ci0gIH0sCi0vKiBsZHVoICRkcixAKCRzciwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAnLCcsICdAJywgJygnLCBPUCAoU1IpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X2xkdWhfZDIsIHsgMHhhMGIwMDAwMCB9Ci0gIH0sCi0vKiBwb3AgJGRyICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoRFIpLCAwIH0gfSwKLSAgICAmIGlmbXRfcG9wLCB7IDB4MjBlZiB9Ci0gIH0sCi0vKiBsZGkgJGRyLCRzaW1tOCAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKERSKSwgJywnLCBPUCAoU0lNTTgpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpOGEsIHsgMHg2MDAwIH0KLSAgfSwKLS8qIGxkaSAkZHIsJGhhc2gkc2xvMTYgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChEUiksICcsJywgT1AgKEhBU0gpLCBPUCAoU0xPMTYpLCAwIH0gfSwKLSAgICAmIGlmbXRfbGRpMTZhLCB7IDB4OTBmMDAwMDAgfQotICB9LAotLyogc3QgJHNyYzEsQCgkc3JjMikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdF8yLCB7IDB4MjA0MCB9Ci0gIH0sCi0vKiBzdCAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0X2QyLCB7IDB4YTA0MDAwMDAgfQotICB9LAotLyogc3RiICRzcmMxLEAoJHNyYzIpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJyknLCAwIH0gfSwKLSAgICAmIGlmbXRfc3RiXzIsIHsgMHgyMDAwIH0KLSAgfSwKLS8qIHN0YiAkc3JjMSxAKCRzcmMyLCRzbG8xNikgKi8KLSAgewotICAgIHsgMCwgMCwgMCwgMCB9LAotICAgIHsgeyBNTkVNLCAnICcsIE9QIChTUkMxKSwgJywnLCAnQCcsICcoJywgT1AgKFNSQzIpLCAnLCcsIE9QIChTTE8xNiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0Yl9kMiwgeyAweGEwMDAwMDAwIH0KLSAgfSwKLS8qIHN0aCAkc3JjMSxAKCRzcmMyKSAqLwotICB7Ci0gICAgeyAwLCAwLCAwLCAwIH0sCi0gICAgeyB7IE1ORU0sICcgJywgT1AgKFNSQzEpLCAnLCcsICdAJywgJygnLCBPUCAoU1JDMiksICcpJywgMCB9IH0sCi0gICAgJiBpZm10X3N0aF8yLCB7IDB4MjAyMCB9Ci0gIH0sCi0vKiBzdGggJHNyYzEsQCgkc3JjMiwkc2xvMTYpICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksICcsJywgJ0AnLCAnKCcsIE9QIChTUkMyKSwgJywnLCBPUCAoU0xPMTYpLCAnKScsIDAgfSB9LAotICAgICYgaWZtdF9zdGhfZDIsIHsgMHhhMDIwMDAwMCB9Ci0gIH0sCi0vKiBwdXNoICRzcmMxICovCi0gIHsKLSAgICB7IDAsIDAsIDAsIDAgfSwKLSAgICB7IHsgTU5FTSwgJyAnLCBPUCAoU1JDMSksIDAgfSB9LAotICAgICYgaWZtdF9wdXNoLCB7IDB4MjA3ZiB9Ci0gIH0sCi19OwotCi0jdW5kZWYgQQotI3VuZGVmIE1ORU0KLSN1bmRlZiBPUEVSQU5ECi0jdW5kZWYgT1AKLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNIX1AKLSNkZWZpbmUgQ0dFTl9BU01fSEFTSF9QKGluc24pIDEKLSNlbmRpZgotCi0jaWZuZGVmIENHRU5fRElTX0hBU0hfUAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1AoaW5zbikgMQotI2VuZGlmCi0KLS8qIFJldHVybiBub24temVybyBpZiBJTlNOIGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBoYXNoIHRhYmxlLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIX1AgaW4gdGhlIC5vcGMgZmlsZS4gICovCi0KLXN0YXRpYyBpbnQKLWFzbV9oYXNoX2luc25fcCAoaW5zbikKLSAgICAgY29uc3QgQ0dFTl9JTlNOICppbnNuOwotewotICByZXR1cm4gQ0dFTl9BU01fSEFTSF9QIChpbnNuKTsKLX0KLQotc3RhdGljIGludAotZGlzX2hhc2hfaW5zbl9wIChpbnNuKQotICAgICBjb25zdCBDR0VOX0lOU04gKmluc247Ci17Ci0gIC8qIElmIGJ1aWxkaW5nIHRoZSBoYXNoIHRhYmxlIGFuZCB0aGUgTk8tRElTIGF0dHJpYnV0ZSBpcyBwcmVzZW50LAotICAgICBpZ25vcmUuICAqLwotICBpZiAoQ0dFTl9JTlNOX0FUVFJfVkFMVUUgKGluc24sIENHRU5fSU5TTl9OT19ESVMpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gQ0dFTl9ESVNfSEFTSF9QIChpbnNuKTsKLX0KLQotI2lmbmRlZiBDR0VOX0FTTV9IQVNICi0jZGVmaW5lIENHRU5fQVNNX0hBU0hfU0laRSAxMjcKLSNpZmRlZiBDR0VOX01ORU1PTklDX09QRVJBTkRTCi0jZGVmaW5lIENHRU5fQVNNX0hBU0gobW5lbSkgKCoodW5zaWduZWQgY2hhciAqKSAobW5lbSkgJSBDR0VOX0FTTV9IQVNIX1NJWkUpCi0jZWxzZQotI2RlZmluZSBDR0VOX0FTTV9IQVNIKG1uZW0pICgqKHVuc2lnbmVkIGNoYXIgKikgKG1uZW0pICUgQ0dFTl9BU01fSEFTSF9TSVpFKSAvKkZJWE1FKi8KLSNlbmRpZgotI2VuZGlmCi0KLS8qIEl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHByb3ZpZGUgYSBkZWZhdWx0IGhlcmUsCi0gICBidXQgd2hpbGUgdGhpcyBpcyB1bmRlciBkZXZlbG9wbWVudCB3ZSBkby4KLSAgIEJVRkZFUiBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIG9mIHRoZSBpbnNuLCB0YXJnZXQgb3JkZXIuCi0gICBWQUxVRSBpcyB0aGUgZmlyc3QgYmFzZV9pbnNuX2JpdHNpemUgYml0cyBhcyBhbiBpbnQgaW4gaG9zdCBvcmRlci4gICovCi0KLSNpZm5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmLCB2YWx1ZSkgKCoodW5zaWduZWQgY2hhciAqKSAoYnVmKSkKLSNlbmRpZgotCi0vKiBUaGUgcmVzdWx0IGlzIHRoZSBoYXNoIHZhbHVlIG9mIHRoZSBpbnNuLgotICAgVGFyZ2V0cyBhcmUgZnJlZSB0byBvdmVycmlkZSBDR0VOX3tBU00sRElTfV9IQVNIIGluIHRoZSAub3BjIGZpbGUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1hc21faGFzaF9pbnNuIChtbmVtKQotICAgICBjb25zdCBjaGFyICogbW5lbTsKLXsKLSAgcmV0dXJuIENHRU5fQVNNX0hBU0ggKG1uZW0pOwotfQotCi0vKiBCVUYgaXMgYSBwb2ludGVyIHRvIHRoZSBieXRlcyBvZiB0aGUgaW5zbiwgdGFyZ2V0IG9yZGVyLgotICAgVkFMVUUgaXMgdGhlIGZpcnN0IGJhc2VfaW5zbl9iaXRzaXplIGJpdHMgYXMgYW4gaW50IGluIGhvc3Qgb3JkZXIuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1kaXNfaGFzaF9pbnNuIChidWYsIHZhbHVlKQotICAgICBjb25zdCBjaGFyICogYnVmOwotICAgICBDR0VOX0lOU05fSU5UIHZhbHVlOwotewotICByZXR1cm4gQ0dFTl9ESVNfSEFTSCAoYnVmLCB2YWx1ZSk7Ci19Ci0KLS8qIFNldCB0aGUgcmVjb3JkZWQgbGVuZ3RoIG9mIHRoZSBpbnNuIGluIHRoZSBDR0VOX0ZJRUxEUyBzdHJ1Y3QuICAqLwotCi1zdGF0aWMgdm9pZAotc2V0X2ZpZWxkc19iaXRzaXplIChmaWVsZHMsIHNpemUpCi0gICAgIENHRU5fRklFTERTICpmaWVsZHM7Ci0gICAgIGludCBzaXplOwotewotICBDR0VOX0ZJRUxEU19CSVRTSVpFIChmaWVsZHMpID0gc2l6ZTsKLX0KLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuCi0gICBUaGlzIHBsdWdzIHRoZSBvcGNvZGUgZW50cmllcyBhbmQgbWFjcm8gaW5zdHJ1Y3Rpb25zIGludG8gdGhlIGNwdSB0YWJsZS4gICovCi0KLXZvaWQKLW0zMnJfY2dlbl9pbml0X29wY29kZV90YWJsZSAoY2QpCi0gICAgIENHRU5fQ1BVX0RFU0MgY2Q7Ci17Ci0gIGludCBpOwotICBpbnQgbnVtX21hY3JvcyA9IChzaXplb2YgKG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlKSAvCi0JCSAgICBzaXplb2YgKG0zMnJfY2dlbl9tYWNyb19pbnNuX3RhYmxlWzBdKSk7Ci0gIGNvbnN0IENHRU5fSUJBU0UgKmliID0gJiBtMzJyX2NnZW5fbWFjcm9faW5zbl90YWJsZVswXTsKLSAgY29uc3QgQ0dFTl9PUENPREUgKm9jID0gJiBtMzJyX2NnZW5fbWFjcm9faW5zbl9vcGNvZGVfdGFibGVbMF07Ci0gIENHRU5fSU5TTiAqaW5zbnMgPSAoQ0dFTl9JTlNOICopIHhtYWxsb2MgKG51bV9tYWNyb3MgKiBzaXplb2YgKENHRU5fSU5TTikpOwotICBtZW1zZXQgKGluc25zLCAwLCBudW1fbWFjcm9zICogc2l6ZW9mIChDR0VOX0lOU04pKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9tYWNyb3M7ICsraSkKLSAgICB7Ci0gICAgICBpbnNuc1tpXS5iYXNlID0gJmliW2ldOwotICAgICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotICAgIH0KLSAgY2QtPm1hY3JvX2luc25fdGFibGUuaW5pdF9lbnRyaWVzID0gaW5zbnM7Ci0gIGNkLT5tYWNyb19pbnNuX3RhYmxlLmVudHJ5X3NpemUgPSBzaXplb2YgKENHRU5fSUJBU0UpOwotICBjZC0+bWFjcm9faW5zbl90YWJsZS5udW1faW5pdF9lbnRyaWVzID0gbnVtX21hY3JvczsKLQotICBvYyA9ICYgbTMycl9jZ2VuX2luc25fb3Bjb2RlX3RhYmxlWzBdOwotICBpbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3Bjb2RlID0gJm9jW2ldOwotCi0gIGNkLT5zaXplb2ZfZmllbGRzID0gc2l6ZW9mIChDR0VOX0ZJRUxEUyk7Ci0gIGNkLT5zZXRfZmllbGRzX2JpdHNpemUgPSBzZXRfZmllbGRzX2JpdHNpemU7Ci0KLSAgY2QtPmFzbV9oYXNoX3AgPSBhc21faGFzaF9pbnNuX3A7Ci0gIGNkLT5hc21faGFzaCA9IGFzbV9oYXNoX2luc247Ci0gIGNkLT5hc21faGFzaF9zaXplID0gQ0dFTl9BU01fSEFTSF9TSVpFOwotCi0gIGNkLT5kaXNfaGFzaF9wID0gZGlzX2hhc2hfaW5zbl9wOwotICBjZC0+ZGlzX2hhc2ggPSBkaXNfaGFzaF9pbnNuOwotICBjZC0+ZGlzX2hhc2hfc2l6ZSA9IENHRU5fRElTX0hBU0hfU0laRTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbTMyci1vcGMuaCBiL29wY29kZXMvbTMyci1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1N2RhYS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL20zMnItb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlIGhlYWRlciBmb3IgbTMyci4KLQotVEhJUyBGSUxFIElTIE1BQ0hJTkUgR0VORVJBVEVEIFdJVEggQ0dFTi4KLQotQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEJpbnV0aWxzIGFuZC9vciBHREIsIHRoZSBHTlUgZGVidWdnZXIuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi13aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KLQotKi8KLQotI2lmbmRlZiBNMzJSX09QQ19ICi0jZGVmaW5lIE0zMlJfT1BDX0gKLQotLyogLS0gb3BjLmggKi8KLQotI3VuZGVmIENHRU5fRElTX0hBU0hfU0laRQotI2RlZmluZSBDR0VOX0RJU19IQVNIX1NJWkUgMjU2Ci0jdW5kZWYgQ0dFTl9ESVNfSEFTSAotI2RlZmluZSBYKGIpICgoKHVuc2lnbmVkIGNoYXIgKikgKGIpKVswXSAmIDB4ZjApCi0jZGVmaW5lIENHRU5fRElTX0hBU0goYnVmZmVyLCB2YWx1ZSkgXAotKFggKGJ1ZmZlcikgfCBcCi0gKFggKGJ1ZmZlcikgPT0gMHg0MCB8fCBYIChidWZmZXIpID09IDB4ZTAgfHwgWCAoYnVmZmVyKSA9PSAweDYwIHx8IFggKGJ1ZmZlcikgPT0gMHg1MCA/IDAgXAotICA6IFggKGJ1ZmZlcikgPT0gMHg3MCB8fCBYIChidWZmZXIpID09IDB4ZjAgPyAoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVswXSAmIDB4ZikgXAotICA6IFggKGJ1ZmZlcikgPT0gMHgzMCA/ICgoKCh1bnNpZ25lZCBjaGFyICopIChidWZmZXIpKVsxXSAmIDB4NzApID4+IDQpIFwKLSAgOiAoKCgodW5zaWduZWQgY2hhciAqKSAoYnVmZmVyKSlbMV0gJiAweGYwKSA+PiA0KSkpCi0KLS8qIC0tICovCi0vKiBFbnVtIGRlY2xhcmF0aW9uIGZvciBtMzJyIGluc3RydWN0aW9uIHR5cGVzLiAgKi8KLXR5cGVkZWYgZW51bSBjZ2VuX2luc25fdHlwZSB7Ci0gIE0zMlJfSU5TTl9JTlZBTElELCBNMzJSX0lOU05fQURELCBNMzJSX0lOU05fQUREMywgTTMyUl9JTlNOX0FORAotICwgTTMyUl9JTlNOX0FORDMsIE0zMlJfSU5TTl9PUiwgTTMyUl9JTlNOX09SMywgTTMyUl9JTlNOX1hPUgotICwgTTMyUl9JTlNOX1hPUjMsIE0zMlJfSU5TTl9BRERJLCBNMzJSX0lOU05fQUREViwgTTMyUl9JTlNOX0FERFYzCi0gLCBNMzJSX0lOU05fQUREWCwgTTMyUl9JTlNOX0JDOCwgTTMyUl9JTlNOX0JDMjQsIE0zMlJfSU5TTl9CRVEKLSAsIE0zMlJfSU5TTl9CRVFaLCBNMzJSX0lOU05fQkdFWiwgTTMyUl9JTlNOX0JHVFosIE0zMlJfSU5TTl9CTEVaCi0gLCBNMzJSX0lOU05fQkxUWiwgTTMyUl9JTlNOX0JORVosIE0zMlJfSU5TTl9CTDgsIE0zMlJfSU5TTl9CTDI0Ci0gLCBNMzJSX0lOU05fQk5DOCwgTTMyUl9JTlNOX0JOQzI0LCBNMzJSX0lOU05fQk5FLCBNMzJSX0lOU05fQlJBOAotICwgTTMyUl9JTlNOX0JSQTI0Ci0gLCBNMzJSX0lOU05fQ01QLCBNMzJSX0lOU05fQ01QSSwgTTMyUl9JTlNOX0NNUFUsIE0zMlJfSU5TTl9DTVBVSQotICwgTTMyUl9JTlNOX0RJViwgTTMyUl9JTlNOX0RJVlUsIE0zMlJfSU5TTl9SRU0sIE0zMlJfSU5TTl9SRU1VCi0gLCBNMzJSX0lOU05fSkwsIE0zMlJfSU5TTl9KTVAsIE0zMlJfSU5TTl9MRCwgTTMyUl9JTlNOX0xEX0QKLSAsIE0zMlJfSU5TTl9MREIsIE0zMlJfSU5TTl9MREJfRCwgTTMyUl9JTlNOX0xESCwgTTMyUl9JTlNOX0xESF9ECi0gLCBNMzJSX0lOU05fTERVQiwgTTMyUl9JTlNOX0xEVUJfRCwgTTMyUl9JTlNOX0xEVUgsIE0zMlJfSU5TTl9MRFVIX0QKLSAsIE0zMlJfSU5TTl9MRF9QTFVTLCBNMzJSX0lOU05fTEQyNCwgTTMyUl9JTlNOX0xESTgsIE0zMlJfSU5TTl9MREkxNgotICwgTTMyUl9JTlNOX0xPQ0ssIE0zMlJfSU5TTl9NQUNISQotICwgTTMyUl9JTlNOX01BQ0xPCi0gLCBNMzJSX0lOU05fTUFDV0hJCi0gLCBNMzJSX0lOU05fTUFDV0xPCi0gLCBNMzJSX0lOU05fTVVMLCBNMzJSX0lOU05fTVVMSEkKLSAsIE0zMlJfSU5TTl9NVUxMTwotICwgTTMyUl9JTlNOX01VTFdISQotICwgTTMyUl9JTlNOX01VTFdMTwotICwgTTMyUl9JTlNOX01WLCBNMzJSX0lOU05fTVZGQUNISQotICwgTTMyUl9JTlNOX01WRkFDTE8KLSAsIE0zMlJfSU5TTl9NVkZBQ01JCi0gLCBNMzJSX0lOU05fTVZGQywgTTMyUl9JTlNOX01WVEFDSEkKLSAsIE0zMlJfSU5TTl9NVlRBQ0xPCi0gLCBNMzJSX0lOU05fTVZUQywgTTMyUl9JTlNOX05FRywgTTMyUl9JTlNOX05PUCwgTTMyUl9JTlNOX05PVAotICwgTTMyUl9JTlNOX1JBQwotICwgTTMyUl9JTlNOX1JBQ0gKLSAsIE0zMlJfSU5TTl9SVEUsIE0zMlJfSU5TTl9TRVRILCBNMzJSX0lOU05fU0xMLCBNMzJSX0lOU05fU0xMMwotICwgTTMyUl9JTlNOX1NMTEksIE0zMlJfSU5TTl9TUkEsIE0zMlJfSU5TTl9TUkEzLCBNMzJSX0lOU05fU1JBSQotICwgTTMyUl9JTlNOX1NSTCwgTTMyUl9JTlNOX1NSTDMsIE0zMlJfSU5TTl9TUkxJLCBNMzJSX0lOU05fU1QKLSAsIE0zMlJfSU5TTl9TVF9ELCBNMzJSX0lOU05fU1RCLCBNMzJSX0lOU05fU1RCX0QsIE0zMlJfSU5TTl9TVEgKLSAsIE0zMlJfSU5TTl9TVEhfRCwgTTMyUl9JTlNOX1NUX1BMVVMsIE0zMlJfSU5TTl9TVF9NSU5VUywgTTMyUl9JTlNOX1NVQgotICwgTTMyUl9JTlNOX1NVQlYsIE0zMlJfSU5TTl9TVUJYLCBNMzJSX0lOU05fVFJBUCwgTTMyUl9JTlNOX1VOTE9DSwotICwgTTMyUl9JTlNOX01BWAotfSBDR0VOX0lOU05fVFlQRTsKLQotLyogSW5kZXggb2YgYGludmFsaWQnIGluc24gcGxhY2UgaG9sZGVyLiAgKi8KLSNkZWZpbmUgQ0dFTl9JTlNOX0lOVkFMSUQgTTMyUl9JTlNOX0lOVkFMSUQKLQotLyogVG90YWwgbnVtYmVyIG9mIGluc25zIGluIHRhYmxlLiAgKi8KLSNkZWZpbmUgTUFYX0lOU05TICgoaW50KSBNMzJSX0lOU05fTUFYKQotCi0vKiBUaGlzIHN0cnVjdCByZWNvcmRzIGRhdGEgcHJpb3IgdG8gaW5zZXJ0aW9uIG9yIGFmdGVyIGV4dHJhY3Rpb24uICAqLwotc3RydWN0IGNnZW5fZmllbGRzCi17Ci0gIGludCBsZW5ndGg7Ci0gIGxvbmcgZl9uaWw7Ci0gIGxvbmcgZl9vcDE7Ci0gIGxvbmcgZl9vcDI7Ci0gIGxvbmcgZl9jb25kOwotICBsb25nIGZfcjE7Ci0gIGxvbmcgZl9yMjsKLSAgbG9uZyBmX3NpbW04OwotICBsb25nIGZfc2ltbTE2OwotICBsb25nIGZfc2hpZnRfb3AyOwotICBsb25nIGZfdWltbTQ7Ci0gIGxvbmcgZl91aW1tNTsKLSAgbG9uZyBmX3VpbW0xNjsKLSAgbG9uZyBmX3VpbW0yNDsKLSAgbG9uZyBmX2hpMTY7Ci0gIGxvbmcgZl9kaXNwODsKLSAgbG9uZyBmX2Rpc3AxNjsKLSAgbG9uZyBmX2Rpc3AyNDsKLX07Ci0KLSNkZWZpbmUgQ0dFTl9JTklUX1BBUlNFKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfSU5TRVJUKG9kKSBcCi17XAotfQotI2RlZmluZSBDR0VOX0lOSVRfRVhUUkFDVChvZCkgXAote1wKLX0KLSNkZWZpbmUgQ0dFTl9JTklUX1BSSU5UKG9kKSBcCi17XAotfQotCi0KLSNlbmRpZiAvKiBNMzJSX09QQ19IICovCmRpZmYgLS1naXQgYS9vcGNvZGVzL20zMnItb3BpbnN0LmMgYi9vcGNvZGVzL20zMnItb3BpbnN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmM2E0OWYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tMzJyLW9waW5zdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYyICswLDAgQEAKLS8qIFNlbWFudGljIG9wZXJhbmQgaW5zdGFuY2VzIGZvciBtMzJyLgotCi1USElTIEZJTEUgSVMgTUFDSElORSBHRU5FUkFURUQgV0lUSCBDR0VOLgotCi1Db3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQmludXRpbHMgYW5kL29yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlci4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi1hbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLXdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi01OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotCi0qLwotCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeW1jYXQuaCIKLSNpbmNsdWRlICJtMzJyLWRlc2MuaCIKLSNpbmNsdWRlICJtMzJyLW9wYy5oIgotCi0vKiBPcGVyYW5kIHJlZmVyZW5jZXMuICAqLwotCi0jZGVmaW5lIElOUFVUIENHRU5fT1BJTlNUX0lOUFVUCi0jZGVmaW5lIE9VVFBVVCBDR0VOX09QSU5TVF9PVVRQVVQKLSNkZWZpbmUgRU5EIENHRU5fT1BJTlNUX0VORAotI2RlZmluZSBDT05EX1JFRiBDR0VOX09QSU5TVF9DT05EX1JFRgotI2RlZmluZSBPUF9FTlQob3ApIENPTkNBVDIgKE0zMlJfT1BFUkFORF8sb3ApCi0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfZW1wdHlfb3BzW10gPSB7Ci0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYWRkX29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9hZGQzX29wc1tdID0gewotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYW5kM19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTE2IiwgSFdfSF9VSU5ULCBDR0VOX01PREVfVUlOVCwgT1BfRU5UIChVSU1NMTYpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfb3IzX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJ1bG8xNiIsIEhXX0hfVUxPMTYsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVMTzE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZGlfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNpbW04IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU04KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZHZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZHYzX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU0xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImNvbmRiaXQiLCBIV19IX0NPTkQsIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2FkZHhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJjb25kYml0IiwgSFdfSF9DT05ELCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYmM4X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwOCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDgpLCAwLCBDT05EX1JFRiB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9iYzI0X29wc1tdID0gewotICB7IElOUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2JlcV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AxNiIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDE2KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYmVxel9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRpc3AxNiIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDE2KSwgMCwgQ09ORF9SRUYgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIENPTkRfUkVGIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYmw4X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDgiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1A4KSwgMCwgMCB9LAotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9ncl8xNCIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgMCwgMTQsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9ibDI0X29wc1tdID0gewotICB7IElOUFVULCAiZGlzcDI0IiwgSFdfSF9JQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChESVNQMjQpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2dyXzE0IiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCAwLCAxNCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2JyYThfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwOCIsIEhXX0hfSUFERFIsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoRElTUDgpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfYnJhMjRfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJkaXNwMjQiLCBIV19IX0lBRERSLCBDR0VOX01PREVfVVNJLCBPUF9FTlQgKERJU1AyNCksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9VU0ksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9jbXBfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfY21waV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW0xNiIsIEhXX0hfU0lOVCwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTSU1NMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiY29uZGJpdCIsIEhXX0hfQ09ORCwgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfZGl2X29wc1tdID0gewotICB7IElOUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCBDT05EX1JFRiB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2psX29wc1tdID0gewotICB7IElOUFVULCAicGMiLCBIV19IX1BDLCBDR0VOX01PREVfVVNJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2dyXzE0IiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCAwLCAxNCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2ptcF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfc3IiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGRfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3Jfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGJfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGJfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3Jfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1FJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfSEksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZGhfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3Jfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX0hJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9sZF9wbHVzX29wc1tdID0gewotICB7IElOUFVULCAiaF9tZW1vcnlfc3IiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGQyNF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInVpbW0yNCIsIEhXX0hfQUREUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChVSU1NMjQpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbGRpOF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNpbW04IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNJTU04KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xkaTE2X29wc1tdID0gewotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X2xvY2tfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX21lbW9yeV9zciIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfU0ksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2xvY2siLCBIV19IX0xPQ0ssIENHRU5fTU9ERV9CSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X21hY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJhY2N1bSIsIEhXX0hfQUNDVU0sIENHRU5fTU9ERV9ESSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X211bGhpX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbXZfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdmZhY2hpX29wc1tdID0gewotICB7IElOUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdmZjX29wc1tdID0gewotICB7IElOUFVULCAic2NyIiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTQ1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbXZ0YWNoaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9tdnRjX29wc1tdID0gewotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZGNyIiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChEQ1IpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfbm9wX29wc1tdID0gewotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3JhY19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImFjY3VtIiwgSFdfSF9BQ0NVTSwgQ0dFTl9NT0RFX0RJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiYWNjdW0iLCBIV19IX0FDQ1VNLCBDR0VOX01PREVfREksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9ydGVfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2JicHN3IiwgSFdfSF9CQlBTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJoX2NyXzE0IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgMTQsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX2NyXzYiLCBIV19IX0NSLCBDR0VOX01PREVfVVNJLCAwLCA2LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9wc3ciLCBIV19IX1BTVywgQ0dFTl9NT0RFX1VRSSwgMCwgMCwgMCB9LAotICB7IE9VVFBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3NldGhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoaTE2IiwgSFdfSF9ISTE2LCBDR0VOX01PREVfU0ksIE9QX0VOVCAoSEkxNiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJkciIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChEUiksIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zbGwzX29wc1tdID0gewotICB7IElOUFVULCAic2ltbTE2IiwgSFdfSF9TSU5ULCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU0lNTTE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3IiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1IpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc2xsaV9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImRyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKERSKSwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTUiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoVUlNTTUpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiZHIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoRFIpLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RfZF9vcHNbXSA9IHsKLSAgeyBJTlBVVCwgInNsbzE2IiwgSFdfSF9TTE8xNiwgQ0dFTl9NT0RFX0lOVCwgT1BfRU5UIChTTE8xNiksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzEiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMSksIDAsIDAgfSwKLSAgeyBJTlBVVCwgInNyYzIiLCBIV19IX0dSLCBDR0VOX01PREVfU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9hZGRfX1ZNX3NyYzJfc2xvMTYiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RiX29wc1tdID0gewotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9RSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1JDMiksIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9zcmMyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9RSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3N0Yl9kX29wc1tdID0gewotICB7IElOUFVULCAic2xvMTYiLCBIV19IX1NMTzE2LCBDR0VOX01PREVfSU5ULCBPUF9FTlQgKFNMTzE2KSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMSIsIEhXX0hfR1IsIENHRU5fTU9ERV9RSSwgT1BfRU5UIChTUkMxKSwgMCwgMCB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X2FkZF9fVk1fc3JjMl9zbG8xNiIsIEhXX0hfTUVNT1JZLCBDR0VOX01PREVfUUksIDAsIDAsIDAgfSwKLSAgeyBFTkQgfQotfTsKLQotc3RhdGljIGNvbnN0IENHRU5fT1BJTlNUIGZtdF9zdGhfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX0hJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1VTSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfbWVtb3J5X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX0hJLCAwLCAwLCAwIH0sCi0gIHsgRU5EIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBDR0VOX09QSU5TVCBmbXRfc3RoX2Rfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzbG8xNiIsIEhXX0hfU0xPMTYsIENHRU5fTU9ERV9JTlQsIE9QX0VOVCAoU0xPMTYpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX0hJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfYWRkX19WTV9zcmMyX3NsbzE2IiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9ISSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3N0X3BsdXNfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMyIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzIpLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9tZW1vcnlfbmV3X3NyYzIiLCBIV19IX01FTU9SWSwgQ0dFTl9NT0RFX1NJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9TSSwgT1BfRU5UIChTUkMyKSwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3RyYXBfb3BzW10gPSB7Ci0gIHsgSU5QVVQsICJoX2Jwc3ciLCBIV19IX0JQU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgImhfY3JfNiIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDYsIDAgfSwKLSAgeyBJTlBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBJTlBVVCwgInBjIiwgSFdfSF9QQywgQ0dFTl9NT0RFX1VTSSwgMCwgMCwgMCB9LAotICB7IElOUFVULCAidWltbTQiLCBIV19IX1VJTlQsIENHRU5fTU9ERV9VSU5ULCBPUF9FTlQgKFVJTU00KSwgMCwgMCB9LAotICB7IE9VVFBVVCwgImhfYmJwc3ciLCBIV19IX0JCUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9icHN3IiwgSFdfSF9CUFNXLCBDR0VOX01PREVfVVFJLCAwLCAwLCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl8xNCIsIEhXX0hfQ1IsIENHRU5fTU9ERV9VU0ksIDAsIDE0LCAwIH0sCi0gIHsgT1VUUFVULCAiaF9jcl82IiwgSFdfSF9DUiwgQ0dFTl9NT0RFX1VTSSwgMCwgNiwgMCB9LAotICB7IE9VVFBVVCwgImhfcHN3IiwgSFdfSF9QU1csIENHRU5fTU9ERV9VUUksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJwYyIsIEhXX0hfUEMsIENHRU5fTU9ERV9TSSwgMCwgMCwgMCB9LAotICB7IEVORCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgZm10X3VubG9ja19vcHNbXSA9IHsKLSAgeyBJTlBVVCwgImhfbG9jayIsIEhXX0hfTE9DSywgQ0dFTl9NT0RFX0JJLCAwLCAwLCAwIH0sCi0gIHsgSU5QVVQsICJzcmMxIiwgSFdfSF9HUiwgQ0dFTl9NT0RFX1NJLCBPUF9FTlQgKFNSQzEpLCAwLCBDT05EX1JFRiB9LAotICB7IElOUFVULCAic3JjMiIsIEhXX0hfR1IsIENHRU5fTU9ERV9VU0ksIE9QX0VOVCAoU1JDMiksIDAsIENPTkRfUkVGIH0sCi0gIHsgT1VUUFVULCAiaF9sb2NrIiwgSFdfSF9MT0NLLCBDR0VOX01PREVfQkksIDAsIDAsIDAgfSwKLSAgeyBPVVRQVVQsICJoX21lbW9yeV9zcmMyIiwgSFdfSF9NRU1PUlksIENHRU5fTU9ERV9TSSwgMCwgMCwgQ09ORF9SRUYgfSwKLSAgeyBFTkQgfQotfTsKLQotI3VuZGVmIElOUFVUCi0jdW5kZWYgT1VUUFVUCi0jdW5kZWYgRU5ECi0jdW5kZWYgQ09ORF9SRUYKLSN1bmRlZiBPUF9FTlQKLQotLyogT3BlcmFuZCBpbnN0YW5jZSBsb29rdXAgdGFibGUuICAqLwotCi1zdGF0aWMgY29uc3QgQ0dFTl9PUElOU1QgKm0zMnJfY2dlbl9vcGluc3RfdGFibGVbTUFYX0lOU05TXSA9IHsKLSAgMCwKLSAgJiBmbXRfYWRkX29wc1swXSwKLSAgJiBmbXRfYWRkM19vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X2FuZDNfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9vcjNfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9hbmQzX29wc1swXSwKLSAgJiBmbXRfYWRkaV9vcHNbMF0sCi0gICYgZm10X2FkZHZfb3BzWzBdLAotICAmIGZtdF9hZGR2M19vcHNbMF0sCi0gICYgZm10X2FkZHhfb3BzWzBdLAotICAmIGZtdF9iYzhfb3BzWzBdLAotICAmIGZtdF9iYzI0X29wc1swXSwKLSAgJiBmbXRfYmVxX29wc1swXSwKLSAgJiBmbXRfYmVxel9vcHNbMF0sCi0gICYgZm10X2JlcXpfb3BzWzBdLAotICAmIGZtdF9iZXF6X29wc1swXSwKLSAgJiBmbXRfYmVxel9vcHNbMF0sCi0gICYgZm10X2JlcXpfb3BzWzBdLAotICAmIGZtdF9iZXF6X29wc1swXSwKLSAgJiBmbXRfYmw4X29wc1swXSwKLSAgJiBmbXRfYmwyNF9vcHNbMF0sCi0gICYgZm10X2JjOF9vcHNbMF0sCi0gICYgZm10X2JjMjRfb3BzWzBdLAotICAmIGZtdF9iZXFfb3BzWzBdLAotICAmIGZtdF9icmE4X29wc1swXSwKLSAgJiBmbXRfYnJhMjRfb3BzWzBdLAotICAmIGZtdF9jbXBfb3BzWzBdLAotICAmIGZtdF9jbXBpX29wc1swXSwKLSAgJiBmbXRfY21wX29wc1swXSwKLSAgJiBmbXRfY21waV9vcHNbMF0sCi0gICYgZm10X2Rpdl9vcHNbMF0sCi0gICYgZm10X2Rpdl9vcHNbMF0sCi0gICYgZm10X2Rpdl9vcHNbMF0sCi0gICYgZm10X2Rpdl9vcHNbMF0sCi0gICYgZm10X2psX29wc1swXSwKLSAgJiBmbXRfam1wX29wc1swXSwKLSAgJiBmbXRfbGRfb3BzWzBdLAotICAmIGZtdF9sZF9kX29wc1swXSwKLSAgJiBmbXRfbGRiX29wc1swXSwKLSAgJiBmbXRfbGRiX2Rfb3BzWzBdLAotICAmIGZtdF9sZGhfb3BzWzBdLAotICAmIGZtdF9sZGhfZF9vcHNbMF0sCi0gICYgZm10X2xkYl9vcHNbMF0sCi0gICYgZm10X2xkYl9kX29wc1swXSwKLSAgJiBmbXRfbGRoX29wc1swXSwKLSAgJiBmbXRfbGRoX2Rfb3BzWzBdLAotICAmIGZtdF9sZF9wbHVzX29wc1swXSwKLSAgJiBmbXRfbGQyNF9vcHNbMF0sCi0gICYgZm10X2xkaThfb3BzWzBdLAotICAmIGZtdF9sZGkxNl9vcHNbMF0sCi0gICYgZm10X2xvY2tfb3BzWzBdLAotICAmIGZtdF9tYWNoaV9vcHNbMF0sCi0gICYgZm10X21hY2hpX29wc1swXSwKLSAgJiBmbXRfbWFjaGlfb3BzWzBdLAotICAmIGZtdF9tYWNoaV9vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X211bGhpX29wc1swXSwKLSAgJiBmbXRfbXVsaGlfb3BzWzBdLAotICAmIGZtdF9tdWxoaV9vcHNbMF0sCi0gICYgZm10X211bGhpX29wc1swXSwKLSAgJiBmbXRfbXZfb3BzWzBdLAotICAmIGZtdF9tdmZhY2hpX29wc1swXSwKLSAgJiBmbXRfbXZmYWNoaV9vcHNbMF0sCi0gICYgZm10X212ZmFjaGlfb3BzWzBdLAotICAmIGZtdF9tdmZjX29wc1swXSwKLSAgJiBmbXRfbXZ0YWNoaV9vcHNbMF0sCi0gICYgZm10X212dGFjaGlfb3BzWzBdLAotICAmIGZtdF9tdnRjX29wc1swXSwKLSAgJiBmbXRfbXZfb3BzWzBdLAotICAmIGZtdF9ub3Bfb3BzWzBdLAotICAmIGZtdF9tdl9vcHNbMF0sCi0gICYgZm10X3JhY19vcHNbMF0sCi0gICYgZm10X3JhY19vcHNbMF0sCi0gICYgZm10X3J0ZV9vcHNbMF0sCi0gICYgZm10X3NldGhfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9zbGwzX29wc1swXSwKLSAgJiBmbXRfc2xsaV9vcHNbMF0sCi0gICYgZm10X2FkZF9vcHNbMF0sCi0gICYgZm10X3NsbDNfb3BzWzBdLAotICAmIGZtdF9zbGxpX29wc1swXSwKLSAgJiBmbXRfYWRkX29wc1swXSwKLSAgJiBmbXRfc2xsM19vcHNbMF0sCi0gICYgZm10X3NsbGlfb3BzWzBdLAotICAmIGZtdF9zdF9vcHNbMF0sCi0gICYgZm10X3N0X2Rfb3BzWzBdLAotICAmIGZtdF9zdGJfb3BzWzBdLAotICAmIGZtdF9zdGJfZF9vcHNbMF0sCi0gICYgZm10X3N0aF9vcHNbMF0sCi0gICYgZm10X3N0aF9kX29wc1swXSwKLSAgJiBmbXRfc3RfcGx1c19vcHNbMF0sCi0gICYgZm10X3N0X3BsdXNfb3BzWzBdLAotICAmIGZtdF9hZGRfb3BzWzBdLAotICAmIGZtdF9hZGR2X29wc1swXSwKLSAgJiBmbXRfYWRkeF9vcHNbMF0sCi0gICYgZm10X3RyYXBfb3BzWzBdLAotICAmIGZtdF91bmxvY2tfb3BzWzBdLAotfTsKLQotLyogRnVuY3Rpb24gdG8gY2FsbCBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhbmQgaW5zdGFuY2UgdGFibGUuICAqLwotCi12b2lkCi1tMzJyX2NnZW5faW5pdF9vcGluc3RfdGFibGUgKGNkKQotICAgICBDR0VOX0NQVV9ERVNDIGNkOwotewotICBpbnQgaTsKLSAgY29uc3QgQ0dFTl9PUElOU1QgKipvaSA9ICYgbTMycl9jZ2VuX29waW5zdF90YWJsZVswXTsKLSAgQ0dFTl9JTlNOICppbnNucyA9IChDR0VOX0lOU04gKikgY2QtPmluc25fdGFibGUuaW5pdF9lbnRyaWVzOwotICBmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05TOyArK2kpCi0gICAgaW5zbnNbaV0ub3BpbnN0ID0gb2lbaV07Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL202OGstZGlzLmMgYi9vcGNvZGVzL202OGstZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZDNhODIxLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTY4ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMDggKzAsMCBAQAotLyogUHJpbnQgTW90b3JvbGEgNjhrIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAxOTg2LCA4NywgODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAiZmxvYXRmb3JtYXQuaCIKLSNpbmNsdWRlIDxsaWJpYmVydHkuaD4KLSNpbmNsdWRlICJvcGludGwuaCIKLQotI2luY2x1ZGUgIm9wY29kZS9tNjhrLmgiCi0KLS8qIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfYnl0ZSAqKSk7Ci0KLXN0YXRpYyB2b2lkCi1kdW1teV9wcmludF9hZGRyZXNzIFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludAotZmV0Y2hfYXJnIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIgKiwgaW50LCBpbnQsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgdm9pZAotcHJpbnRfYmFzZSBQQVJBTVMgKChpbnQsIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8qKSk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyICoKLXByaW50X2luZGV4ZWQgUEFSQU1TICgoaW50LCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsIGRpc2Fzc2VtYmxlX2luZm8gKikpOwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX2FyZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLAotCQkJYmZkX3ZtYSwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLUNPTlNUIGNoYXIgKiBDT05TVCBmcGNyX25hbWVzW10gPSB7Ci0gICIiLCAiJWZwaWFyIiwgIiVmcHNyIiwgIiVmcGlhci8lZnBzciIsICIlZnBjciIsCi0gICIlZnBpYXIvJWZwY3IiLCAiJWZwc3IvJWZwY3IiLCAiJWZwaWFyLyVmcHNyLyVmcGNyIn07Ci0KLXN0YXRpYyBjaGFyICpjb25zdCByZWdfbmFtZXNbXSA9IHsKLSAgIiVkMCIsICIlZDEiLCAiJWQyIiwgIiVkMyIsICIlZDQiLCAiJWQ1IiwgIiVkNiIsICIlZDciLAotICAiJWEwIiwgIiVhMSIsICIlYTIiLCAiJWEzIiwgIiVhNCIsICIlYTUiLCAiJWZwIiwgIiVzcCIsCi0gICIlcHMiLCAiJXBjIn07Ci0KLS8qIFNpZ24tZXh0ZW5kIGFuICh1bnNpZ25lZCBjaGFyKS4gKi8KLSNpZiBfX1NURENfXyA9PSAxCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChzaWduZWQgY2hhcikoY2gpKQotI2Vsc2UKLSNkZWZpbmUgQ09FUkNFX1NJR05FRF9DSEFSKGNoKSAoKGludCkoKChjaCkgXiAweDgwKSAmIDB4RkYpIC0gMTI4KQotI2VuZGlmCi0KLS8qIEdldCBhIDEgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIE5FWFRCWVRFKHApICAocCArPSAyLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgQ09FUkNFX1NJR05FRF9DSEFSKHBbLTFdKSkKLQotLyogR2V0IGEgMiBieXRlIHNpZ25lZCBpbnRlZ2VyLiAgKi8KLSNkZWZpbmUgQ09FUkNFMTYoeCkgKChpbnQpICgoKHgpIF4gMHg4MDAwKSAtIDB4ODAwMCkpCi0jZGVmaW5lIE5FWFRXT1JEKHApICBcCi0gIChwICs9IDIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBDT0VSQ0UxNiAoKHBbLTJdIDw8IDgpICsgcFstMV0pKQotCi0vKiBHZXQgYSA0IGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBDT0VSQ0UzMih4KSAoKGJmZF9zaWduZWRfdm1hKSAoKHgpIF4gMHg4MDAwMDAwMCkgLSAweDgwMDAwMDAwKQotI2RlZmluZSBORVhUTE9ORyhwKSAgXAotICAocCArPSA0LCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICAgKENPRVJDRTMyICgoKCgoKHBbLTRdIDw8IDgpICsgcFstM10pIDw8IDgpICsgcFstMl0pIDw8IDgpICsgcFstMV0pKSkKLQotLyogR2V0IGEgNCBieXRlIHVuc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBORVhUVUxPTkcocCkgIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgICh1bnNpZ25lZCBpbnQpICgoKCgoKHBbLTRdIDw8IDgpICsgcFstM10pIDw8IDgpICsgcFstMl0pIDw8IDgpICsgcFstMV0pKQotCi0vKiBHZXQgYSBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVFNJTkdMRSh2YWwsIHApIFwKLSAgKHAgKz0gNCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfc2luZ2xlX2JpZywgKGNoYXIgKikgcCAtIDQsICZ2YWwpKQotCi0vKiBHZXQgYSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVERPVUJMRSh2YWwsIHApIFwKLSAgKHAgKz0gOCwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIGZsb2F0Zm9ybWF0X3RvX2RvdWJsZSAoJmZsb2F0Zm9ybWF0X2llZWVfZG91YmxlX2JpZywgKGNoYXIgKikgcCAtIDgsICZ2YWwpKQotCi0vKiBHZXQgYW4gZXh0ZW5kZWQgcHJlY2lzaW9uIGZsb2F0LiAgKi8KLSNkZWZpbmUgTkVYVEVYVEVORCh2YWwsIHApIFwKLSAgKHAgKz0gMTIsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICBmbG9hdGZvcm1hdF90b19kb3VibGUgKCZmbG9hdGZvcm1hdF9tNjg4ODFfZXh0LCAoY2hhciAqKSBwIC0gMTIsICZ2YWwpKQotCi0vKiBOZWVkIGEgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIHBhY2tlZCB0byBkb3VibGUKLSAgIHByZWNpc2lvbi4gICBBY3R1YWxseSwgaXQncyBlYXNpZXIgdG8gcHJpbnQgYQotICAgcGFja2VkIG51bWJlciB0aGFuIGEgZG91YmxlIGFueXdheSwgc28gbWF5YmUKLSAgIHRoZXJlIHNob3VsZCBiZSBhIHNwZWNpYWwgY2FzZSB0byBoYW5kbGUgdGhpcy4uLiAqLwotI2RlZmluZSBORVhUUEFDS0VEKHApIFwKLSAgKHAgKz0gMTIsIEZFVENIX0RBVEEgKGluZm8sIHApLCAwLjApCi0KLQwKLS8qIE1heGltdW0gbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUFYTEVOIDIyCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBhZGRyKSBcCi0gICgoYWRkcikgPD0gKChzdHJ1Y3QgcHJpdmF0ZSAqKShpbmZvLT5wcml2YXRlX2RhdGEpKS0+bWF4X2ZldGNoZWQgXAotICAgPyAxIDogZmV0Y2hfZGF0YSAoKGluZm8pLCAoYWRkcikpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBhZGRyKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgYmZkX2J5dGUgKmFkZHI7Ci17Ci0gIGludCBzdGF0dXM7Ci0gIHN0cnVjdCBwcml2YXRlICpwcml2ID0gKHN0cnVjdCBwcml2YXRlICopaW5mby0+cHJpdmF0ZV9kYXRhOwotICBiZmRfdm1hIHN0YXJ0ID0gcHJpdi0+aW5zbl9zdGFydCArIChwcml2LT5tYXhfZmV0Y2hlZCAtIHByaXYtPnRoZV9idWZmZXIpOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKHN0YXJ0LAotCQkJCSAgICAgIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGFkZHIgLSBwcml2LT5tYXhfZmV0Y2hlZCwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHN0YXJ0LCBpbmZvKTsKLSAgICAgIGxvbmdqbXAgKHByaXYtPmJhaWxvdXQsIDEpOwotICAgIH0KLSAgZWxzZQotICAgIHByaXYtPm1heF9mZXRjaGVkID0gYWRkcjsKLSAgcmV0dXJuIDE7Ci19Ci0MCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJpbnQgdG8gdGhlIGJpdC1idWNrZXQuICovCi1zdGF0aWMgaW50Ci0jaWZkZWYgX19TVERDX18KLWR1bW15X3ByaW50ZXIgKEZJTEUgKiBmaWxlLCBjb25zdCBjaGFyICogZm9ybWF0LCAuLi4pCi0jZWxzZQotZHVtbXlfcHJpbnRlciAoZmlsZSkgRklMRSAqZmlsZTsKLSNlbmRpZgotIHsgcmV0dXJuIDA7IH0KLQotc3RhdGljIHZvaWQKLWR1bW15X3ByaW50X2FkZHJlc3MgKHZtYSwgaW5mbykKLSAgICAgYmZkX3ZtYSB2bWE7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotfQotCi0vKiBQcmludCB0aGUgbTY4ayBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzIE1FTUFERFIgaW4gZGVidWdnZWQgbWVtb3J5LAotICAgb24gSU5GTy0+U1RSRUFNLiAgUmV0dXJucyBsZW5ndGggb2YgdGhlIGluc3RydWN0aW9uLCBpbiBieXRlcy4gICovCi0KLWludAotcHJpbnRfaW5zbl9tNjhrIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGludCBpOwotICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpwOwotICB1bnNpZ25lZCBjaGFyICpzYXZlX3A7Ci0gIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKmQ7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgYmVzdG1hc2s7Ci0gIGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqYmVzdCA9IDA7Ci0gIHVuc2lnbmVkIGludCBhcmNoX21hc2s7Ci0gIHN0cnVjdCBwcml2YXRlIHByaXY7Ci0gIGJmZF9ieXRlICpidWZmZXIgPSBwcml2LnRoZV9idWZmZXI7Ci0gIGZwcmludGZfZnR5cGUgc2F2ZV9wcmludGVyID0gaW5mby0+ZnByaW50Zl9mdW5jOwotICB2b2lkICgqc2F2ZV9wcmludF9hZGRyZXNzKSBQQVJBTVMoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvKikpCi0gICAgPSBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmM7Ci0gIGludCBtYWpvcl9vcGNvZGU7Ci0gIHN0YXRpYyBpbnQgbnVtb3Bjb2Rlc1sxNl07Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKipvcGNvZGVzWzE2XTsKLQotICBpZiAoIW9wY29kZXNbMF0pCi0gICAgewotICAgICAgLyogU3BlZWQgdXAgdGhlIG1hdGNoaW5nIGJ5IHNvcnRpbmcgdGhlIG9wY29kZSB0YWJsZSBvbiB0aGUgdXBwZXIKLQkgZm91ciBiaXRzIG9mIHRoZSBvcGNvZGUuICAqLwotICAgICAgY29uc3Qgc3RydWN0IG02OGtfb3Bjb2RlICoqb3BjX3BvaW50ZXJbMTZdOwotCi0gICAgICAvKiBGaXJzdCBjb3VudCBob3cgbWFueSBvcGNvZGVzIGFyZSBpbiBlYWNoIG9mIHRoZSBzaXh0ZWVuIGJ1Y2tldHMuICAqLwotICAgICAgZm9yIChpID0gMDsgaSA8IG02OGtfbnVtb3Bjb2RlczsgaSsrKQotCW51bW9wY29kZXNbKG02OGtfb3Bjb2Rlc1tpXS5vcGNvZGUgPj4gMjgpICYgMTVdKys7Ci0KLSAgICAgIC8qIFRoZW4gY3JlYXRlIGEgc29ydGVkIHRhYmxlIG9mIHBvaW50ZXJzIHRoYXQgcG9pbnQgaW50byB0aGUKLQkgdW5zb3J0ZWQgdGFibGUuICAqLwotICAgICAgb3BjX3BvaW50ZXJbMF0gPSAoKGNvbnN0IHN0cnVjdCBtNjhrX29wY29kZSAqKikKLQkJCXhtYWxsb2MgKHNpemVvZiAoc3RydWN0IG02OGtfb3Bjb2RlICopCi0JCQkJICogbTY4a19udW1vcGNvZGVzKSk7Ci0gICAgICBvcGNvZGVzWzBdID0gb3BjX3BvaW50ZXJbMF07Ci0gICAgICBmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKLQl7Ci0JICBvcGNfcG9pbnRlcltpXSA9IG9wY19wb2ludGVyW2kgLSAxXSArIG51bW9wY29kZXNbaSAtIDFdOwotCSAgb3Bjb2Rlc1tpXSA9IG9wY19wb2ludGVyW2ldOwotCX0KLQotICAgICAgZm9yIChpID0gMDsgaSA8IG02OGtfbnVtb3Bjb2RlczsgaSsrKQotCSpvcGNfcG9pbnRlclsobTY4a19vcGNvZGVzW2ldLm9wY29kZSA+PiAyOCkgJiAxNV0rKyA9ICZtNjhrX29wY29kZXNbaV07Ci0KLSAgICB9Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7Ci0gIC8qIFRlbGwgb2JqZHVtcCB0byB1c2UgdHdvIGJ5dGVzIHBlciBjaHVuayBhbmQgc2l4IGJ5dGVzIHBlciBsaW5lIGZvcgotICAgICBkaXNwbGF5aW5nIHJhdyBkYXRhLiAgKi8KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA2OwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IEJGRF9FTkRJQU5fQklHOwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBtZW1hZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLSAgc3dpdGNoIChpbmZvLT5tYWNoKQotICAgIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgMDoKLSAgICAgIGFyY2hfbWFzayA9ICh1bnNpZ25lZCBpbnQpIC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMDA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwMDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAwODoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAwODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDEwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDEwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwMjA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwMjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGJmZF9tYWNoX202ODAzMDoKLSAgICAgIGFyY2hfbWFzayA9IG02ODAzMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgYmZkX21hY2hfbTY4MDQwOgotICAgICAgYXJjaF9tYXNrID0gbTY4MDQwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBiZmRfbWFjaF9tNjgwNjA6Ci0gICAgICBhcmNoX21hc2sgPSBtNjgwNjA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgYXJjaF9tYXNrIHw9IG02ODg4MSB8IG02ODg1MTsKLQotICBiZXN0bWFzayA9IDA7Ci0gIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDIpOwotICBtYWpvcl9vcGNvZGUgPSAoYnVmZmVyWzBdID4+IDQpICYgMTU7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1vcGNvZGVzW21ham9yX29wY29kZV07IGkrKykKLSAgICB7Ci0gICAgICBjb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgKm9wYyA9IG9wY29kZXNbbWFqb3Jfb3Bjb2RlXVtpXTsKLSAgICAgIHVuc2lnbmVkIGxvbmcgb3Bjb2RlID0gb3BjLT5vcGNvZGU7Ci0gICAgICB1bnNpZ25lZCBsb25nIG1hdGNoID0gb3BjLT5tYXRjaDsKLQotICAgICAgaWYgKCgoMHhmZiAmIGJ1ZmZlclswXSAmIChtYXRjaCA+PiAyNCkpID09ICgweGZmICYgKG9wY29kZSA+PiAyNCkpKQotCSAgJiYgKCgweGZmICYgYnVmZmVyWzFdICYgKG1hdGNoID4+IDE2KSkgPT0gKDB4ZmYgJiAob3Bjb2RlID4+IDE2KSkpCi0JICAvKiBPbmx5IGZldGNoIHRoZSBuZXh0IHR3byBieXRlcyBpZiB3ZSBuZWVkIHRvLiAgKi8KLQkgICYmICgoKDB4ZmZmZiAmIG1hdGNoKSA9PSAwKQotCSAgICAgIHx8Ci0JICAgICAgKEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDQpCi0JICAgICAgICYmICgoMHhmZiAmIGJ1ZmZlclsyXSAmIChtYXRjaCA+PiA4KSkgPT0gKDB4ZmYgJiAob3Bjb2RlID4+IDgpKSkKLQkgICAgICAgJiYgKCgweGZmICYgYnVmZmVyWzNdICYgbWF0Y2gpID09ICgweGZmICYgb3Bjb2RlKSkpCi0JICAgICAgKQotCSAgJiYgKG9wYy0+YXJjaCAmIGFyY2hfbWFzaykgIT0gMCkKLQl7Ci0JICAvKiBEb24ndCB1c2UgZm9yIHByaW50b3V0IHRoZSB2YXJpYW50cyBvZiBkaXZ1bCBhbmQgZGl2c2wKLQkgICAgIHRoYXQgaGF2ZSB0aGUgc2FtZSByZWdpc3RlciBudW1iZXIgaW4gdHdvIHBsYWNlcy4KLQkgICAgIFRoZSBtb3JlIGdlbmVyYWwgdmFyaWFudHMgd2lsbCBtYXRjaCBpbnN0ZWFkLiAgKi8KLQkgIGZvciAoZCA9IG9wYy0+YXJnczsgKmQ7IGQgKz0gMikKLQkgICAgaWYgKGRbMV0gPT0gJ0QnKQotCSAgICAgIGJyZWFrOwotCi0JICAvKiBEb24ndCB1c2UgZm9yIHByaW50b3V0IHRoZSB2YXJpYW50cyBvZiBtb3N0IGZsb2F0aW5nCi0JICAgICBwb2ludCBjb3Byb2Nlc3NvciBpbnN0cnVjdGlvbnMgd2hpY2ggdXNlIHRoZSBzYW1lCi0JICAgICByZWdpc3RlciBudW1iZXIgaW4gdHdvIHBsYWNlcywgYXMgYWJvdmUuICovCi0JICBpZiAoKmQgPT0gJ1wwJykKLQkgICAgZm9yIChkID0gb3BjLT5hcmdzOyAqZDsgZCArPSAyKQotCSAgICAgIGlmIChkWzFdID09ICd0JykKLQkJYnJlYWs7Ci0KLQkgIC8qIERvbid0IG1hdGNoIGZtb3ZlbCB3aXRoIG1vcmUgdGhhbiBvbmUgcmVnaXN0ZXI7IHdhaXQgZm9yCi0gICAgICAgICAgICAgZm1vdmVtbC4gICovCi0JICBpZiAoKmQgPT0gJ1wwJykKLQkgICAgewotCSAgICAgIGZvciAoZCA9IG9wYy0+YXJnczsgKmQ7IGQgKz0gMikKLQkJewotCQkgIGlmIChkWzBdID09ICdzJyAmJiBkWzFdID09ICc4JykKLQkJICAgIHsKLQkJICAgICAgaW50IHZhbDsKLQotCQkgICAgICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgZFsxXSwgMywgaW5mbyk7Ci0JCSAgICAgIGlmICgodmFsICYgKHZhbCAtIDEpKSAhPSAwKQotCQkJYnJlYWs7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAoKmQgPT0gJ1wwJyAmJiBtYXRjaCA+IGJlc3RtYXNrKQotCSAgICB7Ci0JICAgICAgYmVzdCA9IG9wYzsKLQkgICAgICBiZXN0bWFzayA9IG1hdGNoOwotCSAgICB9Ci0JfQotICAgIH0KLQotICBpZiAoYmVzdCA9PSAwKQotICAgIGdvdG8gaW52YWxpZDsKLQotICAvKiBQb2ludCBhdCBmaXJzdCB3b3JkIG9mIGFyZ3VtZW50IGRhdGEsCi0gICAgIGFuZCBhdCBkZXNjcmlwdG9yIGZvciBmaXJzdCBhcmd1bWVudC4gICovCi0gIHAgPSBidWZmZXIgKyAyOwotICAKLSAgLyogRmlndXJlIG91dCBob3cgbG9uZyB0aGUgZml4ZWQtc2l6ZSBwb3J0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiBpcy4KLSAgICAgVGhlIG9ubHkgcGxhY2UgdGhpcyBpcyBzdG9yZWQgaW4gdGhlIG9wY29kZSB0YWJsZSBpcwotICAgICBpbiB0aGUgYXJndW1lbnRzLS1sb29rIGZvciBhcmd1bWVudHMgd2hpY2ggc3BlY2lmeSBmaWVsZHMgaW4gdGhlIDJuZAotICAgICBvciAzcmQgd29yZHMgb2YgdGhlIGluc3RydWN0aW9uLiAgKi8KLSAgZm9yIChkID0gYmVzdC0+YXJnczsgKmQ7IGQgKz0gMikKLSAgICB7Ci0gICAgICAvKiBJIGRvbid0IHRoaW5rIGl0IGlzIG5lY2Vzc2FyeSB0byBiZSBjaGVja2luZyBkWzBdIGhlcmU7IEkgc3VzcGVjdAotCSBhbGwgdGhpcyBjb3VsZCBiZSBtb3ZlZCB0byB0aGUgY2FzZSBzdGF0ZW1lbnQgYmVsb3cuICAqLwotICAgICAgaWYgKGRbMF0gPT0gJyMnKQotCXsKLQkgIGlmIChkWzFdID09ICdsJyAmJiBwIC0gYnVmZmVyIDwgNikKLQkgICAgcCA9IGJ1ZmZlciArIDY7Ci0JICBlbHNlIGlmIChwIC0gYnVmZmVyIDwgNCAmJiBkWzFdICE9ICdDJyAmJiBkWzFdICE9ICc4JyApCi0JICAgIHAgPSBidWZmZXIgKyA0OwotCX0KLSAgICAgIGlmICgoZFswXSA9PSAnTCcgfHwgZFswXSA9PSAnbCcpICYmIGRbMV0gPT0gJ3cnICYmIHAgLSBidWZmZXIgPCA0KQotCXAgPSBidWZmZXIgKyA0OwotICAgICAgc3dpdGNoIChkWzFdKQotCXsKLQljYXNlICcxJzoKLQljYXNlICcyJzoKLQljYXNlICczJzoKLQljYXNlICc3JzoKLQljYXNlICc4JzoKLQljYXNlICc5JzoKLQljYXNlICdpJzoKLQkgIGlmIChwIC0gYnVmZmVyIDwgNCkKLQkgICAgcCA9IGJ1ZmZlciArIDQ7Ci0JICBicmVhazsKLQljYXNlICc0JzoKLQljYXNlICc1JzoKLQljYXNlICc2JzoKLQkgIGlmIChwIC0gYnVmZmVyIDwgNikKLQkgICAgcCA9IGJ1ZmZlciArIDY7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgYnJlYWs7Ci0JfQotICAgIH0KLQotICAvKiBwZmx1c2hhIGlzIGFuIGV4Y2VwdGlvbnMuICBJdCB0YWtlcyBubyBhcmd1bWVudHMgYnV0IGlzIHR3byB3b3JkcwotICAgICBsb25nLiAgUmVjb2duaXplIGl0IGJ5IGxvb2tpbmcgYXQgdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIG1hc2suICAqLwotICBpZiAocCAtIGJ1ZmZlciA8IDQgJiYgKGJlc3QtPm1hdGNoICYgMHhGRkZGKSAhPSAwKQotICAgIHAgPSBidWZmZXIgKyA0OwotCi0gIC8qIGxwc3RvcCBpcyBhbm90aGVyIGV4Y2VwdGlvbi4gIEl0IHRha2VzIGEgb25lIHdvcmQgYXJndW1lbnQgYnV0IGlzCi0gICAgIHRocmVlIHdvcmRzIGxvbmcuICAqLwotICBpZiAocCAtIGJ1ZmZlciA8IDYKLSAgICAgICYmIChiZXN0LT5tYXRjaCAmIDB4ZmZmZikgPT0gMHhmZmZmCi0gICAgICAmJiBiZXN0LT5hcmdzWzBdID09ICcjJwotICAgICAgJiYgYmVzdC0+YXJnc1sxXSA9PSAndycpCi0gICAgewotICAgICAgLyogQ29weSB0aGUgb25lIHdvcmQgYXJndW1lbnQgaW50byB0aGUgdXN1YWwgbG9jYXRpb24gZm9yIGEgb25lCi0JIHdvcmQgYXJndW1lbnQsIHRvIHNpbXBsaWZ5IHByaW50aW5nIGl0LiAgV2UgY2FuIGdldCBhd2F5IHdpdGgKLQkgdGhpcyBiZWNhdXNlIHdlIGtub3cgZXhhY3RseSB3aGF0IHRoZSBzZWNvbmQgd29yZCBpcywgYW5kIHdlCi0JIGFyZW4ndCBnb2luZyB0byBwcmludCBhbnl0aGluZyBiYXNlZCBvbiBpdC4gICovCi0gICAgICBwID0gYnVmZmVyICsgNjsKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIHApOwotICAgICAgYnVmZmVyWzJdID0gYnVmZmVyWzRdOwotICAgICAgYnVmZmVyWzNdID0gYnVmZmVyWzVdOwotICAgIH0KLQotICBGRVRDSF9EQVRBIChpbmZvLCBwKTsKLSAgCi0gIGQgPSBiZXN0LT5hcmdzOwotCi0gIC8qIFdlIGNhbiB0aGUgb3BlcmFuZHMgdHdpY2UuICBUaGUgZmlyc3QgdGltZSB3ZSBkb24ndCBwcmludCBhbnl0aGluZywKLSAgICAgYnV0IGxvb2sgZm9yIGVycm9ycy4gKi8KLQotICBzYXZlX3AgPSBwOwotICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgPSBkdW1teV9wcmludF9hZGRyZXNzOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgPSAoZnByaW50Zl9mdHlwZSlkdW1teV9wcmludGVyOwotICBmb3IgKCA7ICpkOyBkICs9IDIpCi0gICAgewotICAgICAgaW50IGVhdGVuID0gcHJpbnRfaW5zbl9hcmcgKGQsIGJ1ZmZlciwgcCwgbWVtYWRkciArIChwIC0gYnVmZmVyKSwgaW5mbyk7Ci0gICAgICBpZiAoZWF0ZW4gPj0gMCkKLQlwICs9IGVhdGVuOwotICAgICAgZWxzZSBpZiAoZWF0ZW4gPT0gLTEpCi0JZ290byBpbnZhbGlkOwotICAgICAgZWxzZQotCXsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKShpbmZvLT5zdHJlYW0sCi0JCQkJLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJCQlfKCI8aW50ZXJuYWwgZXJyb3IgaW4gb3Bjb2RlIHRhYmxlOiAlcyAlcz5cbiIpLAotCQkJCWJlc3QtPm5hbWUsCi0JCQkJYmVzdC0+YXJncyk7Ci0JICBnb3RvIGludmFsaWQ7Ci0JfQotCi0gICAgfQotICBwID0gc2F2ZV9wOwotICBpbmZvLT5mcHJpbnRmX2Z1bmMgPSBzYXZlX3ByaW50ZXI7Ci0gIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyA9IHNhdmVfcHJpbnRfYWRkcmVzczsKLQotICBkID0gYmVzdC0+YXJnczsKLQotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgYmVzdC0+bmFtZSk7Ci0KLSAgaWYgKCpkKQotICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiICIpOwotCi0gIHdoaWxlICgqZCkKLSAgICB7Ci0gICAgICBwICs9IHByaW50X2luc25fYXJnIChkLCBidWZmZXIsIHAsIG1lbWFkZHIgKyAocCAtIGJ1ZmZlciksIGluZm8pOwotICAgICAgZCArPSAyOwotICAgICAgaWYgKCpkICYmICooZCAtIDIpICE9ICdJJyAmJiAqZCAhPSAnaycpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0gICAgfQotICByZXR1cm4gcCAtIGJ1ZmZlcjsKLQotIGludmFsaWQ6Ci0gIC8qIEhhbmRsZSB1bmRlZmluZWQgaW5zdHJ1Y3Rpb25zLiAgKi8KLSAgaW5mby0+ZnByaW50Zl9mdW5jID0gc2F2ZV9wcmludGVyOwotICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgPSBzYXZlX3ByaW50X2FkZHJlc3M7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMCVvIiwKLQkJCSAoYnVmZmVyWzBdIDw8IDgpICsgYnVmZmVyWzFdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLS8qIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzICJlYXRlbiIgYnkgdGhlIG9wZXJhbmQsIG9yCi0gICByZXR1cm4gLTEgaWYgYW4gaW52YWxpZCBvcGVyYW5kIHdhcyBmb3VuZCwgb3IgLTIgaWYKLSAgIGFuIG9wY29kZSB0YWJlIGVycm9yIHdhcyBmb3VuZC4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgKGQsIGJ1ZmZlciwgcDAsIGFkZHIsIGluZm8pCi0gICAgIGNvbnN0IGNoYXIgKmQ7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSAgICAgdW5zaWduZWQgY2hhciAqcDA7Ci0gICAgIGJmZF92bWEgYWRkcjsJCS8qIFBDIGZvciB0aGlzIGFyZyB0byBiZSByZWxhdGl2ZSB0byAqLwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZWdpc3RlciBpbnQgdmFsID0gMDsKLSAgcmVnaXN0ZXIgaW50IHBsYWNlID0gZFsxXTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcCA9IHAwOwotICBpbnQgcmVnbm87Ci0gIHJlZ2lzdGVyIENPTlNUIGNoYXIgKnJlZ25hbWU7Ci0gIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnAxOwotICBkb3VibGUgZmx2YWw7Ci0gIGludCBmbHRfcDsKLSAgYmZkX3NpZ25lZF92bWEgZGlzcDsKLSAgdW5zaWduZWQgaW50IHV2YWw7Ci0KLSAgc3dpdGNoICgqZCkKLSAgICB7Ci0gICAgY2FzZSAnYyc6CQkvKiBjYWNoZSBpZGVudGlmaWVyICovCi0gICAgICB7Ci0gICAgICAgIHN0YXRpYyBjaGFyICpjb25zdCBjYWNoZUZpZWxkTmFtZVtdID0geyAibmMiLCAiZGMiLCAiaWMiLCAiYmMiIH07Ci0gICAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMiwgaW5mbyk7Ci0gICAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBjYWNoZUZpZWxkTmFtZVt2YWxdKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlICdhJzoJCS8qIGFkZHJlc3MgcmVnaXN0ZXIgaW5kaXJlY3Qgb25seS4gQ2YuIGNhc2UgJysnLiAqLwotICAgICAgewotICAgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkgIChpbmZvLT5zdHJlYW0sCi0JICAgIiVzQCIsCi0JICAgcmVnX25hbWVzIFtmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0pOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIGNhc2UgJ18nOgkJLyogMzItYml0IGFic29sdXRlIGFkZHJlc3MgZm9yIG1vdmUxNi4gKi8KLSAgICAgIHsKLSAgICAgICAgdXZhbCA9IE5FWFRVTE9ORyAocCk7Ci0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh1dmFsLCBpbmZvKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVjY3IiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlc3IiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnVSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUldXNwIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWFjYyIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdHJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVtYWNzciIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdIJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVtYXNrIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0onOgotICAgICAgewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeyBjaGFyICpuYW1lOyBpbnQgdmFsdWU7IH0gbmFtZXNbXQotCSAgPSB7eyIlc2ZjIiwgMHgwMDB9LCB7IiVkZmMiLCAweDAwMX0sIHsiJWNhY3IiLCAweDAwMn0sCi0JICAgICB7IiV0YyIsICAweDAwM30sIHsiJWl0dDAiLDB4MDA0fSwgeyIlaXR0MSIsIDB4MDA1fSwKLSAgICAgICAgICAgICB7IiVkdHQwIiwweDAwNn0sIHsiJWR0dDEiLDB4MDA3fSwgeyIlYnVzY3IiLDB4MDA4fSwKLQkgICAgIHsiJXVzcCIsIDB4ODAwfSwgeyIldmJyIiwgMHg4MDF9LCB7IiVjYWFyIiwgMHg4MDJ9LAotCSAgICAgeyIlbXNwIiwgMHg4MDN9LCB7IiVpc3AiLCAweDgwNH0sCi0KLQkgICAgIC8qIFNob3VsZCB3ZSBiZSBjYWxsaW5nIHRoaXMgcHNyIGxpa2Ugd2UgZG8gaW4gY2FzZSAnWSc/ICAqLwotCSAgICAgeyIlbW11c3IiLDB4ODA1fSwKLQotICAgICAgICAgICAgIHsiJXVycCIsIDB4ODA2fSwgeyIlc3JwIiwgMHg4MDd9LCB7IiVwY3IiLCAweDgwOH19OwotCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAxMiwgaW5mbyk7Ci0JZm9yIChyZWdubyA9IHNpemVvZiBuYW1lcyAvIHNpemVvZiBuYW1lc1swXSAtIDE7IHJlZ25vID49IDA7IHJlZ25vLS0pCi0JICBpZiAobmFtZXNbcmVnbm9dLnZhbHVlID09IHZhbCkKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBuYW1lc1tyZWdub10ubmFtZSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQlpZiAocmVnbm8gPCAwKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1EnOgotICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKTsKLSAgICAgIC8qIDAgbWVhbnMgOCwgZXhjZXB0IGZvciB0aGUgYmtwdCBpbnN0cnVjdGlvbi4uLiAqLwotICAgICAgaWYgKHZhbCA9PSAwICYmIGRbMV0gIT0gJ3MnKQotCXZhbCA9IDg7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ00nOgotICAgICAgaWYgKHBsYWNlID09ICdoJykKLQl7Ci0JICBzdGF0aWMgY2hhciAqY29uc3Qgc2NhbGVmYWN0b3JfbmFtZVtdID0geyAiPDwiLCAiPj4iIH07Ci0JICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDEsIGluZm8pOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sIHNjYWxlZmFjdG9yX25hbWVbdmFsXSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgOCwgaW5mbyk7Ci0JICBpZiAodmFsICYgMHg4MCkKLQkgICAgdmFsID0gdmFsIC0gMHgxMDA7Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7Ci0JfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdUJzoKLSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNCwgaW5mbyk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZCIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0EnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiVzIiwKLQkgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykgKyAwMTBdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXMiLAotCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdyJzoKLSAgICAgIHJlZ25vID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA0LCBpbmZvKTsKLSAgICAgIGlmIChyZWdubyA+IDcpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AiLCByZWdfbmFtZXNbcmVnbm9dKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoJXMpIiwgcmVnX25hbWVzW3JlZ25vXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0YnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiUlZnAlZCIsCi0JIGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbykpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdPJzoKLSAgICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNiwgaW5mbyk7Ci0gICAgICBpZiAodmFsICYgMHgyMCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnX25hbWVzIFt2YWwgJiA3XSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJysnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JKGluZm8tPnN0cmVhbSwgIiVzQCsiLAotCSByZWdfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKSArIDhdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnLSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXNALSIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdrJzoKLSAgICAgIGlmIChwbGFjZSA9PSAnaycpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JICAoaW5mby0+c3RyZWFtLCAieyVzfSIsCi0JICAgcmVnX25hbWVzW2ZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgMywgaW5mbyldKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdDJykKLQl7Ci0JICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDcsIGluZm8pOwotCSAgaWYgKCB2YWwgPiA2MyApCQkvKiBUaGlzIGlzIGEgc2lnbmVkIGNvbnN0YW50LiAqLwotCSAgICB2YWwgLT0gMTI4OwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ7IyVkfSIsIHZhbCk7Ci0JfQotICAgICAgZWxzZQotCXJldHVybiAtMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnIyc6Ci0gICAgY2FzZSAnXic6Ci0gICAgICBwMSA9IGJ1ZmZlciArICgqZCA9PSAnIycgPyAyIDogNCk7Ci0gICAgICBpZiAocGxhY2UgPT0gJ3MnKQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNCwgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnQycpCi0JdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCA3LCBpbmZvKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICc4JykKLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJzMnKQotCXZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgOCwgaW5mbyk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnYicpCi0JdmFsID0gTkVYVEJZVEUgKHAxKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICd3JyB8fCBwbGFjZSA9PSAnVycpCi0JdmFsID0gTkVYVFdPUkQgKHAxKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdsJykKLQl2YWwgPSBORVhUTE9ORyAocDEpOwotICAgICAgZWxzZQotCXJldHVybiAtMjsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQic6Ci0gICAgICBpZiAocGxhY2UgPT0gJ2InKQotCWRpc3AgPSBORVhUQllURSAocCk7Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnQicpCi0JZGlzcCA9IENPRVJDRV9TSUdORURfQ0hBUihidWZmZXJbMV0pOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ3cnIHx8IHBsYWNlID09ICdXJykKLQlkaXNwID0gTkVYVFdPUkQgKHApOwotICAgICAgZWxzZSBpZiAocGxhY2UgPT0gJ2wnIHx8IHBsYWNlID09ICdMJyB8fCBwbGFjZSA9PSAnQycpCi0JZGlzcCA9IE5FWFRMT05HIChwKTsKLSAgICAgIGVsc2UgaWYgKHBsYWNlID09ICdnJykKLQl7Ci0JICBkaXNwID0gTkVYVEJZVEUgKGJ1ZmZlcik7Ci0JICBpZiAoZGlzcCA9PSAwKQotCSAgICBkaXNwID0gTkVYVFdPUkQgKHApOwotCSAgZWxzZSBpZiAoZGlzcCA9PSAtMSkKLQkgICAgZGlzcCA9IE5FWFRMT05HIChwKTsKLQl9Ci0gICAgICBlbHNlIGlmIChwbGFjZSA9PSAnYycpCi0JewotCSAgaWYgKGJ1ZmZlclsxXSAmIDB4NDApCQkvKiBJZiBiaXQgc2l4IGlzIG9uZSwgbG9uZyBvZmZzZXQgKi8KLQkgICAgZGlzcCA9IE5FWFRMT05HIChwKTsKLQkgIGVsc2UKLQkgICAgZGlzcCA9IE5FWFRXT1JEIChwKTsKLQl9Ci0gICAgICBlbHNlCi0JcmV0dXJuIC0yOwotCi0gICAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyBkaXNwLCBpbmZvKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnZCc6Ci0gICAgICB2YWwgPSBORVhUV09SRCAocCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykKLQkoaW5mby0+c3RyZWFtLCAiJXNAKCVkKSIsCi0JIHJlZ19uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsIGluZm8pICsgOF0sIHZhbCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3MnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkgICAgIGZwY3JfbmFtZXNbZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdJJzoKLSAgICAgIC8qIEdldCBjb3Byb2Nlc3NvciBJRC4uLiAqLwotICAgICAgdmFsID0gZmV0Y2hfYXJnIChidWZmZXIsICdkJywgMywgaW5mbyk7Ci0gICAgICAKLSAgICAgIGlmICh2YWwgIT0gMSkJCQkJLyogVW51c3VhbCBjb3Byb2Nlc3NvciBJRD8gKi8KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIihjcGlkPSVkKSAiLCB2YWwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcqJzoKLSAgICBjYXNlICd+JzoKLSAgICBjYXNlICclJzoKLSAgICBjYXNlICc7JzoKLSAgICBjYXNlICdAJzoKLSAgICBjYXNlICchJzoKLSAgICBjYXNlICckJzoKLSAgICBjYXNlICc/JzoKLSAgICBjYXNlICcvJzoKLSAgICBjYXNlICcmJzoKLSAgICBjYXNlICd8JzoKLSAgICBjYXNlICc8JzoKLSAgICBjYXNlICc+JzoKLSAgICBjYXNlICdtJzoKLSAgICBjYXNlICduJzoKLSAgICBjYXNlICdvJzoKLSAgICBjYXNlICdwJzoKLSAgICBjYXNlICdxJzoKLSAgICBjYXNlICd2JzoKLQotICAgICAgaWYgKHBsYWNlID09ICdkJykKLQl7Ci0JICB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgJ3gnLCA2LCBpbmZvKTsKLQkgIHZhbCA9ICgodmFsICYgNykgPDwgMykgKyAoKHZhbCA+PiAzKSAmIDcpOwotCX0KLSAgICAgIGVsc2UKLQl2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgJ3MnLCA2LCBpbmZvKTsKLQotICAgICAgLyogR2V0IHJlZ2lzdGVyIG51bWJlciBhc3N1bWluZyBhZGRyZXNzIHJlZ2lzdGVyLiAgKi8KLSAgICAgIHJlZ25vID0gKHZhbCAmIDcpICsgODsKLSAgICAgIHJlZ25hbWUgPSByZWdfbmFtZXNbcmVnbm9dOwotICAgICAgc3dpdGNoICh2YWwgPj4gMykKLQl7Ci0JY2FzZSAwOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ19uYW1lc1t2YWxdKTsKLQkgIGJyZWFrOwotCi0JY2FzZSAxOgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHJlZ25hbWUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDI6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCIsIHJlZ25hbWUpOwotCSAgYnJlYWs7Ci0KLQljYXNlIDM6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCsiLCByZWduYW1lKTsKLQkgIGJyZWFrOwotCi0JY2FzZSA0OgotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlc0AtIiwgcmVnbmFtZSk7Ci0JICBicmVhazsKLQotCWNhc2UgNToKLQkgIHZhbCA9IE5FWFRXT1JEIChwKTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNAKCVkKSIsIHJlZ25hbWUsIHZhbCk7Ci0JICBicmVhazsKLQotCWNhc2UgNjoKLQkgIHAgPSBwcmludF9pbmRleGVkIChyZWdubywgcCwgYWRkciwgaW5mbyk7Ci0JICBicmVhazsKLQotCWNhc2UgNzoKLQkgIHN3aXRjaCAodmFsICYgNykKLQkgICAgewotCSAgICBjYXNlIDA6Ci0JICAgICAgdmFsID0gTkVYVFdPUkQgKHApOwotCSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAodmFsLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDE6Ci0JICAgICAgdXZhbCA9IE5FWFRVTE9ORyAocCk7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh1dmFsLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDI6Ci0JICAgICAgdmFsID0gTkVYVFdPUkQgKHApOwotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVwY0AoIik7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgdmFsLCBpbmZvKTsKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDM6Ci0JICAgICAgcCA9IHByaW50X2luZGV4ZWQgKC0xLCBwLCBhZGRyLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQotCSAgICBjYXNlIDQ6Ci0JICAgICAgZmx0X3AgPSAxOwkvKiBBc3N1bWUgaXQncyBhIGZsb2F0Li4uICovCi0JICAgICAgc3dpdGNoKCBwbGFjZSApCi0JICAgICAgewotCQljYXNlICdiJzoKLQkJICB2YWwgPSBORVhUQllURSAocCk7Ci0JCSAgZmx0X3AgPSAwOwotCQkgIGJyZWFrOwotCi0JCWNhc2UgJ3cnOgotCQkgIHZhbCA9IE5FWFRXT1JEIChwKTsKLQkJICBmbHRfcCA9IDA7Ci0JCSAgYnJlYWs7Ci0KLQkJY2FzZSAnbCc6Ci0JCSAgdmFsID0gTkVYVExPTkcgKHApOwotCQkgIGZsdF9wID0gMDsKLQkJICBicmVhazsKLQotCQljYXNlICdmJzoKLQkJICBORVhUU0lOR0xFKGZsdmFsLCBwKTsKLQkJICBicmVhazsKLQotCQljYXNlICdGJzoKLQkJICBORVhURE9VQkxFKGZsdmFsLCBwKTsKLQkJICBicmVhazsKLQotCQljYXNlICd4JzoKLQkJICBORVhURVhURU5EKGZsdmFsLCBwKTsKLQkJICBicmVhazsKLQotCQljYXNlICdwJzoKLQkJICBmbHZhbCA9IE5FWFRQQUNLRUQocCk7Ci0JCSAgYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJICByZXR1cm4gLTE7Ci0JICAgICAgfQotCSAgICAgIGlmICggZmx0X3AgKQkvKiBQcmludCBhIGZsb2F0PyAqLwotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMlZyIsIGZsdmFsKTsKLQkgICAgICBlbHNlCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIyVkIiwgdmFsKTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiAtMTsKLQkgICAgfQotCX0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTCc6Ci0gICAgY2FzZSAnbCc6Ci0JaWYgKHBsYWNlID09ICd3JykKLQkgIHsKLQkgICAgY2hhciBkb25lYW55OwotCSAgICBwMSA9IGJ1ZmZlciArIDI7Ci0JICAgIHZhbCA9IE5FWFRXT1JEIChwMSk7Ci0JICAgIC8qIE1vdmUgdGhlIHBvaW50ZXIgYWhlYWQgaWYgdGhpcyBwb2ludCBpcyBmYXJ0aGVyIGFoZWFkCi0JICAgICAgIHRoYW4gdGhlIGxhc3QuICAqLwotCSAgICBwID0gcDEgPiBwID8gcDEgOiBwOwotCSAgICBpZiAodmFsID09IDApCi0JICAgICAgewotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiMwIik7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgICAgaWYgKCpkID09ICdsJykKLQkgICAgICB7Ci0JCXJlZ2lzdGVyIGludCBuZXd2YWwgPSAwOwotCQlmb3IgKHJlZ25vID0gMDsgcmVnbm8gPCAxNjsgKytyZWdubykKLQkJICBpZiAodmFsICYgKDB4ODAwMCA+PiByZWdubykpCi0JCSAgICBuZXd2YWwgfD0gMSA8PCByZWdubzsKLQkJdmFsID0gbmV3dmFsOwotCSAgICAgIH0KLQkgICAgdmFsICY9IDB4ZmZmZjsKLQkgICAgZG9uZWFueSA9IDA7Ci0JICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IDE2OyArK3JlZ25vKQotCSAgICAgIGlmICh2YWwgJiAoMSA8PCByZWdubykpCi0JCXsKLQkJICBpbnQgZmlyc3RfcmVnbm87Ci0JCSAgaWYgKGRvbmVhbnkpCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi8iKTsKLQkJICBkb25lYW55ID0gMTsKLQkJICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgcmVnX25hbWVzW3JlZ25vXSk7Ci0JCSAgZmlyc3RfcmVnbm8gPSByZWdubzsKLQkJICB3aGlsZSAodmFsICYgKDEgPDwgKHJlZ25vICsgMSkpKQotCQkgICAgKytyZWdubzsKLQkJICBpZiAocmVnbm8gPiBmaXJzdF9yZWdubykKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSVzIiwKLQkJCQkJICAgcmVnX25hbWVzW3JlZ25vXSk7Ci0JCX0KLQkgIH0KLQllbHNlIGlmIChwbGFjZSA9PSAnMycpCi0JICB7Ci0JICAgIC8qIGBmbW92ZW0nIGluc24uICAqLwotCSAgICBjaGFyIGRvbmVhbnk7Ci0JICAgIHZhbCA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgOCwgaW5mbyk7Ci0JICAgIGlmICh2YWwgPT0gMCkKLQkgICAgICB7Ci0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiIzAiKTsKLQkJYnJlYWs7Ci0JICAgICAgfQotCSAgICBpZiAoKmQgPT0gJ2wnKQotCSAgICAgIHsKLQkJcmVnaXN0ZXIgaW50IG5ld3ZhbCA9IDA7Ci0JCWZvciAocmVnbm8gPSAwOyByZWdubyA8IDg7ICsrcmVnbm8pCi0JCSAgaWYgKHZhbCAmICgweDgwID4+IHJlZ25vKSkKLQkJICAgIG5ld3ZhbCB8PSAxIDw8IHJlZ25vOwotCQl2YWwgPSBuZXd2YWw7Ci0JICAgICAgfQotCSAgICB2YWwgJj0gMHhmZjsKLQkgICAgZG9uZWFueSA9IDA7Ci0JICAgIGZvciAocmVnbm8gPSAwOyByZWdubyA8IDg7ICsrcmVnbm8pCi0JICAgICAgaWYgKHZhbCAmICgxIDw8IHJlZ25vKSkKLQkJewotCQkgIGludCBmaXJzdF9yZWdubzsKLQkJICBpZiAoZG9uZWFueSkKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLyIpOwotCQkgIGRvbmVhbnkgPSAxOwotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSVmcCVkIiwgcmVnbm8pOwotCQkgIGZpcnN0X3JlZ25vID0gcmVnbm87Ci0JCSAgd2hpbGUgKHZhbCAmICgxIDw8IChyZWdubyArIDEpKSkKLQkJICAgICsrcmVnbm87Ci0JCSAgaWYgKHJlZ25vID4gZmlyc3RfcmVnbm8pCi0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0lJWZwJWQiLCByZWdubyk7Ci0JCX0KLQkgIH0KLQllbHNlIGlmIChwbGFjZSA9PSAnOCcpCi0JICB7Ci0JICAgIC8qIGZtb3ZlbWwgZm9yIEZQIHN0YXR1cyByZWdpc3RlcnMgKi8KLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsCi0JCQkJICAgZnBjcl9uYW1lc1tmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDMsCi0JCQkJCQkJIGluZm8pXSk7Ci0JICB9Ci0JZWxzZQotCSAgcmV0dXJuIC0yOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgIHBsYWNlID0gJzgnOwotICAgIGNhc2UgJ1knOgotICAgIGNhc2UgJ1onOgotICAgIGNhc2UgJ1cnOgotICAgIGNhc2UgJzAnOgotICAgIGNhc2UgJzEnOgotICAgIGNhc2UgJzInOgotICAgIGNhc2UgJzMnOgotICAgICAgewotCWludCB2YWwgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDUsIGluZm8pOwotCWNoYXIgKm5hbWUgPSAwOwotCXN3aXRjaCAodmFsKQotCSAgewotCSAgY2FzZSAyOiBuYW1lID0gIiV0dDAiOyBicmVhazsKLQkgIGNhc2UgMzogbmFtZSA9ICIldHQxIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTA6IG5hbWUgPSAiJXRjIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTE6IG5hbWUgPSAiJWRycCI7IGJyZWFrOwotCSAgY2FzZSAweDEyOiBuYW1lID0gIiVzcnAiOyBicmVhazsKLQkgIGNhc2UgMHgxMzogbmFtZSA9ICIlY3JwIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTQ6IG5hbWUgPSAiJWNhbCI7IGJyZWFrOwotCSAgY2FzZSAweDE1OiBuYW1lID0gIiV2YWwiOyBicmVhazsKLQkgIGNhc2UgMHgxNjogbmFtZSA9ICIlc2NjIjsgYnJlYWs7Ci0JICBjYXNlIDB4MTc6IG5hbWUgPSAiJWFjIjsgYnJlYWs7Ci0gCSAgY2FzZSAweDE4OiBuYW1lID0gIiVwc3IiOyBicmVhazsKLQkgIGNhc2UgMHgxOTogbmFtZSA9ICIlcGNzciI7IGJyZWFrOwotCSAgY2FzZSAweDFjOgotCSAgY2FzZSAweDFkOgotCSAgICB7Ci0JICAgICAgaW50IGJyZWFrX3JlZyA9ICgoYnVmZmVyWzNdID4+IDIpICYgNyk7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpCi0JCShpbmZvLT5zdHJlYW0sIHZhbCA9PSAweDFjID8gIiUlYmFkJWQiIDogIiUlYmFjJWQiLAotCQkgYnJlYWtfcmVnKTsKLQkgICAgfQotCSAgICBicmVhazsKLQkgIGRlZmF1bHQ6Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiPG1tdSByZWdpc3RlciAlZD4iLCB2YWwpOwotCSAgfQotCWlmIChuYW1lKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG5hbWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdmJzoKLSAgICAgIHsKLQlpbnQgZmMgPSBmZXRjaF9hcmcgKGJ1ZmZlciwgcGxhY2UsIDUsIGluZm8pOwotCWlmIChmYyA9PSAxKQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlJWRmYyIpOwotCWVsc2UgaWYgKGZjID09IDApCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlc2ZjIik7Ci0JZWxzZQotCSAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCI8ZnVuY3Rpb24gY29kZSAlZD4iKSwgZmMpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdWJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJSV2YWwiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndCc6Ci0gICAgICB7Ci0JaW50IGxldmVsID0gZmV0Y2hfYXJnIChidWZmZXIsIHBsYWNlLCAzLCBpbmZvKTsKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgbGV2ZWwpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd1JzoKLSAgICAgIHsKLQlzaG9ydCBpc191cHBlciA9IDA7Ci0JaW50IHJlZyA9IGZldGNoX2FyZyAoYnVmZmVyLCBwbGFjZSwgNSwgaW5mbyk7Ci0JCi0JaWYgKHJlZyAmIDB4MTApCi0JICB7Ci0JICAgIGlzX3VwcGVyID0gMTsKLQkgICAgcmVnICY9IDB4ZjsKLQkgIH0KLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJXMiLAotCQkJICAgICAgIHJlZ19uYW1lc1tyZWddLAotCQkJICAgICAgIGlzX3VwcGVyID8gInUiIDogImwiKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTI7Ci0gICAgfQotCi0gIHJldHVybiBwIC0gcDA7Ci19Ci0KLS8qIEZldGNoIEJJVFMgYml0cyBmcm9tIGEgcG9zaXRpb24gaW4gdGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBieSBDT0RFLgotICAgQ09ERSBpcyBhICJwbGFjZSB0byBwdXQgYW4gYXJndW1lbnQiLCBvciAneCcgZm9yIGEgZGVzdGluYXRpb24KLSAgIHRoYXQgaXMgYSBnZW5lcmFsIGFkZHJlc3MgKG1vZGUgYW5kIHJlZ2lzdGVyKS4KLSAgIEJVRkZFUiBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1mZXRjaF9hcmcgKGJ1ZmZlciwgY29kZSwgYml0cywgaW5mbykKLSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyOwotICAgICBpbnQgY29kZTsKLSAgICAgaW50IGJpdHM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGludCB2YWwgPSAwOwotICBzd2l0Y2ggKGNvZGUpCi0gICAgewotICAgIGNhc2UgJ3MnOgotICAgICAgdmFsID0gYnVmZmVyWzFdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdkJzoJCQkvKiBEZXN0aW5hdGlvbiwgZm9yIHJlZ2lzdGVyIG9yIHF1aWNrLiAgKi8KLSAgICAgIHZhbCA9IChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV07Ci0gICAgICB2YWwgPj49IDk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3gnOgkJCS8qIERlc3RpbmF0aW9uLCBmb3IgZ2VuZXJhbCBhcmcgKi8KLSAgICAgIHZhbCA9IChidWZmZXJbMF0gPDwgOCkgKyBidWZmZXJbMV07Ci0gICAgICB2YWwgPj49IDY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2snOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzNdID4+IDQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdDJzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gYnVmZmVyWzNdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICcxJzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIHZhbCA+Pj0gMTI7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzInOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSA2OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICczJzoKLSAgICBjYXNlICdqJzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnNCc6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyA1KTsKLSAgICAgIHZhbCA9IChidWZmZXJbNF0gPDwgOCkgKyBidWZmZXJbNV07Ci0gICAgICB2YWwgPj49IDEyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICc1JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDUpOwotICAgICAgdmFsID0gKGJ1ZmZlcls0XSA8PCA4KSArIGJ1ZmZlcls1XTsKLSAgICAgIHZhbCA+Pj0gNjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnNic6Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBidWZmZXIgKyA1KTsKLSAgICAgIHZhbCA9IChidWZmZXJbNF0gPDwgOCkgKyBidWZmZXJbNV07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzcnOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSA3OwotICAgICAgYnJlYWs7Ci0gICAgICAKLSAgICBjYXNlICc4JzoKLSAgICAgIEZFVENIX0RBVEEgKGluZm8sIGJ1ZmZlciArIDMpOwotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA8PCA4KSArIGJ1ZmZlclszXTsKLSAgICAgIHZhbCA+Pj0gMTA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzknOgotICAgICAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMyk7Ci0gICAgICB2YWwgPSAoYnVmZmVyWzJdIDw8IDgpICsgYnVmZmVyWzNdOwotICAgICAgdmFsID4+PSA1OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdlJzoKLSAgICAgIHZhbCA9IChidWZmZXJbMV0gPj4gNik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ20nOiAKLSAgICAgIHZhbCA9IChidWZmZXJbMV0gJiAweDQwID8gMHg4IDogMCkKLQl8ICgoYnVmZmVyWzBdID4+IDEpICYgMHg3KQotCXwgKGJ1ZmZlclszXSAmIDB4ODAgPyAweDEwIDogMCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ24nOiAKLSAgICAgIHZhbCA9IChidWZmZXJbMV0gJiAweDQwID8gMHg4IDogMCkgfCAoKGJ1ZmZlclswXSA+PiAxKSAmIDB4Nyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ28nOgotICAgICAgdmFsID0gKGJ1ZmZlclsyXSA+PiA0KSB8IChidWZmZXJbM10gJiAweDgwID8gMHgxMCA6IDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdNJzoKLSAgICAgIHZhbCA9IGJ1ZmZlclsxXSB8IChidWZmZXJbM10gJiAweDQwID8gMHgxMCA6IDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdOJzoKLSAgICAgIHZhbCA9IGJ1ZmZlclszXSB8IChidWZmZXJbM10gJiAweDQwID8gMHgxMCA6IDApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoKLSAgICAgIHZhbCA9IGJ1ZmZlclsyXSA+PiAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotCi0gIHN3aXRjaCAoYml0cykKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuIHZhbCAmIDE7Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIHZhbCAmIDM7Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIHZhbCAmIDc7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIHZhbCAmIDAxNzsKLSAgICBjYXNlIDU6Ci0gICAgICByZXR1cm4gdmFsICYgMDM3OwotICAgIGNhc2UgNjoKLSAgICAgIHJldHVybiB2YWwgJiAwNzc7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIHZhbCAmIDAxNzc7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIHZhbCAmIDAzNzc7Ci0gICAgY2FzZSAxMjoKLSAgICAgIHJldHVybiB2YWwgJiAwNzc3NzsKLSAgICBkZWZhdWx0OgotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotfQotCi0vKiBQcmludCBhbiBpbmRleGVkIGFyZ3VtZW50LiAgVGhlIGJhc2UgcmVnaXN0ZXIgaXMgQkFTRVJFRyAoLTEgZm9yIHBjKS4KLSAgIFAgcG9pbnRzIHRvIGV4dGVuc2lvbiB3b3JkLCBpbiBidWZmZXIuCi0gICBBRERSIGlzIHRoZSBub21pbmFsIGNvcmUgYWRkcmVzcyBvZiB0aGF0IGV4dGVuc2lvbiB3b3JkLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgKgotcHJpbnRfaW5kZXhlZCAoYmFzZXJlZywgcCwgYWRkciwgaW5mbykKLSAgICAgaW50IGJhc2VyZWc7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgaW50IHdvcmQ7Ci0gIHN0YXRpYyBjaGFyICpjb25zdCBzY2FsZXNbXSA9IHsiIiwgIjoyIiwgIjo0IiwgIjo4In07Ci0gIGJmZF92bWEgYmFzZV9kaXNwOwotICBiZmRfdm1hIG91dGVyX2Rpc3A7Ci0gIGNoYXIgYnVmWzQwXTsKLSAgY2hhciB2bWFidWZbNTBdOwotCi0gIHdvcmQgPSBORVhUV09SRCAocCk7Ci0KLSAgLyogR2VuZXJhdGUgdGhlIHRleHQgZm9yIHRoZSBpbmRleCByZWdpc3Rlci4KLSAgICAgV2hlcmUgdGhpcyB3aWxsIGJlIG91dHB1dCBpcyBub3QgeWV0IGRldGVybWluZWQuICAqLwotICBzcHJpbnRmIChidWYsICIlczolYyVzIiwKLQkgICByZWdfbmFtZXNbKHdvcmQgPj4gMTIpICYgMHhmXSwKLQkgICAod29yZCAmIDB4ODAwKSA/ICdsJyA6ICd3JywKLQkgICBzY2FsZXNbKHdvcmQgPj4gOSkgJiAzXSk7Ci0KLSAgLyogSGFuZGxlIHRoZSA2ODAwMCBzdHlsZSBvZiBpbmRleGluZy4gICovCi0KLSAgaWYgKCh3b3JkICYgMHgxMDApID09IDApCi0gICAgewotICAgICAgYmFzZV9kaXNwID0gd29yZCAmIDB4ZmY7Ci0gICAgICBpZiAoKGJhc2VfZGlzcCAmIDB4ODApICE9IDApCi0JYmFzZV9kaXNwIC09IDB4MTAwOwotICAgICAgaWYgKGJhc2VyZWcgPT0gLTEpCi0JYmFzZV9kaXNwICs9IGFkZHI7Ci0gICAgICBwcmludF9iYXNlIChiYXNlcmVnLCBiYXNlX2Rpc3AsIGluZm8pOwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMpIiwgYnVmKTsKLSAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAvKiBIYW5kbGUgdGhlIGdlbmVyYWxpemVkIGtpbmQuICAqLwotICAvKiBGaXJzdCwgY29tcHV0ZSB0aGUgZGlzcGxhY2VtZW50IHRvIGFkZCB0byB0aGUgYmFzZSByZWdpc3Rlci4gICovCi0KLSAgaWYgKHdvcmQgJiAwMjAwKQotICAgIHsKLSAgICAgIGlmIChiYXNlcmVnID09IC0xKQotCWJhc2VyZWcgPSAtMzsKLSAgICAgIGVsc2UKLQliYXNlcmVnID0gLTI7Ci0gICAgfQotICBpZiAod29yZCAmIDAxMDApCi0gICAgYnVmWzBdID0gJ1wwJzsKLSAgYmFzZV9kaXNwID0gMDsKLSAgc3dpdGNoICgod29yZCA+PiA0KSAmIDMpCi0gICAgewotICAgIGNhc2UgMjoKLSAgICAgIGJhc2VfZGlzcCA9IE5FWFRXT1JEIChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIGJhc2VfZGlzcCA9IE5FWFRMT05HIChwKTsKLSAgICB9Ci0gIGlmIChiYXNlcmVnID09IC0xKQotICAgIGJhc2VfZGlzcCArPSBhZGRyOwotCi0gIC8qIEhhbmRsZSBzaW5nbGUtbGV2ZWwgY2FzZSAobm90IGluZGlyZWN0KSAqLwotCi0gIGlmICgod29yZCAmIDcpID09IDApCi0gICAgewotICAgICAgcHJpbnRfYmFzZSAoYmFzZXJlZywgYmFzZV9kaXNwLCBpbmZvKTsKLSAgICAgIGlmIChidWZbMF0gIT0gJ1wwJykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcyIsIGJ1Zik7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLSAgICAgIHJldHVybiBwOwotICAgIH0KLQotICAvKiBUd28gbGV2ZWwuICBDb21wdXRlIGRpc3BsYWNlbWVudCB0byBhZGQgYWZ0ZXIgaW5kaXJlY3Rpb24uICAqLwotCi0gIG91dGVyX2Rpc3AgPSAwOwotICBzd2l0Y2ggKHdvcmQgJiAzKQotICAgIHsKLSAgICBjYXNlIDI6Ci0gICAgICBvdXRlcl9kaXNwID0gTkVYVFdPUkQgKHApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgb3V0ZXJfZGlzcCA9IE5FWFRMT05HIChwKTsKLSAgICB9Ci0KLSAgcHJpbnRfYmFzZSAoYmFzZXJlZywgYmFzZV9kaXNwLCBpbmZvKTsKLSAgaWYgKCh3b3JkICYgNCkgPT0gMCAmJiBidWZbMF0gIT0gJ1wwJykKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwlcyIsIGJ1Zik7Ci0gICAgICBidWZbMF0gPSAnXDAnOwotICAgIH0KLSAgc3ByaW50Zl92bWEgKHZtYWJ1Ziwgb3V0ZXJfZGlzcCk7Ci0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKUAoJXMiLCB2bWFidWYpOwotICBpZiAoYnVmWzBdICE9ICdcMCcpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsJXMiLCBidWYpOwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIikiKTsKLQotICByZXR1cm4gcDsKLX0KLQotLyogUHJpbnQgYSBiYXNlIHJlZ2lzdGVyIFJFR05PIGFuZCBkaXNwbGFjZW1lbnQgRElTUCwgb24gSU5GTy0+U1RSRUFNLgotICAgUkVHTk8gPSAtMSBmb3IgcGMsIC0yIGZvciBub25lIChzdXBwcmVzc2VkKS4gICovCi0KLXN0YXRpYyB2b2lkCi1wcmludF9iYXNlIChyZWdubywgZGlzcCwgaW5mbykKLSAgICAgaW50IHJlZ25vOwotICAgICBiZmRfdm1hIGRpc3A7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGlmIChyZWdubyA9PSAtMSkKLSAgICB7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlcGNAKCIpOwotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChkaXNwLCBpbmZvKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjaGFyIGJ1Zls1MF07Ci0KLSAgICAgIGlmIChyZWdubyA9PSAtMikKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIkAoIik7Ci0gICAgICBlbHNlIGlmIChyZWdubyA9PSAtMykKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiUlenBjQCgiKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzQCgiLCByZWdfbmFtZXNbcmVnbm9dKTsKLQotICAgICAgc3ByaW50Zl92bWEgKGJ1ZiwgZGlzcCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzIiwgYnVmKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL202OGstb3BjLmMgYi9vcGNvZGVzL202OGstb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2FkN2MuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tNjhrLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE4NyArMCwwIEBACi0vKiBPcGNvZGUgdGFibGUgZm9yIG02ODBbMDEyMzQ2XTAvbTY4ODhbMTJdL202ODg1MS9tY2Y1MjAwLgotICAgQ29weXJpZ2h0IDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMuCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLXRoZW0gYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi1MaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgotMSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IHRoZXkKLXdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAotd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCi10aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBmaWxlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLVNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQotMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL202OGsuaCIKLQotI2RlZmluZSBvbmUoeCkgKCh1bnNpZ25lZCBpbnQpICh4KSA8PCAxNikKLSNkZWZpbmUgdHdvKHgsIHkpICgoKHVuc2lnbmVkIGludCkgKHgpIDw8IDE2KSArICh5KSkKLQotLyogVGhlIGFzc2VtYmxlciByZXF1aXJlcyB0aGF0IGFsbCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgbW5lbW9uaWMgbXVzdAotICAgYmUgY29uc2VjdXRpdmUuICBJZiB0aGV5IGFyZW4ndCwgdGhlIGFzc2VtYmxlciB3aWxsIGJvbWIgYXQKLSAgIHJ1bnRpbWUuICAqLwotCi1jb25zdCBzdHJ1Y3QgbTY4a19vcGNvZGUgbTY4a19vcGNvZGVzW10gPQotewoteyJhYmNkIiwJb25lKDAxNDA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsiYWJjZCIsCW9uZSgwMTQwNDEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLXsiYWRkYXciLAlvbmUoMDE1MDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJhZGRhbCIsCW9uZSgwMTUwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYWRkaWIiLAlvbmUoMDAwMzAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhZGRpdyIsCW9uZSgwMDAzMTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi17ImFkZGlsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkaWwiLAlvbmUoMDAwMzIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLQoteyJhZGRxYiIsCW9uZSgwMDUwMDAwKSwJb25lKDAxNzA3MDApLCAiUWQkYiIsIG02ODAwMHVwIH0sCi17ImFkZHF3IiwJb25lKDAwNTAxMDApLAlvbmUoMDE3MDcwMCksICJRZCV3IiwgbTY4MDAwdXAgfSwKLXsiYWRkcWwiLAlvbmUoMDA1MDIwMCksCW9uZSgwMTcwNzAwKSwgIlFkJWwiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi0vKiBUaGUgYWRkIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIGFkZGEsIGFkZGksIGFuZCBhZGRxIGluc3RydWN0aW9ucy4gICovCi17ImFkZGIiLAlvbmUoMDA1MDAwMCksCW9uZSgwMTcwNzAwKSwgIlFkJGIiLCBtNjgwMDB1cCB9LAoteyJhZGRiIiwJb25lKDAwMDMwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkYiIsCW9uZSgwMTUwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImFkZGIiLAlvbmUoMDE1MDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmIiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAwNTAxMDApLAlvbmUoMDE3MDcwMCksICJRZCV3IiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMTUwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17ImFkZHciLAlvbmUoMDAwMzEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhZGR3IiwJb25lKDAxNTAxMDApLAlvbmUoMDE3MDcwMCksICIqd0RkIiwgbTY4MDAwdXAgfSwKLXsiYWRkdyIsCW9uZSgwMTUwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+dyIsIG02ODAwMHVwIH0sCi17ImFkZGwiLAlvbmUoMDA1MDIwMCksCW9uZSgwMTcwNzAwKSwgIlFkJWwiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhZGRsIiwJb25lKDAwMDMyMDApLAlvbmUoMDE3NzcwMCksICIjbCRzIiwgbTY4MDAwdXAgfSwKLXsiYWRkbCIsCW9uZSgwMDAzMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAoteyJhZGRsIiwJb25lKDAxNTA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYWRkbCIsCW9uZSgwMTUwMjAwKSwJb25lKDAxNzA3MDApLCAiKmxEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFkZGwiLAlvbmUoMDE1MDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmwiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImFkZHhiIiwJb25lKDAxNTA0MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsiYWRkeGIiLAlvbmUoMDE1MDQxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJhZGR4dyIsCW9uZSgwMTUwNTAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17ImFkZHh3IiwJb25lKDAxNTA1MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLXsiYWRkeGwiLAlvbmUoMDE1MDYwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhZGR4bCIsCW9uZSgwMTUwNjEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi0KLXsiYW5kaWIiLAlvbmUoMDAwMTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpYiIsCW9uZSgwMDAxMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImFuZGl3IiwJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaXciLAlvbmUoMDAwMTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJhbmRpbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImFuZGlsIiwJb25lKDAwMDEyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImFuZGkiLAlvbmUoMDAwMTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJhbmRpIiwJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kaSIsCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBhbmQgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgYW5kaSBpbnN0cnVjdGlvbi4gICovCi17ImFuZGIiLAlvbmUoMDAwMTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJhbmRiIiwJb25lKDAwMDEwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiYW5kYiIsCW9uZSgwMTQwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImFuZGIiLAlvbmUoMDE0MDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmIiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiYW5kdyIsCW9uZSgwMDAxMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImFuZHciLAlvbmUoMDE0MDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJhbmR3IiwJb25lKDAxNDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH53IiwgbTY4MDAwdXAgfSwKLXsiYW5kbCIsCW9uZSgwMDAxMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImFuZGwiLAlvbmUoMDAwMTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiYW5kbCIsCW9uZSgwMTQwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImFuZGwiLAlvbmUoMDE0MDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfmwiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJhbmQiLAkJb25lKDAwMDExMDApLAlvbmUoMDE3NzcwMCksICIjdyR3IiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMDAxMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImFuZCIsCQlvbmUoMDAwMTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJhbmQiLAkJb25lKDAxNDAxMDApLAlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXAgfSwKLXsiYW5kIiwJCW9uZSgwMTQwNTAwKSwJb25lKDAxNzA3MDApLCAiRGR+dyIsIG02ODAwMHVwIH0sCi0KLXsiYXNsYiIsCW9uZSgwMTYwNDAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzbGIiLAlvbmUoMDE2MDQ0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc2x3IiwJb25lKDAxNjA1MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNsdyIsCW9uZSgwMTYwNTQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzbHciLAlvbmUoMDE2MDcwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJhc2xsIiwJb25lKDAxNjA2MDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYXNsbCIsCW9uZSgwMTYwNjQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYXNyYiIsCW9uZSgwMTYwMDAwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImFzcmIiLAlvbmUoMDE2MDA0MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJhc3J3IiwJb25lKDAxNjAxMDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsiYXNydyIsCW9uZSgwMTYwMTQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImFzcnciLAlvbmUoMDE2MDMwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJhc3JsIiwJb25lKDAxNjAyMDApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYXNybCIsCW9uZSgwMTYwMjQwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYmhpdyIsCW9uZSgwMDYxMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibHN3IiwJb25lKDAwNjE0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjY3ciLAlvbmUoMDA2MjAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmNzdyIsCW9uZSgwMDYyNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibmV3IiwJb25lKDAwNjMwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJlcXciLAlvbmUoMDA2MzQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnZjdyIsCW9uZSgwMDY0MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidnN3IiwJb25lKDAwNjQ0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJwbHciLAlvbmUoMDA2NTAwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYm1pdyIsCW9uZSgwMDY1NDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZ2V3IiwJb25lKDAwNjYwMDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJsdHciLAlvbmUoMDA2NjQwMCksCW9uZSgwMTc3Nzc3KSwgIkJXIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmd0dyIsCW9uZSgwMDY3MDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibGV3IiwJb25lKDAwNjc0MDApLAlvbmUoMDE3Nzc3NyksICJCVyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiYmhpbCIsCW9uZSgwMDYxMzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJsc2wiLAlvbmUoMDA2MTc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiY2NsIiwJb25lKDAwNjIzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmNzbCIsCW9uZSgwMDYyNzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJuZWwiLAlvbmUoMDA2MzM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJiZXFsIiwJb25lKDAwNjM3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnZjbCIsCW9uZSgwMDY0Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJ2c2wiLAlvbmUoMDA2NDc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJicGxsIiwJb25lKDAwNjUzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYm1pbCIsCW9uZSgwMDY1Nzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJnZWwiLAlvbmUoMDA2NjM3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJibHRsIiwJb25lKDAwNjY3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYmd0bCIsCW9uZSgwMDY3Mzc3KSwJb25lKDAxNzc3NzcpLCAiQkwiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImJsZWwiLAlvbmUoMDA2Nzc3NyksCW9uZSgwMTc3Nzc3KSwgIkJMIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImJoaXMiLAlvbmUoMDA2MTAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmxzcyIsCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY2NzIiwJb25lKDAwNjIwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJjc3MiLAlvbmUoMDA2MjQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYm5lcyIsCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiZXFzIiwJb25lKDAwNjM0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJ2Y3MiLAlvbmUoMDA2NDAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYnZzcyIsCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJicGxzIiwJb25lKDAwNjUwMDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJtaXMiLAlvbmUoMDA2NTQwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmdlcyIsCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJibHRzIiwJb25lKDAwNjY0MDApLAlvbmUoMDE3NzQwMCksICJCQiIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImJndHMiLAlvbmUoMDA2NzAwMCksCW9uZSgwMTc3NDAwKSwgIkJCIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiYmxlcyIsCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImpoaSIsCQlvbmUoMDA2MTAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamxzIiwJCW9uZSgwMDYxNDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqY2MiLAkJb25lKDAwNjIwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpjcyIsCQlvbmUoMDA2MjQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiam5lIiwJCW9uZSgwMDYzMDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqZXEiLAkJb25lKDAwNjM0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17Imp2YyIsCQlvbmUoMDA2NDAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsianZzIiwJCW9uZSgwMDY0NDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqcGwiLAkJb25lKDAwNjUwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImptaSIsCQlvbmUoMDA2NTQwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamdlIiwJCW9uZSgwMDY2MDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqbHQiLAkJb25lKDAwNjY0MDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpndCIsCQlvbmUoMDA2NzAwMCksCW9uZSgwMTc3NDAwKSwgIkJnIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiamxlIiwJCW9uZSgwMDY3NDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJjaGciLAlvbmUoMDAwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJiY2hnIiwJb25lKDAwMDQxMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsiYmNoZyIsCW9uZSgwMDA0MTAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZiB9LAotCi17ImJjbHIiLAlvbmUoMDAwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJiY2xyIiwJb25lKDAwMDA2MDApLAlvbmUoMDE3MDcwMCksICJEZHZzIiwgbWNmIH0sCi17ImJjbHIiLAlvbmUoMDAwNDIwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJiY2xyIiwJb25lKDAwMDQyMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmIH0sCi0KLXsiYmZjaGciLAl0d28oMDE2NTMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLXsiYmZjbHIiLAl0d28oMDE2NjMwMCwgMCksIHR3bygwMTc3NzAwLCAwMTcwMDAwKSwJIj9zTzJPMyIsICAgbTY4MDIwdXAgfSwKLXsiYmZleHRzIiwJdHdvKDAxNjU3MDAsIDApLCB0d28oMDE3NzcwMCwgMDEwMDAwMCksCSIvc08yTzNEMSIsIG02ODAyMHVwIH0sCi17ImJmZXh0dSIsCXR3bygwMTY0NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoteyJiZmZmbyIsCXR3bygwMTY2NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiL3NPMk8zRDEiLCBtNjgwMjB1cCB9LAoteyJiZmlucyIsCXR3bygwMTY3NzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxMDAwMDApLAkiRDE/c08yTzMiLCBtNjgwMjB1cCB9LAoteyJiZnNldCIsCXR3bygwMTY3MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzAwMDApLAkiP3NPMk8zIiwgICBtNjgwMjB1cCB9LAoteyJiZnRzdCIsCXR3bygwMTY0MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzAwMDApLAkiL3NPMk8zIiwgICBtNjgwMjB1cCB9LAotCi17ImJnbmQiLAlvbmUoMDA0NTM3MiksCQlvbmUoMDE3Nzc3NyksICIiLCBjcHUzMiB9LAotCi17ImJrcHQiLAlvbmUoMDA0NDExMCksCQlvbmUoMDE3Nzc3MCksICJ0cyIsIG02ODAxMHVwIH0sCi0KLXsiYnJhdyIsCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJicmFsIiwJb25lKDAwNjAzNzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnJhcyIsCW9uZSgwMDYwMDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJzZXQiLAlvbmUoMDAwMDcwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB9LAoteyJic2V0IiwJb25lKDAwMDA3MDApLAlvbmUoMDE3MDcwMCksICJEZHZzIiwgbWNmIH0sCi17ImJzZXQiLAlvbmUoMDAwNDMwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJic2V0IiwJb25lKDAwMDQzMDApLAlvbmUoMDE3NzcwMCksICIjYnFzIiwgbWNmIH0sCi0KLXsiYnNydyIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc3NzcpLCAiQlciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJic3JsIiwJb25lKDAwNjA3NzcpLAlvbmUoMDE3Nzc3NyksICJCTCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsiYnNycyIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc0MDApLCAiQkIiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImJ0c3QiLAlvbmUoMDAwMDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkO2IiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJidHN0IiwJb25lKDAwMDQwMDApLAlvbmUoMDE3NzcwMCksICIjYkBzIiwgbTY4MDAwdXAgfSwKLXsiYnRzdCIsCW9uZSgwMDA0MDAwKSwJb25lKDAxNzc3MDApLCAiI2JxcyIsIG1jZiB9LAotCi17ImNhbGxtIiwJb25lKDAwMDMzMDApLAkJb25lKDAxNzc3MDApLCAiI2IhcyIsIG02ODAyMCB9LAotCi17ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCi17ImNhczJ3IiwgICAgIHR3bygwMDA2Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCi17ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1cjFyNCIsIG02ODAyMHVwIH0sCi17ImNhczJsIiwgICAgIHR3bygwMDA3Mzc0LDApLCB0d28oMDE3Nzc3NywwMDA3MDcwKSwgIkQzRDZEMkQ1UjFSNCIsIG02ODAyMHVwIH0sCi0KLXsiY2FzYiIsCXR3bygwMDA1MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLXsiY2FzdyIsCXR3bygwMDA2MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLXsiY2FzbCIsCXR3bygwMDA3MzAwLCAwKSwgdHdvKDAxNzc3MDAsIDAxNzcwNzApLAkiRDNEMn5zIiwgbTY4MDIwdXAgfSwKLQoteyJjaGsyYiIsIHR3bygwMDAwMzAwLDAwMDQwMDApLCB0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjaGsydyIsIHR3bygwMDAxMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJjaGsybCIsIHR3bygwMDAyMzAwLDAwMDQwMDApLAl0d28oMDE3NzcwMCwwNzc3NyksICIhc1IxIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAotCi17ImNoa2wiLAlvbmUoMDA0MDQwMCksCQlvbmUoMDE3MDcwMCksICI7bERkIiwgbTY4MDAwdXAgfSwKLXsiY2hrdyIsCW9uZSgwMDQwNjAwKSwJCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAotCi0jZGVmaW5lIFNDT1BFX0xJTkUgKDB4MSA8PCAzKQotI2RlZmluZSBTQ09QRV9QQUdFICgweDIgPDwgMykKLSNkZWZpbmUgU0NPUEVfQUxMICAoMHgzIDw8IDMpCi0KLXsiY2ludmEiLAlvbmUoMHhmNDAwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoteyJjaW52bCIsCW9uZSgweGY0MDB8U0NPUEVfTElORSksIG9uZSgweGZmMzgpLCAiY2VhcyIsIG02ODA0MHVwIH0sCi17ImNpbnZwIiwJb25lKDB4ZjQwMHxTQ09QRV9QQUdFKSwgb25lKDB4ZmYzOCksICJjZWFzIiwgbTY4MDQwdXAgfSwKLQoteyJjcHVzaGEiLAlvbmUoMHhmNDIwfFNDT1BFX0FMTCksICBvbmUoMHhmZjM4KSwgImNlIiwgICBtNjgwNDB1cCB9LAoteyJjcHVzaGwiLAlvbmUoMHhmNDIwfFNDT1BFX0xJTkUpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAoteyJjcHVzaGwiLAlvbmUoMHgwNGU4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCAgIG1jZiB9LAoteyJjcHVzaHAiLAlvbmUoMHhmNDIwfFNDT1BFX1BBR0UpLCBvbmUoMHhmZjM4KSwgImNlYXMiLCBtNjgwNDB1cCB9LAotCi0jdW5kZWYgU0NPUEVfTElORQotI3VuZGVmIFNDT1BFX1BBR0UKLSN1bmRlZiBTQ09QRV9BTEwKLQoteyJjbHJiIiwJb25lKDAwNDEwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImNscnciLAlvbmUoMDA0MTEwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiY2xybCIsCW9uZSgwMDQxMjAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImNtcDJiIiwJdHdvKDAwMDAzMDAsMCksIHR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImNtcDJ3IiwJdHdvKDAwMDEzMDAsMCksCXR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17ImNtcDJsIiwJdHdvKDAwMDIzMDAsMCksCXR3bygwMTc3NzAwLDA3Nzc3KSwgIiFzUjEiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsiY21wYXciLAlvbmUoMDEzMDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJjbXBhbCIsCW9uZSgwMTMwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiY21waWIiLAlvbmUoMDAwNjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBpdyIsCW9uZSgwMDA2MTAwKSwJb25lKDAxNzc3MDApLCAiI3dAcyIsIG02ODAwMHVwIH0sCi17ImNtcGlsIiwJb25lKDAwMDYyMDApLAlvbmUoMDE3NzcwMCksICIjbEBzIiwgbTY4MDAwdXAgfSwKLXsiY21waWwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLQoteyJjbXBtYiIsCW9uZSgwMTMwNDEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcG13IiwJb25lKDAxMzA1MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wbWwiLAlvbmUoMDEzMDYxMCksCW9uZSgwMTcwNzcwKSwgIitzK2QiLCBtNjgwMDB1cCB9LAotCi0vKiBUaGUgY21wIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIGNtcGEsIGNtcG0sIGFuZCBjbXBpIGluc3RydWN0aW9ucy4gICovCi17ImNtcGIiLAlvbmUoMDAwNjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiQHMiLCBtNjgwMDB1cCB9LAoteyJjbXBiIiwJb25lKDAxMzA0MTApLAlvbmUoMDE3MDc3MCksICIrcytkIiwgbTY4MDAwdXAgfSwKLXsiY21wYiIsCW9uZSgwMTMwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDEzMDMwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB9LAoteyJjbXB3IiwJb25lKDAwMDYxMDApLAlvbmUoMDE3NzcwMCksICIjd0BzIiwgbTY4MDAwdXAgfSwKLXsiY21wdyIsCW9uZSgwMTMwNTEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcHciLAlvbmUoMDEzMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoteyJjbXBsIiwJb25lKDAxMzA3MDApLAlvbmUoMDE3MDcwMCksICIqbEFkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsiY21wbCIsCW9uZSgwMDA2MjAwKSwJb25lKDAxNzc3MDApLCAiI2xAcyIsIG02ODAwMHVwIH0sCi17ImNtcGwiLAlvbmUoMDAwNjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsiY21wbCIsCW9uZSgwMTMwNjEwKSwJb25lKDAxNzA3NzApLCAiK3MrZCIsIG02ODAwMHVwIH0sCi17ImNtcGwiLAlvbmUoMDEzMDIwMCksCW9uZSgwMTcwNzAwKSwgIipsRGQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17ImRiY2MiLAlvbmUoMDA1MjMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmNzIiwJb25lKDAwNTI3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJlcSIsCW9uZSgwMDUzNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiZiIsCQlvbmUoMDA1MDcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmdlIiwJb25lKDAwNTYzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJndCIsCW9uZSgwMDU3MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRiaGkiLAlvbmUoMDA1MTMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYmxlIiwJb25lKDAwNTc3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJscyIsCW9uZSgwMDUxNzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRibHQiLAlvbmUoMDA1NjcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYm1pIiwJb25lKDAwNTU3MTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJuZSIsCW9uZSgwMDUzMzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRicGwiLAlvbmUoMDA1NTMxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAoteyJkYnQiLAkJb25lKDAwNTAzMTApLAlvbmUoMDE3Nzc3MCksICJEc0J3IiwgbTY4MDAwdXAgfSwKLXsiZGJ2YyIsCW9uZSgwMDU0MzEwKSwJb25lKDAxNzc3NzApLCAiRHNCdyIsIG02ODAwMHVwIH0sCi17ImRidnMiLAlvbmUoMDA1NDcxMCksCW9uZSgwMTc3NzcwKSwgIkRzQnciLCBtNjgwMDB1cCB9LAotCi17ImRpdnN3IiwJb25lKDAxMDA3MDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImRpdnN3IiwJb25lKDAxMDA3MDApLCAgIG9uZSgwMTcwNzAwKSwgInZzRGQiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDYwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEQzRDEiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDQwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEREIiwgICBtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbCIsIHR3bygwMDQ2MTAwLDAwMDQwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCJ2c0REIiwgICBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJkaXZzbGwiLCB0d28oMDA0NjEwMCwwMDA0MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xEM0QxIixtNjgwMjB1cHxjcHUzMiB9LAoteyJkaXZzbGwiLCB0d28oMDA0NjEwMCwwMDA0MDAwKSx0d28oMDE3NzcwMCwwMTA3NzcwKSwiO2xERCIsICBtNjgwMjB1cHxjcHUzMiB9LAotCi17ImRpdnV3IiwJb25lKDAxMDAzMDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwIH0sCi17ImRpdnV3IiwJb25lKDAxMDAzMDApLAkJb25lKDAxNzA3MDApLCAidnNEZCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMjAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsRDNEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksIjtsREQiLCAgIG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsIiwgdHdvKDAwNDYxMDAsMDAwMDAwMCksdHdvKDAxNzc3MDAsMDEwNzc3MCksInZzREQiLCAgIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17ImRpdnVsbCIsIHR3bygwMDQ2MTAwLDAwMDAwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEQzRDEiLG02ODAyMHVwfGNwdTMyIH0sCi17ImRpdnVsbCIsIHR3bygwMDQ2MTAwLDAwMDAwMDApLHR3bygwMTc3NzAwLDAxMDc3NzApLCI7bEREIiwgIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsiZW9yaWIiLAlvbmUoMDAwNTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JpYiIsCW9uZSgwMDA1MDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17ImVvcml3IiwJb25lKDAwMDUxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaXciLAlvbmUoMDAwNTE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpbCIsCW9uZSgwMDA1MjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17ImVvcmlsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImVvcmkiLAlvbmUoMDAwNTA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJlb3JpIiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9yaSIsCW9uZSgwMDA1MTAwKSwJb25lKDAxNzc3MDApLCAiI3ckcyIsIG02ODAwMHVwIH0sCi0KLS8qIFRoZSBlb3Igb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgZW9yaSBpbnN0cnVjdGlvbi4gICovCi17ImVvcmIiLAlvbmUoMDAwNTAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JiIiwJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yYiIsCW9uZSgwMTMwNDAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImVvcnciLAlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3J3IiwJb25lKDAwMDUxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsiZW9ydyIsCW9uZSgwMTMwNTAwKSwJb25lKDAxNzA3MDApLCAiRGQkcyIsIG02ODAwMHVwIH0sCi17ImVvcmwiLAlvbmUoMDAwNTIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJlb3JsIiwJb25lKDAwMDUyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17ImVvcmwiLAlvbmUoMDEzMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkJHMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJlb3IiLAkJb25lKDAwMDUwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsiZW9yIiwJCW9uZSgwMDA1MTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17ImVvciIsCQlvbmUoMDAwNTEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJlb3IiLAkJb25lKDAxMzA1MDApLAlvbmUoMDE3MDcwMCksICJEZCRzIiwgbTY4MDAwdXAgfSwKLQoteyJleGciLAkJb25lKDAxNDA1MDApLAlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsiZXhnIiwJCW9uZSgwMTQwNTEwKSwJb25lKDAxNzA3NzApLCAiQWRBcyIsIG02ODAwMHVwIH0sCi17ImV4ZyIsCQlvbmUoMDE0MDYxMCksCW9uZSgwMTcwNzcwKSwgIkRkQXMiLCBtNjgwMDB1cCB9LAoteyJleGciLAkJb25lKDAxNDA2MTApLAlvbmUoMDE3MDc3MCksICJBc0RkIiwgbTY4MDAwdXAgfSwKLQoteyJleHR3IiwJb25lKDAwNDQyMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwfG1jZiB9LAoteyJleHRsIiwJb25lKDAwNDQzMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwfG1jZiB9LAoteyJleHRibCIsCW9uZSgwMDQ0NzAwKSwJb25lKDAxNzc3NzApLCAiRHMiLCBtNjgwMjB1cHxjcHUzMnxtY2YgfSwKLQotLyogZmxvYXQgc3R1ZmYgc3RhcnRzIGhlcmUgKi8KLQoteyJmYWJzYiIsCXR3bygweEYwMDAsIDB4NTgxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFic2QiLAl0d28oMHhGMDAwLCAweDU0MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYWJzcCIsCXR3bygweEYwMDAsIDB4NEMxOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFic3MiLAl0d28oMHhGMDAwLCAweDQ0MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDE4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYWJzeCIsCXR3bygweEYwMDAsIDB4MDAxOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFic3giLAl0d28oMHhGMDAwLCAweDQ4MTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzYWJzYiIsCXR3bygweEYwMDAsIDB4NTg1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic2QiLAl0d28oMHhGMDAwLCAweDU0NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzcCIsCXR3bygweEYwMDAsIDB4NEM1OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3MiLAl0d28oMHhGMDAwLCAweDQ0NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDU4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzYWJzeCIsCXR3bygweEYwMDAsIDB4MDA1OCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc2Fic3giLAl0d28oMHhGMDAwLCAweDQ4NTgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDU4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRhYnNiIiwJdHdvKDB4RjAwMCwgMHg1ODVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNkIiwJdHdvKDB4RjAwMCwgMHg1NDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNsIiwJdHdvKDB4RjAwMCwgMHg0MDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNwIiwJdHdvKDB4RjAwMCwgMHg0QzVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnNzIiwJdHdvKDB4RjAwMCwgMHg0NDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN3IiwJdHdvKDB4RjAwMCwgMHg1MDVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDVjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHg0ODVjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwfSwKLXsiZmRhYnN4IiwJdHdvKDB4RjAwMCwgMHgwMDVjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwfSwKLQoteyJmYWNvc2IiLAl0d28oMHhGMDAwLCAweDU4MUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZhY29zZCIsCXR3bygweEYwMDAsIDB4NTQxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFjb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3AiLAl0d28oMHhGMDAwLCAweDRDMUMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZhY29zcyIsCXR3bygweEYwMDAsIDB4NDQxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFjb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDFDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYWNvc3giLAl0d28oMHhGMDAwLCAweDAwMUMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZhY29zeCIsCXR3bygweEYwMDAsIDB4NDgxQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmFjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFDKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZhZGRiIiwJdHdvKDB4RjAwMCwgMHg1ODIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYWRkZCIsCXR3bygweEYwMDAsIDB4NTQyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmFkZGwiLAl0d28oMHhGMDAwLCAweDQwMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhZGRwIiwJdHdvKDB4RjAwMCwgMHg0QzIyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYWRkcyIsCXR3bygweEYwMDAsIDB4NDQyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmFkZHciLAl0d28oMHhGMDAwLCAweDUwMjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhZGR4IiwJdHdvKDB4RjAwMCwgMHgwMDIyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYWRkeCIsCXR3bygweEYwMDAsIDB4NDgyMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmc2FkZGIiLAl0d28oMHhGMDAwLCAweDU4NjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRkIiwJdHdvKDB4RjAwMCwgMHg1NDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkbCIsCXR3bygweEYwMDAsIDB4NDA2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHAiLAl0d28oMHhGMDAwLCAweDRDNjIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGRzIiwJdHdvKDB4RjAwMCwgMHg0NDYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzYWRkdyIsCXR3bygweEYwMDAsIDB4NTA2MiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc2FkZHgiLAl0d28oMHhGMDAwLCAweDAwNjIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNhZGR4IiwJdHdvKDB4RjAwMCwgMHg0ODYyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRhZGRiIiwJdHdvKDB4RjAwMCwgMHg1ODY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkZCIsCXR3bygweEYwMDAsIDB4NTQ2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZGwiLAl0d28oMHhGMDAwLCAweDQwNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGRwIiwJdHdvKDB4RjAwMCwgMHg0QzY2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkcyIsCXR3bygweEYwMDAsIDB4NDQ2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZGFkZHciLAl0d28oMHhGMDAwLCAweDUwNjYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRhZGR4IiwJdHdvKDB4RjAwMCwgMHgwMDY2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkYWRkeCIsCXR3bygweEYwMDAsIDB4NDg2NiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZhc2luYiIsCXR3bygweEYwMDAsIDB4NTgwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5kIiwJdHdvKDB4RjAwMCwgMHg1NDBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYXNpbmwiLAl0d28oMHhGMDAwLCAweDQwMEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZhc2lucCIsCXR3bygweEYwMDAsIDB4NEMwQyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmFzaW5zIiwJdHdvKDB4RjAwMCwgMHg0NDBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYXNpbnciLAl0d28oMHhGMDAwLCAweDUwMEMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZhc2lueCIsCXR3bygweEYwMDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmFzaW54IiwJdHdvKDB4RjAwMCwgMHg0ODBDKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYXNpbngiLAl0d28oMHhGMDAwLCAweDAwMEMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmF0YW5iIiwJdHdvKDB4RjAwMCwgMHg1ODBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmQiLAl0d28oMHhGMDAwLCAweDU0MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZhdGFubCIsCXR3bygweEYwMDAsIDB4NDAwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmF0YW5wIiwJdHdvKDB4RjAwMCwgMHg0QzBBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYXRhbnMiLAl0d28oMHhGMDAwLCAweDQ0MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZhdGFudyIsCXR3bygweEYwMDAsIDB4NTAwQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmF0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYXRhbngiLAl0d28oMHhGMDAwLCAweDQ4MEEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZhdGFueCIsCXR3bygweEYwMDAsIDB4MDAwQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmYXRhbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhkIiwJdHdvKDB4RjAwMCwgMHg1NDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhsIiwJdHdvKDB4RjAwMCwgMHg0MDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmhzIiwJdHdvKDB4RjAwMCwgMHg0NDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh3IiwJdHdvKDB4RjAwMCwgMHg1MDBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDBEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHg0ODBEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmYXRhbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDBEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZiZXEiLAlvbmUoMHhGMDgxKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmYiLAkJb25lKDB4RjA4MCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJnZSIsCW9uZSgweEYwOTMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ2wiLAlvbmUoMHhGMDk2KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmdsZSIsCW9uZSgweEYwOTcpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZiZ3QiLAlvbmUoMHhGMDkyKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYmxlIiwJb25lKDB4RjA5NSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJsdCIsCW9uZSgweEYwOTQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmUiLAlvbmUoMHhGMDhFKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5nZSIsCW9uZSgweEYwOUMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmdsIiwJb25lKDB4RjA5OSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ2xlIiwJb25lKDB4RjA5OCksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJuZ3QiLAlvbmUoMHhGMDlEKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm5sZSIsCW9uZSgweEYwOUEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZibmx0IiwJb25lKDB4RjA5QiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvZ2UiLAlvbmUoMHhGMDgzKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9nbCIsCW9uZSgweEYwODYpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib2d0IiwJb25lKDB4RjA4MiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJvbGUiLAlvbmUoMHhGMDg1KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYm9sdCIsCW9uZSgweEYwODQpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZib3IiLAlvbmUoMHhGMDg3KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnNlcSIsCW9uZSgweEYwOTEpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic2YiLAlvbmUoMHhGMDkwKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnNuZSIsCW9uZSgweEYwOUUpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZic3QiLAlvbmUoMHhGMDlGKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnQiLAkJb25lKDB4RjA4RiksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1ZXEiLAlvbmUoMHhGMDg5KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVnZSIsCW9uZSgweEYwOEIpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidWd0IiwJb25lKDB4RjA4QSksCQlvbmUoMHhGMUZGKSwgIklkQlciLCBtZmxvYXQgfSwKLXsiZmJ1bGUiLAlvbmUoMHhGMDhEKSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAoteyJmYnVsdCIsCW9uZSgweEYwOEMpLAkJb25lKDB4RjFGRiksICJJZEJXIiwgbWZsb2F0IH0sCi17ImZidW4iLAlvbmUoMHhGMDg4KSwJCW9uZSgweEYxRkYpLCAiSWRCVyIsIG1mbG9hdCB9LAotCi17ImZiZXFsIiwJb25lKDB4RjBDMSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJmbCIsCW9uZSgweEYwQzApLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZiZ2VsIiwJb25lKDB4RjBEMyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJnbGwiLAlvbmUoMHhGMEQ2KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmdsZWwiLAlvbmUoMHhGMEQ3KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYmd0bCIsCW9uZSgweEYwRDIpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibGVsIiwJb25lKDB4RjBENSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJsdGwiLAlvbmUoMHhGMEQ0KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5lbCIsCW9uZSgweEYwQ0UpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdlbCIsCW9uZSgweEYwREMpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdsbCIsCW9uZSgweEYwRDkpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZibmdsZWwiLAlvbmUoMHhGMEQ4KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5ndGwiLAlvbmUoMHhGMEREKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5sZWwiLAlvbmUoMHhGMERBKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm5sdGwiLAlvbmUoMHhGMERCKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9nZWwiLAlvbmUoMHhGMEMzKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9nbGwiLAlvbmUoMHhGMEM2KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9ndGwiLAlvbmUoMHhGMEMyKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9sZWwiLAlvbmUoMHhGMEM1KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9sdGwiLAlvbmUoMHhGMEM0KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYm9ybCIsCW9uZSgweEYwQzcpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZic2VxbCIsCW9uZSgweEYwRDEpLAkJb25lKDB4RjFGRiksICJJZEJDIiwgbWZsb2F0IH0sCi17ImZic2ZsIiwJb25lKDB4RjBEMCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzbmVsIiwJb25lKDB4RjBERSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJzdGwiLAlvbmUoMHhGMERGKSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAoteyJmYnRsIiwJb25lKDB4RjBDRiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1ZXFsIiwJb25lKDB4RjBDOSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1Z2VsIiwJb25lKDB4RjBDQiksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1Z3RsIiwJb25lKDB4RjBDQSksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bGVsIiwJb25lKDB4RjBDRCksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bHRsIiwJb25lKDB4RjBDQyksCQlvbmUoMHhGMUZGKSwgIklkQkMiLCBtZmxvYXQgfSwKLXsiZmJ1bmwiLAlvbmUoMHhGMEM4KSwJCW9uZSgweEYxRkYpLCAiSWRCQyIsIG1mbG9hdCB9LAotCi17ImZqZXEiLAlvbmUoMHhGMDgxKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamYiLAkJb25lKDB4RjA4MCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpnZSIsCW9uZSgweEYwOTMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ2wiLAlvbmUoMHhGMDk2KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamdsZSIsCW9uZSgweEYwOTcpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqZ3QiLAlvbmUoMHhGMDkyKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmamxlIiwJb25lKDB4RjA5NSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpsdCIsCW9uZSgweEYwOTQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmUiLAlvbmUoMHhGMDhFKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5nZSIsCW9uZSgweEYwOUMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmdsIiwJb25lKDB4RjA5OSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ2xlIiwJb25lKDB4RjA5OCksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpuZ3QiLAlvbmUoMHhGMDlEKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam5sZSIsCW9uZSgweEYwOUEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqbmx0IiwJb25lKDB4RjA5QiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvZ2UiLAlvbmUoMHhGMDgzKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9nbCIsCW9uZSgweEYwODYpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb2d0IiwJb25lKDB4RjA4MiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmpvbGUiLAlvbmUoMHhGMDg1KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmam9sdCIsCW9uZSgweEYwODQpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqb3IiLAlvbmUoMHhGMDg3KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanNlcSIsCW9uZSgweEYwOTEpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc2YiLAlvbmUoMHhGMDkwKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanNuZSIsCW9uZSgweEYwOUUpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqc3QiLAlvbmUoMHhGMDlGKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanQiLAkJb25lKDB4RjA4RiksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1ZXEiLAlvbmUoMHhGMDg5KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVnZSIsCW9uZSgweEYwOEIpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdWd0IiwJb25lKDB4RjA4QSksCQlvbmUoMHhGMUJGKSwgIklkQmMiLCBtZmxvYXQgfSwKLXsiZmp1bGUiLAlvbmUoMHhGMDhEKSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAoteyJmanVsdCIsCW9uZSgweEYwOEMpLAkJb25lKDB4RjFCRiksICJJZEJjIiwgbWZsb2F0IH0sCi17ImZqdW4iLAlvbmUoMHhGMDg4KSwJCW9uZSgweEYxQkYpLCAiSWRCYyIsIG1mbG9hdCB9LAotCi17ImZjbXBiIiwJdHdvKDB4RjAwMCwgMHg1ODM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmY21wZCIsCXR3bygweEYwMDAsIDB4NTQzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmNtcGwiLAl0d28oMHhGMDAwLCAweDQwMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZjbXBwIiwJdHdvKDB4RjAwMCwgMHg0QzM4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmY21wcyIsCXR3bygweEYwMDAsIDB4NDQzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmNtcHciLAl0d28oMHhGMDAwLCAweDUwMzgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZjbXB4IiwJdHdvKDB4RjAwMCwgMHgwMDM4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmY21weCIsCXR3bygweEYwMDAsIDB4NDgzOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmY29zYiIsCXR3bygweEYwMDAsIDB4NTgxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmNvc2QiLAl0d28oMHhGMDAwLCAweDU0MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZjb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmY29zcCIsCXR3bygweEYwMDAsIDB4NEMxRCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmNvc3MiLAl0d28oMHhGMDAwLCAweDQ0MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZjb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDFEKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmY29zeCIsCXR3bygweEYwMDAsIDB4MDAxRCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmNvc3giLAl0d28oMHhGMDAwLCAweDQ4MUQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZjb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDFEKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZjb3NoYiIsCXR3bygweEYwMDAsIDB4NTgxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hkIiwJdHdvKDB4RjAwMCwgMHg1NDE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmY29zaGwiLAl0d28oMHhGMDAwLCAweDQwMTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZjb3NocCIsCXR3bygweEYwMDAsIDB4NEMxOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmNvc2hzIiwJdHdvKDB4RjAwMCwgMHg0NDE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmY29zaHciLAl0d28oMHhGMDAwLCAweDUwMTkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZjb3NoeCIsCXR3bygweEYwMDAsIDB4MDAxOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmNvc2h4IiwJdHdvKDB4RjAwMCwgMHg0ODE5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmY29zaHgiLAl0d28oMHhGMDAwLCAweDAwMTkpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmRiZXEiLAl0d28oMHhGMDQ4LCAweDAwMDEpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmYiLAl0d28oMHhGMDQ4LCAweDAwMDApLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmdlIiwJdHdvKDB4RjA0OCwgMHgwMDEzKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJnbCIsCXR3bygweEYwNDgsIDB4MDAxNiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRiZ2xlIiwJdHdvKDB4RjA0OCwgMHgwMDE3KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJndCIsCXR3bygweEYwNDgsIDB4MDAxMiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibGUiLAl0d28oMHhGMDQ4LCAweDAwMTUpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYmx0IiwJdHdvKDB4RjA0OCwgMHgwMDE0KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZSIsCXR3bygweEYwNDgsIDB4MDAwRSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmdlIiwJdHdvKDB4RjA0OCwgMHgwMDFDKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJuZ2wiLAl0d28oMHhGMDQ4LCAweDAwMTkpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5nbGUiLAl0d28oMHhGMDQ4LCAweDAwMTgpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm5ndCIsCXR3bygweEYwNDgsIDB4MDAxRCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRibmxlIiwJdHdvKDB4RjA0OCwgMHgwMDFBKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJubHQiLAl0d28oMHhGMDQ4LCAweDAwMUIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9nZSIsCXR3bygweEYwNDgsIDB4MDAwMyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2dsIiwJdHdvKDB4RjA0OCwgMHgwMDA2KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvZ3QiLAl0d28oMHhGMDQ4LCAweDAwMDIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYm9sZSIsCXR3bygweEYwNDgsIDB4MDAwNSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRib2x0IiwJdHdvKDB4RjA0OCwgMHgwMDA0KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJvciIsCXR3bygweEYwNDgsIDB4MDAwNyksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRic2VxIiwJdHdvKDB4RjA0OCwgMHgwMDExKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzZiIsCXR3bygweEYwNDgsIDB4MDAxMCksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRic25lIiwJdHdvKDB4RjA0OCwgMHgwMDFFKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJzdCIsCXR3bygweEYwNDgsIDB4MDAxRiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidCIsCXR3bygweEYwNDgsIDB4MDAwRiksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWVxIiwJdHdvKDB4RjA0OCwgMHgwMDA5KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1Z2UiLAl0d28oMHhGMDQ4LCAweDAwMEIpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVndCIsCXR3bygweEYwNDgsIDB4MDAwQSksIHR3bygweEYxRjgsIDB4RkZGRiksICJJaURzQnciLCBtZmxvYXQgfSwKLXsiZmRidWxlIiwJdHdvKDB4RjA0OCwgMHgwMDBEKSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAoteyJmZGJ1bHQiLAl0d28oMHhGMDQ4LCAweDAwMEMpLCB0d28oMHhGMUY4LCAweEZGRkYpLCAiSWlEc0J3IiwgbWZsb2F0IH0sCi17ImZkYnVuIiwJdHdvKDB4RjA0OCwgMHgwMDA4KSwgdHdvKDB4RjFGOCwgMHhGRkZGKSwgIklpRHNCdyIsIG1mbG9hdCB9LAotCi17ImZkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmRpdmwiLAl0d28oMHhGMDAwLCAweDQwMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzIwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZGl2cyIsCXR3bygweEYwMDAsIDB4NDQyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmRpdnciLAl0d28oMHhGMDAwLCAweDUwMjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDIwKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZGl2eCIsCXR3bygweEYwMDAsIDB4NDgyMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQoteyJmc2RpdmIiLAl0d28oMHhGMDAwLCAweDU4NjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZkIiwJdHdvKDB4RjAwMCwgMHg1NDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2bCIsCXR3bygweEYwMDAsIDB4NDA2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdnAiLAl0d28oMHhGMDAwLCAweDRDNjApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZzIiwJdHdvKDB4RjAwMCwgMHg0NDYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZzZGl2dyIsCXR3bygweEYwMDAsIDB4NTA2MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtNjgwNDB1cCB9LAoteyJmc2RpdngiLAl0d28oMHhGMDAwLCAweDAwNjApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNkaXZ4IiwJdHdvKDB4RjAwMCwgMHg0ODYwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQ2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdmwiLAl0d28oMHhGMDAwLCAweDQwNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzY0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2cyIsCXR3bygweEYwMDAsIDB4NDQ2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZGRpdnciLAl0d28oMHhGMDAwLCAweDUwNjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDY0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkZGl2eCIsCXR3bygweEYwMDAsIDB4NDg2NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZldG94YiIsCXR3bygweEYwMDAsIDB4NTgxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveGwiLAl0d28oMHhGMDAwLCAweDQwMTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZldG94cCIsCXR3bygweEYwMDAsIDB4NEMxMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmV0b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveHciLAl0d28oMHhGMDAwLCAweDUwMTApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZldG94eCIsCXR3bygweEYwMDAsIDB4MDAxMCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmV0b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODEwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZXRveHgiLAl0d28oMHhGMDAwLCAweDAwMTApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmV0b3htMWIiLAl0d28oMHhGMDAwLCAweDU4MDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFkIiwJdHdvKDB4RjAwMCwgMHg1NDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xbCIsCXR3bygweEYwMDAsIDB4NDAwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXAiLAl0d28oMHhGMDAwLCAweDRDMDgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTFzIiwJdHdvKDB4RjAwMCwgMHg0NDA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xdyIsCXR3bygweEYwMDAsIDB4NTAwOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmV0b3htMXgiLAl0d28oMHhGMDAwLCAweDAwMDgpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZldG94bTF4IiwJdHdvKDB4RjAwMCwgMHg0ODA4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmZXRveG0xeCIsCXR3bygweEYwMDAsIDB4MDAwOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmZ2V0ZXhwYiIsCXR3bygweEYwMDAsIDB4NTgxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cGQiLAl0d28oMHhGMDAwLCAweDU0MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHBsIiwJdHdvKDB4RjAwMCwgMHg0MDFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhwcCIsCXR3bygweEYwMDAsIDB4NEMxRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHMiLAl0d28oMHhGMDAwLCAweDQ0MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB3IiwJdHdvKDB4RjAwMCwgMHg1MDFFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmZ2V0ZXhweCIsCXR3bygweEYwMDAsIDB4MDAxRSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZmdldGV4cHgiLAl0d28oMHhGMDAwLCAweDQ4MUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZnZXRleHB4IiwJdHdvKDB4RjAwMCwgMHgwMDFFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZnZXRtYW5iIiwJdHdvKDB4RjAwMCwgMHg1ODFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFuZCIsCXR3bygweEYwMDAsIDB4NTQxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbmwiLAl0d28oMHhGMDAwLCAweDQwMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW5wIiwJdHdvKDB4RjAwMCwgMHg0QzFGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFucyIsCXR3bygweEYwMDAsIDB4NDQxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbnciLAl0d28oMHhGMDAwLCAweDUwMUYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZnZXRtYW54IiwJdHdvKDB4RjAwMCwgMHgwMDFGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmZ2V0bWFueCIsCXR3bygweEYwMDAsIDB4NDgxRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmdldG1hbngiLAl0d28oMHhGMDAwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmludGIiLAl0d28oMHhGMDAwLCAweDU4MDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZpbnRkIiwJdHdvKDB4RjAwMCwgMHg1NDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmaW50bCIsCXR3bygweEYwMDAsIDB4NDAwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmludHAiLAl0d28oMHhGMDAwLCAweDRDMDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZpbnRzIiwJdHdvKDB4RjAwMCwgMHg0NDAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmaW50dyIsCXR3bygweEYwMDAsIDB4NTAwMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmludHgiLAl0d28oMHhGMDAwLCAweDAwMDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZpbnR4IiwJdHdvKDB4RjAwMCwgMHg0ODAxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmaW50eCIsCXR3bygweEYwMDAsIDB4MDAwMSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmaW50cnpiIiwJdHdvKDB4RjAwMCwgMHg1ODAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpkIiwJdHdvKDB4RjAwMCwgMHg1NDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpsIiwJdHdvKDB4RjAwMCwgMHg0MDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpwIiwJdHdvKDB4RjAwMCwgMHg0QzAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmaW50cnpzIiwJdHdvKDB4RjAwMCwgMHg0NDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp3IiwJdHdvKDB4RjAwMCwgMHg1MDAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHgwMDAzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHg0ODAzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmaW50cnp4IiwJdHdvKDB4RjAwMCwgMHgwMDAzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2cxMGIiLAl0d28oMHhGMDAwLCAweDU4MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMGQiLAl0d28oMHhGMDAwLCAweDU0MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMGwiLAl0d28oMHhGMDAwLCAweDQwMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHAiLAl0d28oMHhGMDAwLCAweDRDMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHMiLAl0d28oMHhGMDAwLCAweDQ0MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHciLAl0d28oMHhGMDAwLCAweDUwMTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDQ4MTUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZsb2cxMHgiLAl0d28oMHhGMDAwLCAweDAwMTUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZmxvZzJiIiwJdHdvKDB4RjAwMCwgMHg1ODE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbG9nMmQiLAl0d28oMHhGMDAwLCAweDU0MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZsb2cybCIsCXR3bygweEYwMDAsIDB4NDAxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZmxvZzJwIiwJdHdvKDB4RjAwMCwgMHg0QzE2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbG9nMnMiLAl0d28oMHhGMDAwLCAweDQ0MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZsb2cydyIsCXR3bygweEYwMDAsIDB4NTAxNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZmxvZzJ4IiwJdHdvKDB4RjAwMCwgMHgwMDE2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbG9nMngiLAl0d28oMHhGMDAwLCAweDQ4MTYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZsb2cyeCIsCXR3bygweEYwMDAsIDB4MDAxNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmbG9nbmIiLAl0d28oMHhGMDAwLCAweDU4MTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZsb2duZCIsCXR3bygweEYwMDAsIDB4NTQxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25sIiwJdHdvKDB4RjAwMCwgMHg0MDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAiLAl0d28oMHhGMDAwLCAweDRDMTQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducyIsCXR3bygweEYwMDAsIDB4NDQxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZ253IiwJdHdvKDB4RjAwMCwgMHg1MDE0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbG9nbngiLAl0d28oMHhGMDAwLCAweDAwMTQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZsb2dueCIsCXR3bygweEYwMDAsIDB4NDgxNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ254IiwJdHdvKDB4RjAwMCwgMHgwMDE0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZsb2ducDFiIiwJdHdvKDB4RjAwMCwgMHg1ODA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxZCIsCXR3bygweEYwMDAsIDB4NTQwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMWwiLAl0d28oMHhGMDAwLCAweDQwMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZsb2ducDFwIiwJdHdvKDB4RjAwMCwgMHg0QzA2KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxcyIsCXR3bygweEYwMDAsIDB4NDQwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXciLAl0d28oMHhGMDAwLCAweDUwMDYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZsb2ducDF4IiwJdHdvKDB4RjAwMCwgMHgwMDA2KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmbG9nbnAxeCIsCXR3bygweEYwMDAsIDB4NDgwNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZmxvZ25wMXgiLAl0d28oMHhGMDAwLCAweDAwMDYpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZm1vZGIiLAl0d28oMHhGMDAwLCAweDU4MjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZtb2RkIiwJdHdvKDB4RjAwMCwgMHg1NDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmbW9kbCIsCXR3bygweEYwMDAsIDB4NDAyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZm1vZHAiLAl0d28oMHhGMDAwLCAweDRDMjEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZtb2RzIiwJdHdvKDB4RjAwMCwgMHg0NDIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmbW9kdyIsCXR3bygweEYwMDAsIDB4NTAyMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZm1vZHgiLAl0d28oMHhGMDAwLCAweDAwMjEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZtb2R4IiwJdHdvKDB4RjAwMCwgMHg0ODIxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTgwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm1vdmViIiwJdHdvKDB4RjAwMCwgMHg3ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpRjckYiIsIG1mbG9hdCB9LAoteyJmbW92ZWQiLAl0d28oMHhGMDAwLCAweDU0MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlZCIsCXR3bygweEYwMDAsIDB4NzQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3fkYiLCBtZmxvYXQgfSwKLXsiZm1vdmVsIiwJdHdvKDB4RjAwMCwgMHg0MDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDYwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyRsIiwgbWZsb2F0IH0sCi0vKiBGSVhNRTogdGhlIG5leHQgdHdvIHZhcmlhbnRzIHNob3VsZCBub3QgcGVybWl0IG1vdmluZyBhbiBhZGRyZXNzCi0gICByZWdpc3RlciB0byBhbnl0aGluZyBidXQgdGhlIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9uIHJlZ2lzdGVyLiAgKi8KLXsiZm1vdmVsIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoteyJmbW92ZWwiLAl0d28oMHhGMDAwLCAweDgwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWkqbHM4IiwgbWZsb2F0IH0sCi17ImZtb3ZlcCIsCXR3bygweEYwMDAsIDB4NEMwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm1vdmVwIiwJdHdvKDB4RjAwMCwgMHg2QzAwKSwgdHdvKDB4RjFDMCwgMHhGQzAwKSwgIklpRjd+cGtDIiwgbWZsb2F0IH0sCi17ImZtb3ZlcCIsCXR3bygweEYwMDAsIDB4N0MwMCksIHR3bygweEYxQzAsIDB4RkMwRiksICJJaUY3fnBEayIsIG1mbG9hdCB9LAoteyJmbW92ZXMiLAl0d28oMHhGMDAwLCAweDQ0MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZtb3ZlcyIsCXR3bygweEYwMDAsIDB4NjQwMCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaUY3JGYiLCBtZmxvYXQgfSwKLXsiZm1vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXciLAl0d28oMHhGMDAwLCAweDcwMDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGNyR3IiwgbWZsb2F0IH0sCi17ImZtb3ZleCIsCXR3bygweEYwMDAsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm1vdmV4IiwJdHdvKDB4RjAwMCwgMHg0ODAwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmbW92ZXgiLAl0d28oMHhGMDAwLCAweDY4MDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWlGN354IiwgbWZsb2F0IH0sCi0KLXsiZnNtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTg0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVkIiwJdHdvKDB4RjAwMCwgMHg1NDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwNDApLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQ0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzbW92ZXgiLAl0d28oMHhGMDAwLCAweDAwNDApLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtb3ZleCIsCXR3bygweEYwMDAsIDB4NDg0MCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc21vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzQwKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi0KLXsiZmRtb3ZlYiIsCXR3bygweEYwMDAsIDB4NTg0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVkIiwJdHdvKDB4RjAwMCwgMHg1NDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZWwiLAl0d28oMHhGMDAwLCAweDQwNDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZlcyIsCXR3bygweEYwMDAsIDB4NDQ0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmV3IiwJdHdvKDB4RjAwMCwgMHg1MDQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkbW92ZXgiLAl0d28oMHhGMDAwLCAweDAwNDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtb3ZleCIsCXR3bygweEYwMDAsIDB4NDg0NCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZG1vdmVwIiwJdHdvKDB4RjAwMCwgMHg0QzQ0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi0KLXsiZm1vdmVjcngiLAl0d28oMHhGMDAwLCAweDVDMDApLCB0d28oMHhGMUZGLCAweEZDMDApLCAiSWkjQ0Y3IiwgbWZsb2F0IH0sCi0KLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaURrJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaURrLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDgwMCksIHR3bygweEYxQzAsIDB4RkY4RiksICJJaSZzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaStzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZGwzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCMzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzIzMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZEwzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCMzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVteCIsCXR3bygweEYwMTgsIDB4RDAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZCtzIzMiLCBtZmxvYXQgfSwKLQoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpczglcyIsIG1mbG9hdCB9LAoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHhBMDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpTDh+cyIsIG1mbG9hdCB9LAotLyogRklYTUU6IEluIHRoZSBuZXh0IGluc3RydWN0aW9uLCB3ZSBzaG91bGQgb25seSBwZXJtaXQgJWRuIGlmIHRoZQotICAgdGFyZ2V0IGlzIGEgc2luZ2xlIHJlZ2lzdGVyLiAgV2Ugc2hvdWxkIG9ubHkgcGVybWl0ICVhbiBpZiB0aGUKLSAgIHRhcmdldCBpcyBhIHNpbmdsZSAlZnBpYXIuICAqLwoteyJmbW92ZW1sIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpKmxMOCIsIG1mbG9hdCB9LAotCi17ImZtb3ZlbSIsCXR3bygweEYwMjAsIDB4RTAwMCksIHR3bygweEYxRjgsIDB4RkYwMCksICJJZEwzLXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkbDMmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDE4LCAweEQwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQrc2wzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RDAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCZzbDMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAyMCwgMHhFMDAwKSwgdHdvKDB4RjFGOCwgMHhGRjAwKSwgIklkIzMtcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDIwLCAweEU4MDApLCB0d28oMHhGMUY4LCAweEZGOEYpLCAiSWlEay1zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4RjAwMCksIHR3bygweEYxQzAsIDB4RkYwMCksICJJZCMzJnMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhGODAwKSwgdHdvKDB4RjFDMCwgMHhGRjhGKSwgIklpRGsmcyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDE4LCAweEQwMDApLCB0d28oMHhGMUY4LCAweEZGMDApLCAiSWQrcyMzIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMTgsIDB4RDgwMCksIHR3bygweEYxRjgsIDB4RkY4RiksICJJaStzRGsiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHhEMDAwKSwgdHdvKDB4RjFDMCwgMHhGRjAwKSwgIklkJnMjMyIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEQ4MDApLCB0d28oMHhGMUMwLCAweEZGOEYpLCAiSWkmc0RrIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4QTAwMCksIHR3bygweEYxQzAsIDB4RTNGRiksICJJaXM4JXMiLCBtZmxvYXQgfSwKLXsiZm1vdmVtIiwJdHdvKDB4RjAwMCwgMHg4MDAwKSwgdHdvKDB4RjFDMCwgMHhFM0ZGKSwgIklpKnNzOCIsIG1mbG9hdCB9LAoteyJmbW92ZW0iLAl0d28oMHhGMDAwLCAweEEwMDApLCB0d28oMHhGMUMwLCAweEUzRkYpLCAiSWlMOH5zIiwgbWZsb2F0IH0sCi17ImZtb3ZlbSIsCXR3bygweEYwMDAsIDB4ODAwMCksIHR3bygweEYyQzAsIDB4RTNGRiksICJJaSpzTDgiLCBtZmxvYXQgfSwKLQoteyJmbXVsYiIsCXR3bygweEYwMDAsIDB4NTgyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm11bGQiLAl0d28oMHhGMDAwLCAweDU0MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbXVscCIsCXR3bygweEYwMDAsIDB4NEMyMyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm11bHMiLAl0d28oMHhGMDAwLCAweDQ0MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDIzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbXVseCIsCXR3bygweEYwMDAsIDB4MDAyMyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm11bHgiLAl0d28oMHhGMDAwLCAweDQ4MjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi0KLXsiZnNtdWxiIiwJdHdvKDB4RjAwMCwgMHg1ODYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVsZCIsCXR3bygweEYwMDAsIDB4NTQ2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc211bGwiLAl0d28oMHhGMDAwLCAweDQwNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWxwIiwJdHdvKDB4RjAwMCwgMHg0QzYzKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVscyIsCXR3bygweEYwMDAsIDB4NDQ2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc211bHciLAl0d28oMHhGMDAwLCAweDUwNjMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZnNtdWx4IiwJdHdvKDB4RjAwMCwgMHgwMDYzKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZzbXVseCIsCXR3bygweEYwMDAsIDB4NDg2MyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAotCi17ImZkbXVsYiIsCXR3bygweEYwMDAsIDB4NTg2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bGQiLAl0d28oMHhGMDAwLCAweDU0NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWxsIiwJdHdvKDB4RjAwMCwgMHg0MDY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVscCIsCXR3bygweEYwMDAsIDB4NEM2NyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHMiLAl0d28oMHhGMDAwLCAweDQ0NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZmRtdWx3IiwJdHdvKDB4RjAwMCwgMHg1MDY3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZkbXVseCIsCXR3bygweEYwMDAsIDB4MDA2NyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZG11bHgiLAl0d28oMHhGMDAwLCAweDQ4NjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLQoteyJmbmVnYiIsCXR3bygweEYwMDAsIDB4NTgxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZm5lZ2QiLAl0d28oMHhGMDAwLCAweDU0MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZuZWdsIiwJdHdvKDB4RjAwMCwgMHg0MDFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmbmVncCIsCXR3bygweEYwMDAsIDB4NEMxQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZm5lZ3MiLAl0d28oMHhGMDAwLCAweDQ0MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZuZWd3IiwJdHdvKDB4RjAwMCwgMHg1MDFBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmbmVneCIsCXR3bygweEYwMDAsIDB4MDAxQSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZm5lZ3giLAl0d28oMHhGMDAwLCAweDQ4MUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDFBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzbmVnYiIsCXR3bygweEYwMDAsIDB4NTg1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ2QiLAl0d28oMHhGMDAwLCAweDU0NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWdsIiwJdHdvKDB4RjAwMCwgMHg0MDVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVncCIsCXR3bygweEYwMDAsIDB4NEM1QSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3MiLAl0d28oMHhGMDAwLCAweDQ0NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd3IiwJdHdvKDB4RjAwMCwgMHg1MDVBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzbmVneCIsCXR3bygweEYwMDAsIDB4MDA1QSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc25lZ3giLAl0d28oMHhGMDAwLCAweDQ4NUEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRuZWdiIiwJdHdvKDB4RjAwMCwgMHg1ODVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVnZCIsCXR3bygweEYwMDAsIDB4NTQ1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ2wiLAl0d28oMHhGMDAwLCAweDQwNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWdwIiwJdHdvKDB4RjAwMCwgMHg0QzVFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVncyIsCXR3bygweEYwMDAsIDB4NDQ1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3ciLAl0d28oMHhGMDAwLCAweDUwNUUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRuZWd4IiwJdHdvKDB4RjAwMCwgMHgwMDVFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkbmVneCIsCXR3bygweEYwMDAsIDB4NDg1RSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZG5lZ3giLAl0d28oMHhGMDAwLCAweDAwNUUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmbm9wIiwJdHdvKDB4RjI4MCwgMHgwMDAwKSwgdHdvKDB4RkZGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi0KLXsiZnJlbWIiLAl0d28oMHhGMDAwLCAweDU4MjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZyZW1kIiwJdHdvKDB4RjAwMCwgMHg1NDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmcmVtbCIsCXR3bygweEYwMDAsIDB4NDAyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnJlbXAiLAl0d28oMHhGMDAwLCAweDRDMjUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZyZW1zIiwJdHdvKDB4RjAwMCwgMHg0NDI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmcmVtdyIsCXR3bygweEYwMDAsIDB4NTAyNSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnJlbXgiLAl0d28oMHhGMDAwLCAweDAwMjUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZyZW14IiwJdHdvKDB4RjAwMCwgMHg0ODI1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAotCi17ImZyZXN0b3JlIiwJb25lKDB4RjE0MCksCQlvbmUoMHhGMUMwKSwgIklkPHMiLCBtZmxvYXQgfSwKLQoteyJmc2F2ZSIsCW9uZSgweEYxMDApLAkJb25lKDB4RjFDMCksICJJZD5zIiwgbWZsb2F0IH0sCi0KLXsiZnNjYWxlYiIsCXR3bygweEYwMDAsIDB4NTgyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlZCIsCXR3bygweEYwMDAsIDB4NTQyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlbCIsCXR3bygweEYwMDAsIDB4NDAyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlcCIsCXR3bygweEYwMDAsIDB4NEMyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxlcyIsCXR3bygweEYwMDAsIDB4NDQyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNjYWxldyIsCXR3bygweEYwMDAsIDB4NTAyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNjYWxleCIsCXR3bygweEYwMDAsIDB4MDAyNiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNjYWxleCIsCXR3bygweEYwMDAsIDB4NDgyNiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLQotLyogJCBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgYXNzZW1ibGVyIGZyb20gdXNpbmcgUEMtcmVsYXRpdmUuCi0gICBJZiBAIHdlcmUgdXNlZCwgImxhYmVsOiBmc2VxIGxhYmVsIiBjb3VsZCBwcm9kdWNlICJmdHJhcGVxIiwKLSAgIGJlY2F1c2UgImxhYmVsIiBiZWNhbWUgInBjQGxhYmVsIi4gICovCi17ImZzZXEiLAl0d28oMHhGMDQwLCAweDAwMDEpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2YiLAkJdHdvKDB4RjA0MCwgMHgwMDAwKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNnZSIsCXR3bygweEYwNDAsIDB4MDAxMyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ2wiLAl0d28oMHhGMDQwLCAweDAwMTYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2dsZSIsCXR3bygweEYwNDAsIDB4MDAxNyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzZ3QiLAl0d28oMHhGMDQwLCAweDAwMTIpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE1KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNsdCIsCXR3bygweEYwNDAsIDB4MDAxNCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmUiLAl0d28oMHhGMDQwLCAweDAwMEUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25nZSIsCXR3bygweEYwNDAsIDB4MDAxQyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmdsIiwJdHdvKDB4RjA0MCwgMHgwMDE5KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ2xlIiwJdHdvKDB4RjA0MCwgMHgwMDE4KSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNuZ3QiLAl0d28oMHhGMDQwLCAweDAwMUQpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc25sZSIsCXR3bygweEYwNDAsIDB4MDAxQSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzbmx0IiwJdHdvKDB4RjA0MCwgMHgwMDFCKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvZ2UiLAl0d28oMHhGMDQwLCAweDAwMDMpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29nbCIsCXR3bygweEYwNDAsIDB4MDAwNiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb2d0IiwJdHdvKDB4RjA0MCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnNvbGUiLAl0d28oMHhGMDQwLCAweDAwMDUpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc29sdCIsCXR3bygweEYwNDAsIDB4MDAwNCksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzb3IiLAl0d28oMHhGMDQwLCAweDAwMDcpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3NlcSIsCXR3bygweEYwNDAsIDB4MDAxMSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc2YiLAl0d28oMHhGMDQwLCAweDAwMTApLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3NuZSIsCXR3bygweEYwNDAsIDB4MDAxRSksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzc3QiLAl0d28oMHhGMDQwLCAweDAwMUYpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3QiLAkJdHdvKDB4RjA0MCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1ZXEiLAl0d28oMHhGMDQwLCAweDAwMDkpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VnZSIsCXR3bygweEYwNDAsIDB4MDAwQiksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdWd0IiwJdHdvKDB4RjA0MCwgMHgwMDBBKSwgdHdvKDB4RjFDMCwgMHhGRkZGKSwgIklpJHMiLCBtZmxvYXQgfSwKLXsiZnN1bGUiLAl0d28oMHhGMDQwLCAweDAwMEQpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAoteyJmc3VsdCIsCXR3bygweEYwNDAsIDB4MDAwQyksIHR3bygweEYxQzAsIDB4RkZGRiksICJJaSRzIiwgbWZsb2F0IH0sCi17ImZzdW4iLAl0d28oMHhGMDQwLCAweDAwMDgpLCB0d28oMHhGMUMwLCAweEZGRkYpLCAiSWkkcyIsIG1mbG9hdCB9LAotCi17ImZzZ2xkaXZiIiwJdHdvKDB4RjAwMCwgMHg1ODI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2ZCIsCXR3bygweEYwMDAsIDB4NTQyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdmwiLAl0d28oMHhGMDAwLCAweDQwMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZwIiwJdHdvKDB4RjAwMCwgMHg0QzI0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2cyIsCXR3bygweEYwMDAsIDB4NDQyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdnciLAl0d28oMHhGMDAwLCAweDUwMjQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZzZ2xkaXZ4IiwJdHdvKDB4RjAwMCwgMHgwMDI0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2dsZGl2eCIsCXR3bygweEYwMDAsIDB4NDgyNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNnbGRpdngiLAl0d28oMHhGMDAwLCAweDAwMjQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnNnbG11bGIiLAl0d28oMHhGMDAwLCAweDU4MjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxkIiwJdHdvKDB4RjAwMCwgMHg1NDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVsbCIsCXR3bygweEYwMDAsIDB4NDAyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHAiLAl0d28oMHhGMDAwLCAweDRDMjcpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWxzIiwJdHdvKDB4RjAwMCwgMHg0NDI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVsdyIsCXR3bygweEYwMDAsIDB4NTAyNyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNnbG11bHgiLAl0d28oMHhGMDAwLCAweDAwMjcpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzZ2xtdWx4IiwJdHdvKDB4RjAwMCwgMHg0ODI3KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmc2dsbXVseCIsCXR3bygweEYwMDAsIDB4MDAyNyksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc2luYiIsCXR3bygweEYwMDAsIDB4NTgwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnNpbmQiLAl0d28oMHhGMDAwLCAweDU0MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzaW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc2lucCIsCXR3bygweEYwMDAsIDB4NEMwRSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnNpbnMiLAl0d28oMHhGMDAwLCAweDQ0MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzaW53IiwJdHdvKDB4RjAwMCwgMHg1MDBFKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc2lueCIsCXR3bygweEYwMDAsIDB4MDAwRSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnNpbngiLAl0d28oMHhGMDAwLCAweDQ4MEUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzaW54IiwJdHdvKDB4RjAwMCwgMHgwMDBFKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzaW5jb3NiIiwJdHdvKDB4RjAwMCwgMHg1ODMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2JGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NkIiwJdHdvKDB4RjAwMCwgMHg1NDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO0ZGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NsIiwJdHdvKDB4RjAwMCwgMHg0MDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2xGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NwIiwJdHdvKDB4RjAwMCwgMHg0QzMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3BGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3NzIiwJdHdvKDB4RjAwMCwgMHg0NDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO2ZGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N3IiwJdHdvKDB4RjAwMCwgMHg1MDMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3dGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N4IiwJdHdvKDB4RjAwMCwgMHgwMDMwKSwgdHdvKDB4RjFDMCwgMHhFMDc4KSwgIklpRjhGM0Y3IiwgbWZsb2F0IH0sCi17ImZzaW5jb3N4IiwJdHdvKDB4RjAwMCwgMHg0ODMwKSwgdHdvKDB4RjFDMCwgMHhGQzc4KSwgIklpO3hGM0Y3IiwgbWZsb2F0IH0sCi0KLXsiZnNpbmhiIiwJdHdvKDB4RjAwMCwgMHg1ODAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmc2luaGQiLAl0d28oMHhGMDAwLCAweDU0MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzaW5obCIsCXR3bygweEYwMDAsIDB4NDAwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnNpbmhwIiwJdHdvKDB4RjAwMCwgMHg0QzAyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmc2luaHMiLAl0d28oMHhGMDAwLCAweDQ0MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzaW5odyIsCXR3bygweEYwMDAsIDB4NTAwMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnNpbmh4IiwJdHdvKDB4RjAwMCwgMHgwMDAyKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmc2luaHgiLAl0d28oMHhGMDAwLCAweDQ4MDIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzaW5oeCIsCXR3bygweEYwMDAsIDB4MDAwMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmc3FydGIiLAl0d28oMHhGMDAwLCAweDU4MDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0ZCIsCXR3bygweEYwMDAsIDB4NTQwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnNxcnRsIiwJdHdvKDB4RjAwMCwgMHg0MDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc3FydHAiLAl0d28oMHhGMDAwLCAweDRDMDQpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0cyIsCXR3bygweEYwMDAsIDB4NDQwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnNxcnR3IiwJdHdvKDB4RjAwMCwgMHg1MDA0KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc3FydHgiLAl0d28oMHhGMDAwLCAweDAwMDQpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZzcXJ0eCIsCXR3bygweEYwMDAsIDB4NDgwNCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnNxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDA0KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzc3FydGIiLAl0d28oMHhGMDAwLCAweDU4NDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0ZCIsCXR3bygweEYwMDAsIDB4NTQ0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnRsIiwJdHdvKDB4RjAwMCwgMHg0MDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHAiLAl0d28oMHhGMDAwLCAweDRDNDEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0cyIsCXR3bygweEYwMDAsIDB4NDQ0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR3IiwJdHdvKDB4RjAwMCwgMHg1MDQxKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzcXJ0eCIsCXR3bygweEYwMDAsIDB4NDg0MSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmc3NxcnR4IiwJdHdvKDB4RjAwMCwgMHgwMDQxKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRzcXJ0YiIsCXR3bygweEYwMDAsIDB4NTg0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRkIiwJdHdvKDB4RjAwMCwgMHg1NDQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydGwiLAl0d28oMHhGMDAwLCAweDQwNDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0cCIsCXR3bygweEYwMDAsIDB4NEM0NSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnRzIiwJdHdvKDB4RjAwMCwgMHg0NDQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHciLAl0d28oMHhGMDAwLCAweDUwNDUpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRzcXJ0eCIsCXR3bygweEYwMDAsIDB4MDA0NSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmZHNxcnR4IiwJdHdvKDB4RjAwMCwgMHg0ODQ1KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG02ODA0MHVwIH0sCi17ImZkc3FydHgiLAl0d28oMHhGMDAwLCAweDAwNDUpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmc3ViYiIsCXR3bygweEYwMDAsIDB4NTgyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnN1YmQiLAl0d28oMHhGMDAwLCAweDU0MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZzdWJsIiwJdHdvKDB4RjAwMCwgMHg0MDI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmc3VicCIsCXR3bygweEYwMDAsIDB4NEMyOCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnN1YnMiLAl0d28oMHhGMDAwLCAweDQ0MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZzdWJ3IiwJdHdvKDB4RjAwMCwgMHg1MDI4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmc3VieCIsCXR3bygweEYwMDAsIDB4MDAyOCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnN1YngiLAl0d28oMHhGMDAwLCAweDQ4MjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDI4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZzc3ViYiIsCXR3bygweEYwMDAsIDB4NTg2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YmQiLAl0d28oMHhGMDAwLCAweDU0NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJsIiwJdHdvKDB4RjAwMCwgMHg0MDY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VicCIsCXR3bygweEYwMDAsIDB4NEM2OCksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YnMiLAl0d28oMHhGMDAwLCAweDQ0NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ3IiwJdHdvKDB4RjAwMCwgMHg1MDY4KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG02ODA0MHVwIH0sCi17ImZzc3VieCIsCXR3bygweEYwMDAsIDB4MDA2OCksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtNjgwNDB1cCB9LAoteyJmc3N1YngiLAl0d28oMHhGMDAwLCAweDQ4NjgpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbTY4MDQwdXAgfSwKLXsiZnNzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDY4KSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG02ODA0MHVwIH0sCi0KLXsiZmRzdWJiIiwJdHdvKDB4RjAwMCwgMHg1ODZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG02ODA0MHVwIH0sCi17ImZkc3ViZCIsCXR3bygweEYwMDAsIDB4NTQ2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YmwiLAl0d28oMHhGMDAwLCAweDQwNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJwIiwJdHdvKDB4RjAwMCwgMHg0QzZjKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VicyIsCXR3bygweEYwMDAsIDB4NDQ2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YnciLAl0d28oMHhGMDAwLCAweDUwNmMpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbTY4MDQwdXAgfSwKLXsiZmRzdWJ4IiwJdHdvKDB4RjAwMCwgMHgwMDZjKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG02ODA0MHVwIH0sCi17ImZkc3VieCIsCXR3bygweEYwMDAsIDB4NDg2YyksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtNjgwNDB1cCB9LAoteyJmZHN1YngiLAl0d28oMHhGMDAwLCAweDAwNmMpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbTY4MDQwdXAgfSwKLQoteyJmdGFuYiIsCXR3bygweEYwMDAsIDB4NTgwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnRhbmQiLAl0d28oMHhGMDAwLCAweDU0MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RkY3IiwgbWZsb2F0IH0sCi17ImZ0YW5sIiwJdHdvKDB4RjAwMCwgMHg0MDBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2xGNyIsIG1mbG9hdCB9LAoteyJmdGFucCIsCXR3bygweEYwMDAsIDB4NEMwRiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnRhbnMiLAl0d28oMHhGMDAwLCAweDQ0MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZkY3IiwgbWZsb2F0IH0sCi17ImZ0YW53IiwJdHdvKDB4RjAwMCwgMHg1MDBGKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3dGNyIsIG1mbG9hdCB9LAoteyJmdGFueCIsCXR3bygweEYwMDAsIDB4MDAwRiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnRhbngiLAl0d28oMHhGMDAwLCAweDQ4MEYpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eEY3IiwgbWZsb2F0IH0sCi17ImZ0YW54IiwJdHdvKDB4RjAwMCwgMHgwMDBGKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRnQiLCAgIG1mbG9hdCB9LAotCi17ImZ0YW5oYiIsCXR3bygweEYwMDAsIDB4NTgwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtiRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhkIiwJdHdvKDB4RjAwMCwgMHg1NDA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdGFuaGwiLAl0d28oMHhGMDAwLCAweDQwMDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0YW5ocCIsCXR3bygweEYwMDAsIDB4NEMwOSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtwRjciLCBtZmxvYXQgfSwKLXsiZnRhbmhzIiwJdHdvKDB4RjAwMCwgMHg0NDA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHciLAl0d28oMHhGMDAwLCAweDUwMDkpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0YW5oeCIsCXR3bygweEYwMDAsIDB4MDAwOSksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUY4RjciLCBtZmxvYXQgfSwKLXsiZnRhbmh4IiwJdHdvKDB4RjAwMCwgMHg0ODA5KSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdGFuaHgiLAl0d28oMHhGMDAwLCAweDAwMDkpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiZnRlbnRveGIiLAl0d28oMHhGMDAwLCAweDU4MTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7YkY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hkIiwJdHdvKDB4RjAwMCwgMHg1NDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO0ZGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94bCIsCXR3bygweEYwMDAsIDB4NDAxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsRjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHAiLAl0d28oMHhGMDAwLCAweDRDMTIpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7cEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3hzIiwJdHdvKDB4RjAwMCwgMHg0NDEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2ZGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94dyIsCXR3bygweEYwMDAsIDB4NTAxMiksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3RjciLCBtZmxvYXQgfSwKLXsiZnRlbnRveHgiLAl0d28oMHhGMDAwLCAweDAwMTIpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGOEY3IiwgbWZsb2F0IH0sCi17ImZ0ZW50b3h4IiwJdHdvKDB4RjAwMCwgMHg0ODEyKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3hGNyIsIG1mbG9hdCB9LAoteyJmdGVudG94eCIsCXR3bygweEYwMDAsIDB4MDAxMiksIHR3bygweEYxQzAsIDB4RTA3RiksICJJaUZ0IiwgICBtZmxvYXQgfSwKLQoteyJmdHJhcGVxIiwJdHdvKDB4RjA3QywgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZiIsCXR3bygweEYwN0MsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGdlIiwJdHdvKDB4RjA3QywgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2wiLAl0d28oMHhGMDdDLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbGUiLAl0d28oMHhGMDdDLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBndCIsCXR3bygweEYwN0MsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcGxlIiwJdHdvKDB4RjA3QywgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwbHQiLAl0d28oMHhGMDdDLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZSIsCXR3bygweEYwN0MsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nZSIsCXR3bygweEYwN0MsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbCIsCXR3bygweEYwN0MsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcG5nbGUiLAl0d28oMHhGMDdDLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBuZ3QiLAl0d28oMHhGMDdDLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBubGUiLAl0d28oMHhGMDdDLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBubHQiLAl0d28oMHhGMDdDLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2UiLAl0d28oMHhGMDdDLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ2wiLAl0d28oMHhGMDdDLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvZ3QiLAl0d28oMHhGMDdDLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvbGUiLAl0d28oMHhGMDdDLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvbHQiLAl0d28oMHhGMDdDLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXBvciIsCXR3bygweEYwN0MsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHNlcSIsCXR3bygweEYwN0MsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaSIsIG1mbG9hdCB9LAoteyJmdHJhcHNmIiwJdHdvKDB4RjA3QywgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc25lIiwJdHdvKDB4RjA3QywgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwc3QiLAl0d28oMHhGMDdDLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLXsiZnRyYXB0IiwJdHdvKDB4RjA3QywgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWVxIiwJdHdvKDB4RjA3QywgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWdlIiwJdHdvKDB4RjA3QywgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWd0IiwJdHdvKDB4RjA3QywgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWxlIiwJdHdvKDB4RjA3QywgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdWx0IiwJdHdvKDB4RjA3QywgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpIiwgbWZsb2F0IH0sCi17ImZ0cmFwdW4iLAl0d28oMHhGMDdDLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWkiLCBtZmxvYXQgfSwKLSAgICAgICAgCi17ImZ0cmFwZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBmdyIsCXR3bygweEYwN0EsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2V3IiwJdHdvKDB4RjA3QSwgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBnbHciLAl0d28oMHhGMDdBLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGdsZXciLAl0d28oMHhGMDdBLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcGd0dyIsCXR3bygweEYwN0EsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbGV3IiwJdHdvKDB4RjA3QSwgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBsdHciLAl0d28oMHhGMDdBLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5ldyIsCXR3bygweEYwN0EsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdldyIsCXR3bygweEYwN0EsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsdyIsCXR3bygweEYwN0EsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsZXciLAl0d28oMHhGMDdBLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5ndHciLAl0d28oMHhGMDdBLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5sZXciLAl0d28oMHhGMDdBLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG5sdHciLAl0d28oMHhGMDdBLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9nZXciLAl0d28oMHhGMDdBLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9nbHciLAl0d28oMHhGMDdBLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9ndHciLAl0d28oMHhGMDdBLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9sZXciLAl0d28oMHhGMDdBLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9sdHciLAl0d28oMHhGMDdBLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcG9ydyIsCXR3bygweEYwN0EsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwc2VxdyIsCXR3bygweEYwN0EsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV53IiwgbWZsb2F0IH0sCi17ImZ0cmFwc2Z3IiwJdHdvKDB4RjA3QSwgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzbmV3IiwJdHdvKDB4RjA3QSwgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXBzdHciLAl0d28oMHhGMDdBLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAoteyJmdHJhcHR3IiwJdHdvKDB4RjA3QSwgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1ZXF3IiwJdHdvKDB4RjA3QSwgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z2V3IiwJdHdvKDB4RjA3QSwgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z3R3IiwJdHdvKDB4RjA3QSwgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bGV3IiwJdHdvKDB4RjA3QSwgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bHR3IiwJdHdvKDB4RjA3QSwgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXnciLCBtZmxvYXQgfSwKLXsiZnRyYXB1bnciLAl0d28oMHhGMDdBLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWledyIsIG1mbG9hdCB9LAotCi17ImZ0cmFwZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDAxKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBmbCIsCXR3bygweEYwN0IsIDB4MDAwMCksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwZ2VsIiwJdHdvKDB4RjA3QiwgMHgwMDEzKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBnbGwiLAl0d28oMHhGMDdCLCAweDAwMTYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGdsZWwiLAl0d28oMHhGMDdCLCAweDAwMTcpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcGd0bCIsCXR3bygweEYwN0IsIDB4MDAxMiksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbGVsIiwJdHdvKDB4RjA3QiwgMHgwMDE1KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBsdGwiLAl0d28oMHhGMDdCLCAweDAwMTQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5lbCIsCXR3bygweEYwN0IsIDB4MDAwRSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdlbCIsCXR3bygweEYwN0IsIDB4MDAxQyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsbCIsCXR3bygweEYwN0IsIDB4MDAxOSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwbmdsZWwiLAl0d28oMHhGMDdCLCAweDAwMTgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5ndGwiLAl0d28oMHhGMDdCLCAweDAwMUQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5sZWwiLAl0d28oMHhGMDdCLCAweDAwMUEpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG5sdGwiLAl0d28oMHhGMDdCLCAweDAwMUIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9nZWwiLAl0d28oMHhGMDdCLCAweDAwMDMpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9nbGwiLAl0d28oMHhGMDdCLCAweDAwMDYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9ndGwiLAl0d28oMHhGMDdCLCAweDAwMDIpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9sZWwiLAl0d28oMHhGMDdCLCAweDAwMDUpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9sdGwiLAl0d28oMHhGMDdCLCAweDAwMDQpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcG9ybCIsCXR3bygweEYwN0IsIDB4MDAwNyksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2VxbCIsCXR3bygweEYwN0IsIDB4MDAxMSksIHR3bygweEYxRkYsIDB4RkZGRiksICJJaV5sIiwgbWZsb2F0IH0sCi17ImZ0cmFwc2ZsIiwJdHdvKDB4RjA3QiwgMHgwMDEwKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzbmVsIiwJdHdvKDB4RjA3QiwgMHgwMDFFKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXBzdGwiLAl0d28oMHhGMDdCLCAweDAwMUYpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAoteyJmdHJhcHRsIiwJdHdvKDB4RjA3QiwgMHgwMDBGKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1ZXFsIiwJdHdvKDB4RjA3QiwgMHgwMDA5KSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z2VsIiwJdHdvKDB4RjA3QiwgMHgwMDBCKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1Z3RsIiwJdHdvKDB4RjA3QiwgMHgwMDBBKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bGVsIiwJdHdvKDB4RjA3QiwgMHgwMDBEKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bHRsIiwJdHdvKDB4RjA3QiwgMHgwMDBDKSwgdHdvKDB4RjFGRiwgMHhGRkZGKSwgIklpXmwiLCBtZmxvYXQgfSwKLXsiZnRyYXB1bmwiLAl0d28oMHhGMDdCLCAweDAwMDgpLCB0d28oMHhGMUZGLCAweEZGRkYpLCAiSWlebCIsIG1mbG9hdCB9LAotCi17ImZ0c3RiIiwJdHdvKDB4RjAwMCwgMHg1ODNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2IiLCBtZmxvYXQgfSwKLXsiZnRzdGQiLAl0d28oMHhGMDAwLCAweDU0M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7RiIsIG1mbG9hdCB9LAoteyJmdHN0bCIsCXR3bygweEYwMDAsIDB4NDAzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtsIiwgbWZsb2F0IH0sCi17ImZ0c3RwIiwJdHdvKDB4RjAwMCwgMHg0QzNBKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3AiLCBtZmxvYXQgfSwKLXsiZnRzdHMiLAl0d28oMHhGMDAwLCAweDQ0M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7ZiIsIG1mbG9hdCB9LAoteyJmdHN0dyIsCXR3bygweEYwMDAsIDB4NTAzQSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt3IiwgbWZsb2F0IH0sCi17ImZ0c3R4IiwJdHdvKDB4RjAwMCwgMHgwMDNBKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjgiLCBtZmxvYXQgfSwKLXsiZnRzdHgiLAl0d28oMHhGMDAwLCAweDQ4M0EpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7eCIsIG1mbG9hdCB9LAotCi17ImZ0d290b3hiIiwJdHdvKDB4RjAwMCwgMHg1ODExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO2JGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94ZCIsCXR3bygweEYwMDAsIDB4NTQxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtGRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveGwiLAl0d28oMHhGMDAwLCAweDQwMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7bEY3IiwgbWZsb2F0IH0sCi17ImZ0d290b3hwIiwJdHdvKDB4RjAwMCwgMHg0QzExKSwgdHdvKDB4RjFDMCwgMHhGQzdGKSwgIklpO3BGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94cyIsCXR3bygweEYwMDAsIDB4NDQxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTtmRjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHciLAl0d28oMHhGMDAwLCAweDUwMTEpLCB0d28oMHhGMUMwLCAweEZDN0YpLCAiSWk7d0Y3IiwgbWZsb2F0IH0sCi17ImZ0d290b3h4IiwJdHdvKDB4RjAwMCwgMHgwMDExKSwgdHdvKDB4RjFDMCwgMHhFMDdGKSwgIklpRjhGNyIsIG1mbG9hdCB9LAoteyJmdHdvdG94eCIsCXR3bygweEYwMDAsIDB4NDgxMSksIHR3bygweEYxQzAsIDB4RkM3RiksICJJaTt4RjciLCBtZmxvYXQgfSwKLXsiZnR3b3RveHgiLAl0d28oMHhGMDAwLCAweDAwMTEpLCB0d28oMHhGMUMwLCAweEUwN0YpLCAiSWlGdCIsICAgbWZsb2F0IH0sCi0KLXsiaGFsdCIsCW9uZSgwMDQ1MzEwKSwJb25lKDAxNzc3NzcpLCAiIiwgICAgIG02ODA2MCB8IG1jZiB9LAotCi17ImlsbGVnYWwiLAlvbmUoMDA0NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsICAgICBtNjgwMDB1cCB9LAotCi17ImptcCIsCQlvbmUoMDA0NzMwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJqcmEiLAkJb25lKDAwNjAwMDApLAlvbmUoMDE3NzQwMCksICJCZyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImpyYSIsCQlvbmUoMDA0NzMwMCksCW9uZSgwMTc3NzAwKSwgIiFzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJqc3IiLAkJb25lKDAwNDcyMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsiamJzciIsCW9uZSgwMDYwNDAwKSwJb25lKDAxNzc0MDApLCAiQmciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJqYnNyIiwJb25lKDAwNDcyMDApLAlvbmUoMDE3NzcwMCksICIhcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibGVhIiwJCW9uZSgwMDQwNzAwKSwJb25lKDAxNzA3MDApLCAiIXNBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibHBzdG9wIiwJdHdvKDAxNzQwMDAsMDAwMDcwMCksdHdvKDAxNzc3NzcsMDE3Nzc3NyksIiN3IiwgY3B1MzJ8bTY4MDYwIH0sCi0KLXsibGlua3ciLAlvbmUoMDA0NzEyMCksCW9uZSgwMTc3NzcwKSwgIkFzI3ciLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJsaW5rbCIsCW9uZSgwMDQ0MDEwKSwJb25lKDAxNzc3NzApLCAiQXMjbCIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsibGluayIsCW9uZSgwMDQ3MTIwKSwJb25lKDAxNzc3NzApLCAiQXMjVyIsIG02ODAwMHVwIHwgbWNmIH0sCi17ImxpbmsiLAlvbmUoMDA0NDAxMCksCW9uZSgwMTc3NzcwKSwgIkFzI2wiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi0KLXsibHNsYiIsCW9uZSgwMTYwNDEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzbGIiLAlvbmUoMDE2MDQ1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc2x3IiwJb25lKDAxNjA1MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNsdyIsCW9uZSgwMTYwNTUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzbHciLAlvbmUoMDE2MTcwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJsc2xsIiwJb25lKDAxNjA2MTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibHNsbCIsCW9uZSgwMTYwNjUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsibHNyYiIsCW9uZSgwMTYwMDEwKSwJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17ImxzcmIiLAlvbmUoMDE2MDA1MCksCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJsc3J3IiwJb25lKDAxNjAxMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsibHNydyIsCW9uZSgwMTYwMTUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17ImxzcnciLAlvbmUoMDE2MTMwMCksCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJsc3JsIiwJb25lKDAxNjAyMTApLAlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsibHNybCIsCW9uZSgwMTYwMjUwKSwJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLSAgLyogRklYTUU6IGFkZCBNQU0gbW9kZSAoYCYnIGFmdGVyIDxlYT4gb3BlcmFuZCkgLyByZW1vdmUgTUFDTSAqLwoteyJtYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bU1oIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyMjAsIDAwMDAwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAwMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjdyIsICB0d28oMDEyMDI0MCwgMDAwMDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8tc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY3ciLCAgdHdvKDAxMjAyNTAsIDAwMDAwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjIwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjQwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWN3IiwgIHR3bygwMTIwMjUwLCAwMDAxMDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjIwLCAwMDAwMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2FzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIzMCwgMDAwMDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW8rc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY213IiwgdHdvKDAxMjAyNDAsIDAwMDAwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtdyIsIHR3bygwMTIwMjUwLCAwMDAwMDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b2RzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIyMCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDIzMCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDI0MCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbXciLCB0d28oMDEyMDI1MCwgMDAwMTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQoteyJtYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbU1oIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyMjAsIDAwMDQwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA0MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbCIsICB0d28oMDEyMDI0MCwgMDAwNDAwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjEtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY2wiLCAgdHdvKDAxMjAyNTAsIDAwMDQwMDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjIwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oK3NSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjQwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNsIiwgIHR3bygwMTIwMjUwLCAwMDA1MDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjIwLCAwMDA0MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIzMCwgMDAwNDA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjErc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1hY21sIiwgdHdvKDAxMjAyNDAsIDAwMDQwNDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtYWNtbCIsIHR3bygwMTIwMjUwLCAwMDA0MDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMWRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIyMCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGFzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDIzMCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDI0MCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaC1zUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibWFjbWwiLCB0d28oMDEyMDI1MCwgMDAwNTA0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaGRzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLQotLyogTk9URTogVGhlIG1jZjUyMDAgZmFtaWx5IHByb2dyYW1tZXIncyByZWZlcmVuY2UgbWFudWFsIGRvZXMgbm90IAotICAgaW5kaWNhdGUgdGhlIGJ5dGUgZm9ybSBvZiB0aGUgbW92ZWEgaW5zdHJ1Y3Rpb24gaXMgaW52YWxpZCAoYXMgaXQKLSAgIGlzIG9uIDY4MDAwIGZhbWlseSBjcHVzKS4gIEhvd2V2ZXIsIGV4cGVyaW1lbnRzIG9uIHRoZSA1MjAyIHllaWxkCi0gICB1bmV4cGVjdGVkIHJlc3VsdHMuICBUaGUgdmFsdWUgaXMgY29waWVkLCBidXQgaXQgaXMgbm90IHNpZ24gZXh0ZW5kZWQKLSAgIChhcyBpcyBkb25lIHdpdGggbW92ZWEudykgYW5kIHRoZSB0b3AgdGhyZWUgYnl0ZXMgaW4gdGhlIGFkZHJlc3MgCi0gICByZWdpc3RlciBhcmUgbm90IGRpc3R1cmJlZC4gIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHRoZSBpbnRlbmRlZAotICAgYmVoYXZpb3IgLS0tIGl0IGNvdWxkIGJlIGEgaG9sZSBpbiBpbnN0cnVjdGlvbiBkZWNvZGluZyAoTW90b3JvbGEKLSAgIGRlY2lkZWQgbm90IHRvIHRyYXAgYWxsIGludmFsaWQgaW5zdHJ1Y3Rpb25zIGZvciBwZXJmb3JtYW5jZSByZWFzb25zKQotICAgLS0tIGJ1dCBJIHN1c3BlY3QgdGhhdCBpdCBpcyBub3QuICAgCi0KLSAgIEkgcmVwb3J0ZWQgdGhpcyB0byBNb3Rvcm9sYSBJU0QgVGVjaG5pY2FsIENvbW11bmljYXRpb25zIFN1cHBvcnQsIAotICAgd2hpY2ggcmVwbGllZCB0aGF0IG90aGVyIGNvbGRmaXJlIGFzc2VtYmxlcnMgcmVqZWN0IG1vdmVhLmIuICBGb3IgCi0gICB0aGlzIHJlYXNvbiBJJ3ZlIGRlY2lkZWQgdG8gbm90IGFsbG93IG1vdmVhYi4gCi0KLQlqdGNAY3lnbnVzLmNvbSAtIDk3LzAxLzI0Ci0gKi8KLQoteyJtb3ZlYWwiLAlvbmUoMDAyMDEwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJtb3ZlYXciLAlvbmUoMDAzMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3QWQiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17Im1vdmVjIiwJb25lKDAwNDcxNzMpLAlvbmUoMDE3Nzc3NyksICJSMUpqIiwgbTY4MDEwdXAgfCBtY2YgfSwKLXsibW92ZWMiLAlvbmUoMDA0NzE3MyksCW9uZSgwMTc3Nzc3KSwgIlIxI2oiLCBtNjgwMTB1cCB8IG1jZiB9LAoteyJtb3ZlYyIsCW9uZSgwMDQ3MTcyKSwJb25lKDAxNzc3NzcpLCAiSmpSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVjIiwJb25lKDAwNDcxNzIpLAlvbmUoMDE3Nzc3NyksICIjalIxIiwgbTY4MDEwdXAgfSwKLQoteyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NDI0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NDIwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbXciLAlvbmUoMDA0NjIwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIkx3JnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM0MCksCW9uZSgwMTc3NzcwKSwgImx3LXMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDMwMCksCW9uZSgwMTc3NzAwKSwgIiN3PnMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzTHciLCBtNjgwMDB1cCB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjMwMCksCW9uZSgwMTc3NzAwKSwgIjxzI3ciLCBtNjgwMDB1cCB9LAotLyogRklYTUU6IG5lZWQgc3BlY2lmaWVyIGZvciBtb2RlIDIgYW5kIDUgdG8gc2ltcGxpZnkgYmVsb3cgaW5zbiBwYXR0ZXJucyAqLwoteyJtb3ZlbWwiLAlvbmUoMDA0NDMyMCksCW9uZSgwMTc3NzcwKSwgIkx3YXMiLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDQzMjApLAlvbmUoMDE3Nzc3MCksICIjd2FzIiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ0MzUwKSwJb25lKDAxNzc3NzApLCAiTHdkcyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NDM1MCksCW9uZSgwMTc3NzcwKSwgIiN3ZHMiLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzMjApLAlvbmUoMDE3Nzc3MCksICJhc0x3IiwgbWNmIH0sCi17Im1vdmVtbCIsCW9uZSgwMDQ2MzIwKSwJb25lKDAxNzc3NzApLCAiYXMjdyIsIG1jZiB9LAoteyJtb3ZlbWwiLAlvbmUoMDA0NjM1MCksCW9uZSgwMTc3NzcwKSwgImRzTHciLCBtY2YgfSwKLXsibW92ZW1sIiwJb25lKDAwNDYzNTApLAlvbmUoMDE3Nzc3MCksICJkcyN3IiwgbWNmIH0sCi0KLXsibW92ZXB3IiwJb25lKDAwMDA0MTApLAlvbmUoMDE3MDc3MCksICJkc0RkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXB3IiwJb25lKDAwMDA2MTApLAlvbmUoMDE3MDc3MCksICJEZGRzIiwgbTY4MDAwdXAgfSwKLXsibW92ZXBsIiwJb25lKDAwMDA1MTApLAlvbmUoMDE3MDc3MCksICJkc0RkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXBsIiwJb25lKDAwMDA3MTApLAlvbmUoMDE3MDc3MCksICJEZGRzIiwgbTY4MDAwdXAgfSwKLQoteyJtb3ZlcSIsCW9uZSgwMDcwMDAwKSwJb25lKDAxNzA0MDApLCAiTXNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im1vdmVxIiwJb25lKDAwNzAwMDApLAlvbmUoMDE3MDQwMCksICIjQkRkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLQotLyogVGhlIG1vdmUgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgbW92ZWEgYW5kIG1vdmVxIGluc3RydWN0aW9ucy4gICovCi17Im1vdmViIiwJb25lKDAwMTAwMDApLAlvbmUoMDE3MDAwMCksICI7YiRkIiwgbTY4MDAwdXAgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2YgfSwKLXsibW92ZWIiLAlvbmUoMDAxMDAwMCksCW9uZSgwMTcwMDAwKSwgIm9ibWQiLCBtY2YgfSwKLQoteyJtb3ZldyIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAiKnclZCIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJtcyVkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJuc3BkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJvd21kIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDAzMDApLAlvbmUoMDE3NzcwMCksICJTcyRzIiwgbTY4MDAwdXAgfSwKLXsibW92ZXciLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzcwKSwgIlNzRHMiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzAwKSwgIkNzJHMiLCBtNjgwMTB1cCB9LAoteyJtb3ZldyIsCW9uZSgwMDQxMzAwKSwJb25lKDAxNzc3NzApLCAiQ3NEcyIsIG1jZiB9LAoteyJtb3ZldyIsCW9uZSgwMDQyMzAwKSwJb25lKDAxNzc3MDApLCAiO3dDZCIsIG02ODAwMHVwIH0sCi17Im1vdmV3IiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICJEc0NkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDIzNzQpLAlvbmUoMDE3Nzc3NyksICIjd0NkIiwgbWNmIH0sCi17Im1vdmV3IiwJb25lKDAwNDMzMDApLAlvbmUoMDE3NzcwMCksICI7d1NkIiwgbTY4MDAwdXAgfSwKLXsibW92ZXciLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzU2QiLCBtY2YgfSwKLXsibW92ZXciLAlvbmUoMDA0MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U2QiLCBtY2YgfSwKLQoteyJtb3ZlbCIsCW9uZSgwMDcwMDAwKSwJb25lKDAxNzA0MDApLCAiTXNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im1vdmVsIiwJb25lKDAwMjAwMDApLAlvbmUoMDE3MDAwMCksICIqbCVkIiwgbTY4MDAwdXAgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm5zcGQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDAyMDAwMCksCW9uZSgwMTcwMDAwKSwgIm9sbWQiLCBtY2YgfSwKLXsibW92ZWwiLAlvbmUoMDA0NzE0MCksCW9uZSgwMTc3NzcwKSwgIkFzVWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlbCIsCW9uZSgwMDQ3MTUwKSwJb25lKDAxNzc3NzApLCAiVWRBcyIsIG02ODAwMHVwIH0sCi17Im1vdmVsIiwJb25lKDAxMjA2MDApLAlvbmUoMDE3Nzc2MCksICJFc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjA0MDApLAlvbmUoMDE3Nzc2MCksICJSc0VzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjA0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEVzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ2MDApLAlvbmUoMDE3Nzc2MCksICJHc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ0MDApLAlvbmUoMDE3Nzc2MCksICJSc0dzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEdzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY2MDApLAlvbmUoMDE3Nzc2MCksICJIc1JzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY0MDApLAlvbmUoMDE3Nzc2MCksICJSc0hzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjY0NzQpLAlvbmUoMDE3Nzc3NyksICIjbEhzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1vdmVsIiwJb25lKDAxMjQ3MDApLAlvbmUoMDE3Nzc3NyksICJHc0NzIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAiKnclZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDAzMDAwMCksCW9uZSgwMTcwMDAwKSwgIm1zJWQiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDMwMDAwKSwJb25lKDAxNzAwMDApLCAibnNwZCIsIG1jZiB9LAoteyJtb3ZlIiwJb25lKDAwMzAwMDApLAlvbmUoMDE3MDAwMCksICJvd21kIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MDMwMCksCW9uZSgwMTc3NzAwKSwgIlNzJHMiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDAzMDApLAlvbmUoMDE3Nzc3MCksICJTc0RzIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MTMwMCksCW9uZSgwMTc3NzAwKSwgIkNzJHMiLCBtNjgwMTB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDEzMDApLAlvbmUoMDE3Nzc3MCksICJDc0RzIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MjMwMCksCW9uZSgwMTc3NzAwKSwgIjt3Q2QiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDIzMDApLAlvbmUoMDE3NzcwMCksICJEc0NkIiwgbWNmIH0sCi17Im1vdmUiLAlvbmUoMDA0MjM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3Q2QiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQzMzAwKSwJb25lKDAxNzc3MDApLCAiO3dTZCIsIG02ODAwMHVwIH0sCi17Im1vdmUiLAlvbmUoMDA0MzMwMCksCW9uZSgwMTc3NzAwKSwgIkRzU2QiLCBtY2YgfSwKLXsibW92ZSIsCW9uZSgwMDQzMzc0KSwJb25lKDAxNzc3NzcpLCAiI3dTZCIsIG1jZiB9LAotCi17Im1vdmUiLAlvbmUoMDA0NzE0MCksCW9uZSgwMTc3NzcwKSwgIkFzVWQiLCBtNjgwMDB1cCB9LAoteyJtb3ZlIiwJb25lKDAwNDcxNTApLAlvbmUoMDE3Nzc3MCksICJVZEFzIiwgbTY4MDAwdXAgfSwKLQoteyJtb3Zlc2IiLAl0d28oMDAwNzAwMCwgMCksICAgICB0d28oMDE3NzcwMCwgMDc3NzcpLCAifnNSMSIsIG02ODAxMHVwIH0sCi17Im1vdmVzYiIsCXR3bygwMDA3MDAwLCAwNDAwMCksIHR3bygwMTc3NzAwLCAwNzc3NyksICJSMX5zIiwgbTY4MDEwdXAgfSwKLXsibW92ZXN3IiwJdHdvKDAwMDcxMDAsIDApLCAgICAgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIn5zUjEiLCBtNjgwMTB1cCB9LAoteyJtb3Zlc3ciLAl0d28oMDAwNzEwMCwgMDQwMDApLCB0d28oMDE3NzcwMCwgMDc3NzcpLCAiUjF+cyIsIG02ODAxMHVwIH0sCi17Im1vdmVzbCIsCXR3bygwMDA3MjAwLCAwKSwgICAgIHR3bygwMTc3NzAwLCAwNzc3NyksICJ+c1IxIiwgbTY4MDEwdXAgfSwKLXsibW92ZXNsIiwJdHdvKDAwMDcyMDAsIDA0MDAwKSwgdHdvKDAxNzc3MDAsIDA3Nzc3KSwgIlIxfnMiLCBtNjgwMTB1cCB9LAotCi17Im1vdmUxNiIsCXR3bygweGY2MjAsIDB4ODAwMCksIHR3bygweGZmZjgsIDB4OGZmZiksICIrcysxIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYwMCksCQlvbmUoMHhmZmY4KSwgIitzX0wiLCBtNjgwNDB1cCB9LAoteyJtb3ZlMTYiLAlvbmUoMHhmNjA4KSwJCW9uZSgweGZmZjgpLCAiX0wrcyIsIG02ODA0MHVwIH0sCi17Im1vdmUxNiIsCW9uZSgweGY2MTApLAkJb25lKDB4ZmZmOCksICJhc19MIiwgbTY4MDQwdXAgfSwKLXsibW92ZTE2IiwJb25lKDB4ZjYxOCksCQlvbmUoMHhmZmY4KSwgIl9MYXMiLCBtNjgwNDB1cCB9LAotCi0gIC8qIEZJWE1FOiBhZGQgTUFNIG1vZGUgKGAmJyBhZnRlciA8ZWE+IG9wZXJhbmQpIC8gcmVtb3ZlIE1TQUNNICovCi17Im1zYWN3IiwgIHR3bygwMTIwMDAwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAidU11bSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDAwMCwgMDAwMTQwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgInVNdW1NaCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDIyMCwgMDAwMDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9hc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjMwLCAwMDAwNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyNDAsIDAwMDA0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDI1MCwgMDAwMDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9kc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjIwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjdyIsICB0d28oMDEyMDIzMCwgMDAwMTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY3ciLCAgdHdvKDAxMjAyNDAsIDAwMDE0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWN3IiwgIHR3bygwMTIwMjUwLCAwMDAxNDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDIyMCwgMDAwMDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9hc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjMwLCAwMDAwNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51bytzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyNDAsIDAwMDA0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDI1MCwgMDAwMDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9kc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjIwLCAwMDAxNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbXciLCB0d28oMDEyMDIzMCwgMDAwMTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgInVOdW9NaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY213IiwgdHdvKDAxMjAyNDAsIDAwMDE0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJ1TnVvTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtdyIsIHR3bygwMTIwMjUwLCAwMDAxNDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAidU51b01oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17Im1zYWNsIiwgIHR3bygwMTIwMDAwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NjAsIDAwMDU0MDApLCAiUnNSbSIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDAwMCwgMDAwNTQwMCksIHR3bygwMTcwNjYwLCAwMDA1NDAwKSwgIlJzUm1NaCIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDIyMCwgMDAwNDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjMwLCAwMDA0NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyNDAsIDAwMDQ0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDI1MCwgMDAwNDQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjIwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbCIsICB0d28oMDEyMDIzMCwgMDAwNTQwMCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY2wiLCAgdHdvKDAxMjAyNDAsIDAwMDU0MDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNsIiwgIHR3bygwMTIwMjUwLCAwMDA1NDAwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDIyMCwgMDAwNDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFhc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjMwLCAwMDA0NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMStzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyNDAsIDAwMDQ0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxLXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDI1MCwgMDAwNDQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFkc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjIwLCAwMDA1NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oYXNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAoteyJtc2FjbWwiLCB0d28oMDEyMDIzMCwgMDAwNTQ0MCksIHR3bygwMTcwNjcwLCAwMDA1NDYwKSwgIlIzUjFNaCtzUm4iLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsibXNhY21sIiwgdHdvKDAxMjAyNDAsIDAwMDU0NDApLCB0d28oMDE3MDY3MCwgMDAwNTQ2MCksICJSM1IxTWgtc1JuIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi17Im1zYWNtbCIsIHR3bygwMTIwMjUwLCAwMDA1NDQwKSwgdHdvKDAxNzA2NzAsIDAwMDU0NjApLCAiUjNSMU1oZHNSbiIsIG1jZjUzMDcgfCBtY2Y1MjA2ZSB9LAotCi17Im11bHN3IiwJb25lKDAxNDA3MDApLAkJb25lKDAxNzA3MDApLCAiO3dEZCIsIG02ODAwMHVwfG1jZiB9LAoteyJtdWxzbCIsCXR3bygwMDQ2MDAwLDAwNDAwMCksIHR3bygwMTc3NzAwLDAxMDc3NzApLCAiO2xEMSIsIG02ODAyMHVwfGNwdTMyIH0sCi17Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA0MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICJxc0QxIiwgbWNmIH0sCi17Im11bHNsIiwJdHdvKDAwNDYwMDAsMDA2MDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICI7bEQzRDEiLG02ODAyMHVwfGNwdTMyIH0sCi0KLXsibXVsdXciLAlvbmUoMDE0MDMwMCksCQlvbmUoMDE3MDcwMCksICI7d0RkIiwgbTY4MDAwdXB8bWNmIH0sCi17Im11bHVsIiwJdHdvKDAwNDYwMDAsMDAwMDAwKSwgdHdvKDAxNzc3MDAsMDEwNzc3MCksICI7bEQxIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDAwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgInFzRDEiLCBtY2YgfSwKLXsibXVsdWwiLAl0d28oMDA0NjAwMCwwMDIwMDApLCB0d28oMDE3NzcwMCwwMTA3NzcwKSwgIjtsRDNEMSIsbTY4MDIwdXB8Y3B1MzIgfSwKLQoteyJuYmNkIiwJb25lKDAwNDQwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi0KLXsibmVnYiIsCW9uZSgwMDQyMDAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJuZWd3IiwJb25lKDAwNDIxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ2wiLAlvbmUoMDA0MjIwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibmVnbCIsCW9uZSgwMDQyMjAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2Z9LAotCi17Im5lZ3hiIiwJb25lKDAwNDAwMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3h3IiwJb25lKDAwNDAxMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3hsIiwJb25lKDAwNDAyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5lZ3hsIiwJb25lKDAwNDAyMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZn0sCi0KLXsibm9wIiwJCW9uZSgwMDQ3MTYxKSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDAwdXAgfCBtY2Z9LAotCi17Im5vdGIiLAlvbmUoMDA0MzAwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsibm90dyIsCW9uZSgwMDQzMTAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJub3RsIiwJb25lKDAwNDMyMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17Im5vdGwiLAlvbmUoMDA0MzIwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmfSwKLQoteyJvcmliIiwJb25lKDAwMDAwMDApLAlvbmUoMDE3NzcwMCksICIjYiRzIiwgbTY4MDAwdXAgfSwKLXsib3JpYiIsCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yaXciLAlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvcml3IiwJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLXsib3JpbCIsCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17Im9yaWwiLAlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsib3JpIiwJCW9uZSgwMDAwMDc0KSwJb25lKDAxNzc3NzcpLCAiI2JDcyIsIG02ODAwMHVwIH0sCi17Im9yaSIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvcmkiLAkJb25lKDAwMDAxNzQpLAlvbmUoMDE3Nzc3NyksICIjd1NzIiwgbTY4MDAwdXAgfSwKLQotLyogVGhlIG9yIG9wY29kZSBjYW4gZ2VuZXJhdGUgdGhlIG9yaSBpbnN0cnVjdGlvbi4gICovCi17Im9yYiIsCQlvbmUoMDAwMDAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJvcmIiLAkJb25lKDAwMDAwNzQpLAlvbmUoMDE3Nzc3NyksICIjYkNzIiwgbTY4MDAwdXAgfSwKLXsib3JiIiwJCW9uZSgwMTAwMDAwKSwJb25lKDAxNzA3MDApLCAiO2JEZCIsIG02ODAwMHVwIH0sCi17Im9yYiIsCQlvbmUoMDEwMDQwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAwMDAxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsib3J3IiwJCW9uZSgwMDAwMTc0KSwJb25lKDAxNzc3NzcpLCAiI3dTcyIsIG02ODAwMHVwIH0sCi17Im9ydyIsCQlvbmUoMDEwMDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJvcnciLAkJb25lKDAxMDA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsib3JsIiwJCW9uZSgwMDAwMjAwKSwJb25lKDAxNzc3MDApLCAiI2wkcyIsIG02ODAwMHVwIH0sCi17Im9ybCIsCQlvbmUoMDAwMDIwMCksCW9uZSgwMTc3NzAwKSwgIiNsRHMiLCBtY2YgfSwKLXsib3JsIiwJCW9uZSgwMTAwMjAwKSwJb25lKDAxNzA3MDApLCAiO2xEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17Im9ybCIsCQlvbmUoMDEwMDYwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJvciIsCQlvbmUoMDAwMDA3NCksCW9uZSgwMTc3Nzc3KSwgIiNiQ3MiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDAwMDEwMCksCW9uZSgwMTc3NzAwKSwgIiN3JHMiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDAwMDE3NCksCW9uZSgwMTc3Nzc3KSwgIiN3U3MiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDEwMDEwMCksCW9uZSgwMTcwNzAwKSwgIjt3RGQiLCBtNjgwMDB1cCB9LAoteyJvciIsCQlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzAwKSwgIkRkfnMiLCBtNjgwMDB1cCB9LAotCi17InBhY2siLAlvbmUoMDEwMDUwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQjdyIsIG02ODAyMHVwIH0sCi17InBhY2siLAlvbmUoMDEwMDUxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQjdyIsIG02ODAyMHVwIH0sCi0KLXsicGJhYyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmFjdyIsCW9uZSgweGYwODcpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmFzIiwJb25lKDB4ZjA4NiksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiYXN3IiwJb25lKDB4ZjA4NiksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiYmMiLAlvbmUoMHhmMDgxKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJiY3ciLAlvbmUoMHhmMDgxKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJicyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmJzdyIsCW9uZSgweGYwODApLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmNjIiwJb25lKDB4ZjA4ZiksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiY2N3IiwJb25lKDB4ZjA4ZiksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiY3MiLAlvbmUoMHhmMDhlKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJjc3ciLAlvbmUoMHhmMDhlKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJnYyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmdjdyIsCW9uZSgweGYwOGQpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmdzIiwJb25lKDB4ZjA4YyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBiZ3N3IiwJb25lKDB4ZjA4YyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBiaWMiLAlvbmUoMHhmMDhiKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJpY3ciLAlvbmUoMHhmMDhiKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJpcyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYmlzdyIsCW9uZSgweGYwOGEpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYmxjIiwJb25lKDB4ZjA4MyksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBibGN3IiwJb25lKDB4ZjA4MyksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBibHMiLAlvbmUoMHhmMDgyKSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJsc3ciLAlvbmUoMHhmMDgyKSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJzYyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYnNjdyIsCW9uZSgweGYwODUpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAoteyJwYnNzIiwJb25lKDB4ZjA4NCksCQlvbmUoMHhmZmJmKSwgIkJjIiwgbTY4ODUxIH0sCi17InBic3N3IiwJb25lKDB4ZjA4NCksCQlvbmUoMHhmZmZmKSwgIkJXIiwgbTY4ODUxIH0sCi17InBid2MiLAlvbmUoMHhmMDg5KSwJCW9uZSgweGZmYmYpLCAiQmMiLCBtNjg4NTEgfSwKLXsicGJ3Y3ciLAlvbmUoMHhmMDg5KSwJCW9uZSgweGZmZmYpLCAiQlciLCBtNjg4NTEgfSwKLXsicGJ3cyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZiZiksICJCYyIsIG02ODg1MSB9LAoteyJwYndzdyIsCW9uZSgweGYwODgpLAkJb25lKDB4ZmZmZiksICJCVyIsIG02ODg1MSB9LAotCi17InBkYmFjIiwJdHdvKDB4ZjA0OCwgMHgwMDA3KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiYXMiLAl0d28oMHhmMDQ4LCAweDAwMDYpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJiYyIsCXR3bygweGYwNDgsIDB4MDAwMSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmJzIiwJdHdvKDB4ZjA0OCwgMHgwMDAwKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiY2MiLAl0d28oMHhmMDQ4LCAweDAwMGYpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJjcyIsCXR3bygweGYwNDgsIDB4MDAwZSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmdjIiwJdHdvKDB4ZjA0OCwgMHgwMDBkKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRiZ3MiLAl0d28oMHhmMDQ4LCAweDAwMGMpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJpYyIsCXR3bygweGYwNDgsIDB4MDAwYiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYmlzIiwJdHdvKDB4ZjA0OCwgMHgwMDBhKSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRibGMiLAl0d28oMHhmMDQ4LCAweDAwMDMpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJscyIsCXR3bygweGYwNDgsIDB4MDAwMiksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYnNjIiwJdHdvKDB4ZjA0OCwgMHgwMDA1KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLXsicGRic3MiLAl0d28oMHhmMDQ4LCAweDAwMDQpLAl0d28oMHhmZmY4LCAweGZmZmYpLCAiRHNCdyIsIG02ODg1MSB9LAoteyJwZGJ3YyIsCXR3bygweGYwNDgsIDB4MDAwOSksCXR3bygweGZmZjgsIDB4ZmZmZiksICJEc0J3IiwgbTY4ODUxIH0sCi17InBkYndzIiwJdHdvKDB4ZjA0OCwgMHgwMDA4KSwJdHdvKDB4ZmZmOCwgMHhmZmZmKSwgIkRzQnciLCBtNjg4NTEgfSwKLQoteyJwZWEiLAkJb25lKDAwNDQxMDApLAkJb25lKDAxNzc3MDApLCAiIXMiLCBtNjgwMDB1cHxtY2YgfSwKLQoteyJwZmx1c2hhIiwJb25lKDB4ZjUxOCksCQlvbmUoMHhmZmY4KSwgIiIsIG02ODA0MHVwIH0sCi17InBmbHVzaGEiLAl0d28oMHhmMDAwLDB4MjQwMCksIHR3bygweGZmZmYsMHhmZmZmKSwgIiIsIG02ODAzMCB8IG02ODg1MSB9LAotCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDMwMTApLCB0d28oMHhmZmMwLDB4ZmUxMCksICJUM1Q5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzODEwKSwgdHdvKDB4ZmZjMCwweGZlMTApLCAiVDNUOSZzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwZmx1c2giLCAgIHR3bygweGYwMDAsMHgzMDA4KSwgdHdvKDB4ZmZjMCwweGZlMTgpLCAiRDNUOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzgwOCksIHR3bygweGZmYzAsMHhmZTE4KSwgIkQzVDkmcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicGZsdXNoIiwgICB0d28oMHhmMDAwLDB4MzAwMCksIHR3bygweGZmYzAsMHhmZTFlKSwgImYzVDkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsICAgdHdvKDB4ZjAwMCwweDM4MDApLCB0d28oMHhmZmMwLDB4ZmUxZSksICJmM1Q5JnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCi17InBmbHVzaCIsCW9uZSgweGY1MDgpLAkJb25lKDB4ZmZmOCksICJBcyIsIG02ODA0MHVwIH0sCi0KLXsicGZsdXNoYW4iLAlvbmUoMHhmNTEwKSwJCW9uZSgweGZmZjgpLCAiIiwgbTY4MDQwdXAgfSwKLXsicGZsdXNobiIsCW9uZSgweGY1MDApLAkJb25lKDB4ZmZmOCksICJhcyIsIG02ODA0MHVwIH0sCi17InBmbHVzaG4iLAlvbmUoMHhmNTAwKSwJCW9uZSgweGZmZjgpLCAiQXMiLCBtNjgwNDB1cCB9LAotCi17InBmbHVzaHIiLAl0d28oMHhmMDAwLCAweGEwMDApLCB0d28oMHhmZmMwLCAweGZmZmYpLCAifHMiLCBtNjg4NTEgfSwKLQoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzNDEwKSwgdHdvKDB4ZmZmOCwgMHhmZTEwKSwgIlQzVDkiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4M2MxMCksIHR3bygweGZmZjgsIDB4ZmUxMCksICJUM1Q5JnMiLCBtNjg4NTEgfSwKLXsicGZsdXNocyIsCXR3bygweGYwMDAsIDB4MzQwOCksIHR3bygweGZmZjgsIDB4ZmUxOCksICJEM1Q5IiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDNjMDgpLCB0d28oMHhmZmY4LCAweGZlMTgpLCAiRDNUOSZzIiwgbTY4ODUxIH0sCi17InBmbHVzaHMiLAl0d28oMHhmMDAwLCAweDM0MDApLCB0d28oMHhmZmY4LCAweGZlMWUpLCAiZjNUOSIsIG02ODg1MSB9LAoteyJwZmx1c2hzIiwJdHdvKDB4ZjAwMCwgMHgzYzAwKSwgdHdvKDB4ZmZmOCwgMHhmZTFlKSwgImYzVDkmcyIsIG02ODg1MSB9LAotCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkciIsICAgICB0d28oMHhmMDAwLDB4MjIwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAxMCksIHR3bygweGZmYzAsMHhmZmYwKSwgIlQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwOCksIHR3bygweGZmYzAsMHhmZmY4KSwgIkQzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBsb2FkdyIsICAgICB0d28oMHhmMDAwLDB4MjAwMCksIHR3bygweGZmYzAsMHhmZmZlKSwgImYzJnMiLCBtNjgwMzB8bTY4ODUxIH0sCi0KLXsicGxwYXIiLAlvbmUoMHhmNWM4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKLXsicGxwYXciLAlvbmUoMHhmNTg4KSwJCW9uZSgweGZmZjgpLCAiYXMiLCBtNjgwNjAgfSwKLQoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqbDA4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDVjMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqdzE4IiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIipiMjgiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg0MjAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMDglcyIsIG02ODAzMHxtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg1ZTAwKSwgdHdvKDB4ZmZjMCwweGZmZmYpLCAiMTglcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDQyMDApLCB0d28oMHhmZmMwLDB4ZTNmZiksICIyOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDAwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NDIwMCksIHR3bygweGZmYzAsMHhlM2ZmKSwgIlc4fnMiLCBtNjgwMzB8bTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4NjIwMCksIHR3bygweGZmYzAsMHhlM2UzKSwgIip3WDMiLCBtNjg4NTEgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHg2MDAwKSwgdHdvKDB4ZmZjMCwweGUzZTMpLCAiWDMlcyIsIG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYwMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICIqd1k4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDYyMDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJZOCVzIiwgbTY4MDMwfG02ODg1MSB9LAoteyJwbW92ZSIsICAgICAgdHdvKDB4ZjAwMCwweDY2MDApLCB0d28oMHhmZmMwLDB4ZmZmZiksICJaOCVzIiwgbTY4ODUxIH0sCi17InBtb3ZlIiwgICAgICB0d28oMHhmMDAwLDB4MDgwMCksIHR3bygweGZmYzAsMHhmYmZmKSwgIipsMzgiLCBtNjgwMzAgfSwKLXsicG1vdmUiLCAgICAgIHR3bygweGYwMDAsMHgwYTAwKSwgdHdvKDB4ZmZjMCwweGZiZmYpLCAiMzglcyIsIG02ODAzMCB9LAotCi17InBtb3ZlZmQiLAl0d28oMHhmMDAwLCAweDQxMDApLAl0d28oMHhmZmMwLCAweGUzZmYpLCAiKmwwOCIsIG02ODAzMCB9LAoteyJwbW92ZWZkIiwJdHdvKDB4ZjAwMCwgMHg0MTAwKSwJdHdvKDB4ZmZjMCwgMHhlM2ZmKSwgInxzVzgiLCBtNjgwMzAgfSwKLXsicG1vdmVmZCIsCXR3bygweGYwMDAsIDB4MDkwMCksCXR3bygweGZmYzAsIDB4ZmJmZiksICIqbDM4IiwgbTY4MDMwIH0sCi0KLXsicHJlc3RvcmUiLAlvbmUoMHhmMTQwKSwJCW9uZSgweGZmYzApLCAiPHMiLCBtNjg4NTEgfSwKLQoteyJwc2F2ZSIsCW9uZSgweGYxMDApLAkJb25lKDB4ZmZjMCksICI+cyIsIG02ODg1MSB9LAotCi17InBzYWMiLAl0d28oMHhmMDQwLCAweDAwMDcpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNhcyIsCXR3bygweGYwNDAsIDB4MDAwNiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2JjIiwJdHdvKDB4ZjA0MCwgMHgwMDAxKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzYnMiLAl0d28oMHhmMDQwLCAweDAwMDApLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNjYyIsCXR3bygweGYwNDAsIDB4MDAwZiksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2NzIiwJdHdvKDB4ZjA0MCwgMHgwMDBlKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzZ2MiLAl0d28oMHhmMDQwLCAweDAwMGQpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNncyIsCXR3bygweGYwNDAsIDB4MDAwYyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2ljIiwJdHdvKDB4ZjA0MCwgMHgwMDBiKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzaXMiLAl0d28oMHhmMDQwLCAweDAwMGEpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNsYyIsCXR3bygweGYwNDAsIDB4MDAwMyksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc2xzIiwJdHdvKDB4ZjA0MCwgMHgwMDAyKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzc2MiLAl0d28oMHhmMDQwLCAweDAwMDUpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLXsicHNzcyIsCXR3bygweGYwNDAsIDB4MDAwNCksCXR3bygweGZmYzAsIDB4ZmZmZiksICIkcyIsIG02ODg1MSB9LAoteyJwc3djIiwJdHdvKDB4ZjA0MCwgMHgwMDA5KSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIiRzIiwgbTY4ODUxIH0sCi17InBzd3MiLAl0d28oMHhmMDQwLCAweDAwMDgpLAl0d28oMHhmZmMwLCAweGZmZmYpLCAiJHMiLCBtNjg4NTEgfSwKLQoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIxMCksIHR3bygweGZmYzAsIDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MzEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0ciIsIHR3bygweGYwMDAsMHg4MjA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODMwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHIiLCB0d28oMHhmMDAwLDB4ODIwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwgdHdvKDB4ZjAwMCwweDgzMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3RyIiwJb25lKDB4ZjU2OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCi0KLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgwMTApLCB0d28oMHhmZmMwLDB4ZTNmMCksICJUMyZzdDgiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MTEwKSwgdHdvKDB4ZmZjMCwweGUzMTApLCAiVDMmc3Q4QTkiLCBtNjgwMzB8bTY4ODUxIH0sCi17InB0ZXN0dyIsIHR3bygweGYwMDAsMHg4MDA4KSwgdHdvKDB4ZmZjMCwweGUzZjgpLCAiRDMmc3Q4IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODEwOCksIHR3bygweGZmYzAsMHhlMzE4KSwgIkQzJnN0OEE5IiwgbTY4MDMwfG02ODg1MSB9LAoteyJwdGVzdHciLCB0d28oMHhmMDAwLDB4ODAwMCksIHR3bygweGZmYzAsMHhlM2ZlKSwgImYzJnN0OCIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwgdHdvKDB4ZjAwMCwweDgxMDApLCB0d28oMHhmZmMwLDB4ZTMxZSksICJmMyZzdDhBOSIsIG02ODAzMHxtNjg4NTEgfSwKLXsicHRlc3R3IiwJb25lKDB4ZjU0OCksCQlvbmUoMHhmZmY4KSwgImFzIiwgbTY4MDQwIH0sCi0KLXsicHRyYXBhY3ciLAl0d28oMHhmMDdhLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBhY2wiLAl0d28oMHhmMDdiLCAweDAwMDcpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBhYyIsCXR3bygweGYwN2MsIDB4MDAwNyksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwYXN3IiwJdHdvKDB4ZjA3YSwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwYXNsIiwJdHdvKDB4ZjA3YiwgMHgwMDA2KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwYXMiLAl0d28oMHhmMDdjLCAweDAwMDYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGJjdyIsCXR3bygweGYwN2EsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGJjbCIsCXR3bygweGYwN2IsIDB4MDAwMSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGJjIiwJdHdvKDB4ZjA3YywgMHgwMDAxKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBic3ciLAl0d28oMHhmMDdhLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBic2wiLAl0d28oMHhmMDdiLCAweDAwMDApLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBicyIsCXR3bygweGYwN2MsIDB4MDAwMCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwY2N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwY2NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBmKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwY2MiLAl0d28oMHhmMDdjLCAweDAwMGYpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGNzdyIsCXR3bygweGYwN2EsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGNzbCIsCXR3bygweGYwN2IsIDB4MDAwZSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGNzIiwJdHdvKDB4ZjA3YywgMHgwMDBlKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBnY3ciLAl0d28oMHhmMDdhLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBnY2wiLAl0d28oMHhmMDdiLCAweDAwMGQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBnYyIsCXR3bygweGYwN2MsIDB4MDAwZCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwZ3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwZ3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDBjKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwZ3MiLAl0d28oMHhmMDdjLCAweDAwMGMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGljdyIsCXR3bygweGYwN2EsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGljbCIsCXR3bygweGYwN2IsIDB4MDAwYiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGljIiwJdHdvKDB4ZjA3YywgMHgwMDBiKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBpc3ciLAl0d28oMHhmMDdhLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBpc2wiLAl0d28oMHhmMDdiLCAweDAwMGEpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBpcyIsCXR3bygweGYwN2MsIDB4MDAwYSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwbGN3IiwJdHdvKDB4ZjA3YSwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwbGNsIiwJdHdvKDB4ZjA3YiwgMHgwMDAzKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwbGMiLAl0d28oMHhmMDdjLCAweDAwMDMpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcGxzdyIsCXR3bygweGYwN2EsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcGxzbCIsCXR3bygweGYwN2IsIDB4MDAwMiksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcGxzIiwJdHdvKDB4ZjA3YywgMHgwMDAyKSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXBzY3ciLAl0d28oMHhmMDdhLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXBzY2wiLAl0d28oMHhmMDdiLCAweDAwMDUpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXBzYyIsCXR3bygweGYwN2MsIDB4MDAwNSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB0cmFwc3N3IiwJdHdvKDB4ZjA3YSwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiN3IiwgbTY4ODUxIH0sCi17InB0cmFwc3NsIiwJdHdvKDB4ZjA3YiwgMHgwMDA0KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiNsIiwgbTY4ODUxIH0sCi17InB0cmFwc3MiLAl0d28oMHhmMDdjLCAweDAwMDQpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiIiwgICBtNjg4NTEgfSwKLQoteyJwdHJhcHdjdyIsCXR3bygweGYwN2EsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjdyIsIG02ODg1MSB9LAoteyJwdHJhcHdjbCIsCXR3bygweGYwN2IsIDB4MDAwOSksCXR3bygweGZmZmYsIDB4ZmZmZiksICIjbCIsIG02ODg1MSB9LAoteyJwdHJhcHdjIiwJdHdvKDB4ZjA3YywgMHgwMDA5KSwJdHdvKDB4ZmZmZiwgMHhmZmZmKSwgIiIsICAgbTY4ODUxIH0sCi0KLXsicHRyYXB3c3ciLAl0d28oMHhmMDdhLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI3ciLCBtNjg4NTEgfSwKLXsicHRyYXB3c2wiLAl0d28oMHhmMDdiLCAweDAwMDgpLAl0d28oMHhmZmZmLCAweGZmZmYpLCAiI2wiLCBtNjg4NTEgfSwKLXsicHRyYXB3cyIsCXR3bygweGYwN2MsIDB4MDAwOCksCXR3bygweGZmZmYsIDB4ZmZmZiksICIiLCAgIG02ODg1MSB9LAotCi17InB1bHNlIiwJb25lKDAwNDUzMTQpLAkJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDYwIHwgbWNmIH0sCi0KLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyODAwKSwJdHdvKDB4ZmZjMCwgMHhmZmZmKSwgIlZzJnMiLCBtNjg4NTEgfSwKLXsicHZhbGlkIiwJdHdvKDB4ZjAwMCwgMHgyYzAwKSwJdHdvKDB4ZmZjMCwgMHhmZmY4KSwgIkEzJnMiLCBtNjg4NTEgfSwKLQotICAvKiBGSVhNRTogZG9uJ3QgYWxsb3cgRHc9PUR4LiAqLwoteyJyZW1zbCIsICAgICAgIHR3bygweDRjNDAsIDB4MDgwMCksICAgIHR3bygweGZmYzAsIDB4OGZmOCksICJ2c0QzRDEiLCBtY2Y1MzA3IHwgbWNmNTIwNmUgfSwKLXsicmVtdWwiLCAgICAgICB0d28oMHg0YzQwLCAweDAwMDApLCAgICB0d28oMHhmZmMwLCAweDhmZjgpLCAidnNEM0QxIiwgbWNmNTMwNyB8IG1jZjUyMDZlIH0sCi0KLXsicmVzZXQiLAlvbmUoMDA0NzE2MCksCQlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMDB1cCB9LAotCi17InJvbGIiLAlvbmUoMDE2MDQzMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sYiIsCW9uZSgwMTYwNDcwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb2x3IiwJb25lKDAxNjA1MzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvbHciLAlvbmUoMDE2MDU3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9sdyIsCW9uZSgwMTYzNzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb2xsIiwJb25lKDAxNjA2MzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvbGwiLAlvbmUoMDE2MDY3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJyb3JiIiwJb25lKDAxNjAwMzApLAkJb25lKDAxNzA3NzApLCAiUWREcyIsIG02ODAwMHVwIH0sCi17InJvcmIiLAlvbmUoMDE2MDA3MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm9ydyIsCW9uZSgwMTYwMTMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3J3IiwJb25lKDAxNjAxNzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi17InJvcnciLAlvbmUoMDE2MzMwMCksCQlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsicm9ybCIsCW9uZSgwMTYwMjMwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3JsIiwJb25lKDAxNjAyNzApLAkJb25lKDAxNzA3NzApLCAiRGREcyIsIG02ODAwMHVwIH0sCi0KLXsicm94bGIiLAlvbmUoMDE2MDQyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bGIiLAlvbmUoMDE2MDQ2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MDUyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MDU2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bHciLAlvbmUoMDE2MjcwMCksCQlvbmUoMDE3NzcwMCksICJ+cyIsICAgbTY4MDAwdXAgfSwKLXsicm94bGwiLAlvbmUoMDE2MDYyMCksCQlvbmUoMDE3MDc3MCksICJRZERzIiwgbTY4MDAwdXAgfSwKLXsicm94bGwiLAlvbmUoMDE2MDY2MCksCQlvbmUoMDE3MDc3MCksICJEZERzIiwgbTY4MDAwdXAgfSwKLQoteyJyb3hyYiIsCW9uZSgwMTYwMDIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hyYiIsCW9uZSgwMTYwMDYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYwMTIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYwMTYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hydyIsCW9uZSgwMTYyMzAwKSwJCW9uZSgwMTc3NzAwKSwgIn5zIiwgICBtNjgwMDB1cCB9LAoteyJyb3hybCIsCW9uZSgwMTYwMjIwKSwJCW9uZSgwMTcwNzcwKSwgIlFkRHMiLCBtNjgwMDB1cCB9LAoteyJyb3hybCIsCW9uZSgwMTYwMjYwKSwJCW9uZSgwMTcwNzcwKSwgIkRkRHMiLCBtNjgwMDB1cCB9LAotCi17InJ0ZCIsCQlvbmUoMDA0NzE2NCksCQlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAxMHVwIH0sCi0KLXsicnRlIiwJCW9uZSgwMDQ3MTYzKSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXB8bWNmIH0sCi0KLXsicnRtIiwJCW9uZSgwMDAzMzAwKSwJCW9uZSgwMTc3NzYwKSwgIlJzIiwgbTY4MDIwIH0sCi0KLXsicnRyIiwJCW9uZSgwMDQ3MTY3KSwJCW9uZSgwMTc3Nzc3KSwgIiIsICAgbTY4MDAwdXAgfSwKLQoteyJydHMiLAkJb25lKDAwNDcxNjUpLAkJb25lKDAxNzc3NzcpLCAiIiwgICBtNjgwMDB1cHxtY2YgfSwKLQoteyJzYmNkIiwJb25lKDAxMDA0MDApLAkJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIH0sCi17InNiY2QiLAlvbmUoMDEwMDQxMCksCQlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQotCi17InNjYyIsCQlvbmUoMDA1MjMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2NjIiwJCW9uZSgwMDUyMzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2NzIiwJCW9uZSgwMDUyNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzY3MiLAkJb25lKDAwNTI3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzZXEiLAkJb25lKDAwNTM3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNlcSIsCQlvbmUoMDA1MzcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNmIiwJCW9uZSgwMDUwNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZiIsCQlvbmUoMDA1MDcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNnZSIsCQlvbmUoMDA1NjMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2dlIiwJCW9uZSgwMDU2MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2d0IiwJCW9uZSgwMDU3MzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzZ3QiLAkJb25lKDAwNTczMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzaGkiLAkJb25lKDAwNTEzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNoaSIsCQlvbmUoMDA1MTMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNsZSIsCQlvbmUoMDA1NzcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic2xlIiwJCW9uZSgwMDU3NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic2xzIiwJCW9uZSgwMDUxNzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbHMiLAkJb25lKDAwNTE3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzbHQiLAkJb25lKDAwNTY3MDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNsdCIsCQlvbmUoMDA1NjcwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InNtaSIsCQlvbmUoMDA1NTcwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic21pIiwJCW9uZSgwMDU1NzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic25lIiwJCW9uZSgwMDUzMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzbmUiLAkJb25lKDAwNTMzMDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAoteyJzcGwiLAkJb25lKDAwNTUzMDApLAlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi17InNwbCIsCQlvbmUoMDA1NTMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InN0IiwJCW9uZSgwMDUwMzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzdCIsCQlvbmUoMDA1MDMwMCksCW9uZSgwMTc3NzAwKSwgIkRzIiwgbWNmIH0sCi17InN2YyIsCQlvbmUoMDA1NDMwMCksCW9uZSgwMTc3NzAwKSwgIiRzIiwgbTY4MDAwdXAgfSwKLXsic3ZjIiwJCW9uZSgwMDU0MzAwKSwJb25lKDAxNzc3MDApLCAiRHMiLCBtY2YgfSwKLXsic3ZzIiwJCW9uZSgwMDU0NzAwKSwJb25lKDAxNzc3MDApLCAiJHMiLCBtNjgwMDB1cCB9LAoteyJzdnMiLAkJb25lKDAwNTQ3MDApLAlvbmUoMDE3NzcwMCksICJEcyIsIG1jZiB9LAotCi17InN0b3AiLAlvbmUoMDA0NzE2MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDAwdXAgfCBtY2YgfSwKLQoteyJzdWJhbCIsCW9uZSgwMTEwNzAwKSwJb25lKDAxNzA3MDApLCAiKmxBZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YmF3IiwJb25lKDAxMTAzMDApLAlvbmUoMDE3MDcwMCksICIqd0FkIiwgbTY4MDAwdXAgfSwKLQoteyJzdWJpYiIsCW9uZSgwMDAyMDAwKSwJb25lKDAxNzc3MDApLCAiI2IkcyIsIG02ODAwMHVwIH0sCi17InN1Yml3IiwJb25lKDAwMDIxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsic3ViaWwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJpbCIsCW9uZSgwMDAyMjAwKSwJb25lKDAxNzc3MDApLCAiI2xEcyIsIG1jZiB9LAotCi17InN1YnFiIiwJb25lKDAwNTA0MDApLAlvbmUoMDE3MDcwMCksICJRZCVzIiwgbTY4MDAwdXAgfSwKLXsic3VicXciLAlvbmUoMDA1MDUwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJxbCIsCW9uZSgwMDUwNjAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLS8qIFRoZSBzdWIgb3Bjb2RlIGNhbiBnZW5lcmF0ZSB0aGUgc3ViYSwgc3ViaSwgYW5kIHN1YnEgaW5zdHJ1Y3Rpb25zLiAgKi8KLXsic3ViYiIsCW9uZSgwMDUwNDAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIH0sCi17InN1YmIiLAlvbmUoMDAwMjAwMCksCW9uZSgwMTc3NzAwKSwgIiNiJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJiIiwJb25lKDAxMTAwMDApLAlvbmUoMDE3MDcwMCksICI7YkRkIiwgbTY4MDAwdXAgfSwKLXsic3ViYiIsCW9uZSgwMTEwNDAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDA1MDUwMCksCW9uZSgwMTcwNzAwKSwgIlFkJXMiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAwMDIxMDApLAlvbmUoMDE3NzcwMCksICIjdyRzIiwgbTY4MDAwdXAgfSwKLXsic3VidyIsCW9uZSgwMTEwMzAwKSwJb25lKDAxNzA3MDApLCAiKndBZCIsIG02ODAwMHVwIH0sCi17InN1YnciLAlvbmUoMDExMDEwMCksCW9uZSgwMTcwNzAwKSwgIip3RGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ3IiwJb25lKDAxMTA1MDApLAlvbmUoMDE3MDcwMCksICJEZH5zIiwgbTY4MDAwdXAgfSwKLXsic3VibCIsCW9uZSgwMDUwNjAwKSwJb25lKDAxNzA3MDApLCAiUWQlcyIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YmwiLAlvbmUoMDAwMjIwMCksCW9uZSgwMTc3NzAwKSwgIiNsJHMiLCBtNjgwMDB1cCB9LAoteyJzdWJsIiwJb25lKDAwMDIyMDApLAlvbmUoMDE3NzcwMCksICIjbERzIiwgbWNmIH0sCi17InN1YmwiLAlvbmUoMDExMDcwMCksCW9uZSgwMTcwNzAwKSwgIipsQWQiLCBtNjgwMDB1cCB8IG1jZiB9LAoteyJzdWJsIiwJb25lKDAxMTAyMDApLAlvbmUoMDE3MDcwMCksICIqbERkIiwgbTY4MDAwdXAgfCBtY2YgfSwKLXsic3VibCIsCW9uZSgwMTEwNjAwKSwJb25lKDAxNzA3MDApLCAiRGR+cyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsic3VieGIiLAlvbmUoMDExMDQwMCksCW9uZSgwMTcwNzcwKSwgIkRzRGQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4YiIsCW9uZSgwMTEwNDEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCIsIG02ODAwMHVwIH0sCi17InN1Ynh3IiwJb25lKDAxMTA1MDApLAlvbmUoMDE3MDc3MCksICJEc0RkIiwgbTY4MDAwdXAgfSwKLXsic3VieHciLAlvbmUoMDExMDUxMCksCW9uZSgwMTcwNzcwKSwgIi1zLWQiLCBtNjgwMDB1cCB9LAoteyJzdWJ4bCIsCW9uZSgwMTEwNjAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCIsIG02ODAwMHVwIHwgbWNmIH0sCi17InN1YnhsIiwJb25lKDAxMTA2MTApLAlvbmUoMDE3MDc3MCksICItcy1kIiwgbTY4MDAwdXAgfSwKLQoteyJzd2FwIiwJb25lKDAwNDQxMDApLAlvbmUoMDE3Nzc3MCksICJEcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLS8qIHN3YmVnIGFuZCBzd2JlZ2wgYXJlIG1hZ2ljIGNvbnN0YW50cyB1c2VkIG9uIHN5c1Y2OC4gIFRoZSBjb21waWxlcgotICAgZ2VuZXJhdGVzIHRoZW0gYmVmb3JlIGEgc3dpdGNoIHRhYmxlLiAgVGhleSB0ZWxsIHRoZSBkZWJ1Z2dlciBhbmQKLSAgIGRpc2Fzc2VtYmxlciB0aGF0IGEgc3dpdGNoIHRhYmxlIGZvbGxvd3MuICBUaGUgcGFyYW1ldGVyIGlzIHRoZQotICAgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0YWJsZS4gIHN3YmVnIG1lYW5zIHRoYXQgdGhlIGVudHJpZXMgaW4KLSAgIHRoZSB0YWJsZSBhcmUgd29yZCAoMiBieXRlKSBzaXplZCwgYW5kIHN3YmVnbCBtZWFucyB0aGF0IHRoZQotICAgZW50cmllcyBpbiB0aGUgdGFibGUgYXJlIGxvbmd3b3JkICg0IGJ5dGUpIHNpemVkLiAgKi8KLXsic3diZWciLAlvbmUoMDA0NTM3NCksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgICBtNjgwMDB1cCB8IG1jZiB9LAoteyJzd2JlZ2wiLAlvbmUoMDA0NTM3NSksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgICBtNjgwMDB1cCB8IG1jZiB9LAotCi17InRhcyIsCQlvbmUoMDA0NTMwMCksCQlvbmUoMDE3NzcwMCksICIkcyIsIG02ODAwMHVwIH0sCi0KLSNkZWZpbmUgVEJMMShuYW1lLHNpZ25lZCxyb3VuZCxzaXplKQkJCQkJXAotICB7bmFtZSwgdHdvKDAxNzQwMDAsIChzaWduZWQ8PDExKXwoIXJvdW5kPDwxMCl8KHNpemU8PDYpfDAwMDA0MDApLAlcCi0gICAgIHR3bygwMTc3NzAwLDAxMDc3NzcpLCAiIXNEMSIsIGNwdTMyIH0sCQkJCVwKLSAge25hbWUsIHR3bygwMTc0MDAwLCAoc2lnbmVkPDwxMSl8KCFyb3VuZDw8MTApfChzaXplPDw2KSksCQlcCi0gICAgIHR3bygwMTc3NzcwLDAxMDc3NzApLCAiRHNEM0QxIiwgY3B1MzIgfQotI2RlZmluZSBUQkwobmFtZTEsIG5hbWUyLCBuYW1lMywgcywgcikgXAotICBUQkwxKG5hbWUxLCBzLCByLCAwKSwgVEJMMShuYW1lMiwgcywgciwgMSksIFRCTDEobmFtZTMsIHMsIHIsIDIpCi1UQkwoInRibHNiIiwgInRibHN3IiwgInRibHNsIiwgMSwgMSksCi1UQkwoInRibHNuYiIsICJ0YmxzbnciLCAidGJsc25sIiwgMSwgMCksCi1UQkwoInRibHViIiwgInRibHV3IiwgInRibHVsIiwgMCwgMSksCi1UQkwoInRibHVuYiIsICJ0Ymx1bnciLCAidGJsdW5sIiwgMCwgMCksCi0KLXsidHJhcCIsCW9uZSgwMDQ3MTAwKSwJb25lKDAxNzc3NjApLCAiVHMiLCBtNjgwMDB1cCB8IG1jZiB9LAotCi17InRyYXBjYyIsCW9uZSgwMDUyMzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwY3MiLAlvbmUoMDA1Mjc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGVxIiwJb25lKDAwNTM3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBmIiwJb25lKDAwNTA3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIHwgbWNmIH0sCi17InRyYXBnZSIsCW9uZSgwMDU2Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwZ3QiLAlvbmUoMDA1NzM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGhpIiwJb25lKDAwNTEzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBsZSIsCW9uZSgwMDU3Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbHMiLAlvbmUoMDA1MTc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcGx0IiwJb25lKDAwNTY3NzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXBtaSIsCW9uZSgwMDU1Nzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwbmUiLAlvbmUoMDA1MzM3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLXsidHJhcHBsIiwJb25lKDAwNTUzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXB0IiwJb25lKDAwNTAzNzQpLAlvbmUoMDE3Nzc3NyksICIiLCBtNjgwMjB1cCB8IGNwdTMyIH0sCi17InRyYXB2YyIsCW9uZSgwMDU0Mzc0KSwJb25lKDAxNzc3NzcpLCAiIiwgbTY4MDIwdXAgfCBjcHUzMiB9LAoteyJ0cmFwdnMiLAlvbmUoMDA1NDc3NCksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAyMHVwIHwgY3B1MzIgfSwKLQoteyJ0cmFwY2N3IiwJb25lKDAwNTIzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBjc3ciLAlvbmUoMDA1Mjc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGVxdyIsCW9uZSgwMDUzNzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZnciLAlvbmUoMDA1MDc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzJ8bWNmfSwKLXsidHJhcGdldyIsCW9uZSgwMDU2MzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZ3R3IiwJb25lKDAwNTczNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBoaXciLAlvbmUoMDA1MTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGxldyIsCW9uZSgwMDU3NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbHN3IiwJb25lKDAwNTE3NzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsdHciLAlvbmUoMDA1Njc3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcG1pdyIsCW9uZSgwMDU1NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbmV3IiwJb25lKDAwNTMzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBwbHciLAlvbmUoMDA1NTM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHR3IiwJb25lKDAwNTAzNzIpLAlvbmUoMDE3Nzc3NyksICIjdyIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXB2Y3ciLAlvbmUoMDA1NDM3MiksCW9uZSgwMTc3Nzc3KSwgIiN3IiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZzdyIsCW9uZSgwMDU0NzcyKSwJb25lKDAxNzc3NzcpLCAiI3ciLCBtNjgwMjB1cHxjcHUzMiB9LAotCi17InRyYXBjY2wiLAlvbmUoMDA1MjM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGNzbCIsCW9uZSgwMDUyNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwZXFsIiwJb25lKDAwNTM3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBmbCIsCW9uZSgwMDUwNzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMnxtY2Z9LAoteyJ0cmFwZ2VsIiwJb25lKDAwNTYzNzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBndGwiLAlvbmUoMDA1NzM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGhpbCIsCW9uZSgwMDUxMzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbGVsIiwJb25lKDAwNTc3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBsc2wiLAlvbmUoMDA1MTc3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcGx0bCIsCW9uZSgwMDU2NzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwbWlsIiwJb25lKDAwNTU3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi17InRyYXBuZWwiLAlvbmUoMDA1MzM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHBsbCIsCW9uZSgwMDU1MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdGwiLAlvbmUoMDA1MDM3MyksCW9uZSgwMTc3Nzc3KSwgIiNsIiwgbTY4MDIwdXB8Y3B1MzIgfSwKLXsidHJhcHZjbCIsCW9uZSgwMDU0MzczKSwJb25lKDAxNzc3NzcpLCAiI2wiLCBtNjgwMjB1cHxjcHUzMiB9LAoteyJ0cmFwdnNsIiwJb25lKDAwNTQ3NzMpLAlvbmUoMDE3Nzc3NyksICIjbCIsIG02ODAyMHVwfGNwdTMyIH0sCi0KLXsidHJhcHYiLAlvbmUoMDA0NzE2NiksCW9uZSgwMTc3Nzc3KSwgIiIsIG02ODAwMHVwIH0sCi0KLXsidHN0YiIsCW9uZSgwMDQ1MDAwKSwJb25lKDAxNzc3MDApLCAiO2IiLCBtNjgwMjB1cHxjcHUzMnxtY2YgfSwKLXsidHN0YiIsCW9uZSgwMDQ1MDAwKSwJb25lKDAxNzc3MDApLCAiJGIiLCBtNjgwMDB1cCB9LAoteyJ0c3R3IiwJb25lKDAwNDUxMDApLAlvbmUoMDE3NzcwMCksICIqdyIsIG02ODAyMHVwfGNwdTMyfG1jZiB9LAoteyJ0c3R3IiwJb25lKDAwNDUxMDApLAlvbmUoMDE3NzcwMCksICIkdyIsIG02ODAwMHVwIH0sCi17InRzdGwiLAlvbmUoMDA0NTIwMCksCW9uZSgwMTc3NzAwKSwgIipsIiwgbTY4MDIwdXB8Y3B1MzJ8bWNmIH0sCi17InRzdGwiLAlvbmUoMDA0NTIwMCksCW9uZSgwMTc3NzAwKSwgIiRsIiwgbTY4MDAwdXAgfSwKLQoteyJ1bmxrIiwJb25lKDAwNDcxMzApLAlvbmUoMDE3Nzc3MCksICJBcyIsIG02ODAwMHVwIHwgbWNmIH0sCi0KLXsidW5wayIsCW9uZSgwMTAwNjAwKSwJb25lKDAxNzA3NzApLCAiRHNEZCN3IiwgbTY4MDIwdXAgfSwKLXsidW5wayIsCW9uZSgwMTAwNjEwKSwJb25lKDAxNzA3NzApLCAiLXMtZCN3IiwgbTY4MDIwdXAgfSwKLQoteyJ3ZGRhdGFiIiwJb25lKDAxNzIwMDApLCAgIG9uZSgwMTc3NzAwKSwgIn5zIiwgbWNmIH0sCi17IndkZGF0YXciLAlvbmUoMDE3MjEwMCksICAgb25lKDAxNzc3MDApLCAifnMiLCBtY2YgfSwKLXsid2RkYXRhbCIsCW9uZSgwMTcyMjAwKSwgICBvbmUoMDE3NzcwMCksICJ+cyIsIG1jZiB9LAotCi19OwotCi1jb25zdCBpbnQgbTY4a19udW1vcGNvZGVzID0gc2l6ZW9mIG02OGtfb3Bjb2RlcyAvIHNpemVvZiBtNjhrX29wY29kZXNbMF07Ci0KLS8qIFRoZXNlIGFsaWFzZXMgdXNlZCB0byBiZSBpbiB0aGUgYWJvdmUgdGFibGUsIGVhY2ggb25lIGR1cGxpY2F0aW5nCi0gICBhbGwgb2YgdGhlIGVudHJpZXMgZm9yIGl0cyBwcmltYXJ5IGV4YWN0bHkuICBUaGlzIHRhYmxlIHdhcwotICAgY29uc3RydWN0ZWQgYnkgbWVjaGFuaWNhbCBwcm9jZXNzaW5nIG9mIHRoZSBvcGNvZGUgdGFibGUsIHdpdGggYQotICAgc21hbGwgbnVtYmVyIG9mIHR3ZWFrcyBkb25lIGJ5IGhhbmQuICBUaGVyZSBhcmUgcHJvYmFibHkgYSBsb3QgbW9yZQotICAgYWxpYXNlcyBhYm92ZSB0aGF0IGNvdWxkIGJlIG1vdmVkIGRvd24gaGVyZSwgZXhjZXB0IGZvciB2ZXJ5IG1pbm9yCi0gICBkaWZmZXJlbmNlcy4gICovCi0KLWNvbnN0IHN0cnVjdCBtNjhrX29wY29kZV9hbGlhcyBtNjhrX29wY29kZV9hbGlhc2VzW10gPQotewotICB7ICJhZGQiLAkiYWRkdyIsIH0sCi0gIHsgImFkZGEiLAkiYWRkYXciLCB9LAotICB7ICJhZGRpIiwJImFkZGl3IiwgfSwKLSAgeyAiYWRkcSIsCSJhZGRxdyIsIH0sCi0gIHsgImFkZHgiLAkiYWRkeHciLCB9LAotICB7ICJhc2wiLAkiYXNsdyIsIH0sCi0gIHsgImFzciIsCSJhc3J3IiwgfSwKLSAgeyAiYmhpIiwJImJoaXciLCB9LAotICB7ICJibHMiLAkiYmxzdyIsIH0sCi0gIHsgImJjYyIsCSJiY2N3IiwgfSwKLSAgeyAiYmNzIiwJImJjc3ciLCB9LAotICB7ICJibmUiLAkiYm5ldyIsIH0sCi0gIHsgImJlcSIsCSJiZXF3IiwgfSwKLSAgeyAiYnZjIiwJImJ2Y3ciLCB9LAotICB7ICJidnMiLAkiYnZzdyIsIH0sCi0gIHsgImJwbCIsCSJicGx3IiwgfSwKLSAgeyAiYm1pIiwJImJtaXciLCB9LAotICB7ICJiZ2UiLAkiYmdldyIsIH0sCi0gIHsgImJsdCIsCSJibHR3IiwgfSwKLSAgeyAiYmd0IiwJImJndHciLCB9LAotICB7ICJibGUiLAkiYmxldyIsIH0sCi0gIHsgImJyYSIsCSJicmF3IiwgfSwKLSAgeyAiYnNyIiwJImJzcnciLCB9LAotICB7ICJiaGliIiwJImJoaXMiLCB9LAotICB7ICJibHNiIiwJImJsc3MiLCB9LAotICB7ICJiY2NiIiwJImJjY3MiLCB9LAotICB7ICJiY3NiIiwJImJjc3MiLCB9LAotICB7ICJibmViIiwJImJuZXMiLCB9LAotICB7ICJiZXFiIiwJImJlcXMiLCB9LAotICB7ICJidmNiIiwJImJ2Y3MiLCB9LAotICB7ICJidnNiIiwJImJ2c3MiLCB9LAotICB7ICJicGxiIiwJImJwbHMiLCB9LAotICB7ICJibWliIiwJImJtaXMiLCB9LAotICB7ICJiZ2ViIiwJImJnZXMiLCB9LAotICB7ICJibHRiIiwJImJsdHMiLCB9LAotICB7ICJiZ3RiIiwJImJndHMiLCB9LAotICB7ICJibGViIiwJImJsZXMiLCB9LAotICB7ICJicmFiIiwJImJyYXMiLCB9LAotICB7ICJic3JiIiwJImJzcnMiLCB9LAotICB7ICJiaHMiLAkiYmNjdyIgfSwKLSAgeyAiYmhzcyIsCSJiY2NzIiB9LAotICB7ICJiaHNiIiwJImJjY3MiIH0sCi0gIHsgImJoc3ciLAkiYmNjdyIgfSwKLSAgeyAiYmhzbCIsCSJiY2NsIiB9LAotICB7ICJibG8iLAkiYmNzdyIgfSwKLSAgeyAiYmxvcyIsCSJiY3NzIiB9LAotICB7ICJibG9iIiwJImJjc3MiIH0sCi0gIHsgImJsb3ciLAkiYmNzdyIgfSwKLSAgeyAiYmxvbCIsCSJiY3NsIiB9LAotICB7ICJiciIsCSJicmF3IiwgfSwKLSAgeyAiYnJzIiwJImJyYXMiLCB9LAotICB7ICJicmIiLAkiYnJhcyIsIH0sCi0gIHsgImJydyIsCSJicmF3IiwgfSwKLSAgeyAiYnJsIiwJImJyYWwiLCB9LAotICB7ICJqZm5sdCIsCSJiY2MiLCB9LAkvKiBhcHBhcmVudGx5IGEgc3VuIGFsaWFzICovCi0gIHsgImpmbmd0IiwJImJsZSIsIH0sCS8qIGFwcGFyZW50bHkgYSBzdW4gYWxpYXMgKi8KLSAgeyAiamZlcSIsCSJiZXFzIiwgfSwJLyogYXBwYXJlbnRseSBhIHN1biBhbGlhcyAqLwotICB7ICJiY2hnYiIsCSJiY2hnIiwgfSwKLSAgeyAiYmNoZ2wiLAkiYmNoZyIsIH0sCi0gIHsgImJjbHJiIiwJImJjbHIiLCB9LAotICB7ICJiY2xybCIsCSJiY2xyIiwgfSwKLSAgeyAiYnNldGIiLAkiYnNldCIsIH0sCi0gIHsgImJzZXRsIiwJImJzZXQiLCB9LAotICB7ICJidHN0YiIsCSJidHN0IiwgfSwKLSAgeyAiYnRzdGwiLAkiYnRzdCIsIH0sCi0gIHsgImNhczIiLAkiY2FzMnciLCB9LAotICB7ICJjYXMiLAkiY2FzdyIsIH0sCi0gIHsgImNoazIiLAkiY2hrMnciLCB9LAotICB7ICJjaGsiLAkiY2hrdyIsIH0sCi0gIHsgImNsciIsCSJjbHJ3IiwgfSwKLSAgeyAiY21wMiIsCSJjbXAydyIsIH0sCi0gIHsgImNtcGEiLAkiY21wYXciLCB9LAotICB7ICJjbXBpIiwJImNtcGl3IiwgfSwKLSAgeyAiY21wbSIsCSJjbXBtdyIsIH0sCi0gIHsgImNtcCIsCSJjbXB3IiwgfSwKLSAgeyAiZGJjY3ciLAkiZGJjYyIsIH0sCi0gIHsgImRiY3N3IiwJImRiY3MiLCB9LAotICB7ICJkYmVxdyIsCSJkYmVxIiwgfSwKLSAgeyAiZGJmdyIsCSJkYmYiLCB9LAotICB7ICJkYmdldyIsCSJkYmdlIiwgfSwKLSAgeyAiZGJndHciLAkiZGJndCIsIH0sCi0gIHsgImRiaGl3IiwJImRiaGkiLCB9LAotICB7ICJkYmxldyIsCSJkYmxlIiwgfSwKLSAgeyAiZGJsc3ciLAkiZGJscyIsIH0sCi0gIHsgImRibHR3IiwJImRibHQiLCB9LAotICB7ICJkYm1pdyIsCSJkYm1pIiwgfSwKLSAgeyAiZGJuZXciLAkiZGJuZSIsIH0sCi0gIHsgImRicGx3IiwJImRicGwiLCB9LAotICB7ICJkYnR3IiwJImRidCIsIH0sCi0gIHsgImRidmN3IiwJImRidmMiLCB9LAotICB7ICJkYnZzdyIsCSJkYnZzIiwgfSwKLSAgeyAiZGJocyIsCSJkYmNjIiwgfSwKLSAgeyAiZGJoc3ciLAkiZGJjYyIsIH0sCi0gIHsgImRicmEiLAkiZGJmIiwgfSwKLSAgeyAiZGJyYXciLAkiZGJmIiwgfSwKLSAgeyAidGRpdnNsIiwJImRpdnNsIiwgfSwKLSAgeyAiZGl2cyIsCSJkaXZzdyIsIH0sCi0gIHsgImRpdnUiLAkiZGl2dXciLCB9LAotICB7ICJleHQiLAkiZXh0dyIsIH0sCi0gIHsgImV4dGJ3IiwJImV4dHciLCB9LAotICB7ICJleHR3bCIsCSJleHRsIiwgfSwKLSAgeyAiZmJuZXEiLAkiZmJuZSIsIH0sCi0gIHsgImZic25lcSIsCSJmYnNuZSIsIH0sCi0gIHsgImZkYm5lcSIsCSJmZGJuZSIsIH0sCi0gIHsgImZkYnNuZXEiLAkiZmRic25lIiwgfSwKLSAgeyAiZm1vdmVjciIsCSJmbW92ZWNyeCIsIH0sCi0gIHsgImZtb3ZtIiwJImZtb3ZlbSIsIH0sCi0gIHsgImZzbmVxIiwJImZzbmUiLCB9LAotICB7ICJmc3NuZXEiLAkiZnNzbmUiLCB9LAotICB7ICJmdHJhcG5lcSIsCSJmdHJhcG5lIiwgfSwKLSAgeyAiZnRyYXBzbmVxIiwgImZ0cmFwc25lIiwgfSwKLSAgeyAiZmpuZXEiLAkiZmpuZSIsIH0sCi0gIHsgImZqc25lcSIsCSJmanNuZSIsIH0sCi0gIHsgImptcGwiLAkiam1wIiwgfSwKLSAgeyAiam1wcyIsCSJqbXAiLCB9LAotICB7ICJqc3JsIiwJImpzciIsIH0sCi0gIHsgImpzcnMiLAkianNyIiwgfSwKLSAgeyAibGVhbCIsCSJsZWEiLCB9LAotICB7ICJsc2wiLAkibHNsdyIsIH0sCi0gIHsgImxzciIsCSJsc3J3IiwgfSwKLSAgeyAibWFjIiwJIm1hY3ciIH0sCi0gIHsgIm1vdmVhIiwJIm1vdmVhdyIsIH0sCi0gIHsgIm1vdmVtIiwJIm1vdmVtdyIsIH0sCi0gIHsgIm1vdm1sIiwJIm1vdmVtbCIsIH0sCi0gIHsgIm1vdm13IiwJIm1vdmVtdyIsIH0sCi0gIHsgIm1vdm0iLAkibW92ZW13IiwgfSwKLSAgeyAibW92ZXAiLAkibW92ZXB3IiwgfSwKLSAgeyAibW92cHciLAkibW92ZXB3IiwgfSwKLSAgeyAibW92ZXMiLAkibW92ZXN3IiB9LAotICB7ICJtdWxzIiwJIm11bHN3IiwgfSwKLSAgeyAibXVsdSIsCSJtdWx1dyIsIH0sCi0gIHsgIm1zYWMiLAkibXNhY3ciIH0sCi0gIHsgIm5iY2RiIiwJIm5iY2QiIH0sCi0gIHsgIm5lZyIsCSJuZWd3IiwgfSwKLSAgeyAibmVneCIsCSJuZWd4dyIsIH0sCi0gIHsgIm5vdCIsCSJub3R3IiwgfSwKLSAgeyAicGVhbCIsCSJwZWEiLCB9LAotICB7ICJyb2wiLAkicm9sdyIsIH0sCi0gIHsgInJvciIsCSJyb3J3IiwgfSwKLSAgeyAicm94bCIsCSJyb3hsdyIsIH0sCi0gIHsgInJveHIiLAkicm94cnciLCB9LAotICB7ICJzYmNkYiIsCSJzYmNkIiwgfSwKLSAgeyAic2NjYiIsCSJzY2MiLCB9LAotICB7ICJzY3NiIiwJInNjcyIsIH0sCi0gIHsgInNlcWIiLAkic2VxIiwgfSwKLSAgeyAic2ZiIiwJInNmIiwgfSwKLSAgeyAic2dlYiIsCSJzZ2UiLCB9LAotICB7ICJzZ3RiIiwJInNndCIsIH0sCi0gIHsgInNoaWIiLAkic2hpIiwgfSwKLSAgeyAic2xlYiIsCSJzbGUiLCB9LAotICB7ICJzbHNiIiwJInNscyIsIH0sCi0gIHsgInNsdGIiLAkic2x0IiwgfSwKLSAgeyAic21pYiIsCSJzbWkiLCB9LAotICB7ICJzbmViIiwJInNuZSIsIH0sCi0gIHsgInNwbGIiLAkic3BsIiwgfSwKLSAgeyAic3RiIiwJInN0IiwgfSwKLSAgeyAic3ZjYiIsCSJzdmMiLCB9LAotICB7ICJzdnNiIiwJInN2cyIsIH0sCi0gIHsgInNmZ2UiLAkic2dlIiwgfSwKLSAgeyAic2ZndCIsCSJzZ3QiLCB9LAotICB7ICJzZmxlIiwJInNsZSIsIH0sCi0gIHsgInNmbHQiLAkic2x0IiwgfSwKLSAgeyAic2ZuZXEiLAkic25lIiwgfSwKLSAgeyAic3ViYSIsCSJzdWJhdyIsIH0sCi0gIHsgInN1YmkiLAkic3ViaXciLCB9LAotICB7ICJzdWJxIiwJInN1YnF3IiwgfSwKLSAgeyAic3ViIiwJInN1YnciLCB9LAotICB7ICJzdWJ4IiwJInN1Ynh3IiwgfSwKLSAgeyAic3dhcHciLAkic3dhcCIsIH0sCi0gIHsgInRhc2IiLAkidGFzIiwgfSwKLSAgeyAidHBjYyIsCSJ0cmFwY2MiLCB9LAotICB7ICJ0Y2MiLAkidHJhcGNjIiwgfSwKLSAgeyAidHN0IiwJInRzdHciLCB9LAotICB7ICJqYnJhIiwJImpyYSIsIH0sCi0gIHsgImpiaGkiLAkiamhpIiwgfSwKLSAgeyAiamJscyIsCSJqbHMiLCB9LAotICB7ICJqYmNjIiwJImpjYyIsIH0sCi0gIHsgImpiY3MiLAkiamNzIiwgfSwKLSAgeyAiamJuZSIsCSJqbmUiLCB9LAotICB7ICJqYmVxIiwJImplcSIsIH0sCi0gIHsgImpidmMiLAkianZjIiwgfSwKLSAgeyAiamJ2cyIsCSJqdnMiLCB9LAotICB7ICJqYnBsIiwJImpwbCIsIH0sCi0gIHsgImpibWkiLAkiam1pIiwgfSwKLSAgeyAiamJnZSIsCSJqZ2UiLCB9LAotICB7ICJqYmx0IiwJImpsdCIsIH0sCi0gIHsgImpiZ3QiLAkiamd0IiwgfSwKLSAgeyAiamJsZSIsCSJqbGUiLCB9LAotICB7ICJtb3ZxbCIsCSJtb3ZlcSIsIH0sCi0gIHsgIm1vdmVxbCIsCSJtb3ZlcSIsIH0sCi0gIHsgIm1vdmwiLAkibW92ZWwiLCB9LAotICB7ICJtb3ZxIiwJIm1vdmVxIiwgfSwKLSAgeyAibW92YWwiLAkibW92ZWFsIiwgfSwKLSAgeyAibW92YXciLAkibW92ZWF3IiwgfSwKLSAgeyAibW92YiIsCSJtb3ZlYiIsIH0sCi0gIHsgIm1vdmMiLAkibW92ZWMiLCB9LAotICB7ICJtb3ZlY2wiLAkibW92ZWMiLCB9LAotICB7ICJtb3ZwbCIsCSJtb3ZlcGwiLCB9LAotICB7ICJtb3Z3IiwJIm1vdmV3IiwgfSwKLSAgeyAibW92c2IiLAkibW92ZXNiIiwgfSwKLSAgeyAibW92c2wiLAkibW92ZXNsIiwgfSwKLSAgeyAibW92c3ciLAkibW92ZXN3IiwgfSwKLQotICB7ICJ0ZGl2dWwiLAkiZGl2dWwiLCB9LAkvKiBmb3IgbTY4ay1zdnI0ICovCi0gIHsgImZtb3ZiIiwJImZtb3ZlYiIsIH0sCi0gIHsgImZzbW92YiIsCSJmc21vdmViIiwgfSwKLSAgeyAiZmRtb3ZiIiwJImZkbW92ZWIiLCB9LAotICB7ICJmbW92ZCIsCSJmbW92ZWQiLCB9LAotICB7ICJmc21vdmQiLAkiZnNtb3ZlZCIsIH0sCi0gIHsgImZtb3ZsIiwJImZtb3ZlbCIsIH0sCi0gIHsgImZzbW92bCIsCSJmc21vdmVsIiwgfSwKLSAgeyAiZmRtb3ZsIiwJImZkbW92ZWwiLCB9LAotICB7ICJmbW92cCIsCSJmbW92ZXAiLCB9LAotICB7ICJmc21vdnAiLAkiZnNtb3ZlcCIsIH0sCi0gIHsgImZkbW92cCIsCSJmZG1vdmVwIiwgfSwKLSAgeyAiZm1vdnMiLAkiZm1vdmVzIiwgfSwKLSAgeyAiZnNtb3ZzIiwJImZzbW92ZXMiLCB9LAotICB7ICJmZG1vdnMiLAkiZmRtb3ZlcyIsIH0sCi0gIHsgImZtb3Z3IiwJImZtb3ZldyIsIH0sCi0gIHsgImZzbW92dyIsCSJmc21vdmV3IiwgfSwKLSAgeyAiZmRtb3Z3IiwJImZkbW92ZXciLCB9LAotICB7ICJmbW92eCIsCSJmbW92ZXgiLCB9LAotICB7ICJmc21vdngiLAkiZnNtb3ZleCIsIH0sCi0gIHsgImZkbW92eCIsCSJmZG1vdmV4IiwgfSwKLSAgeyAiZm1vdmNyIiwJImZtb3ZlY3IiLCB9LAotICB7ICJmbW92Y3J4IiwJImZtb3ZlY3J4IiwgfSwKLSAgeyAiZnRlc3RiIiwJImZ0c3RiIiwgfSwKLSAgeyAiZnRlc3RkIiwJImZ0c3RkIiwgfSwKLSAgeyAiZnRlc3RsIiwJImZ0c3RsIiwgfSwKLSAgeyAiZnRlc3RwIiwJImZ0c3RwIiwgfSwKLSAgeyAiZnRlc3RzIiwJImZ0c3RzIiwgfSwKLSAgeyAiZnRlc3R3IiwJImZ0c3R3IiwgfSwKLSAgeyAiZnRlc3R4IiwJImZ0c3R4IiwgfSwKLX07Ci0KLWNvbnN0IGludCBtNjhrX251bWFsaWFzZXMgPQotICBzaXplb2YgbTY4a19vcGNvZGVfYWxpYXNlcyAvIHNpemVvZiBtNjhrX29wY29kZV9hbGlhc2VzWzBdOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tODhrLWRpcy5jIGIvb3Bjb2Rlcy9tODhrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY2Yjg3Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvbTg4ay1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKiBQcmludCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBNb3Rvcm9sYSA4ODAwMCwgZm9yIEdEQiBhbmQgR05VIEJpbnV0aWxzLgotICAgQ29weXJpZ2h0IChjKSAxOTg2LCAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkzLCAxOTk4Ci0gICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IERhdGEgR2VuZXJhbCBDb3Jwb3JhdGlvbiwgTm92ZW1iZXIgMTk4OS4KLSAgIFBhcnRpYWxseSBkZXJpdmVkIGZyb20gYW4gZWFybGllciBwcmludGNtZC5jLgotCi1UaGlzIGZpbGUgaXMgcGFydCBvZiBHREIgYW5kIHRoZSBHTlUgQmludXRpbHMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL204OGsuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotSU5TVEFCICAqaGFzaHRhYmxlW0hBU0hWQUxdID0gezB9OwotCi1zdGF0aWMgaW50Ci1tODhrZGlzIFBBUkFNUyAoKGJmZF92bWEsIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIHZvaWQKLXByaW50b3AgUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgT1BTUEVDICosCi0JCSB1bnNpZ25lZCBsb25nLCBiZmRfdm1hLCBpbnQpKTsKLQotc3RhdGljIHZvaWQKLWluaXRfZGlzYXNtIFBBUkFNUyAoKHZvaWQpKTsKLQotc3RhdGljIHZvaWQKLWluc3RhbGwgUEFSQU1TICgoSU5TVEFCICppbnN0cHRyKSk7Ci0KLS8qCi0qCQlEaXNhc3NlbWJsZSBhbiBNODgwMDAgSW5zdHJ1Y3Rpb24KLSoKLSoKLSogICAgICAgVGhpcyBtb2R1bGUgZGVjb2RlcyB0aGUgaW5zdHJ1Y3Rpb24gYXQgbWVtYWRkci4KLSoKLSoJCQlSZXZpc2lvbiBIaXN0b3J5Ci0qCi0qICAgICAgIFJldmlzaW9uIDEuMCAgICAxMS8wOC84NSAgICAgICAgQ3JlYXRpb24gZGF0ZSBieSBNb3Rvcm9sYQotKgkJCTA1LzExLzg5CVIuIFRyYXdpY2sgYWRhcHRlZCB0byBHREIgaW50ZXJmYWNlLgotKgkJCTA3LzEyLzkzCUlhbiBMYW5jZSBUYXlsb3IgdXBkYXRlZCB0bwotKgkJCQkJYmludXRpbHMgaW50ZXJmYWNlLgotKi8KLQotaW50Ci1wcmludF9pbnNuX204OGsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBJbnN0cnVjdGlvbiBhZGRyZXNzZXMgbWF5IGhhdmUgbG93IHR3byBiaXRzIHNldC4gQ2xlYXIgdGhlbS4JKi8KLSAgbWVtYWRkciAmPX4gKGJmZF92bWEpIDM7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICByZXR1cm4gbTg4a2RpcyAobWVtYWRkciwgYmZkX2dldGIzMiAoYnVmZmVyKSwgaW5mbyk7Ci19Ci0KLS8qCi0gKiBkaXNhc3NlbWJsZSB0aGUgaW5zdHJ1Y3Rpb24gaW4gJ2luc3RydWN0aW9uJy4KLSAqICdwYycgc2hvdWxkIGJlIHRoZSBhZGRyZXNzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24sIGl0IHdpbGwKLSAqICAgYmUgdXNlZCB0byBwcmludCB0aGUgdGFyZ2V0IGFkZHJlc3MgaWYgdGhpcyBpcyBhIHJlbGF0aXZlIGp1bXAgb3IgY2FsbAotICogdGhlIGRpc2Fzc2VtYmxlZCBpbnN0cnVjdGlvbiBpcyB3cml0dGVuIHRvICdpbmZvJy4KLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBieXRlcy4KLSAqLwotCi1zdGF0aWMgaW50Ci1tODhrZGlzIChwYywgaW5zdHJ1Y3Rpb24sIGluZm8pCi0gICAgIGJmZF92bWEgcGM7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zdHJ1Y3Rpb247Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBzdGF0aWMgaW50IGloYXNodGFiX2luaXRpYWxpemVkID0gMDsKLSAgdW5zaWduZWQgaW50IG9wY29kZTsKLSAgSU5TVEFCICplbnRyeV9wdHI7Ci0gIGludCBvcG1hc2s7Ci0gIHVuc2lnbmVkIGludCBjbGFzczsKLQotICBpZiAoISBpaGFzaHRhYl9pbml0aWFsaXplZCkKLSAgICBpbml0X2Rpc2FzbSAoKTsKLQotICAvKiBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIG1hc2sgdG8gaXNvbGF0ZSB0aGUgb3Bjb2RlICovCi0gIG9wbWFzayA9IERFRk1BU0s7Ci0gIGNsYXNzID0gaW5zdHJ1Y3Rpb24gJiBERUZNQVNLOwotICBpZiAoKGNsYXNzID49IFNGVTApICYmIChjbGFzcyA8PSBTRlU3KSkKLSAgICB7Ci0gICAgICBpZiAoaW5zdHJ1Y3Rpb24gPCBTRlUxKQotCW9wbWFzayA9IENUUkxNQVNLOwotICAgICAgZWxzZQotCW9wbWFzayA9IFNGVU1BU0s7Ci0gICAgfQotICBlbHNlIGlmIChjbGFzcyA9PSBSUlIpCi0gICAgb3BtYXNrID0gUlJSTUFTSzsKLSAgZWxzZSBpZiAoY2xhc3MgPT0gUlJJMTApCi0gICAgb3BtYXNrID0gUlJJMTBNQVNLOwotCi0gIC8qIGlzb2xhdGUgdGhlIG9wY29kZSAqLwotICBvcGNvZGUgPSBpbnN0cnVjdGlvbiAmIG9wbWFzazsKLQotICAvKiBzZWFyY2ggdGhlIGhhc2ggdGFibGUgd2l0aCB0aGUgaXNvbGF0ZWQgb3Bjb2RlICovCi0gIGZvciAoZW50cnlfcHRyID0gaGFzaHRhYmxlW29wY29kZSAlIEhBU0hWQUxdOwotICAgICAgIChlbnRyeV9wdHIgIT0gTlVMTCkgJiYgKGVudHJ5X3B0ci0+b3Bjb2RlICE9IG9wY29kZSk7Ci0gICAgICAgZW50cnlfcHRyID0gZW50cnlfcHRyLT5uZXh0KQotICAgIDsKLQotICBpZiAoZW50cnlfcHRyID09IE5VTEwpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJ3b3JkXHQlMDh4IiwgaW5zdHJ1Y3Rpb24pOwotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIGVudHJ5X3B0ci0+bW5lbW9uaWMpOwotICAgICAgcHJpbnRvcCAoaW5mbywgJihlbnRyeV9wdHItPm9wMSksIGluc3RydWN0aW9uLCBwYywgMSk7Ci0gICAgICBwcmludG9wIChpbmZvLCAmKGVudHJ5X3B0ci0+b3AyKSwgaW5zdHJ1Y3Rpb24sIHBjLCAwKTsKLSAgICAgIHByaW50b3AgKGluZm8sICYoZW50cnlfcHRyLT5vcDMpLCBpbnN0cnVjdGlvbiwgcGMsIDApOwotICAgIH0KLQotICByZXR1cm4gNDsKLX0KLQwKLS8qCi0qICAgICAgICAgICAgICAgICAgICAgIERlY29kZSBhbiBPcGVyYW5kIG9mIGFuIEluc3RydWN0aW9uCi0qCi0qCQkJRnVuY3Rpb25hbCBEZXNjcmlwdGlvbgotKgotKiAgICAgICBUaGlzIG1vZHVsZSBmb3JtYXRzIGFuZCB3cml0ZXMgYW4gb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiB0byBpbmZvCi0qICAgICAgIGJhc2VkIG9uIHRoZSBvcGVyYW5kIHNwZWNpZmljYXRpb24uICBXaGVuIHRoZSBmaXJzdCBmbGFnIGlzIHNldCB0aGlzCi0qICAgICAgIGlzIHRoZSBmaXJzdCBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uLiAgVW5kZWZpbmVkIG9wZXJhbmQgdHlwZXMKLSogICAgICAgY2F1c2UgYSA8ZGlzIGVycm9yPiBtZXNzYWdlLgotKgotKgkJCVBhcmFtZXRlcnMKLSoJZGlzYXNzZW1ibGVfaW5mbwl3aGVyZSB0aGUgb3BlcmFuZCBtYXkgYmUgcHJpbnRlZAotKiAgICAgICBPUFNQRUMgICpvcHB0ciAgICAgICAgICBQb2ludGVyIHRvIGFuIG9wZXJhbmQgc3BlY2lmaWNhdGlvbgotKiAgICAgICBVSU5UICAgIGluc3QgICAgICAgICAgICBJbnN0cnVjdGlvbiBmcm9tIHdoaWNoIG9wZXJhbmQgaXMgZXh0cmFjdGVkCi0qCVVJTlQgICAgcGMJCVBDIG9mIGluc3RydWN0aW9uOyB1c2VkIGZvciBwYy1yZWxhdGl2ZSBkaXNwLgotKiAgICAgICBpbnQgICAgIGZpcnN0ICAgICAgICAgICBGbGFnIHdoaWNoIGlmIG5vbnplcm8gaW5kaWNhdGVzIHRoZSBmaXJzdAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uCi0qCi0qCQkJT3V0cHV0Ci0qCi0qICAgICAgIFRoZSBvcGVyYW5kIHNwZWNpZmllZCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gYW5kIGlzCi0qICAgICAgIHdyaXR0ZW4gdG8gYnVmIGluIHRoZSBmb3JtYXQgc3BlY2lmaWVkLiBUaGUgb3BlcmFuZCBpcyBwcmVjZWRlZAotKiAgICAgICBieSBhIGNvbW1hIGlmIGl0IGlzIG5vdCB0aGUgZmlyc3Qgb3BlcmFuZCBvZiBhbiBpbnN0cnVjdGlvbiBhbmQgaXQKLSogICAgICAgaXMgbm90IGEgcmVnaXN0ZXIgaW5kaXJlY3QgZm9ybS4gIFJlZ2lzdGVycyBhcmUgcHJlY2VkZWQgYnkgJ3InIGFuZAotKiAgICAgICBoZXggdmFsdWVzIGJ5ICcweCcuCi0qCi0qCQkJUmV2aXNpb24gSGlzdG9yeQotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSovCi0KLXN0YXRpYyB2b2lkCi1wcmludG9wIChpbmZvLCBvcHB0ciwgaW5zdCwgcGMsIGZpcnN0KQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgT1BTUEVDICpvcHB0cjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnN0OwotICAgICBiZmRfdm1hIHBjOwotICAgICBpbnQgZmlyc3Q7Ci17Ci0gIGludCBleHRyYWN0ZWRfZmllbGQ7Ci0gIGNoYXIgKmNvbmRfbWFza19zeW07Ci0KLSAgaWYgKG9wcHRyLT53aWR0aCA9PSAwKQotICAgIHJldHVybjsKLQotICBpZiAoISBmaXJzdCkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKG9wcHRyLT50eXBlKQotCXsKLQljYXNlIFJFR1NDOgotCWNhc2UgQ09OVDoKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgc3dpdGNoIChvcHB0ci0+dHlwZSkKLSAgICB7Ci0gICAgY2FzZSBDUlJFRzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiY3IlZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZDUlJFRzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZmNyJWQiLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUdTQzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiW3IlZF0iLAotCQkJICAgICBVRVhUIChpbnN0LCBvcHB0ci0+b2Zmc2V0LCBvcHB0ci0+d2lkdGgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSRUc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInIlZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFhSRUc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgInglZCIsCi0JCQkgICAgIFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhFWDoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICBpZiAoZXh0cmFjdGVkX2ZpZWxkID09IDApCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIwIik7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCUwMngiLCBleHRyYWN0ZWRfZmllbGQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERFQzoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgZXh0cmFjdGVkX2ZpZWxkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBDT05ETUFTSzoKLSAgICAgIGV4dHJhY3RlZF9maWVsZCA9IFVFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCk7Ci0gICAgICBzd2l0Y2ggKGV4dHJhY3RlZF9maWVsZCAmIDB4MGYpCi0JewotCWNhc2UgMHgxOiBjb25kX21hc2tfc3ltID0gImd0MCI7IGJyZWFrOwotCWNhc2UgMHgyOiBjb25kX21hc2tfc3ltID0gImVxMCI7IGJyZWFrOwotCWNhc2UgMHgzOiBjb25kX21hc2tfc3ltID0gImdlMCI7IGJyZWFrOwotCWNhc2UgMHhjOiBjb25kX21hc2tfc3ltID0gImx0MCI7IGJyZWFrOwotCWNhc2UgMHhkOiBjb25kX21hc2tfc3ltID0gIm5lMCI7IGJyZWFrOwotCWNhc2UgMHhlOiBjb25kX21hc2tfc3ltID0gImxlMCI7IGJyZWFrOwotCWRlZmF1bHQ6IGNvbmRfbWFza19zeW0gPSBOVUxMOyBicmVhazsKLQl9Ci0gICAgICBpZiAoY29uZF9tYXNrX3N5bSAhPSBOVUxMKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBjb25kX21hc2tfc3ltKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiV4IiwgZXh0cmFjdGVkX2ZpZWxkKTsKLSAgICAgIGJyZWFrOwotCQkJCi0gICAgY2FzZSBQQ1JFTDoKLSAgICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKQotCShwYyArICg0ICogKFNFWFQgKGluc3QsIG9wcHRyLT5vZmZzZXQsIG9wcHRyLT53aWR0aCkpKSwKLQkgaW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQ09OVDoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQsciVkIiwKLQkJCSAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgNSksCi0JCQkgICAgIFVFWFQgKGluc3QsIChvcHB0ci0+b2Zmc2V0KSArIDUsIDUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBCRjoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJWQ8JWQ+IiwKLQkJCSAgICAgIFVFWFQgKGluc3QsIChvcHB0ci0+b2Zmc2V0KSArIDUsIDUpLAotCQkJICAgICAgVUVYVCAoaW5zdCwgb3BwdHItPm9mZnNldCwgNSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCBfKCIjIDxkaXMgZXJyb3I6ICUwOHg+IiksIGluc3QpOwotICAgIH0KLX0KLQotLyoKLSogICAgICAgICAgICAgICAgIEluaXRpYWxpemUgdGhlIERpc2Fzc2VtYmxlciBJbnN0cnVjdGlvbiBUYWJsZQotKgotKiAgICAgICBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIGFuZCBpbnN0cnVjdGlvbiB0YWJsZSBmb3IgdGhlIGRpc2Fzc2VtYmxlci4KLSogICAgICAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIG9uY2UgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIGRpc2FzbSgpLgotKgotKgkJCVBhcmFtZXRlcnMKLSoKLSoJCQlPdXRwdXQKLSoKLSogICAgICAgSWYgdGhlIGRlYnVnIG9wdGlvbiBpcyBzZWxlY3RlZCwgY2VydGFpbiBzdGF0aXN0aWNzIGFib3V0IHRoZSBoYXNoaW5nCi0qICAgICAgIGRpc3RyaWJ1dGlvbiBhcmUgd3JpdHRlbiB0byBzdGRvdXQuCi0qCi0qCQkJUmV2aXNpb24gSGlzdG9yeQotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSovCi0KLXN0YXRpYyB2b2lkCi1pbml0X2Rpc2FzbSAoKQotewotICAgaW50IGksIHNpemU7Ci0KLSAgIGZvciAoaSA9IDA7IGkgPCBIQVNIVkFMOyBpKyspCi0gICAgIGhhc2h0YWJsZVtpXSA9IE5VTEw7Ci0KLSAgIHNpemUgPSBzaXplb2YgKGluc3RydWN0aW9ucykgLyBzaXplb2YgKElOU1RBQik7Ci0gICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICBpbnN0YWxsICgmaW5zdHJ1Y3Rpb25zW2ldKTsKLX0KLQotLyoKLSogICAgICAgSW5zZXJ0IGFuIGluc3RydWN0aW9uIGludG8gdGhlIGRpc2Fzc2VtYmxlciB0YWJsZSBieSBoYXNoaW5nIHRoZQotKiAgICAgICBvcGNvZGUgYW5kIGluc2VydGluZyBpdCBpbnRvIHRoZSBsaW5rZWQgbGlzdCBmb3IgdGhhdCBoYXNoIHZhbHVlLgotKgotKgkJCVBhcmFtZXRlcnMKLSoKLSogICAgICAgSU5TVEFCICppbnN0cHRyICAgICAgICAgUG9pbnRlciB0byB0aGUgZW50cnkgaW4gdGhlIGluc3RydWN0aW9uIHRhYmxlCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGluc3RhbGxlZAotKgotKiAgICAgICBSZXZpc2lvbiAxLjAgICAgMTEvMDgvODUgICAgICAgIENyZWF0aW9uIGRhdGUKLSoJCQkwNS8xMS84OQlSLiBUUkFXSUNLIEFEQVBURUQgRlJPTSBNT1RPUk9MQQotKi8KLQotc3RhdGljIHZvaWQKLWluc3RhbGwgKGluc3RwdHIpCi0gICAgIElOU1RBQiAqaW5zdHB0cjsKLXsKLSAgdW5zaWduZWQgaW50IGk7Ci0KLSAgaSA9IChpbnN0cHRyLT5vcGNvZGUpICUgSEFTSFZBTDsKLSAgaW5zdHB0ci0+bmV4dCA9IGhhc2h0YWJsZVtpXTsKLSAgaGFzaHRhYmxlW2ldID0gaW5zdHB0cjsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWFrZWZpbGUudm1zIGIvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODcwNDguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tYWtlZmlsZS52bXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciBsaWJvcGNvZGVzIHVuZGVyIG9wZW5WTVMgVkFYIGFuZCBBbHBoYQotIwotIyBGb3IgdXNlIHdpdGggZ251LW1ha2UgZm9yIHZtcwotIwotIyBDcmVhdGVkIGJ5IEtsYXVzIEsiYW1wZiwga2thZW1wZkBwcm9naXMuZGUKLSMKLSMKLWlmZXEgKCQoQVJDSCksYWxwaGEpCi1PQkpTPWFscGhhLWRpcy5vYmosYWxwaGEtb3BjLm9iaixkaXMtYnVmLm9iaixkaXNhc3NlbWJsZS5vYmoKLUZPUk1BVD1PQkpfRVZBWAotQVJDSERFRj0iQVJDSF9hbHBoYSIKLWVsc2UKLU9CSlM9dmF4LWRpcy5vYmosZGlzLWJ1Zi5vYmosZGlzYXNzZW1ibGUub2JqCi1GT1JNQVQ9T0JKX1ZBWAotQVJDSERFRj0iQVJDSF92YXgiCi1lbmRpZgotCi1pZmVxICgkKENDKSxnY2MpCi1ERUZTPS9kZWZpbmU9KCQoRk9STUFUKSkKLUNGTEFHUz0vaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpCi1lbHNlCi1ERUZTPS9kZWZpbmU9KCQoRk9STUFUKSwiY29uc3Q9IikKLUNGTEFHUz0vbm9vcHQvZGVidWcvaW5jbHVkZT0oW10sWy0uaW5jbHVkZV0sWy0uYmZkXSkkKERFRlMpXAotL3dhcm5pbmdzPWRpc2FibGU9KG1pc3NpbmdyZXR1cm4saW1wbGljaXRmdW5jLGxvbmdleHRlcm4pCi1lbmRpZgotCi1saWJvcGNvZGVzLm9sYjogc3lzZGVwLmggJChPQkpTKQotCXB1cmdlCi0JbGliL2NyZWF0ZSBsaWJvcGNvZGVzICoub2JqCi0KLWRpc2Fzc2VtYmxlLm9iajogZGlzYXNzZW1ibGUuYwotCSQoQ0MpJChDRkxBR1MpL2RlZmluZT0oJChBUkNIREVGKSkgJDwKLQotc3lzZGVwLmg6IFstLmJmZC5ob3N0c10kKEFSQ0gpdm1zLmgKLQkkKENQKSAkPCAkQAotCi1jbGVhbjoKLQkkJCBwdXJnZQotCSQoUk0pICoub2JqOwotCSQoUk0pIHN5c2RlcC5oOwotCSQoUk0pIGxpYm9wY29kZXMub2xiOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tY29yZS1kaXMuYyBiL29wY29kZXMvbWNvcmUtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NjEyYTIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tY29yZS1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKiBEaXNhc3NlbWJsZSBNb3Rvcm9sbGEgTSpDb3JlIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2RlZmluZSBTVEFUSUNfVEFCTEUKLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0KLSNpbmNsdWRlICJtY29yZS1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLS8qIE1hc2sgZm9yIGVhY2ggbWNvcmVfb3BjbGFzczogKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpbXNrW10gPQotewotICAgIC8qIE8wICAqLyAweEZGRkYsCi0gICAgLyogT1QgICovIDB4RkZGQywKLSAgICAvKiBPMSAgKi8gMHhGRkYwLAotICAgIC8qIE9DICAqLyAweEZGRTAsCi0gICAgLyogTzIgICovIDB4RkYwMCwKLSAgICAvKiBYMSAgKi8gMHhGRkYwLAotICAgIC8qIE9JICAqLyAweEZFMDAsCi0gICAgLyogT0IgICovIDB4RkUwMCwKLQkgICAgICAKLSAgICAvKiBPTWEgKi8gMHhGRkYwLAotICAgIC8qIFNJICAqLyAweEZFMDAsCi0gICAgLyogSTcgICovIDB4RjgwMCwKLSAgICAvKiBMUyAgKi8gMHhGMDAwLAotICAgIC8qIEJSICAqLyAweEY4MDAsCi0gICAgLyogQkwgICovIDB4RkYwMCwKLSAgICAvKiBMUiAgKi8gMHhGMDAwLAotICAgIC8qIExKICAqLyAweEZGMDAsCi0JICAgICAgCi0gICAgLyogUk0gICovIDB4RkZGMCwKLSAgICAvKiBSUSAgKi8gMHhGRkYwLAotICAgIC8qIEpTUiAqLyAweEZGRjAsCi0gICAgLyogSk1QICovIDB4RkZGMCwKLSAgICAvKiBPQlJhKi8gMHhGRkYwLAotICAgIC8qIE9CUmIqLyAweEZGODAsCi0gICAgLyogT0JSYyovIDB4RkYwMCwKLSAgICAvKiBPQlIyKi8gMHhGRTAwLAotCSAgICAgIAotICAgIC8qIE8xUjEqLyAweEZGRjAsCi0gICAgLyogT01iICovIDB4RkY4MCwKLSAgICAvKiBPTWMgKi8gMHhGRjAwLAotICAgIC8qIFNJYSAqLyAweEZFMDAsCi0KLS8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8KLSAgLyogTVVMU0ggKi8gMHhGRjAwLAotLyogZW5kLXNhbml0aXplLW0zNDAgKi8KLQkJIAotICAgIC8qIEpDICAqLyAwLAkJLyogSkMsSlUsSkwgZG9uJ3QgYXBwZWFyIGluIG9iamVjdCAqLwotICAgIC8qIEpVICAqLyAwLAotICAgIC8qIEpMICAqLyAwLAotICAgIC8qIFJTSSAqLyAwLAotICAgIC8qIERPMjEqLyAwLAotICAgIC8qIE9CMiAqLyAwIAkJLyogT0IyIHdvbid0IGFwcGVhciBpbiBvYmplY3QuICovCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGdybmFtZVtdID0KLXsKLSAicjAiLCAgInIxIiwgICJyMiIsICAicjMiLCAgInI0IiwgICJyNSIsICAicjYiLCAgInI3IiwKLSAicjgiLCAgInI5IiwgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgWFtdID0gIj8/IjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjcm5hbWVbXSA9Ci17Ci0gICJwc3IiLCAgInZiciIsICJlcHNyIiwgImZwc3IiLCAiZXBjIiwgICJmcGMiLCAgInNzMCIsICAic3MxIiwKLSAgInNzMiIsICAic3MzIiwgInNzNCIsICAiZ2NyIiwgICJnc3IiLCAgICAgWCwgICAgICBYLCAgICAgIFgsCi0gICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgIFgsICAgICAgWCwgICAgICBYLAotICAgICBYLCAgICAgIFgsICAgICAgWCwgICAgICBYLCAgICAgIFgsICAgICBYLCAgICAgIFgsICAgICAgWAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGlzaXpbXSA9IHsgMiwgMCwgMSwgMCB9OwotCi1pbnQgCi1wcmludF9pbnNuX21jb3JlIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciAgICAgICBpYnl0ZXNbNF07Ci0gIGZwcmludGZfZnR5cGUgICAgICAgZnByaW50ZiA9IGluZm8tPmZwcmludGZfZnVuYzsKLSAgdm9pZCAqICAgICAgICAgICAgICBzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIHVuc2lnbmVkIHNob3J0ICAgICAgaW5zdDsKLSAgbWNvcmVfb3Bjb2RlX2luZm8gKiBvcDsKLSAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7Ci0KLSAgaW5mby0+Ynl0ZXNfcGVyX2NodW5rID0gMjsKLQotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBpYnl0ZXMsIDIsIGluZm8pOwotCi0gIGlmIChzdGF0dXMgIT0gMCkgCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0vKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovCi0gIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0vKiBlbmQtc2FuaXRpemUtbTM0MCAqLwotICAgIGluc3QgPSAoaWJ5dGVzWzBdIDw8IDgpIHwgaWJ5dGVzWzFdOwotLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLwotICBlbHNlIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgaW5zdCA9IChpYnl0ZXNbMV0gPDwgOCkgfCBpYnl0ZXNbMF07Ci0gIGVsc2UKLSAgICBhYm9ydCAoKTsKLS8qIGVuZC1zYW5pdGl6ZS1tMzQwICovCi0KLSAgLyogSnVzdCBhIGxpbmVhciBzZWFyY2ggb2YgdGhlIHRhYmxlLiAgKi8KLSAgZm9yIChvcCA9IG1jb3JlX3RhYmxlOyBvcC0+bmFtZSAhPSAwOyBvcCArKykKLSAgICBpZiAob3AtPmluc3QgPT0gKGluc3QgJiBpbXNrW29wLT5vcGNsYXNzXSkpCi0gICAgICBicmVhazsKLQotICBpZiAob3AtPm5hbWUgPT0gMCkKLSAgICBmcHJpbnRmIChzdHJlYW0sICIuc2hvcnQgMHglMDR4IiwgaW5zdCk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyICogbmFtZSA9IGdybmFtZVtpbnN0ICYgMHgwRl07Ci0gICAgICAKLSAgICAgIGZwcmludGYgKHN0cmVhbSwgIiVzIiwgb3AtPm5hbWUpOwotICAgICAgCi0gICAgICBzd2l0Y2ggKG9wLT5vcGNsYXNzKQotCXsKLQljYXNlIE8wOiBicmVhazsKLQljYXNlIE9UOiBmcHJpbnRmIChzdHJlYW0sICJcdCVkIiwgaW5zdCAmIDB4Myk7IGJyZWFrOwotCWNhc2UgTzE6Ci0JY2FzZSBKTVA6Ci0JY2FzZSBKU1I6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBPQzogIGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVzIiwgbmFtZSwgY3JuYW1lWyhpbnN0ID4+IDQpICYgMHgxRl0pOyBicmVhazsKLQljYXNlIE8xUjE6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsIHIxIiwgbmFtZSk7IGJyZWFrOwotLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLwotCWNhc2UgTVVMU0g6Ci0vKiBlbmQtc2FuaXRpemUtbTM0MCAqLwotCWNhc2UgTzI6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVzIiwgbmFtZSwgZ3JuYW1lWyhpbnN0ID4+IDQpICYgMHhGXSk7IGJyZWFrOwotCWNhc2UgWDE6IGZwcmludGYgKHN0cmVhbSwgIlx0cjEsICVzIiwgbmFtZSk7IGJyZWFrOwotCWNhc2UgT0k6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVkIiwgbmFtZSwgKChpbnN0ID4+IDQpICYgMHgxRikgKyAxKTsgYnJlYWs7Ci0JY2FzZSBSTTogZnByaW50ZiAoc3RyZWFtLCAiXHQlcy1yMTUsIChyMCkiLCBuYW1lKTsgYnJlYWs7Ci0JY2FzZSBSUTogZnByaW50ZiAoc3RyZWFtLCAiXHRyNC1yNywgKCVzKSIsIG5hbWUpOyBicmVhazsKLQljYXNlIE9COgotCWNhc2UgT0JSYToKLQljYXNlIE9CUmI6Ci0JY2FzZSBPQlJjOgotCWNhc2UgU0k6Ci0JY2FzZSBTSWE6Ci0JY2FzZSBPTWE6Ci0JY2FzZSBPTWI6Ci0JY2FzZSBPTWM6IGZwcmludGYgKHN0cmVhbSwgIlx0JXMsICVkIiwgbmFtZSwgKGluc3QgPj4gNCkgJiAweDFGKTsgYnJlYWs7Ci0JY2FzZSBJNzogZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgJWQiLCBuYW1lLCAoaW5zdCA+PiA0KSAmIDB4N0YpOyBicmVhazsKLQljYXNlIExTOiBmcHJpbnRmIChzdHJlYW0sICJcdCVzLCAoJXMsICVkKSIsIGdybmFtZVsoaW5zdCA+PiA4KSAmIDB4Rl0sCi0JCQkgIG5hbWUsICgoaW5zdCA+PiA0KSAmIDB4RikgPDwgaXNpelsoaW5zdCA+PiAxMykgJiAzXSk7Ci0JICBicmVhazsKLQkgIAotCWNhc2UgQlI6Ci0JICB7Ci0JICAgIGxvbmcgdmFsID0gaW5zdCAmIDB4M0ZGOwotCSAgICAKLQkgICAgaWYgKGluc3QgJiAweDQwMCkKLQkgICAgICB2YWwgfD0gMHhGRkZGRkMwMDsKLQkgICAgCi0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0MHgleCIsIG1lbWFkZHIgKyAyICsgKHZhbDw8MSkpOwotCSAgICAKLQkgICAgaWYgKHN0cmNtcCAob3AtPm5hbWUsICJic3IiKSA9PSAwKQotCSAgICAgIHsKLQkJLyogZm9yIGJzciwgd2UnbGwgdHJ5IHRvIGdldCBhIHN5bWJvbCBmb3IgdGhlIHRhcmdldCAqLwotCQl2YWwgPSBtZW1hZGRyICsgMiArICh2YWwgPDwgMSk7Ci0JCQotCQlpZiAoaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jICYmIHZhbCAhPSAwKQotCQkgIHsKLQkJICAgIGZwcmludGYgKHN0cmVhbSwgIlx0Ly8gIik7Ci0JCSAgICBpbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMgKHZhbCwgaW5mbyk7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQkgIGJyZWFrOwotCSAgCi0JY2FzZSBCTDoKLQkgIHsKLQkgICAgbG9uZyB2YWw7Ci0JICAgIHZhbCA9IChpbnN0ICYgMHgwMDBGKTsKLQkgICAgZnByaW50ZiAoc3RyZWFtLCAiXHQlcywgMHgleCIsCi0JCSAgICBncm5hbWVbKGluc3QgPj4gNCkgJiAweEZdLCBtZW1hZGRyIC0gKHZhbCA8PCAxKSk7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgTFI6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgICAKLQkgICAgdmFsID0gKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQzsKLQkgICAgCi0JICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKHZhbCwgaWJ5dGVzLCA0LCBpbmZvKTsKLQkgICAgaWYgKHN0YXR1cyAhPSAwKSAKLQkgICAgICB7Ci0JCWluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQlicmVhazsKLQkgICAgICB9Ci0JICAgIAotLyogc3RhcnQtc2FuaXRpemUtbTM0MCAqLwotCSAgICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fTElUVExFKQotCSAgICAgIHZhbCA9IChpYnl0ZXNbM10gPDwgMjQpIHwgKGlieXRlc1syXSA8PCAxNikKLQkJfCAoaWJ5dGVzWzFdIDw8IDgpIHwgKGlieXRlc1swXSk7Ci0JICAgIGVsc2UKLS8qIGVuZC1zYW5pdGl6ZS1tMzQwICovCi0JICAgICAgdmFsID0gKGlieXRlc1swXSA8PCAyNCkgfCAoaWJ5dGVzWzFdIDw8IDE2KQotCQl8IChpYnl0ZXNbMl0gPDwgOCkgfCAoaWJ5dGVzWzNdKTsKLQkgICAgCi0JICAgIC8qIFJlbW92ZWQgW10gYXJvdW5kIGxpdGVyYWwgdmFsdWUgdG8gbWF0Y2ggQUJJIHN5bnRheCAxMi85NS4gICovCi0JICAgIGZwcmludGYgKHN0cmVhbSwgIlx0JXMsIDB4JVgiLCBncm5hbWVbKGluc3QgPj4gOCkgJiAweEZdLCB2YWwpOwotCi0JICAgIGlmICh2YWwgPT0gMCkKLQkgICAgICBmcHJpbnRmIChzdHJlYW0sICJcdC8vIGZyb20gYWRkcmVzcyBwb29sIGF0IDB4JXgiLAotCQkgICAgICAgKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQyk7Ci0JICB9Ci0JICBicmVhazsKLQkgIAotCWNhc2UgTEo6Ci0JICB7Ci0JICAgIHVuc2lnbmVkIGxvbmcgdmFsOwotCSAgICAKLQkgICAgdmFsID0gKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQzsKLQkgICAgCi0JICAgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKHZhbCwgaWJ5dGVzLCA0LCBpbmZvKTsKLQkgICAgaWYgKHN0YXR1cyAhPSAwKSAKLQkgICAgICB7Ci0JCWluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCQlicmVhazsKLQkgICAgICB9Ci0KLS8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8KLQkgICAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0xJVFRMRSkKLQkgICAgICB2YWwgPSAoaWJ5dGVzWzNdIDw8IDI0KSB8IChpYnl0ZXNbMl0gPDwgMTYpCi0JCXwgKGlieXRlc1sxXSA8PCA4KSB8IChpYnl0ZXNbMF0pOwotCSAgICBlbHNlCi0vKiBlbmQtc2FuaXRpemUtbTM0MCAqLwotCSAgICAgIHZhbCA9IChpYnl0ZXNbMF0gPDwgMjQpIHwgKGlieXRlc1sxXSA8PCAxNikKLQkJfCAoaWJ5dGVzWzJdIDw8IDgpIHwgKGlieXRlc1szXSk7Ci0JICAgIAotCSAgICAvKiBSZW1vdmVkIFtdIGFyb3VuZCBsaXRlcmFsIHZhbHVlIHRvIG1hdGNoIEFCSSBzeW50YXggMTIvOTUuICAqLwotCSAgICBmcHJpbnRmIChzdHJlYW0sICJcdDB4JVgiLCB2YWwpOwotCSAgICAvKiBGb3Igam1waS9qc3JpLCB3ZSdsbCB0cnkgdG8gZ2V0IGEgc3ltYm9sIGZvciB0aGUgdGFyZ2V0LiAgKi8KLQkgICAgaWYgKGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAmJiB2YWwgIT0gMCkKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0cmVhbSwgIlx0Ly8gIik7Ci0JCWluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAodmFsLCBpbmZvKTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWZwcmludGYgKHN0cmVhbSwgIlx0Ly8gZnJvbSBhZGRyZXNzIHBvb2wgYXQgMHgleCIsCi0JCQkgKG1lbWFkZHIgKyAyICsgKChpbnN0ICYgMHhGRikgPDwgMikpICYgMHhGRkZGRkZGQyk7Ci0JICAgICAgfQotCSAgfQotCSAgYnJlYWs7Ci0JICAKLQlkZWZhdWx0OgotCSAgLyogaWYgdGhlIGRpc2Fzc2VtYmxlciBsYWdzIHRoZSBpbnN0cnVjdGlvbiBzZXQgKi8KLQkgIGZwcmludGYgKHN0cmVhbSwgIlx0dW5kZWNvZGVkIG9wZXJhbmRzLCBpbnN0IGlzIDB4JTA0eCIsIGluc3QpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLSAgCi0gIC8qIFNheSBob3cgbWFueSBieXRlcyB3ZSBjb25zdW1lZD8gKi8KLSAgcmV0dXJuIDI7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL21jb3JlLW9wYy5oIGIvb3Bjb2Rlcy9tY29yZS1vcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2Zjc4Yi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21jb3JlLW9wYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qIEFzc2VtYmxlciBpbnN0cnVjdGlvbnMgZm9yIE1vdG9yb2xsYSdzIE1jb3JlIHByb2Nlc3NvcgotICAgQ29weXJpZ2h0IChDKSAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICAKLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotCi10eXBlZGVmIGVudW0KLXsKLSAgTzAsICAgIE9ULCAgIE8xLCAgIE9DLCAgIE8yLCAgICBYMSwgICAgT0ksICAgIE9CLAotICBPTWEsICAgU0ksICAgSTcsICAgTFMsICAgQlIsICAgIEJMLCAgICBMUiwgICAgTEosCi0gIFJNLCAgICBSUSwgICBKU1IsICBKTVAsICBPQlJhLCAgT0JSYiwgIE9CUmMsICBPQlIyLAotICBPMVIxLCAgT01iLCAgT01jLCAgU0lhLAotICAvKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovICAKLSAgTVVMU0gsCi0gIC8qIGVuZC1zYW5pdGl6ZS1tMzQwICovICAKLSAgSkMsICAgIEpVLCAgIEpMLCAgIFJTSSwgIERPMjEsICBPQjIKLX0KLW1jb3JlX29wY2xhc3M7Ci0KLXR5cGVkZWYgc3RydWN0IGluc3QKLXsKLSAgY2hhciAqICAgICAgICAgbmFtZTsKLSAgbWNvcmVfb3BjbGFzcyAgb3BjbGFzczsKLSAgdW5zaWduZWQgY2hhciAgdHJhbnNmZXI7Ci0gIHVuc2lnbmVkIHNob3J0IGluc3Q7Ci19Ci1tY29yZV9vcGNvZGVfaW5mbzsKLQotI2lmZGVmIERFRklORV9UQUJMRQotbWNvcmVfb3Bjb2RlX2luZm8gbWNvcmVfdGFibGVbXSA9Ci17Ci0gIHsgImJrcHQiLAlPMCwJMCwJMHgwMDAwIH0sCi0gIHsgInN5bmMiLAlPMCwJMCwJMHgwMDAxIH0sCi0gIHsgInJ0ZSIsCU8wLAkxLAkweDAwMDIgfSwKLSAgeyAicmZlIiwJTzAsCTEsCTB4MDAwMiB9LAotICB7ICJyZmkiLAlPMCwJMSwJMHgwMDAzIH0sCi0gIHsgInN0b3AiLAlPMCwJMCwJMHgwMDA0IH0sCi0gIHsgIndhaXQiLAlPMCwJMCwJMHgwMDA1IH0sCi0gIHsgImRvemUiLAlPMCwJMCwJMHgwMDA2IH0sCi0gIC8qIHN0YXJ0LXNhbml0aXplLW0zNDAgKi8KLSAgeyAiaWRseTQiLCAgICBPMCwgICAgIDAsICAgICAgMHgwMDA3IH0sCi0gIC8qIGVuZC1zYW5pdGl6ZS1tMzQwICovCi0gIHsgInRyYXAiLAlPVCwJMCwJMHgwMDA4IH0sCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4MDAwQyAtIDB4MDAwRiAqLwotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAgLSAweDAwMUYgKi8KLSAgeyAibXZjIiwJTzEsCTAsCTB4MDAyMCB9LAotICB7ICJtdmN2IiwJTzEsCTAsCTB4MDAzMCB9LAotICB7ICJsZHEiLAlSUSwJMCwJMHgwMDQwIH0sCi0gIHsgInN0cSIsCVJRLAkwLAkweDAwNTAgfSwKLSAgeyAibGRtIiwJUk0sCTAsCTB4MDA2MCB9LAotICB7ICJzdG0iLAlSTSwJMCwJMHgwMDcwIH0sCi0gIHsgImRlY3QiLAlPMSwJMCwJMHgwMDgwIH0sCi0gIHsgImRlY2YiLAlPMSwJMCwJMHgwMDkwIH0sCi0gIHsgImluY3QiLAlPMSwJMCwJMHgwMEEwIH0sCi0gIHsgImluY2YiLAlPMSwJMCwJMHgwMEIwIH0sCi0gIHsgImptcCIsCUpNUCwJMiwJMHgwMEMwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfSk1QCTB4MDBDMAotICB7ICJqc3IiLAlKU1IsCTAsCTB4MDBEMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0pTUgkweDAwRTAKLSAgeyAiZmYxIiwJTzEsCTAsCTB4MDBFMCB9LAotICB7ICJicmV2IiwJTzEsCTAsCTB4MDBGMCB9LAotICB7ICJ4dHJiMyIsCVgxLAkwLAkweDAxMDAgfSwKLSAgeyAieHRyYjIiLAlYMSwJMCwJMHgwMTEwIH0sCi0gIHsgInh0cmIxIiwJWDEsCTAsCTB4MDEyMCB9LAotICB7ICJ4dHJiMCIsCVgxLAkwLAkweDAxMzAgfSwKLSAgeyAiemV4dGIiLAlPMSwJMCwJMHgwMTQwIH0sCi0gIHsgInNleHRiIiwJTzEsCTAsCTB4MDE1MCB9LAotICB7ICJ6ZXh0aCIsCU8xLAkwLAkweDAxNjAgfSwKLSAgeyAic2V4dGgiLAlPMSwJMCwJMHgwMTcwIH0sCi0gIHsgImRlY2x0IiwJTzEsCTAsCTB4MDE4MCB9LAotICB7ICJ0c3RuYnoiLAlPMSwJMCwJMHgwMTkwIH0sCi0gIHsgImRlY2d0IiwJTzEsCTAsCTB4MDFBMCB9LAotICB7ICJkZWNuZSIsCU8xLAkwLAkweDAxQjAgfSwKLSAgeyAiY2xydCIsCU8xLAkwLAkweDAxQzAgfSwKLSAgeyAiY2xyZiIsCU8xLAkwLAkweDAxRDAgfSwKLSAgeyAiYWJzIiwJTzEsCTAsCTB4MDFFMCB9LAotICB7ICJub3QiLAlPMSwJMCwJMHgwMUYwIH0sCi0gIHsgIm1vdnQiLAlPMiwJMCwJMHgwMjAwIH0sCi0gIHsgIm11bHQiLAlPMiwJMCwJMHgwMzAwIH0sCi0gIHsgImxvb3B0IiwJQkwsCTAsCTB4MDQwMCB9LAotICB7ICJzdWJ1IiwJTzIsCTAsCTB4MDUwMCB9LAotICB7ICJzdWIiLAlPMiwJMCwJMHgwNTAwIH0sIC8qIE9mZmljaWFsIGFsaWFzLiAgKi8KLSAgeyAiYWRkYyIsCU8yLAkwLAkweDA2MDAgfSwKLSAgeyAic3ViYyIsCU8yLAkwLAkweDA3MDAgfSwKLS8qIFNQQUNFOiAweDA4MDAtMHgwOGZmIGZvciBhIGRpYWRpYyBvcGVyYXRpb24gKi8KLS8qIFNQQUNFOiAweDA5MDAtMHgwOWZmIGZvciBhIGRpYWRpYyBvcGVyYXRpb24gKi8KLSAgeyAibW92ZiIsCU8yLAkwLAkweDBBMDAgfSwKLSAgeyAibHNyIiwJTzIsCTAsCTB4MEIwMCB9LAotICB7ICJjbXBocyIsCU8yLAkwLAkweDBDMDAgfSwKLSAgeyAiY21wbHQiLAlPMiwJMCwJMHgwRDAwIH0sCi0gIHsgInRzdCIsCU8yLAkwLAkweDBFMDAgfSwKLSAgeyAiY21wbmUiLAlPMiwJMCwJMHgwRjAwIH0sCi0gIHsgIm1mY3IiLAlPQywJMCwJMHgxMDAwIH0sCi0gIHsgIm1vdiIsCU8yLAkwLAkweDEyMDAgfSwKLSAgeyAiYmdlbnIiLAlPMiwJMCwJMHgxMzAwIH0sCi0gIHsgInJzdWIiLAlPMiwJMCwJMHgxNDAwIH0sCi0gIHsgIml4dyIsCU8yLAkwLAkweDE1MDAgfSwKLSAgeyAiYW5kIiwJTzIsCTAsCTB4MTYwMCB9LAotICB7ICJ4b3IiLAlPMiwJMCwJMHgxNzAwIH0sCi0gIHsgIm10Y3IiLAlPQywJMCwJMHgxODAwIH0sCi0gIHsgImFzciIsCU8yLAkwLAkweDFBMDAgfSwKLSAgeyAibHNsIiwJTzIsCTAsCTB4MUIwMCB9LAotICB7ICJhZGR1IiwJTzIsCTAsCTB4MUMwMCB9LAotICB7ICJpeGgiLAlPMiwJMCwJMHgxRDAwIH0sCi0gIHsgIm9yIiwJTzIsCTAsCTB4MUUwMCB9LAotICB7ICJhbmRuIiwJTzIsCTAsCTB4MUYwMCB9LAotICB7ICJhZGRpIiwJT0ksCTAsCTB4MjAwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0FEREkJMHgyMDAwCi0gIHsgImNtcGx0aSIsCU9JLAkwLAkweDIyMDAgfSwKLSAgeyAic3ViaSIsCU9JLAkwLAkweDI0MDAgfSwKLS8qIFNQQUNFOiAweDI2MDAtMHgyN2ZmIG9wZW4gZm9yIGEgcmVnaXN0ZXIraW1tZWRpYXRlICBvcGVyYXRpb24gKi8KLSAgeyAicnN1YmkiLAlPQiwJMCwJMHgyODAwIH0sCi0gIHsgImNtcG5laSIsCU9CLAkwLAkweDJBMDAgfSwKLSAgeyAiYm1hc2tpIiwJT01hLAkwLAkweDJDMDAgfSwKLSAgeyAiZGl2dSIsCU8xUjEsCTAsCTB4MkMxMCB9LAotLyogU1BBQ0U6ICAgICAgICAgICAgICAgICAgICAgICAweDJjMjAgLSAweDJjN2YgKi8gIAotICB7ICJibWFza2kiLAlPTWIsCTAsCTB4MkM4MCB9LAotICB7ICJibWFza2kiLAlPTWMsCTAsCTB4MkQwMCB9LAotICB7ICJhbmRpIiwJT0IsCTAsCTB4MkUwMCB9LAotICB7ICJiY2xyaSIsCU9CLAkwLAkweDMwMDAgfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgzMjAwIC0gMHgzMjBmICovCi0gIHsgImRpdnMiLAlPMVIxLAkwLAkweDMyMTAgfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHgzMjIwIC0gMHgzMjZmICovICAKLSAgeyAiYmdlbmkiLAlPQlJhLAkwLAkweDMyNzAgfSwKLSAgeyAiYmdlbmkiLAlPQlJiLAkwLAkweDMyODAgfSwKLSAgeyAiYmdlbmkiLAlPQlJjLAkwLAkweDMzMDAgfSwKLSAgeyAiYnNldGkiLAlPQiwJMCwJMHgzNDAwIH0sCi0gIHsgImJ0c3RpIiwJT0IsCTAsCTB4MzYwMCB9LAotICB7ICJ4c3IiLAlPMSwJMCwJMHgzODAwIH0sCi0gIHsgInJvdGxpIiwJU0lhLAkwLAkweDM4MDAgfSwKLSAgeyAiYXNyYyIsCU8xLAkwLAkweDNBMDAgfSwKLSAgeyAiYXNyaSIsCVNJYSwJMCwJMHgzQTAwIH0sCi0gIHsgImxzbGMiLAlPMSwJMCwJMHgzQzAwIH0sCi0gIHsgImxzbGkiLAlTSWEsCTAsCTB4M0MwMCB9LAotICB7ICJsc3JjIiwJTzEsCTAsCTB4M0UwMCB9LAotICB7ICJsc3JpIiwJU0lhLAkwLAkweDNFMDAgfSwKLS8qIFNQQUNFOiAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwIC0gMHg1ZmZmICovCi0gIHsgIm1vdmkiLAlJNywJMCwJMHg2MDAwIH0sCi0jZGVmaW5lIE1DT1JFX0lOU1RfQk1BU0tJX0FMVAkweDYwMDAKLSNkZWZpbmUgTUNPUkVfSU5TVF9CR0VOSV9BTFQJMHg2MDAwCi0vKiBzdGFydC1zYW5pdGl6ZS1tMzQwICovCi0gIHsgIm11bHNoIiwgICAgTVVMU0gsICAwLCAgICAgIDB4NjgwMCB9LAotICB7ICJtdWxzLmgiLCAgIE1VTFNILCAgMCwgICAgICAweDY4MDAgfSwKLS8qIGVuZC1zYW5pdGl6ZS1tMzQwICovCi0vKiBTUEFDRTogICAgICAgICAgICAgICAgICAgICAgIDB4NjkwMCAtIDB4NkZGRiAqLwotICB7ICJqbXBpIiwJTEosCTEsCTB4NzAwMCB9LAotICB7ICJqc3JpIiwJTEosCTAsCTB4N0YwMCB9LAotI2RlZmluZQlNQ09SRV9JTlNUX0pNUEkJMHg3MDAwCi0gIHsgImxydyIsCUxSLAkwLAkweDcwMDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9KU1JJCTB4N0YwMAotICB7ICJsZCIsCUxTLAkwLAkweDgwMDAgfSwKLSAgeyAibGR3IiwJTFMsCTAsCTB4ODAwMCB9LAotICB7ICJsZC53IiwJTFMsCTAsCTB4ODAwMCB9LAotICB7ICJzdCIsCUxTLAkwLAkweDkwMDAgfSwKLSAgeyAic3R3IiwJTFMsCTAsCTB4OTAwMCB9LAotICB7ICJzdC53IiwJTFMsCTAsCTB4OTAwMCB9LAotICB7ICJsZGIiLAlMUywJMCwJMHhBMDAwIH0sCi0gIHsgImxkLmIiLAlMUywJMCwJMHhBMDAwIH0sCi0gIHsgInN0YiIsCUxTLAkwLAkweEIwMDAgfSwKLSAgeyAic3QuYiIsCUxTLAkwLAkweEIwMDAgfSwKLSAgeyAibGRoIiwJTFMsCTAsCTB4QzAwMCB9LAotICB7ICJsZC5oIiwJTFMsCTAsCTB4QzAwMCB9LAotICB7ICJzdGgiLAlMUywJMCwJMHhEMDAwIH0sCi0gIHsgInN0LmgiLAlMUywJMCwJMHhEMDAwIH0sCi0gIHsgImJ0IiwJQlIsCTAsCTB4RTAwMCB9LAotICB7ICJiZiIsCUJSLAkwLAkweEU4MDAgfSwKLSAgeyAiYnIiLAlCUiwJMSwJMHhGMDAwIH0sCi0jZGVmaW5lCU1DT1JFX0lOU1RfQlIJMHhGMDAwCi0gIHsgImJzciIsCUJSLAkwLAkweEY4MDAgfSwKLSNkZWZpbmUJTUNPUkVfSU5TVF9CU1IJMHhGODAwCi0KLS8qIFRoZSBmb2xsb3dpbmcgYXJlIHJlbGF4YWJsZSBicmFuY2hlcyAqLwotICB7ICJqYnQiLAlKQywJMCwJMHhFMDAwIH0sCi0gIHsgImpiZiIsCUpDLAkwLAkweEU4MDAgfSwKLSAgeyAiamJyIiwJSlUsCTEsCTB4RjAwMCB9LAotICB7ICJqYnNyIiwJSkwsCTAsCTB4RjgwMCB9LAotCi0vKiBUaGUgZm9sbG93aW5nIGFyZSBhbGlhc2VzIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKi8KLSAgeyAicnRzIiwJTzAsCTIsCTB4MDBDRiB9LCAgLyogam1wIHIxNSAqLwotICB7ICJyb2xjIiwJRE8yMSwJMCwJMHgwNjAwIH0sICAvKiBhZGRjIHJkLHJkICovCi0gIHsgInJvdGxjIiwJRE8yMSwgICAwLAkweDA2MDAgfSwgIC8qIGFkZGMgcmQscmQgKi8KLSAgeyAic2V0YyIsCU8wLAkwLAkweDBDMDAgfSwgIC8qIGNtcGhzIHIwLHIwICovCi0gIHsgImNscmMiLAlPMCwJMCwJMHgwRjAwIH0sICAvKiBjbXBuZSByMCxyMCAqLwotICB7ICJ0c3RsZSIsCU8xLAkwLAkweDIyMDAgfSwgIC8qIGNtcGx0aSByZCwxICovCi0gIHsgImNtcGxlaSIsCU9CLAkwLAkweDIyMDAgfSwgIC8qIGNtcGxlaSByZCxYIC0+IGNtcGx0aSByZCxYKzEgKi8KLSAgeyAibmVnIiwJTzEsCTAsCTB4MjgwMCB9LCAgLyogcnN1YmkgcmQsMCAqLwotICB7ICJ0c3RuZSIsCU8xLAkwLAkweDJBMDAgfSwgIC8qIGNtcG5laSByZCwwICovCi0gIHsgInRzdGx0IiwJTzEsCTAsCTB4MzdGMCB9LCAgLyogYnRzdGkgcngsMzEgKi8KLSAgeyAibWNscmkiLAlPQjIsCTAsCTB4MzAwMCB9LCAgLyogYmNscmkgcngsbG9nMihpbW0pICovCi0gIHsgIm1nZW5pIiwJT0JSMiwJMCwJMHgzMjAwIH0sICAvKiBiZ2VuaSByeCxsb2cyKGltbSkgKi8KLSAgeyAibXNldGkiLAlPQjIsCTAsCTB4MzQwMCB9LCAgLyogYnNldGkgcngsbG9nMihpbW0pICovCi0gIHsgIm10c3RpIiwJT0IyLAkwLAkweDM2MDAgfSwgIC8qIGJ0c3RpIHJ4LGxvZzIoaW1tKSAqLwotICB7ICJyb3JpIiwJUlNJLAkwLAkweDM4MDAgfSwKLSAgeyAicm90cmkiLAlSU0ksICAgIDAsCTB4MzgwMCB9LAotICB7ICJub3AiLAlPMCwgICAgIDAsCTB4MTIwMCB9LCAgLyogbW92IHIwLCByMCAqLwotICB7IDAsCQkwLAkwLCAgICAgIDAgfQotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9taXBzLWRpcy5jIGIvb3Bjb2Rlcy9taXBzLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTM1NzdjLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWlwcy1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjggKzAsMCBAQAotLyogUHJpbnQgbWlwcyBpbnN0cnVjdGlvbnMgZm9yIEdEQiwgdGhlIEdOVSBkZWJ1Z2dlciwgb3IgZm9yIG9iamR1bXAuCi0gICBDb3B5cmlnaHQgKGMpIDE5ODksIDkxLTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotICAgQ29udHJpYnV0ZWQgYnkgTm9idXl1a2kgSGlraWNoaShoaWtpY2hpQHNyYS5jby5qcCkuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPGFuc2lkZWNsLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLS8qIEZJWE1FOiBUaGVzZSBhcmUgbmVlZGVkIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGNvZGUgaXMgbWlwczE2IG9yCi0gICBub3QuIFRoZSBsb3cgYml0IG9mIHRoZSBhZGRyZXNzIGlzIG9mdGVuIGEgZ29vZCBpbmRpY2F0b3IuICBObwotICAgc3ltYm9sIHRhYmxlIGlzIGF2YWlsYWJsZSB3aGVuIHRoaXMgY29kZSBydW5zIG91dCBpbiBhbiBlbWJlZGRlZAotICAgc3lzdGVtIGFzIHdoZW4gaXQgaXMgdXNlZCBmb3IgZGlzYXNzZW1ibGVyIHN1cHBvcnQgaW4gYSBtb25pdG9yLiAqLwotCi0jaWYgIWRlZmluZWQoRU1CRURERURfRU5WKQotI2RlZmluZSBTWU1UQUJfQVZBSUxBQkxFIDEKLSNpbmNsdWRlICJlbGYtYmZkLmgiCi0jaW5jbHVkZSAiZWxmL21pcHMuaCIKLSNlbmRpZgotCi1zdGF0aWMgaW50IHByaW50X2luc25fbWlwczE2IFBBUkFNUyAoKGJmZF92bWEsIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyB2b2lkIHByaW50X21pcHMxNl9pbnNuX2FyZwotICBQQVJBTVMgKChpbnQsIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqLCBpbnQsIGJvb2xlYW4sIGludCwgYmZkX3ZtYSwKLQkgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci0KLS8qIE1pcHMgaW5zdHJ1Y3Rpb25zIGFyZSBuZXZlciBsb25nZXIgdGhhbiB0aGlzIG1hbnkgYnl0ZXMuICAqLwotI2RlZmluZSBNQVhMRU4gNAotCi1zdGF0aWMgdm9pZCBwcmludF9pbnNuX2FyZyBQQVJBTVMgKChjb25zdCBjaGFyICosIHVuc2lnbmVkIGxvbmcsIGJmZF92bWEsCi0JCQkJICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyBpbnQgX3ByaW50X2luc25fbWlwcyBQQVJBTVMgKChiZmRfdm1hLCB1bnNpZ25lZCBsb25nIGludCwKLQkJCQkgICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotDAotLyogRklYTUU6IFRoaXMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIGdkYiBzb21laG93LiAgKi8KLSNkZWZpbmUgUkVHSVNURVJfTkFNRVMgCVwKLSAgICB7CSJ6ZXJvIiwJImF0IiwJInYwIiwJInYxIiwJImEwIiwJImExIiwJImEyIiwJImEzIiwgXAotCSJ0MCIsCSJ0MSIsCSJ0MiIsCSJ0MyIsCSJ0NCIsCSJ0NSIsCSJ0NiIsCSJ0NyIsIFwKLQkiczAiLAkiczEiLAkiczIiLAkiczMiLAkiczQiLAkiczUiLAkiczYiLAkiczciLCBcCi0JInQ4IiwJInQ5IiwJImswIiwJImsxIiwJImdwIiwJInNwIiwJInM4IiwJInJhIiwgXAotCSJzciIsCSJsbyIsCSJoaSIsCSJiYWQiLAkiY2F1c2UiLCJwYyIsICAgIFwKLQkiZjAiLCAgICJmMSIsICAgImYyIiwgICAiZjMiLCAgICJmNCIsICAgImY1IiwgICAiZjYiLCAgICJmNyIsIFwKLQkiZjgiLCAgICJmOSIsICAgImYxMCIsICAiZjExIiwgICJmMTIiLCAgImYxMyIsICAiZjE0IiwgICJmMTUiLCBcCi0JImYxNiIsICAiZjE3IiwgICJmMTgiLCAgImYxOSIsICAiZjIwIiwgICJmMjEiLCAgImYyMiIsICAiZjIzIixcCi0JImYyNCIsICAiZjI1IiwgICJmMjYiLCAgImYyNyIsICAiZjI4IiwgICJmMjkiLCAgImYzMCIsICAiZjMxIixcCi0JImZzciIsICAiZmlyIiwgICJmcCIsICAgImlueCIsICAicmFuZCIsICJ0bGJsbyIsImN0eHQiLCAidGxiaGkiLFwKLQkiZXBjIiwgICJwcmlkIlwKLSAgICB9Ci0KLXN0YXRpYyBDT05TVCBjaGFyICogQ09OU1QgcmVnX25hbWVzW10gPSBSRUdJU1RFUl9OQU1FUzsKLQotLyogVGhlIG1pcHMxNiByZWdpc3RlciBuYW1lcy4gICovCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1pcHMxNl9yZWdfbmFtZXNbXSA9Ci17Ci0gICJzMCIsICJzMSIsICJ2MCIsICJ2MSIsICJhMCIsICJhMSIsICJhMiIsICJhMyIKLX07Ci0MCi0vKiBzdWJyb3V0aW5lICovCi1zdGF0aWMgdm9pZAotcHJpbnRfaW5zbl9hcmcgKGQsIGwsIHBjLCBpbmZvKQotICAgICBjb25zdCBjaGFyICpkOwotICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIGludCBsOwotICAgICBiZmRfdm1hIHBjOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IGRlbHRhOwotCi0gIHN3aXRjaCAoKmQpCi0gICAgewotICAgIGNhc2UgJywnOgotICAgIGNhc2UgJygnOgotICAgIGNhc2UgJyknOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlYyIsICpkKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAncyc6Ci0gICAgY2FzZSAnYic6Ci0gICAgY2FzZSAncic6Ci0gICAgY2FzZSAndic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIHJlZ19uYW1lc1sobCA+PiBPUF9TSF9SUykgJiBPUF9NQVNLX1JTXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3QnOgotICAgIGNhc2UgJ3cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbKGwgPj4gT1BfU0hfUlQpICYgT1BfTUFTS19SVF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdpJzoKLSAgICBjYXNlICd1JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkobCA+PiBPUF9TSF9JTU1FRElBVEUpICYgT1BfTUFTS19JTU1FRElBVEUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdqJzogLyogc2FtZSBhcyBpLCBidXQgc2lnbi1leHRlbmRlZCAqLwotICAgIGNhc2UgJ28nOgotICAgICAgZGVsdGEgPSAobCA+PiBPUF9TSF9ERUxUQSkgJiBPUF9NQVNLX0RFTFRBOwotICAgICAgaWYgKGRlbHRhICYgMHg4MDAwKQotCWRlbHRhIHw9IH4weGZmZmY7Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwKLQkJCSAgICAgZGVsdGEpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdoJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCIsCi0JCQkgICAgICh1bnNpZ25lZCBpbnQpICgobCA+PiBPUF9TSF9QUkVGWCkKLQkJCQkJICAgICAmIE9QX01BU0tfUFJFRlgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnayc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAodW5zaWduZWQgaW50KSAoKGwgPj4gT1BfU0hfQ0FDSEUpCi0JCQkJCSAgICAgJiBPUF9NQVNLX0NBQ0hFKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2EnOgotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JKCgocGMgJiAweEYwMDAwMDAwKSB8ICgoKGwgPj4gT1BfU0hfVEFSR0VUKSAmIE9QX01BU0tfVEFSR0VUKSA8PCAyKSksCi0JIGluZm8pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdwJzoKLSAgICAgIC8qIHNpZ24gZXh0ZW5kIHRoZSBkaXNwbGFjZW1lbnQgKi8KLSAgICAgIGRlbHRhID0gKGwgPj4gT1BfU0hfREVMVEEpICYgT1BfTUFTS19ERUxUQTsKLSAgICAgIGlmIChkZWx0YSAmIDB4ODAwMCkKLQlkZWx0YSB8PSB+MHhmZmZmOwotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpCi0JKChkZWx0YSA8PCAyKSArIHBjICsgNCwKLQkgaW5mbyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2QnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbKGwgPj4gT1BfU0hfUkQpICYgT1BfTUFTS19SRF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd6JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzBdKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnPCc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9TSEFNVCkgJiBPUF9NQVNLX1NIQU1UKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnYyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9DT0RFKSAmIE9QX01BU0tfQ09ERSk7Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSAncSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9DT0RFMikgJiBPUF9NQVNLX0NPREUyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnQyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLAotCQkJICAgICAobCA+PiBPUF9TSF9DT1BaKSAmIE9QX01BU0tfQ09QWik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0InOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfU1lTQ0FMTCkgJiBPUF9NQVNLX1NZU0NBTEwpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICBjYXNlICdWJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGYlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0ZTKSAmIE9QX01BU0tfRlMpOwotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgJ1QnOgotICAgIGNhc2UgJ1cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfRlQpICYgT1BfTUFTS19GVCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0QnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfRkQpICYgT1BfTUFTS19GRCk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1InOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkZiVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfRlIpICYgT1BfTUFTS19GUik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ0UnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJWQiLAotCQkJICAgICAobCA+PiBPUF9TSF9SVCkgJiBPUF9NQVNLX1JUKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnRyc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1JEKSAmIE9QX01BU0tfUkQpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdOJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJGZjYyVkIiwKLQkJCSAgICAgKGwgPj4gT1BfU0hfQkNDKSAmIE9QX01BU0tfQkNDKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnTSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiRmY2MlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX0NDQykgJiBPUF9NQVNLX0NDQyk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1AnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlZCIsCi0JCQkgICAgIChsID4+IE9QX1NIX1BFUkZSRUcpICYgT1BfTUFTS19QRVJGUkVHKTsKLSAgICAgIGJyZWFrOwotCi0KLSAgICBkZWZhdWx0OgotICAgICAgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLAotCQkJICAgICBfKCIjIGludGVybmFsIGVycm9yLCB1bmRlZmluZWQgbW9kaWZpZXIoJWMpIiksCi0JCQkgICAgICpkKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLX0KLQwKLSNpZiBTWU1UQUJfQVZBSUxBQkxFCi0KLS8qIEZpZ3VyZSBvdXQgdGhlIE1JUFMgSVNBIGFuZCBDUFUgYmFzZWQgb24gdGhlIG1hY2hpbmUgbnVtYmVyLgotICAgRklYTUU6IFdoYXQgZG9lcyB0aGlzIGhhdmUgdG8gZG8gd2l0aCBTWU1UQUJfQVZBSUxBQkxFPyAgKi8KLQotc3RhdGljIHZvaWQKLXNldF9taXBzX2lzYV90eXBlIChtYWNoLCBpc2EsIGNwdXR5cGUpCi0gICAgIGludCBtYWNoOwotICAgICBpbnQgKmlzYTsKLSAgICAgaW50ICpjcHV0eXBlOwotewotICBpbnQgdGFyZ2V0X3Byb2Nlc3NvciA9IDA7Ci0gIGludCBtaXBzX2lzYSA9IDA7Ci0KLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczMwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDMwMDA7Ci0JbWlwc19pc2EgPSAxOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMzkwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gMzkwMDsKLQltaXBzX2lzYSA9IDE7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MDAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQwMTA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQwMTA7Ci0JbWlwc19pc2EgPSAyOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDEwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDEwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0MTExOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0MTAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQzMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQzMDA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNDQwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNDQwMDsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM0NjAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA0NjAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczQ2NTA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDQ2NTA7Ci0JbWlwc19pc2EgPSAzOwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzNTAwMDoKLQl0YXJnZXRfcHJvY2Vzc29yID0gNTAwMDsKLQltaXBzX2lzYSA9IDQ7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIGJmZF9tYWNoX21pcHM2MDAwOgotCXRhcmdldF9wcm9jZXNzb3IgPSA2MDAwOwotCW1pcHNfaXNhID0gMjsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczgwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDgwMDA7Ci0JbWlwc19pc2EgPSA0OwotCWJyZWFrOwotICAgICAgY2FzZSBiZmRfbWFjaF9taXBzMTAwMDA6Ci0JdGFyZ2V0X3Byb2Nlc3NvciA9IDEwMDAwOwotCW1pcHNfaXNhID0gNDsKLQlicmVhazsKLSAgICAgIGNhc2UgYmZkX21hY2hfbWlwczE2OgotCXRhcmdldF9wcm9jZXNzb3IgPSAxNjsKLQltaXBzX2lzYSA9IDM7Ci0JYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotCXRhcmdldF9wcm9jZXNzb3IgPSAzMDAwOwotCW1pcHNfaXNhID0gMzsKLQlicmVhazsKLQotICAgIH0KLQotICAqaXNhID0gbWlwc19pc2E7Ci0gICpjcHV0eXBlID0gdGFyZ2V0X3Byb2Nlc3NvcjsKLX0KLQotI2VuZGlmIC8qIFNZTVRBQl9BVkFJTEFCTEUgKi8KLQotLyogUHJpbnQgdGhlIG1pcHMgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIHVzaW5nIElORk8uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLCB3aGljaCBpcwotICAgYWx3YXlzIDQuICBCSUdFTkRJQU4gbXVzdCBiZSAxIGlmIHRoaXMgaXMgYmlnLWVuZGlhbiBjb2RlLCAwIGlmCi0gICB0aGlzIGlzIGxpdHRsZS1lbmRpYW4gY29kZS4gICovCi0KLXN0YXRpYyBpbnQKLV9wcmludF9pbnNuX21pcHMgKG1lbWFkZHIsIHdvcmQsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnQgd29yZDsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqb3A7Ci0gIGludCB0YXJnZXRfcHJvY2Vzc29yLCBtaXBzX2lzYTsKLSAgc3RhdGljIGJvb2xlYW4gaW5pdCA9IDA7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgKm1pcHNfaGFzaFtPUF9NQVNLX09QICsgMV07Ci0KLSAgLyogQnVpbGQgYSBoYXNoIHRhYmxlIHRvIHNob3J0ZW4gdGhlIHNlYXJjaCB0aW1lLiAgKi8KLSAgaWYgKCEgaW5pdCkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBpbnQgaTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8PSBPUF9NQVNLX09QOyBpKyspCi0JewotCSAgZm9yIChvcCA9IG1pcHNfb3Bjb2Rlczsgb3AgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdOyBvcCsrKQotCSAgICB7Ci0JICAgICAgaWYgKG9wLT5waW5mbyA9PSBJTlNOX01BQ1JPKQotCQljb250aW51ZTsKLQkgICAgICBpZiAoaSA9PSAoKG9wLT5tYXRjaCA+PiBPUF9TSF9PUCkgJiBPUF9NQVNLX09QKSkKLQkJewotCQkgIG1pcHNfaGFzaFtpXSA9IG9wOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIH0KLSAgICAgICAgfQotCi0gICAgICBpbml0ID0gMTsKLSAgICB9Ci0KLSNpZiAhIFNZTVRBQl9BVkFJTEFCTEUKLSAgLyogVGhpcyBpcyBydW5uaW5nIG91dCBvbiBhIHRhcmdldCBtYWNoaW5lLCBub3QgaW4gYSBob3N0IHRvb2wuCi0gICAgIEZJWE1FOiBXaGVyZSBkb2VzIG1pcHNfdGFyZ2V0X2luZm8gY29tZSBmcm9tPyAgKi8KLSAgdGFyZ2V0X3Byb2Nlc3NvciA9IG1pcHNfdGFyZ2V0X2luZm8ucHJvY2Vzc29yOwotICBtaXBzX2lzYSA9IG1pcHNfdGFyZ2V0X2luZm8uaXNhOwotI2Vsc2UgIAotICBzZXRfbWlwc19pc2FfdHlwZSAoaW5mby0+bWFjaCwgJm1pcHNfaXNhLCAmdGFyZ2V0X3Byb2Nlc3Nvcik7Ci0jZW5kaWYgIAotCi0gIGluZm8tPmJ5dGVzX3Blcl9jaHVuayA9IDQ7Ci0gIGluZm8tPmRpc3BsYXlfZW5kaWFuID0gaW5mby0+ZW5kaWFuOwotCi0gIG9wID0gbWlwc19oYXNoWyh3b3JkID4+IE9QX1NIX09QKSAmIE9QX01BU0tfT1BdOwotICBpZiAob3AgIT0gTlVMTCkKLSAgICB7Ci0gICAgICBmb3IgKDsgb3AgPCAmbWlwc19vcGNvZGVzW05VTU9QQ09ERVNdOyBvcCsrKQotCXsKLQkgIGlmIChvcC0+cGluZm8gIT0gSU5TTl9NQUNSTyAmJiAod29yZCAmIG9wLT5tYXNrKSA9PSBvcC0+bWF0Y2gpCi0JICAgIHsKLQkgICAgICByZWdpc3RlciBjb25zdCBjaGFyICpkOwotCSAgICAgIGludCBpbnNuX2lzYTsKLQotCSAgICAgIGlmICgob3AtPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0ExKQotCQlpbnNuX2lzYSA9IDE7Ci0JICAgICAgZWxzZSBpZiAoKG9wLT5tZW1iZXJzaGlwICYgSU5TTl9JU0EpID09IElOU05fSVNBMikKLQkJaW5zbl9pc2EgPSAyOwotCSAgICAgIGVsc2UgaWYgKChvcC0+bWVtYmVyc2hpcCAmIElOU05fSVNBKSA9PSBJTlNOX0lTQTMpCi0JCWluc25faXNhID0gMzsKLQkgICAgICBlbHNlIGlmICgob3AtPm1lbWJlcnNoaXAgJiBJTlNOX0lTQSkgPT0gSU5TTl9JU0E0KQotCQlpbnNuX2lzYSA9IDQ7Ci0JICAgICAgZWxzZQotCQlpbnNuX2lzYSA9IDE1OwotCi0JICAgICAgaWYgKGluc25faXNhID4gbWlwc19pc2EKLQkJICAmJiAodGFyZ2V0X3Byb2Nlc3NvciA9PSA0NjUwCi0JCSAgICAgICYmIG9wLT5tZW1iZXJzaGlwICYgSU5TTl80NjUwKSA9PSAwCi0JCSAgJiYgKHRhcmdldF9wcm9jZXNzb3IgPT0gNDAxMAotCQkgICAgICAmJiBvcC0+bWVtYmVyc2hpcCAmIElOU05fNDAxMCkgPT0gMAotCQkgICYmICh0YXJnZXRfcHJvY2Vzc29yID09IDQxMDAKLQkJICAgICAgJiYgb3AtPm1lbWJlcnNoaXAgJiBJTlNOXzQxMDApID09IDAKLQkJICAmJiAodGFyZ2V0X3Byb2Nlc3NvciA9PSAzOTAwCi0JCSAgICAgICYmIG9wLT5tZW1iZXJzaGlwICYgSU5TTl8zOTAwKSA9PSAwKQotCQljb250aW51ZTsKLQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBvcC0+bmFtZSk7Ci0KLQkgICAgICBkID0gb3AtPmFyZ3M7Ci0JICAgICAgaWYgKGQgIT0gTlVMTCAmJiAqZCAhPSAnXDAnKQotCQl7Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0JCSAgZm9yICg7ICpkICE9ICdcMCc7IGQrKykKLQkJICAgICAgcHJpbnRfaW5zbl9hcmcgKGQsIHdvcmQsIG1lbWFkZHIsIGluZm8pOwotCQl9Ci0KLQkgICAgICByZXR1cm4gNDsKLQkgICAgfQotCX0KLSAgICB9Ci0KLSAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLwotICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgiLCB3b3JkKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLQotLyogSW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgd2UgZG8gbm90IGtub3cgdGhlIHN5bWJvbCB0eXBlIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gd2UgYXJlIGZvcmNlZCB0byBhc3N1bWUgdGhhdCB0aGUgbG93IG9yZGVyIGJpdCBvZiB0aGUKLSAgIGluc3RydWN0aW9ucycgYWRkcmVzcyBtYXkgbWFyayBpdCBhcyBhIG1pcHMxNiBpbnN0cnVjdGlvbi4gIElmIHdlCi0gICBhcmUgc2luZ2xlIHN0ZXBwaW5nLCBvciB0aGUgcGMgaXMgd2l0aGluIHRoZSBkaXNhc3NlbWJsZWQgZnVuY3Rpb24sCi0gICB0aGlzIHdvcmtzLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIGEgY2x1ZS4gIFNvbWV0aW1lcy4gICovCi0KLWludAotcHJpbnRfaW5zbl9iaWdfbWlwcyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBpbnQgc3RhdHVzOwotCi0jaWYgMQotICAvKiBGSVhNRTogSWYgb2RkIGFkZHJlc3MsIHRoaXMgaXMgQ0xFQVJMWSBhIG1pcHMgMTYgaW5zdHJ1Y3Rpb24uICAqLwotICAvKiBPbmx5IGEgZmV3IHRvb2xzIHdpbGwgd29yayB0aGlzIHdheS4gICovCi0gIGlmIChtZW1hZGRyICYgMHgwMSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotI2lmIFNZTVRBQl9BVkFJTEFCTEUKLSAgaWYgKGluZm8tPm1hY2ggPT0gMTYKLSAgICAgIHx8IChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkgICYmIGluZm8tPnN5bWJvbHMgIT0gTlVMTAotCSAgJiYgKCgqKGVsZl9zeW1ib2xfdHlwZSAqKikgaW5mby0+c3ltYm9scyktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIKLQkgICAgICA9PSBTVE9fTUlQUzE2KSkpCi0gICAgcmV0dXJuIHByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKTsKLSNlbmRpZiAgCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHJldHVybiBfcHJpbnRfaW5zbl9taXBzIChtZW1hZGRyLCAodW5zaWduZWQgbG9uZykgYmZkX2dldGIzMiAoYnVmZmVyKSwKLQkJCSAgICAgaW5mbyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLWludAotcHJpbnRfaW5zbl9saXR0bGVfbWlwcyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgYmZkX2J5dGUgYnVmZmVyWzRdOwotICBpbnQgc3RhdHVzOwotCi0KLSNpZiAxCi0gIGlmIChtZW1hZGRyICYgMHgwMSkKLSAgICByZXR1cm4gcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pOwotI2VuZGlmICAKLQotI2lmIFNZTVRBQl9BVkFJTEFCTEUKLSAgaWYgKGluZm8tPm1hY2ggPT0gMTYKLSAgICAgIHx8IChpbmZvLT5mbGF2b3VyID09IGJmZF90YXJnZXRfZWxmX2ZsYXZvdXIKLQkgICYmIGluZm8tPnN5bWJvbHMgIT0gTlVMTAotCSAgJiYgKCgqKGVsZl9zeW1ib2xfdHlwZSAqKikgaW5mby0+c3ltYm9scyktPmludGVybmFsX2VsZl9zeW0uc3Rfb3RoZXIKLQkgICAgICA9PSBTVE9fTUlQUzE2KSkpCi0gICAgcmV0dXJuIHByaW50X2luc25fbWlwczE2IChtZW1hZGRyLCBpbmZvKTsKLSNlbmRpZiAgCi0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCA0LCBpbmZvKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHJldHVybiBfcHJpbnRfaW5zbl9taXBzIChtZW1hZGRyLCAodW5zaWduZWQgbG9uZykgYmZkX2dldGwzMiAoYnVmZmVyKSwKLQkJCSAgICAgaW5mbyk7Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0MCi0vKiBEaXNhc3NlbWJsZSBtaXBzMTYgaW5zdHJ1Y3Rpb25zLiAgKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9taXBzMTYgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBzdGF0dXM7Ci0gIGJmZF9ieXRlIGJ1ZmZlclsyXTsKLSAgaW50IGxlbmd0aDsKLSAgaW50IGluc247Ci0gIGJvb2xlYW4gdXNlX2V4dGVuZDsKLSAgaW50IGV4dGVuZCA9IDA7Ci0gIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqb3AsICpvcGVuZDsKLQotICBpbmZvLT5ieXRlc19wZXJfY2h1bmsgPSAyOwotICBpbmZvLT5kaXNwbGF5X2VuZGlhbiA9IGluZm8tPmVuZGlhbjsKLQotICBpbmZvLT5pbnNuX2luZm9fdmFsaWQgPSAxOwotICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAwOwotICBpbmZvLT5kYXRhX3NpemUgPSAwOwotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uYnJhbmNoOwotICBpbmZvLT50YXJnZXQgPSAwOwotICBpbmZvLT50YXJnZXQyID0gMDsKLQotICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIDIsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIGxlbmd0aCA9IDI7Ci0KLSAgaWYgKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRykKLSAgICBpbnNuID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLSAgZWxzZQotICAgIGluc24gPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCi0gIC8qIEhhbmRsZSB0aGUgZXh0ZW5kIG9wY29kZSBzcGVjaWFsbHkuICAqLwotICB1c2VfZXh0ZW5kID0gZmFsc2U7Ci0gIGlmICgoaW5zbiAmIDB4ZjgwMCkgPT0gMHhmMDAwKQotICAgIHsKLSAgICAgIHVzZV9leHRlbmQgPSB0cnVlOwotICAgICAgZXh0ZW5kID0gaW5zbiAmIDB4N2ZmOwotCi0gICAgICBtZW1hZGRyICs9IDI7Ci0KLSAgICAgIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgMiwgaW5mbyk7Ci0gICAgICBpZiAoc3RhdHVzICE9IDApCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCi0JCQkJICh1bnNpZ25lZCBpbnQpIGV4dGVuZCk7Ci0JICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0KLSAgICAgIGlmIChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcpCi0JaW5zbiA9IGJmZF9nZXRiMTYgKGJ1ZmZlcik7Ci0gICAgICBlbHNlCi0JaW5zbiA9IGJmZF9nZXRsMTYgKGJ1ZmZlcik7Ci0KLSAgICAgIC8qIENoZWNrIGZvciBhbiBleHRlbmQgb3Bjb2RlIGZvbGxvd2VkIGJ5IGFuIGV4dGVuZCBvcGNvZGUuICAqLwotICAgICAgaWYgKChpbnNuICYgMHhmODAwKSA9PSAweGYwMDApCi0JewotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJleHRlbmQgMHgleCIsCi0JCQkJICh1bnNpZ25lZCBpbnQpIGV4dGVuZCk7Ci0JICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsKLQkgIHJldHVybiBsZW5ndGg7Ci0JfQotCi0gICAgICBsZW5ndGggKz0gMjsKLSAgICB9Ci0KLSAgLyogRklYTUU6IFNob3VsZCBwcm9iYWJseSB1c2UgYSBoYXNoIHRhYmxlIG9uIHRoZSBtYWpvciBvcGNvZGUgaGVyZS4gICovCi0KLSAgb3BlbmQgPSBtaXBzMTZfb3Bjb2RlcyArIGJmZF9taXBzMTZfbnVtX29wY29kZXM7Ci0gIGZvciAob3AgPSBtaXBzMTZfb3Bjb2Rlczsgb3AgPCBvcGVuZDsgb3ArKykKLSAgICB7Ci0gICAgICBpZiAob3AtPnBpbmZvICE9IElOU05fTUFDUk8gJiYgKGluc24gJiBvcC0+bWFzaykgPT0gb3AtPm1hdGNoKQotCXsKLQkgIGNvbnN0IGNoYXIgKnM7Ci0KLQkgIGlmIChzdHJjaHIgKG9wLT5hcmdzLCAnYScpICE9IE5VTEwpCi0JICAgIHsKLQkgICAgICBpZiAodXNlX2V4dGVuZCkKLQkJewotCQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiZXh0ZW5kIDB4JXgiLAotCQkJCQkgKHVuc2lnbmVkIGludCkgZXh0ZW5kKTsKLQkJICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsKLQkJICByZXR1cm4gbGVuZ3RoIC0gMjsKLQkJfQotCi0JICAgICAgdXNlX2V4dGVuZCA9IGZhbHNlOwotCi0JICAgICAgbWVtYWRkciArPSAyOwotCi0JICAgICAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAobWVtYWRkciwgYnVmZmVyLCAyLAotCQkJCQkJICBpbmZvKTsKLQkgICAgICBpZiAoc3RhdHVzID09IDApCi0JCXsKLQkJICB1c2VfZXh0ZW5kID0gdHJ1ZTsKLQkJICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotCQkgICAgZXh0ZW5kID0gYmZkX2dldGIxNiAoYnVmZmVyKTsKLQkJICBlbHNlCi0JCSAgICBleHRlbmQgPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCQkgIGxlbmd0aCArPSAyOwotCQl9Ci0JICAgIH0KLQotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wLT5uYW1lKTsKLQkgIGlmIChvcC0+YXJnc1swXSAhPSAnXDAnKQotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIlx0Iik7Ci0KLQkgIGZvciAocyA9IG9wLT5hcmdzOyAqcyAhPSAnXDAnOyBzKyspCi0JICAgIHsKLQkgICAgICBpZiAoKnMgPT0gJywnCi0JCSAgJiYgc1sxXSA9PSAndycKLQkJICAmJiAoKChpbnNuID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlgpCi0JCSAgICAgID09ICgoaW5zbiA+PiBNSVBTMTZPUF9TSF9SWSkgJiBNSVBTMTZPUF9NQVNLX1JZKSkpCi0JCXsKLQkJICAvKiBTa2lwIHRoZSByZWdpc3RlciBhbmQgdGhlIGNvbW1hLiAgKi8KLQkJICArK3M7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBpZiAoKnMgPT0gJywnCi0JCSAgJiYgc1sxXSA9PSAndicKLQkJICAmJiAoKChpbnNuID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlopCi0JCSAgICAgID09ICgoaW5zbiA+PiBNSVBTMTZPUF9TSF9SWCkgJiBNSVBTMTZPUF9NQVNLX1JYKSkpCi0JCXsKLQkJICAvKiBTa2lwIHRoZSByZWdpc3RlciBhbmQgdGhlIGNvbW1hLiAgKi8KLQkJICArK3M7Ci0JCSAgY29udGludWU7Ci0JCX0KLQkgICAgICBwcmludF9taXBzMTZfaW5zbl9hcmcgKCpzLCBvcCwgaW5zbiwgdXNlX2V4dGVuZCwgZXh0ZW5kLCBtZW1hZGRyLAotCQkJCSAgICAgaW5mbyk7Ci0JICAgIH0KLQotCSAgaWYgKChvcC0+cGluZm8gJiBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkpICE9IDApCi0JICAgIHsKLQkgICAgICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOwotCSAgICAgIGlmIChpbmZvLT5pbnNuX3R5cGUgIT0gZGlzX2pzcikKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgfQotCi0JICByZXR1cm4gbGVuZ3RoOwotCX0KLSAgICB9Ci0KLSAgaWYgKHVzZV9leHRlbmQpCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgZXh0ZW5kIHwgMHhmMDAwKTsKLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4IiwgaW5zbik7Ci0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25pbnNuOwotCi0gIHJldHVybiBsZW5ndGg7Ci19Ci0KLS8qIERpc2Fzc2VtYmxlIGFuIG9wZXJhbmQgZm9yIGEgbWlwczE2IGluc3RydWN0aW9uLiAgKi8KLQotc3RhdGljIHZvaWQKLXByaW50X21pcHMxNl9pbnNuX2FyZyAodHlwZSwgb3AsIGwsIHVzZV9leHRlbmQsIGV4dGVuZCwgbWVtYWRkciwgaW5mbykKLSAgICAgaW50IHR5cGU7Ci0gICAgIGNvbnN0IHN0cnVjdCBtaXBzX29wY29kZSAqb3A7Ci0gICAgIGludCBsOwotICAgICBib29sZWFuIHVzZV9leHRlbmQ7Ci0gICAgIGludCBleHRlbmQ7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHN3aXRjaCAodHlwZSkKLSAgICB7Ci0gICAgY2FzZSAnLCc6Ci0gICAgY2FzZSAnKCc6Ci0gICAgY2FzZSAnKSc6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVjIiwgdHlwZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ3knOgotICAgIGNhc2UgJ3cnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SWSkKLQkJCQkJICAgICAgICYgTUlQUzE2T1BfTUFTS19SWSldKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAndic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsCi0JCQkgICAgIG1pcHMxNl9yZWdfbmFtZXNbKChsID4+IE1JUFMxNk9QX1NIX1JYKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX1JYKV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICd6JzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgbWlwczE2X3JlZ19uYW1lc1soKGwgPj4gTUlQUzE2T1BfU0hfUlopCi0JCQkJCSAgICAgICAmIE1JUFMxNk9QX01BU0tfUlopXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1onOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICBtaXBzMTZfcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9NT1ZFMzJaKQotCQkJCQkgICAgICAgJiBNSVBTMTZPUF9NQVNLX01PVkUzMlopXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzAnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLCByZWdfbmFtZXNbMF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdTJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwgcmVnX25hbWVzWzI5XSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1AnOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkcGMiKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAnUic6Ci0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1szMV0pOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdYJzoKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJCVzIiwKLQkJCSAgICAgcmVnX25hbWVzWygobCA+PiBNSVBTMTZPUF9TSF9SRUdSMzIpCi0JCQkJCSYgTUlQUzE2T1BfTUFTS19SRUdSMzIpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ1knOgotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkJXMiLAotCQkJICAgICByZWdfbmFtZXNbTUlQUzE2T1BfRVhUUkFDVF9SRUczMlIgKGwpXSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJzwnOgotICAgIGNhc2UgJz4nOgotICAgIGNhc2UgJ1snOgotICAgIGNhc2UgJ10nOgotICAgIGNhc2UgJzQnOgotICAgIGNhc2UgJzUnOgotICAgIGNhc2UgJ0gnOgotICAgIGNhc2UgJ1cnOgotICAgIGNhc2UgJ0QnOgotICAgIGNhc2UgJ2onOgotICAgIGNhc2UgJzYnOgotICAgIGNhc2UgJzgnOgotICAgIGNhc2UgJ1YnOgotICAgIGNhc2UgJ0MnOgotICAgIGNhc2UgJ1UnOgotICAgIGNhc2UgJ2snOgotICAgIGNhc2UgJ0snOgotICAgIGNhc2UgJ3AnOgotICAgIGNhc2UgJ3EnOgotICAgIGNhc2UgJ0EnOgotICAgIGNhc2UgJ0InOgotICAgIGNhc2UgJ0UnOgotICAgICAgewotCWludCBpbW1lZCwgbmJpdHMsIHNoaWZ0LCBzaWduZWRwLCBleHRiaXRzLCBwY3JlbCwgZXh0dSwgYnJhbmNoOwotCi0Jc2hpZnQgPSAwOwotCXNpZ25lZHAgPSAwOwotCWV4dGJpdHMgPSAxNjsKLQlwY3JlbCA9IDA7Ci0JZXh0dSA9IDA7Ci0JYnJhbmNoID0gMDsKLQlzd2l0Y2ggKHR5cGUpCi0JICB7Ci0JICBjYXNlICc8JzoKLQkgICAgbmJpdHMgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7Ci0JICAgIGV4dGJpdHMgPSA1OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc+JzoKLQkgICAgbmJpdHMgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7Ci0JICAgIGV4dGJpdHMgPSA1OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdbJzoKLQkgICAgbmJpdHMgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JaKSAmIE1JUFMxNk9QX01BU0tfUlo7Ci0JICAgIGV4dGJpdHMgPSA2OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICddJzoKLQkgICAgbmJpdHMgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX1JYKSAmIE1JUFMxNk9QX01BU0tfUlg7Ci0JICAgIGV4dGJpdHMgPSA2OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc0JzoKLQkgICAgbmJpdHMgPSA0OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTQpICYgTUlQUzE2T1BfTUFTS19JTU00OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgZXh0Yml0cyA9IDE1OwotCSAgICBicmVhazsKLQkgIGNhc2UgJzUnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0gnOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMTsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDI7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnVyc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAyOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpZiAoKG9wLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfUEMpID09IDAKLQkJJiYgKG9wLT5waW5mbyAmIE1JUFMxNl9JTlNOX1JFQURfU1ApID09IDApCi0JICAgICAgewotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkJaW5mby0+ZGF0YV9zaXplID0gNDsKLQkgICAgICB9Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnRCc6Ci0JICAgIG5iaXRzID0gNTsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdqJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTUpICYgTUlQUzE2T1BfTUFTS19JTU01OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICc2JzoKLQkgICAgbmJpdHMgPSA2OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTYpICYgTUlQUzE2T1BfTUFTS19JTU02OwotCSAgICBicmVhazsKLQkgIGNhc2UgJzgnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnVic6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgc2hpZnQgPSAyOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICAvKiBGSVhNRTogVGhpcyBtaWdodCBiZSBsdywgb3IgaXQgbWlnaHQgYmUgYWRkaXUgdG8gJHNwIG9yCi0gICAgICAgICAgICAgICAkcGMuICBXZSBhc3N1bWUgaXQncyBsb2FkLiAgKi8KLQkgICAgaW5mby0+aW5zbl90eXBlID0gZGlzX2RyZWY7Ci0JICAgIGluZm8tPmRhdGFfc2l6ZSA9IDQ7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnQyc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgc2hpZnQgPSAzOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdVJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBleHR1ID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdrJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBzaWduZWRwID0gMTsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdLJzoKLQkgICAgbmJpdHMgPSA4OwotCSAgICBzaGlmdCA9IDM7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ3AnOgotCSAgICBuYml0cyA9IDg7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NOCkgJiBNSVBTMTZPUF9NQVNLX0lNTTg7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGJyYW5jaCA9IDE7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19jb25kYnJhbmNoOwotCSAgICBicmVhazsKLQkgIGNhc2UgJ3EnOgotCSAgICBuYml0cyA9IDExOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTExKSAmIE1JUFMxNk9QX01BU0tfSU1NMTE7Ci0JICAgIHNpZ25lZHAgPSAxOwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIGJyYW5jaCA9IDE7Ci0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19icmFuY2g7Ci0JICAgIGJyZWFrOwotCSAgY2FzZSAnQSc6Ci0JICAgIG5iaXRzID0gODsKLQkgICAgc2hpZnQgPSAyOwotCSAgICBpbW1lZCA9IChsID4+IE1JUFMxNk9QX1NIX0lNTTgpICYgTUlQUzE2T1BfTUFTS19JTU04OwotCSAgICBwY3JlbCA9IDE7Ci0JICAgIC8qIEZJWE1FOiBUaGlzIGNhbiBiZSBsdyBvciBsYS4gIFdlIGFzc3VtZSBpdCBpcyBsdy4gICovCi0JICAgIGluZm8tPmluc25fdHlwZSA9IGRpc19kcmVmOwotCSAgICBpbmZvLT5kYXRhX3NpemUgPSA0OwotCSAgICBicmVhazsKLQkgIGNhc2UgJ0InOgotCSAgICBuYml0cyA9IDU7Ci0JICAgIHNoaWZ0ID0gMzsKLQkgICAgaW1tZWQgPSAobCA+PiBNSVBTMTZPUF9TSF9JTU01KSAmIE1JUFMxNk9QX01BU0tfSU1NNTsKLQkgICAgcGNyZWwgPSAxOwotCSAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkgICAgaW5mby0+ZGF0YV9zaXplID0gODsKLQkgICAgYnJlYWs7Ci0JICBjYXNlICdFJzoKLQkgICAgbmJpdHMgPSA1OwotCSAgICBzaGlmdCA9IDI7Ci0JICAgIGltbWVkID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNSkgJiBNSVBTMTZPUF9NQVNLX0lNTTU7Ci0JICAgIHBjcmVsID0gMTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBhYm9ydCAoKTsKLQkgIH0KLQotCWlmICghIHVzZV9leHRlbmQpCi0JICB7Ci0JICAgIGlmIChzaWduZWRwICYmIGltbWVkID49ICgxIDw8IChuYml0cyAtIDEpKSkKLQkgICAgICBpbW1lZCAtPSAxIDw8IG5iaXRzOwotCSAgICBpbW1lZCA8PD0gc2hpZnQ7Ci0JICAgIGlmICgodHlwZSA9PSAnPCcgfHwgdHlwZSA9PSAnPicgfHwgdHlwZSA9PSAnWycgfHwgdHlwZSA9PSAnXScpCi0JCSYmIGltbWVkID09IDApCi0JICAgICAgaW1tZWQgPSA4OwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGV4dGJpdHMgPT0gMTYpCi0JICAgICAgaW1tZWQgfD0gKChleHRlbmQgJiAweDFmKSA8PCAxMSkgfCAoZXh0ZW5kICYgMHg3ZTApOwotCSAgICBlbHNlIGlmIChleHRiaXRzID09IDE1KQotCSAgICAgIGltbWVkIHw9ICgoZXh0ZW5kICYgMHhmKSA8PCAxMSkgfCAoZXh0ZW5kICYgMHg3ZjApOwotCSAgICBlbHNlCi0JICAgICAgaW1tZWQgPSAoKGV4dGVuZCA+PiA2KSAmIDB4MWYpIHwgKGV4dGVuZCAmIDB4MjApOwotCSAgICBpbW1lZCAmPSAoMSA8PCBleHRiaXRzKSAtIDE7Ci0JICAgIGlmICghIGV4dHUgJiYgaW1tZWQgPj0gKDEgPDwgKGV4dGJpdHMgLSAxKSkpCi0JICAgICAgaW1tZWQgLT0gMSA8PCBleHRiaXRzOwotCSAgfQotCi0JaWYgKCEgcGNyZWwpCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVkIiwgaW1tZWQpOwotCWVsc2UKLQkgIHsKLQkgICAgYmZkX3ZtYSBiYXNlYWRkcjsKLQkgICAgYmZkX3ZtYSB2YWw7Ci0KLQkgICAgaWYgKGJyYW5jaCkKLQkgICAgICB7Ci0JCWltbWVkICo9IDI7Ci0JCWJhc2VhZGRyID0gbWVtYWRkciArIDI7Ci0JICAgICAgfQotCSAgICBlbHNlIGlmICh1c2VfZXh0ZW5kKQotCSAgICAgIGJhc2VhZGRyID0gbWVtYWRkciAtIDI7Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCWludCBzdGF0dXM7Ci0JCWJmZF9ieXRlIGJ1ZmZlclsyXTsKLQotCQliYXNlYWRkciA9IG1lbWFkZHI7Ci0KLQkJLyogSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBpbiB0aGUgZGVsYXkgc2xvdCBvZiBhIGpyCi0gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoZSBiYXNlIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAganIgaW5zdHJ1Y3Rpb24uICBJZiBpdCBpcyBpbiB0aGUgZGVsYXkgc2xvdCBvZiBqYWxyCi0gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24sIHRoZSBiYXNlIGFkZHJlc3MgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgamFsciBpbnN0cnVjdGlvbi4gIFRoaXMgdGVzdCBpcyB1bnJlbGlhYmxlOiB3ZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUgcHJldmlvdXMgd29yZCBpcwotICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uIG9yIGRhdGEuICAqLwotCQlzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyIC0gNCwgYnVmZmVyLCAyLAotCQkJCQkJICAgIGluZm8pOwotCQlpZiAoc3RhdHVzID09IDAKLQkJICAgICYmICgoKGluZm8tPmVuZGlhbiA9PSBCRkRfRU5ESUFOX0JJRwotCQkJICA/IGJmZF9nZXRiMTYgKGJ1ZmZlcikKLQkJCSAgOiBiZmRfZ2V0bDE2IChidWZmZXIpKQotCQkJICYgMHhmODAwKSA9PSAweDE4MDApKQotCQkgIGJhc2VhZGRyID0gbWVtYWRkciAtIDQ7Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBzdGF0dXMgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyIC0gMiwgYnVmZmVyLAotCQkJCQkJCTIsIGluZm8pOwotCQkgICAgaWYgKHN0YXR1cyA9PSAwCi0JCQkmJiAoKChpbmZvLT5lbmRpYW4gPT0gQkZEX0VORElBTl9CSUcKLQkJCSAgICAgID8gYmZkX2dldGIxNiAoYnVmZmVyKQotCQkJICAgICAgOiBiZmRfZ2V0bDE2IChidWZmZXIpKQotCQkJICAgICAmIDB4ZjgxZikgPT0gMHhlODAwKSkKLQkJICAgICAgYmFzZWFkZHIgPSBtZW1hZGRyIC0gMjsKLQkJICB9Ci0JICAgICAgfQotCSAgICB2YWwgPSAoYmFzZWFkZHIgJiB+ICgoMSA8PCBzaGlmdCkgLSAxKSkgKyBpbW1lZDsKLQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICh2YWwsIGluZm8pOwotCSAgICBpbmZvLT50YXJnZXQgPSB2YWw7Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgJ2EnOgotICAgICAgaWYgKCEgdXNlX2V4dGVuZCkKLQlleHRlbmQgPSAwOwotICAgICAgbCA9ICgobCAmIDB4MWYpIDw8IDIzKSB8ICgobCAmIDB4M2UwKSA8PCAxMykgfCAoZXh0ZW5kIDw8IDIpOwotICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpICgobWVtYWRkciAmIDB4ZjAwMDAwMDApIHwgbCwgaW5mbyk7Ci0gICAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfanNyOwotICAgICAgaW5mby0+dGFyZ2V0ID0gKG1lbWFkZHIgJiAweGYwMDAwMDAwKSB8IGw7Ci0gICAgICBpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlICdsJzoKLSAgICBjYXNlICdMJzoKLSAgICAgIHsKLQlpbnQgbmVlZF9jb21tYSwgYW1hc2ssIHNtYXNrOwotCi0JbmVlZF9jb21tYSA9IDA7Ci0KLQlsID0gKGwgPj4gTUlQUzE2T1BfU0hfSU1NNikgJiBNSVBTMTZPUF9NQVNLX0lNTTY7Ci0KLQlhbWFzayA9IChsID4+IDMpICYgNzsKLQotCWlmIChhbWFzayA+IDAgJiYgYW1hc2sgPCA1KQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQlcyIsIHJlZ19uYW1lc1s0XSk7Ci0JICAgIGlmIChhbWFzayA+IDEpCi0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICItJCVzIiwKLQkJCQkgICAgIHJlZ19uYW1lc1thbWFzayArIDNdKTsKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICB9Ci0KLQlzbWFzayA9IChsID4+IDEpICYgMzsKLQlpZiAoc21hc2sgPT0gMykKLQkgIHsKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcz8/IiwKLQkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIpOwotCSAgICBuZWVkX2NvbW1hID0gMTsKLQkgIH0KLQllbHNlIGlmIChzbWFzayA+IDApCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMkJXMiLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIiwKLQkJCQkgICByZWdfbmFtZXNbMTZdKTsKLQkgICAgaWYgKHNtYXNrID4gMSkKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kJXMiLAotCQkJCSAgICAgcmVnX25hbWVzW3NtYXNrICsgMTVdKTsKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICB9Ci0KLQlpZiAobCAmIDEpCi0JICB7Ci0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMkJXMiLAotCQkJCSAgIG5lZWRfY29tbWEgPyAiLCIgOiAiIiwKLQkJCQkgICByZWdfbmFtZXNbMzFdKTsKLQkgICAgbmVlZF9jb21tYSA9IDE7Ci0JICB9Ci0KLQlpZiAoYW1hc2sgPT0gNSB8fCBhbWFzayA9PSA2KQotCSAgewotCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiVzJGYwIiwKLQkJCQkgICBuZWVkX2NvbW1hID8gIiwiIDogIiIpOwotCSAgICBpZiAoYW1hc2sgPT0gNikKLQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi0kZjEiKTsKLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFib3J0ICgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvbWlwcy1vcGMuYyBiL29wY29kZXMvbWlwcy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2NDYxOS4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL21pcHMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzIgKzAsMCBAQAotLyogbWlwcy5oLiAgTWlwcyBvcGNvZGUgbGlzdCBmb3IgR0RCLCB0aGUgR05VIGRlYnVnZ2VyLgotICAgQ29weXJpZ2h0IDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBSYWxwaCBDYW1wYmVsbCBhbmQgT1NGCi0gICBDb21tZW50ZWQgYW5kIG1vZGlmaWVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL21pcHMuaCIKLQotLyogU2hvcnQgaGFuZCBzbyB0aGUgbGluZXMgYXJlbid0IHRvbyBsb25nLiAgKi8KLQotI2RlZmluZSBMREQgICAgIElOU05fTE9BRF9NRU1PUllfREVMQVkKLSNkZWZpbmUgTENECUlOU05fTE9BRF9DT1BST0NfREVMQVkKLSNkZWZpbmUgVUJEICAgICBJTlNOX1VOQ09ORF9CUkFOQ0hfREVMQVkKLSNkZWZpbmUgQ0JECUlOU05fQ09ORF9CUkFOQ0hfREVMQVkKLSNkZWZpbmUgQ09EICAgICBJTlNOX0NPUFJPQ19NT1ZFX0RFTEFZCi0jZGVmaW5lIENMRAlJTlNOX0NPUFJPQ19NRU1PUllfREVMQVkKLSNkZWZpbmUgQ0JMCUlOU05fQ09ORF9CUkFOQ0hfTElLRUxZCi0jZGVmaW5lIFRSQVAJSU5TTl9UUkFQCi0jZGVmaW5lIFNNCUlOU05fU1RPUkVfTUVNT1JZCi0KLSNkZWZpbmUgV1JfZCAgICBJTlNOX1dSSVRFX0dQUl9ECi0jZGVmaW5lIFdSX3QgICAgSU5TTl9XUklURV9HUFJfVAotI2RlZmluZSBXUl8zMSAgIElOU05fV1JJVEVfR1BSXzMxICAgICAgIAotI2RlZmluZSBXUl9EICAgIElOU05fV1JJVEVfRlBSX0QgICAgICAgIAotI2RlZmluZSBXUl9UCUlOU05fV1JJVEVfRlBSX1QKLSNkZWZpbmUgV1JfUwlJTlNOX1dSSVRFX0ZQUl9TCi0jZGVmaW5lIFJEX3MgICAgSU5TTl9SRUFEX0dQUl9TICAgICAgICAgCi0jZGVmaW5lIFJEX2IgICAgSU5TTl9SRUFEX0dQUl9TICAgICAgICAgCi0jZGVmaW5lIFJEX3QgICAgSU5TTl9SRUFEX0dQUl9UICAgICAgICAgCi0jZGVmaW5lIFJEX1MgICAgSU5TTl9SRUFEX0ZQUl9TICAgICAgICAgCi0jZGVmaW5lIFJEX1QgICAgSU5TTl9SRUFEX0ZQUl9UICAgICAgICAgCi0jZGVmaW5lIFJEX1IJSU5TTl9SRUFEX0ZQUl9SCi0jZGVmaW5lIFdSX0NDCUlOU05fV1JJVEVfQ09ORF9DT0RFCi0jZGVmaW5lIFJEX0NDCUlOU05fUkVBRF9DT05EX0NPREUKLSNkZWZpbmUgUkRfQzAgICBJTlNOX0NPUAotI2RlZmluZSBSRF9DMQlJTlNOX0NPUAotI2RlZmluZSBSRF9DMiAgIElOU05fQ09QCi0jZGVmaW5lIFJEX0MzICAgSU5TTl9DT1AKLSNkZWZpbmUgV1JfQzAgICBJTlNOX0NPUAotI2RlZmluZSBXUl9DMQlJTlNOX0NPUAotI2RlZmluZSBXUl9DMiAgIElOU05fQ09QCi0jZGVmaW5lIFdSX0MzICAgSU5TTl9DT1AKLQotI2RlZmluZSBXUl9ISQlJTlNOX1dSSVRFX0hJCi0jZGVmaW5lIFJEX0hJCUlOU05fUkVBRF9ISQotI2RlZmluZSBNT0RfSEkgIFdSX0hJfFJEX0hJCi0KLSNkZWZpbmUgV1JfTE8JSU5TTl9XUklURV9MTwotI2RlZmluZSBSRF9MTwlJTlNOX1JFQURfTE8KLSNkZWZpbmUgTU9EX0xPICBXUl9MT3xSRF9MTwotCi0jZGVmaW5lIFdSX0hJTE8gV1JfSEl8V1JfTE8KLSNkZWZpbmUgUkRfSElMTyBSRF9ISXxSRF9MTwotI2RlZmluZSBNT0RfSElMTyBXUl9ISUxPfFJEX0hJTE8KLQotI2RlZmluZSBJU19NICAgIElOU05fTVVMVAotCi0jZGVmaW5lIEkxCUlOU05fSVNBMQotI2RlZmluZSBJMglJTlNOX0lTQTIKLSNkZWZpbmUgSTMJSU5TTl9JU0EzCi0jZGVmaW5lIEk0CUlOU05fSVNBNAotI2RlZmluZSBQMwlJTlNOXzQ2NTAKLSNkZWZpbmUgTDEJSU5TTl80MDEwCi0jZGVmaW5lIFYxICAgICAgSU5TTl80MTAwCi0jZGVmaW5lIFQzICAgICAgSU5TTl8zOTAwCi0KLSNkZWZpbmUgRzEgICAgICAoVDMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRzIgICAgICAoVDMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICApCi0KLSNkZWZpbmUgRzMgKEk0ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICkKLQotLyogVGhlIG9yZGVyIG9mIG92ZXJsb2FkZWQgaW5zdHJ1Y3Rpb25zIG1hdHRlcnMuICBMYWJlbCBhcmd1bWVudHMgYW5kCi0gICByZWdpc3RlciBhcmd1bWVudHMgbG9vayB0aGUgc2FtZS4gSW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIGhhdmUgZWl0aGVyCi0gICBmb3IgYXJndW1lbnRzIG11c3QgYXBlYXIgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgaW4gdGhpcyB0YWJsZSBmb3IgdGhlCi0gICBhc3NlbWJsZXIgdG8gcGljayB0aGUgcmlnaHQgb25lLiBJbiBvdGhlciB3b3JkcywgZW50cmllcyB3aXRoCi0gICBpbW1lZGlhdGUgb3BlcmFuZHMgbXVzdCBhcGVhciBhZnRlciB0aGUgc2FtZSBpbnN0cnVjdGlvbiB3aXRoCi0gICByZWdpc3RlcnMuCi0KLSAgIE1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBzaG9ydCBoYW5kIGZvciBvdGhlciBpbnN0cnVjdGlvbnMgKGkuZS4sIFRoZQotICAgamFsIDxyZWdpc3Rlcj4gaW5zdHJ1Y3Rpb24gaXMgc2hvcnQgZm9yIGphbHIgPHJlZ2lzdGVyPikuICAqLwotCi1jb25zdCBzdHJ1Y3QgbWlwc19vcGNvZGUgbWlwc19idWlsdGluX29wY29kZXNbXSA9IHsKLS8qIFRoZXNlIGluc3RydWN0aW9ucyBhcHBlYXIgZmlyc3Qgc28gdGhhdCB0aGUgZGlzYXNzZW1ibGVyIHdpbGwgZmluZAotICAgdGhlbSBmaXJzdC4gIFRoZSBhc3NlbWJsZXJzIHVzZXMgYSBoYXNoIHRhYmxlIGJhc2VkIG9uIHRoZQotICAgaW5zdHJ1Y3Rpb24gbmFtZSBhbnlob3cuICAqLwotLyogbmFtZSwJYXJncywJbWFzaywJCW1hdGNoLAlwaW5mbyAqLwoteyJub3AiLCAgICAgIiIsCQkweDAwMDAwMDAwLCAweGZmZmZmZmZmLAkwLAkJSTEJfSwKLXsibGkiLCAgICAgICJ0LGoiLCAgICAgIDB4MjQwMDAwMDAsIDB4ZmZlMDAwMDAsIFdSX3QsCQlJMQl9LCAvKiBhZGRpdSAqLwoteyJsaSIsCSAgICAidCxpIiwJMHgzNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJCUkxCX0sIC8qIG9yaSAqLwoteyJsaSIsICAgICAgInQsSSIsCTAsICAgIChpbnQpIE1fTEksCUlOU05fTUFDUk8sCUkxCX0sCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyZCwgMHhmYzFmMDdmZiwgV1JfZHxSRF9zLAlJMwl9LC8qIGRhZGR1ICovCi17Im1vdmUiLCAgICAiZCxzIiwJMHgwMDAwMDAyMSwgMHhmYzFmMDdmZiwgV1JfZHxSRF9zLAlJMQl9LC8qIGFkZHUgKi8KLXsibW92ZSIsICAgICJkLHMiLAkweDAwMDAwMDI1LCAweGZjMWYwN2ZmLAlXUl9kfFJEX3MsCUkxCX0sLyogb3IgKi8KLXsiYiIsICAgICAgICJwIiwJMHgxMDAwMDAwMCwgMHhmZmZmMDAwMCwJVUJELAkJSTEJfSwvKiBiZXEgMCwwICovCi17ImIiLCAgICAgICAicCIsCTB4MDQwMTAwMDAsIDB4ZmZmZjAwMDAsCVVCRCwJCUkxCX0sLyogYmdleiAwICovCi17ImJhbCIsICAgICAicCIsCTB4MDQxMTAwMDAsIDB4ZmZmZjAwMDAsCVVCRHxXUl8zMSwJSTEJfSwvKiBiZ2V6YWwgMCovCi0KLXsiYWJzIiwgICAgICJkLHYiLAkwLCAgICAoaW50KSBNX0FCUywJSU5TTl9NQUNSTywJSTEJfSwKLXsiYWJzLnMiLCAgICJELFYiLAkweDQ2MDAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTEJfSwKLXsiYWJzLmQiLCAgICJELFYiLAkweDQ2MjAwMDA1LCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTEJfSwKLXsiYWRkIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjAsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhZGQiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BRERfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYWRkLnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxfSwKLXsiYWRkLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxfSwKLXsiYWRkaSIsICAgICJ0LHIsaiIsCTB4MjAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsiYWRkaXUiLCAgICJ0LHIsaiIsCTB4MjQwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsiYWRkdSIsICAgICJkLHYsdCIsCTB4MDAwMDAwMjEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJhZGR1IiwgICAgInQscixJIiwJMCwgICAgKGludCkgTV9BRERVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImFuZCIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsiYW5kIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fQU5EX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImFuZGkiLCAgICAidCxyLGkiLAkweDMwMDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi0vKiBiIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHRhYmxlLiAgKi8KLS8qIGJhbCBpcyBhdCB0aGUgdG9wIG9mIHRoZSB0YWJsZS4gICovCi17ImJjMGYiLCAgICAicCIsCTB4NDEwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMwZmwiLCAgICJwIiwJMHg0MTAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzFmIiwgICAgInAiLAkweDQ1MDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTEJfSwKLXsiYmMxZiIsICAgICJOLHAiLAkweDQ1MDAwMDAwLCAweGZmZTMwMDAwLAlDQkR8UkRfQ0N8RlBfUywJSTQJfSwKLXsiYmMxZmwiLCAgICJwIiwJMHg0NTAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUkyfFQzCX0sCi17ImJjMWZsIiwgICAiTixwIiwJMHg0NTAyMDAwMCwgMHhmZmUzMDAwMCwJQ0JMfFJEX0NDfEZQX1MsCUk0CX0sCi17ImJjMmYiLCAgICAicCIsCTB4NDkwMDAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMyZmwiLCAgICJwIiwJMHg0OTAyMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiYzNmIiwgICAgInAiLAkweDRkMDAwMDAwLCAweGZmZmYwMDAwLAlDQkR8UkRfQ0MsCUkxCX0sCi17ImJjM2ZsIiwgICAicCIsCTB4NGQwMjAwMDAsIDB4ZmZmZjAwMDAsCUNCTHxSRF9DQywJSTJ8VDMJfSwKLXsiYmMwdCIsICAgICJwIiwJMHg0MTAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzB0bCIsICAgInAiLAkweDQxMDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjMXQiLCAgICAicCIsCTB4NDUwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJMQl9LAoteyJiYzF0IiwgICAgIk4scCIsCTB4NDUwMTAwMDAsIDB4ZmZlMzAwMDAsCUNCRHxSRF9DQ3xGUF9TLAlJNAl9LAoteyJiYzF0bCIsICAgInAiLAkweDQ1MDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTJ8VDMJfSwKLXsiYmMxdGwiLCAgICJOLHAiLAkweDQ1MDMwMDAwLCAweGZmZTMwMDAwLAlDQkx8UkRfQ0N8RlBfUywJSTQJfSwKLXsiYmMydCIsICAgICJwIiwJMHg0OTAxMDAwMCwgMHhmZmZmMDAwMCwJQ0JEfFJEX0NDLAlJMQl9LAoteyJiYzJ0bCIsICAgInAiLAkweDQ5MDMwMDAwLCAweGZmZmYwMDAwLAlDQkx8UkRfQ0MsCUkyfFQzCX0sCi17ImJjM3QiLCAgICAicCIsCTB4NGQwMTAwMDAsIDB4ZmZmZjAwMDAsCUNCRHxSRF9DQywJSTEJfSwKLXsiYmMzdGwiLCAgICJwIiwJMHg0ZDAzMDAwMCwgMHhmZmZmMDAwMCwJQ0JMfFJEX0NDLAlJMnxUMwl9LAoteyJiZXF6IiwgICAgInMscCIsCTB4MTAwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJiZXF6bCIsICAgInMscCIsCTB4NTAwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJiZXEiLCAgICAgInMsdCxwIiwJMHgxMDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JEfFJEX3N8UkRfdCwJSTEJfSwKLXsiYmVxIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkVRX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJlcWwiLCAgICAicyx0LHAiLAkweDUwMDAwMDAwLCAweGZjMDAwMDAwLAlDQkx8UkRfc3xSRF90LAlJMnxUMwl9LAoteyJiZXFsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CRVFMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZSIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdlIiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJnZWwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHRUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJnZWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JHRUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdldSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmdldSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ2V1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR0VVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdldWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdFVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmdleiIsICAgICJzLHAiLAkweDA0MDEwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmdlemwiLCAgICJzLHAiLAkweDA0MDMwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmdlemFsIiwgICJzLHAiLAkweDA0MTEwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfc3xXUl8zMSwJSTEJfSwKLXsiYmdlemFsbCIsICJzLHAiLAkweDA0MTMwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmd0IiwgICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdULAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3QiLCAgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmd0bCIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkdUTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmd0bCIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkdUTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ3R1IiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CR1RVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJiZ3R1IiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJndHVsIiwgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JHVFVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ3R1bCIsICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CR1RVTF9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJiZ3R6IiwgICAgInMscCIsCTB4MWMwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCRHxSRF9zLAlJMQl9LAoteyJiZ3R6bCIsICAgInMscCIsCTB4NWMwMDAwMDAsIDB4ZmMxZjAwMDAsCUNCTHxSRF9zLAlJMnxUMwl9LAoteyJibGUiLCAgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMRV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibGVsIiwgICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTEVMLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJibGVsIiwgICAgInMsSSxwIiwJMCwgICAgKGludCkgTV9CTEVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsZXUiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsZXUiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmxldWwiLCAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxFVUwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsZXVsIiwgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMRVVMX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsZXoiLCAgICAicyxwIiwJMHgxODAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JEfFJEX3MsCUkxCX0sCi17ImJsZXpsIiwgICAicyxwIiwJMHg1ODAwMDAwMCwgMHhmYzFmMDAwMCwJQ0JMfFJEX3MsCUkyfFQzCX0sCi17ImJsdCIsICAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVCwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0IiwgICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17ImJsdGwiLCAgICAicyx0LHAiLAkwLCAgICAoaW50KSBNX0JMVEwsCUlOU05fTUFDUk8sCUkyCX0sCi17ImJsdGwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JMVExfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmx0dSIsICAgICJzLHQscCIsCTAsICAgIChpbnQpIE1fQkxUVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiYmx0dSIsICAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibHR1bCIsICAgInMsdCxwIiwJMCwgICAgKGludCkgTV9CTFRVTCwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmx0dWwiLCAgICJzLEkscCIsCTAsICAgIChpbnQpIE1fQkxUVUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYmx0eiIsICAgICJzLHAiLAkweDA0MDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYmx0emwiLCAgICJzLHAiLAkweDA0MDIwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYmx0emFsIiwgICJzLHAiLAkweDA0MTAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfc3xXUl8zMSwJSTEJfSwKLXsiYmx0emFsbCIsICJzLHAiLAkweDA0MTIwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYm5leiIsICAgICJzLHAiLAkweDE0MDAwMDAwLCAweGZjMWYwMDAwLAlDQkR8UkRfcywJSTEJfSwKLXsiYm5lemwiLCAgICJzLHAiLAkweDU0MDAwMDAwLCAweGZjMWYwMDAwLAlDQkx8UkRfcywJSTJ8VDMJfSwKLXsiYm5lIiwgICAgICJzLHQscCIsCTB4MTQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNCRHxSRF9zfFJEX3QsCUkxCX0sCi17ImJuZSIsICAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JORV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJibmVsIiwgICAgInMsdCxwIiwJMHg1NDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0JMfFJEX3N8UkRfdCwgCUkyfFQzCX0sCi17ImJuZWwiLCAgICAicyxJLHAiLAkwLCAgICAoaW50KSBNX0JORUxfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsiYnJlYWsiLCAgICIiLAkJMHgwMDAwMDAwZCwgMHhmZmZmZmZmZiwJVFJBUCwJCUkxCX0sCi17ImJyZWFrIiwgICAiYyIsCTB4MDAwMDAwMGQsIDB4ZmMwMGZmZmYsCVRSQVAsCQlJMQl9LAoteyJicmVhayIsICAgImMscSIsCTB4MDAwMDAwMGQsIDB4ZmMwMDAwM2YsCVRSQVAsCQlJMQl9LAoteyJjLmYuZCIsICAgIlMsVCIsCTB4NDYyMDAwMzAsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLmYuZCIsICAgIk0sUyxUIiwJMHg0NjIwMDAzMCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMuZi5zIiwgICAiUyxUIiwJMHg0NjAwMDAzMCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMuZi5zIiwgICAiTSxTLFQiLAkweDQ2MDAwMDMwLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy51bi5kIiwgICJTLFQiLAkweDQ2MjAwMDMxLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51bi5kIiwgICJNLFMsVCIsCTB4NDYyMDAwMzEsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnVuLnMiLCAgIlMsVCIsCTB4NDYwMDAwMzEsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVuLnMiLCAgIk0sUyxUIiwJMHg0NjAwMDAzMSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMuZXEuZCIsICAiUyxUIiwJMHg0NjIwMDAzMiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuZXEuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDMyLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5lcS5zIiwgICJTLFQiLAkweDQ2MDAwMDMyLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5lcS5zIiwgICJNLFMsVCIsCTB4NDYwMDAwMzIsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLnVlcS5kIiwgIlMsVCIsCTB4NDYyMDAwMzMsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLnVlcS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzMywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMudWVxLnMiLCAiUyxUIiwJMHg0NjAwMDAzMywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMudWVxLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDMzLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5vbHQuZCIsICJTLFQiLAkweDQ2MjAwMDM0LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5vbHQuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzQsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm9sdC5zIiwgIlMsVCIsCTB4NDYwMDAwMzQsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm9sdC5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMudWx0LmQiLCAiUyxUIiwJMHg0NjIwMDAzNSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMudWx0LmQiLCAiTSxTLFQiLAkweDQ2MjAwMDM1LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy51bHQucyIsICJTLFQiLAkweDQ2MDAwMDM1LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy51bHQucyIsICJNLFMsVCIsCTB4NDYwMDAwMzUsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm9sZS5kIiwgIlMsVCIsCTB4NDYyMDAwMzYsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm9sZS5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzNiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMub2xlLnMiLCAiUyxUIiwJMHg0NjAwMDAzNiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMub2xlLnMiLCAiTSxTLFQiLAkweDQ2MDAwMDM2LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy51bGUuZCIsICJTLFQiLAkweDQ2MjAwMDM3LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy51bGUuZCIsICJNLFMsVCIsCTB4NDYyMDAwMzcsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnVsZS5zIiwgIlMsVCIsCTB4NDYwMDAwMzcsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnVsZS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzNywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMuc2YuZCIsICAiUyxUIiwJMHg0NjIwMDAzOCwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMuc2YuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDM4LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5zZi5zIiwgICJTLFQiLAkweDQ2MDAwMDM4LCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5zZi5zIiwgICJNLFMsVCIsCTB4NDYwMDAwMzgsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm5nbGUuZCIsIlMsVCIsCTB4NDYyMDAwMzksIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5nbGUuZCIsIk0sUyxUIiwJMHg0NjIwMDAzOSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubmdsZS5zIiwiUyxUIiwJMHg0NjAwMDAzOSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmdsZS5zIiwiTSxTLFQiLAkweDQ2MDAwMDM5LCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5zZXEuZCIsICJTLFQiLAkweDQ2MjAwMDNhLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5zZXEuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2EsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLnNlcS5zIiwgIlMsVCIsCTB4NDYwMDAwM2EsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLnNlcS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzYSwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubmdsLmQiLCAiUyxUIiwJMHg0NjIwMDAzYiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubmdsLmQiLCAiTSxTLFQiLAkweDQ2MjAwMDNiLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5uZ2wucyIsICJTLFQiLAkweDQ2MDAwMDNiLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5uZ2wucyIsICJNLFMsVCIsCTB4NDYwMDAwM2IsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLmx0LmQiLCAgIlMsVCIsCTB4NDYyMDAwM2MsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLmx0LmQiLCAgIk0sUyxUIiwJMHg0NjIwMDAzYywgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubHQucyIsICAiUyxUIiwJMHg0NjAwMDAzYywgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubHQucyIsICAiTSxTLFQiLAkweDQ2MDAwMDNjLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiYy5uZ2UuZCIsICJTLFQiLAkweDQ2MjAwMDNkLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTEJfSwKLXsiYy5uZ2UuZCIsICJNLFMsVCIsCTB4NDYyMDAwM2QsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJNAl9LAoteyJjLm5nZS5zIiwgIlMsVCIsCTB4NDYwMDAwM2QsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJMQl9LAoteyJjLm5nZS5zIiwgIk0sUyxUIiwJMHg0NjAwMDAzZCwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUk0CX0sCi17ImMubGUuZCIsICAiUyxUIiwJMHg0NjIwMDAzZSwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUkxCX0sCi17ImMubGUuZCIsICAiTSxTLFQiLAkweDQ2MjAwMDNlLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfRCwJSTQJfSwKLXsiYy5sZS5zIiwgICJTLFQiLAkweDQ2MDAwMDNlLCAweGZmZTAwN2ZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiYy5sZS5zIiwgICJNLFMsVCIsCTB4NDYwMDAwM2UsIDB4ZmZlMDAwZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9TLAlJNAl9LAoteyJjLm5ndC5kIiwgIlMsVCIsCTB4NDYyMDAwM2YsIDB4ZmZlMDA3ZmYsCVJEX1N8UkRfVHxXUl9DQ3xGUF9ELAlJMQl9LAoteyJjLm5ndC5kIiwgIk0sUyxUIiwJMHg0NjIwMDAzZiwgMHhmZmUwMDBmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX0QsCUk0CX0sCi17ImMubmd0LnMiLCAiUyxUIiwJMHg0NjAwMDAzZiwgMHhmZmUwMDdmZiwJUkRfU3xSRF9UfFdSX0NDfEZQX1MsCUkxCX0sCi17ImMubmd0LnMiLCAiTSxTLFQiLAkweDQ2MDAwMDNmLCAweGZmZTAwMGZmLAlSRF9TfFJEX1R8V1JfQ0N8RlBfUywJSTQJfSwKLXsiY2FjaGUiLCAgICJrLG8oYikiLAkweGJjMDAwMDAwLCAweGZjMDAwMDAwLCBSRF9iLAkJSTN8VDMJfSwKLXsiY2VpbC5sLmQiLCAiRCxTIiwJMHg0NjIwMDAwYSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkzCX0sCi17ImNlaWwubC5zIiwgIkQsUyIsCTB4NDYwMDAwMGEsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJjZWlsLncuZCIsICJELFMiLAkweDQ2MjAwMDBlLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsiY2VpbC53LnMiLCAiRCxTIiwJMHg0NjAwMDAwZSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17ImNmYzAiLCAgICAidCxHIiwJMHg0MDQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzAsCUkxCX0sCi17ImNmYzEiLCAgICAidCxHIiwJMHg0NDQwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzF8RlBfUywJSTEJfSwKLXsiY2ZjMSIsICAgICJ0LFMiLAkweDQ0NDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9DMXxGUF9TLAlJMQl9LAoteyJjZmMyIiwgICAgInQsRyIsCTB4NDg0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MyLAlJMQl9LAoteyJjZmMzIiwgICAgInQsRyIsCTB4NGM0MDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MzLAlJMQl9LAoteyJjdGMwIiwgICAgInQsRyIsCTB4NDBjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDLAlJMQl9LAoteyJjdGMxIiwgICAgInQsRyIsCTB4NDRjMDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0NDfEZQX1MsCUkxCX0sCi17ImN0YzEiLCAgICAidCxTIiwJMHg0NGMwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfQ0N8RlBfUywJSTEJfSwKLXsiY3RjMiIsICAgICJ0LEciLAkweDQ4YzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQywJSTEJfSwKLXsiY3RjMyIsICAgICJ0LEciLAkweDRjYzAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DQywJSTEJfSwKLXsiY3Z0LmQubCIsICJELFMiLAkweDQ2YTAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiY3Z0LmQucyIsICJELFMiLAkweDQ2MDAwMDIxLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfRHxGUF9TLAlJMQl9LAoteyJjdnQuZC53IiwgIkQsUyIsCTB4NDY4MDAwMjEsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJjdnQubC5kIiwgIkQsUyIsCTB4NDYyMDAwMjUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJjdnQubC5zIiwgIkQsUyIsCTB4NDYwMDAwMjUsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJjdnQucy5sIiwgIkQsUyIsCTB4NDZhMDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJjdnQucy5kIiwgIkQsUyIsCTB4NDYyMDAwMjAsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TfEZQX0QsCUkxCX0sCi17ImN2dC5zLnciLCAiRCxTIiwJMHg0NjgwMDAyMCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17ImN2dC53LmQiLCAiRCxTIiwJMHg0NjIwMDAyNCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17ImN2dC53LnMiLCAiRCxTIiwJMHg0NjAwMDAyNCwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17ImRhYnMiLCAgICAiZCx2IiwJMCwgICAgKGludCkgTV9EQUJTLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkYWRkIiwgICAgImQsdix0IiwJMHgwMDAwMDAyYywgMHhmYzAwMDdmZiwgV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRhZGQiLCAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX0RBRERfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGFkZGkiLCAgICJ0LHIsaiIsCTB4NjAwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJSTMJfSwKLXsiZGFkZGl1IiwgICJ0LHIsaiIsCTB4NjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFdSX3R8UkRfcywJSTMJfSwKLXsiZGFkZHUiLCAgICJkLHYsdCIsCTB4MDAwMDAwMmQsIDB4ZmMwMDA3ZmYsIFdSX2R8UkRfc3xSRF90LAlJMwl9LAoteyJkYWRkdSIsICAgInQscixJIiwJMCwgICAgKGludCkgTV9EQUREVV9JLAlJTlNOX01BQ1JPLAlJMwl9LAotLyogZGN0ciBhbmQgZGN0dyBhcmUgdXNlZCBvbiB0aGUgcjUwMDAuICAqLwoteyJkY3RyIiwgICAgIm8oYikiLAkweGJjMDUwMDAwLCAweGZjMWYwMDAwLCBSRF9iLAlJMwl9LAoteyJkY3R3IiwgICAgIm8oYikiLAkweGJjMDkwMDAwLCAweGZjMWYwMDAwLCBSRF9iLAlJMwl9LAoteyJkZXJldCIsICAgIiIsICAgICAgICAgMHg0MjAwMDAxZiwgMHhmZmZmZmZmZiwgICAgMCwJRzIJfSwKLS8qIEZvciBkZGl2LCBzZWUgdGhlIGNvbW1lbnRzIGFib3V0IGRpdi4gICovCi17ImRkaXYiLCAgICAieixzLHQiLAkweDAwMDAwMDFlLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRkaXYiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX0RESVZfMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZGRpdiIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRERJVl8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLS8qIEZvciBkZGl2dSwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLwoteyJkZGl2dSIsICAgInoscyx0IiwJMHgwMDAwMDAxZiwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMwl9LAoteyJkZGl2dSIsICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ERElWVV8zLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkZGl2dSIsICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ERElWVV8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLS8qIFRoZSBNSVBTIGFzc2VtYmxlciB0cmVhdHMgdGhlIGRpdiBvcGNvZGUgd2l0aCB0d28gb3BlcmFuZHMgYXMKLSAgIHRob3VnaCB0aGUgZmlyc3Qgb3BlcmFuZCBhcHBlYXJlZCB0d2ljZSAodGhlIGZpcnN0IG9wZXJhbmQgaXMgYm90aAotICAgYSBzb3VyY2UgYW5kIGEgZGVzdGluYXRpb24pLiAgVG8gZ2V0IHRoZSBkaXYgbWFjaGluZSBpbnN0cnVjdGlvbiwKLSAgIHlvdSBtdXN0IHVzZSBhbiBleHBsaWNpdCBkZXN0aW5hdGlvbiBvZiAkMC4gICovCi17ImRpdiIsICAgICAieixzLHQiLAkweDAwMDAwMDFhLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxCX0sCi17ImRpdiIsICAgICAieix0IiwJMHgwMDAwMDAxYSwgMHhmZmUwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXYiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ESVZfMywJSU5TTl9NQUNSTywJSTEJfSwKLXsiZGl2IiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRElWXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkaXYuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMywgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTEJfSwKLXsiZGl2LnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDMsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxCX0sCi0vKiBGb3IgZGl2dSwgc2VlIHRoZSBjb21tZW50cyBhYm91dCBkaXYuICAqLwoteyJkaXZ1IiwgICAgInoscyx0IiwJMHgwMDAwMDAxYiwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAlJMQl9LAoteyJkaXZ1IiwgICAgInosdCIsCTB4MDAwMDAwMWIsIDB4ZmZlMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTEJfSwKLXsiZGl2dSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRElWVV8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkaXZ1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9ESVZVXzNJLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJkbGEiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fRExBX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbGkiLCAgICAgInQsaiIsICAgICAgMHgyNDAwMDAwMCwgMHhmZmUwMDAwMCwgV1JfdCwJSTMJfSwgLyogYWRkaXUgKi8KLXsiZGxpIiwJICAgICJ0LGkiLAkweDM0MDAwMDAwLCAweGZmZTAwMDAwLCBXUl90LAlJMwl9LCAvKiBvcmkgKi8KLXsiZGxpIiwgICAgICJ0LEkiLAkwLCAgICAoaW50KSBNX0RMSSwJSU5TTl9NQUNSTywJSTMJfSwKLQoteyJkbWFkZDE2IiwgInMsdCIsICAgICAgMHgwMDAwMDAyOSwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0xPfFJEX0xPLAlWMQl9LAoteyJkbWZjMCIsICAgInQsRyIsCTB4NDAyMDAwMDAsIDB4ZmZlMDA3ZmYsIExDRHxXUl90fFJEX0MwLAlJMwl9LAoteyJkbXRjMCIsICAgInQsRyIsCTB4NDBhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX0MwfFdSX0NDLAlJMwl9LAoteyJkbWZjMSIsICAgInQsUyIsCTB4NDQyMDAwMDAsIDB4ZmZlMDA3ZmYsIExDRHxXUl90fFJEX1N8RlBfUywJSTMJfSwKLXsiZG10YzEiLCAgICJ0LFMiLAkweDQ0YTAwMDAwLCAweGZmZTAwN2ZmLCBDT0R8UkRfdHxXUl9TfEZQX1MsCUkzCX0sCi17ImRtZmMyIiwgICAidCxTIiwJMHg0ODIwMDAwMCwgMHhmZmUwMDdmZiwgTENEfFdSX3R8UkRfU3xGUF9TLAlJMwl9LAoteyJkbXRjMiIsICAgInQsUyIsCTB4NDhhMDAwMDAsIDB4ZmZlMDA3ZmYsIENPRHxSRF90fFdSX1N8RlBfUywJSTMJfSwKLXsiZG11bCIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRE1VTCwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bCIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRE1VTF9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsbyIsICAgImQsdix0IiwJMCwgICAgKGludCkgTV9ETVVMTywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bG8iLCAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRE1VTE9fSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bG91IiwgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fRE1VTE9VLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkbXVsb3UiLCAgImQsdixJIiwJMCwgICAgKGludCkgTV9ETVVMT1VfSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZG11bHQiLCAgICJzLHQiLAkweDAwMDAwMDFjLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCSAgICBJM30sCi17ImRtdWx0dSIsICAicyx0IiwJMHgwMDAwMDAxZCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLCAgICAgIEkzfSwKLXsiZG5lZyIsICAgICJkLHciLAkweDAwMDAwMDJlLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkzCX0sIC8qIGRzdWIgMCAqLwoteyJkbmVndSIsICAgImQsdyIsCTB4MDAwMDAwMmYsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTMJfSwgLyogZHN1YnUgMCovCi17ImRyZW0iLCAgICAieixzLHQiLAkweDAwMDAwMDFlLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkzCX0sCi17ImRyZW0iLCAgICAiZCx2LHQiLAkzLCAgICAoaW50KSBNX0RSRU1fMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHJlbSIsICAgICJkLHYsSSIsCTMsICAgIChpbnQpIE1fRFJFTV8zSSwJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHJlbXUiLCAgICJ6LHMsdCIsCTB4MDAwMDAwMWYsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxXUl9ISXxXUl9MTywJSTMJfSwKLXsiZHJlbXUiLCAgICJkLHYsdCIsCTMsICAgIChpbnQpIE1fRFJFTVVfMywJSU5TTl9NQUNSTywJSTMJfSwKLXsiZHJlbXUiLCAgICJkLHYsSSIsCTMsICAgIChpbnQpIE1fRFJFTVVfM0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImRzbGx2IiwgICAiZCx0LHMiLAkweDAwMDAwMDE0LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwKLXsiZHNsbDMyIiwgICJkLHcsPCIsCTB4MDAwMDAwM2MsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwKLXsiZHNsbCIsICAgICJkLHcscyIsCTB4MDAwMDAwMTQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LCAvKiBkc2xsdiAqLwoteyJkc2xsIiwgICAgImQsdyw+IiwJMHgwMDAwMDAzYywgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LCAvKiBkc2xsMzIgKi8KLXsiZHNsbCIsICAgICJkLHcsPCIsCTB4MDAwMDAwMzgsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTMJfSwKLXsiZHNyYXYiLCAgICJkLHQscyIsCTB4MDAwMDAwMTcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMwl9LAoteyJkc3JhMzIiLCAgImQsdyw8IiwJMHgwMDAwMDAzZiwgMHhmZmUwMDAzZiwgV1JfZHxSRF90LAlJMwl9LAoteyJkc3JhIiwgICAgImQsdyxzIiwJMHgwMDAwMDAxNywgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sIC8qIGRzcmF2ICovCi17ImRzcmEiLCAgICAiZCx3LD4iLAkweDAwMDAwMDNmLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sIC8qIGRzcmEzMiAqLwoteyJkc3JhIiwgICAgImQsdyw8IiwJMHgwMDAwMDAzYiwgMHhmZmUwMDAzZiwJV1JfZHxSRF90LAlJMwl9LAoteyJkc3JsdiIsICAgImQsdCxzIiwJMHgwMDAwMDAxNiwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkzCX0sCi17ImRzcmwzMiIsICAiZCx3LDwiLAkweDAwMDAwMDNlLCAweGZmZTAwMDNmLCBXUl9kfFJEX3QsCUkzCX0sCi17ImRzcmwiLCAgICAiZCx3LHMiLAkweDAwMDAwMDE2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTMJfSwgLyogZHNybHYgKi8KLXsiZHNybCIsICAgICJkLHcsPiIsCTB4MDAwMDAwM2UsIDB4ZmZlMDAwM2YsIFdSX2R8UkRfdCwJSTMJfSwgLyogZHNybDMyICovCi17ImRzcmwiLCAgICAiZCx3LDwiLAkweDAwMDAwMDNhLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkzCX0sCi17ImRzdWIiLCAgICAiZCx2LHQiLAkweDAwMDAwMDJlLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTMJfSwKLXsiZHN1YiIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fRFNVQl9JLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJkc3VidSIsICAgImQsdix0IiwJMHgwMDAwMDAyZiwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkzCX0sCi17ImRzdWJ1IiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX0RTVUJVX0ksCUlOU05fTUFDUk8sCUkzCX0sCi17ImVyZXQiLCAgICAiIiwJCTB4NDIwMDAwMTgsIDB4ZmZmZmZmZmYsCTAsCUkzCX0sCi17ImZsb29yLmwuZCIsICJELFMiLAkweDQ2MjAwMDBiLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsiZmxvb3IubC5zIiwgIkQsUyIsCTB4NDYwMDAwMGIsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJmbG9vci53LmQiLCAiRCxTIiwJMHg0NjIwMDAwZiwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17ImZsb29yLncucyIsICJELFMiLAkweDQ2MDAwMDBmLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsiZmx1c2hpIiwgICIiLAkJMHhiYzAxMDAwMCwgMHhmZmZmZmZmZiwgMCwJCUwxCX0sCi17ImZsdXNoZCIsICAiIiwJCTB4YmMwMjAwMDAsIDB4ZmZmZmZmZmYsIDAsIEwxCQl9LAoteyJmbHVzaGlkIiwgIiIsCQkweGJjMDMwMDAwLCAweGZmZmZmZmZmLCAwLCBMMQkJfSwKLXsiaGliZXJuYXRlIiwiIiwgICAgICAgIDB4NDIwMDAwMjMsIDB4ZmZmZmZmZmYsCTAsIFYxCX0sCi17ImpyIiwgICAgICAicyIsCTB4MDAwMDAwMDgsIDB4ZmMxZmZmZmYsCVVCRHxSRF9zLAlJMQl9LAoteyJqIiwgICAgICAgInMiLAkweDAwMDAwMDA4LCAweGZjMWZmZmZmLAlVQkR8UkRfcywJSTEJfSwgLyoganIgKi8KLS8qIFNWUjQgUElDIGNvZGUgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBmb3Igaiwgc28gaXQgbXVzdCBiZSBhCi0gICBtYWNyby4gICovCi17ImoiLAkgICAgImEiLAkwLCAgICAgKGludCkgTV9KX0EsCUlOU05fTUFDUk8sCUkxCX0sCi0vKiBUaGlzIGZvcm0gb2YgaiBpcyB1c2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGludGVybmFsbHkgYnkgdGhlCi0gICBhc3NlbWJsZXIsIGJ1dCB3aWxsIG5ldmVyIG1hdGNoIHVzZXIgaW5wdXQgKGJlY2F1c2UgdGhlIGxpbmUgYWJvdmUKLSAgIHdpbGwgbWF0Y2ggZmlyc3QpLiAgKi8KLXsiaiIsICAgICAgICJhIiwJMHgwODAwMDAwMCwgMHhmYzAwMDAwMCwJVUJELAkJSTEJfSwKLXsiamFsciIsICAgICJzIiwJMHgwMDAwZjgwOSwgMHhmYzFmZmZmZiwJVUJEfFJEX3N8V1JfZCwJSTEJfSwKLXsiamFsciIsICAgICJkLHMiLAkweDAwMDAwMDA5LCAweGZjMWYwN2ZmLAlVQkR8UkRfc3xXUl9kLAlJMQl9LAotLyogU1ZSNCBQSUMgY29kZSByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nIGZvciBqYWwsIHNvIGl0IG11c3QgYmUgYQotICAgbWFjcm8uICAqLwoteyJqYWwiLCAgICAgImQscyIsCTAsICAgICAoaW50KSBNX0pBTF8yLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJqYWwiLCAgICAgInMiLAkwLCAgICAgKGludCkgTV9KQUxfMSwJSU5TTl9NQUNSTywJSTEJfSwKLXsiamFsIiwgICAgICJhIiwJMCwgICAgIChpbnQpIE1fSkFMX0EsCUlOU05fTUFDUk8sCUkxCX0sCi0vKiBUaGlzIGZvcm0gb2YgamFsIGlzIHVzZWQgYnkgdGhlIGRpc2Fzc2VtYmxlciBhbmQgaW50ZXJuYWxseSBieSB0aGUKLSAgIGFzc2VtYmxlciwgYnV0IHdpbGwgbmV2ZXIgbWF0Y2ggdXNlciBpbnB1dCAoYmVjYXVzZSB0aGUgbGluZSBhYm92ZQotICAgd2lsbCBtYXRjaCBmaXJzdCkuICAqLwoteyJqYWwiLCAgICAgImEiLAkweDBjMDAwMDAwLCAweGZjMDAwMDAwLAlVQkR8V1JfMzEsCUkxCX0sCi0gIC8qIGphbHggcmVhbGx5IHNob3VsZCBvbmx5IGJlIGF2YWxpYWJsZSBpZiBtaXBzMTYgaXMgYXZhaWxhYmxlLAotICAgICBidXQgZm9yIG5vdyBtYWtlIGl0IEkxLiAqLwoteyJqYWx4IiwgICAgImEiLAkweDc0MDAwMDAwLCAweGZjMDAwMDAwLCBVQkR8V1JfMzEsCUkxICAgICAgfSwKLXsibGEiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xBX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsYiIsICAgICAgInQsbyhiKSIsCTB4ODAwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxiIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MQl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGJ1IiwgICAgICJ0LG8oYikiLAkweDkwMDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsYnUiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEJVX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZCIsCSAgICAidCxvKGIpIiwgICAweGRjMDAwMDAwLCAweGZjMDAwMDAwLCBXUl90fFJEX2IsCUkzCX0sCi17ImxkIiwgICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9MRF9PQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGQiLCAgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xEX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsZGMxIiwgICAgIlQsbyhiKSIsCTB4ZDQwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX1R8RlBfRCwJSTIJfSwKLXsibGRjMSIsICAgICJFLG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sCi17ImxkYzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9MREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsZGMxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDMV9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibC5kIiwgICAgICJULG8oYikiLAkweGQ0MDAwMDAwLCAweGZjMDAwMDAwLCBDTER8UkRfYnxXUl9UfEZQX0QsCUkyCX0sIC8qIGxkYzEgKi8KLXsibC5kIiwgICAgICJULG8oYikiLAkwLCAgICAoaW50KSBNX0xfRE9CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsLmQiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTF9EQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxkYzIiLCAgICAiRSxvKGIpIiwJMHhkODAwMDAwMCwgMHhmYzAwMDAwMCwgQ0xEfFJEX2J8V1JfQ0MsCUkyCX0sCi17ImxkYzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MREMyX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJsZGMzIiwgICAgIkUsbyhiKSIsCTB4ZGMwMDAwMDAsIDB4ZmMwMDAwMDAsIENMRHxSRF9ifFdSX0NDLAlJMgl9LAoteyJsZGMzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fTERDM19BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGRsIiwJICAgICJ0LG8oYikiLAkweDY4MDAwMDAwLCAweGZjMDAwMDAwLCBMRER8V1JfdHxSRF9iLAlJMwl9LAoteyJsZGwiLAkgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTERMX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsZHIiLAkgICAgInQsbyhiKSIsCTB4NmMwMDAwMDAsIDB4ZmMwMDAwMDAsIExERHxXUl90fFJEX2IsCUkzCX0sCi17ImxkciIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MRFJfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17ImxkeGMxIiwgICAiRCx0KGIpIiwJMHg0YzAwMDAwMSwgMHhmYzAwZjgzZiwgTEREfFdSX0R8UkRfdHxSRF9iLAlJNAl9LAoteyJsaCIsICAgICAgInQsbyhiKSIsCTB4ODQwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17ImxoIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MSF9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibGh1IiwgICAgICJ0LG8oYikiLAkweDk0MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsaHUiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTEhVX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAotLyogbGkgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZS4gICovCi17ImxpLmQiLCAgICAidCxGIiwJMCwgICAgKGludCkgTV9MSV9ELAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaS5kIiwgICAgIlQsTCIsCTAsICAgIChpbnQpIE1fTElfREQsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxpLnMiLCAgICAidCxmIiwJMCwgICAgKGludCkgTV9MSV9TLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsaS5zIiwgICAgIlQsbCIsCTAsICAgIChpbnQpIE1fTElfU1MsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxsIiwJICAgICJ0LG8oYikiLAkweGMwMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8UkRfYnxXUl90LAlJMgl9LAoteyJsbCIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MTF9BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsibGxkIiwJICAgICJ0LG8oYikiLAkweGQwMDAwMDAwLCAweGZjMDAwMDAwLCBMRER8UkRfYnxXUl90LAlJMwl9LAoteyJsbGQiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTExEX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJsdWkiLCAgICAgInQsdSIsCTB4M2MwMDAwMDAsIDB4ZmZlMDAwMDAsCVdSX3QsCQlJMQl9LAoteyJsdyIsICAgICAgInQsbyhiKSIsCTB4OGMwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17Imx3IiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMCIsICAgICJFLG8oYikiLAkweGMwMDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9DQywJSTEJfSwKLXsibHdjMCIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzBfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzEiLCAgICAiVCxvKGIpIiwJMHhjNDAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfVHxGUF9TLAlJMQl9LAoteyJsd2MxIiwgICAgIkUsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJSTEJfSwKLXsibHdjMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzFfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsLnMiLCAgICAgIlQsbyhiKSIsCTB4YzQwMDAwMDAsIDB4ZmMwMDAwMDAsCUNMRHxSRF9ifFdSX1R8RlBfUywJSTEJfSwgLyogbHdjMSAqLwoteyJsLnMiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsibHdjMiIsICAgICJFLG8oYikiLAkweGM4MDAwMDAwLCAweGZjMDAwMDAwLAlDTER8UkRfYnxXUl9DQywJSTEJfSwKLXsibHdjMiIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX0xXQzJfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17Imx3YzMiLCAgICAiRSxvKGIpIiwJMHhjYzAwMDAwMCwgMHhmYzAwMDAwMCwJQ0xEfFJEX2J8V1JfQ0MsCUkxCX0sCi17Imx3YzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9MV0MzX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJsd2wiLCAgICAgInQsbyhiKSIsCTB4ODgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkxCX0sCi17Imx3bCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9MV0xfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImxjYWNoZSIsICAidCxvKGIpIiwJMHg4ODAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTIJfSwgLyogc2FtZSAqLwoteyJsY2FjaGUiLCAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdMX0FCLAlJTlNOX01BQ1JPLAlJMgl9LCAvKiBhcyBsd2wgKi8KLXsibHdyIiwgICAgICJ0LG8oYikiLAkweDk4MDAwMDAwLCAweGZjMDAwMDAwLAlMRER8UkRfYnxXUl90LAlJMQl9LAoteyJsd3IiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fTFdSX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJmbHVzaCIsICAgInQsbyhiKSIsCTB4OTgwMDAwMDAsIDB4ZmMwMDAwMDAsCUxERHxSRF9ifFdSX3QsCUkyCX0sIC8qIHNhbWUgKi8KLXsiZmx1c2giLCAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXUl9BQiwJSU5TTl9NQUNSTywJSTIJfSwgLyogYXMgbHdyICovCi17Imx3dSIsICAgICAidCxvKGIpIiwJMHg5YzAwMDAwMCwgMHhmYzAwMDAwMCwJTEREfFJEX2J8V1JfdCwJSTMJfSwKLXsibHd1IiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX0xXVV9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsibHd4YzEiLCAgICJELHQoYikiLAkweDRjMDAwMDAwLCAweGZjMDBmODNmLCBMRER8V1JfRHxSRF90fFJEX2IsCUk0CX0sCi0KLQoteyJtYWQiLAkgICAgInMsdCIsCTB4NzAwMDAwMDAsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xSRF9ISXxSRF9MTywJUDMJfSwKLXsibWFkdSIsICAgICJzLHQiLAkweDcwMDAwMDAxLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98UkRfSEl8UkRfTE8sCVAzCX0sCi17Im1hZGQuZCIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjEsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfRCwJSTQJfSwKLXsibWFkZC5zIiwgICJELFIsUyxUIiwJMHg0YzAwMDAyMCwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9TLAlJNAl9LAoteyJtYWRkIiwgICAgInMsdCIsCTB4MDAwMDAwMWMsIDB4ZmMwMGZmZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MTywJCUwxCX0sCi17Im1hZGQiLCAgICAicyx0IiwJMHg3MDAwMDAwMCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCSAgICAgICAgRzEJfSwKLXsibWFkZCIsICAgICJkLHMsdCIsCTB4NzAwMDAwMDAsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sCUcxCX0sCi17Im1hZGR1IiwgICAicyx0IiwJMHgwMDAwMDAxZCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPLAkJTDEJfSwKLXsibWFkZHUiLCAgICJzLHQiLAkweDcwMDAwMDAxLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJRzF9LAoteyJtYWRkdSIsICAgImQscyx0IiwJMHg3MDAwMDAwMSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwJRzF9LAoteyJtYWRkMTYiLCAgInMsdCIsICAgICAgMHgwMDAwMDAyOCwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFdSX0hJfFdSX0xPfFJEX0hJfFJEX0xPLAlWMQl9LAoteyJtZmMwIiwgICAgInQsRyIsCTB4NDAwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX0MwLAlJMQl9LAoteyJtZmMxIiwgICAgInQsUyIsCTB4NDQwMDAwMDAsIDB4ZmZlMDA3ZmYsCUxDRHxXUl90fFJEX1N8RlBfUywJSTEJfSwKLXsibWZjMSIsICAgICJ0LEciLAkweDQ0MDAwMDAwLCAweGZmZTAwN2ZmLAlMQ0R8V1JfdHxSRF9TfEZQX1MsCUkxCX0sCi17Im1mYzIiLCAgICAidCxHIiwJMHg0ODAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzIsCUkxCX0sCi17Im1mYzMiLCAgICAidCxHIiwJMHg0YzAwMDAwMCwgMHhmZmUwMDdmZiwJTENEfFdSX3R8UkRfQzMsCUkxCX0sCi17Im1maGkiLCAgICAiZCIsCTB4MDAwMDAwMTAsIDB4ZmZmZjA3ZmYsCVdSX2R8UkRfSEksCUkxCX0sCi17Im1mbG8iLCAgICAiZCIsCTB4MDAwMDAwMTIsIDB4ZmZmZjA3ZmYsCVdSX2R8UkRfTE8sCUkxCX0sCi17Im1vdi5kIiwgICAiRCxTIiwJMHg0NjIwMDAwNiwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX0QsCUkxCX0sCi17Im1vdi5zIiwgICAiRCxTIiwJMHg0NjAwMDAwNiwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkxCX0sCi17Im1vdmYiLCAgICAiZCxzLE4iLAkweDAwMDAwMDAxLCAweGZjMDMwN2ZmLCBXUl9kfFJEX3N8UkRfQ0N8RlBfRHxGUF9TLAlJNAl9LAoteyJtb3ZmLmQiLCAgIkQsUyxOIiwJMHg0NjIwMDAxMSwgMHhmZmUzMDAzZiwgV1JfRHxSRF9TfFJEX0NDfEZQX0QsCUk0CX0sCi17Im1vdmYucyIsICAiRCxTLE4iLAkweDQ2MDAwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfUywJSTQJfSwKLXsibW92biIsICAgICJkLHYsdCIsCTB4MDAwMDAwMGIsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJNAl9LAoteyJmZmMiLCAgICAgImQsdiIsCTB4MDAwMDAwMGIsIDB4ZmMxZjA3ZmYsCVdSX2R8UkRfcyxMMQl9LAoteyJtb3ZuLmQiLCAgIkQsUyx0IiwJMHg0NjIwMDAxMywgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfRCwJSTQJfSwKLXsibW92bi5zIiwgICJELFMsdCIsCTB4NDYwMDAwMTMsIDB4ZmZlMDAwM2YsIFdSX0R8UkRfU3xSRF90fEZQX1MsCUk0CX0sCi17Im1vdnQiLCAgICAiZCxzLE4iLAkweDAwMDEwMDAxLCAweGZjMDMwN2ZmLCBXUl9kfFJEX3N8UkRfQ0MsCUk0CX0sCi17Im1vdnQuZCIsICAiRCxTLE4iLAkweDQ2MjEwMDExLCAweGZmZTMwMDNmLCBXUl9EfFJEX1N8UkRfQ0N8RlBfRCwJSTQJfSwKLXsibW92dC5zIiwgICJELFMsTiIsCTB4NDYwMTAwMTEsIDB4ZmZlMzAwM2YsIFdSX0R8UkRfU3xSRF9DQ3xGUF9TLAlJNAl9LAoteyJtb3Z6IiwgICAgImQsdix0IiwJMHgwMDAwMDAwYSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUk0CX0sCi17ImZmcyIsICAgICAiZCx2IiwJMHgwMDAwMDAwYSwgMHhmYzFmMDdmZiwJV1JfZHxSRF9zLEwxCX0sCi17Im1vdnouZCIsICAiRCxTLHQiLAkweDQ2MjAwMDEyLCAweGZmZTAwMDNmLCBXUl9EfFJEX1N8UkRfdHxGUF9ELAlJNAl9LAoteyJtb3Z6LnMiLCAgIkQsUyx0IiwJMHg0NjAwMDAxMiwgMHhmZmUwMDAzZiwgV1JfRHxSRF9TfFJEX3R8RlBfUywJSTQJfSwKLS8qIG1vdmUgaXMgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUuICAqLwoteyJtc3ViLmQiLCAgIkQsUixTLFQiLAkweDRjMDAwMDI5LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im1zdWIucyIsICAiRCxSLFMsVCIsCTB4NGMwMDAwMjgsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibXN1YiIsICAgICJzLHQiLAkweDAwMDAwMDFlLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sTDEJfSwKLXsibXN1YnUiLCAgICJzLHQiLAkweDAwMDAwMDFmLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sTDEJfSwKLXsibXRjMCIsICAgICJ0LEciLAkweDQwODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9DMHxXUl9DQywJSTEJfSwKLXsibXRjMSIsICAgICJ0LFMiLAkweDQ0ODAwMDAwLCAweGZmZTAwN2ZmLAlDT0R8UkRfdHxXUl9TfEZQX1MsCUkxCX0sCi17Im10YzEiLCAgICAidCxHIiwJMHg0NDgwMDAwMCwgMHhmZmUwMDdmZiwJQ09EfFJEX3R8V1JfU3xGUF9TLAlJMQl9LAoteyJtdGMyIiwgICAgInQsRyIsCTB4NDg4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MyfFdSX0NDLAlJMQl9LAoteyJtdGMzIiwgICAgInQsRyIsCTB4NGM4MDAwMDAsIDB4ZmZlMDA3ZmYsCUNPRHxSRF90fFdSX0MzfFdSX0NDLAlJMQl9LAoteyJtdGhpIiwgICAgInMiLAkweDAwMDAwMDExLCAweGZjMWZmZmZmLAlSRF9zfFdSX0hJLAlJMQl9LAoteyJtdGxvIiwgICAgInMiLAkweDAwMDAwMDEzLCAweGZjMWZmZmZmLAlSRF9zfFdSX0xPLAlJMQl9LAoteyJtdWwuZCIsICAgIkQsVixUIiwJMHg0NjIwMDAwMiwgMHhmZmUwMDAzZiwJV1JfRHxSRF9TfFJEX1R8RlBfRCwJSTEJfSwKLXsibXVsLnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDIsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxCX0sCi17Im11bCIsICAgICAiZCx2LHQiLAkweDcwMDAwMDAyLCAweGZjMDAwN2ZmLCBXUl9kfFJEX3N8UkRfdHxXUl9ISXxXUl9MTyxQM30sCi17Im11bCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTCwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fTVVMX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG8iLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX01VTE8sCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG8iLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTE9fSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsibXVsb3UiLCAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fTVVMT1UsCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bG91IiwgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX01VTE9VX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im11bHQiLCAgICAicyx0IiwJMHgwMDAwMDAxOCwgMHhmYzAwZmZmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfElTX00sCUkxfSwKLXsibXVsdCIsICAgICJkLHMsdCIsCTB4MDAwMDAwMTgsIDB4ZmMwMDA3ZmYsCVJEX3N8UkRfdHxXUl9ISXxXUl9MT3xXUl9kfElTX00sIEcxfSwKLXsibXVsdHUiLCAgICJzLHQiLAkweDAwMDAwMDE5LCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE98SVNfTSwJSTF9LAoteyJtdWx0dSIsICAgImQscyx0IiwJMHgwMDAwMDAxOSwgMHhmYzAwMDdmZiwJUkRfc3xSRF90fFdSX0hJfFdSX0xPfFdSX2R8SVNfTSwgRzF9LAoteyJuZWciLCAgICAgImQsdyIsCTB4MDAwMDAwMjIsIDB4ZmZlMDA3ZmYsCVdSX2R8UkRfdCwJSTEJfSwgLyogc3ViIDAgKi8KLXsibmVndSIsICAgICJkLHciLAkweDAwMDAwMDIzLCAweGZmZTAwN2ZmLAlXUl9kfFJEX3QsCUkxCX0sIC8qIHN1YnUgMCAqLwoteyJuZWcuZCIsICAgIkQsViIsCTB4NDYyMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9ELAlJMQl9LAoteyJuZWcucyIsICAgIkQsViIsCTB4NDYwMDAwMDcsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMQl9LAoteyJubWFkZC5kIiwgIkQsUixTLFQiLAkweDRjMDAwMDMxLCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX0QsCUk0CX0sCi17Im5tYWRkLnMiLCAiRCxSLFMsVCIsCTB4NGMwMDAwMzAsIDB4ZmMwMDAwM2YsIFJEX1J8UkRfU3xSRF9UfFdSX0R8RlBfUywJSTQJfSwKLXsibm1zdWIuZCIsICJELFIsUyxUIiwJMHg0YzAwMDAzOSwgMHhmYzAwMDAzZiwgUkRfUnxSRF9TfFJEX1R8V1JfRHxGUF9ELAlJNAl9LAoteyJubXN1Yi5zIiwgIkQsUixTLFQiLAkweDRjMDAwMDM4LCAweGZjMDAwMDNmLCBSRF9SfFJEX1N8UkRfVHxXUl9EfEZQX1MsCUk0CX0sCi0vKiBub3AgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWJsZS4gICovCi17Im5vciIsICAgICAiZCx2LHQiLAkweDAwMDAwMDI3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsibm9yIiwgICAgICJ0LHIsSSIsCTAsICAgIChpbnQpIE1fTk9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im5vdCIsICAgICAiZCx2IiwJMHgwMDAwMDAyNywgMHhmYzFmMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sLypub3IgZCxzLDAqLwoteyJvciIsICAgICAgImQsdix0IiwJMHgwMDAwMDAyNSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsCUkxCX0sCi17Im9yIiwgICAgICAidCxyLEkiLAkwLCAgICAoaW50KSBNX09SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17Im9yaSIsICAgICAidCxyLGkiLAkweDM0MDAwMDAwLCAweGZjMDAwMDAwLAlXUl90fFJEX3MsCUkxCX0sCi0KLQoteyJwcmVmIiwgICAgImssbyhiKSIsCTB4Y2MwMDAwMDAsIDB4ZmMwMDAwMDAsIFJEX2IsCQlHMwl9LAoteyJwcmVmeCIsICAgImgsdChiKSIsCTB4NGMwMDAwMGYsIDB4ZmMwMDA3ZmYsIFJEX2J8UkRfdCwJSTQJfSwKLQotCi17InJlY2lwLmQiLCAiRCxTIiwJMHg0NjIwMDAxNSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUk0CX0sCi17InJlY2lwLnMiLCAiRCxTIiwJMHg0NjAwMDAxNSwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUk0CX0sCi17InJlbSIsICAgICAieixzLHQiLAkweDAwMDAwMDFhLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxIH0sCi17InJlbSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JFTV8zLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJyZW0iLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9SRU1fM0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJlbXUiLCAgICAieixzLHQiLAkweDAwMDAwMDFiLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8V1JfSEl8V1JfTE8sCUkxIH0sCi17InJlbXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JFTVVfMywJSU5TTl9NQUNSTywJSTEJfSwKLXsicmVtdSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUkVNVV8zSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsicmZlIiwgICAgICIiLAkJMHg0MjAwMDAxMCwgMHhmZmZmZmZmZiwJMCwJSTF8VDMJCX0sCi17InJvbCIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JPTCwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm9sIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUk9MX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJvciIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1JPUiwJSU5TTl9NQUNSTywJSTEJfSwKLXsicm9yIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fUk9SX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InJvdW5kLmwuZCIsICJELFMiLAkweDQ2MjAwMDA4LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTMJfSwKLXsicm91bmQubC5zIiwgIkQsUyIsCTB4NDYwMDAwMDgsIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9TLAlJMwl9LAoteyJyb3VuZC53LmQiLCAiRCxTIiwJMHg0NjIwMDAwYywgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InJvdW5kLncucyIsICJELFMiLAkweDQ2MDAwMDBjLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsicnNxcnQuZCIsICJELFMiLAkweDQ2MjAwMDE2LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTQJfSwKLXsicnNxcnQucyIsICJELFMiLAkweDQ2MDAwMDE2LCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfUywJSTQJfSwKLXsic2IiLCAgICAgICJ0LG8oYikiLAkweGEwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InNiIiwgICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2MiLAkgICAgInQsbyhiKSIsCTB4ZTAwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX3R8V1JfdHxSRF9iLAlJMgl9LAoteyJzYyIsCSAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TQ19BQiwJSU5TTl9NQUNSTywJSTIJfSwKLXsic2NkIiwJICAgICJ0LG8oYikiLAkweGYwMDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF90fFdSX3R8UkRfYiwJSTMJfSwKLXsic2NkIiwJICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NDRF9BQiwJSU5TTl9NQUNSTywJSTMJfSwKLXsic2QiLAkgICAgInQsbyhiKSIsCTB4ZmMwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTMJfSwKLXsic2QiLCAgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1NEX09CLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNkYmJwIiwgICAiIiwJCTB4MDAwMDAwMGUsIDB4ZmZmZmZmZmYsCVRSQVAsICAgICAgICAgICBHMgl9LAoteyJzZGJicCIsICAgImMiLAkweDAwMDAwMDBlLCAweGZjMDBmZmZmLAlUUkFQLAkJRzIJfSwKLXsic2RiYnAiLCAgICJjLHEiLAkweDAwMDAwMDBlLCAweGZjMDAwMDNmLAlUUkFQLAkJRzIJfSwKLXsic2RjMSIsICAgICJULG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKLXsic2RjMSIsICAgICJFLG8oYikiLAkweGY0MDAwMDAwLCAweGZjMDAwMDAwLCBTTXxSRF9UfFJEX2J8RlBfRCwJSTIJfSwKLXsic2RjMSIsICAgICJULEEoYikiLAkwLCAgICAoaW50KSBNX1NEQzFfQUIsCUlOU05fTUFDUk8sCUkyCX0sCi17InNkYzEiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMxX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzZGMyIiwgICAgIkUsbyhiKSIsCTB4ZjgwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX0MyfFJEX2IsCUkyCX0sCi17InNkYzIiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMyX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzZGMzIiwgICAgIkUsbyhiKSIsCTB4ZmMwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX0MzfFJEX2IsCUkyCX0sCi17InNkYzMiLCAgICAiRSxBKGIpIiwJMCwgICAgKGludCkgTV9TREMzX0FCLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJzLmQiLCAgICAgIlQsbyhiKSIsCTB4ZjQwMDAwMDAsIDB4ZmMwMDAwMDAsIFNNfFJEX1R8UkRfYnxGUF9ELAlJMgl9LAoteyJzLmQiLCAgICAgIlQsbyhiKSIsCTAsICAgIChpbnQpIE1fU19ET0IsCUlOU05fTUFDUk8sCUkxCX0sCi17InMuZCIsICAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TX0RBQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2RsIiwgICAgICJ0LG8oYikiLAkweGIwMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkzCX0sCi17InNkbCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TRExfQUIsCUlOU05fTUFDUk8sCUkzCX0sCi17InNkciIsICAgICAidCxvKGIpIiwJMHhiNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMwl9LAoteyJzZHIiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0RSX0FCLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJzZHhjMSIsICAgIlMsdChiKSIsICAgMHg0YzAwMDAwOSwgMHhmYzAwMDdmZiwgU018UkRfU3xSRF90fFJEX2IsCUk0CX0sCi17InNlbHNsIiwgICAiZCx2LHQiLAkweDAwMDAwMDA1LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCxMMQl9LAoteyJzZWxzciIsICAgImQsdix0IiwJMHgwMDAwMDAwMSwgMHhmYzAwMDdmZiwJV1JfZHxSRF9zfFJEX3QsTDEJfSwKLXsic2VxIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0VRLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZXEiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TRVFfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dlIiwgICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dFLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ2UiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR0VfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dldSIsICAgICJkLHYsdCIsCTAsICAgIChpbnQpIE1fU0dFVSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2dldSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0dFVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3QiLCAgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR1QsCUlOU05fTUFDUk8sCUkxCX0sCi17InNndCIsICAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NHVF9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3R1IiwgICAgImQsdix0IiwJMCwgICAgKGludCkgTV9TR1RVLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzZ3R1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TR1RVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNoIiwgICAgICAidCxvKGIpIiwJMHhhNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzaCIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU0hfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NMRSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xlIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU0xFX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZXUiLCAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NMRVUsCUlOU05fTUFDUk8sCUkxCX0sCi17InNsZXUiLCAgICAiZCx2LEkiLAkwLCAgICAoaW50KSBNX1NMRVVfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2xsdiIsICAgICJkLHQscyIsCTB4MDAwMDAwMDQsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LAoteyJzbGwiLCAgICAgImQsdyxzIiwJMHgwMDAwMDAwNCwgMHhmYzAwMDdmZiwJV1JfZHxSRF90fFJEX3MsCUkxCX0sIC8qIHNsbHYgKi8KLXsic2xsIiwgICAgICJkLHcsPCIsCTB4MDAwMDAwMDAsIDB4ZmZlMDAwM2YsCVdSX2R8UkRfdCwJSTEJfSwKLXsic2x0IiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMmEsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzbHQiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTFRfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic2x0aSIsICAgICJ0LHIsaiIsCTB4MjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsic2x0aXUiLCAgICJ0LHIsaiIsCTB4MmMwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsic2x0dSIsICAgICJkLHYsdCIsCTB4MDAwMDAwMmIsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzbHR1IiwgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TTFRVX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNuZSIsICAgICAiZCx2LHQiLAkwLCAgICAoaW50KSBNX1NORSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic25lIiwgICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU05FX0ksCUlOU05fTUFDUk8sCUkxCX0sCi17InNxcnQuZCIsICAiRCxTIiwJMHg0NjIwMDAwNCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InNxcnQucyIsICAiRCxTIiwJMHg0NjAwMDAwNCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX1MsCUkyCX0sCi17InNyYXYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA3LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKLXsic3JhIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDcsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzcmF2ICovCi17InNyYSIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAzLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCi17InNybHYiLCAgICAiZCx0LHMiLAkweDAwMDAwMDA2LCAweGZjMDAwN2ZmLAlXUl9kfFJEX3R8UkRfcywJSTEJfSwKLXsic3JsIiwgICAgICJkLHcscyIsCTB4MDAwMDAwMDYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfdHxSRF9zLAlJMQl9LCAvKiBzcmx2ICovCi17InNybCIsICAgICAiZCx3LDwiLAkweDAwMDAwMDAyLCAweGZmZTAwMDNmLAlXUl9kfFJEX3QsCUkxCX0sCi17InN0YW5kYnkiLCAiIiwgICAgICAgICAweDQyMDAwMDIxLCAweGZmZmZmZmZmLAkwLAkJVjEJfSwKLXsic3ViIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjIsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJzdWIiLCAgICAgImQsdixJIiwJMCwgICAgKGludCkgTV9TVUJfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3ViLmQiLCAgICJELFYsVCIsCTB4NDYyMDAwMDEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX0QsCUkxCX0sICAgICAKLXsic3ViLnMiLCAgICJELFYsVCIsCTB4NDYwMDAwMDEsIDB4ZmZlMDAwM2YsCVdSX0R8UkRfU3xSRF9UfEZQX1MsCUkxCX0sCi17InN1YnUiLCAgICAiZCx2LHQiLAkweDAwMDAwMDIzLCAweGZjMDAwN2ZmLAlXUl9kfFJEX3N8UkRfdCwJSTEJfSwKLXsic3VidSIsICAgICJkLHYsSSIsCTAsICAgIChpbnQpIE1fU1VCVV9JLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzdXNwZW5kIiwgIiIsICAgICAgICAgMHg0MjAwMDAyMiwgMHhmZmZmZmZmZiwJMCwJCVYxCX0sCi17InN3IiwgICAgICAidCxvKGIpIiwJMHhhYzAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfdHxSRF9iLAlJMQl9LAoteyJzdyIsICAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzAiLCAgICAiRSxvKGIpIiwJMHhlMDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfQzB8UkRfYiwJSTEJfSwKLXsic3djMCIsICAgICJFLEEoYikiLAkwLCAgICAoaW50KSBNX1NXQzBfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InN3YzEiLCAgICAiVCxvKGIpIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfVHxSRF9ifEZQX1MsCUkxCX0sCi17InN3YzEiLCAgICAiRSxvKGIpIiwJMHhlNDAwMDAwMCwgMHhmYzAwMDAwMCwJU018UkRfVHxSRF9ifEZQX1MsCUkxCX0sCi17InN3YzEiLCAgICAiVCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0MxX0FCLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJzd2MxIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsicy5zIiwgICAgICJULG8oYikiLAkweGU0MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9UfFJEX2J8RlBfUywJSTEJfSwgLyogc3djMSAqLwoteyJzLnMiLCAgICAgIlQsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMV9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMiIsICAgICJFLG8oYikiLAkweGU4MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9DMnxSRF9iLAlJMQl9LAoteyJzd2MyIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDMl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3djMyIsICAgICJFLG8oYikiLAkweGVjMDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF9DM3xSRF9iLAlJMQl9LAoteyJzd2MzIiwgICAgIkUsQShiKSIsCTAsICAgIChpbnQpIE1fU1dDM19BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsic3dsIiwgICAgICJ0LG8oYikiLAkweGE4MDAwMDAwLCAweGZjMDAwMDAwLAlTTXxSRF90fFJEX2IsCUkxCX0sCi17InN3bCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0xfQUIsCUlOU05fTUFDUk8sCUkxCX0sCi17InNjYWNoZSIsICAidCxvKGIpIiwJMHhhODAwMDAwMCwgMHhmYzAwMDAwMCwJUkRfdHxSRF9iLAlJMgl9LCAvKiBzYW1lICovCi17InNjYWNoZSIsICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9TV0xfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIHN3bCAqLwoteyJzd3IiLCAgICAgInQsbyhiKSIsCTB4YjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVNNfFJEX3R8UkRfYiwJSTEJfSwKLXsic3dyIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1NXUl9BQiwJSU5TTl9NQUNSTywJSTEJfSwKLXsiaW52YWxpZGF0ZSIsICJ0LG8oYikiLDB4YjgwMDAwMDAsIDB4ZmMwMDAwMDAsCVJEX3R8UkRfYiwJSTIJfSwgLyogc2FtZSAqLwoteyJpbnZhbGlkYXRlIiwgInQsQShiKSIsMCwgICAgKGludCkgTV9TV1JfQUIsCUlOU05fTUFDUk8sCUkyCX0sIC8qIGFzIHN3ciAqLwoteyJzd3hjMSIsICAgIlMsdChiKSIsICAgMHg0YzAwMDAwOCwgMHhmYzAwMDdmZiwgU018UkRfU3xSRF90fFJEX2IsCUk0CX0sCi17InN5bmMiLCAgICAiIiwJCTB4MDAwMDAwMGYsIDB4ZmZmZmZmZmYsCUlOU05fU1lOQywJSTJ8RzEJfSwKLXsic3luYy5wIiwgICIiLAkJMHgwMDAwMDQwZiwgMHhmZmZmZmZmZiwJSU5TTl9TWU5DLAlJMgl9LAoteyJzeW5jLmwiLCAgIiIsCQkweDAwMDAwMDBmLCAweGZmZmZmZmZmLAlJTlNOX1NZTkMsCUkyCX0sCi17InN5c2NhbGwiLCAiIiwJCTB4MDAwMDAwMGMsIDB4ZmZmZmZmZmYsCVRSQVAsCUkxCQl9LAoteyJzeXNjYWxsIiwgIkIiLAkweDAwMDAwMDBjLCAweGZjMDAwMDNmLAlUUkFQLAlJMQkJfSwKLXsidGVxaSIsICAgICJzLGoiLAkweDA0MGMwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sCi17InRlcSIsCSAgICAicyx0IiwJMHgwMDAwMDAzNCwgMHhmYzAwZmZmZiwgUkRfc3xSRF90fFRSQVAsCUkyCX0sCi17InRlcSIsCSAgICAicyx0LHEiLAkweDAwMDAwMDM0LCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGVxIiwgICAgICJzLGoiLAkweDA0MGMwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCX0sIC8qIHRlcWkgKi8KLXsidGVxIiwgICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RFUV9JLAlJTlNOX01BQ1JPLAlJMgl9LAoteyJ0Z2VpIiwgICAgInMsaiIsCTB4MDQwODAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwKLXsidGdlIiwJICAgICJzLHQiLAkweDAwMDAwMDMwLCAweGZjMDBmZmZmLAlSRF9zfFJEX3R8VFJBUCwJSTIJfSwKLXsidGdlIiwJICAgICJzLHQscSIsCTB4MDAwMDAwMzAsIDB4ZmMwMDAwM2YsCVJEX3N8UkRfdHxUUkFQLAlJMgl9LAoteyJ0Z2UiLCAgICAgInMsaiIsCTB4MDQwODAwMDAsIDB4ZmMxZjAwMDAsIFJEX3N8VFJBUCwJSTIJfSwgLyogdGdlaSAqLwoteyJ0Z2UiLAkgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVEdFX0ksICAgIElOU05fTUFDUk8sCUkyCX0sCi17InRnZWl1IiwgICAicyxqIiwJMHgwNDA5MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwKLXsidGdldSIsICAgICJzLHQiLAkweDAwMDAwMDMxLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRnZXUiLCAgICAicyx0LHEiLAkweDAwMDAwMDMxLCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRnZXUiLCAgICAicyxqIiwJMHgwNDA5MDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwgLyogdGdlaXUgKi8KLXsidGdldSIsICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RHRVVfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidGxicCIsICAgICIiLAkJMHg0MjAwMDAwOCwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxCX0sCi17InRsYnIiLCAgICAiIiwJCTB4NDIwMDAwMDEsIDB4ZmZmZmZmZmYsCUlOU05fVExCLAlJMQl9LAoteyJ0bGJ3aSIsICAgIiIsCQkweDQyMDAwMDAyLCAweGZmZmZmZmZmLAlJTlNOX1RMQiwJSTEJfSwKLXsidGxid3IiLCAgICIiLAkJMHg0MjAwMDAwNiwgMHhmZmZmZmZmZiwJSU5TTl9UTEIsCUkxCX0sCi17InRsdGkiLCAgICAicyxqIiwJMHgwNDBhMDAwMCwgMHhmYzFmMDAwMCwJUkRfc3xUUkFQLAlJMgkJfSwKLXsidGx0IiwgICAgICJzLHQiLAkweDAwMDAwMDMyLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRsdCIsICAgICAicyx0LHEiLAkweDAwMDAwMDMyLCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRsdCIsICAgICAicyxqIiwJMHgwNDBhMDAwMCwgMHhmYzFmMDAwMCwJUkRfc3xUUkFQLAlJMgkJfSwgLyogdGx0aSAqLwoteyJ0bHQiLCAgICAgInMsSSIsCTAsICAgIChpbnQpIE1fVExUX0ksCUlOU05fTUFDUk8sCUkyCX0sCi17InRsdGl1IiwgICAicyxqIiwJMHgwNDBiMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwKLXsidGx0dSIsICAgICJzLHQiLAkweDAwMDAwMDMzLCAweGZjMDBmZmZmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRsdHUiLCAgICAicyx0LHEiLAkweDAwMDAwMDMzLCAweGZjMDAwMDNmLCBSRF9zfFJEX3R8VFJBUCwJSTIJIH0sCi17InRsdHUiLCAgICAicyxqIiwJMHgwNDBiMDAwMCwgMHhmYzFmMDAwMCwgUkRfc3xUUkFQLAlJMgkJfSwgLyogdGx0aXUgKi8KLXsidGx0dSIsICAgICJzLEkiLAkwLCAgICAoaW50KSBNX1RMVFVfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidG5laSIsICAgICJzLGoiLAkweDA0MGUwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LAoteyJ0bmUiLCAgICAgInMsdCIsCTB4MDAwMDAwMzYsIDB4ZmMwMGZmZmYsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidG5lIiwgICAgICJzLHQscSIsCTB4MDAwMDAwMzYsIDB4ZmMwMDAwM2YsIFJEX3N8UkRfdHxUUkFQLAlJMgkgfSwKLXsidG5lIiwgICAgICJzLGoiLAkweDA0MGUwMDAwLCAweGZjMWYwMDAwLCBSRF9zfFRSQVAsCUkyCQl9LCAvKiB0bmVpICovCi17InRuZSIsICAgICAicyxJIiwJMCwgICAgKGludCkgTV9UTkVfSSwJSU5TTl9NQUNSTywJSTIJfSwKLXsidHJ1bmMubC5kIiwgIkQsUyIsCTB4NDYyMDAwMDksIDB4ZmZmZjAwM2YsIFdSX0R8UkRfU3xGUF9ELAlJMwl9LAoteyJ0cnVuYy5sLnMiLCAiRCxTIiwJMHg0NjAwMDAwOSwgMHhmZmZmMDAzZiwJV1JfRHxSRF9TfEZQX1MsCUkzCX0sCi17InRydW5jLncuZCIsICJELFMiLAkweDQ2MjAwMDBkLCAweGZmZmYwMDNmLCBXUl9EfFJEX1N8RlBfRCwJSTIJfSwKLXsidHJ1bmMudy5kIiwgIkQsUyx4IiwJMHg0NjIwMDAwZCwgMHhmZmZmMDAzZiwgV1JfRHxSRF9TfEZQX0QsCUkyCX0sCi17InRydW5jLncuZCIsICJELFMsdCIsCTAsICAgIChpbnQpIE1fVFJVTkNXRCwJSU5TTl9NQUNSTywJSTEJfSwKLXsidHJ1bmMudy5zIiwgIkQsUyIsCTB4NDYwMDAwMGQsIDB4ZmZmZjAwM2YsCVdSX0R8UkRfU3xGUF9TLAlJMgl9LAoteyJ0cnVuYy53LnMiLCAiRCxTLHgiLAkweDQ2MDAwMDBkLCAweGZmZmYwMDNmLAlXUl9EfFJEX1N8RlBfUywJSTIJfSwKLXsidHJ1bmMudy5zIiwgIkQsUyx0IiwJMCwgICAgKGludCkgTV9UUlVOQ1dTLAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1bGQiLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVUxELAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1bGQiLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVUxEX0EsCUlOU05fTUFDUk8sCUkzCX0sCi17InVsaCIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTEgsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsaCIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTEhfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidWxodSIsICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VMSFUsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsaHUiLCAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTEhVX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsdyIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VTFcsCUlOU05fTUFDUk8sCUkxCX0sCi17InVsdyIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VTFdfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsidXNkIiwgICAgICJ0LG8oYikiLAkwLCAgICAoaW50KSBNX1VTRCwJSU5TTl9NQUNSTywJSTMJfSwKLXsidXNkIiwgICAgICJ0LEEoYikiLAkwLCAgICAoaW50KSBNX1VTRF9BLAlJTlNOX01BQ1JPLAlJMwl9LAoteyJ1c2giLCAgICAgInQsbyhiKSIsCTAsICAgIChpbnQpIE1fVVNILAlJTlNOX01BQ1JPLAlJMQl9LAoteyJ1c2giLCAgICAgInQsQShiKSIsCTAsICAgIChpbnQpIE1fVVNIX0EsCUlOU05fTUFDUk8sCUkxCX0sCi17InVzdyIsICAgICAidCxvKGIpIiwJMCwgICAgKGludCkgTV9VU1csCUlOU05fTUFDUk8sCUkxCX0sCi17InVzdyIsICAgICAidCxBKGIpIiwJMCwgICAgKGludCkgTV9VU1dfQSwJSU5TTl9NQUNSTywJSTEJfSwKLXsieG9yIiwgICAgICJkLHYsdCIsCTB4MDAwMDAwMjYsIDB4ZmMwMDA3ZmYsCVdSX2R8UkRfc3xSRF90LAlJMQl9LAoteyJ4b3IiLCAgICAgInQscixJIiwJMCwgICAgKGludCkgTV9YT1JfSSwJSU5TTl9NQUNSTywJSTEJfSwKLXsieG9yaSIsICAgICJ0LHIsaSIsCTB4MzgwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcywJSTEJfSwKLXsid2FpdCIsICAgICIiLAkJMHg0MjAwMDAyMCwgMHhmZmZmZmZmZiwJVFJBUCwJSTMJfSwKLXsid2FpdGkiLCAgICIiLAkJMHg0MjAwMDAyMCwgMHhmZmZmZmZmZiwJVFJBUCwJTDEJfSwKLXsid2IiLCAJICAgICJvKGIpIiwJMHhiYzA0MDAwMCwgMHhmYzFmMDAwMCwgU018UkRfYiwJTDEJfSwKLS8qIE5vIGhhemFyZCBwcm90ZWN0aW9uIG9uIGNvcHJvY2Vzc29yIGluc3RydWN0aW9ucy0tdGhleSBzaG91bGRuJ3QKLSAgIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIHByb2Nlc3NvciBhbmQgaWYgdGhleSBkbyBpdCdzIHVwIHRvIHRoZQotICAgdXNlciB0byBwdXQgaW4gbm9wcyBhcyBuZWNlc3NhcnkuICBUaGVzZSBhcmUgYXQgdGhlIGVuZCBzbyB0aGF0IHRoZQotICAgZGlzYXNlbWJsZXIgcmVjb2duaXplcyBtb3JlIHNwZWNpZmljIHZlcnNpb25zIGZpcnN0LiAgKi8KLXsiYzAiLCAgICAgICJDIiwJMHg0MjAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImMxIiwgICAgICAiQyIsCTB4NDYwMDAwMDAsIDB4ZmUwMDAwMDAsCTAsCUkxCQl9LAoteyJjMiIsICAgICAgIkMiLAkweDRhMDAwMDAwLCAweGZlMDAwMDAwLAkwLAlJMQkJfSwKLXsiYzMiLCAgICAgICJDIiwJMHg0ZTAwMDAwMCwgMHhmZTAwMDAwMCwJMCwJSTEJCX0sCi17ImNvcDAiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDAsCUlOU05fTUFDUk8sCUkxCX0sCi17ImNvcDEiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDEsCUlOU05fTUFDUk8sCUkxCX0sCi17ImNvcDIiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDIsCUlOU05fTUFDUk8sCUkxCX0sCi17ImNvcDMiLCAgICAgIkMiLAkwLCAgICAoaW50KSBNX0NPUDMsCUlOU05fTUFDUk8sCUkxCX0sCi0KLSAgLyogQ29uZmxpY3RzIHdpdGggdGhlIDQ2NTAncyAibXVsIiBpbnN0cnVjdGlvbi4gIE5vYm9keSdzIHVzaW5nIHRoZQotICAgICA0MDEwIGFueSBtb3JlLCBzbyBtb3ZlIHRoaXMgaW5zbiBvdXQgb2YgdGhlIHdheS4gIElmIHRoZSBvYmplY3QKLSAgICAgZm9ybWF0IGdhdmUgdXMgbW9yZSBpbmZvLCB3ZSBjb3VsZCBkbyB0aGlzIHJpZ2h0LiAgKi8KLXsiYWRkY2l1IiwgICJ0LHIsaiIsCTB4NzAwMDAwMDAsIDB4ZmMwMDAwMDAsCVdSX3R8UkRfcyxMMQl9LAotfTsKLQotI2RlZmluZSBNSVBTX05VTV9PUENPREVTIFwKLQkoKHNpemVvZiBtaXBzX2J1aWx0aW5fb3Bjb2RlcykgLyAoc2l6ZW9mIChtaXBzX2J1aWx0aW5fb3Bjb2Rlc1swXSkpKQotY29uc3QgaW50IGJmZF9taXBzX251bV9idWlsdGluX29wY29kZXMgPSBNSVBTX05VTV9PUENPREVTOwotCi0vKiBjb25zdCByZW1vdmVkIGZyb20gdGhlIGZvbGxvd2luZyB0byBhbGxvdyBmb3IgZHluYW1pYyBleHRlbnNpb25zIHRvIHRoZSAKLSAqIGJ1aWx0LWluIGluc3RydWN0aW9uIHNldC4gKi8KLXN0cnVjdCBtaXBzX29wY29kZSAqbWlwc19vcGNvZGVzID0KLSAgKHN0cnVjdCBtaXBzX29wY29kZSAqKSBtaXBzX2J1aWx0aW5fb3Bjb2RlczsKLWludCBiZmRfbWlwc19udW1fb3Bjb2RlcyA9IE1JUFNfTlVNX09QQ09ERVM7Ci0jdW5kZWYgTUlQU19OVU1fT1BDT0RFUwotCmRpZmYgLS1naXQgYS9vcGNvZGVzL21pcHMxNi1vcGMuYyBiL29wY29kZXMvbWlwczE2LW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQyZGJiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbWlwczE2LW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qIG1pcHMxNi1vcGMuYy4gIE1pcHMxNiBvcGNvZGUgdGFibGUuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0xLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9taXBzLmgiCi0KLS8qIFRoaXMgaXMgdGhlIG9wY29kZXMgdGFibGUgZm9yIHRoZSBtaXBzMTYgcHJvY2Vzc29yLiAgVGhlIGZvcm1hdCBvZgotICAgdGhpcyB0YWJsZSBpcyBpbnRlbnRpb25hbGx5IGlkZW50aWNhbCB0byB0aGUgb25lIGluIG1pcHMtb3BjLmMuCi0gICBIb3dldmVyLCB0aGUgc3BlY2lhbCBsZXR0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBhcmd1bWVudCBzdHJpbmcgYXJlCi0gICBkaWZmZXJlbnQsIGFuZCB0aGUgdGFibGUgdXNlcyBzb21lIGRpZmZlcmVudCBmbGFncy4gICovCi0KLS8qIFVzZSBzb21lIHNob3J0IGhhbmQgbWFjcm9zIHRvIGtlZXAgZG93biB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5lcyBpbgotICAgdGhlIG9wY29kZXMgdGFibGUuICAqLwotCi0jZGVmaW5lIFVCRCAgICAgSU5TTl9VTkNPTkRfQlJBTkNIX0RFTEFZCi0jZGVmaW5lIEJSICAgICAgTUlQUzE2X0lOU05fQlJBTkNICi0KLSNkZWZpbmUgV1JfeAlNSVBTMTZfSU5TTl9XUklURV9YCi0jZGVmaW5lIFdSX3kJTUlQUzE2X0lOU05fV1JJVEVfWQotI2RlZmluZSBXUl96CU1JUFMxNl9JTlNOX1dSSVRFX1oKLSNkZWZpbmUgV1JfVAlNSVBTMTZfSU5TTl9XUklURV9UCi0jZGVmaW5lIFdSX1NQCU1JUFMxNl9JTlNOX1dSSVRFX1NQCi0jZGVmaW5lIFdSXzMxCU1JUFMxNl9JTlNOX1dSSVRFXzMxCi0jZGVmaW5lIFdSX1kJTUlQUzE2X0lOU05fV1JJVEVfR1BSX1kKLQotI2RlZmluZSBSRF94CU1JUFMxNl9JTlNOX1JFQURfWAotI2RlZmluZSBSRF95CU1JUFMxNl9JTlNOX1JFQURfWQotI2RlZmluZSBSRF9aCU1JUFMxNl9JTlNOX1JFQURfWgotI2RlZmluZSBSRF9UCU1JUFMxNl9JTlNOX1JFQURfVAotI2RlZmluZSBSRF9TUAlNSVBTMTZfSU5TTl9SRUFEX1NQCi0jZGVmaW5lIFJEXzMxCU1JUFMxNl9JTlNOX1JFQURfMzEKLSNkZWZpbmUgUkRfUEMJTUlQUzE2X0lOU05fUkVBRF9QQwotI2RlZmluZSBSRF9YCU1JUFMxNl9JTlNOX1JFQURfR1BSX1gKLQotI2RlZmluZSBXUl9ISQlJTlNOX1dSSVRFX0hJCi0jZGVmaW5lIFdSX0xPCUlOU05fV1JJVEVfTE8KLSNkZWZpbmUgUkRfSEkJSU5TTl9SRUFEX0hJCi0jZGVmaW5lIFJEX0xPCUlOU05fUkVBRF9MTwotCi0jZGVmaW5lIFRSQVAJSU5TTl9UUkFQCi0KLSNkZWZpbmUgSTMJSU5TTl9JU0EzCi0KLSNkZWZpbmUgVDMgICAgICBJTlNOXzM5MDAKLQotY29uc3Qgc3RydWN0IG1pcHNfb3Bjb2RlIG1pcHMxNl9vcGNvZGVzW10gPSB7Ci17Im5vcCIsCSAgICAiIiwJCTB4NjUwMCwgMHhmZmZmLCBSRF9aIH0sIC8qIG1vdmUgJDAsJFogKi8KLXsibGEiLAkgICAgIngsQSIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17ImFicyIsCSAgICAieCx3IiwJMCwgKGludCkgTV9BQlMsIElOU05fTUFDUk8gfSwKLXsiYWRkaXUiLCAgICJ5LHgsNCIsCTB4NDAwMCwgMHhmODEwLCBXUl95fFJEX3ggfSwKLXsiYWRkaXUiLCAgICJ4LGsiLAkweDQ4MDAsIDB4ZjgwMCwgV1JfeHxSRF94IH0sCi17ImFkZGl1IiwgICAiUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZGl1IiwgICAiUyxTLEsiLAkweDYzMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AgfSwKLXsiYWRkaXUiLCAgICJ4LFAsViIsCTB4MDgwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17ImFkZGl1IiwgICAieCxTLFYiLAkweDAwMDAsIDB4ZjgwMCwgV1JfeHxSRF9TUCB9LAoteyJhZGR1IiwgICAgInosdix5IiwJMHhlMDAxLCAweGY4MDMsIFdSX3p8UkRfeHxSRF95IH0sCi17ImFkZHUiLCAgICAieSx4LDQiLAkweDQwMDAsIDB4ZjgxMCwgV1JfeXxSRF94IH0sCi17ImFkZHUiLCAgICAieCxrIiwJMHg0ODAwLCAweGY4MDAsIFdSX3h8UkRfeCB9LAoteyJhZGR1IiwgICAgIlMsSyIsCTB4NjMwMCwgMHhmZjAwLCBXUl9TUHxSRF9TUCB9LAoteyJhZGR1IiwgICAgIlMsUyxLIiwJMHg2MzAwLCAweGZmMDAsIFdSX1NQfFJEX1NQIH0sCi17ImFkZHUiLCAgICAieCxQLFYiLAkweDA4MDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJhZGR1IiwgICAgIngsUyxWIiwJMHgwMDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKLXsiYW5kIiwJICAgICJ4LHkiLAkweGU4MGMsIDB4ZjgxZiwgV1JfeHxSRF94fFJEX3kgfSwKLXsiYiIsCSAgICAicSIsCTB4MTAwMCwgMHhmODAwLCBCUn0sCi17ImJlcSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JFUSwgSU5TTl9NQUNSTyB9LAoteyJiZXEiLCAgICAgIngsVSxwIiwJMCwgKGludCkgTV9CRVFfSSwgSU5TTl9NQUNSTyB9LAoteyJiZXF6IiwgICAgIngscCIsCTB4MjAwMCwgMHhmODAwLCBCUnxSRF94IH0sCi17ImJnZSIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JHRSwgSU5TTl9NQUNSTyB9LAoteyJiZ2UiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR0VfSSwgSU5TTl9NQUNSTyB9LAoteyJiZ2V1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CR0VVLCBJTlNOX01BQ1JPIH0sCi17ImJnZXUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JHRVVfSSwgSU5TTl9NQUNSTyB9LAoteyJiZ3QiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CR1QsIElOU05fTUFDUk8gfSwKLXsiYmd0IiwgICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkdUX0ksIElOU05fTUFDUk8gfSwKLXsiYmd0dSIsICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkdUVSwgSU5TTl9NQUNSTyB9LAoteyJiZ3R1IiwgICAgIngsOCxwIiwJMCwgKGludCkgTV9CR1RVX0ksIElOU05fTUFDUk8gfSwKLXsiYmxlIiwJICAgICJ4LHkscCIsCTAsIChpbnQpIE1fQkxFLCBJTlNOX01BQ1JPIH0sCi17ImJsZSIsICAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMRV9JLCBJTlNOX01BQ1JPIH0sCi17ImJsZXUiLCAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMRVUsIElOU05fTUFDUk8gfSwKLXsiYmxldSIsICAgICJ4LDgscCIsCTAsIChpbnQpIE1fQkxFVV9JLCBJTlNOX01BQ1JPIH0sCi17ImJsdCIsCSAgICAieCx5LHAiLAkwLCAoaW50KSBNX0JMVCwgSU5TTl9NQUNSTyB9LAoteyJibHQiLCAgICAgIngsOCxwIiwJMCwgKGludCkgTV9CTFRfSSwgSU5TTl9NQUNSTyB9LAoteyJibHR1IiwgICAgIngseSxwIiwJMCwgKGludCkgTV9CTFRVLCBJTlNOX01BQ1JPIH0sCi17ImJsdHUiLCAgICAieCw4LHAiLAkwLCAoaW50KSBNX0JMVFVfSSwgSU5TTl9NQUNSTyB9LAoteyJibmUiLAkgICAgIngseSxwIiwJMCwgKGludCkgTV9CTkUsIElOU05fTUFDUk8gfSwKLXsiYm5lIiwgICAgICJ4LFUscCIsCTAsIChpbnQpIE1fQk5FX0ksIElOU05fTUFDUk8gfSwKLXsiYm5leiIsICAgICJ4LHAiLAkweDI4MDAsIDB4ZjgwMCwgQlJ8UkRfeCB9LAoteyJicmVhayIsICAgIjYiLAkweGU4MDUsIDB4ZjgxZiwgVFJBUCB9LAoteyJidGVxeiIsICAgInAiLAkweDYwMDAsIDB4ZmYwMCwgQlJ8UkRfVCB9LAoteyJidG5leiIsICAgInAiLAkweDYxMDAsIDB4ZmYwMCwgQlJ8UkRfVCB9LAoteyJjbXBpIiwgICAgIngsVSIsCTB4NzAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsiY21wIiwJICAgICJ4LHkiLAkweGU4MGEsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKLXsiY21wIiwgICAgICJ4LFUiLAkweDcwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17ImRsYSIsCSAgICAieSxFIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImRhZGRpdSIsICAieSx4LDQiLAkweDQwMTAsIDB4ZjgxMCwgV1JfeXxSRF94LCBJMyB9LAoteyJkYWRkaXUiLCAgInksaiIsCTB4ZmQwMCwgMHhmZjAwLCBXUl95fFJEX3ksIEkzIH0sCi17ImRhZGRpdSIsICAiUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoteyJkYWRkaXUiLCAgIlMsUyxLIiwJMHhmYjAwLCAweGZmMDAsIFdSX1NQfFJEX1NQLCBJMyB9LAoteyJkYWRkaXUiLCAgInksUCxXIiwJMHhmZTAwLCAweGZmMDAsIFdSX3l8UkRfUEMsIEkzIH0sCi17ImRhZGRpdSIsICAieSxTLFciLAkweGZmMDAsIDB4ZmYwMCwgV1JfeXxSRF9TUCwgSTMgfSwKLXsiZGFkZHUiLCAgICJ6LHYseSIsCTB4ZTAwMCwgMHhmODAzLCBXUl96fFJEX3h8UkRfeSwgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LHgsNCIsCTB4NDAxMCwgMHhmODEwLCBXUl95fFJEX3gsIEkzIH0sCi17ImRhZGR1IiwgICAieSxqIiwJMHhmZDAwLCAweGZmMDAsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZGFkZHUiLCAgICJTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGR1IiwgICAiUyxTLEsiLAkweGZiMDAsIDB4ZmYwMCwgV1JfU1B8UkRfU1AsIEkzIH0sCi17ImRhZGR1IiwgICAieSxQLFciLAkweGZlMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsiZGFkZHUiLCAgICJ5LFMsVyIsCTB4ZmYwMCwgMHhmZjAwLCBXUl95fFJEX1NQLCBJMyB9LAoteyJkZGl2IiwgICAgIjAseCx5IiwJMHhlODFlLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZGRpdiIsICAgICJ6LHYseSIsCTAsIChpbnQpIE1fRERJVl8zLCBJTlNOX01BQ1JPIH0sCi17ImRkaXZ1IiwgICAiMCx4LHkiLAkweGU4MWYsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPLCBJMyB9LAoteyJkZGl2dSIsICAgInosdix5IiwJMCwgKGludCkgTV9ERElWVV8zLCBJTlNOX01BQ1JPIH0sCi17ImRpdiIsICAgICAiMCx4LHkiLAkweGU4MWEsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17ImRpdiIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX0RJVl8zLCBJTlNOX01BQ1JPIH0sCi17ImRpdnUiLCAgICAiMCx4LHkiLAkweGU4MWIsIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17ImRpdnUiLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RJVlVfMywgSU5TTl9NQUNSTyB9LAoteyJkbXVsIiwgICAgInosdix5IiwJMCwgKGludCkgTV9ETVVMLCBJTlNOX01BQ1JPLCBJMyB9LAoteyJkbXVsdCIsICAgIngseSIsCTB4ZTgxYywgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRtdWx0dSIsICAieCx5IiwJMHhlODFkLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZHJlbSIsICAgICIwLHgseSIsCTB4ZTgxZSwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8sIEkzIH0sCi17ImRyZW0iLCAgICAieix2LHkiLAkwLCAoaW50KSBNX0RSRU1fMywgSU5TTl9NQUNSTyB9LAoteyJkcmVtdSIsICAgIjAseCx5IiwJMHhlODFmLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTywgSTMgfSwKLXsiZHJlbXUiLCAgICJ6LHYseSIsCTAsIChpbnQpIE1fRFJFTVVfMywgSU5TTl9NQUNSTyB9LAoteyJkc2xsdiIsICAgInkseCIsCTB4ZTgxNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNsbCIsICAgICJ4LHcsWyIsCTB4MzAwMSwgMHhmODAzLCBXUl94fFJEX3ksIEkzIH0sCi17ImRzbGwiLCAgICAieSx4IiwJMHhlODE0LCAweGY4MWYsIFdSX3l8UkRfeXxSRF94LCBJMyB9LAoteyJkc3JhdiIsICAgInkseCIsCTB4ZTgxNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNyYSIsICAgICJ5LF0iLAkweGU4MTMsIDB4ZjgxZiwgV1JfeXxSRF95LCBJMyB9LAoteyJkc3JhIiwgICAgInkseCIsCTB4ZTgxNywgMHhmODFmLCBXUl95fFJEX3l8UkRfeCwgSTMgfSwKLXsiZHNybHYiLCAgICJ5LHgiLAkweGU4MTYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzcmwiLCAgICAieSxdIiwJMHhlODA4LCAweGY4MWYsIFdSX3l8UkRfeSwgSTMgfSwKLXsiZHNybCIsICAgICJ5LHgiLAkweGU4MTYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3gsIEkzIH0sCi17ImRzdWJ1IiwgICAieix2LHkiLAkweGUwMDIsIDB4ZjgwMywgV1JfenxSRF94fFJEX3ksIEkzIH0sCi17ImRzdWJ1IiwgICAieSx4LDQiLAkwLCAoaW50KSBNX0RTVUJVX0ksIElOU05fTUFDUk8gfSwKLXsiZHN1YnUiLCAgICJ5LGoiLAkwLCAoaW50KSBNX0RTVUJVX0lfMiwgSU5TTl9NQUNSTyB9LAoteyJleGl0IiwgICAgIkwiLAkweGVkMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJleGl0IiwgICAgIkwiLAkweGVlMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJleGl0IiwgICAgIkwiLAkweGVmMDksIDB4ZmYxZiwgVFJBUCB9LAoteyJlbnRyeSIsICAgImwiLAkweGU4MDksIDB4ZjgxZiwgVFJBUCB9LAoteyJleHRlbmQiLCAgImUiLAkweGYwMDAsIDB4ZjgwMCwgMCB9LAoteyJqYWxyIiwgICAgIngiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsciIsICAgICJSLHgiLAkweGU4NDAsIDB4ZjhmZiwgVUJEfFdSXzMxfFJEX3ggfSwKLXsiamFsIiwgICAgICJ4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCi17ImphbCIsICAgICAiUix4IiwJMHhlODQwLCAweGY4ZmYsIFVCRHxXUl8zMXxSRF94IH0sCi17ImphbCIsCSAgICAiYSIsCTB4MTgwMCwgMHhmYzAwLCBVQkR8V1JfMzEgfSwKLXsiamFseCIsICAgICJhIiwJMHgxYzAwLCAweGZjMDAsIFVCRHxXUl8zMSB9LAoteyJqciIsCSAgICAieCIsCTB4ZTgwMCwgMHhmOGZmLCBVQkR8UkRfeCB9LAoteyJqciIsCSAgICAiUiIsCTB4ZTgyMCwgMHhmZmZmLCBVQkR8UkRfMzEgfSwKLXsiaiIsCSAgICAieCIsCTB4ZTgwMCwgMHhmOGZmLCBVQkR8UkRfeCB9LAoteyJqIiwJICAgICJSIiwJMHhlODIwLCAweGZmZmYsIFVCRHxSRF8zMSB9LAoteyJsYiIsCSAgICAieSw1KHgpIiwJMHg4MDAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsYnUiLAkgICAgInksNSh4KSIsCTB4YTAwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibGQiLAkgICAgInksRCh4KSIsCTB4MzgwMCwgMHhmODAwLCBXUl95fFJEX3gsIEkzIH0sCi17ImxkIiwJICAgICJ5LEIiLAkweGZjMDAsIDB4ZmYwMCwgV1JfeXxSRF9QQywgSTMgfSwKLXsibGQiLAkgICAgInksRChQKSIsCTB4ZmMwMCwgMHhmZjAwLCBXUl95fFJEX1BDLCBJMyB9LAoteyJsZCIsCSAgICAieSxEKFMpIiwJMHhmODAwLCAweGZmMDAsIFdSX3l8UkRfU1AsIEkzIH0sCi17ImxoIiwJICAgICJ5LEgoeCkiLAkweDg4MDAsIDB4ZjgwMCwgV1JfeXxSRF94IH0sCi17ImxodSIsCSAgICAieSxIKHgpIiwJMHhhODAwLCAweGY4MDAsIFdSX3l8UkRfeCB9LAoteyJsaSIsCSAgICAieCxVIiwJMHg2ODAwLCAweGY4MDAsIFdSX3ggfSwKLXsibHciLAkgICAgInksVyh4KSIsCTB4OTgwMCwgMHhmODAwLCBXUl95fFJEX3ggfSwKLXsibHciLAkgICAgIngsQSIsCTB4YjAwMCwgMHhmODAwLCBXUl94fFJEX1BDIH0sCi17Imx3IiwJICAgICJ4LFYoUCkiLAkweGIwMDAsIDB4ZjgwMCwgV1JfeHxSRF9QQyB9LAoteyJsdyIsCSAgICAieCxWKFMpIiwJMHg5MDAwLCAweGY4MDAsIFdSX3h8UkRfU1AgfSwKLXsibHd1IiwgICAgICJ5LFcoeCkiLAkweGI4MDAsIDB4ZjgwMCwgV1JfeXxSRF94LCBJMyB9LAoteyJtZmhpIiwgICAgIngiLAkweGU4MTAsIDB4ZjhmZiwgV1JfeHxSRF9ISSB9LAoteyJtZmxvIiwgICAgIngiLAkweGU4MTIsIDB4ZjhmZiwgV1JfeHxSRF9MTyB9LAoteyJtb3ZlIiwgICAgInksWCIsCTB4NjcwMCwgMHhmZjAwLCBXUl95fFJEX1ggfSwKLXsibW92ZSIsICAgICJZLFoiLAkweDY1MDAsIDB4ZmYwMCwgV1JfWXxSRF9aIH0sCi17Im11bCIsICAgICAieix2LHkiLAkwLCAoaW50KSBNX01VTCwgSU5TTl9NQUNSTyB9LAoteyJtdWx0IiwgICAgIngseSIsCTB4ZTgxOCwgMHhmODFmLCBSRF94fFJEX3l8V1JfSEl8V1JfTE8gfSwKLXsibXVsdHUiLCAgICJ4LHkiLAkweGU4MTksIDB4ZjgxZiwgUkRfeHxSRF95fFdSX0hJfFdSX0xPIH0sCi17Im5lZyIsCSAgICAieCx3IiwJMHhlODBiLCAweGY4MWYsIFdSX3h8UkRfeSB9LAoteyJub3QiLAkgICAgIngsdyIsCTB4ZTgwZiwgMHhmODFmLCBXUl94fFJEX3kgfSwKLXsib3IiLAkgICAgIngseSIsCTB4ZTgwZCwgMHhmODFmLCBXUl94fFJEX3h8UkRfeSB9LAoteyJyZW0iLCAgICAgIjAseCx5IiwJMHhlODFhLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJyZW0iLCAgICAgInosdix5IiwJMCwgKGludCkgTV9SRU1fMywgSU5TTl9NQUNSTyB9LAoteyJyZW11IiwgICAgIjAseCx5IiwJMHhlODFiLCAweGY4MWYsIFJEX3h8UkRfeXxXUl9ISXxXUl9MTyB9LAoteyJyZW11IiwgICAgInosdix5IiwJMCwgKGludCkgTV9SRU1VXzMsIElOU05fTUFDUk8gfSwKLXsic2IiLAkgICAgInksNSh4KSIsCTB4YzAwMCwgMHhmODAwLCBSRF95fFJEX3ggfSwKLXsic2QiLAkgICAgInksRCh4KSIsCTB4NzgwMCwgMHhmODAwLCBSRF95fFJEX3gsIEkzIH0sCi17InNkIiwJICAgICJ5LEQoUykiLAkweGY5MDAsIDB4ZmYwMCwgUkRfeXxSRF9QQywgSTMgfSwKLXsic2QiLAkgICAgIlIsQyhTKSIsCTB4ZmEwMCwgMHhmZjAwLCBSRF8zMXxSRF9QQyB9LAoteyJzaCIsCSAgICAieSxIKHgpIiwJMHhjODAwLCAweGY4MDAsIFJEX3l8UkRfeCB9LAoteyJzbGx2IiwgICAgInkseCIsCTB4ZTgwNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzbGwiLAkgICAgIngsdyw8IiwJMHgzMDAwLCAweGY4MDMsIFdSX3h8UkRfeSB9LAoteyJzbGwiLCAgICAgInkseCIsCTB4ZTgwNCwgMHhmODFmLCBXUl95fFJEX3l8UkRfeCB9LAoteyJzbHRpIiwgICAgIngsOCIsCTB4NTAwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic2x0IiwJICAgICJ4LHkiLAkweGU4MDIsIDB4ZjgxZiwgV1JfVHxSRF94fFJEX3kgfSwKLXsic2x0IiwgICAgICJ4LDgiLAkweDUwMDAsIDB4ZjgwMCwgV1JfVHxSRF94IH0sCi17InNsdGl1IiwgICAieCw4IiwJMHg1ODAwLCAweGY4MDAsIFdSX1R8UkRfeCB9LAoteyJzbHR1IiwgICAgIngseSIsCTB4ZTgwMywgMHhmODFmLCBXUl9UfFJEX3h8UkRfeSB9LAoteyJzbHR1IiwgICAgIngsOCIsCTB4NTgwMCwgMHhmODAwLCBXUl9UfFJEX3ggfSwKLXsic3JhdiIsICAgICJ5LHgiLAkweGU4MDcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JhIiwJICAgICJ4LHcsPCIsCTB4MzAwMywgMHhmODAzLCBXUl94fFJEX3kgfSwKLXsic3JhIiwgICAgICJ5LHgiLAkweGU4MDcsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JsdiIsICAgICJ5LHgiLAkweGU4MDYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3JsIiwJICAgICJ4LHcsPCIsCTB4MzAwMiwgMHhmODAzLCBXUl94fFJEX3kgfSwKLXsic3JsIiwgICAgICJ5LHgiLAkweGU4MDYsIDB4ZjgxZiwgV1JfeXxSRF95fFJEX3ggfSwKLXsic3VidSIsICAgICJ6LHYseSIsCTB4ZTAwMywgMHhmODAzLCBXUl96fFJEX3h8UkRfeSB9LAoteyJzdWJ1IiwgICAgInkseCw0IiwJMCwgKGludCkgTV9TVUJVX0ksIElOU05fTUFDUk8gfSwKLXsic3VidSIsICAgICJ4LGsiLAkwLCAoaW50KSBNX1NVQlVfSV8yLCBJTlNOX01BQ1JPIH0sCi17InN3IiwJICAgICJ5LFcoeCkiLAkweGQ4MDAsIDB4ZjgwMCwgUkRfeXxSRF94IH0sCi17InN3IiwJICAgICJ4LFYoUykiLAkweGQwMDAsIDB4ZjgwMCwgUkRfeHxSRF9TUCB9LAoteyJzdyIsCSAgICAiUixWKFMpIiwJMHg2MjAwLCAweGZmMDAsIFJEXzMxfFJEX1NQIH0sCi17InhvciIsCSAgICAieCx5IiwJMHhlODBlLCAweGY4MWYsIFdSX3h8UkRfeHxSRF95IH0sCi19OwotCi1jb25zdCBpbnQgYmZkX21pcHMxNl9udW1fb3Bjb2RlcyA9Ci0gICgoc2l6ZW9mIG1pcHMxNl9vcGNvZGVzKSAvIChzaXplb2YgKG1pcHMxNl9vcGNvZGVzWzBdKSkpOwpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9tcHctY29uZmlnLmluIGIvb3Bjb2Rlcy9tcHctY29uZmlnLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjliZTlkLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbXB3LWNvbmZpZy5pbgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMgQ29uZmlndXJhdGlvbiBmcmFnbWVudCBmb3Igb3Bjb2Rlcy4KLQotU2V0IHRhcmdldF9hcmNoIGBlY2hvIHt0YXJnZXRfY2Fub25pY2FsfSB8IHNlZCAtZSAncy8tLiotLiovLydgCi0KLVNldCBhcmNobmFtZSBBUkNIX3t0YXJnZXRfYXJjaH0KLQotSWYgInt0YXJnZXRfYXJjaH0iID1+IC9tNjhrLwotCVNldCBCRkRfTUFDSElORVMgICcie299Im02OGstZGlzLmMubyAie299Im02OGstb3BjLmMubycKLUVsc2UgSWYgInt0YXJnZXRfYXJjaH0iID1+IC9wb3dlcnBjLwotCVNldCBCRkRfTUFDSElORVMgICcie299InBwYy1kaXMuYy5vICJ7b30icHBjLW9wYy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvaTM4Ni8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJpMzg2LWRpcy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvbWlwcy8KLQlTZXQgQkZEX01BQ0hJTkVTICAnIntvfSJtaXBzLWRpcy5jLm8gIntvfSJtaXBzLW9wYy5jLm8nCi1FbHNlIElmICJ7dGFyZ2V0X2FyY2h9IiA9fiAvc2gvCi0JU2V0IEJGRF9NQUNISU5FUyAgJyJ7b30ic2gtZGlzLmMubycKLUVuZCBJZgotCi1FY2hvICcjIFN0YXJ0IGZyb20gbXB3LWNvbmZpZy5pbicJCQkgPiAie299Im1rLnRtcAotRWNobyAiQkZEX01BQ0hJTkVTID0gIiB7QkZEX01BQ0hJTkVTfQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICJBUkNIREVGUyA9IC1kIiB7YXJjaG5hbWV9CQkJCT4+ICJ7b30ibWsudG1wCi1FY2hvICcjIEVuZCBmcm9tIG1wdy1jb25maWcuaW4nCQkJCT4+ICJ7b30ibWsudG1wCi0KLUVjaG8gJy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IG1wdy1jb25maWd1cmUuICAqLycJID4gIntvfSJjb25maWcubmV3Ci1FY2hvICcjaW5jbHVkZSAibXB3LmgiJwkJIAkJCT4+ICJ7b30iY29uZmlnLm5ldwotCi1Nb3ZlSWZDaGFuZ2UgIntvfSJjb25maWcubmV3ICJ7b30iY29uZmlnLmgKZGlmZiAtLWdpdCBhL29wY29kZXMvbXB3LW1ha2Uuc2VkIGIvb3Bjb2Rlcy9tcHctbWFrZS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNjA0ODYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9tcHctbWFrZS5zZWQKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIFNlZCBjb21tYW5kcyB0byBmaW5pc2ggdHJhbnNsYXRpbmcgdGhlIG9wY29kZXMgTWFrZWZpbGUuaW4gaW50byBNUFcgc3ludGF4LgotCi0jIEVtcHR5IEhERUZJTkVTLgotL0hERUZJTkVTL3MvQEhERUZJTkVTQC8vCi0KLSMgRml4IHBhdGhuYW1lcyB0byBpbmNsdWRlIGRpcmVjdG9yaWVzLgotL15JTkNESVIgPSAvcy9eSU5DRElSID0gLiokL0lOQ0RJUiA9ICJ7dG9wc3JjZGlyfSJpbmNsdWRlLwotL15DU0VBUkNIID0gL3MvJC8gLWkgIntJTkNESVJ9IjptcHc6IC1pIDo6ZXh0cmEtaW5jbHVkZTovCi0KLS9CRkRfTUFDSElORVMvcy9AQkZEX01BQ0hJTkVTQC97QkZEX01BQ0hJTkVTfS8KLS9hcmNoZGVmcy9zL0BhcmNoZGVmc0Ave0FSQ0hERUZTfS8KLQotIyBObyBQSUMgZm9vbGVyeSBpbiB0aGlzIGVudmlyb25tZW50LgotL0BBTExMSUJTQC9zL0BBTExMSUJTQC97VEFSR0VUTElCfS8KLS9AUElDTElTVEAvcy9AUElDTElTVEAvLwotL0BQSUNGTEFHQC9zL0BQSUNGTEFHQC8vCi0vXntPRklMRVN9IFxcT3B0aW9uLWYgc3RhbXAtcGljZGlyLywvXiQvZAotCi0jIFJlbW92ZSB0aGUgcGljIHRyaWNrZXJ5IGZyb20gdGhlIGRlZmF1bHQgYnVpbGQgcnVsZS4KLS9eXC5jXC5vIFxcT3B0aW9uLWYgLywvRW5kIElmL2NcCi0uYy5vIFxcT3B0aW9uLWYgLmMKLQotIyBSZW1vdmUgcGljIHRyaWNrZXJ5IGZyb20gb3RoZXIgcnVsZXMgLSBhaW1lZCBhdCB0aGUgcnVsZQotIyBmb3IgZGlzYXNzZW1ibGUubyBpbiBwYXJ0aWN1bGFyLgotLy1uICJ7UElDRkxBR30iLywvRW5kIElmL2QKZGlmZiAtLWdpdCBhL29wY29kZXMvbnMzMmstZGlzLmMgYi9vcGNvZGVzL25zMzJrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTAyNjZiLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvbnMzMmstZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OTQgKzAsMCBAQAotLyogUHJpbnQgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciAzMjAwMCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKGMpIDE5ODYsIDg4LCA5MSwgOTIsIDk0LCA5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2Ygb3Bjb2RlcyBsaWJyYXJ5LgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0KLSNpbmNsdWRlICJiZmQuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaWYgIWRlZmluZWQoY29uc3QpICYmICFkZWZpbmVkKF9fU1REQ19fKQotI2RlZmluZSBjb25zdAotI2VuZGlmCi0jaW5jbHVkZSAib3Bjb2RlL25zMzJrLmgiCi0jaW5jbHVkZSAib3BpbnRsLmgiCi0KLXN0YXRpYyBkaXNhc3NlbWJsZV9pbmZvICpkaXNfaW5mbzsKLQotLyoKLSAqIEhhY2tzIHRvIGdldCBpdCB0byBjb21waWxlIDw9IFJFQUQgVEhFU0UgQVMgRklYRVMgTkVFREVECi0gKi8KLSNkZWZpbmUgSU5WQUxJRF9GTE9BVCh2YWwsIHNpemUpIGludmFsaWRfZmxvYXQoKGNoYXIgKil2YWwsIHNpemUpCi0KLXN0YXRpYyBpbnQgcHJpbnRfaW5zbl9hcmcKLSAgUEFSQU1TICgoaW50LCBpbnQsIGludCAqLCBjaGFyICosIGJmZF92bWEsIGNoYXIgKiwgaW50KSk7Ci1zdGF0aWMgaW50IGdldF9kaXNwbGFjZW1lbnQgUEFSQU1TICgoY2hhciAqLCBpbnQgKikpOwotc3RhdGljIGludCBpbnZhbGlkX2Zsb2F0IFBBUkFNUyAoKGNoYXIgKiwgaW50KSk7Ci0KLXN0YXRpYyBsb25nIHJlYWRfbWVtb3J5X2ludGVnZXIoYWRkciwgbnIpCi0gICAgIHVuc2lnbmVkIGNoYXIgKmFkZHI7Ci0gICAgIGludCBucjsKLXsKLSAgbG9uZyB2YWw7Ci0gIGludCBpOwotICBmb3IgKHZhbCA9IDAsIGkgPSBuciAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgdmFsID0gICh2YWwgPDwgOCk7Ci0gICAgdmFsIHw9ICgweGZmICYgKihhZGRyICsgaSkpOwotICB9Ci0gIHJldHVybiB2YWw7Ci19Ci0KLS8qIDMyMDAwIGluc3RydWN0aW9ucyBhcmUgbmV2ZXIgbG9uZ2VyIHRoYW4gdGhpcy4gICovCi0jZGVmaW5lIE1BWExFTiA2MgotCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RydWN0IHByaXZhdGUKLXsKLSAgLyogUG9pbnRzIHRvIGZpcnN0IGJ5dGUgbm90IGZldGNoZWQuICAqLwotICBiZmRfYnl0ZSAqbWF4X2ZldGNoZWQ7Ci0gIGJmZF9ieXRlIHRoZV9idWZmZXJbTUFYTEVOXTsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci19OwotCi0KLS8qIE1ha2Ugc3VyZSB0aGF0IGJ5dGVzIGZyb20gSU5GTy0+UFJJVkFURV9EQVRBLT5CVUZGRVIgKGluY2x1c2l2ZSkKLSAgIHRvIEFERFIgKGV4Y2x1c2l2ZSkgYXJlIHZhbGlkLiAgUmV0dXJucyAxIGZvciBzdWNjZXNzLCBsb25nam1wcwotICAgb24gZXJyb3IuICAqLwotI2RlZmluZSBGRVRDSF9EQVRBKGluZm8sIGFkZHIpIFwKLSAgKChhZGRyKSA8PSAoKHN0cnVjdCBwcml2YXRlICopKGluZm8tPnByaXZhdGVfZGF0YSkpLT5tYXhfZmV0Y2hlZCBcCi0gICA/IDEgOiBmZXRjaF9kYXRhICgoaW5mbyksIChhZGRyKSkpCi0KLXN0YXRpYyBpbnQKLWZldGNoX2RhdGEgKGluZm8sIGFkZHIpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfYnl0ZSAqYWRkcjsKLXsKLSAgaW50IHN0YXR1czsKLSAgc3RydWN0IHByaXZhdGUgKnByaXYgPSAoc3RydWN0IHByaXZhdGUgKilpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotICByZXR1cm4gMTsKLX0KLS8qIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSNkZWZpbmUgTk9QQ09ERVMgKHNpemVvZiBuczMya19vcGNvZGVzIC8gc2l6ZW9mIG5zMzJrX29wY29kZXNbMF0pCi0KLSNkZWZpbmUgTkVYVF9JU19BRERSCSd8JwotCi0MCi1zdHJ1Y3QgbnMzMmtfb3B0aW9uIHsKLSAgY2hhciAqcGF0dGVybjsJCS8qIHRoZSBvcHRpb24gaXRzZWxmICovCi0gIHVuc2lnbmVkIGxvbmcgdmFsdWU7CQkvKiBiaW5hcnkgdmFsdWUgb2YgdGhlIG9wdGlvbiAqLwotICB1bnNpZ25lZCBsb25nIG1hdGNoOwkJLyogdGhlc2UgYml0cyBtdXN0IG1hdGNoICovCi19OwotCi0MCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfdVtdPSAvKiByZXN0b3JlLCBleGl0ICovCi17Ci0gIHsgInIwIiwJMHg4MCwJMHg4MAl9LAotICB7ICJyMSIsCTB4NDAsCTB4NDAJfSwKLSAgeyAicjIiLAkweDIwLAkweDIwCX0sCi0gIHsgInIzIiwJMHgxMCwJMHgxMAl9LAotICB7ICJyNCIsCTB4MDgsCTB4MDgJfSwKLSAgeyAicjUiLAkweDA0LAkweDA0CX0sCi0gIHsgInI2IiwJMHgwMiwJMHgwMgl9LAotICB7ICJyNyIsCTB4MDEsCTB4MDEJfSwKLSAgeyAgMCAsCTB4MDAsCTB4MDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gb3B0X1VbXT0gLyogc2F2ZSwgZW50ZXIgKi8KLXsKLSAgeyAicjAiLAkweDAxLAkweDAxCX0sCi0gIHsgInIxIiwJMHgwMiwJMHgwMgl9LAotICB7ICJyMiIsCTB4MDQsCTB4MDQJfSwKLSAgeyAicjMiLAkweDA4LAkweDA4CX0sCi0gIHsgInI0IiwJMHgxMCwJMHgxMAl9LAotICB7ICJyNSIsCTB4MjAsCTB4MjAJfSwKLSAgeyAicjYiLAkweDQwLAkweDQwCX0sCi0gIHsgInI3IiwJMHg4MCwJMHg4MAl9LAotICB7ICAwICwJMHgwMCwJMHgwMAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfT1tdPSAvKiBzZXRjZmcgKi8KLXsKLSAgeyAiYyIsCTB4OCwJMHg4CX0sCi0gIHsgIm0iLAkweDQsCTB4NAl9LAotICB7ICJmIiwJMHgyLAkweDIJfSwKLSAgeyAiaSIsCTB4MSwJMHgxCX0sCi0gIHsgIDAgLAkweDAsCTB4MAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfQ1tdPSAvKiBjaW52ICovCi17Ci0gIHsgImEiLAkweDQsCTB4NAl9LAotICB7ICJpIiwJMHgyLAkweDIJfSwKLSAgeyAiZCIsCTB4MSwJMHgxCX0sCi0gIHsgIDAgLAkweDAsCTB4MAl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBvcHRfU1tdPSAvKiBzdHJpbmcgaW5zdCAqLwotewotICB7ICJiIiwJMHgxLAkweDEJfSwKLSAgeyAidSIsCTB4NiwJMHg2CX0sCi0gIHsgInciLAkweDIsCTB4Mgl9LAotICB7ICAwICwJMHgwLAkweDAJfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gbGlzdF9QNTMyW109IC8qIGxwciBzcHIgKi8KLXsKLSAgeyAidXMiLAkweDAsCTB4Zgl9LAotICB7ICJkY3IiLAkweDEsCTB4Zgl9LAotICB7ICJicGMiLAkweDIsCTB4Zgl9LAotICB7ICJkc3IiLAkweDMsCTB4Zgl9LAotICB7ICJjYXIiLAkweDQsCTB4Zgl9LAotICB7ICJmcCIsCTB4OCwJMHhmCX0sCi0gIHsgInNwIiwJMHg5LAkweGYJfSwKLSAgeyAic2IiLAkweGEsCTB4Zgl9LAotICB7ICJ1c3AiLAkweGIsCTB4Zgl9LAotICB7ICJjZmciLAkweGMsCTB4Zgl9LAotICB7ICJwc3IiLAkweGQsCTB4Zgl9LAotICB7ICJpbnRiYXNlIiwJMHhlLAkweGYJfSwKLSAgeyAibW9kIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MDAsCTB4Zgl9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5zMzJrX29wdGlvbiBsaXN0X001MzJbXT0gLyogbG1yIHNtciAqLwotewotICB7ICJtY3IiLAkweDksCTB4Zgl9LAotICB7ICJtc3IiLAkweGEsCTB4Zgl9LAotICB7ICJ0ZWFyIiwJMHhiLAkweGYJfSwKLSAgeyAicHRiMCIsCTB4YywJMHhmCX0sCi0gIHsgInB0YjEiLAkweGQsCTB4Zgl9LAotICB7ICJpdmFyMCIsCTB4ZSwJMHhmCX0sCi0gIHsgIml2YXIxIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MCwJMHhmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfUDAzMltdPSAvKiBscHIgc3ByICovCi17Ci0gIHsgInVwc3IiLAkweDAsCTB4Zgl9LAotICB7ICJmcCIsCTB4OCwJMHhmCX0sCi0gIHsgInNwIiwJMHg5LAkweGYJfSwKLSAgeyAic2IiLAkweGEsCTB4Zgl9LAotICB7ICJwc3IiLAkweGIsCTB4Zgl9LAotICB7ICJpbnRiYXNlIiwJMHhlLAkweGYJfSwKLSAgeyAibW9kIiwJMHhmLAkweGYJfSwKLSAgeyAgMCAsCTB4MCwJMHhmCX0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uIGxpc3RfTTAzMltdPSAvKiBsbXIgc21yICovCi17Ci0gIHsgImJwcjAiLAkweDAsCTB4Zgl9LAotICB7ICJicHIxIiwJMHgxLAkweGYJfSwKLSAgeyAicGYwIiwJMHg0LAkweGYJfSwKLSAgeyAicGYxIiwJMHg1LAkweGYJfSwKLSAgeyAic2MiLAkweDgsCTB4Zgl9LAotICB7ICJtc3IiLAkweGEsCTB4Zgl9LAotICB7ICJiY250IiwJMHhiLAkweGYJfSwKLSAgeyAicHRiMCIsCTB4YywJMHhmCX0sCi0gIHsgInB0YjEiLAkweGQsCTB4Zgl9LAotICB7ICJlaWEiLAkweGYsCTB4Zgl9LAotICB7ICAwICwJMHgwLAkweGYJfQotfTsKLQotCi0vKgotICogZmlndXJlIG91dCB3aGljaCBvcHRpb25zIGFyZSBwcmVzZW50Ci0gKi8KLXN0YXRpYyB2b2lkCi1vcHRsaXN0KG9wdGlvbnMsIG9wdGlvblAsIHJlc3VsdCkKLSAgICAgaW50IG9wdGlvbnM7Ci0gICAgIGNvbnN0IHN0cnVjdCBuczMya19vcHRpb24gKm9wdGlvblA7Ci0gICAgIGNoYXIgKnJlc3VsdDsKLXsKLSAgICBpZiAob3B0aW9ucyA9PSAwKSB7Ci0Jc3ByaW50ZihyZXN1bHQsICJbXSIpOwotCXJldHVybjsKLSAgICB9Ci0gICAgc3ByaW50ZihyZXN1bHQsICJbIik7Ci0KLSAgICBmb3IgKDsgKG9wdGlvbnMgIT0gMCkgJiYgb3B0aW9uUC0+cGF0dGVybjsgb3B0aW9uUCsrKSB7Ci0JaWYgKChvcHRpb25zICYgb3B0aW9uUC0+bWF0Y2gpID09IG9wdGlvblAtPnZhbHVlKSB7Ci0JICAgIC8qIHdlIGZvdW5kIGEgbWF0Y2gsIHVwZGF0ZSByZXN1bHQgYW5kIG9wdGlvbnMgKi8KLQkgICAgc3RyY2F0KHJlc3VsdCwgb3B0aW9uUC0+cGF0dGVybik7Ci0JICAgIG9wdGlvbnMgJj0gfm9wdGlvblAtPnZhbHVlOwotCSAgICBpZiAob3B0aW9ucyAhPSAwKQkvKiBtb3JlIG9wdGlvbnMgdG8gY29tZSAqLwotCQlzdHJjYXQocmVzdWx0LCAiLCIpOwotCX0KLSAgICB9Ci0gICAgaWYgKG9wdGlvbnMgIT0gMCkKLQlzdHJjYXQocmVzdWx0LCAidW5kZWZpbmVkIik7Ci0KLSAgICBzdHJjYXQocmVzdWx0LCAiXSIpOwotfQotCi1zdGF0aWMgdm9pZAotbGlzdF9zZWFyY2ggKHJlZ192YWx1ZSwgb3B0aW9uUCwgcmVzdWx0KQotICAgICBpbnQgcmVnX3ZhbHVlOwotICAgICBjb25zdCBzdHJ1Y3QgbnMzMmtfb3B0aW9uICpvcHRpb25QOwotICAgICBjaGFyICpyZXN1bHQ7Ci17Ci0gICAgZm9yICg7IG9wdGlvblAtPnBhdHRlcm47IG9wdGlvblArKykgewotCWlmICgocmVnX3ZhbHVlICYgb3B0aW9uUC0+bWF0Y2gpID09IG9wdGlvblAtPnZhbHVlKSB7Ci0JICAgIHNwcmludGYocmVzdWx0LCAiJXMiLCBvcHRpb25QLT5wYXR0ZXJuKTsKLQkgICAgcmV0dXJuOwotCX0KLSAgICB9Ci0gICAgc3ByaW50ZihyZXN1bHQsICJ1bmRlZmluZWQiKTsKLX0KLQwKLS8qCi0gKiBleHRyYWN0ICJjb3VudCIgYml0cyBzdGFydGluZyAib2Zmc2V0IiBiaXRzCi0gKiBpbnRvIGJ1ZmZlcgotICovCi0KLXN0YXRpYyBpbnQKLWJpdF9leHRyYWN0IChidWZmZXIsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaW50IHJlc3VsdDsKLSAgaW50IGJpdDsKLQotICBidWZmZXIgKz0gb2Zmc2V0ID4+IDM7Ci0gIG9mZnNldCAmPSA3OwotICBiaXQgPSAxOwotICByZXN1bHQgPSAwOwotICB3aGlsZSAoY291bnQtLSkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBKGRpc19pbmZvLCBidWZmZXIgKyAxKTsKLSAgICAgIGlmICgoKmJ1ZmZlciAmICgxIDw8IG9mZnNldCkpKQotCXJlc3VsdCB8PSBiaXQ7Ci0gICAgICBpZiAoKytvZmZzZXQgPT0gOCkKLQl7Ci0JICBvZmZzZXQgPSAwOwotCSAgYnVmZmVyKys7Ci0JfQotICAgICAgYml0IDw8PSAxOwotICAgIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogTGlrZSBiaXQgZXh0cmFjdCBidXQgdGhlIGJ1ZmZlciBpcyB2YWxpZCBhbmQgZG9lbid0IG5lZWQgdG8gYmUKLSAqIGZldGNoZWQKLSAqLwotc3RhdGljIGludAotYml0X2V4dHJhY3Rfc2ltcGxlIChidWZmZXIsIG9mZnNldCwgY291bnQpCi0gICAgIGJmZF9ieXRlICpidWZmZXI7Ci0gICAgIGludCBvZmZzZXQ7Ci0gICAgIGludCBjb3VudDsKLXsKLSAgaW50IHJlc3VsdDsKLSAgaW50IG1hc2s7Ci0gIGludCBiaXQ7Ci0KLSAgYnVmZmVyICs9IG9mZnNldCA+PiAzOwotICBvZmZzZXQgJj0gNzsKLSAgYml0ID0gMTsKLSAgcmVzdWx0ID0gMDsKLSAgd2hpbGUgKGNvdW50LS0pCi0gICAgewotICAgICAgaWYgKCgqYnVmZmVyICYgKDEgPDwgb2Zmc2V0KSkpCi0JcmVzdWx0IHw9IGJpdDsKLSAgICAgIGlmICgrK29mZnNldCA9PSA4KQotCXsKLQkgIG9mZnNldCA9IDA7Ci0JICBidWZmZXIrKzsKLQl9Ci0gICAgICBiaXQgPDw9IDE7Ci0gICAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZAotYml0X2NvcHkgKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCwgdG8pCi0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgaW50IG9mZnNldDsKLSAgICAgaW50IGNvdW50OwotICAgICBjaGFyICp0bzsKLXsKLSAgZm9yKDsgY291bnQgPiA4OyBjb3VudCAtPSA4LCB0bysrLCBvZmZzZXQgKz0gOCkKLSAgICAqdG8gPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIDgpOwotICAqdG8gPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBvZmZzZXQsIGNvdW50KTsKLX0KLQotCi1zdGF0aWMgaW50Ci1zaWduX2V4dGVuZCAodmFsdWUsIGJpdHMpCi0gICAgIGludCB2YWx1ZSwgYml0czsKLXsKLSAgdmFsdWUgPSB2YWx1ZSAmICgoMSA8PCBiaXRzKSAtIDEpOwotICByZXR1cm4gKHZhbHVlICYgKDEgPDwgKGJpdHMtMSkpCi0JICA/IHZhbHVlIHwgKH4oKDEgPDwgYml0cykgLSAxKSkKLQkgIDogdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZAotZmxpcF9ieXRlcyAocHRyLCBjb3VudCkKLSAgICAgY2hhciAqcHRyOwotICAgICBpbnQgY291bnQ7Ci17Ci0gIGNoYXIgdG1wOwotCi0gIHdoaWxlIChjb3VudCA+IDApCi0gICAgewotICAgICAgdG1wID0gcHRyWzBdOwotICAgICAgcHRyWzBdID0gcHRyW2NvdW50LTFdOwotICAgICAgcHRyW2NvdW50LTFdID0gdG1wOwotICAgICAgcHRyKys7Ci0gICAgICBjb3VudCAtPSAyOwotICAgIH0KLX0KLQwKLS8qIEdpdmVuIGEgY2hhcmFjdGVyIEMsIGRvZXMgaXQgcmVwcmVzZW50IGEgZ2VuZXJhbCBhZGRyZXNzaW5nIG1vZGU/ICAqLwotI2RlZmluZSBJc19nZW4oYykgXAotICAoKGMpID09ICdGJyB8fCAoYykgPT0gJ0wnIHx8IChjKSA9PSAnQicgXAotICAgfHwgKGMpID09ICdXJyB8fCAoYykgPT0gJ0QnIHx8IChjKSA9PSAnQScgfHwgKGMpID09ICdJJyB8fCAoYykgPT0gJ1onKQotCi0vKiBBZHJlc3NpbmcgbW9kZXMuICAqLwotI2RlZmluZSBBZHJtb2RfaW5kZXhfYnl0ZSAweDFjCi0jZGVmaW5lIEFkcm1vZF9pbmRleF93b3JkIDB4MWQKLSNkZWZpbmUgQWRybW9kX2luZGV4X2RvdWJsZXdvcmQgMHgxZQotI2RlZmluZSBBZHJtb2RfaW5kZXhfcXVhZHdvcmQgMHgxZgotCi0vKiBJcyBNT0RFIGFuIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlPyAgKi8KLSNkZWZpbmUgQWRybW9kX2lzX2luZGV4KG1vZGUpIFwKLSAgKG1vZGUgPT0gQWRybW9kX2luZGV4X2J5dGUgXAotICAgfHwgbW9kZSA9PSBBZHJtb2RfaW5kZXhfd29yZCBcCi0gICB8fCBtb2RlID09IEFkcm1vZF9pbmRleF9kb3VibGV3b3JkIFwKLSAgIHx8IG1vZGUgPT0gQWRybW9kX2luZGV4X3F1YWR3b3JkKQotCi0MCi0vKiBQcmludCB0aGUgMzIwMDAgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyBNRU1BRERSIGluIGRlYnVnZ2VkIG1lbW9yeSwKLSAgIG9uIFNUUkVBTS4gIFJldHVybnMgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbiwgaW4gYnl0ZXMuICAqLwotCi1pbnQKLXByaW50X2luc25fbnMzMmsgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0gIHJlZ2lzdGVyIGNoYXIgKmQ7Ci0gIHVuc2lnbmVkIHNob3J0IGZpcnN0X3dvcmQ7Ci0gIGludCBpb2Zmc2V0OwkJLyogYml0cyBpbnRvIGluc3RydWN0aW9uICovCi0gIGludCBhb2Zmc2V0OwkJLyogYml0cyBpbnRvIGFyZ3VtZW50cyAqLwotICBjaGFyIGFyZ19idWZzW01BWF9BUkdTKzFdW0FSR19MRU5dOwotICBpbnQgYXJnbnVtOwotICBpbnQgbWF4YXJnOwotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotICBkaXNfaW5mbyA9IGluZm87Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJnByaXY7Ci0gIHByaXYubWF4X2ZldGNoZWQgPSBwcml2LnRoZV9idWZmZXI7Ci0gIHByaXYuaW5zbl9zdGFydCA9IG1lbWFkZHI7Ci0gIGlmIChzZXRqbXAgKHByaXYuYmFpbG91dCkgIT0gMCkKLSAgICAvKiBFcnJvciByZXR1cm4uICAqLwotICAgIHJldHVybiAtMTsKLQotICAvKiBMb29rIGZvciA4Yml0IG9wY29kZXMgZmlyc3QuIE90aGVyIHdpc2UsIGZldGNoaW5nIHR3byBieXRlcyBjb3VsZCB0YWtlCi0gICAqIHVzIG92ZXIgdGhlIGVuZCBvZiBhY2Nlc3NpYmxlIGRhdGEgdW5uZWNlc3NhcmlsbHkKLSAgICovCi0gIEZFVENIX0RBVEEoaW5mbywgYnVmZmVyICsgMSk7Ci0gIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQotICAgIGlmIChuczMya19vcGNvZGVzW2ldLm9wY29kZV9pZF9zaXplIDw9IDgKLQkmJiAoKGJ1ZmZlclswXQotCSAgICAgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUpIC0gMSkpCi0JICAgID09IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NlZWQpKQotICAgICAgYnJlYWs7Ci0gIGlmIChpID09IE5PUENPREVTKSB7Ci0gICAgLyogTWF5YmUgaXQgaXMgOSB0byAxNiBiaXRzIGJpZyAqLwotICAgIEZFVENIX0RBVEEoaW5mbywgYnVmZmVyICsgMik7Ci0gICAgZmlyc3Rfd29yZCA9IHJlYWRfbWVtb3J5X2ludGVnZXIoYnVmZmVyLCAyKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBOT1BDT0RFUzsgaSsrKQotICAgICAgaWYgKChmaXJzdF93b3JkCi0JICAgJiAoKCh1bnNpZ25lZCBsb25nKSAxIDw8IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX2lkX3NpemUpIC0gMSkpCi0JICA9PSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zZWVkKQotCWJyZWFrOwotCi0gICAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICAqLwotICAgIGlmIChpID09IE5PUENPREVTKQotICAgICAgewotCSgqZGlzX2luZm8tPmZwcmludGZfZnVuYykoZGlzX2luZm8tPnN0cmVhbSwgIjAlbyIsIGJ1ZmZlclswXSk7Ci0JcmV0dXJuIDE7Ci0gICAgICB9Ci0gIH0KLQotICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIlcyIsIG5zMzJrX29wY29kZXNbaV0ubmFtZSk7Ci0KLSAgaW9mZnNldCA9IG5zMzJrX29wY29kZXNbaV0ub3Bjb2RlX3NpemU7Ci0gIGFvZmZzZXQgPSBuczMya19vcGNvZGVzW2ldLm9wY29kZV9zaXplOwotICBkID0gbnMzMmtfb3Bjb2Rlc1tpXS5vcGVyYW5kczsKLQotICBpZiAoKmQpCi0gICAgewotICAgICAgLyogT2Zmc2V0IGluIGJpdHMgb2YgdGhlIGZpcnN0IHRoaW5nIGJleW9uZCBlYWNoIGluZGV4IGJ5dGUuCi0JIEVsZW1lbnQgMCBpcyBmb3Igb3BlcmFuZCBBIGFuZCBlbGVtZW50IDEgaXMgZm9yIG9wZXJhbmQgQi4KLQkgVGhlIHJlc3QgYXJlIGlycmVsZXZhbnQsIGJ1dCB3ZSBwdXQgdGhlbSBoZXJlIHNvIHdlIGRvbid0Ci0JIGluZGV4IG91dHNpZGUgdGhlIGFycmF5LiAgKi8KLSAgICAgIGludCBpbmRleF9vZmZzZXRbTUFYX0FSR1NdOwotCi0gICAgICAvKiAwIGZvciBvcGVyYW5kIEEsIDEgZm9yIG9wZXJhbmQgQiwgZ3JlYXRlciBmb3Igb3RoZXIgYXJncy4gICovCi0gICAgICBpbnQgd2hpY2hhcmcgPSAwOwotICAgICAgCi0gICAgICAoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICJcdCIpOwotCi0gICAgICBtYXhhcmcgPSAwOwotCi0gICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIGZpbmQgYW5kIGtlZXAgdHJhY2sgb2YgdGhlIGluZGV4IGJ5dGVzLAotCSBpZiB3ZSBhcmUgdXNpbmcgc2NhbGVkIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlLCBzaW5jZSB0aGUgaW5kZXgKLQkgYnl0ZXMgb2NjdXIgcmlnaHQgYWZ0ZXIgdGhlIGJhc2ljIGluc3RydWN0aW9uLCBub3QgYXMgcGFydAotCSBvZiB0aGUgYWRkcmVzc2luZyBleHRlbnNpb24uICAqLwotICAgICAgaWYgKElzX2dlbihkWzFdKSkKLQl7Ci0JICBpbnQgYWRkcl9tb2RlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldCAtIDUsIDUpOwotCi0JICBpZiAoQWRybW9kX2lzX2luZGV4IChhZGRyX21vZGUpKQotCSAgICB7Ci0JICAgICAgYW9mZnNldCArPSA4OwotCSAgICAgIGluZGV4X29mZnNldFswXSA9IGFvZmZzZXQ7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAoZFsyXSAmJiBJc19nZW4oZFszXSkpCi0JewotCSAgaW50IGFkZHJfbW9kZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQgLSAxMCwgNSk7Ci0KLQkgIGlmIChBZHJtb2RfaXNfaW5kZXggKGFkZHJfbW9kZSkpCi0JICAgIHsKLQkgICAgICBhb2Zmc2V0ICs9IDg7Ci0JICAgICAgaW5kZXhfb2Zmc2V0WzFdID0gYW9mZnNldDsKLQkgICAgfQotCX0KLQotICAgICAgd2hpbGUgKCpkKQotCXsKLQkgIGFyZ251bSA9ICpkIC0gJzEnOwotCSAgZCsrOwotCSAgaWYgKGFyZ251bSA+IG1heGFyZyAmJiBhcmdudW0gPCBNQVhfQVJHUykKLQkgICAgbWF4YXJnID0gYXJnbnVtOwotCSAgaW9mZnNldCA9IHByaW50X2luc25fYXJnICgqZCwgaW9mZnNldCwgJmFvZmZzZXQsIGJ1ZmZlciwKLQkJCQkgICAgbWVtYWRkciwgYXJnX2J1ZnNbYXJnbnVtXSwKLQkJCQkgICAgaW5kZXhfb2Zmc2V0W3doaWNoYXJnXSk7Ci0JICBkKys7Ci0JICB3aGljaGFyZysrOwotCX0KLSAgICAgIGZvciAoYXJnbnVtID0gMDsgYXJnbnVtIDw9IG1heGFyZzsgYXJnbnVtKyspCi0JewotCSAgYmZkX3ZtYSBhZGRyOwotCSAgY2hhciAqY2g7Ci0JICBmb3IgKGNoID0gYXJnX2J1ZnNbYXJnbnVtXTsgKmNoOykKLQkgICAgewotCSAgICAgIGlmICgqY2ggPT0gTkVYVF9JU19BRERSKQotCQl7Ci0JCSAgKytjaDsKLQkJICBhZGRyID0gYmZkX3NjYW5fdm1hIChjaCwgTlVMTCwgMTYpOwotCQkgICgqZGlzX2luZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIsIGRpc19pbmZvKTsKLQkJICB3aGlsZSAoKmNoICYmICpjaCAhPSBORVhUX0lTX0FERFIpCi0JCSAgICArK2NoOwotCQkgIGlmICgqY2gpCi0JCSAgICArK2NoOwotCQl9Ci0JICAgICAgZWxzZQotCQkoKmRpc19pbmZvLT5mcHJpbnRmX2Z1bmMpKGRpc19pbmZvLT5zdHJlYW0sICIlYyIsICpjaCsrKTsKLQkgICAgfQotCSAgaWYgKGFyZ251bSA8IG1heGFyZykKLQkgICAgKCpkaXNfaW5mby0+ZnByaW50Zl9mdW5jKShkaXNfaW5mby0+c3RyZWFtLCAiLCAiKTsKLQl9Ci0gICAgfQotICByZXR1cm4gYW9mZnNldCAvIDg7Ci19Ci0KLS8qIFByaW50IGFuIGluc3RydWN0aW9uIG9wZXJhbmQgb2YgY2F0ZWdvcnkgZ2l2ZW4gYnkgZC4gIElPRkZTRVQgaXMKLSAgIHRoZSBiaXQgcG9zaXRpb24gYmVsb3cgd2hpY2ggc21hbGwgKDwxIGJ5dGUpIHBhcnRzIG9mIHRoZSBvcGVyYW5kIGNhbgotICAgYmUgZm91bmQgKHVzdWFsbHkgaW4gdGhlIGJhc2ljIGluc3RydWN0aW9uLCBidXQgZm9yIGluZGV4ZWQKLSAgIGFkZHJlc3NpbmcgaXQgY2FuIGJlIGluIHRoZSBpbmRleCBieXRlKS4gIEFPRkZTRVRQIGlzIGEgcG9pbnRlciB0byB0aGUKLSAgIGJpdCBwb3NpdGlvbiBvZiB0aGUgYWRkcmVzc2luZyBleHRlbnNpb24uICBCVUZGRVIgY29udGFpbnMgdGhlCi0gICBpbnN0cnVjdGlvbi4gIEFERFIgaXMgd2hlcmUgQlVGRkVSIHdhcyByZWFkIGZyb20uICBQdXQgdGhlIGRpc2Fzc2VtYmxlZAotICAgdmVyc2lvbiBvZiB0aGUgb3BlcmFuZCBpbiBSRVNVTFQuICBJTkRFWF9PRkZTRVQgaXMgdGhlIGJpdCBwb3NpdGlvbgotICAgb2YgdGhlIGluZGV4IGJ5dGUgKGl0IGNvbnRhaW5zIGdhcmJhZ2UgaWYgdGhpcyBvcGVyYW5kIGlzIG5vdCBhCi0gICBnZW5lcmFsIG9wZXJhbmQgdXNpbmcgc2NhbGVkIGluZGV4ZWQgYWRkcmVzc2luZyBtb2RlKS4gICovCi0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fYXJnIChkLCBpb2Zmc2V0LCBhb2Zmc2V0cCwgYnVmZmVyLCBhZGRyLCByZXN1bHQsIGluZGV4X29mZnNldCkKLSAgICAgaW50IGQ7Ci0gICAgIGludCBpb2Zmc2V0LCAqYW9mZnNldHA7Ci0gICAgIGNoYXIgKmJ1ZmZlcjsKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBjaGFyICpyZXN1bHQ7Ci0gICAgIGludCBpbmRleF9vZmZzZXQ7Ci17Ci0gIGludCBhZGRyX21vZGU7Ci0gIGZsb2F0IEZ2YWx1ZTsKLSAgZG91YmxlIEx2YWx1ZTsKLSAgaW50IEl2YWx1ZTsKLSAgaW50IGRpc3AxLCBkaXNwMjsKLSAgaW50IGluZGV4OwotICBpbnQgc2l6ZTsKLQotICBzd2l0Y2ggKGQpCi0gICAgewotICAgIGNhc2UgJ2YnOgotICAgICAgLyogYSAiZ2VuIiBvcGVyYW5kIGJ1dCA1IGJpdHMgZnJvbSB0aGUgZW5kIG9mIGluc3RydWN0aW9uICovCi0gICAgICBpb2Zmc2V0IC09IDU7Ci0gICAgY2FzZSAnWic6Ci0gICAgY2FzZSAnRic6Ci0gICAgY2FzZSAnTCc6Ci0gICAgY2FzZSAnSSc6Ci0gICAgY2FzZSAnQic6Ci0gICAgY2FzZSAnVyc6Ci0gICAgY2FzZSAnRCc6Ci0gICAgY2FzZSAnQSc6Ci0gICAgICBhZGRyX21vZGUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCBpb2Zmc2V0LTUsIDUpOwotICAgICAgaW9mZnNldCAtPSA1OwotICAgICAgc3dpdGNoIChhZGRyX21vZGUpCi0JewotCWNhc2UgMHgwOiBjYXNlIDB4MTogY2FzZSAweDI6IGNhc2UgMHgzOgotCWNhc2UgMHg0OiBjYXNlIDB4NTogY2FzZSAweDY6IGNhc2UgMHg3OgotCSAgLyogcmVnaXN0ZXIgbW9kZSBSMCAtLSBSNyAqLwotCSAgc3dpdGNoIChkKQotCSAgICB7Ci0JICAgIGNhc2UgJ0YnOgotCSAgICBjYXNlICdMJzoKLQkgICAgY2FzZSAnWic6Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiZiVkIiwgYWRkcl9tb2RlKTsKLQkgICAgICBicmVhazsKLQkgICAgZGVmYXVsdDoKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICJyJWQiLCBhZGRyX21vZGUpOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDB4ODogY2FzZSAweDk6IGNhc2UgMHhhOiBjYXNlIDB4YjoKLQljYXNlIDB4YzogY2FzZSAweGQ6IGNhc2UgMHhlOiBjYXNlIDB4ZjoKLQkgIC8qIFJlZ2lzdGVyIHJlbGF0aXZlIGRpc3AoUjAgLS0gUjcpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgc3ByaW50ZiAocmVzdWx0LCAiJWQociVkKSIsIGRpc3AxLCBhZGRyX21vZGUgJiA3KTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMDoKLQljYXNlIDB4MTE6Ci0JY2FzZSAweDEyOgotCSAgLyogTWVtb3J5IHJlbGF0aXZlIGRpc3AyKGRpc3AxKEZQLCBTUCwgU0IpKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIGRpc3AyID0gZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCk7Ci0JICBzcHJpbnRmIChyZXN1bHQsICIlZCglZCglcykpIiwgZGlzcDIsIGRpc3AxLAotCQkgICBhZGRyX21vZGU9PTB4MTA/ImZwIjphZGRyX21vZGU9PTB4MTE/InNwIjoic2IiKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxMzoKLQkgIC8qIHJlc2VydmVkICovCi0JICBzcHJpbnRmIChyZXN1bHQsICJyZXNlcnZlZCIpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE0OgotCSAgLyogSW1tZWRpYXRlICovCi0JICBzd2l0Y2ggKGQpCi0JICAgIHsKLQkgICAgY2FzZSAnSSc6IGNhc2UgJ1onOiBjYXNlICdBJzoKLQkgICAgICAvKiBJIGFuZCBaIGFyZSBvdXRwdXQgb3BlcmFuZHMgYW5kIGNhbmB0IGJlIGltbWVkaWF0ZQotCSAgICAgICAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgotCSAgICAgICAqIGFuIGltbWVkaWF0ZSBlaXRoZXIuIFdlIGRvbid0IGtub3cgaG93IG11Y2ggdG8gaW5jcmVhc2UKLQkgICAgICAgKiBhb2Zmc2V0cCBieSBzaW5jZSB3aGF0ZXZlciBnZW5lcmF0ZWQgdGhpcyBpcyBicm9rZW4KLQkgICAgICAgKiBhbnl3YXkhCi0JICAgICAgICovCi0JICAgICAgc3ByaW50ZiAocmVzdWx0LCBfKCIkPHVuZGVmaW5lZD4iKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgJ0InOgotCSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0JICAgICAgSXZhbHVlID0gc2lnbl9leHRlbmQgKEl2YWx1ZSwgOCk7Ci0JICAgICAgKmFvZmZzZXRwICs9IDg7Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnVyc6Ci0JICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAxNik7Ci0JICAgICAgZmxpcF9ieXRlcyAoJkl2YWx1ZSwgMik7Ci0JICAgICAgKmFvZmZzZXRwICs9IDE2OwotCSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDE2KTsKLQkgICAgICBzcHJpbnRmIChyZXN1bHQsICIkJWQiLCBJdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdEJzoKLQkgICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdCAoYnVmZmVyLCAqYW9mZnNldHAsIDMyKTsKLQkgICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCA0KTsKLQkgICAgICAqYW9mZnNldHAgKz0gMzI7Ci0JICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJCVkIiwgSXZhbHVlKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSAnRic6Ci0JICAgICAgYml0X2NvcHkgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMiwgKGNoYXIgKikgJkZ2YWx1ZSk7Ci0JICAgICAgZmxpcF9ieXRlcyAoJkZ2YWx1ZSwgNCk7Ci0JICAgICAgKmFvZmZzZXRwICs9IDMyOwotCSAgICAgIGlmIChJTlZBTElEX0ZMT0FUICgmRnZhbHVlLCA0KSkKLQkJc3ByaW50ZiAocmVzdWx0LCAiPDxpbnZhbGlkIGZsb2F0IDB4JS44eD4+IiwgKihpbnQgKikgJkZ2YWx1ZSk7Ci0JICAgICAgZWxzZSAvKiBhc3N1bWUgaG9zdCBoYXMgaWVlZSBmbG9hdCAqLwotCQlzcHJpbnRmIChyZXN1bHQsICIkJWciLCBGdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlICdMJzoKLQkgICAgICBiaXRfY29weSAoYnVmZmVyLCAqYW9mZnNldHAsIDY0LCAoY2hhciAqKSAmTHZhbHVlKTsKLQkgICAgICBmbGlwX2J5dGVzICgmTHZhbHVlLCA4KTsKLQkgICAgICAqYW9mZnNldHAgKz0gNjQ7Ci0JICAgICAgaWYgKElOVkFMSURfRkxPQVQgKCZMdmFsdWUsIDgpKQotCQlzcHJpbnRmIChyZXN1bHQsICI8PGludmFsaWQgbG9uZyAweCUuOHglLjh4Pj4iLAotCQkJICooKChpbnQgKikgJkx2YWx1ZSkgKyAxKSwgKihpbnQgKikgJkx2YWx1ZSk7Ci0JICAgICAgZWxzZSAvKiBhc3N1bWUgaG9zdCBoYXMgaWVlZSBmbG9hdCAqLwotCQlzcHJpbnRmIChyZXN1bHQsICIkJWciLCBMdmFsdWUpOwotCSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBicmVhazsKLQljYXNlIDB4MTU6Ci0JICAvKiBBYnNvbHV0ZSBAZGlzcCAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIkB8JWR8IiwgZGlzcDEpOwotCSAgYnJlYWs7Ci0JY2FzZSAweDE2OgotCSAgLyogRXh0ZXJuYWwgRVhUKGRpc3AxKSArIGRpc3AyIChNb2QgdGFibGUgc3R1ZmYpICovCi0JICBkaXNwMSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotCSAgZGlzcDIgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIkVYVCglZCkgKyAlZCIsIGRpc3AxLCBkaXNwMik7Ci0JICBicmVhazsKLQljYXNlIDB4MTc6Ci0JICAvKiBUb3Agb2Ygc3RhY2sgdG9zICovCi0JICBzcHJpbnRmIChyZXN1bHQsICJ0b3MiKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxODoKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKEZQKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKGZwKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxOToKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFNQKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHNwKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxYToKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFNCKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgIHNwcmludGYgKHJlc3VsdCwgIiVkKHNiKSIsIGRpc3AxKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgxYjoKLQkgIC8qIE1lbW9yeSBzcGFjZSBkaXNwKFBDKSAqLwotCSAgZGlzcDEgPSBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKTsKLQkgICpyZXN1bHQrKyA9IE5FWFRfSVNfQUREUjsKLQkgIHNwcmludGZfdm1hIChyZXN1bHQsIGFkZHIgKyBkaXNwMSk7Ci0JICByZXN1bHQgKz0gc3RybGVuIChyZXN1bHQpOwotCSAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotCSAgKnJlc3VsdCA9ICdcMCc7Ci0JICBicmVhazsKLQljYXNlIDB4MWM6Ci0JY2FzZSAweDFkOgotCWNhc2UgMHgxZToKLQljYXNlIDB4MWY6Ci0JICAvKiBTY2FsZWQgaW5kZXggYmFzZW1vZGVbUjAgLS0gUjc6QixXLEQsUV0gKi8KLQkgIGluZGV4ID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW5kZXhfb2Zmc2V0IC0gOCwgMyk7Ci0JICBwcmludF9pbnNuX2FyZyAoZCwgaW5kZXhfb2Zmc2V0LCBhb2Zmc2V0cCwgYnVmZmVyLCBhZGRyLAotCQkJICByZXN1bHQsIDApOwotCSAgewotCSAgICBzdGF0aWMgY29uc3QgY2hhciAqaW5kID0gImJ3ZHEiOwotCSAgICBjaGFyICpvZmY7Ci0KLQkgICAgb2ZmID0gcmVzdWx0ICsgc3RybGVuIChyZXN1bHQpOwotCSAgICBzcHJpbnRmIChvZmYsICJbciVkOiVjXSIsIGluZGV4LAotCQkgICAgIGluZFthZGRyX21vZGUgJiAzXSk7Ci0JICB9Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdIJzoKLSAgICBjYXNlICdxJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlLCA0KTsKLSAgICAgIHNwcmludGYgKHJlc3VsdCwgIiVkIiwgSXZhbHVlKTsKLSAgICAgIGlvZmZzZXQgLT0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3InOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgaW9mZnNldC0zLCAzKTsKLSAgICAgIHNwcmludGYgKHJlc3VsdCwgInIlZCIsIEl2YWx1ZSY3KTsKLSAgICAgIGlvZmZzZXQgLT0gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2QnOgotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCBnZXRfZGlzcGxhY2VtZW50IChidWZmZXIsIGFvZmZzZXRwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdiJzoKLSAgICAgIEl2YWx1ZSA9IGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApOwotICAgICAgLyoKLSAgICAgICAqIFdhcm5pbmchISAgSEFDSyBBTEVSVCEKLSAgICAgICAqIE9wZXJhbmQgdHlwZSAnYicgaXMgb25seSB1c2VkIGJ5IHRoZSBjbXB7Yix3LGR9IGFuZAotICAgICAgICogbW92bXtiLHcsZH0gaW5zdHJ1Y3Rpb25zOyB3ZSBuZWVkIHRvIGtub3cgd2hldGhlcgotICAgICAgICogaXQncyBhIGBiJyBvciBgdycgb3IgYGQnIGluc3RydWN0aW9uOyBhbmQgZm9yIGJvdGgKLSAgICAgICAqIGNtcG0gYW5kIG1vdm0gaXQncyBzdG9yZWQgYXQgdGhlIHNhbWUgcGxhY2Ugc28gd2UKLSAgICAgICAqIGp1c3QgZ3JhYiB0d28gYml0cyBvZiB0aGUgb3Bjb2RlIGFuZCBsb29rIGF0IGl0Li4uCi0gICAgICAgKiAKLSAgICAgICAqLwotICAgICAgc2l6ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC02LCAyKTsKLSAgICAgIGlmIChzaXplID09IDApCQkvKiAwMCA9PiBiICovCi0Jc2l6ZSA9IDE7Ci0gICAgICBlbHNlIGlmIChzaXplID09IDEpCS8qIDAxID0+IHcgKi8KLQlzaXplID0gMjsKLSAgICAgIGVsc2UKLQlzaXplID0gNDsJCS8qIDExID0+IGQgKi8KLQotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiJWQiLCAoSXZhbHVlIC8gc2l6ZSkgKyAxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ3AnOgotICAgICAgKnJlc3VsdCsrID0gTkVYVF9JU19BRERSOwotICAgICAgc3ByaW50Zl92bWEgKHJlc3VsdCwgYWRkciArIGdldF9kaXNwbGFjZW1lbnQgKGJ1ZmZlciwgYW9mZnNldHApKTsKLSAgICAgIHJlc3VsdCArPSBzdHJsZW4gKHJlc3VsdCk7Ci0gICAgICAqcmVzdWx0KysgPSBORVhUX0lTX0FERFI7Ci0gICAgICAqcmVzdWx0ID0gJ1wwJzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2knOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCA4KTsKLSAgICAgICphb2Zmc2V0cCArPSA4OwotICAgICAgc3ByaW50ZiAocmVzdWx0LCAiMHgleCIsIEl2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICd1JzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gICAgICBvcHRsaXN0KEl2YWx1ZSwgb3B0X3UsIHJlc3VsdCk7Ci0gICAgICAqYW9mZnNldHAgKz0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ1UnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCAqYW9mZnNldHAsIDgpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9VLCByZXN1bHQpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdPJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgaW9mZnNldC05LCA5KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfTywgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gOTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ0MnOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOwotICAgICAgb3B0bGlzdChJdmFsdWUsIG9wdF9DLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUyc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQgLSA4LCA4KTsKLSAgICAgIG9wdGxpc3QoSXZhbHVlLCBvcHRfUywgcmVzdWx0KTsKLSAgICAgIGlvZmZzZXQgLT0gODsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ00nOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QoYnVmZmVyLCBpb2Zmc2V0LTQsIDQpOwotICAgICAgbGlzdF9zZWFyY2goSXZhbHVlLCAwID8gbGlzdF9NMDMyIDogbGlzdF9NNTMyLCByZXN1bHQpOwotICAgICAgaW9mZnNldCAtPSA0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnUCc6Ci0gICAgICBJdmFsdWUgPSBiaXRfZXh0cmFjdChidWZmZXIsIGlvZmZzZXQtNCwgNCk7Ci0gICAgICBsaXN0X3NlYXJjaChJdmFsdWUsIDAgPyBsaXN0X1AwMzIgOiBsaXN0X1A1MzIsIHJlc3VsdCk7Ci0gICAgICBpb2Zmc2V0IC09IDQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdnJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCAzKTsKLSAgICAgIHNwcmludGYocmVzdWx0LCAiJWQiLCBJdmFsdWUpOwotICAgICAgKmFvZmZzZXRwICs9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdHJzoKLSAgICAgIEl2YWx1ZSA9IGJpdF9leHRyYWN0KGJ1ZmZlciwgKmFvZmZzZXRwLCA1KTsKLSAgICAgIHNwcmludGYocmVzdWx0LCAiJWQiLCBJdmFsdWUgKyAxKTsKLSAgICAgICphb2Zmc2V0cCArPSA1OwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gaW9mZnNldDsKLX0KLQotc3RhdGljIGludAotZ2V0X2Rpc3BsYWNlbWVudCAoYnVmZmVyLCBhb2Zmc2V0cCkKLSAgICAgY2hhciAqYnVmZmVyOwotICAgICBpbnQgKmFvZmZzZXRwOwotewotICBpbnQgSXZhbHVlOwotICBzaG9ydCBJdmFsdWUyOwotCi0gIEl2YWx1ZSA9IGJpdF9leHRyYWN0IChidWZmZXIsICphb2Zmc2V0cCwgOCk7Ci0gIHN3aXRjaCAoSXZhbHVlICYgMHhjMCkKLSAgICB7Ci0gICAgY2FzZSAweDAwOgotICAgIGNhc2UgMHg0MDoKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDcpOwotICAgICAgKmFvZmZzZXRwICs9IDg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODA6Ci0gICAgICBJdmFsdWUyID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAxNik7Ci0gICAgICBmbGlwX2J5dGVzICgmSXZhbHVlMiwgMik7Ci0gICAgICBJdmFsdWUgPSBzaWduX2V4dGVuZCAoSXZhbHVlMiwgMTQpOwotICAgICAgKmFvZmZzZXRwICs9IDE2OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweGMwOgotICAgICAgSXZhbHVlID0gYml0X2V4dHJhY3QgKGJ1ZmZlciwgKmFvZmZzZXRwLCAzMik7Ci0gICAgICBmbGlwX2J5dGVzICgmSXZhbHVlLCA0KTsKLSAgICAgIEl2YWx1ZSA9IHNpZ25fZXh0ZW5kIChJdmFsdWUsIDMwKTsKLSAgICAgICphb2Zmc2V0cCArPSAzMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgcmV0dXJuIEl2YWx1ZTsKLX0KLQwKLQotI2lmIDEgLyogYSB2ZXJzaW9uIHRoYXQgc2hvdWxkIHdvcmsgb24gbnMzMmsgZidzJmQncyBvbiBhbnkgbWFjaGluZSAqLwotc3RhdGljIGludAotaW52YWxpZF9mbG9hdCAocCwgbGVuKQotICAgICByZWdpc3RlciBjaGFyICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotewotICByZWdpc3RlciBpbnQgdmFsOwotCi0gIGlmICggbGVuID09IDQgKQotICAgIHZhbCA9IChiaXRfZXh0cmFjdF9zaW1wbGUocCwgMjMsIDgpLypleHBvbmVudCovID09IDB4ZmYKLQkgICB8fCAoYml0X2V4dHJhY3Rfc2ltcGxlKHAsIDIzLCA4KS8qZXhwb25lbnQqLyA9PSAwICYmCi0JICAgICAgIGJpdF9leHRyYWN0X3NpbXBsZShwLCAwLCAyMykvKm1hbnRpc2EqLyAhPSAwKSk7Ci0gIGVsc2UgaWYgKCBsZW4gPT0gOCApCi0gICAgdmFsID0gKGJpdF9leHRyYWN0X3NpbXBsZShwLCA1MiwgMTEpLypleHBvbmVudCovID09IDB4N2ZmCi0JICAgfHwgKGJpdF9leHRyYWN0X3NpbXBsZShwLCA1MiwgMTEpLypleHBvbmVudCovID09IDAKLQkgICAgICAgJiYgKGJpdF9leHRyYWN0X3NpbXBsZShwLCAwLCAzMikvKmxvdyBtYW50aXNhKi8gIT0gMAotCQkgICB8fCBiaXRfZXh0cmFjdF9zaW1wbGUocCwgMzIsIDIwKS8qaGlnaCBtYW50aXNhKi8gIT0gMCkpKTsKLSAgZWxzZQotICAgIHZhbCA9IDE7Ci0gIHJldHVybiAodmFsKTsKLX0KLSNlbHNlCi0KLS8qIGFzc3VtZXMgdGhlIGJ5dGVzIGhhdmUgYmVlbiBzd2FwcGVkIHRvIGxvY2FsIG9yZGVyICovCi10eXBlZGVmIHVuaW9uIHsgZG91YmxlIGQ7Ci0JCWZsb2F0IGY7Ci0JCXN0cnVjdCB7IHVuc2lnbmVkIG06MjMsIGU6OCwgOjE7fSBzZjsKLQkJc3RydWN0IHsgdW5zaWduZWQgbG07IHVuc2lnbmVkIG06MjAsIGU6MTEsIDoxO30gc2Q7Ci0JICAgICAgfSBmbG9hdF90eXBlX3U7Ci0KLXN0YXRpYyBpbnQKLWludmFsaWRfZmxvYXQgKHAsIGxlbikKLSAgICAgcmVnaXN0ZXIgZmxvYXRfdHlwZV91ICpwOwotICAgICByZWdpc3RlciBpbnQgbGVuOwotewotICByZWdpc3RlciBpbnQgdmFsOwotICBpZiAoIGxlbiA9PSBzaXplb2YgKGZsb2F0KSApCi0gICAgdmFsID0gKHAtPnNmLmUgPT0gMHhmZgotCSAgIHx8IChwLT5zZi5lID09IDAgJiYgcC0+c2YubSAhPSAwKSk7Ci0gIGVsc2UgaWYgKCBsZW4gPT0gc2l6ZW9mIChkb3VibGUpICkKLSAgICB2YWwgPSAocC0+c2QuZSA9PSAweDdmZgotCSAgIHx8IChwLT5zZC5lID09IDAgJiYgKHAtPnNkLm0gIT0gMCB8fCBwLT5zZC5sbSAhPSAwKSkpOwotICBlbHNlCi0gICAgdmFsID0gMTsKLSAgcmV0dXJuICh2YWwpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL29waW50bC5oIGIvb3Bjb2Rlcy9vcGludGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MDE2MC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL29waW50bC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyogb3BpbnRsLmggLSBvcGNvZGVzIHNwZWNpZmljIGhlYWRlciBmb3IgZ2V0dGV4dCBjb2RlLgotICAgQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi0gICBXcml0dGVuIGJ5IFRvbSBUcm9tZXkgPHRyb21leUBjeWdudXMuY29tPgotCi0gICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgb3Bjb2RlcyBsaWJyYXJ5IHVzZWQgYnkgR0FTIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi0gICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgYWxvbmcgd2l0aCBHQVM7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotICAgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICovCi0KLSNpZmRlZiBFTkFCTEVfTkxTCi0jIGluY2x1ZGUgPGxpYmludGwuaD4KLSMgZGVmaW5lIF8oU3RyaW5nKSBkZ2V0dGV4dCAoUEFDS0FHRSwgU3RyaW5nKQotIyBpZmRlZiBnZXR0ZXh0X25vb3AKLSMgIGRlZmluZSBOXyhTdHJpbmcpIGdldHRleHRfbm9vcCAoU3RyaW5nKQotIyBlbHNlCi0jICBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotIyBlbmRpZgotI2Vsc2UKLS8qIFN0dWJzIHRoYXQgZG8gc29tZXRoaW5nIGNsb3NlIGVub3VnaC4gICovCi0jIGRlZmluZSB0ZXh0ZG9tYWluKFN0cmluZykgKFN0cmluZykKLSMgZGVmaW5lIGdldHRleHQoU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgZGdldHRleHQoRG9tYWluLE1lc3NhZ2UpIChNZXNzYWdlKQotIyBkZWZpbmUgZGNnZXR0ZXh0KERvbWFpbixNZXNzYWdlLFR5cGUpIChNZXNzYWdlKQotIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLERpcmVjdG9yeSkgKERvbWFpbikKLSMgZGVmaW5lIF8oU3RyaW5nKSAoU3RyaW5nKQotIyBkZWZpbmUgTl8oU3RyaW5nKSAoU3RyaW5nKQotI2VuZGlmCmRpZmYgLS1naXQgYS9vcGNvZGVzL3BvL01ha2UtaW4gYi9vcGNvZGVzL3BvL01ha2UtaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJkYjEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wby9NYWtlLWluCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLSMgTWFrZWZpbGUgZm9yIHByb2dyYW0gc291cmNlIGRpcmVjdG9yeSBpbiBHTlUgTkxTIHV0aWxpdGllcyBwYWNrYWdlLgotIyBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+Ci0jCi0jIFRoaXMgZmlsZSBmaWxlIGJlIGNvcGllZCBhbmQgdXNlZCBmcmVlbHkgd2l0aG91dCByZXN0cmljdGlvbnMuICBJdCBjYW4KLSMgYmUgdXNlZCBpbiBwcm9qZWN0cyB3aGljaCBhcmUgbm90IGF2YWlsYWJsZSB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlCi0jIGJ1dCB3aGljaCBzdGlsbCB3YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgdGhlIEdOVSBnZXR0ZXh0IGZ1bmN0aW9uYWxpdHkuCi0jIFBsZWFzZSBub3RlIHRoYXQgdGhlIGFjdHVhbCBjb2RlIGlzICpub3QqIGZyZWVseSBhdmFpbGFibGUuCi0KLVBBQ0tBR0UgPSBAUEFDS0FHRUAKLVZFUlNJT04gPSBAVkVSU0lPTkAKLQotU0hFTEwgPSAvYmluL3NoCi1AU0VUX01BS0VACi0KLXNyY2RpciA9IEBzcmNkaXJACi10b3Bfc3JjZGlyID0gQHRvcF9zcmNkaXJACi1WUEFUSCA9IEBzcmNkaXJACi0KLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLWRhdGFkaXIgPSAkKHByZWZpeCkvQERBVEFESVJOQU1FQAotbG9jYWxlZGlyID0gJChkYXRhZGlyKS9sb2NhbGUKLWdudWxvY2FsZWRpciA9ICQocHJlZml4KS9zaGFyZS9sb2NhbGUKLWdldHRleHRzcmNkaXIgPSAkKHByZWZpeCkvc2hhcmUvZ2V0dGV4dC9wbwotc3ViZGlyID0gcG8KLQotSU5TVEFMTCA9IEBJTlNUQUxMQAotSU5TVEFMTF9EQVRBID0gQElOU1RBTExfREFUQUAKLU1LSU5TVEFMTERJUlMgPSBATUtJTlNUQUxMRElSU0AKLQotQ0MgPSBAQ0NACi1HRU5DQVQgPSBAR0VOQ0FUQAotR01TR0ZNVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAR01TR0ZNVEAKLU1TR0ZNVCA9IEBNU0dGTVRACi1YR0VUVEVYVCA9IFBBVEg9Li4vc3JjOiQkUEFUSCBAWEdFVFRFWFRACi1NU0dNRVJHRSA9IFBBVEg9Li4vc3JjOiQkUEFUSCBtc2dtZXJnZQotCi1ERUZTID0gQERFRlNACi1DRkxBR1MgPSBAQ0ZMQUdTQAotQ1BQRkxBR1MgPSBAQ1BQRkxBR1NACi0KLUlOQ0xVREVTID0gLUkuLiAtSSQodG9wX3NyY2RpcikvaW50bAotCi1DT01QSUxFID0gJChDQykgLWMgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykgJChYQ0ZMQUdTKQotCi1TT1VSQ0VTID0gY2F0LWlkLXRibC5jCi1QT0ZJTEVTID0gQFBPRklMRVNACi1HTU9GSUxFUyA9IEBHTU9GSUxFU0AKLURJU1RGSUxFUyA9IENoYW5nZUxvZyBNYWtlZmlsZS5pbi5pbiBQT1RGSUxFUy5pbiAkKFBBQ0tBR0UpLnBvdCBcCi1zdGFtcC1jYXQtaWQgJChQT0ZJTEVTKSAkKEdNT0ZJTEVTKSAkKFNPVVJDRVMpCi0KLVBPVEZJTEVTID0gXAotCi1DQVRBTE9HUyA9IEBDQVRBTE9HU0AKLUNBVE9CSkVYVCA9IEBDQVRPQkpFWFRACi1JTlNUT0JKRVhUID0gQElOU1RPQkpFWFRACi0KLS5TVUZGSVhFUzoKLS5TVUZGSVhFUzogLmMgLm8gLnBvIC5wb3ggLmdtbyAubW8gLm1zZyAuY2F0Ci0KLS5jLm86Ci0JJChDT01QSUxFKSAkPAotCi0ucG8ucG94OgotCSQoTUFLRSkgJChQQUNLQUdFKS5wb3QKLQkkKE1TR01FUkdFKSAkPCAkKHNyY2RpcikvJChQQUNLQUdFKS5wb3QgLW8gJCoucG94Ci0KLS5wby5tbzoKLQkkKE1TR0ZNVCkgLW8gJEAgJDwKLQotLnBvLmdtbzoKLQlmaWxlPSQoc3JjZGlyKS9gZWNobyAkKiB8IHNlZCAncywuKi8sLCdgLmdtbyBcCi0JICAmJiBybSAtZiAkJGZpbGUgJiYgJChHTVNHRk1UKSAtbyAkJGZpbGUgJDwKLQotLnBvLmNhdDoKLQlzZWQgLWYgLi4vaW50bC9wbzJtc2cuc2VkIDwgJDwgPiAkKi5tc2cgXAotCSAgJiYgcm0gLWYgJEAgJiYgJChHRU5DQVQpICRAICQqLm1zZwotCi0KLWFsbDogYWxsLUBVU0VfTkxTQAotCi1hbGwteWVzOiAkKENBVEFMT0dTKSBATUFJTlRAICQoUEFDS0FHRSkucG90Ci1hbGwtbm86Ci0KLSQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdDogJChQT1RGSUxFUykKLQkkKFhHRVRURVhUKSAtLWRlZmF1bHQtZG9tYWluPSQoUEFDS0FHRSkgLS1kaXJlY3Rvcnk9JCh0b3Bfc3JjZGlyKSBcCi0JICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gXAotCSAgLS1maWxlcy1mcm9tPSQoc3JjZGlyKS9QT1RGSUxFUy5pbgotCXJtIC1mICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdAotCW12ICQoUEFDS0FHRSkucG8gJChzcmNkaXIpLyQoUEFDS0FHRSkucG90Ci0KLSQoc3JjZGlyKS9jYXQtaWQtdGJsLmM6IHN0YW1wLWNhdC1pZDsgQDoKLSQoc3JjZGlyKS9zdGFtcC1jYXQtaWQ6ICQoUEFDS0FHRSkucG90Ci0Jcm0gLWYgY2F0LWlkLXRibC50bXAKLQlzZWQgLWYgLi4vaW50bC9wbzJ0Ymwuc2VkICQoc3JjZGlyKS8kKFBBQ0tBR0UpLnBvdCBcCi0JCXwgc2VkIC1lICJzL0BQQUNLQUdFIE5BTUVALyQoUEFDS0FHRSkvIiA+IGNhdC1pZC10YmwudG1wCi0JaWYgY21wIC1zIGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IHRoZW4gXAotCSAgcm0gY2F0LWlkLXRibC50bXA7IFwKLQllbHNlIFwKLQkgIGVjaG8gY2F0LWlkLXRibC5jIGNoYW5nZWQ7IFwKLQkgIHJtIC1mICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQkgIG12IGNhdC1pZC10YmwudG1wICQoc3JjZGlyKS9jYXQtaWQtdGJsLmM7IFwKLQlmaQotCWNkICQoc3JjZGlyKSAmJiBybSAtZiBzdGFtcC1jYXQtaWQgJiYgZWNobyB0aW1lc3RhbXAgPiBzdGFtcC1jYXQtaWQKLQotCi1pbnN0YWxsOiBpbnN0YWxsLWV4ZWMgaW5zdGFsbC1kYXRhCi1pbnN0YWxsLWV4ZWM6Ci1pbnN0YWxsLWluZm86Ci1pbnN0YWxsLWRhdGE6IGluc3RhbGwtZGF0YS1AVVNFX05MU0AKLWluc3RhbGwtZGF0YS1ubzogYWxsCi1pbnN0YWxsLWRhdGEteWVzOiBhbGwKLQlpZiB0ZXN0IC1yICQoTUtJTlNUQUxMRElSUyk7IHRoZW4gXAotCSAgJChNS0lOU1RBTExESVJTKSAkKGRhdGFkaXIpOyBcCi0JZWxzZSBcCi0JICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJChkYXRhZGlyKTsgXAotCWZpCi0JQGNhdGFsb2dzPSckKENBVEFMT0dTKSc7IFwKLQlmb3IgY2F0IGluICQkY2F0YWxvZ3M7IGRvIFwKLQkgIGNhdD1gYmFzZW5hbWUgJCRjYXRgOyBcCi0JICBjYXNlICIkJGNhdCIgaW4gXAotCSAgICAqLmdtbykgZGVzdGRpcj0kKGdudWxvY2FsZWRpcik7OyBcCi0JICAgICopICAgICBkZXN0ZGlyPSQobG9jYWxlZGlyKTs7IFwKLQkgIGVzYWM7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgZGlyPSQkZGVzdGRpci8kJGxhbmcvTENfTUVTU0FHRVM7IFwKLQkgIGlmIHRlc3QgLXIgJChNS0lOU1RBTExESVJTKTsgdGhlbiBcCi0JICAgICQoTUtJTlNUQUxMRElSUykgJCRkaXI7IFwKLQkgIGVsc2UgXAotCSAgICAkKHRvcF9zcmNkaXIpL21raW5zdGFsbGRpcnMgJCRkaXI7IFwKLQkgIGZpOyBcCi0JICBpZiB0ZXN0IC1yICQkY2F0OyB0aGVuIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQkY2F0ICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICAgIGVjaG8gImluc3RhbGxpbmcgJCRjYXQgYXMgJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkiOyBcCi0JICBlbHNlIFwKLQkgICAgJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGNhdCAkJGRpci8kKFBBQ0tBR0UpJChJTlNUT0JKRVhUKTsgXAotCSAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgIiQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpIjsgXAotCSAgZmk7IFwKLQkgIGlmIHRlc3QgLXIgJCRjYXQubTsgdGhlbiBcCi0JICAgICQoSU5TVEFMTF9EQVRBKSAkJGNhdC5tICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgZWNobyAiaW5zdGFsbGluZyAkJGNhdC5tIGFzICQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm0iOyBcCi0JICBlbHNlIFwKLQkgICAgaWYgdGVzdCAtciAkKHNyY2RpcikvJCRjYXQubSA7IHRoZW4gXAotCSAgICAgICQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRjYXQubSBcCi0JCSQkZGlyLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgICAgICBlY2hvICJpbnN0YWxsaW5nICQoc3JjZGlyKS8kJGNhdCBhcyIgXAotCQkgICAiJCRkaXIvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubSI7IFwKLQkgICAgZWxzZSBcCi0JICAgICAgdHJ1ZTsgXAotCSAgICBmaTsgXAotCSAgZmk7IFwKLQlkb25lCi0JaWYgdGVzdCAiJChQQUNLQUdFKSIgPSAiZ2V0dGV4dCI7IHRoZW4gXAotCSAgaWYgdGVzdCAtciAkKE1LSU5TVEFMTERJUlMpOyB0aGVuIFwKLQkgICAgJChNS0lOU1RBTExESVJTKSAkKGdldHRleHRzcmNkaXIpOyBcCi0JICBlbHNlIFwKLQkgICAgJCh0b3Bfc3JjZGlyKS9ta2luc3RhbGxkaXJzICQoZ2V0dGV4dHNyY2Rpcik7IFwKLQkgIGZpOyBcCi0JICAkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01ha2VmaWxlLmluLmluIFwKLQkJCSAgJChnZXR0ZXh0c3JjZGlyKS9NYWtlZmlsZS5pbi5pbjsgXAotCWVsc2UgXAotCSAgOiA7IFwKLQlmaQotCi0jIERlZmluZSB0aGlzIGFzIGVtcHR5IHVudGlsIEkgZm91bmQgYSB1c2VmdWwgYXBwbGljYXRpb24uCi1pbnN0YWxsY2hlY2s6Ci0KLXVuaW5zdGFsbDoKLQljYXRhbG9ncz0nJChDQVRBTE9HUyknOyBcCi0JZm9yIGNhdCBpbiAkJGNhdGFsb2dzOyBkbyBcCi0JICBjYXQ9YGJhc2VuYW1lICQkY2F0YDsgXAotCSAgbGFuZz1gZWNobyAkJGNhdCB8IHNlZCAncy9cJChDQVRPQkpFWFQpJCQvLydgOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpOyBcCi0JICBybSAtZiAkKGxvY2FsZWRpcikvJCRsYW5nL0xDX01FU1NBR0VTLyQoUEFDS0FHRSkkKElOU1RPQkpFWFQpLm07IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCk7IFwKLQkgIHJtIC1mICQoZ251bG9jYWxlZGlyKS8kJGxhbmcvTENfTUVTU0FHRVMvJChQQUNLQUdFKSQoSU5TVE9CSkVYVCkubTsgXAotCWRvbmUKLQlybSAtZiAkKGdldHRleHRzcmNkaXIpL3BvLU1ha2VmaWxlLmluLmluCi0KLWNoZWNrOiBhbGwKLQotY2F0LWlkLXRibC5vOiAuLi9pbnRsL2xpYmdldHRleHQuaAotCi1kdmkgaW5mbyB0YWdzIFRBR1MgSUQ6Ci0KLW1vc3RseWNsZWFuOgotCXJtIC1mIGNvcmUgY29yZS4qICoucG94ICQoUEFDS0FHRSkucG8gKi5vbGQucG8gY2F0LWlkLXRibC50bXAKLQlybSAtZnIgKi5vCi0KLWNsZWFuOiBtb3N0bHljbGVhbgotCi1kaXN0Y2xlYW46IGNsZWFuCi0Jcm0gLWYgTWFrZWZpbGUgTWFrZWZpbGUuaW4gUE9URklMRVMgKi5tbyAqLm1zZyAqLmNhdCAqLmNhdC5tCi0KLW1haW50YWluZXItY2xlYW46IGRpc3RjbGVhbgotCUBlY2hvICJUaGlzIGNvbW1hbmQgaXMgaW50ZW5kZWQgZm9yIG1haW50YWluZXJzIHRvIHVzZTsiCi0JQGVjaG8gIml0IGRlbGV0ZXMgZmlsZXMgdGhhdCBtYXkgcmVxdWlyZSBzcGVjaWFsIHRvb2xzIHRvIHJlYnVpbGQuIgotCXJtIC1mICQoR01PRklMRVMpCi0KLWRpc3RkaXIgPSAuLi8kKFBBQ0tBR0UpLSQoVkVSU0lPTikvJChzdWJkaXIpCi1kaXN0IGRpc3RkaXI6IHVwZGF0ZS1wbyAkKERJU1RGSUxFUykKLQlkaXN0cz0iJChESVNURklMRVMpIjsgXAotCWZvciBmaWxlIGluICQkZGlzdHM7IGRvIFwKLQkgIGxuICQoc3JjZGlyKS8kJGZpbGUgJChkaXN0ZGlyKSAyPiAvZGV2L251bGwgXAotCSAgICB8fCBjcCAtcCAkKHNyY2RpcikvJCRmaWxlICQoZGlzdGRpcik7IFwKLQlkb25lCi0KLXVwZGF0ZS1wbzogTWFrZWZpbGUKLQkkKE1BS0UpICQoUEFDS0FHRSkucG90Ci0JUEFUSD1gcHdkYC8uLi9zcmM6JCRQQVRIOyBcCi0JY2QgJChzcmNkaXIpOyBcCi0JY2F0YWxvZ3M9JyQoQ0FUQUxPR1MpJzsgXAotCWZvciBjYXQgaW4gJCRjYXRhbG9nczsgZG8gXAotCSAgY2F0PWBiYXNlbmFtZSAkJGNhdGA7IFwKLQkgIGxhbmc9YGVjaG8gJCRjYXQgfCBzZWQgJ3MvXCQoQ0FUT0JKRVhUKSQkLy8nYDsgXAotCSAgbXYgJCRsYW5nLnBvICQkbGFuZy5vbGQucG87IFwKLQkgIGVjaG8gIiQkbGFuZzoiOyBcCi0JICBpZiAkKE1TR01FUkdFKSAkJGxhbmcub2xkLnBvICQoUEFDS0FHRSkucG90IC1vICQkbGFuZy5wbzsgdGhlbiBcCi0JICAgIHJtIC1mICQkbGFuZy5vbGQucG87IFwKLQkgIGVsc2UgXAotCSAgICBlY2hvICJtc2dtZXJnZSBmb3IgJCRjYXQgZmFpbGVkISI7IFwKLQkgICAgcm0gLWYgJCRsYW5nLnBvOyBcCi0JICAgIG12ICQkbGFuZy5vbGQucG8gJCRsYW5nLnBvOyBcCi0JICBmaTsgXAotCWRvbmUKLQotUE9URklMRVM6IFBPVEZJTEVTLmluCi0JKCBpZiB0ZXN0ICd4JChzcmNkaXIpJyAhPSAneC4nOyB0aGVuIFwKLQkgICAgcG9zcmNwcmVmaXg9JyQodG9wX3NyY2RpcikvJzsgXAotCSAgZWxzZSBcCi0JICAgIHBvc3JjcHJlZml4PSIuLi8iOyBcCi0JICBmaTsgXAotCSAgcm0gLWYgJEAtdCAkQCBcCi0JICAgICYmIChzZWQgLWUgJy9eIy9kJyAtZSAnL15bIAldKiQkL2QnIFwKLQkJICAgIC1lICJzQC4qQAkkJHBvc3JjcHJlZml4JiBcXFxcQCIgPCAkKHNyY2RpcikvJEAuaW4gXAotCQl8IHNlZCAtZSAnJCRzL1xcJCQvLycpID4gJEAtdCBcCi0JICAgICYmIGNobW9kIGEtdyAkQC10IFwKLQkgICAgJiYgbXYgJEAtdCAkQCApCi0KLVBPVEZJTEVTLmluOiBATUFJTlRAIC4uL01ha2VmaWxlCi0JY2QgLi4gJiYgJChNQUtFKSBwby9QT1RGSUxFUy5pbgotCi1NYWtlZmlsZTogTWFrZS1pbiAuLi9jb25maWcuc3RhdHVzIFBPVEZJTEVTCi0JY2QgLi4gXAotCSAgJiYgQ09ORklHX0ZJTEVTPSQoc3ViZGlyKS9NYWtlZmlsZS5pbjokKHN1YmRpcikvTWFrZS1pbiBcCi0JICAgICBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgLi9jb25maWcuc3RhdHVzCi0KLSMgVGVsbCB2ZXJzaW9ucyBbMy41OSwzLjYzKSBvZiBHTlUgbWFrZSBub3QgdG8gZXhwb3J0IGFsbCB2YXJpYWJsZXMuCi0jIE90aGVyd2lzZSBhIHN5c3RlbSBsaW1pdCAoZm9yIFN5c1YgYXQgbGVhc3QpIG1heSBiZSBleGNlZWRlZC4KLS5OT0VYUE9SVDoKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vUE9URklMRVMuaW4gYi9vcGNvZGVzL3BvL1BPVEZJTEVTLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjM1OTEwLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcG8vUE9URklMRVMuaW4KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1hMjlrLWRpcy5jCi1hbHBoYS1kaXMuYwotYWxwaGEtb3BjLmMKLWFybS1kaXMuYwotYXJtLW9wYy5oCi1jZ2VuLWFzbS5jCi1jZ2VuLWRpcy5jCi1jZ2VuLW9wYy5jCi1kMTB2LWRpcy5jCi1kMTB2LW9wYy5jCi1kMzB2LWRpcy5jCi1kMzB2LW9wYy5jCi1kaXMtYnVmLmMKLWRpc2Fzc2VtYmxlLmMKLWZyMzAtYXNtLmMKLWZyMzAtZGVzYy5jCi1mcjMwLWRlc2MuaAotZnIzMC1kaXMuYwotZnIzMC1pYmxkLmMKLWZyMzAtb3BjLmMKLWZyMzAtb3BjLmgKLWg4MzAwLWRpcy5jCi1oODUwMC1kaXMuYwotaDg1MDAtb3BjLmgKLWhwcGEtZGlzLmMKLWkzODYtZGlzLmMKLWk5NjAtZGlzLmMKLW0xMDIwMC1kaXMuYwotbTEwMjAwLW9wYy5jCi1tMTAzMDAtZGlzLmMKLW0xMDMwMC1vcGMuYwotbTMyci1hc20uYwotbTMyci1kZXNjLmMKLW0zMnItZGVzYy5oCi1tMzJyLWRpcy5jCi1tMzJyLWlibGQuYwotbTMyci1vcGMuYwotbTMyci1vcGMuaAotbTMyci1vcGluc3QuYwotbTY4ay1kaXMuYwotbTY4ay1vcGMuYwotbTg4ay1kaXMuYwotbWNvcmUtZGlzLmMKLW1jb3JlLW9wYy5oCi1taXBzLWRpcy5jCi1taXBzLW9wYy5jCi1taXBzMTYtb3BjLmMKLW5zMzJrLWRpcy5jCi1wcGMtZGlzLmMKLXBwYy1vcGMuYwotc2gtZGlzLmMKLXNoLW9wYy5oCi1zcGFyYy1kaXMuYwotc3BhcmMtb3BjLmMKLXN5c2RlcC5oCi10aWMzMC1kaXMuYwotdGljODAtZGlzLmMKLXRpYzgwLW9wYy5jCi12YXgtZGlzLmMKLXc2NS1kaXMuYwotdzY1LW9wYy5oCi16OGstZGlzLmMKLXo4ay1vcGMuaAotejhrZ2VuLmMKZGlmZiAtLWdpdCBhL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QgYi9vcGNvZGVzL3BvL29wY29kZXMucG90CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UzZjBmLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvcG8vb3Bjb2Rlcy5wb3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotIyBTT01FIERFU0NSSVBUSVZFIFRJVExFLgotIyBDb3B5cmlnaHQgKEMpIFlFQVIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0jIEZJUlNUIEFVVEhPUiA8RU1BSUxAQUREUkVTUz4sIFlFQVIuCi0jCi0jLCBmdXp6eQotbXNnaWQgIiIKLW1zZ3N0ciAiIgotIlByb2plY3QtSWQtVmVyc2lvbjogUEFDS0FHRSBWRVJTSU9OXG4iCi0iUE9ULUNyZWF0aW9uLURhdGU6IDE5OTktMDQtMTggMTk6MDEtMDQwMFxuIgotIlBPLVJldmlzaW9uLURhdGU6IFlFQVItTU8tREEgSE86TUkrWk9ORVxuIgotIkxhc3QtVHJhbnNsYXRvcjogRlVMTCBOQU1FIDxFTUFJTEBBRERSRVNTPlxuIgotIkxhbmd1YWdlLVRlYW06IExBTkdVQUdFIDxMTEBsaS5vcmc+XG4iCi0iTUlNRS1WZXJzaW9uOiAxLjBcbiIKLSJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Q0hBUlNFVFxuIgotIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IEVOQ09ESU5HXG4iCi0KLSM6IGFscGhhLW9wYy5jOjMzNQotbXNnaWQgImJyYW5jaCBvcGVyYW5kIHVuYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBhbHBoYS1vcGMuYzozNTggYWxwaGEtb3BjLmM6MzgwCi1tc2dpZCAianVtcCBoaW50IHVuYWxpZ25lZCIKLW1zZ3N0ciAiIgotCi0jOiBhcm0tZGlzLmM6Mzg4Ci1tc2dpZCAiPGlsbGVnYWwgcHJlY2lzaW9uPiIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjIyNAotbXNnaWQgInVucmVjb2duaXplZCBrZXl3b3JkL3JlZ2lzdGVyIG5hbWUiCi1tc2dzdHIgIiIKLQotIzogY2dlbi1hc20uYzozMzIgZnIzMC1pYmxkLmM6MjIzIG0zMnItaWJsZC5jOjIyMwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWxkIG5vdCBiZXR3ZWVuICVsZCBhbmQgJWxkKSIKLW1zZ3N0ciAiIgotCi0jOiBjZ2VuLWFzbS5jOjM1MwotIywgYy1mb3JtYXQKLW1zZ2lkICJvcGVyYW5kIG91dCBvZiByYW5nZSAoJWx1IG5vdCBiZXR3ZWVuICVsdSBhbmQgJWx1KSIKLW1zZ3N0ciAiIgotCi0jOiBkMzB2LWRpcy5jOjMwNQotIywgYy1mb3JtYXQKLW1zZ2lkICI8dW5rbm93biByZWdpc3RlciAlZD4iCi1tc2dzdHIgIiIKLQotIy4gQ2FuJ3QgaGFwcGVuLgotIzogZGlzLWJ1Zi5jOjUwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVua25vd24gZXJyb3IgJWRcbiIKLW1zZ3N0ciAiIgotCi0jOiBkaXMtYnVmLmM6NTUKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiQWRkcmVzcyAweCV4IGlzIG91dCBvZiBib3VuZHMuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1hc20uYzozMDMgbTMyci1hc20uYzozMTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHBhcnNpbmcuXG4iCi1tc2dzdHIgIiIKLQotIy4gV2UgY291bGRuJ3QgcGFyc2UgaXQuCi0jOiBmcjMwLWFzbS5jOjM2NyBmcjMwLWFzbS5jOjQzNiBtMzJyLWFzbS5jOjM4MyBtMzJyLWFzbS5jOjQ1MgotbXNnaWQgInVucmVjb2duaXplZCBpbnN0cnVjdGlvbiIKLW1zZ3N0ciAiIgotCi0jLiBTeW50YXggY2hhciBkaWRuJ3QgbWF0Y2guICBDYW4ndCBiZSB0aGlzIGluc24uCi0jLiBGSVhNRTogd291bGQgbGlrZSB0byByZXR1cm4gc29tZXRoaW5nIGxpa2UKLSMuICJleHBlY3RlZCBjaGFyIGBjJyIKLSM6IGZyMzAtYXNtLmM6NDA0IG0zMnItYXNtLmM6NDIwCi1tc2dpZCAic3ludGF4IGVycm9yIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtYXNtLmM6NDMwIG0zMnItYXNtLmM6NDQ2Ci1tc2dpZCAianVuayBhdCBlbmQgb2YgbGluZSIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjUyMyBtMzJyLWFzbS5jOjUzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzLi4uJyIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWFzbS5jOjUyNiBtMzJyLWFzbS5jOjU0MgotIywgYy1mb3JtYXQKLW1zZ2lkICJiYWQgaW5zdHJ1Y3Rpb24gYCUuNTBzJyIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWRpcy5jOjMwMCBtMzJyLWRpcy5jOjI0NwotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgcHJpbnRpbmcgaW5zbi5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoyMTAgbTMyci1pYmxkLmM6MjEwCi0jLCBjLWZvcm1hdAotbXNnaWQgIm9wZXJhbmQgb3V0IG9mIHJhbmdlICglbHUgbm90IGJldHdlZW4gMCBhbmQgJWx1KSIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzo3NDkgbTMyci1pYmxkLmM6NjgzCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBidWlsZGluZyBpbnNuLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjk1MiBtMzJyLWlibGQuYzo4MTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGRlY29kaW5nIGluc24uXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTA5NiBtMzJyLWlibGQuYzo5MzIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIGdldHRpbmcgaW50IG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogZnIzMC1pYmxkLmM6MTIyNSBtMzJyLWlibGQuYzoxMDMwCi0jLCBjLWZvcm1hdAotbXNnaWQgIlVucmVjb2duaXplZCBmaWVsZCAlZCB3aGlsZSBnZXR0aW5nIHZtYSBvcGVyYW5kLlxuIgotbXNnc3RyICIiCi0KLSM6IGZyMzAtaWJsZC5jOjEzNTggbTMyci1pYmxkLmM6MTEzMgotIywgYy1mb3JtYXQKLW1zZ2lkICJVbnJlY29nbml6ZWQgZmllbGQgJWQgd2hpbGUgc2V0dGluZyBpbnQgb3BlcmFuZC5cbiIKLW1zZ3N0ciAiIgotCi0jOiBmcjMwLWlibGQuYzoxNDg0IG0zMnItaWJsZC5jOjEyMjcKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiVW5yZWNvZ25pemVkIGZpZWxkICVkIHdoaWxlIHNldHRpbmcgdm1hIG9wZXJhbmQuXG4iCi1tc2dzdHIgIiIKLQotIzogaDgzMDAtZGlzLmM6NDA0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIkhtbW1tICV4IgotbXNnc3RyICIiCi0KLSM6IGg4MzAwLWRpcy5jOjQxNgotIywgYy1mb3JtYXQKLW1zZ2lkICJEb24ndCB1bmRlcnN0YW5kICV4IFxuIgotbXNnc3RyICIiCi0KLSM6IGg4NTAwLWRpcy5jOjEzOQotIywgYy1mb3JtYXQKLW1zZ2lkICJjYW4ndCBjb3BlIHdpdGggaW5zZXJ0ICVkXG4iCi1tc2dzdHIgIiIKLQotIy4gQ291bGRuJ3QgdW5kZXJzdGFuZCBhbnl0aGluZwotIzogaDg1MDAtZGlzLmM6MzQ0Ci0jLCBjLWZvcm1hdAotbXNnaWQgIiUwMnhcdFx0KnVua25vd24qIgotbXNnc3RyICIiCi0KLSM6IG0xMDIwMC1kaXMuYzoxOTkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDJ4IgotbXNnc3RyICIiCi0KLSM6IG0xMDIwMC1kaXMuYzozMzkKLSMsIGMtZm9ybWF0Ci1tc2dpZCAidW5rbm93blx0MHglMDRseCIKLW1zZ3N0ciAiIgotCi0jOiBtMTAzMDAtZGlzLmM6NzA2Ci0jLCBjLWZvcm1hdAotbXNnaWQgInVua25vd25cdDB4JTA0eCIKLW1zZ3N0ciAiIgotCi0jOiBtNjhrLWRpcy5jOjQxMAotIywgYy1mb3JtYXQKLW1zZ2lkICI8aW50ZXJuYWwgZXJyb3IgaW4gb3Bjb2RlIHRhYmxlOiAlcyAlcz5cbiIKLW1zZ3N0ciAiIgotCi0jOiBtNjhrLWRpcy5jOjk2NwotIywgYy1mb3JtYXQKLW1zZ2lkICI8ZnVuY3Rpb24gY29kZSAlZD4iCi1tc2dzdHIgIiIKLQotIzogbTg4ay1kaXMuYzoyNzMKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiIyA8ZGlzIGVycm9yOiAlMDh4PiIKLW1zZ3N0ciAiIgotCi0jOiBtaXBzLWRpcy5jOjM3MwotIywgYy1mb3JtYXQKLW1zZ2lkICIjIGludGVybmFsIGVycm9yLCB1bmRlZmluZWQgbW9kaWZpZXIoJWMpIgotbXNnc3RyICIiCi0KLSMuIEkgYW5kIFogYXJlIG91dHB1dCBvcGVyYW5kcyBhbmQgY2FuYHQgYmUgaW1tZWRpYXRlCi0jLiAqIEEgaXMgYW4gYWRkcmVzcyBhbmQgd2UgY2FuYHQgaGF2ZSB0aGUgYWRkcmVzcyBvZgotIy4gKiBhbiBpbW1lZGlhdGUgZWl0aGVyLiBXZSBkb24ndCBrbm93IGhvdyBtdWNoIHRvIGluY3JlYXNlCi0jLiAqIGFvZmZzZXRwIGJ5IHNpbmNlIHdoYXRldmVyIGdlbmVyYXRlZCB0aGlzIGlzIGJyb2tlbgotIy4gKiBhbnl3YXkhCi0jLgotIzogbnMzMmstZGlzLmM6NjE4Ci1tc2dpZCAiJDx1bmRlZmluZWQ+IgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo1ODYgcHBjLW9wYy5jOjYxNwotbXNnaWQgImludmFsaWQgY29uZGl0aW9uYWwgb3B0aW9uIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo2MTkKLW1zZ2lkICJhdHRlbXB0IHRvIHNldCB5IGJpdCB3aGVuIHVzaW5nICsgb3IgLSBtb2RpZmllciIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6Njc0Ci1tc2dpZCAiaWdub3JpbmcgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBpbiBicmFuY2ggb2Zmc2V0IgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo3MDkgcHBjLW9wYy5jOjc0NgotbXNnaWQgImlsbGVnYWwgYml0bWFzayIKLW1zZ3N0ciAiIgotCi0jOiBwcGMtb3BjLmM6ODE1Ci1tc2dpZCAidmFsdWUgb3V0IG9mIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo4ODkKLW1zZ2lkICJpbmRleCByZWdpc3RlciBpbiBsb2FkIHJhbmdlIgotbXNnc3RyICIiCi0KLSM6IHBwYy1vcGMuYzo5MDQKLW1zZ2lkICJpbnZhbGlkIHJlZ2lzdGVyIG9wZXJhbmQgd2hlbiB1cGRhdGluZyIKLW1zZ3N0ciAiIgotCi0jLiBNYXJrIGFzIG5vbi12YWxpZCBpbnN0cnVjdGlvbgotIzogc3BhcmMtZGlzLmM6NzM5Ci1tc2dpZCAidW5rbm93biIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4MTEKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6ICBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiwgJSMuOGx4LCAlIy44bHhcbiIKLW1zZ3N0ciAiIgotCi0jOiBzcGFyYy1kaXMuYzo4MjIKLSMsIGMtZm9ybWF0Ci1tc2dpZCAiSW50ZXJuYWwgZXJyb3I6IGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIgotbXNnc3RyICIiCi0KLSM6IHNwYXJjLWRpcy5jOjg3MQotIywgYy1mb3JtYXQKLW1zZ2lkICJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIgPT0gXCIlc1wiXG4iCi1tc2dzdHIgIiIKZGlmZiAtLWdpdCBhL29wY29kZXMvcHBjLWRpcy5jIGIvb3Bjb2Rlcy9wcGMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzE2ZWEuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wcGMtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyogcHBjLWRpcy5jIC0tIERpc2Fzc2VtYmxlIFBvd2VyUEMgaW5zdHJ1Y3Rpb25zCi0gICBDb3B5cmlnaHQgMTk5NCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgSWFuIExhbmNlIFRheWxvciwgQ3lnbnVzIFN1cHBvcnQKLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3BwYy5oIgotCi0vKiBUaGlzIGZpbGUgcHJvdmlkZXMgc2V2ZXJhbCBkaXNhc3NlbWJsZXIgZnVuY3Rpb25zLCBhbGwgb2Ygd2hpY2ggdXNlCi0gICB0aGUgZGlzYXNzZW1ibGVyIGludGVyZmFjZSBkZWZpbmVkIGluIGRpcy1hc20uaC4gIFNldmVyYWwgZnVuY3Rpb25zCi0gICBhcmUgcHJvdmlkZWQgYmVjYXVzZSB0aGlzIGZpbGUgaGFuZGxlcyBkaXNhc3NlbWJseSBmb3IgdGhlIFBvd2VyUEMKLSAgIGluIGJvdGggYmlnIGFuZCBsaXR0bGUgZW5kaWFuIG1vZGUgYW5kIGFsc28gZm9yIHRoZSBQT1dFUiAoUlMvNjAwMCkKLSAgIGNoaXAuICAqLwotCi1zdGF0aWMgaW50IHByaW50X2luc25fcG93ZXJwYyBQQVJBTVMgKChiZmRfdm1hLCBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLAotCQkJCSAgICAgICBpbnQgYmlnZW5kaWFuLCBpbnQgZGlhbGVjdCkpOwotCi0vKiBQcmludCBhIGJpZyBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gIEZvciBjb252ZW5pZW5jZSwgYWxzbwotICAgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEuICAqLwotCi1pbnQKLXByaW50X2luc25fYmlnX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsCi0JCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEpOwotfQotCi0vKiBQcmludCBhIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBpbnN0cnVjdGlvbi4gIEZvciBjb252ZW5pZW5jZSwgYWxzbwotICAgZGlzYXNzZW1ibGUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnRlZCBieSB0aGUgTW90b3JvbGEgUG93ZXJQQyA2MDEuICAqLwotCi1pbnQKLXByaW50X2luc25fbGl0dGxlX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDAsCi0JCQkgICAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82MDEpOwotfQotCi0vKiBQcmludCBhIFBPV0VSIChSUy82MDAwKSBpbnN0cnVjdGlvbi4gICovCi0KLWludAotcHJpbnRfaW5zbl9yczYwMDAgKG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIDEsIFBQQ19PUENPREVfUE9XRVIpOwotfQotCi0vKiBQcmludCBhIFBvd2VyUEMgb3IgUE9XRVIgaW5zdHJ1Y3Rpb24uICAqLwotCi1zdGF0aWMgaW50Ci1wcmludF9pbnNuX3Bvd2VycGMgKG1lbWFkZHIsIGluZm8sIGJpZ2VuZGlhbiwgZGlhbGVjdCkKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IGJpZ2VuZGlhbjsKLSAgICAgaW50IGRpYWxlY3Q7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgKm9wY29kZTsKLSAgY29uc3Qgc3RydWN0IHBvd2VycGNfb3Bjb2RlICpvcGNvZGVfZW5kOwotICB1bnNpZ25lZCBsb25nIG9wOwotCi0gIHN0YXR1cyA9ICgqaW5mby0+cmVhZF9tZW1vcnlfZnVuYykgKG1lbWFkZHIsIGJ1ZmZlciwgNCwgaW5mbyk7Ci0gIGlmIChzdGF0dXMgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8tPm1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgaWYgKGJpZ2VuZGlhbikKLSAgICBpbnNuID0gYmZkX2dldGIzMiAoYnVmZmVyKTsKLSAgZWxzZQotICAgIGluc24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCi0gIC8qIEdldCB0aGUgbWFqb3Igb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gIG9wID0gUFBDX09QIChpbnNuKTsKLQotICAvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCBpbiB0aGUgb3Bjb2RlIHRhYmxlLiAgV2UgY291bGQgc3BlZWQgdGhpcyB1cAotICAgICBhIGJpdCBieSBkb2luZyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIG1ham9yIG9wY29kZS4gICovCi0gIG9wY29kZV9lbmQgPSBwb3dlcnBjX29wY29kZXMgKyBwb3dlcnBjX251bV9vcGNvZGVzOwotICBmb3IgKG9wY29kZSA9IHBvd2VycGNfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCi0gICAgewotICAgICAgdW5zaWduZWQgbG9uZyB0YWJsZV9vcDsKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9waW5kZXg7Ci0gICAgICBjb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kICpvcGVyYW5kOwotICAgICAgaW50IGludmFsaWQ7Ci0gICAgICBpbnQgbmVlZF9jb21tYTsKLSAgICAgIGludCBuZWVkX3BhcmVuOwotCi0gICAgICB0YWJsZV9vcCA9IFBQQ19PUCAob3Bjb2RlLT5vcGNvZGUpOwotICAgICAgaWYgKG9wIDwgdGFibGVfb3ApCi0JYnJlYWs7Ci0gICAgICBpZiAob3AgPiB0YWJsZV9vcCkKLQljb250aW51ZTsKLQotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlLT5tYXNrKSAhPSBvcGNvZGUtPm9wY29kZQotCSAgfHwgKG9wY29kZS0+ZmxhZ3MgJiBkaWFsZWN0KSA9PSAwKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBNYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgb3BlcmFuZHMuICBGaXJzdCBzZWUgaWYgYW55IG9mIHRoZW0KLQkgaGF2ZSBleHRyYWN0aW9uIGZ1bmN0aW9ucywgYW5kLCBpZiB0aGV5IGRvLCBtYWtlIHN1cmUgdGhlCi0JIGluc3RydWN0aW9uIGlzIHZhbGlkLiAgKi8KLSAgICAgIGludmFsaWQgPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCXsKLQkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7Ci0JICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkgICAgKCpvcGVyYW5kLT5leHRyYWN0KSAoaW5zbiwgJmludmFsaWQpOwotCX0KLSAgICAgIGlmIChpbnZhbGlkKQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBUaGUgaW5zdHJ1Y3Rpb24gaXMgdmFsaWQuICAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG9wY29kZS0+bmFtZSk7Ci0gICAgICBpZiAob3Bjb2RlLT5vcGVyYW5kc1swXSAhPSAwKQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXHQiKTsKLQotICAgICAgLyogTm93IGV4dHJhY3QgYW5kIHByaW50IHRoZSBvcGVyYW5kcy4gICovCi0gICAgICBuZWVkX2NvbW1hID0gMDsKLSAgICAgIG5lZWRfcGFyZW4gPSAwOwotICAgICAgZm9yIChvcGluZGV4ID0gb3Bjb2RlLT5vcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotCXsKLQkgIGxvbmcgdmFsdWU7Ci0KLQkgIG9wZXJhbmQgPSBwb3dlcnBjX29wZXJhbmRzICsgKm9waW5kZXg7Ci0KLQkgIC8qIE9wZXJhbmRzIHRoYXQgYXJlIG1hcmtlZCBGQUtFIGFyZSBzaW1wbHkgaWdub3JlZC4gIFdlCi0JICAgICBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IHRoZSBleHRyYWN0IGZ1bmN0aW9uIGNvbnNpZGVyZWQKLQkgICAgIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2YWxpZC4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfRkFLRSkgIT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIC8qIEV4dHJhY3QgdGhlIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uLiAgKi8KLQkgIGlmIChvcGVyYW5kLT5leHRyYWN0KQotCSAgICB2YWx1ZSA9ICgqb3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIChpbnQgKikgTlVMTCk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCSAgICAgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9TSUdORUQpICE9IDAKLQkJICAmJiAodmFsdWUgJiAoMSA8PCAob3BlcmFuZC0+Yml0cyAtIDEpKSkgIT0gMCkKLQkJdmFsdWUgLT0gMSA8PCBvcGVyYW5kLT5iaXRzOwotCSAgICB9Ci0KLQkgIC8qIElmIHRoZSBvcGVyYW5kIGlzIG9wdGlvbmFsLCBhbmQgdGhlIHZhbHVlIGlzIHplcm8sIGRvbid0Ci0JICAgICBwcmludCBhbnl0aGluZy4gICovCi0JICBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfT1BUSU9OQUwpICE9IDAKLQkgICAgICAmJiAob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9ORVhUKSA9PSAwCi0JICAgICAgJiYgdmFsdWUgPT0gMCkKLQkgICAgY29udGludWU7Ci0KLQkgIGlmIChuZWVkX2NvbW1hKQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIsIik7Ci0JICAgICAgbmVlZF9jb21tYSA9IDA7Ci0JICAgIH0KLQotCSAgLyogUHJpbnQgdGhlIG9wZXJhbmQgYXMgZGlyZWN0ZWQgYnkgdGhlIGZsYWdzLiAgKi8KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9HUFIpICE9IDApCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0ZQUikgIT0gMCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJmJWxkIiwgdmFsdWUpOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfUkVMQVRJVkUpICE9IDApCi0JICAgICgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIHZhbHVlLCBpbmZvKTsKLQkgIGVsc2UgaWYgKChvcGVyYW5kLT5mbGFncyAmIFBQQ19PUEVSQU5EX0FCU09MVVRFKSAhPSAwKQotCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKChiZmRfdm1hKSB2YWx1ZSAmIDB4ZmZmZmZmZmYsIGluZm8pOwotCSAgZWxzZSBpZiAoKG9wZXJhbmQtPmZsYWdzICYgUFBDX09QRVJBTkRfQ1IpID09IDAKLQkJICAgfHwgKGRpYWxlY3QgJiBQUENfT1BDT0RFX1BQQykgPT0gMCkKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlbGQiLCB2YWx1ZSk7Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAob3BlcmFuZC0+Yml0cyA9PSAzKQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgImNyJWQiLCB2YWx1ZSk7Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgc3RhdGljIGNvbnN0IGNoYXIgKmNibmFtZXNbNF0gPSB7ICJsdCIsICJndCIsICJlcSIsICJzbyIgfTsKLQkJICBpbnQgY3I7Ci0JCSAgaW50IGNjOwotCi0JCSAgY3IgPSB2YWx1ZSA+PiAyOwotCQkgIGlmIChjciAhPSAwKQotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICI0KmNyJWQiLCBjcik7Ci0JCSAgY2MgPSB2YWx1ZSAmIDM7Ci0JCSAgaWYgKGNjICE9IDApCi0JCSAgICB7Ci0JCSAgICAgIGlmIChjciAhPSAwKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIrIik7Ci0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCBjYm5hbWVzW2NjXSk7Ci0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAobmVlZF9wYXJlbikKLQkgICAgewotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKSIpOwotCSAgICAgIG5lZWRfcGFyZW4gPSAwOwotCSAgICB9Ci0KLQkgIGlmICgob3BlcmFuZC0+ZmxhZ3MgJiBQUENfT1BFUkFORF9QQVJFTlMpID09IDApCi0JICAgIG5lZWRfY29tbWEgPSAxOwotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoIik7Ci0JICAgICAgbmVlZF9wYXJlbiA9IDE7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFdlIGhhdmUgZm91bmQgYW5kIHByaW50ZWQgYW4gaW5zdHJ1Y3Rpb247IHJldHVybi4gICovCi0gICAgICByZXR1cm4gNDsKLSAgICB9Ci0KLSAgLyogV2UgY291bGQgbm90IGZpbmQgYSBtYXRjaC4gICovCi0gICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLmxvbmcgMHglbHgiLCBpbnNuKTsKLQotICByZXR1cm4gNDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvcHBjLW9wYy5jIGIvb3Bjb2Rlcy9wcGMtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MjE4ODAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9wcGMtb3BjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTI0ICswLDAgQEAKLS8qIHBwYy1vcGMuYyAtLSBQb3dlclBDIG9wY29kZSBsaXN0Ci0gICBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBXcml0dGVuIGJ5IElhbiBMYW5jZSBUYXlsb3IsIEN5Z251cyBTdXBwb3J0Ci0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscy4KLQotR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzIGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZQotdGhlbSBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0yLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgdGhleQotd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi13YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKLXRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQotU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0wMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9wcGMuaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotLyogVGhpcyBmaWxlIGhvbGRzIHRoZSBQb3dlclBDIG9wY29kZSB0YWJsZS4gIFRoZSBvcGNvZGUgdGFibGUKLSAgIGluY2x1ZGVzIGFsbW9zdCBhbGwgb2YgdGhlIGV4dGVuZGVkIGluc3RydWN0aW9uIG1uZW1vbmljcy4gIFRoaXMKLSAgIHBlcm1pdHMgdGhlIGRpc2Fzc2VtYmxlciB0byB1c2UgdGhlbSwgYW5kIHNpbXBsaWZpZXMgdGhlIGFzc2VtYmxlcgotICAgbG9naWMsIGF0IHRoZSBjb3N0IG9mIGluY3JlYXNpbmcgdGhlIHRhYmxlIHNpemUuICBUaGUgdGFibGUgaXMKLSAgIHN0cmljdGx5IGNvbnN0YW50IGRhdGEsIHNvIHRoZSBjb21waWxlciBzaG91bGQgYmUgYWJsZSB0byBwdXQgaXQgaW4KLSAgIHRoZSAudGV4dCBzZWN0aW9uLgotCi0gICBUaGlzIGZpbGUgYWxzbyBob2xkcyB0aGUgb3BlcmFuZCB0YWJsZS4gIEFsbCBrbm93bGVkZ2UgYWJvdXQKLSAgIGluc2VydGluZyBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9ucyBhbmQgdmljZS12ZXJzYSBpcyBrZXB0IGluIHRoaXMKLSAgIGZpbGUuICAqLwotDAotLyogTG9jYWwgaW5zZXJ0aW9uIGFuZCBleHRyYWN0aW9uIGZ1bmN0aW9ucy4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iYXQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iYXQgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iYmEgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9iYmEgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9iZCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JkIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmRtIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmRtIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYmRwIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYmRwIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgaW50IHZhbGlkX2JvIFBBUkFNUyAoKGxvbmcpKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9ibyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X2JvIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfYm9lIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfYm9lIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfZHMgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9kcyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQgKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X2xpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbGkgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9tYmUgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9tYmUgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9tYjYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIGxvbmcgZXh0cmFjdF9tYjYgUEFSQU1TICgodW5zaWduZWQgbG9uZywgaW50ICopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9uYiBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgbG9uZyBleHRyYWN0X25iIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfbnNpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfbnNpIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmFsIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGluc2VydF9yYW0gUEFSQU1TICgodW5zaWduZWQgbG9uZywgbG9uZywgY29uc3QgY2hhciAqKikpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5zZXJ0X3JhcyBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBsb25nLCBjb25zdCBjaGFyICoqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfcmJzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfcmJzIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfc2g2IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3Rfc2g2IFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfc3ByIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3Rfc3ByIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBpbnNlcnRfdGJyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGxvbmcsIGNvbnN0IGNoYXIgKiopKTsKLXN0YXRpYyBsb25nIGV4dHJhY3RfdGJyIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIGludCAqKSk7Ci0MCi0vKiBUaGUgb3BlcmFuZHMgdGFibGUuCi0KLSAgIFRoZSBmaWVsZHMgYXJlIGJpdHMsIHNoaWZ0LCBpbnNlcnQsIGV4dHJhY3QsIGZsYWdzLgotCi0gICBXZSB1c2VkIHRvIHB1dCBwYXJlbnMgYXJvdW5kIHRoZSB2YXJpb3VzIGFkZGl0aW9ucywgbGlrZSB0aGUgb25lCi0gICBmb3IgQkEganVzdCBiZWxvdy4gIEhvd2V2ZXIsIHRoYXQgY2F1c2VkIHRyb3VibGUgd2l0aCBmZWVibGUKLSAgIGNvbXBpbGVycyB3aXRoIGEgbGltaXQgb24gZGVwdGggb2YgYSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24sIGxpa2UKLSAgIChyZXBvcnRlZGx5KSB0aGUgY29tcGlsZXIgaW4gTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gNS4gIFNvIHdlCi0gICBvbWl0IHRoZSBwYXJlbnMsIHNpbmNlIHRoZSBtYWNyb3MgYXJlIG5ldmVyIHVzZWQgaW4gYSBjb250ZXh0IHdoZXJlCi0gICB0aGUgYWRkaXRpb24gd2lsbCBiZSBhbWJpZ3VvdXMuICAqLwotCi1jb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGVyYW5kIHBvd2VycGNfb3BlcmFuZHNbXSA9Ci17Ci0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZgotICAgICBvcGVyYW5kcy4gICovCi0jZGVmaW5lIFVOVVNFRCAwCi0gIHsgMCwgMCwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBCQSBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQkEgVU5VU0VEICsgMQotI2RlZmluZSBCQV9NQVNLICgweDFmIDw8IDE2KQotICB7IDUsIDE2LCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBCQSBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZQotICAgICBhcyB0aGUgQlQgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCQVQgQkEgKyAxCi0gIHsgNSwgMTYsIGluc2VydF9iYXQsIGV4dHJhY3RfYmF0LCBQUENfT1BFUkFORF9GQUtFIH0sCi0KLSAgLyogVGhlIEJCIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCQiBCQVQgKyAxCi0jZGVmaW5lIEJCX01BU0sgKDB4MWYgPDwgMTEpCi0gIHsgNSwgMTEsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIEJCIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lCi0gICAgIGFzIHRoZSBCQSBmaWVsZCBpbiB0aGUgc2FtZSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJCQSBCQiArIDEKLSAgeyA1LCAxMSwgaW5zZXJ0X2JiYSwgZXh0cmFjdF9iYmEsIFBQQ19PUEVSQU5EX0ZBS0UgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCi0gICAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KLSNkZWZpbmUgQkQgQkJBICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmQsIGV4dHJhY3RfYmQsIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gYWJzb2x1dGUgYWRkcmVzc2luZyBpcwotICAgICB1c2VkLiAgKi8KLSNkZWZpbmUgQkRBIEJEICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmQsIGV4dHJhY3RfYmQsIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlIC0gbW9kaWZpZXIgaXMgdXNlZC4KLSAgICAgVGhpcyBzZXRzIHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgYXBwcm9wcmlhdGVseS4gICovCi0jZGVmaW5lIEJETSBCREEgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9iZG0sIGV4dHJhY3RfYmRtLAotICAgICAgUFBDX09QRVJBTkRfUkVMQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgLSBtb2RpZmllciBpcyB1c2VkCi0gICAgIGFuZCBhYnNvbHV0ZSBhZGRyZXNzIGlzIHVzZWQuICAqLwotI2RlZmluZSBCRE1BIEJETSArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkbSwgZXh0cmFjdF9iZG0sCi0gICAgICBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG1vZGlmaWVyIGlzIHVzZWQuCi0gICAgIFRoaXMgc2V0cyB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIGFwcHJvcHJpYXRlbHkuICAqLwotI2RlZmluZSBCRFAgQkRNQSArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2JkcCwgZXh0cmFjdF9iZHAsCi0gICAgICBQUENfT1BFUkFORF9SRUxBVElWRSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBCRCBmaWVsZCBpbiBhIEIgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHRoZSArIG1vZGlmaWVyIGlzIHVzZWQKLSAgICAgYW5kIGFic29sdXRlIGFkZHJlc3NpbmcgaXMgdXNlZC4gICovCi0jZGVmaW5lIEJEUEEgQkRQICsgMQotICB7IDE2LCAwLCBpbnNlcnRfYmRwLCBleHRyYWN0X2JkcCwKLSAgICAgIFBQQ19PUEVSQU5EX0FCU09MVVRFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIEJGIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJGIEJEUEEgKyAxCi0gIHsgMywgMjMsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogQW4gb3B0aW9uYWwgQkYgZmllbGQuICBUaGlzIGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLAotICAgICBpbiB3aGljaCBhbiBvbWl0dGVkIEJGIGZpZWxkIGlzIHRha2VuIGFzIHplcm8uICAqLwotI2RlZmluZSBPQkYgQkYgKyAxCi0gIHsgMywgMjMsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIHwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKLQotICAvKiBUaGUgQkZBIGZpZWxkIGluIGFuIFggb3IgWEwgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEJGQSBPQkYgKyAxCi0gIHsgMywgMTgsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIEJJIGZpZWxkIGluIGEgQiBmb3JtIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBCSSBCRkEgKyAxCi0jZGVmaW5lIEJJX01BU0sgKDB4MWYgPDwgMTYpCi0gIHsgNSwgMTYsIDAsIDAsIFBQQ19PUEVSQU5EX0NSIH0sCi0KLSAgLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uLiAgQ2VydGFpbiB2YWx1ZXMgYXJlCi0gICAgIGlsbGVnYWwuICAqLwotI2RlZmluZSBCTyBCSSArIDEKLSNkZWZpbmUgQk9fTUFTSyAoMHgxZiA8PCAyMSkKLSAgeyA1LCAyMSwgaW5zZXJ0X2JvLCBleHRyYWN0X2JvLCAwIH0sCi0KLSAgLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgb3IgLSBtb2RpZmllciBpcwotICAgICB1c2VkLiAgVGhpcyBpcyBsaWtlIHRoZSBCTyBmaWVsZCwgYnV0IGl0IG11c3QgYmUgZXZlbi4gICovCi0jZGVmaW5lIEJPRSBCTyArIDEKLSAgeyA1LCAyMSwgaW5zZXJ0X2JvZSwgZXh0cmFjdF9ib2UsIDAgfSwKLQotICAvKiBUaGUgQlQgZmllbGQgaW4gYW4gWCBvciBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQlQgQk9FICsgMQotICB7IDUsIDIxLCAwLCAwLCBQUENfT1BFUkFORF9DUiB9LAotCi0gIC8qIFRoZSBjb25kaXRpb24gcmVnaXN0ZXIgbnVtYmVyIHBvcnRpb24gb2YgdGhlIEJJIGZpZWxkIGluIGEgQiBmb3JtCi0gICAgIG9yIFhMIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIHRoZSBleHRlbmRlZAotICAgICBjb25kaXRpb25hbCBicmFuY2ggbW5lbW9uaWNzLCB3aGljaCBzZXQgdGhlIGxvd2VyIHR3byBiaXRzIG9mIHRoZQotICAgICBCSSBmaWVsZC4gIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwuICAqLwotI2RlZmluZSBDUiBCVCArIDEKLSAgeyAzLCAxOCwgMCwgMCwgUFBDX09QRVJBTkRfQ1IgfCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAotCi0gIC8qIFRoZSBEIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBhIGRpc3BsYWNlbWVudCBvZmYKLSAgICAgYSByZWdpc3RlciwgYW5kIGltcGxpZXMgdGhhdCB0aGUgbmV4dCBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIgaW4KLSAgICAgcGFyZW50aGVzZXMuICAqLwotI2RlZmluZSBEIENSICsgMQotICB7IDE2LCAwLCAwLCAwLCBQUENfT1BFUkFORF9QQVJFTlMgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgRFMgZmllbGQgaW4gYSBEUyBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBsaWtlIEQsIGJ1dCB0aGUKLSAgICAgbG93ZXIgdHdvIGJpdHMgYXJlIGZvcmNlZCB0byB6ZXJvLiAgKi8KLSNkZWZpbmUgRFMgRCArIDEKLSAgeyAxNiwgMCwgaW5zZXJ0X2RzLCBleHRyYWN0X2RzLCBQUENfT1BFUkFORF9QQVJFTlMgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgRSBmaWVsZCBpbiBhIHdydGVlaSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEUgRFMgKyAxCi0gIHsgMSwgMTUsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgRkwxIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZMMSBFICsgMQotICB7IDQsIDEyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEZMMiBmaWVsZCBpbiBhIFBPV0VSIFNDIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGTDIgRkwxICsgMQotICB7IDMsIDIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgRkxNIGZpZWxkIGluIGFuIFhGTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRkxNIEZMMiArIDEKLSAgeyA4LCAxNywgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBGUkEgZmllbGQgaW4gYW4gWCBvciBBIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBGUkEgRkxNICsgMQotI2RlZmluZSBGUkFfTUFTSyAoMHgxZiA8PCAxNikKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfRlBSIH0sCi0KLSAgLyogVGhlIEZSQiBmaWVsZCBpbiBhbiBYIG9yIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZSQiBGUkEgKyAxCi0jZGVmaW5lIEZSQl9NQVNLICgweDFmIDw8IDExKQotICB7IDUsIDExLCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKLQotICAvKiBUaGUgRlJDIGZpZWxkIGluIGFuIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZSQyBGUkIgKyAxCi0jZGVmaW5lIEZSQ19NQVNLICgweDFmIDw8IDYpCi0gIHsgNSwgNiwgMCwgMCwgUFBDX09QRVJBTkRfRlBSIH0sCi0KLSAgLyogVGhlIEZSUyBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gb3IgdGhlIEZSVCBmaWVsZCBpbiBhIEQsIFgKLSAgICAgb3IgQSBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgRlJTIEZSQyArIDEKLSNkZWZpbmUgRlJUIEZSUwotICB7IDUsIDIxLCAwLCAwLCBQUENfT1BFUkFORF9GUFIgfSwKLQotICAvKiBUaGUgRlhNIGZpZWxkIGluIGFuIFhGWCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEZYTSBGUlMgKyAxCi0jZGVmaW5lIEZYTV9NQVNLICgweGZmIDw8IDEyKQotICB7IDgsIDEyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIEwgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEwgRlhNICsgMQotICB7IDEsIDIxLCAwLCAwLCBQUENfT1BFUkFORF9PUFRJT05BTCB9LAotCi0gIC8qIFRoZSBMRVYgZmllbGQgaW4gYSBQT1dFUiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTEVWIEwgKyAxCi0gIHsgNywgNSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBMSSBmaWVsZCBpbiBhbiBJIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCi0gICAgIGZvcmNlZCB0byB6ZXJvLiAgKi8KLSNkZWZpbmUgTEkgTEVWICsgMQotICB7IDI2LCAwLCBpbnNlcnRfbGksIGV4dHJhY3RfbGksIFBQQ19PUEVSQU5EX1JFTEFUSVZFIHwgUFBDX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogVGhlIExJIGZpZWxkIGluIGFuIEkgZm9ybSBpbnN0cnVjdGlvbiB3aGVuIHVzZWQgYXMgYW4gYWJzb2x1dGUKLSAgICAgYWRkcmVzcy4gICovCi0jZGVmaW5lIExJQSBMSSArIDEKLSAgeyAyNiwgMCwgaW5zZXJ0X2xpLCBleHRyYWN0X2xpLCBQUENfT1BFUkFORF9BQlNPTFVURSB8IFBQQ19PUEVSQU5EX1NJR05FRCB9LAotCi0gIC8qIFRoZSBNQiBmaWVsZCBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNQiBMSUEgKyAxCi0jZGVmaW5lIE1CX01BU0sgKDB4MWYgPDwgNikKLSAgeyA1LCA2LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIE1FIGZpZWxkIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1FIE1CICsgMQotI2RlZmluZSBNRV9NQVNLICgweDFmIDw8IDEpCi0gIHsgNSwgMSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBNQiBhbmQgTUUgZmllbGRzIGluIGFuIE0gZm9ybSBpbnN0cnVjdGlvbiBleHByZXNzZWQgYSBzaW5nbGUKLSAgICAgb3BlcmFuZCB3aGljaCBpcyBhIGJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBiaXRzIHRvIHNlbGVjdC4gIFRoaXMKLSAgICAgaXMgYSB0d28gb3BlcmFuZCBmb3JtIHVzaW5nIFBQQ19PUEVSQU5EX05FWFQuICBTZWUgdGhlCi0gICAgIGRlc2NyaXB0aW9uIGluIG9wY29kZS9wcGMuaCBmb3Igd2hhdCB0aGlzIG1lYW5zLiAgKi8KLSNkZWZpbmUgTUJFIE1FICsgMQotICB7IDUsIDYsIDAsIDAsIFBQQ19PUEVSQU5EX09QVElPTkFMIHwgUFBDX09QRVJBTkRfTkVYVCB9LAotICB7IDMyLCAwLCBpbnNlcnRfbWJlLCBleHRyYWN0X21iZSwgMCB9LAotCi0gIC8qIFRoZSBNQiBvciBNRSBmaWVsZCBpbiBhbiBNRCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoCi0gICAgIGJpdCBpcyB3cmFwcGVkIHRvIHRoZSBsb3cgZW5kLiAgKi8KLSNkZWZpbmUgTUI2IE1CRSArIDIKLSNkZWZpbmUgTUU2IE1CNgotI2RlZmluZSBNQjZfTUFTSyAoMHgzZiA8PCA1KQotICB7IDYsIDUsIGluc2VydF9tYjYsIGV4dHJhY3RfbWI2LCAwIH0sCi0KLSAgLyogVGhlIE5CIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSB2YWx1ZSAzMiBpcyBzdG9yZWQgYXMKLSAgICAgMC4gICovCi0jZGVmaW5lIE5CIE1CNiArIDEKLSAgeyA2LCAxMSwgaW5zZXJ0X25iLCBleHRyYWN0X25iLCAwIH0sCi0KLSAgLyogVGhlIE5TSSBmaWVsZCBpbiBhIEQgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlCi0gICAgIFNJIGZpZWxkLCBvbmx5IG5lZ2F0ZWQuICAqLwotI2RlZmluZSBOU0kgTkIgKyAxCi0gIHsgMTYsIDAsIGluc2VydF9uc2ksIGV4dHJhY3RfbnNpLAotICAgICAgUFBDX09QRVJBTkRfTkVHQVRJVkUgfCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgUkEgZmllbGQgaW4gYW4gRCwgRFMsIFgsIFhPLCBNLCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJBIE5TSSArIDEKLSNkZWZpbmUgUkFfTUFTSyAoMHgxZiA8PCAxNikKLSAgeyA1LCAxNiwgMCwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKLSAgICAgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEgZmllbGQgbWF5IG5vdCBiZSB6ZXJvIGFuZCBtYXkgbm90Ci0gICAgIGVxdWFsIHRoZSBSVCBmaWVsZC4gICovCi0jZGVmaW5lIFJBTCBSQSArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X3JhbCwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJBIGZpZWxkIGluIGFuIGxtdyBpbnN0cnVjdGlvbiwgd2hpY2ggaGFzIHNwZWNpYWwgdmFsdWUKLSAgICAgcmVzdHJpY3Rpb25zLiAgKi8KLSNkZWZpbmUgUkFNIFJBTCArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X3JhbSwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJBIGZpZWxkIGluIGEgRCBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgYW4gdXBkYXRpbmcKLSAgICAgc3RvcmUgb3IgYW4gdXBkYXRpbmcgZmxvYXRpbmcgcG9pbnQgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEKLSAgICAgZmllbGQgbWF5IG5vdCBiZSB6ZXJvLiAgKi8KLSNkZWZpbmUgUkFTIFJBTSArIDEKLSAgeyA1LCAxNiwgaW5zZXJ0X3JhcywgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIGluIGFuIFgsIFhPLCBNLCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFJCIFJBUyArIDEKLSNkZWZpbmUgUkJfTUFTSyAoMHgxZiA8PCAxMSkKLSAgeyA1LCAxMSwgMCwgMCwgUFBDX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogVGhlIFJCIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbiB3aGVuIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMKLSAgICAgdGhlIFJTIGZpZWxkIGluIHRoZSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgZXh0ZW5kZWQKLSAgICAgbW5lbW9uaWNzIGxpa2UgbXIuICAqLwotI2RlZmluZSBSQlMgUkIgKyAxCi0gIHsgNSwgMSwgaW5zZXJ0X3JicywgZXh0cmFjdF9yYnMsIFBQQ19PUEVSQU5EX0ZBS0UgfSwKLQotICAvKiBUaGUgUlMgZmllbGQgaW4gYSBELCBEUywgWCwgWEZYLCBYUywgTSwgTUQgb3IgTURTIGZvcm0KLSAgICAgaW5zdHJ1Y3Rpb24gb3IgdGhlIFJUIGZpZWxkIGluIGEgRCwgRFMsIFgsIFhGWCBvciBYTyBmb3JtCi0gICAgIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgUlMgUkJTICsgMQotI2RlZmluZSBSVCBSUwotI2RlZmluZSBSVF9NQVNLICgweDFmIDw8IDIxKQotICB7IDUsIDIxLCAwLCAwLCBQUENfT1BFUkFORF9HUFIgfSwKLQotICAvKiBUaGUgU0ggZmllbGQgaW4gYW4gWCBvciBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTSCBSUyArIDEKLSNkZWZpbmUgU0hfTUFTSyAoMHgxZiA8PCAxMSkKLSAgeyA1LCAxMSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTSCBmaWVsZCBpbiBhbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBzcGxpdC4gICovCi0jZGVmaW5lIFNINiBTSCArIDEKLSNkZWZpbmUgU0g2X01BU0sgKCgweDFmIDw8IDExKSB8ICgxIDw8IDEpKQotICB7IDYsIDEsIGluc2VydF9zaDYsIGV4dHJhY3Rfc2g2LCAwIH0sCi0KLSAgLyogVGhlIFNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0kgU0g2ICsgMQotICB7IDE2LCAwLCAwLCAwLCBQUENfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBUaGUgU0kgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiB3ZSBhY2NlcHQgYSB3aWRlIHJhbmdlCi0gICAgIG9mIHBvc2l0aXZlIHZhbHVlcy4gICovCi0jZGVmaW5lIFNJU0lHTk9QVCBTSSArIDEKLSAgeyAxNiwgMCwgMCwgMCwgUFBDX09QRVJBTkRfU0lHTkVEIHwgUFBDX09QRVJBTkRfU0lHTk9QVCB9LAotCi0gIC8qIFRoZSBTUFIgZmllbGQgaW4gYW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGlzIGlzIGZsaXBwZWQtLXRoZQotICAgICBsb3dlciA1IGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgNSBhbmQgdmljZS0gdmVyc2EuICAqLwotI2RlZmluZSBTUFIgU0lTSUdOT1BUICsgMQotI2RlZmluZSBTUFJfTUFTSyAoMHgzZmYgPDwgMTEpCi0gIHsgMTAsIDExLCBpbnNlcnRfc3ByLCBleHRyYWN0X3NwciwgMCB9LAotCi0gIC8qIFRoZSBCQVQgaW5kZXggbnVtYmVyIGluIGFuIFhGWCBmb3JtIG1bZnRdaWJhdFtsdV0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTUFJCQVQgU1BSICsgMQotI2RlZmluZSBTUFJCQVRfTUFTSyAoMHgzIDw8IDE3KQotICB7IDIsIDE3LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFNQUkcgcmVnaXN0ZXIgbnVtYmVyIGluIGFuIFhGWCBmb3JtIG1bZnRdc3ByZyBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNQUkcgU1BSQkFUICsgMQotI2RlZmluZSBTUFJHX01BU0sgKDB4MyA8PCAxNikKLSAgeyAyLCAxNiwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBTUiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBTUiBTUFJHICsgMQotICB7IDQsIDE2LCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFNWIGZpZWxkIGluIGEgUE9XRVIgU0MgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFNWIFNSICsgMQotICB7IDE0LCAyLCAwLCAwLCAwIH0sCi0KLSAgLyogVGhlIFRCUiBmaWVsZCBpbiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSB0aGUgU1BSCi0gICAgIGZpZWxkLCBidXQgaXQgaXMgb3B0aW9uYWwuICAqLwotI2RlZmluZSBUQlIgU1YgKyAxCi0gIHsgMTAsIDExLCBpbnNlcnRfdGJyLCBleHRyYWN0X3RiciwgUFBDX09QRVJBTkRfT1BUSU9OQUwgfSwKLQotICAvKiBUaGUgVE8gZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFRPIFRCUiArIDEKLSNkZWZpbmUgVE9fTUFTSyAoMHgxZiA8PCAyMSkKLSAgeyA1LCAyMSwgMCwgMCwgMCB9LAotCi0gIC8qIFRoZSBVIGZpZWxkIGluIGFuIFggZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFUgVE8gKyAxCi0gIHsgNCwgMTIsIDAsIDAsIDAgfSwKLQotICAvKiBUaGUgVUkgZmllbGQgaW4gYSBEIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBVSSBVICsgMQotICB7IDE2LCAwLCAwLCAwLCAwIH0sCi19OwotCi0vKiBUaGUgZnVuY3Rpb25zIHVzZWQgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IGNvbXBsaWNhdGVkIG9wZXJhbmRzLiAgKi8KLQotLyogVGhlIEJBIGZpZWxkIGluIGFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICB0aGUgQlQgZmllbGQgaW4gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuCi0gICBUaGUgaW5zZXJ0aW9uIGZ1bmN0aW9uIGp1c3QgY29waWVzIHRoZSBCVCBmaWVsZCBpbnRvIHRoZSBCQSBmaWVsZCwKLSAgIGFuZCB0aGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBqdXN0IGNoZWNrcyB0aGF0IHRoZSBmaWVsZHMgYXJlIHRoZQotICAgc2FtZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iYXQgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDE2KTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmF0IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDE2KSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBCQiBmaWVsZCBpbiBhbiBYTCBmb3JtIGluc3RydWN0aW9uIHdoZW4gaXQgbXVzdCBiZSB0aGUgc2FtZSBhcwotICAgdGhlIEJBIGZpZWxkIGluIHRoZSBzYW1lIGluc3RydWN0aW9uLiAgVGhpcyBvcGVyYW5kIGlzIG1hcmtlZCBGQUtFLgotICAgVGhlIGluc2VydGlvbiBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQkEgZmllbGQgaW50byB0aGUgQkIgZmllbGQsCi0gICBhbmQgdGhlIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUKLSAgIHNhbWUuICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmJhIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIHJldHVybiBpbnNuIHwgKCgoaW5zbiA+PiAxNikgJiAweDFmKSA8PCAxMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JiYSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuID4+IDE2KSAmIDB4MWYpICE9ICgoaW5zbiA+PiAxMSkgJiAweDFmKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiAwOwotfQotCi0vKiBUaGUgQkQgZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCi0gICBmb3JjZWQgdG8gemVyby4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iZCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmQgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlIC0gbW9kaWZpZXIgaXMgdXNlZC4KLSAgIFRoaXMgbW9kaWZpZXIgbWVhbnMgdGhhdCB0aGUgYnJhbmNoIGlzIG5vdCBleHBlY3RlZCB0byBiZSB0YWtlbi4KLSAgIFdlIG11c3Qgc2V0IHRoZSB5IGJpdCBvZiB0aGUgQk8gZmllbGQgdG8gMSBpZiB0aGUgb2Zmc2V0IGlzCi0gICBuZWdhdGl2ZS4gIFdoZW4gZXh0cmFjdGluZywgd2UgcmVxdWlyZSB0aGF0IHRoZSB5IGJpdCBiZSAxIGFuZCB0aGF0Ci0gICB0aGUgb2Zmc2V0IGJlIHBvc2l0aXZlLCBzaW5jZSBpZiB0aGUgeSBiaXQgaXMgMCB3ZSBqdXN0IHdhbnQgdG8KLSAgIHByaW50IHRoZSBub3JtYWwgZm9ybSBvZiB0aGUgaW5zdHJ1Y3Rpb24uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfYmRtIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICgodmFsdWUgJiAweDgwMDApICE9IDApCi0gICAgaW5zbiB8PSAxIDw8IDIxOwotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4ZmZmYyk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X2JkbSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgKChpbnNuICYgKDEgPDwgMjEpKSA9PSAwCi0JICB8fCAoaW5zbiAmICgxIDw8IDE1KSkgPT0gMCkpCi0gICAgKmludmFsaWQgPSAxOwotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHhmZmZjKSAtIDB4MTAwMDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gaW5zbiAmIDB4ZmZmYzsKLX0KLQotLyogVGhlIEJEIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgbW9kaWZpZXIgaXMgdXNlZC4KLSAgIFRoaXMgaXMgbGlrZSBCRE0sIGFib3ZlLCBleGNlcHQgdGhhdCB0aGUgYnJhbmNoIGlzIGV4cGVjdGVkIHRvIGJlCi0gICB0YWtlbi4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9iZHAgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKCh2YWx1ZSAmIDB4ODAwMCkgPT0gMCkKLSAgICBpbnNuIHw9IDEgPDwgMjE7Ci0gIHJldHVybiBpbnNuIHwgKHZhbHVlICYgMHhmZmZjKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYmRwIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gJiAoMSA8PCAyMSkpID09IDAKLQkgIHx8IChpbnNuICYgKDEgPDwgMTUpKSAhPSAwKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXR1cm4gKGluc24gJiAweGZmZmMpIC0gMHgxMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHhmZmZjOwotfQotCi0vKiBDaGVjayBmb3IgbGVnYWwgdmFsdWVzIG9mIGEgQk8gZmllbGQuICAqLwotCi1zdGF0aWMgaW50Ci12YWxpZF9ibyAodmFsdWUpCi0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIC8qIENlcnRhaW4gZW5jb2RpbmdzIGhhdmUgYml0cyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSB6ZXJvLiAgVGhlc2UKLSAgICAgYXJlICh6IG11c3QgYmUgemVybywgeSBtYXkgYmUgYW55dGhpbmcpOgotICAgICAgICAgMDAxenkKLQkgMDExenkKLQkgMXowMHkKLQkgMXowMXkKLQkgMXoxenoKLSAgICAgKi8KLSAgc3dpdGNoICh2YWx1ZSAmIDB4MTQpCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgY2FzZSAwOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSAweDQ6Ci0gICAgICByZXR1cm4gKHZhbHVlICYgMHgyKSA9PSAwOwotICAgIGNhc2UgMHgxMDoKLSAgICAgIHJldHVybiAodmFsdWUgJiAweDgpID09IDA7Ci0gICAgY2FzZSAweDE0OgotICAgICAgcmV0dXJuIHZhbHVlID09IDB4MTQ7Ci0gICAgfQotfQotCi0vKiBUaGUgQk8gZmllbGQgaW4gYSBCIGZvcm0gaW5zdHJ1Y3Rpb24uICBXYXJuIGFib3V0IGF0dGVtcHRzIHRvIHNldAotICAgdGhlIGZpZWxkIHRvIGFuIGlsbGVnYWwgdmFsdWUuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2JvIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmIChlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwKLSAgICAgICYmICEgdmFsaWRfYm8gKHZhbHVlKSkKLSAgICAqZXJybXNnID0gXygiaW52YWxpZCBjb25kaXRpb25hbCBvcHRpb24iKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMjEpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9ibyAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgdmFsdWU7Ci0KLSAgdmFsdWUgPSAoaW5zbiA+PiAyMSkgJiAweDFmOwotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwKLSAgICAgICYmICEgdmFsaWRfYm8gKHZhbHVlKSkKLSAgICAqaW52YWxpZCA9IDE7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyogVGhlIEJPIGZpZWxkIGluIGEgQiBmb3JtIGluc3RydWN0aW9uIHdoZW4gdGhlICsgb3IgLSBtb2RpZmllciBpcwotICAgdXNlZC4gIFRoaXMgaXMgbGlrZSB0aGUgQk8gZmllbGQsIGJ1dCBpdCBtdXN0IGJlIGV2ZW4uICBXaGVuCi0gICBleHRyYWN0aW5nIGl0LCB3ZSBmb3JjZSBpdCB0byBiZSBldmVuLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9ib2UgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLSAgICB7Ci0gICAgICBpZiAoISB2YWxpZF9ibyAodmFsdWUpKQotCSplcnJtc2cgPSBfKCJpbnZhbGlkIGNvbmRpdGlvbmFsIG9wdGlvbiIpOwotICAgICAgZWxzZSBpZiAoKHZhbHVlICYgMSkgIT0gMCkKLQkqZXJybXNnID0gXygiYXR0ZW1wdCB0byBzZXQgeSBiaXQgd2hlbiB1c2luZyArIG9yIC0gbW9kaWZpZXIiKTsKLSAgICB9Ci0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWYpIDw8IDIxKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfYm9lIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyB2YWx1ZTsKLQotICB2YWx1ZSA9IChpbnNuID4+IDIxKSAmIDB4MWY7Ci0gIGlmIChpbnZhbGlkICE9IChpbnQgKikgTlVMTAotICAgICAgJiYgISB2YWxpZF9ibyAodmFsdWUpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIHZhbHVlICYgMHgxZTsKLX0KLQotLyogVGhlIERTIGZpZWxkIGluIGEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgbGlrZSBELCBidXQgdGhlCi0gICBsb3dlciB0d28gYml0cyBhcmUgZm9yY2VkIHRvIHplcm8uICAqLwotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZHMgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAodmFsdWUgJiAweGZmZmMpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X2RzIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKChpbnNuICYgMHg4MDAwKSAhPSAwKQotICAgIHJldHVybiAoaW5zbiAmIDB4ZmZmYykgLSAweDEwMDAwOwotICBlbHNlCi0gICAgcmV0dXJuIGluc24gJiAweGZmZmM7Ci19Ci0KLS8qIFRoZSBMSSBmaWVsZCBpbiBhbiBJIGZvcm0gaW5zdHJ1Y3Rpb24uICBUaGUgbG93ZXIgdHdvIGJpdHMgYXJlCi0gICBmb3JjZWQgdG8gemVyby4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9saSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAoKHZhbHVlICYgMykgIT0gMCAmJiBlcnJtc2cgIT0gKGNvbnN0IGNoYXIgKiopIE5VTEwpCi0gICAgKmVycm1zZyA9IF8oImlnbm9yaW5nIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgaW4gYnJhbmNoIG9mZnNldCIpOwotICByZXR1cm4gaW5zbiB8ICh2YWx1ZSAmIDB4M2ZmZmZmYyk7Ci19Ci0KLS8qQVJHU1VTRUQqLwotc3RhdGljIGxvbmcKLWV4dHJhY3RfbGkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoKGluc24gJiAweDIwMDAwMDApICE9IDApCi0gICAgcmV0dXJuIChpbnNuICYgMHgzZmZmZmZjKSAtIDB4NDAwMDAwMDsKLSAgZWxzZQotICAgIHJldHVybiBpbnNuICYgMHgzZmZmZmZjOwotfQotCi0vKiBUaGUgTUIgYW5kIE1FIGZpZWxkcyBpbiBhbiBNIGZvcm0gaW5zdHJ1Y3Rpb24gZXhwcmVzc2VkIGFzIGEgc2luZ2xlCi0gICBvcGVyYW5kIHdoaWNoIGlzIGl0c2VsZiBhIGJpdG1hc2suICBUaGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBhbHdheXMKLSAgIG1hcmtzIGl0IGFzIGludmFsaWQsIHNpbmNlIHdlIG5ldmVyIHdhbnQgdG8gcmVjb2duaXplIGFuCi0gICBpbnN0cnVjdGlvbiB3aGljaCB1c2VzIGEgZmllbGQgb2YgdGhpcyB0eXBlLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9tYmUgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgdW5zaWduZWQgbG9uZyB1dmFsLCBtYXNrOwotICBpbnQgbWIsIG1lLCBteCwgY291bnQsIGxhc3Q7Ci0KLSAgdXZhbCA9IHZhbHVlOwotCi0gIGlmICh1dmFsID09IDApCi0gICAgewotICAgICAgaWYgKGVycm1zZyAhPSAoY29uc3QgY2hhciAqKikgTlVMTCkKLQkqZXJybXNnID0gXygiaWxsZWdhbCBiaXRtYXNrIik7Ci0gICAgICByZXR1cm4gaW5zbjsKLSAgICB9Ci0KLSAgbWIgPSAwOwotICBtZSA9IDMyOwotICBpZiAoKHV2YWwgJiAxKSAhPSAwKQotICAgIGxhc3QgPSAxOwotICBlbHNlCi0gICAgbGFzdCA9IDA7Ci0gIGNvdW50ID0gMDsKLQotICAvKiBtYjogbG9jYXRpb24gb2YgbGFzdCAwLT4xIHRyYW5zaXRpb24gKi8KLSAgLyogbWU6IGxvY2F0aW9uIG9mIGxhc3QgMS0+MCB0cmFuc2l0aW9uICovCi0gIC8qIGNvdW50OiAjIHRyYW5zaXRpb25zICovCi0KLSAgZm9yIChteCA9IDAsIG1hc2sgPSAxIDw8IDMxOyBteCA8IDMyOyArK214LCBtYXNrID4+PSAxKQotICAgIHsKLSAgICAgIGlmICgodXZhbCAmIG1hc2spICYmICFsYXN0KQotCXsKLQkgICsrY291bnQ7Ci0JICBtYiA9IG14OwotCSAgbGFzdCA9IDE7Ci0JfQotICAgICAgZWxzZSBpZiAoISh1dmFsICYgbWFzaykgJiYgbGFzdCkKLQl7Ci0JICArK2NvdW50OwotCSAgbWUgPSBteDsKLQkgIGxhc3QgPSAwOwotCX0KLSAgICB9Ci0gIGlmIChtZSA9PSAwKQotICAgIG1lID0gMzI7Ci0KLSAgaWYgKGNvdW50ICE9IDIgJiYgKGNvdW50ICE9IDAgfHwgISBsYXN0KSkKLSAgICB7Ci0gICAgICBpZiAoZXJybXNnICE9IChjb25zdCBjaGFyICoqKSBOVUxMKQotCSplcnJtc2cgPSBfKCJpbGxlZ2FsIGJpdG1hc2siKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGluc24gfCAobWIgPDwgNikgfCAoKG1lIC0gMSkgPDwgMSk7Ci19Ci0KLXN0YXRpYyBsb25nCi1leHRyYWN0X21iZSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIGxvbmcgcmV0OwotICBpbnQgbWIsIG1lOwotICBpbnQgaTsKLQotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwpCi0gICAgKmludmFsaWQgPSAxOwotCi0gIG1iID0gKGluc24gPj4gNikgJiAweDFmOwotICBtZSA9IChpbnNuID4+IDEpICYgMHgxZjsKLSAgaWYgKG1iIDwgbWUgKyAxKQotICAgIHsKLSAgICAgIHJldCA9IDA7Ci0gICAgICBmb3IgKGkgPSBtYjsgaSA8PSBtZTsgaSsrKQotCXJldCB8PSAobG9uZykgMSA8PCAoMzEgLSBpKTsKLSAgICB9Ci0gIGVsc2UgaWYgKG1iID09IG1lICsgMSkKLSAgICByZXQgPSB+MDsKLSAgZWxzZSAvKiAobWIgPiBtZSArIDEpICovCi0gICAgewotICAgICAgcmV0ID0gfiAobG9uZykgMDsKLSAgICAgIGZvciAoaSA9IG1lICsgMTsgaSA8IG1iOyBpKyspCi0JcmV0ICY9IH4gKChsb25nKSAxIDw8ICgzMSAtIGkpKTsKLSAgICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBNQiBvciBNRSBmaWVsZCBpbiBhbiBNRCBvciBNRFMgZm9ybSBpbnN0cnVjdGlvbi4gIFRoZSBoaWdoIGJpdAotICAgaXMgd3JhcHBlZCB0byB0aGUgbG93IGVuZC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9tYjYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgNikgfCAodmFsdWUgJiAweDIwKTsKLX0KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9tYjYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gKChpbnNuID4+IDYpICYgMHgxZikgfCAoaW5zbiAmIDB4MjApOwotfQotCi0vKiBUaGUgTkIgZmllbGQgaW4gYW4gWCBmb3JtIGluc3RydWN0aW9uLiAgVGhlIHZhbHVlIDMyIGlzIHN0b3JlZCBhcwotICAgMC4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfbmIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDMyKQotICAgICplcnJtc2cgPSBfKCJ2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgaWYgKHZhbHVlID09IDMyKQotICAgIHZhbHVlID0gMDsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTEpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X25iIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gKGluc24gPj4gMTEpICYgMHgxZjsKLSAgaWYgKHJldCA9PSAwKQotICAgIHJldCA9IDMyOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBUaGUgTlNJIGZpZWxkIGluIGEgRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgU0kKLSAgIGZpZWxkLCBvbmx5IG5lZ2F0ZWQuICBUaGUgZXh0cmFjdGlvbiBmdW5jdGlvbiBhbHdheXMgbWFya3MgaXQgYXMKLSAgIGludmFsaWQsIHNpbmNlIHdlIG5ldmVyIHdhbnQgdG8gcmVjb2duaXplIGFuIGluc3RydWN0aW9uIHdoaWNoIHVzZXMKLSAgIGEgZmllbGQgb2YgdGhpcyB0eXBlLiAgKi8KLQotLypBUkdTVVNFRCovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X25zaSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgoLSB2YWx1ZSkgJiAweGZmZmYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9uc2kgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICBpZiAoaW52YWxpZCAhPSAoaW50ICopIE5VTEwpCi0gICAgKmludmFsaWQgPSAxOwotICBpZiAoKGluc24gJiAweDgwMDApICE9IDApCi0gICAgcmV0dXJuIC0gKChsb25nKShpbnNuICYgMHhmZmZmKSAtIDB4MTAwMDApOwotICBlbHNlCi0gICAgcmV0dXJuIC0gKGxvbmcpKGluc24gJiAweGZmZmYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEgZmllbGQgbWF5IG5vdCBiZSB6ZXJvIGFuZCBtYXkgbm90Ci0gICBlcXVhbCB0aGUgUlQgZmllbGQuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3JhbCAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICBpZiAodmFsdWUgPT0gMAotICAgICAgfHwgKHVuc2lnbmVkIGxvbmcpIHZhbHVlID09ICgoaW5zbiA+PiAyMSkgJiAweDFmKSkKLSAgICAqZXJybXNnID0gImludmFsaWQgcmVnaXN0ZXIgb3BlcmFuZCB3aGVuIHVwZGF0aW5nIjsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYW4gbG13IGluc3RydWN0aW9uLCB3aGljaCBoYXMgc3BlY2lhbCB2YWx1ZQotICAgcmVzdHJpY3Rpb25zLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYW0gKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKCh1bnNpZ25lZCBsb25nKSB2YWx1ZSA+PSAoKGluc24gPj4gMjEpICYgMHgxZikpCi0gICAgKmVycm1zZyA9IF8oImluZGV4IHJlZ2lzdGVyIGluIGxvYWQgcmFuZ2UiKTsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpOwotfQotCi0vKiBUaGUgUkEgZmllbGQgaW4gYSBEIG9yIFggZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBpcyBhbiB1cGRhdGluZwotICAgc3RvcmUgb3IgYW4gdXBkYXRpbmcgZmxvYXRpbmcgcG9pbnQgbG9hZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgUkEKLSAgIGZpZWxkIG1heSBub3QgYmUgemVyby4gICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfcmFzIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiplcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA9PSAwKQotICAgICplcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIG9wZXJhbmQgd2hlbiB1cGRhdGluZyIpOwotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNik7Ci19Ci0KLS8qIFRoZSBSQiBmaWVsZCBpbiBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2hlbiBpdCBtdXN0IGJlIHRoZSBzYW1lIGFzCi0gICB0aGUgUlMgZmllbGQgaW4gdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcyB1c2VkIGZvciBleHRlbmRlZAotICAgbW5lbW9uaWNzIGxpa2UgbXIuICBUaGlzIG9wZXJhbmQgaXMgbWFya2VkIEZBS0UuICBUaGUgaW5zZXJ0aW9uCi0gICBmdW5jdGlvbiBqdXN0IGNvcGllcyB0aGUgQlQgZmllbGQgaW50byB0aGUgQkEgZmllbGQsIGFuZCB0aGUKLSAgIGV4dHJhY3Rpb24gZnVuY3Rpb24ganVzdCBjaGVja3MgdGhhdCB0aGUgZmllbGRzIGFyZSB0aGUgc2FtZS4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9yYnMgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKChpbnNuID4+IDIxKSAmIDB4MWYpIDw8IDExKTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfcmJzIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgaWYgKGludmFsaWQgIT0gKGludCAqKSBOVUxMCi0gICAgICAmJiAoKGluc24gPj4gMjEpICYgMHgxZikgIT0gKChpbnNuID4+IDExKSAmIDB4MWYpKQotICAgICppbnZhbGlkID0gMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSBTSCBmaWVsZCBpbiBhbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgVGhpcyBpcyBzcGxpdC4gICovCi0KLS8qQVJHU1VTRUQqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9zaDYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTEpIHwgKCh2YWx1ZSAmIDB4MjApID4+IDQpOwotfQotCi0vKkFSR1NVU0VEKi8KLXN0YXRpYyBsb25nCi1leHRyYWN0X3NoNiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKmludmFsaWQ7Ci17Ci0gIHJldHVybiAoKGluc24gPj4gMTEpICYgMHgxZikgfCAoKGluc24gPDwgNCkgJiAweDIwKTsKLX0KLQotLyogVGhlIFNQUiBmaWVsZCBpbiBhbiBYRlggZm9ybSBpbnN0cnVjdGlvbi4gIFRoaXMgaXMgZmxpcHBlZC0tdGhlCi0gICBsb3dlciA1IGJpdHMgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgNSBhbmQgdmljZS0gdmVyc2EuICAqLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3NwciAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqZXJybXNnOwotewotICByZXR1cm4gaW5zbiB8ICgodmFsdWUgJiAweDFmKSA8PCAxNikgfCAoKHZhbHVlICYgMHgzZTApIDw8IDYpOwotfQotCi1zdGF0aWMgbG9uZwotZXh0cmFjdF9zcHIgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICppbnZhbGlkOwotewotICByZXR1cm4gKChpbnNuID4+IDE2KSAmIDB4MWYpIHwgKChpbnNuID4+IDYpICYgMHgzZTApOwotfQotCi0vKiBUaGUgVEJSIGZpZWxkIGluIGFuIFhGWCBpbnN0cnVjdGlvbi4gIFRoaXMgaXMganVzdCBsaWtlIFNQUiwgYnV0IGl0Ci0gICBpcyBvcHRpb25hbC4gIFdoZW4gVEJSIGlzIG9taXR0ZWQsIGl0IG11c3QgYmUgaW5zZXJ0ZWQgYXMgMjY4ICh0aGUKLSAgIG1hZ2ljIG51bWJlciBvZiB0aGUgVEIgcmVnaXN0ZXIpLiAgVGhlc2UgZnVuY3Rpb25zIHRyZWF0IDAKLSAgIChpbmRpY2F0aW5nIGFuIG9taXR0ZWQgb3B0aW9uYWwgb3BlcmFuZCkgYXMgMjY4LiAgVGhpcyBtZWFucyB0aGF0Ci0gICBgYG1mdGIgNCwwJycgaXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LiAgVGhpcyBkb2VzIG5vdCBtYXR0ZXIgdmVyeQotICAgbXVjaCwgc2luY2UgdGhlIGFyY2hpdGVjdHVyZSBtYW51YWwgZG9lcyBub3QgZGVmaW5lIG1mdGIgYXMKLSAgIGFjY2VwdGluZyBhbnkgdmFsdWVzIG90aGVyIHRoYW4gMjY4IG9yIDI2OS4gICovCi0KLSNkZWZpbmUgVEIgKDI2OCkKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF90YnIgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKmVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID09IDApCi0gICAgdmFsdWUgPSBUQjsKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZikgPDwgMTYpIHwgKCh2YWx1ZSAmIDB4M2UwKSA8PCA2KTsKLX0KLQotc3RhdGljIGxvbmcKLWV4dHJhY3RfdGJyIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqaW52YWxpZDsKLXsKLSAgbG9uZyByZXQ7Ci0KLSAgcmV0ID0gKChpbnNuID4+IDE2KSAmIDB4MWYpIHwgKChpbnNuID4+IDYpICYgMHgzZTApOwotICBpZiAocmV0ID09IFRCKQotICAgIHJldCA9IDA7Ci0gIHJldHVybiByZXQ7Ci19Ci0MCi0vKiBNYWNyb3MgdXNlZCB0byBmb3JtIG9wY29kZXMuICAqLwotCi0vKiBUaGUgbWFpbiBvcGNvZGUuICAqLwotI2RlZmluZSBPUCh4KSAoKCgodW5zaWduZWQgbG9uZykoeCkpICYgMHgzZikgPDwgMjYpCi0jZGVmaW5lIE9QX01BU0sgT1AgKDB4M2YpCi0KLS8qIFRoZSBtYWluIG9wY29kZSBjb21iaW5lZCB3aXRoIGEgdHJhcCBjb2RlIGluIHRoZSBUTyBmaWVsZCBvZiBhIEQKLSAgIGZvcm0gaW5zdHJ1Y3Rpb24uICBVc2VkIGZvciBleHRlbmRlZCBtbmVtb25pY3MgZm9yIHRoZSB0cmFwCi0gICBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBPUFRPKHgsdG8pIChPUCAoeCkgfCAoKCgodW5zaWduZWQgbG9uZykodG8pKSAmIDB4MWYpIDw8IDIxKSkKLSNkZWZpbmUgT1BUT19NQVNLIChPUF9NQVNLIHwgVE9fTUFTSykKLQotLyogVGhlIG1haW4gb3Bjb2RlIGNvbWJpbmVkIHdpdGggYSBjb21wYXJpc29uIHNpemUgYml0IGluIHRoZSBMIGZpZWxkCi0gICBvZiBhIEQgZm9ybSBvciBYIGZvcm0gaW5zdHJ1Y3Rpb24uICBVc2VkIGZvciBleHRlbmRlZCBtbmVtb25pY3MgZm9yCi0gICB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuICAqLwotI2RlZmluZSBPUEwoeCxsKSAoT1AgKHgpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKLSNkZWZpbmUgT1BMX01BU0sgT1BMICgweDNmLDEpCi0KLS8qIEFuIEEgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIEEob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZikgPDwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIEFfTUFTSyBBICgweDNmLCAweDFmLCAxKQotCi0vKiBBbiBBX01BU0sgd2l0aCB0aGUgRlJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgQUZSQl9NQVNLIChBX01BU0sgfCBGUkJfTUFTSykKLQotLyogQW4gQV9NQVNLIHdpdGggdGhlIEZSQyBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIEFGUkNfTUFTSyAoQV9NQVNLIHwgRlJDX01BU0spCi0KLS8qIEFuIEFfTUFTSyB3aXRoIHRoZSBGUkEgYW5kIEZSQyBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBBRlJBRlJDX01BU0sgKEFfTUFTSyB8IEZSQV9NQVNLIHwgRlJDX01BU0spCi0KLS8qIEEgQiBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgQihvcCwgYWEsIGxrKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKShhYSkpICYgMSkgPDwgMSkgfCAoKGxrKSAmIDEpKQotI2RlZmluZSBCX01BU0sgQiAoMHgzZiwgMSwgMSkKLQotLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgQk8gZmllbGQuICAqLwotI2RlZmluZSBCQk8ob3AsIGJvLCBhYSwgbGspIChCICgob3ApLCAoYWEpLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKShibykpICYgMHgxZikgPDwgMjEpKQotI2RlZmluZSBCQk9fTUFTSyBCQk8gKDB4M2YsIDB4MWYsIDEsIDEpCi0KLS8qIEEgQkJPX01BU0sgd2l0aCB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIHJlbW92ZWQuICBUaGlzIHBlcm1pdHMKLSAgIG1hdGNoaW5nIGEgY29uZGl0aW9uYWwgYnJhbmNoIHJlZ2FyZGxlc3Mgb2YgdGhlIHNldHRpbmcgb2YgdGhlIHkKLSAgIGJpdC4gICovCi0jZGVmaW5lIFlfTUFTSyAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIxKQotI2RlZmluZSBCQk9ZX01BU0sgKEJCT19NQVNLICZ+IFlfTUFTSykKLQotLyogQSBCIGZvcm0gaW5zdHJ1Y3Rpb24gc2V0dGluZyB0aGUgQk8gZmllbGQgYW5kIHRoZSBjb25kaXRpb24gYml0cyBvZgotICAgdGhlIEJJIGZpZWxkLiAgKi8KLSNkZWZpbmUgQkJPQ0Iob3AsIGJvLCBjYiwgYWEsIGxrKSBcCi0gIChCQk8gKChvcCksIChibyksIChhYSksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGNiKSkgJiAweDMpIDw8IDE2KSkKLSNkZWZpbmUgQkJPQ0JfTUFTSyBCQk9DQiAoMHgzZiwgMHgxZiwgMHgzLCAxLCAxKQotCi0vKiBBIEJCT0NCX01BU0sgd2l0aCB0aGUgeSBiaXQgb2YgdGhlIEJPIGZpZWxkIHJlbW92ZWQuICAqLwotI2RlZmluZSBCQk9ZQ0JfTUFTSyAoQkJPQ0JfTUFTSyAmfiBZX01BU0spCi0KLS8qIEEgQkJPWUNCX01BU0sgaW4gd2hpY2ggdGhlIEJJIGZpZWxkIGlzIGZpeGVkLiAgKi8KLSNkZWZpbmUgQkJPWUJJX01BU0sgKEJCT1lDQl9NQVNLIHwgQklfTUFTSykKLQotLyogVGhlIG1haW4gb3Bjb2RlIG1hc2sgd2l0aCB0aGUgUkEgZmllbGQgY2xlYXIuICAqLwotI2RlZmluZSBEUkFfTUFTSyAoT1BfTUFTSyB8IFJBX01BU0spCi0KLS8qIEEgRFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIERTTyhvcCwgeG9wKSAoT1AgKG9wKSB8ICgoeG9wKSAmIDB4MykpCi0jZGVmaW5lIERTX01BU0sgRFNPICgweDNmLCAzKQotCi0vKiBBbiBNIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBNKG9wLCByYykgKE9QIChvcCkgfCAoKHJjKSAmIDEpKQotI2RlZmluZSBNX01BU0sgTSAoMHgzZiwgMSkKLQotLyogQW4gTSBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIE1FIGZpZWxkIHNwZWNpZmllZC4gICovCi0jZGVmaW5lIE1NRShvcCwgbWUsIHJjKSAoTSAoKG9wKSwgKHJjKSkgfCAoKCgodW5zaWduZWQgbG9uZykobWUpKSAmIDB4MWYpIDw8IDEpKQotCi0vKiBBbiBNX01BU0sgd2l0aCB0aGUgTUIgYW5kIE1FIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIE1NQk1FX01BU0sgKE1fTUFTSyB8IE1CX01BU0sgfCBNRV9NQVNLKQotCi0vKiBBbiBNX01BU0sgd2l0aCB0aGUgU0ggYW5kIE1FIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIE1TSE1FX01BU0sgKE1fTUFTSyB8IFNIX01BU0sgfCBNRV9NQVNLKQotCi0vKiBBbiBNRCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTUQob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHg3KSA8PCAyKSB8ICgocmMpICYgMSkpCi0jZGVmaW5lIE1EX01BU0sgTUQgKDB4M2YsIDB4NywgMSkKLQotLyogQW4gTURfTUFTSyB3aXRoIHRoZSBNQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIE1ETUJfTUFTSyAoTURfTUFTSyB8IE1CNl9NQVNLKQotCi0vKiBBbiBNRF9NQVNLIHdpdGggdGhlIFNIIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgTURTSF9NQVNLIChNRF9NQVNLIHwgU0g2X01BU0spCi0KLS8qIEFuIE1EUyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTURTKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4ZikgPDwgMSkgfCAoKHJjKSAmIDEpKQotI2RlZmluZSBNRFNfTUFTSyBNRFMgKDB4M2YsIDB4ZiwgMSkKLQotLyogQW4gTURTX01BU0sgd2l0aCB0aGUgTUIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBNRFNNQl9NQVNLIChNRFNfTUFTSyB8IE1CNl9NQVNLKQotCi0vKiBBbiBTQyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgU0Mob3AsIHNhLCBsaykgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoc2EpKSAmIDEpIDw8IDEpIHwgKChsaykgJiAxKSkKLSNkZWZpbmUgU0NfTUFTSyAoT1BfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMHgzZmYpIDw8IDE2KSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMSkgfCAxKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYKG9wLCB4b3ApIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgUkMgYml0IHNwZWNpZmllZC4gICovCi0jZGVmaW5lIFhSQyhvcCwgeG9wLCByYykgKFggKChvcCksICh4b3ApKSB8ICgocmMpICYgMSkpCi0KLS8qIFRoZSBtYXNrIGZvciBhbiBYIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYX01BU0sgWFJDICgweDNmLCAweDNmZiwgMSkKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWFJBX01BU0sgKFhfTUFTSyB8IFJBX01BU0spCi0KLS8qIEFuIFhfTUFTSyB3aXRoIHRoZSBSQiBmaWVsZCBmaXhlZC4gICovCi0jZGVmaW5lIFhSQl9NQVNLIChYX01BU0sgfCBSQl9NQVNLKQotCi0vKiBBbiBYX01BU0sgd2l0aCB0aGUgUlQgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYUlRfTUFTSyAoWF9NQVNLIHwgUlRfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJBIGFuZCBSQiBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYUkFSQl9NQVNLIChYX01BU0sgfCBSQV9NQVNLIHwgUkJfTUFTSykKLQotLyogQW4gWF9NQVNLIHdpdGggdGhlIFJUIGFuZCBSQSBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYUlRSQV9NQVNLIChYX01BU0sgfCBSVF9NQVNLIHwgUkFfTUFTSykKLQotLyogQW4gWCBmb3JtIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYQ01QTChvcCwgeG9wLCBsKSAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGwpKSAmIDEpIDw8IDIxKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWENNUF9NQVNLIChYX01BU0sgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDIyKSkKLQotLyogVGhlIG1hc2sgZm9yIGFuIFggZm9ybSBjb21wYXJpc29uIGluc3RydWN0aW9uIHdpdGggdGhlIEwgZmllbGQKLSAgIGZpeGVkLiAgKi8KLSNkZWZpbmUgWENNUExfTUFTSyAoWENNUF9NQVNLIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAyMSkpCi0KLS8qIEFuIFggZm9ybSB0cmFwIGluc3RydWN0aW9uIHdpdGggdGhlIFRPIGZpZWxkIHNwZWNpZmllZC4gICovCi0jZGVmaW5lIFhUTyhvcCwgeG9wLCB0bykgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh0bykpICYgMHgxZikgPDwgMjEpKQotI2RlZmluZSBYVE9fTUFTSyAoWF9NQVNLIHwgVE9fTUFTSykKLQotLyogQW4gWEZMIGZvcm0gaW5zdHJ1Y3Rpb24uICAqLwotI2RlZmluZSBYRkwob3AsIHhvcCwgcmMpIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgzZmYpIDw8IDEpIHwgKCgodW5zaWduZWQgbG9uZykocmMpKSAmIDEpKQotI2RlZmluZSBYRkxfTUFTSyAoWEZMICgweDNmLCAweDNmZiwgMSkgfCAoKCh1bnNpZ25lZCBsb25nKTEpIDw8IDI1KSB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMTYpKQotCi0vKiBBbiBYTCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIExLIGZpZWxkIHNldCB0byAwLiAgKi8KLSNkZWZpbmUgWEwob3AsIHhvcCkgKE9QIChvcCkgfCAoKCgodW5zaWduZWQgbG9uZykoeG9wKSkgJiAweDNmZikgPDwgMSkpCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggdXNlcyB0aGUgTEsgZmllbGQuICAqLwotI2RlZmluZSBYTExLKG9wLCB4b3AsIGxrKSAoWEwgKChvcCksICh4b3ApKSB8ICgobGspICYgMSkpCi0KLS8qIFRoZSBtYXNrIGZvciBhbiBYTCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWExfTUFTSyBYTExLICgweDNmLCAweDNmZiwgMSkKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBleHBsaWNpdGx5IHNldHMgdGhlIEJPIGZpZWxkLiAgKi8KLSNkZWZpbmUgWExPKG9wLCBibywgeG9wLCBsaykgXAotICAoWExMSyAoKG9wKSwgKHhvcCksIChsaykpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGJvKSkgJiAweDFmKSA8PCAyMSkpCi0jZGVmaW5lIFhMT19NQVNLIChYTF9NQVNLIHwgQk9fTUFTSykKLQotLyogQW4gWEwgZm9ybSBpbnN0cnVjdGlvbiB3aGljaCBleHBsaWNpdGx5IHNldHMgdGhlIHkgYml0IG9mIHRoZSBCTwotICAgZmllbGQuICAqLwotI2RlZmluZSBYTFlMSyhvcCwgeG9wLCB5LCBsaykgKFhMTEsgKChvcCksICh4b3ApLCAobGspKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh5KSkgJiAxKSA8PCAyMSkpCi0jZGVmaW5lIFhMWUxLX01BU0sgKFhMX01BU0sgfCBZX01BU0spCi0KLS8qIEFuIFhMIGZvcm0gaW5zdHJ1Y3Rpb24gd2hpY2ggc2V0cyB0aGUgQk8gZmllbGQgYW5kIHRoZSBjb25kaXRpb24KLSAgIGJpdHMgb2YgdGhlIEJJIGZpZWxkLiAgKi8KLSNkZWZpbmUgWExPQ0Iob3AsIGJvLCBjYiwgeG9wLCBsaykgXAotICAoWExPICgob3ApLCAoYm8pLCAoeG9wKSwgKGxrKSkgfCAoKCgodW5zaWduZWQgbG9uZykoY2IpKSAmIDMpIDw8IDE2KSkKLSNkZWZpbmUgWExPQ0JfTUFTSyBYTE9DQiAoMHgzZiwgMHgxZiwgMHgzLCAweDNmZiwgMSkKLQotLyogQW4gWExfTUFTSyBvciBYTFlMS19NQVNLIG9yIFhMT0NCX01BU0sgd2l0aCB0aGUgQkIgZmllbGQgZml4ZWQuICAqLwotI2RlZmluZSBYTEJCX01BU0sgKFhMX01BU0sgfCBCQl9NQVNLKQotI2RlZmluZSBYTFlCQl9NQVNLIChYTFlMS19NQVNLIHwgQkJfTUFTSykKLSNkZWZpbmUgWExCT0NCQkJfTUFTSyAoWExPQ0JfTUFTSyB8IEJCX01BU0spCi0KLS8qIEFuIFhMX01BU0sgd2l0aCB0aGUgQk8gYW5kIEJCIGZpZWxkcyBmaXhlZC4gICovCi0jZGVmaW5lIFhMQk9CQl9NQVNLIChYTF9NQVNLIHwgQk9fTUFTSyB8IEJCX01BU0spCi0KLS8qIEFuIFhMX01BU0sgd2l0aCB0aGUgQk8sIEJJIGFuZCBCQiBmaWVsZHMgZml4ZWQuICAqLwotI2RlZmluZSBYTEJPQklCQl9NQVNLIChYTF9NQVNLIHwgQk9fTUFTSyB8IEJJX01BU0sgfCBCQl9NQVNLKQotCi0vKiBBbiBYTyBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWE8ob3AsIHhvcCwgb2UsIHJjKSBcCi0gIChPUCAob3ApIHwgKCgoKHVuc2lnbmVkIGxvbmcpKHhvcCkpICYgMHgxZmYpIDw8IDEpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKG9lKSkgJiAxKSA8PCAxMCkgfCAoKCh1bnNpZ25lZCBsb25nKShyYykpICYgMSkpCi0jZGVmaW5lIFhPX01BU0sgWE8gKDB4M2YsIDB4MWZmLCAxLCAxKQotCi0vKiBBbiBYT19NQVNLIHdpdGggdGhlIFJCIGZpZWxkIGZpeGVkLiAgKi8KLSNkZWZpbmUgWE9SQl9NQVNLIChYT19NQVNLIHwgUkJfTUFTSykKLQotLyogQW4gWFMgZm9ybSBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIFhTKG9wLCB4b3AsIHJjKSAoT1AgKG9wKSB8ICgoKCh1bnNpZ25lZCBsb25nKSh4b3ApKSAmIDB4MWZmKSA8PCAyKSB8ICgoKHVuc2lnbmVkIGxvbmcpKHJjKSkgJiAxKSkKLSNkZWZpbmUgWFNfTUFTSyBYUyAoMHgzZiwgMHgxZmYsIDEpCi0KLS8qIEEgbWFzayBmb3IgdGhlIEZYTSB2ZXJzaW9uIG9mIGFuIFhGWCBmb3JtIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgWEZYRlhNX01BU0sgKFhfTUFTSyB8ICgoKHVuc2lnbmVkIGxvbmcpMSkgPDwgMjApIHwgKCgodW5zaWduZWQgbG9uZykxKSA8PCAxMSkpCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIEZYTSBmaWVsZCBmaWxsZWQgaW4uICAqLwotI2RlZmluZSBYRlhNKG9wLCB4b3AsIGZ4bSkgXAotICAoWCAoKG9wKSwgKHhvcCkpIHwgKCgoKHVuc2lnbmVkIGxvbmcpKGZ4bSkpICYgMHhmZikgPDwgMTIpKQotCi0vKiBBbiBYRlggZm9ybSBpbnN0cnVjdGlvbiB3aXRoIHRoZSBTUFIgZmllbGQgZmlsbGVkIGluLiAgKi8KLSNkZWZpbmUgWFNQUihvcCwgeG9wLCBzcHIpIFwKLSAgKFggKChvcCksICh4b3ApKSB8ICgoKCh1bnNpZ25lZCBsb25nKShzcHIpKSAmIDB4MWYpIDw8IDE2KSB8ICgoKCh1bnNpZ25lZCBsb25nKShzcHIpKSAmIDB4M2UwKSA8PCA2KSkKLSNkZWZpbmUgWFNQUl9NQVNLIChYX01BU0sgfCBTUFJfTUFTSykKLQotLyogQW4gWEZYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgU1BSIGZpZWxkIGZpbGxlZCBpbiBleGNlcHQgZm9yIHRoZQotICAgU1BSQkFUIGZpZWxkLiAgKi8KLSNkZWZpbmUgWFNQUkJBVF9NQVNLIChYU1BSX01BU0sgJn4gU1BSQkFUX01BU0spCi0KLS8qIEFuIFhGWCBmb3JtIGluc3RydWN0aW9uIHdpdGggdGhlIFNQUiBmaWVsZCBmaWxsZWQgaW4gZXhjZXB0IGZvciB0aGUKLSAgIFNQUkcgZmllbGQuICAqLwotI2RlZmluZSBYU1BSR19NQVNLIChYU1BSX01BU0sgJn4gU1BSR19NQVNLKQotCi0vKiBBbiBYIGZvcm0gaW5zdHJ1Y3Rpb24gd2l0aCBldmVyeXRoaW5nIGZpbGxlZCBpbiBleGNlcHQgdGhlIEUgZmllbGQuICAqLwotI2RlZmluZSBYRV9NQVNLICgweGZmZmY3ZmZmKQotCi0vKiBUaGUgQk8gZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgY29uZGl0aW9uYWwgYnJhbmNoIG1uZW1vbmljcy4gICovCi0jZGVmaW5lIEJPRE5aRgkoMHgwKQotI2RlZmluZSBCT0ROWkZQCSgweDEpCi0jZGVmaW5lIEJPRFpGCSgweDIpCi0jZGVmaW5lIEJPRFpGUAkoMHgzKQotI2RlZmluZSBCT0YJKDB4NCkKLSNkZWZpbmUgQk9GUAkoMHg1KQotI2RlZmluZSBCT0ROWlQJKDB4OCkKLSNkZWZpbmUgQk9ETlpUUAkoMHg5KQotI2RlZmluZSBCT0RaVAkoMHhhKQotI2RlZmluZSBCT0RaVFAJKDB4YikKLSNkZWZpbmUgQk9UCSgweGMpCi0jZGVmaW5lIEJPVFAJKDB4ZCkKLSNkZWZpbmUgQk9ETloJKDB4MTApCi0jZGVmaW5lIEJPRE5aUAkoMHgxMSkKLSNkZWZpbmUgQk9EWgkoMHgxMikKLSNkZWZpbmUgQk9EWlAJKDB4MTMpCi0jZGVmaW5lIEJPVQkoMHgxNCkKLQotLyogVGhlIEJJIGNvbmRpdGlvbiBiaXQgZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgY29uZGl0aW9uYWwgYnJhbmNoCi0gICBtbmVtb25pY3MuICAqLwotI2RlZmluZSBDQkxUCSgwKQotI2RlZmluZSBDQkdUCSgxKQotI2RlZmluZSBDQkVRCSgyKQotI2RlZmluZSBDQlNPCSgzKQotCi0vKiBUaGUgVE8gZW5jb2RpbmdzIHVzZWQgaW4gZXh0ZW5kZWQgdHJhcCBtbmVtb25pY3MuICAqLwotI2RlZmluZSBUT0xHVAkoMHgxKQotI2RlZmluZSBUT0xMVAkoMHgyKQotI2RlZmluZSBUT0VRCSgweDQpCi0jZGVmaW5lIFRPTEdFCSgweDUpCi0jZGVmaW5lIFRPTE5MCSgweDUpCi0jZGVmaW5lIFRPTExFCSgweDYpCi0jZGVmaW5lIFRPTE5HCSgweDYpCi0jZGVmaW5lIFRPR1QJKDB4OCkKLSNkZWZpbmUgVE9HRQkoMHhjKQotI2RlZmluZSBUT05MCSgweGMpCi0jZGVmaW5lIFRPTFQJKDB4MTApCi0jZGVmaW5lIFRPTEUJKDB4MTQpCi0jZGVmaW5lIFRPTkcJKDB4MTQpCi0jZGVmaW5lIFRPTkUJKDB4MTgpCi0jZGVmaW5lIFRPVQkoMHgxZikKLQwKLS8qIFNtYWxsZXIgbmFtZXMgZm9yIHRoZSBmbGFncyBzbyBlYWNoIGVudHJ5IGluIHRoZSBvcGNvZGVzIHRhYmxlIHdpbGwKLSAgIGZpdCBvbiBhIHNpbmdsZSBsaW5lLiAgKi8KLSN1bmRlZglQUEMKLSNkZWZpbmUgUFBDICAgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ0NPTQlQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfQ09NTU9OIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUgUFBDMzIgICBQUENfT1BDT0RFX1BQQyB8IFBQQ19PUENPREVfMzIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQUEM2NCAgIFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV82NCB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ09OTFkJUFBDX09QQ09ERV9QUEMKLSNkZWZpbmUgUFBDNDAzCVBQQwotI2RlZmluZSBQUEM3NTAJUFBDCi0jZGVmaW5lIFBQQzg2MAlQUEMKLSNkZWZpbmUJUE9XRVIgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9BTlkKLSNkZWZpbmUJUE9XRVIyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX1BPV0VSMiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lIFBQQ1BXUjIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QT1dFUjIgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlQT1dFUjMyCVBQQ19PUENPREVfUE9XRVIgfCBQUENfT1BDT0RFX0FOWSB8IFBQQ19PUENPREVfMzIKLSNkZWZpbmUJQ09NICAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFX0NPTU1PTiB8IFBQQ19PUENPREVfQU5ZCi0jZGVmaW5lCUNPTTMyICAgUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfUFBDIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWSB8IFBQQ19PUENPREVfMzIKLSNkZWZpbmUJTTYwMSAgICBQUENfT1BDT0RFX1BPV0VSIHwgUFBDX09QQ09ERV82MDEgfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZSBQV1JDT00JUFBDX09QQ09ERV9QT1dFUiB8IFBQQ19PUENPREVfNjAxIHwgUFBDX09QQ09ERV9DT01NT04gfCBQUENfT1BDT0RFX0FOWQotI2RlZmluZQlNRkRFQzEJUFBDX09QQ09ERV9QT1dFUgotI2RlZmluZQlNRkRFQzIJUFBDX09QQ09ERV9QUEMgfCBQUENfT1BDT0RFXzYwMQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCSAgICAgT1BDT0RFCU1BU0sJCUZMQUdTCQl7IE9QRVJBTkRTIH0KLQotICAgTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCi0gICBPUENPREUgaXMgdGhlIGluc3RydWN0aW9uIG9wY29kZS4KLSAgIE1BU0sgaXMgdGhlIG9wY29kZSBtYXNrOyB0aGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgZGlzYXNzZW1ibGVyCi0gICAgIHdoaWNoIGJpdHMgaW4gdGhlIGFjdHVhbCBvcGNvZGUgbXVzdCBtYXRjaCBPUENPREUuCi0gICBGTEFHUyBhcmUgZmxhZ3MgaW5kaWNhdGVkIHdoYXQgcHJvY2Vzc29ycyBzdXBwb3J0IHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotCi0gICBUaGUgZGlzYXNzZW1ibGVyIHJlYWRzIHRoZSB0YWJsZSBpbiBvcmRlciBhbmQgcHJpbnRzIHRoZSBmaXJzdAotICAgaW5zdHJ1Y3Rpb24gd2hpY2ggbWF0Y2hlcywgc28gdGhpcyB0YWJsZSBpcyBzb3J0ZWQgdG8gcHV0IG1vcmUKLSAgIHNwZWNpZmljIGluc3RydWN0aW9ucyBiZWZvcmUgbW9yZSBnZW5lcmFsIGluc3RydWN0aW9ucy4gIEl0IGlzIGFsc28KLSAgIHNvcnRlZCBieSBtYWpvciBvcGNvZGUuICAqLwotCi1jb25zdCBzdHJ1Y3QgcG93ZXJwY19vcGNvZGUgcG93ZXJwY19vcGNvZGVzW10gPSB7Ci17ICJ0ZGxndGkiLCAgT1BUTygyLFRPTEdUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGx0aSIsICBPUFRPKDIsVE9MTFQpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRlcWkiLCAgIE9QVE8oMixUT0VRKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGdlaSIsICBPUFRPKDIsVE9MR0UpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsbmxpIiwgIE9QVE8oMixUT0xOTCksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZGxsZWkiLCAgT1BUTygyLFRPTExFKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbG5naSIsICBPUFRPKDIsVE9MTkcpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRndGkiLCAgIE9QVE8oMixUT0dUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkZ2VpIiwgICBPUFRPKDIsVE9HRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5saSIsICAgT1BUTygyLFRPTkwpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRsdGkiLCAgIE9QVE8oMixUT0xUKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkbGVpIiwgICBPUFRPKDIsVE9MRSksIE9QVE9fTUFTSywJUFBDNjQsCQl7IFJBLCBTSSB9IH0sCi17ICJ0ZG5naSIsICAgT1BUTygyLFRPTkcpLCBPUFRPX01BU0ssCVBQQzY0LAkJeyBSQSwgU0kgfSB9LAoteyAidGRuZWkiLCAgIE9QVE8oMixUT05FKSwgT1BUT19NQVNLLAlQUEM2NCwJCXsgUkEsIFNJIH0gfSwKLXsgInRkaSIsICAgICBPUCgyKSwJT1BfTUFTSywJUFBDNjQsCQl7IFRPLCBSQSwgU0kgfSB9LAotCi17ICJ0d2xndGkiLCAgT1BUTygzLFRPTEdUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGd0aSIsICAgT1BUTygzLFRPTEdUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2xsdGkiLCAgT1BUTygzLFRPTExUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bGx0aSIsICAgT1BUTygzLFRPTExUKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d2VxaSIsICAgT1BUTygzLFRPRVEpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRlcWkiLCAgICBPUFRPKDMsVE9FUSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsZ2VpIiwgIE9QVE8oMyxUT0xHRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxnZWkiLCAgIE9QVE8oMyxUT0xHRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbmxpIiwgIE9QVE8oMyxUT0xOTCksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxubGkiLCAgIE9QVE8oMyxUT0xOTCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbGVpIiwgIE9QVE8oMyxUT0xMRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxsZWkiLCAgIE9QVE8oMyxUT0xMRSksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsbmdpIiwgIE9QVE8oMyxUT0xORyksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxuZ2kiLCAgIE9QVE8oMyxUT0xORyksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdndGkiLCAgIE9QVE8oMyxUT0dUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0Z3RpIiwgICAgT1BUTygzLFRPR1QpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3Z2VpIiwgICBPUFRPKDMsVE9HRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGdlaSIsICAgIE9QVE8oMyxUT0dFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25saSIsICAgT1BUTygzLFRPTkwpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRubGkiLCAgICBPUFRPKDMsVE9OTCksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHdsdGkiLCAgIE9QVE8oMyxUT0xUKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bHRpIiwgICAgT1BUTygzLFRPTFQpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3bGVpIiwgICBPUFRPKDMsVE9MRSksIE9QVE9fTUFTSywJUFBDQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidGxlaSIsICAgIE9QVE8oMyxUT0xFKSwgT1BUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0d25naSIsICAgT1BUTygzLFRPTkcpLCBPUFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInRuZ2kiLCAgICBPUFRPKDMsVE9ORyksIE9QVE9fTUFTSywJUFdSQ09NLAkJeyBSQSwgU0kgfSB9LAoteyAidHduZWkiLCAgIE9QVE8oMyxUT05FKSwgT1BUT19NQVNLLAlQUENDT00sCQl7IFJBLCBTSSB9IH0sCi17ICJ0bmVpIiwgICAgT1BUTygzLFRPTkUpLCBPUFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFNJIH0gfSwKLXsgInR3aSIsICAgICBPUCgzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBUTywgUkEsIFNJIH0gfSwKLXsgInRpIiwgICAgICBPUCgzKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBUTywgUkEsIFNJIH0gfSwKLQoteyAibXVsbGkiLCAgIE9QKDcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAibXVsaSIsICAgIE9QKDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAotCi17ICJzdWJmaWMiLCAgT1AoOCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJzZmkiLCAgICAgT1AoOCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi0KLXsgImRvemkiLCAgICBPUCg5KSwJT1BfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBTSSB9IH0sCi0KLXsgImNtcGx3aSIsICBPUEwoMTAsMCksCU9QTF9NQVNLLAlQUENDT00sCQl7IE9CRiwgUkEsIFVJIH0gfSwKLXsgImNtcGxkaSIsICBPUEwoMTAsMSksIE9QTF9NQVNLLAlQUEM2NCwJCXsgT0JGLCBSQSwgVUkgfSB9LAoteyAiY21wbGkiLCAgIE9QKDEwKSwJT1BfTUFTSywJUFBDT05MWSwJeyBCRiwgTCwgUkEsIFVJIH0gfSwKLXsgImNtcGxpIiwgICBPUCgxMCksCU9QX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBVSSB9IH0sCi0KLXsgImNtcHdpIiwgICBPUEwoMTEsMCksCU9QTF9NQVNLLAlQUENDT00sCQl7IE9CRiwgUkEsIFNJIH0gfSwKLXsgImNtcGRpIiwgICBPUEwoMTEsMSksCU9QTF9NQVNLLAlQUEM2NCwJCXsgT0JGLCBSQSwgU0kgfSB9LAoteyAiY21waSIsICAgIE9QKDExKSwJT1BfTUFTSywJUFBDT05MWSwJeyBCRiwgTCwgUkEsIFNJIH0gfSwKLXsgImNtcGkiLCAgICBPUCgxMSksCU9QX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBTSSB9IH0sCi0KLXsgImFkZGljIiwgICBPUCgxMiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJhaSIsCSAgICAgT1AoMTIpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAic3ViaWMiLCAgIE9QKDEyKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImFkZGljLiIsICBPUCgxMyksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBTSSB9IH0sCi17ICJhaS4iLCAgICAgT1AoMTMpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgU0kgfSB9LAoteyAic3ViaWMuIiwgIE9QKDEzKSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImxpIiwJICAgICBPUCgxNCksCURSQV9NQVNLLAlQUENDT00sCQl7IFJULCBTSSB9IH0sCi17ICJsaWwiLCAgICAgT1AoMTQpLAlEUkFfTUFTSywJUFdSQ09NLAkJeyBSVCwgU0kgfSB9LAoteyAiYWRkaSIsICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFNJIH0gfSwKLXsgImNhbCIsICAgICBPUCgxNCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLXsgInN1YmkiLCAgICBPUCgxNCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBOU0kgfSB9LAoteyAibGEiLAkgICAgIE9QKDE0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsaXMiLCAgICAgT1AoMTUpLAlEUkFfTUFTSywJUFBDQ09NLAkJeyBSVCwgU0lTSUdOT1BUIH0gfSwKLXsgImxpdSIsICAgICBPUCgxNSksCURSQV9NQVNLLAlQV1JDT00sCQl7IFJULCBTSVNJR05PUFQgfSB9LAoteyAiYWRkaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCxSQSxTSVNJR05PUFQgfSB9LAoteyAiY2F1IiwgICAgIE9QKDE1KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCxSQSxTSVNJR05PUFQgfSB9LAoteyAic3ViaXMiLCAgIE9QKDE1KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIE5TSSB9IH0sCi0KLXsgImJkbnotIiwgICBCQk8oMTYsQk9ETlosMCwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoteyAiYmRueisiLCAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCi17ICJiZG56IiwgICAgQkJPKDE2LEJPRE5aLDAsMCksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkQgfSB9LAoteyAiYmRuIiwgICAgIEJCTygxNixCT0ROWiwwLDApLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEIH0gfSwKLXsgImJkbnpsLSIsICBCQk8oMTYsQk9ETlosMCwxKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE0gfSB9LAoteyAiYmRuemwrIiwgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUCB9IH0sCi17ICJiZG56bCIsICAgQkJPKDE2LEJPRE5aLDAsMSksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkQgfSB9LAoteyAiYmRubCIsICAgIEJCTygxNixCT0ROWiwwLDEpLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEIH0gfSwKLXsgImJkbnphLSIsICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKLXsgImJkbnphKyIsICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKLXsgImJkbnphIiwgICBCQk8oMTYsQk9ETlosMSwwKSwgQkJPWUJJX01BU0ssIFBQQ0NPTSwJeyBCREEgfSB9LAoteyAiYmRuYSIsICAgIEJCTygxNixCT0ROWiwxLDApLCBCQk9ZQklfTUFTSywgUFdSQ09NLAl7IEJEQSB9IH0sCi17ICJiZG56bGEtIiwgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNQSB9IH0sCi17ICJiZG56bGErIiwgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQQSB9IH0sCi17ICJiZG56bGEiLCAgQkJPKDE2LEJPRE5aLDEsMSksIEJCT1lCSV9NQVNLLCBQUENDT00sCXsgQkRBIH0gfSwKLXsgImJkbmxhIiwgICBCQk8oMTYsQk9ETlosMSwxKSwgQkJPWUJJX01BU0ssIFBXUkNPTSwJeyBCREEgfSB9LAoteyAiYmR6LSIsICAgIEJCTygxNixCT0RaLDAsMCksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETSB9IH0sCi17ICJiZHorIiwgICAgQkJPKDE2LEJPRFosMCwwKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRQIH0gfSwKLXsgImJkeiIsICAgICBCQk8oMTYsQk9EWiwwLDApLCAgQkJPWUJJX01BU0ssIENPTSwJeyBCRCB9IH0sCi17ICJiZHpsLSIsICAgQkJPKDE2LEJPRFosMCwxKSwgIEJCT1lCSV9NQVNLLCBQUEMsCXsgQkRNIH0gfSwKLXsgImJkemwrIiwgICBCQk8oMTYsQk9EWiwwLDEpLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFAgfSB9LAoteyAiYmR6bCIsICAgIEJCTygxNixCT0RaLDAsMSksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEIH0gfSwKLXsgImJkemEtIiwgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRE1BIH0gfSwKLXsgImJkemErIiwgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIFBQQywJeyBCRFBBIH0gfSwKLXsgImJkemEiLCAgICBCQk8oMTYsQk9EWiwxLDApLCAgQkJPWUJJX01BU0ssIENPTSwJeyBCREEgfSB9LAoteyAiYmR6bGEtIiwgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJETUEgfSB9LAoteyAiYmR6bGErIiwgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgUFBDLAl7IEJEUEEgfSB9LAoteyAiYmR6bGEiLCAgIEJCTygxNixCT0RaLDEsMSksICBCQk9ZQklfTUFTSywgQ09NLAl7IEJEQSB9IH0sCi17ICJibHQtIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJsdCsiLCAgICBCQk9DQigxNixCT1QsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmx0IiwgICAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJsdGwtIiwgICBCQk9DQigxNixCT1QsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmx0bCsiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibHRsIiwgICAgQkJPQ0IoMTYsQk9ULENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmx0YS0iLCAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmx0YSsiLCAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmx0YSIsICAgIEJCT0NCKDE2LEJPVCxDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibHRsYS0iLCAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibHRsYSsiLCAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibHRsYSIsICAgQkJPQ0IoMTYsQk9ULENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJndC0iLCAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmd0KyIsICAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJiZ3QiLCAgICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmd0bC0iLCAgIEJCT0NCKDE2LEJPVCxDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZ3RsKyIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJndGwiLCAgICBCQk9DQigxNixCT1QsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZ3RhLSIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJiZ3RhKyIsICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJiZ3RhIiwgICAgQkJPQ0IoMTYsQk9ULENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJndGxhLSIsICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJndGxhKyIsICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJndGxhIiwgICBCQk9DQigxNixCT1QsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmVxLSIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZXErIiwgICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJlcSIsICAgICBCQk9DQigxNixCT1QsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZXFsLSIsICAgQkJPQ0IoMTYsQk9ULENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJlcWwrIiwgICBCQk9DQigxNixCT1QsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmVxbCIsICAgIEJCT0NCKDE2LEJPVCxDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJlcWEtIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJlcWErIiwgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJlcWEiLCAgICBCQk9DQigxNixCT1QsQ0JFUSwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmVxbGEtIiwgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmVxbGErIiwgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmVxbGEiLCAgIEJCT0NCKDE2LEJPVCxDQkVRLDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJic28tIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJzbysiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYnNvIiwgICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJzb2wtIiwgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYnNvbCsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJic29sIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYnNvYS0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYnNvYSsiLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYnNvYSIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJic29sYS0iLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJic29sYSsiLCAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJic29sYSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJ1bi0iLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYnVuKyIsICAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJidW4iLCAgICAgQkJPQ0IoMTYsQk9ULENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkQgfSB9LAoteyAiYnVubC0iLCAgIEJCT0NCKDE2LEJPVCxDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJidW5sKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJ1bmwiLCAgICBCQk9DQigxNixCT1QsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCi17ICJidW5hLSIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJidW5hKyIsICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJidW5hIiwgICAgQkJPQ0IoMTYsQk9ULENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQ0NPTSwgeyBDUiwgQkRBIH0gfSwKLXsgImJ1bmxhLSIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJ1bmxhKyIsICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJ1bmxhIiwgICBCQk9DQigxNixCT1QsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoteyAiYmdlLSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJiZ2UrIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJnZSIsICAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJiZ2VsLSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJnZWwrIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYmdlbCIsICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJnZWEtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJnZWErIiwgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJnZWEiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYmdlbGEtIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYmdlbGErIiwgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYmdlbGEiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmwtIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJubCsiLCAgICBCQk9DQigxNixCT0YsQ0JMVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5sIiwgICAgIEJCT0NCKDE2LEJPRixDQkxULDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJubGwtIiwgICBCQk9DQigxNixCT0YsQ0JMVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5sbCsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmxsIiwgICAgQkJPQ0IoMTYsQk9GLENCTFQsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5sYS0iLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5sYSsiLCAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5sYSIsICAgIEJCT0NCKDE2LEJPRixDQkxULDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmxsYS0iLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmxsYSsiLCAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmxsYSIsICAgQkJPQ0IoMTYsQk9GLENCTFQsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJsZS0iLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYmxlKyIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibGUiLCAgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYmxlbC0iLCAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibGVsKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJsZWwiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibGVhLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibGVhKyIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibGVhIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJsZWxhLSIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJsZWxhKyIsICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJsZWxhIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5nLSIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibmcrIiwgICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuZyIsICAgICBCQk9DQigxNixCT0YsQ0JHVCwwLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibmdsLSIsICAgQkJPQ0IoMTYsQk9GLENCR1QsMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuZ2wrIiwgICBCQk9DQigxNixCT0YsQ0JHVCwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5nbCIsICAgIEJCT0NCKDE2LEJPRixDQkdULDAsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuZ2EtIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuZ2ErIiwgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuZ2EiLCAgICBCQk9DQigxNixCT0YsQ0JHVCwxLDApLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm5nbGEtIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5nbGErIiwgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5nbGEiLCAgIEJCT0NCKDE2LEJPRixDQkdULDEsMSksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmUtIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJuZSsiLCAgICBCQk9DQigxNixCT0YsQ0JFUSwwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm5lIiwgICAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEIH0gfSwKLXsgImJuZWwtIiwgICBCQk9DQigxNixCT0YsQ0JFUSwwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5lbCsiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibmVsIiwgICAgQkJPQ0IoMTYsQk9GLENCRVEsMCwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5lYS0iLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm5lYSsiLCAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm5lYSIsICAgIEJCT0NCKDE2LEJPRixDQkVRLDEsMCksIEJCT1lDQl9NQVNLLCBDT00sCXsgQ1IsIEJEQSB9IH0sCi17ICJibmVsYS0iLCAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibmVsYSsiLCAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibmVsYSIsICAgQkJPQ0IoMTYsQk9GLENCRVEsMSwxKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJucy0iLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE0gfSB9LAoteyAiYm5zKyIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUCB9IH0sCi17ICJibnMiLCAgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkQgfSB9LAoteyAiYm5zbC0iLCAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibnNsKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJuc2wiLCAgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCRCB9IH0sCi17ICJibnNhLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNQSB9IH0sCi17ICJibnNhKyIsICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQQSB9IH0sCi17ICJibnNhIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMSwwKSwgQkJPWUNCX01BU0ssIENPTSwJeyBDUiwgQkRBIH0gfSwKLXsgImJuc2xhLSIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJuc2xhKyIsICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJuc2xhIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDEpLCBCQk9ZQ0JfTUFTSywgQ09NLAl7IENSLCBCREEgfSB9LAoteyAiYm51LSIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMCksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETSB9IH0sCi17ICJibnUrIiwgICAgQkJPQ0IoMTYsQk9GLENCU08sMCwwKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRQIH0gfSwKLXsgImJudSIsICAgICBCQk9DQigxNixCT0YsQ0JTTywwLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCRCB9IH0sCi17ICJibnVsLSIsICAgQkJPQ0IoMTYsQk9GLENCU08sMCwxKSwgQkJPWUNCX01BU0ssIFBQQywJeyBDUiwgQkRNIH0gfSwKLXsgImJudWwrIiwgICBCQk9DQigxNixCT0YsQ0JTTywwLDEpLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFAgfSB9LAoteyAiYm51bCIsICAgIEJCT0NCKDE2LEJPRixDQlNPLDAsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEIH0gfSwKLXsgImJudWEtIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRE1BIH0gfSwKLXsgImJudWErIiwgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDLAl7IENSLCBCRFBBIH0gfSwKLXsgImJudWEiLCAgICBCQk9DQigxNixCT0YsQ0JTTywxLDApLCBCQk9ZQ0JfTUFTSywgUFBDQ09NLCB7IENSLCBCREEgfSB9LAoteyAiYm51bGEtIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJETUEgfSB9LAoteyAiYm51bGErIiwgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUEMsCXsgQ1IsIEJEUEEgfSB9LAoteyAiYm51bGEiLCAgIEJCT0NCKDE2LEJPRixDQlNPLDEsMSksIEJCT1lDQl9NQVNLLCBQUENDT00sIHsgQ1IsIEJEQSB9IH0sCi17ICJiZG56dC0iLCAgQkJPKDE2LEJPRE5aVCwwLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNIH0gfSwKLXsgImJkbnp0KyIsICBCQk8oMTYsQk9ETlpULDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFAgfSB9LAoteyAiYmRuenQiLCAgIEJCTygxNixCT0ROWlQsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkbnp0bC0iLCBCQk8oMTYsQk9ETlpULDAsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuenRsKyIsIEJCTygxNixCT0ROWlQsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCi17ICJiZG56dGwiLCAgQkJPKDE2LEJPRE5aVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuenRhLSIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETUEgfSB9LAoteyAiYmRuenRhKyIsIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUEEgfSB9LAoteyAiYmRuenRhIiwgIEJCTygxNixCT0ROWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZG56dGxhLSIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56dGxhKyIsQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56dGxhIiwgQkJPKDE2LEJPRE5aVCwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnpmLSIsICBCQk8oMTYsQk9ETlpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE0gfSB9LAoteyAiYmRuemYrIiwgIEJCTygxNixCT0ROWkYsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJEUCB9IH0sCi17ICJiZG56ZiIsICAgQkJPKDE2LEJPRE5aRiwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmRuemZsLSIsIEJCTygxNixCT0ROWkYsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCXsgQkksIEJETSB9IH0sCi17ICJiZG56ZmwrIiwgQkJPKDE2LEJPRE5aRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQIH0gfSwKLXsgImJkbnpmbCIsICBCQk8oMTYsQk9ETlpGLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZG56ZmEtIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRNQSB9IH0sCi17ICJiZG56ZmErIiwgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJeyBCSSwgQkRQQSB9IH0sCi17ICJiZG56ZmEiLCAgQkJPKDE2LEJPRE5aRiwxLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJkbnpmbGEtIixCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRE1BIH0gfSwKLXsgImJkbnpmbGErIixCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDLAl7IEJJLCBCRFBBIH0gfSwKLXsgImJkbnpmbGEiLCBCQk8oMTYsQk9ETlpGLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYnQtIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYnQrIiwgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYnQiLAkgICAgIEJCTygxNixCT1QsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJidCIsICAgICBCQk8oMTYsQk9ULDAsMCksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJidGwtIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJidGwrIiwgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJidGwiLCAgICAgQkJPKDE2LEJPVCwwLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmJ0bCIsICAgIEJCTygxNixCT1QsMCwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEIH0gfSwKLXsgImJ0YS0iLCAgICBCQk8oMTYsQk9ULDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJidGErIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYnRhIiwgICAgIEJCTygxNixCT1QsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYnRhIiwgICAgQkJPKDE2LEJPVCwxLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJ0bGEtIiwgICBCQk8oMTYsQk9ULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJidGxhKyIsICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYnRsYSIsICAgIEJCTygxNixCT1QsMSwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiYnRsYSIsICAgQkJPKDE2LEJPVCwxLDEpLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJmLSIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJmKyIsICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJmIiwJICAgICBCQk8oMTYsQk9GLDAsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiYmYiLCAgICAgQkJPKDE2LEJPRiwwLDApLCBCQk9ZX01BU0ssIFBXUkNPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmZsLSIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmZsKyIsICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmZsIiwgICAgIEJCTygxNixCT0YsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJiZmwiLCAgICBCQk8oMTYsQk9GLDAsMSksIEJCT1lfTUFTSywgUFdSQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZmEtIiwgICAgQkJPKDE2LEJPRiwxLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmZhKyIsICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJmYSIsICAgICBCQk8oMTYsQk9GLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJmYSIsICAgIEJCTygxNixCT0YsMSwwKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZmxhLSIsICAgQkJPKDE2LEJPRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmZsYSsiLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJmbGEiLCAgICBCQk8oMTYsQk9GLDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmJmbGEiLCAgIEJCTygxNixCT0YsMSwxKSwgQkJPWV9NQVNLLCBQV1JDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZHp0LSIsICAgQkJPKDE2LEJPRFpULDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNIH0gfSwKLXsgImJkenQrIiwgICBCQk8oMTYsQk9EWlQsMCwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFAgfSB9LAoteyAiYmR6dCIsICAgIEJCTygxNixCT0RaVCwwLDApLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkQgfSB9LAoteyAiYmR6dGwtIiwgIEJCTygxNixCT0RaVCwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZHp0bCsiLCAgQkJPKDE2LEJPRFpULDAsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJkenRsIiwgICBCQk8oMTYsQk9EWlQsMCwxKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkenRhLSIsICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE1BIH0gfSwKLXsgImJkenRhKyIsICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRFBBIH0gfSwKLXsgImJkenRhIiwgICBCQk8oMTYsQk9EWlQsMSwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEQSB9IH0sCi17ICJiZHp0bGEtIiwgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHp0bGErIiwgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHp0bGEiLCAgQkJPKDE2LEJPRFpULDEsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6Zi0iLCAgIEJCTygxNixCT0RaRiwwLDApLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETSB9IH0sCi17ICJiZHpmKyIsICAgQkJPKDE2LEJPRFpGLDAsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQIH0gfSwKLXsgImJkemYiLCAgICBCQk8oMTYsQk9EWkYsMCwwKSwgQkJPWV9NQVNLLCBQUENDT00sCXsgQkksIEJEIH0gfSwKLXsgImJkemZsLSIsICBCQk8oMTYsQk9EWkYsMCwxKSwgQkJPWV9NQVNLLCBQUEMsCQl7IEJJLCBCRE0gfSB9LAoteyAiYmR6ZmwrIiwgIEJCTygxNixCT0RaRiwwLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUCB9IH0sCi17ICJiZHpmbCIsICAgQkJPKDE2LEJPRFpGLDAsMSksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCRCB9IH0sCi17ICJiZHpmYS0iLCAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRNQSB9IH0sCi17ICJiZHpmYSsiLCAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDLAkJeyBCSSwgQkRQQSB9IH0sCi17ICJiZHpmYSIsICAgQkJPKDE2LEJPRFpGLDEsMCksIEJCT1lfTUFTSywgUFBDQ09NLAl7IEJJLCBCREEgfSB9LAoteyAiYmR6ZmxhLSIsIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJETUEgfSB9LAoteyAiYmR6ZmxhKyIsIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQywJCXsgQkksIEJEUEEgfSB9LAoteyAiYmR6ZmxhIiwgIEJCTygxNixCT0RaRiwxLDEpLCBCQk9ZX01BU0ssIFBQQ0NPTSwJeyBCSSwgQkRBIH0gfSwKLXsgImJjLSIsICAgICBCKDE2LDAsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNIH0gfSwKLXsgImJjKyIsICAgICBCKDE2LDAsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQIH0gfSwKLXsgImJjIiwJICAgICBCKDE2LDAsMCksCUJfTUFTSywJCUNPTSwJCXsgQk8sIEJJLCBCRCB9IH0sCi17ICJiY2wtIiwgICAgQigxNiwwLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJETSB9IH0sCi17ICJiY2wrIiwgICAgQigxNiwwLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJEUCB9IH0sCi17ICJiY2wiLCAgICAgQigxNiwwLDEpLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkQgfSB9LAoteyAiYmNhLSIsICAgIEIoMTYsMSwwKSwJQl9NQVNLLAkJUFBDLAkJeyBCT0UsIEJJLCBCRE1BIH0gfSwKLXsgImJjYSsiLCAgICBCKDE2LDEsMCksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRQQSB9IH0sCi17ICJiY2EiLCAgICAgQigxNiwxLDApLAlCX01BU0ssCQlDT00sCQl7IEJPLCBCSSwgQkRBIH0gfSwKLXsgImJjbGEtIiwgICBCKDE2LDEsMSksCUJfTUFTSywJCVBQQywJCXsgQk9FLCBCSSwgQkRNQSB9IH0sCi17ICJiY2xhKyIsICAgQigxNiwxLDEpLAlCX01BU0ssCQlQUEMsCQl7IEJPRSwgQkksIEJEUEEgfSB9LAoteyAiYmNsYSIsICAgIEIoMTYsMSwxKSwJQl9NQVNLLAkJQ09NLAkJeyBCTywgQkksIEJEQSB9IH0sCi0KLXsgInNjIiwgICAgICBTQygxNywxLDApLCAweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAoteyAic3ZjIiwgICAgIFNDKDE3LDAsMCksIFNDX01BU0ssCVBPV0VSLAkJeyBMRVYsIEZMMSwgRkwyIH0gfSwKLXsgInN2Y2wiLCAgICBTQygxNywwLDEpLCBTQ19NQVNLLAlQT1dFUiwJCXsgTEVWLCBGTDEsIEZMMiB9IH0sCi17ICJzdmNhIiwgICAgU0MoMTcsMSwwKSwgU0NfTUFTSywJUFdSQ09NLAkJeyBTViB9IH0sCi17ICJzdmNsYSIsICAgU0MoMTcsMSwxKSwgU0NfTUFTSywJUE9XRVIsCQl7IFNWIH0gfSwKLQoteyAiYiIsCSAgICAgQigxOCwwLDApLAlCX01BU0ssCQlDT00sCXsgTEkgfSB9LAoteyAiYmwiLCAgICAgIEIoMTgsMCwxKSwJQl9NQVNLLAkJQ09NLAl7IExJIH0gfSwKLXsgImJhIiwgICAgICBCKDE4LDEsMCksCUJfTUFTSywJCUNPTSwJeyBMSUEgfSB9LAoteyAiYmxhIiwgICAgIEIoMTgsMSwxKSwJQl9NQVNLLAkJQ09NLAl7IExJQSB9IH0sCi0KLXsgIm1jcmYiLCAgICBYTCgxOSwwKSwJWExCQl9NQVNLfCgzPDwyMSl8KDM8PDE2KSwgQ09NLAl7IEJGLCBCRkEgfSB9LAotCi17ICJibHIiLCAgICAgWExPKDE5LEJPVSwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYnIiLCAgICAgIFhMTygxOSxCT1UsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBXUkNPTSwJeyAwIH0gfSwKLXsgImJscmwiLCAgICBYTE8oMTksQk9VLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJicmwiLCAgICAgWExPKDE5LEJPVSwxNiwxKSwgWExCT0JJQkJfTUFTSywgUFdSQ09NLAl7IDAgfSB9LAoteyAiYmRuemxyIiwgIFhMTygxOSxCT0ROWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDQ09NLAl7IDAgfSB9LAoteyAiYmRuemxyLSIsIFhMTygxOSxCT0ROWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmRuemxyKyIsIFhMTygxOSxCT0ROWlAsMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkbnpscmwiLCBYTE8oMTksQk9ETlosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkbnpscmwtIixYTE8oMTksQk9ETlosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkbnpscmwrIixYTE8oMTksQk9ETlpQLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUEMsCXsgMCB9IH0sCi17ICJiZHpsciIsICAgWExPKDE5LEJPRFosMTYsMCksIFhMQk9CSUJCX01BU0ssIFBQQ0NPTSwJeyAwIH0gfSwKLXsgImJkemxyLSIsICBYTE8oMTksQk9EWiwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmR6bHIrIiwgIFhMTygxOSxCT0RaUCwxNiwwKSwgWExCT0JJQkJfTUFTSywgUFBDLAl7IDAgfSB9LAoteyAiYmR6bHJsIiwgIFhMTygxOSxCT0RaLDE2LDEpLCBYTEJPQklCQl9NQVNLLCBQUENDT00sCXsgMCB9IH0sCi17ICJiZHpscmwtIiwgWExPKDE5LEJPRFosMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJkemxybCsiLCBYTE8oMTksQk9EWlAsMTYsMSksIFhMQk9CSUJCX01BU0ssIFBQQywJeyAwIH0gfSwKLXsgImJsdGxyIiwgICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsdGxyLSIsICBYTE9DQigxOSxCT1QsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsdGxyKyIsICBYTE9DQigxOSxCT1RQLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibHRyIiwgICAgWExPQ0IoMTksQk9ULENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibHRscmwiLCAgWExPQ0IoMTksQk9ULENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibHRscmwtIiwgWExPQ0IoMTksQk9ULENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibHRscmwrIiwgWExPQ0IoMTksQk9UUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmx0cmwiLCAgIFhMT0NCKDE5LEJPVCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmd0bHIiLCAgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmd0bHItIiwgIFhMT0NCKDE5LEJPVCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmd0bHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJndHIiLCAgICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJndGxybCIsICBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJndGxybC0iLCBYTE9DQigxOSxCT1QsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJndGxybCsiLCBYTE9DQigxOSxCT1RQLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ3RybCIsICAgWExPQ0IoMTksQk9ULENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJiZXFsciIsICAgWExPQ0IoMTksQk9ULENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZXFsci0iLCAgWExPQ0IoMTksQk9ULENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZXFscisiLCAgWExPQ0IoMTksQk9UUCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmVxciIsICAgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHJsIiwgIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmVxbHJsLSIsIFhMT0NCKDE5LEJPVCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmVxbHJsKyIsIFhMT0NCKDE5LEJPVFAsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJlcXJsIiwgICBYTE9DQigxOSxCT1QsQ0JFUSwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJzb2xyIiwgICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJzb2xyLSIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJzb2xyKyIsICBYTE9DQigxOSxCT1RQLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJic29yIiwgICAgWExPQ0IoMTksQk9ULENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJic29scmwiLCAgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJic29scmwtIiwgWExPQ0IoMTksQk9ULENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJic29scmwrIiwgWExPQ0IoMTksQk9UUCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnNvcmwiLCAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYnVubHIiLCAgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYnVubHItIiwgIFhMT0NCKDE5LEJPVCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYnVubHIrIiwgIFhMT0NCKDE5LEJPVFAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ1bmxybCIsICBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJ1bmxybC0iLCBYTE9DQigxOSxCT1QsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ1bmxybCsiLCBYTE9DQigxOSxCT1RQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VsciIsICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJiZ2Vsci0iLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJiZ2VscisiLCAgWExPQ0IoMTksQk9GUCxDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlciIsICAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHJsIiwgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmdlbHJsLSIsIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmdlbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJnZXJsIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJubGxyIiwgICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJubGxyLSIsICBYTE9DQigxOSxCT0YsQ0JMVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJubGxyKyIsICBYTE9DQigxOSxCT0ZQLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmxyIiwgICAgWExPQ0IoMTksQk9GLENCTFQsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmxscmwiLCAgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmxscmwtIiwgWExPQ0IoMTksQk9GLENCTFQsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmxscmwrIiwgWExPQ0IoMTksQk9GUCxDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5scmwiLCAgIFhMT0NCKDE5LEJPRixDQkxULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYmxlbHIiLCAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYmxlbHItIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYmxlbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsZXIiLCAgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJsZWxybCIsICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJsZWxybC0iLCBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJsZWxybCsiLCBYTE9DQigxOSxCT0ZQLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibGVybCIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmdsciIsICAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmdsci0iLCAgWExPQ0IoMTksQk9GLENCR1QsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmdscisiLCAgWExPQ0IoMTksQk9GUCxDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5nciIsICAgIFhMT0NCKDE5LEJPRixDQkdULDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHJsIiwgIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5nbHJsLSIsIFhMT0NCKDE5LEJPRixDQkdULDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5nbHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZ3JsIiwgICBYTE9DQigxOSxCT0YsQ0JHVCwxNiwxKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuZWxyIiwgICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuZWxyLSIsICBYTE9DQigxOSxCT0YsQ0JFUSwxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuZWxyKyIsICBYTE9DQigxOSxCT0ZQLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmVyIiwgICAgWExPQ0IoMTksQk9GLENCRVEsMTYsMCksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibmVscmwiLCAgWExPQ0IoMTksQk9GLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibmVscmwtIiwgWExPQ0IoMTksQk9GLENCRVEsMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibmVscmwrIiwgWExPQ0IoMTksQk9GUCxDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5lcmwiLCAgIFhMT0NCKDE5LEJPRixDQkVRLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQV1JDT00sIHsgQ1IgfSB9LAoteyAiYm5zbHIiLCAgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm5zbHItIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm5zbHIrIiwgIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuc3IiLCAgICBYTE9DQigxOSxCT0YsQ0JTTywxNiwwKSwgWExCT0NCQkJfTUFTSywgUFdSQ09NLCB7IENSIH0gfSwKLXsgImJuc2xybCIsICBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDQ09NLCB7IENSIH0gfSwKLXsgImJuc2xybC0iLCBYTE9DQigxOSxCT0YsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJuc2xybCsiLCBYTE9DQigxOSxCT0ZQLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnNybCIsICAgWExPQ0IoMTksQk9GLENCU08sMTYsMSksIFhMQk9DQkJCX01BU0ssIFBXUkNPTSwgeyBDUiB9IH0sCi17ICJibnVsciIsICAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQ0NPTSwgeyBDUiB9IH0sCi17ICJibnVsci0iLCAgWExPQ0IoMTksQk9GLENCU08sMTYsMCksIFhMQk9DQkJCX01BU0ssIFBQQywgeyBDUiB9IH0sCi17ICJibnVscisiLCAgWExPQ0IoMTksQk9GUCxDQlNPLDE2LDApLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm51bHJsIiwgIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUENDT00sIHsgQ1IgfSB9LAoteyAiYm51bHJsLSIsIFhMT0NCKDE5LEJPRixDQlNPLDE2LDEpLCBYTEJPQ0JCQl9NQVNLLCBQUEMsIHsgQ1IgfSB9LAoteyAiYm51bHJsKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTywxNiwxKSwgWExCT0NCQkJfTUFTSywgUFBDLCB7IENSIH0gfSwKLXsgImJ0bHIiLCAgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0bHItIiwgICBYTE8oMTksQk9ULDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJ0bHIrIiwgICBYTE8oMTksQk9UUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiYnRyIiwgICAgWExPKDE5LEJPVCwxNiwwKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJidGxybCIsICAgWExPKDE5LEJPVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJidGxybC0iLCAgWExPKDE5LEJPVCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGxybCsiLCAgWExPKDE5LEJPVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmJ0cmwiLCAgIFhMTygxOSxCT1QsMTYsMSksIFhMQk9CQl9NQVNLLCBQV1JDT00sCXsgQkkgfSB9LAoteyAiYmZsciIsICAgIFhMTygxOSxCT0YsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmZsci0iLCAgIFhMTygxOSxCT0YsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZscisiLCAgIFhMTygxOSxCT0ZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJiZnIiLCAgICBYTE8oMTksQk9GLDE2LDApLCBYTEJPQkJfTUFTSywgUFdSQ09NLAl7IEJJIH0gfSwKLXsgImJmbHJsIiwgICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmbHJsLSIsICBYTE8oMTksQk9GLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJmbHJsKyIsICBYTE8oMTksQk9GUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiYmZybCIsICAgWExPKDE5LEJPRiwxNiwxKSwgWExCT0JCX01BU0ssIFBXUkNPTSwJeyBCSSB9IH0sCi17ICJiZG56dGxyIiwgWExPKDE5LEJPRE5aVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZG56dGxyLSIsWExPKDE5LEJPRE5aVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56dGxyKyIsWExPKDE5LEJPRE5aVFAsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuenRscmwiLFhMTygxOSxCT0ROWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuenRscmwtIixYTE8oMTksQk9ETlpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnp0bHJsKyIsWExPKDE5LEJPRE5aVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuemZsciIsIFhMTygxOSxCT0ROWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmRuemZsci0iLFhMTygxOSxCT0ROWkYsMTYsMCksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmRuemZscisiLFhMTygxOSxCT0ROWkZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsIixYTE8oMTksQk9ETlpGLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkbnpmbHJsLSIsWExPKDE5LEJPRE5aRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZG56ZmxybCsiLFhMTygxOSxCT0ROWkZQLDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkenRsciIsICBYTE8oMTksQk9EWlQsMTYsMCksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6dGxyLSIsIFhMTygxOSxCT0RaVCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHp0bHIrIiwgWExPKDE5LEJPRFpUUCwxNiwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHp0bHJsIiwgWExPKDE5LEJPRFpULDE2LDEpLCBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJkenRscmwtIixYTE8oMTksQk9EWlQsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6dGxybCsiLFhMTygxOSxCT0RaVFAsMTYsMSksIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmR6ZmxyIiwgIFhMTygxOSxCT0RaRiwxNiwwKSwgWExCT0JCX01BU0ssIFBQQ0NPTSwJeyBCSSB9IH0sCi17ICJiZHpmbHItIiwgWExPKDE5LEJPRFpGLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkemZscisiLCBYTE8oMTksQk9EWkZQLDE2LDApLCBYTEJPQkJfTUFTSywgUFBDLAl7IEJJIH0gfSwKLXsgImJkemZscmwiLCBYTE8oMTksQk9EWkYsMTYsMSksIFhMQk9CQl9NQVNLLCBQUENDT00sCXsgQkkgfSB9LAoteyAiYmR6ZmxybC0iLFhMTygxOSxCT0RaRiwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZHpmbHJsKyIsWExPKDE5LEJPRFpGUCwxNiwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiY2xyIiwgICAgWExMSygxOSwxNiwwKSwgWExZQkJfTUFTSywJUFBDQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNscmwiLCAgIFhMTEsoMTksMTYsMSksIFhMWUJCX01BU0ssCVBQQ0NPTSwJCXsgQk8sIEJJIH0gfSwKLXsgImJjbHIrIiwgICBYTFlMSygxOSwxNiwxLDApLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoteyAiYmNscmwrIiwgIFhMWUxLKDE5LDE2LDEsMSksIFhMWUJCX01BU0ssIFBQQywJCXsgQk9FLCBCSSB9IH0sCi17ICJiY2xyLSIsICAgWExZTEsoMTksMTYsMCwwKSwgWExZQkJfTUFTSywgUFBDLAkJeyBCT0UsIEJJIH0gfSwKLXsgImJjbHJsLSIsICBYTFlMSygxOSwxNiwwLDEpLCBYTFlCQl9NQVNLLCBQUEMsCQl7IEJPRSwgQkkgfSB9LAoteyAiYmNyIiwgICAgIFhMTEsoMTksMTYsMCksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAoteyAiYmNybCIsICAgIFhMTEsoMTksMTYsMSksIFhMQkJfTUFTSywJUFdSQ09NLAkJeyBCTywgQkkgfSB9LAotCi17ICJjcm5vdCIsICAgWEwoMTksMzMpLCBYTF9NQVNLLAlQUENDT00sCQl7IEJULCBCQSwgQkJBIH0gfSwKLXsgImNybm9yIiwgICBYTCgxOSwzMyksCVhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgInJmaSIsICAgICBYTCgxOSw1MCksCTB4ZmZmZmZmZmYsCUNPTSwJCXsgMCB9IH0sCi17ICJyZmNpIiwgICAgWEwoMTksNTEpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJyZnN2YyIsICAgWEwoMTksODIpLAkweGZmZmZmZmZmLAlQT1dFUiwJCXsgMCB9IH0sCi0KLXsgImNyYW5kYyIsICBYTCgxOSwxMjkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJpc3luYyIsICAgWEwoMTksMTUwKSwgMHhmZmZmZmZmZiwJUFBDQ09NLAkJeyAwIH0gfSwKLXsgImljcyIsICAgICBYTCgxOSwxNTApLCAweGZmZmZmZmZmLAlQV1JDT00sCQl7IDAgfSB9LAotCi17ICJjcmNsciIsICAgWEwoMTksMTkzKSwgWExfTUFTSywJUFBDQ09NLAkJeyBCVCwgQkFULCBCQkEgfSB9LAoteyAiY3J4b3IiLCAgIFhMKDE5LDE5MyksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImNybmFuZCIsICBYTCgxOSwyMjUpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcmFuZCIsICAgWEwoMTksMjU3KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3JzZXQiLCAgIFhMKDE5LDI4OSksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBVCwgQkJBIH0gfSwKLXsgImNyZXF2IiwgICBYTCgxOSwyODkpLCBYTF9NQVNLLAlDT00sCQl7IEJULCBCQSwgQkIgfSB9LAotCi17ICJjcm9yYyIsICAgWEwoMTksNDE3KSwgWExfTUFTSywJQ09NLAkJeyBCVCwgQkEsIEJCIH0gfSwKLQoteyAiY3Jtb3ZlIiwgIFhMKDE5LDQ0OSksIFhMX01BU0ssCVBQQ0NPTSwJCXsgQlQsIEJBLCBCQkEgfSB9LAoteyAiY3JvciIsICAgIFhMKDE5LDQ0OSksIFhMX01BU0ssCUNPTSwJCXsgQlQsIEJBLCBCQiB9IH0sCi0KLXsgImJjdHIiLCAgICBYTE8oMTksQk9VLDUyOCwwKSwgWExCT0JJQkJfTUFTSywgQ09NLAl7IDAgfSB9LAoteyAiYmN0cmwiLCAgIFhMTygxOSxCT1UsNTI4LDEpLCBYTEJPQklCQl9NQVNLLCBDT00sCXsgMCB9IH0sCi17ICJibHRjdHIiLCAgWExPQ0IoMTksQk9ULENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsdGN0ci0iLCBYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmx0Y3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibHRjdHJsIiwgWExPQ0IoMTksQk9ULENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsdGN0cmwtIixYTE9DQigxOSxCT1QsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmx0Y3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ3RjdHIiLCAgWExPQ0IoMTksQk9ULENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJndGN0ci0iLCBYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmd0Y3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ3RjdHJsIiwgWExPQ0IoMTksQk9ULENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJndGN0cmwtIixYTE9DQigxOSxCT1QsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmd0Y3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZXFjdHIiLCAgWExPQ0IoMTksQk9ULENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJlcWN0ci0iLCBYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmVxY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JFUSw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZXFjdHJsIiwgWExPQ0IoMTksQk9ULENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJlcWN0cmwtIixYTE9DQigxOSxCT1QsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmVxY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JFUSw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJic29jdHIiLCAgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJzb2N0ci0iLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnNvY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJic29jdHJsIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJzb2N0cmwtIixYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnNvY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidW5jdHIiLCAgWExPQ0IoMTksQk9ULENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJ1bmN0ci0iLCBYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnVuY3RyKyIsIFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidW5jdHJsIiwgWExPQ0IoMTksQk9ULENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJ1bmN0cmwtIixYTE9DQigxOSxCT1QsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYnVuY3RybCsiLFhMT0NCKDE5LEJPVFAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ2VjdHIiLCAgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJnZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmdlY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJiZ2VjdHJsIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJnZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmdlY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmxjdHIiLCAgWExPQ0IoMTksQk9GLENCTFQsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJubGN0ci0iLCBYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5sY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmxjdHJsIiwgWExPQ0IoMTksQk9GLENCTFQsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJubGN0cmwtIixYTE9DQigxOSxCT0YsQ0JMVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5sY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JMVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibGVjdHIiLCAgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmxlY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibGVjdHJsIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJsZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYmxlY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmdjdHIiLCAgWExPQ0IoMTksQk9GLENCR1QsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZ2N0ci0iLCBYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5nY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmdjdHJsIiwgWExPQ0IoMTksQk9GLENCR1QsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZ2N0cmwtIixYTE9DQigxOSxCT0YsQ0JHVCw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5nY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JHVCw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmVjdHIiLCAgWExPQ0IoMTksQk9GLENCRVEsNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5lY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JFUSw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibmVjdHJsIiwgWExPQ0IoMTksQk9GLENCRVEsNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuZWN0cmwtIixYTE9DQigxOSxCT0YsQ0JFUSw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5lY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JFUSw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnNjdHIiLCAgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuc2N0ci0iLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5zY3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnNjdHJsIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJuc2N0cmwtIixYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm5zY3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnVjdHIiLCAgWExPQ0IoMTksQk9GLENCU08sNTI4LDApLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJudWN0ci0iLCBYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMCksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm51Y3RyKyIsIFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMCksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJibnVjdHJsIiwgWExPQ0IoMTksQk9GLENCU08sNTI4LDEpLCAgWExCT0NCQkJfTUFTSywgUFBDQ09NLAl7IENSIH0gfSwKLXsgImJudWN0cmwtIixYTE9DQigxOSxCT0YsQ0JTTyw1MjgsMSksICBYTEJPQ0JCQl9NQVNLLCBQUEMsCXsgQ1IgfSB9LAoteyAiYm51Y3RybCsiLFhMT0NCKDE5LEJPRlAsQ0JTTyw1MjgsMSksIFhMQk9DQkJCX01BU0ssIFBQQywJeyBDUiB9IH0sCi17ICJidGN0ciIsICAgWExPKDE5LEJPVCw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0Y3RyLSIsICBYTE8oMTksQk9ULDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRjdHIrIiwgIFhMTygxOSxCT1RQLDUyOCwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJidGN0cmwiLCAgWExPKDE5LEJPVCw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJ0Y3RybC0iLCBYTE8oMTksQk9ULDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYnRjdHJsKyIsIFhMTygxOSxCT1RQLDUyOCwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmN0ciIsICAgWExPKDE5LEJPRiw1MjgsMCksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmY3RyLSIsICBYTE8oMTksQk9GLDUyOCwwKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZjdHIrIiwgIFhMTygxOSxCT0ZQLDUyOCwwKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiZmN0cmwiLCAgWExPKDE5LEJPRiw1MjgsMSksICBYTEJPQkJfTUFTSywgUFBDQ09NLAl7IEJJIH0gfSwKLXsgImJmY3RybC0iLCBYTE8oMTksQk9GLDUyOCwxKSwgIFhMQk9CQl9NQVNLLCBQUEMsCXsgQkkgfSB9LAoteyAiYmZjdHJsKyIsIFhMTygxOSxCT0ZQLDUyOCwxKSwgWExCT0JCX01BU0ssIFBQQywJeyBCSSB9IH0sCi17ICJiY2N0ciIsICAgWExMSygxOSw1MjgsMCksICAgICBYTFlCQl9NQVNLLCAgUFBDQ09NLAl7IEJPLCBCSSB9IH0sCi17ICJiY2N0ci0iLCAgWExZTEsoMTksNTI4LDAsMCksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjdHIrIiwgIFhMWUxLKDE5LDUyOCwxLDApLCAgWExZQkJfTUFTSywgIFBQQywJeyBCT0UsIEJJIH0gfSwKLXsgImJjY3RybCIsICBYTExLKDE5LDUyOCwxKSwgICAgIFhMWUJCX01BU0ssICBQUENDT00sCXsgQk8sIEJJIH0gfSwKLXsgImJjY3RybC0iLCBYTFlMSygxOSw1MjgsMCwxKSwgIFhMWUJCX01BU0ssICBQUEMsCXsgQk9FLCBCSSB9IH0sCi17ICJiY2N0cmwrIiwgWExZTEsoMTksNTI4LDEsMSksICBYTFlCQl9NQVNLLCAgUFBDLAl7IEJPRSwgQkkgfSB9LAoteyAiYmNjIiwgICAgIFhMTEsoMTksNTI4LDApLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAoteyAiYmNjbCIsICAgIFhMTEsoMTksNTI4LDEpLCAgICAgWExCQl9NQVNLLCAgIFBXUkNPTSwJeyBCTywgQkkgfSB9LAotCi17ICJybHdpbWkiLCAgTSgyMCwwKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicmxpbWkiLCAgIE0oMjAsMCksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLQoteyAicmx3aW1pLiIsIE0oMjAsMSksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW1pLiIsICBNKDIwLDEpLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi0KLXsgInJvdGx3aSIsICBNTUUoMjEsMzEsMCksIE1NQk1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJjbHJsd2kiLCAgTU1FKDIxLDMxLDApLCBNU0hNRV9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgTUIgfSB9LAoteyAicmx3aW5tIiwgIE0oMjEsMCksCU1fTUFTSywJCVBQQ0NPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLXsgInJsaW5tIiwgICBNKDIxLDApLAlNX01BU0ssCQlQV1JDT00sCQl7IFJBLFJTLFNILE1CRSxNRSB9IH0sCi17ICJyb3Rsd2kuIiwgTU1FKDIxLDMxLDEpLCBNTUJNRV9NQVNLLAlQUENDT00sCQl7IFJBLFJTLFNIIH0gfSwKLXsgImNscmx3aS4iLCBNTUUoMjEsMzEsMSksIE1TSE1FX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBNQiB9IH0sCi17ICJybHdpbm0uIiwgTSgyMSwxKSwJTV9NQVNLLAkJUFBDQ09NLAkJeyBSQSxSUyxTSCxNQkUsTUUgfSB9LAoteyAicmxpbm0uIiwgIE0oMjEsMSksCU1fTUFTSywJCVBXUkNPTSwJCXsgUkEsUlMsU0gsTUJFLE1FIH0gfSwKLQoteyAicmxtaSIsICAgIE0oMjIsMCksCU1fTUFTSywJCU02MDEsCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG1pLiIsICAgTSgyMiwxKSwJTV9NQVNLLAkJTTYwMSwJCXsgUkEsUlMsUkIsTUJFLE1FIH0gfSwKLQoteyAicm90bHciLCAgIE1NRSgyMywzMSwwKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsd25tIiwgICBNKDIzLDApLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG5tIiwgICAgTSgyMywwKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAoteyAicm90bHcuIiwgIE1NRSgyMywzMSwxKSwgTU1CTUVfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsd25tLiIsICBNKDIzLDEpLAlNX01BU0ssCQlQUENDT00sCQl7IFJBLFJTLFJCLE1CRSxNRSB9IH0sCi17ICJybG5tLiIsICAgTSgyMywxKSwJTV9NQVNLLAkJUFdSQ09NLAkJeyBSQSxSUyxSQixNQkUsTUUgfSB9LAotCi17ICJub3AiLCAgICAgT1AoMjQpLAkweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAib3JpIiwgICAgIE9QKDI0KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgIm9yaWwiLCAgICBPUCgyNCksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgIm9yaXMiLCAgICBPUCgyNSksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJvcml1IiwgICAgT1AoMjUpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJ4b3JpIiwgICAgT1AoMjYpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAieG9yaWwiLCAgIE9QKDI2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAieG9yaXMiLCAgIE9QKDI3KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLXsgInhvcml1IiwgICBPUCgyNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi0KLXsgImFuZGkuIiwgICBPUCgyOCksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBVSSB9IH0sCi17ICJhbmRpbC4iLCAgT1AoMjgpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgVUkgfSB9LAotCi17ICJhbmRpcy4iLCAgT1AoMjkpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgVUkgfSB9LAoteyAiYW5kaXUuIiwgIE9QKDI5KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFVJIH0gfSwKLQoteyAicm90bGRpIiwgIE1EKDMwLDAsMCksIE1ETUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLXsgImNscmxkaSIsICBNRCgzMCwwLDApLCBNRFNIX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIE1CNiB9IH0sCi17ICJybGRpY2wiLCAgTUQoMzAsMCwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAoteyAicm90bGRpLiIsIE1EKDMwLDAsMSksIE1ETUJfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2IH0gfSwKLXsgImNscmxkaS4iLCBNRCgzMCwwLDEpLCBNRFNIX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIE1CNiB9IH0sCi17ICJybGRpY2wuIiwgTUQoMzAsMCwxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAotCi17ICJybGRpY3IiLCAgTUQoMzAsMSwwKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNRTYgfSB9LAoteyAicmxkaWNyLiIsIE1EKDMwLDEsMSksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUU2IH0gfSwKLQoteyAicmxkaWMiLCAgIE1EKDMwLDIsMCksIE1EX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiwgTUI2IH0gfSwKLXsgInJsZGljLiIsICBNRCgzMCwyLDEpLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi0KLXsgInJsZGltaSIsICBNRCgzMCwzLDApLCBNRF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYsIE1CNiB9IH0sCi17ICJybGRpbWkuIiwgTUQoMzAsMywxKSwgTURfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgU0g2LCBNQjYgfSB9LAotCi17ICJyb3RsZCIsICAgTURTKDMwLDgsMCksIE1EU01CX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInJsZGNsIiwgICBNRFMoMzAsOCwwKSwgTURTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCLCBNQjYgfSB9LAoteyAicm90bGQuIiwgIE1EUygzMCw4LDEpLCBNRFNNQl9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJybGRjbC4iLCAgTURTKDMwLDgsMSksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUI2IH0gfSwKLQoteyAicmxkY3IiLCAgIE1EUygzMCw5LDApLCBNRFNfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIsIE1FNiB9IH0sCi17ICJybGRjci4iLCAgTURTKDMwLDksMSksIE1EU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiwgTUU2IH0gfSwKLQoteyAiY21wdyIsICAgIFhDTVBMKDMxLDAsMCksIFhDTVBMX01BU0ssIFBQQ0NPTSwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wZCIsICAgIFhDTVBMKDMxLDAsMSksIFhDTVBMX01BU0ssIFBQQzY0LAkJeyBPQkYsIFJBLCBSQiB9IH0sCi17ICJjbXAiLCAgICAgWCgzMSwwKSwJWENNUF9NQVNLLAlQUENPTkxZLAl7IEJGLCBMLCBSQSwgUkIgfSB9LAoteyAiY21wIiwgICAgIFgoMzEsMCksCVhDTVBMX01BU0ssCVBXUkNPTSwJCXsgQkYsIFJBLCBSQiB9IH0sCi0KLXsgInR3bGd0IiwgICBYVE8oMzEsNCxUT0xHVCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bGd0IiwgICAgWFRPKDMxLDQsVE9MR1QpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbHQiLCAgIFhUTygzMSw0LFRPTExUKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbHQiLCAgICBYVE8oMzEsNCxUT0xMVCksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2VxIiwgICAgWFRPKDMxLDQsVE9FUSksIFhUT19NQVNLLAlQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZXEiLCAgICAgWFRPKDMxLDQsVE9FUSksIFhUT19NQVNLLAlQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xnZSIsICAgWFRPKDMxLDQsVE9MR0UpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxnZSIsICAgIFhUTygzMSw0LFRPTEdFKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bG5sIiwgICBYVE8oMzEsNCxUT0xOTCksIFhUT19NQVNLLCBQUENDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0bG5sIiwgICAgWFRPKDMxLDQsVE9MTkwpLCBYVE9fTUFTSywgUFdSQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidHdsbGUiLCAgIFhUTygzMSw0LFRPTExFKSwgWFRPX01BU0ssIFBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsbGUiLCAgICBYVE8oMzEsNCxUT0xMRSksIFhUT19NQVNLLCBQV1JDT00sCQl7IFJBLCBSQiB9IH0sCi17ICJ0d2xuZyIsICAgWFRPKDMxLDQsVE9MTkcpLCBYVE9fTUFTSywgUFBDQ09NLAkJeyBSQSwgUkIgfSB9LAoteyAidGxuZyIsICAgIFhUTygzMSw0LFRPTE5HKSwgWFRPX01BU0ssIFBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3Z3QiLCAgICBYVE8oMzEsNCxUT0dUKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRndCIsICAgICBYVE8oMzEsNCxUT0dUKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3Z2UiLCAgICBYVE8oMzEsNCxUT0dFKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRnZSIsICAgICBYVE8oMzEsNCxUT0dFKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmwiLCAgICBYVE8oMzEsNCxUT05MKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRubCIsICAgICBYVE8oMzEsNCxUT05MKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bHQiLCAgICBYVE8oMzEsNCxUT0xUKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsdCIsICAgICBYVE8oMzEsNCxUT0xUKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bGUiLCAgICBYVE8oMzEsNCxUT0xFKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRsZSIsICAgICBYVE8oMzEsNCxUT0xFKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmciLCAgICBYVE8oMzEsNCxUT05HKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRuZyIsICAgICBYVE8oMzEsNCxUT05HKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInR3bmUiLCAgICBYVE8oMzEsNCxUT05FKSwgWFRPX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRuZSIsICAgICBYVE8oMzEsNCxUT05FKSwgWFRPX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJCIH0gfSwKLXsgInRyYXAiLCAgICBYVE8oMzEsNCxUT1UpLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAidHciLCAgICAgIFgoMzEsNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgVE8sIFJBLCBSQiB9IH0sCi17ICJ0IiwgICAgICAgWCgzMSw0KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBUTywgUkEsIFJCIH0gfSwKLQoteyAic3ViZmMiLCAgIFhPKDMxLDgsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmIiwgICAgICBYTygzMSw4LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjIiwgICAgWE8oMzEsOCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmMuIiwgIFhPKDMxLDgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmLiIsICAgICBYTygzMSw4LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjLiIsICAgWE8oMzEsOCwwLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmNvIiwgIFhPKDMxLDgsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmbyIsICAgICBYTygzMSw4LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjbyIsICAgWE8oMzEsOCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZmNvLiIsIFhPKDMxLDgsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInNmby4iLCAgICBYTygzMSw4LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJjby4iLCAgWE8oMzEsOCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAotCi17ICJtdWxoZHUiLCAgWE8oMzEsOSwwLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxoZHUuIiwgWE8oMzEsOSwwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZGMiLCAgICBYTygzMSwxMCwwLDApLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYSIsICAgICAgIFhPKDMxLDEwLDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhZGRjLiIsICAgWE8oMzEsMTAsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImEuIiwgICAgICBYTygzMSwxMCwwLDEpLCBYT19NQVNLLAlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYWRkY28iLCAgIFhPKDMxLDEwLDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJhbyIsICAgICAgWE8oMzEsMTAsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGNvLiIsICBYTygzMSwxMCwxLDEpLCBYT19NQVNLLAlQUENDT00sCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiYW8uIiwgICAgIFhPKDMxLDEwLDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm11bGh3dSIsICBYTygzMSwxMSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsaHd1LiIsIFhPKDMxLDExLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mY3IiLCAgICBYKDMxLDE5KSwJWFJBUkJfTUFTSywJQ09NLAkJeyBSVCB9IH0sCi0KLXsgImx3YXJ4IiwgICBYKDMxLDIwKSwJWF9NQVNLLAkJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibGR4IiwgICAgIFgoMzEsMjEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImx3engiLCAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImx4IiwgICAgICBYKDMxLDIzKSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic2x3IiwgICAgIFhSQygzMSwyNCwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2wiLCAgICAgIFhSQygzMSwyNCwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2x3LiIsICAgIFhSQygzMSwyNCwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2wuIiwgICAgIFhSQygzMSwyNCwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJjbnRsenciLCAgWFJDKDMxLDI2LDApLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHoiLCAgIFhSQygzMSwyNiwwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImNudGx6dy4iLCBYUkMoMzEsMjYsMSksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJjbnRsei4iLCAgWFJDKDMxLDI2LDEpLCBYUkJfTUFTSywgCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLQoteyAic2xkIiwgICAgIFhSQygzMSwyNywwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzbGQuIiwgICAgWFJDKDMxLDI3LDEpLCBYX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiYW5kIiwgICAgIFhSQygzMSwyOCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAiYW5kLiIsICAgIFhSQygzMSwyOCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtYXNrZyIsICAgWFJDKDMxLDI5LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibWFza2cuIiwgIFhSQygzMSwyOSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiY21wbHciLCAgIFhDTVBMKDMxLDMyLDApLCBYQ01QTF9NQVNLLCBQUENDT00sCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wbGQiLCAgIFhDTVBMKDMxLDMyLDEpLCBYQ01QTF9NQVNLLCBQUEM2NCwJCXsgT0JGLCBSQSwgUkIgfSB9LAoteyAiY21wbCIsICAgIFgoMzEsMzIpLAlYQ01QX01BU0ssCSBQUENPTkxZLAl7IEJGLCBMLCBSQSwgUkIgfSB9LAoteyAiY21wbCIsICAgIFgoMzEsMzIpLAlYQ01QTF9NQVNLLAkgUFdSQ09NLAl7IEJGLCBSQSwgUkIgfSB9LAotCi17ICJzdWJmIiwgICAgWE8oMzEsNDAsMCwwKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1YiIsICAgICBYTygzMSw0MCwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAoteyAic3ViZi4iLCAgIFhPKDMxLDQwLDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWIuIiwgICAgWE8oMzEsNDAsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkIsIFJBIH0gfSwKLXsgInN1YmZvIiwgICBYTygzMSw0MCwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAic3VibyIsICAgIFhPKDMxLDQwLDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJCLCBSQSB9IH0sCi17ICJzdWJmby4iLCAgWE8oMzEsNDAsMSwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInN1Ym8uIiwgICBYTygzMSw0MCwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQiwgUkEgfSB9LAotCi17ICJsZHV4IiwgICAgWCgzMSw1MyksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgImRjYnN0IiwgICBYKDMxLDU0KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibHd6dXgiLCAgIFgoMzEsNTUpLAlYX01BU0ssCQlQUENDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLXsgImx1eCIsICAgICBYKDMxLDU1KSwJWF9NQVNLLAkJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiY250bHpkIiwgIFhSQygzMSw1OCwwKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LAoteyAiY250bHpkLiIsIFhSQygzMSw1OCwxKSwgWFJCX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMgfSB9LAotCi17ICJhbmRjIiwgICAgWFJDKDMxLDYwLDApLCBYX01BU0ssCUNPTSwJeyBSQSwgUlMsIFJCIH0gfSwKLXsgImFuZGMuIiwgICBYUkMoMzEsNjAsMSksIFhfTUFTSywJQ09NLAl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ0ZGxndCIsICAgWFRPKDMxLDY4LFRPTEdUKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbHQiLCAgIFhUTygzMSw2OCxUT0xMVCksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkZXEiLCAgICBYVE8oMzEsNjgsVE9FUSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxnZSIsICAgWFRPKDMxLDY4LFRPTEdFKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsbmwiLCAgIFhUTygzMSw2OCxUT0xOTCksIFhUT19NQVNLLCBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGxlIiwgICBYVE8oMzEsNjgsVE9MTEUpLCBYVE9fTUFTSywgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZGxuZyIsICAgWFRPKDMxLDY4LFRPTE5HKSwgWFRPX01BU0ssIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRndCIsICAgIFhUTygzMSw2OCxUT0dUKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkZ2UiLCAgICBYVE8oMzEsNjgsVE9HRSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZG5sIiwgICAgWFRPKDMxLDY4LFRPTkwpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRsdCIsICAgIFhUTygzMSw2OCxUT0xUKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkbGUiLCAgICBYVE8oMzEsNjgsVE9MRSksIFhUT19NQVNLLCAgUFBDNjQsCQl7IFJBLCBSQiB9IH0sCi17ICJ0ZG5nIiwgICAgWFRPKDMxLDY4LFRPTkcpLCBYVE9fTUFTSywgIFBQQzY0LAkJeyBSQSwgUkIgfSB9LAoteyAidGRuZSIsICAgIFhUTygzMSw2OCxUT05FKSwgWFRPX01BU0ssICBQUEM2NCwJCXsgUkEsIFJCIH0gfSwKLXsgInRkIiwJICAgICBYKDMxLDY4KSwJWF9NQVNLLAkJIFBQQzY0LAkJeyBUTywgUkEsIFJCIH0gfSwKLQoteyAibXVsaGQiLCAgIFhPKDMxLDczLDAsMCksIFhPX01BU0ssCSBQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxoZC4iLCAgWE8oMzEsNzMsMCwxKSwgWE9fTUFTSywJIFBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXVsaHciLCAgIFhPKDMxLDc1LDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxody4iLCAgWE8oMzEsNzUsMCwxKSwgWE9fTUFTSywJUFBDLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibWZtc3IiLCAgIFgoMzEsODMpLAlYUkFSQl9NQVNLLAlDT00sCQl7IFJUIH0gfSwKLQoteyAibGRhcngiLCAgIFgoMzEsODQpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjYmYiLCAgICBYKDMxLDg2KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibGJ6eCIsICAgIFgoMzEsODcpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJuZWciLCAgICAgWE8oMzEsMTA0LDAsMCksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAibmVnLiIsICAgIFhPKDMxLDEwNCwwLDEpLCBYT1JCX01BU0ssCUNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5lZ28iLCAgICBYTygzMSwxMDQsMSwwKSwgWE9SQl9NQVNLLAlDT00sCQl7IFJULCBSQSB9IH0sCi17ICJuZWdvLiIsICAgWE8oMzEsMTA0LDEsMSksIFhPUkJfTUFTSywJQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdWwiLCAgICAgWE8oMzEsMTA3LDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsLiIsICAgIFhPKDMxLDEwNywwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bG8iLCAgICBYTygzMSwxMDcsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxvLiIsICAgWE8oMzEsMTA3LDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJjbGYiLCAgICAgWCgzMSwxMTgpLCBYUkJfTUFTSywJUE9XRVIsCQl7IFJULCBSQSB9IH0sCi0KLXsgImxienV4IiwgICBYKDMxLDExOSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJub3QiLCAgICAgWFJDKDMxLDEyNCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKLXsgIm5vciIsICAgICBYUkMoMzEsMTI0LDApLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJub3QuIiwgICAgWFJDKDMxLDEyNCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkJTIH0gfSwKLXsgIm5vci4iLCAgICBYUkMoMzEsMTI0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIndydGVlIiwgICBYKDMxLDEzMSksCVhSQVJCX01BU0ssCVBQQzQwMywJCXsgUlMgfSB9LAotCi17ICJzdWJmZSIsICAgWE8oMzEsMTM2LDAsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmUiLCAgICAgWE8oMzEsMTM2LDAsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZS4iLCAgWE8oMzEsMTM2LDAsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmUuIiwgICAgWE8oMzEsMTM2LDAsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZW8iLCAgWE8oMzEsMTM2LDEsMCksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmVvIiwgICAgWE8oMzEsMTM2LDEsMCksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzdWJmZW8uIiwgWE8oMzEsMTM2LDEsMSksIFhPX01BU0ssCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJzZmVvLiIsICAgWE8oMzEsMTM2LDEsMSksIFhPX01BU0ssCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZGUiLCAgICBYTygzMSwxMzgsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlIiwgICAgICBYTygzMSwxMzgsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGUuIiwgICBYTygzMSwxMzgsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlLiIsICAgICBYTygzMSwxMzgsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGVvIiwgICBYTygzMSwxMzgsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlbyIsICAgICBYTygzMSwxMzgsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZGVvLiIsICBYTygzMSwxMzgsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFlby4iLCAgICBYTygzMSwxMzgsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXRjciIsICAgIFhGWE0oMzEsMTQ0LDB4ZmYpLCBYRlhGWE1fTUFTS3xGWE1fTUFTSywgQ09NLAl7IFJTIH19LAoteyAibXRjcmYiLCAgIFgoMzEsMTQ0KSwJWEZYRlhNX01BU0ssCUNPTSwJCXsgRlhNLCBSUyB9IH0sCi0KLXsgIm10bXNyIiwgICBYKDMxLDE0NiksCVhSQVJCX01BU0ssCUNPTSwJCXsgUlMgfSB9LAotCi17ICJzdGR4IiwgICAgWCgzMSwxNDkpLCBYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0d2N4LiIsICBYUkMoMzEsMTUwLDEpLCBYX01BU0ssCVBQQywJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0d3giLCAgICBYKDMxLDE1MSksIFhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi17ICJzdHgiLCAgICAgWCgzMSwxNTEpLCBYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzbHEiLCAgICAgWFJDKDMxLDE1MiwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNscS4iLCAgICBYUkMoMzEsMTUyLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzbGUiLCAgICAgWFJDKDMxLDE1MywwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNsZS4iLCAgICBYUkMoMzEsMTUzLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ3cnRlZWkiLCAgWCgzMSwxNjMpLAlYRV9NQVNLLAlQUEM0MDMsCQl7IEUgfSB9LAotCi17ICJzdGR1eCIsICAgWCgzMSwxODEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlMsIFJBUywgUkIgfSB9LAotCi17ICJzdHd1eCIsICAgWCgzMSwxODMpLAlYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKLXsgInN0dXgiLCAgICBYKDMxLDE4MyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNsaXEiLCAgICBYUkMoMzEsMTg0LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic2xpcS4iLCAgIFhSQygzMSwxODQsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgInN1YmZ6ZSIsICBYTygzMSwyMDAsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplIiwgICAgWE8oMzEsMjAwLDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZnplLiIsIFhPKDMxLDIwMCwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmemUuIiwgICBYTygzMSwyMDAsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmemVvIiwgWE8oMzEsMjAwLDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2Z6ZW8iLCAgIFhPKDMxLDIwMCwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZ6ZW8uIixYTygzMSwyMDAsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZnplby4iLCAgWE8oMzEsMjAwLDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJhZGR6ZSIsICAgWE8oMzEsMjAyLDAsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplIiwgICAgIFhPKDMxLDIwMiwwLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZHplLiIsICBYTygzMSwyMDIsMCwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhemUuIiwgICAgWE8oMzEsMjAyLDAsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkemVvIiwgIFhPKDMxLDIwMiwxLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImF6ZW8iLCAgICBYTygzMSwyMDIsMSwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGR6ZW8uIiwgWE8oMzEsMjAyLDEsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYXplby4iLCAgIFhPKDMxLDIwMiwxLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibXRzciIsICAgIFgoMzEsMjEwKSwJWFJCX01BU0t8KDE8PDIwKSwgQ09NMzIsCXsgU1IsIFJTIH0gfSwKLQoteyAic3RkY3guIiwgIFhSQygzMSwyMTQsMSksIFhfTUFTSywJUFBDNjQsCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJzdGJ4IiwgICAgWCgzMSwyMTUpLAlYX01BU0ssCQlDT00sCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInNsbHEiLCAgICBYUkMoMzEsMjE2LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xscS4iLCAgIFhSQygzMSwyMTYsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNsZXEiLCAgICBYUkMoMzEsMjE3LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic2xlcS4iLCAgIFhSQygzMSwyMTcsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInN1YmZtZSIsICBYTygzMSwyMzIsMCwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lIiwgICAgWE8oMzEsMjMyLDAsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic3ViZm1lLiIsIFhPKDMxLDIzMiwwLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInNmbWUuIiwgICBYTygzMSwyMzIsMCwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzdWJmbWVvIiwgWE8oMzEsMjMyLDEsMCksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAic2ZtZW8iLCAgIFhPKDMxLDIzMiwxLDApLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgInN1YmZtZW8uIixYTygzMSwyMzIsMSwxKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJzZm1lby4iLCAgWE8oMzEsMjMyLDEsMSksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAotCi17ICJtdWxsZCIsICAgWE8oMzEsMjMzLDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGxkLiIsICBYTygzMSwyMzMsMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAibXVsbGRvIiwgIFhPKDMxLDIzMywxLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJtdWxsZG8uIiwgWE8oMzEsMjMzLDEsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiYWRkbWUiLCAgIFhPKDMxLDIzNCwwLDApLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZSIsICAgICBYTygzMSwyMzQsMCwwKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhZGRtZS4iLCAgWE8oMzEsMjM0LDAsMSksIFhPUkJfTUFTSywgUFBDQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYW1lLiIsICAgIFhPKDMxLDIzNCwwLDEpLCBYT1JCX01BU0ssIFBXUkNPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFkZG1lbyIsICBYTygzMSwyMzQsMSwwKSwgWE9SQl9NQVNLLCBQUENDT00sCQl7IFJULCBSQSB9IH0sCi17ICJhbWVvIiwgICAgWE8oMzEsMjM0LDEsMCksIFhPUkJfTUFTSywgUFdSQ09NLAkJeyBSVCwgUkEgfSB9LAoteyAiYWRkbWVvLiIsIFhPKDMxLDIzNCwxLDEpLCBYT1JCX01BU0ssIFBQQ0NPTSwJCXsgUlQsIFJBIH0gfSwKLXsgImFtZW8uIiwgICBYTygzMSwyMzQsMSwxKSwgWE9SQl9NQVNLLCBQV1JDT00sCQl7IFJULCBSQSB9IH0sCi0KLXsgIm11bGx3IiwgICBYTygzMSwyMzUsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHMiLCAgICBYTygzMSwyMzUsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3LiIsICBYTygzMSwyMzUsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHMuIiwgICBYTygzMSwyMzUsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3byIsICBYTygzMSwyMzUsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHNvIiwgICBYTygzMSwyMzUsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bGx3by4iLCBYTygzMSwyMzUsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgIm11bHNvLiIsICBYTygzMSwyMzUsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibXRzcmluIiwgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBQQzMyLAkJeyBSUywgUkIgfSB9LAoteyAibXRzcmkiLCAgIFgoMzEsMjQyKSwJWFJBX01BU0ssCVBPV0VSMzIsCXsgUlMsIFJCIH0gfSwKLQoteyAiZGNidHN0IiwgIFgoMzEsMjQ2KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAic3RidXgiLCAgIFgoMzEsMjQ3KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkFTLCBSQiB9IH0sCi0KLXsgInNsbGlxIiwgICBYUkMoMzEsMjQ4LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic2xsaXEuIiwgIFhSQygzMSwyNDgsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImRveiIsICAgICBYTygzMSwyNjQsMCwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkb3ouIiwgICAgWE8oMzEsMjY0LDAsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZG96byIsICAgIFhPKDMxLDI2NCwxLDApLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRvem8uIiwgICBYTygzMSwyNjQsMSwxKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImFkZCIsICAgICBYTygzMSwyNjYsMCwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheCIsICAgICBYTygzMSwyNjYsMCwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZC4iLCAgICBYTygzMSwyNjYsMCwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheC4iLCAgICBYTygzMSwyNjYsMCwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZG8iLCAgICBYTygzMSwyNjYsMSwwKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheG8iLCAgICBYTygzMSwyNjYsMSwwKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImFkZG8uIiwgICBYTygzMSwyNjYsMSwxKSwgWE9fTUFTSywJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImNheG8uIiwgICBYTygzMSwyNjYsMSwxKSwgWE9fTUFTSywJUFdSQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAibHNjYngiLCAgIFhSQygzMSwyNzcsMCksIFhfTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJsc2NieC4iLCAgWFJDKDMxLDI3NywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGNidCIsICAgIFgoMzEsMjc4KSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibGh6eCIsICAgIFgoMzEsMjc5KSwJWF9NQVNLLAkJQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiaWNidCIsICAgIFgoMzEsMjYyKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAiZXF2IiwgICAgIFhSQygzMSwyODQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgImVxdi4iLCAgICBYUkMoMzEsMjg0LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInRsYmllIiwgICBYKDMxLDMwNiksCVhSVFJBX01BU0ssCVBQQywJCXsgUkIgfSB9LAoteyAidGxiaSIsICAgIFgoMzEsMzA2KSwJWFJUX01BU0ssCVBPV0VSLAkJeyBSQSwgUkIgfSB9LAotCi17ICJlY2l3eCIsICAgWCgzMSwzMTApLCBYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsaHp1eCIsICAgWCgzMSwzMTEpLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQUwsIFJCIH0gfSwKLQoteyAieG9yIiwgICAgIFhSQygzMSwzMTYsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInhvci4iLCAgICBYUkMoMzEsMzE2LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgIm1mZXhpc3IiLCBYU1BSKDMxLDMyMyw2NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZXhpZXIiLCBYU1BSKDMxLDMyMyw2NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIwIiwgICBYU1BSKDMxLDMyMywxMjgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyMSIsICAgWFNQUigzMSwzMjMsMTI5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjIiLCAgIFhTUFIoMzEsMzIzLDEzMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnIzIiwgICBYU1BSKDMxLDMyMywxMzEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNCIsICAgWFNQUigzMSwzMjMsMTMyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZicjUiLCAgIFhTUFIoMzEsMzIzLDEzMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYnI2IiwgICBYU1BSKDMxLDMyMywxMzQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmJyNyIsICAgWFNQUigzMSwzMjMsMTM1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZiZWFyIiwgIFhTUFIoMzEsMzIzLDE0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mYmVzciIsICBYU1BSKDMxLDMyMywxNDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmlvY3IiLCAgWFNQUigzMSwzMjMsMTYwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjAiLCBYU1BSKDMxLDMyMywxOTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MCIsIFhTUFIoMzEsMzIzLDE5MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGEwIiwgWFNQUigzMSwzMjMsMTk0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTAiLCBYU1BSKDMxLDMyMywxOTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMCIsIFhTUFIoMzEsMzIzLDE5NiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3IxIiwgWFNQUigzMSwzMjMsMjAwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjdDEiLCBYU1BSKDMxLDMyMywyMDEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWRhMSIsIFhTUFIoMzEsMzIzLDIwMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc2ExIiwgWFNQUigzMSwzMjMsMjAzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjYzEiLCBYU1BSKDMxLDMyMywyMDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNyMiIsIFhTUFIoMzEsMzIzLDIwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY3QyIiwgWFNQUigzMSwzMjMsMjA5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFkYTIiLCBYU1BSKDMxLDMyMywyMTApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYXNhMiIsIFhTUFIoMzEsMzIzLDIxMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hY2MyIiwgWFNQUigzMSwzMjMsMjEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFjcjMiLCBYU1BSKDMxLDMyMywyMTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWN0MyIsIFhTUFIoMzEsMzIzLDIxNyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hZGEzIiwgWFNQUigzMSwzMjMsMjE4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkbWFzYTMiLCBYU1BSKDMxLDMyMywyMTkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRtYWNjMyIsIFhTUFIoMzEsMzIzLDIyMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZG1hc3IiLCBYU1BSKDMxLDMyMywyMjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRjciIsICAgWCgzMSwzMjMpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBTUFIgfSB9LAotCi17ICJkaXYiLCAgICAgWE8oMzEsMzMxLDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2LiIsICAgIFhPKDMxLDMzMSwwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdm8iLCAgICBYTygzMSwzMzEsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZvLiIsICAgWE8oMzEsMzMxLDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJtZm1xIiwgICAgIFhTUFIoMzEsMzM5LDApLCAgIFhTUFJfTUFTSywgTTYwMSwJeyBSVCB9IH0sCi17ICJtZnhlciIsICAgIFhTUFIoMzEsMzM5LDEpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnJ0Y3UiLCAgIFhTUFIoMzEsMzM5LDQpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnJ0Y2wiLCAgIFhTUFIoMzEsMzM5LDUpLCAgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRlYyIsICAgIFhTUFIoMzEsMzM5LDYpLCAgIFhTUFJfTUFTSywgTUZERUMxLAl7IFJUIH0gfSwKLXsgIm1mbHIiLCAgICAgWFNQUigzMSwzMzksOCksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mY3RyIiwgICAgWFNQUigzMSwzMzksOSksICAgWFNQUl9NQVNLLCBDT00sCQl7IFJUIH0gfSwKLXsgIm1mdGlkIiwgICAgWFNQUigzMSwzMzksMTcpLCAgWFNQUl9NQVNLLCBQT1dFUiwJeyBSVCB9IH0sCi17ICJtZmRzaXNyIiwgIFhTUFIoMzEsMzM5LDE4KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRhciIsICAgIFhTUFIoMzEsMzM5LDE5KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmRlYyIsICAgIFhTUFIoMzEsMzM5LDIyKSwgIFhTUFJfTUFTSywgTUZERUMyLAl7IFJUIH0gfSwKLXsgIm1mc2RyMCIsICAgWFNQUigzMSwzMzksMjQpLCAgWFNQUl9NQVNLLCBQT1dFUiwJeyBSVCB9IH0sCi17ICJtZnNkcjEiLCAgIFhTUFIoMzEsMzM5LDI1KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnNycjAiLCAgIFhTUFIoMzEsMzM5LDI2KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZnNycjEiLCAgIFhTUFIoMzEsMzM5LDI3KSwgIFhTUFJfTUFTSywgQ09NLAkJeyBSVCB9IH0sCi17ICJtZmNtcGEiLCAgIFhTUFIoMzEsMzM5LDE0NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wYiIsICAgWFNQUigzMSwzMzksMTQ1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBjIiwgICBYU1BSKDMxLDMzOSwxNDYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGQiLCAgIFhTUFIoMzEsMzM5LDE0NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWNyIiwgICAgWFNQUigzMSwzMzksMTQ4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkZXIiLCAgICBYU1BSKDMxLDMzOSwxNDkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNvdW50YSIsIFhTUFIoMzEsMzM5LDE1MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY291bnRiIiwgWFNQUigzMSwzMzksMTUxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBlIiwgICBYU1BSKDMxLDMzOSwxNTIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmNtcGYiLCAgIFhTUFIoMzEsMzM5LDE1MyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mY21wZyIsICAgWFNQUigzMSwzMzksMTU0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZjbXBoIiwgICBYU1BSKDMxLDMzOSwxNTUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmxjdHJsMSIsIFhTUFIoMzEsMzM5LDE1NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbGN0cmwyIiwgWFNQUigzMSwzMzksMTU3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZpY3RybCIsICBYU1BSKDMxLDMzOSwxNTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmJhciIsICAgIFhTUFIoMzEsMzM5LDE1OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mc3ByZyIsICAgWFNQUigzMSwzMzksMjcyKSwgWFNQUkdfTUFTSywgUFBDLAl7IFJULCBTUFJHIH0gfSwKLXsgIm1mc3ByZzAiLCAgWFNQUigzMSwzMzksMjcyKSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzEiLCAgWFNQUigzMSwzMzksMjczKSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzIiLCAgWFNQUigzMSwzMzksMjc0KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mc3ByZzMiLCAgWFNQUigzMSwzMzksMjc1KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mYXNyIiwgICAgWFNQUigzMSwzMzksMjgwKSwgWFNQUl9NQVNLLCBQUEM2NCwJeyBSVCB9IH0sCi17ICJtZmVhciIsICAgIFhTUFIoMzEsMzM5LDI4MiksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZnB2ciIsICAgIFhTUFIoMzEsMzM5LDI4NyksIFhTUFJfTUFTSywgUFBDLAkJeyBSVCB9IH0sCi17ICJtZmliYXR1IiwgIFhTUFIoMzEsMzM5LDUyOCksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZpYmF0bCIsICBYU1BSKDMxLDMzOSw1MjkpLCBYU1BSQkFUX01BU0ssIFBQQywJeyBSVCwgU1BSQkFUIH0gfSwKLXsgIm1mZGJhdHUiLCAgWFNQUigzMSwzMzksNTM2KSwgWFNQUkJBVF9NQVNLLCBQUEMsCXsgUlQsIFNQUkJBVCB9IH0sCi17ICJtZmRiYXRsIiwgIFhTUFIoMzEsMzM5LDUzNyksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFJULCBTUFJCQVQgfSB9LAoteyAibWZpY19jc3QiLCBYU1BSKDMxLDMzOSw1NjApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmljX2FkciIsIFhTUFIoMzEsMzM5LDU2MSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maWNfZGF0IiwgWFNQUigzMSwzMzksNTYyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkY19jc3QiLCBYU1BSKDMxLDMzOSw1NjgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRjX2FkciIsIFhTUFIoMzEsMzM5LDU2OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mZGNfZGF0IiwgWFNQUigzMSwzMzksNTcwKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZkcGRyIiwgICBYU1BSKDMxLDMzOSw2MzApLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZmRwaXIiLCAgIFhTUFIoMzEsMzM5LDYzMSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1maW1tciIsICAgWFNQUigzMSwzMzksNjM4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9jdHIiLCBYU1BSKDMxLDMzOSw3ODQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2FwIiwgIFhTUFIoMzEsMzM5LDc4NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWlfZXBuIiwgWFNQUigzMSwzMzksNzg3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV90d2MiLCBYU1BSKDMxLDMzOSw3ODkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX3JwbiIsIFhTUFIoMzEsMzM5LDc5MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfY3RyIiwgWFNQUigzMSwzMzksNzkyKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtX2Nhc2lkIixYU1BSKDMxLDMzOSw3OTMpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2FwIiwgIFhTUFIoMzEsMzM5LDc5NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZXBuIiwgWFNQUigzMSwzMzksNzk1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF90d2IiLCBYU1BSKDMxLDMzOSw3OTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX3R3YyIsIFhTUFIoMzEsMzM5LDc5NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfcnBuIiwgWFNQUigzMSwzMzksNzk4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtX3R3IiwgICBYU1BSKDMxLDMzOSw3OTkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2RiY2FtIixYU1BSKDMxLDMzOSw4MTYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1pX2RicmFtMCIsWFNQUigzMSwzMzksODE3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtaV9kYnJhbTEiLFhTUFIoMzEsMzM5LDgxOCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1mbWRfZGJjYW0iLCBYU1BSKDMxLDMzOSw4MjQpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtZm1kX2RicmFtMCIsWFNQUigzMSwzMzksODI1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibWZtZF9kYnJhbTEiLFhTUFIoMzEsMzM5LDgyNiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm1menByIiwgICBYU1BSKDMxLDMzOSw5NDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBpZCIsICAgWFNQUigzMSwzMzksOTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpY2RiZHIiLFhTUFIoMzEsMzM5LDk3OSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdW1tY3IwIiwJWFNQUigzMSwzMzksOTM2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdXBtYzEiLAlYU1BSKDMxLDMzOSw5MzcpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jMiIsCVhTUFIoMzEsMzM5LDkzOCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVzaWEiLAlYU1BSKDMxLDMzOSw5MzkpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1bW1jcjEiLAlYU1BSKDMxLDMzOSw5NDApLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ1cG1jMyIsCVhTUFIoMzEsMzM5LDk0MSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnVwbWM0IiwJWFNQUigzMSwzMzksOTQyKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mbW1jcjAiLAlYU1BSKDMxLDMzOSw5NTIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZwbWMxIiwJWFNQUigzMSwzMzksOTUzKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jMiIsCVhTUFIoMzEsMzM5LDk1NCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnNpYSIsCVhTUFIoMzEsMzM5LDk1NSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZm1tY3IxIiwJWFNQUigzMSwzMzksOTU2KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mcG1jMyIsCVhTUFIoMzEsMzM5LDk1NyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnBtYzQiLAlYU1BSKDMxLDMzOSw5NTgpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZlc3IiLCAgIFhTUFIoMzEsMzM5LDk4MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGVhciIsICBYU1BSKDMxLDMzOSw5ODEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmV2cHIiLCAgWFNQUigzMSwzMzksOTgyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZjZGJjciIsIFhTUFIoMzEsMzM5LDk4MyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdHNyIiwgICBYU1BSKDMxLDMzOSw5ODQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRjciIsICAgWFNQUigzMSwzMzksOTg2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwaXQiLCAgIFhTUFIoMzEsMzM5LDk4NyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mdGJoaSIsICBYU1BSKDMxLDMzOSw5ODgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnRibG8iLCAgWFNQUigzMSwzMzksOTg5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZzcnIyIiwgIFhTUFIoMzEsMzM5LDk5MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mc3JyMyIsICBYU1BSKDMxLDMzOSw5OTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRic3IiLCAgWFNQUigzMSwzMzksMTAwOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1maWFjMSIsICBYU1BSKDMxLDMzOSwxMDEyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZpYWMyIiwgIFhTUFIoMzEsMzM5LDEwMTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmRhYzEiLCAgWFNQUigzMSwzMzksMTAxNCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mZGFjMiIsICBYU1BSKDMxLDMzOSwxMDE1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZkY2NyIiwgIFhTUFIoMzEsMzM5LDEwMTgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZmljY3IiLCAgWFNQUigzMSwzMzksMTAxOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJsMSIsICBYU1BSKDMxLDMzOSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZwYnUxIiwgIFhTUFIoMzEsMzM5LDEwMjEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtZnBibDIiLCAgWFNQUigzMSwzMzksMTAyMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm1mcGJ1MiIsICBYU1BSKDMxLDMzOSwxMDIzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibWZsMmNyIiwJWFNQUigzMSwzMzksMTAxNyksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1maWN0YyIsCVhTUFIoMzEsMzM5LDEwMTkpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnRocm0xIiwJWFNQUigzMSwzMzksMTAyMCksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm1mdGhybTIiLAlYU1BSKDMxLDMzOSwxMDIxKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibWZ0aHJtMyIsCVhTUFIoMzEsMzM5LDEwMjIpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtZnNwciIsICAgWCgzMSwzMzkpLAlYX01BU0ssCQlDT00sCQl7IFJULCBTUFIgfSB9LAotCi17ICJsd2F4IiwgICAgWCgzMSwzNDEpLAlYX01BU0ssCQlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImxoYXgiLCAgICBYKDMxLDM0MyksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjY2NpIiwgICBYKDMxLDQ1NCksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImFicyIsICAgICBYTygzMSwzNjAsMCwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAiYWJzLiIsICAgIFhPKDMxLDM2MCwwLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJhYnNvIiwgICAgWE8oMzEsMzYwLDEsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgImFic28uIiwgICBYTygzMSwzNjAsMSwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAotCi17ICJkaXZzIiwgICAgWE8oMzEsMzYzLDAsMCksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2cy4iLCAgIFhPKDMxLDM2MywwLDEpLCBYT19NQVNLLAlNNjAxLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdnNvIiwgICBYTygzMSwzNjMsMSwwKSwgWE9fTUFTSywJTTYwMSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZzby4iLCAgWE8oMzEsMzYzLDEsMSksIFhPX01BU0ssCU02MDEsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJ0bGJpYSIsICAgWCgzMSwzNzApLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJtZnRidSIsICAgWFNQUigzMSwzNzEsMjY5KSwgWFNQUl9NQVNLLCBQUEMsCQl7IFJUIH0gfSwKLXsgIm1mdGIiLCAgICBYKDMxLDM3MSksCVhfTUFTSywJCVBQQywJCXsgUlQsIFRCUiB9IH0sCi0KLXsgImx3YXV4IiwgICBYKDMxLDM3MyksCVhfTUFTSywJCVBQQzY0LAkJeyBSVCwgUkFMLCBSQiB9IH0sCi0KLXsgImxoYXV4IiwgICBYKDMxLDM3NSksCVhfTUFTSywJCUNPTSwJCXsgUlQsIFJBTCwgUkIgfSB9LAotCi17ICJzdGh4IiwgICAgWCgzMSw0MDcpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAotCi17ICJsZnF4IiwgICAgWCgzMSw3OTEpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAibGZxdXgiLCAgIFgoMzEsODIzKSwJWF9NQVNLLAkJUE9XRVIyLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgInN0ZnF4IiwgICBYKDMxLDkxOSksCVhfTUFTSywJCVBPV0VSMiwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJzdGZxdXgiLCAgWCgzMSw5NTEpLAlYX01BU0ssCQlQT1dFUjIsCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAib3JjIiwgICAgIFhSQygzMSw0MTIsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm9yYy4iLCAgICBYUkMoMzEsNDEyLDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInNyYWRpIiwgICBYUygzMSw0MTMsMCksIFhTX01BU0ssCVBQQzY0LAkJeyBSQSwgUlMsIFNINiB9IH0sCi17ICJzcmFkaS4iLCAgWFMoMzEsNDEzLDEpLCBYU19NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBTSDYgfSB9LAotCi17ICJzbGJpZSIsICAgWCgzMSw0MzQpLAlYUlRSQV9NQVNLLAlQUEM2NCwJCXsgUkIgfSB9LAotCi17ICJlY293eCIsICAgWCgzMSw0MzgpLAlYX01BU0ssCQlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzdGh1eCIsICAgWCgzMSw0MzkpLAlYX01BU0ssCQlDT00sCQl7IFJTLCBSQVMsIFJCIH0gfSwKLQoteyAibXIiLAkgICAgIFhSQygzMSw0NDQsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJvciIsICAgICAgWFJDKDMxLDQ0NCwwKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAibXIuIiwgICAgIFhSQygzMSw0NDQsMSksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCUyB9IH0sCi17ICJvci4iLCAgICAgWFJDKDMxLDQ0NCwxKSwgWF9NQVNLLAlDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtdGV4aXNyIiwgWFNQUigzMSw0NTEsNjQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGV4aWVyIiwgWFNQUigzMSw0NTEsNjYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMCIsICAgWFNQUigzMSw0NTEsMTI4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjEiLCAgIFhTUFIoMzEsNDUxLDEyOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnIyIiwgICBYU1BSKDMxLDQ1MSwxMzApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyMyIsICAgWFNQUigzMSw0NTEsMTMxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjQiLCAgIFhTUFIoMzEsNDUxLDEzMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YnI1IiwgICBYU1BSKDMxLDQ1MSwxMzMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJyNiIsICAgWFNQUigzMSw0NTEsMTM0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRicjciLCAgIFhTUFIoMzEsNDUxLDEzNSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10YmVhciIsICBYU1BSKDMxLDQ1MSwxNDQpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGJlc3IiLCAgWFNQUigzMSw0NTEsMTQ1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpb2NyIiwgIFhTUFIoMzEsNDUxLDE2MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IwIiwgWFNQUigzMSw0NTEsMTkyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDAiLCBYU1BSKDMxLDQ1MSwxOTMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMCIsIFhTUFIoMzEsNDUxLDE5NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2EwIiwgWFNQUigzMSw0NTEsMTk1KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzAiLCBYU1BSKDMxLDQ1MSwxOTYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNyMSIsIFhTUFIoMzEsNDUxLDIwMCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3QxIiwgWFNQUigzMSw0NTEsMjAxKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFkYTEiLCBYU1BSKDMxLDQ1MSwyMDIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNhMSIsIFhTUFIoMzEsNDUxLDIwMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY2MxIiwgWFNQUigzMSw0NTEsMjA0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjcjIiLCBYU1BSKDMxLDQ1MSwyMDgpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWN0MiIsIFhTUFIoMzEsNDUxLDIwOSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hZGEyIiwgWFNQUigzMSw0NTEsMjEwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFzYTIiLCBYU1BSKDMxLDQ1MSwyMTEpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWNjMiIsIFhTUFIoMzEsNDUxLDIxMiksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hY3IzIiwgWFNQUigzMSw0NTEsMjE2KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjdDMiLCBYU1BSKDMxLDQ1MSwyMTcpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYWRhMyIsIFhTUFIoMzEsNDUxLDIxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZG1hc2EzIiwgWFNQUigzMSw0NTEsMjE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkbWFjYzMiLCBYU1BSKDMxLDQ1MSwyMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRtYXNyIiwgWFNQUigzMSw0NTEsMjI0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR1bW1jcjAiLAlYU1BSKDMxLDQ1MSw5MzYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR1cG1jMSIsCVhTUFIoMzEsNDUxLDkzNyksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWMyIiwJWFNQUigzMSw0NTEsOTM4KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXNpYSIsCVhTUFIoMzEsNDUxLDkzOSksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVtbWNyMSIsCVhTUFIoMzEsNDUxLDk0MCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHVwbWMzIiwJWFNQUigzMSw0NTEsOTQxKSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dXBtYzQiLAlYU1BSKDMxLDQ1MSw5NDIpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRtbWNyMCIsCVhTUFIoMzEsNDUxLDk1MiksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHBtYzEiLAlYU1BSKDMxLDQ1MSw5NTMpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWMyIiwJWFNQUigzMSw0NTEsOTU0KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10c2lhIiwJWFNQUigzMSw0NTEsOTU1KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10bW1jcjEiLAlYU1BSKDMxLDQ1MSw5NTYpLCAgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRwbWMzIiwJWFNQUigzMSw0NTEsOTU3KSwgIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10cG1jNCIsCVhTUFIoMzEsNDUxLDk1OCksICBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdGwyY3IiLAlYU1BSKDMxLDQ1MSwxMDE3KSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXRpY3RjIiwJWFNQUigzMSw0NTEsMTAxOSksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10dGhybTEiLAlYU1BSKDMxLDQ1MSwxMDIwKSwgWFNQUl9NQVNLLCBQUEM3NTAsCXsgUlQgfSB9LAoteyAibXR0aHJtMiIsCVhTUFIoMzEsNDUxLDEwMjEpLCBYU1BSX01BU0ssIFBQQzc1MCwJeyBSVCB9IH0sCi17ICJtdHRocm0zIiwJWFNQUigzMSw0NTEsMTAyMiksIFhTUFJfTUFTSywgUFBDNzUwLAl7IFJUIH0gfSwKLXsgIm10ZGNyIiwgICBYKDMxLDQ1MSksCVhfTUFTSywJCVBQQywJCXsgU1BSLCBSUyB9IH0sCi0KLXsgImRpdmR1IiwgICBYTygzMSw0NTcsMCwwKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZHUuIiwgIFhPKDMxLDQ1NywwLDEpLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkdW8iLCAgWE8oMzEsNDU3LDEsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmR1by4iLCBYTygzMSw0NTcsMSwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJkaXZ3dSIsICAgWE8oMzEsNDU5LDAsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dS4iLCAgWE8oMzEsNDU5LDAsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dW8iLCAgWE8oMzEsNDU5LDEsMCksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZ3dW8uIiwgWE8oMzEsNDU5LDEsMSksIFhPX01BU0ssCVBQQywJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm10bXEiLCAgICBYU1BSKDMxLDQ2NywwKSwgICBYU1BSX01BU0ssICAgIE02MDEsCXsgUlMgfSB9LAoteyAibXR4ZXIiLCAgIFhTUFIoMzEsNDY3LDEpLCAgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10bHIiLCAgICBYU1BSKDMxLDQ2Nyw4KSwgICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGN0ciIsICAgWFNQUigzMSw0NjcsOSksICAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXR0aWQiLCAgIFhTUFIoMzEsNDY3LDE3KSwgIFhTUFJfTUFTSywgICAgUE9XRVIsCXsgUlMgfSB9LAoteyAibXRkc2lzciIsIFhTUFIoMzEsNDY3LDE4KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10ZGFyIiwgICBYU1BSKDMxLDQ2NywxOSksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHJ0Y3UiLCAgWFNQUigzMSw0NjcsMjApLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRydGNsIiwgIFhTUFIoMzEsNDY3LDIxKSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10ZGVjIiwgICBYU1BSKDMxLDQ2NywyMiksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdHNkcjAiLCAgWFNQUigzMSw0NjcsMjQpLCAgWFNQUl9NQVNLLCAgICBQT1dFUiwJeyBSUyB9IH0sCi17ICJtdHNkcjEiLCAgWFNQUigzMSw0NjcsMjUpLCAgWFNQUl9NQVNLLCAgICBDT00sCXsgUlMgfSB9LAoteyAibXRzcnIwIiwgIFhTUFIoMzEsNDY3LDI2KSwgIFhTUFJfTUFTSywgICAgQ09NLAl7IFJTIH0gfSwKLXsgIm10c3JyMSIsICBYU1BSKDMxLDQ2NywyNyksICBYU1BSX01BU0ssICAgIENPTSwJeyBSUyB9IH0sCi17ICJtdGNtcGEiLCAgIFhTUFIoMzEsNDY3LDE0NCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wYiIsICAgWFNQUigzMSw0NjcsMTQ1KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBjIiwgICBYU1BSKDMxLDQ2NywxNDYpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGQiLCAgIFhTUFIoMzEsNDY3LDE0NyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10aWNyIiwgICAgWFNQUigzMSw0NjcsMTQ4KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRkZXIiLCAgICBYU1BSKDMxLDQ2NywxNDkpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNvdW50YSIsIFhTUFIoMzEsNDY3LDE1MCksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y291bnRiIiwgWFNQUigzMSw0NjcsMTUxKSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBlIiwgICBYU1BSKDMxLDQ2NywxNTIpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGNtcGYiLCAgIFhTUFIoMzEsNDY3LDE1MyksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10Y21wZyIsICAgWFNQUigzMSw0NjcsMTU0KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRjbXBoIiwgICBYU1BSKDMxLDQ2NywxNTUpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGxjdHJsMSIsIFhTUFIoMzEsNDY3LDE1NiksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10bGN0cmwyIiwgWFNQUigzMSw0NjcsMTU3KSwgWFNQUl9NQVNLLCBQUEM4NjAsCXsgUlQgfSB9LAoteyAibXRpY3RybCIsICBYU1BSKDMxLDQ2NywxNTgpLCBYU1BSX01BU0ssIFBQQzg2MCwJeyBSVCB9IH0sCi17ICJtdGJhciIsICAgIFhTUFIoMzEsNDY3LDE1OSksIFhTUFJfTUFTSywgUFBDODYwLAl7IFJUIH0gfSwKLXsgIm10c3ByZyIsICBYU1BSKDMxLDQ2NywyNzIpLCBYU1BSR19NQVNLLCAgIFBQQywJeyBTUFJHLCBSUyB9IH0sCi17ICJtdHNwcmcwIiwgWFNQUigzMSw0NjcsMjcyKSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRzcHJnMSIsIFhTUFIoMzEsNDY3LDI3MyksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJUIH0gfSwKLXsgIm10c3ByZzIiLCBYU1BSKDMxLDQ2NywyNzQpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSVCB9IH0sCi17ICJtdHNwcmczIiwgWFNQUigzMSw0NjcsMjc1KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlQgfSB9LAoteyAibXRhc3IiLCAgIFhTUFIoMzEsNDY3LDI4MCksIFhTUFJfTUFTSywgICAgUFBDNjQsCXsgUlMgfSB9LAoteyAibXRlYXIiLCAgIFhTUFIoMzEsNDY3LDI4MiksIFhTUFJfTUFTSywgICAgUFBDLAl7IFJTIH0gfSwKLXsgIm10dGJsIiwgICBYU1BSKDMxLDQ2NywyODQpLCBYU1BSX01BU0ssICAgIFBQQywJeyBSUyB9IH0sCi17ICJtdHRidSIsICAgWFNQUigzMSw0NjcsMjg1KSwgWFNQUl9NQVNLLCAgICBQUEMsCXsgUlMgfSB9LAoteyAibXRpYmF0dSIsIFhTUFIoMzEsNDY3LDUyOCksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRpYmF0bCIsIFhTUFIoMzEsNDY3LDUyOSksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRkYmF0dSIsIFhTUFIoMzEsNDY3LDUzNiksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXRkYmF0bCIsIFhTUFIoMzEsNDY3LDUzNyksIFhTUFJCQVRfTUFTSywgUFBDLAl7IFNQUkJBVCwgUlMgfSB9LAoteyAibXR6cHIiLCAgIFhTUFIoMzEsNDY3LDk0NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGlkIiwgICBYU1BSKDMxLDQ2Nyw5NDUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGljZGJkciIsWFNQUigzMSw0NjcsOTc5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRlc3IiLCAgIFhTUFIoMzEsNDY3LDk4MCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZXZwciIsICBYU1BSKDMxLDQ2Nyw5ODIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGNkYmNyIiwgWFNQUigzMSw0NjcsOTgzKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR0c3IiLCAgIFhTUFIoMzEsNDY3LDk4NCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dGNyIiwgICBYU1BSKDMxLDQ2Nyw5ODYpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBpdCIsICAgWFNQUigzMSw0NjcsOTg3KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXR0YmhpIiwgIFhTUFIoMzEsNDY3LDk4OCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10dGJsbyIsICBYU1BSKDMxLDQ2Nyw5ODkpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHNycjIiLCAgWFNQUigzMSw0NjcsOTkwKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRzcnIzIiwgIFhTUFIoMzEsNDY3LDk5MSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGJzciIsICBYU1BSKDMxLDQ2NywxMDA4KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRpYWMxIiwgIFhTUFIoMzEsNDY3LDEwMTIpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGlhYzIiLCAgWFNQUigzMSw0NjcsMTAxMyksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10ZGFjMSIsICBYU1BSKDMxLDQ2NywxMDE0KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRkYWMyIiwgIFhTUFIoMzEsNDY3LDEwMTUpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdGRjY3IiLCAgWFNQUigzMSw0NjcsMTAxOCksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10aWNjciIsICBYU1BSKDMxLDQ2NywxMDE5KSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYmwxIiwgIFhTUFIoMzEsNDY3LDEwMjApLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHBidTEiLCAgWFNQUigzMSw0NjcsMTAyMSksIFhTUFJfTUFTSywgUFBDNDAzLAl7IFJUIH0gfSwKLXsgIm10cGJsMiIsICBYU1BSKDMxLDQ2NywxMDIyKSwgWFNQUl9NQVNLLCBQUEM0MDMsCXsgUlQgfSB9LAoteyAibXRwYnUyIiwgIFhTUFIoMzEsNDY3LDEwMjMpLCBYU1BSX01BU0ssIFBQQzQwMywJeyBSVCB9IH0sCi17ICJtdHNwciIsICAgWCgzMSw0NjcpLAkgICAgICAgWF9NQVNLLAkgICAgIENPTSwJeyBTUFIsIFJTIH0gfSwKLQoteyAiZGNiaSIsICAgIFgoMzEsNDcwKSwJWFJUX01BU0ssCVBQQywJCXsgUkEsIFJCIH0gfSwKLQoteyAibmFuZCIsICAgIFhSQygzMSw0NzYsMCksIFhfTUFTSywJQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm5hbmQuIiwgICBYUkMoMzEsNDc2LDEpLCBYX01BU0ssCUNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgImRjcmVhZCIsICBYKDMxLDQ4NiksCVhSVF9NQVNLLAlQUEM0MDMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgIm5hYnMiLCAgICBYTygzMSw0ODgsMCwwKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAoteyAibmFicy4iLCAgIFhPKDMxLDQ4OCwwLDEpLCBYT1JCX01BU0ssIE02MDEsCQl7IFJULCBSQSB9IH0sCi17ICJuYWJzbyIsICAgWE8oMzEsNDg4LDEsMCksIFhPUkJfTUFTSywgTTYwMSwJCXsgUlQsIFJBIH0gfSwKLXsgIm5hYnNvLiIsICBYTygzMSw0ODgsMSwxKSwgWE9SQl9NQVNLLCBNNjAxLAkJeyBSVCwgUkEgfSB9LAotCi17ICJkaXZkIiwgICAgWE8oMzEsNDg5LDAsMCksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImRpdmQuIiwgICBYTygzMSw0ODksMCwxKSwgWE9fTUFTSywJUFBDNjQsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2ZG8iLCAgIFhPKDMxLDQ4OSwxLDApLCBYT19NQVNLLAlQUEM2NCwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJkaXZkby4iLCAgWE8oMzEsNDg5LDEsMSksIFhPX01BU0ssCVBQQzY0LAkJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAiZGl2dyIsICAgIFhPKDMxLDQ5MSwwLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2dy4iLCAgIFhPKDMxLDQ5MSwwLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d28iLCAgIFhPKDMxLDQ5MSwxLDApLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAoteyAiZGl2d28uIiwgIFhPKDMxLDQ5MSwxLDEpLCBYT19NQVNLLAlQUEMsCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzbGJpYSIsICAgWCgzMSw0OTgpLAkweGZmZmZmZmZmLAlQUEM2NCwJCXsgMCB9IH0sCi0KLXsgImNsaSIsICAgICBYKDMxLDUwMiksIFhSQl9NQVNLLAlQT1dFUiwJCXsgUlQsIFJBIH0gfSwKLQoteyAibWNyeHIiLCAgIFgoMzEsNTEyKSwJWFJBUkJfTUFTS3woMzw8MjEpLCBDT00sCXsgQkYgfSB9LAotCi17ICJjbGNzIiwgICAgWCgzMSw1MzEpLCBYUkJfTUFTSywJTTYwMSwJCXsgUlQsIFJBIH0gfSwKLQoteyAibHN3eCIsICAgIFgoMzEsNTMzKSwJWF9NQVNLLAkJUFBDQ09NLAkJeyBSVCwgUkEsIFJCIH0gfSwKLXsgImxzeCIsICAgICBYKDMxLDUzMyksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImx3YnJ4IiwgICBYKDMxLDUzNCksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi17ICJsYnJ4IiwgICAgWCgzMSw1MzQpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJsZnN4IiwgICAgWCgzMSw1MzUpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkEsIFJCIH0gfSwKLQoteyAic3J3IiwgICAgIFhSQygzMSw1MzYsMCksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyIiwgICAgICBYUkMoMzEsNTM2LDApLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcncuIiwgICAgWFJDKDMxLDUzNiwxKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3IuIiwgICAgIFhSQygzMSw1MzYsMSksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAicnJpYiIsICAgIFhSQygzMSw1MzcsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJycmliLiIsICAgWFJDKDMxLDUzNywxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JkIiwgICAgIFhSQygzMSw1MzksMCksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JkLiIsICAgIFhSQygzMSw1MzksMSksIFhfTUFTSywJUFBDNjQsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJtYXNraXIiLCAgWFJDKDMxLDU0MSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgIm1hc2tpci4iLCBYUkMoMzEsNTQxLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJ0bGJzeW5jIiwgWCgzMSw1NjYpLAkweGZmZmZmZmZmLAlQUEMsCQl7IDAgfSB9LAotCi17ICJsZnN1eCIsICAgWCgzMSw1NjcpLAlYX01BU0ssCQlDT00sCQl7IEZSVCwgUkFTLCBSQiB9IH0sCi0KLXsgIm1mc3IiLCAgICBYKDMxLDU5NSksCVhSQl9NQVNLfCgxPDwyMCksIENPTTMyLAl7IFJULCBTUiB9IH0sCi0KLXsgImxzd2kiLCAgICBYKDMxLDU5NyksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlQsIFJBLCBOQiB9IH0sCi17ICJsc2kiLCAgICAgWCgzMSw1OTcpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJULCBSQSwgTkIgfSB9LAotCi17ICJzeW5jIiwgICAgWCgzMSw1OTgpLCAweGZmZmZmZmZmLAlQUENDT00sCQl7IDAgfSB9LAoteyAiZGNzIiwgICAgIFgoMzEsNTk4KSwgMHhmZmZmZmZmZiwJUFdSQ09NLAkJeyAwIH0gfSwKLQoteyAibGZkeCIsICAgIFgoMzEsNTk5KSwgWF9NQVNLLAkJQ09NLAkJeyBGUlQsIFJBLCBSQiB9IH0sCi0KLXsgIm1mc3JpIiwgICBYKDMxLDYyNyksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgImRjbHN0IiwgICBYKDMxLDYzMCksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJTLCBSQSB9IH0sCi0KLXsgImxmZHV4IiwgICBYKDMxLDYzMSksIFhfTUFTSywJCUNPTSwJCXsgRlJULCBSQVMsIFJCIH0gfSwKLQoteyAibWZzcmluIiwgIFgoMzEsNjU5KSwgWFJBX01BU0ssCVBQQzMyLAkJeyBSVCwgUkIgfSB9LAotCi17ICJzdHN3eCIsICAgWCgzMSw2NjEpLCBYX01BU0ssCQlQUENDT00sCQl7IFJTLCBSQSwgUkIgfSB9LAoteyAic3RzeCIsICAgIFgoMzEsNjYxKSwgWF9NQVNLLAkJUFdSQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3R3YnJ4IiwgIFgoMzEsNjYyKSwgWF9NQVNLLAkJUFBDQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLXsgInN0YnJ4IiwgICBYKDMxLDY2MiksIFhfTUFTSywJCVBXUkNPTSwJCXsgUlMsIFJBLCBSQiB9IH0sCi0KLXsgInN0ZnN4IiwgICBYKDMxLDY2MyksIFhfTUFTSywJCUNPTSwJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJzcnEiLCAgICAgWFJDKDMxLDY2NCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNycS4iLCAgICBYUkMoMzEsNjY0LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmUiLCAgICAgWFJDKDMxLDY2NSwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyZS4iLCAgICBYUkMoMzEsNjY1LDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzdGZzdXgiLCAgWCgzMSw2OTUpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkFTLCBSQiB9IH0sCi0KLXsgInNyaXEiLCAgICBYUkMoMzEsNjk2LDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JpcS4iLCAgIFhSQygzMSw2OTYsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgInN0c3dpIiwgICBYKDMxLDcyNSksCVhfTUFTSywJCVBQQ0NPTSwJCXsgUlMsIFJBLCBOQiB9IH0sCi17ICJzdHNpIiwgICAgWCgzMSw3MjUpLAlYX01BU0ssCQlQV1JDT00sCQl7IFJTLCBSQSwgTkIgfSB9LAotCi17ICJzdGZkeCIsICAgWCgzMSw3MjcpLAlYX01BU0ssCQlDT00sCQl7IEZSUywgUkEsIFJCIH0gfSwKLQoteyAic3JscSIsICAgIFhSQygzMSw3MjgsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmxxLiIsICAgWFJDKDMxLDcyOCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JlcSIsICAgIFhSQygzMSw3MjksMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmVxLiIsICAgWFJDKDMxLDcyOSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3RmZHV4IiwgIFgoMzEsNzU5KSwJWF9NQVNLLAkJQ09NLAkJeyBGUlMsIFJBUywgUkIgfSB9LAotCi17ICJzcmxpcSIsICAgWFJDKDMxLDc2MCwwKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNybGlxLiIsICBYUkMoMzEsNzYwLDEpLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAotCi17ICJsaGJyeCIsICAgWCgzMSw3OTApLAlYX01BU0ssCQlDT00sCQl7IFJULCBSQSwgUkIgfSB9LAotCi17ICJzcmF3IiwgICAgWFJDKDMxLDc5MiwwKSwgWF9NQVNLLAlQUENDT00sCQl7IFJBLCBSUywgUkIgfSB9LAoteyAic3JhIiwgICAgIFhSQygzMSw3OTIsMCksIFhfTUFTSywJUFdSQ09NLAkJeyBSQSwgUlMsIFJCIH0gfSwKLXsgInNyYXcuIiwgICBYUkMoMzEsNzkyLDEpLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmEuIiwgICAgWFJDKDMxLDc5MiwxKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgUkIgfSB9LAotCi17ICJzcmFkIiwgICAgWFJDKDMxLDc5NCwwKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmFkLiIsICAgWFJDKDMxLDc5NCwxKSwgWF9NQVNLLAlQUEM2NCwJCXsgUkEsIFJTLCBSQiB9IH0sCi0KLXsgInJhYyIsICAgICBYKDMxLDgxOCksCVhfTUFTSywJCVBXUkNPTSwJCXsgUlQsIFJBLCBSQiB9IH0sCi0KLXsgInNyYXdpIiwgICBYUkMoMzEsODI0LDApLCBYX01BU0ssCVBQQ0NPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi17ICJzcmFpIiwgICAgWFJDKDMxLDgyNCwwKSwgWF9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3Jhd2kuIiwgIFhSQygzMSw4MjQsMSksIFhfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMsIFNIIH0gfSwKLXsgInNyYWkuIiwgICBYUkMoMzEsODI0LDEpLCBYX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImVpZWlvIiwgICBYKDMxLDg1NCksCTB4ZmZmZmZmZmYsCVBQQywJCXsgMCB9IH0sCi0KLXsgInRsYnN4IiwgICBYUkMoMzEsOTE0LDApLCBYX01BU0ssIFBQQzQwMywJeyBSVCwgUkEsIFJCIH0gfSwKLXsgInRsYnN4LiIsICBYUkMoMzEsOTE0LDEpLCBYX01BU0ssIFBQQzQwMywJeyBSVCwgUkEsIFJCIH0gfSwKLQoteyAic3RoYnJ4IiwgIFgoMzEsOTE4KSwJWF9NQVNLLAkJQ09NLAkJeyBSUywgUkEsIFJCIH0gfSwKLQoteyAic3JhcSIsICAgIFhSQygzMSw5MjAsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmFxLiIsICAgWFJDKDMxLDkyMCwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAic3JlYSIsICAgIFhSQygzMSw5MjEsMCksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBSQiB9IH0sCi17ICJzcmVhLiIsICAgWFJDKDMxLDkyMSwxKSwgWF9NQVNLLAlNNjAxLAkJeyBSQSwgUlMsIFJCIH0gfSwKLQoteyAiZXh0c2giLCAgIFhSQygzMSw5MjIsMCksIFhSQl9NQVNLLAlQUENDT00sCQl7IFJBLCBSUyB9IH0sCi17ICJleHRzIiwgICAgWFJDKDMxLDkyMiwwKSwgWFJCX01BU0ssCVBXUkNPTSwJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHNoLiIsICBYUkMoMzEsOTIyLDEpLCBYUkJfTUFTSywJUFBDQ09NLAkJeyBSQSwgUlMgfSB9LAoteyAiZXh0cy4iLCAgIFhSQygzMSw5MjIsMSksIFhSQl9NQVNLLAlQV1JDT00sCQl7IFJBLCBSUyB9IH0sCi0KLXsgInRsYnJlIiwgICBYKDMxLDk0NiksCVhfTUFTSywJCVBQQzQwMywJCXsgUlQsIFJBLCBTSCB9IH0sCi0KLXsgInNyYWlxIiwgICBYUkMoMzEsOTUyLDApLCBYX01BU0ssCU02MDEsCQl7IFJBLCBSUywgU0ggfSB9LAoteyAic3JhaXEuIiwgIFhSQygzMSw5NTIsMSksIFhfTUFTSywJTTYwMSwJCXsgUkEsIFJTLCBTSCB9IH0sCi0KLXsgImV4dHNiIiwgICBYUkMoMzEsOTU0LDApLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlN9IH0sCi17ICJleHRzYi4iLCAgWFJDKDMxLDk1NCwxKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTfSB9LAotCi17ICJpY2NjaSIsICAgWCgzMSw5NjYpLAlYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAotCi17ICJ0bGJsZCIsICAgWCgzMSw5NzgpLAlYUlRSQV9NQVNLLAlQUEMsCQl7IFJCIH0gfSwKLXsgInRsYndlIiwgICBYKDMxLDk3OCksCVhfTUFTSywJCVBQQzQwMywJCXsgUlMsIFJBLCBTSCB9IH0sCi0KLXsgImljYmkiLCAgICBYKDMxLDk4MiksCVhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgInN0Zml3eCIsICBYKDMxLDk4MyksCVhfTUFTSywJCVBQQywJCXsgRlJTLCBSQSwgUkIgfSB9LAotCi17ICJleHRzdyIsICAgWFJDKDMxLDk4NiwwKSwgWFJCX01BU0ssCVBQQywJCXsgUkEsIFJTIH0gfSwKLXsgImV4dHN3LiIsICBYUkMoMzEsOTg2LDEpLCBYUkJfTUFTSywJUFBDLAkJeyBSQSwgUlMgfSB9LAotCi17ICJpY3JlYWQiLCAgWCgzMSw5OTgpLAlYUlRfTUFTSywJUFBDNDAzLAkJeyBSQSwgUkIgfSB9LAotCi17ICJ0bGJsaSIsICAgWCgzMSwxMDEwKSwgWFJUUkFfTUFTSywJUFBDLAkJeyBSQiB9IH0sCi0KLXsgImRjYnoiLCAgICBYKDMxLDEwMTQpLCBYUlRfTUFTSywJUFBDLAkJeyBSQSwgUkIgfSB9LAoteyAiZGNseiIsICAgIFgoMzEsMTAxNCksIFhSVF9NQVNLLAlQUEMsCQl7IFJBLCBSQiB9IH0sCi0KLXsgImx3eiIsICAgICBPUCgzMiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLXsgImwiLAkgICAgIE9QKDMyKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsd3p1IiwgICAgT1AoMzMpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQUwgfSB9LAoteyAibHUiLCAgICAgIE9QKDMzKSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJsYnoiLCAgICAgT1AoMzQpLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxienUiLCAgICBPUCgzNSksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi0KLXsgInN0dyIsICAgICBPUCgzNiksCU9QX01BU0ssCVBQQ0NPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLXsgInN0IiwgICAgICBPUCgzNiksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAic3R3dSIsICAgIE9QKDM3KSwJT1BfTUFTSywJUFBDQ09NLAkJeyBSUywgRCwgUkFTIH0gfSwKLXsgInN0dSIsICAgICBPUCgzNyksCU9QX01BU0ssCVBXUkNPTSwJCXsgUlMsIEQsIFJBIH0gfSwKLQoteyAic3RiIiwgICAgIE9QKDM4KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdGJ1IiwgICAgT1AoMzkpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQVMgfSB9LAotCi17ICJsaHoiLCAgICAgT1AoNDApLAlPUF9NQVNLLAlDT00sCQl7IFJULCBELCBSQSB9IH0sCi0KLXsgImxoenUiLCAgICBPUCg0MSksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBTCB9IH0sCi0KLXsgImxoYSIsICAgICBPUCg0MiksCU9QX01BU0ssCUNPTSwJCXsgUlQsIEQsIFJBIH0gfSwKLQoteyAibGhhdSIsICAgIE9QKDQzKSwJT1BfTUFTSywJQ09NLAkJeyBSVCwgRCwgUkFMIH0gfSwKLQoteyAic3RoIiwgICAgIE9QKDQ0KSwJT1BfTUFTSywJQ09NLAkJeyBSUywgRCwgUkEgfSB9LAotCi17ICJzdGh1IiwgICAgT1AoNDUpLAlPUF9NQVNLLAlDT00sCQl7IFJTLCBELCBSQVMgfSB9LAotCi17ICJsbXciLCAgICAgT1AoNDYpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJULCBELCBSQU0gfSB9LAoteyAibG0iLCAgICAgIE9QKDQ2KSwJT1BfTUFTSywJUFdSQ09NLAkJeyBSVCwgRCwgUkEgfSB9LAotCi17ICJzdG13IiwgICAgT1AoNDcpLAlPUF9NQVNLLAlQUENDT00sCQl7IFJTLCBELCBSQSB9IH0sCi17ICJzdG0iLCAgICAgT1AoNDcpLAlPUF9NQVNLLAlQV1JDT00sCQl7IFJTLCBELCBSQSB9IH0sCi0KLXsgImxmcyIsICAgICBPUCg0OCksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQSB9IH0sCi0KLXsgImxmc3UiLCAgICBPUCg0OSksCU9QX01BU0ssCUNPTSwJCXsgRlJULCBELCBSQVMgfSB9LAotCi17ICJsZmQiLCAgICAgT1AoNTApLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkEgfSB9LAotCi17ICJsZmR1IiwgICAgT1AoNTEpLAlPUF9NQVNLLAlDT00sCQl7IEZSVCwgRCwgUkFTIH0gfSwKLQoteyAic3RmcyIsICAgIE9QKDUyKSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3Rmc3UiLCAgIE9QKDUzKSwJT1BfTUFTSywJQ09NLAkJeyBGUlMsIEQsIFJBUyB9IH0sCi0KLXsgInN0ZmQiLCAgICBPUCg1NCksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQSB9IH0sCi0KLXsgInN0ZmR1IiwgICBPUCg1NSksCU9QX01BU0ssCUNPTSwJCXsgRlJTLCBELCBSQVMgfSB9LAotCi17ICJsZnEiLCAgICAgT1AoNTYpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRCwgUkEgfSB9LAotCi17ICJsZnF1IiwgICAgT1AoNTcpLAlPUF9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRCwgUkEgfSB9LAotCi17ICJsZCIsICAgICAgRFNPKDU4LDApLAlEU19NQVNLLAlQUEM2NCwJCXsgUlQsIERTLCBSQSB9IH0sCi0KLXsgImxkdSIsICAgICBEU08oNTgsMSksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBTCB9IH0sCi0KLXsgImx3YSIsICAgICBEU08oNTgsMiksIERTX01BU0ssCVBQQzY0LAkJeyBSVCwgRFMsIFJBIH0gfSwKLQoteyAiZmRpdnMiLCAgIEEoNTksMTgsMCksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZkaXZzLiIsICBBKDU5LDE4LDEpLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi0KLXsgImZzdWJzIiwgICBBKDU5LDIwLDApLCBBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmc3Vicy4iLCAgQSg1OSwyMCwxKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAotCi17ICJmYWRkcyIsICAgQSg1OSwyMSwwKSwgQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmFkZHMuIiwgIEEoNTksMjEsMSksIEFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnNxcnRzIiwgIEEoNTksMjIsMCksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmc3FydHMuIiwgQSg1OSwyMiwxKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZnJlcyIsICAgIEEoNTksMjQsMCksIEFGUkFGUkNfTUFTSywJUFBDLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmcmVzLiIsICAgQSg1OSwyNCwxKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZm11bHMiLCAgIEEoNTksMjUsMCksIEFGUkJfTUFTSywJUFBDLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLXsgImZtdWxzLiIsICBBKDU5LDI1LDEpLCBBRlJCX01BU0ssCVBQQywJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi0KLXsgImZtc3VicyIsICBBKDU5LDI4LDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtc3Vicy4iLCBBKDU5LDI4LDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm1hZGRzIiwgIEEoNTksMjksMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm1hZGRzLiIsIEEoNTksMjksMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbm1zdWJzIiwgQSg1OSwzMCwwKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1zdWJzLiIsQSg1OSwzMCwxKSwgQV9NQVNLLAlQUEMsCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZubWFkZHMiLCBBKDU5LDMxLDApLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZubWFkZHMuIixBKDU5LDMxLDEpLCBBX01BU0ssCVBQQywJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAic3RmcSIsICAgIE9QKDYwKSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3RmcXUiLCAgIE9QKDYxKSwJT1BfTUFTSywJUE9XRVIyLAkJeyBGUlMsIEQsIFJBIH0gfSwKLQoteyAic3RkIiwgICAgIERTTyg2MiwwKSwJRFNfTUFTSywJUFBDNjQsCQl7IFJTLCBEUywgUkEgfSB9LAotCi17ICJzdGR1IiwgICAgRFNPKDYyLDEpLAlEU19NQVNLLAlQUEM2NCwJCXsgUlMsIERTLCBSQVMgfSB9LAotCi17ICJmY21wdSIsICAgWCg2MywwKSwJWF9NQVNLfCgzPDwyMSksCUNPTSwJCXsgQkYsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnJzcCIsICAgIFhSQyg2MywxMiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZnJzcC4iLCAgIFhSQyg2MywxMiwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmY3RpdyIsICAgWFJDKDYzLDE0LDApLCBYUkFfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY2lyIiwgICAgWFJDKDYzLDE0LDApLCBYUkFfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY3Rpdy4iLCAgWFJDKDYzLDE0LDEpLCBYUkFfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY2lyLiIsICAgWFJDKDYzLDE0LDEpLCBYUkFfTUFTSywJUE9XRVIyLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjdGl3eiIsICBYUkMoNjMsMTUsMCksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXJ6IiwgICBYUkMoNjMsMTUsMCksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjdGl3ei4iLCBYUkMoNjMsMTUsMSksIFhSQV9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjaXJ6LiIsICBYUkMoNjMsMTUsMSksIFhSQV9NQVNLLAlQT1dFUjIsCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmRpdiIsICAgIEEoNjMsMTgsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZkIiwgICAgICBBKDYzLDE4LDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmZGl2LiIsICAgQSg2MywxOCwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmQuIiwgICAgIEEoNjMsMTgsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnN1YiIsICAgIEEoNjMsMjAsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZzIiwgICAgICBBKDYzLDIwLDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmc3ViLiIsICAgQSg2MywyMCwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZnMuIiwgICAgIEEoNjMsMjAsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZmFkZCIsICAgIEEoNjMsMjEsMCksIEFGUkNfTUFTSywJUFBDQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLXsgImZhIiwgICAgICBBKDYzLDIxLDApLCBBRlJDX01BU0ssCVBXUkNPTSwJCXsgRlJULCBGUkEsIEZSQiB9IH0sCi17ICJmYWRkLiIsICAgQSg2MywyMSwxKSwgQUZSQ19NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkIgfSB9LAoteyAiZmEuIiwgICAgIEEoNjMsMjEsMSksIEFGUkNfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJCIH0gfSwKLQoteyAiZnNxcnQiLCAgIEEoNjMsMjIsMCksIEFGUkFGUkNfTUFTSywJUFBDUFdSMiwJeyBGUlQsIEZSQiB9IH0sCi17ICJmc3FydC4iLCAgQSg2MywyMiwxKSwgQUZSQUZSQ19NQVNLLAlQUENQV1IyLAl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZnNlbCIsICAgIEEoNjMsMjMsMCksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZnNlbC4iLCAgIEEoNjMsMjMsMSksIEFfTUFTSywJUFBDLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbXVsIiwgICAgQSg2MywyNSwwKSwgQUZSQl9NQVNLLAlQUENDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAoteyAiZm0iLCAgICAgIEEoNjMsMjUsMCksIEFGUkJfTUFTSywJUFdSQ09NLAkJeyBGUlQsIEZSQSwgRlJDIH0gfSwKLXsgImZtdWwuIiwgICBBKDYzLDI1LDEpLCBBRlJCX01BU0ssCVBQQ0NPTSwJCXsgRlJULCBGUkEsIEZSQyB9IH0sCi17ICJmbS4iLCAgICAgQSg2MywyNSwxKSwgQUZSQl9NQVNLLAlQV1JDT00sCQl7IEZSVCwgRlJBLCBGUkMgfSB9LAotCi17ICJmcnNxcnRlIiwgQSg2MywyNiwwKSwgQUZSQUZSQ19NQVNLLAlQUEMsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZyc3FydGUuIixBKDYzLDI2LDEpLCBBRlJBRlJDX01BU0ssCVBQQywJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmbXN1YiIsICAgQSg2MywyOCwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbXMiLCAgICAgQSg2MywyOCwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbXN1Yi4iLCAgQSg2MywyOCwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbXMuIiwgICAgQSg2MywyOCwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZtYWRkIiwgICBBKDYzLDI5LDApLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtYSIsICAgICBBKDYzLDI5LDApLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtYWRkLiIsICBBKDYzLDI5LDEpLCBBX01BU0ssCVBQQ0NPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLXsgImZtYS4iLCAgICBBKDYzLDI5LDEpLCBBX01BU0ssCVBXUkNPTSwJCXsgRlJULEZSQSxGUkMsRlJCIH0gfSwKLQoteyAiZm5tc3ViIiwgIEEoNjMsMzAsMCksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tcyIsICAgIEEoNjMsMzAsMCksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tc3ViLiIsIEEoNjMsMzAsMSksIEFfTUFTSywJUFBDQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAoteyAiZm5tcy4iLCAgIEEoNjMsMzAsMSksIEFfTUFTSywJUFdSQ09NLAkJeyBGUlQsRlJBLEZSQyxGUkIgfSB9LAotCi17ICJmbm1hZGQiLCAgQSg2MywzMSwwKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1hIiwgICAgQSg2MywzMSwwKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1hZGQuIiwgQSg2MywzMSwxKSwgQV9NQVNLLAlQUENDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi17ICJmbm1hLiIsICAgQSg2MywzMSwxKSwgQV9NQVNLLAlQV1JDT00sCQl7IEZSVCxGUkEsRlJDLEZSQiB9IH0sCi0KLXsgImZjbXBvIiwgICBYKDYzLDMyKSwJWF9NQVNLfCgzPDwyMSksCUNPTSwJCXsgQkYsIEZSQSwgRlJCIH0gfSwKLQoteyAibXRmc2IxIiwgIFhSQyg2MywzOCwwKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBCVCB9IH0sCi17ICJtdGZzYjEuIiwgWFJDKDYzLDM4LDEpLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKLQoteyAiZm5lZyIsICAgIFhSQyg2Myw0MCwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZm5lZy4iLCAgIFhSQyg2Myw0MCwxKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJtY3JmcyIsICAgWCg2Myw2NCksCVhSQl9NQVNLfCgzPDwyMSl8KDM8PDE2KSwgQ09NLAl7IEJGLCBCRkEgfSB9LAotCi17ICJtdGZzYjAiLCAgWFJDKDYzLDcwLDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEJUIH0gfSwKLXsgIm10ZnNiMC4iLCBYUkMoNjMsNzAsMSksIFhSQVJCX01BU0ssCUNPTSwJCXsgQlQgfSB9LAotCi17ICJmbXIiLCAgICAgWFJDKDYzLDcyLDApLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmbXIuIiwgICAgWFJDKDYzLDcyLDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgIm10ZnNmaSIsICBYUkMoNjMsMTM0LDApLCBYUkFfTUFTS3woMzw8MjEpfCgxPDwxMSksIENPTSwgeyBCRiwgVSB9IH0sCi17ICJtdGZzZmkuIiwgWFJDKDYzLDEzNCwxKSwgWFJBX01BU0t8KDM8PDIxKXwoMTw8MTEpLCBDT00sIHsgQkYsIFUgfSB9LAotCi17ICJmbmFicyIsICAgWFJDKDYzLDEzNiwwKSwgWFJBX01BU0ssCUNPTSwJCXsgRlJULCBGUkIgfSB9LAoteyAiZm5hYnMuIiwgIFhSQyg2MywxMzYsMSksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLQoteyAiZmFicyIsICAgIFhSQyg2MywyNjQsMCksIFhSQV9NQVNLLAlDT00sCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZhYnMuIiwgICBYUkMoNjMsMjY0LDEpLCBYUkFfTUFTSywJQ09NLAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgIm1mZnMiLCAgICBYUkMoNjMsNTgzLDApLCBYUkFSQl9NQVNLLAlDT00sCQl7IEZSVCB9IH0sCi17ICJtZmZzLiIsICAgWFJDKDYzLDU4MywxKSwgWFJBUkJfTUFTSywJQ09NLAkJeyBGUlQgfSB9LAotCi17ICJtdGZzZiIsICAgWEZMKDYzLDcxMSwwKSwgWEZMX01BU0ssCUNPTSwJCXsgRkxNLCBGUkIgfSB9LAoteyAibXRmc2YuIiwgIFhGTCg2Myw3MTEsMSksIFhGTF9NQVNLLAlDT00sCQl7IEZMTSwgRlJCIH0gfSwKLQoteyAiZmN0aWQiLCAgIFhSQyg2Myw4MTQsMCksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAoteyAiZmN0aWQuIiwgIFhSQyg2Myw4MTQsMSksIFhSQV9NQVNLLAlQUEM2NCwJCXsgRlJULCBGUkIgfSB9LAotCi17ICJmY3RpZHoiLCAgWFJDKDYzLDgxNSwwKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi17ICJmY3RpZHouIiwgWFJDKDYzLDgxNSwxKSwgWFJBX01BU0ssCVBQQzY0LAkJeyBGUlQsIEZSQiB9IH0sCi0KLXsgImZjZmlkIiwgICBYUkMoNjMsODQ2LDApLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLXsgImZjZmlkLiIsICBYUkMoNjMsODQ2LDEpLCBYUkFfTUFTSywJUFBDNjQsCQl7IEZSVCwgRlJCIH0gfSwKLQotfTsKLQotY29uc3QgaW50IHBvd2VycGNfbnVtX29wY29kZXMgPQotICBzaXplb2YgKHBvd2VycGNfb3Bjb2RlcykgLyBzaXplb2YgKHBvd2VycGNfb3Bjb2Rlc1swXSk7Ci0MCi0vKiBUaGUgbWFjcm8gdGFibGUuICBUaGlzIGlzIG9ubHkgdXNlZCBieSB0aGUgYXNzZW1ibGVyLiAgKi8KLQotLyogVGhlIGV4cHJlc3Npb25zIG9mIHRoZSBmb3JtICgteCAhIDMxKSAmICh4IHwgMzEpIGhhdmUgdGhlIHZhbHVlIDAKLSAgIHdoZW4geD0wOyAzMi14IHdoZW4geCBpcyBiZXR3ZWVuIDEgYW5kIDMxOyBhcmUgbmVnYXRpdmUgaWYgeCBpcwotICAgbmVnYXRpdmU7IGFuZCBhcmUgMzIgb3IgbW9yZSBvdGhlcndpc2UuICBUaGlzIGlzIHdoYXQgeW91IHdhbnQKLSAgIHdoZW4sIGZvciBpbnN0YW5jZSwgeW91IGFyZSBlbXVsYXRpbmcgYSByaWdodCBzaGlmdCBieSBhCi0gICByb3RhdGUtbGVmdC1hbmQtbWFzaywgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbnMgc3VwcG9ydAotICAgc2hpZnRzIG9mIHNpemUgMCBidXQgbm90IHNoaWZ0cyBvZiBzaXplIDMyLiAgQnkgY29tcGFyaXNvbiwgd2hlbgotICAgZXh0cmFjdGluZyB4IGJpdHMgZnJvbSBzb21lIHdvcmQgeW91IHdhbnQgdG8gdXNlIGp1c3QgMzIteCwgYmVjYXVzZQotICAgdGhlIHVuZGVybHlpbmcgaW5zdHJ1Y3Rpb25zIGRvbid0IHN1cHBvcnQgZXh0cmFjdGluZyAwIGJpdHMgYnV0IGRvCi0gICBzdXBwb3J0IGV4dHJhY3RpbmcgdGhlIHdob2xlIHdvcmQgKDMyIGJpdHMgaW4gdGhpcyBjYXNlKS4gICovCi0KLWNvbnN0IHN0cnVjdCBwb3dlcnBjX21hY3JvIHBvd2VycGNfbWFjcm9zW10gPSB7Ci17ICJleHRsZGkiLCAgNCwgICBQUEM2NCwJInJsZGljciAlMCwlMSwlMywoJTIpLTEiIH0sCi17ICJleHRsZGkuIiwgNCwgICBQUEM2NCwJInJsZGljci4gJTAsJTEsJTMsKCUyKS0xIiB9LAoteyAiZXh0cmRpIiwgIDQsICAgUFBDNjQsCSJybGRpY2wgJTAsJTEsKCUyKSsoJTMpLDY0LSglMikiIH0sCi17ICJleHRyZGkuIiwgNCwgICBQUEM2NCwJInJsZGljbC4gJTAsJTEsKCUyKSsoJTMpLDY0LSglMikiIH0sCi17ICJpbnNyZGkiLCAgNCwgICBQUEM2NCwJInJsZGltaSAlMCwlMSw2NC0oKCUyKSsoJTMpKSwlMyIgfSwKLXsgImluc3JkaS4iLCA0LCAgIFBQQzY0LAkicmxkaW1pLiAlMCwlMSw2NC0oKCUyKSsoJTMpKSwlMyIgfSwKLXsgInJvdHJkaSIsICAzLCAgIFBQQzY0LAkicmxkaWNsICUwLCUxLCgtKCUyKSE2MykmKCglMil8NjMpLDAiIH0sCi17ICJyb3RyZGkuIiwgMywgICBQUEM2NCwJInJsZGljbC4gJTAsJTEsKC0oJTIpITYzKSYoKCUyKXw2MyksMCIgfSwKLXsgInNsZGkiLCAgICAzLCAgIFBQQzY0LAkicmxkaWNyICUwLCUxLCUyLDYzLSglMikiIH0sCi17ICJzbGRpLiIsICAgMywgICBQUEM2NCwJInJsZGljci4gJTAsJTEsJTIsNjMtKCUyKSIgfSwKLXsgInNyZGkiLCAgICAzLCAgIFBQQzY0LAkicmxkaWNsICUwLCUxLCgtKCUyKSE2MykmKCglMil8NjMpLCUyIiB9LAoteyAic3JkaS4iLCAgIDMsICAgUFBDNjQsCSJybGRpY2wuICUwLCUxLCgtKCUyKSE2MykmKCglMil8NjMpLCUyIiB9LAoteyAiY2xycmRpIiwgIDMsICAgUFBDNjQsCSJybGRpY3IgJTAsJTEsMCw2My0oJTIpIiB9LAoteyAiY2xycmRpLiIsIDMsICAgUFBDNjQsCSJybGRpY3IuICUwLCUxLDAsNjMtKCUyKSIgfSwKLXsgImNscmxzbGRpIiw0LCAgIFBQQzY0LAkicmxkaWMgJTAsJTEsJTMsKCUyKS0oJTMpIiB9LAoteyAiY2xybHNsZGkuIiw0LCAgUFBDNjQsCSJybGRpYy4gJTAsJTEsJTMsKCUyKS0oJTMpIiB9LAotCi17ICJleHRsd2kiLCAgNCwgICBQUENDT00sCSJybHdpbm0gJTAsJTEsJTMsMCwoJTIpLTEiIH0sCi17ICJleHRsd2kuIiwgNCwgICBQUENDT00sCSJybHdpbm0uICUwLCUxLCUzLDAsKCUyKS0xIiB9LAoteyAiZXh0cndpIiwgIDQsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCglMikrKCUzKSwzMi0oJTIpLDMxIiB9LAoteyAiZXh0cndpLiIsIDQsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwoJTIpKyglMyksMzItKCUyKSwzMSIgfSwKLXsgImluc2x3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2ltaSAlMCwlMSwoLSglMykhMzEpJigoJTMpfDMxKSwlMywoJTIpKyglMyktMSIgfSwKLXsgImluc2x3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2ltaS4gJTAsJTEsKC0oJTMpITMxKSYoKCUzKXwzMSksJTMsKCUyKSsoJTMpLTEifSwKLXsgImluc3J3aSIsICA0LCAgIFBQQ0NPTSwJInJsd2ltaSAlMCwlMSwzMi0oKCUyKSsoJTMpKSwlMywoJTIpKyglMyktMSIgfSwKLXsgImluc3J3aS4iLCA0LCAgIFBQQ0NPTSwJInJsd2ltaS4gJTAsJTEsMzItKCglMikrKCUzKSksJTMsKCUyKSsoJTMpLTEifSwKLXsgInJvdHJ3aSIsICAzLCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwwLDMxIiB9LAoteyAicm90cndpLiIsIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwwLDMxIiB9LAoteyAic2x3aSIsICAgIDMsICAgUFBDQ09NLAkicmx3aW5tICUwLCUxLCUyLDAsMzEtKCUyKSIgfSwKLXsgInNsaSIsICAgICAzLCAgIFBXUkNPTSwJInJsaW5tICUwLCUxLCUyLDAsMzEtKCUyKSIgfSwKLXsgInNsd2kuIiwgICAzLCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsJTIsMCwzMS0oJTIpIiB9LAoteyAic2xpLiIsICAgIDMsICAgUFdSQ09NLAkicmxpbm0uICUwLCUxLCUyLDAsMzEtKCUyKSIgfSwKLXsgInNyd2kiLCAgICAzLCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwlMiwzMSIgfSwKLXsgInNyaSIsICAgICAzLCAgIFBXUkNPTSwJInJsaW5tICUwLCUxLCgtKCUyKSEzMSkmKCglMil8MzEpLCUyLDMxIiB9LAoteyAic3J3aS4iLCAgIDMsICAgUFBDQ09NLAkicmx3aW5tLiAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwlMiwzMSIgfSwKLXsgInNyaS4iLCAgICAzLCAgIFBXUkNPTSwJInJsaW5tLiAlMCwlMSwoLSglMikhMzEpJigoJTIpfDMxKSwlMiwzMSIgfSwKLXsgImNscnJ3aSIsICAzLCAgIFBQQ0NPTSwJInJsd2lubSAlMCwlMSwwLDAsMzEtKCUyKSIgfSwKLXsgImNscnJ3aS4iLCAzLCAgIFBQQ0NPTSwJInJsd2lubS4gJTAsJTEsMCwwLDMxLSglMikiIH0sCi17ICJjbHJsc2x3aSIsNCwgICBQUENDT00sCSJybHdpbm0gJTAsJTEsJTMsKCUyKS0oJTMpLDMxLSglMykiIH0sCi17ICJjbHJsc2x3aS4iLDQsICBQUENDT00sCSJybHdpbm0uICUwLCUxLCUzLCglMiktKCUzKSwzMS0oJTMpIiB9LAotCi19OwotCi1jb25zdCBpbnQgcG93ZXJwY19udW1fbWFjcm9zID0KLSAgc2l6ZW9mIChwb3dlcnBjX21hY3JvcykgLyBzaXplb2YgKHBvd2VycGNfbWFjcm9zWzBdKTsKZGlmZiAtLWdpdCBhL29wY29kZXMvc2gtZGlzLmMgYi9vcGNvZGVzL3NoLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJmZGI2Li4wMDAwMDAwCi0tLSBhL29wY29kZXMvc2gtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgU0ggaW5zdHJ1Y3Rpb25zLgotICAgQ29weXJpZ2h0IChDKSAxOTkzLCA5NCwgOTUsIDk2LCA5NywgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIFNUQVRJQ19UQUJMRQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2luY2x1ZGUgInNoLW9wYy5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotI2RlZmluZSBMSVRUTEVfQklUIDIKLQotc3RhdGljIGludCAKLXByaW50X2luc25fc2h4IChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBmcHJpbnRmX2Z0eXBlIGZwcmludGZfZm4gPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci0gIHZvaWQgKnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKLSAgdW5zaWduZWQgY2hhciBpbnNuWzJdOwotICB1bnNpZ25lZCBjaGFyIG5pYnNbNF07Ci0gIGludCBzdGF0dXM7Ci0gIGJmZF92bWEgcmVsbWFzayA9IH4gKGJmZF92bWEpIDA7Ci0gIHNoX29wY29kZV9pbmZvICpvcDsKLQotICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBpbnNuLCAyLCBpbmZvKTsKLQotICBpZiAoc3RhdHVzICE9IDApIAotICAgIHsKLSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICBpZiAoaW5mby0+ZmxhZ3MgJiBMSVRUTEVfQklUKSAKLSAgICB7Ci0gICAgICBuaWJzWzBdID0gKGluc25bMV0gPj4gNCkgJiAweGY7Ci0gICAgICBuaWJzWzFdID0gaW5zblsxXSAmIDB4ZjsKLQotICAgICAgbmlic1syXSA9IChpbnNuWzBdID4+IDQpICYgMHhmOwotICAgICAgbmlic1szXSA9IGluc25bMF0gJiAweGY7Ci0gICAgfQotICBlbHNlIAotICAgIHsKLSAgICAgIG5pYnNbMF0gPSAoaW5zblswXSA+PiA0KSAmIDB4ZjsKLSAgICAgIG5pYnNbMV0gPSBpbnNuWzBdICYgMHhmOwotCi0gICAgICBuaWJzWzJdID0gKGluc25bMV0gPj4gNCkgJiAweGY7Ci0gICAgICBuaWJzWzNdID0gaW5zblsxXSAmIDB4ZjsKLSAgICB9Ci0KLSAgZm9yIChvcCA9IHNoX3RhYmxlOyBvcC0+bmFtZTsgb3ArKykgCi0gICAgewotICAgICAgaW50IG47Ci0gICAgICBpbnQgaW1tID0gMDsKLSAgICAgIGludCBybiA9IDA7Ci0gICAgICBpbnQgcm0gPSAwOwotICAgICAgaW50IHJiID0gMDsKLSAgICAgIGludCBkaXNwX3BjOwotICAgICAgYmZkX3ZtYSBkaXNwX3BjX2FkZHIgPSAwOwotCi0gICAgICBmb3IgKG4gPSAwOyBuIDwgNDsgbisrKQotCXsKLQkgIGludCBpID0gb3AtPm5pYmJsZXNbbl07Ci0KLQkgIGlmIChpIDwgMTYpIAotCSAgICB7Ci0JICAgICAgaWYgKG5pYnNbbl0gPT0gaSkKLQkJY29udGludWU7Ci0JICAgICAgZ290byBmYWlsOwotCSAgICB9Ci0JICBzd2l0Y2ggKGkpCi0JICAgIHsKLQkgICAgY2FzZSBCUkFOQ0hfODoKLQkgICAgICBpbW0gPSAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsJICAKLQkgICAgICBpZiAoaW1tICYgMHg4MCkKLQkJaW1tIHw9IH4weGZmOwotCSAgICAgIGltbSA9ICgoY2hhcilpbW0pICogMiArIDQgOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgQlJBTkNIXzEyOgotCSAgICAgIGltbSA9ICgobmlic1sxXSkgPDwgOCkgfCAobmlic1syXSA8PCA0KSB8IChuaWJzWzNdKTsKLQkgICAgICBpZiAoaW1tICYgMHg4MDApCi0JCWltbSB8PSB+MHhmZmY7Ci0JICAgICAgaW1tID0gaW1tICogMiArIDQ7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fNDoKLQkgICAgICBpbW0gPSBuaWJzWzNdOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgSU1NXzRCWTI6Ci0JICAgICAgaW1tID0gbmlic1szXSA8PDE7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fNEJZNDoKLQkgICAgICBpbW0gPSBuaWJzWzNdIDw8MjsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIElNTV84OgotCSAgICAgIGltbSA9IChuaWJzWzJdIDw8IDQpIHwgbmlic1szXTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIFBDUkVMSU1NXzhCWTI6Ci0JICAgICAgaW1tID0gKChuaWJzWzJdIDw8IDQpIHwgbmlic1szXSkgPDwxOwotCSAgICAgIHJlbG1hc2sgPSB+IChiZmRfdm1hKSAxOwotCSAgICAgIGdvdG8gb2s7Ci0JICAgIGNhc2UgUENSRUxJTU1fOEJZNDoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDI7Ci0JICAgICAgcmVsbWFzayA9IH4gKGJmZF92bWEpIDM7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fOEJZMjoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDE7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBJTU1fOEJZNDoKLQkgICAgICBpbW0gPSAoKG5pYnNbMl0gPDwgNCkgfCBuaWJzWzNdKSA8PDI7Ci0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBESVNQXzg6Ci0JICAgICAgaW1tID0gKG5pYnNbMl0gPDwgNCkgfCAobmlic1szXSk7CSAgCi0JICAgICAgZ290byBvazsKLQkgICAgY2FzZSBESVNQXzQ6Ci0JICAgICAgaW1tID0gbmlic1szXTsKLQkgICAgICBnb3RvIG9rOwotCSAgICBjYXNlIFJFR19OOgotCSAgICAgIHJuID0gbmlic1tuXTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBSRUdfTToKLQkgICAgICBybSA9IG5pYnNbbl07Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX05NOgotCSAgICAgIHJuID0gKG5pYnNbbl0gJiAweGMpID4+IDI7Ci0JICAgICAgcm0gPSAobmlic1tuXSAmIDB4Myk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgUkVHX0I6Ci0JICAgICAgcmIgPSBuaWJzW25dICYgMHgwNzsKLQkgICAgICBicmVhazsJCi0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLQotICAgIG9rOgotICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCIlc1x0Iiwgb3AtPm5hbWUpOwotICAgICAgZGlzcF9wYyA9IDA7Ci0gICAgICBmb3IgKG4gPSAwOyBuIDwgMyAmJiBvcC0+YXJnW25dICE9IEFfRU5EOyBuKyspIAotCXsKLQkgIGlmIChuICYmIG9wLT5hcmdbMV0gIT0gQV9FTkQpCi0JICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIiwiKTsKLQkgIHN3aXRjaCAob3AtPmFyZ1tuXSkgCi0JICAgIHsKLQkgICAgY2FzZSBBX0lNTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICIjJWQiLCAoY2hhcikoaW1tKSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SMDoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiciVkIiwgcm4pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5DX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCsiLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfREVDX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQC1yJWQiLCBybik7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5EX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQHIlZCIsIHJuKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9ESVNQX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAoJWQsciVkKSIsIGltbSwgcm4pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInIlZCIsIHJtKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lOQ19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQrIiwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RFQ19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAtciVkIiwgcm0pOwkKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0lORF9NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkByJWQiLCBybSk7CQotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfRElTUF9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKCVkLHIlZCkiLCBpbW0sIHJtKTsJCi0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9SRUdfQjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJyJWRfYmFuayIsIHJiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RJU1BfUEM6Ci0JICAgICAgZGlzcF9wYyA9IDE7Ci0JICAgICAgZGlzcF9wY19hZGRyID0gaW1tICsgNCArIChtZW1hZGRyICYgcmVsbWFzayk7Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChkaXNwX3BjX2FkZHIsIGluZm8pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfSU5EX1IwX1JFR19OOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAocjAsciVkKSIsIHJuKTsKLQkgICAgICBicmVhazsgCi0JICAgIGNhc2UgQV9JTkRfUjBfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiQChyMCxyJWQpIiwgcm0pOwotCSAgICAgIGJyZWFrOyAKLQkgICAgY2FzZSBBX0RJU1BfR0JSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIkAoJWQsZ2JyKSIsaW1tKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1IwX0dCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJAKHIwLGdicikiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0JESVNQMTI6Ci0JICAgIGNhc2UgQV9CRElTUDg6Ci0JICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbW0gKyBtZW1hZGRyLCBpbmZvKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NSOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInNyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9HQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZ2JyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9WQlI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAidmJyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9TU1I6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic3NyIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9TUEM6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAic3BjIik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQV9NQUNIOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgIm1hY2giKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX01BQ0w6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtICwibWFjbCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFfUFI6Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAicHIiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX1NHUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJzZ3IiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBX0RCUjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJkYnIiKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGRF9SRUdfTjoKLQkgICAgICBpZiAoMCkKLQkJZ290byBkX3JlZ19uOwotCSAgICBjYXNlIEZfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBGX1JFR19NOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZyJWQiLCBybSk7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgRFhfUkVHX046Ci0JICAgICAgaWYgKHJuICYgMSkKLQkJewotCQkgIGZwcmludGZfZm4gKHN0cmVhbSwgInhkJWQiLCBybiAmIH4xKTsKLQkJICBicmVhazsKLQkJfQotCSAgICBkX3JlZ19uOgotCSAgICBjYXNlIERfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZHIlZCIsIHJuKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBEWF9SRUdfTToKLQkgICAgICBpZiAocm0gJiAxKQotCQl7Ci0JCSAgZnByaW50Zl9mbiAoc3RyZWFtLCAieGQlZCIsIHJtICYgfjEpOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgIGNhc2UgRF9SRUdfTToKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJkciVkIiwgcm0pOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQU0NSX006Ci0JICAgIGNhc2UgRlBTQ1JfTjoKLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJmcHNjciIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZQVUxfTToKLQkgICAgY2FzZSBGUFVMX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnB1bCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEZfRlIwOgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgImZyMCIpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZfUkVHX046Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnYlZCIsIHJuKjQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFZfUkVHX006Ci0JICAgICAgZnByaW50Zl9mbiAoc3RyZWFtLCAiZnYlZCIsIHJtKjQpOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIFhNVFJYX000OgotCSAgICAgIGZwcmludGZfZm4gKHN0cmVhbSwgInhtdHJ4Iik7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYWJvcnQoKTsKLQkgICAgfQotCX0KLQotI2lmIDAKLSAgICAgIC8qIFRoaXMgY29kZSBwcmludHMgaW5zdHJ1Y3Rpb25zIGluIGRlbGF5IHNsb3RzIG9uIHRoZSBzYW1lIGxpbmUKLSAgICAgICAgIGFzIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBuZWVkcyB0aGUgZGVsYXkgc2xvdHMuICBUaGlzIGNhbiBiZQotICAgICAgICAgY29uZnVzaW5nLCBzaW5jZSBvdGhlciBkaXNhc3NlbWJsZXIgZG9uJ3Qgd29yayB0aGlzIHdheSwgYW5kCi0gICAgICAgICBpdCBtZWFucyB0aGF0IHRoZSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBhbGwgaW4gYSBsaW5lLiAgU28gSQotICAgICAgICAgZGlzYWJsZWQgaXQuICBJYW4uICAqLwotICAgICAgaWYgKCEoaW5mby0+ZmxhZ3MgJiAxKQotCSAgJiYgKG9wLT5uYW1lWzBdID09ICdqJwotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAnYicKLQkJICAmJiAob3AtPm5hbWVbMV0gPT0gJ3InIAotCQkgICAgICB8fCBvcC0+bmFtZVsxXSA9PSAncycpKQotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAncicgJiYgb3AtPm5hbWVbMV0gPT0gJ3QnKQotCSAgICAgIHx8IChvcC0+bmFtZVswXSA9PSAnYicgJiYgb3AtPm5hbWVbMl0gPT0gJy4nKSkpCi0JewotCSAgaW5mby0+ZmxhZ3MgfD0gMTsKLQkgIGZwcmludGZfZm4gKHN0cmVhbSwgIlx0KHNsb3QgIik7Ci0JICBwcmludF9pbnNuX3NoeCAobWVtYWRkciArIDIsIGluZm8pOwotCSAgaW5mby0+ZmxhZ3MgJj0gfjE7Ci0JICBmcHJpbnRmX2ZuIChzdHJlYW0sICIpIik7Ci0JICByZXR1cm4gNDsKLQl9Ci0jZW5kaWYKLQotICAgICAgaWYgKGRpc3BfcGMgJiYgc3RyY21wIChvcC0+bmFtZSwgIm1vdmEiKSAhPSAwKQotCXsKLQkgIGludCBzaXplOwotCSAgYmZkX2J5dGUgYnl0ZXNbNF07Ci0KLQkgIGlmIChyZWxtYXNrID09IH4gKGJmZF92bWEpIDEpCi0JICAgIHNpemUgPSAyOwotCSAgZWxzZQotCSAgICBzaXplID0gNDsKLQkgIHN0YXR1cyA9IGluZm8tPnJlYWRfbWVtb3J5X2Z1bmMgKGRpc3BfcGNfYWRkciwgYnl0ZXMsIHNpemUsIGluZm8pOwotCSAgaWYgKHN0YXR1cyA9PSAwKQotCSAgICB7Ci0JICAgICAgdW5zaWduZWQgaW50IHZhbDsKLQotCSAgICAgIGlmIChzaXplID09IDIpCi0JCXsKLQkJICBpZiAoKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgIT0gMCkKLQkJICAgIHZhbCA9IGJmZF9nZXRsMTYgKGJ5dGVzKTsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSBiZmRfZ2V0YjE2IChieXRlcyk7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpZiAoKGluZm8tPmZsYWdzICYgTElUVExFX0JJVCkgIT0gMCkKLQkJICAgIHZhbCA9IGJmZF9nZXRsMzIgKGJ5dGVzKTsKLQkJICBlbHNlCi0JCSAgICB2YWwgPSBiZmRfZ2V0YjMyIChieXRlcyk7Ci0JCX0KLQkgICAgICBmcHJpbnRmX2ZuIChzdHJlYW0sICJcdCEgMHgleCIsIHZhbCk7Ci0JICAgIH0KLQl9Ci0KLSAgICAgIHJldHVybiAyOwotICAgIGZhaWw6Ci0gICAgICA7Ci0KLSAgICB9Ci0gIGZwcmludGZfZm4gKHN0cmVhbSwgIi53b3JkIDB4JXgleCV4JXgiLCBuaWJzWzBdLCBuaWJzWzFdLCBuaWJzWzJdLCBuaWJzWzNdKTsKLSAgcmV0dXJuIDI7Ci19Ci0KLWludCAKLXByaW50X2luc25fc2hsIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgcjsKLQotICBpbmZvLT5mbGFncyA9IExJVFRMRV9CSVQ7Ci0gIHIgPSBwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbyk7Ci0gIHJldHVybiByOwotfQotCi1pbnQgCi1wcmludF9pbnNuX3NoIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgcjsKLQotICBpbmZvLT5mbGFncyA9IDA7Ci0gIHIgPSBwcmludF9pbnNuX3NoeCAobWVtYWRkciwgaW5mbyk7Ci0gIHJldHVybiByOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zaC1vcGMuaCBiL29wY29kZXMvc2gtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWFhZTUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zaC1vcGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKiBEZWZpbml0aW9ucyBmb3IgU0ggb3Bjb2Rlcy4KLSAgIENvcHlyaWdodCAoQykgMTk5MywgOTQsIDk1LCA5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlIRVhfMCwKLQlIRVhfMSwKLQlIRVhfMiwKLQlIRVhfMywKLQlIRVhfNCwKLQlIRVhfNSwKLQlIRVhfNiwKLQlIRVhfNywKLQlIRVhfOCwKLQlIRVhfOSwKLQlIRVhfQSwKLQlIRVhfQiwKLQlIRVhfQywKLQlIRVhfRCwKLQlIRVhfRSwKLQlIRVhfRiwKLQlSRUdfTiwKLQlSRUdfTSwKLQlSRUdfTk0sCi0gICAgICAgIFJFR19CLAotCUJSQU5DSF8xMiwKLQlCUkFOQ0hfOCwKLQlESVNQXzgsCi0JRElTUF80LAotCUlNTV80LAotCUlNTV80QlkyLAotCUlNTV80Qlk0LAotCVBDUkVMSU1NXzhCWTIsCi0JUENSRUxJTU1fOEJZNCwKLQlJTU1fOCwKLQlJTU1fOEJZMiwKLQlJTU1fOEJZNAotfSBzaF9uaWJibGVfdHlwZTsKLQotdHlwZWRlZiBlbnVtIHsKLQlBX0VORCwKLQlBX0JESVNQMTIsCi0JQV9CRElTUDgsCi0JQV9ERUNfTSwKLQlBX0RFQ19OLAotCUFfRElTUF9HQlIsCi0JQV9ESVNQX1BDLAotCUFfRElTUF9SRUdfTSwKLQlBX0RJU1BfUkVHX04sCi0JQV9HQlIsCi0JQV9JTU0sCi0JQV9JTkNfTSwKLQlBX0lOQ19OLAotCUFfSU5EX00sCi0JQV9JTkRfTiwKLQlBX0lORF9SMF9SRUdfTSwKLQlBX0lORF9SMF9SRUdfTiwKLQlBX01BQ0gsCi0JQV9NQUNMLAotCUFfUFIsCi0JQV9SMCwKLQlBX1IwX0dCUiwKLQlBX1JFR19NLAotCUFfUkVHX04sCi0JQV9SRUdfQiwKLQlBX1NSLAotCUFfVkJSLAotCUFfU1NSLAotCUFfU1BDLAotCUFfU0dSLAotCUFfREJSLAotCUZfUkVHX04sCi0JRl9SRUdfTSwKLQlEX1JFR19OLAotCURfUkVHX00sCi0JWF9SRUdfTiwgLyogT25seSB1c2VkIGZvciBhcmd1bWVudCBwYXJzaW5nICovCi0JWF9SRUdfTSwgLyogT25seSB1c2VkIGZvciBhcmd1bWVudCBwYXJzaW5nICovCi0JRFhfUkVHX04sCi0JRFhfUkVHX00sCi0JVl9SRUdfTiwKLQlWX1JFR19NLAotCUZEX1JFR19OLAotCVhNVFJYX000LAotCUZfRlIwLAotCUZQVUxfTiwKLQlGUFVMX00sCi0JRlBTQ1JfTiwKLQlGUFNDUl9NCi19IHNoX2FyZ190eXBlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIHNoX2FyZ190eXBlIGFyZ1s0XTsKLSAgc2hfbmliYmxlX3R5cGUgbmliYmxlc1s0XTsKLX0gc2hfb3Bjb2RlX2luZm87Ci0KLSNpZmRlZiBERUZJTkVfVEFCTEUKLQotc2hfb3Bjb2RlX2luZm8gc2hfdGFibGVbXSA9IHsKLQotLyogMDExMW5ubm5pOCoxLi4uLiBhZGQgIzxpbW0+LDxSRUdfTj4gICoveyJhZGQiLHtBX0lNTSxBX1JFR19OfSx7SEVYXzcsUkVHX04sSU1NXzh9fSwKLQotLyogMDAxMW5ubm5tbW1tMTEwMCBhZGQgPFJFR19NPiw8UkVHX04+ICoveyJhZGQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDAxMW5ubm5tbW1tMTExMCBhZGRjIDxSRUdfTT4sPFJFR19OPioveyJhZGRjIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAwMTFubm5ubW1tbTExMTEgYWRkdiA8UkVHX00+LDxSRUdfTj4qL3siYWRkdiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAxMTAwMTAwMWk4KjEuLi4uIGFuZCAjPGltbT4sUjAgICAgICAgKi97ImFuZCIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfOSxJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMDAxIGFuZCA8UkVHX00+LDxSRUdfTj4gKi97ImFuZCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAxMTAwMTEwMWk4KjEuLi4uIGFuZC5iICM8aW1tPixAKFIwLEdCUikqL3siYW5kLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9ELElNTV84fX0sCi0KLS8qIDEwMTBpMTIuLi4uLi4uLi4gYnJhIDxiZGlzcDEyPiAgICAgICAqL3siYnJhIix7QV9CRElTUDEyfSx7SEVYX0EsQlJBTkNIXzEyfX0sCi0KLS8qIDEwMTFpMTIuLi4uLi4uLi4gYnNyIDxiZGlzcDEyPiAgICAgICAqL3siYnNyIix7QV9CRElTUDEyfSx7SEVYX0IsQlJBTkNIXzEyfX0sCi0KLS8qIDEwMDAxMDAxaThwMS4uLi4gYnQgPGJkaXNwOD4gICAgICAgICAqL3siYnQiLHtBX0JESVNQOH0se0hFWF84LEhFWF85LEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMDExaThwMS4uLi4gYmYgPGJkaXNwOD4gICAgICAgICAqL3siYmYiLHtBX0JESVNQOH0se0hFWF84LEhFWF9CLEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMTAxaThwMS4uLi4gYnQucyA8YmRpc3A4PiAgICAgICAqL3siYnQucyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0QsQlJBTkNIXzh9fSwKLQotLyogMTAwMDExMDFpOHAxLi4uLiBidC9zIDxiZGlzcDg+ICAgICAgICoveyJidC9zIix7QV9CRElTUDh9LHtIRVhfOCxIRVhfRCxCUkFOQ0hfOH19LAotCi0vKiAxMDAwMTExMWk4cDEuLi4uIGJmLnMgPGJkaXNwOD4gICAgICAgKi97ImJmLnMiLHtBX0JESVNQOH0se0hFWF84LEhFWF9GLEJSQU5DSF84fX0sCi0KLS8qIDEwMDAxMTExaThwMS4uLi4gYmYvcyA8YmRpc3A4PiAgICAgICAqL3siYmYvcyIse0FfQkRJU1A4fSx7SEVYXzgsSEVYX0YsQlJBTkNIXzh9fSwKLQotLyogMDAwMDAwMDAwMDEwMTAwMCBjbHJtYWMgICAgICAgICAgICAgICoveyJjbHJtYWMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzIsSEVYXzh9fSwKLQotLyogMDAwMDAwMDAwMTAwMTAwMCBjbHJzICAgICAgICAgICAgICAgICoveyJjbHJzIix7MH0se0hFWF8wLEhFWF8wLEhFWF80LEhFWF84fX0sCi0KLS8qIDAwMDAwMDAwMDAwMDEwMDAgY2xydCAgICAgICAgICAgICAgICAqL3siY2xydCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOH19LAotCi0vKiAxMDAwMTAwMGk4KjEuLi4uIGNtcC9lcSAjPGltbT4sUjAgICAgKi97ImNtcC9lcSIse0FfSU1NLEFfUjB9LHtIRVhfOCxIRVhfOCxJTU1fOH19LAotCi0vKiAwMDExbm5ubm1tbW0wMDAwIGNtcC9lcSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2VxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF8wfX0sCi0KLS8qIDAwMTFubm5ubW1tbTAwMTEgY21wL2dlIDxSRUdfTT4sPFJFR19OPioveyJjbXAvZ2UiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzN9fSwKLQotLyogMDAxMW5ubm5tbW1tMDExMSBjbXAvZ3QgPFJFR19NPiw8UkVHX04+Ki97ImNtcC9ndCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAwMDExbm5ubm1tbW0wMTEwIGNtcC9oaSA8UkVHX00+LDxSRUdfTj4qL3siY21wL2hpIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDAwMTFubm5ubW1tbTAwMTAgY21wL2hzIDxSRUdfTT4sPFJFR19OPioveyJjbXAvaHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMDAxMDEwMSBjbXAvcGwgPFJFR19OPiAgICAgICoveyJjbXAvcGwiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzV9fSwKLQotLyogMDEwMG5ubm4wMDAxMDAwMSBjbXAvcHogPFJFR19OPiAgICAgICoveyJjbXAvcHoiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzEsSEVYXzF9fSwKLQotLyogMDAxMG5ubm5tbW1tMTEwMCBjbXAvc3RyIDxSRUdfTT4sPFJFR19OPioveyJjbXAvc3RyIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMTEgZGl2MHMgPFJFR19NPiw8UkVHX04+Ki97ImRpdjBzIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMDEgZGl2MHUgICAgICAgICAgICAgICAqL3siZGl2MHUiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYXzl9fSwKLQotLyogMDAxMW5ubm5tbW1tMDEwMCBkaXYxIDxSRUdfTT4sPFJFR19OPioveyJkaXYxIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDAxMTBubm5ubW1tbTExMTAgZXh0cy5iIDxSRUdfTT4sPFJFR19OPioveyJleHRzLmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0V9fSwKLQotLyogMDExMG5ubm5tbW1tMTExMSBleHRzLncgPFJFR19NPiw8UkVHX04+Ki97ImV4dHMudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfRn19LAotCi0vKiAwMTEwbm5ubm1tbW0xMTAwIGV4dHUuYiA8UkVHX00+LDxSRUdfTj4qL3siZXh0dS5iIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAxMTBubm5ubW1tbTExMDEgZXh0dS53IDxSRUdfTT4sPFJFR19OPioveyJleHR1LnciLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYX0R9fSwKLQotLyogMDEwMG5ubm4wMDEwMTAxMSBqbXAgQDxSRUdfTj4gICAgICAgICoveyJqbXAiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYX0J9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAxMSBqc3IgQDxSRUdfTj4gICAgICAgICoveyJqc3IiLHtBX0lORF9OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYX0J9fSwKLQotLyogMDEwMG5ubm4wMDAwMTExMCBsZGMgPFJFR19OPixTUiAgICAgICoveyJsZGMiLHtBX1JFR19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMDExMTEwIGxkYyA8UkVHX04+LEdCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9HQlJ9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMTAxMTEwIGxkYyA8UkVHX04+LFZCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9WQlJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAwMTExMTEwIGxkYyA8UkVHX04+LFNTUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TU1J9LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAxMDAxMTEwIGxkYyA8UkVHX04+LFNQQyAgICAgKi97ImxkYyIse0FfUkVHX04sQV9TUEN9LHtIRVhfNCxSRUdfTixIRVhfNCxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjAxMTExMTEwIGxkYyA8UkVHX04+LERCUiAgICAgKi97ImxkYyIse0FfUkVHX04sQV9EQlJ9LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfRX19LAotCi0vKiAwMTAwbm5ubjF4eHgxMTEwIGxkYyA8UkVHX04+LFJuX0JBTksgKi97ImxkYyIse0FfUkVHX04sQV9SRUdfQn0se0hFWF80LFJFR19OLFJFR19CLEhFWF9FfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFNSICAqL3sibGRjLmwiLHtBX0lOQ19OLEFfU1J9LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAwMDEwMTExIGxkYy5sIEA8UkVHX04+KyxHQlIgKi97ImxkYy5sIix7QV9JTkNfTixBX0dCUn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMTEgbGRjLmwgQDxSRUdfTj4rLFZCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfVkJSfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMDExMDExMSBsZGMubCBAPFJFR19OPissU1NSICoveyJsZGMubCIse0FfSU5DX04sQV9TU1J9LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAxMDAwMTExIGxkYy5sIEA8UkVHX04+KyxTUEMgKi97ImxkYy5sIix7QV9JTkNfTixBX1NQQ30se0hFWF80LFJFR19OLEhFWF80LEhFWF83fX0sCi0KLS8qIDAxMDBubm5uMDExMTAxMTEgbGRjLmwgQDxSRUdfTj4rLERCUiAqL3sibGRjLmwiLHtBX0lOQ19OLEFfREJSfSx7SEVYXzQsUkVHX04sSEVYXzcsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4xeHh4MDExMSBsZGMubCA8UkVHX04+LFJuX0JBTksgKi97ImxkYy5sIix7QV9JTkNfTixBX1JFR19CfSx7SEVYXzQsUkVHX04sUkVHX0IsSEVYXzd9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAxMCBsZHMgPFJFR19OPixNQUNIICAgICoveyJsZHMiLHtBX1JFR19OLEFfTUFDSH0se0hFWF80LFJFR19OLEhFWF8wLEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDAwMTEwMTAgbGRzIDxSRUdfTj4sTUFDTCAgICAqL3sibGRzIix7QV9SRUdfTixBX01BQ0x9LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAwMTAxMDEwIGxkcyA8UkVHX04+LFBSICAgICAgKi97ImxkcyIse0FfUkVHX04sQV9QUn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDEwMTEwMTAgbGRzIDxSRUdfTj4sRlBVTCAgICAqL3sibGRzIix7QV9SRUdfTSxGUFVMX059LHtIRVhfNCxSRUdfTSxIRVhfNSxIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAxMTAxMDEwIGxkcyA8UkVHX00+LEZQU0NSICAgKi97ImxkcyIse0FfUkVHX00sRlBTQ1JfTn0se0hFWF80LFJFR19NLEhFWF82LEhFWF9BfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMTAgbGRzLmwgQDxSRUdfTj4rLE1BQ0gqL3sibGRzLmwiLHtBX0lOQ19OLEFfTUFDSH0se0hFWF80LFJFR19OLEhFWF8wLEhFWF82fX0sCi0KLS8qIDAxMDBubm5uMDAwMTAxMTAgbGRzLmwgQDxSRUdfTj4rLE1BQ0wqL3sibGRzLmwiLHtBX0lOQ19OLEFfTUFDTH0se0hFWF80LFJFR19OLEhFWF8xLEhFWF82fX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMTAgbGRzLmwgQDxSRUdfTj4rLFBSICAqL3sibGRzLmwiLHtBX0lOQ19OLEFfUFJ9LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfNn19LAotCi0vKiAwMTAwbm5ubjAxMDEwMTEwIGxkcy5sIEA8UkVHX00+KyxGUFVMKi97Imxkcy5sIix7QV9JTkNfTSxGUFVMX059LHtIRVhfNCxSRUdfTSxIRVhfNSxIRVhfNn19LAotCi0vKiAwMTAwbm5ubjAxMTAwMTEwIGxkcy5sIEA8UkVHX00+KyxGUFNDUioveyJsZHMubCIse0FfSU5DX00sRlBTQ1JfTn0se0hFWF80LFJFR19NLEhFWF82LEhFWF82fX0sCi0KLS8qIDAwMDAwMDAwMDAxMTEwMDAgbGR0bGIgICAgICAgICAgICAgICAqL3sibGR0bGIiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzMsSEVYXzh9fSwKLQotLyogMDEwMG5ubm5tbW1tMTExMSBtYWMudyBAPFJFR19NPissQDxSRUdfTj4rKi97Im1hYy53Iix7QV9JTkNfTSxBX0lOQ19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMTExMG5ubm5pOCoxLi4uLiBtb3YgIzxpbW0+LDxSRUdfTj4gICoveyJtb3YiLHtBX0lNTSxBX1JFR19OfSx7SEVYX0UsUkVHX04sSU1NXzh9fSwKLQotLyogMDExMG5ubm5tbW1tMDAxMSBtb3YgPFJFR19NPiw8UkVHX04+ICoveyJtb3YiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzN9fSwKLQotLyogMDAwMG5ubm5tbW1tMDEwMCBtb3YuYiA8UkVHX00+LEAoUjAsPFJFR19OPikqL3sibW92LmIiLHsgQV9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDAwMTBubm5ubW1tbTAxMDAgbW92LmIgPFJFR19NPixALTxSRUdfTj4qL3sibW92LmIiLHsgQV9SRUdfTSxBX0RFQ19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzR9fSwKLQotLyogMDAxMG5ubm5tbW1tMDAwMCBtb3YuYiA8UkVHX00+LEA8UkVHX04+Ki97Im1vdi5iIix7IEFfUkVHX00sQV9JTkRfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF8wfX0sCi0KLS8qIDEwMDAwMTAwbW1tbWk0KjEgbW92LmIgQCg8ZGlzcD4sPFJFR19NPiksUjAqL3sibW92LmIiLHtBX0RJU1BfUkVHX00sQV9SMH0se0hFWF84LEhFWF80LFJFR19NLElNTV80fX0sCi0KLS8qIDExMDAwMTAwaTgqMS4uLi4gbW92LmIgQCg8ZGlzcD4sR0JSKSxSMCoveyJtb3YuYiIse0FfRElTUF9HQlIsQV9SMH0se0hFWF9DLEhFWF80LElNTV84fX0sCi0KLS8qIDAwMDBubm5ubW1tbTExMDAgbW92LmIgQChSMCw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5iIix7QV9JTkRfUjBfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9DfX0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMDAgbW92LmIgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LmIiLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNH19LAotCi0vKiAwMTEwbm5ubm1tbW0wMDAwIG1vdi5iIEA8UkVHX00+LDxSRUdfTj4qL3sibW92LmIiLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMH19LAotCi0vKiAxMDAwMDAwMG1tbW1pNCoxIG1vdi5iIFIwLEAoPGRpc3A+LDxSRUdfTT4pKi97Im1vdi5iIix7QV9SMCxBX0RJU1BfUkVHX019LHtIRVhfOCxIRVhfMCxSRUdfTSxJTU1fNH19LAotCi0vKiAxMTAwMDAwMGk4KjEuLi4uIG1vdi5iIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmIiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMCxJTU1fOH19LAotCi0vKiAwMDAxbm5ubm1tbW1pNCo0IG1vdi5sIDxSRUdfTT4sQCg8ZGlzcD4sPFJFR19OPikqL3sibW92LmwiLHsgQV9SRUdfTSxBX0RJU1BfUkVHX059LHtIRVhfMSxSRUdfTixSRUdfTSxJTU1fNEJZNH19LAotCi0vKiAwMDAwbm5ubm1tbW0wMTEwIG1vdi5sIDxSRUdfTT4sQChSMCw8UkVHX04+KSoveyJtb3YubCIseyBBX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMDAxMG5ubm5tbW1tMDExMCBtb3YubCA8UkVHX00+LEAtPFJFR19OPioveyJtb3YubCIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAwMDEwbm5ubm1tbW0wMDEwIG1vdi5sIDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LmwiLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzJ9fSwKLQotLyogMDEwMW5ubm5tbW1taTQqNCBtb3YubCBAKDxkaXNwPiw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5sIix7QV9ESVNQX1JFR19NLEFfUkVHX059LHtIRVhfNSxSRUdfTixSRUdfTSxJTU1fNEJZNH19LAotCi0vKiAxMTAwMDExMGk4KjQuLi4uIG1vdi5sIEAoPGRpc3A+LEdCUiksUjAqL3sibW92LmwiLHtBX0RJU1BfR0JSLEFfUjB9LHtIRVhfQyxIRVhfNixJTU1fOEJZNH19LAotCi0vKiAxMTAxbm5ubmk4cDQuLi4uIG1vdi5sIEAoPGRpc3A+LFBDKSw8UkVHX04+Ki97Im1vdi5sIix7QV9ESVNQX1BDLEFfUkVHX059LHtIRVhfRCxSRUdfTixQQ1JFTElNTV84Qlk0fX0sCi0KLS8qIDAwMDBubm5ubW1tbTExMTAgbW92LmwgQChSMCw8UkVHX00+KSw8UkVHX04+Ki97Im1vdi5sIix7QV9JTkRfUjBfUkVHX00sQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAxMTBubm5ubW1tbTAxMTAgbW92LmwgQDxSRUdfTT4rLDxSRUdfTj4qL3sibW92LmwiLHtBX0lOQ19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfNn19LAotCi0vKiAwMTEwbm5ubm1tbW0wMDEwIG1vdi5sIEA8UkVHX00+LDxSRUdfTj4qL3sibW92LmwiLHtBX0lORF9NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfMn19LAotCi0vKiAxMTAwMDAxMGk4KjQuLi4uIG1vdi5sIFIwLEAoPGRpc3A+LEdCUikqL3sibW92LmwiLHtBX1IwLEFfRElTUF9HQlJ9LHtIRVhfQyxIRVhfMixJTU1fOEJZNH19LAotCi0vKiAwMDAwbm5ubm1tbW0wMTAxIG1vdi53IDxSRUdfTT4sQChSMCw8UkVHX04+KSoveyJtb3YudyIseyBBX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzV9fSwKLQotLyogMDAxMG5ubm5tbW1tMDEwMSBtb3YudyA8UkVHX00+LEAtPFJFR19OPioveyJtb3YudyIseyBBX1JFR19NLEFfREVDX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfNX19LAotCi0vKiAwMDEwbm5ubm1tbW0wMDAxIG1vdi53IDxSRUdfTT4sQDxSRUdfTj4qL3sibW92LnciLHsgQV9SRUdfTSxBX0lORF9OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYXzF9fSwKLQotLyogMTAwMDAxMDFtbW1taTQqMiBtb3YudyBAKDxkaXNwPiw8UkVHX00+KSxSMCoveyJtb3YudyIse0FfRElTUF9SRUdfTSxBX1IwfSx7SEVYXzgsSEVYXzUsUkVHX00sSU1NXzRCWTJ9fSwKLQotLyogMTEwMDAxMDFpOCoyLi4uLiBtb3YudyBAKDxkaXNwPixHQlIpLFIwKi97Im1vdi53Iix7QV9ESVNQX0dCUixBX1IwfSx7SEVYX0MsSEVYXzUsSU1NXzhCWTJ9fSwKLQotLyogMTAwMW5ubm5pOHAyLi4uLiBtb3YudyBAKDxkaXNwPixQQyksPFJFR19OPioveyJtb3YudyIse0FfRElTUF9QQyxBX1JFR19OfSx7SEVYXzksUkVHX04sUENSRUxJTU1fOEJZMn19LAotCi0vKiAwMDAwbm5ubm1tbW0xMTAxIG1vdi53IEAoUjAsPFJFR19NPiksPFJFR19OPioveyJtb3YudyIse0FfSU5EX1IwX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfRH19LAotCi0vKiAwMTEwbm5ubm1tbW0wMTAxIG1vdi53IEA8UkVHX00+Kyw8UkVHX04+Ki97Im1vdi53Iix7QV9JTkNfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzV9fSwKLQotLyogMDExMG5ubm5tbW1tMDAwMSBtb3YudyBAPFJFR19NPiw8UkVHX04+Ki97Im1vdi53Iix7QV9JTkRfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzF9fSwKLQotLyogMTAwMDAwMDFtbW1taTQqMiBtb3YudyBSMCxAKDxkaXNwPiw8UkVHX00+KSoveyJtb3YudyIse0FfUjAsQV9ESVNQX1JFR19NfSx7SEVYXzgsSEVYXzEsUkVHX00sSU1NXzRCWTJ9fSwKLQotLyogMTEwMDAwMDFpOCoyLi4uLiBtb3YudyBSMCxAKDxkaXNwPixHQlIpKi97Im1vdi53Iix7QV9SMCxBX0RJU1BfR0JSfSx7SEVYX0MsSEVYXzEsSU1NXzhCWTJ9fSwKLQotLyogMTEwMDAxMTFpOHA0Li4uLiBtb3ZhIEAoPGRpc3A+LFBDKSxSMCoveyJtb3ZhIix7QV9ESVNQX1BDLEFfUjB9LHtIRVhfQyxIRVhfNyxQQ1JFTElNTV84Qlk0fX0sCi0vKiAwMDAwbm5ubjExMDAwMDExIG1vdmNhLmwgUjAsQDxSRUdfTj4gKi97Im1vdmNhLmwiLHtBX1IwLEFfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQyxIRVhfM319LAotCi0KLS8qIDAwMDBubm5uMDAxMDEwMDEgbW92dCA8UkVHX04+ICAgICAgICAqL3sibW92dCIse0FfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfOX19LAotCi0vKiAwMDEwbm5ubm1tbW0xMTExIG11bHMgPFJFR19NPiw8UkVHX04+Ki97Im11bHMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMDAwMG5ubm5tbW1tMDExMSBtdWwubCA8UkVHX00+LDxSRUdfTj4qL3sibXVsLmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMDAxMG5ubm5tbW1tMTExMCBtdWx1IDxSRUdfTT4sPFJFR19OPioveyJtdWx1Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9FfX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMTEgbmVnIDxSRUdfTT4sPFJFR19OPiAqL3sibmVnIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF82LFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMTAgbmVnYyA8UkVHX00+LDxSRUdfTj4qL3sibmVnYyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAwMDAwMDAwMDAwMDAxMDAxIG5vcCAgICAgICAgICAgICAgICAgKi97Im5vcCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfOX19LAotCi0vKiAwMTEwbm5ubm1tbW0wMTExIG5vdCA8UkVHX00+LDxSRUdfTj4gKi97Im5vdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfN319LAotLyogMDAwMG5ubm4xMDAxMDAxMSBvY2JpIEA8UkVHX04+ICAgICAgICoveyJvY2JpIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF85LEhFWF8zfX0sCi0KLS8qIDAwMDBubm5uMTAxMDAwMTEgb2NicCBAPFJFR19OPiAgICAgICAqL3sib2NicCIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfQSxIRVhfM319LAotCi0vKiAwMDAwbm5ubjEwMTEwMDExIG9jYndiIEA8UkVHX04+ICAgICAgKi97Im9jYndiIix7QV9JTkRfTn0se0hFWF8wLFJFR19OLEhFWF9CLEhFWF8zfX0sCi0KLQotLyogMTEwMDEwMTFpOCoxLi4uLiBvciAjPGltbT4sUjAgICAgICAgICoveyJvciIse0FfSU1NLEFfUjB9LHtIRVhfQyxIRVhfQixJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMDExIG9yIDxSRUdfTT4sPFJFR19OPiAgKi97Im9yIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDExMDAxMTExaTgqMS4uLi4gb3IuYiAjPGltbT4sQChSMCxHQlIpKi97Im9yLmIiLHtBX0lNTSxBX1IwX0dCUn0se0hFWF9DLEhFWF9GLElNTV84fX0sCi0KLS8qIDAwMDBubm5uMTAwMDAwMTEgcHJlZiBAPFJFR19OPiAgICAgICAqL3sicHJlZiIse0FfSU5EX059LHtIRVhfMCxSRUdfTixIRVhfOCxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMTAwMTAwIHJvdGNsIDxSRUdfTj4gICAgICAgKi97InJvdGNsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF80fX0sCi0KLS8qIDAxMDBubm5uMDAxMDAxMDEgcm90Y3IgPFJFR19OPiAgICAgICAqL3sicm90Y3IiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzV9fSwKLQotLyogMDEwMG5ubm4wMDAwMDEwMCByb3RsIDxSRUdfTj4gICAgICAgICoveyJyb3RsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF80fX0sCi0KLS8qIDAxMDBubm5uMDAwMDAxMDEgcm90ciA8UkVHX04+ICAgICAgICAqL3sicm90ciIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfNX19LAotCi0vKiAwMDAwMDAwMDAwMTAxMDExIHJ0ZSAgICAgICAgICAgICAgICAgKi97InJ0ZSIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMixIRVhfQn19LAotCi0vKiAwMDAwMDAwMDAwMDAxMDExIHJ0cyAgICAgICAgICAgICAgICAgKi97InJ0cyIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMCxIRVhfQn19LAotCi0vKiAwMDAwMDAwMDAxMDExMDAwIHNldHMgICAgICAgICAgICAgICAgKi97InNldHMiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzUsSEVYXzh9fSwKLS8qIDAwMDAwMDAwMDAwMTEwMDAgc2V0dCAgICAgICAgICAgICAgICAqL3sic2V0dCIsezB9LHtIRVhfMCxIRVhfMCxIRVhfMSxIRVhfOH19LAotCi0vKiAwMTAwbm5ubm1tbW0xMTAwIHNoYWQgPFJFR19NPiw8UkVHX04+Ki97InNoYWQiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzQsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMDEwMG5ubm5tbW1tMTEwMSBzaGxkIDxSRUdfTT4sPFJFR19OPioveyJzaGxkIix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF80LFJFR19OLFJFR19NLEhFWF9EfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAwMDAgc2hhbCA8UkVHX04+ICAgICAgICAqL3sic2hhbCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMixIRVhfMH19LAotCi0vKiAwMTAwbm5ubjAwMTAwMDAxIHNoYXIgPFJFR19OPiAgICAgICAgKi97InNoYXIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzF9fSwKLQotLyogMDEwMG5ubm4wMDAwMDAwMCBzaGxsIDxSRUdfTj4gICAgICAgICoveyJzaGxsIix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8wLEhFWF8wfX0sCi0KLS8qIDAxMDBubm5uMDAxMDEwMDAgc2hsbDE2IDxSRUdfTj4gICAgICAqL3sic2hsbDE2Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8yLEhFWF84fX0sCi0KLS8qIDAxMDBubm5uMDAwMDEwMDAgc2hsbDIgPFJFR19OPiAgICAgICAqL3sic2hsbDIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzh9fSwKLQotLyogMDEwMG5ubm4wMDAxMTAwMCBzaGxsOCA8UkVHX04+ICAgICAgICoveyJzaGxsOCIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfOH19LAotCi0vKiAwMTAwbm5ubjAwMDAwMDAxIHNobHIgPFJFR19OPiAgICAgICAgKi97InNobHIiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzAsSEVYXzF9fSwKLQotLyogMDEwMG5ubm4wMDEwMTAwMSBzaGxyMTYgPFJFR19OPiAgICAgICoveyJzaGxyMTYiLHtBX1JFR19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzl9fSwKLQotLyogMDEwMG5ubm4wMDAwMTAwMSBzaGxyMiA8UkVHX04+ICAgICAgICoveyJzaGxyMiIse0FfUkVHX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfOX19LAotCi0vKiAwMTAwbm5ubjAwMDExMDAxIHNobHI4IDxSRUdfTj4gICAgICAgKi97InNobHI4Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF85fX0sCi0KLS8qIDAwMDAwMDAwMDAwMTEwMTEgc2xlZXAgICAgICAgICAgICAgICAqL3sic2xlZXAiLHswfSx7SEVYXzAsSEVYXzAsSEVYXzEsSEVYX0J9fSwKLQotLyogMDAwMG5ubm4wMDAwMDAxMCBzdGMgU1IsPFJFR19OPiAgICAgICoveyJzdGMiLHtBX1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMCxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMDEwMDEwIHN0YyBHQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfR0JSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMSxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMTAwMDEwIHN0YyBWQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfVkJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAwMTEwMDEwIHN0YyBTU1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1NSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMyxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAxMDAwMDEwIHN0YyBTUEMsPFJFR19OPiAgICAgKi97InN0YyIse0FfU1BDLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNCxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAxMTAwMDEwIHN0YyBTR1IsPFJFR19OPiAgICAgKi97InN0YyIse0FfU0dSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNixIRVhfMn19LAotCi0vKiAwMDAwbm5ubjAxMTEwMDEwIHN0YyBEQlIsPFJFR19OPiAgICAgKi97InN0YyIse0FfREJSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNyxIRVhfMn19LAotCi0vKiAwMDAwbm5ubjF4eHgwMDEyIHN0YyBSbl9CQU5LLDxSRUdfTj4gKi97InN0YyIse0FfUkVHX0IsQV9SRUdfTn0se0hFWF8wLFJFR19OLFJFR19CLEhFWF8yfX0sCi0KLS8qIDAxMDBubm5uMDAwMDAwMTEgc3RjLmwgU1IsQC08UkVHX04+ICAqL3sic3RjLmwiLHtBX1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAwMDEwMDExIHN0Yy5sIEdCUixALTxSRUdfTj4gKi97InN0Yy5sIix7QV9HQlIsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDAxMDAwMTEgc3RjLmwgVkJSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1ZCUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMDExMDAxMSBzdGMubCBTU1IsQC08UkVHX04+ICoveyJzdGMubCIse0FfU1NSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMyxIRVhfM319LAotCi0vKiAwMTAwbm5ubjAxMDAwMDExIHN0Yy5sIFNQQyxALTxSRUdfTj4gKi97InN0Yy5sIix7QV9TUEMsQV9ERUNfTn0se0hFWF80LFJFR19OLEhFWF80LEhFWF8zfX0sCi0KLS8qIDAxMDBubm5uMDExMDAwMTEgc3RjLmwgU0dSLEAtPFJFR19OPiAqL3sic3RjLmwiLHtBX1NHUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzYsSEVYXzN9fSwKLQotLyogMDEwMG5ubm4wMTExMDAxMSBzdGMubCBEQlIsQC08UkVHX04+ICoveyJzdGMubCIse0FfREJSLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNyxIRVhfM319LAotCi0vKiAwMTAwbm5ubjF4eHgwMDEyIHN0Yy5sIFJuX0JBTkssQC08UkVHX04+ICoveyJzdGMubCIse0FfUkVHX0IsQV9ERUNfTn0se0hFWF80LFJFR19OLFJFR19CLEhFWF8zfX0sCi0KLS8qIDAwMDBubm5uMDAwMDEwMTAgc3RzIE1BQ0gsPFJFR19OPiAgICAqL3sic3RzIix7QV9NQUNILEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMCxIRVhfQX19LAotCi0vKiAwMDAwbm5ubjAwMDExMDEwIHN0cyBNQUNMLDxSRUdfTj4gICAgKi97InN0cyIse0FfTUFDTCxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzEsSEVYX0F9fSwKLQotLyogMDAwMG5ubm4wMDEwMTAxMCBzdHMgUFIsPFJFR19OPiAgICAgICoveyJzdHMiLHtBX1BSLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfMixIRVhfQX19LAotCi0vKiAwMDAwbm5ubjAxMDExMDEwIHN0cyBGUFVMLDxSRUdfTj4gICAgKi97InN0cyIse0ZQVUxfTSxBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzUsSEVYX0F9fSwKLQotLyogMDAwMG5ubm4wMTEwMTAxMCBzdHMgRlBTQ1IsPFJFR19OPiAgICoveyJzdHMiLHtGUFNDUl9NLEFfUkVHX059LHtIRVhfMCxSRUdfTixIRVhfNixIRVhfQX19LAotCi0vKiAwMTAwbm5ubjAwMDAwMDEwIHN0cy5sIE1BQ0gsQC08UkVHX04+Ki97InN0cy5sIix7QV9NQUNILEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMCxIRVhfMn19LAotCi0vKiAwMTAwbm5ubjAwMDEwMDEwIHN0cy5sIE1BQ0wsQC08UkVHX04+Ki97InN0cy5sIix7QV9NQUNMLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfMSxIRVhfMn19LAotCi0vKiAwMTAwbm5ubjAwMTAwMDEwIHN0cy5sIFBSLEAtPFJFR19OPiAgKi97InN0cy5sIix7QV9QUixBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzIsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMTAxMDAxMCBzdHMubCBGUFVMLEAtPFJFR19OPioveyJzdHMubCIse0ZQVUxfTSxBX0RFQ19OfSx7SEVYXzQsUkVHX04sSEVYXzUsSEVYXzJ9fSwKLQotLyogMDEwMG5ubm4wMTEwMDAxMCBzdHMubCBGUFNDUixALTxSRUdfTj4qL3sic3RzLmwiLHtGUFNDUl9NLEFfREVDX059LHtIRVhfNCxSRUdfTixIRVhfNixIRVhfMn19LAotCi0vKiAwMDExbm5ubm1tbW0xMDAwIHN1YiA8UkVHX00+LDxSRUdfTj4gKi97InN1YiIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfOH19LAotCi0vKiAwMDExbm5ubm1tbW0xMDEwIHN1YmMgPFJFR19NPiw8UkVHX04+Ki97InN1YmMiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMDAxMW5ubm5tbW1tMTAxMSBzdWJ2IDxSRUdfTT4sPFJFR19OPioveyJzdWJ2Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8zLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDAxMTBubm5ubW1tbTEwMDAgc3dhcC5iIDxSRUdfTT4sPFJFR19OPioveyJzd2FwLmIiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzYsUkVHX04sUkVHX00sSEVYXzh9fSwKLQotLyogMDExMG5ubm5tbW1tMTAwMSBzd2FwLncgPFJFR19NPiw8UkVHX04+Ki97InN3YXAudyIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfNixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAwMTAwbm5ubjAwMDExMDExIHRhcy5iIEA8UkVHX04+ICAgICAgKi97InRhcy5iIix7QV9JTkRfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF9CfX0sCi0KLS8qIDExMDAwMDExaTgqMS4uLi4gdHJhcGEgIzxpbW0+ICAgICAgICAqL3sidHJhcGEiLHtBX0lNTX0se0hFWF9DLEhFWF8zLElNTV84fX0sCi0KLS8qIDExMDAxMDAwaTgqMS4uLi4gdHN0ICM8aW1tPixSMCAgICAgICAqL3sidHN0Iix7QV9JTU0sQV9SMH0se0hFWF9DLEhFWF84LElNTV84fX0sCi0KLS8qIDAwMTBubm5ubW1tbTEwMDAgdHN0IDxSRUdfTT4sPFJFR19OPiAqL3sidHN0Iix7IEFfUkVHX00sQV9SRUdfTn0se0hFWF8yLFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDExMDAxMTAwaTgqMS4uLi4gdHN0LmIgIzxpbW0+LEAoUjAsR0JSKSoveyJ0c3QuYiIse0FfSU1NLEFfUjBfR0JSfSx7SEVYX0MsSEVYX0MsSU1NXzh9fSwKLQotLyogMTEwMDEwMTBpOCoxLi4uLiB4b3IgIzxpbW0+LFIwICAgICAgICoveyJ4b3IiLHtBX0lNTSxBX1IwfSx7SEVYX0MsSEVYX0EsSU1NXzh9fSwKLQotLyogMDAxMG5ubm5tbW1tMTAxMCB4b3IgPFJFR19NPiw8UkVHX04+ICoveyJ4b3IiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzIsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMTEwMDExMTBpOCoxLi4uLiB4b3IuYiAjPGltbT4sQChSMCxHQlIpKi97Inhvci5iIix7QV9JTU0sQV9SMF9HQlJ9LHtIRVhfQyxIRVhfRSxJTU1fOH19LAotCi0vKiAwMDEwbm5ubm1tbW0xMTAxIHh0cmN0IDxSRUdfTT4sPFJFR19OPioveyJ4dHJjdCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMixSRUdfTixSRUdfTSxIRVhfRH19LAotCi0vKiAwMDAwbm5ubm1tbW0wMTExIG11bC5sIDxSRUdfTT4sPFJFR19OPioveyJtdWwubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMCxSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAwMTAwbm5ubjAwMDEwMDAwIGR0IDxSRUdfTj4gICAgICAgICAgKi97ImR0Iix7QV9SRUdfTn0se0hFWF80LFJFR19OLEhFWF8xLEhFWF8wfX0sCi0KLS8qIDAwMTFubm5ubW1tbTExMDEgZG11bHMubCA8UkVHX00+LDxSRUdfTj4qL3siZG11bHMubCIseyBBX1JFR19NLEFfUkVHX059LHtIRVhfMyxSRUdfTixSRUdfTSxIRVhfRH19LAotCi0vKiAwMDExbm5ubm1tbW0wMTAxIGRtdWx1LmwgPFJFR19NPiw8UkVHX04+Ki97ImRtdWx1LmwiLHsgQV9SRUdfTSxBX1JFR19OfSx7SEVYXzMsUkVHX04sUkVHX00sSEVYXzV9fSwKLQotLyogMDAwMG5ubm5tbW1tMTExMSBtYWMubCBAPFJFR19NPissQDxSRUdfTj4rKi97Im1hYy5sIix7QV9JTkNfTSxBX0lOQ19OfSx7SEVYXzAsUkVHX04sUkVHX00sSEVYX0Z9fSwKLQotLyogMDAwMG5ubm4wMDEwMDAxMSBicmFmIDxSRUdfTj4gICAgICAgKi97ImJyYWYiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzIsSEVYXzN9fSwKLQotLyogMDAwMG5ubm4wMDAwMDAxMSBic3JmIDxSRUdfTj4gICAgICAgKi97ImJzcmYiLHtBX1JFR19OfSx7SEVYXzAsUkVHX04sSEVYXzAsSEVYXzN9fSwKLQotLyogMTExMW5ubm4wMTAxMTEwMSBmYWJzIDxGX1JFR19OPiAgICAgKi97ImZhYnMiLHtGRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF81LEhFWF9EfX0sCi0KLS8qIDExMTFubm5ubW1tbTAwMDAgZmFkZCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZhZGQiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMH19LAotLyogMTExMW5ubjBtbW0wMDAwMCBmYWRkIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmFkZCIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8wfX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMDAgZmNtcC9lcSA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZjbXAvZXEiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNH19LAotLyogMTExMW5ubjBtbW0wMDEwMCBmY21wL2VxIDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmNtcC9lcSIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF80fX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMDEgZmNtcC9ndCA8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZjbXAvZ3QiLHtGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfNX19LAotLyogMTExMW5ubjBtbW0wMDEwMSBmY21wL2d0IDxEX1JFR19NPiw8RF9SRUdfTj4qL3siZmNtcC9ndCIse0RfUkVHX00sRF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF81fX0sCi0KLS8qIDExMTFubm4wMTAxMTExMDEgZmNudmRzIDxEX1JFR19OPixGUFVMKi97ImZjbnZkcyIse0RfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYX0IsSEVYX0R9fSwKLQotLyogMTExMW5ubjAxMDEwMTEwMSBmY252c2QgRlBVTCw8RF9SRUdfTj4qL3siZmNudnNkIix7RlBVTF9NLERfUkVHX059LHtIRVhfRixSRUdfTixIRVhfQSxIRVhfRH19LAotCi0vKiAxMTExbm5ubm1tbW0wMDExIGZkaXYgPEZfUkVHX00+LDxGX1JFR19OPioveyJmZGl2Iix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzN9fSwKLS8qIDExMTFubm4wbW1tMDAwMTEgZmRpdiA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZkaXYiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfM319LAotCi0vKiAxMTExbm5tbTExMTAxMTAxIGZpcHIgPFZfUkVHX00+LDxWX1JFR19OPioveyJmaXByIix7Vl9SRUdfTSxWX1JFR19OfSx7SEVYX0YsUkVHX05NLEhFWF9FLEhFWF9EfX0sCi0KLS8qIDExMTFubm5uMTAwMDExMDEgZmxkaTAgPEZfUkVHX04+ICAgICoveyJmbGRpMCIse0ZfUkVHX059LHtIRVhfRixSRUdfTixIRVhfOCxIRVhfRH19LAotCi0vKiAxMTExbm5ubjEwMDExMTAxIGZsZGkxIDxGX1JFR19OPiAgICAqL3siZmxkaTEiLHtGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzksSEVYX0R9fSwKLQotLyogMTExMW5ubm4wMDAxMTEwMSBmbGRzIDxGX1JFR19OPixGUFVMKi97ImZsZHMiLHtGX1JFR19OLEZQVUxfTX0se0hFWF9GLFJFR19OLEhFWF8xLEhFWF9EfX0sCi0KLS8qIDExMTFubm5uMDAxMDExMDEgZmxvYXQgRlBVTCw8RkRfUkVHX04+Ki97ImZsb2F0Iix7RlBVTF9NLEZEX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzIsSEVYX0R9fSwKLQotLyogMTExMW5ubm5tbW1tMTExMCBmbWFjIEZSMCw8Rl9SRUdfTT4sPEZfUkVHX04+Ki97ImZtYWMiLHtGX0ZSMCxGX1JFR19NLEZfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfRX19LAotCi0vKiAxMTExbm5ubm1tbW0xMTAwIGZtb3YgPEZfUkVHX00+LDxGX1JFR19OPioveyJmbW92Iix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0N9fSwKLS8qIDExMTFubm5ubW1tbTExMDAgZm1vdiA8RFhfUkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdiIse0RYX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0N9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92IEA8UkVHX00+LDxGX1JFR19OPioveyJmbW92Iix7QV9JTkRfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9fSwKLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdiBAPFJFR19NPiw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzh9fSwKLQotLyogMTExMW5ubm5tbW1tMTAxMCBmbW92IDxGX1JFR19NPixAPFJFR19OPioveyJmbW92Iix7Rl9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9fSwKLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdiA8RFhfUkVHX00+LEA8UkVHX04+Ki97ImZtb3YiLHtEWF9SRUdfTSxBX0lORF9OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0F9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMSBmbW92IEA8UkVHX00+Kyw8Rl9SRUdfTj4qL3siZm1vdiIse0FfSU5DX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fX0sCi0vKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YgQDxSRUdfTT4rLDxEWF9SRUdfTj4qL3siZm1vdiIse0FfSU5DX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YgPEZfUkVHX00+LEAtPFJFR19OPioveyJmbW92Iix7Rl9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKLS8qIDExMTFubm5ubW1tbTEwMTEgZm1vdiA8RFhfUkVHX00+LEAtPFJFR19OPioveyJmbW92Iix7RFhfUkVHX00sQV9ERUNfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9CfX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTAgZm1vdiBAKFIwLDxSRUdfTT4pLDxGX1JFR19OPioveyJmbW92Iix7QV9JTkRfUjBfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCi0vKiAxMTExbm5ubm1tbW0wMTEwIGZtb3YgQChSMCw8UkVHX00+KSw8RFhfUkVHX04+Ki97ImZtb3YiLHtBX0lORF9SMF9SRUdfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTEgZm1vdiA8Rl9SRUdfTT4sQChSMCw8UkVHX04+KSoveyJmbW92Iix7Rl9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fX0sCi0vKiAxMTExbm5ubm1tbW0wMTExIGZtb3YgPERYX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YiLHtEWF9SRUdfTSxBX0lORF9SMF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF83fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDAgZm1vdi5kIEA8UkVHX00+LDxEWF9SRUdfTj4qL3siZm1vdi5kIix7QV9JTkRfTSxEWF9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdi5kIDxEWF9SRUdfTT4sQDxSRUdfTj4qL3siZm1vdi5kIix7RFhfUkVHX00sQV9JTkRfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF9BfX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMDEgZm1vdi5kIEA8UkVHX00+Kyw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5DX00sRFhfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfOX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDExIGZtb3YuZCA8RFhfUkVHX00+LEAtPFJFR19OPioveyJmbW92LmQiLHtEWF9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMCBmbW92LmQgQChSMCw8UkVHX00+KSw8RFhfUkVHX04+Ki97ImZtb3YuZCIse0FfSU5EX1IwX1JFR19NLERYX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzZ9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMSBmbW92LmQgPERYX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YuZCIse0RYX1JFR19NLEFfSU5EX1IwX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzd9fSwKLQotLyogMTExMW5ubm5tbW1tMTAwMCBmbW92LnMgQDxSRUdfTT4sPEZfUkVHX04+Ki97ImZtb3YucyIse0FfSU5EX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF84fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTAgZm1vdi5zIDxGX1JFR19NPixAPFJFR19OPioveyJmbW92LnMiLHtGX1JFR19NLEFfSU5EX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfQX19LAotCi0vKiAxMTExbm5ubm1tbW0xMDAxIGZtb3YucyBAPFJFR19NPissPEZfUkVHX04+Ki97ImZtb3YucyIse0FfSU5DX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF85fX0sCi0KLS8qIDExMTFubm5ubW1tbTEwMTEgZm1vdi5zIDxGX1JFR19NPixALTxSRUdfTj4qL3siZm1vdi5zIix7Rl9SRUdfTSxBX0RFQ19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYX0J9fSwKLQotLyogMTExMW5ubm5tbW1tMDExMCBmbW92LnMgQChSMCw8UkVHX00+KSw8Rl9SRUdfTj4qL3siZm1vdi5zIix7QV9JTkRfUjBfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF82fX0sCi0KLS8qIDExMTFubm5ubW1tbTAxMTEgZm1vdi5zIDxGX1JFR19NPixAKFIwLDxSRUdfTj4pKi97ImZtb3YucyIse0ZfUkVHX00sQV9JTkRfUjBfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfN319LAotCi0vKiAxMTExbm5ubm1tbW0wMDEwIGZtdWwgPEZfUkVHX00+LDxGX1JFR19OPioveyJmbXVsIix7Rl9SRUdfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzJ9fSwKLS8qIDExMTFubm4wbW1tMDAwMTAgZm11bCA8RF9SRUdfTT4sPERfUkVHX04+Ki97ImZtdWwiLHtEX1JFR19NLERfUkVHX059LHtIRVhfRixSRUdfTixSRUdfTSxIRVhfMn19LAotCi0vKiAxMTExbm5ubjAxMDAxMTAxIGZuZWcgPEZEX1JFR19OPiAgICAgKi97ImZuZWciLHtGRF9SRUdfTn0se0hFWF9GLFJFR19OLEhFWF80LEhFWF9EfX0sCi0KLS8qIDExMTExMDExMTExMTExMDEgZnJjaGcgICAgICAgICAgICAgICAqL3siZnJjaGciLHswfSx7SEVYX0YsSEVYX0IsSEVYX0YsSEVYX0R9fSwKLQotLyogMTExMTAwMTExMTExMTEwMSBmc2NoZyAgICAgICAgICAgICAgICoveyJmc2NoZyIsezB9LHtIRVhfRixIRVhfMyxIRVhfRixIRVhfRH19LAotCi0vKiAxMTExbm5ubjAxMTAxMTAxIGZzcXJ0IDxGRF9SRUdfTj4gICAgKi97ImZzcXJ0Iix7RkRfUkVHX059LHtIRVhfRixSRUdfTixIRVhfNixIRVhfRH19LAotCi0vKiAxMTExbm5ubjAwMDAxMTAxIGZzdHMgRlBVTCw8Rl9SRUdfTj4qL3siZnN0cyIse0ZQVUxfTSxGX1JFR19OfSx7SEVYX0YsUkVHX04sSEVYXzAsSEVYX0R9fSwKLQotLyogMTExMW5ubm5tbW1tMDAwMSBmc3ViIDxGX1JFR19NPiw8Rl9SRUdfTj4qL3siZnN1YiIse0ZfUkVHX00sRl9SRUdfTn0se0hFWF9GLFJFR19OLFJFR19NLEhFWF8xfX0sCi0vKiAxMTExbm5uMG1tbTAwMDAxIGZzdWIgPERfUkVHX00+LDxEX1JFR19OPioveyJmc3ViIix7RF9SRUdfTSxEX1JFR19OfSx7SEVYX0YsUkVHX04sUkVHX00sSEVYXzF9fSwKLQotLyogMTExMW5ubm4wMDExMTEwMSBmdHJjIDxGRF9SRUdfTj4sRlBVTCoveyJmdHJjIix7RkRfUkVHX04sRlBVTF9NfSx7SEVYX0YsUkVHX04sSEVYXzMsSEVYX0R9fSwKLQotLyogMTExMW5uMDExMTExMTEwMSBmdHJ2IFhNVFJYX000LDxWX1JFR19uPioveyJmdHJ2Iix7WE1UUlhfTTQsVl9SRUdfTn0se0hFWF9GLFJFR19OTSxIRVhfRixIRVhfRH19LAotCi17IDAgfSAKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy9zcGFyYy1kaXMuYyBiL29wY29kZXMvc3BhcmMtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NzViMjguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zcGFyYy1kaXMuYworKysgL2Rldi9udWxsCkBAIC0xLDk2OSArMCwwIEBACi0vKiBQcmludCBTUEFSQyBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLTk3LCAxOTk4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3NwYXJjLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgImxpYmliZXJ0eS5oIgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiBCaXRtYXNrIG9mIHY5IGFyY2hpdGVjdHVyZXMuICAqLwotI2RlZmluZSBNQVNLX1Y5ICgoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOSkgXAotCQkgfCAoMSA8PCBTUEFSQ19PUENPREVfQVJDSF9WOUEpKQotLyogMSBpZiBJTlNOIGlzIGZvciB2OSBvbmx5LiAgKi8KLSNkZWZpbmUgVjlfT05MWV9QKGluc24pICghICgoaW5zbiktPmFyY2hpdGVjdHVyZSAmIH5NQVNLX1Y5KSkKLS8qIDEgaWYgSU5TTiBpcyBmb3IgdjkuICAqLwotI2RlZmluZSBWOV9QKGluc24pICgoKGluc24pLT5hcmNoaXRlY3R1cmUgJiBNQVNLX1Y5KSAhPSAwKQotCi0vKiBUaGUgc29ydGVkIG9wY29kZSB0YWJsZS4gICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNwYXJjX29wY29kZSAqKnNvcnRlZF9vcGNvZGVzOwotCi0vKiBGb3IgZmFzdGVyIGxvb2t1cCwgYWZ0ZXIgaW5zbnMgYXJlIHNvcnRlZCB0aGV5IGFyZSBoYXNoZWQuICAqLwotLyogPz8/IEkgdGhpbmsgdGhlcmUgaXMgcm9vbSBmb3IgZXZlbiBtb3JlIGltcHJvdmVtZW50LiAgKi8KLQotI2RlZmluZSBIQVNIX1NJWkUgMjU2Ci0vKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBvbmx5IGxvb2sgYXQgaW5zbiBjb2RlIGJpdHMgYXMgdGhhdCBpcyBob3cgdGhlCi0gICBvcGNvZGUgdGFibGUgaXMgaGFzaGVkLiAgT1BDT0RFX0JJVFMgaXMgYSB0YWJsZSBvZiB2YWxpZCBiaXRzIGZvciBlYWNoCi0gICBvZiB0aGUgbWFpbiB0eXBlcyAoMCwxLDIsMykuICAqLwotc3RhdGljIGludCBvcGNvZGVfYml0c1s0XSA9IHsgMHgwMWMwMDAwMCwgMHgwLCAweDAxZjgwMDAwLCAweDAxZjgwMDAwIH07Ci0jZGVmaW5lIEhBU0hfSU5TTihJTlNOKSBcCi0gICgoKChJTlNOKSA+PiAyNCkgJiAweGMwKSB8ICgoKElOU04pICYgb3Bjb2RlX2JpdHNbKChJTlNOKSA+PiAzMCkgJiAzXSkgPj4gMTkpKQotc3RydWN0IG9wY29kZV9oYXNoIHsKLSAgc3RydWN0IG9wY29kZV9oYXNoICpuZXh0OwotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICpvcGNvZGU7Ci19Owotc3RhdGljIHN0cnVjdCBvcGNvZGVfaGFzaCAqb3Bjb2RlX2hhc2hfdGFibGVbSEFTSF9TSVpFXTsKLQotc3RhdGljIHZvaWQgYnVpbGRfaGFzaF90YWJsZQotICBQQVJBTVMgKChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqLCBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKiosIGludCkpOwotc3RhdGljIGludCBpc19kZWxheWVkX2JyYW5jaCBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgaW50IGNvbXBhcmVfb3Bjb2RlcyBQQVJBTVMgKChjb25zdCBQVFIsIGNvbnN0IFBUUikpOwotc3RhdGljIGludCBjb21wdXRlX2FyY2hfbWFzayBQQVJBTVMgKCh1bnNpZ25lZCBsb25nKSk7Ci0KLS8qIFNpZ24tZXh0ZW5kIGEgdmFsdWUgd2hpY2ggaXMgTiBiaXRzIGxvbmcuICAqLwotI2RlZmluZQlTRVgodmFsdWUsIGJpdHMpIFwKLQkoKCgoaW50KSh2YWx1ZSkpIDw8ICgoOCAqIHNpemVvZiAoaW50KSkgLSBiaXRzKSkJXAotCQkJID4+ICgoOCAqIHNpemVvZiAoaW50KSkgLSBiaXRzKSApCi0KLXN0YXRpYyAgY2hhciAqcmVnX25hbWVzW10gPQoteyAiZzAiLCAiZzEiLCAiZzIiLCAiZzMiLCAiZzQiLCAiZzUiLCAiZzYiLCAiZzciLAkKLSAgIm8wIiwgIm8xIiwgIm8yIiwgIm8zIiwgIm80IiwgIm81IiwgInNwIiwgIm83IiwJCi0gICJsMCIsICJsMSIsICJsMiIsICJsMyIsICJsNCIsICJsNSIsICJsNiIsICJsNyIsCQotICAiaTAiLCAiaTEiLCAiaTIiLCAiaTMiLCAiaTQiLCAiaTUiLCAiZnAiLCAiaTciLAkKLSAgImYwIiwgImYxIiwgImYyIiwgImYzIiwgImY0IiwgImY1IiwgImY2IiwgImY3IiwJCi0gICJmOCIsICJmOSIsICJmMTAiLCAiZjExIiwgImYxMiIsICJmMTMiLCAiZjE0IiwgImYxNSIsCQotICAiZjE2IiwgImYxNyIsICJmMTgiLCAiZjE5IiwgImYyMCIsICJmMjEiLCAiZjIyIiwgImYyMyIsCi0gICJmMjQiLCAiZjI1IiwgImYyNiIsICJmMjciLCAiZjI4IiwgImYyOSIsICJmMzAiLCAiZjMxIiwKLSAgImYzMiIsICJmMzMiLCAiZjM0IiwgImYzNSIsICJmMzYiLCAiZjM3IiwgImYzOCIsICJmMzkiLAkKLSAgImY0MCIsICJmNDEiLCAiZjQyIiwgImY0MyIsICJmNDQiLCAiZjQ1IiwgImY0NiIsICJmNDciLAkKLSAgImY0OCIsICJmNDkiLCAiZjUwIiwgImY1MSIsICJmNTIiLCAiZjUzIiwgImY1NCIsICJmNTUiLAotICAiZjU2IiwgImY1NyIsICJmNTgiLCAiZjU5IiwgImY2MCIsICJmNjEiLCAiZjYyIiwgImY2MyIsCi0vKiBwc3IsIHdpbSwgdGJyLCBmcHNyLCBjcHNyIGFyZSB2OCBvbmx5LiAgKi8KLSAgInkiLCAicHNyIiwgIndpbSIsICJ0YnIiLCAicGMiLCAibnBjIiwgImZwc3IiLCAiY3BzciIKLX07Ci0KLSNkZWZpbmUJZnJlZ19uYW1lcwkoJnJlZ19uYW1lc1s0ICogOF0pCi0KLS8qIFRoZXNlIGFyZSBvcmRlcmVkIGFjY29yZGluZyB0byB0aGVyZSByZWdpc3RlciBudW1iZXIgaW4KLSAgIHJkcHIgYW5kIHdycHIgaW5zbnMuICAqLwotc3RhdGljIGNoYXIgKnY5X3ByaXZfcmVnX25hbWVzW10gPQotewotICAidHBjIiwgInRucGMiLCAidHN0YXRlIiwgInR0IiwgInRpY2siLCAidGJhIiwgInBzdGF0ZSIsICJ0bCIsCi0gICJwaWwiLCAiY3dwIiwgImNhbnNhdmUiLCAiY2FucmVzdG9yZSIsICJjbGVhbndpbiIsICJvdGhlcndpbiIsCi0gICJ3c3RhdGUiLCAiZnEiCi0gIC8qICJ2ZXIiIC0gc3BlY2lhbCBjYXNlZCAqLwotfTsKLQotLyogVGhlc2UgYXJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZXJlIHJlZ2lzdGVyIG51bWJlciBpbgotICAgcmQgYW5kIHdyIGluc25zICgtMTYpLiAgKi8KLXN0YXRpYyBjaGFyICp2OWFfYXNyX3JlZ19uYW1lc1tdID0KLXsKLSAgInBjciIsICJwaWMiLCAiZGNyIiwgImdzciIsICJzZXRfc29mdGludCIsICJjbGVhcl9zb2Z0aW50IiwKLSAgInNvZnRpbnQiLCAidGlja19jbXByIgotfTsKLQotLyogTWFjcm9zIHVzZWQgdG8gZXh0cmFjdCBpbnN0cnVjdGlvbiBmaWVsZHMuICBOb3QgYWxsIGZpZWxkcyBoYXZlCi0gICBtYWNyb3MgZGVmaW5lZCBoZXJlLCBvbmx5IHRob3NlIHdoaWNoIGFyZSBhY3R1YWxseSB1c2VkLiAgKi8KLQotI2RlZmluZSBYX1JEKGkpICgoKGkpID4+IDI1KSAmIDB4MWYpCi0jZGVmaW5lIFhfUlMxKGkpICgoKGkpID4+IDE0KSAmIDB4MWYpCi0jZGVmaW5lIFhfTERTVF9JKGkpICgoKGkpID4+IDEzKSAmIDEpCi0jZGVmaW5lIFhfQVNJKGkpICgoKGkpID4+IDUpICYgMHhmZikKLSNkZWZpbmUgWF9SUzIoaSkgKCgoaSkgPj4gMCkgJiAweDFmKQotI2RlZmluZSBYX0lNTShpLG4pICgoKGkpID4+IDApICYgKCgxIDw8IChuKSkgLSAxKSkKLSNkZWZpbmUgWF9TSU1NKGksbikgU0VYIChYX0lNTSAoKGkpLCAobikpLCAobikpCi0jZGVmaW5lIFhfRElTUDIyKGkpICgoKGkpID4+IDApICYgMHgzZmZmZmYpCi0jZGVmaW5lIFhfSU1NMjIoaSkgWF9ESVNQMjIgKGkpCi0jZGVmaW5lIFhfRElTUDMwKGkpICgoKGkpID4+IDApICYgMHgzZmZmZmZmZikKLQotLyogVGhlc2UgYXJlIGZvciB2OS4gICovCi0jZGVmaW5lIFhfRElTUDE2KGkpICgoKCgoaSkgPj4gMjApICYgMykgPDwgMTQpIHwgKCgoaSkgPj4gMCkgJiAweDNmZmYpKQotI2RlZmluZSBYX0RJU1AxOShpKSAoKChpKSA+PiAwKSAmIDB4N2ZmZmYpCi0jZGVmaW5lIFhfTUVNQkFSKGkpICgoaSkgJiAweDdmKQotCi0vKiBIZXJlIGlzIHRoZSB1bmlvbiB3aGljaCB3YXMgdXNlZCB0byBleHRyYWN0IGluc3RydWN0aW9uIGZpZWxkcwotICAgYmVmb3JlIHRoZSBzaGlmdCBhbmQgbWFzayBtYWNyb3Mgd2VyZSB3cml0dGVuLgotCi0gICB1bmlvbiBzcGFyY19pbnNuCi0gICAgIHsKLSAgICAgICB1bnNpZ25lZCBsb25nIGludCBjb2RlOwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICAjZGVmaW5lCW9wCWxkc3QuYW5vcAotCSAgIHVuc2lnbmVkIGludCBhbnJkOjU7Ci0JICAgI2RlZmluZQlyZAlsZHN0LmFucmQKLQkgICB1bnNpZ25lZCBpbnQgb3AzOjY7Ci0JICAgdW5zaWduZWQgaW50IGFucnMxOjU7Ci0JICAgI2RlZmluZQlyczEJbGRzdC5hbnJzMQotCSAgIHVuc2lnbmVkIGludCBpOjE7Ci0JICAgdW5zaWduZWQgaW50IGFuYXNpOjg7Ci0JICAgI2RlZmluZQlhc2kJbGRzdC5hbmFzaQotCSAgIHVuc2lnbmVkIGludCBhbnJzMjo1OwotCSAgICNkZWZpbmUJcnMyCWxkc3QuYW5yczIKLQkgICAjZGVmaW5lCXNoY250CXJzMgotCSB9IGxkc3Q7Ci0gICAgICAgc3RydWN0Ci0JIHsKLQkgICB1bnNpZ25lZCBpbnQgYW5vcDoyLCBhbnJkOjUsIG9wMzo2LCBhbnJzMTo1LCBpOjE7Ci0JICAgdW5zaWduZWQgaW50IElNTTEzOjEzOwotCSAgICNkZWZpbmUJaW1tMTMJSU1NMTMuSU1NMTMKLQkgfSBJTU0xMzsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjI7Ci0JICAgdW5zaWduZWQgaW50IGE6MTsKLQkgICB1bnNpZ25lZCBpbnQgY29uZDo0OwotCSAgIHVuc2lnbmVkIGludCBvcDI6MzsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDIyOjIyOwotCSAgICNkZWZpbmUJZGlzcDIyCWJyYW5jaC5ESVNQMjIKLQkgICAjZGVmaW5lCWltbTIyCWRpc3AyMgotCSB9IGJyYW5jaDsKLSAgICAgICBzdHJ1Y3QKLQkgewotCSAgIHVuc2lnbmVkIGludCBhbm9wOjI7Ci0JICAgdW5zaWduZWQgaW50IGE6MTsKLQkgICB1bnNpZ25lZCBpbnQgejoxOwotCSAgIHVuc2lnbmVkIGludCByY29uZDozOwotCSAgIHVuc2lnbmVkIGludCBvcDI6MzsKLQkgICB1bnNpZ25lZCBpbnQgRElTUDE2SEk6MjsKLQkgICB1bnNpZ25lZCBpbnQgcDoxOwotCSAgIHVuc2lnbmVkIGludCBfcnMxOjU7Ci0JICAgdW5zaWduZWQgaW50IERJU1AxNkxPOjE0OwotCSB9IGJyYW5jaDE2OwotICAgICAgIHN0cnVjdAotCSB7Ci0JICAgdW5zaWduZWQgaW50IGFub3A6MjsKLQkgICB1bnNpZ25lZCBpbnQgYWRpc3AzMDozMDsKLQkgICAjZGVmaW5lCWRpc3AzMAljYWxsLmFkaXNwMzAKLQkgfSBjYWxsOwotICAgICB9OwotCi0gICAqLwotCi0vKiBOb256ZXJvIGlmIElOU04gaXMgdGhlIG9wY29kZSBmb3IgYSBkZWxheWVkIGJyYW5jaC4gICovCi1zdGF0aWMgaW50Ci1pc19kZWxheWVkX2JyYW5jaCAoaW5zbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotewotICBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm9wOwotCi0gIGZvciAob3AgPSBvcGNvZGVfaGFzaF90YWJsZVtIQVNIX0lOU04gKGluc24pXTsgb3A7IG9wID0gb3AtPm5leHQpCi0gICAgewotICAgICAgQ09OU1Qgc3RydWN0IHNwYXJjX29wY29kZSAqb3Bjb2RlID0gb3AtPm9wY29kZTsKLSAgICAgIGlmICgob3Bjb2RlLT5tYXRjaCAmIGluc24pID09IG9wY29kZS0+bWF0Y2gKLQkgICYmIChvcGNvZGUtPmxvc2UgJiBpbnNuKSA9PSAwKQotCXJldHVybiAob3Bjb2RlLT5mbGFncyAmIEZfREVMQVlFRCk7Ci0gICAgfQotICByZXR1cm4gMDsKLX0KLQotLyogZXh0ZXJuIHZvaWQgcXNvcnQgKCk7ICovCi0KLS8qIFJlY29yZHMgY3VycmVudCBtYXNrIG9mIFNQQVJDX09QQ09ERV9BUkNIX0ZPTyB2YWx1ZXMsIHVzZWQgdG8gcGFzcyB2YWx1ZQotICAgdG8gY29tcGFyZV9vcGNvZGVzLiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3VycmVudF9hcmNoX21hc2s7Ci0KLS8qIFByaW50IG9uZSBpbnN0cnVjdGlvbiBmcm9tIE1FTUFERFIgb24gSU5GTy0+U1RSRUFNLgotCi0gICBXZSBzdWZmaXggdGhlIGluc3RydWN0aW9uIHdpdGggYSBjb21tZW50IHRoYXQgZ2l2ZXMgdGhlIGFic29sdXRlCi0gICBhZGRyZXNzIGludm9sdmVkLCBhcyB3ZWxsIGFzIGl0cyBzeW1ib2xpYyBmb3JtLCBpZiB0aGUgaW5zdHJ1Y3Rpb24KLSAgIGlzIHByZWNlZGVkIGJ5IGEgZmluZGFibGUgYHNldGhpJyBhbmQgaXQgZWl0aGVyIGFkZHMgYW4gaW1tZWRpYXRlCi0gICBkaXNwbGFjZW1lbnQgdG8gdGhhdCByZWdpc3Rlciwgb3IgaXQgaXMgYW4gYGFkZCcgb3IgYG9yJyBpbnN0cnVjdGlvbgotICAgb24gdGhhdCByZWdpc3Rlci4gICovCi0KLWludAotcHJpbnRfaW5zbl9zcGFyYyAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBGSUxFICpzdHJlYW0gPSBpbmZvLT5zdHJlYW07Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgdW5zaWduZWQgbG9uZyBpbnNuOwotICByZWdpc3RlciBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKm9wOwotICAvKiBOb256ZXJvIG9mIG9wY29kZSB0YWJsZSBoYXMgYmVlbiBpbml0aWFsaXplZC4gICovCi0gIHN0YXRpYyBpbnQgb3Bjb2Rlc19pbml0aWFsaXplZCA9IDA7Ci0gIC8qIGJmZCBtYWNoIG51bWJlciBvZiBsYXN0IGNhbGwuICAqLwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBjdXJyZW50X21hY2ggPSAwOwotICBiZmRfdm1hICgqZ2V0d29yZCkgUEFSQU1TICgoY29uc3QgdW5zaWduZWQgY2hhciAqKSk7Ci0KLSAgaWYgKCFvcGNvZGVzX2luaXRpYWxpemVkCi0gICAgICB8fCBpbmZvLT5tYWNoICE9IGN1cnJlbnRfbWFjaCkKLSAgICB7Ci0gICAgICBpbnQgaTsKLQotICAgICAgY3VycmVudF9hcmNoX21hc2sgPSBjb21wdXRlX2FyY2hfbWFzayAoaW5mby0+bWFjaCk7Ci0KLSAgICAgIGlmICghb3Bjb2Rlc19pbml0aWFsaXplZCkKLQlzb3J0ZWRfb3Bjb2RlcyA9IChjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlICoqKQotCSAgeG1hbGxvYyAoc3BhcmNfbnVtX29wY29kZXMgKiBzaXplb2YgKHN0cnVjdCBzcGFyY19vcGNvZGUgKikpOwotICAgICAgLyogUmVzZXQgdGhlIHNvcnRlZCB0YWJsZSBzbyB3ZSBjYW4gcmVzb3J0IGl0LiAgKi8KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGFyY19udW1fb3Bjb2RlczsgKytpKQotCXNvcnRlZF9vcGNvZGVzW2ldID0gJnNwYXJjX29wY29kZXNbaV07Ci0gICAgICBxc29ydCAoKGNoYXIgKikgc29ydGVkX29wY29kZXMsIHNwYXJjX251bV9vcGNvZGVzLAotCSAgICAgc2l6ZW9mIChzb3J0ZWRfb3Bjb2Rlc1swXSksIGNvbXBhcmVfb3Bjb2Rlcyk7Ci0KLSAgICAgIGJ1aWxkX2hhc2hfdGFibGUgKHNvcnRlZF9vcGNvZGVzLCBvcGNvZGVfaGFzaF90YWJsZSwgc3BhcmNfbnVtX29wY29kZXMpOwotICAgICAgY3VycmVudF9tYWNoID0gaW5mby0+bWFjaDsKLSAgICAgIG9wY29kZXNfaW5pdGlhbGl6ZWQgPSAxOwotICAgIH0KLQotICB7Ci0gICAgaW50IHN0YXR1cyA9Ci0gICAgICAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyLCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0gICAgaWYgKHN0YXR1cyAhPSAwKQotICAgICAgewotCSgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIG1lbWFkZHIsIGluZm8pOwotCXJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIE9uIFNQQVJDbGl0ZSB2YXJpYW50cyBzdWNoIGFzIERBTmxpdGUgKHNwYXJjODZ4KSwgaW5zdHJ1Y3Rpb25zCi0gICAgIGFyZSBhbHdheXMgYmlnLWVuZGlhbiBldmVuIHdoZW4gdGhlIG1hY2hpbmUgaXMgaW4gbGl0dGxlLWVuZGlhbiBtb2RlLiAqLwotICBpZiAoaW5mby0+ZW5kaWFuID09IEJGRF9FTkRJQU5fQklHIHx8IGluZm8tPm1hY2ggPT0gYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlKQotICAgIGdldHdvcmQgPSBiZmRfZ2V0YjMyOwotICBlbHNlCi0gICAgZ2V0d29yZCA9IGJmZF9nZXRsMzI7Ci0KLSAgaW5zbiA9IGdldHdvcmQgKGJ1ZmZlcik7Ci0KLSAgaW5mby0+aW5zbl9pbmZvX3ZhbGlkID0gMTsJCQkvKiBXZSBkbyByZXR1cm4gdGhpcyBpbmZvICovCi0gIGluZm8tPmluc25fdHlwZSA9IGRpc19ub25icmFuY2g7CQkvKiBBc3N1bWUgbm9uIGJyYW5jaCBpbnNuICovCi0gIGluZm8tPmJyYW5jaF9kZWxheV9pbnNucyA9IDA7CQkJLyogQXNzdW1lIG5vIGRlbGF5ICovCi0gIGluZm8tPnRhcmdldCA9IDA7CQkJCS8qIEFzc3VtZSBubyB0YXJnZXQga25vd24gKi8KLQotICBmb3IgKG9wID0gb3Bjb2RlX2hhc2hfdGFibGVbSEFTSF9JTlNOIChpbnNuKV07IG9wOyBvcCA9IG9wLT5uZXh0KQotICAgIHsKLSAgICAgIENPTlNUIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wY29kZSA9IG9wLT5vcGNvZGU7Ci0KLSAgICAgIC8qIElmIHRoZSBpbnNuIGlzbid0IHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUsIHNraXAgaXQuICAqLwotICAgICAgaWYgKCEgKG9wY29kZS0+YXJjaGl0ZWN0dXJlICYgY3VycmVudF9hcmNoX21hc2spKQotCWNvbnRpbnVlOwotCi0gICAgICBpZiAoKG9wY29kZS0+bWF0Y2ggJiBpbnNuKSA9PSBvcGNvZGUtPm1hdGNoCi0JICAmJiAob3Bjb2RlLT5sb3NlICYgaW5zbikgPT0gMCkKLQl7Ci0JICAvKiBOb256ZXJvIG1lYW5zIHRoYXQgd2UgaGF2ZSBmb3VuZCBhbiBpbnN0cnVjdGlvbiB3aGljaCBoYXMKLQkgICAgIHRoZSBlZmZlY3Qgb2YgYWRkaW5nIG9yIG9yJ2luZyB0aGUgaW1tMTMgZmllbGQgdG8gcnMxLiAgKi8KLQkgIGludCBpbW1fYWRkZWRfdG9fcnMxID0gMDsKLQotCSAgLyogTm9uemVybyBtZWFucyB0aGF0IHdlIGhhdmUgZm91bmQgYSBwbHVzIHNpZ24gaW4gdGhlIGFyZ3MKLQkgICAgIGZpZWxkIG9mIHRoZSBvcGNvZGUgdGFibGUuICAqLwotCSAgaW50IGZvdW5kX3BsdXMgPSAwOwotCSAgCi0JICAvKiBOb256ZXJvIG1lYW5zIHdlIGhhdmUgYW4gYW5udWxsZWQgYnJhbmNoLiAgKi8KLQkgIGludCBpc19hbm51bGxlZCA9IDA7Ci0KLQkgIC8qIERvIHdlIGhhdmUgYW4gYGFkZCcgb3IgYG9yJyBpbnN0cnVjdGlvbiBjb21iaW5pbmcgYW4KLSAgICAgICAgICAgICBpbW1lZGlhdGUgd2l0aCByczE/ICAqLwotCSAgaWYgKG9wY29kZS0+bWF0Y2ggPT0gMHg4MDEwMjAwMCB8fCBvcGNvZGUtPm1hdGNoID09IDB4ODAwMDIwMDApCi0JICAvKgkJCSAgKG9yKQkJCQkgKGFkZCkgICovCi0JICAgIGltbV9hZGRlZF90b19yczEgPSAxOwotCi0JICBpZiAoWF9SUzEgKGluc24pICE9IFhfUkQgKGluc24pCi0JICAgICAgJiYgc3RyY2hyIChvcGNvZGUtPmFyZ3MsICdyJykgIT0gMCkKLQkgICAgICAvKiBDYW4ndCBkbyBzaW1wbGUgZm9ybWF0IGlmIHNvdXJjZSBhbmQgZGVzdCBhcmUgZGlmZmVyZW50LiAgKi8KLQkgICAgICBjb250aW51ZTsKLQkgIGlmIChYX1JTMiAoaW5zbikgIT0gWF9SRCAoaW5zbikKLQkgICAgICAmJiBzdHJjaHIgKG9wY29kZS0+YXJncywgJ08nKSAhPSAwKQotCSAgICAgIC8qIENhbid0IGRvIHNpbXBsZSBmb3JtYXQgaWYgc291cmNlIGFuZCBkZXN0IGFyZSBkaWZmZXJlbnQuICAqLwotCSAgICAgIGNvbnRpbnVlOwotCi0JICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgb3Bjb2RlLT5uYW1lKTsKLQotCSAgewotCSAgICByZWdpc3RlciBDT05TVCBjaGFyICpzOwotCi0JICAgIGlmIChvcGNvZGUtPmFyZ3NbMF0gIT0gJywnKQotCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiICIpOwotCSAgICBmb3IgKHMgPSBvcGNvZGUtPmFyZ3M7ICpzICE9ICdcMCc7ICsrcykKLQkgICAgICB7Ci0JCXdoaWxlICgqcyA9PSAnLCcpCi0JCSAgewotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIsIik7Ci0JCSAgICArK3M7Ci0JCSAgICBzd2l0Y2ggKCpzKSB7Ci0JCSAgICBjYXNlICdhJzoKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJhIik7Ci0JCSAgICAgIGlzX2FubnVsbGVkID0gMTsKLQkJICAgICAgKytzOwotCQkgICAgICBjb250aW51ZTsKLQkJICAgIGNhc2UgJ04nOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgInBuIik7Ci0JCSAgICAgICsrczsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGNhc2UgJ1QnOgotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgInB0Iik7Ci0JCSAgICAgICsrczsKLQkJICAgICAgY29udGludWU7Ci0KLQkJICAgIGRlZmF1bHQ6Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQkJLyogc3dpdGNoIG9uIGFyZyAqLwotCQkgIH0JCS8qIHdoaWxlIHRoZXJlIGFyZSBjb21tYSBzdGFydGVkIGFyZ3MgKi8KLQotCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiAiKTsKLQkJCQotCQlzd2l0Y2ggKCpzKQotCQkgIHsKLQkJICBjYXNlICcrJzoKLQkJICAgIGZvdW5kX3BsdXMgPSAxOwotCi0JCSAgICAvKiBub3RlIGZhbGwtdGhyb3VnaCAqLwotCQkgIGRlZmF1bHQ6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVjIiwgKnMpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICcjJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiMCIpOwotCQkgICAgYnJlYWs7Ci0KLSNkZWZpbmUJcmVnKG4pCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsIHJlZ19uYW1lc1tuXSkKLQkJICBjYXNlICcxJzoKLQkJICBjYXNlICdyJzoKLQkJICAgIHJlZyAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnMic6Ci0JCSAgY2FzZSAnTyc6Ci0JCSAgICByZWcgKFhfUlMyIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2QnOgotCQkgICAgcmVnIChYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLSN1bmRlZglyZWcKLQotI2RlZmluZQlmcmVnKG4pCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLCBmcmVnX25hbWVzW25dKQotI2RlZmluZQlmcmVneChuKQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlJXMiLCBmcmVnX25hbWVzWygobikgJiB+MSkgfCAoKChuKSAmIDEpIDw8IDUpXSkKLQkJICBjYXNlICdlJzoKLQkJICAgIGZyZWcgKFhfUlMxIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlICd2JzoJLyogZG91YmxlL2V2ZW4gKi8KLQkJICBjYXNlICdWJzoJLyogcXVhZC9tdWx0aXBsZSBvZiA0ICovCi0JCSAgICBmcmVneCAoWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnZic6Ci0JCSAgICBmcmVnIChYX1JTMiAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnQic6CS8qIGRvdWJsZS9ldmVuICovCi0JCSAgY2FzZSAnUic6CS8qIHF1YWQvbXVsdGlwbGUgb2YgNCAqLwotCQkgICAgZnJlZ3ggKFhfUlMyIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2cnOgotCQkgICAgZnJlZyAoWF9SRCAoaW5zbikpOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAnSCc6CS8qIGRvdWJsZS9ldmVuICovCi0JCSAgY2FzZSAnSic6CS8qIHF1YWQvbXVsdGlwbGUgb2YgNCAqLwotCQkgICAgZnJlZ3ggKFhfUkQgKGluc24pKTsKLQkJICAgIGJyZWFrOwotI3VuZGVmCWZyZWcKLSN1bmRlZglmcmVneAotCi0jZGVmaW5lCWNyZWcobikJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWMldSIsICh1bnNpZ25lZCBpbnQpIChuKSkKLQkJICBjYXNlICdiJzoKLQkJICAgIGNyZWcgKFhfUlMxIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2MnOgotCQkgICAgY3JlZyAoWF9SUzIgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnRCc6Ci0JCSAgICBjcmVnIChYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLSN1bmRlZgljcmVnCi0KLQkJICBjYXNlICdoJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVoaSglI3gpIiwKLQkJCQkJICAgKDB4RkZGRkZGRkYKLQkJCQkJICAgICYgKChpbnQpIFhfSU1NMjIgKGluc24pIDw8IDEwKSkpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdpJzoJLyogMTMgYml0IGltbWVkaWF0ZSAqLwotCQkgIGNhc2UgJ0knOgkvKiAxMSBiaXQgaW1tZWRpYXRlICovCi0JCSAgY2FzZSAnaic6CS8qIDEwIGJpdCBpbW1lZGlhdGUgKi8KLQkJICAgIHsKLQkJICAgICAgaW50IGltbTsKLQotCQkgICAgICBpZiAoKnMgPT0gJ2knKQotCQkgICAgICAgIGltbSA9IFhfU0lNTSAoaW5zbiwgMTMpOwotCQkgICAgICBlbHNlIGlmICgqcyA9PSAnSScpCi0JCQlpbW0gPSBYX1NJTU0gKGluc24sIDExKTsKLQkJICAgICAgZWxzZQotCQkJaW1tID0gWF9TSU1NIChpbnNuLCAxMCk7Ci0KLQkJICAgICAgLyogQ2hlY2sgdG8gc2VlIHdoZXRoZXIgd2UgaGF2ZSBhIDEraSwgYW5kIHRha2UKLQkJCSBub3RlIG9mIHRoYXQgZmFjdC4KLQotCQkJIE5vdGU6IGJlY2F1c2Ugb2YgdGhlIHdheSB3ZSBzb3J0IHRoZSB0YWJsZSwKLQkJCSB3ZSB3aWxsIGJlIG1hdGNoaW5nIDEraSByYXRoZXIgdGhhbiBpKzEsCi0JCQkgc28gaXQgaXMgT0sgdG8gYXNzdW1lIHRoYXQgaSBpcyBhZnRlciArLAotCQkJIG5vdCBiZWZvcmUgaXQuICAqLwotCQkgICAgICBpZiAoZm91bmRfcGx1cykKLQkJCWltbV9hZGRlZF90b19yczEgPSAxOwotCQkgICAgICAKLQkJICAgICAgaWYgKGltbSA8PSA5KQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlZCIsIGltbSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSN4IiwgaW1tKTsKLQkJICAgIH0KLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnWCc6CS8qIDUgYml0IHVuc2lnbmVkIGltbWVkaWF0ZSAqLwotCQkgIGNhc2UgJ1knOgkvKiA2IGJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgKi8KLQkJICAgIHsKLQkJICAgICAgaW50IGltbSA9IFhfSU1NIChpbnNuLCAqcyA9PSAnWCcgPyA1IDogNik7Ci0KLQkJICAgICAgaWYgKGltbSA8PSA5KQotCQkJKGluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwgaW1tKTsKLQkJICAgICAgZWxzZQotCQkJKGluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUjeCIsICh1bnNpZ25lZCkgaW1tKTsKLQkJICAgIH0KLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnSyc6Ci0JCSAgICB7Ci0JCSAgICAgIGludCBtYXNrID0gWF9NRU1CQVIgKGluc24pOwotCQkgICAgICBpbnQgYml0ID0gMHg0MCwgcHJpbnRlZF9vbmUgPSAwOwotCQkgICAgICBjb25zdCBjaGFyICpuYW1lOwotCi0JCSAgICAgIGlmIChtYXNrID09IDApCi0JCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiMCIpOwotCQkgICAgICBlbHNlCi0JCQl3aGlsZSAoYml0KQotCQkJICB7Ci0JCQkgICAgaWYgKG1hc2sgJiBiaXQpCi0JCQkgICAgICB7Ci0JCQkJaWYgKHByaW50ZWRfb25lKQotCQkJCSAgKGluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgInwiKTsKLQkJCQluYW1lID0gc3BhcmNfZGVjb2RlX21lbWJhciAoYml0KTsKLQkJCQkoaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJXMiLCBuYW1lKTsKLQkJCQlwcmludGVkX29uZSA9IDE7Ci0JCQkgICAgICB9Ci0JCQkgICAgYml0ID4+PSAxOwotCQkJICB9Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgY2FzZSAnayc6Ci0JCSAgICBpbmZvLT50YXJnZXQgPSBtZW1hZGRyICsgU0VYIChYX0RJU1AxNiAoaW5zbiksIDE2KSAqIDQ7Ci0JCSAgICAoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGluZm8tPnRhcmdldCwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0cnOgotCQkgICAgaW5mby0+dGFyZ2V0ID0gbWVtYWRkciArIFNFWCAoWF9ESVNQMTkgKGluc24pLCAxOSkgKiA0OwotCQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICc2JzoKLQkJICBjYXNlICc3JzoKLQkJICBjYXNlICc4JzoKLQkJICBjYXNlICc5JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVmY2MlYyIsICpzIC0gJzYnICsgJzAnKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAneic6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlaWNjIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ1onOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXhjYyIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdFJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVjY3IiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAncyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZnBycyIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdvJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVhc2kiKTsKLQkJICAgIGJyZWFrOwotCQkgICAgCi0JCSAgY2FzZSAnVyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUldGljayIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdQJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVwYyIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICc/JzoKLQkJICAgIGlmIChYX1JTMSAoaW5zbikgPT0gMzEpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSV2ZXIiKTsKLQkJICAgIGVsc2UgaWYgKCh1bnNpZ25lZCkgWF9SUzEgKGluc24pIDwgMTYpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsCi0JCQkJCSAgICAgdjlfcHJpdl9yZWdfbmFtZXNbWF9SUzEgKGluc24pXSk7Ci0JCSAgICBlbHNlCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVyZXNlcnZlZCIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICchJzoKLQkJICAgIGlmICgodW5zaWduZWQpIFhfUkQgKGluc24pIDwgMTUpCi0JCSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSUlcyIsCi0JCQkJCSAgICAgdjlfcHJpdl9yZWdfbmFtZXNbWF9SRCAoaW5zbildKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXJlc2VydmVkIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJy8nOgotCQkgICAgaWYgKFhfUlMxIChpbnNuKSA8IDE2IHx8IFhfUlMxIChpbnNuKSA+IDIzKQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OWFfYXNyX3JlZ19uYW1lc1tYX1JTMSAoaW5zbiktMTZdKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnXyc6Ci0JCSAgICBpZiAoWF9SRCAoaW5zbikgPCAxNiB8fCBYX1JEIChpbnNuKSA+IDIzKQotCQkgICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlcmVzZXJ2ZWQiKTsKLQkJICAgIGVsc2UKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJSVzIiwKLQkJCQkJICAgICB2OWFfYXNyX3JlZ19uYW1lc1tYX1JEIChpbnNuKS0xNl0pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICcqJzoKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHNwYXJjX2RlY29kZV9wcmVmZXRjaCAoWF9SRCAoaW5zbikpOwotCi0JCSAgICAgIGlmIChuYW1lKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVkIiwgWF9SRCAoaW5zbikpOwotCQkgICAgICBicmVhazsKLQkJICAgIH0KLQkJICAgIAotCQkgIGNhc2UgJ00nOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWFzciVkIiwgWF9SUzEgKGluc24pKTsKLQkJICAgIGJyZWFrOwotCQkgICAgCi0JCSAgY2FzZSAnbSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlYXNyJWQiLCBYX1JEIChpbnNuKSk7Ci0JCSAgICBicmVhazsKLQkJICAgIAotCQkgIGNhc2UgJ0wnOgotCQkgICAgaW5mby0+dGFyZ2V0ID0gbWVtYWRkciArIFNFWCAoWF9ESVNQMzAgKGluc24pLCAzMCkgKiA0OwotCQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICduJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKQotCQkgICAgICAoc3RyZWFtLCAiJSN4IiwgU0VYIChYX0RJU1AyMiAoaW5zbiksIDIyKSk7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ2wnOgotCQkgICAgaW5mby0+dGFyZ2V0ID0gbWVtYWRkciArIFNFWCAoWF9ESVNQMjIgKGluc24pLCAyMikgKiA0OwotCQkgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdBJzoKLQkJICAgIHsKLQkJICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHNwYXJjX2RlY29kZV9hc2kgKFhfQVNJIChpbnNuKSk7Ci0KLQkJICAgICAgaWYgKG5hbWUpCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JCSAgICAgIGVsc2UKLQkJCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiKCVkKSIsIFhfQVNJIChpbnNuKSk7Ci0JCSAgICAgIGJyZWFrOwotCQkgICAgfQotCi0JCSAgY2FzZSAnQyc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlY3NyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ0YnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJWZzciIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICdwJzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJSVwc3IiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAncSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlZnEiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAnUSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlY3EiKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAndCc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUldGJyIik7Ci0JCSAgICBicmVhazsKLQotCQkgIGNhc2UgJ3cnOgotCQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlJXdpbSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd4JzoKLQkJICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoc3RyZWFtLCAiJWQiLAotCQkJCQkgICAoKFhfTERTVF9JIChpbnNuKSA8PCA4KQotCQkJCQkgICAgKyBYX0FTSSAoaW5zbikpKTsKLQkJICAgIGJyZWFrOwotCi0JCSAgY2FzZSAneSc6Ci0JCSAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUleSIpOwotCQkgICAgYnJlYWs7Ci0KLQkJICBjYXNlICd1JzoKLQkJICBjYXNlICdVJzoKLQkJICAgIHsKLQkJICAgICAgaW50IHZhbCA9ICpzID09ICdVJyA/IFhfUlMxIChpbnNuKSA6IFhfUkQgKGluc24pOwotCQkgICAgICBjb25zdCBjaGFyICpuYW1lID0gc3BhcmNfZGVjb2RlX3NwYXJjbGV0X2NwcmVnICh2YWwpOwotCi0JCSAgICAgIGlmIChuYW1lKQotCQkJKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICIlcyIsIG5hbWUpOwotCQkgICAgICBlbHNlCi0JCQkoKmluZm8tPmZwcmludGZfZnVuYykgKHN0cmVhbSwgIiUlY3ByZWcoJWQpIiwgdmFsKTsKLQkJICAgICAgYnJlYWs7Ci0JCSAgICB9Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLQotCSAgLyogSWYgd2UgYXJlIGFkZGluZyBvciBvcidpbmcgc29tZXRoaW5nIHRvIHJzMSwgdGhlbgotCSAgICAgY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uIHdhcwotCSAgICAgYSBzZXRoaSB0byB0aGUgc2FtZSByZWdpc3RlciBhcyBpbiB0aGUgc2V0aGkuCi0JICAgICBJZiBzbywgYXR0ZW1wdCB0byBwcmludCB0aGUgcmVzdWx0IG9mIHRoZSBhZGQgb3IKLQkgICAgIG9yIChpbiB0aGlzIGNvbnRleHQgYWRkIGFuZCBvciBkbyB0aGUgc2FtZSB0aGluZykKLQkgICAgIGFuZCBpdHMgc3ltYm9saWMgdmFsdWUuICAqLwotCSAgaWYgKGltbV9hZGRlZF90b19yczEpCi0JICAgIHsKLQkgICAgICB1bnNpZ25lZCBsb25nIHByZXZfaW5zbjsKLQkgICAgICBpbnQgZXJyY29kZTsKLQotCSAgICAgIGVycmNvZGUgPQotCQkoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCSAgKG1lbWFkZHIgLSA0LCBidWZmZXIsIHNpemVvZiAoYnVmZmVyKSwgaW5mbyk7Ci0JICAgICAgcHJldl9pbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQotCSAgICAgIGlmIChlcnJjb2RlID09IDApCi0JCXsKLQkJICAvKiBJZiBpdCBpcyBhIGRlbGF5ZWQgYnJhbmNoLCB3ZSBuZWVkIHRvIGxvb2sgYXQgdGhlCi0JCSAgICAgaW5zdHJ1Y3Rpb24gYmVmb3JlIHRoZSBkZWxheWVkIGJyYW5jaC4gIFRoaXMgaGFuZGxlcwotCQkgICAgIHNlcXVlbmNlcyBzdWNoIGFzCi0KLQkJICAgICBzZXRoaSAlbzEsICVoaShfZm9vKSwgJW8xCi0JCSAgICAgY2FsbCBfcHJpbnRmCi0JCSAgICAgb3IgJW8xLCAlbG8oX2ZvbyksICVvMQotCQkgICAgICovCi0KLQkJICBpZiAoaXNfZGVsYXllZF9icmFuY2ggKHByZXZfaW5zbikpCi0JCSAgICB7Ci0JCSAgICAgIGVycmNvZGUgPSAoKmluZm8tPnJlYWRfbWVtb3J5X2Z1bmMpCi0JCQkobWVtYWRkciAtIDgsIGJ1ZmZlciwgc2l6ZW9mIChidWZmZXIpLCBpbmZvKTsKLQkJICAgICAgcHJldl9pbnNuID0gZ2V0d29yZCAoYnVmZmVyKTsKLQkJICAgIH0KLQkJfQotCi0JICAgICAgLyogSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSByZWFkaW5nIG1lbW9yeSwgdGhlbiBhc3N1bWUKLQkJIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbiB3YXMgbm90IHNldGhpLiAgKi8KLQkgICAgICBpZiAoZXJyY29kZSA9PSAwKQotCQl7Ci0JCSAgLyogSXMgaXQgc2V0aGkgdG8gdGhlIHNhbWUgcmVnaXN0ZXI/ICAqLwotCQkgIGlmICgocHJldl9pbnNuICYgMHhjMWMwMDAwMCkgPT0gMHgwMTAwMDAwMAotCQkgICAgICAmJiBYX1JEIChwcmV2X2luc24pID09IFhfUlMxIChpbnNuKSkKLQkJICAgIHsKLQkJICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sICJcdCEgIik7Ci0JCSAgICAgIGluZm8tPnRhcmdldCA9IAotCQkJKDB4RkZGRkZGRkYgJiAoaW50KSBYX0lNTTIyIChwcmV2X2luc24pIDw8IDEwKQotCQkJfCBYX1NJTU0gKGluc24sIDEzKTsKLQkJICAgICAgKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChpbmZvLT50YXJnZXQsIGluZm8pOwotCQkgICAgICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfZHJlZjsKLQkJICAgICAgaW5mby0+ZGF0YV9zaXplID0gNDsgIC8qIEZJWE1FISEhICovCi0JCSAgICB9Ci0JCX0KLQkgICAgfQotCi0JICBpZiAob3Bjb2RlLT5mbGFncyAmIChGX1VOQlJ8Rl9DT05EQlJ8Rl9KU1IpKQotCSAgICB7Ci0JCS8qIEZJWE1FIC0tIGNoZWNrIGlzX2FubnVsbGVkIGZsYWcgKi8KLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfVU5CUikKLQkJaW5mby0+aW5zbl90eXBlID0gZGlzX2JyYW5jaDsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfQ09OREJSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfY29uZGJyYW5jaDsKLQkgICAgICBpZiAob3Bjb2RlLT5mbGFncyAmIEZfSlNSKQotCQlpbmZvLT5pbnNuX3R5cGUgPSBkaXNfanNyOwotCSAgICAgIGlmIChvcGNvZGUtPmZsYWdzICYgRl9ERUxBWUVEKQotCQlpbmZvLT5icmFuY2hfZGVsYXlfaW5zbnMgPSAxOwotCSAgICB9Ci0KLQkgIHJldHVybiBzaXplb2YgKGJ1ZmZlcik7Ci0JfQotICAgIH0KLQotICBpbmZvLT5pbnNuX3R5cGUgPSBkaXNfbm9uaW5zbjsJLyogTWFyayBhcyBub24tdmFsaWQgaW5zdHJ1Y3Rpb24gKi8KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChzdHJlYW0sIF8oInVua25vd24iKSk7Ci0gIHJldHVybiBzaXplb2YgKGJ1ZmZlcik7Ci19Ci0KLS8qIEdpdmVuIEJGRCBtYWNoIG51bWJlciwgcmV0dXJuIGEgbWFzayBvZiBTUEFSQ19PUENPREVfQVJDSF9GT08gdmFsdWVzLiAgKi8KLQotc3RhdGljIGludAotY29tcHV0ZV9hcmNoX21hc2sgKG1hY2gpCi0gICAgIHVuc2lnbmVkIGxvbmcgbWFjaDsKLXsKLSAgc3dpdGNoIChtYWNoKQotICAgIHsKLSAgICBjYXNlIDAgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmMgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3NwYXJjbGV0IDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xFVCk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY19zcGFyY2xpdGUgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfc3BhcmNsaXRlX2xlIDoKLSAgICAgIC8qIHNwYXJjbGl0ZXMgaW5zbnMgYXJlIHJlY29nbml6ZWQgYnkgZGVmYXVsdCAoYmVjYXVzZSB0aGF0J3MgaG93Ci0JIHRoZXkndmUgYWx3YXlzIGJlZW4gdHJlYXRlZCwgZm9yIGJldHRlciBvciB3b3JzZSkuICBLbHVkZ2UgdGhpcyBieQotCSBpbmRpY2F0aW5nIGdlbmVyaWMgdjggaXMgYWxzbyBzZWxlY3RlZC4gICovCi0gICAgICByZXR1cm4gKFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTElURSkKLQkgICAgICB8IFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KSk7Ci0gICAgY2FzZSBiZmRfbWFjaF9zcGFyY192OHBsdXMgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjkgOgotICAgICAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5KTsKLSAgICBjYXNlIGJmZF9tYWNoX3NwYXJjX3Y4cGx1c2EgOgotICAgIGNhc2UgYmZkX21hY2hfc3BhcmNfdjlhIDoKLSAgICAgIHJldHVybiBTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOUEpOwotICAgIH0KLSAgYWJvcnQgKCk7Ci19Ci0KLS8qIENvbXBhcmUgb3Bjb2RlcyBBIGFuZCBCLiAgKi8KLQotc3RhdGljIGludAotY29tcGFyZV9vcGNvZGVzIChhLCBiKQotICAgICBjb25zdCBQVFIgYTsKLSAgICAgY29uc3QgUFRSIGI7Ci17Ci0gIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wMCA9ICogKHN0cnVjdCBzcGFyY19vcGNvZGUgKiopIGE7Ci0gIHN0cnVjdCBzcGFyY19vcGNvZGUgKm9wMSA9ICogKHN0cnVjdCBzcGFyY19vcGNvZGUgKiopIGI7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IG1hdGNoMCA9IG9wMC0+bWF0Y2gsIG1hdGNoMSA9IG9wMS0+bWF0Y2g7Ci0gIHVuc2lnbmVkIGxvbmcgaW50IGxvc2UwID0gb3AwLT5sb3NlLCBsb3NlMSA9IG9wMS0+bG9zZTsKLSAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7Ci0KLSAgLyogSWYgb25lIChhbmQgb25seSBvbmUpIGluc24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZSwKLSAgICAgcHJlZmVyIHRoZSBvbmUgdGhhdCBpcy4gIElmIG5laXRoZXIgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZXkncmUgYm90aCBmb3IKLSAgICAgdGhlIHNhbWUgYXJjaGl0ZWN0dXJlLCBjb250aW51ZSBwcm9jZXNzaW5nLiAgT3RoZXJ3aXNlIChib3RoIHVuc3VwcG9ydGVkCi0gICAgIGFuZCBmb3IgZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMpLCBwcmVmZXIgbG93ZXIgbnVtYmVyZWQgYXJjaCdzIChmdWRnZWQKLSAgICAgYnkgY29tcGFyaW5nIHRoZSBiaXRtYXNrcykuICAqLwotICBpZiAob3AwLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykKLSAgICB7Ci0gICAgICBpZiAoISAob3AxLT5hcmNoaXRlY3R1cmUgJiBjdXJyZW50X2FyY2hfbWFzaykpCi0JcmV0dXJuIC0xOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIGlmIChvcDEtPmFyY2hpdGVjdHVyZSAmIGN1cnJlbnRfYXJjaF9tYXNrKQotCXJldHVybiAxOwotICAgICAgZWxzZSBpZiAob3AwLT5hcmNoaXRlY3R1cmUgIT0gb3AxLT5hcmNoaXRlY3R1cmUpCi0JcmV0dXJuIG9wMC0+YXJjaGl0ZWN0dXJlIC0gb3AxLT5hcmNoaXRlY3R1cmU7Ci0gICAgfQotCi0gIC8qIElmIGEgYml0IGlzIHNldCBpbiBib3RoIG1hdGNoIGFuZCBsb3NlLCB0aGVyZSBpcyBzb21ldGhpbmcKLSAgICAgd3Jvbmcgd2l0aCB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLSAgaWYgKG1hdGNoMCAmIGxvc2UwKQotICAgIHsKLSAgICAgIGZwcmludGYKLQkoc3RkZXJyLAotCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSBfKCJJbnRlcm5hbCBlcnJvcjogIGJhZCBzcGFyYy1vcGNvZGUuaDogXCIlc1wiLCAlIy44bHgsICUjLjhseFxuIiksCi0JIG9wMC0+bmFtZSwgbWF0Y2gwLCBsb3NlMCk7Ci0gICAgICBvcDAtPmxvc2UgJj0gfm9wMC0+bWF0Y2g7Ci0gICAgICBsb3NlMCA9IG9wMC0+bG9zZTsKLSAgICB9Ci0KLSAgaWYgKG1hdGNoMSAmIGxvc2UxKQotICAgIHsKLSAgICAgIGZwcmludGYKLQkoc3RkZXJyLAotCSAvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCSBfKCJJbnRlcm5hbCBlcnJvcjogYmFkIHNwYXJjLW9wY29kZS5oOiBcIiVzXCIsICUjLjhseCwgJSMuOGx4XG4iKSwKLQkgb3AxLT5uYW1lLCBtYXRjaDEsIGxvc2UxKTsKLSAgICAgIG9wMS0+bG9zZSAmPSB+b3AxLT5tYXRjaDsKLSAgICAgIGxvc2UxID0gb3AxLT5sb3NlOwotICAgIH0KLQotICAvKiBCZWNhdXNlIHRoZSBiaXRzIHRoYXQgYXJlIHZhcmlhYmxlIGluIG9uZSBvcGNvZGUgYXJlIGNvbnN0YW50IGluCi0gICAgIGFub3RoZXIsIGl0IGlzIGltcG9ydGFudCB0byBvcmRlciB0aGUgb3Bjb2RlcyBpbiB0aGUgcmlnaHQgb3JkZXIuICAqLwotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCB4ID0gMSA8PCBpOwotICAgICAgaW50IHgwID0gKG1hdGNoMCAmIHgpICE9IDA7Ci0gICAgICBpbnQgeDEgPSAobWF0Y2gxICYgeCkgIT0gMDsKLQotICAgICAgaWYgKHgwICE9IHgxKQotCXJldHVybiB4MSAtIHgwOwotICAgIH0KLQotICBmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGludCB4ID0gMSA8PCBpOwotICAgICAgaW50IHgwID0gKGxvc2UwICYgeCkgIT0gMDsKLSAgICAgIGludCB4MSA9IChsb3NlMSAmIHgpICE9IDA7Ci0KLSAgICAgIGlmICh4MCAhPSB4MSkKLQlyZXR1cm4geDEgLSB4MDsKLSAgICB9Ci0KLSAgLyogVGhleSBhcmUgZnVuY3Rpb25hbGx5IGVxdWFsLiAgU28gYXMgbG9uZyBhcyB0aGUgb3Bjb2RlIHRhYmxlIGlzCi0gICAgIHZhbGlkLCB3ZSBjYW4gcHV0IHdoaWNoZXZlciBvbmUgZmlyc3Qgd2Ugd2FudCwgb24gYWVzdGhldGljIGdyb3VuZHMuICAqLwotCi0gIC8qIE91ciBmaXJzdCBhZXN0aGV0aWMgZ3JvdW5kIGlzIHRoYXQgYWxpYXNlcyBkZWZlciB0byByZWFsIGluc25zLiAgKi8KLSAgewotICAgIGludCBhbGlhc19kaWZmID0gKG9wMC0+ZmxhZ3MgJiBGX0FMSUFTKSAtIChvcDEtPmZsYWdzICYgRl9BTElBUyk7Ci0gICAgaWYgKGFsaWFzX2RpZmYgIT0gMCkKLSAgICAgIC8qIFB1dCB0aGUgb25lIHRoYXQgaXNuJ3QgYW4gYWxpYXMgZmlyc3QuICAqLwotICAgICAgcmV0dXJuIGFsaWFzX2RpZmY7Ci0gIH0KLQotICAvKiBFeGNlcHQgZm9yIGFsaWFzZXMsIHR3byAiaWRlbnRpY2FsIiBpbnN0cnVjdGlvbnMgaGFkCi0gICAgIGJldHRlciBoYXZlIHRoZSBzYW1lIG9wY29kZS4gIFRoaXMgaXMgYSBzYW5pdHkgY2hlY2sgb24gdGhlIHRhYmxlLiAgKi8KLSAgaSA9IHN0cmNtcCAob3AwLT5uYW1lLCBvcDEtPm5hbWUpOwotICBpZiAoaSkKLSAgICB7Ci0gICAgICBpZiAob3AwLT5mbGFncyAmIEZfQUxJQVMpIC8qIElmIHRoZXkncmUgYm90aCBhbGlhc2VzLCBiZSBhcmJpdHJhcnkuICovCi0JcmV0dXJuIGk7Ci0gICAgICBlbHNlCi0JZnByaW50ZiAoc3RkZXJyLAotCQkgLyogeGdldHRleHQ6Yy1mb3JtYXQgKi8KLQkJIF8oIkludGVybmFsIGVycm9yOiBiYWQgc3BhcmMtb3Bjb2RlLmg6IFwiJXNcIiA9PSBcIiVzXCJcbiIpLAotCQkgb3AwLT5uYW1lLCBvcDEtPm5hbWUpOwotICAgIH0KLQotICAvKiBGZXdlciBhcmd1bWVudHMgYXJlIHByZWZlcnJlZC4gICovCi0gIHsKLSAgICBpbnQgbGVuZ3RoX2RpZmYgPSBzdHJsZW4gKG9wMC0+YXJncykgLSBzdHJsZW4gKG9wMS0+YXJncyk7Ci0gICAgaWYgKGxlbmd0aF9kaWZmICE9IDApCi0gICAgICAvKiBQdXQgdGhlIG9uZSB3aXRoIGZld2VyIGFyZ3VtZW50cyBmaXJzdC4gICovCi0gICAgICByZXR1cm4gbGVuZ3RoX2RpZmY7Ci0gIH0KLQotICAvKiBQdXQgMStpIGJlZm9yZSBpKzEuICAqLwotICB7Ci0gICAgY2hhciAqcDAgPSAoY2hhciAqKSBzdHJjaHIgKG9wMC0+YXJncywgJysnKTsKLSAgICBjaGFyICpwMSA9IChjaGFyICopIHN0cmNociAob3AxLT5hcmdzLCAnKycpOwotCi0gICAgaWYgKHAwICYmIHAxKQotICAgICAgewotCS8qIFRoZXJlIGlzIGEgcGx1cyBpbiBib3RoIG9wZXJhbmRzLiAgTm90ZSB0aGF0IGEgcGx1cwotCSAgIHNpZ24gY2Fubm90IGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gYXJncywKLQkgICBzbyB0aGUgZm9sbG93aW5nIFstMV0ncyBhcmUgdmFsaWQuICAqLwotCWlmIChwMFstMV0gPT0gJ2knICYmIHAxWzFdID09ICdpJykKLQkgIC8qIG9wMCBpcyBpKzEgYW5kIG9wMSBpcyAxK2ksIHNvIG9wMSBnb2VzIGZpcnN0LiAgKi8KLQkgIHJldHVybiAxOwotCWlmIChwMFsxXSA9PSAnaScgJiYgcDFbLTFdID09ICdpJykKLQkgIC8qIG9wMCBpcyAxK2kgYW5kIG9wMSBpcyBpKzEsIHNvIG9wMCBnb2VzIGZpcnN0LiAgKi8KLQkgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgfQotCi0gIC8qIFB1dCAxLGkgYmVmb3JlIGksMS4gICovCi0gIHsKLSAgICBpbnQgaTAgPSBzdHJuY21wIChvcDAtPmFyZ3MsICJpLDEiLCAzKSA9PSAwOwotICAgIGludCBpMSA9IHN0cm5jbXAgKG9wMS0+YXJncywgImksMSIsIDMpID09IDA7Ci0KLSAgICBpZiAoaTAgXiBpMSkKLSAgICAgIHJldHVybiBpMCAtIGkxOwotICB9Ci0KLSAgLyogVGhleSBhcmUsIGFzIGZhciBhcyB3ZSBjYW4gdGVsbCwgaWRlbnRpY2FsLgotICAgICBTaW5jZSBxc29ydCBtYXkgaGF2ZSByZWFycmFuZ2VkIHRoZSB0YWJsZSBwYXJ0aWFsbHksIHRoZXJlIGlzCi0gICAgIG5vIHdheSB0byB0ZWxsIHdoaWNoIG9uZSB3YXMgZmlyc3QgaW4gdGhlIG9wY29kZSB0YWJsZSBhcwotICAgICB3cml0dGVuLCBzbyBqdXN0IHNheSB0aGVyZSBhcmUgZXF1YWwuICAqLwotICAvKiA/Pz8gVGhpcyBpcyBubyBsb25nZXIgdHJ1ZSBub3cgdGhhdCB3ZSBzb3J0IGEgdmVjdG9yIG9mIHBvaW50ZXJzLAotICAgICBub3QgdGhlIHRhYmxlIGl0c2VsZi4gICovCi0gIHJldHVybiAwOwotfQotCi0vKiBCdWlsZCBhIGhhc2ggdGFibGUgZnJvbSB0aGUgb3Bjb2RlIHRhYmxlLgotICAgT1BDT0RFX1RBQkxFIGlzIGEgc29ydGVkIGxpc3Qgb2YgcG9pbnRlcnMgaW50byB0aGUgb3Bjb2RlIHRhYmxlLiAgKi8KLQotc3RhdGljIHZvaWQKLWJ1aWxkX2hhc2hfdGFibGUgKG9wY29kZV90YWJsZSwgaGFzaF90YWJsZSwgbnVtX29wY29kZXMpCi0gICAgIGNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgKipvcGNvZGVfdGFibGU7Ci0gICAgIHN0cnVjdCBvcGNvZGVfaGFzaCAqKmhhc2hfdGFibGU7Ci0gICAgIGludCBudW1fb3Bjb2RlczsKLXsKLSAgcmVnaXN0ZXIgaW50IGk7Ci0gIGludCBoYXNoX2NvdW50W0hBU0hfU0laRV07Ci0gIHN0YXRpYyBzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKmhhc2hfYnVmID0gTlVMTDsKLQotICAvKiBTdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSBhbmQgd29yayBiYWNrd2FyZHMgc28gdGhhdCBlYWNoCi0gICAgIGNoYWluIGlzIHNvcnRlZC4gICovCi0KLSAgbWVtc2V0IChoYXNoX3RhYmxlLCAwLCBIQVNIX1NJWkUgKiBzaXplb2YgKGhhc2hfdGFibGVbMF0pKTsKLSAgbWVtc2V0IChoYXNoX2NvdW50LCAwLCBIQVNIX1NJWkUgKiBzaXplb2YgKGhhc2hfY291bnRbMF0pKTsKLSAgaWYgKGhhc2hfYnVmICE9IE5VTEwpCi0gICAgZnJlZSAoaGFzaF9idWYpOwotICBoYXNoX2J1ZiA9IChzdHJ1Y3Qgb3Bjb2RlX2hhc2ggKikgeG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3Bjb2RlX2hhc2gpICogbnVtX29wY29kZXMpOwotICBmb3IgKGkgPSBudW1fb3Bjb2RlcyAtIDE7IGkgPj0gMDsgLS1pKQotICAgIHsKLSAgICAgIHJlZ2lzdGVyIGludCBoYXNoID0gSEFTSF9JTlNOIChvcGNvZGVfdGFibGVbaV0tPm1hdGNoKTsKLSAgICAgIHJlZ2lzdGVyIHN0cnVjdCBvcGNvZGVfaGFzaCAqaCA9ICZoYXNoX2J1ZltpXTsKLSAgICAgIGgtPm5leHQgPSBoYXNoX3RhYmxlW2hhc2hdOwotICAgICAgaC0+b3Bjb2RlID0gb3Bjb2RlX3RhYmxlW2ldOwotICAgICAgaGFzaF90YWJsZVtoYXNoXSA9IGg7Ci0gICAgICArK2hhc2hfY291bnRbaGFzaF07Ci0gICAgfQotCi0jaWYgMCAvKiBmb3IgZGVidWdnaW5nICovCi0gIHsKLSAgICBpbnQgbWluX2NvdW50ID0gbnVtX29wY29kZXMsIG1heF9jb3VudCA9IDA7Ci0gICAgaW50IHRvdGFsOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgKytpKQotICAgICAgewotICAgICAgICBpZiAoaGFzaF9jb3VudFtpXSA8IG1pbl9jb3VudCkKLQkgIG1pbl9jb3VudCA9IGhhc2hfY291bnRbaV07Ci0JaWYgKGhhc2hfY291bnRbaV0gPiBtYXhfY291bnQpCi0JICBtYXhfY291bnQgPSBoYXNoX2NvdW50W2ldOwotCXRvdGFsICs9IGhhc2hfY291bnRbaV07Ci0gICAgICB9Ci0KLSAgICBwcmludGYgKCJPcGNvZGUgaGFzaCB0YWJsZSBzdGF0czogbWluICVkLCBtYXggJWQsIGF2ZSAlZlxuIiwKLQkgICAgbWluX2NvdW50LCBtYXhfY291bnQsIChkb3VibGUpIHRvdGFsIC8gSEFTSF9TSVpFKTsKLSAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3NwYXJjLW9wYy5jIGIvb3Bjb2Rlcy9zcGFyYy1vcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkOWQxOC4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3NwYXJjLW9wYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAzMCArMCwwIEBACi0vKiBUYWJsZSBvZiBvcGNvZGVzIGZvciB0aGUgc3BhcmMuCi0gICBDb3B5cmlnaHQgKEMpIDE5ODksIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgMTk5OQotICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBCRkQgbGlicmFyeS4KLQotQkZEIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKLXRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgotdmVyc2lvbi4KLQotQkZEIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQotV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLUZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1mb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHNvZnR3YXJlOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgkqLwotCi0vKiBGSVhNRS1zb21lZGF5OiBwZXJoYXBzIHRoZSAsYSdzIGFuZCBzdWNoIHNob3VsZCBiZSBlbWJlZGRlZCBpbiB0aGUKLSAgIGluc3RydWN0aW9uJ3MgbmFtZSByYXRoZXIgdGhhbiB0aGUgYXJncy4gIFRoaXMgd291bGQgbWFrZSBnYXMgZmFzdGVyLCBwaW5zbgotICAgc2xvd2VyLCBidXQgd291bGQgbWVzcyB1cCBzb21lIG1hY3JvcyBhIGJpdC4gIHhveG9yaWNoLiAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS9zcGFyYy5oIgotCi0vKiBTb21lIGRlZmluZXMgdG8gbWFrZSBsaWZlIGVhc3kuICAqLwotI2RlZmluZSBNQVNLX1Y2CQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WNikKLSNkZWZpbmUgTUFTS19WNwkJU1BBUkNfT1BDT0RFX0FSQ0hfTUFTSyAoU1BBUkNfT1BDT0RFX0FSQ0hfVjcpCi0jZGVmaW5lIE1BU0tfVjgJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y4KQotI2RlZmluZSBNQVNLX1NQQVJDTEVUCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1NQQVJDTEVUKQotI2RlZmluZSBNQVNLX1NQQVJDTElURQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9TUEFSQ0xJVEUpCi0jZGVmaW5lIE1BU0tfVjkJCVNQQVJDX09QQ09ERV9BUkNIX01BU0sgKFNQQVJDX09QQ09ERV9BUkNIX1Y5KQotI2RlZmluZSBNQVNLX1Y5QQlTUEFSQ19PUENPREVfQVJDSF9NQVNLIChTUEFSQ19PUENPREVfQVJDSF9WOUEpCi0KLS8qIEJpdCBtYXNrcyBvZiBhcmNoaXRlY3R1cmVzIHN1cHBvcnRpbmcgdGhlIGluc24uICAqLwotCi0jZGVmaW5lIHY2CQkoTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCBcCi0JCQkgfCBNQVNLX1NQQVJDTElURSB8IE1BU0tfVjkgfCBNQVNLX1Y5QSkKLS8qIHY2IGluc25zIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwYXJjbGV0ICovCi0jZGVmaW5lIHY2bm90bGV0CShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggXAotCQkJIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0jZGVmaW5lIHY3CQkoTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIFwKLQkJCSB8IE1BU0tfU1BBUkNMSVRFIHwgTUFTS19WOSB8IE1BU0tfVjlBKQotLyogQWx0aG91Z2ggbm90IGFsbCBpbnNucyBhcmUgaW1wbGVtZW50ZWQgaW4gaGFyZHdhcmUsIHNwYXJjbGl0ZSBpcyBkZWZpbmVkCi0gICB0byBiZSBhIHN1cGVyc2V0IG9mIHY4LiAgVW5pbXBsZW1lbnRlZCBpbnNucyB0cmFwIGFuZCBhcmUgdGhlbiB0aGVvcmV0aWNhbGx5Ci0gICBpbXBsZW1lbnRlZCBpbiBzb2Z0d2FyZS4KLSAgIEl0J3Mgbm90IGNsZWFyIHRoYXQgdGhlIHNhbWUgaXMgdHJ1ZSBmb3Igc3BhcmNsZXQsIGFsdGhvdWdoIHRoZSBkb2NzCi0gICBzdWdnZXN0IGl0IGlzLiAgUmF0aGVyIHRoYW4gY29tcGxpY2F0aW5nIHRoaW5ncywgdGhlIHNwYXJjbGV0IGFzc2VtYmxlcgotICAgcmVjb2duaXplcyBhbGwgdjggaW5zbnMuICAqLwotI2RlZmluZSB2OAkJKE1BU0tfVjggfCBNQVNLX1NQQVJDTEVUIHwgTUFTS19TUEFSQ0xJVEUgfCBNQVNLX1Y5IHwgTUFTS19WOUEpCi0jZGVmaW5lIHNwYXJjbGV0CShNQVNLX1NQQVJDTEVUKQotI2RlZmluZSBzcGFyY2xpdGUJKE1BU0tfU1BBUkNMSVRFKQotI2RlZmluZSB2OQkJKE1BU0tfVjkgfCBNQVNLX1Y5QSkKLSNkZWZpbmUgdjlhCQkoTUFTS19WOUEpCi0vKiB2NiBpbnNucyBub3Qgc3VwcG9ydGVkIGJ5IHY5ICovCi0jZGVmaW5lIHY2bm90djkJCShNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggXAotCQkJIHwgTUFTS19TUEFSQ0xFVCB8IE1BU0tfU1BBUkNMSVRFKQotLyogdjlhIGluc3RydWN0aW9ucyB3aGljaCB3b3VsZCBhcHBlYXIgdG8gYmUgYWxpYXNlcyB0byB2OSdzIGltcGRlcCdzCi0gICBvdGhlcndpc2UgKi8KLSNkZWZpbmUgdjlub3R2OWEJKE1BU0tfVjkpCi0KLS8qIFRhYmxlIG9mIG9wY29kZSBhcmNoaXRlY3R1cmVzLgotICAgVGhlIG9yZGVyIGlzIGRlZmluZWQgaW4gb3Bjb2RlL3NwYXJjLmguICAqLwotCi1jb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggc3BhcmNfb3Bjb2RlX2FyY2hzW10gPSB7Ci0gIHsgInY2IiwgTUFTS19WNiB9LAotICB7ICJ2NyIsIE1BU0tfVjYgfCBNQVNLX1Y3IH0sCi0gIHsgInY4IiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IH0sCi0gIHsgInNwYXJjbGV0IiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19TUEFSQ0xFVCB9LAotICB7ICJzcGFyY2xpdGUiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1NQQVJDTElURSB9LAotICAvKiA/Pz8gRG9uJ3Qgc29tZSB2OCBwcml2aWxlZGdlZCBpbnNucyBjb25mbGljdCB3aXRoIHY5PyAgKi8KLSAgeyAidjkiLCBNQVNLX1Y2IHwgTUFTS19WNyB8IE1BU0tfVjggfCBNQVNLX1Y5IH0sCi0gIC8qIHY5IHdpdGggdWx0cmFzcGFyYyBhZGRpdGlvbnMgKi8KLSAgeyAidjlhIiwgTUFTS19WNiB8IE1BU0tfVjcgfCBNQVNLX1Y4IHwgTUFTS19WOSB8IE1BU0tfVjlBIH0sCi0gIHsgTlVMTCwgMCB9Ci19OwotCi0vKiBHaXZlbiBOQU1FLCByZXR1cm4gaXQncyBhcmNoaXRlY3R1cmUgZW50cnkuICAqLwotCi1lbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbAotc3BhcmNfb3Bjb2RlX2xvb2t1cF9hcmNoIChuYW1lKQotICAgICBjb25zdCBjaGFyICpuYW1lOwotewotICBjb25zdCBzdHJ1Y3Qgc3BhcmNfb3Bjb2RlX2FyY2ggKnA7Ci0KLSAgZm9yIChwID0gJnNwYXJjX29wY29kZV9hcmNoc1swXTsgcC0+bmFtZTsgKytwKQotICAgIHsKLSAgICAgIGlmIChzdHJjbXAgKG5hbWUsIHAtPm5hbWUpID09IDApCi0JcmV0dXJuIChlbnVtIHNwYXJjX29wY29kZV9hcmNoX3ZhbCkgKHAgLSAmc3BhcmNfb3Bjb2RlX2FyY2hzWzBdKTsKLSAgICB9Ci0KLSAgcmV0dXJuIFNQQVJDX09QQ09ERV9BUkNIX0JBRDsKLX0KLQwKLS8qIEJyYW5jaCBjb25kaXRpb24gZmllbGQuICAqLwotI2RlZmluZSBDT05EKHgpCQkoKCh4KSYweGYpPDwyNSkKLQotLyogdjk6IE1vdmUgKE1PVmNjIGFuZCBGTU9WY2MpIGNvbmRpdGlvbiBmaWVsZC4gICovCi0jZGVmaW5lIE1DT05EKHgsaV9vcl9mKQkoKCgoaV9vcl9mKSYxKTw8MTgpfCgoKHgpPj4xMSkmKDB4Zjw8MTQpKSkgLyogdjkgKi8KLQotLyogdjk6IE1vdmUgcmVnaXN0ZXIgKE1PVlJjYyBhbmQgRk1PVlJjYykgY29uZGl0aW9uIGZpZWxkLiAgKi8KLSNkZWZpbmUgUkNPTkQoeCkJKCgoeCkmMHg3KTw8MTApCS8qIHY5ICovCi0KLSNkZWZpbmUgQ09OREEJKENPTkQoMHg4KSkKLSNkZWZpbmUgQ09ORENDCShDT05EKDB4ZCkpCi0jZGVmaW5lIENPTkRDUwkoQ09ORCgweDUpKQotI2RlZmluZSBDT05ERQkoQ09ORCgweDEpKQotI2RlZmluZSBDT05ERwkoQ09ORCgweGEpKQotI2RlZmluZSBDT05ER0UJKENPTkQoMHhiKSkKLSNkZWZpbmUgQ09OREdVCShDT05EKDB4YykpCi0jZGVmaW5lIENPTkRMCShDT05EKDB4MykpCi0jZGVmaW5lIENPTkRMRQkoQ09ORCgweDIpKQotI2RlZmluZSBDT05ETEVVCShDT05EKDB4NCkpCi0jZGVmaW5lIENPTkROCShDT05EKDB4MCkpCi0jZGVmaW5lIENPTkRORQkoQ09ORCgweDkpKQotI2RlZmluZSBDT05ETkVHCShDT05EKDB4NikpCi0jZGVmaW5lIENPTkRQT1MJKENPTkQoMHhlKSkKLSNkZWZpbmUgQ09ORFZDCShDT05EKDB4ZikpCi0jZGVmaW5lIENPTkRWUwkoQ09ORCgweDcpKQotCi0jZGVmaW5lIENPTkROWglDT05ETkUKLSNkZWZpbmUgQ09ORFoJQ09OREUKLSNkZWZpbmUgQ09OREdFVQlDT05EQ0MKLSNkZWZpbmUgQ09ORExVCUNPTkRDUwotCi0jZGVmaW5lIEZDT05EQQkJKENPTkQoMHg4KSkKLSNkZWZpbmUgRkNPTkRFCQkoQ09ORCgweDkpKQotI2RlZmluZSBGQ09OREcJCShDT05EKDB4NikpCi0jZGVmaW5lIEZDT05ER0UJCShDT05EKDB4YikpCi0jZGVmaW5lIEZDT05ETAkJKENPTkQoMHg0KSkKLSNkZWZpbmUgRkNPTkRMRQkJKENPTkQoMHhkKSkKLSNkZWZpbmUgRkNPTkRMRwkJKENPTkQoMHgyKSkKLSNkZWZpbmUgRkNPTkROCQkoQ09ORCgweDApKQotI2RlZmluZSBGQ09ORE5FCQkoQ09ORCgweDEpKQotI2RlZmluZSBGQ09ORE8JCShDT05EKDB4ZikpCi0jZGVmaW5lIEZDT05EVQkJKENPTkQoMHg3KSkKLSNkZWZpbmUgRkNPTkRVRQkJKENPTkQoMHhhKSkKLSNkZWZpbmUgRkNPTkRVRwkJKENPTkQoMHg1KSkKLSNkZWZpbmUgRkNPTkRVR0UJKENPTkQoMHhjKSkKLSNkZWZpbmUgRkNPTkRVTAkJKENPTkQoMHgzKSkKLSNkZWZpbmUgRkNPTkRVTEUJKENPTkQoMHhlKSkKLQotI2RlZmluZSBGQ09ORE5aCUZDT05ETkUKLSNkZWZpbmUgRkNPTkRaCUZDT05ERQotCi0jZGVmaW5lIElDQyAoMCkJLyogdjkgKi8KLSNkZWZpbmUgWENDICgxPDwxMikgLyogdjkgKi8KLSNkZWZpbmUgRkNDKHgpCSgoKHgpJjB4Myk8PDExKSAvKiB2OSAqLwotI2RlZmluZSBGQkZDQyh4KQkoKCh4KSYweDMpPDwyMCkJLyogdjkgKi8KLQwKLS8qIFRoZSBvcmRlciBvZiB0aGUgb3Bjb2RlcyBpbiB0aGUgdGFibGUgaXMgc2lnbmlmaWNhbnQ6Ci0JCi0JKiBUaGUgYXNzZW1ibGVyIHJlcXVpcmVzIHRoYXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBtbmVtb25pYyBtdXN0Ci0JYmUgY29uc2VjdXRpdmUuCUlmIHRoZXkgYXJlbid0LCB0aGUgYXNzZW1ibGVyIHdpbGwgYm9tYiBhdCBydW50aW1lLgotCi0JKiBUaGUgZGlzYXNzZW1ibGVyIHNob3VsZCBub3QgY2FyZSBhYm91dCB0aGUgb3JkZXIgb2YgdGhlIG9wY29kZXMuCi0KLSovCi0KLS8qIEVudHJpZXMgZm9yIGNvbW11dGF0aXZlIGFyaXRobWV0aWMgb3BlcmF0aW9ucy4gICovCi0vKiA/Pz8gTW9yZSBlbnRyaWVzIGNhbiBtYWtlIHVzZSBvZiB0aGlzLiAgKi8KLSNkZWZpbmUgQ09NTVVURU9QKG9wY29kZSwgb3AzLCBhcmNoX21hc2spIFwKLXsgb3Bjb2RlLAlGMygyLCBvcDMsIDApLCBGMyh+Miwgfm9wMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIGFyY2hfbWFzayB9LCBcCi17IG9wY29kZSwJRjMoMiwgb3AzLCAxKSwgRjMofjIsIH5vcDMsIH4xKSwJCSIxLGksZCIsIDAsIGFyY2hfbWFzayB9LCBcCi17IG9wY29kZSwJRjMoMiwgb3AzLCAxKSwgRjMofjIsIH5vcDMsIH4xKSwJCSJpLDEsZCIsIDAsIGFyY2hfbWFzayB9Ci0KLWNvbnN0IHN0cnVjdCBzcGFyY19vcGNvZGUgc3BhcmNfb3Bjb2Rlc1tdID0gewotCi17ICJsZCIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKSwJCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgwMCwgMCksIEYzKH4zLCB+MHgwMCwgfjApfFJTMl9HMCwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgyMCwgMCksIEYzKH4zLCB+MHgyMCwgfjApLAkJIlsxKzJdLGciLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIwLCAwKSwgRjMofjMsIH4weDIwLCB+MCl8UlMyX0cwLAkiWzFdLGciLCAwLCB2NiB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDIwLCAxKSwgRjMofjMsIH4weDIwLCB+MSksCQkiWzEraV0sZyIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjAsIDEpLCBGMyh+MywgfjB4MjAsIH4xKSwJCSJbaSsxXSxnIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpfFJTMV9HMCwJIltpXSxnIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMCwgMSksIEYzKH4zLCB+MHgyMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZyIsIDAsIHY2IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZCIsCUYzKDMsIDB4MjEsIDApLCBGMyh+MywgfjB4MjEsIH4wKXxSRCh+MCksCSJbMSsyXSxGIiwgMCwgdjYgfSwKLXsgImxkIiwJRjMoMywgMHgyMSwgMCksIEYzKH4zLCB+MHgyMSwgfjApfFJTMl9HMHxSRCh+MCksIlsxXSxGIiwgMCwgdjYgfSwgLyogbGQgW3JzMSslZzBdLGQgKi8KLXsgImxkIiwJRjMoMywgMHgyMSwgMSksIEYzKH4zLCB+MHgyMSwgfjEpfFJEKH4wKSwJIlsxK2ldLEYiLCAwLCB2NiB9LAoteyAibGQiLAlGMygzLCAweDIxLCAxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjApLAkiW2krMV0sRiIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxSUzFfRzB8UkQofjApLCJbaV0sRiIsIDAsIHY2IH0sCi17ICJsZCIsCUYzKDMsIDB4MjEsIDEpLCBGMyh+MywgfjB4MjEsIH4xKXxTSU1NMTMofjApfFJEKH4wKSwiWzFdLEYiLCAwLCB2NiB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGQiLAlGMygzLCAweDMwLCAwKSwgRjMofjMsIH4weDMwLCB+MCksCQkiWzErMl0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApfFJTMl9HMCwJIlsxXSxEIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGQiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiWzEraV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpLAkJIltpKzFdLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZCIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKXxSUzFfRzAsCSJbaV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGQgW3JzMSswXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MzEsIDApLCBGMyh+MywgfjB4MzEsIH4wKSwJCSJbMSsyXSxDIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMxLCAwKSwgRjMofjMsIH4weDMxLCB+MCl8UlMyX0cwLAkiWzFdLEMiLCAwLCB2Nm5vdHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZCIsCUYzKDMsIDB4MzEsIDEpLCBGMyh+MywgfjB4MzEsIH4xKSwJCSJbMStpXSxDIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSksCQkiW2krMV0sQyIsIDAsIHY2bm90djkgfSwKLXsgImxkIiwJRjMoMywgMHgzMSwgMSksIEYzKH4zLCB+MHgzMSwgfjEpfFJTMV9HMCwJIltpXSxDIiwgMCwgdjZub3R2OSB9LAoteyAibGQiLAlGMygzLCAweDMxLCAxKSwgRjMofjMsIH4weDMxLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxDIiwgMCwgdjZub3R2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQotLyogVGhlIHY5IExEVVcgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCAnbGQnIG9wY29kZSwgaXQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZQotICAgJ2xkJyBwc2V1ZG8tb3AgaW4gdjkuICAqLwoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDApLCBGMyh+MywgfjB4MDAsIH4wKSwJCSJbMSsyXSxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXciLAlGMygzLCAweDAwLCAwKSwgRjMofjMsIH4weDAwLCB+MCl8UlMyX0cwLAkiWzFdLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZCBbcnMxKyVnMF0sZCAqLwoteyAibGR1dyIsCUYzKDMsIDB4MDAsIDEpLCBGMyh+MywgfjB4MDAsIH4xKSwJCSJbMStpXSxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSksCQkiW2krMV0sZCIsIEZfQUxJQVMsIHY5IH0sCi17ICJsZHV3IiwJRjMoMywgMHgwMCwgMSksIEYzKH4zLCB+MHgwMCwgfjEpfFJTMV9HMCwJIltpXSxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXciLAlGMygzLCAweDAwLCAxKSwgRjMofjMsIH4weDAwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgRl9BTElBUywgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkZCIsCUYzKDMsIDB4MDMsIDApLCBGMyh+MywgfjB4MDMsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDAzLCAwKSwgRjMofjMsIH4weDAzLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkZCBbcnMxKyVnMF0sZCAqLwoteyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpLAkJIlsxK2ldLGQiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgwMywgMSksIEYzKH4zLCB+MHgwMywgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MDMsIDEpLCBGMyh+MywgfjB4MDMsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSswXSxkICovCi17ICJsZGQiLAlGMygzLCAweDIzLCAwKSwgRjMofjMsIH4weDIzLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEgiLCAwLCB2NiB9LAoteyAibGRkIiwJRjMoMywgMHgyMywgMCksIEYzKH4zLCB+MHgyMywgfjApfEFTSV9SUzIofjApLAkiWzFdLEgiLCAwLCB2NiB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKSwJCSJbMStpXSxIIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKSwJCSJbaSsxXSxIIiwgMCwgdjYgfSwKLXsgImxkZCIsCUYzKDMsIDB4MjMsIDEpLCBGMyh+MywgfjB4MjMsIH4xKXxSUzFfRzAsCSJbaV0sSCIsIDAsIHY2IH0sCi17ICJsZGQiLAlGMygzLCAweDIzLCAxKSwgRjMofjMsIH4weDIzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxIIiwgMCwgdjYgfSwgLyogbGRkIFtyczErMF0sZCAqLwotCi17ICJsZGQiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEQiLCAwLCB2Nm5vdHY5IH0sCi17ICJsZGQiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZGQiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSksCQkiWzEraV0sRCIsIDAsIHY2bm90djkgfSwKLXsgImxkZCIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbaSsxXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFJTMV9HMCwJIltpXSxEIiwgMCwgdjZub3R2OSB9LAoteyAibGRkIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpfFNJTU0xMyh+MCksCSJbMV0sRCIsIDAsIHY2bm90djkgfSwgLyogbGRkIFtyczErMF0sZCAqLwotCi17ICJsZHEiLAlGMygzLCAweDIyLCAwKSwgRjMofjMsIH4weDIyLCB+MCl8QVNJKH4wKSwJIlsxKzJdLEoiLCAwLCB2OSB9LAoteyAibGRxIiwJRjMoMywgMHgyMiwgMCksIEYzKH4zLCB+MHgyMiwgfjApfEFTSV9SUzIofjApLAkiWzFdLEoiLCAwLCB2OSB9LCAvKiBsZGQgW3JzMSslZzBdLGQgKi8KLXsgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKSwJCSJbMStpXSxKIiwgMCwgdjkgfSwKLXsgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKSwJCSJbaSsxXSxKIiwgMCwgdjkgfSwKLXsgImxkcSIsCUYzKDMsIDB4MjIsIDEpLCBGMyh+MywgfjB4MjIsIH4xKXxSUzFfRzAsCSJbaV0sSiIsIDAsIHY5IH0sCi17ICJsZHEiLAlGMygzLCAweDIyLCAxKSwgRjMofjMsIH4weDIyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErMF0sZCAqLwotCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMCksIEYzKH4zLCB+MHgwOSwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkc2IiLAlGMygzLCAweDA5LCAwKSwgRjMofjMsIH4weDA5LCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2IgW3JzMSslZzBdLGQgKi8KLXsgImxkc2IiLAlGMygzLCAweDA5LCAxKSwgRjMofjMsIH4weDA5LCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGRzYiIsCUYzKDMsIDB4MDksIDEpLCBGMyh+MywgfjB4MDksIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHNiIiwJRjMoMywgMHgwOSwgMSksIEYzKH4zLCB+MHgwOSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2IgW3JzMSswXSxkICovCi0KLXsgImxkc2giLAlGMygzLCAweDBhLCAwKSwgRjMofjMsIH4weDBhLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc2ggW3JzMSslZzBdLGQgKi8KLXsgImxkc2giLAlGMygzLCAweDBhLCAwKSwgRjMofjMsIH4weDBhLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGRzaCIsCUYzKDMsIDB4MGEsIDEpLCBGMyh+MywgfjB4MGEsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHNoIiwJRjMoMywgMHgwYSwgMSksIEYzKH4zLCB+MHgwYSwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkc2giLAlGMygzLCAweDBhLCAxKSwgRjMofjMsIH4weDBhLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzaCBbcnMxKzBdLGQgKi8KLQoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMCksIEYzKH4zLCB+MHgwZCwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkc3R1YiIsCUYzKDMsIDB4MGQsIDApLCBGMyh+MywgfjB4MGQsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGRzdHViIFtyczErJWcwXSxkICovCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHN0dWIiLAlGMygzLCAweDBkLCAxKSwgRjMofjMsIH4weDBkLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2NiB9LAoteyAibGRzdHViIiwJRjMoMywgMHgwZCwgMSksIEYzKH4zLCB+MHgwZCwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkc3R1YiBbcnMxKzBdLGQgKi8KLQoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDApLCBGMyh+MywgfjB4MDgsIH4wKXxBU0kofjApLAkiWzErMl0sZCIsIDAsIHY5IH0sCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMCksIEYzKH4zLCB+MHgwOCwgfjApfEFTSV9SUzIofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHN3IFtyczErJWcwXSxkICovCi17ICJsZHN3IiwJRjMoMywgMHgwOCwgMSksIEYzKH4zLCB+MHgwOCwgfjEpLAkJIlsxK2ldLGQiLCAwLCB2OSB9LAoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKSwJCSJbaSsxXSxkIiwgMCwgdjkgfSwKLXsgImxkc3ciLAlGMygzLCAweDA4LCAxKSwgRjMofjMsIH4weDA4LCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2OSB9LAoteyAibGRzdyIsCUYzKDMsIDB4MDgsIDEpLCBGMyh+MywgfjB4MDgsIH4xKXxTSU1NMTMofjApLAkiWzFdLGQiLCAwLCB2OSB9LCAvKiBsZHN3IFtyczErMF0sZCAqLwotCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMCksIEYzKH4zLCB+MHgwMSwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjYgfSwKLXsgImxkdWIiLAlGMygzLCAweDAxLCAwKSwgRjMofjMsIH4weDAxLCB+MCl8QVNJX1JTMih+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWIgW3JzMSslZzBdLGQgKi8KLXsgImxkdWIiLAlGMygzLCAweDAxLCAxKSwgRjMofjMsIH4weDAxLCB+MSksCQkiWzEraV0sZCIsIDAsIHY2IH0sCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpLAkJIltpKzFdLGQiLCAwLCB2NiB9LAoteyAibGR1YiIsCUYzKDMsIDB4MDEsIDEpLCBGMyh+MywgfjB4MDEsIH4xKXxSUzFfRzAsCSJbaV0sZCIsIDAsIHY2IH0sCi17ICJsZHViIiwJRjMoMywgMHgwMSwgMSksIEYzKH4zLCB+MHgwMSwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY2IH0sIC8qIGxkdWIgW3JzMSswXSxkICovCi0KLXsgImxkdWgiLAlGMygzLCAweDAyLCAwKSwgRjMofjMsIH4weDAyLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NiB9LAoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDApLCBGMyh+MywgfjB4MDIsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1aCBbcnMxKyVnMF0sZCAqLwoteyAibGR1aCIsCUYzKDMsIDB4MDIsIDEpLCBGMyh+MywgfjB4MDIsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjYgfSwKLXsgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSksCQkiW2krMV0sZCIsIDAsIHY2IH0sCi17ICJsZHVoIiwJRjMoMywgMHgwMiwgMSksIEYzKH4zLCB+MHgwMiwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjYgfSwKLXsgImxkdWgiLAlGMygzLCAweDAyLCAxKSwgRjMofjMsIH4weDAyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjYgfSwgLyogbGR1aCBbcnMxKzBdLGQgKi8KLQoteyAibGR4IiwJRjMoMywgMHgwYiwgMCksIEYzKH4zLCB+MHgwYiwgfjApfEFTSSh+MCksCSJbMSsyXSxkIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MGIsIDApLCBGMyh+MywgfjB4MGIsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjkgfSwgLyogbGR4IFtyczErJWcwXSxkICovCi17ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSksCQkiWzEraV0sZCIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSksCQkiW2krMV0sZCIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDBiLCAxKSwgRjMofjMsIH4weDBiLCB+MSl8UlMxX0cwLAkiW2ldLGQiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgwYiwgMSksIEYzKH4zLCB+MHgwYiwgfjEpfFNJTU0xMyh+MCksCSJbMV0sZCIsIDAsIHY5IH0sIC8qIGxkeCBbcnMxKzBdLGQgKi8KLQoteyAibGR4IiwJRjMoMywgMHgyMSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjApfFJEKH4xKSwJIlsxKzJdLEYiLCAwLCB2OSB9LAoteyAibGR4IiwJRjMoMywgMHgyMSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyMSwgfjApfFJTMl9HMHxSRCh+MSksCSJbMV0sRiIsIDAsIHY5IH0sIC8qIGxkIFtyczErJWcwXSxkICovCi17ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjEpLAkiWzEraV0sRiIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UkQofjEpLAkiW2krMV0sRiIsIDAsIHY5IH0sCi17ICJsZHgiLAlGMygzLCAweDIxLCAxKXxSRCgxKSwgRjMofjMsIH4weDIxLCB+MSl8UlMxX0cwfFJEKH4xKSwJIltpXSxGIiwgMCwgdjkgfSwKLXsgImxkeCIsCUYzKDMsIDB4MjEsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjEsIH4xKXxTSU1NMTMofjApfFJEKH4xKSwiWzFdLEYiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkYSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkYSIsCUYzKDMsIDB4MTAsIDEpLCBGMyh+MywgfjB4MTAsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwoteyAibGRhIiwJRjMoMywgMHgzMCwgMCksIEYzKH4zLCB+MHgzMCwgfjApLAkJIlsxKzJdQSxnIiwgMCwgdjkgfSwKLXsgImxkYSIsCUYzKDMsIDB4MzAsIDApLCBGMyh+MywgfjB4MzAsIH4wKXxSUzJfRzAsCSJbMV1BLGciLCAwLCB2OSB9LCAvKiBsZGEgW3JzMSslZzBdLGQgKi8KLXsgImxkYSIsCUYzKDMsIDB4MzAsIDEpLCBGMyh+MywgfjB4MzAsIH4xKSwJCSJbMStpXW8sZyIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSksCQkiW2krMV1vLGciLCAwLCB2OSB9LAoteyAibGRhIiwJRjMoMywgMHgzMCwgMSksIEYzKH4zLCB+MHgzMCwgfjEpfFJTMV9HMCwJIltpXW8sZyIsIDAsIHY5IH0sCi17ICJsZGEiLAlGMygzLCAweDMwLCAxKSwgRjMofjMsIH4weDMwLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZyIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMCksIEYzKH4zLCB+MHgxMywgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkZGEiLAlGMygzLCAweDEzLCAwKSwgRjMofjMsIH4weDEzLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRkYSIsCUYzKDMsIDB4MTMsIDEpLCBGMyh+MywgfjB4MTMsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgxMywgMSksIEYzKH4zLCB+MHgxMywgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDEzLCAxKSwgRjMofjMsIH4weDEzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMCksIEYzKH4zLCB+MHgzMywgfjApLAkJIlsxKzJdQSxIIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDMzLCAwKSwgRjMofjMsIH4weDMzLCB+MCl8UlMyX0cwLAkiWzFdQSxIIiwgMCwgdjkgfSwgLyogbGRkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRkYSIsCUYzKDMsIDB4MzMsIDEpLCBGMyh+MywgfjB4MzMsIH4xKSwJCSJbMStpXW8sSCIsIDAsIHY5IH0sCi17ICJsZGRhIiwJRjMoMywgMHgzMywgMSksIEYzKH4zLCB+MHgzMywgfjEpLAkJIltpKzFdbyxIIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8UlMxX0cwLAkiW2ldbyxIIiwgMCwgdjkgfSwKLXsgImxkZGEiLAlGMygzLCAweDMzLCAxKSwgRjMofjMsIH4weDMzLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sSCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMCksIEYzKH4zLCB+MHgzMiwgfjApLAkJIlsxKzJdQSxKIiwgMCwgdjkgfSwKLXsgImxkcWEiLAlGMygzLCAweDMyLCAwKSwgRjMofjMsIH4weDMyLCB+MCl8UlMyX0cwLAkiWzFdQSxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErJWcwXSxkICovCi17ICJsZHFhIiwJRjMoMywgMHgzMiwgMSksIEYzKH4zLCB+MHgzMiwgfjEpLAkJIlsxK2ldbyxKIiwgMCwgdjkgfSwKLXsgImxkcWEiLAlGMygzLCAweDMyLCAxKSwgRjMofjMsIH4weDMyLCB+MSksCQkiW2krMV1vLEoiLCAwLCB2OSB9LAoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKXxSUzFfRzAsCSJbaV1vLEoiLCAwLCB2OSB9LAoteyAibGRxYSIsCUYzKDMsIDB4MzIsIDEpLCBGMyh+MywgfjB4MzIsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxKIiwgMCwgdjkgfSwgLyogbGRkIFtyczErMF0sZCAqLwotCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDApLCBGMyh+MywgfjB4MTksIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY2IH0sCi17ICJsZHNiYSIsCUYzKDMsIDB4MTksIDApLCBGMyh+MywgfjB4MTksIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHNiYSBbcnMxKyVnMF0sZCAqLwoteyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRzYmEiLAlGMygzLCAweDE5LCAxKSwgRjMofjMsIH4weDE5LCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc2JhIiwJRjMoMywgMHgxOSwgMSksIEYzKH4zLCB+MHgxOSwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGRzaGEiLAlGMygzLCAweDFhLCAwKSwgRjMofjMsIH4weDFhLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRzaGEiLAlGMygzLCAweDFhLCAwKSwgRjMofjMsIH4weDFhLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGRzaGEgW3JzMSslZzBdLGQgKi8KLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkc2hhIiwJRjMoMywgMHgxYSwgMSksIEYzKH4zLCB+MHgxYSwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHNoYSIsCUYzKDMsIDB4MWEsIDEpLCBGMyh+MywgfjB4MWEsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAwKSwgRjMofjMsIH4weDFkLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDApLCBGMyh+MywgfjB4MWQsIH4wKXxSUzJfRzAsCSJbMV1BLGQiLCAwLCB2NiB9LCAvKiBsZHN0dWJhIFtyczErJWcwXSxkICovCi17ICJsZHN0dWJhIiwJRjMoMywgMHgxZCwgMSksIEYzKH4zLCB+MHgxZCwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc3R1YmEiLAlGMygzLCAweDFkLCAxKSwgRjMofjMsIH4weDFkLCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGRzdHViYSIsCUYzKDMsIDB4MWQsIDEpLCBGMyh+MywgfjB4MWQsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMCksIEYzKH4zLCB+MHgxOCwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjkgfSwKLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMCksIEYzKH4zLCB+MHgxOCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSksCQkiWzEraV1vLGQiLCAwLCB2OSB9LAoteyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSksCQkiW2krMV1vLGQiLCAwLCB2OSB9LAoteyAibGRzd2EiLAlGMygzLCAweDE4LCAxKSwgRjMofjMsIH4weDE4LCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkc3dhIiwJRjMoMywgMHgxOCwgMSksIEYzKH4zLCB+MHgxOCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCAwLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGR1YmEiLAlGMygzLCAweDExLCAwKSwgRjMofjMsIH4weDExLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NiB9LAoteyAibGR1YmEiLAlGMygzLCAweDExLCAwKSwgRjMofjMsIH4weDExLCB+MCl8UlMyX0cwLAkiWzFdQSxkIiwgMCwgdjYgfSwgLyogbGR1YmEgW3JzMSslZzBdLGQgKi8KLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpLAkJIlsxK2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkdWJhIiwJRjMoMywgMHgxMSwgMSksIEYzKH4zLCB+MHgxMSwgfjEpfFJTMV9HMCwJIltpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHViYSIsCUYzKDMsIDB4MTEsIDEpLCBGMyh+MywgfjB4MTEsIH4xKXxTSU1NMTMofjApLAkiWzFdbyxkIiwgMCwgdjkgfSwgLyogbGQgW3JzMSswXSxkICovCi0KLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMCksIEYzKH4zLCB+MHgxMiwgfjApLAkJIlsxKzJdQSxkIiwgMCwgdjYgfSwKLXsgImxkdWhhIiwJRjMoMywgMHgxMiwgMCksIEYzKH4zLCB+MHgxMiwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY2IH0sIC8qIGxkdWhhIFtyczErJWcwXSxkICovCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJsZHVoYSIsCUYzKDMsIDB4MTIsIDEpLCBGMyh+MywgfjB4MTIsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAibGR1aGEiLAlGMygzLCAweDEyLCAxKSwgRjMofjMsIH4weDEyLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJsZHV3YSIsCUYzKDMsIDB4MTAsIDApLCBGMyh+MywgfjB4MTAsIH4wKSwJCSJbMSsyXUEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkdXdhID09PSBsZGEgKi8KLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMCksIEYzKH4zLCB+MHgxMCwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiWzEraV1vLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSksCQkiW2krMV1vLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAibGR1d2EiLAlGMygzLCAweDEwLCAxKSwgRjMofjMsIH4weDEwLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgRl9BTElBUywgdjkgfSwKLXsgImxkdXdhIiwJRjMoMywgMHgxMCwgMSksIEYzKH4zLCB+MHgxMCwgfjEpfFNJTU0xMyh+MCksCSJbMV1vLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBsZCBbcnMxKzBdLGQgKi8KLQoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDApLCBGMyh+MywgfjB4MWIsIH4wKSwJCSJbMSsyXUEsZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMCksIEYzKH4zLCB+MHgxYiwgfjApfFJTMl9HMCwJIlsxXUEsZCIsIDAsIHY5IH0sIC8qIGxkYSBbcnMxKyVnMF0sZCAqLwoteyAibGR4YSIsCUYzKDMsIDB4MWIsIDEpLCBGMyh+MywgfjB4MWIsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJsZHhhIiwJRjMoMywgMHgxYiwgMSksIEYzKH4zLCB+MHgxYiwgfjEpLAkJIltpKzFdbyxkIiwgMCwgdjkgfSwKLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSl8UlMxX0cwLAkiW2ldbyxkIiwgMCwgdjkgfSwKLXsgImxkeGEiLAlGMygzLCAweDFiLCAxKSwgRjMofjMsIH4weDFiLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIGxkIFtyczErMF0sZCAqLwotCi17ICJzdCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCQkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkJImQsWzEraV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkJImQsW2krMV0iLCAwLCB2NiB9LAoteyAic3QiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkJImQsW2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCQkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0IiwJRjMoMywgMHgyNCwgMCksIEYzKH4zLCB+MHgyNCwgfjApfEFTSSh+MCksCQkiZyxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDApLCBGMyh+MywgfjB4MjQsIH4wKXxBU0lfUlMyKH4wKSwJCSJnLFsxXSIsIDAsIHY2IH0sIC8qIHN0IGRbcnMxKyVnMF0gKi8KLXsgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpLAkJCSJnLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpLAkJCSJnLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNCwgMSksIEYzKH4zLCB+MHgyNCwgfjEpfFJTMV9HMCwJCSJnLFtpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjQsIDEpLCBGMyh+MywgfjB4MjQsIH4xKXxTSU1NMTMofjApLAkJImcsWzFdIiwgMCwgdjYgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0IiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApfEFTSSh+MCksCQkiRCxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApfEFTSV9SUzIofjApLAkJIkQsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkJIkQsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdCIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKSwJCQkiRCxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFJTMV9HMCwJCSJELFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFNJTU0xMyh+MCksCQkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwoteyAic3QiLAlGMygzLCAweDM1LCAwKSwgRjMofjMsIH4weDM1LCB+MCl8QVNJKH4wKSwJCSJDLFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM1LCAwKSwgRjMofjMsIH4weDM1LCB+MCl8QVNJX1JTMih+MCksCQkiQyxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdCIsCUYzKDMsIDB4MzUsIDEpLCBGMyh+MywgfjB4MzUsIH4xKSwJCQkiQyxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0IiwJRjMoMywgMHgzNSwgMSksIEYzKH4zLCB+MHgzNSwgfjEpLAkJCSJDLFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSl8UlMxX0cwLAkJIkMsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3QiLAlGMygzLCAweDM1LCAxKSwgRjMofjMsIH4weDM1LCB+MSl8U0lNTTEzKH4wKSwJCSJDLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3QgZCxbcnMxKzBdICovCi0KLXsgInN0IiwJRjMoMywgMHgyNSwgMCksIEYzKH4zLCB+MHgyNSwgfjApfFJEX0cwfEFTSSh+MCksCSJGLFsxKzJdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNSwgMCksIEYzKH4zLCB+MHgyNSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiRixbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErJWcwXSAqLwoteyAic3QiLAlGMygzLCAweDI1LCAxKSwgRjMofjMsIH4weDI1LCB+MSl8UkRfRzAsCQkiRixbMStpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMCwJCSJGLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0IiwJRjMoMywgMHgyNSwgMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJGLFtpXSIsIDAsIHY2IH0sCi17ICJzdCIsCUYzKDMsIDB4MjUsIDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiRixbMV0iLCAwLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3R3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3ciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSslZzBdICovCi17ICJzdHN3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKSwJCSJkLFtpKzFdIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3ciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzdyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0dXciLAlGMygzLCAweDA0LCAwKSwgRjMofjMsIH4weDA0LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInN0dXciLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1dyIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3IiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDApLCBGMyh+MywgfjB4MDQsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgZCxbcnMxKyVnMF0gKi8KLXsgInNwaWxsIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpLAkJImQsWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGwiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbCIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3RhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgMCwgdjYgfSwKLXsgInN0YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgMCwgdjYgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdGEiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3RhIiwJRjMoMywgMHgzNCwgMCksIEYzKH4zLCB+MHgzNCwgfjApLAkJImcsWzErMl1BIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MzQsIDApLCBGMyh+MywgfjB4MzQsIH4wKXxSUzIofjApLAkiZyxbMV1BIiwgMCwgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdGEiLAlGMygzLCAweDM0LCAxKSwgRjMofjMsIH4weDM0LCB+MSksCQkiZyxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpLAkJImcsW2krMV1vIiwgMCwgdjkgfSwKLXsgInN0YSIsCUYzKDMsIDB4MzQsIDEpLCBGMyh+MywgfjB4MzQsIH4xKXxSUzFfRzAsCSJnLFtpXW8iLCAwLCB2OSB9LAoteyAic3RhIiwJRjMoMywgMHgzNCwgMSksIEYzKH4zLCB+MHgzNCwgfjEpfFNJTU0xMyh+MCksCSJnLFsxXW8iLCAwLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLQoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHdhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdCBkLFtyczErMF0gKi8KLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMCksIEYzKH4zLCB+MHgxNCwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c3dhIiwJRjMoMywgMHgxNCwgMSksIEYzKH4zLCB+MHgxNCwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHN3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3QgZCxbcnMxKzBdICovCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDApLCBGMyh+MywgfjB4MTQsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjkgfSwgLyogc3RhIGQsW3JzMSslZzBdICovCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFsxK2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKSwJCSJkLFtpKzFdbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHV3YSIsCUYzKDMsIDB4MTQsIDEpLCBGMyh+MywgfjB4MTQsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1d2EiLAlGMygzLCAweDE0LCAxKSwgRjMofjMsIH4weDE0LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdbyIsIEZfQUxJQVMsIHY5IH0sIC8qIHN0IGQsW3JzMSswXSAqLwotCi17ICJzdGIiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3RiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGIgZCxbcnMxKyVnMF0gKi8KLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdGIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2IiLAlGMygzLCAweDA1LCAwKSwgRjMofjMsIH4weDA1LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiBkLFtyczErJWcwXSAqLwoteyAic3RzYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2IiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2IiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RiIGQsW3JzMSswXSAqLwoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMCksIEYzKH4zLCB+MHgwNSwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGIgZCxbcnMxKyVnMF0gKi8KLXsgInN0dWIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1YiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiBkLFtyczErMF0gKi8KLQoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMCksIEYzKH4zLCB+MHgxNSwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGJhIGQsW3JzMSslZzBdICovCi17ICJzdGJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RiYSIsCUYzKDMsIDB4MTUsIDEpLCBGMyh+MywgfjB4MTUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3RiIGQsW3JzMSswXSAqLwotCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNiYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjYgfSwgLyogc3RiYSBkLFtyczErJWcwXSAqLwoteyAic3RzYmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzYmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3RzYmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2JhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKSwJCSJkLFsxKzJdQSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHViYSIsCUYzKDMsIDB4MTUsIDApLCBGMyh+MywgfjB4MTUsIH4wKXxSUzIofjApLAkiZCxbMV1BIiwgRl9BTElBUywgdjYgfSwgLyogc3RiYSBkLFtyczErJWcwXSAqLwoteyAic3R1YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1YmEiLAlGMygzLCAweDE1LCAxKSwgRjMofjMsIH4weDE1LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWJhIiwJRjMoMywgMHgxNSwgMSksIEYzKH4zLCB+MHgxNSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGIgZCxbcnMxKzBdICovCi0KLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+MywgfjB4MDcsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDA3LCAwKSwgRjMofjMsIH4weDA3LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY2IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpLAkJImQsWzEraV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpLAkJImQsW2krMV0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MDcsIDEpLCBGMyh+MywgfjB4MDcsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi0KLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0kofjApLAkicSxbMSsyXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0lfUlMyKH4wKSwJInEsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJxLFsxK2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgyNiwgMSksIEYzKH4zLCB+MHgyNiwgfjEpLAkJInEsW2krMV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8UlMxX0cwLAkicSxbaV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8U0lNTTEzKH4wKSwJInEsWzFdIiwgMCwgdjZub3R2OSB9LCAvKiBzdGQgZCxbcnMxKzBdICovCi17ICJzdGQiLAlGMygzLCAweDI3LCAwKSwgRjMofjMsIH4weDI3LCB+MCl8QVNJKH4wKSwJIkgsWzErMl0iLCAwLCB2NiB9LAoteyAic3RkIiwJRjMoMywgMHgyNywgMCksIEYzKH4zLCB+MHgyNywgfjApfEFTSV9SUzIofjApLAkiSCxbMV0iLCAwLCB2NiB9LCAvKiBzdGQgZCxbcnMxKyVnMF0gKi8KLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDEpLCBGMyh+MywgfjB4MjcsIH4xKSwJCSJILFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDEpLCBGMyh+MywgfjB4MjcsIH4xKSwJCSJILFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MjcsIDEpLCBGMyh+MywgfjB4MjcsIH4xKXxSUzFfRzAsCSJILFtpXSIsIDAsIHY2IH0sCi17ICJzdGQiLAlGMygzLCAweDI3LCAxKSwgRjMofjMsIH4weDI3LCB+MSl8U0lNTTEzKH4wKSwJIkgsWzFdIiwgMCwgdjYgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGQiLAlGMygzLCAweDM2LCAwKSwgRjMofjMsIH4weDM2LCB+MCl8QVNJKH4wKSwJIlEsWzErMl0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM2LCAwKSwgRjMofjMsIH4weDM2LCB+MCl8QVNJX1JTMih+MCksCSJRLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzdGQiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiUSxbMStpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKSwJCSJRLFtpKzFdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpfFJTMV9HMCwJIlEsW2ldIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpfFNJTU0xMyh+MCksCSJRLFsxXSIsIDAsIHY2bm90djkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwoteyAic3RkIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApfEFTSSh+MCksCSJELFsxKzJdIiwgMCwgdjZub3R2OSB9LAoteyAic3RkIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApfEFTSV9SUzIofjApLAkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErJWcwXSAqLwoteyAic3RkIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkQsWzEraV0iLCAwLCB2Nm5vdHY5IH0sCi17ICJzdGQiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiRCxbaSsxXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxSUzFfRzAsCSJELFtpXSIsIDAsIHY2bm90djkgfSwKLXsgInN0ZCIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxTSU1NMTMofjApLAkiRCxbMV0iLCAwLCB2Nm5vdHY5IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMCksIEYzKH4zLCB+MHgwNywgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInNwaWxsZCIsCUYzKDMsIDB4MDcsIDApLCBGMyh+MywgfjB4MDcsIH4wKXxBU0lfUlMyKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RkIGQsW3JzMSslZzBdICovCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzcGlsbGQiLAlGMygzLCAweDA3LCAxKSwgRjMofjMsIH4weDA3LCB+MSl8UlMxX0cwLAkiZCxbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3BpbGxkIiwJRjMoMywgMHgwNywgMSksIEYzKH4zLCB+MHgwNywgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ZCBkLFtyczErMF0gKi8KLQoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDApLCBGMyh+MywgfjB4MTcsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMCksIEYzKH4zLCB+MHgxNywgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGRhIGQsW3JzMSslZzBdICovCi17ICJzdGRhIiwJRjMoMywgMHgxNywgMSksIEYzKH4zLCB+MHgxNywgfjEpLAkJImQsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDE3LCAxKSwgRjMofjMsIH4weDE3LCB+MSksCQkiZCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKXxSUzFfRzAsCSJkLFtpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MTcsIDEpLCBGMyh+MywgfjB4MTcsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgMCwgdjkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDApLCBGMyh+MywgfjB4MzcsIH4wKSwJCSJILFsxKzJdQSIsIDAsIHY5IH0sCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMCksIEYzKH4zLCB+MHgzNywgfjApfFJTMih+MCksCSJILFsxXUEiLCAwLCB2OSB9LCAvKiBzdGRhIGQsW3JzMSslZzBdICovCi17ICJzdGRhIiwJRjMoMywgMHgzNywgMSksIEYzKH4zLCB+MHgzNywgfjEpLAkJIkgsWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0ZGEiLAlGMygzLCAweDM3LCAxKSwgRjMofjMsIH4weDM3LCB+MSksCQkiSCxbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxSUzFfRzAsCSJILFtpXW8iLCAwLCB2OSB9LAoteyAic3RkYSIsCUYzKDMsIDB4MzcsIDEpLCBGMyh+MywgfjB4MzcsIH4xKXxTSU1NMTMofjApLAkiSCxbMV1vIiwgMCwgdjkgfSwgLyogc3RkIGQsW3JzMSswXSAqLwotCi17ICJzdGgiLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJKH4wKSwJImQsWzErMl0iLCAwLCB2NiB9LAoteyAic3RoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCAwLCB2NiB9LCAvKiBzdGggZCxbcnMxKyVnMF0gKi8KLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFsxK2ldIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFtpKzFdIiwgMCwgdjYgfSwKLXsgInN0aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIDAsIHY2IH0sCi17ICJzdGgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgMCwgdjYgfSwgLyogc3RoIGQsW3JzMSswXSAqLwotCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSSh+MCksCSJkLFsxKzJdIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2giLAlGMygzLCAweDA2LCAwKSwgRjMofjMsIH4weDA2LCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCBkLFtyczErJWcwXSAqLwoteyAic3RzaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKSwJCSJkLFsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2giLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHNoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJTMV9HMCwJImQsW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2giLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8U0lNTTEzKH4wKSwJImQsWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoIGQsW3JzMSswXSAqLwoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDApLCBGMyh+MywgfjB4MDYsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfEFTSV9SUzIofjApLAkiZCxbMV0iLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGggZCxbcnMxKyVnMF0gKi8KLXsgInN0dWgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSksCQkiZCxbMStpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpLAkJImQsW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSUzFfRzAsCSJkLFtpXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJzdHVoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aCBkLFtyczErMF0gKi8KLQoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDApLCBGMyh+MywgfjB4MTYsIH4wKSwJCSJkLFsxKzJdQSIsIDAsIHY2IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApfFJTMih+MCksCSJkLFsxXUEiLCAwLCB2NiB9LCAvKiBzdGhhICxbcnMxKyVnMF0gKi8KLXsgInN0aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3RoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdGhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdGggZCxbcnMxKzBdICovCi0KLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApLAkJImQsWzErMl1BIiwgRl9BTElBUywgdjYgfSwKLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMCksIEYzKH4zLCB+MHgxNiwgfjApfFJTMih+MCksCSJkLFsxXUEiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdGhhICxbcnMxKyVnMF0gKi8KLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsWzEraV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpLAkJImQsW2krMV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0c2hhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIEZfQUxJQVMsIHY5IH0sCi17ICJzdHNoYSIsCUYzKDMsIDB4MTYsIDEpLCBGMyh+MywgfjB4MTYsIH4xKXxTSU1NMTMofjApLAkiZCxbMV1vIiwgRl9BTElBUywgdjkgfSwgLyogc3RoIGQsW3JzMSswXSAqLwoteyAic3R1aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCksCQkiZCxbMSsyXUEiLCBGX0FMSUFTLCB2NiB9LAoteyAic3R1aGEiLAlGMygzLCAweDE2LCAwKSwgRjMofjMsIH4weDE2LCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0aGEgLFtyczErJWcwXSAqLwoteyAic3R1aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbMStpXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSksCQkiZCxbaSsxXW8iLCBGX0FMSUFTLCB2OSB9LAoteyAic3R1aGEiLAlGMygzLCAweDE2LCAxKSwgRjMofjMsIH4weDE2LCB+MSl8UlMxX0cwLAkiZCxbaV1vIiwgRl9BTElBUywgdjkgfSwKLXsgInN0dWhhIiwJRjMoMywgMHgxNiwgMSksIEYzKH4zLCB+MHgxNiwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdGggZCxbcnMxKzBdICovCi0KLXsgInN0eCIsCUYzKDMsIDB4MGUsIDApLCBGMyh+MywgfjB4MGUsIH4wKXxBU0kofjApLAkiZCxbMSsyXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8QVNJX1JTMih+MCksCSJkLFsxXSIsIDAsIHY5IH0sIC8qIHN0eCBkLFtyczErJWcwXSAqLwoteyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpLAkJImQsWzEraV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpLAkJImQsW2krMV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJTMV9HMCwJImQsW2ldIiwgMCwgdjkgfSwKLXsgInN0eCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxTSU1NMTMofjApLAkiZCxbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKzBdICovCi0KLXsgInN0eCIsCUYzKDMsIDB4MjUsIDApfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4wKXxBU0kofjApfFJEKH4xKSwJIkYsWzErMl0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgyNSwgMCl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjApfEFTSV9SUzIofjApfFJEKH4xKSwiRixbMV0iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKyVnMF0gKi8KLXsgInN0eCIsCUYzKDMsIDB4MjUsIDEpfFJEKDEpLCBGMyh+MywgfjB4MjUsIH4xKXxSRCh+MSksCQkiRixbMStpXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8UkQofjEpLAkJIkYsW2krMV0iLCAwLCB2OSB9LAoteyAic3R4IiwJRjMoMywgMHgyNSwgMSl8UkQoMSksIEYzKH4zLCB+MHgyNSwgfjEpfFJTMV9HMHxSRCh+MSksCSJGLFtpXSIsIDAsIHY5IH0sCi17ICJzdHgiLAlGMygzLCAweDI1LCAxKXxSRCgxKSwgRjMofjMsIH4weDI1LCB+MSl8U0lNTTEzKH4wKXxSRCh+MSksIkYsWzFdIiwgMCwgdjkgfSwgLyogc3R4IGQsW3JzMSswXSAqLwotCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMCksIEYzKH4zLCB+MHgxZSwgfjApLAkJImQsWzErMl1BIiwgMCwgdjkgfSwKLXsgInN0eGEiLAlGMygzLCAweDFlLCAwKSwgRjMofjMsIH4weDFlLCB+MCl8UlMyKH4wKSwJImQsWzFdQSIsIDAsIHY5IH0sIC8qIHN0eGEgZCxbcnMxKyVnMF0gKi8KLXsgInN0eGEiLAlGMygzLCAweDFlLCAxKSwgRjMofjMsIH4weDFlLCB+MSksCQkiZCxbMStpXW8iLCAwLCB2OSB9LAoteyAic3R4YSIsCUYzKDMsIDB4MWUsIDEpLCBGMyh+MywgfjB4MWUsIH4xKSwJCSJkLFtpKzFdbyIsIDAsIHY5IH0sCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpfFJTMV9HMCwJImQsW2ldbyIsIDAsIHY5IH0sCi17ICJzdHhhIiwJRjMoMywgMHgxZSwgMSksIEYzKH4zLCB+MHgxZSwgfjEpfFNJTU0xMyh+MCksCSJkLFsxXW8iLCAwLCB2OSB9LCAvKiBzdHggZCxbcnMxKzBdICovCi0KLXsgInN0cSIsCUYzKDMsIDB4MjYsIDApLCBGMyh+MywgfjB4MjYsIH4wKXxBU0kofjApLAkiSixbMSsyXSIsIDAsIHY5IH0sCi17ICJzdHEiLAlGMygzLCAweDI2LCAwKSwgRjMofjMsIH4weDI2LCB+MCl8QVNJX1JTMih+MCksCSJKLFsxXSIsIDAsIHY5IH0sIC8qIHN0cSBbcnMxKyVnMF0gKi8KLXsgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJKLFsxK2ldIiwgMCwgdjkgfSwKLXsgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKSwJCSJKLFtpKzFdIiwgMCwgdjkgfSwKLXsgInN0cSIsCUYzKDMsIDB4MjYsIDEpLCBGMyh+MywgfjB4MjYsIH4xKXxSUzFfRzAsCSJKLFtpXSIsIDAsIHY5IH0sCi17ICJzdHEiLAlGMygzLCAweDI2LCAxKSwgRjMofjMsIH4weDI2LCB+MSl8U0lNTTEzKH4wKSwJIkosWzFdIiwgMCwgdjkgfSwgLyogc3RxIFtyczErMF0gKi8KLQoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0kofjApLAkiSixbMSsyXUEiLCAwLCB2OSB9LAoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDApLCBGMyh+MywgfjB4MzYsIH4wKXxBU0lfUlMyKH4wKSwJIkosWzFdQSIsIDAsIHY5IH0sIC8qIHN0cWEgW3JzMSslZzBdICovCi17ICJzdHFhIiwJRjMoMywgMHgzNiwgMSksIEYzKH4zLCB+MHgzNiwgfjEpLAkJIkosWzEraV1vIiwgMCwgdjkgfSwKLXsgInN0cWEiLAlGMygzLCAweDM2LCAxKSwgRjMofjMsIH4weDM2LCB+MSksCQkiSixbaSsxXW8iLCAwLCB2OSB9LAoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxSUzFfRzAsCSJKLFtpXW8iLCAwLCB2OSB9LAoteyAic3RxYSIsCUYzKDMsIDB4MzYsIDEpLCBGMyh+MywgfjB4MzYsIH4xKXxTSU1NMTMofjApLAkiSixbMV1vIiwgMCwgdjkgfSwgLyogc3RxYSBbcnMxKzBdICovCi0KLXsgInN3YXAiLAlGMygzLCAweDBmLCAwKSwgRjMofjMsIH4weDBmLCB+MCl8QVNJKH4wKSwJIlsxKzJdLGQiLCAwLCB2NyB9LAoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDApLCBGMyh+MywgfjB4MGYsIH4wKXxBU0lfUlMyKH4wKSwJIlsxXSxkIiwgMCwgdjcgfSwgLyogc3dhcCBbcnMxKyVnMF0sZCAqLwoteyAic3dhcCIsCUYzKDMsIDB4MGYsIDEpLCBGMyh+MywgfjB4MGYsIH4xKSwJCSJbMStpXSxkIiwgMCwgdjcgfSwKLXsgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSksCQkiW2krMV0sZCIsIDAsIHY3IH0sCi17ICJzd2FwIiwJRjMoMywgMHgwZiwgMSksIEYzKH4zLCB+MHgwZiwgfjEpfFJTMV9HMCwJIltpXSxkIiwgMCwgdjcgfSwKLXsgInN3YXAiLAlGMygzLCAweDBmLCAxKSwgRjMofjMsIH4weDBmLCB+MSl8U0lNTTEzKH4wKSwJIlsxXSxkIiwgMCwgdjcgfSwgLyogc3dhcCBbcnMxKzBdLGQgKi8KLQoteyAic3dhcGEiLAlGMygzLCAweDFmLCAwKSwgRjMofjMsIH4weDFmLCB+MCksCQkiWzErMl1BLGQiLCAwLCB2NyB9LAoteyAic3dhcGEiLAlGMygzLCAweDFmLCAwKSwgRjMofjMsIH4weDFmLCB+MCl8UlMyKH4wKSwJIlsxXUEsZCIsIDAsIHY3IH0sIC8qIHN3YXBhIFtyczErJWcwXSxkICovCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKSwJCSJbMStpXW8sZCIsIDAsIHY5IH0sCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKSwJCSJbaSsxXW8sZCIsIDAsIHY5IH0sCi17ICJzd2FwYSIsCUYzKDMsIDB4MWYsIDEpLCBGMyh+MywgfjB4MWYsIH4xKXxSUzFfRzAsCSJbaV1vLGQiLCAwLCB2OSB9LAoteyAic3dhcGEiLAlGMygzLCAweDFmLCAxKSwgRjMofjMsIH4weDFmLCB+MSl8U0lNTTEzKH4wKSwJIlsxXW8sZCIsIDAsIHY5IH0sIC8qIHN3YXAgW3JzMSswXSxkICovCi0KLXsgInJlc3RvcmUiLAlGMygyLCAweDNkLCAwKSwgRjMofjIsIH4weDNkLCB+MCl8QVNJKH4wKSwJCQkiMSwyLGQiLCAwLCB2NiB9LAoteyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDApLCBGMyh+MiwgfjB4M2QsIH4wKXxSRF9HMHxSUzFfRzB8QVNJX1JTMih+MCksCSIiLCAwLCB2NiB9LCAvKiByZXN0b3JlICVnMCwlZzAsJWcwICovCi17ICJyZXN0b3JlIiwJRjMoMiwgMHgzZCwgMSksIEYzKH4yLCB+MHgzZCwgfjEpLAkJCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAicmVzdG9yZSIsCUYzKDIsIDB4M2QsIDEpLCBGMyh+MiwgfjB4M2QsIH4xKXxSRF9HMHxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY2IH0sIC8qIHJlc3RvcmUgJWcwLDAsJWcwICovCi0KLXsgInJldHQiLAlGMygyLCAweDM5LCAwKSwgRjMofjIsIH4weDM5LCB+MCl8UkRfRzB8QVNJKH4wKSwJIjErMiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIHJldHQgcnMxK3JzMiAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDApLCBGMyh+MiwgfjB4MzksIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LAkvKiByZXR0IHJzMSwlZzAgKi8KLXsgInJldHQiLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8UkRfRzAsCQkiMStpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCByczErWCAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMCwJCSJpKzEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiByZXR0IFgrcnMxICovCi17ICJyZXR0IiwJRjMoMiwgMHgzOSwgMSksIEYzKH4yLCB+MHgzOSwgfjEpfFJEX0cwfFJTMV9HMCwJCSJpIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogcmV0dCBYK3JzMSAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMHxSUzFfRzAsCQkiaSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sCS8qIHJldHQgWCAqLwoteyAicmV0dCIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sCS8qIHJldHQgcnMxKzAgKi8KLQoteyAic2F2ZSIsCUYzKDIsIDB4M2MsIDApLCBGMyh+MiwgfjB4M2MsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic2F2ZSIsCUYzKDIsIDB4M2MsIDEpLCBGMyh+MiwgfjB4M2MsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJzYXZlIiwJMHg4MWUwMDAwMCwJfjB4ODFlMDAwMDAsCQkJIiIsIEZfQUxJQVMsIHY2IH0sCi0KLXsgInJldCIsICBGMygyLCAweDM4LCAxKXxSUzEoMHgxZil8U0lNTTEzKDgpLCBGMyh+MiwgfjB4MzgsIH4xKXxTSU1NMTMofjgpLAkgICAgICAgIiIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWk3KzgsJWcwICovCi17ICJyZXRsIiwgRjMoMiwgMHgzOCwgMSl8UlMxKDB4MGYpfFNJTU0xMyg4KSwgRjMofjIsIH4weDM4LCB+MSl8UlMxKH4weDBmKXxTSU1NMTMofjgpLCAiIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlbzcrOCwlZzAgKi8KLQoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDApLCBGMyh+MiwgfjB4MzgsIH4wKXxBU0kofjApLAkiMSsyLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfEFTSV9SUzIofjApLAkiMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSslZzAsZCAqLwoteyAiam1wbCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxTSU1NMTMofjApLAkiMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSswLGQgKi8KLXsgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UlMxX0cwLAkiaSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsICVnMCtpLGQgKi8KLXsgImptcGwiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSksCQkiMStpLGQiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJqbXBsIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpLAkJImkrMSxkIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAotCi17ICJkb25lIiwJRjMoMiwgMHgzZSwgMCl8UkQoMCksIEYzKH4yLCB+MHgzZSwgfjApfFJEKH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCi17ICJyZXRyeSIsCUYzKDIsIDB4M2UsIDApfFJEKDEpLCBGMyh+MiwgfjB4M2UsIH4wKXxSRCh+MSl8UlMxX0cwfFNJTU0xMyh+MCksCSIiLCAwLCB2OSB9LAoteyAic2F2ZWQiLAlGMygyLCAweDMxLCAwKXxSRCgwKSwgRjMofjIsIH4weDMxLCB+MCl8UkQofjApfFJTMV9HMHxTSU1NMTMofjApLAkiIiwgMCwgdjkgfSwKLXsgInJlc3RvcmVkIiwJRjMoMiwgMHgzMSwgMCl8UkQoMSksIEYzKH4yLCB+MHgzMSwgfjApfFJEKH4xKXxSUzFfRzB8U0lNTTEzKH4wKSwJIiIsIDAsIHY5IH0sCi17ICJzaXIiLAlGMygyLCAweDMwLCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MHhmKXxSUzFfRzAsCQkiaSIsIDAsIHY5IH0sCi0KLXsgImZsdXNoIiwJRjMoMiwgMHgzYiwgMCksIEYzKH4yLCB+MHgzYiwgfjApfEFTSSh+MCksCSIxKzIiLCAwLCB2OCB9LAoteyAiZmx1c2giLAlGMygyLCAweDNiLCAwKSwgRjMofjIsIH4weDNiLCB+MCl8QVNJX1JTMih+MCksCSIxIiwgMCwgdjggfSwgLyogZmx1c2ggcnMxKyVnMCAqLwoteyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8U0lNTTEzKH4wKSwJIjEiLCAwLCB2OCB9LCAvKiBmbHVzaCByczErMCAqLwoteyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8UlMxX0cwLAkiaSIsIDAsIHY4IH0sIC8qIGZsdXNoICVnMCtpICovCi17ICJmbHVzaCIsCUYzKDIsIDB4M2IsIDEpLCBGMyh+MiwgfjB4M2IsIH4xKSwJCSIxK2kiLCAwLCB2OCB9LAoteyAiZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiaSsxIiwgMCwgdjggfSwKLQotLyogSUZMVVNIIHdhcyByZW5hbWVkIHRvIEZMVVNIIGluIHY4LiAgKi8KLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0kofjApLAkiMSsyIiwgRl9BTElBUywgdjYgfSwKLXsgImlmbHVzaCIsCUYzKDIsIDB4M2IsIDApLCBGMyh+MiwgfjB4M2IsIH4wKXxBU0lfUlMyKH4wKSwJIjEiLCBGX0FMSUFTLCB2NiB9LCAvKiBmbHVzaCByczErJWcwICovCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSl8U0lNTTEzKH4wKSwJIjEiLCBGX0FMSUFTLCB2NiB9LCAvKiBmbHVzaCByczErMCAqLwoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpfFJTMV9HMCwJImkiLCBGX0FMSUFTLCB2NiB9LAoteyAiaWZsdXNoIiwJRjMoMiwgMHgzYiwgMSksIEYzKH4yLCB+MHgzYiwgfjEpLAkJIjEraSIsIEZfQUxJQVMsIHY2IH0sCi17ICJpZmx1c2giLAlGMygyLCAweDNiLCAxKSwgRjMofjIsIH4weDNiLCB+MSksCQkiaSsxIiwgRl9BTElBUywgdjYgfSwKLQoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfEFTSSh+MCksCSIxKzIiLCAwLCB2OSB9LAoteyAicmV0dXJuIiwJRjMoMiwgMHgzOSwgMCksIEYzKH4yLCB+MHgzOSwgfjApfEFTSV9SUzIofjApLAkiMSIsIDAsIHY5IH0sIC8qIHJldHVybiByczErJWcwICovCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSl8U0lNTTEzKH4wKSwJIjEiLCAwLCB2OSB9LCAvKiByZXR1cm4gcnMxKzAgKi8KLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKXxSUzFfRzAsCSJpIiwgMCwgdjkgfSwgLyogcmV0dXJuICVnMCtpICovCi17ICJyZXR1cm4iLAlGMygyLCAweDM5LCAxKSwgRjMofjIsIH4weDM5LCB+MSksCQkiMStpIiwgMCwgdjkgfSwKLXsgInJldHVybiIsCUYzKDIsIDB4MzksIDEpLCBGMyh+MiwgfjB4MzksIH4xKSwJCSJpKzEiLCAwLCB2OSB9LAotCi17ICJmbHVzaHciLAlGMygyLCAweDJiLCAwKSwgRjMofjIsIH4weDJiLCB+MCl8UkRfRzB8UlMxX0cwfEFTSV9SUzIofjApLAkiIiwgMCwgdjkgfSwKLQoteyAibWVtYmFyIiwJRjMoMiwgMHgyOCwgMSl8UlMxKDB4ZiksIEYzKH4yLCB+MHgyOCwgfjEpfFJEX0cwfFJTMSh+MHhmKXxTSU1NMTMofjEyNyksICJLIiwgMCwgdjkgfSwKLXsgInN0YmFyIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDB4ZiksIEYzKH4yLCB+MHgyOCwgfjApfFJEX0cwfFJTMSh+MHhmKXxTSU1NMTMofjApLCAiIiwgMCwgdjggfSwKLQoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAwKSwgRjMofjMsIH4weDJkLCB+MCksCQkiWzErMl0sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDApLCBGMyh+MywgfjB4MmQsIH4wKXxSUzJfRzAsCSJbMV0sKiIsIDAsIHY5IH0sIC8qIHByZWZldGNoIFtyczErJWcwXSxwcmVmZXRjaF9mY24gKi8KLXsgInByZWZldGNoIiwJRjMoMywgMHgyZCwgMSksIEYzKH4zLCB+MHgyZCwgfjEpLAkJIlsxK2ldLCoiLCAwLCB2OSB9LAoteyAicHJlZmV0Y2giLAlGMygzLCAweDJkLCAxKSwgRjMofjMsIH4weDJkLCB+MSksCQkiW2krMV0sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKXxSUzFfRzAsCSJbaV0sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaCIsCUYzKDMsIDB4MmQsIDEpLCBGMyh+MywgfjB4MmQsIH4xKXxTSU1NMTMofjApLAkiWzFdLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaCBbcnMxKzBdLHByZWZldGNoX2ZjbiAqLwoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMCksIEYzKH4zLCB+MHgzZCwgfjApLAkJIlsxKzJdQSwqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDApLCBGMyh+MywgfjB4M2QsIH4wKXxSUzJfRzAsCSJbMV1BLCoiLCAwLCB2OSB9LCAvKiBwcmVmZXRjaGEgW3JzMSslZzBdLHByZWZldGNoX2ZjbiAqLwoteyAicHJlZmV0Y2hhIiwJRjMoMywgMHgzZCwgMSksIEYzKH4zLCB+MHgzZCwgfjEpLAkJIlsxK2ldbywqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKSwJCSJbaSsxXW8sKiIsIDAsIHY5IH0sCi17ICJwcmVmZXRjaGEiLAlGMygzLCAweDNkLCAxKSwgRjMofjMsIH4weDNkLCB+MSl8UlMxX0cwLAkiW2ldbywqIiwgMCwgdjkgfSwKLXsgInByZWZldGNoYSIsCUYzKDMsIDB4M2QsIDEpLCBGMyh+MywgfjB4M2QsIH4xKXxTSU1NMTMofjApLAkiWzFdbywqIiwgMCwgdjkgfSwgLyogcHJlZmV0Y2hhIFtyczErMF0sZCAqLwotCi17ICJzbGwiLAlGMygyLCAweDI1LCAwKSwgRjMofjIsIH4weDI1LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzbGwiLAlGMygyLCAweDI1LCAxKSwgRjMofjIsIH4weDI1LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCi17ICJzcmEiLAlGMygyLCAweDI3LCAwKSwgRjMofjIsIH4weDI3LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzcmEiLAlGMygyLCAweDI3LCAxKSwgRjMofjIsIH4weDI3LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCi17ICJzcmwiLAlGMygyLCAweDI2LCAwKSwgRjMofjIsIH4weDI2LCB+MCl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJzcmwiLAlGMygyLCAweDI2LCAxKSwgRjMofjIsIH4weDI2LCB+MSl8KDE8PDEyKXwoMHg3Zjw8NSksCSIxLFgsZCIsIDAsIHY2IH0sCi0KLXsgInNsbHgiLAlGMygyLCAweDI1LCAwKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjUsIH4wKXwoMHg3Zjw8NSksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJzbGx4IiwJRjMoMiwgMHgyNSwgMSl8KDE8PDEyKSwgRjMofjIsIH4weDI1LCB+MSl8KDB4M2Y8PDYpLAkiMSxZLGQiLCAwLCB2OSB9LAoteyAic3JheCIsCUYzKDIsIDB4MjcsIDApfCgxPDwxMiksIEYzKH4yLCB+MHgyNywgfjApfCgweDdmPDw1KSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInNyYXgiLAlGMygyLCAweDI3LCAxKXwoMTw8MTIpLCBGMyh+MiwgfjB4MjcsIH4xKXwoMHgzZjw8NiksCSIxLFksZCIsIDAsIHY5IH0sCi17ICJzcmx4IiwJRjMoMiwgMHgyNiwgMCl8KDE8PDEyKSwgRjMofjIsIH4weDI2LCB+MCl8KDB4N2Y8PDUpLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic3JseCIsCUYzKDIsIDB4MjYsIDEpfCgxPDwxMiksIEYzKH4yLCB+MHgyNiwgfjEpfCgweDNmPDw2KSwJIjEsWSxkIiwgMCwgdjkgfSwKLQoteyAibXVsc2NjIiwJRjMoMiwgMHgyNCwgMCksIEYzKH4yLCB+MHgyNCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJtdWxzY2MiLAlGMygyLCAweDI0LCAxKSwgRjMofjIsIH4weDI0LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi17ICJkaXZzY2MiLAlGMygyLCAweDFkLCAwKSwgRjMofjIsIH4weDFkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgc3BhcmNsaXRlIH0sCi17ICJkaXZzY2MiLAlGMygyLCAweDFkLCAxKSwgRjMofjIsIH4weDFkLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xpdGUgfSwKLQoteyAic2NhbiIsCUYzKDIsIDB4MmMsIDApLCBGMyh+MiwgfjB4MmMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBzcGFyY2xldHxzcGFyY2xpdGUgfSwKLXsgInNjYW4iLAlGMygyLCAweDJjLCAxKSwgRjMofjIsIH4weDJjLCB+MSksCQkiMSxpLGQiLCAwLCBzcGFyY2xldHxzcGFyY2xpdGUgfSwKLQoteyAicG9wYyIsCUYzKDIsIDB4MmUsIDApLCBGMyh+MiwgfjB4MmUsIH4wKXxSUzJfRzB8QVNJKH4wKSwiMixkIiwgMCwgdjkgfSwKLXsgInBvcGMiLAlGMygyLCAweDJlLCAxKSwgRjMofjIsIH4weDJlLCB+MSl8UlMyX0cwLAkiaSxkIiwgMCwgdjkgfSwKLQoteyAiY2xyIiwJRjMoMiwgMHgwMiwgMCksIEYzKH4yLCB+MHgwMiwgfjApfFJEX0cwfFJTMV9HMHxBU0lfUlMyKH4wKSwJImQiLCBGX0FMSUFTLCB2NiB9LCAvKiBvciAlZzAsJWcwLGQgKi8KLXsgImNsciIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxSUzFfRzB8U0lNTTEzKH4wKSwJCSJkIiwgRl9BTElBUywgdjYgfSwgLyogb3IgJWcwLDAsZAkqLwoteyAiY2xyIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfFJEX0cwfEFTSSh+MCksCQkiWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyIiwJRjMoMywgMHgwNCwgMCksIEYzKH4zLCB+MHgwNCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0ICVnMCxbcnMxKyVnMF0gKi8KLXsgImNsciIsCUYzKDMsIDB4MDQsIDEpLCBGMyh+MywgfjB4MDQsIH4xKXxSRF9HMCwJCQkiWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwLAkJCSJbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHIiLAlGMygzLCAweDA0LCAxKSwgRjMofjMsIH4weDA0LCB+MSl8UkRfRzB8UlMxX0cwLAkJCSJbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyIiwJRjMoMywgMHgwNCwgMSksIEYzKH4zLCB+MHgwNCwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCQkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3QgJWcwLFtyczErMF0gKi8KLQoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxSRF9HMHxBU0kofjApLAkiWzErMl0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDApLCBGMyh+MywgfjB4MDUsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiAlZzAsW3JzMSslZzBdICovCi17ICJjbHJiIiwJRjMoMywgMHgwNSwgMSksIEYzKH4zLCB+MHgwNSwgfjEpfFJEX0cwLAkJIlsxK2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzAsCQkiW2krMV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyYiIsCUYzKDMsIDB4MDUsIDEpLCBGMyh+MywgfjB4MDUsIH4xKXxSRF9HMHxSUzFfRzAsCQkiW2ldIiwgRl9BTElBUywgdjYgfSwKLXsgImNscmIiLAlGMygzLCAweDA1LCAxKSwgRjMofjMsIH4weDA1LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIlsxXSIsIEZfQUxJQVMsIHY2IH0sIC8qIHN0YiAlZzAsW3JzMSswXSAqLwotCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfFJEX0cwfEFTSSh+MCksCSJbMSsyXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMCksIEYzKH4zLCB+MHgwNiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoICVnMCxbcnMxKyVnMF0gKi8KLXsgImNscmgiLAlGMygzLCAweDA2LCAxKSwgRjMofjMsIH4weDA2LCB+MSl8UkRfRzAsCQkiWzEraV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMCwJCSJbaSsxXSIsIEZfQUxJQVMsIHY2IH0sCi17ICJjbHJoIiwJRjMoMywgMHgwNiwgMSksIEYzKH4zLCB+MHgwNiwgfjEpfFJEX0cwfFJTMV9HMCwJCSJbaV0iLCBGX0FMSUFTLCB2NiB9LAoteyAiY2xyaCIsCUYzKDMsIDB4MDYsIDEpLCBGMyh+MywgfjB4MDYsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiWzFdIiwgRl9BTElBUywgdjYgfSwgLyogc3RoICVnMCxbcnMxKzBdICovCi0KLXsgImNscngiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8UkRfRzB8QVNJKH4wKSwJIlsxKzJdIiwgRl9BTElBUywgdjkgfSwKLXsgImNscngiLAlGMygzLCAweDBlLCAwKSwgRjMofjMsIH4weDBlLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSJbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdHggJWcwLFtyczErJWcwXSAqLwoteyAiY2xyeCIsCUYzKDMsIDB4MGUsIDEpLCBGMyh+MywgfjB4MGUsIH4xKXxSRF9HMCwJCSJbMStpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwLAkJIltpKzFdIiwgRl9BTElBUywgdjkgfSwKLXsgImNscngiLAlGMygzLCAweDBlLCAxKSwgRjMofjMsIH4weDBlLCB+MSl8UkRfRzB8UlMxX0cwLAkJIltpXSIsIEZfQUxJQVMsIHY5IH0sCi17ICJjbHJ4IiwJRjMoMywgMHgwZSwgMSksIEYzKH4zLCB+MHgwZSwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSJbMV0iLCBGX0FMSUFTLCB2OSB9LCAvKiBzdHggJWcwLFtyczErMF0gKi8KLQoteyAib3JjYyIsCUYzKDIsIDB4MTIsIDApLCBGMyh+MiwgfjB4MTIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAib3JjYyIsCUYzKDIsIDB4MTIsIDEpLCBGMyh+MiwgfjB4MTIsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJvcmNjIiwJRjMoMiwgMHgxMiwgMSksIEYzKH4yLCB+MHgxMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQotLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJvcm5jYyIsCUYzKDIsIDB4MTYsIDApLCBGMyh+MiwgfjB4MTYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAib3JuY2MiLAlGMygyLCAweDE2LCAxKSwgRjMofjIsIH4weDE2LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAotCi0vKiBUaGlzIGlzIG5vdCBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgIm9ybiIsCUYzKDIsIDB4MDYsIDApLCBGMyh+MiwgfjB4MDYsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAib3JuIiwJRjMoMiwgMHgwNiwgMSksIEYzKH4yLCB+MHgwNiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAidHN0IiwJRjMoMiwgMHgxMiwgMCksIEYzKH4yLCB+MHgxMiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSIsIDAsIHY2IH0sIC8qIG9yY2MgcnMxLCAlZzAsICVnMCAqLwoteyAidHN0IiwJRjMoMiwgMHgxMiwgMCksIEYzKH4yLCB+MHgxMiwgfjApfFJEX0cwfFJTMV9HMHxBU0kofjApLAkiMiIsIDAsIHY2IH0sIC8qIG9yY2MgJWcwLCByczIsICVnMCAqLwoteyAidHN0IiwJRjMoMiwgMHgxMiwgMSksIEYzKH4yLCB+MHgxMiwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxIiwgMCwgdjYgfSwgLyogb3JjYyByczEsIDAsICVnMCAqLwotCi17ICJ3ciIsCUYzKDIsIDB4MzAsIDApLAkJRjMofjIsIH4weDMwLCB+MCl8QVNJKH4wKSwJCSIxLDIsbSIsIDAsIHY4IH0sIC8qIHdyIHIsciwlYXNyWCAqLwoteyAid3IiLAlGMygyLCAweDMwLCAxKSwJCUYzKH4yLCB+MHgzMCwgfjEpLAkJCSIxLGksbSIsIDAsIHY4IH0sIC8qIHdyIHIsaSwlYXNyWCAqLwoteyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfEFTSV9SUzIofjApLAkJIjEsbSIsIEZfQUxJQVMsIHY4IH0sIC8qIHdyIHJzMSwlZzAsJWFzclggKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMCksCQlGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHkiLCAwLCB2NiB9LCAvKiB3ciByLHIsJXkgKi8KLXsgIndyIiwJRjMoMiwgMHgzMCwgMSksCQlGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMCwJCSIxLGkseSIsIDAsIHY2IH0sIC8qIHdyIHIsaSwleSAqLwoteyAid3IiLAlGMygyLCAweDMwLCAwKSwJCUYzKH4yLCB+MHgzMCwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcnMxLCVnMCwleSAqLwoteyAid3IiLAlGMygyLCAweDMxLCAwKSwJCUYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIscCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixyLCVwc3IgKi8KLXsgIndyIiwJRjMoMiwgMHgzMSwgMSksCQlGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMCwJCSIxLGkscCIsIDAsIHY2bm90djkgfSwgLyogd3IgcixpLCVwc3IgKi8KLXsgIndyIiwJRjMoMiwgMHgzMSwgMCksCQlGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEscCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwlcHNyICovCi17ICJ3ciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix3IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLHIsJXdpbSAqLwoteyAid3IiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJIjEsaSx3IiwgMCwgdjZub3R2OSB9LCAvKiB3ciByLGksJXdpbSAqLwoteyAid3IiLAlGMygyLCAweDMyLCAwKSwJCUYzKH4yLCB+MHgzMiwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCV3aW0gKi8KLXsgIndyIiwJRjMoMiwgMHgzMywgMCksCQlGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHQiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwldGJyICovCi17ICJ3ciIsCUYzKDIsIDB4MzMsIDEpLAkJRjMofjIsIH4weDMzLCB+MSl8UkRfRzAsCQkiMSxpLHQiLCAwLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwldGJyICovCi17ICJ3ciIsCUYzKDIsIDB4MzMsIDApLAkJRjMofjIsIH4weDMzLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXRiciAqLwotCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Mil8QVNJKH4wKSwJIjEsMixFIiwgMCwgdjkgfSwgLyogd3IgcixyLCVjY3IgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yKSwJCSIxLGksRSIsIDAsIHY5IH0sIC8qIHdyIHIsaSwlY2NyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDMpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Myl8QVNJKH4wKSwJIjEsMixvIiwgMCwgdjkgfSwgLyogd3IgcixyLCVhc2kgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMyksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4zKSwJCSIxLGksbyIsIDAsIHY5IH0sIC8qIHdyIHIsaSwlYXNpICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDYpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+Nil8QVNJKH4wKSwJIjEsMixzIiwgMCwgdjkgfSwgLyogd3IgcixyLCVmcHJzICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDYpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+NiksCQkiMSxpLHMiLCAwLCB2OSB9LCAvKiB3ciByLGksJWZwcnMgKi8KLQoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxNiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xNil8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlcGNyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE2KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE2KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXBjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxNyksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xNyl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlcGljICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE3KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE3KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJXBpYyAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxOCksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xOCl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlZGNyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE4KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE4KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJWRjciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgxOSksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4xOSl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlZ3NyICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDEpfFJEKDE5KSwJRjMofjIsIH4weDMwLCB+MSl8UkQofjE5KSwJCSIxLGksXyIsIDAsIHY5YSB9LCAvKiB3ciByLGksJWdzciAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMCksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMCl8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlc2V0X3NvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjApLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjApLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlc2V0X3NvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMCl8UkQoMjEpLAlGMyh+MiwgfjB4MzAsIH4wKXxSRCh+MjEpfEFTSSh+MCksCSIxLDIsXyIsIDAsIHY5YSB9LCAvKiB3ciByLHIsJWNsZWFyX3NvZnRpbnQgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjEpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjEpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwlY2xlYXJfc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAwKXxSRCgyMiksCUYzKH4yLCB+MHgzMCwgfjApfFJEKH4yMil8QVNJKH4wKSwJIjEsMixfIiwgMCwgdjlhIH0sIC8qIHdyIHIsciwlc29mdGludCAqLwoteyAid3IiLCBGMygyLCAweDMwLCAxKXxSRCgyMiksCUYzKH4yLCB+MHgzMCwgfjEpfFJEKH4yMiksCQkiMSxpLF8iLCAwLCB2OWEgfSwgLyogd3IgcixpLCVzb2Z0aW50ICovCi17ICJ3ciIsIEYzKDIsIDB4MzAsIDApfFJEKDIzKSwJRjMofjIsIH4weDMwLCB+MCl8UkQofjIzKXxBU0kofjApLAkiMSwyLF8iLCAwLCB2OWEgfSwgLyogd3IgcixyLCV0aWNrX2NtcHIgKi8KLXsgIndyIiwgRjMoMiwgMHgzMCwgMSl8UkQoMjMpLAlGMyh+MiwgfjB4MzAsIH4xKXxSRCh+MjMpLAkJIjEsaSxfIiwgMCwgdjlhIH0sIC8qIHdyIHIsaSwldGlja19jbXByICovCi0KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCksCQkJRjMofjIsIH4weDI4LCB+MCl8U0lNTTEzKH4wKSwJCSJNLGQiLCAwLCB2OCB9LCAvKiByZCAlYXNyWCxyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApLAkJCUYzKH4yLCB+MHgyOCwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkieSxkIiwgMCwgdjYgfSwgLyogcmQgJXksciAqLwoteyAicmQiLAlGMygyLCAweDI5LCAwKSwJCQlGMyh+MiwgfjB4MjksIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJInAsZCIsIDAsIHY2bm90djkgfSwgLyogcmQgJXBzcixyICovCi17ICJyZCIsCUYzKDIsIDB4MmEsIDApLAkJCUYzKH4yLCB+MHgyYSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkidyxkIiwgMCwgdjZub3R2OSB9LCAvKiByZCAld2ltLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyYiwgMCksCQkJRjMofjIsIH4weDJiLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ0LGQiLCAwLCB2Nm5vdHY5IH0sIC8qIHJkICV0YnIsciAqLwotCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgyKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+Mil8U0lNTTEzKH4wKSwJIkUsZCIsIDAsIHY5IH0sIC8qIHJkICVjY3IsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMyksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjMpfFNJTU0xMyh+MCksCSJvLGQiLCAwLCB2OSB9LCAvKiByZCAlYXNpLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDQpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH40KXxTSU1NMTMofjApLAkiVyxkIiwgMCwgdjkgfSwgLyogcmQgJXRpY2ssciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoNSksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjUpfFNJTU0xMyh+MCksCSJQLGQiLCAwLCB2OSB9LCAvKiByZCAlcGMsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoNiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjYpfFNJTU0xMyh+MCksCSJzLGQiLCAwLCB2OSB9LCAvKiByZCAlZnBycyxyICovCi0KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE2KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTYpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXBjcixyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgxNyksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjE3KXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVwaWMsciAqLwoteyAicmQiLAlGMygyLCAweDI4LCAwKXxSUzEoMTgpLAkJRjMofjIsIH4weDI4LCB+MCl8UlMxKH4xOCl8U0lNTTEzKH4wKSwJIi8sZCIsIDAsIHY5YSB9LCAvKiByZCAlZGNyLHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDE5KSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MTkpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJWdzcixyICovCi17ICJyZCIsCUYzKDIsIDB4MjgsIDApfFJTMSgyMiksCQlGMyh+MiwgfjB4MjgsIH4wKXxSUzEofjIyKXxTSU1NMTMofjApLAkiLyxkIiwgMCwgdjlhIH0sIC8qIHJkICVzb2Z0aW50LHIgKi8KLXsgInJkIiwJRjMoMiwgMHgyOCwgMCl8UlMxKDIzKSwJCUYzKH4yLCB+MHgyOCwgfjApfFJTMSh+MjMpfFNJTU0xMyh+MCksCSIvLGQiLCAwLCB2OWEgfSwgLyogcmQgJXRpY2tfY21wcixyICovCi0KLXsgInJkcHIiLAlGMygyLCAweDJhLCAwKSwJCUYzKH4yLCB+MHgyYSwgfjApfFNJTU0xMyh+MCksCSI/LGQiLCAwLCB2OSB9LCAgIC8qIHJkcHIgJXByaXYsciAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDApLAkJRjMofjIsIH4weDMyLCB+MCksCQkiMSwyLCEiLCAwLCB2OSB9LCAvKiB3cnByIHIxLHIyLCVwcml2ICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMCksCQlGMyh+MiwgfjB4MzIsIH4wKXxTSU1NMTMofjApLAkiMSwhIiwgMCwgdjkgfSwgICAvKiB3cnByIHIxLCVwcml2ICovCi17ICJ3cnByIiwJRjMoMiwgMHgzMiwgMSksCQlGMyh+MiwgfjB4MzIsIH4xKSwJCSIxLGksISIsIDAsIHY5IH0sIC8qIHdycHIgcjEsaSwlcHJpdiAqLwoteyAid3JwciIsCUYzKDIsIDB4MzIsIDEpLAkJRjMofjIsIH4weDMyLCB+MSksCQkiaSwxLCEiLCBGX0FMSUFTLCB2OSB9LCAvKiB3cnByIGkscjEsJXByaXYgKi8KLXsgIndycHIiLAlGMygyLCAweDMyLCAxKSwJCUYzKH4yLCB+MHgzMiwgfjEpfFJTMSh+MCksCSJpLCEiLCAwLCB2OSB9LCAgIC8qIHdycHIgaSwlcHJpdiAqLwotCi0vKiA/Pz8gVGhpcyBncm91cCBzZWVtcyB3cm9uZy4gIEEgdGhyZWUgb3BlcmFuZCBtb3ZlPyAgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxBU0kofjApLAkJIjEsMixtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcixyLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSksCQkJIjEsaSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcixpLCVhc3JYICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix5IiwgRl9BTElBUywgdjYgfSwgLyogd3IgcixyLCV5ICovCi17ICJtb3YiLAlGMygyLCAweDMwLCAxKSwgRjMofjIsIH4weDMwLCB+MSl8UkRfRzAsCQkiMSxpLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByLGksJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDApLCBGMyh+MiwgfjB4MzEsIH4wKXxSRF9HMHxBU0kofjApLAkiMSwyLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsciwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMxLCAxKSwgRjMofjIsIH4weDMxLCB+MSl8UkRfRzAsCQkiMSxpLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHIsaSwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAwKSwgRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMix3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLHIsJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJIjEsaSx3IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByLGksJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMywgMCksIEYzKH4yLCB+MHgzMywgfjApfFJEX0cwfEFTSSh+MCksCSIxLDIsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixyLCV0YnIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDEpLCBGMyh+MiwgfjB4MzMsIH4xKXxSRF9HMCwJCSIxLGksdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcixpLCV0YnIgKi8KLQoteyAibW92IiwJRjMoMiwgMHgyOCwgMCksIEYzKH4yLCB+MHgyOCwgfjApfFNJTU0xMyh+MCksCQkiTSxkIiwgRl9BTElBUywgdjggfSwgLyogcmQgJWFzcjEsciAqLwoteyAibW92IiwJRjMoMiwgMHgyOCwgMCksIEYzKH4yLCB+MHgyOCwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkieSxkIiwgRl9BTElBUywgdjYgfSwgLyogcmQgJXksciAqLwoteyAibW92IiwJRjMoMiwgMHgyOSwgMCksIEYzKH4yLCB+MHgyOSwgfjApfFJTMV9HMHxTSU1NMTMofjApLAkicCxkIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiByZCAlcHNyLHIgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MmEsIDApLCBGMyh+MiwgfjB4MmEsIH4wKXxSUzFfRzB8U0lNTTEzKH4wKSwJIncsZCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogcmQgJXdpbSxyICovCi17ICJtb3YiLAlGMygyLCAweDJiLCAwKSwgRjMofjIsIH4weDJiLCB+MCl8UlMxX0cwfFNJTU0xMyh+MCksCSJ0LGQiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHJkICV0YnIsciAqLwotCi17ICJtb3YiLAlGMygyLCAweDMwLCAwKSwgRjMofjIsIH4weDMwLCB+MCl8QVNJX1JTMih+MCksCQkiMSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcnMxLCVnMCwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpLAkJCSJpLG0iLCBGX0FMSUFTLCB2OCB9LCAvKiB3ciAlZzAsaSwlYXNyWCAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFNJTU0xMyh+MCksCQkiMSxtIiwgRl9BTElBUywgdjggfSwgLyogd3IgcnMxLDAsJWFzclggKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDApLCBGMyh+MiwgfjB4MzAsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEseSIsIEZfQUxJQVMsIHY2IH0sIC8qIHdyIHJzMSwlZzAsJXkgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzAsIDEpLCBGMyh+MiwgfjB4MzAsIH4xKXxSRF9HMCwJCSJpLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciAlZzAsaSwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMCwgMSksIEYzKH4yLCB+MHgzMCwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHkiLCBGX0FMSUFTLCB2NiB9LCAvKiB3ciByczEsMCwleSAqLwoteyAibW92IiwJRjMoMiwgMHgzMSwgMCksIEYzKH4yLCB+MHgzMSwgfjApfFJEX0cwfEFTSV9SUzIofjApLAkiMSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsJWcwLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDEpLCBGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMCwJCSJpLHAiLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyICVnMCxpLCVwc3IgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzEsIDEpLCBGMyh+MiwgfjB4MzEsIH4xKXxSRF9HMHxTSU1NMTMofjApLAkiMSxwIiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciByczEsMCwlcHNyICovCi17ICJtb3YiLAlGMygyLCAweDMyLCAwKSwgRjMofjIsIH4weDMyLCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwlZzAsJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwLAkJImksdyIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgJWcwLGksJXdpbSAqLwoteyAibW92IiwJRjMoMiwgMHgzMiwgMSksIEYzKH4yLCB+MHgzMiwgfjEpfFJEX0cwfFNJTU0xMyh+MCksCSIxLHciLCBGX0FMSUFTLCB2Nm5vdHY5IH0sIC8qIHdyIHJzMSwwLCV3aW0gKi8KLXsgIm1vdiIsCUYzKDIsIDB4MzMsIDApLCBGMyh+MiwgfjB4MzMsIH4wKXxSRF9HMHxBU0lfUlMyKH4wKSwJIjEsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLCVnMCwldGJyICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAxKSwgRjMofjIsIH4weDMzLCB+MSl8UkRfRzAsCQkiaSx0IiwgRl9BTElBUywgdjZub3R2OSB9LCAvKiB3ciAlZzAsaSwldGJyICovCi17ICJtb3YiLAlGMygyLCAweDMzLCAxKSwgRjMofjIsIH4weDMzLCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEsdCIsIEZfQUxJQVMsIHY2bm90djkgfSwgLyogd3IgcnMxLDAsJXRiciAqLwotCi17ICJtb3YiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8UlMxX0cwfEFTSSh+MCksCSIyLGQiLCAwLCB2NiB9LCAvKiBvciAlZzAscnMyLGQgKi8KLXsgIm1vdiIsCUYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxSUzFfRzAsCQkiaSxkIiwgMCwgdjYgfSwgLyogb3IgJWcwLGksZAkqLwoteyAibW92IiwgICAgICAgIEYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxBU0lfUlMyKH4wKSwJCSIxLGQiLCAwLCB2NiB9LCAvKiBvciByczEsJWcwLGQgICAqLwoteyAibW92IiwgICAgICAgIEYzKDIsIDB4MDIsIDEpLCBGMyh+MiwgfjB4MDIsIH4xKXxTSU1NMTMofjApLAkJIjEsZCIsIDAsIHY2IH0sIC8qIG9yIHJzMSwwLGQgKi8KLQoteyAib3IiLAlGMygyLCAweDAyLCAwKSwgRjMofjIsIH4weDAyLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgIm9yIiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgIm9yIiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAiYnNldCIsCUYzKDIsIDB4MDIsIDApLCBGMyh+MiwgfjB4MDIsIH4wKXxBU0kofjApLAkiMixyIiwgRl9BTElBUywgdjYgfSwJLyogb3IgcmQscnMyLHJkICovCi17ICJic2V0IiwJRjMoMiwgMHgwMiwgMSksIEYzKH4yLCB+MHgwMiwgfjEpLAkJImksciIsIEZfQUxJQVMsIHY2IH0sCS8qIG9yIHJkLGkscmQgKi8KLQotLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJhbmRuIiwJRjMoMiwgMHgwNSwgMCksIEYzKH4yLCB+MHgwNSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhbmRuIiwJRjMoMiwgMHgwNSwgMSksIEYzKH4yLCB+MHgwNSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQotLyogVGhpcyBpcyBub3QgYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJhbmRuY2MiLAlGMygyLCAweDE1LCAwKSwgRjMofjIsIH4weDE1LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgImFuZG5jYyIsCUYzKDIsIDB4MTUsIDEpLCBGMyh+MiwgfjB4MTUsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi0KLXsgImJjbHIiLAlGMygyLCAweDA1LCAwKSwgRjMofjIsIH4weDA1LCB+MCl8QVNJKH4wKSwJIjIsciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZG4gcmQscnMyLHJkICovCi17ICJiY2xyIiwJRjMoMiwgMHgwNSwgMSksIEYzKH4yLCB+MHgwNSwgfjEpLAkJImksciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZG4gcmQsaSxyZCAqLwotCi17ICJjbXAiLAlGMygyLCAweDE0LCAwKSwgRjMofjIsIH4weDE0LCB+MCl8UkRfRzB8QVNJKH4wKSwJIjEsMiIsIDAsIHY2IH0sCS8qIHN1YmNjIHJzMSxyczIsJWcwICovCi17ICJjbXAiLAlGMygyLCAweDE0LCAxKSwgRjMofjIsIH4weDE0LCB+MSl8UkRfRzAsCQkiMSxpIiwgMCwgdjYgfSwJLyogc3ViY2MgcnMxLGksJWcwICovCi0KLXsgInN1YiIsCUYzKDIsIDB4MDQsIDApLCBGMyh+MiwgfjB4MDQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAic3ViIiwJRjMoMiwgMHgwNCwgMSksIEYzKH4yLCB+MHgwNCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAic3ViY2MiLAlGMygyLCAweDE0LCAwKSwgRjMofjIsIH4weDE0LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInN1YmNjIiwJRjMoMiwgMHgxNCwgMSksIEYzKH4yLCB+MHgxNCwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAic3VieCIsCUYzKDIsIDB4MGMsIDApLCBGMyh+MiwgfjB4MGMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJzdWJ4IiwJRjMoMiwgMHgwYywgMSksIEYzKH4yLCB+MHgwYywgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoteyAic3ViYyIsCUYzKDIsIDB4MGMsIDApLCBGMyh+MiwgfjB4MGMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OSB9LAoteyAic3ViYyIsCUYzKDIsIDB4MGMsIDEpLCBGMyh+MiwgfjB4MGMsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi0KLXsgInN1YnhjYyIsCUYzKDIsIDB4MWMsIDApLCBGMyh+MiwgfjB4MWMsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJzdWJ4Y2MiLAlGMygyLCAweDFjLCAxKSwgRjMofjIsIH4weDFjLCB+MSksCQkiMSxpLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJzdWJjY2MiLAlGMygyLCAweDFjLCAwKSwgRjMofjIsIH4weDFjLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInN1YmNjYyIsCUYzKDIsIDB4MWMsIDEpLCBGMyh+MiwgfjB4MWMsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi0KLXsgImFuZCIsCUYzKDIsIDB4MDEsIDApLCBGMyh+MiwgfjB4MDEsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2NiB9LAoteyAiYW5kIiwJRjMoMiwgMHgwMSwgMSksIEYzKH4yLCB+MHgwMSwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgImFuZCIsCUYzKDIsIDB4MDEsIDEpLCBGMyh+MiwgfjB4MDEsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgImFuZGNjIiwJRjMoMiwgMHgxMSwgMCksIEYzKH4yLCB+MHgxMSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhbmRjYyIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJhbmRjYyIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgImRlYyIsCUYzKDIsIDB4MDQsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MDQsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogc3ViIHJkLDEscmQgKi8KLXsgImRlYyIsCUYzKDIsIDB4MDQsIDEpLAkJICAgIEYzKH4yLCB+MHgwNCwgfjEpLAkJICAgICAgICJpLHIiLCBGX0FMSUFTLCB2OCB9LAkvKiBzdWIgcmQsaW1tLHJkICovCi17ICJkZWNjYyIsCUYzKDIsIDB4MTQsIDEpfFNJTU0xMygweDEpLCBGMyh+MiwgfjB4MTQsIH4xKXxTSU1NMTMofjB4MDAwMSksICJyIiwgRl9BTElBUywgdjYgfSwJLyogc3ViY2MgcmQsMSxyZCAqLwoteyAiZGVjY2MiLAlGMygyLCAweDE0LCAxKSwJCSAgICBGMyh+MiwgfjB4MTQsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogc3ViY2MgcmQsaW1tLHJkICovCi17ICJpbmMiLAlGMygyLCAweDAwLCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDAwLCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFkZCByZCwxLHJkICovCi17ICJpbmMiLAlGMygyLCAweDAwLCAxKSwJCSAgICBGMyh+MiwgfjB4MDAsIH4xKSwJCSAgICAgICAiaSxyIiwgRl9BTElBUywgdjggfSwJLyogYWRkIHJkLGltbSxyZCAqLwoteyAiaW5jY2MiLAlGMygyLCAweDEwLCAxKXxTSU1NMTMoMHgxKSwgRjMofjIsIH4weDEwLCB+MSl8U0lNTTEzKH4weDAwMDEpLCAiciIsIEZfQUxJQVMsIHY2IH0sCS8qIGFkZGNjIHJkLDEscmQgKi8KLXsgImluY2NjIiwJRjMoMiwgMHgxMCwgMSksCQkgICAgRjMofjIsIH4weDEwLCB+MSksCQkgICAgICAgImksciIsIEZfQUxJQVMsIHY4IH0sCS8qIGFkZGNjIHJkLGltbSxyZCAqLwotCi17ICJidHN0IiwJRjMoMiwgMHgxMSwgMCksIEYzKH4yLCB+MHgxMSwgfjApfFJEX0cwfEFTSSh+MCksICIxLDIiLCBGX0FMSUFTLCB2NiB9LAkvKiBhbmRjYyByczEscnMyLCVnMCAqLwoteyAiYnRzdCIsCUYzKDIsIDB4MTEsIDEpLCBGMyh+MiwgfjB4MTEsIH4xKXxSRF9HMCwgImksMSIsIEZfQUxJQVMsIHY2IH0sCS8qIGFuZGNjIHJzMSxpLCVnMCAqLwotCi17ICJuZWciLAlGMygyLCAweDA0LCAwKSwgRjMofjIsIH4weDA0LCB+MCl8UlMxX0cwfEFTSSh+MCksICIyLGQiLCBGX0FMSUFTLCB2NiB9LCAvKiBzdWIgJWcwLHJzMixyZCAqLwoteyAibmVnIiwJRjMoMiwgMHgwNCwgMCksIEYzKH4yLCB+MHgwNCwgfjApfFJTMV9HMHxBU0kofjApLCAiTyIsIEZfQUxJQVMsIHY2IH0sIC8qIHN1YiAlZzAscmQscmQgKi8KLQoteyAiYWRkIiwJRjMoMiwgMHgwMCwgMCksIEYzKH4yLCB+MHgwMCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhZGQiLAlGMygyLCAweDAwLCAxKSwgRjMofjIsIH4weDAwLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAiYWRkIiwJRjMoMiwgMHgwMCwgMSksIEYzKH4yLCB+MHgwMCwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLXsgImFkZGNjIiwJRjMoMiwgMHgxMCwgMCksIEYzKH4yLCB+MHgxMCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJhZGRjYyIsCUYzKDIsIDB4MTAsIDEpLCBGMyh+MiwgfjB4MTAsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJhZGRjYyIsCUYzKDIsIDB4MTAsIDEpLCBGMyh+MiwgfjB4MTAsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgImFkZHgiLAlGMygyLCAweDA4LCAwKSwgRjMofjIsIH4weDA4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkeCIsCUYzKDIsIDB4MDgsIDEpLCBGMyh+MiwgfjB4MDgsIH4xKSwJCSIxLGksZCIsIDAsIHY2bm90djkgfSwKLXsgImFkZHgiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiaSwxLGQiLCAwLCB2Nm5vdHY5IH0sCi17ICJhZGRjIiwJRjMoMiwgMHgwOCwgMCksIEYzKH4yLCB+MHgwOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJhZGRjIiwJRjMoMiwgMHgwOCwgMSksIEYzKH4yLCB+MHgwOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLXsgImFkZGMiLAlGMygyLCAweDA4LCAxKSwgRjMofjIsIH4weDA4LCB+MSksCQkiaSwxLGQiLCAwLCB2OSB9LAotCi17ICJhZGR4Y2MiLAlGMygyLCAweDE4LCAwKSwgRjMofjIsIH4weDE4LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkeGNjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJIjEsaSxkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkeGNjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJImksMSxkIiwgMCwgdjZub3R2OSB9LAoteyAiYWRkY2NjIiwJRjMoMiwgMHgxOCwgMCksIEYzKH4yLCB+MHgxOCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJhZGRjY2MiLAlGMygyLCAweDE4LCAxKSwgRjMofjIsIH4weDE4LCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoteyAiYWRkY2NjIiwJRjMoMiwgMHgxOCwgMSksIEYzKH4yLCB+MHgxOCwgfjEpLAkJImksMSxkIiwgMCwgdjkgfSwKLQoteyAic211bCIsCUYzKDIsIDB4MGIsIDApLCBGMyh+MiwgfjB4MGIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAic211bCIsCUYzKDIsIDB4MGIsIDEpLCBGMyh+MiwgfjB4MGIsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJzbXVsIiwJRjMoMiwgMHgwYiwgMSksIEYzKH4yLCB+MHgwYiwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInNtdWxjYyIsCUYzKDIsIDB4MWIsIDApLCBGMyh+MiwgfjB4MWIsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAic211bGNjIiwJRjMoMiwgMHgxYiwgMSksIEYzKH4yLCB+MHgxYiwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInNtdWxjYyIsCUYzKDIsIDB4MWIsIDEpLCBGMyh+MiwgfjB4MWIsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJ1bXVsIiwJRjMoMiwgMHgwYSwgMCksIEYzKH4yLCB+MHgwYSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJ1bXVsIiwJRjMoMiwgMHgwYSwgMSksIEYzKH4yLCB+MHgwYSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInVtdWwiLAlGMygyLCAweDBhLCAxKSwgRjMofjIsIH4weDBhLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAidW11bGNjIiwJRjMoMiwgMHgxYSwgMCksIEYzKH4yLCB+MHgxYSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY4IH0sCi17ICJ1bXVsY2MiLAlGMygyLCAweDFhLCAxKSwgRjMofjIsIH4weDFhLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAidW11bGNjIiwJRjMoMiwgMHgxYSwgMSksIEYzKH4yLCB+MHgxYSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInNkaXYiLAlGMygyLCAweDBmLCAwKSwgRjMofjIsIH4weDBmLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInNkaXYiLAlGMygyLCAweDBmLCAxKSwgRjMofjIsIH4weDBmLCB+MSksCQkiMSxpLGQiLCAwLCB2OCB9LAoteyAic2RpdiIsCUYzKDIsIDB4MGYsIDEpLCBGMyh+MiwgfjB4MGYsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi17ICJzZGl2Y2MiLAlGMygyLCAweDFmLCAwKSwgRjMofjIsIH4weDFmLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjggfSwKLXsgInNkaXZjYyIsCUYzKDIsIDB4MWYsIDEpLCBGMyh+MiwgfjB4MWYsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJzZGl2Y2MiLAlGMygyLCAweDFmLCAxKSwgRjMofjIsIH4weDFmLCB+MSksCQkiaSwxLGQiLCAwLCB2OCB9LAoteyAidWRpdiIsCUYzKDIsIDB4MGUsIDApLCBGMyh+MiwgfjB4MGUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAidWRpdiIsCUYzKDIsIDB4MGUsIDEpLCBGMyh+MiwgfjB4MGUsIH4xKSwJCSIxLGksZCIsIDAsIHY4IH0sCi17ICJ1ZGl2IiwJRjMoMiwgMHgwZSwgMSksIEYzKH4yLCB+MHgwZSwgfjEpLAkJImksMSxkIiwgMCwgdjggfSwKLXsgInVkaXZjYyIsCUYzKDIsIDB4MWUsIDApLCBGMyh+MiwgfjB4MWUsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCB2OCB9LAoteyAidWRpdmNjIiwJRjMoMiwgMHgxZSwgMSksIEYzKH4yLCB+MHgxZSwgfjEpLAkJIjEsaSxkIiwgMCwgdjggfSwKLXsgInVkaXZjYyIsCUYzKDIsIDB4MWUsIDEpLCBGMyh+MiwgfjB4MWUsIH4xKSwJCSJpLDEsZCIsIDAsIHY4IH0sCi0KLXsgIm11bHgiLAlGMygyLCAweDA5LCAwKSwgRjMofjIsIH4weDA5LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgIm11bHgiLAlGMygyLCAweDA5LCAxKSwgRjMofjIsIH4weDA5LCB+MSksCQkiMSxpLGQiLCAwLCB2OSB9LAoteyAic2RpdngiLAlGMygyLCAweDJkLCAwKSwgRjMofjIsIH4weDJkLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjkgfSwKLXsgInNkaXZ4IiwJRjMoMiwgMHgyZCwgMSksIEYzKH4yLCB+MHgyZCwgfjEpLAkJIjEsaSxkIiwgMCwgdjkgfSwKLXsgInVkaXZ4IiwJRjMoMiwgMHgwZCwgMCksIEYzKH4yLCB+MHgwZCwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY5IH0sCi17ICJ1ZGl2eCIsCUYzKDIsIDB4MGQsIDEpLCBGMyh+MiwgfjB4MGQsIH4xKSwJCSIxLGksZCIsIDAsIHY5IH0sCi0KLXsgImNhbGwiLAlGMSgweDEpLCBGMSh+MHgxKSwgIkwiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjEoMHgxKSwgRjEofjB4MSksICJMLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi0KLXsgImNhbGwiLAlGMygyLCAweDM4LCAwKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4wKXxSRCh+MHhmKXxBU0kofjApLAkiMSsyIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStyczIsJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMCl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MCl8UkQofjB4Zil8QVNJKH4wKSwJIjErMiwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSV9SUzIofjApLAkiMSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErJWcwLCVvNyAqLwoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDApfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjApfFJEKH4weGYpfEFTSV9SUzIofjApLAkiMSwjIiwgRl9KU1J8Rl9ERUxBWUVELCB2NiB9LAoteyAiY2FsbCIsCUYzKDIsIDB4MzgsIDEpfFJEKDB4ZiksIEYzKH4yLCB+MHgzOCwgfjEpfFJEKH4weGYpLAkJIjEraSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczEraSwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSIxK2ksIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKSwJCSJpKzEiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgaStyczEsJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4ZiksCQkiaSsxLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8UlMxX0cwLAkiaSIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCAlZzAraSwlbzcgKi8KLXsgImNhbGwiLAlGMygyLCAweDM4LCAxKXxSRCgweGYpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRCh+MHhmKXxSUzFfRzAsCSJpLCMiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8U0lNTTEzKH4wKSwJIjEiLCBGX0pTUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxKzAsJW83ICovCi17ICJjYWxsIiwJRjMoMiwgMHgzOCwgMSl8UkQoMHhmKSwgRjMofjIsIH4weDM4LCB+MSl8UkQofjB4Zil8U0lNTTEzKH4wKSwJIjEsIyIsIEZfSlNSfEZfREVMQVlFRCwgdjYgfSwKLQotCi0vKiBDb25kaXRpb25hbCBpbnN0cnVjdGlvbnMuCi0KLSAgIEJlY2F1c2UgdGhpcyBwYXJ0IG9mIHRoZSB0YWJsZSB3YXMgc3VjaCBhIG1lc3MgZWFybGllciwgSSBoYXZlCi0gICBtYWNyb2ZpZWQgaXQgc28gdGhhdCBhbGwgdGhlIGJyYW5jaGVzIGFuZCB0cmFwcyBhcmUgZ2VuZXJhdGVkIGZyb20KLSAgIGEgc2luZ2xlLWxpbmUgZGVzY3JpcHRpb24gb2YgZWFjaCBjb25kaXRpb24gdmFsdWUuICBKb2huIEdpbG1vcmUuICovCi0KLS8qIERlZmluZSBicmFuY2hlcyAtLSBvbmUgYW5udWxsZWQsIG9uZSB3aXRob3V0LCBldGMuICovCi0jZGVmaW5lIGJyKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICAgICAgICIsYSBsIiwgICAoZmxhZ3MpLCB2NiB9LCBcCi0geyBvcGNvZGUsIChtYXNrKSAgICAgICwgKGxvc2UpfEFOTlVMLCAibCIsICAgICAoZmxhZ3MpLCB2NiB9Ci0KLSNkZWZpbmUgYnJ4KG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIC8qIHY5ICovIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIlosRyIsICAgICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiLFQgWixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSBaLEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwyMCl8QlBSRUR8QU5OVUwsIChsb3NlKSwgIixhLFQgWixHIiwgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8KDI8PDIwKSwgQU5OVUx8QlBSRUR8KGxvc2UpLCAiLE4gWixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MjApfEFOTlVMLCBCUFJFRHwobG9zZSksICIsYSxOIFosRyIsIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVELCBBTk5VTHwobG9zZSl8KDI8PDIwKSwgInosRyIsICAgICAgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKXwoMjw8MjApLCAiLFQgeixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpfCgyPDwyMCksICIsYSB6LEciLCAgIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSl8KDI8PDIwKSwgIixhLFQgeixHIiwgKGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfEJQUkVEfChsb3NlKXwoMjw8MjApLCAiLE4geixHIiwgICAoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxBTk5VTCwgQlBSRUR8KGxvc2UpfCgyPDwyMCksICIsYSxOIHosRyIsIChmbGFncyksIHY5IH0KLQotLyogRGVmaW5lIGZvdXIgdHJhcHM6IHJlZytyZWcsIHJlZyArIGltbWVkaWF0ZSwgaW1tZWRpYXRlIGFsb25lLCByZWcgYWxvbmUuICovCi0jZGVmaW5lIHRyKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MpIFwKLSB7IG9wY29kZSwgKG1hc2spfCgyPDwxMSl8SU1NRUQsIChsb3NlKXxSUzFfRzAsCSJaLGkiLCAgIChmbGFncyksIHY5IH0sIC8qICVnMCArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpfElNTUVELCAobG9zZSksCSJaLDEraSIsIChmbGFncyksIHY5IH0sIC8qIHJzMSArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpLCBJTU1FRHwobG9zZSksCSJaLDErMiIsIChmbGFncyksIHY5IH0sIC8qIHJzMSArIHJzMiAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXwoMjw8MTEpLCBJTU1FRHwobG9zZSl8UlMyX0cwLAkiWiwxIiwgICAoZmxhZ3MpLCB2OSB9LCAvKiByczEgKyAlZzAgKi8gXAotIHsgb3Bjb2RlLCAobWFzayl8SU1NRUQsIChsb3NlKXxSUzFfRzAsCSJ6LGkiLCAgIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogJWcwICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spfElNTUVELCAobG9zZSksCSJ6LDEraSIsIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogcnMxICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSksCSJ6LDErMiIsIChmbGFncyl8Rl9BTElBUywgdjkgfSwgLyogcnMxICsgcnMyICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSl8UlMyX0cwLAkieiwxIiwgICAoZmxhZ3MpfEZfQUxJQVMsIHY5IH0sIC8qIHJzMSArICVnMCAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpfFJTMV9HMCwJCSJpIiwgICAgIChmbGFncyksIHY2IH0sIC8qICVnMCArIGltbSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxJTU1FRCwgKGxvc2UpLAkJIjEraSIsICAgKGZsYWdzKSwgdjYgfSwgLyogcnMxICsgaW1tICovIFwKLSB7IG9wY29kZSwgKG1hc2spLCBJTU1FRHwobG9zZSksCQkiMSsyIiwgICAoZmxhZ3MpLCB2NiB9LCAvKiByczEgKyByczIgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIElNTUVEfChsb3NlKXxSUzJfRzAsCQkiMSIsICAgICAoZmxhZ3MpLCB2NiB9IC8qIHJzMSArICVnMCAqLwotCi0vKiB2OTogV2UgbXVzdCBwdXQgYGJyeCcgYmVmb3JlIGBicicsIHRvIGVuc3VyZSB0aGF0IHdlIG5ldmVyIG1hdGNoIHNvbWV0aGluZwotICAgdjk6IGFnYWluc3QgYW4gZXhwcmVzc2lvbiB1bmxlc3MgaXQgaXMgYW4gZXhwcmVzc2lvbi4gIE90aGVyd2lzZSwgd2UgZW5kCi0gICB2OTogdXAgd2l0aCB1bmRlZmluZWQgc3ltYm9sIHRhYmxlcyBlbnRyaWVzLCBiZWNhdXNlIHRoZXkgZ2V0IGFkZGVkLCBidXQKLSAgIHY5OiBhcmUgbm90IGRlbGV0ZWQgaWYgdGhlIHBhdHRlcm4gZmFpbHMgdG8gbWF0Y2guICAqLwotCi0vKiBEZWZpbmUgYm90aCBicmFuY2hlcyBhbmQgdHJhcHMgYmFzZWQgb24gY29uZGl0aW9uIG1hc2sgKi8KLSNkZWZpbmUgY29uZChib3AsIHRvcCwgbWFzaywgZmxhZ3MpIFwKLSAgYnJ4KGJvcCwgRjIoMCwgMSl8KG1hc2spLCBGMih+MCwgfjEpfCgofm1hc2spJkNPTkQofjApKSwgRl9ERUxBWUVEfChmbGFncykpLCAvKiB2OSAqLyBcCi0gIGJyKGJvcCwgIEYyKDAsIDIpfChtYXNrKSwgRjIofjAsIH4yKXwoKH5tYXNrKSZDT05EKH4wKSksIEZfREVMQVlFRHwoZmxhZ3MpKSwgXAotICB0cih0b3AsICBGMygyLCAweDNhLCAwKXwobWFzayksIEYzKH4yLCB+MHgzYSwgMCl8KCh+bWFzaykmQ09ORCh+MCkpLCAoKGZsYWdzKSAmIH4oRl9VTkJSfEZfQ09OREJSKSkpCi0KLS8qIERlZmluZSBhbGwgdGhlIGNvbmRpdGlvbnMsIGFsbCB0aGUgYnJhbmNoZXMsIGFsbCB0aGUgdHJhcHMuICAqLwotCi0vKiBTdGFuZGFyZCBicmFuY2gsIHRyYXAgbW5lbW9uaWNzICovCi1jb25kICgiYiIsCSJ0YSIsICAgQ09OREEsIEZfVU5CUiksCi0vKiBBbHRlcm5hdGl2ZSBmb3JtIChqdXN0IGZvciBhc3NlbWJseSwgbm90IGZvciBkaXNhc3NlbWJseSkgKi8KLWNvbmQgKCJiYSIsCSJ0IiwgICAgQ09OREEsIEZfVU5CUnxGX0FMSUFTKSwKLQotY29uZCAoImJjYyIsCSJ0Y2MiLCAgQ09ORENDLCBGX0NPTkRCUiksCi1jb25kICgiYmNzIiwJInRjcyIsICBDT05EQ1MsIEZfQ09OREJSKSwKLWNvbmQgKCJiZSIsCSJ0ZSIsICAgQ09OREUsIEZfQ09OREJSKSwKLWNvbmQgKCJiZXEiLAkidGVxIiwgIENPTkRFLCBGX0NPTkRCUnxGX0FMSUFTKSwKLWNvbmQgKCJiZyIsCSJ0ZyIsICAgQ09OREcsIEZfQ09OREJSKSwKLWNvbmQgKCJiZ3QiLAkidGd0IiwgIENPTkRHLCBGX0NPTkRCUnxGX0FMSUFTKSwKLWNvbmQgKCJiZ2UiLAkidGdlIiwgIENPTkRHRSwgRl9DT05EQlIpLAotY29uZCAoImJnZXUiLAkidGdldSIsIENPTkRHRVUsIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgY2MgKi8KLWNvbmQgKCJiZ3UiLAkidGd1IiwgIENPTkRHVSwgRl9DT05EQlIpLAotY29uZCAoImJsIiwJInRsIiwgICBDT05ETCwgRl9DT05EQlIpLAotY29uZCAoImJsdCIsCSJ0bHQiLCAgQ09OREwsIEZfQ09OREJSfEZfQUxJQVMpLAotY29uZCAoImJsZSIsCSJ0bGUiLCAgQ09ORExFLCBGX0NPTkRCUiksCi1jb25kICgiYmxldSIsCSJ0bGV1IiwgQ09ORExFVSwgRl9DT05EQlIpLAotY29uZCAoImJsdSIsCSJ0bHUiLCAgQ09ORExVLCBGX0NPTkRCUnxGX0FMSUFTKSwgLyogZm9yIGNzICovCi1jb25kICgiYm4iLAkidG4iLCAgIENPTkROLCBGX0NPTkRCUiksCi1jb25kICgiYm5lIiwJInRuZSIsICBDT05ETkUsIEZfQ09OREJSKSwKLWNvbmQgKCJibmVnIiwJInRuZWciLCBDT05ETkVHLCBGX0NPTkRCUiksCi1jb25kICgiYm56IiwJInRueiIsICBDT05ETlosIEZfQ09OREJSfEZfQUxJQVMpLCAvKiBmb3IgbmUgKi8KLWNvbmQgKCJicG9zIiwJInRwb3MiLCBDT05EUE9TLCBGX0NPTkRCUiksCi1jb25kICgiYnZjIiwJInR2YyIsICBDT05EVkMsIEZfQ09OREJSKSwKLWNvbmQgKCJidnMiLAkidHZzIiwgIENPTkRWUywgRl9DT05EQlIpLAotY29uZCAoImJ6IiwJInR6IiwgICBDT05EWiwgRl9DT05EQlJ8Rl9BTElBUyksIC8qIGZvciBlICovCi0KLSN1bmRlZiBjb25kCi0jdW5kZWYgYnIKLSN1bmRlZiBicnIgLyogdjkgKi8KLSN1bmRlZiB0cgotCi0jZGVmaW5lIGJycihvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRCwgQU5OVUx8KGxvc2UpLCAiMSxrIiwgICAgICBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QlBSRUQsIEFOTlVMfChsb3NlKSwgIixUIDEsayIsICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEJQUkVEfEFOTlVMLCAobG9zZSksICIsYSAxLGsiLCAgIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9LCBcCi0geyBvcGNvZGUsIChtYXNrKXxCUFJFRHxBTk5VTCwgKGxvc2UpLCAiLGEsVCAxLGsiLCBGX0RFTEFZRUR8KGZsYWdzKSwgdjkgfSwgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfEJQUkVEfChsb3NlKSwgIixOIDEsayIsICAgRl9ERUxBWUVEfChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCBCUFJFRHwobG9zZSksICIsYSxOIDEsayIsIEZfREVMQVlFRHwoZmxhZ3MpLCB2OSB9Ci0KLSNkZWZpbmUgY29uZHIoYm9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotICBicnIoYm9wLCBGMigwLCAzKXxDT05EKG1hc2spLCBGMih+MCwgfjMpfENPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCi0KLS8qIHY5ICovIGNvbmRyKCJicm56IiwgMHg1LCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJ6IiwgMHgxLCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJnZXoiLCAweDcsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicmx6IiwgMHgzLCBGX0NPTkRCUiksCi0vKiB2OSAqLyBjb25kcigiYnJsZXoiLCAweDIsIEZfQ09OREJSKSwKLS8qIHY5ICovIGNvbmRyKCJicmd6IiwgMHg2LCBGX0NPTkRCUiksCi0KLSN1bmRlZiBjb25kciAvKiB2OSAqLwotI3VuZGVmIGJyciAvKiB2OSAqLwotCi0jZGVmaW5lIG1vdnIob3Bjb2RlLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCBGMygyLCAweDJmLCAwKXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDJmLCB+MCl8UkNPTkQofihtYXNrKSksICIxLDIsZCIsIChmbGFncyksIHY5IH0sIFwKLSB7IG9wY29kZSwgRjMoMiwgMHgyZiwgMSl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgyZiwgfjEpfFJDT05EKH4obWFzaykpLCAiMSxqLGQiLCAoZmxhZ3MpLCB2OSB9Ci0KLSNkZWZpbmUgZm1ycnMob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsZixnIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KLSNkZWZpbmUgZm1ycmQob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsQixIIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KLSNkZWZpbmUgZm1ycnEob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgLyogdjkgKi8gXAotIHsgb3Bjb2RlLCAobWFzayksIChsb3NlKSwgIjEsUixKIiwgKGZsYWdzKSB8IEZfRkxPQVQsIHY5IH0KLQotI2RlZmluZSBmbW92cnMobW9wLCBtYXNrLCBmbGFncykgLyogdjkgKi8gXAotICBmbXJycyhtb3AsIEYzKDIsIDB4MzUsIDApfE9QRl9MT1c1KDUpfFJDT05EKG1hc2spLCBGMyh+MiwgfjB4MzUsIDApfE9QRl9MT1c1KH41KXxSQ09ORCh+KG1hc2spKSwgKGZsYWdzKSkgLyogdjkgKi8KLSNkZWZpbmUgZm1vdnJkKG1vcCwgbWFzaywgZmxhZ3MpIC8qIHY5ICovIFwKLSAgZm1ycmQobW9wLCBGMygyLCAweDM1LCAwKXxPUEZfTE9XNSg2KXxSQ09ORChtYXNrKSwgRjMofjIsIH4weDM1LCAwKXxPUEZfTE9XNSh+Nil8UkNPTkQofihtYXNrKSksIChmbGFncykpIC8qIHY5ICovCi0jZGVmaW5lIGZtb3ZycShtb3AsIG1hc2ssIGZsYWdzKSAvKiB2OSAqLyBcCi0gIGZtcnJxKG1vcCwgRjMoMiwgMHgzNSwgMCl8T1BGX0xPVzUoNyl8UkNPTkQobWFzayksIEYzKH4yLCB+MHgzNSwgMCl8T1BGX0xPVzUofjcpfFJDT05EKH4obWFzaykpLCAoZmxhZ3MpKSAvKiB2OSAqLwotCi0vKiB2OSAqLyBtb3ZyKCJtb3ZybmUiLCAweDUsIDApLAotLyogdjkgKi8gbW92cigibW92cmUiLCAweDEsIDApLAotLyogdjkgKi8gbW92cigibW92cmdleiIsIDB4NywgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZybHoiLCAweDMsIDApLAotLyogdjkgKi8gbW92cigibW92cmxleiIsIDB4MiwgMCksCi0vKiB2OSAqLyBtb3ZyKCJtb3ZyZ3oiLCAweDYsIDApLAotLyogdjkgKi8gbW92cigibW92cm56IiwgMHg1LCBGX0FMSUFTKSwKLS8qIHY5ICovIG1vdnIoIm1vdnJ6IiwgMHgxLCBGX0FMSUFTKSwKLQotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNuZSIsIDB4NSwgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2UiLCAweDEsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNnZXoiLCAweDcsIDApLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnNseiIsIDB4MywgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2xleiIsIDB4MiwgMCksCi0vKiB2OSAqLyBmbW92cnMoImZtb3Zyc2d6IiwgMHg2LCAwKSwKLS8qIHY5ICovIGZtb3ZycygiZm1vdnJzbnoiLCAweDUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdnJzKCJmbW92cnN6IiwgMHgxLCBGX0FMSUFTKSwKLQotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRuZSIsIDB4NSwgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGUiLCAweDEsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRnZXoiLCAweDcsIDApLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmRseiIsIDB4MywgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGxleiIsIDB4MiwgMCksCi0vKiB2OSAqLyBmbW92cmQoImZtb3ZyZGd6IiwgMHg2LCAwKSwKLS8qIHY5ICovIGZtb3ZyZCgiZm1vdnJkbnoiLCAweDUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdnJkKCJmbW92cmR6IiwgMHgxLCBGX0FMSUFTKSwKLQotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFuZSIsIDB4NSwgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWUiLCAweDEsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFnZXoiLCAweDcsIDApLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnFseiIsIDB4MywgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWxleiIsIDB4MiwgMCksCi0vKiB2OSAqLyBmbW92cnEoImZtb3ZycWd6IiwgMHg2LCAwKSwKLS8qIHY5ICovIGZtb3ZycSgiZm1vdnJxbnoiLCAweDUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdnJxKCJmbW92cnF6IiwgMHgxLCBGX0FMSUFTKSwKLQotI3VuZGVmIG1vdnIgLyogdjkgKi8KLSN1bmRlZiBmbW92ciAvKiB2OSAqLwotI3VuZGVmIGZtcnIgLyogdjkgKi8KLQotI2RlZmluZSBtb3ZpY2Mob3Bjb2RlLCBjb25kLCBmbGFncykgLyogdjkgKi8gXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8TUNPTkQoY29uZCwxKXxJQ0MsIEYzKH4yLCB+MHgyYywgfjApfE1DT05EKH5jb25kLH4xKXxYQ0N8KDE8PDExKSwgInosMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfE1DT05EKGNvbmQsMSl8SUNDLCBGMyh+MiwgfjB4MmMsIH4xKXxNQ09ORCh+Y29uZCx+MSl8WENDfCgxPDwxMSksICJ6LEksZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxNQ09ORChjb25kLDEpfFhDQywgRjMofjIsIH4weDJjLCB+MCl8TUNPTkQofmNvbmQsfjEpfCgxPDwxMSksICAgICAiWiwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8TUNPTkQoY29uZCwxKXxYQ0MsIEYzKH4yLCB+MHgyYywgfjEpfE1DT05EKH5jb25kLH4xKXwoMTw8MTEpLCAgICAgIlosSSxkIiwgZmxhZ3MsIHY5IH0KLQotI2RlZmluZSBtb3ZmY2Mob3Bjb2RlLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygwKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjApfEYzKH4yLCB+MHgyYywgfjApLCAiNiwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDApfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+MCl8RjMofjIsIH4weDJjLCB+MSksICI2LEksZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAwKXxGQ0MoMSl8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4xKXxGMyh+MiwgfjB4MmMsIH4wKSwgIjcsMixkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDEpfEZDQygxKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjEpfEYzKH4yLCB+MHgyYywgfjEpLCAiNyxJLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMCl8RkNDKDIpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Mil8RjMofjIsIH4weDJjLCB+MCksICI4LDIsZCIsIGZsYWdzLCB2OSB9LCBcCi0gIHsgb3Bjb2RlLCBGMygyLCAweDJjLCAxKXxGQ0MoMil8TUNPTkQoZmNvbmQsMCksIE1DT05EKH5mY29uZCx+MCl8RkNDKH4yKXxGMyh+MiwgfjB4MmMsIH4xKSwgIjgsSSxkIiwgZmxhZ3MsIHY5IH0sIFwKLSAgeyBvcGNvZGUsIEYzKDIsIDB4MmMsIDApfEZDQygzKXxNQ09ORChmY29uZCwwKSwgTUNPTkQofmZjb25kLH4wKXxGQ0MofjMpfEYzKH4yLCB+MHgyYywgfjApLCAiOSwyLGQiLCBmbGFncywgdjkgfSwgXAotICB7IG9wY29kZSwgRjMoMiwgMHgyYywgMSl8RkNDKDMpfE1DT05EKGZjb25kLDApLCBNQ09ORCh+ZmNvbmQsfjApfEZDQyh+Myl8RjMofjIsIH4weDJjLCB+MSksICI5LEksZCIsIGZsYWdzLCB2OSB9Ci0KLSNkZWZpbmUgbW92Y2Mob3Bjb2RlLCBjb25kLCBmY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLSAgbW92ZmNjIChvcGNvZGUsIGZjb25kLCBmbGFncyksIC8qIHY5ICovIFwKLSAgbW92aWNjIChvcGNvZGUsIGNvbmQsIGZsYWdzKSAvKiB2OSAqLwotCi0vKiB2OSAqLyBtb3ZjYyAgKCJtb3ZhIiwJQ09OREEsIEZDT05EQSwgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZjYyIsCUNPTkRDQywgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3ZnZXUiLAlDT05ER0VVLCBGX0FMSUFTKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmNzIiwJQ09ORENTLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmx1IiwJQ09ORExVLCBGX0FMSUFTKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmUiLAlDT05ERSwgRkNPTkRFLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmciLAlDT05ERywgRkNPTkRHLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmdlIiwJQ09OREdFLCBGQ09OREdFLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmd1IiwJQ09OREdVLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmwiLAlDT05ETCwgRkNPTkRMLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdmxlIiwJQ09ORExFLCBGQ09ORExFLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdmxldSIsCUNPTkRMRVUsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92bGciLAlGQ09ORExHLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdm4iLAlDT05ETiwgRkNPTkROLCAwKSwKLS8qIHY5ICovIG1vdmNjICAoIm1vdm5lIiwJQ09ORE5FLCBGQ09ORE5FLCAwKSwKLS8qIHY5ICovIG1vdmljYyAoIm1vdm5lZyIsCUNPTkRORUcsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92bnoiLAlDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAotLyogdjkgKi8gbW92ZmNjICgibW92byIsCUZDT05ETywgMCksCi0vKiB2OSAqLyBtb3ZpY2MgKCJtb3Zwb3MiLAlDT05EUE9TLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnUiLAlGQ09ORFUsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWUiLAlGQ09ORFVFLCAwKSwKLS8qIHY5ICovIG1vdmZjYyAoIm1vdnVnIiwJRkNPTkRVRywgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1Z2UiLAlGQ09ORFVHRSwgMCksCi0vKiB2OSAqLyBtb3ZmY2MgKCJtb3Z1bCIsCUZDT05EVUwsIDApLAotLyogdjkgKi8gbW92ZmNjICgibW92dWxlIiwJRkNPTkRVTEUsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92dmMiLAlDT05EVkMsIDApLAotLyogdjkgKi8gbW92aWNjICgibW92dnMiLAlDT05EVlMsIDApLAotLyogdjkgKi8gbW92Y2MgICgibW92eiIsCUNPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAotCi0jdW5kZWYgbW92aWNjIC8qIHY5ICovCi0jdW5kZWYgbW92ZmNjIC8qIHY5ICovCi0jdW5kZWYgbW92Y2MgLyogdjkgKi8KLQotI2RlZmluZSBGTV9TRiAxCQkvKiB2OSAtIHZhbHVlcyBmb3IgZnBzaXplICovCi0jZGVmaW5lIEZNX0RGIDIJCS8qIHY5ICovCi0jZGVmaW5lIEZNX1FGIDMJCS8qIHY5ICovCi0KLSNkZWZpbmUgZm1vdmljYyhvcGNvZGUsIGZwc2l6ZSwgY29uZCwgZmxhZ3MpIC8qIHY5ICovIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgxMDArZnBzaXplKXxNQ09ORChjb25kLDApLCAgRjNGKH4yLCB+MHgzNSwgfigweDEwMCtmcHNpemUpKXxNQ09ORCh+Y29uZCx+MCksICAieixmLGciLCBmbGFncywgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDE4MCtmcHNpemUpfE1DT05EKGNvbmQsMCksICBGM0YofjIsIH4weDM1LCB+KDB4MTgwK2Zwc2l6ZSkpfE1DT05EKH5jb25kLH4wKSwgICJaLGYsZyIsIGZsYWdzLCB2OSB9Ci0KLSNkZWZpbmUgZm1vdmZjYyhvcGNvZGUsIGZwc2l6ZSwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDAwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwMDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjYsZixnIiwgZmxhZ3MsIHY5IH0sIFwKLXsgb3Bjb2RlLCBGM0YoMiwgMHgzNSwgMHgwNDArZnBzaXplKXxNQ09ORChmY29uZCwwKSwgRjNGKH4yLCB+MHgzNSwgfigweDA0MCtmcHNpemUpKXxNQ09ORCh+ZmNvbmQsfjApLCAiNyxmLGciLCBmbGFncywgdjkgfSwgXAoteyBvcGNvZGUsIEYzRigyLCAweDM1LCAweDA4MCtmcHNpemUpfE1DT05EKGZjb25kLDApLCBGM0YofjIsIH4weDM1LCB+KDB4MDgwK2Zwc2l6ZSkpfE1DT05EKH5mY29uZCx+MCksICI4LGYsZyIsIGZsYWdzLCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MGMwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwYzArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjksZixnIiwgZmxhZ3MsIHY5IH0KLQotLyogRklYTUU6IHVzZSBmbW92aWNjL2Ztb3ZmY2M/ICovIC8qIHY5ICovCi0jZGVmaW5lIGZtb3ZjYyhvcGNvZGUsIGZwc2l6ZSwgY29uZCwgZmNvbmQsIGZsYWdzKSAvKiB2OSAqLyBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTAwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxMDArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgInosZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDAwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwMDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjYsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MTgwK2Zwc2l6ZSl8TUNPTkQoY29uZCwwKSwgIEYzRih+MiwgfjB4MzUsIH4oMHgxODArZnBzaXplKSl8TUNPTkQofmNvbmQsfjApLCAgIlosZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDQwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwNDArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjcsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MDgwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwODArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjgsZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9LCBcCi17IG9wY29kZSwgRjNGKDIsIDB4MzUsIDB4MGMwK2Zwc2l6ZSl8TUNPTkQoZmNvbmQsMCksIEYzRih+MiwgfjB4MzUsIH4oMHgwYzArZnBzaXplKSl8TUNPTkQofmZjb25kLH4wKSwgIjksZixnIiwgZmxhZ3MgfCBGX0ZMT0FULCB2OSB9Ci0KLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGEiLAlGTV9ERiwgQ09OREEsIEZDT05EQSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFhIiwJRk1fUUYsIENPTkRBLCBGQ09OREEsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzYSIsCUZNX1NGLCBDT05EQSwgRkNPTkRBLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGNjIiwJRk1fREYsIENPTkRDQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFjYyIsCUZNX1FGLCBDT05EQ0MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzY2MiLAlGTV9TRiwgQ09ORENDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGNzIiwJRk1fREYsIENPTkRDUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFjcyIsCUZNX1FGLCBDT05EQ1MsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzY3MiLAlGTV9TRiwgQ09ORENTLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGUiLAlGTV9ERiwgQ09OREUsIEZDT05ERSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFlIiwJRk1fUUYsIENPTkRFLCBGQ09OREUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZSIsCUZNX1NGLCBDT05ERSwgRkNPTkRFLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGciLAlGTV9ERiwgQ09OREcsIEZDT05ERywgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFnIiwJRk1fUUYsIENPTkRHLCBGQ09OREcsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZyIsCUZNX1NGLCBDT05ERywgRkNPTkRHLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGdlIiwJRk1fREYsIENPTkRHRSwgRkNPTkRHRSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFnZSIsCUZNX1FGLCBDT05ER0UsIEZDT05ER0UsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzZ2UiLAlGTV9TRiwgQ09OREdFLCBGQ09OREdFLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGdldSIsCUZNX0RGLCBDT05ER0VVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWdldSIsCUZNX1FGLCBDT05ER0VVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2dldSIsCUZNX1NGLCBDT05ER0VVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGd1IiwJRk1fREYsIENPTkRHVSwgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFndSIsCUZNX1FGLCBDT05ER1UsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzZ3UiLAlGTV9TRiwgQ09OREdVLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGwiLAlGTV9ERiwgQ09OREwsIEZDT05ETCwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFsIiwJRk1fUUYsIENPTkRMLCBGQ09OREwsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbCIsCUZNX1NGLCBDT05ETCwgRkNPTkRMLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZGxlIiwJRk1fREYsIENPTkRMRSwgRkNPTkRMRSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFsZSIsCUZNX1FGLCBDT05ETEUsIEZDT05ETEUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbGUiLAlGTV9TRiwgQ09ORExFLCBGQ09ORExFLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGxldSIsCUZNX0RGLCBDT05ETEVVLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cWxldSIsCUZNX1FGLCBDT05ETEVVLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c2xldSIsCUZNX1NGLCBDT05ETEVVLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZGxnIiwJRk1fREYsIEZDT05ETEcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxbGciLAlGTV9RRiwgRkNPTkRMRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnNsZyIsCUZNX1NGLCBGQ09ORExHLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZGx1IiwJRk1fREYsIENPTkRMVSwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnFsdSIsCUZNX1FGLCBDT05ETFUsIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzbHUiLAlGTV9TRiwgQ09ORExVLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG4iLAlGTV9ERiwgQ09ORE4sIEZDT05ETiwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFuIiwJRk1fUUYsIENPTkROLCBGQ09ORE4sIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbiIsCUZNX1NGLCBDT05ETiwgRkNPTkROLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG5lIiwJRk1fREYsIENPTkRORSwgRkNPTkRORSwgMCksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFuZSIsCUZNX1FGLCBDT05ETkUsIEZDT05ETkUsIDApLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbmUiLAlGTV9TRiwgQ09ORE5FLCBGQ09ORE5FLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZG5lZyIsCUZNX0RGLCBDT05ETkVHLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cW5lZyIsCUZNX1FGLCBDT05ETkVHLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c25lZyIsCUZNX1NGLCBDT05ETkVHLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZG56IiwJRk1fREYsIENPTkROWiwgRkNPTkROWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnFueiIsCUZNX1FGLCBDT05ETlosIEZDT05ETlosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzbnoiLAlGTV9TRiwgQ09ORE5aLCBGQ09ORE5aLCBGX0FMSUFTKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZG8iLAlGTV9ERiwgRkNPTkRPLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cW8iLAlGTV9RRiwgRkNPTkRPLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c28iLAlGTV9TRiwgRkNPTkRPLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHBvcyIsCUZNX0RGLCBDT05EUE9TLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92cXBvcyIsCUZNX1FGLCBDT05EUE9TLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92c3BvcyIsCUZNX1NGLCBDT05EUE9TLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHUiLAlGTV9ERiwgRkNPTkRVLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92cXUiLAlGTV9RRiwgRkNPTkRVLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92c3UiLAlGTV9TRiwgRkNPTkRVLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVlIiwJRk1fREYsIEZDT05EVUUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWUiLAlGTV9RRiwgRkNPTkRVRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1ZSIsCUZNX1NGLCBGQ09ORFVFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVnIiwJRk1fREYsIEZDT05EVUcsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWciLAlGTV9RRiwgRkNPTkRVRywgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1ZyIsCUZNX1NGLCBGQ09ORFVHLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVnZSIsCUZNX0RGLCBGQ09ORFVHRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1Z2UiLAlGTV9RRiwgRkNPTkRVR0UsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWdlIiwJRk1fU0YsIEZDT05EVUdFLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVsIiwJRk1fREYsIEZDT05EVUwsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZxdWwiLAlGTV9RRiwgRkNPTkRVTCwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnN1bCIsCUZNX1NGLCBGQ09ORFVMLCAwKSwKLS8qIHY5ICovIGZtb3ZmY2MgKCJmbW92ZHVsZSIsCUZNX0RGLCBGQ09ORFVMRSwgMCksCi0vKiB2OSAqLyBmbW92ZmNjICgiZm1vdnF1bGUiLAlGTV9RRiwgRkNPTkRVTEUsIDApLAotLyogdjkgKi8gZm1vdmZjYyAoImZtb3ZzdWxlIiwJRk1fU0YsIEZDT05EVUxFLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHZjIiwJRk1fREYsIENPTkRWQywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnF2YyIsCUZNX1FGLCBDT05EVkMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzdmMiLAlGTV9TRiwgQ09ORFZDLCAwKSwKLS8qIHY5ICovIGZtb3ZpY2MgKCJmbW92ZHZzIiwJRk1fREYsIENPTkRWUywgMCksCi0vKiB2OSAqLyBmbW92aWNjICgiZm1vdnF2cyIsCUZNX1FGLCBDT05EVlMsIDApLAotLyogdjkgKi8gZm1vdmljYyAoImZtb3ZzdnMiLAlGTV9TRiwgQ09ORFZTLCAwKSwKLS8qIHY5ICovIGZtb3ZjYyAgKCJmbW92ZHoiLAlGTV9ERiwgQ09ORFosIEZDT05EWiwgRl9BTElBUyksCi0vKiB2OSAqLyBmbW92Y2MgICgiZm1vdnF6IiwJRk1fUUYsIENPTkRaLCBGQ09ORFosIEZfQUxJQVMpLAotLyogdjkgKi8gZm1vdmNjICAoImZtb3ZzeiIsCUZNX1NGLCBDT05EWiwgRkNPTkRaLCBGX0FMSUFTKSwKLQotI3VuZGVmIGZtb3ZpY2MgLyogdjkgKi8KLSN1bmRlZiBmbW92ZmNjIC8qIHY5ICovCi0jdW5kZWYgZm1vdmNjIC8qIHY5ICovCi0jdW5kZWYgRk1fREYgLyogdjkgKi8KLSN1bmRlZiBGTV9RRiAvKiB2OSAqLwotI3VuZGVmIEZNX1NGIC8qIHY5ICovCi0KLS8qIENvcHJvY2Vzc29yIGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgQ0JSKG9wY29kZSwgbWFzaywgbG9zZSwgZmxhZ3MsIGFyY2gpIFwKLSB7IG9wY29kZSwgKG1hc2spLCBBTk5VTHwobG9zZSksICJsIiwgICAgZmxhZ3N8Rl9ERUxBWUVELCBhcmNoIH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgZmxhZ3N8Rl9ERUxBWUVELCBhcmNoIH0KLQotLyogRmxvYXRpbmcgcG9pbnQgYnJhbmNoZXMuICAqLwotI2RlZmluZSBGQlIob3Bjb2RlLCBtYXNrLCBsb3NlLCBmbGFncykgXAotIHsgb3Bjb2RlLCAobWFzayksIEFOTlVMfChsb3NlKSwgImwiLCAgICBmbGFnc3xGX0RFTEFZRUR8Rl9GQlIsIHY2IH0sIFwKLSB7IG9wY29kZSwgKG1hc2spfEFOTlVMLCAobG9zZSksICIsYSBsIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2NiB9Ci0KLS8qIFY5IGV4dGVuZGVkIGZsb2F0aW5nIHBvaW50IGJyYW5jaGVzLiAgKi8KLSNkZWZpbmUgRkJSWChvcGNvZGUsIG1hc2ssIGxvc2UsIGZsYWdzKSAvKiB2OSAqLyBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjApfChsb3NlKSwgIjYsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjApfChsb3NlKSwgIixUIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjApfChsb3NlKSwgIixhIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjApfChsb3NlKSwgIixhLFQgNixHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjApfChsb3NlKSwgIixOIDYsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDApfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjApfChsb3NlKSwgIixhLE4gNixHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjEpfChsb3NlKSwgIjcsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjEpfChsb3NlKSwgIixUIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjEpfChsb3NlKSwgIixhIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjEpfChsb3NlKSwgIixhLFQgNyxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjEpfChsb3NlKSwgIixOIDcsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDEpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjEpfChsb3NlKSwgIixhLE4gNyxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjIpfChsb3NlKSwgIjgsRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjIpfChsb3NlKSwgIixUIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjIpfChsb3NlKSwgIixhIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjIpfChsb3NlKSwgIixhLFQgOCxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjIpfChsb3NlKSwgIixOIDgsRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDIpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjIpfChsb3NlKSwgIixhLE4gOCxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjMpfChsb3NlKSwgIjksRyIsICAgICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRCwgQU5OVUx8RkJGQ0MofjMpfChsb3NlKSwgIixUIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjMpfChsb3NlKSwgIixhIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxCUFJFRHxBTk5VTCwgRkJGQ0MofjMpfChsb3NlKSwgIixhLFQgOSxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKSwgQU5OVUx8QlBSRUR8RkJGQ0MofjMpfChsb3NlKSwgIixOIDksRyIsICAgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9LCBcCi0geyBvcGNvZGUsIEZCRkNDKDMpfChtYXNrKXxBTk5VTCwgQlBSRUR8RkJGQ0MofjMpfChsb3NlKSwgIixhLE4gOSxHIiwgZmxhZ3N8Rl9ERUxBWUVEfEZfRkJSLCB2OSB9Ci0KLS8qIHY5OiBXZSBtdXN0IHB1dCBgRkJSWCcgYmVmb3JlIGBGQlInLCB0byBlbnN1cmUgdGhhdCB3ZSBuZXZlciBtYXRjaAotICAgdjk6IHNvbWV0aGluZyBhZ2FpbnN0IGFuIGV4cHJlc3Npb24gdW5sZXNzIGl0IGlzIGFuIGV4cHJlc3Npb24uICBPdGhlcndpc2UsCi0gICB2OTogd2UgZW5kIHVwIHdpdGggdW5kZWZpbmVkIHN5bWJvbCB0YWJsZXMgZW50cmllcywgYmVjYXVzZSB0aGV5IGdldCBhZGRlZCwKLSAgIHY5OiBidXQgYXJlIG5vdCBkZWxldGVkIGlmIHRoZSBwYXR0ZXJuIGZhaWxzIHRvIG1hdGNoLiAgKi8KLQotI2RlZmluZSBDT05ERkMoZm9wLCBjb3AsIG1hc2ssIGZsYWdzKSBcCi0gIEZCUlgoZm9wLCBGMigwLCA1KXxDT05EKG1hc2spLCBGMih+MCwgfjUpfENPTkQofihtYXNrKSksIGZsYWdzKSwgLyogdjkgKi8gXAotICBGQlIoZm9wLCBGMigwLCA2KXxDT05EKG1hc2spLCBGMih+MCwgfjYpfENPTkQofihtYXNrKSksIGZsYWdzKSwgXAotICBDQlIoY29wLCBGMigwLCA3KXxDT05EKG1hc2spLCBGMih+MCwgfjcpfENPTkQofihtYXNrKSksIGZsYWdzLCB2Nm5vdGxldCkKLQotI2RlZmluZSBDT05ERkNMKGZvcCwgY29wLCBtYXNrLCBmbGFncykgXAotICBGQlJYKGZvcCwgRjIoMCwgNSl8Q09ORChtYXNrKSwgRjIofjAsIH41KXxDT05EKH4obWFzaykpLCBmbGFncyksIC8qIHY5ICovIFwKLSAgRkJSKGZvcCwgRjIoMCwgNil8Q09ORChtYXNrKSwgRjIofjAsIH42KXxDT05EKH4obWFzaykpLCBmbGFncyksIFwKLSAgQ0JSKGNvcCwgRjIoMCwgNyl8Q09ORChtYXNrKSwgRjIofjAsIH43KXxDT05EKH4obWFzaykpLCBmbGFncywgdjYpCi0KLSNkZWZpbmUgQ09OREYoZm9wLCBtYXNrLCBmbGFncykgXAotICBGQlJYKGZvcCwgRjIoMCwgNSl8Q09ORChtYXNrKSwgRjIofjAsIH41KXxDT05EKH4obWFzaykpLCBmbGFncyksIC8qIHY5ICovIFwKLSAgRkJSKGZvcCwgRjIoMCwgNil8Q09ORChtYXNrKSwgRjIofjAsIH42KXxDT05EKH4obWFzaykpLCBmbGFncykKLQotQ09OREZDICAoImZiIiwgICAgImNiIiwgICAgMHg4LCAwKSwKLUNPTkRGQ0wgKCJmYmEiLAkgICJjYmEiLCAgIDB4OCwgRl9BTElBUyksCi1DT05ERkMgICgiZmJlIiwJICAiY2IwIiwgICAweDksIDApLAotQ09OREYgICAoImZieiIsICAgICAgICAgICAgMHg5LCBGX0FMSUFTKSwKLUNPTkRGQyAgKCJmYmciLAkgICJjYjIiLCAgIDB4NiwgMCksCi1DT05ERkMgICgiZmJnZSIsICAiY2IwMiIsICAweGIsIDApLAotQ09OREZDICAoImZibCIsCSAgImNiMSIsICAgMHg0LCAwKSwKLUNPTkRGQyAgKCJmYmxlIiwgICJjYjAxIiwgIDB4ZCwgMCksCi1DT05ERkMgICgiZmJsZyIsICAiY2IxMiIsICAweDIsIDApLAotQ09OREZDTCAoImZibiIsCSAgImNibiIsICAgMHgwLCAwKSwKLUNPTkRGQyAgKCJmYm5lIiwgICJjYjEyMyIsIDB4MSwgMCksCi1DT05ERiAgICgiZmJueiIsICAgICAgICAgICAweDEsIEZfQUxJQVMpLAotQ09OREZDICAoImZibyIsCSAgImNiMDEyIiwgMHhmLCAwKSwKLUNPTkRGQyAgKCJmYnUiLAkgICJjYjMiLCAgIDB4NywgMCksCi1DT05ERkMgICgiZmJ1ZSIsICAiY2IwMyIsICAweGEsIDApLAotQ09OREZDICAoImZidWciLCAgImNiMjMiLCAgMHg1LCAwKSwKLUNPTkRGQyAgKCJmYnVnZSIsICJjYjAyMyIsIDB4YywgMCksCi1DT05ERkMgICgiZmJ1bCIsICAiY2IxMyIsICAweDMsIDApLAotQ09OREZDICAoImZidWxlIiwgImNiMDEzIiwgMHhlLCAwKSwKLQotI3VuZGVmIENPTkRGQwotI3VuZGVmIENPTkRGQ0wKLSN1bmRlZiBDT05ERgotI3VuZGVmIENCUgotI3VuZGVmIEZCUgotI3VuZGVmIEZCUlgJLyogdjkgKi8KLQoteyAiam1wIiwJRjMoMiwgMHgzOCwgMCksIEYzKH4yLCB+MHgzOCwgfjApfFJEX0cwfEFTSSh+MCksCSIxKzIiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMStyczIsJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAwKSwgRjMofjIsIH4weDM4LCB+MCl8UkRfRzB8QVNJX1JTMih+MCksCSIxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCByczErJWcwLCVnMCAqLwoteyAiam1wIiwJRjMoMiwgMHgzOCwgMSksIEYzKH4yLCB+MHgzOCwgfjEpfFJEX0cwLAkJIjEraSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgcnMxK2ksJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzAsCQkiaSsxIiwgRl9VTkJSfEZfREVMQVlFRCwgdjYgfSwgLyogam1wbCBpK3JzMSwlZzAgKi8KLXsgImptcCIsCUYzKDIsIDB4MzgsIDEpLCBGMyh+MiwgfjB4MzgsIH4xKXxSRF9HMHxSUzFfRzAsCQkiaSIsIEZfVU5CUnxGX0RFTEFZRUQsIHY2IH0sIC8qIGptcGwgJWcwK2ksJWcwICovCi17ICJqbXAiLAlGMygyLCAweDM4LCAxKSwgRjMofjIsIH4weDM4LCB+MSl8UkRfRzB8U0lNTTEzKH4wKSwJIjEiLCBGX1VOQlJ8Rl9ERUxBWUVELCB2NiB9LCAvKiBqbXBsIHJzMSswLCVnMCAqLwotCi17ICJub3AiLAlGMigwLCA0KSwgMHhmZWZmZmZmZiwgIiIsIDAsIHY2IH0sIC8qIHNldGhpIDAsICVnMCAqLwotCi17ICJzZXQiLAlGMigweDAsIDB4NCksIEYyKH4weDAsIH4weDQpLCAiUzAsZCIsIEZfQUxJQVMsIHY2IH0sCi17ICJzZXR1dyIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCxkIiwgRl9BTElBUywgdjkgfSwKLXsgInNldHN3IiwJRjIoMHgwLCAweDQpLCBGMih+MHgwLCB+MHg0KSwgIlMwLGQiLCBGX0FMSUFTLCB2OSB9LAoteyAic2V0eCIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJTMCwxLGQiLCBGX0FMSUFTLCB2OSB9LAotCi17ICJzZXRoaSIsCUYyKDB4MCwgMHg0KSwgRjIofjB4MCwgfjB4NCksICJoLGQiLCAwLCB2NiB9LAotCi17ICJ0YWRkY2MiLAlGMygyLCAweDIwLCAwKSwgRjMofjIsIH4weDIwLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInRhZGRjYyIsCUYzKDIsIDB4MjAsIDEpLCBGMyh+MiwgfjB4MjAsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ0YWRkY2MiLAlGMygyLCAweDIwLCAxKSwgRjMofjIsIH4weDIwLCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoteyAidGFkZGNjdHYiLAlGMygyLCAweDIyLCAwKSwgRjMofjIsIH4weDIyLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInRhZGRjY3R2IiwJRjMoMiwgMHgyMiwgMSksIEYzKH4yLCB+MHgyMiwgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLXsgInRhZGRjY3R2IiwJRjMoMiwgMHgyMiwgMSksIEYzKH4yLCB+MHgyMiwgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLQoteyAidHN1YmNjIiwJRjMoMiwgMHgyMSwgMCksIEYzKH4yLCB+MHgyMSwgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ0c3ViY2MiLAlGMygyLCAweDIxLCAxKSwgRjMofjIsIH4weDIxLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAidHN1YmNjdHYiLAlGMygyLCAweDIzLCAwKSwgRjMofjIsIH4weDIzLCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInRzdWJjY3R2IiwJRjMoMiwgMHgyMywgMSksIEYzKH4yLCB+MHgyMywgfjEpLAkJIjEsaSxkIiwgMCwgdjYgfSwKLQoteyAidW5pbXAiLAlGMigweDAsIDB4MCksIDB4ZmZjMDAwMDAsICJuIiwgMCwgdjZub3R2OSB9LAoteyAiaWxsdHJhcCIsCUYyKDAsIDApLCBGMih+MCwgfjApfFJEX0cwLCAibiIsIDAsIHY5IH0sCi0KLS8qIFRoaXMgKmlzKiBhIGNvbW11dGF0aXZlIGluc3RydWN0aW9uLiAgKi8KLXsgInhub3IiLAlGMygyLCAweDA3LCAwKSwgRjMofjIsIH4weDA3LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInhub3IiLAlGMygyLCAweDA3LCAxKSwgRjMofjIsIH4weDA3LCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAieG5vciIsCUYzKDIsIDB4MDcsIDEpLCBGMyh+MiwgfjB4MDcsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0vKiBUaGlzICppcyogYSBjb21tdXRhdGl2ZSBpbnN0cnVjdGlvbi4gICovCi17ICJ4bm9yY2MiLAlGMygyLCAweDE3LCAwKSwgRjMofjIsIH4weDE3LCB+MCl8QVNJKH4wKSwJIjEsMixkIiwgMCwgdjYgfSwKLXsgInhub3JjYyIsCUYzKDIsIDB4MTcsIDEpLCBGMyh+MiwgfjB4MTcsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ4bm9yY2MiLAlGMygyLCAweDE3LCAxKSwgRjMofjIsIH4weDE3LCB+MSksCQkiaSwxLGQiLCAwLCB2NiB9LAoteyAieG9yIiwJRjMoMiwgMHgwMywgMCksIEYzKH4yLCB+MHgwMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ4b3IiLAlGMygyLCAweDAzLCAxKSwgRjMofjIsIH4weDAzLCB+MSksCQkiMSxpLGQiLCAwLCB2NiB9LAoteyAieG9yIiwJRjMoMiwgMHgwMywgMSksIEYzKH4yLCB+MHgwMywgfjEpLAkJImksMSxkIiwgMCwgdjYgfSwKLXsgInhvcmNjIiwJRjMoMiwgMHgxMywgMCksIEYzKH4yLCB+MHgxMywgfjApfEFTSSh+MCksCSIxLDIsZCIsIDAsIHY2IH0sCi17ICJ4b3JjYyIsCUYzKDIsIDB4MTMsIDEpLCBGMyh+MiwgfjB4MTMsIH4xKSwJCSIxLGksZCIsIDAsIHY2IH0sCi17ICJ4b3JjYyIsCUYzKDIsIDB4MTMsIDEpLCBGMyh+MiwgfjB4MTMsIH4xKSwJCSJpLDEsZCIsIDAsIHY2IH0sCi0KLXsgIm5vdCIsCUYzKDIsIDB4MDcsIDApLCBGMyh+MiwgfjB4MDcsIH4wKXxBU0kofjApLCAiMSxkIiwgRl9BTElBUywgdjYgfSwgLyogeG5vciByczEsJTAscmQgKi8KLXsgIm5vdCIsCUYzKDIsIDB4MDcsIDApLCBGMyh+MiwgfjB4MDcsIH4wKXxBU0kofjApLCAiciIsIEZfQUxJQVMsIHY2IH0sIC8qIHhub3IgcmQsJTAscmQgKi8KLQoteyAiYnRvZyIsCUYzKDIsIDB4MDMsIDApLCBGMyh+MiwgfjB4MDMsIH4wKXxBU0kofjApLAkiMixyIiwgRl9BTElBUywgdjYgfSwgLyogeG9yIHJkLHJzMixyZCAqLwoteyAiYnRvZyIsCUYzKDIsIDB4MDMsIDEpLCBGMyh+MiwgfjB4MDMsIH4xKSwJCSJpLHIiLCBGX0FMSUFTLCB2NiB9LCAvKiB4b3IgcmQsaSxyZCAqLwotCi0vKiBGUG9wMSBhbmQgRlBvcDIgYXJlIG5vdCBpbnN0cnVjdGlvbnMuICBEb24ndCBhY2NlcHQgdGhlbS4gICovCi0KLXsgImZkdG9pIiwJRjNGKDIsIDB4MzQsIDB4MGQyKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGQyKXxSUzFfRzAsICJCLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZnN0b2kiLAlGM0YoMiwgMHgzNCwgMHgwZDEpLCBGM0YofjIsIH4weDM0LCB+MHgwZDEpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmcXRvaSIsCUYzRigyLCAweDM0LCAweDBkMyksIEYzRih+MiwgfjB4MzQsIH4weDBkMyl8UlMxX0cwLCAiUixnIiwgRl9GTE9BVCwgdjggfSwKLQoteyAiZmR0b3giLAlGM0YoMiwgMHgzNCwgMHgwODIpLCBGM0YofjIsIH4weDM0LCB+MHgwODIpfFJTMV9HMCwgIkIsZyIsIEZfRkxPQVQsIHY5IH0sCi17ICJmc3RveCIsCUYzRigyLCAweDM0LCAweDA4MSksIEYzRih+MiwgfjB4MzQsIH4weDA4MSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZxdG94IiwJRjNGKDIsIDB4MzQsIDB4MDgzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDgzKXxSUzFfRzAsICJSLGciLCBGX0ZMT0FULCB2OSB9LAotCi17ICJmaXRvZCIsCUYzRigyLCAweDM0LCAweDBjOCksIEYzRih+MiwgfjB4MzQsIH4weDBjOCl8UlMxX0cwLCAiZixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZpdG9zIiwJRjNGKDIsIDB4MzQsIDB4MGM0KSwgRjNGKH4yLCB+MHgzNCwgfjB4MGM0KXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZml0b3EiLAlGM0YoMiwgMHgzNCwgMHgwY2MpLCBGM0YofjIsIH4weDM0LCB+MHgwY2MpfFJTMV9HMCwgImYsSiIsIEZfRkxPQVQsIHY4IH0sCi0KLXsgImZ4dG9kIiwJRjNGKDIsIDB4MzQsIDB4MDg4KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDg4KXxSUzFfRzAsICJmLEgiLCBGX0ZMT0FULCB2OSB9LAoteyAiZnh0b3MiLAlGM0YoMiwgMHgzNCwgMHgwODQpLCBGM0YofjIsIH4weDM0LCB+MHgwODQpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY5IH0sCi17ICJmeHRvcSIsCUYzRigyLCAweDM0LCAweDA4YyksIEYzRih+MiwgfjB4MzQsIH4weDA4Yyl8UlMxX0cwLCAiZixKIiwgRl9GTE9BVCwgdjkgfSwKLQoteyAiZmR0b3EiLAlGM0YoMiwgMHgzNCwgMHgwY2UpLCBGM0YofjIsIH4weDM0LCB+MHgwY2UpfFJTMV9HMCwgIkIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmZHRvcyIsCUYzRigyLCAweDM0LCAweDBjNiksIEYzRih+MiwgfjB4MzQsIH4weDBjNil8UlMxX0cwLCAiQixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZxdG9kIiwJRjNGKDIsIDB4MzQsIDB4MGNiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNiKXxSUzFfRzAsICJSLEgiLCBGX0ZMT0FULCB2OCB9LAoteyAiZnF0b3MiLAlGM0YoMiwgMHgzNCwgMHgwYzcpLCBGM0YofjIsIH4weDM0LCB+MHgwYzcpfFJTMV9HMCwgIlIsZyIsIEZfRkxPQVQsIHY4IH0sCi17ICJmc3RvZCIsCUYzRigyLCAweDM0LCAweDBjOSksIEYzRih+MiwgfjB4MzQsIH4weDBjOSl8UlMxX0cwLCAiZixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZzdG9xIiwJRjNGKDIsIDB4MzQsIDB4MGNkKSwgRjNGKH4yLCB+MHgzNCwgfjB4MGNkKXxSUzFfRzAsICJmLEoiLCBGX0ZMT0FULCB2OCB9LAotCi17ICJmZGl2ZCIsCUYzRigyLCAweDM0LCAweDA0ZSksIEYzRih+MiwgfjB4MzQsIH4weDA0ZSksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmZGl2cSIsCUYzRigyLCAweDM0LCAweDA0ZiksIEYzRih+MiwgfjB4MzQsIH4weDA0ZiksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmZGl2eCIsCUYzRigyLCAweDM0LCAweDA0ZiksIEYzRih+MiwgfjB4MzQsIH4weDA0ZiksICJWLFIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZkaXZzIiwJRjNGKDIsIDB4MzQsIDB4MDRkKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRkKSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZtdWxkIiwJRjNGKDIsIDB4MzQsIDB4MDRhKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRhKSwgInYsQixIIiwgRl9GTE9BVCwgdjYgfSwKLXsgImZtdWxxIiwJRjNGKDIsIDB4MzQsIDB4MDRiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRiKSwgIlYsUixKIiwgRl9GTE9BVCwgdjggfSwKLXsgImZtdWx4IiwJRjNGKDIsIDB4MzQsIDB4MDRiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDRiKSwgIlYsUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZm11bHMiLAlGM0YoMiwgMHgzNCwgMHgwNDkpLCBGM0YofjIsIH4weDM0LCB+MHgwNDkpLCAiZSxmLGciLCBGX0ZMT0FULCB2NiB9LAotCi17ICJmZG11bHEiLAlGM0YoMiwgMHgzNCwgMHgwNmUpLCBGM0YofjIsIH4weDM0LCB+MHgwNmUpLCAidixCLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmRtdWx4IiwJRjNGKDIsIDB4MzQsIDB4MDZlKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDZlKSwgInYsQixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZnNtdWxkIiwJRjNGKDIsIDB4MzQsIDB4MDY5KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDY5KSwgImUsZixIIiwgRl9GTE9BVCwgdjggfSwKLQoteyAiZnNxcnRkIiwJRjNGKDIsIDB4MzQsIDB4MDJhKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDJhKXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2NyB9LAoteyAiZnNxcnRxIiwJRjNGKDIsIDB4MzQsIDB4MDJiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDJiKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZnNxcnR4IiwJRjNGKDIsIDB4MzQsIDB4MDJiKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDJiKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmc3FydHMiLAlGM0YoMiwgMHgzNCwgMHgwMjkpLCBGM0YofjIsIH4weDM0LCB+MHgwMjkpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY3IH0sCi0KLXsgImZhYnNkIiwJRjNGKDIsIDB4MzQsIDB4MDBhKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDBhKXxSUzFfRzAsICJCLEgiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmFic3EiLAlGM0YoMiwgMHgzNCwgMHgwMGIpLCBGM0YofjIsIH4weDM0LCB+MHgwMGIpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmYWJzeCIsCUYzRigyLCAweDM0LCAweDAwYiksIEYzRih+MiwgfjB4MzQsIH4weDAwYil8UlMxX0cwLCAiUixKIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmFic3MiLAlGM0YoMiwgMHgzNCwgMHgwMDkpLCBGM0YofjIsIH4weDM0LCB+MHgwMDkpfFJTMV9HMCwgImYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmbW92ZCIsCUYzRigyLCAweDM0LCAweDAwMiksIEYzRih+MiwgfjB4MzQsIH4weDAwMil8UlMxX0cwLCAiQixIIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZtb3ZxIiwJRjNGKDIsIDB4MzQsIDB4MDAzKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAzKXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FULCB2OSB9LAoteyAiZm1vdngiLAlGM0YoMiwgMHgzNCwgMHgwMDMpLCBGM0YofjIsIH4weDM0LCB+MHgwMDMpfFJTMV9HMCwgIlIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZtb3ZzIiwJRjNGKDIsIDB4MzQsIDB4MDAxKSwgRjNGKH4yLCB+MHgzNCwgfjB4MDAxKXxSUzFfRzAsICJmLGciLCBGX0ZMT0FULCB2NiB9LAoteyAiZm5lZ2QiLAlGM0YoMiwgMHgzNCwgMHgwMDYpLCBGM0YofjIsIH4weDM0LCB+MHgwMDYpfFJTMV9HMCwgIkIsSCIsIEZfRkxPQVQsIHY5IH0sCi17ICJmbmVncSIsCUYzRigyLCAweDM0LCAweDAwNyksIEYzRih+MiwgfjB4MzQsIH4weDAwNyl8UlMxX0cwLCAiUixKIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZuZWd4IiwJRjNGKDIsIDB4MzQsIDB4MDA3KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDA3KXxSUzFfRzAsICJSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmbmVncyIsCUYzRigyLCAweDM0LCAweDAwNSksIEYzRih+MiwgfjB4MzQsIH4weDAwNSl8UlMxX0cwLCAiZixnIiwgRl9GTE9BVCwgdjYgfSwKLQoteyAiZmFkZGQiLAlGM0YoMiwgMHgzNCwgMHgwNDIpLCBGM0YofjIsIH4weDM0LCB+MHgwNDIpLCAidixCLEgiLCBGX0ZMT0FULCB2NiB9LAoteyAiZmFkZHEiLAlGM0YoMiwgMHgzNCwgMHgwNDMpLCBGM0YofjIsIH4weDM0LCB+MHgwNDMpLCAiVixSLEoiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmFkZHgiLAlGM0YoMiwgMHgzNCwgMHgwNDMpLCBGM0YofjIsIH4weDM0LCB+MHgwNDMpLCAiVixSLEoiLCBGX0ZMT0FUfEZfQUxJQVMsIHY4IH0sCi17ICJmYWRkcyIsCUYzRigyLCAweDM0LCAweDA0MSksIEYzRih+MiwgfjB4MzQsIH4weDA0MSksICJlLGYsZyIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3ViZCIsCUYzRigyLCAweDM0LCAweDA0NiksIEYzRih+MiwgfjB4MzQsIH4weDA0NiksICJ2LEIsSCIsIEZfRkxPQVQsIHY2IH0sCi17ICJmc3VicSIsCUYzRigyLCAweDM0LCAweDA0NyksIEYzRih+MiwgfjB4MzQsIH4weDA0NyksICJWLFIsSiIsIEZfRkxPQVQsIHY4IH0sCi17ICJmc3VieCIsCUYzRigyLCAweDM0LCAweDA0NyksIEYzRih+MiwgfjB4MzQsIH4weDA0NyksICJWLFIsSiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZzdWJzIiwJRjNGKDIsIDB4MzQsIDB4MDQ1KSwgRjNGKH4yLCB+MHgzNCwgfjB4MDQ1KSwgImUsZixnIiwgRl9GTE9BVCwgdjYgfSwKLQotI2RlZmluZSBDTVBGQ0MoeCkJKCgoeCkmMHgzKTw8MjUpCi0KLXsgImZjbXBkIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MiksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDUyKXxSRF9HMCwgICJ2LEIiLCAgIEZfRkxPQVQsIHY2IH0sCi17ICJmY21wZCIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiNix2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGQiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDUyKSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTIpLAkgIjcsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBkIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MiksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUyKSwJICI4LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZCIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTIpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1MiksCSAiOSx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1NiksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDU2KXxSRF9HMCwgICJ2LEIiLCAgIEZfRkxPQVQsIHY2IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjYsdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlZCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTYpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NiksCSAiNyx2LEIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVkIiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1NiksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDU2KSwJICI4LHYsQiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZWQiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDU2KSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTYpLAkgIjksdixCIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MyksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDUzKXxSRF9HMCwJICJWLFIiLCBGX0ZMT0FULCB2OCB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMCl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4wKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjYsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBxIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI3LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcSIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTMpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1MyksCSAiOCxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHEiLAlDTVBGQ0MoMyl8RjNGKDIsIDB4MzUsIDB4MDUzKSwgQ01QRkNDKH4zKXxGM0YofjIsIH4weDM1LCB+MHgwNTMpLAkgIjksVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTcpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Nyl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVCwgdjggfSwKLXsgImZjbXBlcSIsCUNNUEZDQygwKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjApfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNixWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVxIiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI3LFYsUiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXEiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjgsVixSIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcSIsCUNNUEZDQygzKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjMpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiOSxWLFIiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHgiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDUzKSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTMpfFJEX0cwLAkgIlYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjggfSwKLXsgImZjbXB4IiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI2LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXB4IiwJQ01QRkNDKDEpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+MSl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI3LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXB4IiwJQ01QRkNDKDIpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Mil8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI4LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXB4IiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUzKSwJICI5LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBleCIsCSAgICAgICAgICBGM0YoMiwgMHgzNSwgMHgwNTcpLCAgICAgICAgICAgIEYzRih+MiwgfjB4MzUsIH4weDA1Nyl8UkRfRzAsCSAiVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OCB9LAoteyAiZmNtcGV4IiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI2LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBleCIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTcpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1NyksCSAiNyxWLFIiLCBGX0ZMT0FUfEZfQUxJQVMsIHY5IH0sCi17ICJmY21wZXgiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDU3KSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTcpLAkgIjgsVixSIiwgRl9GTE9BVHxGX0FMSUFTLCB2OSB9LAoteyAiZmNtcGV4IiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NyksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU3KSwJICI5LFYsUiIsIEZfRkxPQVR8Rl9BTElBUywgdjkgfSwKLXsgImZjbXBzIiwJICAgICAgICAgIEYzRigyLCAweDM1LCAweDA1MSksICAgICAgICAgICAgRjNGKH4yLCB+MHgzNSwgfjB4MDUxKXxSRF9HMCwgImUsZiIsICAgRl9GTE9BVCwgdjYgfSwKLXsgImZjbXBzIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI2LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wcyIsCUNNUEZDQygxKXxGM0YoMiwgMHgzNSwgMHgwNTEpLCBDTVBGQ0MofjEpfEYzRih+MiwgfjB4MzUsIH4weDA1MSksCSAiNyxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcHMiLAlDTVBGQ0MoMil8RjNGKDIsIDB4MzUsIDB4MDUxKSwgQ01QRkNDKH4yKXxGM0YofjIsIH4weDM1LCB+MHgwNTEpLAkgIjgsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBzIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1MSksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDUxKSwJICI5LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXMiLAkgICAgICAgICAgRjNGKDIsIDB4MzUsIDB4MDU1KSwgICAgICAgICAgICBGM0YofjIsIH4weDM1LCB+MHgwNTUpfFJEX0cwLCAiZSxmIiwgICBGX0ZMT0FULCB2NiB9LAoteyAiZmNtcGVzIiwJQ01QRkNDKDApfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+MCl8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI2LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi17ICJmY21wZXMiLAlDTVBGQ0MoMSl8RjNGKDIsIDB4MzUsIDB4MDU1KSwgQ01QRkNDKH4xKXxGM0YofjIsIH4weDM1LCB+MHgwNTUpLAkgIjcsZSxmIiwgRl9GTE9BVCwgdjkgfSwKLXsgImZjbXBlcyIsCUNNUEZDQygyKXxGM0YoMiwgMHgzNSwgMHgwNTUpLCBDTVBGQ0MofjIpfEYzRih+MiwgfjB4MzUsIH4weDA1NSksCSAiOCxlLGYiLCBGX0ZMT0FULCB2OSB9LAoteyAiZmNtcGVzIiwJQ01QRkNDKDMpfEYzRigyLCAweDM1LCAweDA1NSksIENNUEZDQyh+Myl8RjNGKH4yLCB+MHgzNSwgfjB4MDU1KSwJICI5LGUsZiIsIEZfRkxPQVQsIHY5IH0sCi0KLS8qIFRoZXNlIEV4dGVuZGVkIEZQb3AgKEZJRk8pIGluc3RydWN0aW9ucyBhcmUgbmV3IGluIHRoZSBGdWppdHN1Ci0gICBNQjg2OTM0LCByZXBsYWNpbmcgdGhlIENQb3AgaW5zdHJ1Y3Rpb25zIGZyb20gdjYgYW5kIGxhdGVyCi0gICBwcm9jZXNzb3JzLiAgKi8KLQotI2RlZmluZSBFRlBPUDFfMihuYW1lLCBvcCwgYXJncykgeyBuYW1lLCBGM0YoMiwgMHgzNiwgb3ApLCBGM0YofjIsIH4weDM2LCB+b3ApfFJTMV9HMCwgYXJncywgMCwgc3BhcmNsaXRlIH0KLSNkZWZpbmUgRUZQT1AxXzMobmFtZSwgb3AsIGFyZ3MpIHsgbmFtZSwgRjNGKDIsIDB4MzYsIG9wKSwgRjNGKH4yLCB+MHgzNiwgfm9wKSwgICAgICAgIGFyZ3MsIDAsIHNwYXJjbGl0ZSB9Ci0jZGVmaW5lIEVGUE9QMl8yKG5hbWUsIG9wLCBhcmdzKSB7IG5hbWUsIEYzRigyLCAweDM3LCBvcCksIEYzRih+MiwgfjB4MzcsIH5vcCl8UkRfRzAsICBhcmdzLCAwLCBzcGFyY2xpdGUgfQotCi1FRlBPUDFfMiAoImVmaXRvZCIsCTB4MGM4LCAiZixIIiksCi1FRlBPUDFfMiAoImVmaXRvcyIsCTB4MGM0LCAiZixnIiksCi1FRlBPUDFfMiAoImVmZHRvaSIsCTB4MGQyLCAiQixnIiksCi1FRlBPUDFfMiAoImVmc3RvaSIsCTB4MGQxLCAiZixnIiksCi1FRlBPUDFfMiAoImVmc3RvZCIsCTB4MGM5LCAiZixIIiksCi1FRlBPUDFfMiAoImVmZHRvcyIsCTB4MGM2LCAiQixnIiksCi1FRlBPUDFfMiAoImVmbW92cyIsCTB4MDAxLCAiZixnIiksCi1FRlBPUDFfMiAoImVmbmVncyIsCTB4MDA1LCAiZixnIiksCi1FRlBPUDFfMiAoImVmYWJzcyIsCTB4MDA5LCAiZixnIiksCi1FRlBPUDFfMiAoImVmc3FydGQiLAkweDAyYSwgIkIsSCIpLAotRUZQT1AxXzIgKCJlZnNxcnRzIiwJMHgwMjksICJmLGciKSwKLUVGUE9QMV8zICgiZWZhZGRkIiwJMHgwNDIsICJ2LEIsSCIpLAotRUZQT1AxXzMgKCJlZmFkZHMiLAkweDA0MSwgImUsZixnIiksCi1FRlBPUDFfMyAoImVmc3ViZCIsCTB4MDQ2LCAidixCLEgiKSwKLUVGUE9QMV8zICgiZWZzdWJzIiwJMHgwNDUsICJlLGYsZyIpLAotRUZQT1AxXzMgKCJlZmRpdmQiLAkweDA0ZSwgInYsQixIIiksCi1FRlBPUDFfMyAoImVmZGl2cyIsCTB4MDRkLCAiZSxmLGciKSwKLUVGUE9QMV8zICgiZWZtdWxkIiwJMHgwNGEsICJ2LEIsSCIpLAotRUZQT1AxXzMgKCJlZm11bHMiLAkweDA0OSwgImUsZixnIiksCi1FRlBPUDFfMyAoImVmc211bGQiLAkweDA2OSwgImUsZixIIiksCi1FRlBPUDJfMiAoImVmY21wZCIsCTB4MDUyLCAidixCIiksCi1FRlBPUDJfMiAoImVmY21wZWQiLAkweDA1NiwgInYsQiIpLAotRUZQT1AyXzIgKCJlZmNtcHMiLAkweDA1MSwgImUsZiIpLAotRUZQT1AyXzIgKCJlZmNtcGVzIiwJMHgwNTUsICJlLGYiKSwKLQotI3VuZGVmIEVGUE9QMV8yCi0jdW5kZWYgRUZQT1AxXzMKLSN1bmRlZiBFRlBPUDJfMgotCi0vKiBUaGVzZSBhcmUgbWFya2VkIEZfQUxJQVMsIHNvIHRoYXQgdGhleSB3b24ndCBjb25mbGljdCB3aXRoIHNwYXJjbGl0ZSBpbnNucwotICAgcHJlc2VudC4gIE90aGVyd2lzZSwgdGhlIEZfQUxJQVMgZmxhZyBpcyBpZ25vcmVkLiAgKi8KLXsgImNwb3AxIiwJRjMoMiwgMHgzNiwgMCksIEYzKH4yLCB+MHgzNiwgfjEpLCAiWzErMl0sZCIsIEZfQUxJQVMsIHY2bm90djkgfSwKLXsgImNwb3AyIiwJRjMoMiwgMHgzNywgMCksIEYzKH4yLCB+MHgzNywgfjEpLCAiWzErMl0sZCIsIEZfQUxJQVMsIHY2bm90djkgfSwKLQotLyogc3BhcmNsZXQgc3BlY2lmaWMgaW5zbnMgKi8KLQotQ09NTVVURU9QICgidW1hYyIsIDB4M2UsIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInNtYWMiLCAweDNmLCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJ1bWFjZCIsIDB4MmUsIHNwYXJjbGV0KSwKLUNPTU1VVEVPUCAoInNtYWNkIiwgMHgyZiwgc3BhcmNsZXQpLAotQ09NTVVURU9QICgidW11bGQiLCAweDA5LCBzcGFyY2xldCksCi1DT01NVVRFT1AgKCJzbXVsZCIsIDB4MGQsIHNwYXJjbGV0KSwKLQoteyAic2h1ZmZsZSIsCUYzKDIsIDB4MmQsIDApLCBGMyh+MiwgfjB4MmQsIH4wKXxBU0kofjApLAkiMSwyLGQiLCAwLCBzcGFyY2xldCB9LAoteyAic2h1ZmZsZSIsCUYzKDIsIDB4MmQsIDEpLCBGMyh+MiwgfjB4MmQsIH4xKSwJCSIxLGksZCIsIDAsIHNwYXJjbGV0IH0sCi0KLS8qIFRoZSBtYW51YWwgaXNuJ3QgY29tcGxldGVseSBhY2N1cmF0ZSBvbiB0aGVzZSBpbnNucy4gIFRoZSBgcnMyJyBmaWVsZCBpcwotICAgdHJlYXRlZCBhcyBiZWluZyA2IGJpdHMgdG8gYWNjb3VudCBmb3IgNiBiaXQgaW1tZWRpYXRlcyB0byBjcHVzaC4gIEl0IGlzCi0gICBhc3N1bWVkIHRoYXQgaXQgaXMgaW50ZW5kZWQgdGhhdCBiaXQgNSBpcyAwIHdoZW4gcnMyIGNvbnRhaW5zIGEgcmVnLiAgKi8KLSNkZWZpbmUgQklUNSAoMTw8NSkKLXsgImNyZGN4dCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCg0KSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH40KXxCSVQ1fFJTMih+MCksCSJVLGQiLCAwLCBzcGFyY2xldCB9LAoteyAiY3dyY3h0IiwJRjMoMiwgMHgzNiwgMCl8U0xDUE9QKDMpLCBGMyh+MiwgfjB4MzYsIH4wKXxTTENQT1AofjMpfEJJVDV8UlMyKH4wKSwJIjEsdSIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVzaCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgwKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4wKXxCSVQ1fFJEKH4wKSwJIjEsMiIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVzaCIsCUYzKDIsIDB4MzYsIDEpfFNMQ1BPUCgwKSwgRjMofjIsIH4weDM2LCB+MSl8U0xDUE9QKH4wKXxSRCh+MCksCQkiMSxZIiwgMCwgc3BhcmNsZXQgfSwKLXsgImNwdXNoYSIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgxKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4xKXxCSVQ1fFJEKH4wKSwJIjEsMiIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVzaGEiLAlGMygyLCAweDM2LCAxKXxTTENQT1AoMSksIEYzKH4yLCB+MHgzNiwgfjEpfFNMQ1BPUCh+MSl8UkQofjApLAkJIjEsWSIsIDAsIHNwYXJjbGV0IH0sCi17ICJjcHVsbCIsCUYzKDIsIDB4MzYsIDApfFNMQ1BPUCgyKSwgRjMofjIsIH4weDM2LCB+MCl8U0xDUE9QKH4yKXxCSVQ1fFJTMSh+MCl8UlMyKH4wKSwgImQiLCAwLCBzcGFyY2xldCB9LAotI3VuZGVmIEJJVDUKLQotLyogc3BhcmNsZXQgY29wcm9jZXNzb3IgYnJhbmNoIGluc25zICovCi0jZGVmaW5lIFNMQ0JDQzIob3Bjb2RlLCBtYXNrLCBsb3NlKSBcCi0geyBvcGNvZGUsIChtYXNrKSwgQU5OVUx8KGxvc2UpLCAibCIsICAgIEZfREVMQVlFRHxGX0NPTkRCUiwgc3BhcmNsZXQgfSwgXAotIHsgb3Bjb2RlLCAobWFzayl8QU5OVUwsIChsb3NlKSwgIixhIGwiLCBGX0RFTEFZRUR8Rl9DT05EQlIsIHNwYXJjbGV0IH0KLSNkZWZpbmUgU0xDQkNDKG9wY29kZSwgbWFzaykgXAotICBTTENCQ0MyKG9wY29kZSwgRjIoMCwgNyl8Q09ORChtYXNrKSwgRjIofjAsIH43KXxDT05EKH4obWFzaykpKQotCi0vKiBjYm4sY2JhIGNhbid0IGJlIGRlZmluZWQgaGVyZSBiZWNhdXNlIHRoZXkncmUgZGVmaW5lZCBlbHNld2hlcmUgYW5kIEdBUwotICAgcmVxdWlyZXMgYWxsIG1uZW1vbmljcyBvZiB0aGUgc2FtZSBuYW1lIHRvIGJlIGNvbnNlY3V0aXZlLiAgKi8KLS8qU0xDQkNDKCJjYm4iLCAwKSwgLSBhbHJlYWR5IGRlZmluZWQgKi8KLVNMQ0JDQygiY2JlIiwgMSksCi1TTENCQ0MoImNiZiIsIDIpLAotU0xDQkNDKCJjYmVmIiwgMyksCi1TTENCQ0MoImNiciIsIDQpLAotU0xDQkNDKCJjYmVyIiwgNSksCi1TTENCQ0MoImNiZnIiLCA2KSwKLVNMQ0JDQygiY2JlZnIiLCA3KSwKLS8qU0xDQkNDKCJjYmEiLCA4KSwgLSBhbHJlYWR5IGRlZmluZWQgKi8KLVNMQ0JDQygiY2JuZSIsIDkpLAotU0xDQkNDKCJjYm5mIiwgMTApLAotU0xDQkNDKCJjYm5lZiIsIDExKSwKLVNMQ0JDQygiY2JuciIsIDEyKSwKLVNMQ0JDQygiY2JuZXIiLCAxMyksCi1TTENCQ0MoImNibmZyIiwgMTQpLAotU0xDQkNDKCJjYm5lZnIiLCAxNSksCi0KLSN1bmRlZiBTTENCQ0MyCi0jdW5kZWYgU0xDQkNDCi0KLXsgImNhc2EiLAlGMygzLCAweDNjLCAwKSwgRjMofjMsIH4weDNjLCB+MCksICJbMV1BLDIsZCIsIDAsIHY5IH0sCi17ICJjYXNhIiwJRjMoMywgMHgzYywgMSksIEYzKH4zLCB+MHgzYywgfjEpLCAiWzFdbywyLGQiLCAwLCB2OSB9LAoteyAiY2FzeGEiLAlGMygzLCAweDNlLCAwKSwgRjMofjMsIH4weDNlLCB+MCksICJbMV1BLDIsZCIsIDAsIHY5IH0sCi17ICJjYXN4YSIsCUYzKDMsIDB4M2UsIDEpLCBGMyh+MywgfjB4M2UsIH4xKSwgIlsxXW8sMixkIiwgMCwgdjkgfSwKLQotLyogdjkgc3ludGhldGljIGluc25zICovCi17ICJpcHJlZmV0Y2giLAlGMigwLCAxKXwoMjw8MjApfEJQUkVELCBGMih+MCwgfjEpfCgxPDwyMCl8QU5OVUx8Q09ORCh+MCksICJHIiwgMCwgdjkgfSwgLyogYm4sYSxwdCAleGNjLGxhYmVsICovCi17ICJzaWdueCIsCUYzKDIsIDB4MjcsIDApLCBGMyh+MiwgfjB4MjcsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiMSxkIiwgRl9BTElBUywgdjkgfSwgLyogc3JhIHJzMSwlZzAscmQgKi8KLXsgInNpZ254IiwJRjMoMiwgMHgyNywgMCksIEYzKH4yLCB+MHgyNywgfjApfCgxPDwxMil8QVNJKH4wKXxSUzJfRzAsICJyIiwgRl9BTElBUywgdjkgfSwgLyogc3JhIHJkLCVnMCxyZCAqLwoteyAiY2xydXciLAlGMygyLCAweDI2LCAwKSwgRjMofjIsIH4weDI2LCB+MCl8KDE8PDEyKXxBU0kofjApfFJTMl9HMCwgIjEsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIHNybCByczEsJWcwLHJkICovCi17ICJjbHJ1dyIsCUYzKDIsIDB4MjYsIDApLCBGMyh+MiwgfjB4MjYsIH4wKXwoMTw8MTIpfEFTSSh+MCl8UlMyX0cwLCAiciIsIEZfQUxJQVMsIHY5IH0sIC8qIHNybCByZCwlZzAscmQgKi8KLXsgImNhcyIsCUYzKDMsIDB4M2MsIDApfEFTSSgweDgwKSwgRjMofjMsIH4weDNjLCB+MCl8QVNJKH4weDgwKSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXNhIFtyczFdQVNJX1AscnMyLHJkICovCi17ICJjYXNsIiwJRjMoMywgMHgzYywgMCl8QVNJKDB4ODgpLCBGMyh+MywgfjB4M2MsIH4wKXxBU0kofjB4ODgpLCAiWzFdLDIsZCIsIEZfQUxJQVMsIHY5IH0sIC8qIGNhc2EgW3JzMV1BU0lfUF9MLHJzMixyZCAqLwoteyAiY2FzeCIsCUYzKDMsIDB4M2UsIDApfEFTSSgweDgwKSwgRjMofjMsIH4weDNlLCB+MCl8QVNJKH4weDgwKSwgIlsxXSwyLGQiLCBGX0FMSUFTLCB2OSB9LCAvKiBjYXN4YSBbcnMxXUFTSV9QLHJzMixyZCAqLwoteyAiY2FzeGwiLAlGMygzLCAweDNlLCAwKXxBU0koMHg4OCksIEYzKH4zLCB+MHgzZSwgfjApfEFTSSh+MHg4OCksICJbMV0sMixkIiwgRl9BTElBUywgdjkgfSwgLyogY2FzeGEgW3JzMV1BU0lfUF9MLHJzMixyZCAqLwotCi0vKiBVbHRyYXNwYXJjIGV4dGVuc2lvbnMgKi8KLXsgInNodXRkb3duIiwJRjNGKDIsIDB4MzYsIDB4MDgwKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDgwKXxSRF9HMHxSUzFfRzB8UlMyX0cwLCAiIiwgMCwgdjlhIH0sCi0KLS8qIEZJWE1FOiBEbyB3ZSB3YW50IHRvIG1hcmsgdGhlc2UgYXMgRl9GTE9BVCwgb3Igc29tZXRoaW5nIHNpbWlsYXI/ICAqLwoteyAiZnBhZGQxNiIsCUYzRigyLCAweDM2LCAweDA1MCksIEYzRih+MiwgfjB4MzYsIH4weDA1MCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBhZGQxNnMiLAlGM0YoMiwgMHgzNiwgMHgwNTEpLCBGM0YofjIsIH4weDM2LCB+MHgwNTEpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZwYWRkMzIiLAlGM0YoMiwgMHgzNiwgMHgwNTIpLCBGM0YofjIsIH4weDM2LCB+MHgwNTIpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZwYWRkMzJzIiwJRjNGKDIsIDB4MzYsIDB4MDUzKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDUzKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmcHN1YjE2IiwJRjNGKDIsIDB4MzYsIDB4MDU0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDU0KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmcHN1YjE2cyIsCUYzRigyLCAweDM2LCAweDA1NSksIEYzRih+MiwgfjB4MzYsIH4weDA1NSksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnBzdWIzMiIsCUYzRigyLCAweDM2LCAweDA1NiksIEYzRih+MiwgfjB4MzYsIH4weDA1NiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBzdWIzMnMiLAlGM0YoMiwgMHgzNiwgMHgwNTcpLCBGM0YofjIsIH4weDM2LCB+MHgwNTcpLCAiZSxmLGciLCAwLCB2OWEgfSwKLQoteyAiZnBhY2szMiIsCUYzRigyLCAweDM2LCAweDAzYSksIEYzRih+MiwgfjB4MzYsIH4weDAzYSksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZnBhY2sxNiIsCUYzRigyLCAweDM2LCAweDAzYiksIEYzRih+MiwgfjB4MzYsIH4weDAzYil8UlMxX0cwLCAiQixnIiwgMCwgdjlhIH0sCi17ICJmcGFja2ZpeCIsCUYzRigyLCAweDM2LCAweDAzZCksIEYzRih+MiwgfjB4MzYsIH4weDAzZCl8UlMxX0cwLCAiQixnIiwgMCwgdjlhIH0sCi17ICJmZXhwYW5kIiwJRjNGKDIsIDB4MzYsIDB4MDRkKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDRkKXxSUzFfRzAsICJmLEgiLCAwLCB2OWEgfSwKLXsgImZwbWVyZ2UiLAlGM0YoMiwgMHgzNiwgMHgwNGIpLCBGM0YofjIsIH4weDM2LCB+MHgwNGIpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLQotLyogTm90ZSB0aGF0IHRoZSBtaXhpbmcgb2YgMzIvNjQgYml0IHJlZ3MgaXMgaW50ZW50aW9uYWwuICAqLwoteyAiZm11bDh4MTYiLAkJRjNGKDIsIDB4MzYsIDB4MDMxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDMxKSwgImUsQixIIiwgMCwgdjlhIH0sCi17ICJmbXVsOHgxNmF1IiwJCUYzRigyLCAweDM2LCAweDAzMyksIEYzRih+MiwgfjB4MzYsIH4weDAzMyksICJlLGYsSCIsIDAsIHY5YSB9LAoteyAiZm11bDh4MTZhbCIsCQlGM0YoMiwgMHgzNiwgMHgwMzUpLCBGM0YofjIsIH4weDM2LCB+MHgwMzUpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLXsgImZtdWw4c3V4MTYiLAkJRjNGKDIsIDB4MzYsIDB4MDM2KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM2KSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmbXVsOHVseDE2IiwJCUYzRigyLCAweDM2LCAweDAzNyksIEYzRih+MiwgfjB4MzYsIH4weDAzNyksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm11bGQ4c3V4MTYiLAlGM0YoMiwgMHgzNiwgMHgwMzgpLCBGM0YofjIsIH4weDM2LCB+MHgwMzgpLCAiZSxmLEgiLCAwLCB2OWEgfSwKLXsgImZtdWxkOHVseDE2IiwJRjNGKDIsIDB4MzYsIDB4MDM5KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDM5KSwgImUsZixIIiwgMCwgdjlhIH0sCi0KLXsgImFsaWduYWRkciIsCUYzRigyLCAweDM2LCAweDAxOCksIEYzRih+MiwgfjB4MzYsIH4weDAxOCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiYWxpZ25hZGRybCIsCUYzRigyLCAweDM2LCAweDAxYSksIEYzRih+MiwgfjB4MzYsIH4weDAxYSksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZmFsaWduZGF0YSIsCUYzRigyLCAweDM2LCAweDA0OCksIEYzRih+MiwgfjB4MzYsIH4weDA0OCksICJ2LEIsSCIsIDAsIHY5YSB9LAotCi17ICJmemVybyIsCUYzRigyLCAweDM2LCAweDA2MCksIEYzRih+MiwgfjB4MzYsIH4weDA2MCksICJIIiwgMCwgdjlhIH0sCi17ICJmemVyb3MiLAlGM0YoMiwgMHgzNiwgMHgwNjEpLCBGM0YofjIsIH4weDM2LCB+MHgwNjEpLCAiZyIsIDAsIHY5YSB9LAoteyAiZm9uZSIsCUYzRigyLCAweDM2LCAweDA3ZSksIEYzRih+MiwgfjB4MzYsIH4weDA3ZSksICJIIiwgMCwgdjlhIH0sCi17ICJmb25lcyIsCUYzRigyLCAweDM2LCAweDA3ZiksIEYzRih+MiwgfjB4MzYsIH4weDA3ZiksICJnIiwgMCwgdjlhIH0sCi17ICJmc3JjMSIsCUYzRigyLCAweDM2LCAweDA3NCksIEYzRih+MiwgfjB4MzYsIH4weDA3NCksICJ2LEgiLCAwLCB2OWEgfSwKLXsgImZzcmMxcyIsCUYzRigyLCAweDM2LCAweDA3NSksIEYzRih+MiwgfjB4MzYsIH4weDA3NSksICJlLGciLCAwLCB2OWEgfSwKLXsgImZzcmMyIiwJRjNGKDIsIDB4MzYsIDB4MDc4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc4KSwgIkIsSCIsIDAsIHY5YSB9LAoteyAiZnNyYzJzIiwJRjNGKDIsIDB4MzYsIDB4MDc5KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc5KSwgImYsZyIsIDAsIHY5YSB9LAoteyAiZm5vdDEiLAlGM0YoMiwgMHgzNiwgMHgwNmEpLCBGM0YofjIsIH4weDM2LCB+MHgwNmEpLCAidixIIiwgMCwgdjlhIH0sCi17ICJmbm90MXMiLAlGM0YoMiwgMHgzNiwgMHgwNmIpLCBGM0YofjIsIH4weDM2LCB+MHgwNmIpLCAiZSxnIiwgMCwgdjlhIH0sCi17ICJmbm90MiIsCUYzRigyLCAweDM2LCAweDA2NiksIEYzRih+MiwgfjB4MzYsIH4weDA2NiksICJCLEgiLCAwLCB2OWEgfSwKLXsgImZub3QycyIsCUYzRigyLCAweDM2LCAweDA2NyksIEYzRih+MiwgfjB4MzYsIH4weDA2NyksICJmLGciLCAwLCB2OWEgfSwKLXsgImZvciIsCUYzRigyLCAweDM2LCAweDA3YyksIEYzRih+MiwgfjB4MzYsIH4weDA3YyksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm9ycyIsCUYzRigyLCAweDM2LCAweDA3ZCksIEYzRih+MiwgfjB4MzYsIH4weDA3ZCksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZm5vciIsCUYzRigyLCAweDM2LCAweDA2MiksIEYzRih+MiwgfjB4MzYsIH4weDA2MiksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm5vcnMiLAlGM0YoMiwgMHgzNiwgMHgwNjMpLCBGM0YofjIsIH4weDM2LCB+MHgwNjMpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZhbmQiLAlGM0YoMiwgMHgzNiwgMHgwNzApLCBGM0YofjIsIH4weDM2LCB+MHgwNzApLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZhbmRzIiwJRjNGKDIsIDB4MzYsIDB4MDcxKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDcxKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmbmFuZCIsCUYzRigyLCAweDM2LCAweDA2ZSksIEYzRih+MiwgfjB4MzYsIH4weDA2ZSksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm5hbmRzIiwJRjNGKDIsIDB4MzYsIDB4MDZmKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZmKSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmeG9yIiwJRjNGKDIsIDB4MzYsIDB4MDZjKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDZjKSwgInYsQixIIiwgMCwgdjlhIH0sCi17ICJmeG9ycyIsCUYzRigyLCAweDM2LCAweDA2ZCksIEYzRih+MiwgfjB4MzYsIH4weDA2ZCksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZnhub3IiLAlGM0YoMiwgMHgzNiwgMHgwNzIpLCBGM0YofjIsIH4weDM2LCB+MHgwNzIpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZ4bm9ycyIsCUYzRigyLCAweDM2LCAweDA3MyksIEYzRih+MiwgfjB4MzYsIH4weDA3MyksICJlLGYsZyIsIDAsIHY5YSB9LAoteyAiZm9ybm90MSIsCUYzRigyLCAweDM2LCAweDA3YSksIEYzRih+MiwgfjB4MzYsIH4weDA3YSksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZm9ybm90MXMiLAlGM0YoMiwgMHgzNiwgMHgwN2IpLCBGM0YofjIsIH4weDM2LCB+MHgwN2IpLCAiZSxmLGciLCAwLCB2OWEgfSwKLXsgImZvcm5vdDIiLAlGM0YoMiwgMHgzNiwgMHgwNzYpLCBGM0YofjIsIH4weDM2LCB+MHgwNzYpLCAidixCLEgiLCAwLCB2OWEgfSwKLXsgImZvcm5vdDJzIiwJRjNGKDIsIDB4MzYsIDB4MDc3KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDc3KSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmYW5kbm90MSIsCUYzRigyLCAweDM2LCAweDA2OCksIEYzRih+MiwgfjB4MzYsIH4weDA2OCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZmFuZG5vdDFzIiwJRjNGKDIsIDB4MzYsIDB4MDY5KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY5KSwgImUsZixnIiwgMCwgdjlhIH0sCi17ICJmYW5kbm90MiIsCUYzRigyLCAweDM2LCAweDA2NCksIEYzRih+MiwgfjB4MzYsIH4weDA2NCksICJ2LEIsSCIsIDAsIHY5YSB9LAoteyAiZmFuZG5vdDJzIiwJRjNGKDIsIDB4MzYsIDB4MDY1KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDY1KSwgImUsZixnIiwgMCwgdjlhIH0sCi0KLXsgImZjbXBndDE2IiwJRjNGKDIsIDB4MzYsIDB4MDI4KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDI4KSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wZ3QzMiIsCUYzRigyLCAweDM2LCAweDAyYyksIEYzRih+MiwgfjB4MzYsIH4weDAyYyksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcGxlMTYiLAlGM0YoMiwgMHgzNiwgMHgwMjApLCBGM0YofjIsIH4weDM2LCB+MHgwMjApLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBsZTMyIiwJRjNGKDIsIDB4MzYsIDB4MDI0KSwgRjNGKH4yLCB+MHgzNiwgfjB4MDI0KSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wbmUxNiIsCUYzRigyLCAweDM2LCAweDAyMiksIEYzRih+MiwgfjB4MzYsIH4weDAyMiksICJ2LEIsZCIsIDAsIHY5YSB9LAoteyAiZmNtcG5lMzIiLAlGM0YoMiwgMHgzNiwgMHgwMjYpLCBGM0YofjIsIH4weDM2LCB+MHgwMjYpLCAidixCLGQiLCAwLCB2OWEgfSwKLXsgImZjbXBlcTE2IiwJRjNGKDIsIDB4MzYsIDB4MDJhKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDJhKSwgInYsQixkIiwgMCwgdjlhIH0sCi17ICJmY21wZXEzMiIsCUYzRigyLCAweDM2LCAweDAyZSksIEYzRih+MiwgfjB4MzYsIH4weDAyZSksICJ2LEIsZCIsIDAsIHY5YSB9LAotCi17ICJlZGdlOCIsCUYzRigyLCAweDM2LCAweDAwMCksIEYzRih+MiwgfjB4MzYsIH4weDAwMCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZThsIiwJRjNGKDIsIDB4MzYsIDB4MDAyKSwgRjNGKH4yLCB+MHgzNiwgfjB4MDAyKSwgIjEsMixkIiwgMCwgdjlhIH0sCi17ICJlZGdlMTYiLAlGM0YoMiwgMHgzNiwgMHgwMDQpLCBGM0YofjIsIH4weDM2LCB+MHgwMDQpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2UxNmwiLAlGM0YoMiwgMHgzNiwgMHgwMDYpLCBGM0YofjIsIH4weDM2LCB+MHgwMDYpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImVkZ2UzMiIsCUYzRigyLCAweDM2LCAweDAwOCksIEYzRih+MiwgfjB4MzYsIH4weDAwOCksICIxLDIsZCIsIDAsIHY5YSB9LAoteyAiZWRnZTMybCIsCUYzRigyLCAweDM2LCAweDAwYSksIEYzRih+MiwgfjB4MzYsIH4weDAwYSksICIxLDIsZCIsIDAsIHY5YSB9LAotCi17ICJwZGlzdCIsCUYzRigyLCAweDM2LCAweDAzZSksIEYzRih+MiwgfjB4MzYsIH4weDAzZSksICJ2LEIsSCIsIDAsIHY5YSB9LAotCi17ICJhcnJheTgiLAlGM0YoMiwgMHgzNiwgMHgwMTApLCBGM0YofjIsIH4weDM2LCB+MHgwMTApLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImFycmF5MTYiLAlGM0YoMiwgMHgzNiwgMHgwMTIpLCBGM0YofjIsIH4weDM2LCB+MHgwMTIpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLXsgImFycmF5MzIiLAlGM0YoMiwgMHgzNiwgMHgwMTQpLCBGM0YofjIsIH4weDM2LCB+MHgwMTQpLCAiMSwyLGQiLCAwLCB2OWEgfSwKLQotLyogTW9yZSB2OSBzcGVjaWZpYyBpbnNucywgdGhlc2UgbmVlZCB0byBjb21lIGxhc3Qgc28gdGhleSBkbyBub3QgY2xhc2gKLSAgIHdpdGggdjlhIGluc3RydWN0aW9ucyBzdWNoIGFzICJlZGdlOCIgd2hpY2ggbG9va3MgbGlrZSBpbXBkZXAxLiAqLwotCi0jZGVmaW5lIElNUERFUChuYW1lLCBjb2RlKSBcCi17IG5hbWUsCUYzKDIsIGNvZGUsIDApLCBGMyh+MiwgfmNvZGUsIH4wKXxBU0kofjApLCAiMSwyLGQiLCAwLCB2OW5vdHY5YSB9LCBcCi17IG5hbWUsCUYzKDIsIGNvZGUsIDEpLCBGMyh+MiwgfmNvZGUsIH4xKSwJICAgIjEsaSxkIiwgMCwgdjlub3R2OWEgfSwgXAoteyBuYW1lLCBGMygyLCBjb2RlLCAwKSwgRjMofjIsIH5jb2RlLCB+MCksICAgICAgICAgIngsMSwyLGQiLCAwLCB2OW5vdHY5YSB9LCBcCi17IG5hbWUsIEYzKDIsIGNvZGUsIDApLCBGMyh+MiwgfmNvZGUsIH4wKSwgICAgICAgICAieCxlLGYsZyIsIDAsIHY5bm90djlhIH0KLQotSU1QREVQICgiaW1wZGVwMSIsIDB4MzYpLAotSU1QREVQICgiaW1wZGVwMiIsIDB4MzcpLAotCi0jdW5kZWYgSU1QREVQCi0KLX07Ci0KLWNvbnN0IGludCBzcGFyY19udW1fb3Bjb2RlcyA9ICgoc2l6ZW9mIHNwYXJjX29wY29kZXMpLyhzaXplb2Ygc3BhcmNfb3Bjb2Rlc1swXSkpOwotDAotLyogVXRpbGl0aWVzIGZvciBhcmd1bWVudCBwYXJzaW5nLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgaW50IHZhbHVlOwotICBjb25zdCBjaGFyICpuYW1lOwotfSBhcmc7Ci0KLS8qIExvb2sgdXAgTkFNRSBpbiBUQUJMRS4gICovCi0KLXN0YXRpYyBpbnQgbG9va3VwX25hbWUgUEFSQU1TICgoY29uc3QgYXJnICosIGNvbnN0IGNoYXIgKikpOwotc3RhdGljIGNvbnN0IGNoYXIgKmxvb2t1cF92YWx1ZSBQQVJBTVMgKChjb25zdCBhcmcgKiwgaW50KSk7Ci0KLXN0YXRpYyBpbnQKLWxvb2t1cF9uYW1lICh0YWJsZSwgbmFtZSkKLSAgICAgY29uc3QgYXJnICp0YWJsZTsKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgY29uc3QgYXJnICpwOwotCi0gIGZvciAocCA9IHRhYmxlOyBwLT5uYW1lOyArK3ApCi0gICAgaWYgKHN0cmNtcCAobmFtZSwgcC0+bmFtZSkgPT0gMCkKLSAgICAgIHJldHVybiBwLT52YWx1ZTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLS8qIExvb2sgdXAgVkFMVUUgaW4gVEFCTEUuICAqLwotCi1zdGF0aWMgY29uc3QgY2hhciAqCi1sb29rdXBfdmFsdWUgKHRhYmxlLCB2YWx1ZSkKLSAgICAgY29uc3QgYXJnICp0YWJsZTsKLSAgICAgaW50IHZhbHVlOwotewotICBjb25zdCBhcmcgKnA7Ci0KLSAgZm9yIChwID0gdGFibGU7IHAtPm5hbWU7ICsrcCkKLSAgICBpZiAodmFsdWUgPT0gcC0+dmFsdWUpCi0gICAgICByZXR1cm4gcC0+bmFtZTsKLQotICByZXR1cm4gKGNoYXIgKikgMDsKLX0KLQwKLS8qIEhhbmRsZSBBU0kncy4gICovCi0KLXN0YXRpYyBhcmcgYXNpX3RhYmxlW10gPQotewotICAvKiBUaGVzZSBhcmUgaW4gdGhlIHY5IGFyY2hpdGVjdHVyZSBtYW51YWwuICAqLwotICAvKiBUaGUgc2hvcnRlciB2ZXJzaW9ucyBhcHBlYXIgZmlyc3QsIHRoZXkncmUgaGVyZSBiZWNhdXNlIFN1bidzIGFzIGhhcyB0aGVtLgotICAgICBTdW4ncyBhcyB1c2VzICNBU0lfUF9MIGluc3RlYWQgb2YgI0FTSV9QTCAod2hpY2ggYXBwZWFycyBpbiB0aGUKLSAgICAgVWx0cmFTUEFSQyBhcmNoaXRlY3R1cmUgbWFudWFsKS4gICovCi0gIHsgMHgwNCwgIiNBU0lfTiIgfSwKLSAgeyAweDBjLCAiI0FTSV9OX0wiIH0sCi0gIHsgMHgxMCwgIiNBU0lfQUlVUCIgfSwKLSAgeyAweDExLCAiI0FTSV9BSVVTIiB9LAotICB7IDB4MTgsICIjQVNJX0FJVVBfTCIgfSwKLSAgeyAweDE5LCAiI0FTSV9BSVVTX0wiIH0sCi0gIHsgMHg4MCwgIiNBU0lfUCIgfSwKLSAgeyAweDgxLCAiI0FTSV9TIiB9LAotICB7IDB4ODIsICIjQVNJX1BORiIgfSwKLSAgeyAweDgzLCAiI0FTSV9TTkYiIH0sCi0gIHsgMHg4OCwgIiNBU0lfUF9MIiB9LAotICB7IDB4ODksICIjQVNJX1NfTCIgfSwKLSAgeyAweDhhLCAiI0FTSV9QTkZfTCIgfSwKLSAgeyAweDhiLCAiI0FTSV9TTkZfTCIgfSwKLSAgeyAweDA0LCAiI0FTSV9OVUNMRVVTIiB9LAotICB7IDB4MGMsICIjQVNJX05VQ0xFVVNfTElUVExFIiB9LAotICB7IDB4MTAsICIjQVNJX0FTX0lGX1VTRVJfUFJJTUFSWSIgfSwKLSAgeyAweDExLCAiI0FTSV9BU19JRl9VU0VSX1NFQ09OREFSWSIgfSwKLSAgeyAweDE4LCAiI0FTSV9BU19JRl9VU0VSX1BSSU1BUllfTElUVExFIiB9LAotICB7IDB4MTksICIjQVNJX0FTX0lGX1VTRVJfU0VDT05EQVJZX0xJVFRMRSIgfSwKLSAgeyAweDgwLCAiI0FTSV9QUklNQVJZIiB9LAotICB7IDB4ODEsICIjQVNJX1NFQ09OREFSWSIgfSwKLSAgeyAweDgyLCAiI0FTSV9QUklNQVJZX05PRkFVTFQiIH0sCi0gIHsgMHg4MywgIiNBU0lfU0VDT05EQVJZX05PRkFVTFQiIH0sCi0gIHsgMHg4OCwgIiNBU0lfUFJJTUFSWV9MSVRUTEUiIH0sCi0gIHsgMHg4OSwgIiNBU0lfU0VDT05EQVJZX0xJVFRMRSIgfSwKLSAgeyAweDhhLCAiI0FTSV9QUklNQVJZX05PRkFVTFRfTElUVExFIiB9LAotICB7IDB4OGIsICIjQVNJX1NFQ09OREFSWV9OT0ZBVUxUX0xJVFRMRSIgfSwKLSAgLyogVGhlc2UgYXJlIFVsdHJhU1BBUkMgZXh0ZW5zaW9ucy4gICovCi0gIC8qIEZJWE1FOiBUaGVyZSBhcmUgZG96ZW5zIG9mIHRoZW0uICBOb3Qgc3VyZSB3ZSB3YW50IHRoZW0gYWxsLgotICAgICBNb3N0IGFyZSBmb3Iga2VybmVsIGJ1aWxkaW5nIGJ1dCBzb21lIGFyZSBmb3IgdmlzIHR5cGUgc3R1ZmYuICAqLwotICB7IDAsIDAgfQotfTsKLQotLyogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgQVNJIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotc3BhcmNfZW5jb2RlX2FzaSAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF9uYW1lIChhc2lfdGFibGUsIG5hbWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgZm9yIEFTSSB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfZGVjb2RlX2FzaSAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF92YWx1ZSAoYXNpX3RhYmxlLCB2YWx1ZSk7Ci19Ci0MCi0vKiBIYW5kbGUgbWVtYmFyIG1hc2tzLiAgKi8KLQotc3RhdGljIGFyZyBtZW1iYXJfdGFibGVbXSA9Ci17Ci0gIHsgMHg0MCwgIiNTeW5jIiB9LAotICB7IDB4MjAsICIjTWVtSXNzdWUiIH0sCi0gIHsgMHgxMCwgIiNMb29rYXNpZGUiIH0sCi0gIHsgMHgwOCwgIiNTdG9yZVN0b3JlIiB9LAotICB7IDB4MDQsICIjTG9hZFN0b3JlIiB9LAotICB7IDB4MDIsICIjU3RvcmVMb2FkIiB9LAotICB7IDB4MDEsICIjTG9hZExvYWQiIH0sCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBtZW1iYXIgYXJnIE5BTUUsIG9yIC0xIGlmIG5vdCBmb3VuZC4gICovCi0KLWludAotc3BhcmNfZW5jb2RlX21lbWJhciAobmFtZSkKLSAgICAgY29uc3QgY2hhciAqbmFtZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF9uYW1lIChtZW1iYXJfdGFibGUsIG5hbWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgZm9yIG1lbWJhciB2YWx1ZSBWQUxVRSBvciBOVUxMIGlmIG5vdCBmb3VuZC4gICovCi0KLWNvbnN0IGNoYXIgKgotc3BhcmNfZGVjb2RlX21lbWJhciAodmFsdWUpCi0gICAgIGludCB2YWx1ZTsKLXsKLSAgcmV0dXJuIGxvb2t1cF92YWx1ZSAobWVtYmFyX3RhYmxlLCB2YWx1ZSk7Ci19Ci0MCi0vKiBIYW5kbGUgcHJlZmV0Y2ggYXJncy4gICovCi0KLXN0YXRpYyBhcmcgcHJlZmV0Y2hfdGFibGVbXSA9Ci17Ci0gIHsgMCwgIiNuX3JlYWRzIiB9LAotICB7IDEsICIjb25lX3JlYWQiIH0sCi0gIHsgMiwgIiNuX3dyaXRlcyIgfSwKLSAgeyAzLCAiI29uZV93cml0ZSIgfSwKLSAgeyA0LCAiI3BhZ2UiIH0sCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBwcmVmZXRjaCBhcmcgTkFNRSwgb3IgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1zcGFyY19lbmNvZGVfcHJlZmV0Y2ggKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBsb29rdXBfbmFtZSAocHJlZmV0Y2hfdGFibGUsIG5hbWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHByZWZldGNoIHZhbHVlIFZBTFVFIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY19kZWNvZGVfcHJlZmV0Y2ggKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiBsb29rdXBfdmFsdWUgKHByZWZldGNoX3RhYmxlLCB2YWx1ZSk7Ci19Ci0MCi0vKiBIYW5kbGUgc3BhcmNsZXQgY29wcm9jZXNzb3IgcmVnaXN0ZXJzLiAgKi8KLQotc3RhdGljIGFyZyBzcGFyY2xldF9jcHJlZ190YWJsZVtdID0KLXsKLSAgeyAwLCAiJWNjc3IiIH0sCi0gIHsgMSwgIiVjY2ZyIiB9LAotICB7IDIsICIlY2NjcmNyIiB9LAotICB7IDMsICIlY2NwciIgfSwKLSAgeyA0LCAiJWNjc3IyIiB9LAotICB7IDUsICIlY2NjcnIiIH0sCi0gIHsgNiwgIiVjY3JzdHIiIH0sCi0gIHsgMCwgMCB9Ci19OwotCi0vKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBzcGFyY2xldCBjcHJlZyBhcmcgTkFNRSwgb3IgLTEgaWYgbm90IGZvdW5kLiAgKi8KLQotaW50Ci1zcGFyY19lbmNvZGVfc3BhcmNsZXRfY3ByZWcgKG5hbWUpCi0gICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci17Ci0gIHJldHVybiBsb29rdXBfbmFtZSAoc3BhcmNsZXRfY3ByZWdfdGFibGUsIG5hbWUpOwotfQotCi0vKiBSZXR1cm4gdGhlIG5hbWUgZm9yIHNwYXJjbGV0IGNwcmVnIHZhbHVlIFZBTFVFIG9yIE5VTEwgaWYgbm90IGZvdW5kLiAgKi8KLQotY29uc3QgY2hhciAqCi1zcGFyY19kZWNvZGVfc3BhcmNsZXRfY3ByZWcgKHZhbHVlKQotICAgICBpbnQgdmFsdWU7Ci17Ci0gIHJldHVybiBsb29rdXBfdmFsdWUgKHNwYXJjbGV0X2NwcmVnX3RhYmxlLCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9vcGNvZGVzL3N0YW1wLWguaW4gYi9vcGNvZGVzL3N0YW1wLWguaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3ODhmNzAuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy9zdGFtcC1oLmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGltZXN0YW1wCmRpZmYgLS1naXQgYS9vcGNvZGVzL3N5c2RlcC5oIGIvb3Bjb2Rlcy9zeXNkZXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyM2U1Zi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3N5c2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogUmFuZG9tIGhvc3QtZGVwZW5kZW50IHN1cHBvcnQgY29kZS4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIFdyaXR0ZW4gYnkgS2VuIFJhZWJ1cm4uCi0KLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYm9wY29kZXMsIHRoZSBvcGNvZGVzIGxpYnJhcnkuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLS8qIERvIHN5c3RlbS1kZXBlbmRlbnQgc3R1ZmYsIG1haW5seSBkcml2ZW4gYnkgYXV0b2NvbmYtZGV0ZWN0ZWQgaW5mby4KLQotICAgV2VsbCwgc29tZSBnZW5lcmljIGNvbW1vbiBzdHVmZiBpcyBkb25lIGhlcmUgdG9vLCBsaWtlIGluY2x1ZGluZwotICAgYW5zaWRlY2wuaC4gIFRoYXQncyBiZWNhdXNlIHRoZSAuaCBmaWxlcyBpbiBiZmQvaG9zdHMgZmlsZXMgSSdtCi0gICB0cnlpbmcgdG8gcmVwbGFjZSBvZnRlbiBkaWQgdGhhdC4gIElmIGl0IGNhbiBiZSBkcm9wcGVkIGZyb20gdGhpcwotICAgZmlsZSAoY2hlY2sgaW4gYSBub24tQU5TSSBlbnZpcm9ubWVudCEpLCBpdCBzaG91bGQgYmUuICAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlIDxhbnNpZGVjbC5oPgotCi0jaWZkZWYgSEFWRV9TVERMSUJfSAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NUUklOR19ICi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZWxzZQotI2lmZGVmIEhBVkVfU1RSSU5HU19ICi0jaW5jbHVkZSA8c3RyaW5ncy5oPgotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL29wY29kZXMvdGljMzAtZGlzLmMgYi9vcGNvZGVzL3RpYzMwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2NmODkzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdGljMzAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MTAgKzAsMCBAQAotLyogRGlzYXNzZW1ibHkgcm91dGluZXMgZm9yIFRNUzMyMEMzMCBhcmNoaXRlY3R1cmUKLSAgIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBIYXdvcnRoIChzdGV2ZUBwbS5jc2Uucm1pdC5lZHUuYXUpCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCi0gICAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSAic3lzZGVwLmgiCi0jaW5jbHVkZSAiZGlzLWFzbS5oIgotI2luY2x1ZGUgIm9wY29kZS90aWMzMC5oIgotCi0jZGVmaW5lIE5PUk1BTF9JTlNOICAgMQotI2RlZmluZSBQQVJBTExFTF9JTlNOIDIKLQotLyogR2V0cyB0aGUgdHlwZSBvZiBpbnN0cnVjdGlvbiBiYXNlZCBvbiB0aGUgdG9wIDIgb3IgMyBiaXRzIG9mIHRoZQotICAgaW5zdHJ1Y3Rpb24gd29yZC4gKi8KLSNkZWZpbmUgR0VUX1RZUEUoaW5zbikgKGluc24gJiAweDgwMDAwMDAwID8gaW5zbiAmIDB4QzAwMDAwMDAgOiBpbnNuICYgMHhFMDAwMDAwMCkKLQotLyogSW5zdHJ1Y3Rpb24gdHlwZXMuICovCi0jZGVmaW5lIFRXT19PUEVSQU5EXzEgMHgwMDAwMDAwMAotI2RlZmluZSBUV09fT1BFUkFORF8yIDB4NDAwMDAwMDAKLSNkZWZpbmUgVEhSRUVfT1BFUkFORCAweDIwMDAwMDAwCi0jZGVmaW5lIFBBUl9TVE9SRSAgICAgMHhDMDAwMDAwMAotI2RlZmluZSBNVUxfQUREUyAgICAgIDB4ODAwMDAwMDAKLSNkZWZpbmUgQlJBTkNIRVMgICAgICAweDYwMDAwMDAwCi0KLS8qIFNwZWNpZmljIGluc3RydWN0aW9uIGlkIGJpdHMuICovCi0jZGVmaW5lIE5PUk1BTF9JREVOICAgIDB4MUY4MDAwMDAKLSNkZWZpbmUgUEFSX1NUT1JFX0lERU4gMHgzRTAwMDAwMAotI2RlZmluZSBNVUxfQUREX0lERU4gICAweDJDMDAwMDAwCi0jZGVmaW5lIEJSX0lNTV9JREVOICAgIDB4MUYwMDAwMDAKLSNkZWZpbmUgQlJfQ09ORF9JREVOICAgMHgxQzNGMDAwMAotCi0vKiBBZGRyZXNzaW5nIG1vZGVzLiAqLwotI2RlZmluZSBBTV9SRUdJU1RFUiAweDAwMDAwMDAwCi0jZGVmaW5lIEFNX0RJUkVDVCAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgQU1fSU5ESVJFQ1QgMHgwMDQwMDAwMAotI2RlZmluZSBBTV9JTU0gICAgICAweDAwNjAwMDAwCi0KLSNkZWZpbmUgUF9GSUVMRCAweDAzMDAwMDAwCi0KLSNkZWZpbmUgUkVHX0FSMCAweDA4Ci0jZGVmaW5lIExEUF9JTlNOIDB4MDg3MDAwMDAKLQotLyogVE1TMzIwQzMwIHByb2dyYW0gY291bnRlciBmb3IgY3VycmVudCBpbnN0cnVjdGlvbi4gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX3BjOwotCi1zdHJ1Y3QgaW5zdHJ1Y3Rpb24KLSAgewotICAgIGludCB0eXBlOwotICAgIHRlbXBsYXRlICp0bTsKLSAgICBwYXJ0ZW1wbGF0ZSAqcHRtOwotICB9OwotCi1pbnQgZ2V0X3RpYzMwX2luc3RydWN0aW9uIFBBUkFNUyAoKHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBpbnN0cnVjdGlvbiAqKSk7Ci1pbnQgcHJpbnRfdHdvX29wZXJhbmQKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X3RocmVlX29wZXJhbmQKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IHByaW50X3Bhcl9pbnNuCi0gIFBBUkFNUyAoKGRpc2Fzc2VtYmxlX2luZm8gKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGluc3RydWN0aW9uICopKTsKLWludCBwcmludF9icmFuY2gKLSAgUEFSQU1TICgoZGlzYXNzZW1ibGVfaW5mbyAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKikpOwotaW50IGdldF9pbmRpcmVjdF9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIHNob3J0LCBpbnQsIGNoYXIgKikpOwotaW50IGdldF9yZWdpc3Rlcl9vcGVyYW5kIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIsIGNoYXIgKikpOwotaW50IGNudnRfdG1zZmxvYXRfaWVlZSBQQVJBTVMgKCh1bnNpZ25lZCBsb25nLCBpbnQsIGZsb2F0ICopKTsKLQotaW50Ci1wcmludF9pbnNuX3RpYzMwIChwYywgaW5mbykKLSAgICAgYmZkX3ZtYSBwYzsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gIHN0cnVjdCBpbnN0cnVjdGlvbiBpbnNuID0KLSAgezAsIE5VTEwsIE5VTEx9OwotICBiZmRfdm1hIGJ1ZmFkZHIgPSBwYyAtIGluZm8tPmJ1ZmZlcl92bWE7Ci0gIC8qIE9idGFpbiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiB3b3JkIGZyb20gdGhlIGJ1ZmZlci4gKi8KLSAgaW5zbl93b3JkID0gKCooaW5mby0+YnVmZmVyICsgYnVmYWRkcikgPDwgMjQpIHwgKCooaW5mby0+YnVmZmVyICsgYnVmYWRkciArIDEpIDw8IDE2KSB8Ci0gICAgKCooaW5mby0+YnVmZmVyICsgYnVmYWRkciArIDIpIDw8IDgpIHwgKihpbmZvLT5idWZmZXIgKyBidWZhZGRyICsgMyk7Ci0gIF9wYyA9IHBjIC8gNDsKLSAgLyogR2V0IHRoZSBpbnN0cnVjdGlvbiByZWZlcmVkIHRvIGJ5IHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHdvcmQKLSAgICAgYW5kIHByaW50IGl0IG91dCBiYXNlZCBvbiBpdHMgdHlwZS4gKi8KLSAgaWYgKCFnZXRfdGljMzBfaW5zdHJ1Y3Rpb24gKGluc25fd29yZCwgJmluc24pKQotICAgIHJldHVybiAtMTsKLSAgc3dpdGNoIChHRVRfVFlQRSAoaW5zbl93b3JkKSkKLSAgICB7Ci0gICAgY2FzZSBUV09fT1BFUkFORF8xOgotICAgIGNhc2UgVFdPX09QRVJBTkRfMjoKLSAgICAgIGlmICghcHJpbnRfdHdvX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgJmluc24pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEhSRUVfT1BFUkFORDoKLSAgICAgIGlmICghcHJpbnRfdGhyZWVfb3BlcmFuZCAoaW5mbywgaW5zbl93b3JkLCAmaW5zbikpCi0JcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQQVJfU1RPUkU6Ci0gICAgY2FzZSBNVUxfQUREUzoKLSAgICAgIGlmICghcHJpbnRfcGFyX2luc24gKGluZm8sIGluc25fd29yZCwgJmluc24pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlJBTkNIRVM6Ci0gICAgICBpZiAoIXByaW50X2JyYW5jaCAoaW5mbywgaW5zbl93b3JkLCAmaW5zbikpCi0JcmV0dXJuIC0xOwotICAgICAgYnJlYWs7Ci0gICAgfQotICByZXR1cm4gNDsKLX0KLQotaW50Ci1nZXRfdGljMzBfaW5zdHJ1Y3Rpb24gKGluc25fd29yZCwgaW5zbikKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgc3dpdGNoIChHRVRfVFlQRSAoaW5zbl93b3JkKSkKLSAgICB7Ci0gICAgY2FzZSBUV09fT1BFUkFORF8xOgotICAgIGNhc2UgVFdPX09QRVJBTkRfMjoKLSAgICBjYXNlIFRIUkVFX09QRVJBTkQ6Ci0gICAgICBpbnNuLT50eXBlID0gTk9STUFMX0lOU047Ci0gICAgICB7Ci0JdGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSAodGVtcGxhdGUgKikgdGljMzBfb3B0YWI7Ci0JZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9vcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLQkgIHsKLQkgICAgaWYgKEdFVF9UWVBFIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSkgPT0gR0VUX1RZUEUgKGluc25fd29yZCkpCi0JICAgICAgewotCQlpZiAoY3VycmVudF9vcHRhYi0+b3BlcmFuZHMgPT0gMCkKLQkJICB7Ci0JCSAgICBpZiAoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgPT0gaW5zbl93b3JkKQotCQkgICAgICB7Ci0JCQlpbnNuLT50bSA9IGN1cnJlbnRfb3B0YWI7Ci0JCQlicmVhazsKLQkJICAgICAgfQotCQkgIH0KLQkJZWxzZSBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgTk9STUFMX0lERU4pID09IChpbnNuX3dvcmQgJiBOT1JNQUxfSURFTikpCi0JCSAgewotCQkgICAgaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUEFSX1NUT1JFOgotICAgICAgaW5zbi0+dHlwZSA9IFBBUkFMTEVMX0lOU047Ci0gICAgICB7Ci0JcGFydGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSAocGFydGVtcGxhdGUgKikgdGljMzBfcGFyb3B0YWI7Ci0JZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9wYXJvcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLQkgIHsKLQkgICAgaWYgKEdFVF9UWVBFIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSkgPT0gR0VUX1RZUEUgKGluc25fd29yZCkpCi0JICAgICAgewotCQlpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgUEFSX1NUT1JFX0lERU4pID09IChpbnNuX3dvcmQgJiBQQVJfU1RPUkVfSURFTikpCi0JCSAgewotCQkgICAgaW5zbi0+cHRtID0gY3VycmVudF9vcHRhYjsKLQkJICAgIGJyZWFrOwotCQkgIH0KLQkgICAgICB9Ci0JICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1VTF9BRERTOgotICAgICAgaW5zbi0+dHlwZSA9IFBBUkFMTEVMX0lOU047Ci0gICAgICB7Ci0JcGFydGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSAocGFydGVtcGxhdGUgKikgdGljMzBfcGFyb3B0YWI7Ci0JZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9wYXJvcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLQkgIHsKLQkgICAgaWYgKEdFVF9UWVBFIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSkgPT0gR0VUX1RZUEUgKGluc25fd29yZCkpCi0JICAgICAgewotCQlpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgTVVMX0FERF9JREVOKSA9PSAoaW5zbl93b3JkICYgTVVMX0FERF9JREVOKSkKLQkJICB7Ci0JCSAgICBpbnNuLT5wdG0gPSBjdXJyZW50X29wdGFiOwotCQkgICAgYnJlYWs7Ci0JCSAgfQotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQlJBTkNIRVM6Ci0gICAgICBpbnNuLT50eXBlID0gTk9STUFMX0lOU047Ci0gICAgICB7Ci0JdGVtcGxhdGUgKmN1cnJlbnRfb3B0YWIgPSAodGVtcGxhdGUgKikgdGljMzBfb3B0YWI7Ci0JZm9yICg7IGN1cnJlbnRfb3B0YWIgPCB0aWMzMF9vcHRhYl9lbmQ7IGN1cnJlbnRfb3B0YWIrKykKLQkgIHsKLQkgICAgaWYgKEdFVF9UWVBFIChjdXJyZW50X29wdGFiLT5iYXNlX29wY29kZSkgPT0gR0VUX1RZUEUgKGluc25fd29yZCkpCi0JICAgICAgewotCQlpZiAoY3VycmVudF9vcHRhYi0+b3BlcmFuZF90eXBlc1swXSAmIEltbTI0KQotCQkgIHsKLQkJICAgIGlmICgoY3VycmVudF9vcHRhYi0+YmFzZV9vcGNvZGUgJiBCUl9JTU1fSURFTikgPT0gKGluc25fd29yZCAmIEJSX0lNTV9JREVOKSkKLQkJICAgICAgewotCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UgaWYgKGN1cnJlbnRfb3B0YWItPm9wZXJhbmRzID4gMCkKLQkJICB7Ci0JCSAgICBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgQlJfQ09ORF9JREVOKSA9PSAoaW5zbl93b3JkICYgQlJfQ09ORF9JREVOKSkKLQkJICAgICAgewotCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWVsc2UKLQkJICB7Ci0JCSAgICBpZiAoKGN1cnJlbnRfb3B0YWItPmJhc2Vfb3Bjb2RlICYgKEJSX0NPTkRfSURFTiB8IDB4MDA4MDAwMDApKSA9PSAoaW5zbl93b3JkICYgKEJSX0NPTkRfSURFTiB8IDB4MDA4MDAwMDApKSkKLQkJICAgICAgewotCQkJaW5zbi0+dG0gPSBjdXJyZW50X29wdGFiOwotCQkJYnJlYWs7Ci0JCSAgICAgIH0KLQkJICB9Ci0JICAgICAgfQotCSAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotcHJpbnRfdHdvX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgaW5zbikKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgY2hhciBuYW1lWzEyXTsKLSAgY2hhciBvcGVyYW5kWzJdWzEzXSA9Ci0gIHsKLSAgICB7MH0sCi0gICAgezB9fTsKLSAgZmxvYXQgZl9udW1iZXI7Ci0KLSAgaWYgKGluc24tPnRtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIHN0cmNweSAobmFtZSwgaW5zbi0+dG0tPm5hbWUpOwotICBpZiAoaW5zbi0+dG0tPm9wY29kZV9tb2RpZmllciA9PSBBZGRyZXNzTW9kZSkKLSAgICB7Ci0gICAgICBpbnQgc3JjX29wLCBkZXN0X29wOwotICAgICAgLyogRGV0ZXJtaW5lIHdoZXRoZXIgaW5zdHJ1Y3Rpb24gaXMgYSBzdG9yZSBvciBhIG5vcm1hbCBpbnN0cnVjdGlvbi4gKi8KLSAgICAgIGlmICgoaW5zbi0+dG0tPm9wZXJhbmRfdHlwZXNbMV0gJiAoRGlyZWN0IHwgSW5kaXJlY3QpKSA9PSAoRGlyZWN0IHwgSW5kaXJlY3QpKQotCXsKLQkgIHNyY19vcCA9IDE7Ci0JICBkZXN0X29wID0gMDsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgc3JjX29wID0gMDsKLQkgIGRlc3Rfb3AgPSAxOwotCX0KLSAgICAgIC8qIEdldCB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuICovCi0gICAgICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRzID09IDIpCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMUYwMDAwKSA+PiAxNiwgb3BlcmFuZFtkZXN0X29wXSk7Ci0gICAgICAvKiBHZXQgdGhlIHNvdXJjZSBvcGVyYW5kIGJhc2VkIG9uIGFkZHJlc3NpbmcgbW9kZS4gKi8KLSAgICAgIHN3aXRjaCAoaW5zbl93b3JkICYgQWRkcmVzc01vZGUpCi0JewotCWNhc2UgQU1fUkVHSVNURVI6Ci0JICAvKiBDaGVjayBmb3IgdGhlIE5PUCBpbnN0cnVjdGlvbiBiZWZvcmUgZ2V0dGluZyB0aGUgb3BlcmFuZC4gKi8KLQkgIGlmICgoaW5zbi0+dG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBOb3RSZXEpID09IDApCi0JICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDAxRiksIG9wZXJhbmRbc3JjX29wXSk7Ci0JICBicmVhazsKLQljYXNlIEFNX0RJUkVDVDoKLQkgIHNwcmludGYgKG9wZXJhbmRbc3JjX29wXSwgIkAweCVsWCIsIChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSk7Ci0JICBicmVhazsKLQljYXNlIEFNX0lORElSRUNUOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSwgMiwgb3BlcmFuZFtzcmNfb3BdKTsKLQkgIGJyZWFrOwotCWNhc2UgQU1fSU1NOgotCSAgLyogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgaW1tZWRpYXRlIG9wZXJhbmQgYmFzZWQgb24gdmFyaWFibGUgdHlwZS4gKi8KLQkgIHN3aXRjaCAoaW5zbi0+dG0tPmltbV9hcmdfdHlwZSkKLQkgICAgewotCSAgICBjYXNlIEltbV9GbG9hdDoKLQkgICAgICBjbnZ0X3Rtc2Zsb2F0X2llZWUgKChpbnNuX3dvcmQgJiAweDAwMDBGRkZGKSwgMiwgJmZfbnVtYmVyKTsKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICIlMi4yZiIsIGZfbnVtYmVyKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJbW1fU0ludDoKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICIlZCIsIChzaG9ydCkgKGluc25fd29yZCAmIDB4MDAwMEZGRkYpKTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBJbW1fVUludDoKLQkgICAgICBzcHJpbnRmIChvcGVyYW5kW3NyY19vcF0sICIlbHUiLCAoaW5zbl93b3JkICYgMHgwMDAwRkZGRikpOwotCSAgICAgIGJyZWFrOwotCSAgICBkZWZhdWx0OgotCSAgICAgIHJldHVybiAwOwotCSAgICB9Ci0JICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBMRFAgaW5zdHJ1Y3Rpb24uICovCi0JICBpZiAoKGluc25fd29yZCAmIDB4RkZGRkZGMDApID09IExEUF9JTlNOKQotCSAgICB7Ci0JICAgICAgc3RyY3B5IChuYW1lLCAibGRwIik7Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFswXSwgIjB4JTA2bFgiLCAoaW5zbl93b3JkICYgMHgwMDAwMDBGRikgPDwgMTYpOwotCSAgICAgIG9wZXJhbmRbMV1bMF0gPSAnXDAnOwotCSAgICB9Ci0JfQotICAgIH0KLSAgLyogSGFuZGxlIGNhc2UgZm9yIHN0YWNrIGFuZCByb3RhdGUgaW5zdHJ1Y3Rpb25zLiAqLwotICBlbHNlIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMSkKLSAgICB7Ci0gICAgICBpZiAoaW5zbi0+dG0tPm9wY29kZV9tb2RpZmllciA9PSBTdGFja09wKQotCXsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDFGMDAwMCkgPj4gMTYsIG9wZXJhbmRbMF0pOwotCX0KLSAgICB9Ci0gIC8qIE91dHB1dCBpbnN0cnVjdGlvbiB0byBzdHJlYW0uICovCi0gIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiICAgJXMgJXMlYyVzIiwgbmFtZSwKLQkJICAgICAgb3BlcmFuZFswXVswXSA/IG9wZXJhbmRbMF0gOiAiIiwKLQkJICAgICAgb3BlcmFuZFsxXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFsxXVswXSA/IG9wZXJhbmRbMV0gOiAiIik7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXByaW50X3RocmVlX29wZXJhbmQgKGluZm8sIGluc25fd29yZCwgaW5zbikKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgY2hhciBvcGVyYW5kWzNdWzEzXSA9Ci0gIHsKLSAgICB7MH0sCi0gICAgezB9LAotICAgIHswfX07Ci0KLSAgaWYgKGluc24tPnRtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIHN3aXRjaCAoaW5zbl93b3JkICYgQWRkcmVzc01vZGUpCi0gICAgewotICAgIGNhc2UgQU1fUkVHSVNURVI6Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCBvcGVyYW5kWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgb3BlcmFuZFsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFNX0RJUkVDVDoKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIG9wZXJhbmRbMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQU1fSU5ESVJFQ1Q6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgb3BlcmFuZFsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEFNX0lNTToKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIGlmIChpbnNuLT50bS0+b3BlcmFuZHMgPT0gMykKLSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAxRjAwMDApID4+IDE2LCBvcGVyYW5kWzJdKTsKLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcywlcyVjJXMiLCBpbnNuLT50bS0+bmFtZSwKLQkJICAgICAgb3BlcmFuZFswXSwgb3BlcmFuZFsxXSwKLQkJICAgICAgb3BlcmFuZFsyXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFsyXVswXSA/IG9wZXJhbmRbMl0gOiAiIik7Ci0gIHJldHVybiAxOwotfQotCi1pbnQKLXByaW50X3Bhcl9pbnNuIChpbmZvLCBpbnNuX3dvcmQsIGluc24pCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbl93b3JkOwotICAgICBzdHJ1Y3QgaW5zdHJ1Y3Rpb24gKmluc247Ci17Ci0gIHNpemVfdCBpLCBsZW47Ci0gIGNoYXIgKm5hbWUxLCAqbmFtZTI7Ci0gIGNoYXIgb3BlcmFuZFsyXVszXVsxM10gPQotICB7Ci0gICAgewotICAgICAgezB9LAotICAgICAgezB9LAotICAgICAgezB9fSwKLSAgICB7Ci0gICAgICB7MH0sCi0gICAgICB7MH0sCi0gICAgICB7MH19fTsKLQotICBpZiAoaW5zbi0+cHRtID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIFBhcnNlIG91dCB0aGUgbmFtZXMgb2YgZWFjaCBvZiB0aGUgcGFyYWxsZWwgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlCi0gICAgIHFfaW5zbjFfaW5zbjIgZm9ybWF0LiAqLwotICBuYW1lMSA9IChjaGFyICopIHN0cmR1cCAoaW5zbi0+cHRtLT5uYW1lICsgMik7Ci0gIG5hbWUyID0gIiI7Ci0gIGxlbiA9IHN0cmxlbiAobmFtZTEpOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0gICAgewotICAgICAgaWYgKG5hbWUxW2ldID09ICdfJykKLQl7Ci0JICBuYW1lMiA9ICZuYW1lMVtpICsgMV07Ci0JICBuYW1lMVtpXSA9ICdcMCc7Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAvKiBHZXQgdGhlIG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbiBiYXNlZCBvbiB0aGUgb3BlcmFuZCBvcmRlci4gKi8KLSAgc3dpdGNoIChpbnNuLT5wdG0tPm9wb3JkZXIpCi0gICAgewotICAgIGNhc2UgT09fNG9wMToKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMjIpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9PXzRvcDI6Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDIyKSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPT180b3AzOgotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMV0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzBdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fNW9wMToKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMF0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzJdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fNW9wMjoKLSAgICAgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMV0pOwotICAgICAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzFdWzFdKTsKLSAgICAgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotICAgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVswXSk7Ci0gICAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAyMikgJiAweDA3LCBvcGVyYW5kWzBdWzJdKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT09fUEZpZWxkOgotICAgICAgaWYgKGluc25fd29yZCAmIDB4MDA4MDAwMDApCi0JZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKDB4MDEsIG9wZXJhbmRbMF1bMl0pOwotICAgICAgZWxzZQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAwLCBvcGVyYW5kWzBdWzJdKTsKLSAgICAgIGlmIChpbnNuX3dvcmQgJiAweDAwNDAwMDAwKQotCWdldF9yZWdpc3Rlcl9vcGVyYW5kICgweDAzLCBvcGVyYW5kWzFdWzJdKTsKLSAgICAgIGVsc2UKLQlnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoMHgwMiwgb3BlcmFuZFsxXVsyXSk7Ci0gICAgICBzd2l0Y2ggKGluc25fd29yZCAmIFBfRklFTEQpCi0JewotCWNhc2UgMHgwMDAwMDAwMDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMF1bMV0pOwotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzBdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMV0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFsxXVswXSk7Ci0JICBicmVhazsKLQljYXNlIDB4MDEwMDAwMDA6Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMDAwRkYpLCAxLCBvcGVyYW5kWzFdWzBdKTsKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwRkYwMCkgPj4gOCwgMSwgb3BlcmFuZFswXVswXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxNikgJiAweDA3LCBvcGVyYW5kWzFdWzFdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE5KSAmIDB4MDcsIG9wZXJhbmRbMF1bMV0pOwotCSAgYnJlYWs7Ci0JY2FzZSAweDAyMDAwMDAwOgotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDAwMEZGKSwgMSwgb3BlcmFuZFsxXVsxXSk7Ci0JICBnZXRfaW5kaXJlY3Rfb3BlcmFuZCAoKGluc25fd29yZCAmIDB4MDAwMEZGMDApID4+IDgsIDEsIG9wZXJhbmRbMV1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTYpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0JICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoKGluc25fd29yZCA+PiAxOSkgJiAweDA3LCBvcGVyYW5kWzBdWzBdKTsKLQkgIGJyZWFrOwotCWNhc2UgMHgwMzAwMDAwMDoKLQkgIGdldF9pbmRpcmVjdF9vcGVyYW5kICgoaW5zbl93b3JkICYgMHgwMDAwMDBGRiksIDEsIG9wZXJhbmRbMV1bMV0pOwotCSAgZ2V0X2luZGlyZWN0X29wZXJhbmQgKChpbnNuX3dvcmQgJiAweDAwMDBGRjAwKSA+PiA4LCAxLCBvcGVyYW5kWzBdWzBdKTsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoaW5zbl93b3JkID4+IDE2KSAmIDB4MDcsIG9wZXJhbmRbMV1bMF0pOwotCSAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKChpbnNuX3dvcmQgPj4gMTkpICYgMHgwNywgb3BlcmFuZFswXVsxXSk7Ci0JICBicmVhazsKLQl9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAgICVzICVzLCVzJWMlcyIsIG5hbWUxLAotCQkgICAgICBvcGVyYW5kWzBdWzBdLCBvcGVyYW5kWzBdWzFdLAotCQkgICAgICBvcGVyYW5kWzBdWzJdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzBdWzJdWzBdID8gb3BlcmFuZFswXVsyXSA6ICIiKTsKLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJcblx0XHRcdHx8ICVzICVzLCVzJWMlcyIsIG5hbWUyLAotCQkgICAgICBvcGVyYW5kWzFdWzBdLCBvcGVyYW5kWzFdWzFdLAotCQkgICAgICBvcGVyYW5kWzFdWzJdWzBdID8gJywnIDogJyAnLAotCQkgICAgICBvcGVyYW5kWzFdWzJdWzBdID8gb3BlcmFuZFsxXVsyXSA6ICIiKTsKLSAgZnJlZSAobmFtZTEpOwotICByZXR1cm4gMTsKLX0KLQotaW50Ci1wcmludF9icmFuY2ggKGluZm8sIGluc25fd29yZCwgaW5zbikKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuX3dvcmQ7Ci0gICAgIHN0cnVjdCBpbnN0cnVjdGlvbiAqaW5zbjsKLXsKLSAgY2hhciBvcGVyYW5kWzJdWzEzXSA9Ci0gIHsKLSAgICB7MH0sCi0gICAgezB9fTsKLSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotICBpbnQgcHJpbnRfbGFiZWwgPSAwOwotCi0gIGlmIChpbnNuLT50bSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotICAvKiBHZXQgdGhlIG9wZXJhbmRzIGZvciAyNC1iaXQgaW1tZWRpYXRlIGp1bXBzLiAqLwotICBpZiAoaW5zbi0+dG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBJbW0yNCkKLSAgICB7Ci0gICAgICBhZGRyZXNzID0gaW5zbl93b3JkICYgMHgwMEZGRkZGRjsKLSAgICAgIHNwcmludGYgKG9wZXJhbmRbMF0sICIweCVsWCIsIGFkZHJlc3MpOwotICAgICAgcHJpbnRfbGFiZWwgPSAxOwotICAgIH0KLSAgLyogR2V0IHRoZSBvcGVyYW5kIGZvciB0aGUgdHJhcCBpbnN0cnVjdGlvbi4gKi8KLSAgZWxzZSBpZiAoaW5zbi0+dG0tPm9wZXJhbmRfdHlwZXNbMF0gJiBJVmVjdG9yKQotICAgIHsKLSAgICAgIGFkZHJlc3MgPSBpbnNuX3dvcmQgJiAweDAwMDAwMDFGOwotICAgICAgc3ByaW50ZiAob3BlcmFuZFswXSwgIjB4JWxYIiwgYWRkcmVzcyk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYWRkcmVzcyA9IGluc25fd29yZCAmIDB4MDAwMEZGRkY7Ci0gICAgICAvKiBHZXQgdGhlIG9wZXJhbmRzIGZvciB0aGUgREIgaW5zdHJ1Y3Rpb25zLiAqLwotICAgICAgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAyKQotCXsKLQkgIGdldF9yZWdpc3Rlcl9vcGVyYW5kICgoKGluc25fd29yZCAmIDB4MDFDMDAwMDApID4+IDIyKSArIFJFR19BUjAsIG9wZXJhbmRbMF0pOwotCSAgaWYgKGluc25fd29yZCAmIFBDUmVsKQotCSAgICB7Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFsxXSwgIiVkIiwgKHNob3J0KSBhZGRyZXNzKTsKLQkgICAgICBwcmludF9sYWJlbCA9IDE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgZ2V0X3JlZ2lzdGVyX29wZXJhbmQgKGluc25fd29yZCAmIDB4MDAwMDAwMUYsIG9wZXJhbmRbMV0pOwotCX0KLSAgICAgIC8qIEdldCB0aGUgb3BlcmFuZHMgZm9yIHRoZSBzdGFuZGFyZCBicmFuY2hlcy4gKi8KLSAgICAgIGVsc2UgaWYgKGluc24tPnRtLT5vcGVyYW5kcyA9PSAxKQotCXsKLQkgIGlmIChpbnNuX3dvcmQgJiBQQ1JlbCkKLQkgICAgewotCSAgICAgIGFkZHJlc3MgPSAoc2hvcnQpIGFkZHJlc3M7Ci0JICAgICAgc3ByaW50ZiAob3BlcmFuZFswXSwgIiVsZCIsIGFkZHJlc3MpOwotCSAgICAgIHByaW50X2xhYmVsID0gMTsKLQkgICAgfQotCSAgZWxzZQotCSAgICBnZXRfcmVnaXN0ZXJfb3BlcmFuZCAoaW5zbl93b3JkICYgMHgwMDAwMDAxRiwgb3BlcmFuZFswXSk7Ci0JfQotICAgIH0KLSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIgICAlcyAlcyVjJXMiLCBpbnNuLT50bS0+bmFtZSwKLQkJICAgICAgb3BlcmFuZFswXVswXSA/IG9wZXJhbmRbMF0gOiAiIiwKLQkJICAgICAgb3BlcmFuZFsxXVswXSA/ICcsJyA6ICcgJywKLQkJICAgICAgb3BlcmFuZFsxXVswXSA/IG9wZXJhbmRbMV0gOiAiIik7Ci0gIC8qIFByaW50IGRlc3RpbmF0aW9uIG9mIGJyYW5jaCBpbiByZWxhdGlvbiB0byBjdXJyZW50IHN5bWJvbC4gKi8KLSAgaWYgKHByaW50X2xhYmVsICYmIGluZm8tPnN5bWJvbHMpCi0gICAgewotICAgICAgYXN5bWJvbCAqc3ltID0gKmluZm8tPnN5bWJvbHM7Ci0KLSAgICAgIGlmICgoaW5zbi0+dG0tPm9wY29kZV9tb2RpZmllciA9PSBQQ1JlbCkgJiYgKGluc25fd29yZCAmIFBDUmVsKSkKLQl7Ci0JICBhZGRyZXNzID0gKF9wYyArIDEgKyAoc2hvcnQpIGFkZHJlc3MpIC0gKChzeW0tPnNlY3Rpb24tPnZtYSArIHN5bS0+dmFsdWUpIC8gNCk7Ci0JICAvKiBDaGVjayBmb3IgZGVsYXllZCBpbnN0cnVjdGlvbiwgaWYgc28gYWRqdXN0IGRlc3RpbmF0aW9uLiAqLwotCSAgaWYgKGluc25fd29yZCAmIDB4MDAyMDAwMDApCi0JICAgIGFkZHJlc3MgKz0gMjsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgYWRkcmVzcyAtPSAoKHN5bS0+c2VjdGlvbi0+dm1hICsgc3ltLT52YWx1ZSkgLyA0KTsKLQl9Ci0gICAgICBpZiAoYWRkcmVzcyA9PSAwKQotCWluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiIDwlcz4iLCBzeW0tPm5hbWUpOwotICAgICAgZWxzZQotCWluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiIDwlcyAlYyAlZD4iLCBzeW0tPm5hbWUsCi0JCQkgICAgKChzaG9ydCkgYWRkcmVzcyA8IDApID8gJy0nIDogJysnLAotCQkJICAgIGFicyAoYWRkcmVzcykpOwotICAgIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludAotZ2V0X2luZGlyZWN0X29wZXJhbmQgKGZyYWdtZW50LCBzaXplLCBidWZmZXIpCi0gICAgIHVuc2lnbmVkIHNob3J0IGZyYWdtZW50OwotICAgICBpbnQgc2l6ZTsKLSAgICAgY2hhciAqYnVmZmVyOwotewotICB1bnNpZ25lZCBjaGFyIG1vZDsKLSAgdW5zaWduZWQgYXJudW07Ci0gIHVuc2lnbmVkIGNoYXIgZGlzcDsKLQotICBpZiAoYnVmZmVyID09IE5VTEwpCi0gICAgcmV0dXJuIDA7Ci0gIC8qIERldGVybWluZSB3aGljaCBiaXRzIGlkZW50aWZ5IHRoZSBzZWN0aW9ucyBvZiB0aGUgaW5kaXJlY3Qgb3BlcmFuZCBiYXNlZCBvbiB0aGUKLSAgICAgc2l6ZSBpbiBieXRlcy4gKi8KLSAgc3dpdGNoIChzaXplKQotICAgIHsKLSAgICBjYXNlIDE6Ci0gICAgICBtb2QgPSAoZnJhZ21lbnQgJiAweDAwRjgpID4+IDM7Ci0gICAgICBhcm51bSA9IChmcmFnbWVudCAmIDB4MDAwNyk7Ci0gICAgICBkaXNwID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgIG1vZCA9IChmcmFnbWVudCAmIDB4RjgwMCkgPj4gMTE7Ci0gICAgICBhcm51bSA9IChmcmFnbWVudCAmIDB4MDcwMCkgPj4gODsKLSAgICAgIGRpc3AgPSAoZnJhZ21lbnQgJiAweDAwRkYpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgewotICAgIGNvbnN0IGluZF9hZGRyX3R5cGUgKmN1cnJlbnRfaW5kID0gdGljMzBfaW5kYWRkcl90YWI7Ci0gICAgZm9yICg7IGN1cnJlbnRfaW5kIDwgdGljMzBfaW5kYWRkcnRhYl9lbmQ7IGN1cnJlbnRfaW5kKyspCi0gICAgICB7Ci0JaWYgKGN1cnJlbnRfaW5kLT5tb2RmaWVsZCA9PSBtb2QpCi0JICB7Ci0JICAgIGlmIChjdXJyZW50X2luZC0+ZGlzcGxhY2VtZW50ID09IElNUExJRURfRElTUCAmJiBzaXplID09IDIpCi0JICAgICAgewotCQljb250aW51ZTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCXNpemVfdCBpLCBsZW47Ci0JCWludCBidWZjbnQ7Ci0JCQotCQlsZW4gPSBzdHJsZW4gKGN1cnJlbnRfaW5kLT5zeW50YXgpOwotCQlmb3IgKGkgPSAwLCBidWZjbnQgPSAwOyBpIDwgbGVuOyBpKyssIGJ1ZmNudCsrKQotCQkgIHsKLQkJICAgIGJ1ZmZlcltidWZjbnRdID0gY3VycmVudF9pbmQtPnN5bnRheFtpXTsKLQkJICAgIGlmIChidWZmZXJbYnVmY250IC0gMV0gPT0gJ2EnICYmIGJ1ZmZlcltidWZjbnRdID09ICdyJykKLQkJICAgICAgYnVmZmVyWysrYnVmY250XSA9IGFybnVtICsgJzAnOwotCQkgICAgaWYgKGJ1ZmZlcltidWZjbnRdID09ICcoJyAmJiBjdXJyZW50X2luZC0+ZGlzcGxhY2VtZW50ID09IERJU1BfUkVRVUlSRUQpCi0JCSAgICAgIHsKLQkJCXNwcmludGYgKCZidWZmZXJbYnVmY250ICsgMV0sICIldSIsIGRpc3ApOwotCQkJYnVmY250ICs9IHN0cmxlbiAoJmJ1ZmZlcltidWZjbnQgKyAxXSk7Ci0JCSAgICAgIH0KLQkJICB9Ci0JCWJ1ZmZlcltidWZjbnQgKyAxXSA9ICdcMCc7Ci0JCWJyZWFrOwotCSAgICAgIH0KLQkgIH0KLSAgICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotaW50Ci1nZXRfcmVnaXN0ZXJfb3BlcmFuZCAoZnJhZ21lbnQsIGJ1ZmZlcikKLSAgICAgdW5zaWduZWQgY2hhciBmcmFnbWVudDsKLSAgICAgY2hhciAqYnVmZmVyOwotewotICBjb25zdCByZWcgKmN1cnJlbnRfcmVnID0gdGljMzBfcmVndGFiOwotCi0gIGlmIChidWZmZXIgPT0gTlVMTCkKLSAgICByZXR1cm4gMDsKLSAgZm9yICg7IGN1cnJlbnRfcmVnIDwgdGljMzBfcmVndGFiX2VuZDsgY3VycmVudF9yZWcrKykKLSAgICB7Ci0gICAgICBpZiAoKGZyYWdtZW50ICYgMHgxRikgPT0gY3VycmVudF9yZWctPm9wY29kZSkKLQl7Ci0JICBzdHJjcHkgKGJ1ZmZlciwgY3VycmVudF9yZWctPm5hbWUpOwotCSAgcmV0dXJuIDE7Ci0JfQotICAgIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludAotY252dF90bXNmbG9hdF9pZWVlICh0bXNmbG9hdCwgc2l6ZSwgaWVlZWZsb2F0KQotICAgICB1bnNpZ25lZCBsb25nIHRtc2Zsb2F0OwotICAgICBpbnQgc2l6ZTsKLSAgICAgZmxvYXQgKmllZWVmbG9hdDsKLXsKLSAgdW5zaWduZWQgbG9uZyBleHAsIHNpZ24sIG1hbnQ7Ci0KLSAgaWYgKHNpemUgPT0gMikKLSAgICB7Ci0gICAgICBpZiAoKHRtc2Zsb2F0ICYgMHgwMDAwRjAwMCkgPT0gMHgwMDAwODAwMCkKLQl0bXNmbG9hdCA9IDB4ODAwMDAwMDA7Ci0gICAgICBlbHNlCi0JewotCSAgdG1zZmxvYXQgPDw9IDE2OwotCSAgdG1zZmxvYXQgPSAobG9uZykgdG1zZmxvYXQgPj4gNDsKLQl9Ci0gICAgfQotICBleHAgPSB0bXNmbG9hdCAmIDB4RkYwMDAwMDA7Ci0gIGlmIChleHAgPT0gMHg4MDAwMDAwMCkKLSAgICB7Ci0gICAgICAqaWVlZWZsb2F0ID0gMC4wOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICBleHAgKz0gMHg3RjAwMDAwMDsKLSAgc2lnbiA9ICh0bXNmbG9hdCAmIDB4MDA4MDAwMDApIDw8IDg7Ci0gIG1hbnQgPSB0bXNmbG9hdCAmIDB4MDA3RkZGRkY7Ci0gIGlmIChleHAgPT0gMHhGRjAwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAobWFudCA9PSAwKQotCSppZWVlZmxvYXQgPSBFUkFOR0U7Ci0gICAgICBpZiAoc2lnbiA9PSAwKQotCSppZWVlZmxvYXQgPSAxLjAgLyAwLjA7Ci0gICAgICBlbHNlCi0JKmllZWVmbG9hdCA9IC0xLjAgLyAwLjA7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIGV4cCA+Pj0gMTsKLSAgaWYgKHNpZ24pCi0gICAgewotICAgICAgbWFudCA9ICh+bWFudCkgJiAweDAwN0ZGRkZGOwotICAgICAgbWFudCArPSAxOwotICAgICAgZXhwICs9IG1hbnQgJiAweDAwODAwMDAwOwotICAgICAgZXhwICY9IDB4N0Y4MDAwMDA7Ci0gICAgICBtYW50ICY9IDB4MDA3RkZGRkY7Ci0gICAgfQotICBpZiAodG1zZmxvYXQgPT0gMHg4MDAwMDAwMCkKLSAgICBzaWduID0gbWFudCA9IGV4cCA9IDA7Ci0gIHRtc2Zsb2F0ID0gc2lnbiB8IGV4cCB8IG1hbnQ7Ci0gICppZWVlZmxvYXQgPSAqKChmbG9hdCAqKSAmdG1zZmxvYXQpOwotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdGljODAtZGlzLmMgYi9vcGNvZGVzL3RpYzgwLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjZiYzEyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdGljODAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyogUHJpbnQgVEkgVE1TMzIwQzgwIChNVlApIGluc3RydWN0aW9ucwotICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAiYW5zaWRlY2wuaCIKLSNpbmNsdWRlICJvcGNvZGUvdGljODAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyBpbnQgbGVuZ3RoOwotCi1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2JpdG51bSBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2NvbmRpdGlvbl9jb2RlIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfY29udHJvbF9yZWdpc3RlciBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kX2Zsb2F0IFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcpKTsKLXN0YXRpYyB2b2lkIHByaW50X29wZXJhbmRfaW50ZWdlciBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBwcmludF9vcGVyYW5kIFBBUkFNUyAoKHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICosIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkJICAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKiwgYmZkX3ZtYSkpOwotc3RhdGljIGludCBwcmludF9vbmVfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nLCBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICopKTsKLXN0YXRpYyBpbnQgcHJpbnRfaW5zdHJ1Y3Rpb24gUEFSQU1TICgoc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKiwgYmZkX3ZtYSwgdW5zaWduZWQgbG9uZywKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICopKTsKLXN0YXRpYyBpbnQgZmlsbF9pbnN0cnVjdGlvbiBQQVJBTVMgKChzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqLCBiZmRfdm1hLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqKSk7Ci0KLQwKLS8qIFByaW50IGFuIGludGVnZXIgb3BlcmFuZC4gIFRyeSB0byBiZSBzb21ld2hhdCBzbWFydCBhYm91dCB0aGUKLSAgIGZvcm1hdCBieSBhc3N1bWluZyB0aGF0IHNtYWxsIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGludGVnZXJzIGFyZQotICAgcHJvYmFibHkgbG9vcCBpbmNyZW1lbnQgdmFsdWVzLCBzdHJ1Y3R1cmUgb2Zmc2V0cywgb3Igc2ltaWxhcgotICAgdmFsdWVzIHRoYXQgYXJlIG1vcmUgbWVhbmluZ2Z1bCBwcmludGVkIGFzIHNpZ25lZCBkZWNpbWFsIHZhbHVlcy4KLSAgIExhcmdlciBudW1iZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgcHJpbnRlZCBhcyBoZXggdmFsdWVzLiAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGlmICgodmFsdWUgPiA5OTk5IHx8IHZhbHVlIDwgLTk5OTkpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICAgIH0KLX0KLQotDAotLyogRklYTUU6IGRlcGVuZHMgdXBvbiBzaXplb2YgKGxvbmcpID09IHNpemVvZiAoZmxvYXQpIGFuZAotICAgYWxzbyB1cG9uIGhvc3QgZmxvYXRpbmcgcG9pbnQgZm9ybWF0IG1hdGNoaW5nIHRhcmdldAotICAgZmxvYXRpbmcgcG9pbnQgZm9ybWF0LiAqLwotCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9mbG9hdCAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICB1bmlvbiB7IGZsb2F0IGY7IGxvbmcgbDsgfSBmdmFsOwotCi0gIGZ2YWwubCA9IHZhbHVlOwotICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlZyIsIGZ2YWwuZik7Ci19Ci0KLQwKLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgKGluZm8sIHZhbHVlKQotICAgICBzdHJ1Y3QgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgbG9uZyB2YWx1ZTsKLXsKLSAgY29uc3QgY2hhciAqdG1wOwotCi0gIHRtcCA9IHRpYzgwX3ZhbHVlX3RvX3N5bWJvbCAodmFsdWUsIFRJQzgwX09QRVJBTkRfQ1IpOwotICBpZiAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotfQotCi0MCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZF9jb25kaXRpb25fY29kZSAoaW5mbywgdmFsdWUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBsb25nIHZhbHVlOwotewotICBjb25zdCBjaGFyICp0bXA7Ci0KLSAgdG1wID0gdGljODBfdmFsdWVfdG9fc3ltYm9sICh2YWx1ZSwgVElDODBfT1BFUkFORF9DQyk7Ci0gIGlmICh0bXAgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIlcyIsIHRtcCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJWxkIiwgdmFsdWUpOwotICAgIH0KLX0KLQotDAotc3RhdGljIHZvaWQKLXByaW50X29wZXJhbmRfYml0bnVtIChpbmZvLCB2YWx1ZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci17Ci0gIGludCBiaXRudW07Ci0gIGNvbnN0IGNoYXIgKnRtcDsKLQotICBiaXRudW0gPSB+dmFsdWUgJiAweDFGOwotICB0bXAgPSB0aWM4MF92YWx1ZV90b19zeW1ib2wgKGJpdG51bSwgVElDODBfT1BFUkFORF9CSVROVU0pOwotICBpZiAodG1wICE9IE5VTEwpCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiJXMiLCB0bXApOwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiVsZCIsIGJpdG51bSk7Ci0gICAgfQotfQotCi0MCi0vKiBQcmludCB0aGUgb3BlcmFuZCBhcyBkaXJlY3RlZCBieSB0aGUgZmxhZ3MuICAqLwotCi0jZGVmaW5lIE1fU0koaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9TSSkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDE3KSkpCi0jZGVmaW5lIE1fTEkoaW5zbixvcCkgKCgoKG9wKSAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfTV9MSSkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDE1KSkpCi0jZGVmaW5lIFJfU0NBTEVEKGluc24sb3ApICgoKChvcCkgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX1NDQUxFRCkgIT0gMCkgJiYgKChpbnNuKSAmICgxIDw8IDExKSkpCi0KLXN0YXRpYyB2b2lkCi1wcmludF9vcGVyYW5kIChpbmZvLCB2YWx1ZSwgaW5zbiwgb3BlcmFuZCwgbWVtYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGxvbmcgdmFsdWU7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wZXJhbmQgKm9wZXJhbmQ7Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLXsKLSAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9HUFIpICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiciVsZCIsIHZhbHVlKTsKLSAgICAgIGlmIChNX1NJIChpbnNuLCBvcGVyYW5kKSB8fCBNX0xJIChpbnNuLCBvcGVyYW5kKSkKLQl7Ci0JICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICI6bSIpOwotCX0KLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9GUEEpICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiYSVsZCIsIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9QQ1JFTCkgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gcHJpbnRfYWRkcmVzc19mdW5jKSAobWVtYWRkciArIDQgKiB2YWx1ZSwgaW5mbyk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQkFTRVJFTCkgIT0gMCkKLSAgICB7Ci0gICAgICAoKmluZm8gLT4gcHJpbnRfYWRkcmVzc19mdW5jKSAodmFsdWUsIGluZm8pOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0JJVE5VTSkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2JpdG51bSAoaW5mbywgdmFsdWUpOwotICAgIH0KLSAgZWxzZSBpZiAoKG9wZXJhbmQgLT4gZmxhZ3MgJiBUSUM4MF9PUEVSQU5EX0NDKSAhPSAwKQotICAgIHsKLSAgICAgIHByaW50X29wZXJhbmRfY29uZGl0aW9uX2NvZGUgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9DUikgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2NvbnRyb2xfcmVnaXN0ZXIgKGluZm8sIHZhbHVlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9GTE9BVCkgIT0gMCkKLSAgICB7Ci0gICAgICBwcmludF9vcGVyYW5kX2Zsb2F0IChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfQklURklFTEQpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUjbHgiLCB2YWx1ZSk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgcHJpbnRfb3BlcmFuZF9pbnRlZ2VyIChpbmZvLCB2YWx1ZSk7Ci0gICAgfQotCi0gIC8qIElmIHRoaXMgaXMgYSBzY2FsZWQgb3BlcmFuZCwgdGhlbiBwcmludCB0aGUgbW9kaWZpZXIgKi8KLQotICBpZiAoUl9TQ0FMRUQgKGluc24sIG9wZXJhbmQpKQotICAgIHsKLSAgICAgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIjpzIik7Ci0gICAgfQotfQotCi0MCi0vKiBXZSBoYXZlIGNob3NlbiBhbiBvcGNvZGUgdGFibGUgZW50cnkgKi8KLQotc3RhdGljIGludAotcHJpbnRfb25lX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNuLCBvcGNvZGUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgY29uc3Qgc3RydWN0IHRpYzgwX29wY29kZSAqb3Bjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgdGljODBfb3BlcmFuZCAqb3BlcmFuZDsKLSAgbG9uZyB2YWx1ZTsKLSAgaW50IHN0YXR1czsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqb3BpbmRleDsKLSAgaW50IGNsb3NlX3BhcmVuOwotCi0gICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiUtMTBzIiwgb3Bjb2RlIC0+IG5hbWUpOwotCi0gIGZvciAob3BpbmRleCA9IG9wY29kZSAtPiBvcGVyYW5kczsgKm9waW5kZXggIT0gMDsgb3BpbmRleCsrKQotICAgIHsKLSAgICAgIG9wZXJhbmQgPSB0aWM4MF9vcGVyYW5kcyArICpvcGluZGV4OwotCi0gICAgICAvKiBFeHRyYWN0IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBpZiAob3BlcmFuZCAtPiBleHRyYWN0KQotCXsKLQkgIHZhbHVlID0gKCpvcGVyYW5kIC0+IGV4dHJhY3QpIChpbnNuLCAoaW50ICopIE5VTEwpOwotCX0KLSAgICAgIGVsc2UgaWYgKG9wZXJhbmQgLT4gYml0cyA9PSAzMikKLQl7Ci0JICBzdGF0dXMgPSBmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCAodW5zaWduZWQgbG9uZyAqKSAmdmFsdWUpOwotCSAgaWYgKHN0YXR1cyA9PSAtMSkKLQkgICAgewotCSAgICAgIHJldHVybiAoc3RhdHVzKTsKLQkgICAgfQotCX0KLSAgICAgIGVsc2UKLQl7Ci0JICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQgLT4gc2hpZnQpICYgKCgxIDw8IG9wZXJhbmQgLT4gYml0cykgLSAxKTsKLQkgIGlmICgob3BlcmFuZCAtPiBmbGFncyAmIFRJQzgwX09QRVJBTkRfU0lHTkVEKSAhPSAwCi0JICAgICAgJiYgKHZhbHVlICYgKDEgPDwgKG9wZXJhbmQgLT4gYml0cyAtIDEpKSkgIT0gMCkKLQkgICAgewotCSAgICAgIHZhbHVlIC09IDEgPDwgb3BlcmFuZCAtPiBiaXRzOwotCSAgICB9Ci0JfQotCi0gICAgICAvKiBJZiB0aGlzIG9wZXJhbmQgaXMgZW5jbG9zZWQgaW4gcGFyZW50aGVzaXMsIHRoZW4gcHJpbnQKLQkgdGhlIG9wZW4gcGFyZW4sIG90aGVyd2lzZSBqdXN0IHByaW50IHRoZSByZWd1bGFyIGNvbW1hCi0JIHNlcGFyYXRvciwgZXhjZXB0IGZvciB0aGUgZmlyc3Qgb3BlcmFuZC4gKi8KLQotICAgICAgaWYgKChvcGVyYW5kIC0+IGZsYWdzICYgVElDODBfT1BFUkFORF9QQVJFTlMpID09IDApCi0JewotCSAgY2xvc2VfcGFyZW4gPSAwOwotCSAgaWYgKG9waW5kZXggIT0gb3Bjb2RlIC0+IG9wZXJhbmRzKQotCSAgICB7Ci0JICAgICAgKCppbmZvIC0+IGZwcmludGZfZnVuYykgKGluZm8gLT4gc3RyZWFtLCAiLCIpOwotCSAgICB9Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIGNsb3NlX3BhcmVuID0gMTsKLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIigiKTsKLQl9Ci0KLSAgICAgIHByaW50X29wZXJhbmQgKGluZm8sIHZhbHVlLCBpbnNuLCBvcGVyYW5kLCBtZW1hZGRyKTsKLQotICAgICAgLyogSWYgd2UgcHJpbnRlZCBhbiBvcGVuIHBhcmVuIGJlZm9yZSBwcmludGluZyB0aGlzIG9wZXJhbmQsIGNsb3NlCi0JIGl0IG5vdy4gVGhlIGZsYWcgZ2V0cyByZXNldCBvbiBlYWNoIGxvb3AuICovCi0KLSAgICAgIGlmIChjbG9zZV9wYXJlbikKLQl7Ci0JICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIpIik7Ci0JfQotICAgIH0KLSAgcmV0dXJuIChsZW5ndGgpOwotfQotCi0MCi0KLS8qIFRoZXJlIGFyZSBubyBzcGVjaWZpYyBiaXRzIHRoYXQgdGVsbCB1cyBmb3IgY2VydGFpbiB3aGV0aGVyIGEgdmVjdG9yCi0gICBpbnN0cnVjdGlvbiBvcGNvZGUgY29udGFpbnMgb25lIG9yIHR3byBpbnN0cnVjdGlvbnMuICBIb3dldmVyIHNpbmNlCi0gICBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIG9mIHIwIGlzIGlsbGVnYWwsIHdlIGNhbiBjaGVjayBmb3Igbm9uemVybwotICAgdmFsdWVzIGluIGJvdGggZGVzdGluYXRpb24gcmVnaXN0ZXIgZmllbGRzLiAgT25seSBvcGNvZGVzIHRoYXQgaGF2ZQotICAgdHdvIHZhbGlkIGluc3RydWN0aW9ucyB3aWxsIGhhdmUgbm9uLXplcm8gaW4gYm90aCAqLwotCi0jZGVmaW5lIFRXT19JTlNOKGluc24pICgoKChpbnNuKSAmICgweDFGIDw8IDI3KSkgIT0gMCkgJiYgKCgoaW5zbikgJiAoMHgxRiA8PCAyMikpICE9IDApKQotCi1zdGF0aWMgaW50Ci1wcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgdmVjX29wY29kZSkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICp2ZWNfb3Bjb2RlOwotewotICBjb25zdCBzdHJ1Y3QgdGljODBfb3Bjb2RlICpvcGNvZGU7Ci0gIGNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgKm9wY29kZV9lbmQ7Ci0KLSAgLyogRmluZCB0aGUgZmlyc3Qgb3Bjb2RlIG1hdGNoIGluIHRoZSBvcGNvZGVzIHRhYmxlLiAgRm9yIHZlY3RvcgotICAgICBvcGNvZGVzICh2ZWNfb3Bjb2RlICE9IE5VTEwpIGZpbmQgdGhlIGZpcnN0IG1hdGNoIHRoYXQgaXMgbm90IHRoZQotICAgICBwcmV2aW91c2x5IGZvdW5kIG1hdGNoLiAgRklYTUU6IHRoZXJlIHNob3VsZCBiZSBmYXN0ZXIgd2F5cyB0bwotICAgICBzZWFyY2ggKGhhc2ggdGFibGUgb3IgYmluYXJ5IHNlYXJjaCksIGJ1dCBkb24ndCB3b3JyeSB0b28gbXVjaAotICAgICBhYm91dCBpdCB1bnRpbCBvdGhlciBUSWM4MCBzdXBwb3J0IGlzIGZpbmlzaGVkLiAqLwotCi0gIG9wY29kZV9lbmQgPSB0aWM4MF9vcGNvZGVzICsgdGljODBfbnVtX29wY29kZXM7Ci0gIGZvciAob3Bjb2RlID0gdGljODBfb3Bjb2Rlczsgb3Bjb2RlIDwgb3Bjb2RlX2VuZDsgb3Bjb2RlKyspCi0gICAgewotICAgICAgaWYgKChpbnNuICYgb3Bjb2RlIC0+IG1hc2spID09IG9wY29kZSAtPiBvcGNvZGUgJiYKLQkgIG9wY29kZSAhPSB2ZWNfb3Bjb2RlKQotCXsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKG9wY29kZSA9PSBvcGNvZGVfZW5kKQotICAgIHsKLSAgICAgIC8qIE5vIG1hdGNoIGZvdW5kLCBqdXN0IHByaW50IHRoZSBiaXRzIGFzIGEgLndvcmQgZGlyZWN0aXZlICovCi0gICAgICAoKmluZm8gLT4gZnByaW50Zl9mdW5jKSAoaW5mbyAtPiBzdHJlYW0sICIud29yZCAlIzA4bHgiLCBpbnNuKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBNYXRjaCBmb3VuZCwgZGVjb2RlIHRoZSBpbnN0cnVjdGlvbi4gICovCi0gICAgICBsZW5ndGggPSBwcmludF9vbmVfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIG9wY29kZSk7Ci0gICAgICBpZiAob3Bjb2RlIC0+IGZsYWdzICYgVElDODBfVkVDVE9SICYmIHZlY19vcGNvZGUgPT0gTlVMTCAmJiBUV09fSU5TTiAoaW5zbikpCi0JewotCSAgLyogVGhlcmUgaXMgYW5vdGhlciBpbnN0cnVjdGlvbiB0byBwcmludCBmcm9tIHRoZSBzYW1lIG9wY29kZS4KLQkgICAgIFByaW50IHRoZSBzZXBhcmF0b3IgYW5kIHRoZW4gZmluZCBhbmQgcHJpbnQgdGhlIG90aGVyCi0JICAgICBpbnN0cnVjdGlvbi4gKi8KLQkgICgqaW5mbyAtPiBmcHJpbnRmX2Z1bmMpIChpbmZvIC0+IHN0cmVhbSwgIiAgIHx8ICAgIik7Ci0JICBsZW5ndGggPSBwcmludF9pbnN0cnVjdGlvbiAoaW5mbywgbWVtYWRkciwgaW5zbiwgb3Bjb2RlKTsKLQl9Ci0gICAgfQotICByZXR1cm4gKGxlbmd0aCk7Ci19Ci0KLS8qIEdldCB0aGUgbmV4dCAzMiBiaXQgd29yZCBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gYW5kIGNvbnZlcnQgaXQKLSAgIGludG8gaW50ZXJuYWwgZm9ybWF0IGluIHRoZSB1bnNpZ25lZCBsb25nIElOU04sIGZvciB3aGljaCB3ZSBhcmUKLSAgIHBhc3NlZCB0aGUgYWRkcmVzcy4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAqLwotCi1zdGF0aWMgaW50Ci1maWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCBpbnNucCkKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgdW5zaWduZWQgbG9uZyAqaW5zbnA7Ci17Ci0gIGJmZF9ieXRlIGJ1ZmZlcls0XTsKLSAgaW50IHN0YXR1czsKLQotICAvKiBHZXQgdGhlIGJpdHMgZm9yIHRoZSBuZXh0IDMyIGJpdCB3b3JkIGFuZCBwdXQgaW4gYnVmZmVyICovCi0KLSAgc3RhdHVzID0gKCppbmZvIC0+IHJlYWRfbWVtb3J5X2Z1bmMpIChtZW1hZGRyICsgbGVuZ3RoLCBidWZmZXIsIDQsIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvIC0+IG1lbW9yeV9lcnJvcl9mdW5jKSAoc3RhdHVzLCBtZW1hZGRyLCBpbmZvKTsKLSAgICAgIHJldHVybiAoLTEpOwotICAgIH0KLQotICAvKiBSZWFkIHdhcyBzdWNjZXNzZnVsLCBzbyBpbmNyZW1lbnQgY291bnQgb2YgYnl0ZXMgcmVhZCBhbmQgY29udmVydAotICAgICB0aGUgYml0cyBpbnRvIGludGVybmFsIGZvcm1hdC4gKi8KLSAgICAgCi0gIGxlbmd0aCArPSA0OwotICBpZiAoaW5mbyAtPiBlbmRpYW4gPT0gQkZEX0VORElBTl9MSVRUTEUpCi0gICAgewotICAgICAgKmluc25wID0gYmZkX2dldGwzMiAoYnVmZmVyKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGluZm8gLT4gZW5kaWFuID09IEJGRF9FTkRJQU5fQklHKQotICAgIHsKLSAgICAgICppbnNucCA9IGJmZF9nZXRiMzIgKGJ1ZmZlcik7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogRklYTUU6IFNob3VsZCBwcm9iYWJseSBqdXN0IGRlZmF1bHQgdG8gb25lIG9yIHRoZSBvdGhlciAqLwotICAgICAgYWJvcnQgKCk7Ci0gICAgfQotICByZXR1cm4gKDApOwotfQotCi0MCi1pbnQgCi1wcmludF9pbnNuX3RpYzgwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICB1bnNpZ25lZCBsb25nIGluc247Ci0gIGludCBzdGF0dXM7Ci0KLSAgbGVuZ3RoID0gMDsKLSAgaW5mby0+Ynl0ZXNfcGVyX2xpbmUgPSA4OwotICBzdGF0dXMgPSBmaWxsX2luc3RydWN0aW9uIChpbmZvLCBtZW1hZGRyLCAmaW5zbik7Ci0gIGlmIChzdGF0dXMgIT0gLTEpCi0gICAgewotICAgICAgc3RhdHVzID0gcHJpbnRfaW5zdHJ1Y3Rpb24gKGluZm8sIG1lbWFkZHIsIGluc24sIE5VTEwpOwotICAgIH0KLSAgcmV0dXJuIChzdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy90aWM4MC1vcGMuYyBiL29wY29kZXMvdGljODAtb3BjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWMzMDguLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy90aWM4MC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMTYgKzAsMCBAQAotLyogT3Bjb2RlIHRhYmxlIGZvciBUSSBUTVMzMjBDODAgKE1WUCkuCi0gICBDb3B5cmlnaHQgMTk5NiwgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR0RCLCBHQVMsIGFuZCB0aGUgR05VIGJpbnV0aWxzLgotCi1HREIsIEdBUywgYW5kIHRoZSBHTlUgYmludXRpbHMgYXJlIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlCi10aGVtIGFuZC9vciBtb2RpZnkgdGhlbSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLTEsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLUdEQiwgR0FTLCBhbmQgdGhlIEdOVSBiaW51dGlscyBhcmUgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCB0aGV5Ci13aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKLXdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQotdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCi1Tb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKLTAyMTExLTEzMDcsIFVTQS4gICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3RpYzgwLmgiCi0KLS8qIFRoaXMgZmlsZSBob2xkcyB2YXJpb3VzIHRhYmxlcyBmb3IgdGhlIFRNUzMyMEM4MCAoTVZQKS4KLQotICAgVGhlIG9wY29kZSB0YWJsZSBpcyBzdHJpY3RseSBjb25zdGFudCBkYXRhLCBzbyB0aGUgY29tcGlsZXIgc2hvdWxkCi0gICBiZSBhYmxlIHRvIHB1dCBpdCBpbiB0aGUgLnRleHQgc2VjdGlvbi4KLQotICAgVGhpcyBmaWxlIGFsc28gaG9sZHMgdGhlIG9wZXJhbmQgdGFibGUuICBBbGwga25vd2xlZGdlIGFib3V0Ci0gICBpbnNlcnRpbmcgb3BlcmFuZHMgaW50byBpbnN0cnVjdGlvbnMgYW5kIHZpY2UtdmVyc2EgaXMga2VwdCBpbiB0aGlzCi0gICBmaWxlLgotCi0gICBUaGUgcHJlZGVmaW5lZCByZWdpc3RlciB0YWJsZSBtYXBzIGZyb20gcmVnaXN0ZXIgbmFtZXMgdG8gcmVnaXN0ZXIKLSAgIHZhbHVlcy4gICovCi0KLQwKLS8qIFRhYmxlIG9mIHByZWRlZmluZWQgc3ltYm9sIG5hbWVzLCBzdWNoIGFzIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMsCi0gICBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMsIGNvbmRpdGlvbiBjb2RlcywgY29udHJvbCByZWdpc3RlcnMsIGFuZCBiaXQKLSAgIG51bWJlcnMuCi0KLSAgIFRoZSB0YWJsZSBpcyBzb3J0ZWQgY2FzZSBpbmRlcGVuZGVudGx5IGJ5IG5hbWUgc28gdGhhdCBpdCBpcyBzdWl0YWJsZSBmb3IKLSAgIHNlYXJjaGluZyB2aWEgYSBiaW5hcnkgc2VhcmNoIHVzaW5nIGEgY2FzZSBpbmRlcGVuZGVudCBjb21wYXJpc29uCi0gICBmdW5jdGlvbi4KLQotICAgTm90ZSB0aGF0IHRoZSB0eXBlIG9mIHRoZSBzeW1ib2wgaXMgc3RvcmVkIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSB2YWx1ZQotICAgZmllbGQsIHdoaWNoIGFsbG93cyB0aGUgdmFsdWUgYW5kIHR5cGUgdG8gYmUgcGFzc2VkIGFyb3VuZCBhcyBhIHVuaXQgaW4gYQotICAgc2luZ2xlIGludC4gIFRoZSB0eXBlcyBoYXZlIHRvIGJlIG1hc2tlZCBvZmYgYmVmb3JlIHVzaW5nIHRoZSBudW1lcmljCi0gICB2YWx1ZSBhcyBhIG51bWJlci4KLSovCi0KLWNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbXSA9Ci17Ci0gIHsgImEwIiwJVElDODBfT1BFUkFORF9GUEEgfCAwIH0sCi0gIHsgImExIiwJVElDODBfT1BFUkFORF9GUEEgfCAxIH0sCi0gIHsgImFsdy5iIiwJVElDODBfT1BFUkFORF9DQyB8IDcgfSwKLSAgeyAiYWx3LmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTUgfSwKLSAgeyAiYWx3LnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMjMgfSwKLSAgeyAiQU5BU1RBVCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDM0IH0sCi0gIHsgIkJSSzEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzOSB9LAotICB7ICJCUksyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4M0EgfSwKLSAgeyAiQ09ORklHIiwJVElDODBfT1BFUkFORF9DUiB8IDIgfSwKLSAgeyAiRExSVSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDUwMCB9LAotICB7ICJEVEFHMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMCB9LAotICB7ICJEVEFHMSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMSB9LAotICB7ICJEVEFHMTAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEEgfSwKLSAgeyAiRFRBRzExIiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBCIH0sCi0gIHsgIkRUQUcxMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwQyB9LAotICB7ICJEVEFHMTMiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MEQgfSwKLSAgeyAiRFRBRzE0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4NDBFIH0sCi0gIHsgIkRUQUcxNSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwRiB9LAotICB7ICJEVEFHMiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMiB9LAotICB7ICJEVEFHMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMyB9LAotICB7ICJEVEFHNCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwNCB9LAotICB7ICJEVEFHNSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwNSB9LAotICB7ICJEVEFHNiIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwNiB9LAotICB7ICJEVEFHNyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwNyB9LAotICB7ICJEVEFHOCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwOCB9LAotICB7ICJEVEFHOSIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwOSB9LAotICB7ICJFQ09NQ05UTCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDMzIH0sCi0gIHsgIkVJUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAxIH0sCi0gIHsgIkVQQyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAwIH0sCi0gIHsgImVxLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAwIH0sCi0gIHsgImVxLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMCB9LAotICB7ICJlcS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTAgfSwKLSAgeyAiZXEudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIwIH0sCi0gIHsgImVxMC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDIgfSwKLSAgeyAiZXEwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTAgfSwKLSAgeyAiZXEwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTggfSwKLSAgeyAiRkxUQURSIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTEgfSwKLSAgeyAiRkxURFRIIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTQgfSwKLSAgeyAiRkxURFRMIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MTMgfSwKLSAgeyAiRkxUT1AiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMCB9LAotICB7ICJGTFRUQUciLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgxMiB9LAotICB7ICJGUFNUIiwJVElDODBfT1BFUkFORF9DUiB8IDggfSwKLSAgeyAiZ2UuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDUgfSwKLSAgeyAiZ2UuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI1IH0sCi0gIHsgImdlLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxNSB9LAotICB7ICJnZS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjUgfSwKLSAgeyAiZ2UwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMyB9LAotICB7ICJnZTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMSB9LAotICB7ICJnZTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxOSB9LAotICB7ICJndC5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMiB9LAotICB7ICJndC5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjIgfSwKLSAgeyAiZ3QuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDEyIH0sCi0gIHsgImd0LnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMiB9LAotICB7ICJndDAuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxIH0sCi0gIHsgImd0MC5oIiwJVElDODBfT1BFUkFORF9DQyB8IDkgfSwKLSAgeyAiZ3QwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTcgfSwKLSAgeyAiaGkuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDYgfSwKLSAgeyAiaGkuaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE2IH0sCi0gIHsgImhpLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNiB9LAotICB7ICJocy5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgOSB9LAotICB7ICJocy5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTkgfSwKLSAgeyAiaHMudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI5IH0sCi0gIHsgImliLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyOCB9LAotICB7ICJJRSIsCVRJQzgwX09QRVJBTkRfQ1IgfCA2IH0sCi0gIHsgIklMUlUiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgzMDAgfSwKLSAgeyAiaW4uZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI3IH0sCi0gIHsgIklOMFAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDAwIH0sCi0gIHsgIklOMVAiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHg0MDAxIH0sCi0gIHsgIklOVFBFTiIsCVRJQzgwX09QRVJBTkRfQ1IgfCA0IH0sCi0gIHsgIklUQUcwIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAwIH0sCi0gIHsgIklUQUcxIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAxIH0sCi0gIHsgIklUQUcxMCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwQSB9LAotICB7ICJJVEFHMTEiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEIgfSwKLSAgeyAiSVRBRzEyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBDIH0sCi0gIHsgIklUQUcxMyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwRCB9LAotICB7ICJJVEFHMTQiLAlUSUM4MF9PUEVSQU5EX0NSIHwgMHgyMEUgfSwKLSAgeyAiSVRBRzE1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjBGIH0sCi0gIHsgIklUQUcyIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAyIH0sCi0gIHsgIklUQUczIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjAzIH0sCi0gIHsgIklUQUc0IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA0IH0sCi0gIHsgIklUQUc1IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA1IH0sCi0gIHsgIklUQUc2IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA2IH0sCi0gIHsgIklUQUc3IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA3IH0sCi0gIHsgIklUQUc4IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA4IH0sCi0gIHsgIklUQUc5IiwJVElDODBfT1BFUkFORF9DUiB8IDB4MjA5IH0sCi0gIHsgImxlLmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAzIH0sCi0gIHsgImxlLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyMyB9LAotICB7ICJsZS5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTMgfSwKLSAgeyAibGUudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIzIH0sCi0gIHsgImxlMC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDYgfSwKLSAgeyAibGUwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTQgfSwKLSAgeyAibGUwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMjIgfSwKLSAgeyAibG8uYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDggfSwKLSAgeyAibG8uaCIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDE4IH0sCi0gIHsgImxvLnciLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyOCB9LAotICB7ICJscy5iIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgNyB9LAotICB7ICJscy5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTcgfSwKLSAgeyAibHMudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI3IH0sCi0gIHsgImx0LmIiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCA0IH0sCi0gIHsgImx0LmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAyNCB9LAotICB7ICJsdC5oIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMTQgfSwKLSAgeyAibHQudyIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI0IH0sCi0gIHsgImx0MC5iIiwJVElDODBfT1BFUkFORF9DQyB8IDQgfSwKLSAgeyAibHQwLmgiLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTIgfSwKLSAgeyAibHQwLnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMjAgfSwKLSAgeyAiTUlQIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzEgfSwKLSAgeyAiTVBDIiwJVElDODBfT1BFUkFORF9DUiB8IDB4MzAgfSwKLSAgeyAibmUuYiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDEgfSwKLSAgeyAibmUuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDIxIH0sCi0gIHsgIm5lLmgiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAxMSB9LAotICB7ICJuZS53IiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjEgfSwKLSAgeyAibmUwLmIiLAlUSUM4MF9PUEVSQU5EX0NDIHwgNSB9LAotICB7ICJuZTAuaCIsCVRJQzgwX09QRVJBTkRfQ0MgfCAxMyB9LAotICB7ICJuZTAudyIsCVRJQzgwX09QRVJBTkRfQ0MgfCAyMSB9LAotICB7ICJuZXYuYiIsCVRJQzgwX09QRVJBTkRfQ0MgfCAwIH0sCi0gIHsgIm5ldi5oIiwJVElDODBfT1BFUkFORF9DQyB8IDggfSwKLSAgeyAibmV2LnciLAlUSUM4MF9PUEVSQU5EX0NDIHwgMTYgfSwKLSAgeyAib2IuZiIsCVRJQzgwX09QRVJBTkRfQklUTlVNICB8IDI5IH0sCi0gIHsgIm9yLmYiLAlUSUM4MF9PUEVSQU5EX0JJVE5VTSAgfCAzMSB9LAotICB7ICJvdS5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMjYgfSwKLSAgeyAiT1VUUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDQwMDIgfSwKLSAgeyAiUEtUUkVRIiwJVElDODBfT1BFUkFORF9DUiB8IDB4RCB9LAotICB7ICJQUEVSUk9SIiwJVElDODBfT1BFUkFORF9DUiB8IDB4QSB9LAotICB7ICJyMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMCB9LAotICB7ICJyMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMSB9LAotICB7ICJyMTAiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEwIH0sCi0gIHsgInIxMSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTEgfSwKLSAgeyAicjEyIiwJVElDODBfT1BFUkFORF9HUFIgfCAxMiB9LAotICB7ICJyMTMiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDEzIH0sCi0gIHsgInIxNCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTQgfSwKLSAgeyAicjE1IiwJVElDODBfT1BFUkFORF9HUFIgfCAxNSB9LAotICB7ICJyMTYiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE2IH0sCi0gIHsgInIxNyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMTcgfSwKLSAgeyAicjE4IiwJVElDODBfT1BFUkFORF9HUFIgfCAxOCB9LAotICB7ICJyMTkiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDE5IH0sCi0gIHsgInIyIiwJVElDODBfT1BFUkFORF9HUFIgfCAyIH0sCi0gIHsgInIyMCIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjAgfSwKLSAgeyAicjIxIiwJVElDODBfT1BFUkFORF9HUFIgfCAyMSB9LAotICB7ICJyMjIiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDIyIH0sCi0gIHsgInIyMyIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjMgfSwKLSAgeyAicjI0IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNCB9LAotICB7ICJyMjUiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI1IH0sCi0gIHsgInIyNiIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjYgfSwKLSAgeyAicjI3IiwJVElDODBfT1BFUkFORF9HUFIgfCAyNyB9LAotICB7ICJyMjgiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDI4IH0sCi0gIHsgInIyOSIsCVRJQzgwX09QRVJBTkRfR1BSIHwgMjkgfSwKLSAgeyAicjMiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDMgfSwKLSAgeyAicjMwIiwJVElDODBfT1BFUkFORF9HUFIgfCAzMCB9LAotICB7ICJyMzEiLAlUSUM4MF9PUEVSQU5EX0dQUiB8IDMxIH0sCi0gIHsgInI0IiwJVElDODBfT1BFUkFORF9HUFIgfCA0IH0sCi0gIHsgInI1IiwJVElDODBfT1BFUkFORF9HUFIgfCA1IH0sCi0gIHsgInI2IiwJVElDODBfT1BFUkFORF9HUFIgfCA2IH0sCi0gIHsgInI3IiwJVElDODBfT1BFUkFORF9HUFIgfCA3IH0sCi0gIHsgInI4IiwJVElDODBfT1BFUkFORF9HUFIgfCA4IH0sCi0gIHsgInI5IiwJVElDODBfT1BFUkFORF9HUFIgfCA5IH0sCi0gIHsgIlNZU1NUSyIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIwIH0sCi0gIHsgIlNZU1RNUCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweDIxIH0sCi0gIHsgIlRDT1VOVCIsCVRJQzgwX09QRVJBTkRfQ1IgfCAweEUgfSwKLSAgeyAiVFNDQUxFIiwJVElDODBfT1BFUkFORF9DUiB8IDB4RiB9LAotICB7ICJ1by5mIiwJVElDODBfT1BFUkFORF9CSVROVU0gIHwgMzAgfSwKLX07Ci0KLWNvbnN0IGludCB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzID0gc2l6ZW9mICh0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMpIC8gc2l6ZW9mIChzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wpOwotCi0vKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgcHJlZGVmaW5lZCBzeW1ib2wgbmFtZSBpbiBOQU1FLCBzeW1ib2wgY2xhc3MKLSAgIGluIENMQVNTLCBhbmQgdHJhbnNsYXRlcyBpdCB0byBhIG51bWVyaWMgdmFsdWUsIHdoaWNoIGl0IHJldHVybnMuCi0KLSAgIElmIENMQVNTIGlzIHplcm8sIGFueSBzeW1ib2wgdGhhdCBtYXRjaGVzIE5BTUUgaXMgdHJhbnNsYXRlZC4gIElmCi0gICBDTEFTUyBpcyBub24temVybywgdGhlbiBvbmx5IGEgc3ltYm9sIHRoYXQgaGFzIGNsYXNzIENMQVNTIGlzCi0gICBtYXRjaGVkLgotCi0gICBJZiBubyB0cmFuc2xhdGlvbiBpcyBwb3NzaWJsZSwgaXQgcmV0dXJucyAtMSwgYSB2YWx1ZSBub3QgdXNlZCBieQotICAgYW55IHByZWRlZmluZWQgc3ltYm9sLiBOb3RlIHRoYXQgdGhlIHByZWRlZmluZWQgc3ltYm9sIGFycmF5IGlzCi0gICBwcmVzb3J0ZWQgY2FzZSBpbmRlcGVuZGVudGx5IGJ5IG5hbWUuCi0KLSAgIFRoaXMgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXJlIGFyZSBubwotICAgZHVwbGljYXRlIG5hbWVzIGluIHRoZSBwcmVkZWZpbmVkIHN5bWJvbCBhcnJheSwgd2hpY2ggaGFwcGVucyB0byBiZQotICAgdHJ1ZSBhdCB0aGUgbW9tZW50LgotCi0gKi8KLQotaW50Ci10aWM4MF9zeW1ib2xfdG9fdmFsdWUgKG5hbWUsIGNsYXNzKQotICAgICBjaGFyICpuYW1lOwotICAgICBpbnQgY2xhc3M7Ci17Ci0gIGNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqcGRzcDsKLSAgaW50IGxvdyA9IDA7Ci0gIGludCBtaWRkbGU7Ci0gIGludCBoaWdoID0gdGljODBfbnVtX3ByZWRlZmluZWRfc3ltYm9scyAtIDE7Ci0gIGludCBjbXA7Ci0gIGludCBydG52YWwgPSAtMTsKLQotICB3aGlsZSAobG93IDw9IGhpZ2gpCi0gICAgewotICAgICAgbWlkZGxlID0gKGxvdyArIGhpZ2gpIC8gMjsKLSAgICAgIGNtcCA9IHN0cmNhc2VjbXAgKG5hbWUsIHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sc1ttaWRkbGVdLm5hbWUpOwotICAgICAgaWYgKGNtcCA8IDApCi0JewotCSAgaGlnaCA9IG1pZGRsZSAtIDE7Ci0JfQotICAgICAgZWxzZSBpZiAoY21wID4gMCkKLQl7Ci0JICBsb3cgPSBtaWRkbGUgKyAxOwotCX0KLSAgICAgIGVsc2UgCi0JewotCSAgcGRzcCA9ICZ0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHNbbWlkZGxlXTsKLQkgIGlmICgoY2xhc3MgPT0gMCkgfHwgKGNsYXNzICYgUERTX1ZBTFVFIChwZHNwKSkpCi0JICAgIHsKLQkgICAgICBydG52YWwgPSBQRFNfVkFMVUUgKHBkc3ApOwotCSAgICB9Ci0JICAvKiBGb3Igbm93IHdlIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBkdXBsaWNhdGUgbmFtZXMgKi8KLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIHJldHVybiAocnRudmFsKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHZhbHVlIFZBTCBhbmQgZmluZHMgYSBtYXRjaGluZyBwcmVkZWZpbmVkCi0gICBzeW1ib2wgdGhhdCBpcyBpbiB0aGUgb3BlcmFuZCBjbGFzcyBzcGVjaWZpZWQgYnkgQ0xBU1MuICBJZiBDTEFTUwotICAgaXMgemVybywgdGhlIGZpcnN0IG1hdGNoaW5nIHN5bWJvbCBpcyByZXR1cm5lZC4gKi8KLQotY29uc3QgY2hhciAqCi10aWM4MF92YWx1ZV90b19zeW1ib2wgKHZhbCwgY2xhc3MpCi0gICAgIGludCB2YWw7Ci0gICAgIGludCBjbGFzczsKLXsKLSAgY29uc3Qgc3RydWN0IHByZWRlZmluZWRfc3ltYm9sICpwZHNwOwotICBpbnQgaXZhbDsKLSAgY2hhciAqbmFtZTsKLQotICBuYW1lID0gTlVMTDsKLSAgZm9yIChwZHNwID0gdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzOwotICAgICAgIHBkc3AgPCB0aWM4MF9wcmVkZWZpbmVkX3N5bWJvbHMgKyB0aWM4MF9udW1fcHJlZGVmaW5lZF9zeW1ib2xzOwotICAgICAgIHBkc3ArKykKLSAgICB7Ci0gICAgICBpdmFsID0gUERTX1ZBTFVFIChwZHNwKSAmIH5USUM4MF9PUEVSQU5EX01BU0s7Ci0gICAgICBpZiAoaXZhbCA9PSB2YWwpCi0JewotCSAgaWYgKChjbGFzcyA9PSAwKSB8fCAoY2xhc3MgJiBQRFNfVkFMVUUgKHBkc3ApKSkKLQkgICAgewotCSAgICAgIC8qIEZvdW5kIHRoZSBkZXNpcmVkIG1hdGNoICovCi0JICAgICAgbmFtZSA9IFBEU19OQU1FIChwZHNwKTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCX0KLSAgICB9Ci0gIHJldHVybiAobmFtZSk7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgc3ltYm9sIGluIHRoZSBwcmVkZWZpbmVkCi0gICBzeW1ib2wgdGFibGUgYWZ0ZXIgUERTUCwgb3IgTlVMTCBpZiBQRFNQIHBvaW50cyB0byB0aGUgbGFzdCBzeW1ib2wuICBJZgotICAgUERTUCBpcyBOVUxMLCBpdCByZXR1cm5zIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIHRhYmxlLiAgVGh1cyBpdCBjYW4gYmUKLSAgIHVzZWQgdG8gd2FsayB0aHJvdWdoIHRoZSB0YWJsZSBieSBmaXJzdCBjYWxsaW5nIGl0IHdpdGggTlVMTCBhbmQgdGhlbgotICAgY2FsbGluZyBpdCB3aXRoIGVhY2ggdmFsdWUgaXQgcmV0dXJuZWQgb24gdGhlIHByZXZpb3VzIGNhbGwsIHVudGlsIGl0Ci0gICByZXR1cm5zIE5VTEwuICovCi0KLWNvbnN0IHN0cnVjdCBwcmVkZWZpbmVkX3N5bWJvbCAqCi10aWM4MF9uZXh0X3ByZWRlZmluZWRfc3ltYm9sIChwZHNwKQotICAgICBjb25zdCBzdHJ1Y3QgcHJlZGVmaW5lZF9zeW1ib2wgKnBkc3A7Ci17Ci0gIGlmIChwZHNwID09IE5VTEwpCi0gICAgewotICAgICAgcGRzcCA9IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9sczsKLSAgICB9Ci0gIGVsc2UgaWYgKHBkc3AgPj0gdGljODBfcHJlZGVmaW5lZF9zeW1ib2xzICYmCi0JICAgcGRzcCA8IHRpYzgwX3ByZWRlZmluZWRfc3ltYm9scyArIHRpYzgwX251bV9wcmVkZWZpbmVkX3N5bWJvbHMgLSAxKQotICAgIHsKLSAgICAgIHBkc3ArKzsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBwZHNwID0gTlVMTDsKLSAgICB9Ci0gIHJldHVybiAocGRzcCk7Ci19Ci0KLQotDAotLyogVGhlIG9wZXJhbmRzIHRhYmxlLiAgVGhlIGZpZWxkcyBhcmU6Ci0KLQliaXRzLCBzaGlmdCwgaW5zZXJ0aW9uIGZ1bmN0aW9uLCBleHRyYWN0aW9uIGZ1bmN0aW9uLCBmbGFncwotICovCi0KLWNvbnN0IHN0cnVjdCB0aWM4MF9vcGVyYW5kIHRpYzgwX29wZXJhbmRzW10gPQotewotCi0gIC8qIFRoZSB6ZXJvIGluZGV4IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBvcGVyYW5kcy4gICovCi0KLSNkZWZpbmUgVU5VU0VEICgwKQotICB7IDAsIDAsIDAsIDAsIDAgfSwKLQotICAvKiBTaG9ydCBzaWduZWQgaW1tZWRpYXRlIHZhbHVlIGluIGJpdHMgMTQtMC4gKi8KLQotI2RlZmluZSBTU0kgKFVOVVNFRCArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogU2hvcnQgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlIGluIGJpdHMgMTQtMCAqLwotCi0jZGVmaW5lIFNVSSAoU1NJICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgMCB9LAotCi0gIC8qIFNob3J0IHVuc2lnbmVkIGJpdGZpZWxkIGluIGJpdHMgMTQtMC4gIFdlIGRpc3Rpbmd1aXNoIHRoaXMKLSAgICAgZnJvbSBhIHJlZ3VsYXIgdW5zaWduZWQgaW1tZWRpYXRlIHZhbHVlIG9ubHkgZm9yIHRoZSBjb252ZW5pZW5jZQotICAgICBvZiB0aGUgZGlzYXNzZW1ibGVyIGFuZCB0aGUgdXNlci4gKi8KLQotI2RlZmluZSBTVUJGIChTVUkgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0JJVEZJRUxEIH0sCi0KLSAgLyogTG9uZyBzaWduZWQgaW1tZWRpYXRlIGluIGZvbGxvd2luZyAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIExTSSAoU1VCRiArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogTG9uZyB1bnNpZ25lZCBpbW1lZGlhdGUgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgTFVJIChMU0kgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLSAgLyogTG9uZyB1bnNpZ25lZCBiaXRmaWVsZCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQuICBXZSBkaXN0aW5ndWlzaAotICAgICB0aGlzIGZyb20gYSByZWd1bGFyIHVuc2lnbmVkIGltbWVkaWF0ZSB2YWx1ZSBvbmx5IGZvciB0aGUKLSAgICAgY29udmVuaWVuY2Ugb2YgdGhlIGRpc2Fzc2VtYmxlciBhbmQgdGhlIHVzZXIuICovCi0KLSNkZWZpbmUgTFVCRiAoTFVJICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CSVRGSUVMRCB9LAotCi0gIC8qIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlIGluIGZvbGxvd2luZyAzMiBiaXQKLSAgICAgd29yZC4gKi8KLQotI2RlZmluZSBTUEZJIChMVUJGICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9GTE9BVCB9LAotCi0gIC8qIFJlZ2lzdGVyIGluIGJpdHMgNC0wICovCi0KLSNkZWZpbmUgUkVHXzAgKFNQRkkgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfR1BSIH0sCi0KLSAgLyogRXZlbiByZWdpc3RlciBpbiBiaXRzIDQtMCAqLwotCi0jZGVmaW5lIFJFR18wX0UgKFJFR18wICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRVZFTiB9LAotCi0gIC8qIFJlZ2lzdGVyIGluIGJpdHMgMjYtMjIgKi8KLQotI2RlZmluZSBSRUdfMjIgKFJFR18wX0UgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB9LAotCi0gIC8qIEV2ZW4gcmVnaXN0ZXIgaW4gYml0cyAyNi0yMiAqLwotCi0jZGVmaW5lIFJFR18yMl9FIChSRUdfMjIgKyAxKQotICB7IDUsIDIyLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB8IFRJQzgwX09QRVJBTkRfRVZFTiB9LAotCi0gIC8qIFJlZ2lzdGVyIGluIGJpdHMgMzEtMjcgKi8KLQotI2RlZmluZSBSRUdfREVTVCAoUkVHXzIyX0UgKyAxKQotICB7IDUsIDI3LCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0dQUiB9LAotCi0gIC8qIEV2ZW4gcmVnaXN0ZXIgaW4gYml0cyAzMS0yNyAqLwotCi0jZGVmaW5lIFJFR19ERVNUX0UgKFJFR19ERVNUICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX0VWRU4gfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBhY2N1bXVsYXRvciByZWdpc3RlciAoYTAtYTMpIHNwZWNpZmllZCBieSBiaXQgMTYgKE1TQikKLSAgICAgYW5kIGJpdCAxMSAoTFNCKSAqLwotICAvKiBGSVhNRSEgIE5lZWRzIHRvIHVzZSBmdW5jdGlvbnMgdG8gaW5zZXJ0IGFuZCBleHRyYWN0IHRoZSByZWdpc3RlcgotICAgICBudW1iZXIgaW4gYml0cyAxNiBhbmQgMTEuICovCi0KLSNkZWZpbmUgUkVHX0ZQQSAoUkVHX0RFU1RfRSArIDEpCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9GUEEgfSwKLQotICAvKiBTaG9ydCBzaWduZWQgUEMgd29yZCBvZmZzZXQgaW4gYml0cyAxNC0wICovCi0KLSNkZWZpbmUgT0ZGX1NTX1BDIChSRUdfRlBBICsgMSkKLSAgeyAxNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9QQ1JFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogTG9uZyBzaWduZWQgUEMgd29yZCBvZmZzZXQgaW4gZm9sbG93aW5nIDMyIGJpdCB3b3JkICovCi0KLSNkZWZpbmUgT0ZGX1NMX1BDIChPRkZfU1NfUEMgKyAxKQotICB7IDMyLCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX1BDUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfSwKLQotICAvKiBTaG9ydCBzaWduZWQgYmFzZSByZWxhdGl2ZSBieXRlIG9mZnNldCBpbiBiaXRzIDE0LTAgKi8KLQotI2RlZmluZSBPRkZfU1NfQlIgKE9GRl9TTF9QQyArIDEpCi0gIHsgMTUsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQkFTRVJFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogTG9uZyBzaWduZWQgYmFzZSByZWxhdGl2ZSBieXRlIG9mZnNldCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQgKi8KLQotI2RlZmluZSBPRkZfU0xfQlIgKE9GRl9TU19CUiArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQkFTRVJFTCB8IFRJQzgwX09QRVJBTkRfU0lHTkVEIH0sCi0KLSAgLyogTG9uZyBzaWduZWQgYmFzZSByZWxhdGl2ZSBieXRlIG9mZnNldCBpbiBmb2xsb3dpbmcgMzIgYml0IHdvcmQKLSAgICAgd2l0aCBvcHRpb25hbCAiOnMiIG1vZGlmaWVyIGZsYWcgaW4gYml0IDExICovCi0KLSNkZWZpbmUgT0ZGX1NMX0JSX1NDQUxFRCAoT0ZGX1NMX0JSICsgMSkKLSAgeyAzMiwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CQVNFUkVMIHwgVElDODBfT1BFUkFORF9TSUdORUQgfCBUSUM4MF9PUEVSQU5EX1NDQUxFRCB9LAotCi0gIC8qIEJJVE5VTSBpbiBiaXRzIDMxLTI3ICovCi0KLSNkZWZpbmUgQklUTlVNIChPRkZfU0xfQlJfU0NBTEVEICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9CSVROVU0gfSwKLQotICAvKiBDb25kaXRpb24gY29kZSBpbiBiaXRzIDMxLTI3ICovCi0KLSNkZWZpbmUgQ0MgKEJJVE5VTSArIDEpCi0gIHsgNSwgMjcsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQ0MgfSwKLQotICAvKiBDb250cm9sIHJlZ2lzdGVyIG51bWJlciBpbiBiaXRzIDE0LTAgKi8KLQotI2RlZmluZSBDUl9TSSAoQ0MgKyAxKQotICB7IDE1LCAwLCBOVUxMLCBOVUxMLCBUSUM4MF9PUEVSQU5EX0NSIH0sCi0KLSAgLyogQ29udHJvbCByZWdpc3RlciBudW1iZXIgaW4gbmV4dCAzMiBiaXQgd29yZCAqLwotCi0jZGVmaW5lIENSX0xJIChDUl9TSSArIDEpCi0gIHsgMzIsIDAsIE5VTEwsIE5VTEwsIFRJQzgwX09QRVJBTkRfQ1IgfSwKLQotICAvKiBBIGJhc2UgcmVnaXN0ZXIgaW4gYml0cyAyNi0yMiwgZW5jbG9zZWQgaW4gcGFyZW5zICovCi0KLSNkZWZpbmUgUkVHX0JBU0UgKENSX0xJICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX1BBUkVOUyB9LAotCi0gIC8qIEEgYmFzZSByZWdpc3RlciBpbiBiaXRzIDI2LTIyLCBlbmNsb3NlZCBpbiBwYXJlbnMsIHdpdGggb3B0aW9uYWwgIjptIgotICAgICBmbGFnIGluIGJpdCAxNyAoc2hvcnQgaW1tZWRpYXRlIGluc3RydWN0aW9ucyBvbmx5KSAqLwotCi0jZGVmaW5lIFJFR19CQVNFX01fU0kgKFJFR19CQVNFICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX1BBUkVOUyB8IFRJQzgwX09QRVJBTkRfTV9TSSB9LAotCi0gIC8qIEEgYmFzZSByZWdpc3RlciBpbiBiaXRzIDI2LTIyLCBlbmNsb3NlZCBpbiBwYXJlbnMsIHdpdGggb3B0aW9uYWwgIjptIgotICAgZmxhZyBpbiBiaXQgMTUgKGxvbmcgaW1tZWRpYXRlIGFuZCByZWdpc3RlciBpbnN0cnVjdGlvbnMgb25seSkgKi8KLQotI2RlZmluZSBSRUdfQkFTRV9NX0xJIChSRUdfQkFTRV9NX1NJICsgMSkKLSAgeyA1LCAyMiwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX1BBUkVOUyB8IFRJQzgwX09QRVJBTkRfTV9MSSB9LAotCi0gIC8qIFNjYWxlZCByZWdpc3RlciBpbiBiaXRzIDQtMCwgd2l0aCBvcHRpb25hbCAiOnMiIG1vZGlmaWVyIGZsYWcgaW4gYml0IDExICovCi0KLSNkZWZpbmUgUkVHX1NDQUxFRCAoUkVHX0JBU0VfTV9MSSArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9HUFIgfCBUSUM4MF9PUEVSQU5EX1NDQUxFRCB9LAotCi0gIC8qIFVuc2lnbmVkIGltbWVkaWF0ZSBpbiBiaXRzIDQtMCwgdXNlZCBvbmx5IGZvciBzaGlmdCBpbnN0cnVjdGlvbnMgKi8KLQotI2RlZmluZSBST1RBVEUgKFJFR19TQ0FMRUQgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIDAgfSwKLQotICAvKiBVbnNpZ25lZCBpbW1lZGlhdGUgaW4gYml0cyA5LTUsIHVzZWQgb25seSBmb3Igc2hpZnQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIEVORE1BU0sgKFJPVEFURSArIDEpCi0gIHsgNSwgNSwgTlVMTCwgTlVMTCwgVElDODBfT1BFUkFORF9FTkRNQVNLIH0sCi0KLX07Ci0KLWNvbnN0IGludCB0aWM4MF9udW1fb3BlcmFuZHMgPSBzaXplb2YgKHRpYzgwX29wZXJhbmRzKS9zaXplb2YoKnRpYzgwX29wZXJhbmRzKTsKLQotDAotLyogTWFjcm9zIHVzZWQgdG8gZ2VuZXJhdGUgZW50cmllcyBmb3IgdGhlIG9wY29kZXMgdGFibGUuICovCi0KLSNkZWZpbmUgRklYTUUgMAotCi0vKiBTaG9ydC1JbW1lZGlhdGUgRm9ybWF0IEluc3RydWN0aW9ucyAtIGJhc2ljIG9wY29kZSAqLwotI2RlZmluZSBPUF9TSSh4KQkoKCh4KSAmIDB4N0YpIDw8IDE1KQotI2RlZmluZSBNQVNLX1NJCQlPUF9TSSgweDdGKQotCi0vKiBMb25nLUltbWVkaWF0ZSBGb3JtYXQgSW5zdHJ1Y3Rpb25zIC0gYmFzaWMgb3Bjb2RlICovCi0jZGVmaW5lIE9QX0xJKHgpCSgoKHgpICYgMHgzRkYpIDw8IDEyKQotI2RlZmluZSBNQVNLX0xJCQlPUF9MSSgweDNGRikKLQotLyogUmVnaXN0ZXIgRm9ybWF0IEluc3RydWN0aW9ucyAtIGJhc2ljIG9wY29kZSAqLwotI2RlZmluZSBPUF9SRUcoeCkJT1BfTEkoeCkJLyogRm9yIHJlYWRhYmlsaXR5ICovCi0jZGVmaW5lIE1BU0tfUkVHCU1BU0tfTEkJCS8qIEZvciByZWFkYWJpbGl0eSAqLwotCi0vKiBUaGUgJ24nIGJpdCBhdCBiaXQgMTAgKi8KLSNkZWZpbmUgbih4KQkJKCh4KSA8PCAxMCkKLQotLyogVGhlICdpJyBiaXQgYXQgYml0IDExICovCi0jZGVmaW5lIGkoeCkJCSgoeCkgPDwgMTEpCi0KLS8qIFRoZSAnRicgYml0IGF0IGJpdCAyNyAqLwotI2RlZmluZSBGKHgpCQkoKHgpIDw8IDI3KQotCi0vKiBUaGUgJ0UnIGJpdCBhdCBiaXQgMjcgKi8KLSNkZWZpbmUgRSh4KQkJKCh4KSA8PCAyNykKLQotLyogVGhlICdNJyBiaXQgYXQgYml0IDE1IGluIHJlZ2lzdGVyIGFuZCBsb25nIGltbWVkaWF0ZSBvcGNvZGVzICovCi0jZGVmaW5lIE1fUkVHKHgpCSgoeCkgPDwgMTUpCi0jZGVmaW5lIE1fTEkoeCkJCSgoeCkgPDwgMTUpCi0KLS8qIFRoZSAnTScgYml0IGF0IGJpdCAxNyBpbiBzaG9ydCBpbW1lZGlhdGUgb3Bjb2RlcyAqLwotI2RlZmluZSBNX1NJKHgpCQkoKHgpIDw8IDE3KQotCi0vKiBUaGUgJ1NaJyBmaWVsZCBhdCBiaXRzIDE0LTEzIGluIHJlZ2lzdGVyIGFuZCBsb25nIGltbWVkaWF0ZSBvcGNvZGVzICovCi0jZGVmaW5lIFNaX1JFRyh4KQkoKHgpIDw8IDEzKQotI2RlZmluZSBTWl9MSSh4KQkoKHgpIDw8IDEzKQotCi0vKiBUaGUgJ1NaJyBmaWVsZCBhdCBiaXRzIDE2LTE1IGluIHNob3J0IGltbWVkaWF0ZSBvcGNvZGVzICovCi0jZGVmaW5lIFNaX1NJKHgpCSgoeCkgPDwgMTUpCi0KLS8qIFRoZSAnRCcgKGRpcmVjdCBleHRlcm5hbCBtZW1vcnkgYWNjZXNzKSBiaXQgYXQgYml0IDEwIGluIGxvbmcgaW1tZWRpYXRlCi0gICBhbmQgcmVnaXN0ZXIgb3Bjb2Rlcy4gKi8KLSNkZWZpbmUgRCh4KQkJKCh4KSA8PCAxMCkKLQotLyogVGhlICdTJyAoc2NhbGUgb2Zmc2V0IGJ5IGRhdGEgc2l6ZSkgYml0IGF0IGJpdCAxMSBpbiBsb25nIGltbWVkaWF0ZQotICAgYW5kIHJlZ2lzdGVyIG9wY29kZXMuICovCi0jZGVmaW5lIFMoeCkJCSgoeCkgPDwgMTEpCi0KLS8qIFRoZSAnUEQnIGZpZWxkIGF0IGJpdHMgMTAtOSBpbiBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgUEQoeCkJCSgoeCkgPDwgOSkKLQotLyogVGhlICdQMicgZmllbGQgYXQgYml0cyA4LTcgaW4gZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFAyKHgpCQkoKHgpIDw8IDcpCi0KLS8qIFRoZSAnUDEnIGZpZWxkIGF0IGJpdHMgNi01IGluIGZsb2F0aW5nIHBvaW50IGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBQMSh4KQkJKCh4KSA8PCA1KQotCi0vKiBUaGUgJ2EnIGZpZWxkIGF0IGJpdCAxNiBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfYTEoeCkJCSgoeCkgPDwgMTYpCi0KLS8qIFRoZSAnYScgZmllbGQgYXQgYml0IDExIGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9hMCh4KQkJKCh4KSA8PCAxMSkKLQotLyogVGhlICdtJyBmaWVsZCBhdCBiaXQgMTAgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX20oeCkJCSgoeCkgPDwgMTApCi0KLS8qIFRoZSAnUycgZmllbGQgYXQgYml0IDkgaW4gdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBWX1MoeCkJCSgoeCkgPDwgOSkKLQotLyogVGhlICdaJyBmaWVsZCBhdCBiaXQgOCBpbiB2ZWN0b3IgaW5zdHJ1Y3Rpb25zICovCi0jZGVmaW5lIFZfWih4KQkJKCh4KSA8PCA4KQotCi0vKiBUaGUgJ3AnIGZpZWxkIGF0IGJpdCA2IGluIHZlY3RvciBpbnN0cnVjdGlvbnMgKi8KLSNkZWZpbmUgVl9wKHgpCQkoKHgpIDw8IDYpCi0KLS8qIFRoZSBvcGNvZGUgZmllbGQgYXQgYml0cyAyMS0xNyBmb3IgdmVjdG9yIGluc3RydWN0aW9ucyAqLwotI2RlZmluZSBPUF9WKHgpCQkoKHgpIDw8IDE3KQotI2RlZmluZSBNQVNLX1YJCU9QX1YoMHgxRikKLQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4gIEZvcm1hdHRlZCBmb3IgYmV0dGVyIHJlYWRhYmlsaXR5IG9uIGEgd2lkZSBzY3JlZW4uICBBbHNvLCBhbGwKLSBlbnRyaWVzIHdpdGggdGhlIHNhbWUgbW5lbW9uaWMgYXJlIHNvcnRlZCBzbyB0aGF0IHRoZXkgYXJlIGFkamFjZW50IGluIHRoZSB0YWJsZSwKLSBhbGxvd2luZyB0aGUgdXNlIG9mIGEgaGFzaCB0YWJsZSB0byBsb2NhdGUgdGhlIGZpcnN0IG9mIGEgc2VxdWVuY2Ugb2Ygb3Bjb2RlcyB0aGF0IGhhdmUKLSBhIHBhcnRpY3VsYXIgbmFtZS4gIFRoZSBzaG9ydCBpbW1lZGlhdGUgZm9ybXMgYWxzbyBjb21lIGJlZm9yZSB0aGUgbG9uZyBpbW1lZGlhdGUgZm9ybXMKLSBzbyB0aGF0IHRoZSBhc3NlbWJsZXIgd2lsbCBwaWNrIHRoZSAiYmVzdCBmaXQiIGZvciB0aGUgc2l6ZSBvZiB0aGUgb3BlcmFuZCwgZXhjZXB0IGZvcgotIHRoZSBjYXNlIG9mIHRoZSBQQyByZWxhdGl2ZSBmb3Jtcywgd2hlcmUgdGhlIGxvbmcgZm9ybXMgY29tZSBmaXJzdCBhbmQgYXJlIHRoZSBkZWZhdWx0Ci0gZm9ybXMuICovCi0KLWNvbnN0IHN0cnVjdCB0aWM4MF9vcGNvZGUgdGljODBfb3Bjb2Rlc1tdID0gewotCi0gIC8qIFRoZSAibm9wIiBpbnN0cnVjdGlvbiBpcyByZWFsbHkgInJkY3IgMCxyMCIuICBXZSBwdXQgaXQgZmlyc3Qgc28gdGhhdCB0aGlzCi0gICAgIHNwZWNpZmljIGJpdCBwYXR0ZXJuIHdpbGwgZ2V0IGRpc2Fzc2VtYmxlZCBhcyBhIG5vcCByYXRoZXIgdGhhbiBhbiByZGNyLiBUaGUKLSAgICAgbWFzayBvZiBhbGwgb25lcyBlbnN1cmVzIHRoYXQgdGhpcyB3aWxsIGhhcHBlbi4gKi8KLQotICB7Im5vcCIsCU9QX1NJKDB4NCksCX4wLAkJMCwJCXswfQkJCX0sCi0KLSAgLyogVGhlICJiciIgaW5zdHJ1Y3Rpb24gaXMgcmVhbGx5ICJiYnogdGFyZ2V0LHIwLDMxIi4gIFdlIHB1dCBpdCBmaXJzdCBzbyB0aGF0Ci0gICAgIHRoaXMgc3BlY2lmaWMgYml0IHBhdHRlcm4gd2lsbCBnZXQgZGlzYXNzZW1ibGVkIGFzIGEgYnIgcmF0aGVyIHRoYW4gYmJ6LiAqLwotCi0gIHsiYnIiLAlPUF9TSSgweDQ4KSwJMHhGRkZGODAwMCwJMCwJe09GRl9TU19QQ30JfSwKLSAgeyJiciIsCU9QX0xJKDB4MzkxKSwJMHhGRkZGRjAwMCwJMCwJe09GRl9TTF9QQ30JfSwKLSAgeyJiciIsCU9QX1JFRygweDM5MCksCTB4RkZGRkYwMDAsCTAsCXtSRUdfMH0JCX0sCi0gIHsiYnIuYSIsCU9QX1NJKDB4NDkpLAkweEZGRkY4MDAwLAkwLAl7T0ZGX1NTX1BDfQl9LAotICB7ImJyLmEiLAlPUF9MSSgweDM5MyksCTB4RkZGRkYwMDAsCTAsCXtPRkZfU0xfUEN9CX0sCi0gIHsiYnIuYSIsCU9QX1JFRygweDM5MiksCTB4RkZGRkYwMDAsCTAsCXtSRUdfMH0JCX0sCi0KLSAgLyogU2lnbmVkIGludGVnZXIgQUREICovCi0KLSAgeyJhZGQiLAlPUF9TSSgweDU4KSwJTUFTS19TSSwJMCwJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiYWRkIiwJT1BfTEkoMHgzQjEpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJhZGQiLAlPUF9SRUcoMHgzQjApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFVuc2lnbmVkIGludGVnZXIgQUREICovCi0KLSAgeyJhZGR1IiwJT1BfU0koMHg1OSksCU1BU0tfU0ksCTAsCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImFkZHUiLAlPUF9MSSgweDNCMyksCU1BU0tfTEksCTAsCXtMU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7ImFkZHUiLAlPUF9SRUcoMHgzQjIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgQU5EICovCi0KLSAgeyJhbmQiLAlPUF9TSSgweDExKSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kIiwJT1BfTEkoMHgzMjMpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQiLAlPUF9SRUcoMHgzMjIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50dCIsCU9QX1NJKDB4MTEpLAlNQVNLX1NJLAkwLAl7U1VCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudHQiLAlPUF9MSSgweDMyMyksCU1BU0tfTEksCTAsCXtMVUJGLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImFuZC50dCIsCU9QX1JFRygweDMyMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQml0d2lzZSBBTkQgd2l0aCBvbmVzIGNvbXBsZW1lbnQgb2YgYm90aCBzb3VyY2VzICovCi0KLSAgeyJhbmQuZmYiLAlPUF9TSSgweDE4KSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLmZmIiwJT1BfTEkoMHgzMzEpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQuZmYiLAlPUF9SRUcoMHgzMzApLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgQU5EIHdpdGggb25lcyBjb21wbGVtZW50IG9mIHNvdXJjZSAxICovCi0KLSAgeyJhbmQuZnQiLAlPUF9TSSgweDE0KSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLmZ0IiwJT1BfTEkoMHgzMjkpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQuZnQiLAlPUF9SRUcoMHgzMjgpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgQU5EIHdpdGggb25lcyBjb21wbGVtZW50IG9mIHNvdXJjZSAyICovCi0KLSAgeyJhbmQudGYiLAlPUF9TSSgweDEyKSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiYW5kLnRmIiwJT1BfTEkoMHgzMjUpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJhbmQudGYiLAlPUF9SRUcoMHgzMjQpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJyYW5jaCBCaXQgT25lIC0gbm9uYW5udWxsZWQgKi8KLQotICB7ImJibyIsCU9QX1NJKDB4NEEpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJvIiwJT1BfTEkoMHgzOTUpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJvIiwJT1BfUkVHKDB4Mzk0KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAotCi0gIC8qIEJyYW5jaCBCaXQgT25lIC0gYW5udWxsZWQgKi8KLQotICB7ImJiby5hIiwJT1BfU0koMHg0QiksCU1BU0tfU0ksCTAsIAl7T0ZGX1NTX1BDLCBSRUdfMjIsIEJJVE5VTX0JfSwKLSAgeyJiYm8uYSIsCU9QX0xJKDB4Mzk3KSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJiby5hIiwJT1BfUkVHKDB4Mzk2KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBCSVROVU19CQl9LAotCi0gIC8qIEJyYW5jaCBCaXQgWmVybyAtIG5vbmFubnVsbGVkICovCi0KLSAgeyJiYnoiLAlPUF9TSSgweDQ4KSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJieiIsCU9QX0xJKDB4MzkxKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJieiIsCU9QX1JFRygweDM5MCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQklUTlVNfQkJfSwKLQotICAvKiBCcmFuY2ggQml0IFplcm8gLSBhbm51bGxlZCAqLwotCi0gIHsiYmJ6LmEiLAlPUF9TSSgweDQ5KSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQklUTlVNfQl9LAotICB7ImJiei5hIiwJT1BfTEkoMHgzOTMpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHXzIyLCBCSVROVU19CX0sCi0gIHsiYmJ6LmEiLAlPUF9SRUcoMHgzOTIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIEJJVE5VTX0JCX0sCi0KLSAgLyogQnJhbmNoIENvbmRpdGlvbmFsIC0gbm9uYW5udWxsZWQgKi8KLQotICB7ImJjbmQiLAlPUF9TSSgweDRDKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR18yMiwgQ0N9CX0sCi0gIHsiYmNuZCIsCU9QX0xJKDB4Mzk5KSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR18yMiwgQ0N9CX0sCi0gIHsiYmNuZCIsCU9QX1JFRygweDM5OCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQ0N9CX0sCi0KLSAgLyogQnJhbmNoIENvbmRpdGlvbmFsIC0gYW5udWxsZWQgKi8KLQotICB7ImJjbmQuYSIsCU9QX1NJKDB4NEQpLAlNQVNLX1NJLAkwLCAJe09GRl9TU19QQywgUkVHXzIyLCBDQ30JfSwKLSAgeyJiY25kLmEiLAlPUF9MSSgweDM5QiksCU1BU0tfTEksCTAsIAl7T0ZGX1NMX1BDLCBSRUdfMjIsIENDfQl9LAotICB7ImJjbmQuYSIsCU9QX1JFRygweDM5QSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgQ0N9CX0sCi0KLSAgLyogQnJhbmNoIENvbnRyb2wgUmVnaXN0ZXIgKi8KLQotICB7ImJyY3IiLAlPUF9TSSgweDYpLAlNQVNLX1NJLAkwLAl7Q1JfU0l9CX0sCi0gIHsiYnJjciIsCU9QX0xJKDB4MzBEKSwJTUFTS19MSSwJMCwJe0NSX0xJfQl9LAotICB7ImJyY3IiLAlPUF9SRUcoMHgzMEMpLAlNQVNLX1JFRywJMCwJe1JFR18wfQl9LAotCi0gIC8qIEJyYW5jaCBhbmQgc2F2ZSByZXR1cm4gLSBub25hbm51bGxlZCAqLwotCi0gIHsiYnNyIiwJT1BfU0koMHg0MCksCU1BU0tfU0ksCTAsCXtPRkZfU1NfUEMsIFJFR19ERVNUfQl9LAotICB7ImJzciIsCU9QX0xJKDB4MzgxKSwJTUFTS19MSSwJMCwgCXtPRkZfU0xfUEMsIFJFR19ERVNUfQl9LAotICB7ImJzciIsCU9QX1JFRygweDM4MCksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJyYW5jaCBhbmQgc2F2ZSByZXR1cm4gLSBhbm51bGxlZCAqLwotCi0gIHsiYnNyLmEiLAlPUF9TSSgweDQxKSwJTUFTS19TSSwJMCwgCXtPRkZfU1NfUEMsIFJFR19ERVNUfQl9LAotICB7ImJzci5hIiwJT1BfTEkoMHgzODMpLAlNQVNLX0xJLAkwLCAJe09GRl9TTF9QQywgUkVHX0RFU1R9CX0sCi0gIHsiYnNyLmEiLAlPUF9SRUcoMHgzODIpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBTZW5kIGNvbW1hbmQgKi8KLQotICB7ImNtbmQiLAlPUF9TSSgweDIpLAlNQVNLX1NJLAkwLCAJe1NVSX0JfSwKLSAgeyJjbW5kIiwJT1BfTEkoMHgzMDUpLAlNQVNLX0xJLAkwLCAJe0xVSX0JfSwKLSAgeyJjbW5kIiwJT1BfUkVHKDB4MzA0KSwJTUFTS19SRUcsCTAsCXtSRUdfMH0JfSwKLQotICAvKiBJbnRlZ2VyIGNvbXBhcmUgKi8KLQotICB7ImNtcCIsCU9QX1NJKDB4NTApLAlNQVNLX1NJLAkwLCAJe1NTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiY21wIiwJT1BfTEkoMHgzQTEpLAlNQVNLX0xJLAkwLCAJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsiY21wIiwJT1BfUkVHKDB4M0EwKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbHVzaCBkYXRhIGNhY2hlIHN1YmJsb2NrIC0gZG9uJ3QgY2xlYXIgc3ViYmxvY2sgcHJlc2V0IGZsYWcgKi8KLQotICB7ImRjYWNoZWMiLAlPUF9TSSgweDM4KSwJRigxKSB8IChNQVNLX1NJICAmIH5NX1NJKDEpKSwJCQkwLCB7U1NJLCBSRUdfQkFTRV9NX1NJfQkJfSwKLSAgeyJkY2FjaGVjIiwJT1BfTEkoMHgzNzEpLAlGKDEpIHwgKE1BU0tfTEkgICYgfk1fTEkoMSkpICB8IFMoMSkgfCBEKDEpLAkwLCB7TFNJLCBSRUdfQkFTRV9NX0xJfQkJfSwKLSAgeyJkY2FjaGVjIiwJT1BfUkVHKDB4MzcwKSwJRigxKSB8IChNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBTKDEpIHwgRCgxKSwJMCwge1JFR18wLCBSRUdfQkFTRV9NX0xJfQl9LAotCi0gIC8qIEZsdXNoIGRhdGEgY2FjaGUgc3ViYmxvY2sgLSBjbGVhciBzdWJibG9jayBwcmVzZXQgZmxhZyAqLwotCi0gIHsiZGNhY2hlZiIsCU9QX1NJKDB4MzgpICAgfCBGKDEpLAlGKDEpIHwgKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJCTAsIHtTU0ksIFJFR19CQVNFX01fU0l9CQl9LAotICB7ImRjYWNoZWYiLAlPUF9MSSgweDM3MSkgIHwgRigxKSwJRigxKSB8IChNQVNLX0xJICAmIH5NX0xJKDEpKSAgIHwgUygxKSB8IEQoMSksCTAsIHtMU0ksIFJFR19CQVNFX01fTEl9CQl9LAotICB7ImRjYWNoZWYiLAlPUF9SRUcoMHgzNzApIHwgRigxKSwJRigxKSB8IChNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBTKDEpIHwgRCgxKSwJMCwge1JFR18wLCBSRUdfQkFTRV9NX0xJfQl9LAotCi0gIC8qIERpcmVjdCBsb2FkIHNpZ25lZCBkYXRhIGludG8gcmVnaXN0ZXIgKi8KLQotICB7ImRsZCIsCU9QX0xJKDB4MzQ1KSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZCIsCU9QX1JFRygweDM0NCkgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkbGQuYiIsCU9QX0xJKDB4MzQxKSAgfCBEKDEpLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImRsZC5iIiwJT1BfUkVHKDB4MzQwKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRsZC5kIiwJT1BfTEkoMHgzNDcpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJkbGQuZCIsCU9QX1JFRygweDM0NikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUX0V9CQl9LAotICB7ImRsZC5oIiwJT1BfTEkoMHgzNDMpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkLmgiLAlPUF9SRUcoMHgzNDIpIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogRGlyZWN0IGxvYWQgdW5zaWduZWQgZGF0YSBpbnRvIHJlZ2lzdGVyICovCi0KLSAgeyJkbGQudWIiLAlPUF9MSSgweDM1MSkgIHwgRCgxKSwJKE1BU0tfTEkgICYgIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkLnViIiwJT1BfUkVHKDB4MzUwKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJkbGQudWgiLAlPUF9MSSgweDM1MykgIHwgRCgxKSwJKE1BU0tfTEkgICYgIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZGxkLnVoIiwJT1BfUkVHKDB4MzUyKSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBEaXJlY3Qgc3RvcmUgZGF0YSBpbnRvIG1lbW9yeSAqLwotCi0gIHsiZHN0IiwJT1BfTEkoMHgzNjUpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZHN0IiwJT1BfUkVHKDB4MzY0KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImRzdC5iIiwJT1BfTEkoMHgzNjEpICB8IEQoMSksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsiZHN0LmIiLAlPUF9SRUcoMHgzNjApIHwgRCgxKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsiZHN0LmQiLAlPUF9MSSgweDM2NykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAotICB7ImRzdC5kIiwJT1BfUkVHKDB4MzY2KSB8IEQoMSksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1RfRX0JCX0sCi0gIHsiZHN0LmgiLAlPUF9MSSgweDM2MykgIHwgRCgxKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJkc3QuaCIsCU9QX1JFRygweDM2MikgfCBEKDEpLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLQotICAvKiBFbXVsYXRpb24gc3RvcCAqLwotCi0gIHsiZXN0b3AiLAlPUF9MSSgweDNGQyksCU1BU0tfTEksCTAsCQl7MH0JfSwKLQotICAvKiBFbXVsYXRpb24gdHJhcCAqLwotCi0gIHsiZXRyYXAiLAlPUF9TSSgweDEpICAgIHwgRSgxKSwJTUFTS19TSSAgfCBFKDEpLAkwLAl7U1VJfQl9LAotICB7ImV0cmFwIiwJT1BfTEkoMHgzMDMpICB8IEUoMSksCU1BU0tfTEkgIHwgRSgxKSwJMCwJe0xVSX0JfSwKLSAgeyJldHJhcCIsCU9QX1JFRygweDMwMikgfCBFKDEpLAlNQVNLX1JFRyB8IEUoMSksCTAsCXtSRUdfMH0JfSwKLQotICAvKiBGbG9hdGluZy1wb2ludCBhZGRpdGlvbiAqLwotCi0gIHsiZmFkZC5kZGQiLAlPUF9SRUcoMHgzRTApIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLmRzZCIsCU9QX1JFRygweDNFMCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNkZCIsCU9QX0xJKDB4M0UxKSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc2RkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc3NkIiwJT1BfTEkoMHgzRTEpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZhZGQuc3NkIiwJT1BfUkVHKDB4M0UwKSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmYWRkLnNzcyIsCU9QX0xJKDB4M0UxKSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZmFkZC5zc3MiLAlPUF9SRUcoMHgzRTApIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBjb21wYXJlICovCi0KLSAgeyJmY21wLmRkIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLmRzIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5zZCIsCU9QX0xJKDB4M0VCKSAgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZmNtcC5zZCIsCU9QX1JFRygweDNFQSkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUfQl9LAotICB7ImZjbXAuc3MiLAlPUF9MSSgweDNFQikgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmY21wLnNzIiwJT1BfUkVHKDB4M0VBKSB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksICAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEZsb2F0aW5nIHBvaW50IGRpdmlkZSAqLwotCi0gIHsiZmRpdi5kZGQiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LmRzZCIsCU9QX1JFRygweDNFNikgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNkZCIsCU9QX0xJKDB4M0U3KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc2RkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc3NkIiwJT1BfTEkoMHgzRTcpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZkaXYuc3NkIiwJT1BfUkVHKDB4M0U2KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmZGl2LnNzcyIsCU9QX0xJKDB4M0U3KSAgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZmRpdi5zc3MiLAlPUF9SRUcoMHgzRTYpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBtdWx0aXBseSAqLwotCi0gIHsiZm1weS5kZGQiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LmRzZCIsCU9QX1JFRygweDNFNCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmbXB5LmlpaSIsCU9QX0xJKDB4M0U1KSAgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LmlpaSIsCU9QX1JFRygweDNFNCkgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkuc2RkIiwJT1BfTEkoMHgzRTUpICB8IFBEKDEpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5zZGQiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5zc2QiLAlPUF9MSSgweDNFNSkgIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsiZm1weS5zc2QiLAlPUF9SRUcoMHgzRTQpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ImZtcHkuc3NzIiwJT1BfTEkoMHgzRTUpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJmbXB5LnNzcyIsCU9QX1JFRygweDNFNCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkudXV1IiwJT1BfTEkoMHgzRTUpICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImZtcHkudXV1IiwJT1BfUkVHKDB4M0U0KSB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogQ29udmVydC9Sb3VuZCB0byBNaW51cyBJbmZpbml0eSAqLwotCi0gIHsiZnJuZG0uZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMykgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigzKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMykgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0uaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigzKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbS5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigzKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG0uc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigzKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbS5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMykgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMykgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRtLnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMykgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG0udXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigzKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRtLnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMykgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIENvbnZlcnQvUm91bmQgdG8gTmVhcmVzdCAqLwotCi0gIHsiZnJuZG4uZGQiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLmRpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uZHMiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5kdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLmlkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLmlkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4uaXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDIpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLmlzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgyKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnNkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kbi5zZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLnNpIiwJT1BfTEkoMHgzRTkpICB8IFBEKDIpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc2kiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMikgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZG4uc3MiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kbi5zdSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgzKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnN1IiwJT1BfUkVHKDB4M0U4KSB8IFBEKDMpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnVkIiwJT1BfTEkoMHgzRTkpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRuLnVkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMCkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZG4udXMiLAlPUF9MSSgweDNFOSkgIHwgUEQoMCkgfCBQMigwKSB8IFAxKDMpLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtMU0ksIFJFR19ERVNUfQl9LAotICB7ImZybmRuLnVzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMCkgfCBQMSgzKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIENvbnZlcnQvUm91bmQgdG8gUG9zaXRpdmUgSW5maW5pdHkgKi8KLQotICB7ImZybmRwLmRkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5kaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLmRzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMikgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuZHUiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigyKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5pZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5pZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLmlzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMikgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5pcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHAuc2QiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC5zaSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgyKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnNpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMikgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmRwLnNzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMikgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc3MiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigyKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHAuc3UiLAlPUF9MSSgweDNFOSkgIHwgUEQoMykgfCBQMigyKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC5zdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDIpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC51ZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kcC51ZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDIpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmRwLnVzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMikgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kcC51cyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDIpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBDb252ZXJ0L1JvdW5kIHRvIFplcm8gKi8KLQotICB7ImZybmR6LmRkIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDEpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5kaSIsCU9QX1JFRygweDNFOCkgfCBQRCgyKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LmRzIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDApIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzBfRSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouZHUiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMykgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5pZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMiksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5pZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LmlzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgyKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5pcyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMiksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUX0V9CX0sCi0gIHsiZnJuZHouc2QiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei5zaSIsCU9QX0xJKDB4M0U5KSAgfCBQRCgyKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1NQRkksIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnNpIiwJT1BfUkVHKDB4M0U4KSB8IFBEKDIpIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7UkVHXzAsIFJFR19ERVNUfQl9LAotICB7ImZybmR6LnNzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc3MiLAlPUF9SRUcoMHgzRTgpIHwgUEQoMCkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0gIHsiZnJuZHouc3UiLAlPUF9MSSgweDNFOSkgIHwgUEQoMykgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei5zdSIsCU9QX1JFRygweDNFOCkgfCBQRCgzKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei51ZCIsCU9QX0xJKDB4M0U5KSAgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMyksCU1BU0tfTEkgIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge0xTSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmcm5kei51ZCIsCU9QX1JFRygweDNFOCkgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZybmR6LnVzIiwJT1BfTEkoMHgzRTkpICB8IFBEKDApIHwgUDIoMSkgfCBQMSgzKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7TFNJLCBSRUdfREVTVH0JfSwKLSAgeyJmcm5kei51cyIsCU9QX1JFRygweDNFOCkgfCBQRCgwKSB8IFAyKDEpIHwgUDEoMyksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVH0JfSwKLQotICAvKiBGbG9hdGluZyBwb2ludCBzcXVhcmUgcm9vdCAqLwotCi0gIHsiZnNxcnQuZGQiLAlPUF9SRUcoMHgzRUUpIHwgUEQoMSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMF9FLCBSRUdfREVTVF9FfQl9LAotICB7ImZzcXJ0LnNkIiwJT1BfTEkoMHgzRUYpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1RfRX0JfSwKLSAgeyJmc3FydC5zZCIsCU9QX1JFRygweDNFRSkgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfREVTVF9FfQl9LAotICB7ImZzcXJ0LnNzIiwJT1BfTEkoMHgzRUYpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHX0RFU1R9CX0sCi0gIHsiZnNxcnQuc3MiLAlPUF9SRUcoMHgzRUUpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHX0RFU1R9CX0sCi0KLSAgLyogRmxvYXRpbmcgcG9pbnQgc3VidHJhY3Rpb24gKi8KLQotICB7ICJmc3ViLmRkZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMl9FLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLmRzZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDApIHwgUDEoMSksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wX0UsIFJFR18yMiwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zZGQiLAlPUF9MSSgweDNFMykgIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX0xJICB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtTUEZJLCBSRUdfMjJfRSwgUkVHX0RFU1RfRX0JfSwKLSAgeyAiZnN1Yi5zZGQiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyX0UsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc3NkIiwJT1BfTEkoMHgzRTMpICB8IFBEKDEpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVF9FfQl9LAotICB7ICJmc3ViLnNzZCIsCU9QX1JFRygweDNFMikgfCBQRCgxKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgUEQoMykgfCBQMigzKSB8IFAxKDMpLCAwLAkge1JFR18wLCBSRUdfMjIsIFJFR19ERVNUX0V9CX0sCi0gIHsgImZzdWIuc3NzIiwJT1BfTEkoMHgzRTMpICB8IFBEKDApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBQRCgzKSB8IFAyKDMpIHwgUDEoMyksIDAsCSB7U1BGSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyAiZnN1Yi5zc3MiLAlPUF9SRUcoMHgzRTIpIHwgUEQoMCkgfCBQMigwKSB8IFAxKDApLAlNQVNLX1JFRyB8IFBEKDMpIHwgUDIoMykgfCBQMSgzKSwgMCwJIHtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBJbGxlZ2FsIGluc3RydWN0aW9ucyAqLwotCi0gIHsiaWxsb3AwIiwJT1BfU0koMHgwKSwJTUFTS19TSSwJMCwJezB9CX0sCi0gIHsiaWxsb3BGIiwJMHgxRkYgPDwgMTMsCTB4MUZGIDw8IDEzLAkwLAl7MH0JfSwKLQotICAvKiBKdW1wIGFuZCBzYXZlIHJldHVybiAqLwotCi0gIHsianNyIiwJT1BfU0koMHg0NCksCU1BU0tfU0ksCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IiLAlPUF9MSSgweDM4OSksCU1BU0tfTEksCTAsCXtPRkZfU0xfQlIsIFJFR19CQVNFLCBSRUdfREVTVH0JfSwKLSAgeyJqc3IiLAlPUF9SRUcoMHgzODgpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyLmEiLAlPUF9TSSgweDQ1KSwJTUFTS19TSSwJMCwJe09GRl9TU19CUiwgUkVHX0JBU0UsIFJFR19ERVNUfQl9LAotICB7Impzci5hIiwJT1BfTEkoMHgzOEIpLAlNQVNLX0xJLAkwLAl7T0ZGX1NMX0JSLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0gIHsianNyLmEiLAlPUF9SRUcoMHgzOEEpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfQkFTRSwgUkVHX0RFU1R9CX0sCi0KLSAgLyogTG9hZCBTaWduZWQgRGF0YSBJbnRvIFJlZ2lzdGVyICovCi0KLSAgeyJsZCIsCU9QX1NJKDB4MjIpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkIiwJT1BfTEkoMHgzNDUpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQiLAlPUF9SRUcoMHgzNDQpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQuYiIsCU9QX1NJKDB4MjApLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLmIiLAlPUF9MSSgweDM0MSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZC5iIiwJT1BfUkVHKDB4MzQwKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLmQiLAlPUF9TSSgweDIzKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUX0V9CQl9LAotICB7ImxkLmQiLAlPUF9MSSgweDM0NykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAotICB7ImxkLmQiLAlPUF9SRUcoMHgzNDYpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJsZC5oIiwJT1BfU0koMHgyMSksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQuaCIsCU9QX0xJKDB4MzQzKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7ImxkLmgiLAlPUF9SRUcoMHgzNDIpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogTG9hZCBVbnNpZ25lZCBEYXRhIEludG8gUmVnaXN0ZXIgKi8KLQotICB7ImxkLnViIiwJT1BfU0koMHgyOCksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsibGQudWIiLAlPUF9MSSgweDM1MSkgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJsZC51YiIsCU9QX1JFRygweDM1MCkgfCBEKDApLAkoTUFTS19SRUcgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe1JFR19TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQkJfSwKLSAgeyJsZC51aCIsCU9QX1NJKDB4MjkpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7ImxkLnVoIiwJT1BfTEkoMHgzNTMpICB8IEQoMCksCShNQVNLX0xJICAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7T0ZGX1NMX0JSX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CX0sCi0gIHsibGQudWgiLAlPUF9SRUcoMHgzNTIpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0KLSAgLyogTGVmdG1vc3Qgb25lICovCi0KLSAgeyJsbW8iLAlPUF9MSSgweDNGMCksCU1BU0tfTEksCTAsCXtSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIEJpdHdpc2UgbG9naWNhbCBPUi4gIE5vdGUgdGhhdCAib3IudHQiIGFuZCAib3IiIGFyZSB0aGUgc2FtZSBpbnN0cnVjdGlvbnMuICovCi0KLSAgeyJvci5mZiIsCU9QX1NJKDB4MUUpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci5mZiIsCU9QX0xJKDB4MzNEKSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IuZmYiLAlPUF9SRUcoMHgzM0MpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7Im9yLmZ0IiwJT1BfU0koMHgxRCksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLmZ0IiwJT1BfTEkoMHgzM0IpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci5mdCIsCU9QX1JFRygweDMzQSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsib3IudGYiLAlPUF9TSSgweDFCKSwJTUFTS19TSSwJMCwJe1NVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IudGYiLAlPUF9MSSgweDMzNyksCU1BU0tfTEksCTAsCXtMVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yLnRmIiwJT1BfUkVHKDB4MzM2KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJvci50dCIsCU9QX1NJKDB4MTcpLAlNQVNLX1NJLAkwLAl7U1VJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvci50dCIsCU9QX0xJKDB4MzJGKSwJTUFTS19MSSwJMCwJe0xVSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsib3IudHQiLAlPUF9SRUcoMHgzMkUpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7Im9yIiwJT1BfU0koMHgxNyksCU1BU0tfU0ksCTAsCXtTVUksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7Im9yIiwJT1BfTEkoMHgzMkYpLAlNQVNLX0xJLAkwLAl7TFVJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJvciIsCU9QX1JFRygweDMyRSksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogUmVhZCBDb250cm9sIFJlZ2lzdGVyICovCi0KLSAgeyJyZGNyIiwJT1BfU0koMHg0KSwJTUFTS19TSSAgfCAoMHgxRiA8PCAyMiksCTAsCXtDUl9TSSwgUkVHX0RFU1R9CX0sCi0gIHsicmRjciIsCU9QX0xJKDB4MzA5KSwJTUFTS19MSSAgfCAoMHgxRiA8PCAyMiksCTAsCXtDUl9MSSwgUkVHX0RFU1R9CX0sCi0gIHsicmRjciIsCU9QX1JFRygweDMwOCksCU1BU0tfUkVHIHwgKDB4MUYgPDwgMjIpLAkwLAl7UkVHXzAsIFJFR19ERVNUfQl9LAotCi0gIC8qIFJpZ2h0bW9zdCBvbmUgKi8KLQotICB7InJtbyIsCU9QX0xJKDB4M0YyKSwJTUFTS19MSSwJMCwJCXtSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNoaWZ0IFJlZ2lzdGVyIExlZnQgLSBub3RlIHRoYXQgcm90bCwgc2hsLCBhbmQgaW5zIGFyZSBhbGwgYWx0ZXJuYXRlIG5hbWVzIGZvciBvbmUgb2YgdGhlIHNoaWZ0IGluc3RydWN0aW9ucy4KLSAgICAgVGhleSBhcHBlYXIgcHJpb3IgdG8gdGhlaXIgc2wgZXF1aXZhbGVudCBzbyB0aGF0IHRoZXkgd2lsbCBiZSBkaWFzc2VtYmxlZCBhcyB0aGUgYWx0ZXJuYXRlIG5hbWUuICovCi0KLQotICB7ImlucyIsCU9QX1JFRygweDMxRSkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImlucyIsCU9QX1NJKDB4RikgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJyb3RsIiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsicm90bCIsCU9QX1NJKDB4OCkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzaGwiLAlPUF9SRUcoMHgzMUMpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2hsIiwJT1BfU0koMHhFKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5kbSIsCU9QX1JFRygweDMxMikgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZHMiLAlPUF9SRUcoMHgzMTQpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZHMiLAlPUF9TSSgweEEpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmR6IiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZXMiLAlPUF9SRUcoMHgzMUEpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuZXMiLAlPUF9TSSgweEQpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMCkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLCAJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsLmV6IiwJT1BfU0koMHhCKSAgICB8IGkoMCkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDApIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwgCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbC5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDApIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuaXoiLAlPUF9SRUcoMHgzMUMpIHwgaSgwKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsIAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2wuaXoiLAlPUF9TSSgweEUpICAgIHwgaSgwKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotCi0gIC8qIFNoaWZ0IFJlZ2lzdGVyIExlZnQgV2l0aCBJbnZlcnRlZCBFbmRtYXNrICovCi0KLSAgeyJzbGkuZG0iLAlPUF9SRUcoMHgzMTIpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZG0iLAlPUF9TSSgweDkpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5kcyIsCU9QX1NJKDB4QSkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmR6IiwJT1BfUkVHKDB4MzEwKSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmR6IiwJT1BfU0koMHg4KSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZW0iLAlPUF9SRUcoMHgzMTgpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuZW0iLAlPUF9TSSgweEMpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5lcyIsCU9QX1NJKDB4RCkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmV6IiwJT1BfUkVHKDB4MzE2KSB8IGkoMSkgfCBuKDApLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic2xpLmV6IiwJT1BfU0koMHhCKSAgICB8IGkoMSkgfCBuKDApLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuaW0iLAlPUF9SRUcoMHgzMUUpIHwgaSgxKSB8IG4oMCksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzbGkuaW0iLAlPUF9TSSgweEYpICAgIHwgaSgxKSB8IG4oMCksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5peiIsCU9QX1JFRygweDMxQykgfCBpKDEpIHwgbigwKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNsaS5peiIsCU9QX1NJKDB4RSkgICAgfCBpKDEpIHwgbigwKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0KLSAgLyogU2hpZnQgUmVnaXN0ZXIgUmlnaHQgLSBub3RlIHRoYXQgZXh0cywgZXh0dSwgcm90ciwgc3JhLCBhbmQgc3JsIGFyZSBhbGwgYWx0ZXJuYXRlIG5hbWVzIGZvciBvbmUgb2YgdGhlIHNoaWZ0IGluc3RydWN0aW9ucy4KLSAgICAgVGhleSBhcHBlYXIgcHJpb3IgdG8gdGhlaXIgc3IgZXF1aXZhbGVudCBzbyB0aGF0IHRoZXkgd2lsbCBiZSBkaWFzc2VtYmxlZCBhcyB0aGUgYWx0ZXJuYXRlIG5hbWUuICovCi0KLSAgeyJleHRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZXh0cyIsCU9QX1NJKDB4QSkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsiZXh0dSIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7ImV4dHUiLAlPUF9TSSgweDgpICAgIHwgaSgwKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InJvdHIiLAlPUF9SRUcoMHgzMTApIHwgaSgwKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJyb3RyIiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyYSIsCU9QX1JFRygweDMxQSkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyYSIsCU9QX1NJKDB4RCkgICAgfCBpKDApIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JsIiwJT1BfUkVHKDB4MzE2KSB8IGkoMCkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JsIiwJT1BfU0koMHhCKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5kbSIsCU9QX1JFRygweDMxMikgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmRtIiwJT1BfU0koMHg5KSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5kcyIsCU9QX1JFRygweDMxNCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5keiIsCU9QX1JFRygweDMxMCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmR6IiwJT1BfU0koMHg4KSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmVtIiwJT1BfU0koMHhDKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5lcyIsCU9QX1JFRygweDMxQSkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5leiIsCU9QX1JFRygweDMxNikgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmV6IiwJT1BfU0koMHhCKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLmltIiwJT1BfU0koMHhGKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzci5peiIsCU9QX1JFRygweDMxQykgfCBpKDApIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMCkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTaGlmdCBSZWdpc3RlciBSaWdodCBXaXRoIEludmVydGVkIEVuZG1hc2sgKi8KLQotICB7InNyaS5kbSIsCU9QX1JFRygweDMxMikgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5kbSIsCU9QX1NJKDB4OSkgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmRzIiwJT1BfUkVHKDB4MzE0KSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmRzIiwJT1BfU0koMHhBKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZHoiLAlPUF9SRUcoMHgzMTApIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZHoiLAlPUF9TSSgweDgpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5lbSIsCU9QX1JFRygweDMxOCkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5lbSIsCU9QX1NJKDB4QykgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmVzIiwJT1BfUkVHKDB4MzFBKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLmVzIiwJT1BfU0koMHhEKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZXoiLAlPUF9SRUcoMHgzMTYpIHwgaSgxKSB8IG4oMSksCU1BU0tfUkVHIHwgaSgxKSB8IG4oMSksCTAsCXtSRUdfMCwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzcmkuZXoiLAlPUF9TSSgweEIpICAgIHwgaSgxKSB8IG4oMSksCU1BU0tfU0kgIHwgaSgxKSB8IG4oMSksCTAsIAl7Uk9UQVRFLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5pbSIsCU9QX1JFRygweDMxRSkgfCBpKDEpIHwgbigxKSwJTUFTS19SRUcgfCBpKDEpIHwgbigxKSwJMCwJe1JFR18wLCBFTkRNQVNLLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InNyaS5pbSIsCU9QX1NJKDB4RikgICAgfCBpKDEpIHwgbigxKSwJTUFTS19TSSAgfCBpKDEpIHwgbigxKSwJMCwgCXtST1RBVEUsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLml6IiwJT1BfUkVHKDB4MzFDKSB8IGkoMSkgfCBuKDEpLAlNQVNLX1JFRyB8IGkoMSkgfCBuKDEpLAkwLAl7UkVHXzAsIEVORE1BU0ssIFJFR18yMiwgUkVHX0RFU1R9CX0sCi0gIHsic3JpLml6IiwJT1BfU0koMHhFKSAgICB8IGkoMSkgfCBuKDEpLAlNQVNLX1NJICB8IGkoMSkgfCBuKDEpLAkwLCAJe1JPVEFURSwgRU5ETUFTSywgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBTdG9yZSBEYXRhIGludG8gTWVtb3J5ICovCi0KLSAgeyJzdCIsCU9QX1NJKDB4MzIpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUfQkJfSwKLSAgeyJzdCIsCU9QX0xJKDB4MzY1KSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7InN0IiwJT1BfUkVHKDB4MzY0KSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotICB7InN0LmIiLAlPUF9TSSgweDMwKSwJCShNQVNLX1NJICAmIH5NX1NJKDEpKSwJCTAsIAl7T0ZGX1NTX0JSLCBSRUdfQkFTRV9NX1NJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QuYiIsCU9QX0xJKDB4MzYxKSAgfCBEKDApLAkoTUFTS19MSSAgJiB+TV9SRUcoMSkpIHwgRCgxKSwJMCwJe09GRl9TTF9CUl9TQ0FMRUQsIFJFR19CQVNFX01fTEksIFJFR19ERVNUfQl9LAotICB7InN0LmIiLAlPUF9SRUcoMHgzNjApIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JCX0sCi0gIHsic3QuZCIsCU9QX1NJKDB4MzMpLAkJKE1BU0tfU0kgICYgfk1fU0koMSkpLAkJMCwgCXtPRkZfU1NfQlIsIFJFR19CQVNFX01fU0ksIFJFR19ERVNUX0V9CQl9LAotICB7InN0LmQiLAlPUF9MSSgweDM2NykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQl9LAotICB7InN0LmQiLAlPUF9SRUcoMHgzNjYpIHwgRCgwKSwJKE1BU0tfUkVHICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtSRUdfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVF9FfQkJfSwKLSAgeyJzdC5oIiwJT1BfU0koMHgzMSksCQkoTUFTS19TSSAgJiB+TV9TSSgxKSksCQkwLCAJe09GRl9TU19CUiwgUkVHX0JBU0VfTV9TSSwgUkVHX0RFU1R9CQl9LAotICB7InN0LmgiLAlPUF9MSSgweDM2MykgIHwgRCgwKSwJKE1BU0tfTEkgICYgfk1fUkVHKDEpKSB8IEQoMSksCTAsCXtPRkZfU0xfQlJfU0NBTEVELCBSRUdfQkFTRV9NX0xJLCBSRUdfREVTVH0JfSwKLSAgeyJzdC5oIiwJT1BfUkVHKDB4MzYyKSB8IEQoMCksCShNQVNLX1JFRyAmIH5NX1JFRygxKSkgfCBEKDEpLAkwLAl7UkVHX1NDQUxFRCwgUkVHX0JBU0VfTV9MSSwgUkVHX0RFU1R9CQl9LAotCi0gIC8qIFNpZ25lZCBJbnRlZ2VyIFN1YnRyYWN0ICovCi0KLSAgeyJzdWIiLAlPUF9TSSgweDVBKSwJTUFTS19TSSwJMCwgCXtTU0ksIFJFR18yMiwgUkVHX0RFU1R9CQl9LAotICB7InN1YiIsCU9QX0xJKDB4M0I1KSwJTUFTS19MSSwJMCwJe0xTSSwgUkVHXzIyLCBSRUdfREVTVH0JCX0sCi0gIHsic3ViIiwJT1BfUkVHKDB4M0I0KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBVbnNpZ25lZCBJbnRlZ2VyIFN1YnRyYWN0ICovCi0KLSAgeyJzdWJ1IiwJT1BfU0koMHg1QiksCU1BU0tfU0ksCTAsIAl7U1NJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJzdWJ1IiwJT1BfTEkoMHgzQjcpLAlNQVNLX0xJLAkwLAl7TFNJLCBSRUdfMjIsIFJFR19ERVNUfQkJfSwKLSAgeyJzdWJ1IiwJT1BfUkVHKDB4M0I2KSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBXcml0ZSBDb250cm9sIFJlZ2lzdGVyCi0gICAgIElzIGEgc3BlY2lhbCBmb3JtIG9mIHRoZSAic3djciIgaW5zdHJ1Y3Rpb24gc28gY29tZXMgYmVmb3JlIGl0IGluIHRoZSB0YWJsZS4gKi8KLQotICB7IndyY3IiLAlPUF9TSSgweDUpLAlNQVNLX1NJIHwgKDB4MUYgPDwgMjcpLAkJMCwJe0NSX1NJLCBSRUdfMjJ9CX0sCi0gIHsid3JjciIsCU9QX0xJKDB4MzBCKSwJTUFTS19MSSB8ICgweDFGIDw8IDI3KSwJCTAsCXtDUl9MSSwgUkVHXzIyfQl9LAotICB7IndyY3IiLAlPUF9SRUcoMHgzMEEpLAlNQVNLX1JFRyB8ICgweDFGIDw8IDI3KSwJMCwJe1JFR18wLCBSRUdfMjJ9CX0sCi0KLSAgLyogU3dhcCBDb250cm9sIFJlZ2lzdGVyICovCi0KLSAgeyJzd2NyIiwJT1BfU0koMHg1KSwJTUFTS19TSSwJMCwJe0NSX1NJLCBSRUdfMjIsIFJFR19ERVNUfQl9LAotICB7InN3Y3IiLAlPUF9MSSgweDMwQiksCU1BU0tfTEksCTAsCXtDUl9MSSwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLSAgeyJzd2NyIiwJT1BfUkVHKDB4MzBBKSwJTUFTS19SRUcsCTAsCXtSRUdfMCwgUkVHXzIyLCBSRUdfREVTVH0JfSwKLQotICAvKiBUcmFwICovCi0KLSAgeyJ0cmFwIiwJT1BfU0koMHgxKSAgICB8IEUoMCksCU1BU0tfU0kgIHwgRSgxKSwJMCwJe1NVSX0JfSwKLSAgeyJ0cmFwIiwJT1BfTEkoMHgzMDMpICB8IEUoMCksCU1BU0tfTEkgIHwgRSgxKSwJMCwJe0xVSX0JfSwKLSAgeyJ0cmFwIiwJT1BfUkVHKDB4MzAyKSB8IEUoMCksCU1BU0tfUkVHIHwgRSgxKSwJMCwJe1JFR18wfQl9LAotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBBZGQgKi8KLQotICB7InZhZGQuZGQiLAlPUF9SRUcoMHgzQzApIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZhZGQuc2QiLAlPUF9MSSgweDNDMSkgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7U1BGSSwgUkVHXzIyX0UsIFJFR18yMl9FfQl9LAotICB7InZhZGQuc2QiLAlPUF9SRUcoMHgzQzApIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2YWRkLnNzIiwJT1BfTEkoMHgzQzEpICB8IFAyKDApIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMiwgUkVHXzIyfQl9LAotICB7InZhZGQuc3MiLAlPUF9SRUcoMHgzQzApIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLAl7UkVHXzAsIFJFR18yMiwgUkVHXzIyfQl9LAotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBNdWx0aXBseSBhbmQgQWRkIHRvIEFjY3VtdWxhdG9yIEZJWE1FISBUaGlzIGlzIG5vdCB5ZXQgZnVsbHkgaW1wbGVtZW50ZWQuCi0gICBGcm9tIHRoZSBkb2N1bWVudGF0aW9uIHRoZXJlIGFwcGVhcnMgdG8gYmUgbm8gd2F5IHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgb3Bjb2RlcyBmb3IKLSAgIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgcmVnaXN0ZXIgZGVzdGluYXRpb25zIGFuZCBpbnN0cnVjdGlvbnMgdGhhdCBoYXZlIGFjY3VtdWxhdG9yIGRlc3RpbmF0aW9ucy4KLSAgIEZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBpcyBuZWNlc3NhcnkuICBTaW5jZSB0aGlzIGlzbid0IGNyaXRpY2FsIHRvIGdldHRpbmcgYSBUSUM4MCB0b29sY2hhaW4gdXAKLSAgIGFuZCBydW5uaW5nLCBpdCBpcyBkZWZlcmVkIHVudGlsIGxhdGVyLiAqLwotCi0gIC8qIFZlY3RvciBGbG9hdGluZy1Qb2ludCBNdWx0aXBseQotICAgTm90ZTogSWYgcjAgaXMgaW4gdGhlIGRlc3RpbmF0aW9uIHJlZywgdGhlbiB0aGlzIGlzIGEgInZlY3RvciBub3AiIGluc3RydWN0aW9uLiAqLwotCi0gIHsidm1weS5kZCIsCU9QX1JFRygweDNDNCkgfCBQMigxKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IgfCBUSUM4MF9OT19SMF9ERVNULCB7UkVHXzBfRSwgUkVHXzIyX0UsIFJFR18yMl9FfSB9LAotICB7InZtcHkuc2QiLAlPUF9MSSgweDNDNSkgIHwgUDIoMSkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1NQRkksIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2bXB5LnNkIiwJT1BfUkVHKDB4M0M0KSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiB8IFRJQzgwX05PX1IwX0RFU1QsIHtSRUdfMCwgUkVHXzIyX0UsIFJFR18yMl9FfSB9LAotICB7InZtcHkuc3MiLAlPUF9MSSgweDNDNSkgIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19MSSAgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1NQRkksIFJFR18yMiwgUkVHXzIyfQl9LAotICB7InZtcHkuc3MiLAlPUF9SRUcoMHgzQzQpIHwgUDIoMCkgfCBQMSgwKSwJTUFTS19SRUcgfCBWX2ExKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SIHwgVElDODBfTk9fUjBfREVTVCwge1JFR18wLCBSRUdfMjIsIFJFR18yMn0gfSwKLQotICAvKiBWZWN0b3IgRmxvYXRpbmctUG9pbnQgTXVsdGlwbHkgYW5kIFN1YnRyYWN0IGZyb20gQWNjdW11bGF0b3IKLSAgICAgRklYTUU6IFNlZSBub3RlIGFib3ZlIGZvciB2bWFjIGluc3RydWN0aW9uICovCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IFN1YnRyYWN0IEFjY3VtdWxhdG9yIEZyb20gU291cmNlCi0gICAgIEZJWE1FOiBTZWUgbm90ZSBhYm92ZSBmb3Igdm1hYyBpbnN0cnVjdGlvbiAqLwotCi0gIC8qIFZlY3RvciBSb3VuZCBXaXRoIEZsb2F0aW5nLVBvaW50IElucHV0Ci0gICAgIEZJWE1FOiBTZWUgbm90ZSBhYm92ZSBmb3Igdm1hYyBpbnN0cnVjdGlvbiAqLwotCi0gIC8qIFZlY3RvciBSb3VuZCB3aXRoIEludGVnZXIgSW5wdXQgKi8KLQotICB7InZybmQuaWQiLAlPUF9MSSAoMHgzQ0IpICB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge0xTSSwgUkVHXzIyX0V9fSwKLSAgeyJ2cm5kLmlkIiwJT1BfUkVHICgweDNDQSkgfCBQMigxKSB8IFAxKDApLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyX0V9fSwKLSAgeyJ2cm5kLmlzIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMU0ksIFJFR18yMn19LAotICB7InZybmQuaXMiLAlPUF9SRUcgKDB4M0NBKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMCgxKSB8IFZfWigxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR18wLCBSRUdfMjJ9fSwKLSAgeyJ2cm5kLnVkIiwJT1BfTEkgKDB4M0NCKSAgfCBQMigxKSB8IFAxKDEpLAlNQVNLX0xJICB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtMVUksIFJFR18yMl9FfX0sCi0gIHsidnJuZC51ZCIsCU9QX1JFRyAoMHgzQ0EpIHwgUDIoMSkgfCBQMSgxKSwJTUFTS19SRUcgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7UkVHXzAsIFJFR18yMl9FfX0sCi0gIHsidnJuZC51cyIsCU9QX0xJICgweDNDQikgIHwgUDIoMCkgfCBQMSgxKSwJTUFTS19MSSAgfCBWX2EwKDEpIHwgVl9aKDEpIHwgUDIoMSkgfCBQMSgxKSwJVElDODBfVkVDVE9SLCB7TFVJLCBSRUdfMjJ9fSwKLSAgeyJ2cm5kLnVzIiwJT1BfUkVHICgweDNDQSkgfCBQMigwKSB8IFAxKDEpLAlNQVNLX1JFRyB8IFZfYTAoMSkgfCBWX1ooMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfMCwgUkVHXzIyfX0sCi0KLSAgLyogVmVjdG9yIEZsb2F0aW5nLVBvaW50IFN1YnRyYWN0ICovCi0KLSAgeyJ2c3ViLmRkIiwJT1BfUkVHKDB4M0MyKSB8IFAyKDEpIHwgUDEoMSksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wX0UsIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2c3ViLnNkIiwJT1BfTEkoMHgzQzMpICB8IFAyKDEpIHwgUDEoMCksCU1BU0tfTEkgIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1NQRkksIFJFR18yMl9FLCBSRUdfMjJfRX0JfSwKLSAgeyJ2c3ViLnNkIiwJT1BfUkVHKDB4M0MyKSB8IFAyKDEpIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wLCBSRUdfMjJfRSwgUkVHXzIyX0V9CX0sCi0gIHsidnN1Yi5zcyIsCU9QX0xJKDB4M0MzKSAgfCBQMigwKSB8IFAxKDApLAlNQVNLX0xJICB8IFZfYTEoMSkgfCBQMigxKSB8IFAxKDEpLAlUSUM4MF9WRUNUT1IsCXtTUEZJLCBSRUdfMjIsIFJFR18yMn0JfSwKLSAgeyJ2c3ViLnNzIiwJT1BfUkVHKDB4M0MyKSB8IFAyKDApIHwgUDEoMCksCU1BU0tfUkVHIHwgVl9hMSgxKSB8IFAyKDEpIHwgUDEoMSksCVRJQzgwX1ZFQ1RPUiwJe1JFR18wLCBSRUdfMjIsIFJFR18yMn0JfSwKLQotICAvKiBWZWN0b3IgTG9hZCBEYXRhIEludG8gUmVnaXN0ZXIgLSBOb3RlIHRoYXQgdGhlIHZlY3RvciBsb2FkL3N0b3JlIGluc3RydWN0aW9ucyBjb21lIGFmdGVyIHRoZSBvdGhlcgotICAgdmVjdG9yIGluc3RydWN0aW9ucyBzbyB0aGF0IHRoZSBkaXNhc3NlbWJsZXIgd2lsbCBhbHdheXMgcHJpbnQgdGhlIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24gc2Vjb25kIGZvcgotICAgdmVjdG9yIGluc3RydWN0aW9ucyB0aGF0IGhhdmUgdHdvIGluc3RydWN0aW9ucyBpbiB0aGUgc2FtZSBvcGNvZGUuICovCi0KLSAgeyJ2bGQwLmQiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDApLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUX0V9IH0sCi0gIHsidmxkMC5zIiwJT1BfVigweDFFKSB8IFZfbSgxKSB8IFZfUygwKSB8IFZfcCgwKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVH0gfSwKLSAgeyJ2bGQxLmQiLAlPUF9WKDB4MUUpIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlNQVNLX1YgfCBWX20oMSkgfCBWX1MoMSkgfCBWX3AoMSksCVRJQzgwX1ZFQ1RPUiwge1JFR19ERVNUX0V9IH0sCi0gIHsidmxkMS5zIiwJT1BfVigweDFFKSB8IFZfbSgxKSB8IFZfUygwKSB8IFZfcCgxKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVH0gfSwKLQotICAvKiBWZWN0b3IgU3RvcmUgRGF0YSBJbnRvIE1lbW9yeSAtIE5vdGUgdGhhdCB0aGUgdmVjdG9yIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb25zIGNvbWUgYWZ0ZXIgdGhlIG90aGVyCi0gICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgdGhlIGRpc2Fzc2VtYmxlciB3aWxsIGFsd2F5cyBwcmludCB0aGUgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbiBzZWNvbmQgZm9yCi0gICB2ZWN0b3IgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSB0d28gaW5zdHJ1Y3Rpb25zIGluIHRoZSBzYW1lIG9wY29kZS4gKi8KLQotICB7InZzdC5kIiwJT1BfVigweDFFKSB8IFZfbSgwKSB8IFZfUygxKSB8IFZfcCgxKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVF9FfSB9LAotICB7InZzdC5zIiwJT1BfVigweDFFKSB8IFZfbSgwKSB8IFZfUygwKSB8IFZfcCgxKSwJTUFTS19WIHwgVl9tKDEpIHwgVl9TKDEpIHwgVl9wKDEpLAlUSUM4MF9WRUNUT1IsIHtSRUdfREVTVH0gfSwKLQotICB7Inhub3IiLAlPUF9TSSgweDE5KSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0gIHsieG5vciIsCU9QX0xJKDB4MzMzKSwJTUFTS19MSSwJMCwJe0xVQkYsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0gIHsieG5vciIsCU9QX1JFRygweDMzMiksCU1BU0tfUkVHLAkwLAl7UkVHXzAsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0KLSAgeyJ4b3IiLAlPUF9TSSgweDE2KSwJTUFTS19TSSwJMCwJe1NVQkYsIFJFR18yMiwgUkVHX0RFU1R9IH0sCi0gIHsieG9yIiwJT1BfTEkoMHgzMkQpLAlNQVNLX0xJLAkwLAl7TFVCRiwgUkVHXzIyLCBSRUdfREVTVH0gfSwKLSAgeyJ4b3IiLAlPUF9SRUcoMHgzMkMpLAlNQVNLX1JFRywJMCwJe1JFR18wLCBSRUdfMjIsIFJFR19ERVNUfSB9LAotCi19OwotCi1jb25zdCBpbnQgdGljODBfbnVtX29wY29kZXMgPSBzaXplb2YgKHRpYzgwX29wY29kZXMpIC8gc2l6ZW9mICh0aWM4MF9vcGNvZGVzWzBdKTsKZGlmZiAtLWdpdCBhL29wY29kZXMvdjg1MC1kaXMuYyBiL29wY29kZXMvdjg1MC1kaXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwNjI1Yi4uMDAwMDAwMAotLS0gYS9vcGNvZGVzL3Y4NTAtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgVjg1MCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0KLVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci1pdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCi0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJhbnNpZGVjbC5oIgotI2luY2x1ZGUgIm9wY29kZS92ODUwLmgiIAotI2luY2x1ZGUgImRpcy1hc20uaCIKLSNpbmNsdWRlICJvcGludGwuaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHY4NTBfcmVnX25hbWVzW10gPQoteyAicjAiLCAicjEiLCAicjIiLCAic3AiLCAiZ3AiLCAicjUiLCAicjYiLCAicjciLCAKLSAgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgCi0gICJyMTYiLCAicjE3IiwgInIxOCIsICJyMTkiLCAicjIwIiwgInIyMSIsICJyMjIiLCAicjIzIiwgCi0gICJyMjQiLCAicjI1IiwgInIyNiIsICJyMjciLCAicjI4IiwgInIyOSIsICJlcCIsICJscCIgfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHY4NTBfc3JlZ19uYW1lc1tdID0KLXsgImVpcGMiLCAiZWlwc3ciLCAiZmVwYyIsICJmZXBzdyIsICJlY3IiLCAicHN3IiwgInNyNiIsICJzcjciLCAKLSAgInNyOCIsICJzcjkiLCAic3IxMCIsICJzcjExIiwgInNyMTIiLCAic3IxMyIsICJzcjE0IiwgInNyMTUiLAotICAiY3RwYyIsICJjdHBzdyIsICJkYnBjIiwgImRicHN3IiwgImN0YnAiLCAic3IyMSIsICJzcjIyIiwgInNyMjMiLCAKLSAgInNyMjQiLCAic3IyNSIsICJzcjI2IiwgInNyMjciLCAic3IyOCIsICJzcjI5IiwgInNyMzAiLCAic3IzMSIsCi0gICJzcjE2IiwgInNyMTciLCAic3IxOCIsICJzcjE5IiwgInNyMjAiLCAic3IyMSIsICJzcjIyIiwgInNyMjMiLCAKLSAgInNyMjQiLCAic3IyNSIsICJzcjI2IiwgInNyMjciLCAic3IyOCIsICJzcjI5IiwgInNyMzAiLCAic3IzMSIgfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHY4NTBfY2NfbmFtZXNbXSA9Ci17ICJ2IiwgImMvbCIsICJ6IiwgIm5oIiwgInMvbiIsICJ0IiwgImx0IiwgImxlIiwgCi0gICJudiIsICJuYy9ubCIsICJueiIsICJoIiwgIm5zL3AiLCAic2EiLCAiZ2UiLCAiZ3QiIH07Ci0KLXN0YXRpYyBpbnQKLWRpc2Fzc2VtYmxlIChtZW1hZGRyLCBpbmZvLCBpbnNuKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci17Ci0gIHN0cnVjdCB2ODUwX29wY29kZSAqICAgICAgICAgIG9wID0gKHN0cnVjdCB2ODUwX29wY29kZSAqKXY4NTBfb3Bjb2RlczsKLSAgY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCAqICAgb3BlcmFuZDsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAwOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgCXNob3J0X29wID0gKChpbnNuICYgMHgwNjAwKSAhPSAweDA2MDApOwotICBpbnQJCQkJYnl0ZXNfcmVhZDsKLSAgaW50CQkJCXRhcmdldF9wcm9jZXNzb3I7Ci0gIAotICAvKiBTcGVjaWFsIGNhc2U6IDMyIGJpdCBNT1YgKi8KLSAgaWYgKChpbnNuICYgMHhmZmUwKSA9PSAweDA2MjApCi0gICAgc2hvcnRfb3AgPSB0cnVlOwotICAKLSAgYnl0ZXNfcmVhZCA9IHNob3J0X29wID8gMiA6IDQ7Ci0gIAotICAvKiBJZiB0aGlzIGlzIGEgdHdvIGJ5dGUgaW5zbiwgdGhlbiBtYXNrIG9mZiB0aGUgaGlnaCBiaXRzLiAqLwotICBpZiAoc2hvcnRfb3ApCi0gICAgaW5zbiAmPSAweGZmZmY7Ci0KLSAgc3dpdGNoIChpbmZvLT5tYWNoKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHRhcmdldF9wcm9jZXNzb3IgPSBQUk9DRVNTT1JfVjg1MDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBiZmRfbWFjaF92ODUwZToKLSAgICAgIHRhcmdldF9wcm9jZXNzb3IgPSBQUk9DRVNTT1JfVjg1MEU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgYmZkX21hY2hfdjg1MGVhOiAKLSAgICAgIHRhcmdldF9wcm9jZXNzb3IgPSBQUk9DRVNTT1JfVjg1MEVBOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAKLSAgLyogRmluZCB0aGUgb3Bjb2RlLiAgKi8KLSAgd2hpbGUgKG9wLT5uYW1lKQotICAgIHsKLSAgICAgIGlmICgob3AtPm1hc2sgJiBpbnNuKSA9PSBvcC0+b3Bjb2RlCi0JICAmJiAob3AtPnByb2Nlc3NvcnMgJiB0YXJnZXRfcHJvY2Vzc29yKSkKLQl7Ci0JICBjb25zdCB1bnNpZ25lZCBjaGFyICogb3BpbmRleF9wdHI7Ci0JICB1bnNpZ25lZCBpbnQgICAgICAgICAgb3BudW07Ci0JICB1bnNpZ25lZCBpbnQgICAgICAgICAgbWVtb3A7Ci0KLQkgIG1hdGNoID0gMTsKLQkgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXNcdCIsIG9wLT5uYW1lKTsKLS8qZnByaW50ZiAoc3RkZXJyLCAibWF0Y2g6IG1hc2s6ICV4IGluc246ICV4LCBvcGNvZGU6ICV4LCBuYW1lOiAlc1xuIiwgb3AtPm1hc2ssIGluc24sIG9wLT5vcGNvZGUsIG9wLT5uYW1lICk7Ki8KLQotCSAgbWVtb3AgPSBvcC0+bWVtb3A7Ci0JICAvKiBOb3cgcHJpbnQgdGhlIG9wZXJhbmRzLgotCi0JICAgICBNRU1PUCBpcyB0aGUgb3BlcmFuZCBudW1iZXIgYXQgd2hpY2ggYSBtZW1vcnkKLQkgICAgIGFkZHJlc3Mgc3BlY2lmaWNhdGlvbiBzdGFydHMsIG9yIHplcm8gaWYgdGhpcwotCSAgICAgaW5zdHJ1Y3Rpb24gaGFzIG5vIG1lbW9yeSBhZGRyZXNzZXMuCi0KLQkgICAgIEEgbWVtb3J5IGFkZHJlc3MgaXMgYWx3YXlzIHR3byBhcmd1bWVudHMuCi0KLQkgICAgIFRoaXMgaW5mb3JtYXRpb24gYWxsb3dzIHVzIHRvIGRldGVybWluZSB3aGVuIHRvCi0JICAgICBpbnNlcnQgY29tbWFzIGludG8gdGhlIG91dHB1dCBzdHJlYW0gYXMgd2VsbCBhcwotCSAgICAgd2hlbiB0byBpbnNlcnQgZGlzcFtyZWddIGV4cHJlc3Npb25zIG9udG8gdGhlCi0JICAgICBvdXRwdXQgc3RyZWFtLiAgKi8KLQkgIAotCSAgZm9yIChvcGluZGV4X3B0ciA9IG9wLT5vcGVyYW5kcywgb3BudW0gPSAxOwotCSAgICAgICAqb3BpbmRleF9wdHIgIT0gMDsKLQkgICAgICAgb3BpbmRleF9wdHIrKywgb3BudW0rKykKLQkgICAgewotCSAgICAgIGxvbmcgCXZhbHVlOwotCSAgICAgIGludCAgCWZsYWc7Ci0JICAgICAgaW50ICAgICAgIHN0YXR1czsKLQkgICAgICBiZmRfYnl0ZQlidWZmZXJbIDQgXTsKLQkgICAgICAKLQkgICAgICBvcGVyYW5kID0gJnY4NTBfb3BlcmFuZHNbKm9waW5kZXhfcHRyXTsKLQkgICAgICAKLQkgICAgICBpZiAob3BlcmFuZC0+ZXh0cmFjdCkKLQkJdmFsdWUgPSAob3BlcmFuZC0+ZXh0cmFjdCkgKGluc24sIDApOwotCSAgICAgIGVsc2UKLQkJewotCQkgIGlmIChvcGVyYW5kLT5iaXRzID09IC0xKQotCQkgICAgdmFsdWUgPSAoaW5zbiAmIG9wZXJhbmQtPnNoaWZ0KTsKLQkJICBlbHNlCi0JCSAgICB2YWx1ZSA9IChpbnNuID4+IG9wZXJhbmQtPnNoaWZ0KSAmICgoMSA8PCBvcGVyYW5kLT5iaXRzKSAtIDEpOwotCi0JCSAgaWYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1NJR05FRCkKLQkJICAgIHZhbHVlID0gKChsb25nKSh2YWx1ZSA8PCAoMzIgLSBvcGVyYW5kLT5iaXRzKSkKLQkJCSAgICAgPj4gKDMyIC0gb3BlcmFuZC0+Yml0cykpOwotCQl9Ci0KLQkgICAgICAvKiBUaGUgZmlyc3Qgb3BlcmFuZCBpcyBhbHdheXMgb3V0cHV0IHdpdGhvdXQgYW55Ci0JCSBzcGVjaWFsIGhhbmRsaW5nLgotCi0JCSBGb3IgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6Ci0KLQkJICAgSWYgbWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAxLCB0aGVuIHdlIG5lZWQgJ1snIHNpbmNlCi0JCSAgIHdlJ3JlIGFib3V0IHRvIG91dHB1dCB0aGUgcmVnaXN0ZXIgdXNlZCBpbiBhIG1lbW9yeQotCQkgICByZWZlcmVuY2UuCi0KLQkJICAgSWYgbWVtb3AgJiYgb3BudW0gPT0gbWVtb3AgKyAyLCB0aGVuIHdlIG5lZWQgJ10nIHNpbmNlCi0JCSAgIHdlIGp1c3QgZmluaXNoZWQgdGhlIHJlZ2lzdGVyIGluIGEgbWVtb3J5IHJlZmVyZW5jZS4gIFdlCi0JCSAgIGFsc28gbmVlZCBhICcsJyBiZWZvcmUgdGhpcyBvcGVyYW5kLgotCi0JCSAgIEVsc2Ugd2UganVzdCBuZWVkIGEgY29tbWEuCi0KLQkJICAgV2UgbWF5IG5lZWQgdG8gb3V0cHV0IGEgdHJhaWxpbmcgJ10nIGlmIHRoZSBsYXN0IG9wZXJhbmQKLQkJICAgaW4gYW4gaW5zdHJ1Y3Rpb24gaXMgdGhlIHJlZ2lzdGVyIGZvciBhIG1lbW9yeSBhZGRyZXNzLiAKLQotCQkgICBUaGUgZXhjZXB0aW9uIChhbmQgdGhlcmUncyBhbHdheXMgYW4gZXhjZXB0aW9uKSBpcyB0aGUKLQkJICAgImptcCIgaW5zbiB3aGljaCBuZWVkcyBzcXVhcmUgYnJhY2tldHMgYXJvdW5kIGl0J3Mgb25seQotCQkgICByZWdpc3RlciBhcmd1bWVudC4gICovCi0KLQkgICAgICAgICAgIGlmIChtZW1vcCAmJiBvcG51bSA9PSBtZW1vcCArIDEpIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiWyIpOwotCSAgICAgIGVsc2UgaWYgKG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMikgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJdLCIpOwotCSAgICAgIGVsc2UgaWYgKG1lbW9wID09IDEgJiYgb3BudW0gPT0gMQotCQkgICAgICAgJiYgKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykpCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiWyIpOwotCSAgICAgIGVsc2UgaWYgKG9wbnVtID4gMSkJICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIsICIpOwotCi0JICAgICAgLyogZXh0cmFjdCB0aGUgZmxhZ3MsIGlnbm9ybmcgb25lcyB3aGljaCBkbyBub3QgZWZmZWN0IGRpc2Fzc2VtYmx5IG91dHB1dC4gKi8KLQkgICAgICBmbGFnID0gb3BlcmFuZC0+ZmxhZ3M7Ci0JICAgICAgZmxhZyAmPSB+IFY4NTBfT1BFUkFORF9TSUdORUQ7Ci0JICAgICAgZmxhZyAmPSB+IFY4NTBfT1BFUkFORF9SRUxBWDsKLQkgICAgICBmbGFnICY9IC0gZmxhZzsKLQkgICAgICAKLQkgICAgICBzd2l0Y2ggKGZsYWcpCi0JCXsKLQkJY2FzZSBWODUwX09QRVJBTkRfUkVHOiAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlcyIsIHY4NTBfcmVnX25hbWVzW3ZhbHVlXSk7IGJyZWFrOwotCQljYXNlIFY4NTBfT1BFUkFORF9TUkc6ICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzIiwgdjg1MF9zcmVnX25hbWVzW3ZhbHVlXSk7IGJyZWFrOwotCQljYXNlIFY4NTBfT1BFUkFORF9DQzogICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiVzIiwgdjg1MF9jY19uYW1lc1t2YWx1ZV0pOyBicmVhazsKLQkJY2FzZSBWODUwX09QRVJBTkRfRVA6ICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJlcCIpOyBicmVhazsKLQkJZGVmYXVsdDogICAgICAgICAgICAgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlZCIsIHZhbHVlKTsgYnJlYWs7Ci0JCWNhc2UgVjg1MF9PUEVSQU5EX0RJU1A6Ci0JCSAgewotCQkgICAgYmZkX3ZtYSBhZGRyID0gdmFsdWUgKyBtZW1hZGRyOwotCQkgICAgCi0JCSAgICAvKiBPbiB0aGUgdjg1MCB0aGUgdG9wIDggYml0cyBvZiBhbiBhZGRyZXNzIGFyZSB1c2VkIGJ5IGFuIG92ZXJsYXkgbWFuYWdlci4KLQkJICAgICAgIFRodXMgaXQgbWF5IGhhcHBlbiB0aGF0IHdoZW4gd2UgYXJlIGxvb2tpbmcgZm9yIGEgc3ltYm9sIHRvIG1hdGNoCi0JCSAgICAgICBhZ2FpbnN0IGFuIGFkZHJlc3Mgd2l0aCBzb21lIG9mIGl0cyB0b3AgYml0cyBzZXQsIHRoZSBzZWFyY2ggZmFpbHMgdG8KLQkJICAgICAgIHR1cm4gdXAgYW4gZXhhY3QgbWF0Y2guICBJbiB0aGlzIGNhc2Ugd2UgdHJ5IHRvIGZpbmQgYW4gZXhhY3QgbWF0Y2gKLQkJICAgICAgIGFnYWluc3QgYSBzeW1ib2wgaW4gdGhlIGxvd2VyIGFkZHJlc3Mgc3BhY2UsIGFuZCBpZiB3ZSBmaW5kIG9uZSwgd2UKLQkJICAgICAgIHVzZSB0aGF0IGFkZHJlc3MuICAgV2Ugb25seSBkbyB0aGlzIGZvciBKQVJMIGluc3RydWN0aW9ucyBob3dldmVyLCBhcwotCQkgICAgICAgd2UgZG8gbm90IHdhbnQgdG8gbWlzaW50ZXJwcmV0IGJyYW5jaCBpbnN0cnVjdGlvbnMuICAqLwotCQkgICAgaWYgKG9wZXJhbmQtPmJpdHMgPT0gMjIpCi0JCSAgICAgIHsKLQkJCWlmICggISBpbmZvLT5zeW1ib2xfYXRfYWRkcmVzc19mdW5jIChhZGRyLCBpbmZvKQotCQkJICAgICYmICgoYWRkciAmIDB4RkYwMDAwMDApICE9IDApCi0JCQkgICAgJiYgaW5mby0+c3ltYm9sX2F0X2FkZHJlc3NfZnVuYyAoYWRkciAmIDB4MDBGRkZGRkYsIGluZm8pKQotCQkJICB7Ci0JCQkgICAgYWRkciAmPSAweDAwRkZGRkZGOwotCQkJICB9Ci0JCSAgICAgIH0KLQkJICAgIGluZm8tPnByaW50X2FkZHJlc3NfZnVuYyAoYWRkciwgaW5mbyk7Ci0JCSAgICBicmVhazsKLQkJICB9Ci0JCSAgICAKLQkJY2FzZSBWODUwRV9QVVNIX1BPUDoKLQkJICB7Ci0JCSAgICBzdGF0aWMgaW50IGxpc3QxMl9yZWdzWzMyXSAgID0geyAzMCwgIDAsICAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsICAwLCAzMSwgMjksIDI4LCAyMywgMjIsIDIxLCAyMCwgMjcsIDI2LCAyNSwgMjQgfTsKLQkJICAgIHN0YXRpYyBpbnQgbGlzdDE4X2hfcmVnc1szMl0gPSB7IDE5LCAxOCwgMTcsIDE2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtMSwgMzAsIDMxLCAyOSwgMjgsIDIzLCAyMiwgMjEsIDIwLCAyNywgMjYsIDI1LCAyNCB9OwotCQkgICAgc3RhdGljIGludCBsaXN0MThfbF9yZWdzWzMyXSA9IHsgIDMsICAyLCAgMSwgLTIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAxNCwgMTUsIDEzLCAxMiwgIDcsICA2LCAgNSwgIDQsIDExLCAxMCwgIDksICA4IH07Ci0JCSAgICBpbnQgKiAgICAgICAgICAgICByZWdzOwotCQkgICAgaW50ICAgICAgICAgICAgICAgaTsKLQkJICAgIHVuc2lnbmVkIGxvbmcgaW50IG1hc2sgPSAwOwotCQkgICAgaW50ICAgICAgICAgICAgICAgcGMgICA9IGZhbHNlOwotCQkgICAgaW50ICAgICAgICAgICAgICAgc3IgICA9IGZhbHNlOwotCQkgICAgCi0JCSAgICAKLQkJICAgIHN3aXRjaCAob3BlcmFuZC0+c2hpZnQpCi0JCSAgICAgIHsKLQkJICAgICAgY2FzZSAweGZmZTAwMDAxOiByZWdzID0gbGlzdDEyX3JlZ3M7IGJyZWFrOwotCQkgICAgICBjYXNlIDB4ZmZmODAwMGY6IHJlZ3MgPSBsaXN0MThfaF9yZWdzOyBicmVhazsKLQkJICAgICAgY2FzZSAweGZmZjgwMDFmOiByZWdzID0gbGlzdDE4X2xfcmVnczsgdmFsdWUgJj0gfjB4MTA7IGJyZWFrOyAgLyogRG8gbm90IGluY2x1ZGUgbWFnaWMgYml0ICovCi0JCSAgICAgIGRlZmF1bHQ6Ci0JCQkvKiB4Z2V0dGV4dDpjLWZvcm1hdCAqLwotCQkJZnByaW50ZiAoc3RkZXJyLCBfKCJ1bmtub3duIG9wZXJhbmQgc2hpZnQ6ICV4XG4iKSwgb3BlcmFuZC0+c2hpZnQgKTsKLQkJCWFib3J0KCk7Ci0JCSAgICAgIH0KLQotCQkgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCSAgICAgIHsKLQkJCWlmICh2YWx1ZSAmICgxIDw8IGkpKQotCQkJICB7Ci0JCQkgICAgc3dpdGNoIChyZWdzWyBpIF0pCi0JCQkgICAgICB7Ci0JCQkgICAgICBkZWZhdWx0OiBtYXNrIHw9ICgxIDw8IHJlZ3NbIGkgXSk7IGJyZWFrOwotCQkJCS8qIHhnZXR0ZXh0OmMtZm9ybWF0ICovCi0JCQkgICAgICBjYXNlIDA6ICBmcHJpbnRmIChzdGRlcnIsIF8oInVua25vd24gcG9wIHJlZzogJWRcbiIpLCBpICk7IGFib3J0KCk7Ci0JCQkgICAgICBjYXNlIC0xOiBwYyA9IHRydWU7IGJyZWFrOwotCQkJICAgICAgY2FzZSAtMjogc3IgPSB0cnVlOyBicmVhazsKLQkJCSAgICAgIH0KLQkJCSAgfQotCQkgICAgICB9Ci0KLQkJICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAieyIpOwotCQkgICAgCi0JCSAgICBpZiAobWFzayB8fCBwYyB8fCBzcikKLQkJICAgICAgewotCQkJaWYgKG1hc2spCi0JCQkgIHsKLQkJCSAgICB1bnNpZ25lZCBpbnQgYml0OwotCQkJICAgIGludCAgICAgICAgICBzaG93bl9vbmUgPSBmYWxzZTsKLQkJCSAgICAKLQkJCSAgICBmb3IgKGJpdCA9IDA7IGJpdCA8IDMyOyBiaXQrKykKLQkJCSAgICAgIGlmIChtYXNrICYgKDEgPDwgYml0KSkKLQkJCQl7Ci0JCQkJICB1bnNpZ25lZCBsb25nIGludCBmaXJzdCA9IGJpdDsKLQkJCQkgIHVuc2lnbmVkIGxvbmcgaW50IGxhc3Q7Ci0KLQkJCQkgIGlmIChzaG93bl9vbmUpCi0JCQkJICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLCAiKTsKLQkJCQkgIGVsc2UKLQkJCQkgICAgc2hvd25fb25lID0gdHJ1ZTsKLQkJCQkgIAotCQkJCSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sIHY4NTBfcmVnX25hbWVzW2ZpcnN0XSk7Ci0JCQkJICAKLQkJCQkgIGZvciAoYml0Kys7IGJpdCA8IDMyOyBiaXQrKykKLQkJCQkgICAgaWYgKChtYXNrICYgKDEgPDwgYml0KSkgPT0gMCkKLQkJCQkgICAgICBicmVhazsKLQotCQkJCSAgbGFzdCA9IGJpdDsKLQotCQkJCSAgaWYgKGxhc3QgPiBmaXJzdCArIDEpCi0JCQkJICAgIHsKLQkJCQkgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIiAtICVzIiwgdjg1MF9yZWdfbmFtZXNbIGxhc3QgLSAxIF0pOwotCQkJCSAgICB9Ci0JCQkJfQotCQkJICB9Ci0JCQkKLQkJCWlmIChwYykKLQkJCSAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIlc1BDIiwgbWFzayA/ICIsICIgOiAiIik7Ci0JCQlpZiAoc3IpCi0JCQkgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiJXNTUiIsIChtYXNrIHx8IHBjKSA/ICIsICIgOiAiIik7Ci0JCSAgICAgIH0KLQkJICAgIAotCQkgICAgaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICJ9Iik7Ci0JCSAgfQotCQlicmVhazsKLQkJICAKLQkJY2FzZSBWODUwRV9JTU1FRElBVEUxNjoKLQkJICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyICsgYnl0ZXNfcmVhZCwgYnVmZmVyLCAyLCBpbmZvKTsKLQkJICBpZiAoc3RhdHVzID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGJ5dGVzX3JlYWQgKz0gMjsKLQkJICAgICAgdmFsdWUgPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotCi0JCSAgICAgIC8qIElmIHRoaXMgaXMgYSBESVNQT1NFIGluc3RydWN0aW9uIHdpdGggZmYgc2V0IHRvIDB4MTAsIHRoZW4gc2hpZnQgdmFsdWUgdXAgYnkgMTYuICAqLwotCQkgICAgICBpZiAoKGluc24gJiAweDAwMWZmZmMwKSA9PSAweDAwMTMwNzgwKQotCQkJdmFsdWUgPDw9IDE2OwotCi0JCSAgICAgIGluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiMHgleCIsIHZhbHVlKTsKLQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB7Ci0JCSAgICAgIGluZm8tPm1lbW9yeV9lcnJvcl9mdW5jIChzdGF0dXMsIG1lbWFkZHIgKyBieXRlc19yZWFkLCBpbmZvKTsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJICAKLQkJY2FzZSBWODUwRV9JTU1FRElBVEUzMjoKLQkJICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyICsgYnl0ZXNfcmVhZCwgYnVmZmVyLCA0LCBpbmZvKTsKLQkJICBpZiAoc3RhdHVzID09IDApCi0JCSAgICB7Ci0JCSAgICAgIGJ5dGVzX3JlYWQgKz0gNDsKLQkJICAgICAgdmFsdWUgPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCQkgICAgICBpbmZvLT5mcHJpbnRmX2Z1bmMgKGluZm8tPnN0cmVhbSwgIjB4JWx4IiwgdmFsdWUpOwotCQkgICAgfQotCQkgIGVsc2UKLQkJICAgIHsKLQkJICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciArIGJ5dGVzX3JlYWQsIGluZm8pOwotCQkgICAgfQotCQkgIGJyZWFrOwotCQl9CQkgIAotCi0JICAgICAgLyogSGFuZGxlIGptcCBjb3JyZWN0bHkuICAqLwotCSAgICAgIGlmIChtZW1vcCA9PSAxICYmIG9wbnVtID09IDEKLQkJICAmJiAoKG9wZXJhbmQtPmZsYWdzICYgVjg1MF9PUEVSQU5EX1JFRykgIT0gMCkpCi0JCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiXSIpOwotCSAgICB9Ci0KLQkgIC8qIENsb3NlIGFueSBzcXVhcmUgYnJhY2tldCB3ZSBsZWZ0IG9wZW4uICAqLwotCSAgaWYgKG1lbW9wICYmIG9wbnVtID09IG1lbW9wICsgMikKLQkgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJdIik7Ci0KLQkgIC8qIEFsbCBkb25lLiAqLwotCSAgYnJlYWs7Ci0JfQotICAgICAgb3ArKzsKLSAgICB9Ci0KLSAgaWYgKCFtYXRjaCkKLSAgICB7Ci0gICAgICBpZiAoc2hvcnRfb3ApCi0JaW5mby0+ZnByaW50Zl9mdW5jIChpbmZvLT5zdHJlYW0sICIuc2hvcnRcdDB4JTA0eCIsIGluc24pOwotICAgICAgZWxzZQotCWluZm8tPmZwcmludGZfZnVuYyAoaW5mby0+c3RyZWFtLCAiLmxvbmdcdDB4JTA4eCIsIGluc24pOwotICAgIH0KLQotICByZXR1cm4gYnl0ZXNfcmVhZDsKLX0KLQotaW50IAotcHJpbnRfaW5zbl92ODUwIChtZW1hZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIG1lbWFkZHI7Ci0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICogaW5mbzsKLXsKLSAgaW50ICAgICAgICAgICBzdGF0dXM7Ci0gIGJmZF9ieXRlICAgICAgYnVmZmVyWyA0IF07Ci0gIHVuc2lnbmVkIGxvbmcgaW5zbiA9IDA7Ci0KLSAgLyogRmlyc3QgZmlndXJlIG91dCBob3cgYmlnIHRoZSBvcGNvZGUgaXMuICAqLwotICAKLSAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyAobWVtYWRkciwgYnVmZmVyLCAyLCBpbmZvKTsKLSAgaWYgKHN0YXR1cyA9PSAwKQotICAgIHsKLSAgICAgIGluc24gPSBiZmRfZ2V0bDE2IChidWZmZXIpOwotICAgICAgCi0gICAgICBpZiAoICAgKGluc24gJiAweDA2MDApID09IDB4MDYwMAotCSAgJiYgKGluc24gJiAweGZmZTApICE9IDB4MDYyMCkKLQl7Ci0JICAvKiBJZiB0aGlzIGlzIGEgNCBieXRlIGluc24sIHJlYWQgNCBieXRlcyBvZiBzdHVmZi4gICovCi0JICBzdGF0dXMgPSBpbmZvLT5yZWFkX21lbW9yeV9mdW5jIChtZW1hZGRyLCBidWZmZXIsIDQsIGluZm8pOwotCi0JICBpZiAoc3RhdHVzID09IDApCi0JICAgIGluc24gPSBiZmRfZ2V0bDMyIChidWZmZXIpOwotCX0KLSAgICB9Ci0gIAotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMgKHN0YXR1cywgbWVtYWRkciwgaW5mbyk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gIC8qIE1ha2Ugc3VyZSB3ZSB0ZWxsIG91ciBjYWxsZXIgaG93IG1hbnkgYnl0ZXMgd2UgY29uc3VtZWQuICAqLwotICByZXR1cm4gZGlzYXNzZW1ibGUgKG1lbWFkZHIsIGluZm8sIGluc24pOwotfQpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy92ODUwLW9wYy5jIGIvb3Bjb2Rlcy92ODUwLW9wYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ4NTdlLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdjg1MC1vcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDc4NiArMCwwIEBACi0vKiBBc3NlbWJsZSBWODUwIGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgImFuc2lkZWNsLmgiCi0jaW5jbHVkZSAib3Bjb2RlL3Y4NTAuaCIKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgIm9waW50bC5oIgotCi0vKiByZWd1bGFyIG9wY29kZSAqLwotI2RlZmluZSBPUCh4KQkJKCh4ICYgMHgzZikgPDwgNSkKLSNkZWZpbmUgT1BfTUFTSwkJT1AgKDB4M2YpCi0KLS8qIGNvbmRpdGlvbmFsIGJyYW5jaCBvcGNvZGUgKi8KLSNkZWZpbmUgQk9QKHgpCQkoKDB4MGIgPDwgNykgfCAoeCAmIDB4MGYpKQotI2RlZmluZSBCT1BfTUFTSwkoKDB4MGYgPDwgNykgfCAweDBmKQotCi0vKiBvbmUtd29yZCBvcGNvZGVzICovCi0jZGVmaW5lIG9uZSh4KQkJKCh1bnNpZ25lZCBpbnQpICh4KSkKLQotLyogdHdvLXdvcmQgb3Bjb2RlcyAqLwotI2RlZmluZSB0d28oeCx5KQkoKHVuc2lnbmVkIGludCkgKHgpIHwgKCh1bnNpZ25lZCBpbnQpICh5KSA8PCAxNikpCi0KLQotDAotLyogVGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGluc2VydCBhbmQgZXh0cmFjdCBjb21wbGljYXRlZCBvcGVyYW5kcy4gICovCi0KLS8qIE5vdGU6IFRoZXJlIGlzIGEgY29uc3BpcmFjeSBiZXR3ZWVuIHRoZXNlIGZ1bmN0aW9ucyBhbmQKLSAgIHY4NTBfaW5zZXJ0X29wZXJhbmQoKSBpbiBnYXMvY29uZmlnL3RjLXY4NTAuYy4gIEVycm9yIG1lc3NhZ2VzCi0gICBjb250YWluaW5nIHRoZSBzdHJpbmcgJ291dCBvZiByYW5nZScgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyBhCi0gICBzcGVjaWZpYyBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIGdpdmVuIHRvIEdBUy4gICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICogbm90X3ZhbGlkICAgID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGluIHJhbmdlIGFuZCBpcyBub3QgYWxpZ25lZCIpOwotc3RhdGljIGNvbnN0IGNoYXIgKiBvdXRfb2ZfcmFuZ2UgPSBOXyAoImRpc3BsYWNlbWVudCB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UiKTsKLXN0YXRpYyBjb25zdCBjaGFyICogbm90X2FsaWduZWQgID0gTl8gKCJkaXNwbGFjZW1lbnQgdmFsdWUgaXMgbm90IGFsaWduZWQiKTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBpbW1lZGlhdGVfb3V0X29mX3JhbmdlID0gTl8gKCJpbW1lZGlhdGUgdmFsdWUgaXMgb3V0IG9mIHJhbmdlIik7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAtMHgxMDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0JKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgbm90IGluIHJhbmdlIGFuZCB0byBvZGQgb2Zmc2V0Iik7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKCJicmFuY2ggdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQotICAgICogZXJybXNnID0gXygiYnJhbmNoIHRvIG9kZCBvZmZzZXQiKTsKLQotICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHgxZjApIDw8IDcpIHwgKCh2YWx1ZSAmIDB4MGUpIDw8IDMpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9ICgoaW5zbiAmIDB4ZjgwMCkgPj4gNykgfCAoKGluc24gJiAweDAwNzApID4+IDMpOwotCi0gIGlmICgoaW5zbiAmIDB4ODAwMCkgIT0gMCkKLSAgICByZXQgLT0gMHgwMjAwOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfZDIyIChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmZmZmZiB8fCB2YWx1ZSA8IC0weDIwMDAwMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBub3QgaW4gcmFuZ2UgYW5kIHRvIGFuIG9kZCBvZmZzZXQiKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8oImJyYW5jaCB2YWx1ZSBvdXQgb2YgcmFuZ2UiKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKCJicmFuY2ggdG8gb2RkIG9mZnNldCIpOwotCi0gIHJldHVybiAoaW5zbiB8ICgodmFsdWUgJiAweGZmZmUpIDw8IDE2KSB8ICgodmFsdWUgJiAweDNmMDAwMCkgPj4gMTYpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfZDIyIChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgc2lnbmVkIGxvbmcgcmV0ID0gKChpbnNuICYgMHhmZmZlMDAwMCkgPj4gMTYpIHwgKChpbnNuICYgMHgzZikgPDwgMTYpOwotCi0gIHJldHVybiAodW5zaWduZWQgbG9uZykgKChyZXQgPDwgMTApID4+IDEwKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kMTZfMTUgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4N2ZmZiB8fCB2YWx1ZSA8IC0weDgwMDApCi0gICAgewotICAgICAgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0JKiBlcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSAyKSAhPSAwKQotICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7Ci0KLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2QxNl8xNSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHhmZmZlMDAwMCk7Ci0KLSAgcmV0dXJuIHJldCA+PiAxNjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kOF83IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweGZmIHx8IHZhbHVlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAoKHZhbHVlICUgMikgIT0gMCkKLQkqIGVycm1zZyA9IF8obm90X3ZhbGlkKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLSAgICB9Ci0gIGVsc2UgaWYgKCh2YWx1ZSAlIDIpICE9IDApCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICB2YWx1ZSA+Pj0gMTsKLQotICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDdmKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q4XzcgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHg3Zik7Ci0KLSAgcmV0dXJuIHJldCA8PCAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2Q4XzYgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgbG9uZyAgICAgICAgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAwKQotICAgIHsKLSAgICAgIGlmICgodmFsdWUgJSA0KSAhPSAwKQotCSplcnJtc2cgPSBfKG5vdF92YWxpZCk7Ci0gICAgICBlbHNlCi0JKiBlcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICgodmFsdWUgJSA0KSAhPSAwKQotICAgICogZXJybXNnID0gXyhub3RfYWxpZ25lZCk7Ci0KLSAgdmFsdWUgPj49IDE7Ci0KLSAgcmV0dXJuIChpbnNuIHwgKHZhbHVlICYgMHg3ZSkpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kOF82IChpbnNuLCBpbnZhbGlkKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGludCAqICAgICAgICAgaW52YWxpZDsKLXsKLSAgdW5zaWduZWQgbG9uZyByZXQgPSAoaW5zbiAmIDB4N2UpOwotCi0gIHJldHVybiByZXQgPDwgMTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF9kNV80IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIGxvbmcgICAgICAgICAgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmIHx8IHZhbHVlIDwgMCkKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgJiAxKQotCSogZXJybXNnID0gXyhub3RfdmFsaWQpOwotICAgICAgZWxzZQotCSplcnJtc2cgPSBfKG91dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICh2YWx1ZSAmIDEpCi0gICAgKiBlcnJtc2cgPSBfKG5vdF9hbGlnbmVkKTsKLQotICB2YWx1ZSA+Pj0gMTsKLQotICByZXR1cm4gKGluc24gfCAodmFsdWUgJiAweDBmKSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X2Q1XzQgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IChpbnNuICYgMHgwZik7Ci0KLSAgcmV0dXJuIHJldCA8PCAxOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2QxNl8xNiAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBzaWduZWQgbG9uZyAgIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHg3ZmZmIHx8IHZhbHVlIDwgLTB4ODAwMCkKLSAgICAqIGVycm1zZyA9IF8ob3V0X29mX3JhbmdlKTsKLQotICByZXR1cm4gKGluc24gfCAoKHZhbHVlICYgMHhmZmZlKSA8PCAxNikgfCAoKHZhbHVlICYgMSkgPDwgNSkpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9kMTZfMTYgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHhmZmZlMDAwMDsKLQotICByZXQgPj49IDE2OwotCi0gIHJldCB8PSAoKGluc24gJiAweDIwKSA+PiA1KTsKLSAgCi0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1pbnNlcnRfaTkgKGluc24sIHZhbHVlLCBlcnJtc2cpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgc2lnbmVkIGxvbmcgICB2YWx1ZTsKLSAgICAgY29uc3QgY2hhciAqKiBlcnJtc2c7Ci17Ci0gIGlmICh2YWx1ZSA+IDB4ZmYgfHwgdmFsdWUgPCAtMHgxMDApCi0gICAgKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOwotCi0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUwKSA8PCAxMykgfCAodmFsdWUgJiAweDFmKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfaTkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICBzaWduZWQgbG9uZyByZXQgPSBpbnNuICYgMHgwMDNjMDAwMDsKLQotICByZXQgPDw9IDEwOwotICByZXQgPj49IDIzOwotCi0gIHJldCB8PSAoaW5zbiAmIDB4MWYpOwotICAKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWluc2VydF91OSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlID4gMHgxZmYpCi0gICAgKiBlcnJtc2cgPSBfKGltbWVkaWF0ZV9vdXRfb2ZfcmFuZ2UpOwotCi0gIHJldHVybiBpbnNuIHwgKCh2YWx1ZSAmIDB4MWUwKSA8PCAxMykgfCAodmFsdWUgJiAweDFmKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWV4dHJhY3RfdTkgKGluc24sIGludmFsaWQpCi0gICAgIHVuc2lnbmVkIGxvbmcgaW5zbjsKLSAgICAgaW50ICogICAgICAgICBpbnZhbGlkOwotewotICB1bnNpZ25lZCBsb25nIHJldCA9IGluc24gJiAweDAwM2MwMDAwOwotCi0gIHJldCA+Pj0gMTM7Ci0KLSAgcmV0IHw9IChpbnNuICYgMHgxZik7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X3NwZSAoaW5zbiwgdmFsdWUsIGVycm1zZykKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICB1bnNpZ25lZCBsb25nIHZhbHVlOwotICAgICBjb25zdCBjaGFyICoqIGVycm1zZzsKLXsKLSAgaWYgKHZhbHVlICE9IDMpCi0gICAgKiBlcnJtc2cgPSBfKCJpbnZhbGlkIHJlZ2lzdGVyIGZvciBzdGFjayBhZGp1c3RtZW50Iik7Ci0KLSAgcmV0dXJuIGluc24gJiAofiAweDE4MDAwMCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1leHRyYWN0X3NwZSAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHJldHVybiAzOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotaW5zZXJ0X2k1ZGl2IChpbnNuLCB2YWx1ZSwgZXJybXNnKQotICAgICB1bnNpZ25lZCBsb25nIGluc247Ci0gICAgIHVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0gICAgIGNvbnN0IGNoYXIgKiogZXJybXNnOwotewotICBpZiAodmFsdWUgPiAweDFmZikKLSAgICB7Ci0gICAgICBpZiAodmFsdWUgJiAxKQotCSogZXJybXNnID0gXygiaW1tZWRpYXRlIHZhbHVlIG5vdCBpbiByYW5nZSBhbmQgbm90IGV2ZW4iKTsKLSAgICAgIGVsc2UKLQkqIGVycm1zZyA9IF8oaW1tZWRpYXRlX291dF9vZl9yYW5nZSk7Ci0gICAgfQotICBlbHNlIGlmICh2YWx1ZSAmIDEpCi0gICAgKiBlcnJtc2cgPSBfKCJpbW1lZGlhdGUgdmFsdWUgbXVzdCBiZSBldmVuIik7Ci0KLSAgdmFsdWUgPSAzMiAtIHZhbHVlOwotICAKLSAgcmV0dXJuIGluc24gfCAoKHZhbHVlICYgMHgxZSkgPDwgMTcpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZXh0cmFjdF9pNWRpdiAoaW5zbiwgaW52YWxpZCkKLSAgICAgdW5zaWduZWQgbG9uZyBpbnNuOwotICAgICBpbnQgKiAgICAgICAgIGludmFsaWQ7Ci17Ci0gIHVuc2lnbmVkIGxvbmcgcmV0ID0gaW5zbiAmIDB4M2MwMDAwOwotCi0gIHJldCA+Pj0gMTc7Ci0KLSAgcmV0ID0gMzIgLSByZXQ7Ci0gIAotICByZXR1cm4gcmV0OwotfQotCi0MCi0vKiBXYXJuaW5nOiBjb2RlIGluIGdhcy9jb25maWcvdGMtdjg1MC5jIGV4YW1pbmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGFycmF5LgotICAgSWYgeW91IGNoYW5nZSBhbnkgb2YgdGhlIHZhbHVlcyBoZXJlLCBiZSBzdXJlIHRvIGxvb2sgZm9yIHNpZGUgZWZmZWN0cyBpbgotICAgdGhhdCBjb2RlLiAqLwotY29uc3Qgc3RydWN0IHY4NTBfb3BlcmFuZCB2ODUwX29wZXJhbmRzW10gPQotewotI2RlZmluZSBVTlVTRUQJMAotICB7IDAsIDAsIE5VTEwsIE5VTEwsIDAgfSwgCi0KLS8qIFRoZSBSMSBmaWVsZCBpbiBhIGZvcm1hdCAxLCA2LCA3LCBvciA5IGluc24uICovCi0jZGVmaW5lIFIxCShVTlVTRUQgKyAxKQotICB7IDUsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfSwgCi0KLS8qIEFzIGFib3ZlLCBidXQgcmVnaXN0ZXIgMCBpcyBub3QgYWxsb3dlZC4gICovCi0jZGVmaW5lIFIxX05PVFIwIChSMSArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB8IFY4NTBfTk9UX1IwIH0sIAotCi0vKiBUaGUgUjIgZmllbGQgaW4gYSBmb3JtYXQgMSwgMiwgNCwgNSwgNiwgNywgOSBpbnNuLiAqLwotI2RlZmluZSBSMgkoUjFfTk9UUjAgKyAxKQotICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfUkVHIH0sCi0KLS8qIEFzIGFib3ZlLCBidXQgcmVnaXN0ZXIgMCBpcyBub3QgYWxsb3dlZC4gICovCi0jZGVmaW5lIFIyX05PVFIwIChSMiArIDEpCi0gIHsgNSwgMTEsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LAotCi0vKiBUaGUgaW1tNSBmaWVsZCBpbiBhIGZvcm1hdCAyIGluc24uICovCi0jZGVmaW5lIEk1CShSMl9OT1RSMCArIDEpCi0gIHsgNSwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1NJR05FRCB9LCAKLQotLyogVGhlIHVuc2lnbmVkIGltbTUgZmllbGQgaW4gYSBmb3JtYXQgMiBpbnNuLiAqLwotI2RlZmluZSBJNVUJKEk1ICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCAwIH0sCi0KLS8qIFRoZSBpbW0xNiBmaWVsZCBpbiBhIGZvcm1hdCA2IGluc24uICovCi0jZGVmaW5lIEkxNgkoSTVVICsgMSkKLSAgeyAxNiwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSBzaWduZWQgZGlzcDcgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBENwkoSTE2ICsgMSkKLSAgeyA3LCAwLCBOVUxMLCBOVUxMLCAwfSwKLQotLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhIGZvcm1hdCA2IGluc24uICovCi0jZGVmaW5lIEQxNl8xNQkoRDcgKyAxKQotICB7IDE1LCAxNywgaW5zZXJ0X2QxNl8xNSwgZXh0cmFjdF9kMTZfMTUsIFY4NTBfT1BFUkFORF9TSUdORUQgfSwgCi0KLS8qIFRoZSAzIGJpdCBpbW1lZGlhdGUgZmllbGQgaW4gZm9ybWF0IDggaW5zbi4gICovCi0jZGVmaW5lIEIzCShEMTZfMTUgKyAxKQotICB7IDMsIDExLCBOVUxMLCBOVUxMLCAwIH0sCi0KLS8qIFRoZSA0IGJpdCBjb25kaXRpb24gY29kZSBpbiBhIHNldGYgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgQ0NDQwkoQjMgKyAxKQotICB7IDQsIDAsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9DQyB9LAotCi0vKiBUaGUgdW5zaWduZWQgRElTUDggZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBEOF83CShDQ0NDICsgMSkKLSAgeyA3LCAwLCBpbnNlcnRfZDhfNywgZXh0cmFjdF9kOF83LCAwIH0sCi0KLS8qIFRoZSB1bnNpZ25lZCBESVNQOCBmaWVsZCBpbiBhIGZvcm1hdCA0IGluc24uICovCi0jZGVmaW5lIEQ4XzYJKEQ4XzcgKyAxKQotICB7IDYsIDEsIGluc2VydF9kOF82LCBleHRyYWN0X2Q4XzYsIDAgfSwKLQotLyogU3lzdGVtIHJlZ2lzdGVyIG9wZXJhbmRzLiAgKi8KLSNkZWZpbmUgU1IxCShEOF82ICsgMSkKLSAgeyA1LCAwLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU1JHIH0sCi0KLS8qIEVQIFJlZ2lzdGVyLiAgKi8KLSNkZWZpbmUgRVAJKFNSMSArIDEpCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX0VQIH0sCi0KLS8qIFRoZSBpbW0xNiBmaWVsZCAodW5zaWduZWQpIGluIGEgZm9ybWF0IDYgaW5zbi4gKi8KLSNkZWZpbmUgSTE2VQkoRVAgKyAxKQotICB7IDE2LCAxNiwgTlVMTCwgTlVMTCwgMH0sIAotCi0vKiBUaGUgUjIgZmllbGQgYXMgYSBzeXN0ZW0gcmVnaXN0ZXIuICAqLwotI2RlZmluZSBTUjIJKEkxNlUgKyAxKQotICB7IDUsIDExLCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU1JHIH0sCi0KLS8qIFRoZSBkaXNwMTYgZmllbGQgaW4gYSBmb3JtYXQgOCBpbnNuLiAqLwotI2RlZmluZSBEMTYJKFNSMiArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgRElTUDkgZmllbGQgaW4gYSBmb3JtYXQgMyBpbnNuLCByZWxheGFibGUuICovCi0jZGVmaW5lIEQ5X1JFTEFYCShEMTYgKyAxKQotICB7IDksIDAsIGluc2VydF9kOSwgZXh0cmFjdF9kOSwgVjg1MF9PUEVSQU5EX1JFTEFYIHwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBfT1BFUkFORF9ESVNQIH0sCi0KLS8qIFRoZSBESVNQMjIgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLCByZWxheGFibGUuCi0gICBUaGlzIF9tdXN0XyBmb2xsb3cgRDlfUkVMQVg7IHRoZSBhc3NlbWJsZXIgYXNzdW1lcyB0aGF0IHRoZSBsb25nZXIKLSAgIHZlcnNpb24gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgc2hvcnRlciB2ZXJzaW9uIGZvciByZWxheGluZy4gICovCi0jZGVmaW5lIEQyMgkoRDlfUkVMQVggKyAxKQotICB7IDIyLCAwLCBpbnNlcnRfZDIyLCBleHRyYWN0X2QyMiwgVjg1MF9PUEVSQU5EX1NJR05FRCB8IFY4NTBfT1BFUkFORF9ESVNQIH0sCi0KLS8qIFRoZSBzaWduZWQgZGlzcDQgZmllbGQgaW4gYSBmb3JtYXQgNCBpbnNuLiAqLwotI2RlZmluZSBENAkoRDIyICsgMSkKLSAgeyA0LCAwLCBOVUxMLCBOVUxMLCAwfSwKLQotLyogVGhlIHVuc2lnbmVkIGRpc3A1IGZpZWxkIGluIGEgZm9ybWF0IDQgaW5zbi4gKi8KLSNkZWZpbmUgRDVfNAkoRDQgKyAxKQotICB7IDQsIDAsIGluc2VydF9kNV80LCBleHRyYWN0X2Q1XzQsIDAgfSwKLQotLyogVGhlIGRpc3AxNiBmaWVsZCBpbiBhbiBmb3JtYXQgNyB1bnNpZ25lZCBieXRlIGxvYWQgaW5zbi4gKi8KLSNkZWZpbmUgRDE2XzE2CShENV80ICsgMSkKLSAgeyAtMSwgMHhmZmZlMDAyMCwgaW5zZXJ0X2QxNl8xNiwgZXh0cmFjdF9kMTZfMTYsIDAgfSwgCi0KLS8qIFRoaXJkIHJlZ2lzdGVyIGluIGNvbmRpdGlvbmFsIG1vdmVzLiAqLwotI2RlZmluZSBSMwkoRDE2XzE2ICsgMSkKLSAgeyA1LCAyNywgTlVMTCwgTlVMTCwgVjg1MF9PUEVSQU5EX1JFRyB9LAotCi0vKiBDb25kaXRpb24gY29kZSBpbiBjb25kaXRpb25hbCBtb3Zlcy4gICovCi0jZGVmaW5lIE1PVkNDCShSMyArIDEpCi0gIHsgNCwgMTcsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9DQyB9LAotCi0vKiBUaGUgaW1tOSBmaWVsZCBpbiBhIG11bHRpcGx5IHdvcmQuICovCi0jZGVmaW5lIEk5CShNT1ZDQyArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X2k5LCBleHRyYWN0X2k5LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0vKiBUaGUgdW5zaWduZWQgaW1tOSBmaWVsZCBpbiBhIG11bHRpcGx5IHdvcmQuICovCi0jZGVmaW5lIFU5CShJOSArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X3U5LCBleHRyYWN0X3U5LCAwIH0sIAotCi0vKiBBIGxpc3Qgb2YgcmVnaXN0ZXJzIGluIGEgcHJlcGFyZS9kaXNwb3NlIGluc3RydWN0aW9uLiAgKi8KLSNkZWZpbmUgTElTVDEyCShVOSArIDEpCi0gIHsgLTEsIDB4ZmZlMDAwMDEsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIAotCi0vKiBUaGUgSU1NNiBmaWVsZCBpbiBhIGNhbGwgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIEk2CShMSVNUMTIgKyAxKQotICB7IDYsIDAsIE5VTEwsIE5VTEwsIDAgfSwgCi0KLS8qIFRoZSAxNiBiaXQgaW1tZWRpYXRlIGZvbGxvd2luZyBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElNTTE2CShJNiArIDEpCi0gIHsgMTYsIDE2LCBOVUxMLCBOVUxMLCBWODUwX09QRVJBTkRfU0lHTkVEIHwgVjg1MEVfSU1NRURJQVRFMTYgfSwgCi0KLS8qIFRoZSAzMiBiaXQgaW1tZWRpYXRlIGZvbGxvd2luZyBhIDMyIGJpdCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIElNTTMyCShJTU0xNiArIDEpCi0gIHsgMCwgMCwgTlVMTCwgTlVMTCwgVjg1MEVfSU1NRURJQVRFMzIgfSwgCi0KLS8qIFRoZSBpbW01IGZpZWxkIGluIGEgcHVzaC9wb3AgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIElNTTUJKElNTTMyICsgMSkKLSAgeyA1LCAxLCBOVUxMLCBOVUxMLCAwIH0sIAotCi0vKiBSZWcyIGluIGRpc3Bvc2UgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFIyRElTUE9TRQkoSU1NNSArIDEpCi0gIHsgNSwgMTYsIE5VTEwsIE5VTEwsIFY4NTBfT1BFUkFORF9SRUcgfCBWODUwX05PVF9SMCB9LAotCi0vKiBTdGFjayBwb2ludGVyIGluIHByZXBhcmUgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIFNQCShSMkRJU1BPU0UgKyAxKQotICB7IDIsIDE5LCBpbnNlcnRfc3BlLCBleHRyYWN0X3NwZSwgVjg1MF9PUEVSQU5EX1JFRyB9LAotCi0vKiBUaGUgSU1NNSBmaWVsZCBpbiBhIGRpdmlkZSBOIHN0ZXAgaW5zdHJ1Y3Rpb24uICovCi0jZGVmaW5lIEk1RElWCShTUCArIDEpCi0gIHsgOSwgMCwgaW5zZXJ0X2k1ZGl2LCBleHRyYWN0X2k1ZGl2LCBWODUwX09QRVJBTkRfU0lHTkVEIH0sIAotCi0gIC8qIFRoZSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIFBVU0hNSC9QT1BNSCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExJU1QxOF9IIChJNURJViArIDEpCi0gIHsgLTEsIDB4ZmZmODAwMGYsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIAotCi0gIC8qIFRoZSBsaXN0IG9mIHJlZ2lzdGVycyBpbiBhIFBVU0hNTC9QT1BNTCBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIExJU1QxOF9MIChMSVNUMThfSCArIDEpCi0gIHsgLTEsIDB4ZmZmODAwMWYsIE5VTEwsIE5VTEwsIFY4NTBFX1BVU0hfUE9QIH0sIC8qIFRoZSBzZXR0aW5nIG9mIHRoZSA0dGggYml0IGlzIGEgZmxhZyB0byBkaXNhc3NtYmxlKCkgaW4gdjg1MC1kaXMuYyAqLwotfSA7IAotCi0MCi0vKiByZWctcmVnIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IEkpICovCi0jZGVmaW5lIElGMQl7UjEsIFIyfQotCi0vKiBpbW0tcmVnIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IElJKSAqLwotI2RlZmluZSBJRjIJe0k1LCBSMn0KLQotLyogY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uIGZvcm1hdCAoRm9ybWF0IElJSSkgKi8KLSNkZWZpbmUgSUYzCXtEOV9SRUxBWH0KLQotLyogMyBvcGVyYW5kIGluc3RydWN0aW9uIChGb3JtYXQgVkkpICovCi0jZGVmaW5lIElGNgl7STE2LCBSMSwgUjJ9Ci0KLS8qIDMgb3BlcmFuZCBpbnN0cnVjdGlvbiAoRm9ybWF0IFZJKSAqLwotI2RlZmluZSBJRjZVCXtJMTZVLCBSMSwgUjJ9Ci0KLQotDAotLyogVGhlIG9wY29kZSB0YWJsZS4KLQotICAgVGhlIGZvcm1hdCBvZiB0aGUgb3Bjb2RlIHRhYmxlIGlzOgotCi0gICBOQU1FCQlPUENPREUJCQlNQVNLCQkgICAgICAgeyBPUEVSQU5EUyB9CSAgIE1FTU9QICAgIFBST0NFU1NPUgotCi0gICBOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjdGlvbi4KLSAgIE9QQ09ERSBpcyB0aGUgaW5zdHJ1Y3Rpb24gb3Bjb2RlLgotICAgTUFTSyBpcyB0aGUgb3Bjb2RlIG1hc2s7IHRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSBkaXNhc3NlbWJsZXIKLSAgICAgd2hpY2ggYml0cyBpbiB0aGUgYWN0dWFsIG9wY29kZSBtdXN0IG1hdGNoIE9QQ09ERS4KLSAgIE9QRVJBTkRTIGlzIHRoZSBsaXN0IG9mIG9wZXJhbmRzLgotICAgTUVNT1Agc3BlY2lmaWVzIHdoaWNoIG9wZXJhbmQgKGlmIGFueSkgaXMgYSBtZW1vcnkgb3BlcmFuZC4KLSAgIFBST0NFU1NPUlMgc3BlY2lmaWVzIHdoaWNoIENQVShzKSBzdXBwb3J0IHRoZSBvcGNvZGUuCi0gICAKLSAgIFRoZSBkaXNhc3NlbWJsZXIgcmVhZHMgdGhlIHRhYmxlIGluIG9yZGVyIGFuZCBwcmludHMgdGhlIGZpcnN0Ci0gICBpbnN0cnVjdGlvbiB3aGljaCBtYXRjaGVzLCBzbyB0aGlzIHRhYmxlIGlzIHNvcnRlZCB0byBwdXQgbW9yZQotICAgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGJlZm9yZSBtb3JlIGdlbmVyYWwgaW5zdHJ1Y3Rpb25zLiAgSXQgaXMgYWxzbwotICAgc29ydGVkIGJ5IG1ham9yIG9wY29kZS4KLQotICAgVGhlIHRhYmxlIGlzIGFsc28gc29ydGVkIGJ5IG5hbWUuICBUaGlzIGlzIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4KLSAgIFdoZW4gcGFyc2luZyBhbiBpbnN0cnVjdGlvbiB0aGUgYXNzZW1ibGVyIGZpbmRzIHRoZSBmaXJzdCBvY2N1cmFuY2UKLSAgIG9mIHRoZSBuYW1lIG9mIHRoZSBpbnN0cnVjaXRvbiBpbiB0aGlzIHRhYmxlIGFuZCB0aGVuIGF0dGVtcHRzIHRvCi0gICBtYXRjaCB0aGUgaW5zdHJ1Y3Rpb24ncyBhcmd1bWVudHMgd2l0aCBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmFuZHMKLSAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkgaXQgaGFzIGp1c3QgZm91bmQgaW4gdGhpcyB0YWJsZS4gIElmIHRoZQotICAgbWF0Y2ggZmFpbHMgdGhlIGFzc2VtYmxlciBsb29rcyBhdCB0aGUgbmV4dCBlbnRyeSBpbiB0aGlzIHRhYmxlLgotICAgSWYgdGhhdCBlbnRyeSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJldmlvdXMgZW50cnksIHRoZW4gaXQKLSAgIHRyaWVzIHRvIG1hdGNoIHRoZSBpbnN0cnVjdGlvbiBhZ2FpbnN0IHRoYXQgZW50cnkgYW5kIHNvIG9uLiAgVGhpcwotICAgaXMgaG93IHRoZSBhc3NlbWJsZXIgY29wZXMgd2l0aCBtdWx0aXBsZSwgZGlmZmVyZW50IGZvcm1hdHMgb2YgdGhlCi0gICBzYW1lIGluc3RydWN0aW9uLiAgKi8KLQotY29uc3Qgc3RydWN0IHY4NTBfb3Bjb2RlIHY4NTBfb3Bjb2Rlc1tdID0KLXsKLXsgImJyZWFrcG9pbnQiLAkweGZmZmYsCQkJMHhmZmZmLAkJICAgICAgCXtVTlVTRUR9LCAgIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCi17ICJqbXAiLAlvbmUgKDB4MDA2MCksCQlvbmUgKDB4ZmZlMCksCSAgICAgIAl7UjF9LCAJCQkxLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAotLyogbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgKi8KLXsgInNsZC5idSIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5idSIsICAgICBvbmUgKDB4MDA2MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENCwgICBFUCwgICBSMl9OT1RSMH0sCTEsIFBST0NFU1NPUl9WODUwRSB9LAotCi17ICJzbGQuaHUiLAlvbmUgKDB4MDQwMCksCQlvbmUgKDB4MDc4MCksCSAgICAgIAl7RDhfNywgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzbGQuaHUiLCAgICAgb25lICgweDAwNzApLAkJb25lICgweDA3ZjApLCAgICAgICAgIAl7RDVfNCwgRVAsICAgUjJfTk9UUjB9LAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLQoteyAic2xkLmIiLCAgICAgIG9uZSAoMHgwMDYwKSwJCW9uZSAoMHgwN2YwKSwgICAgICAgICAJe0Q0LCAgIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNsZC5iIiwJb25lICgweDAzMDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q3LCAgIEVQLCAgIFIyfSwJMSwgUFJPQ0VTU09SX1Y4NTBFIH0sCi17ICJzbGQuYiIsCW9uZSAoMHgwMzAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtENywgICBFUCwgICBSMn0sCTEsIFBST0NFU1NPUl9WODUwIH0sCi0KLXsgInNsZC5oIiwgICAgICBvbmUgKDB4MDA3MCksCQlvbmUgKDB4MDdmMCksICAgICAgICAgCXtENV80LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzbGQuaCIsCW9uZSAoMHgwNDAwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtEOF83LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfVjg1MEUgfSwKLXsgInNsZC5oIiwJb25lICgweDA0MDApLAkJb25lICgweDA3ODApLAkgICAgICAJe0Q4XzcsIEVQLCAgIFIyfSwgCTEsIFBST0NFU1NPUl9WODUwIH0sCi17ICJzbGQudyIsCW9uZSAoMHgwNTAwKSwJCW9uZSAoMHgwNzgxKSwJICAgICAgCXtEOF82LCBFUCwgICBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QuYiIsCW9uZSAoMHgwMzgwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtSMiwgICBENywgICBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QuaCIsCW9uZSAoMHgwNDgwKSwJCW9uZSAoMHgwNzgwKSwJICAgICAgCXtSMiwgICBEOF83LCBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzc3QudyIsCW9uZSAoMHgwNTAxKSwJCW9uZSAoMHgwNzgxKSwJICAgICAgCXtSMiwgICBEOF82LCBFUH0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi0KLXsgInB1c2htbCIsCXR3byAoMHgwN2UwLCAweDAwMDEpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfTH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicHVzaG1oIiwJdHdvICgweDA3ZTAsIDB4MDAwMyksCXR3byAoMHhmZmYwLCAweDAwMDcpLCAJe0xJU1QxOF9IfSwgCQkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJwb3BtbCIsCXR3byAoMHgwN2YwLCAweDAwMDEpLAl0d28gKDB4ZmZmMCwgMHgwMDA3KSwgCXtMSVNUMThfTH0sIAkJMCwgUFJPQ0VTU09SX1Y4NTBFQSB9LAoteyAicG9wbWgiLAl0d28gKDB4MDdmMCwgMHgwMDAzKSwJdHdvICgweGZmZjAsIDB4MDAwNyksIAl7TElTVDE4X0h9LCAJCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDAzKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBTUH0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDBiKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0xNn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDEzKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0xNn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDFiKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01LCBJTU0zMn0sIAkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgInByZXBhcmUiLCAgICB0d28gKDB4MDc4MCwgMHgwMDAxKSwJdHdvICgweGZmYzAsIDB4MDAxZiksIAl7TElTVDEyLCBJTU01fSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGlzcG9zZSIsCW9uZSAoMHgwNjQwKSwgICAgICAgICAgIG9uZSAoMHhmZmMwKSwgICAgICAgICAJe0lNTTUsIExJU1QxMiwgUjJESVNQT1NFfSwwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpc3Bvc2UiLAl0d28gKDB4MDY0MCwgMHgwMDAwKSwgICB0d28gKDB4ZmZjMCwgMHgwMDFmKSwgCXtJTU01LCBMSVNUMTJ9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLXsgImxkLmIiLAl0d28gKDB4MDcwMCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMCksIAl7RDE2LCBSMSwgUjJ9LCAJCTEsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkLmgiLAl0d28gKDB4MDcyMCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7RDE2XzE1LCBSMSwgUjJ9LCAJMSwgUFJPQ0VTU09SX0FMTCB9LAoteyAibGQudyIsCXR3byAoMHgwNzIwLCAweDAwMDEpLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtEMTZfMTUsIFIxLCBSMn0sIAkxLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJsZC5idSIsCXR3byAoMHgwNzgwLCAweDAwMDEpLCAgIHR3byAoMHgwN2MwLCAweDAwMDEpLCAJe0QxNl8xNiwgUjEsIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJsZC5odSIsCXR3byAoMHgwN2UwLCAweDAwMDEpLCAgIHR3byAoMHgwN2UwLCAweDAwMDEpLCAJe0QxNl8xNSwgUjEsIFIyX05PVFIwfSwJMSwgUFJPQ0VTU09SX05PVF9WODUwIH0sICAKLXsgInN0LmIiLAl0d28gKDB4MDc0MCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMCksIAl7UjIsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN0LmgiLAl0d28gKDB4MDc2MCwgMHgwMDAwKSwJdHdvICgweDA3ZTAsIDB4MDAwMSksIAl7UjIsIEQxNl8xNSwgUjF9LCAJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3QudyIsCXR3byAoMHgwNzYwLCAweDAwMDEpLAl0d28gKDB4MDdlMCwgMHgwMDAxKSwgCXtSMiwgRDE2XzE1LCBSMX0sIAkyLCBQUk9DRVNTT1JfQUxMIH0sCi0KLS8qIGJ5dGUgc3dhcC9leHRlbmQgaW5zdHJ1Y3Rpb25zICovCi17ICJ6eGIiLAlvbmUgKDB4MDA4MCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAienhoIiwJb25lICgweDAwYzApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMV9OT1RSMH0sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJzeGIiLAlvbmUgKDB4MDBhMCksCQlvbmUgKDB4ZmZlMCksIAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAic3hoIiwJb25lICgweDAwZTApLAkJb25lICgweGZmZTApLAkgICAgICAJe1IxX05PVFIwfSwJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiYnNoIiwJdHdvICgweDA3ZTAsIDB4MDM0MiksCXR3byAoMHgwN2ZmLCAweDA3ZmYpLCAJe1IyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJic3ciLAl0d28gKDB4MDdlMCwgMHgwMzQwKSwJdHdvICgweDA3ZmYsIDB4MDdmZiksIAl7UjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImhzdyIsCXR3byAoMHgwN2UwLCAweDAzNDQpLAl0d28gKDB4MDdmZiwgMHgwN2ZmKSwgCXtSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBqdW1wIHRhYmxlIGluc3RydWN0aW9ucyAqLwoteyAic3dpdGNoIiwJb25lICgweDAwNDApLAkJb25lICgweGZmZTApLCAJICAgICAgCXtSMX0sIAkJCTEsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiY2FsbHQiLAlvbmUgKDB4MDIwMCksCQlvbmUgKDB4ZmZjMCksIAkgICAgICAJe0k2fSwgCQkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjdHJldCIsIAl0d28gKDB4MDdlMCwgMHgwMTQ0KSwJdHdvICgweGZmZmYsIDB4ZmZmZiksIAl7MH0sIAkJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBhcml0aG1ldGljIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInNldGYiLAl0d28gKDB4MDdlMCwgMHgwMDAwKSwJdHdvICgweDA3ZjAsIDB4ZmZmZiksIAl7Q0NDQywgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNtb3YiLAl0d28gKDB4MDdlMCwgMHgwMzIwKSwJdHdvICgweDA3ZTAsIDB4MDdlMSksIAl7TU9WQ0MsIFIxLCBSMiwgUjN9LCAJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjbW92IiwJdHdvICgweDA3ZTAsIDB4MDMwMCksCXR3byAoMHgwN2UwLCAweDA3ZTEpLCAJe01PVkNDLCBJNSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi17ICJtdWwiLAl0d28gKDB4MDdlMCwgMHgwMjIwKSwJdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtdWwiLAl0d28gKDB4MDdlMCwgMHgwMjQwKSwJdHdvICgweDA3ZTAsIDB4MDdjMyksIAl7STksIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJtdWx1IiwJdHdvICgweDA3ZTAsIDB4MDIyMiksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibXVsdSIsCXR3byAoMHgwN2UwLCAweDAyNDIpLAl0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtVOSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLQoteyAiZGl2IiwJdHdvICgweDA3ZTAsIDB4MDJjMCksCXR3byAoMHgwN2UwLCAweDA3ZmYpLCAJe1IxLCBSMiwgUjN9LCAJCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAiZGl2dSIsCXR3byAoMHgwN2UwLCAweDAyYzIpLAl0d28gKDB4MDdlMCwgMHgwN2ZmKSwgCXtSMSwgUjIsIFIzfSwgCQkwLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgImRpdmh1IiwJdHdvICgweDA3ZTAsIDB4MDI4MiksICAgdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZoIiwJdHdvICgweDA3ZTAsIDB4MDI4MCksICAgdHdvICgweDA3ZTAsIDB4MDdmZiksIAl7UjEsIFIyLCBSM30sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJkaXZoIiwJT1AgICgweDAyKSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLSAgCi17ICJkaXZobiIsCXR3byAoMHgwN2UwLCAweDAyODApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgImRpdmh1biIsCXR3byAoMHgwN2UwLCAweDAyODIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgImRpdm4iLAl0d28gKDB4MDdlMCwgMHgwMmMwKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJkaXZ1biIsCXR3byAoMHgwN2UwLCAweDAyYzIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZobiIsCXR3byAoMHgwN2UwLCAweDAxODApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZodW4iLAl0d28gKDB4MDdlMCwgMHgwMTgyKSwgICB0d28gKDB4MDdlMCwgMHgwN2MzKSwgCXtJNURJViwgUjEsIFIyLCBSM30sIAkwLCBQUk9DRVNTT1JfVjg1MEVBIH0sCi17ICJzZGl2biIsCXR3byAoMHgwN2UwLCAweDAxYzApLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLXsgInNkaXZ1biIsCXR3byAoMHgwN2UwLCAweDAxYzIpLCAgIHR3byAoMHgwN2UwLCAweDA3YzMpLCAJe0k1RElWLCBSMSwgUjIsIFIzfSwgCTAsIFBST0NFU1NPUl9WODUwRUEgfSwKLSAgCi17ICJub3AiLAlvbmUgKDB4MDApLAkJb25lICgweGZmZmYpLAkJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3YiLAlPUCAgKDB4MTApLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibW92IiwJb25lICgweDA2MjApLAkJb25lICgweGZmZTApLAkJe0lNTTMyLCBSMV9OT1RSMH0sCTAsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAoteyAibW92IiwgICAgICAgIE9QICAoMHgwMCksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtb3ZlYSIsCU9QICAoMHgzMSksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibW92aGkiLAlPUCAgKDB4MzIpLAkJT1BfTUFTSywJCXtJMTZVLCBSMSwgUjJfTk9UUjB9LAkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJhZGQiLAlPUCAgKDB4MGUpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYWRkIiwJT1AgICgweDEyKSwJCU9QX01BU0ssCQlJRjIsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImFkZGkiLAlPUCAgKDB4MzApLAkJT1BfTUFTSywJCUlGNiwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic3ViIiwJT1AgICgweDBkKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInN1YnIiLCAJT1AgICgweDBjKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm11bGgiLAlPUCAgKDB4MTcpLAkJT1BfTUFTSywJCXtJNSwgUjJfTk9UUjB9LAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAibXVsaCIsCU9QICAoMHgwNyksCQlPUF9NQVNLLAkJe1IxLCBSMl9OT1RSMH0sCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJtdWxoaSIsCU9QICAoMHgzNyksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiY21wIiwJT1AgICgweDBmKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNtcCIsCU9QICAoMHgxMyksCQlPUF9NQVNLLAkJSUYyLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0gIAotLyogc2F0dXJhdGVkIG9wZXJhdGlvbiBpbnN0cnVjdGlvbnMgKi8KLXsgInNhdGFkZCIsCU9QICgweDExKSwJCU9QX01BU0ssCQl7STUsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdGFkZCIsCU9QICgweDA2KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdHN1YiIsCU9QICgweDA1KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhdHN1YmkiLAlPUCAoMHgzMyksCQlPUF9NQVNLLAkJe0kxNiwgUjEsIFIyX05PVFIwfSwJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2F0c3ViciIsCU9QICgweDA0KSwJCU9QX01BU0ssCQl7UjEsIFIyX05PVFIwfSwJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQotLyogbG9naWNhbCBvcGVyYXRpb24gaW5zdHJ1Y3Rpb25zICovCi17ICJ0c3QiLAlPUCAoMHgwYiksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJvciIsCQlPUCAoMHgwOCksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJvcmkiLAlPUCAoMHgzNCksCQlPUF9NQVNLLAkJSUY2VSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYW5kIiwJT1AgKDB4MGEpLAkJT1BfTUFTSywJCUlGMSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYW5kaSIsCU9QICgweDM2KSwJCU9QX01BU0ssCQlJRjZVLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ4b3IiLAlPUCAoMHgwOSksCQlPUF9NQVNLLAkJSUYxLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJ4b3JpIiwJT1AgKDB4MzUpLAkJT1BfTUFTSywJCUlGNlUsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgIm5vdCIsCU9QICgweDAxKSwJCU9QX01BU0ssCQlJRjEsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNhciIsCU9QICgweDE1KSwJCU9QX01BU0ssCQl7STVVLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2FyIiwJdHdvICgweDA3ZTAsIDB4MDBhMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLCAJe1IxLCAgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNobCIsCU9QICAoMHgxNiksCQlPUF9NQVNLLAkgICAgICAJe0k1VSwgUjJ9LCAJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInNobCIsCXR3byAoMHgwN2UwLCAweDAwYzApLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwgCXtSMSwgIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzaHIiLAlPUCAgKDB4MTQpLAkJT1BfTUFTSywJICAgICAgCXtJNVUsIFIyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzaHIiLAl0d28gKDB4MDdlMCwgMHgwMDgwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksIAl7UjEsICBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAic2FzZiIsICAgICAgIHR3byAoMHgwN2UwLCAweDAyMDApLAl0d28gKDB4MDdmMCwgMHhmZmZmKSwgCXtDQ0NDLCBSMn0sIAkJMCwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi0KLS8qIGJyYW5jaCBpbnN0cnVjdGlvbnMgKi8KLQkvKiBzaWduZWQgaW50ZWdlciAqLwoteyAiYmd0IiwJQk9QICgweGYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJnZSIsCUJPUCAoMHhlKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibHQiLAlCT1AgKDB4NiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmxlIiwJQk9QICgweDcpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCi17ICJiaCIsCQlCT1AgKDB4YiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm5oIiwJQk9QICgweDMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJsIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJibmwiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIGNvbW1vbiAqLwoteyAiYmUiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuZSIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogb3RoZXJzICovCi17ICJidiIsCQlCT1AgKDB4MCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm52IiwJQk9QICgweDgpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuIiwJCUJPUCAoMHg0KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJicCIsCQlCT1AgKDB4YyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYmMiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJuYyIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJieiIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiYm56IiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImJyIiwJCUJPUCAoMHg1KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJic2EiLAlCT1AgKDB4ZCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCi0vKiBCcmFuY2ggbWFjcm9zLgotCi0gICBXZSB1c2UgdGhlIHNob3J0IGZvcm0gaW4gdGhlIG9wY29kZS9tYXNrIGZpZWxkcy4gIFRoZSBhc3NlbWJsZXIKLSAgIHdpbGwgdHdpZGRsZSBiaXRzIGFzIG5lY2Vzc2FyeSBpZiB0aGUgbG9uZyBmb3JtIGlzIG5lZWRlZC4gICovCi0KLQkvKiBzaWduZWQgaW50ZWdlciAqLwoteyAiamd0IiwJQk9QICgweGYpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpnZSIsCUJPUCAoMHhlKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbHQiLAlCT1AgKDB4NiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamxlIiwJQk9QICgweDcpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLQkvKiB1bnNpZ25lZCBpbnRlZ2VyICovCi17ICJqaCIsCQlCT1AgKDB4YiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam5oIiwJQk9QICgweDMpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpsIiwJCUJPUCAoMHgxKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqbmwiLAlCT1AgKDB4OSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotCS8qIGNvbW1vbiAqLwoteyAiamUiLAkJQk9QICgweDIpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuZSIsCUJPUCAoMHhhKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi0JLyogb3RoZXJzICovCi17ICJqdiIsCQlCT1AgKDB4MCksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam52IiwJQk9QICgweDgpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuIiwJCUJPUCAoMHg0KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqcCIsCQlCT1AgKDB4YyksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamMiLAkJQk9QICgweDEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpuYyIsCUJPUCAoMHg5KSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqeiIsCQlCT1AgKDB4MiksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiam56IiwJQk9QICgweGEpLAkJQk9QX01BU0ssCQlJRjMsIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImpzYSIsCUJPUCAoMHhkKSwJCUJPUF9NQVNLLAkJSUYzLCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJqYnIiLAlCT1AgKDB4NSksCQlCT1BfTUFTSywJCUlGMywgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAotICAKLXsgImpyIiwJCW9uZSAoMHgwNzgwKSwJCXR3byAoMHhmZmMwLCAweDAwMDEpLAl7RDIyfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAiamFybCIsCW9uZSAoMHgwNzgwKSwJCXR3byAoMHgwN2MwLCAweDAwMDEpLAl7RDIyLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTH0sIAotCi0vKiBiaXQgbWFuaXB1bGF0aW9uIGluc3RydWN0aW9ucyAqLwoteyAic2V0MSIsCXR3byAoMHgwN2MwLCAweDAwMDApLAl0d28gKDB4YzdlMCwgMHgwMDAwKSwJe0IzLCBEMTYsIFIxfSwgCQkyLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzZXQxIiwJdHdvICgweDA3ZTAsIDB4MDBlMCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7UjIsIFIxfSwgICAgCQkyLCBQUk9DRVNTT1JfTk9UX1Y4NTAgfSwKLXsgIm5vdDEiLAl0d28gKDB4NDdjMCwgMHgwMDAwKSwJdHdvICgweGM3ZTAsIDB4MDAwMCksCXtCMywgRDE2LCBSMX0sIAkJMiwgUFJPQ0VTU09SX0FMTCB9LAoteyAibm90MSIsCXR3byAoMHgwN2UwLCAweDAwZTIpLAl0d28gKDB4MDdlMCwgMHhmZmZmKSwJe1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJjbHIxIiwJdHdvICgweDg3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgImNscjEiLAl0d28gKDB4MDdlMCwgMHgwMGU0KSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksICAge1IyLCBSMX0sICAgIAkJMiwgUFJPQ0VTU09SX05PVF9WODUwIH0sCi17ICJ0c3QxIiwJdHdvICgweGM3YzAsIDB4MDAwMCksCXR3byAoMHhjN2UwLCAweDAwMDApLAl7QjMsIEQxNiwgUjF9LCAJCTIsIFBST0NFU1NPUl9BTEwgfSwKLXsgInRzdDEiLAl0d28gKDB4MDdlMCwgMHgwMGU2KSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMiwgUjF9LCAgICAJCTIsIFBST0NFU1NPUl9OT1RfVjg1MCB9LAotCi0vKiBzcGVjaWFsIGluc3RydWN0aW9ucyAqLwoteyAiZGkiLAkJdHdvICgweDA3ZTAsIDB4MDE2MCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImVpIiwJCXR3byAoMHg4N2UwLCAweDAxNjApLAl0d28gKDB4ZmZmZiwgMHhmZmZmKSwJezB9LCAJCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJoYWx0IiwJdHdvICgweDA3ZTAsIDB4MDEyMCksCXR3byAoMHhmZmZmLCAweGZmZmYpLAl7MH0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgInJldGkiLAl0d28gKDB4MDdlMCwgMHgwMTQwKSwJdHdvICgweGZmZmYsIDB4ZmZmZiksCXswfSwgCQkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAidHJhcCIsCXR3byAoMHgwN2UwLCAweDAxMDApLAl0d28gKDB4ZmZlMCwgMHhmZmZmKSwJe0k1VX0sIAkJCTAsIFBST0NFU1NPUl9BTEwgfSwKLXsgImxkc3IiLAl0d28gKDB4MDdlMCwgMHgwMDIwKSwJdHdvICgweDA3ZTAsIDB4ZmZmZiksCXtSMSwgU1IyfSwgCQkwLCBQUk9DRVNTT1JfQUxMIH0sCi17ICJzdHNyIiwJdHdvICgweDA3ZTAsIDB4MDA0MCksCXR3byAoMHgwN2UwLCAweGZmZmYpLAl7U1IxLCBSMn0sIAkJMCwgUFJPQ0VTU09SX0FMTCB9LAoteyAwLCAwLCAwLCB7MH0sIDAsIDAgfSwKLQotfSA7Ci0KLWNvbnN0IGludCB2ODUwX251bV9vcGNvZGVzID0KLSAgc2l6ZW9mICh2ODUwX29wY29kZXMpIC8gc2l6ZW9mICh2ODUwX29wY29kZXNbMF0pOwotCmRpZmYgLS1naXQgYS9vcGNvZGVzL3ZheC1kaXMuYyBiL29wY29kZXMvdmF4LWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGI1OWYzLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvdmF4LWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qIFByaW50IFZBWCBpbnN0cnVjdGlvbnMuCi0gICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTggRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCi0gICBDb250cmlidXRlZCBieSBQYXVsaW5lIE1pZGRlbGluayA8bWlkZGVsaW5AcG9seXdhcmUuaWFmLm5sPgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSAib3Bjb2RlL3ZheC5oIgotI2luY2x1ZGUgImRpcy1hc20uaCIKLQotLyogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgUEFSQU1TICgoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGJmZF92bWEsCi0JCQlkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9tb2RlIFBBUkFNUyAoKGludCwgdW5zaWduZWQgY2hhciAqLCBiZmRfdm1hLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLQotc3RhdGljIGNoYXIgKnJlZ19uYW1lc1tdID0KLXsKLSAgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwgInI1IiwgInI2IiwgInI3IiwKLSAgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCAiYXAiLCAiZnAiLCAic3AiLCAicGMiCi19OwotCi0vKiBTaWduLWV4dGVuZCBhbiAodW5zaWduZWQgY2hhcikuICovCi0jaWYgX19TVERDX18gPT0gMQotI2RlZmluZSBDT0VSQ0VfU0lHTkVEX0NIQVIoY2gpICgoc2lnbmVkIGNoYXIpKGNoKSkKLSNlbHNlCi0jZGVmaW5lIENPRVJDRV9TSUdORURfQ0hBUihjaCkgKChpbnQpKCgoY2gpIF4gMHg4MCkgJiAweEZGKSAtIDEyOCkKLSNlbmRpZgotCi0vKiBHZXQgYSAxIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBORVhUQllURShwKSAgXAotICAocCArPSAxLCBGRVRDSF9EQVRBIChpbmZvLCBwKSwgXAotICBDT0VSQ0VfU0lHTkVEX0NIQVIocFstMV0pKQotCi0vKiBHZXQgYSAyIGJ5dGUgc2lnbmVkIGludGVnZXIuICAqLwotI2RlZmluZSBDT0VSQ0UxNih4KSAoKGludCkgKCgoeCkgXiAweDgwMDApIC0gMHg4MDAwKSkKLSNkZWZpbmUgTkVYVFdPUkQocCkgIFwKLSAgKHAgKz0gMiwgRkVUQ0hfREFUQSAoaW5mbywgcCksIFwKLSAgIENPRVJDRTE2ICgocFstMV0gPDwgOCkgKyBwWy0yXSkpCi0KLS8qIEdldCBhIDQgYnl0ZSBzaWduZWQgaW50ZWdlci4gICovCi0jZGVmaW5lIENPRVJDRTMyKHgpICgoaW50KSAoKCh4KSBeIDB4ODAwMDAwMDApIC0gMHg4MDAwMDAwMCkpCi0jZGVmaW5lIE5FWFRMT05HKHApICBcCi0gIChwICs9IDQsIEZFVENIX0RBVEEgKGluZm8sIHApLCBcCi0gICAoQ09FUkNFMzIgKCgoKCgocFstMV0gPDwgOCkgKyBwWy0yXSkgPDwgOCkgKyBwWy0zXSkgPDwgOCkgKyBwWy00XSkpKQotCi0vKiBNYXhpbXVtIGxlbmd0aCBvZiBhbiBpbnN0cnVjdGlvbi4gICovCi0jZGVmaW5lIE1BWExFTiAyNQotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLXN0cnVjdCBwcml2YXRlCi17Ci0gIC8qIFBvaW50cyB0byBmaXJzdCBieXRlIG5vdCBmZXRjaGVkLiAgKi8KLSAgYmZkX2J5dGUgKm1heF9mZXRjaGVkOwotICBiZmRfYnl0ZSB0aGVfYnVmZmVyW01BWExFTl07Ci0gIGJmZF92bWEgaW5zbl9zdGFydDsKLSAgam1wX2J1ZiBiYWlsb3V0OwotfTsKLQotLyogTWFrZSBzdXJlIHRoYXQgYnl0ZXMgZnJvbSBJTkZPLT5QUklWQVRFX0RBVEEtPkJVRkZFUiAoaW5jbHVzaXZlKQotICAgdG8gQUREUiAoZXhjbHVzaXZlKSBhcmUgdmFsaWQuICBSZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIGxvbmdqbXBzCi0gICBvbiBlcnJvci4gICovCi0jZGVmaW5lIEZFVENIX0RBVEEoaW5mbywgYWRkcikgXAotICAoKGFkZHIpIDw9ICgoc3RydWN0IHByaXZhdGUgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKGFkZHIpKSkKLQotc3RhdGljIGludAotZmV0Y2hfZGF0YSAoaW5mbywgYWRkcikKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci0gICAgIGJmZF9ieXRlICphZGRyOwotewotICBpbnQgc3RhdHVzOwotICBzdHJ1Y3QgcHJpdmF0ZSAqcHJpdiA9IChzdHJ1Y3QgcHJpdmF0ZSAqKSBpbmZvLT5wcml2YXRlX2RhdGE7Ci0gIGJmZF92bWEgc3RhcnQgPSBwcml2LT5pbnNuX3N0YXJ0ICsgKHByaXYtPm1heF9mZXRjaGVkIC0gcHJpdi0+dGhlX2J1ZmZlcik7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAoc3RhcnQsCi0JCQkJICAgICAgcHJpdi0+bWF4X2ZldGNoZWQsCi0JCQkJICAgICAgYWRkciAtIHByaXYtPm1heF9mZXRjaGVkLAotCQkJCSAgICAgIGluZm8pOwotICBpZiAoc3RhdHVzICE9IDApCi0gICAgewotICAgICAgKCppbmZvLT5tZW1vcnlfZXJyb3JfZnVuYykgKHN0YXR1cywgc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotICBlbHNlCi0gICAgcHJpdi0+bWF4X2ZldGNoZWQgPSBhZGRyOwotCi0gIHJldHVybiAxOwotfQotCi0vKiBQcmludCB0aGUgdmF4IGluc3RydWN0aW9uIGF0IGFkZHJlc3MgTUVNQUREUiBpbiBkZWJ1Z2dlZCBtZW1vcnksCi0gICBvbiBJTkZPLT5TVFJFQU0uICBSZXR1cm5zIGxlbmd0aCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGluIGJ5dGVzLiAgKi8KLQotaW50Ci1wcmludF9pbnNuX3ZheCAobWVtYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBtZW1hZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBjb25zdCBzdHJ1Y3Qgdm90ICp2b3RwOwotICBjb25zdCBjaGFyICphcmdwID0gTlVMTDsKLSAgdW5zaWduZWQgY2hhciAqYXJnOwotICBzdHJ1Y3QgcHJpdmF0ZSBwcml2OwotICBiZmRfYnl0ZSAqYnVmZmVyID0gcHJpdi50aGVfYnVmZmVyOwotCi0gIGluZm8tPnByaXZhdGVfZGF0YSA9IChQVFIpICZwcml2OwotICBwcml2Lm1heF9mZXRjaGVkID0gcHJpdi50aGVfYnVmZmVyOwotICBwcml2Lmluc25fc3RhcnQgPSBtZW1hZGRyOwotICBpZiAoc2V0am1wIChwcml2LmJhaWxvdXQpICE9IDApCi0gICAgewotICAgICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgRkVUQ0hfREFUQSAoaW5mbywgYnVmZmVyICsgMik7Ci0gIGZvciAodm90cCA9ICZ2b3RzdHJzWzBdOyB2b3RwLT5uYW1lWzBdOyB2b3RwKyspCi0gICAgewotICAgICAgcmVnaXN0ZXIgdmF4X29wY29kZVQgb3Bjb2RlID0gdm90cC0+ZGV0YWlsLmNvZGU7Ci0KLSAgICAgIC8qIDIgYnl0ZSBjb2RlcyBtYXRjaCAyIGJ1ZmZlciBwb3MuICovCi0gICAgICBpZiAoKGJmZF9ieXRlKSBvcGNvZGUgPT0gYnVmZmVyWzBdCi0JICAmJiAob3Bjb2RlID4+IDggPT0gMCB8fCBvcGNvZGUgPj4gOCA9PSBidWZmZXJbMV0pKQotCXsKLQkgIGFyZ3AgPSB2b3RwLT5kZXRhaWwuYXJnczsKLQkgIGJyZWFrOwotCX0KLSAgICB9Ci0gIGlmIChhcmdwID09IE5VTEwpCi0gICAgewotICAgICAgLyogSGFuZGxlIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMuICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIi53b3JkIDB4JXgiLAotCQkJICAgICAoYnVmZmVyWzBdIDw8IDgpICsgYnVmZmVyWzFdKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLQotICAvKiBQb2ludCBhdCBmaXJzdCBieXRlIG9mIGFyZ3VtZW50IGRhdGEsIGFuZCBhdCBkZXNjcmlwdG9yIGZvciBmaXJzdAotICAgICBhcmd1bWVudC4gICovCi0gIGFyZyA9IGJ1ZmZlciArICgodm90cC0+ZGV0YWlsLmNvZGUgPj4gOCkgPyAyIDogMSk7Ci0KLSAgLyogTWFrZSBzdXJlIHdlIGhhdmUgaXQgaW4gbWVtICovCi0gIEZFVENIX0RBVEEgKGluZm8sIGFyZyk7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIHZvdHAtPm5hbWUpOwotICBpZiAoKmFyZ3ApCi0gICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIgIik7Ci0KLSAgd2hpbGUgKCphcmdwKQotICAgIHsKLSAgICAgIGFyZyArPSBwcmludF9pbnNuX2FyZyAoYXJncCwgYXJnLCBtZW1hZGRyICsgYXJnIC0gYnVmZmVyLCBpbmZvKTsKLSAgICAgIGFyZ3AgKz0gMjsKLSAgICAgIGlmICgqYXJncCkKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiwiKTsKLSAgICB9Ci0KLSAgcmV0dXJuIGFyZyAtIGJ1ZmZlcjsKLX0KLQotLyogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgImVhdGVuIiBieSB0aGUgb3BlcmFuZCwgb3IgcmV0dXJuIC0xIGlmIGFuCi0gICBpbnZhbGlkIG9wZXJhbmQgd2FzIGZvdW5kLCBvciAtMiBpZiBhbiBvcGNvZGUgdGFiZWwgZXJyb3Igd2FzCi0gICBmb3VuZC4gKi8KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9hcmcgKGQsIHAwLCBhZGRyLCBpbmZvKQotICAgICBjb25zdCBjaGFyICpkOwotICAgICB1bnNpZ25lZCBjaGFyICpwMDsKLSAgICAgYmZkX3ZtYSBhZGRyOwkJLyogUEMgZm9yIHRoaXMgYXJnIHRvIGJlIHJlbGF0aXZlIHRvICovCi0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIGludCBhcmdfbGVuOwotCi0gIC8qIGNoZWNrIHZhbGlkaXR5IG9mIGFkZHJlc3NpbmcgbGVuZ3RoICovCi0gIHN3aXRjaCAoZFsxXSkKLSAgICB7Ci0gICAgY2FzZSAnYicgOiBhcmdfbGVuID0gMTsJYnJlYWs7Ci0gICAgY2FzZSAnZCcgOiBhcmdfbGVuID0gODsJYnJlYWs7Ci0gICAgY2FzZSAnZicgOiBhcmdfbGVuID0gNDsJYnJlYWs7Ci0gICAgY2FzZSAnZycgOiBhcmdfbGVuID0gODsJYnJlYWs7Ci0gICAgY2FzZSAnaCcgOiBhcmdfbGVuID0gMTY7CWJyZWFrOwotICAgIGNhc2UgJ2wnIDogYXJnX2xlbiA9IDQ7CWJyZWFrOwotICAgIGNhc2UgJ28nIDogYXJnX2xlbiA9IDE2OwlicmVhazsKLSAgICBjYXNlICd3JyA6IGFyZ19sZW4gPSAyOwlicmVhazsKLSAgICBjYXNlICdxJyA6IGFyZ19sZW4gPSA4OwlicmVhazsKLSAgICBkZWZhdWx0ICA6IGFib3J0KCk7Ci0gICAgfQotCi0gIC8qIGJyYW5jaGVzIGhhdmUgbm8gbW9kZSBieXRlICovCi0gIGlmIChkWzBdID09ICdiJykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICpwID0gcDA7Ci0KLSAgICAgIGlmIChhcmdfbGVuID09IDEpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMSArIE5FWFRCWVRFIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgMiArIE5FWFRXT1JEIChwKSwgaW5mbyk7Ci0KLSAgICAgIHJldHVybiBwIC0gcDA7Ci0gICAgfQotCi0gIHJldHVybiBwcmludF9pbnNuX21vZGUgKGFyZ19sZW4sIHAwLCBhZGRyLCBpbmZvKTsKLX0KLQotc3RhdGljIGludAotcHJpbnRfaW5zbl9tb2RlIChzaXplLCBwMCwgYWRkciwgaW5mbykKLSAgICAgaW50IHNpemU7Ci0gICAgIHVuc2lnbmVkIGNoYXIgKnAwOwotICAgICBiZmRfdm1hIGFkZHI7CQkvKiBQQyBmb3IgdGhpcyBhcmcgdG8gYmUgcmVsYXRpdmUgdG8gKi8KLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgdW5zaWduZWQgY2hhciAqcCA9IHAwOwotICB1bnNpZ25lZCBjaGFyIG1vZGUsIHJlZzsKLQotICAvKiBmZXRjaCBhbmQgaW50ZXJwcmV0IG1vZGUgYnl0ZSAqLwotICBtb2RlID0gKHVuc2lnbmVkIGNoYXIpIE5FWFRCWVRFIChwKTsKLSAgcmVnID0gbW9kZSAmIDB4RjsKLSAgc3dpdGNoIChtb2RlICYgMHhGMCkKLSAgICB7Ci0gICAgY2FzZSAweDAwOgotICAgIGNhc2UgMHgxMDoKLSAgICBjYXNlIDB4MjA6Ci0gICAgY2FzZSAweDMwOiAvKiBsaXRlcmFsIG1vZGUJCQkkbnVtYmVyICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIiQweCV4IiwgbW9kZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NDA6IC8qIGluZGV4OgkJCWJhc2UtYWRkcltSbl0gKi8KLSAgICAgIHAgKz0gcHJpbnRfaW5zbl9tb2RlIChzaXplLCBwMCArIDEsIGFkZHIgKyAxLCBpbmZvKTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiWyVzXSIsIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHg1MDogLyogcmVnaXN0ZXI6CQkJUm4gKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJXMiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4NjA6IC8qIHJlZ2lzdGVyIGRlZmVycmVkOgkJKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIoJXMpIiwgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDcwOiAvKiBhdXRvZGVjcmVtZW50OgkJLShSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLSglcykiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4ODA6IC8qIGF1dG9pbmNyZW1lbnQ6CQkoUm4pKyAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JewkvKiBpbW1lZGlhdGU/ICovCi0JICBpbnQgaTsKLQotCSAgRkVUQ0hfREFUQSAoaW5mbywgcCArIHNpemUpOwotCSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIkMHgiKTsKLQkgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiJTAyeCIsIHBbc2l6ZSAtIGkgLSAxXSk7Ci0JICBwICs9IHNpemU7Ci0JfQotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKCVzKSsiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4OTA6IC8qIGF1dG9pbmNyZW1lbnQgZGVmZXJyZWQ6CUAoUm4pKyAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqMHgleCIsIE5FWFRMT05HIChwKSk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICJAKCVzKSsiLCByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDB4QjA6IC8qIGRpc3BsYWNlbWVudCBieXRlIGRlZmVycmVkOgkqZGlzcGwoUm4pICovCi0gICAgICAoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIioiKTsKLSAgICBjYXNlIDB4QTA6IC8qIGRpc3BsYWNlbWVudCBieXRlOgkJZGlzcGwoUm4pICovCi0gICAgICBpZiAocmVnID09IDB4RikKLQkoKmluZm8tPnByaW50X2FkZHJlc3NfZnVuYykgKGFkZHIgKyAyICsgTkVYVEJZVEUgKHApLCBpbmZvKTsKLSAgICAgIGVsc2UKLQkoKmluZm8tPmZwcmludGZfZnVuYykgKGluZm8tPnN0cmVhbSwgIjB4JXgoJXMpIiwgTkVYVEJZVEUgKHApLAotCQkJICAgICAgIHJlZ19uYW1lc1tyZWddKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHhEMDogLyogZGlzcGxhY2VtZW50IHdvcmQgZGVmZXJyZWQ6CSpkaXNwbChSbikgKi8KLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiKiIpOwotICAgIGNhc2UgMHhDMDogLyogZGlzcGxhY2VtZW50IHdvcmQ6CQlkaXNwbChSbikgKi8KLSAgICAgIGlmIChyZWcgPT0gMHhGKQotCSgqaW5mby0+cHJpbnRfYWRkcmVzc19mdW5jKSAoYWRkciArIDMgKyBORVhUV09SRCAocCksIGluZm8pOwotICAgICAgZWxzZQotCSgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiMHgleCglcykiLCBORVhUV09SRCAocCksCi0JCQkgICAgICAgcmVnX25hbWVzW3JlZ10pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweEYwOiAvKiBkaXNwbGFjZW1lbnQgbG9uZyBkZWZlcnJlZDoJKmRpc3BsKFJuKSAqLwotICAgICAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIqIik7Ci0gICAgY2FzZSAweEUwOiAvKiBkaXNwbGFjZW1lbnQgbG9uZzoJCWRpc3BsKFJuKSAqLwotICAgICAgaWYgKHJlZyA9PSAweEYpCi0JKCppbmZvLT5wcmludF9hZGRyZXNzX2Z1bmMpIChhZGRyICsgNSArIE5FWFRMT05HIChwKSwgaW5mbyk7Ci0gICAgICBlbHNlCi0JKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIweCV4KCVzKSIsIE5FWFRMT05HIChwKSwKLQkJCSAgICAgICByZWdfbmFtZXNbcmVnXSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgcmV0dXJuIHAgLSBwMDsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdzY1LWRpcy5jIGIvb3Bjb2Rlcy93NjUtZGlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMmU4OTYuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy93NjUtZGlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyogRGlzYXNzZW1ibGUgV0RDIDY1ODE2IGluc3RydWN0aW9ucy4KLSAgIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZGVmaW5lIFNUQVRJQ19UQUJMRQotI2RlZmluZSBERUZJTkVfVEFCTEUKLQotI2luY2x1ZGUgInc2NS1vcGMuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLXN0YXRpYyAgIGZwcmludGZfZnR5cGUgZnByOwotc3RhdGljICAgdm9pZCAqc3RyZWFtOwotc3RhdGljICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmxvY2FsX2luZm87Ci0jaWYgMAotc3RhdGljIGNoYXIgKmxuYW1lW10gPSAgeyJyMCIsInIxIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIsInI3IiwiczAifTsKLQotc3RhdGljIGNoYXIgKmZpbmRuYW1lICh2YWwpCi0gICAgIHVuc2lnbmVkIGludCB2YWw7Ci17Ci0gIGlmICh2YWwgPj0gMHgxMCAmJiB2YWwgPD0gMHgyMCkKLSAgICByZXR1cm4gbG5hbWVbKHZhbCAtIDB4MTApIC8gMl07Ci0gIHJldHVybiAwOwotfQotI2VuZGlmCi1zdGF0aWMgdm9pZAotcHJpbnRfb3BlcmFuZCAobG9va3VwLCBmb3JtYXQsIGFyZ3MpCi0gICAgIGludCBsb29rdXA7Ci0gICAgIGNoYXIgKmZvcm1hdDsKLSAgICAgdW5zaWduZWQgICAgIGludCAqYXJnczsKLXsKLSAgaW50IHZhbDsKLSAgaW50IGM7Ci0KLSAgd2hpbGUgKCpmb3JtYXQpCi0gICAgewotICAgICAgc3dpdGNoICggYyA9ICpmb3JtYXQrKykgCi0JewotCWNhc2UgJyQnOgotCSAgdmFsID0gYXJnc1soKmZvcm1hdCsrKSAtICcwJ107Ci0JICBpZiAobG9va3VwKSAKLQkgICAgewotI2lmIDAKLQkgICAgICBuYW1lID0gZmluZG5hbWUodmFsKTsKLQkgICAgICBpZiAobmFtZSkKLQkJZnByKHN0cmVhbSwgIiVzIiwgbmFtZSk7Ci0JICAgICAgZWxzZQotI2VuZGlmCi0JCWxvY2FsX2luZm8tPnByaW50X2FkZHJlc3NfZnVuYyAodmFsLCBsb2NhbF9pbmZvKTsgIAotCSAgICB9Ci0JICBlbHNlCi0JICAgIGZwciAoc3RyZWFtLCAiMHgleCIsIHZhbCk7Ci0KLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBmcHIoc3RyZWFtLCIlYyIsIGMpOwotCSAgYnJlYWs7Ci0JfQotICAgIH0KLX0KLWludCAKLXByaW50X2luc25fdzY1KG1lbWFkZHIsIGluZm8pCi0gICAgIGJmZF92bWEgbWVtYWRkcjsKLSAgICAgc3RydWN0IGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0KLQotICBpbnQgc3RhdHVzID0gMDsKLSAgdW5zaWduZWQgY2hhciBpbnNuWzRdOwotICByZWdpc3RlciBzdHJ1Y3Qgb3BpbmZvICpvcDsKLSAgaW50IGk7Ci0gIGludCBYID0wOwotICBpbnQgTSA9IDA7Ci0gIGludCBhcmdzWzJdOwotc3RyZWFtID0gaW5mby0+c3RyZWFtOwotICBmcHIgPSBpbmZvLT5mcHJpbnRmX2Z1bmM7Ci1sb2NhbF9pbmZvID0gICAgaW5mbzsKLSAgZm9yIChpID0gMDsgaSA8NCAmJiBzdGF0dXMgPT0gMDsgaSsrKSAKLSAgICB7Ci0gICAgc3RhdHVzID0gaW5mby0+cmVhZF9tZW1vcnlfZnVuYyhtZW1hZGRyK2ksIGluc24gKyBpLCAxLCBpbmZvKTsKLSAgfQotCi0KLSAgZm9yIChvcCA9IG9wdGFibGU7IG9wLT52YWwgIT0gaW5zblswXTsgb3ArKykgCi0gICAgOwotCi0gIGZwcihzdHJlYW0sIiVzIiwgb3AtPm5hbWUpOwotICAKLSAgLyogUHJlcGFyZSBhbGwgdGhlIHBvc2libGUgb3BlcmFuZCB2YWx1ZXMgKi8KLSAgewotICAgIGludCBzaXplID0gMTsKLSAgICBpbnQgYXNSX1c2NV9BQlM4ID0gaW5zblsxXTsKLSAgICBpbnQgYXNSX1c2NV9BQlMxNiA9IChpbnNuWzJdIDw8IDgpICsgYXNSX1c2NV9BQlM4OwotICAgIGludCBhc1JfVzY1X0FCUzI0ID0gKGluc25bM10gPDwgMTYpICsgYXNSX1c2NV9BQlMxNjsKLSAgICBpbnQgYXNSX1c2NV9QQ1I4ID0gKChjaGFyKShhc1JfVzY1X0FCUzgpKSArIG1lbWFkZHIgKyAyOwotICAgIGludCBhc1JfVzY1X1BDUjE2ID0gKChzaG9ydCkoYXNSX1c2NV9BQlMxNikpICsgbWVtYWRkciArIDM7Ci0KLSAgICBzd2l0Y2ggKG9wLT5hbW9kZSkgewotICAgICAgRElTQVNNKCk7Ci0gICAgfQotCi0gIHJldHVybiBzaXplOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvdzY1LW9wYy5oIGIvb3Bjb2Rlcy93NjUtb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzM1MzUuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy93NjUtb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NDggKzAsMCBAQAotCQkJLyogV0RDIDY1ODE2IEFzc2VtYmxlciBvcGNvZGUgdGFibGUgKi8KLQkJCS8qICAgKGdlbmVyYXRlZCBieSB0aGUgcHJvZ3JhbSBzaW0vdzY1L2dlbmNvZGUgLWEpICovCi0jZGVmaW5lIEFERFJfSU1NVE9BICAgICAgICAgICAgICAxCSAvKiAjYSAgICAgICovCi0jZGVmaW5lIEFERFJfSU1NQ09QICAgICAgICAgICAgICAyCSAvKiAjYyAgICAgICovCi0jZGVmaW5lIEFERFJfSU1NVE9JICAgICAgICAgICAgICAzCSAvKiAjaSAgICAgICovCi0jZGVmaW5lIEFERFJfQUNDICAgICAgICAgICAgICAgICA0CSAvKiBBICAgICAgICovCi0jZGVmaW5lIEFERFJfUENfUkVMICAgICAgICAgICAgICA1CSAvKiByICAgICAgICovCi0jZGVmaW5lIEFERFJfUENfUkVMX0xPTkcgICAgICAgICA2CSAvKiBybCAgICAgICovCi0jZGVmaW5lIEFERFJfSU1QTElFRCAgICAgICAgICAgICA3CSAvKiBpICAgICAgICovCi0jZGVmaW5lIEFERFJfU1RBQ0sgICAgICAgICAgICAgICA4CSAvKiBzICAgICAgICovCi0jZGVmaW5lIEFERFJfRElSICAgICAgICAgICAgICAgICA5CSAvKiBkICAgICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lEWF9YICAgICAgICAgICAxMAkgLyogZCx4ICAgICAqLwotI2RlZmluZSBBRERSX0RJUl9JRFhfWSAgICAgICAgICAgMTEJIC8qIGQseSAgICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EICAgICAgICAgICAgIDEyCSAvKiAoZCkgICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lEWF9JTkRfWCAgICAgICAxMwkgLyogKGQseCkgICAqLwotI2RlZmluZSBBRERSX0RJUl9JTkRfSURYX1kgICAgICAgMTQJIC8qIChkKSx5ICAgKi8KLSNkZWZpbmUgQUREUl9ESVJfSU5EX0xPTkcgICAgICAgIDE1CSAvKiBbZF0gICAgICovCi0jZGVmaW5lIEFERFJfRElSX0lORF9JRFhfWV9MT05HICAxNgkgLyogW2RdLHkgICAqLwotI2RlZmluZSBBRERSX0FCUyAgICAgICAgICAgICAgICAgMTcJIC8qIGEgICAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSURYX1ggICAgICAgICAgIDE4CSAvKiBhLHggICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0lEWF9ZICAgICAgICAgICAxOQkgLyogYSx5ICAgICAqLwotI2RlZmluZSBBRERSX0FCU19MT05HICAgICAgICAgICAgMjAJIC8qIGFsICAgICAgKi8KLSNkZWZpbmUgQUREUl9BQlNfSU5EX0xPTkcgICAgICAgIDIxCSAvKiBbYV0gICAgICovCi0jZGVmaW5lIEFERFJfQUJTX0xPTkdfSURYX1ggICAgICAyMgkgLyogYWwseCAgICAqLwotI2RlZmluZSBBRERSX1NUQUNLX1JFTCAgICAgICAgICAgMjMJIC8qIGQscyAgICAgKi8KLSNkZWZpbmUgQUREUl9TVEFDS19SRUxfSU5EWF9JRFggIDI0CSAvKiAoZCxzKSx5ICovCi0jZGVmaW5lIEFERFJfQUJTX0lORCAgICAgICAgICAgICAyNQkgLyogKGEpICAgICAqLwotI2RlZmluZSBBRERSX0FCU19JTkRfSURYICAgICAgICAgMjYJIC8qIChhLHgpICAgKi8KLSNkZWZpbmUgQUREUl9CTE9DS19NT1ZFICAgICAgICAgIDI3CSAvKiB4eXogICAgICovCi1zdHJ1Y3Qgb3BpbmZvIHsKLQlpbnQgdmFsOwotCWludCBjb2RlOwotCWNoYXIgKm5hbWU7Ci0JaW50IGFtb2RlOwotfTsKLXN0cnVjdCBvcGluZm8gb3B0YWJsZVsyNTddPXsKLSNkZWZpbmUgT19hZGMgMQotI2RlZmluZSBPX2FuZCAyCi0jZGVmaW5lIE9fYXNsIDMKLSNkZWZpbmUgT19iY2MgNAotI2RlZmluZSBPX2JjcyA1Ci0jZGVmaW5lIE9fYmVxIDYKLSNkZWZpbmUgT19iaXQgNwotI2RlZmluZSBPX2JtaSA4Ci0jZGVmaW5lIE9fYm5lIDkKLSNkZWZpbmUgT19icGwgMTAKLSNkZWZpbmUgT19icmEgMTEKLSNkZWZpbmUgT19icmsgMTIKLSNkZWZpbmUgT19icmwgMTMKLSNkZWZpbmUgT19idmMgMTQKLSNkZWZpbmUgT19idnMgMTUKLSNkZWZpbmUgT19jbGMgMTYKLSNkZWZpbmUgT19jbGQgMTcKLSNkZWZpbmUgT19jbGkgMTgKLSNkZWZpbmUgT19jbHYgMTkKLSNkZWZpbmUgT19jbXAgMjAKLSNkZWZpbmUgT19jb3AgMjEKLSNkZWZpbmUgT19jcHggMjIKLSNkZWZpbmUgT19jcHkgMjMKLSNkZWZpbmUgT19kZWMgMjQKLSNkZWZpbmUgT19kZXggMjUKLSNkZWZpbmUgT19kZXkgMjYKLSNkZWZpbmUgT19lb3IgMjcKLSNkZWZpbmUgT19pbmMgMjgKLSNkZWZpbmUgT19pbnggMjkKLSNkZWZpbmUgT19pbnkgMzAKLSNkZWZpbmUgT19qbXAgMzEKLSNkZWZpbmUgT19qc3IgMzIKLSNkZWZpbmUgT19sZGEgMzMKLSNkZWZpbmUgT19sZHggMzQKLSNkZWZpbmUgT19sZHkgMzUKLSNkZWZpbmUgT19sc3IgMzYKLSNkZWZpbmUgT19tdm4gMzcKLSNkZWZpbmUgT19tdnAgMzgKLSNkZWZpbmUgT19ub3AgMzkKLSNkZWZpbmUgT19vcmEgNDAKLSNkZWZpbmUgT19wZWEgNDEKLSNkZWZpbmUgT19wZWkgNDIKLSNkZWZpbmUgT19wZXIgNDMKLSNkZWZpbmUgT19waGEgNDQKLSNkZWZpbmUgT19waGIgNDUKLSNkZWZpbmUgT19waGQgNDYKLSNkZWZpbmUgT19waGsgNDcKLSNkZWZpbmUgT19waHAgNDgKLSNkZWZpbmUgT19waHggNDkKLSNkZWZpbmUgT19waHkgNTAKLSNkZWZpbmUgT19wbGEgNTEKLSNkZWZpbmUgT19wbGIgNTIKLSNkZWZpbmUgT19wbGQgNTMKLSNkZWZpbmUgT19wbHAgNTQKLSNkZWZpbmUgT19wbHggNTUKLSNkZWZpbmUgT19wbHkgNTYKLSNkZWZpbmUgT19yZXAgNTcKLSNkZWZpbmUgT19yb2wgNTgKLSNkZWZpbmUgT19yb3IgNTkKLSNkZWZpbmUgT19ydGkgNjAKLSNkZWZpbmUgT19ydGwgNjEKLSNkZWZpbmUgT19ydHMgNjIKLSNkZWZpbmUgT19zYmMgNjMKLSNkZWZpbmUgT19zZWMgNjQKLSNkZWZpbmUgT19zZWQgNjUKLSNkZWZpbmUgT19zZWkgNjYKLSNkZWZpbmUgT19zZXAgNjcKLSNkZWZpbmUgT19zdGEgNjgKLSNkZWZpbmUgT19zdHAgNjkKLSNkZWZpbmUgT19zdHggNzAKLSNkZWZpbmUgT19zdHkgNzEKLSNkZWZpbmUgT19zdHogNzIKLSNkZWZpbmUgT190YXggNzMKLSNkZWZpbmUgT190YXkgNzQKLSNkZWZpbmUgT190Y2QgNzUKLSNkZWZpbmUgT190Y3MgNzYKLSNkZWZpbmUgT190ZGMgNzcKLSNkZWZpbmUgT190cmIgNzgKLSNkZWZpbmUgT190c2IgNzkKLSNkZWZpbmUgT190c2MgODAKLSNkZWZpbmUgT190c3ggODEKLSNkZWZpbmUgT190eGEgODIKLSNkZWZpbmUgT190eHMgODMKLSNkZWZpbmUgT190eHkgODQKLSNkZWZpbmUgT190eWEgODUKLSNkZWZpbmUgT190eXggODYKLSNkZWZpbmUgT193YWkgODcKLSNkZWZpbmUgT193ZG0gODgKLSNkZWZpbmUgT194YmEgODkKLSNkZWZpbmUgT194Y2UgOTAKLSNpZmRlZiBERUZJTkVfVEFCTEUKLQl7MHg2OSwJT19hZGMsCSJhZGMiLAlBRERSX0lNTVRPQX0sCi0JezB4NzIsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJfSU5EfSwKLQl7MHg3MSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDczLAlPX2FkYywJImFkYyIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHg2MSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDY3LAlPX2FkYywJImFkYyIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHg3NywJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4NkQsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlN9LAotCXsweDdELAlPX2FkYywJImFkYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg3OSwJT19hZGMsCSJhZGMiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4NkYsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfTE9OR30sCi0JezB4N0YsCU9fYWRjLAkiYWRjIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4NjUsCU9fYWRjLAkiYWRjIiwJQUREUl9ESVJ9LAotCXsweDYzLAlPX2FkYywJImFkYyIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHg3NSwJT19hZGMsCSJhZGMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MjksCU9fYW5kLAkiYW5kIiwJQUREUl9JTU1UT0F9LAotCXsweDMyLAlPX2FuZCwJImFuZCIsCUFERFJfRElSX0lORH0sCi0JezB4MzEsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHgzMywJT19hbmQsCSJhbmQiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4MjEsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgyNywJT19hbmQsCSJhbmQiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4MzcsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDJELAlPX2FuZCwJImFuZCIsCUFERFJfQUJTfSwKLQl7MHgzRCwJT19hbmQsCSJhbmQiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MzksCU9fYW5kLAkiYW5kIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDJGLAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0xPTkd9LAotCXsweDNGLAlPX2FuZCwJImFuZCIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDI1LAlPX2FuZCwJImFuZCIsCUFERFJfRElSfSwKLQl7MHgyMywJT19hbmQsCSJhbmQiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4MzUsCU9fYW5kLAkiYW5kIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDBBLAlPX2FzbCwJImFzbCIsCUFERFJfQUNDfSwKLQl7MHgwRSwJT19hc2wsCSJhc2wiLAlBRERSX0FCU30sCi0JezB4MUUsCU9fYXNsLAkiYXNsIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDA2LAlPX2FzbCwJImFzbCIsCUFERFJfRElSfSwKLQl7MHgxNiwJT19hc2wsCSJhc2wiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OTAsCU9fYmNjLAkiYmNjIiwJQUREUl9QQ19SRUx9LAotCXsweEIwLAlPX2JjcywJImJjcyIsCUFERFJfUENfUkVMfSwKLQl7MHhGMCwJT19iZXEsCSJiZXEiLAlBRERSX1BDX1JFTH0sCi0JezB4ODksCU9fYml0LAkiYml0IiwJQUREUl9JTU1UT0F9LAotCXsweDI0LAlPX2JpdCwJImJpdCIsCUFERFJfRElSX0lORH0sCi0JezB4MzQsCU9fYml0LAkiYml0IiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgyQywJT19iaXQsCSJiaXQiLAlBRERSX0FCU30sCi0JezB4M0MsCU9fYml0LAkiYml0IiwJQUREUl9BQlNfSURYX1h9LAotCXsweDMwLAlPX2JtaSwJImJtaSIsCUFERFJfUENfUkVMfSwKLQl7MHhEMCwJT19ibmUsCSJibmUiLAlBRERSX1BDX1JFTH0sCi0JezB4MTAsCU9fYnBsLAkiYnBsIiwJQUREUl9QQ19SRUx9LAotCXsweDgwLAlPX2JyYSwJImJyYSIsCUFERFJfUENfUkVMfSwKLQl7MHgwMCwJT19icmssCSJicmsiLAlBRERSX1NUQUNLfSwKLQl7MHg4MiwJT19icmwsCSJicmwiLAlBRERSX1BDX1JFTF9MT05HfSwKLQl7MHg1MCwJT19idmMsCSJidmMiLAlBRERSX1BDX1JFTH0sCi0JezB4NzAsCU9fYnZzLAkiYnZzIiwJQUREUl9QQ19SRUx9LAotCXsweDE4LAlPX2NsYywJImNsYyIsCUFERFJfSU1QTElFRH0sCi0JezB4RDgsCU9fY2xkLAkiY2xkIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg1OCwJT19jbGksCSJjbGkiLAlBRERSX0lNUExJRUR9LAotCXsweEI4LAlPX2NsdiwJImNsdiIsCUFERFJfSU1QTElFRH0sCi0JezB4QzksCU9fY21wLAkiY21wIiwJQUREUl9JTU1UT0F9LAotCXsweEQyLAlPX2NtcCwJImNtcCIsCUFERFJfRElSX0lORH0sCi0JezB4RDEsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHhEMywJT19jbXAsCSJjbXAiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4QzEsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHhDNywJT19jbXAsCSJjbXAiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4RDcsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweENELAlPX2NtcCwJImNtcCIsCUFERFJfQUJTfSwKLQl7MHhERCwJT19jbXAsCSJjbXAiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4RDksCU9fY21wLAkiY21wIiwJQUREUl9BQlNfSURYX1l9LAotCXsweENGLAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0xPTkd9LAotCXsweERGLAlPX2NtcCwJImNtcCIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweEM1LAlPX2NtcCwJImNtcCIsCUFERFJfRElSfSwKLQl7MHhDMywJT19jbXAsCSJjbXAiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4RDUsCU9fY21wLAkiY21wIiwJQUREUl9ESVJfSURYX1h9LAotCXsweDAyLAlPX2NvcCwJImNvcCIsCUFERFJfSU1NQ09QfSwKLQl7MHhFMCwJT19jcHgsCSJjcHgiLAlBRERSX0lNTVRPSX0sCi0JezB4RUMsCU9fY3B4LAkiY3B4IiwJQUREUl9BQlN9LAotCXsweEU0LAlPX2NweCwJImNweCIsCUFERFJfRElSfSwKLQl7MHhDMCwJT19jcHksCSJjcHkiLAlBRERSX0lNTVRPSX0sCi0JezB4Q0MsCU9fY3B5LAkiY3B5IiwJQUREUl9BQlN9LAotCXsweEM0LAlPX2NweSwJImNweSIsCUFERFJfRElSfSwKLQl7MHgzQSwJT19kZWMsCSJkZWMiLAlBRERSX0FDQ30sCi0JezB4Q0UsCU9fZGVjLAkiZGVjIiwJQUREUl9BQlN9LAotCXsweERFLAlPX2RlYywJImRlYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhDNiwJT19kZWMsCSJkZWMiLAlBRERSX0RJUn0sCi0JezB4RDYsCU9fZGVjLAkiZGVjIiwJQUREUl9ESVJfSURYX1h9LAotCXsweENBLAlPX2RleCwJImRleCIsCUFERFJfSU1QTElFRH0sCi0JezB4ODgsCU9fZGV5LAkiZGV5IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg0OSwJT19lb3IsCSJlb3IiLAlBRERSX0lNTVRPQX0sCi0JezB4NTIsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJfSU5EfSwKLQl7MHg1MSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweDUzLAlPX2VvciwJImVvciIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHg0MSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweDQ3LAlPX2VvciwJImVvciIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHg1NywJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4NEQsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlN9LAotCXsweDVELAlPX2VvciwJImVvciIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg1OSwJT19lb3IsCSJlb3IiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4NEYsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfTE9OR30sCi0JezB4NUYsCU9fZW9yLAkiZW9yIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4NDUsCU9fZW9yLAkiZW9yIiwJQUREUl9ESVJ9LAotCXsweDQzLAlPX2VvciwJImVvciIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHg1NSwJT19lb3IsCSJlb3IiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MUEsCU9faW5jLAkiaW5jIiwJQUREUl9BQ0N9LAotCXsweEVFLAlPX2luYywJImluYyIsCUFERFJfQUJTfSwKLQl7MHhGRSwJT19pbmMsCSJpbmMiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4RTYsCU9faW5jLAkiaW5jIiwJQUREUl9ESVJ9LAotCXsweEY2LAlPX2luYywJImluYyIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHhFOCwJT19pbngsCSJpbngiLAlBRERSX0lNUExJRUR9LAotCXsweEM4LAlPX2lueSwJImlueSIsCUFERFJfSU1QTElFRH0sCi0JezB4NkMsCU9fam1wLAkiam1wIiwJQUREUl9BQlNfSU5EfSwKLQl7MHg3QywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkRfSURYfSwKLQl7MHhEQywJT19qbXAsCSJqbXAiLAlBRERSX0FCU19JTkRfTE9OR30sCi0JezB4NEMsCU9fam1wLAkiam1wIiwJQUREUl9BQlN9LAotCXsweDVDLAlPX2ptcCwJImptcCIsCUFERFJfQUJTX0xPTkd9LAotCXsweEZDLAlPX2pzciwJImpzciIsCUFERFJfQUJTX0lORF9JRFh9LAotCXsweDIwLAlPX2pzciwJImpzciIsCUFERFJfQUJTfSwKLQl7MHgyMiwJT19qc3IsCSJqc3IiLAlBRERSX0FCU19MT05HfSwKLQl7MHhBOSwJT19sZGEsCSJsZGEiLAlBRERSX0lNTVRPQX0sCi0JezB4QjIsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJfSU5EfSwKLQl7MHhCMSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweEIzLAlPX2xkYSwJImxkYSIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHhBMSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweEE3LAlPX2xkYSwJImxkYSIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHhCNywJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4QUQsCU9fbGRhLAkibGRhIiwJQUREUl9BQlN9LAotCXsweEJELAlPX2xkYSwJImxkYSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhCOSwJT19sZGEsCSJsZGEiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4QUYsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfTE9OR30sCi0JezB4QkYsCU9fbGRhLAkibGRhIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4QTUsCU9fbGRhLAkibGRhIiwJQUREUl9ESVJ9LAotCXsweEEzLAlPX2xkYSwJImxkYSIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHhCNSwJT19sZGEsCSJsZGEiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4QTIsCU9fbGR4LAkibGR4IiwJQUREUl9JTU1UT0l9LAotCXsweEFFLAlPX2xkeCwJImxkeCIsCUFERFJfQUJTfSwKLQl7MHhCRSwJT19sZHgsCSJsZHgiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4QTYsCU9fbGR4LAkibGR4IiwJQUREUl9ESVJ9LAotCXsweEI2LAlPX2xkeCwJImxkeCIsCUFERFJfRElSX0lEWF9ZfSwKLQl7MHhBMCwJT19sZHksCSJsZHkiLAlBRERSX0lNTVRPSX0sCi0JezB4QUMsCU9fbGR5LAkibGR5IiwJQUREUl9BQlN9LAotCXsweEJDLAlPX2xkeSwJImxkeSIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhBNCwJT19sZHksCSJsZHkiLAlBRERSX0RJUn0sCi0JezB4QjQsCU9fbGR5LAkibGR5IiwJQUREUl9ESVJfSURYX1h9LAotCXsweDRBLAlPX2xzciwJImxzciIsCUFERFJfQUNDfSwKLQl7MHg0RSwJT19sc3IsCSJsc3IiLAlBRERSX0FCU30sCi0JezB4NUUsCU9fbHNyLAkibHNyIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDQ2LAlPX2xzciwJImxzciIsCUFERFJfRElSfSwKLQl7MHg1NiwJT19sc3IsCSJsc3IiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NTQsCU9fbXZuLAkibXZuIiwJQUREUl9CTE9DS19NT1ZFfSwKLQl7MHg0NCwJT19tdnAsCSJtdnAiLAlBRERSX0JMT0NLX01PVkV9LAotCXsweEVBLAlPX25vcCwJIm5vcCIsCUFERFJfSU1QTElFRH0sCi0JezB4MDksCU9fb3JhLAkib3JhIiwJQUREUl9JTU1UT0F9LAotCXsweDEyLAlPX29yYSwJIm9yYSIsCUFERFJfRElSX0lORH0sCi0JezB4MTEsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHgxMywJT19vcmEsCSJvcmEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4MDEsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHgwNywJT19vcmEsCSJvcmEiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4MTcsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDBELAlPX29yYSwJIm9yYSIsCUFERFJfQUJTfSwKLQl7MHgxRCwJT19vcmEsCSJvcmEiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4MTksCU9fb3JhLAkib3JhIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDBGLAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0xPTkd9LAotCXsweDFGLAlPX29yYSwJIm9yYSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDA1LAlPX29yYSwJIm9yYSIsCUFERFJfRElSfSwKLQl7MHgwMywJT19vcmEsCSJvcmEiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4MTUsCU9fb3JhLAkib3JhIiwJQUREUl9ESVJfSURYX1h9LAotCXsweEY0LAlPX3BlYSwJInBlYSIsCUFERFJfQUJTfSwKLQl7MHhENCwJT19wZWksCSJwZWkiLAlBRERSX0RJUn0sCi0JezB4NjIsCU9fcGVyLAkicGVyIiwJQUREUl9QQ19SRUxfTE9OR30sCi0JezB4NDgsCU9fcGhhLAkicGhhIiwJQUREUl9TVEFDS30sCi0JezB4OEIsCU9fcGhiLAkicGhiIiwJQUREUl9TVEFDS30sCi0JezB4MEIsCU9fcGhkLAkicGhkIiwJQUREUl9TVEFDS30sCi0JezB4NEIsCU9fcGhrLAkicGhrIiwJQUREUl9TVEFDS30sCi0JezB4MDgsCU9fcGhwLAkicGhwIiwJQUREUl9TVEFDS30sCi0JezB4REEsCU9fcGh4LAkicGh4IiwJQUREUl9TVEFDS30sCi0JezB4NUEsCU9fcGh5LAkicGh5IiwJQUREUl9TVEFDS30sCi0JezB4NjgsCU9fcGxhLAkicGxhIiwJQUREUl9TVEFDS30sCi0JezB4QUIsCU9fcGxiLAkicGxiIiwJQUREUl9TVEFDS30sCi0JezB4MkIsCU9fcGxkLAkicGxkIiwJQUREUl9TVEFDS30sCi0JezB4MjgsCU9fcGxwLAkicGxwIiwJQUREUl9TVEFDS30sCi0JezB4RkEsCU9fcGx4LAkicGx4IiwJQUREUl9TVEFDS30sCi0JezB4N0EsCU9fcGx5LAkicGx5IiwJQUREUl9TVEFDS30sCi0JezB4QzIsCU9fcmVwLAkicmVwIiwJQUREUl9JTU1DT1B9LAotCXsweDJBLAlPX3JvbCwJInJvbCIsCUFERFJfQUNDfSwKLQl7MHgyRSwJT19yb2wsCSJyb2wiLAlBRERSX0FCU30sCi0JezB4M0UsCU9fcm9sLAkicm9sIiwJQUREUl9BQlNfSURYX1h9LAotCXsweDI2LAlPX3JvbCwJInJvbCIsCUFERFJfRElSfSwKLQl7MHgzNiwJT19yb2wsCSJyb2wiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4NkEsCU9fcm9yLAkicm9yIiwJQUREUl9BQ0N9LAotCXsweDZFLAlPX3JvciwJInJvciIsCUFERFJfQUJTfSwKLQl7MHg3RSwJT19yb3IsCSJyb3IiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4NjYsCU9fcm9yLAkicm9yIiwJQUREUl9ESVJ9LAotCXsweDc2LAlPX3JvciwJInJvciIsCUFERFJfRElSX0lEWF9YfSwKLQl7MHg0MCwJT19ydGksCSJydGkiLAlBRERSX1NUQUNLfSwKLQl7MHg2QiwJT19ydGwsCSJydGwiLAlBRERSX1NUQUNLfSwKLQl7MHg2MCwJT19ydHMsCSJydHMiLAlBRERSX1NUQUNLfSwKLQl7MHhFOSwJT19zYmMsCSJzYmMiLAlBRERSX0lNTVRPQX0sCi0JezB4RjIsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJfSU5EfSwKLQl7MHhGMSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfSURYX1l9LAotCXsweEYzLAlPX3NiYywJInNiYyIsCUFERFJfU1RBQ0tfUkVMX0lORFhfSURYfSwKLQl7MHhFMSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JRFhfSU5EX1h9LAotCXsweEU3LAlPX3NiYywJInNiYyIsCUFERFJfRElSX0lORF9MT05HfSwKLQl7MHhGNywJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JTkRfSURYX1lfTE9OR30sCi0JezB4RUQsCU9fc2JjLAkic2JjIiwJQUREUl9BQlN9LAotCXsweEZELAlPX3NiYywJInNiYyIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHhGOSwJT19zYmMsCSJzYmMiLAlBRERSX0FCU19JRFhfWX0sCi0JezB4RUYsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfTE9OR30sCi0JezB4RkYsCU9fc2JjLAkic2JjIiwJQUREUl9BQlNfTE9OR19JRFhfWH0sCi0JezB4RTUsCU9fc2JjLAkic2JjIiwJQUREUl9ESVJ9LAotCXsweEUzLAlPX3NiYywJInNiYyIsCUFERFJfU1RBQ0tfUkVMfSwKLQl7MHhGNSwJT19zYmMsCSJzYmMiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4MzgsCU9fc2VjLAkic2VjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhGOCwJT19zZWQsCSJzZWQiLAlBRERSX0lNUExJRUR9LAotCXsweDc4LAlPX3NlaSwJInNlaSIsCUFERFJfSU1QTElFRH0sCi0JezB4RTIsCU9fc2VwLAkic2VwIiwJQUREUl9JTU1DT1B9LAotCXsweDkyLAlPX3N0YSwJInN0YSIsCUFERFJfRElSX0lORH0sCi0JezB4OTEsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0lEWF9ZfSwKLQl7MHg5MywJT19zdGEsCSJzdGEiLAlBRERSX1NUQUNLX1JFTF9JTkRYX0lEWH0sCi0JezB4ODEsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSURYX0lORF9YfSwKLQl7MHg4NywJT19zdGEsCSJzdGEiLAlBRERSX0RJUl9JTkRfTE9OR30sCi0JezB4OTcsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkd9LAotCXsweDhELAlPX3N0YSwJInN0YSIsCUFERFJfQUJTfSwKLQl7MHg5RCwJT19zdGEsCSJzdGEiLAlBRERSX0FCU19JRFhfWH0sCi0JezB4OTksCU9fc3RhLAkic3RhIiwJQUREUl9BQlNfSURYX1l9LAotCXsweDhGLAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0xPTkd9LAotCXsweDlGLAlPX3N0YSwJInN0YSIsCUFERFJfQUJTX0xPTkdfSURYX1h9LAotCXsweDg1LAlPX3N0YSwJInN0YSIsCUFERFJfRElSfSwKLQl7MHg4MywJT19zdGEsCSJzdGEiLAlBRERSX1NUQUNLX1JFTH0sCi0JezB4OTUsCU9fc3RhLAkic3RhIiwJQUREUl9ESVJfSURYX1h9LAotCXsweERCLAlPX3N0cCwJInN0cCIsCUFERFJfSU1QTElFRH0sCi0JezB4OEUsCU9fc3R4LAkic3R4IiwJQUREUl9BQlN9LAotCXsweDg2LAlPX3N0eCwJInN0eCIsCUFERFJfRElSfSwKLQl7MHg5NiwJT19zdHgsCSJzdHgiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OEMsCU9fc3R5LAkic3R5IiwJQUREUl9BQlN9LAotCXsweDg0LAlPX3N0eSwJInN0eSIsCUFERFJfRElSfSwKLQl7MHg5NCwJT19zdHksCSJzdHkiLAlBRERSX0RJUl9JRFhfWH0sCi0JezB4OUMsCU9fc3R6LAkic3R6IiwJQUREUl9BQlN9LAotCXsweDlFLAlPX3N0eiwJInN0eiIsCUFERFJfQUJTX0lEWF9YfSwKLQl7MHg2NCwJT19zdHosCSJzdHoiLAlBRERSX0RJUn0sCi0JezB4NzQsCU9fc3R6LAkic3R6IiwJQUREUl9ESVJfSURYX1h9LAotCXsweEFBLAlPX3RheCwJInRheCIsCUFERFJfSU1QTElFRH0sCi0JezB4QTgsCU9fdGF5LAkidGF5IiwJQUREUl9JTVBMSUVEfSwKLQl7MHg1QiwJT190Y2QsCSJ0Y2QiLAlBRERSX0lNUExJRUR9LAotCXsweDFCLAlPX3RjcywJInRjcyIsCUFERFJfSU1QTElFRH0sCi0JezB4N0IsCU9fdGRjLAkidGRjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHgxQywJT190cmIsCSJ0cmIiLAlBRERSX0FCU30sCi0JezB4MTQsCU9fdHJiLAkidHJiIiwJQUREUl9ESVJ9LAotCXsweDBDLAlPX3RzYiwJInRzYiIsCUFERFJfQUJTfSwKLQl7MHgwNCwJT190c2IsCSJ0c2IiLAlBRERSX0RJUn0sCi0JezB4M0IsCU9fdHNjLAkidHNjIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhCQSwJT190c3gsCSJ0c3giLAlBRERSX0lNUExJRUR9LAotCXsweDhBLAlPX3R4YSwJInR4YSIsCUFERFJfSU1QTElFRH0sCi0JezB4OUEsCU9fdHhzLAkidHhzIiwJQUREUl9JTVBMSUVEfSwKLQl7MHg5QiwJT190eHksCSJ0eHkiLAlBRERSX0lNUExJRUR9LAotCXsweDk4LAlPX3R5YSwJInR5YSIsCUFERFJfSU1QTElFRH0sCi0JezB4QkIsCU9fdHl4LAkidHl4IiwJQUREUl9JTVBMSUVEfSwKLQl7MHhDQiwJT193YWksCSJ3YWkiLAlBRERSX0lNUExJRUR9LAotCXsweDQyLAlPX3dkbSwJIndkbSIsCUFERFJfSU1QTElFRH0sCi0JezB4RUIsCU9feGJhLAkieGJhIiwJQUREUl9JTVBMSUVEfSwKLQl7MHhGQiwJT194Y2UsCSJ4Y2UiLAlBRERSX0lNUExJRUR9LAotCXsgMCB9Ci19OwotI2VuZGlmCi0jZGVmaW5lIERJU0FTTSgpXAotICBjYXNlIEFERFJfSU1NVE9BOlwKLQlhcmdzWzBdID0gTT09MCA/IGFzUl9XNjVfQUJTMTYgOiBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJIyQwIiwgYXJncyk7XAotCXNpemUgKz0gTT09MCA/IDI6MTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfSU1NQ09QOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKLQlzaXplICs9IDE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0lNTVRPSTpcCi0JYXJnc1swXSA9IFg9PTAgPyBhc1JfVzY1X0FCUzE2IDogYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSMkMCIsIGFyZ3MpO1wKLQlzaXplICs9IFg9PTAgPyAyOjE7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FDQzpcCi0JcHJpbnRfb3BlcmFuZCAoMCwgIglhIiwgMCk7XAotCXNpemUgKz0gMDtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfUENfUkVMOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9QQ1I4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfUENfUkVMX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X1BDUjE2O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfSU1QTElFRDpcCi0JCXNpemUgKz0gMDtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfU1RBQ0s6XAotCQlzaXplICs9IDA7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0RJUjpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk8JDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJPCQwLHgiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSURYX1k6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJPCQwLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSg8JDApIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lEWF9JTkRfWDpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwLHgpIiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lORF9JRFhfWTpcCi0JYXJnc1swXSA9IGFzUl9XNjVfQUJTODtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoPCQwKSx5IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfRElSX0lORF9MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCVskMF0iLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9ESVJfSU5EX0lEWF9ZX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDEsICIJWyQwXSx5IiwgYXJncyk7XAotCXNpemUgKz0gMTtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAyO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSEkMCx4IiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lEWF9ZOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkhJDAseSIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0FCU19MT05HOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMyNDtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgk+JDAiLCBhcmdzKTtcCi0Jc2l6ZSArPSAzO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSU5EX0xPTkc6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCVs+JDBdIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0xPTkdfSURYX1g6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzI0O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCT4kMCx4IiwgYXJncyk7XAotCXNpemUgKz0gMztcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfU1RBQ0tfUkVMOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlM4O1wKLQlwcmludF9vcGVyYW5kICgwLCAiCSQwLHMiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9TVEFDS19SRUxfSU5EWF9JRFg6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzg7XAotCXByaW50X29wZXJhbmQgKDAsICIJKCQwLHMpLHkiLCBhcmdzKTtcCi0Jc2l6ZSArPSAxO1wKLQlicmVhaztcCi0gIGNhc2UgQUREUl9BQlNfSU5EOlwKLQlhcmdzWzBdID0gYXNSX1c2NV9BQlMxNjtcCi0JcHJpbnRfb3BlcmFuZCAoMSwgIgkoJDApIiwgYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotICBjYXNlIEFERFJfQUJTX0lORF9JRFg6XAotCWFyZ3NbMF0gPSBhc1JfVzY1X0FCUzE2O1wKLQlwcmludF9vcGVyYW5kICgxLCAiCSgkMCx4KSIsIGFyZ3MpO1wKLQlzaXplICs9IDI7XAotCWJyZWFrO1wKLSAgY2FzZSBBRERSX0JMT0NLX01PVkU6XAotCWFyZ3NbMF0gPSAoYXNSX1c2NV9BQlMxNiA+PjgpICYweGZmO1wKLQlhcmdzWzFdID0gKCBhc1JfVzY1X0FCUzE2ICYgMHhmZik7XAotCXByaW50X29wZXJhbmQgKDAsIgkkMCwkMSIsYXJncyk7XAotCXNpemUgKz0gMjtcCi0JYnJlYWs7XAotCi0jZGVmaW5lIEdFVElORk8oc2l6ZSx0eXBlLHBjcmVsKVwKLQljYXNlIEFERFJfSU1NVE9BOiBzaXplID0gTT09MCA/IDI6MTt0eXBlPU09PTAgPyBSX1c2NV9BQlMxNiA6IFJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0lNTUNPUDogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9JTU1UT0k6IHNpemUgPSBYPT0wID8gMjoxO3R5cGU9WD09MCA/IFJfVzY1X0FCUzE2IDogUl9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUNDOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9QQ19SRUw6IHNpemUgPSAxO3R5cGU9Ul9XNjVfUENSODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfUENfUkVMX0xPTkc6IHNpemUgPSAyO3R5cGU9Ul9XNjVfUENSMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0lNUExJRUQ6IHNpemUgPSAwO3R5cGU9LTE7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX1NUQUNLOiBzaXplID0gMDt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVI6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lEWF9YOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JRFhfWTogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0RJUl9JRFhfSU5EX1g6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lORF9JRFhfWTogc2l6ZSA9IDE7dHlwZT1SX1c2NV9BQlM4O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9ESVJfSU5EX0xPTkc6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfRElSX0lORF9JRFhfWV9MT05HOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCUzogc2l6ZSA9IDI7dHlwZT1SX1c2NV9BQlMxNjtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfQUJTX0lEWF9YOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSURYX1k6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19MT05HOiBzaXplID0gMzt0eXBlPVJfVzY1X0FCUzI0O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9BQlNfSU5EX0xPTkc6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19MT05HX0lEWF9YOiBzaXplID0gMzt0eXBlPVJfVzY1X0FCUzI0O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9TVEFDS19SRUw6IHNpemUgPSAxO3R5cGU9Ul9XNjVfQUJTODtwY3JlbD0wO2JyZWFrO1wKLQljYXNlIEFERFJfU1RBQ0tfUkVMX0lORFhfSURYOiBzaXplID0gMTt0eXBlPVJfVzY1X0FCUzg7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JTkQ6IHNpemUgPSAyO3R5cGU9Ul9XNjVfQUJTMTY7cGNyZWw9MDticmVhaztcCi0JY2FzZSBBRERSX0FCU19JTkRfSURYOiBzaXplID0gMjt0eXBlPVJfVzY1X0FCUzE2O3BjcmVsPTA7YnJlYWs7XAotCWNhc2UgQUREUl9CTE9DS19NT1ZFOiBzaXplID0gMjt0eXBlPS0xO3BjcmVsPTA7YnJlYWs7XAotCmRpZmYgLS1naXQgYS9vcGNvZGVzL3o4ay1kaXMuYyBiL29wY29kZXMvejhrLWRpcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTIzNjIyLi4wMDAwMDAwCi0tLSBhL29wY29kZXMvejhrLWRpcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc0ICswLDAgQEAKLS8qIERpc2Fzc2VtYmxlIHo4MDAwIGNvZGUuCi0gICBDb3B5cmlnaHQgMTk5MiwgMTk5MywgMTk5NSwgMTk5OCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLQotVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJpbnV0aWxzLgotCi1UaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0oYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi1UaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi1NRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLSNpbmNsdWRlICJkaXMtYXNtLmgiCi0KLSNkZWZpbmUgREVGSU5FX1RBQkxFCi0jaW5jbHVkZSAiejhrLW9wYy5oIgotCi0MCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0KLQwKLXR5cGVkZWYgc3RydWN0Ci17Ci0gIC8qIFRoZXNlIGFyZSBhbGwgaW5kZXhlZCBieSBuaWJibGUgbnVtYmVyIChpLmUgb25seSBldmVyeSBvdGhlciBlbnRyeQotICAgICBvZiBieXRlcyBpcyB1c2VkLCBhbmQgZXZlcnkgNHRoIGVudHJ5IG9mIHdvcmRzKS4gICovCi0gIHVuc2lnbmVkIGNoYXIgbmliYmxlc1syNF07Ci0gIHVuc2lnbmVkIGNoYXIgYnl0ZXNbMjRdOwotICB1bnNpZ25lZCBzaG9ydCB3b3Jkc1syNF07Ci0KLSAgLyogTmliYmxlIG51bWJlciBvZiBmaXJzdCB3b3JkIG5vdCB5ZXQgZmV0Y2hlZC4gICovCi0gIGludCBtYXhfZmV0Y2hlZDsKLSAgYmZkX3ZtYSBpbnNuX3N0YXJ0OwotICBqbXBfYnVmIGJhaWxvdXQ7Ci0KLSAgbG9uZyB0YWJsX2luZGV4OwotICBjaGFyIGluc3RyX2FzbXNyY1s4MF07Ci0gIHVuc2lnbmVkIGxvbmcgYXJnX3JlZ1sweDBmXTsKLSAgdW5zaWduZWQgbG9uZyBpbW1lZGlhdGU7Ci0gIHVuc2lnbmVkIGxvbmcgZGlzcGxhY2VtZW50OwotICB1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0gIHVuc2lnbmVkIGxvbmcgY29uZF9jb2RlOwotICB1bnNpZ25lZCBsb25nIGN0cmxfY29kZTsKLSAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgdW5zaWduZWQgbG9uZyBpbnRlcnJ1cHRzOwotfQotaW5zdHJfZGF0YV9zOwotCi0vKiBNYWtlIHN1cmUgdGhhdCBieXRlcyBmcm9tIElORk8tPlBSSVZBVEVfREFUQS0+QlVGRkVSIChpbmNsdXNpdmUpCi0gICB0byBBRERSIChleGNsdXNpdmUpIGFyZSB2YWxpZC4gIFJldHVybnMgMSBmb3Igc3VjY2VzcywgbG9uZ2ptcHMKLSAgIG9uIGVycm9yLiAgKi8KLSNkZWZpbmUgRkVUQ0hfREFUQShpbmZvLCBuaWJibGUpIFwKLSAgKChuaWJibGUpIDwgKChpbnN0cl9kYXRhX3MgKikoaW5mby0+cHJpdmF0ZV9kYXRhKSktPm1heF9mZXRjaGVkIFwKLSAgID8gMSA6IGZldGNoX2RhdGEgKChpbmZvKSwgKG5pYmJsZSkpKQotCi1zdGF0aWMgaW50Ci1mZXRjaF9kYXRhIChpbmZvLCBuaWJibGUpCi0gICAgIHN0cnVjdCBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotICAgICBpbnQgbmliYmxlOwotewotICB1bnNpZ25lZCBjaGFyIG15YnVmWzIwXTsKLSAgaW50IHN0YXR1czsKLSAgaW5zdHJfZGF0YV9zICpwcml2ID0gKGluc3RyX2RhdGFfcyAqKWluZm8tPnByaXZhdGVfZGF0YTsKLQotICBpZiAoKG5pYmJsZSAlIDQpICE9IDApCi0gICAgYWJvcnQgKCk7Ci0KLSAgc3RhdHVzID0gKCppbmZvLT5yZWFkX21lbW9yeV9mdW5jKSAocHJpdi0+aW5zbl9zdGFydCwKLQkJCQkgICAgICAoYmZkX2J5dGUgKikgbXlidWYsCi0JCQkJICAgICAgbmliYmxlIC8gMiwKLQkJCQkgICAgICBpbmZvKTsKLSAgaWYgKHN0YXR1cyAhPSAwKQotICAgIHsKLSAgICAgICgqaW5mby0+bWVtb3J5X2Vycm9yX2Z1bmMpIChzdGF0dXMsIHByaXYtPmluc25fc3RhcnQsIGluZm8pOwotICAgICAgbG9uZ2ptcCAocHJpdi0+YmFpbG91dCwgMSk7Ci0gICAgfQotCi0gIHsKLSAgICBpbnQgaTsKLSAgICB1bnNpZ25lZCBjaGFyICpwID0gbXlidWYgOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBuaWJibGU7KQotICAgICAgewotCXByaXYtPndvcmRzW2ldID0gKHBbMF0gPDwgOCkgfCBwWzFdOwotCQotCXByaXYtPmJ5dGVzW2ldID0gKnA7Ci0JcHJpdi0+bmliYmxlc1tpKytdID0gKnAgPj4gNDsKLQlwcml2LT5uaWJibGVzW2krK10gPSAqcCAmMHhmOwotCi0JKytwOwotCXByaXYtPmJ5dGVzW2ldID0gKnA7Ci0JcHJpdi0+bmliYmxlc1tpKytdID0gKnAgPj4gNDsKLQlwcml2LT5uaWJibGVzW2krK10gPSAqcCAmIDB4ZjsKLQotCSsrcDsKLSAgICAgIH0KLSAgfQotICBwcml2LT5tYXhfZmV0Y2hlZCA9IG5pYmJsZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBjaGFyICpjb2Rlc1sxNl0gPQotewotICAiZiIsCi0gICJsdCIsCi0gICJsZSIsCi0gICJ1bGUiLAotICAib3YvcGUiLAotICAibWkiLAotICAiZXEiLAotICAiYy91bHQiLAotICAidCIsCi0gICJnZSIsCi0gICJndCIsCi0gICJ1Z3QiLAotICAibm92L3BvIiwKLSAgInBsIiwKLSAgIm5lIiwKLSAgIm5jL3VnZSIKLX07Ci0KLWludCB6OGtfbG9va3VwX2luc3RyIFBBUkFNUyAoKHVuc2lnbmVkIGNoYXIqLCBkaXNhc3NlbWJsZV9pbmZvICopKTsKLXN0YXRpYyB2b2lkIG91dHB1dF9pbnN0cgotICBQQVJBTVMgKChpbnN0cl9kYXRhX3MgKiwgdW5zaWduZWQgbG9uZywgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCB1bnBhY2tfaW5zdHIgUEFSQU1TICgoaW5zdHJfZGF0YV9zICosIGludCwgZGlzYXNzZW1ibGVfaW5mbyAqKSk7Ci1zdGF0aWMgdm9pZCB1bnBhcnNlX2luc3RyIFBBUkFNUyAoKGluc3RyX2RhdGFfcyAqKSk7Ci0KLXN0YXRpYyBpbnQKLXByaW50X2luc25fejhrIChhZGRyLCBpbmZvLCBpc19zZWdtZW50ZWQpCi0gICAgIGJmZF92bWEgYWRkcjsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLSAgICAgaW50IGlzX3NlZ21lbnRlZDsKLXsKLSAgaW5zdHJfZGF0YV9zIGluc3RyX2RhdGE7Ci0KLSAgaW5mby0+cHJpdmF0ZV9kYXRhID0gKFBUUikgJmluc3RyX2RhdGE7Ci0gIGluc3RyX2RhdGEubWF4X2ZldGNoZWQgPSAwOwotICBpbnN0cl9kYXRhLmluc25fc3RhcnQgPSBhZGRyOwotICBpZiAoc2V0am1wIChpbnN0cl9kYXRhLmJhaWxvdXQpICE9IDApCi0gICAgLyogRXJyb3IgcmV0dXJuLiAgKi8KLSAgICByZXR1cm4gLTE7Ci0KLSAgaW5zdHJfZGF0YS50YWJsX2luZGV4ID0gejhrX2xvb2t1cF9pbnN0ciAoaW5zdHJfZGF0YS5uaWJibGVzLCBpbmZvKTsKLSAgaWYgKGluc3RyX2RhdGEudGFibF9pbmRleCA+IDApCi0gICAgewotICAgICAgdW5wYWNrX2luc3RyICgmaW5zdHJfZGF0YSwgaXNfc2VnbWVudGVkLCBpbmZvKTsKLSAgICAgIHVucGFyc2VfaW5zdHIgKCZpbnN0cl9kYXRhKTsKLSAgICAgIG91dHB1dF9pbnN0ciAoJmluc3RyX2RhdGEsIGFkZHIsIGluZm8pOwotICAgICAgcmV0dXJuIHo4a190YWJsZVtpbnN0cl9kYXRhLnRhYmxfaW5kZXhdLmxlbmd0aDsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCA0KTsKLSAgICAgICgqaW5mby0+ZnByaW50Zl9mdW5jKSAoaW5mby0+c3RyZWFtLCAiLndvcmQgJTAyeCUwMngiLAotCQkJICAgICBpbnN0cl9kYXRhLmJ5dGVzWzBdLCBpbnN0cl9kYXRhLmJ5dGVzWzJdKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLX0KLQotaW50Ci1wcmludF9pbnNuX3o4MDAxIChhZGRyLCBpbmZvKQotICAgICBiZmRfdm1hIGFkZHI7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0gIHJldHVybiBwcmludF9pbnNuX3o4ayAoYWRkciwgaW5mbywgMSk7Ci19Ci0KLWludAotcHJpbnRfaW5zbl96ODAwMiAoYWRkciwgaW5mbykKLSAgICAgYmZkX3ZtYSBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICByZXR1cm4gcHJpbnRfaW5zbl96OGsgKGFkZHIsIGluZm8sIDApOwotfQotCi1pbnQKLXo4a19sb29rdXBfaW5zdHIgKG5pYmJsZXMsIGluZm8pCi0gICAgIHVuc2lnbmVkIGNoYXIgKm5pYmJsZXM7Ci0gICAgIGRpc2Fzc2VtYmxlX2luZm8gKmluZm87Ci17Ci0KLSAgaW50IG5pYmxfaW5kZXgsIHRhYmxfaW5kZXg7Ci0gIGludCBuaWJsX21hdGNoZWQ7Ci0gIHVuc2lnbmVkIHNob3J0IGluc3RyX25pYmw7Ci0gIHVuc2lnbmVkIHNob3J0IHRhYmxfZGF0dW0sIGRhdHVtX2NsYXNzLCBkYXR1bV92YWx1ZTsKLQotICBuaWJsX21hdGNoZWQgPSAwOwotICB0YWJsX2luZGV4ID0gMDsKLSAgd2hpbGUgKCFuaWJsX21hdGNoZWQgJiYgejhrX3RhYmxlW3RhYmxfaW5kZXhdLm5hbWUpCi0gICAgewotICAgICAgbmlibF9tYXRjaGVkID0gMTsKLSAgICAgIGZvciAobmlibF9pbmRleCA9IDA7IG5pYmxfaW5kZXggPCB6OGtfdGFibGVbdGFibF9pbmRleF0ubGVuZ3RoICogMiAmJiBuaWJsX21hdGNoZWQ7IG5pYmxfaW5kZXgrKykKLQl7Ci0JICBpZiAoKG5pYmxfaW5kZXggJSA0KSA9PSAwKQotCSAgICAvKiBGZXRjaCBvbmUgd29yZCBhdCBhIHRpbWUuICAqLwotCSAgICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2luZGV4ICsgNCk7Ci0JICBpbnN0cl9uaWJsID0gbmliYmxlc1tuaWJsX2luZGV4XTsKLQotCSAgdGFibF9kYXR1bSA9IHo4a190YWJsZVt0YWJsX2luZGV4XS5ieXRlX2luZm9bbmlibF9pbmRleF07Ci0JICBkYXR1bV9jbGFzcyA9IHRhYmxfZGF0dW0gJiBDTEFTU19NQVNLOwotCSAgZGF0dW1fdmFsdWUgPSB+Q0xBU1NfTUFTSyAmIHRhYmxfZGF0dW07Ci0KLQkgIHN3aXRjaCAoZGF0dW1fY2xhc3MpCi0JICAgIHsKLQkgICAgY2FzZSBDTEFTU19CSVQ6Ci0JICAgICAgaWYgKGRhdHVtX3ZhbHVlICE9IGluc3RyX25pYmwpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMDBJSToKLQkgICAgICBpZiAoISgofmluc3RyX25pYmwpICYgMHg0KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18wMUlJOgotCSAgICAgIGlmICghKGluc3RyX25pYmwgJiAweDQpKQotCQluaWJsX21hdGNoZWQgPSAwOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzBDQ0M6Ci0JICAgICAgaWYgKCEoKH5pbnN0cl9uaWJsKSAmIDB4OCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfMUNDQzoKLQkgICAgICBpZiAoIShpbnN0cl9uaWJsICYgMHg4KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU18wRElTUDc6Ci0JICAgICAgaWYgKCEoKH5pbnN0cl9uaWJsKSAmIDB4OCkpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgbmlibF9pbmRleCArPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIENMQVNTXzFESVNQNzoKLQkgICAgICBpZiAoIShpbnN0cl9uaWJsICYgMHg4KSkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBuaWJsX2luZGV4ICs9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQ0xBU1NfUkVHTjA6Ci0JICAgICAgaWYgKGluc3RyX25pYmwgPT0gMCkKLQkJbmlibF9tYXRjaGVkID0gMDsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBDTEFTU19CSVRfMU9SMjoKLQkgICAgICBpZiAoKGluc3RyX25pYmwgfCAweDIpICE9IChkYXR1bV92YWx1ZSB8IDB4MikpCi0JCW5pYmxfbWF0Y2hlZCA9IDA7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQl9Ci0gICAgICBpZiAobmlibF9tYXRjaGVkKQotCXsKLQkgIHJldHVybiB0YWJsX2luZGV4OwotCX0KLQotICAgICAgdGFibF9pbmRleCsrOwotICAgIH0KLSAgcmV0dXJuIC0xOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1vdXRwdXRfaW5zdHIgKGluc3RyX2RhdGEsIGFkZHIsIGluZm8pCi0gICAgIGluc3RyX2RhdGFfcyAqaW5zdHJfZGF0YTsKLSAgICAgdW5zaWduZWQgbG9uZyBhZGRyOwotICAgICBkaXNhc3NlbWJsZV9pbmZvICppbmZvOwotewotICBpbnQgbG9vcCwgbG9vcF9saW1pdDsKLSAgY2hhciB0bXBfc3RyWzIwXTsKLSAgY2hhciBvdXRfc3RyWzEwMF07Ci0KLSAgc3RyY3B5IChvdXRfc3RyLCAiXHQiKTsKLQotICBsb29wX2xpbWl0ID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmxlbmd0aCAqIDI7Ci0gIEZFVENIX0RBVEEgKGluZm8sIGxvb3BfbGltaXQpOwotICBmb3IgKGxvb3AgPSAwOyBsb29wIDwgbG9vcF9saW1pdDsgbG9vcCsrKQotICAgIHsKLSAgICAgIHNwcmludGYgKHRtcF9zdHIsICIleCIsIGluc3RyX2RhdGEtPm5pYmJsZXNbbG9vcF0pOwotICAgICAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLSAgICB9Ci0KLSAgd2hpbGUgKGxvb3ArKyA8IDgpCi0gICAgewotICAgICAgc3RyY2F0IChvdXRfc3RyLCAiICIpOwotICAgIH0KLQotICBzdHJjYXQgKG91dF9zdHIsIGluc3RyX2RhdGEtPmluc3RyX2FzbXNyYyk7Ci0KLSAgKCppbmZvLT5mcHJpbnRmX2Z1bmMpIChpbmZvLT5zdHJlYW0sICIlcyIsIG91dF9zdHIpOwotfQotCi1zdGF0aWMgdm9pZAotdW5wYWNrX2luc3RyIChpbnN0cl9kYXRhLCBpc19zZWdtZW50ZWQsIGluZm8pCi0gICAgIGluc3RyX2RhdGFfcyAqaW5zdHJfZGF0YTsKLSAgICAgaW50IGlzX3NlZ21lbnRlZDsKLSAgICAgZGlzYXNzZW1ibGVfaW5mbyAqaW5mbzsKLXsKLSAgaW50IG5pYmxfY291bnQsIGxvb3A7Ci0gIHVuc2lnbmVkIHNob3J0IGluc3RyX25pYmwsIGluc3RyX2J5dGUsIGluc3RyX3dvcmQ7Ci0gIGxvbmcgaW5zdHJfbG9uZzsKLSAgdW5zaWduZWQgc2hvcnQgdGFibF9kYXR1bSwgZGF0dW1fY2xhc3MsIGRhdHVtX3ZhbHVlOwotCi0gIG5pYmxfY291bnQgPSAwOwotICBsb29wID0gMDsKLSAgd2hpbGUgKHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5ieXRlX2luZm9bbG9vcF0gIT0gMCkKLSAgICB7Ci0gICAgICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2NvdW50ICsgNCAtIChuaWJsX2NvdW50ICUgNCkpOwotICAgICAgaW5zdHJfbmlibCA9IGluc3RyX2RhdGEtPm5pYmJsZXNbbmlibF9jb3VudF07Ci0gICAgICBpbnN0cl9ieXRlID0gaW5zdHJfZGF0YS0+Ynl0ZXNbbmlibF9jb3VudF07Ci0gICAgICBpbnN0cl93b3JkID0gaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudF07Ci0KLSAgICAgIHRhYmxfZGF0dW0gPSB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0uYnl0ZV9pbmZvW2xvb3BdOwotICAgICAgZGF0dW1fY2xhc3MgPSB0YWJsX2RhdHVtICYgQ0xBU1NfTUFTSzsKLSAgICAgIGRhdHVtX3ZhbHVlID0gdGFibF9kYXR1bSAmIH5DTEFTU19NQVNLOwotCi0gICAgICBzd2l0Y2ggKGRhdHVtX2NsYXNzKQotCXsKLQljYXNlIENMQVNTX1g6Ci0JICBpbnN0cl9kYXRhLT5hZGRyZXNzID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQkE6Ci0JICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19CWDoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRElTUDoKLQkgIHN3aXRjaCAoZGF0dW1fdmFsdWUpCi0JICAgIHsKLQkgICAgY2FzZSBBUkdfRElTUDE2OgotCSAgICAgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX3dvcmQ7Ci0JICAgICAgbmlibF9jb3VudCArPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19ESVNQMTI6Ci0JICAgICAgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50ID0gaW5zdHJfd29yZCAmIDB4MGZmZjsKLQkgICAgICBuaWJsX2NvdW50ICs9IDI7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSU1NOgotCSAgc3dpdGNoIChkYXR1bV92YWx1ZSkKLQkgICAgewotCSAgICBjYXNlIEFSR19JTU00OgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmw7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX05JTTg6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gKC1pbnN0cl9ieXRlKTsKLQkgICAgICBuaWJsX2NvdW50ICs9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTg6Ci0JICAgICAgaW5zdHJfZGF0YS0+aW1tZWRpYXRlID0gaW5zdHJfYnl0ZTsKLQkgICAgICBuaWJsX2NvdW50ICs9IDE7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGNhc2UgQVJHX0lNTTE2OgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX3dvcmQ7Ci0JICAgICAgbmlibF9jb3VudCArPSAzOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU0zMjoKLQkgICAgICBGRVRDSF9EQVRBIChpbmZvLCBuaWJsX2NvdW50ICsgOCk7Ci0JICAgICAgaW5zdHJfbG9uZyA9IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50XSA8PCAxNikKLQkJfCAoaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudCArIDRdKTsKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9sb25nOwotCSAgICAgIG5pYmxfY291bnQgKz0gNzsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NTjoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSBpbnN0cl9uaWJsIC0gMTsKLQkgICAgICBicmVhazsKLQkgICAgY2FzZSBBUkdfSU1NNE0xOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmwgKyAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU1fMToKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSAxOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU1fMjoKLQkgICAgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUgPSAyOwotCSAgICAgIGJyZWFrOwotCSAgICBjYXNlIEFSR19JTU0yOgotCSAgICAgIGluc3RyX2RhdGEtPmltbWVkaWF0ZSA9IGluc3RyX25pYmwgJiAweDM7Ci0JICAgICAgYnJlYWs7Ci0JICAgIGRlZmF1bHQ6Ci0JICAgICAgYnJlYWs7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQ0M6Ci0JICBpbnN0cl9kYXRhLT5jb25kX2NvZGUgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DVFJMOgotCSAgaW5zdHJfZGF0YS0+Y3RybF9jb2RlID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfREE6Ci0JY2FzZSBDTEFTU19BRERSRVNTOgotCSAgaWYgKGlzX3NlZ21lbnRlZCkKLQkgICAgewotCSAgICAgIGlmIChpbnN0cl9uaWJsICYgMHg4KQotCQl7Ci0JCSAgRkVUQ0hfREFUQSAoaW5mbywgbmlibF9jb3VudCArIDgpOwotCQkgIGluc3RyX2xvbmcgPSAoaW5zdHJfZGF0YS0+d29yZHNbbmlibF9jb3VudF0gPDwgMTYpCi0JCSAgICB8IChpbnN0cl9kYXRhLT53b3Jkc1tuaWJsX2NvdW50ICsgNF0pOwotCQkgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSAoKGluc3RyX3dvcmQgJiAweDdmMDApIDw8IDgpICsKLQkJICAgIChpbnN0cl9sb25nICYgMHhmZmZmKTsKLQkJICBuaWJsX2NvdW50ICs9IDc7Ci0JCX0KLQkgICAgICBlbHNlCi0JCXsKLQkJICBpbnN0cl9kYXRhLT5hZGRyZXNzID0gKChpbnN0cl93b3JkICYgMHg3ZjAwKSA8PCA4KSArCi0JCSAgICAoaW5zdHJfd29yZCAmIDB4MDBmZik7Ci0JCSAgbmlibF9jb3VudCArPSAzOwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGluc3RyX2RhdGEtPmFkZHJlc3MgPSBpbnN0cl93b3JkOwotCSAgICAgIG5pYmxfY291bnQgKz0gMzsKLQkgICAgfQotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wQ0NDOgotCSAgaW5zdHJfZGF0YS0+Y29uZF9jb2RlID0gaW5zdHJfbmlibCAmIDB4NzsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMUNDQzoKLQkgIGluc3RyX2RhdGEtPmNvbmRfY29kZSA9IGluc3RyX25pYmwgJiAweDc7Ci0JICBicmVhazsKLQljYXNlIENMQVNTXzBESVNQNzoKLQkgIGluc3RyX2RhdGEtPmRpc3BsYWNlbWVudCA9IGluc3RyX2J5dGUgJiAweDdmOwotCSAgbmlibF9jb3VudCArPSAxOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18xRElTUDc6Ci0JICBpbnN0cl9kYXRhLT5kaXNwbGFjZW1lbnQgPSBpbnN0cl9ieXRlICYgMHg3ZjsKLQkgIG5pYmxfY291bnQgKz0gMTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfMDFJSToKLQkgIGluc3RyX2RhdGEtPmludGVycnVwdHMgPSBpbnN0cl9uaWJsICYgMHgzOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU18wMElJOgotCSAgaW5zdHJfZGF0YS0+aW50ZXJydXB0cyA9IGluc3RyX25pYmwgJiAweDM7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0JJVDoKLQkgIC8qIGRvIG5vdGhpbmcgKi8KLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSVI6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0ZMQUdTOgotCSAgaW5zdHJfZGF0YS0+ZmxhZ3MgPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUc6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19CWVRFOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfV09SRDoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfUkVHX1FVQUQ6Ci0JICBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA9IGluc3RyX25pYmw7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19MT05HOgotCSAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gPSBpbnN0cl9uaWJsOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdOMDoKLQkgIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdID0gaW5zdHJfbmlibDsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0KLSAgICAgIGxvb3AgKz0gMTsKLSAgICAgIG5pYmxfY291bnQgKz0gMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkCi11bnBhcnNlX2luc3RyIChpbnN0cl9kYXRhKQotICAgICBpbnN0cl9kYXRhX3MgKmluc3RyX2RhdGE7Ci17Ci0gIHVuc2lnbmVkIHNob3J0IHRhYmxfZGF0dW0sIGRhdHVtX2NsYXNzLCBkYXR1bV92YWx1ZTsKLSAgaW50IGxvb3AsIGxvb3BfbGltaXQ7Ci0gIGNoYXIgb3V0X3N0cls4MF0sIHRtcF9zdHJbMjVdOwotCi0gIHNwcmludGYgKG91dF9zdHIsICJcdCVzXHQiLCB6OGtfdGFibGVbaW5zdHJfZGF0YS0+dGFibF9pbmRleF0ubmFtZSk7Ci0KLSAgbG9vcF9saW1pdCA9IHo4a190YWJsZVtpbnN0cl9kYXRhLT50YWJsX2luZGV4XS5ub3BlcmFuZHM7Ci0gIGZvciAobG9vcCA9IDA7IGxvb3AgPCBsb29wX2xpbWl0OyBsb29wKyspCi0gICAgewotICAgICAgaWYgKGxvb3ApCi0Jc3RyY2F0IChvdXRfc3RyLCAiLCIpOwotCi0gICAgICB0YWJsX2RhdHVtID0gejhrX3RhYmxlW2luc3RyX2RhdGEtPnRhYmxfaW5kZXhdLmFyZ19pbmZvW2xvb3BdOwotICAgICAgZGF0dW1fY2xhc3MgPSB0YWJsX2RhdHVtICYgQ0xBU1NfTUFTSzsKLSAgICAgIGRhdHVtX3ZhbHVlID0gdGFibF9kYXR1bSAmIH5DTEFTU19NQVNLOwotCi0gICAgICBzd2l0Y2ggKGRhdHVtX2NsYXNzKQotCXsKLQljYXNlIENMQVNTX1g6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiMHglMGx4KFIlbGQpIiwgaW5zdHJfZGF0YS0+YWRkcmVzcywKLQkJICAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQkE6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiciVsZCgjJWx4KSIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdLAotCQkgICBpbnN0cl9kYXRhLT5pbW1lZGlhdGUpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfQlg6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiciVsZChSJWxkKSIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdLAotCQkgICBpbnN0cl9kYXRhLT5hcmdfcmVnW0FSR19SWF0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfRElTUDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIjMHglMGx4IiwgaW5zdHJfZGF0YS0+ZGlzcGxhY2VtZW50KTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0lNTToKLQkgIHNwcmludGYgKHRtcF9zdHIsICIjMHglMGx4IiwgaW5zdHJfZGF0YS0+aW1tZWRpYXRlKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX0NDOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIiVzIiwgY29kZXNbaW5zdHJfZGF0YS0+Y29uZF9jb2RlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19DVFJMOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgIjB4JTBseCIsIGluc3RyX2RhdGEtPmN0cmxfY29kZSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19EQToKLQljYXNlIENMQVNTX0FERFJFU1M6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiIzB4JTBseCIsIGluc3RyX2RhdGEtPmFkZHJlc3MpOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWNhc2UgQ0xBU1NfSVI6Ci0JICBzcHJpbnRmICh0bXBfc3RyLCAiQFIlbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19GTEFHUzoKLQkgIHNwcmludGYgKHRtcF9zdHIsICIweCUwbHgiLCBpbnN0cl9kYXRhLT5mbGFncyk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfQllURToKLQkgIGlmIChpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSA+PSAweDgpCi0JICAgIHsKLQkgICAgICBzcHJpbnRmICh0bXBfc3RyLCAicmwlbGQiLAotCQkgICAgICAgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0gLSAweDgpOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBzcHJpbnRmICh0bXBfc3RyLCAicmglbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICAgIH0KLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19XT1JEOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInIlbGQiLCBpbnN0cl9kYXRhLT5hcmdfcmVnW2RhdHVtX3ZhbHVlXSk7Ci0JICBzdHJjYXQgKG91dF9zdHIsIHRtcF9zdHIpOwotCSAgYnJlYWs7Ci0JY2FzZSBDTEFTU19SRUdfUVVBRDoKLQkgIHNwcmludGYgKHRtcF9zdHIsICJycSVsZCIsIGluc3RyX2RhdGEtPmFyZ19yZWdbZGF0dW1fdmFsdWVdKTsKLQkgIHN0cmNhdCAob3V0X3N0ciwgdG1wX3N0cik7Ci0JICBicmVhazsKLQljYXNlIENMQVNTX1JFR19MT05HOgotCSAgc3ByaW50ZiAodG1wX3N0ciwgInJyJWxkIiwgaW5zdHJfZGF0YS0+YXJnX3JlZ1tkYXR1bV92YWx1ZV0pOwotCSAgc3RyY2F0IChvdXRfc3RyLCB0bXBfc3RyKTsKLQkgIGJyZWFrOwotCWRlZmF1bHQ6Ci0JICBicmVhazsKLQl9Ci0gICAgfQotCi0gIHN0cmNweSAoaW5zdHJfZGF0YS0+aW5zdHJfYXNtc3JjLCBvdXRfc3RyKTsKLX0KZGlmZiAtLWdpdCBhL29wY29kZXMvejhrLW9wYy5oIGIvb3Bjb2Rlcy96OGstb3BjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWEzYTMuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy96OGstb3BjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NDM4ICswLDAgQEAKLQkJCS8qIFRISVMgRklMRSBJUyBBVVRPTUFHSUNBTExZIEdFTkVSQVRFRCwgRE9OJ1QgRURJVCBJVCAqLwotI2RlZmluZSBBUkdfTUFTSyAweDBmCi0jZGVmaW5lIEFSR19TUkMgMHgwMQotI2RlZmluZSBBUkdfRFNUIDB4MDIKLSNkZWZpbmUgQVJHX1JTIDB4MDEKLSNkZWZpbmUgQVJHX1JEIDB4MDIKLSNkZWZpbmUgQVJHX1JBIDB4MDMKLSNkZWZpbmUgQVJHX1JCIDB4MDQKLSNkZWZpbmUgQVJHX1JSIDB4MDUKLSNkZWZpbmUgQVJHX1JYIDB4MDYKLSNkZWZpbmUgQVJHX0lNTTQgMHgwMQotI2RlZmluZSBBUkdfSU1NOCAweDAyCi0jZGVmaW5lIEFSR19JTU0xNiAweDAzCi0jZGVmaW5lIEFSR19JTU0zMiAweDA0Ci0jZGVmaW5lIEFSR19JTU1OIDB4MDUKLSNkZWZpbmUgQVJHX0lNTU5NSU5VUzEgMHgwNQotI2RlZmluZSBBUkdfSU1NXzEgMHgwNgotI2RlZmluZSBBUkdfSU1NXzIgMHgwNwotI2RlZmluZSBBUkdfRElTUDE2IDB4MDgKLSNkZWZpbmUgQVJHX05JTTggMHgwOQotI2RlZmluZSBBUkdfSU1NMiAweDBhCi0jZGVmaW5lIEFSR19JTU0xT1IyIDB4MGIKLSNkZWZpbmUgQVJHX0RJU1AxMiAweDBiCi0jZGVmaW5lIEFSR19ESVNQOCAweDBjCi0jZGVmaW5lIEFSR19JTU00TTEgMHgwZAotI2RlZmluZSBDTEFTU19NQVNLIDB4MWZmZjAKLSNkZWZpbmUgQ0xBU1NfWCAweDEwCi0jZGVmaW5lIENMQVNTX0JBIDB4MjAKLSNkZWZpbmUgQ0xBU1NfREEgMHgzMAotI2RlZmluZSBDTEFTU19CWCAweDQwCi0jZGVmaW5lIENMQVNTX0RJU1AgMHg1MAotI2RlZmluZSBDTEFTU19JTU0gMHg2MAotI2RlZmluZSBDTEFTU19DQyAweDcwCi0jZGVmaW5lIENMQVNTX0NUUkwgMHg4MAotI2RlZmluZSBDTEFTU19BRERSRVNTIDB4ZDAKLSNkZWZpbmUgQ0xBU1NfMENDQyAweGUwCi0jZGVmaW5lIENMQVNTXzFDQ0MgMHhmMAotI2RlZmluZSBDTEFTU18wRElTUDcgMHgxMDAKLSNkZWZpbmUgQ0xBU1NfMURJU1A3IDB4MjAwCi0jZGVmaW5lIENMQVNTXzAxSUkgMHgzMDAKLSNkZWZpbmUgQ0xBU1NfMDBJSSAweDQwMAotI2RlZmluZSBDTEFTU19CSVQgMHg1MDAKLSNkZWZpbmUgQ0xBU1NfRkxBR1MgMHg2MDAKLSNkZWZpbmUgQ0xBU1NfSVIgMHg3MDAKLSNkZWZpbmUgQ0xBU1NfRElTUDggMHg4MDAKLSNkZWZpbmUgQ0xBU1NfQklUXzFPUjIgMHg5MDAKLSNkZWZpbmUgQ0xBU1NfUkVHIDB4NzAwMAotI2RlZmluZSBDTEFTU19SRUdfQllURSAweDIwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHX1dPUkQgMHgzMDAwCi0jZGVmaW5lIENMQVNTX1JFR19RVUFEIDB4NDAwMAotI2RlZmluZSBDTEFTU19SRUdfTE9ORyAweDUwMDAKLSNkZWZpbmUgQ0xBU1NfUkVHTjAgMHg4MDAwCi0jZGVmaW5lIENMQVNTX1BSIDB4MTAwMDAKLSNkZWZpbmUgT1BDX2FkYyAwCi0jZGVmaW5lIE9QQ19hZGNiIDEKLSNkZWZpbmUgT1BDX2FkZCAyCi0jZGVmaW5lIE9QQ19hZGRiIDMKLSNkZWZpbmUgT1BDX2FkZGwgNAotI2RlZmluZSBPUENfYW5kIDUKLSNkZWZpbmUgT1BDX2FuZGIgNgotI2RlZmluZSBPUENfYml0IDcKLSNkZWZpbmUgT1BDX2JpdGIgOAotI2RlZmluZSBPUENfY2FsbCA5Ci0jZGVmaW5lIE9QQ19jYWxyIDEwCi0jZGVmaW5lIE9QQ19jbHIgMTEKLSNkZWZpbmUgT1BDX2NscmIgMTIKLSNkZWZpbmUgT1BDX2NvbSAxMwotI2RlZmluZSBPUENfY29tYiAxNAotI2RlZmluZSBPUENfY29tZmxnIDE1Ci0jZGVmaW5lIE9QQ19jcCAxNgotI2RlZmluZSBPUENfY3BiIDE3Ci0jZGVmaW5lIE9QQ19jcGQgMTgKLSNkZWZpbmUgT1BDX2NwZGIgMTkKLSNkZWZpbmUgT1BDX2NwZHIgMjAKLSNkZWZpbmUgT1BDX2NwZHJiIDIxCi0jZGVmaW5lIE9QQ19jcGkgMjIKLSNkZWZpbmUgT1BDX2NwaWIgMjMKLSNkZWZpbmUgT1BDX2NwaXIgMjQKLSNkZWZpbmUgT1BDX2NwaXJiIDI1Ci0jZGVmaW5lIE9QQ19jcGwgMjYKLSNkZWZpbmUgT1BDX2Nwc2QgMjcKLSNkZWZpbmUgT1BDX2Nwc2RiIDI4Ci0jZGVmaW5lIE9QQ19jcHNkciAyOQotI2RlZmluZSBPUENfY3BzZHJiIDMwCi0jZGVmaW5lIE9QQ19jcHNpIDMxCi0jZGVmaW5lIE9QQ19jcHNpYiAzMgotI2RlZmluZSBPUENfY3BzaXIgMzMKLSNkZWZpbmUgT1BDX2Nwc2lyYiAzNAotI2RlZmluZSBPUENfZGFiIDM1Ci0jZGVmaW5lIE9QQ19kYmpueiAzNgotI2RlZmluZSBPUENfZGVjIDM3Ci0jZGVmaW5lIE9QQ19kZWNiIDM4Ci0jZGVmaW5lIE9QQ19kaSAzOQotI2RlZmluZSBPUENfZGl2IDQwCi0jZGVmaW5lIE9QQ19kaXZsIDQxCi0jZGVmaW5lIE9QQ19kam56IDQyCi0jZGVmaW5lIE9QQ19laSA0MwotI2RlZmluZSBPUENfZXggNDQKLSNkZWZpbmUgT1BDX2V4YiA0NQotI2RlZmluZSBPUENfZXh0cyA0NgotI2RlZmluZSBPUENfZXh0c2IgNDcKLSNkZWZpbmUgT1BDX2V4dHNsIDQ4Ci0jZGVmaW5lIE9QQ19oYWx0IDQ5Ci0jZGVmaW5lIE9QQ19pbiA1MAotI2RlZmluZSBPUENfaW5iIDUxCi0jZGVmaW5lIE9QQ19pbmMgNTIKLSNkZWZpbmUgT1BDX2luY2IgNTMKLSNkZWZpbmUgT1BDX2luZCA1NAotI2RlZmluZSBPUENfaW5kYiA1NQotI2RlZmluZSBPUENfaW5pYiA1NgotI2RlZmluZSBPUENfaW5pYnIgNTcKLSNkZWZpbmUgT1BDX2lyZXQgNTgKLSNkZWZpbmUgT1BDX2pwIDU5Ci0jZGVmaW5lIE9QQ19qciA2MAotI2RlZmluZSBPUENfbGQgNjEKLSNkZWZpbmUgT1BDX2xkYSA2MgotI2RlZmluZSBPUENfbGRhciA2MwotI2RlZmluZSBPUENfbGRiIDY0Ci0jZGVmaW5lIE9QQ19sZGN0bCA2NQotI2RlZmluZSBPUENfbGRpciA2NgotI2RlZmluZSBPUENfbGRpcmIgNjcKLSNkZWZpbmUgT1BDX2xkayA2OAotI2RlZmluZSBPUENfbGRsIDY5Ci0jZGVmaW5lIE9QQ19sZG0gNzAKLSNkZWZpbmUgT1BDX2xkcHMgNzEKLSNkZWZpbmUgT1BDX2xkciA3MgotI2RlZmluZSBPUENfbGRyYiA3MwotI2RlZmluZSBPUENfbGRybCA3NAotI2RlZmluZSBPUENfbWJpdCA3NQotI2RlZmluZSBPUENfbXJlcSA3NgotI2RlZmluZSBPUENfbXJlcyA3NwotI2RlZmluZSBPUENfbXNldCA3OAotI2RlZmluZSBPUENfbXVsdCA3OQotI2RlZmluZSBPUENfbXVsdGwgODAKLSNkZWZpbmUgT1BDX25lZyA4MQotI2RlZmluZSBPUENfbmVnYiA4MgotI2RlZmluZSBPUENfbm9wIDgzCi0jZGVmaW5lIE9QQ19vciA4NAotI2RlZmluZSBPUENfb3JiIDg1Ci0jZGVmaW5lIE9QQ19vdXQgODYKLSNkZWZpbmUgT1BDX291dGIgODcKLSNkZWZpbmUgT1BDX291dGQgODgKLSNkZWZpbmUgT1BDX291dGRiIDg5Ci0jZGVmaW5lIE9QQ19vdXRpYiA5MAotI2RlZmluZSBPUENfb3V0aWJyIDkxCi0jZGVmaW5lIE9QQ19wb3AgOTIKLSNkZWZpbmUgT1BDX3BvcGwgOTMKLSNkZWZpbmUgT1BDX3B1c2ggOTQKLSNkZWZpbmUgT1BDX3B1c2hsIDk1Ci0jZGVmaW5lIE9QQ19yZXMgOTYKLSNkZWZpbmUgT1BDX3Jlc2IgOTcKLSNkZWZpbmUgT1BDX3Jlc2ZsZyA5OAotI2RlZmluZSBPUENfcmV0IDk5Ci0jZGVmaW5lIE9QQ19ybCAxMDAKLSNkZWZpbmUgT1BDX3JsYiAxMDEKLSNkZWZpbmUgT1BDX3JsYyAxMDIKLSNkZWZpbmUgT1BDX3JsY2IgMTAzCi0jZGVmaW5lIE9QQ19ybGRiIDEwNAotI2RlZmluZSBPUENfcnIgMTA1Ci0jZGVmaW5lIE9QQ19ycmIgMTA2Ci0jZGVmaW5lIE9QQ19ycmMgMTA3Ci0jZGVmaW5lIE9QQ19ycmNiIDEwOAotI2RlZmluZSBPUENfcnJkYiAxMDkKLSNkZWZpbmUgT1BDX3NiYyAxMTAKLSNkZWZpbmUgT1BDX3NiY2IgMTExCi0jZGVmaW5lIE9QQ19zZGEgMTEyCi0jZGVmaW5lIE9QQ19zZGFiIDExMwotI2RlZmluZSBPUENfc2RhbCAxMTQKLSNkZWZpbmUgT1BDX3NkbCAxMTUKLSNkZWZpbmUgT1BDX3NkbGIgMTE2Ci0jZGVmaW5lIE9QQ19zZGxsIDExNwotI2RlZmluZSBPUENfc2V0IDExOAotI2RlZmluZSBPUENfc2V0YiAxMTkKLSNkZWZpbmUgT1BDX3NldGZsZyAxMjAKLSNkZWZpbmUgT1BDX3NpbmIgMTIxCi0jZGVmaW5lIE9QQ19zaW5kIDEyMgotI2RlZmluZSBPUENfc2luZGIgMTIzCi0jZGVmaW5lIE9QQ19zaW5pYiAxMjQKLSNkZWZpbmUgT1BDX3NpbmliciAxMjUKLSNkZWZpbmUgT1BDX3NsYSAxMjYKLSNkZWZpbmUgT1BDX3NsYWIgMTI3Ci0jZGVmaW5lIE9QQ19zbGFsIDEyOAotI2RlZmluZSBPUENfc2xsIDEyOQotI2RlZmluZSBPUENfc2xsYiAxMzAKLSNkZWZpbmUgT1BDX3NsbGwgMTMxCi0jZGVmaW5lIE9QQ19zb3V0IDEzMgotI2RlZmluZSBPUENfc291dGIgMTMzCi0jZGVmaW5lIE9QQ19zb3V0ZCAxMzQKLSNkZWZpbmUgT1BDX3NvdXRkYiAxMzUKLSNkZWZpbmUgT1BDX3NvdXRpYiAxMzYKLSNkZWZpbmUgT1BDX3NvdXRpYnIgMTM3Ci0jZGVmaW5lIE9QQ19zcmEgMTM4Ci0jZGVmaW5lIE9QQ19zcmFiIDEzOQotI2RlZmluZSBPUENfc3JhbCAxNDAKLSNkZWZpbmUgT1BDX3NybCAxNDEKLSNkZWZpbmUgT1BDX3NybGIgMTQyCi0jZGVmaW5lIE9QQ19zcmxsIDE0MwotI2RlZmluZSBPUENfc3ViIDE0NAotI2RlZmluZSBPUENfc3ViYiAxNDUKLSNkZWZpbmUgT1BDX3N1YmwgMTQ2Ci0jZGVmaW5lIE9QQ190Y2MgMTQ3Ci0jZGVmaW5lIE9QQ190Y2NiIDE0OAotI2RlZmluZSBPUENfdGVzdCAxNDkKLSNkZWZpbmUgT1BDX3Rlc3RiIDE1MAotI2RlZmluZSBPUENfdGVzdGwgMTUxCi0jZGVmaW5lIE9QQ190cmRiIDE1MgotI2RlZmluZSBPUENfdHJkcmIgMTUzCi0jZGVmaW5lIE9QQ190cmliIDE1NAotI2RlZmluZSBPUENfdHJpcmIgMTU1Ci0jZGVmaW5lIE9QQ190cnRkcmIgMTU2Ci0jZGVmaW5lIE9QQ190cnRpYiAxNTcKLSNkZWZpbmUgT1BDX3RydGlyYiAxNTgKLSNkZWZpbmUgT1BDX3RydGRiIDE1OQotI2RlZmluZSBPUENfdHNldCAxNjAKLSNkZWZpbmUgT1BDX3RzZXRiIDE2MQotI2RlZmluZSBPUENfeG9yIDE2MgotI2RlZmluZSBPUENfeG9yYiAxNjMKLSNkZWZpbmUgT1BDX2xkZCAgMTY0IAotI2RlZmluZSBPUENfbGRkYiAgMTY1IAotI2RlZmluZSBPUENfbGRkciAgMTY2IAotI2RlZmluZSBPUENfbGRkcmIgMTY3ICAKLSNkZWZpbmUgT1BDX2xkaSAgMTY4IAotI2RlZmluZSBPUENfbGRpYiAxNjkgIAotI2RlZmluZSBPUENfc2MgICAxNzAKLSNkZWZpbmUgT1BDX2JwdCAgIDE3MQotI2RlZmluZSBPUENfZXh0MGUgMTcyCi0jZGVmaW5lIE9QQ19leHQwZiAxNzIKLSNkZWZpbmUgT1BDX2V4dDhlIDE3MgotI2RlZmluZSBPUENfZXh0OGYgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkMzYgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkMzggMTcyCi0jZGVmaW5lIE9QQ19yc3ZkNzggMTcyCi0jZGVmaW5lIE9QQ19yc3ZkN2UgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkOWQgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkOWYgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkYjkgMTcyCi0jZGVmaW5lIE9QQ19yc3ZkYmYgMTcyCi0jZGVmaW5lIE9QQ19vdXRpIDE3MwotdHlwZWRlZiBzdHJ1Y3QgewotI2lmZGVmIE5JQ0VOQU1FUwotY2hhciAqbmljZW5hbWU7Ci1pbnQgdHlwZTsKLWludCBjeWNsZXM7Ci1pbnQgZmxhZ3M7Ci0jZW5kaWYKLWNoYXIgKm5hbWU7Ci11bnNpZ25lZCBjaGFyIG9wY29kZTsKLXZvaWQgKCpmdW5jKSgpOwotdW5zaWduZWQgaW50IGFyZ19pbmZvWzRdOwotdW5zaWduZWQgaW50IGJ5dGVfaW5mb1sxMF07Ci1pbnQgbm9wZXJhbmRzOwotaW50IGxlbmd0aDsKLWludCBpZHg7Ci19IG9wY29kZV9lbnRyeV90eXBlOwotI2lmZGVmIERFRklORV9UQUJMRQotb3Bjb2RlX2VudHJ5X3R5cGUgejhrX3RhYmxlW10gPSB7Ci0KLQotLyogMTAxMSAwMTAxIHNzc3MgZGRkZCAqKiogYWRjIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRjIHJkLHJzIiwxNiw1LAotMHgzYywKLSNlbmRpZgotImFkYyIsT1BDX2FkYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs1LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDB9LAotCi0KLS8qIDEwMTEgMDEwMCBzc3NzIGRkZGQgKioqIGFkY2IgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkY2IgcmJkLHJicyIsOCw1LAotMHgzZiwKLSNlbmRpZgotImFkY2IiLE9QQ19hZGNiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMX0sCi0KLQotLyogMDAwMCAwMDAxIHNzTjAgZGRkZCAqKiogYWRkIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxAcnMiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMn0sCi0KLQotLyogMDEwMCAwMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsM30sCi0KLQotLyogMDEwMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgzYywKLSNlbmRpZgotImFkZCIsT1BDX2FkZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDR9LAotCi0KLS8qIDAwMDAgMDAwMSAwMDAwIGRkZGQgaW1tMTYgKioqIGFkZCByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZCByZCxpbW0xNiIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJhZGQiLE9QQ19hZGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw1fSwKLQotCi0vKiAxMDAwIDAwMDEgc3NzcyBkZGRkICoqKiBhZGQgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGQgcmQscnMiLDE2LDQsCi0weDNjLAotI2VuZGlmCi0iYWRkIixPUENfYWRkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDZ9LAotCi0KLS8qIDAwMDAgMDAwMCBzc04wIGRkZGQgKioqIGFkZGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLEBycyIsOCw3LAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsN30sCi0KLQotLyogMDEwMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw4fSwKLQotCi0vKiAwMTAwIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhZGRiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRiIHJiZCxhZGRyZXNzX3NyYyhycykiLDgsMTAsCi0weDNmLAotI2VuZGlmCi0iYWRkYiIsT1BDX2FkZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw5fSwKLQotCi0vKiAwMDAwIDAwMDAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogYWRkYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLGltbTgiLDgsNywKLTB4M2YsCi0jZW5kaWYKLSJhZGRiIixPUENfYWRkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMTB9LAotCi0KLS8qIDEwMDAgMDAwMCBzc3NzIGRkZGQgKioqIGFkZGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGIgcmJkLHJicyIsOCw0LAotMHgzZiwKLSNlbmRpZgotImFkZGIiLE9QQ19hZGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExfSwKLQotCi0vKiAwMDAxIDAxMTAgc3NOMCBkZGRkICoqKiBhZGRsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxAcnMiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTJ9LAotCi0KLS8qIDAxMDEgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFkZGwgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQsYWRkcmVzc19zcmMiLDMyLDE1LAotMHgzYywKLSNlbmRpZgotImFkZGwiLE9QQ19hZGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxM30sCi0KLQotLyogMDEwMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYWRkbCBycmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYWRkbCBycmQsYWRkcmVzc19zcmMocnMpIiwzMiwxNiwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE0fSwKLQotCi0vKiAwMDAxIDAxMTAgMDAwMCBkZGRkIGltbTMyICoqKiBhZGRsIHJyZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFkZGwgcnJkLGltbTMyIiwzMiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJhZGRsIixPUENfYWRkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDE1fSwKLQotCi0vKiAxMDAxIDAxMTAgc3NzcyBkZGRkICoqKiBhZGRsIHJyZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhZGRsIHJyZCxycnMiLDMyLDgsCi0weDNjLAotI2VuZGlmCi0iYWRkbCIsT1BDX2FkZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTZ9LAotCi0KLS8qIDAwMDAgMDExMSBzc04wIGRkZGQgKioqIGFuZCByZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQsQHJzIiwxNiw3LAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE3fSwKLQotCi0vKiAwMTAwIDAxMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBhbmQgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxOH0sCi0KLQotLyogMDEwMCAwMTExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogYW5kIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgxOCwKLSNlbmRpZgotImFuZCIsT1BDX2FuZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE5fSwKLQotCi0vKiAwMDAwIDAxMTEgMDAwMCBkZGRkIGltbTE2ICoqKiBhbmQgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJhbmQgcmQsaW1tMTYiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0iYW5kIixPUENfYW5kLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjB9LAotCi0KLS8qIDEwMDAgMDExMSBzc3NzIGRkZGQgKioqIGFuZCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZCByZCxycyIsMTYsNCwKLTB4MTgsCi0jZW5kaWYKLSJhbmQiLE9QQ19hbmQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjF9LAotCi0KLS8qIDAwMDAgMDExMCBzc04wIGRkZGQgKioqIGFuZGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLEBycyIsOCw3LAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMjJ9LAotCi0KLS8qIDAxMDAgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYW5kYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjN9LAotCi0KLS8qIDAxMDAgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIGFuZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI0fSwKLQotCi0vKiAwMDAwIDAxMTAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogYW5kYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLGltbTgiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJhbmRiIixPUENfYW5kYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMjV9LAotCi0KLS8qIDEwMDAgMDExMCBzc3NzIGRkZGQgKioqIGFuZGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImFuZGIgcmJkLHJicyIsOCw0LAotMHgxYywKLSNlbmRpZgotImFuZGIiLE9QQ19hbmRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs2LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI2fSwKLQotCi0vKiAwMDEwIDAxMTEgZGROMCBpbW00ICoqKiBiaXQgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXQgQHJkLGltbTQiLDE2LDgsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjd9LAotCi0KLS8qIDAxMTAgMDExMSBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIGJpdCBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdCBhZGRyZXNzX2RzdChyZCksaW1tNCIsMTYsMTEsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjh9LAotCi0KLS8qIDAxMTAgMDExMSAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIGJpdCBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IGFkZHJlc3NfZHN0LGltbTQiLDE2LDEwLAotMHgxMCwKLSNlbmRpZgotImJpdCIsT1BDX2JpdCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjl9LAotCi0KLS8qIDEwMTAgMDExMSBkZGRkIGltbTQgKioqIGJpdCByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IHJkLGltbTQiLDE2LDQsCi0weDEwLAotI2VuZGlmCi0iYml0IixPUENfYml0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs3LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzB9LAotCi0KLS8qIDAwMTAgMDExMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogYml0IHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0IHJkLHJzIiwxNiwxMCwKLTB4MTAsCi0jZW5kaWYKLSJiaXQiLE9QQ19iaXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMxfSwKLQotCi0vKiAwMDEwIDAxMTAgZGROMCBpbW00ICoqKiBiaXRiIEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYml0YiBAcmQsaW1tNCIsOCw4LAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrNixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMzJ9LAotCi0KLS8qIDAxMTAgMDExMCBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIGJpdGIgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00Iiw4LDExLAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs2LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzN9LAotCi0KLS8qIDAxMTAgMDExMCAwMDAwIGltbTQgYWRkcmVzc19kc3QgKioqIGJpdGIgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgYWRkcmVzc19kc3QsaW1tNCIsOCwxMCwKLTB4MTAsCi0jZW5kaWYKLSJiaXRiIixPUENfYml0YiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzR9LAotCi0KLS8qIDEwMTAgMDExMCBkZGRkIGltbTQgKioqIGJpdGIgcmJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJiaXRiIHJiZCxpbW00Iiw4LDQsCi0weDEwLAotI2VuZGlmCi0iYml0YiIsT1BDX2JpdGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzNX0sCi0KLQotLyogMDAxMCAwMTEwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiBiaXRiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImJpdGIgcmJkLHJzIiw4LDEwLAotMHgxMCwKLSNlbmRpZgotImJpdGIiLE9QQ19iaXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzNn0sCi0KLQotLyogMDAxMSAwMTEwIDAwMDAgMDAwMCAqKiogYnB0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iYnB0Iiw4LDIsCi0weDAwLAotI2VuZGlmCi0iYnB0IixPUENfYnB0LDAsezB9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwwLDIsMzd9LAotCi0KLS8qIDAwMDEgMTExMSBkZE4wIDAwMDAgKioqIGNhbGwgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2FsbCBAcmQiLDMyLDEwLAotMHgwMCwKLSNlbmRpZgotImNhbGwiLE9QQ19jYWxsLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDM4fSwKLQotCi0vKiAwMTAxIDExMTEgMDAwMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjYWxsIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2FsbCBhZGRyZXNzX2RzdCIsMzIsMTIsCi0weDAwLAotI2VuZGlmCi0iY2FsbCIsT1BDX2NhbGwsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzOX0sCi0KLQotLyogMDEwMSAxMTExIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY2FsbCBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjYWxsIGFkZHJlc3NfZHN0KHJkKSIsMzIsMTMsCi0weDAwLAotI2VuZGlmCi0iY2FsbCIsT1BDX2NhbGwsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDB9LAotCi0KLS8qIDExMDEgZGlzcDEyICoqKiBjYWxyIGRpc3AxMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNhbHIgZGlzcDEyIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJjYWxyIixPUENfY2FsciwwLHtDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCsweGQsQ0xBU1NfRElTUCsoQVJHX0RJU1AxMiksMCwwLDAsMCwwLDAsMCx9LDEsMiw0MX0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMTAwMCAqKiogY2xyIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNsciBAcmQiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0iY2xyIixPUENfY2xyLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDQyfSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiBjbHIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHIgYWRkcmVzc19kc3QiLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImNsciIsT1BDX2NsciwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQzfSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiBjbHIgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyIGFkZHJlc3NfZHN0KHJkKSIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0iY2xyIixPUENfY2xyLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQ0fSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAxMDAwICoqKiBjbHIgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHIgcmQiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0iY2xyIixPUENfY2xyLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiw0NX0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMTAwMCAqKiogY2xyYiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjbHJiIEByZCIsOCw4LAotMHgwMCwKLSNlbmRpZgotImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDQ2fSwKLQotCi0vKiAwMTAwIDExMDAgMDAwMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiBjbHJiIGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY2xyYiBhZGRyZXNzX2RzdCIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJjbHJiIixPUENfY2xyYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQ3fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0ICoqKiBjbHJiIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNscmIgYWRkcmVzc19kc3QocmQpIiw4LDEyLAotMHgwMCwKLSNlbmRpZgotImNscmIiLE9QQ19jbHJiLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDQ4fSwKLQotCi0vKiAxMDAwIDExMDAgZGRkZCAxMDAwICoqKiBjbHJiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNscmIgcmJkIiw4LDcsCi0weDAwLAotI2VuZGlmCi0iY2xyYiIsT1BDX2NscmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDQ5fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMDAwICoqKiBjb20gQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tIEByZCIsMTYsMTIsCi0weDE4LAotI2VuZGlmCi0iY29tIixPUENfY29tLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDUwfSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjb20gYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb20gYWRkcmVzc19kc3QiLDE2LDE1LAotMHgxOCwKLSNlbmRpZgotImNvbSIsT1BDX2NvbSwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDUxfSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBjb20gYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY29tIGFkZHJlc3NfZHN0KHJkKSIsMTYsMTYsCi0weDE4LAotI2VuZGlmCi0iY29tIixPUENfY29tLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDUyfSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAwMDAwICoqKiBjb20gcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb20gcmQiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0iY29tIixPUENfY29tLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1M30sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDAwMCAqKiogY29tYiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21iIEByZCIsOCwxMiwKLTB4MWMsCi0jZW5kaWYKLSJjb21iIixPUENfY29tYiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1NH0sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tYiBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWIgYWRkcmVzc19kc3QiLDgsMTUsCi0weDFjLAotI2VuZGlmCi0iY29tYiIsT1BDX2NvbWIsMCx7Q0xBU1NfREErKEFSR19EU1QpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1NX0sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDAwMCBhZGRyZXNzX2RzdCAqKiogY29tYiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21iIGFkZHJlc3NfZHN0KHJkKSIsOCwxNiwKLTB4MWMsCi0jZW5kaWYKLSJjb21iIixPUENfY29tYiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw1Nn0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMDAwMCAqKiogY29tYiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjb21iIHJiZCIsOCw3LAotMHgxYywKLSNlbmRpZgotImNvbWIiLE9QQ19jb21iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiw1N30sCi0KLQotLyogMTAwMCAxMTAxIGZsYWdzIDAxMDEgKioqIGNvbWZsZyBmbGFncyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNvbWZsZyBmbGFncyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJjb21mbGciLE9QQ19jb21mbGcsMCx7Q0xBU1NfRkxBR1MsfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19GTEFHUyxDTEFTU19CSVQrNSwwLDAsMCwwLDAsfSwxLDIsNTh9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAwMDEgaW1tMTYgKioqIGNwIEByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIEByZCxpbW0xNiIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3AiLE9QQ19jcCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw1OX0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDAwMSBhZGRyZXNzX2RzdCBpbW0xNiAqKiogY3AgYWRkcmVzc19kc3QocmQpLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3AgYWRkcmVzc19kc3QocmQpLGltbTE2IiwxNiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLH0sMiw2LDYwfSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBjcCBhZGRyZXNzX2RzdCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIGFkZHJlc3NfZHN0LGltbTE2IiwxNiwxNCwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsNjF9LAotCi0KLS8qIDAwMDAgMTAxMSBzc04wIGRkZGQgKioqIGNwIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLEBycyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw2Mn0sCi0KLQotLyogMDEwMCAxMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogY3AgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4M2MsCi0jZW5kaWYKLSJjcCIsT1BDX2NwLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDYzfSwKLQotCi0vKiAwMTAwIDEwMTEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcCByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcCByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDY0fSwKLQotCi0vKiAwMDAwIDEwMTEgMDAwMCBkZGRkIGltbTE2ICoqKiBjcCByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLGltbTE2IiwxNiw3LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDY1fSwKLQotCi0vKiAxMDAwIDEwMTEgc3NzcyBkZGRkICoqKiBjcCByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwIHJkLHJzIiwxNiw0LAotMHgzYywKLSNlbmRpZgotImNwIixPUENfY3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw2Nn0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDAwMSBpbW04IGltbTggKioqIGNwYiBAcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiBAcmQsaW1tOCIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCw2N30sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTggKioqIGNwYiBhZGRyZXNzX2RzdChyZCksaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiBhZGRyZXNzX2RzdChyZCksaW1tOCIsOCwxNSwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNiw2OH0sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTggKioqIGNwYiBhZGRyZXNzX2RzdCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIGFkZHJlc3NfZHN0LGltbTgiLDgsMTQsCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNiw2OX0sCi0KLQotLyogMDAwMCAxMDEwIHNzTjAgZGRkZCAqKiogY3BiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLEBycyIsOCw3LAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNzB9LAotCi0KLS8qIDAxMDAgMTAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDNjLAotI2VuZGlmCi0iY3BiIixPUENfY3BiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDcxfSwKLQotCi0vKiAwMTAwIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgzYywKLSNlbmRpZgotImNwYiIsT1BDX2NwYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsNzJ9LAotCi0KLS8qIDAwMDAgMTAxMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBjcGIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGIgcmJkLGltbTgiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsNzN9LAotCi0KLS8qIDEwMDAgMTAxMCBzc3NzIGRkZGQgKioqIGNwYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BiIHJiZCxyYnMiLDgsNCwKLTB4M2MsCi0jZW5kaWYKLSJjcGIiLE9QQ19jcGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw3NH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGQgcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BkIHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BkIixPUENfY3BkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzV9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkYiByYmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BkYiByYmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwZGIiLE9QQ19jcGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsNzZ9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDExMDAgMDAwMCBycnJyIGRkZGQgY2NjYyAqKiogY3BkciByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGRyIHJkLEBycyxycixjYyIsMTYsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BkciIsT1BDX2NwZHIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc3fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwZHJiIHJiZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGRyYiByYmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwZHJiIixPUENfY3BkcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDc4fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAwMDAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwaSByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGkgcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGkiLE9QQ19jcGksMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw3OX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGliIHJiZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGliIHJiZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BpYiIsT1BDX2NwaWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4MH0sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMDEwMCAwMDAwIHJycnIgZGRkZCBjY2NjICoqKiBjcGlyIHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwaXIgcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcGlyIixPUENfY3BpciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDgxfSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MgKioqIGNwaXJiIHJiZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGlyYiByYmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwaXJiIixPUENfY3BpcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw4Mn0sCi0KLQotLyogMDAwMSAwMDAwIHNzTjAgZGRkZCAqKiogY3BsIHJyZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLEBycyIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0iY3BsIixPUENfY3BsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsODN9LAotCi0KLS8qIDAxMDEgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGNwbCBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcGwgcnJkLGFkZHJlc3Nfc3JjIiwzMiwxNSwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDg0fSwKLQotCi0vKiAwMTAxIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBjcGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQsYWRkcmVzc19zcmMocnMpIiwzMiwxNiwKLTB4M2MsCi0jZW5kaWYKLSJjcGwiLE9QQ19jcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw4NX0sCi0KLQotLyogMDAwMSAwMDAwIDAwMDAgZGRkZCBpbW0zMiAqKiogY3BsIHJyZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQsaW1tMzIiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSwwLDAsMCwwLH0sMiw2LDg2fSwKLQotCi0vKiAxMDAxIDAwMDAgc3NzcyBkZGRkICoqKiBjcGwgcnJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwbCBycmQscnJzIiwzMiw4LAotMHgzYywKLSNlbmRpZgotImNwbCIsT1BDX2NwbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw4N30sCi0KLQotLyogMTAxMSAxMDExIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjICoqKiBjcHNkIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNkIEByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwc2QiLE9QQ19jcHNkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDg4fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2RiIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNkYiBAcmQsQHJzLHJyLGNjIiw4LDExLAotMHgzYywKLSNlbmRpZgotImNwc2RiIixPUENfY3BzZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsODl9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDExMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZHIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2RyIEByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwc2RyIixPUENfY3BzZHIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTB9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDExMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzZHJiIEByZCxAcnMscnIsY2MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJjcHNkcmIgQHJkLEBycyxycixjYyIsOCwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNkcmIiLE9QQ19jcHNkcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTF9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzaSBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzaSBAcmQsQHJzLHJyLGNjIiwxNiwxMSwKLTB4M2MsCi0jZW5kaWYKLSJjcHNpIixPUENfY3BzaSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTJ9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzaWIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2liIEByZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzaWIiLE9QQ19jcHNpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSxDTEFTU19DQyx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsfSw0LDQsOTN9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAxMTAgMDAwMCBycnJyIGRkTjAgY2NjYyAqKiogY3BzaXIgQHJkLEBycyxycixjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImNwc2lyIEByZCxAcnMscnIsY2MiLDE2LDExLAotMHgzYywKLSNlbmRpZgotImNwc2lyIixPUENfY3BzaXIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksQ0xBU1NfQ0MsfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19DQywwLH0sNCw0LDk0fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MgKioqIGNwc2lyYiBAcmQsQHJzLHJyLGNjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iY3BzaXJiIEByZCxAcnMscnIsY2MiLDgsMTEsCi0weDNjLAotI2VuZGlmCi0iY3BzaXJiIixPUENfY3BzaXJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLENMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQ0MsMCx9LDQsNCw5NX0sCi0KLQotLyogMTAxMSAwMDAwIGRkZGQgMDAwMCAqKiogZGFiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRhYiByYmQiLDgsNSwKLTB4MzgsCi0jZW5kaWYKLSJkYWIiLE9QQ19kYWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMSwyLDk2fSwKLQotCi0vKiAxMTExIGRkZGQgMGRpc3A3ICoqKiBkYmpueiByYmQsZGlzcDcgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkYmpueiByYmQsZGlzcDciLDE2LDExLAotMHgwMCwKLSNlbmRpZgotImRiam56IixPUENfZGJqbnosMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMHhmLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU18wRElTUDcsMCwwLDAsMCwwLDAsfSwyLDIsOTd9LAotCi0KLS8qIDAwMTAgMTAxMSBkZE4wIGltbTRtMSAqKiogZGVjIEByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWMgQHJkLGltbTRtMSIsMTYsMTEsCi0weDFjLAotI2VuZGlmCi0iZGVjIixPUENfZGVjLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsOTh9LAotCi0KLS8qIDAxMTAgMTAxMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogZGVjIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsMTYsMTQsCi0weDFjLAotI2VuZGlmCi0iZGVjIixPUENfZGVjLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsOTl9LAotCi0KLS8qIDAxMTAgMTAxMSAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogZGVjIGFkZHJlc3NfZHN0LGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRlYyBhZGRyZXNzX2RzdCxpbW00bTEiLDE2LDEzLAotMHgxYywKLSNlbmRpZgotImRlYyIsT1BDX2RlYywwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTAwfSwKLQotCi0vKiAxMDEwIDEwMTEgZGRkZCBpbW00bTEgKioqIGRlYyByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWMgcmQsaW1tNG0xIiwxNiw0LAotMHgxYywKLSNlbmRpZgotImRlYyIsT1BDX2RlYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDEwMX0sCi0KLQotLyogMDAxMCAxMDEwIGRkTjAgaW1tNG0xICoqKiBkZWNiIEByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWNiIEByZCxpbW00bTEiLDgsMTEsCi0weDFjLAotI2VuZGlmCi0iZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxMDJ9LAotCi0KLS8qIDAxMTAgMTAxMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogZGVjYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiw4LDE0LAotMHgxYywKLSNlbmRpZgotImRlY2IiLE9QQ19kZWNiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTAzfSwKLQotCi0vKiAwMTEwIDEwMTAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGRlY2IgYWRkcmVzc19kc3QsaW1tNG0xICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGVjYiBhZGRyZXNzX2RzdCxpbW00bTEiLDgsMTMsCi0weDFjLAotI2VuZGlmCi0iZGVjYiIsT1BDX2RlY2IsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDEwNH0sCi0KLQotLyogMTAxMCAxMDEwIGRkZGQgaW1tNG0xICoqKiBkZWNiIHJiZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkZWNiIHJiZCxpbW00bTEiLDgsNCwKLTB4MWMsCi0jZW5kaWYKLSJkZWNiIixPUENfZGVjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDEwNX0sCi0KLQotLyogMDExMSAxMTAwIDAwMDAgMDBpaSAqKiogZGkgaTIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaSBpMiIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJkaSIsT1BDX2RpLDAse0NMQVNTX0lNTSsoQVJHX0lNTTIpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfMDBJSSwwLDAsMCwwLDAsfSwxLDIsMTA2fSwKLQotCi0vKiAwMDAxIDEwMTEgc3NOMCBkZGRkICoqKiBkaXYgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdiBycmQsQHJzIiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMDd9LAotCi0KLS8qIDAxMDEgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGRpdiBycmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLGFkZHJlc3Nfc3JjIiwxNiwxMDcsCi0weDNjLAotI2VuZGlmCi0iZGl2IixPUENfZGl2LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEwOH0sCi0KLQotLyogMDEwMSAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZGl2IHJyZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXYgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTA5fSwKLQotCi0vKiAwMDAxIDEwMTEgMDAwMCBkZGRkIGltbTE2ICoqKiBkaXYgcnJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxpbW0xNiIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMTEwfSwKLQotCi0vKiAxMDAxIDEwMTEgc3NzcyBkZGRkICoqKiBkaXYgcnJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2IHJyZCxycyIsMTYsMTA3LAotMHgzYywKLSNlbmRpZgotImRpdiIsT1BDX2RpdiwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExMX0sCi0KLQotLyogMDAwMSAxMDEwIHNzTjAgZGRkZCAqKiogZGl2bCBycWQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQsQHJzIiwzMiw3NDQsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDExMn0sCi0KLQotLyogMDEwMSAxMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZGl2bCBycWQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxhZGRyZXNzX3NyYyIsMzIsNzQ1LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDExM30sCi0KLQotLyogMDEwMSAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZGl2bCBycWQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGl2bCBycWQsYWRkcmVzc19zcmMocnMpIiwzMiw3NDYsCi0weDNjLAotI2VuZGlmCi0iZGl2bCIsT1BDX2RpdmwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDExNH0sCi0KLQotLyogMDAwMSAxMDEwIDAwMDAgZGRkZCBpbW0zMiAqKiogZGl2bCBycWQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJkaXZsIHJxZCxpbW0zMiIsMzIsNzQ0LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhhLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwxMTV9LAotCi0KLS8qIDEwMDEgMTAxMCBzc3NzIGRkZGQgKioqIGRpdmwgcnFkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImRpdmwgcnFkLHJycyIsMzIsNzQ0LAotMHgzYywKLSNlbmRpZgotImRpdmwiLE9QQ19kaXZsLDAse0NMQVNTX1JFR19RVUFEKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTE2fSwKLQotCi0vKiAxMTExIGRkZGQgMWRpc3A3ICoqKiBkam56IHJkLGRpc3A3ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZGpueiByZCxkaXNwNyIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0iZGpueiIsT1BDX2RqbnosMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMHhmLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU18xRElTUDcsMCwwLDAsMCwwLDAsfSwyLDIsMTE3fSwKLQotCi0vKiAwMTExIDExMDAgMDAwMCAwMWlpICoqKiBlaSBpMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImVpIGkyIiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImVpIixPUENfZWksMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMiksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU18wMUlJLDAsMCwwLDAsMCx9LDEsMiwxMTh9LAotCi0KLS8qIDAwMTAgMTEwMSBzc04wIGRkZGQgKioqIGV4IHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4IHJkLEBycyIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0iZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTE5fSwKLQotCi0vKiAwMTEwIDExMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBleCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4IHJkLGFkZHJlc3Nfc3JjIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJleCIsT1BDX2V4LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDEyMH0sCi0KLQotLyogMDExMCAxMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogZXggcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXggcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxNiwKLTB4MDAsCi0jZW5kaWYKLSJleCIsT1BDX2V4LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwxMjF9LAotCi0KLS8qIDEwMTAgMTEwMSBzc3NzIGRkZGQgKioqIGV4IHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXggcmQscnMiLDE2LDYsCi0weDAwLAotI2VuZGlmCi0iZXgiLE9QQ19leCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTIyfSwKLQotCi0vKiAwMDEwIDExMDAgc3NOMCBkZGRkICoqKiBleGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4YiByYmQsQHJzIiw4LDEyLAotMHgwMCwKLSNlbmRpZgotImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTIzfSwKLQotCi0vKiAwMTEwIDExMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBleGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXhiIHJiZCxhZGRyZXNzX3NyYyIsOCwxNSwKLTB4MDAsCi0jZW5kaWYKLSJleGIiLE9QQ19leGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTI0fSwKLQotCi0vKiAwMTEwIDExMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBleGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4YiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDE2LAotMHgwMCwKLSNlbmRpZgotImV4YiIsT1BDX2V4YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTI1fSwKLQotCi0vKiAxMDEwIDExMDAgc3NzcyBkZGRkICoqKiBleGIgcmJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4YiByYmQscmJzIiw4LDYsCi0weDAwLAotI2VuZGlmCi0iZXhiIixPUENfZXhiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMjZ9LAotCi0KLS8qIDAwMDAgMTExMCBpbW04ICoqKiBleHQwZSBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0MGUgaW1tOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJleHQwZSIsT1BDX2V4dDBlLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTI3fSwKLQotCi0vKiAwMDAwIDExMTEgaW1tOCAqKiogZXh0MGYgaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dDBmIGltbTgiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iZXh0MGYiLE9QQ19leHQwZiwwLHtDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMSwyLDEyOH0sCi0KLQotLyogMTAwMCAxMTEwIGltbTggKioqIGV4dDhlIGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHQ4ZSBpbW04Iiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImV4dDhlIixPUENfZXh0OGUsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDEsMiwxMjl9LAotCi0KLS8qIDEwMDAgMTExMSBpbW04ICoqKiBleHQ4ZiBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0OGYgaW1tOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJleHQ4ZiIsT1BDX2V4dDhmLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMTMwfSwKLQotCi0vKiAxMDExIDAwMDEgZGRkZCAxMDEwICoqKiBleHRzIHJyZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImV4dHMgcnJkIiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJleHRzIixPUENfZXh0cywwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhhLDAsMCwwLDAsMCx9LDEsMiwxMzF9LAotCi0KLS8qIDEwMTEgMDAwMSBkZGRkIDAwMDAgKioqIGV4dHNiIHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iZXh0c2IgcmQiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0iZXh0c2IiLE9QQ19leHRzYiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCwwLDAsMCwwLDAsfSwxLDIsMTMyfSwKLQotCi0vKiAxMDExIDAwMDEgZGRkZCAwMTExICoqKiBleHRzbCBycWQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJleHRzbCBycWQiLDMyLDExLAotMHgwMCwKLSNlbmRpZgotImV4dHNsIixPUENfZXh0c2wsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzcsMCwwLDAsMCwwLH0sMSwyLDEzM30sCi0KLQotLyogMDExMSAxMDEwIDAwMDAgMDAwMCAqKiogaGFsdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImhhbHQiLDE2LDgsCi0weDAwLAotI2VuZGlmCi0iaGFsdCIsT1BDX2hhbHQsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCwwLDAsMCwwLH0sMCwyLDEzNH0sCi0KLQotLyogMDAxMSAxMTAxIHNzTjAgZGRkZCAqKiogaW4gcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW4gcmQsQHJzIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJpbiIsT1BDX2luLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxMzV9LAotCi0KLS8qIDAwMTEgMTEwMSBkZGRkIDAxMDAgaW1tMTYgKioqIGluIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW4gcmQsaW1tMTYiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotImluIixPUENfaW4sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDEzNn0sCi0KLQotLyogMDAxMSAxMTAwIHNzTjAgZGRkZCAqKiogaW5iIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmIgcmJkLEBycyIsOCwxMiwKLTB4MDAsCi0jZW5kaWYKLSJpbmIiLE9QQ19pbmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDEzN30sCi0KLQotLyogMDAxMSAxMDEwIGRkZGQgMDEwMCBpbW0xNiAqKiogaW5iIHJiZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYiByYmQsaW1tMTYiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0iaW5iIixPUENfaW5iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxMzh9LAotCi0KLS8qIDAwMTAgMTAwMSBkZE4wIGltbTRtMSAqKiogaW5jIEByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmMgQHJkLGltbTRtMSIsMTYsMTEsCi0weDFjLAotI2VuZGlmCi0iaW5jIixPUENfaW5jLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDEzOX0sCi0KLQotLyogMDExMCAxMDAxIGRkTjAgaW1tNG0xIGFkZHJlc3NfZHN0ICoqKiBpbmMgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYyBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwxNiwxNCwKLTB4MWMsCi0jZW5kaWYKLSJpbmMiLE9QQ19pbmMsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTQwfSwKLQotCi0vKiAwMTEwIDEwMDEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluYyBhZGRyZXNzX2RzdCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmMgYWRkcmVzc19kc3QsaW1tNG0xIiwxNiwxMywKLTB4MWMsCi0jZW5kaWYKLSJpbmMiLE9QQ19pbmMsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDF9LAotCi0KLS8qIDEwMTAgMTAwMSBkZGRkIGltbTRtMSAqKiogaW5jIHJkLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluYyByZCxpbW00bTEiLDE2LDQsCi0weDFjLAotI2VuZGlmCi0iaW5jIixPUENfaW5jLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksMCwwLDAsMCwwLH0sMiwyLDE0Mn0sCi0KLQotLyogMDAxMCAxMDAwIGRkTjAgaW1tNG0xICoqKiBpbmNiIEByZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmNiIEByZCxpbW00bTEiLDgsMTEsCi0weDFjLAotI2VuZGlmCi0iaW5jYiIsT1BDX2luY2IsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSwwLDAsMCwwLDAsfSwyLDIsMTQzfSwKLQotCi0vKiAwMTEwIDEwMDAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QgKioqIGluY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluY2IgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsOCwxNCwKLTB4MWMsCi0jZW5kaWYKLSJpbmNiIixPUENfaW5jYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00TTEpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTRNMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNDR9LAotCi0KLS8qIDAxMTAgMTAwMCAwMDAwIGltbTRtMSBhZGRyZXNzX2RzdCAqKiogaW5jYiBhZGRyZXNzX2RzdCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmNiIGFkZHJlc3NfZHN0LGltbTRtMSIsOCwxMywKLTB4MWMsCi0jZW5kaWYKLSJpbmNiIixPUENfaW5jYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNE0xKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE0NX0sCi0KLQotLyogMTAxMCAxMDAwIGRkZGQgaW1tNG0xICoqKiBpbmNiIHJiZCxpbW00bTEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmNiIHJiZCxpbW00bTEiLDgsNCwKLTB4MWMsCi0jZW5kaWYKLSJpbmNiIixPUENfaW5jYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNE0xKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCs4LENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00TTEpLDAsMCwwLDAsMCx9LDIsMiwxNDZ9LAotCi0KLS8qIDAwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogaW5kIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmQgQHJkLEBycyxyYSIsMTYsMjEsCi0weDA0LAotI2VuZGlmCi0iaW5kIixPUENfaW5kLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTQ3fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIGluZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJpbmRiIEByZCxAcnMscmJhIiw4LDIxLAotMHgwNCwKLSNlbmRpZgotImluZGIiLE9QQ19pbmRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTQ4fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIGluaWIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImluaWIgQHJkLEBycyxyYSIsOCwyMSwKLTB4MDQsCi0jZW5kaWYKLSJpbmliIixPUENfaW5pYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDE0OX0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAwMCAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBpbmliciBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0iaW5pYnIgQHJkLEBycyxyYSIsMTYsMjEsCi0weDA0LAotI2VuZGlmCi0iaW5pYnIiLE9QQ19pbmliciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE1MH0sCi0KLQotLyogMDExMSAxMDExIDAwMDAgMDAwMCAqKiogaXJldCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImlyZXQiLDE2LDEzLAotMHgzZiwKLSNlbmRpZgotImlyZXQiLE9QQ19pcmV0LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDAsMiwxNTF9LAotCi0KLS8qIDAwMDEgMTExMCBkZE4wIGNjY2MgKioqIGpwIGNjLEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImpwIGNjLEByZCIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0ianAiLE9QQ19qcCwwLHtDTEFTU19DQyxDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLDAsMCwwLDAsMCx9LDIsMiwxNTJ9LAotCi0KLS8qIDAxMDEgMTExMCAwMDAwIGNjY2MgYWRkcmVzc19kc3QgKioqIGpwIGNjLGFkZHJlc3NfZHN0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ianAgY2MsYWRkcmVzc19kc3QiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ianAiLE9QQ19qcCwwLHtDTEFTU19DQyxDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4ZSxDTEFTU19CSVQrMCxDTEFTU19DQyxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE1M30sCi0KLQotLyogMDEwMSAxMTEwIGRkTjAgY2NjYyBhZGRyZXNzX2RzdCAqKioganAgY2MsYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ianAgY2MsYWRkcmVzc19kc3QocmQpIiwxNiw4LAotMHgwMCwKLSNlbmRpZgotImpwIixPUENfanAsMCx7Q0xBU1NfQ0MsQ0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhlLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0NDLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTU0fSwKLQotCi0vKiAxMTEwIGNjY2MgZGlzcDggKioqIGpyIGNjLGRpc3A4ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ianIgY2MsZGlzcDgiLDE2LDYsCi0weDAwLAotI2VuZGlmCi0ianIiLE9QQ19qciwwLHtDTEFTU19DQyxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCsweGUsQ0xBU1NfQ0MsQ0xBU1NfRElTUDgsMCwwLDAsMCwwLDAsfSwyLDIsMTU1fSwKLQotCi0vKiAwMDAwIDExMDEgZGROMCAwMTAxIGltbTE2ICoqKiBsZCBAcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZCBAcmQsaW1tMTYiLDE2LDcsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNTZ9LAotCi0KLS8qIDAwMTAgMTExMSBkZE4wIHNzc3MgKioqIGxkIEByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIEByZCxycyIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwxNTd9LAotCi0KLS8qIDAxMDAgMTEwMSBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tMTYgKioqIGxkIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCx9LDIsNiwxNTh9LAotCi0KLS8qIDAxMTAgMTExMSBkZE4wIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkIGFkZHJlc3NfZHN0KHJkKSxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIGFkZHJlc3NfZHN0KHJkKSxycyIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGYsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTU5fSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2ICoqKiBsZCBhZGRyZXNzX2RzdCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIGFkZHJlc3NfZHN0LGltbTE2IiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsfSwyLDYsMTYwfSwKLQotCi0vKiAwMTEwIDExMTEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZCBhZGRyZXNzX2RzdCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIGFkZHJlc3NfZHN0LHJzIiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMHhmLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDE2MX0sCi0KLQotLyogMDAxMSAwMDExIGRkTjAgc3NzcyBpbW0xNiAqKiogbGQgcmQoaW1tMTYpLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQoaW1tMTYpLHJzIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0JBKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNjJ9LAotCi0KLS8qIDAxMTEgMDAxMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGQgcmQocngpLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQocngpLHJzIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX0JYKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxNjN9LAotCi0KLS8qIDAwMTAgMDAwMSBzc04wIGRkZGQgKioqIGxkIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLEBycyIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTY0fSwKLQotCi0vKiAwMTEwIDAwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZCByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLGFkZHJlc3Nfc3JjIiwxNiw5LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE2NX0sCi0KLQotLyogMDExMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGQgcmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTY2fSwKLQotCi0vKiAwMDEwIDAwMDEgMDAwMCBkZGRkIGltbTE2ICoqKiBsZCByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkIHJkLGltbTE2IiwxNiw3LAotMHgwMCwKLSNlbmRpZgotImxkIixPUENfbGQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNjd9LAotCi0KLS8qIDEwMTAgMDAwMSBzc3NzIGRkZGQgKioqIGxkIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQscnMiLDE2LDMsCi0weDAwLAotI2VuZGlmCi0ibGQiLE9QQ19sZCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCsxLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDE2OH0sCi0KLQotLyogMDAxMSAwMDAxIHNzTjAgZGRkZCBpbW0xNiAqKiogbGQgcmQscnMoaW1tMTYpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQscnMoaW1tMTYpIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxNjl9LAotCi0KLS8qIDAxMTEgMDAwMSBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGQgcmQscnMocngpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGQgcmQscnMocngpIiwxNiwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZCIsT1BDX2xkLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsxLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwxNzB9LAotCi0KLS8qIDAxMTEgMDExMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIGxkYSBwcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGEgcHJkLGFkZHJlc3Nfc3JjIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJsZGEiLE9QQ19sZGEsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE3MX0sCi0KLQotLyogMDExMSAwMTEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRhIHByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGEgcHJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsMTMsCi0weDAwLAotI2VuZGlmCi0ibGRhIixPUENfbGRhLDAse0NMQVNTX1BSKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzYsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTcyfSwKLQotCi0vKiAwMDExIDAxMDAgc3NOMCBkZGRkIGltbTE2ICoqKiBsZGEgcHJkLHJzKGltbTE2KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYSBwcmQscnMoaW1tMTYpIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGEiLE9QQ19sZGEsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfQkErKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE3M30sCi0KLQotLyogMDExMSAwMTAwIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGEgcHJkLHJzKHJ4KSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYSBwcmQscnMocngpIiwxNiwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGEiLE9QQ19sZGEsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfQlgrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzQsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE3NH0sCi0KLQotLyogMDAxMSAwMTAwIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkYXIgcHJkLGRpc3AxNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYXIgcHJkLGRpc3AxNiIsMTYsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRhciIsT1BDX2xkYXIsMCx7Q0xBU1NfUFIrKEFSR19SRCksQ0xBU1NfRElTUCx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwxNzV9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAxMDEgaW1tOCBpbW04ICoqKiBsZGIgQHJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgQHJkLGltbTgiLDgsNywKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCx9LDIsNCwxNzZ9LAotCi0KLS8qIDAwMTAgMTExMCBkZE4wIHNzc3MgKioqIGxkYiBAcmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIEByZCxyYnMiLDgsOCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDE3N30sCi0KLQotLyogMDEwMCAxMTAwIGRkTjAgMDEwMSBhZGRyZXNzX2RzdCBpbW04IGltbTggKioqIGxkYiBhZGRyZXNzX2RzdChyZCksaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBhZGRyZXNzX2RzdChyZCksaW1tOCIsOCwxNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfWCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNiwxNzh9LAotCi0KLS8qIDAxMTAgMTExMCBkZE4wIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkYiBhZGRyZXNzX2RzdChyZCkscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIGFkZHJlc3NfZHN0KHJkKSxyYnMiLDgsMTIsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwxNzl9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04ICoqKiBsZGIgYWRkcmVzc19kc3QsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiBhZGRyZXNzX2RzdCxpbW04Iiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrNSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSxDTEFTU19JTU0rKEFSR19JTU04KSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDYsMTgwfSwKLQotCi0vKiAwMTEwIDExMTAgMDAwMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGIgYWRkcmVzc19kc3QscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIGFkZHJlc3NfZHN0LHJicyIsOCwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMTgxfSwKLQotCi0vKiAwMDEwIDAwMDAgc3NOMCBkZGRkICoqKiBsZGIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQsQHJzIiw4LDcsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMTgyfSwKLQotCi0vKiAwMTEwIDAwMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGIgcmJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMTgzfSwKLQotCi0vKiAwMTEwIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDE4NH0sCi0KLQotLyogMTEwMCBkZGRkIGltbTggKioqIGxkYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByYmQsaW1tOCIsOCw1LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDIsMiwxODV9LAotCi0KLS8qIDEwMTAgMDAwMCBzc3NzIGRkZGQgKioqIGxkYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxyYnMiLDgsMywKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwxODZ9LAotCi0KLS8qIDAwMTEgMDAwMCBzc04wIGRkZGQgaW1tMTYgKioqIGxkYiByYmQscnMoaW1tMTYpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRiIHJiZCxycyhpbW0xNikiLDgsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRiIixPUENfbGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwxODd9LAotCi0KLS8qIDAxMTEgMDAwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRiIHJiZCxycyhyeCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmJkLHJzKHJ4KSIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfQlgrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JYKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDE4OH0sCi0KLQotLyogMDAxMSAwMDEwIGRkTjAgc3NzcyBpbW0xNiAqKiogbGRiIHJkKGltbTE2KSxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGIgcmQoaW1tMTYpLHJicyIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZGIiLE9QQ19sZGIsMCx7Q0xBU1NfQkErKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDE4OX0sCi0KLQotLyogMDExMSAwMDEwIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwICoqKiBsZGIgcmQocngpLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkYiByZChyeCkscmJzIiw4LDE0LAotMHgwMCwKLSNlbmRpZgotImxkYiIsT1BDX2xkYiwwLHtDTEFTU19CWCsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlgpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMTkwfSwKLQotCi0vKiAwMTExIDExMDEgc3NzcyAxY2NjICoqKiBsZGN0bCBjdHJsLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRjdGwgY3RybCxycyIsMzIsNywKLTB4MDAsCi0jZW5kaWYKLSJsZGN0bCIsT1BDX2xkY3RsLDAse0NMQVNTX0NUUkwsQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfMUNDQywwLDAsMCwwLDAsfSwyLDIsMTkxfSwKLQotCi0vKiAwMTExIDExMDEgZGRkZCAwY2NjICoqKiBsZGN0bCByZCxjdHJsICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRjdGwgcmQsY3RybCIsMzIsNywKLTB4MDAsCi0jZW5kaWYKLSJsZGN0bCIsT1BDX2xkY3RsLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0NUUkwsfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfMENDQywwLDAsMCwwLDAsfSwyLDIsMTkyfSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkZCBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRkIEByZCxAcnMscnIiLDE2LDExLAotMHgwNCwKLSNlbmRpZgotImxkZCIsT1BDX2xkZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTkzfSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAgKioqIGxkZGIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkZGIgQHJkLEBycyxyciIsOCwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGRiIixPUENfbGRkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMTk0fSwKLQotCi0vKiAxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkZHIgQHJkLEBycyxyciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkZHIgQHJkLEBycyxyciIsMTYsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRkciIsT1BDX2xkZHIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDE5NX0sCi0KLQotLyogMTAxMSAxMDEwIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAwMDAwICoqKiBsZGRyYiBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRkcmIgQHJkLEBycyxyciIsOCwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGRyYiIsT1BDX2xkZHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwxOTZ9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCAqKiogbGRpIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGkgQHJkLEBycyxyciIsMTYsMTEsCi0weDA0LAotI2VuZGlmCi0ibGRpIixPUENfbGRpLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxOTd9LAotCi0KLS8qIDEwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMTAwMCAqKiogbGRpYiBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRpYiBAcmQsQHJzLHJyIiw4LDExLAotMHgwNCwKLSNlbmRpZgotImxkaWIiLE9QQ19sZGliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwxOTh9LAotCi0KLS8qIDEwMTEgMTAxMSBzc04wIDAwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCAqKiogbGRpciBAcmQsQHJzLHJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRpciBAcmQsQHJzLHJyIiwxNiwxMSwKLTB4MDQsCi0jZW5kaWYKLSJsZGlyIixPUENfbGRpciwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMTk5fSwKLQotCi0vKiAxMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAgKioqIGxkaXJiIEByZCxAcnMscnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGlyYiBAcmQsQHJzLHJyIiw4LDExLAotMHgwNCwKLSNlbmRpZgotImxkaXJiIixPUENfbGRpcmIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCwwLH0sMyw0LDIwMH0sCi0KLQotLyogMTAxMSAxMTAxIGRkZGQgaW1tNCAqKiogbGRrIHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGsgcmQsaW1tNCIsMTYsNSwKLTB4MDAsCi0jZW5kaWYKLSJsZGsiLE9QQ19sZGssMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDIwMX0sCi0KLQotLyogMDAwMSAxMTAxIGRkTjAgc3NzcyAqKiogbGRsIEByZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgQHJkLHJycyIsMzIsMTEsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyMDJ9LAotCi0KLS8qIDAxMDEgMTEwMSBkZE4wIHNzc3MgYWRkcmVzc19kc3QgKioqIGxkbCBhZGRyZXNzX2RzdChyZCkscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIGFkZHJlc3NfZHN0KHJkKSxycnMiLDMyLDE0LAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjAzfSwKLQotCi0vKiAwMTAxIDExMDEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0ICoqKiBsZGwgYWRkcmVzc19kc3QscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIGFkZHJlc3NfZHN0LHJycyIsMzIsMTUsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDIwNH0sCi0KLQotLyogMDAxMSAwMTExIGRkTjAgc3NzcyBpbW0xNiAqKiogbGRsIHJkKGltbTE2KSxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcmQoaW1tMTYpLHJycyIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX0JBKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyMDV9LAotCi0KLS8qIDAxMTEgMDExMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRsIHJkKHJ4KSxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcmQocngpLHJycyIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX0JYKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwyMDZ9LAotCi0KLS8qIDAwMDEgMDEwMCBzc04wIGRkZGQgKioqIGxkbCBycmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxAcnMiLDMyLDExLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIwN30sCi0KLQotLyogMDEwMSAwMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbGRsIHJyZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQsYWRkcmVzc19zcmMiLDMyLDEyLAotMHgwMCwKLSNlbmRpZgotImxkbCIsT1BDX2xkbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjA4fSwKLQotCi0vKiAwMTAxIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBsZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkbCBycmQsYWRkcmVzc19zcmMocnMpIiwzMiwxMywKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMDl9LAotCi0KLS8qIDAwMDEgMDEwMCAwMDAwIGRkZGQgaW1tMzIgKioqIGxkbCBycmQsaW1tMzIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLGltbTMyIiwzMiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZGwiLE9QQ19sZGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwyMTB9LAotCi0KLS8qIDEwMDEgMDEwMCBzc3NzIGRkZGQgKioqIGxkbCBycmQscnJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRsIHJyZCxycnMiLDMyLDUsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19MT05HKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCs0LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIxMX0sCi0KLQotLyogMDAxMSAwMTAxIHNzTjAgZGRkZCBpbW0xNiAqKiogbGRsIHJyZCxycyhpbW0xNikgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLHJzKGltbTE2KSIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0JBKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyMTJ9LAotCi0KLS8qIDAxMTEgMDEwMSBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCAqKiogbGRsIHJyZCxycyhyeCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZGwgcnJkLHJzKHJ4KSIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRsIixPUENfbGRsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0JYKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SWCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwyMTN9LAotCi0KLS8qIDAwMDEgMTEwMCBkZE4wIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSAqKiogbGRtIEByZCxycyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIEByZCxycyxuIiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSwwLH0sMyw0LDIxNH0sCi0KLQotLyogMDEwMSAxMTAwIGRkTjAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIGFkZHJlc3NfZHN0ICoqKiBsZG0gYWRkcmVzc19kc3QocmQpLHJzLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gYWRkcmVzc19kc3QocmQpLHJzLG4iLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksfSwzLDYsMjE1fSwKLQotCi0vKiAwMTAxIDExMDAgMDAwMCAxMDAxIDAwMDAgc3NzcyAwMDAwIG5taW51czEgYWRkcmVzc19kc3QgKioqIGxkbSBhZGRyZXNzX2RzdCxycyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIGFkZHJlc3NfZHN0LHJzLG4iLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSx9LDMsNiwyMTZ9LAotCi0KLS8qIDAwMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSAqKiogbGRtIHJkLEBycyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIHJkLEBycyxuIiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJsZG0iLE9QQ19sZG0sMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSwwLH0sMyw0LDIxN30sCi0KLQotLyogMDEwMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjICoqKiBsZG0gcmQsYWRkcmVzc19zcmMocnMpLG4gKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZG0gcmQsYWRkcmVzc19zcmMocnMpLG4iLDE2LDE1LAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLENMQVNTX0lNTSArIChBUkdfSU1NTiksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksfSwzLDYsMjE4fSwKLQotCi0vKiAwMTAxIDExMDAgMDAwMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEgYWRkcmVzc19zcmMgKioqIGxkbSByZCxhZGRyZXNzX3NyYyxuICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRtIHJkLGFkZHJlc3Nfc3JjLG4iLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkbSIsT1BDX2xkbSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksQ0xBU1NfSU1NICsgKEFSR19JTU1OKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU1OTUlOVVMxKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSx9LDMsNiwyMTl9LAotCi0KLS8qIDAwMTEgMTAwMSBzc04wIDAwMDAgKioqIGxkcHMgQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRwcyBAcnMiLDE2LDEyLAotMHgzZiwKLSNlbmRpZgotImxkcHMiLE9QQ19sZHBzLDAse0NMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsMCwwLDAsMCx9LDEsMiwyMjB9LAotCi0KLS8qIDAxMTEgMTAwMSAwMDAwIDAwMDAgYWRkcmVzc19zcmMgKioqIGxkcHMgYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHBzIGFkZHJlc3Nfc3JjIiwxNiwxNiwKLTB4M2YsCi0jZW5kaWYKLSJsZHBzIixPUENfbGRwcywwLHtDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDEsNCwyMjF9LAotCi0KLS8qIDAxMTEgMTAwMSBzc04wIDAwMDAgYWRkcmVzc19zcmMgKioqIGxkcHMgYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRwcyBhZGRyZXNzX3NyYyhycykiLDE2LDE3LAotMHgzZiwKLSNlbmRpZgotImxkcHMiLE9QQ19sZHBzLDAse0NMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDEsNCwyMjJ9LAotCi0KLS8qIDAwMTEgMDAxMSAwMDAwIHNzc3MgZGlzcDE2ICoqKiBsZHIgZGlzcDE2LHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibGRyIGRpc3AxNixycyIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ibGRyIixPUENfbGRyLDAse0NMQVNTX0RJU1AsQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjIzfSwKLQotCi0vKiAwMDExIDAwMDEgMDAwMCBkZGRkIGRpc3AxNiAqKiogbGRyIHJkLGRpc3AxNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkciByZCxkaXNwMTYiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotImxkciIsT1BDX2xkciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsxLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyNH0sCi0KLQotLyogMDAxMSAwMDEwIDAwMDAgc3NzcyBkaXNwMTYgKioqIGxkcmIgZGlzcDE2LHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcmIgZGlzcDE2LHJicyIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZHJiIixPUENfbGRyYiwwLHtDTEFTU19ESVNQLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyNX0sCi0KLQotLyogMDAxMSAwMDAwIDAwMDAgZGRkZCBkaXNwMTYgKioqIGxkcmIgcmJkLGRpc3AxNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcmIgcmJkLGRpc3AxNiIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJsZHJiIixPUENfbGRyYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19ESVNQLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19ESVNQKyhBUkdfRElTUDE2KSwwLDAsMCwwLH0sMiw0LDIyNn0sCi0KLQotLyogMDAxMSAwMTExIDAwMDAgc3NzcyBkaXNwMTYgKioqIGxkcmwgZGlzcDE2LHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotImxkcmwgZGlzcDE2LHJycyIsMzIsMTcsCi0weDAwLAotI2VuZGlmCi0ibGRybCIsT1BDX2xkcmwsMCx7Q0xBU1NfRElTUCxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrNyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfRElTUCsoQVJHX0RJU1AxNiksMCwwLDAsMCx9LDIsNCwyMjd9LAotCi0KLS8qIDAwMTEgMDEwMSAwMDAwIGRkZGQgZGlzcDE2ICoqKiBsZHJsIHJyZCxkaXNwMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJsZHJsIHJyZCxkaXNwMTYiLDMyLDE3LAotMHgwMCwKLSNlbmRpZgotImxkcmwiLE9QQ19sZHJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RJU1AsfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0RJU1ArKEFSR19ESVNQMTYpLDAsMCwwLDAsfSwyLDQsMjI4fSwKLQotCi0vKiAwMTExIDEwMTEgMDAwMCAxMDEwICoqKiBtYml0ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibWJpdCIsMTYsNywKLTB4MzgsCi0jZW5kaWYKLSJtYml0IixPUENfbWJpdCwwLHswfSwKLQl7Q0xBU1NfQklUKzcsQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhhLDAsMCwwLDAsMCx9LDAsMiwyMjl9LAotCi0KLS8qIDAxMTEgMTAxMSBkZGRkIDExMDEgKioqIG1yZXEgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtcmVxIHJkIiwxNiwxMiwKLTB4MTgsCi0jZW5kaWYKLSJtcmVxIixPUENfbXJlcSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhkLDAsMCwwLDAsMCx9LDEsMiwyMzB9LAotCi0KLS8qIDAxMTEgMTAxMSAwMDAwIDEwMDEgKioqIG1yZXMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtcmVzIiwxNiw1LAotMHgwMCwKLSNlbmRpZgotIm1yZXMiLE9QQ19tcmVzLDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0JJVCs5LDAsMCwwLDAsMCx9LDAsMiwyMzF9LAotCi0KLS8qIDAxMTEgMTAxMSAwMDAwIDEwMDAgKioqIG1zZXQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtc2V0IiwxNiw1LAotMHgwMCwKLSNlbmRpZgotIm1zZXQiLE9QQ19tc2V0LDAsezB9LAotCXtDTEFTU19CSVQrNyxDTEFTU19CSVQrMHhiLENMQVNTX0JJVCswLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDAsMiwyMzJ9LAotCi0KLS8qIDAwMDEgMTAwMSBzc04wIGRkZGQgKioqIG11bHQgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLEBycyIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMzN9LAotCi0KLS8qIDAxMDEgMTAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHQgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQsYWRkcmVzc19zcmMiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMzR9LAotCi0KLS8qIDAxMDEgMTAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIG11bHQgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMTYsNzAsCi0weDNjLAotI2VuZGlmCi0ibXVsdCIsT1BDX211bHQsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyMzV9LAotCi0KLS8qIDAwMDEgMTAwMSAwMDAwIGRkZGQgaW1tMTYgKioqIG11bHQgcnJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdCBycmQsaW1tMTYiLDE2LDcwLAotMHgzYywKLSNlbmRpZgotIm11bHQiLE9QQ19tdWx0LDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjM2fSwKLQotCi0vKiAxMDAxIDEwMDEgc3NzcyBkZGRkICoqKiBtdWx0IHJyZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHQgcnJkLHJzIiwxNiw3MCwKLTB4M2MsCi0jZW5kaWYKLSJtdWx0IixPUENfbXVsdCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrOSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyMzd9LAotCi0KLS8qIDAwMDEgMTAwMCBzc04wIGRkZGQgKioqIG11bHRsIHJxZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQsQHJzIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDIzOH0sCi0KLQotLyogMDEwMSAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogbXVsdGwgcnFkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLGFkZHJlc3Nfc3JjIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjM5fSwKLQotCi0vKiAwMTAxIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBtdWx0bCBycWQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ibXVsdGwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNDB9LAotCi0KLS8qIDAwMDEgMTAwMCAwMDAwIGRkZGQgaW1tMzIgKioqIG11bHRsIHJxZCxpbW0zMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm11bHRsIHJxZCxpbW0zMiIsMzIsMjgyLAotMHgzYywKLSNlbmRpZgotIm11bHRsIixPUENfbXVsdGwsMCx7Q0xBU1NfUkVHX1FVQUQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCs4LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0zMiksMCwwLDAsMCx9LDIsNiwyNDF9LAotCi0KLS8qIDEwMDEgMTAwMCBzc3NzIGRkZGQgKioqIG11bHRsIHJxZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJtdWx0bCBycWQscnJzIiwzMiwyODIsCi0weDNjLAotI2VuZGlmCi0ibXVsdGwiLE9QQ19tdWx0bCwwLHtDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSxDTEFTU19SRUdfTE9ORysoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNDJ9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAwMTAgKioqIG5lZyBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWcgQHJkIiwxNiwxMiwKLTB4M2MsCi0jZW5kaWYKLSJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfSVIrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMiwwLDAsMCwwLDAsfSwxLDIsMjQzfSwKLQotCi0vKiAwMTAwIDExMDEgMDAwMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWcgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWcgYWRkcmVzc19kc3QiLDE2LDE1LAotMHgzYywKLSNlbmRpZgotIm5lZyIsT1BDX25lZywwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0NH0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCAqKiogbmVnIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZyBhZGRyZXNzX2RzdChyZCkiLDE2LDE2LAotMHgzYywKLSNlbmRpZgotIm5lZyIsT1BDX25lZywwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzIsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwyNDV9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDAwMTAgKioqIG5lZyByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZyByZCIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJuZWciLE9QQ19uZWcsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4ZCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzIsMCwwLDAsMCwwLH0sMSwyLDI0Nn0sCi0KLQotLyogMDAwMCAxMTAwIGRkTjAgMDAxMCAqKiogbmVnYiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWdiIEByZCIsOCwxMiwKLTB4M2MsCi0jZW5kaWYKLSJuZWdiIixPUENfbmVnYiwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhjLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNDd9LAotCi0KLS8qIDAxMDAgMTEwMCAwMDAwIDAwMTAgYWRkcmVzc19kc3QgKioqIG5lZ2IgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWdiIGFkZHJlc3NfZHN0Iiw4LDE1LAotMHgzYywKLSNlbmRpZgotIm5lZ2IiLE9QQ19uZWdiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCsyLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMjQ4fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMDEwIGFkZHJlc3NfZHN0ICoqKiBuZWdiIGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5lZ2IgYWRkcmVzc19kc3QocmQpIiw4LDE2LAotMHgzYywKLSNlbmRpZgotIm5lZ2IiLE9QQ19uZWdiLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMixDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDI0OX0sCi0KLQotLyogMTAwMCAxMTAwIGRkZGQgMDAxMCAqKiogbmVnYiByYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJuZWdiIHJiZCIsOCw3LAotMHgzYywKLSNlbmRpZgotIm5lZ2IiLE9QQ19uZWdiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsyLDAsMCwwLDAsMCx9LDEsMiwyNTB9LAotCi0KLS8qIDEwMDAgMTEwMSAwMDAwIDAxMTEgKioqIG5vcCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm5vcCIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJub3AiLE9QQ19ub3AsMCx7MH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzcsMCwwLDAsMCwwLH0sMCwyLDI1MX0sCi0KLQotLyogMDAwMCAwMTAxIHNzTjAgZGRkZCAqKiogb3IgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQsQHJzIiwxNiw3LAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNTJ9LAotCi0KLS8qIDAxMDAgMDEwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIG9yIHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19EQSsoQVJHX1NSQyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjUzfSwKLQotCi0vKiAwMTAwIDAxMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBvciByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgzOCwKLSNlbmRpZgotIm9yIixPUENfb3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTR9LAotCi0KLS8qIDAwMDAgMDEwMSAwMDAwIGRkZGQgaW1tMTYgKioqIG9yIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3IgcmQsaW1tMTYiLDE2LDcsCi0weDM4LAotI2VuZGlmCi0ib3IiLE9QQ19vciwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI1NX0sCi0KLQotLyogMTAwMCAwMTAxIHNzc3MgZGRkZCAqKiogb3IgcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvciByZCxycyIsMTYsNCwKLTB4MzgsCi0jZW5kaWYKLSJvciIsT1BDX29yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCs1LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI1Nn0sCi0KLQotLyogMDAwMCAwMTAwIHNzTjAgZGRkZCAqKiogb3JiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLEBycyIsOCw3LAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI1N30sCi0KLQotLyogMDEwMCAwMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3JiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm9yYiByYmQsYWRkcmVzc19zcmMiLDgsOSwKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI1OH0sCi0KLQotLyogMDEwMCAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogb3JiIHJiZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrNCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyNTl9LAotCi0KLS8qIDAwMDAgMDEwMCAwMDAwIGRkZGQgaW1tOCBpbW04ICoqKiBvcmIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLGltbTgiLDgsNywKLTB4M2MsCi0jZW5kaWYKLSJvcmIiLE9QQ19vcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDI2MH0sCi0KLQotLyogMTAwMCAwMTAwIHNzc3MgZGRkZCAqKiogb3JiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvcmIgcmJkLHJicyIsOCw0LAotMHgzYywKLSNlbmRpZgotIm9yYiIsT1BDX29yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNjF9LAotCi0KLS8qIDAwMTEgMTExMSBkZE4wIHNzc3MgKioqIG91dCBAcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXQgQHJkLHJzIiwxNiwwLAotMHgwNCwKLSNlbmRpZgotIm91dCIsT1BDX291dCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhmLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX1JFRysoQVJHX1JTKSwwLDAsMCwwLDAsfSwyLDIsMjYyfSwKLQotCi0vKiAwMDExIDEwMTEgc3NzcyAwMTEwIGltbTE2ICoqKiBvdXQgaW1tMTYscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJvdXQgaW1tMTYscnMiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0IixPUENfb3V0LDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNixDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwyNjN9LAotCi0KLS8qIDAwMTEgMTExMCBkZE4wIHNzc3MgKioqIG91dGIgQHJkLHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGIgQHJkLHJicyIsOCwwLAotMHgwNCwKLSNlbmRpZgotIm91dGIiLE9QQ19vdXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGUsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyNjR9LAotCi0KLS8qIDAwMTEgMTAxMCBzc3NzIDAxMTAgaW1tMTYgKioqIG91dGIgaW1tMTYscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0YiBpbW0xNixyYnMiLDgsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRiIixPUENfb3V0YiwwLHtDTEFTU19JTU0rKEFSR19JTU0xNiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzYsQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLDAsMCwwLDAsfSwyLDQsMjY1fSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAxMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIG91dGQgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGQgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRkIixPUENfb3V0ZCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMjY2fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAxMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIG91dGRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0ZGIgQHJkLEBycyxyYmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0ZGIiLE9QQ19vdXRkYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfQllURSsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMjY3fSwKLQotCi0vKiAwMDExIDEwMTEgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDEwMDAgKioqIG91dGkgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotIm91dGkgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRpIixPUENfb3V0aSwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDI2OH0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBvdXRpYiBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0aWIgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDQsCi0jZW5kaWYKLSJvdXRpYiIsT1BDX291dGliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMjY5fSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDAwMDAgKioqIG91dGliciBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ib3V0aWJyIEByZCxAcnMscmEiLDE2LDAsCi0weDA0LAotI2VuZGlmCi0ib3V0aWJyIixPUENfb3V0aWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMjcwfSwKLQotCi0vKiAwMDAxIDAxMTEgc3NOMCBkZE4wICoqKiBwb3AgQHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcCBAcmQsQHJzIiwxNiwxMiwKLTB4MDAsCi0jZW5kaWYKLSJwb3AiLE9QQ19wb3AsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHTjArKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI3MX0sCi0KLQotLyogMDEwMSAwMTExIHNzTjAgZGROMCBhZGRyZXNzX2RzdCAqKiogcG9wIGFkZHJlc3NfZHN0KHJkKSxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3AgYWRkcmVzc19kc3QocmQpLEBycyIsMTYsMTYsCi0weDAwLAotI2VuZGlmCi0icG9wIixPUENfcG9wLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyNzJ9LAotCi0KLS8qIDAxMDEgMDExMSBzc04wIDAwMDAgYWRkcmVzc19kc3QgKioqIHBvcCBhZGRyZXNzX2RzdCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwb3AgYWRkcmVzc19kc3QsQHJzIiwxNiwxNiwKLTB4MDAsCi0jZW5kaWYKLSJwb3AiLE9QQ19wb3AsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs3LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjczfSwKLQotCi0vKiAxMDAxIDAxMTEgc3NOMCBkZGRkICoqKiBwb3AgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wIHJkLEBycyIsMTYsOCwKLTB4MDAsCi0jZW5kaWYKLSJwb3AiLE9QQ19wb3AsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzcsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzR9LAotCi0KLS8qIDAwMDEgMDEwMSBzc04wIGRkTjAgKioqIHBvcGwgQHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcGwgQHJkLEBycyIsMzIsMTksCi0weDAwLAotI2VuZGlmCi0icG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHTjArKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDI3NX0sCi0KLQotLyogMDEwMSAwMTAxIHNzTjAgZGROMCBhZGRyZXNzX2RzdCAqKiogcG9wbCBhZGRyZXNzX2RzdChyZCksQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icG9wbCBhZGRyZXNzX2RzdChyZCksQHJzIiwzMiwyMywKLTB4MDAsCi0jZW5kaWYKLSJwb3BsIixPUENfcG9wbCwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMjc2fSwKLQotCi0vKiAwMTAxIDAxMDEgc3NOMCAwMDAwIGFkZHJlc3NfZHN0ICoqKiBwb3BsIGFkZHJlc3NfZHN0LEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcGwgYWRkcmVzc19kc3QsQHJzIiwzMiwyMywKLTB4MDAsCi0jZW5kaWYKLSJwb3BsIixPUENfcG9wbCwwLHtDTEFTU19EQSsoQVJHX0RTVCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyNzd9LAotCi0KLS8qIDEwMDEgMDEwMSBzc04wIGRkZGQgKioqIHBvcGwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInBvcGwgcnJkLEBycyIsMzIsMTIsCi0weDAwLAotI2VuZGlmCi0icG9wbCIsT1BDX3BvcGwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzUsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwyNzh9LAotCi0KLS8qIDAwMDEgMDAxMSBkZE4wIHNzTjAgKioqIHB1c2ggQHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2ggQHJkLEBycyIsMTYsMTMsCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI3OX0sCi0KLQotLyogMDEwMSAwMDExIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyAqKiogcHVzaCBAcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxhZGRyZXNzX3NyYyIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0icHVzaCIsT1BDX3B1c2gsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs1LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMjgwfSwKLQotCi0vKiAwMTAxIDAwMTEgZGROMCBzc04wIGFkZHJlc3Nfc3JjICoqKiBwdXNoIEByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxhZGRyZXNzX3NyYyhycykiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwyODF9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDEwMDEgaW1tMTYgKioqIHB1c2ggQHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaCBAcmQsaW1tMTYiLDE2LDEyLAotMHgwMCwKLSNlbmRpZgotInB1c2giLE9QQ19wdXNoLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDI4Mn0sCi0KLQotLyogMTAwMSAwMDExIGRkTjAgc3NzcyAqKiogcHVzaCBAcmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJwdXNoIEByZCxycyIsMTYsOSwKLTB4MDAsCi0jZW5kaWYKLSJwdXNoIixPUENfcHVzaCwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUcrKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI4M30sCi0KLQotLyogMDAwMSAwMDAxIGRkTjAgc3NOMCAqKiogcHVzaGwgQHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2hsIEByZCxAcnMiLDMyLDIwLAotMHgwMCwKLSNlbmRpZgotInB1c2hsIixPUENfcHVzaGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHTjArKEFSR19SUyksMCwwLDAsMCwwLH0sMiwyLDI4NH0sCi0KLQotLyogMDEwMSAwMDAxIGRkTjAgMDAwMCBhZGRyZXNzX3NyYyAqKiogcHVzaGwgQHJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icHVzaGwgQHJkLGFkZHJlc3Nfc3JjIiwzMiwyMSwKLTB4MDAsCi0jZW5kaWYKLSJwdXNobCIsT1BDX3B1c2hsLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4NX0sCi0KLQotLyogMDEwMSAwMDAxIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyAqKiogcHVzaGwgQHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2hsIEByZCxhZGRyZXNzX3NyYyhycykiLDMyLDIxLAotMHgwMCwKLSNlbmRpZgotInB1c2hsIixPUENfcHVzaGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDI4Nn0sCi0KLQotLyogMTAwMSAwMDAxIGRkTjAgc3NzcyAqKiogcHVzaGwgQHJkLHJycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInB1c2hsIEByZCxycnMiLDMyLDEyLAotMHgwMCwKLSNlbmRpZgotInB1c2hsIixPUENfcHVzaGwsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzEsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfUkVHKyhBUkdfUlMpLDAsMCwwLDAsMCx9LDIsMiwyODd9LAotCi0KLS8qIDAwMTAgMDAxMSBkZE4wIGltbTQgKioqIHJlcyBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyBAcmQsaW1tNCIsMTYsMTEsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjg4fSwKLQotCi0vKiAwMTEwIDAwMTEgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiByZXMgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgYWRkcmVzc19kc3QocmQpLGltbTQiLDE2LDE0LAotMHgwMCwKLSNlbmRpZgotInJlcyIsT1BDX3JlcywwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI4OX0sCi0KLQotLyogMDExMCAwMDExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzIGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXMgYWRkcmVzc19kc3QsaW1tNCIsMTYsMTMsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOTB9LAotCi0KLS8qIDEwMTAgMDAxMSBkZGRkIGltbTQgKioqIHJlcyByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzIHJkLGltbTQiLDE2LDQsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMHhhLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjkxfSwKLQotCi0vKiAwMDEwIDAwMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAgKioqIHJlcyByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJlcyByZCxycyIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0icmVzIixPUENfcmVzLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwyOTJ9LAotCi0KLS8qIDAwMTAgMDAxMCBkZE4wIGltbTQgKioqIHJlc2IgQHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIEByZCxpbW00Iiw4LDExLAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSwwLDAsMCwwLDAsfSwyLDIsMjkzfSwKLQotCi0vKiAwMTEwIDAwMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0ICoqKiByZXNiIGFkZHJlc3NfZHN0KHJkKSxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiBhZGRyZXNzX2RzdChyZCksaW1tNCIsOCwxNCwKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19YKyhBUkdfUkQpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDI5NH0sCi0KLQotLyogMDExMCAwMDEwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCAqKiogcmVzYiBhZGRyZXNzX2RzdCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzYiBhZGRyZXNzX2RzdCxpbW00Iiw4LDEzLAotMHgwMCwKLSNlbmRpZgotInJlc2IiLE9QQ19yZXNiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzYsQ0xBU1NfQklUKzIsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NNCksQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDIsNCwyOTV9LAotCi0KLS8qIDEwMTAgMDAxMCBkZGRkIGltbTQgKioqIHJlc2IgcmJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIHJiZCxpbW00Iiw4LDQsCi0weDAwLAotI2VuZGlmCi0icmVzYiIsT1BDX3Jlc2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwyOTZ9LAotCi0KLS8qIDAwMTAgMDAxMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogcmVzYiByYmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyZXNiIHJiZCxycyIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyZXNiIixPUENfcmVzYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMixDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMjk3fSwKLQotCi0vKiAxMDAwIDExMDEgZmxhZ3MgMDAxMSAqKiogcmVzZmxnIGZsYWdzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmVzZmxnIGZsYWdzIiwxNiw3LAotMHgzYywKLSNlbmRpZgotInJlc2ZsZyIsT1BDX3Jlc2ZsZywwLHtDTEFTU19GTEFHUyx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX0ZMQUdTLENMQVNTX0JJVCszLDAsMCwwLDAsMCx9LDEsMiwyOTh9LAotCi0KLS8qIDEwMDEgMTExMCAwMDAwIGNjY2MgKioqIHJldCBjYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJldCBjYyIsMTYsMTAsCi0weDAwLAotI2VuZGlmCi0icmV0IixPUENfcmV0LDAse0NMQVNTX0NDLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGUsQ0xBU1NfQklUKzAsQ0xBU1NfQ0MsMCwwLDAsMCwwLH0sMSwyLDI5OX0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDBJMCAqKiogcmwgcmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsIHJkLGltbTFvcjIiLDE2LDYsCi0weDNjLAotI2VuZGlmCi0icmwiLE9QQ19ybCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMiswLDAsMCwwLDAsMCx9LDIsMiwzMDB9LAotCi0KLS8qIDEwMTEgMDAxMCBkZGRkIDAwSTAgKioqIHJsYiByYmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsYiByYmQsaW1tMW9yMiIsOCw2LAotMHgzYywKLSNlbmRpZgotInJsYiIsT1BDX3JsYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMiswLDAsMCwwLDAsMCx9LDIsMiwzMDF9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDEwSTAgKioqIHJsYyByZCxpbW0xb3IyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icmxjIHJkLGltbTFvcjIiLDE2LDYsCi0weDNjLAotI2VuZGlmCi0icmxjIixPUENfcmxjLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTFPUjIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVF8xT1IyKzgsMCwwLDAsMCwwLH0sMiwyLDMwMn0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTBJMCAqKiogcmxjYiByYmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsY2IgcmJkLGltbTFvcjIiLDgsOSwKLTB4MTAsCi0jZW5kaWYKLSJybGNiIixPUENfcmxjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMis4LDAsMCwwLDAsMCx9LDIsMiwzMDN9LAotCi0KLS8qIDEwMTEgMTExMCBhYWFhIGJiYmIgKioqIHJsZGIgcmJiLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJsZGIgcmJiLHJiYSIsOCw5LAotMHgxMCwKLSNlbmRpZgotInJsZGIiLE9QQ19ybGRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHKyhBUkdfUkIpLDAsMCwwLDAsMCx9LDIsMiwzMDR9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAxSTAgKioqIHJyIHJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyciByZCxpbW0xb3IyIiwxNiw2LAotMHgzYywKLSNlbmRpZgotInJyIixPUENfcnIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrNCwwLDAsMCwwLDAsfSwyLDIsMzA1fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMUkwICoqKiBycmIgcmJkLGltbTFvcjIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJycmIgcmJkLGltbTFvcjIiLDgsNiwKLTB4M2MsCi0jZW5kaWYKLSJycmIiLE9QQ19ycmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMU9SMiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUXzFPUjIrNCwwLDAsMCwwLDAsfSwyLDIsMzA2fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMUkwICoqKiBycmMgcmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyYyByZCxpbW0xb3IyIiwxNiw2LAotMHgzYywKLSNlbmRpZgotInJyYyIsT1BDX3JyYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMisweGMsMCwwLDAsMCwwLH0sMiwyLDMwN30sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTFJMCAqKiogcnJjYiByYmQsaW1tMW9yMiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJyY2IgcmJkLGltbTFvcjIiLDgsOSwKLTB4MTAsCi0jZW5kaWYKLSJycmNiIixPUENfcnJjYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xT1IyKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCsyLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVRfMU9SMisweGMsMCwwLDAsMCwwLH0sMiwyLDMwOH0sCi0KLQotLyogMTAxMSAxMTAwIGFhYWEgYmJiYiAqKiogcnJkYiByYmIscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnJkYiByYmIscmJhIiw4LDksCi0weDEwLAotI2VuZGlmCi0icnJkYiIsT1BDX3JyZGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhjLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUcrKEFSR19SQiksMCwwLDAsMCwwLH0sMiwyLDMwOX0sCi0KLQotLyogMDAxMSAwMTEwIGltbTggKioqIHJzdmQzNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQzNiIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkMzYiLE9QQ19yc3ZkMzYsMCx7MH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs2LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxMH0sCi0KLQotLyogMDAxMSAxMDAwIGltbTggKioqIHJzdmQzOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQzOCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkMzgiLE9QQ19yc3ZkMzgsMCx7MH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCs4LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxMX0sCi0KLQotLyogMDExMSAxMDAwIGltbTggKioqIHJzdmQ3OCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQ3OCIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkNzgiLE9QQ19yc3ZkNzgsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCs4LENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxMn0sCi0KLQotLyogMDExMSAxMTEwIGltbTggKioqIHJzdmQ3ZSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmQ3ZSIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkN2UiLE9QQ19yc3ZkN2UsMCx7MH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGUsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzEzfSwKLQotCi0vKiAxMDAxIDExMDEgaW1tOCAqKiogcnN2ZDlkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZDlkIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmQ5ZCIsT1BDX3JzdmQ5ZCwwLHswfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzB4ZCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsMCwwLDAsMCx9LDAsMiwzMTR9LAotCi0KLS8qIDEwMDEgMTExMSBpbW04ICoqKiByc3ZkOWYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJyc3ZkOWYiLDgsMTAsCi0weDAwLAotI2VuZGlmCi0icnN2ZDlmIixPUENfcnN2ZDlmLDAsezB9LAotCXtDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxNX0sCi0KLQotLyogMTAxMSAxMDAxIGltbTggKioqIHJzdmRiOSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInJzdmRiOSIsOCwxMCwKLTB4MDAsCi0jZW5kaWYKLSJyc3ZkYjkiLE9QQ19yc3ZkYjksMCx7MH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwwLDIsMzE2fSwKLQotCi0vKiAxMDExIDExMTEgaW1tOCAqKiogcnN2ZGJmICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0icnN2ZGJmIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInJzdmRiZiIsT1BDX3JzdmRiZiwwLHswfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLDAsMCwwLH0sMCwyLDMxN30sCi0KLQotLyogMTAxMSAwMTExIHNzc3MgZGRkZCAqKiogc2JjIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2JjIHJkLHJzIiwxNiw1LAotMHgzYywKLSNlbmRpZgotInNiYyIsT1BDX3NiYywwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs3LENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDMxOH0sCi0KLQotLyogMTAxMSAwMTEwIHNzc3MgZGRkZCAqKiogc2JjYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2JjYiByYmQscmJzIiw4LDUsCi0weDNmLAotI2VuZGlmCi0ic2JjYiIsT1BDX3NiY2IsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrNixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzMTl9LAotCi0KLS8qIDAxMTEgMTExMSBpbW04ICoqKiBzYyBpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2MgaW1tOCIsOCwzMywKLTB4M2YsCi0jZW5kaWYKLSJzYyIsT1BDX3NjLDAse0NMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCs3LENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsMCwwLDAsfSwxLDIsMzIwfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkYSByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNkYSByZCxycyIsMTYsMTUsCi0weDNjLAotI2VuZGlmCi0ic2RhIixPUENfc2RhLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzIxfSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAxMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkYWIgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RhYiByYmQscnMiLDgsMTUsCi0weDNjLAotI2VuZGlmCi0ic2RhYiIsT1BDX3NkYWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjJ9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDExMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RhbCBycmQscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZGFsIHJyZCxycyIsMzIsMTUsCi0weDNjLAotI2VuZGlmCi0ic2RhbCIsT1BDX3NkYWwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMjN9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCAqKiogc2RsIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RsIHJkLHJzIiwxNiwxNSwKLTB4MzgsCi0jZW5kaWYKLSJzZGwiLE9QQ19zZGwsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzI0fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkbGIgcmJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RsYiByYmQscnMiLDgsMTUsCi0weDM4LAotI2VuZGlmCi0ic2RsYiIsT1BDX3NkbGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX0JJVCswLDAsfSwyLDQsMzI1fSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAwMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAgKioqIHNkbGwgcnJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2RsbCBycmQscnMiLDMyLDE1LAotMHgzOCwKLSNlbmRpZgotInNkbGwiLE9QQ19zZGxsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs3LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMyNn0sCi0KLQotLyogMDAxMCAwMTAxIGRkTjAgaW1tNCAqKiogc2V0IEByZCxpbW00ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IEByZCxpbW00IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMjd9LAotCi0KLS8qIDAxMTAgMDEwMSBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIHNldCBhZGRyZXNzX2RzdChyZCksaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCBhZGRyZXNzX2RzdChyZCksaW1tNCIsMTYsMTQsCi0weDAwLAotI2VuZGlmCi0ic2V0IixPUENfc2V0LDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs1LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzI4fSwKLQotCi0vKiAwMTEwIDAxMDEgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXQgYWRkcmVzc19kc3QsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldCBhZGRyZXNzX2RzdCxpbW00IiwxNiwxMywKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNSxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMyOX0sCi0KLQotLyogMTAxMCAwMTAxIGRkZGQgaW1tNCAqKiogc2V0IHJkLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXQgcmQsaW1tNCIsMTYsNCwKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzUsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMzB9LAotCi0KLS8qIDAwMTAgMDEwMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCAqKiogc2V0IHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2V0IHJkLHJzIiwxNiwxMCwKLTB4MDAsCi0jZW5kaWYKLSJzZXQiLE9QQ19zZXQsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzIsQ0xBU1NfQklUKzUsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCwwLH0sMiw0LDMzMX0sCi0KLQotLyogMDAxMCAwMTAwIGRkTjAgaW1tNCAqKiogc2V0YiBAcmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgQHJkLGltbTQiLDgsMTEsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLDAsMCwwLDAsMCx9LDIsMiwzMzJ9LAotCi0KLS8qIDAxMTAgMDEwMCBkZE4wIGltbTQgYWRkcmVzc19kc3QgKioqIHNldGIgYWRkcmVzc19kc3QocmQpLGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00Iiw4LDE0LAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX1grKEFSR19SRCksQ0xBU1NfSU1NICsoQVJHX0lNTTQpLH0sCi0Je0NMQVNTX0JJVCs2LENMQVNTX0JJVCs0LENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTQpLENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwyLDQsMzMzfSwKLQotCi0vKiAwMTEwIDAxMDAgMDAwMCBpbW00IGFkZHJlc3NfZHN0ICoqKiBzZXRiIGFkZHJlc3NfZHN0LGltbTQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRiIGFkZHJlc3NfZHN0LGltbTQiLDgsMTMsCi0weDAwLAotI2VuZGlmCi0ic2V0YiIsT1BDX3NldGIsMCx7Q0xBU1NfREErKEFSR19EU1QpLENMQVNTX0lNTSArKEFSR19JTU00KSx9LAotCXtDTEFTU19CSVQrNixDTEFTU19CSVQrNCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU00KSxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMiw0LDMzNH0sCi0KLQotLyogMTAxMCAwMTAwIGRkZGQgaW1tNCAqKiogc2V0YiByYmQsaW1tNCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgcmJkLGltbTQiLDgsNCwKLTB4MDAsCi0jZW5kaWYKLSJzZXRiIixPUENfc2V0YiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0gKyhBUkdfSU1NNCksfSwKLQl7Q0xBU1NfQklUKzB4YSxDTEFTU19CSVQrNCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NNCksMCwwLDAsMCwwLH0sMiwyLDMzNX0sCi0KLQotLyogMDAxMCAwMTAwIDAwMDAgc3NzcyAwMDAwIGRkZGQgMDAwMCAwMDAwICoqKiBzZXRiIHJiZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNldGIgcmJkLHJzIiw4LDEwLAotMHgwMCwKLSNlbmRpZgotInNldGIiLE9QQ19zZXRiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1JFR19XT1JEKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCsyLENMQVNTX0JJVCs0LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsMCx9LDIsNCwzMzZ9LAotCi0KLS8qIDEwMDAgMTEwMSBmbGFncyAwMDAxICoqKiBzZXRmbGcgZmxhZ3MgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzZXRmbGcgZmxhZ3MiLDE2LDcsCi0weDNjLAotI2VuZGlmCi0ic2V0ZmxnIixPUENfc2V0ZmxnLDAse0NMQVNTX0ZMQUdTLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfRkxBR1MsQ0xBU1NfQklUKzEsMCwwLDAsMCwwLH0sMSwyLDMzN30sCi0KLQotLyogMDAxMSAxMDEwIGRkZGQgMDEwMSBpbW0xNiAqKiogc2luYiByYmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5iIHJiZCxpbW0xNiIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNpbmIiLE9QQ19zaW5iLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzMzh9LAotCi0KLS8qIDAwMTEgMTAxMSBkZGRkIDAxMDEgaW1tMTYgKioqIHNpbmIgcmQsaW1tMTYgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5iIHJkLGltbTE2Iiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic2luYiIsT1BDX3NpbmIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDMzOX0sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMTAwMCAwMDAxIGFhYWEgZGROMCAxMDAwICoqKiBzaW5kIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5kIEByZCxAcnMscmEiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic2luZCIsT1BDX3NpbmQsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNDB9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDEwMDAgMDAwMSBhYWFhIGRkTjAgMTAwMCAqKiogc2luZGIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzaW5kYiBAcmQsQHJzLHJiYSIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNpbmRiIixPUENfc2luZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMSxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNDF9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMDEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc2luaWIgQHJkLEBycyxyYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNpbmliIEByZCxAcnMscmEiLDgsMCwKLTB4MDAsCi0jZW5kaWYKLSJzaW5pYiIsT1BDX3NpbmliLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsfSwzLDQsMzQyfSwKLQotCi0vKiAwMDExIDEwMTAgc3NOMCAwMDAxIDAwMDAgYWFhYSBkZE4wIDAwMDAgKioqIHNpbmliciBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2luaWJyIEByZCxAcnMscmEiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic2luaWJyIixPUENfc2luaWJyLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkEpLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCswLDAsfSwzLDQsMzQzfSwKLQotCi0vKiAxMDExIDAwMTEgZGRkZCAxMDAxIDAwMDAgMDAwMCBpbW04ICoqKiBzbGEgcmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsYSByZCxpbW04IiwxNiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzbGEiLE9QQ19zbGEsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0NH0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTAwMSAgMDAwMCAwMDAwIGltbTggKioqIHNsYWIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGFiIHJiZCxpbW04Iiw4LDEzLAotMHgzYywKLSNlbmRpZgotInNsYWIiLE9QQ19zbGFiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDV9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDExMDEgMDAwMCAwMDAwIGltbTggKioqIHNsYWwgcnJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzbGFsIHJyZCxpbW04IiwzMiwxMywKLTB4M2MsCi0jZW5kaWYKLSJzbGFsIixPUENfc2xhbCwwLHtDTEFTU19SRUdfTE9ORysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDZ9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAwMDEgMDAwMCAwMDAwIGltbTggKioqIHNsbCByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic2xsIHJkLGltbTgiLDE2LDEzLAotMHgzOCwKLSNlbmRpZgotInNsbCIsT1BDX3NsbCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19JTU0rKEFSR19JTU04KSwwLDAsfSwyLDQsMzQ3fSwKLQotCi0vKiAxMDExIDAwMTAgZGRkZCAwMDAxICAwMDAwIDAwMDAgaW1tOCAqKiogc2xsYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsbGIgcmJkLGltbTgiLDgsMTMsCi0weDM4LAotI2VuZGlmCi0ic2xsYiIsT1BDX3NsbGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLH0sMiw0LDM0OH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDEwMSAwMDAwIDAwMDAgaW1tOCAqKiogc2xsbCBycmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNsbGwgcnJkLGltbTgiLDMyLDEzLAotMHgzOCwKLSNlbmRpZgotInNsbGwiLE9QQ19zbGxsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0JJVCswLENMQVNTX0JJVCswLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCx9LDIsNCwzNDl9LAotCi0KLS8qIDAwMTEgMTAxMSBzc3NzIDAxMTEgaW1tMTYgKioqIHNvdXQgaW1tMTYscnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0IGltbTE2LHJzIiwxNiwwLAotMHgwMCwKLSNlbmRpZgotInNvdXQiLE9QQ19zb3V0LDAse0NMQVNTX0lNTSsoQVJHX0lNTTE2KSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhiLENMQVNTX1JFRysoQVJHX1JTKSxDTEFTU19CSVQrNyxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCwzNTB9LAotCi0KLS8qIDAwMTEgMTAxMCBzc3NzIDAxMTEgaW1tMTYgKioqIHNvdXRiIGltbTE2LHJicyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNvdXRiIGltbTE2LHJicyIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRiIixPUENfc291dGIsMCx7Q0xBU1NfSU1NKyhBUkdfSU1NMTYpLENMQVNTX1JFR19CWVRFKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX0JJVCs3LENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDM1MX0sCi0KLQotLyogMDAxMSAxMDExIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwICoqKiBzb3V0ZCBAcmQsQHJzLHJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGQgQHJkLEBycyxyYSIsMTYsMCwKLTB4MDAsCi0jZW5kaWYKLSJzb3V0ZCIsT1BDX3NvdXRkLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19XT1JEKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNTJ9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc291dGRiIEByZCxAcnMscmJhICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic291dGRiIEByZCxAcnMscmJhIiw4LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGRiIixPUENfc291dGRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCszLENMQVNTX0JJVCsweGEsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzB4YixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCx9LDMsNCwzNTN9LAotCi0KLS8qIDAwMTEgMTAxMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCAqKiogc291dGliIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0aWIgQHJkLEBycyxyYSIsOCwwLAotMHgwMCwKLSNlbmRpZgotInNvdXRpYiIsT1BDX3NvdXRpYiwwLHtDTEFTU19JUisoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSxDTEFTU19SRUdfV09SRCsoQVJHX1JBKSx9LAotCXtDTEFTU19CSVQrMyxDTEFTU19CSVQrMHhhLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JBKSxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCwwLH0sMyw0LDM1NH0sCi0KLQotLyogMDAxMSAxMDEwIHNzTjAgMDAxMSAwMDAwIGFhYWEgZGROMCAwMDAwICoqKiBzb3V0aWJyIEByZCxAcnMscmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzb3V0aWJyIEByZCxAcnMscmEiLDE2LDAsCi0weDAwLAotI2VuZGlmCi0ic291dGliciIsT1BDX3NvdXRpYnIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX1dPUkQrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzMsQ0xBU1NfQklUKzB4YSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19CSVQrMyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzAsMCx9LDMsNCwzNTV9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDEwMDEgMTExMSAxMTExIG5pbTggKioqIHNyYSByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JhIHJkLGltbTgiLDE2LDEzLAotMHgzYywKLSNlbmRpZgotInNyYSIsT1BDX3NyYSwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrOSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM1Nn0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMTAwMSAwMDAwIDAwMDAgbmltOCAqKiogc3JhYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNyYWIgcmJkLGltbTgiLDgsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JhYiIsT1BDX3NyYWIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzksQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM1N30sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMTEwMSAxMTExIDExMTEgbmltOCAqKiogc3JhbCBycmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNyYWwgcnJkLGltbTgiLDMyLDEzLAotMHgzYywKLSNlbmRpZgotInNyYWwiLE9QQ19zcmFsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCsweGQsQ0xBU1NfQklUKzB4ZixDTEFTU19CSVQrMHhmLENMQVNTX0lNTSsoQVJHX05JTTgpLDAsMCx9LDIsNCwzNTh9LAotCi0KLS8qIDEwMTEgMDAxMSBkZGRkIDAwMDEgMTExMSAxMTExIG5pbTggKioqIHNybCByZCxpbW04ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3JsIHJkLGltbTgiLDE2LDEzLAotMHgzYywKLSNlbmRpZgotInNybCIsT1BDX3NybCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCszLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrMSxDTEFTU19CSVQrMHhmLENMQVNTX0JJVCsweGYsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM1OX0sCi0KLQotLyogMTAxMSAwMDEwIGRkZGQgMDAwMSAwMDAwIDAwMDAgbmltOCAqKiogc3JsYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNybGIgcmJkLGltbTgiLDgsMTMsCi0weDNjLAotI2VuZGlmCi0ic3JsYiIsT1BDX3NybGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzEsQ0xBU1NfQklUKzAsQ0xBU1NfQklUKzAsQ0xBU1NfSU1NKyhBUkdfTklNOCksMCwwLH0sMiw0LDM2MH0sCi0KLQotLyogMTAxMSAwMDExIGRkZGQgMDEwMSAxMTExIDExMTEgbmltOCAqKiogc3JsbCBycmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInNybGwgcnJkLGltbTgiLDMyLDEzLAotMHgzYywKLSNlbmRpZgotInNybGwiLE9QQ19zcmxsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs1LENMQVNTX0JJVCsweGYsQ0xBU1NfQklUKzB4ZixDTEFTU19JTU0rKEFSR19OSU04KSwwLDAsfSwyLDQsMzYxfSwKLQotCi0vKiAwMDAwIDAwMTEgc3NOMCBkZGRkICoqKiBzdWIgcmQsQHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLEBycyIsMTYsNywKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzMsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNjJ9LAotCi0KLS8qIDAxMDAgMDAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YiByZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxhZGRyZXNzX3NyYyIsMTYsOSwKLTB4M2MsCi0jZW5kaWYKLSJzdWIiLE9QQ19zdWIsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCszLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2M30sCi0KLQotLyogMDEwMCAwMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViIHJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YiByZCxhZGRyZXNzX3NyYyhycykiLDE2LDEwLAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCszLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2NH0sCi0KLQotLyogMDAwMCAwMDExIDAwMDAgZGRkZCBpbW0xNiAqKiogc3ViIHJkLGltbTE2ICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLGltbTE2IiwxNiw3LAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzMsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTE2KSwwLDAsMCwwLH0sMiw0LDM2NX0sCi0KLQotLyogMTAwMCAwMDExIHNzc3MgZGRkZCAqKiogc3ViIHJkLHJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViIHJkLHJzIiwxNiw0LAotMHgzYywKLSNlbmRpZgotInN1YiIsT1BDX3N1YiwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSxDTEFTU19SRUdfV09SRCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMyxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNjZ9LAotCi0KLS8qIDAwMDAgMDAxMCBzc04wIGRkZGQgKioqIHN1YmIgcmJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLEBycyIsOCw3LAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsyLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzY3fSwKLQotCi0vKiAwMTAwIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiBzdWJiIHJiZCxhZGRyZXNzX3NyYyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLGFkZHJlc3Nfc3JjIiw4LDksCi0weDNmLAotI2VuZGlmCi0ic3ViYiIsT1BDX3N1YmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfREErKEFSR19TUkMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDM2OH0sCi0KLQotLyogMDEwMCAwMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyAqKiogc3ViYiByYmQsYWRkcmVzc19zcmMocnMpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3ViYiByYmQsYWRkcmVzc19zcmMocnMpIiw4LDEwLAotMHgzZiwKLSNlbmRpZgotInN1YmIiLE9QQ19zdWJiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX1grKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0FERFJFU1MrKEFSR19TUkMpLDAsMCwwLDAsfSwyLDQsMzY5fSwKLQotCi0vKiAwMDAwIDAwMTAgMDAwMCBkZGRkIGltbTggaW1tOCAqKiogc3ViYiByYmQsaW1tOCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmIgcmJkLGltbTgiLDgsNywKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU04KSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksMCwwLDAsfSwyLDQsMzcwfSwKLQotCi0vKiAxMDAwIDAwMTAgc3NzcyBkZGRkICoqKiBzdWJiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJiIHJiZCxyYnMiLDgsNCwKLTB4M2YsCi0jZW5kaWYKLSJzdWJiIixPUENfc3ViYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMixDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNzF9LAotCi0KLS8qIDAwMDEgMDAxMCBzc04wIGRkZGQgKioqIHN1YmwgcnJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLEBycyIsMzIsMTQsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzEsQ0xBU1NfQklUKzIsQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiwzNzJ9LAotCi0KLS8qIDAxMDEgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmwgcnJkLGFkZHJlc3Nfc3JjICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQsYWRkcmVzc19zcmMiLDMyLDE1LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNzN9LAotCi0KLS8qIDAxMDEgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHN1YmwgcnJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInN1YmwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsMzIsMTYsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNSxDTEFTU19CSVQrMixDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCwzNzR9LAotCi0KLS8qIDAwMDEgMDAxMCAwMDAwIGRkZGQgaW1tMzIgKioqIHN1YmwgcnJkLGltbTMyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ic3VibCBycmQsaW1tMzIiLDMyLDE0LAotMHgzYywKLSNlbmRpZgotInN1YmwiLE9QQ19zdWJsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTMyKSx9LAotCXtDTEFTU19CSVQrMSxDTEFTU19CSVQrMixDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMzIpLDAsMCwwLDAsfSwyLDYsMzc1fSwKLQotCi0vKiAxMDAxIDAwMTAgc3NzcyBkZGRkICoqKiBzdWJsIHJyZCxycnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJzdWJsIHJyZCxycnMiLDMyLDgsCi0weDNjLAotI2VuZGlmCi0ic3VibCIsT1BDX3N1YmwsMCx7Q0xBU1NfUkVHX0xPTkcrKEFSR19SRCksQ0xBU1NfUkVHX0xPTkcrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzksQ0xBU1NfQklUKzIsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsMzc2fSwKLQotCi0vKiAxMDEwIDExMTEgZGRkZCBjY2NjICoqKiB0Y2MgY2MscmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0Y2MgY2MscmQiLDE2LDUsCi0weDAwLAotI2VuZGlmCi0idGNjIixPUENfdGNjLDAse0NMQVNTX0NDLENMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4ZixDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCwwLDAsMCwwLH0sMiwyLDM3N30sCi0KLQotLyogMTAxMCAxMTEwIGRkZGQgY2NjYyAqKiogdGNjYiBjYyxyYmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0Y2NiIGNjLHJiZCIsOCw1LAotMHgwMCwKLSNlbmRpZgotInRjY2IiLE9QQ190Y2NiLDAse0NMQVNTX0NDLENMQVNTX1JFR19CWVRFKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzB4ZSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQ0MsMCwwLDAsMCwwLH0sMiwyLDM3OH0sCi0KLQotLyogMDAwMCAxMTAxIGRkTjAgMDEwMCAqKiogdGVzdCBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0IEByZCIsMTYsOCwKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0IixPUENfdGVzdCwwLHtDTEFTU19JUisoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LDAsMCwwLDAsMCx9LDEsMiwzNzl9LAotCi0KLS8qIDAxMDAgMTEwMSAwMDAwIDAxMDAgYWRkcmVzc19kc3QgKioqIHRlc3QgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0IGFkZHJlc3NfZHN0IiwxNiwxMSwKLTB4MDAsCi0jZW5kaWYKLSJ0ZXN0IixPUENfdGVzdCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzQsQ0xBU1NfQklUKzB4ZCxDTEFTU19CSVQrMCxDTEFTU19CSVQrNCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4MH0sCi0KLQotLyogMDEwMCAxMTAxIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdCBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0IGFkZHJlc3NfZHN0KHJkKSIsMTYsMTIsCi0weDAwLAotI2VuZGlmCi0idGVzdCIsT1BDX3Rlc3QsMCx7Q0xBU1NfWCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX1JFR04wKyhBUkdfUkQpLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzgxfSwKLQotCi0vKiAxMDAwIDExMDEgZGRkZCAwMTAwICoqKiB0ZXN0IHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdCByZCIsMTYsNywKLTB4MDAsCi0jZW5kaWYKLSJ0ZXN0IixPUENfdGVzdCwwLHtDTEFTU19SRUdfV09SRCsoQVJHX1JEKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrMHhkLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19CSVQrNCwwLDAsMCwwLDAsfSwxLDIsMzgyfSwKLQotCi0vKiAwMDAwIDExMDAgZGROMCAwMTAwICoqKiB0ZXN0YiBAcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0YiBAcmQiLDgsOCwKLTB4MWMsCi0jZW5kaWYKLSJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM4M30sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDEwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0YiBhZGRyZXNzX2RzdCIsOCwxMSwKLTB4MWMsCi0jZW5kaWYKLSJ0ZXN0YiIsT1BDX3Rlc3RiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs0LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsMzg0fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMTAwIGFkZHJlc3NfZHN0ICoqKiB0ZXN0YiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0YiBhZGRyZXNzX2RzdChyZCkiLDgsMTIsCi0weDFjLAotI2VuZGlmCi0idGVzdGIiLE9QQ190ZXN0YiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCwzODV9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDAxMDAgKioqIHRlc3RiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRlc3RiIHJiZCIsOCw3LAotMHgxYywKLSNlbmRpZgotInRlc3RiIixPUENfdGVzdGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzQsMCwwLDAsMCwwLH0sMSwyLDM4Nn0sCi0KLQotLyogMDAwMSAxMTAwIGRkTjAgMTAwMCAqKiogdGVzdGwgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGwgQHJkIiwzMiwxMywKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0bCIsT1BDX3Rlc3RsLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCsxLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzgsMCwwLDAsMCwwLH0sMSwyLDM4N30sCi0KLQotLyogMDEwMSAxMTAwIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGwgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0ZXN0bCBhZGRyZXNzX2RzdCIsMzIsMTYsCi0weDE4LAotI2VuZGlmCi0idGVzdGwiLE9QQ190ZXN0bCwwLHtDTEFTU19EQSsoQVJHX0RTVCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4OH0sCi0KLQotLyogMDEwMSAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCAqKiogdGVzdGwgYWRkcmVzc19kc3QocmQpICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGwgYWRkcmVzc19kc3QocmQpIiwzMiwxNywKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0bCIsT1BDX3Rlc3RsLDAse0NMQVNTX1grKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzUsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCxDTEFTU19BRERSRVNTKyhBUkdfRFNUKSwwLDAsMCwwLH0sMSw0LDM4OX0sCi0KLQotLyogMTAwMSAxMTAwIGRkZGQgMTAwMCAqKiogdGVzdGwgcnJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idGVzdGwgcnJkIiwzMiwxMywKLTB4MTgsCi0jZW5kaWYKLSJ0ZXN0bCIsT1BDX3Rlc3RsLDAse0NMQVNTX1JFR19MT05HKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs5LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs4LDAsMCwwLDAsMCx9LDEsMiwzOTB9LAotCi0KLS8qIDEwMTEgMTAwMCBkZE4wIDEwMDAgMDAwMCBhYWFhIHNzTjAgMDAwMCAqKiogdHJkYiBAcmQsQHJzLHJiYSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRyZGIgQHJkLEBycyxyYmEiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJkYiIsT1BDX3RyZGIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTF9LAotCi0KLS8qIDEwMTEgMTAwMCBkZE4wIDExMDAgMDAwMCBhYWFhIHNzTjAgMDAwMCAqKiogdHJkcmIgQHJkLEBycyxyYmEgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cmRyYiBAcmQsQHJzLHJiYSIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cmRyYiIsT1BDX3RyZHJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUkEpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzB4YyxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SQSksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTJ9LAotCi0KLS8qIDEwMTEgMTAwMCBkZE4wIDAwMDAgMDAwMCBycnJyIHNzTjAgMDAwMCAqKiogdHJpYiBAcmQsQHJzLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRyaWIgQHJkLEBycyxyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJpYiIsT1BDX3RyaWIsMCx7Q0xBU1NfSVIrKEFSR19SRCksQ0xBU1NfSVIrKEFSR19SUyksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JEKSxDTEFTU19CSVQrMCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SUiksQ0xBU1NfUkVHTjArKEFSR19SUyksQ0xBU1NfQklUKzAsMCx9LDMsNCwzOTN9LAotCi0KLS8qIDEwMTEgMTAwMCBkZE4wIDAxMDAgMDAwMCBycnJyIHNzTjAgMDAwMCAqKiogdHJpcmIgQHJkLEBycyxyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cmlyYiBAcmQsQHJzLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cmlyYiIsT1BDX3RyaXJiLDAse0NMQVNTX0lSKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzQsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX0JJVCswLDAsfSwzLDQsMzk0fSwKLQotCi0vKiAxMDExIDEwMDAgYWFOMCAxMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAgKioqIHRydGRiIEByYSxAcmIscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJ0ZGIgQHJhLEByYixyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJ0ZGIiLE9QQ190cnRkYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCsweGEsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkIpLENMQVNTX0JJVCswLDAsfSwzLDQsMzk1fSwKLQotCi0vKiAxMDExIDEwMDAgYWFOMCAxMTEwIDAwMDAgcnJyciBiYk4wIDExMTAgKioqIHRydGRyYiBAcmEsQHJiLHJiciAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRydGRyYiBAcmEsQHJiLHJiciIsOCwyNSwKLTB4MWMsCi0jZW5kaWYKLSJ0cnRkcmIiLE9QQ190cnRkcmIsMCx7Q0xBU1NfSVIrKEFSR19SQSksQ0xBU1NfSVIrKEFSR19SQiksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUiksfSwKLQl7Q0xBU1NfQklUKzB4YixDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JBKSxDTEFTU19CSVQrMHhlLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMHhlLDAsfSwzLDQsMzk2fSwKLQotCi0vKiAxMDExIDEwMDAgYWFOMCAwMDEwIDAwMDAgcnJyciBiYk4wIDAwMDAgKioqIHRydGliIEByYSxAcmIscmJyICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHJ0aWIgQHJhLEByYixyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJ0aWIiLE9QQ190cnRpYiwwLHtDTEFTU19JUisoQVJHX1JBKSxDTEFTU19JUisoQVJHX1JCKSxDTEFTU19SRUdfQllURSsoQVJHX1JSKSx9LAotCXtDTEFTU19CSVQrMHhiLENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUkEpLENMQVNTX0JJVCsyLENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JSKSxDTEFTU19SRUdOMCsoQVJHX1JCKSxDTEFTU19CSVQrMCwwLH0sMyw0LDM5N30sCi0KLQotLyogMTAxMSAxMDAwIGFhTjAgMDExMCAwMDAwIHJycnIgYmJOMCAxMTEwICoqKiB0cnRpcmIgQHJhLEByYixyYnIgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0cnRpcmIgQHJhLEByYixyYnIiLDgsMjUsCi0weDFjLAotI2VuZGlmCi0idHJ0aXJiIixPUENfdHJ0aXJiLDAse0NMQVNTX0lSKyhBUkdfUkEpLENMQVNTX0lSKyhBUkdfUkIpLENMQVNTX1JFR19CWVRFKyhBUkdfUlIpLH0sCi0Je0NMQVNTX0JJVCsweGIsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHTjArKEFSR19SQSksQ0xBU1NfQklUKzYsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUlIpLENMQVNTX1JFR04wKyhBUkdfUkIpLENMQVNTX0JJVCsweGUsMCx9LDMsNCwzOTh9LAotCi0KLS8qIDAwMDAgMTEwMSBkZE4wIDAxMTAgKioqIHRzZXQgQHJkICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0idHNldCBAcmQiLDE2LDExLAotMHgwOCwKLSNlbmRpZgotInRzZXQiLE9QQ190c2V0LDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzYsMCwwLDAsMCwwLH0sMSwyLDM5OX0sCi0KLQotLyogMDEwMCAxMTAxIDAwMDAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldCBhZGRyZXNzX2RzdCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXQgYWRkcmVzc19kc3QiLDE2LDE0LAotMHgwOCwKLSNlbmRpZgotInRzZXQiLE9QQ190c2V0LDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhkLENMQVNTX0JJVCswLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDAwfSwKLQotCi0vKiAwMTAwIDExMDEgZGROMCAwMTEwIGFkZHJlc3NfZHN0ICoqKiB0c2V0IGFkZHJlc3NfZHN0KHJkKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXQgYWRkcmVzc19kc3QocmQpIiwxNiwxNSwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0IixPUENfdHNldCwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzYsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MDF9LAotCi0KLS8qIDEwMDAgMTEwMSBkZGRkIDAxMTAgKioqIHRzZXQgcmQgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0IHJkIiwxNiw3LAotMHgwOCwKLSNlbmRpZgotInRzZXQiLE9QQ190c2V0LDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs4LENMQVNTX0JJVCsweGQsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0JJVCs2LDAsMCwwLDAsMCx9LDEsMiw0MDJ9LAotCi0KLS8qIDAwMDAgMTEwMCBkZE4wIDAxMTAgKioqIHRzZXRiIEByZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXRiIEByZCIsOCwxMSwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX0lSKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzYsMCwwLDAsMCwwLH0sMSwyLDQwM30sCi0KLQotLyogMDEwMCAxMTAwIDAwMDAgMDExMCBhZGRyZXNzX2RzdCAqKiogdHNldGIgYWRkcmVzc19kc3QgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0YiBhZGRyZXNzX2RzdCIsOCwxNCwKLTB4MDgsCi0jZW5kaWYKLSJ0c2V0YiIsT1BDX3RzZXRiLDAse0NMQVNTX0RBKyhBUkdfRFNUKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrMHhjLENMQVNTX0JJVCswLENMQVNTX0JJVCs2LENMQVNTX0FERFJFU1MrKEFSR19EU1QpLDAsMCwwLDAsfSwxLDQsNDA0fSwKLQotCi0vKiAwMTAwIDExMDAgZGROMCAwMTEwIGFkZHJlc3NfZHN0ICoqKiB0c2V0YiBhZGRyZXNzX2RzdChyZCkgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ0c2V0YiBhZGRyZXNzX2RzdChyZCkiLDgsMTUsCi0weDA4LAotI2VuZGlmCi0idHNldGIiLE9QQ190c2V0YiwwLHtDTEFTU19YKyhBUkdfUkQpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCsweGMsQ0xBU1NfUkVHTjArKEFSR19SRCksQ0xBU1NfQklUKzYsQ0xBU1NfQUREUkVTUysoQVJHX0RTVCksMCwwLDAsMCx9LDEsNCw0MDV9LAotCi0KLS8qIDEwMDAgMTEwMCBkZGRkIDAxMTAgKioqIHRzZXRiIHJiZCAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInRzZXRiIHJiZCIsOCw3LAotMHgwOCwKLSNlbmRpZgotInRzZXRiIixPUENfdHNldGIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzB4YyxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQklUKzYsMCwwLDAsMCwwLH0sMSwyLDQwNn0sCi0KLQotLyogMDAwMCAxMDAxIHNzTjAgZGRkZCAqKiogeG9yIHJkLEBycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxAcnMiLDE2LDcsCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0lSKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs5LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDA3fSwKLQotCi0vKiAwMTAwIDEwMDEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjICoqKiB4b3IgcmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQsYWRkcmVzc19zcmMiLDE2LDksCi0weDE4LAotI2VuZGlmCi0ieG9yIixPUENfeG9yLDAse0NMQVNTX1JFR19XT1JEKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOSxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MDh9LAotCi0KLS8qIDAxMDAgMTAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvciByZCxhZGRyZXNzX3NyYyhycykgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3IgcmQsYWRkcmVzc19zcmMocnMpIiwxNiwxMCwKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfWCsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOSxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MDl9LAotCi0KLS8qIDAwMDAgMTAwMSAwMDAwIGRkZGQgaW1tMTYgKioqIHhvciByZCxpbW0xNiAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxpbW0xNiIsMTYsNywKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NMTYpLH0sCi0Je0NMQVNTX0JJVCswLENMQVNTX0JJVCs5LENMQVNTX0JJVCswLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19JTU0rKEFSR19JTU0xNiksMCwwLDAsMCx9LDIsNCw0MTB9LAotCi0KLS8qIDEwMDAgMTAwMSBzc3NzIGRkZGQgKioqIHhvciByZCxycyAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvciByZCxycyIsMTYsNCwKLTB4MTgsCi0jZW5kaWYKLSJ4b3IiLE9QQ194b3IsMCx7Q0xBU1NfUkVHX1dPUkQrKEFSR19SRCksQ0xBU1NfUkVHX1dPUkQrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzksQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDExfSwKLQotCi0vKiAwMDAwIDEwMDAgc3NOMCBkZGRkICoqKiB4b3JiIHJiZCxAcnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxAcnMiLDgsNywKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19JUisoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrMCxDTEFTU19CSVQrOCxDTEFTU19SRUdOMCsoQVJHX1JTKSxDTEFTU19SRUcrKEFSR19SRCksMCwwLDAsMCwwLH0sMiwyLDQxMn0sCi0KLQotLyogMDEwMCAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyAqKiogeG9yYiByYmQsYWRkcmVzc19zcmMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxhZGRyZXNzX3NyYyIsOCw5LAotMHgxYywKLSNlbmRpZgotInhvcmIiLE9QQ194b3JiLDAse0NMQVNTX1JFR19CWVRFKyhBUkdfUkQpLENMQVNTX0RBKyhBUkdfU1JDKSx9LAotCXtDTEFTU19CSVQrNCxDTEFTU19CSVQrOCxDTEFTU19CSVQrMCxDTEFTU19SRUcrKEFSR19SRCksQ0xBU1NfQUREUkVTUysoQVJHX1NSQyksMCwwLDAsMCx9LDIsNCw0MTN9LAotCi0KLS8qIDAxMDAgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMgKioqIHhvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSAqLwotewotI2lmZGVmIE5JQ0VOQU1FUwotInhvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsOCwxMCwKLTB4MWMsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19YKyhBUkdfUlMpLH0sCi0Je0NMQVNTX0JJVCs0LENMQVNTX0JJVCs4LENMQVNTX1JFR04wKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSxDTEFTU19BRERSRVNTKyhBUkdfU1JDKSwwLDAsMCwwLH0sMiw0LDQxNH0sCi0KLQotLyogMDAwMCAxMDAwIDAwMDAgZGRkZCBpbW04IGltbTggKioqIHhvcmIgcmJkLGltbTggKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxpbW04Iiw4LDcsCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfSU1NKyhBUkdfSU1NOCksfSwKLQl7Q0xBU1NfQklUKzAsQ0xBU1NfQklUKzgsQ0xBU1NfQklUKzAsQ0xBU1NfUkVHKyhBUkdfUkQpLENMQVNTX0lNTSsoQVJHX0lNTTgpLENMQVNTX0lNTSsoQVJHX0lNTTgpLDAsMCwwLH0sMiw0LDQxNX0sCi0KLQotLyogMTAwMCAxMDAwIHNzc3MgZGRkZCAqKiogeG9yYiByYmQscmJzICovCi17Ci0jaWZkZWYgTklDRU5BTUVTCi0ieG9yYiByYmQscmJzIiw4LDQsCi0weDFjLAotI2VuZGlmCi0ieG9yYiIsT1BDX3hvcmIsMCx7Q0xBU1NfUkVHX0JZVEUrKEFSR19SRCksQ0xBU1NfUkVHX0JZVEUrKEFSR19SUyksfSwKLQl7Q0xBU1NfQklUKzgsQ0xBU1NfQklUKzgsQ0xBU1NfUkVHKyhBUkdfUlMpLENMQVNTX1JFRysoQVJHX1JEKSwwLDAsMCwwLDAsfSwyLDIsNDE2fSwKLQotCi0vKiAxMDAwIDEwMDAgc3NzcyBkZGRkICoqKiB4b3JiIHJiZCxyYnMgKi8KLXsKLSNpZmRlZiBOSUNFTkFNRVMKLSJ4b3JiIHJiZCxyYnMiLDgsNCwKLTB4MDEsCi0jZW5kaWYKLSJ4b3JiIixPUENfeG9yYiwwLHtDTEFTU19SRUdfQllURSsoQVJHX1JEKSxDTEFTU19SRUdfQllURSsoQVJHX1JTKSx9LAotCXtDTEFTU19CSVQrOCxDTEFTU19CSVQrOCxDTEFTU19SRUcrKEFSR19SUyksQ0xBU1NfUkVHKyhBUkdfUkQpLDAsMCwwLDAsMCx9LDIsMiw0MTd9LAotMCwwfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvb3Bjb2Rlcy96OGtnZW4uYyBiL29wY29kZXMvejhrZ2VuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODZiYmIuLjAwMDAwMDAKLS0tIGEvb3Bjb2Rlcy96OGtnZW4uYworKysgL2Rldi9udWxsCkBAIC0xLDEzMTMgKzAsMCBAQAotLyoKLVRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCaW51dGlscy4KLQotVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi1idXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KLQotCi0vKiBUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIHo4ay1vcGMuaCAqLwotCi0jaW5jbHVkZSA8YW5zaWRlY2wuaD4KLSNpbmNsdWRlICJzeXNkZXAuaCIKLQotI2RlZmluZSBCWVRFX0lORk9fTEVOIDEwCi0KLXN0cnVjdCBvcAotewotICBjaGFyICpmbGFnczsKLSAgaW50IGN5Y2xlczsKLSAgY2hhciB0eXBlOwotICBjaGFyICpiaXRzOwotICBjaGFyICpuYW1lOwotICBjaGFyICpmbGF2b3I7Ci19OwotCi0jZGVmaW5lIGlzd2hpdGUoeCkgKCh4KSA9PSAnICcgfHwgKHgpID09ICdcdCcpCi1zdHJ1Y3Qgb3Agb3B0W10gPQotewotICAiLS0tLS0tIiwgMTAsIDgsICIwMDAwIDExMTAgaW1tOCIsICJleHQwZSBpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDAwMCAxMTExIGltbTgiLCAiZXh0MGYgaW1tOCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDAgMTExMCBpbW04IiwgImV4dDhlIGltbTgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIxMDAwIDExMTEgaW1tOCIsICJleHQ4ZiBpbW04IiwgMCwKLQotICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDAxMTAgaW1tOCIsICJyc3ZkMzYiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDEwMDAgaW1tOCIsICJyc3ZkMzgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMTExIDEwMDAgaW1tOCIsICJyc3ZkNzgiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMTExIDExMTAgaW1tOCIsICJyc3ZkN2UiLCAwLAotCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDEgMTEwMSBpbW04IiwgInJzdmQ5ZCIsIDAsCi0gICItLS0tLS0iLCAxMCwgOCwgIjEwMDEgMTExMSBpbW04IiwgInJzdmQ5ZiIsIDAsCi0KLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAxMSAxMDAxIGltbTgiLCAicnN2ZGI5IiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMTAxMSAxMTExIGltbTgiLCAicnN2ZGJmIiwgMCwKLQotICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkZCBAcnMsQHJkLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMDEgMDAwMCBycnJyIGRkTjAgMDAwMCIsICJsZGRyIEBycyxAcmQscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTEgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRkcmIgQHJzLEByZCxyciIsIDAsCi0gICItLS1WLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAwMDAxIDAwMDAgcnJyciBkZE4wIDAwMDAiLCAibGRpciBAcmQsQHJzLHJyIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGkgcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAxMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGlyIHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BkciByZCxAcnMscnIsY2MiLCAwLAotICAiLS0tVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkaSBAcmQsQHJzLHJyIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGQgcmQsQHJzLHJyLGNjIiwgMCwKLSAgIi0tLVYtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAwMDAwIiwgImxkaXJiIEByZCxAcnMscnIiLCAwLAotICAiLS0tVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMDAxIDAwMDAgcnJyciBkZE4wIDEwMDAiLCAibGRkYiBAcnMsQHJkLHJyIiwgMCwKLSAgIi0tLVYtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDAwMSAwMDAwIHJycnIgZGROMCAxMDAwIiwgImxkaWIgQHJkLEBycyxyciIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDEwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGRiIHJiZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BkcmIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAwMDAgMDAwMCBycnJyIGRkZGQgY2NjYyIsICJjcGliIHJiZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAwMTAwIDAwMDAgcnJyciBkZGRkIGNjY2MiLCAiY3BpcmIgcmJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgMTYsICIxMDExIDEwMTEgc3NOMCAxMDEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZCBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMTAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2RiIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMTExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2RyIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDgsICIxMDExIDEwMTAgc3NOMCAxMTEwIDAwMDAgcnJyciBkZE4wIGNjY2MiLCAiY3BzZHJiIEByZCxAcnMscnIsY2MiLCAwLAotICAiQ1pTVi0tIiwgMTEsIDE2LCAiMTAxMSAxMDExIHNzTjAgMDAxMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2kgQHJkLEBycyxycixjYyIsIDAsCi0gICJDWlNWLS0iLCAxMSwgOCwgIjEwMTEgMTAxMCBzc04wIDAwMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNpYiBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCAxNiwgIjEwMTEgMTAxMSBzc04wIDAxMTAgMDAwMCBycnJyIGRkTjAgY2NjYyIsICJjcHNpciBAcmQsQHJzLHJyLGNjIiwgMCwKLSAgIkNaU1YtLSIsIDExLCA4LCAiMTAxMSAxMDEwIHNzTjAgMDExMCAwMDAwIHJycnIgZGROMCBjY2NjIiwgImNwc2lyYiBAcmQsQHJzLHJyLGNjIiwgMCwKLQotICAiLS0tLS0tIiwgMiwgOCwgIjAwMTEgMDExMCAwMDAwIDAwMDAiLCAiYnB0IiwgMCwKLSAgIkNaU1YtLSIsIDUsIDE2LCAiMTAxMSAwMTAxIHNzc3MgZGRkZCIsICJhZGMgcmQscnMiLCAwLAotICAiQ1pTVkRIIiwgNSwgOCwgIjEwMTEgMDEwMCBzc3NzIGRkZGQiLCAiYWRjYiByYmQscmJzIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDAxIHNzTjAgZGRkZCIsICJhZGQgcmQsQHJzIiwgMCwKLSJDWlNWLS0iLCA5LCAxNiwgIjAxMDAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDEwLCAxNiwgIjAxMDAgMDAwMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3LCAxNiwgIjAwMDAgMDAwMSAwMDAwIGRkZGQgaW1tMTYiLCAiYWRkIHJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDQsIDE2LCAiMTAwMCAwMDAxIHNzc3MgZGRkZCIsICJhZGQgcmQscnMiLCAwLAotICAiQ1pTVkRIIiwgNywgOCwgIjAwMDAgMDAwMCBzc04wIGRkZGQiLCAiYWRkYiByYmQsQHJzIiwgMCwKLSJDWlNWREgiLCA5LCA4LCAiMDEwMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhZGRiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWREgiLCAxMCwgOCwgIjAxMDAgMDAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJhZGRiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1ZESCIsIDQsIDgsICIxMDAwIDAwMDAgc3NzcyBkZGRkIiwgImFkZGIgcmJkLHJicyIsIDAsCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAxMTAgc3NOMCBkZGRkIiwgImFkZGwgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMzIsICIwMTAxIDAxMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImFkZGwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYWRkbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDExMCAwMDAwIGRkZGQgaW1tMzIiLCAiYWRkbCBycmQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgOCwgMzIsICIxMDAxIDAxMTAgc3NzcyBkZGRkIiwgImFkZGwgcnJkLHJycyIsIDAsCi0KLSAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAwMTExIHNzTjAgZGRkZCIsICJhbmQgcmQsQHJzIiwgMCwKLSItWlMtLS0iLCA5LCAxNiwgIjAxMDAgMDExMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kIHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi1aUy0tLSIsIDEwLCAxNiwgIjAxMDAgMDExMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDExMSAwMDAwIGRkZGQgaW1tMTYiLCAiYW5kIHJkLGltbTE2IiwgMCwKLSAgIi1aUy0tLSIsIDQsIDE2LCAiMTAwMCAwMTExIHNzc3MgZGRkZCIsICJhbmQgcmQscnMiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjAwMDAgMDExMCBzc04wIGRkZGQiLCAiYW5kYiByYmQsQHJzIiwgMCwKLSItWlNQLS0iLCA5LCA4LCAiMDEwMCAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJhbmRiIHJiZCxhZGRyZXNzX3NyYyIsIDAsCi0gICItWlNQLS0iLCAxMCwgOCwgIjAxMDAgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiYW5kYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDAxMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJhbmRiIHJiZCxpbW04IiwgMCwKLSAgIi1aU1AtLSIsIDQsIDgsICIxMDAwIDAxMTAgc3NzcyBkZGRkIiwgImFuZGIgcmJkLHJicyIsIDAsCi0KLSAgIi1aLS0tLSIsIDgsIDE2LCAiMDAxMCAwMTExIGRkTjAgaW1tNCIsICJiaXQgQHJkLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTEsIDE2LCAiMDExMCAwMTExIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXQgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLVotLS0tIiwgMTAsIDE2LCAiMDExMCAwMTExIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXQgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItWi0tLS0iLCA0LCAxNiwgIjEwMTAgMDExMSBkZGRkIGltbTQiLCAiYml0IHJkLGltbTQiLCAwLAotIi1aLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDExMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJiaXQgcmQscnMiLCAwLAotCi0gICItWi0tLS0iLCA4LCA4LCAiMDAxMCAwMTEwIGRkTjAgaW1tNCIsICJiaXRiIEByZCxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDExLCA4LCAiMDExMCAwMTEwIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXRiIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKLSAgIi1aLS0tLSIsIDEwLCA4LCAiMDExMCAwMTEwIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJiaXRiIGFkZHJlc3NfZHN0LGltbTQiLCAwLAotICAiLVotLS0tIiwgNCwgOCwgIjEwMTAgMDExMCBkZGRkIGltbTQiLCAiYml0YiByYmQsaW1tNCIsIDAsCi0iLVotLS0tIiwgMTAsIDgsICIwMDEwIDAxMTAgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAiYml0YiByYmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAxMCwgMzIsICIwMDAxIDExMTEgZGROMCAwMDAwIiwgImNhbGwgQHJkIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjAxMDEgMTExMSAwMDAwIDAwMDAgYWRkcmVzc19kc3QiLCAiY2FsbCBhZGRyZXNzX2RzdCIsIDAsCi0gICItLS0tLS0iLCAxMywgMzIsICIwMTAxIDExMTEgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNhbGwgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCAxNiwgIjExMDEgZGlzcDEyIiwgImNhbHIgZGlzcDEyIiwgMCwKLQotICAiLS0tLS0tIiwgOCwgMTYsICIwMDAwIDExMDEgZGROMCAxMDAwIiwgImNsciBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMTAwMCBhZGRyZXNzX2RzdCIsICJjbHIgYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCIsICJjbHIgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMTAwMCIsICJjbHIgcmQiLCAwLAotICAiLS0tLS0tIiwgOCwgOCwgIjAwMDAgMTEwMCBkZE4wIDEwMDAiLCAiY2xyYiBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDgsICIwMTAwIDExMDAgMDAwMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNscmIgYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgMTIsIDgsICIwMTAwIDExMDAgZGROMCAxMDAwIGFkZHJlc3NfZHN0IiwgImNscmIgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAxMDAwIiwgImNscmIgcmJkIiwgMCwKLSAgIi1aUy0tLSIsIDEyLCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAwMDAiLCAiY29tIEByZCIsIDAsCi0gICItWlMtLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbSBhZGRyZXNzX2RzdCIsIDAsCi0gICItWlMtLS0iLCAxNiwgMTYsICIwMTAwIDExMDEgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbSBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMDAwIiwgImNvbSByZCIsIDAsCi0gICItWlNQLS0iLCAxMiwgOCwgIjAwMDAgMTEwMCBkZE4wIDAwMDAiLCAiY29tYiBAcmQiLCAwLAotICAiLVpTUC0tIiwgMTUsIDgsICIwMTAwIDExMDAgMDAwMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbWIgYWRkcmVzc19kc3QiLCAwLAotICAiLVpTUC0tIiwgMTYsIDgsICIwMTAwIDExMDAgZGROMCAwMDAwIGFkZHJlc3NfZHN0IiwgImNvbWIgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIi1aU1AtLSIsIDcsIDgsICIxMDAwIDExMDAgZGRkZCAwMDAwIiwgImNvbWIgcmJkIiwgMCwKLSAgIkNaU1AtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDEwMSIsICJjb21mbGcgZmxhZ3MiLCAwLAotCi0gICJDWlNWLS0iLCAxMSwgMTYsICIwMDAwIDExMDEgZGROMCAwMDAxIGltbTE2IiwgImNwIEByZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImNwIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMDAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImNwIGFkZHJlc3NfZHN0LGltbTE2IiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDEwMTEgc3NOMCBkZGRkIiwgImNwIHJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCA5LCAxNiwgIjAxMDAgMTAxMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3AgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAxMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJjcCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDEwMTEgMDAwMCBkZGRkIGltbTE2IiwgImNwIHJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDQsIDE2LCAiMTAwMCAxMDExIHNzc3MgZGRkZCIsICJjcCByZCxycyIsIDAsCi0KLSAgIkNaU1YtLSIsIDExLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDAwMSBpbW04IGltbTgiLCAiY3BiIEByZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAiY3BiIGFkZHJlc3NfZHN0KHJkKSxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDE0LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDAwMSBhZGRyZXNzX2RzdCBpbW04IGltbTgiLCAiY3BiIGFkZHJlc3NfZHN0LGltbTgiLCAwLAotICAiQ1pTVi0tIiwgNywgOCwgIjAwMDAgMTAxMCBzc04wIGRkZGQiLCAiY3BiIHJiZCxAcnMiLCAwLAotIkNaU1YtLSIsIDksIDgsICIwMTAwIDEwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDgsICIwMTAwIDEwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDgsICIwMDAwIDEwMTAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJjcGIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgNCwgOCwgIjEwMDAgMTAxMCBzc3NzIGRkZGQiLCAiY3BiIHJiZCxyYnMiLCAwLAotCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAwMDAgc3NOMCBkZGRkIiwgImNwbCBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCAzMiwgIjAxMDEgMDAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiY3BsIHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCAxNiwgMzIsICIwMTAxIDAwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImNwbCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAwMCAwMDAwIGRkZGQgaW1tMzIiLCAiY3BsIHJyZCxpbW0zMiIsIDAsCi0gICJDWlNWLS0iLCA4LCAzMiwgIjEwMDEgMDAwMCBzc3NzIGRkZGQiLCAiY3BsIHJyZCxycnMiLCAwLAotCi0gICJDWlMtLS0iLCA1LCA4LCAiMTAxMSAwMDAwIGRkZGQgMDAwMCIsICJkYWIgcmJkIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAxNiwgIjExMTEgZGRkZCAxZGlzcDciLCAiZGJqbnogcmJkLGRpc3A3IiwgMCwKLSAgIi1aU1YtLSIsIDExLCAxNiwgIjAwMTAgMTAxMSBkZE4wIGltbTRtMSIsICJkZWMgQHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxNCwgMTYsICIwMTEwIDEwMTEgZGROMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTMsIDE2LCAiMDExMCAxMDExIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImRlYyBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgNCwgMTYsICIxMDEwIDEwMTEgZGRkZCBpbW00bTEiLCAiZGVjIHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMSwgOCwgIjAwMTAgMTAxMCBkZE4wIGltbTRtMSIsICJkZWNiIEByZCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTQsIDgsICIwMTEwIDEwMTAgZGROMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiZGVjYiBhZGRyZXNzX2RzdChyZCksaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDEzLCA4LCAiMDExMCAxMDEwIDAwMDAgaW1tNG0xIGFkZHJlc3NfZHN0IiwgImRlY2IgYWRkcmVzc19kc3QsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDQsIDgsICIxMDEwIDEwMTAgZGRkZCBpbW00bTEiLCAiZGVjYiByYmQsaW1tNG0xIiwgMCwKLQotICAiLS0tLS0tIiwgNywgMTYsICIwMTExIDExMDAgMDAwMCAwMGlpIiwgImRpIGkyIiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIwMDAxIDEwMTEgc3NOMCBkZGRkIiwgImRpdiBycmQsQHJzIiwgMCwKLSAgIkNaU1YtLSIsIDEwNywgMTYsICIwMTAxIDEwMTEgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImRpdiBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAxMDEgMTAxMSBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAiZGl2IHJyZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgMTA3LCAxNiwgIjAwMDEgMTAxMSAwMDAwIGRkZGQgaW1tMTYiLCAiZGl2IHJyZCxpbW0xNiIsIDAsCi0gICJDWlNWLS0iLCAxMDcsIDE2LCAiMTAwMSAxMDExIHNzc3MgZGRkZCIsICJkaXYgcnJkLHJzIiwgMCwKLSAgIkNaU1YtLSIsIDc0NCwgMzIsICIwMDAxIDEwMTAgc3NOMCBkZGRkIiwgImRpdmwgcnFkLEBycyIsIDAsCi0gICJDWlNWLS0iLCA3NDUsIDMyLCAiMDEwMSAxMDEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXZsIHJxZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCA3NDYsIDMyLCAiMDEwMSAxMDEwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJkaXZsIHJxZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjAwMDEgMTAxMCAwMDAwIGRkZGQgaW1tMzIiLCAiZGl2bCBycWQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgNzQ0LCAzMiwgIjEwMDEgMTAxMCBzc3NzIGRkZGQiLCAiZGl2bCBycWQscnJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMTExMSBkZGRkIDBkaXNwNyIsICJkam56IHJkLGRpc3A3IiwgMCwKLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDExMSAxMTAwIDAwMDAgMDFpaSIsICJlaSBpMiIsIDAsCi0gICItLS0tLS0iLCA2LCAxNiwgIjEwMTAgMTEwMSBzc3NzIGRkZGQiLCAiZXggcmQscnMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAxMCAxMTAxIHNzTjAgZGRkZCIsICJleCByZCxAcnMiLCAwLAotIi0tLS0tLSIsIDE1LCAxNiwgIjAxMTAgMTEwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAiZXggcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDE2LCAiMDExMCAxMTAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJleCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotCi0gICItLS0tLS0iLCAxMiwgOCwgIjAwMTAgMTEwMCBzc04wIGRkZGQiLCAiZXhiIHJiZCxAcnMiLCAwLAotIi0tLS0tLSIsIDE1LCA4LCAiMDExMCAxMTAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJleGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDE2LCA4LCAiMDExMCAxMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJleGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCA2LCA4LCAiMTAxMCAxMTAwIHNzc3MgZGRkZCIsICJleGIgcmJkLHJicyIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAxNiwgIjEwMTEgMDAwMSBkZGRkIDEwMTAiLCAiZXh0cyBycmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDgsICIxMDExIDAwMDEgZGRkZCAwMDAwIiwgImV4dHNiIHJkIiwgMCwKLSAgIi0tLS0tLSIsIDExLCAzMiwgIjEwMTEgMDAwMSBkZGRkIDAxMTEiLCAiZXh0c2wgcnFkIiwgMCwKLQotICAiLS0tLS0tIiwgOCwgMTYsICIwMTExIDEwMTAgMDAwMCAwMDAwIiwgImhhbHQiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMDAxMSAxMTAxIHNzTjAgZGRkZCIsICJpbiByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAxMSAxMTAxIGRkZGQgMDEwMCBpbW0xNiIsICJpbiByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAxMiwgOCwgIjAwMTEgMTEwMCBzc04wIGRkZGQiLCAiaW5iIHJiZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTAsIDgsICIwMDExIDExMDAgZGRkZCAwMTAwIGltbTE2IiwgImluYiByYmQsaW1tMTYiLCAwLAotICAiLVpTVi0tIiwgMTEsIDE2LCAiMDAxMCAxMDAxIGRkTjAgaW1tNG0xIiwgImluYyBAcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDE0LCAxNiwgIjAxMTAgMTAwMSBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmMgYWRkcmVzc19kc3QocmQpLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxMywgMTYsICIwMTEwIDEwMDEgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiaW5jIGFkZHJlc3NfZHN0LGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCA0LCAxNiwgIjEwMTAgMTAwMSBkZGRkIGltbTRtMSIsICJpbmMgcmQsaW1tNG0xIiwgMCwKLSAgIi1aU1YtLSIsIDExLCA4LCAiMDAxMCAxMDAwIGRkTjAgaW1tNG0xIiwgImluY2IgQHJkLGltbTRtMSIsIDAsCi0gICItWlNWLS0iLCAxNCwgOCwgIjAxMTAgMTAwMCBkZE4wIGltbTRtMSBhZGRyZXNzX2RzdCIsICJpbmNiIGFkZHJlc3NfZHN0KHJkKSxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgMTMsIDgsICIwMTEwIDEwMDAgMDAwMCBpbW00bTEgYWRkcmVzc19kc3QiLCAiaW5jYiBhZGRyZXNzX2RzdCxpbW00bTEiLCAwLAotICAiLVpTVi0tIiwgNCwgOCwgIjEwMTAgMTAwMCBkZGRkIGltbTRtMSIsICJpbmNiIHJiZCxpbW00bTEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgImluZCBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLVYtLSIsIDIxLCA4LCAiMDAxMSAxMDEwIHNzTjAgMTAwMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgImluZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLS0tVi0tIiwgMjEsIDgsICIwMDExIDExMDAgc3NOMCAwMDAwIDAwMDAgYWFhYSBkZE4wIDEwMDAiLCAiaW5pYiBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLVYtLSIsIDIxLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMDAgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJpbmliciBAcmQsQHJzLHJhIiwgMCwKLSAgIkNaU1ZESCIsIDEzLCAxNiwgIjAxMTEgMTAxMSAwMDAwIDAwMDAiLCAiaXJldCIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIwMDAxIDExMTAgZGROMCBjY2NjIiwgImpwIGNjLEByZCIsIDAsCi0gICItLS0tLS0iLCA3LCAxNiwgIjAxMDEgMTExMCAwMDAwIGNjY2MgYWRkcmVzc19kc3QiLCAianAgY2MsYWRkcmVzc19kc3QiLCAwLAotICAiLS0tLS0tIiwgOCwgMTYsICIwMTAxIDExMTAgZGROMCBjY2NjIGFkZHJlc3NfZHN0IiwgImpwIGNjLGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLS0tLS0iLCA2LCAxNiwgIjExMTAgY2NjYyBkaXNwOCIsICJqciBjYyxkaXNwOCIsIDAsCi0KLSAgIi0tLS0tLSIsIDcsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDEwMSBpbW0xNiIsICJsZCBAcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgOCwgMTYsICIwMDEwIDExMTEgZGROMCBzc3NzIiwgImxkIEByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMTAwIDExMDEgZGROMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImxkIGFkZHJlc3NfZHN0KHJkKSxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMTEwIDExMTEgZGROMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkIGFkZHJlc3NfZHN0KHJkKSxycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTE2IiwgImxkIGFkZHJlc3NfZHN0LGltbTE2IiwgMCwKLSItLS0tLS0iLCAxMSwgMTYsICIwMTEwIDExMTEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkIGFkZHJlc3NfZHN0LHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAxMSBkZE4wIHNzc3MgaW1tMTYiLCAibGQgcmQoaW1tMTYpLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTEgMDAxMSBkZE4wIHNzc3MgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZCByZChyeCkscnMiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIwMDEwIDAwMDEgc3NOMCBkZGRkIiwgImxkIHJkLEBycyIsIDAsCi0gICItLS0tLS0iLCA5LCAxNiwgIjAxMTAgMDAwMSAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAibGQgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTAsIDE2LCAiMDExMCAwMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZCByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIwMDEwIDAwMDEgMDAwMCBkZGRkIGltbTE2IiwgImxkIHJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDMsIDE2LCAiMTAxMCAwMDAxIHNzc3MgZGRkZCIsICJsZCByZCxycyIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMDExIDAwMDEgc3NOMCBkZGRkIGltbTE2IiwgImxkIHJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNCwgMTYsICIwMTExIDAwMDEgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGQgcmQscnMocngpIiwgMCwKLQotICAiLS0tLS0tIiwgNywgOCwgIjAwMDAgMTEwMCBkZE4wIDAxMDEgaW1tOCBpbW04IiwgImxkYiBAcmQsaW1tOCIsIDAsCi0gICItLS0tLS0iLCA4LCA4LCAiMDAxMCAxMTEwIGRkTjAgc3NzcyIsICJsZGIgQHJkLHJicyIsIDAsCi0gICItLS0tLS0iLCAxNSwgOCwgIjAxMDAgMTEwMCBkZE4wIDAxMDEgYWRkcmVzc19kc3QgaW1tOCBpbW04IiwgImxkYiBhZGRyZXNzX2RzdChyZCksaW1tOCIsIDAsCi0gICItLS0tLS0iLCAxMiwgOCwgIjAxMDAgMTExMCBkZE4wIHNzTjAgYWRkcmVzc19kc3QiLCAibGRiIGFkZHJlc3NfZHN0KHJkKSxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMTAxIGFkZHJlc3NfZHN0IGltbTggaW1tOCIsICJsZGIgYWRkcmVzc19kc3QsaW1tOCIsIDAsCi0iLS0tLS0tIiwgMTEsIDgsICIwMTEwIDExMTAgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkYiBhZGRyZXNzX2RzdCxyYnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMDExIDAwMTAgZGROMCBzc3NzIGltbTE2IiwgImxkYiByZChpbW0xNikscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDExMSAwMDEwIGRkTjAgc3NzcyAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkYiByZChyeCkscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDgsICIwMDEwIDAwMDAgc3NOMCBkZGRkIiwgImxkYiByYmQsQHJzIiwgMCwKLSItLS0tLS0iLCA5LCA4LCAiMDExMCAwMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGIgcmJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDEwLCA4LCAiMDExMCAwMDAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCA1LCA4LCAiMTEwMCBkZGRkIGltbTgiLCAibGRiIHJiZCxpbW04IiwgMCwKLSAgIi0tLS0tLSIsIDMsIDgsICIxMDEwIDAwMDAgc3NzcyBkZGRkIiwgImxkYiByYmQscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCA4LCAiMDAxMSAwMDAwIHNzTjAgZGRkZCBpbW0xNiIsICJsZGIgcmJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAxMTEgMDAwMCBzc04wIGRkZGQgMDAwMCB4eHh4IDAwMDAgMDAwMCIsICJsZGIgcmJkLHJzKHJ4KSIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAzMiwgIjAwMDEgMTEwMSBkZE4wIHNzc3MiLCAibGRsIEByZCxycnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDMyLCAiMDEwMSAxMTAxIGRkTjAgc3NzcyBhZGRyZXNzX2RzdCIsICJsZGwgYWRkcmVzc19kc3QocmQpLHJycyIsIDAsCi0gICItLS0tLS0iLCAxNSwgMzIsICIwMTAxIDExMDEgMDAwMCBzc3NzIGFkZHJlc3NfZHN0IiwgImxkbCBhZGRyZXNzX2RzdCxycnMiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTExIGRkTjAgc3NzcyBpbW0xNiIsICJsZGwgcmQoaW1tMTYpLHJycyIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMTExIDAxMTEgZGROMCBzc3NzIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRsIHJkKHJ4KSxycnMiLCAwLAotICAiLS0tLS0tIiwgMTEsIDMyLCAiMDAwMSAwMTAwIHNzTjAgZGRkZCIsICJsZGwgcnJkLEBycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMzIsICIwMTAxIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgImxkbCBycmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTMsIDMyLCAiMDEwMSAwMTAwIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGwgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItLS0tLS0iLCAxMSwgMzIsICIwMDAxIDAxMDAgMDAwMCBkZGRkIGltbTMyIiwgImxkbCBycmQsaW1tMzIiLCAwLAotICAiLS0tLS0tIiwgNSwgMzIsICIxMDAxIDAxMDAgc3NzcyBkZGRkIiwgImxkbCBycmQscnJzIiwgMCwKLSAgIi0tLS0tLSIsIDE3LCAzMiwgIjAwMTEgMDEwMSBzc04wIGRkZGQgaW1tMTYiLCAibGRsIHJyZCxycyhpbW0xNikiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDExMSAwMTAxIHNzTjAgZGRkZCAwMDAwIHh4eHggMDAwMCAwMDAwIiwgImxkbCBycmQscnMocngpIiwgMCwKLQotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDExMSAwMTEwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJsZGEgcHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAxNiwgIjAxMTEgMDExMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibGRhIHByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDAxMSAwMTAwIHNzTjAgZGRkZCBpbW0xNiIsICJsZGEgcHJkLHJzKGltbTE2KSIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMTExIDAxMDAgc3NOMCBkZGRkIDAwMDAgeHh4eCAwMDAwIDAwMDAiLCAibGRhIHByZCxycyhyeCkiLCAwLAotICAiLS0tLS0tIiwgMTUsIDE2LCAiMDAxMSAwMTAwIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRhciBwcmQsZGlzcDE2IiwgMCwKLSAgIi0tLS0tLSIsIDcsIDMyLCAiMDExMSAxMTAxIHNzc3MgMWNjYyIsICJsZGN0bCBjdHJsLHJzIiwgMCwKLSAgIi0tLS0tLSIsIDcsIDMyLCAiMDExMSAxMTAxIGRkZGQgMGNjYyIsICJsZGN0bCByZCxjdHJsIiwgMCwKLQotICAiLS0tLS0tIiwgNSwgMTYsICIxMDExIDExMDEgZGRkZCBpbW00IiwgImxkayByZCxpbW00IiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAwMSAxMTAwIGRkTjAgMTAwMSAwMDAwIHNzc3MgMDAwMCBubWludXMxIiwgImxkbSBAcmQscnMsbiIsIDAsCi0gICItLS0tLS0iLCAxNSwgMTYsICIwMTAxIDExMDAgZGROMCAxMDAxIDAwMDAgc3NOMCAwMDAwIG5taW51czEgYWRkcmVzc19kc3QiLCAibGRtIGFkZHJlc3NfZHN0KHJkKSxycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDEgMTEwMCAwMDAwIDEwMDEgMDAwMCBzc3NzIDAwMDAgbm1pbnVzMSBhZGRyZXNzX2RzdCIsICJsZG0gYWRkcmVzc19kc3QscnMsbiIsIDAsCi0gICItLS0tLS0iLCAxMSwgMTYsICIwMDAxIDExMDAgc3NOMCAwMDAxIDAwMDAgZGRkZCAwMDAwIG5taW51czEiLCAibGRtIHJkLEBycyxuIiwgMCwKLSAgIi0tLS0tLSIsIDE1LCAxNiwgIjAxMDEgMTEwMCBzc04wIDAwMDEgMDAwMCBkZGRkIDAwMDAgbm1pbnVzMSBhZGRyZXNzX3NyYyIsICJsZG0gcmQsYWRkcmVzc19zcmMocnMpLG4iLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAxMTAwIDAwMDAgMDAwMSAwMDAwIGRkZGQgMDAwMCBubWludXMxIGFkZHJlc3Nfc3JjIiwgImxkbSByZCxhZGRyZXNzX3NyYyxuIiwgMCwKLQotICAiQ1pTVkRIIiwgMTIsIDE2LCAiMDAxMSAxMDAxIHNzTjAgMDAwMCIsICJsZHBzIEBycyIsIDAsCi0gICJDWlNWREgiLCAxNiwgMTYsICIwMTExIDEwMDEgMDAwMCAwMDAwIGFkZHJlc3Nfc3JjIiwgImxkcHMgYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVkRIIiwgMTcsIDE2LCAiMDExMSAxMDAxIHNzTjAgMDAwMCBhZGRyZXNzX3NyYyIsICJsZHBzIGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0KLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAwMTEgMDAxMSAwMDAwIHNzc3MgZGlzcDE2IiwgImxkciBkaXNwMTYscnMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDAxMSAwMDAxIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRyIHJkLGRpc3AxNiIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAxMCAwMDAwIHNzc3MgZGlzcDE2IiwgImxkcmIgZGlzcDE2LHJicyIsIDAsCi0gICItLS0tLS0iLCAxNCwgOCwgIjAwMTEgMDAwMCAwMDAwIGRkZGQgZGlzcDE2IiwgImxkcmIgcmJkLGRpc3AxNiIsIDAsCi0gICItLS0tLS0iLCAxNywgMzIsICIwMDExIDAxMTEgMDAwMCBzc3NzIGRpc3AxNiIsICJsZHJsIGRpc3AxNixycnMiLCAwLAotICAiLS0tLS0tIiwgMTcsIDMyLCAiMDAxMSAwMTAxIDAwMDAgZGRkZCBkaXNwMTYiLCAibGRybCBycmQsZGlzcDE2IiwgMCwKLQotICAiQ1pTLS0tIiwgNywgMTYsICIwMTExIDEwMTEgMDAwMCAxMDEwIiwgIm1iaXQiLCAwLAotICAiLVpTLS0tIiwgMTIsIDE2LCAiMDExMSAxMDExIGRkZGQgMTEwMSIsICJtcmVxIHJkIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDE2LCAiMDExMSAxMDExIDAwMDAgMTAwMSIsICJtcmVzIiwgMCwKLSAgIi0tLS0tLSIsIDUsIDE2LCAiMDExMSAxMDExIDAwMDAgMTAwMCIsICJtc2V0IiwgMCwKLQotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMDAwMSAxMDAxIHNzTjAgZGRkZCIsICJtdWx0IHJyZCxAcnMiLCAwLAotICAiQ1pTVi0tIiwgNzAsIDE2LCAiMDEwMSAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0IHJyZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMTAxIDEwMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm11bHQgcnJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCA3MCwgMTYsICIwMDAxIDEwMDEgMDAwMCBkZGRkIGltbTE2IiwgIm11bHQgcnJkLGltbTE2IiwgMCwKLSAgIkNaU1YtLSIsIDcwLCAxNiwgIjEwMDEgMTAwMSBzc3NzIGRkZGQiLCAibXVsdCBycmQscnMiLCAwLAotICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjAwMDEgMTAwMCBzc04wIGRkZGQiLCAibXVsdGwgcnFkLEBycyIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDEwMSAxMDAwIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJtdWx0bCBycWQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjAxMDEgMTAwMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAibXVsdGwgcnFkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWLS0iLCAyODIsIDMyLCAiMDAwMSAxMDAwIDAwMDAgZGRkZCBpbW0zMiIsICJtdWx0bCBycWQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgMjgyLCAzMiwgIjEwMDEgMTAwMCBzc3NzIGRkZGQiLCAibXVsdGwgcnFkLHJycyIsIDAsCi0gICJDWlNWLS0iLCAxMiwgMTYsICIwMDAwIDExMDEgZGROMCAwMDEwIiwgIm5lZyBAcmQiLCAwLAotICAiQ1pTVi0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWcgYWRkcmVzc19kc3QiLCAwLAotICAiQ1pTVi0tIiwgMTYsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWcgYWRkcmVzc19kc3QocmQpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGRkZGQgMDAxMCIsICJuZWcgcmQiLCAwLAotICAiQ1pTVi0tIiwgMTIsIDgsICIwMDAwIDExMDAgZGROMCAwMDEwIiwgIm5lZ2IgQHJkIiwgMCwKLSAgIkNaU1YtLSIsIDE1LCA4LCAiMDEwMCAxMTAwIDAwMDAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWdiIGFkZHJlc3NfZHN0IiwgMCwKLSAgIkNaU1YtLSIsIDE2LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDAxMCBhZGRyZXNzX2RzdCIsICJuZWdiIGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICJDWlNWLS0iLCA3LCA4LCAiMTAwMCAxMTAwIGRkZGQgMDAxMCIsICJuZWdiIHJiZCIsIDAsCi0KLSAgIi0tLS0tLSIsIDcsIDE2LCAiMTAwMCAxMTAxIDAwMDAgMDExMSIsICJub3AiLCAwLAotCi0gICJDWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDEwMSBzc04wIGRkZGQiLCAib3IgcmQsQHJzIiwgMCwKLSAgIkNaUy0tLSIsIDksIDE2LCAiMDEwMCAwMTAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJvciByZCxhZGRyZXNzX3NyYyIsIDAsCi0gICJDWlMtLS0iLCAxMCwgMTYsICIwMTAwIDAxMDEgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yIHJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlMtLS0iLCA3LCAxNiwgIjAwMDAgMDEwMSAwMDAwIGRkZGQgaW1tMTYiLCAib3IgcmQsaW1tMTYiLCAwLAotICAiQ1pTLS0tIiwgNCwgMTYsICIxMDAwIDAxMDEgc3NzcyBkZGRkIiwgIm9yIHJkLHJzIiwgMCwKLQotICAiQ1pTUC0tIiwgNywgOCwgIjAwMDAgMDEwMCBzc04wIGRkZGQiLCAib3JiIHJiZCxAcnMiLCAwLAotIkNaU1AtLSIsIDksIDgsICIwMTAwIDAxMDAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTUC0tIiwgMTAsIDgsICIwMTAwIDAxMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgIm9yYiByYmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1AtLSIsIDcsIDgsICIwMDAwIDAxMDAgMDAwMCBkZGRkIGltbTggaW1tOCIsICJvcmIgcmJkLGltbTgiLCAwLAotICAiQ1pTUC0tIiwgNCwgOCwgIjEwMDAgMDEwMCBzc3NzIGRkZGQiLCAib3JiIHJiZCxyYnMiLCAwLAotCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTExMSBkZE4wIHNzc3MiLCAib3V0IEByZCxycyIsIDAsCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc3NzIDAxMTAgaW1tMTYiLCAib3V0IGltbTE2LHJzIiwgMCwKLSAgIi0tLVYtLSIsIDAsIDgsICIwMDExIDExMTAgZGROMCBzc3NzIiwgIm91dGIgQHJkLHJicyIsIDAsCi0gICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMDEwIHNzc3MgMDExMCBpbW0xNiIsICJvdXRiIGltbTE2LHJicyIsIDAsCi0gICItLS1WLS0iLCAwLCAxNiwgIjAwMTEgMTAxMSBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJvdXRkIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMTAgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJvdXRkYiBAcmQsQHJzLHJiYSIsIDAsCi0gICItLS1WLS0iLCAwLCA4LCAiMDAxMSAxMTAwIHNzTjAgMDAxMCAwMDAwIGFhYWEgZGROMCAxMDAwIiwgIm91dGliIEByZCxAcnMscmEiLCAwLAotICAiLS0tVi0tIiwgMCwgMTYsICIwMDExIDExMDAgc3NOMCAwMDEwIDAwMDAgYWFhYSBkZE4wIDAwMDAiLCAib3V0aWJyIEByZCxAcnMscmEiLCAwLAotCi0gICItLS0tLS0iLCAxMiwgMTYsICIwMDAxIDAxMTEgc3NOMCBkZE4wIiwgInBvcCBAcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE2LCAxNiwgIjAxMDEgMDExMSBzc04wIGRkTjAgYWRkcmVzc19kc3QiLCAicG9wIGFkZHJlc3NfZHN0KHJkKSxAcnMiLCAwLAotICAiLS0tLS0tIiwgMTYsIDE2LCAiMDEwMSAwMTExIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJwb3AgYWRkcmVzc19kc3QsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDgsIDE2LCAiMTAwMSAwMTExIHNzTjAgZGRkZCIsICJwb3AgcmQsQHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTksIDMyLCAiMDAwMSAwMTAxIHNzTjAgZGROMCIsICJwb3BsIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMjMsIDMyLCAiMDEwMSAwMTAxIHNzTjAgZGROMCBhZGRyZXNzX2RzdCIsICJwb3BsIGFkZHJlc3NfZHN0KHJkKSxAcnMiLCAwLAotICAiLS0tLS0tIiwgMjMsIDMyLCAiMDEwMSAwMTAxIHNzTjAgMDAwMCBhZGRyZXNzX2RzdCIsICJwb3BsIGFkZHJlc3NfZHN0LEBycyIsIDAsCi0gICItLS0tLS0iLCAxMiwgMzIsICIxMDAxIDAxMDEgc3NOMCBkZGRkIiwgInBvcGwgcnJkLEBycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDEzLCAxNiwgIjAwMDEgMDAxMSBkZE4wIHNzTjAiLCAicHVzaCBAcmQsQHJzIiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMDEgMDAxMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMiLCAicHVzaCBAcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDEwMSAwMDExIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyIsICJwdXNoIEByZCxhZGRyZXNzX3NyYyhycykiLCAwLAotICAiLS0tLS0tIiwgMTIsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMTAwMSBpbW0xNiIsICJwdXNoIEByZCxpbW0xNiIsIDAsCi0gICItLS0tLS0iLCA5LCAxNiwgIjEwMDEgMDAxMSBkZE4wIHNzc3MiLCAicHVzaCBAcmQscnMiLCAwLAotCi0gICItLS0tLS0iLCAyMCwgMzIsICIwMDAxIDAwMDEgZGROMCBzc04wIiwgInB1c2hsIEByZCxAcnMiLCAwLAotICAiLS0tLS0tIiwgMjEsIDMyLCAiMDEwMSAwMDAxIGRkTjAgc3NOMCBhZGRyZXNzX3NyYyIsICJwdXNobCBAcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi0tLS0tLSIsIDIxLCAzMiwgIjAxMDEgMDAwMSBkZE4wIDAwMDAgYWRkcmVzc19zcmMiLCAicHVzaGwgQHJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAzMiwgIjEwMDEgMDAwMSBkZE4wIHNzc3MiLCAicHVzaGwgQHJkLHJycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDExLCAxNiwgIjAwMTAgMDAxMSBkZE4wIGltbTQiLCAicmVzIEByZCxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDE0LCAxNiwgIjAxMTAgMDAxMSBkZE4wIGltbTQgYWRkcmVzc19kc3QiLCAicmVzIGFkZHJlc3NfZHN0KHJkKSxpbW00IiwgMCwKLSAgIi0tLS0tLSIsIDEzLCAxNiwgIjAxMTAgMDAxMSAwMDAwIGltbTQgYWRkcmVzc19kc3QiLCAicmVzIGFkZHJlc3NfZHN0LGltbTQiLCAwLAotICAiLS0tLS0tIiwgNCwgMTYsICIxMDEwIDAwMTEgZGRkZCBpbW00IiwgInJlcyByZCxpbW00IiwgMCwKLSItLS0tLS0iLCAxMCwgMTYsICIwMDEwIDAwMTEgMDAwMCBzc3NzIDAwMDAgZGRkZCAwMDAwIDAwMDAiLCAicmVzIHJkLHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDgsICIwMDEwIDAwMTAgZGROMCBpbW00IiwgInJlc2IgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTEwIDAwMTAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInJlc2IgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDgsICIwMTEwIDAwMTAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInJlc2IgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCA4LCAiMTAxMCAwMDEwIGRkZGQgaW1tNCIsICJyZXNiIHJiZCxpbW00IiwgMCwKLSItLS0tLS0iLCAxMCwgOCwgIjAwMTAgMDAxMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJyZXNiIHJiZCxycyIsIDAsCi0KLSAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDAxMSIsICJyZXNmbGcgaW1tNCIsIDAsCi0gICItLS0tLS0iLCAxMCwgMTYsICIxMDAxIDExMTAgMDAwMCBjY2NjIiwgInJldCBjYyIsIDAsCi0KLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDBJMCIsICJybCByZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDgsICIxMDExIDAwMTAgZGRkZCAwMEkwIiwgInJsYiByYmQsaW1tMW9yMiIsIDAsCi0gICJDWlNWLS0iLCA2LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDEwSTAiLCAicmxjIHJkLGltbTFvcjIiLCAwLAotCi0gICItWi0tLS0iLCA5LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTBJMCIsICJybGNiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDExMTAgYWFhYSBiYmJiIiwgInJsZGIgcmJiLHJiYSIsIDAsCi0KLSAgIkNaU1YtLSIsIDYsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDFJMCIsICJyciByZCxpbW0xb3IyIiwgMCwKLSAgIkNaU1YtLSIsIDYsIDgsICIxMDExIDAwMTAgZGRkZCAwMUkwIiwgInJyYiByYmQsaW1tMW9yMiIsIDAsCi0gICJDWlNWLS0iLCA2LCAxNiwgIjEwMTEgMDAxMSBkZGRkIDExSTAiLCAicnJjIHJkLGltbTFvcjIiLCAwLAotCi0gICItWi0tLS0iLCA5LCA4LCAiMTAxMSAwMDEwIGRkZGQgMTFJMCIsICJycmNiIHJiZCxpbW0xb3IyIiwgMCwKLSAgIi1aLS0tLSIsIDksIDgsICIxMDExIDExMDAgYWFhYSBiYmJiIiwgInJyZGIgcmJiLHJiYSIsIDAsCi0gICJDWlNWLS0iLCA1LCAxNiwgIjEwMTEgMDExMSBzc3NzIGRkZGQiLCAic2JjIHJkLHJzIiwgMCwKLSAgIkNaU1ZESCIsIDUsIDgsICIxMDExIDAxMTAgc3NzcyBkZGRkIiwgInNiY2IgcmJkLHJicyIsIDAsCi0KLSAgIkNaU1ZESCIsIDMzLCA4LCAiMDExMSAxMTExIGltbTgiLCAic2MgaW1tOCIsIDAsCi0KLSJDWlNWLS0iLCAxNSwgMTYsICIxMDExIDAwMTEgZGRkZCAxMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RhIHJkLHJzIiwgMCwKLSJDWlNWLS0iLCAxNSwgOCwgIjEwMTEgMDAxMCBkZGRkIDEwMTEgMDAwMCBzc3NzIDAwMDAgMDAwMCIsICJzZGFiIHJiZCxycyIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMzIsICIxMDExIDAwMTEgZGRkZCAxMTExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RhbCBycmQscnMiLCAwLAotCi0iQ1pTLS0tIiwgMTUsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAxMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkbCByZCxycyIsIDAsCi0iQ1pTLS0tIiwgMTUsIDgsICIxMDExIDAwMTAgZGRkZCAwMDExIDAwMDAgc3NzcyAwMDAwIDAwMDAiLCAic2RsYiByYmQscnMiLCAwLAotICAiQ1pTLS0tIiwgMTUsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDExMSAwMDAwIHNzc3MgMDAwMCAwMDAwIiwgInNkbGwgcnJkLHJzIiwgMCwKLQotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDAxMCAwMTAxIGRkTjAgaW1tNCIsICJzZXQgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDE2LCAiMDExMCAwMTAxIGRkTjAgaW1tNCBhZGRyZXNzX2RzdCIsICJzZXQgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDE2LCAiMDExMCAwMTAxIDAwMDAgaW1tNCBhZGRyZXNzX2RzdCIsICJzZXQgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCAxNiwgIjEwMTAgMDEwMSBkZGRkIGltbTQiLCAic2V0IHJkLGltbTQiLCAwLAotIi0tLS0tLSIsIDEwLCAxNiwgIjAwMTAgMDEwMSAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJzZXQgcmQscnMiLCAwLAotICAiLS0tLS0tIiwgMTEsIDgsICIwMDEwIDAxMDAgZGROMCBpbW00IiwgInNldGIgQHJkLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTQsIDgsICIwMTEwIDAxMDAgZGROMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldGIgYWRkcmVzc19kc3QocmQpLGltbTQiLCAwLAotICAiLS0tLS0tIiwgMTMsIDgsICIwMTEwIDAxMDAgMDAwMCBpbW00IGFkZHJlc3NfZHN0IiwgInNldGIgYWRkcmVzc19kc3QsaW1tNCIsIDAsCi0gICItLS0tLS0iLCA0LCA4LCAiMTAxMCAwMTAwIGRkZGQgaW1tNCIsICJzZXRiIHJiZCxpbW00IiwgMCwKLSItLS0tLS0iLCAxMCwgOCwgIjAwMTAgMDEwMCAwMDAwIHNzc3MgMDAwMCBkZGRkIDAwMDAgMDAwMCIsICJzZXRiIHJiZCxycyIsIDAsCi0KLSAgIkNaU1YtLSIsIDcsIDE2LCAiMTAwMCAxMTAxIGltbTQgMDAwMSIsICJzZXRmbGcgaW1tNCIsIDAsCi0KLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDExMDAgZGRkZCAwMTAxIGltbTE2IiwgInNpbmIgcmJkLGltbTE2IiwgMCwKLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDExMDEgZGRkZCAwMTAxIGltbTE2IiwgInNpbmIgcmQsaW1tMTYiLCAwLAotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAiLCAic2luZCBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDgsICIwMDExIDEwMTAgc3NOMCAxMDAwIDAwMDEgYWFhYSBkZE4wIDEwMDAiLCAic2luZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMDEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzaW5pYiBAcmQsQHJzLHJhIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMTAwIHNzTjAgMDAwMSAwMDAwIGFhYWEgZGROMCAwMDAwIiwgInNpbmliciBAcmQsQHJzLHJhIiwgMCwKLQotICAiQ1pTVi0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMTAwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGEgcmQsaW1tOCIsIDAsCi0gICJDWlNWLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDEwMDEgIDAwMDAgMDAwMCBpbW04IiwgInNsYWIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMTEwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGFsIHJyZCxpbW04IiwgMCwKLQotICAiQ1pTLS0tIiwgMTMsIDE2LCAiMTAxMSAwMDExIGRkZGQgMDAwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGwgcmQsaW1tOCIsIDAsCi0gICJDWlMtLS0iLCAxMywgOCwgIjEwMTEgMDAxMCBkZGRkIDAwMDEgIDAwMDAgMDAwMCBpbW04IiwgInNsbGIgcmJkLGltbTgiLCAwLAotICAiQ1pTLS0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDEwMSAwMDAwIDAwMDAgaW1tOCIsICJzbGxsIHJyZCxpbW04IiwgMCwKLQotICAiLS0tLS0tIiwgMCwgMTYsICIwMDExIDEwMTEgc3NzcyAwMTExIGltbTE2IiwgInNvdXQgaW1tMTYscnMiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc3NzIDAxMTEgaW1tMTYiLCAic291dGIgaW1tMTYscmJzIiwgMCwKLSAgIi0tLS0tLSIsIDAsIDE2LCAiMDAxMSAxMDExIHNzTjAgMTAxMSAwMDAwIGFhYWEgZGROMCAxMDAwIiwgInNvdXRkIEByZCxAcnMscmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTAxMCBzc04wIDEwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzb3V0ZGIgQHJkLEBycyxyYmEiLCAwLAotICAiLS0tLS0tIiwgMCwgOCwgIjAwMTEgMTEwMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMTAwMCIsICJzb3V0aWIgQHJkLEBycyxyYSIsIDAsCi0gICItLS0tLS0iLCAwLCAxNiwgIjAwMTEgMTEwMCBzc04wIDAwMTEgMDAwMCBhYWFhIGRkTjAgMDAwMCIsICJzb3V0aWJyIEByZCxAcnMscmEiLCAwLAotCi0gICJDWlNWLS0iLCAxMywgMTYsICIxMDExIDAwMTEgZGRkZCAxMDAxIDExMTEgMTExMSBuaW04IiwgInNyYSByZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCA4LCAiMTAxMSAwMDEwIGRkZGQgMTAwMSAxMTExIDExMTEgbmltOCIsICJzcmFiIHJiZCxpbW04IiwgMCwKLSAgIkNaU1YtLSIsIDEzLCAzMiwgIjEwMTEgMDAxMSBkZGRkIDExMDEgMTExMSAxMTExIG5pbTgiLCAic3JhbCBycmQsaW1tOCIsIDAsCi0KLSAgIkNaU1YtLSIsIDEzLCAxNiwgIjEwMTEgMDAxMSBkZGRkIDAwMDEgMTExMSAxMTExIG5pbTgiLCAic3JsIHJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDgsICIxMDExIDAwMTAgZGRkZCAwMDAxIDExMTEgMTExMSBuaW04IiwgInNybGIgcmJkLGltbTgiLCAwLAotICAiQ1pTVi0tIiwgMTMsIDMyLCAiMTAxMSAwMDExIGRkZGQgMDEwMSAxMTExIDExMTEgbmltOCIsICJzcmxsIHJyZCxpbW04IiwgMCwKLQotICAiQ1pTVi0tIiwgNywgMTYsICIwMDAwIDAwMTEgc3NOMCBkZGRkIiwgInN1YiByZCxAcnMiLCAwLAotIkNaU1YtLSIsIDksIDE2LCAiMDEwMCAwMDExIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWIgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVi0tIiwgMTAsIDE2LCAiMDEwMCAwMDExIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJzdWIgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDcsIDE2LCAiMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW0xNiIsICJzdWIgcmQsaW1tMTYiLCAwLAotICAiQ1pTVi0tIiwgNCwgMTYsICIxMDAwIDAwMTEgc3NzcyBkZGRkIiwgInN1YiByZCxycyIsIDAsCi0KLSAgIkNaU1ZESCIsIDcsIDgsICIwMDAwIDAwMTAgc3NOMCBkZGRkIiwgInN1YmIgcmJkLEBycyIsIDAsCi0iQ1pTVkRIIiwgOSwgOCwgIjAxMDAgMDAxMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAic3ViYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiQ1pTVkRIIiwgMTAsIDgsICIwMTAwIDAwMTAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICJDWlNWREgiLCA3LCA4LCAiMDAwMCAwMDEwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAic3ViYiByYmQsaW1tOCIsIDAsCi0gICJDWlNWREgiLCA0LCA4LCAiMTAwMCAwMDEwIHNzc3MgZGRkZCIsICJzdWJiIHJiZCxyYnMiLCAwLAotCi0gICJDWlNWLS0iLCAxNCwgMzIsICIwMDAxIDAwMTAgc3NOMCBkZGRkIiwgInN1YmwgcnJkLEBycyIsIDAsCi0gICJDWlNWLS0iLCAxNSwgMzIsICIwMTAxIDAwMTAgMDAwMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInN1YmwgcnJkLGFkZHJlc3Nfc3JjIiwgMCwKLSAgIkNaU1YtLSIsIDE2LCAzMiwgIjAxMDEgMDAxMCBzc04wIGRkZGQgYWRkcmVzc19zcmMiLCAic3VibCBycmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIkNaU1YtLSIsIDE0LCAzMiwgIjAwMDEgMDAxMCAwMDAwIGRkZGQgaW1tMzIiLCAic3VibCBycmQsaW1tMzIiLCAwLAotICAiQ1pTVi0tIiwgOCwgMzIsICIxMDAxIDAwMTAgc3NzcyBkZGRkIiwgInN1YmwgcnJkLHJycyIsIDAsCi0KLSAgIi0tLS0tLSIsIDUsIDE2LCAiMTAxMCAxMTExIGRkZGQgY2NjYyIsICJ0Y2MgY2MscmQiLCAwLAotICAiLS0tLS0tIiwgNSwgOCwgIjEwMTAgMTExMCBkZGRkIGNjY2MiLCAidGNjYiBjYyxyYmQiLCAwLAotCi0gICItWlMtLS0iLCA4LCAxNiwgIjAwMDAgMTEwMSBkZE4wIDAxMDAiLCAidGVzdCBAcmQiLCAwLAotICAiLS0tLS0tIiwgMTEsIDE2LCAiMDEwMCAxMTAxIDAwMDAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0IGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tLS0tLSIsIDEyLCAxNiwgIjAxMDAgMTEwMSBkZE4wIDAxMDAgYWRkcmVzc19kc3QiLCAidGVzdCBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS0tLS0tIiwgNywgMTYsICIxMDAwIDExMDEgZGRkZCAwMTAwIiwgInRlc3QgcmQiLCAwLAotCi0gICItWlNQLS0iLCA4LCA4LCAiMDAwMCAxMTAwIGRkTjAgMDEwMCIsICJ0ZXN0YiBAcmQiLCAwLAotICAiLVpTUC0tIiwgMTEsIDgsICIwMTAwIDExMDAgMDAwMCAwMTAwIGFkZHJlc3NfZHN0IiwgInRlc3RiIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi1aU1AtLSIsIDEyLCA4LCAiMDEwMCAxMTAwIGRkTjAgMDEwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0YiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTUC0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAxMDAiLCAidGVzdGIgcmJkIiwgMCwKLQotICAiLVpTLS0tIiwgMTMsIDMyLCAiMDAwMSAxMTAwIGRkTjAgMTAwMCIsICJ0ZXN0bCBAcmQiLCAwLAotIi1aUy0tLSIsIDE2LCAzMiwgIjAxMDEgMTEwMCAwMDAwIDEwMDAgYWRkcmVzc19kc3QiLCAidGVzdGwgYWRkcmVzc19kc3QiLCAwLAotICAiLVpTLS0tIiwgMTcsIDMyLCAiMDEwMSAxMTAwIGRkTjAgMTAwMCBhZGRyZXNzX2RzdCIsICJ0ZXN0bCBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLVpTLS0tIiwgMTMsIDMyLCAiMTAwMSAxMTAwIGRkZGQgMTAwMCIsICJ0ZXN0bCBycmQiLCAwLAotCi0gICItWlNWLS0iLCAyNSwgOCwgIjEwMTEgMTAwMCBkZE4wIDEwMDAgMDAwMCBhYWFhIHNzTjAgMDAwMCIsICJ0cmRiIEByZCxAcnMscmJhIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMTEwMCAwMDAwIGFhYWEgc3NOMCAwMDAwIiwgInRyZHJiIEByZCxAcnMscmJhIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGRkTjAgMDAwMCAwMDAwIHJycnIgc3NOMCAwMDAwIiwgInRyaWIgQHJkLEBycyxyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgZGROMCAwMTAwIDAwMDAgcnJyciBzc04wIDAwMDAiLCAidHJpcmIgQHJkLEBycyxyYnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAxMTEwIDAwMDAgcnJyciBiYk4wIDExMTAiLCAidHJ0ZHJiIEByYSxAcmIscmJyIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGFhTjAgMDAxMCAwMDAwIHJycnIgYmJOMCAwMDAwIiwgInRydGliIEByYSxAcmIscnIiLCAwLAotICAiLVpTVi0tIiwgMjUsIDgsICIxMDExIDEwMDAgYWFOMCAwMTEwIDAwMDAgcnJyciBiYk4wIDExMTAiLCAidHJ0aXJiIEByYSxAcmIscmJyIiwgMCwKLSAgIi1aU1YtLSIsIDI1LCA4LCAiMTAxMSAxMDAwIGFhTjAgMTAxMCAwMDAwIHJycnIgYmJOMCAwMDAwIiwgInRydHJiIEByYSxAcmIscmJyIiwgMCwKLQotICAiLS1TLS0tIiwgMTEsIDE2LCAiMDAwMCAxMTAxIGRkTjAgMDExMCIsICJ0c2V0IEByZCIsIDAsCi0gICItLVMtLS0iLCAxNCwgMTYsICIwMTAwIDExMDEgMDAwMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXQgYWRkcmVzc19kc3QiLCAwLAotICAiLS1TLS0tIiwgMTUsIDE2LCAiMDEwMCAxMTAxIGRkTjAgMDExMCBhZGRyZXNzX2RzdCIsICJ0c2V0IGFkZHJlc3NfZHN0KHJkKSIsIDAsCi0gICItLVMtLS0iLCA3LCAxNiwgIjEwMDAgMTEwMSBkZGRkIDAxMTAiLCAidHNldCByZCIsIDAsCi0KLSAgIi0tUy0tLSIsIDExLCA4LCAiMDAwMCAxMTAwIGRkTjAgMDExMCIsICJ0c2V0YiBAcmQiLCAwLAotICAiLS1TLS0tIiwgMTQsIDgsICIwMTAwIDExMDAgMDAwMCAwMTEwIGFkZHJlc3NfZHN0IiwgInRzZXRiIGFkZHJlc3NfZHN0IiwgMCwKLSAgIi0tUy0tLSIsIDE1LCA4LCAiMDEwMCAxMTAwIGRkTjAgMDExMCBhZGRyZXNzX2RzdCIsICJ0c2V0YiBhZGRyZXNzX2RzdChyZCkiLCAwLAotICAiLS1TLS0tIiwgNywgOCwgIjEwMDAgMTEwMCBkZGRkIDAxMTAiLCAidHNldGIgcmJkIiwgMCwKLQotICAiLVpTLS0tIiwgNywgMTYsICIwMDAwIDEwMDEgc3NOMCBkZGRkIiwgInhvciByZCxAcnMiLCAwLAotIi1aUy0tLSIsIDksIDE2LCAiMDEwMCAxMDAxIDAwMDAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3IgcmQsYWRkcmVzc19zcmMiLCAwLAotICAiLVpTLS0tIiwgMTAsIDE2LCAiMDEwMCAxMDAxIHNzTjAgZGRkZCBhZGRyZXNzX3NyYyIsICJ4b3IgcmQsYWRkcmVzc19zcmMocnMpIiwgMCwKLSAgIi1aUy0tLSIsIDcsIDE2LCAiMDAwMCAxMDAxIDAwMDAgZGRkZCBpbW0xNiIsICJ4b3IgcmQsaW1tMTYiLCAwLAotICAiLVpTLS0tIiwgNCwgMTYsICIxMDAwIDEwMDEgc3NzcyBkZGRkIiwgInhvciByZCxycyIsIDAsCi0KLSAgIi1aU1AtLSIsIDcsIDgsICIwMDAwIDEwMDAgc3NOMCBkZGRkIiwgInhvcmIgcmJkLEBycyIsIDAsCi0iLVpTUC0tIiwgOSwgOCwgIjAxMDAgMTAwMCAwMDAwIGRkZGQgYWRkcmVzc19zcmMiLCAieG9yYiByYmQsYWRkcmVzc19zcmMiLCAwLAotICAiLVpTUC0tIiwgMTAsIDgsICIwMTAwIDEwMDAgc3NOMCBkZGRkIGFkZHJlc3Nfc3JjIiwgInhvcmIgcmJkLGFkZHJlc3Nfc3JjKHJzKSIsIDAsCi0gICItWlNQLS0iLCA3LCA4LCAiMDAwMCAxMDAwIDAwMDAgZGRkZCBpbW04IGltbTgiLCAieG9yYiByYmQsaW1tOCIsIDAsCi0gICItWlNQLS0iLCA0LCA4LCAiMTAwMCAxMDAwIHNzc3MgZGRkZCIsICJ4b3JiIHJiZCxyYnMiLCAwLAotICAiKiIsIDQsIDgsICIxMDAwIDEwMDAgc3NzcyBkZGRkIiwgInhvcmIgcmJkLHJicyIsIDAsCi0gICIqIiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKLQotaW50Ci1jb3VudCAoKQotewotICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7Ci0gIGludCByID0gMDsKLQotICB3aGlsZSAocC0+bmFtZSkKLSAgICB7Ci0gICAgICByKys7Ci0gICAgICBwKys7Ci0gICAgfQotICByZXR1cm4gcjsKLQotfQotCi1zdGF0aWMKLWludAotZnVuYyAoYSwgYikKLSAgICAgc3RydWN0IG9wICphOwotICAgICBzdHJ1Y3Qgb3AgKmI7Ci17Ci0gIHJldHVybiBzdHJjbXAgKChhKS0+bmFtZSwgKGIpLT5uYW1lKTsKLX0KLQotCi0vKiBvcGNvZGUKLQotIGxpdGVyYWwgIDAwMDAgbm5ubiBpbnNlcnQgbm5uIGludG8gc3RyZWFtCi0gb3BlcmFuZCAgMDAwMSBubm5uICBpbnNlcnQgb3BlcmFuZCByZWcgbm5uIGludG8gc3RyZWFtCi0qLwotCi1zdHJ1Y3QgdG9rX3N0cnVjdAotewotCi0gIGNoYXIgKm1hdGNoOwotICBjaGFyICp0b2tlbjsKLSAgaW50IGxlbmd0aDsKLX07Ci0KLXN0cnVjdCB0b2tfc3RydWN0IGFyZ3NbXSA9Ci17Ci0KLSAgeyJhZGRyZXNzX3NyYyhycykiLCAiQ0xBU1NfWCsoQVJHX1JTKSIsfSwKLSAgeyJhZGRyZXNzX2RzdChyZCkiLCAiQ0xBU1NfWCsoQVJHX1JEKSIsfSwKLQotICB7InJzKGltbTE2KSIsICJDTEFTU19CQSsoQVJHX1JTKSIsfSwKLSAgeyJyZChpbW0xNikiLCAiQ0xBU1NfQkErKEFSR19SRCkiLH0sCi0gIHsicHJkIiwgICAgICAgIkNMQVNTX1BSKyhBUkdfUkQpIix9LAotICB7ImFkZHJlc3Nfc3JjIiwgIkNMQVNTX0RBKyhBUkdfU1JDKSIsfSwKLSAgeyJhZGRyZXNzX2RzdCIsICJDTEFTU19EQSsoQVJHX0RTVCkiLH0sCi0gIHsicmQocngpIiwgIkNMQVNTX0JYKyhBUkdfUkQpIix9LAotICB7InJzKHJ4KSIsICJDTEFTU19CWCsoQVJHX1JTKSIsfSwKLQotICB7ImRpc3AxNiIsICJDTEFTU19ESVNQIix9LAotICB7ImRpc3AxMiIsICJDTEFTU19ESVNQIix9LAotICB7ImRpc3A3IiwgIkNMQVNTX0RJU1AiLH0sCi0gIHsiZGlzcDgiLCAiQ0xBU1NfRElTUCIsfSwKLSAgeyJmbGFncyIsICJDTEFTU19GTEFHUyIsfSwKLQotICB7ImltbTE2IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTE2KSIsfSwKLSAgeyJpbW0xb3IyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTFPUjIpIix9LAotICB7ImltbTMyIiwgIkNMQVNTX0lNTSsoQVJHX0lNTTMyKSIsfSwKLSAgeyJpbW00bTEiLCAiQ0xBU1NfSU1NICsoQVJHX0lNTTRNMSkiLH0sCi0gIHsiaW1tNCIsICJDTEFTU19JTU0gKyhBUkdfSU1NNCkiLH0sCi0gIHsibiIsICJDTEFTU19JTU0gKyAoQVJHX0lNTU4pIix9LAotICB7ImN0cmwiLCAiQ0xBU1NfQ1RSTCIsfSwKLSAgeyJyYmEiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SQSkiLH0sCi0gIHsicmJiIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUkIpIix9LAotICB7InJiZCIsICJDTEFTU19SRUdfQllURSsoQVJHX1JEKSIsfSwKLSAgeyJyYnMiLCAiQ0xBU1NfUkVHX0JZVEUrKEFSR19SUykiLH0sCi0gIHsicmJyIiwgIkNMQVNTX1JFR19CWVRFKyhBUkdfUlIpIix9LAotCi0gIHsicnJkIiwgIkNMQVNTX1JFR19MT05HKyhBUkdfUkQpIix9LAotICB7InJycyIsICJDTEFTU19SRUdfTE9ORysoQVJHX1JTKSIsfSwKLQotICB7InJxZCIsICJDTEFTU19SRUdfUVVBRCsoQVJHX1JEKSIsfSwKLQotICB7InJkIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUkQpIix9LAotICB7InJzIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlMpIix9LAotCi0gIHsiQHJkIiwgIkNMQVNTX0lSKyhBUkdfUkQpIix9LAotICB7IkByYSIsICJDTEFTU19JUisoQVJHX1JBKSIsfSwKLSAgeyJAcmIiLCAiQ0xBU1NfSVIrKEFSR19SQikiLH0sCi0gIHsiQHJzIiwgIkNMQVNTX0lSKyhBUkdfUlMpIix9LAotCi0gIHsiaW1tOCIsICJDTEFTU19JTU0rKEFSR19JTU04KSIsfSwKLSAgeyJpMiIsICJDTEFTU19JTU0rKEFSR19JTU0yKSIsfSwKLSAgeyJjYyIsICJDTEFTU19DQyIsfSwKLQotICB7InJyIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlIpIix9LAotICB7InJhIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUkEpIix9LAotICB7InJzIiwgIkNMQVNTX1JFR19XT1JEKyhBUkdfUlMpIix9LAotCi0gIHsiMSIsICJDTEFTU19JTU0rKEFSR19JTU1fMSkiLH0sCi0gIHsiMiIsICJDTEFTU19JTU0rKEFSR19JTU1fMikiLH0sCi0KLSAgMCwgMAotfTsKLQotc3RydWN0IHRva19zdHJ1Y3QgdG9rc1tdID0KLXsKLSAgIjAwMDAiLCAiQ0xBU1NfQklUKzAiLCAxLAotICAiMDAwMSIsICJDTEFTU19CSVQrMSIsIDEsCi0gICIwMDEwIiwgIkNMQVNTX0JJVCsyIiwgMSwKLSAgIjAwMTEiLCAiQ0xBU1NfQklUKzMiLCAxLAotICAiMDEwMCIsICJDTEFTU19CSVQrNCIsIDEsCi0gICIwMTAxIiwgIkNMQVNTX0JJVCs1IiwgMSwKLSAgIjAxMTAiLCAiQ0xBU1NfQklUKzYiLCAxLAotICAiMDExMSIsICJDTEFTU19CSVQrNyIsIDEsCi0gICIxMDAwIiwgIkNMQVNTX0JJVCs4IiwgMSwKLSAgIjEwMDEiLCAiQ0xBU1NfQklUKzkiLCAxLAotICAiMTAxMCIsICJDTEFTU19CSVQrMHhhIiwgMSwKLSAgIjEwMTEiLCAiQ0xBU1NfQklUKzB4YiIsIDEsCi0gICIxMTAwIiwgIkNMQVNTX0JJVCsweGMiLCAxLAotICAiMTEwMSIsICJDTEFTU19CSVQrMHhkIiwgMSwKLSAgIjExMTAiLCAiQ0xBU1NfQklUKzB4ZSIsIDEsCi0gICIxMTExIiwgIkNMQVNTX0JJVCsweGYiLCAxLAotCi0gICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzAiLCAxLAotICAiMDBJMCIsICJDTEFTU19CSVRfMU9SMisxIiwgMSwKLSAgIjAwSTAiLCAiQ0xBU1NfQklUXzFPUjIrMiIsIDEsCi0gICIwMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzMiLCAxLAotICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis0IiwgMSwKLSAgIjAxSTAiLCAiQ0xBU1NfQklUXzFPUjIrNSIsIDEsCi0gICIwMUkwIiwgIkNMQVNTX0JJVF8xT1IyKzYiLCAxLAotICAiMDFJMCIsICJDTEFTU19CSVRfMU9SMis3IiwgMSwKLSAgIjEwSTAiLCAiQ0xBU1NfQklUXzFPUjIrOCIsIDEsCi0gICIxMEkwIiwgIkNMQVNTX0JJVF8xT1IyKzkiLCAxLAotICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMisweGEiLCAxLAotICAiMTBJMCIsICJDTEFTU19CSVRfMU9SMisweGIiLCAxLAotICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGMiLCAxLAotICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGQiLCAxLAotICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGUiLCAxLAotICAiMTFJMCIsICJDTEFTU19CSVRfMU9SMisweGYiLCAxLAotCi0gICJzc3NzIiwgIkNMQVNTX1JFRysoQVJHX1JTKSIsIDEsCi0gICJkZGRkIiwgIkNMQVNTX1JFRysoQVJHX1JEKSIsIDEsCi0gICJhYWFhIiwgIkNMQVNTX1JFRysoQVJHX1JBKSIsIDEsCi0gICJiYmJiIiwgIkNMQVNTX1JFRysoQVJHX1JCKSIsIDEsCi0gICJycnJyIiwgIkNMQVNTX1JFRysoQVJHX1JSKSIsIDEsCi0KLSAgInNzTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SUykiLCAxLAotICAiZGROMCIsICJDTEFTU19SRUdOMCsoQVJHX1JEKSIsIDEsCi0gICJhYU4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUkEpIiwgMSwKLSAgImJiTjAiLCAiQ0xBU1NfUkVHTjArKEFSR19SQikiLCAxLAotICAicnJOMCIsICJDTEFTU19SRUdOMCsoQVJHX1JSKSIsIDEsCi0KLSAgImNjY2MiLCAiQ0xBU1NfQ0MiLCAxLAotICAibm5ubiIsICJDTEFTU19JTU0rKEFSR19JTU1OKSIsIDEsCi0gICJ4eHh4IiwgIkNMQVNTX1JFRysoQVJHX1JYKSIsIDEsCi0gICJ4eE4wIiwgIkNMQVNTX1JFR04wKyhBUkdfUlgpIiwgMSwKLSAgIm5taW51czEiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NTk1JTlVTMSkiLCAxLAotCi0gICJkaXNwMTYiLCAiQ0xBU1NfRElTUCsoQVJHX0RJU1AxNikiLCA0LAotICAiZGlzcDEyIiwgIkNMQVNTX0RJU1ArKEFSR19ESVNQMTIpIiwgMywKLSAgImZsYWdzIiwgIkNMQVNTX0ZMQUdTIiwgMSwKLSAgImFkZHJlc3NfZHN0IiwgIkNMQVNTX0FERFJFU1MrKEFSR19EU1QpIiwgNCwKLSAgImFkZHJlc3Nfc3JjIiwgIkNMQVNTX0FERFJFU1MrKEFSR19TUkMpIiwgNCwKLSAgImltbTRtMSIsICJDTEFTU19JTU0rKEFSR19JTU00TTEpIiwgMSwKLSAgImltbTQiLCAiQ0xBU1NfSU1NKyhBUkdfSU1NNCkiLCAxLAotCi0gICJpbW04IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTgpIiwgMiwKLSAgImltbTE2IiwgIkNMQVNTX0lNTSsoQVJHX0lNTTE2KSIsIDQsCi0gICJpbW0zMiIsICJDTEFTU19JTU0rKEFSR19JTU0zMikiLCA4LAotICAibmltOCIsICJDTEFTU19JTU0rKEFSR19OSU04KSIsIDIsCi0gICIwY2NjIiwgIkNMQVNTXzBDQ0MiLCAxLAotICAiMWNjYyIsICJDTEFTU18xQ0NDIiwgMSwKLSAgImRpc3A4IiwgIkNMQVNTX0RJU1A4IiwgMiwKLSAgIjBkaXNwNyIsICJDTEFTU18wRElTUDciLCAyLAotICAiMWRpc3A3IiwgIkNMQVNTXzFESVNQNyIsIDIsCi0gICIwMWlpIiwgIkNMQVNTXzAxSUkiLCAxLAotICAiMDBpaSIsICJDTEFTU18wMElJIiwgMSwKLSAgMCwgMAotCi19OwotCi1jaGFyICoKLXRyYW5zbGF0ZSAodGFibGUsIHgsIGxlbmd0aCkKLSAgICAgc3RydWN0IHRva19zdHJ1Y3QgKnRhYmxlOwotICAgICBjaGFyICp4OwotICAgICBpbnQgKmxlbmd0aDsKLXsKLQotICBpbnQgZm91bmQ7Ci0KLSAgZm91bmQgPSAwOwotICB3aGlsZSAodGFibGUtPm1hdGNoKQotICAgIHsKLSAgICAgIGludCBsID0gc3RybGVuICh0YWJsZS0+bWF0Y2gpOwotCi0gICAgICBpZiAoc3RybmNtcCAodGFibGUtPm1hdGNoLCB4LCBsKSA9PSAwKQotCXsKLQkgIC8qIEdvdCBhIGhpdCAqLwotCSAgcHJpbnRmICgiJXMiLCB0YWJsZS0+dG9rZW4pOwotCSAgKmxlbmd0aCArPSB0YWJsZS0+bGVuZ3RoOwotCSAgcmV0dXJuIHggKyBsOwotCX0KLQotICAgICAgdGFibGUrKzsKLSAgICB9Ci0gIGZwcmludGYgKHN0ZGVyciwgIkNhbid0IGZpbmQgJXNcbiIsIHgpOwotICBwcmludGYgKCIqKioqIENhbid0IGZpbmQgJXNcbiIsIHgpOwotICB3aGlsZSAoKngpCi0gICAgeCsrOwotICByZXR1cm4geDsKLX0KLQotdm9pZAotY2hld2JpdHMgKGJpdHMsIGxlbmd0aCkKLSAgICAgY2hhciAqYml0czsKLSAgICAgaW50ICpsZW5ndGg7Ci17Ci0gIGludCBuID0gMDsKLQotICAqbGVuZ3RoID0gMDsKLSAgcHJpbnRmICgieyIpOwotICB3aGlsZSAoKmJpdHMpCi0gICAgewotICAgICAgd2hpbGUgKCpiaXRzID09ICcgJykKLQl7Ci0JICBiaXRzKys7Ci0JfQotICAgICAgYml0cyA9IHRyYW5zbGF0ZSAodG9rcywgYml0cywgbGVuZ3RoKTsKLSAgICAgIG4rKzsKLSAgICAgIHByaW50ZiAoIiwiKTsKLQotICAgIH0KLSAgd2hpbGUgKG4gPCBCWVRFX0lORk9fTEVOIC0gMSkKLSAgICB7Ci0gICAgICBwcmludGYgKCIwLCIpOwotICAgICAgbisrOwotICAgIH0KLSAgcHJpbnRmICgifSIpOwotfQotCi0KLXN0YXRpYwotaW50Ci1jaGV3bmFtZSAobmFtZSkKLSAgICAgY2hhciAqbmFtZTsKLXsKLSAgY2hhciAqbjsKLSAgaW50IG5hcmdzID0gMDsKLQotICBuID0gbmFtZTsKLSAgcHJpbnRmICgiXCIiKTsKLSAgd2hpbGUgKCpuICYmICFpc3doaXRlICgqbikpCi0gICAgewotICAgICAgcHJpbnRmICgiJWMiLCAqbik7Ci0gICAgICBuKys7Ci0gICAgfQotICBwcmludGYgKCJcIiwiKTsJCS8qIFNjYW4gdGhlIG9wZXJhbmRzIGFuZCBtYWtlIGVudGlyZXMgZm9yCi0JCQkJICAgdGhlbSAtcmVtZW1iZXIgaW5kaXJlY3QgdGhpbmdzICovCi0KLSAgbiA9IG5hbWU7Ci0gIHByaW50ZiAoIk9QQ18iKTsKLSAgd2hpbGUgKCpuICYmICFpc3doaXRlICgqbikpCi0gICAgewotICAgICAgcHJpbnRmICgiJWMiLCAqbik7Ci0gICAgICBuKys7Ci0gICAgfQotICBwcmludGYgKCIsMCx7Iik7Ci0KLSAgd2hpbGUgKCpuKQotICAgIHsKLSAgICAgIGludCBkOwotCi0gICAgICB3aGlsZSAoKm4gPT0gJywnIHx8IGlzd2hpdGUgKCpuKSkKLQluKys7Ci0gICAgICBuYXJncysrOwotICAgICAgbiA9IHRyYW5zbGF0ZSAoYXJncywgbiwgJmQpOwotICAgICAgcHJpbnRmICgiLCIpOwotICAgIH0KLSAgaWYgKG5hcmdzID09IDApCi0gICAgewotICAgICAgcHJpbnRmICgiMCIpOwotICAgIH0KLSAgcHJpbnRmICgifSwiKTsKLSAgcmV0dXJuIG5hcmdzOwotfQotCi1zdGF0aWMgCi12b2lkCi1zdWIgKHgsIGMpCi0gICAgIGNoYXIgKng7Ci0gICAgIGNoYXIgYzsKLXsKLSAgd2hpbGUgKCp4KQotICAgIHsKLSAgICAgIGlmICh4WzBdID09IGMgJiYgeFsxXSA9PSBjICYmCi0JICB4WzJdID09IGMgJiYgeFszXSA9PSBjKQotCXsKLQkgIHhbMl0gPSAnTic7Ci0JICB4WzNdID0gJzAnOwotCX0KLSAgICAgIHgrKzsKLSAgICB9Ci19Ci0KLQotI2lmIDAKLSNkZWZpbmUgRCh4KSAoKHgpID09ICcxJyB8fCAoeCkgPT0nMCcpCi0jZGVmaW5lIE0oeSkgKHN0cm5jbXAoeSx4LDQpPT0wKQotcHJpbnRtYW5nbGVkICh4KQotICAgICBjaGFyICp4OwotewotICByZXR1cm47Ci0gIHdoaWxlICgqeCkKLSAgICB7Ci0gICAgICBpZiAoRCAoeFswXSkgJiYgRCAoeFsxXSkgJiYgRCAoeFsyXSkgJiYgRCAoeFszXSkpCi0JewotCSAgcHJpbnRmICgiWFhYWCIpOwotCX0KLSAgICAgIGVsc2UgaWYgKE0gKCJzc3NzIikpCi0JewotCSAgcHJpbnRmICgic3NzcyIpOwotCX0KLSAgICAgIGVsc2UgaWYgKE0gKCJkZGRkIikpCi0JewotCSAgcHJpbnRmICgiZGRkZCIpOwotCX0KLSAgICAgIGVsc2UKLQlwcmludGYgKCJfX19fIik7Ci0KLSAgICAgIHggKz0gNDsKLQotICAgICAgaWYgKHhbMF0gPT0gJyAnKQotCXsKLQkgIHByaW50ZiAoIl8iKTsKLQkgIHgrKzsKLQl9Ci0gICAgfQotCi19Ci0KLSNlbmRpZgotLyojZGVmaW5lIFdPUktfVFlQRSovCi12b2lkCi1wcmludF90eXBlIChuKQotICAgICBzdHJ1Y3Qgb3AgKm47Ci17Ci0jaWZkZWYgV09SS19UWVBFCi0gIHdoaWxlICgqcyAmJiAhaXN3aGl0ZSAoKnMpKQotICAgIHsKLSAgICAgIGwgPSAqczsKLSAgICAgIHMrKzsKLSAgICB9Ci0gIHN3aXRjaCAobCkKLSAgICB7Ci0gICAgY2FzZSAnbCc6Ci0gICAgICBwcmludGYgKCIzMiwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2InOgotICAgICAgcHJpbnRmICgiOCwiKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwcmludGYgKCIxNiwiKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSNlbHNlCi0gIHByaW50ZiAoIiUyZCwiLCBuLT50eXBlKTsKLSNlbmRpZgotfQotCi0KLXZvaWQKLWludGVybmFsICgpCi17Ci0gIGludCBjID0gY291bnQgKCk7Ci0gIHN0cnVjdCBvcCAqbmV3ID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3ApICogYyk7Ci0gIHN0cnVjdCBvcCAqcCA9IG9wdDsKLSAgbWVtY3B5IChuZXcsIHAsIGMgKiBzaXplb2YgKHN0cnVjdCBvcCkpOwotCi0gIC8qIHNvcnQgYWxsIG5hbWVzIGluIHRhYmxlIGFscGhhYmV0aWNhbGx5ICovCi0gIHFzb3J0IChuZXcsIGMsIHNpemVvZiAoc3RydWN0IG9wKSwgZnVuYyk7Ci0KLSAgcCA9IG5ldzsKLSAgd2hpbGUgKHAtPmZsYWdzWzBdICE9ICcqJykKLSAgewotICAgIC8qIElmIHRoZXJlIGFyZSBhbnkgQHJzLCBzdWIgdGhlIHNzc3MgaW50byBhIHNzbjAsCi0gICAgICAgKHJzKSwgKHNzbjApCi0gICAgICAgKi8KLSAgICBpbnQgbG9vcCA9IDE7Ci0KLSAgICBwcmludGYgKCJcIiVzXCIsJTJkLCAiLCBwLT5mbGFncywgcC0+Y3ljbGVzKTsKLSAgICB3aGlsZSAobG9vcCkKLSAgICB7Ci0gICAgICBjaGFyICpzID0gcC0+bmFtZTsKLQotICAgICAgbG9vcCA9IDA7Ci0gICAgICB3aGlsZSAoKnMpCi0gICAgICB7Ci0JaWYgKHNbMF0gPT0gJ0AnKQotCXsKLQkgIGNoYXIgYzsKLQotCSAgLyogc2tpcCB0aGUgciBhbmQgc3ViIHRoZSBzdHJpbmcgKi8KLQkgIHMrKzsKLQkgIGMgPSBzWzFdOwotCSAgc3ViIChwLT5iaXRzLCBjKTsKLQl9Ci0JaWYgKHNbMF0gPT0gJygnICYmIHNbM10gPT0gJyknKQotCXsKLQkgIHN1YiAocC0+Yml0cywgc1syXSk7Ci0JfQotCWlmIChzWzBdID09ICcoJykKLQl7Ci0JICBzdWIgKHAtPmJpdHMsIHNbLTFdKTsKLQl9Ci0KLQlzKys7Ci0gICAgICB9Ci0KLSAgICB9Ci0gICAgcHJpbnRfdHlwZSAocCk7Ci0gICAgcHJpbnRmICgiXCIlc1wiLFwiJXNcIiwwLFxuIiwgcC0+Yml0cywgcC0+bmFtZSk7Ci0gICAgcCsrOwotICB9Ci19Ci0KLXN0YXRpYyAKLXZvaWQKLWdhcyAoKQotewotICBpbnQgYyA9IGNvdW50ICgpOwotICBzdHJ1Y3Qgb3AgKnAgPSBvcHQ7Ci0gIGludCBpZHggPSAwOwotICBjaGFyICpvbGRuYW1lID0gIiI7Ci0gIHN0cnVjdCBvcCAqbmV3ID0geG1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgb3ApICogYyk7Ci0KLSAgbWVtY3B5IChuZXcsIHAsIGMgKiBzaXplb2YgKHN0cnVjdCBvcCkpOwotCi0gIC8qIHNvcnQgYWxsIG5hbWVzIGluIHRhYmxlIGFscGhhYmV0aWNhbGx5ICovCi0gIHFzb3J0IChuZXcsIGMsIHNpemVvZiAoc3RydWN0IG9wKSwgZnVuYyk7Ci0KLSAgcHJpbnRmICgiCQkJLyogVEhJUyBGSUxFIElTIEFVVE9NQUdJQ0FMTFkgR0VORVJBVEVELCBET04nVCBFRElUIElUICovXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIEFSR19NQVNLIDB4MGZcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1NSQyAweDAxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfRFNUIDB4MDJcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JTIDB4MDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SRCAweDAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUkEgMHgwM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX1JCIDB4MDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19SUiAweDA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfUlggMHgwNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTQgMHgwMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTggMHgwMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTE2IDB4MDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19JTU0zMiAweDA0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NTiAweDA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NTk1JTlVTMSAweDA1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NXzEgMHgwNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTV8yIDB4MDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQMTYgMHgwOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX05JTTggMHgwOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTIgMHgwYVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQVJHX0lNTTFPUjIgMHgwYlxuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfRElTUDEyIDB4MGJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIEFSR19ESVNQOCAweDBjXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBBUkdfSU1NNE0xIDB4MGRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX01BU0sgMHgxZmZmMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfWCAweDEwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CQSAweDIwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19EQSAweDMwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CWCAweDQwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19ESVNQIDB4NTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0lNTSAweDYwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19DQyAweDcwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19DVFJMIDB4ODBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0FERFJFU1MgMHhkMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMENDQyAweGUwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18xQ0NDIDB4ZjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTXzBESVNQNyAweDEwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfMURJU1A3IDB4MjAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wMUlJIDB4MzAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU18wMElJIDB4NDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19CSVQgMHg1MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX0ZMQUdTIDB4NjAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19JUiAweDcwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfRElTUDggMHg4MDBcbiIpOwotCi0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfQklUXzFPUjIgMHg5MDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFRyAweDcwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19CWVRFIDB4MjAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHX1dPUkQgMHgzMDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19SRUdfUVVBRCAweDQwMDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIENMQVNTX1JFR19MT05HIDB4NTAwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgQ0xBU1NfUkVHTjAgMHg4MDAwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBDTEFTU19QUiAweDEwMDAwXG4iKTsKLQotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hZGMgMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkY2IgMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2FkZCAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkYiAzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYWRkbCA0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfYW5kIDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19hbmRiIDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19iaXQgN1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JpdGIgOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NhbGwgOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NhbHIgMTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jbHIgMTFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jbHJiIDEyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tIDEzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY29tYiAxNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NvbWZsZyAxNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwIDE2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BiIDE3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkIDE4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BkYiAxOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwZHIgMjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGRyYiAyMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaSAyMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2NwaWIgMjNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGlyIDI0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BpcmIgMjVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcGwgMjZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkIDI3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzZGIgMjhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNkciAyOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2RyYiAzMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2kgMzFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19jcHNpYiAzMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2Nwc2lyIDMzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfY3BzaXJiIDM0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGFiIDM1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGJqbnogMzZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kZWMgMzdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kZWNiIDM4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGkgMzlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaXYgNDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19kaXZsIDQxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZGpueiA0MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2VpIDQzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXggNDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leGIgNDVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzIDQ2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfZXh0c2IgNDdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19leHRzbCA0OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2hhbHQgNDlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbiA1MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luYiA1MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luYyA1MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luY2IgNTNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmQgNTRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19pbmRiIDU1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaW5pYiA1NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2luaWJyIDU3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfaXJldCA1OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2pwIDU5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfanIgNjBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZCA2MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYSA2MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkYXIgNjNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGIgNjRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGN0bCA2NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaXIgNjZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGlyYiA2N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkayA2OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkbCA2OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkbSA3MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkcHMgNzFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHIgNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZHJiIDczXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRybCA3NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX21iaXQgNzVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tcmVxIDc2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXJlcyA3N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX21zZXQgNzhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19tdWx0IDc5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbXVsdGwgODBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19uZWcgODFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19uZWdiIDgyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbm9wIDgzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3IgODRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vcmIgODVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXQgODZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRiIDg3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0ZCA4OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX291dGRiIDg5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfb3V0aWIgOTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19vdXRpYnIgOTFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19wb3AgOTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19wb3BsIDkzXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcHVzaCA5NFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3B1c2hsIDk1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzIDk2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmVzYiA5N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3Jlc2ZsZyA5OFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JldCA5OVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsIDEwMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JsYiAxMDFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGMgMTAyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcmxjYiAxMDNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ybGRiIDEwNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyIDEwNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JyYiAxMDZcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmMgMTA3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnJjYiAxMDhcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19ycmRiIDEwOVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NiYyAxMTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zYmNiIDExMVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYSAxMTJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZGFiIDExM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkYWwgMTE0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsIDExNVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NkbGIgMTE2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2RsbCAxMTdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXQgMTE4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2V0YiAxMTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zZXRmbGcgMTIwXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2luYiAxMjFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zaW5kIDEyMlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmRiIDEyM1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmliIDEyNFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NpbmliciAxMjVcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGEgMTI2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc2xhYiAxMjdcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGFsIDEyOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbCAxMjlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zbGxiIDEzMFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NsbGwgMTMxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dCAxMzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0YiAxMzNcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0ZCAxMzRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zb3V0ZGIgMTM1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc291dGliIDEzNlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NvdXRpYnIgMTM3XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhIDEzOFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3NyYWIgMTM5XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JhbCAxNDBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmwgMTQxXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfc3JsYiAxNDJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zcmxsIDE0M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YiAxNDRcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zdWJiIDE0NVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3N1YmwgMTQ2XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGNjIDE0N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RjY2IgMTQ4XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdGVzdCAxNDlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0YiAxNTBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190ZXN0bCAxNTFcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cmRiIDE1MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyZHJiIDE1M1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RyaWIgMTU0XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJpcmIgMTU1XG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfdHJ0ZHJiIDE1NlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydGliIDE1N1xuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RydGlyYiAxNThcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190cnRyYiAxNTlcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ190c2V0IDE2MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3RzZXRiIDE2MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3hvciAxNjJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ194b3JiIDE2M1xuIik7Ci0KLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkICAxNjQgXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfbGRkYiAgMTY1IFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkZHIgIDE2NiBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19sZGRyYiAxNjcgIFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaSAgMTY4IFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2xkaWIgMTY5ICBcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19zYyAgIDE3MFxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2JwdCAgIDE3MVxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDBlIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDBmIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDhlIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX2V4dDhmIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQzNiAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkMzggMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDc4IDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmQ3ZSAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkOWQgMTcyXG4iKTsKLSAgcHJpbnRmICgiI2RlZmluZSBPUENfcnN2ZDlmIDE3MlxuIik7Ci0gIHByaW50ZiAoIiNkZWZpbmUgT1BDX3JzdmRiOSAxNzJcbiIpOwotICBwcmludGYgKCIjZGVmaW5lIE9QQ19yc3ZkYmYgMTcyXG4iKTsKLSNpZiAwCi0gIGZvciAoaSA9IDA7IHRva3NbaV0udG9rZW47IGkrKykKLSAgICBwcmludGYgKCIjZGVmaW5lICVzXHQweCV4XG4iLCB0b2tzW2ldLnRva2VuLCBpICogMTYpOwotI2VuZGlmCi0gIHByaW50ZiAoInR5cGVkZWYgc3RydWN0IHtcbiIpOwotCi0gIHByaW50ZiAoIiNpZmRlZiBOSUNFTkFNRVNcbiIpOwotICBwcmludGYgKCJjaGFyICpuaWNlbmFtZTtcbiIpOwotICBwcmludGYgKCJpbnQgdHlwZTtcbiIpOwotICBwcmludGYgKCJpbnQgY3ljbGVzO1xuIik7Ci0gIHByaW50ZiAoImludCBmbGFncztcbiIpOwotICBwcmludGYgKCIjZW5kaWZcbiIpOwotICBwcmludGYgKCJjaGFyICpuYW1lO1xuIik7Ci0gIHByaW50ZiAoInVuc2lnbmVkIGNoYXIgb3Bjb2RlO1xuIik7Ci0gIHByaW50ZiAoInZvaWQgKCpmdW5jKSgpO1xuIik7Ci0gIHByaW50ZiAoInVuc2lnbmVkIGludCBhcmdfaW5mb1s0XTtcbiIpOwotICBwcmludGYgKCJ1bnNpZ25lZCBpbnQgYnl0ZV9pbmZvWyVkXTtcbiIsIEJZVEVfSU5GT19MRU4pOwotICBwcmludGYgKCJpbnQgbm9wZXJhbmRzO1xuIik7Ci0gIHByaW50ZiAoImludCBsZW5ndGg7XG4iKTsKLSAgcHJpbnRmICgiaW50IGlkeDtcbiIpOwotICBwcmludGYgKCJ9IG9wY29kZV9lbnRyeV90eXBlO1xuIik7Ci0gIHByaW50ZiAoIiNpZmRlZiBERUZJTkVfVEFCTEVcbiIpOwotICBwcmludGYgKCJvcGNvZGVfZW50cnlfdHlwZSB6OGtfdGFibGVbXSA9IHtcbiIpOwotCi0gIHdoaWxlIChuZXctPmZsYWdzICYmIG5ldy0+ZmxhZ3NbMF0pCi0gICAgewotICAgICAgaW50IG5hcmdzOwotICAgICAgaW50IGxlbmd0aDsKLQotICAgICAgcHJpbnRmICgiXG5cbi8qICVzICoqKiAlcyAqL1xuIiwgbmV3LT5iaXRzLCBuZXctPm5hbWUpOwotICAgICAgcHJpbnRmICgie1xuIik7Ci0KLSAgICAgIHByaW50ZiAoIiNpZmRlZiBOSUNFTkFNRVNcbiIpOwotICAgICAgcHJpbnRmICgiXCIlc1wiLCVkLCVkLFxuIiwgbmV3LT5uYW1lLCBuZXctPnR5cGUsIG5ldy0+Y3ljbGVzKTsKLSAgICAgIHsKLQlpbnQgYW5zd2VyID0gMDsKLQljaGFyICpwID0gbmV3LT5mbGFnczsKLQotCXdoaWxlICgqcCkKLQkgIHsKLQkgICAgYW5zd2VyIDw8PSAxOwotCi0JICAgIGlmICgqcCAhPSAnLScpCi0JICAgICAgYW5zd2VyIHw9IDE7Ci0JICAgIHArKzsKLQkgIH0KLQlwcmludGYgKCIweCUwMngsXG4iLCBhbnN3ZXIpOwotICAgICAgfQotCi0gICAgICBwcmludGYgKCIjZW5kaWZcbiIpOwotCi0gICAgICBuYXJncyA9IGNoZXduYW1lIChuZXctPm5hbWUpOwotCi0gICAgICBwcmludGYgKCJcblx0Iik7Ci0gICAgICBjaGV3Yml0cyAobmV3LT5iaXRzLCAmbGVuZ3RoKTsKLSAgICAgIGxlbmd0aCAvPSAyOwotICAgICAgaWYgKGxlbmd0aCAmIDEpCi0JYWJvcnQoKTsKLQotICAgICAgcHJpbnRmICgiLCVkLCVkLCVkIiwgbmFyZ3MsIGxlbmd0aCwgaWR4KTsKLSAgICAgIGlkeCsrOwotICAgICAgb2xkbmFtZSA9IG5ldy0+bmFtZTsKLSAgICAgIHByaW50ZiAoIn0sXG4iKTsKLSAgICAgIG5ldysrOwotICAgIH0KLSAgcHJpbnRmICgiMCwwfTtcbiIpOwotICBwcmludGYgKCIjZW5kaWZcbiIpOwotfQotCi0KLWludAotbWFpbiAoYWMsIGF2KQotICAgICBpbnQgYWM7Ci0gICAgIGNoYXIgKiphdjsKLXsKLSAgc3RydWN0IG9wICpwID0gb3B0OwotCi0gIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItdCIpID09IDApCi0gICAgewotICAgICAgaW50ZXJuYWwgKCk7Ci0gICAgfQotICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItaCIpID09IDApCi0gICAgewotICAgICAgd2hpbGUgKHAtPm5hbWUpCi0JewotCSAgcHJpbnRmICgiJS0yNXNcdCVzXG4iLCBwLT5uYW1lLCBwLT5iaXRzKTsKLQkgIHArKzsKLQl9Ci0gICAgfQotCi0gIGVsc2UgaWYgKGFjID09IDIgJiYgc3RyY21wIChhdlsxXSwgIi1hIikgPT0gMCkKLSAgICB7Ci0gICAgICBnYXMgKCk7Ci0gICAgfQotICBlbHNlIGlmIChhYyA9PSAyICYmIHN0cmNtcCAoYXZbMV0sICItZCIpID09IDApCi0gICAgewotICAgICAgLypkaXMoKTsqLwotICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIHByaW50ZiAoIlVzYWdlOiAlcyAtdFxuIiwgYXZbMF0pOwotICAgICAgcHJpbnRmICgiLXQgOiBnZW5lcmF0ZSBuZXcgejguYyBpbnRlcm5hbCB0YWJsZVxuIik7Ci0gICAgICBwcmludGYgKCItYSA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgZ2FzXG4iKTsKLSAgICAgIHByaW50ZiAoIi1kIDogZ2VuZXJhdGUgbmV3IHRhYmxlIGZvciBkaXNhc3NlbWJsZVxuIik7Ci0gICAgICBwcmludGYgKCItaCA6IGdlbmVyYXRlIG5ldyB0YWJsZSBmb3IgaHVtYW5zXG4iKTsKLSAgICB9Ci1yZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3JlYWRsaW5lL0NoYW5nZUxvZyBiL3JlYWRsaW5lL0NoYW5nZUxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ZmNmMy4uMDAwMDAwMAotLS0gYS9yZWFkbGluZS9DaGFuZ2VMb2cKKysrIC9kZXYvbnVsbApAQCAtMSw5ODIgKzAsMCBAQAotMTk5OS0wNC0yMiAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IE1ha2UgY29tbWVudCBhYm91dCB0aGlzIGNoYW5nZSBtb3JlIGV4cGxpY2l0LgotCi0xOTk5LTA0LTIyICBKYXNvbiBNb2xlbmRhICAoanNtQGJ1Z3NoYWNrLmN5Z251cy5jb20pCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoaW5zdGFsbCk6IERvbid0IGluc3RhbGwgdGhlIGZpbmFsIGxpYnJlYWRsaW5lLmEKLSAgICAgICAgb3IgLmggZmlsZXMuCi0KLVR1ZSBNYXIgMjMgMTA6NTY6MDggMTk5OSAgRWxlbmEgWmFubm9uaSAgPGV6YW5ub25pQGt3aWtlbWFydC5jeWdudXMuY29tPgotCi0JUGF0Y2hlcyBmcm9tIFJvYmVydCBIb2VobmUgPHJvYmVydC5ob2VobmVAZ214Lm5ldD46Ci0gCQotCSogZGlzcGxheS5jOiBDaGFuZ2Ugc29tZSB0ZXJtaW5hbCBjYWxscyB0byB3b3JrIG9uIERKR1BQLgotCSogdGVybWluYWwuYzogTGlrZXdpc2UuCi0JKiBNYWtlZmlsZS5pbjogUmVtb3ZlIC4gZnJvbSB0aGUgVlBBVEggZGlyZWN0aXZlLgotCQotVHVlIE1hciAgOSAxNDo1ODoxMyAxOTk5ICBHZW9mZnJleSBOb2VyICA8bm9lckBjeWdudXMuY29tPgotCi0JKiBzdXBwb3J0L2NvbmZpZy5zdWI6IFJlY29nbml6ZSBjeWd3aW4qLCBub3QganVzdCBjeWd3aW4zMi4KLQotVHVlIEZlYiAgOSAxMDozODo1NyAxOTk5ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbjogRG8gbm90IHVzZSB0aGUgLi9zdXBwb3J0IGRpcmVjdG9yeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotV2VkIEphbiAgNiAxMjoyNDoxOSAxOTk5ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFVzZSBMT0NBTF9DRkxBR1MgcmF0aGVyIHRoYW4gQ0ZMQUdTIGZvcgotCXNlYXJjaGluZyBsaWJ0ZXJtY2FwIGRpcmVjdG9yeS4KLQkqIGNvbmZpZ3VyZTogUmVnZW5lcmF0ZS4KLQotVGh1IERlYyAzMSAxMjowNzowMSAxOTk4ICBDaHJpc3RvcGhlciBGYXlsb3IgPGNnZkBjeWdudXMuY29tPgotCi0JKiBjb25maWd1cmUuaW46IFNlYXJjaCBkZXZvIGxpYnRlcm1jYXAgZGlyZWN0b3J5IGZvciB0ZXJtY2FwLmgKLQl3aGVuIGNvbXBpbGluZyBmb3IgY3lnd2luLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotMTk5OC0xMi0zMCAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQGN5Z251cy5jb20+Ci0KLQkqIE1ha2VmaWxlLmluIChpbnN0YWxsKTogT25seSB0cnkgdG8gY29weSBsaWJyZWFkbGluZS5hIGFuZAotCWxpYmhpc3RvcnkuYSBpZiB0aGV5IGV4aXN0LgotCi1UdWUgRGVjIDI5IDIzOjQ5OjIwIDE5OTggIENocmlzdG9waGVyIEZheWxvciA8Y2dmQGN5Z251cy5jb20+Ci0KLQkqIGNyb3NzLWJ1aWxkL2N5Z3dpbi5jYWNoZTogQWRkIGEgY291cGxlIG1vcmUga25vd24gc2V0dGluZ3MuCi0JKiBjb25maWd1cmUuaW46IEZpeCB0eXBvLgotCSogY29uZmlndXJlOiBSZWdlbmVyYXRlZC4KLQotVHVlIERlYyAyOSAxODoxMToyOCAxOTk4ICBFbGVuYSBaYW5ub25pICA8ZXphbm5vbmlAa3dpa2VtYXJ0LmN5Z251cy5jb20+Ci0KLQkqIGNyb3NzLWJ1aWxkOiBuZXcgZGlyZWN0b3J5LgotCQotCSogY3Jvc3MtYnVpbGQvY3lnd2luLmNhY2hlOiBuZXcgZmlsZS4gVXNlZCBmb3IgQ3lnd2luIGNyb3NzIGJ1aWxkcy4KLQotCSogY29uZmlndXJlLmluOiBhZGRlZCB0ZXN0cyBmb3IgY3Jvc3MtYnVpbGQgZm9yIEN5Z3dpbi4KLQotMTk5OC0xMi0yNCAgSmFzb24gTW9sZW5kYSAgKGpzbUBidWdzaGFjay5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIENZR05VUyBMT0NBTCBjb21tZW50LgotCSogYWNjb25maWcuaDogQWRkIG1pc3NpbmcgZGVmaW5lcy4KLQkqIGNvbmZpZy5oLmJvdDogQWRkIG1pc3NpbmcgY29udGVudC4KLQkqIGNvbmZpZ3VyZSwgY29uZmlnLmguaW46IFJlZ2VuZXJhdGVkLgotCi1XZWQgRGVjIDIzIDE2OjIxOjQxIDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogTWFrZWZpbGUuaW46IGNvbW1lbnQgb3V0IHRoZSBydWxlIHRvIHJlYnVpbGQgY29uZmlndXJlIGJ5IAotCXJ1bm5pbmcgYXV0b2NvbmYuIAotCi1UdWUgRGVjIDIyIDEwOjAwOjMwIDE5OTggIEVsZW5hIFphbm5vbmkgIDxlemFubm9uaUBrd2lrZW1hcnQuY3lnbnVzLmNvbT4KLQotCSogc2hlbGwuYyAoc2F2ZXN0cmluZyk6IGlmZGVmJ2QgaXQgb3V0LiAKLQotCSogSW1wb3J0ZWQgbmV3IHZlcnNpb24gb2YgUmVhZGxpbmUgMi4yLjEuIFJlbW92ZWQgYWxsIHRoZSBDeWdudXMKLQlsb2NhbCBjaGFuZ2VzLgotCi0JTmV3IGZpbGVzOiBhY2NvbmZpZy5oLCBhY2xvY2FsLm00LCBhbnNpX3N0ZGxpYi5oLCBjYWxsYmFjay5jLAotIAljb25maWcuaC5pbiwgY29uZmlndXJlLCBoaXN0ZXhwYW5kLmMsIGhpc3RmaWxlLmMsIGhpc3RsaWIuaCwKLSAJaGlzdHNlYXJjaC5jLCBpbnB1dC5jLCBraWxsLmMsIG1hY3JvLmMsIG5scy5jLCBwb3NpeGRpci5oLAotIAlwb3NpeGptcC5oLCBwb3NpeHN0YXQuaCwgcmxjb25mLmgsIHJsdHR5LmgsIHJsd2luc2l6ZS5oLCBzaGVsbC5jLAotIAl0Y2FwLmgsIHRlcm1pbmFsLmMsIHVuZG8uYywgdXRpbC5jLCBzdXBwb3J0IGRpcmVjdG9yeS4KLQotCVJlbW92ZWQgZmlsZXM6IHN5c2RlcCosIGNvbmZpZyBkaXJlY3RvcnkuCi0JCi0KLUZyaSBEZWMgIDQgMTU6MjU6NDEgMTk5OCAgRGF2aWQgVGF5bG9yICA8dGF5bG9yQHRleGFzLmN5Z251cy5jb20+Ci0KLQlUaGUgZm9sbG93aW5nIGNoYW5nZXMgd2VyZSBtYWRlIGJ5IEppbSBCbGFuZHkKLSAJPGppbWJAendpbmdsaS5jeWdudXMuY29tPiBhbmQgRGF2aWQgVGF5bG9yCi0gCTx0YXlsb3JAdGV4YXMuY3lnbnVzLmNvbT4gYXMgcGFydCBvZiBhIHByb2plY3QgdG8gbWVyZ2UgaW4gY2hhbmdlcwotIAltYWRlIGJ5IEhQOyBIUCBkaWQgbm90IGNyZWF0ZSBDaGFuZ2VMb2cgZW50cmllcy4KLQotCSogY29uZmlnL21wLWVuYWJsZS10dWk6IE5ldyBmaWxlLgotCShUVUlfQ0ZMQUdTKTogU2VhcmNoIGRldm8ncyBpbmNsdWRlIGRpcmVjdG9yeSwgYXMgbG9uZyBhcyB3ZSdyZQotIAl0b3RhbGx5IHJ1aW5pbmcgbW9kdWxhcml0eS4KLQkoSU5DTFVERV9TUkNESVIpOiBOZXcgdmFyLgotCShHREJfVFVJX1NSQ0RJUik6IEZpeCBzeW50YXggZXJyb3IuCi0KLQkqIGNvbmZpZ3VyZS5pbjogQ2hlY2sgdGhlIC0tZW5hYmxlLXR1aSBmbGFnOyBpZiBpdCdzIHNldCwgaW5jbHVkZQotIAlhIG1ha2VmaWxlIGZyYWdtZW50IHRoYXQgI2RlZmluZXMgVFVJIGFuZCBhZGRzIHRoZSBuZWVkZWQgI2luY2x1ZGUKLSAJZGlyZWN0b3JpZXMuCi0JKCotKi1ocHV4Kik6IE5ldyBob3N0OyB1c2Ugc3lzZGVwLWhwdXguaC4KLQotCSogTWFrZWZpbGUuaW4gKC5jLm8pOiBDaGVjayB0aGUgdmFyaWFibGUgc2V0IGluIHRoZSBtYWtlZmlsZQotCWZyYWdtZW50IGFib3ZlLgotCi0JKiBkaXNwbGF5LmMgKHRlcm1fZ290byk6IGRlY2xhcmUgaXQuCi0JKGluc2VydF9zb21lX2NoYXJzKTogc2V0IGl0LgotCShkZWxldGVfY2hhcnMpOiBzZXQgaXQuCi0KLQkqIHJlYWRsaW5lLmM6IGFkZCB0dWkgaW5jbHVkZSBmaWxlcyBzdXJyb3VuZGVkIGJ5IFRVSS4KLQkocmxfcmVzZXQpOiBuZXcgZnVuY3Rpb24sIG1vdmUgc29tZSBvZiBybF9hYm9ydCBmdW5jdGlvbmFsaXR5IHRvCi0gCWhlcmUuCi0JKHJsX2Fib3J0KTogY2FsbCBybF9yZXNldC4KLQkocmxfZ2V0Yyk6IHR1aSBjaGFuZ2VzLgotCShpbml0X3Rlcm1pbmFsX2lvKTogdHVpIGNoYW5nZXMuCi0KLQkqIHJlYWRsaW5lLmggKHR1aV92ZXJzaW9uLCBmcHV0Y191bmZpbHRlcmVkLCBmcHV0c191bmZpbHRlcmVkLAotCXR1aV90cHV0cyk6IGRlY2xhcmUgaWYgVFVJIGlzIGRlZmluZWQuCi0KLQkqIHJsdHR5LmMgKHByZXBhcmVfdGVybWluYWxfc2V0dGluZ3MpOiBhZGRpdGlvbmFsIGNvbW1lbnQuCi0KLQkqIHNpZ25hbHMuYzogYWRkIHR1aSBpbmNsdWRlIGZpbGVzIHN1cnJvdW5kZWQgYnkgVFVJLiAgbW92ZSAjaWYKLSAJYW5kICNlbmRpZiB0byBjb2x1bW4gMSBzbyBIUCdzIGNvbXBpbGVyIHdpbGwgYWNjZXB0IHRoZW0uICBSZW1vdmUKLSAJZGVjbGFyYXRpb24gb2YgdHVpRG9BbmRSZXR1cm5Ub1RvcCBzaW5jZSBpdCdzIGRlY2xhcmVkIGluIHR1aS5oLgotCShybF9oYW5kbGVfc2lnd2luY2gpOiBjYWxsIHR1aURvQW5kUmV0dXJuVG9Ub3AgaWYgVFVJIGRlZmluZWQuCi0gIAkocmxfaGFuZGxlX3NpZ3dpbmNoX29uX2NsZWFyKTogZGVmaW5lIGlmIFRVSSBkZWZpbmVkLgotCShybF9zZXRfc2lnbmFscyk6IGlmIFRVSSwgYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uLgotCShybF9jbGVhcl9zaWduYWxzKTogaW5zdGFsbCBybF9oYW5kbGVfc2lnd2luY2hfb25fY2xlYXIuCi0KLQkqIHN5c2RlcC1ocHV4Lmg6IE5ldyBmaWxlLgotCi1Nb24gTm92ICAyIDE1OjI2OjMzIDE5OTggIEdlb2ZmcmV5IE5vZXIgIDxub2VyQGN5Z251cy5jb20+Ci0KLSAgICAgICAgKiBjb25maWd1cmUuaW46IENoZWNrIGN5Z3dpbiogaW5zdGVhZCBvZiBjeWd3aW4zMiouCi0KLVR1ZSBKdWwgMjggMDk6NDM6MjcgMTk5OCAgSmVmZnJleSBBIExhdyAgKGxhd0BjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtaHB1eDExLmg6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluICgqLSotKi1ocHV4MTEqKTogVXNlIHN5c2RlcC1ocHV4MTEuaC4KLQotVGh1IEp1bCAyMyAxNzo0ODoyMSAxOTk4ICBJYW4gTGFuY2UgVGF5bG9yICA8aWFuQGN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5iYXQ6IFJlbW92ZSBvYnNvbGV0ZSBmaWxlLgotCSogZXhhbXBsZXMvY29uZmlndXJlLmJhdDogUmVtb3ZlIG9ic29sZXRlIGZpbGUuCi0KLVdlZCBNYXkgMTMgMTM6NDE6NTMgMTk5OCAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBzeXNkZXAtNmlyaXguaDogTmV3IGZpbGUuCi0JKiBjb25maWd1cmUuaW4gKCotKi1pcml4NiopOiBOZXcgaG9zdDsgdXNlIHN5c2RlcC02aXJpeC5oLgotCi0JKiBNYWtlZmlsZS5pbiAoaXNlYXJjaC5vLCBzZWFyY2gubyk6IERlcGVuZCB1cG9uIHN5c2RlcC5oLgotCShNYWtlZmlsZSk6IERlcGVuZCB1cG9uICQoc3JjZGlyKS9jb25maWd1cmUuaW4uCi0KLVRodSBBcHIgIDkgMTE6NTk6MzggMTk5OCAgSWFuIERhbGwgKDxJYW4uRGFsbEBkc3RvLmRlZmVuY2UuZ292LmF1PgotCi0JKiBjb25maWd1cmUuaW4gKGhvc3Q9PW5ldGJzZCk6IEluY2x1ZGUgY29uZmlnL21oLWJzZDQ0LgotCSogY29uZmlnL21oLWJzZDQ0OiBOZXcgZmlsZS4KLQotV2VkIERlYyAgMyAxNjo0ODoyMCAxOTk3ICBNaWNoYWVsIFNueWRlciAgKG1zbnlkZXJAY2xlYXZlci5jeWdudXMuY29tKQotCi0JKiBybHR0eS5jOiBmaXggdHlwb3MuCi0KLVR1ZSBPY3QgIDggMDg6NTk6MjQgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogdGlsZGUuYyAodGlsZGVfd29yZF9leHBhbmQpOiAgX19NU0RPU19fXyAtPiBfX01TRE9TX18KLQotU2F0IE9jdCAwNSAxMToyNDozNCAxOTk2ICBNYXJrIEFsZXhhbmRlciAgPG1hcmthQGN5Z251cy5jb20+Ci0KLQkqIHJsZGVmcy5oOiBPbiBMaW51eCwgaW5jbHVkZSA8dGVybWlvcy5oPiB0byBmaXggY29tcGlsZSBlcnJvcgotCWluIDx0ZXJtY2FwLmg+LgotCi1XZWQgU2VwICA0IDE4OjA2OjUxIDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIHJsZGVmcy5oOiAgRW5hYmxlIEhBTkRMRV9TSUdOQUxTIGZvciBjeWd3aW4zMi4KLQotVGh1IEF1ZyAyOSAxNjo1OTo0NSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIGNvbmZpZ3VyZS5pbiAoaVszNDVdODYtKi0qKTogUmVjb2duaXplIGk2ODYgZm9yIHBlbnRpdW0gcHJvLgotCi1GcmkgQXVnIDE2IDE3OjQ5OjU3IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGNvbXBsZXRlLmM6ICBJbmNsdWRlIDxwd2QuaD4gaWYgbm90IERPUywgYW5kIGlmIGN5Z3dpbjMyIG9yIG5vdAotCXdpbjMyLgotCSogY29uZmlndXJlLmluOiAgQWRkIHRlc3QgZm9yICotKi1jeWd3aW4zMiogdG8gdXNlIGNvbmZpZy9taC1wb3NpeC4KLQkqIHJlYWRsaW5lLmM6ICBNb3ZlIGRlY2wgb2YgdGdldHN0ciB0byBybGRlZnMuaC4KLQkqIChfcmxfc2V0X3NjcmVlbl9zaXplKTogIFJlbW92ZSByZWR1bmRhbnQgaWZkZWYgTUlOSU1BTHMuCi0JKiBybGRlZnMuaDogIERvbid0IGRvIE1JTklNQUwgZm9yIGN5Z3dpbjMyLiAgQ3lnd2luMzIgbm93IHVzZXMKLQlmdWxsLWJsb3duIHJlYWRsaW5lLCBleGNlcHQgZm9yIHRlcm1jYXAuCi0KLVN1biBBdWcgMTEgMjE6MDY6MjYgMTk5NiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW5AY3JpdHRlcnMuY3lnbnVzLmNvbSkKLQotCSogcmxkZWZzLmM6ICBHZXQgcmlkIG9mIGRlZmluZSBvZiBTSUdBTFJNIGlmIF9XSU4zMiBvciBfX01TRE9TX18uCi0JKiBEb24ndCBkZWZpbmUgU2NyZWVuQ29scy9TY3JlZW5Sb3dzLy4uLiBpZiBjeWd3aW4zMi4KLQkqIHN5c2RlcC1ub3JtLmg6ICBEb24ndCBpbmNsdWRlIDxtYWxsb2MuaD4gaWYgY3lnd2luMzIuCi0KLVN1biBBdWcgMTEgMTQ6NTk6MDkgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQkqIHJsZGVmcy5oOiAgSWYgX19vc2ZfX2lzIGRlZmluZWQsIGluY2x1ZGUgPHRlcm1pby5oPiBpbnN0ZWFkIG9mCi0JPHNndHR5Lmg+LgotCi1GcmkgQXVnICA5IDA4OjU0OjI2IDE5OTYgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGNyaXR0ZXJzLmN5Z251cy5jb20pCi0KLQkqIGJpbmQuYyBjb21wbGV0ZS5jIGhpc3RvcnkuYyByZWFkbGluZS5jOiAgRG9uJ3QgaW5jbHVkZSBzeXMvZmlsZS5oLgotCSogY29tcGxldGUuYyBkaXNwbGF5LmMgcGFyZW5zLmMgcmVhZGxpbmUuYyBybGRlZnMuaCBybHR0eS5jCi0Jc2lnbmFscy5jIHRpbGRlLmM6ICBDaGFuZ2UgcmVmcyB0byBfTVNDX1ZFUiBhbmQgX19XSU4zMl9fIHRvIF9XSU4zMi4KLQkqIHNpZ25hbHMuYyAocmxfc2lnbmFsX2hhbmRsZXIpOiAgSWZkZWYgb3V0IGtpbGwgaWYgX1dJTjMyLgotCSogc3lzZGVwLW5vcm0uaDogIElmZGVmIG91dCBpbmNsdWRlIG9mIGRpcmVudC5oIGlmIF9XSU4zMi4KLQlJbmNsdWRlIG1hbGxvYy5oIGlmIF9XSU4zMi4KLQotVGh1IEp1bCAxOCAxNTo1OTozNSAxOTk2ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAdGlrdG9rLmN5Z251cy5jb20+Ci0KLQkqIHJsZGVmcy5oIChzeXMvdWlvLmgpIEJlZm9yZSBzeXMvc3RyZWFtLmggaXMgaW5jbHVkZWQgdW5kZXIgQUlYLAotCWluY2x1ZGUgc3lzL3Vpby5oLCB3aGljaCBwcmV2ZW50cyBhbiB1bmRlZmluZWQgc3RydWN0dXJlIHVzZWQgaW4gYQotCXByb3RvdHlwZSBtZXNzYWdlIGZyb20gYmVpbmcgZ2VuZXJhdGVkLgotCi1UdWUgSnVuIDI1IDIzOjA1OjU1IDE5OTYgIEphc29uIE1vbGVuZGEgIChjcmFzaEBnb2R6aWxsYS5jeWdudXMuY28uanApCi0KLSAgICAgICAgKiBNYWtlZmlsZS5pbiAoZGF0YWRpcik6IFNldCB0byAkKHByZWZpeCkvc2hhcmUuCi0JKGRvY2Rpcik6IFJlbW92ZWQuCi0KLVN1biBNYXkgMjYgMTU6MTQ6NDIgMTk5NiAgRnJlZCBGaXNoICA8Zm5mQGN5Z251cy5jb20+Ci0KLQlGcm9tOiBEYXZpZCBNb3NiZXJnZXItVGFuZyAgPGRhdmlkbUBhenN0YXJuZXQuY29tPgotCi0JKiBzeXNkZXAtbGludXguaDogTmV3IGZpbGUuCi0JKiBkaXNwbGF5LmM6IEFkZCBpbmNsdWRlIG9mICJzeXNkZXAuaCIgdG8gZ2V0IEhBVkVfVkFSQVJHU19ILgotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgcGF0dGVybiBpWzM0NV04Ni0qLWxpbnV4KiBpbnRvICotKi1saW51eCogdG8KLQlzdXBwb3J0IG5vbi14ODYgYmFzZWQgTGludXggcGxhdGZvcm1zLgotCi1TdW4gQXByICA3IDIyOjA2OjExIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JRnJvbTogTWlsZXMgQmFkZXIgIDxtaWxlc0BnbnUuYWkubWl0LmVkdT4KLQkqIGNvbmZpZy9taC1nbnU6IE5ldyBmaWxlLgotCSogY29uZmlndXJlLmluICgqLSotZ251Kik6IE5ldyBob3N0LgotCi1TdW4gQXByICA3IDEzOjIxOjUxIDE5OTYgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JRnJvbTogUm9iZXJ0IExpcGUgPHJvYmVydGxAZGdpaS5jb20+Ci0JKiBjb25maWd1cmUuaW46IFNDTyBPcGVuU2VydmVyIDUgKGEuay5hIDMuMnY1KikgaXMgbW9yZSBsaWtlCi0JU0NPIDMuMnY0IHRoYW4gMy4ydjIuCi0KLVdlZCBKYW4gIDMgMTg6MjI6MTAgMTk5NiAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogcmVhZGxpbmUuYywgZGlzcGxheS5jLCBjb21wbGV0ZS5jOiBBZGQgX01TQ19WRVIgdG8gbGlzdCBvZgotCXRoaW5ncyB3aGljaCBjYW4ndCBkbyBtb3N0IHRoaW5ncy4KLQotVGh1IE5vdiAxNiAxNTozOTowNSAxOTk1ICBHZW9mZnJleSBOb2VyIDxub2VyQGN5Z251cy5jb20+Ci0KLQkqIGNvbXBsZXRlLmM6IENoYW5nZSBXSU4zMiB0byBfX1dJTjMyX18sIGFkZGVkICNlbHNlIHJldHVybiBOVUxMCi0JdG8gZW5kIG9mIHRoYXQgZGVmaW5lLgotCi1UdWUgT2N0IDMxIDEwOjM4OjU4IDE5OTUgIHN0ZXZlIGNoYW1iZXJsYWluICA8c2FjQHNsYXNoLmN5Z251cy5jb20+Ci0KLQkqIGRpc3BsYXkuYywgcGFyZW5zLmMsIHJlYWRsaW5lLmMsIHJsZGVmcy5oOiBDaGFuZ2UgdXNlIG9mCi0JV0lOMzIgdG8gX19XSU4zMl9fLgotCi1UdWUgT2N0IDEwIDExOjA3OjIzIDE5OTUgIEZyZWQgRmlzaCAgPGZuZkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAoQklTT04pOiBSZW1vdmUgbWFjcm8uCi0KLVR1ZSBPY3QgMTAgMDg6NDk6MDAgMTk5NSAgc3RldmUgY2hhbWJlcmxhaW4gIDxzYWNAc2xhc2guY3lnbnVzLmNvbT4KLQotCSogY29tcGxldGUuYyAoZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbik6IEVuYWJsZSBmb3IKLQl3aW4zMiB3aGVuIG5vdCBNU0MuCi0KLVN1biBPY3QgIDggMDQ6MTc6MTkgMTk5NSAgUGV0ZXIgU2NoYXVlciAgKHBlc0ByZWdlbnQuZS10ZWNobmlrLnR1LW11ZW5jaGVuLmRlKQotCi0JKiBjb25maWd1cmUuaW46ICBIYW5kbGUgcG93ZXJwYy1pYm0tYWl4KiBsaWtlIHJzNjAwMC1pYm0tYWl4Ki4KLQotU2F0IE9jdCAgNyAyMDozNjoxNiAxOTk1ICBNaWNoYWVsIE1laXNzbmVyICA8bWVpc3NuZXJAY3lnbnVzLmNvbT4KLQotCSogcmx0dHkuYyAob3V0Y2hhcik6IFJldHVybiBhbiBpbnQsIGxpa2UgdHB1dHMgZXhwZWN0cy4KLQkqIHNpZ25hbHMuYyAoX3JsX291dHB1dF9jaGFyYWN0ZXJfZnVuY3Rpb24pOiBEaXR0by4KLQotRnJpIFNlcCAyOSAxNToxOToyMyAxOTk1ICBzdGV2ZSBjaGFtYmVybGFpbiAgPHNhY0BzbGFzaC5jeWdudXMuY29tPgotCi0JRml4ZXMgZm9yIHdoZW4gdGhlIGhvc3QgV0lOMzIsIGJ1dCBub3QgTVNDLgotCSogY29tcGxldGUuYzogU29tZXRpbWVzIGhhdmUgcHdkLmgKLQkqIHBhcmVucy5jOiBXSU4zMiBoYXMgc2ltaWxhciByZXN0cmljdGlvbnMgdG8gX19HTzMyX18uCi0JKiByZWFkbGluZS5jIChfX0dPMzJfXyk6IFNvbWUgb2YgdGhpcyBtb3ZlZCBpbnRvIHJsZGVmcy5oCi0JKiBzaWduYWxzLmMgKF9fR08zMl9fKTogTGlrZXdpc2UuCi0JKiBybGRlZnMuaCAoTVNET1N8fFdJTjMyKSBiZWNvbWVzIE1TRE9TfHxNU0MuCi0JKFdJTjMyJiYhV0lOMzIpOiBOZXcgZGVmaW5pdGlvbnMuCi0KLVdlZCBTZXAgMjAgMTI6NTc6MTcgMTk5NSAgSWFuIExhbmNlIFRheWxvciAgPGlhbkBjeWdudXMuY29tPgotCi0JKiBNYWtlZmlsZS5pbiAobWFpbnRhaW5lci1jbGVhbik6IE5ldyBzeW5vbnltIGZvciByZWFsY2xlYW4uCi0KLVdlZCBNYXIgIDEgMTM6MzM6NDMgMTk5NSAgTWljaGFlbCBNZWlzc25lciAgPG1laXNzbmVyQHRpa3Rvay5jeWdudXMuY29tPgotCi0JKiBybHR0eS5jIChvdXRjaGFyKTogUHJvdmlkZSBwcm90b3R5cGUgZm9yIG91dGNoYXIsIHRvIHNpbGVuY2UKLQl0eXBlIHdhcm5pbmdzIGluIHBhc3Npbmcgb3V0Y2hhciB0byB0cHV0cyBvbiBzeXN0ZW1zIGxpa2UgTGludXgKLQl0aGF0IGhhdmUgZnVsbCBwcm90b3R5cGVzLgotCi0JKiBzaWduYWxzLmMgKF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKTogUHJvdmlkZSBwcm90b3R5cGUgdG8KLQlzaWxlbmNlIHR5cGUgd2FybmluZ3MuCi0KLVN1biBKYW4gMTUgMTQ6MTA6MzcgMTk5NSAgU3RldmUgQ2hhbWJlcmxhaW4gIDxzYWNAc3BsYXQ+Ci0KLQkqIHJsZGVmcy5oOiBEZWZpbmUgTUlOSU1BTCBmb3IgX19HTzMyX18gYW5kIFdJTjMyLgotCSogY29tcGxldGUuYywgZGlzcGxheS5jLCByZWFkbGluZS5jLCBybHR0eS5jOiBUZXN0IE1JTklNQUwKLQlpbnN0ZWFkIG9mIF9fR08zMl9fLgotCi1XZWQgQXVnIDI0IDEzOjA0OjQ3IDE5OTQgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5Ac2FuZ3VpbmUuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBDaGFuZ2UgaVszNF04NiB0byBpWzM0NV04Ni4KLQotU2F0IEp1bCAxNiAxMzoyNjozMSAxOTk0ICBTdGFuIFNoZWJzICAoc2hlYnNAYW5kcm9zLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTg4Ki1oYXJyaXMtY3h1eDcqKTogUmVjb2duaXplLgotCSogc3lzZGVwLWN4dXg3Lmg6IE5ldyBmaWxlLgotCi1GcmkgSnVsICA4IDEzOjE4OjMzIDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHJ0dHR5LmMgKGNvbnRyb2xfbWV0YV9rZXlfb24pOiBSZW1vdmUgc3VwZXJmbHVvdXMgdGVzdGluZyBvZgotCV9fR08zMl9fLgotCi1UaHUgSnVuIDMwIDE1OjIxOjU0IDE5OTQgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjQGpvbm55LmN5Z251cy5jb20pCi0KLQkqIHJsdHR5LmMgKGNvbnRyb2xfbWV0YV9rZXlfb24pOiBEb24ndCBjb21waWxlIGlmIF9fR08zMl9fIGlzCi0JZGVmaW5lZC4KLQkocmx0dHlfc2V0X2RlZmF1bHRfYmluZGluZ3MpOiBMaWtld2lzZS4KLQkqIGRpc3BsYXkuYyAoaW5zZXJ0X3NvbWVfY2hhcnMsIGRlbGV0ZV9jaGFycyk6IHJvd19zdGFydCBzaG91bGQgYmUKLQlhIHNob3J0LgotCSogcGFyZW5zLmMgKHJsX2luc2VydF9jbG9zZSk6IE5vIEZEX1NFVCBpZiB1c2luZyBfX0dPMzJfXy4KLQkqIHJlYWRsaW5lLmMgKHJsX2dhdGhlcl90eWkpOiBTdHJpcCBvZmYgc3B1cmlvdXMgaGlnaCBiaXRzLgotCi1TdW4gSnVuIDEyIDAzOjUxOjUyIDE5OTQgIFBldGVyIFNjaGF1ZXIgIChwZXNAcmVnZW50LmUtdGVjaG5pay50dS1tdWVuY2hlbi5kZSkKLQotCSogaGlzdG9yeS5jOiAgU3dhcCBpbmNsdXNpb24gb2YgcmxkZWZzLmggYW5kIGNoYXJkZWZzLmggdG8gYXZvaWQKLQlDVFJMIG1hY3JvIHJlZGVmaW5pdGlvbi4KLQotTW9uIE1heSAgOSAxODoyOTo0MiAxOTk0ICBJYW4gTGFuY2UgVGF5bG9yICAoaWFuQHR3ZWVkbGVkdW1iLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MpOiBEb24ndCBjb21waWxlIGlmCi0JX19HTzMyX18gaXMgZGVmaW5lZC4KLQkoX3JsX3NldF9zY3JlZW5fc2l6ZSk6IExpa2V3aXNlLgotCSogcmx0dHkuYyAocmx0dHlfc2V0X2RlZmF1bHRfYmluZGluZ3MpOiBMaWtld2lzZS4KLQkoY29udHJvbF9tZXRhX2tleSk6IExpa2V3aXNlLgotCSogZGlzcGxheS5jOiBJZiBfX0dPMzJfXyBpcyBkZWZpbmVkLCBpbmNsdWRlIDxzeXMvcGMuaD4uCi0JKiBwYXJlbnMuYzogSWYgX19HTzMyX18gaXMgZGVmaW5lZCwgdW5kZWZpbmUgRkRfU0VULgotCSogc2lnbmFscy5jOiBJbmNsdWRlIFNJR1dJTkNIIGhhbmRsaW5nIGluIHRoZSBzZXQgb2YgdGhpbmdzIHdoaWNoCi0JaXMgbm90IGRvbmUgaWYgSEFORExFX1NJR05BTFMgaXMgbm90IHNldC4KLQotRnJpIE1heSAgNiAxMzozODozOSAxOTk0ICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0BjeWdudXMuY29tKQotCi0gICAgICAgICogY29uZmlnL21oLWdvMzI6IE5ldyBmcmFnbWVudC4KLQkqIGNvbmZpZ3VyZS5pbiAoaG9zdD09Z28zMik6IFVzZSBnbzMyIGZyYWdtZW50LgotCi1XZWQgTWF5ICA0IDE0OjM2OjUzIDE5OTQgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuQGN5Z251cy5jb20pCi0KLQkqIGNoYXJkZWZzLmgsIHJsZGVmcy5oOiAgTW92ZSBkZWNscyBvZiBzdHJpbmcgZnVuY3MgZnJvbSBjaGFyZGVmcy5oCi0JdG8gcmxkZWZzLmggc28gdGhhdCB0aGV5IGRvbid0IHBvbGx1dGUgYXBwcyB0aGF0IGluY2x1ZGUKLQlyZWFkbGluZS5oLgotCSogaGlzdG9yeS5jOiAgaW5jbHVkZSBybGRlZnMuaCB0byBnZXQgZGVjbHMgb2Ygc3RyaW5nIGZ1bmNzLgotCi1XZWQgTWF5ICA0IDEyOjE1OjExIDE5OTQgIFN0YW4gU2hlYnMgIChzaGVic0BhbmRyb3MuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluIChyczYwMDAtYnVsbC1ib3N4Kik6IE5ldyBjb25maWd1cmF0aW9uLCBSUy82MDAwCi0JdmFyaWFudC4KLQotV2VkIEFwciAyMCAxMDo0Mzo1MiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBVc2UgbWgtcG9zaXggZm9yIHN1bm9zNC4xKi4KLQotV2VkIEFwciAxMyAyMToyODo0NCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogcmx0dHkuYyAoc2V0X3R0eV9zZXR0aW5ncyk6IERvbid0IHNldCByZWFkbGluZV9lY2hvaW5nX3AuCi0JKHJsX2RlcHJlcF90ZXJtaW5hbCkgW05FV19UVFlfRFJJVkVSXTogU2V0IHJlYWRsaW5lX2VjaG9pbmdfcC4KLQotU3VuIE1hciAxMyAwOToxMzoxMiAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IEFkZCBUQUdTIHRhcmdldC4KLQotV2VkIE1hciAgOSAxODowMTozMSAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogaXNlYXJjaC5jLCBzZWFyY2guYzogSW5jbHVkZSBzeXNkZXAuaC4KLQotVGh1IE1hciAgMyAxNzo0MDowMyAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AZGVuZWIuY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBGb3IgSVNDLCB1c2UgbWgtc3lzdiwgbm90IG1oLWlzYy4KLQotVGh1IEZlYiAyNCAwNDoxMzo1MyAxOTk0ICBQZXRlciBTY2hhdWVyICAocGVzQHJlZ2VudC5lLXRlY2huaWsudHUtbXVlbmNoZW4uZGUpCi0KLQkqIE1lcmdlIGluIGNoYW5nZXMgZnJvbSBiYXNoLTEuMTMuNS4gTWVyZ2UgY2hhbmdlcyBmcm9tIGdsb2IvdGlsZGUuYwotCWludG8gdGlsZGUuYyBhbmQgdXNlIGl0LiBBZGQgc3lzdGVtIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB3aGVyZQotCW5lY2Vzc2FyeS4gQ2hlY2sgZm9yIF9fR08zMl9fLCBub3QgX0dPMzJfIGNvbnNpc3RlbnRseS4KLQkqIE1ha2VmaWxlLmluOiAgVXBkYXRlIGRlcGVuZGVuY2llcy4KLQkqIHJsdHR5LmM6ICBJbmNsdWRlIDxzeXMvZmlsZS5oPiB0byBtYXRjaCBpbmNsdWRlIGZpbGUgc2V0dXAKLQlpbiByZWFkbGluZS5jIGZvciBybGRlZnMuaC4gT3RoZXJ3aXNlIHdlIGdldCBpbmNvbnNpc3RlbnQKLQlUVFlfRFJJVkVSIGRlZmluaXRpb25zIGluIHJlYWRsaW5lLmMgYW5kIHJsdHR5LmMuCi0JKiBiaW5kLmMsIGNvbXBsZXRlLmM6ICBEbyBub3QgaW5jbHVkZSA8c3lzL3R5cGVzLmg+LCBpdCBpcyBhbHJlYWR5Ci0JaW5jbHVkZWQgdmlhIHN5c2RlcC5oLCB3aGljaCBjYXVzZXMgcHJvYmxlbXMgaWYgPHN5cy90eXBlcy5oPiBoYXMKLQlubyBtdWx0aXBsZSBpbmNsdXNpb24gcHJvdGVjdGlvbi4KLQkqIHJlYWRsaW5lLmMgKF9ybF9zZXRfc2NyZWVuX3NpemUpOiAgUmVlc3RhYmxpc2ggdGVzdCBmb3IKLQlUSU9DR1dJTlNaX0JST0tFTi4KLQkqIHJsZGVmcy5oOiAgRGVmaW5lIFNfSVNSRUcgaWYgbmVjZXNzYXJ5LgotCi1GcmkgRmViIDE4IDA4OjU2OjM1IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogQWRkIHNlYXJjaC5vIHJ1bGUgZm9yIFN1biBtYWtlLgotCi1XZWQgRmViIDE2IDE2OjM1OjQ5IDE5OTQgIFBlciBCb3RobmVyICAoYm90aG5lckBrYWxlc3Npbi5jeWdudXMuY29tKQotCi0JKiBybHR0eS5jOiAgI2lmIG91dCBzb21lIGNvZGUgaWYgX19HTzMyX18uCi0KLVR1ZSBGZWIgMTUgMTQ6MDc6MDggMTk5NCAgUGVyIEJvdGhuZXIgIChib3RobmVyQGthbGVzc2luLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKF9ybF9vdXRwdXRfY2hhcmFjdGVyX2Z1bmN0aW9uKSwgZGlzcGxheS5jOgotCVJldHVybiBpbnQsIG5vdCB2b2lkLCB0byBjb25mb3JtIHdpdGggdGhlIGV4cGVjdGVkIGFyZyBvZiB0cHV0cy4KLQkqIHJlYWRsaW5lLmMgKGluaXRfdGVybWluYWxfaW8pOiAgdGdldGZsYWcgb25seSB0YWtlcyAxIGFyZy4KLQkqIHJlYWRsaW5lLmMgKF9ybF9zYXZlc3RyaW5nKTogIE5ldyBmdW5jdGlvbi4KLQkqIGNoYXJkZWZzLmg6ICBUbyBhdm9pZCBjb25mbGljdHMgYW5kL29yIHdhcm5pbmdzLCBkZWZpbmUKLQlzYXZlc3RyaW5nIGFzIGEgbWFjcm8gd3JhcHBlciBmb3IgX3JsX3NhdmVzdHJpbmcuCi0JKiBkaXNwbGF5LmMgKGV4dGVybiB0ZXJtX3huKTogIEl0J3MgYW4gaW50IGZsYWcsIG5vdCBhIHN0cmluZy4KLQkqIGNoYXJzZGVmcy5oLCBybGRlZnMuaDogIFJlbW92ZSBIQVZFX1NUUklOR19ILXJlbGF0ZWQganVuay4KLQotU2F0IEZlYiAgNSAwODozMjozMCAxOTk0ICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IFJlbW92ZSBvYnNvbGV0ZSBydWxlcyBmb3IgaGlzdG9yeS5pbmZvIGFuZAotCXJlYWRsaW5lLmluZm8uCi0KLVRodSBKYW4gMjcgMTc6MDQ6MDEgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGRlbmViLmN5Z251cy5jb20pCi0KLQkqIGNoYXJkZWZzLmg6IE9ubHkgZGVjbGFyZSBzdHJyY2hyIGlmIGl0IGlzIG5vdCAjZGVmaW5lJ2QuCi0KLVR1ZSBKYW4gMjUgMTE6MzA6MDYgMTk5NCAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJsZGVmcy5oOiBBY2NlcHQgX19ocHV4IGFzIHdlbGwgYXMgaHB1eCBmb3IgSFAgY29tcGlsZXIgaW4gQU5TSSBtb2RlLgotCi1GcmkgSmFuIDIxIDE3OjMxOjI2IDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaXNhLmN5Z251cy5jb20pCi0KLQkqIGNoYXJkZWZzLmgsIHRpbGRlLmM6IEp1c3QgZGVjbGFyZSBzdHJyY2hyIHJhdGhlciB0aGFuIHRyeWluZyB0bwotCWluY2x1ZGUgYSBzeXN0ZW0gaGVhZGVyLgotCi1GcmkgSmFuIDIxIDE0OjQwOjQzIDE5OTQgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiAoZGlzdGNsZWFuLCByZWFsY2xlYW4pOiAgRXhwYW5kIGxvY2FsLWRpc3RjbGVhbgotCWlubGluZSBhZnRlciBkb2luZyByZWN1cnNpb24uICBZb3UgY2FuJ3QgcmVjdXJzZSBhZnRlciByZW1vdmluZwotCU1ha2VmaWxlLiAgTWFrZSB0aGVtIGRlcGVuZCBvbiBsb2NhbC1jbGVhbi4KLQkqIE1ha2VmaWxlLmluIChsb2NhbC1kaXN0Y2xlYW4pOiAgUmVtb3ZlIG5vdyBzdXBlcmZsdW91cyB0YXJnZXQuCi0KLU1vbiBKYW4gMTcgMTI6NDI6MDcgMTk5NCAgS2VuIFJhZWJ1cm4gIChyYWVidXJuQGN1am8uY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoZG9pbmdfYW5fdW5kbyk6IERlbGV0ZSBzZWNvbmQgZGVjbGFyYXRpb24sIHNpbmNlIGl0Ci0JY29uZnVzZXMgdGhlIGFscGhhLW9zZjEgbmF0aXZlIGNvbXBpbGVyLgotCi1TdW4gSmFuIDE2IDEyOjMzOjExIDE5OTQgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb21wbGV0ZS5jLCBiaW5kLmM6IEluY2x1ZGUgPHN5cy9zdGF0Lmg+LgotCSogY29tcGxldGUuYzogRGVmaW5lIFhfT0sgaWYgbm90IGRlZmluZWQgYnkgYSBzeXN0ZW0gaGVhZGVyLgotCi0JKiBjaGFyZGVmcy5oOiBEb24ndCBkZWNsYXJlIHhtYWxsb2MuCi0KLQkqIGtleW1hcHMuaDogSW5jbHVkZSAiY2hhcmRlZnMuaCIgbm90IDxyZWFkbGluZS9jaGFyZGVmcy5oPi4KLQotCSogTWFrZWZpbGUuaW4gKGNsZWFuIG1vc3RseWNsZWFuIGRpc3RjbGVhbiByZWFsY2xlYW4pOiBSZWN1cnNlCi0JaW50byBzdWJkaXJlY3RvcmllcyBhcyB3ZWxsIGFzIGRvaW5nIHRoaXMgZGlyZWN0b3J5LiAgQWRkIGNsZWFuLWR2aQotCXRhcmdldC4KLQotU2F0IEphbiAxNSAxOTozNjoxMiAxOTk0ICBQZXIgQm90aG5lciAgKGJvdGhuZXJAa2FsZXNzaW4uY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYywgZGlzcGxheS5jOiAgUGF0Y2hlcyB0byBhbGxvdyB1c2Ugb2YgYWxsIDgwCi0JY29sdW1ucyBvbiBtb3N0IHRlcm1pbmFscyAodGhvc2Ugd2l0aCBhbSBhbmQgeG4pLgotCi0JTWVyZ2UgaW4gY2hhbmdlcyBmcm9tIGJhc2gtMS4xMy4gIFRoZSBtb3N0IG9idmlvdXMgb25lIGlzCi0JdGhhdCB0aGUgZmlsZSByZWFkbGluZS5jIGhhcyBiZWVuIHNwbGl0IGludG8gbXVsdGlwbGUgZmlsZXMuCi0JKiBiaW5kLmMsIGNvbXBsZXRlLmMsIGRpc3BheS5jLCBpc2VhcmNoLmMsIHBhcmVucy5jLCBybGRlZnMuaCwKLQlybHR0eS5jLCBzZWFyY2guYyBzaWduYWxzLmMsIHRpbGRlLmMsIHRpbGRlLmgsIHhtYWxsb2MuYzogIE5ldyBmaWxlcy4KLQotU2F0IERlYyAxMSAxNjoyOToxNyAxOTkzICBTdGV2ZSBDaGFtYmVybGFpbiAgKHNhY0B0aGVwdWIuY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmxfZ2V0Yyk6IElmIEdPMzIsIHRyaW0gaGlnaCBiaXQgZnJvbSBnZXRrZXksCi0Jb3RoZXJ3aXNlIGZhbmN5IFBDIGtleXMgY2F1c2UgZ3JpZWYuCi0KLUZyaSBOb3YgIDUgMTE6NDk6NDcgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGRvYyB0byBjb25maWdkaXJzLgotCSogTWFrZWZpbGUuaW4gKGluZm8gZHZpIGluc3RhbGwtaW5mbyBjbGVhbi1pbmZvKTogUmVjdXJzZSBpbnRvIGRvYy4KLQotRnJpIE9jdCAyMiAwNzo1NTowOCAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AbGlvdGguY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiBBZGQgKiB0byBlbmQgb2YgYWxsIE9TIG5hbWVzLgotCi1UdWUgT2N0ICA1IDEyOjMzOjUxIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jOiBBZGQgc3R1ZmYgZm9yIEhJVVggdG8gcGxhY2Ugd2hlcmUgd2UgZGV0ZWN0IHRlcm1pbwotCXZzLiBzZ3R0eSAodWdoLCBidXQgSSBkb24ndCBzZWUgYSBzaW1wbGUgYmV0dGVyIHdheSkuCi0KLVdlZCBTZXAgMjkgMTE6MDI6NTggMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHBhcnNlcl9pZik6IEZyZWUgdG5hbWUgd2hlbiBkb25lIHdpdGggaXQgKGNoYW5nZQotCWltcG9ydGVkIGZyb20gZnJvbSBiYXNoCTEuMTIgcmVhZGxpbmUpLgotCi1UdWUgU2VwICA3IDE3OjE1OjM3IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKG04OGstKi1zeXN2cjQqKTogQ29tbWVudCBvdXQgcHJldmlvdXMgY2hhbmdlLgotCi1GcmkgSnVsICAyIDExOjA1OjM0IDE5OTMgIElhbiBMYW5jZSBUYXlsb3IgIChpYW5AY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluICgqLSotcmlzY29zKik6IE5ldyBlbnRyeTsgdXNlIG1oLXN5c3YuCi0KLVdlZCBKdW4gMjMgMTM6MDA6MTIgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGxpb3RoLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogQWRkIGNvbW1lbnQuCi0KLU1vbiBKdW4gMTQgMTQ6Mjg6NTUgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGVyaWMpCi0KLQkqIGNvbmZpZ3VyZS5pbiAobTg4ay0qLXN5c3ZyNCopOiBVc2Ugc3lzZGVwLW5vcm0uaC4KLQotU3VuIEp1biAxMyAxMzowNDowOSAxOTkzICBKaW0gS2luZ2RvbiAgKGtpbmdkb25AY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW4gKHtyZWFsLGRpc3R9Y2xlYW4pOiBSZW1vdmUgc3lzZGVwLmguCi0KLVRodSBKdW4gMTAgMTE6MjI6NDEgMTk5MyAgSmltIEtpbmdkb24gIChraW5nZG9uQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBBZGQgbW9zdGx5Y2xlYW4sIGRpc3RjbGVhbiwgYW5kIHJlYWxjbGVhbiB0YXJnZXRzLgotCi1GcmkgTWF5IDIxIDE3OjA5OjI4IDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbkBsaW90aC5jeWdudXMuY29tKQotCi0JKiBjb25maWcvbWgtaXNjOiBOZXcgZmlsZS4KLQkqIGNvbmZpZ3VyZS5pbjogVXNlIGl0LgotCi1TYXQgQXByIDE3IDAwOjQwOjEyIDE5OTMgIEppbSBLaW5nZG9uICAoa2luZ2RvbiBhdCBjYWx2aW4pCi0KLQkqIHJlYWRsaW5lLmMsIGhpc3RvcnkuYzogRG9uJ3QgaW5jbHVkZSBzeXMvdHlwZXMuaDsgc3lzZGVwLmggZG9lcy4KLQotCSogY29uZmlnL21oLXN5c3Y6IERlZmluZSBUSU9DR1dJTlNaX0JST0tFTi4KLQlyZWFkbGluZS5jOiBDaGVjayBpdC4KLQotV2VkIE1hciAyNCAwMjowNjoxNSAxOTkzICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgcG9zZWlkb24uY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46IGFkZCBpbnN0YWxsY2hlY2sgJiBkdmkgdGFyZ2V0cwotCi1GcmkgTWFyIDEyIDE4OjM2OjUzIDE5OTMgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiByZWNvZ25pemUgKi0qLXNvbGFyaXMyKiBpbnN0ZWFkIG9mICotKi1zb2xhcmlzKiAoYQotCW51bWJlciBvZiBwZW9wbGUgd2FudCB0byBjYWxsIFN1bk9TIDQuMS4yICJzb2xhcmlzMS4wIgotCWFuZCBnZXQgaXQgcmlnaHQpCi0KLVR1ZSBNYXIgIDIgMjE6MjU6MzYgMTk5MyAgRnJlZCBGaXNoICAoZm5mQGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1zeXN2NC5oOiAgTmV3IGZpbGUgZm9yIFNWUjQuCi0JKiBjb25maWd1cmUuaW4gKCotKi1zeXN2NCopOiAgVXNlIHN5c2RlcC1zeXN2NC5oLgotCi0JKiBjb25maWd1cmUuaW4gKCotKi11bHRyaXgyKTogIEFkZCB0cmlwbGV0IGZyb20gTWljaGFlbCBSZW5kZWxsCi0JKG1pY2hhZWxAbWVyY3VyeS5jcy5tdW4uY2EpCi0KLVR1ZSBEZWMgMTUgMTI6Mzg6MTYgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW4gKGlbMzRdODYtKi1zY28zLjJ2NCopOiB1c2UgbWgtc2NvNC4KLQkqIGNvbmZpZy9taC1zY280OiBOZXcgZmlsZSwgbGlrZSBtaC1zY28gYnV0IHdpdGhvdXQgZGVmaW5pbmcKLQlfUE9TSVhfU09VUkNFLgotCi1XZWQgTm92IDExIDIxOjIwOjE0IDE5OTIgIEpvaG4gR2lsbW9yZSAgKGdudUBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWZvcm1hdCB0byBvbmUtY2FzZS1wZXItbGluZS4KLQlIYW5kbGUgU3VuT1MgMy41LCBhcyBwZXIgS2FybCBCZXJyeSwgPGthcmxAY2xhdWRlLmNzLnVtYi5lZHU+LgotCi1XZWQgTm92ICA0IDE1OjMyOjMxIDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1ub3JtLmg6ICBSZW1vdmUgc29tZSBjcnVkLCBpbnN0YWxsIGRpcmUgd2FybmluZy4KLQotVGh1IE9jdCAyMiAwMTowODoxMyAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBNYWtlIFNDTyB3b3JrIGFnYWluLi4uCi0KLU1vbiBPY3QgMTIgMTU6MDQ6MDcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChpbml0X3Rlcm1pbmFsX2lvKTogaWYgdGdldGVudCByZXR1cm5zIDAsIHRoZQotCXRlcm1pbmFsIHR5cGUgaXMgdW5rbm93bi4KLQotVGh1IE9jdCAgMSAyMzo0NDoxNCAxOTkyICBkYXZpZCBkIGB6b28nIHp1aG4gICh6b28gYXQgY2lyZGFuLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogdXNlIGNwdS12ZW5kb3Itb3MgdHJpcGxlIGluc3RlYWQgb2YgbmVzdGVkIGNhc2VzCi0KLVdlZCBTZXAgMzAgMTI6NTg6NTcgMTk5MiAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAocmxfY29tcGxldGVfaW50ZXJuYWwpOiAgQ2FzdCBhbGxvY2EgdG8gKGNoYXIgKikgdG8KLQlhdm9pZCB3YXJuaW5nLgotCi1GcmkgU2VwIDI1IDEyOjQ1OjA1IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKGNsZWFyX3RvX2VvbCwgcmxfZ2VuZXJpY19iaW5kKTogIE1ha2Ugc3RhdGljLgotCShybF9kaWdpdF9sb29wKTogIEFkZCBhcmcgdG8gY2FsbCB0byBybF9tZXNzYWdlKCkuCi0JKiB2aV9tb2RlLmMgKHJsX3ZpX2ZpcnN0X3ByaW50KTogIEFkZCBhcmcgdG8gY2FsbCB0bwotCXJsX2JhY2tfdG9faW5kZW50KCkuCi0KLVdlZCBBdWcgMTkgMTQ6NTk6MDcgMTk5MiAgSWFuIExhbmNlIFRheWxvciAgKGlhbkBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogYWx3YXlzIGNyZWF0ZSBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMsIHVzZSBmdWxsCi0JZmlsZSBuYW1lIGZvciBpbnN0YWxsIHRhcmdldC4KLQotV2VkIEF1ZyAxMiAxNTo1MDo1NyAxOTkyICBKb2huIEdpbG1vcmUgIChnbnVAY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAobGFzdF9yZWFkbGluZV9pbml0X2ZpbGUpOiAgRml4IHR5cG8gbWFkZSBieSBTdGV2ZQotCUNoYW1iZXJsYWluL0RKIERlbG9yaWUuICBQcm9wZXIgY29udHJvbCBmaWxlIG5hbWUgaXMgfi8uaW5wdXRyYywKLQlub3Qgfi9pbnB1dHJjLgotCi1UaHUgSnVuIDI1IDE2OjE1OjI3IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogIE1ha2UgYnNkIGJhc2VkIHN5c3RlbXMgdXNlIHN5c2RlcC1vYnNkLmguCi0KLVR1ZSBKdW4gMjMgMjM6MjI6NTMgMTk5MiAgUGVyIEJvdGhuZXIgIChib3RobmVyQGN5Z251cy5jb20pCi0KLQkqIGNvbmZpZy9taC1wb3NpeDogIE5ldyBmaWxlLCBmb3IgUG9zaXgtY29tcGxpYW50IHN5c3RlbXMuCi0JKiBjb25maWd1cmUuaW46ICBVc2UgbWgtcG9zaXggZm9yIExpbnV4IChmcmVlIFVuaXggY2xvbmUpLgotCi1UdWUgSnVuIDIzIDIxOjU5OjIwIDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtbm9ybS5oIChhbGxvY2EpOiAgUHJvdGVjdCBhZ2FpbnN0IHByZXZpb3VzIGRlZmluaXRpb24gYXMKLQlhIG1hY3JvIHdpdGggYXJndW1lbnRzLgotCi1GcmkgSnVuIDE5IDE1OjQ4OjU0IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHN5c2RlcC1vYnNkLmg6ICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IHRvIG1ha2UgdGhpcyBtb3JlIEtvc2hlci4KLQotRnJpIEp1biAxOSAxMjo1MzoyOCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLWFwb2xsbzY4diwgbWgtc2NvLCBtaC1zeXN2LCBtaC1zeXN2NH06IFJBTkxJQj10cnVlLgotCi1Nb24gSnVuIDE1IDEzOjUwOjM0IDE5OTIgIGRhdmlkIGQgYHpvbycgenVobiAgKHpvbyBhdCBjaXJkYW4uY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiB1c2UgbWgtc3lzdjQgb24gc29sYXJpczIKLQotTW9uIEp1biAxNSAxMjoyODoyNCAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLW5jcjMwMDAgKElOU1RBTEwpOiAgRG9uJ3QgdXNlIC91c3IvdWNiL2luc3RhbGwsCi0JaXQgaXMgYnJva2VuIG9uIG5jciAzMDAwJ3MuCi0JKiBjb25maWcvbWgtbmNyMzAwMCAoUkFOTElCKTogIFVzZSBSQU5MSUI9dHJ1ZS4KLQotTW9uIEp1biAxNSAwMTozNTo1NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYzogTWFrZSBuZXcgU0lHTkFMU18qIG1hY3JvcyB0byBwYXJhbWV0ZXJpemUgdGhlIAotCXVnbHkgY2hhbmdlcyBpbiBzaWduYWwgYmxvY2tpbmcuICBVc2UgdGhlbSB0aHJvdWdob3V0LAotCXJlZHVjaW5nICNpZmRlZiBIQVZFX1BPU0lYX1NJR05BTFMgYW5kIEhBVkVfQlNEX1NJR05BTFMgY2x1dHRlcgotCXNpZ25pZmljYW50bHkuICBNYWtlIGFsbCBzdWNoIHBsYWNlcyB1c2UgUE9TSVggaWYgYXZhaWxhYmxlLAotCXRvIGF2b2lkIGxvc2luZyB3aXRoIHBvb3IgYHNpZ3NldG1hc2snIGVtdWxhdGlvbiBmcm9tIGxpYmliZXJ0eS4KLQotU3VuIEp1biAxNCAxNToxOTo1MSAxOTkyICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jIChpbnNlcnRfc29tZV9jaGFycyk6ICBSZXR1cm4gdm9pZC4KLQotVGh1IEp1biAxMSAwMToyNzo0NSAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYzogICN1bmRlZiBQQywgd2hpY2ggU29sYXJpczIgZGVmaW5lcyBpbiBzeXMvdHlwZXMuaCwKLQljbG9iYmVyaW5nIHRoZSB0ZXJtY2FwIGdsb2JhbCB2YXJpYWJsZSBQQy4KLQotVHVlIEp1biAgOSAxNzozMDoyMyAxOTkyICBGcmVkIEZpc2ggIChmbmZAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL3ttaC1uY3IzMDAwLCBtaC1zeXN2NH06ICBDaGFuZ2UgSU5TVEFMTCB0byB1c2UKLQkvdXNyL3VjYi9pbnN0YWxsLgotCi1Nb24gSnVuICA4IDIzOjEwOjA3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5oIChybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycyk6ICBBZGQgZGVjbGFyYXRpb24uCi0JKiByZWFkbGluZS5jIChybF9jb21wbGV0ZXJfcXVvdGVfY2hhcmFjdGVycyk6ICBBZGQgZ2xvYmFsIHZhci4KLQkqIHJlYWRsaW5lLmMgKHN0cnBicmspOiAgQWRkIHByb3RvdHlwZSBhbmQgZnVuY3Rpb24uCi0JKiByZWFkbGluZS5jIChybF9jb21wbGV0ZV9pbnRlcm5hbCk6ICBBZGQgY29kZSB0byBoYW5kbGUKLQlleHBhbnNpb24gb2YgcXVvdGVkIHN0cmluZ3MuCi0KLU1vbiBNYXkgMTEgMTI6Mzk6MzAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmM6ICBDYW4ndCBpbml0aWFsaXplIEZJTEUgKidzIHdpdGggc3RkaW4gYW5kIHN0ZG91dCwKLQliZWNhdXNlIHRoZXkgbWlnaHQgbm90IGJlIGNvbnN0YW50LiAgUGF0Y2ggZnJvbSBUb20gUXVpbm4sCi0JdHJxQGRpbm95c29zLnRocGh5cy5veC5hYy51ay4KLQotVHVlIEFwciAyOCAyMTo1MjozNCAxOTkyICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuaDogIERlY2xhcmUgcmxfZXZlbnRfaG9vayAod2hpY2ggYWxyZWFkeSBleGlzdGVkKS4KLQlTdWdnZXN0ZWQgYnkgQ2hyaXN0b3BoIFRpZXR6IDx0aWV0ekB6aS5nbWQuZGJwLmRlPi4KLQotV2VkIEFwciAyMiAxODowODowMSAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAcnRsLmN5Z251cy5jb20pCi0KLQkqIGNvbmZpZ3VyZS5pbjogcmVtb3ZlIHN1YmRpcnMgZGVjbGFyYXRpb24uICBUaGUgb2Jzb2xldGUgc2VtYW50aWMKLQkgIGZvciBzdWJkaXJzIGhhcyBiZWVuIHVzdXJwZWQgYnkgcGVyJ3MgbmV3IG1lYW5pbmcuCi0KLVR1ZSBBcHIgMjEgMTE6NTQ6MjMgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZXdvcmsgQ0ZMQUdTIHNvIHRoYXQgdGhleSBjYW4gYmUgc2V0IG9uIHRoZQotCSAgY29tbWFuZCBsaW5lIHRvIG1ha2UuICBSZW1vdmUgTUlOVVNfRy4gIERlZmF1bHQgQ0ZMQUdTIHRvIC1nLgotCi1GcmkgQXByIDEwIDIzOjAyOjI3IDE5OTIgIEZyZWQgRmlzaCAgKGZuZkBjeWdudXMuY29tKQotCi0JKiBjb25maWd1cmUuaW46ICBSZWNvZ25pemUgbmV3IG5jcjMwMDAgY29uZmlnLgotCSogY29uZmlnL21oLW5jcjMwMDA6ICBOZXcgTkNSIDMwMDAgY29uZmlnIGZpbGUuCi0KLVdlZCBNYXIgMjUgMTA6NDY6MzAgMTk5MiAgSm9obiBHaWxtb3JlICAoZ251IGF0IGN5Z251cy5jb20pCi0KLQkqIGhpc3RvcnkuYyAoc3RpZmxlX2hpc3RvcnkpOiAgTmVnYXRpdmUgYXJnIHRyZWF0ZWQgYXMgemVyby4KLQotVHVlIE1hciAyNCAyMzo0NjoyMCAxOTkyICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2hAY3lnbnVzLmNvbSkKLQotCSogY29uZmlnL21oLXN5c3Y6IElOU1RBTExfUFJPRyAtPiBJTlNUQUxMLgotCi1Nb24gRmViIDEwIDAxOjQxOjM1IDE5OTIgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiBoaXN0b3J5LmMgKGhpc3RvcnlfZG9fd3JpdGUpIEJ1aWxkIGEgYnVmZmVyIG9mIGFsbCBvZiB0aGUgbGluZXMKLQl0byB3cml0ZSBhbmQgd3JpdGUgdGhlbSBpbiBvbmUgZmVsbCBzd29vcCAobG93ZXIgb3ZlcmhlYWQgdGhhbgotCWNhbGxpbmcgd3JpdGUgKCkgZm9yIGVhY2ggbGluZSkuICBTdWdnZXN0ZWQgYnkgUGV0ZXIgSG8uCi0KLQkqIHZpX21vZGUuYyAocmxfdmlfc3Vic3QpIERvbid0IGZvcmdldCB0byBlbmQgdGhlIHVuZG8gZ3JvdXAuCi0KLVNhdCBNYXIgIDcgMDA6MTU6MzYgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogcmVtb3ZlIEZJWE1FJ3Mgb24gaW5mbyBhbmQgaW5zdGFsbC1pbmZvIHRhcmdldHMuCi0KLUZyaSBNYXIgIDYgMjI6MDI6MDQgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBhZGRlZCBjaGVjayB0YXJnZXQuCi0KLVdlZCBGZWIgMjYgMTg6MDQ6NDAgMTk5MiAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoQGN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluLCBjb25maWd1cmUuaW46IHJlbW92ZWQgdHJhY2VzIG9mIG5hbWVzdWJkaXIsCi0JICAtc3ViZGlycywgJChzdWJkaXIpLCAkKHVuc3ViZGlyKSwgc29tZSByY3MgdHJpZ2dlcnMuICBGb3JjZWQKLQkgIGNvcHlyaWdodHMgdG8gJzkyLCBjaGFuZ2VkIHNvbWUgZnJvbSBDeWdudXMgdG8gRlNGLgotCi1GcmkgRmViIDIxIDE0OjM3OjMyIDE5OTIgIFN0ZXZlIENoYW1iZXJsYWluICAoc2FjIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiByZWFkbGluZS5jLCBleGFtcGxlcy9maWxlbWFuLmM6IHBhdGNoZXMgZnJvbSBESiB0byBzdXBwb3J0IERPUwotCi1UaHUgRmViIDIwIDIzOjIzOjE2IDE5OTIgIFN0dSBHcm9zc21hbiAgKGdyb3NzbWFuIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJsX3JlYWRfaW5pdF9maWxlKTogIE1ha2Ugc3VyZSB0aGF0IG51bGwgZmlsZW5hbWUgaXMKLQlub3QgcGFzc2VkIHRvIG9wZW4oKSBvciBlbHNlIHdlIGVuZCB1cCBvcGVuaW5nIHRoZSBkaXJlY3RvcnksIGFuZAotCXJlYWQgYSBidW5jaCBvZiBnYXJiYWdlIGludG8ga2V5bWFwW10uCi0KLU1vbiBGZWIgMTcgMTc6MTU6MDkgMTk5MiAgRnJlZCBGaXNoICAoZm5mIGF0IGN5Z251cy5jb20pCi0KLQkqIHJlYWRsaW5lLmMgKHJlYWRsaW5lX2RlZmF1bHRfYmluZGluZ3MpOiAgT25seSBtYWtlIHVzZSBvZiBWTE5FWFQKLQl3aGVuIGJvdGggVkxORVhUIGFuZCBURVJNSU9TX1RUWV9EUklWRVIgaXMgZGVmaW5lZC4gIE9uIFNWUjQKLQk8dGVybWlvLmg+IGluY2x1ZGVzIDx0ZXJtaW9zLmg+LCBzbyBWTE5FWFQgaXMgYWx3YXlzIGRlZmluZWQuCi0KLQkqIHN5c2RlcC1ub3JtLmggKF9QT1NJWF9WRVJTSU9OKTogIERlZmluZSB0aGlzIGZvciBhbGwgU1ZSNAotCXN5c3RlbXMgc28gdGhhdCA8dGVybWlvcy5oPiBnZXRzIHVzZWQsIGluc3RlYWQgb2YgPHRlcm1pby5oPi4KLQotRnJpIERlYyAyMCAxMjowNDozMSAxOTkxICBGcmVkIEZpc2ggIChmbmYgYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluOiAgQ2hhbmdlIHN2cjQgcmVmZXJlbmNlcyB0byBzeXN2NC4KLQotVHVlIERlYyAxMCAwNDowNzoyMCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiBpbmZvZGlyIGJlbG9uZ3MgaW4gZGF0YWRpci4KLQotRnJpIERlYyAgNiAyMzoyMzoxNCAxOTkxICBLLiBSaWNoYXJkIFBpeGxleSAgKHJpY2ggYXQgcnRsLmN5Z251cy5jb20pCi0KLQkqIE1ha2VmaWxlLmluOiByZW1vdmUgc3BhY2VzIGZvbGxvd2luZyBoeXBoZW5zLCBic2QgbWFrZSBjYW4ndAotCSAgY29wZS4gYWRkZWQgY2xlYW4taW5mby4gIGFkZGVkIHN0YW5kYXJkcy50ZXh0IHN1cHBvcnQuICBEb24ndAotCSAga25vdyBob3cgdG8gbWFrZSBpbmZvIGFueW1vcmUuCi0KLQkqIGNvbmZpZ3VyZS5pbjogY29tbW9udGFyZ2V0cyBpcyBubyBsb25nZXIgYSByZWNvZ25pemVkIGhvb2ssIHNvCi0JICByZW1vdmUgaXQuICBuZXcgc3ViZGlyIGNhbGxlZCBkb2MuCi0KLVRodSBEZWMgIDUgMjI6NDY6MTAgMTk5MSAgSy4gUmljaGFyZCBQaXhsZXkgIChyaWNoIGF0IHJ0bC5jeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbjogaWRlc3RkaXIgYW5kIGRkZXN0ZGlyIGdvIGF3YXkuICBBZGRlZCBjb3B5cmlnaHRzCi0JICBhbmQgc2hpZnQgZ3BsIHRvIHYyLiAgQWRkZWQgQ2hhbmdlTG9nIGlmIGl0IGRpZG4ndCBleGlzdC4gZG9jZGlyCi0JICBhbmQgbWFuZGlyIG5vdyBrZXllZCBvZmYgZGF0YWRpciBieSBkZWZhdWx0LgotCi1GcmkgTm92IDIyIDA5OjAyOjMyIDE5OTEgIEpvaG4gR2lsbW9yZSAgKGdudSBhdCBjeWdudXMuY29tKQotCi0JKiBzeXNkZXAtb2JzZC5oOiAgUmVuYW1lIGZyb20gc3lzZGVwLW5ld3Nvcy5oLgotCSogY29uZmlndXJlLmluOiAgVXNlIHN5c2RlcC1vYnNkIGZvciBNYWNoIGFzIHdlbGwgYXMgTkVXcy4KLQotCSogc3lzZGVwLW5vcm0uaCwgc3lzZGVwLWFpeC5oOiAgQWRkIDxzeXMvdHlwZXMuaD4sIHdoaWNoIFBPU0lYCi0JcmVxdWlyZXMgdG8gbWFrZSA8ZGlyZW50Lmg+IHdvcmsuICBJbXByb3ZlIFN1biBhbGxvY2EgZGVjbC4KLQotVGh1IE5vdiAyMSAxODo0ODowOCAxOTkxICBKb2huIEdpbG1vcmUgIChnbnUgYXQgY3lnbnVzLmNvbSkKLQotCSogTWFrZWZpbGUuaW46ICBDbGVhbiB1cCAuLi9nbG9iL3RpbGRlLmMgLT4gdGlsZGUubyBwYXRoLgotCUNsZWFuIHVwIG1ha2VmaWxlIGEgYml0IGluIGdlbmVyYWwuCi0KLVRodSBOb3YgMjEgMTQ6NDA6MjkgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogY29uZmlndXJlLmluLCBjb25maWcvbWgtc3ZyNDogIE1ha2UgU1ZSNCB3b3JrLgotCi0JKiByZWFkbGluZS5jOiAgTW92ZSBjb25maWcgc3R1ZmYgdG8gc3lzZGVwLmgsIHVzZSB0eXBlZGVmIGRpcmVudAotCWNvbnNpc3RlbnRseSwgcmVtb3ZlIHJlZnMgdG8gZF9uYW1sZW4gKCYgRF9OQU1MRU4pIHRvIGltcHJvdmUKLQlwb3J0YWJpbGl0eS4gIEFsc28sIHVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlLgotCXJlYWRsaW5lLmg6ICByZW1vdmUgY29uZmlnIHN0dWZmIHRoYXQgSSBhZGRlZCBlcnJvbmVvdXNseSBpbiB0aGUKLQlmaXJzdCBwbGFjZS4KLQotCSogZW1hY3Nfa2V5bWFwLmMsIGZ1bm1hcC5jLCBoaXN0b3J5LmMsIGtleW1hcHMuYywgdmlfa2V5bWFwLmMsCi0JdmlfbW9kZS5jOiAgbW92ZSBjb25maWcgc3R1ZmYgdG8gc3lzZGVwLmgsIHVwZGF0ZSBjb3B5cmlnaHQgbm90aWNlcy4KLQotVHVlIE5vdiAxOSAxNTowMjoxMyAxOTkxICBTdHUgR3Jvc3NtYW4gIChncm9zc21hbiBhdCBjeWdudXMuY29tKQotCi0JKiBoaXN0b3J5LmM6ICAjaW5jbHVkZSAic3lzZGVwLmgiLgotCi1UdWUgTm92IDE5IDEwOjQ5OjE3IDE5OTEgIEZyZWQgRmlzaCAgKGZuZiBhdCBjeWdudXMuY29tKQotCi0JKiBNYWtlZmlsZS5pbiwgY29uZmlnL2htLXN5c3YsIGNvbmZpZy9obS1zY286ICBDaGFuZ2UgU1lTViB0bwotCVVTRyB0byBtYXRjaCBjdXJyZW50IHVzYWdlLgotCi0JKiByZWFkbGluZS5jOiAgQWRkIFVTR3I0IHRvIGxpc3Qgb2YgZGVmaW5lZCB0aGluZ3MgdG8gY2hlY2sgZm9yCi0JdG8gdXNlIDxkaXJlbnQuaD4gc3R5bGUgZGlyZWN0b3J5IGFjY2Vzcy4KLQotCSogY29uZmlnL2htLXN2cjQ6ICBOZXcgZmlsZSBmb3IgU3lzdGVtIFYgUmVsZWFzZSA0IChVU0dyNCkuCi0KLU1vbiBOb3YgMTggMjM6NTk6NTIgMTk5MSAgU3R1IEdyb3NzbWFuICAoZ3Jvc3NtYW4gYXQgY3lnbnVzLmNvbSkKLQotCSogcmVhZGxpbmUuYyAoZmlsZW5hbWVfY29tcGxldGlvbl9mdW5jdGlvbik6ICB1c2Ugc3RydWN0IGRpcmVudAotCWluc3RlYWQJb2Ygc3RydWN0IGRpcmVjdC4KLQotRnJpIE5vdiAgMSAwNzowMjoxMyAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYyAocmxfdHJhbnNsYXRlX2tleXNlcSkgTWFrZSBDLT8gdHJhbnNsYXRlIHRvIFJVQk9VVAotCXVuY29uZGl0aW9uYWxseS4KLQotTW9uIE9jdCAyOCAxMTozNDo1MiAxOTkxICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzsgVXNlIFBvc2l4IGRpcmVjdG9yeSByb3V0aW5lcyBhbmQgbWFjcm9zLgotCi0JKiBmdW5tYXAuYzsgQWRkIGVudHJ5IGZvciBjYWxsLWxhc3Qta2JkLW1hY3JvLgotCi0JKiByZWFkbGluZS5jIChybF9wcmVwX3Rlcm0pOyBVc2Ugc3lzdGVtIEVPRiBjaGFyYWN0ZXIgb24gUE9TSVgKLQlzeXN0ZW1zIGFsc28uCi0KLVRodSBPY3QgIDMgMTY6MTk6NTMgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM7IE1ha2UgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGhhdmluZyBhIFRFUk1JT1MgdHR5Ci0JZHJpdmVyLCBhbmQgaGF2aW5nIFBPU0lYIHNpZ25hbCBoYW5kbGluZy4gIFlvdSBtaWdodCBvbmUgd2l0aG91dAotCXRoZSBvdGhlci4gIE5ldyBkZWZpbmVzIHVzZWQgSEFWRV9QT1NJWF9TSUdOQUxTLCBhbmQKLQlURVJNSU9TX1RUWV9EUklWRVIuCi0KLVR1ZSBKdWwgMzAgMjI6Mzc6MjYgMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IHJsX2dldGMgKCkgSWYgYSBjYWxsIHRvIHJlYWQgKCkgcmV0dXJucyB3aXRob3V0IGFuCi0JZXJyb3IsIGJ1dCB3aXRoIHplcm8gY2hhcmFjdGVycywgdGhlIGZpbGUgaXMgZW1wdHksIHNvIHJldHVybiBFT0YuCi0KLVRodSBKdWwgMTEgMjA6NTg6MzggMTk5MSAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmM6IChybF9nZXRfbmV4dF9oaXN0b3J5LCBybF9nZXRfcHJldmlvdXNfaGlzdG9yeSkKLQlSZWFsbG9jYXRlIHRoZSBidWZmZXIgc3BhY2UgaWYgdGhlIGxpbmUgYmVpbmcgbW92ZWQgdG8gaXMgbG9uZ2VyCi0JdGhlIHRoZSBjdXJyZW50IHNwYWNlIGFsbG9jYXRlZC4gIEFtYXppbmcgdGhhdCBubyBvbmUgaGFzIGZvdW5kCi0JdGhpcyBidWcgdW50aWwgbm93LgotCi1TdW4gSnVsICA3IDAyOjM3OjA1IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOihybF9wYXJzZV9hbmRfYmluZCkgQWxsb3cgbGVhZGluZyB3aGl0ZXNwYWNlLgotCSAgTWFrZSBzdXJlIFRFUk1JTyBhbmQgVEVSTUlPUyBzeXN0ZW1zIHRyZWF0IENSIGFuZCBOTAotCSAgZGlzY3RpbmN0bHkuCi0JCi1UdWUgSnVuIDI1IDA0OjA5OjI3IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBSZXdvcmsgcGFyc2luZyBjb25kaXRpb25hbHMgdG8gcGF5IGF0dGVudGlvbiB0byB0aGUKLQlwcmlvciBzdGF0ZXMgb2YgdGhlIGNvbmRpdGlvbmFsIHN0YWNrLiAgVGhpcyBtYWtlcyAkaWYgc3RhdGVtZW50cwotCXdvcmsgY29ycmVjdGx5LgotCi1Nb24gSnVuIDI0IDIwOjQ1OjU5IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBzdXBwb3J0IGZvciBkaXNwbGF5aW5nIGtleSBiaW5kaW5nIGluZm9ybWF0aW9uCi0JaW5jbHVkZXMgdGhlIGZ1bmN0aW9ucyBybF9saXN0X2Z1bm1hcF9uYW1lcyAoKSwKLQlpbnZva2luZ19rZXlzZXFzX2luX21hcCAoKSwgcmxfaW52b2tpbmdfa2V5c2VxcyAoKSwKLQlybF9kdW1wX2Z1bmN0aW9ucyAoKSwgYW5kIHJsX2Z1bmN0aW9uX2R1bXBlciAoKS4KLQotCWZ1bm1hcC5jOiBzdXBwb3J0IGZvciBzYW1lIGluY2x1ZGVzIHJsX2Z1bm1hcF9uYW1lcyAoKS4KLQotCXJlYWRsaW5lLmMsIGZ1bm1hcC5jOiBubyBsb25nZXIgZGVmaW5lIFNUQVRJQ19NQUxMT0MuICBIb3dldmVyLAotCXVwZGF0ZSBib3RoIHZlcnNpb24gb2YgeHJlYWxsb2MgKCkgdG8gaGFuZGxlIGEgbnVsbCBwb2ludGVyLgotCi1UaHUgQXByIDI1IDEyOjAzOjQ5IDE5OTEgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiB2aV9tb2RlLmMgKHJsX3ZpX2Z3b3JkLCBmV29yZCwgZXRjLiAgQWxsIGZ1bmN0aW9ucyB1c2UKLQl0aGUgbWFjcm8gYGlzaWRlbnQoKScuICBGaXhlZCBtb3ZlbWVudCBidWcgd2hpY2ggcHJldmVudHMKLQljb250aW5pb3VzIG1vdmVtZW50IHRocm91Z2ggdGhlIHRleHQuCi0KLUZyaSBKdWwgMjcgMTY6NDc6MDEgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBnbnV3ZXN0LmZzZi5vcmcpCi0KLQkqIHJlYWRsaW5lLmMgKHBhcnNlcl9pZikgQWxsb3cgIiRpZiB0ZXJtPWZvbyIgY29uc3RydWN0LgotCi1XZWQgTWF5IDIzIDE2OjEwOjMzIDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jIChybF9kaXNwYXRjaCkgQ29ycmVjdGx5IHJlbWVtYmVyIHRoZSBsYXN0IGNvbW1hbmQKLQlleGVjdXRlZC4gIEZpeGVkIHR5cG8gaW4gdXNlcm5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoKS4KLQotTW9uIEFwciAgOSAxOTo1NTo0OCAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogdXNlcm5hbWVfY29tcGxldGlvbl9mdW5jdGlvbiAoKTsgRm9yIHRleHQgcGFzc2VkIGluCi0Jd2l0aCBhIGxlYWRpbmcgYH4nLCByZW1lbWJlciB0aGF0IHRoaXMgY291bGQgYmUgYSBmaWxlbmFtZSAoYWZ0ZXIKLQlpdCBpcyBjb21wbGV0ZWQpLgotCi1UaHUgQXByICA1IDEzOjQ0OjI0IDE5OTAgIEJyaWFuIEZveCAgKGJmb3ggYXQgZ251d2VzdC5mc2Yub3JnKQotCi0JKiByZWFkbGluZS5jOiBybF9zZWFyY2hfaGlzdG9yeSAoKTogQ29ycmVjdGx5IGhhbmRsZSBjYXNlIG9mIGFuCi0JdW5mb3VuZCBzZWFyY2ggc3RyaW5nLCBidXQgYSBncmFjZWZ1bCBleGl0IChhcyB3aXRoIEVTQykuCi0KLQkqIHJlYWRsaW5lLmM6IHJsX3Jlc3RhcnRfb3V0cHV0ICgpOyAgVGhlIEFwb2xsbyBwYXNzZXMgdGhlIGFkZHJlc3MKLQlvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIFRJT0NTVEFSVCwgbm90IHRoZSBkZXNjcmlwdG9yIGl0c2VsZi4KLQotVHVlIE1hciAyMCAwNTozODo1NSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogcmVhZGxpbmUuYzogcmxfY29tcGxldGUgKCk7IHNlY29uZCBjYWxsIGluIGEgcm93IGNhdXNlcyBwb3NzaWJsZQotCWNvbXBsZXRpb25zIHRvIGJlIGxpc3RlZC4KLQotCSogcmVhZGxpbmUuYzogcmxfcmVkaXNwbGF5ICgpLCBhZGRlZCBwcm9tcHRfdGhpc19saW5lIHZhcmlhYmxlCi0Jd2hpY2ggaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBjaGFyYWN0ZXIgZm9sbG93aW5nIFxuIGluIHByb21wdC4KLQotU3VuIE1hciAxMSAwNDozMjowMyAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IGdudXdlc3QuZnNmLm9yZykKLQotCSogU2lnbmFscyBhcmUgbm93IHN1cHBvc2VkbHkgaGFuZGxlZCBpbnNpZGUgb2YgU1lTViBjb21waWxhdGlvbi4KLQotV2VkIEphbiAxNyAxOToyNDowOSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IHNicGh5LnVjc2IuZWR1KQotCi0JKiBoaXN0b3J5LmM6IGhpc3RvcnlfZXhwYW5kICgpOyBmaXhlZCBvdmVyd3JpdGluZyBtZW1vcnkgZXJyb3IsCi0JYWRkZWQgbmVlZGVkIGFyZ3VtZW50IHRvIGNhbGwgdG8gZ2V0X2hpc3RvcnlfZXZlbnQgKCkuCi0KLVRodSBKYW4gMTEgMTA6NTQ6MDQgMTk5MCAgQnJpYW4gRm94ICAoYmZveCBhdCBzYnBoeS51Y3NiLmVkdSkKLQotCSogcmVhZGxpbmUuYzogYWRkZWQgbWFya19tb2RpZmllZF9saW5lcyB0byBjb250cm9sIHRoZQotCWRpc3BsYXkgb2YgYW4gYXN0ZXJpc2sgb24gbW9kaWZpZWQgaGlzdG9yeSBsaW5lcy4gIEFsc28KLQlhZGRlZCBhIHVzZXIgdmFyaWFibGUgY2FsbGVkIG1hcmstbW9kaWZpZWQtbGluZXMgdG8gdGhlCi0JYHNldCcgY29tbWFuZC4KLQotVGh1IEphbiAgNCAxMDozODowNSAxOTkwICBCcmlhbiBGb3ggIChiZm94IGF0IHNicGh5LnVjc2IuZWR1KQotCi0JKiByZWFkbGluZS5jOiBzdGFydF9pbnNlcnQgKCkuICBPbmx5IHVzZSBJQyBpZiB3ZSBkb24ndCBoYXZlIGFuIGltCi0JY2FwYWJpbGl0eS4KLQotRnJpIFNlcCAgOCAwOTowMDo0NSAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiByZWFkbGluZS5jOiBybF9wcmVwX3Rlcm1pbmFsICgpLiAgT25seSB0dXJuIG9uIDh0aCBiaXQKLQkgIGFzIG1ldGEtYml0IGlmZiB0aGUgdGVybWluYWwgaXMgbm90IHVzaW5nIHBhcml0eS4KLQotU3VuIFNlcCAgMyAwODo1Nzo0MCAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiByZWFkbGluZS5jOiBzdGFydF9pbnNlcnQgKCkuICBVc2VzIG11bHRpcGxlCi0JICBpbnNlcnRpb24gY2FsbCBpbiBjYXNlcyB3aGVyZSB0aGF0IG1ha2VzIHNlbnNlLgotCi0JICBybF9pbnNlcnQgKCkuICBSZWFkIHR5cGUtYWhlYWQgYnVmZmVyIGZvciBhZGRpdGlvbmFsCi0JICBrZXlzIHRoYXQgYXJlIGJvdW5kIHRvIHJsX2luc2VydCwgYW5kIGluc2VydCB0aGVtCi0JICBhbGwgYXQgb25jZS4gIE1ha2UgaW5zZXJ0aW9uIG9mIHNpbmdsZSBrZXlzIGdpdmVuCi0JICB3aXRoIGFuIGFyZ3VtZW50IG11Y2ggbW9yZSBlZmZpY2llbnQuCi0KLVR1ZSBBdWcgIDggMTg6MTM6NTcgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmVhZGxpbmUuYzogQ2hhbmdlZCBoYW5kbGluZyBvZiBFT0YuICByZWFkbGluZSAoKSByZXR1cm5zCi0JIChjaGFyICopRU9GIG9yIGNvbnNlZCBzdHJpbmcuICBUaGUgRU9GIGNoYXJhY3RlciBpcyByZWFkIGZyb20gdGhlCi0JIHR0eSwgb3IgaWYgdGhlIHR0eSBkb2Vzbid0IGhhdmUgb25lLCBkZWZhdWx0cyB0byBDLWQuCi0KLQkqIHJlYWRsaW5lLmM6IEFkZGVkIHN1cHBvcnQgZm9yIGV2ZW50IGRyaXZlbiBwcm9ncmFtcy4KLQkgIHJsX2V2ZW50X2hvb2sgaXMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB5b3Ugd2FudCBjYWxsZWQKLQkgIHdoaWxlIFJlYWRsaW5lIGlzIHdhaXRpbmcgZm9yIGlucHV0LgotCi0JKiByZWFkbGluZS5jOiBDbGVhbnVwIHRpbWUuICBGdW5jdGlvbnMgd2l0aG91dCB0eXBlIGRlY2xhcmF0aW9ucwotCSAgZG8gbm90IHVzZSByZXR1cm4gd2l0aCBhIHZhbHVlLgotCi0JKiBoaXN0b3J5LmM6IGhpc3RvcnlfZXhwYW5kICgpIGhhcyBuZXcgdmFyaWFibGUgd2hpY2ggaXMgdGhlCi0JICBjaGFyYWN0ZXJzIHRvIGlnbm9yZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgaGlzdG9yeV9leHBhbnNpb25fY2hhci4KLQotU3VuIEp1bCAxNiAwODoxNDowMCAxOTg5ICBCcmlhbiBGb3ggIChiZm94IGF0IGF1cmVsKQotCi0JKiBybF9wcmVwX3Rlcm1pbmFsICgpCi0JICBCU0QgdmVyc2lvbiB0dXJucyBvZmYgQy1zLCBDLXEsIEMteSwgQy12LgotCi0JKiByZWFkbGluZS5jIC0tIHJsX3ByZXBfdGVybWluYWwgKCkKLQkgIFNZU1YgdmVyc2lvbiBoYWNrcyByZWFkbGluZV9lY2hvaW5nX3AuCi0JICBCU0QgdmVyc2lvbiB0dXJucyBvbiBwYXNzaW5nIG9mIHRoZSA4dGggYml0IGZvciB0aGUgZHVyYXRpb24KLQkgIG9mIHJlYWRpbmcgdGhlIGxpbmUuCi0KLVR1ZSBKdWwgMTEgMDY6MjU6MDEgMTk4OSAgQnJpYW4gRm94ICAoYmZveCBhdCBhdXJlbCkKLQotCSogcmVhZGxpbmUuYzogbmV3IHZhcmlhYmxlIHJsX3RpbGRlX2V4cGFuZGVyLgotCSAgSWYgbm9uLW51bGwsIHRoaXMgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgYSBmdW5jdGlvbiB0byBjYWxsIGlmCi0JICB0aGUgc3RhbmRhcmQgbWVhbmluZyBmb3IgZXhwYW5kaW5nIGEgdGlsZGUgZmFpbHMuICBUaGUgZnVuY3Rpb24gaXMKLQkgIGNhbGxlZCB3aXRoIHRoZSB0ZXh0IHNhbnMgdGlsZGUgKGFzIGluICJmb28iKSwgYW5kIHJldHVybnMgYQotCSAgbWFsbG9jKCknZWQgc3RyaW5nIHdoaWNoIGlzIHRoZSBleHBhbnNpb24sIG9yIGEgTlVMTCBwb2ludGVyIGlmCi0JICB0aGVyZSBpcyBubyBleHBhbnNpb24uIAotCi0JKiByZWFkbGluZS5oIC0gbmV3IGZpbGUgY2hhcmRlZnMuaAotCSAgU2VwYXJhdGVzIHRoaW5ncyB0aGF0IG9ubHkgcmVhZGxpbmUuYyBuZWVkcyBmcm9tIHRoZSBzdGFuZGFyZAotCSAgaGVhZGVyIGZpbGUgcHVibGlzaGluZyBpbnRlcmVzdGluZyB0aGluZ3MgYWJvdXQgcmVhZGxpbmUuCi0KLQkqIHJlYWRsaW5lLmM6Ci0JICByZWFkbGluZV9kZWZhdWx0X2JpbmRpbmdzICgpIG5vdyBsb29rcyBhdCB0ZXJtaW5hbCBjaGFyYXJhY3RlcnMKLQkgIGFuZCBiaW5kcyB0aG9zZSBhcyB3ZWxsLgotCi1XZWQgSnVuIDI4IDIwOjIwOjUxIDE5ODkgIEJyaWFuIEZveCAgKGJmb3ggYXQgYXVyZWwpCi0KLQkqIE1hZGUgcmVhZGxpbmUgYW5kIGhpc3RvcnkgaW50byBpbmRlcGVuZGVudCBsaWJyYXJpZXMuCi0KZGlmZiAtLWdpdCBhL3NldHVwLmNvbSBiL3NldHVwLmNvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzYWZkNS4uMDAwMDAwMAotLS0gYS9zZXR1cC5jb20KKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSQhIHNldHVwIGZpbGVzIGZvciBvcGVuVk1TL0FscGhhCi0kIQotJCBkZWZpbmUgYW91dCBbLS5JTkNMVURFLkFPVVRdCi0kIGRlZmluZSBjb2ZmIFstLklOQ0xVREUuQ09GRl0KLSQgZGVmaW5lIGVsZiBbLS5JTkNMVURFLkVMRl0KLSQgZGVmaW5lIG1wdyBbLS5JTkNMVURFLk1QV10KLSQgZGVmaW5lIG5sbSBbLS5JTkNMVURFLk5MTV0KLSQgZGVmaW5lIG9wY29kZSBbLS5JTkNMVURFLk9QQ09ERV0KZGlmZiAtLWdpdCBhL3N5bWxpbmstdHJlZSBiL3N5bWxpbmstdHJlZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDk2NTgyZC4uMDAwMDAwMAotLS0gYS9zeW1saW5rLXRyZWUKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIS9iaW4vc2gKLSMgQ3JlYXRlIGEgc3ltbGluayB0cmVlLgotIwotIyBTeW50YXg6IHN5bWxpbmstdHJlZSBzcmNkaXIgImlnbm9yZTEgaWdub3JlMiAuLi4iCi0jCi0jIHdoZXJlIHNyY2RpciBpcyB0aGUgZGlyZWN0b3J5IHRvIGNyZWF0ZSBhIHN5bWxpbmsgdHJlZSB0bywKLSMgYW5kICJpZ25vcmVOIiBpcyBhIGxpc3Qgb2YgZmlsZXMvZGlyZWN0b3JpZXMgdG8gaWdub3JlLgotCi1wcm9nPSQwCi1zcmNkaXI9JDEKLWlnbm9yZT0iJDIiCi0KLWlnbm9yZV9hZGRpdGlvbmFsPSIuIC4uIENWUyIKLQotIyBJZiB3ZSB3ZXJlIGludm9rZWQgd2l0aCBhIHJlbGF0aXZlIHBhdGggbmFtZSwgYWRqdXN0ICR7cHJvZ30gdG8gd29yawotIyBpbiBzdWJkaXJzLgotY2FzZSAke3Byb2d9IGluCi0vKikgOzsKLSopIHByb2c9Li4vJHtwcm9nfSA7OwotZXNhYwotCi0jIFNldCBuZXdzcmNkaXIgdG8gc29tZXRoaW5nIHN1YmRpcmVjdG9yaWVzIGNhbiB1c2UuCi1jYXNlICR7c3JjZGlyfSBpbgotLyopIG5ld3NyY2Rpcj0ke3NyY2Rpcn0gOzsKLSopIG5ld3NyY2Rpcj0uLi8ke3NyY2Rpcn0gOzsKLWVzYWMKLQotZm9yIGYgaW4gYGxzIC1hICR7c3JjZGlyfWA7IGRvCi0gIGlmIFsgLWQgJHtzcmNkaXJ9LyRmIF07IHRoZW4KLSAgICBmb3VuZD0KLSAgICBmb3IgaSBpbiAke2lnbm9yZX0gJHtpZ25vcmVfYWRkaXRpb25hbH07IGRvCi0gICAgICBpZiBbICIkZiIgPSAiJGkiIF07IHRoZW4KLQlmb3VuZD15ZXMKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIGlmIFsgLXogIiR7Zm91bmR9IiBdOyB0aGVuCi0gICAgICBlY2hvICIkZgkJLi53b3JraW5nIGluIgotICAgICAgaWYgWyAtZCAkZiBdOyB0aGVuIHRydWU7IGVsc2UgbWtkaXIgJGY7IGZpCi0gICAgICAoY2QgJGY7ICR7cHJvZ30gJHtuZXdzcmNkaXJ9LyRmICIke2lnbm9yZX0iKQotICAgIGZpCi0gIGVsc2UKLSAgICBlY2hvICIkZgkJLi5saW5rZWQiCi0gICAgcm0gLWYgJGYKLSAgICBsbiAtcyAke3NyY2Rpcn0vJGYgLgotICBmaQotZG9uZQotCi1leGl0IDAKZGlmZiAtLWdpdCBhL3RleGluZm8vdGV4aW5mby50ZXggYi90ZXhpbmZvL3RleGluZm8udGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDNhMzNjLi4wMDAwMDAwCi0tLSBhL3RleGluZm8vdGV4aW5mby50ZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1NDMxICswLDAgQEAKLSUgdGV4aW5mby50ZXggLS0gVGVYIG1hY3JvcyB0byBoYW5kbGUgVGV4aW5mbyBmaWxlcy4KLSUgJElkJAotJQotJSBDb3B5cmlnaHQgKEMpIDE5ODUsIDg2LCA4OCwgOTAsIDkxLCA5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OAotJSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSUKLSUgVGhpcyB0ZXhpbmZvLnRleCBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotJSBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotJSBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0Ci0lIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSUKLSUgVGhpcyB0ZXhpbmZvLnRleCBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotJSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5Ci0lIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0lIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSUKLSUgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSUgYWxvbmcgd2l0aCB0aGlzIHRleGluZm8udGV4IGZpbGU7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZQotJSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0lIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgotJQotJSBJbiBvdGhlciB3b3JkcywgeW91IGFyZSB3ZWxjb21lIHRvIHVzZSwgc2hhcmUgYW5kIGltcHJvdmUgdGhpcyBwcm9ncmFtLgotJSBZb3UgYXJlIGZvcmJpZGRlbiB0byBmb3JiaWQgYW55b25lIGVsc2UgdG8gdXNlLCBzaGFyZSBhbmQgaW1wcm92ZQotJSB3aGF0IHlvdSBnaXZlIHRoZW0uICAgSGVscCBzdGFtcCBvdXQgc29mdHdhcmUtaG9hcmRpbmchCi0lCi0lIFBsZWFzZSB0cnkgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRleGluZm8udGV4IGJlZm9yZSBzdWJtaXR0aW5nIGJ1ZwotJSByZXBvcnRzOyB5b3UgY2FuIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbToKLSUgICBmdHA6Ly9mdHAuZ251Lm9yZy9wdWIvZ251L3RleGluZm8udGV4Ci0lICAgL2hvbWUvZ2QvZ251L2RvYy90ZXhpbmZvLnRleCBvbiB0aGUgR05VIG1hY2hpbmVzLgotJSAgIChhbmQgYWxsIEdOVSBtaXJyb3JzLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL29yZGVyL2Z0cC5odG1sKQotJSAgIGZ0cDovL3R1Zy5vcmcvdGV4L3RleGluZm8udGV4Ci0lICAgZnRwOi8vY3Rhbi5vcmcvbWFjcm9zL3RleGluZm8vdGV4aW5mby50ZXgKLSUgICAoYW5kIGFsbCBDVEFOIG1pcnJvcnMsIGZpbmdlciBjdGFuQGN0YW4ub3JnIGZvciBhIGxpc3QpLgotJSBUaGUgdGV4aW5mby50ZXggaW4gdGhlIHRleGluZm8gZGlzdHJpYnV0aW9uIGl0c2VsZiBjb3VsZCB3ZWxsIGJlIG91dAotJSBvZiBkYXRlLCBzbyBpZiB0aGF0J3Mgd2hhdCB5b3UncmUgdXNpbmcsIHBsZWFzZSBjaGVjay4KLSUgCi0lIFNlbmQgYnVnIHJlcG9ydHMgdG8gYnVnLXRleGluZm9AZ251Lm9yZy4KLSUgUGxlYXNlIGluY2x1ZGUgYSBwcmVjaXNlIHRlc3QgY2FzZSBpbiBlYWNoIGJ1ZyByZXBvcnQsCi0lIGluY2x1ZGluZyBhIGNvbXBsZXRlIGRvY3VtZW50IHdpdGggd2hpY2ggd2UgY2FuIHJlcHJvZHVjZSB0aGUgcHJvYmxlbS4KLSUgCi0lIFRvIHByb2Nlc3MgYSBUZXhpbmZvIG1hbnVhbCB3aXRoIFRlWCwgaXQncyBtb3N0IHJlbGlhYmxlIHRvIHVzZSB0aGUKLSUgdGV4aTJkdmkgc2hlbGwgc2NyaXB0IHRoYXQgY29tZXMgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAgRm9yIHNpbXBsZQotJSBtYW51YWxzLCBob3dldmVyLCB5b3UgY2FuIGdldCBhd2F5IHdpdGg6Ci0lICAgdGV4IGZvby50ZXhpCi0lICAgdGV4aW5kZXggZm9vLj8/Ci0lICAgdGV4IGZvby50ZXhpCi0lICAgdGV4IGZvby50ZXhpCi0lICAgZHZpcHMgZm9vLmR2aSAtbyAjIG9yIHdoYXRldmVyLCB0byBwcm9jZXNzIHRoZSBkdmkgZmlsZS4KLSUgVGhlIGV4dHJhIHJ1bnMgb2YgVGVYIGdldCB0aGUgY3Jvc3MtcmVmZXJlbmNlIGluZm9ybWF0aW9uIGNvcnJlY3QuCi0lIFNvbWV0aW1lcyBvbmUgcnVuIGFmdGVyIHRleGluZGV4IHN1ZmZpY2VzLCBhbmQgc29tZXRpbWVzIHlvdSBuZWVkIG1vcmUKLSUgdGhhbiB0d287IHRleGkyZHZpIGRvZXMgaXQgYXMgbWFueSB0aW1lcyBhcyBuZWNlc3NhcnkuCi0KLQotJSBNYWtlIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBhIC5mbXQgZmlsZSBqdXN0IGJ5IGxvYWRpbmcgdGhpcyBmaWxlOgotJSBpZiB0aGUgdW5kZXJseWluZyBmb3JtYXQgaXMgbm90IGxvYWRlZCwgc3RhcnQgYnkgbG9hZGluZyBpdCBub3cuCi0lIEFkZGVkIGJ5IGdpbGRlYSBOb3ZlbWJlciAxOTkzLgotXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgZm10bmFtZVxlbmRjc25hbWVccmVsYXhcaW5wdXQgcGxhaW5cZmkKLQotJSBUaGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgdmVyc2lvbiBudW1iZXIgYmFzZWQgb24gUkNTLgotXGRlZlxkZWZ0ZXhpbmZvdmVyc2lvbiQjMTogIzIgJHtcZGVmXHRleGluZm92ZXJzaW9ueyMyfX0KLVxkZWZ0ZXhpbmZvdmVyc2lvbiRSZXZpc2lvbiQKLVxtZXNzYWdle0xvYWRpbmcgdGV4aW5mbyBwYWNrYWdlIFtWZXJzaW9uIFx0ZXhpbmZvdmVyc2lvbl06fQotCi0lIElmIGluIGEgLmZtdCBmaWxlLCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIKLSUgYW5kIHR1cm4gb24gYWN0aXZlIGNoYXJhY3RlcnMgdGhhdCB3ZSBjb3VsZG4ndCBkbyBlYXJsaWVyIGJlY2F1c2UKLSUgdGhleSBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnB1dCBmaWxlIG5hbWUuCi1cZXZlcnlqb2J7XG1lc3NhZ2V7W1RleGluZm8gdmVyc2lvbiBcdGV4aW5mb3ZlcnNpb25dfVxtZXNzYWdle30KLSAgXGNhdGNvZGVgKz1cYWN0aXZlIFxjYXRjb2RlYFxfPVxhY3RpdmV9Ci0KLSUgU2F2ZSBzb21lIHBhcnRzIG9mIHBsYWluIHRleCB3aG9zZSBuYW1lcyB3ZSB3aWxsIHJlZGVmaW5lLgotCi1cbGV0XHB0ZXhiPVxiCi1cbGV0XHB0ZXhidWxsZXQ9XGJ1bGxldAotXGxldFxwdGV4Yz1cYwotXGxldFxwdGV4Y29tbWE9XCwKLVxsZXRccHRleGRvdD1cLgotXGxldFxwdGV4ZG90cz1cZG90cwotXGxldFxwdGV4ZW5kPVxlbmQKLVxsZXRccHRleGVxdWl2PVxlcXVpdgotXGxldFxwdGV4ZXhjbGFtPVwhCi1cbGV0XHB0ZXhpPVxpCi1cbGV0XHB0ZXhsYnJhY2U9XHsKLVxsZXRccHRleHJicmFjZT1cfQotXGxldFxwdGV4c3Rhcj1cKgotXGxldFxwdGV4dD1cdAotCi0lIFdlIG5ldmVyIHdhbnQgcGxhaW4ncyBvdXRlciBcKyBkZWZpbml0aW9uIGluIFRleGluZm8uCi0lIEZvciBAdGV4LCB3ZSBjYW4gdXNlIFx0YWJhbGlnbi4KLVxsZXRcKyA9IFxyZWxheAotCi0KLVxtZXNzYWdle0Jhc2ljcyx9Ci1cY2hhcmRlZlxvdGhlcj0xMgotCi0lIElmIHRoaXMgY2hhcmFjdGVyIGFwcGVhcnMgaW4gYW4gZXJyb3IgbWVzc2FnZSBvciBoZWxwIHN0cmluZywgaXQKLSUgc3RhcnRzIGEgbmV3IGxpbmUgaW4gdGhlIG91dHB1dC4KLVxuZXdsaW5lY2hhciA9IGBeXkoKLQotJSBTZXQgdXAgZml4ZWQgd29yZHMgZm9yIEVuZ2xpc2ggaWYgbm90IGFscmVhZHkgc2V0LgotXGlmeFxwdXR3b3JkQXBwZW5kaXhcdW5kZWZpbmVkIFxnZGVmXHB1dHdvcmRBcHBlbmRpeHtBcHBlbmRpeH1cZmkKLVxpZnhccHV0d29yZENoYXB0ZXJcdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkQ2hhcHRlcntDaGFwdGVyfVxmaQotXGlmeFxwdXR3b3JkZmlsZVx1bmRlZmluZWQgICAgIFxnZGVmXHB1dHdvcmRmaWxle2ZpbGV9XGZpCi1caWZ4XHB1dHdvcmRJbmZvXHVuZGVmaW5lZCAgICAgXGdkZWZccHV0d29yZEluZm97SW5mb31cZmkKLVxpZnhccHV0d29yZE1ldGhvZG9uXHVuZGVmaW5lZCBcZ2RlZlxwdXR3b3JkTWV0aG9kb257TWV0aG9kIG9ufVxmaQotXGlmeFxwdXR3b3Jkb25cdW5kZWZpbmVkICAgICAgIFxnZGVmXHB1dHdvcmRvbntvbn1cZmkKLVxpZnhccHV0d29yZHBhZ2VcdW5kZWZpbmVkICAgICBcZ2RlZlxwdXR3b3JkcGFnZXtwYWdlfVxmaQotXGlmeFxwdXR3b3Jkc2VjdGlvblx1bmRlZmluZWQgIFxnZGVmXHB1dHdvcmRzZWN0aW9ue3NlY3Rpb259XGZpCi1caWZ4XHB1dHdvcmRTZWN0aW9uXHVuZGVmaW5lZCAgXGdkZWZccHV0d29yZFNlY3Rpb257U2VjdGlvbn1cZmkKLVxpZnhccHV0d29yZHNlZVx1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3Jkc2Vle3NlZX1cZmkKLVxpZnhccHV0d29yZFNlZVx1bmRlZmluZWQgICAgICBcZ2RlZlxwdXR3b3JkU2Vle1NlZX1cZmkKLVxpZnhccHV0d29yZFNob3J0Q29udGVudHNcdW5kZWZpbmVkICBcZ2RlZlxwdXR3b3JkU2hvcnRDb250ZW50c3tTaG9ydCBDb250ZW50c31cZmkKLVxpZnhccHV0d29yZFRhYmxlb2ZDb250ZW50c1x1bmRlZmluZWRcZ2RlZlxwdXR3b3JkVGFibGVvZkNvbnRlbnRze1RhYmxlIG9mIENvbnRlbnRzfVxmaQotCi0lIElnbm9yZSBhIHRva2VuLgotJQotXGRlZlxnb2JibGUjMXt9Ci0KLVxoeXBoZW5hdGlvbnthcC1wZW4tZGl4fQotXGh5cGhlbmF0aW9ue21pbmktYnVmLWZlciBtaW5pLWJ1Zi1mZXJzfQotXGh5cGhlbmF0aW9ue2VzaGVsbH0KLVxoeXBoZW5hdGlvbnt3aGl0ZS1zcGFjZX0KLQotJSBNYXJnaW4gdG8gYWRkIHRvIHJpZ2h0IG9mIGV2ZW4gcGFnZXMsIHRvIGxlZnQgb2Ygb2RkIHBhZ2VzLgotXG5ld2RpbWVuIFxiaW5kaW5nb2Zmc2V0Ci1cbmV3ZGltZW4gXG5vcm1hbG9mZnNldAotXG5ld2RpbWVuXHBhZ2V3aWR0aCBcbmV3ZGltZW5ccGFnZWhlaWdodAotCi0lIFNvbWV0aW1lcyBpdCBpcyBjb252ZW5pZW50IHRvIGhhdmUgZXZlcnl0aGluZyBpbiB0aGUgdHJhbnNjcmlwdCBmaWxlCi0lIGFuZCBub3RoaW5nIG9uIHRoZSB0ZXJtaW5hbC4gIFdlIGRvbid0IGp1c3QgY2FsbCBcdHJhY2luZ2FsbCBoZXJlLAotJSBzaW5jZSB0aGF0IHByb2R1Y2VzIHNvbWUgdXNlbGVzcyBvdXRwdXQgb24gdGhlIHRlcm1pbmFsLgotJQotXGRlZlxnbG9nZ2luZ2FsbHtcYmVnaW5ncm91cCBcZ2xvYmFsZGVmcyA9IDEgXGxvZ2dpbmdhbGwgXGVuZGdyb3VwfSUKLVxpZnhcZVRlWHZlcnNpb25cdW5kZWZpbmVkCi1cZGVmXGxvZ2dpbmdhbGx7XHRyYWNpbmdjb21tYW5kczIgXHRyYWNpbmdzdGF0czIKLSAgIFx0cmFjaW5ncGFnZXMxIFx0cmFjaW5nb3V0cHV0MSBcdHJhY2luZ2xvc3RjaGFyczEKLSAgIFx0cmFjaW5nbWFjcm9zMiBcdHJhY2luZ3BhcmFncmFwaHMxIFx0cmFjaW5ncmVzdG9yZXMxCi0gICBcc2hvd2JveGJyZWFkdGhcbWF4ZGltZW5cc2hvd2JveGRlcHRoXG1heGRpbWVuCi19JQotXGVsc2UKLVxkZWZcbG9nZ2luZ2FsbHtcdHJhY2luZ2NvbW1hbmRzMyBcdHJhY2luZ3N0YXRzMgotICAgXHRyYWNpbmdwYWdlczEgXHRyYWNpbmdvdXRwdXQxIFx0cmFjaW5nbG9zdGNoYXJzMQotICAgXHRyYWNpbmdtYWNyb3MyIFx0cmFjaW5ncGFyYWdyYXBoczEgXHRyYWNpbmdyZXN0b3JlczEKLSAgIFx0cmFjaW5nc2NhbnRva2VuczEgXHRyYWNpbmdhc3NpZ25zMSBcdHJhY2luZ2lmczEKLSAgIFx0cmFjaW5nZ3JvdXBzMSBcdHJhY2luZ25lc3RpbmcyCi0gICBcc2hvd2JveGJyZWFkdGhcbWF4ZGltZW5cc2hvd2JveGRlcHRoXG1heGRpbWVuCi19JQotXGZpCi0KLSUgRm9yIEBjcm9wbWFya3MgY29tbWFuZC4KLSUgRG8gQGNyb3BtYXJrcyB0byBnZXQgY3JvcCBtYXJrcy4KLSUgCi1cbmV3aWZcaWZjcm9wbWFya3MKLVxsZXRcY3JvcG1hcmtzID0gXGNyb3BtYXJrc3RydWUKLSUKLSUgRGltZW5zaW9ucyB0byBhZGQgY3JvcG1hcmtzIGF0IGNvcm5lcnMuCi0lIEFkZGVkIGJ5IFAuIEEuIE1hY0theSwgMTIgTm92LiAxOTg2Ci0lCi1cbmV3ZGltZW5cb3V0ZXJoc2l6ZSBcbmV3ZGltZW5cb3V0ZXJ2c2l6ZSAlIHNldCBieSB0aGUgcGFwZXIgc2l6ZSByb3V0aW5lcwotXG5ld2RpbWVuXGNvcm5lcmxvbmcgIFxjb3JuZXJsb25nPTFwYwotXG5ld2RpbWVuXGNvcm5lcnRoaWNrIFxjb3JuZXJ0aGljaz0uM3B0Ci1cbmV3ZGltZW5cdG9wYW5kYm90dG9tbWFyZ2luIFx0b3BhbmRib3R0b21tYXJnaW49Ljc1aW4KLQotJSBNYWluIG91dHB1dCByb3V0aW5lLgotXGNoYXJkZWZcUEFHRSA9IDI1NQotXG91dHB1dCA9IHtcb25lcGFnZW91dHtccGFnZWNvbnRlbnRzXFBBR0V9fQotCi1cbmV3Ym94XGhlYWRsaW5lYm94Ci1cbmV3Ym94XGZvb3RsaW5lYm94Ci0KLSUgXG9uZXBhZ2VvdXQgdGFrZXMgYSB2Ym94IGFzIGFuIGFyZ3VtZW50LiAgTm90ZSB0aGF0IFxwYWdlY29udGVudHMKLSUgZG9lcyBpbnNlcnRpb25zLCBidXQgeW91IGhhdmUgdG8gY2FsbCBpdCB5b3Vyc2VsZi4KLVxkZWZcb25lcGFnZW91dCMxeyUKLSAgXGlmY3JvcG1hcmtzIFxob2Zmc2V0PTBwdCBcZWxzZSBcaG9mZnNldD1cbm9ybWFsb2Zmc2V0IFxmaQotICAlCi0gIFxpZm9kZFxwYWdlbm8gIFxhZHZhbmNlXGhvZmZzZXQgYnkgXGJpbmRpbmdvZmZzZXQKLSAgXGVsc2UgXGFkdmFuY2VcaG9mZnNldCBieSAtXGJpbmRpbmdvZmZzZXRcZmkKLSAgJQotICAlIERvIHRoaXMgb3V0c2lkZSBvZiB0aGUgXHNoaXBvdXQgc28gQGNvZGUgZXRjLiB3aWxsIGJlIGV4cGFuZGVkIGluCi0gICUgdGhlIGhlYWRsaW5lIGFzIHRoZXkgc2hvdWxkIGJlLCBub3QgdGFrZW4gbGl0ZXJhbGx5IChvdXRwdXR0aW5nICcnY29kZSkuCi0gIFxzZXRib3hcaGVhZGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2VoZWFkbGluZX0lCi0gIFxzZXRib3hcZm9vdGxpbmVib3ggPSBcdmJveHtcbGV0XGhzaXplPVxwYWdld2lkdGggXG1ha2Vmb290bGluZX0lCi0gICUKLSAgeyUKLSAgICAlIEhhdmUgdG8gZG8gdGhpcyBzdHVmZiBvdXRzaWRlIHRoZSBcc2hpcG91dCBiZWNhdXNlIHdlIHdhbnQgaXQgdG8KLSAgICAlIHRha2UgZWZmZWN0IGluIFx3cml0ZSdzLCB5ZXQgdGhlIGdyb3VwIGRlZmluZWQgYnkgdGhlIFx2Ym94IGVuZHMKLSAgICAlIGJlZm9yZSB0aGUgXHNoaXBvdXQgcnVucy4KLSAgICAlCi0gICAgXGVzY2FwZWNoYXIgPSBgXFwgICAgICUgdXNlIGJhY2tzbGFzaCBpbiBvdXRwdXQgZmlsZXMuCi0gICAgXGluZGV4ZHVtbWllcyAgICAgICAgICUgZG9uJ3QgZXhwYW5kIGNvbW1hbmRzIGluIHRoZSBvdXRwdXQuCi0gICAgXG5vcm1hbHR1cm5vZmZhY3RpdmUgICUgXCBpbiBpbmRleCBlbnRyaWVzIG11c3Qgbm90IHN0YXkgXCwgZS5nLiwgaWYKLSAgICAgICAgICAgICAgICAgICAlIHRoZSBwYWdlIGJyZWFrIGhhcHBlbnMgdG8gYmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBleGFtcGxlLgotICAgIFxzaGlwb3V0XHZib3h7JQotICAgICAgXGlmY3JvcG1hcmtzIFx2Ym94IHRvIFxvdXRlcnZzaXplXGJncm91cAotICAgICAgICBcaHNpemUgPSBcb3V0ZXJoc2l6ZQotICAgICAgICBcbGluZXtcZXd0b3BcaGZpbFxld3RvcH0lCi0gICAgICAgIFxub2ludGVybGluZXNraXAKLSAgICAgICAgXGxpbmV7JQotICAgICAgICAgIFx2Ym94e1xtb3ZlbGVmdFxjb3JuZXJ0aGlja1xuc3RvcH0lCi0gICAgICAgICAgXGhmaWxsCi0gICAgICAgICAgXHZib3h7XG1vdmVyaWdodFxjb3JuZXJ0aGlja1xuc3RvcH0lCi0gICAgICAgIH0lCi0gICAgICAgIFx2c2tpcFx0b3BhbmRib3R0b21tYXJnaW4KLSAgICAgICAgXGxpbmVcYmdyb3VwCi0gICAgICAgICAgXGhmaWwgJSBjZW50ZXIgdGhlIHBhZ2Ugd2l0aGluIHRoZSBvdXRlciAocGFnZSkgaHNpemUuCi0gICAgICAgICAgXGlmb2RkXHBhZ2Vub1xoc2tpcFxiaW5kaW5nb2Zmc2V0XGZpCi0gICAgICAgICAgXHZib3hcYmdyb3VwCi0gICAgICBcZmkKLSAgICAgICUKLSAgICAgIFx1bnZib3hcaGVhZGxpbmVib3gKLSAgICAgIFxwYWdlYm9keXsjMX0lCi0gICAgICBcaWZkaW1caHRcZm9vdGxpbmVib3ggPiAwcHQKLSAgICAgICAgJSBPbmx5IGxlYXZlIHRoaXMgc3BhY2UgaWYgdGhlIGZvb3RsaW5lIGlzIG5vbmVtcHR5LgotICAgICAgICAlIChXZSBsZXNzZW5lZCBcdnNpemUgZm9yIGl0IGluIFxvZGRmb290aW5neHh4LikKLSAgICAgICAgJSBUaGUgXGJhc2VsaW5lc2tpcD0yNHB0IGluIHBsYWluJ3MgXG1ha2Vmb290bGluZSBoYXMgbm8gZWZmZWN0LgotICAgICAgICBcdnNraXAgMlxiYXNlbGluZXNraXAKLSAgICAgICAgXHVudmJveFxmb290bGluZWJveAotICAgICAgXGZpCi0gICAgICAlCi0gICAgICBcaWZjcm9wbWFya3MKLSAgICAgICAgICBcZWdyb3VwICUgZW5kIG9mIFx2Ym94XGJncm91cAotICAgICAgICBcaGZpbFxlZ3JvdXAgJSBlbmQgb2YgKGNlbnRlcmluZykgXGxpbmVcYmdyb3VwCi0gICAgICAgIFx2c2tpcFx0b3BhbmRib3R0b21tYXJnaW4gcGx1czFmaWxsIG1pbnVzMWZpbGwKLSAgICAgICAgXGJveG1heGRlcHRoID0gXGNvcm5lcnRoaWNrCi0gICAgICAgIFxsaW5leyUKLSAgICAgICAgICBcdmJveHtcbW92ZWxlZnRcY29ybmVydGhpY2tcbnNib3R9JQotICAgICAgICAgIFxoZmlsbAotICAgICAgICAgIFx2Ym94e1xtb3ZlcmlnaHRcY29ybmVydGhpY2tcbnNib3R9JQotICAgICAgICB9JQotICAgICAgICBcbm9pbnRlcmxpbmVza2lwCi0gICAgICAgIFxsaW5le1xld2JvdFxoZmlsXGV3Ym90fSUKLSAgICAgIFxlZ3JvdXAgJSBcdmJveCBmcm9tIGZpcnN0IGNyb3BtYXJrcyBjbGF1c2UKLSAgICAgIFxmaQotICAgIH0lIGVuZCBvZiBcc2hpcG91dFx2Ym94Ci0gIH0lIGVuZCBvZiBncm91cCB3aXRoIFx0dXJub2ZmYWN0aXZlCi0gIFxhZHZhbmNlcGFnZW5vCi0gIFxpZm51bVxvdXRwdXRwZW5hbHR5Pi0yMDAwMCBcZWxzZVxkb3N1cGVyZWplY3RcZmkKLX0KLQotXG5ld2luc2VydFxtYXJnaW4gXGRpbWVuXG1hcmdpbj1cbWF4ZGltZW4KLQotXGRlZlxwYWdlYm9keSMxe1x2Ym94IHRvXHBhZ2VoZWlnaHR7XGJveG1heGRlcHRoPVxtYXhkZXB0aCAjMX19Ci17XGNhdGNvZGVgXEAgPTExCi1cZ2RlZlxwYWdlY29udGVudHMjMXtcaWZ2b2lkXHRvcGluc1xlbHNlXHVudmJveFx0b3BpbnNcZmkKLSUgbWFyZ2luYWwgaGFja3MsIGp1aGFAdmlpc2EudXVjcCAoSnVoYSBUYWthbGEpCi1caWZ2b2lkXG1hcmdpblxlbHNlICUgbWFyZ2luYWwgaW5mbyBpcyBwcmVzZW50Ci0gIFxybGFwe1xrZXJuXGhzaXplXHZib3ggdG9cekB7XGtlcm4xcHRcYm94XG1hcmdpbiBcdnNzfX1cZmkKLVxkaW1lbkA9XGRwIzEgXHVudmJveCMxCi1caWZ2b2lkXGZvb3RpbnNcZWxzZVx2c2tpcFxza2lwXGZvb3RpbnNcZm9vdG5vdGVydWxlIFx1bnZib3hcZm9vdGluc1xmaQotXGlmckBnZ2VkYm90dG9tIFxrZXJuLVxkaW1lbkAgXHZmaWwgXGZpfQotfQotCi0lIEhlcmUgYXJlIHRoZSBydWxlcyBmb3IgdGhlIGNyb3BtYXJrcy4gIE5vdGUgdGhhdCB0aGV5IGFyZQotJSBvZmZzZXQgc28gdGhhdCB0aGUgc3BhY2UgYmV0d2VlbiB0aGVtIGlzIHRydWx5IFxvdXRlcmhzaXplIG9yIFxvdXRlcnZzaXplCi0lIChQLiBBLiBNYWNLYXksIDEyIE5vdmVtYmVyLCAxOTg2KQotJQotXGRlZlxld3RvcHtcdnJ1bGUgaGVpZ2h0XGNvcm5lcnRoaWNrIGRlcHRoMHB0IHdpZHRoXGNvcm5lcmxvbmd9Ci1cZGVmXG5zdG9we1x2Ym94Ci0gIHtcaHJ1bGUgaGVpZ2h0XGNvcm5lcnRoaWNrIGRlcHRoXGNvcm5lcmxvbmcgd2lkdGhcY29ybmVydGhpY2t9fQotXGRlZlxld2JvdHtcdnJ1bGUgaGVpZ2h0MHB0IGRlcHRoXGNvcm5lcnRoaWNrIHdpZHRoXGNvcm5lcmxvbmd9Ci1cZGVmXG5zYm90e1x2Ym94Ci0gIHtcaHJ1bGUgaGVpZ2h0XGNvcm5lcmxvbmcgZGVwdGhcY29ybmVydGhpY2sgd2lkdGhcY29ybmVydGhpY2t9fQotCi0lIFBhcnNlIGFuIGFyZ3VtZW50LCB0aGVuIHBhc3MgaXQgdG8gIzEuICBUaGUgYXJndW1lbnQgaXMgdGhlIHJlc3Qgb2YKLSUgdGhlIGlucHV0IGxpbmUgKGV4Y2VwdCB3ZSByZW1vdmUgYSB0cmFpbGluZyBjb21tZW50KS4gICMxIHNob3VsZCBiZSBhCi0lIG1hY3JvIHdoaWNoIGV4cGVjdHMgYW4gb3JkaW5hcnkgdW5kZWxpbWl0ZWQgVGVYIGFyZ3VtZW50LgotJQotXGRlZlxwYXJzZWFyZyMxeyUKLSAgXGxldFxuZXh0ID0gIzElCi0gIFxiZWdpbmdyb3VwCi0gICAgXG9iZXlsaW5lcwotICAgIFxmdXR1cmVsZXRcdGVtcFxwYXJzZWFyZ3gKLX0KLQotJSBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhbiBvYmV5ZWQgc3BhY2UgKGZyb20gYW4gQGV4YW1wbGUgZW52aXJvbm1lbnQgb3IKLSUgdGhlIGxpa2UpLCByZW1vdmUgaXQgYW5kIHJlY3Vyc2UuICBPdGhlcndpc2UsIHdlJ3JlIGRvbmUuCi1cZGVmXHBhcnNlYXJneHslCi0gICUgXG9iZXllZHNwYWNlIGlzIGRlZmluZWQgZmFyIGJlbG93LCBhZnRlciB0aGUgZGVmaW5pdGlvbiBvZiBcc2Vwc3BhY2VzLgotICBcaWZ4XG9iZXllZHNwYWNlXHRlbXAKLSAgICBcZXhwYW5kYWZ0ZXJccGFyc2VhcmdkaXNjYXJkc3BhY2UKLSAgXGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJccGFyc2VhcmdsaW5lCi0gIFxmaQotfQotCi0lIFJlbW92ZSBhIHNpbmdsZSBzcGFjZSAoYXMgdGhlIGRlbGltaXRlciB0b2tlbiB0byB0aGUgbWFjcm8gY2FsbCkuCi17XG9iZXlzcGFjZXMgJQotIFxnZGVmXHBhcnNlYXJnZGlzY2FyZHNwYWNlIHtcZnV0dXJlbGV0XHRlbXBccGFyc2Vhcmd4fX0KLQote1xvYmV5bGluZXMgJQotICBcZ2RlZlxwYXJzZWFyZ2xpbmUjMV5eTXslCi0gICAgXGVuZGdyb3VwICUgRW5kIG9mIHRoZSBncm91cCBzdGFydGVkIGluIFxwYXJzZWFyZy4KLSAgICAlCi0gICAgJSBGaXJzdCByZW1vdmUgYW55IEBjIGNvbW1lbnQsIHRoZW4gYW55IEBjb21tZW50LgotICAgICUgUmVzdWx0IG9mIGVhY2ggbWFjcm8gaXMgcHV0IGluIFx0b2tzMC4KLSAgICBcYXJncmVtb3ZlYyAjMVxjXHJlbGF4ICUKLSAgICBcZXhwYW5kYWZ0ZXJcYXJncmVtb3ZlY29tbWVudCBcdGhlXHRva3MwIFxjb21tZW50XHJlbGF4ICUKLSAgICAlCi0gICAgJSBDYWxsIHRoZSBjYWxsZXIncyBtYWNybywgc2F2ZWQgYXMgXG5leHQgaW4gXHBhcnNlYXJnLgotICAgIFxleHBhbmRhZnRlclxuZXh0XGV4cGFuZGFmdGVye1x0aGVcdG9rczB9JQotICB9JQotfQotCi0lIFNpbmNlIGFsbCBcY3ssb21tZW50fSBkb2VzIGlzIHRocm93IGF3YXkgdGhlIGFyZ3VtZW50LCB3ZSBjYW4gbGV0IFRlWAotJSBkbyB0aGF0IGZvciB1cy4gIFRoZSBccmVsYXggaGVyZSBpcyBtYXRjaGVkIGJ5IHRoZSBccmVsYXggaW4gdGhlIGNhbGwKLSUgaW4gXHBhcnNlYXJnbGluZTsgaXQgY291bGQgYmUgbW9yZSBvciBsZXNzIGFueXRoaW5nLCBpdHMgcHVycG9zZSBpcwotJSBqdXN0IHRvIGRlbGltaXQgdGhlIGFyZ3VtZW50IHRvIHRoZSBcYy4KLVxkZWZcYXJncmVtb3ZlYyMxXGMjMlxyZWxheHtcdG9rczAgPSB7IzF9fQotXGRlZlxhcmdyZW1vdmVjb21tZW50IzFcY29tbWVudCMyXHJlbGF4e1x0b2tzMCA9IHsjMX19Ci0KLSUgXGFyZ3JlbW92ZWN7LG9tbWVudH0gbWlnaHQgbGVhdmUgdXMgd2l0aCB0cmFpbGluZyBzcGFjZXMsIHRob3VnaDsgZS5nLiwKLSUgICAgQGVuZCBpdGVtaXplICBAYyBmb28KLSUgd2lsbCBoYXZlIHR3byBhY3RpdmUgc3BhY2VzIGFzIHBhcnQgb2YgdGhlIGFyZ3VtZW50IHdpdGggdGhlCi0lIGBpdGVtaXplJy4gIEhlcmUgd2UgcmVtb3ZlIGFsbCBhY3RpdmUgc3BhY2VzIGZyb20gIzEsIGFuZCBhc3NpZ24gdGhlCi0lIHJlc3VsdCB0byBcdG9rczAuCi0lCi0lIFRoaXMgbG9zZXMgaWYgdGhlcmUgYXJlIGFueSAqb3RoZXIqIGFjdGl2ZSBjaGFyYWN0ZXJzIGJlc2lkZXMgc3BhY2VzCi0lIGluIHRoZSBhcmd1bWVudCAtLSBfIF4gKywgZm9yIGV4YW1wbGUgLS0gc2luY2UgdGhleSBnZXQgZXhwYW5kZWQuCi0lIEZvcnR1bmF0ZWx5LCBUZXhpbmZvIGRvZXMgbm90IGRlZmluZSBhbnkgc3VjaCBjb21tYW5kcy4gIChJZiBpdCBldmVyCi0lIGRvZXMsIHRoZSBjYXRjb2RlIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHF1ZXN0aW9ud2lsbCBoYXZlIHRvIGJlIGNoYW5nZWQKLSUgaGVyZS4pICBCdXQgdGhpcyBtZWFucyB3ZSBjYW5ub3QgY2FsbCBccmVtb3ZlYWN0aXZlc3BhY2VzIGFzIHBhcnQgb2YKLSUgXGFyZ3JlbW92ZWN7LG9tbWVudH0sIHNpbmNlIEBjIHVzZXMgXHBhcnNlYXJnLCBhbmQgdGh1cyB0aGUgYXJndW1lbnQKLSUgdGhhdCBccGFyc2VhcmcgZ2V0cyBtaWdodCB3ZWxsIGhhdmUgYW55IGNoYXJhY3RlciBhdCBhbGwgaW4gaXQuCi0lCi1cZGVmXHJlbW92ZWFjdGl2ZXNwYWNlcyMxeyUKLSAgXGJlZ2luZ3JvdXAKLSAgICBcaWdub3JlYWN0aXZlc3BhY2VzCi0gICAgXGVkZWZcdGVtcHsjMX0lCi0gICAgXGdsb2JhbFx0b2tzMCA9IFxleHBhbmRhZnRlcntcdGVtcH0lCi0gIFxlbmRncm91cAotfQotCi0lIENoYW5nZSB0aGUgYWN0aXZlIHNwYWNlIHRvIGV4cGFuZCB0byBub3RoaW5nLgotJQotXGJlZ2luZ3JvdXAKLSAgXG9iZXlzcGFjZXMKLSAgXGdkZWZcaWdub3JlYWN0aXZlc3BhY2Vze1xvYmV5c3BhY2VzXGxldCA9XGVtcHR5fQotXGVuZGdyb3VwCi0KLQotXGRlZlxmbHVzaGNye1xpZnhccGFyXGxpc3BwYXIgXGRlZlxuZXh0IyMxe31cZWxzZSBcbGV0XG5leHQ9XHJlbGF4IFxmaSBcbmV4dH0KLQotJSUgVGhlc2UgYXJlIHVzZWQgdG8ga2VlcCBAYmVnaW4vQGVuZCBsZXZlbHMgZnJvbSBydW5uaW5nIGF3YXkKLSUlIENhbGwgXGluRU5WIHdpdGhpbiBlbnZpcm9ubWVudHMgKGFmdGVyIGEgXGJlZ2luZ3JvdXApCi1cbmV3aWZcaWZFTlYgXEVOVmZhbHNlIFxkZWZcaW5FTlZ7XGlmRU5WXHJlbGF4XGVsc2VcRU5WdHJ1ZVxmaX0KLVxkZWZcRU5WY2hlY2t7JQotXGlmRU5WXGVycm1lc3NhZ2V7U3RpbGwgd2l0aGluIGFuIGVudmlyb25tZW50OyBwcmVzcyBSRVRVUk4gdG8gY29udGludWV9Ci1cZW5kZ3JvdXBcZml9ICUgVGhpcyBpcyBub3QgcGVyZmVjdCwgYnV0IGl0IHNob3VsZCByZWR1Y2UgbG9zc2FnZQotCi0lIEBiZWdpbiBmb28gIGlzIHRoZSBzYW1lIGFzIEBmb28sIGZvciBub3cuCi1cbmV3aGVscFxFTXNpbXBsZXtQcmVzcyBSRVRVUk4gdG8gY29udGludWUufQotCi1cb3V0ZXJcZGVmXGJlZ2lue1xwYXJzZWFyZ1xiZWdpbnh4eH0KLQotXGRlZlxiZWdpbnh4eCAjMXslCi1cZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSAjMVxlbmRjc25hbWVccmVsYXgKLXtcZXJyaGVscD1cRU1zaW1wbGUgXGVycm1lc3NhZ2V7VW5kZWZpbmVkIGNvbW1hbmQgQGJlZ2luICMxfX1cZWxzZQotXGNzbmFtZSAjMVxlbmRjc25hbWVcZml9Ci0KLSUgQGVuZCBmb28gZXhlY3V0ZXMgdGhlIGRlZmluaXRpb24gb2YgXEVmb28uCi0lCi1cZGVmXGVuZHtccGFyc2VhcmdcZW5keHh4fQotXGRlZlxlbmR4eHggIzF7JQotICBccmVtb3ZlYWN0aXZlc3BhY2VzeyMxfSUKLSAgXGVkZWZcZW5kdGhpbmd7XHRoZVx0b2tzMH0lCi0gICUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgRVxlbmR0aGluZ1xlbmRjc25hbWVccmVsYXgKLSAgICBcZXhwYW5kYWZ0ZXJcaWZ4XGNzbmFtZSBcZW5kdGhpbmdcZW5kY3NuYW1lXHJlbGF4Ci0gICAgICAlIFRoZXJlJ3Mgbm8gXGZvbywgaS5lLiwgbm8gYGBlbnZpcm9ubWVudCcnIGZvby4KLSAgICAgIFxlcnJoZWxwID0gXEVNc2ltcGxlCi0gICAgICBcZXJybWVzc2FnZXtVbmRlZmluZWQgY29tbWFuZCBgQGVuZCBcZW5kdGhpbmcnfSUKLSAgICBcZWxzZQotICAgICAgXHVubWF0Y2hlZGVuZGVycm9yXGVuZHRoaW5nCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgJSBFdmVyeXRoaW5nJ3Mgb2s7IHRoZSByaWdodCBlbnZpcm9ubWVudCBoYXMgYmVlbiBzdGFydGVkLgotICAgIFxjc25hbWUgRVxlbmR0aGluZ1xlbmRjc25hbWUKLSAgXGZpCi19Ci0KLSUgVGhlcmUgaXMgYW4gZW52aXJvbm1lbnQgIzEsIGJ1dCBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkLiAgR2l2ZSBhbiBlcnJvci4KLSUKLVxkZWZcdW5tYXRjaGVkZW5kZXJyb3IjMXslCi0gIFxlcnJoZWxwID0gXEVNc2ltcGxlCi0gIFxlcnJtZXNzYWdle1RoaXMgYEBlbmQgIzEnIGRvZXNuJ3QgaGF2ZSBhIG1hdGNoaW5nIGBAIzEnfSUKLX0KLQotJSBEZWZpbmUgdGhlIGNvbnRyb2wgc2VxdWVuY2UgXEUjMSB0byBnaXZlIGFuIHVubWF0Y2hlZCBAZW5kIGVycm9yLgotJQotXGRlZlxkZWZpbmV1bm1hdGNoZWRlbmQjMXslCi0gIFxleHBhbmRhZnRlclxkZWZcY3NuYW1lIEUjMVxlbmRjc25hbWV7XHVubWF0Y2hlZGVuZGVycm9yeyMxfX0lCi19Ci0KLQotJSBTaW5nbGUtc3BhY2luZyBpcyBkb25lIGJ5IHZhcmlvdXMgZW52aXJvbm1lbnRzIChzcGVjaWZpY2FsbHksIGluCi0lIFxub25maWxsc3RhcnQgYW5kIFxxdW90YXRpb25zKS4KLVxuZXdza2lwXHNpbmdsZXNwYWNlc2tpcCBcc2luZ2xlc3BhY2Vza2lwID0gMTIuNXB0Ci1cZGVmXHNpbmdsZXNwYWNleyUKLSAgJSBXaHkgd2FzIHRoaXMga2VybiBoZXJlPyAgSXQgbWVzc2VzIHVwIGVxdWFsaXppbmcgc3BhY2UgYWJvdmUgYW5kIGJlbG93Ci0gICUgZW52aXJvbm1lbnRzLiAgLS1rYXJsLCA2bWF5OTMKLSAgJXtcYWR2YW5jZSBcYmFzZWxpbmVza2lwIGJ5IC1cc2luZ2xlc3BhY2Vza2lwCi0gICVca2VybiBcYmFzZWxpbmVza2lwfSUKLSAgXHNldGxlYWRpbmcgXHNpbmdsZXNwYWNlc2tpcAotfQotCi0lJSBTaW1wbGUgc2luZ2xlLWNoYXJhY3RlciBAIGNvbW1hbmRzCi0KLSUgQEAgcHJpbnRzIGFuIEAKLSUgS2x1ZGdlIHRoaXMgdW50aWwgdGhlIGZvbnRzIGFyZSByaWdodCAoZ3JyKS4KLVxkZWZcQHt7XHR0XGNoYXI2NH19Ci0KLSUgVGhpcyBpcyB0dXJuZWQgb2ZmIGJlY2F1c2UgaXQgd2FzIG5ldmVyIGRvY3VtZW50ZWQKLSUgYW5kIHlvdSBjYW4gdXNlIEB3ey4uLn0gYXJvdW5kIGEgcXVvdGUgdG8gc3VwcHJlc3MgbGlnYXR1cmVzLgotJSUgRGVmaW5lIEBgIGFuZCBAJyB0byBiZSB0aGUgc2FtZSBhcyBgIGFuZCAnCi0lJSBidXQgc3VwcHJlc3NpbmcgbGlnYXR1cmVzLgotJVxkZWZcYHt7YH19Ci0lXGRlZlwne3snfX0KLQotJSBVc2VkIHRvIGdlbmVyYXRlIHF1b3RlZCBicmFjZXMuCi1cZGVmXG15bGJyYWNlIHt7XHR0XGNoYXIxMjN9fQotXGRlZlxteXJicmFjZSB7e1x0dFxjaGFyMTI1fX0KLVxsZXRcez1cbXlsYnJhY2UKLVxsZXRcfT1cbXlyYnJhY2UKLVxiZWdpbmdyb3VwCi0gICUgRGVmaW5pdGlvbnMgdG8gcHJvZHVjZSBhY3R1YWwgXHsgJiBcfSBjb21tYW5kIGluIGFuIGluZGV4LgotICBcY2F0Y29kZWBceyA9IDEyIFxjYXRjb2RlYFx9ID0gMTIKLSAgXGNhdGNvZGVgXFsgPSAxIFxjYXRjb2RlYFxdID0gMgotICBcY2F0Y29kZWBcQCA9IDAgXGNhdGNvZGVgXFwgPSAxMgotICBAZ2RlZkBsYnJhY2VjbWRbXHtdJQotICBAZ2RlZkByYnJhY2VjbWRbXH1dJQotQGVuZGdyb3VwCi0KLSUgQWNjZW50czogQCwgQGRvdGFjY2VudCBAcmluZ2FjY2VudCBAdWJhcmFjY2VudCBAdWRvdGFjY2VudAotJSBPdGhlcnMgYXJlIGRlZmluZWQgYnkgcGxhaW4gVGVYOiBAYCBAJyBAIiBAXiBAfiBAPSBAdiBASC4KLVxsZXRcLCA9IFxjCi1cbGV0XGRvdGFjY2VudCA9IFwuCi1cZGVmXHJpbmdhY2NlbnQjMXt7XGFjY2VudDIzICMxfX0KLVxsZXRcdGllYWNjZW50ID0gXHQKLVxsZXRcdWJhcmFjY2VudCA9IFxiCi1cbGV0XHVkb3RhY2NlbnQgPSBcZAotCi0lIE90aGVyIHNwZWNpYWwgY2hhcmFjdGVyczogQHF1ZXN0aW9uZG93biBAZXhjbGFtZG93bgotJSBQbGFpbiBUZVggZGVmaW5lczogQEFBIEBBRSBATyBAT0UgQEwgKGFuZCBsb3dlcmNhc2UgdmVyc2lvbnMpIEBzcy4KLVxkZWZccXVlc3Rpb25kb3duez9gfQotXGRlZlxleGNsYW1kb3dueyFgfQotCi0lIERvdGxlc3MgaSBhbmQgZG90bGVzcyBqLCB1c2VkIGZvciBhY2NlbnRzLgotXGRlZlxpbWFjcm97aX0KLVxkZWZcam1hY3Jve2p9Ci1cZGVmXGRvdGxlc3MjMXslCi0gIFxkZWZcdGVtcHsjMX0lCi0gIFxpZnhcdGVtcFxpbWFjcm8gXHB0ZXhpCi0gIFxlbHNlXGlmeFx0ZW1wXGptYWNybyBcagotICBcZWxzZSBcZXJybWVzc2FnZXtAZG90bGVzcyBjYW4gYmUgdXNlZCBvbmx5IHdpdGggaSBvciBqfSUKLSAgXGZpXGZpCi19Ci0KLSUgQmUgc3VyZSB3ZSdyZSBpbiBob3Jpem9udGFsIG1vZGUgd2hlbiBkb2luZyBhIHRpZSwgc2luY2Ugd2UgbWFrZSBzcGFjZQotJSBlcXVpdmFsZW50IHRvIHRoaXMgaW4gQGV4YW1wbGUtbGlrZSBlbnZpcm9ubWVudHMuIE90aGVyd2lzZSwgYSBzcGFjZQotJSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSB3aWxsIHN0YXJ0IHdpdGggXHBlbmFsdHkgLS0gYW5kCi0lIHNpbmNlIFxwZW5hbHR5IGlzIHZhbGlkIGluIHZlcnRpY2FsIG1vZGUsIHdlJ2QgZW5kIHVwIHB1dHRpbmcgdGhlCi0lIHBlbmFsdHkgb24gdGhlIHZlcnRpY2FsIGxpc3QgaW5zdGVhZCBvZiBpbiB0aGUgbmV3IHBhcmFncmFwaC4KLXtcY2F0Y29kZWBAID0gMTEKLSAlIEF2b2lkIHVzaW5nIFxATSBkaXJlY3RseSwgYmVjYXVzZSB0aGF0IGNhdXNlcyB0cm91YmxlCi0gJSBpZiB0aGUgZGVmaW5pdGlvbiBpcyB3cml0dGVuIGludG8gYW4gaW5kZXggZmlsZS4KLSBcZ2xvYmFsXGxldFx0aWVwZW5hbHR5ID0gXEBNCi0gXGdkZWZcdGlle1xsZWF2ZXZtb2RlXHBlbmFsdHlcdGllcGVuYWx0eVwgfQotfQotCi0lIEA6IGZvcmNlcyBub3JtYWwgc2l6ZSB3aGl0ZXNwYWNlIGZvbGxvd2luZy4KLVxkZWZcOntcc3BhY2VmYWN0b3I9MTAwMCB9Ci0KLSUgQCogZm9yY2VzIGEgbGluZSBicmVhay4KLVxkZWZcKntcaGZpbFxicmVha1xoYm94e31caWdub3Jlc3BhY2VzfQotCi0lIEAuIGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBwZXJpb2QuCi1cZGVmXC57LlxzcGFjZWZhY3Rvcj0zMDAwIH0KLQotJSBAISBpcyBhbiBlbmQtb2Ytc2VudGVuY2UgYmFuZy4KLVxkZWZcIXshXHNwYWNlZmFjdG9yPTMwMDAgfQotCi0lIEA/IGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBxdWVyeS4KLVxkZWZcP3s/XHNwYWNlZmFjdG9yPTMwMDAgfQotCi0lIEB3IHByZXZlbnRzIGEgd29yZCBicmVhay4gIFdpdGhvdXQgdGhlIFxsZWF2ZXZtb2RlLCBAdyBhdCB0aGUKLSUgYmVnaW5uaW5nIG9mIGEgcGFyYWdyYXBoLCB3aGVuIFRlWCBpcyBzdGlsbCBpbiB2ZXJ0aWNhbCBtb2RlLCB3b3VsZAotJSBwcm9kdWNlIGEgd2hvbGUgbGluZSBvZiBvdXRwdXQgaW5zdGVhZCBvZiBzdGFydGluZyB0aGUgcGFyYWdyYXBoLgotXGRlZlx3IzF7XGxlYXZldm1vZGVcaGJveHsjMX19Ci0KLSUgQGdyb3VwIC4uLiBAZW5kIGdyb3VwIGZvcmNlcyAuLi4gdG8gYmUgYWxsIG9uIG9uZSBwYWdlLCBieSBlbmNsb3NpbmcKLSUgaXQgaW4gYSBUZVggdmJveC4gIFdlIHVzZSBcdnRvcCBpbnN0ZWFkIG9mIFx2Ym94IHRvIGNvbnN0cnVjdCB0aGUgYm94Ci0lIHRvIGtlZXAgaXRzIGhlaWdodCB0aGF0IG9mIGEgbm9ybWFsIGxpbmUuICBBY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGZvcgotJSBcdG9wc2tpcCAocC4xMTQgb2YgdGhlIFRlWGJvb2spLCB0aGUgZ2x1ZSBpbnNlcnRlZCBpcwotJSBtYXggKFx0b3Bza2lwIC0gXGh0IChmaXJzdCBpdGVtKSwgMCkuICBJZiB0aGF0IGhlaWdodCBpcyBsYXJnZSwKLSUgdGhlcmVmb3JlLCBubyBnbHVlIGlzIGluc2VydGVkLCBhbmQgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGhlYWRsaW5lIGFuZAotJSB0aGUgdGV4dCBpcyBzbWFsbCwgd2hpY2ggbG9va3MgYmFkLgotJQotXGRlZlxncm91cHtcYmVnaW5ncm91cAotICBcaWZudW1cY2F0Y29kZTEzPVxhY3RpdmUgXGVsc2UKLSAgICBcZXJyaGVscCA9IFxncm91cGludmFsaWRoZWxwCi0gICAgXGVycm1lc3NhZ2V7QGdyb3VwIGludmFsaWQgaW4gY29udGV4dCB3aGVyZSBmaWxsaW5nIGlzIGVuYWJsZWR9JQotICBcZmkKLSAgJQotICAlIFRoZSBcdnRvcCB3ZSBzdGFydCBiZWxvdyBwcm9kdWNlcyBhIGJveCB3aXRoIG5vcm1hbCBoZWlnaHQgYW5kIGxhcmdlCi0gICUgZGVwdGg7IHRodXMsIFRlWCBwdXRzIFxiYXNlbGluZXNraXAgZ2x1ZSBiZWZvcmUgaXQsIGFuZCAod2hlbiB0aGUKLSAgJSBuZXh0IGxpbmUgb2YgdGV4dCBpcyBkb25lKSBcbGluZXNraXAgZ2x1ZSBhZnRlciBpdC4gIChTZWUgcC44MiBvZgotICAlIHRoZSBUZVhib29rLikgIFRodXMsIHNwYWNlIGJlbG93IGlzIG5vdCBxdWl0ZSBlcXVhbCB0byBzcGFjZQotICAlIGFib3ZlLiAgQnV0IGl0J3MgcHJldHR5IGNsb3NlLgotICBcZGVmXEVncm91cHslCi0gICAgXGVncm91cCAgICAgICAgICAgJSBFbmQgdGhlIFx2dG9wLgotICAgIFxlbmRncm91cCAgICAgICAgICUgRW5kIHRoZSBcZ3JvdXAuCi0gIH0lCi0gICUKLSAgXHZ0b3BcYmdyb3VwCi0gICAgJSBXZSBoYXZlIHRvIHB1dCBhIHN0cnV0IG9uIHRoZSBsYXN0IGxpbmUgaW4gY2FzZSB0aGUgQGdyb3VwIGlzIGluCi0gICAgJSB0aGUgbWlkc3Qgb2YgYW4gZXhhbXBsZSwgcmF0aGVyIHRoYW4gY29tcGxldGVseSBlbmNsb3NpbmcgaXQuCi0gICAgJSBPdGhlcndpc2UsIHRoZSBpbnRlcmxpbmUgc3BhY2UgYmV0d2VlbiB0aGUgbGFzdCBsaW5lIG9mIHRoZSBncm91cAotICAgICUgYW5kIHRoZSBmaXJzdCBsaW5lIGFmdGVyd2FyZHMgaXMgdG9vIHNtYWxsLiAgQnV0IHdlIGNhbid0IHB1dCB0aGUKLSAgICAlIHN0cnV0IGluIFxFZ3JvdXAsIHNpbmNlIHRoZXJlIGl0IHdvdWxkIGJlIG9uIGEgbGluZSBieSBpdHNlbGYuCi0gICAgJSBIZW5jZSB0aGlzIGp1c3QgaW5zZXJ0cyBhIHN0cnV0IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lLgotICAgIFxldmVyeXBhciA9IHtcc3RydXR9JQotICAgICUKLSAgICAlIFNpbmNlIHdlIGhhdmUgYSBzdHJ1dCBvbiBldmVyeSBsaW5lLCB3ZSBkb24ndCBuZWVkIGFueSBvZiBUZVgncwotICAgICUgbm9ybWFsIGludGVybGluZSBzcGFjaW5nLgotICAgIFxvZmZpbnRlcmxpbmVza2lwCi0gICAgJQotICAgICUgT0ssIGJ1dCBub3cgd2UgaGF2ZSB0byBkbyBzb21ldGhpbmcgYWJvdXQgYmxhbmsKLSAgICAlIGxpbmVzIGluIHRoZSBpbnB1dCBpbiBAZXhhbXBsZS1saWtlIGVudmlyb25tZW50cywgd2hpY2ggbm9ybWFsbHkKLSAgICAlIGp1c3QgdHVybiBpbnRvIFxsaXNwcGFyLCB3aGljaCB3aWxsIGluc2VydCBubyBzcGFjZSBub3cgdGhhdCB3ZSd2ZQotICAgICUgdHVybmVkIG9mZiB0aGUgaW50ZXJsaW5lIHNwYWNlLiAgU2ltcGxlc3QgaXMgdG8gbWFrZSB0aGVtIGJlIGFuCi0gICAgJSBlbXB0eSBwYXJhZ3JhcGguCi0gICAgXGlmeFxwYXJcbGlzcHBhcgotICAgICAgXGVkZWZccGFye1xsZWF2ZXZtb2RlIFxwYXJ9JQotICAgICAgJQotICAgICAgJSBSZXNldCBeXk0ncyBkZWZpbml0aW9uIHRvIG5ldyBkZWZpbml0aW9uIG9mIFxwYXIuCi0gICAgICBcb2JleWxpbmVzCi0gICAgXGZpCi0gICAgJQotICAgICUgRG8gQGNvbW1lbnQgc2luY2Ugd2UgYXJlIGNhbGxlZCBpbnNpZGUgYW4gZW52aXJvbm1lbnQgc3VjaCBhcwotICAgICUgQGV4YW1wbGUsIHdoZXJlIGVhY2ggZW5kLW9mLWxpbmUgaW4gdGhlIGlucHV0IGNhdXNlcyBhbgotICAgICUgZW5kLW9mLWxpbmUgaW4gdGhlIG91dHB1dC4gIFdlIGRvbid0IHdhbnQgdGhlIGVuZC1vZi1saW5lIGFmdGVyCi0gICAgJSB0aGUgYEBncm91cCcgdG8gcHV0IGV4dHJhIHNwYWNlIGluIHRoZSBvdXRwdXQuICBTaW5jZSBAZ3JvdXAKLSAgICAlIHNob3VsZCBhcHBlYXIgb24gYSBsaW5lIGJ5IGl0c2VsZiAoYWNjb3JkaW5nIHRvIHRoZSBUZXhpbmZvCi0gICAgJSBtYW51YWwpLCB3ZSBkb24ndCB3b3JyeSBhYm91dCBlYXRpbmcgYW55IHVzZXIgdGV4dC4KLSAgICBcY29tbWVudAotfQotJQotJSBUZVggcHV0cyBpbiBhbiBcZXNjYXBlY2hhciAoaS5lLiwgYEAnKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWxwCi0lIG1lc3NhZ2UsIHNvIHRoaXMgZW5kcyB1cCBwcmludGluZyBgQGdyb3VwIGNhbiBvbmx5IC4uLicuCi0lCi1cbmV3aGVscFxncm91cGludmFsaWRoZWxweyUKLWdyb3VwIGNhbiBvbmx5IGJlIHVzZWQgaW4gZW52aXJvbm1lbnRzIHN1Y2ggYXMgQGV4YW1wbGUsXl5KJQotd2hlcmUgZWFjaCBsaW5lIG9mIGlucHV0IHByb2R1Y2VzIGEgbGluZSBvZiBvdXRwdXQufQotCi0lIEBuZWVkIHNwYWNlLWluLW1pbHMKLSUgZm9yY2VzIGEgcGFnZSBicmVhayBpZiB0aGVyZSBpcyBub3Qgc3BhY2UtaW4tbWlscyByZW1haW5pbmcuCi0KLVxuZXdkaW1lblxtaWwgIFxtaWw9MC4wMDFpbgotCi1cZGVmXG5lZWR7XHBhcnNlYXJnXG5lZWR4fQotCi0lIE9sZCBkZWZpbml0aW9uLS1kaWRuJ3Qgd29yay4KLSVcZGVmXG5lZWR4ICMxe1xwYXIgJQotJSUgVGhpcyBtZXRob2QgdHJpZXMgdG8gbWFrZSBUZVggYnJlYWsgdGhlIHBhZ2UgbmF0dXJhbGx5Ci0lJSBpZiB0aGUgZGVwdGggb2YgdGhlIGJveCBkb2VzIG5vdCBmaXQuCi0le1xiYXNlbGluZXNraXA9MHB0JQotJVx2dG9wIHRvICMxXG1pbHtcdmZpbH1ca2VybiAtIzFcbWlsXG5vYnJlYWsKLSVccHJldmRlcHRoPS0xMDAwcHQKLSV9fQotCi1cZGVmXG5lZWR4IzF7JQotICAlIEdvIGludG8gdmVydGljYWwgbW9kZSwgc28gd2UgZG9uJ3QgbWFrZSBhIGJpZyBib3ggaW4gdGhlIG1pZGRsZSBvZiBhCi0gICUgcGFyYWdyYXBoLgotICBccGFyCi0gICUKLSAgJSBEb24ndCBhZGQgYW55IGxlYWRpbmcgYmVmb3JlIG91ciBiaWcgZW1wdHkgYm94LCBidXQgYWxsb3cgYSBwYWdlCi0gICUgYnJlYWssIHNpbmNlIHRoZSBiZXN0IGJyZWFrIG1pZ2h0IGJlIHJpZ2h0IGhlcmUuCi0gIFxhbGxvd2JyZWFrCi0gIFxub2ludGVybGluZXNraXAKLSAgXHZ0b3AgdG8gIzFcbWlse1x2ZmlsfSUKLSAgJQotICAlIFRlWCBkb2VzIG5vdCBldmVuIGNvbnNpZGVyIHBhZ2UgYnJlYWtzIGlmIGEgcGVuYWx0eSBhZGRlZCB0byB0aGUKLSAgJSBtYWluIHZlcnRpY2FsIGxpc3QgaXMgMTAwMDAgb3IgbW9yZS4gIEJ1dCBpbiBvcmRlciB0byBzZWUgaWYgdGhlCi0gICUgZW1wdHkgYm94IHdlIGp1c3QgYWRkZWQgZml0cyBvbiB0aGUgcGFnZSwgd2UgbXVzdCBtYWtlIGl0IGNvbnNpZGVyCi0gICUgcGFnZSBicmVha3MuICBPbiB0aGUgb3RoZXIgaGFuZCwgd2UgZG9uJ3Qgd2FudCB0byBhY3R1YWxseSBicmVhayB0aGUKLSAgJSBwYWdlIGFmdGVyIHRoZSBlbXB0eSBib3guICBTbyB3ZSB1c2UgYSBwZW5hbHR5IG9mIDk5OTkuCi0gICUKLSAgJSBUaGVyZSBpcyBhbiBleHRyZW1lbHkgc21hbGwgY2hhbmNlIHRoYXQgVGVYIHdpbGwgYWN0dWFsbHkgYnJlYWsgdGhlCi0gICUgcGFnZSBhdCB0aGlzIFxwZW5hbHR5LCBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgZmVhc2libGUgYnJlYWtwb2ludHMgaW4KLSAgJSBzaWdodC4gIChJZiB0aGUgdXNlciBpcyB1c2luZyBsb3RzIG9mIGJpZyBAZ3JvdXAgY29tbWFuZHMsIHdoaWNoCi0gICUgYWxtb3N0LWJ1dC1ub3QtcXVpdGUgZmlsbCB1cCBhIHBhZ2UsIFRlWCB3aWxsIGhhdmUgYSBoYXJkIHRpbWUgZG9pbmcKLSAgJSBnb29kIHBhZ2UgYnJlYWtpbmcsIGZvciBleGFtcGxlLikgIEhvd2V2ZXIsIEkgY291bGQgbm90IGNvbnN0cnVjdCBhbgotICAlIGV4YW1wbGUgd2hlcmUgYSBwYWdlIGJyb2tlIGF0IHRoaXMgXHBlbmFsdHk7IGlmIGl0IGhhcHBlbnMgaW4gYSByZWFsCi0gICUgZG9jdW1lbnQsIHRoZW4gd2UgY2FuIHJlY29uc2lkZXIgb3VyIHN0cmF0ZWd5LgotICBccGVuYWx0eTk5OTkKLSAgJQotICAlIEJhY2sgdXAgYnkgdGhlIHNpemUgb2YgdGhlIGJveCwgd2hldGhlciB3ZSBkaWQgYSBwYWdlIGJyZWFrIG9yIG5vdC4KLSAgXGtlcm4gLSMxXG1pbAotICAlCi0gICUgRG8gbm90IGFsbG93IGEgcGFnZSBicmVhayByaWdodCBhZnRlciB0aGlzIGtlcm4uCi0gIFxub2JyZWFrCi19Ci0KLSUgQGJyICAgZm9yY2VzIHBhcmFncmFwaCBicmVhawotCi1cbGV0XGJyID0gXHBhcgotCi0lIEBkb3Rze30gb3V0cHV0IGFuIGVsbGlwc2lzIHVzaW5nIHRoZSBjdXJyZW50IGZvbnQuCi0lIFdlIGRvIC41ZW0gcGVyIHBlcmlvZCBzbyB0aGF0IGl0IGhhcyB0aGUgc2FtZSBzcGFjaW5nIGluIGEgdHlwZXdyaXRlcgotJSBmb250IGFzIHRocmVlIGFjdHVhbCBwZXJpb2QgY2hhcmFjdGVycy4KLSUKLVxkZWZcZG90c3slCi0gIFxsZWF2ZXZtb2RlCi0gIFxoYm94IHRvIDEuNWVteyUKLSAgICBcaHNraXAgMHB0IHBsdXMgMC4yNWZpbCBtaW51cyAwLjI1ZmlsCi0gICAgLlxoc3MuXGhzcy4lCi0gICAgXGhza2lwIDBwdCBwbHVzIDAuNWZpbCBtaW51cyAwLjVmaWwKLSAgfSUKLX0KLQotJSBAZW5kZG90c3t9IGlzIGFuIGVuZC1vZi1zZW50ZW5jZSBlbGxpcHNpcy4KLSUgCi1cZGVmXGVuZGRvdHN7JQotICBcbGVhdmV2bW9kZQotICBcaGJveCB0byAyZW17JQotICAgIFxoc2tpcCAwcHQgcGx1cyAwLjI1ZmlsIG1pbnVzIDAuMjVmaWwKLSAgICAuXGhzcy5caHNzLlxoc3MuJQotICAgIFxoc2tpcCAwcHQgcGx1cyAwLjVmaWwgbWludXMgMC41ZmlsCi0gIH0lCi0gIFxzcGFjZWZhY3Rvcj0zMDAwCi19Ci0KLQotJSBAcGFnZSAgICBmb3JjZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBhZ2UKLSUKLVxkZWZccGFnZXtccGFyXHZmaWxsXHN1cGVyZWplY3R9Ci0KLSUgQGV4ZGVudCB0ZXh0Li4uLgotJSBvdXRwdXRzIHRleHQgb24gc2VwYXJhdGUgbGluZSBpbiByb21hbiBmb250LCBzdGFydGluZyBhdCBzdGFuZGFyZCBwYWdlIG1hcmdpbgotCi0lIFRoaXMgcmVjb3JkcyB0aGUgYW1vdW50IG9mIGluZGVudCBpbiB0aGUgaW5uZXJtb3N0IGVudmlyb25tZW50LgotJSBUaGF0J3MgaG93IG11Y2ggXGV4ZGVudCBzaG91bGQgdGFrZSBvdXQuCi1cbmV3c2tpcFxleGRlbnRhbW91bnQKLQotJSBUaGlzIGRlZm4gaXMgdXNlZCBpbnNpZGUgZmlsbCBlbnZpcm9ubWVudHMgc3VjaCBhcyBAZGVmdW4uCi1cZGVmXGV4ZGVudHtccGFyc2VhcmdcZXhkZW50eXl5fQotXGRlZlxleGRlbnR5eXkgIzF7e1xoZmlsXGJyZWFrXGhib3h7XGtlcm4gLVxleGRlbnRhbW91bnR7XHJtIzF9fVxoZmlsXGJyZWFrfX0KLQotJSBUaGlzIGRlZm4gaXMgdXNlZCBpbnNpZGUgbm9maWxsIGVudmlyb25tZW50cyBzdWNoIGFzIEBleGFtcGxlLgotXGRlZlxub2ZpbGxleGRlbnR7XHBhcnNlYXJnXG5vZmlsbGV4ZGVudHl5eX0KLVxkZWZcbm9maWxsZXhkZW50eXl5ICMxe3tcYWR2YW5jZSBcbGVmdHNraXAgYnkgLVxleGRlbnRhbW91bnQKLVxsZWZ0bGluZXtcaHNraXBcbGVmdHNraXB7XHJtIzF9fX19Ci0KLSUgQGlubWFyZ2lue1RFWFR9IHB1dHMgVEVYVCBpbiB0aGUgbWFyZ2luIG5leHQgdG8gdGhlIGN1cnJlbnQgcGFyYWdyYXBoLgotCi1cZGVmXGlubWFyZ2luIzF7JQotXHN0cnV0XHZhZGp1c3R7XG5vYnJlYWtca2Vybi1cc3RydXRkZXB0aAotICBcdnRvcCB0byBcc3RydXRkZXB0aHtcYmFzZWxpbmVza2lwXHN0cnV0ZGVwdGhcdnNzCi0gIFxsbGFwe1xyaWdodHNraXA9XGlubWFyZ2luc3BhY2luZyBcdmJveHtcbm9pbmRlbnQgIzF9fVxudWxsfX19Ci1cbmV3c2tpcFxpbm1hcmdpbnNwYWNpbmcgXGlubWFyZ2luc3BhY2luZz0xY20KLVxkZWZcc3RydXRkZXB0aHtcZHBcc3RydXRib3h9Ci0KLSVcaGJveHt7XHJtIzF9fVxoZmlsXGJyZWFrfX0KLQotJSBAaW5jbHVkZSBmaWxlICAgIGluc2VydCB0ZXh0IG9mIHRoYXQgZmlsZSBhcyBpbnB1dC4KLSUgQWxsb3cgbm9ybWFsIGNoYXJhY3RlcnMgdGhhdCAgd2UgbWFrZSBhY3RpdmUgaW4gdGhlIGFyZ3VtZW50IChhIGZpbGUgbmFtZSkuCi1cZGVmXGluY2x1ZGV7XGJlZ2luZ3JvdXAKLSAgXGNhdGNvZGVgXFw9MTIKLSAgXGNhdGNvZGVgfj0xMgotICBcY2F0Y29kZWBePTEyCi0gIFxjYXRjb2RlYF89MTIKLSAgXGNhdGNvZGVgfD0xMgotICBcY2F0Y29kZWA8PTEyCi0gIFxjYXRjb2RlYD49MTIKLSAgXGNhdGNvZGVgKz0xMgotICBccGFyc2VhcmdcaW5jbHVkZXp6en0KLSUgUmVzdG9yZSBhY3RpdmUgY2hhcnMgZm9yIGluY2x1ZGVkIGZpbGUuCi1cZGVmXGluY2x1ZGV6enojMXtcZW5kZ3JvdXBcYmVnaW5ncm91cAotICAlIFJlYWQgdGhlIGluY2x1ZGVkIGZpbGUgaW4gYSBncm91cCBzbyBuZXN0ZWQgQGluY2x1ZGUncyB3b3JrLgotICBcZGVmXHRoaXNmaWxleyMxfSUKLSAgXGlucHV0XHRoaXNmaWxlCi1cZW5kZ3JvdXB9Ci0KLVxkZWZcdGhpc2ZpbGV7fQotCi0lIEBjZW50ZXIgbGluZSAgIG91dHB1dHMgdGhhdCBsaW5lLCBjZW50ZXJlZAotCi1cZGVmXGNlbnRlcntccGFyc2VhcmdcY2VudGVyenp6fQotXGRlZlxjZW50ZXJ6enogIzF7e1xhZHZhbmNlXGhzaXplIGJ5IC1cbGVmdHNraXAKLVxhZHZhbmNlXGhzaXplIGJ5IC1ccmlnaHRza2lwCi1cY2VudGVybGluZXsjMX19fQotCi0lIEBzcCBuICAgb3V0cHV0cyBuIGxpbmVzIG9mIHZlcnRpY2FsIHNwYWNlCi0KLVxkZWZcc3B7XHBhcnNlYXJnXHNweHh4fQotXGRlZlxzcHh4eCAjMXtcdnNraXAgIzFcYmFzZWxpbmVza2lwfQotCi0lIEBjb21tZW50IC4uLmxpbmUgd2hpY2ggaXMgaWdub3JlZC4uLgotJSBAYyBpcyB0aGUgc2FtZSBhcyBAY29tbWVudAotJSBAaWdub3JlIC4uLiBAZW5kIGlnbm9yZSAgaXMgYW5vdGhlciB3YXkgdG8gd3JpdGUgYSBjb21tZW50Ci0KLVxkZWZcY29tbWVudHtcYmVnaW5ncm91cCBcY2F0Y29kZWBcXl5NPVxvdGhlciUKLVxjYXRjb2RlYFxAPVxvdGhlciBcY2F0Y29kZWBcez1cb3RoZXIgXGNhdGNvZGVgXH09XG90aGVyJQotXGNvbW1lbnR4eHh9Ci17XGNhdGNvZGVgXF5eTT1cb3RoZXIgXGdkZWZcY29tbWVudHh4eCMxXl5Ne1xlbmRncm91cH19Ci0KLVxsZXRcYz1cY29tbWVudAotCi0lIEBwYXJhZ3JhcGhpbmRlbnQgIGlzIGRlZmluZWQgZm9yIHRoZSBJbmZvIGZvcm1hdHRpbmcgY29tbWFuZHMgb25seS4KLVxsZXRccGFyYWdyYXBoaW5kZW50PVxjb21tZW50Ci0KLSUgUHJldmVudCBlcnJvcnMgZm9yIHNlY3Rpb24gY29tbWFuZHMuCi0lIFVzZWQgaW4gQGlnbm9yZSBhbmQgaW4gZmFpbGluZyBjb25kaXRpb25hbHMuCi1cZGVmXGlnbm9yZXNlY3Rpb25zeyUKLVxsZXRcY2hhcHRlcj1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZD1ccmVsYXgKLVxsZXRcdG9wPVxyZWxheAotXGxldFx1bm51bWJlcmVkc2VjPVxyZWxheAotXGxldFx1bm51bWJlcmVkc2VjdGlvbj1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHN1YnNlYz1ccmVsYXgKLVxsZXRcdW5udW1iZXJlZHN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzdWJzdWJzZWM9XHJlbGF4Ci1cbGV0XHVubnVtYmVyZWRzdWJzdWJzZWN0aW9uPVxyZWxheAotXGxldFxzZWN0aW9uPVxyZWxheAotXGxldFxzdWJzZWM9XHJlbGF4Ci1cbGV0XHN1YnN1YnNlYz1ccmVsYXgKLVxsZXRcc3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcc3Vic3Vic2VjdGlvbj1ccmVsYXgKLVxsZXRcYXBwZW5kaXg9XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c2VjPVxyZWxheAotXGxldFxhcHBlbmRpeHNlY3Rpb249XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c3Vic2VjPVxyZWxheAotXGxldFxhcHBlbmRpeHN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XGFwcGVuZGl4c3Vic3Vic2VjPVxyZWxheAotXGxldFxhcHBlbmRpeHN1YnN1YnNlY3Rpb249XHJlbGF4Ci1cbGV0XGNvbnRlbnRzPVxyZWxheAotXGxldFxzbWFsbGJvb2s9XHJlbGF4Ci1cbGV0XHRpdGxlcGFnZT1ccmVsYXgKLX0KLQotJSBVc2VkIGluIG5lc3RlZCBjb25kaXRpb25hbHMsIHdoZXJlIHdlIGhhdmUgdG8gcGFyc2UgdGhlIFRleGluZm8gc291cmNlCi0lIGFuZCBzbyB3YW50IHRvIHR1cm4gb2ZmIG1vc3QgY29tbWFuZHMsIGluIGNhc2UgdGhleSBhcmUgdXNlZAotJSBpbmNvcnJlY3RseS4KLSUKLVxkZWZcaWdub3JlbW9yZWNvbW1hbmRzeyUKLSAgXGxldFxkZWZjb2RlaW5kZXggPSBccmVsYXgKLSAgXGxldFxkZWZjdiA9IFxyZWxheAotICBcbGV0XGRlZmZuID0gXHJlbGF4Ci0gIFxsZXRcZGVmZm54ID0gXHJlbGF4Ci0gIFxsZXRcZGVmaW5kZXggPSBccmVsYXgKLSAgXGxldFxkZWZpdmFyID0gXHJlbGF4Ci0gIFxsZXRcZGVmbWFjID0gXHJlbGF4Ci0gIFxsZXRcZGVmbWV0aG9kID0gXHJlbGF4Ci0gIFxsZXRcZGVmb3AgPSBccmVsYXgKLSAgXGxldFxkZWZvcHQgPSBccmVsYXgKLSAgXGxldFxkZWZzcGVjID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHAgPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBlZm4gPSBccmVsYXgKLSAgXGxldFxkZWZ0eXBlZnVuID0gXHJlbGF4Ci0gIFxsZXRcZGVmdHlwZXZhciA9IFxyZWxheAotICBcbGV0XGRlZnR5cGV2ciA9IFxyZWxheAotICBcbGV0XGRlZnVuID0gXHJlbGF4Ci0gIFxsZXRcZGVmdmFyID0gXHJlbGF4Ci0gIFxsZXRcZGVmdnIgPSBccmVsYXgKLSAgXGxldFxyZWYgPSBccmVsYXgKLSAgXGxldFx4cmVmID0gXHJlbGF4Ci0gIFxsZXRccHJpbnRpbmRleCA9IFxyZWxheAotICBcbGV0XHB4cmVmID0gXHJlbGF4Ci0gIFxsZXRcc2V0dGl0bGUgPSBccmVsYXgKLSAgXGxldFxzZXRjaGFwdGVybmV3cGFnZSA9IFxyZWxheAotICBcbGV0XHNldGNoYXB0ZXJzdHlsZSA9IFxyZWxheAotICBcbGV0XGV2ZXJ5aGVhZGluZyA9IFxyZWxheAotICBcbGV0XGV2ZW5oZWFkaW5nID0gXHJlbGF4Ci0gIFxsZXRcb2RkaGVhZGluZyA9IFxyZWxheAotICBcbGV0XGV2ZXJ5Zm9vdGluZyA9IFxyZWxheAotICBcbGV0XGV2ZW5mb290aW5nID0gXHJlbGF4Ci0gIFxsZXRcb2RkZm9vdGluZyA9IFxyZWxheAotICBcbGV0XGhlYWRpbmdzID0gXHJlbGF4Ci0gIFxsZXRcaW5jbHVkZSA9IFxyZWxheAotICBcbGV0XGxvd2Vyc2VjdGlvbnMgPSBccmVsYXgKLSAgXGxldFxkb3duID0gXHJlbGF4Ci0gIFxsZXRccmFpc2VzZWN0aW9ucyA9IFxyZWxheAotICBcbGV0XHVwID0gXHJlbGF4Ci0gIFxsZXRcc2V0ID0gXHJlbGF4Ci0gIFxsZXRcY2xlYXIgPSBccmVsYXgKLSAgXGxldFxpdGVtID0gXHJlbGF4Ci19Ci0KLSUgSWdub3JlIEBpZ25vcmUgLi4uIEBlbmQgaWdub3JlLgotJQotXGRlZlxpZ25vcmV7XGRvaWdub3Jle2lnbm9yZX19Ci0KLSUgSWdub3JlIEBpZmluZm8sIEBpZmh0bWwsIEBpZm5vdHRleCwgQGh0bWwsIEBtZW51LCBhbmQgQGRpcmVudHJ5IHRleHQuCi0lCi1cZGVmXGlmaW5mb3tcZG9pZ25vcmV7aWZpbmZvfX0KLVxkZWZcaWZodG1se1xkb2lnbm9yZXtpZmh0bWx9fQotXGRlZlxpZm5vdHRleHtcZG9pZ25vcmV7aWZub3R0ZXh9fQotXGRlZlxodG1se1xkb2lnbm9yZXtodG1sfX0KLVxkZWZcbWVudXtcZG9pZ25vcmV7bWVudX19Ci1cZGVmXGRpcmVudHJ5e1xkb2lnbm9yZXtkaXJlbnRyeX19Ci0KLSUgQGRpcmNhdGVnb3J5IENBVEVHT1JZICAtLSBzcGVjaWZ5IGEgY2F0ZWdvcnkgb2YgdGhlIGRpciBmaWxlCi0lIHdoaWNoIHRoaXMgZmlsZSBzaG91bGQgYmVsb25nIHRvLiAgSWdub3JlIHRoaXMgaW4gVGVYLgotXGxldFxkaXJjYXRlZ29yeSA9IFxjb21tZW50Ci0KLSUgSWdub3JlIHRleHQgdW50aWwgYSBsaW5lIGBAZW5kICMxJy4KLSUKLVxkZWZcZG9pZ25vcmUjMXtcYmVnaW5ncm91cAotICAlIERvbid0IGNvbXBsYWluIGFib3V0IGNvbnRyb2wgc2VxdWVuY2VzIHdlIGhhdmUgZGVjbGFyZWQgXG91dGVyLgotICBcaWdub3Jlc2VjdGlvbnMKLSAgJQotICAlIERlZmluZSBhIGNvbW1hbmQgdG8gc3dhbGxvdyB0ZXh0IHVudGlsIHdlIHJlYWNoIGBAZW5kICMxJy4KLSAgJSBUaGlzIEAgaXMgYSBjYXRjb2RlIDEyIHRva2VuICh0aGF0IGlzIHRoZSBub3JtYWwgY2F0Y29kZSBvZiBAIGluCi0gICUgdGhpcyB0ZXhpbmZvLnRleCBmaWxlKS4gIFdlIGNoYW5nZSB0aGUgY2F0Y29kZSBvZiBAIGJlbG93IHRvIG1hdGNoLgotICBcbG9uZ1xkZWZcZG9pZ25vcmV0ZXh0IyMxQGVuZCAjMXtcZW5kZG9pZ25vcmV9JQotICAlCi0gICUgTWFrZSBzdXJlIHRoYXQgc3BhY2VzIHR1cm4gaW50byB0b2tlbnMgdGhhdCBtYXRjaCB3aGF0IFxkb2lnbm9yZXRleHQgd2FudHMuCi0gIFxjYXRjb2RlMzIgPSAxMAotICAlCi0gICUgSWdub3JlIGJyYWNlcywgdG9vLCBzbyBtaXNtYXRjaGVkIGJyYWNlcyBkb24ndCBjYXVzZSB0cm91YmxlLgotICBcY2F0Y29kZWBceyA9IDkKLSAgXGNhdGNvZGVgXH0gPSA5Ci0gICUKLSAgJSBXZSBtdXN0IG5vdCBoYXZlIEBjIGludGVycHJldGVkIGFzIGEgY29udHJvbCBzZXF1ZW5jZS4KLSAgXGNhdGNvZGVgXEAgPSAxMgotICAlCi0gICUgTWFrZSB0aGUgbGV0dGVyIGMgYSBjb21tZW50IGNoYXJhY3RlciBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZSBsaW5lCi0gICUgd2lsbCBiZSBpZ25vcmVkLiBUaGlzIHdheSwgdGhlIGRvY3VtZW50IGNhbiBoYXZlIChmb3IgZXhhbXBsZSkKLSAgJSAgIEBjIEBlbmQgaWZpbmZvCi0gICUgYW5kIHRoZSBAZW5kIGlmaW5mbyB3aWxsIGJlIHByb3Blcmx5IGlnbm9yZWQuCi0gICUgKFdlJ3ZlIGp1c3QgY2hhbmdlZCBAIHRvIGNhdGNvZGUgMTIuKQotICBcY2F0Y29kZWBcYyA9IDE0Ci0gICUKLSAgJSBBbmQgbm93IGV4cGFuZCB0aGF0IGNvbW1hbmQuCi0gIFxkb2lnbm9yZXRleHQKLX0KLQotJSBXaGF0IHdlIGRvIHRvIGZpbmlzaCBvZmYgaWdub3JlZCB0ZXh0LgotJQotXGRlZlxlbmRkb2lnbm9yZXtcZW5kZ3JvdXBcaWdub3Jlc3BhY2VzfSUKLQotXG5ld2lmXGlmd2FybmVkb2JzXHdhcm5lZG9ic2ZhbHNlCi1cZGVmXG9ic3RleHdhcm57JQotICBcaWZ3YXJuZWRvYnNccmVsYXhcZWxzZQotICAlIFdlIG5lZWQgdG8gd2FybiBmb2xrcyB0aGF0IHRoZXkgbWF5IGhhdmUgdHJvdWJsZSB3aXRoIFRlWCAzLjAuCi0gICUgVGhpcyB1c2VzIFxpbW1lZGlhdGVcd3JpdGUxNiByYXRoZXIgdGhhbiBcbWVzc2FnZSB0byBnZXQgbmV3bGluZXMuCi0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e30KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7KioqV0FSTklORyoqKiBmb3IgdXNlcnMgb2YgVW5peCBUZVggMy4wIX0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7VGhpcyBtYW51YWwgdHJpcHMgYSBidWcgaW4gVGVYIHZlcnNpb24gMy4wICh0ZXggaGFuZ3MpLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7SWYgeW91IGFyZSBydW5uaW5nIGFub3RoZXIgdmVyc2lvbiBvZiBUZVgsIHJlbGF4Ln0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7SWYgeW91IGFyZSBydW5uaW5nIFVuaXggVGVYIDMuMCwga2lsbCB0aGlzIFRlWCBwcm9jZXNzLn0KLSAgICBcaW1tZWRpYXRlXHdyaXRlMTZ7ICBUaGVuIHVwZ3JhZGUgeW91ciBUZVggaW5zdGFsbGF0aW9uIGlmIHlvdSBjYW4ufQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNnsgIChTZWUgZnRwOi8vZnRwLmdudS5haS5taXQuZWR1L3B1Yi9nbnUvVGVYLlJFQURNRS4pfQotICAgIFxpbW1lZGlhdGVcd3JpdGUxNntJZiB5b3UgYXJlIHN0dWNrIHdpdGggdmVyc2lvbiAzLjAsIHJ1biB0aGV9Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2eyAgc2NyaXB0IGBgdGV4M3BhdGNoJycgZnJvbSB0aGUgVGV4aW5mbyBkaXN0cmlidXRpb259Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2eyAgdG8gdXNlIGEgd29ya2Fyb3VuZC59Ci0gICAgXGltbWVkaWF0ZVx3cml0ZTE2e30KLSAgICBcZ2xvYmFsXHdhcm5lZG9ic3RydWUKLSAgICBcZmkKLX0KLQotJSAqKkluIFRlWCAzLjAsIHNldHRpbmcgdGV4dCBpbiBcbnVsbGZvbnQgaGFuZ3MgdGV4LiAgRm9yIGEKLSUgd29ya2Fyb3VuZCAod2hpY2ggcmVxdWlyZXMgdGhlIGZpbGUgYGBkdW1teS50Zm0nJyB0byBiZSBpbnN0YWxsZWQpLAotJSB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lOgotJSUlJSVcZm9udFxudWxsZm9udD1kdW1teVxsZXRcb2JzdGV4d2Fybj1ccmVsYXgKLQotJSBJZ25vcmUgdGV4dCwgZXhjZXB0IHRoYXQgd2Uga2VlcCB0cmFjayBvZiBjb25kaXRpb25hbCBjb21tYW5kcyBmb3IKLSUgcHVycG9zZXMgb2YgbmVzdGluZywgdXAgdG8gYW4gYEBlbmQgIzEnIGNvbW1hbmQuCi0lCi1cZGVmXG5lc3RlZGlnbm9yZSMxeyUKLSAgXG9ic3RleHdhcm4KLSAgJSBXZSBtdXN0IGFjdHVhbGx5IGV4cGFuZCB0aGUgaWdub3JlZCB0ZXh0IHRvIGxvb2sgZm9yIHRoZSBAZW5kCi0gICUgY29tbWFuZCwgc28gdGhhdCBuZXN0ZWQgaWdub3JlIGNvbnN0cnVjdHMgd29yay4gIFRodXMsIHdlIHB1dCB0aGUKLSAgJSB0ZXh0IGludG8gYSBcdmJveCBhbmQgdGhlbiBkbyBub3RoaW5nIHdpdGggdGhlIHJlc3VsdC4gIFRvIG1pbmltaXplCi0gICUgdGhlIGNoYW5nZSBvZiBtZW1vcnkgb3ZlcmZsb3csIHdlIGZvbGxvdyB0aGUgYXBwcm9hY2ggb3V0bGluZWQgb24KLSAgJSBwYWdlIDQwMSBvZiB0aGUgVGVYYm9vazogbWFrZSB0aGUgY3VycmVudCBmb250IGJlIGEgZHVtbXkgZm9udC4KLSAgJQotICBcc2V0Ym94MCA9IFx2Ym94XGJncm91cAotICAgICUgRG9uJ3QgY29tcGxhaW4gYWJvdXQgY29udHJvbCBzZXF1ZW5jZXMgd2UgaGF2ZSBkZWNsYXJlZCBcb3V0ZXIuCi0gICAgXGlnbm9yZXNlY3Rpb25zCi0gICAgJQotICAgICUgRGVmaW5lIGBAZW5kICMxJyB0byBlbmQgdGhlIGJveCwgd2hpY2ggd2lsbCBpbiB0dXJuIHVuZGVmaW5lIHRoZQotICAgICUgQGVuZCBjb21tYW5kIGFnYWluLgotICAgIFxleHBhbmRhZnRlclxkZWZcY3NuYW1lIEUjMVxlbmRjc25hbWV7XGVncm91cFxpZ25vcmVzcGFjZXN9JQotICAgICUKLSAgICAlIFdlIGFyZSBnb2luZyB0byBiZSBwYXJzaW5nIFRleGluZm8gY29tbWFuZHMuICBNb3N0IGNhdXNlIG5vCi0gICAgJSB0cm91YmxlIHdoZW4gdGhleSBhcmUgdXNlZCBpbmNvcnJlY3RseSwgYnV0IHNvbWUgY29tbWFuZHMgZG8KLSAgICAlIGNvbXBsaWNhdGVkIGFyZ3VtZW50IHBhcnNpbmcgb3Igb3RoZXJ3aXNlIGdldCBjb25mdXNlZCwgc28gd2UKLSAgICAlIHVuZGVmaW5lIHRoZW0uCi0gICAgJQotICAgICUgV2UgY2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgc3RyYXkgQC1zaWducywgdW5mb3J0dW5hdGVseTsKLSAgICAlIHRoZXknbGwgcHJvZHVjZSBgdW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVuY2UnIGVycm9ycy4KLSAgICBcaWdub3JlbW9yZWNvbW1hbmRzCi0gICAgJQotICAgICUgU2V0IHRoZSBjdXJyZW50IGZvbnQgdG8gYmUgXG51bGxmb250LCBhIFRlWCBwcmltaXRpdmUsIGFuZCBkZWZpbmUKLSAgICAlIGFsbCB0aGUgZm9udCBjb21tYW5kcyB0byBhbHNvIHVzZSBcbnVsbGZvbnQuICBXZSBkb24ndCB1c2UKLSAgICAlIGR1bW15LnRmbSwgYXMgc3VnZ2VzdGVkIGluIHRoZSBUZVhib29rLCBiZWNhdXNlIG5vdCBhbGwgc2l0ZXMKLSAgICAlIG1pZ2h0IGhhdmUgdGhhdCBpbnN0YWxsZWQuICBUaGVyZWZvcmUsIG1hdGggbW9kZSB3aWxsIHN0aWxsCi0gICAgJSBwcm9kdWNlIG91dHB1dCwgYnV0IHRoYXQgc2hvdWxkIGJlIGFuIGV4dHJlbWVseSBzbWFsbCBhbW91bnQgb2YKLSAgICAlIHN0dWZmIGNvbXBhcmVkIHRvIHRoZSBtYWluIGlucHV0LgotICAgICUKLSAgICBcbnVsbGZvbnQKLSAgICBcbGV0XHRlbnJtID0gXG51bGxmb250ICBcbGV0XHRlbml0ID0gXG51bGxmb250ICBcbGV0XHRlbnNsID0gXG51bGxmb250Ci0gICAgXGxldFx0ZW5iZiA9IFxudWxsZm9udCAgXGxldFx0ZW50dCA9IFxudWxsZm9udCAgXGxldFxzbWFsbGNhcHMgPSBcbnVsbGZvbnQKLSAgICBcbGV0XHRlbnNmID0gXG51bGxmb250Ci0gICAgJSBTaW1pbGFybHkgZm9yIGluZGV4IGZvbnRzIChtb3N0bHkgZm9yIHRoZWlyIHVzZSBpbgotICAgICUgc21hbGxleGFtcGxlKQotICAgIFxsZXRcaW5kcm0gPSBcbnVsbGZvbnQgIFxsZXRcaW5kaXQgPSBcbnVsbGZvbnQgIFxsZXRcaW5kc2wgPSBcbnVsbGZvbnQKLSAgICBcbGV0XGluZGJmID0gXG51bGxmb250ICBcbGV0XGluZHR0ID0gXG51bGxmb250ICBcbGV0XGluZHNjID0gXG51bGxmb250Ci0gICAgXGxldFxpbmRzZiA9IFxudWxsZm9udAotICAgICUKLSAgICAlIERvbid0IGNvbXBsYWluIHdoZW4gY2hhcmFjdGVycyBhcmUgbWlzc2luZyBmcm9tIHRoZSBmb250cy4KLSAgICBcdHJhY2luZ2xvc3RjaGFycyA9IDAKLSAgICAlCi0gICAgJSBEb24ndCBib3RoZXIgdG8gZG8gc3BhY2UgZmFjdG9yIGNhbGN1bGF0aW9ucy4KLSAgICBcZnJlbmNoc3BhY2luZwotICAgICUKLSAgICAlIERvbid0IHJlcG9ydCB1bmRlcmZ1bGwgaGJveGVzLgotICAgIFxoYmFkbmVzcyA9IDEwMDAwCi0gICAgJQotICAgICUgRG8gbWluaW1hbCBsaW5lLWJyZWFraW5nLgotICAgIFxwcmV0b2xlcmFuY2UgPSAxMDAwMAotICAgICUKLSAgICAlIERvIG5vdCBleGVjdXRlIGluc3RydWN0aW9ucyBpbiBAdGV4Ci0gICAgXGRlZlx0ZXh7XGRvaWdub3Jle3RleH19JQotICAgICUgRG8gbm90IGV4ZWN1dGUgbWFjcm8gZGVmaW5pdGlvbnMuCi0gICAgJSBgYycgaXMgYSBjb21tZW50IGNoYXJhY3Rlciwgc28gdGhlIHdvcmQgYG1hY3JvJyB3aWxsIGdldCBjdXQgb2ZmLgotICAgIFxkZWZcbWFjcm97XGRvaWdub3Jle21hfX0lCi19Ci0KLSUgQHNldCBWQVIgc2V0cyB0aGUgdmFyaWFibGUgVkFSIHRvIGFuIGVtcHR5IHZhbHVlLgotJSBAc2V0IFZBUiBSRVNULU9GLUxJTkUgc2V0cyBWQVIgdG8gdGhlIHZhbHVlIFJFU1QtT0YtTElORS4KLSUKLSUgU2luY2Ugd2Ugd2FudCB0byBzZXBhcmF0ZSBWQVIgZnJvbSBSRVNULU9GLUxJTkUgKHdoaWNoIG1pZ2h0IGJlCi0lIGVtcHR5KSwgd2UgY2FuJ3QganVzdCB1c2UgXHBhcnNlYXJnOyB3ZSBoYXZlIHRvIGluc2VydCBhIHNwYWNlIG9mIG91cgotJSBvd24gdG8gZGVsaW1pdCB0aGUgcmVzdCBvZiB0aGUgbGluZSwgYW5kIHRoZW4gdGFrZSBpdCBvdXQgYWdhaW4gaWYgd2UKLSUgZGlkbid0IG5lZWQgaXQuICBNYWtlIHN1cmUgdGhlIGNhdGNvZGUgb2Ygc3BhY2UgaXMgY29ycmVjdCB0byBhdm9pZAotJSBsb3NpbmcgaW5zaWRlIEBleGFtcGxlLCBmb3IgaW5zdGFuY2UuCi0lCi1cZGVmXHNldHtcYmVnaW5ncm91cFxjYXRjb2RlYCA9MTAKLSAgXGNhdGNvZGVgXC09MTIgXGNhdGNvZGVgXF89MTIgJSBBbGxvdyAtIGFuZCBfIGluIFZBUi4KLSAgXHBhcnNlYXJnXHNldHh4eH0KLVxkZWZcc2V0eHh4IzF7XHNldHl5eSMxIFxlbmRzZXR5eXl9Ci1cZGVmXHNldHl5eSMxICMyXGVuZHNldHl5eXslCi0gIFxkZWZcdGVtcHsjMn0lCi0gIFxpZnhcdGVtcFxlbXB0eSBcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lID0gXGVtcHR5Ci0gIFxlbHNlIFxzZXR6enp7IzF9IzJcZW5kc2V0enp6ICUgUmVtb3ZlIHRoZSB0cmFpbGluZyBzcGFjZSBcc2V0eHh4IGluc2VydGVkLgotICBcZmkKLSAgXGVuZGdyb3VwCi19Ci0lIENhbid0IHVzZSBceGRlZiB0byBwcmUtZXhwYW5kICMyIGFuZCBzYXZlIHNvbWUgdGltZSwgc2luY2UgXHRlbXAgb3IKLSUgXG5leHQgb3Igb3RoZXIgY29udHJvbCBzZXF1ZW5jZXMgdGhhdCB3ZSd2ZSBkZWZpbmVkIG1pZ2h0IGdldCB1cyBpbnRvCi0lIGFuIGluZmluaXRlIGxvb3AuIENvbnNpZGVyIGBAc2V0IGZvbyBAY2l0ZXtiYXJ9Jy4KLVxkZWZcc2V0enp6IzEjMiBcZW5kc2V0enp6e1xleHBhbmRhZnRlclxnZGVmXGNzbmFtZSBTRVQjMVxlbmRjc25hbWV7IzJ9fQotCi0lIEBjbGVhciBWQVIgY2xlYXJzIChpLmUuLCB1bnNldHMpIHRoZSB2YXJpYWJsZSBWQVIuCi0lCi1cZGVmXGNsZWFye1xwYXJzZWFyZ1xjbGVhcnh4eH0KLVxkZWZcY2xlYXJ4eHgjMXtcZ2xvYmFsXGV4cGFuZGFmdGVyXGxldFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lPVxyZWxheH0KLQotJSBAdmFsdWV7Zm9vfSBnZXRzIHRoZSB0ZXh0IHNhdmVkIGluIHZhcmlhYmxlIGZvby4KLSUKLXsKLSAgXGNhdGNvZGVgXF8gPSBcYWN0aXZlCi0gICUKLSAgJSBXZSBtaWdodCBlbmQgdXAgd2l0aCBhY3RpdmUgXyBvciAtIGNoYXJhY3RlcnMgaW4gdGhlIGFyZ3VtZW50IGlmCi0gICUgd2UncmUgY2FsbGVkIGZyb20gQGNvZGUsIGFzIEBjb2Rle0B2YWx1ZXtmb28tYmFyX319LiAgU28gXGxldCBhbnkKLSAgJSBzdWNoIGFjdGl2ZSBjaGFyYWN0ZXJzIHRvIHRoZWlyIG5vcm1hbCBlcXVpdmFsZW50cy4KLSAgXGdkZWZcdmFsdWV7XGJlZ2luZ3JvdXAKLSAgICBcY2F0Y29kZWBcLT0xMiBcY2F0Y29kZWBcXz0xMgotICAgIFxpbmRleGJyZWFrcyBcbGV0X1xub3JtYWx1bmRlcnNjb3JlCi0gICAgXHZhbHVleHh4fQotfQotXGRlZlx2YWx1ZXh4eCMxe1xleHBhbmRhYmxldmFsdWV7IzF9XGVuZGdyb3VwfQotCi0lIFdlIGhhdmUgdGhpcyBzdWJyb3V0aW5lIHNvIHRoYXQgd2UgY2FuIGhhbmRsZSBhdCBsZWFzdCBzb21lIEB2YWx1ZSdzCi0lIHByb3Blcmx5IGluIGluZGV4ZXMgKHdlIFxsZXRcdmFsdWUgdG8gdGhpcyBpbiBcaW5kZXhkdW1taWVzKS4gIE9uZXMKLSUgd2hvc2UgbmFtZXMgY29udGFpbiAtIG9yIF8gc3RpbGwgd29uJ3Qgd29yaywgYnV0IHdlIGNhbid0IGRvIGFueXRoaW5nCi0lIGFib3V0IHRoYXQuICBUaGUgY29tbWFuZCBoYXMgdG8gYmUgZnVsbHkgZXhwYW5kYWJsZSwgc2luY2UgdGhlIHJlc3VsdAotJSB3aW5kcyB1cCBpbiB0aGUgaW5kZXggZmlsZS4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgdmFyaWFibGUncyB2YWx1ZQotJSBjb250YWlucyBvdGhlciBUZXhpbmZvIGNvbW1hbmRzLCBpdCdzIGFsbW9zdCBjZXJ0YWluIGl0IHdpbGwgZmFpbAotJSAoYWx0aG91Z2ggcGVyaGFwcyB3ZSBjb3VsZCBmaXggdGhhdCB3aXRoIHN1ZmZpY2llbnQgd29yayB0byBkbyBhCi0lIG9uZS1sZXZlbCBleHBhbnNpb24gb24gdGhlIHJlc3VsdCwgaW5zdGVhZCBvZiBjb21wbGV0ZSkuCi0lIAotXGRlZlxleHBhbmRhYmxldmFsdWUjMXslCi0gIFxleHBhbmRhZnRlclxpZnhcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZVxyZWxheAotICAgIHtbTm8gdmFsdWUgZm9yIGBgIzEnJ112fSUKLSAgXGVsc2UKLSAgICBcY3NuYW1lIFNFVCMxXGVuZGNzbmFtZQotICBcZmkKLX0KLQotJSBAaWZzZXQgVkFSIC4uLiBAZW5kIGlmc2V0IHJlYWRzIHRoZSBgLi4uJyBpZmYgVkFSIGhhcyBiZWVuIGRlZmluZWQKLSUgd2l0aCBAc2V0LgotJQotXGRlZlxpZnNldHtccGFyc2VhcmdcaWZzZXR4eHh9Ci1cZGVmXGlmc2V0eHh4ICMxeyUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lXHJlbGF4Ci0gICAgXGV4cGFuZGFmdGVyXGlmc2V0ZmFpbAotICBcZWxzZQotICAgIFxleHBhbmRhZnRlclxpZnNldHN1Y2NlZWQKLSAgXGZpCi19Ci1cZGVmXGlmc2V0c3VjY2VlZHtcY29uZGl0aW9uYWxzdWNjZWVke2lmc2V0fX0KLVxkZWZcaWZzZXRmYWlse1xuZXN0ZWRpZ25vcmV7aWZzZXR9fQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZnNldH0KLQotJSBAaWZjbGVhciBWQVIgLi4uIEBlbmQgaWZjbGVhciByZWFkcyB0aGUgYC4uLicgaWZmIFZBUiBoYXMgbmV2ZXIgYmVlbgotJSBkZWZpbmVkIHdpdGggQHNldCwgb3IgaGFzIGJlZW4gdW5kZWZpbmVkIHdpdGggQGNsZWFyLgotJQotXGRlZlxpZmNsZWFye1xwYXJzZWFyZ1xpZmNsZWFyeHh4fQotXGRlZlxpZmNsZWFyeHh4ICMxeyUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUIzFcZW5kY3NuYW1lXHJlbGF4Ci0gICAgXGV4cGFuZGFmdGVyXGlmY2xlYXJzdWNjZWVkCi0gIFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGlmY2xlYXJmYWlsCi0gIFxmaQotfQotXGRlZlxpZmNsZWFyc3VjY2VlZHtcY29uZGl0aW9uYWxzdWNjZWVke2lmY2xlYXJ9fQotXGRlZlxpZmNsZWFyZmFpbHtcbmVzdGVkaWdub3Jle2lmY2xlYXJ9fQotXGRlZmluZXVubWF0Y2hlZGVuZHtpZmNsZWFyfQotCi0lIEBpZnRleCwgQGlmbm90aHRtbCwgQGlmbm90aW5mbyBhbHdheXMgc3VjY2VlZDsgd2UgcmVhZCB0aGUgdGV4dAotJSBmb2xsb3dpbmcsIHRocm91Z2ggdGhlIGZpcnN0IEBlbmQgaWZ0ZXggKGV0Yy4pLiAgTWFrZSBgQGVuZCBpZnRleCcKLSUgKGV0Yy4pIHZhbGlkIG9ubHkgYWZ0ZXIgYW4gQGlmdGV4LgotJQotXGRlZlxpZnRleHtcY29uZGl0aW9uYWxzdWNjZWVke2lmdGV4fX0KLVxkZWZcaWZub3RodG1se1xjb25kaXRpb25hbHN1Y2NlZWR7aWZub3RodG1sfX0KLVxkZWZcaWZub3RpbmZve1xjb25kaXRpb25hbHN1Y2NlZWR7aWZub3RpbmZvfX0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZ0ZXh9Ci1cZGVmaW5ldW5tYXRjaGVkZW5ke2lmbm90aHRtbH0KLVxkZWZpbmV1bm1hdGNoZWRlbmR7aWZub3RpbmZvfQotCi0lIFdlIGNhbid0IGp1c3Qgd2FudCB0byBzdGFydCBhIGdyb3VwIGF0IEBpZnRleCAoZm9yIGV4YW1wbGUpIGFuZCBlbmQgaXQKLSUgYXQgQGVuZCBpZnRleCwgc2luY2UgdGhlbiBAc2V0IGNvbW1hbmRzIGluc2lkZSB0aGUgY29uZGl0aW9uYWwgaGF2ZSBubwotJSBlZmZlY3QgKHRoZXknZCBnZXQgcmV2ZXJ0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZ3JvdXApLiAgU28gd2UgbXVzdAotJSBkZWZpbmUgXEVpZnRleCB0byByZWRlZmluZSBpdHNlbGYgdG8gYmUgaXRzIHByZXZpb3VzIHZhbHVlLiAgKFdlIGNhbid0Ci0lIGp1c3QgZGVmaW5lIGl0IHRvIGZhaWwgYWdhaW4gd2l0aCBhbiBgYHVubWF0Y2hlZCBlbmQnJyBlcnJvciwgc2luY2UKLSUgdGhlIEBpZnNldCBtaWdodCBiZSBuZXN0ZWQuKQotJQotXGRlZlxjb25kaXRpb25hbHN1Y2NlZWQjMXslCi0gIFxlZGVmXHRlbXB7JQotICAgICUgUmVtZW1iZXIgdGhlIGN1cnJlbnQgdmFsdWUgb2YgXEUjMS4KLSAgICBcbGV0XG5lY2V7cHJldkUjMX0gPSBcbmVjZXtFIzF9JQotICAgICUKLSAgICAlIEF0IHRoZSBgQGVuZCAjMScsIHJlZGVmaW5lIFxFIzEgdG8gYmUgaXRzIHByZXZpb3VzIHZhbHVlLgotICAgIFxkZWZcbmVjZXtFIzF9e1xsZXRcbmVjZXtFIzF9ID0gXG5lY2V7cHJldkUjMX19JQotICB9JQotICBcdGVtcAotfQotCi0lIFdlIG5lZWQgdG8gZXhwYW5kIGxvdHMgb2YgXGNzbmFtZSdzLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBleHBhbmQgdGhlCi0lIGNvbnRyb2wgc2VxdWVuY2VzIGFmdGVyIHdlJ3ZlIGNvbnN0cnVjdGVkIHRoZW0uCi0lCi1cZGVmXG5lY2UjMXtcZXhwYW5kYWZ0ZXJcbm9leHBhbmRcY3NuYW1lIzFcZW5kY3NuYW1lfQotCi0lIEBhc2lzIGp1c3QgeWllbGRzIGl0cyBhcmd1bWVudC4gIFVzZWQgd2l0aCBAdGFibGUsIGZvciBleGFtcGxlLgotJQotXGRlZlxhc2lzIzF7IzF9Ci0KLSUgQG1hdGggbWVhbnMgb3V0cHV0IGluIG1hdGggbW9kZS4KLSUgV2UgZG9uJ3QgdXNlICQncyBkaXJlY3RseSBpbiB0aGUgZGVmaW5pdGlvbiBvZiBcbWF0aCBiZWNhdXNlIGNvbnRyb2wKLSUgc2VxdWVuY2VzIGxpa2UgXG1hdGggYXJlIGV4cGFuZGVkIHdoZW4gdGhlIHRvYyBmaWxlIGlzIHdyaXR0ZW4uICBUaGVuLAotJSB3ZSByZWFkIHRoZSB0b2MgZmlsZSBiYWNrLCB0aGUgJCdzIHdpbGwgYmUgbm9ybWFsIGNoYXJhY3RlcnMgKGFzIHRoZXkKLSUgc2hvdWxkIGJlLCBhY2NvcmRpbmcgdG8gdGhlIGRlZmluaXRpb24gb2YgVGV4aW5mbykuICBTbyB3ZSBtdXN0IHVzZSBhCi0lIGNvbnRyb2wgc2VxdWVuY2UgdG8gc3dpdGNoIGludG8gYW5kIG91dCBvZiBtYXRoIG1vZGUuCi0lCi0lIFRoaXMgaXNuJ3QgcXVpdGUgZW5vdWdoIGZvciBAbWF0aCB0byB3b3JrIHByb3Blcmx5IGluIGluZGljZXMsIGJ1dCBpdAotJSBzZWVtcyB1bmxpa2VseSBpdCB3aWxsIGV2ZXIgYmUgbmVlZGVkIHRoZXJlLgotJQotXGxldFxpbXBsaWNpdG1hdGggPSAkCi1cZGVmXG1hdGgjMXtcaW1wbGljaXRtYXRoICMxXGltcGxpY2l0bWF0aH0KLQotJSBAYnVsbGV0IGFuZCBAbWludXMgbmVlZCB0aGUgc2FtZSB0cmVhdG1lbnQgYXMgQG1hdGgsIGp1c3QgYWJvdmUuCi1cZGVmXGJ1bGxldHtcaW1wbGljaXRtYXRoXHB0ZXhidWxsZXRcaW1wbGljaXRtYXRofQotXGRlZlxtaW51c3tcaW1wbGljaXRtYXRoLVxpbXBsaWNpdG1hdGh9Ci0KLSUgQHJlZmlsbCBpcyBhIG5vLW9wLgotXGxldFxyZWZpbGw9XHJlbGF4Ci0KLSUgSWYgd29ya2luZyBvbiBhIGxhcmdlIGRvY3VtZW50IGluIGNoYXB0ZXJzLCBpdCBpcyBjb252ZW5pZW50IHRvCi0lIGJlIGFibGUgdG8gZGlzYWJsZSBpbmRleGluZywgY3Jvc3MtcmVmZXJlbmNpbmcsIGFuZCBjb250ZW50cywgZm9yIHRlc3QgcnVucy4KLSUgVGhpcyBpcyBkb25lIHdpdGggQG5vdmFsaWRhdGUgKGJlZm9yZSBAc2V0ZmlsZW5hbWUpLgotJQotXG5ld2lmXGlmbGlua3MgXGxpbmtzdHJ1ZSAlIGJ5IGRlZmF1bHQgd2Ugd2FudCB0aGUgYXV4IGZpbGVzLgotXGxldFxub3ZhbGlkYXRlID0gXGxpbmtzZmFsc2UKLQotJSBAc2V0ZmlsZW5hbWUgaXMgZG9uZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IHRleGluZm8gZmlsZS4KLSUgU28gb3BlbiBoZXJlIHRoZSBmaWxlcyB3ZSBuZWVkIHRvIGhhdmUgb3BlbiB3aGlsZSByZWFkaW5nIHRoZSBpbnB1dC4KLSUgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBtYWtlIGEgLmZtdCBmaWxlIGZvciB0ZXhpbmZvLgotXGRlZlxzZXRmaWxlbmFtZXslCi0gICBcaWZsaW5rcyAKLSAgICAgXHJlYWRhdXhmaWxlCi0gICBcZmkgJSBcb3BlbmluZGljZXMgbmVlZHMgdG8gZG8gc29tZSB3b3JrIGluIGFueSBjYXNlLgotICAgXG9wZW5pbmRpY2VzCi0gICBcZml4YmFja3NsYXNoICAlIFR1cm4gb2ZmIGhhY2sgdG8gc3dhbGxvdyBgXGlucHV0IHRleGluZm8nLgotICAgXGdsb2JhbFxsZXRcc2V0ZmlsZW5hbWU9XGNvbW1lbnQgJSBJZ25vcmUgZXh0cmEgQHNldGZpbGVuYW1lIGNtZHMuCi0gICAlCi0gICAlIElmIHRleGluZm8uY25mIGlzIHByZXNlbnQgb24gdGhlIHN5c3RlbSwgcmVhZCBpdC4KLSAgICUgVXNlZnVsIGZvciBzaXRlLXdpZGUgQGFmb3VycGFwZXIsIGV0Yy4KLSAgICUgSnVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlLCBjbG9zZSB0aGUgaW5wdXQgc3RyZWFtIGJlZm9yZSB0aGUgXGlucHV0LgotICAgXG9wZW5pbiAxIHRleGluZm8uY25mCi0gICBcaWZlb2YxIFxsZXRcdGVtcD1ccmVsYXggXGVsc2UgXGRlZlx0ZW1we1xpbnB1dCB0ZXhpbmZvLmNuZiB9XGZpCi0gICBcY2xvc2VpbjEKLSAgIFx0ZW1wCi0gICAlCi0gICBcY29tbWVudCAlIElnbm9yZSB0aGUgYWN0dWFsIGZpbGVuYW1lLgotfQotCi0lIENhbGxlZCBmcm9tIFxzZXRmaWxlbmFtZS4KLSUgCi1cZGVmXG9wZW5pbmRpY2VzeyUKLSAgXG5ld2luZGV4e2NwfSUKLSAgXG5ld2NvZGVpbmRleHtmbn0lCi0gIFxuZXdjb2RlaW5kZXh7dnJ9JQotICBcbmV3Y29kZWluZGV4e3RwfSUKLSAgXG5ld2NvZGVpbmRleHtreX0lCi0gIFxuZXdjb2RlaW5kZXh7cGd9JQotfQotCi0lIEBieWUuCi1cb3V0ZXJcZGVmXGJ5ZXtccGFnZWFsaWdubWFjcm9cdHJhY2luZ3N0YXRzPTFccHRleGVuZH0KLQotCi1cbWVzc2FnZXtmb250cyx9Ci0lIEZvbnQtY2hhbmdlIGNvbW1hbmRzLgotCi0lIFRleGluZm8gc29ydCBvZiBzdXBwb3J0cyB0aGUgc2FucyBzZXJpZiBmb250IHN0eWxlLCB3aGljaCBwbGFpbiBUZVggZG9lcyBub3QuCi0lIFNvIHdlIHNldCB1cCBhIFxzZiBhbmFsb2dvdXMgdG8gcGxhaW4ncyBccm0sIGV0Yy4KLVxuZXdmYW1cc2ZmYW0KLVxkZWZcc2Z7XGZhbT1cc2ZmYW0gXHRlbnNmfQotXGxldFxsaSA9IFxzZiAlIFNvbWV0aW1lcyB3ZSBjYWxsIGl0IFxsaSwgbm90IFxzZi4KLQotJSBXZSBkb24ndCBuZWVkIG1hdGggZm9yIHRoaXMgb25lLgotXGRlZlx0dHNse1x0ZW50dHNsfQotCi0lIFVzZSBDb21wdXRlciBNb2Rlcm4gZm9udHMgYXQgXG1hZ3N0ZXBoYWxmICgxMXB0KS4KLVxuZXdjb3VudFxtYWlubWFnc3RlcAotXG1haW5tYWdzdGVwPVxtYWdzdGVwaGFsZgotCi0lIFNldCB0aGUgZm9udCBtYWNybyAjMSB0byB0aGUgZm9udCBuYW1lZCAjMiwgYWRkaW5nIG9uIHRoZQotJSBzcGVjaWZpZWQgZm9udCBwcmVmaXggKG5vcm1hbGx5IGBjbScpLgotJSAjMyBpcyB0aGUgZm9udCdzIGRlc2lnbiBzaXplLCAjNCBpcyBhIHNjYWxlIGZhY3RvcgotXGRlZlxzZXRmb250IzEjMiMzIzR7XGZvbnQjMT1cZm9udHByZWZpeCMyIzMgc2NhbGVkICM0fQotCi0lIFVzZSBjbSBhcyB0aGUgZGVmYXVsdCBmb250IHByZWZpeC4KLSUgVG8gc3BlY2lmeSB0aGUgZm9udCBwcmVmaXgsIHlvdSBtdXN0IGRlZmluZSBcZm9udHByZWZpeAotJSBiZWZvcmUgeW91IHJlYWQgaW4gdGV4aW5mby50ZXguCi1caWZ4XGZvbnRwcmVmaXhcdW5kZWZpbmVkCi1cZGVmXGZvbnRwcmVmaXh7Y219Ci1cZmkKLSUgU3VwcG9ydCBmb250IGZhbWlsaWVzIHRoYXQgZG9uJ3QgdXNlIHRoZSBzYW1lIG5hbWluZyBzY2hlbWUgYXMgQ00uCi1cZGVmXHJtc2hhcGV7cn0KLVxkZWZccm1ic2hhcGV7Ynh9ICAgICAgICAgICAgICAgJXdoZXJlIHRoZSBub3JtYWwgZmFjZSBpcyBib2xkCi1cZGVmXGJmc2hhcGV7Yn0KLVxkZWZcYnhzaGFwZXtieH0KLVxkZWZcdHRzaGFwZXt0dH0KLVxkZWZcdHRic2hhcGV7dHR9Ci1cZGVmXHR0c2xzaGFwZXtzbHR0fQotXGRlZlxpdHNoYXBle3RpfQotXGRlZlxpdGJzaGFwZXtieHRpfQotXGRlZlxzbHNoYXBle3NsfQotXGRlZlxzbGJzaGFwZXtieHNsfQotXGRlZlxzZnNoYXBle3NzfQotXGRlZlxzZmJzaGFwZXtzc30KLVxkZWZcc2NzaGFwZXtjc2N9Ci1cZGVmXHNjYnNoYXBle2NzY30KLQotXGlmeFxiaWdnZXJccmVsYXgKLVxsZXRcbWFpbm1hZ3N0ZXA9XG1hZ3N0ZXAxCi1cc2V0Zm9udFx0ZXh0cm1ccm1zaGFwZXsxMn17MTAwMH0KLVxzZXRmb250XHRleHR0dFx0dHNoYXBlezEyfXsxMDAwfQotXGVsc2UKLVxzZXRmb250XHRleHRybVxybXNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0dHRcdHRzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXGZpCi0lIEluc3RlYWQgb2YgY21iMTAsIHlvdSBtYW55IHdhbnQgdG8gdXNlIGNtYngxMC4KLSUgY21ieDEwIGlzIGEgcHJldHRpZXIgZm9udCBvbiBpdHMgb3duLCBidXQgY21iMTAKLSUgbG9va3MgYmV0dGVyIHdoZW4gZW1iZWRkZWQgaW4gYSBsaW5lIHdpdGggY21yMTAuCi1cc2V0Zm9udFx0ZXh0YmZcYmZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dGl0XGl0c2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHRzbFxzbHNoYXBlezEwfXtcbWFpbm1hZ3N0ZXB9Ci1cc2V0Zm9udFx0ZXh0c2Zcc2ZzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXHNldGZvbnRcdGV4dHNjXHNjc2hhcGV7MTB9e1xtYWlubWFnc3RlcH0KLVxzZXRmb250XHRleHR0dHNsXHR0c2xzaGFwZXsxMH17XG1haW5tYWdzdGVwfQotXGZvbnRcdGV4dGk9Y21taTEwIHNjYWxlZCBcbWFpbm1hZ3N0ZXAKLVxmb250XHRleHRzeT1jbXN5MTAgc2NhbGVkIFxtYWlubWFnc3RlcAotCi0lIEEgZmV3IGZvbnRzIGZvciBAZGVmdW4sIGV0Yy4KLVxzZXRmb250XGRlZmJmXGJ4c2hhcGV7MTB9e1xtYWdzdGVwMX0gJXdhcyAxMzE0Ci1cc2V0Zm9udFxkZWZ0dFx0dHNoYXBlezEwfXtcbWFnc3RlcDF9Ci1cZGVmXGRme1xsZXRcdGVudHQ9XGRlZnR0IFxsZXRcdGVuYmYgPSBcZGVmYmYgXGJmfQotCi0lIEZvbnRzIGZvciBpbmRpY2VzIGFuZCBzbWFsbCBleGFtcGxlcyAoOXB0KS4KLSUgV2UgYWN0dWFsbHkgdXNlIHRoZSBzbGFudGVkIGZvbnQgcmF0aGVyIHRoYW4gdGhlIGl0YWxpYywKLSUgYmVjYXVzZSB0ZXhpbmZvIG5vcm1hbGx5IHVzZXMgdGhlIHNsYW50ZWQgZm9udHMgZm9yIHRoYXQuCi0lIERvIG5vdCBtYWtlIG1hbnkgZm9udCBkaXN0aW5jdGlvbnMgaW4gZ2VuZXJhbCBpbiB0aGUgaW5kZXgsIHNpbmNlIHRoZXkKLSUgYXJlbid0IHZlcnkgdXNlZnVsLgotXHNldGZvbnRcbmluZXR0XHR0c2hhcGV7OX17MTAwMH0KLVxzZXRmb250XG5pbmV0dHNsXHR0c2xzaGFwZXsxMH17OTAwfQotXHNldGZvbnRcaW5kcm1ccm1zaGFwZXs5fXsxMDAwfQotXHNldGZvbnRcaW5kaXRcaXRzaGFwZXs5fXsxMDAwfQotXHNldGZvbnRcaW5kc2xcc2xzaGFwZXs5fXsxMDAwfQotXGxldFxpbmR0dD1cbmluZXR0Ci1cbGV0XGluZHR0c2w9XG5pbmV0dHNsCi1cbGV0XGluZHNmPVxpbmRybQotXGxldFxpbmRiZj1caW5kcm0KLVxzZXRmb250XGluZHNjXHNjc2hhcGV7MTB9ezkwMH0KLVxmb250XGluZGk9Y21taTkKLVxmb250XGluZHN5PWNtc3k5Ci0KLSUgRm9udHMgZm9yIHRpdGxlIHBhZ2U6Ci1cc2V0Zm9udFx0aXRsZXJtXHJtYnNoYXBlezEyfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFx0aXRsZWl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDR9Ci1cc2V0Zm9udFx0aXRsZXNsXHNsYnNoYXBlezEwfXtcbWFnc3RlcDR9Ci1cc2V0Zm9udFx0aXRsZXR0XHR0YnNoYXBlezEyfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFx0aXRsZXR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDR9Ci1cc2V0Zm9udFx0aXRsZXNmXHNmYnNoYXBlezE3fXtcbWFnc3RlcDF9Ci1cbGV0XHRpdGxlYmY9XHRpdGxlcm0KLVxzZXRmb250XHRpdGxlc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwNH0KLVxmb250XHRpdGxlaT1jbW1pMTIgc2NhbGVkIFxtYWdzdGVwMwotXGZvbnRcdGl0bGVzeT1jbXN5MTAgc2NhbGVkIFxtYWdzdGVwNAotXGRlZlxhdXRob3JybXtcc2Vjcm19Ci0KLSUgQ2hhcHRlciAoYW5kIHVubnVtYmVyZWQpIGZvbnRzICgxNy4yOHB0KS4KLVxzZXRmb250XGNoYXBybVxybWJzaGFwZXsxMn17XG1hZ3N0ZXAyfQotXHNldGZvbnRcY2hhcGl0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFxjaGFwc2xcc2xic2hhcGV7MTB9e1xtYWdzdGVwM30KLVxzZXRmb250XGNoYXB0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXAyfQotXHNldGZvbnRcY2hhcHR0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDN9Ci1cc2V0Zm9udFxjaGFwc2Zcc2Zic2hhcGV7MTd9ezEwMDB9Ci1cbGV0XGNoYXBiZj1cY2hhcHJtCi1cc2V0Zm9udFxjaGFwc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwM30KLVxmb250XGNoYXBpPWNtbWkxMiBzY2FsZWQgXG1hZ3N0ZXAyCi1cZm9udFxjaGFwc3k9Y21zeTEwIHNjYWxlZCBcbWFnc3RlcDMKLQotJSBTZWN0aW9uIGZvbnRzICgxNC40cHQpLgotXHNldGZvbnRcc2Vjcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwMX0KLVxzZXRmb250XHNlY2l0XGl0YnNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxzZWNzbFxzbGJzaGFwZXsxMH17XG1hZ3N0ZXAyfQotXHNldGZvbnRcc2VjdHRcdHRic2hhcGV7MTJ9e1xtYWdzdGVwMX0KLVxzZXRmb250XHNlY3R0c2xcdHRzbHNoYXBlezEwfXtcbWFnc3RlcDJ9Ci1cc2V0Zm9udFxzZWNzZlxzZmJzaGFwZXsxMn17XG1hZ3N0ZXAxfQotXGxldFxzZWNiZlxzZWNybQotXHNldGZvbnRcc2Vjc2Ncc2Nic2hhcGV7MTB9e1xtYWdzdGVwMn0KLVxmb250XHNlY2k9Y21taTEyIHNjYWxlZCBcbWFnc3RlcDEKLVxmb250XHNlY3N5PWNtc3kxMCBzY2FsZWQgXG1hZ3N0ZXAyCi0KLSUgXHNldGZvbnRcc3NlY3JtXGJ4c2hhcGV7MTB9e1xtYWdzdGVwMX0gICAgJSBUaGlzIHNpemUgYW4gZm9udCBsb29rZWQgYmFkLgotJSBcc2V0Zm9udFxzc2VjaXRcaXRzaGFwZXsxMH17XG1hZ3N0ZXAxfSAgICAlIFRoZSBsZXR0ZXJzIHdlcmUgdG9vIGNyb3dkZWQuCi0lIFxzZXRmb250XHNzZWNzbFxzbHNoYXBlezEwfXtcbWFnc3RlcDF9Ci0lIFxzZXRmb250XHNzZWN0dFx0dHNoYXBlezEwfXtcbWFnc3RlcDF9Ci0lIFxzZXRmb250XHNzZWNzZlxzZnNoYXBlezEwfXtcbWFnc3RlcDF9Ci0KLSVcc2V0Zm9udFxzc2Vjcm1cYmZzaGFwZXsxMH17MTMxNX0gICAgICAlIE5vdGUgdGhlIHVzZSBvZiBjbWIgcmF0aGVyIHRoYW4gY21ieC4KLSVcc2V0Zm9udFxzc2VjaXRcaXRzaGFwZXsxMH17MTMxNX0gICAgICAlIEFsc28sIHRoZSBzaXplIGlzIGEgbGl0dGxlIGxhcmdlciB0aGFuCi0lXHNldGZvbnRcc3NlY3NsXHNsc2hhcGV7MTB9ezEzMTV9ICAgICAgJSBiZWluZyBzY2FsZWQgbWFnc3RlcDEuCi0lXHNldGZvbnRcc3NlY3R0XHR0c2hhcGV7MTB9ezEzMTV9Ci0lXHNldGZvbnRcc3NlY3NmXHNmc2hhcGV7MTB9ezEzMTV9Ci0KLSVcbGV0XHNzZWNiZj1cc3NlY3JtCi0KLSUgU3Vic2VjdGlvbiBmb250cyAoMTMuMTVwdCkuCi1cc2V0Zm9udFxzc2Vjcm1ccm1ic2hhcGV7MTJ9e1xtYWdzdGVwaGFsZn0KLVxzZXRmb250XHNzZWNpdFxpdGJzaGFwZXsxMH17MTMxNX0KLVxzZXRmb250XHNzZWNzbFxzbGJzaGFwZXsxMH17MTMxNX0KLVxzZXRmb250XHNzZWN0dFx0dGJzaGFwZXsxMn17XG1hZ3N0ZXBoYWxmfQotXHNldGZvbnRcc3NlY3R0c2xcdHRzbHNoYXBlezEwfXsxMzE1fQotXHNldGZvbnRcc3NlY3NmXHNmYnNoYXBlezEyfXtcbWFnc3RlcGhhbGZ9Ci1cbGV0XHNzZWNiZlxzc2Vjcm0KLVxzZXRmb250XHNzZWNzY1xzY2JzaGFwZXsxMH17XG1hZ3N0ZXAxfQotXGZvbnRcc3NlY2k9Y21taTEyIHNjYWxlZCBcbWFnc3RlcGhhbGYKLVxmb250XHNzZWNzeT1jbXN5MTAgc2NhbGVkIDEzMTUKLSUgVGhlIHNtYWxsY2FwcyBhbmQgc3ltYm9sIGZvbnRzIHNob3VsZCBhY3R1YWxseSBiZSBzY2FsZWQgXG1hZ3N0ZXAxLjUsCi0lIGJ1dCB0aGF0IGlzIG5vdCBhIHN0YW5kYXJkIG1hZ25pZmljYXRpb24uCi0KLSUgSW4gb3JkZXIgZm9yIHRoZSBmb250IGNoYW5nZXMgdG8gYWZmZWN0IG1vc3QgbWF0aCBzeW1ib2xzIGFuZCBsZXR0ZXJzLAotJSB3ZSBoYXZlIHRvIGRlZmluZSB0aGUgXHRleHRmb250IG9mIHRoZSBzdGFuZGFyZCBmYW1pbGllcy4gIFNpbmNlCi0lIHRleGluZm8gZG9lc24ndCBhbGxvdyBmb3IgcHJvZHVjaW5nIHN1YnNjcmlwdHMgYW5kIHN1cGVyc2NyaXB0cywgd2UKLSUgZG9uJ3QgYm90aGVyIHRvIHJlc2V0IFxzY3JpcHRmb250IGFuZCBcc2NyaXB0c2NyaXB0Zm9udCAod2hpY2ggd291bGQKLSUgYWxzbyByZXF1aXJlIGxvYWRpbmcgYSBsb3QgbW9yZSBmb250cykuCi0lCi1cZGVmXHJlc2V0bWF0aGZvbnRzeyUKLSAgXHRleHRmb250MCA9IFx0ZW5ybSBcdGV4dGZvbnQxID0gXHRlbmkgXHRleHRmb250MiA9IFx0ZW5zeQotICBcdGV4dGZvbnRcaXRmYW0gPSBcdGVuaXQgXHRleHRmb250XHNsZmFtID0gXHRlbnNsIFx0ZXh0Zm9udFxiZmZhbSA9IFx0ZW5iZgotICBcdGV4dGZvbnRcdHRmYW0gPSBcdGVudHQgXHRleHRmb250XHNmZmFtID0gXHRlbnNmCi19Ci0KLQotJSBUaGUgZm9udC1jaGFuZ2luZyBjb21tYW5kcyByZWRlZmluZSB0aGUgbWVhbmluZ3Mgb2YgXHRlblNUWUxFLCBpbnN0ZWFkCi0lIG9mIGp1c3QgXFNUWUxFLiAgV2UgZG8gdGhpcyBzbyB0aGF0IGZvbnQgY2hhbmdlcyB3aWxsIGNvbnRpbnVlIHRvIHdvcmsKLSUgaW4gbWF0aCBtb2RlLCB3aGVyZSBpdCBpcyB0aGUgY3VycmVudCBcZmFtIHRoYXQgaXMgcmVsZXZhbnQgaW4gbW9zdAotJSBjYXNlcywgbm90IHRoZSBjdXJyZW50IGZvbnQuICBQbGFpbiBUZVggZG9lcyBcZGVmXGJme1xmYW09XGJmZmFtCi0lIFx0ZW5iZn0sIGZvciBleGFtcGxlLiAgQnkgcmVkZWZpbmluZyBcdGVuYmYsIHdlIG9idmlhdGUgdGhlIG5lZWQgdG8KLSUgcmVkZWZpbmUgXGJmIGl0c2VsZi4KLVxkZWZcdGV4dGZvbnRzeyUKLSAgXGxldFx0ZW5ybT1cdGV4dHJtIFxsZXRcdGVuaXQ9XHRleHRpdCBcbGV0XHRlbnNsPVx0ZXh0c2wKLSAgXGxldFx0ZW5iZj1cdGV4dGJmIFxsZXRcdGVudHQ9XHRleHR0dCBcbGV0XHNtYWxsY2Fwcz1cdGV4dHNjCi0gIFxsZXRcdGVuc2Y9XHRleHRzZiBcbGV0XHRlbmk9XHRleHRpIFxsZXRcdGVuc3k9XHRleHRzeSBcbGV0XHRlbnR0c2w9XHRleHR0dHNsCi0gIFxyZXNldG1hdGhmb250c30KLVxkZWZcdGl0bGVmb250c3slCi0gIFxsZXRcdGVucm09XHRpdGxlcm0gXGxldFx0ZW5pdD1cdGl0bGVpdCBcbGV0XHRlbnNsPVx0aXRsZXNsCi0gIFxsZXRcdGVuYmY9XHRpdGxlYmYgXGxldFx0ZW50dD1cdGl0bGV0dCBcbGV0XHNtYWxsY2Fwcz1cdGl0bGVzYwotICBcbGV0XHRlbnNmPVx0aXRsZXNmIFxsZXRcdGVuaT1cdGl0bGVpIFxsZXRcdGVuc3k9XHRpdGxlc3kKLSAgXGxldFx0ZW50dHNsPVx0aXRsZXR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezI1cHR9fQotXGRlZlx0aXRsZWZvbnQjMXt7XHRpdGxlZm9udHNccm0gIzF9fQotXGRlZlxjaGFwZm9udHN7JQotICBcbGV0XHRlbnJtPVxjaGFwcm0gXGxldFx0ZW5pdD1cY2hhcGl0IFxsZXRcdGVuc2w9XGNoYXBzbAotICBcbGV0XHRlbmJmPVxjaGFwYmYgXGxldFx0ZW50dD1cY2hhcHR0IFxsZXRcc21hbGxjYXBzPVxjaGFwc2MKLSAgXGxldFx0ZW5zZj1cY2hhcHNmIFxsZXRcdGVuaT1cY2hhcGkgXGxldFx0ZW5zeT1cY2hhcHN5IFxsZXRcdGVudHRzbD1cY2hhcHR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE5cHR9fQotXGRlZlxzZWNmb250c3slCi0gIFxsZXRcdGVucm09XHNlY3JtIFxsZXRcdGVuaXQ9XHNlY2l0IFxsZXRcdGVuc2w9XHNlY3NsCi0gIFxsZXRcdGVuYmY9XHNlY2JmIFxsZXRcdGVudHQ9XHNlY3R0IFxsZXRcc21hbGxjYXBzPVxzZWNzYwotICBcbGV0XHRlbnNmPVxzZWNzZiBcbGV0XHRlbmk9XHNlY2kgXGxldFx0ZW5zeT1cc2Vjc3kgXGxldFx0ZW50dHNsPVxzZWN0dHNsCi0gIFxyZXNldG1hdGhmb250cyBcc2V0bGVhZGluZ3sxNnB0fX0KLVxkZWZcc3Vic2VjZm9udHN7JQotICBcbGV0XHRlbnJtPVxzc2Vjcm0gXGxldFx0ZW5pdD1cc3NlY2l0IFxsZXRcdGVuc2w9XHNzZWNzbAotICBcbGV0XHRlbmJmPVxzc2VjYmYgXGxldFx0ZW50dD1cc3NlY3R0IFxsZXRcc21hbGxjYXBzPVxzc2Vjc2MKLSAgXGxldFx0ZW5zZj1cc3NlY3NmIFxsZXRcdGVuaT1cc3NlY2kgXGxldFx0ZW5zeT1cc3NlY3N5IFxsZXRcdGVudHRzbD1cc3NlY3R0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezE1cHR9fQotXGxldFxzdWJzdWJzZWNmb250cyA9IFxzdWJzZWNmb250cyAlIE1heWJlIG1ha2Ugc3NzZWMgZm9udHMgc2NhbGVkIG1hZ3N0ZXBoYWxmPwotXGRlZlxpbmRleGZvbnRzeyUKLSAgXGxldFx0ZW5ybT1caW5kcm0gXGxldFx0ZW5pdD1caW5kaXQgXGxldFx0ZW5zbD1caW5kc2wKLSAgXGxldFx0ZW5iZj1caW5kYmYgXGxldFx0ZW50dD1caW5kdHQgXGxldFxzbWFsbGNhcHM9XGluZHNjCi0gIFxsZXRcdGVuc2Y9XGluZHNmIFxsZXRcdGVuaT1caW5kaSBcbGV0XHRlbnN5PVxpbmRzeSBcbGV0XHRlbnR0c2w9XGluZHR0c2wKLSAgXHJlc2V0bWF0aGZvbnRzIFxzZXRsZWFkaW5nezEycHR9fQotCi0lIFNldCB1cCB0aGUgZGVmYXVsdCBmb250cywgc28gd2UgY2FuIHVzZSB0aGVtIGZvciBjcmVhdGluZyBib3hlcy4KLSUKLVx0ZXh0Zm9udHMKLQotJSBEZWZpbmUgdGhlc2Ugc28gdGhleSBjYW4gYmUgZWFzaWx5IGNoYW5nZWQgZm9yIG90aGVyIGZvbnRzLgotXGRlZlxhbmdsZWxlZnR7JFxsYW5nbGUkfQotXGRlZlxhbmdsZXJpZ2h0eyRccmFuZ2xlJH0KLQotJSBDb3VudCBkZXB0aCBpbiBmb250LWNoYW5nZXMsIGZvciBlcnJvciBjaGVja3MKLVxuZXdjb3VudFxmb250ZGVwdGggXGZvbnRkZXB0aD0wCi0KLSUgRm9udHMgZm9yIHNob3J0IHRhYmxlIG9mIGNvbnRlbnRzLgotXHNldGZvbnRcc2hvcnRjb250cm1ccm1zaGFwZXsxMn17MTAwMH0KLVxzZXRmb250XHNob3J0Y29udGJmXGJ4c2hhcGV7MTJ9ezEwMDB9Ci1cc2V0Zm9udFxzaG9ydGNvbnRzbFxzbHNoYXBlezEyfXsxMDAwfQotCi0lJSBBZGQgc2NyaWJlLWxpa2UgZm9udCBlbnZpcm9ubWVudHMsIHBsdXMgQGwgZm9yIGlubGluZSBsaXNwICh1c3VhbGx5IHNhbnMKLSUlIHNlcmlmKSBhbmQgQGlpIGZvciBUZVggaXRhbGljCi0KLSUgXHNtYXJ0aXRhbGlje0FSR30gb3V0cHV0cyBhcmcgaW4gaXRhbGljcywgZm9sbG93ZWQgYnkgYW4gaXRhbGljIGNvcnJlY3Rpb24KLSUgdW5sZXNzIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzIHN1Y2ggYXMgbm90IHRvIG5lZWQgb25lLgotXGRlZlxzbWFydGl0YWxpY3h7XGlmeFxuZXh0LFxlbHNlXGlmeFxuZXh0LVxlbHNlXGlmeFxuZXh0LlxlbHNlXC9cZmlcZmlcZml9Ci1cZGVmXHNtYXJ0c2xhbnRlZCMxe3tcc2wgIzF9XGZ1dHVyZWxldFxuZXh0XHNtYXJ0aXRhbGljeH0KLVxkZWZcc21hcnRpdGFsaWMjMXt7XGl0ICMxfVxmdXR1cmVsZXRcbmV4dFxzbWFydGl0YWxpY3h9Ci0KLVxsZXRcaT1cc21hcnRpdGFsaWMKLVxsZXRcdmFyPVxzbWFydHNsYW50ZWQKLVxsZXRcZGZuPVxzbWFydHNsYW50ZWQKLVxsZXRcZW1waD1cc21hcnRpdGFsaWMKLVxsZXRcY2l0ZT1cc21hcnRzbGFudGVkCi0KLVxkZWZcYiMxe3tcYmYgIzF9fQotXGxldFxzdHJvbmc9XGIKLQotJSBXZSBjYW4ndCBqdXN0IHVzZSBcZXhoeXBoZW5wZW5hbHR5LCBiZWNhdXNlIHRoYXQgb25seSBoYXMgZWZmZWN0IGF0Ci0lIHRoZSBlbmQgb2YgYSBwYXJhZ3JhcGguICBSZXN0b3JlIG5vcm1hbCBoeXBoZW5hdGlvbiBhdCB0aGUgZW5kIG9mIHRoZQotJSBncm91cCB3aXRoaW4gd2hpY2ggXG5vaHlwaGVuYXRpb24gaXMgcHJlc3VtYWJseSBjYWxsZWQuCi0lCi1cZGVmXG5vaHlwaGVuYXRpb257XGh5cGhlbmNoYXJcZm9udCA9IC0xICBcYWZ0ZXJncm91cFxyZXN0b3JlaHlwaGVuYXRpb259Ci1cZGVmXHJlc3RvcmVoeXBoZW5hdGlvbntcaHlwaGVuY2hhclxmb250ID0gYC0gfQotCi1cZGVmXHQjMXslCi0gIHtcdHQgXHJhd2JhY2tzbGFzaCBcZnJlbmNoc3BhY2luZyAjMX0lCi0gIFxudWxsCi19Ci1cbGV0XHR0Zm9udD1cdAotXGRlZlxzYW1wIzF7YFx0Y2xvc2V7IzF9J1xudWxsfQotXHNldGZvbnRcc21hbGxybVxybXNoYXBlezh9ezEwMDB9Ci1cZm9udFxzbWFsbHN5PWNtc3k5Ci1cZGVmXGtleSMxe3tcc21hbGxybVx0ZXh0Zm9udDI9XHNtYWxsc3kgXGxlYXZldm1vZGVcaGJveHslCi0gIFxyYWlzZTAuNHB0XGhib3h7XGFuZ2xlbGVmdH1ca2Vybi0uMDhlbVx2dG9weyUKLSAgICBcdmJveHtcaHJ1bGVca2Vybi0wLjRwdAotICAgICBcaGJveHtccmFpc2UwLjRwdFxoYm94e1x2cGhhbnRvbXtcYW5nbGVsZWZ0fX0jMX19JQotICAgIFxrZXJuLTAuNHB0XGhydWxlfSUKLSAgXGtlcm4tLjA2ZW1ccmFpc2UwLjRwdFxoYm94e1xhbmdsZXJpZ2h0fX19fQotJSBUaGUgb2xkIGRlZmluaXRpb24sIHdpdGggbm8gbG96ZW5nZToKLSVcZGVmXGtleSAjMXt7XHR0c2wgXG5vaHlwaGVuYXRpb24gXHVwcGVyY2FzZXsjMX19XG51bGx9Ci1cZGVmXGN0cmwgIzF7e1x0dCBccmF3YmFja3NsYXNoIFxoYXR9IzF9Ci0KLSUgQGZpbGUsIEBvcHRpb24gYXJlIHRoZSBzYW1lIGFzIEBzYW1wLgotXGxldFxmaWxlPVxzYW1wCi1cbGV0XG9wdGlvbj1cc2FtcAotCi0lIEBjb2RlIGlzIGEgbW9kaWZpY2F0aW9uIG9mIEB0LAotJSB3aGljaCBtYWtlcyBzcGFjZXMgdGhlIHNhbWUgc2l6ZSBhcyBub3JtYWwgaW4gdGhlIHN1cnJvdW5kaW5nIHRleHQuCi1cZGVmXHRjbG9zZSMxeyUKLSAgeyUKLSAgICAlIENoYW5nZSBub3JtYWwgaW50ZXJ3b3JkIHNwYWNlIHRvIGJlIHNhbWUgYXMgZm9yIHRoZSBjdXJyZW50IGZvbnQuCi0gICAgXHNwYWNlc2tpcCA9IFxmb250ZGltZW4yXGZvbnQKLSAgICAlCi0gICAgJSBTd2l0Y2ggdG8gdHlwZXdyaXRlci4KLSAgICBcdHQKLSAgICAlCi0gICAgJSBCdXQgYFwgJyBwcm9kdWNlcyB0aGUgbGFyZ2UgdHlwZXdyaXRlciBpbnRlcndvcmQgc3BhY2UuCi0gICAgXGRlZlwge3tcc3BhY2Vza2lwID0gMHB0e30gfX0lCi0gICAgJQotICAgICUgVHVybiBvZmYgaHlwaGVuYXRpb24uCi0gICAgXG5vaHlwaGVuYXRpb24KLSAgICAlCi0gICAgXHJhd2JhY2tzbGFzaAotICAgIFxmcmVuY2hzcGFjaW5nCi0gICAgIzElCi0gIH0lCi0gIFxudWxsCi19Ci0KLSUgV2UgKm11c3QqIHR1cm4gb24gaHlwaGVuYXRpb24gYXQgYC0nIGFuZCBgXycgaW4gXGNvZGUuCi0lIE90aGVyd2lzZSwgaXQgaXMgdG9vIGhhcmQgdG8gYXZvaWQgb3ZlcmZ1bGwgaGJveGVzCi0lIGluIHRoZSBFbWFjcyBtYW51YWwsIHRoZSBMaWJyYXJ5IG1hbnVhbCwgZXRjLgotCi0lIFVuZm9ydHVuYXRlbHksIFRlWCB1c2VzIG9uZSBwYXJhbWV0ZXIgKFxoeXBoZW5jaGFyKSB0byBjb250cm9sCi0lIGJvdGggaHlwaGVuYXRpb24gYXQgLSBhbmQgaHlwaGVuYXRpb24gd2l0aGluIHdvcmRzLgotJSBXZSBtdXN0IHRoZXJlZm9yZSB0dXJuIHRoZW0gYm90aCBvZmYgKFx0Y2xvc2UgZG9lcyB0aGF0KQotJSBhbmQgYXJyYW5nZSBleHBsaWNpdGx5IHRvIGh5cGhlbmF0ZSBhdCBhIGRhc2guCi0lICAtLSBybXMuCi17Ci0gIFxjYXRjb2RlYFwtPVxhY3RpdmUKLSAgXGNhdGNvZGVgXF89XGFjdGl2ZQotICAlCi0gIFxnbG9iYWxcZGVmXGNvZGV7XGJlZ2luZ3JvdXAKLSAgICBcY2F0Y29kZWBcLT1cYWN0aXZlIFxsZXQtXGNvZGVkYXNoCi0gICAgXGNhdGNvZGVgXF89XGFjdGl2ZSBcbGV0X1xjb2RldW5kZXIKLSAgICBcY29kZXgKLSAgfQotICAlCi0gICUgSWYgd2UgZW5kIHVwIHdpdGggYW55IGFjdGl2ZSAtIGNoYXJhY3RlcnMgd2hlbiBoYW5kbGluZyB0aGUgaW5kZXgsCi0gICUganVzdCB0cmVhdCB0aGVtIGFzIGEgbm9ybWFsIC0uCi0gIFxnbG9iYWxcZGVmXGluZGV4YnJlYWtze1xjYXRjb2RlYFwtPVxhY3RpdmUgXGxldC1ccmVhbGRhc2h9Ci19Ci0KLVxkZWZccmVhbGRhc2h7LX0KLVxkZWZcY29kZWRhc2h7LVxkaXNjcmV0aW9uYXJ5e317fXt9fQotXGRlZlxjb2RldW5kZXJ7XGlmdXNpbmd0dHtcbm9ybWFsdW5kZXJzY29yZVxkaXNjcmV0aW9uYXJ5e317fXt9fXtcX319Ci1cZGVmXGNvZGV4ICMxe1x0Y2xvc2V7IzF9XGVuZGdyb3VwfQotCi0lXGxldFxleHA9XHRjbG9zZSAgJVdhcyB0ZW1wb3JhcnkKLQotJSBAa2JkIGlzIGxpa2UgQGNvZGUsIGV4Y2VwdCB0aGF0IGlmIHRoZSBhcmd1bWVudCBpcyBqdXN0IG9uZSBAa2V5IGNvbW1hbmQsCi0lIHRoZW4gQGtiZCBoYXMgbm8gZWZmZWN0LgotCi0lIEBrYmRpbnB1dHN0eWxlIC0tIGFyZyBpcyBgZGlzdGluY3QnIChAa2JkIHVzZXMgc2xhbnRlZCB0dHkgZm9udCBhbHdheXMpLAotJSAgIGBleGFtcGxlJyAoQGtiZCB1c2VzIHR0c2wgb25seSBpbnNpZGUgb2YgQGV4YW1wbGUgYW5kIGZyaWVuZHMpLAotJSAgIG9yIGBjb2RlJyAoQGtiZCB1c2VzIG5vcm1hbCB0dHkgZm9udCBhbHdheXMpLgotXGRlZlxrYmRpbnB1dHN0eWxle1xwYXJzZWFyZ1xrYmRpbnB1dHN0eWxleHh4fQotXGRlZlxrYmRpbnB1dHN0eWxleHh4IzF7JQotICBcZGVmXGFyZ3sjMX0lCi0gIFxpZnhcYXJnXHdvcmRkaXN0aW5jdAotICAgIFxnZGVmXGtiZGV4YW1wbGVmb250e1x0dHNsfVxnZGVmXGtiZGZvbnR7XHR0c2x9JQotICBcZWxzZVxpZnhcYXJnXHdvcmRleGFtcGxlCi0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHR9JQotICBcZWxzZVxpZnhcYXJnXHdvcmRjb2RlCi0gICAgXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0fVxnZGVmXGtiZGZvbnR7XHR0fSUKLSAgXGZpXGZpXGZpCi19Ci1cZGVmXHdvcmRkaXN0aW5jdHtkaXN0aW5jdH0KLVxkZWZcd29yZGV4YW1wbGV7ZXhhbXBsZX0KLVxkZWZcd29yZGNvZGV7Y29kZX0KLQotJSBEZWZhdWx0IGlzIGtiZGlucHV0ZGlzdGluY3QuICAoVG9vIG11Y2ggb2YgYSBoYXNzbGUgdG8gY2FsbCB0aGUgbWFjcm8sCi0lIHRoZSBjYXRjb2RlcyBhcmUgd3JvbmcgZm9yIHBhcnNlYXJnIHRvIHdvcmsuKQotXGdkZWZca2JkZXhhbXBsZWZvbnR7XHR0c2x9XGdkZWZca2JkZm9udHtcdHRzbH0KLQotXGRlZlx4a2V5e1xrZXl9Ci1cZGVmXGtiZGZvbyMxIzIjM1xwYXJ7XGRlZlxvbmV7IzF9XGRlZlx0aHJlZXsjM31cZGVmXHRocmVleHs/P30lCi1caWZ4XG9uZVx4a2V5XGlmeFx0aHJlZXhcdGhyZWUgXGtleXsjMn0lCi1cZWxzZXtcdGNsb3Nle1xrYmRmb250XGxvb2t9fVxmaQotXGVsc2V7XHRjbG9zZXtca2JkZm9udFxsb29rfX1cZml9Ci0KLSUgRm9yIEB1cmwsIEBlbnYsIEBjb21tYW5kIHF1b3RlcyBzZWVtIHVubmVjZXNzYXJ5LCBzbyB1c2UgXGNvZGUuCi1cbGV0XHVybD1cY29kZQotXGxldFxlbnY9XGNvZGUKLVxsZXRcY29tbWFuZD1cY29kZQotCi0lIEB1cmVmIChhYmJyZXZpYXRpb24gZm9yIGB1cmxyZWYnKSB0YWtlcyBhbiBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQKLSUgc3BlY2lmeWluZyB0aGUgdGV4dCB0byBkaXNwbGF5LiAgRmlyc3QgKG1hbmRhdG9yeSkgYXJnIGlzIHRoZSB1cmwuCi0lIFBlcmhhcHMgZXZlbnR1YWxseSBwdXQgaW4gYSBoeXBlcnRleCBcc3BlY2lhbCBoZXJlLgotJSAKLVxkZWZcdXJlZiMxe1x1cmVmeHh4ICMxLCxcZmluaXNofQotXGRlZlx1cmVmeHh4IzEsIzIsIzNcZmluaXNoeyUKLSAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfSUKLSAgXGlmZGltXHdkMCA+IDBwdAotICAgIFx1bmhib3gwXCAoXGNvZGV7IzF9KSUKLSAgXGVsc2UKLSAgICBcY29kZXsjMX0lCi0gIFxmaQotfQotCi0lIHJtcyBkb2VzIG5vdCBsaWtlIHRoZSBhbmdsZSBicmFja2V0cyAtLWthcmwsIDE3bWF5OTcuCi0lIFNvIG5vdyBAZW1haWwgaXMganVzdCBsaWtlIEB1cmVmLgotJVxkZWZcZW1haWwjMXtcYW5nbGVsZWZ0e1x0dCAjMX1cYW5nbGVyaWdodH0KLVxsZXRcZW1haWw9XHVyZWYKLQotJSBDaGVjayBpZiB3ZSBhcmUgY3VycmVudGx5IHVzaW5nIGEgdHlwZXdyaXRlciBmb250LiAgU2luY2UgYWxsIHRoZQotJSBDb21wdXRlciBNb2Rlcm4gdHlwZXdyaXRlciBmb250cyBoYXZlIHplcm8gaW50ZXJ3b3JkIHN0cmV0Y2ggKGFuZAotJSBzaHJpbmspLCBhbmQgaXQgaXMgcmVhc29uYWJsZSB0byBleHBlY3QgYWxsIHR5cGV3cml0ZXIgZm9udHMgdG8gaGF2ZQotJSB0aGlzIHByb3BlcnR5LCB3ZSBjYW4gY2hlY2sgdGhhdCBmb250IHBhcmFtZXRlci4KLSUKLVxkZWZcaWZtb25vc3BhY2V7XGlmZGltXGZvbnRkaW1lbjNcZm9udD0wcHQgfQotCi0lIFR5cGVzZXQgYSBkaW1lbnNpb24sIGUuZy4sIGBpbicgb3IgYHB0Jy4gIFRoZSBvbmx5IHJlYXNvbiBmb3IgdGhlCi0lIGFyZ3VtZW50IGlzIHRvIG1ha2UgdGhlIGlucHV0IGxvb2sgcmlnaHQ6IEBkbW57cHR9IGluc3RlYWQgb2YgQGRtbnt9cHQuCi0lCi1cZGVmXGRtbiMxe1x0aGluc3BhY2UgIzF9Ci0KLVxkZWZca2JkIzF7XGRlZlxsb29reyMxfVxleHBhbmRhZnRlclxrYmRmb29cbG9vaz8/XHBhcn0KLQotJSBAbCB3YXMgbmV2ZXIgZG9jdW1lbnRlZCB0byBtZWFuIGBgc3dpdGNoIHRvIHRoZSBMaXNwIGZvbnQnJywKLSUgYW5kIGl0IGlzIG5vdCB1c2VkIGFzIHN1Y2ggaW4gYW55IG1hbnVhbCBJIGNhbiBmaW5kLiAgV2UgbmVlZCBpdCBmb3IKLSUgUG9saXNoIHN1cHByZXNzZWQtbC4gIC0ta2FybCwgMjJzZXA5Ni4KLSVcZGVmXGwjMXt7XGxpICMxfVxudWxsfQotCi0lIEV4cGxpY2l0IGZvbnQgY2hhbmdlczogQHIsIEBzYywgdW5kb2N1bWVudGVkIEBpaS4KLVxkZWZcciMxe3tccm0gIzF9fSAgICAgICAgICAgICAgJSByb21hbiBmb250Ci1cZGVmXHNjIzF7e1xzbWFsbGNhcHMjMX19ICAgICAgICUgc21hbGxjYXBzIGZvbnQKLVxkZWZcaWkjMXt7XGl0ICMxfX0gICAgICAgICAgICAgJSBpdGFsaWMgZm9udAotCi0lIEBhY3JvbnltIGRvd25jYXNlcyB0aGUgYXJndW1lbnQgYW5kIHByaW50cyBpbiBzbWFsbGNhcHMuCi1cZGVmXGFjcm9ueW0jMXt7XHNtYWxsY2FwcyBcbG93ZXJjYXNleyMxfX19Ci0KLSUgQHBvdW5kc3t9IGlzIGEgc3Rlcmxpbmcgc2lnbi4KLVxkZWZccG91bmRze3tcaXRcJH19Ci0KLQotXG1lc3NhZ2V7cGFnZSBoZWFkaW5ncyx9Ci0KLVxuZXdza2lwXHRpdGxlcGFnZXRvcGdsdWUgXHRpdGxlcGFnZXRvcGdsdWUgPSAxLjVpbgotXG5ld3NraXBcdGl0bGVwYWdlYm90dG9tZ2x1ZSBcdGl0bGVwYWdlYm90dG9tZ2x1ZSA9IDJwYwotCi0lIEZpcnN0IHRoZSB0aXRsZSBwYWdlLiAgTXVzdCBkbyBAc2V0dGl0bGUgYmVmb3JlIEB0aXRsZXBhZ2UuCi1cbmV3aWZcaWZzZWVuYXV0aG9yCi1cbmV3aWZcaWZmaW5pc2hlZHRpdGxlcGFnZQotCi0lIERvIGFuIGltcGxpY2l0IEBjb250ZW50cyBvciBAc2hvcnRjb250ZW50cyBhZnRlciBAZW5kIHRpdGxlcGFnZSBpZiB0aGUKLSUgdXNlciBzYXlzIEBjb250ZW50c2FmdGVydGl0bGVwYWdlIG9yIEBzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UuCi0lIAotXG5ld2lmXGlmc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZQotIFxsZXRcc2V0Y29udGVudHNhZnRlcnRpdGxlcGFnZSA9IFxzZXRjb250ZW50c2FmdGVydGl0bGVwYWdldHJ1ZQotXG5ld2lmXGlmc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gXGxldFxzZXRzaG9ydGNvbnRlbnRzYWZ0ZXJ0aXRsZXBhZ2UgPSBcc2V0c2hvcnRjb250ZW50c2FmdGVydGl0bGVwYWdldHJ1ZQotCi1cZGVmXHNob3J0dGl0bGVwYWdle1xwYXJzZWFyZ1xzaG9ydHRpdGxlcGFnZXp6en0KLVxkZWZcc2hvcnR0aXRsZXBhZ2V6enogIzF7XGJlZ2luZ3JvdXBcaGJveHt9XHZza2lwIDEuNWluIFxjaGFwcm0gXGNlbnRlcmxpbmV7IzF9JQotICAgICAgICBcZW5kZ3JvdXBccGFnZVxoYm94e31ccGFnZX0KLQotXGRlZlx0aXRsZXBhZ2V7XGJlZ2luZ3JvdXAgXHBhcmluZGVudD0wcHQgXHRleHRmb250cwotICAgXGxldFxzdWJ0aXRsZXJtPVx0ZW5ybQotICAgXGRlZlxzdWJ0aXRsZWZvbnR7XHN1YnRpdGxlcm0gXG5vcm1hbGJhc2VsaW5lc2tpcCA9IDEzcHQgXG5vcm1hbGJhc2VsaW5lc30lCi0gICAlCi0gICBcZGVmXGF1dGhvcmZvbnR7XGF1dGhvcnJtIFxub3JtYWxiYXNlbGluZXNraXAgPSAxNnB0IFxub3JtYWxiYXNlbGluZXN9JQotICAgJQotICAgJSBMZWF2ZSBzb21lIHNwYWNlIGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgcGFnZS4KLSAgIFx2Z2x1ZVx0aXRsZXBhZ2V0b3BnbHVlCi0gICAlCi0gICAlIE5vdyB5b3UgY2FuIHByaW50IHRoZSB0aXRsZSB1c2luZyBAdGl0bGUuCi0gICBcZGVmXHRpdGxle1xwYXJzZWFyZ1x0aXRsZXp6en0lCi0gICBcZGVmXHRpdGxlenp6IyMxe1xsZWZ0bGluZXtcdGl0bGVmb250c1xybSAjIzF9Ci0gICAgICAgICAgICAgICAgICAgICUgcHJpbnQgYSBydWxlIGF0IHRoZSBwYWdlIGJvdHRvbSBhbHNvLgotICAgICAgICAgICAgICAgICAgICBcZmluaXNoZWR0aXRsZXBhZ2VmYWxzZQotICAgICAgICAgICAgICAgICAgICBcdnNraXA0cHQgXGhydWxlIGhlaWdodCA0cHQgd2lkdGggXGhzaXplIFx2c2tpcDRwdH0lCi0gICAlIE5vIHJ1bGUgYXQgcGFnZSBib3R0b20gdW5sZXNzIHdlIHByaW50IG9uZSBhdCB0aGUgdG9wIHdpdGggQHRpdGxlLgotICAgXGZpbmlzaGVkdGl0bGVwYWdldHJ1ZQotICAgJQotICAgJSBOb3cgeW91IGNhbiBwdXQgdGV4dCB1c2luZyBAc3VidGl0bGUuCi0gICBcZGVmXHN1YnRpdGxle1xwYXJzZWFyZ1xzdWJ0aXRsZXp6en0lCi0gICBcZGVmXHN1YnRpdGxlenp6IyMxe3tcc3VidGl0bGVmb250IFxyaWdodGxpbmV7IyMxfX19JQotICAgJQotICAgJSBAYXV0aG9yIHNob3VsZCBjb21lIGxhc3QsIGJ1dCBtYXkgY29tZSBtYW55IHRpbWVzLgotICAgXGRlZlxhdXRob3J7XHBhcnNlYXJnXGF1dGhvcnp6en0lCi0gICBcZGVmXGF1dGhvcnp6eiMjMXtcaWZzZWVuYXV0aG9yXGVsc2VcdnNraXAgMHB0IHBsdXMgMWZpbGxsXHNlZW5hdXRob3J0cnVlXGZpCi0gICAgICB7XGF1dGhvcmZvbnQgXGxlZnRsaW5leyMjMX19fSUKLSAgICUKLSAgICUgTW9zdCB0aXRsZSBgYHBhZ2VzJycgYXJlIGFjdHVhbGx5IHR3byBwYWdlcyBsb25nLCB3aXRoIHNwYWNlCi0gICAlIGF0IHRoZSB0b3Agb2YgdGhlIHNlY29uZC4gIFdlIGRvbid0IHdhbnQgdGhlIHJhZ2dlZCBsZWZ0IG9uIHRoZSBzZWNvbmQuCi0gICBcbGV0XG9sZHBhZ2UgPSBccGFnZQotICAgXGRlZlxwYWdleyUKLSAgICAgIFxpZmZpbmlzaGVkdGl0bGVwYWdlXGVsc2UKLSAgICAgICAgIFxmaW5pc2h0aXRsZXBhZ2UKLSAgICAgIFxmaQotICAgICAgXG9sZHBhZ2UKLSAgICAgIFxsZXRccGFnZSA9IFxvbGRwYWdlCi0gICAgICBcaGJveHt9fSUKLSUgICBcZGVmXHBhZ2V7XG9sZHBhZ2UgXGhib3h7fX0KLX0KLQotXGRlZlxFdGl0bGVwYWdleyUKLSAgIFxpZmZpbmlzaGVkdGl0bGVwYWdlXGVsc2UKLSAgICAgIFxmaW5pc2h0aXRsZXBhZ2UKLSAgIFxmaQotICAgJSBJdCBpcyBpbXBvcnRhbnQgdG8gZG8gdGhlIHBhZ2UgYnJlYWsgYmVmb3JlIGVuZGluZyB0aGUgZ3JvdXAsCi0gICAlIGJlY2F1c2UgdGhlIGhlYWRsaW5lIGFuZCBmb290bGluZSBhcmUgb25seSBlbXB0eSBpbnNpZGUgdGhlIGdyb3VwLgotICAgJSBJZiB3ZSB1c2UgdGhlIG5ldyBkZWZpbml0aW9uIG9mIFxwYWdlLCB3ZSBhbHdheXMgZ2V0IGEgYmxhbmsgcGFnZQotICAgJSBhZnRlciB0aGUgdGl0bGUgcGFnZSwgd2hpY2ggd2UgY2VydGFpbmx5IGRvbid0IHdhbnQuCi0gICBcb2xkcGFnZQotICAgXGVuZGdyb3VwCi0gICAlCi0gICAlIElmIHRoZXkgd2FudCBzaG9ydCwgdGhleSBjZXJ0YWlubHkgd2FudCBsb25nIHRvby4KLSAgIFxpZnNldHNob3J0Y29udGVudHNhZnRlcnRpdGxlcGFnZQotICAgICBcc2hvcnRjb250ZW50cwotICAgICBcY29udGVudHMKLSAgICAgXGdsb2JhbFxsZXRcc2hvcnRjb250ZW50cyA9IFxyZWxheAotICAgICBcZ2xvYmFsXGxldFxjb250ZW50cyA9IFxyZWxheAotICAgXGZpCi0gICAlCi0gICBcaWZzZXRjb250ZW50c2FmdGVydGl0bGVwYWdlCi0gICAgIFxjb250ZW50cwotICAgICBcZ2xvYmFsXGxldFxjb250ZW50cyA9IFxyZWxheAotICAgICBcZ2xvYmFsXGxldFxzaG9ydGNvbnRlbnRzID0gXHJlbGF4Ci0gICBcZmkKLSAgICUKLSAgIFxIRUFESU5HU29uCi19Ci0KLVxkZWZcZmluaXNodGl0bGVwYWdleyUKLSAgIFx2c2tpcDRwdCBcaHJ1bGUgaGVpZ2h0IDJwdCB3aWR0aCBcaHNpemUKLSAgIFx2c2tpcFx0aXRsZXBhZ2Vib3R0b21nbHVlCi0gICBcZmluaXNoZWR0aXRsZXBhZ2V0cnVlCi19Ci0KLSUlJSBTZXQgdXAgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MuCi0KLVxsZXRcdGhpc3BhZ2U9XGZvbGlvCi0KLVxuZXd0b2tzXGV2ZW5oZWFkbGluZSAgICAlIGhlYWRsaW5lIG9uIGV2ZW4gcGFnZXMKLVxuZXd0b2tzXG9kZGhlYWRsaW5lICAgICAlIGhlYWRsaW5lIG9uIG9kZCBwYWdlcwotXG5ld3Rva3NcZXZlbmZvb3RsaW5lICAgICUgZm9vdGxpbmUgb24gZXZlbiBwYWdlcwotXG5ld3Rva3Ncb2RkZm9vdGxpbmUgICAgICUgZm9vdGxpbmUgb24gb2RkIHBhZ2VzCi0KLSUgTm93IG1ha2UgVGV4IHVzZSB0aG9zZSB2YXJpYWJsZXMKLVxoZWFkbGluZT17e1x0ZXh0Zm9udHNccm0gXGlmb2RkXHBhZ2VubyBcdGhlXG9kZGhlYWRsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVsc2UgXHRoZVxldmVuaGVhZGxpbmUgXGZpfX0KLVxmb290bGluZT17e1x0ZXh0Zm9udHNccm0gXGlmb2RkXHBhZ2VubyBcdGhlXG9kZGZvb3RsaW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXGVsc2UgXHRoZVxldmVuZm9vdGxpbmUgXGZpfVxIRUFESU5HU2hvb2t9Ci1cbGV0XEhFQURJTkdTaG9vaz1ccmVsYXgKLQotJSBDb21tYW5kcyB0byBzZXQgdGhvc2UgdmFyaWFibGVzLgotJSBGb3IgZXhhbXBsZSwgdGhpcyBpcyB3aGF0ICBAaGVhZGluZ3Mgb24gIGRvZXMKLSUgQGV2ZW5oZWFkaW5nIEB0aGlzdGl0bGV8QHRoaXNwYWdlfEB0aGlzY2hhcHRlcgotJSBAb2RkaGVhZGluZyBAdGhpc2NoYXB0ZXJ8QHRoaXNwYWdlfEB0aGlzdGl0bGUKLSUgQGV2ZW5mb290aW5nIEB0aGlzZmlsZXx8Ci0lIEBvZGRmb290aW5nIHx8QHRoaXNmaWxlCi0KLVxkZWZcZXZlbmhlYWRpbmd7XHBhcnNlYXJnXGV2ZW5oZWFkaW5neHh4fQotXGRlZlxvZGRoZWFkaW5ne1xwYXJzZWFyZ1xvZGRoZWFkaW5neHh4fQotXGRlZlxldmVyeWhlYWRpbmd7XHBhcnNlYXJnXGV2ZXJ5aGVhZGluZ3h4eH0KLQotXGRlZlxldmVuZm9vdGluZ3tccGFyc2VhcmdcZXZlbmZvb3Rpbmd4eHh9Ci1cZGVmXG9kZGZvb3Rpbmd7XHBhcnNlYXJnXG9kZGZvb3Rpbmd4eHh9Ci1cZGVmXGV2ZXJ5Zm9vdGluZ3tccGFyc2VhcmdcZXZlcnlmb290aW5neHh4fQotCi17XGNhdGNvZGVgXEA9MCAlCi0KLVxnZGVmXGV2ZW5oZWFkaW5neHh4ICMxe1xldmVuaGVhZGluZ3l5eSAjMUB8QHxAfEB8XGZpbmlzaH0KLVxnZGVmXGV2ZW5oZWFkaW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCi1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQotCi1cZ2RlZlxvZGRoZWFkaW5neHh4ICMxe1xvZGRoZWFkaW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQotXGdkZWZcb2RkaGVhZGluZ3l5eSAjMUB8IzJAfCMzQHwjNFxmaW5pc2h7JQotXGdsb2JhbFxvZGRoZWFkbGluZT17XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319fQotCi1cZ2RlZlxldmVyeWhlYWRpbmd4eHgjMXtcb2RkaGVhZGluZ3h4eHsjMX1cZXZlbmhlYWRpbmd4eHh7IzF9fSUKLQotXGdkZWZcZXZlbmZvb3Rpbmd4eHggIzF7XGV2ZW5mb290aW5neXl5ICMxQHxAfEB8QHxcZmluaXNofQotXGdkZWZcZXZlbmZvb3Rpbmd5eXkgIzFAfCMyQHwjM0B8IzRcZmluaXNoeyUKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtccmxhcHtcY2VudGVybGluZXsjMn19XGxpbmV7IzFcaGZpbCMzfX19Ci0KLVxnZGVmXG9kZGZvb3Rpbmd4eHggIzF7XG9kZGZvb3Rpbmd5eXkgIzFAfEB8QHxAfFxmaW5pc2h9Ci1cZ2RlZlxvZGRmb290aW5neXl5ICMxQHwjMkB8IzNAfCM0XGZpbmlzaHslCi0gIFxnbG9iYWxcb2RkZm9vdGxpbmUgPSB7XHJsYXB7XGNlbnRlcmxpbmV7IzJ9fVxsaW5leyMxXGhmaWwjM319JQotICAlCi0gICUgTGVhdmUgc29tZSBzcGFjZSBmb3IgdGhlIGZvb3RsaW5lLiAgSG9wZWZ1bGx5IG9rIHRvIGFzc3VtZQotICAlIEBldmVuZm9vdGluZyB3aWxsIG5vdCBiZSB1c2VkIGJ5IGl0c2VsZi4KLSAgXGdsb2JhbFxhZHZhbmNlXHBhZ2VoZWlnaHQgYnkgLVxiYXNlbGluZXNraXAKLSAgXGdsb2JhbFxhZHZhbmNlXHZzaXplIGJ5IC1cYmFzZWxpbmVza2lwCi19Ci0KLVxnZGVmXGV2ZXJ5Zm9vdGluZ3h4eCMxe1xvZGRmb290aW5neHh4eyMxfVxldmVuZm9vdGluZ3h4eHsjMX19Ci0lCi19JSB1bmJpbmQgdGhlIGNhdGNvZGUgb2YgQC4KLQotJSBAaGVhZGluZ3MgZG91YmxlICAgICAgdHVybnMgaGVhZGluZ3Mgb24gZm9yIGRvdWJsZS1zaWRlZCBwcmludGluZy4KLSUgQGhlYWRpbmdzIHNpbmdsZSAgICAgIHR1cm5zIGhlYWRpbmdzIG9uIGZvciBzaW5nbGUtc2lkZWQgcHJpbnRpbmcuCi0lIEBoZWFkaW5ncyBvZmYgICAgICAgICB0dXJucyB0aGVtIG9mZi4KLSUgQGhlYWRpbmdzIG9uICAgICAgICAgIHNhbWUgYXMgQGhlYWRpbmdzIGRvdWJsZSwgcmV0YWluZWQgZm9yIGNvbXBhdGliaWxpdHkuCi0lIEBoZWFkaW5ncyBhZnRlciAgICAgICB0dXJucyBvbiBkb3VibGUtc2lkZWQgaGVhZGluZ3MgYWZ0ZXIgdGhpcyBwYWdlLgotJSBAaGVhZGluZ3MgZG91YmxlYWZ0ZXIgdHVybnMgb24gZG91YmxlLXNpZGVkIGhlYWRpbmdzIGFmdGVyIHRoaXMgcGFnZS4KLSUgQGhlYWRpbmdzIHNpbmdsZWFmdGVyIHR1cm5zIG9uIHNpbmdsZS1zaWRlZCBoZWFkaW5ncyBhZnRlciB0aGlzIHBhZ2UuCi0lIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIG9mZiBhdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudCwKLSUgYW5kIHR1cm5lZCBgb24nIGFmdGVyIEBlbmQgdGl0bGVwYWdlLgotCi1cZGVmXGhlYWRpbmdzICMxIHtcY3NuYW1lIEhFQURJTkdTIzFcZW5kY3NuYW1lfQotCi1cZGVmXEhFQURJTkdTb2ZmewotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xoZmlsfSBcZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcaGZpbH0gXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9fQotXEhFQURJTkdTb2ZmCi0lIFdoZW4gd2UgdHVybiBoZWFkaW5ncyBvbiwgc2V0IHRoZSBwYWdlIG51bWJlciB0byAxLgotJSBGb3IgZG91YmxlLXNpZGVkIHByaW50aW5nLCBwdXQgY3VycmVudCBmaWxlIG5hbWUgaW4gbG93ZXIgbGVmdCBjb3JuZXIsCi0lIGNoYXB0ZXIgbmFtZSBvbiBpbnNpZGUgdG9wIG9mIHJpZ2h0IGhhbmQgcGFnZXMsIGRvY3VtZW50Ci0lIHRpdGxlIG9uIGluc2lkZSB0b3Agb2YgbGVmdCBoYW5kIHBhZ2VzLCBhbmQgcGFnZSBudW1iZXJzIG9uIG91dHNpZGUgdG9wCi0lIGVkZ2Ugb2YgYWxsIHBhZ2VzLgotXGRlZlxIRUFESU5HU2RvdWJsZXsKLVxnbG9iYWxccGFnZW5vPTEKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1xmb2xpb1xoZmlsXHRoaXN0aXRsZX19Ci1cZ2xvYmFsXG9kZGhlYWRsaW5lPXtcbGluZXtcdGhpc2NoYXB0ZXJcaGZpbFxmb2xpb319Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKLX0KLVxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotCi0lIEZvciBzaW5nbGUtc2lkZWQgcHJpbnRpbmcsIGNoYXB0ZXIgdGl0bGUgZ29lcyBhY3Jvc3MgdG9wIGxlZnQgb2YgcGFnZSwKLSUgcGFnZSBudW1iZXIgb24gdG9wIHJpZ2h0LgotXGRlZlxIRUFESU5HU3NpbmdsZXsKLVxnbG9iYWxccGFnZW5vPTEKLVxnbG9iYWxcZXZlbmZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcb2RkZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxldmVuaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcb2RkaGVhZGxpbmU9e1xsaW5le1x0aGlzY2hhcHRlclxoZmlsXGZvbGlvfX0KLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLX0KLVxkZWZcSEVBRElOR1NvbntcSEVBRElOR1Nkb3VibGV9Ci0KLVxkZWZcSEVBRElOR1NhZnRlcntcbGV0XEhFQURJTkdTaG9vaz1cSEVBRElOR1Nkb3VibGV4fQotXGxldFxIRUFESU5HU2RvdWJsZWFmdGVyPVxIRUFESU5HU2FmdGVyCi1cZGVmXEhFQURJTkdTZG91YmxleHslCi1cZ2xvYmFsXGV2ZW5mb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXG9kZGZvb3RsaW5lPXtcaGZpbH0KLVxnbG9iYWxcZXZlbmhlYWRsaW5lPXtcbGluZXtcZm9saW9caGZpbFx0aGlzdGl0bGV9fQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBvZGRwYWdlCi19Ci0KLVxkZWZcSEVBRElOR1NzaW5nbGVhZnRlcntcbGV0XEhFQURJTkdTaG9vaz1cSEVBRElOR1NzaW5nbGV4fQotXGRlZlxIRUFESU5HU3NpbmdsZXh7JQotXGdsb2JhbFxldmVuZm9vdGxpbmU9e1xoZmlsfQotXGdsb2JhbFxvZGRmb290bGluZT17XGhmaWx9Ci1cZ2xvYmFsXGV2ZW5oZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxvZGRoZWFkbGluZT17XGxpbmV7XHRoaXNjaGFwdGVyXGhmaWxcZm9saW99fQotXGdsb2JhbFxsZXRcY29udGVudHNhbGlnbm1hY3JvID0gXGNoYXBwYWdlcgotfQotCi0lIFN1YnJvdXRpbmVzIHVzZWQgaW4gZ2VuZXJhdGluZyBoZWFkaW5ncwotJSBQcm9kdWNlcyBEYXkgTW9udGggWWVhciBzdHlsZSBvZiBvdXRwdXQuCi1cZGVmXHRvZGF5e1xudW1iZXJcZGF5XHNwYWNlCi1caWZjYXNlXG1vbnRoXG9yCi1KYW51YXJ5XG9yIEZlYnJ1YXJ5XG9yIE1hcmNoXG9yIEFwcmlsXG9yIE1heVxvciBKdW5lXG9yCi1KdWx5XG9yIEF1Z3VzdFxvciBTZXB0ZW1iZXJcb3IgT2N0b2JlclxvciBOb3ZlbWJlclxvciBEZWNlbWJlclxmaQotXHNwYWNlXG51bWJlclx5ZWFyfQotCi0lIFVzZSB0aGlzIGlmIHlvdSB3YW50IHRoZSBNb250aCBEYXksIFllYXIgc3R5bGUgb2Ygb3V0cHV0LgotJVxkZWZcdG9kYXl7XGlmY2FzZVxtb250aFxvcgotJUphbnVhcnlcb3IgRmVicnVhcnlcb3IgTWFyY2hcb3IgQXByaWxcb3IgTWF5XG9yIEp1bmVcb3IKLSVKdWx5XG9yIEF1Z3VzdFxvciBTZXB0ZW1iZXJcb3IgT2N0b2JlclxvciBOb3ZlbWJlclxvciBEZWNlbWJlclxmaQotJVxzcGFjZVxudW1iZXJcZGF5LCBcbnVtYmVyXHllYXJ9Ci0KLSUgQHNldHRpdGxlIGxpbmUuLi4gIHNwZWNpZmllcyB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50LCBmb3IgaGVhZGluZ3MKLSUgSXQgZ2VuZXJhdGVzIG5vIG91dHB1dCBvZiBpdHMgb3duCi0KLVxkZWZcdGhpc3RpdGxle05vIFRpdGxlfQotXGRlZlxzZXR0aXRsZXtccGFyc2Vhcmdcc2V0dGl0bGV6enp9Ci1cZGVmXHNldHRpdGxlenp6ICMxe1xnZGVmXHRoaXN0aXRsZXsjMX19Ci0KLQotXG1lc3NhZ2V7dGFibGVzLH0KLSUgVGFibGVzIC0tIEB0YWJsZSwgQGZ0YWJsZSwgQHZ0YWJsZSwgQGl0ZW0oeCksIEBraXRlbSh4KSwgQHhpdGVtKHgpLgotCi0lIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgdGFibGUgdGV4dAotXG5ld2RpbWVuXHRhYmxlaW5kZW50IFx0YWJsZWluZGVudD0uOGluCi0lIGRlZmF1bHQgaW5kZW50YXRpb24gb2YgQGl0ZW1pemUgYW5kIEBlbnVtZXJhdGUgdGV4dAotXG5ld2RpbWVuXGl0ZW1pbmRlbnQgIFxpdGVtaW5kZW50PS4zaW4KLSUgbWFyZ2luIGJldHdlZW4gZW5kIG9mIHRhYmxlIGl0ZW0gYW5kIHN0YXJ0IG9mIHRhYmxlIHRleHQuCi1cbmV3ZGltZW5caXRlbW1hcmdpbiAgXGl0ZW1tYXJnaW49LjFpbgotCi0lIHVzZWQgaW50ZXJuYWxseSBmb3IgXGl0ZW1pbmRlbnQgbWludXMgXGl0ZW1tYXJnaW4KLVxuZXdkaW1lblxpdGVtbWF4Ci0KLSUgTm90ZSBAdGFibGUsIEB2dGFibGUsIGFuZCBAdnRhYmxlIGRlZmluZSBAaXRlbSwgQGl0ZW14LCBldGMuLCB3aXRoCi0lIHRoZXNlIGRlZnMuCi0lIFRoZXkgYWxzbyBkZWZpbmUgXGl0ZW1pbmRleAotJSB0byBpbmRleCB0aGUgaXRlbSBuYW1lIGluIHdoYXRldmVyIG1hbm5lciBpcyBkZXNpcmVkIChwZXJoYXBzIG5vbmUpLgotCi1cbmV3aWZcaWZpdGVteG5lZWRzbmVnYXRpdmV2c2tpcAotCi1cZGVmXGl0ZW14cGFye1xwYXJcaWZpdGVteG5lZWRzbmVnYXRpdmV2c2tpcFxub2JyZWFrXHZza2lwLVxwYXJza2lwXG5vYnJlYWtcZml9Ci0KLVxkZWZcaW50ZXJuYWxCaXRlbXtcc21hbGxicmVhayBccGFyc2VhcmdcaXRlbXp6en0KLVxkZWZcaW50ZXJuYWxCaXRlbXh7XGl0ZW14cGFyIFxwYXJzZWFyZ1xpdGVtenp6fQotCi1cZGVmXGludGVybmFsQnhpdGVtICIjMSJ7XGRlZlx4aXRlbXN1YnRvcGl4eyMxfSBcc21hbGxicmVhayBccGFyc2VhcmdceGl0ZW16enp9Ci1cZGVmXGludGVybmFsQnhpdGVteCAiIzEie1xkZWZceGl0ZW1zdWJ0b3BpeHsjMX0gXGl0ZW14cGFyIFxwYXJzZWFyZ1x4aXRlbXp6en0KLQotXGRlZlxpbnRlcm5hbEJraXRlbXtcc21hbGxicmVhayBccGFyc2Vhcmdca2l0ZW16enp9Ci1cZGVmXGludGVybmFsQmtpdGVteHtcaXRlbXhwYXIgXHBhcnNlYXJnXGtpdGVtenp6fQotCi1cZGVmXGtpdGVtenp6ICMxe1xkb3N1YmluZCB7a3d9e1xjb2RleyMxfX17Zm9yIHtcYmYgXGxhc3RmdW5jdGlvbn19JQotICAgICAgICAgICAgICAgICBcaXRlbXp6eiB7IzF9fQotCi1cZGVmXHhpdGVtenp6ICMxe1xkb3N1YmluZCB7a3d9e1xjb2RleyMxfX17Zm9yIHtcYmYgXHhpdGVtc3VidG9waWN9fSUKLSAgICAgICAgICAgICAgICAgXGl0ZW16enogeyMxfX0KLQotXGRlZlxpdGVtenp6ICMxe1xiZWdpbmdyb3VwICUKLSAgXGFkdmFuY2VcaHNpemUgYnkgLVxyaWdodHNraXAKLSAgXGFkdmFuY2VcaHNpemUgYnkgLVx0YWJsZWluZGVudAotICBcc2V0Ym94MD1caGJveHtcaXRlbWZvbnR7IzF9fSUKLSAgXGl0ZW1pbmRleHsjMX0lCi0gIFxub2JyZWFrICUgVGhpcyBwcmV2ZW50cyBhIGJyZWFrIGJlZm9yZSBAaXRlbXguCi0gICUKLSAgJSBJZiB0aGUgaXRlbSB0ZXh0IGRvZXMgbm90IGZpdCBpbiB0aGUgc3BhY2Ugd2UgaGF2ZSwgcHV0IGl0IG9uIGEgbGluZQotICAlIGJ5IGl0c2VsZiwgYW5kIGRvIG5vdCBhbGxvdyBhIHBhZ2UgYnJlYWsgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGF0Ci0gICUgbGluZS4gIFdlIGRvIG5vdCBzdGFydCBhIHBhcmFncmFwaCBoZXJlIGJlY2F1c2UgdGhlbiBpZiB0aGUgbmV4dAotICAlIGNvbW1hbmQgaXMsIGUuZy4sIEBraW5kZXgsIHRoZSB3aGF0c2l0IHdvdWxkIGdldCBwdXQgaW50byB0aGUKLSAgJSBob3Jpem9udGFsIGxpc3Qgb24gYSBsaW5lIGJ5IGl0c2VsZiwgcmVzdWx0aW5nIGluIGV4dHJhIGJsYW5rIHNwYWNlLgotICBcaWZkaW0gXHdkMD5caXRlbW1heAotICAgICUKLSAgICAlIE1ha2UgdGhpcyBhIHBhcmFncmFwaCBzbyB3ZSBnZXQgdGhlIFxwYXJza2lwIGdsdWUgYW5kIHdyYXBwaW5nLAotICAgICUgYnV0IGxlYXZlIGl0IHJhZ2dlZC1yaWdodC4KLSAgICBcYmVnaW5ncm91cAotICAgICAgXGFkdmFuY2VcbGVmdHNraXAgYnktXHRhYmxlaW5kZW50Ci0gICAgICBcYWR2YW5jZVxoc2l6ZSBieVx0YWJsZWluZGVudAotICAgICAgXGFkdmFuY2VccmlnaHRza2lwIGJ5MHB0IHBsdXMxZmlsCi0gICAgICBcbGVhdmV2bW9kZVx1bmhib3gwXHBhcgotICAgIFxlbmRncm91cAotICAgICUKLSAgICAlIFdlJ3JlIGdvaW5nIHRvIGJlIHN0YXJ0aW5nIGEgcGFyYWdyYXBoLCBidXQgd2UgZG9uJ3Qgd2FudCB0aGUKLSAgICAlIFxwYXJza2lwIGdsdWUgLS0gbG9naWNhbGx5IGl0J3MgcGFydCBvZiB0aGUgQGl0ZW0gd2UganVzdCBzdGFydGVkLgotICAgIFxub2JyZWFrIFx2c2tpcC1ccGFyc2tpcAotICAgICUKLSAgICAlIFN0b3AgYSBwYWdlIGJyZWFrIGF0IHRoZSBccGFyc2tpcCBnbHVlIGNvbWluZyB1cC4gIFVuZm9ydHVuYXRlbHkKLSAgICAlIHdlIGNhbid0IHByZXZlbnQgYSBwb3NzaWJsZSBwYWdlIGJyZWFrIGF0IHRoZSBmb2xsb3dpbmcKLSAgICAlIFxiYXNlbGluZXNraXAgZ2x1ZS4KLSAgICBcbm9icmVhawotICAgIFxlbmRncm91cAotICAgIFxpdGVteG5lZWRzbmVnYXRpdmV2c2tpcGZhbHNlCi0gIFxlbHNlCi0gICAgJSBUaGUgaXRlbSB0ZXh0IGZpdHMgaW50byB0aGUgc3BhY2UuICBTdGFydCBhIHBhcmFncmFwaCwgc28gdGhhdCB0aGUKLSAgICAlIGZvbGxvd2luZyB0ZXh0IChpZiBhbnkpIHdpbGwgZW5kIHVwIG9uIHRoZSBzYW1lIGxpbmUuICAKLSAgICBcbm9pbmRlbnQKLSAgICAlIERvIHRoaXMgd2l0aCBrZXJucyBhbmQgXHVuaGJveCBzbyB0aGF0IGlmIHRoZXJlIGlzIGEgZm9vdG5vdGUgaW4KLSAgICAlIHRoZSBpdGVtIHRleHQsIGl0IGNhbiBtaWdyYXRlIHRvIHRoZSBtYWluIHZlcnRpY2FsIGxpc3QgYW5kCi0gICAgJSBldmVudHVhbGx5IGJlIHByaW50ZWQuCi0gICAgXG5vYnJlYWtca2Vybi1cdGFibGVpbmRlbnQKLSAgICBcZGltZW4wID0gXGl0ZW1tYXggIFxhZHZhbmNlXGRpbWVuMCBieSBcaXRlbW1hcmdpbiBcYWR2YW5jZVxkaW1lbjAgYnkgLVx3ZDAKLSAgICBcdW5oYm94MAotICAgIFxub2JyZWFrXGtlcm5cZGltZW4wCi0gICAgXGVuZGdyb3VwCi0gICAgXGl0ZW14bmVlZHNuZWdhdGl2ZXZza2lwdHJ1ZQotICBcZmkKLX0KLQotXGRlZlxpdGVte1xlcnJtZXNzYWdle0BpdGVtIHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLVxkZWZcaXRlbXh7XGVycm1lc3NhZ2V7QGl0ZW14IHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLVxkZWZca2l0ZW17XGVycm1lc3NhZ2V7QGtpdGVtIHdoaWxlIG5vdCBpbiBhIHRhYmxlfX0KLVxkZWZca2l0ZW14e1xlcnJtZXNzYWdle0BraXRlbXggd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlx4aXRlbXtcZXJybWVzc2FnZXtAeGl0ZW0gd2hpbGUgbm90IGluIGEgdGFibGV9fQotXGRlZlx4aXRlbXh7XGVycm1lc3NhZ2V7QHhpdGVteCB3aGlsZSBub3QgaW4gYSB0YWJsZX19Ci0KLSUgQ29udGFpbnMgYSBrbHVkZ2UgdG8gZ2V0IEBlbmRbZGVzY3JpcHRpb25dIHRvIHdvcmsuCi1cZGVmXGRlc2NyaXB0aW9ue1x0YWJsZXp7XGRvbnRpbmRleH17MX17fXt9e317fX0KLQotJSBAdGFibGUsIEBmdGFibGUsIEB2dGFibGUuCi1cZGVmXHRhYmxle1xiZWdpbmdyb3VwXGluRU5WXG9iZXlsaW5lc1xvYmV5c3BhY2VzXHRhYmxleH0KLXtcb2JleWxpbmVzXG9iZXlzcGFjZXMlCi1cZ2RlZlx0YWJsZXggIzFeXk17JQotXHRhYmxleVxkb250aW5kZXgjMSAgICAgICAgXGVuZHRhYmxleX19Ci0KLVxkZWZcZnRhYmxle1xiZWdpbmdyb3VwXGluRU5WXG9iZXlsaW5lc1xvYmV5c3BhY2VzXGZ0YWJsZXh9Ci17XG9iZXlsaW5lc1xvYmV5c3BhY2VzJQotXGdkZWZcZnRhYmxleCAjMV5eTXslCi1cdGFibGV5XGZuaXRlbWluZGV4IzEgICAgICAgIFxlbmR0YWJsZXkKLVxkZWZcRWZ0YWJsZXtcZW5kZ3JhZlxhZnRlcmVudmJyZWFrXGVuZGdyb3VwfSUKLVxsZXRcRXRhYmxlPVxyZWxheH19Ci0KLVxkZWZcdnRhYmxle1xiZWdpbmdyb3VwXGluRU5WXG9iZXlsaW5lc1xvYmV5c3BhY2VzXHZ0YWJsZXh9Ci17XG9iZXlsaW5lc1xvYmV5c3BhY2VzJQotXGdkZWZcdnRhYmxleCAjMV5eTXslCi1cdGFibGV5XHZyaXRlbWluZGV4IzEgICAgICAgIFxlbmR0YWJsZXkKLVxkZWZcRXZ0YWJsZXtcZW5kZ3JhZlxhZnRlcmVudmJyZWFrXGVuZGdyb3VwfSUKLVxsZXRcRXRhYmxlPVxyZWxheH19Ci0KLVxkZWZcZG9udGluZGV4ICMxe30KLVxkZWZcZm5pdGVtaW5kZXggIzF7XGRvaW5kIHtmbn17XGNvZGV7IzF9fX0lCi1cZGVmXHZyaXRlbWluZGV4ICMxe1xkb2luZCB7dnJ9e1xjb2RleyMxfX19JQotCi17XG9iZXlzcGFjZXMgJQotXGdkZWZcdGFibGV5IzEjMiAjMyAjNCAjNSAjNiAjN1xlbmR0YWJsZXl7XGVuZGdyb3VwJQotXHRhYmxlensjMX17IzJ9eyMzfXsjNH17IzV9eyM2fX19Ci0KLVxkZWZcdGFibGV6ICMxIzIjMyM0IzUjNnslCi1cYWJvdmVlbnZicmVhayAlCi1cYmVnaW5ncm91cCAlCi1cZGVmXEVkZXNjcmlwdGlvbntcRXRhYmxlfSUgTmVjZXNzYXJ5IGtsdWRnZS4KLVxsZXRcaXRlbWluZGV4PSMxJQotXGlmbnVtIDAjMz4wIFxhZHZhbmNlIFxsZWZ0c2tpcCBieSAjM1xtaWwgXGZpICUKLVxpZm51bSAwIzQ+MCBcdGFibGVpbmRlbnQ9IzRcbWlsIFxmaSAlCi1caWZudW0gMCM1PjAgXGFkdmFuY2UgXHJpZ2h0c2tpcCBieSAjNVxtaWwgXGZpICUKLVxkZWZcaXRlbWZvbnR7IzJ9JQotXGl0ZW1tYXg9XHRhYmxlaW5kZW50ICUKLVxhZHZhbmNlIFxpdGVtbWF4IGJ5IC1caXRlbW1hcmdpbiAlCi1cYWR2YW5jZSBcbGVmdHNraXAgYnkgXHRhYmxlaW5kZW50ICUKLVxleGRlbnRhbW91bnQ9XHRhYmxlaW5kZW50Ci1ccGFyaW5kZW50ID0gMHB0Ci1ccGFyc2tpcCA9IFxzbWFsbHNraXBhbW91bnQKLVxpZmRpbSBccGFyc2tpcD0wcHQgXHBhcnNraXA9MnB0IFxmaSUKLVxkZWZcRXRhYmxle1xlbmRncmFmXGFmdGVyZW52YnJlYWtcZW5kZ3JvdXB9JQotXGxldFxpdGVtID0gXGludGVybmFsQml0ZW0gJQotXGxldFxpdGVteCA9IFxpbnRlcm5hbEJpdGVteCAlCi1cbGV0XGtpdGVtID0gXGludGVybmFsQmtpdGVtICUKLVxsZXRca2l0ZW14ID0gXGludGVybmFsQmtpdGVteCAlCi1cbGV0XHhpdGVtID0gXGludGVybmFsQnhpdGVtICUKLVxsZXRceGl0ZW14ID0gXGludGVybmFsQnhpdGVteCAlCi19Ci0KLSUgVGhpcyBpcyB0aGUgY291bnRlciB1c2VkIGJ5IEBlbnVtZXJhdGUsIHdoaWNoIGlzIHJlYWxseSBAaXRlbWl6ZQotCi1cbmV3Y291bnQgXGl0ZW1ubwotCi1cZGVmXGl0ZW1pemV7XHBhcnNlYXJnXGl0ZW1pemV6enp9Ci0KLVxkZWZcaXRlbWl6ZXp6eiAjMXslCi0gIFxiZWdpbmdyb3VwICUgZW5kZWQgYnkgdGhlIEBlbmQgaXRlbWl6ZQotICBcaXRlbWl6ZXkgeyMxfXtcRWl0ZW1pemV9Ci19Ci0KLVxkZWZcaXRlbWl6ZXkgIzEjMnslCi1cYWJvdmVlbnZicmVhayAlCi1caXRlbW1heD1caXRlbWluZGVudCAlCi1cYWR2YW5jZSBcaXRlbW1heCBieSAtXGl0ZW1tYXJnaW4gJQotXGFkdmFuY2UgXGxlZnRza2lwIGJ5IFxpdGVtaW5kZW50ICUKLVxleGRlbnRhbW91bnQ9XGl0ZW1pbmRlbnQKLVxwYXJpbmRlbnQgPSAwcHQgJQotXHBhcnNraXAgPSBcc21hbGxza2lwYW1vdW50ICUKLVxpZmRpbSBccGFyc2tpcD0wcHQgXHBhcnNraXA9MnB0IFxmaSUKLVxkZWYjMntcZW5kZ3JhZlxhZnRlcmVudmJyZWFrXGVuZGdyb3VwfSUKLVxkZWZcaXRlbWNvbnRlbnRzeyMxfSUKLVxsZXRcaXRlbT1caXRlbWl6ZWl0ZW19Ci0KLSUgU2V0IHNmY29kZSB0byBub3JtYWwgZm9yIHRoZSBjaGFycyB0aGF0IHVzdWFsbHkgaGF2ZSBhbm90aGVyIHZhbHVlLgotJSBUaGVzZSBhcmUgYC4/ITo7LCcKLVxkZWZcZnJlbmNoc3BhY2luZ3tcc2Zjb2RlNDY9MTAwMCBcc2Zjb2RlNjM9MTAwMCBcc2Zjb2RlMzM9MTAwMAotICBcc2Zjb2RlNTg9MTAwMCBcc2Zjb2RlNTk9MTAwMCBcc2Zjb2RlNDQ9MTAwMCB9Ci0KLSUgXHNwbGl0b2ZmIFRPS0VOU1xlbmRtYXJrIGRlZmluZXMgXGZpcnN0IHRvIGJlIHRoZSBmaXJzdCB0b2tlbiBpbgotJSBUT0tFTlMsIGFuZCBccmVzdCB0byBiZSB0aGUgcmVtYWluZGVyLgotJQotXGRlZlxzcGxpdG9mZiMxIzJcZW5kbWFya3tcZGVmXGZpcnN0eyMxfVxkZWZccmVzdHsjMn19JQotCi0lIEFsbG93IGFuIG9wdGlvbmFsIGFyZ3VtZW50IG9mIGFuIHVwcGVyY2FzZSBsZXR0ZXIsIGxvd2VyY2FzZSBsZXR0ZXIsCi0lIG9yIG51bWJlciwgdG8gc3BlY2lmeSB0aGUgZmlyc3QgbGFiZWwgaW4gdGhlIGVudW1lcmF0ZWQgbGlzdC4gIE5vCi0lIGFyZ3VtZW50IGlzIHRoZSBzYW1lIGFzIGAxJy4KLSUKLVxkZWZcZW51bWVyYXRle1xwYXJzZWFyZ1xlbnVtZXJhdGV6enp9Ci1cZGVmXGVudW1lcmF0ZXp6eiAjMXtcZW51bWVyYXRleSAjMSAgXGVuZGVudW1lcmF0ZXl9Ci1cZGVmXGVudW1lcmF0ZXkgIzEgIzJcZW5kZW51bWVyYXRleXslCi0gIFxiZWdpbmdyb3VwICUgZW5kZWQgYnkgdGhlIEBlbmQgZW51bWVyYXRlCi0gICUKLSAgJSBJZiB3ZSB3ZXJlIGdpdmVuIG5vIGFyZ3VtZW50LCBwcmV0ZW5kIHdlIHdlcmUgZ2l2ZW4gYDEnLgotICBcZGVmXHRoZWFyZ3sjMX0lCi0gIFxpZnhcdGhlYXJnXGVtcHR5IFxkZWZcdGhlYXJnezF9XGZpCi0gICUKLSAgJSBEZXRlY3QgaWYgdGhlIGFyZ3VtZW50IGlzIGEgc2luZ2xlIHRva2VuLiAgSWYgc28sIGl0IG1pZ2h0IGJlIGEKLSAgJSBsZXR0ZXIuICBPdGhlcndpc2UsIHRoZSBvbmx5IHZhbGlkIHRoaW5nIGl0IGNhbiBiZSBpcyBhIG51bWJlci4KLSAgJSAoV2Ugd2lsbCBhbHdheXMgaGF2ZSBvbmUgdG9rZW4sIGJlY2F1c2Ugb2YgdGhlIHRlc3Qgd2UganVzdCBtYWRlLgotICAlIFRoaXMgaXMgYSBnb29kIHRoaW5nLCBzaW5jZSBcc3BsaXRvZmYgZG9lc24ndCB3b3JrIGdpdmVuIG5vdGhpbmcgYXQKLSAgJSBhbGwgLS0gdGhlIGZpcnN0IHBhcmFtZXRlciBpcyB1bmRlbGltaXRlZC4pCi0gIFxleHBhbmRhZnRlclxzcGxpdG9mZlx0aGVhcmdcZW5kbWFyawotICBcaWZ4XHJlc3RcZW1wdHkKLSAgICAlIE9ubHkgb25lIHRva2VuIGluIHRoZSBhcmd1bWVudC4gIEl0IGNvdWxkIHN0aWxsIGJlIGFueXRoaW5nLgotICAgICUgQSBgYGxvd2VyY2FzZSBsZXR0ZXInJyBpcyBvbmUgd2hvc2UgXGxjY29kZSBpcyBub256ZXJvLgotICAgICUgQW4gYGB1cHBlcmNhc2UgbGV0dGVyJycgaXMgb25lIHdob3NlIFxsY2NvZGUgaXMgYm90aCBub256ZXJvLCBhbmQKLSAgICAlICAgbm90IGVxdWFsIHRvIGl0c2VsZi4KLSAgICAlIE90aGVyd2lzZSwgd2UgYXNzdW1lIGl0J3MgYSBudW1iZXIuCi0gICAgJQotICAgICUgV2UgbmVlZCB0aGUgXHJlbGF4IGF0IHRoZSBlbmQgb2YgdGhlIFxpZm51bSBsaW5lcyB0byBzdG9wIFRlWCBmcm9tCi0gICAgJSBjb250aW51aW5nIHRvIGxvb2sgZm9yIGEgPG51bWJlcj4uCi0gICAgJQotICAgIFxpZm51bVxsY2NvZGVcZXhwYW5kYWZ0ZXJgXHRoZWFyZz0wXHJlbGF4Ci0gICAgICBcbnVtZXJpY2VudW1lcmF0ZSAlIGEgbnVtYmVyICh3ZSBob3BlKQotICAgIFxlbHNlCi0gICAgICAlIEl0J3MgYSBsZXR0ZXIuCi0gICAgICBcaWZudW1cbGNjb2RlXGV4cGFuZGFmdGVyYFx0aGVhcmc9XGV4cGFuZGFmdGVyYFx0aGVhcmdccmVsYXgKLSAgICAgICAgXGxvd2VyY2FzZWVudW1lcmF0ZSAlIGxvd2VyY2FzZSBsZXR0ZXIKLSAgICAgIFxlbHNlCi0gICAgICAgIFx1cHBlcmNhc2VlbnVtZXJhdGUgJSB1cHBlcmNhc2UgbGV0dGVyCi0gICAgICBcZmkKLSAgICBcZmkKLSAgXGVsc2UKLSAgICAlIE11bHRpcGxlIHRva2VucyBpbiB0aGUgYXJndW1lbnQuICBXZSBob3BlIGl0J3MgYSBudW1iZXIuCi0gICAgXG51bWVyaWNlbnVtZXJhdGUKLSAgXGZpCi19Ci0KLSUgQW4gQGVudW1lcmF0ZSB3aG9zZSBsYWJlbHMgYXJlIGludGVnZXJzLiAgVGhlIHN0YXJ0aW5nIGludGVnZXIgaXMKLSUgZ2l2ZW4gaW4gXHRoZWFyZy4KLSUKLVxkZWZcbnVtZXJpY2VudW1lcmF0ZXslCi0gIFxpdGVtbm8gPSBcdGhlYXJnCi0gIFxzdGFydGVudW1lcmF0aW9ue1x0aGVcaXRlbW5vfSUKLX0KLQotJSBUaGUgc3RhcnRpbmcgKGxvd2VyY2FzZSkgbGV0dGVyIGlzIGluIFx0aGVhcmcuCi1cZGVmXGxvd2VyY2FzZWVudW1lcmF0ZXslCi0gIFxpdGVtbm8gPSBcZXhwYW5kYWZ0ZXJgXHRoZWFyZwotICBcc3RhcnRlbnVtZXJhdGlvbnslCi0gICAgJSBCZSBzdXJlIHdlJ3JlIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYWxwaGFiZXQuCi0gICAgXGlmbnVtXGl0ZW1ubz0wCi0gICAgICBcZXJybWVzc2FnZXtObyBtb3JlIGxvd2VyY2FzZSBsZXR0ZXJzIGluIEBlbnVtZXJhdGU7IGdldCBhIGJpZ2dlcgotICAgICAgICAgICAgICAgICAgYWxwaGFiZXR9JQotICAgIFxmaQotICAgIFxjaGFyXGxjY29kZVxpdGVtbm8KLSAgfSUKLX0KLQotJSBUaGUgc3RhcnRpbmcgKHVwcGVyY2FzZSkgbGV0dGVyIGlzIGluIFx0aGVhcmcuCi1cZGVmXHVwcGVyY2FzZWVudW1lcmF0ZXslCi0gIFxpdGVtbm8gPSBcZXhwYW5kYWZ0ZXJgXHRoZWFyZwotICBcc3RhcnRlbnVtZXJhdGlvbnslCi0gICAgJSBCZSBzdXJlIHdlJ3JlIG5vdCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYWxwaGFiZXQuCi0gICAgXGlmbnVtXGl0ZW1ubz0wCi0gICAgICBcZXJybWVzc2FnZXtObyBtb3JlIHVwcGVyY2FzZSBsZXR0ZXJzIGluIEBlbnVtZXJhdGU7IGdldCBhIGJpZ2dlcgotICAgICAgICAgICAgICAgICAgYWxwaGFiZXR9Ci0gICAgXGZpCi0gICAgXGNoYXJcdWNjb2RlXGl0ZW1ubwotICB9JQotfQotCi0lIENhbGwgaXRlbWl6ZXksIGFkZGluZyBhIHBlcmlvZCB0byB0aGUgZmlyc3QgYXJndW1lbnQgYW5kIHN1cHBseWluZyB0aGUKLSUgY29tbW9uIGxhc3QgdHdvIGFyZ3VtZW50cy4gIEFsc28gc3VidHJhY3Qgb25lIGZyb20gdGhlIGluaXRpYWwgdmFsdWUgaW4KLSUgXGl0ZW1ubywgc2luY2UgQGl0ZW0gaW5jcmVtZW50cyBcaXRlbW5vLgotJQotXGRlZlxzdGFydGVudW1lcmF0aW9uIzF7JQotICBcYWR2YW5jZVxpdGVtbm8gYnkgLTEKLSAgXGl0ZW1pemV5eyMxLn1cRWVudW1lcmF0ZVxmbHVzaGNyCi19Ci0KLSUgQGFscGhhZW51bWVyYXRlIGFuZCBAY2Fwc2VudW1lcmF0ZSBhcmUgYWJicmV2aWF0aW9ucyBmb3IgZ2l2aW5nIGFuIGFyZwotJSB0byBAZW51bWVyYXRlLgotJQotXGRlZlxhbHBoYWVudW1lcmF0ZXtcZW51bWVyYXRle2F9fQotXGRlZlxjYXBzZW51bWVyYXRle1xlbnVtZXJhdGV7QX19Ci1cZGVmXEVhbHBoYWVudW1lcmF0ZXtcRWVudW1lcmF0ZX0KLVxkZWZcRWNhcHNlbnVtZXJhdGV7XEVlbnVtZXJhdGV9Ci0KLSUgRGVmaW5pdGlvbiBvZiBAaXRlbSB3aGlsZSBpbnNpZGUgQGl0ZW1pemUuCi0KLVxkZWZcaXRlbWl6ZWl0ZW17JQotXGFkdmFuY2VcaXRlbW5vIGJ5IDEKLXtcbGV0XHBhcj1cZW5kZ3JhZiBcc21hbGxicmVha30lCi1caWZobW9kZSBcZXJybWVzc2FnZXtJbiBobW9kZSBhdCBpdGVtaXplaXRlbX1cZmkKLXtccGFyc2tpcD0waW4gXGhza2lwIDBwdAotXGhib3ggdG8gMHB0e1xoc3MgXGl0ZW1jb250ZW50c1xoc2tpcCBcaXRlbW1hcmdpbn0lCi1cdmFkanVzdHtccGVuYWx0eSAxMjAwfX0lCi1cZmx1c2hjcn0KLQotJSBAbXVsdGl0YWJsZSBtYWNyb3MKLSUgQW15IEhlbmRyaWNrc29uLCA4LzE4Lzk0LCAzLzYvOTYKLSUKLSUgQG11bHRpdGFibGUgLi4uIEBlbmQgbXVsdGl0YWJsZSB3aWxsIG1ha2UgYXMgbWFueSBjb2x1bW5zIGFzIGRlc2lyZWQuCi0lIENvbnRlbnRzIG9mIGVhY2ggY29sdW1uIHdpbGwgd3JhcCBhdCB3aWR0aCBnaXZlbiBpbiBwcmVhbWJsZS4gIFdpZHRoCi0lIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIHdpdGggc2FtcGxlIHRleHQgZ2l2ZW4gaW4gYSB0ZW1wbGF0ZSBsaW5lLAotJSBvciBpbiBwZXJjZW50IG9mIFxoc2l6ZSwgdGhlIGN1cnJlbnQgd2lkdGggb2YgdGV4dCBvbiBwYWdlLgotCi0lIFRhYmxlIGNhbiBjb250aW51ZSBvdmVyIHBhZ2VzIGJ1dCB3aWxsIG9ubHkgYnJlYWsgYmV0d2VlbiBsaW5lcy4KLQotJSBUbyBtYWtlIHByZWFtYmxlOgotJQotJSBFaXRoZXIgZGVmaW5lIHdpZHRocyBvZiBjb2x1bW5zIGluIHRlcm1zIG9mIHBlcmNlbnQgb2YgXGhzaXplOgotJSAgIEBtdWx0aXRhYmxlIEBjb2x1bW5mcmFjdGlvbnMgLjI1IC4zIC40NQotJSAgIEBpdGVtIC4uLgotJQotJSAgIE51bWJlcnMgZm9sbG93aW5nIEBjb2x1bW5mcmFjdGlvbnMgYXJlIHRoZSBwZXJjZW50IG9mIHRoZSB0b3RhbAotJSAgIGN1cnJlbnQgaHNpemUgdG8gYmUgdXNlZCBmb3IgZWFjaCBjb2x1bW4uIFlvdSBtYXkgdXNlIGFzIG1hbnkKLSUgICBjb2x1bW5zIGFzIGRlc2lyZWQuCi0KLQotJSBPciB1c2UgYSB0ZW1wbGF0ZToKLSUgICBAbXVsdGl0YWJsZSB7Q29sdW1uIDEgdGVtcGxhdGV9IHtDb2x1bW4gMiB0ZW1wbGF0ZX0ge0NvbHVtbiAzIHRlbXBsYXRlfQotJSAgIEBpdGVtIC4uLgotJSAgIHVzaW5nIHRoZSB3aWRlc3QgdGVybSBkZXNpcmVkIGluIGVhY2ggY29sdW1uLgotJQotJSBGb3IgdGhvc2Ugd2hvIHdhbnQgdG8gdXNlIG1vcmUgdGhhbiBvbmUgbGluZSdzIHdvcnRoIG9mIHdvcmRzIGluCi0lIHRoZSBwcmVhbWJsZSwgYnJlYWsgdGhlIGxpbmUgd2l0aGluIG9uZSBhcmd1bWVudCBhbmQgaXQKLSUgd2lsbCBwYXJzZSBjb3JyZWN0bHksIGkuZS4sCi0lCi0lICAgICBAbXVsdGl0YWJsZSB7Q29sdW1uIDEgdGVtcGxhdGV9IHtDb2x1bW4gMiB0ZW1wbGF0ZX0ge0NvbHVtbiAzCi0lICAgICAgdGVtcGxhdGV9Ci0lIE5vdDoKLSUgICAgIEBtdWx0aXRhYmxlIHtDb2x1bW4gMSB0ZW1wbGF0ZX0ge0NvbHVtbiAyIHRlbXBsYXRlfQotJSAgICAgIHtDb2x1bW4gMyB0ZW1wbGF0ZX0KLQotJSBFYWNoIG5ldyB0YWJsZSBsaW5lIHN0YXJ0cyB3aXRoIEBpdGVtLCBlYWNoIHN1YnNlcXVlbnQgbmV3IGNvbHVtbgotJSBzdGFydHMgd2l0aCBAdGFiLiBFbXB0eSBjb2x1bW5zIG1heSBiZSBwcm9kdWNlZCBieSBzdXBwbHlpbmcgQHRhYidzCi0lIHdpdGggbm90aGluZyBiZXR3ZWVuIHRoZW0gZm9yIGFzIG1hbnkgdGltZXMgYXMgZW1wdHkgY29sdW1ucyBhcmUgbmVlZGVkLAotJSBpZSwgQHRhYkB0YWJAdGFiIHdpbGwgcHJvZHVjZSB0d28gZW1wdHkgY29sdW1ucy4KLQotJSBAaXRlbSwgQHRhYiwgQG11bHRpdGFibGUgb3IgQGVuZCBtdWx0aXRhYmxlIGRvIG5vdCBuZWVkIHRvIGJlIG9uIHRoZWlyCi0lIG93biBsaW5lcywgYnV0IGl0IHdpbGwgbm90IGh1cnQgaWYgdGhleSBhcmUuCi0KLSUgU2FtcGxlIG11bHRpdGFibGU6Ci0KLSUgICBAbXVsdGl0YWJsZSB7Q29sdW1uIDEgdGVtcGxhdGV9IHtDb2x1bW4gMiB0ZW1wbGF0ZX0ge0NvbHVtbiAzIHRlbXBsYXRlfQotJSAgIEBpdGVtIGZpcnN0IGNvbCBzdHVmZiBAdGFiIHNlY29uZCBjb2wgc3R1ZmYgQHRhYiB0aGlyZCBjb2wKLSUgICBAaXRlbQotJSAgIGZpcnN0IGNvbCBzdHVmZgotJSAgIEB0YWIKLSUgICBzZWNvbmQgY29sIHN0dWZmCi0lICAgQHRhYgotJSAgIHRoaXJkIGNvbAotJSAgIEBpdGVtIGZpcnN0IGNvbCBzdHVmZiBAdGFiIHNlY29uZCBjb2wgc3R1ZmYKLSUgICBAdGFiIE1hbnkgcGFyYWdyYXBocyBvZiB0ZXh0IG1heSBiZSB1c2VkIGluIGFueSBjb2x1bW4uCi0lCi0lICAgICAgICAgVGhleSB3aWxsIHdyYXAgYXQgdGhlIHdpZHRoIGRldGVybWluZWQgYnkgdGhlIHRlbXBsYXRlLgotJSAgIEBpdGVtQHRhYkB0YWIgVGhpcyB3aWxsIGJlIGluIHRoaXJkIGNvbHVtbi4KLSUgICBAZW5kIG11bHRpdGFibGUKLQotJSBEZWZhdWx0IGRpbWVuc2lvbnMgbWF5IGJlIHJlc2V0IGJ5IHVzZXIuCi0lIEBtdWx0aXRhYmxlcGFyc2tpcCBpcyB2ZXJ0aWNhbCBzcGFjZSBiZXR3ZWVuIHBhcmFncmFwaHMgaW4gdGFibGUuCi0lIEBtdWx0aXRhYmxlcGFyaW5kZW50IGlzIHBhcmFncmFwaCBpbmRlbnQgaW4gdGFibGUuCi0lIEBtdWx0aXRhYmxlY29sbWFyZ2luIGlzIGhvcml6b250YWwgc3BhY2UgdG8gYmUgbGVmdCBiZXR3ZWVuIGNvbHVtbnMuCi0lIEBtdWx0aXRhYmxlbGluZXNwYWNlIGlzIHNwYWNlIHRvIGxlYXZlIGJldHdlZW4gdGFibGUgaXRlbXMsIGJhc2VsaW5lCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmFzZWxpbmUuCi0lICAgMHB0IG1lYW5zIGl0IGRlcGVuZHMgb24gY3VycmVudCBub3JtYWwgbGluZSBzcGFjaW5nLgotJQotXG5ld3NraXBcbXVsdGl0YWJsZXBhcnNraXAKLVxuZXdza2lwXG11bHRpdGFibGVwYXJpbmRlbnQKLVxuZXdkaW1lblxtdWx0aXRhYmxlY29sc3BhY2UKLVxuZXdza2lwXG11bHRpdGFibGVsaW5lc3BhY2UKLVxtdWx0aXRhYmxlcGFyc2tpcD0wcHQKLVxtdWx0aXRhYmxlcGFyaW5kZW50PTZwdAotXG11bHRpdGFibGVjb2xzcGFjZT0xMnB0Ci1cbXVsdGl0YWJsZWxpbmVzcGFjZT0wcHQKLQotJSBNYWNyb3MgdXNlZCB0byBzZXQgdXAgaGFsaWduIHByZWFtYmxlOgotJSAKLVxsZXRcZW5kc2V0dXB0YWJsZVxyZWxheAotXGRlZlx4ZW5kc2V0dXB0YWJsZXtcZW5kc2V0dXB0YWJsZX0KLVxsZXRcY29sdW1uZnJhY3Rpb25zXHJlbGF4Ci1cZGVmXHhjb2x1bW5mcmFjdGlvbnN7XGNvbHVtbmZyYWN0aW9uc30KLVxuZXdpZlxpZnNldHBlcmNlbnQKLQotJSAyLzEvOTYsIHRvIGFsbG93IGZyYWN0aW9ucyB0byBiZSBnaXZlbiB3aXRoIG1vcmUgdGhhbiBvbmUgZGlnaXQuCi1cZGVmXHBpY2t1cHdob2xlZnJhY3Rpb24jMSB7XGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5MSAlCi1cZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWV7LiMxXGhzaXplfSUKLVxzZXR1cHRhYmxlfQotCi1cbmV3Y291bnRcY29sY291bnQKLVxkZWZcc2V0dXB0YWJsZSMxe1xkZWZcZmlyc3Rhcmd7IzF9JQotXGlmeFxmaXJzdGFyZ1x4ZW5kc2V0dXB0YWJsZVxsZXRcZ29ccmVsYXglCi1cZWxzZQotICBcaWZ4XGZpcnN0YXJnXHhjb2x1bW5mcmFjdGlvbnNcZ2xvYmFsXHNldHBlcmNlbnR0cnVlJQotICBcZWxzZQotICAgIFxpZnNldHBlcmNlbnQKLSAgICAgICBcbGV0XGdvXHBpY2t1cHdob2xlZnJhY3Rpb24gICAlIEluIHRoaXMgY2FzZSBhcmcgb2Ygc2V0dXB0YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgaXMgdGhlIGRlY2ltYWwgcG9pbnQgYmVmb3JlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgbnVtYmVyIGdpdmVuIGluIHBlcmNlbnQgb2YgaHNpemUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBXZSBkb24ndCBuZWVkIHRoaXMgc28gd2UgZG9uJ3QgdXNlIGl0LgotICAgIFxlbHNlCi0gICAgICAgXGdsb2JhbFxhZHZhbmNlXGNvbGNvdW50IGJ5MQotICAgICAgIFxzZXRib3gwPVxoYm94eyMxIH0lIEFkZCBhIG5vcm1hbCB3b3JkIHNwYWNlIGFzIGEgc2VwYXJhdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAlIHR5cGljYWxseSB0aGF0IGlzIGFsd2F5cyBpbiB0aGUgaW5wdXQsIGFueXdheS4KLSAgICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWV7XHRoZVx3ZDB9JQotICAgIFxmaSUKLSAgXGZpJQotXGlmeFxnb1xwaWNrdXB3aG9sZWZyYWN0aW9uXGVsc2VcbGV0XGdvXHNldHVwdGFibGVcZmklCi1cZmlcZ299Ci0KLSUgbXVsdGl0YWJsZSBzeW50YXgKLVxkZWZcdGFieyZcaHNraXAxc3BccmVsYXh9ICUgMi8yLzk2Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAlIHRpbnkgc2tpcCBoZXJlIG1ha2VzIHN1cmUgdGhpcyBjb2x1bW4gc3BhY2UgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICUgbWFpbnRhaW5lZCwgZXZlbiBpZiBpdCBpcyBuZXZlciB1c2VkLgotCi0lIEBtdWx0aXRhYmxlIC4uLiBAZW5kIG11bHRpdGFibGUgZGVmaW5pdGlvbnM6Ci0KLVxkZWZcbXVsdGl0YWJsZXtccGFyc2VhcmdcZG90YWJsZX0KLVxkZWZcZG90YWJsZSMxe1xiZ3JvdXAKLSAgXHZza2lwXHBhcnNraXAKLSAgXGxldFxpdGVtXGNyY3IKLSAgXHRvbGVyYW5jZT05NTAwCi0gIFxoYmFkbmVzcz05NTAwCi0gIFxzZXRtdWx0aXRhYmxlc3BhY2luZwotICBccGFyc2tpcD1cbXVsdGl0YWJsZXBhcnNraXAKLSAgXHBhcmluZGVudD1cbXVsdGl0YWJsZXBhcmluZGVudAotICBcb3ZlcmZ1bGxydWxlPTBwdAotICBcZ2xvYmFsXGNvbGNvdW50PTAKLSAgXGRlZlxFbXVsdGl0YWJsZXtcZ2xvYmFsXHNldHBlcmNlbnRmYWxzZVxjclxlZ3JvdXBcZWdyb3VwfSUKLSAgJQotICAlIFRvIHBhcnNlIGV2ZXJ5dGhpbmcgYmV0d2VlbiBAbXVsdGl0YWJsZSBhbmQgQGl0ZW06Ci0gIFxzZXR1cHRhYmxlIzEgXGVuZHNldHVwdGFibGUKLSAgJQotICAlIFxldmVyeWNyIHdpbGwgcmVzZXQgY29sdW1uIGNvdW50ZXIsIFxjb2xjb3VudCwgYXQgdGhlIGVuZCBvZgotICAlIGVhY2ggbGluZS4gRXZlcnkgY29sdW1uIGVudHJ5IHdpbGwgY2F1c2UgXGNvbGNvdW50IHRvIGFkdmFuY2UgYnkgb25lLgotICAlIFRoZSB0YWJsZSBwcmVhbWJsZQotICAlIGxvb2tzIGF0IHRoZSBjdXJyZW50IFxjb2xjb3VudCB0byBmaW5kIHRoZSBjb3JyZWN0IGNvbHVtbiB3aWR0aC4KLSAgXGV2ZXJ5Y3J7XG5vYWxpZ257JQotICAlCi0gICUgXGZpbGJyZWFrJSUga2VlcHMgdW5kZXJmdWxsIGJveCBtZXNzYWdlcyBvZmYgd2hlbiB0YWJsZSBicmVha3Mgb3ZlciBwYWdlcy4KLSAgJSBNYXliZSBzbywgYnV0IGl0IGFsc28gY3JlYXRlcyByZWFsbHkgd2VpcmQgcGFnZSBicmVha3Mgd2hlbiB0aGUgdGFibGUKLSAgJSBicmVha3Mgb3ZlciBwYWdlcy4gV291bGRuJ3QgXHZmaWwgYmUgYmV0dGVyPyAgV2FpdCB1bnRpbCB0aGUgcHJvYmxlbQotICAlIG1hbmlmZXN0cyBpdHNlbGYsIHNvIGl0IGNhbiBiZSBmaXhlZCBmb3IgcmVhbCAtLWthcmwuCi0gICAgXGdsb2JhbFxjb2xjb3VudD0wXHJlbGF4fX0lCi0gICUKLSAgJSBUaGlzIHByZWFtYmxlIHNldHMgdXAgYSBnZW5lcmljIGNvbHVtbiBkZWZpbml0aW9uLCB3aGljaCB3aWxsCi0gICUgYmUgdXNlZCBhcyBtYW55IHRpbWVzIGFzIHVzZXIgY2FsbHMgZm9yIGNvbHVtbnMuCi0gICUgXHZ0b3Agd2lsbCBzZXQgYSBzaW5nbGUgbGluZSBhbmQgd2lsbCBhbHNvIGxldCB0ZXh0IHdyYXAgYW5kCi0gICUgY29udGludWUgZm9yIG1hbnkgcGFyYWdyYXBocyBpZiBkZXNpcmVkLgotICBcaGFsaWduXGJncm91cCZcZ2xvYmFsXGFkdmFuY2VcY29sY291bnQgYnkgMVxyZWxheAotICAgIFxtdWx0aXN0cnV0XHZ0b3B7XGhzaXplPVxleHBhbmRhZnRlclxjc25hbWUgY29sXHRoZVxjb2xjb3VudFxlbmRjc25hbWUKLSAgJQotICAlIEluIG9yZGVyIHRvIGtlZXAgZW50cmllcyBmcm9tIGJ1bXBpbmcgaW50byBlYWNoIG90aGVyCi0gICUgd2Ugd2lsbCBhZGQgYSBcbGVmdHNraXAgb2YgXG11bHRpdGFibGVjb2xzcGFjZSB0byBhbGwgY29sdW1ucyBhZnRlcgotICAlIHRoZSBmaXJzdCBvbmUuCi0gICUgCi0gICUgSWYgYSB0ZW1wbGF0ZSBoYXMgYmVlbiB1c2VkLCB3ZSB3aWxsIGFkZCBcbXVsdGl0YWJsZWNvbHNwYWNlCi0gICUgdG8gdGhlIHdpZHRoIG9mIGVhY2ggdGVtcGxhdGUgZW50cnkuCi0gICUgCi0gICUgSWYgdGhlIHVzZXIgaGFzIHNldCBwcmVhbWJsZSBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZSB3ZSB3aWxsCi0gICUgdXNlIHRoYXQgZGltZW5zaW9uIGFzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uLCBhbmQgdGhlIFxsZWZ0c2tpcAotICAlIHdpbGwga2VlcCBlbnRyaWVzIGZyb20gYnVtcGluZyBpbnRvIGVhY2ggb3RoZXIuICBUYWJsZSB3aWxsIHN0YXJ0IGF0Ci0gICUgbGVmdCBtYXJnaW4gYW5kIGZpbmFsIGNvbHVtbiB3aWxsIGp1c3RpZnkgYXQgcmlnaHQgbWFyZ2luLgotICAlIAotICAlIE1ha2Ugc3VyZSB3ZSBkb24ndCBpbmhlcml0IFxyaWdodHNraXAgZnJvbSB0aGUgb3V0ZXIgZW52aXJvbm1lbnQuCi0gIFxyaWdodHNraXA9MHB0Ci0gIFxpZm51bVxjb2xjb3VudD0xCi0gICAgJSBUaGUgZmlyc3QgY29sdW1uIHdpbGwgYmUgaW5kZW50ZWQgd2l0aCB0aGUgc3Vycm91bmRpbmcgdGV4dC4KLSAgICBcYWR2YW5jZVxoc2l6ZSBieVxsZWZ0c2tpcAotICBcZWxzZQotICAgIFxpZnNldHBlcmNlbnQgXGVsc2UKLSAgICAgICUgSWYgdXNlciBoYXMgbm90IHNldCBwcmVhbWJsZSBpbiB0ZXJtcyBvZiBwZXJjZW50IG9mIFxoc2l6ZQotICAgICAgJSB3ZSB3aWxsIGFkdmFuY2UgXGhzaXplIGJ5IFxtdWx0aXRhYmxlY29sc3BhY2UuCi0gICAgICBcYWR2YW5jZVxoc2l6ZSBieSBcbXVsdGl0YWJsZWNvbHNwYWNlCi0gICAgXGZpCi0gICAlIEluIGVpdGhlciBjYXNlIHdlIHdpbGwgbWFrZSBcbGVmdHNraXA9XG11bHRpdGFibGVjb2xzcGFjZToKLSAgXGxlZnRza2lwPVxtdWx0aXRhYmxlY29sc3BhY2UKLSAgXGZpCi0gICUgSWdub3Jpbmcgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIGF2b2lkcyBhbiBvY2Nhc2lvbmFsIHNwdXJpb3VzCi0gICUgYmxhbmsgbGluZSwgd2hlbiBUZVggZGVjaWRlcyB0byBicmVhayB0aGUgbGluZSBhdCB0aGUgc3BhY2UgYmVmb3JlIHRoZQotICAlIGJveCBmcm9tIHRoZSBtdWx0aXN0cnV0LCBzbyB0aGUgc3RydXQgZW5kcyB1cCBvbiBhIGxpbmUgYnkgaXRzZWxmLgotICAlIEZvciBleGFtcGxlOgotICAlIEBtdWx0aXRhYmxlIEBjb2x1bW5mcmFjdGlvbnMgLjExIC44OQotICAlIEBpdGVtIEBjb2RleyN9Ci0gICUgQHRhYiBMZWdhbCBob2xpZGF5IHdoaWNoIGlzIHZhbGlkIGluIG1ham9yIHBhcnRzIG9mIHRoZSB3aG9sZSBjb3VudHJ5LgotICAlIElzIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQgd2l0aCBoaWdobGlnaHRpbmcgc2VxdWVuY2VzIHJlc3BlY3RpdmVseSBtYXJraW5nCi0gICUgY2hhcmFjdGVycy4KLSAgXG5vaW5kZW50XGlnbm9yZXNwYWNlcyMjXHVuc2tpcFxtdWx0aXN0cnV0fVxjcgotfQotCi1cZGVmXHNldG11bHRpdGFibGVzcGFjaW5neyUgdGVzdCB0byBzZWUgaWYgdXNlciBoYXMgc2V0IFxtdWx0aXRhYmxlbGluZXNwYWNlLgotJSBJZiBzbywgZG8gbm90aGluZy4gSWYgbm90LCBnaXZlIGl0IGFuIGFwcHJvcHJpYXRlIGRpbWVuc2lvbiBiYXNlZCBvbgotJSBjdXJyZW50IGJhc2VsaW5lc2tpcC4KLVxpZmRpbVxtdWx0aXRhYmxlbGluZXNwYWNlPTBwdAotJSUgc3RydXQgdG8gcHV0IGluIHRhYmxlIGluIGNhc2Ugc29tZSBlbnRyeSBkb2Vzbid0IGhhdmUgZGVzY2VuZGVycywKLSUlIHRvIGtlZXAgbGluZXMgZXF1YWxseSBzcGFjZWQKLVxsZXRcbXVsdGlzdHJ1dCA9IFxzdHJ1dAotJSUgVGVzdCB0byBzZWUgaWYgcGFyc2tpcCBpcyBsYXJnZXIgdGhhbiBzcGFjZSBiZXR3ZWVuIGxpbmVzIG9mCi0lJSB0YWJsZS4gSWYgbm90LCBkbyBub3RoaW5nLgotJSUgICAgICAgIElmIHNvLCBzZXQgdG8gc2FtZSBkaW1lbnNpb24gYXMgbXVsdGl0YWJsZWxpbmVzcGFjZS4KLVxlbHNlCi1cZ2RlZlxtdWx0aXN0cnV0e1x2cnVsZSBoZWlnaHRcbXVsdGl0YWJsZWxpbmVzcGFjZSBkZXB0aFxkcDAKLXdpZHRoMHB0XHJlbGF4fSBcZmkKLVxpZmRpbVxtdWx0aXRhYmxlcGFyc2tpcD5cbXVsdGl0YWJsZWxpbmVzcGFjZQotXGdsb2JhbFxtdWx0aXRhYmxlcGFyc2tpcD1cbXVsdGl0YWJsZWxpbmVzcGFjZQotXGdsb2JhbFxhZHZhbmNlXG11bHRpdGFibGVwYXJza2lwLTdwdCAlJSB0byBrZWVwIHBhcnNraXAgc29tZXdoYXQgc21hbGxlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJSB0aGFuIHNraXAgYmV0d2VlbiBsaW5lcyBpbiB0aGUgdGFibGUuCi1cZmklCi1caWZkaW1cbXVsdGl0YWJsZXBhcnNraXA9MHB0Ci1cZ2xvYmFsXG11bHRpdGFibGVwYXJza2lwPVxtdWx0aXRhYmxlbGluZXNwYWNlCi1cZ2xvYmFsXGFkdmFuY2VcbXVsdGl0YWJsZXBhcnNraXAtN3B0ICUlIHRvIGtlZXAgcGFyc2tpcCBzb21ld2hhdCBzbWFsbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUlIHRoYW4gc2tpcCBiZXR3ZWVuIGxpbmVzIGluIHRoZSB0YWJsZS4KLVxmaX0KLQotCi1cbWVzc2FnZXtpbmRleGluZyx9Ci0lIEluZGV4IGdlbmVyYXRpb24gZmFjaWxpdGllcwotCi0lIERlZmluZSBcbmV3d3JpdGUgdG8gYmUgaWRlbnRpY2FsIHRvIHBsYWluIHRleCdzIFxuZXd3cml0ZQotJSBleGNlcHQgbm90IFxvdXRlciwgc28gaXQgY2FuIGJlIHVzZWQgd2l0aGluIFxuZXdpbmRleC4KLXtcY2F0Y29kZWBcQD0xMQotXGdkZWZcbmV3d3JpdGV7XGFsbG9jQDdcd3JpdGVcY2hhcmRlZlxzaXh0QEBufX0KLQotJSBcbmV3aW5kZXgge2Zvb30gZGVmaW5lcyBhbiBpbmRleCBuYW1lZCBmb28uCi0lIEl0IGF1dG9tYXRpY2FsbHkgZGVmaW5lcyBcZm9vaW5kZXggc3VjaCB0aGF0Ci0lIFxmb29pbmRleCAuLi5yZXN0IG9mIGxpbmUuLi4gcHV0cyBhbiBlbnRyeSBpbiB0aGUgaW5kZXggZm9vLgotJSBJdCBhbHNvIGRlZmluZXMgXGZvb2luZGZpbGUgdG8gYmUgdGhlIG51bWJlciBvZiB0aGUgb3V0cHV0IGNoYW5uZWwgZm9yCi0lIHRoZSBmaWxlIHRoYXQgYWNjdW11bGF0ZXMgdGhpcyBpbmRleC4gIFRoZSBmaWxlJ3MgZXh0ZW5zaW9uIGlzIGZvby4KLSUgVGhlIG5hbWUgb2YgYW4gaW5kZXggc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiAyIGNoYXJhY3RlcnMgbG9uZwotJSBmb3IgdGhlIHNha2Ugb2Ygdm1zLgotJQotXGRlZlxuZXdpbmRleCMxeyUKLSAgXGlmbGlua3MKLSAgICBcZXhwYW5kYWZ0ZXJcbmV3d3JpdGUgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKLSAgICBcb3Blbm91dCBcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZSBcam9ibmFtZS4jMSAlIE9wZW4gdGhlIGZpbGUKLSAgXGZpCi0gIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUgICAgICUgRGVmaW5lIEAjMWluZGV4Ci0gICAgXG5vZXhwYW5kXGRvaW5kZXh7IzF9fQotfQotCi0lIEBkZWZpbmRleCBmb28gID09ICBcbmV3aW5kZXh7Zm9vfQotCi1cZGVmXGRlZmluZGV4e1xwYXJzZWFyZ1xuZXdpbmRleH0KLQotJSBEZWZpbmUgQGRlZmNvZGVpbmRleCwgbGlrZSBAZGVmaW5kZXggZXhjZXB0IHB1dCBhbGwgZW50cmllcyBpbiBAY29kZS4KLQotXGRlZlxuZXdjb2RlaW5kZXgjMXslCi0gIFxpZmxpbmtzCi0gICAgXGV4cGFuZGFmdGVyXG5ld3dyaXRlIFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lCi0gICAgXG9wZW5vdXQgXGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUgXGpvYm5hbWUuIzEKLSAgXGZpCi0gIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUKLSAgICBcbm9leHBhbmRcZG9jb2RlaW5kZXh7IzF9fQotfQotCi1cZGVmXGRlZmNvZGVpbmRleHtccGFyc2VhcmdcbmV3Y29kZWluZGV4fQotCi0lIEBzeW5pbmRleCBmb28gYmFyICAgIG1ha2VzIGluZGV4IGZvbyBmZWVkIGludG8gaW5kZXggYmFyLgotJSBEbyB0aGlzIGluc3RlYWQgb2YgQGRlZmluZGV4IGZvbyBpZiB5b3UgZG9uJ3Qgd2FudCBpdCBhcyBhIHNlcGFyYXRlIGluZGV4LgotJSBUaGUgXGNsb3Nlb3V0IGhlbHBzIHJlZHVjZSB1bm5lY2Vzc2FyeSBvcGVuIGZpbGVzOyB0aGUgbGltaXQgb24gdGhlCi0lIEFjb3JuIFJJU0MgT1MgaXMgYSBtZXJlIDE2IGZpbGVzLgotXGRlZlxzeW5pbmRleCMxICMyIHslCi0gIFxleHBhbmRhZnRlclxsZXRcZXhwYW5kYWZ0ZXJcc3luaW5kZXhmb29cZXhwYW5kYWZ0ZXI9XGNzbmFtZSMyaW5kZmlsZVxlbmRjc25hbWUKLSAgXGV4cGFuZGFmdGVyXGNsb3Nlb3V0XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWUKLSAgXGV4cGFuZGFmdGVyXGxldFxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1lPVxzeW5pbmRleGZvbwotICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWUjMWluZGV4XGVuZGNzbmFtZXslIGRlZmluZSBceHh4aW5kZXgKLSAgICBcbm9leHBhbmRcZG9pbmRleHsjMn19JQotfQotCi0lIEBzeW5jb2RlaW5kZXggZm9vIGJhciAgIHNpbWlsYXIsIGJ1dCBwdXQgYWxsIGVudHJpZXMgbWFkZSBmb3IgaW5kZXggZm9vCi0lIGluc2lkZSBAY29kZS4KLVxkZWZcc3luY29kZWluZGV4IzEgIzIgeyUKLSAgXGV4cGFuZGFmdGVyXGxldFxleHBhbmRhZnRlclxzeW5pbmRleGZvb1xleHBhbmRhZnRlcj1cY3NuYW1lIzJpbmRmaWxlXGVuZGNzbmFtZQotICBcZXhwYW5kYWZ0ZXJcY2xvc2VvdXRcY3NuYW1lIzFpbmRmaWxlXGVuZGNzbmFtZQotICBcZXhwYW5kYWZ0ZXJcbGV0XGNzbmFtZSMxaW5kZmlsZVxlbmRjc25hbWU9XHN5bmluZGV4Zm9vCi0gIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZSMxaW5kZXhcZW5kY3NuYW1leyUgZGVmaW5lIFx4eHhpbmRleAotICAgIFxub2V4cGFuZFxkb2NvZGVpbmRleHsjMn19JQotfQotCi0lIERlZmluZSBcZG9pbmRleCwgdGhlIGRyaXZlciBmb3IgYWxsIFxmb29pbmRleCBtYWNyb3MuCi0lIEFyZ3VtZW50ICMxIGlzIGdlbmVyYXRlZCBieSB0aGUgY2FsbGluZyBcZm9vaW5kZXggbWFjcm8sCi0lICBhbmQgaXQgaXMgImZvbyIsIHRoZSBuYW1lIG9mIHRoZSBpbmRleC4KLQotJSBcZG9pbmRleCBqdXN0IHVzZXMgXHBhcnNlYXJnOyBpdCBjYWxscyBcZG9pbmQgZm9yIHRoZSBhY3R1YWwgd29yay4KLSUgVGhpcyBpcyBiZWNhdXNlIFxkb2luZCBpcyBtb3JlIHVzZWZ1bCB0byBjYWxsIGZyb20gb3RoZXIgbWFjcm9zLgotCi0lIFRoZXJlIGlzIGFsc28gXGRvc3ViaW5kIHtpbmRleH17dG9waWN9e3N1YnRvcGljfQotJSB3aGljaCBtYWtlcyBhbiBlbnRyeSBpbiBhIHR3by1sZXZlbCBpbmRleCBzdWNoIGFzIHRoZSBvcGVyYXRpb24gaW5kZXguCi0KLVxkZWZcZG9pbmRleCMxe1xlZGVmXGluZGV4bmFtZXsjMX1ccGFyc2Vhcmdcc2luZ2xlaW5kZXhlcn0KLVxkZWZcc2luZ2xlaW5kZXhlciAjMXtcZG9pbmR7XGluZGV4bmFtZX17IzF9fQotCi0lIGxpa2UgdGhlIHByZXZpb3VzIHR3bywgYnV0IHRoZXkgcHV0IEBjb2RlIGFyb3VuZCB0aGUgYXJndW1lbnQuCi1cZGVmXGRvY29kZWluZGV4IzF7XGVkZWZcaW5kZXhuYW1leyMxfVxwYXJzZWFyZ1xzaW5nbGVjb2RlaW5kZXhlcn0KLVxkZWZcc2luZ2xlY29kZWluZGV4ZXIgIzF7XGRvaW5ke1xpbmRleG5hbWV9e1xjb2RleyMxfX19Ci0KLVxkZWZcaW5kZXhkdW1taWVzeyUKLVxkZWZcIHsgfSUKLSUgVGFrZSBjYXJlIG9mIHRoZSBwbGFpbiB0ZXggYWNjZW50IGNvbW1hbmRzLgotXGRlZlwie1xyZWFsYmFja3NsYXNoICJ9JQotXGRlZlxge1xyZWFsYmFja3NsYXNoIGB9JQotXGRlZlwne1xyZWFsYmFja3NsYXNoICd9JQotXGRlZlxee1xyZWFsYmFja3NsYXNoIF59JQotXGRlZlx+e1xyZWFsYmFja3NsYXNoIH59JQotXGRlZlw9e1xyZWFsYmFja3NsYXNoID19JQotXGRlZlxie1xyZWFsYmFja3NsYXNoIGJ9JQotXGRlZlxje1xyZWFsYmFja3NsYXNoIGN9JQotXGRlZlxke1xyZWFsYmFja3NsYXNoIGR9JQotXGRlZlx1e1xyZWFsYmFja3NsYXNoIHV9JQotXGRlZlx2e1xyZWFsYmFja3NsYXNoIHZ9JQotXGRlZlxIe1xyZWFsYmFja3NsYXNoIEh9JQotJSBUYWtlIGNhcmUgb2YgdGhlIHBsYWluIHRleCBzcGVjaWFsIEV1cm9wZWFuIG1vZGlmaWVkIGxldHRlcnMuCi1cZGVmXG9le1xyZWFsYmFja3NsYXNoIG9lfSUKLVxkZWZcYWV7XHJlYWxiYWNrc2xhc2ggYWV9JQotXGRlZlxhYXtccmVhbGJhY2tzbGFzaCBhYX0lCi1cZGVmXE9Fe1xyZWFsYmFja3NsYXNoIE9FfSUKLVxkZWZcQUV7XHJlYWxiYWNrc2xhc2ggQUV9JQotXGRlZlxBQXtccmVhbGJhY2tzbGFzaCBBQX0lCi1cZGVmXG97XHJlYWxiYWNrc2xhc2ggb30lCi1cZGVmXE97XHJlYWxiYWNrc2xhc2ggT30lCi1cZGVmXGx7XHJlYWxiYWNrc2xhc2ggbH0lCi1cZGVmXEx7XHJlYWxiYWNrc2xhc2ggTH0lCi1cZGVmXHNze1xyZWFsYmFja3NsYXNoIHNzfSUKLSUgVGFrZSBjYXJlIG9mIHRleGluZm8gY29tbWFuZHMgbGlrZWx5IHRvIGFwcGVhciBpbiBhbiBpbmRleCBlbnRyeS4KLSUgKE11c3QgYmUgYSB3YXkgdG8gYXZvaWQgZG9pbmcgZXhwYW5zaW9uIGF0IGFsbCwgYW5kIHRodXMgbm90IGhhdmUgdG8KLSUgbGFib3Jpb3VzbHkgbGlzdCBldmVyeSBzaW5nbGUgY29tbWFuZCBoZXJlLikKLVxkZWZcQHtAfSUgd2lsbCBiZSBAQCB3aGVuIHdlIHN3aXRjaCB0byBAIGFzIGVzY2FwZSBjaGFyLgotJVxsZXRceyA9IFxsYnJhY2VjbWQKLSVcbGV0XH0gPSBccmJyYWNlY21kCi1cZGVmXF97e1xyZWFsYmFja3NsYXNoIF99fSUKLVxkZWZcd3tccmVhbGJhY2tzbGFzaCB3IH0lCi1cZGVmXGJme1xyZWFsYmFja3NsYXNoIGJmIH0lCi0lXGRlZlxybXtccmVhbGJhY2tzbGFzaCBybSB9JQotXGRlZlxzbHtccmVhbGJhY2tzbGFzaCBzbCB9JQotXGRlZlxzZntccmVhbGJhY2tzbGFzaCBzZn0lCi1cZGVmXHR0e1xyZWFsYmFja3NsYXNoIHR0fSUKLVxkZWZcZ3Rye1xyZWFsYmFja3NsYXNoIGd0cn0lCi1cZGVmXGxlc3N7XHJlYWxiYWNrc2xhc2ggbGVzc30lCi1cZGVmXGhhdHtccmVhbGJhY2tzbGFzaCBoYXR9JQotXGRlZlxUZVh7XHJlYWxiYWNrc2xhc2ggVGVYfSUKLVxkZWZcZG90c3tccmVhbGJhY2tzbGFzaCBkb3RzIH0lCi1cZGVmXHJlc3VsdHtccmVhbGJhY2tzbGFzaCByZXN1bHR9JQotXGRlZlxlcXVpdntccmVhbGJhY2tzbGFzaCBlcXVpdn0lCi1cZGVmXGV4cGFuc2lvbntccmVhbGJhY2tzbGFzaCBleHBhbnNpb259JQotXGRlZlxwcmludHtccmVhbGJhY2tzbGFzaCBwcmludH0lCi1cZGVmXGVycm9ye1xyZWFsYmFja3NsYXNoIGVycm9yfSUKLVxkZWZccG9pbnR7XHJlYWxiYWNrc2xhc2ggcG9pbnR9JQotXGRlZlxjb3B5cmlnaHR7XHJlYWxiYWNrc2xhc2ggY29weXJpZ2h0fSUKLVxkZWZcdGNsb3NlIyMxe1xyZWFsYmFja3NsYXNoIHRjbG9zZSB7IyMxfX0lCi1cZGVmXGNvZGUjIzF7XHJlYWxiYWNrc2xhc2ggY29kZSB7IyMxfX0lCi1cZGVmXGRvdGxlc3MjIzF7XHJlYWxiYWNrc2xhc2ggZG90bGVzcyB7IyMxfX0lCi1cZGVmXHNhbXAjIzF7XHJlYWxiYWNrc2xhc2ggc2FtcCB7IyMxfX0lCi1cZGVmXCwjIzF7XHJlYWxiYWNrc2xhc2ggLHsjIzF9fSUKLVxkZWZcdCMjMXtccmVhbGJhY2tzbGFzaCB0IHsjIzF9fSUKLVxkZWZcciMjMXtccmVhbGJhY2tzbGFzaCByIHsjIzF9fSUKLVxkZWZcaSMjMXtccmVhbGJhY2tzbGFzaCBpIHsjIzF9fSUKLVxkZWZcYiMjMXtccmVhbGJhY2tzbGFzaCBiIHsjIzF9fSUKLVxkZWZcc2MjIzF7XHJlYWxiYWNrc2xhc2ggc2MgeyMjMX19JQotXGRlZlxjaXRlIyMxe1xyZWFsYmFja3NsYXNoIGNpdGUgeyMjMX19JQotXGRlZlxrZXkjIzF7XHJlYWxiYWNrc2xhc2gga2V5IHsjIzF9fSUKLVxkZWZcZmlsZSMjMXtccmVhbGJhY2tzbGFzaCBmaWxlIHsjIzF9fSUKLVxkZWZcdmFyIyMxe1xyZWFsYmFja3NsYXNoIHZhciB7IyMxfX0lCi1cZGVmXGtiZCMjMXtccmVhbGJhY2tzbGFzaCBrYmQgeyMjMX19JQotXGRlZlxkZm4jIzF7XHJlYWxiYWNrc2xhc2ggZGZuIHsjIzF9fSUKLVxkZWZcZW1waCMjMXtccmVhbGJhY2tzbGFzaCBlbXBoIHsjIzF9fSUKLSUKLSUgSGFuZGxlIHNvbWUgY2FzZXMgb2YgQHZhbHVlIC0tIHdoZXJlIHRoZSB2YXJpYWJsZSBuYW1lIGRvZXMgbm90Ci0lIGNvbnRhaW4gLSBvciBfLCBhbmQgdGhlIHZhbHVlIGRvZXMgbm90IGNvbnRhaW4gYW55Ci0lIChub24tZnVsbHktZXhwYW5kYWJsZSkgY29tbWFuZHMuCi1cbGV0XHZhbHVlID0gXGV4cGFuZGFibGV2YWx1ZQotJQotXHVuc2Vwc3BhY2VzCi19Ci0KLSUgSWYgYW4gaW5kZXggY29tbWFuZCBpcyB1c2VkIGluIGFuIEBleGFtcGxlIGVudmlyb25tZW50LCBhbnkgc3BhY2VzCi0lIHRoZXJlaW4gc2hvdWxkIGJlY29tZSByZWd1bGFyIHNwYWNlcyBpbiB0aGUgcmF3IGluZGV4IGZpbGUsIG5vdCB0aGUKLSUgZXhwYW5zaW9uIG9mIFx0aWUgKFxcbGVhdmV2bW9kZSBccGVuYWx0eSBcQE0gXCApLgote1xvYmV5c3BhY2VzCi0gXGdkZWZcdW5zZXBzcGFjZXN7XG9iZXlzcGFjZXNcbGV0ID1cc3BhY2V9fQotCi0lIFxpbmRleG5vZm9udHMgbm8tb3BzIGFsbCBmb250LWNoYW5nZSBjb21tYW5kcy4KLSUgVGhpcyBpcyB1c2VkIHdoZW4gb3V0cHV0dGluZyB0aGUgc3RyaW5ncyB0byBzb3J0IHRoZSBpbmRleCBieS4KLVxkZWZcaW5kZXhkdW1teWZvbnQjMXsjMX0KLVxkZWZcaW5kZXhkdW1teXRleHtUZVh9Ci1cZGVmXGluZGV4ZHVtbXlkb3Rzey4uLn0KLQotXGRlZlxpbmRleG5vZm9udHN7JQotJSBKdXN0IGlnbm9yZSBhY2NlbnRzLgotXGxldFwsPVxpbmRleGR1bW15Zm9udAotXGxldFwiPVxpbmRleGR1bW15Zm9udAotXGxldFxgPVxpbmRleGR1bW15Zm9udAotXGxldFwnPVxpbmRleGR1bW15Zm9udAotXGxldFxePVxpbmRleGR1bW15Zm9udAotXGxldFx+PVxpbmRleGR1bW15Zm9udAotXGxldFw9PVxpbmRleGR1bW15Zm9udAotXGxldFxiPVxpbmRleGR1bW15Zm9udAotXGxldFxjPVxpbmRleGR1bW15Zm9udAotXGxldFxkPVxpbmRleGR1bW15Zm9udAotXGxldFx1PVxpbmRleGR1bW15Zm9udAotXGxldFx2PVxpbmRleGR1bW15Zm9udAotXGxldFxIPVxpbmRleGR1bW15Zm9udAotXGxldFxkb3RsZXNzPVxpbmRleGR1bW15Zm9udAotJSBUYWtlIGNhcmUgb2YgdGhlIHBsYWluIHRleCBzcGVjaWFsIEV1cm9wZWFuIG1vZGlmaWVkIGxldHRlcnMuCi1cZGVmXG9le29lfSUKLVxkZWZcYWV7YWV9JQotXGRlZlxhYXthYX0lCi1cZGVmXE9Fe09FfSUKLVxkZWZcQUV7QUV9JQotXGRlZlxBQXtBQX0lCi1cZGVmXG97b30lCi1cZGVmXE97T30lCi1cZGVmXGx7bH0lCi1cZGVmXEx7TH0lCi1cZGVmXHNze3NzfSUKLVxsZXRcdz1caW5kZXhkdW1teWZvbnQKLVxsZXRcdD1caW5kZXhkdW1teWZvbnQKLVxsZXRccj1caW5kZXhkdW1teWZvbnQKLVxsZXRcaT1caW5kZXhkdW1teWZvbnQKLVxsZXRcYj1caW5kZXhkdW1teWZvbnQKLVxsZXRcZW1waD1caW5kZXhkdW1teWZvbnQKLVxsZXRcc3Ryb25nPVxpbmRleGR1bW15Zm9udAotXGxldFxjaXRlPVxpbmRleGR1bW15Zm9udAotXGxldFxzYz1caW5kZXhkdW1teWZvbnQKLSVEb24ndCBuby1vcCBcdHQsIHNpbmNlIGl0IGlzbid0IGEgdXNlci1sZXZlbCBjb21tYW5kCi0lIGFuZCBpcyB1c2VkIGluIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgYWN0aXZlIGNoYXJzIGxpa2UgPCwgPiwgfC4uLgotJVxsZXRcdHQ9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHRjbG9zZT1caW5kZXhkdW1teWZvbnQKLVxsZXRcY29kZT1caW5kZXhkdW1teWZvbnQKLVxsZXRcZmlsZT1caW5kZXhkdW1teWZvbnQKLVxsZXRcc2FtcD1caW5kZXhkdW1teWZvbnQKLVxsZXRca2JkPVxpbmRleGR1bW15Zm9udAotXGxldFxrZXk9XGluZGV4ZHVtbXlmb250Ci1cbGV0XHZhcj1caW5kZXhkdW1teWZvbnQKLVxsZXRcVGVYPVxpbmRleGR1bW15dGV4Ci1cbGV0XGRvdHM9XGluZGV4ZHVtbXlkb3RzCi1cZGVmXEB7QH0lCi19Ci0KLSUgVG8gZGVmaW5lIFxyZWFsYmFja3NsYXNoLCB3ZSBtdXN0IG1ha2UgXCBub3QgYmUgYW4gZXNjYXBlLgotJSBXZSBtdXN0IGZpcnN0IG1ha2UgYW5vdGhlciBjaGFyYWN0ZXIgKEApIGFuIGVzY2FwZQotJSBzbyB3ZSBkbyBub3QgYmVjb21lIHVuYWJsZSB0byBkbyBhIGRlZmluaXRpb24uCi0KLXtcY2F0Y29kZWBcQD0wIFxjYXRjb2RlYFxcPVxvdGhlcgotIEBnZGVmQHJlYWxiYWNrc2xhc2h7XH19Ci0KLVxsZXRcaW5kZXhiYWNrc2xhc2g9MCAgJW92ZXJyaWRkZW4gZHVyaW5nIFxwcmludGluZGV4LgotXGxldFxTRVRtYXJnaW5pbmRleD1ccmVsYXggJSBwdXQgaW5kZXggZW50cmllcyBpbiBtYXJnaW4gKHVuZG9jdW1lbnRlZCk/Ci0KLSUgRm9yIFxpZnggY29tcGFyaXNvbnMuCi1cZGVmXGVtcHR5bWFjcm97XGVtcHR5fQotCi0lIE1vc3QgaW5kZXggZW50cmllcyBnbyB0aHJvdWdoIGhlcmUsIGJ1dCBcZG9zdWJpbmQgaXMgdGhlIGdlbmVyYWwgY2FzZS4KLSUgCi1cZGVmXGRvaW5kIzEjMntcZG9zdWJpbmR7IzF9eyMyfVxlbXB0eX0KLQotJSBXb3JraG9yc2UgZm9yIGFsbCBcZm9vaW5kZXhlcy4KLSUgIzEgaXMgbmFtZSBvZiBpbmRleCwgIzIgaXMgc3R1ZmYgdG8gcHV0IHRoZXJlLCAjMyBpcyBzdWJlbnRyeSAtLQotJSBcZW1wdHkgaWYgY2FsbGVkIGZyb20gXGRvaW5kLCBhcyB3ZSB1c3VhbGx5IGFyZS4gIFRoZSBtYWluIGV4Y2VwdGlvbgotJSBpcyB3aXRoIGRlZnVucywgd2hpY2ggY2FsbCB1cyBkaXJlY3RseS4KLSUgCi1cZGVmXGRvc3ViaW5kIzEjMiMzeyUKLSAgJSBQdXQgdGhlIGluZGV4IGVudHJ5IGluIHRoZSBtYXJnaW4gaWYgZGVzaXJlZC4KLSAgXGlmeFxTRVRtYXJnaW5pbmRleFxyZWxheFxlbHNlCi0gICAgXGluc2VydFxtYXJnaW57XGhib3h7XHZydWxlIGhlaWdodDhwdCBkZXB0aDNwdCB3aWR0aDBwdCAjMn19JQotICBcZmkKLSAgeyUKLSAgICBcY291bnQyNTU9XGxhc3RwZW5hbHR5Ci0gICAgeyUKLSAgICAgIFxpbmRleGR1bW1pZXMgJSBNdXN0IGRvIHRoaXMgaGVyZSwgc2luY2UgXGJmLCBldGMgZXhwYW5kIGF0IHRoaXMgc3RhZ2UKLSAgICAgIFxlc2NhcGVjaGFyPWBcXAotICAgICAgeyUKLSAgICAgICAgXGxldFxmb2xpbyA9IDAlIFdlIHdpbGwgZXhwYW5kIGFsbCBtYWNyb3Mgbm93IEVYQ0VQVCBcZm9saW8uCi0gICAgICAgIFxkZWZccmF3YmFja3NsYXNoeHh7XGluZGV4YmFja3NsYXNofSUgXGluZGV4YmFja3NsYXNoIGlzbid0IGRlZmluZWQgbm93Ci0gICAgICAgICUgc28gaXQgd2lsbCBiZSBvdXRwdXQgYXMgaXM7IGFuZCBpdCB3aWxsIHByaW50IGFzIGJhY2tzbGFzaC4KLSAgICAgICAgJQotICAgICAgICBcZGVmXHRoaXJkYXJneyMzfSUKLSAgICAgICAgJQotICAgICAgICAlIElmIHRoaXJkIGFyZyBpcyBwcmVzZW50LCBwcmVjZWRlIGl0IHdpdGggc3BhY2UgaW4gc29ydCBrZXkuCi0gICAgICAgIFxpZnhcdGhpcmRhcmdcZW1wdHltYWNybwotICAgICAgICAgIFxsZXRcc3ViZW50cnkgPSBcZW1wdHkKLSAgICAgICAgXGVsc2UKLSAgICAgICAgICBcZGVmXHN1YmVudHJ5eyAjM30lCi0gICAgICAgIFxmaQotICAgICAgICAlCi0gICAgICAgICUgRmlyc3QgcHJvY2VzcyB0aGUgaW5kZXgtc3RyaW5nIHdpdGggYWxsIGZvbnQgY29tbWFuZHMgdHVybmVkIG9mZgotICAgICAgICAlIHRvIGdldCB0aGUgc3RyaW5nIHRvIHNvcnQgYnkuCi0gICAgICAgIHtcaW5kZXhub2ZvbnRzIFx4ZGVmXGluZGV4c29ydHRtcHsjMlxzdWJlbnRyeX19JQotICAgICAgICAlCi0gICAgICAgICUgTm93IHByb2R1Y2UgdGhlIGNvbXBsZXRlIGluZGV4IGVudHJ5LCB3aXRoIGJvdGggdGhlIHNvcnQga2V5IGFuZCB0aGUKLSAgICAgICAgJSBvcmlnaW5hbCB0ZXh0LCBpbmNsdWRpbmcgYW55IGZvbnQgY29tbWFuZHMuCi0gICAgICAgIFx0b2tzMCA9IHsjMn0lCi0gICAgICAgIFxlZGVmXHRlbXB7JQotICAgICAgICAgIFx3cml0ZVxjc25hbWUjMWluZGZpbGVcZW5kY3NuYW1leyUKLSAgICAgICAgICAgIFxyZWFsYmFja3NsYXNoIGVudHJ5e1xpbmRleHNvcnR0bXB9e1xmb2xpb317XHRoZVx0b2tzMH19JQotICAgICAgICB9JQotICAgICAgICAlCi0gICAgICAgICUgSWYgdGhpcmQgKHN1YmVudHJ5KSBhcmcgaXMgcHJlc2VudCwgYWRkIGl0IHRvIHRoZSBpbmRleCBzdHJpbmcuCi0gICAgICAgIFxpZnhcdGhpcmRhcmdcZW1wdHltYWNybyBcZWxzZQotICAgICAgICAgIFx0b2tzMCA9IHsjM30lCi0gICAgICAgICAgXGVkZWZcdGVtcHtcdGVtcHtcdGhlXHRva3MwfX0lCi0gICAgICAgIFxmaQotICAgICAgICAlCi0gICAgICAgICUgSWYgYSBza2lwIGlzIHRoZSBsYXN0IHRoaW5nIG9uIHRoZSBsaXN0IG5vdywgcHJlc2VydmUgaXQKLSAgICAgICAgJSBieSBiYWNraW5nIHVwIGJ5IFxsYXN0c2tpcCwgZG9pbmcgdGhlIFx3cml0ZSwgdGhlbiBpbnNlcnRpbmcKLSAgICAgICAgJSB0aGUgc2tpcCBhZ2Fpbi4gIE90aGVyd2lzZSwgdGhlIHdoYXRzaXQgZ2VuZXJhdGVkIGJ5IHRoZQotICAgICAgICAlIFx3cml0ZSB3aWxsIG1ha2UgXGxhc3Rza2lwIHplcm8uICBUaGUgcmVzdWx0IGlzIHRoYXQgc2VxdWVuY2VzCi0gICAgICAgICUgbGlrZSB0aGlzOgotICAgICAgICAlIEBlbmQgZGVmdW4KLSAgICAgICAgJSBAdGluZGV4IHdoYXRldmVyCi0gICAgICAgICUgQGRlZnVuIC4uLgotICAgICAgICAlIHdpbGwgaGF2ZSBleHRyYSBzcGFjZSBpbnNlcnRlZCwgYmVjYXVzZSB0aGUgXG1lZGJyZWFrIGluIHRoZQotICAgICAgICAlIHN0YXJ0IG9mIHRoZSBAZGVmdW4gd29uJ3Qgc2VlIHRoZSBza2lwIGluc2VydGVkIGJ5IHRoZSBAZW5kIG9mCi0gICAgICAgICUgdGhlIHByZXZpb3VzIGRlZnVuLgotICAgICAgICAlIAotICAgICAgICAlIEJ1dCBkb24ndCBkbyBhbnkgb2YgdGhpcyBpZiB3ZSdyZSBub3QgaW4gdmVydGljYWwgbW9kZS4gIFdlCi0gICAgICAgICUgZG9uJ3Qgd2FudCB0byBkbyBhIFx2c2tpcCBhbmQgcHJlbWF0dXJlbHkgZW5kIGEgcGFyYWdyYXBoLgotICAgICAgICAlIAotICAgICAgICAlIEF2b2lkIHBhZ2UgYnJlYWtzIGR1ZSB0byB0aGVzZSBleHRyYSBza2lwcywgdG9vLgotICAgICAgICAlIAotICAgICAgICBcaWZsaW5rcwotICAgICAgICAgIFxpZnZtb2RlCi0gICAgICAgICAgICBcc2tpcDAgPSBcbGFzdHNraXAKLSAgICAgICAgICAgIFxpZmRpbVxsYXN0c2tpcCA9IDBwdCBcZWxzZSBcbm9icmVha1x2c2tpcC1cbGFzdHNraXAgXGZpCi0gICAgICAgICAgXGZpCi0gICAgICAgICAgJQotICAgICAgICAgIFx0ZW1wICUgZG8gdGhlIHdyaXRlCi0gICAgICAgICAgJQotICAgICAgICAgICUgCi0gICAgICAgICAgXGlmdm1vZGUgXGlmZGltXHNraXAwID0gMHB0IFxlbHNlIFxub2JyZWFrXHZza2lwXHNraXAwIFxmaSBcZmkKLSAgICAgICAgXGZpCi0gICAgICB9JQotICAgIH0lCi0gICAgXHBlbmFsdHlcY291bnQyNTUKLSAgfSUKLX0KLQotJSBUaGUgaW5kZXggZW50cnkgd3JpdHRlbiBpbiB0aGUgZmlsZSBhY3R1YWxseSBsb29rcyBsaWtlCi0lICBcZW50cnkge3NvcnRzdHJpbmd9e3BhZ2V9e3RvcGljfQotJSBvcgotJSAgXGVudHJ5IHtzb3J0c3RyaW5nfXtwYWdlfXt0b3BpY317c3VidG9waWN9Ci0lIFRoZSB0ZXhpbmRleCBwcm9ncmFtIHJlYWRzIGluIHRoZXNlIGZpbGVzIGFuZCB3cml0ZXMgZmlsZXMKLSUgY29udGFpbmluZyB0aGVzZSBraW5kcyBvZiBsaW5lczoKLSUgIFxpbml0aWFsIHtjfQotJSAgICAgYmVmb3JlIHRoZSBmaXJzdCB0b3BpYyB3aG9zZSBpbml0aWFsIGlzIGMKLSUgIFxlbnRyeSB7dG9waWN9e3BhZ2VsaXN0fQotJSAgICAgZm9yIGEgdG9waWMgdGhhdCBpcyB1c2VkIHdpdGhvdXQgc3VidG9waWNzCi0lICBccHJpbWFyeSB7dG9waWN9Ci0lICAgICBmb3IgdGhlIGJlZ2lubmluZyBvZiBhIHRvcGljIHRoYXQgaXMgdXNlZCB3aXRoIHN1YnRvcGljcwotJSAgXHNlY29uZGFyeSB7c3VidG9waWN9e3BhZ2VsaXN0fQotJSAgICAgZm9yIGVhY2ggc3VidG9waWMuCi0KLSUgRGVmaW5lIHRoZSB1c2VyLWFjY2Vzc2libGUgaW5kZXhpbmcgY29tbWFuZHMKLSUgQGZpbmRleCwgQHZpbmRleCwgQGtpbmRleCwgQGNpbmRleC4KLQotXGRlZlxmaW5kZXgge1xmbmluZGV4fQotXGRlZlxraW5kZXgge1xreWluZGV4fQotXGRlZlxjaW5kZXgge1xjcGluZGV4fQotXGRlZlx2aW5kZXgge1x2cmluZGV4fQotXGRlZlx0aW5kZXgge1x0cGluZGV4fQotXGRlZlxwaW5kZXgge1xwZ2luZGV4fQotCi1cZGVmXGNpbmRleHN1YiB7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGNpbmRleHN1Yn0KLXtcb2JleWxpbmVzICUKLVxnZGVmXGNpbmRleHN1YiAiIzEiICMyXl5Ne1xlbmRncm91cCAlCi1cZG9zdWJpbmR7Y3B9eyMyfXsjMX19fQotCi0lIERlZmluZSB0aGUgbWFjcm9zIHVzZWQgaW4gZm9ybWF0dGluZyBvdXRwdXQgb2YgdGhlIHNvcnRlZCBpbmRleCBtYXRlcmlhbC4KLQotJSBAcHJpbnRpbmRleCBjYXVzZXMgYSBwYXJ0aWN1bGFyIGluZGV4ICh0aGUgPz9zIGZpbGUpIHRvIGdldCBwcmludGVkLgotJSBJdCBkb2VzIG5vdCBwcmludCBhbnkgY2hhcHRlciBoZWFkaW5nICh1c3VhbGx5IGFuIEB1bm51bWJlcmVkKS4KLSUKLVxkZWZccHJpbnRpbmRleHtccGFyc2VhcmdcZG9wcmludGluZGV4fQotXGRlZlxkb3ByaW50aW5kZXgjMXtcYmVnaW5ncm91cAotICBcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwezEwMDAwfSUKLSAgJQotICBcaW5kZXhmb250cyBccm0KLSAgXHRvbGVyYW5jZSA9IDk1MDAKLSAgXGluZGV4YnJlYWtzCi0gICUKLSAgJSBTZWUgaWYgdGhlIGluZGV4IGZpbGUgZXhpc3RzIGFuZCBpcyBub25lbXB0eS4KLSAgJSBDaGFuZ2UgY2F0Y29kZSBvZiBAIGhlcmUgc28gdGhhdCBpZiB0aGUgaW5kZXggZmlsZSBjb250YWlucwotICAlIFxpbml0aWFsIHtAfQotICAlIGFzIGl0cyBmaXJzdCBsaW5lLCBUZVggZG9lc24ndCBjb21wbGFpbiBhYm91dCBtaXNtYXRjaGVkIGJyYWNlcwotICAlIChiZWNhdXNlIGl0IHRoaW5rcyBAfSBpcyBhIGNvbnRyb2wgc2VxdWVuY2UpLgotICBcY2F0Y29kZWBcQCA9IDExCi0gIFxvcGVuaW4gMSBcam9ibmFtZS4jMXMKLSAgXGlmZW9mIDEKLSAgICAlIFxlbmRkb3VibGVjb2x1bW5zIGdldHMgY29uZnVzZWQgaWYgdGhlcmUgaXMgbm8gdGV4dCBpbiB0aGUgaW5kZXgsCi0gICAgJSBhbmQgaXQgbG9zZXMgdGhlIGNoYXB0ZXIgdGl0bGUgYW5kIHRoZSBhdXggZmlsZSBlbnRyaWVzIGZvciB0aGUKLSAgICAlIGluZGV4LiAgVGhlIGVhc2llc3Qgd2F5IHRvIHByZXZlbnQgdGhpcyBwcm9ibGVtIGlzIHRvIG1ha2Ugc3VyZQotICAgICUgdGhlcmUgaXMgc29tZSB0ZXh0LgotICAgIChJbmRleCBpcyBub25leGlzdGVudCkKLSAgXGVsc2UKLSAgICAlCi0gICAgJSBJZiB0aGUgaW5kZXggZmlsZSBleGlzdHMgYnV0IGlzIGVtcHR5LCB0aGVuIFxvcGVuaW4gbGVhdmVzIFxpZmVvZgotICAgICUgZmFsc2UuICBXZSBoYXZlIHRvIG1ha2UgVGVYIHRyeSB0byByZWFkIHNvbWV0aGluZyBmcm9tIHRoZSBmaWxlLCBzbwotICAgICUgaXQgY2FuIGRpc2NvdmVyIGlmIHRoZXJlIGlzIGFueXRoaW5nIGluIGl0LgotICAgIFxyZWFkIDEgdG8gXHRlbXAKLSAgICBcaWZlb2YgMQotICAgICAgKEluZGV4IGlzIGVtcHR5KQotICAgIFxlbHNlCi0gICAgICAlIEluZGV4IGZpbGVzIGFyZSBhbG1vc3QgVGV4aW5mbyBzb3VyY2UsIGJ1dCB3ZSB1c2UgXCBhcyB0aGUgZXNjYXBlCi0gICAgICAlIGNoYXJhY3Rlci4gIEl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgQCwgYnV0IHRoYXQncyB0b28gYmlnIGEgY2hhbmdlCi0gICAgICAlIHRvIG1ha2UgcmlnaHQgbm93LgotICAgICAgXGRlZlxpbmRleGJhY2tzbGFzaHtccmF3YmFja3NsYXNoeHh9JQotICAgICAgXGNhdGNvZGVgXFwgPSAwCi0gICAgICBcZXNjYXBlY2hhciA9IGBcXAotICAgICAgXGJlZ2luZG91YmxlY29sdW1ucwotICAgICAgXGlucHV0IFxqb2JuYW1lLiMxcwotICAgICAgXGVuZGRvdWJsZWNvbHVtbnMKLSAgICBcZmkKLSAgXGZpCi0gIFxjbG9zZWluIDEKLVxlbmRncm91cH0KLQotJSBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgYnkgdGhlIHNvcnRlZCBpbmRleCBmaWxlIGl0c2VsZi4KLSUgQ2hhbmdlIHRoZW0gdG8gY29udHJvbCB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5kZXguCi0KLVxkZWZcaW5pdGlhbCMxe3slCi0gICUgU29tZSBtaW5vciBmb250IGNoYW5nZXMgZm9yIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMuCi0gIFxsZXRcdGVudHQ9XHNlY3R0IFxsZXRcdHQ9XHNlY3R0IFxsZXRcc2Y9XHNlY3R0Ci0gICUKLSAgJSBSZW1vdmUgYW55IGdsdWUgd2UgbWF5IGhhdmUsIHdlJ2xsIGJlIGluc2VydGluZyBvdXIgb3duLgotICBccmVtb3ZlbGFzdHNraXAKLSAgJSAKLSAgJSBXZSBsaWtlIGJyZWFrcyBiZWZvcmUgdGhlIGluZGV4IGluaXRpYWxzLCBzbyBpbnNlcnQgYSBib251cy4KLSAgXHBlbmFsdHkgLTMwMAotICAlCi0gICUgVHlwZXNldCB0aGUgaW5pdGlhbC4gIE1ha2luZyB0aGlzIGFkZCB1cCB0byBhIHdob2xlIG51bWJlciBvZgotICAlIGJhc2VsaW5lc2tpcHMgaW5jcmVhc2VzIHRoZSBjaGFuY2Ugb2YgdGhlIGRvdHMgbGluaW5nIHVwIGZyb20gY29sdW1uCi0gICUgdG8gY29sdW1uLiAgSXQgc3RpbGwgd29uJ3Qgb2Z0ZW4gYmUgcGVyZmVjdCwgYmVjYXVzZSBvZiB0aGUgc3RyZXRjaAotICAlIHdlIG5lZWQgYmVmb3JlIGVhY2ggZW50cnksIGJ1dCBpdCdzIGJldHRlci4KLSAgJSAKLSAgJSBObyBzaHJpbmsgYmVjYXVzZSBpdCBjb25mdXNlcyBcYmFsYW5jZWNvbHVtbnMuCi0gIFx2c2tpcCAxLjY3XGJhc2VsaW5lc2tpcCBwbHVzIC41XGJhc2VsaW5lc2tpcAotICBcbGVmdGxpbmV7XHNlY2JmICMxfSUKLSAgXHZza2lwIC4zM1xiYXNlbGluZXNraXAgcGx1cyAuMVxiYXNlbGluZXNraXAKLSAgJQotICAlIERvIG91ciBiZXN0IG5vdCB0byBicmVhayBhZnRlciB0aGUgaW5pdGlhbC4KLSAgXG5vYnJlYWsKLX19Ci0KLSUgVGhpcyB0eXBlc2V0cyBhIHBhcmFncmFwaCBjb25zaXN0aW5nIG9mICMxLCBkb3QgbGVhZGVycywgYW5kIHRoZW4gIzIKLSUgZmx1c2ggdG8gdGhlIHJpZ2h0IG1hcmdpbi4gIEl0IGlzIHVzZWQgZm9yIGluZGV4IGFuZCB0YWJsZSBvZiBjb250ZW50cwotJSBlbnRyaWVzLiAgVGhlIHBhcmFncmFwaCBpcyBpbmRlbnRlZCBieSBcbGVmdHNraXAuCi0lCi1cZGVmXGVudHJ5IzEjMntcYmVnaW5ncm91cAotICAlCi0gICUgU3RhcnQgYSBuZXcgcGFyYWdyYXBoIGlmIG5lY2Vzc2FyeSwgc28gb3VyIGFzc2lnbm1lbnRzIGJlbG93IGNhbid0Ci0gICUgYWZmZWN0IHByZXZpb3VzIHRleHQuCi0gIFxwYXIKLSAgJQotICAlIERvIG5vdCBmaWxsIG91dCB0aGUgbGFzdCBsaW5lIHdpdGggd2hpdGUgc3BhY2UuCi0gIFxwYXJmaWxsc2tpcCA9IDBpbgotICAlCi0gICUgTm8gZXh0cmEgc3BhY2UgYWJvdmUgdGhpcyBwYXJhZ3JhcGguCi0gIFxwYXJza2lwID0gMGluCi0gICUKLSAgJSBEbyBub3QgcHJlZmVyIGEgc2VwYXJhdGUgbGluZSBlbmRpbmcgd2l0aCBhIGh5cGhlbiB0byBmZXdlciBsaW5lcy4KLSAgXGZpbmFsaHlwaGVuZGVtZXJpdHMgPSAwCi0gICUKLSAgJSBcaGFuZ2luZGVudCBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdGhlIGVudHJ5IHRleHQgYW5kIHBhZ2UgbnVtYmVyCi0gICUgZG9uJ3QgYm90aCBmaXQgb24gb25lIGxpbmUuICBJbiB0aGF0IGNhc2UsIGJvYiBzdWdnZXN0cyBzdGFydGluZyB0aGUKLSAgJSBkb3RzIHByZXR0eSBmYXIgb3ZlciBvbiB0aGUgbGluZS4gIFVuZm9ydHVuYXRlbHksIGEgbGFyZ2UKLSAgJSBpbmRlbnRhdGlvbiBsb29rcyB3cm9uZyB3aGVuIHRoZSBlbnRyeSB0ZXh0IGl0c2VsZiBpcyBicm9rZW4gYWNyb3NzCi0gICUgbGluZXMuICBTbyB3ZSB1c2UgYSBzbWFsbCBpbmRlbnRhdGlvbiBhbmQgcHV0IHVwIHdpdGggbG9uZyBsZWFkZXJzLgotICAlCi0gICUgXGhhbmdhZnRlciBpcyByZXNldCB0byAxICh3aGljaCBpcyB0aGUgdmFsdWUgd2Ugd2FudCkgYXQgdGhlIHN0YXJ0Ci0gICUgb2YgZWFjaCBwYXJhZ3JhcGgsIHNvIHdlIG5lZWQgbm90IGRvIGFueXRoaW5nIHdpdGggdGhhdC4KLSAgXGhhbmdpbmRlbnQgPSAyZW0KLSAgJQotICAlIFdoZW4gdGhlIGVudHJ5IHRleHQgbmVlZHMgdG8gYmUgYnJva2VuLCBqdXN0IGZpbGwgb3V0IHRoZSBmaXJzdCBsaW5lCi0gICUgd2l0aCBibGFuayBzcGFjZS4KLSAgXHJpZ2h0c2tpcCA9IDBwdCBwbHVzMWZpbAotICAlCi0gICUgQSBiaXQgb2Ygc3RyZXRjaCBiZWZvcmUgZWFjaCBlbnRyeSBmb3IgdGhlIGJlbmVmaXQgb2YgYmFsYW5jaW5nIGNvbHVtbnMuCi0gIFx2c2tpcCAwcHQgcGx1czFwdAotICAlCi0gICUgU3RhcnQgYSBgYHBhcmFncmFwaCcnIGZvciB0aGUgaW5kZXggZW50cnkgc28gdGhlIGxpbmUgYnJlYWtpbmcKLSAgJSBwYXJhbWV0ZXJzIHdlJ3ZlIHNldCBhYm92ZSB3aWxsIGhhdmUgYW4gZWZmZWN0LgotICBcbm9pbmRlbnQKLSAgJQotICAlIEluc2VydCB0aGUgdGV4dCBvZiB0aGUgaW5kZXggZW50cnkuICBUZVggd2lsbCBkbyBsaW5lLWJyZWFraW5nIG9uIGl0LgotICAjMSUKLSAgJSBUaGUgZm9sbG93aW5nIGlzIGtsdWRnZWQgdG8gbm90IG91dHB1dCBhIGxpbmUgb2YgZG90cyBpbiB0aGUgaW5kZXggaWYKLSAgJSB0aGVyZSBhcmUgbm8gcGFnZSBudW1iZXJzLiAgVGhlIG5leHQgcGVyc29uIHdobyBicmVha3MgdGhpcyB3aWxsIGJlCi0gICUgY3Vyc2VkIGJ5IGEgVW5peCBkYWVtb24uCi0gIFxkZWZcdGVtcGF7e1xybSB9fSUKLSAgXGRlZlx0ZW1wYnsjMn0lCi0gIFxlZGVmXHRlbXBje1x0ZW1wYX0lCi0gIFxlZGVmXHRlbXBke1x0ZW1wYn0lCi0gIFxpZnhcdGVtcGNcdGVtcGRcIFxlbHNlJQotICAgICUKLSAgICAlIElmIHdlIG11c3QsIHB1dCB0aGUgcGFnZSBudW1iZXIgb24gYSBsaW5lIG9mIGl0cyBvd24sIGFuZCBmaWxsIG91dAotICAgICUgdGhpcyBsaW5lIHdpdGggYmxhbmsgc3BhY2UuICAoVGhlIFxoZmlsIGlzIG92ZXJ3aGVsbWVkIHdpdGggdGhlCi0gICAgJSBmaWxsIGxlYWRlcnMgZ2x1ZSBpbiBcaW5kZXhkb3RmaWxsIGlmIHRoZSBwYWdlIG51bWJlciBkb2VzIGZpdC4pCi0gICAgXGhmaWxccGVuYWx0eTUwCi0gICAgXG51bGxcbm9icmVha1xpbmRleGRvdGZpbGwgJSBIYXZlIGxlYWRlcnMgYmVmb3JlIHRoZSBwYWdlIG51bWJlci4KLSAgICAlCi0gICAgJSBUaGUgYFwgJyBoZXJlIGlzIHJlbW92ZWQgYnkgdGhlIGltcGxpY2l0IFx1bnNraXAgdGhhdCBUZVggZG9lcyBhcwotICAgICUgcGFydCBvZiAodGhlIHByaW1pdGl2ZSkgXHBhci4gIFdpdGhvdXQgaXQsIGEgc3B1cmlvdXMgdW5kZXJmdWxsCi0gICAgJSBcaGJveCBlbnN1ZXMuCi0gICAgXCAjMiUgVGhlIHBhZ2UgbnVtYmVyIGVuZHMgdGhlIHBhcmFncmFwaC4KLSAgXGZpJQotICBccGFyCi1cZW5kZ3JvdXB9Ci0KLSUgTGlrZSBcZG90ZmlsbCBleGNlcHQgdGFrZXMgYXQgbGVhc3QgMSBlbS4KLVxkZWZcaW5kZXhkb3RmaWxse1xjbGVhZGVycwotICBcaGJveHskXG1hdGhzdXJyb3VuZD0wcHQgXG1rZXJuMS41bXUgJHtcaXQgLn0kIFxta2VybjEuNW11JH1caHNraXAgMWVtIHBsdXMgMWZpbGx9Ci0KLVxkZWZccHJpbWFyeSAjMXtcbGluZXsjMVxoZmlsfX0KLQotXG5ld3NraXBcc2Vjb25kYXJ5aW5kZW50IFxzZWNvbmRhcnlpbmRlbnQ9MC41Y20KLQotXGRlZlxzZWNvbmRhcnkgIzEjMnsKLXtccGFyZmlsbHNraXA9MGluIFxwYXJza2lwPTBpbgotXGhhbmdpbmRlbnQgPTFpbiBcaGFuZ2FmdGVyPTEKLVxub2luZGVudFxoc2tpcFxzZWNvbmRhcnlpbmRlbnRcaGJveHsjMX1caW5kZXhkb3RmaWxsICMyXHBhcgotfX0KLQotJSBEZWZpbmUgdHdvLWNvbHVtbiBtb2RlLCB3aGljaCB3ZSB1c2UgdG8gdHlwZXNldCBpbmRleGVzLgotJSBBZGFwdGVkIGZyb20gdGhlIFRlWGJvb2ssIHBhZ2UgNDE2LCB3aGljaCBpcyB0byBzYXksCi0lIHRoZSBtYW5tYWMudGV4IGZvcm1hdCB1c2VkIHRvIHByaW50IHRoZSBUZVhib29rIGl0c2VsZi4KLVxjYXRjb2RlYFxAPTExCi0KLVxuZXdib3hccGFydGlhbHBhZ2UKLVxuZXdkaW1lblxkb3VibGVjb2x1bW5oc2l6ZQotCi1cZGVmXGJlZ2luZG91YmxlY29sdW1uc3tcYmVnaW5ncm91cCAlIGVuZGVkIGJ5IFxlbmRkb3VibGVjb2x1bW5zCi0gICUgR3JhYiBhbnkgc2luZ2xlLWNvbHVtbiBtYXRlcmlhbCBhYm92ZSB1cy4KLSAgXG91dHB1dCA9IHtcZ2xvYmFsXHNldGJveFxwYXJ0aWFscGFnZSA9IFx2Ym94eyUKLSAgICAlIAotICAgICUgSGVyZSBpcyBhIHBvc3NpYmlsaXR5IG5vdCBmb3Jlc2VlbiBpbiBtYW5tYWM6IGlmIHdlIGFjY3VtdWxhdGUgYQotICAgICUgd2hvbGUgbG90IG9mIG1hdGVyaWFsLCB3ZSBtaWdodCBlbmQgdXAgY2FsbGluZyB0aGlzIFxvdXRwdXQKLSAgICAlIHJvdXRpbmUgdHdpY2UgaW4gYSByb3cgKHNlZSB0aGUgZG91YmxlY29sLWxvc2UgdGVzdCwgd2hpY2ggaXMKLSAgICAlIGVzc2VudGlhbGx5IGEgY291cGxlIG9mIGluZGV4ZXMgd2l0aCBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb2ZmKS4gIEluCi0gICAgJSB0aGF0IGNhc2UsIHdlIG11c3QgcHJldmVudCB0aGUgc2Vjb25kIFxwYXJ0aWFscGFnZSBmcm9tCi0gICAgJSBzaW1wbHkgb3ZlcndyaXRpbmcgdGhlIGZpcnN0LCBjYXVzaW5nIHVzIHRvIGxvc2UgdGhlIHBhZ2UuCi0gICAgJSBUaGlzIHdpbGwgcHJlc2VydmUgaXQgdW50aWwgYSByZWFsIG91dHB1dCByb3V0aW5lIGNhbiBzaGlwIGl0Ci0gICAgJSBvdXQuICBHZW5lcmFsbHksIFxwYXJ0aWFscGFnZSB3aWxsIGJlIGVtcHR5IHdoZW4gdGhpcyBydW5zIGFuZAotICAgICUgdGhpcyB3aWxsIGJlIGEgbm8tb3AuCi0gICAgXHVudmJveFxwYXJ0aWFscGFnZQotICAgICUKLSAgICAlIFVudmJveCB0aGUgbWFpbiBvdXRwdXQgcGFnZS4KLSAgICBcdW52Ym94MjU1Ci0gICAgXGtlcm4tXHRvcHNraXAgXGtlcm5cYmFzZWxpbmVza2lwCi0gIH19JQotICBcZWplY3QKLSAgJQotICAlIFVzZSB0aGUgZG91YmxlLWNvbHVtbiBvdXRwdXQgcm91dGluZSBmb3Igc3Vic2VxdWVudCBwYWdlcy4KLSAgXG91dHB1dCA9IHtcZG91YmxlY29sdW1ub3V0fSUKLSAgJQotICAlIENoYW5nZSB0aGUgcGFnZSBzaXplIHBhcmFtZXRlcnMuICBXZSBjb3VsZCBkbyB0aGlzIG9uY2Ugb3V0c2lkZSB0aGlzCi0gICUgcm91dGluZSwgaW4gZWFjaCBvZiBAc21hbGxib29rLCBAYWZvdXJwYXBlciwgYW5kIHRoZSBkZWZhdWx0IDguNXgxMQotICAlIGZvcm1hdCwgYnV0IHRoZW4gd2UgcmVwZWF0IHRoZSBzYW1lIGNvbXB1dGF0aW9uLiAgUmVwZWF0aW5nIGEgY291cGxlCi0gICUgb2YgYXNzaWdubWVudHMgb25jZSBwZXIgaW5kZXggaXMgY2xlYXJseSBtZWFuaW5nbGVzcyBmb3IgdGhlCi0gICUgZXhlY3V0aW9uIHRpbWUsIHNvIHdlIG1heSBhcyB3ZWxsIGRvIGl0IGluIG9uZSBwbGFjZS4KLSAgJQotICAlIEZpcnN0IHdlIGhhbHZlIHRoZSBsaW5lIGxlbmd0aCwgbGVzcyBhIGxpdHRsZSBmb3IgdGhlIGd1dHRlciBiZXR3ZWVuCi0gICUgdGhlIGNvbHVtbnMuICBXZSBjb21wdXRlIHRoZSBndXR0ZXIgYmFzZWQgb24gdGhlIGxpbmUgbGVuZ3RoLCBzbyBpdAotICAlIGNoYW5nZXMgYXV0b21hdGljYWxseSB3aXRoIHRoZSBwYXBlciBmb3JtYXQuICBUaGUgbWFnaWMgY29uc3RhbnQKLSAgJSBiZWxvdyBpcyBjaG9zZW4gc28gdGhhdCB0aGUgZ3V0dGVyIGhhcyB0aGUgc2FtZSB2YWx1ZSAod2VsbCwgKy08MXB0KQotICAlIGFzIGl0IGRpZCB3aGVuIHdlIGhhcmQtY29kZWQgaXQuCi0gICUKLSAgJSBXZSBwdXQgdGhlIHJlc3VsdCBpbiBhIHNlcGFyYXRlIHJlZ2lzdGVyLCBcZG91YmxlY29sdW1oc2l6ZSwgc28gd2UKLSAgJSBjYW4gcmVzdG9yZSBpdCBpbiBccGFnZXNvZmFyLCBhZnRlciBcaHNpemUgaXRzZWxmIGhhcyAocG90ZW50aWFsbHkpCi0gICUgYmVlbiBjbG9iYmVyZWQuCi0gICUKLSAgXGRvdWJsZWNvbHVtbmhzaXplID0gXGhzaXplCi0gICAgXGFkdmFuY2VcZG91YmxlY29sdW1uaHNpemUgYnkgLS4wNDE1NFxoc2l6ZQotICAgIFxkaXZpZGVcZG91YmxlY29sdW1uaHNpemUgYnkgMgotICBcaHNpemUgPSBcZG91YmxlY29sdW1uaHNpemUKLSAgJQotICAlIERvdWJsZSB0aGUgXHZzaXplIGFzIHdlbGwuICAoV2UgZG9uJ3QgbmVlZCBhIHNlcGFyYXRlIHJlZ2lzdGVyIGhlcmUsCi0gICUgc2luY2Ugbm9ib2R5IGNsb2JiZXJzIFx2c2l6ZS4pCi0gIFxhZHZhbmNlXHZzaXplIGJ5IC1caHRccGFydGlhbHBhZ2UKLSAgXHZzaXplID0gMlx2c2l6ZQotfQotCi0lIFRoZSBkb3VibGUtY29sdW1uIG91dHB1dCByb3V0aW5lIGZvciBhbGwgZG91YmxlLWNvbHVtbiBwYWdlcyBleGNlcHQKLSUgdGhlIGxhc3QuCi0lIAotXGRlZlxkb3VibGVjb2x1bW5vdXR7JQotICBcc3BsaXR0b3Bza2lwPVx0b3Bza2lwIFxzcGxpdG1heGRlcHRoPVxtYXhkZXB0aAotICAlIEdldCB0aGUgYXZhaWxhYmxlIHNwYWNlIGZvciB0aGUgZG91YmxlIGNvbHVtbnMgLS0gdGhlIG5vcm1hbAotICAlICh1bmRvdWJsZWQpIHBhZ2UgaGVpZ2h0IG1pbnVzIGFueSBtYXRlcmlhbCBsZWZ0IG92ZXIgZnJvbSB0aGUKLSAgJSBwcmV2aW91cyBwYWdlLgotICBcZGltZW5AID0gXHZzaXplCi0gIFxkaXZpZGVcZGltZW5AIGJ5IDIKLSAgJQotICAlIGJveDAgd2lsbCBiZSB0aGUgbGVmdC1oYW5kIGNvbHVtbiwgYm94MiB0aGUgcmlnaHQuCi0gIFxzZXRib3gwPVx2c3BsaXQyNTUgdG9cZGltZW5AIFxzZXRib3gyPVx2c3BsaXQyNTUgdG9cZGltZW5ACi0gIFxvbmVwYWdlb3V0XHBhZ2Vzb2ZhcgotICBcdW52Ym94MjU1Ci0gIFxwZW5hbHR5XG91dHB1dHBlbmFsdHkKLX0KLVxkZWZccGFnZXNvZmFyeyUKLSAgJSBSZS1vdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBvdXRwdXQgcGFnZSAtLSBhbnkgcHJldmlvdXMgbWF0ZXJpYWwsCi0gICUgZm9sbG93ZWQgYnkgdGhlIHR3byBib3hlcyB3ZSBqdXN0IHNwbGl0LCBpbiBib3gwIGFuZCBib3gyLgotICBcYWR2YW5jZVx2c2l6ZSBieSBcaHRccGFydGlhbHBhZ2UKLSAgXHVudmJveFxwYXJ0aWFscGFnZQotICAlCi0gIFxoc2l6ZSA9IFxkb3VibGVjb2x1bW5oc2l6ZQotICBcd2QwPVxoc2l6ZSBcd2QyPVxoc2l6ZQotICBcaGJveCB0b1xwYWdld2lkdGh7XGJveDBcaGZpbFxib3gyfSUKLX0KLVxkZWZcZW5kZG91YmxlY29sdW1uc3slCi0gIFxvdXRwdXQgPSB7JQotICAgICUgU3BsaXQgdGhlIGxhc3Qgb2YgdGhlIGRvdWJsZS1jb2x1bW4gbWF0ZXJpYWwuICBMZWF2ZSBvbiB0aGUKLSAgICAlIGN1cnJlbnQgcGFnZSwgbm8gYXV0b21hdGljIHBhZ2UgYnJlYWsuCi0gICAgXGJhbGFuY2Vjb2x1bW5zCi0gICAgJQotICAgICUgSWYgd2UgZW5kIHVwIHNwbGl0dGluZyB0b28gbXVjaCBtYXRlcmlhbCBmb3IgdGhlIGN1cnJlbnQgcGFnZSwKLSAgICAlIHRob3VnaCwgdGhlcmUgd2lsbCBiZSBhbm90aGVyIHBhZ2UgYnJlYWsgcmlnaHQgYWZ0ZXIgdGhpcyBcb3V0cHV0Ci0gICAgJSBpbnZvY2F0aW9uIGVuZHMuICBIYXZpbmcgY2FsbGVkIFxiYWxhbmNlY29sdW1ucyBvbmNlLCB3ZSBkbyBub3QKLSAgICAlIHdhbnQgdG8gY2FsbCBpdCBhZ2Fpbi4gIFRoZXJlZm9yZSwgcmVzZXQgXG91dHB1dCB0byBpdHMgbm9ybWFsCi0gICAgJSBkZWZpbml0aW9uIHJpZ2h0IGF3YXkuICAoV2UgaG9wZSBcYmFsYW5jZWNvbHVtbnMgd2lsbCBuZXZlciBiZQotICAgICUgY2FsbGVkIG9uIHRvIGJhbGFuY2UgdG9vIG11Y2ggbWF0ZXJpYWwsIGJ1dCBpZiBpdCBpcywgdGhpcyBtYWtlcwotICAgICUgdGhlIG91dHB1dCBzb21ld2hhdCBtb3JlIHBhbGF0YWJsZS4pCi0gICAgXGdsb2JhbFxvdXRwdXQgPSB7XG9uZXBhZ2VvdXR7XHBhZ2Vjb250ZW50c1xQQUdFfX0lCi0gICAgJQotICAgICUgXHBhZ2Vnb2FsIHdhcyBzZXQgdG8gdGhlIGRvdWJsZWQgXHZzaXplIGFib3ZlLCBzaW5jZSB3ZSByZXN0YXJ0ZWQKLSAgICAlIHRoZSBjdXJyZW50IHBhZ2UuICBXZSdyZSBub3cgYmFjayB0byBub3JtYWwgc2luZ2xlLWNvbHVtbgotICAgICUgdHlwZXNldHRpbmcsIHNvIHJlc2V0IFxwYWdlZ29hbCB0byB0aGUgbm9ybWFsIFx2c2l6ZS4KLSAgICBccGFnZWdvYWwgPSBcdnNpemUKLSAgfSUKLSAgXGVqZWN0Ci0gIFxlbmRncm91cCAlIHN0YXJ0ZWQgaW4gXGJlZ2luZG91YmxlY29sdW1ucwotfQotXGRlZlxiYWxhbmNlY29sdW1uc3slCi0gICUgQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRvdWJsZSBjb2x1bW4gbWF0ZXJpYWwuCi0gIFxzZXRib3gwID0gXHZib3h7XHVudmJveDI1NX0lIGxpa2UgXGJveDI1NSBidXQgbW9yZSBlZmZpY2llbnQsIHNlZSBwLjEyMC4KLSAgXGRpbWVuQCA9IFxodDAKLSAgXGFkdmFuY2VcZGltZW5AIGJ5IFx0b3Bza2lwCi0gIFxhZHZhbmNlXGRpbWVuQCBieS1cYmFzZWxpbmVza2lwCi0gIFxkaXZpZGVcZGltZW5AIGJ5IDIgJSB0YXJnZXQgdG8gc3BsaXQgdG8KLSAgJWRlYnVnXG1lc3NhZ2V7ZmluYWwgMi1jb2x1bW4gbWF0ZXJpYWwgaGVpZ2h0PVx0aGVcaHQwLCB0YXJnZXQ9XHRoZVxkaW1lbkAufSUKLSAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCi0gICUgTG9vcCB1bnRpbCB3ZSBnZXQgYSBkZWNlbnQgYnJlYWtwb2ludC4KLSAgeyUKLSAgICBcdmJhZG5lc3MgPSAxMDAwMAotICAgIFxsb29wCi0gICAgICBcZ2xvYmFsXHNldGJveDMgPSBcY29weTAKLSAgICAgIFxnbG9iYWxcc2V0Ym94MSA9IFx2c3BsaXQzIHRvIFxkaW1lbkAKLSAgICBcaWZkaW1caHQzPlxkaW1lbkAKLSAgICAgIFxnbG9iYWxcYWR2YW5jZVxkaW1lbkAgYnkgMXB0Ci0gICAgXHJlcGVhdAotICB9JQotICAlZGVidWdcbWVzc2FnZXtzcGxpdCB0byBcdGhlXGRpbWVuQCwgY29sdW1uIGhlaWdodHM6IFx0aGVcaHQxLCBcdGhlXGh0My59JQotICBcc2V0Ym94MD1cdmJveCB0b1xkaW1lbkB7XHVudmJveDF9JQotICBcc2V0Ym94Mj1cdmJveCB0b1xkaW1lbkB7XHVudmJveDN9JQotICAlCi0gIFxwYWdlc29mYXIKLX0KLVxjYXRjb2RlYFxAID0gXG90aGVyCi0KLQotXG1lc3NhZ2V7c2VjdGlvbmluZyx9Ci0lIERlZmluZSBjaGFwdGVycywgc2VjdGlvbnMsIGV0Yy4KLQotXG5ld2NvdW50XGNoYXBubwotXG5ld2NvdW50XHNlY25vICAgICAgICBcc2Vjbm89MAotXG5ld2NvdW50XHN1YnNlY25vICAgICBcc3Vic2Vjbm89MAotXG5ld2NvdW50XHN1YnN1YnNlY25vICBcc3Vic3Vic2Vjbm89MAotCi0lIFRoaXMgY291bnRlciBpcyBmdW5ueSBzaW5jZSBpdCBjb3VudHMgdGhyb3VnaCBjaGFyY29kZXMgb2YgbGV0dGVycyBBLCBCLCAuLi4KLVxuZXdjb3VudFxhcHBlbmRpeG5vICBcYXBwZW5kaXhubyA9IGBcQAotXGRlZlxhcHBlbmRpeGxldHRlcntcY2hhclx0aGVcYXBwZW5kaXhub30KLQotJSBFYWNoIEBjaGFwdGVyIGRlZmluZXMgdGhpcyBhcyB0aGUgbmFtZSBvZiB0aGUgY2hhcHRlci4KLSUgcGFnZSBoZWFkaW5ncyBhbmQgZm9vdGluZ3MgY2FuIHVzZSBpdC4gIEBzZWN0aW9uIGRvZXMgbGlrZXdpc2UuCi1cZGVmXHRoaXNjaGFwdGVye30KLVxkZWZcdGhpc3NlY3Rpb257fQotCi1cbmV3Y291bnRcYWJzc2VjbGV2ZWwgJSB1c2VkIHRvIGNhbGN1bGF0ZSBwcm9wZXIgaGVhZGluZyBsZXZlbAotXG5ld2NvdW50XHNlY2Jhc2Vcc2VjYmFzZT0wICUgQHJhaXNlL2xvd2Vyc2VjdGlvbnMgbW9kaWZ5IHRoaXMgY291bnQKLQotJSBAcmFpc2VzZWN0aW9uczogdHJlYXQgQHNlY3Rpb24gYXMgY2hhcHRlciwgQHN1YnNlY3Rpb24gYXMgc2VjdGlvbiwgZXRjLgotXGRlZlxyYWlzZXNlY3Rpb25ze1xnbG9iYWxcYWR2YW5jZVxzZWNiYXNlIGJ5IC0xfQotXGxldFx1cD1ccmFpc2VzZWN0aW9ucyAlIG9yaWdpbmFsIEJGb3ggbmFtZQotCi0lIEBsb3dlcnNlY3Rpb25zOiB0cmVhdCBAY2hhcHRlciBhcyBzZWN0aW9uLCBAc2VjdGlvbiBhcyBzdWJzZWN0aW9uLCBldGMuCi1cZGVmXGxvd2Vyc2VjdGlvbnN7XGdsb2JhbFxhZHZhbmNlXHNlY2Jhc2UgYnkgMX0KLVxsZXRcZG93bj1cbG93ZXJzZWN0aW9ucyAlIG9yaWdpbmFsIEJGb3ggbmFtZQotCi0lIENob29zZSBhIG51bWJlcmVkLWhlYWRpbmcgbWFjcm8KLSUgIzEgaXMgaGVhZGluZyBsZXZlbCBpZiB1bm1vZGlmaWVkIGJ5IEByYWlzZXNlY3Rpb25zIG9yIEBsb3dlcnNlY3Rpb25zCi0lICMyIGlzIHRleHQgZm9yIGhlYWRpbmcKLVxkZWZcbnVtaGVhZCMxIzJ7XGFic3NlY2xldmVsPVxzZWNiYXNlXGFkdmFuY2VcYWJzc2VjbGV2ZWwgYnkgIzEKLVxpZmNhc2VcYWJzc2VjbGV2ZWwKLSAgXGNoYXB0ZXJ6enp7IzJ9Ci1cb3IKLSAgXHNlY3p6ensjMn0KLVxvcgotICBcbnVtYmVyZWRzdWJzZWN6enp7IzJ9Ci1cb3IKLSAgXG51bWJlcmVkc3Vic3Vic2Vjenp6eyMyfQotXGVsc2UKLSAgXGlmbnVtIFxhYnNzZWNsZXZlbDwwCi0gICAgXGNoYXB0ZXJ6enp7IzJ9Ci0gIFxlbHNlCi0gICAgXG51bWJlcmVkc3Vic3Vic2Vjenp6eyMyfQotICBcZmkKLVxmaQotfQotCi0lIGxpa2UgXG51bWhlYWQsIGJ1dCBjaG9vc2VzIGFwcGVuZGl4IGhlYWRpbmcgbGV2ZWxzCi1cZGVmXGFwcGhlYWQjMSMye1xhYnNzZWNsZXZlbD1cc2VjYmFzZVxhZHZhbmNlXGFic3NlY2xldmVsIGJ5ICMxCi1caWZjYXNlXGFic3NlY2xldmVsCi0gIFxhcHBlbmRpeHp6ensjMn0KLVxvcgotICBcYXBwZW5kaXhzZWN0aW9uenp6eyMyfQotXG9yCi0gIFxhcHBlbmRpeHN1YnNlY3p6ensjMn0KLVxvcgotICBcYXBwZW5kaXhzdWJzdWJzZWN6enp7IzJ9Ci1cZWxzZQotICBcaWZudW0gXGFic3NlY2xldmVsPDAKLSAgICBcYXBwZW5kaXh6enp7IzJ9Ci0gIFxlbHNlCi0gICAgXGFwcGVuZGl4c3Vic3Vic2Vjenp6eyMyfQotICBcZmkKLVxmaQotfQotCi0lIGxpa2UgXG51bWhlYWQsIGJ1dCBjaG9vc2VzIG51bWJlcmxlc3MgaGVhZGluZyBsZXZlbHMKLVxkZWZcdW5ubWhlYWQjMSMye1xhYnNzZWNsZXZlbD1cc2VjYmFzZVxhZHZhbmNlXGFic3NlY2xldmVsIGJ5ICMxCi1caWZjYXNlXGFic3NlY2xldmVsCi0gIFx1bm51bWJlcmVkenp6eyMyfQotXG9yCi0gIFx1bm51bWJlcmVkc2Vjenp6eyMyfQotXG9yCi0gIFx1bm51bWJlcmVkc3Vic2Vjenp6eyMyfQotXG9yCi0gIFx1bm51bWJlcmVkc3Vic3Vic2Vjenp6eyMyfQotXGVsc2UKLSAgXGlmbnVtIFxhYnNzZWNsZXZlbDwwCi0gICAgXHVubnVtYmVyZWR6enp7IzJ9Ci0gIFxlbHNlCi0gICAgXHVubnVtYmVyZWRzdWJzdWJzZWN6enp7IzJ9Ci0gIFxmaQotXGZpCi19Ci0KLSUgQGNoYXB0ZXIsIEBhcHBlbmRpeCwgQHVubnVtYmVyZWQuCi1cZGVmXHRoaXNjaGFwdGVybmFtZXtObyBDaGFwdGVyIFRpdGxlfQotXG91dGVyXGRlZlxjaGFwdGVye1xwYXJzZWFyZ1xjaGFwdGVyeXl5fQotXGRlZlxjaGFwdGVyeXl5ICMxe1xudW1oZWFkMHsjMX19ICUgbm9ybWFsbHkgbnVtaGVhZDAgY2FsbHMgY2hhcHRlcnp6egotXGRlZlxjaGFwdGVyenp6ICMxeyUKLVxzZWNubz0wIFxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wCi1cZ2xvYmFsXGFkdmFuY2UgXGNoYXBubyBieSAxIFxtZXNzYWdle1xwdXR3b3JkQ2hhcHRlclxzcGFjZSBcdGhlXGNoYXBub30lCi1cY2hhcG1hY3JvIHsjMX17XHRoZVxjaGFwbm99JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXGdkZWZcdGhpc2NoYXB0ZXJuYW1leyMxfSUKLSUgV2UgZG9uJ3Qgc3Vic3RpdHV0ZSB0aGUgYWN0dWFsIGNoYXB0ZXIgbmFtZSBpbnRvIFx0aGlzY2hhcHRlcgotJSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgaXRzIG1hY3JvcyBldmFsdWF0ZWQgbm93LgotXHhkZWZcdGhpc2NoYXB0ZXJ7XHB1dHdvcmRDaGFwdGVye30gXHRoZVxjaGFwbm86IFxub2V4cGFuZFx0aGlzY2hhcHRlcm5hbWV9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggY2hhcGVudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXGNoYXBub319fSUKLVx0ZW1wCi1cZG9ub2RlcmVmCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXG51bWJlcmVkc2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic2VjCi1cZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXG51bWJlcmVkc3Vic3Vic2VjCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXh7XHBhcnNlYXJnXGFwcGVuZGl4eXl5fQotXGRlZlxhcHBlbmRpeHl5eSAjMXtcYXBwaGVhZDB7IzF9fSAlIG5vcm1hbGx5IGFwcGhlYWQwIGNhbGxzIGFwcGVuZGl4enp6Ci1cZGVmXGFwcGVuZGl4enp6ICMxeyUKLVxzZWNubz0wIFxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wCi1cZ2xvYmFsXGFkdmFuY2UgXGFwcGVuZGl4bm8gYnkgMQotXG1lc3NhZ2V7XHB1dHdvcmRBcHBlbmRpeFxzcGFjZSBcYXBwZW5kaXhsZXR0ZXJ9JQotXGNoYXBtYWNybyB7IzF9e1xwdXR3b3JkQXBwZW5kaXh7fSBcYXBwZW5kaXhsZXR0ZXJ9JQotXGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXGdkZWZcdGhpc2NoYXB0ZXJuYW1leyMxfSUKLVx4ZGVmXHRoaXNjaGFwdGVye1xwdXR3b3JkQXBwZW5kaXh7fSBcYXBwZW5kaXhsZXR0ZXI6IFxub2V4cGFuZFx0aGlzY2hhcHRlcm5hbWV9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggY2hhcGVudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICB7XHB1dHdvcmRBcHBlbmRpeHt9IFxhcHBlbmRpeGxldHRlcn19fSUKLVx0ZW1wCi1cYXBwZW5kaXhub2RlcmVmCi1cZ2xvYmFsXGxldFxzZWN0aW9uID0gXGFwcGVuZGl4c2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXGFwcGVuZGl4c3Vic2VjCi1cZ2xvYmFsXGxldFxzdWJzdWJzZWN0aW9uID0gXGFwcGVuZGl4c3Vic3Vic2VjCi19Ci0KLSUgQGNlbnRlcmNoYXAgaXMgbGlrZSBAdW5udW1iZXJlZCwgYnV0IHRoZSBoZWFkaW5nIGlzIGNlbnRlcmVkLgotXG91dGVyXGRlZlxjZW50ZXJjaGFwe1xwYXJzZWFyZ1xjZW50ZXJjaGFweXl5fQotXGRlZlxjZW50ZXJjaGFweXl5ICMxe3tcbGV0XHVubnVtYmNoYXBtYWNybz1cY2VudGVyY2hhcG1hY3JvIFx1bm51bWJlcmVkeXl5eyMxfX19Ci0KLSUgQHRvcCBpcyBsaWtlIEB1bm51bWJlcmVkLgotXG91dGVyXGRlZlx0b3B7XHBhcnNlYXJnXHVubnVtYmVyZWR5eXl9Ci0KLVxvdXRlclxkZWZcdW5udW1iZXJlZHtccGFyc2VhcmdcdW5udW1iZXJlZHl5eX0KLVxkZWZcdW5udW1iZXJlZHl5eSAjMXtcdW5ubWhlYWQweyMxfX0gJSBub3JtYWxseSB1bm5taGVhZDAgY2FsbHMgdW5udW1iZXJlZHp6egotXGRlZlx1bm51bWJlcmVkenp6ICMxeyUKLVxzZWNubz0wIFxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wCi0lCi0lIFRoaXMgdXNlZCB0byBiZSBzaW1wbHkgXG1lc3NhZ2V7IzF9LCBidXQgVGVYIGZ1bGx5IGV4cGFuZHMgdGhlCi0lIGFyZ3VtZW50IHRvIFxtZXNzYWdlLiAgVGhlcmVmb3JlLCBpZiAjMSBjb250YWluZWQgQC1jb21tYW5kcywgVGVYCi0lIGV4cGFuZGVkIHRoZW0uICBGb3IgZXhhbXBsZSwgaW4gYEB1bm51bWJlcmVkIFRoZSBAY2l0ZXtCb29rfScsIFRlWAotJSBleHBhbmRlZCBAY2l0ZSAod2hpY2ggdHVybnMgb3V0IHRvIGNhdXNlIGVycm9ycyBiZWNhdXNlIFxjaXRlIGlzIG1lYW50Ci0lIHRvIGJlIGV4ZWN1dGVkLCBub3QgZXhwYW5kZWQpLgotJQotJSBBbnl3YXksIHdlIGRvbid0IHdhbnQgdGhlIGZ1bGx5LWV4cGFuZGVkIGRlZmluaXRpb24gb2YgQGNpdGUgdG8gYXBwZWFyCi0lIGFzIGEgcmVzdWx0IG9mIHRoZSBcbWVzc2FnZSwgd2UganVzdCB3YW50IGBAY2l0ZScgaXRzZWxmLiAgV2UgdXNlCi0lIFx0aGU8dG9rcyByZWdpc3Rlcj4gdG8gYWNoaWV2ZSB0aGlzOiBUZVggZXhwYW5kcyBcdGhlPHRva3M+IG9ubHkgb25jZSwKLSUgc2ltcGx5IHlpZWxkaW5nIHRoZSBjb250ZW50cyBvZiA8dG9rcyByZWdpc3Rlcj4uICAoV2UgYWxzbyBkbyB0aGlzIGZvcgotJSB0aGUgdG9jIGVudHJpZXMuKQotXHRva3MwID0geyMxfVxtZXNzYWdleyhcdGhlXHRva3MwKX0lCi0lCi1cdW5udW1iY2hhcG1hY3JvIHsjMX0lCi1cZ2RlZlx0aGlzY2hhcHRlcnsjMX1cZ2RlZlx0aGlzc2VjdGlvbnsjMX0lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCB1bm51bWJjaGFwZW50cnl7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFx1bm51bWJlcmVkc2VjCi1cZ2xvYmFsXGxldFxzdWJzZWN0aW9uID0gXHVubnVtYmVyZWRzdWJzZWMKLVxnbG9iYWxcbGV0XHN1YnN1YnNlY3Rpb24gPSBcdW5udW1iZXJlZHN1YnN1YnNlYwotfQotCi0lIFNlY3Rpb25zLgotXG91dGVyXGRlZlxudW1iZXJlZHNlY3tccGFyc2Vhcmdcc2VjeXl5fQotXGRlZlxzZWN5eXkgIzF7XG51bWhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyBzZWN6enoKLVxkZWZcc2Vjenp6ICMxeyUKLVxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc2Vjbm8gYnkgMSAlCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX1cc2VjaGVhZGluZyB7IzF9e1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcdGhlXGNoYXBub317XHRoZVxzZWNub319fSUKLVx0ZW1wCi1cZG9ub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXGFwcGVuZGl4c2VjdGlvbntccGFyc2VhcmdcYXBwZW5kaXhzZWN5eXl9Ci1cb3V0ZXJcZGVmXGFwcGVuZGl4c2Vje1xwYXJzZWFyZ1xhcHBlbmRpeHNlY3l5eX0KLVxkZWZcYXBwZW5kaXhzZWN5eXkgIzF7XGFwcGhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyBhcHBlbmRpeHNlY3Rpb256enoKLVxkZWZcYXBwZW5kaXhzZWN0aW9uenp6ICMxeyUKLVxzdWJzZWNubz0wIFxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc2Vjbm8gYnkgMSAlCi1cZ2RlZlx0aGlzc2VjdGlvbnsjMX1cc2VjaGVhZGluZyB7IzF9e1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XGFwcGVuZGl4bGV0dGVyfXtcdGhlXHNlY25vfX19JQotXHRlbXAKLVxhcHBlbmRpeG5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcdW5udW1iZXJlZHNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHNlY3l5eX0KLVxkZWZcdW5udW1iZXJlZHNlY3l5eSAjMXtcdW5ubWhlYWQxeyMxfX0gJSBub3JtYWxseSBjYWxscyB1bm51bWJlcmVkc2Vjenp6Ci1cZGVmXHVubnVtYmVyZWRzZWN6enogIzF7JQotXHBsYWluc2VjaGVhZGluZyB7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggdW5udW1ic2VjZW50cnl7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXG5vYnJlYWsKLX0KLQotJSBTdWJzZWN0aW9ucy4KLVxvdXRlclxkZWZcbnVtYmVyZWRzdWJzZWN7XHBhcnNlYXJnXG51bWJlcmVkc3Vic2VjeXl5fQotXGRlZlxudW1iZXJlZHN1YnNlY3l5eSAjMXtcbnVtaGVhZDJ7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIG51bWJlcmVkc3Vic2Vjenp6Ci1cZGVmXG51bWJlcmVkc3Vic2Vjenp6ICMxeyUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc3Vic2Vjbm8gYnkgMSAlCi1cc3Vic2VjaGVhZGluZyB7IzF9e1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHN1YnNlY2VudHJ5e1x0aGVcdG9rczB9JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXhzdWJzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c3Vic2VjeXl5fQotXGRlZlxhcHBlbmRpeHN1YnNlY3l5eSAjMXtcYXBwaGVhZDJ7IzF9fSAlIG5vcm1hbGx5IGNhbGxzIGFwcGVuZGl4c3Vic2Vjenp6Ci1cZGVmXGFwcGVuZGl4c3Vic2Vjenp6ICMxeyUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxzdWJzdWJzZWNubz0wIFxnbG9iYWxcYWR2YW5jZSBcc3Vic2Vjbm8gYnkgMSAlCi1cc3Vic2VjaGVhZGluZyB7IzF9e1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzdWJzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xhcHBlbmRpeGxldHRlcn17XHRoZVxzZWNub317XHRoZVxzdWJzZWNub319fSUKLVx0ZW1wCi1cYXBwZW5kaXhub2RlcmVmCi1cbm9icmVhawotfQotCi1cb3V0ZXJcZGVmXHVubnVtYmVyZWRzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzZWN5eXl9Ci1cZGVmXHVubnVtYmVyZWRzdWJzZWN5eXkgIzF7XHVubm1oZWFkMnsjMX19ICVub3JtYWxseSBjYWxscyB1bm51bWJlcmVkc3Vic2Vjenp6Ci1cZGVmXHVubnVtYmVyZWRzdWJzZWN6enogIzF7JQotXHBsYWluc3Vic2VjaGVhZGluZyB7IzF9XGdkZWZcdGhpc3NlY3Rpb257IzF9JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggdW5udW1ic3Vic2VjZW50cnklCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHRoZVx0b2tzMH19fSUKLVx0ZW1wCi1cdW5udW1ibm9kZXJlZgotXG5vYnJlYWsKLX0KLQotJSBTdWJzdWJzZWN0aW9ucy4KLVxvdXRlclxkZWZcbnVtYmVyZWRzdWJzdWJzZWN7XHBhcnNlYXJnXG51bWJlcmVkc3Vic3Vic2VjeXl5fQotXGRlZlxudW1iZXJlZHN1YnN1YnNlY3l5eSAjMXtcbnVtaGVhZDN7IzF9fSAlIG5vcm1hbGx5IG51bWJlcmVkc3Vic3Vic2Vjenp6Ci1cZGVmXG51bWJlcmVkc3Vic3Vic2Vjenp6ICMxeyUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxnbG9iYWxcYWR2YW5jZSBcc3Vic3Vic2Vjbm8gYnkgMSAlCi1cc3Vic3Vic2VjaGVhZGluZyB7IzF9Ci0gIHtcdGhlXGNoYXBub317XHRoZVxzZWNub317XHRoZVxzdWJzZWNub317XHRoZVxzdWJzdWJzZWNub30lCi1cdG9rczAgPSB7IzF9JQotXGVkZWZcdGVtcHtcbm9leHBhbmRcd3JpdGV0b2NlbnRyeXtccmVhbGJhY2tzbGFzaCBzdWJzdWJzZWNlbnRyeXtcdGhlXHRva3MwfSUKLSAge1x0aGVcY2hhcG5vfXtcdGhlXHNlY25vfXtcdGhlXHN1YnNlY25vfXtcdGhlXHN1YnN1YnNlY25vfX19JQotXHRlbXAKLVxkb25vZGVyZWYKLVxub2JyZWFrCi19Ci0KLVxvdXRlclxkZWZcYXBwZW5kaXhzdWJzdWJzZWN7XHBhcnNlYXJnXGFwcGVuZGl4c3Vic3Vic2VjeXl5fQotXGRlZlxhcHBlbmRpeHN1YnN1YnNlY3l5eSAjMXtcYXBwaGVhZDN7IzF9fSAlIG5vcm1hbGx5IGFwcGVuZGl4c3Vic3Vic2Vjenp6Ci1cZGVmXGFwcGVuZGl4c3Vic3Vic2Vjenp6ICMxeyUKLVxnZGVmXHRoaXNzZWN0aW9ueyMxfVxnbG9iYWxcYWR2YW5jZSBcc3Vic3Vic2Vjbm8gYnkgMSAlCi1cc3Vic3Vic2VjaGVhZGluZyB7IzF9Ci0gIHtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99e1x0aGVcc3Vic3Vic2Vjbm99JQotXHRva3MwID0geyMxfSUKLVxlZGVmXHRlbXB7XG5vZXhwYW5kXHdyaXRldG9jZW50cnl7XHJlYWxiYWNrc2xhc2ggc3Vic3Vic2VjZW50cnl7XHRoZVx0b2tzMH0lCi0gIHtcYXBwZW5kaXhsZXR0ZXJ9e1x0aGVcc2Vjbm99e1x0aGVcc3Vic2Vjbm99e1x0aGVcc3Vic3Vic2Vjbm99fX0lCi1cdGVtcAotXGFwcGVuZGl4bm9kZXJlZgotXG5vYnJlYWsKLX0KLQotXG91dGVyXGRlZlx1bm51bWJlcmVkc3Vic3Vic2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc3Vic3Vic2VjeXl5fQotXGRlZlx1bm51bWJlcmVkc3Vic3Vic2VjeXl5ICMxe1x1bm5taGVhZDN7IzF9fSAlbm9ybWFsbHkgdW5udW1iZXJlZHN1YnN1YnNlY3p6egotXGRlZlx1bm51bWJlcmVkc3Vic3Vic2Vjenp6ICMxeyUKLVxwbGFpbnN1YnN1YnNlY2hlYWRpbmcgeyMxfVxnZGVmXHRoaXNzZWN0aW9ueyMxfSUKLVx0b2tzMCA9IHsjMX0lCi1cZWRlZlx0ZW1we1xub2V4cGFuZFx3cml0ZXRvY2VudHJ5e1xyZWFsYmFja3NsYXNoIHVubnVtYnN1YnN1YnNlY2VudHJ5JQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1x0aGVcdG9rczB9fX0lCi1cdGVtcAotXHVubnVtYm5vZGVyZWYKLVxub2JyZWFrCi19Ci0KLSUgVGhlc2UgYXJlIHZhcmlhbnRzIHdoaWNoIGFyZSBub3QgIm91dGVyIiwgc28gdGhleSBjYW4gYXBwZWFyIGluIEBpZmluZm8uCi0lIEFjdHVhbGx5LCB0aGV5IHNob3VsZCBub3cgYmUgb2Jzb2xldGU7IG9yZGluYXJ5IHNlY3Rpb24gY29tbWFuZHMgc2hvdWxkIHdvcmsuCi1cZGVmXGluZm90b3B7XHBhcnNlYXJnXHVubnVtYmVyZWR6enp9Ci1cZGVmXGluZm91bm51bWJlcmVke1xwYXJzZWFyZ1x1bm51bWJlcmVkenp6fQotXGRlZlxpbmZvdW5udW1iZXJlZHNlY3tccGFyc2VhcmdcdW5udW1iZXJlZHNlY3p6en0KLVxkZWZcaW5mb3VubnVtYmVyZWRzdWJzZWN7XHBhcnNlYXJnXHVubnVtYmVyZWRzdWJzZWN6enp9Ci1cZGVmXGluZm91bm51bWJlcmVkc3Vic3Vic2Vje1xwYXJzZWFyZ1x1bm51bWJlcmVkc3Vic3Vic2Vjenp6fQotCi1cZGVmXGluZm9hcHBlbmRpeHtccGFyc2VhcmdcYXBwZW5kaXh6enp9Ci1cZGVmXGluZm9hcHBlbmRpeHNlY3tccGFyc2VhcmdcYXBwZW5kaXhzZWN6enp9Ci1cZGVmXGluZm9hcHBlbmRpeHN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzZWN6enp9Ci1cZGVmXGluZm9hcHBlbmRpeHN1YnN1YnNlY3tccGFyc2VhcmdcYXBwZW5kaXhzdWJzdWJzZWN6enp9Ci0KLVxkZWZcaW5mb2NoYXB0ZXJ7XHBhcnNlYXJnXGNoYXB0ZXJ6enp9Ci1cZGVmXGluZm9zZWN0aW9ue1xwYXJzZWFyZ1xzZWN0aW9uenp6fQotXGRlZlxpbmZvc3Vic2VjdGlvbntccGFyc2Vhcmdcc3Vic2VjdGlvbnp6en0KLVxkZWZcaW5mb3N1YnN1YnNlY3Rpb257XHBhcnNlYXJnXHN1YnN1YnNlY3Rpb256enp9Ci0KLSUgVGhlc2UgbWFjcm9zIGNvbnRyb2wgd2hhdCB0aGUgc2VjdGlvbiBjb21tYW5kcyBkbywgYWNjb3JkaW5nCi0lIHRvIHdoYXQga2luZCBvZiBjaGFwdGVyIHdlIGFyZSBpbiAob3JkaW5hcnksIGFwcGVuZGl4LCBvciB1bm51bWJlcmVkKS4KLSUgRGVmaW5lIHRoZW0gYnkgZGVmYXVsdCBmb3IgYSBudW1iZXJlZCBjaGFwdGVyLgotXGdsb2JhbFxsZXRcc2VjdGlvbiA9IFxudW1iZXJlZHNlYwotXGdsb2JhbFxsZXRcc3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnNlYwotXGdsb2JhbFxsZXRcc3Vic3Vic2VjdGlvbiA9IFxudW1iZXJlZHN1YnN1YnNlYwotCi0lIERlZmluZSBAbWFqb3JoZWFkaW5nLCBAaGVhZGluZyBhbmQgQHN1YmhlYWRpbmcKLQotJSBOT1RFIG9uIHVzZSBvZiBcdmJveCBmb3IgY2hhcHRlciBoZWFkaW5ncywgc2VjdGlvbiBoZWFkaW5ncywgYW5kIHN1Y2g6Ci0lICAgICAgIDEpIFdlIHVzZSBcdmJveCByYXRoZXIgdGhhbiB0aGUgZWFybGllciBcbGluZSB0byBwZXJtaXQKLSUgICAgICAgICAgb3ZlcmxvbmcgaGVhZGluZ3MgdG8gZm9sZC4KLSUgICAgICAgMikgXGh5cGhlbnBlbmFsdHkgaXMgc2V0IHRvIDEwMDAwIGJlY2F1c2UgaHlwaGVuYXRpb24gaW4gYQotJSAgICAgICAgICBoZWFkaW5nIGlzIG9ibm94aW91czsgdGhpcyBmb3JiaWRzIGl0LgotJSAgICAgICAzKSBMaWtld2lzZSwgaGVhZGluZ3MgbG9vayBiZXN0IGlmIG5vIFxwYXJpbmRlbnQgaXMgdXNlZCwgYW5kCi0lICAgICAgICAgIGlmIGp1c3RpZmljYXRpb24gaXMgbm90IGF0dGVtcHRlZC4gIEhlbmNlIFxyYWdnZWRyaWdodC4KLQotCi1cZGVmXG1ham9yaGVhZGluZ3tccGFyc2VhcmdcbWFqb3JoZWFkaW5nenp6fQotXGRlZlxtYWpvcmhlYWRpbmd6enogIzF7JQote1xhZHZhbmNlXGNoYXBoZWFkaW5nc2tpcCBieSAxMHB0IFxjaGFwYnJlYWsgfSUKLXtcY2hhcGZvbnRzIFx2Ym94e1xoeXBoZW5wZW5hbHR5PTEwMDAwXHRvbGVyYW5jZT01MDAwCi0gICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAotICAgICAgICAgICAgICAgICAgXHJtICMxXGhmaWxsfX1cYmlnc2tpcCBccGFyXHBlbmFsdHkgMjAwfQotCi1cZGVmXGNoYXBoZWFkaW5ne1xwYXJzZWFyZ1xjaGFwaGVhZGluZ3p6en0KLVxkZWZcY2hhcGhlYWRpbmd6enogIzF7XGNoYXBicmVhayAlCi17XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAotICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHRccmFnZ2VkcmlnaHQKLSAgICAgICAgICAgICAgICAgIFxybSAjMVxoZmlsbH19XGJpZ3NraXAgXHBhclxwZW5hbHR5IDIwMH0KLQotJSBAaGVhZGluZywgQHN1YmhlYWRpbmcsIEBzdWJzdWJoZWFkaW5nLgotXGRlZlxoZWFkaW5ne1xwYXJzZWFyZ1xwbGFpbnNlY2hlYWRpbmd9Ci1cZGVmXHN1YmhlYWRpbmd7XHBhcnNlYXJnXHBsYWluc3Vic2VjaGVhZGluZ30KLVxkZWZcc3Vic3ViaGVhZGluZ3tccGFyc2VhcmdccGxhaW5zdWJzdWJzZWNoZWFkaW5nfQotCi0lIFRoZXNlIG1hY3JvcyBnZW5lcmF0ZSBhIGNoYXB0ZXIsIHNlY3Rpb24sIGV0Yy4gaGVhZGluZyBvbmx5Ci0lIChpbmNsdWRpbmcgd2hpdGVzcGFjZSwgbGluZWJyZWFraW5nLCBldGMuIGFyb3VuZCBpdCksCi0lIGdpdmVuIGFsbCB0aGUgaW5mb3JtYXRpb24gaW4gY29udmVuaWVudCwgcGFyc2VkIGZvcm0uCi0KLSUlJSBBcmdzIGFyZSB0aGUgc2tpcCBhbmQgcGVuYWx0eSAodXN1YWxseSBuZWdhdGl2ZSkKLVxkZWZcZG9icmVhayMxIzJ7XHBhclxpZmRpbVxsYXN0c2tpcDwjMVxyZW1vdmVsYXN0c2tpcFxwZW5hbHR5IzJcdnNraXAjMVxmaX0KLQotXGRlZlxzZXRjaGFwdGVyc3R5bGUgIzEge1xjc25hbWUgQ0hBUEYjMVxlbmRjc25hbWV9Ci0KLSUlJSBEZWZpbmUgcGxhaW4gY2hhcHRlciBzdGFydHMsIGFuZCBwYWdlIG9uL29mZiBzd2l0Y2hpbmcgZm9yIGl0Ci0lIFBhcmFtZXRlciBjb250cm9sbGluZyBza2lwIGJlZm9yZSBjaGFwdGVyIGhlYWRpbmdzIChpZiBuZWVkZWQpCi0KLVxuZXdza2lwXGNoYXBoZWFkaW5nc2tpcAotCi1cZGVmXGNoYXBicmVha3tcZG9icmVhayBcY2hhcGhlYWRpbmdza2lwIHstNDAwMH19Ci1cZGVmXGNoYXBwYWdlcntccGFyXHZmaWxsXHN1cGVyZWplY3R9Ci1cZGVmXGNoYXBvZGRwYWdle1xjaGFwcGFnZXIgXGlmb2RkXHBhZ2VubyBcZWxzZSBcaGJveCB0byAwcHR7fSBcY2hhcHBhZ2VyXGZpfQotCi1cZGVmXHNldGNoYXB0ZXJuZXdwYWdlICMxIHtcY3NuYW1lIENIQVBQQUcjMVxlbmRjc25hbWV9Ci0KLVxkZWZcQ0hBUFBBR29mZnslCi1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcHBhZ2VyCi1cZ2xvYmFsXGxldFxwY2hhcHNlcG1hY3JvPVxjaGFwYnJlYWsKLVxnbG9iYWxcbGV0XHBhZ2VhbGlnbm1hY3JvPVxjaGFwcGFnZXJ9Ci0KLVxkZWZcQ0hBUFBBR29ueyUKLVxnbG9iYWxcbGV0XGNvbnRlbnRzYWxpZ25tYWNybyA9IFxjaGFwcGFnZXIKLVxnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBwYWdlcgotXGdsb2JhbFxsZXRccGFnZWFsaWdubWFjcm89XGNoYXBwYWdlcgotXGdsb2JhbFxkZWZcSEVBRElOR1NvbntcSEVBRElOR1NzaW5nbGV9fQotCi1cZGVmXENIQVBQQUdvZGR7Ci1cZ2xvYmFsXGxldFxjb250ZW50c2FsaWdubWFjcm8gPSBcY2hhcG9kZHBhZ2UKLVxnbG9iYWxcbGV0XHBjaGFwc2VwbWFjcm89XGNoYXBvZGRwYWdlCi1cZ2xvYmFsXGxldFxwYWdlYWxpZ25tYWNybz1cY2hhcG9kZHBhZ2UKLVxnbG9iYWxcZGVmXEhFQURJTkdTb257XEhFQURJTkdTZG91YmxlfX0KLQotXENIQVBQQUdvbgotCi1cZGVmXENIQVBGcGxhaW57Ci1cZ2xvYmFsXGxldFxjaGFwbWFjcm89XGNoZnBsYWluCi1cZ2xvYmFsXGxldFx1bm51bWJjaGFwbWFjcm89XHVubmNoZnBsYWluCi1cZ2xvYmFsXGxldFxjZW50ZXJjaGFwbWFjcm89XGNlbnRlcmNoZnBsYWlufQotCi0lIFBsYWluIGNoYXB0ZXIgb3BlbmluZy4KLSUgIzEgaXMgdGhlIHRleHQsICMyIHRoZSBjaGFwdGVyIG51bWJlciBvciBlbXB0eSBpZiB1bm51bWJlcmVkLgotXGRlZlxjaGZwbGFpbiMxIzJ7JQotICBccGNoYXBzZXBtYWNybwotICB7JQotICAgIFxjaGFwZm9udHMgXHJtCi0gICAgXGRlZlxjaGFwbnVteyMyfSUKLSAgICBcc2V0Ym94MCA9IFxoYm94eyMyXGlmeFxjaGFwbnVtXGVtcHR5XGVsc2VcZW5zcGFjZVxmaX0lCi0gICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAotICAgICAgICAgIFxoYW5naW5kZW50ID0gXHdkMCBcY2VudGVycGFyYW1ldGVyc21heWJlCi0gICAgICAgICAgXHVuaGJveDAgIzFccGFyfSUKLSAgfSUKLSAgXG5vYnJlYWtcYmlnc2tpcCAlIG5vIHBhZ2UgYnJlYWsgYWZ0ZXIgYSBjaGFwdGVyIHRpdGxlCi0gIFxub2JyZWFrCi19Ci0KLSUgUGxhaW4gb3BlbmluZyBmb3IgdW5udW1iZXJlZC4KLVxkZWZcdW5uY2hmcGxhaW4jMXtcY2hmcGxhaW57IzF9e319Ci0KLSUgQGNlbnRlcmNoYXAgLS0gY2VudGVyZWQgYW5kIHVubnVtYmVyZWQuCi1cbGV0XGNlbnRlcnBhcmFtZXRlcnNtYXliZSA9IFxyZWxheAotXGRlZlxjZW50ZXJjaGZwbGFpbiMxe3slCi0gIFxkZWZcY2VudGVycGFyYW1ldGVyc21heWJleyUKLSAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkgM1xyaWdodHNraXAKLSAgICBcbGVmdHNraXAgPSBccmlnaHRza2lwCi0gICAgXHBhcmZpbGxza2lwID0gMHB0Ci0gIH0lCi0gIFxjaGZwbGFpbnsjMX17fSUKLX19Ci0KLVxDSEFQRnBsYWluICUgVGhlIGRlZmF1bHQKLQotXGRlZlx1bm5jaGZvcGVuICMxeyUKLVxjaGFwb2RkcGFnZSB7XGNoYXBmb250cyBcdmJveHtcaHlwaGVucGVuYWx0eT0xMDAwMFx0b2xlcmFuY2U9NTAwMAotICAgICAgICAgICAgICAgICAgICAgICBccGFyaW5kZW50PTBwdFxyYWdnZWRyaWdodAotICAgICAgICAgICAgICAgICAgICAgICBccm0gIzFcaGZpbGx9fVxiaWdza2lwIFxwYXJcbm9icmVhawotfQotCi1cZGVmXGNoZm9wZW4gIzEjMntcY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMKLVx2Ym94IHRvIDNpbntcdmZpbCBcaGJveCB0b1xoc2l6ZXtcaGZpbCAjMn0gXGhib3ggdG9caHNpemV7XGhmaWwgIzF9IFx2ZmlsfX0lCi1ccGFyXHBlbmFsdHkgNTAwMCAlCi19Ci0KLVxkZWZcY2VudGVyY2hmb3BlbiAjMXslCi1cY2hhcG9kZHBhZ2Uge1xjaGFwZm9udHMgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDBcdG9sZXJhbmNlPTUwMDAKLSAgICAgICAgICAgICAgICAgICAgICAgXHBhcmluZGVudD0wcHQKLSAgICAgICAgICAgICAgICAgICAgICAgXGhmaWxsIHtccm0gIzF9XGhmaWxsfX1cYmlnc2tpcCBccGFyXG5vYnJlYWsKLX0KLQotXGRlZlxDSEFQRm9wZW57Ci1cZ2xvYmFsXGxldFxjaGFwbWFjcm89XGNoZm9wZW4KLVxnbG9iYWxcbGV0XHVubnVtYmNoYXBtYWNybz1cdW5uY2hmb3BlbgotXGdsb2JhbFxsZXRcY2VudGVyY2hhcG1hY3JvPVxjZW50ZXJjaGZvcGVufQotCi0KLSUgU2VjdGlvbiB0aXRsZXMuCi1cbmV3c2tpcFxzZWNoZWFkaW5nc2tpcAotXGRlZlxzZWNoZWFkaW5nYnJlYWt7XGRvYnJlYWsgXHNlY2hlYWRpbmdza2lwIHstMTAwMH19Ci1cZGVmXHNlY2hlYWRpbmcjMSMyIzN7XHNlY3Rpb25oZWFkaW5ne3NlY317IzIuIzN9eyMxfX0KLVxkZWZccGxhaW5zZWNoZWFkaW5nIzF7XHNlY3Rpb25oZWFkaW5ne3NlY317fXsjMX19Ci0KLSUgU3Vic2VjdGlvbiB0aXRsZXMuCi1cbmV3c2tpcCBcc3Vic2VjaGVhZGluZ3NraXAKLVxkZWZcc3Vic2VjaGVhZGluZ2JyZWFre1xkb2JyZWFrIFxzdWJzZWNoZWFkaW5nc2tpcCB7LTUwMH19Ci1cZGVmXHN1YnNlY2hlYWRpbmcjMSMyIzMjNHtcc2VjdGlvbmhlYWRpbmd7c3Vic2VjfXsjMi4jMy4jNH17IzF9fQotXGRlZlxwbGFpbnN1YnNlY2hlYWRpbmcjMXtcc2VjdGlvbmhlYWRpbmd7c3Vic2VjfXt9eyMxfX0KLQotJSBTdWJzdWJzZWN0aW9uIHRpdGxlcy4KLVxsZXRcc3Vic3Vic2VjaGVhZGluZ3NraXAgPSBcc3Vic2VjaGVhZGluZ3NraXAKLVxsZXRcc3Vic3Vic2VjaGVhZGluZ2JyZWFrID0gXHN1YnNlY2hlYWRpbmdicmVhawotXGRlZlxzdWJzdWJzZWNoZWFkaW5nIzEjMiMzIzQjNXtcc2VjdGlvbmhlYWRpbmd7c3Vic3Vic2VjfXsjMi4jMy4jNC4jNX17IzF9fQotXGRlZlxwbGFpbnN1YnN1YnNlY2hlYWRpbmcjMXtcc2VjdGlvbmhlYWRpbmd7c3Vic3Vic2VjfXt9eyMxfX0KLQotCi0lIFByaW50IGFueSBzaXplIHNlY3Rpb24gdGl0bGUuCi0lCi0lICMxIGlzIHRoZSBzZWN0aW9uIHR5cGUgKHNlYy9zdWJzZWMvc3Vic3Vic2VjKSwgIzIgaXMgdGhlIHNlY3Rpb24KLSUgbnVtYmVyIChtYXliZSBlbXB0eSksICMzIHRoZSB0ZXh0LgotXGRlZlxzZWN0aW9uaGVhZGluZyMxIzIjM3slCi0gIHslCi0gICAgXGV4cGFuZGFmdGVyXGFkdmFuY2VcY3NuYW1lICMxaGVhZGluZ3NraXBcZW5kY3NuYW1lIGJ5IFxwYXJza2lwCi0gICAgXGNzbmFtZSAjMWhlYWRpbmdicmVha1xlbmRjc25hbWUKLSAgfSUKLSAgeyUKLSAgICAlIFN3aXRjaCB0byB0aGUgcmlnaHQgc2V0IG9mIGZvbnRzLgotICAgIFxjc25hbWUgIzFmb250c1xlbmRjc25hbWUgXHJtCi0gICAgJQotICAgICUgT25seSBpbnNlcnQgdGhlIHNlcGFyYXRpbmcgc3BhY2UgaWYgd2UgaGF2ZSBhIHNlY3Rpb24gbnVtYmVyLgotICAgIFxkZWZcc2VjbnVteyMyfSUKLSAgICBcc2V0Ym94MCA9IFxoYm94eyMyXGlmeFxzZWNudW1cZW1wdHlcZWxzZVxlbnNwYWNlXGZpfSUKLSAgICAlCi0gICAgXHZib3h7XGh5cGhlbnBlbmFsdHk9MTAwMDAgXHRvbGVyYW5jZT01MDAwIFxwYXJpbmRlbnQ9MHB0IFxyYWdnZWRyaWdodAotICAgICAgICAgIFxoYW5naW5kZW50ID0gXHdkMCAlIHplcm8gaWYgbm8gc2VjdGlvbiBudW1iZXIKLSAgICAgICAgICBcdW5oYm94MCAjM30lCi0gIH0lCi0gIFxpZmRpbVxwYXJza2lwPDEwcHQgXG5vYnJlYWtca2VybjEwcHRcbm9icmVha1xrZXJuLVxwYXJza2lwXGZpIFxub2JyZWFrCi19Ci0KLQotXG1lc3NhZ2V7dG9jLH0KLVxuZXd3cml0ZVx0b2NmaWxlCi0KLSUgV3JpdGUgYW4gZW50cnkgdG8gdGhlIHRvYyBmaWxlLCBvcGVuaW5nIGl0IGlmIG5lY2Vzc2FyeS4KLSUgQ2FsbGVkIGZyb20gQGNoYXB0ZXIsIGV0Yy4gIFdlIHN1cHBseSB7XGZvbGlvfSBhdCB0aGUgZW5kIG9mIHRoZQotJSBhcmd1bWVudCwgd2hpY2ggd2lsbCBlbmQgdXAgYXMgdGhlIGxhc3QgYXJndW1lbnQgdG8gdGhlIFwuLi5lbnRyeSBtYWNyby4KLSUgCi0lIFdlIG9wZW4gdGhlIC50b2MgZmlsZSBoZXJlIGluc3RlYWQgb2YgYXQgQHNldGZpbGVuYW1lIG9yIGFueSBvdGhlcgotJSBnaXZlbiB0aW1lIHNvIHRoYXQgQGNvbnRlbnRzIGNhbiBiZSBwdXQgaW4gdGhlIGRvY3VtZW50IGFueXdoZXJlLgotJSAKLVxuZXdpZlxpZnRvY2ZpbGVvcGVuZWQKLVxkZWZcd3JpdGV0b2NlbnRyeSMxeyUKLSAgXGlmdG9jZmlsZW9wZW5lZFxlbHNlCi0gICAgXGltbWVkaWF0ZVxvcGVub3V0XHRvY2ZpbGUgPSBcam9ibmFtZS50b2MKLSAgICBcZ2xvYmFsXHRvY2ZpbGVvcGVuZWR0cnVlCi0gIFxmaQotICBcaWZsaW5rcyBcd3JpdGVcdG9jZmlsZXsjMXtcZm9saW99fVxmaQotfQotCi1cbmV3c2tpcFxjb250ZW50c3JpZ2h0bWFyZ2luIFxjb250ZW50c3JpZ2h0bWFyZ2luPTFpbgotXG5ld2NvdW50XHNhdmVwYWdlbm8KLVxuZXdjb3VudFxsYXN0bmVnYXRpdmVwYWdlbm8gXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IC0xCi0KLSUgRmluaXNoIHVwIHRoZSBtYWluIHRleHQgYW5kIHByZXBhcmUgdG8gcmVhZCB3aGF0IHdlJ3ZlIHdyaXR0ZW4KLSUgdG8gXHRvY2ZpbGUuCi0lIAotXGRlZlxzdGFydGNvbnRlbnRzIzF7JQotICAgJSBJZiBAc2V0Y2hhcHRlcm5ld3BhZ2Ugb24sIGFuZCBAaGVhZGluZ3MgZG91YmxlLCB0aGUgY29udGVudHMgc2hvdWxkCi0gICAlIHN0YXJ0IG9uIGFuIG9kZCBwYWdlLCB1bmxpa2UgY2hhcHRlcnMuICBUaHVzLCB3ZSBtYWludGFpbgotICAgJSBcY29udGVudHNhbGlnbm1hY3JvIGluIHBhcmFsbGVsIHdpdGggXHBhZ2VhbGlnbm1hY3JvLgotICAgJSBGcm9tOiBUb3Jiam9ybiBHcmFubHVuZCA8dGVnZUBtYXRlbWF0aWsuc3Uuc2U+Ci0gICBcY29udGVudHNhbGlnbm1hY3JvCi0gICBcaW1tZWRpYXRlXGNsb3Nlb3V0XHRvY2ZpbGUKLSAgICUKLSAgICUgRG9uJ3QgbmVlZCB0byBwdXQgYENvbnRlbnRzJyBvciBgU2hvcnQgQ29udGVudHMnIGluIHRoZSBoZWFkbGluZS4KLSAgICUgSXQgaXMgYWJ1bmRhbnRseSBjbGVhciB3aGF0IHRoZXkgYXJlLgotICAgXHVubnVtYmNoYXBtYWNyb3sjMX1cZGVmXHRoaXNjaGFwdGVye30lCi0gICBcc2F2ZXBhZ2VubyA9IFxwYWdlbm8KLSAgIFxiZWdpbmdyb3VwICAgICAgICAgICAgICAgICAgJSBTZXQgdXAgdG8gaGFuZGxlIGNvbnRlbnRzIGZpbGVzIHByb3Blcmx5LgotICAgICAgXGNhdGNvZGVgXFw9MCAgXGNhdGNvZGVgXHs9MSAgXGNhdGNvZGVgXH09MiAgXGNhdGNvZGVgXEA9MTEKLSAgICAgICUgV2UgY2FuJ3QgZG8gdGhpcywgYmVjYXVzZSB0aGVuIGFuIGFjdHVhbCBeIGluIGEgc2VjdGlvbgotICAgICAgJSB0aXRsZSBmYWlscywgZS5nLiwgQGNoYXB0ZXIgXiAtLSBleHBvbmVudGlhdGlvbi4gIC0ta2FybCwgOWp1bDk3LgotICAgICAgJVxjYXRjb2RlYFxePTcgJSB0byBzZWUgXl5lNCBhcyBcImEgZXRjLiBqdWhhQHBpdWhhLnlkaS52dHQuZmkKLSAgICAgIFxyYWdnZWRib3R0b20gICAgICAgICAgICAgJSBXb3JyeSBtb3JlIGFib3V0IGJyZWFrcG9pbnRzIHRoYW4gdGhlIGJvdHRvbS4KLSAgICAgIFxhZHZhbmNlXGhzaXplIGJ5IC1cY29udGVudHNyaWdodG1hcmdpbiAlIERvbid0IHVzZSB0aGUgZnVsbCBsaW5lIGxlbmd0aC4KLSAgICAgICUKLSAgICAgICUgUm9tYW4gbnVtZXJhbHMgZm9yIHBhZ2UgbnVtYmVycy4KLSAgICAgIFxpZm51bSBccGFnZW5vPjAgXHBhZ2VubyA9IFxsYXN0bmVnYXRpdmVwYWdlbm8gXGZpCi19Ci0KLQotJSBOb3JtYWwgKGxvbmcpIHRvYy4KLVxkZWZcY29udGVudHN7JQotICAgXHN0YXJ0Y29udGVudHN7XHB1dHdvcmRUYWJsZW9mQ29udGVudHN9JQotICAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCi0gICAgIFxpZmVvZiAxIFxlbHNlCi0gICAgICAgXGNsb3NlaW4gMQotICAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKLSAgICAgXGZpCi0gICAgIFx2ZmlsbCBcZWplY3QKLSAgIFxlbmRncm91cAotICAgXGxhc3RuZWdhdGl2ZXBhZ2VubyA9IFxwYWdlbm8KLSAgIFxwYWdlbm8gPSBcc2F2ZXBhZ2VubwotfQotCi0lIEFuZCBqdXN0IHRoZSBjaGFwdGVycy4KLVxkZWZcc3VtbWFyeWNvbnRlbnRzeyUKLSAgIFxzdGFydGNvbnRlbnRze1xwdXR3b3JkU2hvcnRDb250ZW50c30lCi0gICAgICAlCi0gICAgICBcbGV0XGNoYXBlbnRyeSA9IFxzaG9ydGNoYXBlbnRyeQotICAgICAgXGxldFx1bm51bWJjaGFwZW50cnkgPSBcc2hvcnR1bm51bWJlcmVkZW50cnkKLSAgICAgICUgV2Ugd2FudCBhIHRydWUgcm9tYW4gaGVyZSBmb3IgdGhlIHBhZ2UgbnVtYmVycy4KLSAgICAgIFxzZWNmb250cwotICAgICAgXGxldFxybT1cc2hvcnRjb250cm0gXGxldFxiZj1cc2hvcnRjb250YmYgXGxldFxzbD1cc2hvcnRjb250c2wKLSAgICAgIFxybQotICAgICAgXGh5cGhlbnBlbmFsdHkgPSAxMDAwMAotICAgICAgXGFkdmFuY2VcYmFzZWxpbmVza2lwIGJ5IDFwdCAlIE9wZW4gaXQgdXAgYSBsaXR0bGUuCi0gICAgICBcZGVmXHNlY2VudHJ5ICMjMSMjMiMjMyMjNHt9Ci0gICAgICBcZGVmXHVubnVtYnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcZGVmXHN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNXt9Ci0gICAgICBcZGVmXHVubnVtYnN1YnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcZGVmXHN1YnN1YnNlY2VudHJ5ICMjMSMjMiMjMyMjNCMjNSMjNnt9Ci0gICAgICBcZGVmXHVubnVtYnN1YnN1YnNlY2VudHJ5ICMjMSMjMnt9Ci0gICAgICBcb3BlbmluIDEgXGpvYm5hbWUudG9jCi0gICAgICBcaWZlb2YgMSBcZWxzZQotICAgICAgICBcY2xvc2VpbiAxCi0gICAgICAgIFxpbnB1dCBcam9ibmFtZS50b2MKLSAgICAgIFxmaQotICAgICBcdmZpbGwgXGVqZWN0Ci0gICBcZW5kZ3JvdXAKLSAgIFxsYXN0bmVnYXRpdmVwYWdlbm8gPSBccGFnZW5vCi0gICBccGFnZW5vID0gXHNhdmVwYWdlbm8KLX0KLVxsZXRcc2hvcnRjb250ZW50cyA9IFxzdW1tYXJ5Y29udGVudHMKLQotJSBUaGVzZSBtYWNyb3MgZ2VuZXJhdGUgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSB0YWJsZSBvZiBjb250ZW50cy4KLSUgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBjaGFwdGVyIG9yIHNlY3Rpb24gbmFtZS4KLSUgVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlIHBhZ2UgbnVtYmVyLgotJSBUaGUgYXJndW1lbnRzIGluIGJldHdlZW4gYXJlIHRoZSBjaGFwdGVyIG51bWJlciwgc2VjdGlvbiBudW1iZXIsIC4uLgotCi0lIENoYXB0ZXItbGV2ZWwgdGhpbmdzLCBmb3IgYm90aCB0aGUgbG9uZyBhbmQgc2hvcnQgY29udGVudHMuCi1cZGVmXGNoYXBlbnRyeSMxIzIjM3tcZG9jaGFwZW50cnl7IzJcbGFiZWxzcGFjZSMxfXsjM319Ci0KLSUgU2VlIGNvbW1lbnRzIGluIFxkb2NoYXBlbnRyeSByZSB2Ym94IGFuZCByZWxhdGVkIHNldHRpbmdzCi1cZGVmXHNob3J0Y2hhcGVudHJ5IzEjMiMzeyUKLSAgXHRvY2VudHJ5e1xzaG9ydGNoYXBsYWJlbHsjMn1cbGFiZWxzcGFjZSAjMX17XGRvc2hvcnRwYWdlbm97IzN9fSUKLX0KLQotJSBUeXBlc2V0IHRoZSBsYWJlbCBmb3IgYSBjaGFwdGVyIG9yIGFwcGVuZGl4IGZvciB0aGUgc2hvcnQgY29udGVudHMuCi0lIFRoZSBhcmcgaXMsIGUuZy4gYEFwcGVuZGl4IEEnIGZvciBhbiBhcHBlbmRpeCwgb3IgYDMnIGZvciBhIGNoYXB0ZXIuCi0lIFdlIGNvdWxkIHNpbXBsaWZ5IHRoZSBjb2RlIGhlcmUgYnkgd3JpdGluZyBvdXQgYW4gXGFwcGVuZGl4ZW50cnkKLSUgY29tbWFuZCBpbiB0aGUgdG9jIGZpbGUgZm9yIGFwcGVuZGljZXMsIGluc3RlYWQgb2YgdXNpbmcgXGNoYXBlbnRyeQotJSBmb3IgYm90aCwgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdC4KLVxzZXRib3gwID0gXGhib3h7XHNob3J0Y29udHJtIFxwdXR3b3JkQXBwZW5kaXggfQotXG5ld2RpbWVuXHNob3J0YXBwZW5kaXh3aWR0aCBcc2hvcnRhcHBlbmRpeHdpZHRoID0gXHdkMAotCi1cZGVmXHNob3J0Y2hhcGxhYmVsIzF7JQotICAlIFdlIHR5cGVzZXQgIzEgaW4gYSBib3ggb2YgY29uc3RhbnQgd2lkdGgsIHJlZ2FyZGxlc3Mgb2YgdGhlIHRleHQgb2YKLSAgJSAjMSwgc28gdGhlIGNoYXB0ZXIgdGl0bGVzIHdpbGwgY29tZSBvdXQgYWxpZ25lZC4KLSAgXHNldGJveDAgPSBcaGJveHsjMX0lCi0gIFxkaW1lbjAgPSBcaWZkaW1cd2QwID4gXHNob3J0YXBwZW5kaXh3aWR0aCBcc2hvcnRhcHBlbmRpeHdpZHRoIFxlbHNlIDBwdCBcZmkKLSAgJQotICAlIFRoaXMgc3BhY2Ugc2hvdWxkIGJlIHBsZW50eSwgc2luY2UgYSBzaW5nbGUgbnVtYmVyIGlzIC41ZW0sIGFuZCB0aGUKLSAgJSB3aWRlc3QgbGV0dGVyIChNKSBpcyAxZW0sIGF0IGxlYXN0IGluIHRoZSBDb21wdXRlciBNb2Rlcm4gZm9udHMuCi0gICUgKFRoaXMgc3BhY2UgZG9lc24ndCBpbmNsdWRlIHRoZSBleHRyYSBzcGFjZSB0aGF0IGdldHMgYWRkZWQgYWZ0ZXIKLSAgJSB0aGUgbGFiZWw7IHRoYXQgZ2V0cyBwdXQgaW4gYnkgXHNob3J0Y2hhcGVudHJ5IGFib3ZlLikKLSAgXGFkdmFuY2VcZGltZW4wIGJ5IDEuMWVtCi0gIFxoYm94IHRvIFxkaW1lbjB7IzFcaGZpbH0lCi19Ci0KLVxkZWZcdW5udW1iY2hhcGVudHJ5IzEjMntcZG9jaGFwZW50cnl7IzF9eyMyfX0KLVxkZWZcc2hvcnR1bm51bWJlcmVkZW50cnkjMSMye1x0b2NlbnRyeXsjMX17XGRvc2hvcnRwYWdlbm97IzJ9fX0KLQotJSBTZWN0aW9ucy4KLVxkZWZcc2VjZW50cnkjMSMyIzMjNHtcZG9zZWNlbnRyeXsjMi4jM1xsYWJlbHNwYWNlIzF9eyM0fX0KLVxkZWZcdW5udW1ic2VjZW50cnkjMSMye1xkb3NlY2VudHJ5eyMxfXsjMn19Ci0KLSUgU3Vic2VjdGlvbnMuCi1cZGVmXHN1YnNlY2VudHJ5IzEjMiMzIzQjNXtcZG9zdWJzZWNlbnRyeXsjMi4jMy4jNFxsYWJlbHNwYWNlIzF9eyM1fX0KLVxkZWZcdW5udW1ic3Vic2VjZW50cnkjMSMye1xkb3N1YnNlY2VudHJ5eyMxfXsjMn19Ci0KLSUgQW5kIHN1YnN1YnNlY3Rpb25zLgotXGRlZlxzdWJzdWJzZWNlbnRyeSMxIzIjMyM0IzUjNnslCi0gIFxkb3N1YnN1YnNlY2VudHJ5eyMyLiMzLiM0LiM1XGxhYmVsc3BhY2UjMX17IzZ9fQotXGRlZlx1bm51bWJzdWJzdWJzZWNlbnRyeSMxIzJ7XGRvc3Vic3Vic2VjZW50cnl7IzF9eyMyfX0KLQotJSBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHZhcmlvdXMgbGV2ZWxzLgotXG5ld2RpbWVuXHRvY2luZGVudCBcdG9jaW5kZW50ID0gM3BjCi0KLSUgTm93IGZvciB0aGUgYWN0dWFsIHR5cGVzZXR0aW5nLiBJbiBhbGwgdGhlc2UsICMxIGlzIHRoZSB0ZXh0IGFuZCAjMiBpcyB0aGUKLSUgcGFnZSBudW1iZXIuCi0lCi0lIElmIHRoZSB0b2MgaGFzIHRvIGJlIGJyb2tlbiBvdmVyIHBhZ2VzLCB3ZSB3YW50IGl0IHRvIGJlIGF0IGNoYXB0ZXJzCi0lIGlmIGF0IGFsbCBwb3NzaWJsZTsgaGVuY2UgdGhlIFxwZW5hbHR5LgotXGRlZlxkb2NoYXBlbnRyeSMxIzJ7JQotICAgXHBlbmFsdHktMzAwIFx2c2tpcDFcYmFzZWxpbmVza2lwIHBsdXMuMzNcYmFzZWxpbmVza2lwIG1pbnVzLjI1XGJhc2VsaW5lc2tpcAotICAgXGJlZ2luZ3JvdXAKLSAgICAgXGNoYXBlbnRyeWZvbnRzCi0gICAgIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5veyMyfX0lCi0gICBcZW5kZ3JvdXAKLSAgIFxub2JyZWFrXHZza2lwIC4yNVxiYXNlbGluZXNraXAgcGx1cy4xXGJhc2VsaW5lc2tpcAotfQotCi1cZGVmXGRvc2VjZW50cnkjMSMye1xiZWdpbmdyb3VwCi0gIFxzZWNlbnRyeWZvbnRzIFxsZWZ0c2tpcD1cdG9jaW5kZW50Ci0gIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5veyMyfX0lCi1cZW5kZ3JvdXB9Ci0KLVxkZWZcZG9zdWJzZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHN1YnNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPTJcdG9jaW5kZW50Ci0gIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5veyMyfX0lCi1cZW5kZ3JvdXB9Ci0KLVxkZWZcZG9zdWJzdWJzZWNlbnRyeSMxIzJ7XGJlZ2luZ3JvdXAKLSAgXHN1YnN1YnNlY2VudHJ5Zm9udHMgXGxlZnRza2lwPTNcdG9jaW5kZW50Ci0gIFx0b2NlbnRyeXsjMX17XGRvcGFnZW5veyMyfX0lCi1cZW5kZ3JvdXB9Ci0KLSUgRmluYWwgdHlwZXNldHRpbmcgb2YgYSB0b2MgZW50cnk7IHdlIHVzZSB0aGUgc2FtZSBcZW50cnkgbWFjcm8gYXMgZm9yCi0lIHRoZSBpbmRleCBlbnRyaWVzLCBidXQgd2Ugd2FudCB0byBzdXBwcmVzcyBoeXBoZW5hdGlvbiBoZXJlLiAgKFdlCi0lIGNhbid0IGRvIHRoYXQgaW4gdGhlIFxlbnRyeSBtYWNybywgc2luY2UgaW5kZXggZW50cmllcyBtaWdodCBjb25zaXN0Ci0lIG9mIGh5cGhlbmF0ZWQtaWRlbnRpZmllcnMtdGhhdC1kby1ub3QtZml0LW9uLWEtbGluZS1hbmQtbm90aGluZy1lbHNlLikKLVxkZWZcdG9jZW50cnkjMSMye1xiZWdpbmdyb3VwCi0gIFx2c2tpcCAwcHQgcGx1czFwdCAlIGFsbG93IGEgbGl0dGxlIHN0cmV0Y2ggZm9yIHRoZSBzYWtlIG9mIG5pY2UgcGFnZSBicmVha3MKLSAgJSBEbyBub3QgdXNlIFx0dXJub2ZmYWN0aXZlIGluIHRoZXNlIGFyZ3VtZW50cy4gIFNpbmNlIHRoZSB0b2MgaXMKLSAgJSB0eXBlc2V0IGluIGNtciwgc28gY2hhcmFjdGVycyBzdWNoIGFzIF8gd291bGQgY29tZSBvdXQgd3Jvbmc7IHdlCi0gICUgaGF2ZSB0byBkbyB0aGUgdXN1YWwgdHJhbnNsYXRpb24gdHJpY2tzLgotICBcZW50cnl7IzF9eyMyfSUKLVxlbmRncm91cH0KLQotJSBTcGFjZSBiZXR3ZWVuIGNoYXB0ZXIgKG9yIHdoYXRldmVyKSBudW1iZXIgYW5kIHRoZSB0aXRsZS4KLVxkZWZcbGFiZWxzcGFjZXtcaHNraXAxZW0gXHJlbGF4fQotCi1cZGVmXGRvcGFnZW5vIzF7e1xybSAjMX19Ci1cZGVmXGRvc2hvcnRwYWdlbm8jMXt7XHJtICMxfX0KLQotXGRlZlxjaGFwZW50cnlmb250c3tcc2VjZm9udHMgXHJtfQotXGRlZlxzZWNlbnRyeWZvbnRze1x0ZXh0Zm9udHN9Ci1cbGV0XHN1YnNlY2VudHJ5Zm9udHMgPSBcdGV4dGZvbnRzCi1cbGV0XHN1YnN1YnNlY2VudHJ5Zm9udHMgPSBcdGV4dGZvbnRzCi0KLQotXG1lc3NhZ2V7ZW52aXJvbm1lbnRzLH0KLQotJSBTaW5jZSB0aGVzZSBjaGFyYWN0ZXJzIGFyZSB1c2VkIGluIGV4YW1wbGVzLCBpdCBzaG91bGQgYmUgYW4gZXZlbiBudW1iZXIgb2YKLSUgXHR0IHdpZHRocy4gRWFjaCBcdHQgY2hhcmFjdGVyIGlzIDFlbiwgc28gdHdvIG1ha2VzIGl0IDFlbS4KLSUgRnVydGhlcm1vcmUsIHRoZXNlIGRlZmluaXRpb25zIG11c3QgY29tZSBhZnRlciB3ZSBkZWZpbmUgb3VyIGZvbnRzLgotXG5ld2JveFxkYmxhcnJvd2JveCAgICBcbmV3Ym94XGxvbmdkYmxhcnJvd2JveAotXG5ld2JveFxwdXNoY2hhcmJveCAgICBcbmV3Ym94XGJ1bGxib3gKLVxuZXdib3hcZXF1aXZib3ggICAgICAgXG5ld2JveFxlcnJvcmJveAotCi0le1x0ZW50dAotJVxnbG9iYWxcc2V0Ym94XGRibGFycm93Ym94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxSaWdodGFycm93JFxoZmlsfQotJVxnbG9iYWxcc2V0Ym94XGxvbmdkYmxhcnJvd2JveCA9IFxoYm94IHRvIDFlbXtcaGZpbCRcbWFwc3RvJFxoZmlsfQotJVxnbG9iYWxcc2V0Ym94XHB1c2hjaGFyYm94ID0gXGhib3ggdG8gMWVte1xoZmlsJFxkYXNodiRcaGZpbH0KLSVcZ2xvYmFsXHNldGJveFxlcXVpdmJveCA9IFxoYm94IHRvIDFlbXtcaGZpbCRccHRleGVxdWl2JFxoZmlsfQotJSBBZGFwdGVkIGZyb20gdGhlIG1hbm1hYyBmb3JtYXQgKHAuNDIwIG9mIFRlWGJvb2spCi0lXGdsb2JhbFxzZXRib3hcYnVsbGJveCA9IFxoYm94IHRvIDFlbXtca2Vybi4xNWVtXHZydWxlIGhlaWdodCAuNzVleCB3aWR0aCAuODVleAotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggLjFleFxoZmlsfQotJX0KLQotJSBAcG9pbnR7fSwgQHJlc3VsdHt9LCBAZXhwYW5zaW9ue30sIEBwcmludHt9LCBAZXF1aXZ7fS4KLVxkZWZccG9pbnR7JFxzdGFyJH0KLVxkZWZccmVzdWx0e1xsZWF2ZXZtb2RlXHJhaXNlLjE1ZXhcaGJveCB0byAxZW17XGhmaWwkXFJpZ2h0YXJyb3ckXGhmaWx9fQotXGRlZlxleHBhbnNpb257XGxlYXZldm1vZGVccmFpc2UuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxtYXBzdG8kXGhmaWx9fQotXGRlZlxwcmludHtcbGVhdmV2bW9kZVxsb3dlci4xZXhcaGJveCB0byAxZW17XGhmaWwkXGRhc2h2JFxoZmlsfX0KLVxkZWZcZXF1aXZ7XGxlYXZldm1vZGVcbG93ZXIuMWV4XGhib3ggdG8gMWVte1xoZmlsJFxwdGV4ZXF1aXYkXGhmaWx9fQotCi0lIEFkYXB0ZWQgZnJvbSB0aGUgVGVYYm9vaydzIFxib3hpdC4KLXtcdGVudHQgXGdsb2JhbFxkaW1lbjAgPSAzZW19JSBXaWR0aCBvZiB0aGUgYm94LgotXGRpbWVuMiA9IC41NXB0ICUgVGhpY2tuZXNzIG9mIHJ1bGVzCi0lIFRoZSB0ZXh0LiAoYHInIGlzIG9wZW4gb24gdGhlIHJpZ2h0LCBgZScgc29tZXdoYXQgbGVzcyBzbyBvbiB0aGUgbGVmdC4pCi1cc2V0Ym94MCA9IFxoYm94e1xrZXJuLS43NXB0IFx0ZW5zZiBlcnJvclxrZXJuLTEuNXB0fQotCi1cZ2xvYmFsXHNldGJveFxlcnJvcmJveD1caGJveCB0byBcZGltZW4we1xoZmlsCi0gICBcaHNpemUgPSBcZGltZW4wIFxhZHZhbmNlXGhzaXplIGJ5IC01LjhwdCAlIFNwYWNlIHRvIGxlZnQrcmlnaHQuCi0gICBcYWR2YW5jZVxoc2l6ZSBieSAtMlxkaW1lbjIgJSBSdWxlcy4KLSAgIFx2Ym94ewotICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjIKLSAgICAgIFxoYm94e1x2cnVsZSB3aWR0aFxkaW1lbjIgXGtlcm4zcHQgICAgICAgICAgJSBTcGFjZSB0byBsZWZ0IG9mIHRleHQuCi0gICAgICAgICBcdnRvcHtca2VybjIuNHB0IFxib3gwIFxrZXJuMi40cHR9JSBTcGFjZSBhYm92ZS9iZWxvdy4KLSAgICAgICAgIFxrZXJuM3B0XHZydWxlIHdpZHRoXGRpbWVuMn0lIFNwYWNlIHRvIHJpZ2h0LgotICAgICAgXGhydWxlIGhlaWdodFxkaW1lbjJ9Ci0gICAgXGhmaWx9Ci0KLSUgVGhlIEBlcnJvcnt9IGNvbW1hbmQuCi1cZGVmXGVycm9ye1xsZWF2ZXZtb2RlXGxvd2VyLjdleFxjb3B5XGVycm9yYm94fQotCi0lIEB0ZXggLi4uIEBlbmQgdGV4ICAgIGVzY2FwZXMgaW50byByYXcgVGV4IHRlbXBvcmFyaWx5LgotJSBPbmUgZXhjZXB0aW9uOiBAIGlzIHN0aWxsIGFuIGVzY2FwZSBjaGFyYWN0ZXIsIHNvIHRoYXQgQGVuZCB0ZXggd29ya3MuCi0lIEJ1dCBcQCBvciBAQCB3aWxsIGdldCBhIHBsYWluIHRleCBAIGNoYXJhY3Rlci4KLQotXGRlZlx0ZXh7XGJlZ2luZ3JvdXAKLSAgXGNhdGNvZGUgYFxcPTAgXGNhdGNvZGUgYFx7PTEgXGNhdGNvZGUgYFx9PTIKLSAgXGNhdGNvZGUgYFwkPTMgXGNhdGNvZGUgYFwmPTQgXGNhdGNvZGUgYFwjPTYKLSAgXGNhdGNvZGUgYFxePTcgXGNhdGNvZGUgYFxfPTggXGNhdGNvZGUgYFx+PTEzIFxsZXR+PVx0aWUKLSAgXGNhdGNvZGUgYFwlPTE0Ci0gIFxjYXRjb2RlIDQzPTEyICUgcGx1cwotICBcY2F0Y29kZWBcIj0xMgotICBcY2F0Y29kZWBcPT0xMgotICBcY2F0Y29kZWBcfD0xMgotICBcY2F0Y29kZWBcPD0xMgotICBcY2F0Y29kZWBcPj0xMgotICBcZXNjYXBlY2hhcj1gXFwKLSAgJQotICBcbGV0XGI9XHB0ZXhiCi0gIFxsZXRcYnVsbGV0PVxwdGV4YnVsbGV0Ci0gIFxsZXRcYz1ccHRleGMKLSAgXGxldFwsPVxwdGV4Y29tbWEKLSAgXGxldFwuPVxwdGV4ZG90Ci0gIFxsZXRcZG90cz1ccHRleGRvdHMKLSAgXGxldFxlcXVpdj1ccHRleGVxdWl2Ci0gIFxsZXRcIT1ccHRleGV4Y2xhbQotICBcbGV0XGk9XHB0ZXhpCi0gIFxsZXRcez1ccHRleGxicmFjZQotICBcbGV0XCs9XHRhYmFsaWduCi0gIFxsZXRcfT1ccHRleHJicmFjZQotICBcbGV0XCo9XHB0ZXhzdGFyCi0gIFxsZXRcdD1ccHRleHQKLSAgJQotICBcZGVmXGVuZGxkb3Rze1xtYXRoaW5uZXJ7XGxkb3RzXGxkb3RzXGxkb3RzXGxkb3RzfX0lCi0gIFxkZWZcZW5kZG90c3tccmVsYXhcaWZtbW9kZVxlbmRsZG90c1xlbHNlJFxtYXRoc3Vycm91bmQ9MHB0IFxlbmRsZG90c1wsJFxmaX0lCi0gIFxkZWZcQHtAfSUKLVxsZXRcRXRleD1cZW5kZ3JvdXB9Ci0KLSUgRGVmaW5lIEBsaXNwIC4uLiBAZW5kbGlzcC4KLSUgQGxpc3AgZG9lcyBhIFxiZWdpbmdyb3VwIHNvIGl0IGNhbiByZWJpbmQgdGhpbmdzLAotJSBpbmNsdWRpbmcgdGhlIGRlZmluaXRpb24gb2YgQGVuZGxpc3AgKHdoaWNoIG5vcm1hbGx5IGlzIGVycm9uZW91cykuCi0KLSUgQW1vdW50IHRvIG5hcnJvdyB0aGUgbWFyZ2lucyBieSBmb3IgQGxpc3AuCi1cbmV3c2tpcFxsaXNwbmFycm93aW5nIFxsaXNwbmFycm93aW5nPTAuNGluCi0KLSUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiB0aGF0IF5eTSBnZXRzIGluc2lkZSBAbGlzcCwgQGV4YW1wbGUsIGFuZCBvdGhlcgotJSBzdWNoIGVudmlyb25tZW50cy4gIFxudWxsIGlzIGJldHRlciB0aGFuIGEgc3BhY2UsIHNpbmNlIGl0IGRvZXNuJ3QKLSUgaGF2ZSBhbnkgd2lkdGguCi1cZGVmXGxpc3BwYXJ7XG51bGxcZW5kZ3JhZn0KLQotJSBNYWtlIGVhY2ggc3BhY2UgY2hhcmFjdGVyIGluIHRoZSBpbnB1dCBwcm9kdWNlIGEgbm9ybWFsIGludGVyd29yZAotJSBzcGFjZSBpbiB0aGUgb3V0cHV0LiAgRG9uJ3QgYWxsb3cgYSBsaW5lIGJyZWFrIGF0IHRoaXMgc3BhY2UsIGFzIHRoaXMKLSUgaXMgdXNlZCBvbmx5IGluIGVudmlyb25tZW50cyBsaWtlIEBleGFtcGxlLCB3aGVyZSBlYWNoIGxpbmUgb2YgaW5wdXQKLSUgc2hvdWxkIHByb2R1Y2UgYSBsaW5lIG9mIG91dHB1dCBhbnl3YXkuCi0lCi17XG9iZXlzcGFjZXMgJQotXGdkZWZcc2Vwc3BhY2Vze1xvYmV5c3BhY2VzXGxldCA9XHRpZX19Ci0KLSUgRGVmaW5lIFxvYmV5ZWRzcGFjZSB0byBiZSBvdXIgYWN0aXZlIHNwYWNlLCB3aGF0ZXZlciBpdCBpcy4gIFRoaXMgaXMKLSUgZm9yIHVzZSBpbiBccGFyc2VhcmcuCi17XHNlcHNwYWNlcyUKLVxnbG9iYWxcbGV0XG9iZXllZHNwYWNlPSB9Ci0KLSUgVGhpcyBzcGFjZSBpcyBhbHdheXMgcHJlc2VudCBhYm92ZSBhbmQgYmVsb3cgZW52aXJvbm1lbnRzLgotXG5ld3NraXBcZW52c2tpcGFtb3VudCBcZW52c2tpcGFtb3VudCA9IDBwdAotCi0lIE1ha2Ugc3BhY2luZyBhbmQgYmVsb3cgZW52aXJvbm1lbnQgc3ltbWV0cmljYWwuICBXZSB1c2UgXHBhcnNraXAgaGVyZQotJSB0byBoZWxwIGluIGRvaW5nIHRoYXQsIHNpbmNlIGluIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnRzIFxwYXJza2lwCi0lIGlzIHJlc2V0IHRvIHplcm87IHRodXMgdGhlIFxhZnRlcmVudmJyZWFrIGluc2VydHMgbm8gc3BhY2UgLS0gYnV0IHRoZQotJSBzdGFydCBvZiB0aGUgbmV4dCBwYXJhZ3JhcGggd2lsbCBpbnNlcnQgXHBhcnNraXAKLSUKLVxkZWZcYWJvdmVlbnZicmVha3t7XGFkdmFuY2VcZW52c2tpcGFtb3VudCBieSBccGFyc2tpcAotXGVuZGdyYWYgXGlmZGltXGxhc3Rza2lwPFxlbnZza2lwYW1vdW50Ci1ccmVtb3ZlbGFzdHNraXAgXHBlbmFsdHktNTAgXHZza2lwXGVudnNraXBhbW91bnQgXGZpfX0KLQotXGxldFxhZnRlcmVudmJyZWFrID0gXGFib3ZlZW52YnJlYWsKLQotJSBcbm9uYXJyb3dpbmcgaXMgYSBmbGFnLiAgSWYgInNldCIsIEBsaXNwIGV0YyBkb24ndCBuYXJyb3cgbWFyZ2lucy4KLVxsZXRcbm9uYXJyb3dpbmc9XHJlbGF4Ci0KLSUgQGNhcnRvdWNoZSAuLi4gQGVuZCBjYXJ0b3VjaGU6IGRyYXcgcmVjdGFuZ2xlIHcvcm91bmRlZCBjb3JuZXJzIGFyb3VuZAotJSBlbnZpcm9ubWVudCBjb250ZW50cy4KLVxmb250XGNpcmNsZT1sY2lyY2xlMTAKLVxuZXdkaW1lblxjaXJjdGhpY2sKLVxuZXdkaW1lblxjYXJ0b3V0ZXJcbmV3ZGltZW5cY2FydGlubmVyCi1cbmV3c2tpcFxub3JtYnNraXBcbmV3c2tpcFxub3JtcHNraXBcbmV3c2tpcFxub3JtbHNraXAKLVxjaXJjdGhpY2s9XGZvbnRkaW1lbjhcY2lyY2xlCi0lCi1cZGVmXGN0bHt7XGNpcmNsZVxjaGFyJzAxM1xoc2tpcCAtNnB0fX0lIDZwdCBmcm9tIHBsIGZpbGU6IDEvMmNoYXJ3aWR0aAotXGRlZlxjdHJ7e1xoc2tpcCA2cHRcY2lyY2xlXGNoYXInMDEwfX0KLVxkZWZcY2Jse3tcY2lyY2xlXGNoYXInMDEyXGhza2lwIC02cHR9fQotXGRlZlxjYnJ7e1xoc2tpcCA2cHRcY2lyY2xlXGNoYXInMDExfX0KLVxkZWZcY2FydHRvcHtcaGJveCB0byBcY2FydG91dGVye1xoc2tpcFxsc2tpcAotICAgICAgICBcY3RsXGxlYWRlcnNcaHJ1bGUgaGVpZ2h0XGNpcmN0aGlja1xoZmlsXGN0cgotICAgICAgICBcaHNraXBccnNraXB9fQotXGRlZlxjYXJ0Ym90e1xoYm94IHRvIFxjYXJ0b3V0ZXJ7XGhza2lwXGxza2lwCi0gICAgICAgIFxjYmxcbGVhZGVyc1xocnVsZSBoZWlnaHRcY2lyY3RoaWNrXGhmaWxcY2JyCi0gICAgICAgIFxoc2tpcFxyc2tpcH19Ci0lCi1cbmV3c2tpcFxsc2tpcFxuZXdza2lwXHJza2lwCi0KLVxsb25nXGRlZlxjYXJ0b3VjaGV7JQotXGJlZ2luZ3JvdXAKLSAgICAgICAgXGxza2lwPVxsZWZ0c2tpcCBccnNraXA9XHJpZ2h0c2tpcAotICAgICAgICBcbGVmdHNraXA9MHB0XHJpZ2h0c2tpcD0wcHQgJXdlIHdhbnQgdGhlc2UgKm91dHNpZGUqLgotICAgICAgICBcY2FydGlubmVyPVxoc2l6ZSBcYWR2YW5jZVxjYXJ0aW5uZXIgYnktXGxza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFxhZHZhbmNlXGNhcnRpbm5lciBieS1ccnNraXAKLSAgICAgICAgXGNhcnRvdXRlcj1caHNpemUKLSAgICAgICAgXGFkdmFuY2VcY2FydG91dGVyIGJ5IDE4LjRwdCAlIGFsbG93IGZvciAzcHQga2VybnMgb24gZWl0aGVyCi0lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lkZSwgYW5kIGZvciA2cHQgd2FzdGUgZnJvbQotJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY29ybmVyIGNoYXIsIGFuZCBydWxlIHRoaWNrbmVzcwotICAgICAgICBcbm9ybWJza2lwPVxiYXNlbGluZXNraXAgXG5vcm1wc2tpcD1ccGFyc2tpcCBcbm9ybWxza2lwPVxsaW5lc2tpcAotICAgICAgICAlIEZsYWcgdG8gdGVsbCBAbGlzcCwgZXRjLiwgbm90IHRvIG5hcnJvdyBtYXJnaW4uCi0gICAgICAgIFxsZXRcbm9uYXJyb3dpbmc9XGNvbW1lbnQKLSAgICAgICAgXHZib3hcYmdyb3VwCi0gICAgICAgICAgICAgICAgXGJhc2VsaW5lc2tpcD0wcHRccGFyc2tpcD0wcHRcbGluZXNraXA9MHB0Ci0gICAgICAgICAgICAgICAgXGNhcnR0b3AKLSAgICAgICAgICAgICAgICBcaGJveFxiZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgIFxoc2tpcFxsc2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgXHZydWxlXGtlcm4zcHQKLSAgICAgICAgICAgICAgICAgICAgICAgIFx2Ym94XGJncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcaHNpemU9XGNhcnRpbm5lcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBca2VybjNwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcYmVnaW5ncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxiYXNlbGluZXNraXA9XG5vcm1ic2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxsaW5lc2tpcD1cbm9ybWxza2lwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHBhcnNraXA9XG5vcm1wc2tpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx2c2tpcCAtXHBhcnNraXAKLVxkZWZcRWNhcnRvdWNoZXslCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxlbmRncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBca2VybjNwdAotICAgICAgICAgICAgICAgICAgICAgICAgXGVncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgXGtlcm4zcHRcdnJ1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgIFxoc2tpcFxyc2tpcAotICAgICAgICAgICAgICAgIFxlZ3JvdXAKLSAgICAgICAgICAgICAgICBcY2FydGJvdAotICAgICAgICBcZWdyb3VwCi1cZW5kZ3JvdXAKLX19Ci0KLQotJSBUaGlzIG1hY3JvIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFsbCB0aGUgQGV4YW1wbGUgdmFyaWFudHMsCi0lIGluc2lkZSBhIGdyb3VwLgotXGRlZlxub25maWxsc3RhcnR7JQotICBcYWJvdmVlbnZicmVhawotICBcaW5FTlYgJSBUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgYm9keQotICBcaGZ1enogPSAxMnB0ICUgRG9uJ3QgYmUgZnVzc3kKLSAgXHNlcHNwYWNlcyAlIE1ha2Ugc3BhY2VzIGJlIHdvcmQtc2VwYXJhdG9ycyByYXRoZXIgdGhhbiBzcGFjZSB0b2tlbnMuCi0gIFxzaW5nbGVzcGFjZQotICBcbGV0XHBhciA9IFxsaXNwcGFyICUgZG9uJ3QgaWdub3JlIGJsYW5rIGxpbmVzCi0gIFxvYmV5bGluZXMgJSBlYWNoIGxpbmUgb2YgaW5wdXQgaXMgYSBsaW5lIG9mIG91dHB1dAotICBccGFyc2tpcCA9IDBwdAotICBccGFyaW5kZW50ID0gMHB0Ci0gIFxlbWVyZ2VuY3lzdHJldGNoID0gMHB0ICUgZG9uJ3QgdHJ5IHRvIGF2b2lkIG92ZXJmdWxsIGJveGVzCi0gICUgQGNhcnRvdWNoZSBkZWZpbmVzIFxub25hcnJvd2luZyB0byBpbmhpYml0IG5hcnJvd2luZwotICAlIGF0IG5leHQgbGV2ZWwgZG93bi4KLSAgXGlmeFxub25hcnJvd2luZ1xyZWxheAotICAgIFxhZHZhbmNlIFxsZWZ0c2tpcCBieSBcbGlzcG5hcnJvd2luZwotICAgIFxleGRlbnRhbW91bnQ9XGxpc3BuYXJyb3dpbmcKLSAgICBcbGV0XGV4ZGVudD1cbm9maWxsZXhkZW50Ci0gICAgXGxldFxub25hcnJvd2luZz1ccmVsYXgKLSAgXGZpCi19Ci0KLSUgRGVmaW5lIHRoZSBcRS4uLiBjb250cm9sIHNlcXVlbmNlIG9ubHkgaWYgd2UgYXJlIGluc2lkZSB0aGUgcGFydGljdWxhcgotJSBlbnZpcm9ubWVudCwgc28gdGhlIGVycm9yIGNoZWNraW5nIGluIFxlbmQgd2lsbCB3b3JrLgotJSAKLSUgVG8gZW5kIGFuIEBleGFtcGxlLWxpa2UgZW52aXJvbm1lbnQsIHdlIGZpcnN0IGVuZCB0aGUgcGFyYWdyYXBoICh2aWEKLSUgXGFmdGVyZW52YnJlYWsncyB2ZXJ0aWNhbCBnbHVlKSwgYW5kIHRoZW4gdGhlIGdyb3VwLiAgVGhhdCB3YXkgd2Uga2VlcAotJSB0aGUgemVybyBccGFyc2tpcCB0aGF0IHRoZSBlbnZpcm9ubWVudHMgc2V0IC0tIFxwYXJza2lwIGdsdWUgd2lsbCBiZQotJSBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHBhcmFncmFwaCBpbiB0aGUgZG9jdW1lbnQsIGFmdGVyCi0lIHRoZSBlbnZpcm9ubWVudC4KLSUKLVxkZWZcbm9uZmlsbGZpbmlzaHtcYWZ0ZXJlbnZicmVha1xlbmRncm91cH0KLQotJSBAbGlzcDogaW5kZW50ZWQsIG5hcnJvd2VkLCB0eXBld3JpdGVyIGZvbnQuCi1cZGVmXGxpc3B7XGJlZ2luZ3JvdXAKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVsaXNwID0gXG5vbmZpbGxmaW5pc2gKLSAgXHR0Ci0gIFxsZXRca2JkZm9udCA9IFxrYmRleGFtcGxlZm9udCAlIEFsbG93IEBrYmQgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwuCi0gIFxnb2JibGUgICAgICAgJSBlYXQgcmV0dXJuCi19Ci0KLSUgQGV4YW1wbGU6IFNhbWUgYXMgQGxpc3AuCi1cZGVmXGV4YW1wbGV7XGJlZ2luZ3JvdXAgXGRlZlxFZXhhbXBsZXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cbGlzcH0KLQotJSBAc21hbGwuLi4gaXMgdXN1YWxseSBlcXVpdmFsZW50IHRvIHRoZSBub24tc21hbGwgKEBzbWFsbGJvb2sKLSUgcmVkZWZpbmVzKS4gIFdlIG11c3QgY2FsbCBcZXhhbXBsZSAob3Igd2hhdGV2ZXIpIGxhc3QgaW4gdGhlCi0lIGRlZmluaXRpb24sIHNpbmNlIGl0IHJlYWRzIHRoZSByZXR1cm4gZm9sbG93aW5nIHRoZSBAZXhhbXBsZSAob3IKLSUgd2hhdGV2ZXIpIGNvbW1hbmQuCi0lIAotJSBUaGlzIGFjdHVhbGx5IGFsbG93cyAoZm9yIGV4YW1wbGUpIEBlbmQgZGlzcGxheSBpbnNpZGUgYW4KLSUgQHNtYWxsZGlzcGxheS4gIFRvbyBiYWQsIGJ1dCBtYWtlaW5mbyB3aWxsIGNhdGNoIHRoZSBlcnJvciBhbnl3YXkuCi0lCi1cZGVmXHNtYWxsZGlzcGxheXtcYmVnaW5ncm91cFxkZWZcRXNtYWxsZGlzcGxheXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cZGlzcGxheX0KLVxkZWZcc21hbGxleGFtcGxle1xiZWdpbmdyb3VwXGRlZlxFc21hbGxleGFtcGxle1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxsaXNwfQotXGRlZlxzbWFsbGZvcm1hdHtcYmVnaW5ncm91cFxkZWZcRXNtYWxsZm9ybWF0e1xub25maWxsZmluaXNoXGVuZGdyb3VwfVxmb3JtYXR9Ci1cZGVmXHNtYWxsbGlzcHtcYmVnaW5ncm91cFxkZWZcRXNtYWxsbGlzcHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH1cbGlzcH0KLQotJSBSZWFsIEBzbWFsbGV4YW1wbGUgYW5kIEBzbWFsbGxpc3AgKHdoZW4gQHNtYWxsYm9vayk6IHVzZSBzbWFsbGVyIGZvbnRzLgotJSBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IFBhdmVsQHhlcm94LgotXGRlZlxzbWFsbGxpc3B4e1xiZWdpbmdyb3VwCi0gIFxkZWZcRXNtYWxsbGlzcHtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH0lCi0gIFxkZWZcRXNtYWxsZXhhbXBsZXtcbm9uZmlsbGZpbmlzaFxlbmRncm91cH0lCi0gIFxpbmRleGZvbnRzCi0gIFxsaXNwCi19Ci0KLSUgQGRpc3BsYXk6IHNhbWUgYXMgQGxpc3AgZXhjZXB0IGtlZXAgY3VycmVudCBmb250LgotJQotXGRlZlxkaXNwbGF5e1xiZWdpbmdyb3VwCi0gIFxub25maWxsc3RhcnQKLSAgXGxldFxFZGlzcGxheSA9IFxub25maWxsZmluaXNoCi0gIFxnb2JibGUKLX0KLQotJSBAc21hbGxkaXNwbGF5ICh3aGVuIEBzbWFsbGJvb2spOiBAZGlzcGxheSBwbHVzIHNtYWxsZXIgZm9udHMuCi0lCi1cZGVmXHNtYWxsZGlzcGxheXh7XGJlZ2luZ3JvdXAKLSAgXGRlZlxFc21hbGxkaXNwbGF5e1xub25maWxsZmluaXNoXGVuZGdyb3VwfSUKLSAgXGluZGV4Zm9udHMgXHJtCi0gIFxkaXNwbGF5Ci19Ci0KLSUgQGZvcm1hdDogc2FtZSBhcyBAZGlzcGxheSBleGNlcHQgZG9uJ3QgbmFycm93IG1hcmdpbnMuCi0lCi1cZGVmXGZvcm1hdHtcYmVnaW5ncm91cAotICBcbGV0XG5vbmFycm93aW5nID0gdAotICBcbm9uZmlsbHN0YXJ0Ci0gIFxsZXRcRWZvcm1hdCA9IFxub25maWxsZmluaXNoCi0gIFxnb2JibGUKLX0KLQotJSBAc21hbGxmb3JtYXQgKHdoZW4gQHNtYWxsYm9vayk6IEBmb3JtYXQgcGx1cyBzbWFsbGVyIGZvbnRzLgotJQotXGRlZlxzbWFsbGZvcm1hdHh7XGJlZ2luZ3JvdXAKLSAgXGRlZlxFc21hbGxmb3JtYXR7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9JQotICBcaW5kZXhmb250cyBccm0KLSAgXGZvcm1hdAotfQotCi0lIEBmbHVzaGxlZnQgKHNhbWUgYXMgQGZvcm1hdCkuCi0lCi1cZGVmXGZsdXNobGVmdHtcYmVnaW5ncm91cCBcZGVmXEVmbHVzaGxlZnR7XG5vbmZpbGxmaW5pc2hcZW5kZ3JvdXB9XGZvcm1hdH0KLQotJSBAZmx1c2hyaWdodC4KLSUgCi1cZGVmXGZsdXNocmlnaHR7XGJlZ2luZ3JvdXAKLSAgXGxldFxub25hcnJvd2luZyA9IHQKLSAgXG5vbmZpbGxzdGFydAotICBcbGV0XEVmbHVzaHJpZ2h0ID0gXG5vbmZpbGxmaW5pc2gKLSAgXGFkdmFuY2VcbGVmdHNraXAgYnkgMHB0IHBsdXMgMWZpbGwKLSAgXGdvYmJsZQotfQotCi0lIEBxdW90YXRpb24gZG9lcyBub3JtYWwgbGluZWJyZWFraW5nIChoZW5jZSB3ZSBjYW4ndCB1c2UgXG5vbmZpbGxzdGFydCkKLSUgYW5kIG5hcnJvd3MgdGhlIG1hcmdpbnMuCi0lCi1cZGVmXHF1b3RhdGlvbnslCi0gIFxiZWdpbmdyb3VwXGluRU5WICVUaGlzIGdyb3VwIGVuZHMgYXQgdGhlIGVuZCBvZiB0aGUgQHF1b3RhdGlvbiBib2R5Ci0gIHtccGFyc2tpcD0wcHQgXGFib3ZlZW52YnJlYWt9JSBiZWNhdXNlIFxhYm92ZWVudmJyZWFrIGluc2VydHMgXHBhcnNraXAKLSAgXHNpbmdsZXNwYWNlCi0gIFxwYXJpbmRlbnQ9MHB0Ci0gICUgV2UgaGF2ZSByZXRhaW5lZCBhIG5vbnplcm8gcGFyc2tpcCBmb3IgdGhlIGVudmlyb25tZW50LCBzaW5jZSB3ZSdyZQotICAlIGRvaW5nIG5vcm1hbCBmaWxsaW5nLiBTbyB0byBhdm9pZCBleHRyYSBzcGFjZSBiZWxvdyB0aGUgZW52aXJvbm1lbnQuLi4KLSAgXGRlZlxFcXVvdGF0aW9ue1xwYXJza2lwID0gMHB0IFxub25maWxsZmluaXNofSUKLSAgJQotICAlIEBjYXJ0b3VjaGUgZGVmaW5lcyBcbm9uYXJyb3dpbmcgdG8gaW5oaWJpdCBuYXJyb3dpbmcgYXQgbmV4dCBsZXZlbCBkb3duLgotICBcaWZ4XG5vbmFycm93aW5nXHJlbGF4Ci0gICAgXGFkdmFuY2VcbGVmdHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKLSAgICBcYWR2YW5jZVxyaWdodHNraXAgYnkgXGxpc3BuYXJyb3dpbmcKLSAgICBcZXhkZW50YW1vdW50ID0gXGxpc3BuYXJyb3dpbmcKLSAgICBcbGV0XG5vbmFycm93aW5nID0gXHJlbGF4Ci0gIFxmaQotfQotCi0KLVxtZXNzYWdle2RlZnVucyx9Ci0lIERlZmluZSBmb3JtYXR0ZXIgZm9yIGRlZnVucwotJSBGaXJzdCwgYWxsb3cgdXNlciB0byBjaGFuZ2UgZGVmaW5pdGlvbiBvYmplY3QgZm9udCAoXGRmKSBpbnRlcm5hbGx5Ci1cZGVmXHNldGRlZmZvbnQgIzEge1xjc25hbWUgREVGIzFcZW5kY3NuYW1lfQotCi1cbmV3c2tpcFxkZWZib2R5aW5kZW50IFxkZWZib2R5aW5kZW50PS40aW4KLVxuZXdza2lwXGRlZmFyZ3NpbmRlbnQgXGRlZmFyZ3NpbmRlbnQ9NTBwdAotXG5ld3NraXBcZGVmdHlwZW1hcmdpbiBcZGVmdHlwZW1hcmdpbj0xMnB0Ci1cbmV3c2tpcFxkZWZsYXN0YXJnbWFyZ2luIFxkZWZsYXN0YXJnbWFyZ2luPTE4cHQKLQotXG5ld2NvdW50XHBhcmVuY291bnQKLSUgZGVmaW5lIFxmdW5jdGlvbnBhcmVucywgd2hpY2ggbWFrZXMgKCBhbmQgKSBhbmQgJiBkbyBzcGVjaWFsIHRoaW5ncy4KLSUgXGZ1bmN0aW9ucGFyZW5zIGFmZmVjdHMgdGhlIGdyb3VwIGl0IGlzIGNvbnRhaW5lZCBpbi4KLVxkZWZcYWN0aXZlcGFyZW5zeyUKLVxjYXRjb2RlYFwoPVxhY3RpdmUgXGNhdGNvZGVgXCk9XGFjdGl2ZSBcY2F0Y29kZWBcJj1cYWN0aXZlCi1cY2F0Y29kZWBcWz1cYWN0aXZlIFxjYXRjb2RlYFxdPVxhY3RpdmV9Ci0KLSUgTWFrZSBjb250cm9sIHNlcXVlbmNlcyB3aGljaCBhY3QgbGlrZSBub3JtYWwgcGFyZW50aGVzaXMgY2hhcnMuCi1cbGV0XGxwYXJlbiA9ICggXGxldFxycGFyZW4gPSApCi0KLXtcYWN0aXZlcGFyZW5zICUgTm93LCBzbWFydCBwYXJlbnMgZG9uJ3QgdHVybiBvbiB1bnRpbCAmZm9vIChzZWUgXGFtcHJtKQotCi0lIEJlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIGRlZmluaXRpb24gZm9yIGAoJywgZXRjLiAgRm9yIGV4YW1wbGUsCi0lIGlmIHRoZSBmbiBuYW1lIGhhcyBwYXJlbnMgaW4gaXQsIFxib2xkYnJheCB3aWxsIG5vdCBiZSBpbiBlZmZlY3QgeWV0LAotJSBzbyBUZVggd291bGQgb3RoZXJ3aXNlIGNvbXBsYWluIGFib3V0IHVuZGVmaW5lZCBjb250cm9sIHNlcXVlbmNlLgotXGdsb2JhbFxsZXQoPVxscGFyZW4gXGdsb2JhbFxsZXQpPVxycGFyZW4KLVxnbG9iYWxcbGV0Wz1cbGJyYWNrIFxnbG9iYWxcbGV0XT1ccmJyYWNrCi0KLVxnZGVmXGZ1bmN0aW9ucGFyZW5ze1xib2xkYnJheFxsZXQmPVxhbXBybVxwYXJlbmNvdW50PTAgfQotXGdkZWZcYm9sZGJyYXh7XGxldCg9XG9wbnJcbGV0KT1cY2xuclxsZXRbPVxsYnJiXGxldF09XHJicmJ9Ci0lIFRoaXMgaXMgdXNlZCB0byB0dXJuIG9uIHNwZWNpYWwgcGFyZW5zCi0lIGJ1dCBtYWtlICYgYWN0IG9yZGluYXJ5IChnaXZlbiB0aGF0IGl0J3MgYWN0aXZlKS4KLVxnZGVmXGJvbGRicmF4bm9hbXB7XGxldCg9XG9wbnJcbGV0KT1cY2xuclxsZXRbPVxsYnJiXGxldF09XHJicmJcbGV0Jj1cYW1wbnJ9Ci0KLSUgRGVmaW5pdGlvbnMgb2YgKCwgKSBhbmQgJiB1c2VkIGluIGFyZ3MgZm9yIGZ1bmN0aW9ucy4KLSUgVGhpcyBpcyB0aGUgZGVmaW5pdGlvbiBvZiAoIG91dHNpZGUgb2YgYWxsIHBhcmVudGhlc2VzLgotXGdkZWZcb3BybSMxIHt7XHJtXGNoYXJgXCh9IzEgXGJmIFxsZXQoPVxvcG5lc3RlZAotICBcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxCi19Ci0lCi0lIFRoaXMgaXMgdGhlIGRlZmluaXRpb24gb2YgKCB3aGVuIGFscmVhZHkgaW5zaWRlIGEgbGV2ZWwgb2YgcGFyZW5zLgotXGdkZWZcb3BuZXN0ZWR7XGNoYXJgXChcZ2xvYmFsXGFkdmFuY2VccGFyZW5jb3VudCBieSAxIH0KLSUKLVxnZGVmXGNscm17JSBQcmludCBhIHBhcmVuIGluIHJvbWFuIGlmIGl0IGlzIHRha2luZyB1cyBiYWNrIHRvIGRlcHRoIG9mIDAuCi0gICUgYWxzbyBpbiB0aGF0IGNhc2UgcmVzdG9yZSB0aGUgb3V0ZXItbGV2ZWwgZGVmaW5pdGlvbiBvZiAoLgotICBcaWZudW0gXHBhcmVuY291bnQ9MSB7XHJtIFxjaGFyIGBcKX1cc2wgXGxldCg9XG9wcm0gXGVsc2UgXGNoYXIgYFwpIFxmaQotICBcZ2xvYmFsXGFkdmFuY2UgXHBhcmVuY291bnQgYnkgLTEgfQotJSBJZiB3ZSBlbmNvdW50ZXIgJmZvbywgdGhlbiB0dXJuIG9uICgpLWhhY2tpbmcgYWZ0ZXJ3YXJkcwotXGdkZWZcYW1wcm0jMSB7e1xybVwmIzF9XGxldCg9XG9wcm0gXGxldCk9XGNscm1cIH0KLSUKLVxnZGVmXG5vcm1hbHBhcmVuc3tcYm9sZGJyYXhcbGV0Jj1cYW1wbnJ9Ci19ICUgRW5kIG9mIGRlZmluaXRpb24gaW5zaWRlIFxhY3RpdmVwYXJlbnMKLSUlIFRoZXNlIHBhcmVucyAoaW4gXGJvbGRicmF4KSBhY3R1YWxseSBhcmUgYSBsaXR0bGUgYm9sZGVyIHRoYW4gdGhlCi0lJSBjb250YWluZWQgdGV4dC4gIFRoaXMgaXMgZXNwZWNpYWxseSBuZWVkZWQgZm9yIFsgYW5kIF0KLVxkZWZcb3Bucnt7XHNmXGNoYXJgXCh9XGdsb2JhbFxhZHZhbmNlXHBhcmVuY291bnQgYnkgMSB9Ci1cZGVmXGNsbnJ7e1xzZlxjaGFyYFwpfVxnbG9iYWxcYWR2YW5jZVxwYXJlbmNvdW50IGJ5IC0xIH0KLVxkZWZcYW1wbnJ7XCZ9Ci1cZGVmXGxicmJ7e1xiZlxjaGFyYFxbfX0KLVxkZWZccmJyYnt7XGJmXGNoYXJgXF19fQotCi0lIEZpcnN0LCBkZWZuYW1lLCB3aGljaCBmb3JtYXRzIHRoZSBoZWFkZXIgbGluZSBpdHNlbGYuCi0lICMxIHNob3VsZCBiZSB0aGUgZnVuY3Rpb24gbmFtZS4KLSUgIzIgc2hvdWxkIGJlIHRoZSB0eXBlIG9mIGRlZmluaXRpb24sIHN1Y2ggYXMgIkZ1bmN0aW9uIi4KLQotXGRlZlxkZWZuYW1lICMxIzJ7JQotJSBHZXQgdGhlIHZhbHVlcyBvZiBcbGVmdHNraXAgYW5kIFxyaWdodHNraXAgYXMgdGhleSB3ZXJlCi0lIG91dHNpZGUgdGhlIEBkZWYuLi4KLVxkaW1lbjI9XGxlZnRza2lwCi1cYWR2YW5jZVxkaW1lbjIgYnkgLVxkZWZib2R5aW5kZW50Ci1cbm9pbmRlbnQKLVxzZXRib3gwPVxoYm94e1xoc2tpcCBcZGVmbGFzdGFyZ21hcmdpbntccm0gIzJ9XGhza2lwIFxkZWZ0eXBlbWFyZ2lufSUKLVxkaW1lbjA9XGhzaXplIFxhZHZhbmNlIFxkaW1lbjAgYnkgLVx3ZDAgJSBjb21wdXRlIHNpemUgZm9yIGZpcnN0IGxpbmUKLVxkaW1lbjE9XGhzaXplIFxhZHZhbmNlIFxkaW1lbjEgYnkgLVxkZWZhcmdzaW5kZW50ICVzaXplIGZvciBjb250aW51YXRpb25zCi1ccGFyc2hhcGUgMiAwaW4gXGRpbWVuMCBcZGVmYXJnc2luZGVudCBcZGltZW4xCi0lIE5vdyBvdXRwdXQgYXJnIDIgKCJGdW5jdGlvbiIgb3Igc29tZSBzdWNoKQotJSBlbmRpbmcgYXQgXGRlZnR5cGVtYXJnaW4gZnJvbSB0aGUgcmlnaHQgbWFyZ2luLAotJSBidXQgc3R1Y2sgaW5zaWRlIGEgYm94IG9mIHdpZHRoIDAgc28gaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggbGluZWJyZWFraW5nCi17JSBBZGp1c3QgXGhzaXplIHRvIGV4Y2x1ZGUgdGhlIGFtYmllbnQgbWFyZ2lucywKLSUgc28gdGhhdCBccmlnaHRsaW5lIHdpbGwgb2JleSB0aGVtLgotXGFkdmFuY2UgXGhzaXplIGJ5IC1cZGltZW4yCi1ccmxhcHtccmlnaHRsaW5le3tccm0gIzJ9XGhza2lwIC0xLjI1cGMgfX19JQotJSBNYWtlIGFsbCBsaW5lcyB1bmRlcmZ1bGwgYW5kIG5vIGNvbXBsYWludHM6Ci1cdG9sZXJhbmNlPTEwMDAwIFxoYmFkbmVzcz0xMDAwMAotXGFkdmFuY2VcbGVmdHNraXAgYnkgLVxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci17XGRmICMxfVxlbnNraXAgICAgICAgICUgR2VuZXJhdGUgZnVuY3Rpb24gbmFtZQotfQotCi0lIEFjdHVhbGx5IHByb2Nlc3MgdGhlIGJvZHkgb2YgYSBkZWZpbml0aW9uCi0lICMxIHNob3VsZCBiZSB0aGUgdGVybWluYXRpbmcgY29udHJvbCBzZXF1ZW5jZSwgc3VjaCBhcyBcRWRlZnVuLgotJSAjMiBzaG91bGQgYmUgdGhlICJhbm90aGVyIG5hbWUiIGNvbnRyb2wgc2VxdWVuY2UsIHN1Y2ggYXMgXGRlZnVueC4KLSUgIzMgc2hvdWxkIGJlIHRoZSBjb250cm9sIHNlcXVlbmNlIHRoYXQgYWN0dWFsbHkgcHJvY2Vzc2VzIHRoZSBoZWFkZXIsCi0lICAgIHN1Y2ggYXMgXGRlZnVuaGVhZGVyLgotCi1cZGVmXGRlZnBhcnNlYm9keSAjMSMyIzN7XGJlZ2luZ3JvdXBcaW5FTlYlIEVudmlyb25tZW50IGZvciBkZWZpbml0aW9uYm9keQotXG1lZGJyZWFrICUKLSUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSUgc28gdGhhdCBpdCB3aWxsIGV4aXQgdGhpcyBncm91cC4KLVxkZWYjMXtcZW5kZ3JhZlxlbmRncm91cFxtZWRicmVha30lCi1cZGVmIzJ7XGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0IzN9JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cCAlCi1cY2F0Y29kZSA2MT1cYWN0aXZlICUgNjEgaXMgYD0nCi1cb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0IzN9Ci0KLSUgIzEgaXMgdGhlIFxFLi4uIGNvbnRyb2wgc2VxdWVuY2UgdG8gZW5kIHRoZSBkZWZpbml0aW9uICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMiBpcyB0aGUgXC4uLnggY29udHJvbCBzZXF1ZW5jZSBmb3IgY29uc2VjdXRpdmUgZm5zICh3aGljaCB3ZSBkZWZpbmUpLgotJSAjMyBpcyB0aGUgY29udHJvbCBzZXF1ZW5jZSB0byBjYWxsIHRvIHJlc3VtZSBwcm9jZXNzaW5nLgotJSAjNCwgZGVsaW1pdGVkIGJ5IHRoZSBzcGFjZSwgaXMgdGhlIGNsYXNzIG5hbWUuCi0lIAotXGRlZlxkZWZtZXRocGFyc2Vib2R5IzEjMiMzIzQge1xiZWdpbmdyb3VwXGluRU5WICUKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMyIyMxIHtcYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IyMxfX19JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IzR9fX0KLQotJSBAZGVmdHlwZW1ldGhvZCBoYXMgYW4gZXh0cmEgYXJndW1lbnQgdGhhdCBub3RoaW5nIGVsc2UgZG9lcy4gIFNpZ2guCi0lICMxIGlzIHRoZSBcRS4uLiBjb250cm9sIHNlcXVlbmNlIHRvIGVuZCB0aGUgZGVmaW5pdGlvbiAod2hpY2ggd2UgZGVmaW5lKS4KLSUgIzIgaXMgdGhlIFwuLi54IGNvbnRyb2wgc2VxdWVuY2UgZm9yIGNvbnNlY3V0aXZlIGZucyAod2hpY2ggd2UgZGVmaW5lKS4KLSUgIzMgaXMgdGhlIGNvbnRyb2wgc2VxdWVuY2UgdG8gY2FsbCB0byByZXN1bWUgcHJvY2Vzc2luZy4KLSUgIzQsIGRlbGltaXRlZCBieSB0aGUgc3BhY2UsIGlzIHRoZSBjbGFzcyBuYW1lLgotJSAjNSBpcyB0aGUgbWV0aG9kJ3MgcmV0dXJuIHR5cGUuCi0lIAotXGRlZlxkZWZ0eXBlbWV0aHBhcnNlYm9keSMxIzIjMyM0ICM1IHtcYmVnaW5ncm91cFxpbkVOViAlCi1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMiMjMSAjIzIge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xhY3RpdmVwYXJlbnNcc3BhY2VzcGxpdHsjM3sjIzF9eyMjMn19fSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXBcb2JleWxpbmVzXGFjdGl2ZXBhcmVuc1xzcGFjZXNwbGl0eyMzeyM0fXsjNX19fQotCi1cZGVmXGRlZm9wcGFyc2Vib2R5ICMxIzIjMyM0IzUge1xiZWdpbmdyb3VwXGluRU5WICUKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMyIyMxICMjMiB7XGRlZiM0eyMjMX0lCi1cYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IyMyfX19JQotXHBhcmluZGVudD0waW4KLVxhZHZhbmNlXGxlZnRza2lwIGJ5IFxkZWZib2R5aW5kZW50Ci1cZXhkZW50YW1vdW50PVxkZWZib2R5aW5kZW50Ci1cYmVnaW5ncm91cFxvYmV5bGluZXNcYWN0aXZlcGFyZW5zXHNwYWNlc3BsaXR7IzN7IzV9fX0KLQotJSBUaGVzZSBwYXJzaW5nIGZ1bmN0aW9ucyBhcmUgc2ltaWxhciB0byB0aGUgcHJlY2VkaW5nIG9uZXMKLSUgZXhjZXB0IHRoYXQgdGhleSBkbyBub3QgbWFrZSBwYXJlbnMgaW50byBhY3RpdmUgY2hhcmFjdGVycy4KLSUgVGhlc2UgYXJlIHVzZWQgZm9yICJ2YXJpYWJsZXMiIHNpbmNlIHRoZXkgaGF2ZSBubyBhcmd1bWVudHMuCi0KLVxkZWZcZGVmdmFycGFyc2Vib2R5ICMxIzIjM3tcYmVnaW5ncm91cFxpbkVOViUgRW52aXJvbm1lbnQgZm9yIGRlZmluaXRpb25ib2R5Ci1cbWVkYnJlYWsgJQotJSBEZWZpbmUgdGhlIGVuZCB0b2tlbiB0aGF0IHRoaXMgZGVmaW5pbmcgY29uc3RydWN0IHNwZWNpZmllcwotJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotXGRlZiMxe1xlbmRncmFmXGVuZGdyb3VwXG1lZGJyZWFrfSUKLVxkZWYjMntcYmVnaW5ncm91cFxvYmV5bGluZXNcc3BhY2VzcGxpdCMzfSUKLVxwYXJpbmRlbnQ9MGluCi1cYWR2YW5jZVxsZWZ0c2tpcCBieSBcZGVmYm9keWluZGVudAotXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotXGJlZ2luZ3JvdXAgJQotXGNhdGNvZGUgNjE9XGFjdGl2ZSAlCi1cb2JleWxpbmVzXHNwYWNlc3BsaXQjM30KLQotJSBUaGlzIGlzIHVzZWQgZm9yIFxkZWZ7dHAsdnJ9cGFyc2Vib2R5LiAgSXQgY291bGQgcHJvYmFibHkgYmUgdXNlZCBmb3IKLSUgc29tZSBvZiB0aGUgb3RoZXJzLCB0b28sIHdpdGggc29tZSBqdWRpY2lvdXMgY29uZGl0aW9uYWxzLgotJQotXGRlZlxwYXJzZWJvZHljb21tb24jMSMyIzN7JQotICBcYmVnaW5ncm91cFxpbkVOViAlCi0gIFxtZWRicmVhayAlCi0gICUgRGVmaW5lIHRoZSBlbmQgdG9rZW4gdGhhdCB0aGlzIGRlZmluaW5nIGNvbnN0cnVjdCBzcGVjaWZpZXMKLSAgJSBzbyB0aGF0IGl0IHdpbGwgZXhpdCB0aGlzIGdyb3VwLgotICBcZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotICBcZGVmIzIjIzEge1xiZWdpbmdyb3VwXG9iZXlsaW5lc1xzcGFjZXNwbGl0eyMzeyMjMX19fSUKLSAgXHBhcmluZGVudD0waW4KLSAgXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLSAgXGV4ZGVudGFtb3VudD1cZGVmYm9keWluZGVudAotICBcYmVnaW5ncm91cFxvYmV5bGluZXMKLX0KLQotXGRlZlxkZWZ2cnBhcnNlYm9keSMxIzIjMyM0IHslCi0gIFxwYXJzZWJvZHljb21tb257IzF9eyMyfXsjM30lCi0gIFxzcGFjZXNwbGl0eyMzeyM0fX0lCi19Ci0KLSUgVGhpcyBsb3NlcyBvbiBgQGRlZnRwIHtEYXRhIFR5cGV9IHtzdHJ1Y3QgdGVybWlvc30nIC0tIGl0IHRoaW5rcyB0aGUKLSUgdHlwZSBpcyBqdXN0IGBzdHJ1Y3QnLCBiZWNhdXNlIHdlIGxvc2UgdGhlIGJyYWNlcyBpbiBge3N0cnVjdAotJSB0ZXJtaW9zfScgd2hlbiBcc3BhY2VzcGxpdCByZWFkcyBpdHMgdW5kZWxpbWl0ZWQgYXJndW1lbnQuICBTaWdoLgotJSBcbGV0XGRlZnRwcGFyc2Vib2R5PVxkZWZ2cnBhcnNlYm9keQotJQotJSBTbywgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBwdXQgXGVtcHR5IGluIHdpdGggdGhlIHR5cGUgbmFtZS4gIFRoYXQKLSUgd2F5LCBUZVggd29uJ3QgZmluZCBleGFjdGx5IGB7Li4ufScgYXMgYW4gdW5kZWxpbWl0ZWQgYXJndW1lbnQsIGFuZAotJSB3b24ndCBzdHJpcCBvZmYgdGhlIGJyYWNlcy4KLSUKLVxkZWZcZGVmdHBwYXJzZWJvZHkgIzEjMiMzIzQgeyUKLSAgXHBhcnNlYm9keWNvbW1vbnsjMX17IzJ9eyMzfSUKLSAgXHNwYWNlc3BsaXR7XHBhcnNldHBoZWFkZXJsaW5leyMzeyM0fX19XGVtcHR5Ci19Ci0KLSUgRmluZSwgYnV0IHRoZW4gd2UgaGF2ZSB0byBldmVudHVhbGx5IHJlbW92ZSB0aGUgXGVtcHR5ICphbmQqIHRoZQotJSBicmFjZXMgKGlmIGFueSkuICBUaGF0J3Mgd2hhdCB0aGlzIGRvZXMuCi0lCi1cZGVmXHJlbW92ZWVtcHR5YnJhY2VzXGVtcHR5IzFccmVsYXh7IzF9Ci0KLSUgQWZ0ZXIgXHNwYWNlc3BsaXQgaGFzIGRvbmUgaXRzIHdvcmssIHRoaXMgaXMgY2FsbGVkIC0tICMxIGlzIHRoZSBmaW5hbAotJSB0aGluZyB0byBjYWxsLCAjMiB0aGUgdHlwZSBuYW1lICh3aGljaCBzdGFydHMgd2l0aCBcZW1wdHkpLCBhbmQgIzMKLSUgKHdoaWNoIG1pZ2h0IGJlIGVtcHR5KSB0aGUgYXJndW1lbnRzLgotJQotXGRlZlxwYXJzZXRwaGVhZGVybGluZSMxIzIjM3slCi0gICMxe1xyZW1vdmVlbXB0eWJyYWNlcyMyXHJlbGF4fXsjM30lCi19JQotCi1cZGVmXGRlZm9wdmFycGFyc2Vib2R5ICMxIzIjMyM0IzUge1xiZWdpbmdyb3VwXGluRU5WICUKLVxtZWRicmVhayAlCi0lIERlZmluZSB0aGUgZW5kIHRva2VuIHRoYXQgdGhpcyBkZWZpbmluZyBjb25zdHJ1Y3Qgc3BlY2lmaWVzCi0lIHNvIHRoYXQgaXQgd2lsbCBleGl0IHRoaXMgZ3JvdXAuCi1cZGVmIzF7XGVuZGdyYWZcZW5kZ3JvdXBcbWVkYnJlYWt9JQotXGRlZiMyIyMxICMjMiB7XGRlZiM0eyMjMX0lCi1cYmVnaW5ncm91cFxvYmV5bGluZXNcc3BhY2VzcGxpdHsjM3sjIzJ9fX0lCi1ccGFyaW5kZW50PTBpbgotXGFkdmFuY2VcbGVmdHNraXAgYnkgXGRlZmJvZHlpbmRlbnQKLVxleGRlbnRhbW91bnQ9XGRlZmJvZHlpbmRlbnQKLVxiZWdpbmdyb3VwXG9iZXlsaW5lc1xzcGFjZXNwbGl0eyMzeyM1fX19Ci0KLSUgU3BsaXQgdXAgIzIgYXQgdGhlIGZpcnN0IHNwYWNlIHRva2VuLgotJSBjYWxsICMxIHdpdGggdHdvIGFyZ3VtZW50czoKLSUgIHRoZSBmaXJzdCBpcyBhbGwgb2YgIzIgYmVmb3JlIHRoZSBzcGFjZSB0b2tlbiwKLSUgIHRoZSBzZWNvbmQgaXMgYWxsIG9mICMyIGFmdGVyIHRoYXQgc3BhY2UgdG9rZW4uCi0lIElmICMyIGNvbnRhaW5zIG5vIHNwYWNlIHRva2VuLCBhbGwgb2YgaXQgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmcKLSUgYW5kIHRoZSBzZWNvbmQgaXMgcGFzc2VkIGFzIGVtcHR5LgotCi17XG9iZXlsaW5lcwotXGdkZWZcc3BhY2VzcGxpdCMxIzJeXk17XGVuZGdyb3VwXHNwYWNlc3BsaXRmb297IzF9IzIgXHJlbGF4XHNwYWNlc3BsaXRmb299JQotXGxvbmdcZ2RlZlxzcGFjZXNwbGl0Zm9vIzEjMiAjMyM0XHNwYWNlc3BsaXRmb297JQotXGlmeFxyZWxheCAjMyUKLSMxeyMyfXt9XGVsc2UgIzF7IzJ9eyMzIzR9XGZpfX0KLQotJSBTbyBtdWNoIGZvciB0aGUgdGhpbmdzIGNvbW1vbiB0byBhbGwga2luZHMgb2YgZGVmaW5pdGlvbnMuCi0KLSUgRGVmaW5lIEBkZWZ1bi4KLQotJSBGaXJzdCwgZGVmaW5lIHRoZSBwcm9jZXNzaW5nIHRoYXQgaXMgd2FudGVkIGZvciBhcmd1bWVudHMgb2YgXGRlZnVuCi0lIFVzZSB0aGlzIHRvIGV4cGFuZCB0aGUgYXJncyBhbmQgdGVybWluYXRlIHRoZSBwYXJhZ3JhcGggdGhleSBtYWtlIHVwCi0KLVxkZWZcZGVmdW5hcmdzICMxe1xmdW5jdGlvbnBhcmVucyBcc2wKLSUgRXhwYW5kLCBwcmV2ZW50aW5nIGh5cGhlbmF0aW9uIGF0IGAtJyBjaGFycy4KLSUgTm90ZSB0aGF0IGdyb3VwcyBkb24ndCBhZmZlY3QgY2hhbmdlcyBpbiBcaHlwaGVuY2hhci4KLVxoeXBoZW5jaGFyXHRlbnNsPTAKLSMxJQotXGh5cGhlbmNoYXJcdGVuc2w9NDUKLVxpZm51bVxwYXJlbmNvdW50PTAgXGVsc2UgXGVycm1lc3NhZ2V7VW5iYWxhbmNlZCBwYXJlbnRoZXNlcyBpbiBAZGVmfVxmaSUKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cYWR2YW5jZVxyaWdodHNraXAgYnkgMHB0IHBsdXMgMWZpbAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotfQotCi1cZGVmXGRlZnR5cGVmdW5hcmdzICMxeyUKLSUgRXhwYW5kLCBwcmV2ZW50aW5nIGh5cGhlbmF0aW9uIGF0IGAtJyBjaGFycy4KLSUgTm90ZSB0aGF0IGdyb3VwcyBkb24ndCBhZmZlY3QgY2hhbmdlcyBpbiBcaHlwaGVuY2hhci4KLSUgVXNlIFxib2xkYnJheG5vYW1wLCBub3QgXGZ1bmN0aW9ucGFyZW5zLCBzbyB0aGF0ICYgaXMgbm90IHNwZWNpYWwuCi1cYm9sZGJyYXhub2FtcAotXHRjbG9zZXsjMX0lIGF2b2lkIFxjb2RlIGJlY2F1c2Ugb2Ygc2lkZSBlZmZlY3RzIG9uIGFjdGl2ZSBjaGFycwotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxhZHZhbmNlXHJpZ2h0c2tpcCBieSAwcHQgcGx1cyAxZmlsCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrCi19Ci0KLSUgRG8gY29tcGxldGUgcHJvY2Vzc2luZyBvZiBvbmUgQGRlZnVuIG9yIEBkZWZ1bnggbGluZSBhbHJlYWR5IHBhcnNlZC4KLQotJSBAZGVmZm4gQ29tbWFuZCBmb3J3YXJkLWNoYXIgbmNoYXJzCi0KLVxkZWZcZGVmZm57XGRlZm1ldGhwYXJzZWJvZHlcRWRlZmZuXGRlZmZueFxkZWZmbmhlYWRlcn0KLQotXGRlZlxkZWZmbmhlYWRlciAjMSMyIzN7XGRvaW5kIHtmbn17XGNvZGV7IzJ9fSUKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXsjMX1cZGVmdW5hcmdzeyMzfVxlbmRncm91cCAlCi1cY2F0Y29kZSA2MT1cb3RoZXIgJSBUdXJuIG9mZiBjaGFuZ2UgbWFkZSBpbiBcZGVmcGFyc2Vib2R5Ci19Ci0KLSUgQGRlZnVuID09IEBkZWZmbiBGdW5jdGlvbgotCi1cZGVmXGRlZnVue1xkZWZwYXJzZWJvZHlcRWRlZnVuXGRlZnVueFxkZWZ1bmhlYWRlcn0KLQotXGRlZlxkZWZ1bmhlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtGdW5jdGlvbn0lCi1cZGVmdW5hcmdzIHsjMn1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZ0eXBlZnVuIGludCBmb29iYXIgKGludCBAdmFye2Zvb30sIGZsb2F0IEB2YXJ7YmFyfSkKLQotXGRlZlxkZWZ0eXBlZnVue1xkZWZwYXJzZWJvZHlcRWRlZnR5cGVmdW5cZGVmdHlwZWZ1bnhcZGVmdHlwZWZ1bmhlYWRlcn0KLQotJSAjMSBpcyB0aGUgZGF0YSB0eXBlLiAgIzIgaXMgdGhlIG5hbWUgYW5kIGFyZ3MuCi1cZGVmXGRlZnR5cGVmdW5oZWFkZXIgIzEjMntcZGVmdHlwZWZ1bmhlYWRlcnh7IzF9IzIgXHJlbGF4fQotJSAjMSBpcyB0aGUgZGF0YSB0eXBlLCAjMiB0aGUgbmFtZSwgIzMgdGhlIGFyZ3MuCi1cZGVmXGRlZnR5cGVmdW5oZWFkZXJ4ICMxIzIgIzNccmVsYXh7JQotXGRvaW5kIHtmbn17XGNvZGV7IzJ9fSUgTWFrZSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzFccmVsYXgkJCQjMn17RnVuY3Rpb259JQotXGRlZnR5cGVmdW5hcmdzIHsjM31cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZ0eXBlZm4ge0xpYnJhcnkgRnVuY3Rpb259IGludCBmb29iYXIgKGludCBAdmFye2Zvb30sIGZsb2F0IEB2YXJ7YmFyfSkKLQotXGRlZlxkZWZ0eXBlZm57XGRlZm1ldGhwYXJzZWJvZHlcRWRlZnR5cGVmblxkZWZ0eXBlZm54XGRlZnR5cGVmbmhlYWRlcn0KLQotJSBcZGVmaGVhZGVyeGNvbmQjMVxyZWxheCQkJAotJSBwdXRzICMxIGluIEBjb2RlLCBmb2xsb3dlZCBieSBhIHNwYWNlLCBidXQgZG9lcyBub3RoaW5nIGlmICMxIGlzIG51bGwuCi1cZGVmXGRlZmhlYWRlcnhjb25kIzEjMiQkJHtcaWZ4IzFccmVsYXhcZWxzZVxjb2RleyMxIzJ9IFxmaX0KLQotJSAjMSBpcyB0aGUgY2xhc3NpZmljYXRpb24uICAjMiBpcyB0aGUgZGF0YSB0eXBlLiAgIzMgaXMgdGhlIG5hbWUgYW5kIGFyZ3MuCi1cZGVmXGRlZnR5cGVmbmhlYWRlciAjMSMyIzN7XGRlZnR5cGVmbmhlYWRlcnh7IzF9eyMyfSMzIFxyZWxheH0KLSUgIzEgaXMgdGhlIGNsYXNzaWZpY2F0aW9uLCAjMiB0aGUgZGF0YSB0eXBlLCAjMyB0aGUgbmFtZSwgIzQgdGhlIGFyZ3MuCi1cZGVmXGRlZnR5cGVmbmhlYWRlcnggIzEjMiMzICM0XHJlbGF4eyUKLVxkb2luZCB7Zm59e1xjb2RleyMzfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwCi1cbm9ybWFscGFyZW5zICUgbm90YWJseSwgdHVybiBvZmYgYCYnIG1hZ2ljLCB3aGljaCBwcmV2ZW50cwotJSAgICAgICAgICAgICAgIGF0IGxlYXN0IHNvbWUgQysrIHRleHQgZnJvbSB3b3JraW5nCi1cZGVmbmFtZSB7XGRlZmhlYWRlcnhjb25kIzJccmVsYXgkJCQjM317IzF9JQotXGRlZnR5cGVmdW5hcmdzIHsjNH1cZW5kZ3JvdXAgJQotXGNhdGNvZGUgNjE9XG90aGVyICUgVHVybiBvZmYgY2hhbmdlIG1hZGUgaW4gXGRlZnBhcnNlYm9keQotfQotCi0lIEBkZWZtYWMgPT0gQGRlZmZuIE1hY3JvCi0KLVxkZWZcZGVmbWFje1xkZWZwYXJzZWJvZHlcRWRlZm1hY1xkZWZtYWN4XGRlZm1hY2hlYWRlcn0KLQotXGRlZlxkZWZtYWNoZWFkZXIgIzEjMntcZG9pbmQge2ZufXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMX17TWFjcm99JQotXGRlZnVuYXJncyB7IzJ9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBAZGVmc3BlYyA9PSBAZGVmZm4gU3BlY2lhbCBGb3JtCi0KLVxkZWZcZGVmc3BlY3tcZGVmcGFyc2Vib2R5XEVkZWZzcGVjXGRlZnNwZWN4XGRlZnNwZWNoZWFkZXJ9Ci0KLVxkZWZcZGVmc3BlY2hlYWRlciAjMSMye1xkb2luZCB7Zm59e1xjb2RleyMxfX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtTcGVjaWFsIEZvcm19JQotXGRlZnVuYXJncyB7IzJ9XGVuZGdyb3VwICUKLVxjYXRjb2RlIDYxPVxvdGhlciAlIFR1cm4gb2ZmIGNoYW5nZSBtYWRlIGluIFxkZWZwYXJzZWJvZHkKLX0KLQotJSBUaGlzIGRlZmluaXRpb24gaXMgcnVuIGlmIHlvdSB1c2UgQGRlZnVueAotJSBhbnl3aGVyZSBvdGhlciB0aGFuIGltbWVkaWF0ZWx5IGFmdGVyIGEgQGRlZnVuIG9yIEBkZWZ1bnguCi0KLVxkZWZcZGVmZm54ICMxIHtcZXJybWVzc2FnZXtAZGVmZm54IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnVueCAjMSB7XGVycm1lc3NhZ2V7QGRlZnVueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZtYWN4ICMxIHtcZXJybWVzc2FnZXtAZGVmbWFjeCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZzcGVjeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnNwZWN4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGVmbnggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBlZm54IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGVtZXRob2R4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZW1ldGhvZHggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZWZ1bnggIzEge1xlcnJtZXNzYWdle0BkZWZ0eXBlZnVueCBpbiBpbnZhbGlkIGNvbnRleHR9fQotCi0lIEBkZWZtZXRob2QsIGFuZCBzbyBvbgotCi0lIEBkZWZvcCBDQVRFR09SWSBDTEFTUyBPUEVSQVRJT04gQVJHLi4uCi0KLVxkZWZcZGVmb3AgIzEge1xkZWZcZGVmb3B0eXBleyMxfSUKLVxkZWZvcHBhcnNlYm9keVxFZGVmb3BcZGVmb3B4XGRlZm9waGVhZGVyXGRlZm9wdHlwZX0KLQotXGRlZlxkZWZvcGhlYWRlciAjMSMyIzN7JQotXGRvc3ViaW5kIHtmbn17XGNvZGV7IzJ9fXtccHV0d29yZG9uXCAjMX0lIE1ha2UgZW50cnkgaW4gZnVuY3Rpb24gaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtcZGVmb3B0eXBle30gb24gIzF9JQotXGRlZnVuYXJncyB7IzN9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmdHlwZW1ldGhvZCBDTEFTUyBSRVRVUk4tVFlQRSBNRVRIT0QgQVJHLi4uCi0lCi1cZGVmXGRlZnR5cGVtZXRob2R7JQotICBcZGVmdHlwZW1ldGhwYXJzZWJvZHlcRWRlZnR5cGVtZXRob2RcZGVmdHlwZW1ldGhvZHhcZGVmdHlwZW1ldGhvZGhlYWRlcn0KLSUKLSUgIzEgaXMgdGhlIGNsYXNzIG5hbWUsICMyIHRoZSBkYXRhIHR5cGUsICMzIHRoZSBtZXRob2QgbmFtZSwgIzQgdGhlIGFyZ3MuCi1cZGVmXGRlZnR5cGVtZXRob2RoZWFkZXIjMSMyIzMjNHslCi0gIFxkb3N1YmluZHtmbn17XGNvZGV7IzN9fXtccHV0d29yZG9uXCBcY29kZXsjMX19JSBlbnRyeSBpbiBmdW5jdGlvbiBpbmRleAotICBcYmVnaW5ncm91cAotICAgIFxkZWZuYW1le1xkZWZoZWFkZXJ4Y29uZCMyXHJlbGF4JCQkIzN9e1xwdXR3b3JkTWV0aG9kb25cIFxjb2RleyMxfX0lCi0gICAgXGRlZnR5cGVmdW5hcmdzeyM0fSUKLSAgXGVuZGdyb3VwCi19Ci0KLSUgQGRlZm1ldGhvZCA9PSBAZGVmb3AgTWV0aG9kCi0lCi1cZGVmXGRlZm1ldGhvZHtcZGVmbWV0aHBhcnNlYm9keVxFZGVmbWV0aG9kXGRlZm1ldGhvZHhcZGVmbWV0aG9kaGVhZGVyfQotJQotJSAjMSBpcyB0aGUgY2xhc3MgbmFtZSwgIzIgdGhlIG1ldGhvZCBuYW1lLCAjMyB0aGUgYXJncy4KLVxkZWZcZGVmbWV0aG9kaGVhZGVyIzEjMiMzeyUKLSAgXGRvc3ViaW5ke2ZufXtcY29kZXsjMn19e1xwdXR3b3Jkb25cIFxjb2RleyMxfX0lIGVudHJ5IGluIGZ1bmN0aW9uIGluZGV4Ci0gIFxiZWdpbmdyb3VwCi0gICAgXGRlZm5hbWV7IzJ9e1xwdXR3b3JkTWV0aG9kb25cIFxjb2RleyMxfX0lCi0gICAgXGRlZnVuYXJnc3sjM30lCi0gIFxlbmRncm91cAotfQotCi0lIEBkZWZjdiB7Q2xhc3MgT3B0aW9ufSBmb28tY2xhc3MgZm9vLWZsYWcKLQotXGRlZlxkZWZjdiAjMSB7XGRlZlxkZWZjdnR5cGV7IzF9JQotXGRlZm9wdmFycGFyc2Vib2R5XEVkZWZjdlxkZWZjdnhcZGVmY3ZhcmhlYWRlclxkZWZjdnR5cGV9Ci0KLVxkZWZcZGVmY3ZhcmhlYWRlciAjMSMyIzN7JQotXGRvc3ViaW5kIHt2cn17XGNvZGV7IzJ9fXtvZiAjMX0lIE1ha2UgZW50cnkgaW4gdmFyIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHsjMn17XGRlZmN2dHlwZXt9IG9mICMxfSUKLVxkZWZ2YXJhcmdzIHsjM31cZW5kZ3JvdXAgJQotfQotCi0lIEBkZWZpdmFyID09IEBkZWZjdiB7SW5zdGFuY2UgVmFyaWFibGV9Ci0KLVxkZWZcZGVmaXZhcntcZGVmdnJwYXJzZWJvZHlcRWRlZml2YXJcZGVmaXZhcnhcZGVmaXZhcmhlYWRlcn0KLQotXGRlZlxkZWZpdmFyaGVhZGVyICMxIzIjM3slCi1cZG9zdWJpbmQge3ZyfXtcY29kZXsjMn19e29mICMxfSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMyfXtJbnN0YW5jZSBWYXJpYWJsZSBvZiAjMX0lCi1cZGVmdmFyYXJncyB7IzN9XGVuZGdyb3VwICUKLX0KLQotJSBUaGVzZSBkZWZpbml0aW9ucyBhcmUgcnVuIGlmIHlvdSB1c2UgQGRlZm1ldGhvZHgsIGV0Yy4sCi0lIGFueXdoZXJlIG90aGVyIHRoYW4gaW1tZWRpYXRlbHkgYWZ0ZXIgYSBAZGVmbWV0aG9kLCBldGMuCi0KLVxkZWZcZGVmb3B4ICMxIHtcZXJybWVzc2FnZXtAZGVmb3B4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZm1ldGhvZHggIzEge1xlcnJtZXNzYWdle0BkZWZtZXRob2R4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZmN2eCAjMSB7XGVycm1lc3NhZ2V7QGRlZmN2eCBpbiBpbnZhbGlkIGNvbnRleHR9fQotXGRlZlxkZWZpdmFyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZml2YXJ4IGluIGludmFsaWQgY29udGV4dH19Ci0KLSUgTm93IEBkZWZ2YXIKLQotJSBGaXJzdCwgZGVmaW5lIHRoZSBwcm9jZXNzaW5nIHRoYXQgaXMgd2FudGVkIGZvciBhcmd1bWVudHMgb2YgQGRlZnZhci4KLSUgVGhpcyBpcyBhY3R1YWxseSBzaW1wbGU6IGp1c3QgcHJpbnQgdGhlbSBpbiByb21hbi4KLSUgVGhpcyBtdXN0IGV4cGFuZCB0aGUgYXJncyBhbmQgdGVybWluYXRlIHRoZSBwYXJhZ3JhcGggdGhleSBtYWtlIHVwCi1cZGVmXGRlZnZhcmFyZ3MgIzF7XG5vcm1hbHBhcmVucyAjMSUKLVxpbnRlcmxpbmVwZW5hbHR5PTEwMDAwCi1cZW5kZ3JhZlxub2JyZWFrXHZza2lwIC1ccGFyc2tpcFxub2JyZWFrfQotCi0lIEBkZWZ2ciBDb3VudGVyIGZvby1jb3VudAotCi1cZGVmXGRlZnZye1xkZWZ2cnBhcnNlYm9keVxFZGVmdnJcZGVmdnJ4XGRlZnZyaGVhZGVyfQotCi1cZGVmXGRlZnZyaGVhZGVyICMxIzIjM3tcZG9pbmQge3ZyfXtcY29kZXsjMn19JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9eyMxfVxkZWZ2YXJhcmdzeyMzfVxlbmRncm91cH0KLQotJSBAZGVmdmFyID09IEBkZWZ2ciBWYXJpYWJsZQotCi1cZGVmXGRlZnZhcntcZGVmdmFycGFyc2Vib2R5XEVkZWZ2YXJcZGVmdmFyeFxkZWZ2YXJoZWFkZXJ9Ci0KLVxkZWZcZGVmdmFyaGVhZGVyICMxIzJ7XGRvaW5kIHt2cn17XGNvZGV7IzF9fSUgTWFrZSBlbnRyeSBpbiB2YXIgaW5kZXgKLVxiZWdpbmdyb3VwXGRlZm5hbWUgeyMxfXtWYXJpYWJsZX0lCi1cZGVmdmFyYXJncyB7IzJ9XGVuZGdyb3VwICUKLX0KLQotJSBAZGVmb3B0ID09IEBkZWZ2ciB7VXNlciBPcHRpb259Ci0KLVxkZWZcZGVmb3B0e1xkZWZ2YXJwYXJzZWJvZHlcRWRlZm9wdFxkZWZvcHR4XGRlZm9wdGhlYWRlcn0KLQotXGRlZlxkZWZvcHRoZWFkZXIgIzEjMntcZG9pbmQge3ZyfXtcY29kZXsjMX19JSBNYWtlIGVudHJ5IGluIHZhciBpbmRleAotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzF9e1VzZXIgT3B0aW9ufSUKLVxkZWZ2YXJhcmdzIHsjMn1cZW5kZ3JvdXAgJQotfQotCi0lIEBkZWZ0eXBldmFyIGludCBmb29iYXIKLQotXGRlZlxkZWZ0eXBldmFye1xkZWZ2YXJwYXJzZWJvZHlcRWRlZnR5cGV2YXJcZGVmdHlwZXZhcnhcZGVmdHlwZXZhcmhlYWRlcn0KLQotJSAjMSBpcyB0aGUgZGF0YSB0eXBlLiAgIzIgaXMgdGhlIG5hbWUsIHBlcmhhcHMgZm9sbG93ZWQgYnkgdGV4dCB0aGF0Ci0lIGlzIGFjdHVhbGx5IHBhcnQgb2YgdGhlIGRhdGEgdHlwZSwgd2hpY2ggc2hvdWxkIG5vdCBiZSBwdXQgaW50byB0aGUgaW5kZXguCi1cZGVmXGRlZnR5cGV2YXJoZWFkZXIgIzEjMnslCi1cZG92YXJpbmQjMiBccmVsYXglIE1ha2UgZW50cnkgaW4gdmFyaWFibGVzIGluZGV4Ci1cYmVnaW5ncm91cFxkZWZuYW1lIHtcZGVmaGVhZGVyeGNvbmQjMVxyZWxheCQkJCMyfXtWYXJpYWJsZX0lCi1caW50ZXJsaW5lcGVuYWx0eT0xMDAwMAotXGVuZGdyYWZcbm9icmVha1x2c2tpcCAtXHBhcnNraXBcbm9icmVhawotXGVuZGdyb3VwfQotXGRlZlxkb3ZhcmluZCMxICMyXHJlbGF4e1xkb2luZHt2cn17XGNvZGV7IzF9fX0KLQotJSBAZGVmdHlwZXZyIHtHbG9iYWwgRmxhZ30gaW50IGVuYWJsZQotCi1cZGVmXGRlZnR5cGV2cntcZGVmdnJwYXJzZWJvZHlcRWRlZnR5cGV2clxkZWZ0eXBldnJ4XGRlZnR5cGV2cmhlYWRlcn0KLQotXGRlZlxkZWZ0eXBldnJoZWFkZXIgIzEjMiMze1xkb3ZhcmluZCMzIFxyZWxheCUKLVxiZWdpbmdyb3VwXGRlZm5hbWUge1xkZWZoZWFkZXJ4Y29uZCMyXHJlbGF4JCQkIzN9eyMxfQotXGludGVybGluZXBlbmFsdHk9MTAwMDAKLVxlbmRncmFmXG5vYnJlYWtcdnNraXAgLVxwYXJza2lwXG5vYnJlYWsKLVxlbmRncm91cH0KLQotJSBUaGlzIGRlZmluaXRpb24gaXMgcnVuIGlmIHlvdSB1c2UgQGRlZnZhcngKLSUgYW55d2hlcmUgb3RoZXIgdGhhbiBpbW1lZGlhdGVseSBhZnRlciBhIEBkZWZ2YXIgb3IgQGRlZnZhcnguCi0KLVxkZWZcZGVmdnJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmdnJ4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnZhcnggIzEge1xlcnJtZXNzYWdle0BkZWZ2YXJ4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZm9wdHggIzEge1xlcnJtZXNzYWdle0BkZWZvcHR4IGluIGludmFsaWQgY29udGV4dH19Ci1cZGVmXGRlZnR5cGV2YXJ4ICMxIHtcZXJybWVzc2FnZXtAZGVmdHlwZXZhcnggaW4gaW52YWxpZCBjb250ZXh0fX0KLVxkZWZcZGVmdHlwZXZyeCAjMSB7XGVycm1lc3NhZ2V7QGRlZnR5cGV2cnggaW4gaW52YWxpZCBjb250ZXh0fX0KLQotJSBOb3cgZGVmaW5lIEBkZWZ0cAotJSBBcmdzIGFyZSBwcmludGVkIGluIGJvbGQsIGEgc2xpZ2h0IGRpZmZlcmVuY2UgZnJvbSBAZGVmdmFyLgotCi1cZGVmXGRlZnRwYXJncyAjMXtcYmYgXGRlZnZhcmFyZ3N7IzF9fQotCi0lIEBkZWZ0cCBDbGFzcyB3aW5kb3cgaGVpZ2h0IHdpZHRoIC4uLgotCi1cZGVmXGRlZnRwe1xkZWZ0cHBhcnNlYm9keVxFZGVmdHBcZGVmdHB4XGRlZnRwaGVhZGVyfQotCi1cZGVmXGRlZnRwaGVhZGVyICMxIzIjM3tcZG9pbmQge3RwfXtcY29kZXsjMn19JQotXGJlZ2luZ3JvdXBcZGVmbmFtZSB7IzJ9eyMxfVxkZWZ0cGFyZ3N7IzN9XGVuZGdyb3VwfQotCi0lIFRoaXMgZGVmaW5pdGlvbiBpcyBydW4gaWYgeW91IHVzZSBAZGVmdHB4LCBldGMKLSUgYW55d2hlcmUgb3RoZXIgdGhhbiBpbW1lZGlhdGVseSBhZnRlciBhIEBkZWZ0cCwgZXRjLgotCi1cZGVmXGRlZnRweCAjMSB7XGVycm1lc3NhZ2V7QGRlZnRweCBpbiBpbnZhbGlkIGNvbnRleHR9fQotCi0KLVxtZXNzYWdle21hY3Jvcyx9Ci0lIEBtYWNyby4KLQotJSBUbyBkbyB0aGlzIHJpZ2h0IHdlIG5lZWQgYSBmZWF0dXJlIG9mIGUtVGVYLCBcc2NhbnRva2VucywgCi0lIHdoaWNoIHdlIGFycmFuZ2UgdG8gZW11bGF0ZSB3aXRoIGEgdGVtcG9yYXJ5IGZpbGUgaW4gb3JkaW5hcnkgVGVYLgotXGlmeFxlVGVYdmVyc2lvblx1bmRlZmluZWQKLSBcbmV3d3JpdGVcbWFjc2NyaWJibGUKLSBcZGVmXHNjYW5tYWNybyMxeyUKLSAgIFxiZWdpbmdyb3VwIFxuZXdsaW5lY2hhcmBcXl5NCi0gICBcaW1tZWRpYXRlXG9wZW5vdXRcbWFjc2NyaWJibGU9XGpvYm5hbWUudG1wCi0gICBcaW1tZWRpYXRlXHdyaXRlXG1hY3NjcmliYmxleyMxfSUKLSAgIFxpbW1lZGlhdGVcY2xvc2VvdXRcbWFjc2NyaWJibGUKLSAgIFxsZXRceGVhdHNwYWNlc1xlYXRzcGFjZXMKLSAgIFxpbnB1dCBcam9ibmFtZS50bXAKLSAgIFxlbmRncm91cAotfQotXGVsc2UKLVxkZWZcc2Nhbm1hY3JvIzF7JQotXGJlZ2luZ3JvdXAgXG5ld2xpbmVjaGFyYFxeXk0KLVxsZXRceGVhdHNwYWNlc1xlYXRzcGFjZXNcc2NhbnRva2Vuc3sjMX1cZW5kZ3JvdXB9Ci1cZmkKLQotXG5ld2NvdW50XHBhcmFtbm8gICAlIENvdW50IG9mIHBhcmFtZXRlcnMKLVxuZXd0b2tzXG1hY25hbWUgICAgJSBNYWNybyBuYW1lCi1cbmV3aWZcaWZyZWN1cnNpdmUgICUgSXMgaXQgcmVjdXJzaXZlPwotCi0lIFV0aWxpdHkgcm91dGluZXMuCi0lIFRoaXNkb2VzIFxsZXQgIzEgPSAjMiwgZXhjZXB0IHdpdGggXGNzbmFtZXMuCi1cZGVmXGNzbGV0IzEjMnslCi1cZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLVxleHBhbmRhZnRlclxsZXQKLVxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotXGNzbmFtZSMxXGVuZGNzbmFtZQotXGNzbmFtZSMyXGVuZGNzbmFtZX0KLQotJSBUcmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBvZmYgYSBzdHJpbmcuCi0lIENvbmNlcHRzIGZyb20gYXJvLWJlbmQgcHJvYmxlbSAxNSAoc2VlIENUQU4pLgote1xjYXRjb2RlYFxAPTExCi1cZ2RlZlxlYXRzcGFjZXMgIzF7XGV4cGFuZGFmdGVyXHRyaW1AXGV4cGFuZGFmdGVyeyMxIH19Ci1cZ2RlZlx0cmltQCAjMXtcdHJpbUBAIEAjMSBAICMxIEAgQEB9Ci1cZ2RlZlx0cmltQEAgIzFAICMyQCAjM0BAe1x0cmltQEBAXGVtcHR5ICMyIEB9Ci1cZGVmXHVuYnJhY2UjMXsjMX0KLVx1bmJyYWNle1xnZGVmXHRyaW1AQEAgIzEgfSAjMkB7IzF9Ci19Ci0KLSUgVHJpbSBhIHNpbmdsZSB0cmFpbGluZyBeXk0gb2ZmIGEgc3RyaW5nLgote1xjYXRjb2RlYFxeXk09MTJcY2F0Y29kZWBcUT0zJQotXGdkZWZcZWF0Y3IgIzF7XGVhdGNyYSAjMVFeXk1RfSUKLVxnZGVmXGVhdGNyYSMxXl5NUXtcZWF0Y3JiIzFRfSUKLVxnZGVmXGVhdGNyYiMxUSMyUXsjMX0lCi19Ci0KLSUgTWFjcm8gYm9kaWVzIGFyZSBhYnNvcmJlZCBhcyBhbiBhcmd1bWVudCBpbiBhIGNvbnRleHQgd2hlcmUKLSUgYWxsIGNoYXJhY3RlcnMgYXJlIGNhdGNvZGUgMTAsIDExIG9yIDEyLCBleGNlcHQgXCB3aGljaCBpcyBhY3RpdmUKLSUgKGFzIGluIG5vcm1hbCB0ZXhpbmZvKS4gSXQgaXMgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBcLgotCi0lIEl0J3MgbmVjZXNzYXJ5IHRvIGhhdmUgaGFyZCBDUnMgd2hlbiB0aGUgbWFjcm8gaXMgZXhlY3V0ZWQuIFRoaXMgaXMgCi0lIGRvbmUgYnkgIG1ha2luZyBeXk0gKFxlbmRsaW5lY2hhcikgY2F0Y29kZSAxMiB3aGVuIHJlYWRpbmcgdGhlIG1hY3JvIAotJSBib2R5LCBhbmQgdGhlbiBtYWtpbmcgaXQgdGhlIFxuZXdsaW5lY2hhciBpbiBcc2Nhbm1hY3JvLgotCi1cZGVmXG1hY3JvYm9keWN0eHR7JQotICBcY2F0Y29kZWBcfj0xMgotICBcY2F0Y29kZWBcXj0xMgotICBcY2F0Y29kZWBcXz0xMgotICBcY2F0Y29kZWBcfD0xMgotICBcY2F0Y29kZWBcPD0xMgotICBcY2F0Y29kZWBcPj0xMgotICBcY2F0Y29kZWBcKz0xMgotICBcY2F0Y29kZWBcez0xMgotICBcY2F0Y29kZWBcfT0xMgotICBcY2F0Y29kZWBcQD0xMgotICBcY2F0Y29kZWBcXl5NPTEyCi0gIFx1c2VtYm9keWJhY2tzbGFzaH0KLQotJSBcbWJvZHliYWNrc2xhc2ggaXMgdGhlIGRlZmluaXRpb24gb2YgXCBpbiBAbWFjcm8gYm9kaWVzLgotJSBJdCBtYXBzIFxmb29cID0+IFxjc25hbWUgbWFjYXJnLmZvb1xlbmRjc25hbWUgPT4gI04gCi0lIHdoZXJlIE4gaXMgdGhlIG1hY3JvIHBhcmFtZXRlciBudW1iZXIuCi0lIFdlIGRlZmluZSBcY3NuYW1lIG1hY2FyZy5cZW5kY3NuYW1lIHRvIGJlIFxyZWFsYmFja3NsYXNoLCBzbwotJSBcXCBpbiBtYWNybyByZXBsYWNlbWVudCB0ZXh0IGdldHMgeW91IGEgYmFja3NsYXNoLgotCi17XGNhdGNvZGVgQD0wIEBjYXRjb2RlYEBcPUBhY3RpdmUKLSBAZ2RlZkB1c2VtYm9keWJhY2tzbGFzaHtAbGV0XD1AbWJvZHliYWNrc2xhc2h9Ci0gQGdkZWZAbWJvZHliYWNrc2xhc2gjMVx7QGNzbmFtZSBtYWNhcmcuIzFAZW5kY3NuYW1lfQotfQotXGV4cGFuZGFmdGVyXGRlZlxjc25hbWUgbWFjYXJnLlxlbmRjc25hbWV7XHJlYWxiYWNrc2xhc2h9Ci0KLVxkZWZcbWFjcm97XHJlY3Vyc2l2ZWZhbHNlXHBhcnNlYXJnXG1hY3JveHh4fQotXGRlZlxybWFjcm97XHJlY3Vyc2l2ZXRydWVccGFyc2VhcmdcbWFjcm94eHh9Ci0KLVxkZWZcbWFjcm94eHgjMXslCi0gIFxnZXRhcmdzeyMxfSUgICAgICAgICAgIG5vdyBcbWFjbmFtZSBpcyB0aGUgbWFjbmFtZSBhbmQgXGFyZ2wgdGhlIGFyZ2xpc3QKLSAgXGlmeFxhcmdsXGVtcHR5ICAgICAgICUgbm8gYXJndW1lbnRzCi0gICAgIFxwYXJhbW5vPTAlCi0gIFxlbHNlCi0gICAgIFxleHBhbmRhZnRlclxwYXJzZW1hcmdkZWYgXGFyZ2w7JSAKLSAgXGZpCi0gIFxleHBhbmRhZnRlclxpZnggXGNzbmFtZSBtYWNzYXZlLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUgXHJlbGF4Ci0gICAgIFxjc2xldHttYWNzYXZlLlx0aGVcbWFjbmFtZX17XHRoZVxtYWNuYW1lfSUKLSAgXGVsc2UKLSAgICAgXG1lc3NhZ2V7V2FybmluZzogcmVkZWZpbmluZyBcdGhlXG1hY25hbWV9JQotICBcZmkKLSAgXGJlZ2luZ3JvdXAgXG1hY3JvYm9keWN0eHQKLSAgXGlmcmVjdXJzaXZlIFxleHBhbmRhZnRlclxwYXJzZXJtYWNib2R5Ci0gIFxlbHNlIFxleHBhbmRhZnRlclxwYXJzZW1hY2JvZHkgCi0gIFxmaX0KLQotXGRlZlx1bm1hY3Jve1xwYXJzZWFyZ1x1bm1hY3JveHh4fQotXGRlZlx1bm1hY3JveHh4IzF7JQotICBcZXhwYW5kYWZ0ZXJcaWZ4IFxjc25hbWUgbWFjc2F2ZS5cdGhlXG1hY25hbWVcZW5kY3NuYW1lIFxyZWxheAotICAgIFxlcnJtZXNzYWdle01hY3JvIFx0aGVcbWFjbmFtZVwgbm90IGRlZmluZWQufSUKLSAgXGVsc2UKLSAgICBcY3NsZXR7IzF9e21hY3NhdmUuIzF9JQotICAgIFxleHBhbmRhZnRlclxsZXQgXGNzbmFtZSBtYWNzYXZlLlx0aGVcbWFjbmFtZVxlbmRjc25hbWUgXHVuZGVmaW5lZAotICBcZmkKLX0KLQotJSBUaGlzIG1ha2VzIHVzZSBvZiB0aGUgb2JzY3VyZSBmZWF0dXJlIHRoYXQgaWYgdGhlIGxhc3QgdG9rZW4gb2YgYQotJSA8cGFyYW1ldGVyIGxpc3Q+IGlzICMsIHRoZW4gdGhlIHByZWNlZGluZyBhcmd1bWVudCBpcyBkZWxpbWl0ZWQgYnkKLSUgYW4gb3BlbmluZyBicmFjZSwgYW5kIHRoYXQgb3BlbmluZyBicmFjZSBpcyBub3QgY29uc3VtZWQuCi1cZGVmXGdldGFyZ3MjMXtcZ2V0YXJnc3h4eCMxe319Ci1cZGVmXGdldGFyZ3N4eHgjMSN7XGdldG1hY25hbWUgIzEgXHJlbGF4XGdldG1hY2FyZ3N9Ci1cZGVmXGdldG1hY25hbWUgIzEgIzJccmVsYXh7XG1hY25hbWU9eyMxfX0KLVxkZWZcZ2V0bWFjYXJncyMxe1xkZWZcYXJnbHsjMX19Ci0KLSUgUGFyc2UgdGhlIG9wdGlvbmFsIHtwYXJhbXN9IGxpc3QuICBTZXQgdXAgXHBhcmFtbm8gYW5kIFxwYXJhbWxpc3QKLSUgc28gXGRlZm1hY3JvIGtub3dzIHdoYXQgdG8gZG8uICBEZWZpbmUgXG1hY2FyZy5ibGFoIGZvciBlYWNoIGJsYWgKLSUgaW4gdGhlIHBhcmFtcyBsaXN0LCB0byBiZSAjI04gd2hlcmUgTiBpcyB0aGUgcG9zaXRpb24gaW4gdGhhdCBsaXN0LgotJSBUaGF0IGdldHMgdXNlZCBieSBcbWJvZHliYWNrc2xhc2ggKGFib3ZlKS4KLQotJSBXZSBuZWVkIHRvIGdldCBgbWFjcm8gcGFyYW1ldGVyIGNoYXIgIycgaW50byBzZXZlcmFsIGRlZmluaXRpb25zLgotJSBUaGUgdGVjaG5pcXVlIHVzZWQgaXMgc3RvbGVuIGZyb20gTGFUZVg6ICBsZXQgXGhhc2ggYmUgc29tZXRoaW5nCi0lIHVuZXhwYW5kYWJsZSwgaW5zZXJ0IHRoYXQgd2hlcmV2ZXIgeW91IG5lZWQgYSAjLCBhbmQgdGhlbiByZWRlZmluZQotJSBpdCB0byAjIGp1c3QgYmVmb3JlIHVzaW5nIHRoZSB0b2tlbiBsaXN0IHByb2R1Y2VkLgotJQotJSBUaGUgc2FtZSB0ZWNobmlxdWUgaXMgdXNlZCB0byBwcm90ZWN0IFxlYXRzcGFjZXMgdGlsbCBqdXN0IGJlZm9yZQotJSB0aGUgbWFjcm8gaXMgdXNlZC4KLQotXGRlZlxwYXJzZW1hcmdkZWYjMTt7XHBhcmFtbm89MFxkZWZccGFyYW1saXN0e30lCi0gICAgICAgIFxsZXRcaGFzaFxyZWxheFxsZXRceGVhdHNwYWNlc1xyZWxheFxwYXJzZW1hcmdkZWZ4eHgjMSw7LH0KLVxkZWZccGFyc2VtYXJnZGVmeHh4IzEseyUKLSAgXGlmIzE7XGxldFxuZXh0PVxyZWxheAotICBcZWxzZSBcbGV0XG5leHQ9XHBhcnNlbWFyZ2RlZnh4eAotICAgIFxhZHZhbmNlXHBhcmFtbm8gYnkgMSUKLSAgICBcZXhwYW5kYWZ0ZXJcZWRlZlxjc25hbWUgbWFjYXJnLlxlYXRzcGFjZXN7IzF9XGVuZGNzbmFtZQotICAgICAgICB7XHhlYXRzcGFjZXN7XGhhc2hcdGhlXHBhcmFtbm99fSUKLSAgICBcZWRlZlxwYXJhbWxpc3R7XHBhcmFtbGlzdFxoYXNoXHRoZVxwYXJhbW5vLH0lCi0gIFxmaVxuZXh0fQotCi0lIFRoZXNlIHR3byBjb21tYW5kcyByZWFkIHJlY3Vyc2l2ZSBhbmQgbm9ucmVjdXJzaXZlIG1hY3JvIGJvZGllcy4KLSUgKFRoZXkncmUgZGlmZmVyZW50IHNpbmNlIHJlYyBhbmQgbm9ucmVjIG1hY3JvcyBlbmQgZGlmZmVyZW50bHkuKQotCi1cbG9uZ1xkZWZccGFyc2VtYWNib2R5IzFAZW5kIG1hY3JvJQote1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQotXGxvbmdcZGVmXHBhcnNlcm1hY2JvZHkjMUBlbmQgcm1hY3JvJQote1x4ZGVmXHRlbXB7XGVhdGNyeyMxfX1cZW5kZ3JvdXBcZGVmbWFjcm99JQotCi0lIFRoaXMgZGVmaW5lcyB0aGUgbWFjcm8gaXRzZWxmLiBUaGVyZSBhcmUgc2l4IGNhc2VzOiByZWN1cnNpdmUgYW5kCi0lIG5vbnJlY3Vyc2l2ZSBtYWNyb3Mgb2YgemVybywgb25lLCBhbmQgbWFueSBhcmd1bWVudHMuCi0lIE11Y2ggbWFnaWMgd2l0aCBcZXhwYW5kYWZ0ZXIgaGVyZS4KLSUgXHhkZWYgaXMgdXNlZCBzbyB0aGF0IG1hY3JvIGRlZmluaXRpb25zIHdpbGwgc3Vydml2ZSB0aGUgZmlsZQotJSB0aGV5J3JlIGRlZmluZWQgaW47IEBpbmNsdWRlIHJlYWRzIHRoZSBmaWxlIGluc2lkZSBhIGdyb3VwLgotXGRlZlxkZWZtYWNyb3slCi0gIFxsZXRcaGFzaD0jIyUgY29udmVydCBwbGFjZWhvbGRlcnMgdG8gbWFjcm8gcGFyYW1ldGVyIGNoYXJzCi0gIFxpZnJlY3Vyc2l2ZQotICAgIFxpZmNhc2VccGFyYW1ubwotICAgICUgMAotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgIFxub2V4cGFuZFxzY2FubWFjcm97XHRlbXB9fSUKLSAgICBcb3IgJSAxCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgIFxub2V4cGFuZFxicmFjZW9ybGluZVxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZX0lCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSMjMXslCi0gICAgICAgICBcbm9leHBhbmRcc2Nhbm1hY3Jve1x0ZW1wfX0lCi0gICAgXGVsc2UgJSBtYW55Ci0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1lIyMxeyUKLSAgICAgICAgICBcY3NuYW1lXHRoZVxtYWNuYW1lIHh4eFxlbmRjc25hbWUgIyMxLH0lCi0gICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmCi0gICAgICBcZXhwYW5kYWZ0ZXJcZXhwYW5kYWZ0ZXIKLSAgICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lIAotICAgICAgICAgIFxwYXJhbWxpc3R7XG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH19JQotICAgIFxmaQotICBcZWxzZQotICAgIFxpZmNhc2VccGFyYW1ubwotICAgICUgMAotICAgICAgXGV4cGFuZGFmdGVyXHhkZWZcY3NuYW1lXHRoZVxtYWNuYW1lXGVuZGNzbmFtZXslCi0gICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKLSAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKLSAgICBcb3IgJSAxCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWVcZW5kY3NuYW1leyUKLSAgICAgICAgIFxub2V4cGFuZFxicmFjZW9ybGluZVxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZX0lCi0gICAgICBcZXhwYW5kYWZ0ZXJceGRlZlxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSMjMXslCi0gICAgICAgIFxub2V4cGFuZFxub3JlY3Vyc2V7XHRoZVxtYWNuYW1lfSUKLSAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKLSAgICBcZWxzZSAlIG1hbnkKLSAgICAgIFxleHBhbmRhZnRlclx4ZGVmXGNzbmFtZVx0aGVcbWFjbmFtZVxlbmRjc25hbWUjIzF7JQotICAgICAgICAgIFxjc25hbWVcdGhlXG1hY25hbWUgeHh4XGVuZGNzbmFtZSAjIzEsfSUKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgXGV4cGFuZGFmdGVyXHhkZWYKLSAgICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlcgotICAgICAgXGNzbmFtZVx0aGVcbWFjbmFtZSB4eHhcZW5kY3NuYW1lCi0gICAgICBccGFyYW1saXN0eyUKLSAgICAgICAgICBcbm9leHBhbmRcbm9yZWN1cnNle1x0aGVcbWFjbmFtZX0lCi0gICAgICAgICAgXG5vZXhwYW5kXHNjYW5tYWNyb3tcdGVtcH1cZWdyb3VwfSUKLSAgICBcZmkKLSAgXGZpfQotCi1cZGVmXG5vcmVjdXJzZSMxe1xiZ3JvdXBcY3NsZXR7IzF9e21hY3NhdmUuIzF9fQotCi0lIFxicmFjZW9ybGluZSBkZWNpZGVzIHdoZXRoZXIgdGhlIG5leHQgbm9ud2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgYQotJSB7LiAgSWYgc28gaXQgcmVhZHMgdXAgdG8gdGhlIGNsb3NpbmcgfSwgaWYgbm90LCBpdCByZWFkcyB0aGUgd2hvbGUKLSUgbGluZS4gIFdoYXRldmVyIHdhcyByZWFkIGlzIHRoZW4gZmVkIHRvIHRoZSBuZXh0IGNvbnRyb2wgc2VxdWVuY2UKLSUgYXMgYW4gYXJndW1lbnQgKGJ5IFxwYXJzZWJyYWNlIG9yIFxwYXJzZWFyZykKLVxkZWZcYnJhY2VvcmxpbmUjMXtcbGV0XG5leHQ9IzFcZnV0dXJlbGV0XG5jaGFyXGJyYWNlb3JsaW5leHh4fQotXGRlZlxicmFjZW9ybGluZXh4eHslCi0gIFxpZnhcbmNoYXJcYmdyb3VwXGVsc2UKLSAgICBcZXhwYW5kYWZ0ZXJccGFyc2VhcmcgCi0gIFxmaSBcbmV4dH0KLQotCi1cbWVzc2FnZXtjcm9zcyByZWZlcmVuY2VzLH0KLVxuZXd3cml0ZVxhdXhmaWxlCi0KLVxuZXdpZlxpZmhhdmV4cmVmcyAgICAlIFRydWUgaWYgeHJlZiB2YWx1ZXMgYXJlIGtub3duLgotXG5ld2lmXGlmd2FybmVkeHJlZnMgICUgVHJ1ZSBpZiB3ZSB3YXJuZWQgb25jZSB0aGF0IHRoZXkgYXJlbid0IGtub3duLgotCi0lIEBpbmZvcmVmIGlzIHJlbGF0aXZlbHkgc2ltcGxlLgotXGRlZlxpbmZvcmVmICMxe1xpbmZvcmVmenp6ICMxLCwsLCoqfQotXGRlZlxpbmZvcmVmenp6ICMxLCMyLCMzLCM0Kip7XHB1dHdvcmRTZWV7fSBccHV0d29yZEluZm97fSBccHV0d29yZGZpbGV7fSBcZmlsZXtcaWdub3Jlc3BhY2VzICMze319LAotICBub2RlIFxzYW1we1xpZ25vcmVzcGFjZXMjMXt9fX0KLQotJSBAbm9kZSdzIGpvYiBpcyB0byBkZWZpbmUgXGxhc3Rub2RlLgotXGRlZlxub2Rle1xFTlZjaGVja1xwYXJzZWFyZ1xub2Rlenp6fQotXGRlZlxub2Rlenp6IzF7XG5vZGV4eHggWyMxLF19Ci1cZGVmXG5vZGV4eHhbIzEsIzJde1xnZGVmXGxhc3Rub2RleyMxfX0KLVxsZXRcbndub2RlPVxub2RlCi1cbGV0XGxhc3Rub2RlPVxyZWxheAotCi0lIFRoZSBzZWN0aW9uaW5nIGNvbW1hbmRzIChAY2hhcHRlciwgZXRjLikgY2FsbCB0aGVzZS4KLVxkZWZcZG9ub2RlcmVmeyUKLSAgXGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXHNldHJlZntcbGFzdG5vZGV9JQotICAgICAge1lzZWN0aW9ubnVtYmVyYW5kdHlwZX0lCi0gICAgXGdsb2JhbFxsZXRcbGFzdG5vZGU9XHJlbGF4Ci0gIFxmaQotfQotXGRlZlx1bm51bWJub2RlcmVmeyUKLSAgXGlmeFxsYXN0bm9kZVxyZWxheFxlbHNlCi0gICAgXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXGV4cGFuZGFmdGVyXHNldHJlZntcbGFzdG5vZGV9e1lub3RoaW5nfSUKLSAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1ccmVsYXgKLSAgXGZpCi19Ci1cZGVmXGFwcGVuZGl4bm9kZXJlZnslCi0gIFxpZnhcbGFzdG5vZGVccmVsYXhcZWxzZQotICAgIFxleHBhbmRhZnRlclxleHBhbmRhZnRlclxleHBhbmRhZnRlclxzZXRyZWZ7XGxhc3Rub2RlfSUKLSAgICAgIHtZYXBwZW5kaXhsZXR0ZXJhbmR0eXBlfSUKLSAgICBcZ2xvYmFsXGxldFxsYXN0bm9kZT1ccmVsYXgKLSAgXGZpCi19Ci0KLQotJSBAYW5jaG9ye05BTUV9IC0tIGRlZmluZSB4cmVmIHRhcmdldCBhdCBhcmJpdHJhcnkgcG9pbnQuCi0lIAotXGRlZlxhbmNob3IjMXtcc2V0cmVmeyMxfXtZbm90aGluZ319Ci0KLQotJSBcc2V0cmVme05BTUV9e1NOVH0gZGVmaW5lcyBhIGNyb3NzLXJlZmVyZW5jZSBwb2ludCBOQU1FLCBuYW1lbHkKLSUgTkFNRS10aXRsZSwgTkFNRS1wZywgYW5kIE5BTUUtU05ULiAgQ2FsbGVkIGZyb20gXGZvb25vZGVyZWYuICBXZSBoYXZlCi0lIHRvIHNldCBcaW5kZXhkdW1taWVzIHNvIGNvbW1hbmRzIHN1Y2ggYXMgQGNvZGUgaW4gYSBzZWN0aW9uIHRpdGxlCi0lIGFyZW4ndCBleHBhbmRlZC4gIEl0IHdvdWxkIGJlIG5pY2VyIG5vdCB0byBleHBhbmQgdGhlIHRpdGxlcyBpbiB0aGUKLSUgZmlyc3QgcGxhY2UsIGJ1dCB0aGVyZSdzIHNvIG1hbnkgbGF5ZXJzIHRoYXQgdGhhdCBpcyBoYXJkIHRvIGRvLgotJSAKLVxkZWZcc2V0cmVmIzEjMnt7JQotICBcaW5kZXhkdW1taWVzCi0gIFxkb3NldHF7IzEtdGl0bGV9e1l0aXRsZX0lCi0gIFxkb3NldHF7IzEtcGd9e1lwYWdlbnVtYmVyfSUKLSAgXGRvc2V0cXsjMS1zbnR9eyMyfQotfX0KLQotJSBAeHJlZiwgQHB4cmVmLCBhbmQgQHJlZiBnZW5lcmF0ZSBjcm9zcy1yZWZlcmVuY2VzLiAgRm9yIFx4cmVmWCwgIzEgaXMKLSUgdGhlIG5vZGUgbmFtZSwgIzIgdGhlIG5hbWUgb2YgdGhlIEluZm8gY3Jvc3MtcmVmZXJlbmNlLCAjMyB0aGUgcHJpbnRlZAotJSBub2RlIG5hbWUsICM0IHRoZSBuYW1lIG9mIHRoZSBJbmZvIGZpbGUsICM1IHRoZSBuYW1lIG9mIHRoZSBwcmludGVkCi0lIG1hbnVhbC4gIEFsbCBidXQgdGhlIG5vZGUgbmFtZSBjYW4gYmUgb21pdHRlZC4KLSUKLVxkZWZccHhyZWYjMXtccHV0d29yZHNlZXt9IFx4cmVmWFsjMSwsLCwsLCxdfQotXGRlZlx4cmVmIzF7XHB1dHdvcmRTZWV7fSBceHJlZlhbIzEsLCwsLCwsXX0KLVxkZWZccmVmIzF7XHhyZWZYWyMxLCwsLCwsLF19Ci1cZGVmXHhyZWZYWyMxLCMyLCMzLCM0LCM1LCM2XXtcYmVnaW5ncm91cAotICBcZGVmXHByaW50ZWRtYW51YWx7XGlnbm9yZXNwYWNlcyAjNX0lCi0gIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzN9JQotICBcc2V0Ym94MT1caGJveHtccHJpbnRlZG1hbnVhbH0lCi0gIFxzZXRib3gwPVxoYm94e1xwcmludGVkbm9kZW5hbWV9JQotICBcaWZkaW0gXHdkMCA9IDBwdAotICAgICUgTm8gcHJpbnRlZCBub2RlIG5hbWUgd2FzIGV4cGxpY2l0bHkgZ2l2ZW4uCi0gICAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgU0VUeHJlZi1hdXRvbWF0aWMtc2VjdGlvbi10aXRsZVxlbmRjc25hbWVccmVsYXgKLSAgICAgICUgVXNlIHRoZSBub2RlIG5hbWUgaW5zaWRlIHRoZSBzcXVhcmUgYnJhY2tldHMuCi0gICAgICBcZGVmXHByaW50ZWRub2RlbmFtZXtcaWdub3Jlc3BhY2VzICMxfSUKLSAgICBcZWxzZQotICAgICAgJSBVc2UgdGhlIGFjdHVhbCBjaGFwdGVyL3NlY3Rpb24gdGl0bGUgYXBwZWFyIGluc2lkZQotICAgICAgJSB0aGUgc3F1YXJlIGJyYWNrZXRzLiAgVXNlIHRoZSByZWFsIHNlY3Rpb24gdGl0bGUgaWYgd2UgaGF2ZSBpdC4KLSAgICAgIFxpZmRpbSBcd2QxID4gMHB0Ci0gICAgICAgICUgSXQgaXMgaW4gYW5vdGhlciBtYW51YWwsIHNvIHdlIGRvbid0IGhhdmUgaXQuCi0gICAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQotICAgICAgXGVsc2UKLSAgICAgICAgXGlmaGF2ZXhyZWZzCi0gICAgICAgICAgJSBXZSBrbm93IHRoZSByZWFsIHRpdGxlIGlmIHdlIGhhdmUgdGhlIHhyZWYgdmFsdWVzLgotICAgICAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xyZWZ4eyMxLXRpdGxlfXt9fSUKLSAgICAgICAgXGVsc2UKLSAgICAgICAgICAlIE90aGVyd2lzZSBqdXN0IGNvcHkgdGhlIEluZm8gbm9kZSBuYW1lLgotICAgICAgICAgIFxkZWZccHJpbnRlZG5vZGVuYW1le1xpZ25vcmVzcGFjZXMgIzF9JQotICAgICAgICBcZmklCi0gICAgICBcZmkKLSAgICBcZmkKLSAgXGZpCi0gICUKLSAgJSBJZiB3ZSB1c2UgXHVuaGJveDAgYW5kIFx1bmhib3gxIHRvIHByaW50IHRoZSBub2RlIG5hbWVzLCBUZVggZG9lcyBub3QKLSAgJSBpbnNlcnQgZW1wdHkgZGlzY3JldGlvbmFyaWVzIGFmdGVyIGh5cGhlbnMsIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbAotICAlIG5vdCBmaW5kIGEgbGluZSBicmVhayBhdCBhIGh5cGhlbiBpbiBhIG5vZGUgbmFtZXMuICBTaW5jZSBzb21lIG1hbnVhbHMKLSAgJSBhcmUgYmVzdCB3cml0dGVuIHdpdGggZmFpcmx5IGxvbmcgbm9kZSBuYW1lcywgY29udGFpbmluZyBoeXBoZW5zLCB0aGlzCi0gICUgaXMgYSBsb3NzLiAgVGhlcmVmb3JlLCB3ZSBnaXZlIHRoZSB0ZXh0IG9mIHRoZSBub2RlIG5hbWUgYWdhaW4sIHNvIGl0Ci0gICUgaXMgYXMgaWYgVGVYIGlzIHNlZWluZyBpdCBmb3IgdGhlIGZpcnN0IHRpbWUuCi0gIFxpZmRpbSBcd2QxID4gMHB0Ci0gICAgXHB1dHdvcmRzZWN0aW9ue30gYGBccHJpbnRlZG5vZGVuYW1lJycgaW4gXGNpdGV7XHByaW50ZWRtYW51YWx9JQotICBcZWxzZQotICAgICUgXyAoZm9yIGV4YW1wbGUpIGhhcyB0byBiZSB0aGUgY2hhcmFjdGVyIF8gZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUKLSAgICAlIGNvbnRyb2wgc2VxdWVuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSwgYnV0IGl0IGhhcyB0byBleHBhbmQKLSAgICAlIGludG8gdGhlIHVzdWFsIFxsZWF2ZXZtb2RlLi4uXHZydWxlIHN0dWZmIGZvciBwdXJwb3NlcyBvZgotICAgICUgcHJpbnRpbmcuIFNvIHdlIFx0dXJub2ZmYWN0aXZlIGZvciB0aGUgXHJlZngtc250LCBiYWNrIG9uIGZvciB0aGUKLSAgICAlIHByaW50aW5nLCBiYWNrIG9mZiBmb3IgdGhlIFxyZWZ4LXBnLgotICAgIHtcbm9ybWFsdHVybm9mZmFjdGl2ZQotICAgICAlIE9ubHkgb3V0cHV0IGEgZm9sbG93aW5nIHNwYWNlIGlmIHRoZSAtc250IHJlZiBpcyBub25lbXB0eTsgZm9yCi0gICAgICUgQHVubnVtYmVyZWQgYW5kIEBhbmNob3IsIGl0IHdvbid0IGJlLgotICAgICBcc2V0Ym94MiA9IFxoYm94e1xpZ25vcmVzcGFjZXMgXHJlZnh7IzEtc250fXt9fSUKLSAgICAgXGlmZGltIFx3ZDIgPiAwcHQgXHJlZnh7IzEtc250fVxzcGFjZVxmaQotICAgIH0lCi0gICAgJSBbbXlub2RlXSwgCi0gICAgW1xwcmludGVkbm9kZW5hbWVdLFxzcGFjZQotICAgICUgcGFnZSAzCi0gICAgXHR1cm5vZmZhY3RpdmUgXHB1dHdvcmRwYWdlXHRpZVxyZWZ4eyMxLXBnfXt9JQotICBcZmkKLVxlbmRncm91cH0KLQotJSBcZG9zZXRxIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGNhbGxzIGZyb20gb3RoZXIgbWFjcm9zCi0KLSUgVXNlIFxub3JtYWx0dXJub2ZmYWN0aXZlIHNvIHRoYXQgcHVuY3R1YXRpb24gY2hhcnMgc3VjaCBhcyB1bmRlcnNjb3JlCi0lIGFuZCBiYWNrc2xhc2ggd29yayBpbiBub2RlIG5hbWVzLiAgKFx0dXJub2ZmYWN0aXZlIGRvZXNuJ3QgZG8gXC4pCi1cZGVmXGRvc2V0cSMxIzJ7JQotICB7XGxldFxmb2xpbz0wCi0gICBcbm9ybWFsdHVybm9mZmFjdGl2ZQotICAgXGVkZWZcbmV4dHtcd3JpdGVcYXV4ZmlsZXtcaW50ZXJuYWxzZXRxeyMxfXsjMn19fSUKLSAgIFxpZmxpbmtzCi0gICAgIFxuZXh0Ci0gICBcZmkKLSAgfSUKLX0KLQotJSBcaW50ZXJuYWxzZXRxIHtmb299e3BhZ2V9IGV4cGFuZHMgaW50bwotJSBDSEFSQUNURVJTICd4cmRlZiB7Zm9vfXsuLi5leHBhbnNpb24gb2YgXFlwYWdlLi4ufQotJSBXaGVuIHRoZSBhdXggZmlsZSBpcyByZWFkLCAnIGlzIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0KLVxkZWZcaW50ZXJuYWxzZXRxICMxIzJ7J3hyZGVmIHsjMX17XGNzbmFtZSAjMlxlbmRjc25hbWV9fQotCi0lIFRoaW5ncyB0byBiZSBleHBhbmRlZCBieSBcaW50ZXJuYWxzZXRxCi0KLVxkZWZcWXBhZ2VudW1iZXJ7XGZvbGlvfQotCi1cZGVmXFl0aXRsZXtcdGhpc3NlY3Rpb259Ci0KLVxkZWZcWW5vdGhpbmd7fQotCi1cZGVmXFlzZWN0aW9ubnVtYmVyYW5kdHlwZXslCi1caWZudW1cc2Vjbm89MCBccHV0d29yZENoYXB0ZXJceHJlZnRpZVx0aGVcY2hhcG5vICUKLVxlbHNlIFxpZm51bSBcc3Vic2Vjbm89MCBccHV0d29yZFNlY3Rpb25ceHJlZnRpZVx0aGVcY2hhcG5vLlx0aGVcc2Vjbm8gJQotXGVsc2UgXGlmbnVtIFxzdWJzdWJzZWNubz0wICUKLVxwdXR3b3JkU2VjdGlvblx4cmVmdGllXHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vICUKLVxlbHNlICUKLVxwdXR3b3JkU2VjdGlvblx4cmVmdGllXHRoZVxjaGFwbm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm8gJQotXGZpIFxmaSBcZmkgfQotCi1cZGVmXFlhcHBlbmRpeGxldHRlcmFuZHR5cGV7JQotXGlmbnVtXHNlY25vPTAgXHB1dHdvcmRBcHBlbmRpeFx4cmVmdGllJ2NoYXJcdGhlXGFwcGVuZGl4bm97fSUKLVxlbHNlIFxpZm51bSBcc3Vic2Vjbm89MCBccHV0d29yZFNlY3Rpb25ceHJlZnRpZSdjaGFyXHRoZVxhcHBlbmRpeG5vLlx0aGVcc2Vjbm8gJQotXGVsc2UgXGlmbnVtIFxzdWJzdWJzZWNubz0wICUKLVxwdXR3b3JkU2VjdGlvblx4cmVmdGllJ2NoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vICUKLVxlbHNlICUKLVxwdXR3b3JkU2VjdGlvblx4cmVmdGllJ2NoYXJcdGhlXGFwcGVuZGl4bm8uXHRoZVxzZWNuby5cdGhlXHN1YnNlY25vLlx0aGVcc3Vic3Vic2Vjbm8gJQotXGZpIFxmaSBcZmkgfQotCi1cZ2RlZlx4cmVmdGlleyd0aWV9Ci0KLSUgVXNlIFRlWCAzLjAncyBcaW5wdXRsaW5lbm8gdG8gZ2V0IHRoZSBsaW5lIG51bWJlciwgZm9yIGJldHRlciBlcnJvcgotJSBtZXNzYWdlcywgYnV0IGlmIHdlJ3JlIHVzaW5nIGFuIG9sZCB2ZXJzaW9uIG9mIFRlWCwgZG9uJ3QgZG8gYW55dGhpbmcuCi0lCi1caWZ4XGlucHV0bGluZW5vXHRoaXNpc3VuZGVmaW5lZAotICBcbGV0XGxpbmVudW1iZXIgPSBcZW1wdHkgJSBOb24tMy4wLgotXGVsc2UKLSAgXGRlZlxsaW5lbnVtYmVye1x0aGVcaW5wdXRsaW5lbm86XHNwYWNlfQotXGZpCi0KLSUgRGVmaW5lIFxyZWZ4e05BTUV9e1NVRkZJWH0gdG8gcmVmZXJlbmNlIGEgY3Jvc3MtcmVmZXJlbmNlIHN0cmluZyBuYW1lZCBOQU1FLgotJSBJZiBpdHMgdmFsdWUgaXMgbm9uZW1wdHksIFNVRkZJWCBpcyBvdXRwdXQgYWZ0ZXJ3YXJkLgotCi1cZGVmXHJlZngjMSMyeyUKLSAgXGV4cGFuZGFmdGVyXGlmeFxjc25hbWUgWCMxXGVuZGNzbmFtZVxyZWxheAotICAgICUgSWYgbm90IGRlZmluZWQsIHNheSBzb21ldGhpbmcgYXQgbGVhc3QuCi0gICAgXGFuZ2xlbGVmdCB1blwtZGVcLWZpbmVkXGFuZ2xlcmlnaHQKLSAgICBcaWZsaW5rcwotICAgICAgXGlmaGF2ZXhyZWZzCi0gICAgICAgIFxtZXNzYWdle1xsaW5lbnVtYmVyIFVuZGVmaW5lZCBjcm9zcyByZWZlcmVuY2UgYCMxJy59JQotICAgICAgXGVsc2UKLSAgICAgICAgXGlmd2FybmVkeHJlZnNcZWxzZQotICAgICAgICAgIFxnbG9iYWxcd2FybmVkeHJlZnN0cnVlCi0gICAgICAgICAgXG1lc3NhZ2V7Q3Jvc3MgcmVmZXJlbmNlIHZhbHVlcyB1bmtub3duOyB5b3UgbXVzdCBydW4gVGVYIGFnYWluLn0lCi0gICAgICAgIFxmaQotICAgICAgXGZpCi0gICAgXGZpCi0gIFxlbHNlCi0gICAgJSBJdCdzIGRlZmluZWQsIHNvIGp1c3QgdXNlIGl0LgotICAgIFxjc25hbWUgWCMxXGVuZGNzbmFtZQotICBcZmkKLSAgIzIlIE91dHB1dCB0aGUgc3VmZml4IGluIGFueSBjYXNlLgotfQotCi0lIFRoaXMgaXMgdGhlIG1hY3JvIGludm9rZWQgYnkgZW50cmllcyBpbiB0aGUgYXV4IGZpbGUuCi0lIAotXGRlZlx4cmRlZiMxe1xiZWdpbmdyb3VwCi0gICUgUmVlbmFibGUgXCBhcyBhbiBlc2NhcGUgd2hpbGUgcmVhZGluZyB0aGUgc2Vjb25kIGFyZ3VtZW50LgotICBcY2F0Y29kZWBcXCA9IDAKLSAgXGFmdGVyYXNzaWdubWVudFxlbmRncm91cAotICBcZXhwYW5kYWZ0ZXJcZ2RlZlxjc25hbWUgWCMxXGVuZGNzbmFtZQotfQotCi0lIFJlYWQgdGhlIGxhc3QgZXhpc3RpbmcgYXV4IGZpbGUsIGlmIGFueS4gIE5vIGVycm9yIGlmIG5vbmUgZXhpc3RzLgotXGRlZlxyZWFkYXV4ZmlsZXtcYmVnaW5ncm91cAotICBcY2F0Y29kZWBcXl5APVxvdGhlcgotICBcY2F0Y29kZWBcXl5BPVxvdGhlcgotICBcY2F0Y29kZWBcXl5CPVxvdGhlcgotICBcY2F0Y29kZWBcXl5DPVxvdGhlcgotICBcY2F0Y29kZWBcXl5EPVxvdGhlcgotICBcY2F0Y29kZWBcXl5FPVxvdGhlcgotICBcY2F0Y29kZWBcXl5GPVxvdGhlcgotICBcY2F0Y29kZWBcXl5HPVxvdGhlcgotICBcY2F0Y29kZWBcXl5IPVxvdGhlcgotICBcY2F0Y29kZWBcXl5LPVxvdGhlcgotICBcY2F0Y29kZWBcXl5MPVxvdGhlcgotICBcY2F0Y29kZWBcXl5OPVxvdGhlcgotICBcY2F0Y29kZWBcXl5QPVxvdGhlcgotICBcY2F0Y29kZWBcXl5RPVxvdGhlcgotICBcY2F0Y29kZWBcXl5SPVxvdGhlcgotICBcY2F0Y29kZWBcXl5TPVxvdGhlcgotICBcY2F0Y29kZWBcXl5UPVxvdGhlcgotICBcY2F0Y29kZWBcXl5VPVxvdGhlcgotICBcY2F0Y29kZWBcXl5WPVxvdGhlcgotICBcY2F0Y29kZWBcXl5XPVxvdGhlcgotICBcY2F0Y29kZWBcXl5YPVxvdGhlcgotICBcY2F0Y29kZWBcXl5aPVxvdGhlcgotICBcY2F0Y29kZWBcXl5bPVxvdGhlcgotICBcY2F0Y29kZWBcXl5cPVxvdGhlcgotICBcY2F0Y29kZWBcXl5dPVxvdGhlcgotICBcY2F0Y29kZWBcXl5ePVxvdGhlcgotICBcY2F0Y29kZWBcXl5fPVxvdGhlcgotICBcY2F0Y29kZWBcQD1cb3RoZXIKLSAgXGNhdGNvZGVgXF49XG90aGVyCi0gICUgSXQgd2FzIHN1Z2dlc3RlZCB0byBkZWZpbmUgdGhpcyBhcyA3LCB3aGljaCB3b3VsZCBhbGxvdyBeXmU0IGV0Yy4KLSAgJSBpbiB4cmVmIHRhZ3MsIGkuZS4sIG5vZGUgbmFtZXMuICBCdXQgc2luY2UgXl5lNCBub3RhdGlvbiBpc24ndAotICAlIHN1cHBvcnRlZCBpbiB0aGUgbWFpbiB0ZXh0LCBpdCBkb2Vzbid0IHNlZW0gZGVzaXJhYmxlLiAgRnVydGhlcm1vcmUsCi0gICUgdGhhdCBpcyBub3QgZW5vdWdoOiBmb3Igbm9kZSBuYW1lcyB0aGF0IGFjdHVhbGx5IGNvbnRhaW4gYSBeCi0gICUgY2hhcmFjdGVyLCB3ZSB3b3VsZCBlbmQgdXAgd3JpdGluZyBhIGxpbmUgbGlrZSB0aGlzOiAneHJkZWYgeydoYXQKLSAgJSBiLXRpdGxlfXsnaGF0IGJ9IGFuZCBceHJkZWYgZG9lcyBhIFxjc25hbWUuLi5cZW5kY3NuYW1lIG9uIHRoZSBmaXJzdAotICAlIGFyZ3VtZW50LCBhbmQgXGhhdCBpcyBub3QgYW4gZXhwYW5kYWJsZSBjb250cm9sIHNlcXVlbmNlLiAgSXQgY291bGQKLSAgJSBhbGwgYmUgd29ya2VkIG91dCwgYnV0IHdoeT8gIEVpdGhlciB3ZSBzdXBwb3J0IF5eIG9yIHdlIGRvbid0LgotICAlCi0gICUgVGhlIG90aGVyIGNoYW5nZSBuZWNlc3NhcnkgZm9yIHRoaXMgd2FzIHRvIGRlZmluZSBcYXV4aGF0OgotICAlIFxkZWZcYXV4aGF0e1xkZWZeeydoYXQgfX0lIGV4dHJhIHNwYWNlIHNvIG9rIGlmIGZvbGxvd2VkIGJ5IGxldHRlcgotICAlIGFuZCB0aGVuIHRvIGNhbGwgXGF1eGhhdCBpbiBcc2V0cS4KLSAgJQotICBcY2F0Y29kZWBcfj1cb3RoZXIKLSAgXGNhdGNvZGVgXFs9XG90aGVyCi0gIFxjYXRjb2RlYFxdPVxvdGhlcgotICBcY2F0Y29kZWBcIj1cb3RoZXIKLSAgXGNhdGNvZGVgXF89XG90aGVyCi0gIFxjYXRjb2RlYFx8PVxvdGhlcgotICBcY2F0Y29kZWBcPD1cb3RoZXIKLSAgXGNhdGNvZGVgXD49XG90aGVyCi0gIFxjYXRjb2RlYFwkPVxvdGhlcgotICBcY2F0Y29kZWBcIz1cb3RoZXIKLSAgXGNhdGNvZGVgXCY9XG90aGVyCi0gIFxjYXRjb2RlYCs9XG90aGVyICUgYXZvaWQgXCsgZm9yIHBhcmFub2lhIGV2ZW4gdGhvdWdoIHdlJ3ZlIHR1cm5lZCBpdCBvZmYKLSAgJSBNYWtlIHRoZSBjaGFyYWN0ZXJzIDEyOC0yNTUgYmUgcHJpbnRpbmcgY2hhcmFjdGVycwotICB7JQotICAgIFxjb3VudCAxPTEyOAotICAgIFxkZWZcbG9vcHslCi0gICAgICBcY2F0Y29kZVxjb3VudCAxPVxvdGhlcgotICAgICAgXGFkdmFuY2VcY291bnQgMSBieSAxCi0gICAgICBcaWZudW0gXGNvdW50IDE8MjU2IFxsb29wIFxmaQotICAgIH0lCi0gIH0lCi0gICUgVGhlIGF1eCBmaWxlIHVzZXMgJyBhcyB0aGUgZXNjYXBlIChmb3Igbm93KS4KLSAgJSBUdXJuIG9mZiBcIGFzIGFuIGVzY2FwZSBzbyB3ZSBkbyBub3QgbG9zZSBvbgotICAlIGVudHJpZXMgd2hpY2ggd2VyZSBkdW1wZWQgd2l0aCBjb250cm9sIHNlcXVlbmNlcyBpbiB0aGVpciBuYW1lcy4KLSAgJSBGb3IgZXhhbXBsZSwgJ3hyZGVmIHskXGxlcSAkLWZ1bn17cGFnZSAuLi59IG1hZGUgYnkgQGRlZnVuIF5eCi0gICUgUmVmZXJlbmNlIHRvIHN1Y2ggZW50cmllcyBzdGlsbCBkb2VzIG5vdCB3b3JrIHRoZSB3YXkgb25lIHdvdWxkIHdpc2gsCi0gICUgYnV0IGF0IGxlYXN0IHRoZXkgZG8gbm90IGJvbWIgb3V0IHdoZW4gdGhlIGF1eCBmaWxlIGlzIHJlYWQgaW4uCi0gIFxjYXRjb2RlYFx7PTEKLSAgXGNhdGNvZGVgXH09MgotICBcY2F0Y29kZWBcJT1cb3RoZXIKLSAgXGNhdGNvZGVgXCc9MAotICBcY2F0Y29kZWBcXD1cb3RoZXIKLSAgJQotICBcb3BlbmluIDEgXGpvYm5hbWUuYXV4Ci0gIFxpZmVvZiAxIFxlbHNlCi0gICAgXGNsb3NlaW4gMQotICAgIFxpbnB1dCBcam9ibmFtZS5hdXgKLSAgICBcZ2xvYmFsXGhhdmV4cmVmc3RydWUKLSAgICBcZ2xvYmFsXHdhcm5lZG9ic3RydWUKLSAgXGZpCi0gICUgT3BlbiB0aGUgbmV3IGF1eCBmaWxlLiAgVGVYIHdpbGwgY2xvc2UgaXQgYXV0b21hdGljYWxseSBhdCBleGl0LgotICBcb3Blbm91dFxhdXhmaWxlPVxqb2JuYW1lLmF1eAotXGVuZGdyb3VwfQotCi0KLSUgRm9vdG5vdGVzLgotCi1cbmV3Y291bnQgXGZvb3Rub3Rlbm8KLQotJSBUaGUgdHJhaWxpbmcgc3BhY2UgaW4gdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGZvciBzdXBlcmVqZWN0IGlzCi0lIHZpdGFsIGZvciBwcm9wZXIgZmlsbGluZzsgcGFnZXMgY29tZSBvdXQgdW5hbGlnbmVkIHdoZW4geW91IGRvIGEKLSUgcGFnZWFsaWdubWFjcm8gY2FsbCBpZiB0aGF0IHNwYWNlIGJlZm9yZSB0aGUgY2xvc2luZyBicmFjZSBpcwotJSByZW1vdmVkLiAoR2VuZXJhbGx5LCBudW1lcmljIGNvbnN0YW50cyBzaG91bGQgYWx3YXlzIGJlIGZvbGxvd2VkIGJ5IGEKLSUgc3BhY2UgdG8gcHJldmVudCBzdHJhbmdlIGV4cGFuc2lvbiBlcnJvcnMuKQotXGRlZlxzdXBlcmVqZWN0e1xwYXJccGVuYWx0eSAtMjAwMDBcZm9vdG5vdGVubyA9MCB9Ci0KLSUgQGZvb3Rub3Rlc3R5bGUgaXMgbWVhbmluZ2Z1bCBmb3IgaW5mbyBvdXRwdXQgb25seS4KLVxsZXRcZm9vdG5vdGVzdHlsZT1cY29tbWVudAotCi1cbGV0XHB0ZXhmb290bm90ZT1cZm9vdG5vdGUKLQote1xjYXRjb2RlIGBcQD0xMQotJQotJSBBdXRvLW51bWJlciBmb290bm90ZXMuICBPdGhlcndpc2UgbGlrZSBwbGFpbi4KLVxnZGVmXGZvb3Rub3RleyUKLSAgXGdsb2JhbFxhZHZhbmNlXGZvb3Rub3Rlbm8gYnkgXEBuZQotICBcZWRlZlx0aGlzZm9vdG5veyRee1x0aGVcZm9vdG5vdGVub30kfSUKLSAgJQotICAlIEluIGNhc2UgdGhlIGZvb3Rub3RlIGNvbWVzIGF0IHRoZSBlbmQgb2YgYSBzZW50ZW5jZSwgcHJlc2VydmUgdGhlCi0gICUgZXh0cmEgc3BhY2luZyBhZnRlciB3ZSBkbyB0aGUgZm9vdG5vdGUgbnVtYmVyLgotICBcbGV0XEBzZlxlbXB0eQotICBcaWZobW9kZVxlZGVmXEBzZntcc3BhY2VmYWN0b3JcdGhlXHNwYWNlZmFjdG9yfVwvXGZpCi0gICUKLSAgJSBSZW1vdmUgaW5hZHZlcnRlbnQgYmxhbmsgc3BhY2UgYmVmb3JlIHR5cGVzZXR0aW5nIHRoZSBmb290bm90ZSBudW1iZXIuCi0gIFx1bnNraXAKLSAgXHRoaXNmb290bm9cQHNmCi0gIFxmb290bm90ZXp6egotfSUKLQotJSBEb24ndCBib3RoZXIgd2l0aCB0aGUgdHJpY2tlcnkgaW4gcGxhaW4udGV4IHRvIG5vdCByZXF1aXJlIHRoZQotJSBmb290bm90ZSB0ZXh0IGFzIGEgcGFyYW1ldGVyLiAgT3VyIGZvb3Rub3RlcyBkb24ndCBuZWVkIHRvIGJlIHNvIGdlbmVyYWwuCi0lCi0lIE9oIHllcywgdGhleSBkbzsgb3RoZXJ3aXNlLCBAaWZzZXQgYW5kIGFueXRoaW5nIGVsc2UgdGhhdCB1c2VzCi0lIFxwYXJzZWFyZ2xpbmUgZmFpbCBpbnNpZGUgZm9vdG5vdGVzIGJlY2F1c2UgdGhlIHRva2VucyBhcmUgZml4ZWQgd2hlbgotJSB0aGUgZm9vdG5vdGUgaXMgcmVhZC4gIC0ta2FybCwgMTZub3Y5Ni4KLSUKLVxsb25nXGdkZWZcZm9vdG5vdGV6enp7XGluc2VydFxmb290aW5zXGJncm91cAotICAlIFdlIHdhbnQgdG8gdHlwZXNldCB0aGlzIHRleHQgYXMgYSBub3JtYWwgcGFyYWdyYXBoLCBldmVuIGlmIHRoZQotICAlIGZvb3Rub3RlIHJlZmVyZW5jZSBvY2N1cnMgaW4gKGZvciBleGFtcGxlKSBhIGRpc3BsYXkgZW52aXJvbm1lbnQuCi0gICUgU28gcmVzZXQgc29tZSBwYXJhbWV0ZXJzLgotICBcaW50ZXJsaW5lcGVuYWx0eVxpbnRlcmZvb3Rub3RlbGluZXBlbmFsdHkKLSAgXHNwbGl0dG9wc2tpcFxodFxzdHJ1dGJveCAlIHRvcCBiYXNlbGluZSBmb3IgYnJva2VuIGZvb3Rub3RlcwotICBcc3BsaXRtYXhkZXB0aFxkcFxzdHJ1dGJveAotICBcZmxvYXRpbmdwZW5hbHR5XEBNTQotICBcbGVmdHNraXBcekBza2lwCi0gIFxyaWdodHNraXBcekBza2lwCi0gIFxzcGFjZXNraXBcekBza2lwCi0gIFx4c3BhY2Vza2lwXHpAc2tpcAotICBccGFyaW5kZW50XGRlZmF1bHRwYXJpbmRlbnQKLSAgJQotICAlIEhhbmcgdGhlIGZvb3Rub3RlIHRleHQgb2ZmIHRoZSBudW1iZXIuCi0gIFxoYW5nCi0gIFx0ZXh0aW5kZW50e1x0aGlzZm9vdG5vfSUKLSAgJQotICAlIERvbid0IGNyYXNoIGludG8gdGhlIGxpbmUgYWJvdmUgdGhlIGZvb3Rub3RlIHRleHQuICBTaW5jZSB0aGlzCi0gICUgZXhwYW5kcyBpbnRvIGEgYm94LCBpdCBtdXN0IGNvbWUgd2l0aGluIHRoZSBwYXJhZ3JhcGgsIGxlc3QgaXQKLSAgJSBwcm92aWRlIGEgcGxhY2Ugd2hlcmUgVGVYIGNhbiBzcGxpdCB0aGUgZm9vdG5vdGUuCi0gIFxmb290c3RydXQKLSAgXGZ1dHVyZWxldFxuZXh0XGZvQHQKLX0KLVxkZWZcZm9AdHtcaWZjYXRcYmdyb3VwXG5vZXhwYW5kXG5leHQgXGxldFxuZXh0XGZAQHQKLSAgXGVsc2VcbGV0XG5leHRcZkB0XGZpIFxuZXh0fQotXGRlZlxmQEB0e1xiZ3JvdXBcYWZ0ZXJncm91cFxAZm9vdFxsZXRcbmV4dH0KLVxkZWZcZkB0IzF7IzFcQGZvb3R9Ci1cZGVmXEBmb290e1xzdHJ1dFxlZ3JvdXB9Ci0KLX0lZW5kIFxjYXRjb2RlIGBcQD0xMQotCi0lIFNldCB0aGUgYmFzZWxpbmVza2lwIHRvICMxLCBhbmQgdGhlIGxpbmVza2lwIGFuZCBzdHJ1dCBzaXplCi0lIGNvcnJlc3BvbmRpbmdseS4gIFRoZXJlIGlzIG5vIGRlZXAgbWVhbmluZyBiZWhpbmQgdGhlc2UgbWFnaWMgbnVtYmVycwotJSB1c2VkIGFzIGZhY3RvcnM7IHRoZXkganVzdCBtYXRjaCAoY2xvc2VseSBlbm91Z2gpIHdoYXQgS251dGggZGVmaW5lZC4KLSUKLVxkZWZcbGluZXNraXBmYWN0b3J7LjA4MzMzfQotXGRlZlxzdHJ1dGhlaWdodHBlcmNlbnR7LjcwODMzfQotXGRlZlxzdHJ1dGRlcHRocGVyY2VudCB7LjI5MTY3fQotJQotXGRlZlxzZXRsZWFkaW5nIzF7JQotICBcbm9ybWFsYmFzZWxpbmVza2lwID0gIzFccmVsYXgKLSAgXG5vcm1hbGxpbmVza2lwID0gXGxpbmVza2lwZmFjdG9yXG5vcm1hbGJhc2VsaW5lc2tpcAotICBcbm9ybWFsYmFzZWxpbmVzCi0gIFxzZXRib3hcc3RydXRib3ggPVxoYm94eyUKLSAgICBcdnJ1bGUgd2lkdGgwcHQgaGVpZ2h0XHN0cnV0aGVpZ2h0cGVyY2VudFxiYXNlbGluZXNraXAKLSAgICAgICAgICAgICAgICAgICAgZGVwdGggXHN0cnV0ZGVwdGhwZXJjZW50IFxiYXNlbGluZXNraXAKLSAgfSUKLX0KLQotJSBAfCBpbnNlcnRzIGEgY2hhbmdlYmFyIHRvIHRoZSBsZWZ0IG9mIHRoZSBjdXJyZW50IGxpbmUuICBJdCBzaG91bGQKLSUgc3Vycm91bmQgYW55IGNoYW5nZWQgdGV4dC4gIFRoaXMgYXBwcm9hY2ggZG9lcyAqbm90KiB3b3JrIGlmIHRoZQotJSBjaGFuZ2Ugc3BhbnMgbW9yZSB0aGFuIHR3byBsaW5lcyBvZiBvdXRwdXQuICBUbyBoYW5kbGUgdGhhdCwgd2Ugd291bGQKLSUgaGF2ZSBhZG9wdCBhIG11Y2ggbW9yZSBkaWZmaWN1bHQgYXBwcm9hY2ggKHB1dHRpbmcgbWFya3MgaW50byB0aGUgbWFpbgotJSB2ZXJ0aWNhbCBsaXN0IGZvciB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgZWFjaCBjaGFuZ2UpLgotJQotXGRlZlx8eyUKLSAgJSBcdmFkanVzdCBjYW4gb25seSBiZSB1c2VkIGluIGhvcml6b250YWwgbW9kZS4KLSAgXGxlYXZldm1vZGUKLSAgJQotICAlIEFwcGVuZCB0aGlzIHZlcnRpY2FsIG1vZGUgbWF0ZXJpYWwgYWZ0ZXIgdGhlIGN1cnJlbnQgbGluZSBpbiB0aGUgb3V0cHV0LgotICBcdmFkanVzdHslCi0gICAgJSBXZSB3YW50IHRvIGluc2VydCBhIHJ1bGUgd2l0aCB0aGUgaGVpZ2h0IGFuZCBkZXB0aCBvZiB0aGUgY3VycmVudAotICAgICUgbGVhZGluZzsgdGhhdCBpcyBleGFjdGx5IHdoYXQgXHN0cnV0Ym94IGlzIHN1cHBvc2VkIHRvIHJlY29yZC4KLSAgICBcdnNraXAtXGJhc2VsaW5lc2tpcAotICAgICUKLSAgICAlIFx2YWRqdXN0LWl0ZW1zIGFyZSBpbnNlcnRlZCBhdCB0aGUgbGVmdCBlZGdlIG9mIHRoZSB0eXBlLiAgU28KLSAgICAlIHRoZSBcbGxhcCBoZXJlIG1vdmVzIG91dCBpbnRvIHRoZSBsZWZ0LWhhbmQgbWFyZ2luLgotICAgIFxsbGFweyUKLSAgICAgICUKLSAgICAgICUgRm9yIGEgdGhpY2tlciBvciB0aGlubmVyIGJhciwgY2hhbmdlIHRoZSBgMXB0Jy4KLSAgICAgIFx2cnVsZSBoZWlnaHRcYmFzZWxpbmVza2lwIHdpZHRoMXB0Ci0gICAgICAlCi0gICAgICAlIFRoaXMgaXMgdGhlIHNwYWNlIGJldHdlZW4gdGhlIGJhciBhbmQgdGhlIHRleHQuCi0gICAgICBcaHNraXAgMTJwdAotICAgIH0lCi0gIH0lCi19Ci0KLSUgRm9yIGEgZmluYWwgY29weSwgdGFrZSBvdXQgdGhlIHJlY3RhbmdsZXMKLSUgdGhhdCBtYXJrIG92ZXJmdWxsIGJveGVzIChpbiBjYXNlIHlvdSBoYXZlIGRlY2lkZWQKLSUgdGhhdCB0aGUgdGV4dCBsb29rcyBvayBldmVuIHRob3VnaCBpdCBwYXNzZXMgdGhlIG1hcmdpbikuCi0lCi1cZGVmXGZpbmFsb3V0e1xvdmVyZnVsbHJ1bGU9MHB0fQotCi0lIEBpbWFnZS4gIFdlIHVzZSB0aGUgbWFjcm9zIGZyb20gZXBzZi50ZXggdG8gc3VwcG9ydCB0aGlzLgotJSBJZiBlcHNmLnRleCBpcyBub3QgaW5zdGFsbGVkIGFuZCBAaW1hZ2UgaXMgdXNlZCwgd2UgY29tcGxhaW4uCi0lIAotJSBDaGVjayBmb3IgYW5kIHJlYWQgZXBzZi50ZXggdXAgZnJvbnQuICBJZiB3ZSByZWFkIGl0IG9ubHkgYXQgQGltYWdlCi0lIHRpbWUsIHdlIG1pZ2h0IGJlIGluc2lkZSBhIGdyb3VwLCBhbmQgdGhlbiBpdHMgZGVmaW5pdGlvbnMgd291bGQgZ2V0Ci0lIHVuZG9uZSBhbmQgdGhlIG5leHQgaW1hZ2Ugd291bGQgZmFpbC4KLVxvcGVuaW4gMSA9IGVwc2YudGV4Ci1caWZlb2YgMSBcZWxzZQotICBcY2xvc2VpbiAxCi0gICUgRG8gbm90IGJvdGhlciBzaG93aW5nIGJhbm5lciB3aXRoIHBvc3QtdjIuNyBlcHNmLnRleCAoYXZhaWxhYmxlIGluCi0gICUgZG9jL2Vwc2YudGV4IHVudGlsIGl0IHNob3dzIHVwIG9uIGN0YW4pLgotICBcZGVmXGVwc2Zhbm5vdW5jZXtcdG9rczAgPSB9JQotICBcaW5wdXQgZXBzZi50ZXgKLVxmaQotJQotXG5ld2lmXGlmd2FybmVkbm9lcHNmCi1cbmV3aGVscFxub2Vwc2ZoZWxwe2Vwc2YudGV4IG11c3QgYmUgaW5zdGFsbGVkIGZvciBpbWFnZXMgdG8KLSAgd29yay4gIEl0IGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIFRleGluZm8gZGlzdHJpYnV0aW9uLCBvciB5b3UgY2FuIGdldAotICBpdCBmcm9tIGZ0cDovL2Z0cC50dWcub3JnL3RleC9lcHNmLnRleC59Ci0lCi0lIE9ubHkgY29tcGxhaW4gb25jZSBhYm91dCBsYWNrIG9mIGVwc2YudGV4LgotXGRlZlxpbWFnZSMxeyUKLSAgXGlmeFxlcHNmYm94XHVuZGVmaW5lZAotICAgIFxpZndhcm5lZG5vZXBzZiBcZWxzZQotICAgICAgXGVycmhlbHAgPSBcbm9lcHNmaGVscAotICAgICAgXGVycm1lc3NhZ2V7ZXBzZi50ZXggbm90IGZvdW5kLCBpbWFnZXMgd2lsbCBiZSBpZ25vcmVkfSUKLSAgICAgIFxnbG9iYWxcd2FybmVkbm9lcHNmdHJ1ZQotICAgIFxmaQotICBcZWxzZQotICAgIFxpbWFnZXh4eCAjMSwsLFxmaW5pc2gKLSAgXGZpCi19Ci0lCi0lIEFyZ3VtZW50cyB0byBAaW1hZ2U6Ci0lICMxIGlzIChtYW5kYXRvcnkpIGltYWdlIGZpbGVuYW1lOyB3ZSB0YWNrIG9uIC5lcHMgZXh0ZW5zaW9uLgotJSAjMiBpcyAob3B0aW9uYWwpIHdpZHRoLCAjMyBpcyAob3B0aW9uYWwpIGhlaWdodC4KLSUgIzQgaXMganVzdCB0aGUgdXN1YWwgZXh0cmEgaWdub3JlZCBhcmcgZm9yIHBhcnNpbmcgdGhpcyBzdHVmZi4KLVxkZWZcaW1hZ2V4eHgjMSwjMiwjMywjNFxmaW5pc2h7JQotICAlIFxlcHNmYm94IGl0c2VsZiByZXNldHMgXGVwc2Y/c2l6ZSBhdCBlYWNoIGZpZ3VyZS4KLSAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMyfVxpZmRpbVx3ZDAgPiAwcHQgXGVwc2Z4c2l6ZT0jMlxyZWxheCBcZmkKLSAgXHNldGJveDAgPSBcaGJveHtcaWdub3Jlc3BhY2VzICMzfVxpZmRpbVx3ZDAgPiAwcHQgXGVwc2Z5c2l6ZT0jM1xyZWxheCBcZmkKLSAgJSBJZiB0aGUgaW1hZ2UgaXMgYnkgaXRzZWxmLCBjZW50ZXIgaXQuCi0gIFxpZnZtb2RlCi0gICAgXG5vYnJlYWtcbWVkc2tpcAotICAgIFxub2JyZWFrCi0gICAgXGNlbnRlcmxpbmV7XGVwc2Zib3h7IzEuZXBzfX0lCi0gICAgXGJpZ2JyZWFrCi0gIFxlbHNlCi0gICAgXGVwc2Zib3h7IzEuZXBzfSUKLSAgXGZpCi19Ci0KLQotXG1lc3NhZ2V7cGFwZXIgc2l6ZXMsfQotJSBBbmQgb3RoZXIgcmVsYXRlZCBwYXJhbWV0ZXJzLgotCi1cbmV3ZGltZW5cZGVmYXVsdHBhcmluZGVudCBcZGVmYXVsdHBhcmluZGVudCA9IDE1cHQKLQotXGNoYXBoZWFkaW5nc2tpcCA9IDE1cHQgcGx1cyA0cHQgbWludXMgMnB0Ci1cc2VjaGVhZGluZ3NraXAgPSAxMnB0IHBsdXMgM3B0IG1pbnVzIDJwdAotXHN1YnNlY2hlYWRpbmdza2lwID0gOXB0IHBsdXMgMnB0IG1pbnVzIDJwdAotCi0lIFByZXZlbnQgdW5kZXJmdWxsIHZib3ggZXJyb3IgbWVzc2FnZXMuCi1cdmJhZG5lc3MgPSAxMDAwMAotCi0lIERvbid0IGJlIHNvIGZpbmlja3kgYWJvdXQgdW5kZXJmdWxsIGhib3hlcywgZWl0aGVyLgotXGhiYWRuZXNzID0gMjAwMAotCi0lIEZvbGxvd2luZyBHZW9yZ2UgQnVzaCwganVzdCBnZXQgcmlkIG9mIHdpZG93cyBhbmQgb3JwaGFucy4KLVx3aWRvd3BlbmFsdHk9MTAwMDAKLVxjbHVicGVuYWx0eT0xMDAwMAotCi0lIFVzZSBUZVggMy4wJ3MgXGVtZXJnZW5jeXN0cmV0Y2ggdG8gaGVscCBsaW5lIGJyZWFraW5nLCBidXQgaWYgd2UncmUKLSUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YgVGVYLCBkb24ndCBkbyBhbnl0aGluZy4gIFdlIHdhbnQgdGhlIGFtb3VudCBvZgotJSBzdHJldGNoIGFkZGVkIHRvIGRlcGVuZCBvbiB0aGUgbGluZSBsZW5ndGgsIGhlbmNlIHRoZSBkZXBlbmRlbmNlIG9uCi0lIFxoc2l6ZS4gIFRoaXMgbWFrZXMgaXQgY29tZSB0byBhYm91dCA5cHQgZm9yIHRoZSA4LjV4MTEgZm9ybWF0LiAgV2UKLSUgY2FsbCB0aGlzIHdoZW5ldmVyIHRoZSBwYXBlciBzaXplIGlzIHNldC4KLSUKLVxkZWZcc2V0ZW1lcmdlbmN5c3RyZXRjaHslCi0gIFxpZnhcZW1lcmdlbmN5c3RyZXRjaFx0aGlzaXN1bmRlZmluZWQKLSAgICAlIEFsbG93IHVzIHRvIGFzc2lnbiB0byBcZW1lcmdlbmN5c3RyZXRjaCBhbnl3YXkuCi0gICAgXGRlZlxlbWVyZ2VuY3lzdHJldGNoe1xkaW1lbjB9JQotICBcZWxzZQotICAgIFxlbWVyZ2VuY3lzdHJldGNoID0gXGhzaXplCi0gICAgXGRpdmlkZVxlbWVyZ2VuY3lzdHJldGNoIGJ5IDQ1Ci0gIFxmaQotfQotCi0lIFBhcmFtZXRlcnMgaW4gb3JkZXI6IDEpIHRleHRoZWlnaHQ7IDIpIHRleHR3aWR0aDsgMykgdm9mZnNldDsKLSUgNCkgaG9mZnNldDsgNSkgYmluZGluZyBvZmZzZXQ7IDYpIHRvcHNraXAuICBUaGVuIHdob2V2ZXIgY2FsbHMgdXMgY2FuCi0lIHNldCBccGFyc2tpcCBhbmQgY2FsbCBcc2V0bGVhZGluZyBmb3IgXGJhc2VsaW5lc2tpcC4KLSUKLVxkZWZcaW50ZXJuYWxwYWdlc2l6ZXMjMSMyIzMjNCM1IzZ7JQotICBcdm9mZnNldCA9ICMzXHJlbGF4Ci0gIFx0b3Bza2lwID0gIzZccmVsYXgKLSAgXHNwbGl0dG9wc2tpcCA9IFx0b3Bza2lwCi0gICUKLSAgXHZzaXplID0gIzFccmVsYXgKLSAgXGFkdmFuY2VcdnNpemUgYnkgXHRvcHNraXAKLSAgXG91dGVydnNpemUgPSBcdnNpemUKLSAgXGFkdmFuY2Vcb3V0ZXJ2c2l6ZSBieSAwLjZpbgotICBccGFnZWhlaWdodCA9IFx2c2l6ZQotICAlCi0gIFxoc2l6ZSA9ICMyXHJlbGF4Ci0gIFxvdXRlcmhzaXplID0gXGhzaXplCi0gIFxhZHZhbmNlXG91dGVyaHNpemUgYnkgMC41aW4KLSAgXHBhZ2V3aWR0aCA9IFxoc2l6ZQotICAlCi0gIFxub3JtYWxvZmZzZXQgPSAjNFxyZWxheAotICBcYmluZGluZ29mZnNldCA9ICM1XHJlbGF4Ci0gICUKLSAgXHBhcmluZGVudCA9IFxkZWZhdWx0cGFyaW5kZW50Ci0gIFxzZXRlbWVyZ2VuY3lzdHJldGNoCi19Ci0KLSUgQGxldHRlcnBhcGVyICh0aGUgZGVmYXVsdCkuCi1cZGVmXGxldHRlcnBhcGVye3tcZ2xvYmFsZGVmcyA9IDEKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEzLjJwdH0lCi0gICUKLSAgJSBJZiBwYWdlIGlzIG5vdGhpbmcgYnV0IHRleHQsIG1ha2UgaXQgY29tZSBvdXQgZXZlbi4KLSAgXGludGVybmFscGFnZXNpemVzezQ2XGJhc2VsaW5lc2tpcH17NmlufXtcdm9mZnNldH17LjI1aW59e1xiaW5kaW5nb2Zmc2V0fXszNnB0fSUKLX19Ci0KLSUgVXNlIEBzbWFsbGJvb2sgdG8gcmVzZXQgcGFyYW1ldGVycyBmb3IgN3g5LjUgKG9yIHNvKSBmb3JtYXQuCi1cZGVmXHNtYWxsYm9va3t7XGdsb2JhbGRlZnMgPSAxCi0gIFxwYXJza2lwID0gMnB0IHBsdXMgMXB0Ci0gIFxzZXRsZWFkaW5nezEycHR9JQotICAlCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3s3LjVpbn17NS5pbn17XHZvZmZzZXR9ey4yNWlufXtcYmluZGluZ29mZnNldH17MTZwdH0lCi0gICUKLSAgXGxpc3BuYXJyb3dpbmcgPSAwLjNpbgotICBcdG9sZXJhbmNlID0gNzAwCi0gIFxoZnV6eiA9IDFwdAotICBcY29udGVudHNyaWdodG1hcmdpbiA9IDBwdAotICBcZGVmdHlwZW1hcmdpbiA9IDBwdAotICBcZGVmYm9keWluZGVudCA9IC41Y20KLSAgJQotICBcbGV0XHNtYWxsZGlzcGxheSA9IFxzbWFsbGRpc3BsYXl4Ci0gIFxsZXRcc21hbGxleGFtcGxlID0gXHNtYWxsbGlzcHgKLSAgXGxldFxzbWFsbGZvcm1hdCA9IFxzbWFsbGZvcm1hdHgKLSAgXGxldFxzbWFsbGxpc3AgPSBcc21hbGxsaXNweAotfX0KLQotJSBVc2UgQGFmb3VycGFwZXIgdG8gcHJpbnQgb24gRXVyb3BlYW4gQTQgcGFwZXIuCi1cZGVmXGFmb3VycGFwZXJ7e1xnbG9iYWxkZWZzID0gMQotICBcc2V0bGVhZGluZ3sxMnB0fSUKLSAgXHBhcnNraXAgPSAzcHQgcGx1cyAycHQgbWludXMgMXB0Ci0gICUKLSAgXGludGVybmFscGFnZXNpemVzezUzXGJhc2VsaW5lc2tpcH17MTYwbW19e1x2b2Zmc2V0fXs0bW19e1xiaW5kaW5nb2Zmc2V0fXs0NHB0fSUKLSAgJQotICBcdG9sZXJhbmNlID0gNzAwCi0gIFxoZnV6eiA9IDFwdAotfX0KLQotJSBBIHNwZWNpZmljIHRleHQgbGF5b3V0LCAyNHgxNWNtIG92ZXJhbGwsIGludGVuZGVkIGZvciBBNCBwYXBlci4gIFRvcCBtYXJnaW4KLSUgMjltbSwgaGVuY2UgYm90dG9tIG1hcmdpbiAyOG1tLCBub21pbmFsIHNpZGUgbWFyZ2luIDNjbS4KLVxkZWZcYWZvdXJsYXRleHt7XGdsb2JhbGRlZnMgPSAxCi0gIFxzZXRsZWFkaW5nezEzLjZwdH0lCi0gICUKLSAgXGFmb3VycGFwZXIKLSAgXGludGVybmFscGFnZXNpemVzezIzN21tfXsxNTBtbX17My42bW19ezMuNm1tfXszbW19ezdtbX0lCi0gICUKLSAgXGdsb2JhbGRlZnMgPSAwCi19fQotCi0lIFVzZSBAYWZvdXJ3aWRlIHRvIHByaW50IG9uIEV1cm9wZWFuIEE0IHBhcGVyIGluIHdpZGUgZm9ybWF0LgotXGRlZlxhZm91cndpZGV7JQotICBcYWZvdXJwYXBlcgotICBcaW50ZXJuYWxwYWdlc2l6ZXN7OS41aW59ezYuNWlufXtcaG9mZnNldH17XG5vcm1hbG9mZnNldH17XGJpbmRpbmdvZmZzZXR9ezdtbX0lCi0gICUKLSAgXGdsb2JhbGRlZnMgPSAwCi19Ci0KLSUgQHBhZ2VzaXplcyBURVhUSEVJR0hUWyxURVhUV0lEVEhdCi0lIFBlcmhhcHMgd2Ugc2hvdWxkIGFsbG93IHNldHRpbmcgdGhlIG1hcmdpbnMsIFx0b3Bza2lwLCBccGFyc2tpcCwKLSUgYW5kL29yIGxlYWRpbmcsIGFsc28uIE9yIHBlcmhhcHMgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlbSBzb21laG93LgotJSAKLVxkZWZccGFnZXNpemVze1xwYXJzZWFyZ1xwYWdlc2l6ZXN4eHh9Ci1cZGVmXHBhZ2VzaXplc3h4eCMxe1xwYWdlc2l6ZXN5eXkgIzEsLFxmaW5pc2h9Ci1cZGVmXHBhZ2VzaXplc3l5eSMxLCMyLCMzXGZpbmlzaHt7JQotICBcc2V0Ym94MCA9IFxoYm94e1xpZ25vcmVzcGFjZXMgIzJ9XGlmZGltXHdkMCA+IDBwdCBcaHNpemU9IzJccmVsYXggXGZpCi0gIFxnbG9iYWxkZWZzID0gMQotICAlCi0gIFxwYXJza2lwID0gM3B0IHBsdXMgMnB0IG1pbnVzIDFwdAotICBcc2V0bGVhZGluZ3sxMy4ycHR9JQotICAlCi0gIFxpbnRlcm5hbHBhZ2VzaXplc3sjMX17XGhzaXplfXtcdm9mZnNldH17XG5vcm1hbG9mZnNldH17XGJpbmRpbmdvZmZzZXR9ezQ0cHR9JQotfX0KLQotJSBTZXQgZGVmYXVsdCB0byBsZXR0ZXIuCi0lIAotXGxldHRlcnBhcGVyCi0KLVxtZXNzYWdle2FuZCB0dXJuaW5nIG9uIHRleGluZm8gaW5wdXQgZm9ybWF0Ln0KLQotJSBEZWZpbmUgbWFjcm9zIHRvIG91dHB1dCB2YXJpb3VzIGNoYXJhY3RlcnMgd2l0aCBjYXRjb2RlIGZvciBub3JtYWwgdGV4dC4KLVxjYXRjb2RlYFwiPVxvdGhlcgotXGNhdGNvZGVgXH49XG90aGVyCi1cY2F0Y29kZWBcXj1cb3RoZXIKLVxjYXRjb2RlYFxfPVxvdGhlcgotXGNhdGNvZGVgXHw9XG90aGVyCi1cY2F0Y29kZWBcPD1cb3RoZXIKLVxjYXRjb2RlYFw+PVxvdGhlcgotXGNhdGNvZGVgXCs9XG90aGVyCi1cZGVmXG5vcm1hbGRvdWJsZXF1b3RleyJ9Ci1cZGVmXG5vcm1hbHRpbGRle359Ci1cZGVmXG5vcm1hbGNhcmV0e159Ci1cZGVmXG5vcm1hbHVuZGVyc2NvcmV7X30KLVxkZWZcbm9ybWFsdmVydGljYWxiYXJ7fH0KLVxkZWZcbm9ybWFsbGVzc3s8fQotXGRlZlxub3JtYWxncmVhdGVyez59Ci1cZGVmXG5vcm1hbHBsdXN7K30KLQotJSBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbWFrZSBhIGNoYXJhY3RlciBwcmludCBvbmUgd2F5IGluIHR0Zm9udAotJSB3aGVyZSBpdCBjYW4gcHJvYmFibHkganVzdCBiZSBvdXRwdXQsIGFuZCBhbm90aGVyIHdheSBpbiBvdGhlciBmb250cywKLSUgd2hlcmUgc29tZXRoaW5nIGhhaXJpZXIgcHJvYmFibHkgbmVlZHMgdG8gYmUgZG9uZS4KLSUKLSUgIzEgaXMgd2hhdCB0byBwcmludCBpZiB3ZSBhcmUgaW5kZWVkIHVzaW5nIFx0dDsgIzIgaXMgd2hhdCB0byBwcmludAotJSBvdGhlcndpc2UuICBTaW5jZSBhbGwgdGhlIENvbXB1dGVyIE1vZGVybiB0eXBld3JpdGVyIGZvbnRzIGhhdmUgemVybwotJSBpbnRlcndvcmQgc3RyZXRjaCAoYW5kIHNocmluayksIGFuZCBpdCBpcyByZWFzb25hYmxlIHRvIGV4cGVjdCBhbGwKLSUgdHlwZXdyaXRlciBmb250cyB0byBoYXZlIHRoaXMsIHdlIGNhbiBjaGVjayB0aGF0IGZvbnQgcGFyYW1ldGVyLgotJQotXGRlZlxpZnVzaW5ndHQjMSMye1xpZmRpbSBcZm9udGRpbWVuM1x0aGVcZm9udD0wcHQgIzFcZWxzZSAjMlxmaX0KLQotJSBUdXJuIG9mZiBhbGwgc3BlY2lhbCBjaGFyYWN0ZXJzIGV4Y2VwdCBACi0lIChhbmQgdGhvc2Ugd2hpY2ggdGhlIHVzZXIgY2FuIHVzZSBhcyBpZiB0aGV5IHdlcmUgb3JkaW5hcnkpLgotJSBNb3N0IG9mIHRoZXNlIHdlIHNpbXBseSBwcmludCBmcm9tIHRoZSBcdHQgZm9udCwgYnV0IGZvciBzb21lLCB3ZSBjYW4KLSUgdXNlIG1hdGggb3Igb3RoZXIgdmFyaWFudHMgdGhhdCBsb29rIGJldHRlciBpbiBub3JtYWwgdGV4dC4KLQotXGNhdGNvZGVgXCI9XGFjdGl2ZQotXGRlZlxhY3RpdmVkb3VibGVxdW90ZXt7XHR0XGNoYXIzNH19Ci1cbGV0Ij1cYWN0aXZlZG91YmxlcXVvdGUKLVxjYXRjb2RlYFx+PVxhY3RpdmUKLVxkZWZ+e3tcdHRcY2hhcjEyNn19Ci1cY2hhcmRlZlxoYXQ9YFxeCi1cY2F0Y29kZWBcXj1cYWN0aXZlCi1cZGVmXnt7XHR0IFxoYXR9fQotCi1cY2F0Y29kZWBcXz1cYWN0aXZlCi1cZGVmX3tcaWZ1c2luZ3R0XG5vcm1hbHVuZGVyc2NvcmVcX30KLSUgU3Vicm91dGluZSBmb3IgdGhlIHByZXZpb3VzIG1hY3JvLgotXGRlZlxfe1xsZWF2ZXZtb2RlIFxrZXJuLjA2ZW0gXHZib3h7XGhydWxlIHdpZHRoLjNlbSBoZWlnaHQuMWV4fX0KLQotXGNhdGNvZGVgXHw9XGFjdGl2ZQotXGRlZnx7e1x0dFxjaGFyMTI0fX0KLVxjaGFyZGVmIFxsZXNzPWBcPAotXGNhdGNvZGVgXDw9XGFjdGl2ZQotXGRlZjx7e1x0dCBcbGVzc319Ci1cY2hhcmRlZiBcZ3RyPWBcPgotXGNhdGNvZGVgXD49XGFjdGl2ZQotXGRlZj57e1x0dCBcZ3RyfX0KLVxjYXRjb2RlYFwrPVxhY3RpdmUKLVxkZWYre3tcdHQgXGNoYXIgNDN9fQotJVxjYXRjb2RlIDI3PVxhY3RpdmUKLSVcZGVmXl5beyRcZGlhbW9uZHN1aXQkfQotCi0lIFNldCB1cCBhbiBhY3RpdmUgZGVmaW5pdGlvbiBmb3IgPSwgYnV0IGRvbid0IGVuYWJsZSBpdCBtb3N0IG9mIHRoZSB0aW1lLgote1xjYXRjb2RlYFw9PVxhY3RpdmUKLVxnbG9iYWxcZGVmPXt7XHR0IFxjaGFyIDYxfX19Ci0KLVxjYXRjb2RlYCs9XGFjdGl2ZQotXGNhdGNvZGVgXF89XGFjdGl2ZQotCi0lIElmIGEgLmZtdCBmaWxlIGlzIGJlaW5nIHVzZWQsIGNoYXJhY3RlcnMgdGhhdCBtaWdodCBhcHBlYXIgaW4gYSBmaWxlCi0lIG5hbWUgY2Fubm90IGJlIGFjdGl2ZSB1bnRpbCB3ZSBoYXZlIHBhcnNlZCB0aGUgY29tbWFuZCBsaW5lLgotJSBTbyB0dXJuIHRoZW0gb2ZmIGFnYWluLCBhbmQgaGF2ZSBcZXZlcnlqb2IgKG9yIEBzZXRmaWxlbmFtZSkgdHVybiB0aGVtIG9uLgotJSBcb3RoZXJpZnlhY3RpdmUgaXMgY2FsbGVkIG5lYXIgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCi1cZGVmXG90aGVyaWZ5YWN0aXZle1xjYXRjb2RlYCs9XG90aGVyIFxjYXRjb2RlYFxfPVxvdGhlcn0KLQotXGNhdGNvZGVgXEA9MAotCi0lIFxyYXdiYWNrc2xhc2h4eCBvdXRwdXQgb25lIGJhY2tzbGFzaCBjaGFyYWN0ZXIgaW4gY3VycmVudCBmb250Ci1cZ2xvYmFsXGNoYXJkZWZccmF3YmFja3NsYXNoeHg9YFxcCi0le1xjYXRjb2RlYFxcPVxvdGhlcgotJUBnZGVmQHJhd2JhY2tzbGFzaHh4e1x9fQotCi0lIFxyYXdiYWNrc2xhc2ggcmVkZWZpbmVzIFwgYXMgaW5wdXQgdG8gZG8gXHJhd2JhY2tzbGFzaHh4Lgote1xjYXRjb2RlYFxcPVxhY3RpdmUKLUBnZGVmQHJhd2JhY2tzbGFzaHtAbGV0XD1AcmF3YmFja3NsYXNoeHggfX0KLQotJSBcbm9ybWFsYmFja3NsYXNoIG91dHB1dHMgb25lIGJhY2tzbGFzaCBpbiBmaXhlZCB3aWR0aCBmb250LgotXGRlZlxub3JtYWxiYWNrc2xhc2h7e1x0dFxyYXdiYWNrc2xhc2h4eH19Ci0KLSUgU2F5IEBmb28sIG5vdCBcZm9vLCBpbiBlcnJvciBtZXNzYWdlcy4KLVxlc2NhcGVjaGFyPWBcQAotCi0lIFxjYXRjb2RlIDE3PTAgICAlIERlZmluZSBjb250cm9sLXEKLVxjYXRjb2RlYFxcPVxhY3RpdmUKLQotJSBVc2VkIHNvbWV0aW1lcyB0byB0dXJuIG9mZiAoZWZmZWN0aXZlbHkpIHRoZSBhY3RpdmUgY2hhcmFjdGVycwotJSBldmVuIGFmdGVyIHBhcnNpbmcgdGhlbS4KLUBkZWZAdHVybm9mZmFjdGl2ZXtAbGV0Ij1Abm9ybWFsZG91YmxlcXVvdGUKLUBsZXRcPUByZWFsYmFja3NsYXNoCi1AbGV0fj1Abm9ybWFsdGlsZGUKLUBsZXRePUBub3JtYWxjYXJldAotQGxldF89QG5vcm1hbHVuZGVyc2NvcmUKLUBsZXR8PUBub3JtYWx2ZXJ0aWNhbGJhcgotQGxldDw9QG5vcm1hbGxlc3MKLUBsZXQ+PUBub3JtYWxncmVhdGVyCi1AbGV0Kz1Abm9ybWFscGx1c30KLQotQGRlZkBub3JtYWx0dXJub2ZmYWN0aXZle0BsZXQiPUBub3JtYWxkb3VibGVxdW90ZQotQGxldFw9QG5vcm1hbGJhY2tzbGFzaAotQGxldH49QG5vcm1hbHRpbGRlCi1AbGV0Xj1Abm9ybWFsY2FyZXQKLUBsZXRfPUBub3JtYWx1bmRlcnNjb3JlCi1AbGV0fD1Abm9ybWFsdmVydGljYWxiYXIKLUBsZXQ8PUBub3JtYWxsZXNzCi1AbGV0Pj1Abm9ybWFsZ3JlYXRlcgotQGxldCs9QG5vcm1hbHBsdXN9Ci0KLSUgTWFrZSBfIGFuZCArIFxvdGhlciBjaGFyYWN0ZXJzLCB0ZW1wb3JhcmlseS4KLSUgVGhpcyBpcyBjYW5jZWxlZCBieSBAZml4YmFja3NsYXNoLgotQG90aGVyaWZ5YWN0aXZlCi0KLSUgSWYgYSAuZm10IGZpbGUgaXMgYmVpbmcgdXNlZCwgd2UgZG9uJ3Qgd2FudCB0aGUgYFxpbnB1dCB0ZXhpbmZvJyB0byBzaG93IHVwLgotJSBUaGF0IGlzIHdoYXQgXGVhdGlucHV0IGlzIGZvcjsgYWZ0ZXIgdGhhdCwgdGhlIGBcJyBzaG91bGQgcmV2ZXJ0IHRvIHByaW50aW5nCi0lIGEgYmFja3NsYXNoLgotJQotQGdkZWZAZWF0aW5wdXQgaW5wdXQgdGV4aW5mb3tAZml4YmFja3NsYXNofQotQGdsb2JhbEBsZXRcID0gQGVhdGlucHV0Ci0KLSUgT24gdGhlIG90aGVyIGhhbmQsIHBlcmhhcHMgdGhlIGZpbGUgZGlkIG5vdCBoYXZlIGEgYFxpbnB1dCB0ZXhpbmZvJy4gVGhlbgotJSB0aGUgZmlyc3QgYFx7IGluIHRoZSBmaWxlIHdvdWxkIGNhdXNlIGFuIGVycm9yLiBUaGlzIG1hY3JvIHRyaWVzIHRvIGZpeAotJSB0aGF0LCBhc3N1bWluZyBpdCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBgXCcgY291bGQgcGxhdXNpYmx5IG9jY3VyLgotJSBBbHNvIGJhY2sgdHVybiBvbiBhY3RpdmUgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGFwcGVhciBpbiB0aGUgaW5wdXQKLSUgZmlsZSBuYW1lLCBpbiBjYXNlIG5vdCB1c2luZyBhIHByZS1kdW1wZWQgZm9ybWF0LgotJQotQGdkZWZAZml4YmFja3NsYXNoe0BpZnhcQGVhdGlucHV0IEBsZXRcID0gQG5vcm1hbGJhY2tzbGFzaCBAZmkKLSAgQGNhdGNvZGVgKz1AYWN0aXZlIEBjYXRjb2RlYEBfPUBhY3RpdmV9Ci0KLSUgVGhlc2UgbG9vayBvayBpbiBhbGwgZm9udHMsIHNvIGp1c3QgbWFrZSB0aGVtIG5vdCBzcGVjaWFsLiAgVGhlIEBybSBiZWxvdwotJSBtYWtlcyBzdXJlIHRoYXQgdGhlIGN1cnJlbnQgZm9udCBzdGFydHMgb3V0IGFzIHRoZSBuZXdseSBsb2FkZWQgY21yMTAKLUBjYXRjb2RlYEAkPUBvdGhlciBAY2F0Y29kZWBAJT1Ab3RoZXIgQGNhdGNvZGVgQCY9QG90aGVyIEBjYXRjb2RlYEAjPUBvdGhlcgotCi1AdGV4dGZvbnRzCi1Acm0KLQotQGMgTG9jYWwgdmFyaWFibGVzOgotQGMgcGFnZS1kZWxpbWl0ZXI6ICJeXFxcXG1lc3NhZ2UiCi1AYyBFbmQ6CmRpZmYgLS1naXQgYS95bHdyYXAgYi95bHdyYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyODhjY2QuLjAwMDAwMDAKLS0tIGEveWx3cmFwCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLSMhIC9iaW4vc2gKLSMgeWx3cmFwIC0gd3JhcHBlciBmb3IgbGV4L3lhY2MgaW52b2NhdGlvbnMuCi0jIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KLSMgV3JpdHRlbiBieSBUb20gVHJvbWV5IDx0cm9tZXlAY3lnbnVzLmNvbT4uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0jIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0jIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSMgYW55IGxhdGVyIHZlcnNpb24uCi0jCi0jIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0jIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0jCi0jIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0jIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0jIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCi0KLSMgVXNhZ2U6Ci0jICAgICB5bHdyYXAgUFJPR1JBTSBJTlBVVCBbT1VUUFVUIERFU0lSRURdLi4uIC0tIFtBUkdTXS4uLgotIyAqIFBST0dSQU0gaXMgcHJvZ3JhbSB0byBydW4uCi0jICogSU5QVVQgaXMgdGhlIGlucHV0IGZpbGUKLSMgKiBPVVRQVVQgaXMgZmlsZSBQUk9HIGdlbmVyYXRlcwotIyAqIERFU0lSRUQgaXMgZmlsZSB3ZSBhY3R1YWxseSB3YW50Ci0jICogQVJHUyBhcmUgcGFzc2VkIHRvIFBST0cKLSMgQW55IG51bWJlciBvZiBPVVRQVVQsREVTSVJFRCBwYWlycyBtYXkgYmUgdXNlZC4KLQotIyBUaGUgcHJvZ3JhbSB0byBydW4uCi1wcm9nPSIkMSIKLXNoaWZ0Ci0jIE1ha2UgYW55IHJlbGF0aXZlIHBhdGggaW4gJHByb2cgYWJzb2x1dGUuCi1jYXNlICIkcHJvZyIgaW4KLSAvKiB8IFtBLVphLXpdOlxcKikgOzsKLSAqLyopIHByb2c9ImBwd2RgLyRwcm9nIiA7OwotZXNhYwotCi0jIFRoZSBpbnB1dC4KLWlucHV0PSIkMSIKLXNoaWZ0Ci1jYXNlICIkaW5wdXQiIGluCi0gLyogfCBbQS1aYS16XTpcXCopCi0gICAgIyBBYnNvbHV0ZSBwYXRoOyBkbyBub3RoaW5nLgotICAgIDs7Ci0gKikKLSAgICAjIFJlbGF0aXZlIHBhdGguICBNYWtlIGl0IGFic29sdXRlLiAgV2h5PyAgQmVjYXVzZSBvdGhlcndpc2UgYW55Ci0gICAgIyBkZWJ1Z2dpbmcgaW5mbyBpbiB0aGUgZ2VuZXJhdGVkIGZpbGUgd2lsbCBwb2ludCB0byB0aGUgd3JvbmcKLSAgICAjIHBsYWNlLiAgVGhpcyBpcyByZWFsbHkgZ3Jvc3MuCi0gICAgaW5wdXQ9ImBwd2RgLyRpbnB1dCIKLSAgICA7OwotZXNhYwotCi0jIFdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBhYnNvbHV0ZSBwYXRoIGlmIHRoZSBpbnB1dCBpbiB0aGUgY3VycmVudAotIyBkaXJlY3RvcnkgbGlrZSB3aGVuIG1ha2luZyBhIHRhciBiYWxsLgotaW5wdXRfYmFzZT1gZWNobyAkaW5wdXQgfCBzZWQgLWUgJ3N8LiovfHwnYAotaWYgdGVzdCAtZiAkaW5wdXRfYmFzZSAmJiBjbXAgJGlucHV0X2Jhc2UgJGlucHV0ID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBpbnB1dD0kaW5wdXRfYmFzZQotZmkKLQotcGFpcmxpc3Q9Ci13aGlsZSB0ZXN0ICIkIyIgLW5lIDA7IGRvCi0gICBpZiB0ZXN0ICIkMSIgPSAiLS0iOyB0aGVuCi0gICAgICBzaGlmdAotICAgICAgYnJlYWsKLSAgIGZpCi0gICBwYWlybGlzdD0iJHBhaXJsaXN0ICQxIgotICAgc2hpZnQKLWRvbmUKLQotIyBGSVhNRTogYWRkIGhvc3RuYW1lIGhlcmUgZm9yIHBhcmFsbGVsIG1ha2VzIHRoYXQgcnVuIGNvbW1hbmRzIG9uCi0jIG90aGVyIG1hY2hpbmVzLiAgQnV0IHRoYXQgbWlnaHQgdGFrZSB1cyBvdmVyIHRoZSAxNC1jaGFyIGxpbWl0LgotZGlybmFtZT15bHdyYXAkJAotdHJhcCAiY2QgYHB3ZGA7IHJtIC1yZiAkZGlybmFtZSA+IC9kZXYvbnVsbCAyPiYxIiAxIDIgMyAxNQotbWtkaXIgJGRpcm5hbWUgfHwgZXhpdCAxCi0KLWNkICRkaXJuYW1lCi1jYXNlICIkaW5wdXQiIGluCi0gLyogfCBbQS1aYS16XTpcXCopCi0gICAgIyBBYnNvbHV0ZSBwYXRoOyBkbyBub3RoaW5nLgotICAgIDs7Ci0gKikKLSAgICAjIE1ha2UgYSBzeW1ib2xpYyBsaW5rLCBoYXJkIGxpbmsgb3IgaGFyZGNvcHkuCi0gICAgbG4gLXMgLi4vIiRpbnB1dCIgLiA+IC9kZXYvbnVsbCAyPiYxIHx8IGxuIC4uLyIkaW5wdXQiIC4gPiAvZGV2L251bGwgMj4mMSB8fCBjcCAuLi8iJGlucHV0IiAuCi0gICAgOzsKLWVzYWMKLSRwcm9nICR7MSsiJEAifSAiJGlucHV0Igotc3RhdHVzPSQ/Ci0KLWlmIHRlc3QgJHN0YXR1cyAtZXEgMDsgdGhlbgotICAgc2V0IFggJHBhaXJsaXN0Ci0gICBzaGlmdAotICAgZmlyc3Q9eWVzCi0gICB3aGlsZSB0ZXN0ICIkIyIgLW5lIDA7IGRvCi0gICAgICBpZiB0ZXN0IC1mICIkMSI7IHRoZW4KLSAgICAgICAgICMgSWYgJDIgaXMgYW4gYWJzb2x1dGUgcGF0aCBuYW1lLCB0aGVuIGp1c3QgdXNlIHRoYXQsCi0gICAgICAgICAjIG90aGVyd2lzZSBwcmVwZW5kIGAuLi8nLgotICAgICAgICAgY2FzZSAiJDIiIGluCi0JICAgLyogfCBbQS1aYS16XTpcXCopIHRhcmdldD0iJDIiOzsKLQkgICAqKSB0YXJnZXQ9Ii4uLyQyIjs7Ci0JIGVzYWMKLQkgbXYgIiQxIiAiJHRhcmdldCIgfHwgc3RhdHVzPSQ/Ci0gICAgICBlbHNlCi0JICMgQSBtaXNzaW5nIGZpbGUgaXMgb25seSBhbiBlcnJvciBmb3IgdGhlIGZpcnN0IGZpbGUuICBUaGlzCi0JICMgaXMgYSBibGF0YW50IGhhY2sgdG8gbGV0IHVzIHN1cHBvcnQgdXNpbmcgInlhY2MgLWQiLiAgSWYgLWQKLQkgIyBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBkb24ndCB3YW50IGFuIGVycm9yIHdoZW4gdGhlIGhlYWRlcgotCSAjIGZpbGUgaXMgIm1pc3NpbmciLgotCSBpZiB0ZXN0ICRmaXJzdCA9IHllczsgdGhlbgotCSAgICBzdGF0dXM9MQotCSBmaQotICAgICAgZmkKLSAgICAgIHNoaWZ0Ci0gICAgICBzaGlmdAotICAgICAgZmlyc3Q9bm8KLSAgIGRvbmUKLWVsc2UKLSAgIHN0YXR1cz0kPwotZmkKLQotIyBSZW1vdmUgdGhlIGRpcmVjdG9yeS4KLWNkIC4uCi1ybSAtcmYgJGRpcm5hbWUKLQotZXhpdCAkc3RhdHVzCg==